ZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCmluZGV4IGEzNjc5YjEuLmU0ZjEyYzggMTAwNjQ0Ci0tLSBhL0FuZHJvaWQuYnAKKysrIGIvQW5kcm9pZC5icApAQCAtMiw1ICsyLDYgQEAKICAgICAiY2FtZXJhIiwKICAgICAiZHJtLyoiLAogICAgICJtZWRpYS8qIiwKKyAgICAic2VydmljZXMvKiIsCiAgICAgInNvdW5kdHJpZ2dlciIsCiBdCmRpZmYgLS1naXQgYS9jYW1lcmEvQW5kcm9pZC5icCBiL2NhbWVyYS9BbmRyb2lkLmJwCmluZGV4IGM3NmFlNTAuLjI0YjM5MTggMTAwNjQ0Ci0tLSBhL2NhbWVyYS9BbmRyb2lkLmJwCisrKyBiL2NhbWVyYS9BbmRyb2lkLmJwCkBAIC0yOSwxMiArMjksNyBAQAogICAgICAgICAvLyBBSURMIGZpbGVzIGZvciBjYW1lcmEgaW50ZXJmYWNlcwogICAgICAgICAvLyBUaGUgaGVhZGVycyBmb3IgdGhlc2UgaW50ZXJmYWNlcyB3aWxsIGJlIGF2YWlsYWJsZSB0byBhbnkgbW9kdWxlcyB0aGF0CiAgICAgICAgIC8vIGluY2x1ZGUgbGliY2FtZXJhX2NsaWVudCwgYXQgdGhlIHBhdGggImFpZGwvcGFja2FnZS9wYXRoL0JuRm9vLmgiCi0gICAgICAgICJhaWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VMaXN0ZW5lci5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZVByb3h5LmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmFpZGwiLAotCisgICAgICAgICI6bGliY2FtZXJhX2NsaWVudF9haWRsIiwKIAogICAgICAgICAvLyBTb3VyY2UgZm9yIGNhbWVyYSBpbnRlcmZhY2UgcGFyY2VsYWJsZXMsIGFuZCBtYW51YWxseS13cml0dGVuIGludGVyZmFjZXMKICAgICAgICAgIkNhbWVyYS5jcHAiLApAQCAtODEsMyArNzYsMjUgQEAKICAgICBdLAogCiB9CisKKy8vIEFJREwgaW50ZXJmYWNlIGJldHdlZW4gY2FtZXJhIGNsaWVudHMgYW5kIHRoZSBjYW1lcmEgc2VydmljZS4KK2ZpbGVncm91cCB7CisgICAgbmFtZTogImxpYmNhbWVyYV9jbGllbnRfYWlkbCIsCisgICAgc3JjczogWworICAgICAgICAiYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VQcm94eS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5haWRsIiwKKyAgICBdLAorfQorCisvLyBFeHRyYSBBSURMIGZpbGVzIHRoYXQgYXJlIHVzZWQgYnkgZnJhbWV3b3JrLmphciBidXQgbm90IGxpYmNhbWVyYV9jbGllbnQKKy8vIGJlY2F1c2UgdGhleSBoYXZlIGhhbmQtd3JpdHRlbiBuYXRpdmUgaW1wbGVtZW50YXRpb25zLgorZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAibGliY2FtZXJhX2NsaWVudF9mcmFtZXdvcmtfYWlkbCIsCisgICAgc3JjczogWworICAgICAgICAiYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmEuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYUNsaWVudC5haWRsIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL0NhcHR1cmVSZXN1bHQuY3BwIGIvY2FtZXJhL0NhcHR1cmVSZXN1bHQuY3BwCmluZGV4IGU2YzBkMDAuLjkyOGE2YmMgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmNwcAorKysgYi9jYW1lcmEvQ2FwdHVyZVJlc3VsdC5jcHAKQEAgLTYwLDYgKzYwLDM5IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvOjpyZWFkRnJvbVBhcmNlbChjb25zdCBhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgeworICAgIHN0YXR1c190IHJlczsKKworICAgIG1QaHlzaWNhbENhbWVyYUlkLnJlbW92ZShtUGh5c2ljYWxDYW1lcmFJZC5zaXplKCkpOworICAgIG1QaHlzaWNhbENhbWVyYU1ldGFkYXRhLmNsZWFyKCk7CisKKyAgICBpZiAoKHJlcyA9IHBhcmNlbC0+cmVhZFN0cmluZzE2KCZtUGh5c2ljYWxDYW1lcmFJZCkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgY2FtZXJhIGlkOiAlZCIsIF9fRlVOQ1RJT05fXywgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBpZiAoKHJlcyA9IG1QaHlzaWNhbENhbWVyYU1ldGFkYXRhLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbWV0YWRhdGEgZnJvbSBwYXJjZWw6ICVkIiwgX19GVU5DVElPTl9fLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm86OndyaXRlVG9QYXJjZWwoYW5kcm9pZDo6UGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKKyAgICBzdGF0dXNfdCByZXM7CisgICAgaWYgKChyZXMgPSBwYXJjZWwtPndyaXRlU3RyaW5nMTYobVBoeXNpY2FsQ2FtZXJhSWQpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBwaHlzaWNhbCBjYW1lcmEgSUQgdG8gcGFyY2VsOiAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBpZiAoKHJlcyA9IG1QaHlzaWNhbENhbWVyYU1ldGFkYXRhLndyaXRlVG9QYXJjZWwocGFyY2VsKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgcGh5c2ljYWwgY2FtZXJhIG1ldGFkYXRhIHRvIHBhcmNlbDogJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCiBDYXB0dXJlUmVzdWx0OjpDYXB0dXJlUmVzdWx0KCkgOgogICAgICAgICBtTWV0YWRhdGEoKSwgbVJlc3VsdEV4dHJhcygpIHsKIH0KQEAgLTY3LDYgKzEwMCw3IEBACiBDYXB0dXJlUmVzdWx0OjpDYXB0dXJlUmVzdWx0KGNvbnN0IENhcHR1cmVSZXN1bHQgJm90aGVyUmVzdWx0KSB7CiAgICAgbVJlc3VsdEV4dHJhcyA9IG90aGVyUmVzdWx0Lm1SZXN1bHRFeHRyYXM7CiAgICAgbU1ldGFkYXRhID0gb3RoZXJSZXN1bHQubU1ldGFkYXRhOworICAgIG1QaHlzaWNhbE1ldGFkYXRhcyA9IG90aGVyUmVzdWx0Lm1QaHlzaWNhbE1ldGFkYXRhczsKIH0KIAogc3RhdHVzX3QgQ2FwdHVyZVJlc3VsdDo6cmVhZEZyb21QYXJjZWwoYW5kcm9pZDo6UGFyY2VsICpwYXJjZWwpIHsKQEAgLTc5LDYgKzExMyw3IEBACiAgICAgfQogCiAgICAgbU1ldGFkYXRhLmNsZWFyKCk7CisgICAgbVBoeXNpY2FsTWV0YWRhdGFzLmNsZWFyKCk7CiAKICAgICBzdGF0dXNfdCByZXMgPSBPSzsKICAgICByZXMgPSBtTWV0YWRhdGEucmVhZEZyb21QYXJjZWwocGFyY2VsKTsKQEAgLTg5LDYgKzEyNCwzNCBAQAogICAgIH0KICAgICBBTE9HVigiJXM6IFJlYWQgbWV0YWRhdGEgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOwogCisgICAgaW50MzJfdCBwaHlzaWNhbE1ldGFkYXRhQ291bnQ7CisgICAgaWYgKChyZXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmcGh5c2ljYWxNZXRhZGF0YUNvdW50KSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCB0aGUgcGh5c2ljYWwgbWV0YWRhdGEgY291bnQgZnJvbSBwYXJjZWw6ICVkIiwgX19GVU5DVElPTl9fLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBpZiAocGh5c2ljYWxNZXRhZGF0YUNvdW50IDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgcGh5c2ljYWwgbWV0YWRhdGEgY291bnQgZnJvbSBwYXJjZWw6ICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBoeXNpY2FsTWV0YWRhdGFDb3VudCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcGh5c2ljYWxNZXRhZGF0YUNvdW50OyBpKyspIHsKKyAgICAgICAgU3RyaW5nMTYgY2FtZXJhSWQ7CisgICAgICAgIGlmICgocmVzID0gcGFyY2VsLT5yZWFkU3RyaW5nMTYoJmNhbWVyYUlkKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgY2FtZXJhIGlkOiAlZCIsIF9fRlVOQ1RJT05fXywgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKworICAgICAgICBDYW1lcmFNZXRhZGF0YSBwaHlzaWNhbE1ldGFkYXRhOworICAgICAgICBpZiAoKHJlcyA9IHBoeXNpY2FsTWV0YWRhdGEucmVhZEZyb21QYXJjZWwocGFyY2VsKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgbWV0YWRhdGEgZnJvbSBwYXJjZWw6ICVkIiwgX19GVU5DVElPTl9fLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorCisgICAgICAgIG1QaHlzaWNhbE1ldGFkYXRhcy5lbXBsYWNlKG1QaHlzaWNhbE1ldGFkYXRhcy5lbmQoKSwgY2FtZXJhSWQsIHBoeXNpY2FsTWV0YWRhdGEpOworICAgIH0KKyAgICBBTE9HVigiJXM6IFJlYWQgcGh5c2ljYWwgbWV0YWRhdGEgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworCiAgICAgcmVzID0gbVJlc3VsdEV4dHJhcy5yZWFkRnJvbVBhcmNlbChwYXJjZWwpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCByZXN1bHQgZXh0cmFzIGZyb20gcGFyY2VsLiIsCkBAIC0xMTgsNiArMTgxLDI3IEBACiAgICAgfQogICAgIEFMT0dWKCIlczogV3JvdGUgbWV0YWRhdGEgdG8gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKIAorICAgIGludDMyX3QgcGh5c2ljYWxNZXRhZGF0YUNvdW50ID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4obVBoeXNpY2FsTWV0YWRhdGFzLnNpemUoKSk7CisgICAgcmVzID0gcGFyY2VsLT53cml0ZUludDMyKHBoeXNpY2FsTWV0YWRhdGFDb3VudCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBwaHlzaWNhbCBtZXRhZGF0YSBjb3VudCB0byBwYXJjZWw6ICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlcyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYgcGh5c2ljYWxNZXRhZGF0YSA6IG1QaHlzaWNhbE1ldGFkYXRhcykgeworICAgICAgICBpZiAoKHJlcyA9IHBhcmNlbC0+d3JpdGVTdHJpbmcxNihwaHlzaWNhbE1ldGFkYXRhLm1QaHlzaWNhbENhbWVyYUlkKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIHBoeXNpY2FsIGNhbWVyYSBJRCB0byBwYXJjZWw6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHJlcyA9IHBoeXNpY2FsTWV0YWRhdGEubVBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEud3JpdGVUb1BhcmNlbChwYXJjZWwpKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgcGh5c2ljYWwgY2FtZXJhIG1ldGFkYXRhIHRvIHBhcmNlbDogJWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCIlczogV3JvdGUgcGh5c2ljYWwgY2FtZXJhIG1ldGFkYXRhIHRvIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisKICAgICByZXMgPSBtUmVzdWx0RXh0cmFzLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIHJlc3VsdCBleHRyYXMgdG8gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKZGlmZiAtLWdpdCBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VQcm94eS5haWRsIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZVByb3h5LmFpZGwKaW5kZXggNWRjMjNlYi4uNzU3NTk0OCAxMDA2NDQKLS0tIGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZVByb3h5LmFpZGwKKysrIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZVByb3h5LmFpZGwKQEAgLTQ2LDggKzQ2LDE0IEBACiAgICAgY29uc3QgaW50IENBTUVSQV9GQUNJTkdfRVhURVJOQUwgPSAyOwogCiAgICAgLyoqCisgICAgICogVmFsdWVzIGZvciBub3RpZnlDYW1lcmFTdGF0ZSBhcGkgbGV2ZWwKKyAgICAgKi8KKyAgICAgY29uc3QgaW50IENBTUVSQV9BUElfTEVWRUxfMSA9IDE7CisgICAgIGNvbnN0IGludCBDQU1FUkFfQVBJX0xFVkVMXzIgPSAyOworCisgICAgLyoqCiAgICAgICogVXBkYXRlIHRoZSBzdGF0dXMgb2YgYSBjYW1lcmEgZGV2aWNlLgogICAgICAqLwogICAgIG9uZXdheSB2b2lkIG5vdGlmeUNhbWVyYVN0YXRlKFN0cmluZyBjYW1lcmFJZCwgaW50IGZhY2luZywgaW50IG5ld0NhbWVyYVN0YXRlLAotICAgICAgICAgICAgU3RyaW5nIGNsaWVudE5hbWUpOworICAgICAgICAgICAgU3RyaW5nIGNsaWVudE5hbWUsIGludCBhcGlMZXZlbCk7CiB9CmRpZmYgLS1naXQgYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5haWRsIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuYWlkbAppbmRleCAyODI1MmMwLi41OGIxOWEzIDEwMDY0NAotLS0gYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5haWRsCisrKyBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmFpZGwKQEAgLTE4LDYgKzE4LDcgQEAKIAogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5pbXBsLkNhbWVyYU1ldGFkYXRhTmF0aXZlOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5pbXBsLkNhcHR1cmVSZXN1bHRFeHRyYXM7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLmltcGwuUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbzsKIAogLyoqIEBoaWRlICovCiBpbnRlcmZhY2UgSUNhbWVyYURldmljZUNhbGxiYWNrcwpAQCAtMzAsMTIgKzMxLDE0IEBACiAgICAgY29uc3QgaW50IEVSUk9SX0NBTUVSQV9SRVFVRVNUID0gMzsKICAgICBjb25zdCBpbnQgRVJST1JfQ0FNRVJBX1JFU1VMVCA9IDQ7CiAgICAgY29uc3QgaW50IEVSUk9SX0NBTUVSQV9CVUZGRVIgPSA1OworICAgIGNvbnN0IGludCBFUlJPUl9DQU1FUkFfRElTQUJMRUQgPSA2OwogCiAgICAgb25ld2F5IHZvaWQgb25EZXZpY2VFcnJvcihpbnQgZXJyb3JDb2RlLCBpbiBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhcyk7CiAgICAgb25ld2F5IHZvaWQgb25EZXZpY2VJZGxlKCk7CiAgICAgb25ld2F5IHZvaWQgb25DYXB0dXJlU3RhcnRlZChpbiBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhcywgbG9uZyB0aW1lc3RhbXApOwogICAgIG9uZXdheSB2b2lkIG9uUmVzdWx0UmVjZWl2ZWQoaW4gQ2FtZXJhTWV0YWRhdGFOYXRpdmUgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvW10gcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MpOwogICAgIG9uZXdheSB2b2lkIG9uUHJlcGFyZWQoaW50IHN0cmVhbUlkKTsKIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmFpZGwgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuYWlkbAppbmRleCAwNzcxZmM4Li40Y2VkMDhjIDEwMDY0NAotLS0gYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuYWlkbAorKysgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuYWlkbApAQCAtNzksOCArNzksOSBAQAogICAgICAqIDxwPgogICAgICAqIEBwYXJhbSBvcGVyYXRpbmdNb2RlIFRoZSBraW5kIG9mIHNlc3Npb24gdG8gY3JlYXRlOyBlaXRoZXIgTk9STUFMX01PREUgb3IKICAgICAgKiAgICAgQ09OU1RSQUlORURfSElHSF9TUEVFRF9NT0RFLiBNdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIHZhbHVlLgorICAgICAqIEBwYXJhbSBzZXNzaW9uUGFyYW1zIFNlc3Npb24gd2lkZSBjYW1lcmEgcGFyYW1ldGVycwogICAgICAqLwotICAgIHZvaWQgZW5kQ29uZmlndXJlKGludCBvcGVyYXRpbmdNb2RlKTsKKyAgICB2b2lkIGVuZENvbmZpZ3VyZShpbnQgb3BlcmF0aW5nTW9kZSwgaW4gQ2FtZXJhTWV0YWRhdGFOYXRpdmUgc2Vzc2lvblBhcmFtcyk7CiAKICAgICB2b2lkIGRlbGV0ZVN0cmVhbShpbnQgc3RyZWFtSWQpOwogCkBAIC0xNDAsNSArMTQxLDcgQEAKIAogICAgIHZvaWQgcHJlcGFyZTIoaW50IG1heENvdW50LCBpbnQgc3RyZWFtSWQpOwogCisgICAgdm9pZCB1cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uKGludCBzdHJlYW1JZCwgaW4gT3V0cHV0Q29uZmlndXJhdGlvbiBvdXRwdXRDb25maWd1cmF0aW9uKTsKKwogICAgIHZvaWQgZmluYWxpemVPdXRwdXRDb25maWd1cmF0aW9ucyhpbnQgc3RyZWFtSWQsIGluIE91dHB1dENvbmZpZ3VyYXRpb24gb3V0cHV0Q29uZmlndXJhdGlvbik7CiB9CmRpZmYgLS1naXQgYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvaW1wbC9QaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvLmFpZGwgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvaW1wbC9QaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhkOWI3YgotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9pbXBsL1BoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8uYWlkbApAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuaW1wbDsKKworLyoqIEBoaWRlICovCitwYXJjZWxhYmxlIFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8gY3BwX2hlYWRlciAiY2FtZXJhL0NhcHR1cmVSZXN1bHQuaCI7CmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5jcHAgYi9jYW1lcmEvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5jcHAKaW5kZXggMDU5Nzk1MC4uMTg0M2VjNCAxMDA2NDQKLS0tIGEvY2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuY3BwCisrKyBiL2NhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmNwcApAQCAtMTgsNiArMTgsNyBAQAogLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhUmVxdWVzdCIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogCiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuaD4KIApAQCAtNDIsMTYgKzQzLDQ2IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgbU1ldGFkYXRhLmNsZWFyKCk7CiAgICAgbVN1cmZhY2VMaXN0LmNsZWFyKCk7CisgICAgbVN0cmVhbUlkeExpc3QuY2xlYXIoKTsKKyAgICBtU3VyZmFjZUlkeExpc3QuY2xlYXIoKTsKKyAgICBtUGh5c2ljYWxDYW1lcmFTZXR0aW5ncy5jbGVhcigpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gT0s7CiAKLSAgICBpZiAoKGVyciA9IG1NZXRhZGF0YS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpKSAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIG1ldGFkYXRhIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICBpbnQzMl90IHNldHRpbmdzQ291bnQ7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmc2V0dGluZ3NDb3VudCkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgdGhlIHNldHRpbmdzIGNvdW50IGZyb20gcGFyY2VsOiAlZCIsIF9fRlVOQ1RJT05fXywgZXJyKTsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9Ci0gICAgQUxPR1YoIiVzOiBSZWFkIG1ldGFkYXRhIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKworICAgIGlmIChzZXR0aW5nc0NvdW50IDw9IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTZXR0aW5ncyBjb3VudCAlZCBzaG91bGQgYWx3YXlzIGJlIHBvc2l0aXZlISIsIF9fRlVOQ1RJT05fXywgc2V0dGluZ3NDb3VudCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2V0dGluZ3NDb3VudDsgaSsrKSB7CisgICAgICAgIFN0cmluZzE2IGlkOworICAgICAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZFN0cmluZzE2KCZpZCkpICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIGNhbWVyYSBpZCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIENhbWVyYU1ldGFkYXRhIHNldHRpbmdzOworICAgICAgICBpZiAoKGVyciA9IHNldHRpbmdzLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCkpICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIG1ldGFkYXRhIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIiVzOiBSZWFkIG1ldGFkYXRhIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgbVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MucHVzaF9iYWNrKHtzdGQ6OnN0cmluZyhTdHJpbmc4KGlkKS5zdHJpbmcoKSksIHNldHRpbmdzfSk7CisgICAgfQorCisgICAgaW50IGlzUmVwcm9jZXNzID0gMDsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZpc1JlcHJvY2VzcykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgcmVwcm9jZXNzaW5nIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgbUlzUmVwcm9jZXNzID0gKGlzUmVwcm9jZXNzICE9IDApOwogCiAgICAgaW50MzJfdCBzaXplOwogICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJnNpemUpKSAhPSBPSykgewpAQCAtNjEsNyArOTIsNyBAQAogICAgIEFMT0dWKCIlczogUmVhZCBzdXJmYWNlIGxpc3Qgc2l6ZSA9ICVkIiwgX19GVU5DVElPTl9fLCBzaXplKTsKIAogICAgIC8vIERvIG5vdCBkaXN0aW5ndWlzaCBudWxsIGFycmF5cyBmcm9tIDAtc2l6ZWQgYXJyYXlzLgotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CiAgICAgICAgIC8vIFBhcmNlbC53cml0ZVBhcmNlbGFibGVBcnJheQogICAgICAgICBzaXplX3QgbGVuOwogICAgICAgICBjb25zdCBjaGFyMTZfdCogY2xhc3NOYW1lID0gcGFyY2VsLT5yZWFkU3RyaW5nMTZJbnBsYWNlKCZsZW4pOwpAQCAtODgsMTIgKzExOSwzMiBAQAogICAgICAgICBtU3VyZmFjZUxpc3QucHVzaF9iYWNrKHN1cmZhY2UpOwogICAgIH0KIAotICAgIGludCBpc1JlcHJvY2VzcyA9IDA7Ci0gICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmaXNSZXByb2Nlc3MpKSAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIHJlcHJvY2Vzc2luZyBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgaW50MzJfdCBzdHJlYW1TdXJmYWNlU2l6ZTsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZzdHJlYW1TdXJmYWNlU2l6ZSkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgc3RyZWFtU3VyZmFjZVNpemUgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KLSAgICBtSXNSZXByb2Nlc3MgPSAoaXNSZXByb2Nlc3MgIT0gMCk7CisKKyAgICBpZiAoc3RyZWFtU3VyZmFjZVNpemUgPCAwKSB7CisgICAgICAgIEFMT0dFKCIlczogQmFkIHN0cmVhbVN1cmZhY2VTaXplICVkIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fLCBzdHJlYW1TdXJmYWNlU2l6ZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc3RyZWFtU3VyZmFjZVNpemU7ICsraSkgeworICAgICAgICBpbnQgc3RyZWFtSWR4OworICAgICAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZzdHJlYW1JZHgpKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBzdHJlYW0gaW5kZXggZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBtU3RyZWFtSWR4TGlzdC5wdXNoX2JhY2soc3RyZWFtSWR4KTsKKworICAgICAgICBpbnQgc3VyZmFjZUlkeDsKKyAgICAgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmc3VyZmFjZUlkeCkpICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIHN1cmZhY2UgaW5kZXggZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBtU3VyZmFjZUlkeExpc3QucHVzaF9iYWNrKHN1cmZhY2VJZHgpOworICAgIH0KIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTEwNiwzMiArMTU3LDYyIEBACiAKICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKIAotICAgIGlmICgoZXJyID0gbU1ldGFkYXRhLndyaXRlVG9QYXJjZWwocGFyY2VsKSkgIT0gT0spIHsKKyAgICBpbnQzMl90IHNldHRpbmdzQ291bnQgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihtUGh5c2ljYWxDYW1lcmFTZXR0aW5ncy5zaXplKCkpOworCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIoc2V0dGluZ3NDb3VudCkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIHNldHRpbmdzIGNvdW50ISIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgaW50MzJfdCBzaXplID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4obVN1cmZhY2VMaXN0LnNpemUoKSk7CisgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IG1QaHlzaWNhbENhbWVyYVNldHRpbmdzKSB7CisgICAgICAgIGlmICgoZXJyID0gcGFyY2VsLT53cml0ZVN0cmluZzE2KFN0cmluZzE2KGl0LmlkLmNfc3RyKCkpKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNhbWVyYSBpZCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQogCi0gICAgLy8gU2VuZCAwLXNpemVkIGFycmF5cyB3aGVuIGl0J3MgZW1wdHkuIERvIG5vdCBzZW5kIG51bGwgYXJyYXlzLgotICAgIHBhcmNlbC0+d3JpdGVJbnQzMihzaXplKTsKLQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAgICAvLyBub3Qgc3VyZSBpZiByZWFkUGFyY2VsYWJsZUFycmF5IGRvZXMgdGhpcywgaGFyZCB0byB0ZWxsIGZyb20gc291cmNlCi0gICAgICAgIHBhcmNlbC0+d3JpdGVTdHJpbmcxNihTdHJpbmcxNigiYW5kcm9pZC52aWV3LlN1cmZhY2UiKSk7Ci0KLSAgICAgICAgLy8gU3VyZmFjZS53cml0ZVRvUGFyY2VsCi0gICAgICAgIHZpZXc6OlN1cmZhY2Ugc3VyZmFjZVNoaW07Ci0gICAgICAgIHN1cmZhY2VTaGltLm5hbWUgPSBTdHJpbmcxNigidW5rbm93bl9uYW1lIik7Ci0gICAgICAgIHN1cmZhY2VTaGltLmdyYXBoaWNCdWZmZXJQcm9kdWNlciA9IG1TdXJmYWNlTGlzdFtpXS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpOwotICAgICAgICBpZiAoKGVyciA9IHN1cmZhY2VTaGltLndyaXRlVG9QYXJjZWwocGFyY2VsKSkgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIG91dHB1dCB0YXJnZXQgU3VyZmFjZSAlZCB0byBwYXJjZWw6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGksIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICBpZiAoKGVyciA9IGl0LnNldHRpbmdzLndyaXRlVG9QYXJjZWwocGFyY2VsKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIHNldHRpbmdzISIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcGFyY2VsLT53cml0ZUludDMyKG1Jc1JlcHJvY2VzcyA/IDEgOiAwKTsKIAorICAgIGlmIChtU3VyZmFjZUNvbnZlcnRlZCkgeworICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoMCk7IC8vIDAtc2l6ZWQgYXJyYXkKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQzMl90IHNpemUgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihtU3VyZmFjZUxpc3Quc2l6ZSgpKTsKKworICAgICAgICAvLyBTZW5kIDAtc2l6ZWQgYXJyYXlzIHdoZW4gaXQncyBlbXB0eS4gRG8gbm90IHNlbmQgbnVsbCBhcnJheXMuCisgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihzaXplKTsKKworICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgICAgIC8vIG5vdCBzdXJlIGlmIHJlYWRQYXJjZWxhYmxlQXJyYXkgZG9lcyB0aGlzLCBoYXJkIHRvIHRlbGwgZnJvbSBzb3VyY2UKKyAgICAgICAgICAgIHBhcmNlbC0+d3JpdGVTdHJpbmcxNihTdHJpbmcxNigiYW5kcm9pZC52aWV3LlN1cmZhY2UiKSk7CisKKyAgICAgICAgICAgIC8vIFN1cmZhY2Uud3JpdGVUb1BhcmNlbAorICAgICAgICAgICAgdmlldzo6U3VyZmFjZSBzdXJmYWNlU2hpbTsKKyAgICAgICAgICAgIHN1cmZhY2VTaGltLm5hbWUgPSBTdHJpbmcxNigidW5rbm93bl9uYW1lIik7CisgICAgICAgICAgICBzdXJmYWNlU2hpbS5ncmFwaGljQnVmZmVyUHJvZHVjZXIgPSBtU3VyZmFjZUxpc3RbaV0tPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKTsKKyAgICAgICAgICAgIGlmICgoZXJyID0gc3VyZmFjZVNoaW0ud3JpdGVUb1BhcmNlbChwYXJjZWwpKSAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIG91dHB1dCB0YXJnZXQgU3VyZmFjZSAlZCB0byBwYXJjZWw6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpLCBzdHJlcnJvcigtZXJyKSwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcGFyY2VsLT53cml0ZUludDMyKG1TdHJlYW1JZHhMaXN0LnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3RyZWFtSWR4TGlzdC5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoKGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtU3RyZWFtSWR4TGlzdFtpXSkpICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBzdHJlYW0gaW5kZXggdG8gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobVN1cmZhY2VJZHhMaXN0W2ldKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIHN1cmZhY2UgaW5kZXggdG8gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmNwcCBiL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uY3BwCmluZGV4IDQ2OGExZWIuLmZlYjA0YzIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uY3BwCisrKyBiL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uY3BwCkBAIC0xLDYgKzEsNiBAQAogLyoKICoqCi0qKiBDb3B5cmlnaHQgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKiogQ29weXJpZ2h0IDIwMTUtMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogKioKICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtNjQsNiArNjQsMTAgQEAKICAgICByZXR1cm4gbUlzU2hhcmVkOwogfQogCitTdHJpbmcxNiBPdXRwdXRDb25maWd1cmF0aW9uOjpnZXRQaHlzaWNhbENhbWVyYUlkKCkgY29uc3QgeworICAgIHJldHVybiBtUGh5c2ljYWxDYW1lcmFJZDsKK30KKwogT3V0cHV0Q29uZmlndXJhdGlvbjo6T3V0cHV0Q29uZmlndXJhdGlvbigpIDoKICAgICAgICAgbVJvdGF0aW9uKElOVkFMSURfUk9UQVRJT04pLAogICAgICAgICBtU3VyZmFjZVNldElEKElOVkFMSURfU0VUX0lEKSwKQEAgLTEzOSw2ICsxNDMsOCBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAorICAgIHBhcmNlbC0+cmVhZFN0cmluZzE2KCZtUGh5c2ljYWxDYW1lcmFJZCk7CisKICAgICBtUm90YXRpb24gPSByb3RhdGlvbjsKICAgICBtU3VyZmFjZVNldElEID0gc2V0SUQ7CiAgICAgbVN1cmZhY2VUeXBlID0gc3VyZmFjZVR5cGU7CkBAIC0xNTMsMTkgKzE1OSwyMCBAQAogICAgICAgICBtR2Jwcy5wdXNoX2JhY2soc3VyZmFjZS5ncmFwaGljQnVmZmVyUHJvZHVjZXIpOwogICAgIH0KIAotICAgIEFMT0dWKCIlczogT3V0cHV0Q29uZmlndXJhdGlvbjogcm90YXRpb24gPSAlZCwgc2V0SWQgPSAlZCwgc3VyZmFjZVR5cGUgPSAlZCIsCi0gICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Sb3RhdGlvbiwgbVN1cmZhY2VTZXRJRCwgbVN1cmZhY2VUeXBlKTsKKyAgICBBTE9HVigiJXM6IE91dHB1dENvbmZpZ3VyYXRpb246IHJvdGF0aW9uID0gJWQsIHNldElkID0gJWQsIHN1cmZhY2VUeXBlID0gJWQsIgorICAgICAgICAgICIgcGh5c2ljYWxDYW1lcmFJZCA9ICVzIiwgX19GVU5DVElPTl9fLCBtUm90YXRpb24sIG1TdXJmYWNlU2V0SUQsCisgICAgICAgICAgbVN1cmZhY2VUeXBlLCBTdHJpbmc4KG1QaHlzaWNhbENhbWVyYUlkKS5zdHJpbmcoKSk7CiAKICAgICByZXR1cm4gZXJyOwogfQogCiBPdXRwdXRDb25maWd1cmF0aW9uOjpPdXRwdXRDb25maWd1cmF0aW9uKHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAsIGludCByb3RhdGlvbiwKLSAgICAgICAgaW50IHN1cmZhY2VTZXRJRCkgeworICAgICAgICBpbnQgc3VyZmFjZVNldElELCBib29sIGlzU2hhcmVkKSB7CiAgICAgbUdicHMucHVzaF9iYWNrKGdicCk7CiAgICAgbVJvdGF0aW9uID0gcm90YXRpb247CiAgICAgbVN1cmZhY2VTZXRJRCA9IHN1cmZhY2VTZXRJRDsKICAgICBtSXNEZWZlcnJlZCA9IGZhbHNlOwotICAgIG1Jc1NoYXJlZCA9IGZhbHNlOworICAgIG1Jc1NoYXJlZCA9IGlzU2hhcmVkOwogfQogCiBzdGF0dXNfdCBPdXRwdXRDb25maWd1cmF0aW9uOjp3cml0ZVRvUGFyY2VsKGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSBjb25zdCB7CkBAIC0yMDQsNiArMjExLDkgQEAKICAgICBlcnIgPSBwYXJjZWwtPndyaXRlUGFyY2VsYWJsZVZlY3RvcihzdXJmYWNlU2hpbXMpOwogICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CiAKKyAgICBlcnIgPSBwYXJjZWwtPndyaXRlU3RyaW5nMTYobVBoeXNpY2FsQ2FtZXJhSWQpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKICAgICByZXR1cm4gT0s7CiB9CiAKZGlmZiAtLWdpdCBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmggYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FwdHVyZVJlc3VsdC5oCmluZGV4IDkxN2Q5NTMuLjU2ZmExNzggMTAwNjQ0Ci0tLSBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmgKKysrIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0NhcHR1cmVSZXN1bHQuaApAQCAtOTEsMTQgKzkxLDM2IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICByZWFkRnJvbVBhcmNlbChjb25zdCBhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICB3cml0ZVRvUGFyY2VsKGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKIH07CisKK3N0cnVjdCBQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvIDogcHVibGljIGFuZHJvaWQ6OlBhcmNlbGFibGUgeworCisgICAgUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbygpCisgICAgICAgIDogbVBoeXNpY2FsQ2FtZXJhSWQoKSwKKyAgICAgICAgICBtUGh5c2ljYWxDYW1lcmFNZXRhZGF0YSgpIHsKKyAgICB9CisgICAgUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyhjb25zdCBTdHJpbmcxNiYgY2FtZXJhSWQsCisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2FtZXJhTWV0YWRhdGEpCisgICAgICAgICAgICA6IG1QaHlzaWNhbENhbWVyYUlkKGNhbWVyYUlkKSwKKyAgICAgICAgICAgICAgbVBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEoY2FtZXJhTWV0YWRhdGEpIHsKKyAgICB9CisKKyAgICBTdHJpbmcxNiAgbVBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgQ2FtZXJhTWV0YWRhdGEgbVBoeXNpY2FsQ2FtZXJhTWV0YWRhdGE7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgICAgIHJlYWRGcm9tUGFyY2VsKGNvbnN0IGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgICAgIHdyaXRlVG9QYXJjZWwoYW5kcm9pZDo6UGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOworfTsKKwogfSAvLyBuYW1lc3BhY2UgaW1wbAogfSAvLyBuYW1lc3BhY2UgY2FtZXJhMgogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIAogdXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OmltcGw6OkNhcHR1cmVSZXN1bHRFeHRyYXM7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6aW1wbDo6UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbzsKIAogc3RydWN0IENhcHR1cmVSZXN1bHQgOiBwdWJsaWMgdmlydHVhbCBMaWdodFJlZkJhc2U8Q2FwdHVyZVJlc3VsdD4gewogICAgIENhbWVyYU1ldGFkYXRhICAgICAgICAgIG1NZXRhZGF0YTsKKyAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBtUGh5c2ljYWxNZXRhZGF0YXM7CiAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyAgICAgbVJlc3VsdEV4dHJhczsKIAogICAgIENhcHR1cmVSZXN1bHQoKTsKZGlmZiAtLWdpdCBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmggYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5oCmluZGV4IDAxODAxODMuLjUwNmFiYWIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmgKKysrIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuaApAQCAtNDAsMTQgKzQwLDM1IEBACiAgICAgQ2FwdHVyZVJlcXVlc3QoQ2FwdHVyZVJlcXVlc3QmJiByaHMpIG5vZXhjZXB0OwogICAgIHZpcnR1YWwgfkNhcHR1cmVSZXF1ZXN0KCk7CiAKLSAgICBDYW1lcmFNZXRhZGF0YSAgICAgICAgICBtTWV0YWRhdGE7CisgICAgc3RydWN0IFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgeworICAgICAgICBzdGQ6OnN0cmluZyBpZDsKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEgc2V0dGluZ3M7CisgICAgfTsKKyAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhbWVyYVNldHRpbmdzPiBtUGh5c2ljYWxDYW1lcmFTZXR0aW5nczsKKworICAgIC8vIFVzZWQgYnkgTkRLIGNsaWVudCB0byBwYXNzIHN1cmZhY2VzIGJ5IHN0cmVhbS9zdXJmYWNlIGluZGV4LgorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlQ29udmVydGVkID0gZmFsc2U7CisKKyAgICAvLyBTdGFydGluZyBpbiBBbmRyb2lkIE8sIGNyZWF0ZSBhIFN1cmZhY2UgZnJvbSBQYXJjZWwgd2lsbCB0YWtlIG9uZSBleHRyYQorICAgIC8vIElQQyBjYWxsLgogICAgIFZlY3RvcjxzcDxTdXJmYWNlPiA+ICAgIG1TdXJmYWNlTGlzdDsKKyAgICAvLyBPcHRpb25hbCB3YXkgb2YgcGFzc2luZyBzdXJmYWNlIGxpc3Qgc2luY2UgcGFzc2luZyBTdXJmYWNlIG92ZXIgYmluZGVyCisgICAgLy8gaXMgZXhwZW5zaXZlLiBVc2UgdGhlIHN0cmVhbS9zdXJmYWNlIGluZGV4IGZyb20gY3VycmVudCBvdXRwdXQgY29uZmlndXJhdGlvbgorICAgIC8vIHRvIHJlcHJlc2VudCBhbiBjb25maWd1cmVkIG91dHB1dCBTdXJmYWNlLiBXaGVuIHN0cmVhbS9zdXJmYWNlIGluZGV4IGlzIHVzZWQsCisgICAgLy8gc2V0IG1TdXJmYWNlTGlzdCB0byB6ZXJvIGxlbmd0aCB0byBzYXZlIHVucGFyY2VsIHRpbWUuCisgICAgVmVjdG9yPGludD4gICAgICAgICAgICAgbVN0cmVhbUlkeExpc3Q7CisgICAgVmVjdG9yPGludD4gICAgICAgICAgICAgbVN1cmZhY2VJZHhMaXN0OyAvLyBwZXIgc3RyZWFtIHN1cmZhY2UgbGlzdCBpbmRleAorCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbUlzUmVwcm9jZXNzOwogCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgbUNvbnRleHQ7IC8vIGFyYml0cmFyeSB1c2VyIGNvbnRleHQgZnJvbSBOREsgYXBwcywgbnVsbCBmb3IgamF2YSBhcHBzCisKICAgICAvKioKICAgICAgKiBLZWVwIGltcGwgdXAtdG8tZGF0ZSB3aXRoIENhcHR1cmVSZXF1ZXN0LmphdmEgaW4gZnJhbWV3b3Jrcy9iYXNlCiAgICAgICovCisgICAgLy8gdXNlZCBieSBjYW1lcmFzZXJ2ZXIgdG8gcmVjZWl2ZSBDYXB0dXJlUmVxdWVzdCBmcm9tIGphdmEvTkRLIGNsaWVudAogICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIHJlYWRGcm9tUGFyY2VsKGNvbnN0IGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKKyAgICAvLyB1c2VkIGJ5IE5ESyBjbGllbnQgdG8gc2VuZCBDYXB0dXJlUmVxdWVzdCB0byBjYW1lcmFzZXJ2ZXIKICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICB3cml0ZVRvUGFyY2VsKGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKIH07CiAKZGlmZiAtLWdpdCBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaCBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaAppbmRleCA4ZTY0MWM3Li5hODBmNDRiIDEwMDY0NAotLS0gYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmgKKysrIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC00Niw2ICs0Niw3IEBACiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SGVpZ2h0KCkgY29uc3Q7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgaXNEZWZlcnJlZCgpIGNvbnN0OwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIGlzU2hhcmVkKCkgY29uc3Q7CisgICAgU3RyaW5nMTYgICAgICAgICAgICAgICAgICAgZ2V0UGh5c2ljYWxDYW1lcmFJZCgpIGNvbnN0OwogICAgIC8qKgogICAgICAqIEtlZXAgaW1wbCB1cC10by1kYXRlIHdpdGggT3V0cHV0Q29uZmlndXJhdGlvbi5qYXZhIGluIGZyYW1ld29ya3MvYmFzZQogICAgICAqLwpAQCAtNjQsNyArNjUsNyBAQAogICAgIE91dHB1dENvbmZpZ3VyYXRpb24oY29uc3QgYW5kcm9pZDo6UGFyY2VsJiBwYXJjZWwpOwogCiAgICAgT3V0cHV0Q29uZmlndXJhdGlvbihzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgZ2JwLCBpbnQgcm90YXRpb24sCi0gICAgICAgICAgICBpbnQgc3VyZmFjZVNldElEID0gSU5WQUxJRF9TRVRfSUQpOworICAgICAgICAgICAgaW50IHN1cmZhY2VTZXRJRCA9IElOVkFMSURfU0VUX0lELCBib29sIGlzU2hhcmVkID0gZmFsc2UpOwogCiAgICAgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuICggbVJvdGF0aW9uID09IG90aGVyLm1Sb3RhdGlvbiAmJgpAQCAtNzQsNyArNzUsOCBAQAogICAgICAgICAgICAgICAgIG1IZWlnaHQgPT0gb3RoZXIubUhlaWdodCAmJgogICAgICAgICAgICAgICAgIG1Jc0RlZmVycmVkID09IG90aGVyLm1Jc0RlZmVycmVkICYmCiAgICAgICAgICAgICAgICAgbUlzU2hhcmVkID09IG90aGVyLm1Jc1NoYXJlZCAmJgotICAgICAgICAgICAgICAgIGdicHNFcXVhbChvdGhlcikpOworICAgICAgICAgICAgICAgIGdicHNFcXVhbChvdGhlcikgJiYKKyAgICAgICAgICAgICAgICBtUGh5c2ljYWxDYW1lcmFJZCA9PSBvdGhlci5tUGh5c2ljYWxDYW1lcmFJZCApOwogICAgIH0KICAgICBib29sIG9wZXJhdG9yICE9IChjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uJiBvdGhlcikgY29uc3QgewogICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CkBAIC0xMDIsNiArMTA0LDkgQEAKICAgICAgICAgaWYgKG1Jc1NoYXJlZCAhPSBvdGhlci5tSXNTaGFyZWQpIHsKICAgICAgICAgICAgIHJldHVybiBtSXNTaGFyZWQgPCBvdGhlci5tSXNTaGFyZWQ7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1QaHlzaWNhbENhbWVyYUlkICE9IG90aGVyLm1QaHlzaWNhbENhbWVyYUlkKSB7CisgICAgICAgICAgICByZXR1cm4gbVBoeXNpY2FsQ2FtZXJhSWQgPCBvdGhlci5tUGh5c2ljYWxDYW1lcmFJZDsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gZ2Jwc0xlc3NUaGFuKG90aGVyKTsKICAgICB9CiAgICAgYm9vbCBvcGVyYXRvciA+IChjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uJiBvdGhlcikgY29uc3QgewpAQCAtMTEwLDYgKzExNSw3IEBACiAKICAgICBib29sIGdicHNFcXVhbChjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uJiBvdGhlcikgY29uc3Q7CiAgICAgYm9vbCBnYnBzTGVzc1RoYW4oY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0OworICAgIHZvaWQgYWRkR3JhcGhpY1Byb2R1Y2VyKHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGdicCkge21HYnBzLnB1c2hfYmFjayhnYnApO30KIHByaXZhdGU6CiAgICAgc3RkOjp2ZWN0b3I8c3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4+IG1HYnBzOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3RhdGlvbjsKQEAgLTExOSw4ICsxMjUsNyBAQAogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIG1IZWlnaHQ7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgbUlzRGVmZXJyZWQ7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgbUlzU2hhcmVkOwotICAgIC8vIGhlbHBlciBmdW5jdGlvbgotICAgIHN0YXRpYyBTdHJpbmcxNiByZWFkTWF5YmVFbXB0eVN0cmluZzE2KGNvbnN0IGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKTsKKyAgICBTdHJpbmcxNiAgICAgICAgICAgICAgICAgICBtUGh5c2ljYWxDYW1lcmFJZDsKIH07CiB9IC8vIG5hbWVzcGFjZSBwYXJhbXMKIH0gLy8gbmFtZXNwYWNlIGNhbWVyYTIKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwIGIvY2FtZXJhL25kay9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAKaW5kZXggMmE2YjE4Mi4uZmQ5NTI5NiAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAKKysrIGIvY2FtZXJhL25kay9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAKQEAgLTEzNSwzICsxMzUsMTkgQEAKICAgICB9CiAgICAgcmV0dXJuIHNlc3Npb24tPmFib3J0Q2FwdHVyZXMoKTsKIH0KKworRVhQT1JUCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3VwZGF0ZVNoYXJlZE91dHB1dChBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24sCisgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dCogb3V0cHV0KSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpZiAoc2Vzc2lvbiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IHNlc3Npb24gaXMgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIGlmIChzZXNzaW9uLT5pc0Nsb3NlZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogc2Vzc2lvbiAlcCBpcyBhbHJlYWR5IGNsb3NlZCIsIF9fRlVOQ1RJT05fXywgc2Vzc2lvbik7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOworICAgIH0KKyAgICByZXR1cm4gc2Vzc2lvbi0+dXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbihvdXRwdXQpOworfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9OZGtDYW1lcmFEZXZpY2UuY3BwIGIvY2FtZXJhL25kay9OZGtDYW1lcmFEZXZpY2UuY3BwCmluZGV4IDlmNmQxZjcuLjgxMmEzMTIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvTmRrQ2FtZXJhRGV2aWNlLmNwcAorKysgYi9jYW1lcmEvbmRrL05ka0NhbWVyYURldmljZS5jcHAKQEAgLTEwMywxMSArMTAzLDc0IEBACiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB3aW5kb3csIG91dCk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwogICAgIH0KLSAgICAqb3V0ID0gbmV3IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCh3aW5kb3cpOworICAgICpvdXQgPSBuZXcgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KHdpbmRvdywgZmFsc2UpOwogICAgIHJldHVybiBBQ0FNRVJBX09LOwogfQogCiBFWFBPUlQKK2NhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfY3JlYXRlKAorICAgICAgICBBTmF0aXZlV2luZG93KiB3aW5kb3csIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmICh3aW5kb3cgPT0gbnVsbHB0ciB8fCBvdXQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBiYWQgYXJndW1lbnQuIHdpbmRvdyAlcCwgb3V0ICVwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHdpbmRvdywgb3V0KTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgICpvdXQgPSBuZXcgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KHdpbmRvdywgdHJ1ZSk7CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK0VYUE9SVAorY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9hZGQoQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXQsCisgICAgICAgIEFOYXRpdmVXaW5kb3cqIHdpbmRvdykgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKCh3aW5kb3cgPT0gbnVsbHB0cikgfHwgKG91dCA9PSBudWxscHRyKSkgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBiYWQgYXJndW1lbnQuIHdpbmRvdyAlcCwgb3V0ICVwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHdpbmRvdywgb3V0KTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIGlmICghb3V0LT5tSXNTaGFyZWQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvciB0cnlpbmcgdG8gaW5zZXJ0IGEgbmV3IHdpbmRvdyBpbiBub24tc2hhcmVkIG91dHB1dCBjb25maWd1cmF0aW9uIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaWYgKG91dC0+bVdpbmRvdyA9PSB3aW5kb3cpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvciB0cnlpbmcgdG8gYWRkIHRoZSBzYW1lIHdpbmRvdyBhc3NvY2lhdGVkIHdpdGggdGhlIG91dHB1dCBjb25maWd1cmF0aW9uIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBhdXRvIGluc2VydCA9IG91dC0+bVNoYXJlZFdpbmRvd3MuaW5zZXJ0KHdpbmRvdyk7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IChpbnNlcnQuc2Vjb25kKSA/IEFDQU1FUkFfT0sgOiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIHJldHVybiByZXQ7Cit9CisKK0VYUE9SVAorY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9yZW1vdmUoQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXQsCisgICAgICAgIEFOYXRpdmVXaW5kb3cqIHdpbmRvdykgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKCh3aW5kb3cgPT0gbnVsbHB0cikgfHwgKG91dCA9PSBudWxscHRyKSkgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBiYWQgYXJndW1lbnQuIHdpbmRvdyAlcCwgb3V0ICVwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHdpbmRvdywgb3V0KTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIGlmICghb3V0LT5tSXNTaGFyZWQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvciB0cnlpbmcgdG8gcmVtb3ZlIGEgIHdpbmRvdyBpbiBub24tc2hhcmVkIG91dHB1dCBjb25maWd1cmF0aW9uIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaWYgKG91dC0+bVdpbmRvdyA9PSB3aW5kb3cpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvciB0cnlpbmcgdG8gcmVtb3ZlIHRoZSBzYW1lIHdpbmRvdyBhc3NvY2lhdGVkIHdpdGggdGhlIG91dHB1dCBjb25maWd1cmF0aW9uIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBhdXRvIHJlbW92ZSA9IG91dC0+bVNoYXJlZFdpbmRvd3MuZXJhc2Uod2luZG93KTsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gKHJlbW92ZSkgPyBBQ0FNRVJBX09LIDogQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICByZXR1cm4gcmV0OworfQorCitFWFBPUlQKIHZvaWQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0X2ZyZWUoQUNhcHR1cmVTZXNzaW9uT3V0cHV0KiBvdXRwdXQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGlmIChvdXRwdXQgIT0gbnVsbHB0cikgewpAQCAtMTU3LDUgKzIyMCwyMSBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlLCBvdXRwdXRzLCBjYWxsYmFja3MsIHNlc3Npb24pOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKICAgICB9Ci0gICAgcmV0dXJuIGRldmljZS0+Y3JlYXRlQ2FwdHVyZVNlc3Npb24ob3V0cHV0cywgY2FsbGJhY2tzLCBzZXNzaW9uKTsKKyAgICByZXR1cm4gZGV2aWNlLT5jcmVhdGVDYXB0dXJlU2Vzc2lvbihvdXRwdXRzLCBudWxscHRyLCBjYWxsYmFja3MsIHNlc3Npb24pOworfQorCitFWFBPUlQKK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9uV2l0aFNlc3Npb25QYXJhbWV0ZXJzKAorICAgICAgICBBQ2FtZXJhRGV2aWNlKiBkZXZpY2UsCisgICAgICAgIGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogICAgICAgb3V0cHV0cywKKyAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiBzZXNzaW9uUGFyYW1ldGVycywKKyAgICAgICAgY29uc3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzKiBjYWxsYmFja3MsCisgICAgICAgIC8qb3V0Ki9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24qKiBzZXNzaW9uKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpZiAoZGV2aWNlID09IG51bGxwdHIgfHwgb3V0cHV0cyA9PSBudWxscHRyIHx8IGNhbGxiYWNrcyA9PSBudWxscHRyIHx8IHNlc3Npb24gPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBpbnZhbGlkIGlucHV0OiBkZXZpY2UgJXAsIG91dHB1dHMgJXAsIGNhbGxiYWNrcyAlcCwgc2Vzc2lvbiAlcCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2UsIG91dHB1dHMsIGNhbGxiYWNrcywgc2Vzc2lvbik7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICByZXR1cm4gZGV2aWNlLT5jcmVhdGVDYXB0dXJlU2Vzc2lvbihvdXRwdXRzLCBzZXNzaW9uUGFyYW1ldGVycywgY2FsbGJhY2tzLCBzZXNzaW9uKTsKIH0KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvTmRrQ2FwdHVyZVJlcXVlc3QuY3BwIGIvY2FtZXJhL25kay9OZGtDYXB0dXJlUmVxdWVzdC5jcHAKaW5kZXggNWI0YzE4MC4uYWMxODU2YiAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9OZGtDYXB0dXJlUmVxdWVzdC5jcHAKKysrIGIvY2FtZXJhL25kay9OZGtDYXB0dXJlUmVxdWVzdC5jcHAKQEAgLTE0MiwzICsxNDIsNDAgQEAKICAgICBkZWxldGUgcmVxdWVzdDsKICAgICByZXR1cm47CiB9CisKK0VYUE9SVAorY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlUmVxdWVzdF9zZXRVc2VyQ29udGV4dCgKKyAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCB2b2lkKiBjb250ZXh0KSB7CisgICAgaWYgKHJlcXVlc3QgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgYXJndW1lbnQhIHJlcXVlc3QgaXMgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICByZXR1cm4gcmVxdWVzdC0+c2V0Q29udGV4dChjb250ZXh0KTsKK30KKworRVhQT1JUCitjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVSZXF1ZXN0X2dldFVzZXJDb250ZXh0KAorICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIC8qb3V0Ki92b2lkKiogY29udGV4dCkgeworICAgIGlmIChyZXF1ZXN0ID09IG51bGxwdHIgfHwgY29udGV4dCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBhcmd1bWVudCEgcmVxdWVzdCAlcCwgY29udGV4dCAlcCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXF1ZXN0LCBjb250ZXh0KTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIHJldHVybiByZXF1ZXN0LT5nZXRDb250ZXh0KGNvbnRleHQpOworfQorCitFWFBPUlQKK0FDYXB0dXJlUmVxdWVzdCogQUNhcHR1cmVSZXF1ZXN0X2NvcHkoY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiBzcmMpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChzcmMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IHNyYyBpcyBudWxsISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIEFDYXB0dXJlUmVxdWVzdCogcFJlcXVlc3QgPSBuZXcgQUNhcHR1cmVSZXF1ZXN0KCk7CisgICAgcFJlcXVlc3QtPnNldHRpbmdzID0gbmV3IEFDYW1lcmFNZXRhZGF0YSgqKHNyYy0+c2V0dGluZ3MpKTsKKyAgICBwUmVxdWVzdC0+dGFyZ2V0cyAgPSBuZXcgQUNhbWVyYU91dHB1dFRhcmdldHMoKTsKKyAgICAqKHBSZXF1ZXN0LT50YXJnZXRzKSAgPSAqKHNyYy0+dGFyZ2V0cyk7CisgICAgcFJlcXVlc3QtPmNvbnRleHQgPSBzcmMtPmNvbnRleHQ7CisgICAgcmV0dXJuIHBSZXF1ZXN0OworfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcAppbmRleCBiOWMxNTlkLi5mNjBlNWZkIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcApAQCAtMTQ4LDYgKzE0OCwyMyBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb246OnVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb24oQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXRwdXQpIHsKKyAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJFcnJvcjogRGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBzZXNzaW9uICVwIGhhcyBiZWVuIGNsb3NlZCEiLCB0aGlzKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7CisgICAgfQorCisgICAgY2FtZXJhX3N0YXR1c190IHJldDsKKyAgICBkZXYtPmxvY2tEZXZpY2VGb3JTZXNzaW9uT3BzKCk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlc3Npb25Mb2NrKTsKKyAgICAgICAgcmV0ID0gZGV2LT51cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uTG9ja2VkKG91dHB1dCk7CisgICAgfQorICAgIGRldi0+dW5sb2NrRGV2aWNlKCk7CisgICAgcmV0dXJuIHJldDsKK30KKwogQUNhbWVyYURldmljZSoKIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6Z2V0RGV2aWNlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vzc2lvbkxvY2spOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oCmluZGV4IDMzOWM2NjUuLmEyMDY4ZTcgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmgKQEAgLTI0LDcgKzI0LDggQEAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCiBzdHJ1Y3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0IHsKLSAgICBleHBsaWNpdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQoQU5hdGl2ZVdpbmRvdyogd2luZG93KSA6IG1XaW5kb3cod2luZG93KSB7fTsKKyAgICBleHBsaWNpdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQoQU5hdGl2ZVdpbmRvdyogd2luZG93LCBib29sIGlzU2hhcmVkID0gZmFsc2UpIDoKKyAgICAgICAgICAgIG1XaW5kb3cod2luZG93KSwgbUlzU2hhcmVkKGlzU2hhcmVkKSB7fTsKIAogICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCYgb3RoZXIpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1XaW5kb3cgPT0gb3RoZXIubVdpbmRvdzsKQEAgLTQwLDYgKzQxLDggQEAKICAgICB9CiAKICAgICBBTmF0aXZlV2luZG93KiBtV2luZG93OworICAgIHN0ZDo6c2V0PEFOYXRpdmVXaW5kb3cgKj4gbVNoYXJlZFdpbmRvd3M7CisgICAgYm9vbCAgICAgICAgICAgbUlzU2hhcmVkOwogICAgIGludCAgICAgICAgICAgIG1Sb3RhdGlvbiA9IENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzA7CiB9OwogCkBAIC04OSw2ICs5Miw4IEBACiAgICAgICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAogICAgICAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCk7CiAKKyAgICBjYW1lcmFfc3RhdHVzX3QgdXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbihBQ2FwdHVyZVNlc3Npb25PdXRwdXQgKm91dHB1dCk7CisKICAgICBBQ2FtZXJhRGV2aWNlKiBnZXREZXZpY2UoKTsKIAogICBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCmluZGV4IGFmOTc3YjguLjkwN2RlYmMgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5jcHAKQEAgLTU5LDcgKzU5LDggQEAKICAgICAgICAgbVdyYXBwZXIod3JhcHBlciksCiAgICAgICAgIG1JbkVycm9yKGZhbHNlKSwKICAgICAgICAgbUVycm9yKEFDQU1FUkFfT0spLAotICAgICAgICBtSWRsZSh0cnVlKSB7CisgICAgICAgIG1JZGxlKHRydWUpLAorICAgICAgICBtQ3VycmVudFNlc3Npb24obnVsbHB0cikgewogICAgIG1DbG9zaW5nID0gZmFsc2U7CiAgICAgLy8gU2V0dXAgbG9vcGVyIHRocmVhZCB0byBwZXJmcm9tIGRldmljZSBjYWxsYmFja3MgdG8gYXBwCiAgICAgbUNiTG9vcGVyID0gbmV3IEFMb29wZXI7CkBAIC05OCwxOCArOTksMzAgQEAKIAogLy8gRGV2aWNlIGNsb3NlIGltcGxlbWVudGFpdG9uCiBDYW1lcmFEZXZpY2U6On5DYW1lcmFEZXZpY2UoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZXZpY2VMb2NrKTsKLSAgICBpZiAoIWlzQ2xvc2VkKCkpIHsKLSAgICAgICAgZGlzY29ubmVjdExvY2tlZCgpOwotICAgIH0KLSAgICBpZiAobUNiTG9vcGVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgbUNiTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlci0+aWQoKSk7Ci0gICAgICAgIG1DYkxvb3Blci0+c3RvcCgpOworICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiA9IG1DdXJyZW50U2Vzc2lvbi5wcm9tb3RlKCk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURldmljZUxvY2spOworICAgICAgICBpZiAoIWlzQ2xvc2VkKCkpIHsKKyAgICAgICAgICAgIGRpc2Nvbm5lY3RMb2NrZWQoc2Vzc2lvbik7CisgICAgICAgIH0KKyAgICAgICAgbUN1cnJlbnRTZXNzaW9uID0gbnVsbHB0cjsKKyAgICAgICAgaWYgKG1DYkxvb3BlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtQ2JMb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyLT5pZCgpKTsKKyAgICAgICAgICAgIG1DYkxvb3Blci0+c3RvcCgpOworICAgICAgICB9CiAgICAgfQogICAgIG1DYkxvb3Blci5jbGVhcigpOwogICAgIG1IYW5kbGVyLmNsZWFyKCk7CiB9CiAKK3ZvaWQKK0NhbWVyYURldmljZTo6cG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKHNwPEFNZXNzYWdlPiYgbXNnKSB7CisgICAgbXNnLT5wb3N0KCk7CisgICAgbXNnLmNsZWFyKCk7CisgICAgc3A8QU1lc3NhZ2U+IGNsZWFudXBNc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDbGVhblVwU2Vzc2lvbnMsIG1IYW5kbGVyKTsKKyAgICBjbGVhbnVwTXNnLT5wb3N0KCk7Cit9CisKIC8vIFRPRE86IGNhY2hlZCBjcmVhdGVkIHJlcXVlc3Q/CiBjYW1lcmFfc3RhdHVzX3QKIENhbWVyYURldmljZTo6Y3JlYXRlQ2FwdHVyZVJlcXVlc3QoCkBAIC0xNDQsMjEgKzE1NywyMyBAQAogY2FtZXJhX3N0YXR1c190CiBDYW1lcmFEZXZpY2U6OmNyZWF0ZUNhcHR1cmVTZXNzaW9uKAogICAgICAgICBjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqICAgICAgIG91dHB1dHMsCisgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMsCiAgICAgICAgIGNvbnN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2tzLAogICAgICAgICAvKm91dCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiogc2Vzc2lvbikgeworICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gY3VycmVudFNlc3Npb24gPSBtQ3VycmVudFNlc3Npb24ucHJvbW90ZSgpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGV2aWNlTG9jayk7CiAgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOwogICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgewogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgIGlmIChtQ3VycmVudFNlc3Npb24gIT0gbnVsbHB0cikgewotICAgICAgICBtQ3VycmVudFNlc3Npb24tPmNsb3NlQnlEZXZpY2UoKTsKKyAgICBpZiAoY3VycmVudFNlc3Npb24gIT0gbnVsbHB0cikgeworICAgICAgICBjdXJyZW50U2Vzc2lvbi0+Y2xvc2VCeURldmljZSgpOwogICAgICAgICBzdG9wUmVwZWF0aW5nTG9ja2VkKCk7CiAgICAgfQogCiAgICAgLy8gQ3JlYXRlIG5ldyBzZXNzaW9uCi0gICAgcmV0ID0gY29uZmlndXJlU3RyZWFtc0xvY2tlZChvdXRwdXRzKTsKKyAgICByZXQgPSBjb25maWd1cmVTdHJlYW1zTG9ja2VkKG91dHB1dHMsIHNlc3Npb25QYXJhbWV0ZXJzKTsKICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKICAgICAgICAgQUxPR0UoIkZhaWwgdG8gY3JlYXRlIG5ldyBzZXNzaW9uLiBjYW5ub3QgY29uZmlndXJlIHN0cmVhbXMiKTsKICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTI2NCw3ICsyNzksNyBAQAogICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLm9uQWN0aXZlKTsKLSAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOwogICAgIH0KICAgICBtSWRsZSA9IGZhbHNlOwogICAgIG1CdXN5U2Vzc2lvbiA9IHNlc3Npb247CkBAIC0yNzUsMTMgKzI5MCw5MyBAQAogICAgIHJldHVybiBBQ0FNRVJBX09LOwogfQogCitjYW1lcmFfc3RhdHVzX3QgQ2FtZXJhRGV2aWNlOjp1cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uTG9ja2VkKEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqb3V0cHV0KSB7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChvdXRwdXQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBpZiAoIW91dHB1dC0+bUlzU2hhcmVkKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBvdXRwdXQgY29uZmlndXJhdGlvbiBpcyBub3Qgc2hhcmVkIik7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGludDMyX3Qgc3RyZWFtSWQgPSAtMTsKKyAgICBmb3IgKGF1dG8mIGt2UGFpciA6IG1Db25maWd1cmVkT3V0cHV0cykgeworICAgICAgICBpZiAoa3ZQYWlyLnNlY29uZC5maXJzdCA9PSBvdXRwdXQtPm1XaW5kb3cpIHsKKyAgICAgICAgICAgIHN0cmVhbUlkID0ga3ZQYWlyLmZpcnN0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHN0cmVhbUlkIDwgMCkgeworICAgICAgICBBTE9HRSgiRXJyb3I6IEludmFsaWQgb3V0cHV0IGNvbmZpZ3VyYXRpb24iKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaUdCUChudWxscHRyKTsKKyAgICByZXQgPSBnZXRJR0JQZnJvbUFudyhvdXRwdXQtPm1XaW5kb3csIGlHQlApOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyBmYWlsZWQgdG8gZXh0cmFjdCBncmFwaGljIHByb2R1Y2VyIGZyb20gbmF0aXZlIHdpbmRvdyIsCisgICAgICAgICAgICAgICAgZ2V0SWQoKSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBvdXRDb25maWcoaUdCUCwgb3V0cHV0LT5tUm90YXRpb24sIE91dHB1dENvbmZpZ3VyYXRpb246OklOVkFMSURfU0VUX0lELAorICAgICAgICAgICAgdHJ1ZSk7CisKKyAgICBmb3IgKGF1dG8mIGFudyA6IG91dHB1dC0+bVNoYXJlZFdpbmRvd3MpIHsKKyAgICAgICAgcmV0ID0gZ2V0SUdCUGZyb21BbncoYW53LCBpR0JQKTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyBmYWlsZWQgdG8gZXh0cmFjdCBncmFwaGljIHByb2R1Y2VyIGZyb20gbmF0aXZlIHdpbmRvdyIsCisgICAgICAgICAgICAgICAgICAgIGdldElkKCkpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBvdXRDb25maWcuYWRkR3JhcGhpY1Byb2R1Y2VyKGlHQlApOworICAgIH0KKworICAgIGF1dG8gcmVtb3RlUmV0ID0gbVJlbW90ZS0+dXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbihzdHJlYW1JZCwgb3V0Q29uZmlnKTsKKyAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkpIHsKKyAgICAgICAgc3dpdGNoIChyZW1vdGVSZXQuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTjoKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyBpbnZhbGlkIG9wZXJhdGlvbjogJXMiLCBnZXRJZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlUmV0LnRvU3RyaW5nOCgpLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9BTFJFQURZX0VYSVNUUzoKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyBvdXRwdXQgc3VyZmFjZSBhbHJlYWR5IGV4aXN0czogJXMiLCBnZXRJZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlUmV0LnRvU3RyaW5nOCgpLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5UOgorICAgICAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIGludmFsaWQgaW5wdXQgYXJndW1lbnQ6ICVzIiwgZ2V0SWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZVJldC50b1N0cmluZzgoKS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIGZhaWxlZCB0byBhZGQgc2hhcmVkIG91dHB1dDogJXMiLCBnZXRJZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlUmV0LnRvU3RyaW5nOCgpLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9VTktOT1dOOworICAgICAgICB9CisgICAgfQorICAgIG1Db25maWd1cmVkT3V0cHV0c1tzdHJlYW1JZF0gPSBzdGQ6Om1ha2VfcGFpcihvdXRwdXQtPm1XaW5kb3csIG91dENvbmZpZyk7CisKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKwogY2FtZXJhX3N0YXR1c190CiBDYW1lcmFEZXZpY2U6OmFsbG9jYXRlQ2FwdHVyZVJlcXVlc3QoCiAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgLypvdXQqL3NwPENhcHR1cmVSZXF1ZXN0PiYgb3V0UmVxKSB7CiAgICAgY2FtZXJhX3N0YXR1c190IHJldDsKICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxKG5ldyBDYXB0dXJlUmVxdWVzdCgpKTsKLSAgICByZXEtPm1NZXRhZGF0YSA9IHJlcXVlc3QtPnNldHRpbmdzLT5nZXRJbnRlcm5hbERhdGEoKTsKKyAgICByZXEtPm1QaHlzaWNhbENhbWVyYVNldHRpbmdzLnB1c2hfYmFjayh7c3RkOjpzdHJpbmcobUNhbWVyYUlkLnN0cmluZygpKSwKKyAgICAgICAgICAgIHJlcXVlc3QtPnNldHRpbmdzLT5nZXRJbnRlcm5hbERhdGEoKX0pOwogICAgIHJlcS0+bUlzUmVwcm9jZXNzID0gZmFsc2U7IC8vIE5ESyBkb2VzIG5vdCBzdXBwb3J0IHJlcHJvY2Vzc2luZyB5ZXQKKyAgICByZXEtPm1Db250ZXh0ID0gcmVxdWVzdC0+Y29udGV4dDsKKyAgICByZXEtPm1TdXJmYWNlQ29udmVydGVkID0gdHJ1ZTsgLy8gc2V0IHRvIHRydWUsIGFuZCBmaWxsIGluIHN0cmVhbS9zdXJmYWNlIGlkeCB0byBzcGVlZCB1cCBJUEMKIAogICAgIGZvciAoYXV0byBvdXRwdXRUYXJnZXQgOiByZXF1ZXN0LT50YXJnZXRzLT5tT3V0cHV0cykgewogICAgICAgICBBTmF0aXZlV2luZG93KiBhbncgPSBvdXRwdXRUYXJnZXQubVdpbmRvdzsKQEAgLTI5Miw3ICszODcsMzEgQEAKICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIH0KICAgICAgICAgcmVxLT5tU3VyZmFjZUxpc3QucHVzaF9iYWNrKHN1cmZhY2UpOworCisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgLy8gbG9va3VwIHN0cmVhbS9zdXJmYWNlIElECisgICAgICAgIGZvciAoY29uc3QgYXV0byYga3ZQYWlyIDogbUNvbmZpZ3VyZWRPdXRwdXRzKSB7CisgICAgICAgICAgICBpbnQgc3RyZWFtSWQgPSBrdlBhaXIuZmlyc3Q7CisgICAgICAgICAgICBjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uJiBvdXRDb25maWcgPSBrdlBhaXIuc2Vjb25kLnNlY29uZDsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8mIGdicHMgPSBvdXRDb25maWcuZ2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VycygpOworICAgICAgICAgICAgZm9yIChpbnQgc3VyZmFjZUlkID0gMDsgc3VyZmFjZUlkIDwgKGludCkgZ2Jwcy5zaXplKCk7IHN1cmZhY2VJZCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGdicHNbc3VyZmFjZUlkXSA9PSBzdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXEtPm1TdHJlYW1JZHhMaXN0LnB1c2hfYmFjayhzdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgICAgIHJlcS0+bVN1cmZhY2VJZHhMaXN0LnB1c2hfYmFjayhzdXJmYWNlSWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5jb25maWd1cmVkIG91dHB1dCB0YXJnZXQgJXAgaW4gY2FwdHVyZSByZXF1ZXN0ISIsIGFudyk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CiAgICAgfQorCiAgICAgb3V0UmVxID0gcmVxOwogICAgIHJldHVybiBBQ0FNRVJBX09LOwogfQpAQCAtMzAwLDcgKzQxOSw3IEBACiBBQ2FwdHVyZVJlcXVlc3QqCiBDYW1lcmFEZXZpY2U6OmFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHNwPENhcHR1cmVSZXF1ZXN0PiYgcmVxKSB7CiAgICAgQUNhcHR1cmVSZXF1ZXN0KiBwUmVxdWVzdCA9IG5ldyBBQ2FwdHVyZVJlcXVlc3QoKTsKLSAgICBDYW1lcmFNZXRhZGF0YSBjbG9uZSA9IHJlcS0+bU1ldGFkYXRhOworICAgIENhbWVyYU1ldGFkYXRhIGNsb25lID0gcmVxLT5tUGh5c2ljYWxDYW1lcmFTZXR0aW5ncy5iZWdpbigpLT5zZXR0aW5nczsKICAgICBwUmVxdWVzdC0+c2V0dGluZ3MgPSBuZXcgQUNhbWVyYU1ldGFkYXRhKGNsb25lLnJlbGVhc2UoKSwgQUNhbWVyYU1ldGFkYXRhOjpBQ01fUkVRVUVTVCk7CiAgICAgcFJlcXVlc3QtPnRhcmdldHMgID0gbmV3IEFDYW1lcmFPdXRwdXRUYXJnZXRzKCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXEtPm1TdXJmYWNlTGlzdC5zaXplKCk7IGkrKykgewpAQCAtMzA4LDYgKzQyNyw3IEBACiAgICAgICAgIEFDYW1lcmFPdXRwdXRUYXJnZXQgb3V0cHV0VGFyZ2V0KGFudyk7CiAgICAgICAgIHBSZXF1ZXN0LT50YXJnZXRzLT5tT3V0cHV0cy5pbnNlcnQob3V0cHV0VGFyZ2V0KTsKICAgICB9CisgICAgcFJlcXVlc3QtPmNvbnRleHQgPSByZXEtPm1Db250ZXh0OwogICAgIHJldHVybiBwUmVxdWVzdDsKIH0KIApAQCAtMzI4LDcgKzQ0OCw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZiAoc2Vzc2lvbiAhPSBtQ3VycmVudFNlc3Npb24pIHsKKyAgICBpZiAobUN1cnJlbnRTZXNzaW9uICE9IHNlc3Npb24pIHsKICAgICAgICAgLy8gU2Vzc2lvbiBoYXMgYmVlbiByZXBsYWNlZCBieSBvdGhlciBzZWVzaW9uIG9yIGRldmljZSBpcyBjbG9zZWQKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTM0MiwxNCArNDYyLDE0IEBACiAgICAgfQogCiAgICAgLy8gTm8gbmV3IHNlc3Npb24sIHVuY29uZmlndXJlIG5vdwotICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjb25maWd1cmVTdHJlYW1zTG9ja2VkKG51bGxwdHIpOworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjb25maWd1cmVTdHJlYW1zTG9ja2VkKG51bGxwdHIsIG51bGxwdHIpOwogICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgewogICAgICAgICBBTE9HRSgiVW5jb25maWd1cmUgc3RyZWFtIGZhaWxlZC4gRGV2aWNlIG1pZ2h0IHN0aWxsIGJlIGNvbmZpZ3VyZWQhIHJldCAlZCIsIHJldCk7CiAgICAgfQogfQogCiB2b2lkCi1DYW1lcmFEZXZpY2U6OmRpc2Nvbm5lY3RMb2NrZWQoKSB7CitDYW1lcmFEZXZpY2U6OmRpc2Nvbm5lY3RMb2NrZWQoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiYgc2Vzc2lvbikgewogICAgIGlmIChtQ2xvc2luZy5leGNoYW5nZSh0cnVlKSkgewogICAgICAgICAvLyBBbHJlYWR5IGNsb3NpbmcsIGp1c3QgcmV0dXJuCiAgICAgICAgIEFMT0dXKCJDYW1lcmEgZGV2aWNlICVzIGlzIGFscmVhZHkgY2xvc2luZy4iLCBnZXRJZCgpKTsKQEAgLTM2MSw5ICs0ODEsOCBAQAogICAgIH0KICAgICBtUmVtb3RlID0gbnVsbHB0cjsKIAotICAgIGlmIChtQ3VycmVudFNlc3Npb24gIT0gbnVsbHB0cikgewotICAgICAgICBtQ3VycmVudFNlc3Npb24tPmNsb3NlQnlEZXZpY2UoKTsKLSAgICAgICAgbUN1cnJlbnRTZXNzaW9uID0gbnVsbHB0cjsKKyAgICBpZiAoc2Vzc2lvbiAhPSBudWxscHRyKSB7CisgICAgICAgIHNlc3Npb24tPmNsb3NlQnlEZXZpY2UoKTsKICAgICB9CiB9CiAKQEAgLTQwNCw3ICs1MjMsNyBAQAogICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBiZWNhdXNlIGNyZWF0aW5nIGEgbmV3IHNlc3Npb24gd2lsbCBjbG9zZQogICAgIC8vIHByZXZpb3VzIG9uZSBhbmQgdGh1cyByZWplY3QgYW55IEFQSSBjYWxsIGZyb20gcHJldmlvdXMgc2Vzc2lvbi4KICAgICAvLyBCdXQgc3RpbGwgZ29vZCB0byBjaGVjayBoZXJlIGluIGNhc2Ugc29tZXRoaW5nIHVuZXhwZWN0ZWQgaGFwcGVuLgotICAgIGlmIChzZXNzaW9uICE9IG1DdXJyZW50U2Vzc2lvbikgeworICAgIGlmIChtQ3VycmVudFNlc3Npb24gIT0gc2Vzc2lvbikgewogICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHNlc3Npb24gJXAgaXMgbm90IGN1cnJlbnQgYWN0aXZlIHNlc3Npb24hIiwgZ2V0SWQoKSwgc2Vzc2lvbik7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KQEAgLTQxNSwxMiArNTM0LDEzIEBACiAgICAgfQogCiAgICAgbUZsdXNoaW5nID0gdHJ1ZTsKKwogICAgIC8vIFNlbmQgb25BY3RpdmUgY2FsbGJhY2sgdG8gZ3VhcmFudGVlIHRoZXJlIGlzIGFsd2F5cyBhY3RpdmUtPnJlYWR5IHRyYW5zaXRpb24KICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2Vzc2lvblN0YXRlQ2IsIG1IYW5kbGVyKTsKICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOwogICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOwogICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBzZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5vbkFjdGl2ZSk7Ci0gICAgbXNnLT5wb3N0KCk7CisgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CiAKICAgICAvLyBJZiBkZXZpY2UgaXMgYWxyZWFkeSBpZGxpbmcsIHNlbmQgY2FsbGJhY2sgYW5kIGV4aXQgZWFybHkKICAgICBpZiAobUlkbGUpIHsKQEAgLTQyOCw3ICs1NDgsNyBAQAogICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLm9uUmVhZHkpOwotICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CiAgICAgICAgIG1GbHVzaGluZyA9IGZhbHNlOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9PSzsKICAgICB9CkBAIC00NzIsMTcgKzU5MiwxMSBAQAogQ2FtZXJhRGV2aWNlOjpnZXRJR0JQZnJvbUFudygKICAgICAgICAgQU5hdGl2ZVdpbmRvdyogYW53LAogICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgb3V0KSB7Ci0gICAgaWYgKGFudyA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJFcnJvcjogb3V0cHV0IEFOYXRpdmVXaW5kb3cgaXMgbnVsbCIpOwotICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICBzcDxTdXJmYWNlPiBzdXJmYWNlOworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBnZXRTdXJmYWNlRnJvbUFOYXRpdmVXaW5kb3coYW53LCBzdXJmYWNlKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgcmV0dXJuIHJldDsKICAgICB9Ci0gICAgaW50IHZhbHVlOwotICAgIGludCBlcnIgPSAoKmFudy0+cXVlcnkpKGFudywgTkFUSVZFX1dJTkRPV19DT05DUkVURV9UWVBFLCAmdmFsdWUpOwotICAgIGlmIChlcnIgIT0gT0sgfHwgdmFsdWUgIT0gTkFUSVZFX1dJTkRPV19TVVJGQUNFKSB7Ci0gICAgICAgIEFMT0dFKCJFcnJvcjogQU5hdGl2ZVdpbmRvdyBpcyBub3QgYmFja2VkIGJ5IFN1cmZhY2UhIik7Ci0gICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwotICAgIH0KLSAgICBjb25zdCBzcDxTdXJmYWNlPiBzdXJmYWNlKHN0YXRpY19jYXN0PFN1cmZhY2UqPihhbncpKTsKICAgICBvdXQgPSBzdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CiAgICAgcmV0dXJuIEFDQU1FUkFfT0s7CiB9CkBAIC01MDYsNyArNjIwLDggQEAKIH0KIAogY2FtZXJhX3N0YXR1c190Ci1DYW1lcmFEZXZpY2U6OmNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBvdXRwdXRzKSB7CitDYW1lcmFEZXZpY2U6OmNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBvdXRwdXRzLAorICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHNlc3Npb25QYXJhbWV0ZXJzKSB7CiAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyIGVtcHR5T3V0cHV0OwogICAgIGlmIChvdXRwdXRzID09IG51bGxwdHIpIHsKICAgICAgICAgb3V0cHV0cyA9ICZlbXB0eU91dHB1dDsKQEAgLTUyNiw3ICs2NDEsOCBAQAogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogICAgICAgICBvdXRwdXRTZXQuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAotICAgICAgICAgICAgICAgIGFudywgT3V0cHV0Q29uZmlndXJhdGlvbihpR0JQLCBvdXRDb25maWcubVJvdGF0aW9uKSkpOworICAgICAgICAgICAgICAgIGFudywgT3V0cHV0Q29uZmlndXJhdGlvbihpR0JQLCBvdXRDb25maWcubVJvdGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbjo6SU5WQUxJRF9TRVRfSUQsIG91dENvbmZpZy5tSXNTaGFyZWQpKSk7CiAgICAgfQogICAgIGF1dG8gYWRkU2V0ID0gb3V0cHV0U2V0OwogICAgIHN0ZDo6dmVjdG9yPGludD4gZGVsZXRlTGlzdDsKQEAgLTU2OCw3ICs2ODQsNyBAQAogICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBtQnVzeVNlc3Npb24pOwogICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgbUJ1c3lTZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5vblJlYWR5KTsKICAgICAgICAgbUJ1c3lTZXNzaW9uLmNsZWFyKCk7Ci0gICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKICAgICB9CiAgICAgbUlkbGUgPSB0cnVlOwogCkBAIC02MDEsNyArNzE3LDExIEBACiAgICAgICAgIG1Db25maWd1cmVkT3V0cHV0cy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoc3RyZWFtSWQsIG91dHB1dFBhaXIpKTsKICAgICB9CiAKLSAgICByZW1vdGVSZXQgPSBtUmVtb3RlLT5lbmRDb25maWd1cmUoLyppc0NvbnN0cmFpbmVkSGlnaFNwZWVkKi8gZmFsc2UpOworICAgIENhbWVyYU1ldGFkYXRhIHBhcmFtczsKKyAgICBpZiAoKHNlc3Npb25QYXJhbWV0ZXJzICE9IG51bGxwdHIpICYmIChzZXNzaW9uUGFyYW1ldGVycy0+c2V0dGluZ3MgIT0gbnVsbHB0cikpIHsKKyAgICAgICAgcGFyYW1zLmFwcGVuZChzZXNzaW9uUGFyYW1ldGVycy0+c2V0dGluZ3MtPmdldEludGVybmFsRGF0YSgpKTsKKyAgICB9CisgICAgcmVtb3RlUmV0ID0gbVJlbW90ZS0+ZW5kQ29uZmlndXJlKC8qaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCovIGZhbHNlLCBwYXJhbXMpOwogICAgIGlmIChyZW1vdGVSZXQuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkgPT0gaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5UKSB7CiAgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIGNhbm5ub3Qgc3VwcG9ydCBhcHAgb3V0cHV0IGNvbmZpZ3VyYXRpb246ICVzIiwgZ2V0SWQoKSwKICAgICAgICAgICAgICAgICByZW1vdGVSZXQudG9TdHJpbmc4KCkuc3RyaW5nKCkpOwpAQCAtNzE2LDE5ICs4MzYsMjYgQEAKICAgICAgICAgICAgIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX1NFUlZJQ0UpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIEFOYXRpdmVXaW5kb3cqIGFudyA9IG91dHB1dFBhaXJJdC0+c2Vjb25kLmZpcnN0OwogCi0gICAgICAgIEFMT0dWKCJDYW1lcmEgJXMgTG9zdCBvdXRwdXQgYnVmZmVyIGZvciBBTlcgJXAgZnJhbWUgJSIgUFJJZDY0LAotICAgICAgICAgICAgICAgIGdldElkKCksIGFudywgZnJhbWVOdW1iZXIpOworICAgICAgICBjb25zdCBhdXRvJiBnYnBzID0gb3V0cHV0UGFpckl0LT5zZWNvbmQuc2Vjb25kLmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcnMoKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBvdXRHYnAgOiBnYnBzKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gc3VyZmFjZSA6IHJlcXVlc3QtPm1TdXJmYWNlTGlzdCkgeworICAgICAgICAgICAgICAgIGlmIChzdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgPT0gb3V0R2JwKSB7CisgICAgICAgICAgICAgICAgICAgIEFOYXRpdmVXaW5kb3cqIGFudyA9IHN0YXRpY19jYXN0PEFOYXRpdmVXaW5kb3cqPihzdXJmYWNlLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkNhbWVyYSAlcyBMb3N0IG91dHB1dCBidWZmZXIgZm9yIEFOVyAlcCBmcmFtZSAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SWQoKSwgYW53LCBmcmFtZU51bWJlcik7CiAKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVCdWZmZXJMb3N0LCBtSGFuZGxlcik7Ci0gICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1DYWxsYmFja3MuY29udGV4dCk7Ci0gICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOwotICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgb25CdWZmZXJMb3N0KTsKLSAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtBbndLZXksICh2b2lkKikgYW53KTsKLSAgICAgICAgbXNnLT5zZXRJbnQ2NChrRnJhbWVOdW1iZXJLZXksIGZyYW1lTnVtYmVyKTsKLSAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlQnVmZmVyTG9zdCwgbUhhbmRsZXIpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ2FsbGJhY2tzLmNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG9uQnVmZmVyTG9zdCk7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgcmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQW53S2V5LCAodm9pZCopIGFudyk7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50NjQoa0ZyYW1lTnVtYmVyS2V5LCBmcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0gZWxzZSB7IC8vIEhhbmRsZSBvdGhlciBjYXB0dXJlIGZhaWx1cmVzCiAgICAgICAgIC8vIEZpcmUgY2FwdHVyZSBmYWlsdXJlIGNhbGxiYWNrIGlmIHRoZXJlIGlzIG9uZSByZWdpc3RlcmVkCiAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfZmFpbGVkIG9uRXJyb3IgPSBjYmgubUNhbGxiYWNrcy5vbkNhcHR1cmVGYWlsZWQ7CkBAIC03NDYsNyArODczLDcgQEAKICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG9uRXJyb3IpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZVJlcXVlc3RLZXksIHJlcXVlc3QpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZUZhaWx1cmVLZXksIGZhaWx1cmUpOwotICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CiAKICAgICAgICAgLy8gVXBkYXRlIHRyYWNrZXIKICAgICAgICAgbUZyYW1lTnVtYmVyVHJhY2tlci51cGRhdGVUcmFja2VyKGZyYW1lTnVtYmVyLCAvKmlzRXJyb3IqL3RydWUpOwpAQCAtNzY5LDYgKzg5Niw5IEBACiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlQnVmZmVyTG9zdDoKICAgICAgICAgICAgIEFMT0dWKCIlczogUmVjZWl2ZWQgbXNnICVkIiwgX19GVU5DVElPTl9fLCBtc2ctPndoYXQoKSk7CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrV2hhdENsZWFuVXBTZXNzaW9uczoKKyAgICAgICAgICAgIG1DYWNoZWRTZXNzaW9ucy5jbGVhcigpOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR0UoIiVzOkVycm9yOiB1bmtub3duIGRldmljZSBjYWxsYmFjayAlZCIsIF9fRlVOQ1RJT05fXywgbXNnLT53aGF0KCkpOwogICAgICAgICAgICAgcmV0dXJuOwpAQCAtODQyLDYgKzk3Miw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uKHN0YXRpY19jYXN0PEFDYW1lcmFDYXB0dXJlU2Vzc2lvbio+KG9iai5nZXQoKSkpOworICAgICAgICAgICAgbUNhY2hlZFNlc3Npb25zLnB1c2goc2Vzc2lvbik7CiAgICAgICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdFNwID0gbnVsbHB0cjsKICAgICAgICAgICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgpAQCAtMTA1Myw3ICsxMTg0LDcgQEAKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgY2JoLm1TZXNzaW9uKTsKICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZCk7CiAgICAgICAgIG1zZy0+c2V0SW50MzIoa1NlcXVlbmNlSWRLZXksIHNlcXVlbmNlSWQpOwotICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gVXNlIG1TZXF1ZW5jZUxhc3RGcmFtZU51bWJlck1hcCB0byB0cmFjawogICAgICAgICBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHNlcXVlbmNlSWQsIGxhc3RGcmFtZU51bWJlcikpOwpAQCAtMTExMCw3ICsxMjQxLDcgQEAKICAgICAgICAgICAgIC8vIGJlZm9yZSBjYmggZ29lcyBvdXQgb2Ygc2NvcGUgYW5kIGNhdXNpbmcgd2UgY2FsbCB0aGUgc2Vzc2lvbgogICAgICAgICAgICAgLy8gZGVzdHJ1Y3RvciB3aGlsZSBob2xkaW5nIGRldmljZSBsb2NrCiAgICAgICAgICAgICBjYmgubVNlc3Npb24uY2xlYXIoKTsKLSAgICAgICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBObyBuZWVkIHRvIHRyYWNrIHNlcXVlbmNlIGNvbXBsZXRlIGlmIHRoZXJlIGlzIG5vIGNhbGxiYWNrIHJlZ2lzdGVyZWQKQEAgLTExMzcsNiArMTI2OCw3IEBACiAgICAgICAgIHJldHVybiByZXQ7IC8vIGRldmljZSBoYXMgYmVlbiBjbG9zZWQKICAgICB9CiAKKyAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24gPSBkZXYtPm1DdXJyZW50U2Vzc2lvbi5wcm9tb3RlKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGRldi0+bURldmljZUxvY2spOwogICAgIGlmIChkZXYtPm1SZW1vdGUgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gcmV0OyAvLyBkZXZpY2UgaGFzIGJlZW4gY2xvc2VkCkBAIC0xMTQ1LDEwICsxMjc3LDEwIEBACiAgICAgICAgIGNhc2UgRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDoKICAgICAgICAgewogICAgICAgICAgICAgLy8gQ2FtZXJhIGlzIGRpc2Nvbm5lY3RlZCwgY2xvc2UgdGhlIHNlc3Npb24gYW5kIGV4cGVjdCBubyBtb3JlIGNhbGxiYWNrcwotICAgICAgICAgICAgaWYgKGRldi0+bUN1cnJlbnRTZXNzaW9uICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBkZXYtPm1DdXJyZW50U2Vzc2lvbi0+Y2xvc2VCeURldmljZSgpOwotICAgICAgICAgICAgICAgIGRldi0+bUN1cnJlbnRTZXNzaW9uID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLT5jbG9zZUJ5RGV2aWNlKCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXYtPm1DdXJyZW50U2Vzc2lvbiA9IG51bGxwdHI7CiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0T25EaXNjb25uZWN0ZWQsIGRldi0+bUhhbmRsZXIpOwogICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBkZXYtPm1BcHBDYWxsYmFja3MuY29udGV4dCk7CiAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0RldmljZUtleSwgKHZvaWQqKSBkZXYtPmdldFdyYXBwZXIoKSk7CkBAIC0xMjE2LDYgKzEzNDgsNyBAQAogICAgICAgICAgICAgZGV2LT5zZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0UpOwogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQorCiAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uU3RhdGVDYiwgZGV2LT5tSGFuZGxlcik7CiAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgZGV2LT5tQnVzeVNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBkZXYtPm1CdXN5U2Vzc2lvbik7CkBAIC0xMjIzLDcgKzEzNTYsNyBAQAogICAgICAgICAvLyBNYWtlIHN1cmUgd2UgY2xlYXIgdGhlIHNwIGZpcnN0IHNvIHRoZSBzZXNzaW9uIGRlc3RydWN0b3IgY2FuCiAgICAgICAgIC8vIG9ubHkgaGFwcGVuIG9uIGhhbmRsZXIgdGhyZWFkICh3aGVyZSB3ZSBkb24ndCBob2xkIGRldmljZS9zZXNzaW9uIGxvY2spCiAgICAgICAgIGRldi0+bUJ1c3lTZXNzaW9uLmNsZWFyKCk7Ci0gICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICBkZXYtPnBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOwogICAgIH0KICAgICBkZXYtPm1JZGxlID0gdHJ1ZTsKICAgICBkZXYtPm1GbHVzaGluZyA9IGZhbHNlOwpAQCAtMTI2NSw3ICsxMzk4LDcgQEAKICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG9uU3RhcnQpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZVJlcXVlc3RLZXksIHJlcXVlc3QpOwogICAgICAgICBtc2ctPnNldEludDY0KGtUaW1lU3RhbXBLZXksIHRpbWVzdGFtcCk7Ci0gICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICBkZXYtPnBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOwogICAgIH0KICAgICByZXR1cm4gcmV0OwogfQpAQCAtMTI3Myw3ICsxNDA2LDkgQEAKIGJpbmRlcjo6U3RhdHVzCiBDYW1lcmFEZXZpY2U6OlNlcnZpY2VDYWxsYmFjazo6b25SZXN1bHRSZWNlaXZlZCgKICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhLAotICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKKyAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxSZXN1bHRJbmZvcykgeworICAgICh2b2lkKSBwaHlzaWNhbFJlc3VsdEluZm9zOwogICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IGJpbmRlcjo6U3RhdHVzOjpvaygpOwogCiAgICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBtRGV2aWNlLnByb21vdGUoKTsKQEAgLTEzMjgsNyArMTQ2Myw3IEBACiAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvblJlc3VsdCk7CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgcmVxdWVzdCk7CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVzdWx0S2V5LCByZXN1bHQpOwotICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgZGV2LT5wb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKICAgICB9CiAKICAgICBpZiAoIWlzUGFydGlhbFJlc3VsdCkgewpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKaW5kZXggODU1ZWZlMS4uMTM2OTE0OCAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5oCkBAIC0zNiwxMiArMzYsMTMgQEAKICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuaD4KIAotI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaD4KKyNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhTWFuYWdlci5oPgorI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oPgogI2luY2x1ZGUgIkFDYW1lcmFNZXRhZGF0YS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLS8vIFdyYXAgQUNhbWVyYUNhcHR1cmVGYWlsdXJlIHNvIGl0IGNhbiBiZSByZWYtY291bnRlcgorLy8gV3JhcCBBQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgc28gaXQgY2FuIGJlIHJlZi1jb3VudGVkCiBzdHJ1Y3QgQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgOiBwdWJsaWMgUmVmQmFzZSwgcHVibGljIEFDYW1lcmFDYXB0dXJlRmFpbHVyZSB7fTsKIAogY2xhc3MgQ2FtZXJhRGV2aWNlIGZpbmFsIDogcHVibGljIFJlZkJhc2UgewpAQCAtNTksNiArNjAsNyBAQAogCiAgICAgY2FtZXJhX3N0YXR1c190IGNyZWF0ZUNhcHR1cmVTZXNzaW9uKAogICAgICAgICAgICAgY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiAgICAgICBvdXRwdXRzLAorICAgICAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiBzZXNzaW9uUGFyYW1ldGVycywKICAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2tzLAogICAgICAgICAgICAgLypvdXQqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbioqIHNlc3Npb24pOwogCkBAIC03Miw3ICs3NCw4IEBACiAgICAgICAgIGJpbmRlcjo6U3RhdHVzIG9uQ2FwdHVyZVN0YXJ0ZWQoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXApIG92ZXJyaWRlOwogICAgICAgICBiaW5kZXI6OlN0YXR1cyBvblJlc3VsdFJlY2VpdmVkKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxSZXN1bHRJbmZvcykgb3ZlcnJpZGU7CiAgICAgICAgIGJpbmRlcjo6U3RhdHVzIG9uUHJlcGFyZWQoaW50IHN0cmVhbUlkKSBvdmVycmlkZTsKICAgICAgICAgYmluZGVyOjpTdGF0dXMgb25SZXF1ZXN0UXVldWVFbXB0eSgpIG92ZXJyaWRlOwogICAgICAgICBiaW5kZXI6OlN0YXR1cyBvblJlcGVhdGluZ1JlcXVlc3RFcnJvcihpbnQ2NF90IGxhc3RGcmFtZU51bWJlciwKQEAgLTk2LDcgKzk5LDcgQEAKICAgICAvLyBkZXZpY2UgZ29lcyBpbnRvIGZhdGFsIGVycm9yIHN0YXRlIGFmdGVyIHRoaXMKICAgICB2b2lkIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKGNhbWVyYV9zdGF0dXNfdCBlcnJvcik7CiAKLSAgICB2b2lkIGRpc2Nvbm5lY3RMb2NrZWQoKTsgLy8gZGlzY29ubmVjdCBmcm9tIGNhbWVyYSBzZXJ2aWNlCisgICAgdm9pZCBkaXNjb25uZWN0TG9ja2VkKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4mIHNlc3Npb24pOyAvLyBkaXNjb25uZWN0IGZyb20gY2FtZXJhIHNlcnZpY2UKIAogICAgIGNhbWVyYV9zdGF0dXNfdCBzdG9wUmVwZWF0aW5nTG9ja2VkKCk7CiAKQEAgLTEyMiw3ICsxMjUsOSBAQAogICAgICAgICAgICAgLypvdXQqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQsCiAgICAgICAgICAgICBib29sIGlzUmVwZWF0aW5nKTsKIAotICAgIHN0YXRpYyBjYW1lcmFfc3RhdHVzX3QgYWxsb2NhdGVDYXB0dXJlUmVxdWVzdCgKKyAgICBjYW1lcmFfc3RhdHVzX3QgdXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbkxvY2tlZChBQ2FwdHVyZVNlc3Npb25PdXRwdXQgKm91dHB1dCk7CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgYWxsb2NhdGVDYXB0dXJlUmVxdWVzdCgKICAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgc3A8Q2FwdHVyZVJlcXVlc3Q+JiBvdXRSZXEpOwogCiAgICAgc3RhdGljIEFDYXB0dXJlUmVxdWVzdCogYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+JiByZXEpOwpAQCAtMTM2LDcgKzE0MSwxMSBAQAogICAgIC8vIEZvciBjYXB0dXJlIHNlc3Npb24gdG8gbm90aWZ5IGl0cyBlbmQgb2YgbGlmZQogICAgIHZvaWQgbm90aWZ5U2Vzc2lvbkVuZE9mTGlmZUxvY2tlZChBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24pOwogCi0gICAgY2FtZXJhX3N0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBvdXRwdXRzKTsKKyAgICBjYW1lcmFfc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtc0xvY2tlZChjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqIG91dHB1dHMsCisgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMpOworCisgICAgLy8gSW5wdXQgbWVzc2FnZSB3aWxsIGJlIHBvc3RlZCBhbmQgY2xlYXJlZCBhZnRlciB0aGlzIHJldHVybnMKKyAgICB2b2lkIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChzcDxBTWVzc2FnZT4mIG1zZyk7CiAKICAgICBzdGF0aWMgY2FtZXJhX3N0YXR1c190IGdldElHQlBmcm9tQW53KAogICAgICAgICAgICAgQU5hdGl2ZVdpbmRvdyogYW53LCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgb3V0KTsKQEAgLTE4NSw3ICsxOTQsOSBAQAogICAgICAgICBrV2hhdENhcHR1cmVGYWlsLCAgICAgIC8vIG9uQ2FwdHVyZUZhaWxlZAogICAgICAgICBrV2hhdENhcHR1cmVTZXFFbmQsICAgIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkCiAgICAgICAgIGtXaGF0Q2FwdHVyZVNlcUFib3J0LCAgLy8gb25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkCi0gICAgICAgIGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3QgLy8gb25DYXB0dXJlQnVmZmVyTG9zdAorICAgICAgICBrV2hhdENhcHR1cmVCdWZmZXJMb3N0LC8vIG9uQ2FwdHVyZUJ1ZmZlckxvc3QKKyAgICAgICAgLy8gSW50ZXJuYWwgY2xlYW51cAorICAgICAgICBrV2hhdENsZWFuVXBTZXNzaW9ucyAgIC8vIENsZWFudXAgY2FjaGVkIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4KICAgICB9OwogICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ29udGV4dEtleTsKICAgICBzdGF0aWMgY29uc3QgY2hhcioga0RldmljZUtleTsKQEAgLTE5OSwxMCArMjEwLDE2IEBACiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtTZXF1ZW5jZUlkS2V5OwogICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrRnJhbWVOdW1iZXJLZXk7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtBbndLZXk7CisKICAgICBjbGFzcyBDYWxsYmFja0hhbmRsZXIgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgICAgcHVibGljOgotICAgICAgICBDYWxsYmFja0hhbmRsZXIoKSB7fQogICAgICAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gVGhpcyBoYW5kbGVyIHdpbGwgY2FjaGUgYWxsIGNhcHR1cmUgc2Vzc2lvbiBzcCB1bnRpbCBrV2hhdENsZWFuVXBTZXNzaW9ucworICAgICAgICAvLyBpcyBwcm9jZXNzZWQuIFRoaXMgaXMgdXNlZCB0byBndWFyYW50ZWUgdGhlIGxhc3Qgc2Vzc2lvbiByZWZlcmVuY2UgaXMgYWx3YXlzCisgICAgICAgIC8vIGJlaW5nIHJlbW92ZWQgaW4gY2FsbGJhY2sgdGhyZWFkIHdpdGhvdXQgaG9sZGluZyBjYW1lcmEgZGV2aWNlIGxvY2sKKyAgICAgICAgVmVjdG9yPHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4+IG1DYWNoZWRTZXNzaW9uczsKICAgICB9OwogICAgIHNwPENhbGxiYWNrSGFuZGxlcj4gbUhhbmRsZXI7CiAKQEAgLTIxMCw3ICsyMjcsNyBAQAogICAgICAqIENhcHR1cmUgc2Vzc2lvbiByZWxhdGVkIG1lbWJlcnMgKgogICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAvLyBUaGUgY3VycmVudCBhY3RpdmUgc2Vzc2lvbgotICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogbUN1cnJlbnRTZXNzaW9uID0gbnVsbHB0cjsKKyAgICB3cDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IG1DdXJyZW50U2Vzc2lvbjsKICAgICBib29sIG1GbHVzaGluZyA9IGZhbHNlOwogCiAgICAgaW50IG1OZXh0U2Vzc2lvbklkID0gMDsKQEAgLTI5NSw5ICszMTIsMTAgQEAKIAogICAgIGNhbWVyYV9zdGF0dXNfdCBjcmVhdGVDYXB0dXJlU2Vzc2lvbigKICAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogICAgICAgb3V0cHV0cywKKyAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMsCiAgICAgICAgICAgICBjb25zdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrcywKICAgICAgICAgICAgIC8qb3V0Ki9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24qKiBzZXNzaW9uKSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlLT5jcmVhdGVDYXB0dXJlU2Vzc2lvbihvdXRwdXRzLCBjYWxsYmFja3MsIHNlc3Npb24pOworICAgICAgICByZXR1cm4gbURldmljZS0+Y3JlYXRlQ2FwdHVyZVNlc3Npb24ob3V0cHV0cywgc2Vzc2lvblBhcmFtZXRlcnMsIGNhbGxiYWNrcywgc2Vzc2lvbik7CiAgICAgfQogCiAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcAppbmRleCAzZjY0YmNjLi5jNTlkMGU3IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAKQEAgLTIyMSw3ICsyMjEsNyBAQAogICAgIG1DYWxsYmFja3MuZXJhc2UoY2IpOwogfQogCi12b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6OmdldENhbWVyYUlkTGlzdChzdGQ6OnZlY3RvcjxTdHJpbmc4PiAqY2FtZXJhSWRzKSB7Cit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6OmdldENhbWVyYUlkTGlzdChzdGQ6OnZlY3RvcjxTdHJpbmc4PiogY2FtZXJhSWRzKSB7CiAgICAgLy8gRW5zdXJlIHRoYXQgd2UgaGF2ZSBpbml0aWFsaXplZC9yZWZyZXNoZWQgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGRldmljZXMKICAgICBhdXRvIGNzID0gZ2V0Q2FtZXJhU2VydmljZSgpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0zNDAsNiArMzQwLDkgQEAKICAgICAgICAgbXNnLT5zZXRTdHJpbmcoa0NhbWVyYUlkS2V5LCBBU3RyaW5nKGNhbWVyYUlkKSk7CiAgICAgICAgIG1zZy0+cG9zdCgpOwogICAgIH0KKyAgICBpZiAoc3RhdHVzID09IGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX1BSRVNFTlQpIHsKKyAgICAgICAgbURldmljZVN0YXR1c01hcC5lcmFzZShjYW1lcmFJZCk7CisgICAgfQogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuaCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCmluZGV4IDRhMTcyZjMuLmNjNDJmNzcgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhTWFuYWdlci5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlaW50Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvQm5DYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KQEAgLTE0MCw4ICsxNDEsMjkgQEAKICAgICBzdGF0aWMgYm9vbCB2YWxpZFN0YXR1cyhpbnQzMl90IHN0YXR1cyk7CiAgICAgc3RhdGljIGJvb2wgaXNTdGF0dXNBdmFpbGFibGUoaW50MzJfdCBzdGF0dXMpOwogCisgICAgLy8gVGhlIHNvcnQgbG9naWMgbXVzdCBtYXRjaCB0aGUgbG9naWMgaW4KKyAgICAvLyBsaWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwOjpnZXRBUEkxQ29tcGF0aWJsZUNhbWVyYURldmljZUlkcworICAgIHN0cnVjdCBDYW1lcmFJZENvbXBhcmF0b3IgeworICAgICAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgU3RyaW5nOCYgYSwgY29uc3QgU3RyaW5nOCYgYikgY29uc3QgeworICAgICAgICAgICAgdWludDMyX3QgYVVpbnQgPSAwLCBiVWludCA9IDA7CisgICAgICAgICAgICBib29sIGFJc1VpbnQgPSBiYXNlOjpQYXJzZVVpbnQoYS5jX3N0cigpLCAmYVVpbnQpOworICAgICAgICAgICAgYm9vbCBiSXNVaW50ID0gYmFzZTo6UGFyc2VVaW50KGIuY19zdHIoKSwgJmJVaW50KTsKKworICAgICAgICAgICAgLy8gVWludCBkZXZpY2UgSURzIGZpcnN0CisgICAgICAgICAgICBpZiAoYUlzVWludCAmJiBiSXNVaW50KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFVaW50IDwgYlVpbnQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFJc1VpbnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYklzVWludCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFNpbXBsZSBzdHJpbmcgY29tcGFyZSBpZiBib3RoIGlkIGFyZSBub3QgdWludAorICAgICAgICAgICAgcmV0dXJuIGEgPCBiOworICAgICAgICB9CisgICAgfTsKKwogICAgIC8vIE1hcCBjYW1lcmFfaWQgLT4gc3RhdHVzCi0gICAgc3RkOjptYXA8U3RyaW5nOCwgaW50MzJfdD4gbURldmljZVN0YXR1c01hcDsKKyAgICBzdGQ6Om1hcDxTdHJpbmc4LCBpbnQzMl90LCBDYW1lcmFJZENvbXBhcmF0b3I+IG1EZXZpY2VTdGF0dXNNYXA7CiAKICAgICAvLyBGb3IgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZQogICAgIHN0YXRpYyBNdXRleCBzTG9jazsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWV0YWRhdGEuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAKaW5kZXggN2IzM2MzMi4uZmMwMGEyZCAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAKQEAgLTIzNSw3ICsyMzUsNyBAQAogfQogCiBjb25zdCBDYW1lcmFNZXRhZGF0YSYKLUFDYW1lcmFNZXRhZGF0YTo6Z2V0SW50ZXJuYWxEYXRhKCkgeworQUNhbWVyYU1ldGFkYXRhOjpnZXRJbnRlcm5hbERhdGEoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1EYXRhOwogfQogCkBAIC0zMDUsNiArMzA1LDcgQEAKICAgICAgICAgY2FzZSBBQ0FNRVJBX1NUQVRJU1RJQ1NfRkFDRV9ERVRFQ1RfTU9ERToKICAgICAgICAgY2FzZSBBQ0FNRVJBX1NUQVRJU1RJQ1NfSE9UX1BJWEVMX01BUF9NT0RFOgogICAgICAgICBjYXNlIEFDQU1FUkFfU1RBVElTVElDU19MRU5TX1NIQURJTkdfTUFQX01PREU6CisgICAgICAgIGNhc2UgQUNBTUVSQV9TVEFUSVNUSUNTX09JU19EQVRBX01PREU6CiAgICAgICAgIGNhc2UgQUNBTUVSQV9UT05FTUFQX0NVUlZFX0JMVUU6CiAgICAgICAgIGNhc2UgQUNBTUVSQV9UT05FTUFQX0NVUlZFX0dSRUVOOgogICAgICAgICBjYXNlIEFDQU1FUkFfVE9ORU1BUF9DVVJWRV9SRUQ6CkBAIC0zMTIsNiArMzEzLDcgQEAKICAgICAgICAgY2FzZSBBQ0FNRVJBX1RPTkVNQVBfR0FNTUE6CiAgICAgICAgIGNhc2UgQUNBTUVSQV9UT05FTUFQX1BSRVNFVF9DVVJWRToKICAgICAgICAgY2FzZSBBQ0FNRVJBX0JMQUNLX0xFVkVMX0xPQ0s6CisgICAgICAgIGNhc2UgQUNBTUVSQV9ESVNUT1JUSU9OX0NPUlJFQ1RJT05fTU9ERToKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5oIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5oCmluZGV4IDE0M2VmYzcuLjBmZDdlZmEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWV0YWRhdGEuaAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1ldGFkYXRhLmgKQEAgLTY0LDcgKzY0LDcgQEAKICAgICB2b2lkIGZpbHRlclVuc3VwcG9ydGVkRmVhdHVyZXMoKTsgLy8gSGlkZSBmZWF0dXJlcyBub3QgeWV0IHN1cHBvcnRlZCBieSBOREsKICAgICB2b2lkIGZpbHRlclN0cmVhbUNvbmZpZ3VyYXRpb25zKCk7IC8vIEhpZGUgaW5wdXQgc3RyZWFtcywgdHJhbnNsYXRlIGhhbCBmb3JtYXQgdG8gTkRLIGZvcm1hdHMKIAotICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBnZXRJbnRlcm5hbERhdGEoKTsKKyAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgZ2V0SW50ZXJuYWxEYXRhKCkgY29uc3Q7CiAKICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJTlRFUk5BTF9ULCB0eXBlbmFtZSBOREtfVD4KICAgICBjYW1lcmFfc3RhdHVzX3QgdXBkYXRlSW1wbCh1aW50MzJfdCB0YWcsIHVpbnQzMl90IGNvdW50LCBjb25zdCBOREtfVCogZGF0YSkgewpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYXB0dXJlUmVxdWVzdC5oIGIvY2FtZXJhL25kay9pbXBsL0FDYXB0dXJlUmVxdWVzdC5oCmluZGV4IGU1YjQ1M2UuLjA2YjJjYzMgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FwdHVyZVJlcXVlc3QuaAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhcHR1cmVSZXF1ZXN0LmgKQEAgLTQ1LDggKzQ1LDE5IEBACiB9OwogCiBzdHJ1Y3QgQUNhcHR1cmVSZXF1ZXN0IHsKKyAgICBjYW1lcmFfc3RhdHVzX3Qgc2V0Q29udGV4dCh2b2lkKiBjdHgpIHsKKyAgICAgICAgY29udGV4dCA9IGN0eDsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfT0s7CisgICAgfQorCisgICAgY2FtZXJhX3N0YXR1c190IGdldENvbnRleHQodm9pZCoqIGN0eCkgY29uc3QgeworICAgICAgICAqY3R4ID0gY29udGV4dDsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfT0s7CisgICAgfQorCiAgICAgQUNhbWVyYU1ldGFkYXRhKiAgICAgIHNldHRpbmdzOwogICAgIEFDYW1lcmFPdXRwdXRUYXJnZXRzKiB0YXJnZXRzOworICAgIHZvaWQqICAgICAgICAgICAgICAgICBjb250ZXh0OwogfTsKIAogI2VuZGlmIC8vIF9BQ0FQVFVSRV9SRVFVRVNUX0gKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaAppbmRleCBkOTZmNTM4Li41MWNlZjhjIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmgKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oCkBAIC0zMyw2ICszMyw3IEBACiAgKiBEbyBub3QgI2luY2x1ZGUgZmlsZXMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgTkRLLgogICovCiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93Lmg+CiAjaW5jbHVkZSAiTmRrQ2FtZXJhRXJyb3IuaCIKQEAgLTU5MSw2ICs1OTIsNTQgQEAKIAogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyNCAqLwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDI4CisKK3R5cGVkZWYgc3RydWN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQ7CisKKy8qKgorICogVXBkYXRlIHNoYXJlZCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQuCisgKgorICogPHA+QSBzaGFyZWQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0IChzZWUge0BsaW5rIEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9jcmVhdGV9KSB0aGF0CisgKiB3YXMgbW9kaWZpZWQgdmlhIGNhbGxzIHRvIHtAbGluayBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfYWRkfSBvcgorICoge0BsaW5rIEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9yZW1vdmV9IG11c3QgYmUgdXBkYXRlZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIGJlZm9yZSBpdHMKKyAqIGNoYW5nZXMgdGFrZSBlZmZlY3QuIEFmdGVyIHRoZSB1cGRhdGUgY2FsbCByZXR1cm5zICB3aXRoIHtAbGluayBBQ0FNRVJBX09LfSwgYW55IG5ld2x5IGFkZGVkCisgKiBuYXRpdmUgd2luZG93cyBjYW4gYmUgdXNlZCBhcyBhIHRhcmdldCBpbiBzdWJzZXF1ZW50IGNhcHR1cmUgcmVxdWVzdHMuPC9wPgorICoKKyAqIDxwPk5hdGl2ZSB3aW5kb3dzIHRoYXQgZ2V0IHJlbW92ZWQgbXVzdCBub3QgYmUgcGFydCBvZiBhbnkgYWN0aXZlIHJlcGVhdGluZyBvciBzaW5nbGUvYnVyc3QKKyAqIHJlcXVlc3Qgb3IgaGF2ZSBhbnkgcGVuZGluZyByZXN1bHRzLiBDb25zaWRlciB1cGRhdGluZyByZXBlYXRpbmcgcmVxdWVzdHMgdmlhCisgKiB7QGxpbmsgQUNhcHR1cmVTZXNzaW9uT3V0cHV0X3NldFJlcGVhdGluZ1JlcXVlc3R9IGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBsYXN0IGZyYW1lIG51bWJlcgorICogd2hlbiB0aGUgc2VxdWVuY2UgY29tcGxldGVzCisgKiB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFjayNvbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZH0uPC9wPgorICoKKyAqIDxwPk5hdGl2ZSB3aW5kb3dzIHRoYXQgZ2V0IGFkZGVkIG11c3Qgbm90IGJlIHBhcnQgb2YgYW55IG90aGVyIHJlZ2lzdGVyZWQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0CisgKiBhbmQgbXVzdCBiZSBjb21wYXRpYmxlLiBDb21wYXRpYmxlIHdpbmRvd3MgbXVzdCBoYXZlIG1hdGNoaW5nIGZvcm1hdCwgcm90YXRpb24gYW5kCisgKiBjb25zdW1lciB1c2FnZS48L3A+CisgKgorICogPHA+QSBzaGFyZWQgQUNhbWVyYUNhcHR1cmVTZXNzaW9uIGNhbiBzdXBwb3J0IHVwIHRvIDQgYWRkaXRpb25hbCBuYXRpdmUgd2luZG93cy48L3A+CisgKgorICogQHBhcmFtIHNlc3Npb24gdGhlIGNhcHR1cmUgc2Vzc2lvbiBvZiBpbnRlcmVzdAorICogQHBhcmFtIG91dHB1dCB0aGUgbW9kaWZpZWQgb3V0cHV0IGNvbmZpZ3VyYXRpb24KKyAqCisgKiBAcmV0dXJuIDx1bD48bGk+CisgKiAgICAgICAgICAgICB7QGxpbmsgQUNBTUVSQV9PS30gaWYgdGhlIG1ldGhvZCBzdWNjZWVkcy48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIHNlc3Npb24gb3Igb3V0cHV0IGlzIE5VTEw7IG9yIG91dHB1dAorICogICAgICAgICAgICAgY29udGFpbnMgaW52YWxpZCBuYXRpdmUgd2luZG93czsgb3IgaWYgYW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBhZGQKKyAqICAgICAgICAgICAgIGEgbmF0aXZlIHdpbmRvdyB0byBhIGRpZmZlcmVudCBvdXRwdXQgY29uZmlndXJhdGlvbjsgb3IgbmV3IG5hdGl2ZSB3aW5kb3cgaXMgbm90CisgKiAgICAgICAgICAgICBjb21wYXRpYmxlOyBvciBhbnkgcmVtb3ZlZCBuYXRpdmUgd2luZG93IHN0aWxsIGhhcyBwZW5kaW5nIHJlcXVlc3RzOzwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTn0gaWYgb3V0cHV0IGNvbmZpZ3VyYXRpb24gaXMgbm90IHNoYXJlZCAoc2VlCisgKiAgICAgICAgICAgICB7QGxpbmsgQUNhcHR1cmVTZXNzaW9uU2hhcmVkT3V0cHV0X2NyZWF0ZX07ICBvciB0aGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwKKyAqICAgICAgICAgICAgIG5hdGl2ZSB3aW5kb3dzIGdvZXMgYmV5b25kIHRoZSBzdXBwb3J0ZWQgbGltaXQuPC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEfSBpZiB0aGUgY2FwdHVyZSBzZXNzaW9uIGhhcyBiZWVuIGNsb3NlZDwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEfSBpZiB0aGUgY2FtZXJhIGRldmljZSBpcyBjbG9zZWQ8L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRX0gaWYgdGhlIGNhbWVyYSBkZXZpY2UgZW5jb3VudGVycyBmYXRhbCBlcnJvcjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRX0gaWYgdGhlIGNhbWVyYSBzZXJ2aWNlIGVuY291bnRlcnMgZmF0YWwKKyAqICAgICAgICAgICAgIGVycm9yPC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX1VOS05PV059IGlmIHRoZSBtZXRob2QgZmFpbHMgZm9yIHNvbWUgb3RoZXIgcmVhc29uczwvbGk+PC91bD4KKyAqLworY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl91cGRhdGVTaGFyZWRPdXRwdXQoQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uLAorICAgICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXQqIG91dHB1dCk7CisjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI4ICovCisKIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvKiBfTkRLX0NBTUVSQV9DQVBUVVJFX1NFU1NJT05fSCAqLwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhRGV2aWNlLmgKaW5kZXggOWI3ZjZmNC4uYjcxNWIxMiAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYURldmljZS5oCkBAIC05MCwxOCArOTAsMTggQEAKIH07CiAKIC8qKgotICogQ2FtZXJhIGRldmljZSBzdGF0ZSBjYWxsYmFja3MgdG8gYmUgdXNlZCBpbiB7QGxpbmsgQUNhbWVyYURldmljZV9zdGF0ZUNhbGxiYWNrc30uCisgKiBDYW1lcmEgZGV2aWNlIHN0YXRlIGNhbGxiYWNrcyB0byBiZSB1c2VkIGluIHtAbGluayBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzfS4KICAqCi0gKiBAcGFyYW0gY29udGV4dCBUaGUgb3B0aW9uYWwgY29udGV4dCBpbiB7QGxpbmsgQUNhbWVyYURldmljZV9zdGF0ZUNhbGxiYWNrc30gd2lsbCBiZQorICogQHBhcmFtIGNvbnRleHQgVGhlIG9wdGlvbmFsIGNvbnRleHQgaW4ge0BsaW5rIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3N9IHdpbGwgYmUKICAqICAgICAgICAgICAgICAgIHBhc3NlZCB0byB0aGlzIGNhbGxiYWNrLgogICogQHBhcmFtIGRldmljZSBUaGUge0BsaW5rIEFDYW1lcmFEZXZpY2V9IHRoYXQgaXMgYmVpbmcgZGlzY29ubmVjdGVkLgogICovCiB0eXBlZGVmIHZvaWQgKCpBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2spKHZvaWQqIGNvbnRleHQsIEFDYW1lcmFEZXZpY2UqIGRldmljZSk7CiAKIC8qKgotICogQ2FtZXJhIGRldmljZSBlcnJvciBzdGF0ZSBjYWxsYmFja3MgdG8gYmUgdXNlZCBpbiB7QGxpbmsgQUNhbWVyYURldmljZV9zdGF0ZUNhbGxiYWNrc30uCisgKiBDYW1lcmEgZGV2aWNlIGVycm9yIHN0YXRlIGNhbGxiYWNrcyB0byBiZSB1c2VkIGluIHtAbGluayBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzfS4KICAqCi0gKiBAcGFyYW0gY29udGV4dCBUaGUgb3B0aW9uYWwgY29udGV4dCBpbiB7QGxpbmsgQUNhbWVyYURldmljZV9zdGF0ZUNhbGxiYWNrc30gd2lsbCBiZQorICogQHBhcmFtIGNvbnRleHQgVGhlIG9wdGlvbmFsIGNvbnRleHQgaW4ge0BsaW5rIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3N9IHdpbGwgYmUKICAqICAgICAgICAgICAgICAgIHBhc3NlZCB0byB0aGlzIGNhbGxiYWNrLgogICogQHBhcmFtIGRldmljZSBUaGUge0BsaW5rIEFDYW1lcmFEZXZpY2V9IHRoYXQgaXMgYmVpbmcgZGlzY29ubmVjdGVkLgogICogQHBhcmFtIGVycm9yIFRoZSBlcnJvciBjb2RlIGRlc2NyaWJlcyB0aGUgY2F1c2Ugb2YgdGhpcyBlcnJvciBjYWxsYmFjay4gU2VlIHRoZSBmb2xvd2luZwpAQCAtMTUwLDcgKzE1MCwxMiBAQAogICAgICAqCiAgICAgICovCiAgICAgQUNhbWVyYURldmljZV9FcnJvclN0YXRlQ2FsbGJhY2sgIG9uRXJyb3I7Ci19IEFDYW1lcmFEZXZpY2Vfc3RhdGVDYWxsYmFja3M7Cit9IEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3M7CisKKy8qKgorICogRm9yIGJhY2t3YXJkIGNvbXBhdGlibGl0eS4KKyAqLwordHlwZWRlZiBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzIEFDYW1lcmFEZXZpY2Vfc3RhdGVDYWxsYmFja3M7CiAKIC8qKgogICogQ2xvc2UgdGhlIGNvbm5lY3Rpb24gYW5kIGZyZWUgdGhpcyBBQ2FtZXJhRGV2aWNlIHN5bmNocm9ub3VzbHkuIEFjY2VzcyB0byB0aGUgQUNhbWVyYURldmljZQpAQCAtMjUxLDYgKzI1Niw3IEBACiAgICAgICogQHNlZSBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0CiAgICAgICovCiAgICAgVEVNUExBVEVfTUFOVUFMID0gNiwKKwogfSBBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGU7CiAKIC8qKgpAQCAtNjYxLDkgKzY2NywxMDIgQEAKIAogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyNCAqLwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDI4CisKKy8qKgorICogQ3JlYXRlIGEgc2hhcmVkIEFDYXB0dXJlU2Vzc2lvbk91dHB1dCBvYmplY3QuCisgKgorICogPHA+VGhlIEFDYXB0dXJlU2Vzc2lvbk91dHB1dCBpcyB1c2VkIGluIHtAbGluayBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkfSBtZXRob2QgdG8gYWRkCisgKiBhbiBvdXRwdXQge0BsaW5rIEFOYXRpdmVXaW5kb3d9IHRvIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lci4gVXNlCisgKiB7QGxpbmsgQUNhcHR1cmVTZXNzaW9uT3V0cHV0X2ZyZWV9IHRvIGZyZWUgdGhlIG9iamVjdCBhbmQgaXRzIG1lbW9yeSBhZnRlciBhcHBsaWNhdGlvbiBubyBsb25nZXIKKyAqIG5lZWRzIHRoZSB7QGxpbmsgQUNhcHR1cmVTZXNzaW9uT3V0cHV0fS4gQSBzaGFyZWQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0IGNhbiBiZSBmdXJ0aGVyIG1vZGlmaWVkCisgKiB2aWEge0BsaW5rIEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9hZGR9IG9yIHtAbGluayBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfcmVtb3ZlfSBhbmQKKyAqIG11c3QgYmUgdXBkYXRlZCB2aWEge0BsaW5rIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl91cGRhdGVTaGFyZWRPdXRwdXR9LjwvcD4KKyAqCisgKiBAcGFyYW0gYW53IHRoZSB7QGxpbmsgQU5hdGl2ZVdpbmRvd30gdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSB7QGxpbmsgQUNhcHR1cmVTZXNzaW9uT3V0cHV0fQorICogQHBhcmFtIG91dHB1dCB0aGUgb3V0cHV0IHtAbGluayBBQ2FwdHVyZVNlc3Npb25PdXRwdXR9IHdpbGwgYmUgc3RvcmVkIGhlcmUgaWYgdGhlCisgKiAgICAgICAgICAgICAgICAgIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy4gVGhlIGNyZWF0ZWQgY29udGFpbmVyIHdpbGwgYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsZWQgaW4gdGhlIG91dHB1dCBhcmd1bWVudC48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIGFudyBvciBvdXRwdXQgaXMgTlVMTC48L2xpPjwvdWw+CisgKgorICogQHNlZSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkCisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfY3JlYXRlKAorICAgICAgICBBTmF0aXZlV2luZG93KiBhbncsIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXRwdXQpOworCisvKioKKyAqIEFkZCBhIG5hdGl2ZSB3aW5kb3cgdG8gc2hhcmVkIEFDYXB0dXJlU2Vzc2lvbk91dHB1dC4KKyAqCisgKiBUaGUgQUNhcHR1cmVTZXNzaW9uT3V0cHV0IG11c3QgYmUgY3JlYXRlZCB2aWEge0BsaW5rIEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9jcmVhdGV9LgorICoKKyAqIEBwYXJhbSBvdXRwdXQgIHRoZSBzaGFyZWQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0IHRvIGJlIGV4dGVuZGVkLgorICogQHBhcmFtIGFudyBUaGUgbmV3IG5hdGl2ZSB3aW5kb3cuCisgKgorICogQHJldHVybiA8dWw+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9PS30gaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgYW53IG9yIG91dHB1dCBpcyBOVUxMOyBvciBvdXRwdXQgaXMgbm90CisgKiAgICAgICAgICAgICBzaGFyZWQgc2VlIHtAbGluayBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfY3JlYXRlfTsgb3IgYW53IG1hdGNoZXMgd2l0aCB0aGUgbmF0aXZlCisgKiAgICAgICAgICAgICB3aW5kb3cgYXNzb2NpYXRlZCB3aXRoIEFDYXB0dXJlU2Vzc2lvbk91dHB1dDsgb3IgYW53IGlzIGFscmVhZHkgcHJlc2VudCBpbnNpZGUKKyAqICAgICAgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dC48L2xpPjwvdWw+CisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfYWRkKEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqb3V0cHV0LCBBTmF0aXZlV2luZG93ICphbncpOworCisvKioKKyAqIFJlbW92ZSBhIG5hdGl2ZSB3aW5kb3cgZnJvbSBzaGFyZWQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0LgorICoKKyAqIEBwYXJhbSBvdXRwdXQgdGhlIHtAbGluayBBQ2FwdHVyZVNlc3Npb25PdXRwdXR9IHRvIGJlIG1vZGlmaWVkLgorICogQHBhcmFtIGFudyBUaGUgbmF0aXZlIHdpbmRvdyB0byBiZSByZW1vdmVkLgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIGFudyBvciBvdXRwdXQgaXMgTlVMTDsgb3Igb3V0cHV0IGlzIG5vdAorICogICAgICAgICAgICAgc2hhcmVkIHNlZSB7QGxpbmsgQUNhcHR1cmVTZXNzaW9uU2hhcmVkT3V0cHV0X2NyZWF0ZX07IG9yIGFudyBtYXRjaGVzIHdpdGggdGhlIG5hdGl2ZQorICogICAgICAgICAgICAgd2luZG93IGFzc29jaWF0ZWQgd2l0aCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQ7IG9yIGFudyBpcyBub3QgcHJlc2VudCBpbnNpZGUKKyAqICAgICAgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dC48L2xpPjwvdWw+CisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfcmVtb3ZlKEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqb3V0cHV0LAorICAgICAgICBBTmF0aXZlV2luZG93KiBhbncpOworCisvKioKKyAqIENyZWF0ZSBhIG5ldyBjYW1lcmEgY2FwdHVyZSBzZXNzaW9uIHNpbWlsYXIgdG8ge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb259LiBUaGlzCisgKiBmdW5jdGlvbiBhbGxvd3MgY2xpZW50cyB0byBwYXNzIGFkZGl0aW9uYWwgc2Vzc2lvbiBwYXJhbWV0ZXJzIGR1cmluZyBzZXNzaW9uIGluaXRpYWxpemF0aW9uLiBGb3IKKyAqIGZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgc2Vzc2lvbiBwYXJhbWV0ZXJzIHNlZSB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9TRVNTSU9OX0tFWVN9LgorICoKKyAqIEBwYXJhbSBkZXZpY2UgdGhlIGNhbWVyYSBkZXZpY2Ugb2YgaW50ZXJlc3QuCisgKiBAcGFyYW0gb3V0cHV0cyB0aGUge0BsaW5rIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcn0gZGVzY3JpYmVzIGFsbCBvdXRwdXQgc3RyZWFtcy4KKyAqIEBwYXJhbSBzZXNzaW9uUGFyYW1ldGVycyBBbiBvcHRpb25hbCBjYXB0dXJlIHJlcXVlc3QgdGhhdCBjb250YWlucyB0aGUgaW5pdGlhbCB2YWx1ZXMgb2Ygc2Vzc2lvbgorICogICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgYWR2ZXJ0aXNlZCBpbgorICogICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1NFU1NJT05fS0VZU30uCisgKiBAcGFyYW0gY2FsbGJhY2tzIHRoZSB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzfQorICogICAgICAgICAgICAgICAgICBjYXB0dXJlIHNlc3Npb24gc3RhdGUgY2FsbGJhY2tzLgorICogQHBhcmFtIHNlc3Npb24gdGhlIGNyZWF0ZWQge0BsaW5rIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbn0gd2lsbCBiZSBmaWxsZWQgaGVyZSBpZiB0aGUgbWV0aG9kIGNhbGwKKyAqICAgICAgICAgICAgICAgIHN1Y2NlZWRzLgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy4gVGhlIGNyZWF0ZWQgY2FwdHVyZSBzZXNzaW9uIHdpbGwgYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsZWQgaW4gc2Vzc2lvbiBhcmd1bWVudC48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIGFueSBvZiBkZXZpY2UsIG91dHB1dHMsIGNhbGxiYWNrcyBvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gaXMgTlVMTC48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRH0gaWYgdGhlIGNhbWVyYSBkZXZpY2UgaXMgY2xvc2VkLjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFfSBpZiB0aGUgY2FtZXJhIGRldmljZSBlbmNvdW50ZXJzIGZhdGFsIGVycm9yLjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRX0gaWYgdGhlIGNhbWVyYSBzZXJ2aWNlIGVuY291bnRlcnMgZmF0YWwgZXJyb3IuCisgKiAgICAgICAgIDwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9VTktOT1dOfSBpZiB0aGUgbWV0aG9kIGZhaWxzIGZvciBzb21lIG90aGVyIHJlYXNvbnMuPC9saT48L3VsPgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbldpdGhTZXNzaW9uUGFyYW1ldGVycygKKyAgICAgICAgQUNhbWVyYURldmljZSogZGV2aWNlLAorICAgICAgICBjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqIG91dHB1dHMsCisgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMsCisgICAgICAgIGNvbnN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2tzLAorICAgICAgICAvKm91dCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiogc2Vzc2lvbik7CisKKyNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjggKi8KKwogX19FTkRfREVDTFMKIAogI2VuZGlmIC8qIF9OREtfQ0FNRVJBX0RFVklDRV9IICovCiAKIC8qKiBAfSAqLwotCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1hbmFnZXIuaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWFuYWdlci5oCmluZGV4IDViNWM5OGIuLmU1YjNhZDggMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWFuYWdlci5oCisrKyBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWFuYWdlci5oCkBAIC0yMzIsMTggKzIzMiwxOCBAQAogICogcHJpb3JpdHkgd2hlbiBhY2Nlc3NpbmcgdGhlIGNhbWVyYSwgYW5kIHRoaXMgbWV0aG9kIHdpbGwgc3VjY2VlZCBldmVuIGlmIHRoZSBjYW1lcmEgZGV2aWNlIGlzCiAgKiBpbiB1c2UgYnkgYW5vdGhlciBjYW1lcmEgQVBJIGNsaWVudC4gQW55IGxvd2VyLXByaW9yaXR5IGFwcGxpY2F0aW9uIHRoYXQgbG9zZXMgY29udHJvbCBvZiB0aGUKICAqIGNhbWVyYSBpbiB0aGlzIHdheSB3aWxsIHJlY2VpdmUgYW4KLSAqIHtAbGluayBBQ2FtZXJhRGV2aWNlX3N0YXRlQ2FsbGJhY2tzI29uRGlzY29ubmVjdGVkfSBjYWxsYmFjay48L3A+CisgKiB7QGxpbmsgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyNvbkRpc2Nvbm5lY3RlZH0gY2FsbGJhY2suPC9wPgogICoKICAqIDxwPk9uY2UgdGhlIGNhbWVyYSBpcyBzdWNjZXNzZnVsbHkgb3BlbmVkLHRoZSBBQ2FtZXJhRGV2aWNlIGNhbiB0aGVuIGJlIHNldCB1cAogICogZm9yIG9wZXJhdGlvbiBieSBjYWxsaW5nIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9ufSBhbmQKICAqIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0fS48L3A+CiAgKgogICogPHA+SWYgdGhlIGNhbWVyYSBiZWNvbWVzIGRpc2Nvbm5lY3RlZCBhZnRlciB0aGlzIGZ1bmN0aW9uIGNhbGwgcmV0dXJucywKLSAqIHtAbGluayBBQ2FtZXJhRGV2aWNlX3N0YXRlQ2FsbGJhY2tzI29uRGlzY29ubmVjdGVkfSB3aXRoIGEKKyAqIHtAbGluayBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzI29uRGlzY29ubmVjdGVkfSB3aXRoIGEKICAqIEFDYW1lcmFEZXZpY2UgaW4gdGhlIGRpc2Nvbm5lY3RlZCBzdGF0ZSB3aWxsIGJlIGNhbGxlZC48L3A+CiAgKgogICogPHA+SWYgdGhlIGNhbWVyYSBydW5zIGludG8gZXJyb3IgYWZ0ZXIgdGhpcyBmdW5jdGlvbiBjYWxsIHJldHVybnMsCi0gKiB7QGxpbmsgQUNhbWVyYURldmljZV9zdGF0ZUNhbGxiYWNrcyNvbkVycm9yfSB3aXRoIGEKKyAqIHtAbGluayBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzI29uRXJyb3J9IHdpdGggYQogICogQUNhbWVyYURldmljZSBpbiB0aGUgZXJyb3Igc3RhdGUgd2lsbCBiZSBjYWxsZWQuPC9wPgogICoKICAqIEBwYXJhbSBtYW5hZ2VyIHRoZSB7QGxpbmsgQUNhbWVyYU1hbmFnZXJ9IG9mIGludGVyZXN0LgpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YVRhZ3MuaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGFUYWdzLmgKaW5kZXggNjI5ZDc1YS4uZWUzZTk4ZSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YVRhZ3MuaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhVGFncy5oCkBAIC02OSw2ICs2OSw4IEBACiAgICAgQUNBTUVSQV9TWU5DLAogICAgIEFDQU1FUkFfUkVQUk9DRVNTLAogICAgIEFDQU1FUkFfREVQVEgsCisgICAgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQSwKKyAgICBBQ0FNRVJBX0RJU1RPUlRJT05fQ09SUkVDVElPTiwKICAgICBBQ0FNRVJBX1NFQ1RJT05fQ09VTlQsCiAKICAgICBBQ0FNRVJBX1ZFTkRPUiA9IDB4ODAwMApAQCAtMTA0LDYgKzEwNiwxMiBAQAogICAgIEFDQU1FUkFfU1lOQ19TVEFSVCAgICAgICAgICAgICA9IEFDQU1FUkFfU1lOQyAgICAgICAgICAgICAgPDwgMTYsCiAgICAgQUNBTUVSQV9SRVBST0NFU1NfU1RBUlQgICAgICAgID0gQUNBTUVSQV9SRVBST0NFU1MgICAgICAgICA8PCAxNiwKICAgICBBQ0FNRVJBX0RFUFRIX1NUQVJUICAgICAgICAgICAgPSBBQ0FNRVJBX0RFUFRIICAgICAgICAgICAgIDw8IDE2LAorICAgIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfU1RBUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgMTYsCisgICAgQUNBTUVSQV9ESVNUT1JUSU9OX0NPUlJFQ1RJT05fU1RBUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBQ0FNRVJBX0RJU1RPUlRJT05fQ09SUkVDVElPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDE2LAogICAgIEFDQU1FUkFfVkVORE9SX1NUQVJUICAgICAgICAgICA9IEFDQU1FUkFfVkVORE9SICAgICAgICAgICAgPDwgMTYKIH0gYWNhbWVyYV9tZXRhZGF0YV9zZWN0aW9uX3N0YXJ0X3Q7CiAKQEAgLTQ3MSwxMCArNDc5LDYgQEAKICAgICAgKiBPdGhlcndpc2Ugd2lsbCBhbHdheXMgYmUgcHJlc2VudC48L3A+CiAgICAgICogPHA+VGhlIG1heGltdW0gbnVtYmVyIG9mIHJlZ2lvbnMgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UgaXMgZGV0ZXJtaW5lZCBieSB0aGUgdmFsdWUKICAgICAgKiBvZiBhbmRyb2lkLmNvbnRyb2wubWF4UmVnaW9uc0FlLjwvcD4KLSAgICAgKiA8cD5UaGUgZGF0YSByZXByZXNlbnRhdGlvbiBpcyBpbnRbNSAqIGFyZWFfY291bnRdLgotICAgICAqIEV2ZXJ5IGZpdmUgZWxlbWVudHMgcmVwcmVzZW50IGEgbWV0ZXJpbmcgcmVnaW9uIG9mICh4bWluLCB5bWluLCB4bWF4LCB5bWF4LCB3ZWlnaHQpLgotICAgICAqIFRoZSByZWN0YW5nbGUgaXMgZGVmaW5lZCB0byBiZSBpbmNsdXNpdmUgb24geG1pbiBhbmQgeW1pbiwgYnV0IGV4Y2x1c2l2ZSBvbiB4bWF4IGFuZAotICAgICAqIHltYXguPC9wPgogICAgICAqIDxwPlRoZSBjb29yZGluYXRlIHN5c3RlbSBpcyBiYXNlZCBvbiB0aGUgYWN0aXZlIHBpeGVsIGFycmF5LAogICAgICAqIHdpdGggKDAsMCkgYmVpbmcgdGhlIHRvcC1sZWZ0IHBpeGVsIGluIHRoZSBhY3RpdmUgcGl4ZWwgYXJyYXksIGFuZAogICAgICAqIChBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFLndpZHRoIC0gMSwKQEAgLTQ5NSw2ICs0OTksMTAgQEAKICAgICAgKiByZWdpb24gYW5kIG91dHB1dCBvbmx5IHRoZSBpbnRlcnNlY3Rpb24gcmVjdGFuZ2xlIGFzIHRoZSBtZXRlcmluZyByZWdpb24gaW4gdGhlIHJlc3VsdAogICAgICAqIG1ldGFkYXRhLiAgSWYgdGhlIHJlZ2lvbiBpcyBlbnRpcmVseSBvdXRzaWRlIHRoZSBjcm9wIHJlZ2lvbiwgaXQgd2lsbCBiZSBpZ25vcmVkIGFuZAogICAgICAqIG5vdCByZXBvcnRlZCBpbiB0aGUgcmVzdWx0IG1ldGFkYXRhLjwvcD4KKyAgICAgKiA8cD5UaGUgZGF0YSByZXByZXNlbnRhdGlvbiBpcyA8Y29kZT5pbnRbNSAqIGFyZWFfY291bnRdPC9jb2RlPi4KKyAgICAgKiBFdmVyeSBmaXZlIGVsZW1lbnRzIHJlcHJlc2VudCBhIG1ldGVyaW5nIHJlZ2lvbiBvZiA8Y29kZT4oeG1pbiwgeW1pbiwgeG1heCwgeW1heCwgd2VpZ2h0KTwvY29kZT4uCisgICAgICogVGhlIHJlY3RhbmdsZSBpcyBkZWZpbmVkIHRvIGJlIGluY2x1c2l2ZSBvbiB4bWluIGFuZCB5bWluLCBidXQgZXhjbHVzaXZlIG9uIHhtYXggYW5kCisgICAgICogeW1heC48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0NBTEVSX0NST1BfUkVHSU9OCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFCkBAIC02MzMsMTAgKzY0MSw2IEBACiAgICAgICogT3RoZXJ3aXNlIHdpbGwgYWx3YXlzIGJlIHByZXNlbnQuPC9wPgogICAgICAqIDxwPlRoZSBtYXhpbXVtIG51bWJlciBvZiBmb2N1cyBhcmVhcyBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSB2YWx1ZQogICAgICAqIG9mIGFuZHJvaWQuY29udHJvbC5tYXhSZWdpb25zQWYuPC9wPgotICAgICAqIDxwPlRoZSBkYXRhIHJlcHJlc2VudGF0aW9uIGlzIGludFs1ICogYXJlYV9jb3VudF0uCi0gICAgICogRXZlcnkgZml2ZSBlbGVtZW50cyByZXByZXNlbnQgYSBtZXRlcmluZyByZWdpb24gb2YgKHhtaW4sIHltaW4sIHhtYXgsIHltYXgsIHdlaWdodCkuCi0gICAgICogVGhlIHJlY3RhbmdsZSBpcyBkZWZpbmVkIHRvIGJlIGluY2x1c2l2ZSBvbiB4bWluIGFuZCB5bWluLCBidXQgZXhjbHVzaXZlIG9uIHhtYXggYW5kCi0gICAgICogeW1heC48L3A+CiAgICAgICogPHA+VGhlIGNvb3JkaW5hdGUgc3lzdGVtIGlzIGJhc2VkIG9uIHRoZSBhY3RpdmUgcGl4ZWwgYXJyYXksCiAgICAgICogd2l0aCAoMCwwKSBiZWluZyB0aGUgdG9wLWxlZnQgcGl4ZWwgaW4gdGhlIGFjdGl2ZSBwaXhlbCBhcnJheSwgYW5kCiAgICAgICogKEFDQU1FUkFfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUud2lkdGggLSAxLApAQCAtNjUxLDEyICs2NTUsMTcgQEAKICAgICAgKiBpcyB1c2VkLCBhbGwgbm9uLXplcm8gd2VpZ2h0cyB3aWxsIGhhdmUgdGhlIHNhbWUgZWZmZWN0LiBBIHJlZ2lvbiB3aXRoIDAgd2VpZ2h0IGlzCiAgICAgICogaWdub3JlZC48L3A+CiAgICAgICogPHA+SWYgYWxsIHJlZ2lvbnMgaGF2ZSAwIHdlaWdodCwgdGhlbiBubyBzcGVjaWZpYyBtZXRlcmluZyBhcmVhIG5lZWRzIHRvIGJlIHVzZWQgYnkgdGhlCi0gICAgICogY2FtZXJhIGRldmljZS48L3A+CisgICAgICogY2FtZXJhIGRldmljZS4gVGhlIGNhcHR1cmUgcmVzdWx0IHdpbGwgZWl0aGVyIGJlIGEgemVybyB3ZWlnaHQgcmVnaW9uIGFzIHdlbGwsIG9yCisgICAgICogdGhlIHJlZ2lvbiBzZWxlY3RlZCBieSB0aGUgY2FtZXJhIGRldmljZSBhcyB0aGUgZm9jdXMgYXJlYSBvZiBpbnRlcmVzdC48L3A+CiAgICAgICogPHA+SWYgdGhlIG1ldGVyaW5nIHJlZ2lvbiBpcyBvdXRzaWRlIHRoZSB1c2VkIEFDQU1FUkFfU0NBTEVSX0NST1BfUkVHSU9OIHJldHVybmVkIGluCiAgICAgICogY2FwdHVyZSByZXN1bHQgbWV0YWRhdGEsIHRoZSBjYW1lcmEgZGV2aWNlIHdpbGwgaWdub3JlIHRoZSBzZWN0aW9ucyBvdXRzaWRlIHRoZSBjcm9wCiAgICAgICogcmVnaW9uIGFuZCBvdXRwdXQgb25seSB0aGUgaW50ZXJzZWN0aW9uIHJlY3RhbmdsZSBhcyB0aGUgbWV0ZXJpbmcgcmVnaW9uIGluIHRoZSByZXN1bHQKICAgICAgKiBtZXRhZGF0YS4gSWYgdGhlIHJlZ2lvbiBpcyBlbnRpcmVseSBvdXRzaWRlIHRoZSBjcm9wIHJlZ2lvbiwgaXQgd2lsbCBiZSBpZ25vcmVkIGFuZAogICAgICAqIG5vdCByZXBvcnRlZCBpbiB0aGUgcmVzdWx0IG1ldGFkYXRhLjwvcD4KKyAgICAgKiA8cD5UaGUgZGF0YSByZXByZXNlbnRhdGlvbiBpcyA8Y29kZT5pbnRbNSAqIGFyZWFfY291bnRdPC9jb2RlPi4KKyAgICAgKiBFdmVyeSBmaXZlIGVsZW1lbnRzIHJlcHJlc2VudCBhIG1ldGVyaW5nIHJlZ2lvbiBvZiA8Y29kZT4oeG1pbiwgeW1pbiwgeG1heCwgeW1heCwgd2VpZ2h0KTwvY29kZT4uCisgICAgICogVGhlIHJlY3RhbmdsZSBpcyBkZWZpbmVkIHRvIGJlIGluY2x1c2l2ZSBvbiB4bWluIGFuZCB5bWluLCBidXQgZXhjbHVzaXZlIG9uIHhtYXggYW5kCisgICAgICogeW1heC48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0NBTEVSX0NST1BfUkVHSU9OCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFCkBAIC03OTEsMTAgKzgwMCw2IEBACiAgICAgICogT3RoZXJ3aXNlIHdpbGwgYWx3YXlzIGJlIHByZXNlbnQuPC9wPgogICAgICAqIDxwPlRoZSBtYXhpbXVtIG51bWJlciBvZiByZWdpb25zIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlIGlzIGRldGVybWluZWQgYnkgdGhlIHZhbHVlCiAgICAgICogb2YgYW5kcm9pZC5jb250cm9sLm1heFJlZ2lvbnNBd2IuPC9wPgotICAgICAqIDxwPlRoZSBkYXRhIHJlcHJlc2VudGF0aW9uIGlzIGludFs1ICogYXJlYV9jb3VudF0uCi0gICAgICogRXZlcnkgZml2ZSBlbGVtZW50cyByZXByZXNlbnQgYSBtZXRlcmluZyByZWdpb24gb2YgKHhtaW4sIHltaW4sIHhtYXgsIHltYXgsIHdlaWdodCkuCi0gICAgICogVGhlIHJlY3RhbmdsZSBpcyBkZWZpbmVkIHRvIGJlIGluY2x1c2l2ZSBvbiB4bWluIGFuZCB5bWluLCBidXQgZXhjbHVzaXZlIG9uIHhtYXggYW5kCi0gICAgICogeW1heC48L3A+CiAgICAgICogPHA+VGhlIGNvb3JkaW5hdGUgc3lzdGVtIGlzIGJhc2VkIG9uIHRoZSBhY3RpdmUgcGl4ZWwgYXJyYXksCiAgICAgICogd2l0aCAoMCwwKSBiZWluZyB0aGUgdG9wLWxlZnQgcGl4ZWwgaW4gdGhlIGFjdGl2ZSBwaXhlbCBhcnJheSwgYW5kCiAgICAgICogKEFDQU1FUkFfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUud2lkdGggLSAxLApAQCAtODE1LDYgKzgyMCwxMCBAQAogICAgICAqIHJlZ2lvbiBhbmQgb3V0cHV0IG9ubHkgdGhlIGludGVyc2VjdGlvbiByZWN0YW5nbGUgYXMgdGhlIG1ldGVyaW5nIHJlZ2lvbiBpbiB0aGUgcmVzdWx0CiAgICAgICogbWV0YWRhdGEuICBJZiB0aGUgcmVnaW9uIGlzIGVudGlyZWx5IG91dHNpZGUgdGhlIGNyb3AgcmVnaW9uLCBpdCB3aWxsIGJlIGlnbm9yZWQgYW5kCiAgICAgICogbm90IHJlcG9ydGVkIGluIHRoZSByZXN1bHQgbWV0YWRhdGEuPC9wPgorICAgICAqIDxwPlRoZSBkYXRhIHJlcHJlc2VudGF0aW9uIGlzIDxjb2RlPmludFs1ICogYXJlYV9jb3VudF08L2NvZGU+LgorICAgICAqIEV2ZXJ5IGZpdmUgZWxlbWVudHMgcmVwcmVzZW50IGEgbWV0ZXJpbmcgcmVnaW9uIG9mIDxjb2RlPih4bWluLCB5bWluLCB4bWF4LCB5bWF4LCB3ZWlnaHQpPC9jb2RlPi4KKyAgICAgKiBUaGUgcmVjdGFuZ2xlIGlzIGRlZmluZWQgdG8gYmUgaW5jbHVzaXZlIG9uIHhtaW4gYW5kIHltaW4sIGJ1dCBleGNsdXNpdmUgb24geG1heCBhbmQKKyAgICAgKiB5bWF4LjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TQ0FMRVJfQ1JPUF9SRUdJT04KICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUKQEAgLTgzNywxMCArODQ2LDEzIEBACiAgICAgICoKICAgICAgKiA8cD5UaGlzIGNvbnRyb2wgKGV4Y2VwdCBmb3IgTUFOVUFMKSBpcyBvbmx5IGVmZmVjdGl2ZSBpZgogICAgICAqIDxjb2RlPkFDQU1FUkFfQ09OVFJPTF9NT0RFICE9IE9GRjwvY29kZT4gYW5kIGFueSAzQSByb3V0aW5lIGlzIGFjdGl2ZS48L3A+Ci0gICAgICogPHA+WkVST19TSFVUVEVSX0xBRyB3aWxsIGJlIHN1cHBvcnRlZCBpZiBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUwotICAgICAqIGNvbnRhaW5zIFBSSVZBVEVfUkVQUk9DRVNTSU5HIG9yIFlVVl9SRVBST0NFU1NJTkcuIE1BTlVBTCB3aWxsIGJlIHN1cHBvcnRlZCBpZgotICAgICAqIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTIGNvbnRhaW5zIE1BTlVBTF9TRU5TT1IuIE90aGVyIGludGVudCB2YWx1ZXMgYXJlCi0gICAgICogYWx3YXlzIHN1cHBvcnRlZC48L3A+CisgICAgICogPHA+QWxsIGludGVudHMgYXJlIHN1cHBvcnRlZCBieSBhbGwgZGV2aWNlcywgZXhjZXB0IHRoYXQ6CisgICAgICogICAqIFpFUk9fU0hVVFRFUl9MQUcgd2lsbCBiZSBzdXBwb3J0ZWQgaWYgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMgY29udGFpbnMKKyAgICAgKiBQUklWQVRFX1JFUFJPQ0VTU0lORyBvciBZVVZfUkVQUk9DRVNTSU5HLgorICAgICAqICAgKiBNQU5VQUwgd2lsbCBiZSBzdXBwb3J0ZWQgaWYgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMgY29udGFpbnMKKyAgICAgKiBNQU5VQUxfU0VOU09SLgorICAgICAqICAgKiBNT1RJT05fVFJBQ0tJTkcgd2lsbCBiZSBzdXBwb3J0ZWQgaWYgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMgY29udGFpbnMKKyAgICAgKiBNT1RJT05fVFJBQ0tJTkcuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX0NPTlRST0xfTU9ERQogICAgICAqIEBzZWUgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMKQEAgLTg4NSwxMSArODk3LDEwIEBACiAgICAgICogPHA+V2hlbiBzZXQgdG8gQVVUTywgdGhlIGluZGl2aWR1YWwgYWxnb3JpdGhtIGNvbnRyb2xzIGluCiAgICAgICogQUNBTUVSQV9DT05UUk9MXyogYXJlIGluIGVmZmVjdCwgc3VjaCBhcyBBQ0FNRVJBX0NPTlRST0xfQUZfTU9ERS48L3A+CiAgICAgICogPHA+V2hlbiBzZXQgdG8gVVNFX1NDRU5FX01PREUsIHRoZSBpbmRpdmlkdWFsIGNvbnRyb2xzIGluCi0gICAgICogQUNBTUVSQV9DT05UUk9MXyogYXJlIG1vc3RseSBkaXNhYmxlZCwgYW5kIHRoZSBjYW1lcmEgZGV2aWNlIGltcGxlbWVudHMKLSAgICAgKiBvbmUgb2YgdGhlIHNjZW5lIG1vZGUgc2V0dGluZ3MgKHN1Y2ggYXMgQUNUSU9OLCBTVU5TRVQsIG9yIFBBUlRZKQotICAgICAqIGFzIGl0IHdpc2hlcy4gVGhlIGNhbWVyYSBkZXZpY2Ugc2NlbmUgbW9kZSAzQSBzZXR0aW5ncyBhcmUgcHJvdmlkZWQgYnkKLSAgICAgKiBjYXB0dXJlIHJlc3VsdHMge0BsaW5rIEFDYW1lcmFNZXRhZGF0YX0gZnJvbQotICAgICAqIHtAbGluayBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdH0uPC9wPgorICAgICAqIEFDQU1FUkFfQ09OVFJPTF8qIGFyZSBtb3N0bHkgZGlzYWJsZWQsIGFuZCB0aGUgY2FtZXJhIGRldmljZQorICAgICAqIGltcGxlbWVudHMgb25lIG9mIHRoZSBzY2VuZSBtb2RlIHNldHRpbmdzIChzdWNoIGFzIEFDVElPTiwKKyAgICAgKiBTVU5TRVQsIG9yIFBBUlRZKSBhcyBpdCB3aXNoZXMuIFRoZSBjYW1lcmEgZGV2aWNlIHNjZW5lIG1vZGUKKyAgICAgKiAzQSBzZXR0aW5ncyBhcmUgcHJvdmlkZWQgYnkge0BsaW5rIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IGNhcHR1cmUgcmVzdWx0c30uPC9wPgogICAgICAqIDxwPldoZW4gc2V0IHRvIE9GRl9LRUVQX1NUQVRFLCBpdCBpcyBzaW1pbGFyIHRvIE9GRiBtb2RlLCB0aGUgb25seSBkaWZmZXJlbmNlCiAgICAgICogaXMgdGhhdCB0aGlzIGZyYW1lIHdpbGwgbm90IGJlIHVzZWQgYnkgY2FtZXJhIGRldmljZSBiYWNrZ3JvdW5kIDNBIHN0YXRpc3RpY3MKICAgICAgKiB1cGRhdGUsIGFzIGlmIHRoaXMgZnJhbWUgaXMgbmV2ZXIgY2FwdHVyZWQuIFRoaXMgbW9kZSBjYW4gYmUgdXNlZCBpbiB0aGUgc2NlbmFyaW8KQEAgLTEwNDMsMjAgKzEwNTQsMTggQEAKICAgICAgKiA8cD5Gb3IgY29uc3RhbnQtZnJhbWVyYXRlIHJlY29yZGluZywgZm9yIGVhY2ggbm9ybWFsCiAgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvbWVkaWEvQ2FtY29yZGVyUHJvZmlsZS5odG1sIj5DYW1jb3JkZXJQcm9maWxlPC9hPiwgdGhhdCBpcywgYQogICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0NhbWNvcmRlclByb2ZpbGUuaHRtbCI+Q2FtY29yZGVyUHJvZmlsZTwvYT4gdGhhdCBoYXMKLSAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9tZWRpYS9DYW1jb3JkZXJQcm9maWxlLmh0bWwjcXVhbGl0eSI+cXVhbGl0eTwvYT4KLSAgICAgKiBpbiB0aGUgcmFuZ2UgWwotICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0NhbWNvcmRlclByb2ZpbGUuaHRtbCNRVUFMSVRZX0xPVyI+UVVBTElUWV9MT1c8L2E+LAotICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0NhbWNvcmRlclByb2ZpbGUuaHRtbCNRVUFMSVRZXzIxNjBQIj5RVUFMSVRZXzIxNjBQPC9hPl0sCi0gICAgICogaWYgdGhlIHByb2ZpbGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UgYW5kIGhhcwotICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0NhbWNvcmRlclByb2ZpbGUuaHRtbCN2aWRlb0ZyYW1lUmF0ZSI+dmlkZW9GcmFtZVJhdGU8L2E+Ci0gICAgICogPGNvZGU+eDwvY29kZT4sIHRoaXMgbGlzdCB3aWxsIGFsd2F5cyBpbmNsdWRlICg8Y29kZT54PC9jb2RlPiw8Y29kZT54PC9jb2RlPikuPC9wPgorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0NhbWNvcmRlclByb2ZpbGUuaHRtbCNxdWFsaXR5Ij5xdWFsaXR5PC9hPiBpbgorICAgICAqIHRoZSByYW5nZSBbPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvbWVkaWEvQ2FtY29yZGVyUHJvZmlsZS5odG1sI1FVQUxJVFlfTE9XIj5RVUFMSVRZX0xPVzwvYT4sCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvbWVkaWEvQ2FtY29yZGVyUHJvZmlsZS5odG1sI1FVQUxJVFlfMjE2MFAiPlFVQUxJVFlfMjE2MFA8L2E+XSwgaWYgdGhlIHByb2ZpbGUgaXMKKyAgICAgKiBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZSBhbmQgaGFzCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvbWVkaWEvQ2FtY29yZGVyUHJvZmlsZS5odG1sI3ZpZGVvRnJhbWVSYXRlIj52aWRlb0ZyYW1lUmF0ZTwvYT4gPGNvZGU+eDwvY29kZT4sIHRoaXMgbGlzdCB3aWxsCisgICAgICogYWx3YXlzIGluY2x1ZGUgKDxjb2RlPng8L2NvZGU+LDxjb2RlPng8L2NvZGU+KS48L3A+CiAgICAgICogPC9saT4KICAgICAgKiA8bGk+CiAgICAgICogPHA+QWxzbywgYSBjYW1lcmEgZGV2aWNlIG11c3QgZWl0aGVyIG5vdCBzdXBwb3J0IGFueQogICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0NhbWNvcmRlclByb2ZpbGUuaHRtbCI+Q2FtY29yZGVyUHJvZmlsZTwvYT4sCiAgICAgICogb3Igc3VwcG9ydCBhdCBsZWFzdCBvbmUKLSAgICAgKiBub3JtYWwgPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvbWVkaWEvQ2FtY29yZGVyUHJvZmlsZS5odG1sIj5DYW1jb3JkZXJQcm9maWxlPC9hPgotICAgICAqIHRoYXQgaGFzCisgICAgICogbm9ybWFsIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0NhbWNvcmRlclByb2ZpbGUuaHRtbCI+Q2FtY29yZGVyUHJvZmlsZTwvYT4gdGhhdCBoYXMKICAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9tZWRpYS9DYW1jb3JkZXJQcm9maWxlLmh0bWwjdmlkZW9GcmFtZVJhdGUiPnZpZGVvRnJhbWVSYXRlPC9hPiA8Y29kZT54PC9jb2RlPiAmZ3Q7PSAyNC48L3A+CiAgICAgICogPC9saT4KICAgICAgKiA8L3VsPgpAQCAtMTI4Miw3ICsxMjkxLDcgQEAKICAgICAgKiA8cD5TdGF0ZSAgICAgICB8IFRyYW5zaXRpb24gQ2F1c2UgfCBOZXcgU3RhdGUgfCBOb3RlcwogICAgICAqIDotLS0tLS0tLS0tLS06fDotLS0tLS0tLS0tLS0tLS0tOnw6LS0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS06CiAgICAgICogSU5BQ1RJVkUgICAgICB8ICAgICAgICAgICAgICAgICAgfCBJTkFDVElWRSAgfCBDYW1lcmEgZGV2aWNlIGF1dG8gZXhwb3N1cmUgYWxnb3JpdGhtIGlzIGRpc2FibGVkPC9wPgotICAgICAqIDxwPldoZW4gQUNBTUVSQV9DT05UUk9MX0FFX01PREUgaXMgQUVfTU9ERV9PTl8qOjwvcD4KKyAgICAgKiA8cD5XaGVuIEFDQU1FUkFfQ09OVFJPTF9BRV9NT0RFIGlzIEFFX01PREVfT04qOjwvcD4KICAgICAgKiA8cD5TdGF0ZSAgICAgICAgfCBUcmFuc2l0aW9uIENhdXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5ldyBTdGF0ZSAgICAgIHwgTm90ZXMKICAgICAgKiA6LS0tLS0tLS0tLS0tLTp8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tLS06fDotLS0tLS0tLS0tLS0tLS0tLToKICAgICAgKiBJTkFDVElWRSAgICAgICB8IENhbWVyYSBkZXZpY2UgaW5pdGlhdGVzIEFFIHNjYW4gICAgICAgICAgICAgIHwgU0VBUkNISU5HICAgICAgfCBWYWx1ZXMgY2hhbmdpbmcKQEAgLTEzMDMsMTAgKzEzMTIsMTMgQEAKICAgICAgKiBMT0NLRUQgICAgICAgICB8IGFlTG9jayBpcyBPTiBhbmQgYWVQcmVjYXB0dXJlVHJpZ2dlciBpcyBDQU5DRUx8IExPQ0tFRCAgICAgICAgfCBQcmVjYXB0dXJlIHRyaWdnZXIgaXMgaWdub3JlZCB3aGVuIEFFIGlzIGFscmVhZHkgbG9ja2VkCiAgICAgICogQW55IHN0YXRlIChleGNsdWRpbmcgTE9DS0VEKSB8IEFDQU1FUkFfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX1RSSUdHRVIgaXMgU1RBUlQgfCBQUkVDQVBUVVJFICAgICB8IFN0YXJ0IEFFIHByZWNhcHR1cmUgbWV0ZXJpbmcgc2VxdWVuY2UKICAgICAgKiBBbnkgc3RhdGUgKGV4Y2x1ZGluZyBMT0NLRUQpIHwgQUNBTUVSQV9DT05UUk9MX0FFX1BSRUNBUFRVUkVfVFJJR0dFUiBpcyBDQU5DRUx8IElOQUNUSVZFICAgICAgIHwgQ3VycmVudGx5IGFjdGl2ZSBwcmVjYXB0dXJlIG1ldGVyaW5nIHNlcXVlbmNlIGlzIGNhbmNlbGVkPC9wPgorICAgICAqIDxwPklmIHRoZSBjYW1lcmEgZGV2aWNlIHN1cHBvcnRzIEFFIGV4dGVybmFsIGZsYXNoIG1vZGUgKE9OX0VYVEVSTkFMX0ZMQVNIIGlzIGluY2x1ZGVkIGluCisgICAgICogQUNBTUVSQV9DT05UUk9MX0FFX0FWQUlMQUJMRV9NT0RFUyksIEFDQU1FUkFfQ09OVFJPTF9BRV9TVEFURSBtdXN0IGJlIEZMQVNIX1JFUVVJUkVEIGFmdGVyCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgZmluaXNoZXMgQUUgc2NhbiBhbmQgaXQncyB0b28gZGFyayB3aXRob3V0IGZsYXNoLjwvcD4KICAgICAgKiA8cD5Gb3IgdGhlIGFib3ZlIHRhYmxlLCB0aGUgY2FtZXJhIGRldmljZSBtYXkgc2tpcCByZXBvcnRpbmcgYW55IHN0YXRlIGNoYW5nZXMgdGhhdCBoYXBwZW4KICAgICAgKiB3aXRob3V0IGFwcGxpY2F0aW9uIGludGVydmVudGlvbiAoaS5lLiBtb2RlIHN3aXRjaCwgdHJpZ2dlciwgbG9ja2luZykuIEFueSBzdGF0ZSB0aGF0CiAgICAgICogY2FuIGJlIHNraXBwZWQgaW4gdGhhdCBtYW5uZXIgaXMgY2FsbGVkIGEgdHJhbnNpZW50IHN0YXRlLjwvcD4KLSAgICAgKiA8cD5Gb3IgZXhhbXBsZSwgZm9yIGFib3ZlIEFFIG1vZGVzIChBRV9NT0RFX09OXyopLCBpbiBhZGRpdGlvbiB0byB0aGUgc3RhdGUgdHJhbnNpdGlvbnMKKyAgICAgKiA8cD5Gb3IgZXhhbXBsZSwgZm9yIGFib3ZlIEFFIG1vZGVzIChBRV9NT0RFX09OKiksIGluIGFkZGl0aW9uIHRvIHRoZSBzdGF0ZSB0cmFuc2l0aW9ucwogICAgICAqIGxpc3RlZCBpbiBhYm92ZSB0YWJsZSwgaXQgaXMgYWxzbyBsZWdhbCBmb3IgdGhlIGNhbWVyYSBkZXZpY2UgdG8gc2tpcCBvbmUgb3IgbW9yZQogICAgICAqIHRyYW5zaWVudCBzdGF0ZXMgYmV0d2VlbiB0d28gcmVzdWx0cy4gU2VlIGJlbG93IHRhYmxlIGZvciBleGFtcGxlczo8L3A+CiAgICAgICogPHA+U3RhdGUgICAgICAgIHwgVHJhbnNpdGlvbiBDYXVzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOZXcgU3RhdGUgICAgICB8IE5vdGVzCkBAIC0xMzE5LDkgKzEzMzEsMTEgQEAKICAgICAgKiBDT05WRVJHRUQgICAgICB8IENhbWVyYSBkZXZpY2UgZmluaXNoZWQgQUUgc2NhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRkxBU0hfUkVRVUlSRUQgfCBDb252ZXJnZWQgYnV0IHRvbyBkYXJrIHcvbyBmbGFzaCBhZnRlciBhIG5ldyBzY2FuLCB0cmFuc2llbnQgc3RhdGVzIGFyZSBza2lwcGVkIGJ5IGNhbWVyYSBkZXZpY2UuCiAgICAgICogRkxBU0hfUkVRVUlSRUQgfCBDYW1lcmEgZGV2aWNlIGZpbmlzaGVkIEFFIHNjYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENPTlZFUkdFRCAgICAgIHwgQ29udmVyZ2VkIGFmdGVyIGEgbmV3IHNjYW4sIHRyYW5zaWVudCBzdGF0ZXMgYXJlIHNraXBwZWQgYnkgY2FtZXJhIGRldmljZS48L3A+CiAgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfQ09OVFJPTF9BRV9BVkFJTEFCTEVfTU9ERVMKICAgICAgKiBAc2VlIEFDQU1FUkFfQ09OVFJPTF9BRV9MT0NLCiAgICAgICogQHNlZSBBQ0FNRVJBX0NPTlRST0xfQUVfTU9ERQogICAgICAqIEBzZWUgQUNBTUVSQV9DT05UUk9MX0FFX1BSRUNBUFRVUkVfVFJJR0dFUgorICAgICAqIEBzZWUgQUNBTUVSQV9DT05UUk9MX0FFX1NUQVRFCiAgICAgICogQHNlZSBBQ0FNRVJBX0NPTlRST0xfTU9ERQogICAgICAqIEBzZWUgQUNBTUVSQV9DT05UUk9MX1NDRU5FX01PREUKICAgICAgKi8KQEAgLTE2MTksMTMgKzE2MzMsMTMgQEAKICAgICAgKiBjb21wYXJlZCB0byBwcmV2aW91cyByZWd1bGFyIHJlcXVlc3RzLiBlbmFibGVac2wgZG9lcyBub3QgYWZmZWN0IHJlcXVlc3RzIHdpdGggb3RoZXIKICAgICAgKiBjYXB0dXJlIGludGVudHMuPC9wPgogICAgICAqIDxwPkZvciBleGFtcGxlLCB3aGVuIHJlcXVlc3RzIGFyZSBzdWJtaXR0ZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKLSAgICAgKiAgIFJlcXVlc3QgQTogZW5hYmxlWnNsIGlzIDxjb2RlPnRydWU8L2NvZGU+LCBBQ0FNRVJBX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlQgaXMgUFJFVklFVwotICAgICAqICAgUmVxdWVzdCBCOiBlbmFibGVac2wgaXMgPGNvZGU+dHJ1ZTwvY29kZT4sIEFDQU1FUkFfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVCBpcyBTVElMTF9DQVBUVVJFPC9wPgorICAgICAqICAgUmVxdWVzdCBBOiBlbmFibGVac2wgaXMgT04sIEFDQU1FUkFfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVCBpcyBQUkVWSUVXCisgICAgICogICBSZXF1ZXN0IEI6IGVuYWJsZVpzbCBpcyBPTiwgQUNBTUVSQV9DT05UUk9MX0NBUFRVUkVfSU5URU5UIGlzIFNUSUxMX0NBUFRVUkU8L3A+CiAgICAgICogPHA+VGhlIG91dHB1dCBpbWFnZXMgZm9yIHJlcXVlc3QgQiBtYXkgaGF2ZSBjb250ZW50cyBjYXB0dXJlZCBiZWZvcmUgdGhlIG91dHB1dCBpbWFnZXMgZm9yCiAgICAgICogcmVxdWVzdCBBLCBhbmQgdGhlIHJlc3VsdCBtZXRhZGF0YSBmb3IgcmVxdWVzdCBCIG1heSBiZSBvbGRlciB0aGFuIHRoZSByZXN1bHQgbWV0YWRhdGEgZm9yCiAgICAgICogcmVxdWVzdCBBLjwvcD4KLSAgICAgKiA8cD5Ob3RlIHRoYXQgd2hlbiBlbmFibGVac2wgaXMgPGNvZGU+dHJ1ZTwvY29kZT4sIGl0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGdldCBvdXRwdXQgaW1hZ2VzIGNhcHR1cmVkIGluIHRoZQotICAgICAqIHBhc3QgZm9yIHJlcXVlc3RzIHdpdGggU1RJTExfQ0FQVFVSRSBjYXB0dXJlIGludGVudC48L3A+CisgICAgICogPHA+Tm90ZSB0aGF0IHdoZW4gZW5hYmxlWnNsIGlzIDxjb2RlPnRydWU8L2NvZGU+LCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBnZXQgb3V0cHV0IGltYWdlcyBjYXB0dXJlZCBpbgorICAgICAqIHRoZSBwYXN0IGZvciByZXF1ZXN0cyB3aXRoIFNUSUxMX0NBUFRVUkUgY2FwdHVyZSBpbnRlbnQuPC9wPgogICAgICAqIDxwPkZvciBhcHBsaWNhdGlvbnMgdGFyZ2V0aW5nIFNESyB2ZXJzaW9ucyBPIGFuZCBuZXdlciwgdGhlIHZhbHVlIG9mIGVuYWJsZVpzbCBpbgogICAgICAqIFRFTVBMQVRFX1NUSUxMX0NBUFRVUkUgdGVtcGxhdGUgbWF5IGJlIDxjb2RlPnRydWU8L2NvZGU+LiBUaGUgdmFsdWUgaW4gb3RoZXIgdGVtcGxhdGVzIGlzIGFsd2F5cwogICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBwcmVzZW50LjwvcD4KQEAgLTE2MzgsNiArMTY1MiwyNiBAQAogICAgICAqLwogICAgIEFDQU1FUkFfQ09OVFJPTF9FTkFCTEVfWlNMID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5dGUgKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2NvbnRyb2xfZW5hYmxlX3pzbF90KQogICAgICAgICAgICAgQUNBTUVSQV9DT05UUk9MX1NUQVJUICsgNDEsCisgICAgLyoqCisgICAgICogPHA+V2hldGhlciBhIHNpZ25pZmljYW50IHNjZW5lIGNoYW5nZSBpcyBkZXRlY3RlZCB3aXRoaW4gdGhlIGN1cnJlbnRseS1zZXQgQUYKKyAgICAgKiByZWdpb24ocykuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfY29udHJvbF9hZl9zY2VuZV9jaGFuZ2VfdCk8L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBjYWxsYmFja3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+V2hlbiB0aGUgY2FtZXJhIGZvY3VzIHJvdXRpbmUgZGV0ZWN0cyBhIGNoYW5nZSBpbiB0aGUgc2NlbmUgaXQgaXMgbG9va2luZyBhdCwKKyAgICAgKiBzdWNoIGFzIGEgbGFyZ2Ugc2hpZnQgaW4gY2FtZXJhIHZpZXdwb2ludCwgc2lnbmlmaWNhbnQgbW90aW9uIGluIHRoZSBzY2VuZSwgb3IgYQorICAgICAqIHNpZ25pZmljYW50IGlsbHVtaW5hdGlvbiBjaGFuZ2UsIHRoaXMgdmFsdWUgd2lsbCBiZSBzZXQgdG8gREVURUNURUQgZm9yIGEgc2luZ2xlIGNhcHR1cmUKKyAgICAgKiByZXN1bHQuIE90aGVyd2lzZSB0aGUgdmFsdWUgd2lsbCBiZSBOT1RfREVURUNURUQuIFRoZSB0aHJlc2hvbGQgZm9yIGRldGVjdGlvbiBpcyBzaW1pbGFyCisgICAgICogdG8gd2hhdCB3b3VsZCB0cmlnZ2VyIGEgbmV3IHBhc3NpdmUgZm9jdXMgc2NhbiB0byBiZWdpbiBpbiBDT05USU5VT1VTIGF1dG9mb2N1cyBtb2Rlcy48L3A+CisgICAgICogPHA+VGhpcyBrZXkgd2lsbCBiZSBhdmFpbGFibGUgaWYgdGhlIGNhbWVyYSBkZXZpY2UgYWR2ZXJ0aXNlcyB0aGlzIGtleSB2aWEge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUkVTVUxUX0tFWVMgfS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9DT05UUk9MX0FGX1NDRU5FX0NIQU5HRSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfY29udHJvbF9hZl9zY2VuZV9jaGFuZ2VfdCkKKyAgICAgICAgICAgIEFDQU1FUkFfQ09OVFJPTF9TVEFSVCArIDQyLAogICAgIEFDQU1FUkFfQ09OVFJPTF9FTkQsCiAKICAgICAvKioKQEAgLTE4NzksOCArMTkxMyw4IEBACiAgICAgICogdGhlIHRodW1ibmFpbCBkYXRhIHdpbGwgYWxzbyBiZSByb3RhdGVkLjwvcD4KICAgICAgKiA8cD5Ob3RlIHRoYXQgdGhpcyBvcmllbnRhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgb3JpZW50YXRpb24gb2YgdGhlIGNhbWVyYSBzZW5zb3IsIGdpdmVuCiAgICAgICogYnkgQUNBTUVSQV9TRU5TT1JfT1JJRU5UQVRJT04uPC9wPgotICAgICAqIDxwPlRvIHRyYW5zbGF0ZSBmcm9tIHRoZSBkZXZpY2Ugb3JpZW50YXRpb24gZ2l2ZW4gYnkgdGhlIEFuZHJvaWQgc2Vuc29yIEFQSXMsIHRoZSBmb2xsb3dpbmcKLSAgICAgKiBzYW1wbGUgY29kZSBtYXkgYmUgdXNlZDo8L3A+CisgICAgICogPHA+VG8gdHJhbnNsYXRlIGZyb20gdGhlIGRldmljZSBvcmllbnRhdGlvbiBnaXZlbiBieSB0aGUgQW5kcm9pZCBzZW5zb3IgQVBJcyBmb3IgY2FtZXJhCisgICAgICogc2Vuc29ycyB3aGljaCBhcmUgbm90IEVYVEVSTkFMLCB0aGUgZm9sbG93aW5nIHNhbXBsZSBjb2RlIG1heSBiZSB1c2VkOjwvcD4KICAgICAgKiA8cHJlPjxjb2RlPnByaXZhdGUgaW50IGdldEpwZWdPcmllbnRhdGlvbihDYW1lcmFDaGFyYWN0ZXJpc3RpY3MgYywgaW50IGRldmljZU9yaWVudGF0aW9uKSB7CiAgICAgICogICAgIGlmIChkZXZpY2VPcmllbnRhdGlvbiA9PSBhbmRyb2lkLnZpZXcuT3JpZW50YXRpb25FdmVudExpc3RlbmVyLk9SSUVOVEFUSU9OX1VOS05PV04pIHJldHVybiAwOwogICAgICAqICAgICBpbnQgc2Vuc29yT3JpZW50YXRpb24gPSBjLmdldChDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuU0VOU09SX09SSUVOVEFUSU9OKTsKQEAgLTE4OTksNiArMTkzMyw4IEBACiAgICAgICogICAgIHJldHVybiBqcGVnT3JpZW50YXRpb247CiAgICAgICogfQogICAgICAqIDwvY29kZT48L3ByZT4KKyAgICAgKiA8cD5Gb3IgRVhURVJOQUwgY2FtZXJhcyB0aGUgc2Vuc29yIG9yaWVudGF0aW9uIHdpbGwgYWx3YXlzIGJlIHNldCB0byAwIGFuZCB0aGUgZmFjaW5nIHdpbGwKKyAgICAgKiBhbHNvIGJlIHNldCB0byBFWFRFUk5BTC4gVGhlIGFib3ZlIGNvZGUgaXMgbm90IHJlbGV2YW50IGluIHN1Y2ggY2FzZS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX09SSUVOVEFUSU9OCiAgICAgICovCkBAIC0xOTU5LDE0ICsxOTk1LDE0IEBACiAgICAgICogPHA+V2hlbiBhbiBBQ0FNRVJBX0pQRUdfT1JJRU5UQVRJT04gb2Ygbm9uLXplcm8gZGVncmVlIGlzIHJlcXVlc3RlZCwKICAgICAgKiB0aGUgY2FtZXJhIGRldmljZSB3aWxsIGhhbmRsZSB0aHVtYm5haWwgcm90YXRpb24gaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgd2F5czo8L3A+CiAgICAgICogPHVsPgotICAgICAqIDxsaT5TZXQgdGhlCi0gICAgICogICA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9tZWRpYS9FeGlmSW50ZXJmYWNlLmh0bWwjVEFHX09SSUVOVEFUSU9OIj5FWElGIG9yaWVudGF0aW9uIGZsYWc8L2E+CisgICAgICogPGxpPlNldCB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvbWVkaWEvRXhpZkludGVyZmFjZS5odG1sI1RBR19PUklFTlRBVElPTiI+RVhJRiBvcmllbnRhdGlvbiBmbGFnPC9hPgogICAgICAqICAgYW5kIGtlZXAganBlZyBhbmQgdGh1bWJuYWlsIGltYWdlIGRhdGEgdW5yb3RhdGVkLjwvbGk+CiAgICAgICogPGxpPlJvdGF0ZSB0aGUganBlZyBhbmQgdGh1bWJuYWlsIGltYWdlIGRhdGEgYW5kIG5vdCBzZXQKLSAgICAgKiAgIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0V4aWZJbnRlcmZhY2UuaHRtbCNUQUdfT1JJRU5UQVRJT04iPkVYSUYgb3JpZW50YXRpb24gZmxhZzwvYT4uCi0gICAgICogICBJbiB0aGlzIGNhc2UsIExJTUlURUQgb3IgRlVMTCBoYXJkd2FyZSBsZXZlbCBkZXZpY2VzIHdpbGwgcmVwb3J0IHJvdGF0ZWQgdGh1bW5haWwgc2l6ZQotICAgICAqICAgaW4gY2FwdHVyZSByZXN1bHQsIHNvIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IHdpbGwgYmUgaW50ZXJjaGFuZ2VkIGlmIDkwIG9yIDI3MCBkZWdyZWUKLSAgICAgKiAgIG9yaWVudGF0aW9uIGlzIHJlcXVlc3RlZC4gTEVHQUNZIGRldmljZSB3aWxsIGFsd2F5cyByZXBvcnQgdW5yb3RhdGVkIHRodW1ibmFpbCBzaXplLjwvbGk+CisgICAgICogICA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9tZWRpYS9FeGlmSW50ZXJmYWNlLmh0bWwjVEFHX09SSUVOVEFUSU9OIj5FWElGIG9yaWVudGF0aW9uIGZsYWc8L2E+LiBJbiB0aGlzCisgICAgICogICBjYXNlLCBMSU1JVEVEIG9yIEZVTEwgaGFyZHdhcmUgbGV2ZWwgZGV2aWNlcyB3aWxsIHJlcG9ydCByb3RhdGVkIHRodW1uYWlsIHNpemUgaW4KKyAgICAgKiAgIGNhcHR1cmUgcmVzdWx0LCBzbyB0aGUgd2lkdGggYW5kIGhlaWdodCB3aWxsIGJlIGludGVyY2hhbmdlZCBpZiA5MCBvciAyNzAgZGVncmVlCisgICAgICogICBvcmllbnRhdGlvbiBpcyByZXF1ZXN0ZWQuIExFR0FDWSBkZXZpY2Ugd2lsbCBhbHdheXMgcmVwb3J0IHVucm90YXRlZCB0aHVtYm5haWwKKyAgICAgKiAgIHNpemUuPC9saT4KICAgICAgKiA8L3VsPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX0pQRUdfT1JJRU5UQVRJT04KQEAgLTIyMTYsMzcgKzIyNTIsMzMgQEAKICAgICAgKiA8L3VsPjwvcD4KICAgICAgKgogICAgICAqIDxwPlRoZSBwb3NpdGlvbiBvZiB0aGUgY2FtZXJhIGRldmljZSdzIGxlbnMgb3B0aWNhbCBjZW50ZXIsCi0gICAgICogYXMgYSB0aHJlZS1kaW1lbnNpb25hbCB2ZWN0b3IgPGNvZGU+KHgseSx6KTwvY29kZT4sIHJlbGF0aXZlIHRvIHRoZQotICAgICAqIG9wdGljYWwgY2VudGVyIG9mIHRoZSBsYXJnZXN0IGNhbWVyYSBkZXZpY2UgZmFjaW5nIGluIHRoZQotICAgICAqIHNhbWUgZGlyZWN0aW9uIGFzIHRoaXMgY2FtZXJhLCBpbiB0aGUKLSAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9TZW5zb3JFdmVudC5odG1sIj5BbmRyb2lkIHNlbnNvciBjb29yZGluYXRlIGF4ZXM8L2E+LgotICAgICAqIE5vdGUgdGhhdCBvbmx5IHRoZSBheGlzIGRlZmluaXRpb25zIGFyZSBzaGFyZWQgd2l0aAotICAgICAqIHRoZSBzZW5zb3IgY29vcmRpbmF0ZSBzeXN0ZW0sIGJ1dCBub3QgdGhlIG9yaWdpbi48L3A+Ci0gICAgICogPHA+SWYgdGhpcyBkZXZpY2UgaXMgdGhlIGxhcmdlc3Qgb3Igb25seSBjYW1lcmEgZGV2aWNlIHdpdGggYQotICAgICAqIGdpdmVuIGZhY2luZywgdGhlbiB0aGlzIHBvc2l0aW9uIHdpbGwgYmUgPGNvZGU+KDAsIDAsIDApPC9jb2RlPjsgYQotICAgICAqIGNhbWVyYSBkZXZpY2Ugd2l0aCBhIGxlbnMgb3B0aWNhbCBjZW50ZXIgbG9jYXRlZCAzIGNtIGZyb20KLSAgICAgKiB0aGUgbWFpbiBzZW5zb3IgYWxvbmcgdGhlICtYIGF4aXMgKHRvIHRoZSByaWdodCBmcm9tIHRoZQotICAgICAqIHVzZXIncyBwZXJzcGVjdGl2ZSkgd2lsbCByZXBvcnQgPGNvZGU+KDAuMDMsIDAsIDApPC9jb2RlPi48L3A+Ci0gICAgICogPHA+VG8gdHJhbnNmb3JtIGEgcGl4ZWwgY29vcmRpbmF0ZXMgYmV0d2VlbiB0d28gY2FtZXJhcwotICAgICAqIGZhY2luZyB0aGUgc2FtZSBkaXJlY3Rpb24sIGZpcnN0IHRoZSBzb3VyY2UgY2FtZXJhCi0gICAgICogQUNBTUVSQV9MRU5TX1JBRElBTF9ESVNUT1JUSU9OIG11c3QgYmUgY29ycmVjdGVkIGZvci4gIFRoZW4KLSAgICAgKiB0aGUgc291cmNlIGNhbWVyYSBBQ0FNRVJBX0xFTlNfSU5UUklOU0lDX0NBTElCUkFUSU9OIG5lZWRzCi0gICAgICogdG8gYmUgYXBwbGllZCwgZm9sbG93ZWQgYnkgdGhlIEFDQU1FUkFfTEVOU19QT1NFX1JPVEFUSU9OCi0gICAgICogb2YgdGhlIHNvdXJjZSBjYW1lcmEsIHRoZSB0cmFuc2xhdGlvbiBvZiB0aGUgc291cmNlIGNhbWVyYQotICAgICAqIHJlbGF0aXZlIHRvIHRoZSBkZXN0aW5hdGlvbiBjYW1lcmEsIHRoZQotICAgICAqIEFDQU1FUkFfTEVOU19QT1NFX1JPVEFUSU9OIG9mIHRoZSBkZXN0aW5hdGlvbiBjYW1lcmEsIGFuZAotICAgICAqIGZpbmFsbHkgdGhlIGludmVyc2Ugb2YgQUNBTUVSQV9MRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTgotICAgICAqIG9mIHRoZSBkZXN0aW5hdGlvbiBjYW1lcmEuIFRoaXMgb2J0YWlucyBhCi0gICAgICogcmFkaWFsLWRpc3RvcnRpb24tZnJlZSBjb29yZGluYXRlIGluIHRoZSBkZXN0aW5hdGlvbgotICAgICAqIGNhbWVyYSBwaXhlbCBjb29yZGluYXRlcy48L3A+Ci0gICAgICogPHA+VG8gY29tcGFyZSB0aGlzIGFnYWluc3QgYSByZWFsIGltYWdlIGZyb20gdGhlIGRlc3RpbmF0aW9uCi0gICAgICogY2FtZXJhLCB0aGUgZGVzdGluYXRpb24gY2FtZXJhIGltYWdlIHRoZW4gbmVlZHMgdG8gYmUKLSAgICAgKiBjb3JyZWN0ZWQgZm9yIHJhZGlhbCBkaXN0b3J0aW9uIGJlZm9yZSBjb21wYXJpc29uIG9yCi0gICAgICogc2FtcGxpbmcuPC9wPgorICAgICAqIGFzIGEgdGhyZWUtZGltZW5zaW9uYWwgdmVjdG9yIDxjb2RlPih4LHkseik8L2NvZGU+LjwvcD4KKyAgICAgKiA8cD5QcmlvciB0byBBbmRyb2lkIFAsIG9yIHdoZW4gQUNBTUVSQV9MRU5TX1BPU0VfUkVGRVJFTkNFIGlzIFBSSU1BUllfQ0FNRVJBLCB0aGlzIHBvc2l0aW9uCisgICAgICogaXMgcmVsYXRpdmUgdG8gdGhlIG9wdGljYWwgY2VudGVyIG9mIHRoZSBsYXJnZXN0IGNhbWVyYSBkZXZpY2UgZmFjaW5nIGluIHRoZSBzYW1lCisgICAgICogZGlyZWN0aW9uIGFzIHRoaXMgY2FtZXJhLCBpbiB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvU2Vuc29yRXZlbnQuaHRtbCI+QW5kcm9pZCBzZW5zb3IKKyAgICAgKiBjb29yZGluYXRlIGF4ZXM8L2E+LiBOb3RlIHRoYXQgb25seSB0aGUgYXhpcyBkZWZpbml0aW9ucyBhcmUgc2hhcmVkIHdpdGggdGhlIHNlbnNvcgorICAgICAqIGNvb3JkaW5hdGUgc3lzdGVtLCBidXQgbm90IHRoZSBvcmlnaW4uPC9wPgorICAgICAqIDxwPklmIHRoaXMgZGV2aWNlIGlzIHRoZSBsYXJnZXN0IG9yIG9ubHkgY2FtZXJhIGRldmljZSB3aXRoIGEgZ2l2ZW4gZmFjaW5nLCB0aGVuIHRoaXMKKyAgICAgKiBwb3NpdGlvbiB3aWxsIGJlIDxjb2RlPigwLCAwLCAwKTwvY29kZT47IGEgY2FtZXJhIGRldmljZSB3aXRoIGEgbGVucyBvcHRpY2FsIGNlbnRlciBsb2NhdGVkIDMgY20KKyAgICAgKiBmcm9tIHRoZSBtYWluIHNlbnNvciBhbG9uZyB0aGUgK1ggYXhpcyAodG8gdGhlIHJpZ2h0IGZyb20gdGhlIHVzZXIncyBwZXJzcGVjdGl2ZSkgd2lsbAorICAgICAqIHJlcG9ydCA8Y29kZT4oMC4wMywgMCwgMCk8L2NvZGU+LjwvcD4KKyAgICAgKiA8cD5UbyB0cmFuc2Zvcm0gYSBwaXhlbCBjb29yZGluYXRlcyBiZXR3ZWVuIHR3byBjYW1lcmFzIGZhY2luZyB0aGUgc2FtZSBkaXJlY3Rpb24sIGZpcnN0CisgICAgICogdGhlIHNvdXJjZSBjYW1lcmEgQUNBTUVSQV9MRU5TX0RJU1RPUlRJT04gbXVzdCBiZSBjb3JyZWN0ZWQgZm9yLiAgVGhlbiB0aGUgc291cmNlCisgICAgICogY2FtZXJhIEFDQU1FUkFfTEVOU19JTlRSSU5TSUNfQ0FMSUJSQVRJT04gbmVlZHMgdG8gYmUgYXBwbGllZCwgZm9sbG93ZWQgYnkgdGhlCisgICAgICogQUNBTUVSQV9MRU5TX1BPU0VfUk9UQVRJT04gb2YgdGhlIHNvdXJjZSBjYW1lcmEsIHRoZSB0cmFuc2xhdGlvbiBvZiB0aGUgc291cmNlIGNhbWVyYQorICAgICAqIHJlbGF0aXZlIHRvIHRoZSBkZXN0aW5hdGlvbiBjYW1lcmEsIHRoZSBBQ0FNRVJBX0xFTlNfUE9TRV9ST1RBVElPTiBvZiB0aGUgZGVzdGluYXRpb24KKyAgICAgKiBjYW1lcmEsIGFuZCBmaW5hbGx5IHRoZSBpbnZlcnNlIG9mIEFDQU1FUkFfTEVOU19JTlRSSU5TSUNfQ0FMSUJSQVRJT04gb2YgdGhlIGRlc3RpbmF0aW9uCisgICAgICogY2FtZXJhLiBUaGlzIG9idGFpbnMgYSByYWRpYWwtZGlzdG9ydGlvbi1mcmVlIGNvb3JkaW5hdGUgaW4gdGhlIGRlc3RpbmF0aW9uIGNhbWVyYSBwaXhlbAorICAgICAqIGNvb3JkaW5hdGVzLjwvcD4KKyAgICAgKiA8cD5UbyBjb21wYXJlIHRoaXMgYWdhaW5zdCBhIHJlYWwgaW1hZ2UgZnJvbSB0aGUgZGVzdGluYXRpb24gY2FtZXJhLCB0aGUgZGVzdGluYXRpb24gY2FtZXJhCisgICAgICogaW1hZ2UgdGhlbiBuZWVkcyB0byBiZSBjb3JyZWN0ZWQgZm9yIHJhZGlhbCBkaXN0b3J0aW9uIGJlZm9yZSBjb21wYXJpc29uIG9yIHNhbXBsaW5nLjwvcD4KKyAgICAgKiA8cD5XaGVuIEFDQU1FUkFfTEVOU19QT1NFX1JFRkVSRU5DRSBpcyBHWVJPU0NPUEUsIHRoZW4gdGhpcyBwb3NpdGlvbiBpcyByZWxhdGl2ZSB0bworICAgICAqIHRoZSBjZW50ZXIgb2YgdGhlIHByaW1hcnkgZ3lyb3Njb3BlIG9uIHRoZSBkZXZpY2UuPC9wPgogICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfRElTVE9SVElPTgogICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfUkVGRVJFTkNFCiAgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfUE9TRV9ST1RBVElPTgotICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1JBRElBTF9ESVNUT1JUSU9OCiAgICAgICovCiAgICAgQUNBTUVSQV9MRU5TX1BPU0VfVFJBTlNMQVRJT04gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxvYXRbM10KICAgICAgICAgICAgIEFDQU1FUkFfTEVOU19TVEFSVCArIDcsCkBAIC0yMzU2LDcgKzIzODgsNyBAQAogICAgICAqIHdoZXJlIDxjb2RlPigwLDApPC9jb2RlPiBpcyB0aGUgdG9wLWxlZnQgb2YgdGhlCiAgICAgICogcHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5U2l6ZSByZWN0YW5nbGUuIE9uY2UgdGhlIHBvc2UgYW5kCiAgICAgICogaW50cmluc2ljIGNhbGlicmF0aW9uIHRyYW5zZm9ybXMgaGF2ZSBiZWVuIGFwcGxpZWQgdG8gYQotICAgICAqIHdvcmxkIHBvaW50LCB0aGVuIHRoZSBBQ0FNRVJBX0xFTlNfUkFESUFMX0RJU1RPUlRJT04KKyAgICAgKiB3b3JsZCBwb2ludCwgdGhlbiB0aGUgQUNBTUVSQV9MRU5TX0RJU1RPUlRJT04KICAgICAgKiB0cmFuc2Zvcm0gbmVlZHMgdG8gYmUgYXBwbGllZCwgYW5kIHRoZSByZXN1bHQgYWRqdXN0ZWQgdG8KICAgICAgKiBiZSBpbiB0aGUgQUNBTUVSQV9TRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRSBjb29yZGluYXRlCiAgICAgICogc3lzdGVtICh3aGVyZSA8Y29kZT4oMCwgMCk8L2NvZGU+IGlzIHRoZSB0b3AtbGVmdCBvZiB0aGUKQEAgLTIzNjQsMTkgKzIzOTYsNDIgQEAKICAgICAgKiBjb29yZGluYXRlIG9mIHRoZSB3b3JsZCBwb2ludCBmb3IgcHJvY2Vzc2VkIChub24tUkFXKQogICAgICAqIG91dHB1dCBidWZmZXJzLjwvcD4KICAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0RJU1RPUlRJT04KICAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19QT1NFX1JPVEFUSU9OCiAgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfUE9TRV9UUkFOU0xBVElPTgotICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1JBRElBTF9ESVNUT1JUSU9OCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX1BSRV9DT1JSRUNUSU9OX0FDVElWRV9BUlJBWV9TSVpFCiAgICAgICovCiAgICAgQUNBTUVSQV9MRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTiA9ICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxvYXRbNV0KICAgICAgICAgICAgIEFDQU1FUkFfTEVOU19TVEFSVCArIDEwLAorICAgIEFDQU1FUkFfTEVOU19SQURJQUxfRElTVE9SVElPTiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlcHJlY2F0ZWQhIERPIE5PVCBVU0UKKyAgICAgICAgICAgIEFDQU1FUkFfTEVOU19TVEFSVCArIDExLAorICAgIC8qKgorICAgICAqIDxwPlRoZSBvcmlnaW4gZm9yIEFDQU1FUkFfTEVOU19QT1NFX1RSQU5TTEFUSU9OLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfVFJBTlNMQVRJT04KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGJ5dGUgKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2xlbnNfcG9zZV9yZWZlcmVuY2VfdCk8L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+RGlmZmVyZW50IGNhbGlicmF0aW9uIG1ldGhvZHMgYW5kIHVzZSBjYXNlcyBjYW4gcHJvZHVjZSBiZXR0ZXIgb3Igd29yc2UgcmVzdWx0cworICAgICAqIGRlcGVuZGluZyBvbiB0aGUgc2VsZWN0ZWQgY29vcmRpbmF0ZSBvcmlnaW4uPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfTEVOU19QT1NFX1JFRkVSRU5DRSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5dGUgKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2xlbnNfcG9zZV9yZWZlcmVuY2VfdCkKKyAgICAgICAgICAgIEFDQU1FUkFfTEVOU19TVEFSVCArIDEyLAogICAgIC8qKgogICAgICAqIDxwPlRoZSBjb3JyZWN0aW9uIGNvZWZmaWNpZW50cyB0byBjb3JyZWN0IGZvciB0aGlzIGNhbWVyYSBkZXZpY2UncwogICAgICAqIHJhZGlhbCBhbmQgdGFuZ2VudGlhbCBsZW5zIGRpc3RvcnRpb24uPC9wPgorICAgICAqIDxwPlJlcGxhY2VzIHRoZSBkZXByZWNhdGVkIEFDQU1FUkFfTEVOU19SQURJQUxfRElTVE9SVElPTiBmaWVsZCwgd2hpY2ggd2FzCisgICAgICogaW5jb25zaXN0ZW50bHkgZGVmaW5lZC48L3A+CiAgICAgICoKLSAgICAgKiA8cD5UeXBlOiBmbG9hdFs2XTwvcD4KKyAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19SQURJQUxfRElTVE9SVElPTgorICAgICAqCisgICAgICogPHA+VHlwZTogZmxvYXRbNV08L3A+CiAgICAgICoKICAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgogICAgICAqIDx1bD4KQEAgLTIzODQsMTMgKzI0MzksMTMgQEAKICAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBjYWxsYmFja3M8L2xpPgogICAgICAqIDwvdWw+PC9wPgogICAgICAqCi0gICAgICogPHA+Rm91ciByYWRpYWwgZGlzdG9ydGlvbiBjb2VmZmljaWVudHMgPGNvZGU+W2thcHBhXzAsIGthcHBhXzEsIGthcHBhXzIsCisgICAgICogPHA+VGhyZWUgcmFkaWFsIGRpc3RvcnRpb24gY29lZmZpY2llbnRzIDxjb2RlPltrYXBwYV8xLCBrYXBwYV8yLAogICAgICAqIGthcHBhXzNdPC9jb2RlPiBhbmQgdHdvIHRhbmdlbnRpYWwgZGlzdG9ydGlvbiBjb2VmZmljaWVudHMKICAgICAgKiA8Y29kZT5ba2FwcGFfNCwga2FwcGFfNV08L2NvZGU+IHRoYXQgY2FuIGJlIHVzZWQgdG8gY29ycmVjdCB0aGUKICAgICAgKiBsZW5zJ3MgZ2VvbWV0cmljIGRpc3RvcnRpb24gd2l0aCB0aGUgbWFwcGluZyBlcXVhdGlvbnM6PC9wPgotICAgICAqIDxwcmU+PGNvZGU+IHhfYyA9IHhfaSAqICgga2FwcGFfMCArIGthcHBhXzEgKiByXjIgKyBrYXBwYV8yICogcl40ICsga2FwcGFfMyAqIHJeNiApICsKKyAgICAgKiA8cHJlPjxjb2RlPiB4X2MgPSB4X2kgKiAoIDEgKyBrYXBwYV8xICogcl4yICsga2FwcGFfMiAqIHJeNCArIGthcHBhXzMgKiByXjYgKSArCiAgICAgICogICAgICAgIGthcHBhXzQgKiAoMiAqIHhfaSAqIHlfaSkgKyBrYXBwYV81ICogKCByXjIgKyAyICogeF9pXjIgKQotICAgICAqICB5X2MgPSB5X2kgKiAoIGthcHBhXzAgKyBrYXBwYV8xICogcl4yICsga2FwcGFfMiAqIHJeNCArIGthcHBhXzMgKiByXjYgKSArCisgICAgICogIHlfYyA9IHlfaSAqICggMSArIGthcHBhXzEgKiByXjIgKyBrYXBwYV8yICogcl40ICsga2FwcGFfMyAqIHJeNiApICsKICAgICAgKiAgICAgICAga2FwcGFfNSAqICgyICogeF9pICogeV9pKSArIGthcHBhXzQgKiAoIHJeMiArIDIgKiB5X2leMiApCiAgICAgICogPC9jb2RlPjwvcHJlPgogICAgICAqIDxwPkhlcmUsIDxjb2RlPlt4X2MsIHlfY108L2NvZGU+IGFyZSB0aGUgY29vcmRpbmF0ZXMgdG8gc2FtcGxlIGluIHRoZQpAQCAtMjM5OCwyMyArMjQ1MywyMSBAQAogICAgICAqIGNvcnJlY3RlZCBpbWFnZSBhdCB0aGUgY29vcmRpbmF0ZSA8Y29kZT5beF9pLCB5X2ldPC9jb2RlPjo8L3A+CiAgICAgICogPHByZT48Y29kZT4gY29ycmVjdGVkSW1hZ2UoeF9pLCB5X2kpID0gc2FtcGxlX2F0KHhfYywgeV9jLCBpbnB1dEltYWdlKQogICAgICAqIDwvY29kZT48L3ByZT4KLSAgICAgKiA8cD5UaGUgcGl4ZWwgY29vcmRpbmF0ZXMgYXJlIGRlZmluZWQgaW4gYSBub3JtYWxpemVkCi0gICAgICogY29vcmRpbmF0ZSBzeXN0ZW0gcmVsYXRlZCB0byB0aGUKLSAgICAgKiBBQ0FNRVJBX0xFTlNfSU5UUklOU0lDX0NBTElCUkFUSU9OIGNhbGlicmF0aW9uIGZpZWxkcy4KLSAgICAgKiBCb3RoIDxjb2RlPlt4X2ksIHlfaV08L2NvZGU+IGFuZCA8Y29kZT5beF9jLCB5X2NdPC9jb2RlPiBoYXZlIDxjb2RlPigwLDApPC9jb2RlPiBhdCB0aGUKLSAgICAgKiBsZW5zIG9wdGljYWwgY2VudGVyIDxjb2RlPltjX3gsIGNfeV08L2NvZGU+LiBUaGUgbWF4aW11bSBtYWduaXR1ZGVzCi0gICAgICogb2YgYm90aCB4IGFuZCB5IGNvb3JkaW5hdGVzIGFyZSBub3JtYWxpemVkIHRvIGJlIDEgYXQgdGhlCi0gICAgICogZWRnZSBmdXJ0aGVyIGZyb20gdGhlIG9wdGljYWwgY2VudGVyLCBzbyB0aGUgcmFuZ2UKLSAgICAgKiBmb3IgYm90aCBkaW1lbnNpb25zIGlzIDxjb2RlPi0xICZsdDs9IHggJmx0Oz0gMTwvY29kZT4uPC9wPgorICAgICAqIDxwPlRoZSBwaXhlbCBjb29yZGluYXRlcyBhcmUgZGVmaW5lZCBpbiBhIGNvb3JkaW5hdGUgc3lzdGVtCisgICAgICogcmVsYXRlZCB0byB0aGUgQUNBTUVSQV9MRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTgorICAgICAqIGNhbGlicmF0aW9uIGZpZWxkczsgc2VlIHRoYXQgZW50cnkgZm9yIGRldGFpbHMgb2YgdGhlIG1hcHBpbmcgc3RhZ2VzLgorICAgICAqIEJvdGggPGNvZGU+W3hfaSwgeV9pXTwvY29kZT4gYW5kIDxjb2RlPlt4X2MsIHlfY108L2NvZGU+CisgICAgICogaGF2ZSA8Y29kZT4oMCwwKTwvY29kZT4gYXQgdGhlIGxlbnMgb3B0aWNhbCBjZW50ZXIgPGNvZGU+W2NfeCwgY195XTwvY29kZT4sIGFuZAorICAgICAqIHRoZSByYW5nZSBvZiB0aGUgY29vcmRpbmF0ZXMgZGVwZW5kcyBvbiB0aGUgZm9jYWwgbGVuZ3RoCisgICAgICogdGVybXMgb2YgdGhlIGludHJpbnNpYyBjYWxpYnJhdGlvbi48L3A+CiAgICAgICogPHA+RmluYWxseSwgPGNvZGU+cjwvY29kZT4gcmVwcmVzZW50cyB0aGUgcmFkaWFsIGRpc3RhbmNlIGZyb20gdGhlCi0gICAgICogb3B0aWNhbCBjZW50ZXIsIDxjb2RlPnJeMiA9IHhfaV4yICsgeV9pXjI8L2NvZGU+LCBhbmQgaXRzIG1hZ25pdHVkZQotICAgICAqIGlzIHRoZXJlZm9yZSBubyBsYXJnZXIgdGhhbiA8Y29kZT58cnwgJmx0Oz0gc3FydCgyKTwvY29kZT4uPC9wPgorICAgICAqIG9wdGljYWwgY2VudGVyLCA8Y29kZT5yXjIgPSB4X2leMiArIHlfaV4yPC9jb2RlPi48L3A+CiAgICAgICogPHA+VGhlIGRpc3RvcnRpb24gbW9kZWwgdXNlZCBpcyB0aGUgQnJvd24tQ29ucmFkeSBtb2RlbC48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19JTlRSSU5TSUNfQ0FMSUJSQVRJT04KICAgICAgKi8KLSAgICBBQ0FNRVJBX0xFTlNfUkFESUFMX0RJU1RPUlRJT04gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmbG9hdFs2XQotICAgICAgICAgICAgQUNBTUVSQV9MRU5TX1NUQVJUICsgMTEsCisgICAgQUNBTUVSQV9MRU5TX0RJU1RPUlRJT04gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxvYXRbNV0KKyAgICAgICAgICAgIEFDQU1FUkFfTEVOU19TVEFSVCArIDEzLAogICAgIEFDQU1FUkFfTEVOU19FTkQsCiAKICAgICAvKioKQEAgLTI2NjIsMTEgKzI3MTUsMTIgQEAKICAgICAgKiBpbnRvIHRoZSAzIHN0cmVhbSB0eXBlcyBhcyBiZWxvdzo8L3A+CiAgICAgICogPHVsPgogICAgICAqIDxsaT5Qcm9jZXNzZWQgKGJ1dCBzdGFsbGluZyk6IGFueSBub24tUkFXIGZvcm1hdCB3aXRoIGEgc3RhbGxEdXJhdGlvbnMgJmd0OyAwLgotICAgICAqICAgVHlwaWNhbGx5IHtAbGluayBBSU1BR0VfRk9STUFUX0pQRUd9IGZvcm1hdC48L2xpPgotICAgICAqIDxsaT5SYXcgZm9ybWF0czoge0BsaW5rIEFJTUFHRV9GT1JNQVRfUkFXMTZ9LCB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9SQVcxMH0sIG9yCi0gICAgICogICB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9SQVcxMn0uPC9saT4KLSAgICAgKiA8bGk+UHJvY2Vzc2VkIChidXQgbm90LXN0YWxsaW5nKTogYW55IG5vbi1SQVcgZm9ybWF0IHdpdGhvdXQgYSBzdGFsbCBkdXJhdGlvbi4KLSAgICAgKiAgIFR5cGljYWxseSB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9ZVVZfNDIwXzg4OH0uPC9saT4KKyAgICAgKiAgIFR5cGljYWxseSB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9KUEVHIEpQRUcgZm9ybWF0fS48L2xpPgorICAgICAqIDxsaT5SYXcgZm9ybWF0czoge0BsaW5rIEFJTUFHRV9GT1JNQVRfUkFXMTYgUkFXX1NFTlNPUn0sIHtAbGluayBBSU1BR0VfRk9STUFUX1JBVzEwIFJBVzEwfSwgb3IKKyAgICAgKiAgIHtAbGluayBBSU1BR0VfRk9STUFUX1JBVzEyIFJBVzEyfS48L2xpPgorICAgICAqIDxsaT5Qcm9jZXNzZWQgKGJ1dCBub3Qtc3RhbGxpbmcpOiBhbnkgbm9uLVJBVyBmb3JtYXQgd2l0aG91dCBhIHN0YWxsIGR1cmF0aW9uLiAgVHlwaWNhbGx5CisgICAgICogICB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9ZVVZfNDIwXzg4OCBZVVZfNDIwXzg4OH0sCisgICAgICogICA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9ncmFwaGljcy9JbWFnZUZvcm1hdC5odG1sI05WMjEiPk5WMjE8L2E+LCBvciA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9ncmFwaGljcy9JbWFnZUZvcm1hdC5odG1sI1lWMTIiPllWMTI8L2E+LjwvbGk+CiAgICAgICogPC91bD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUwpAQCAtMjc4Nyw3ICsyODQxLDcgQEAKICAgICAgICAgICAgIEFDQU1FUkFfUkVRVUVTVF9TVEFSVCArIDEyLAogICAgIC8qKgogICAgICAqIDxwPkEgbGlzdCBvZiBhbGwga2V5cyB0aGF0IHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBhdmFpbGFibGUKLSAgICAgKiB0byB1c2Ugd2l0aCB7QGxpbmsgQUNhcHR1cmVSZXF1ZXN0fS48L3A+CisgICAgICogdG8gdXNlIHdpdGgge0BsaW5rIEFDYXB0dXJlUmVxdWVzdCB9LjwvcD4KICAgICAgKgogICAgICAqIDxwPlR5cGU6IGludDMyW25dPC9wPgogICAgICAqCkBAIC0yODA5LDkgKzI4NjMsNyBAQAogICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUkVRVUVTVF9LRVlTID0gICAgICAgICAgICAgICAgICAgIC8vIGludDMyW25dCiAgICAgICAgICAgICBBQ0FNRVJBX1JFUVVFU1RfU1RBUlQgKyAxMywKICAgICAvKioKLSAgICAgKiA8cD5BIGxpc3Qgb2YgYWxsIGtleXMgdGhhdCB0aGUgY2FtZXJhIGRldmljZSBoYXMgYXZhaWxhYmxlCi0gICAgICogdG8gcXVlcnkgd2l0aCB7QGxpbmsgQUNhbWVyYU1ldGFkYXRhfSBmcm9tCi0gICAgICoge0BsaW5rIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0fS48L3A+CisgICAgICogPHA+QSBsaXN0IG9mIGFsbCBrZXlzIHRoYXQgdGhlIGNhbWVyYSBkZXZpY2UgaGFzIGF2YWlsYWJsZSB0byB1c2Ugd2l0aCB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgfS48L3A+CiAgICAgICoKICAgICAgKiA8cD5UeXBlOiBpbnQzMltuXTwvcD4KICAgICAgKgpAQCAtMjg0Miw5ICsyODk0LDcgQEAKICAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1JFU1VMVF9LRVlTID0gICAgICAgICAgICAgICAgICAgICAvLyBpbnQzMltuXQogICAgICAgICAgICAgQUNBTUVSQV9SRVFVRVNUX1NUQVJUICsgMTQsCiAgICAgLyoqCi0gICAgICogPHA+QSBsaXN0IG9mIGFsbCBrZXlzIHRoYXQgdGhlIGNhbWVyYSBkZXZpY2UgaGFzIGF2YWlsYWJsZQotICAgICAqIHRvIHF1ZXJ5IHdpdGgge0BsaW5rIEFDYW1lcmFNZXRhZGF0YX0gZnJvbQotICAgICAqIHtAbGluayBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3N9LjwvcD4KKyAgICAgKiA8cD5BIGxpc3Qgb2YgYWxsIGtleXMgdGhhdCB0aGUgY2FtZXJhIGRldmljZSBoYXMgYXZhaWxhYmxlIHRvIHVzZSB3aXRoIHtAbGluayBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MgfS48L3A+CiAgICAgICoKICAgICAgKiA8cD5UeXBlOiBpbnQzMltuXTwvcD4KICAgICAgKgpAQCAtMjg2Miw2ICsyOTEyLDU5IEBACiAgICAgICovCiAgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUyA9ICAgICAgICAgICAgLy8gaW50MzJbbl0KICAgICAgICAgICAgIEFDQU1FUkFfUkVRVUVTVF9TVEFSVCArIDE1LAorICAgIC8qKgorICAgICAqIDxwPkEgc3Vic2V0IG9mIHRoZSBhdmFpbGFibGUgcmVxdWVzdCBrZXlzIHRoYXQgdGhlIGNhbWVyYSBkZXZpY2UKKyAgICAgKiBjYW4gcGFzcyBhcyBwYXJ0IG9mIHRoZSBjYXB0dXJlIHNlc3Npb24gaW5pdGlhbGl6YXRpb24uPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogaW50MzJbbl08L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyBpcyBhIHN1YnNldCBvZiBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1JFUVVFU1RfS0VZUyB3aGljaAorICAgICAqIGNvbnRhaW5zIGEgbGlzdCBvZiBrZXlzIHRoYXQgYXJlIGRpZmZpY3VsdCB0byBhcHBseSBwZXItZnJhbWUgYW5kCisgICAgICogY2FuIHJlc3VsdCBpbiB1bmV4cGVjdGVkIGRlbGF5cyB3aGVuIG1vZGlmaWVkIGR1cmluZyB0aGUgY2FwdHVyZSBzZXNzaW9uCisgICAgICogbGlmZXRpbWUuIFR5cGljYWwgZXhhbXBsZXMgaW5jbHVkZSBwYXJhbWV0ZXJzIHRoYXQgcmVxdWlyZSBhCisgICAgICogdGltZS1jb25zdW1pbmcgaGFyZHdhcmUgcmUtY29uZmlndXJhdGlvbiBvciBpbnRlcm5hbCBjYW1lcmEgcGlwZWxpbmUKKyAgICAgKiBjaGFuZ2UuIEZvciBwZXJmb3JtYW5jZSByZWFzb25zIHdlIGFkdmlzZSBjbGllbnRzIHRvIHBhc3MgdGhlaXIgaW5pdGlhbAorICAgICAqIHZhbHVlcyBhcyBwYXJ0IG9mCisgICAgICoge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb25XaXRoU2Vzc2lvblBhcmFtZXRlcnMgfS4KKyAgICAgKiBPbmNlIHRoZSBjYW1lcmEgY2FwdHVyZSBzZXNzaW9uIGlzIGVuYWJsZWQgaXQgaXMgYWxzbyByZWNvbW1lbmRlZCB0byBhdm9pZAorICAgICAqIGNoYW5naW5nIHRoZW0gZnJvbSB0aGVpciBpbml0aWFsIHZhbHVlcyBzZXQgaW4KKyAgICAgKiB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbldpdGhTZXNzaW9uUGFyYW1ldGVycyB9LgorICAgICAqIENvbnRyb2wgb3ZlciBzZXNzaW9uIHBhcmFtZXRlcnMgY2FuIHN0aWxsIGJlIGV4ZXJ0ZWQgaW4gY2FwdHVyZSByZXF1ZXN0cworICAgICAqIGJ1dCBjbGllbnRzIHNob3VsZCBiZSBhd2FyZSBhbmQgZXhwZWN0IGRlbGF5cyBkdXJpbmcgdGhlaXIgYXBwbGljYXRpb24uCisgICAgICogQW4gZXhhbXBsZSB1c2FnZSBzY2VuYXJpbyBjb3VsZCBsb29rIGxpa2UgdGhpczo8L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT5UaGUgY2FtZXJhIGNsaWVudCBzdGFydHMgYnkgcXVlcmluZyB0aGUgc2Vzc2lvbiBwYXJhbWV0ZXIga2V5IGxpc3QgdmlhCisgICAgICogICB7QGxpbmsgQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzIH0uPC9saT4KKyAgICAgKiA8bGk+QmVmb3JlIHRyaWdnZXJpbmcgdGhlIGNhcHR1cmUgc2Vzc2lvbiBjcmVhdGUgc2VxdWVuY2UsIGEgY2FwdHVyZSByZXF1ZXN0CisgICAgICogICBtdXN0IGJlIGJ1aWx0IHZpYQorICAgICAqICAge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3QgfQorICAgICAqICAgdXNpbmcgYW4gYXBwcm9wcmlhdGUgdGVtcGxhdGUgbWF0Y2hpbmcgdGhlIHBhcnRpY3VsYXIgdXNlIGNhc2UuPC9saT4KKyAgICAgKiA8bGk+VGhlIGNsaWVudCBzaG91bGQgZ28gb3ZlciB0aGUgbGlzdCBvZiBzZXNzaW9uIHBhcmFtZXRlcnMgYW5kIGNoZWNrCisgICAgICogICB3aGV0aGVyIHNvbWUgb2YgdGhlIGtleXMgbGlzdGVkIG1hdGNoZXMgd2l0aCB0aGUgcGFyYW1ldGVycyB0aGF0CisgICAgICogICB0aGV5IGludGVuZCB0byBtb2RpZnkgYXMgcGFydCBvZiB0aGUgZmlyc3QgY2FwdHVyZSByZXF1ZXN0LjwvbGk+CisgICAgICogPGxpPklmIHRoZXJlIGlzIG5vIHN1Y2ggbWF0Y2gsIHRoZSBjYXB0dXJlIHJlcXVlc3QgY2FuIGJlICBwYXNzZWQKKyAgICAgKiAgIHVubW9kaWZpZWQgdG8KKyAgICAgKiAgIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9uV2l0aFNlc3Npb25QYXJhbWV0ZXJzIH0uPC9saT4KKyAgICAgKiA8bGk+SWYgbWF0Y2hlcyBkbyBleGlzdCwgdGhlIGNsaWVudCBzaG91bGQgdXBkYXRlIHRoZSByZXNwZWN0aXZlIHZhbHVlcworICAgICAqICAgYW5kIHBhc3MgdGhlIHJlcXVlc3QgdG8KKyAgICAgKiAgIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9uV2l0aFNlc3Npb25QYXJhbWV0ZXJzIH0uPC9saT4KKyAgICAgKiA8bGk+QWZ0ZXIgdGhlIGNhcHR1cmUgc2Vzc2lvbiBpbml0aWFsaXphdGlvbiBjb21wbGV0ZXMgdGhlIHNlc3Npb24gcGFyYW1ldGVyCisgICAgICogICBrZXkgbGlzdCBjYW4gY29udGludWUgdG8gc2VydmUgYXMgcmVmZXJlbmNlIHdoZW4gcG9zdGluZyBvciB1cGRhdGluZworICAgICAqICAgZnVydGhlciByZXF1ZXN0cy4gQXMgbWVudGlvbmVkIGFib3ZlIGZ1cnRoZXIgY2hhbmdlcyB0byBzZXNzaW9uCisgICAgICogICBwYXJhbWV0ZXJzIHNob3VsZCBpZGVhbGx5IGJlIGF2b2lkZWQsIGlmIHVwZGF0ZXMgYXJlIG5lY2Vzc2FyeQorICAgICAqICAgaG93ZXZlciBjbGllbnRzIGNvdWxkIGV4cGVjdCBhIGRlbGF5L2dsaXRjaCBkdXJpbmcgdGhlCisgICAgICogICBwYXJhbWV0ZXIgc3dpdGNoLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9SRVFVRVNUX0tFWVMKKyAgICAgKi8KKyAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1NFU1NJT05fS0VZUyA9ICAgICAgICAgICAgICAgICAgICAvLyBpbnQzMltuXQorICAgICAgICAgICAgQUNBTUVSQV9SRVFVRVNUX1NUQVJUICsgMTYsCiAgICAgQUNBTUVSQV9SRVFVRVNUX0VORCwKIAogICAgIC8qKgpAQCAtMjg3Niw3ICsyOTc5LDYgQEAKICAgICAgKiA8L3VsPjwvcD4KICAgICAgKgogICAgICAqIDxwPlRoaXMgY29udHJvbCBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgZGlnaXRhbCB6b29tLjwvcD4KLSAgICAgKiA8cD5UaGUgZGF0YSByZXByZXNlbnRhdGlvbiBpcyBpbnRbNF0sIHdoaWNoIG1hcHMgdG8gKGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCkuPC9wPgogICAgICAqIDxwPlRoZSBjcm9wIHJlZ2lvbiBjb29yZGluYXRlIHN5c3RlbSBpcyBiYXNlZCBvZmYKICAgICAgKiBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFLCB3aXRoIDxjb2RlPigwLCAwKTwvY29kZT4gYmVpbmcgdGhlCiAgICAgICogdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBzZW5zb3IgYWN0aXZlIGFycmF5LjwvcD4KQEAgLTI5MDYsNiArMzAwOCw3IEBACiAgICAgICogZm9yIHJvdW5kaW5nIGFuZCBvdGhlciBoYXJkd2FyZSByZXF1aXJlbWVudHM7IHRoZSBmaW5hbAogICAgICAqIGNyb3AgcmVnaW9uIHVzZWQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGNhcHR1cmUKICAgICAgKiByZXN1bHQuPC9wPgorICAgICAqIDxwPlRoZSBkYXRhIHJlcHJlc2VudGF0aW9uIGlzIGludFs0XSwgd2hpY2ggbWFwcyB0byAobGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9NQVhfRElHSVRBTF9aT09NCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFCkBAIC0zMDYxLDEzICszMTY0LDE0IEBACiAgICAgICogaWdub3JlZCkuPC9wPgogICAgICAqIDxwPlRoZSBmb2xsb3dpbmcgZm9ybWF0cyBtYXkgYWx3YXlzIGhhdmUgYSBzdGFsbCBkdXJhdGlvbjo8L3A+CiAgICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgQUlNQUdFX0ZPUk1BVF9KUEVHfTwvbGk+Ci0gICAgICogPGxpPntAbGluayBBSU1BR0VfRk9STUFUX1JBVzE2fTwvbGk+CisgICAgICogPGxpPntAbGluayBBSU1BR0VfRk9STUFUX0pQRUcgfTwvbGk+CisgICAgICogPGxpPntAbGluayBBSU1BR0VfRk9STUFUX1JBVzE2IH08L2xpPgogICAgICAqIDwvdWw+CiAgICAgICogPHA+VGhlIGZvbGxvd2luZyBmb3JtYXRzIHdpbGwgbmV2ZXIgaGF2ZSBhIHN0YWxsIGR1cmF0aW9uOjwvcD4KICAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4fTwvbGk+Ci0gICAgICogPGxpPntAbGluayBBSU1BR0VfRk9STUFUX1JBVzEwfTwvbGk+CisgICAgICogPGxpPntAbGluayBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4IH08L2xpPgorICAgICAqIDxsaT57QGxpbmsgQUlNQUdFX0ZPUk1BVF9SQVcxMCB9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIEFJTUFHRV9GT1JNQVRfUkFXMTIgfTwvbGk+CiAgICAgICogPC91bD4KICAgICAgKiA8cD5BbGwgb3RoZXIgZm9ybWF0cyBtYXkgb3IgbWF5IG5vdCBoYXZlIGFuIGFsbG93ZWQgc3RhbGwgZHVyYXRpb24gb24KICAgICAgKiBhIHBlci1jYXBhYmlsaXR5IGJhc2lzOyByZWZlciB0byBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUwpAQCAtMzE3NywzOSArMzI4MSwyOSBAQAogICAgICAqIGNhbiBydW4gY29uY3VycmVudGx5IHRvIHRoZSByZXN0IG9mIHRoZSBjYW1lcmEgcGlwZWxpbmUsIGJ1dAogICAgICAqIGNhbm5vdCBwcm9jZXNzIG1vcmUgdGhhbiAxIGNhcHR1cmUgYXQgYSB0aW1lLjwvbGk+CiAgICAgICogPC91bD4KLSAgICAgKiA8cD5UaGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGZvciB0aGUgYXBwbGljYXRpb24sIGdpdmVuIHRoZSBtb2RlbCBhYm92ZSwKLSAgICAgKiBpcyBwcm92aWRlZCB2aWEKLSAgICAgKiB7QGxpbmsgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlN9LgotICAgICAqIFRoZXNlIGFyZSB1c2VkIHRvIGRldGVybWluZSB0aGUgbWF4aW11bSBmcmFtZSByYXRlIC8gbWluaW11bSBmcmFtZQotICAgICAqIGR1cmF0aW9uIHRoYXQgaXMgcG9zc2libGUgZm9yIGEgZ2l2ZW4gc3RyZWFtIGNvbmZpZ3VyYXRpb24uPC9wPgorICAgICAqIDxwPlRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZm9yIHRoZSBhcHBsaWNhdGlvbiwgZ2l2ZW4gdGhlIG1vZGVsIGFib3ZlLCBpcyBwcm92aWRlZCB2aWEKKyAgICAgKiB7QGxpbmsgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlMgfS4KKyAgICAgKiBUaGVzZSBhcmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG1heGltdW0gZnJhbWUgcmF0ZSAvIG1pbmltdW0gZnJhbWUgZHVyYXRpb24gdGhhdCBpcworICAgICAqIHBvc3NpYmxlIGZvciBhIGdpdmVuIHN0cmVhbSBjb25maWd1cmF0aW9uLjwvcD4KICAgICAgKiA8cD5TcGVjaWZpY2FsbHksIHRoZSBhcHBsaWNhdGlvbiBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgcnVsZXMgdG8KICAgICAgKiBkZXRlcm1pbmUgdGhlIG1pbmltdW0gZnJhbWUgZHVyYXRpb24gaXQgY2FuIHJlcXVlc3QgZnJvbSB0aGUgY2FtZXJhCiAgICAgICogZGV2aWNlOjwvcD4KICAgICAgKiA8b2w+Ci0gICAgICogPGxpPkxldCB0aGUgc2V0IG9mIGN1cnJlbnRseSBjb25maWd1cmVkIGlucHV0L291dHB1dCBzdHJlYW1zCi0gICAgICogYmUgY2FsbGVkIDxjb2RlPlM8L2NvZGU+LjwvbGk+Ci0gICAgICogPGxpPkZpbmQgdGhlIG1pbmltdW0gZnJhbWUgZHVyYXRpb25zIGZvciBlYWNoIHN0cmVhbSBpbiA8Y29kZT5TPC9jb2RlPiwgYnkgbG9va2luZwotICAgICAqIGl0IHVwIGluIHtAbGluayBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfTUlOX0ZSQU1FX0RVUkFUSU9OU30KLSAgICAgKiAod2l0aCBpdHMgcmVzcGVjdGl2ZSBzaXplL2Zvcm1hdCkuIExldCB0aGlzIHNldCBvZiBmcmFtZSBkdXJhdGlvbnMgYmUKLSAgICAgKiBjYWxsZWQgPGNvZGU+RjwvY29kZT4uPC9saT4KLSAgICAgKiA8bGk+Rm9yIGFueSBnaXZlbiByZXF1ZXN0IDxjb2RlPlI8L2NvZGU+LCB0aGUgbWluaW11bSBmcmFtZSBkdXJhdGlvbiBhbGxvd2VkCi0gICAgICogZm9yIDxjb2RlPlI8L2NvZGU+IGlzIHRoZSBtYXhpbXVtIG91dCBvZiBhbGwgdmFsdWVzIGluIDxjb2RlPkY8L2NvZGU+LiBMZXQgdGhlIHN0cmVhbXMKLSAgICAgKiB1c2VkIGluIDxjb2RlPlI8L2NvZGU+IGJlIGNhbGxlZCA8Y29kZT5TX3I8L2NvZGU+LjwvbGk+CisgICAgICogPGxpPkxldCB0aGUgc2V0IG9mIGN1cnJlbnRseSBjb25maWd1cmVkIGlucHV0L291dHB1dCBzdHJlYW1zIGJlIGNhbGxlZCA8Y29kZT5TPC9jb2RlPi48L2xpPgorICAgICAqIDxsaT5GaW5kIHRoZSBtaW5pbXVtIGZyYW1lIGR1cmF0aW9ucyBmb3IgZWFjaCBzdHJlYW0gaW4gPGNvZGU+UzwvY29kZT4sIGJ5IGxvb2tpbmcgaXQgdXAgaW4ge0BsaW5rIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9NSU5fRlJBTUVfRFVSQVRJT05TIH0KKyAgICAgKiAod2l0aCBpdHMgcmVzcGVjdGl2ZSBzaXplL2Zvcm1hdCkuIExldCB0aGlzIHNldCBvZiBmcmFtZSBkdXJhdGlvbnMgYmUgY2FsbGVkIDxjb2RlPkY8L2NvZGU+LjwvbGk+CisgICAgICogPGxpPkZvciBhbnkgZ2l2ZW4gcmVxdWVzdCA8Y29kZT5SPC9jb2RlPiwgdGhlIG1pbmltdW0gZnJhbWUgZHVyYXRpb24gYWxsb3dlZCBmb3IgPGNvZGU+UjwvY29kZT4gaXMgdGhlIG1heGltdW0KKyAgICAgKiBvdXQgb2YgYWxsIHZhbHVlcyBpbiA8Y29kZT5GPC9jb2RlPi4gTGV0IHRoZSBzdHJlYW1zIHVzZWQgaW4gPGNvZGU+UjwvY29kZT4gYmUgY2FsbGVkIDxjb2RlPlNfcjwvY29kZT4uPC9saT4KICAgICAgKiA8L29sPgotICAgICAqIDxwPklmIG5vbmUgb2YgdGhlIHN0cmVhbXMgaW4gPGNvZGU+U19yPC9jb2RlPiBoYXZlIGEgc3RhbGwgdGltZSAobGlzdGVkIGluIHtAbGluawotICAgICAqIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVEFMTF9EVVJBVElPTlN9Ci0gICAgICogdXNpbmcgaXRzIHJlc3BlY3RpdmUgc2l6ZS9mb3JtYXQpLCB0aGVuIHRoZSBmcmFtZSBkdXJhdGlvbiBpbiA8Y29kZT5GPC9jb2RlPgotICAgICAqIGRldGVybWluZXMgdGhlIHN0ZWFkeSBzdGF0ZSBmcmFtZSByYXRlIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHdpbGwgZ2V0Ci0gICAgICogaWYgaXQgdXNlcyA8Y29kZT5SPC9jb2RlPiBhcyBhIHJlcGVhdGluZyByZXF1ZXN0LiBMZXQgdGhpcyBzcGVjaWFsIGtpbmQgb2YKLSAgICAgKiByZXF1ZXN0IGJlIGNhbGxlZCA8Y29kZT5Sc2ltcGxlPC9jb2RlPi48L3A+Ci0gICAgICogPHA+QSByZXBlYXRpbmcgcmVxdWVzdCA8Y29kZT5Sc2ltcGxlPC9jb2RlPiBjYW4gYmUgPGVtPm9jY2FzaW9uYWxseTwvZW0+IGludGVybGVhdmVkCi0gICAgICogYnkgYSBzaW5nbGUgY2FwdHVyZSBvZiBhIG5ldyByZXF1ZXN0IDxjb2RlPlJzdGFsbDwvY29kZT4gKHdoaWNoIGhhcyBhdCBsZWFzdAotICAgICAqIG9uZSBpbi11c2Ugc3RyZWFtIHdpdGggYSBub24tMCBzdGFsbCB0aW1lKSBhbmQgaWYgPGNvZGU+UnN0YWxsPC9jb2RlPiBoYXMgdGhlCi0gICAgICogc2FtZSBtaW5pbXVtIGZyYW1lIGR1cmF0aW9uIHRoaXMgd2lsbCBub3QgY2F1c2UgYSBmcmFtZSByYXRlIGxvc3MKLSAgICAgKiBpZiBhbGwgYnVmZmVycyBmcm9tIHRoZSBwcmV2aW91cyA8Y29kZT5Sc3RhbGw8L2NvZGU+IGhhdmUgYWxyZWFkeSBiZWVuCi0gICAgICogZGVsaXZlcmVkLjwvcD4KLSAgICAgKiA8cD5Gb3IgbW9yZSBkZXRhaWxzIGFib3V0IHN0YWxsaW5nLCBzZWUKLSAgICAgKiB7QGxpbmsgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OU30uPC9wPgorICAgICAqIDxwPklmIG5vbmUgb2YgdGhlIHN0cmVhbXMgaW4gPGNvZGU+U19yPC9jb2RlPiBoYXZlIGEgc3RhbGwgdGltZSAobGlzdGVkIGluIHtAbGluayBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RBTExfRFVSQVRJT05TIH0KKyAgICAgKiB1c2luZyBpdHMgcmVzcGVjdGl2ZSBzaXplL2Zvcm1hdCksIHRoZW4gdGhlIGZyYW1lIGR1cmF0aW9uIGluIDxjb2RlPkY8L2NvZGU+IGRldGVybWluZXMgdGhlIHN0ZWFkeQorICAgICAqIHN0YXRlIGZyYW1lIHJhdGUgdGhhdCB0aGUgYXBwbGljYXRpb24gd2lsbCBnZXQgaWYgaXQgdXNlcyA8Y29kZT5SPC9jb2RlPiBhcyBhIHJlcGVhdGluZyByZXF1ZXN0LiBMZXQKKyAgICAgKiB0aGlzIHNwZWNpYWwga2luZCBvZiByZXF1ZXN0IGJlIGNhbGxlZCA8Y29kZT5Sc2ltcGxlPC9jb2RlPi48L3A+CisgICAgICogPHA+QSByZXBlYXRpbmcgcmVxdWVzdCA8Y29kZT5Sc2ltcGxlPC9jb2RlPiBjYW4gYmUgPGVtPm9jY2FzaW9uYWxseTwvZW0+IGludGVybGVhdmVkIGJ5IGEgc2luZ2xlIGNhcHR1cmUgb2YgYQorICAgICAqIG5ldyByZXF1ZXN0IDxjb2RlPlJzdGFsbDwvY29kZT4gKHdoaWNoIGhhcyBhdCBsZWFzdCBvbmUgaW4tdXNlIHN0cmVhbSB3aXRoIGEgbm9uLTAgc3RhbGwgdGltZSkgYW5kIGlmCisgICAgICogPGNvZGU+UnN0YWxsPC9jb2RlPiBoYXMgdGhlIHNhbWUgbWluaW11bSBmcmFtZSBkdXJhdGlvbiB0aGlzIHdpbGwgbm90IGNhdXNlIGEgZnJhbWUgcmF0ZSBsb3NzIGlmIGFsbAorICAgICAqIGJ1ZmZlcnMgZnJvbSB0aGUgcHJldmlvdXMgPGNvZGU+UnN0YWxsPC9jb2RlPiBoYXZlIGFscmVhZHkgYmVlbiBkZWxpdmVyZWQuPC9wPgorICAgICAqIDxwPkZvciBtb3JlIGRldGFpbHMgYWJvdXQgc3RhbGxpbmcsIHNlZSB7QGxpbmsgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OUyB9LjwvcD4KICAgICAgKiA8cD5UaGlzIGNvbnRyb2wgaXMgb25seSBlZmZlY3RpdmUgaWYgQUNBTUVSQV9DT05UUk9MX0FFX01PREUgb3IgQUNBTUVSQV9DT05UUk9MX01PREUgaXMgc2V0IHRvCiAgICAgICogT0ZGOyBvdGhlcndpc2UgdGhlIGF1dG8tZXhwb3N1cmUgYWxnb3JpdGhtIHdpbGwgb3ZlcnJpZGUgdGhpcyB2YWx1ZS48L3A+CiAgICAgICoKQEAgLTM1NjcsMTQgKzM2NjEsMTIgQEAKICAgICAgKiB0aW1lc3RhbXBzIGZvciBvdGhlciBjYXB0dXJlcyBmcm9tIHRoZSBzYW1lIGNhbWVyYSBkZXZpY2UsIGJ1dCBhcmUKICAgICAgKiBub3QgZ3VhcmFudGVlZCB0byBiZSBjb21wYXJhYmxlIHRvIGFueSBvdGhlciB0aW1lIHNvdXJjZS48L3A+CiAgICAgICogPHA+V2hlbiBBQ0FNRVJBX1NFTlNPUl9JTkZPX1RJTUVTVEFNUF9TT1VSQ0UgPGNvZGU+PT08L2NvZGU+IFJFQUxUSU1FLCB0aGUKLSAgICAgKiB0aW1lc3RhbXBzIG1lYXN1cmUgdGltZSBpbiB0aGUgc2FtZSB0aW1lYmFzZSBhcwotICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL29zL1N5c3RlbUNsb2NrLmh0bWwjZWxhcHNlZFJlYWx0aW1lTmFub3MiPmVsYXBzZWRSZWFsdGltZU5hbm9zPC9hPgotICAgICAqIChvciBDTE9DS19CT09UVElNRSksIGFuZCB0aGV5IGNhbgorICAgICAqIHRpbWVzdGFtcHMgbWVhc3VyZSB0aW1lIGluIHRoZSBzYW1lIHRpbWViYXNlIGFzIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL29zL1N5c3RlbUNsb2NrLmh0bWwjZWxhcHNlZFJlYWx0aW1lTmFub3MiPlN5c3RlbUNsb2NrI2VsYXBzZWRSZWFsdGltZU5hbm9zPC9hPiwgYW5kIHRoZXkgY2FuCiAgICAgICogYmUgY29tcGFyZWQgdG8gb3RoZXIgdGltZXN0YW1wcyBmcm9tIG90aGVyIHN1YnN5c3RlbXMgdGhhdAogICAgICAqIGFyZSB1c2luZyB0aGF0IGJhc2UuPC9wPgogICAgICAqIDxwPkZvciByZXByb2Nlc3NpbmcsIHRoZSB0aW1lc3RhbXAgd2lsbCBtYXRjaCB0aGUgc3RhcnQgb2YgZXhwb3N1cmUgb2YKLSAgICAgKiB0aGUgaW5wdXQgaW1hZ2UsIGkuZS4ge0BsaW5rIENhcHR1cmVSZXN1bHQjU0VOU09SX1RJTUVTVEFNUCB0aGUKLSAgICAgKiB0aW1lc3RhbXB9IGluIHRoZSBUb3RhbENhcHR1cmVSZXN1bHQgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgdGhlCisgICAgICogdGhlIGlucHV0IGltYWdlLCBpLmUuIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9DYXB0dXJlUmVzdWx0Lmh0bWwjU0VOU09SX1RJTUVTVEFNUCI+dGhlCisgICAgICogdGltZXN0YW1wPC9hPiBpbiB0aGUgVG90YWxDYXB0dXJlUmVzdWx0IHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIHRoZQogICAgICAqIHJlcHJvY2VzcyBjYXB0dXJlIHJlcXVlc3QuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX1RJTUVTVEFNUF9TT1VSQ0UKQEAgLTM3NzUsNyArMzg2Nyw2IEBACiAgICAgICogb3B0aWNhbGx5IHNoaWVsZGVkIHBpeGVsIGFyZWFzLiBCeSBibG9ja2luZyBsaWdodCwgdGhlc2UgcGl4ZWxzCiAgICAgICogcHJvdmlkZXMgYSByZWxpYWJsZSBibGFjayByZWZlcmVuY2UgZm9yIGJsYWNrIGxldmVsIGNvbXBlbnNhdGlvbgogICAgICAqIGluIGFjdGl2ZSBhcnJheSByZWdpb24uPC9wPgotICAgICAqIDxwPlRoZSBkYXRhIHJlcHJlc2VudGF0aW9uIGlzIGludFs0XSwgd2hpY2ggbWFwcyB0byAobGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KS48L3A+CiAgICAgICogPHA+VGhpcyBrZXkgcHJvdmlkZXMgYSBsaXN0IG9mIGRpc2pvaW50IHJlY3RhbmdsZXMgc3BlY2lmeWluZyB0aGUKICAgICAgKiByZWdpb25zIG9mIG9wdGljYWxseSBzaGllbGRlZCAod2l0aCBtZXRhbCBzaGllbGQpIGJsYWNrIHBpeGVsCiAgICAgICogcmVnaW9ucyBpZiB0aGUgY2FtZXJhIGRldmljZSBpcyBjYXBhYmxlIG9mIHJlYWRpbmcgb3V0IHRoZXNlIGJsYWNrCkBAIC0zNzg1LDYgKzM4NzYsNyBAQAogICAgICAqIGJsYWNrIGxldmVsIG9mIGVhY2ggY2FwdHVyZWQgcmF3IGltYWdlcy48L3A+CiAgICAgICogPHA+V2hlbiB0aGlzIGtleSBpcyByZXBvcnRlZCwgdGhlIEFDQU1FUkFfU0VOU09SX0RZTkFNSUNfQkxBQ0tfTEVWRUwgYW5kCiAgICAgICogQUNBTUVSQV9TRU5TT1JfRFlOQU1JQ19XSElURV9MRVZFTCB3aWxsIGFsc28gYmUgcmVwb3J0ZWQuPC9wPgorICAgICAqIDxwPlRoZSBkYXRhIHJlcHJlc2VudGF0aW9uIGlzIDxjb2RlPmludFs0XTwvY29kZT4sIHdoaWNoIG1hcHMgdG8gPGNvZGU+KGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCk8L2NvZGU+LjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfQkxBQ0tfTEVWRUxfUEFUVEVSTgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfRFlOQU1JQ19CTEFDS19MRVZFTApAQCAtMzgyNSw5ICszOTE3LDggQEAKICAgICAgKiBsYXlvdXQga2V5IChzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlQpLCBpLmUuIHRoZQogICAgICAqIG50aCB2YWx1ZSBnaXZlbiBjb3JyZXNwb25kcyB0byB0aGUgYmxhY2sgbGV2ZWwgb2Zmc2V0IGZvciB0aGUgbnRoCiAgICAgICogY29sb3IgY2hhbm5lbCBsaXN0ZWQgaW4gdGhlIENGQS48L3A+Ci0gICAgICogPHA+VGhpcyBrZXkgd2lsbCBiZSBhdmFpbGFibGUgaWYgQUNBTUVSQV9TRU5TT1JfT1BUSUNBTF9CTEFDS19SRUdJT05TIGlzCi0gICAgICogYXZhaWxhYmxlIG9yIHRoZSBjYW1lcmEgZGV2aWNlIGFkdmVydGlzZXMgdGhpcyBrZXkgdmlhCi0gICAgICoge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUkVTVUxUX0tFWVN9LjwvcD4KKyAgICAgKiA8cD5UaGlzIGtleSB3aWxsIGJlIGF2YWlsYWJsZSBpZiBBQ0FNRVJBX1NFTlNPUl9PUFRJQ0FMX0JMQUNLX1JFR0lPTlMgaXMgYXZhaWxhYmxlIG9yIHRoZQorICAgICAqIGNhbWVyYSBkZXZpY2UgYWR2ZXJ0aXNlcyB0aGlzIGtleSB2aWEge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUkVTVUxUX0tFWVMgfS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0JMQUNLX0xFVkVMX1BBVFRFUk4KICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UCkBAIC0zODUzLDcgKzM5NDQsNyBAQAogICAgICAqIGVzdGltYXRlZCB3aGl0ZSBsZXZlbCBmb3IgZWFjaCBmcmFtZS48L3A+CiAgICAgICogPHA+VGhpcyBrZXkgd2lsbCBiZSBhdmFpbGFibGUgaWYgQUNBTUVSQV9TRU5TT1JfT1BUSUNBTF9CTEFDS19SRUdJT05TIGlzCiAgICAgICogYXZhaWxhYmxlIG9yIHRoZSBjYW1lcmEgZGV2aWNlIGFkdmVydGlzZXMgdGhpcyBrZXkgdmlhCi0gICAgICoge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUkVTVUxUX0tFWVN9LjwvcD4KKyAgICAgKiB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9SRVNVTFRfS0VZUyB9LjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfQkxBQ0tfTEVWRUxfUEFUVEVSTgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19XSElURV9MRVZFTApAQCAtMzg4MiwxMyArMzk3MywxMyBAQAogICAgICAqIDxwPlRoaXMgcmVjdGFuZ2xlIGlzIGRlZmluZWQgcmVsYXRpdmUgdG8gdGhlIGZ1bGwgcGl4ZWwgYXJyYXk7ICgwLDApIGlzIHRoZSB0b3AtbGVmdCBvZgogICAgICAqIHRoZSBmdWxsIHBpeGVsIGFycmF5LCBhbmQgdGhlIHNpemUgb2YgdGhlIGZ1bGwgcGl4ZWwgYXJyYXkgaXMgZ2l2ZW4gYnkKICAgICAgKiBBQ0FNRVJBX1NFTlNPUl9JTkZPX1BJWEVMX0FSUkFZX1NJWkUuPC9wPgotICAgICAqIDxwPlRoZSBkYXRhIHJlcHJlc2VudGF0aW9uIGlzIGludFs0XSwgd2hpY2ggbWFwcyB0byAobGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KS48L3A+CiAgICAgICogPHA+VGhlIGNvb3JkaW5hdGUgc3lzdGVtIGZvciBtb3N0IG90aGVyIGtleXMgdGhhdCBsaXN0IHBpeGVsIGNvb3JkaW5hdGVzLCBpbmNsdWRpbmcKICAgICAgKiBBQ0FNRVJBX1NDQUxFUl9DUk9QX1JFR0lPTiwgaXMgZGVmaW5lZCByZWxhdGl2ZSB0byB0aGUgYWN0aXZlIGFycmF5IHJlY3RhbmdsZSBnaXZlbiBpbgogICAgICAqIHRoaXMgZmllbGQsIHdpdGggPGNvZGU+KDAsIDApPC9jb2RlPiBiZWluZyB0aGUgdG9wLWxlZnQgb2YgdGhpcyByZWN0YW5nbGUuPC9wPgogICAgICAqIDxwPlRoZSBhY3RpdmUgYXJyYXkgbWF5IGJlIHNtYWxsZXIgdGhhbiB0aGUgZnVsbCBwaXhlbCBhcnJheSwgc2luY2UgdGhlIGZ1bGwgYXJyYXkgbWF5CiAgICAgICogaW5jbHVkZSBibGFjayBjYWxpYnJhdGlvbiBwaXhlbHMgb3Igb3RoZXIgaW5hY3RpdmUgcmVnaW9ucywgYW5kIGdlb21ldHJpYyBjb3JyZWN0aW9uCiAgICAgICogcmVzdWx0aW5nIGluIHNjYWxpbmcgb3IgY3JvcHBpbmcgbWF5IGhhdmUgYmVlbiBhcHBsaWVkLjwvcD4KKyAgICAgKiA8cD5UaGUgZGF0YSByZXByZXNlbnRhdGlvbiBpcyA8Y29kZT5pbnRbNF08L2NvZGU+LCB3aGljaCBtYXBzIHRvIDxjb2RlPihsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpPC9jb2RlPi48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0NBTEVSX0NST1BfUkVHSU9OCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX1BJWEVMX0FSUkFZX1NJWkUKQEAgLTM5NjAsOCArNDA1MSw3IEBACiAgICAgICogPHA+QXR0ZW1wdGluZyB0byB1c2UgZnJhbWUgZHVyYXRpb25zIGJleW9uZCB0aGUgbWF4aW11bSB3aWxsIHJlc3VsdCBpbiB0aGUgZnJhbWUKICAgICAgKiBkdXJhdGlvbiBiZWluZyBjbGlwcGVkIHRvIHRoZSBtYXhpbXVtLiBTZWUgdGhhdCBjb250cm9sIGZvciBhIGZ1bGwgZGVmaW5pdGlvbiBvZiBmcmFtZQogICAgICAqIGR1cmF0aW9ucy48L3A+Ci0gICAgICogPHA+UmVmZXIgdG8ge0BsaW5rCi0gICAgICogQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlN9CisgICAgICogPHA+UmVmZXIgdG8ge0BsaW5rIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9NSU5fRlJBTUVfRFVSQVRJT05TIH0KICAgICAgKiBmb3IgdGhlIG1pbmltdW0gZnJhbWUgZHVyYXRpb24gdmFsdWVzLjwvcD4KICAgICAgKi8KICAgICBBQ0FNRVJBX1NFTlNPUl9JTkZPX01BWF9GUkFNRV9EVVJBVElPTiA9ICAgICAgICAgICAgICAgICAgICAvLyBpbnQ2NApAQCAtNDAwMCw5ICs0MDkwLDkgQEAKICAgICAgKiB0aGUgcmF3IGJ1ZmZlcnMgcHJvZHVjZWQgYnkgdGhpcyBzZW5zb3IuPC9wPgogICAgICAqIDxwPklmIGEgY2FtZXJhIGRldmljZSBzdXBwb3J0cyByYXcgc2Vuc29yIGZvcm1hdHMsIGVpdGhlciB0aGlzIG9yCiAgICAgICogQUNBTUVSQV9TRU5TT1JfSU5GT19QUkVfQ09SUkVDVElPTl9BQ1RJVkVfQVJSQVlfU0laRSBpcyB0aGUgbWF4aW11bSBkaW1lbnNpb25zIGZvciB0aGUgcmF3Ci0gICAgICogb3V0cHV0IGZvcm1hdHMgbGlzdGVkIGluIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMgKHRoaXMgZGVwZW5kcyBvbgotICAgICAqIHdoZXRoZXIgb3Igbm90IHRoZSBpbWFnZSBzZW5zb3IgcmV0dXJucyBidWZmZXJzIGNvbnRhaW5pbmcgcGl4ZWxzIHRoYXQgYXJlIG5vdAotICAgICAqIHBhcnQgb2YgdGhlIGFjdGl2ZSBhcnJheSByZWdpb24gZm9yIGJsYWNrbGV2ZWwgY2FsaWJyYXRpb24gb3Igb3RoZXIgcHVycG9zZXMpLjwvcD4KKyAgICAgKiBvdXRwdXQgZm9ybWF0cyBsaXN0ZWQgaW4ge0BsaW5rIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMgfQorICAgICAqICh0aGlzIGRlcGVuZHMgb24gd2hldGhlciBvciBub3QgdGhlIGltYWdlIHNlbnNvciByZXR1cm5zIGJ1ZmZlcnMgY29udGFpbmluZyBwaXhlbHMgdGhhdAorICAgICAqIGFyZSBub3QgcGFydCBvZiB0aGUgYWN0aXZlIGFycmF5IHJlZ2lvbiBmb3IgYmxhY2tsZXZlbCBjYWxpYnJhdGlvbiBvciBvdGhlciBwdXJwb3NlcykuPC9wPgogICAgICAqIDxwPlNvbWUgcGFydHMgb2YgdGhlIGZ1bGwgcGl4ZWwgYXJyYXkgbWF5IG5vdCByZWNlaXZlIGxpZ2h0IGZyb20gdGhlIHNjZW5lLAogICAgICAqIG9yIGJlIG90aGVyd2lzZSBpbmFjdGl2ZS4gIFRoZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX1BSRV9DT1JSRUNUSU9OX0FDVElWRV9BUlJBWV9TSVpFIGtleQogICAgICAqIGRlZmluZXMgdGhlIHJlY3RhbmdsZSBvZiBhY3RpdmUgcGl4ZWxzIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiBwcm9jZXNzZWQgaW1hZ2UKQEAgLTQwOTIsNyArNDE4Miw2IEBACiAgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KICAgICAgKiA8L3VsPjwvcD4KICAgICAgKgotICAgICAqIDxwPlRoZSBkYXRhIHJlcHJlc2VudGF0aW9uIGlzIGludFs0XSwgd2hpY2ggbWFwcyB0byAobGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KS48L3A+CiAgICAgICogPHA+VGhpcyBpcyB0aGUgcmVjdGFuZ2xlIHJlcHJlc2VudGluZyB0aGUgc2l6ZSBvZiB0aGUgYWN0aXZlIHJlZ2lvbiBvZiB0aGUgc2Vuc29yIChpLmUuCiAgICAgICogdGhlIHJlZ2lvbiB0aGF0IGFjdHVhbGx5IHJlY2VpdmVzIGxpZ2h0IGZyb20gdGhlIHNjZW5lKSBiZWZvcmUgYW55IGdlb21ldHJpYyBjb3JyZWN0aW9uCiAgICAgICogaGFzIGJlZW4gYXBwbGllZCwgYW5kIHNob3VsZCBiZSB0cmVhdGVkIGFzIHRoZSBhY3RpdmUgcmVnaW9uIHJlY3RhbmdsZSBmb3IgYW55IG9mIHRoZQpAQCAtNDEzMyw3ICs0MjIyLDcgQEAKICAgICAgKiBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFLjwvcD4KICAgICAgKiA8cD5UaGUgY3VycmVudGx5IHN1cHBvcnRlZCBmaWVsZHMgdGhhdCBjb3JyZWN0IGZvciBnZW9tZXRyaWMgZGlzdG9ydGlvbiBhcmU6PC9wPgogICAgICAqIDxvbD4KLSAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX1JBRElBTF9ESVNUT1JUSU9OLjwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfTEVOU19ESVNUT1JUSU9OLjwvbGk+CiAgICAgICogPC9vbD4KICAgICAgKiA8cD5JZiBhbGwgb2YgdGhlIGdlb21ldHJpYyBkaXN0b3J0aW9uIGZpZWxkcyBhcmUgbm8tb3BzLCB0aGlzIHJlY3RhbmdsZSB3aWxsIGJlIHRoZSBzYW1lCiAgICAgICogYXMgdGhlIHBvc3QtZGlzdG9ydGlvbi1jb3JyZWN0ZWQgcmVjdGFuZ2xlIGdpdmVuIGluCkBAIC00MTQzLDggKzQyMzIsOSBAQAogICAgICAqIEFDQU1FUkFfU0VOU09SX0lORk9fUElYRUxfQVJSQVlfU0laRS48L3A+CiAgICAgICogPHA+VGhlIHByZS1jb3JyZWN0aW9uIGFjdGl2ZSBhcnJheSBtYXkgYmUgc21hbGxlciB0aGFuIHRoZSBmdWxsIHBpeGVsIGFycmF5LCBzaW5jZSB0aGUKICAgICAgKiBmdWxsIGFycmF5IG1heSBpbmNsdWRlIGJsYWNrIGNhbGlicmF0aW9uIHBpeGVscyBvciBvdGhlciBpbmFjdGl2ZSByZWdpb25zLjwvcD4KKyAgICAgKiA8cD5UaGUgZGF0YSByZXByZXNlbnRhdGlvbiBpcyA8Y29kZT5pbnRbNF08L2NvZGU+LCB3aGljaCBtYXBzIHRvIDxjb2RlPihsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpPC9jb2RlPi48L3A+CiAgICAgICoKLSAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19SQURJQUxfRElTVE9SVElPTgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0RJU1RPUlRJT04KICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fUElYRUxfQVJSQVlfU0laRQogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19QUkVfQ09SUkVDVElPTl9BQ1RJVkVfQVJSQVlfU0laRQpAQCAtNDMwMiwxMCArNDM5MiwxMCBAQAogICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IGNhbGxiYWNrczwvbGk+CiAgICAgICogPC91bD48L3A+CiAgICAgICoKLSAgICAgKiA8cD5UaGUgZGF0YSByZXByZXNlbnRhdGlvbiBpcyBpbnRbNF0sIHdoaWNoIG1hcHMgdG8gKGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCkuPC9wPgogICAgICAqIDxwPlRoZSBjb29yZGluYXRlIHN5c3RlbSBpcyB0aGF0IG9mIEFDQU1FUkFfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUsIHdpdGgKICAgICAgKiA8Y29kZT4oMCwgMCk8L2NvZGU+IGJlaW5nIHRoZSB0b3AtbGVmdCBwaXhlbCBvZiB0aGUgYWN0aXZlIGFycmF5LjwvcD4KLSAgICAgKiA8cD5Pbmx5IGF2YWlsYWJsZSBpZiBBQ0FNRVJBX1NUQVRJU1RJQ1NfRkFDRV9ERVRFQ1RfTU9ERSAhPSBPRkY8L3A+CisgICAgICogPHA+T25seSBhdmFpbGFibGUgaWYgQUNBTUVSQV9TVEFUSVNUSUNTX0ZBQ0VfREVURUNUX01PREUgIT0gT0ZGCisgICAgICogVGhlIGRhdGEgcmVwcmVzZW50YXRpb24gaXMgPGNvZGU+aW50WzRdPC9jb2RlPiwgd2hpY2ggbWFwcyB0byA8Y29kZT4obGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KTwvY29kZT4uPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFCiAgICAgICogQHNlZSBBQ0FNRVJBX1NUQVRJU1RJQ1NfRkFDRV9ERVRFQ1RfTU9ERQpAQCAtNDQ4Myw2ICs0NTczLDgwIEBACiAgICAgICovCiAgICAgQUNBTUVSQV9TVEFUSVNUSUNTX0xFTlNfU0hBRElOR19NQVBfTU9ERSA9ICAgICAgICAgICAgICAgICAgLy8gYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc3RhdGlzdGljc19sZW5zX3NoYWRpbmdfbWFwX21vZGVfdCkKICAgICAgICAgICAgIEFDQU1FUkFfU1RBVElTVElDU19TVEFSVCArIDE2LAorICAgIC8qKgorICAgICAqIDxwPkEgY29udHJvbCBmb3Igc2VsZWN0aW5nIHdoZXRoZXIgT0lTIHBvc2l0aW9uIGluZm9ybWF0aW9uIGlzIGluY2x1ZGVkIGluIG91dHB1dAorICAgICAqIHJlc3VsdCBtZXRhZGF0YS48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBieXRlIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zdGF0aXN0aWNzX29pc19kYXRhX21vZGVfdCk8L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBjYWxsYmFja3M8L2xpPgorICAgICAqICAgPGxpPkFDYXB0dXJlUmVxdWVzdDwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NUQVRJU1RJQ1NfT0lTX0RBVEFfTU9ERSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zdGF0aXN0aWNzX29pc19kYXRhX21vZGVfdCkKKyAgICAgICAgICAgIEFDQU1FUkFfU1RBVElTVElDU19TVEFSVCArIDE3LAorICAgIC8qKgorICAgICAqIDxwPkFuIGFycmF5IG9mIHRpbWVzdGFtcHMgb2YgT0lTIHNhbXBsZXMsIGluIG5hbm9zZWNvbmRzLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGludDY0W25dPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgY2FsbGJhY2tzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoZSBhcnJheSBjb250YWlucyB0aGUgdGltZXN0YW1wcyBvZiBPSVMgc2FtcGxlcy4gVGhlIHRpbWVzdGFtcHMgYXJlIGluIHRoZSBzYW1lCisgICAgICogdGltZWJhc2UgYXMgYW5kIGNvbXBhcmFibGUgdG8gQUNBTUVSQV9TRU5TT1JfVElNRVNUQU1QLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfVElNRVNUQU1QCisgICAgICovCisgICAgQUNBTUVSQV9TVEFUSVNUSUNTX09JU19USU1FU1RBTVBTID0gICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50NjRbbl0KKyAgICAgICAgICAgIEFDQU1FUkFfU1RBVElTVElDU19TVEFSVCArIDE4LAorICAgIC8qKgorICAgICAqIDxwPkFuIGFycmF5IG9mIHNoaWZ0cyBvZiBPSVMgc2FtcGxlcywgaW4geCBkaXJlY3Rpb24uPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogZmxvYXRbbl08L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBjYWxsYmFja3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+VGhlIGFycmF5IGNvbnRhaW5zIHRoZSBhbW91bnQgb2Ygc2hpZnRzIGluIHggZGlyZWN0aW9uLCBpbiBwaXhlbHMsIGJhc2VkIG9uIE9JUyBzYW1wbGVzLgorICAgICAqIEEgcG9zaXRpdmUgdmFsdWUgaXMgYSBzaGlmdCBmcm9tIGxlZnQgdG8gcmlnaHQgaW4gYWN0aXZlIGFycmF5IGNvb3JkaW5hdGUgc3lzdGVtLiBGb3IKKyAgICAgKiBleGFtcGxlLCBpZiB0aGUgb3B0aWNhbCBjZW50ZXIgaXMgKDEwMDAsIDUwMCkgaW4gYWN0aXZlIGFycmF5IGNvb3JkaW5hdGVzLCBhIHNoaWZ0IG9mCisgICAgICogKDMsIDApIHB1dHMgdGhlIG5ldyBvcHRpY2FsIGNlbnRlciBhdCAoMTAwMywgNTAwKS48L3A+CisgICAgICogPHA+VGhlIG51bWJlciBvZiBzaGlmdHMgbXVzdCBtYXRjaCB0aGUgbnVtYmVyIG9mIHRpbWVzdGFtcHMgaW4KKyAgICAgKiBBQ0FNRVJBX1NUQVRJU1RJQ1NfT0lTX1RJTUVTVEFNUFMuPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX1NUQVRJU1RJQ1NfT0lTX1RJTUVTVEFNUFMKKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NUQVRJU1RJQ1NfT0lTX1hfU0hJRlRTID0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmbG9hdFtuXQorICAgICAgICAgICAgQUNBTUVSQV9TVEFUSVNUSUNTX1NUQVJUICsgMTksCisgICAgLyoqCisgICAgICogPHA+QW4gYXJyYXkgb2Ygc2hpZnRzIG9mIE9JUyBzYW1wbGVzLCBpbiB5IGRpcmVjdGlvbi48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBmbG9hdFtuXTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IGNhbGxiYWNrczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGUgYXJyYXkgY29udGFpbnMgdGhlIGFtb3VudCBvZiBzaGlmdHMgaW4geSBkaXJlY3Rpb24sIGluIHBpeGVscywgYmFzZWQgb24gT0lTIHNhbXBsZXMuCisgICAgICogQSBwb3NpdGl2ZSB2YWx1ZSBpcyBhIHNoaWZ0IGZyb20gdG9wIHRvIGJvdHRvbSBpbiBhY3RpdmUgYXJyYXkgY29vcmRpbmF0ZSBzeXN0ZW0uIEZvcgorICAgICAqIGV4YW1wbGUsIGlmIHRoZSBvcHRpY2FsIGNlbnRlciBpcyAoMTAwMCwgNTAwKSBpbiBhY3RpdmUgYXJyYXkgY29vcmRpbmF0ZXMsIGEgc2hpZnQgb2YKKyAgICAgKiAoMCwgNSkgcHV0cyB0aGUgbmV3IG9wdGljYWwgY2VudGVyIGF0ICgxMDAwLCA1MDUpLjwvcD4KKyAgICAgKiA8cD5UaGUgbnVtYmVyIG9mIHNoaWZ0cyBtdXN0IG1hdGNoIHRoZSBudW1iZXIgb2YgdGltZXN0YW1wcyBpbgorICAgICAqIEFDQU1FUkFfU1RBVElTVElDU19PSVNfVElNRVNUQU1QUy48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfU1RBVElTVElDU19PSVNfVElNRVNUQU1QUworICAgICAqLworICAgIEFDQU1FUkFfU1RBVElTVElDU19PSVNfWV9TSElGVFMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsb2F0W25dCisgICAgICAgICAgICBBQ0FNRVJBX1NUQVRJU1RJQ1NfU1RBUlQgKyAyMCwKICAgICBBQ0FNRVJBX1NUQVRJU1RJQ1NfRU5ELAogCiAgICAgLyoqCkBAIC00NTU1LDYgKzQ3MTksMjQgQEAKICAgICAgKi8KICAgICBBQ0FNRVJBX1NUQVRJU1RJQ1NfSU5GT19BVkFJTEFCTEVfTEVOU19TSEFESU5HX01BUF9NT0RFUyA9ICAvLyBieXRlW25dCiAgICAgICAgICAgICBBQ0FNRVJBX1NUQVRJU1RJQ1NfSU5GT19TVEFSVCArIDcsCisgICAgLyoqCisgICAgICogPHA+TGlzdCBvZiBPSVMgZGF0YSBvdXRwdXQgbW9kZXMgZm9yIEFDQU1FUkFfU1RBVElTVElDU19PSVNfREFUQV9NT0RFIHRoYXQKKyAgICAgKiBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMgY2FtZXJhIGRldmljZS48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfU1RBVElTVElDU19PSVNfREFUQV9NT0RFCisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBieXRlW25dPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPklmIG5vIE9JUyBkYXRhIG91dHB1dCBpcyBhdmFpbGFibGUgZm9yIHRoaXMgY2FtZXJhIGRldmljZSwgdGhpcyBrZXkgd2lsbAorICAgICAqIGNvbnRhaW4gb25seSBPRkYuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU1RBVElTVElDU19JTkZPX0FWQUlMQUJMRV9PSVNfREFUQV9NT0RFUyA9ICAgICAgICAgIC8vIGJ5dGVbbl0KKyAgICAgICAgICAgIEFDQU1FUkFfU1RBVElTVElDU19JTkZPX1NUQVJUICsgOCwKICAgICBBQ0FNRVJBX1NUQVRJU1RJQ1NfSU5GT19FTkQsCiAKICAgICAvKioKQEAgLTQ2MjcsNiArNDgwOSw4IEBACiAgICAgICogb2YgcG9pbnRzIGNhbiBiZSBsZXNzIHRoYW4gbWF4ICh0aGF0IGlzLCB0aGUgcmVxdWVzdCBkb2Vzbid0IGhhdmUgdG8KICAgICAgKiBhbHdheXMgcHJvdmlkZSBhIGN1cnZlIHdpdGggbnVtYmVyIG9mIHBvaW50cyBlcXVpdmFsZW50IHRvCiAgICAgICogQUNBTUVSQV9UT05FTUFQX01BWF9DVVJWRV9QT0lOVFMpLjwvcD4KKyAgICAgKiA8cD5Gb3IgZGV2aWNlcyB3aXRoIE1PTk9DSFJPTUUgY2FwYWJpbGl0eSwgb25seSByZWQgY2hhbm5lbCBpcyB1c2VkLiBHcmVlbiBhbmQgYmx1ZSBjaGFubmVscworICAgICAqIGFyZSBpZ25vcmVkLjwvcD4KICAgICAgKiA8cD5BIGZldyBleGFtcGxlcywgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgZ3JhcGhpY2FsIG1hcHBpbmdzOyB0aGVzZQogICAgICAqIG9ubHkgc3BlY2lmeSB0aGUgcmVkIGNoYW5uZWwgYW5kIHRoZSBwcmVjaXNpb24gaXMgbGltaXRlZCB0byA0CiAgICAgICogZGlnaXRzLCBmb3IgY29uY2lzZW5lc3MuPC9wPgpAQCAtNDgzMiw3ICs1MDE2LDcgQEAKICAgICAgKiA8cD5TZWUgdGhlIGluZGl2aWR1YWwgbGV2ZWwgZW51bXMgZm9yIGZ1bGwgZGVzY3JpcHRpb25zIG9mIHRoZSBzdXBwb3J0ZWQgY2FwYWJpbGl0aWVzLiAgVGhlCiAgICAgICogQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMgZW50cnkgZGVzY3JpYmVzIHRoZSBkZXZpY2UncyBjYXBhYmlsaXRpZXMgYXQgYQogICAgICAqIGZpbmVyLWdyYWluIGxldmVsLCBpZiBuZWVkZWQuIEluIGFkZGl0aW9uLCBtYW55IGNvbnRyb2xzIGhhdmUgdGhlaXIgYXZhaWxhYmxlIHNldHRpbmdzIG9yCi0gICAgICogcmFuZ2VzIGRlZmluZWQgaW4gaW5kaXZpZHVhbCBtZXRhZGF0YSB0YWcgZW50cmllcyBpbiB0aGlzIGRvY3VtZW50LjwvcD4KKyAgICAgKiByYW5nZXMgZGVmaW5lZCBpbiBpbmRpdmlkdWFsIGVudHJpZXMgZnJvbSB7QGxpbmsgQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzIH0uPC9wPgogICAgICAqIDxwPlNvbWUgZmVhdHVyZXMgYXJlIG5vdCBwYXJ0IG9mIGFueSBwYXJ0aWN1bGFyIGhhcmR3YXJlIGxldmVsIG9yIGNhcGFiaWxpdHkgYW5kIG11c3QgYmUKICAgICAgKiBxdWVyaWVkIHNlcGFyYXRlbHkuIFRoZXNlIGluY2x1ZGU6PC9wPgogICAgICAqIDx1bD4KQEAgLTQ4NTMsNiArNTAzNywyMyBAQAogICAgICAqLwogICAgIEFDQU1FUkFfSU5GT19TVVBQT1JURURfSEFSRFdBUkVfTEVWRUwgPSAgICAgICAgICAgICAgICAgICAgIC8vIGJ5dGUgKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2luZm9fc3VwcG9ydGVkX2hhcmR3YXJlX2xldmVsX3QpCiAgICAgICAgICAgICBBQ0FNRVJBX0lORk9fU1RBUlQsCisgICAgLyoqCisgICAgICogPHA+QSBzaG9ydCBzdHJpbmcgZm9yIG1hbnVmYWN0dXJlciB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjYW1lcmEgZGV2aWNlLCBzdWNoIGFzCisgICAgICogSVNQIGhhcmR3YXJlLCBzZW5zb3JzLCBldGMuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogYnl0ZTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIGNhbiBiZSB1c2VkIGluIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0V4aWZJbnRlcmZhY2UuaHRtbCNUQUdfSU1BR0VfREVTQ1JJUFRJT04iPlRBR19JTUFHRV9ERVNDUklQVElPTjwvYT4KKyAgICAgKiBpbiBqcGVnIEVYSUYuIFRoaXMga2V5IG1heSBiZSBhYnNlbnQgaWYgbm8gdmVyc2lvbiBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgb24gdGhlCisgICAgICogZGV2aWNlLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0lORk9fVkVSU0lPTiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlCisgICAgICAgICAgICBBQ0FNRVJBX0lORk9fU1RBUlQgKyAxLAogICAgIEFDQU1FUkFfSU5GT19FTkQsCiAKICAgICAvKioKQEAgLTUwNjksNiArNTI3MCw4NiBAQAogICAgICAgICAgICAgQUNBTUVSQV9ERVBUSF9TVEFSVCArIDQsCiAgICAgQUNBTUVSQV9ERVBUSF9FTkQsCiAKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgYWNjdXJhY3kgb2YgZnJhbWUgdGltZXN0YW1wIHN5bmNocm9uaXphdGlvbiBiZXR3ZWVuIHBoeXNpY2FsIGNhbWVyYXM8L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBieXRlIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9sb2dpY2FsX211bHRpX2NhbWVyYV9zZW5zb3Jfc3luY190eXBlX3QpPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoZSBhY2N1cmFjeSBvZiB0aGUgZnJhbWUgdGltZXN0YW1wIHN5bmNocm9uaXphdGlvbiBkZXRlcm1pbmVzIHRoZSBwaHlzaWNhbCBjYW1lcmFzJworICAgICAqIGFiaWxpdHkgdG8gc3RhcnQgZXhwb3N1cmUgYXQgdGhlIHNhbWUgdGltZS4gSWYgdGhlIHNlbnNvclN5bmNUeXBlIGlzIENBTElCUkFURUQsCisgICAgICogdGhlIHBoeXNpY2FsIGNhbWVyYSBzZW5zb3JzIHVzdWFsbHkgcnVuIGluIG1hc3Rlci1zbGF2ZSBtb2RlIHNvIHRoYXQgdGhlaXIgc2h1dHRlcgorICAgICAqIHRpbWUgaXMgc3luY2hyb25pemVkLiBGb3IgQVBQUk9YSU1BVEUgc2Vuc29yU3luY1R5cGUsIHRoZSBjYW1lcmEgc2Vuc29ycyB1c3VhbGx5IHJ1biBpbgorICAgICAqIG1hc3Rlci1tYXN0ZXIgbW9kZSwgYW5kIHRoZXJlIGNvdWxkIGJlIG9mZnNldCBiZXR3ZWVuIHRoZWlyIHN0YXJ0IG9mIGV4cG9zdXJlLjwvcD4KKyAgICAgKiA8cD5JbiBib3RoIGNhc2VzLCBhbGwgaW1hZ2VzIGdlbmVyYXRlZCBmb3IgYSBwYXJ0aWN1bGFyIGNhcHR1cmUgcmVxdWVzdCBzdGlsbCBjYXJyeSB0aGUgc2FtZQorICAgICAqIHRpbWVzdGFtcHMsIHNvIHRoYXQgdGhleSBjYW4gYmUgdXNlZCB0byBsb29rIHVwIHRoZSBtYXRjaGluZyBmcmFtZSBudW1iZXIgYW5kCisgICAgICogb25DYXB0dXJlU3RhcnRlZCBjYWxsYmFjay48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9TRU5TT1JfU1lOQ19UWVBFID0gICAgICAgICAgICAgLy8gYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfbG9naWNhbF9tdWx0aV9jYW1lcmFfc2Vuc29yX3N5bmNfdHlwZV90KQorICAgICAgICAgICAgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9TVEFSVCArIDEsCisgICAgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9FTkQsCisKKyAgICAvKioKKyAgICAgKiA8cD5Nb2RlIG9mIG9wZXJhdGlvbiBmb3IgdGhlIGxlbnMgZGlzdG9ydGlvbiBjb3JyZWN0aW9uIGJsb2NrLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGJ5dGUgKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2Rpc3RvcnRpb25fY29ycmVjdGlvbl9tb2RlX3QpPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgY2FsbGJhY2tzPC9saT4KKyAgICAgKiAgIDxsaT5BQ2FwdHVyZVJlcXVlc3Q8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+VGhlIGxlbnMgZGlzdG9ydGlvbiBjb3JyZWN0aW9uIGJsb2NrIGF0dGVtcHRzIHRvIGltcHJvdmUgaW1hZ2UgcXVhbGl0eSBieSBmaXhpbmcKKyAgICAgKiByYWRpYWwsIHRhbmdlbnRpYWwsIG9yIG90aGVyIGdlb21ldHJpYyBhYmVycmF0aW9ucyBpbiB0aGUgY2FtZXJhIGRldmljZSdzIG9wdGljcy4gIElmCisgICAgICogYXZhaWxhYmxlLCB0aGUgQUNBTUVSQV9MRU5TX0RJU1RPUlRJT04gZmllbGQgZG9jdW1lbnRzIHRoZSBsZW5zJ3MgZGlzdG9ydGlvbiBwYXJhbWV0ZXJzLjwvcD4KKyAgICAgKiA8cD5PRkYgbWVhbnMgbm8gZGlzdG9ydGlvbiBjb3JyZWN0aW9uIGlzIGRvbmUuPC9wPgorICAgICAqIDxwPkZBU1QvSElHSF9RVUFMSVRZIGJvdGggbWVhbiBjYW1lcmEgZGV2aWNlIGRldGVybWluZWQgZGlzdG9ydGlvbiBjb3JyZWN0aW9uIHdpbGwgYmUKKyAgICAgKiBhcHBsaWVkLiBISUdIX1FVQUxJVFkgbW9kZSBpbmRpY2F0ZXMgdGhhdCB0aGUgY2FtZXJhIGRldmljZSB3aWxsIHVzZSB0aGUgaGlnaGVzdC1xdWFsaXR5CisgICAgICogY29ycmVjdGlvbiBhbGdvcml0aG1zLCBldmVuIGlmIGl0IHNsb3dzIGRvd24gY2FwdHVyZSByYXRlLiBGQVNUIG1lYW5zIHRoZSBjYW1lcmEgZGV2aWNlCisgICAgICogd2lsbCBub3Qgc2xvdyBkb3duIGNhcHR1cmUgcmF0ZSB3aGVuIGFwcGx5aW5nIGNvcnJlY3Rpb24uIEZBU1QgbWF5IGJlIHRoZSBzYW1lIGFzIE9GRiBpZgorICAgICAqIGFueSBjb3JyZWN0aW9uIGF0IGFsbCB3b3VsZCBzbG93IGRvd24gY2FwdHVyZSByYXRlLiAgRXZlcnkgb3V0cHV0IHN0cmVhbSB3aWxsIGhhdmUgYQorICAgICAqIHNpbWlsYXIgYW1vdW50IG9mIGVuaGFuY2VtZW50IGFwcGxpZWQuPC9wPgorICAgICAqIDxwPlRoZSBjb3JyZWN0aW9uIG9ubHkgYXBwbGllcyB0byBwcm9jZXNzZWQgb3V0cHV0cyBzdWNoIGFzIFlVViwgSlBFRywgb3IgREVQVEgxNjsgaXQgaXMgbm90CisgICAgICogYXBwbGllZCB0byBhbnkgUkFXIG91dHB1dC4gIE1ldGFkYXRhIGNvb3JkaW5hdGVzIHN1Y2ggYXMgZmFjZSByZWN0YW5nbGVzIG9yIG1ldGVyaW5nCisgICAgICogcmVnaW9ucyBhcmUgYWxzbyBub3QgYWZmZWN0ZWQgYnkgY29ycmVjdGlvbi48L3A+CisgICAgICogPHA+QXBwbGljYXRpb25zIGVuYWJsaW5nIGRpc3RvcnRpb24gY29ycmVjdGlvbiBuZWVkIHRvIHBheSBleHRyYSBhdHRlbnRpb24gd2hlbiBjb252ZXJ0aW5nCisgICAgICogaW1hZ2UgY29vcmRpbmF0ZXMgYmV0d2VlbiBjb3JyZWN0ZWQgb3V0cHV0IGJ1ZmZlcnMgYW5kIHRoZSBzZW5zb3IgYXJyYXkuIEZvciBleGFtcGxlLCBpZgorICAgICAqIHRoZSBhcHAgc3VwcG9ydHMgdGFwLXRvLWZvY3VzIGFuZCBlbmFibGVzIGNvcnJlY3Rpb24sIGl0IHRoZW4gaGFzIHRvIGFwcGx5IHRoZSBkaXN0b3J0aW9uCisgICAgICogbW9kZWwgZGVzY3JpYmVkIGluIEFDQU1FUkFfTEVOU19ESVNUT1JUSU9OIHRvIHRoZSBpbWFnZSBidWZmZXIgdGFwIGNvb3JkaW5hdGVzIHRvIHByb3Blcmx5CisgICAgICogY2FsY3VsYXRlIHRoZSB0YXAgcG9zaXRpb24gb24gdGhlIHNlbnNvciBhY3RpdmUgYXJyYXkgdG8gYmUgdXNlZCB3aXRoCisgICAgICogQUNBTUVSQV9DT05UUk9MX0FGX1JFR0lPTlMuIFRoZSBzYW1lIGFwcGxpZXMgaW4gcmV2ZXJzZSB0byBkZXRlY3RlZCBmYWNlIHJlY3RhbmdsZXMgaWYKKyAgICAgKiB0aGV5IG5lZWQgdG8gYmUgZHJhd24gb24gdG9wIG9mIHRoZSBjb3JyZWN0ZWQgb3V0cHV0IGJ1ZmZlcnMuPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX0NPTlRST0xfQUZfUkVHSU9OUworICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0RJU1RPUlRJT04KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0RJU1RPUlRJT05fQ09SUkVDVElPTl9NT0RFID0gICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9kaXN0b3J0aW9uX2NvcnJlY3Rpb25fbW9kZV90KQorICAgICAgICAgICAgQUNBTUVSQV9ESVNUT1JUSU9OX0NPUlJFQ1RJT05fU1RBUlQsCisgICAgLyoqCisgICAgICogPHA+TGlzdCBvZiBkaXN0b3J0aW9uIGNvcnJlY3Rpb24gbW9kZXMgZm9yIEFDQU1FUkFfRElTVE9SVElPTl9DT1JSRUNUSU9OX01PREUgdGhhdCBhcmUKKyAgICAgKiBzdXBwb3J0ZWQgYnkgdGhpcyBjYW1lcmEgZGV2aWNlLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9ESVNUT1JUSU9OX0NPUlJFQ1RJT05fTU9ERQorICAgICAqCisgICAgICogPHA+VHlwZTogYnl0ZVtuXTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5ObyBkZXZpY2UgaXMgcmVxdWlyZWQgdG8gc3VwcG9ydCB0aGlzIEFQSTsgc3VjaCBkZXZpY2VzIHdpbGwgYWx3YXlzIGxpc3Qgb25seSAnT0ZGJy4KKyAgICAgKiBBbGwgZGV2aWNlcyB0aGF0IHN1cHBvcnQgdGhpcyBBUEkgd2lsbCBsaXN0IGJvdGggRkFTVCBhbmQgSElHSF9RVUFMSVRZLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0RJU1RPUlRJT05fQ09SUkVDVElPTl9BVkFJTEFCTEVfTU9ERVMgPSAgICAgICAgICAgICAvLyBieXRlW25dCisgICAgICAgICAgICBBQ0FNRVJBX0RJU1RPUlRJT05fQ09SUkVDVElPTl9TVEFSVCArIDEsCisgICAgQUNBTUVSQV9ESVNUT1JUSU9OX0NPUlJFQ1RJT05fRU5ELAorCiB9IGFjYW1lcmFfbWV0YWRhdGFfdGFnX3Q7CiAKIC8qKgpAQCAtNTI4Miw2ICs1NTYzLDIxIEBACiAgICAgICovCiAgICAgQUNBTUVSQV9DT05UUk9MX0FFX01PREVfT05fQVVUT19GTEFTSF9SRURFWUUgICAgICAgICAgICAgICAgICAgICA9IDQsCiAKKyAgICAvKioKKyAgICAgKiA8cD5BbiBleHRlcm5hbCBmbGFzaCBoYXMgYmVlbiB0dXJuZWQgb24uPC9wPgorICAgICAqIDxwPkl0IGluZm9ybXMgdGhlIGNhbWVyYSBkZXZpY2UgdGhhdCBhbiBleHRlcm5hbCBmbGFzaCBoYXMgYmVlbiB0dXJuZWQgb24sIGFuZCB0aGF0CisgICAgICogbWV0ZXJpbmcgKGFuZCBjb250aW51b3VzIGZvY3VzIGlmIGFjdGl2ZSkgc2hvdWxkIGJlIHF1aWNrbHkgcmVjYWN1bGF0ZWQgdG8gYWNjb3VudAorICAgICAqIGZvciB0aGUgZXh0ZXJuYWwgZmxhc2guIE90aGVyd2lzZSwgdGhpcyBtb2RlIGFjdHMgbGlrZSBPTi48L3A+CisgICAgICogPHA+V2hlbiB0aGUgZXh0ZXJuYWwgZmxhc2ggaXMgdHVybmVkIG9mZiwgQUUgbW9kZSBzaG91bGQgYmUgY2hhbmdlZCB0byBvbmUgb2YgdGhlCisgICAgICogb3RoZXIgYXZhaWxhYmxlIEFFIG1vZGVzLjwvcD4KKyAgICAgKiA8cD5JZiB0aGUgY2FtZXJhIGRldmljZSBzdXBwb3J0cyBBRSBleHRlcm5hbCBmbGFzaCBtb2RlLCBBQ0FNRVJBX0NPTlRST0xfQUVfU1RBVEUgbXVzdAorICAgICAqIGJlIEZMQVNIX1JFUVVJUkVEIGFmdGVyIHRoZSBjYW1lcmEgZGV2aWNlIGZpbmlzaGVzIEFFIHNjYW4gYW5kIGl0J3MgdG9vIGRhcmsgd2l0aG91dAorICAgICAqIGZsYXNoLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9DT05UUk9MX0FFX1NUQVRFCisgICAgICovCisgICAgQUNBTUVSQV9DT05UUk9MX0FFX01PREVfT05fRVhURVJOQUxfRkxBU0ggICAgICAgICAgICAgICAgICAgICAgICA9IDUsCisKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfY29udHJvbF9hZV9tb2RlX3Q7CiAKIC8vIEFDQU1FUkFfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX1RSSUdHRVIKQEAgLTU2NDUsNiArNTk0MSwxNSBAQAogICAgICAqLwogICAgIEFDQU1FUkFfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVF9NQU5VQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LAogCisgICAgLyoqCisgICAgICogPHA+VGhpcyByZXF1ZXN0IGlzIGZvciBhIG1vdGlvbiB0cmFja2luZyB1c2UgY2FzZSwgd2hlcmUKKyAgICAgKiB0aGUgYXBwbGljYXRpb24gd2lsbCB1c2UgY2FtZXJhIGFuZCBpbmVydGlhbCBzZW5zb3IgZGF0YSB0bworICAgICAqIGxvY2F0ZSBhbmQgdHJhY2sgb2JqZWN0cyBpbiB0aGUgd29ybGQuPC9wPgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGF1dG8tZXhwb3N1cmUgcm91dGluZSB3aWxsIGxpbWl0IHRoZSBleHBvc3VyZSB0aW1lCisgICAgICogb2YgdGhlIGNhbWVyYSB0byBubyBtb3JlIHRoYW4gMjAgbWlsbGlzZWNvbmRzLCB0byBtaW5pbWl6ZSBtb3Rpb24gYmx1ci48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9DT05UUk9MX0NBUFRVUkVfSU5URU5UX01PVElPTl9UUkFDS0lORyAgICAgICAgICAgICAgICAgICA9IDcsCisKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfY29udHJvbF9jYXB0dXJlX2ludGVudF90OwogCiAvLyBBQ0FNRVJBX0NPTlRST0xfRUZGRUNUX01PREUKQEAgLTYxMzUsNiArNjQ0MCwyMCBAQAogCiB9IGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2NvbnRyb2xfZW5hYmxlX3pzbF90OwogCisvLyBBQ0FNRVJBX0NPTlRST0xfQUZfU0NFTkVfQ0hBTkdFCit0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfY29udHJvbF9hZl9zY2VuZV9jaGFuZ2UgeworICAgIC8qKgorICAgICAqIDxwPlNjZW5lIGNoYW5nZSBpcyBub3QgZGV0ZWN0ZWQgd2l0aGluIHRoZSBBRiByZWdpb24ocykuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfQ09OVFJPTF9BRl9TQ0VORV9DSEFOR0VfTk9UX0RFVEVDVEVEICAgICAgICAgICAgICAgICAgICAgPSAwLAorCisgICAgLyoqCisgICAgICogPHA+U2NlbmUgY2hhbmdlIGlzIGRldGVjdGVkIHdpdGhpbiB0aGUgQUYgcmVnaW9uKHMpLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0NPTlRST0xfQUZfU0NFTkVfQ0hBTkdFX0RFVEVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwKKworfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9jb250cm9sX2FmX3NjZW5lX2NoYW5nZV90OworCiAKIAogLy8gQUNBTUVSQV9FREdFX01PREUKQEAgLTYxNTcsMTMgKzY0NzYsMTMgQEAKICAgICBBQ0FNRVJBX0VER0VfTU9ERV9ISUdIX1FVQUxJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwKIAogICAgIC8qKgotICAgICAqIDxwPkVkZ2UgZW5oYW5jZW1lbnQgaXMgYXBwbGllZCBhdCBkaWZmZXJlbnQgbGV2ZWxzIGZvciBkaWZmZXJlbnQgb3V0cHV0IHN0cmVhbXMsCi0gICAgICogYmFzZWQgb24gcmVzb2x1dGlvbi4gU3RyZWFtcyBhdCBtYXhpbXVtIHJlY29yZGluZyByZXNvbHV0aW9uIChzZWUge0BsaW5rCi0gICAgICogQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbn0pIG9yIGJlbG93IGhhdmUKLSAgICAgKiBlZGdlIGVuaGFuY2VtZW50IGFwcGxpZWQsIHdoaWxlIGhpZ2hlci1yZXNvbHV0aW9uIHN0cmVhbXMgaGF2ZSBubyBlZGdlIGVuaGFuY2VtZW50Ci0gICAgICogYXBwbGllZC4gVGhlIGxldmVsIG9mIGVkZ2UgZW5oYW5jZW1lbnQgZm9yIGxvdy1yZXNvbHV0aW9uIHN0cmVhbXMgaXMgdHVuZWQgc28gdGhhdAotICAgICAqIGZyYW1lIHJhdGUgaXMgbm90IGltcGFjdGVkLCBhbmQgdGhlIHF1YWxpdHkgaXMgZXF1YWwgdG8gb3IgYmV0dGVyIHRoYW4gRkFTVCAoc2luY2UgaXQKLSAgICAgKiBpcyBvbmx5IGFwcGxpZWQgdG8gbG93ZXItcmVzb2x1dGlvbiBvdXRwdXRzLCBxdWFsaXR5IG1heSBpbXByb3ZlIGZyb20gRkFTVCkuPC9wPgorICAgICAqIDxwPkVkZ2UgZW5oYW5jZW1lbnQgaXMgYXBwbGllZCBhdCBkaWZmZXJlbnQKKyAgICAgKiBsZXZlbHMgZm9yIGRpZmZlcmVudCBvdXRwdXQgc3RyZWFtcywgYmFzZWQgb24gcmVzb2x1dGlvbi4gU3RyZWFtcyBhdCBtYXhpbXVtIHJlY29yZGluZworICAgICAqIHJlc29sdXRpb24gKHNlZSB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbiB9KQorICAgICAqIG9yIGJlbG93IGhhdmUgZWRnZSBlbmhhbmNlbWVudCBhcHBsaWVkLCB3aGlsZSBoaWdoZXItcmVzb2x1dGlvbiBzdHJlYW1zIGhhdmUgbm8gZWRnZQorICAgICAqIGVuaGFuY2VtZW50IGFwcGxpZWQuIFRoZSBsZXZlbCBvZiBlZGdlIGVuaGFuY2VtZW50IGZvciBsb3ctcmVzb2x1dGlvbiBzdHJlYW1zIGlzIHR1bmVkCisgICAgICogc28gdGhhdCBmcmFtZSByYXRlIGlzIG5vdCBpbXBhY3RlZCwgYW5kIHRoZSBxdWFsaXR5IGlzIGVxdWFsIHRvIG9yIGJldHRlciB0aGFuIEZBU1QKKyAgICAgKiAoc2luY2UgaXQgaXMgb25seSBhcHBsaWVkIHRvIGxvd2VyLXJlc29sdXRpb24gb3V0cHV0cywgcXVhbGl0eSBtYXkgaW1wcm92ZSBmcm9tIEZBU1QpLjwvcD4KICAgICAgKiA8cD5UaGlzIG1vZGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMgb3BlcmF0aW5nIGluIGEgemVyby1zaHV0dGVyLWxhZyBtb2RlCiAgICAgICogd2l0aCBZVVYgb3IgUFJJVkFURSByZXByb2Nlc3NpbmcsIHdoZXJlIHRoZSBhcHBsaWNhdGlvbiBjb250aW51b3VzbHkgY2FwdHVyZXMKICAgICAgKiBoaWdoLXJlc29sdXRpb24gaW50ZXJtZWRpYXRlIGJ1ZmZlcnMgaW50byBhIGNpcmN1bGFyIGJ1ZmZlciwgZnJvbSB3aGljaCBhIGZpbmFsIGltYWdlIGlzCkBAIC02MzQyLDYgKzY2NjEsMjcgQEAKIAogfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9sZW5zX3N0YXRlX3Q7CiAKKy8vIEFDQU1FUkFfTEVOU19QT1NFX1JFRkVSRU5DRQordHlwZWRlZiBlbnVtIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hY2FtZXJhX2xlbnNfcG9zZV9yZWZlcmVuY2UgeworICAgIC8qKgorICAgICAqIDxwPlRoZSB2YWx1ZSBvZiBBQ0FNRVJBX0xFTlNfUE9TRV9UUkFOU0xBVElPTiBpcyByZWxhdGl2ZSB0byB0aGUgb3B0aWNhbCBjZW50ZXIgb2YKKyAgICAgKiB0aGUgbGFyZ2VzdCBjYW1lcmEgZGV2aWNlIGZhY2luZyB0aGUgc2FtZSBkaXJlY3Rpb24gYXMgdGhpcyBjYW1lcmEuPC9wPgorICAgICAqIDxwPlRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIEFQSSBsZXZlbHMgYmVmb3JlIEFuZHJvaWQgUC48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19QT1NFX1RSQU5TTEFUSU9OCisgICAgICovCisgICAgQUNBTUVSQV9MRU5TX1BPU0VfUkVGRVJFTkNFX1BSSU1BUllfQ0FNRVJBICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgdmFsdWUgb2YgQUNBTUVSQV9MRU5TX1BPU0VfVFJBTlNMQVRJT04gaXMgcmVsYXRpdmUgdG8gdGhlIHBvc2l0aW9uIG9mIHRoZQorICAgICAqIHByaW1hcnkgZ3lyb3Njb3BlIG9mIHRoaXMgQW5kcm9pZCBkZXZpY2UuPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfUE9TRV9UUkFOU0xBVElPTgorICAgICAqLworICAgIEFDQU1FUkFfTEVOU19QT1NFX1JFRkVSRU5DRV9HWVJPU0NPUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLAorCit9IGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2xlbnNfcG9zZV9yZWZlcmVuY2VfdDsKKwogCiAvLyBBQ0FNRVJBX0xFTlNfSU5GT19GT0NVU19ESVNUQU5DRV9DQUxJQlJBVElPTgogdHlwZWRlZiBlbnVtIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hY2FtZXJhX2xlbnNfaW5mb19mb2N1c19kaXN0YW5jZV9jYWxpYnJhdGlvbiB7CkBAIC02NDEyLDEzICs2NzUyLDEyIEBACiAKICAgICAvKioKICAgICAgKiA8cD5Ob2lzZSByZWR1Y3Rpb24gaXMgYXBwbGllZCBhdCBkaWZmZXJlbnQgbGV2ZWxzIGZvciBkaWZmZXJlbnQgb3V0cHV0IHN0cmVhbXMsCi0gICAgICogYmFzZWQgb24gcmVzb2x1dGlvbi4gU3RyZWFtcyBhdCBtYXhpbXVtIHJlY29yZGluZyByZXNvbHV0aW9uIChzZWUge0BsaW5rCi0gICAgICogQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbn0pIG9yIGJlbG93IGhhdmUgbm9pc2UKLSAgICAgKiByZWR1Y3Rpb24gYXBwbGllZCwgd2hpbGUgaGlnaGVyLXJlc29sdXRpb24gc3RyZWFtcyBoYXZlIE1JTklNQUwgKGlmIHN1cHBvcnRlZCkgb3Igbm8KLSAgICAgKiBub2lzZSByZWR1Y3Rpb24gYXBwbGllZCAoaWYgTUlOSU1BTCBpcyBub3Qgc3VwcG9ydGVkLikgVGhlIGRlZ3JlZSBvZiBub2lzZSByZWR1Y3Rpb24KLSAgICAgKiBmb3IgbG93LXJlc29sdXRpb24gc3RyZWFtcyBpcyB0dW5lZCBzbyB0aGF0IGZyYW1lIHJhdGUgaXMgbm90IGltcGFjdGVkLCBhbmQgdGhlIHF1YWxpdHkKLSAgICAgKiBpcyBlcXVhbCB0byBvciBiZXR0ZXIgdGhhbiBGQVNUIChzaW5jZSBpdCBpcyBvbmx5IGFwcGxpZWQgdG8gbG93ZXItcmVzb2x1dGlvbiBvdXRwdXRzLAotICAgICAqIHF1YWxpdHkgbWF5IGltcHJvdmUgZnJvbSBGQVNUKS48L3A+CisgICAgICogYmFzZWQgb24gcmVzb2x1dGlvbi4gU3RyZWFtcyBhdCBtYXhpbXVtIHJlY29yZGluZyByZXNvbHV0aW9uIChzZWUge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb24gfSkKKyAgICAgKiBvciBiZWxvdyBoYXZlIG5vaXNlIHJlZHVjdGlvbiBhcHBsaWVkLCB3aGlsZSBoaWdoZXItcmVzb2x1dGlvbiBzdHJlYW1zIGhhdmUgTUlOSU1BTCAoaWYKKyAgICAgKiBzdXBwb3J0ZWQpIG9yIG5vIG5vaXNlIHJlZHVjdGlvbiBhcHBsaWVkIChpZiBNSU5JTUFMIGlzIG5vdCBzdXBwb3J0ZWQuKSBUaGUgZGVncmVlIG9mCisgICAgICogbm9pc2UgcmVkdWN0aW9uIGZvciBsb3ctcmVzb2x1dGlvbiBzdHJlYW1zIGlzIHR1bmVkIHNvIHRoYXQgZnJhbWUgcmF0ZSBpcyBub3QgaW1wYWN0ZWQsCisgICAgICogYW5kIHRoZSBxdWFsaXR5IGlzIGVxdWFsIHRvIG9yIGJldHRlciB0aGFuIEZBU1QgKHNpbmNlIGl0IGlzIG9ubHkgYXBwbGllZCB0bworICAgICAqIGxvd2VyLXJlc29sdXRpb24gb3V0cHV0cywgcXVhbGl0eSBtYXkgaW1wcm92ZSBmcm9tIEZBU1QpLjwvcD4KICAgICAgKiA8cD5UaGlzIG1vZGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMgb3BlcmF0aW5nIGluIGEgemVyby1zaHV0dGVyLWxhZyBtb2RlCiAgICAgICogd2l0aCBZVVYgb3IgUFJJVkFURSByZXByb2Nlc3NpbmcsIHdoZXJlIHRoZSBhcHBsaWNhdGlvbiBjb250aW51b3VzbHkgY2FwdHVyZXMKICAgICAgKiBoaWdoLXJlc29sdXRpb24gaW50ZXJtZWRpYXRlIGJ1ZmZlcnMgaW50byBhIGNpcmN1bGFyIGJ1ZmZlciwgZnJvbSB3aGljaCBhIGZpbmFsIGltYWdlIGlzCkBAIC02NjM1LDE4ICs2OTc0LDE2IEBACiAgICAgICogdG8gRkFTVC4gQWRkaXRpb25hbGx5LCBtYXhpbXVtLXJlc29sdXRpb24gaW1hZ2VzIGNhbiBiZSBjYXB0dXJlZCBhdCAmZ3Q7PSAxMCBmcmFtZXMKICAgICAgKiBwZXIgc2Vjb25kLiAgSGVyZSwgJ2hpZ2ggcmVzb2x1dGlvbicgbWVhbnMgYXQgbGVhc3QgOCBtZWdhcGl4ZWxzLCBvciB0aGUgbWF4aW11bQogICAgICAqIHJlc29sdXRpb24gb2YgdGhlIGRldmljZSwgd2hpY2hldmVyIGlzIHNtYWxsZXIuPC9wPgotICAgICAqIDxwPk1vcmUgc3BlY2lmaWNhbGx5LCB0aGlzIG1lYW5zIHRoYXQgYXQgbGVhc3Qgb25lIG91dHB1dCB7QGxpbmsKLSAgICAgKiBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4fSBzaXplIGxpc3RlZCBpbgotICAgICAqIHtAbGluayBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TfSBpcyBsYXJnZXIgb3IgZXF1YWwgdG8gdGhlCi0gICAgICogJ2hpZ2ggcmVzb2x1dGlvbicgZGVmaW5lZCBhYm92ZSwgYW5kIGNhbiBiZSBjYXB0dXJlZCBhdCBhdCBsZWFzdCAyMCBmcHMuCi0gICAgICogRm9yIHRoZSBsYXJnZXN0IHtAbGluayBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4fSBzaXplIGxpc3RlZCBpbgotICAgICAqIHtAbGluayBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TfSwgY2FtZXJhIGRldmljZSBjYW4gY2FwdHVyZSB0aGlzCi0gICAgICogc2l6ZSBmb3IgYXQgbGVhc3QgMTAgZnJhbWVzIHBlciBzZWNvbmQuCi0gICAgICogQWxzbyB0aGUgQUNBTUVSQV9DT05UUk9MX0FFX0FWQUlMQUJMRV9UQVJHRVRfRlBTX1JBTkdFUyBlbnRyeSBsaXN0cyBhdCBsZWFzdCBvbmUgRlBTIHJhbmdlCi0gICAgICogd2hlcmUgdGhlIG1pbmltdW0gRlBTIGlzICZndDs9IDEgLyBtaW5pbXVtRnJhbWVEdXJhdGlvbiBmb3IgdGhlIGxhcmdlc3QgWVVWXzQyMF84ODggc2l6ZS48L3A+Ci0gICAgICogPHA+SWYgdGhlIGRldmljZSBzdXBwb3J0cyB0aGUge0BsaW5rIEFJTUFHRV9GT1JNQVRfUkFXMTB9LCB7QGxpbmsKLSAgICAgKiBBSU1BR0VfRk9STUFUX1JBVzEyfSwgdGhlbiB0aG9zZSBjYW4gYWxzbyBiZSBjYXB0dXJlZCBhdCB0aGUgc2FtZSByYXRlCi0gICAgICogYXMgdGhlIG1heGltdW0tc2l6ZSBZVVZfNDIwXzg4OCByZXNvbHV0aW9uIGlzLjwvcD4KKyAgICAgKiA8cD5Nb3JlIHNwZWNpZmljYWxseSwgdGhpcyBtZWFucyB0aGF0IGF0IGxlYXN0IG9uZSBvdXRwdXQge0BsaW5rIEFJTUFHRV9GT1JNQVRfWVVWXzQyMF84ODggfSBzaXplIGxpc3RlZCBpbgorICAgICAqIHtAbGluayBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TIH0KKyAgICAgKiBpcyBsYXJnZXIgb3IgZXF1YWwgdG8gdGhlICdoaWdoIHJlc29sdXRpb24nIGRlZmluZWQgYWJvdmUsIGFuZCBjYW4gYmUgY2FwdHVyZWQgYXQgYXQKKyAgICAgKiBsZWFzdCAyMCBmcHMuICBGb3IgdGhlIGxhcmdlc3Qge0BsaW5rIEFJTUFHRV9GT1JNQVRfWVVWXzQyMF84ODggfSBzaXplIGxpc3RlZCBpbgorICAgICAqIHtAbGluayBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TIH0sCisgICAgICogY2FtZXJhIGRldmljZSBjYW4gY2FwdHVyZSB0aGlzIHNpemUgZm9yIGF0IGxlYXN0IDEwIGZyYW1lcyBwZXIgc2Vjb25kLiAgQWxzbyB0aGUKKyAgICAgKiBBQ0FNRVJBX0NPTlRST0xfQUVfQVZBSUxBQkxFX1RBUkdFVF9GUFNfUkFOR0VTIGVudHJ5IGxpc3RzIGF0IGxlYXN0IG9uZSBGUFMgcmFuZ2Ugd2hlcmUKKyAgICAgKiB0aGUgbWluaW11bSBGUFMgaXMgJmd0Oz0gMSAvIG1pbmltdW1GcmFtZUR1cmF0aW9uIGZvciB0aGUgbGFyZ2VzdCBZVVZfNDIwXzg4OCBzaXplLjwvcD4KKyAgICAgKiA8cD5JZiB0aGUgZGV2aWNlIHN1cHBvcnRzIHRoZSB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9SQVcxMCB9LCB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9SQVcxMiB9LCB0aGVuIHRob3NlIGNhbiBhbHNvIGJlCisgICAgICogY2FwdHVyZWQgYXQgdGhlIHNhbWUgcmF0ZSBhcyB0aGUgbWF4aW11bS1zaXplIFlVVl80MjBfODg4IHJlc29sdXRpb24gaXMuPC9wPgogICAgICAqIDxwPkluIGFkZGl0aW9uLCB0aGUgQUNBTUVSQV9TWU5DX01BWF9MQVRFTkNZIGZpZWxkIGlzIGd1YXJhbnRlZCB0byBoYXZlIGEgdmFsdWUgYmV0d2VlbiAwCiAgICAgICogYW5kIDQsIGluY2x1c2l2ZS4gQUNBTUVSQV9DT05UUk9MX0FFX0xPQ0tfQVZBSUxBQkxFIGFuZCBBQ0FNRVJBX0NPTlRST0xfQVdCX0xPQ0tfQVZBSUxBQkxFCiAgICAgICogYXJlIGFsc28gZ3VhcmFudGVlZCB0byBiZSA8Y29kZT50cnVlPC9jb2RlPiBzbyBidXJzdCBjYXB0dXJlIHdpdGggdGhlc2UgdHdvIGxvY2tzIE9OIHlpZWxkcwpAQCAtNjY2Myw0MiArNzAwMCwxMTAgQEAKICAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBjYW4gcHJvZHVjZSBkZXB0aCBtZWFzdXJlbWVudHMgZnJvbSBpdHMgZmllbGQgb2Ygdmlldy48L3A+CiAgICAgICogPHA+VGhpcyBjYXBhYmlsaXR5IHJlcXVpcmVzIHRoZSBjYW1lcmEgZGV2aWNlIHRvIHN1cHBvcnQgdGhlIGZvbGxvd2luZzo8L3A+CiAgICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgQUlNQUdFX0ZPUk1BVF9ERVBUSDE2fSBpcyBzdXBwb3J0ZWQgYXMgYW4gb3V0cHV0IGZvcm1hdC48L2xpPgotICAgICAqIDxsaT57QGxpbmsgQUlNQUdFX0ZPUk1BVF9ERVBUSF9QT0lOVF9DTE9VRH0gaXMgb3B0aW9uYWxseSBzdXBwb3J0ZWQgYXMgYW4KLSAgICAgKiAgIG91dHB1dCBmb3JtYXQuPC9saT4KLSAgICAgKiA8bGk+VGhpcyBjYW1lcmEgZGV2aWNlLCBhbmQgYWxsIGNhbWVyYSBkZXZpY2VzIHdpdGggdGhlIHNhbWUgQUNBTUVSQV9MRU5TX0ZBQ0lORywKLSAgICAgKiAgIHdpbGwgbGlzdCB0aGUgZm9sbG93aW5nIGNhbGlicmF0aW9uIGVudHJpZXMgaW4ge0BsaW5rIEFDYW1lcmFNZXRhZGF0YX0gZnJvbSBib3RoCi0gICAgICogICB7QGxpbmsgQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzfSBhbmQKLSAgICAgKiAgIHtAbGluayBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdH06PHVsPgorICAgICAqIDxsaT57QGxpbmsgQUlNQUdFX0ZPUk1BVF9ERVBUSDE2IH0gaXMgc3VwcG9ydGVkIGFzCisgICAgICogICBhbiBvdXRwdXQgZm9ybWF0LjwvbGk+CisgICAgICogPGxpPntAbGluayBBSU1BR0VfRk9STUFUX0RFUFRIX1BPSU5UX0NMT1VEIH0gaXMKKyAgICAgKiAgIG9wdGlvbmFsbHkgc3VwcG9ydGVkIGFzIGFuIG91dHB1dCBmb3JtYXQuPC9saT4KKyAgICAgKiA8bGk+VGhpcyBjYW1lcmEgZGV2aWNlLCBhbmQgYWxsIGNhbWVyYSBkZXZpY2VzIHdpdGggdGhlIHNhbWUgQUNBTUVSQV9MRU5TX0ZBQ0lORywgd2lsbAorICAgICAqICAgbGlzdCB0aGUgZm9sbG93aW5nIGNhbGlicmF0aW9uIG1ldGFkYXRhIGVudHJpZXMgaW4gYm90aCB7QGxpbmsgQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzIH0KKyAgICAgKiAgIGFuZCB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgfTo8dWw+CiAgICAgICogPGxpPkFDQU1FUkFfTEVOU19QT1NFX1RSQU5TTEFUSU9OPC9saT4KICAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX1BPU0VfUk9UQVRJT048L2xpPgogICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfSU5UUklOU0lDX0NBTElCUkFUSU9OPC9saT4KLSAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX1JBRElBTF9ESVNUT1JUSU9OPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX0RJU1RPUlRJT048L2xpPgogICAgICAqIDwvdWw+CiAgICAgICogPC9saT4KICAgICAgKiA8bGk+VGhlIEFDQU1FUkFfREVQVEhfREVQVEhfSVNfRVhDTFVTSVZFIGVudHJ5IGlzIGxpc3RlZCBieSB0aGlzIGRldmljZS48L2xpPgorICAgICAqIDxsaT5BcyBvZiBBbmRyb2lkIFAsIHRoZSBBQ0FNRVJBX0xFTlNfUE9TRV9SRUZFUkVOQ0UgZW50cnkgaXMgbGlzdGVkIGJ5IHRoaXMgZGV2aWNlLjwvbGk+CiAgICAgICogPGxpPkEgTElNSVRFRCBjYW1lcmEgd2l0aCBvbmx5IHRoZSBERVBUSF9PVVRQVVQgY2FwYWJpbGl0eSBkb2VzIG5vdCBoYXZlIHRvIHN1cHBvcnQKICAgICAgKiAgIG5vcm1hbCBZVVZfNDIwXzg4OCwgSlBFRywgYW5kIFBSSVYtZm9ybWF0IG91dHB1dHMuIEl0IG9ubHkgaGFzIHRvIHN1cHBvcnQgdGhlIERFUFRIMTYKICAgICAgKiAgIGZvcm1hdC48L2xpPgogICAgICAqIDwvdWw+CiAgICAgICogPHA+R2VuZXJhbGx5LCBkZXB0aCBvdXRwdXQgb3BlcmF0ZXMgYXQgYSBzbG93ZXIgZnJhbWUgcmF0ZSB0aGFuIHN0YW5kYXJkIGNvbG9yIGNhcHR1cmUsCiAgICAgICogc28gdGhlIERFUFRIMTYgYW5kIERFUFRIX1BPSU5UX0NMT1VEIGZvcm1hdHMgd2lsbCBjb21tb25seSBoYXZlIGEgc3RhbGwgZHVyYXRpb24gdGhhdAotICAgICAqIHNob3VsZCBiZSBhY2NvdW50ZWQgZm9yIChzZWUKLSAgICAgKiB7QGxpbmsgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RBTExfRFVSQVRJT05TfSkuCisgICAgICogc2hvdWxkIGJlIGFjY291bnRlZCBmb3IgKHNlZSB7QGxpbmsgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RBTExfRFVSQVRJT05TIH0pLgogICAgICAqIE9uIGEgZGV2aWNlIHRoYXQgc3VwcG9ydHMgYm90aCBkZXB0aCBhbmQgY29sb3ItYmFzZWQgb3V0cHV0LCB0byBlbmFibGUgc21vb3RoIHByZXZpZXcsCiAgICAgICogdXNpbmcgYSByZXBlYXRpbmcgYnVyc3QgaXMgcmVjb21tZW5kZWQsIHdoZXJlIGEgZGVwdGgtb3V0cHV0IHRhcmdldCBpcyBvbmx5IGluY2x1ZGVkCiAgICAgICogb25jZSBldmVyeSBOIGZyYW1lcywgd2hlcmUgTiBpcyB0aGUgcmF0aW8gYmV0d2VlbiBwcmV2aWV3IG91dHB1dCByYXRlIGFuZCBkZXB0aCBvdXRwdXQKICAgICAgKiByYXRlLCBpbmNsdWRpbmcgZGVwdGggc3RhbGwgdGltZS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfREVQVEhfREVQVEhfSVNfRVhDTFVTSVZFCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfRElTVE9SVElPTgogICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0ZBQ0lORwogICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfUkVGRVJFTkNFCiAgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfUE9TRV9ST1RBVElPTgogICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfVFJBTlNMQVRJT04KLSAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19SQURJQUxfRElTVE9SVElPTgogICAgICAqLwogICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0RFUFRIX09VVFBVVCAgICAgICAgICAgICAgPSA4LAogCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2Ugc3VwcG9ydHMgdGhlIE1PVElPTl9UUkFDS0lORyB2YWx1ZSBmb3IKKyAgICAgKiBBQ0FNRVJBX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlQsIHdoaWNoIGxpbWl0cyBtYXhpbXVtIGV4cG9zdXJlIHRpbWUgdG8gMjAgbXMuPC9wPgorICAgICAqIDxwPlRoaXMgbGltaXRzIHRoZSBtb3Rpb24gYmx1ciBvZiBjYXB0dXJlIGltYWdlcywgcmVzdWx0aW5nIGluIGJldHRlciBpbWFnZSB0cmFja2luZworICAgICAqIHJlc3VsdHMgZm9yIHVzZSBjYXNlcyBzdWNoIGFzIGltYWdlIHN0YWJpbGl6YXRpb24gb3IgYXVnbWVudGVkIHJlYWxpdHkuPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlQKKyAgICAgKi8KKyAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19NT1RJT05fVFJBQ0tJTkcgICAgICAgICAgID0gMTAsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBpcyBhIGxvZ2ljYWwgY2FtZXJhIGJhY2tlZCBieSB0d28gb3IgbW9yZSBwaHlzaWNhbCBjYW1lcmFzIHRoYXQgYXJlCisgICAgICogYWxzbyBleHBvc2VkIHRvIHRoZSBhcHBsaWNhdGlvbi48L3A+CisgICAgICogPHA+VGhpcyBjYXBhYmlsaXR5IHJlcXVpcmVzIHRoZSBjYW1lcmEgZGV2aWNlIHRvIHN1cHBvcnQgdGhlIGZvbGxvd2luZzo8L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT5UaGlzIGNhbWVyYSBkZXZpY2UgbXVzdCBsaXN0IHRoZSBmb2xsb3dpbmcgc3RhdGljIG1ldGFkYXRhIGVudHJpZXMgaW4gPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuaHRtbCI+Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9hPjo8dWw+CisgICAgICogPGxpPmFuZHJvaWQubG9naWNhbE11bHRpQ2FtZXJhLnBoeXNpY2FsSWRzPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9TRU5TT1JfU1lOQ19UWVBFPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvbGk+CisgICAgICogPGxpPlRoZSB1bmRlcmx5aW5nIHBoeXNpY2FsIGNhbWVyYXMnIHN0YXRpYyBtZXRhZGF0YSBtdXN0IGxpc3QgdGhlIGZvbGxvd2luZyBlbnRyaWVzLAorICAgICAqICAgc28gdGhhdCB0aGUgYXBwbGljYXRpb24gY2FuIGNvcnJlbGF0ZSBwaXhlbHMgZnJvbSB0aGUgcGh5c2ljYWwgc3RyZWFtczo8dWw+CisgICAgICogPGxpPkFDQU1FUkFfTEVOU19QT1NFX1JFRkVSRU5DRTwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfTEVOU19QT1NFX1JPVEFUSU9OPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX1BPU0VfVFJBTlNMQVRJT048L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfSU5UUklOU0lDX0NBTElCUkFUSU9OPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX0RJU1RPUlRJT048L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9saT4KKyAgICAgKiA8bGk+VGhlIFNFTlNPUl9JTkZPX1RJTUVTVEFNUF9TT1VSQ0Ugb2YgdGhlIGxvZ2ljYWwgZGV2aWNlIGFuZCBwaHlzaWNhbCBkZXZpY2VzIG11c3QgYmUKKyAgICAgKiAgIHRoZSBzYW1lLjwvbGk+CisgICAgICogPGxpPlRoZSBsb2dpY2FsIGNhbWVyYSBkZXZpY2UgbXVzdCBiZSBMSU1JVEVEIG9yIGhpZ2hlciBkZXZpY2UuPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPkJvdGggdGhlIGxvZ2ljYWwgY2FtZXJhIGRldmljZSBhbmQgaXRzIHVuZGVybHlpbmcgcGh5c2ljYWwgZGV2aWNlcyBzdXBwb3J0IHRoZQorICAgICAqIG1hbmRhdG9yeSBzdHJlYW0gY29tYmluYXRpb25zIHJlcXVpcmVkIGZvciB0aGVpciBkZXZpY2UgbGV2ZWxzLjwvcD4KKyAgICAgKiA8cD5BZGRpdGlvbmFsbHksIGZvciBlYWNoIGd1YXJhbnRlZWQgc3RyZWFtIGNvbWJpbmF0aW9uLCB0aGUgbG9naWNhbCBjYW1lcmEgc3VwcG9ydHM6PC9wPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+Rm9yIGVhY2ggZ3VhcmFudGVlZCBzdHJlYW0gY29tYmluYXRpb24sIHRoZSBsb2dpY2FsIGNhbWVyYSBzdXBwb3J0cyByZXBsYWNpbmcgb25lCisgICAgICogICBsb2dpY2FsIHtAbGluayBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4IFlVVl80MjBfODg4fQorICAgICAqICAgb3IgcmF3IHN0cmVhbSB3aXRoIHR3byBwaHlzaWNhbCBzdHJlYW1zIG9mIHRoZSBzYW1lIHNpemUgYW5kIGZvcm1hdCwgZWFjaCBmcm9tIGEKKyAgICAgKiAgIHNlcGFyYXRlIHBoeXNpY2FsIGNhbWVyYSwgZ2l2ZW4gdGhhdCB0aGUgc2l6ZSBhbmQgZm9ybWF0IGFyZSBzdXBwb3J0ZWQgYnkgYm90aAorICAgICAqICAgcGh5c2ljYWwgY2FtZXJhcy48L2xpPgorICAgICAqIDxsaT5JZiB0aGUgbG9naWNhbCBjYW1lcmEgZG9lc24ndCBhZHZlcnRpc2UgUkFXIGNhcGFiaWxpdHksIGJ1dCB0aGUgdW5kZXJseWluZyBwaHlzaWNhbAorICAgICAqICAgY2FtZXJhcyBkbywgdGhlIGxvZ2ljYWwgY2FtZXJhIHdpbGwgc3VwcG9ydCBndWFyYW50ZWVkIHN0cmVhbSBjb21iaW5hdGlvbnMgZm9yIFJBVworICAgICAqICAgY2FwYWJpbGl0eSwgZXhjZXB0IHRoYXQgdGhlIFJBVyBzdHJlYW1zIHdpbGwgYmUgcGh5c2ljYWwgc3RyZWFtcywgZWFjaCBmcm9tIGEgc2VwYXJhdGUKKyAgICAgKiAgIHBoeXNpY2FsIGNhbWVyYS4gVGhpcyBpcyB1c3VhbGx5IHRoZSBjYXNlIHdoZW4gdGhlIHBoeXNpY2FsIGNhbWVyYXMgaGF2ZSBkaWZmZXJlbnQKKyAgICAgKiAgIHNlbnNvciBzaXplcy48L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+VXNpbmcgcGh5c2ljYWwgc3RyZWFtcyBpbiBwbGFjZSBvZiBhIGxvZ2ljYWwgc3RyZWFtIG9mIHRoZSBzYW1lIHNpemUgYW5kIGZvcm1hdCB3aWxsCisgICAgICogbm90IHNsb3cgZG93biB0aGUgZnJhbWUgcmF0ZSBvZiB0aGUgY2FwdHVyZSwgYXMgbG9uZyBhcyB0aGUgbWluaW11bSBmcmFtZSBkdXJhdGlvbgorICAgICAqIG9mIHRoZSBwaHlzaWNhbCBhbmQgbG9naWNhbCBzdHJlYW1zIGFyZSB0aGUgc2FtZS48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19ESVNUT1JUSU9OCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfSU5UUklOU0lDX0NBTElCUkFUSU9OCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfUE9TRV9SRUZFUkVOQ0UKKyAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19QT1NFX1JPVEFUSU9OCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfUE9TRV9UUkFOU0xBVElPTgorICAgICAqIEBzZWUgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9TRU5TT1JfU1lOQ19UWVBFCisgICAgICovCisgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTE9HSUNBTF9NVUxUSV9DQU1FUkEgICAgICA9IDExLAorCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgaXMgYSBtb25vY2hyb21lIGNhbWVyYSB0aGF0IGRvZXNuJ3QgY29udGFpbiBhIGNvbG9yIGZpbHRlciBhcnJheSwKKyAgICAgKiBhbmQgdGhlIHBpeGVsIHZhbHVlcyBvbiBVIGFuZCBWIHBsYW5lcyBhcmUgYWxsIDEyOC48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTU9OT0NIUk9NRSAgICAgICAgICAgICAgICA9IDEyLAorCiB9IGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3JlcXVlc3RfYXZhaWxhYmxlX2NhcGFiaWxpdGllc190OwogCiAKQEAgLTY5MTgsOCArNzMyMyw4IEBACiAKICAgICAvKioKICAgICAgKiA8cD5UaW1lc3RhbXBzIGZyb20gQUNBTUVSQV9TRU5TT1JfVElNRVNUQU1QIGFyZSBpbiB0aGUgc2FtZSB0aW1lYmFzZSBhcwotICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL29zL1N5c3RlbUNsb2NrLmh0bWwjZWxhcHNlZFJlYWx0aW1lTmFub3MiPmVsYXBzZWRSZWFsdGltZU5hbm9zPC9hPgotICAgICAqIChvciBDTE9DS19CT09UVElNRSksIGFuZCB0aGV5IGNhbiBiZSBjb21wYXJlZCB0byBvdGhlciB0aW1lc3RhbXBzIHVzaW5nIHRoYXQgYmFzZS48L3A+CisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvb3MvU3lzdGVtQ2xvY2suaHRtbCNlbGFwc2VkUmVhbHRpbWVOYW5vcyI+U3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lTmFub3M8L2E+LAorICAgICAqIGFuZCB0aGV5IGNhbiBiZSBjb21wYXJlZCB0byBvdGhlciB0aW1lc3RhbXBzIHVzaW5nIHRoYXQgYmFzZS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1RJTUVTVEFNUAogICAgICAqLwpAQCAtNzAzMCw2ICs3NDM1LDI2IEBACiAKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc3RhdGlzdGljc19sZW5zX3NoYWRpbmdfbWFwX21vZGVfdDsKIAorLy8gQUNBTUVSQV9TVEFUSVNUSUNTX09JU19EQVRBX01PREUKK3R5cGVkZWYgZW51bSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYWNhbWVyYV9zdGF0aXN0aWNzX29pc19kYXRhX21vZGUgeworICAgIC8qKgorICAgICAqIDxwPkRvIG5vdCBpbmNsdWRlIE9JUyBkYXRhIGluIHRoZSBjYXB0dXJlIHJlc3VsdC48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TVEFUSVNUSUNTX09JU19EQVRBX01PREVfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisKKyAgICAvKioKKyAgICAgKiA8cD5JbmNsdWRlIE9JUyBkYXRhIGluIHRoZSBjYXB0dXJlIHJlc3VsdC48L3A+CisgICAgICogPHA+QUNBTUVSQV9TVEFUSVNUSUNTX09JU19USU1FU1RBTVBTLCBBQ0FNRVJBX1NUQVRJU1RJQ1NfT0lTX1hfU0hJRlRTLAorICAgICAqIGFuZCBBQ0FNRVJBX1NUQVRJU1RJQ1NfT0lTX1lfU0hJRlRTIHByb3ZpZGUgT0lTIGRhdGEgaW4gdGhlIG91dHB1dCByZXN1bHQgbWV0YWRhdGEuPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX1NUQVRJU1RJQ1NfT0lTX1RJTUVTVEFNUFMKKyAgICAgKiBAc2VlIEFDQU1FUkFfU1RBVElTVElDU19PSVNfWF9TSElGVFMKKyAgICAgKiBAc2VlIEFDQU1FUkFfU1RBVElTVElDU19PSVNfWV9TSElGVFMKKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NUQVRJU1RJQ1NfT0lTX0RBVEFfTU9ERV9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwKKworfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zdGF0aXN0aWNzX29pc19kYXRhX21vZGVfdDsKKwogCiAKIC8vIEFDQU1FUkFfVE9ORU1BUF9NT0RFCkBAIC03MTA0LDcgKzc1MjksNyBAQAogICAgICAqIDxwPlRoaXMgY2FtZXJhIGRldmljZSBkb2VzIG5vdCBoYXZlIGVub3VnaCBjYXBhYmlsaXRpZXMgdG8gcXVhbGlmeSBhcyBhIDxjb2RlPkZVTEw8L2NvZGU+IGRldmljZSBvcgogICAgICAqIGJldHRlci48L3A+CiAgICAgICogPHA+T25seSB0aGUgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIGxpc3RlZCBpbiB0aGUgPGNvZGU+TEVHQUNZPC9jb2RlPiBhbmQgPGNvZGU+TElNSVRFRDwvY29kZT4gdGFibGVzIGluIHRoZQotICAgICAqIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9ufSBkb2N1bWVudGF0aW9uIGFyZSBndWFyYW50ZWVkIHRvIGJlIHN1cHBvcnRlZC48L3A+CisgICAgICoge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb24gY3JlYXRlQ2FwdHVyZVNlc3Npb259IGRvY3VtZW50YXRpb24gYXJlIGd1YXJhbnRlZWQgdG8gYmUgc3VwcG9ydGVkLjwvcD4KICAgICAgKiA8cD5BbGwgPGNvZGU+TElNSVRFRDwvY29kZT4gZGV2aWNlcyBzdXBwb3J0IHRoZSA8Y29kZT5CQUNLV0FSRFNfQ09NUEFUSUJMRTwvY29kZT4gY2FwYWJpbGl0eSwgaW5kaWNhdGluZyBiYXNpYwogICAgICAqIHN1cHBvcnQgZm9yIGNvbG9yIGltYWdlIGNhcHR1cmUuIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyB0aGF0IHRoZSBkZXZpY2UgbWF5CiAgICAgICogYWx0ZXJuYXRpdmVseSBzdXBwb3J0IG9ubHkgdGhlIDxjb2RlPkRFUFRIX09VVFBVVDwvY29kZT4gY2FwYWJpbGl0eSwgaWYgaXQgY2FuIG9ubHkgb3V0cHV0IGRlcHRoCkBAIC03MTMwLDcgKzc1NTUsNyBAQAogICAgIC8qKgogICAgICAqIDxwPlRoaXMgY2FtZXJhIGRldmljZSBpcyBjYXBhYmxlIG9mIHN1cHBvcnRpbmcgYWR2YW5jZWQgaW1hZ2luZyBhcHBsaWNhdGlvbnMuPC9wPgogICAgICAqIDxwPlRoZSBzdHJlYW0gY29uZmlndXJhdGlvbnMgbGlzdGVkIGluIHRoZSA8Y29kZT5GVUxMPC9jb2RlPiwgPGNvZGU+TEVHQUNZPC9jb2RlPiBhbmQgPGNvZGU+TElNSVRFRDwvY29kZT4gdGFibGVzIGluIHRoZQotICAgICAqIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9ufSBkb2N1bWVudGF0aW9uIGFyZSBndWFyYW50ZWVkIHRvIGJlIHN1cHBvcnRlZC48L3A+CisgICAgICoge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb24gY3JlYXRlQ2FwdHVyZVNlc3Npb259IGRvY3VtZW50YXRpb24gYXJlIGd1YXJhbnRlZWQgdG8gYmUgc3VwcG9ydGVkLjwvcD4KICAgICAgKiA8cD5BIDxjb2RlPkZVTEw8L2NvZGU+IGRldmljZSB3aWxsIHN1cHBvcnQgYmVsb3cgY2FwYWJpbGl0aWVzOjwvcD4KICAgICAgKiA8dWw+CiAgICAgICogPGxpPjxjb2RlPkJVUlNUX0NBUFRVUkU8L2NvZGU+IGNhcGFiaWxpdHkgKEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTIGNvbnRhaW5zCkBAIC03MTU3LDggKzc1ODIsNyBAQAogCiAgICAgLyoqCiAgICAgICogPHA+VGhpcyBjYW1lcmEgZGV2aWNlIGlzIHJ1bm5pbmcgaW4gYmFja3dhcmQgY29tcGF0aWJpbGl0eSBtb2RlLjwvcD4KLSAgICAgKiA8cD5Pbmx5IHRoZSBzdHJlYW0gY29uZmlndXJhdGlvbnMgbGlzdGVkIGluIHRoZSA8Y29kZT5MRUdBQ1k8L2NvZGU+IHRhYmxlIGluIHRoZSB7QGxpbmsKLSAgICAgKiBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9ufSBkb2N1bWVudGF0aW9uIGFyZSBzdXBwb3J0ZWQuPC9wPgorICAgICAqIDxwPk9ubHkgdGhlIHN0cmVhbSBjb25maWd1cmF0aW9ucyBsaXN0ZWQgaW4gdGhlIDxjb2RlPkxFR0FDWTwvY29kZT4gdGFibGUgaW4gdGhlIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9uIGNyZWF0ZUNhcHR1cmVTZXNzaW9ufSBkb2N1bWVudGF0aW9uIGFyZSBzdXBwb3J0ZWQuPC9wPgogICAgICAqIDxwPkEgPGNvZGU+TEVHQUNZPC9jb2RlPiBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBwZXItZnJhbWUgY29udHJvbCwgbWFudWFsIHNlbnNvciBjb250cm9sLCBtYW51YWwKICAgICAgKiBwb3N0LXByb2Nlc3NpbmcsIGFyYml0cmFyeSBjcm9wcGluZyByZWdpb25zLCBhbmQgaGFzIHJlbGF4ZWQgcGVyZm9ybWFuY2UgY29uc3RyYWludHMuCiAgICAgICogTm8gYWRkaXRpb25hbCBjYXBhYmlsaXRpZXMgYmV5b25kIDxjb2RlPkJBQ0tXQVJEX0NPTVBBVElCTEU8L2NvZGU+IHdpbGwgZXZlciBiZSBsaXN0ZWQgYnkgYQpAQCAtNzE3OSw5ICs3NjAzLDcgQEAKICAgICAgKiA8cD5UaGlzIGNhbWVyYSBkZXZpY2UgaXMgY2FwYWJsZSBvZiBZVVYgcmVwcm9jZXNzaW5nIGFuZCBSQVcgZGF0YSBjYXB0dXJlLCBpbiBhZGRpdGlvbiB0bwogICAgICAqIEZVTEwtbGV2ZWwgY2FwYWJpbGl0aWVzLjwvcD4KICAgICAgKiA8cD5UaGUgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIGxpc3RlZCBpbiB0aGUgPGNvZGU+TEVWRUxfMzwvY29kZT4sIDxjb2RlPlJBVzwvY29kZT4sIDxjb2RlPkZVTEw8L2NvZGU+LCA8Y29kZT5MRUdBQ1k8L2NvZGU+IGFuZAotICAgICAqIDxjb2RlPkxJTUlURUQ8L2NvZGU+IHRhYmxlcyBpbiB0aGUge0BsaW5rCi0gICAgICogQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbn0KLSAgICAgKiBkb2N1bWVudGF0aW9uIGFyZSBndWFyYW50ZWVkIHRvIGJlIHN1cHBvcnRlZC48L3A+CisgICAgICogPGNvZGU+TElNSVRFRDwvY29kZT4gdGFibGVzIGluIHRoZSB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbiBjcmVhdGVDYXB0dXJlU2Vzc2lvbn0gZG9jdW1lbnRhdGlvbiBhcmUgZ3VhcmFudGVlZCB0byBiZSBzdXBwb3J0ZWQuPC9wPgogICAgICAqIDxwPlRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBjYXBhYmlsaXRpZXMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgc3VwcG9ydGVkOjwvcD4KICAgICAgKiA8dWw+CiAgICAgICogPGxpPjxjb2RlPllVVl9SRVBST0NFU1NJTkc8L2NvZGU+IGNhcGFiaWxpdHkgKEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTIGNvbnRhaW5zCkBAIC03MTk0LDYgKzc2MTYsMzcgQEAKICAgICAgKi8KICAgICBBQ0FNRVJBX0lORk9fU1VQUE9SVEVEX0hBUkRXQVJFX0xFVkVMXzMgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywKIAorICAgIC8qKgorICAgICAqIDxwPlRoaXMgY2FtZXJhIGRldmljZSBpcyBiYWNrZWQgYnkgYW4gZXh0ZXJuYWwgY2FtZXJhIGNvbm5lY3RlZCB0byB0aGlzIEFuZHJvaWQgZGV2aWNlLjwvcD4KKyAgICAgKiA8cD5UaGUgZGV2aWNlIGhhcyBjYXBhYmlsaXR5IGlkZW50aWNhbCB0byBhIExJTUlURUQgbGV2ZWwgZGV2aWNlLCB3aXRoIHRoZSBmb2xsb3dpbmcKKyAgICAgKiBleGNlcHRpb25zOjwvcD4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPlRoZSBkZXZpY2UgbWF5IG5vdCByZXBvcnQgbGVucy9zZW5zb3IgcmVsYXRlZCBpbmZvcm1hdGlvbiBzdWNoIGFzPHVsPgorICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfRk9DQUxfTEVOR1RIPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX0lORk9fSFlQRVJGT0NBTF9ESVNUQU5DRTwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0lORk9fUEhZU0lDQUxfU0laRTwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0lORk9fV0hJVEVfTEVWRUw8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9CTEFDS19MRVZFTF9QQVRURVJOPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlQ8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9ST0xMSU5HX1NIVVRURVJfU0tFVzwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L2xpPgorICAgICAqIDxsaT5UaGUgZGV2aWNlIHdpbGwgcmVwb3J0IDAgZm9yIEFDQU1FUkFfU0VOU09SX09SSUVOVEFUSU9OPC9saT4KKyAgICAgKiA8bGk+VGhlIGRldmljZSBoYXMgbGVzcyBndWFyYW50ZWUgb24gc3RhYmxlIGZyYW1lcmF0ZSwgYXMgdGhlIGZyYW1lcmF0ZSBwYXJ0bHkgZGVwZW5kcworICAgICAqICAgb24gdGhlIGV4dGVybmFsIGNhbWVyYSBiZWluZyB1c2VkLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0ZPQ0FMX0xFTkdUSAorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0lORk9fSFlQRVJGT0NBTF9ESVNUQU5DRQorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfQkxBQ0tfTEVWRUxfUEFUVEVSTgorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlQKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fUEhZU0lDQUxfU0laRQorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19XSElURV9MRVZFTAorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfT1JJRU5UQVRJT04KKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1JPTExJTkdfU0hVVFRFUl9TS0VXCisgICAgICovCisgICAgQUNBTUVSQV9JTkZPX1NVUFBPUlRFRF9IQVJEV0FSRV9MRVZFTF9FWFRFUk5BTCAgICAgICAgICAgICAgICAgICA9IDQsCisKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfaW5mb19zdXBwb3J0ZWRfaGFyZHdhcmVfbGV2ZWxfdDsKIAogCkBAIC03MjgxLDYgKzc3MzQsNDggQEAKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfZGVwdGhfZGVwdGhfaXNfZXhjbHVzaXZlX3Q7CiAKIAorLy8gQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9TRU5TT1JfU1lOQ19UWVBFCit0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfbG9naWNhbF9tdWx0aV9jYW1lcmFfc2Vuc29yX3N5bmNfdHlwZSB7CisgICAgLyoqCisgICAgICogPHA+QSBzb2Z0d2FyZSBtZWNoYW5pc20gaXMgdXNlZCB0byBzeW5jaHJvbml6ZSBiZXR3ZWVuIHRoZSBwaHlzaWNhbCBjYW1lcmFzLiBBcyBhIHJlc3VsdCwKKyAgICAgKiB0aGUgdGltZXN0YW1wIG9mIGFuIGltYWdlIGZyb20gYSBwaHlzaWNhbCBzdHJlYW0gaXMgb25seSBhbiBhcHByb3hpbWF0aW9uIG9mIHRoZQorICAgICAqIGltYWdlIHNlbnNvciBzdGFydC1vZi1leHBvc3VyZSB0aW1lLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1NFTlNPUl9TWU5DX1RZUEVfQVBQUk9YSU1BVEUgICAgICAgID0gMCwKKworICAgIC8qKgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIHN1cHBvcnRzIGZyYW1lIHRpbWVzdGFtcCBzeW5jaHJvbml6YXRpb24gYXQgdGhlIGhhcmR3YXJlIGxldmVsLAorICAgICAqIGFuZCB0aGUgdGltZXN0YW1wIG9mIGEgcGh5c2ljYWwgc3RyZWFtIGltYWdlIGFjY3VyYXRlbHkgcmVmbGVjdHMgaXRzCisgICAgICogc3RhcnQtb2YtZXhwb3N1cmUgdGltZS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9TRU5TT1JfU1lOQ19UWVBFX0NBTElCUkFURUQgICAgICAgICA9IDEsCisKK30gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfbG9naWNhbF9tdWx0aV9jYW1lcmFfc2Vuc29yX3N5bmNfdHlwZV90OworCisKKy8vIEFDQU1FUkFfRElTVE9SVElPTl9DT1JSRUNUSU9OX01PREUKK3R5cGVkZWYgZW51bSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYWNhbWVyYV9kaXN0b3J0aW9uX2NvcnJlY3Rpb25fbW9kZSB7CisgICAgLyoqCisgICAgICogPHA+Tm8gZGlzdG9ydGlvbiBjb3JyZWN0aW9uIGlzIGFwcGxpZWQuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfRElTVE9SVElPTl9DT1JSRUNUSU9OX01PREVfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorCisgICAgLyoqCisgICAgICogPHA+TGVucyBkaXN0b3J0aW9uIGNvcnJlY3Rpb24gaXMgYXBwbGllZCB3aXRob3V0IHJlZHVjaW5nIGZyYW1lIHJhdGUKKyAgICAgKiByZWxhdGl2ZSB0byBzZW5zb3Igb3V0cHV0LiBJdCBtYXkgYmUgdGhlIHNhbWUgYXMgT0ZGIGlmIGRpc3RvcnRpb24gY29ycmVjdGlvbiB3b3VsZAorICAgICAqIHJlZHVjZSBmcmFtZSByYXRlIHJlbGF0aXZlIHRvIHNlbnNvci48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9ESVNUT1JUSU9OX0NPUlJFQ1RJT05fTU9ERV9GQVNUICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsCisKKyAgICAvKioKKyAgICAgKiA8cD5IaWdoLXF1YWxpdHkgZGlzdG9ydGlvbiBjb3JyZWN0aW9uIGlzIGFwcGxpZWQsIGF0IHRoZSBjb3N0IG9mCisgICAgICogcG9zc2libHkgcmVkdWNlZCBmcmFtZSByYXRlIHJlbGF0aXZlIHRvIHNlbnNvciBvdXRwdXQuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfRElTVE9SVElPTl9DT1JSRUNUSU9OX01PREVfSElHSF9RVUFMSVRZICAgICAgICAgICAgICAgICAgPSAyLAorCit9IGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2Rpc3RvcnRpb25fY29ycmVjdGlvbl9tb2RlX3Q7CisKKwogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyNCAqLwogCiBfX0VORF9ERUNMUwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYXB0dXJlUmVxdWVzdC5oIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYXB0dXJlUmVxdWVzdC5oCmluZGV4IGM2MmJhMmMuLjQ5NjFjZTMgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FwdHVyZVJlcXVlc3QuaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhcHR1cmVSZXF1ZXN0LmgKQEAgLTMwNSw2ICszMDUsNTggQEAKIAogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyNCAqLwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDI4CisKKy8qKgorICogQXNzb2NpYXRlIGFuIGFyYml0cmFyeSB1c2VyIGNvbnRleHQgcG9pbnRlciB0byB0aGUge0BsaW5rIEFDYXB0dXJlUmVxdWVzdH0KKyAqCisgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgZm9yIHVzZXIgdG8gaWRlbnRpZnkgdGhlIGNhcHR1cmUgcmVxdWVzdCBpbiBjYXB0dXJlIHNlc3Npb24gY2FsbGJhY2tzLgorICogVGhlIGNvbnRleHQgaXMgTlVMTCBmb3IgbmV3bHkgY3JlYXRlZCByZXF1ZXN0LgorICoge0BsaW5rIEFDYW1lcmFPdXRwdXRUYXJnZXRfZnJlZX0gd2lsbCBub3QgZnJlZSB0aGUgY29udGV4dC4gQWxzbyBjYWxsaW5nIHRoaXMgbWV0aG9kIHR3aWNlCisgKiB3aWxsIG5vdCBjYXVzZSB0aGUgcHJldmlvdXMgY29udGV4dCBiZSBmcmVlZC4KKyAqIEFsc28gbm90ZSB0aGF0IGNhbGxpbmcgdGhpcyBtZXRob2QgYWZ0ZXIgdGhlIHJlcXVlc3QgaGFzIGJlZW4gc2VudCB0byBjYXB0dXJlIHNlc3Npb24gd2lsbCBub3QKKyAqIGNoYW5nZSB0aGUgY29udGV4dCBwb2ludGVyIGluIHRoZSBjYXB0dXJlIGNhbGxiYWNrcy4KKyAqCisgKiBAcGFyYW0gcmVxdWVzdCB0aGUge0BsaW5rIEFDYXB0dXJlUmVxdWVzdH0gb2YgaW50ZXJlc3QuCisgKiBAcGFyYW0gY29udGV4dCB0aGUgdXNlciBjb250ZXh0IHBvaW50ZXIgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2FwdHVyZSByZXF1ZXN0LgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIHJlcXVlc3QgaXMgTlVMTC48L2xpPjwvdWw+CisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVJlcXVlc3Rfc2V0VXNlckNvbnRleHQoCisgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgdm9pZCogY29udGV4dCk7CisKKy8qKgorICogR2V0IHRoZSB1c2VyIGNvbnRleHQgcG9pbnRlciBvZiB0aGUge0BsaW5rIEFDYXB0dXJlUmVxdWVzdH0KKyAqCisgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgZm9yIHVzZXIgdG8gaWRlbnRpZnkgdGhlIGNhcHR1cmUgcmVxdWVzdCBpbiBjYXB0dXJlIHNlc3Npb24gY2FsbGJhY2tzLgorICogVGhlIGNvbnRleHQgaXMgTlVMTCBmb3IgbmV3bHkgY3JlYXRlZCByZXF1ZXN0LgorICoKKyAqIEBwYXJhbSByZXF1ZXN0IHRoZSB7QGxpbmsgQUNhcHR1cmVSZXF1ZXN0fSBvZiBpbnRlcmVzdC4KKyAqIEBwYXJhbSBjb250ZXh0IHRoZSB1c2VyIGNvbnRleHQgcG9pbnRlciBvZiB0aGlzIGNhcHR1cmUgcmVxdWVzdC4KKyAqCisgKiBAcmV0dXJuIDx1bD4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX09LfSBpZiB0aGUgbWV0aG9kIGNhbGwgc3VjY2VlZHMuPC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSfSBpZiByZXF1ZXN0IGlzIE5VTEwuPC9saT48L3VsPgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVSZXF1ZXN0X2dldFVzZXJDb250ZXh0KAorICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIC8qb3V0Ki92b2lkKiogY29udGV4dCk7CisKKy8qKgorICogQ3JlYXRlIGEgY29weSBvZiBpbnB1dCB7QGxpbmsgQUNhcHR1cmVSZXF1ZXN0fS4KKyAqCisgKiA8cD5UaGUgcmV0dXJuZWQgQUNhcHR1cmVSZXF1ZXN0IG11c3QgYmUgZnJlZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGJ5IHtAbGluayBBQ2FwdHVyZVJlcXVlc3RfZnJlZX0KKyAqIGFmdGVyIGFwcGxpY2F0aW9uIGlzIGRvbmUgdXNpbmcgaXQuPC9wPgorICoKKyAqIEBwYXJhbSBzcmMgdGhlIGlucHV0IHtAbGluayBBQ2FwdHVyZVJlcXVlc3R9IHRvIGJlIGNvcGllZC4KKyAqCisgKiBAcmV0dXJuIGEgdmFsaWQgQUNhcHR1cmVSZXF1ZXN0IHBvaW50ZXIgb3IgTlVMTCBpZiB0aGUgaW5wdXQgcmVxdWVzdCBjYW5ub3QgYmUgY29waWVkLgorICovCitBQ2FwdHVyZVJlcXVlc3QqIEFDYXB0dXJlUmVxdWVzdF9jb3B5KGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc3JjKTsKKworI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOCAqLworCiBfX0VORF9ERUNMUwogCiAjZW5kaWYgLyogX05ES19DQVBUVVJFX1JFUVVFU1RfSCAqLwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9saWJjYW1lcmEybmRrLm1hcC50eHQgYi9jYW1lcmEvbmRrL2xpYmNhbWVyYTJuZGsubWFwLnR4dAppbmRleCA0MWJiMjJiLi5kMTc5YWEwIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2xpYmNhbWVyYTJuZGsubWFwLnR4dAorKysgYi9jYW1lcmEvbmRrL2xpYmNhbWVyYTJuZGsubWFwLnR4dApAQCAtNiw5ICs2LDExIEBACiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2dldERldmljZTsKICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc2V0UmVwZWF0aW5nUmVxdWVzdDsKICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RvcFJlcGVhdGluZzsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fdXBkYXRlU2hhcmVkT3V0cHV0OwogICAgIEFDYW1lcmFEZXZpY2VfY2xvc2U7CiAgICAgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdDsKICAgICBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9uOworICAgIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb25XaXRoU2Vzc2lvblBhcmFtZXRlcnM7CiAgICAgQUNhbWVyYURldmljZV9nZXRJZDsKICAgICBBQ2FtZXJhTWFuYWdlcl9jcmVhdGU7CiAgICAgQUNhbWVyYU1hbmFnZXJfZGVsZXRlOwpAQCAtMjUsOSArMjcsMTEgQEAKICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2NyZWF0ZTsKICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2ZyZWU7CiAgICAgQUNhcHR1cmVSZXF1ZXN0X2FkZFRhcmdldDsKKyAgICBBQ2FwdHVyZVJlcXVlc3RfY29weTsKICAgICBBQ2FwdHVyZVJlcXVlc3RfZnJlZTsKICAgICBBQ2FwdHVyZVJlcXVlc3RfZ2V0QWxsVGFnczsKICAgICBBQ2FwdHVyZVJlcXVlc3RfZ2V0Q29uc3RFbnRyeTsKKyAgICBBQ2FwdHVyZVJlcXVlc3RfZ2V0VXNlckNvbnRleHQ7CiAgICAgQUNhcHR1cmVSZXF1ZXN0X3JlbW92ZVRhcmdldDsKICAgICBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfZG91YmxlOwogICAgIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9mbG9hdDsKQEAgLTM1LDExICszOSwxNSBAQAogICAgIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9pNjQ7CiAgICAgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3JhdGlvbmFsOwogICAgIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV91ODsKKyAgICBBQ2FwdHVyZVJlcXVlc3Rfc2V0VXNlckNvbnRleHQ7CiAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZDsKICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfY3JlYXRlOwogICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9mcmVlOwogICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9yZW1vdmU7CiAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0X2NyZWF0ZTsKKyAgICBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfY3JlYXRlOworICAgIEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9hZGQ7CisgICAgQUNhcHR1cmVTZXNzaW9uU2hhcmVkT3V0cHV0X3JlbW92ZTsKICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfZnJlZTsKICAgbG9jYWw6CiAgICAgKjsKZGlmZiAtLWdpdCBhL2NhbWVyYS90ZXN0cy9DYW1lcmFCaW5kZXJUZXN0cy5jcHAgYi9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwCmluZGV4IDUxZDkyMTQuLjFkZTcwMTMgMTAwNjQ0Ci0tLSBhL2NhbWVyYS90ZXN0cy9DYW1lcmFCaW5kZXJUZXN0cy5jcHAKKysrIGIvY2FtZXJhL3Rlc3RzL0NhbWVyYUJpbmRlclRlc3RzLmNwcApAQCAtMTk4LDkgKzE5OCwxMSBAQAogCiAKICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uUmVzdWx0UmVjZWl2ZWQoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhLAotICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CisgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxSZXN1bHRJbmZvcykgewogICAgICAgICAodm9pZCkgbWV0YWRhdGE7CiAgICAgICAgICh2b2lkKSByZXN1bHRFeHRyYXM7CisgICAgICAgICh2b2lkKSBwaHlzaWNhbFJlc3VsdEluZm9zOwogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgICAgIG1MYXN0U3RhdHVzID0gU0VOVF9SRVNVTFQ7CiAgICAgICAgIG1TdGF0dXNlc0hpdC5wdXNoX2JhY2sobUxhc3RTdGF0dXMpOwpAQCAtMzE3LDYgKzMxOSw5IEBACiAgICAgRVhQRUNUX1RSVUUocmVzLmlzT2soKSkgPDwgcmVzOwogCiAgICAgRVhQRUNUX0VRKG51bUNhbWVyYXMsIHN0YXRpY19jYXN0PGNvbnN0IGludD4oc3RhdHVzZXMuc2l6ZSgpKSk7CisgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IHN0YXR1c2VzKSB7CisgICAgICAgIGxpc3RlbmVyLT5vblN0YXR1c0NoYW5nZWQoaXQuc3RhdHVzLCBTdHJpbmcxNihpdC5jYW1lcmFJZCkpOworICAgIH0KIAogICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bUNhbWVyYXM7IGkrKykgewogICAgICAgICBTdHJpbmcxNiBjYW1lcmFJZCA9IFN0cmluZzE2KFN0cmluZzg6OmZvcm1hdCgiJWQiLCBpKSk7CkBAIC00MjEsNiArNDI2LDkgQEAKICAgICAgICAgc2VydmljZUxpc3RlbmVyID0gbmV3IFRlc3RDYW1lcmFTZXJ2aWNlTGlzdGVuZXIoKTsKICAgICAgICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0YXR1cz4gc3RhdHVzZXM7CiAgICAgICAgIHNlcnZpY2UtPmFkZExpc3RlbmVyKHNlcnZpY2VMaXN0ZW5lciwgJnN0YXR1c2VzKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IHN0YXR1c2VzKSB7CisgICAgICAgICAgICBzZXJ2aWNlTGlzdGVuZXItPm9uU3RhdHVzQ2hhbmdlZChpdC5zdGF0dXMsIFN0cmluZzE2KGl0LmNhbWVyYUlkKSk7CisgICAgICAgIH0KICAgICAgICAgc2VydmljZS0+Z2V0TnVtYmVyT2ZDYW1lcmFzKGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6Q0FNRVJBX1RZUEVfQkFDS1dBUkRfQ09NUEFUSUJMRSwKICAgICAgICAgICAgICAgICAmbnVtQ2FtZXJhcyk7CiAgICAgfQpAQCAtNDM5LDggKzQ0Nyw5IEBACiAgICAgQVNTRVJUX05PVF9OVUxMKHNlcnZpY2UpOwogICAgIEVYUEVDVF9UUlVFKHNlcnZpY2VMaXN0ZW5lci0+d2FpdEZvck51bUNhbWVyYXMobnVtQ2FtZXJhcykpOwogICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bUNhbWVyYXM7IGkrKykgeworICAgICAgICBTdHJpbmc4IGNhbWVyYUlkOCA9IFN0cmluZzg6OmZvcm1hdCgiJWQiLCBpKTsKICAgICAgICAgLy8gTWFrZSBzdXJlIHdlJ3JlIGF2YWlsYWJsZSwgb3Igc2tpcCBkZXZpY2UgdGVzdHMgb3RoZXJ3aXNlCi0gICAgICAgIFN0cmluZzE2IGNhbWVyYUlkKFN0cmluZzg6OmZvcm1hdCgiJWQiLGkpKTsKKyAgICAgICAgU3RyaW5nMTYgY2FtZXJhSWQoY2FtZXJhSWQ4KTsKICAgICAgICAgaW50MzJfdCBzID0gc2VydmljZUxpc3RlbmVyLT5nZXRTdGF0dXMoY2FtZXJhSWQpOwogICAgICAgICBFWFBFQ1RfRVEoaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19QUkVTRU5ULCBzKTsKICAgICAgICAgaWYgKHMgIT0gaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19QUkVTRU5UKSB7CkBAIC00NzYsNyArNDg1LDggQEAKICAgICAgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0ob3V0cHV0LCAmc3RyZWFtSWQpOwogICAgICAgICBFWFBFQ1RfVFJVRShyZXMuaXNPaygpKSA8PCByZXM7CiAgICAgICAgIEVYUEVDVF9MRSgwLCBzdHJlYW1JZCk7Ci0gICAgICAgIHJlcyA9IGRldmljZS0+ZW5kQ29uZmlndXJlKC8qaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCovIGZhbHNlKTsKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEgc2Vzc2lvblBhcmFtczsKKyAgICAgICAgcmVzID0gZGV2aWNlLT5lbmRDb25maWd1cmUoLyppc0NvbnN0cmFpbmVkSGlnaFNwZWVkKi8gZmFsc2UsIHNlc3Npb25QYXJhbXMpOwogICAgICAgICBFWFBFQ1RfVFJVRShyZXMuaXNPaygpKSA8PCByZXM7CiAgICAgICAgIEVYUEVDVF9GQUxTRShjYWxsYmFja3MtPmhhZEVycm9yKCkpOwogCkBAIC00ODcsNyArNDk3LDcgQEAKICAgICAgICAgRVhQRUNUX1RSVUUocmVzLmlzT2soKSkgPDwgcmVzOwogCiAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmEyOjpDYXB0dXJlUmVxdWVzdCByZXF1ZXN0OwotICAgICAgICByZXF1ZXN0Lm1NZXRhZGF0YSA9IHJlcXVlc3RUZW1wbGF0ZTsKKyAgICAgICAgcmVxdWVzdC5tUGh5c2ljYWxDYW1lcmFTZXR0aW5ncy5wdXNoX2JhY2soe2NhbWVyYUlkOC5zdHJpbmcoKSwgcmVxdWVzdFRlbXBsYXRlfSk7CiAgICAgICAgIHJlcXVlc3QubVN1cmZhY2VMaXN0LmFkZChzdXJmYWNlKTsKICAgICAgICAgcmVxdWVzdC5tSXNSZXByb2Nlc3MgPSBmYWxzZTsKICAgICAgICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIgPSAwOwpAQCAtNTE0LDcgKzUyNCw3IEBACiAgICAgICAgICAgICAgICAgLypvdXQqLyZyZXF1ZXN0VGVtcGxhdGUpOwogICAgICAgICBFWFBFQ1RfVFJVRShyZXMuaXNPaygpKSA8PCByZXM7CiAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmEyOjpDYXB0dXJlUmVxdWVzdCByZXF1ZXN0MjsKLSAgICAgICAgcmVxdWVzdDIubU1ldGFkYXRhID0gcmVxdWVzdFRlbXBsYXRlOworICAgICAgICByZXF1ZXN0Mi5tUGh5c2ljYWxDYW1lcmFTZXR0aW5ncy5wdXNoX2JhY2soe2NhbWVyYUlkOC5zdHJpbmcoKSwgcmVxdWVzdFRlbXBsYXRlfSk7CiAgICAgICAgIHJlcXVlc3QyLm1TdXJmYWNlTGlzdC5hZGQoc3VyZmFjZSk7CiAgICAgICAgIHJlcXVlc3QyLm1Jc1JlcHJvY2VzcyA9IGZhbHNlOwogICAgICAgICBjYWxsYmFja3MtPmNsZWFyU3RhdHVzKCk7CkBAIC01NDcsMTAgKzU1NywxMCBAQAogICAgICAgICBFWFBFQ1RfVFJVRShyZXMuaXNPaygpKSA8PCByZXM7CiAgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmEyOjpDYXB0dXJlUmVxdWVzdCByZXF1ZXN0MzsKICAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTI6OkNhcHR1cmVSZXF1ZXN0IHJlcXVlc3Q0OwotICAgICAgICByZXF1ZXN0My5tTWV0YWRhdGEgPSByZXF1ZXN0VGVtcGxhdGU7CisgICAgICAgIHJlcXVlc3QzLm1QaHlzaWNhbENhbWVyYVNldHRpbmdzLnB1c2hfYmFjayh7Y2FtZXJhSWQ4LnN0cmluZygpLCByZXF1ZXN0VGVtcGxhdGV9KTsKICAgICAgICAgcmVxdWVzdDMubVN1cmZhY2VMaXN0LmFkZChzdXJmYWNlKTsKICAgICAgICAgcmVxdWVzdDMubUlzUmVwcm9jZXNzID0gZmFsc2U7Ci0gICAgICAgIHJlcXVlc3Q0Lm1NZXRhZGF0YSA9IHJlcXVlc3RUZW1wbGF0ZTI7CisgICAgICAgIHJlcXVlc3Q0Lm1QaHlzaWNhbENhbWVyYVNldHRpbmdzLnB1c2hfYmFjayh7Y2FtZXJhSWQ4LnN0cmluZygpLCByZXF1ZXN0VGVtcGxhdGUyfSk7CiAgICAgICAgIHJlcXVlc3Q0Lm1TdXJmYWNlTGlzdC5hZGQoc3VyZmFjZSk7CiAgICAgICAgIHJlcXVlc3Q0Lm1Jc1JlcHJvY2VzcyA9IGZhbHNlOwogICAgICAgICBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Y2FtZXJhMjo6Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3RMaXN0OwpAQCAtNTc0LDcgKzU4NCw3IEBACiAgICAgICAgIEVYUEVDVF9UUlVFKHJlcy5pc09rKCkpIDw8IHJlczsKICAgICAgICAgcmVzID0gZGV2aWNlLT5kZWxldGVTdHJlYW0oc3RyZWFtSWQpOwogICAgICAgICBFWFBFQ1RfVFJVRShyZXMuaXNPaygpKSA8PCByZXM7Ci0gICAgICAgIHJlcyA9IGRldmljZS0+ZW5kQ29uZmlndXJlKC8qaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCovIGZhbHNlKTsKKyAgICAgICAgcmVzID0gZGV2aWNlLT5lbmRDb25maWd1cmUoLyppc0NvbnN0cmFpbmVkSGlnaFNwZWVkKi8gZmFsc2UsIHNlc3Npb25QYXJhbXMpOwogICAgICAgICBFWFBFQ1RfVFJVRShyZXMuaXNPaygpKSA8PCByZXM7CiAKICAgICAgICAgc2xlZXAoLypzZWNvbmQqLzEpOyAvLyBhbGxvdyBzb21lIHRpbWUgZm9yIGVycm9ycyB0byBzaG93IHVwLCBpZiBhbnkKQEAgLTU4NCwzICs1OTQsNjIgQEAKICAgICB9CiAKIH07CisKK1RFU1RfRihDYW1lcmFDbGllbnRCaW5kZXJUZXN0LCBDaGVja0JpbmRlckNhcHR1cmVSZXF1ZXN0KSB7CisgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3RPcmlnaW5hbCwgcmVxdWVzdFBhcmNlbGVkOworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGdiUHJvZHVjZXI7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gZ2JDb25zdW1lcjsKKyAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJmdiUHJvZHVjZXIsICZnYkNvbnN1bWVyKTsKKyAgICBzcDxTdXJmYWNlPiBzdXJmYWNlKG5ldyBTdXJmYWNlKGdiUHJvZHVjZXIsIC8qY29udHJvbGxlZEJ5QXBwKi9mYWxzZSkpOworICAgIFZlY3RvcjxzcDxTdXJmYWNlPj4gc3VyZmFjZUxpc3Q7CisgICAgc3VyZmFjZUxpc3QucHVzaF9iYWNrKHN1cmZhY2UpOworICAgIHN0ZDo6c3RyaW5nIHBoeXNpY2FsRGV2aWNlSWQxID0gIjAiOworICAgIHN0ZDo6c3RyaW5nIHBoeXNpY2FsRGV2aWNlSWQyID0gIjEiOworICAgIENhbWVyYU1ldGFkYXRhIHBoeXNpY2FsRGV2aWNlU2V0dGluZ3MxLCBwaHlzaWNhbERldmljZVNldHRpbmdzMjsKKyAgICB1aW50OF90IGludGVudDEgPSBBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlRfUFJFVklFVzsKKyAgICB1aW50OF90IGludGVudDIgPSBBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlRfVklERU9fUkVDT1JEOworICAgIEVYUEVDVF9FUShPSywgcGh5c2ljYWxEZXZpY2VTZXR0aW5nczEudXBkYXRlKEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVCwgJmludGVudDEsIDEpKTsKKyAgICBFWFBFQ1RfRVEoT0ssIHBoeXNpY2FsRGV2aWNlU2V0dGluZ3MyLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlQsICZpbnRlbnQyLCAxKSk7CisKKyAgICByZXF1ZXN0UGFyY2VsZWQgPSBuZXcgQ2FwdHVyZVJlcXVlc3QoKTsKKyAgICBQYXJjZWwgcDsKKyAgICBFWFBFQ1RfVFJVRShyZXF1ZXN0UGFyY2VsZWQtPnJlYWRGcm9tUGFyY2VsKCZwKSAhPSBPSyk7CisgICAgcC53cml0ZUludDMyKDApOworICAgIHAuc2V0RGF0YVBvc2l0aW9uKDApOworICAgIEVYUEVDVF9UUlVFKHJlcXVlc3RQYXJjZWxlZC0+cmVhZEZyb21QYXJjZWwoJnApICE9IE9LKTsKKyAgICBwLmZyZWVEYXRhKCk7CisgICAgcC53cml0ZUludDMyKC0xKTsKKyAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKKyAgICBFWFBFQ1RfVFJVRShyZXF1ZXN0UGFyY2VsZWQtPnJlYWRGcm9tUGFyY2VsKCZwKSAhPSBPSyk7CisgICAgcC5mcmVlRGF0YSgpOworICAgIHAud3JpdGVJbnQzMigxKTsKKyAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKKyAgICBFWFBFQ1RfVFJVRShyZXF1ZXN0UGFyY2VsZWQtPnJlYWRGcm9tUGFyY2VsKCZwKSAhPSBPSyk7CisKKyAgICByZXF1ZXN0T3JpZ2luYWwgPSBuZXcgQ2FwdHVyZVJlcXVlc3QoKTsKKyAgICByZXF1ZXN0T3JpZ2luYWwtPm1QaHlzaWNhbENhbWVyYVNldHRpbmdzLnB1c2hfYmFjayh7cGh5c2ljYWxEZXZpY2VJZDEsCisgICAgICAgICAgICBwaHlzaWNhbERldmljZVNldHRpbmdzMX0pOworICAgIHJlcXVlc3RPcmlnaW5hbC0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MucHVzaF9iYWNrKHtwaHlzaWNhbERldmljZUlkMiwKKyAgICAgICAgICAgIHBoeXNpY2FsRGV2aWNlU2V0dGluZ3MyfSk7CisgICAgcmVxdWVzdE9yaWdpbmFsLT5tU3VyZmFjZUxpc3QucHVzaF9iYWNrKHN1cmZhY2UpOworICAgIHJlcXVlc3RPcmlnaW5hbC0+bUlzUmVwcm9jZXNzID0gZmFsc2U7CisgICAgcmVxdWVzdE9yaWdpbmFsLT5tU3VyZmFjZUNvbnZlcnRlZCA9IGZhbHNlOworCisgICAgcC5mcmVlRGF0YSgpOworICAgIEVYUEVDVF9UUlVFKHJlcXVlc3RPcmlnaW5hbC0+d3JpdGVUb1BhcmNlbCgmcCkgPT0gT0spOworICAgIHAuc2V0RGF0YVBvc2l0aW9uKDApOworICAgIEVYUEVDVF9UUlVFKHJlcXVlc3RQYXJjZWxlZC0+cmVhZEZyb21QYXJjZWwoJnApID09IE9LKTsKKyAgICBFWFBFQ1RfRVEocmVxdWVzdFBhcmNlbGVkLT5tSXNSZXByb2Nlc3MsIGZhbHNlKTsKKyAgICBFWFBFQ1RfRkFMU0UocmVxdWVzdFBhcmNlbGVkLT5tU3VyZmFjZUxpc3QuZW1wdHkoKSk7CisgICAgRVhQRUNUX0VRKDJ1LCByZXF1ZXN0UGFyY2VsZWQtPm1QaHlzaWNhbENhbWVyYVNldHRpbmdzLnNpemUoKSk7CisgICAgYXV0byBpdCA9IHJlcXVlc3RQYXJjZWxlZC0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MuYmVnaW4oKTsKKyAgICBFWFBFQ1RfRVEocGh5c2ljYWxEZXZpY2VJZDEsIGl0LT5pZCk7CisgICAgRVhQRUNUX1RSVUUoaXQtPnNldHRpbmdzLmV4aXN0cyhBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlQpKTsKKyAgICBhdXRvIGVudHJ5ID0gaXQtPnNldHRpbmdzLmZpbmQoQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5UKTsKKyAgICBFWFBFQ1RfRVEoZW50cnkuZGF0YS51OFswXSwgaW50ZW50MSk7CisgICAgaXQrKzsKKyAgICBFWFBFQ1RfRVEocGh5c2ljYWxEZXZpY2VJZDIsIGl0LT5pZCk7CisgICAgRVhQRUNUX1RSVUUoaXQtPnNldHRpbmdzLmV4aXN0cyhBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlQpKTsKKyAgICBlbnRyeSA9IGl0LT5zZXR0aW5ncy5maW5kKEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVCk7CisgICAgRVhQRUNUX0VRKGVudHJ5LmRhdGEudThbMF0sIGludGVudDIpOworfTsKZGlmZiAtLWdpdCBhL2NhbWVyYS90ZXN0cy9DYW1lcmFaU0xUZXN0cy5jcHAgYi9jYW1lcmEvdGVzdHMvQ2FtZXJhWlNMVGVzdHMuY3BwCmluZGV4IGVjY2EzNTQuLjAyYzZlMmEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS90ZXN0cy9DYW1lcmFaU0xUZXN0cy5jcHAKKysrIGIvY2FtZXJhL3Rlc3RzL0NhbWVyYVpTTFRlc3RzLmNwcApAQCAtMjU2LDEwICsyNTYsMTAgQEAKICAgICAgICAgQVNTRVJUX1RSVUUobnVsbHB0ciAhPSBzdXJmYWNlQ29udHJvbC5nZXQoKSk7CiAgICAgICAgIEFTU0VSVF9UUlVFKHN1cmZhY2VDb250cm9sLT5pc1ZhbGlkKCkpOwogCi0gICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6b3Blbkdsb2JhbFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgc3VyZmFjZUNvbnRyb2wtPnNldExheWVyKDB4N2ZmZmZmZmYpKTsKLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBzdXJmYWNlQ29udHJvbC0+c2hvdygpKTsKLSAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpjbG9zZUdsb2JhbFRyYW5zYWN0aW9uKCk7CisgICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6VHJhbnNhY3Rpb257fQorICAgICAgICAgICAgICAgIC5zZXRMYXllcihzdXJmYWNlQ29udHJvbCwgMHg3ZmZmZmZmZikKKyAgICAgICAgICAgICAgICAuc2hvdyhzdXJmYWNlQ29udHJvbCkKKyAgICAgICAgICAgICAgICAuYXBwbHkoKTsKIAogICAgICAgICBwcmV2aWV3U3VyZmFjZSA9IHN1cmZhY2VDb250cm9sLT5nZXRTdXJmYWNlKCk7CiAgICAgICAgIEFTU0VSVF9UUlVFKHByZXZpZXdTdXJmYWNlICE9IE5VTEwpOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL3Rlc3RzL1ZlbmRvclRhZ0Rlc2NyaXB0b3JUZXN0cy5jcHAgYi9jYW1lcmEvdGVzdHMvVmVuZG9yVGFnRGVzY3JpcHRvclRlc3RzLmNwcAppbmRleCA3NWNmYjczLi4wZWUzNThkIDEwMDY0NAotLS0gYS9jYW1lcmEvdGVzdHMvVmVuZG9yVGFnRGVzY3JpcHRvclRlc3RzLmNwcAorKysgYi9jYW1lcmEvdGVzdHMvVmVuZG9yVGFnRGVzY3JpcHRvclRlc3RzLmNwcApAQCAtMTQyLDYgKzE0Miw3IEBACiAgICAgRVhQRUNUX0VRKE9LLCB2RGVzY09yaWdpbmFsLT53cml0ZVRvUGFyY2VsKCZwKSk7CiAgICAgcC5zZXREYXRhUG9zaXRpb24oMCk7CiAKKyAgICB2RGVzY1BhcmNlbGVkID0gbmV3IFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKICAgICBBU1NFUlRfRVEoT0ssIHZEZXNjUGFyY2VsZWQtPnJlYWRGcm9tUGFyY2VsKCZwKSk7CiAKICAgICAvLyBFbnN1cmUgY29uc2lzdGVudCB0YWcgY291bnQKZGlmZiAtLWdpdCBhL2NtZHMvc2NyZWVucmVjb3JkL0FuZHJvaWQubWsgYi9jbWRzL3NjcmVlbnJlY29yZC9BbmRyb2lkLm1rCmluZGV4IDdhYTY4NGEuLjVlODNlZDYgMTAwNjQ0Ci0tLSBhL2NtZHMvc2NyZWVucmVjb3JkL0FuZHJvaWQubWsKKysrIGIvY21kcy9zY3JlZW5yZWNvcmQvQW5kcm9pZC5tawpAQCAtMjUsOCArMjUsOCBAQAogCVByb2dyYW0uY3BwCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLQlsaWJqcGVnIGxpYmd1aSBsaWJjdXRpbHMgbGlibG9nIGxpYkVHTCBsaWJHTEVTdjIKKwlsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJtZWRpYV9vbXggbGlidXRpbHMgbGliYmluZGVyIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAorCWxpYmpwZWcgbGlidWkgbGliZ3VpIGxpYmN1dGlscyBsaWJsb2cgbGliRUdMIGxpYkdMRVN2MgogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKIAlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKZGlmZiAtLWdpdCBhL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAgYi9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwCmluZGV4IGJjMzJiYmUuLjlkMmRhYWIgMTAwNjQ0Ci0tLSBhL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAKKysrIGIvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcApAQCAtNTAsNiArNTAsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9QZXJzaXN0ZW50U3VyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CiAKQEAgLTcwLDkgKzcxLDExIEBACiBzdGF0aWMgYm9vbCBnVmVyYm9zZSA9IGZhbHNlOyAgICAgICAgICAgLy8gY2hhdHR5IG9uIHN0ZG91dAogc3RhdGljIGJvb2wgZ1JvdGF0ZSA9IGZhbHNlOyAgICAgICAgICAgIC8vIHJvdGF0ZSA5MCBkZWdyZWVzCiBzdGF0aWMgYm9vbCBnTW9ub3RvbmljVGltZSA9IGZhbHNlOyAgICAgLy8gdXNlIHN5c3RlbSBtb25vdG9uaWMgdGltZSBmb3IgdGltZXN0YW1wcworc3RhdGljIGJvb2wgZ1BlcnNpc3RlbnRTdXJmYWNlID0gZmFsc2U7IC8vIHVzZSBwZXJzaXN0ZW50IHN1cmZhY2UKIHN0YXRpYyBlbnVtIHsKICAgICBGT1JNQVRfTVA0LCBGT1JNQVRfSDI2NCwgRk9STUFUX0ZSQU1FUywgRk9STUFUX1JBV19GUkFNRVMKIH0gZ091dHB1dEZvcm1hdCA9IEZPUk1BVF9NUDQ7ICAgICAgICAgICAvLyBkYXRhIGZvcm1hdCBmb3Igb3V0cHV0CitzdGF0aWMgQVN0cmluZyBnQ29kZWNOYW1lID0gIiI7ICAgICAgICAgLy8gY29kZWMgbmFtZSBvdmVycmlkZQogc3RhdGljIGJvb2wgZ1NpemVTcGVjaWZpZWQgPSBmYWxzZTsgICAgIC8vIHdhcyBzaXplIGV4cGxpY2l0bHkgcmVxdWVzdGVkPwogc3RhdGljIGJvb2wgZ1dhbnRJbmZvU2NyZWVuID0gZmFsc2U7ICAgIC8vIGRvIHdlIHdhbnQgaW5pdGlhbCBpbmZvIHNjcmVlbj8KIHN0YXRpYyBib29sIGdXYW50RnJhbWVUaW1lID0gZmFsc2U7ICAgICAvLyBkbyB3ZSB3YW50IHRpbWVzIG9uIGVhY2ggZnJhbWU/CkBAIC0xNTQsNiArMTU3LDcgQEAKICAgICBpZiAoZ1ZlcmJvc2UpIHsKICAgICAgICAgcHJpbnRmKCJDb25maWd1cmluZyByZWNvcmRlciBmb3IgJWR4JWQgJXMgYXQgJS4yZk1icHNcbiIsCiAgICAgICAgICAgICAgICAgZ1ZpZGVvV2lkdGgsIGdWaWRlb0hlaWdodCwga01pbWVUeXBlQXZjLCBnQml0UmF0ZSAvIDEwMDAwMDAuMCk7CisgICAgICAgIGZmbHVzaChzdGRvdXQpOwogICAgIH0KIAogICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2U7CkBAIC0xNjksMTEgKzE3MywyMSBAQAogICAgIGxvb3Blci0+c2V0TmFtZSgic2NyZWVucmVjb3JkX2xvb3BlciIpOwogICAgIGxvb3Blci0+c3RhcnQoKTsKICAgICBBTE9HVigiQ3JlYXRpbmcgY29kZWMiKTsKLSAgICBzcDxNZWRpYUNvZGVjPiBjb2RlYyA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5VHlwZShsb29wZXIsIGtNaW1lVHlwZUF2YywgdHJ1ZSk7Ci0gICAgaWYgKGNvZGVjID09IE5VTEwpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogdW5hYmxlIHRvIGNyZWF0ZSAlcyBjb2RlYyBpbnN0YW5jZVxuIiwKLSAgICAgICAgICAgICAgICBrTWltZVR5cGVBdmMpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICBzcDxNZWRpYUNvZGVjPiBjb2RlYzsKKyAgICBpZiAoZ0NvZGVjTmFtZS5lbXB0eSgpKSB7CisgICAgICAgIGNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlUeXBlKGxvb3Blciwga01pbWVUeXBlQXZjLCB0cnVlKTsKKyAgICAgICAgaWYgKGNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IHVuYWJsZSB0byBjcmVhdGUgJXMgY29kZWMgaW5zdGFuY2VcbiIsCisgICAgICAgICAgICAgICAgICAgIGtNaW1lVHlwZUF2Yyk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKGxvb3BlciwgZ0NvZGVjTmFtZSk7CisgICAgICAgIGlmIChjb2RlYyA9PSBOVUxMKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiB1bmFibGUgdG8gY3JlYXRlICVzIGNvZGVjIGluc3RhbmNlXG4iLAorICAgICAgICAgICAgICAgICAgICBnQ29kZWNOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KICAgICB9CiAKICAgICBlcnIgPSBjb2RlYy0+Y29uZmlndXJlKGZvcm1hdCwgTlVMTCwgTlVMTCwKQEAgLTE4NywxMCArMjAxLDE4IEBACiAKICAgICBBTE9HVigiQ3JlYXRpbmcgZW5jb2RlciBpbnB1dCBzdXJmYWNlIik7CiAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gYnVmZmVyUHJvZHVjZXI7Ci0gICAgZXJyID0gY29kZWMtPmNyZWF0ZUlucHV0U3VyZmFjZSgmYnVmZmVyUHJvZHVjZXIpOworICAgIGlmIChnUGVyc2lzdGVudFN1cmZhY2UpIHsKKyAgICAgICAgc3A8UGVyc2lzdGVudFN1cmZhY2U+IHN1cmZhY2UgPSBNZWRpYUNvZGVjOjpDcmVhdGVQZXJzaXN0ZW50SW5wdXRTdXJmYWNlKCk7CisgICAgICAgIGJ1ZmZlclByb2R1Y2VyID0gc3VyZmFjZS0+Z2V0QnVmZmVyUHJvZHVjZXIoKTsKKyAgICAgICAgZXJyID0gY29kZWMtPnNldElucHV0U3VyZmFjZShzdXJmYWNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBlcnIgPSBjb2RlYy0+Y3JlYXRlSW5wdXRTdXJmYWNlKCZidWZmZXJQcm9kdWNlcik7CisgICAgfQogICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAiRVJST1I6IHVuYWJsZSB0byBjcmVhdGUgZW5jb2RlciBpbnB1dCBzdXJmYWNlIChlcnI9JWQpXG4iLCBlcnIpOworICAgICAgICAgICAgIkVSUk9SOiB1bmFibGUgdG8gJXMgZW5jb2RlciBpbnB1dCBzdXJmYWNlIChlcnI9JWQpXG4iLAorICAgICAgICAgICAgZ1BlcnNpc3RlbnRTdXJmYWNlID8gInNldCIgOiAiY3JlYXRlIiwKKyAgICAgICAgICAgIGVycik7CiAgICAgICAgIGNvZGVjLT5yZWxlYXNlKCk7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQpAQCAtMjEzLDcgKzIzNSw5IEBACiAgKiBTZXRzIHRoZSBkaXNwbGF5IHByb2plY3Rpb24sIGJhc2VkIG9uIHRoZSBkaXNwbGF5IGRpbWVuc2lvbnMsIHZpZGVvIHNpemUsCiAgKiBhbmQgZGV2aWNlIG9yaWVudGF0aW9uLgogICovCi1zdGF0aWMgc3RhdHVzX3Qgc2V0RGlzcGxheVByb2plY3Rpb24oY29uc3Qgc3A8SUJpbmRlcj4mIGRweSwKK3N0YXRpYyBzdGF0dXNfdCBzZXREaXNwbGF5UHJvamVjdGlvbigKKyAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpUcmFuc2FjdGlvbiYgdCwKKyAgICAgICAgY29uc3Qgc3A8SUJpbmRlcj4mIGRweSwKICAgICAgICAgY29uc3QgRGlzcGxheUluZm8mIG1haW5EcHlJbmZvKSB7CiAKICAgICAvLyBTZXQgdGhlIHJlZ2lvbiBvZiB0aGUgbGF5ZXIgc3RhY2sgd2UncmUgaW50ZXJlc3RlZCBpbiwgd2hpY2ggaW4gb3VyCkBAIC0yNzMsMTMgKzI5NywxNSBAQAogICAgICAgICBpZiAoZ1JvdGF0ZSkgewogICAgICAgICAgICAgcHJpbnRmKCJSb3RhdGVkIGNvbnRlbnQgYXJlYSBpcyAldXgldSBhdCBvZmZzZXQgeD0lZCB5PSVkXG4iLAogICAgICAgICAgICAgICAgICAgICBvdXRIZWlnaHQsIG91dFdpZHRoLCBvZmZZLCBvZmZYKTsKKyAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcHJpbnRmKCJDb250ZW50IGFyZWEgaXMgJXV4JXUgYXQgb2Zmc2V0IHg9JWQgeT0lZFxuIiwKICAgICAgICAgICAgICAgICAgICAgb3V0V2lkdGgsIG91dEhlaWdodCwgb2ZmWCwgb2ZmWSk7CisgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKICAgICAgICAgfQogICAgIH0KIAotICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6c2V0RGlzcGxheVByb2plY3Rpb24oZHB5LAorICAgIHQuc2V0RGlzcGxheVByb2plY3Rpb24oZHB5LAogICAgICAgICAgICAgZ1JvdGF0ZSA/IERJU1BMQVlfT1JJRU5UQVRJT05fOTAgOiBESVNQTEFZX09SSUVOVEFUSU9OXzAsCiAgICAgICAgICAgICBsYXllclN0YWNrUmVjdCwgZGlzcGxheVJlY3QpOwogICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTI5NSwxMSArMzIxLDExIEBACiAgICAgc3A8SUJpbmRlcj4gZHB5ID0gU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpjcmVhdGVEaXNwbGF5KAogICAgICAgICAgICAgU3RyaW5nOCgiU2NyZWVuUmVjb3JkZXIiKSwgZmFsc2UgLypzZWN1cmUqLyk7CiAKLSAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6Om9wZW5HbG9iYWxUcmFuc2FjdGlvbigpOwotICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6c2V0RGlzcGxheVN1cmZhY2UoZHB5LCBidWZmZXJQcm9kdWNlcik7Ci0gICAgc2V0RGlzcGxheVByb2plY3Rpb24oZHB5LCBtYWluRHB5SW5mbyk7Ci0gICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpzZXREaXNwbGF5TGF5ZXJTdGFjayhkcHksIDApOyAgICAvLyBkZWZhdWx0IHN0YWNrCi0gICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpjbG9zZUdsb2JhbFRyYW5zYWN0aW9uKCk7CisgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpUcmFuc2FjdGlvbiB0OworICAgIHQuc2V0RGlzcGxheVN1cmZhY2UoZHB5LCBidWZmZXJQcm9kdWNlcik7CisgICAgc2V0RGlzcGxheVByb2plY3Rpb24odCwgZHB5LCBtYWluRHB5SW5mbyk7CisgICAgdC5zZXREaXNwbGF5TGF5ZXJTdGFjayhkcHksIDApOyAgICAvLyBkZWZhdWx0IHN0YWNrCisgICAgdC5hcHBseSgpOwogCiAgICAgKnBEaXNwbGF5SGFuZGxlID0gZHB5OwogCkBAIC0zNDQsNiArMzcwLDcgQEAKICAgICAgICAgaWYgKHN5c3RlbVRpbWUoQ0xPQ0tfTU9OT1RPTklDKSA+IGVuZFdoZW5Oc2VjKSB7CiAgICAgICAgICAgICBpZiAoZ1ZlcmJvc2UpIHsKICAgICAgICAgICAgICAgICBwcmludGYoIlRpbWUgbGltaXQgcmVhY2hlZFxuIik7CisgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMzc5LDkgKzQwNiw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiZ2V0RGlzcGxheUluZm8obWFpbikgZmFpbGVkOiAlZCIsIGVycik7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3JpZW50YXRpb24gIT0gbWFpbkRweUluZm8ub3JpZW50YXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJvcmllbnRhdGlvbiBjaGFuZ2VkLCBub3cgJWQiLCBtYWluRHB5SW5mby5vcmllbnRhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6Om9wZW5HbG9iYWxUcmFuc2FjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGlzcGxheVByb2plY3Rpb24odmlydHVhbERweSwgbWFpbkRweUluZm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpjbG9zZUdsb2JhbFRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OlRyYW5zYWN0aW9uIHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXREaXNwbGF5UHJvamVjdGlvbih0LCB2aXJ0dWFsRHB5LCBtYWluRHB5SW5mbyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0LmFwcGx5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IG1haW5EcHlJbmZvLm9yaWVudGF0aW9uOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtNDgxLDYgKzUwOCw3IEBACiAgICAgICAgIHByaW50ZigiRW5jb2RlciBzdG9wcGluZzsgcmVjb3JkZWQgJXUgZnJhbWVzIGluICUiIFBSSWQ2NCAiIHNlY29uZHNcbiIsCiAgICAgICAgICAgICAgICAgZGVidWdOdW1GcmFtZXMsIG5hbm9zZWNvbmRzX3RvX3NlY29uZHMoCiAgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1UaW1lKENMT0NLX01PTk9UT05JQykgLSBzdGFydFdoZW5Oc2VjKSk7CisgICAgICAgIGZmbHVzaChzdGRvdXQpOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC01NTQsNiArNTgyLDcgQEAKICAgICAgICAgcHJpbnRmKCJNYWluIGRpc3BsYXkgaXMgJWR4JWQgQCUuMmZmcHMgKG9yaWVudGF0aW9uPSV1KVxuIiwKICAgICAgICAgICAgICAgICBtYWluRHB5SW5mby53LCBtYWluRHB5SW5mby5oLCBtYWluRHB5SW5mby5mcHMsCiAgICAgICAgICAgICAgICAgbWFpbkRweUluZm8ub3JpZW50YXRpb24pOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKICAgICB9CiAKICAgICBib29sIHJvdGF0ZWQgPSBpc0RldmljZVJvdGF0ZWQobWFpbkRweUluZm8ub3JpZW50YXRpb24pOwpAQCAtNjIxLDYgKzY1MCw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKGdWZXJib3NlKSB7CiAgICAgICAgICAgICBwcmludGYoIkJ1Z3JlcG9ydCBvdmVybGF5IGNyZWF0ZWRcbiIpOworICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICAvLyBVc2UgdGhlIGVuY29kZXIncyBpbnB1dCBzdXJmYWNlIGFzIHRoZSB2aXJ0dWFsIGRpc3BsYXkgc3VyZmFjZS4KQEAgLTcxMyw2ICs3NDMsNyBAQAogCiAgICAgICAgIGlmIChnVmVyYm9zZSkgewogICAgICAgICAgICAgcHJpbnRmKCJTdG9wcGluZyBlbmNvZGVyIGFuZCBtdXhlclxuIik7CisgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNzU5LDYgKzc5MCw3IEBACiAgICAgICAgICAgICBwcmludGYoIiAlcyIsIGFyZ3ZbaV0pOwogICAgICAgICB9CiAgICAgICAgIHB1dGNoYXIoJ1xuJyk7CisgICAgICAgIGZmbHVzaChzdGRvdXQpOwogICAgIH0KIAogICAgIHBpZF90IHBpZCA9IGZvcmsoKTsKQEAgLTg5Niw3ICs5MjgsOSBAQAogICAgICAgICB7ICJzaG93LWZyYW1lLXRpbWUiLCAgICBub19hcmd1bWVudCwgICAgICAgIE5VTEwsICdmJyB9LAogICAgICAgICB7ICJyb3RhdGUiLCAgICAgICAgICAgICBub19hcmd1bWVudCwgICAgICAgIE5VTEwsICdyJyB9LAogICAgICAgICB7ICJvdXRwdXQtZm9ybWF0IiwgICAgICByZXF1aXJlZF9hcmd1bWVudCwgIE5VTEwsICdvJyB9LAorICAgICAgICB7ICJjb2RlYy1uYW1lIiwgICAgICAgICByZXF1aXJlZF9hcmd1bWVudCwgIE5VTEwsICdOJyB9LAogICAgICAgICB7ICJtb25vdG9uaWMtdGltZSIsICAgICBub19hcmd1bWVudCwgICAgICAgIE5VTEwsICdtJyB9LAorICAgICAgICB7ICJwZXJzaXN0ZW50LXN1cmZhY2UiLCBub19hcmd1bWVudCwgICAgICAgIE5VTEwsICdwJyB9LAogICAgICAgICB7IE5VTEwsICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgIE5VTEwsIDAgfQogICAgIH07CiAKQEAgLTk3Niw5ICsxMDEwLDE1IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnTic6CisgICAgICAgICAgICBnQ29kZWNOYW1lID0gb3B0YXJnOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgJ20nOgogICAgICAgICAgICAgZ01vbm90b25pY1RpbWUgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3AnOgorICAgICAgICAgICAgZ1BlcnNpc3RlbnRTdXJmYWNlID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgaWYgKGljICE9ICc/JykgewogICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2V0b3B0X2xvbmcgcmV0dXJuZWQgdW5leHBlY3RlZCB2YWx1ZSAweCV4XG4iLCBpYyk7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsgYi9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsKaW5kZXggZjY0N2ZmZC4uYzc2MTlhZiAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLm1rCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5tawpAQCAtOCw5ICs4LDkgQEAKICAgICAgICAgU2luZVNvdXJjZS5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLSAgICAgICAgbGlianBlZyBsaWJndWkgbGliY3V0aWxzIGxpYmxvZyBcCi0gICAgICAgIGxpYmhpZGxtZW1vcnkgXAorICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJtZWRpYV9vbXggbGlibWVkaWFleHRyYWN0b3IgbGlidXRpbHMgbGliYmluZGVyIFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJqcGVnIGxpYnVpIGxpYmd1aSBsaWJjdXRpbHMgbGlibG9nIFwKKyAgICAgICAgbGliaGlkbGJhc2UgXAogICAgICAgICBhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAgXAogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXApAQCAtMzYsNyArMzYsOCBAQAogICAgICAgICByZWNvcmQuY3BwCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24KKyAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibWVkaWEgbGlibWVkaWFleHRyYWN0b3IgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24KIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKICAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCkBAIC02MCw3ICs2MSw4IEBACiAgICAgICAgIHJlY29yZHZpZGVvLmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibWVkaWEgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYm1lZGlhZXh0cmFjdG9yIGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgXAorICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uCiAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCiAgICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXApAQCAtODUsNyArODcsOCBAQAogICAgICAgICBhdWRpb2xvb3AuY3BwCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24KKyAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibWVkaWEgbGlibWVkaWFleHRyYWN0b3IgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24KIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKICAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCkBAIC0xMDcsOCArMTEwLDggQEAKICAgICAgICAgc3RyZWFtLmNwcCAgICBcCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIGxpYmd1aSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGlibWVkaWEgbGliY3V0aWxzCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgbGlidWkgbGliZ3VpIFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJtZWRpYSBsaWJjdXRpbHMgbGlibWVkaWFleHRyYWN0b3IKIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKICAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCkBAIC0xMzIsNyArMTM1LDcgQEAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCi0gICAgICAgIGxpYm1lZGlhIGxpYmF1ZGlvY2xpZW50IGxpYmd1aSBsaWJjdXRpbHMKKyAgICAgICAgbGlibWVkaWEgbGlibWVkaWFfb214IGxpYmF1ZGlvY2xpZW50IGxpYnVpIGxpYmd1aSBsaWJjdXRpbHMKIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKICAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCkBAIC0xNjMsNiArMTY2LDggQEAKICAgICAgICAgbGliYmluZGVyIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCiAgICAgICAgIGxpYm1lZGlhIFwKKyAgICAgICAgbGlibWVkaWFfb214IFwKKyAgICAgICAgbGlidWkgXAogICAgICAgICBsaWJndWkgXAogICAgICAgICBsaWJjdXRpbHMgXAogICAgICAgICBsaWJSU2NwcCBcCkBAIC0xOTksNyArMjA0LDcgQEAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCi0gICAgICAgIGxpYmN1dGlscyBsaWJjCisgICAgICAgIGxpYmN1dGlscyBsaWJjIGxpYm1lZGlhZXh0cmFjdG9yCiAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCiAgICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXApkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9TaW5lU291cmNlLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvU2luZVNvdXJjZS5jcHAKaW5kZXggY2FkOGNhZi4uMGVjYzE2YyAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9TaW5lU291cmNlLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L1NpbmVTb3VyY2UuY3BwCkBAIC00LDYgKzQsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogCkBAIC01OSwxMCArNjAsMTAgQEAKIH0KIAogc3RhdHVzX3QgU2luZVNvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICogLyogb3B0aW9ucyAqLykgeworICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICogLyogb3B0aW9ucyAqLykgewogICAgICpvdXQgPSBOVUxMOwogCi0gICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKICAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOwogCiAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtODgsNyArODksNyBAQAogICAgICAgICB4ICs9IGs7CiAgICAgfQogCi0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCisgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpbVBoYXNlICogMTAwMDAwMCkgLyBtU2FtcGxlUmF0ZSk7CiAKICAgICBtUGhhc2UgKz0gbnVtRnJhbWVzUGVyQnVmZmVyOwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9TaW5lU291cmNlLmggYi9jbWRzL3N0YWdlZnJpZ2h0L1NpbmVTb3VyY2UuaAppbmRleCBiZTA1NjYxLi4xODE3MjkxIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L1NpbmVTb3VyY2UuaAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L1NpbmVTb3VyY2UuaApAQCAtMiw3ICsyLDcgQEAKIAogI2RlZmluZSBTSU5FX1NPVVJDRV9IXwogCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPHV0aWxzL0NvbXBhdC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0xOCw3ICsxOCw3IEBACiAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgflNpbmVTb3VyY2UoKTsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvYXVkaW9sb29wLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvYXVkaW9sb29wLmNwcAppbmRleCBlZDQ0YjRkLi5kNGYyZThkIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L2F1ZGlvbG9vcC5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9hdWRpb2xvb3AuY3BwCkBAIC0xNCw2ICsxNCwxMCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiYXVkaW9sb29wIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxmY250bC5oPgpAQCAtMjksNyArMzMsNiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuaD4KICNpbmNsdWRlICJTaW5lU291cmNlLmgiCiAKQEAgLTM3LDExICs0MCwxMyBAQAogCiBzdGF0aWMgdm9pZCB1c2FnZShjb25zdCBjaGFyKiBuYW1lKQogewotICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstZCBkdS5yYXRpb25dIFstbV0gWy13XSBbPG91dHB1dC1maWxlPl1cbiIsIG5hbWUpOworICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstZCBkdS5yYXRpb25dIFstbV0gWy13XSBbLU4gbmFtZV0gWzxvdXRwdXQtZmlsZT5dXG4iLCBuYW1lKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIkVuY29kZXMgZWl0aGVyIGEgc2luZSB3YXZlIG9yIG1pY3JvcGhvbmUgaW5wdXQgdG8gQU1SIGZvcm1hdFxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgLWQgICAgZHVyYXRpb24gaW4gc2Vjb25kcywgZGVmYXVsdCA1IHNlY29uZHNcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1tICAgIHVzZSBtaWNyb3Bob25lIGZvciBpbnB1dCwgZGVmYXVsdCBzaW5lIHNvdXJjZVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgLXcgICAgdXNlIEFNUiB3aWRlYmFuZCAoZGVmYXVsdCBuYXJyb3diYW5kKVxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgLU4gICAgbmFtZSBvZiB0aGUgZW5jb2RlcjsgbXVzdCBiZSBzZXQgd2l0aCAtTVxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgLU0gICAgbWVkaWEgdHlwZSBvZiB0aGUgZW5jb2RlcjsgbXVzdCBiZSBzZXQgd2l0aCAtTlxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgPG91dHB1dC1maWxlPiBvdXRwdXQgZmlsZSBmb3IgQU1SIGVuY29kaW5nLCIKICAgICAgICAgICAgICIgaWYgdW5zcGVjaWZpZWQsIGRlY29kZSB0byBzcGVha2VyLlxuIik7CiB9CkBAIC01NCw4ICs1OSwxMCBAQAogICAgIGJvb2wgb3V0cHV0V0JBTVIgPSBmYWxzZTsKICAgICBib29sIHBsYXlUb1NwZWFrZXIgPSB0cnVlOwogICAgIGNvbnN0IGNoYXIqIGZpbGVPdXQgPSBOVUxMOworICAgIEFTdHJpbmcgbmFtZTsKKyAgICBBU3RyaW5nIG1lZGlhVHlwZTsKICAgICBpbnQgY2g7Ci0gICAgd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAiZDptdyIpKSAhPSAtMSkgeworICAgIHdoaWxlICgoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgImQ6bXdOOk06IikpICE9IC0xKSB7CiAgICAgICAgIHN3aXRjaCAoY2gpIHsKICAgICAgICAgY2FzZSAnZCc6CiAgICAgICAgICAgICBkdXJhdGlvbiA9IGF0b2kob3B0YXJnKTsKQEAgLTY2LDYgKzczLDEyIEBACiAgICAgICAgIGNhc2UgJ3cnOgogICAgICAgICAgICAgb3V0cHV0V0JBTVIgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ04nOgorICAgICAgICAgICAgbmFtZS5zZXRUbyhvcHRhcmcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ00nOgorICAgICAgICAgICAgbWVkaWFUeXBlLnNldFRvKG9wdGFyZyk7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICAgcmV0dXJuIC0xOwpAQCAtNzYsOCArODksMTggQEAKICAgICBpZiAoYXJnYyA9PSAxKSB7CiAgICAgICAgIGZpbGVPdXQgPSBhcmd2WzBdOwogICAgIH0KLSAgICBjb25zdCBpbnQzMl90IGtTYW1wbGVSYXRlID0gb3V0cHV0V0JBTVIgPyAxNjAwMCA6IDgwMDA7Ci0gICAgY29uc3QgaW50MzJfdCBrQml0UmF0ZSA9IG91dHB1dFdCQU1SID8gMTYwMDAgOiA4MDAwOworICAgIGlmICgobmFtZS5lbXB0eSgpICYmICFtZWRpYVR5cGUuZW1wdHkoKSkgfHwgKCFuYW1lLmVtcHR5KCkgJiYgbWVkaWFUeXBlLmVtcHR5KCkpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiLU4gYW5kIC1NIG11c3QgYmUgc2V0IHRvZ2V0aGVyXG4iKTsKKyAgICAgICAgdXNhZ2UoYXJndlswXSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFuYW1lLmVtcHR5KCkgJiYgZmlsZU91dCAhPSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiLU4gYW5kIC1NIGNhbm5vdCBiZSB1c2VkIHdpdGggPG91dHB1dCBmaWxlPlxuIik7CisgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGludDMyX3Qgc2FtcGxlUmF0ZSA9ICFuYW1lLmVtcHR5KCkgPyA0NDEwMCA6IG91dHB1dFdCQU1SID8gMTYwMDAgOiA4MDAwOworICAgIGludDMyX3QgYml0UmF0ZSA9IHNhbXBsZVJhdGU7CiAKICAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAgICAgc3A8TWVkaWFTb3VyY2U+IHNvdXJjZTsKQEAgLTg3LDIyICsxMTAsMjcgQEAKICAgICAgICAgc291cmNlID0gbmV3IEF1ZGlvU291cmNlKAogICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9NSUMsCiAgICAgICAgICAgICAgICAgU3RyaW5nMTYoKSwKLSAgICAgICAgICAgICAgICBrU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgIGNoYW5uZWxzKTsKICAgICB9IGVsc2UgewogICAgICAgICAvLyB1c2UgYSBzaW5lIHNvdXJjZSBhdCA1MDAgaHouCi0gICAgICAgIHNvdXJjZSA9IG5ldyBTaW5lU291cmNlKGtTYW1wbGVSYXRlLCBjaGFubmVscyk7CisgICAgICAgIHNvdXJjZSA9IG5ldyBTaW5lU291cmNlKHNhbXBsZVJhdGUsIGNoYW5uZWxzKTsKICAgICB9CiAKICAgICBzcDxBTWVzc2FnZT4gbWV0YSA9IG5ldyBBTWVzc2FnZTsKLSAgICBtZXRhLT5zZXRTdHJpbmcoCi0gICAgICAgICAgICAibWltZSIsCi0gICAgICAgICAgICBvdXRwdXRXQkFNUiA/IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQgotICAgICAgICAgICAgICAgICAgICA6IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQik7CisgICAgaWYgKG5hbWUuZW1wdHkoKSkgeworICAgICAgICBtZXRhLT5zZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgIm1pbWUiLAorICAgICAgICAgICAgICAgIG91dHB1dFdCQU1SID8gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCCisgICAgICAgICAgICAgICAgICAgICAgICA6IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWV0YS0+c2V0U3RyaW5nKCJtaW1lIiwgbWVkaWFUeXBlKTsKKyAgICAgICAgbWV0YS0+c2V0U3RyaW5nKCJ0ZXN0aW5nLW5hbWUiLCBuYW1lKTsKKyAgICB9CiAKICAgICBtZXRhLT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIGNoYW5uZWxzKTsKLSAgICBtZXRhLT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBrU2FtcGxlUmF0ZSk7Ci0gICAgbWV0YS0+c2V0SW50MzIoImJpdHJhdGUiLCBrQml0UmF0ZSk7CisgICAgbWV0YS0+c2V0SW50MzIoInNhbXBsZS1yYXRlIiwgc2FtcGxlUmF0ZSk7CisgICAgbWV0YS0+c2V0SW50MzIoImJpdHJhdGUiLCBiaXRSYXRlKTsKICAgICBpbnQzMl90IG1heElucHV0U2l6ZTsKICAgICBpZiAoc291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKGtLZXlNYXhJbnB1dFNpemUsICZtYXhJbnB1dFNpemUpKSB7CiAgICAgICAgIG1ldGEtPnNldEludDMyKCJtYXgtaW5wdXQtc2l6ZSIsIG1heElucHV0U2l6ZSk7CkBAIC0xMTIsNyArMTQwLDcgQEAKICAgICBsb29wZXItPnNldE5hbWUoImF1ZGlvbG9vcCIpOwogICAgIGxvb3Blci0+c3RhcnQoKTsKIAotICAgIHNwPElNZWRpYVNvdXJjZT4gZW5jb2RlciA9IE1lZGlhQ29kZWNTb3VyY2U6OkNyZWF0ZShsb29wZXIsIG1ldGEsIHNvdXJjZSk7CisgICAgc3A8TWVkaWFTb3VyY2U+IGVuY29kZXIgPSBNZWRpYUNvZGVjU291cmNlOjpDcmVhdGUobG9vcGVyLCBtZXRhLCBzb3VyY2UpOwogCiAgICAgaWYgKGZpbGVPdXQgIT0gTlVMTCkgewogICAgICAgICAvLyB0YXJnZXQgZmlsZSBzcGVjaWZpZWQsIHdyaXRlIGVuY29kZWQgQU1SIG91dHB1dApAQCAtMTI4LDE5ICsxNTYsMjAgQEAKICAgICAgICAgd3JpdGVyLT5zdG9wKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gb3RoZXJ3aXNlIGRlY29kZSB0byBzcGVha2VyCi0gICAgICAgIHNwPElNZWRpYVNvdXJjZT4gZGVjb2RlciA9IFNpbXBsZURlY29kaW5nU291cmNlOjpDcmVhdGUoZW5jb2Rlcik7CisgICAgICAgIHNwPE1lZGlhU291cmNlPiBkZWNvZGVyID0gU2ltcGxlRGVjb2RpbmdTb3VyY2U6OkNyZWF0ZShlbmNvZGVyKTsKIAogICAgICAgICBpZiAocGxheVRvU3BlYWtlcikgewotICAgICAgICAgICAgQXVkaW9QbGF5ZXIgKnBsYXllciA9IG5ldyBBdWRpb1BsYXllcihOVUxMKTsKLSAgICAgICAgICAgIHBsYXllci0+c2V0U291cmNlKGRlY29kZXIpOwotICAgICAgICAgICAgcGxheWVyLT5zdGFydCgpOworICAgICAgICAgICAgQXVkaW9QbGF5ZXIgcGxheWVyKE5VTEwpOworICAgICAgICAgICAgcGxheWVyLnNldFNvdXJjZShkZWNvZGVyKTsKKyAgICAgICAgICAgIHBsYXllci5zdGFydCgpOwogICAgICAgICAgICAgc2xlZXAoZHVyYXRpb24pOwogCitBTE9HSSgiTGluZTogJWQiLCBfX0xJTkVfXyk7CiAgICAgICAgICAgICBkZWNvZGVyLmNsZWFyKCk7IC8vIG11c3QgY2xlYXIgfGRlY29kZXJ8IG90aGVyd2lzZSBkZWxldGUgcGxheWVyIHdpbGwgaGFuZy4KLSAgICAgICAgICAgIGRlbGV0ZSBwbGF5ZXI7IC8vIHRoZXJlIGlzIG5vIHBsYXllci0+c3RvcCgpLi4uCitBTE9HSSgiTGluZTogJWQiLCBfX0xJTkVfXyk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBDSEVDS19FUShkZWNvZGVyLT5zdGFydCgpLCAoc3RhdHVzX3QpT0spOwotICAgICAgICAgICAgTWVkaWFCdWZmZXIqIGJ1ZmZlcjsKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSogYnVmZmVyOwogICAgICAgICAgICAgd2hpbGUgKGRlY29kZXItPnJlYWQoJmJ1ZmZlcikgPT0gT0spIHsKICAgICAgICAgICAgICAgICAvLyBkbyBzb21ldGhpbmcgd2l0aCBidWZmZXIgKHNhdmUgaXQgZXZlbnR1YWxseT8pCiAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBzdG9wIGFmdGVyIHNvbWUgY291bnQgdGhvdWdoLi4uCkBAIC0xNTEsNiArMTgwLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIENIRUNLX0VRKGRlY29kZXItPnN0b3AoKSwgKHN0YXR1c190KU9LKTsKICAgICAgICAgfQorQUxPR0koIkxpbmU6ICVkIiwgX19MSU5FX18pOwogICAgIH0KIAogICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9jb2RlYy5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L2NvZGVjLmNwcAppbmRleCAzMTA4YTY3Li42YTU4NDY3IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L2NvZGVjLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L2NvZGVjLmNwcApAQCAtNDMwLDEwICs0MzAsMTAgQEAKICAgICAgICAgQ0hFQ0soY29udHJvbCAhPSBOVUxMKTsKICAgICAgICAgQ0hFQ0soY29udHJvbC0+aXNWYWxpZCgpKTsKIAotICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6Om9wZW5HbG9iYWxUcmFuc2FjdGlvbigpOwotICAgICAgICBDSEVDS19FUShjb250cm9sLT5zZXRMYXllcihJTlRfTUFYKSwgKHN0YXR1c190KU9LKTsKLSAgICAgICAgQ0hFQ0tfRVEoY29udHJvbC0+c2hvdygpLCAoc3RhdHVzX3QpT0spOwotICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmNsb3NlR2xvYmFsVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpUcmFuc2FjdGlvbnt9CisgICAgICAgICAgICAgICAgIC5zZXRMYXllcihjb250cm9sLCBJTlRfTUFYKQorICAgICAgICAgICAgICAgICAuc2hvdyhjb250cm9sKQorICAgICAgICAgICAgICAgICAuYXBwbHkoKTsKIAogICAgICAgICBzdXJmYWNlID0gY29udHJvbC0+Z2V0U3VyZmFjZSgpOwogICAgICAgICBDSEVDSyhzdXJmYWNlICE9IE5VTEwpOwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9tZWRpYWZpbHRlci5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L21lZGlhZmlsdGVyLmNwcAppbmRleCBmMjE5ZTY5Li5mMjRkMmRkIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L21lZGlhZmlsdGVyLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L21lZGlhZmlsdGVyLmNwcApAQCAtNzY0LDEwICs3NjQsMTAgQEAKICAgICAgICAgQ0hFQ0soY29udHJvbCAhPSBOVUxMKTsKICAgICAgICAgQ0hFQ0soY29udHJvbC0+aXNWYWxpZCgpKTsKIAotICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6Om9wZW5HbG9iYWxUcmFuc2FjdGlvbigpOwotICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIGNvbnRyb2wtPnNldExheWVyKElOVF9NQVgpKTsKLSAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBjb250cm9sLT5zaG93KCkpOwotICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmNsb3NlR2xvYmFsVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpUcmFuc2FjdGlvbnt9CisgICAgICAgICAgICAgICAgLnNldExheWVyKGNvbnRyb2wsIElOVF9NQVgpCisgICAgICAgICAgICAgICAgLnNob3coY29udHJvbCkKKyAgICAgICAgICAgICAgICAuYXBwbHkoKTsKIAogICAgICAgICBzdXJmYWNlID0gY29udHJvbC0+Z2V0U3VyZmFjZSgpOwogICAgICAgICBDSEVDSyhzdXJmYWNlICE9IE5VTEwpOwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwCmluZGV4IDk0YzJlOTYuLjQ0YjAwMTUgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlICJTaW5lU291cmNlLmgiCiAKICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KQEAgLTI3LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgpAQCAtMTIwLDcgKzEyMSw3IEBACiAgICAgc3A8TWVkaWFTb3VyY2U+IHNvdXJjZTsKIAogICAgIHNwPE1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3IgPQotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKG5ldyBGaWxlU291cmNlKGZpbGVuYW1lKSk7CisgICAgICAgIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Q3JlYXRlKG5ldyBGaWxlU291cmNlKGZpbGVuYW1lKSk7CiAgICAgaWYgKGV4dHJhY3RvciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTMyMCwxNCArMzIxLDE0IEBACiAgICAgbG9vcGVyLT5zZXROYW1lKCJyZWNvcmQiKTsKICAgICBsb29wZXItPnN0YXJ0KCk7CiAKLSAgICBzcDxJTWVkaWFTb3VyY2U+IGVuY29kZXIgPQorICAgIHNwPE1lZGlhU291cmNlPiBlbmNvZGVyID0KICAgICAgICAgTWVkaWFDb2RlY1NvdXJjZTo6Q3JlYXRlKGxvb3BlciwgZW5jTWV0YSwgYXVkaW9Tb3VyY2UpOwogCiAgICAgZW5jb2Rlci0+c3RhcnQoKTsKIAogICAgIGludDMyX3QgbiA9IDA7CiAgICAgc3RhdHVzX3QgZXJyOwotICAgIE1lZGlhQnVmZmVyICpidWZmZXI7CisgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7CiAgICAgd2hpbGUgKChlcnIgPSBlbmNvZGVyLT5yZWFkKCZidWZmZXIpKSA9PSBPSykgewogICAgICAgICBwcmludGYoIi4iKTsKICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZHZpZGVvLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkdmlkZW8uY3BwCmluZGV4IDdhM2M4NDIuLmE2M2I5YjkgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkdmlkZW8uY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkdmlkZW8uY3BwCkBAIC05MCw3ICs5MCw3IEBACiAgICAgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyBfX3VudXNlZCkgeworICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMgX191bnVzZWQpIHsKIAogICAgICAgICBpZiAobU51bUZyYW1lc091dHB1dCAlIDEwID09IDApIHsKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiLiIpOwpAQCAtMTE0LDggKzExNCw4IEBACiAgICAgICAgIHggPSB4ID49IDB4YTAgPyAweDYwIDogeCArIDE7CiAjZW5kaWYKICAgICAgICAgKCpidWZmZXIpLT5zZXRfcmFuZ2UoMCwgbVNpemUpOwotICAgICAgICAoKmJ1ZmZlciktPm1ldGFfZGF0YSgpLT5jbGVhcigpOwotICAgICAgICAoKmJ1ZmZlciktPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKKyAgICAgICAgKCpidWZmZXIpLT5tZXRhX2RhdGEoKS5jbGVhcigpOworICAgICAgICAoKmJ1ZmZlciktPm1ldGFfZGF0YSgpLnNldEludDY0KAogICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAobU51bUZyYW1lc091dHB1dCAqIDEwMDAwMDApIC8gbUZyYW1lUmF0ZSk7CiAgICAgICAgICsrbU51bUZyYW1lc091dHB1dDsKIApAQCAtMzAzLDcgKzMwMyw3IEBACiAgICAgbG9vcGVyLT5zZXROYW1lKCJyZWNvcmR2aWRlbyIpOwogICAgIGxvb3Blci0+c3RhcnQoKTsKIAotICAgIHNwPElNZWRpYVNvdXJjZT4gZW5jb2RlciA9CisgICAgc3A8TWVkaWFTb3VyY2U+IGVuY29kZXIgPQogICAgICAgICBNZWRpYUNvZGVjU291cmNlOjpDcmVhdGUoCiAgICAgICAgICAgICAgICAgbG9vcGVyLCBlbmNfbWV0YSwgc291cmNlLCBOVUxMIC8qIGNvbnN1bWVyICovLAogICAgICAgICAgICAgICAgIHByZWZlclNvZnR3YXJlQ29kZWMgPyBNZWRpYUNvZGVjU291cmNlOjpGTEFHX1BSRUZFUl9TT0ZUV0FSRV9DT0RFQyA6IDApOwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAppbmRleCBkNzAyODJiLi42MWZjODk3IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcApAQCAtMzEsOSArMzEsMTEgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY1NlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CkBAIC00MSwxNCArNDMsMTQgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgogI2luY2x1ZGUgImluY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgiCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9KUEVHU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KQEAgLTY1LDcgKzY3LDYgQEAKICNpbmNsdWRlIDxndWkvU3VyZmFjZUNvbXBvc2VyQ2xpZW50Lmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teC5oPgotI2luY2x1ZGUgPG1lZGlhL29teC8xLjAvV09teC5oPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIApAQCAtNzksNiArODAsNyBAQAogc3RhdGljIGJvb2wgZ0Rpc3BsYXlIaXN0b2dyYW07CiBzdGF0aWMgYm9vbCBzaG93UHJvZ3Jlc3MgPSB0cnVlOwogc3RhdGljIFN0cmluZzggZ1dyaXRlTVA0RmlsZW5hbWU7CitzdGF0aWMgU3RyaW5nOCBnQ29tcG9uZW50TmFtZU92ZXJyaWRlOwogCiBzdGF0aWMgc3A8QU5hdGl2ZVdpbmRvdz4gZ1N1cmZhY2U7CiAKQEAgLTE0MSwxNCArMTQzLDE0IEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBkdW1wU291cmNlKGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSwgY29uc3QgU3RyaW5nOCAmZmlsZW5hbWUpIHsKK3N0YXRpYyB2b2lkIGR1bXBTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsIGNvbnN0IFN0cmluZzggJmZpbGVuYW1lKSB7CiAgICAgRklMRSAqb3V0ID0gZm9wZW4oZmlsZW5hbWUuc3RyaW5nKCksICJ3YiIpOwogCiAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBzb3VyY2UtPnN0YXJ0KCkpOwogCiAgICAgc3RhdHVzX3QgZXJyOwogICAgIGZvciAoOzspIHsKLSAgICAgICAgTWVkaWFCdWZmZXIgKm1idWY7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqbWJ1ZjsKICAgICAgICAgZXJyID0gc291cmNlLT5yZWFkKCZtYnVmKTsKIAogICAgICAgICBpZiAoZXJyID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKQEAgLTE3NCwxMyArMTc2LDEzIEBACiAgICAgb3V0ID0gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgcGxheVNvdXJjZShzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKK3N0YXRpYyB2b2lkIHBsYXlTb3VyY2Uoc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IHNvdXJjZS0+Z2V0Rm9ybWF0KCk7CiAKICAgICBjb25zdCBjaGFyICptaW1lOwogICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKIAotICAgIHNwPElNZWRpYVNvdXJjZT4gcmF3U291cmNlOworICAgIHNwPE1lZGlhU291cmNlPiByYXdTb3VyY2U7CiAgICAgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX1JBVywgbWltZSkpIHsKICAgICAgICAgcmF3U291cmNlID0gc291cmNlOwogICAgIH0gZWxzZSB7CkBAIC0xOTIsNyArMTk0LDEwIEBACiAgICAgICAgICAgICBDSEVDSyghZ1ByZWZlclNvZnR3YXJlQ29kZWMpOwogICAgICAgICAgICAgZmxhZ3MgfD0gTWVkaWFDb2RlY0xpc3Q6OmtIYXJkd2FyZUNvZGVjc09ubHk7CiAgICAgICAgIH0KLSAgICAgICAgcmF3U291cmNlID0gU2ltcGxlRGVjb2RpbmdTb3VyY2U6OkNyZWF0ZShzb3VyY2UsIGZsYWdzLCBnU3VyZmFjZSk7CisgICAgICAgIHJhd1NvdXJjZSA9IFNpbXBsZURlY29kaW5nU291cmNlOjpDcmVhdGUoCisgICAgICAgICAgICAgICAgc291cmNlLCBmbGFncywgZ1N1cmZhY2UsCisgICAgICAgICAgICAgICAgZ0NvbXBvbmVudE5hbWVPdmVycmlkZS5pc0VtcHR5KCkgPyBudWxscHRyIDogZ0NvbXBvbmVudE5hbWVPdmVycmlkZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICFnQ29tcG9uZW50TmFtZU92ZXJyaWRlLmlzRW1wdHkoKSk7CiAgICAgICAgIGlmIChyYXdTb3VyY2UgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC0yMjksNyArMjM0LDcgQEAKICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKTsKIAogICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXI7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOwogICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgb3B0aW9uczsKICAgICAgICAgaW50NjRfdCBzZWVrVGltZVVzID0gLTE7CiAgICAgICAgIGZvciAoOzspIHsKQEAgLTI0OCw3ICsyNTMsNyBAQAogICAgICAgICAgICAgICAgIHNob3VsZFNlZWsgPSB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzOwotICAgICAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVzdGFtcFVzKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lc3RhbXBVcykpOwogCiAgICAgICAgICAgICAgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKIApAQCAtMzE2LDcgKzMyMSw3IEBACiAgICAgd2hpbGUgKG51bUl0ZXJhdGlvbnNMZWZ0LS0gPiAwKSB7CiAgICAgICAgIGxvbmcgbnVtRnJhbWVzID0gMDsKIAotICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOworICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKIAogICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0RGVjb2RlVXMgPSBnZXROb3dVcygpOwpAQCAtNDA0LDE0ICs0MDksMTQgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIHN0cnVjdCBEZXRlY3RTeW5jU291cmNlIDogcHVibGljIE1lZGlhU291cmNlIHsKLSAgICBleHBsaWNpdCBEZXRlY3RTeW5jU291cmNlKGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CisgICAgZXhwbGljaXQgRGV0ZWN0U3luY1NvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKICAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyk7CisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKIAogcHJpdmF0ZToKICAgICBlbnVtIFN0cmVhbVR5cGUgewpAQCAtNDIxLDE0ICs0MjYsMTQgQEAKICAgICAgICAgT1RIRVIsCiAgICAgfTsKIAotICAgIHNwPElNZWRpYVNvdXJjZT4gbVNvdXJjZTsKKyAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKICAgICBTdHJlYW1UeXBlIG1TdHJlYW1UeXBlOwogICAgIGJvb2wgbVNhd0ZpcnN0SURSRnJhbWU7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEZXRlY3RTeW5jU291cmNlKTsKIH07CiAKLURldGVjdFN5bmNTb3VyY2U6OkRldGVjdFN5bmNTb3VyY2UoY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlKQorRGV0ZWN0U3luY1NvdXJjZTo6RGV0ZWN0U3luY1NvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkKICAgICA6IG1Tb3VyY2Uoc291cmNlKSwKICAgICAgIG1TdHJlYW1UeXBlKE9USEVSKSwKICAgICAgIG1TYXdGaXJzdElEUkZyYW1lKGZhbHNlKSB7CkBAIC00NjAsNyArNDY1LDcgQEAKICAgICByZXR1cm4gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7CiB9CiAKLXN0YXRpYyBib29sIGlzSURSRnJhbWUoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgeworc3RhdGljIGJvb2wgaXNJRFJGcmFtZShNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgewogICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPQogICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKICAgICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CkBAIC00NzcsNyArNDgyLDcgQEAKIH0KIAogc3RhdHVzX3QgRGV0ZWN0U3luY1NvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICBmb3IgKDs7KSB7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnJlYWQoYnVmZmVyLCBvcHRpb25zKTsKIApAQCAtNDg3LDEyICs0OTIsMTIgQEAKIAogICAgICAgICBpZiAobVN0cmVhbVR5cGUgPT0gQVZDKSB7CiAgICAgICAgICAgICBib29sIGlzSURSID0gaXNJRFJGcmFtZSgqYnVmZmVyKTsKLSAgICAgICAgICAgICgqYnVmZmVyKS0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgaXNJRFIpOworICAgICAgICAgICAgKCpidWZmZXIpLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIGlzSURSKTsKICAgICAgICAgICAgIGlmIChpc0lEUikgewogICAgICAgICAgICAgICAgIG1TYXdGaXJzdElEUkZyYW1lID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICgqYnVmZmVyKS0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgdHJ1ZSk7CisgICAgICAgICAgICAoKmJ1ZmZlciktPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgdHJ1ZSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobVN0cmVhbVR5cGUgIT0gQVZDIHx8IG1TYXdGaXJzdElEUkZyYW1lKSB7CkBAIC01MTAsNyArNTE1LDcgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIHN0YXRpYyB2b2lkIHdyaXRlU291cmNlc1RvTVA0KAotICAgICAgICBWZWN0b3I8c3A8SU1lZGlhU291cmNlPiA+ICZzb3VyY2VzLCBib29sIHN5bmNJbmZvUHJlc2VudCkgeworICAgICAgICBWZWN0b3I8c3A8TWVkaWFTb3VyY2U+ID4gJnNvdXJjZXMsIGJvb2wgc3luY0luZm9QcmVzZW50KSB7CiAjaWYgMAogICAgIHNwPE1QRUc0V3JpdGVyPiB3cml0ZXIgPQogICAgICAgICBuZXcgTVBFRzRXcml0ZXIoZ1dyaXRlTVA0RmlsZW5hbWUuc3RyaW5nKCkpOwpAQCAtNTI4LDcgKzUzMyw3IEBACiAgICAgd3JpdGVyLT5zZXRNYXhGaWxlRHVyYXRpb24oNjAwMDAwMDBsbCk7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNvdXJjZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgc3A8SU1lZGlhU291cmNlPiBzb3VyY2UgPSBzb3VyY2VzLmVkaXRJdGVtQXQoaSk7CisgICAgICAgIHNwPE1lZGlhU291cmNlPiBzb3VyY2UgPSBzb3VyY2VzLmVkaXRJdGVtQXQoaSk7CiAKICAgICAgICAgQ0hFQ0tfRVEod3JpdGVyLT5hZGRTb3VyY2UoCiAgICAgICAgICAgICAgICAgICAgIHN5bmNJbmZvUHJlc2VudCA/IHNvdXJjZSA6IG5ldyBEZXRlY3RTeW5jU291cmNlKHNvdXJjZSkpLApAQCAtNTQ1LDcgKzU1MCw3IEBACiAgICAgd3JpdGVyLT5zdG9wKCk7CiB9CiAKLXN0YXRpYyB2b2lkIHBlcmZvcm1TZWVrVGVzdChjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKK3N0YXRpYyB2b2lkIHBlcmZvcm1TZWVrVGVzdChjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgewogICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgc291cmNlLT5zdGFydCgpKTsKIAogICAgIGludDY0X3QgZHVyYXRpb25VczsKQEAgLTU1Nyw3ICs1NjIsNyBAQAogICAgICAgICBvcHRpb25zLnNldFNlZWtUbygKICAgICAgICAgICAgICAgICBzZWVrVGltZVVzLCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQyk7CiAKLSAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7CiAgICAgICAgIHN0YXR1c190IGVycjsKICAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICAgZXJyID0gc291cmNlLT5yZWFkKCZidWZmZXIsICZvcHRpb25zKTsKQEAgLTU4Niw3ICs1OTEsNyBAQAogCiAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOwotICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CisgICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwogCiAgICAgICAgICAgICBwcmludGYoIiUiIFBSSWQ2NCAiXHQlIiBQUklkNjQgIlx0JSIgUFJJZDY0ICJcbiIsCiAgICAgICAgICAgICAgICAgICAgc2Vla1RpbWVVcywgdGltZVVzLCBzZWVrVGltZVVzIC0gdGltZVVzKTsKQEAgLTYxNyw2ICs2MjIsNyBAQAogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1vIHBsYXliYWNrIGF1ZGlvXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtdyhyaXRlKSBmaWxlbmFtZSAod3JpdGUgdG8gLm1wNCBmaWxlKVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLWsgc2VlayB0ZXN0XG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtTihhbWUpIG9mIHRoZSBjb21wb25lbnRcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC14IGRpc3BsYXkgYSBoaXN0b2dyYW0gb2YgZGVjb2RpbmcgdGltZXMvZnBzICIKICAgICAgICAgICAgICAgICAgICAgIih2aWRlbyBvbmx5KVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLXEgZG9uJ3Qgc2hvdyBwcm9ncmVzcyBpbmRpY2F0b3JcbiIpOwpAQCAtNzAyLDcgKzcwOCw3IEBACiAgICAgc3A8QUxvb3Blcj4gbG9vcGVyOwogCiAgICAgaW50IHJlczsKLSAgICB3aGlsZSAoKHJlcyA9IGdldG9wdChhcmdjLCBhcmd2LCAiaGFxbjpsbTpiOnB0c3JvdzpreFNUZDpEOiIpKSA+PSAwKSB7CisgICAgd2hpbGUgKChyZXMgPSBnZXRvcHQoYXJnYywgYXJndiwgImhhcW46bG06YjpwdHNyb3c6a046eFNUZDpEOiIpKSA+PSAwKSB7CiAgICAgICAgIHN3aXRjaCAocmVzKSB7CiAgICAgICAgICAgICBjYXNlICdhJzoKICAgICAgICAgICAgIHsKQEAgLTczMSw2ICs3MzcsMTIgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgY2FzZSAnTic6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ0NvbXBvbmVudE5hbWVPdmVycmlkZS5zZXRUbyhvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBjYXNlICdsJzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBsaXN0Q29tcG9uZW50cyA9IHRydWU7CkBAIC04ODEsNyArODkzLDcgQEAKICAgICAgICAgICAgICAgICBWaWRlb0ZyYW1lICpmcmFtZSA9IChWaWRlb0ZyYW1lICopbWVtLT5wb2ludGVyKCk7CiAKICAgICAgICAgICAgICAgICBDSEVDS19FUSh3cml0ZUpwZWdGaWxlKCIvc2RjYXJkL291dC5qcGciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90ICopZnJhbWUgKyBzaXplb2YoVmlkZW9GcmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmdldEZsYXR0ZW5lZERhdGEoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bVdpZHRoLCBmcmFtZS0+bUhlaWdodCksIDApOwogICAgICAgICAgICAgfQogCkBAIC05MDksMzcgKzkyMSwyNCBAQAogICAgIH0KIAogICAgIGlmIChsaXN0Q29tcG9uZW50cykgewotICAgICAgICBzcDxJT01YPiBvbXg7Ci0gICAgICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5tZWRpYS50cmVibGVfb214IiwgdHJ1ZSkpIHsKLSAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOwotICAgICAgICAgICAgc3A8SU9teD4gdE9teCA9IElPbXg6OmdldFNlcnZpY2UoKTsKKyAgICAgICAgdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CisgICAgICAgIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOworICAgICAgICB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDsKKyAgICAgICAgc3A8SU9teD4gb214ID0gSU9teDo6Z2V0U2VydmljZSgpOworICAgICAgICBDSEVDSyhvbXguZ2V0KCkgIT0gbnVsbHB0cik7CiAKLSAgICAgICAgICAgIENIRUNLKHRPbXguZ2V0KCkgIT0gTlVMTCk7Ci0KLSAgICAgICAgICAgIG9teCA9IG5ldyB1dGlsczo6TFdPbXgodE9teCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7Ci0gICAgICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBzbS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEuY29kZWMiKSk7Ci0gICAgICAgICAgICBzcDxJTWVkaWFDb2RlY1NlcnZpY2U+IHNlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJTWVkaWFDb2RlY1NlcnZpY2U+KGJpbmRlcik7Ci0KLSAgICAgICAgICAgIENIRUNLKHNlcnZpY2UuZ2V0KCkgIT0gTlVMTCk7Ci0KLSAgICAgICAgICAgIG9teCA9IHNlcnZpY2UtPmdldE9NWCgpOwotICAgICAgICB9Ci0gICAgICAgIENIRUNLKG9teC5nZXQoKSAhPSBOVUxMKTsKLQotICAgICAgICBMaXN0PElPTVg6OkNvbXBvbmVudEluZm8+IGxpc3Q7Ci0gICAgICAgIG9teC0+bGlzdE5vZGVzKCZsaXN0KTsKLQotICAgICAgICBmb3IgKExpc3Q8SU9NWDo6Q29tcG9uZW50SW5mbz46Oml0ZXJhdG9yIGl0ID0gbGlzdC5iZWdpbigpOwotICAgICAgICAgICAgIGl0ICE9IGxpc3QuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgICAgIHByaW50ZigiJXNcdCBSb2xlczogIiwgKCppdCkubU5hbWUuc3RyaW5nKCkpOwotICAgICAgICAgICAgZm9yIChMaXN0PFN0cmluZzg+OjppdGVyYXRvciBpdFJvbGVzID0gKCppdCkubVJvbGVzLmJlZ2luKCkgOwotICAgICAgICAgICAgICAgICAgICBpdFJvbGVzICE9ICgqaXQpLm1Sb2xlcy5lbmQoKSA7ICsraXRSb2xlcykgewotICAgICAgICAgICAgICAgIHByaW50ZigiJXNcdCIsICgqaXRSb2xlcykuc3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwotICAgICAgICB9CisgICAgICAgIGhpZGxfdmVjPElPbXg6OkNvbXBvbmVudEluZm8+IG5vZGVMaXN0OworICAgICAgICBhdXRvIHRyYW5zU3RhdHVzID0gb214LT5saXN0Tm9kZXMoW10oCisgICAgICAgICAgICAgICAgY29uc3QgYXV0byYgc3RhdHVzLCBjb25zdCBhdXRvJiBub2RlTGlzdCkgeworICAgICAgICAgICAgICAgICAgICBDSEVDSyhzdGF0dXMgPT0gU3RhdHVzOjpPSyk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgaW5mbyA6IG5vZGVMaXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzXHQgUm9sZXM6ICIsIGluZm8ubU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHJvbGUgOiBpbmZvLm1Sb2xlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXNcdCIsIHJvbGUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgQ0hFQ0sodHJhbnNTdGF0dXMuaXNPaygpKTsKICAgICB9CiAKICAgICBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+IGNvbXBvc2VyQ2xpZW50OwpAQCAtOTYwLDEwICs5NTksMTAgQEAKICAgICAgICAgICAgIENIRUNLKGNvbnRyb2wgIT0gTlVMTCk7CiAgICAgICAgICAgICBDSEVDSyhjb250cm9sLT5pc1ZhbGlkKCkpOwogCi0gICAgICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6Om9wZW5HbG9iYWxUcmFuc2FjdGlvbigpOwotICAgICAgICAgICAgQ0hFQ0tfRVEoY29udHJvbC0+c2V0TGF5ZXIoSU5UX01BWCksIChzdGF0dXNfdClPSyk7Ci0gICAgICAgICAgICBDSEVDS19FUShjb250cm9sLT5zaG93KCksIChzdGF0dXNfdClPSyk7Ci0gICAgICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmNsb3NlR2xvYmFsVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6VHJhbnNhY3Rpb257fQorICAgICAgICAgICAgICAgICAgICAuc2V0TGF5ZXIoY29udHJvbCwgSU5UX01BWCkKKyAgICAgICAgICAgICAgICAgICAgLnNob3coY29udHJvbCkKKyAgICAgICAgICAgICAgICAgICAgLmFwcGx5KCk7CiAKICAgICAgICAgICAgIGdTdXJmYWNlID0gY29udHJvbC0+Z2V0U3VyZmFjZSgpOwogICAgICAgICAgICAgQ0hFQ0soZ1N1cmZhY2UgIT0gTlVMTCk7CkBAIC05ODgsNyArOTg3LDcgQEAKICAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBhcmd2W2tdOwogCiAgICAgICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCBmaWxlbmFtZSk7CisgICAgICAgICAgICBEYXRhU291cmNlRmFjdG9yeTo6Q3JlYXRlRnJvbVVSSShOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCBmaWxlbmFtZSk7CiAKICAgICAgICAgaWYgKHN0cm5jYXNlY21wKGZpbGVuYW1lLCAic2luZToiLCA1KSAmJiBkYXRhU291cmNlID09IE5VTEwpIHsKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGNyZWF0ZSBkYXRhIHNvdXJjZS5cbiIpOwpAQCAtMTAwMiw4ICsxMDAxLDggQEAKICAgICAgICAgICAgIGlzSlBFRyA9IHRydWU7CiAgICAgICAgIH0KIAotICAgICAgICBWZWN0b3I8c3A8SU1lZGlhU291cmNlPiA+IG1lZGlhU291cmNlczsKLSAgICAgICAgc3A8SU1lZGlhU291cmNlPiBtZWRpYVNvdXJjZTsKKyAgICAgICAgVmVjdG9yPHNwPE1lZGlhU291cmNlPiA+IG1lZGlhU291cmNlczsKKyAgICAgICAgc3A8TWVkaWFTb3VyY2U+IG1lZGlhU291cmNlOwogCiAgICAgICAgIGlmIChpc0pQRUcpIHsKICAgICAgICAgICAgIG1lZGlhU291cmNlID0gbmV3IEpQRUdTb3VyY2UoZGF0YVNvdXJjZSk7CkBAIC0xMDIyLDcgKzEwMjEsNyBAQAogICAgICAgICAgICAgICAgIG1lZGlhU291cmNlcy5wdXNoKG1lZGlhU291cmNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNwPElNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3I6OkNyZWF0ZShkYXRhU291cmNlKTsKKyAgICAgICAgICAgIHNwPElNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpDcmVhdGUoZGF0YVNvdXJjZSk7CiAKICAgICAgICAgICAgIGlmIChleHRyYWN0b3IgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IGNyZWF0ZSBleHRyYWN0b3IuXG4iKTsKQEAgLTEwNDksNyArMTA0OCw4IEBACiAgICAgICAgICAgICAgICAgYm9vbCBoYXZlQXVkaW8gPSBmYWxzZTsKICAgICAgICAgICAgICAgICBib29sIGhhdmVWaWRlbyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtVHJhY2tzOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgc3A8SU1lZGlhU291cmNlPiBzb3VyY2UgPSBleHRyYWN0b3ItPmdldFRyYWNrKGkpOworICAgICAgICAgICAgICAgICAgICBzcDxNZWRpYVNvdXJjZT4gc291cmNlID0gQ3JlYXRlTWVkaWFTb3VyY2VGcm9tSU1lZGlhU291cmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3Rvci0+Z2V0VHJhY2soaSkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic2tpcCBOVUxMIHRyYWNrICV6dSwgdHJhY2sgY291bnQgJXp1LlxuIiwgaSwgbnVtVHJhY2tzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMTA4NCw3ICsxMDg0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBNZWRpYUV4dHJhY3Rvcjo6a0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSk7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGEgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOwogICAgICAgICAgICAgICAgICAgICBtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKQEAgLTExMTUsNyArMTExNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHVtYlRpbWVVcywgdGh1bWJUaW1lVXMgLyAxRTYpOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIG1lZGlhU291cmNlID0gZXh0cmFjdG9yLT5nZXRUcmFjayhpKTsKKyAgICAgICAgICAgICAgICBtZWRpYVNvdXJjZSA9IENyZWF0ZU1lZGlhU291cmNlRnJvbUlNZWRpYVNvdXJjZShleHRyYWN0b3ItPmdldFRyYWNrKGkpKTsKICAgICAgICAgICAgICAgICBpZiAobWVkaWFTb3VyY2UgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNraXAgTlVMTCB0cmFjayAlenUsIHRvdGFsIHRyYWNrcyAlenUuXG4iLCBpLCBudW1UcmFja3MpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CkBAIC0xMTI4LDcgKzExMjgsNyBAQAogICAgICAgICB9IGVsc2UgaWYgKGR1bXBTdHJlYW0pIHsKICAgICAgICAgICAgIGR1bXBTb3VyY2UobWVkaWFTb3VyY2UsIGR1bXBTdHJlYW1GaWxlbmFtZSk7CiAgICAgICAgIH0gZWxzZSBpZiAoZHVtcFBDTVN0cmVhbSkgewotICAgICAgICAgICAgc3A8SU1lZGlhU291cmNlPiBkZWNTb3VyY2UgPSBTaW1wbGVEZWNvZGluZ1NvdXJjZTo6Q3JlYXRlKG1lZGlhU291cmNlKTsKKyAgICAgICAgICAgIHNwPE1lZGlhU291cmNlPiBkZWNTb3VyY2UgPSBTaW1wbGVEZWNvZGluZ1NvdXJjZTo6Q3JlYXRlKG1lZGlhU291cmNlKTsKICAgICAgICAgICAgIGR1bXBTb3VyY2UoZGVjU291cmNlLCBkdW1wU3RyZWFtRmlsZW5hbWUpOwogICAgICAgICB9IGVsc2UgaWYgKHNlZWtUZXN0KSB7CiAgICAgICAgICAgICBwZXJmb3JtU2Vla1Rlc3QobWVkaWFTb3VyY2UpOwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9zdHJlYW0uY3BwIGIvY21kcy9zdGFnZWZyaWdodC9zdHJlYW0uY3BwCmluZGV4IDJlMWQyNDAuLmIwMTk5ZDggMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0cmVhbS5jcHAKQEAgLTIxLDE1ICsyMSwxOCBAQAogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPiAvLyBmb3IgcHJvcGVydHlfZ2V0CiAKKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JU3RyZWFtU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VGYWN0b3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CkBAIC0xNjEsMTEgKzE2NCwxMSBAQAogICAgIDogbUN1cnJlbnRCdWZmZXJJbmRleCgtMSksCiAgICAgICBtQ3VycmVudEJ1ZmZlck9mZnNldCgwKSB7CiAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9Ci0gICAgICAgIERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoTlVMTCAvKiBodHRwU2VydmljZSAqLywgZmlsZW5hbWUpOworICAgICAgICBEYXRhU291cmNlRmFjdG9yeTo6Q3JlYXRlRnJvbVVSSShOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCBmaWxlbmFtZSk7CiAKICAgICBDSEVDSyhkYXRhU291cmNlICE9IE5VTEwpOwogCi0gICAgc3A8SU1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3IgPSBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKGRhdGFTb3VyY2UpOworICAgIHNwPElNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpDcmVhdGUoZGF0YVNvdXJjZSk7CiAgICAgQ0hFQ0soZXh0cmFjdG9yICE9IE5VTEwpOwogCiAgICAgbVdyaXRlciA9IG5ldyBNUEVHMlRTV3JpdGVyKApAQCAtMTgyLDcgKzE4NSw3IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIHNwPElNZWRpYVNvdXJjZT4gdHJhY2sgPSBleHRyYWN0b3ItPmdldFRyYWNrKGkpOworICAgICAgICBzcDxNZWRpYVNvdXJjZT4gdHJhY2sgPSBDcmVhdGVNZWRpYVNvdXJjZUZyb21JTWVkaWFTb3VyY2UoZXh0cmFjdG9yLT5nZXRUcmFjayhpKSk7CiAgICAgICAgIGlmICh0cmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNraXAgTlVMTCB0cmFjayAlenUsIHRvdGFsIHRyYWNrcyAlenVcbiIsIGksIG51bVRyYWNrcyk7CiAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTMzNSwxMCArMzM4LDEwIEBACiAgICAgQ0hFQ0soY29udHJvbCAhPSBOVUxMKTsKICAgICBDSEVDSyhjb250cm9sLT5pc1ZhbGlkKCkpOwogCi0gICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpvcGVuR2xvYmFsVHJhbnNhY3Rpb24oKTsKLSAgICBDSEVDS19FUShjb250cm9sLT5zZXRMYXllcihJTlRfTUFYKSwgKHN0YXR1c190KU9LKTsKLSAgICBDSEVDS19FUShjb250cm9sLT5zaG93KCksIChzdGF0dXNfdClPSyk7Ci0gICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpjbG9zZUdsb2JhbFRyYW5zYWN0aW9uKCk7CisgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpUcmFuc2FjdGlvbnt9CisgICAgICAgICAgICAuc2V0TGF5ZXIoY29udHJvbCwgSU5UX01BWCkKKyAgICAgICAgICAgIC5zaG93KGNvbnRyb2wpCisgICAgICAgICAgICAuYXBwbHkoKTsKIAogICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UgPSBjb250cm9sLT5nZXRTdXJmYWNlKCk7CiAgICAgQ0hFQ0soc3VyZmFjZSAhPSBOVUxMKTsKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vQW5kcm9pZC5icCBiL2RybS9jb21tb24vQW5kcm9pZC5icAppbmRleCAwMDk4Yzg5Li4xNTUyYzNmIDEwMDY0NAotLS0gYS9kcm0vY29tbW9uL0FuZHJvaWQuYnAKKysrIGIvZHJtL2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0zMyw2ICszMyw4IEBACiAgICAgICAgICJSZWFkV3JpdGVVdGlscy5jcHAiLAogICAgIF0sCiAKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAorCiAgICAgc3RhdGljX2xpYnM6IFsibGliYmluZGVyIl0sCiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9BbmRyb2lkLmJwIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL0FuZHJvaWQuYnAKaW5kZXggMGMwYjZmMi4uNzM3MmViNyAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL0FuZHJvaWQuYnAKQEAgLTE5LDUgKzE5LDcgQEAKIAogICAgIHNyY3M6IFsic3JjL01pbWVUeXBlVXRpbC5jcHAiXSwKIAorICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCisKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIH0KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9BbmRyb2lkLmJwIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL0FuZHJvaWQuYnAKaW5kZXggM2YwZjVmNy4uMjhhNzhhYSAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL0FuZHJvaWQuYnAKQEAgLTIxLDYgKzIxLDkgQEAKICAgICAgICAgIi1EVVNFXzY0QklUX0RSTV9BUEkiLAogICAgICAgICAvLyBUaGUgZmxhZyBiZWxvdyB0dXJucyBvbiBsb2NhbCBkZWJ1ZyBwcmludG91dHMKICAgICAgICAgLy8iLUREUk1fT01BX0ZMX0VOR0lORV9ERUJVRyIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tdW51c2VkLXZhcmlhYmxlIiwKICAgICBdLAogCiAgICAgc3JjczogWyJzcmMvRndkTG9ja0VuZ2luZS5jcHAiXSwKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwCmluZGV4IDgzMGRlZjkuLjczZWVhODkgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcApAQCAtNTAyLDggKzUwMiw4IEBACiAgICAgICAgIGludCByZXRWYWwgPSBGd2RMb2NrRmlsZV9DaGVja0hlYWRlckludGVncml0eShmaWxlRGVzYyk7CiAgICAgICAgIERlY29kZVNlc3Npb24qIGRlY29kZVNlc3Npb24gPSBuZXcgRGVjb2RlU2Vzc2lvbihmaWxlRGVzYyk7CiAKLSAgICAgICAgaWYgKHJldFZhbCAmJiBOVUxMICE9IGRlY29kZVNlc3Npb24pIHsKLSAgICAgICAgICAgIGRlY29kZVNlc3Npb25NYXAuYWRkVmFsdWUoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkLCBkZWNvZGVTZXNzaW9uKTsKKyAgICAgICAgaWYgKHJldFZhbCAmJiBOVUxMICE9IGRlY29kZVNlc3Npb24gJiYKKyAgICAgICAgICAgIGRlY29kZVNlc3Npb25NYXAuYWRkVmFsdWUoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkLCBkZWNvZGVTZXNzaW9uKSkgewogICAgICAgICAgICAgY29uc3QgY2hhciAqcG1pbWU9IEZ3ZExvY2tGaWxlX0dldENvbnRlbnRUeXBlKGZpbGVEZXNjKTsKICAgICAgICAgICAgIFN0cmluZzggY29udGVudFR5cGUgPSBTdHJpbmc4KHBtaW1lID09IE5VTEwgPyAiIiA6IHBtaW1lKTsKICAgICAgICAgICAgIGNvbnRlbnRUeXBlLnRvTG93ZXIoKTsKQEAgLTUxMyw3ICs1MTMsMTEgQEAKICAgICAgICAgICAgIGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvID0gTlVMTDsKICAgICAgICAgICAgIHJlc3VsdCA9IERSTV9OT19FUlJPUjsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPR19WRVJCT1NFKCJGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbiBJbnRlZ3JpdHkgQ2hlY2sgZmFpbGVkIGZvciB0aGUgZmQiKTsKKyAgICAgICAgICAgIGlmIChyZXRWYWwgJiYgTlVMTCAhPSBkZWNvZGVTZXNzaW9uKSB7CisgICAgICAgICAgICAgIExPR19WRVJCT1NFKCJGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbiBJbnRlZ3JpdHkgQ2hlY2sgZmFpbGVkIGZvciB0aGUgZmQiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIExPR19WRVJCT1NFKCJGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbiBEZWNvZGVTZXNzc2lvbiBpbnNlcnRpb24gZmFpbGVkIik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBGd2RMb2NrRmlsZV9kZXRhY2goZmlsZURlc2MpOwogICAgICAgICAgICAgZGVsZXRlIGRlY29kZVNlc3Npb247CiAgICAgICAgIH0KQEAgLTYzMSw3ICs2MzUsNyBAQAogICAgIHNzaXplX3Qgc2l6ZSA9IC0xOwogCiAgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSAmJgotICAgICAgIGRlY29kZVNlc3Npb25NYXAuaXNDcmVhdGVkKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkgJiYKKyAgICAgICAgZGVjb2RlU2Vzc2lvbk1hcC5pc0NyZWF0ZWQoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAmJgogICAgICAgICBOVUxMICE9IGJ1ZmZlciAmJgogICAgICAgICBudW1CeXRlcyA+IC0xKSB7CiAgICAgICAgIERlY29kZVNlc3Npb24qIHNlc3Npb24gPSBkZWNvZGVTZXNzaW9uTWFwLmdldFZhbHVlKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb21tb24vQW5kcm9pZC5icCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbi9BbmRyb2lkLmJwCmluZGV4IDY5OGYyNzguLjNiZTMyN2EgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbi9BbmRyb2lkLmJwCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0xOSw2ICsxOSw4IEBACiAKICAgICBzcmNzOiBbIkZ3ZExvY2tHbHVlLmMiXSwKIAorICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCisKICAgICBzaGFyZWRfbGliczogWyJsaWJjcnlwdG8iXSwKIAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLApkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29udmVydGVyL0FuZHJvaWQuYnAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb252ZXJ0ZXIvQW5kcm9pZC5icAppbmRleCAzM2YyZmUwLi5kNGUwNGI4IDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb252ZXJ0ZXIvQW5kcm9pZC5icAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb252ZXJ0ZXIvQW5kcm9pZC5icApAQCAtMTksNiArMTksOCBAQAogCiAgICAgc3JjczogWyJGd2RMb2NrQ29udi5jIl0sCiAKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAorCiAgICAgc2hhcmVkX2xpYnM6IFsibGliY3J5cHRvIl0sCiAgICAgc3RhdGljX2xpYnM6IFsibGliZndkbG9jay1jb21tb24iXSwKIApkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZGVjb2Rlci9BbmRyb2lkLmJwIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZGVjb2Rlci9BbmRyb2lkLmJwCmluZGV4IGI2ZDdhMDYuLjBiZjI3MzcgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RlY29kZXIvQW5kcm9pZC5icAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kZWNvZGVyL0FuZHJvaWQuYnAKQEAgLTE5LDYgKzE5LDggQEAKIAogICAgIHNyY3M6IFsiRndkTG9ja0ZpbGUuYyJdLAogCisgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKKwogICAgIHNoYXJlZF9saWJzOiBbImxpYmNyeXB0byJdLAogICAgIHN0YXRpY19saWJzOiBbImxpYmZ3ZGxvY2stY29tbW9uIl0sCiAKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9BbmRyb2lkLmJwIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L0FuZHJvaWQuYnAKaW5kZXggMWRjZjg5Yy4uMDViNjQ0MCAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L0FuZHJvaWQuYnAKQEAgLTMyLDUgKzMyLDcgQEAKICAgICBjZmxhZ3M6IFsKICAgICAgICAgLy8gU2V0IHRoZSBmb2xsb3dpbmcgZmxhZyB0byBlbmFibGUgdGhlIGRlY3J5cHRpb24gcGFzc3RocnUgZmxvdwogICAgICAgICAvLyItREVOQUJMRV9QQVNTVEhSVV9ERUNSWVBUSU9OIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAogICAgIF0sCiB9CmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icCBiL2RybS9saWJtZWRpYWRybS9BbmRyb2lkLmJwCmluZGV4IGY5MDY1NjQuLjQ5OTFlNTAgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9BbmRyb2lkLmJwCisrKyBiL2RybS9saWJtZWRpYWRybS9BbmRyb2lkLmJwCkBAIC0yLDEwICsyLDExIEBACiAvLyBsaWJtZWRpYWRybQogLy8KIAotY2NfbGlicmFyeV9zaGFyZWQgeworLy8gVE9ETzogY2hhbmdlIGl0IGJhY2sgdG8gY2NfbGlicmFyeV9zaGFyZWQgd2hlbiBNZWRpYVBsYXllcjIgc3dpdGNoZXMgdG8KKy8vIHVzaW5nIE5ka01lZGlhRHJtLCBpbnN0ZWFkIG9mIE1lZGlhRHJtLmphdmEuCitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibWVkaWFkcm0iLAogCi0KICAgICBzcmNzOiBbCiAgICAgICAgICJEcm1QbHVnaW5QYXRoLmNwcCIsCiAgICAgICAgICJEcm1TZXNzaW9uTWFuYWdlci5jcHAiLApAQCAtMTMsMjkgKzE0LDI2IEBACiAgICAgICAgICJJRHJtLmNwcCIsCiAgICAgICAgICJJRHJtQ2xpZW50LmNwcCIsCiAgICAgICAgICJJTWVkaWFEcm1TZXJ2aWNlLmNwcCIsCi0gICAgICAgICJQbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmNwcCIsCiAgICAgICAgICJTaGFyZWRMaWJyYXJ5LmNwcCIsCiAgICAgICAgICJEcm1IYWwuY3BwIiwKICAgICAgICAgIkNyeXB0b0hhbC5jcHAiLAotICAgICAgICAicHJvdG9zL3BsdWdpbl9tZXRyaWNzLnByb3RvIiwKICAgICBdLAogCi0gICAgcHJvdG86IHsKLSAgICAgICAgdHlwZTogImxpdGUiLAotICAgIH0sCi0KICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJkbCIsCiAgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWFkcm1tZXRyaWNzX2xpdGUiLAogICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKICAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIiwKKyAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCi0gICAgICAgICJsaWJoaWRsbWVtb3J5IiwKICAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAogICAgIF0sCiAKQEAgLTQ0LDMgKzQyLDcwIEBACiAgICAgICAgICItV2FsbCIsCiAgICAgXSwKIH0KKworLy8gVGhpcyBpcyB0aGUgdmVyc2lvbiBvZiB0aGUgZHJtIG1ldHJpY3MgY29uZmlndXJlZCBmb3IgcHJvdG9idWYgbGl0ZS4KK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGlibWVkaWFkcm1tZXRyaWNzX2xpdGUiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkRybU1ldHJpY3MuY3BwIiwKKyAgICAgICAgIlBsdWdpbk1ldHJpY3NSZXBvcnRpbmcuY3BwIiwKKyAgICAgICAgInByb3Rvcy9tZXRyaWNzLnByb3RvIiwKKyAgICBdLAorCisgICAgcHJvdG86IHsKKyAgICAgICAgZXhwb3J0X3Byb3RvX2hlYWRlcnM6IHRydWUsCisgICAgICAgIHR5cGU6ICJsaXRlIiwKKyAgICB9LAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAorICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgLy8gU3VwcHJlc3MgdW51c2VkIHBhcmFtZXRlciBhbmQgbm8gZXJyb3Igb3B0aW9ucy4gVGhlc2UgY2F1c2UgcHJvYmxlbXMKKyAgICAgICAgLy8gd2l0aCB0aGUgd2hlbiB1c2luZyB0aGUgbWFwIHR5cGUgaW4gYSBwcm90byBkZWZpbml0aW9uLgorICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKKyAgICAgICAgIi1Xbm8tZXJyb3IiLAorICAgIF0sCit9CisKKy8vIFRoaXMgaXMgdGhlIHZlcnNpb24gb2YgdGhlIGRybSBtZXRyaWNzIGxpYnJhcnkgY29uZmlndXJlZCBmb3IgZnVsbCBwcm90b2J1Zi4KK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGlibWVkaWFkcm1tZXRyaWNzX2Z1bGwiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkRybU1ldHJpY3MuY3BwIiwKKyAgICAgICAgIlBsdWdpbk1ldHJpY3NSZXBvcnRpbmcuY3BwIiwKKyAgICAgICAgInByb3Rvcy9tZXRyaWNzLnByb3RvIiwKKyAgICBdLAorCisgICAgcHJvdG86IHsKKyAgICAgICAgZXhwb3J0X3Byb3RvX2hlYWRlcnM6IHRydWUsCisgICAgICAgIHR5cGU6ICJmdWxsIiwKKyAgICB9LAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAorICAgICAgICAibGlicHJvdG9idWYtY3BwLWZ1bGwiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgLy8gU3VwcHJlc3MgdW51c2VkIHBhcmFtZXRlciBhbmQgbm8gZXJyb3Igb3B0aW9ucy4gVGhlc2UgY2F1c2UgcHJvYmxlbXMKKyAgICAgICAgLy8gd2hlbiB1c2luZyB0aGUgbWFwIHR5cGUgaW4gYSBwcm90byBkZWZpbml0aW9uLgorICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKKyAgICAgICAgIi1Xbm8tZXJyb3IiLAorICAgIF0sCit9CisKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9DcnlwdG9IYWwuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0NyeXB0b0hhbC5jcHAKaW5kZXggNWRkMjU2My4uNWQwZjY4ZSAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0NyeXB0b0hhbC5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0NyeXB0b0hhbC5jcHAKQEAgLTIyLDEzICsyMiwxNCBAQAogI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tYW5hZ2VyLzEuMC9JU2VydmljZU1hbmFnZXIuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KLSNpbmNsdWRlIDxtZWRpYS9DcnlwdG9IYWwuaD4KKyNpbmNsdWRlIDxoaWRsbWVtb3J5L0ZyYW1ld29ya1V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvQ3J5cHRvQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0NyeXB0b0hhbC5oPgorCiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6QnVmZmVyVHlwZTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6RGVzdGluYXRpb25CdWZmZXI7CkBAIC0xMTcsMTUgKzExOCwyNCBAQAogCiAgICAgYXV0byBtYW5hZ2VyID0gOjpJU2VydmljZU1hbmFnZXI6OmdldFNlcnZpY2UoKTsKICAgICBpZiAobWFuYWdlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1hbmFnZXItPmxpc3RCeUludGVyZmFjZShJQ3J5cHRvRmFjdG9yeTo6ZGVzY3JpcHRvciwKKyAgICAgICAgbWFuYWdlci0+bGlzdEJ5SW50ZXJmYWNlKGRybTo6VjFfMDo6SUNyeXB0b0ZhY3Rvcnk6OmRlc2NyaXB0b3IsCiAgICAgICAgICAgICAgICAgWyZmYWN0b3JpZXNdKGNvbnN0IGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAmcmVnaXN0ZXJlZCkgewogICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmluc3RhbmNlIDogcmVnaXN0ZXJlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBmYWN0b3J5ID0gSUNyeXB0b0ZhY3Rvcnk6OmdldFNlcnZpY2UoaW5zdGFuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBmYWN0b3J5ID0gZHJtOjpWMV8wOjpJQ3J5cHRvRmFjdG9yeTo6Z2V0U2VydmljZShpbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoImZvdW5kIGRybUAxLjAgSUNyeXB0b0ZhY3RvcnkgJXMiLCBpbnN0YW5jZS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKGZhY3RvcnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJtYWtlQ3J5cHRvRmFjdG9yaWVzOiBmYWN0b3J5IGluc3RhbmNlICVzIGlzICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LT5pc1JlbW90ZSgpID8gIlJlbW90ZSIgOiAiTm90IFJlbW90ZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKyAgICAgICAgbWFuYWdlci0+bGlzdEJ5SW50ZXJmYWNlKGRybTo6VjFfMTo6SUNyeXB0b0ZhY3Rvcnk6OmRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgWyZmYWN0b3JpZXNdKGNvbnN0IGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAmcmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmluc3RhbmNlIDogcmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBmYWN0b3J5ID0gZHJtOjpWMV8xOjpJQ3J5cHRvRmFjdG9yeTo6Z2V0U2VydmljZShpbnN0YW5jZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoImZvdW5kIGRybUAxLjEgSUNyeXB0b0ZhY3RvcnkgJXMiLCBpbnN0YW5jZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKGZhY3RvcnkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtMTM2LDcgKzE0Niw3IEBACiAgICAgICAgIC8vIG11c3QgYmUgaW4gcGFzc3Rocm91Z2ggbW9kZSwgbG9hZCB0aGUgZGVmYXVsdCBwYXNzdGhyb3VnaCBzZXJ2aWNlCiAgICAgICAgIGF1dG8gcGFzc3Rocm91Z2ggPSBJQ3J5cHRvRmFjdG9yeTo6Z2V0U2VydmljZSgpOwogICAgICAgICBpZiAocGFzc3Rocm91Z2ggIT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0koIm1ha2VDcnlwdG9GYWN0b3JpZXM6IHVzaW5nIGRlZmF1bHQgY3J5cHRvIGluc3RhbmNlIik7CisgICAgICAgICAgICBBTE9HSSgibWFrZUNyeXB0b0ZhY3RvcmllczogdXNpbmcgZGVmYXVsdCBwYXNzdGhyb3VnaCBjcnlwdG8gaW5zdGFuY2UiKTsKICAgICAgICAgICAgIGZhY3Rvcmllcy5wdXNoX2JhY2socGFzc3Rocm91Z2gpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBmaW5kIGFueSBjcnlwdG8gZmFjdG9yaWVzIik7CkBAIC0yMTMsMTAgKzIyMywxNCBAQAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHJldHVybiBtUGx1Z2luLT5yZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoaGlkbF9zdHJpbmcobWltZSkpOworICAgIFJldHVybjxib29sPiBoUmVzdWx0ID0gbVBsdWdpbi0+cmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KGhpZGxfc3RyaW5nKG1pbWUpKTsKKyAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGhSZXN1bHQ7CiB9CiAKIApAQCAtMjI3LDI2ICsyNDEsMjAgQEAKICAqIGFyZSBzZW50IGJ5IHByb3ZpZGluZyBhbiBvZmZzZXQgaW50byB0aGUgaGVhcCBhbmQgYSBidWZmZXIgc2l6ZS4KICAqLwogaW50MzJfdCBDcnlwdG9IYWw6OnNldEhlYXBCYXNlKGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCkgeworICAgIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmZyb21IZWFwOworICAgIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkhpZGxNZW1vcnk7CisKICAgICBpZiAoaGVhcCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJzZXRIZWFwQmFzZSgpOiBoZWFwIGlzIE5VTEwiKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICBuYXRpdmVfaGFuZGxlX3QqIG5hdGl2ZUhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOwotICAgIGlmICghbmF0aXZlSGFuZGxlKSB7Ci0gICAgICAgIEFMT0dFKCJzZXRIZWFwQmFzZSgpLCBmYWlsZWQgdG8gY3JlYXRlIG5hdGl2ZSBoYW5kbGUiKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KIAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBpbnQzMl90IHNlcU51bSA9IG1IZWFwU2VxTnVtKys7Ci0KLSAgICBpbnQgZmQgPSBoZWFwLT5nZXRIZWFwSUQoKTsKLSAgICBuYXRpdmVIYW5kbGUtPmRhdGFbMF0gPSBmZDsKLSAgICBhdXRvIGhpZGxIYW5kbGUgPSBoaWRsX2hhbmRsZShuYXRpdmVIYW5kbGUpOwotICAgIGF1dG8gaGlkbE1lbW9yeSA9IGhpZGxfbWVtb3J5KCJhc2htZW0iLCBoaWRsSGFuZGxlLCBoZWFwLT5nZXRTaXplKCkpOworICAgIHNwPEhpZGxNZW1vcnk+IGhpZGxNZW1vcnkgPSBmcm9tSGVhcChoZWFwKTsKICAgICBtSGVhcEJhc2VzLmFkZChzZXFOdW0sIEhlYXBCYXNlKG1OZXh0QnVmZmVySWQsIGhlYXAtPmdldFNpemUoKSkpOwotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpbi0+c2V0U2hhcmVkQnVmZmVyQmFzZShoaWRsTWVtb3J5LCBtTmV4dEJ1ZmZlcklkKyspOworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpbi0+c2V0U2hhcmVkQnVmZmVyQmFzZSgqaGlkbE1lbW9yeSwgbU5leHRCdWZmZXJJZCsrKTsKICAgICBBTE9HRV9JRighaFJlc3VsdC5pc09rKCksICJzZXRTaGFyZWRCdWZmZXJCYXNlKCk6IHJlbW90ZSBjYWxsIGZhaWxlZCIpOwogICAgIHJldHVybiBzZXFOdW07CiB9CmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcCBiL2RybS9saWJtZWRpYWRybS9Ecm1IYWwuY3BwCmluZGV4IGJjMzc1NTcuLmNmMDg2MTAgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9Ecm1IYWwuY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9Ecm1IYWwuY3BwCkBAIC0xNiw0OCArMTYsODEgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJEcm1IYWwiCisjaW5jbHVkZSA8aW9tYW5pcD4KKwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lEcm1GYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lEcm1QbHVnaW4uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvdHlwZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjAvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8aGlkbC9TZXJ2aWNlTWFuYWdlbWVudC5oPgogCi0jaW5jbHVkZSA8bWVkaWEvRHJtSGFsLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZS5oPgotI2luY2x1ZGUgPG1lZGlhL0RybVNlc3Npb25NYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvRXZlbnRNZXRyaWMuaD4KICNpbmNsdWRlIDxtZWRpYS9QbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmg+CiAjaW5jbHVkZSA8bWVkaWEvZHJtL0RybUFQSS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybUhhbC5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybVNlc3Npb25DbGllbnRJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9Ecm1TZXNzaW9uTWFuYWdlci5oPgogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OkV2ZW50VHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6SURybUZhY3Rvcnk7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OklEcm1QbHVnaW47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OktleWVkVmVjdG9yOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlSZXF1ZXN0VHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6S2V5U3RhdHVzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlTdGF0dXNUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlWYWx1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U2VjdXJlU3RvcDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3RhdHVzOwordXNpbmcgZHJtOjpWMV8wOjpLZXllZFZlY3RvcjsKK3VzaW5nIGRybTo6VjFfMDo6S2V5U3RhdHVzVHlwZTsKK3VzaW5nIGRybTo6VjFfMDo6S2V5VHlwZTsKK3VzaW5nIGRybTo6VjFfMDo6S2V5VmFsdWU7Cit1c2luZyBkcm06OlYxXzE6OkhkY3BMZXZlbDs7Cit1c2luZyBkcm06OlYxXzA6OlNlY3VyZVN0b3A7Cit1c2luZyBkcm06OlYxXzE6OlNlY3VyZVN0b3BSZWxlYXNlOwordXNpbmcgZHJtOjpWMV8wOjpTZWN1cmVTdG9wSWQ7Cit1c2luZyBkcm06OlYxXzE6OlNlY3VyaXR5TGV2ZWw7Cit1c2luZyBkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CiB1c2luZyA6OmFuZHJvaWQ6OmhpZGw6Om1hbmFnZXI6OlYxXzA6OklTZXJ2aWNlTWFuYWdlcjsKK3VzaW5nIDo6YW5kcm9pZDo6b3M6OlBlcnNpc3RhYmxlQnVuZGxlOwogdXNpbmcgOjphbmRyb2lkOjpzcDsKIAorbmFtZXNwYWNlIHsKKworLy8gVGhpcyBjb25zdGFudCBjb3JyZXNwb25kcyB0byB0aGUgUFJPUEVSVFlfREVWSUNFX1VOSVFVRV9JRCBjb25zdGFudAorLy8gaW4gdGhlIE1lZGlhRHJtIEFQSS4KK2NvbnN0ZXhwciBjaGFyIGtQcm9wZXJ0eURldmljZVVuaXF1ZUlkW10gPSAiZGV2aWNlVW5pcXVlSWQiOworY29uc3RleHByIGNoYXIga0VxdWFsc1NpZ25bXSA9ICI9IjsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIHRvQmFzZTY0U3RyaW5nTm9QYWQoY29uc3QgVCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICAvLyBOb3RlIHRoYXQgdGhlIGJhc2UgNjQgY29udmVyc2lvbiBvbmx5IHdvcmtzIHdpdGggYXJyYXlzIG9mIHNpbmdsZS1ieXRlCisgICAgLy8gdmFsdWVzLiBJZiB0aGUgc291cmNlIGlzIGVtcHR5IG9yIGlzIG5vdCBhbiBhcnJheSBvZiBzaW5nbGUtYnl0ZSB2YWx1ZXMsCisgICAgLy8gcmV0dXJuIGVtcHR5IHN0cmluZy4KKyAgICBpZiAoc2l6ZSA9PSAwIHx8IHNpemVvZihkYXRhWzBdKSAhPSAxKSB7CisgICAgICByZXR1cm4gIiI7CisgICAgfQorCisgICAgYW5kcm9pZDo6QVN0cmluZyBvdXRwdXRTdHJpbmc7CisgICAgZW5jb2RlQmFzZTY0KGRhdGEsIHNpemUsICZvdXRwdXRTdHJpbmcpOworICAgIC8vIFJlbW92ZSB0cmFpbGluZyBlcXVhbHMgcGFkZGluZyBpZiBpdCBleGlzdHMuCisgICAgd2hpbGUgKG91dHB1dFN0cmluZy5zaXplKCkgPiAwICYmIG91dHB1dFN0cmluZy5lbmRzV2l0aChrRXF1YWxzU2lnbikpIHsKKyAgICAgICAgb3V0cHV0U3RyaW5nLmVyYXNlKG91dHB1dFN0cmluZy5zaXplKCkgLSAxLCAxKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcob3V0cHV0U3RyaW5nLmNfc3RyKCksIG91dHB1dFN0cmluZy5zaXplKCkpOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorI2RlZmluZSBJTklUX0NIRUNLKCkge2lmIChtSW5pdENoZWNrICE9IE9LKSByZXR1cm4gbUluaXRDaGVjazt9CisKIHN0YXRpYyBpbmxpbmUgaW50IGdldENhbGxpbmdQaWQoKSB7CiAgICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKIH0KQEAgLTg5LDYgKzEyMiw0MiBAQAogICAgIHJldHVybiBoaWRsX3N0cmluZyhzdHJpbmcuc3RyaW5nKCkpOwogfQogCitzdGF0aWMgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHRvU2VjdXJpdHlMZXZlbChTZWN1cml0eUxldmVsIGxldmVsKSB7CisgICAgc3dpdGNoKGxldmVsKSB7CisgICAgY2FzZSBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPOgorICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFN3U2VjdXJlQ3J5cHRvOworICAgIGNhc2UgU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0RFQ09ERToKKyAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZURlY29kZTsKKyAgICBjYXNlIFNlY3VyaXR5TGV2ZWw6OkhXX1NFQ1VSRV9DUllQVE86CisgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVDcnlwdG87CisgICAgY2FzZSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfREVDT0RFOgorICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbEh3U2VjdXJlRGVjb2RlOworICAgIGNhc2UgU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0FMTDoKKyAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUFsbDsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFVua25vd247CisgICAgfQorfQorCitzdGF0aWMgRHJtUGx1Z2luOjpIZGNwTGV2ZWwgdG9IZGNwTGV2ZWwoSGRjcExldmVsIGxldmVsKSB7CisgICAgc3dpdGNoKGxldmVsKSB7CisgICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfTk9ORToKKyAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BOb25lOworICAgIGNhc2UgSGRjcExldmVsOjpIRENQX1YxOgorICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcFYxOworICAgIGNhc2UgSGRjcExldmVsOjpIRENQX1YyOgorICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcFYyOworICAgIGNhc2UgSGRjcExldmVsOjpIRENQX1YyXzE6CisgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwVjJfMTsKKyAgICBjYXNlIEhkY3BMZXZlbDo6SERDUF9WMl8yOgorICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcFYyXzI7CisgICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfTk9fT1VUUFVUOgorICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcE5vT3V0cHV0OworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwTGV2ZWxVbmtub3duOworICAgIH0KK30KKwogCiBzdGF0aWMgOjpLZXllZFZlY3RvciB0b0hpZGxLZXllZFZlY3Rvcihjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiYKICAgICAgICAga2V5ZWRWZWN0b3IpIHsKQEAgLTEyMSw2ICsxOTAsMTUgQEAKICAgICByZXR1cm4gc2VjdXJlU3RvcHM7CiB9CiAKK3N0YXRpYyBMaXN0PFZlY3Rvcjx1aW50OF90Pj4gdG9TZWN1cmVTdG9wSWRzKGNvbnN0IGhpZGxfdmVjPFNlY3VyZVN0b3BJZD4mCisgICAgICAgIGhTZWN1cmVTdG9wSWRzKSB7CisgICAgTGlzdDxWZWN0b3I8dWludDhfdD4+IHNlY3VyZVN0b3BJZHM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoU2VjdXJlU3RvcElkcy5zaXplKCk7IGkrKykgeworICAgICAgICBzZWN1cmVTdG9wSWRzLnB1c2hfYmFjayh0b1ZlY3RvcihoU2VjdXJlU3RvcElkc1tpXSkpOworICAgIH0KKyAgICByZXR1cm4gc2VjdXJlU3RvcElkczsKK30KKwogc3RhdGljIHN0YXR1c190IHRvU3RhdHVzVChTdGF0dXMgc3RhdHVzKSB7CiAgICAgc3dpdGNoIChzdGF0dXMpIHsKICAgICBjYXNlIFN0YXR1czo6T0s6CkBAIC0xOTYsMzUgKzI3NCw2MyBAQAogfQogCiB2b2lkIERybUhhbDo6Y2xvc2VPcGVuU2Vzc2lvbnMoKSB7Ci0gICAgaWYgKG1QbHVnaW4gIT0gTlVMTCkgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PcGVuU2Vzc2lvbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIG1QbHVnaW4tPmNsb3NlU2Vzc2lvbih0b0hpZGxWZWMobU9wZW5TZXNzaW9uc1tpXSkpOwotICAgICAgICAgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnJlbW92ZVNlc3Npb24obU9wZW5TZXNzaW9uc1tpXSk7Ci0gICAgICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGF1dG8gb3BlblNlc3Npb25zID0gbU9wZW5TZXNzaW9uczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9wZW5TZXNzaW9ucy5zaXplKCk7IGkrKykgeworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgY2xvc2VTZXNzaW9uKG9wZW5TZXNzaW9uc1tpXSk7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICB9CiAgICAgbU9wZW5TZXNzaW9ucy5jbGVhcigpOwogfQogCiBEcm1IYWw6On5Ecm1IYWwoKSB7Ci0gICAgY2xvc2VPcGVuU2Vzc2lvbnMoKTsKICAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+cmVtb3ZlRHJtKG1Ecm1TZXNzaW9uQ2xpZW50KTsKIH0KIAordm9pZCBEcm1IYWw6OmNsZWFudXAoKSB7CisgICAgY2xvc2VPcGVuU2Vzc2lvbnMoKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmVwb3J0UGx1Z2luTWV0cmljcygpOworICAgIHJlcG9ydEZyYW1ld29ya01ldHJpY3MoKTsKKworICAgIHNldExpc3RlbmVyKE5VTEwpOworICAgIG1Jbml0Q2hlY2sgPSBOT19JTklUOworCisgICAgaWYgKG1QbHVnaW4gIT0gTlVMTCkgeworICAgICAgICBpZiAoIW1QbHVnaW4tPnNldExpc3RlbmVyKE5VTEwpLmlzT2soKSkgeworICAgICAgICAgICAgbUluaXRDaGVjayA9IERFQURfT0JKRUNUOworICAgICAgICB9CisgICAgfQorICAgIG1QbHVnaW4uY2xlYXIoKTsKKyAgICBtUGx1Z2luVjFfMS5jbGVhcigpOworfQorCiBWZWN0b3I8c3A8SURybUZhY3Rvcnk+PiBEcm1IYWw6Om1ha2VEcm1GYWN0b3JpZXMoKSB7CiAgICAgVmVjdG9yPHNwPElEcm1GYWN0b3J5Pj4gZmFjdG9yaWVzOwogCiAgICAgYXV0byBtYW5hZ2VyID0gaGFyZHdhcmU6OmRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwogCiAgICAgaWYgKG1hbmFnZXIgIT0gTlVMTCkgewotICAgICAgICBtYW5hZ2VyLT5saXN0QnlJbnRlcmZhY2UoSURybUZhY3Rvcnk6OmRlc2NyaXB0b3IsCisgICAgICAgIG1hbmFnZXItPmxpc3RCeUludGVyZmFjZShkcm06OlYxXzA6OklEcm1GYWN0b3J5OjpkZXNjcmlwdG9yLAogICAgICAgICAgICAgICAgIFsmZmFjdG9yaWVzXShjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gJnJlZ2lzdGVyZWQpIHsKICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZpbnN0YW5jZSA6IHJlZ2lzdGVyZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gZmFjdG9yeSA9IElEcm1GYWN0b3J5OjpnZXRTZXJ2aWNlKGluc3RhbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gZmFjdG9yeSA9IGRybTo6VjFfMDo6SURybUZhY3Rvcnk6OmdldFNlcnZpY2UoaW5zdGFuY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJmb3VuZCBkcm1AMS4wIElEcm1GYWN0b3J5ICVzIiwgaW5zdGFuY2UuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yaWVzLnB1c2hfYmFjayhmYWN0b3J5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgibWFrZURybUZhY3RvcmllczogZmFjdG9yeSBpbnN0YW5jZSAlcyBpcyAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeS0+aXNSZW1vdGUoKSA/ICJSZW1vdGUiIDogIk5vdCBSZW1vdGUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICk7CisgICAgICAgIG1hbmFnZXItPmxpc3RCeUludGVyZmFjZShkcm06OlYxXzE6OklEcm1GYWN0b3J5OjpkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgIFsmZmFjdG9yaWVzXShjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gJnJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZpbnN0YW5jZSA6IHJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gZmFjdG9yeSA9IGRybTo6VjFfMTo6SURybUZhY3Rvcnk6OmdldFNlcnZpY2UoaW5zdGFuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJmb3VuZCBkcm1AMS4xIElEcm1GYWN0b3J5ICVzIiwgaW5zdGFuY2UuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yaWVzLnB1c2hfYmFjayhmYWN0b3J5KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTIzNSw3ICszNDEsNyBAQAogICAgICAgICAvLyBtdXN0IGJlIGluIHBhc3N0aHJvdWdoIG1vZGUsIGxvYWQgdGhlIGRlZmF1bHQgcGFzc3Rocm91Z2ggc2VydmljZQogICAgICAgICBhdXRvIHBhc3N0aHJvdWdoID0gSURybUZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKICAgICAgICAgaWYgKHBhc3N0aHJvdWdoICE9IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dJKCJtYWtlRHJtRmFjdG9yaWVzOiB1c2luZyBkZWZhdWx0IGRybSBpbnN0YW5jZSIpOworICAgICAgICAgICAgQUxPR0koIm1ha2VEcm1GYWN0b3JpZXM6IHVzaW5nIGRlZmF1bHQgcGFzc3Rocm91Z2ggZHJtIGluc3RhbmNlIik7CiAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKHBhc3N0aHJvdWdoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmluZCBhbnkgZHJtIGZhY3RvcmllcyIpOwpAQCAtMjQ2LDYgKzM1Miw4IEBACiAKIHNwPElEcm1QbHVnaW4+IERybUhhbDo6bWFrZURybVBsdWdpbihjb25zdCBzcDxJRHJtRmFjdG9yeT4mIGZhY3RvcnksCiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFN0cmluZzgmIGFwcFBhY2thZ2VOYW1lKSB7CisgICAgbUFwcFBhY2thZ2VOYW1lID0gYXBwUGFja2FnZU5hbWU7CisgICAgbU1ldHJpY3MuU2V0QXBwUGFja2FnZU5hbWUoYXBwUGFja2FnZU5hbWUpOwogCiAgICAgc3A8SURybVBsdWdpbj4gcGx1Z2luOwogICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gZmFjdG9yeS0+Y3JlYXRlUGx1Z2luKHV1aWQsIGFwcFBhY2thZ2VOYW1lLnN0cmluZygpLApAQCAtMjg0LDYgKzM5Miw3IEBACiAKIFJldHVybjx2b2lkPiBEcm1IYWw6OnNlbmRFdmVudChFdmVudFR5cGUgaEV2ZW50VHlwZSwKICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGRhdGEpIHsKKyAgICBtTWV0cmljcy5tRXZlbnRDb3VudGVyLkluY3JlbWVudChoRXZlbnRUeXBlKTsKIAogICAgIG1FdmVudExvY2subG9jaygpOwogICAgIHNwPElEcm1DbGllbnQ+IGxpc3RlbmVyID0gbUxpc3RlbmVyOwpAQCAtMzc0LDEyICs0ODMsMjEgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG9iai53cml0ZUludDMyKHR5cGUpOworICAgICAgICAgICAgbU1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KGtleVN0YXR1cy50eXBlKTsKICAgICAgICAgfQogICAgICAgICBvYmoud3JpdGVJbnQzMihoYXNOZXdVc2FibGVLZXkpOwogCiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Ob3RpZnlMb2NrKTsKICAgICAgICAgbGlzdGVuZXItPm5vdGlmeShEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudEtleXNDaGFuZ2UsIDAsICZvYmopOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRoZXJlJ3Mgbm8gbGlzdGVuZXIuIEJ1dCB3ZSBzdGlsbCB3YW50IHRvIGNvdW50IHRoZSBrZXkgY2hhbmdlCisgICAgICAgIC8vIGV2ZW50cy4KKyAgICAgICAgc2l6ZV90IG5LZXlzID0ga2V5U3RhdHVzTGlzdC5zaXplKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbktleXM7IGkrKykgeworICAgICAgICAgICAgbU1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KGtleVN0YXR1c0xpc3RbaV0udHlwZSk7CisgICAgICAgIH0KICAgICB9CisKICAgICByZXR1cm4gVm9pZCgpOwogfQogCkBAIC00MDcsNiArNTI1LDkgQEAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GYWN0b3JpZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgaWYgKG1GYWN0b3JpZXNbaV0tPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpKSB7CiAgICAgICAgICAgICBtUGx1Z2luID0gbWFrZURybVBsdWdpbihtRmFjdG9yaWVzW2ldLCB1dWlkLCBhcHBQYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBpZiAobVBsdWdpbiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbVBsdWdpblYxXzEgPSBkcm06OlYxXzE6OklEcm1QbHVnaW46OmNhc3RGcm9tKG1QbHVnaW4pOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC00MjQsNDYgKzU0NSw2NiBAQAogfQogCiBzdGF0dXNfdCBEcm1IYWw6OmRlc3Ryb3lQbHVnaW4oKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9Ci0KLSAgICBjbG9zZU9wZW5TZXNzaW9ucygpOwotICAgIHJlcG9ydE1ldHJpY3MoKTsKLSAgICBzZXRMaXN0ZW5lcihOVUxMKTsKLSAgICBtSW5pdENoZWNrID0gTk9fSU5JVDsKLQotICAgIGlmIChtUGx1Z2luICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCFtUGx1Z2luLT5zZXRMaXN0ZW5lcihOVUxMKS5pc09rKCkpIHsKLSAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBERUFEX09CSkVDVDsKLSAgICAgICAgfQotICAgIH0KLSAgICBtUGx1Z2luLmNsZWFyKCk7CisgICAgY2xlYW51cCgpOwogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgRHJtSGFsOjpvcGVuU2Vzc2lvbihWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZCkgeworc3RhdHVzX3QgRHJtSGFsOjpvcGVuU2Vzc2lvbihEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwsCisgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmc2Vzc2lvbklkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CiAKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICBTZWN1cml0eUxldmVsIGhTZWN1cml0eUxldmVsOworICAgIGJvb2wgc2V0U2VjdXJpdHlMZXZlbCA9IHRydWU7CisKKyAgICBzd2l0Y2gobGV2ZWwpIHsKKyAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZUNyeXB0bzoKKyAgICAgICAgaFNlY3VyaXR5TGV2ZWwgPSBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZURlY29kZToKKyAgICAgICAgaFNlY3VyaXR5TGV2ZWwgPSBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfREVDT0RFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUNyeXB0bzoKKyAgICAgICAgaFNlY3VyaXR5TGV2ZWwgPSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQ1JZUFRPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZURlY29kZToKKyAgICAgICAgaFNlY3VyaXR5TGV2ZWwgPSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfREVDT0RFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUFsbDoKKyAgICAgICAgaFNlY3VyaXR5TGV2ZWwgPSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQUxMOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxNYXg6CisgICAgICAgIHNldFNlY3VyaXR5TGV2ZWwgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwogICAgIH0KIAogICAgIHN0YXR1c190ICBlcnIgPSBVTktOT1dOX0VSUk9SOwotCiAgICAgYm9vbCByZXRyeSA9IHRydWU7CiAgICAgZG8gewogICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiBoU2Vzc2lvbklkOwogCi0gICAgICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpbi0+b3BlblNlc3Npb24oCi0gICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBpZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCA9IHRvVmVjdG9yKGlkKTsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQ7CisgICAgICAgIGlmIChtUGx1Z2luVjFfMSA9PSBOVUxMIHx8ICFzZXRTZWN1cml0eUxldmVsKSB7CisgICAgICAgICAgICBoUmVzdWx0ID0gbVBsdWdpbi0+b3BlblNlc3Npb24oCisgICAgICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBpZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkID0gdG9WZWN0b3IoaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8xLT5vcGVuU2Vzc2lvbl8xXzEoaFNlY3VyaXR5TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCA9IHRvVmVjdG9yKGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmICghaFJlc3VsdC5pc09rKCkpIHsKICAgICAgICAgICAgIGVyciA9IERFQURfT0JKRUNUOwpAQCAtNDg1LDE2ICs2MjYsMTYgQEAKICAgICAgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPmFkZFNlc3Npb24oZ2V0Q2FsbGluZ1BpZCgpLAogICAgICAgICAgICAgICAgIG1Ecm1TZXNzaW9uQ2xpZW50LCBzZXNzaW9uSWQpOwogICAgICAgICBtT3BlblNlc3Npb25zLnB1c2goc2Vzc2lvbklkKTsKKyAgICAgICAgbU1ldHJpY3MuU2V0U2Vzc2lvblN0YXJ0KHNlc3Npb25JZCk7CiAgICAgfQorCisgICAgbU1ldHJpY3MubU9wZW5TZXNzaW9uQ291bnRlci5JbmNyZW1lbnQoZXJyKTsKICAgICByZXR1cm4gZXJyOwogfQogCiBzdGF0dXNfdCBEcm1IYWw6OmNsb3NlU2Vzc2lvbihWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9CisgICAgSU5JVF9DSEVDSygpOwogCiAgICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbVBsdWdpbi0+Y2xvc2VTZXNzaW9uKHRvSGlkbFZlYyhzZXNzaW9uSWQpKTsKICAgICBpZiAoc3RhdHVzLmlzT2soKSkgewpAQCAtNTA3LDkgKzY0OCwxMiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXBvcnRNZXRyaWNzKCk7Ci0gICAgICAgIHJldHVybiB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgc3RhdHVzX3QgcmVzcG9uc2UgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgbU1ldHJpY3MuU2V0U2Vzc2lvbkVuZChzZXNzaW9uSWQpOworICAgICAgICBtTWV0cmljcy5tQ2xvc2VTZXNzaW9uQ291bnRlci5JbmNyZW1lbnQocmVzcG9uc2UpOworICAgICAgICByZXR1cm4gcmVzcG9uc2U7CiAgICAgfQorICAgIG1NZXRyaWNzLm1DbG9zZVNlc3Npb25Db3VudGVyLkluY3JlbWVudChERUFEX09CSkVDVCk7CiAgICAgcmV0dXJuIERFQURfT0JKRUNUOwogfQogCkBAIC01MTksMTAgKzY2Myw4IEBACiAgICAgICAgIFN0cmluZzg+IGNvbnN0ICZvcHRpb25hbFBhcmFtZXRlcnMsIFZlY3Rvcjx1aW50OF90PiAmcmVxdWVzdCwKICAgICAgICAgU3RyaW5nOCAmZGVmYXVsdFVybCwgRHJtUGx1Z2luOjpLZXlSZXF1ZXN0VHlwZSAqa2V5UmVxdWVzdFR5cGUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci0gICAgfQorICAgIElOSVRfQ0hFQ0soKTsKKyAgICBFdmVudFRpbWVyPHN0YXR1c190PiBrZXlSZXF1ZXN0VGltZXIoJm1NZXRyaWNzLm1HZXRLZXlSZXF1ZXN0VGltZVVzKTsKIAogICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CiAKQEAgLTUzNCw2ICs2NzYsNyBAQAogICAgIH0gZWxzZSBpZiAoa2V5VHlwZSA9PSBEcm1QbHVnaW46OmtLZXlUeXBlX1JlbGVhc2UpIHsKICAgICAgICAgaEtleVR5cGUgPSBLZXlUeXBlOjpSRUxFQVNFOwogICAgIH0gZWxzZSB7CisgICAgICAgIGtleVJlcXVlc3RUaW1lci5TZXRBdHRyaWJ1dGUoQkFEX1ZBTFVFKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKQEAgLTU0MSwyMyArNjg0LDYzIEBACiAKICAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwogCisgICAgaWYgKG1QbHVnaW5WMV8xICE9IE5VTEwpIHsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPQorICAgICAgICAgICAgbVBsdWdpblYxXzEtPmdldEtleVJlcXVlc3RfMV8xKAorICAgICAgICAgICAgICAgIHRvSGlkbFZlYyhzZXNzaW9uSWQpLCB0b0hpZGxWZWMoaW5pdERhdGEpLAorICAgICAgICAgICAgICAgIHRvSGlkbFN0cmluZyhtaW1lVHlwZSksIGhLZXlUeXBlLCBoT3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgIGRybTo6VjFfMTo6S2V5UmVxdWVzdFR5cGUgaEtleVJlcXVlc3RUeXBlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKKworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdCA9IHRvVmVjdG9yKGhSZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoaEtleVJlcXVlc3RUeXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgZHJtOjpWMV8xOjpLZXlSZXF1ZXN0VHlwZTo6SU5JVElBTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX0luaXRpYWw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlOjpSRU5FV0FMOgorICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfUmVuZXdhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIGRybTo6VjFfMTo6S2V5UmVxdWVzdFR5cGU6OlJFTEVBU0U6CisgICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9SZWxlYXNlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgZHJtOjpWMV8xOjpLZXlSZXF1ZXN0VHlwZTo6Tk9ORToKKyAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX05vbmU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlOjpVUERBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9VcGRhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1Vua25vd247CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKKyAgICB9CisKICAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPmdldEtleVJlcXVlc3QodG9IaWRsVmVjKHNlc3Npb25JZCksCiAgICAgICAgICAgICB0b0hpZGxWZWMoaW5pdERhdGEpLCB0b0hpZGxTdHJpbmcobWltZVR5cGUpLCBoS2V5VHlwZSwgaE9wdGlvbmFsUGFyYW1ldGVycywKICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgIEtleVJlcXVlc3RUeXBlIGhLZXlSZXF1ZXN0VHlwZSwgY29uc3QgaGlkbF9zdHJpbmcmIGhEZWZhdWx0VXJsKSB7CisgICAgICAgICAgICAgICAgICAgIGRybTo6VjFfMDo6S2V5UmVxdWVzdFR5cGUgaEtleVJlcXVlc3RUeXBlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKIAogICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewogICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOwogICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKIAogICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGhLZXlSZXF1ZXN0VHlwZSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEtleVJlcXVlc3RUeXBlOjpJTklUSUFMOgorICAgICAgICAgICAgICAgICAgICBjYXNlIGRybTo6VjFfMDo6S2V5UmVxdWVzdFR5cGU6OklOSVRJQUw6CiAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Jbml0aWFsOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGU6OlJFTkVXQUw6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgZHJtOjpWMV8wOjpLZXlSZXF1ZXN0VHlwZTo6UkVORVdBTDoKICAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1JlbmV3YWw7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBLZXlSZXF1ZXN0VHlwZTo6UkVMRUFTRToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBkcm06OlYxXzA6OktleVJlcXVlc3RUeXBlOjpSRUxFQVNFOgogICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfUmVsZWFzZTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtNTY4LDE2ICs3NTEsMTcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9KTsKIAotICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworICAgIGVyciA9IGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CisgICAga2V5UmVxdWVzdFRpbWVyLlNldEF0dHJpYnV0ZShlcnIpOworICAgIHJldHVybiBlcnI7CiB9CiAKIHN0YXR1c190IERybUhhbDo6cHJvdmlkZUtleVJlc3BvbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJnJlc3BvbnNlLCBWZWN0b3I8dWludDhfdD4gJmtleVNldElkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBFdmVudFRpbWVyPHN0YXR1c190PiBrZXlSZXNwb25zZVRpbWVyKCZtTWV0cmljcy5tUHJvdmlkZUtleVJlc3BvbnNlVGltZVVzKTsKIAotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KKyAgICBJTklUX0NIRUNLKCk7CiAKICAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOwogCkBAIC01OTIsNDEgKzc3NiwzNSBAQAogICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwogICAgICAgICAgICAgfQogICAgICAgICApOwotCi0gICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CisgICAgZXJyID0gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKKyAgICBrZXlSZXNwb25zZVRpbWVyLlNldEF0dHJpYnV0ZShlcnIpOworICAgIHJldHVybiBlcnI7CiB9CiAKIHN0YXR1c190IERybUhhbDo6cmVtb3ZlS2V5cyhWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CiAKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9Ci0KLSAgICByZXR1cm4gdG9TdGF0dXNUKG1QbHVnaW4tPnJlbW92ZUtleXModG9IaWRsVmVjKGtleVNldElkKSkpOworICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW4tPnJlbW92ZUtleXModG9IaWRsVmVjKGtleVNldElkKSk7CisgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOwogfQogCiBzdGF0dXNfdCBEcm1IYWw6OnJlc3RvcmVLZXlzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KKyAgICBJTklUX0NIRUNLKCk7CiAKICAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOwogCi0gICAgcmV0dXJuIHRvU3RhdHVzVChtUGx1Z2luLT5yZXN0b3JlS2V5cyh0b0hpZGxWZWMoc2Vzc2lvbklkKSwKLSAgICAgICAgICAgICAgICAgICAgdG9IaWRsVmVjKGtleVNldElkKSkpOworICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW4tPnJlc3RvcmVLZXlzKHRvSGlkbFZlYyhzZXNzaW9uSWQpLAorICAgICAgICAgICAgdG9IaWRsVmVjKGtleVNldElkKSk7CisgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOwogfQogCiBzdGF0dXNfdCBEcm1IYWw6OnF1ZXJ5S2V5U3RhdHVzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAmaW5mb01hcCkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9CisgICAgSU5JVF9DSEVDSygpOwogCiAgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKIApAQCAtNjUwLDEwICs4MjgsNyBAQAogICAgICAgICBTdHJpbmc4IGNvbnN0ICZjZXJ0QXV0aG9yaXR5LCBWZWN0b3I8dWludDhfdD4gJnJlcXVlc3QsCiAgICAgICAgIFN0cmluZzggJmRlZmF1bHRVcmwpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci0gICAgfQorICAgIElOSVRfQ0hFQ0soKTsKIAogICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CiAKQEAgLTY2OSwxNiArODQ0LDE1IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICk7CiAKLSAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKKyAgICBlcnIgPSBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworICAgIG1NZXRyaWNzLm1HZXRQcm92aXNpb25SZXF1ZXN0Q291bnRlci5JbmNyZW1lbnQoZXJyKTsKKyAgICByZXR1cm4gZXJyOwogfQogCiBzdGF0dXNfdCBEcm1IYWw6OnByb3ZpZGVQcm92aXNpb25SZXNwb25zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJnJlc3BvbnNlLAogICAgICAgICBWZWN0b3I8dWludDhfdD4gJmNlcnRpZmljYXRlLCBWZWN0b3I8dWludDhfdD4gJndyYXBwZWRLZXkpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci0gICAgfQorICAgIElOSVRfQ0hFQ0soKTsKIAogICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CiAKQEAgLTY5MywxNSArODY3LDE0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICk7CiAKLSAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKKyAgICBlcnIgPSBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworICAgIG1NZXRyaWNzLm1Qcm92aWRlUHJvdmlzaW9uUmVzcG9uc2VDb3VudGVyLkluY3JlbWVudChlcnIpOworICAgIHJldHVybiBlcnI7CiB9CiAKIHN0YXR1c190IERybUhhbDo6Z2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4+ICZzZWN1cmVTdG9wcykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9CisgICAgSU5JVF9DSEVDSygpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKIApAQCAtNzE4LDEzICs4OTEsMzYgQEAKIH0KIAogCi1zdGF0dXNfdCBEcm1IYWw6OmdldFNlY3VyZVN0b3AoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzc2lkLCBWZWN0b3I8dWludDhfdD4gJnNlY3VyZVN0b3ApIHsKK3N0YXR1c190IERybUhhbDo6Z2V0U2VjdXJlU3RvcElkcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4gJnNlY3VyZVN0b3BJZHMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CiAgICAgfQogCisgICAgaWYgKG1QbHVnaW5WMV8xID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW5WMV8xLT5nZXRTZWN1cmVTdG9wSWRzKAorICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPFNlY3VyZVN0b3BJZD4mIGhTZWN1cmVTdG9wSWRzKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHNlY3VyZVN0b3BJZHMgPSB0b1NlY3VyZVN0b3BJZHMoaFNlY3VyZVN0b3BJZHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICApOworCisgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Cit9CisKKworc3RhdHVzX3QgRHJtSGFsOjpnZXRTZWN1cmVTdG9wKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NpZCwgVmVjdG9yPHVpbnQ4X3Q+ICZzZWN1cmVTdG9wKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKICAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwogCiAgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5nZXRTZWN1cmVTdG9wKHRvSGlkbFZlYyhzc2lkKSwKQEAgLTc0MSwyMiArOTM3LDEzMiBAQAogCiBzdGF0dXNfdCBEcm1IYWw6OnJlbGVhc2VTZWN1cmVTdG9wcyhWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzUmVsZWFzZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOwogCi0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX1VOS05PV04pOworICAgIGlmIChtUGx1Z2luVjFfMSAhPSBOVUxMKSB7CisgICAgICAgIFNlY3VyZVN0b3BSZWxlYXNlIHNlY3VyZVN0b3BSZWxlYXNlOworICAgICAgICBzZWN1cmVTdG9wUmVsZWFzZS5vcGFxdWVEYXRhID0gdG9IaWRsVmVjKHNzUmVsZWFzZSk7CisgICAgICAgIHN0YXR1cyA9IG1QbHVnaW5WMV8xLT5yZWxlYXNlU2VjdXJlU3RvcHMoc2VjdXJlU3RvcFJlbGVhc2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IG1QbHVnaW4tPnJlbGVhc2VTZWN1cmVTdG9wKHRvSGlkbFZlYyhzc1JlbGVhc2UpKTsKICAgICB9Ci0KLSAgICByZXR1cm4gdG9TdGF0dXNUKG1QbHVnaW4tPnJlbGVhc2VTZWN1cmVTdG9wKHRvSGlkbFZlYyhzc1JlbGVhc2UpKSk7CisgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOwogfQogCi1zdGF0dXNfdCBEcm1IYWw6OnJlbGVhc2VBbGxTZWN1cmVTdG9wcygpIHsKK3N0YXR1c190IERybUhhbDo6cmVtb3ZlU2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzaWQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CiAgICAgfQogCi0gICAgcmV0dXJuIHRvU3RhdHVzVChtUGx1Z2luLT5yZWxlYXNlQWxsU2VjdXJlU3RvcHMoKSk7CisgICAgaWYgKG1QbHVnaW5WMV8xID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW5WMV8xLT5yZW1vdmVTZWN1cmVTdG9wKHRvSGlkbFZlYyhzc2lkKSk7CisgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWw6OnJlbW92ZUFsbFNlY3VyZVN0b3BzKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzKFN0YXR1czo6RVJST1JfRFJNX1VOS05PV04pOworICAgIGlmIChtUGx1Z2luVjFfMSAhPSBOVUxMKSB7CisgICAgICAgIHN0YXR1cyA9IG1QbHVnaW5WMV8xLT5yZW1vdmVBbGxTZWN1cmVTdG9wcygpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IG1QbHVnaW4tPnJlbGVhc2VBbGxTZWN1cmVTdG9wcygpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzLmlzT2soKSA/IHRvU3RhdHVzVChzdGF0dXMpIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IERybUhhbDo6Z2V0SGRjcExldmVscyhEcm1QbHVnaW46OkhkY3BMZXZlbCAqY29ubmVjdGVkLAorICAgICAgICAgICAgRHJtUGx1Z2luOjpIZGNwTGV2ZWwgKm1heCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgaWYgKGNvbm5lY3RlZCA9PSBOVUxMIHx8IG1heCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBpZiAobVBsdWdpblYxXzEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgKmNvbm5lY3RlZCA9IERybVBsdWdpbjo6a0hkY3BMZXZlbFVua25vd247CisgICAgKm1heCA9IERybVBsdWdpbjo6a0hkY3BMZXZlbFVua25vd247CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW5WMV8xLT5nZXRIZGNwTGV2ZWxzKAorICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IEhkY3BMZXZlbCYgaENvbm5lY3RlZCwgY29uc3QgSGRjcExldmVsJiBoTWF4KSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpjb25uZWN0ZWQgPSB0b0hkY3BMZXZlbChoQ29ubmVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgKm1heCA9IHRvSGRjcExldmVsKGhNYXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICApOworCisgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IERybUhhbDo6Z2V0TnVtYmVyT2ZTZXNzaW9ucyh1aW50MzJfdCAqb3BlbiwgdWludDMyX3QgKm1heCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgSU5JVF9DSEVDSygpOworCisgICAgaWYgKG9wZW4gPT0gTlVMTCB8fCBtYXggPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgKm9wZW4gPSAwOworICAgICptYXggPSAwOworCisgICAgaWYgKG1QbHVnaW5WMV8xID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpblYxXzEtPmdldE51bWJlck9mU2Vzc2lvbnMoCisgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgdWludDMyX3QgaE9wZW4sIHVpbnQzMl90IGhNYXgpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKm9wZW4gPSBoT3BlbjsKKyAgICAgICAgICAgICAgICAgICAgKm1heCA9IGhNYXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICk7CisKKyAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsOjpnZXRTZWN1cml0eUxldmVsKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgKmxldmVsKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CisKKyAgICBpZiAobGV2ZWwgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgaWYgKG1QbHVnaW5WMV8xID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgICpsZXZlbCA9IERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxVbmtub3duOworCisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luVjFfMS0+Z2V0U2VjdXJpdHlMZXZlbCh0b0hpZGxWZWMoc2Vzc2lvbklkKSwKKyAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBTZWN1cml0eUxldmVsIGhMZXZlbCkgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAqbGV2ZWwgPSB0b1NlY3VyaXR5TGV2ZWwoaExldmVsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgKTsKKworICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOwogfQogCiBzdGF0dXNfdCBEcm1IYWw6OmdldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggJnZhbHVlICkgY29uc3QgewpAQCAtNzY3LDEwICsxMDczLDcgQEAKIHN0YXR1c190IERybUhhbDo6Z2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSkgY29uc3QgewogICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgaW50ZXJuYWwgdG8gdGhlIGNsYXNzIGFuZCBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hpbGUKICAgICAvLyBtTG9jayBpcyBhbHJlYWR5IGhlbGQuCi0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9CisgICAgSU5JVF9DSEVDSygpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKIApAQCAtNzk0LDEwICsxMDk3LDcgQEAKIHN0YXR1c190IERybUhhbDo6Z2V0UHJvcGVydHlCeXRlQXJyYXlJbnRlcm5hbChTdHJpbmc4IGNvbnN0ICZuYW1lLCBWZWN0b3I8dWludDhfdD4gJnZhbHVlICkgY29uc3QgewogICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgaW50ZXJuYWwgdG8gdGhlIGNsYXNzIGFuZCBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hpbGUKICAgICAvLyBtTG9jayBpcyBhbHJlYWR5IGhlbGQuCi0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9CisgICAgSU5JVF9DSEVDSygpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKIApAQCAtODEwLDczICsxMTEwLDEwNiBAQAogICAgICAgICAgICAgfQogICAgICk7CiAKLSAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKKyAgICBlcnIgPSBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworICAgIGlmIChuYW1lID09IGtQcm9wZXJ0eURldmljZVVuaXF1ZUlkKSB7CisgICAgICAgIG1NZXRyaWNzLm1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIuSW5jcmVtZW50KGVycik7CisgICAgfQorICAgIHJldHVybiBlcnI7CiB9CiAKIHN0YXR1c190IERybUhhbDo6c2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCBjb25zdCAmdmFsdWUgKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CiAKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9Ci0KLSAgICBTdGF0dXMgc3RhdHVzID0gIG1QbHVnaW4tPnNldFByb3BlcnR5U3RyaW5nKHRvSGlkbFN0cmluZyhuYW1lKSwKKyAgICBSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBtUGx1Z2luLT5zZXRQcm9wZXJ0eVN0cmluZyh0b0hpZGxTdHJpbmcobmFtZSksCiAgICAgICAgICAgICB0b0hpZGxTdHJpbmcodmFsdWUpKTsKLSAgICByZXR1cm4gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOwogfQogCiBzdGF0dXNfdCBEcm1IYWw6OnNldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzggY29uc3QgJm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmdmFsdWUgKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBJTklUX0NIRUNLKCk7CiAKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9Ci0KLSAgICBTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+c2V0UHJvcGVydHlCeXRlQXJyYXkodG9IaWRsU3RyaW5nKG5hbWUpLAorICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW4tPnNldFByb3BlcnR5Qnl0ZUFycmF5KHRvSGlkbFN0cmluZyhuYW1lKSwKICAgICAgICAgICAgIHRvSGlkbFZlYyh2YWx1ZSkpOwotICAgIHJldHVybiB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICByZXR1cm4gc3RhdHVzLmlzT2soKSA/IHRvU3RhdHVzVChzdGF0dXMpIDogREVBRF9PQkpFQ1Q7CiB9CiAKK3N0YXR1c190IERybUhhbDo6Z2V0TWV0cmljcyhQZXJzaXN0YWJsZUJ1bmRsZSogbWV0cmljcykgeworICAgIGlmIChtZXRyaWNzID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIFVORVhQRUNURURfTlVMTDsKKyAgICB9CisgICAgbU1ldHJpY3MuRXhwb3J0KG1ldHJpY3MpOworCisgICAgLy8gQXBwZW5kIHZlbmRvciBtZXRyaWNzIGlmIHRoZXkgYXJlIHN1cHBvcnRlZC4KKyAgICBpZiAobVBsdWdpblYxXzEgIT0gTlVMTCkgeworICAgICAgICBTdHJpbmc4IHZlbmRvcjsKKyAgICAgICAgU3RyaW5nOCBkZXNjcmlwdGlvbjsKKyAgICAgICAgaWYgKGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgidmVuZG9yIiksIHZlbmRvcikgIT0gT0sKKyAgICAgICAgICAgIHx8IHZlbmRvci5pc0VtcHR5KCkpIHsKKyAgICAgICAgICBBTE9HRSgiR2V0IHZlbmRvciBmYWlsZWQgb3IgaXMgZW1wdHkiKTsKKyAgICAgICAgICB2ZW5kb3IgPSAiTk9ORSI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgiZGVzY3JpcHRpb24iKSwgZGVzY3JpcHRpb24pICE9IE9LCisgICAgICAgICAgICB8fCBkZXNjcmlwdGlvbi5pc0VtcHR5KCkpIHsKKyAgICAgICAgICBBTE9HRSgiR2V0IGRlc2NyaXB0aW9uIGZhaWxlZCBvciBpcyBlbXB0eS4iKTsKKyAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJOT05FIjsKKyAgICAgICAgfQorICAgICAgICB2ZW5kb3IgKz0gIi4iOworICAgICAgICB2ZW5kb3IgKz0gZGVzY3JpcHRpb247CisKKyAgICAgICAgaGlkbF92ZWM8RHJtTWV0cmljR3JvdXA+IHBsdWdpbk1ldHJpY3M7CisgICAgICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHN0YXR1cyA9IG1QbHVnaW5WMV8xLT5nZXRNZXRyaWNzKAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBoaWRsX3ZlYzxEcm1NZXRyaWNHcm91cD4gcGx1Z2luTWV0cmljcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiRXJyb3IgZ2V0dGluZyBwbHVnaW4gbWV0cmljczogJWQiLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgUGVyc2lzdGFibGVCdW5kbGUgcGx1Z2luQnVuZGxlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1lZGlhRHJtTWV0cmljczo6SGlkbE1ldHJpY3NUb0J1bmRsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luTWV0cmljcywgJnBsdWdpbkJ1bmRsZSkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT5wdXRQZXJzaXN0YWJsZUJ1bmRsZShTdHJpbmcxNih2ZW5kb3IpLCBwbHVnaW5CdW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICByZXR1cm4gc3RhdHVzLmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KIAogc3RhdHVzX3QgRHJtSGFsOjpzZXRDaXBoZXJBbGdvcml0aG0oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0ICZhbGdvcml0aG0pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci0gICAgfQorICAgIElOSVRfQ0hFQ0soKTsKIAogICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CiAKLSAgICBTdGF0dXMgc3RhdHVzID0gbVBsdWdpbi0+c2V0Q2lwaGVyQWxnb3JpdGhtKHRvSGlkbFZlYyhzZXNzaW9uSWQpLAorICAgIFJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1QbHVnaW4tPnNldENpcGhlckFsZ29yaXRobSh0b0hpZGxWZWMoc2Vzc2lvbklkKSwKICAgICAgICAgICAgIHRvSGlkbFN0cmluZyhhbGdvcml0aG0pKTsKLSAgICByZXR1cm4gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOwogfQogCiBzdGF0dXNfdCBEcm1IYWw6OnNldE1hY0FsZ29yaXRobShWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJmFsZ29yaXRobSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9CisgICAgSU5JVF9DSEVDSygpOwogCiAgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKIAotICAgIFN0YXR1cyBzdGF0dXMgPSBtUGx1Z2luLT5zZXRNYWNBbGdvcml0aG0odG9IaWRsVmVjKHNlc3Npb25JZCksCisgICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbVBsdWdpbi0+c2V0TWFjQWxnb3JpdGhtKHRvSGlkbFZlYyhzZXNzaW9uSWQpLAogICAgICAgICAgICAgdG9IaWRsU3RyaW5nKGFsZ29yaXRobSkpOwotICAgIHJldHVybiB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICByZXR1cm4gc3RhdHVzLmlzT2soKSA/IHRvU3RhdHVzVChzdGF0dXMpIDogREVBRF9PQkpFQ1Q7CiB9CiAKIHN0YXR1c190IERybUhhbDo6ZW5jcnlwdChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlJZCwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpbnB1dCwKICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpdiwgVmVjdG9yPHVpbnQ4X3Q+ICZvdXRwdXQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci0gICAgfQorICAgIElOSVRfQ0hFQ0soKTsKIAogICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CiAKQEAgLTg5OSwxMCArMTIzMiw3IEBACiAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5SWQsIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5wdXQsCiAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaXYsIFZlY3Rvcjx1aW50OF90PiAmb3V0cHV0KSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KKyAgICBJTklUX0NIRUNLKCk7CiAKICAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOwogCkBAIC05MjUsMTAgKzEyNTUsNyBAQAogICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleUlkLCBWZWN0b3I8dWludDhfdD4gY29uc3QgJm1lc3NhZ2UsCiAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmc2lnbmF0dXJlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KKyAgICBJTklUX0NIRUNLKCk7CiAKICAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOwogCkBAIC05NTEsMTAgKzEyNzgsNyBAQAogICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleUlkLCBWZWN0b3I8dWludDhfdD4gY29uc3QgJm1lc3NhZ2UsCiAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2lnbmF0dXJlLCBib29sICZtYXRjaCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKLSAgICB9CisgICAgSU5JVF9DSEVDSygpOwogCiAgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKIApAQCAtOTc5LDEwICsxMzAzLDcgQEAKICAgICAgICAgU3RyaW5nOCBjb25zdCAmYWxnb3JpdGhtLCBWZWN0b3I8dWludDhfdD4gY29uc3QgJm1lc3NhZ2UsCiAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmd3JhcHBlZEtleSwgVmVjdG9yPHVpbnQ4X3Q+ICZzaWduYXR1cmUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci0gICAgfQorICAgIElOSVRfQ0hFQ0soKTsKIAogICAgIGlmICghY2hlY2tQZXJtaXNzaW9uKCJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX0RSTV9DRVJUSUZJQ0FURVMiKSkgewogICAgICAgICByZXR1cm4gLUVQRVJNOwpAQCAtMTAwNywxNyArMTMyOCw3IEBACiAKIHZvaWQgRHJtSGFsOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ0aGVfbGF0ZV93aG8gX191bnVzZWQpCiB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBjbG9zZU9wZW5TZXNzaW9ucygpOwotICAgIHNldExpc3RlbmVyKE5VTEwpOwotICAgIG1Jbml0Q2hlY2sgPSBOT19JTklUOwotCi0gICAgaWYgKG1QbHVnaW4gIT0gTlVMTCkgewotICAgICAgICBpZiAoIW1QbHVnaW4tPnNldExpc3RlbmVyKE5VTEwpLmlzT2soKSkgewotICAgICAgICAgICAgbUluaXRDaGVjayA9IERFQURfT0JKRUNUOwotICAgICAgICB9Ci0gICAgfQotICAgIG1QbHVnaW4uY2xlYXIoKTsKKyAgICBjbGVhbnVwKCk7CiB9CiAKIHZvaWQgRHJtSGFsOjp3cml0ZUJ5dGVBcnJheShQYXJjZWwgJm9iaiwgaGlkbF92ZWM8dWludDhfdD4gY29uc3QgJnZlYykKQEAgLTEwMzAsMTggKzEzNDEsNTUgQEAKICAgICB9CiB9CiAKLXZvaWQgRHJtSGFsOjpyZXBvcnRNZXRyaWNzKCkgY29uc3QKK3ZvaWQgRHJtSGFsOjpyZXBvcnRGcmFtZXdvcmtNZXRyaWNzKCkgY29uc3QKIHsKLSAgICBWZWN0b3I8dWludDhfdD4gbWV0cmljczsKKyAgICBNZWRpYUFuYWx5dGljc0l0ZW0gaXRlbSgibWVkaWFkcm0iKTsKKyAgICBpdGVtLmdlbmVyYXRlU2Vzc2lvbklEKCk7CisgICAgaXRlbS5zZXRQa2dOYW1lKG1NZXRyaWNzLkdldEFwcFBhY2thZ2VOYW1lKCkuY19zdHIoKSk7CisgICAgU3RyaW5nOCB2ZW5kb3I7CisgICAgU3RyaW5nOCBkZXNjcmlwdGlvbjsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoInZlbmRvciIpLCB2ZW5kb3IpOworICAgIGlmIChyZXN1bHQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgdmVuZG9yIGZyb20gZHJtIHBsdWdpbjogJWQiLCByZXN1bHQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGl0ZW0uc2V0Q1N0cmluZygidmVuZG9yIiwgdmVuZG9yLmNfc3RyKCkpOworICAgIH0KKyAgICByZXN1bHQgPSBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoImRlc2NyaXB0aW9uIiksIGRlc2NyaXB0aW9uKTsKKyAgICBpZiAocmVzdWx0ICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IGRlc2NyaXB0aW9uIGZyb20gZHJtIHBsdWdpbjogJWQiLCByZXN1bHQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGl0ZW0uc2V0Q1N0cmluZygiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbi5jX3N0cigpKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkTWV0cmljczsKKyAgICByZXN1bHQgPSBtTWV0cmljcy5HZXRTZXJpYWxpemVkTWV0cmljcygmc2VyaWFsaXplZE1ldHJpY3MpOworICAgIGlmIChyZXN1bHQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXJpYWxpemUgZnJhbWV3b3JrIG1ldHJpY3M6ICVkIiwgcmVzdWx0KTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgYjY0RW5jb2RlZE1ldHJpY3MgPSB0b0Jhc2U2NFN0cmluZ05vUGFkKHNlcmlhbGl6ZWRNZXRyaWNzLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZE1ldHJpY3Muc2l6ZSgpKTsKKyAgICBpZiAoIWI2NEVuY29kZWRNZXRyaWNzLmVtcHR5KCkpIHsKKyAgICAgICAgaXRlbS5zZXRDU3RyaW5nKCJzZXJpYWxpemVkX21ldHJpY3MiLCBiNjRFbmNvZGVkTWV0cmljcy5jX3N0cigpKTsKKyAgICB9CisgICAgaWYgKCFpdGVtLnNlbGZyZWNvcmQoKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNlbGYgcmVjb3JkIGZyYW1ld29yayBtZXRyaWNzIik7CisgICAgfQorfQorCit2b2lkIERybUhhbDo6cmVwb3J0UGx1Z2luTWV0cmljcygpIGNvbnN0Cit7CisgICAgVmVjdG9yPHVpbnQ4X3Q+IG1ldHJpY3NWZWN0b3I7CiAgICAgU3RyaW5nOCB2ZW5kb3I7CiAgICAgU3RyaW5nOCBkZXNjcmlwdGlvbjsKICAgICBpZiAoZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJ2ZW5kb3IiKSwgdmVuZG9yKSA9PSBPSyAmJgogICAgICAgICAgICAgZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJkZXNjcmlwdGlvbiIpLCBkZXNjcmlwdGlvbikgPT0gT0sgJiYKLSAgICAgICAgICAgIGdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwoU3RyaW5nOCgibWV0cmljcyIpLCBtZXRyaWNzKSA9PSBPSykgewotICAgICAgICBzdGF0dXNfdCByZXMgPSBhbmRyb2lkOjpyZXBvcnREcm1QbHVnaW5NZXRyaWNzKAotICAgICAgICAgICAgICAgIG1ldHJpY3MsIHZlbmRvciwgZGVzY3JpcHRpb24pOworICAgICAgICAgICAgZ2V0UHJvcGVydHlCeXRlQXJyYXlJbnRlcm5hbChTdHJpbmc4KCJtZXRyaWNzIiksIG1ldHJpY3NWZWN0b3IpID09IE9LKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1ldHJpY3NTdHJpbmcgPSB0b0Jhc2U2NFN0cmluZ05vUGFkKG1ldHJpY3NWZWN0b3IuYXJyYXkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljc1ZlY3Rvci5zaXplKCkpOworICAgICAgICBzdGF0dXNfdCByZXMgPSBhbmRyb2lkOjpyZXBvcnREcm1QbHVnaW5NZXRyaWNzKG1ldHJpY3NTdHJpbmcsIHZlbmRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiwgbUFwcFBhY2thZ2VOYW1lKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIk1ldHJpY3Mgd2VyZSByZXRyaWV2ZWQgYnV0IGNvdWxkIG5vdCBiZSByZXBvcnRlZDogJWkiLCByZXMpOworICAgICAgICAgICAgQUxPR0UoIk1ldHJpY3Mgd2VyZSByZXRyaWV2ZWQgYnV0IGNvdWxkIG5vdCBiZSByZXBvcnRlZDogJWQiLCByZXMpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0RybU1ldHJpY3MuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0RybU1ldHJpY3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZWQ3MDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGlibWVkaWFkcm0vRHJtTWV0cmljcy5jcHAKQEAgLTAsMCArMSw0MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJEcm1NZXRyaWNzIgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybU1ldHJpY3MuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorCisjaW5jbHVkZSAicHJvdG9zL21ldHJpY3MucGIuaCIKKwordXNpbmcgOjphbmRyb2lkOjpTdHJpbmcxNjsKK3VzaW5nIDo6YW5kcm9pZDo6U3RyaW5nODsKK3VzaW5nIDo6YW5kcm9pZDo6ZHJtX21ldHJpY3M6OkRybUZyYW1ld29ya01ldHJpY3M7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpFdmVudFR5cGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OktleVN0YXR1c1R5cGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OkRybU1ldHJpY0dyb3VwOwordXNpbmcgOjphbmRyb2lkOjpvczo6UGVyc2lzdGFibGVCdW5kbGU7CisKK25hbWVzcGFjZSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdGQ6OnN0cmluZyBHZXRBdHRyaWJ1dGVOYW1lKFQgdHlwZSk7CisKK3RlbXBsYXRlIDw+IHN0ZDo6c3RyaW5nIEdldEF0dHJpYnV0ZU5hbWU8S2V5U3RhdHVzVHlwZT4oS2V5U3RhdHVzVHlwZSB0eXBlKSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKnR5cGVfbmFtZXNbXSA9IHsiVVNBQkxFIiwgIkVYUElSRUQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9VVFBVVF9OT1RfQUxMT1dFRCIsICJTVEFUVVNfUEVORElORyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5URVJOQUxfRVJST1IifTsKKyAgICBpZiAoKChzaXplX3QpdHlwZSkgPiBhcnJheXNpemUodHlwZV9uYW1lcykpIHsKKyAgICAgICAgcmV0dXJuICJVTktOT1dOX1RZUEUiOworICAgIH0KKyAgICByZXR1cm4gdHlwZV9uYW1lc1soc2l6ZV90KXR5cGVdOworfQorCit0ZW1wbGF0ZSA8PiBzdGQ6OnN0cmluZyBHZXRBdHRyaWJ1dGVOYW1lPEV2ZW50VHlwZT4oRXZlbnRUeXBlIHR5cGUpIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqdHlwZV9uYW1lc1tdID0geyJQUk9WSVNJT05fUkVRVUlSRUQiLCAiS0VZX05FRURFRCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS0VZX0VYUElSRUQiLCAiVkVORE9SX0RFRklORUQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNFU1NJT05fUkVDTEFJTUVEIn07CisgICAgaWYgKCgoc2l6ZV90KXR5cGUpID4gYXJyYXlzaXplKHR5cGVfbmFtZXMpKSB7CisgICAgICAgIHJldHVybiAiVU5LTk9XTl9UWVBFIjsKKyAgICB9CisgICAgcmV0dXJuIHR5cGVfbmFtZXNbKHNpemVfdCl0eXBlXTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIEV4cG9ydENvdW50ZXJNZXRyaWMoY29uc3QgYW5kcm9pZDo6Q291bnRlck1ldHJpYzxUPiAmY291bnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQZXJzaXN0YWJsZUJ1bmRsZSAqbWV0cmljcykgeworICAgIGlmICghbWV0cmljcykgeworICAgICAgICBBTE9HRSgibWV0cmljcyB3YXMgdW5leHBlY3RlZGx5IG51bGwuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgc3VjY2Vzc19jb3VudF9uYW1lID0gY291bnRlci5tZXRyaWNfbmFtZSgpICsgIi5vay5jb3VudCI7CisgICAgc3RkOjpzdHJpbmcgZXJyb3JfY291bnRfbmFtZSA9IGNvdW50ZXIubWV0cmljX25hbWUoKSArICIuZXJyb3IuY291bnQiOworICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IHN0YXR1c192YWx1ZXM7CisgICAgY291bnRlci5FeHBvcnRWYWx1ZXMoCisgICAgICAgIFsmXShjb25zdCBhbmRyb2lkOjpzdGF0dXNfdCBzdGF0dXMsIGNvbnN0IGludDY0X3QgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgICAgICBtZXRyaWNzLT5wdXRMb25nKGFuZHJvaWQ6OlN0cmluZzE2KHN1Y2Nlc3NfY291bnRfbmFtZS5jX3N0cigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCB0b3RhbF9lcnJvcnMoMCk7CisgICAgICAgICAgICAgICAgbWV0cmljcy0+Z2V0TG9uZyhhbmRyb2lkOjpTdHJpbmcxNihlcnJvcl9jb3VudF9uYW1lLmNfc3RyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvdGFsX2Vycm9ycyk7CisgICAgICAgICAgICAgICAgbWV0cmljcy0+cHV0TG9uZyhhbmRyb2lkOjpTdHJpbmcxNihlcnJvcl9jb3VudF9uYW1lLmNfc3RyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfZXJyb3JzICsgdmFsdWUpOworICAgICAgICAgICAgICAgIHN0YXR1c192YWx1ZXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIGlmICghc3RhdHVzX3ZhbHVlcy5lbXB0eSgpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGVycm9yX2xpc3RfbmFtZSA9IGNvdW50ZXIubWV0cmljX25hbWUoKSArICIuZXJyb3IubGlzdCI7CisgICAgICAgIG1ldHJpY3MtPnB1dExvbmdWZWN0b3IoYW5kcm9pZDo6U3RyaW5nMTYoZXJyb3JfbGlzdF9uYW1lLmNfc3RyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c192YWx1ZXMpOworICAgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIEV4cG9ydENvdW50ZXJNZXRyaWNXaXRoQXR0cmlidXRlTmFtZXMoCisgICAgY29uc3QgYW5kcm9pZDo6Q291bnRlck1ldHJpYzxUPiAmY291bnRlciwgUGVyc2lzdGFibGVCdW5kbGUgKm1ldHJpY3MpIHsKKyAgICBpZiAoIW1ldHJpY3MpIHsKKyAgICAgICAgQUxPR0UoIm1ldHJpY3Mgd2FzIHVuZXhwZWN0ZWRseSBudWxsLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNvdW50ZXIuRXhwb3J0VmFsdWVzKFsmXShjb25zdCBUICZhdHRyaWJ1dGUsIGNvbnN0IGludDY0X3QgdmFsdWUpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGNvdW50ZXIubWV0cmljX25hbWUoKSArICIuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRBdHRyaWJ1dGVOYW1lKGF0dHJpYnV0ZSkgKyAiLmNvdW50IjsKKyAgICAgICAgbWV0cmljcy0+cHV0TG9uZyhhbmRyb2lkOjpTdHJpbmcxNihuYW1lLmNfc3RyKCkpLCB2YWx1ZSk7CisgICAgfSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBFeHBvcnRFdmVudE1ldHJpYyhjb25zdCBhbmRyb2lkOjpFdmVudE1ldHJpYzxUPiAmZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIFBlcnNpc3RhYmxlQnVuZGxlICptZXRyaWNzKSB7CisgICAgaWYgKCFtZXRyaWNzKSB7CisgICAgICAgIEFMT0dFKCJtZXRyaWNzIHdhcyB1bmV4cGVjdGVkbHkgbnVsbC4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBzdWNjZXNzX2NvdW50X25hbWUgPSBldmVudC5tZXRyaWNfbmFtZSgpICsgIi5vay5jb3VudCI7CisgICAgc3RkOjpzdHJpbmcgZXJyb3JfY291bnRfbmFtZSA9IGV2ZW50Lm1ldHJpY19uYW1lKCkgKyAiLmVycm9yLmNvdW50IjsKKyAgICBzdGQ6OnN0cmluZyB0aW1pbmdfbmFtZSA9IGV2ZW50Lm1ldHJpY19uYW1lKCkgKyAiLm9rLmF2ZXJhZ2VfdGltZV9taWNyb3MiOworICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IHN0YXR1c192YWx1ZXM7CisgICAgZXZlbnQuRXhwb3J0VmFsdWVzKFsmXShjb25zdCBhbmRyb2lkOjpzdGF0dXNfdCAmc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6RXZlbnRTdGF0aXN0aWNzICZ2YWx1ZSkgeworICAgICAgICBpZiAoc3RhdHVzID09IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgICAgICBtZXRyaWNzLT5wdXRMb25nKGFuZHJvaWQ6OlN0cmluZzE2KHN1Y2Nlc3NfY291bnRfbmFtZS5jX3N0cigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuY291bnQpOworICAgICAgICAgICAgbWV0cmljcy0+cHV0TG9uZyhhbmRyb2lkOjpTdHJpbmcxNih0aW1pbmdfbmFtZS5jX3N0cigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUubWVhbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQ2NF90IHRvdGFsX2Vycm9ycygwKTsKKyAgICAgICAgICAgIG1ldHJpY3MtPmdldExvbmcoYW5kcm9pZDo6U3RyaW5nMTYoZXJyb3JfY291bnRfbmFtZS5jX3N0cigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvdGFsX2Vycm9ycyk7CisgICAgICAgICAgICBtZXRyaWNzLT5wdXRMb25nKGFuZHJvaWQ6OlN0cmluZzE2KGVycm9yX2NvdW50X25hbWUuY19zdHIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2Vycm9ycyArIHZhbHVlLmNvdW50KTsKKyAgICAgICAgICAgIHN0YXR1c192YWx1ZXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgIH0KKyAgICB9KTsKKyAgICBpZiAoIXN0YXR1c192YWx1ZXMuZW1wdHkoKSkgeworICAgICAgICBzdGQ6OnN0cmluZyBlcnJvcl9saXN0X25hbWUgPSBldmVudC5tZXRyaWNfbmFtZSgpICsgIi5lcnJvci5saXN0IjsKKyAgICAgICAgbWV0cmljcy0+cHV0TG9uZ1ZlY3RvcihhbmRyb2lkOjpTdHJpbmcxNihlcnJvcl9saXN0X25hbWUuY19zdHIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3ZhbHVlcyk7CisgICAgfQorfQorCit2b2lkIEV4cG9ydFNlc3Npb25MaWZlc3BhbnMoCisgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6cGFpcjxpbnQ2NF90LCBpbnQ2NF90Pj4gJm1TZXNzaW9uTGlmZXNwYW5zLAorICAgIFBlcnNpc3RhYmxlQnVuZGxlICptZXRyaWNzKSB7CisgICAgaWYgKCFtZXRyaWNzKSB7CisgICAgICAgIEFMT0dFKCJtZXRyaWNzIHdhcyB1bmV4cGVjdGVkbHkgbnVsbC4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtU2Vzc2lvbkxpZmVzcGFucy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQZXJzaXN0YWJsZUJ1bmRsZSBzdGFydFRpbWVzQnVuZGxlOworICAgIFBlcnNpc3RhYmxlQnVuZGxlIGVuZFRpbWVzQnVuZGxlOworICAgIGZvciAoYXV0byBpdCA9IG1TZXNzaW9uTGlmZXNwYW5zLmJlZ2luKCk7IGl0ICE9IG1TZXNzaW9uTGlmZXNwYW5zLmVuZCgpOworICAgICAgICAgaXQrKykgeworICAgICAgICBTdHJpbmcxNiBrZXkoaXQtPmZpcnN0LmNfc3RyKCksIGl0LT5maXJzdC5zaXplKCkpOworICAgICAgICBzdGFydFRpbWVzQnVuZGxlLnB1dExvbmcoa2V5LCBpdC0+c2Vjb25kLmZpcnN0KTsKKyAgICAgICAgZW5kVGltZXNCdW5kbGUucHV0TG9uZyhrZXksIGl0LT5zZWNvbmQuc2Vjb25kKTsKKyAgICB9CisgICAgbWV0cmljcy0+cHV0UGVyc2lzdGFibGVCdW5kbGUoCisgICAgICAgIGFuZHJvaWQ6OlN0cmluZzE2KCJkcm0ubWVkaWFkcm0uc2Vzc2lvbl9zdGFydF90aW1lc19tcyIpLAorICAgICAgICBzdGFydFRpbWVzQnVuZGxlKTsKKyAgICBtZXRyaWNzLT5wdXRQZXJzaXN0YWJsZUJ1bmRsZSgKKyAgICAgICAgYW5kcm9pZDo6U3RyaW5nMTYoImRybS5tZWRpYWRybS5zZXNzaW9uX2VuZF90aW1lc19tcyIpLCBlbmRUaW1lc0J1bmRsZSk7Cit9CisKK3N0ZDo6c3RyaW5nIFRvSGV4U3RyaW5nKGNvbnN0IGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiAmc2Vzc2lvbklkKSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgICBvdXQgPDwgc3RkOjpoZXggPDwgc3RkOjpzZXRmaWxsKCcwJyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzZXNzaW9uSWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgb3V0IDw8IHN0ZDo6c2V0dygyKSA8PCAoaW50KShzZXNzaW9uSWRbaV0pOworICAgIH0KKyAgICByZXR1cm4gb3V0LnN0cigpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ1Q+Cit2b2lkIFNldFZhbHVlKGNvbnN0IFN0cmluZzE2ICZuYW1lLCBEcm1NZXRyaWNHcm91cDo6VmFsdWVUeXBlIHR5cGUsCisgICAgICAgICAgICAgIGNvbnN0IENUICZ2YWx1ZSwgUGVyc2lzdGFibGVCdW5kbGUgKmJ1bmRsZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgRHJtTWV0cmljR3JvdXA6OlZhbHVlVHlwZTo6SU5UNjRfVFlQRToKKyAgICAgICAgYnVuZGxlLT5wdXRMb25nKG5hbWUsIHZhbHVlLmludDY0VmFsdWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERybU1ldHJpY0dyb3VwOjpWYWx1ZVR5cGU6OkRPVUJMRV9UWVBFOgorICAgICAgICBidW5kbGUtPnB1dERvdWJsZShuYW1lLCB2YWx1ZS5kb3VibGVWYWx1ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRHJtTWV0cmljR3JvdXA6OlZhbHVlVHlwZTo6U1RSSU5HX1RZUEU6CisgICAgICAgIGJ1bmRsZS0+cHV0U3RyaW5nKG5hbWUsIFN0cmluZzE2KHZhbHVlLnN0cmluZ1ZhbHVlLmNfc3RyKCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoIlVuZXhwZWN0ZWQgdmFsdWUgdHlwZTogJWhodSIsIHR5cGUpOworICAgIH0KK30KKworaW5saW5lIFN0cmluZzE2IE1ha2VJbmRleFN0cmluZyh1bnNpZ25lZCBpbnQgaW5kZXgpIHsKKyAgc3RkOjpzdHJpbmcgc3RyKCJbIik7CisgIHN0ci5hcHBlbmQoc3RkOjp0b19zdHJpbmcoaW5kZXgpKTsKKyAgc3RyLmFwcGVuZCgiXSIpOworICByZXR1cm4gU3RyaW5nMTYoc3RyLmNfc3RyKCkpOworfQorCit9IC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK01lZGlhRHJtTWV0cmljczo6TWVkaWFEcm1NZXRyaWNzKCkKKyAgICA6IG1PcGVuU2Vzc2lvbkNvdW50ZXIoImRybS5tZWRpYWRybS5vcGVuX3Nlc3Npb24iLCAic3RhdHVzIiksCisgICAgICBtQ2xvc2VTZXNzaW9uQ291bnRlcigiZHJtLm1lZGlhZHJtLmNsb3NlX3Nlc3Npb24iLCAic3RhdHVzIiksCisgICAgICBtR2V0S2V5UmVxdWVzdFRpbWVVcygiZHJtLm1lZGlhZHJtLmdldF9rZXlfcmVxdWVzdCIsICJzdGF0dXMiKSwKKyAgICAgIG1Qcm92aWRlS2V5UmVzcG9uc2VUaW1lVXMoImRybS5tZWRpYWRybS5wcm92aWRlX2tleV9yZXNwb25zZSIsICJzdGF0dXMiKSwKKyAgICAgIG1HZXRQcm92aXNpb25SZXF1ZXN0Q291bnRlcigiZHJtLm1lZGlhZHJtLmdldF9wcm92aXNpb25fcmVxdWVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YXR1cyIpLAorICAgICAgbVByb3ZpZGVQcm92aXNpb25SZXNwb25zZUNvdW50ZXIoCisgICAgICAgICAgImRybS5tZWRpYWRybS5wcm92aWRlX3Byb3Zpc2lvbl9yZXNwb25zZSIsICJzdGF0dXMiKSwKKyAgICAgIG1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyKCJkcm0ubWVkaWFkcm0ua2V5X3N0YXR1c19jaGFuZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImtleV9zdGF0dXNfdHlwZSIpLAorICAgICAgbUV2ZW50Q291bnRlcigiZHJtLm1lZGlhZHJtLmV2ZW50IiwgImV2ZW50X3R5cGUiKSwKKyAgICAgIG1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIoImRybS5tZWRpYWRybS5nZXRfZGV2aWNlX3VuaXF1ZV9pZCIsICJzdGF0dXMiKSB7Cit9CisKK3ZvaWQgTWVkaWFEcm1NZXRyaWNzOjpTZXRTZXNzaW9uU3RhcnQoCisgICAgY29uc3QgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQpIHsKKyAgICBzdGQ6OnN0cmluZyBzZXNzaW9uSWRIZXggPSBUb0hleFN0cmluZyhzZXNzaW9uSWQpOworICAgIG1TZXNzaW9uTGlmZXNwYW5zW3Nlc3Npb25JZEhleF0gPQorICAgICAgICBzdGQ6Om1ha2VfcGFpcihHZXRDdXJyZW50VGltZU1zKCksIChpbnQ2NF90KTApOworfQorCit2b2lkIE1lZGlhRHJtTWV0cmljczo6U2V0U2Vzc2lvbkVuZChjb25zdCBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZCkgeworICAgIHN0ZDo6c3RyaW5nIHNlc3Npb25JZEhleCA9IFRvSGV4U3RyaW5nKHNlc3Npb25JZCk7CisgICAgaW50NjRfdCBlbmRUaW1lTXMgPSBHZXRDdXJyZW50VGltZU1zKCk7CisgICAgaWYgKG1TZXNzaW9uTGlmZXNwYW5zLmZpbmQoc2Vzc2lvbklkSGV4KSAhPSBtU2Vzc2lvbkxpZmVzcGFucy5lbmQoKSkgeworICAgICAgICBtU2Vzc2lvbkxpZmVzcGFuc1tzZXNzaW9uSWRIZXhdID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKG1TZXNzaW9uTGlmZXNwYW5zW3Nlc3Npb25JZEhleF0uZmlyc3QsIGVuZFRpbWVNcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNlc3Npb25MaWZlc3BhbnNbc2Vzc2lvbklkSGV4XSA9IHN0ZDo6bWFrZV9wYWlyKChpbnQ2NF90KTAsIGVuZFRpbWVNcyk7CisgICAgfQorfQorCit2b2lkIE1lZGlhRHJtTWV0cmljczo6RXhwb3J0KFBlcnNpc3RhYmxlQnVuZGxlICptZXRyaWNzKSB7CisgICAgaWYgKCFtZXRyaWNzKSB7CisgICAgICAgIEFMT0dFKCJtZXRyaWNzIHdhcyB1bmV4cGVjdGVkbHkgbnVsbC4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBFeHBvcnRDb3VudGVyTWV0cmljKG1PcGVuU2Vzc2lvbkNvdW50ZXIsIG1ldHJpY3MpOworICAgIEV4cG9ydENvdW50ZXJNZXRyaWMobUNsb3NlU2Vzc2lvbkNvdW50ZXIsIG1ldHJpY3MpOworICAgIEV4cG9ydEV2ZW50TWV0cmljKG1HZXRLZXlSZXF1ZXN0VGltZVVzLCBtZXRyaWNzKTsKKyAgICBFeHBvcnRFdmVudE1ldHJpYyhtUHJvdmlkZUtleVJlc3BvbnNlVGltZVVzLCBtZXRyaWNzKTsKKyAgICBFeHBvcnRDb3VudGVyTWV0cmljKG1HZXRQcm92aXNpb25SZXF1ZXN0Q291bnRlciwgbWV0cmljcyk7CisgICAgRXhwb3J0Q291bnRlck1ldHJpYyhtUHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlQ291bnRlciwgbWV0cmljcyk7CisgICAgRXhwb3J0Q291bnRlck1ldHJpY1dpdGhBdHRyaWJ1dGVOYW1lcyhtS2V5U3RhdHVzQ2hhbmdlQ291bnRlciwgbWV0cmljcyk7CisgICAgRXhwb3J0Q291bnRlck1ldHJpY1dpdGhBdHRyaWJ1dGVOYW1lcyhtRXZlbnRDb3VudGVyLCBtZXRyaWNzKTsKKyAgICBFeHBvcnRDb3VudGVyTWV0cmljKG1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIsIG1ldHJpY3MpOworICAgIEV4cG9ydFNlc3Npb25MaWZlc3BhbnMobVNlc3Npb25MaWZlc3BhbnMsIG1ldHJpY3MpOworfQorCitzdGF0dXNfdCBNZWRpYURybU1ldHJpY3M6OkdldFNlcmlhbGl6ZWRNZXRyaWNzKHN0ZDo6c3RyaW5nICpzZXJpYWxpemVkTWV0cmljcykgeworCisgICAgaWYgKCFzZXJpYWxpemVkTWV0cmljcykgeworICAgICAgICBBTE9HRSgic2VyaWFsaXplZE1ldHJpY3Mgd2FzIHVuZXhwZWN0ZWRseSBudWxsLiIpOworICAgICAgICByZXR1cm4gVU5FWFBFQ1RFRF9OVUxMOworICAgIH0KKworICAgIERybUZyYW1ld29ya01ldHJpY3MgbWV0cmljczsKKworICAgIG1PcGVuU2Vzc2lvbkNvdW50ZXIuRXhwb3J0VmFsdWVzKAorICAgICAgICBbJl0oY29uc3QgYW5kcm9pZDo6c3RhdHVzX3Qgc3RhdHVzLCBjb25zdCBpbnQ2NF90IHZhbHVlKSB7CisgICAgICAgICAgICBEcm1GcmFtZXdvcmtNZXRyaWNzOjpDb3VudGVyICpjb3VudGVyID0KKyAgICAgICAgICAgICAgICBtZXRyaWNzLmFkZF9vcGVuX3Nlc3Npb25fY291bnRlcigpOworICAgICAgICAgICAgY291bnRlci0+c2V0X2NvdW50KHZhbHVlKTsKKyAgICAgICAgICAgIGNvdW50ZXItPm11dGFibGVfYXR0cmlidXRlcygpLT5zZXRfZXJyb3JfY29kZShzdGF0dXMpOworICAgICAgICB9KTsKKworICAgIG1DbG9zZVNlc3Npb25Db3VudGVyLkV4cG9ydFZhbHVlcygKKyAgICAgICAgWyZdKGNvbnN0IGFuZHJvaWQ6OnN0YXR1c190IHN0YXR1cywgY29uc3QgaW50NjRfdCB2YWx1ZSkgeworICAgICAgICAgICAgRHJtRnJhbWV3b3JrTWV0cmljczo6Q291bnRlciAqY291bnRlciA9CisgICAgICAgICAgICAgICAgbWV0cmljcy5hZGRfY2xvc2Vfc2Vzc2lvbl9jb3VudGVyKCk7CisgICAgICAgICAgICBjb3VudGVyLT5zZXRfY291bnQodmFsdWUpOworICAgICAgICAgICAgY291bnRlci0+bXV0YWJsZV9hdHRyaWJ1dGVzKCktPnNldF9lcnJvcl9jb2RlKHN0YXR1cyk7CisgICAgICAgIH0pOworCisgICAgbUdldFByb3Zpc2lvblJlcXVlc3RDb3VudGVyLkV4cG9ydFZhbHVlcygKKyAgICAgICAgWyZdKGNvbnN0IGFuZHJvaWQ6OnN0YXR1c190IHN0YXR1cywgY29uc3QgaW50NjRfdCB2YWx1ZSkgeworICAgICAgICAgICAgRHJtRnJhbWV3b3JrTWV0cmljczo6Q291bnRlciAqY291bnRlciA9CisgICAgICAgICAgICAgICAgbWV0cmljcy5hZGRfZ2V0X3Byb3Zpc2lvbmluZ19yZXF1ZXN0X2NvdW50ZXIoKTsKKyAgICAgICAgICAgIGNvdW50ZXItPnNldF9jb3VudCh2YWx1ZSk7CisgICAgICAgICAgICBjb3VudGVyLT5tdXRhYmxlX2F0dHJpYnV0ZXMoKS0+c2V0X2Vycm9yX2NvZGUoc3RhdHVzKTsKKyAgICAgICAgfSk7CisKKyAgICBtUHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlQ291bnRlci5FeHBvcnRWYWx1ZXMoCisgICAgICAgIFsmXShjb25zdCBhbmRyb2lkOjpzdGF0dXNfdCBzdGF0dXMsIGNvbnN0IGludDY0X3QgdmFsdWUpIHsKKyAgICAgICAgICAgIERybUZyYW1ld29ya01ldHJpY3M6OkNvdW50ZXIgKmNvdW50ZXIgPQorICAgICAgICAgICAgICAgIG1ldHJpY3MuYWRkX3Byb3ZpZGVfcHJvdmlzaW9uaW5nX3Jlc3BvbnNlX2NvdW50ZXIoKTsKKyAgICAgICAgICAgIGNvdW50ZXItPnNldF9jb3VudCh2YWx1ZSk7CisgICAgICAgICAgICBjb3VudGVyLT5tdXRhYmxlX2F0dHJpYnV0ZXMoKS0+c2V0X2Vycm9yX2NvZGUoc3RhdHVzKTsKKyAgICAgICAgfSk7CisKKyAgICBtS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5FeHBvcnRWYWx1ZXMoCisgICAgICAgIFsmXShjb25zdCBLZXlTdGF0dXNUeXBlIGtleV9zdGF0dXNfdHlwZSwgY29uc3QgaW50NjRfdCB2YWx1ZSkgeworICAgICAgICAgICAgRHJtRnJhbWV3b3JrTWV0cmljczo6Q291bnRlciAqY291bnRlciA9CisgICAgICAgICAgICAgICAgbWV0cmljcy5hZGRfa2V5X3N0YXR1c19jaGFuZ2VfY291bnRlcigpOworICAgICAgICAgICAgY291bnRlci0+c2V0X2NvdW50KHZhbHVlKTsKKyAgICAgICAgICAgIGNvdW50ZXItPm11dGFibGVfYXR0cmlidXRlcygpLT5zZXRfa2V5X3N0YXR1c190eXBlKAorICAgICAgICAgICAgICAgICh1aW50MzJfdClrZXlfc3RhdHVzX3R5cGUpOworICAgICAgICB9KTsKKworICAgIG1FdmVudENvdW50ZXIuRXhwb3J0VmFsdWVzKAorICAgICAgICBbJl0oY29uc3QgRXZlbnRUeXBlIGV2ZW50X3R5cGUsIGNvbnN0IGludDY0X3QgdmFsdWUpIHsKKyAgICAgICAgICAgIERybUZyYW1ld29ya01ldHJpY3M6OkNvdW50ZXIgKmNvdW50ZXIgPQorICAgICAgICAgICAgICAgIG1ldHJpY3MuYWRkX2V2ZW50X2NhbGxiYWNrX2NvdW50ZXIoKTsKKyAgICAgICAgICAgIGNvdW50ZXItPnNldF9jb3VudCh2YWx1ZSk7CisgICAgICAgICAgICBjb3VudGVyLT5tdXRhYmxlX2F0dHJpYnV0ZXMoKS0+c2V0X2V2ZW50X3R5cGUoKHVpbnQzMl90KWV2ZW50X3R5cGUpOworICAgICAgICB9KTsKKworICAgIG1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIuRXhwb3J0VmFsdWVzKAorICAgICAgICBbJl0oY29uc3Qgc3RhdHVzX3Qgc3RhdHVzLCBjb25zdCBpbnQ2NF90IHZhbHVlKSB7CisgICAgICAgICAgICBEcm1GcmFtZXdvcmtNZXRyaWNzOjpDb3VudGVyICpjb3VudGVyID0KKyAgICAgICAgICAgICAgICBtZXRyaWNzLmFkZF9nZXRfZGV2aWNlX3VuaXF1ZV9pZF9jb3VudGVyKCk7CisgICAgICAgICAgICBjb3VudGVyLT5zZXRfY291bnQodmFsdWUpOworICAgICAgICAgICAgY291bnRlci0+bXV0YWJsZV9hdHRyaWJ1dGVzKCktPnNldF9lcnJvcl9jb2RlKHN0YXR1cyk7CisgICAgICAgIH0pOworCisgICAgbUdldEtleVJlcXVlc3RUaW1lVXMuRXhwb3J0VmFsdWVzKAorICAgICAgICBbJl0oY29uc3Qgc3RhdHVzX3Qgc3RhdHVzLCBjb25zdCBFdmVudFN0YXRpc3RpY3MgJnN0YXRzKSB7CisgICAgICAgICAgICBEcm1GcmFtZXdvcmtNZXRyaWNzOjpEaXN0cmlidXRpb25NZXRyaWMgKm1ldHJpYyA9CisgICAgICAgICAgICAgICAgbWV0cmljcy5hZGRfZ2V0X2tleV9yZXF1ZXN0X3RpbWVfdXMoKTsKKyAgICAgICAgICAgIG1ldHJpYy0+c2V0X21pbihzdGF0cy5taW4pOworICAgICAgICAgICAgbWV0cmljLT5zZXRfbWF4KHN0YXRzLm1heCk7CisgICAgICAgICAgICBtZXRyaWMtPnNldF9tZWFuKHN0YXRzLm1lYW4pOworICAgICAgICAgICAgbWV0cmljLT5zZXRfb3BlcmF0aW9uX2NvdW50KHN0YXRzLmNvdW50KTsKKyAgICAgICAgICAgIG1ldHJpYy0+c2V0X3ZhcmlhbmNlKHN0YXRzLnN1bV9zcXVhcmVkX2RldmlhdGlvbiAvIHN0YXRzLmNvdW50KTsKKyAgICAgICAgICAgIG1ldHJpYy0+bXV0YWJsZV9hdHRyaWJ1dGVzKCktPnNldF9lcnJvcl9jb2RlKHN0YXR1cyk7CisgICAgICAgIH0pOworCisgICAgbVByb3ZpZGVLZXlSZXNwb25zZVRpbWVVcy5FeHBvcnRWYWx1ZXMoCisgICAgICAgIFsmXShjb25zdCBzdGF0dXNfdCBzdGF0dXMsIGNvbnN0IEV2ZW50U3RhdGlzdGljcyAmc3RhdHMpIHsKKyAgICAgICAgICAgIERybUZyYW1ld29ya01ldHJpY3M6OkRpc3RyaWJ1dGlvbk1ldHJpYyAqbWV0cmljID0KKyAgICAgICAgICAgICAgICBtZXRyaWNzLmFkZF9wcm92aWRlX2tleV9yZXNwb25zZV90aW1lX3VzKCk7CisgICAgICAgICAgICBtZXRyaWMtPnNldF9taW4oc3RhdHMubWluKTsKKyAgICAgICAgICAgIG1ldHJpYy0+c2V0X21heChzdGF0cy5tYXgpOworICAgICAgICAgICAgbWV0cmljLT5zZXRfbWVhbihzdGF0cy5tZWFuKTsKKyAgICAgICAgICAgIG1ldHJpYy0+c2V0X29wZXJhdGlvbl9jb3VudChzdGF0cy5jb3VudCk7CisgICAgICAgICAgICBtZXRyaWMtPnNldF92YXJpYW5jZShzdGF0cy5zdW1fc3F1YXJlZF9kZXZpYXRpb24gLyBzdGF0cy5jb3VudCk7CisgICAgICAgICAgICBtZXRyaWMtPm11dGFibGVfYXR0cmlidXRlcygpLT5zZXRfZXJyb3JfY29kZShzdGF0dXMpOworICAgICAgICB9KTsKKworICAgIGZvciAoY29uc3QgYXV0byAmc2Vzc2lvbkxpZmVzcGFuIDogbVNlc3Npb25MaWZlc3BhbnMpIHsKKyAgICAgICAgYXV0byAqbWFwID0gbWV0cmljcy5tdXRhYmxlX3Nlc3Npb25fbGlmZXRpbWVzKCk7CisKKyAgICAgICAgKCptYXApW3Nlc3Npb25MaWZlc3Bhbi5maXJzdF0uc2V0X3N0YXJ0X3RpbWVfbXMoCisgICAgICAgICAgICBzZXNzaW9uTGlmZXNwYW4uc2Vjb25kLmZpcnN0KTsKKyAgICAgICAgKCptYXApW3Nlc3Npb25MaWZlc3Bhbi5maXJzdF0uc2V0X2VuZF90aW1lX21zKAorICAgICAgICAgICAgc2Vzc2lvbkxpZmVzcGFuLnNlY29uZC5zZWNvbmQpOworICAgIH0KKworICAgIGlmICghbWV0cmljcy5TZXJpYWxpemVUb1N0cmluZyhzZXJpYWxpemVkTWV0cmljcykpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXJpYWxpemUgbWV0cmljcy4iKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitpbnQ2NF90IE1lZGlhRHJtTWV0cmljczo6R2V0Q3VycmVudFRpbWVNcygpIHsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKyAgICByZXR1cm4gKChpbnQ2NF90KXR2LnR2X3NlYyAqIDEwMDApICsgKChpbnQ2NF90KXR2LnR2X3VzZWMgLyAxMDAwKTsKK30KKworc3RhdHVzX3QgTWVkaWFEcm1NZXRyaWNzOjpIaWRsTWV0cmljc1RvQnVuZGxlKAorICAgIGNvbnN0IGhpZGxfdmVjPERybU1ldHJpY0dyb3VwPiAmaGlkbE1ldHJpY0dyb3VwcywKKyAgICBQZXJzaXN0YWJsZUJ1bmRsZSAqYnVuZGxlTWV0cmljR3JvdXBzKSB7CisgICAgaWYgKGJ1bmRsZU1ldHJpY0dyb3VwcyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBVTkVYUEVDVEVEX05VTEw7CisgICAgfQorICAgIGlmIChoaWRsTWV0cmljR3JvdXBzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBpbnQgZ3JvdXBJbmRleCA9IDA7CisgICAgc3RkOjptYXA8U3RyaW5nMTYsIGludD4gaW5kZXhNYXA7CisgICAgZm9yIChjb25zdCBhdXRvICZoaWRsTWV0cmljR3JvdXAgOiBoaWRsTWV0cmljR3JvdXBzKSB7CisgICAgICAgIFBlcnNpc3RhYmxlQnVuZGxlIGJ1bmRsZU1ldHJpY0dyb3VwOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmhpZGxNZXRyaWMgOiBoaWRsTWV0cmljR3JvdXAubWV0cmljcykgeworICAgICAgICAgICAgU3RyaW5nMTYgbWV0cmljTmFtZShoaWRsTWV0cmljLm5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBQZXJzaXN0YWJsZUJ1bmRsZSBidW5kbGVNZXRyaWM7CisgICAgICAgICAgICAvLyBBZGQgbWV0cmljIGNvbXBvbmVudCB2YWx1ZXMuCisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnZhbHVlIDogaGlkbE1ldHJpYy52YWx1ZXMpIHsKKyAgICAgICAgICAgICAgICBTZXRWYWx1ZShTdHJpbmcxNih2YWx1ZS5jb21wb25lbnROYW1lLmNfc3RyKCkpLCB2YWx1ZS50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCAmYnVuZGxlTWV0cmljKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFNldCBtZXRyaWMgYXR0cmlidXRlcy4KKyAgICAgICAgICAgIFBlcnNpc3RhYmxlQnVuZGxlIGJ1bmRsZU1ldHJpY0F0dHJpYnV0ZXM7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmF0dHJpYnV0ZSA6IGhpZGxNZXRyaWMuYXR0cmlidXRlcykgeworICAgICAgICAgICAgICAgIFNldFZhbHVlKFN0cmluZzE2KGF0dHJpYnV0ZS5uYW1lLmNfc3RyKCkpLCBhdHRyaWJ1dGUudHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUsICZidW5kbGVNZXRyaWNBdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEFkZCBhdHRyaWJ1dGVzIHRvIHRoZSBidW5kbGUgbWV0cmljLgorICAgICAgICAgICAgYnVuZGxlTWV0cmljLnB1dFBlcnNpc3RhYmxlQnVuZGxlKFN0cmluZzE2KCJhdHRyaWJ1dGVzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlTWV0cmljQXR0cmlidXRlcyk7CisgICAgICAgICAgICAvLyBBZGQgb25lIGxheWVyIG9mIGluZGlyZWN0aW9uLCBhbGxvd2luZyBmb3IgcmVwZWF0ZWQgbWV0cmljIG5hbWVzLgorICAgICAgICAgICAgUGVyc2lzdGFibGVCdW5kbGUgcmVwZWF0ZWRNZXRyaWNzOworICAgICAgICAgICAgYnVuZGxlTWV0cmljR3JvdXAuZ2V0UGVyc2lzdGFibGVCdW5kbGUobWV0cmljTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBlYXRlZE1ldHJpY3MpOworICAgICAgICAgICAgaW50IGluZGV4ID0gaW5kZXhNYXBbbWV0cmljTmFtZV07CisgICAgICAgICAgICByZXBlYXRlZE1ldHJpY3MucHV0UGVyc2lzdGFibGVCdW5kbGUoTWFrZUluZGV4U3RyaW5nKGluZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGVNZXRyaWMpOworICAgICAgICAgICAgaW5kZXhNYXBbbWV0cmljTmFtZV0gPSArK2luZGV4OworCisgICAgICAgICAgICAvLyBBZGQgdGhlIGJ1bmRsZSBtZXRyaWMgdG8gdGhlIGdyb3VwIG9mIG1ldHJpY3MuCisgICAgICAgICAgICBidW5kbGVNZXRyaWNHcm91cC5wdXRQZXJzaXN0YWJsZUJ1bmRsZShtZXRyaWNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0ZWRNZXRyaWNzKTsKKyAgICAgICAgfQorICAgICAgICAvLyBBZGQgdGhlIGJ1bmRsZSBtZXRyaWMgZ3JvdXAgdG8gdGhlIGNvbGxlY3Rpb24gb2YgZ3JvdXBzLgorICAgICAgICBidW5kbGVNZXRyaWNHcm91cHMtPnB1dFBlcnNpc3RhYmxlQnVuZGxlKE1ha2VJbmRleFN0cmluZyhncm91cEluZGV4KyspLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZU1ldHJpY0dyb3VwKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9Ecm1QbHVnaW5QYXRoLmNwcCBiL2RybS9saWJtZWRpYWRybS9Ecm1QbHVnaW5QYXRoLmNwcAppbmRleCBjNzYwODI1Li5hYzg2MDdjIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vRHJtUGx1Z2luUGF0aC5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0RybVBsdWdpblBhdGguY3BwCkBAIC0xOSw3ICsxOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPG1lZGlhL0RybVBsdWdpblBhdGguaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9Ecm1QbHVnaW5QYXRoLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmNwcCBiL2RybS9saWJtZWRpYWRybS9Ecm1TZXNzaW9uTWFuYWdlci5jcHAKaW5kZXggMDIyNzBkMC4uMzc1NjQ0YyAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vRHJtU2Vzc2lvbk1hbmFnZXIuY3BwCkBAIC0yMSw5ICsyMSw5IEBACiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQcm9jZXNzSW5mb1NlcnZpY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRHJtU2Vzc2lvbk1hbmFnZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9Ecm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUHJvY2Vzc0luZm8uaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9Ecm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtU2Vzc2lvbk1hbmFnZXIuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9JQ3J5cHRvLmNwcCBiL2RybS9saWJtZWRpYWRybS9JQ3J5cHRvLmNwcAppbmRleCAxZDcwYTRlLi43M2VjZGExIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vSUNyeXB0by5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0lDcnlwdG8uY3BwCkBAIC0xOSwxMCArMTksMTAgQEAKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KICNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JQ3J5cHRvLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTM0MSwxMCArMzQxLDEwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSAqc3ViU2FtcGxlcyA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZVtudW1TdWJTYW1wbGVzXTsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDcnlwdG9QbHVnaW46OlN1YlNhbXBsZVtdPiBzdWJTYW1wbGVzID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDcnlwdG9QbHVnaW46OlN1YlNhbXBsZVtdPihudW1TdWJTYW1wbGVzKTsKIAotICAgICAgICAgICAgZGF0YS5yZWFkKHN1YlNhbXBsZXMsCisgICAgICAgICAgICBkYXRhLnJlYWQoc3ViU2FtcGxlcy5nZXQoKSwKICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlKSAqIG51bVN1YlNhbXBsZXMpOwogCiAgICAgICAgICAgICBEZXN0aW5hdGlvbkJ1ZmZlciBkZXN0aW5hdGlvbjsKQEAgLTQwMiw3ICs0MDIsNyBAQAogICAgICAgICAgICAgICAgIHJlc3VsdCA9IC1FSU5WQUw7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRlY3J5cHQoa2V5LCBpdiwgbW9kZSwgcGF0dGVybiwgc291cmNlLCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLCBudW1TdWJTYW1wbGVzLCBkZXN0aW5hdGlvbiwgJmVycm9yRGV0YWlsTXNnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YlNhbXBsZXMuZ2V0KCksIG51bVN1YlNhbXBsZXMsIGRlc3RpbmF0aW9uLCAmZXJyb3JEZXRhaWxNc2cpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwpAQCAtNDIxLDkgKzQyMSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBkZWxldGVbXSBzdWJTYW1wbGVzOwotICAgICAgICAgICAgc3ViU2FtcGxlcyA9IE5VTEw7Ci0KKyAgICAgICAgICAgIHN1YlNhbXBsZXMucmVzZXQoKTsKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vSURybS5jcHAgYi9kcm0vbGlibWVkaWFkcm0vSURybS5jcHAKaW5kZXggOGZmNmU2YS4uNTA5OTYxZiAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0lEcm0uY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9JRHJtLmNwcApAQCAtMTksMTAgKzE5LDEwIEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSURybS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JRHJtLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDYsNiArNDYsNyBAQAogICAgIEdFVF9QUk9QRVJUWV9CWVRFX0FSUkFZLAogICAgIFNFVF9QUk9QRVJUWV9TVFJJTkcsCiAgICAgU0VUX1BST1BFUlRZX0JZVEVfQVJSQVksCisgICAgR0VUX01FVFJJQ1MsCiAgICAgU0VUX0NJUEhFUl9BTEdPUklUSE0sCiAgICAgU0VUX01BQ19BTEdPUklUSE0sCiAgICAgRU5DUllQVCwKQEAgLTU1LDcgKzU2LDEyIEBACiAgICAgVkVSSUZZLAogICAgIFNFVF9MSVNURU5FUiwKICAgICBHRVRfU0VDVVJFX1NUT1AsCi0gICAgUkVMRUFTRV9BTExfU0VDVVJFX1NUT1BTCisgICAgUkVNT1ZFX0FMTF9TRUNVUkVfU1RPUFMsCisgICAgR0VUX0hEQ1BfTEVWRUxTLAorICAgIEdFVF9OVU1CRVJfT0ZfU0VTU0lPTlMsCisgICAgR0VUX1NFQ1VSSVRZX0xFVkVMLAorICAgIFJFTU9WRV9TRUNVUkVfU1RPUCwKKyAgICBHRVRfU0VDVVJFX1NUT1BfSURTCiB9OwogCiBzdHJ1Y3QgQnBEcm0gOiBwdWJsaWMgQnBJbnRlcmZhY2U8SURybT4gewpAQCAtMTE0LDkgKzEyMCwxMSBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuU2Vzc2lvbihWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZCkgeworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlblNlc3Npb24oRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZCkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc2VjdXJpdHlMZXZlbCk7CiAKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KE9QRU5fU0VTU0lPTiwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgewpAQCAtMjk3LDYgKzMwNSwyNSBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wSWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4gJnNlY3VyZVN0b3BJZHMpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1NFQ1VSRV9TVE9QX0lEUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIHNlY3VyZVN0b3BJZHMuY2xlYXIoKTsKKyAgICAgICAgdWludDMyX3QgY291bnQgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gc2VjdXJlU3RvcElkOworICAgICAgICAgICAgcmVhZFZlY3RvcihyZXBseSwgc2VjdXJlU3RvcElkKTsKKyAgICAgICAgICAgIHNlY3VyZVN0b3BJZHMucHVzaF9iYWNrKHNlY3VyZVN0b3BJZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzaWQsIFZlY3Rvcjx1aW50OF90PiAmc2VjdXJlU3RvcCkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwpAQCAtMzI0LDExICszNTEsMjQgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUFsbFNlY3VyZVN0b3BzKCkgeworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlU2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzaWQpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKIAotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRV9BTExfU0VDVVJFX1NUT1BTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICB3cml0ZVZlY3RvcihkYXRhLCBzc2lkKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFTU9WRV9TRUNVUkVfU1RPUCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUFsbFNlY3VyZVN0b3BzKCkgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChSRU1PVkVfQUxMX1NFQ1VSRV9TVE9QUywgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQpAQCAtMzUwLDYgKzM5MCw2NSBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRIZGNwTGV2ZWxzKERybVBsdWdpbjo6SGRjcExldmVsICpjb25uZWN0ZWQsCisgICAgICAgICAgICBEcm1QbHVnaW46OkhkY3BMZXZlbCAqbWF4KSBjb25zdCB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgICAgICBpZiAoY29ubmVjdGVkID09IE5VTEwgfHwgbWF4ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0hEQ1BfTEVWRUxTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisKKyAgICAgICAgKmNvbm5lY3RlZCA9IHN0YXRpY19jYXN0PERybVBsdWdpbjo6SGRjcExldmVsPihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgICptYXggPSBzdGF0aWNfY2FzdDxEcm1QbHVnaW46OkhkY3BMZXZlbD4ocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROdW1iZXJPZlNlc3Npb25zKHVpbnQzMl90ICpvcGVuLCB1aW50MzJfdCAqbWF4KSBjb25zdCB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgICAgICBpZiAob3BlbiA9PSBOVUxMIHx8IG1heCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9OVU1CRVJfT0ZfU0VTU0lPTlMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICAqb3BlbiA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAqbWF4ID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyaXR5TGV2ZWwoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCisgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgKmxldmVsKSBjb25zdCB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgICAgICBpZiAobGV2ZWwgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHdyaXRlVmVjdG9yKGRhdGEsIHNlc3Npb25JZCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfU0VDVVJJVFlfTEVWRUwsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICAqbGV2ZWwgPSBzdGF0aWNfY2FzdDxEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWw+KHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCAmbmFtZSwgVmVjdG9yPHVpbnQ4X3Q+ICZ2YWx1ZSkgY29uc3QgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwpAQCAtMzkzLDYgKzQ5MiwzNSBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRyaWNzKG9zOjpQZXJzaXN0YWJsZUJ1bmRsZSAqbWV0cmljcykgeworICAgICAgICBpZiAobWV0cmljcyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9NRVRSSUNTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIC8vIFRoZSByZXBseSBkYXRhIGlzIG9yZGVyZWQgYXMKKyAgICAgICAgLy8gMSkgMzIgYml0IGludGVnZXIgcmVwbHkgZm9sbG93ZWQgYnkKKyAgICAgICAgLy8gMikgU2VyaWFsaXplZCBQZXJzaXN0YWJsZUJ1bmRsZSBjb250YWluaW5nIG1ldHJpY3MuCisgICAgICAgIHN0YXR1c190IHJlcGx5X3N0YXR1czsKKyAgICAgICAgaWYgKHJlcGx5LnJlYWRJbnQzMigmcmVwbHlfc3RhdHVzKSAhPSBPSworICAgICAgICAgICB8fCByZXBseV9zdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlYWQgZ2V0TWV0cmljcyByZXNwb25zZSBjb2RlIGZyb20gcGFyY2VsLiAlZCIsCisgICAgICAgICAgICAgICAgcmVwbHlfc3RhdHVzKTsKKyAgICAgICAgICByZXR1cm4gcmVwbHlfc3RhdHVzOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gbWV0cmljcy0+cmVhZEZyb21QYXJjZWwoJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWFkIG1ldHJpY3MgZnJvbSBwYXJjZWwuICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcGx5X3N0YXR1czsKKyAgICB9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldENpcGhlckFsZ29yaXRobShWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0ICZhbGdvcml0aG0pIHsKQEAgLTYxNSw4ICs3NDMsMTAgQEAKICAgICAgICAgY2FzZSBPUEVOX1NFU1NJT046CiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWw+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZDsKLSAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IG9wZW5TZXNzaW9uKHNlc3Npb25JZCk7CisgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBvcGVuU2Vzc2lvbihsZXZlbCwgc2Vzc2lvbklkKTsKICAgICAgICAgICAgIHdyaXRlVmVjdG9yKHJlcGx5LCBzZXNzaW9uSWQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKICAgICAgICAgICAgIHJldHVybiBPSzsKQEAgLTc2MSw2ICs4OTEsMjQgQEAKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgR0VUX1NFQ1VSRV9TVE9QX0lEUzoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm0sIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4gc2VjdXJlU3RvcElkczsKKyAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IGdldFNlY3VyZVN0b3BJZHMoc2VjdXJlU3RvcElkcyk7CisgICAgICAgICAgICBzaXplX3QgY291bnQgPSBzZWN1cmVTdG9wSWRzLnNpemUoKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGNvdW50KTsKKyAgICAgICAgICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID46Oml0ZXJhdG9yIGl0ZXIgPSBzZWN1cmVTdG9wSWRzLmJlZ2luKCk7CisgICAgICAgICAgICB3aGlsZShpdGVyICE9IHNlY3VyZVN0b3BJZHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IGl0ZXItPnNpemUoKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzaXplKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoaXRlci0+YXJyYXkoKSwgaXRlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBpdGVyKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBHRVRfU0VDVVJFX1NUT1A6CiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtLCBkYXRhLCByZXBseSk7CkBAIC03ODEsMTAgKzkyOSw1NCBAQAogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBSRUxFQVNFX0FMTF9TRUNVUkVfU1RPUFM6CisgICAgICAgIGNhc2UgUkVNT1ZFX1NFQ1VSRV9TVE9QOgogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVsZWFzZUFsbFNlY3VyZVN0b3BzKCkpOworICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IHNzaWQ7CisgICAgICAgICAgICByZWFkVmVjdG9yKGRhdGEsIHNzaWQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVtb3ZlU2VjdXJlU3RvcChzc2lkKSk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFJFTU9WRV9BTExfU0VDVVJFX1NUT1BTOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVtb3ZlQWxsU2VjdXJlU3RvcHMoKSk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEdFVF9IRENQX0xFVkVMUzoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm0sIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIERybVBsdWdpbjo6SGRjcExldmVsIGNvbm5lY3RlZCA9IERybVBsdWdpbjo6a0hkY3BMZXZlbFVua25vd247CisgICAgICAgICAgICBEcm1QbHVnaW46OkhkY3BMZXZlbCBtYXggPSBEcm1QbHVnaW46OmtIZGNwTGV2ZWxVbmtub3duOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0SGRjcExldmVscygmY29ubmVjdGVkLCAmbWF4KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGNvbm5lY3RlZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihtYXgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgR0VUX05VTUJFUl9PRl9TRVNTSU9OUzoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm0sIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHVpbnQzMl90IG9wZW4gPSAwLCBtYXggPSAwOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0TnVtYmVyT2ZTZXNzaW9ucygmb3BlbiwgJm1heCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihvcGVuKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG1heCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBHRVRfU0VDVVJJVFlfTEVWRUw6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkOworICAgICAgICAgICAgcmVhZFZlY3RvcihkYXRhLCBzZXNzaW9uSWQpOworICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsID0gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFVua25vd247CisgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBnZXRTZWN1cml0eUxldmVsKHNlc3Npb25JZCwgJmxldmVsKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGxldmVsKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7CiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KIApAQCAtODI5LDYgKzEwMjEsMjQgQEAKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgR0VUX01FVFJJQ1M6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgICAgIG9zOjpQZXJzaXN0YWJsZUJ1bmRsZSBtZXRyaWNzOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0TWV0cmljcygmbWV0cmljcyk7CisgICAgICAgICAgICAvLyBUaGUgcmVwbHkgZGF0YSBpcyBvcmRlcmVkIGFzCisgICAgICAgICAgICAvLyAxKSAzMiBiaXQgaW50ZWdlciByZXBseSBmb2xsb3dlZCBieQorICAgICAgICAgICAgLy8gMikgU2VyaWFsaXplZCBQZXJzaXN0YWJsZUJ1bmRsZSBjb250YWluaW5nIG1ldHJpY3MuCisgICAgICAgICAgICAvLyBPbmx5IHdyaXRlIHRoZSBtZXRyaWNzIGlmIHRoZSBnZXRNZXRyaWNzIHJlc3VsdCB3YXMKKyAgICAgICAgICAgIC8vIE9LIGFuZCB3ZSBzdWNjZXNzZnVsbHkgYWRkZWQgdGhlIHN0YXR1cyB0byByZXBseS4KKyAgICAgICAgICAgIHN0YXR1c190IHBhcmNlbF9yZXN1bHQgPSByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBPSyAmJiBwYXJjZWxfcmVzdWx0ID09IE9LKSB7CisgICAgICAgICAgICAgICAgcGFyY2VsX3Jlc3VsdCA9IG1ldHJpY3Mud3JpdGVUb1BhcmNlbChyZXBseSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcGFyY2VsX3Jlc3VsdDsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgU0VUX0NJUEhFUl9BTEdPUklUSE06CiAgICAgICAgIHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtLCBkYXRhLCByZXBseSk7CmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vSURybUNsaWVudC5jcHAgYi9kcm0vbGlibWVkaWFkcm0vSURybUNsaWVudC5jcHAKaW5kZXggNDQ0MjAxZi4uMzU3ZGU5ZCAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0lEcm1DbGllbnQuY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9JRHJtQ2xpZW50LmNwcApAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllckNsaWVudC5oPgotI2luY2x1ZGUgPG1lZGlhL0lEcm1DbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JRHJtQ2xpZW50Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0lNZWRpYURybVNlcnZpY2UuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0lNZWRpYURybVNlcnZpY2UuY3BwCmluZGV4IDg0ODEyZGMuLmYzMjBkMGIgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9JTWVkaWFEcm1TZXJ2aWNlLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vSU1lZGlhRHJtU2VydmljZS5jcHAKQEAgLTIwLDkgKzIwLDkgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KLSNpbmNsdWRlIDxtZWRpYS9JRHJtLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhRHJtU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JRHJtLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vSU1lZGlhRHJtU2VydmljZS5oPgogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+ICAvLyBmb3Igc3RhdHVzX3QKICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vUGx1Z2luTWV0cmljc1JlcG9ydGluZy5jcHAgYi9kcm0vbGlibWVkaWFkcm0vUGx1Z2luTWV0cmljc1JlcG9ydGluZy5jcHAKaW5kZXggNTdmZjViOC4uNWNiNDhiZiAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9QbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmNwcApAQCAtMTYsODMgKzE2LDM1IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiUGx1Z2luTWV0cmljc1JlcG9ydGluZyIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPG1lZGlhL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuaD4KIAotI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKLSNpbmNsdWRlICJwcm90b3MvcGx1Z2luX21ldHJpY3MucGIuaCIKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIG5hbWVzcGFjZSB7CiAKLXVzaW5nIGFuZHJvaWQ6OmRybV9tZXRyaWNzOjpNZXRyaWNzR3JvdXA7Ci11c2luZyBhbmRyb2lkOjpkcm1fbWV0cmljczo6TWV0cmljc0dyb3VwX01ldHJpYzsKLXVzaW5nIGFuZHJvaWQ6OmRybV9tZXRyaWNzOjpNZXRyaWNzR3JvdXBfTWV0cmljX01ldHJpY1ZhbHVlOworY29uc3RleHByIGNoYXIga1NlcmlhbGl6ZWRNZXRyaWNzRmllbGRbXSA9ICJzZXJpYWxpemVkX21ldHJpY3MiOwogCi1jb25zdCBjaGFyKiBjb25zdCBrUGFyZW50QXR0cmlidXRlID0gIi9wYXJlbnQvZXh0ZXJuYWwiOwotCi1zdGF0dXNfdCByZXBvcnRNZXRyaWNzR3JvdXAoY29uc3QgTWV0cmljc0dyb3VwJiBtZXRyaWNzR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYmF0Y2hOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QqIHBhcmVudElkKSB7Ci0gICAgTWVkaWFBbmFseXRpY3NJdGVtIGFuYWx5dGljc0l0ZW0oYmF0Y2hOYW1lLmNfc3RyKCkpOworc3RhdHVzX3QgcmVwb3J0VmVuZG9yTWV0cmljcyhjb25zdCBzdGQ6OnN0cmluZyYgbWV0cmljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYXBwUGFja2FnZU5hbWUpIHsKKyAgICBNZWRpYUFuYWx5dGljc0l0ZW0gYW5hbHl0aWNzSXRlbShuYW1lLmNfc3RyKCkpOwogICAgIGFuYWx5dGljc0l0ZW0uZ2VuZXJhdGVTZXNzaW9uSUQoKTsKLSAgICBpbnQ2NF90IHNlc3Npb25JZCA9IGFuYWx5dGljc0l0ZW0uZ2V0U2Vzc2lvbklEKCk7Ci0gICAgaWYgKHBhcmVudElkICE9IE5VTEwpIHsKLSAgICAgICAgYW5hbHl0aWNzSXRlbS5zZXRJbnQ2NChrUGFyZW50QXR0cmlidXRlLCAqcGFyZW50SWQpOworCisgICAgc3RkOjpzdHJpbmcgYXBwX3BhY2thZ2VfbmFtZShhcHBQYWNrYWdlTmFtZS5jX3N0cigpLCBhcHBQYWNrYWdlTmFtZS5zaXplKCkpOworICAgIGFuYWx5dGljc0l0ZW0uc2V0UGtnTmFtZShhcHBfcGFja2FnZV9uYW1lKTsKKyAgICBpZiAobWV0cmljcy5zaXplKCkgPiAwKSB7CisgICAgICAgIGFuYWx5dGljc0l0ZW0uc2V0Q1N0cmluZyhrU2VyaWFsaXplZE1ldHJpY3NGaWVsZCwgbWV0cmljcy5jX3N0cigpKTsKICAgICB9CiAKLSAgICAvLyBSZXBvcnQgdGhlIHBhY2thZ2UgbmFtZS4KLSAgICBpZiAobWV0cmljc0dyb3VwLmhhc19hcHBfcGFja2FnZV9uYW1lKCkpIHsKLSAgICAgIEFTdHJpbmcgYXBwX3BhY2thZ2VfbmFtZShtZXRyaWNzR3JvdXAuYXBwX3BhY2thZ2VfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljc0dyb3VwLmFwcF9wYWNrYWdlX25hbWUoKS5zaXplKCkpOwotICAgICAgYW5hbHl0aWNzSXRlbS5zZXRQa2dOYW1lKGFwcF9wYWNrYWdlX25hbWUpOwotICAgIH0KLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0cmljc0dyb3VwLm1ldHJpY19zaXplKCk7ICsraSkgewotICAgICAgICBjb25zdCBNZXRyaWNzR3JvdXBfTWV0cmljJiBtZXRyaWMgPSBtZXRyaWNzR3JvdXAubWV0cmljKGkpOwotICAgICAgICBpZiAoIW1ldHJpYy5oYXNfbmFtZSgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiTWV0cmljIHdpdGggbm8gbmFtZS4iKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW1ldHJpYy5oYXNfdmFsdWUoKSkgewotICAgICAgICAgICAgQUxPR0UoIk1ldHJpYyB3aXRoIG5vIHZhbHVlLiIpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IE1ldHJpY3NHcm91cF9NZXRyaWNfTWV0cmljVmFsdWUmIHZhbHVlID0gbWV0cmljLnZhbHVlKCk7Ci0gICAgICAgIGlmICh2YWx1ZS5oYXNfaW50X3ZhbHVlKCkpIHsKLSAgICAgICAgICAgIGFuYWx5dGljc0l0ZW0uc2V0SW50NjQobWV0cmljLm5hbWUoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5pbnRfdmFsdWUoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaGFzX2RvdWJsZV92YWx1ZSgpKSB7Ci0gICAgICAgICAgICBhbmFseXRpY3NJdGVtLnNldERvdWJsZShtZXRyaWMubmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5kb3VibGVfdmFsdWUoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaGFzX3N0cmluZ192YWx1ZSgpKSB7Ci0gICAgICAgICAgICBhbmFseXRpY3NJdGVtLnNldENTdHJpbmcobWV0cmljLm5hbWUoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnN0cmluZ192YWx1ZSgpLmNfc3RyKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIk1ldHJpYyBWYWx1ZSB3aXRoIG5vIGFjdHVhbCB2YWx1ZS4iKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBhbmFseXRpY3NJdGVtLnNldEZpbmFsaXplZCh0cnVlKTsKICAgICBpZiAoIWFuYWx5dGljc0l0ZW0uc2VsZnJlY29yZCgpKSB7Ci0gICAgICAvLyBOb3RlIHRoZSBjYXN0IHRvIGludCBpcyBiZWNhdXNlIHdlIGJ1aWxkIG9uIDMyIGFuZCA2NCBiaXQuCi0gICAgICAvLyBUaGUgY2FzdCBwcmV2ZW50cyBhIHBlY3VsaWFyIHByaW50ZiBwcm9ibGVtIHdoZXJlIG9uZSBmb3JtYXQgY2Fubm90Ci0gICAgICAvLyBzYXRpc2Z5IGJvdGguCi0gICAgICBBTE9HRSgic2VsZnJlY29yZCgpIHJldHVybmVkIGZhbHNlLiBzZXNzaW9JZCAlZCIsIChpbnQpIHNlc3Npb25JZCk7Ci0gICAgfQotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRyaWNzR3JvdXAubWV0cmljX3N1Yl9ncm91cF9zaXplKCk7ICsraSkgewotICAgICAgICBjb25zdCBNZXRyaWNzR3JvdXAmIHN1Ykdyb3VwID0gbWV0cmljc0dyb3VwLm1ldHJpY19zdWJfZ3JvdXAoaSk7Ci0gICAgICAgIHN0YXR1c190IHJlcyA9IHJlcG9ydE1ldHJpY3NHcm91cChzdWJHcm91cCwgYmF0Y2hOYW1lLCAmc2Vzc2lvbklkKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQorICAgICAgQUxPR0UoInNlbGZyZWNvcmQoKSByZXR1cm5lZCBmYWxzZS4gc2Vzc2lvSWQgJSIgUFJJZDY0LCBhbmFseXRpY3NJdGVtLmdldFNlc3Npb25JRCgpKTsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CkBAIC0xMTQsMjEgKzY2LDE2IEBACiAKIH0gIC8vIG5hbWVzcGFjZQogCi1zdGF0dXNfdCByZXBvcnREcm1QbHVnaW5NZXRyaWNzKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2VyaWFsaXplZE1ldHJpY3MsCitzdGF0dXNfdCByZXBvcnREcm1QbHVnaW5NZXRyaWNzKGNvbnN0IHN0ZDo6c3RyaW5nJiBiNjRFbmNvZGVkTWV0cmljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgdmVuZG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBkZXNjcmlwdGlvbikgewotICAgIE1ldHJpY3NHcm91cCByb290X21ldHJpY3NfZ3JvdXA7Ci0gICAgaWYgKCFyb290X21ldHJpY3NfZ3JvdXAuUGFyc2VGcm9tQXJyYXkoc2VyaWFsaXplZE1ldHJpY3MuYXJyYXkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkTWV0cmljcy5zaXplKCkpKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsdXJlIHRvIHBhcnNlLiIpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFwcFBhY2thZ2VOYW1lKSB7CiAKICAgICBTdHJpbmc4IG5hbWUgPSBTdHJpbmc4Ojpmb3JtYXQoImRybS52ZW5kb3IuJXMuJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW5pdGl6ZSh2ZW5kb3IpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbml0aXplKGRlc2NyaXB0aW9uKS5jX3N0cigpKTsKIAotICAgIHJldHVybiByZXBvcnRNZXRyaWNzR3JvdXAocm9vdF9tZXRyaWNzX2dyb3VwLCBuYW1lLCBOVUxMKTsKKyAgICByZXR1cm4gcmVwb3J0VmVuZG9yTWV0cmljcyhiNjRFbmNvZGVkTWV0cmljcywgbmFtZSwgYXBwUGFja2FnZU5hbWUpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL1NoYXJlZExpYnJhcnkuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL1NoYXJlZExpYnJhcnkuY3BwCmluZGV4IGJlYmFmYTguLmIyZDYzNWQgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9TaGFyZWRMaWJyYXJ5LmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vU2hhcmVkTGlicmFyeS5jcHAKQEAgLTE5LDcgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGRsZmNuLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9TaGFyZWRMaWJyYXJ5Lmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vU2hhcmVkTGlicmFyeS5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vcHJvdG9zL21ldHJpY3MucHJvdG8gYi9kcm0vbGlibWVkaWFkcm0vcHJvdG9zL21ldHJpY3MucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE2MGU2ZgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJtZWRpYWRybS9wcm90b3MvbWV0cmljcy5wcm90bwpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3N5bnRheCA9ICJwcm90bzIiOworCitwYWNrYWdlIGFuZHJvaWQuZHJtX21ldHJpY3M7CisKKworLy8gVGhpcyBtZXNzYWdlIGNvbnRhaW5zIHRoZSBzcGVjaWZpYyBtZXRyaWNzIGNhcHR1cmVkIGJ5IERybU1ldHJpY3MuIEl0IGlzCisvLyB1c2VkIGZvciBzZXJpYWxpemluZyBhbmQgbG9nZ2luZyBtZXRyaWNzLgorLy8gbmV4dCBpZDogMTEuCittZXNzYWdlIERybUZyYW1ld29ya01ldHJpY3MgeworICAvLyBUT0RPOiBDb25zaWRlciB1c2luZyBleHRlbnNpb25zLgorCisgIC8vIEF0dHJpYnV0ZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCBhIHJlY29yZGVkIHZhbHVlLiBFLmcuIEEgY291bnRlciBtYXkKKyAgLy8gcmVwcmVzZW50IGEgY291bnQgb2YgYW4gb3BlcmF0aW9uIHJldHVybmluZyBhIHNwZWNpZmljIGVycm9yIGNvZGUuIFRoZQorICAvLyBlcnJvciBjb2RlIHdpbGwgYmUgYW4gYXR0cmlidXRlLgorICBtZXNzYWdlIEF0dHJpYnV0ZXMgeworICAgIC8vIFJlc2VydmVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbG9nZ2luZyBwcm90by4KKyAgICByZXNlcnZlZCAyIHRvIDEzOworCisgICAgLy8gQSBnZW5lcmFsIHB1cnBvc2UgZXJyb3IgY29kZSB3aGVyZSAwIG1lYW5zIE9LLgorICAgIG9wdGlvbmFsIGludDMyIGVycm9yX2NvZGUgPSAxOworCisgICAgLy8gRGVmaW5lZCBhdCA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OktleVN0YXR1c1R5cGU7CisgICAgb3B0aW9uYWwgdWludDMyIGtleV9zdGF0dXNfdHlwZSA9IDE0OworCisgICAgLy8gRGVmaW5lZCBhdCA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OkV2ZW50VHlwZTsKKyAgICBvcHRpb25hbCB1aW50MzIgZXZlbnRfdHlwZSA9IDE1OworICB9CisKKyAgLy8gVGhlIENvdW50ZXIgbWVzc2FnZSBpcyB1c2VkIHRvIHN0b3JlIGEgY291bnQgdmFsdWUgd2l0aCBhbiBhc3NvY2lhdGVkCisgIC8vIEF0dHJpYnV0ZS4KKyAgbWVzc2FnZSBDb3VudGVyIHsKKyAgICBvcHRpb25hbCB1aW50NjQgY291bnQgPSAxOworICAgIC8vIFJlcHJlc2VudHMgdGhlIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY291bnRlciBpbnN0YW5jZS4KKyAgICBvcHRpb25hbCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSAyOworICB9CisKKyAgLy8gVGhlIERpc3RyaWJ1dGlvbk1ldHJpYyBpcyBtZWFudCB0byBjYXB0dXJlIHRoZSBtb21lbnRzIG9mIGEgbm9ybWFsbHkKKyAgLy8gZGlzdHJpYnV0ZWQgKG9yIGFwcHJveGltYXRlbHkgbm9ybWFsKSB2YWx1ZS4KKyAgbWVzc2FnZSBEaXN0cmlidXRpb25NZXRyaWMgeworICAgIG9wdGlvbmFsIGZsb2F0IG1pbiA9IDE7CisgICAgb3B0aW9uYWwgZmxvYXQgbWF4ID0gMjsKKyAgICBvcHRpb25hbCBmbG9hdCBtZWFuID0gMzsKKyAgICBvcHRpb25hbCBkb3VibGUgdmFyaWFuY2UgPSA0OworICAgIG9wdGlvbmFsIHVpbnQ2NCBvcGVyYXRpb25fY291bnQgPSA1OworCisgICAgLy8gUmVwcmVzZW50cyB0aGUgYXR0cmlidXRlcyBhc3NvY2F0ZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBtZXRyaWMKKyAgICAvLyBpbnN0YW5jZS4KKyAgICBvcHRpb25hbCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSA2OworICB9CisKKyAgbWVzc2FnZSBTZXNzaW9uTGlmZXRpbWUgeworICAgIC8vIFN0YXJ0IHRpbWUgb2YgdGhlIHNlc3Npb24gaW4gbWlsbGlzZWNvbmRzIHNpbmNlIGVwb2NoLgorICAgIG9wdGlvbmFsIHVpbnQ2NCBzdGFydF90aW1lX21zID0gMTsKKyAgICAvLyBFbmQgdGltZSBvZiB0aGUgc2Vzc2lvbiBpbiBtaWxsaXNlY29uZHMgc2luY2UgZXBvY2guCisgICAgb3B0aW9uYWwgdWludDY0IGVuZF90aW1lX21zID0gMjsKKyAgfQorCisgIC8vIFRoZSBjb3VudCBvZiBvcGVuIHNlc3Npb24gb3BlcmF0aW9ucy4gRWFjaCBpbnN0YW5jZSBoYXMgYSBzcGVjaWZpYyBlcnJvcgorICAvLyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAgcmVwZWF0ZWQgQ291bnRlciBvcGVuX3Nlc3Npb25fY291bnRlciA9IDE7CisKKyAgLy8gVGhlIGNvdW50IG9mIGNsb3NlIHNlc3Npb24gb3BlcmF0aW9ucy4gRWFjaCBpbnN0YW5jZSBoYXMgYSBzcGVjaWZpYyBlcnJvcgorICAvLyBjb2RlIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAgcmVwZWF0ZWQgQ291bnRlciBjbG9zZV9zZXNzaW9uX2NvdW50ZXIgPSAyOworCisgIC8vIENvdW50IGFuZCBleGVjdXRpb24gdGltZSBvZiBnZXRLZXlSZXF1ZXN0IGNhbGxzLgorICByZXBlYXRlZCBEaXN0cmlidXRpb25NZXRyaWMgZ2V0X2tleV9yZXF1ZXN0X3RpbWVfdXMgPSAzOworCisgIC8vIENvdW50IGFuZCBleGVjdXRpb24gdGltZSBvZiBwcm92aWRlS2V5UmVzcG9uc2UgY2FsbHMuCisgIHJlcGVhdGVkIERpc3RyaWJ1dGlvbk1ldHJpYyBwcm92aWRlX2tleV9yZXNwb25zZV90aW1lX3VzID0gNDsKKworICAvLyBDb3VudCBvZiBnZXRQcm92aXNpb25SZXF1ZXN0IGNhbGxzLgorICByZXBlYXRlZCBDb3VudGVyIGdldF9wcm92aXNpb25pbmdfcmVxdWVzdF9jb3VudGVyID0gNTsKKworICAvLyBDb3VudCBvZiBwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UgY2FsbHMuCisgIHJlcGVhdGVkIENvdW50ZXIgcHJvdmlkZV9wcm92aXNpb25pbmdfcmVzcG9uc2VfY291bnRlciA9IDY7CisKKyAgLy8gQ291bnQgb2Yga2V5IHN0YXR1cyBldmVudHMgYnJva2VuIG91dCBieSBzdGF0dXMgdHlwZS4KKyAgcmVwZWF0ZWQgQ291bnRlciBrZXlfc3RhdHVzX2NoYW5nZV9jb3VudGVyID0gNzsKKworICAvLyBDb3VudCBvZiBldmVudHMgYnJva2VuIG91dCBieSBldmVudCB0eXBlCisgIHJlcGVhdGVkIENvdW50ZXIgZXZlbnRfY2FsbGJhY2tfY291bnRlciA9IDg7CisKKyAgLy8gQ291bnQgZ2V0UHJvcGVydHlCeXRlQXJyYXkgY2FsbHMgdG8gcmV0cmlldmUgdGhlIGRldmljZSB1bmlxdWUgaWQuCisgIHJlcGVhdGVkIENvdW50ZXIgZ2V0X2RldmljZV91bmlxdWVfaWRfY291bnRlciA9IDk7CisKKyAgLy8gU2Vzc2lvbiBpZHMgdG8gbGlmZXRpbWUgKHN0YXJ0IGFuZCBlbmQgdGltZSkgbWFwLgorICAvLyBTZXNzaW9uIGlkcyBhcmUgc3RyaW5ncyBvZiBoZXgtZW5jb2RlZCBieXRlIGFycmF5cy4KKyAgbWFwPHN0cmluZywgU2Vzc2lvbkxpZmV0aW1lPiBzZXNzaW9uX2xpZmV0aW1lcyA9IDEwOworfQorCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vcHJvdG9zL3BsdWdpbl9tZXRyaWNzLnByb3RvIGIvZHJtL2xpYm1lZGlhZHJtL3Byb3Rvcy9wbHVnaW5fbWV0cmljcy5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UzYmNmNS4uMDAwMDAwMAotLS0gYS9kcm0vbGlibWVkaWFkcm0vcHJvdG9zL3BsdWdpbl9tZXRyaWNzLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXN5bnRheCA9ICJwcm90bzIiOwotCi1wYWNrYWdlIGFuZHJvaWQuZHJtX21ldHJpY3M7Ci0KLS8vIG5lZWQgdGhpcyBpZiB3ZSBhcmUgdXNpbmcgbGlicHJvdG9idWYtY3BwLTIuMy4wLWxpdGUKLW9wdGlvbiBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUU7Ci0KLS8vIFRoZSBNZXRyaWNzR3JvdXAgaXMgYSBjb2xsZWN0aW9uIG9mIG1ldHJpYyBuYW1lL3ZhbHVlIHBhaXIgaW5zdGFuY2VzCi0vLyB0aGF0IGNhbiBiZSBzZXJpYWxpemVkIGFuZCBwcm92aWRlZCB0byBhIGNhbGxlci4KLW1lc3NhZ2UgTWV0cmljc0dyb3VwIHsKLSAgbWVzc2FnZSBNZXRyaWMgewotICAgIG1lc3NhZ2UgTWV0cmljVmFsdWUgewotICAgICAgLy8gRXhhY3RseSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgbXVzdCBiZSBzZXQuCi0gICAgICBvcHRpb25hbCBpbnQ2NCBpbnRfdmFsdWUgPSAxOwotICAgICAgb3B0aW9uYWwgZG91YmxlIGRvdWJsZV92YWx1ZSA9IDI7Ci0gICAgICBvcHRpb25hbCBzdHJpbmcgc3RyaW5nX3ZhbHVlID0gMzsKLSAgICB9Ci0KLSAgICAvLyBUaGUgbmFtZSBvZiB0aGUgbWV0cmljLiBNdXN0IGJlIHZhbGlkIFVURi04LiBSZXF1aXJlZC4KLSAgICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Ci0KLSAgICAvLyBUaGUgdmFsdWUgb2YgdGhlIG1ldHJpYy4gUmVxdWlyZWQuCi0gICAgb3B0aW9uYWwgTWV0cmljVmFsdWUgdmFsdWUgPSAyOwotICB9Ci0KLSAgLy8gVGhlIGxpc3Qgb2YgbmFtZS92YWx1ZSBwYWlycyBvZiBtZXRyaWNzLgotICByZXBlYXRlZCBNZXRyaWMgbWV0cmljID0gMTsKLQotICAvLyBBbGxvdyBtdWx0aXBsZSBzdWIgZ3JvdXBzIG9mIG1ldHJpY3MuCi0gIHJlcGVhdGVkIE1ldHJpY3NHcm91cCBtZXRyaWNfc3ViX2dyb3VwID0gMjsKLQotICAvLyBOYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWV0cmljcy4KLSAgb3B0aW9uYWwgc3RyaW5nIGFwcF9wYWNrYWdlX25hbWUgPSAzOwotfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0FuZHJvaWQuYnAgYi9kcm0vbGlibWVkaWFkcm0vdGVzdHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmM5MDZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1MyBAQAorLy8gQnVpbGQgZGVmaW5pdGlvbnMgZm9yIHVuaXQgdGVzdHMuCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJDb3VudGVyTWV0cmljX3Rlc3QiLAorICAgIHNyY3M6IFsiQ291bnRlck1ldHJpY190ZXN0LmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYm1lZGlhZHJtIl0sCisgICAgaW5jbHVkZV9kaXJzOiBbImZyYW1ld29ya3MvYXYvaW5jbHVkZS9tZWRpYSJdLAorICAgIGNmbGFnczogWworICAgICAgIi1XZXJyb3IiLAorICAgICAgIi1XYWxsIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiRHJtTWV0cmljc190ZXN0IiwKKyAgICBzcmNzOiBbIkRybU1ldHJpY3NfdGVzdC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMCIsCisgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIiwKKyAgICAgICJsaWJiaW5kZXIiLAorICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICJsaWJsb2ciLAorICAgICAgImxpYm1lZGlhZHJtbWV0cmljc19mdWxsIiwKKyAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAorICAgICAgImxpYnByb3RvYnVmLWNwcC1mdWxsIiwKKyAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWyJsaWJnbW9jayJdLAorICAgIGluY2x1ZGVfZGlyczogWworICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZS9tZWRpYSIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgLy8gU3VwcHJlc3MgdW51c2VkIHBhcmFtZXRlciBhbmQgbm8gZXJyb3Igb3B0aW9ucy4gVGhlc2UgY2F1c2UgcHJvYmxlbXMKKyAgICAgICAgLy8gd2hlbiB1c2luZyB0aGUgbWFwIHR5cGUgaW4gYSBwcm90byBkZWZpbml0aW9uLgorICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKKyAgICAgICAgIi1Xbm8tZXJyb3IiLAorICAgIF0KK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIkV2ZW50TWV0cmljX3Rlc3QiLAorICAgIHNyY3M6IFsiRXZlbnRNZXRyaWNfdGVzdC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgImxpYmxvZyIsCisgICAgICAibGlibWVkaWFkcm0iLAorICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorICAgIGluY2x1ZGVfZGlyczogWyJmcmFtZXdvcmtzL2F2L2luY2x1ZGUvbWVkaWEiXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICItV2Vycm9yIiwKKyAgICAgICItV2FsbCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS90ZXN0cy9Db3VudGVyTWV0cmljX3Rlc3QuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0NvdW50ZXJNZXRyaWNfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjYTBkYQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJtZWRpYWRybS90ZXN0cy9Db3VudGVyTWV0cmljX3Rlc3QuY3BwCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSAiQ291bnRlck1ldHJpYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogVW5pdCB0ZXN0cyBmb3IgdGhlIENvdW50ZXJNZXRyaWMgY2xhc3MuCisgKi8KK2NsYXNzIENvdW50ZXJNZXRyaWNUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Cit9OworCitURVNUX0YoQ291bnRlck1ldHJpY1Rlc3QsIEludERhdGFUeXBlRW1wdHkpIHsKKyAgQ291bnRlck1ldHJpYzxpbnQ+IG1ldHJpYygiTXlNZXRyaWNOYW1lIiwgIk1ldHJpY0F0dHJpYnV0ZU5hbWUiKTsKKworICBzdGQ6Om1hcDxpbnQsIGludDY0X3Q+IHZhbHVlczsKKworICBtZXRyaWMuRXhwb3J0VmFsdWVzKAorICAgICAgWyZdIChpbnQgYXR0cmlidXRlX3ZhbHVlLCBpbnQ2NF90IHZhbHVlKSB7CisgICAgICAgICAgdmFsdWVzW2F0dHJpYnV0ZV92YWx1ZV0gPSB2YWx1ZTsKKyAgICAgIH0pOworCisgIEVYUEVDVF9UUlVFKHZhbHVlcy5lbXB0eSgpKTsKK30KKworVEVTVF9GKENvdW50ZXJNZXRyaWNUZXN0LCBJbnREYXRhVHlwZSkgeworICBDb3VudGVyTWV0cmljPGludD4gbWV0cmljKCJNeU1ldHJpY05hbWUiLCAiTWV0cmljQXR0cmlidXRlTmFtZSIpOworCisgIHN0ZDo6bWFwPGludCwgaW50NjRfdD4gdmFsdWVzOworCisgIG1ldHJpYy5JbmNyZW1lbnQoNyk7CisgIG1ldHJpYy5JbmNyZW1lbnQoOCk7CisgIG1ldHJpYy5JbmNyZW1lbnQoOCk7CisKKyAgbWV0cmljLkV4cG9ydFZhbHVlcygKKyAgICAgIFsmXSAoaW50IGF0dHJpYnV0ZV92YWx1ZSwgaW50NjRfdCB2YWx1ZSkgeworICAgICAgICAgIHZhbHVlc1thdHRyaWJ1dGVfdmFsdWVdID0gdmFsdWU7CisgICAgICB9KTsKKworICBBU1NFUlRfRVEoMnUsIHZhbHVlcy5zaXplKCkpOworICBFWFBFQ1RfRVEoMSwgdmFsdWVzWzddKTsKKyAgRVhQRUNUX0VRKDIsIHZhbHVlc1s4XSk7Cit9CisKK1RFU1RfRihDb3VudGVyTWV0cmljVGVzdCwgU3RyaW5nRGF0YVR5cGUpIHsKKyAgQ291bnRlck1ldHJpYzxzdGQ6OnN0cmluZz4gbWV0cmljKCJNeU1ldHJpY05hbWUiLCAiTWV0cmljQXR0cmlidXRlTmFtZSIpOworCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ2NF90PiB2YWx1ZXM7CisKKyAgbWV0cmljLkluY3JlbWVudCgiYSIpOworICBtZXRyaWMuSW5jcmVtZW50KCJiIik7CisgIG1ldHJpYy5JbmNyZW1lbnQoImIiKTsKKworICBtZXRyaWMuRXhwb3J0VmFsdWVzKAorICAgICAgWyZdIChzdGQ6OnN0cmluZyBhdHRyaWJ1dGVfdmFsdWUsIGludDY0X3QgdmFsdWUpIHsKKyAgICAgICAgICB2YWx1ZXNbYXR0cmlidXRlX3ZhbHVlXSA9IHZhbHVlOworICAgICAgfSk7CisKKyAgQVNTRVJUX0VRKDJ1LCB2YWx1ZXMuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEsIHZhbHVlc1siYSJdKTsKKyAgRVhQRUNUX0VRKDIsIHZhbHVlc1siYiJdKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS90ZXN0cy9Ecm1NZXRyaWNzX3Rlc3QuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0RybU1ldHJpY3NfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRhYTlkMAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJtZWRpYWRybS90ZXN0cy9Ecm1NZXRyaWNzX3Rlc3QuY3BwCkBAIC0wLDAgKzEsNDc1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkRybU1ldHJpY3NUZXN0IgorI2luY2x1ZGUgIm1lZGlhZHJtL0RybU1ldHJpY3MuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS90eXBlcy5oPgorI2luY2x1ZGUgPGJpbmRlci9QZXJzaXN0YWJsZUJ1bmRsZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXIuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAicHJvdG9zL21ldHJpY3MucGIuaCIKKwordXNpbmcgOjphbmRyb2lkOjpkcm1fbWV0cmljczo6RHJtRnJhbWV3b3JrTWV0cmljczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpFdmVudFR5cGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OktleVN0YXR1c1R5cGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA7Cit1c2luZyA6OmFuZHJvaWQ6Om9zOjpQZXJzaXN0YWJsZUJ1bmRsZTsKK3VzaW5nIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOwordXNpbmcgOjpnb29nbGU6OnByb3RvYnVmOjpUZXh0Rm9ybWF0OworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogVW5pdCB0ZXN0cyBmb3IgdGhlIE1lZGlhRHJtTWV0cmljcyBjbGFzcy4KKyAqLworY2xhc3MgTWVkaWFEcm1NZXRyaWNzVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3Qge307CisKKy8qKgorICogVGhpcyBkZXJpdmVkIGNsYXNzIG1vY2tzIHRoZSBjbG9jayBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KKyAqLworY2xhc3MgRmFrZU1lZGlhRHJtTWV0cmljcyA6IHB1YmxpYyBNZWRpYURybU1ldHJpY3MgeworIHB1YmxpYzoKKyAgRmFrZU1lZGlhRHJtTWV0cmljcygpIDogTWVkaWFEcm1NZXRyaWNzKCksIHRpbWVfKDApIHt9OworCisgIGludDY0X3QgR2V0Q3VycmVudFRpbWVNcygpIHsgcmV0dXJuIHRpbWVfKys7IH0KKyAgaW50NjRfdCB0aW1lXzsKK307CisKK1RFU1RfRihNZWRpYURybU1ldHJpY3NUZXN0LCBFbXB0eVN1Y2Nlc3MpIHsKKyAgTWVkaWFEcm1NZXRyaWNzIG1ldHJpY3M7CisgIFBlcnNpc3RhYmxlQnVuZGxlIGJ1bmRsZTsKKworICBtZXRyaWNzLkV4cG9ydCgmYnVuZGxlKTsKKyAgRVhQRUNUX1RSVUUoYnVuZGxlLmVtcHR5KCkpOworfQorCitURVNUX0YoTWVkaWFEcm1NZXRyaWNzVGVzdCwgQWxsVmFsdWVzU3VjY2Vzc0NvdW50cykgeworICBNZWRpYURybU1ldHJpY3MgbWV0cmljczsKKworICBtZXRyaWNzLm1PcGVuU2Vzc2lvbkNvdW50ZXIuSW5jcmVtZW50KE9LKTsKKyAgbWV0cmljcy5tQ2xvc2VTZXNzaW9uQ291bnRlci5JbmNyZW1lbnQoT0spOworCisgIHsKKyAgICBFdmVudFRpbWVyPHN0YXR1c190PiBnZXRfa2V5X3JlcXVlc3RfdGltZXIoJm1ldHJpY3MubUdldEtleVJlcXVlc3RUaW1lVXMpOworICAgIEV2ZW50VGltZXI8c3RhdHVzX3Q+IHByb3ZpZGVfa2V5X3Jlc3BvbnNlX3RpbWVyKAorICAgICAgICAmbWV0cmljcy5tUHJvdmlkZUtleVJlc3BvbnNlVGltZVVzKTsKKyAgICBnZXRfa2V5X3JlcXVlc3RfdGltZXIuU2V0QXR0cmlidXRlKE9LKTsKKyAgICBwcm92aWRlX2tleV9yZXNwb25zZV90aW1lci5TZXRBdHRyaWJ1dGUoT0spOworICB9CisKKyAgbWV0cmljcy5tR2V0UHJvdmlzaW9uUmVxdWVzdENvdW50ZXIuSW5jcmVtZW50KE9LKTsKKyAgbWV0cmljcy5tUHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlQ291bnRlci5JbmNyZW1lbnQoT0spOworICBtZXRyaWNzLm1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIuSW5jcmVtZW50KE9LKTsKKworICBtZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudChLZXlTdGF0dXNUeXBlOjpVU0FCTEUpOworICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KEV2ZW50VHlwZTo6UFJPVklTSU9OX1JFUVVJUkVEKTsKKworICBQZXJzaXN0YWJsZUJ1bmRsZSBidW5kbGU7CisKKyAgbWV0cmljcy5FeHBvcnQoJmJ1bmRsZSk7CisgIEVYUEVDVF9FUSgxMVUsIGJ1bmRsZS5zaXplKCkpOworCisgIC8vIFZlcmlmeSB0aGUgbGlzdCBvZiBwYWlycyBvZiBpbnQ2NCBtZXRyaWNzLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGludDY0X3Q+PiBleHBlY3RlZF92YWx1ZXMgPSB7CisgICAgICB7ICJkcm0ubWVkaWFkcm0ub3Blbl9zZXNzaW9uLm9rLmNvdW50IiwgMSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLmNsb3NlX3Nlc3Npb24ub2suY291bnQiLCAxIH0sCisgICAgICB7ICJkcm0ubWVkaWFkcm0uZ2V0X2tleV9yZXF1ZXN0Lm9rLmNvdW50IiwgMSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLnByb3ZpZGVfa2V5X3Jlc3BvbnNlLm9rLmNvdW50IiwgMSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLmdldF9wcm92aXNpb25fcmVxdWVzdC5vay5jb3VudCIsIDEgfSwKKyAgICAgIHsgImRybS5tZWRpYWRybS5wcm92aWRlX3Byb3Zpc2lvbl9yZXNwb25zZS5vay5jb3VudCIsIDEgfSwKKyAgICAgIHsgImRybS5tZWRpYWRybS5rZXlfc3RhdHVzX2NoYW5nZS5VU0FCTEUuY291bnQiLCAxIH0sCisgICAgICB7ICJkcm0ubWVkaWFkcm0uZXZlbnQuUFJPVklTSU9OX1JFUVVJUkVELmNvdW50IiwgMSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLmdldF9kZXZpY2VfdW5pcXVlX2lkLm9rLmNvdW50IiwgMSB9fTsKKyAgZm9yIChjb25zdCBhdXRvJiBleHBlY3RlZF9wYWlyIDogZXhwZWN0ZWRfdmFsdWVzKSB7CisgICAgU3RyaW5nMTYga2V5KGV4cGVjdGVkX3BhaXIuZmlyc3QuY19zdHIoKSk7CisgICAgaW50NjRfdCB2YWx1ZSA9IC0xOworICAgIEVYUEVDVF9UUlVFKGJ1bmRsZS5nZXRMb25nKGtleSwgJnZhbHVlKSkKKyAgICAgICAgPDwgIlVuZXhwZWN0ZWQgZXJyb3IgcmV0cmlldmlpbmcga2V5OiAiIDw8IGtleTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfcGFpci5zZWNvbmQsIHZhbHVlKQorICAgICAgICA8PCAiVW5leHBlY3RlZCB2YWx1ZSBmb3IgIiA8PCBleHBlY3RlZF9wYWlyLmZpcnN0IDw8ICIuICIgPDwgdmFsdWU7CisgIH0KKworICAvLyBWYWxpZGF0ZSB0aW1pbmcgdmFsdWVzIGV4aXN0LgorICBTdHJpbmcxNiBnZXRfa2V5X3JlcXVlc3Rfa2V5KAorICAgICAgImRybS5tZWRpYWRybS5nZXRfa2V5X3JlcXVlc3Qub2suYXZlcmFnZV90aW1lX21pY3JvcyIpOworICBTdHJpbmcxNiBwcm92aWRlX2tleV9yZXNwb25zZV9rZXkoCisgICAgICAiZHJtLm1lZGlhZHJtLnByb3ZpZGVfa2V5X3Jlc3BvbnNlLm9rLmF2ZXJhZ2VfdGltZV9taWNyb3MiKTsKKyAgaW50NjRfdCB2YWx1ZSA9IC0xOworICBFWFBFQ1RfVFJVRShidW5kbGUuZ2V0TG9uZyhnZXRfa2V5X3JlcXVlc3Rfa2V5LCAmdmFsdWUpKTsKKyAgRVhQRUNUX0dFKHZhbHVlLCAwKTsKKyAgdmFsdWUgPSAtMTsKKyAgRVhQRUNUX1RSVUUoYnVuZGxlLmdldExvbmcocHJvdmlkZV9rZXlfcmVzcG9uc2Vfa2V5LCAmdmFsdWUpKTsKKyAgRVhQRUNUX0dFKHZhbHVlLCAwKTsKK30KKworVEVTVF9GKE1lZGlhRHJtTWV0cmljc1Rlc3QsIEFsbFZhbHVlc0Z1bGwpIHsKKyAgTWVkaWFEcm1NZXRyaWNzIG1ldHJpY3M7CisKKyAgbWV0cmljcy5tT3BlblNlc3Npb25Db3VudGVyLkluY3JlbWVudChPSyk7CisgIG1ldHJpY3MubU9wZW5TZXNzaW9uQ291bnRlci5JbmNyZW1lbnQoVU5FWFBFQ1RFRF9OVUxMKTsKKworICBtZXRyaWNzLm1DbG9zZVNlc3Npb25Db3VudGVyLkluY3JlbWVudChPSyk7CisgIG1ldHJpY3MubUNsb3NlU2Vzc2lvbkNvdW50ZXIuSW5jcmVtZW50KFVORVhQRUNURURfTlVMTCk7CisKKyAgZm9yIChzdGF0dXNfdCBzIDoge09LLCBVTkVYUEVDVEVEX05VTEx9KSB7CisgICAgeworICAgICAgRXZlbnRUaW1lcjxzdGF0dXNfdD4gZ2V0X2tleV9yZXF1ZXN0X3RpbWVyKCZtZXRyaWNzLm1HZXRLZXlSZXF1ZXN0VGltZVVzKTsKKyAgICAgIEV2ZW50VGltZXI8c3RhdHVzX3Q+IHByb3ZpZGVfa2V5X3Jlc3BvbnNlX3RpbWVyKAorICAgICAgICAgICZtZXRyaWNzLm1Qcm92aWRlS2V5UmVzcG9uc2VUaW1lVXMpOworICAgICAgZ2V0X2tleV9yZXF1ZXN0X3RpbWVyLlNldEF0dHJpYnV0ZShzKTsKKyAgICAgIHByb3ZpZGVfa2V5X3Jlc3BvbnNlX3RpbWVyLlNldEF0dHJpYnV0ZShzKTsKKyAgICB9CisgIH0KKworICBtZXRyaWNzLm1HZXRQcm92aXNpb25SZXF1ZXN0Q291bnRlci5JbmNyZW1lbnQoT0spOworICBtZXRyaWNzLm1HZXRQcm92aXNpb25SZXF1ZXN0Q291bnRlci5JbmNyZW1lbnQoVU5FWFBFQ1RFRF9OVUxMKTsKKyAgbWV0cmljcy5tUHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlQ291bnRlci5JbmNyZW1lbnQoT0spOworICBtZXRyaWNzLm1Qcm92aWRlUHJvdmlzaW9uUmVzcG9uc2VDb3VudGVyLkluY3JlbWVudChVTkVYUEVDVEVEX05VTEwpOworICBtZXRyaWNzLm1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIuSW5jcmVtZW50KE9LKTsKKyAgbWV0cmljcy5tR2V0RGV2aWNlVW5pcXVlSWRDb3VudGVyLkluY3JlbWVudChVTkVYUEVDVEVEX05VTEwpOworCisgIG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KEtleVN0YXR1c1R5cGU6OlVTQUJMRSk7CisgIG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KEtleVN0YXR1c1R5cGU6OkVYUElSRUQpOworICBtZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudChLZXlTdGF0dXNUeXBlOjpPVVRQVVROT1RBTExPV0VEKTsKKyAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoS2V5U3RhdHVzVHlwZTo6U1RBVFVTUEVORElORyk7CisgIG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KEtleVN0YXR1c1R5cGU6OklOVEVSTkFMRVJST1IpOworICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KEV2ZW50VHlwZTo6UFJPVklTSU9OX1JFUVVJUkVEKTsKKyAgbWV0cmljcy5tRXZlbnRDb3VudGVyLkluY3JlbWVudChFdmVudFR5cGU6OktFWV9ORUVERUQpOworICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KEV2ZW50VHlwZTo6S0VZX0VYUElSRUQpOworICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KEV2ZW50VHlwZTo6VkVORE9SX0RFRklORUQpOworICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KEV2ZW50VHlwZTo6U0VTU0lPTl9SRUNMQUlNRUQpOworCisgIGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQxOworICBzZXNzaW9uSWQxLnB1c2hfYmFjaygxKTsKKyAgc2Vzc2lvbklkMS5wdXNoX2JhY2soMik7CisgIGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQyOworICBzZXNzaW9uSWQyLnB1c2hfYmFjaygzKTsKKyAgc2Vzc2lvbklkMi5wdXNoX2JhY2soNCk7CisgIFN0cmluZzE2IGhleFNlc3Npb25JZDEoIjAxMDIiKTsKKyAgU3RyaW5nMTYgaGV4U2Vzc2lvbklkMigiMDMwNCIpOworCisgIG1ldHJpY3MuU2V0U2Vzc2lvblN0YXJ0KHNlc3Npb25JZDEpOworICBtZXRyaWNzLlNldFNlc3Npb25TdGFydChzZXNzaW9uSWQyKTsKKyAgbWV0cmljcy5TZXRTZXNzaW9uRW5kKHNlc3Npb25JZDIpOworICBtZXRyaWNzLlNldFNlc3Npb25FbmQoc2Vzc2lvbklkMSk7CisKKyAgUGVyc2lzdGFibGVCdW5kbGUgYnVuZGxlOworICBtZXRyaWNzLkV4cG9ydCgmYnVuZGxlKTsKKyAgRVhQRUNUX0VRKDM1VSwgYnVuZGxlLnNpemUoKSk7CisKKyAgLy8gVmVyaWZ5IHRoZSBsaXN0IG9mIHBhaXJzIG9mIGludDY0IG1ldHJpY3MuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgaW50NjRfdD4+IGV4cGVjdGVkX3ZhbHVlcyA9IHsKKyAgICAgIHsgImRybS5tZWRpYWRybS5vcGVuX3Nlc3Npb24ub2suY291bnQiLCAxIH0sCisgICAgICB7ICJkcm0ubWVkaWFkcm0uY2xvc2Vfc2Vzc2lvbi5vay5jb3VudCIsIDEgfSwKKyAgICAgIHsgImRybS5tZWRpYWRybS5nZXRfa2V5X3JlcXVlc3Qub2suY291bnQiLCAxIH0sCisgICAgICB7ICJkcm0ubWVkaWFkcm0ucHJvdmlkZV9rZXlfcmVzcG9uc2Uub2suY291bnQiLCAxIH0sCisgICAgICB7ICJkcm0ubWVkaWFkcm0uZ2V0X3Byb3Zpc2lvbl9yZXF1ZXN0Lm9rLmNvdW50IiwgMSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLnByb3ZpZGVfcHJvdmlzaW9uX3Jlc3BvbnNlLm9rLmNvdW50IiwgMSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLmdldF9kZXZpY2VfdW5pcXVlX2lkLm9rLmNvdW50IiwgMSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLm9wZW5fc2Vzc2lvbi5lcnJvci5jb3VudCIsIDEgfSwKKyAgICAgIHsgImRybS5tZWRpYWRybS5jbG9zZV9zZXNzaW9uLmVycm9yLmNvdW50IiwgMSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLmdldF9rZXlfcmVxdWVzdC5lcnJvci5jb3VudCIsIDEgfSwKKyAgICAgIHsgImRybS5tZWRpYWRybS5wcm92aWRlX2tleV9yZXNwb25zZS5lcnJvci5jb3VudCIsIDEgfSwKKyAgICAgIHsgImRybS5tZWRpYWRybS5nZXRfcHJvdmlzaW9uX3JlcXVlc3QuZXJyb3IuY291bnQiLCAxIH0sCisgICAgICB7ICJkcm0ubWVkaWFkcm0ucHJvdmlkZV9wcm92aXNpb25fcmVzcG9uc2UuZXJyb3IuY291bnQiLCAxIH0sCisgICAgICB7ICJkcm0ubWVkaWFkcm0uZ2V0X2RldmljZV91bmlxdWVfaWQuZXJyb3IuY291bnQiLCAxIH0sCisgICAgICB7ICJkcm0ubWVkaWFkcm0ua2V5X3N0YXR1c19jaGFuZ2UuVVNBQkxFLmNvdW50IiwgMSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLmtleV9zdGF0dXNfY2hhbmdlLkVYUElSRUQuY291bnQiLCAxIH0sCisgICAgICB7ICJkcm0ubWVkaWFkcm0ua2V5X3N0YXR1c19jaGFuZ2UuT1VUUFVUX05PVF9BTExPV0VELmNvdW50IiwgMSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLmtleV9zdGF0dXNfY2hhbmdlLlNUQVRVU19QRU5ESU5HLmNvdW50IiwgMSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLmtleV9zdGF0dXNfY2hhbmdlLklOVEVSTkFMX0VSUk9SLmNvdW50IiwgMSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLmV2ZW50LlBST1ZJU0lPTl9SRVFVSVJFRC5jb3VudCIsIDEgfSwKKyAgICAgIHsgImRybS5tZWRpYWRybS5ldmVudC5LRVlfTkVFREVELmNvdW50IiwgMSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLmV2ZW50LktFWV9FWFBJUkVELmNvdW50IiwgMSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLmV2ZW50LlZFTkRPUl9ERUZJTkVELmNvdW50IiwgMSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLmV2ZW50LlNFU1NJT05fUkVDTEFJTUVELmNvdW50IiwgMSB9fTsKKyAgZm9yIChjb25zdCBhdXRvJiBleHBlY3RlZF9wYWlyIDogZXhwZWN0ZWRfdmFsdWVzKSB7CisgICAgU3RyaW5nMTYga2V5KGV4cGVjdGVkX3BhaXIuZmlyc3QuY19zdHIoKSk7CisgICAgaW50NjRfdCB2YWx1ZSA9IC0xOworICAgIEVYUEVDVF9UUlVFKGJ1bmRsZS5nZXRMb25nKGtleSwgJnZhbHVlKSkKKyAgICAgICAgPDwgIlVuZXhwZWN0ZWQgZXJyb3IgcmV0cmlldmlpbmcga2V5OiAiIDw8IGtleTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfcGFpci5zZWNvbmQsIHZhbHVlKQorICAgICAgICA8PCAiVW5leHBlY3RlZCB2YWx1ZSBmb3IgIiA8PCBleHBlY3RlZF9wYWlyLmZpcnN0IDw8ICIuICIgPDwgdmFsdWU7CisgIH0KKworICAvLyBWZXJpZnkgdGhlIGVycm9yIGxpc3RzCisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8aW50NjRfdD4+PiBleHBlY3RlZF92ZWN0b3JfdmFsdWVzID0geworICAgICAgeyAiZHJtLm1lZGlhZHJtLmNsb3NlX3Nlc3Npb24uZXJyb3IubGlzdCIsIHsgVU5FWFBFQ1RFRF9OVUxMIH0gfSwKKyAgICAgIHsgImRybS5tZWRpYWRybS5nZXRfZGV2aWNlX3VuaXF1ZV9pZC5lcnJvci5saXN0IiwgeyBVTkVYUEVDVEVEX05VTEwgfSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLmdldF9rZXlfcmVxdWVzdC5lcnJvci5saXN0IiwgeyBVTkVYUEVDVEVEX05VTEwgfSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLmdldF9wcm92aXNpb25fcmVxdWVzdC5lcnJvci5saXN0IiwgeyBVTkVYUEVDVEVEX05VTEwgfSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLm9wZW5fc2Vzc2lvbi5lcnJvci5saXN0IiwgeyBVTkVYUEVDVEVEX05VTEwgfSB9LAorICAgICAgeyAiZHJtLm1lZGlhZHJtLnByb3ZpZGVfa2V5X3Jlc3BvbnNlLmVycm9yLmxpc3QiLCB7IFVORVhQRUNURURfTlVMTCB9IH0sCisgICAgICB7ICJkcm0ubWVkaWFkcm0ucHJvdmlkZV9wcm92aXNpb25fcmVzcG9uc2UuZXJyb3IubGlzdCIsIHsgVU5FWFBFQ1RFRF9OVUxMIH0gfX07CisgIGZvciAoY29uc3QgYXV0byYgZXhwZWN0ZWRfcGFpciA6IGV4cGVjdGVkX3ZlY3Rvcl92YWx1ZXMpIHsKKyAgICBTdHJpbmcxNiBrZXkoZXhwZWN0ZWRfcGFpci5maXJzdC5jX3N0cigpKTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiB2YWx1ZXM7CisgICAgRVhQRUNUX1RSVUUoYnVuZGxlLmdldExvbmdWZWN0b3Ioa2V5LCAmdmFsdWVzKSkKKyAgICAgICAgPDwgIlVuZXhwZWN0ZWQgZXJyb3IgcmV0cmlldmlpbmcga2V5OiAiIDw8IGtleTsKKyAgICBmb3IgKGF1dG8gZXhwZWN0ZWQgOiBleHBlY3RlZF9wYWlyLnNlY29uZCkgeworICAgICAgRVhQRUNUX1RSVUUoc3RkOjpmaW5kKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCksIGV4cGVjdGVkKSAhPSB2YWx1ZXMuZW5kKCkpCisgICAgICAgICAgPDwgIkNvdWxkIG5vdCBmaW5kICIgPDwgZXhwZWN0ZWQgPDwgIiBmb3Iga2V5ICIgPDwgZXhwZWN0ZWRfcGFpci5maXJzdDsKKyAgICB9CisgIH0KKworICAvLyBWZXJpZnkgdGhlIGxpZmVzcGFucworICBQZXJzaXN0YWJsZUJ1bmRsZSBzdGFydF90aW1lczsKKyAgUGVyc2lzdGFibGVCdW5kbGUgZW5kX3RpbWVzOworICBTdHJpbmcxNiBzdGFydF90aW1lX2tleSgiZHJtLm1lZGlhZHJtLnNlc3Npb25fc3RhcnRfdGltZXNfbXMiKTsKKyAgU3RyaW5nMTYgZW5kX3RpbWVfa2V5KCJkcm0ubWVkaWFkcm0uc2Vzc2lvbl9lbmRfdGltZXNfbXMiKTsKKyAgQVNTRVJUX1RSVUUoYnVuZGxlLmdldFBlcnNpc3RhYmxlQnVuZGxlKHN0YXJ0X3RpbWVfa2V5LCAmc3RhcnRfdGltZXMpKTsKKyAgQVNTRVJUX1RSVUUoYnVuZGxlLmdldFBlcnNpc3RhYmxlQnVuZGxlKGVuZF90aW1lX2tleSwgJmVuZF90aW1lcykpOworICBFWFBFQ1RfRVEoMlUsIHN0YXJ0X3RpbWVzLnNpemUoKSk7CisgIEVYUEVDVF9FUSgyVSwgZW5kX3RpbWVzLnNpemUoKSk7CisgIGludDY0X3Qgc3RhcnRfdGltZSwgZW5kX3RpbWU7CisgIGZvciAoY29uc3QgYXV0byYgc2lkIDogeyBoZXhTZXNzaW9uSWQxLCBoZXhTZXNzaW9uSWQyIH0pIHsKKyAgICBzdGFydF90aW1lID0gLTE7CisgICAgZW5kX3RpbWUgPSAtMTsKKyAgICBFWFBFQ1RfVFJVRShzdGFydF90aW1lcy5nZXRMb25nKHNpZCwgJnN0YXJ0X3RpbWUpKTsKKyAgICBFWFBFQ1RfVFJVRShlbmRfdGltZXMuZ2V0TG9uZyhzaWQsICZlbmRfdGltZSkpOworICAgIEVYUEVDVF9HVChzdGFydF90aW1lLCAwKTsKKyAgICBFWFBFQ1RfR0UoZW5kX3RpbWUsIHN0YXJ0X3RpbWUpOworICB9CisKKyAgLy8gVmFsaWRhdGUgdGltaW5nIHZhbHVlcyBleGlzdC4KKyAgU3RyaW5nMTYgZ2V0X2tleV9yZXF1ZXN0X2tleSgKKyAgICAgICJkcm0ubWVkaWFkcm0uZ2V0X2tleV9yZXF1ZXN0Lm9rLmF2ZXJhZ2VfdGltZV9taWNyb3MiKTsKKyAgU3RyaW5nMTYgcHJvdmlkZV9rZXlfcmVzcG9uc2Vfa2V5KAorICAgICAgImRybS5tZWRpYWRybS5wcm92aWRlX2tleV9yZXNwb25zZS5vay5hdmVyYWdlX3RpbWVfbWljcm9zIik7CisgIGludDY0X3QgdmFsdWUgPSAtMTsKKyAgRVhQRUNUX1RSVUUoYnVuZGxlLmdldExvbmcoZ2V0X2tleV9yZXF1ZXN0X2tleSwgJnZhbHVlKSk7CisgIEVYUEVDVF9HRSh2YWx1ZSwgMCk7CisgIHZhbHVlID0gLTE7CisgIEVYUEVDVF9UUlVFKGJ1bmRsZS5nZXRMb25nKHByb3ZpZGVfa2V5X3Jlc3BvbnNlX2tleSwgJnZhbHVlKSk7CisgIEVYUEVDVF9HRSh2YWx1ZSwgMCk7Cit9CisKKworVEVTVF9GKE1lZGlhRHJtTWV0cmljc1Rlc3QsIENvdW50ZXJWYWx1ZXNQcm90b1NlcmlhbGl6YXRpb24pIHsKKyAgTWVkaWFEcm1NZXRyaWNzIG1ldHJpY3M7CisKKyAgbWV0cmljcy5tT3BlblNlc3Npb25Db3VudGVyLkluY3JlbWVudChPSyk7CisgIG1ldHJpY3MubU9wZW5TZXNzaW9uQ291bnRlci5JbmNyZW1lbnQoVU5FWFBFQ1RFRF9OVUxMKTsKKyAgbWV0cmljcy5tQ2xvc2VTZXNzaW9uQ291bnRlci5JbmNyZW1lbnQoT0spOworICBtZXRyaWNzLm1DbG9zZVNlc3Npb25Db3VudGVyLkluY3JlbWVudChVTkVYUEVDVEVEX05VTEwpOworCisgIG1ldHJpY3MubUdldFByb3Zpc2lvblJlcXVlc3RDb3VudGVyLkluY3JlbWVudChPSyk7CisgIG1ldHJpY3MubUdldFByb3Zpc2lvblJlcXVlc3RDb3VudGVyLkluY3JlbWVudChVTkVYUEVDVEVEX05VTEwpOworICBtZXRyaWNzLm1Qcm92aWRlUHJvdmlzaW9uUmVzcG9uc2VDb3VudGVyLkluY3JlbWVudChPSyk7CisgIG1ldHJpY3MubVByb3ZpZGVQcm92aXNpb25SZXNwb25zZUNvdW50ZXIuSW5jcmVtZW50KFVORVhQRUNURURfTlVMTCk7CisgIG1ldHJpY3MubUdldERldmljZVVuaXF1ZUlkQ291bnRlci5JbmNyZW1lbnQoT0spOworICBtZXRyaWNzLm1HZXREZXZpY2VVbmlxdWVJZENvdW50ZXIuSW5jcmVtZW50KFVORVhQRUNURURfTlVMTCk7CisKKyAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoS2V5U3RhdHVzVHlwZTo6VVNBQkxFKTsKKyAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoS2V5U3RhdHVzVHlwZTo6RVhQSVJFRCk7CisgIG1ldHJpY3MubUtleVN0YXR1c0NoYW5nZUNvdW50ZXIuSW5jcmVtZW50KEtleVN0YXR1c1R5cGU6Ok9VVFBVVE5PVEFMTE9XRUQpOworICBtZXRyaWNzLm1LZXlTdGF0dXNDaGFuZ2VDb3VudGVyLkluY3JlbWVudChLZXlTdGF0dXNUeXBlOjpTVEFUVVNQRU5ESU5HKTsKKyAgbWV0cmljcy5tS2V5U3RhdHVzQ2hhbmdlQ291bnRlci5JbmNyZW1lbnQoS2V5U3RhdHVzVHlwZTo6SU5URVJOQUxFUlJPUik7CisgIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoRXZlbnRUeXBlOjpQUk9WSVNJT05fUkVRVUlSRUQpOworICBtZXRyaWNzLm1FdmVudENvdW50ZXIuSW5jcmVtZW50KEV2ZW50VHlwZTo6S0VZX05FRURFRCk7CisgIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoRXZlbnRUeXBlOjpLRVlfRVhQSVJFRCk7CisgIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoRXZlbnRUeXBlOjpWRU5ET1JfREVGSU5FRCk7CisgIG1ldHJpY3MubUV2ZW50Q291bnRlci5JbmNyZW1lbnQoRXZlbnRUeXBlOjpTRVNTSU9OX1JFQ0xBSU1FRCk7CisKKyAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZE1ldHJpY3M7CisgIEFTU0VSVF9FUShPSywgbWV0cmljcy5HZXRTZXJpYWxpemVkTWV0cmljcygmc2VyaWFsaXplZE1ldHJpY3MpKTsKKworICBEcm1GcmFtZXdvcmtNZXRyaWNzIG1ldHJpY3NQcm90bzsKKyAgQVNTRVJUX1RSVUUobWV0cmljc1Byb3RvLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkTWV0cmljcykpOworCisgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkTWV0cmljcyA9CisgICAgICAib3Blbl9zZXNzaW9uX2NvdW50ZXIgeyBjb3VudDogMSBhdHRyaWJ1dGVzIHsgZXJyb3JfY29kZTogLTB4N0ZGRkZGRjggfSB9ICIKKyAgICAgICJvcGVuX3Nlc3Npb25fY291bnRlciB7IGNvdW50OiAxIGF0dHJpYnV0ZXMgeyBlcnJvcl9jb2RlOiAwIH0gfSAiCisgICAgICAiY2xvc2Vfc2Vzc2lvbl9jb3VudGVyIHsgY291bnQ6IDEgYXR0cmlidXRlcyB7IGVycm9yX2NvZGU6IC0weDdGRkZGRkY4IH0gfSAiCisgICAgICAiY2xvc2Vfc2Vzc2lvbl9jb3VudGVyIHsgY291bnQ6IDEgYXR0cmlidXRlcyB7IGVycm9yX2NvZGU6IDAgfSB9ICIKKyAgICAgICJnZXRfcHJvdmlzaW9uaW5nX3JlcXVlc3RfY291bnRlciB7IGNvdW50OiAxIGF0dHJpYnV0ZXMgeyBlcnJvcl9jb2RlOiAtMHg3RkZGRkZGOCB9IH0gIgorICAgICAgImdldF9wcm92aXNpb25pbmdfcmVxdWVzdF9jb3VudGVyIHsgY291bnQ6IDEgYXR0cmlidXRlcyB7IGVycm9yX2NvZGU6IDAgfSB9ICIKKyAgICAgICJwcm92aWRlX3Byb3Zpc2lvbmluZ19yZXNwb25zZV9jb3VudGVyIHsgY291bnQ6IDEgYXR0cmlidXRlcyB7IGVycm9yX2NvZGU6IC0weDdmZmZmZmY4IH0gfSAiCisgICAgICAicHJvdmlkZV9wcm92aXNpb25pbmdfcmVzcG9uc2VfY291bnRlciB7IGNvdW50OiAxIGF0dHJpYnV0ZXMgeyBlcnJvcl9jb2RlOiAwIH0gfSAiCisgICAgICAiZ2V0X2RldmljZV91bmlxdWVfaWRfY291bnRlciB7IGNvdW50OiAxIGF0dHJpYnV0ZXMgeyBlcnJvcl9jb2RlOiAtMHg3ZmZmZmZmOCB9IH0gIgorICAgICAgImdldF9kZXZpY2VfdW5pcXVlX2lkX2NvdW50ZXIgeyBjb3VudDogMSBhdHRyaWJ1dGVzIHsgZXJyb3JfY29kZTogMCB9IH0gIgorICAgICAgImtleV9zdGF0dXNfY2hhbmdlX2NvdW50ZXIgeyBjb3VudDogMSBhdHRyaWJ1dGVzIHsga2V5X3N0YXR1c190eXBlOiAwIH0gfSAiCisgICAgICAia2V5X3N0YXR1c19jaGFuZ2VfY291bnRlciB7IGNvdW50OiAxIGF0dHJpYnV0ZXMgeyBrZXlfc3RhdHVzX3R5cGU6IDEgfSB9ICIKKyAgICAgICJrZXlfc3RhdHVzX2NoYW5nZV9jb3VudGVyIHsgY291bnQ6IDEgYXR0cmlidXRlcyB7IGtleV9zdGF0dXNfdHlwZTogMiB9IH0gIgorICAgICAgImtleV9zdGF0dXNfY2hhbmdlX2NvdW50ZXIgeyBjb3VudDogMSBhdHRyaWJ1dGVzIHsga2V5X3N0YXR1c190eXBlOiAzIH0gfSAiCisgICAgICAia2V5X3N0YXR1c19jaGFuZ2VfY291bnRlciB7IGNvdW50OiAxIGF0dHJpYnV0ZXMgeyBrZXlfc3RhdHVzX3R5cGU6IDQgfSB9ICIKKyAgICAgICJldmVudF9jYWxsYmFja19jb3VudGVyIHsgY291bnQ6IDEgYXR0cmlidXRlcyB7IGV2ZW50X3R5cGU6IDAgfSB9ICIKKyAgICAgICJldmVudF9jYWxsYmFja19jb3VudGVyIHsgY291bnQ6IDEgYXR0cmlidXRlcyB7IGV2ZW50X3R5cGU6IDEgfSB9ICIKKyAgICAgICJldmVudF9jYWxsYmFja19jb3VudGVyIHsgY291bnQ6IDEgYXR0cmlidXRlcyB7IGV2ZW50X3R5cGU6IDIgfSB9ICIKKyAgICAgICJldmVudF9jYWxsYmFja19jb3VudGVyIHsgY291bnQ6IDEgYXR0cmlidXRlcyB7IGV2ZW50X3R5cGU6IDMgfSB9ICIKKyAgICAgICJldmVudF9jYWxsYmFja19jb3VudGVyIHsgY291bnQ6IDEgYXR0cmlidXRlcyB7IGV2ZW50X3R5cGU6IDQgfSB9ICI7CisKKyAgRHJtRnJhbWV3b3JrTWV0cmljcyBleHBlY3RlZE1ldHJpY3NQcm90bzsKKyAgQVNTRVJUX1RSVUUoVGV4dEZvcm1hdDo6TWVyZ2VGcm9tU3RyaW5nKGV4cGVjdGVkTWV0cmljcywgJmV4cGVjdGVkTWV0cmljc1Byb3RvKSk7CisKKyAgc3RkOjpzdHJpbmcgZGlmZlN0cmluZzsKKyAgTWVzc2FnZURpZmZlcmVuY2VyIGRpZmZlcjsKKyAgZGlmZmVyLlJlcG9ydERpZmZlcmVuY2VzVG9TdHJpbmcoJmRpZmZTdHJpbmcpOworICBBU1NFUlRfVFJVRShkaWZmZXIuQ29tcGFyZShleHBlY3RlZE1ldHJpY3NQcm90bywgbWV0cmljc1Byb3RvKSkKKyAgICAgIDw8IGRpZmZTdHJpbmc7Cit9CisKK1RFU1RfRihNZWRpYURybU1ldHJpY3NUZXN0LCBUaW1lTWV0cmljc1Byb3RvU2VyaWFsaXphdGlvbikgeworICBNZWRpYURybU1ldHJpY3MgbWV0cmljczsKKworICBmb3IgKHN0YXR1c190IHMgOiB7T0ssIFVORVhQRUNURURfTlVMTH0pIHsKKyAgICBkb3VibGUgdGltZSA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgIHRpbWUgKz0gMS4wOworICAgICAgbWV0cmljcy5tR2V0S2V5UmVxdWVzdFRpbWVVcy5SZWNvcmQodGltZSwgcyk7CisgICAgICBtZXRyaWNzLm1Qcm92aWRlS2V5UmVzcG9uc2VUaW1lVXMuUmVjb3JkKHRpbWUsIHMpOworICAgIH0KKyAgfQorCisgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWRNZXRyaWNzOworICBBU1NFUlRfRVEoT0ssIG1ldHJpY3MuR2V0U2VyaWFsaXplZE1ldHJpY3MoJnNlcmlhbGl6ZWRNZXRyaWNzKSk7CisKKyAgRHJtRnJhbWV3b3JrTWV0cmljcyBtZXRyaWNzUHJvdG87CisgIEFTU0VSVF9UUlVFKG1ldHJpY3NQcm90by5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZE1ldHJpY3MpKTsKKworICBzdGQ6OnN0cmluZyBleHBlY3RlZE1ldHJpY3MgPQorICAgICAgImdldF9rZXlfcmVxdWVzdF90aW1lX3VzIHsgIgorICAgICAgIiAgbWluOiAxIG1heDogNSBtZWFuOiAzLjUgdmFyaWFuY2U6IDEgb3BlcmF0aW9uX2NvdW50OiA1ICIKKyAgICAgICIgIGF0dHJpYnV0ZXMgeyBlcnJvcl9jb2RlOiAtMHg3RkZGRkZGOCB9ICIKKyAgICAgICJ9ICIKKyAgICAgICJnZXRfa2V5X3JlcXVlc3RfdGltZV91cyB7ICIKKyAgICAgICIgIG1pbjogMSBtYXg6IDUgbWVhbjogMy41IHZhcmlhbmNlOiAxIG9wZXJhdGlvbl9jb3VudDogNSAiCisgICAgICAiICBhdHRyaWJ1dGVzIHsgZXJyb3JfY29kZTogMCB9ICIKKyAgICAgICJ9ICIKKyAgICAgICJwcm92aWRlX2tleV9yZXNwb25zZV90aW1lX3VzIHsgIgorICAgICAgIiAgbWluOiAxIG1heDogNSBtZWFuOiAzLjUgdmFyaWFuY2U6IDEgb3BlcmF0aW9uX2NvdW50OiA1ICIKKyAgICAgICIgIGF0dHJpYnV0ZXMgeyBlcnJvcl9jb2RlOiAtMHg3RkZGRkZGOCB9ICIKKyAgICAgICJ9ICIKKyAgICAgICJwcm92aWRlX2tleV9yZXNwb25zZV90aW1lX3VzIHsgIgorICAgICAgIiAgbWluOiAxIG1heDogNSBtZWFuOiAzLjUgdmFyaWFuY2U6IDEgb3BlcmF0aW9uX2NvdW50OiA1ICIKKyAgICAgICIgIGF0dHJpYnV0ZXMgeyBlcnJvcl9jb2RlOiAwIH0gIgorICAgICAgIn0gIjsKKworICBEcm1GcmFtZXdvcmtNZXRyaWNzIGV4cGVjdGVkTWV0cmljc1Byb3RvOworICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpNZXJnZUZyb21TdHJpbmcoZXhwZWN0ZWRNZXRyaWNzLCAmZXhwZWN0ZWRNZXRyaWNzUHJvdG8pKTsKKworICBzdGQ6OnN0cmluZyBkaWZmU3RyaW5nOworICBNZXNzYWdlRGlmZmVyZW5jZXIgZGlmZmVyOworICBkaWZmZXIuUmVwb3J0RGlmZmVyZW5jZXNUb1N0cmluZygmZGlmZlN0cmluZyk7CisgIEFTU0VSVF9UUlVFKGRpZmZlci5Db21wYXJlKGV4cGVjdGVkTWV0cmljc1Byb3RvLCBtZXRyaWNzUHJvdG8pKQorICAgICAgPDwgZGlmZlN0cmluZzsKK30KKworVEVTVF9GKE1lZGlhRHJtTWV0cmljc1Rlc3QsIFNlc3Npb25MaWZldGltZVByb3RvU2VyaWFsaXphdGlvbikgeworICAvLyBVc2UgdGhlIGZha2Ugc28gdGhlIGNsb2NrIGlzIHByZWRpY3RhYmxlOworICBGYWtlTWVkaWFEcm1NZXRyaWNzIG1ldHJpY3M7CisKKyAgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZDE7CisgIHNlc3Npb25JZDEucHVzaF9iYWNrKDEpOworICBzZXNzaW9uSWQxLnB1c2hfYmFjaygyKTsKKyAgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZDI7CisgIHNlc3Npb25JZDIucHVzaF9iYWNrKDMpOworICBzZXNzaW9uSWQyLnB1c2hfYmFjayg0KTsKKworICBtZXRyaWNzLlNldFNlc3Npb25TdGFydChzZXNzaW9uSWQxKTsKKyAgbWV0cmljcy5TZXRTZXNzaW9uU3RhcnQoc2Vzc2lvbklkMik7CisgIG1ldHJpY3MuU2V0U2Vzc2lvbkVuZChzZXNzaW9uSWQyKTsKKyAgbWV0cmljcy5TZXRTZXNzaW9uRW5kKHNlc3Npb25JZDEpOworCisgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWRNZXRyaWNzOworICBBU1NFUlRfRVEoT0ssIG1ldHJpY3MuR2V0U2VyaWFsaXplZE1ldHJpY3MoJnNlcmlhbGl6ZWRNZXRyaWNzKSk7CisKKyAgRHJtRnJhbWV3b3JrTWV0cmljcyBtZXRyaWNzUHJvdG87CisgIEFTU0VSVF9UUlVFKG1ldHJpY3NQcm90by5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZE1ldHJpY3MpKTsKKworICBzdGQ6OnN0cmluZyBleHBlY3RlZE1ldHJpY3MgPQorICAgICAgInNlc3Npb25fbGlmZXRpbWVzOiB7ICIKKyAgICAgICIgIGtleTogJzAxMDInICIKKyAgICAgICIgIHZhbHVlIHsgc3RhcnRfdGltZV9tczogMCBlbmRfdGltZV9tczogMyB9ICIKKyAgICAgICJ9ICIKKyAgICAgICJzZXNzaW9uX2xpZmV0aW1lczogeyAiCisgICAgICAiICBrZXk6ICcwMzA0JyAiCisgICAgICAiICB2YWx1ZSB7IHN0YXJ0X3RpbWVfbXM6IDEgZW5kX3RpbWVfbXM6IDIgfSAiCisgICAgICAifSAiOworCisgIERybUZyYW1ld29ya01ldHJpY3MgZXhwZWN0ZWRNZXRyaWNzUHJvdG87CisgIEFTU0VSVF9UUlVFKFRleHRGb3JtYXQ6Ok1lcmdlRnJvbVN0cmluZyhleHBlY3RlZE1ldHJpY3MsICZleHBlY3RlZE1ldHJpY3NQcm90bykpOworCisgIHN0ZDo6c3RyaW5nIGRpZmZTdHJpbmc7CisgIE1lc3NhZ2VEaWZmZXJlbmNlciBkaWZmZXI7CisgIGRpZmZlci5SZXBvcnREaWZmZXJlbmNlc1RvU3RyaW5nKCZkaWZmU3RyaW5nKTsKKyAgQVNTRVJUX1RSVUUoZGlmZmVyLkNvbXBhcmUoZXhwZWN0ZWRNZXRyaWNzUHJvdG8sIG1ldHJpY3NQcm90bykpCisgICAgICA8PCBkaWZmU3RyaW5nOworfQorCitURVNUX0YoTWVkaWFEcm1NZXRyaWNzVGVzdCwgSGlkbFRvQnVuZGxlTWV0cmljc0VtcHR5KSB7CisgIGhpZGxfdmVjPERybU1ldHJpY0dyb3VwPiBoaWRsTWV0cmljR3JvdXBzOworICBQZXJzaXN0YWJsZUJ1bmRsZSBidW5kbGVNZXRyaWNHcm91cHM7CisKKyAgQVNTRVJUX0VRKE9LLCBNZWRpYURybU1ldHJpY3M6OkhpZGxNZXRyaWNzVG9CdW5kbGUoaGlkbE1ldHJpY0dyb3VwcywgJmJ1bmRsZU1ldHJpY0dyb3VwcykpOworICBBU1NFUlRfRVEoMFUsIGJ1bmRsZU1ldHJpY0dyb3Vwcy5zaXplKCkpOworfQorCitURVNUX0YoTWVkaWFEcm1NZXRyaWNzVGVzdCwgSGlkbFRvQnVuZGxlTWV0cmljc011bHRpcGxlKSB7CisgIERybU1ldHJpY0dyb3VwIGhpZGxNZXRyaWNHcm91cCA9CisgICAgICB7IHsgeworICAgICAgICAgICAgICAib3Blbl9zZXNzaW9uX29rIiwKKyAgICAgICAgICAgICAgeyB7ICJzdGF0dXMiLCBEcm1NZXRyaWNHcm91cDo6VmFsdWVUeXBlOjpJTlQ2NF9UWVBFLAorICAgICAgICAgICAgICAgICAgKGludDY0X3QpIFN0YXR1czo6T0ssIDAuMCwgIiIgfSB9LAorICAgICAgICAgICAgICB7IHsgImNvdW50IiwgRHJtTWV0cmljR3JvdXA6OlZhbHVlVHlwZTo6SU5UNjRfVFlQRSwgMywgMC4wLCAiIiB9IH0KKyAgICAgICAgICB9LAorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgImNsb3NlX3Nlc3Npb25fbm90X29wZW5lZCIsCisgICAgICAgICAgICAgIHsgeyAic3RhdHVzIiwgRHJtTWV0cmljR3JvdXA6OlZhbHVlVHlwZTo6SU5UNjRfVFlQRSwKKyAgICAgICAgICAgICAgICAgIChpbnQ2NF90KSBTdGF0dXM6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQsIDAuMCwgIiIgfSB9LAorICAgICAgICAgICAgICB7IHsgImNvdW50IiwgRHJtTWV0cmljR3JvdXA6OlZhbHVlVHlwZTo6SU5UNjRfVFlQRSwgNywgMC4wLCAiIiB9IH0KKyAgICAgICAgICB9IH0gfTsKKworICBQZXJzaXN0YWJsZUJ1bmRsZSBidW5kbGVNZXRyaWNHcm91cHM7CisgIEFTU0VSVF9FUShPSywgTWVkaWFEcm1NZXRyaWNzOjpIaWRsTWV0cmljc1RvQnVuZGxlKGhpZGxfdmVjPERybU1ldHJpY0dyb3VwPih7aGlkbE1ldHJpY0dyb3VwfSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidW5kbGVNZXRyaWNHcm91cHMpKTsKKyAgQVNTRVJUX0VRKDFVLCBidW5kbGVNZXRyaWNHcm91cHMuc2l6ZSgpKTsKKyAgUGVyc2lzdGFibGVCdW5kbGUgYnVuZGxlTWV0cmljR3JvdXA7CisgIEFTU0VSVF9UUlVFKGJ1bmRsZU1ldHJpY0dyb3Vwcy5nZXRQZXJzaXN0YWJsZUJ1bmRsZShTdHJpbmcxNigiWzBdIiksICZidW5kbGVNZXRyaWNHcm91cCkpOworICBBU1NFUlRfRVEoMlUsIGJ1bmRsZU1ldHJpY0dyb3VwLnNpemUoKSk7CisKKyAgLy8gVmVyaWZ5IGVhY2ggbWV0cmljLgorICBQZXJzaXN0YWJsZUJ1bmRsZSBtZXRyaWM7CisgIEFTU0VSVF9UUlVFKGJ1bmRsZU1ldHJpY0dyb3VwLmdldFBlcnNpc3RhYmxlQnVuZGxlKFN0cmluZzE2KCJvcGVuX3Nlc3Npb25fb2siKSwgJm1ldHJpYykpOworICBQZXJzaXN0YWJsZUJ1bmRsZSBtZXRyaWNJbnN0YW5jZTsKKyAgQVNTRVJUX1RSVUUobWV0cmljLmdldFBlcnNpc3RhYmxlQnVuZGxlKFN0cmluZzE2KCJbMF0iKSwgJm1ldHJpY0luc3RhbmNlKSk7CisgIGludDY0X3QgdmFsdWUgPSAwOworICBBU1NFUlRfVFJVRShtZXRyaWNJbnN0YW5jZS5nZXRMb25nKFN0cmluZzE2KCJjb3VudCIpLCAmdmFsdWUpKTsKKyAgQVNTRVJUX0VRKDMsIHZhbHVlKTsKKyAgUGVyc2lzdGFibGVCdW5kbGUgYXR0cmlidXRlQnVuZGxlOworICBBU1NFUlRfVFJVRShtZXRyaWNJbnN0YW5jZS5nZXRQZXJzaXN0YWJsZUJ1bmRsZShTdHJpbmcxNigiYXR0cmlidXRlcyIpLCAmYXR0cmlidXRlQnVuZGxlKSk7CisgIEFTU0VSVF9UUlVFKGF0dHJpYnV0ZUJ1bmRsZS5nZXRMb25nKFN0cmluZzE2KCJzdGF0dXMiKSwgJnZhbHVlKSk7CisgIEFTU0VSVF9FUSgoaW50NjRfdCkgU3RhdHVzOjpPSywgdmFsdWUpOworCisgIEFTU0VSVF9UUlVFKGJ1bmRsZU1ldHJpY0dyb3VwLmdldFBlcnNpc3RhYmxlQnVuZGxlKFN0cmluZzE2KCJjbG9zZV9zZXNzaW9uX25vdF9vcGVuZWQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1ldHJpYykpOworICBBU1NFUlRfVFJVRShtZXRyaWMuZ2V0UGVyc2lzdGFibGVCdW5kbGUoU3RyaW5nMTYoIlswXSIpLCAmbWV0cmljSW5zdGFuY2UpKTsKKyAgQVNTRVJUX1RSVUUobWV0cmljSW5zdGFuY2UuZ2V0TG9uZyhTdHJpbmcxNigiY291bnQiKSwgJnZhbHVlKSk7CisgIEFTU0VSVF9FUSg3LCB2YWx1ZSk7CisgIEFTU0VSVF9UUlVFKG1ldHJpY0luc3RhbmNlLmdldFBlcnNpc3RhYmxlQnVuZGxlKFN0cmluZzE2KCJhdHRyaWJ1dGVzIiksICZhdHRyaWJ1dGVCdW5kbGUpKTsKKyAgdmFsdWUgPSAwOworICBBU1NFUlRfVFJVRShhdHRyaWJ1dGVCdW5kbGUuZ2V0TG9uZyhTdHJpbmcxNigic3RhdHVzIiksICZ2YWx1ZSkpOworICBBU1NFUlRfRVEoKGludDY0X3QpIFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRCwgdmFsdWUpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0V2ZW50TWV0cmljX3Rlc3QuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0V2ZW50TWV0cmljX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNmM0ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGlibWVkaWFkcm0vdGVzdHMvRXZlbnRNZXRyaWNfdGVzdC5jcHAKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSAiRXZlbnRNZXRyaWMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFVuaXQgdGVzdHMgZm9yIHRoZSBFdmVudE1ldHJpYyBjbGFzcy4KKyAqLworCitURVNUKEV2ZW50TWV0cmljVGVzdCwgSW50RGF0YVR5cGVFbXB0eSkgeworICBFdmVudE1ldHJpYzxpbnQ+IG1ldHJpYygiTXlNZXRyaWNOYW1lIiwgIk1ldHJpY0F0dHJpYnV0ZU5hbWUiKTsKKworICBzdGQ6Om1hcDxpbnQsIEV2ZW50U3RhdGlzdGljcz4gdmFsdWVzOworCisgIG1ldHJpYy5FeHBvcnRWYWx1ZXMoCisgICAgICBbJl0gKGludCBhdHRyaWJ1dGVfdmFsdWUsIGNvbnN0IEV2ZW50U3RhdGlzdGljcyYgdmFsdWUpIHsKKyAgICAgICAgICB2YWx1ZXNbYXR0cmlidXRlX3ZhbHVlXSA9IHZhbHVlOworICAgICAgfSk7CisKKyAgRVhQRUNUX1RSVUUodmFsdWVzLmVtcHR5KCkpOworfQorCitURVNUKEV2ZW50TWV0cmljVGVzdCwgSW50RGF0YVR5cGUpIHsKKyAgRXZlbnRNZXRyaWM8aW50PiBtZXRyaWMoIk15TWV0cmljTmFtZSIsICJNZXRyaWNBdHRyaWJ1dGVOYW1lIik7CisKKyAgc3RkOjptYXA8aW50LCBFdmVudFN0YXRpc3RpY3M+IHZhbHVlczsKKworICBtZXRyaWMuUmVjb3JkKDQsIDcpOworICBtZXRyaWMuUmVjb3JkKDUsIDgpOworICBtZXRyaWMuUmVjb3JkKDUsIDgpOworICBtZXRyaWMuUmVjb3JkKDUsIDgpOworICBtZXRyaWMuUmVjb3JkKDYsIDgpOworICBtZXRyaWMuUmVjb3JkKDYsIDgpOworICBtZXRyaWMuUmVjb3JkKDYsIDgpOworCisgIG1ldHJpYy5FeHBvcnRWYWx1ZXMoCisgICAgICBbJl0gKGludCBhdHRyaWJ1dGVfdmFsdWUsIGNvbnN0IEV2ZW50U3RhdGlzdGljcyYgdmFsdWUpIHsKKyAgICAgICAgICB2YWx1ZXNbYXR0cmlidXRlX3ZhbHVlXSA9IHZhbHVlOworICAgICAgfSk7CisKKyAgQVNTRVJUX0VRKDJ1LCB2YWx1ZXMuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDQsIHZhbHVlc1s3XS5taW4pOworICBFWFBFQ1RfRVEoNCwgdmFsdWVzWzddLm1heCk7CisgIEVYUEVDVF9FUSg0LCB2YWx1ZXNbN10ubWVhbik7CisgIEVYUEVDVF9FUSgxLCB2YWx1ZXNbN10uY291bnQpOworCisgIEVYUEVDVF9FUSg1LCB2YWx1ZXNbOF0ubWluKTsKKyAgRVhQRUNUX0VRKDYsIHZhbHVlc1s4XS5tYXgpOworICAvLyBUaGlzIGlzIGFuIGFwcHJveGltYXRlIHZhbHVlIGJlY2F1c2Ugb2YgdGhlIHRlY2huaXF1ZSB3ZSdyZSB1c2luZy4KKyAgRVhQRUNUX05FQVIoNS41LCB2YWx1ZXNbOF0ubWVhbiwgMC4yKTsKKyAgRVhQRUNUX0VRKDYsIHZhbHVlc1s4XS5jb3VudCk7Cit9CisKK1RFU1QoRXZlbnRNZXRyaWNUZXN0LCBTdHJpbmdEYXRhVHlwZSkgeworICBFdmVudE1ldHJpYzxzdGQ6OnN0cmluZz4gbWV0cmljKCJNeU1ldHJpY05hbWUiLCAiTWV0cmljQXR0cmlidXRlTmFtZSIpOworCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBFdmVudFN0YXRpc3RpY3M+IHZhbHVlczsKKworICBtZXRyaWMuUmVjb3JkKDEsICJhIik7CisgIG1ldHJpYy5SZWNvcmQoMiwgImIiKTsKKyAgbWV0cmljLlJlY29yZCgyLCAiYiIpOworICBtZXRyaWMuUmVjb3JkKDMsICJiIik7CisgIG1ldHJpYy5SZWNvcmQoMywgImIiKTsKKworICBtZXRyaWMuRXhwb3J0VmFsdWVzKAorICAgICAgWyZdIChzdGQ6OnN0cmluZyBhdHRyaWJ1dGVfdmFsdWUsIGNvbnN0IEV2ZW50U3RhdGlzdGljcyYgdmFsdWUpIHsKKyAgICAgICAgICB2YWx1ZXNbYXR0cmlidXRlX3ZhbHVlXSA9IHZhbHVlOworICAgICAgfSk7CisKKyAgQVNTRVJUX0VRKDJ1LCB2YWx1ZXMuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEsIHZhbHVlc1siYSJdLm1pbik7CisgIEVYUEVDVF9FUSgxLCB2YWx1ZXNbImEiXS5tYXgpOworICBFWFBFQ1RfRVEoMSwgdmFsdWVzWyJhIl0ubWVhbik7CisgIEVYUEVDVF9FUSgxLCB2YWx1ZXNbImEiXS5jb3VudCk7CisKKyAgRVhQRUNUX0VRKDIsIHZhbHVlc1siYiJdLm1pbik7CisgIEVYUEVDVF9FUSgzLCB2YWx1ZXNbImIiXS5tYXgpOworICBFWFBFQ1RfTkVBUigyLjUsIHZhbHVlc1siYiJdLm1lYW4sIDAuMik7CisgIEVYUEVDVF9FUSg0LCB2YWx1ZXNbImIiXS5jb3VudCk7Cit9CisKKy8vIEhlbHBlciBjbGFzcyB0aGF0IGFsbG93cyB1cyB0byBtb2NrIHRoZSBjbG9jay4KK3RlbXBsYXRlPHR5cGVuYW1lIEF0dHJpYnV0ZVR5cGU+CitjbGFzcyBNb2NrRXZlbnRUaW1lciA6IHB1YmxpYyBFdmVudFRpbWVyPEF0dHJpYnV0ZVR5cGU+IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IE1vY2tFdmVudFRpbWVyKG5zZWNzX3QgdGltZV9kZWx0YV9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRNZXRyaWM8QXR0cmlidXRlVHlwZT4qIG1ldHJpYykKKyAgICAgIDogRXZlbnRUaW1lcjxBdHRyaWJ1dGVUeXBlPihtZXRyaWMpIHsKKyAgICAvLyBQcmV0ZW5kIHRoZSBldmVudCBzdGFydGVkIGVhcmxpZXIuCisgICAgdGhpcy0+c3RhcnRfdGltZV8gPSBzeXN0ZW1UaW1lKCkgLSB0aW1lX2RlbHRhX25zOworICB9Cit9OworCitURVNUKEV2ZW50VGltZXJUZXN0LCBJbnREYXRhVHlwZSkgeworICBFdmVudE1ldHJpYzxpbnQ+IG1ldHJpYygiTXlNZXRyaWNOYW1lIiwgIk1ldHJpY0F0dHJpYnV0ZU5hbWUiKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworICAgIHsKKyAgICAgIC8vIEFkZCBhIG1vY2sgdGltZSBkZWx0YS4KKyAgICAgIE1vY2tFdmVudFRpbWVyPGludD4gbWV0cmljX3RpbWVyKGkgKiAxMDAwMDAwLCAmbWV0cmljKTsKKyAgICAgIG1ldHJpY190aW1lci5TZXRBdHRyaWJ1dGUoaSAlIDIpOworICAgIH0KKyAgfQorCisgIHN0ZDo6bWFwPGludCwgRXZlbnRTdGF0aXN0aWNzPiB2YWx1ZXM7CisgIG1ldHJpYy5FeHBvcnRWYWx1ZXMoCisgICAgICBbJl0gKGludCBhdHRyaWJ1dGVfdmFsdWUsIGNvbnN0IEV2ZW50U3RhdGlzdGljcyYgdmFsdWUpIHsKKyAgICAgICAgICB2YWx1ZXNbYXR0cmlidXRlX3ZhbHVlXSA9IHZhbHVlOworICAgICAgfSk7CisKKyAgQVNTRVJUX0VRKDJ1LCB2YWx1ZXMuc2l6ZSgpKTsKKyAgRVhQRUNUX0xUKHZhbHVlc1swXS5taW4sIHZhbHVlc1swXS5tYXgpOworICBFWFBFQ1RfR0UoNDAwMCwgdmFsdWVzWzBdLm1heCk7CisgIEVYUEVDVF9HVCh2YWx1ZXNbMF0ubWVhbiwgdmFsdWVzWzBdLm1pbik7CisgIEVYUEVDVF9MRSh2YWx1ZXNbMF0ubWVhbiwgdmFsdWVzWzBdLm1heCk7CisgIEVYUEVDVF9FUSgzLCB2YWx1ZXNbMF0uY291bnQpOworCisgIEVYUEVDVF9MVCh2YWx1ZXNbMV0ubWluLCB2YWx1ZXNbMV0ubWF4KTsKKyAgRVhQRUNUX0dFKDMwMDAsIHZhbHVlc1sxXS5tYXgpOworICBFWFBFQ1RfR1QodmFsdWVzWzFdLm1lYW4sIHZhbHVlc1sxXS5taW4pOworICBFWFBFQ1RfTEUodmFsdWVzWzFdLm1lYW4sIHZhbHVlc1sxXS5tYXgpOworICBFWFBFQ1RfRVEoMiwgdmFsdWVzWzFdLmNvdW50KTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmNwcCBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmNwcAppbmRleCBlMjc2MzFmLi43M2VkOGMzIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5jcHAKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlDYXNQbHVnaW4uY3BwCkBAIC01NSw3ICs1NSw3IEBACiAKIHN0YXR1c190IENsZWFyS2V5Q2FzRmFjdG9yeTo6Y3JlYXRlUGx1Z2luKAogICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwKLSAgICAgICAgdWludDY0X3QgYXBwRGF0YSwKKyAgICAgICAgdm9pZCAqYXBwRGF0YSwKICAgICAgICAgQ2FzUGx1Z2luQ2FsbGJhY2sgY2FsbGJhY2ssCiAgICAgICAgIENhc1BsdWdpbiAqKnBsdWdpbikgewogICAgIGlmICghaXNTeXN0ZW1JZFN1cHBvcnRlZChDQV9zeXN0ZW1faWQpKSB7CkBAIC04Myw3ICs4Myw3IEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIENsZWFyS2V5Q2FzUGx1Z2luOjpDbGVhcktleUNhc1BsdWdpbigKLSAgICAgICAgdWludDY0X3QgYXBwRGF0YSwgQ2FzUGx1Z2luQ2FsbGJhY2sgY2FsbGJhY2spCisgICAgICAgIHZvaWQgKmFwcERhdGEsIENhc1BsdWdpbkNhbGxiYWNrIGNhbGxiYWNrKQogICAgIDogbUNhbGxiYWNrKGNhbGxiYWNrKSwgbUFwcERhdGEoYXBwRGF0YSkgewogICAgIEFMT0dWKCJDVE9SIik7CiB9CkBAIC0zNDcsNiArMzQ3LDkgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX0NBU19DQU5OT1RfSEFORExFOwogICAgIH0KIAorICAgIHNjcmFtYmxpbmdDb250cm9sID0gKERlc2NyYW1ibGVyUGx1Z2luOjpTY3JhbWJsaW5nQ29udHJvbCkKKyAgICAgICAgKHNjcmFtYmxpbmdDb250cm9sICYgRGVzY3JhbWJsZXJQbHVnaW46OmtTY3JhbWJsaW5nX01hc2tfS2V5KTsKKwogICAgIEFFU19LRVkgY29udGVudEtleTsKIAogICAgIGlmIChzY3JhbWJsaW5nQ29udHJvbCAhPSBEZXNjcmFtYmxlclBsdWdpbjo6a1NjcmFtYmxpbmdfVW5zY3JhbWJsZWQpIHsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmggYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5oCmluZGV4IGI3MTM0ZTQuLjQyY2ZiOGYgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmgKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlDYXNQbHVnaW4uaApAQCAtNDQsNyArNDQsNyBAQAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q2FzUGx1Z2luRGVzY3JpcHRvcj4gKmRlc2NyaXB0b3JzKSBjb25zdCBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVBsdWdpbigKICAgICAgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLAotICAgICAgICAgICAgdWludDY0X3QgYXBwRGF0YSwKKyAgICAgICAgICAgIHZvaWQgKmFwcERhdGEsCiAgICAgICAgICAgICBDYXNQbHVnaW5DYWxsYmFjayBjYWxsYmFjaywKICAgICAgICAgICAgIENhc1BsdWdpbiAqKnBsdWdpbikgb3ZlcnJpZGU7CiB9OwpAQCAtNjIsNyArNjIsNyBAQAogCiBjbGFzcyBDbGVhcktleUNhc1BsdWdpbiA6IHB1YmxpYyBDYXNQbHVnaW4gewogcHVibGljOgotICAgIENsZWFyS2V5Q2FzUGx1Z2luKHVpbnQ2NF90IGFwcERhdGEsIENhc1BsdWdpbkNhbGxiYWNrIGNhbGxiYWNrKTsKKyAgICBDbGVhcktleUNhc1BsdWdpbih2b2lkICphcHBEYXRhLCBDYXNQbHVnaW5DYWxsYmFjayBjYWxsYmFjayk7CiAgICAgdmlydHVhbCB+Q2xlYXJLZXlDYXNQbHVnaW4oKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJpdmF0ZURhdGEoCkBAIC05NCw3ICs5NCw3IEBACiAgICAgTXV0ZXggbUtleUZldGNoZXJMb2NrOwogICAgIHN0ZDo6dW5pcXVlX3B0cjxLZXlGZXRjaGVyPiBtS2V5RmV0Y2hlcjsKICAgICBDYXNQbHVnaW5DYWxsYmFjayBtQ2FsbGJhY2s7Ci0gICAgdWludDY0X3QgbUFwcERhdGE7CisgICAgdm9pZCogbUFwcERhdGE7CiB9OwogCiBjbGFzcyBDbGVhcktleURlc2NyYW1ibGVyUGx1Z2luIDogcHVibGljIERlc2NyYW1ibGVyUGx1Z2luIHsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5RmV0Y2hlci5jcHAgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUZldGNoZXIuY3BwCmluZGV4IGNiNjlmOTEuLmVhYTMzOTAgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5RmV0Y2hlci5jcHAKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlGZXRjaGVyLmNwcApAQCAtODksNyArODksNyBAQAogICAgIC8vIGFzc2V0X2lkIGNoYW5nZS4gSWYgaXQgc2VuZHMgYW4gRWNtQ29udGFpbmVyIHdpdGggMiBFY21zIHdpdGggZGlmZmVyZW50CiAgICAgLy8gYXNzZXRfaWRzIChvbGQgYW5kIG5ldykgdGhlbiBpdCBtaWdodCBiZSBiZXN0IHRvIHByZWZldGNoIHRoZSBFbW0uCiAgICAgaWYgKChhc3NldF8uaWQoKSAhPSAwKSAmJiAoKmFzc2V0X2lkICE9IGFzc2V0Xy5pZCgpKSkgewotICAgICAgICBBTE9HVygiQXNzZXRfaWQgY2hhbmdlIGZyb20gJSIgUFJJdTY0ICIgdG8gJSIgUFJJdTY0LCBhc3NldF8uaWQoKSwgKmFzc2V0X2lkKTsKKyAgICAgICAgQUxPR1coIkFzc2V0X2lkIGNoYW5nZSBmcm9tICVsbHUgdG8gJSIgUFJJdTY0LCBhc3NldF8uaWQoKSwgKmFzc2V0X2lkKTsKICAgICAgICAgYXNzZXRfLkNsZWFyKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVNlc3Npb25MaWJyYXJ5LmNwcCBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5U2Vzc2lvbkxpYnJhcnkuY3BwCmluZGV4IGZhZWEwMDguLjRiNDA1MWQgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5U2Vzc2lvbkxpYnJhcnkuY3BwCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5U2Vzc2lvbkxpYnJhcnkuY3BwCkBAIC05NSw3ICs5NSw3IEBACiB2b2lkIENsZWFyS2V5U2Vzc2lvbkxpYnJhcnk6OmRlc3Ryb3lQbHVnaW4oQ2FzUGx1Z2luICpwbHVnaW4pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2Vzc2lvbnNMb2NrKTsKIAotICAgIGZvciAoc3NpemVfdCBpbmRleCA9IG1JRFRvU2Vzc2lvbk1hcC5zaXplKCkgLSAxOyBpbmRleCA+PSAwOyBpbmRleC0tKSB7CisgICAgZm9yIChzc2l6ZV90IGluZGV4ID0gKHNzaXplX3QpbUlEVG9TZXNzaW9uTWFwLnNpemUoKSAtIDE7IGluZGV4ID49IDA7IGluZGV4LS0pIHsKICAgICAgICAgc3A8Q2xlYXJLZXlDYXNTZXNzaW9uPiBzZXNzaW9uID0gbUlEVG9TZXNzaW9uTWFwLnZhbHVlQXQoaW5kZXgpOwogICAgICAgICBpZiAoc2Vzc2lvbi0+Z2V0UGx1Z2luKCkgPT0gcGx1Z2luKSB7CiAgICAgICAgICAgICBtSURUb1Nlc3Npb25NYXAucmVtb3ZlSXRlbXNBdChpbmRleCk7CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9Kc29uQXNzZXRMb2FkZXIuY3BwIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvSnNvbkFzc2V0TG9hZGVyLmNwcAppbmRleCA2ZTEwMDRjLi5lZThkYmEzIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9Kc29uQXNzZXRMb2FkZXIuY3BwCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0pzb25Bc3NldExvYWRlci5jcHAKQEAgLTM2LDggKzM2LDYgQEAKIGNvbnN0IFN0cmluZzgga0Nhc1R5cGVUYWcoImNhc190eXBlIik7CiBjb25zdCBTdHJpbmc4IGtCYXNlNjRQYWRkaW5nKCI9Iik7CiAKLWNvbnN0IHVpbnQzMl90IGtLZXlMZW5ndGggPSAxNjsKLQogSnNvbkFzc2V0TG9hZGVyOjpKc29uQXNzZXRMb2FkZXIoKSB7CiB9CiAKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L2VjbV9nZW5lcmF0b3IuY3BwIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvZWNtX2dlbmVyYXRvci5jcHAKaW5kZXggN2QyOTY1OS4uMjE4Y2UzNSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvZWNtX2dlbmVyYXRvci5jcHAKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvZWNtX2dlbmVyYXRvci5jcHAKQEAgLTM4LDggKzM4LDYgQEAKIGNvbnN0IHVpbnQxNl90IGtUb3RhbEVjbVNpemUgPQogICAgICAgICBrRWNtQ2xlYXJGaWVsZHNTaXplICsga0NvbnRlbnRLZXlCeXRlU2l6ZTsgLy8gY2xlYXIgZmllbGRzICsgY2xlYXIga2V5CiAKLWNvbnN0IHVpbnQzMl90IGtLZXlMZW5ndGggPSAxNjsKLQogI2RlZmluZSBVTkFMSUdORURfTE9BRDMyKF9wKSAoKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4oX3ApKQogCiBzdGF0aWMgdWludDMyX3QgTG9hZDMyKGNvbnN0IHZvaWQgKnApIHsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0NsZWFyS2V5RmV0Y2hlclRlc3QuY3BwIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQ2xlYXJLZXlGZXRjaGVyVGVzdC5jcHAKaW5kZXggYWNlMDg2YS4uZDEyY2ZlYiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQ2xlYXJLZXlGZXRjaGVyVGVzdC5jcHAKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQ2xlYXJLZXlGZXRjaGVyVGVzdC5jcHAKQEAgLTkzLDcgKzkzLDcgQEAKICAgICB1aW50NjRfdCBhc3NldF9pZDsKICAgICBzdGQ6OnZlY3RvcjxLZXlGZXRjaGVyOjpLZXlJbmZvPiBrZXlzOwogICAgIEVYUEVDVF9FUShPSywgZmV0Y2hlci5PYnRhaW5LZXkoZWNtXywgJmFzc2V0X2lkLCAma2V5cykpOwotICAgIEVYUEVDVF9FUSgyLCBrZXlzLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKDJVLCBrZXlzLnNpemUoKSk7CiAgICAgRVhQRUNUX0VRKDAsIGtleXNbMF0ua2V5X2lkKTsKICAgICBFWFBFQ1RfRVEoY29udGVudF9rZXlfWzBdLT5zaXplKCksIGtleXNbMF0ua2V5X2J5dGVzLT5zaXplKCkpOwogICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoY29udGVudF9rZXlfWzBdLT5kYXRhKCksCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL01vY2tDYXNQbHVnaW4uY3BwIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9Nb2NrQ2FzUGx1Z2luLmNwcAppbmRleCAxOGNkOWE0Li44NDA0YTgzIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL01vY2tDYXNQbHVnaW4uY3BwCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svTW9ja0Nhc1BsdWdpbi5jcHAKQEAgLTQ5LDggKzQ5LDggQEAKIAogc3RhdHVzX3QgTW9ja0Nhc0ZhY3Rvcnk6OmNyZWF0ZVBsdWdpbigKICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsCi0gICAgICAgIHVpbnQ2NF90IGFwcERhdGEsCi0gICAgICAgIENhc1BsdWdpbkNhbGxiYWNrIGNhbGxiYWNrLAorICAgICAgICB2b2lkKiAvKmFwcERhdGEqLywKKyAgICAgICAgQ2FzUGx1Z2luQ2FsbGJhY2sgLypjYWxsYmFjayovLAogICAgICAgICBDYXNQbHVnaW4gKipwbHVnaW4pIHsKICAgICBpZiAoIWlzU3lzdGVtSWRTdXBwb3J0ZWQoQ0Ffc3lzdGVtX2lkKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtOTgsNyArOTgsNyBAQAogICAgIE1vY2tTZXNzaW9uTGlicmFyeTo6Z2V0KCktPmRlc3Ryb3lQbHVnaW4odGhpcyk7CiB9CiAKLXN0YXR1c190IE1vY2tDYXNQbHVnaW46OnNldFByaXZhdGVEYXRhKGNvbnN0IENhc0RhdGEgJmRhdGEpIHsKK3N0YXR1c190IE1vY2tDYXNQbHVnaW46OnNldFByaXZhdGVEYXRhKGNvbnN0IENhc0RhdGEmIC8qZGF0YSovKSB7CiAgICAgQUxPR1YoInNldFByaXZhdGVEYXRhIik7CiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMTIzLDcgKzEyMyw3IEBACiB9CiAKIHN0YXR1c190IE1vY2tDYXNQbHVnaW46OnNldFNlc3Npb25Qcml2YXRlRGF0YSgKLSAgICAgICAgY29uc3QgQ2FzU2Vzc2lvbklkICZzZXNzaW9uSWQsIGNvbnN0IENhc0RhdGEgJmRhdGEpIHsKKyAgICAgICAgY29uc3QgQ2FzU2Vzc2lvbklkICZzZXNzaW9uSWQsIGNvbnN0IENhc0RhdGEmIC8qZGF0YSovKSB7CiAgICAgQUxPR1YoInNldFNlc3Npb25Qcml2YXRlRGF0YTogc2Vzc2lvbklkPSVzIiwKICAgICAgICAgICAgIGFycmF5VG9TdHJpbmcoc2Vzc2lvbklkKS5zdHJpbmcoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwpAQCAtMTQ2LDcgKzE0Niw3IEBACiAgICAgaWYgKHNlc3Npb24gPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBBTE9HVigiRUNNOiBzaXplPSVkIiwgZWNtLnNpemUoKSk7CisgICAgQUxPR1YoIkVDTTogc2l6ZT0lenUiLCBlY20uc2l6ZSgpKTsKICAgICBBTE9HVigiRUNNOiBkYXRhPSVzIiwgYXJyYXlUb1N0cmluZyhlY20pLnN0cmluZygpKTsKIAogICAgIHJldHVybiBPSzsKQEAgLTE1NiwxNCArMTU2LDE0IEBACiAgICAgQUxPR1YoInByb2Nlc3NFbW0iKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAKLSAgICBBTE9HVigiRU1NOiBzaXplPSVkIiwgZW1tLnNpemUoKSk7CisgICAgQUxPR1YoIkVNTTogc2l6ZT0lenUiLCBlbW0uc2l6ZSgpKTsKICAgICBBTE9HVigiRU1NOiBkYXRhPSVzIiwgYXJyYXlUb1N0cmluZyhlbW0pLnN0cmluZygpKTsKIAogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgTW9ja0Nhc1BsdWdpbjo6c2VuZEV2ZW50KAotICAgICAgICBpbnQzMl90IGV2ZW50LCBpbnQgYXJnLCBjb25zdCBDYXNEYXRhICZldmVudERhdGEpIHsKKyAgICAgICAgaW50MzJfdCBldmVudCwgaW50IC8qYXJnKi8sIGNvbnN0IENhc0RhdGEmIC8qZXZlbnREYXRhKi8pIHsKICAgICBBTE9HVigic2VuZEV2ZW50OiBldmVudD0lZCIsIGV2ZW50KTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAKQEAgLTE3OCw3ICsxNzgsNyBAQAogfQogCiBzdGF0dXNfdCBNb2NrQ2FzUGx1Z2luOjpyZWZyZXNoRW50aXRsZW1lbnRzKAotICAgICAgICBpbnQzMl90IHJlZnJlc2hUeXBlLCBjb25zdCBDYXNEYXRhICZyZWZyZXNoRGF0YSkgeworICAgICAgICBpbnQzMl90IC8qcmVmcmVzaFR5cGUqLywgY29uc3QgQ2FzRGF0YSAmcmVmcmVzaERhdGEpIHsKICAgICBBTE9HVigicmVmcmVzaEVudGl0bGVtZW50czogcmVmcmVzaERhdGE9JXMiLCBhcnJheVRvU3RyaW5nKHJlZnJlc2hEYXRhKS5zdHJpbmcoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogCkBAIC0yMTYsNyArMjE2LDcgQEAKICAgICAgICAgaW50MzJfdCBzcmNPZmZzZXQsCiAgICAgICAgIHZvaWQgKmRzdFB0ciwKICAgICAgICAgaW50MzJfdCBkc3RPZmZzZXQsCi0gICAgICAgIEFTdHJpbmcgKmVycm9yRGV0YWlsTXNnKSB7CisgICAgICAgIEFTdHJpbmcqIC8qZXJyb3JEZXRhaWxNc2cqLykgewogICAgIEFMT0dWKCJNb2NrRGVzY3JhbWJsZXJQbHVnaW46OmRlc2NyYW1ibGUoc2VjdXJlPSVkLCBzY3RybD0lZCwiCiAgICAgICAgICAgInN1YlNhbXBsZXM9JXMsIHNyY1B0cj0lcCwgZHN0UHRyPSVwLCBzcmNPZmZzZXQ9JWQsIGRzdE9mZnNldD0lZCkiLAogICAgICAgICAgIChpbnQpc2VjdXJlLCAoaW50KXNjcmFtYmxpbmdDb250cm9sLApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9Nb2NrQ2FzUGx1Z2luLmggYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL01vY2tDYXNQbHVnaW4uaAppbmRleCA5NjMyNDkyLi44MTA2OTkwIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL01vY2tDYXNQbHVnaW4uaAorKysgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL01vY2tDYXNQbHVnaW4uaApAQCAtMzksNyArMzksNyBAQAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q2FzUGx1Z2luRGVzY3JpcHRvcj4gKmRlc2NyaXB0b3JzKSBjb25zdCBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVBsdWdpbigKICAgICAgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLAotICAgICAgICAgICAgdWludDY0X3QgYXBwRGF0YSwKKyAgICAgICAgICAgIHZvaWQgKmFwcERhdGEsCiAgICAgICAgICAgICBDYXNQbHVnaW5DYWxsYmFjayBjYWxsYmFjaywKICAgICAgICAgICAgIENhc1BsdWdpbiAqKnBsdWdpbikgb3ZlcnJpZGU7CiB9OwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQW5kcm9pZC5icCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NzNmY2YuLjAwMDAwMDAKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vCi0vLyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLWNjX2xpYnJhcnlfc2hhcmVkIHsKLSAgICBuYW1lOiAibGliZHJtY2xlYXJrZXlwbHVnaW4iLAotCi0gICAgc3JjczogWwotICAgICAgICAiQWVzQ3RyRGVjcnlwdG9yLmNwcCIsCi0gICAgICAgICJDbGVhcktleVVVSUQuY3BwIiwKLSAgICAgICAgIkNyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAiLAotICAgICAgICAiQ3J5cHRvRmFjdG9yeS5jcHAiLAotICAgICAgICAiQ3J5cHRvUGx1Z2luLmNwcCIsCi0gICAgICAgICJEcm1GYWN0b3J5LmNwcCIsCi0gICAgICAgICJEcm1QbHVnaW4uY3BwIiwKLSAgICAgICAgIkluaXREYXRhUGFyc2VyLmNwcCIsCi0gICAgICAgICJKc29uV2ViS2V5LmNwcCIsCi0gICAgICAgICJTZXNzaW9uLmNwcCIsCi0gICAgICAgICJTZXNzaW9uTGlicmFyeS5jcHAiLAotICAgICAgICAiVXRpbHMuY3BwIiwKLSAgICBdLAotCi0gICAgdmVuZG9yOiB0cnVlLAotICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogIm1lZGlhZHJtIiwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjcnlwdG8iLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAotICAgIF0sCi0KLSAgICBzdGF0aWNfbGliczogWyJsaWJqc21uIl0sCi0KLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIiwKLSAgICBdLAotCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCi0gICAgZXhwb3J0X3N0YXRpY19saWJfaGVhZGVyczogWyJsaWJqc21uIl0sCi19Ci0KLS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0vLyBCdWlsZCB1bml0IHRlc3RzCi0KLXN1YmRpcnMgPSBbInRlc3RzIl0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyeXB0b0ZhY3RvcnkuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvRmFjdG9yeS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYjY0YzMuLjAwMDAwMDAKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvRmFjdG9yeS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJDbGVhcktleUNyeXB0b1BsdWdpbiIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KLQotI2luY2x1ZGUgIkNyeXB0b0ZhY3RvcnkuaCIKLQotI2luY2x1ZGUgIkNsZWFyS2V5VVVJRC5oIgotI2luY2x1ZGUgIkNyeXB0b1BsdWdpbi5oIgotI2luY2x1ZGUgIlNlc3Npb24uaCIKLSNpbmNsdWRlICJTZXNzaW9uTGlicmFyeS5oIgotCi1uYW1lc3BhY2UgY2xlYXJrZXlkcm0gewotCi1ib29sIENyeXB0b0ZhY3Rvcnk6OmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pIGNvbnN0IHsKLSAgICByZXR1cm4gaXNDbGVhcktleVVVSUQodXVpZCk7Ci19Ci0KLWFuZHJvaWQ6OnN0YXR1c190IENyeXB0b0ZhY3Rvcnk6OmNyZWF0ZVBsdWdpbigKLSAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKLSAgICAgICAgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUsCi0gICAgICAgIGFuZHJvaWQ6OkNyeXB0b1BsdWdpbioqIHBsdWdpbikgewotICAgIGlmICghaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkpIHsKLSAgICAgICAgKnBsdWdpbiA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZDsKLSAgICBzZXNzaW9uSWQuYXBwZW5kQXJyYXkocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oZGF0YSksIHNpemUpOwotCi0gICAgQ3J5cHRvUGx1Z2luICpjbGVhcktleVBsdWdpbiA9IG5ldyBDcnlwdG9QbHVnaW4oc2Vzc2lvbklkKTsKLSAgICBhbmRyb2lkOjpzdGF0dXNfdCByZXN1bHQgPSBjbGVhcktleVBsdWdpbi0+Z2V0SW5pdFN0YXR1cygpOwotICAgIGlmIChyZXN1bHQgPT0gYW5kcm9pZDo6T0spIHsKLSAgICAgICAgKnBsdWdpbiA9IGNsZWFyS2V5UGx1Z2luOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRlbGV0ZSBjbGVhcktleVBsdWdpbjsKLSAgICAgICAgKnBsdWdpbiA9IE5VTEw7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1GYWN0b3J5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybUZhY3RvcnkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODMzMjFiLi4wMDAwMDAwCi0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybUZhY3RvcnkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiQ2xlYXJLZXlDcnlwdG9QbHVnaW4iCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLQotI2luY2x1ZGUgIkRybUZhY3RvcnkuaCIKLQotI2luY2x1ZGUgIkRybVBsdWdpbi5oIgotI2luY2x1ZGUgIkNsZWFyS2V5VVVJRC5oIgotI2luY2x1ZGUgIk1pbWVUeXBlLmgiCi0jaW5jbHVkZSAiU2Vzc2lvbkxpYnJhcnkuaCIKLQotbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKLQotYm9vbCBEcm1GYWN0b3J5Ojppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdKSB7Ci0gICAgcmV0dXJuIGlzQ2xlYXJLZXlVVUlEKHV1aWQpOwotfQotCi1ib29sIERybUZhY3Rvcnk6OmlzQ29udGVudFR5cGVTdXBwb3J0ZWQoY29uc3QgYW5kcm9pZDo6U3RyaW5nOCAmdHlwZSkgewotICAgIC8vIFRoaXMgc2hvdWxkIG1hdGNoIHRoZSB0eXBlcyBoYW5kZWQgYnkgSW5pdERhdGFQYXJzZXIuCi0gICAgcmV0dXJuIHR5cGUgPT0ga0lzb0JtZmZWaWRlb01pbWVUeXBlIHx8Ci0gICAgICAgIHR5cGUgPT0ga0lzb0JtZmZBdWRpb01pbWVUeXBlIHx8Ci0gICAgICAgIHR5cGUgPT0ga0NlbmNJbml0RGF0YUZvcm1hdCB8fAotICAgICAgICB0eXBlID09IGtXZWJtVmlkZW9NaW1lVHlwZSB8fAotICAgICAgICB0eXBlID09IGtXZWJtQXVkaW9NaW1lVHlwZSB8fAotICAgICAgICB0eXBlID09IGtXZWJtSW5pdERhdGFGb3JtYXQ7Ci19Ci0KLWFuZHJvaWQ6OnN0YXR1c190IERybUZhY3Rvcnk6OmNyZWF0ZURybVBsdWdpbigKLSAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKLSAgICAgICAgYW5kcm9pZDo6RHJtUGx1Z2luKiogcGx1Z2luKSB7Ci0gICAgaWYgKCFpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKSkgewotICAgICAgICAqcGx1Z2luID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICAqcGx1Z2luID0gbmV3IERybVBsdWdpbihTZXNzaW9uTGlicmFyeTo6Z2V0KCkpOwotICAgIHJldHVybiBhbmRyb2lkOjpPSzsKLX0KLQotfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1QbHVnaW4uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzA3ZDg3Li4wMDAwMDAwCi0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiQ2xlYXJLZXlDcnlwdG9QbHVnaW4iCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KLQotI2luY2x1ZGUgIkRybVBsdWdpbi5oIgotCi0jaW5jbHVkZSAiU2Vzc2lvbi5oIgotCi1uYW1lc3BhY2UgewotY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrU3RyZWFtaW5nKCJTdHJlYW1pbmciKTsKLWNvbnN0IGFuZHJvaWQ6OlN0cmluZzgga09mZmxpbmUoIk9mZmxpbmUiKTsKLWNvbnN0IGFuZHJvaWQ6OlN0cmluZzgga1RydWUoIlRydWUiKTsKLQotY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrUXVlcnlLZXlMaWNlbnNlVHlwZSgiTGljZW5zZVR5cGUiKTsKLSAgICAvLyBWYWx1ZTogIlN0cmVhbWluZyIgb3IgIk9mZmxpbmUiCi1jb25zdCBhbmRyb2lkOjpTdHJpbmc4IGtRdWVyeUtleVBsYXlBbGxvd2VkKCJQbGF5QWxsb3dlZCIpOwotICAgIC8vIFZhbHVlOiAiVHJ1ZSIgb3IgIkZhbHNlIgotY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrUXVlcnlLZXlSZW5ld0FsbG93ZWQoIlJlbmV3QWxsb3dlZCIpOwotICAgIC8vIFZhbHVlOiAiVHJ1ZSIgb3IgIkZhbHNlIgotfTsKLQotbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKLQotdXNpbmcgYW5kcm9pZDo6c3A7Ci0KLURybVBsdWdpbjo6RHJtUGx1Z2luKFNlc3Npb25MaWJyYXJ5KiBzZXNzaW9uTGlicmFyeSkKLSAgICAgICAgOiBtU2Vzc2lvbkxpYnJhcnkoc2Vzc2lvbkxpYnJhcnkpIHsKLSAgICBtUGxheVBvbGljeS5jbGVhcigpOwotfQotCi1zdGF0dXNfdCBEcm1QbHVnaW46Om9wZW5TZXNzaW9uKFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7Ci0gICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+Y3JlYXRlU2Vzc2lvbigpOwotICAgIHNlc3Npb25JZCA9IHNlc3Npb24tPnNlc3Npb25JZCgpOwotICAgIHJldHVybiBhbmRyb2lkOjpPSzsKLX0KLQotc3RhdHVzX3QgRHJtUGx1Z2luOjpjbG9zZVNlc3Npb24oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKLSAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbihzZXNzaW9uSWQpOwotICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKLSAgICB9Ci0gICAgaWYgKHNlc3Npb24uZ2V0KCkpIHsKLSAgICAgICAgbVNlc3Npb25MaWJyYXJ5LT5kZXN0cm95U2Vzc2lvbihzZXNzaW9uKTsKLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOwotICAgIH0KLSAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKLX0KLQotc3RhdHVzX3QgRHJtUGx1Z2luOjpnZXRLZXlSZXF1ZXN0KAotICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNjb3BlLAotICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAotICAgICAgICBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSwKLSAgICAgICAgS2V5VHlwZSBrZXlUeXBlLAotICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiYgb3B0aW9uYWxQYXJhbWV0ZXJzLAotICAgICAgICBWZWN0b3I8dWludDhfdD4mIHJlcXVlc3QsCi0gICAgICAgIFN0cmluZzgmIGRlZmF1bHRVcmwsCi0gICAgICAgIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUgKmtleVJlcXVlc3RUeXBlKSB7Ci0gICAgVU5VU0VEKG9wdGlvbmFsUGFyYW1ldGVycyk7Ci0gICAgaWYgKHNjb3BlLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgaWYgKGtleVR5cGUgIT0ga0tleVR5cGVfU3RyZWFtaW5nKSB7Ci0gICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKLSAgICB9Ci0KLSAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Jbml0aWFsOwotICAgIGRlZmF1bHRVcmwuY2xlYXIoKTsKLSAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbihzY29wZSk7Ci0gICAgaWYgKCFzZXNzaW9uLmdldCgpKSB7Ci0gICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOwotICAgIH0KLQotICAgIHJldHVybiBzZXNzaW9uLT5nZXRLZXlSZXF1ZXN0KGluaXREYXRhLCBtaW1lVHlwZSwgJnJlcXVlc3QpOwotfQotCi12b2lkIERybVBsdWdpbjo6c2V0UGxheVBvbGljeSgpIHsKLSAgICBtUGxheVBvbGljeS5jbGVhcigpOwotICAgIG1QbGF5UG9saWN5LmFkZChrUXVlcnlLZXlMaWNlbnNlVHlwZSwga1N0cmVhbWluZyk7Ci0gICAgbVBsYXlQb2xpY3kuYWRkKGtRdWVyeUtleVBsYXlBbGxvd2VkLCBrVHJ1ZSk7Ci0gICAgbVBsYXlQb2xpY3kuYWRkKGtRdWVyeUtleVJlbmV3QWxsb3dlZCwga1RydWUpOwotfQotCi1zdGF0dXNfdCBEcm1QbHVnaW46OnByb3ZpZGVLZXlSZXNwb25zZSgKLSAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzY29wZSwKLSAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiByZXNwb25zZSwKLSAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlTZXRJZCkgewotICAgIGlmIChzY29wZS5zaXplKCkgPT0gMCB8fCByZXNwb25zZS5zaXplKCkgPT0gMCkgewotICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOwotICAgIH0KLSAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbihzY29wZSk7Ci0gICAgaWYgKCFzZXNzaW9uLmdldCgpKSB7Ci0gICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOwotICAgIH0KLQotICAgIHNldFBsYXlQb2xpY3koKTsKLSAgICBzdGF0dXNfdCByZXMgPSBzZXNzaW9uLT5wcm92aWRlS2V5UmVzcG9uc2UocmVzcG9uc2UpOwotICAgIGlmIChyZXMgPT0gYW5kcm9pZDo6T0spIHsKLSAgICAgICAgLy8gVGhpcyBpcyBmb3IgdGVzdGluZyBBTWVkaWFEcm1fc2V0T25FdmVudExpc3RlbmVyIG9ubHkuCi0gICAgICAgIHNlbmRFdmVudChrRHJtUGx1Z2luRXZlbnRWZW5kb3JEZWZpbmVkLCAwLCAmc2NvcGUsIE5VTEwpOwotICAgICAgICBrZXlTZXRJZC5jbGVhcigpOwotICAgIH0KLSAgICByZXR1cm4gcmVzOwotfQotCi1zdGF0dXNfdCBEcm1QbHVnaW46OmdldFByb3BlcnR5U3RyaW5nKAotICAgICAgICBjb25zdCBTdHJpbmc4JiBuYW1lLCBTdHJpbmc4JiB2YWx1ZSkgY29uc3QgewotICAgIGlmIChuYW1lID09ICJ2ZW5kb3IiKSB7Ci0gICAgICAgIHZhbHVlID0gIkdvb2dsZSI7Ci0gICAgfSBlbHNlIGlmIChuYW1lID09ICJ2ZXJzaW9uIikgewotICAgICAgICB2YWx1ZSA9ICIxLjAiOwotICAgIH0gZWxzZSBpZiAobmFtZSA9PSAiZGVzY3JpcHRpb24iKSB7Ci0gICAgICAgIHZhbHVlID0gIkNsZWFyS2V5IENETSI7Ci0gICAgfSBlbHNlIGlmIChuYW1lID09ICJhbGdvcml0aG1zIikgewotICAgICAgICB2YWx1ZSA9ICIiOwotICAgIH0gZWxzZSBpZiAobmFtZSA9PSAibGlzdGVuZXJUZXN0U3VwcG9ydCIpIHsKLSAgICAgICAgdmFsdWUgPSAidHJ1ZSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkFwcCByZXF1ZXN0ZWQgdW5rbm93biBzdHJpbmcgcHJvcGVydHkgJXMiLCBuYW1lLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgIH0KLSAgICByZXR1cm4gYW5kcm9pZDo6T0s7Ci19Ci0KLXN0YXR1c190IERybVBsdWdpbjo6cXVlcnlLZXlTdGF0dXMoCi0gICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAotICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiYgaW5mb01hcCkgY29uc3QgewotCi0gICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCkgewotICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOwotICAgIH0KLQotICAgIGluZm9NYXAuY2xlYXIoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5UG9saWN5LnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGluZm9NYXAuYWRkKG1QbGF5UG9saWN5LmtleUF0KGkpLCBtUGxheVBvbGljeS52YWx1ZUF0KGkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOwotfQotfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1QbHVnaW4uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzdhNzA2Li4wMDAwMDAwCi0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0RybVBsdWdpbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIENMRUFSS0VZX0RSTV9QTFVHSU5fSF8KLSNkZWZpbmUgQ0xFQVJLRVlfRFJNX1BMVUdJTl9IXwotCi0jaW5jbHVkZSA8bWVkaWEvZHJtL0RybUFQSS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotI2luY2x1ZGUgIlNlc3Npb25MaWJyYXJ5LmgiCi0jaW5jbHVkZSAiVXRpbHMuaCIKLQotbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKLQotdXNpbmcgYW5kcm9pZDo6S2V5ZWRWZWN0b3I7Ci11c2luZyBhbmRyb2lkOjpMaXN0OwotdXNpbmcgYW5kcm9pZDo6c3RhdHVzX3Q7Ci11c2luZyBhbmRyb2lkOjpTdHJpbmc4OwotdXNpbmcgYW5kcm9pZDo6VmVjdG9yOwotCi1jbGFzcyBEcm1QbHVnaW4gOiBwdWJsaWMgYW5kcm9pZDo6RHJtUGx1Z2luIHsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBEcm1QbHVnaW4oU2Vzc2lvbkxpYnJhcnkqIHNlc3Npb25MaWJyYXJ5KTsKLQotICAgIHZpcnR1YWwgfkRybVBsdWdpbigpIHt9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5TZXNzaW9uKFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VTZXNzaW9uKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0S2V5UmVxdWVzdCgKLSAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2NvcGUsCi0gICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIG1pbWVUeXBlLAotICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgaW5pdERhdGFUeXBlLAotICAgICAgICAgICAgS2V5VHlwZSBrZXlUeXBlLAotICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4mIG9wdGlvbmFsUGFyYW1ldGVycywKLSAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgcmVxdWVzdCwKLSAgICAgICAgICAgIFN0cmluZzgmIGRlZmF1bHRVcmwsCi0gICAgICAgICAgICBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlICprZXlSZXF1ZXN0VHlwZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHByb3ZpZGVLZXlSZXNwb25zZSgKLSAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2NvcGUsCi0gICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHJlc3BvbnNlLAotICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlTZXRJZCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUtleXMoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKLSAgICAgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3RvcmVLZXlzKAotICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCi0gICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGtleVNldElkKSB7Ci0gICAgICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDAgfHwga2V5U2V0SWQuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlLZXlTdGF0dXMoCi0gICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwKLSAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+JiBpbmZvTWFwKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvdmlzaW9uUmVxdWVzdCgKLSAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNlcnRfdHlwZSwKLSAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNlcnRfYXV0aG9yaXR5LAotICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiByZXF1ZXN0LAotICAgICAgICAgICAgU3RyaW5nOCYgZGVmYXVsdFVybCkgewotICAgICAgICBVTlVTRUQoY2VydF90eXBlKTsKLSAgICAgICAgVU5VU0VEKGNlcnRfYXV0aG9yaXR5KTsKLSAgICAgICAgVU5VU0VEKHJlcXVlc3QpOwotICAgICAgICBVTlVTRUQoZGVmYXVsdFVybCk7Ci0gICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHByb3ZpZGVQcm92aXNpb25SZXNwb25zZSgKLSAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgcmVzcG9uc2UsCi0gICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIGNlcnRpZmljYXRlLAotICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiB3cmFwcGVkS2V5KSB7Ci0gICAgICAgIFVOVVNFRChjZXJ0aWZpY2F0ZSk7Ci0gICAgICAgIFVOVVNFRCh3cmFwcGVkS2V5KTsKLSAgICAgICAgaWYgKHJlc3BvbnNlLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAvLyBlbXB0eSByZXNwb25zZQotICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wcyhMaXN0PFZlY3Rvcjx1aW50OF90PiA+JiBzZWN1cmVTdG9wcykgewotICAgICAgICBVTlVTRUQoc2VjdXJlU3RvcHMpOwotICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NpZCwgVmVjdG9yPHVpbnQ4X3Q+ICZzZWN1cmVTdG9wKSB7Ci0gICAgICAgIGlmIChzc2lkLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOwotICAgICAgICB9Ci0KLSAgICAgICAgVU5VU0VEKHNlY3VyZVN0b3ApOwotICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlU2VjdXJlU3RvcHMoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzc1JlbGVhc2UpIHsKLSAgICAgICAgaWYgKHNzUmVsZWFzZS5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQWxsU2VjdXJlU3RvcHMoKSB7Ci0gICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nKAotICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZSwgU3RyaW5nOCYgdmFsdWUpIGNvbnN0OwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eUJ5dGVBcnJheSgKLSAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsIFZlY3Rvcjx1aW50OF90PiYgdmFsdWUpIGNvbnN0IHsKLSAgICAgICAgVU5VU0VEKG5hbWUpOwotICAgICAgICBVTlVTRUQodmFsdWUpOwotICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcm9wZXJ0eVN0cmluZygKLSAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsIGNvbnN0IFN0cmluZzgmIHZhbHVlKSB7Ci0gICAgICAgIFVOVVNFRChuYW1lKTsKLSAgICAgICAgVU5VU0VEKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJvcGVydHlCeXRlQXJyYXkoCi0gICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBuYW1lLCBjb25zdCBWZWN0b3I8dWludDhfdD4mIHZhbHVlKSB7Ci0gICAgICAgIFVOVVNFRChuYW1lKTsKLSAgICAgICAgVU5VU0VEKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2lwaGVyQWxnb3JpdGhtKAotICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsIGNvbnN0IFN0cmluZzgmIGFsZ29yaXRobSkgewotICAgICAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwIHx8IGFsZ29yaXRobS5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYWNBbGdvcml0aG0oCi0gICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwgY29uc3QgU3RyaW5nOCYgYWxnb3JpdGhtKSB7Ci0gICAgICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDAgfHwgYWxnb3JpdGhtLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGVuY3J5cHQoCi0gICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwKLSAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYga2V5SWQsCi0gICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGlucHV0LAotICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBpdiwKLSAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgb3V0cHV0KSB7Ci0gICAgICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDAgfHwga2V5SWQuc2l6ZSgpID09IDAgfHwKLSAgICAgICAgICAgICAgICBpbnB1dC5zaXplKCkgPT0gMCB8fCBpdi5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBVTlVTRUQob3V0cHV0KTsKLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdCgKLSAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAotICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlJZCwKLSAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaW5wdXQsCi0gICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGl2LAotICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBvdXRwdXQpIHsKLSAgICAgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCB8fCBrZXlJZC5zaXplKCkgPT0gMCB8fAotICAgICAgICAgICAgICAgIGlucHV0LnNpemUoKSA9PSAwIHx8IGl2LnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIFVOVVNFRChvdXRwdXQpOwotICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzaWduKAotICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCi0gICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGtleUlkLAotICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBtZXNzYWdlLAotICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBzaWduYXR1cmUpIHsKLSAgICAgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCB8fCBrZXlJZC5zaXplKCkgPT0gMCB8fAotICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgVU5VU0VEKHNpZ25hdHVyZSk7Ci0gICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHZlcmlmeSgKLSAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAotICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlJZCwKLSAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgbWVzc2FnZSwKLSAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2lnbmF0dXJlLCBib29sJiBtYXRjaCkgewotICAgICAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwIHx8IGtleUlkLnNpemUoKSA9PSAwIHx8Ci0gICAgICAgICAgICAgICAgbWVzc2FnZS5zaXplKCkgPT0gMCB8fCBzaWduYXR1cmUuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgVU5VU0VEKG1hdGNoKTsKLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2lnblJTQSgKLSAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAotICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWxnb3JpdGhtLAotICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBtZXNzYWdlLAotICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiB3cmFwcGVkS2V5LAotICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBzaWduYXR1cmUpIHsKLSAgICAgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCB8fCBhbGdvcml0aG0uc2l6ZSgpID09IDAgfHwKLSAgICAgICAgICAgICAgICBtZXNzYWdlLnNpemUoKSA9PSAwIHx8IHdyYXBwZWRLZXkuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgVU5VU0VEKHNpZ25hdHVyZSk7Ci0gICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBzZXRQbGF5UG9saWN5KCk7Ci0KLSAgICBhbmRyb2lkOjpLZXllZFZlY3RvcjxhbmRyb2lkOjpTdHJpbmc4LCBhbmRyb2lkOjpTdHJpbmc4PiBtUGxheVBvbGljeTsKLSAgICBTZXNzaW9uTGlicmFyeSogbVNlc3Npb25MaWJyYXJ5OwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHJtUGx1Z2luKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGNsZWFya2V5ZHJtCi0KLSNlbmRpZiAvLyBDTEVBUktFWV9EUk1fUExVR0lOX0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9TZXNzaW9uLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjEwZjVlLi4wMDAwMDAwCi0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiQ2xlYXJLZXlDcnlwdG9QbHVnaW4iCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotI2luY2x1ZGUgIlNlc3Npb24uaCIKLQotI2luY2x1ZGUgIkFlc0N0ckRlY3J5cHRvci5oIgotI2luY2x1ZGUgIkluaXREYXRhUGFyc2VyLmgiCi0jaW5jbHVkZSAiSnNvbldlYktleS5oIgotCi1uYW1lc3BhY2UgY2xlYXJrZXlkcm0gewotCi11c2luZyBhbmRyb2lkOjpNdXRleDsKLXVzaW5nIGFuZHJvaWQ6OlN0cmluZzg7Ci11c2luZyBhbmRyb2lkOjpWZWN0b3I7Ci11c2luZyBhbmRyb2lkOjpzdGF0dXNfdDsKLQotc3RhdHVzX3QgU2Vzc2lvbjo6Z2V0S2V5UmVxdWVzdCgKLSAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKLSAgICAgICAgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUsCi0gICAgICAgIFZlY3Rvcjx1aW50OF90Pioga2V5UmVxdWVzdCkgY29uc3QgewotICAgIEluaXREYXRhUGFyc2VyIHBhcnNlcjsKLSAgICByZXR1cm4gcGFyc2VyLnBhcnNlKGluaXREYXRhLCBtaW1lVHlwZSwga2V5UmVxdWVzdCk7Ci19Ci0KLXN0YXR1c190IFNlc3Npb246OnByb3ZpZGVLZXlSZXNwb25zZShjb25zdCBWZWN0b3I8dWludDhfdD4mIHJlc3BvbnNlKSB7Ci0gICAgU3RyaW5nOCByZXNwb25zZVN0cmluZygKLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHJlc3BvbnNlLmFycmF5KCkpLCByZXNwb25zZS5zaXplKCkpOwotICAgIEtleU1hcCBrZXlzOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU1hcExvY2spOwotICAgIEpzb25XZWJLZXkgcGFyc2VyOwotICAgIGlmIChwYXJzZXIuZXh0cmFjdEtleXNGcm9tSnNvbldlYktleVNldChyZXNwb25zZVN0cmluZywgJmtleXMpKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga2V5cy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgY29uc3QgS2V5TWFwOjprZXlfdHlwZSYga2V5SWQgPSBrZXlzLmtleUF0KGkpOwotICAgICAgICAgICAgY29uc3QgS2V5TWFwOjp2YWx1ZV90eXBlJiBrZXkgPSBrZXlzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBtS2V5TWFwLmFkZChrZXlJZCwga2V5KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5kcm9pZDo6T0s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9VTktOT1dOOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU2Vzc2lvbjo6ZGVjcnlwdCgKLSAgICAgICAgY29uc3QgS2V5SWQga2V5SWQsIGNvbnN0IEl2IGl2LCBjb25zdCB2b2lkKiBzb3VyY2UsCi0gICAgICAgIHZvaWQqIGRlc3RpbmF0aW9uLCBjb25zdCBTdWJTYW1wbGUqIHN1YlNhbXBsZXMsCi0gICAgICAgIHNpemVfdCBudW1TdWJTYW1wbGVzLCBzaXplX3QqIGJ5dGVzRGVjcnlwdGVkT3V0KSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU1hcExvY2spOwotCi0gICAgVmVjdG9yPHVpbnQ4X3Q+IGtleUlkVmVjdG9yOwotICAgIGtleUlkVmVjdG9yLmFwcGVuZEFycmF5KGtleUlkLCBrQmxvY2tTaXplKTsKLSAgICBpZiAobUtleU1hcC5pbmRleE9mS2V5KGtleUlkVmVjdG9yKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9OT19MSUNFTlNFOwotICAgIH0KLQotICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYga2V5ID0gbUtleU1hcC52YWx1ZUZvcihrZXlJZFZlY3Rvcik7Ci0gICAgQWVzQ3RyRGVjcnlwdG9yIGRlY3J5cHRvcjsKLSAgICByZXR1cm4gZGVjcnlwdG9yLmRlY3J5cHQoCi0gICAgICAgICAgICBrZXksIGl2LAotICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oc291cmNlKSwKLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGRlc3RpbmF0aW9uKSwgc3ViU2FtcGxlcywKLSAgICAgICAgICAgIG51bVN1YlNhbXBsZXMsIGJ5dGVzRGVjcnlwdGVkT3V0KTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb25MaWJyYXJ5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb25MaWJyYXJ5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxOWY5Ny4uMDAwMDAwMAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9TZXNzaW9uTGlicmFyeS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJDbGVhcktleUNyeXB0b1BsdWdpbiIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotI2luY2x1ZGUgIlNlc3Npb25MaWJyYXJ5LmgiCi0KLW5hbWVzcGFjZSBjbGVhcmtleWRybSB7Ci0KLXVzaW5nIGFuZHJvaWQ6Ok11dGV4OwotdXNpbmcgYW5kcm9pZDo6c3A7Ci11c2luZyBhbmRyb2lkOjpTdHJpbmc4OwotdXNpbmcgYW5kcm9pZDo6VmVjdG9yOwotCi1NdXRleCBTZXNzaW9uTGlicmFyeTo6c1NpbmdsZXRvbkxvY2s7Ci1TZXNzaW9uTGlicmFyeSogU2Vzc2lvbkxpYnJhcnk6OnNTaW5nbGV0b24gPSBOVUxMOwotCi1TZXNzaW9uTGlicmFyeSogU2Vzc2lvbkxpYnJhcnk6OmdldCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhzU2luZ2xldG9uTG9jayk7Ci0KLSAgICBpZiAoc1NpbmdsZXRvbiA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dEKCJJbnN0YW50aWF0aW5nIFNlc3Npb24gTGlicmFyeSBTaW5nbGV0b24uIik7Ci0gICAgICAgIHNTaW5nbGV0b24gPSBuZXcgU2Vzc2lvbkxpYnJhcnkoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc1NpbmdsZXRvbjsKLX0KLQotc3A8U2Vzc2lvbj4gU2Vzc2lvbkxpYnJhcnk6OmNyZWF0ZVNlc3Npb24oKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlc3Npb25zTG9jayk7Ci0KLSAgICBTdHJpbmc4IHNlc3Npb25JZFN0cmluZyA9IFN0cmluZzg6OmZvcm1hdCgiJXUiLCBtTmV4dFNlc3Npb25JZCk7Ci0gICAgbU5leHRTZXNzaW9uSWQgKz0gMTsKLSAgICBWZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkOwotICAgIHNlc3Npb25JZC5hcHBlbmRBcnJheSgKLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHNlc3Npb25JZFN0cmluZy5zdHJpbmcoKSksCi0gICAgICAgICAgICBzZXNzaW9uSWRTdHJpbmcuc2l6ZSgpKTsKLQotICAgIG1TZXNzaW9ucy5hZGQoc2Vzc2lvbklkLCBuZXcgU2Vzc2lvbihzZXNzaW9uSWQpKTsKLSAgICByZXR1cm4gbVNlc3Npb25zLnZhbHVlRm9yKHNlc3Npb25JZCk7Ci19Ci0KLXNwPFNlc3Npb24+IFNlc3Npb25MaWJyYXJ5OjpmaW5kU2Vzc2lvbigKLSAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2Vzc2lvbnNMb2NrKTsKLSAgICBpZiAobVNlc3Npb25zLmluZGV4T2ZLZXkoc2Vzc2lvbklkKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIHNwPFNlc3Npb24+KE5VTEwpOwotICAgIH0KLSAgICByZXR1cm4gbVNlc3Npb25zLnZhbHVlRm9yKHNlc3Npb25JZCk7Ci19Ci0KLXZvaWQgU2Vzc2lvbkxpYnJhcnk6OmRlc3Ryb3lTZXNzaW9uKGNvbnN0IHNwPFNlc3Npb24+JiBzZXNzaW9uKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlc3Npb25zTG9jayk7XAotICAgIG1TZXNzaW9ucy5yZW1vdmVJdGVtKHNlc3Npb24tPnNlc3Npb25JZCgpKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9BbmRyb2lkLmJwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM2NzRlMQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzggQEAKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGliY2xlYXJrZXljb21tb24iLAorICAgIHZlbmRvcjogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkNsZWFyS2V5VVVJRC5jcHAiLAorICAgICAgICAiVXRpbHMuY3BwIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKKworICAgIGluY2x1ZGVfZGlyczogWyJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiXSwKKworICAgIHNoYXJlZF9saWJzOiBbImxpYnV0aWxzIl0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGludGVnZXJfb3ZlcmZsb3c6IHRydWUsCisgICAgfSwKK30KKwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlVVUlELmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9DbGVhcktleVVVSUQuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVVVSUQuY3BwCnJlbmFtZSB0byBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vQ2xlYXJLZXlVVUlELmNwcApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvVXRpbHMuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL1V0aWxzLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvVXRpbHMuY3BwCnJlbmFtZSB0byBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vVXRpbHMuY3BwCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVVVSUQuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL0NsZWFyS2V5VVVJRC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVVVSUQuaApyZW5hbWUgdG8gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvQ2xlYXJLZXlVVUlELmgKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L01pbWVUeXBlLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9NaW1lVHlwZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9NaW1lVHlwZS5oCnJlbmFtZSB0byBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9NaW1lVHlwZS5oCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9VdGlscy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvVXRpbHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvVXRpbHMuaApyZW5hbWUgdG8gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvVXRpbHMuaApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQWVzQ3RyRGVjcnlwdG9yLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvQWVzQ3RyRGVjcnlwdG9yLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQWVzQ3RyRGVjcnlwdG9yLmNwcApyZW5hbWUgdG8gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9BZXNDdHJEZWNyeXB0b3IuY3BwCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L0FuZHJvaWQuYnAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JhNTcwOAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvQW5kcm9pZC5icApAQCAtMCwwICsxLDY3IEBACisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLworCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmRybWNsZWFya2V5cGx1Z2luIiwKKyAgICB2ZW5kb3I6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJBZXNDdHJEZWNyeXB0b3IuY3BwIiwKKyAgICAgICAgIkNyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAiLAorICAgICAgICAiQ3J5cHRvRmFjdG9yeS5jcHAiLAorICAgICAgICAiQ3J5cHRvUGx1Z2luLmNwcCIsCisgICAgICAgICJEcm1GYWN0b3J5LmNwcCIsCisgICAgICAgICJEcm1QbHVnaW4uY3BwIiwKKyAgICAgICAgIkluaXREYXRhUGFyc2VyLmNwcCIsCisgICAgICAgICJKc29uV2ViS2V5LmNwcCIsCisgICAgICAgICJTZXNzaW9uLmNwcCIsCisgICAgICAgICJTZXNzaW9uTGlicmFyeS5jcHAiLAorICAgIF0sCisKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJtZWRpYWRybSIsCisKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmNyeXB0byIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJjbGVhcmtleWNvbW1vbiIsCisgICAgICAgICJsaWJqc21uIgorICAgIF0sCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGV4cG9ydF9zdGF0aWNfbGliX2hlYWRlcnM6IFsibGlianNtbiJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZSIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGludGVnZXJfb3ZlcmZsb3c6IHRydWUsCisgICAgfSwKK30KKworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vIEJ1aWxkIHVuaXQgdGVzdHMKKworc3ViZGlycyA9IFsidGVzdHMiXQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcApyZW5hbWUgdG8gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuY3BwCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L0NyeXB0b0ZhY3RvcnkuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9DcnlwdG9GYWN0b3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTVmOTJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9DcnlwdG9GYWN0b3J5LmNwcApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDbGVhcktleUNyeXB0b0ZhY3RvcnkiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKKyNpbmNsdWRlICJDcnlwdG9GYWN0b3J5LmgiCisKKyNpbmNsdWRlICJDbGVhcktleVVVSUQuaCIKKyNpbmNsdWRlICJDcnlwdG9QbHVnaW4uaCIKKyNpbmNsdWRlICJTZXNzaW9uLmgiCisjaW5jbHVkZSAiU2Vzc2lvbkxpYnJhcnkuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworYm9vbCBDcnlwdG9GYWN0b3J5Ojppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdKSBjb25zdCB7CisgICAgcmV0dXJuIGlzQ2xlYXJLZXlVVUlEKHV1aWQpOworfQorCithbmRyb2lkOjpzdGF0dXNfdCBDcnlwdG9GYWN0b3J5OjpjcmVhdGVQbHVnaW4oCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCisgICAgICAgIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplLAorICAgICAgICBhbmRyb2lkOjpDcnlwdG9QbHVnaW4qKiBwbHVnaW4pIHsKKyAgICBpZiAoIWlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpKSB7CisgICAgICAgICpwbHVnaW4gPSBOVUxMOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOworICAgIH0KKworICAgIGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQ7CisgICAgc2Vzc2lvbklkLmFwcGVuZEFycmF5KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGRhdGEpLCBzaXplKTsKKworICAgIENyeXB0b1BsdWdpbiAqY2xlYXJLZXlQbHVnaW4gPSBuZXcgQ3J5cHRvUGx1Z2luKHNlc3Npb25JZCk7CisgICAgYW5kcm9pZDo6c3RhdHVzX3QgcmVzdWx0ID0gY2xlYXJLZXlQbHVnaW4tPmdldEluaXRTdGF0dXMoKTsKKyAgICBpZiAocmVzdWx0ID09IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgICpwbHVnaW4gPSBjbGVhcktleVBsdWdpbjsKKyAgICB9IGVsc2UgeworICAgICAgICBkZWxldGUgY2xlYXJLZXlQbHVnaW47CisgICAgICAgICpwbHVnaW4gPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvUGx1Z2luLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvQ3J5cHRvUGx1Z2luLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvQ3J5cHRvUGx1Z2luLmNwcApyZW5hbWUgdG8gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9DcnlwdG9QbHVnaW4uY3BwCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L0RybUZhY3RvcnkuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9Ecm1GYWN0b3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzAxZTQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9Ecm1GYWN0b3J5LmNwcApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDbGVhcktleURybUZhY3RvcnkiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgIkRybUZhY3RvcnkuaCIKKworI2luY2x1ZGUgIkRybVBsdWdpbi5oIgorI2luY2x1ZGUgIkNsZWFyS2V5VVVJRC5oIgorI2luY2x1ZGUgIk1pbWVUeXBlLmgiCisjaW5jbHVkZSAiU2Vzc2lvbkxpYnJhcnkuaCIKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKworYm9vbCBEcm1GYWN0b3J5Ojppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdKSB7CisgICAgcmV0dXJuIGlzQ2xlYXJLZXlVVUlEKHV1aWQpOworfQorCitib29sIERybUZhY3Rvcnk6OmlzQ29udGVudFR5cGVTdXBwb3J0ZWQoY29uc3QgYW5kcm9pZDo6U3RyaW5nOCAmdHlwZSkgeworICAgIC8vIFRoaXMgc2hvdWxkIG1hdGNoIHRoZSB0eXBlcyBoYW5kZWQgYnkgSW5pdERhdGFQYXJzZXIuCisgICAgcmV0dXJuIHR5cGUgPT0ga0lzb0JtZmZWaWRlb01pbWVUeXBlIHx8CisgICAgICAgIHR5cGUgPT0ga0lzb0JtZmZBdWRpb01pbWVUeXBlIHx8CisgICAgICAgIHR5cGUgPT0ga0NlbmNJbml0RGF0YUZvcm1hdCB8fAorICAgICAgICB0eXBlID09IGtXZWJtVmlkZW9NaW1lVHlwZSB8fAorICAgICAgICB0eXBlID09IGtXZWJtQXVkaW9NaW1lVHlwZSB8fAorICAgICAgICB0eXBlID09IGtXZWJtSW5pdERhdGFGb3JtYXQ7Cit9CisKK2FuZHJvaWQ6OnN0YXR1c190IERybUZhY3Rvcnk6OmNyZWF0ZURybVBsdWdpbigKKyAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgYW5kcm9pZDo6RHJtUGx1Z2luKiogcGx1Z2luKSB7CisgICAgaWYgKCFpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKSkgeworICAgICAgICAqcGx1Z2luID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAqcGx1Z2luID0gbmV3IERybVBsdWdpbihTZXNzaW9uTGlicmFyeTo6Z2V0KCkpOworICAgIHJldHVybiBhbmRyb2lkOjpPSzsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvRHJtUGx1Z2luLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvRHJtUGx1Z2luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjhiOGMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9Ecm1QbHVnaW4uY3BwCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDbGVhcktleURybVBsdWdpbiIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCisjaW5jbHVkZSAiRHJtUGx1Z2luLmgiCisjaW5jbHVkZSAiQ2xlYXJLZXlEcm1Qcm9wZXJ0aWVzLmgiCisjaW5jbHVkZSAiU2Vzc2lvbi5oIgorCituYW1lc3BhY2UgeworY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrU3RyZWFtaW5nKCJTdHJlYW1pbmciKTsKK2NvbnN0IGFuZHJvaWQ6OlN0cmluZzgga09mZmxpbmUoIk9mZmxpbmUiKTsKK2NvbnN0IGFuZHJvaWQ6OlN0cmluZzgga1RydWUoIlRydWUiKTsKKworY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrUXVlcnlLZXlMaWNlbnNlVHlwZSgiTGljZW5zZVR5cGUiKTsKKyAgICAvLyBWYWx1ZTogIlN0cmVhbWluZyIgb3IgIk9mZmxpbmUiCitjb25zdCBhbmRyb2lkOjpTdHJpbmc4IGtRdWVyeUtleVBsYXlBbGxvd2VkKCJQbGF5QWxsb3dlZCIpOworICAgIC8vIFZhbHVlOiAiVHJ1ZSIgb3IgIkZhbHNlIgorY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrUXVlcnlLZXlSZW5ld0FsbG93ZWQoIlJlbmV3QWxsb3dlZCIpOworICAgIC8vIFZhbHVlOiAiVHJ1ZSIgb3IgIkZhbHNlIgorfTsKKworbmFtZXNwYWNlIGNsZWFya2V5ZHJtIHsKKwordXNpbmcgYW5kcm9pZDo6c3A7CisKK0RybVBsdWdpbjo6RHJtUGx1Z2luKFNlc3Npb25MaWJyYXJ5KiBzZXNzaW9uTGlicmFyeSkKKyAgICAgICAgOiBtU2Vzc2lvbkxpYnJhcnkoc2Vzc2lvbkxpYnJhcnkpIHsKKworICAgIG1QbGF5UG9saWN5LmNsZWFyKCk7CisgICAgaW5pdFByb3BlcnRpZXMoKTsKK30KKwordm9pZCBEcm1QbHVnaW46OmluaXRQcm9wZXJ0aWVzKCkgeworICAgIG1TdHJpbmdQcm9wZXJ0aWVzLmNsZWFyKCk7CisgICAgbVN0cmluZ1Byb3BlcnRpZXMuYWRkKGtWZW5kb3JLZXksIGtWZW5kb3JWYWx1ZSk7CisgICAgbVN0cmluZ1Byb3BlcnRpZXMuYWRkKGtWZXJzaW9uS2V5LCBrVmVyc2lvblZhbHVlKTsKKyAgICBtU3RyaW5nUHJvcGVydGllcy5hZGQoa1BsdWdpbkRlc2NyaXB0aW9uS2V5LCBrUGx1Z2luRGVzY3JpcHRpb25WYWx1ZSk7CisgICAgbVN0cmluZ1Byb3BlcnRpZXMuYWRkKGtBbGdvcml0aG1zS2V5LCBrQWxnb3JpdGhtc1ZhbHVlKTsKKyAgICBtU3RyaW5nUHJvcGVydGllcy5hZGQoa0xpc3RlbmVyVGVzdFN1cHBvcnRLZXksIGtMaXN0ZW5lclRlc3RTdXBwb3J0VmFsdWUpOworCisgICAgVmVjdG9yPHVpbnQ4X3Q+IHRlc3REZXZpY2VJZDsKKyAgICB0ZXN0RGV2aWNlSWQuYXBwZW5kQXJyYXkoa1Rlc3REZXZpY2VJZERhdGEsIHNpemVvZihrVGVzdERldmljZUlkRGF0YSkgLyBzaXplb2YodWludDhfdCkpOworICAgIG1CeXRlQXJyYXlQcm9wZXJ0aWVzLmFkZChrRGV2aWNlSWRLZXksIHRlc3REZXZpY2VJZCk7Cit9CisKK3N0YXR1c190IERybVBsdWdpbjo6b3BlblNlc3Npb24oVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKKyAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5jcmVhdGVTZXNzaW9uKCk7CisgICAgc2Vzc2lvbklkID0gc2Vzc2lvbi0+c2Vzc2lvbklkKCk7CisgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOworfQorCitzdGF0dXNfdCBEcm1QbHVnaW46OmNsb3NlU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHNlc3Npb25JZCk7CisgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoc2Vzc2lvbi5nZXQoKSkgeworICAgICAgICBtU2Vzc2lvbkxpYnJhcnktPmRlc3Ryb3lTZXNzaW9uKHNlc3Npb24pOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6T0s7CisgICAgfQorICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOworfQorCitzdGF0dXNfdCBEcm1QbHVnaW46OmdldEtleVJlcXVlc3QoCisgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2NvcGUsCisgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlLAorICAgICAgICBLZXlUeXBlIGtleVR5cGUsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+JiBvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgcmVxdWVzdCwKKyAgICAgICAgU3RyaW5nOCYgZGVmYXVsdFVybCwKKyAgICAgICAgRHJtUGx1Z2luOjpLZXlSZXF1ZXN0VHlwZSAqa2V5UmVxdWVzdFR5cGUpIHsKKyAgICBVTlVTRUQob3B0aW9uYWxQYXJhbWV0ZXJzKTsKKyAgICBpZiAoc2NvcGUuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoa2V5VHlwZSAhPSBrS2V5VHlwZV9TdHJlYW1pbmcpIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX0luaXRpYWw7CisgICAgZGVmYXVsdFVybC5jbGVhcigpOworICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHNjb3BlKTsKKyAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgfQorCisgICAgcmV0dXJuIHNlc3Npb24tPmdldEtleVJlcXVlc3QoaW5pdERhdGEsIG1pbWVUeXBlLCAmcmVxdWVzdCk7Cit9CisKK3ZvaWQgRHJtUGx1Z2luOjpzZXRQbGF5UG9saWN5KCkgeworICAgIG1QbGF5UG9saWN5LmNsZWFyKCk7CisgICAgbVBsYXlQb2xpY3kuYWRkKGtRdWVyeUtleUxpY2Vuc2VUeXBlLCBrU3RyZWFtaW5nKTsKKyAgICBtUGxheVBvbGljeS5hZGQoa1F1ZXJ5S2V5UGxheUFsbG93ZWQsIGtUcnVlKTsKKyAgICBtUGxheVBvbGljeS5hZGQoa1F1ZXJ5S2V5UmVuZXdBbGxvd2VkLCBrVHJ1ZSk7Cit9CisKK3N0YXR1c190IERybVBsdWdpbjo6cHJvdmlkZUtleVJlc3BvbnNlKAorICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNjb3BlLAorICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHJlc3BvbnNlLAorICAgICAgICBWZWN0b3I8dWludDhfdD4mIGtleVNldElkKSB7CisgICAgaWYgKHNjb3BlLnNpemUoKSA9PSAwIHx8IHJlc3BvbnNlLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7CisgICAgfQorICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHNjb3BlKTsKKyAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgfQorCisgICAgc2V0UGxheVBvbGljeSgpOworICAgIHN0YXR1c190IHJlcyA9IHNlc3Npb24tPnByb3ZpZGVLZXlSZXNwb25zZShyZXNwb25zZSk7CisgICAgaWYgKHJlcyA9PSBhbmRyb2lkOjpPSykgeworICAgICAgICAvLyBUaGlzIGlzIGZvciB0ZXN0aW5nIEFNZWRpYURybV9zZXRPbkV2ZW50TGlzdGVuZXIgb25seS4KKyAgICAgICAgc2VuZEV2ZW50KGtEcm1QbHVnaW5FdmVudFZlbmRvckRlZmluZWQsIDAsICZzY29wZSwgTlVMTCk7CisgICAgICAgIGtleVNldElkLmNsZWFyKCk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IERybVBsdWdpbjo6Z2V0UHJvcGVydHlCeXRlQXJyYXkoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsIFZlY3Rvcjx1aW50OF90PiYgdmFsdWUpIGNvbnN0IHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUJ5dGVBcnJheVByb3BlcnRpZXMuaW5kZXhPZktleShuYW1lKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dFKCJBcHAgcmVxdWVzdGVkIHVua25vd24gcHJvcGVydHk6ICVzIiwgbmFtZS5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisgICAgdmFsdWUgPSBtQnl0ZUFycmF5UHJvcGVydGllcy52YWx1ZUF0KGluZGV4KTsKKyAgICByZXR1cm4gYW5kcm9pZDo6T0s7Cit9CisKK3N0YXR1c190IERybVBsdWdpbjo6c2V0UHJvcGVydHlCeXRlQXJyYXkoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgdmFsdWUpCit7CisgICAgVU5VU0VEKHZhbHVlKTsKKyAgICBpZiAoMCA9PSBuYW1lLmNvbXBhcmUoa0RldmljZUlkS2V5KSkgeworICAgICAgICBBTE9HRCgiQ2Fubm90IHNldCBpbW11dGFibGUgcHJvcGVydHk6ICVzIiwgbmFtZS5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICAvLyBTZXR0aW5nIG9mIHVuZGVmaW5lZCBwcm9wZXJ0aWVzIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBwcm9wZXJ0eSBieXRlIGFycmF5LCBrZXk9JXMiLCBuYW1lLnN0cmluZygpKTsKKyAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7Cit9CisKK3N0YXR1c190IERybVBsdWdpbjo6Z2V0UHJvcGVydHlTdHJpbmcoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsIFN0cmluZzgmIHZhbHVlKSBjb25zdCB7CisgICAgc3NpemVfdCBpbmRleCA9IG1TdHJpbmdQcm9wZXJ0aWVzLmluZGV4T2ZLZXkobmFtZSk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HRSgiQXBwIHJlcXVlc3RlZCB1bmtub3duIHByb3BlcnR5OiAlcyIsIG5hbWUuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorICAgIHZhbHVlID0gbVN0cmluZ1Byb3BlcnRpZXMudmFsdWVBdChpbmRleCk7CisgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOworfQorCitzdGF0dXNfdCBEcm1QbHVnaW46OnNldFByb3BlcnR5U3RyaW5nKAorICAgICAgICBjb25zdCBTdHJpbmc4JiBuYW1lLCBjb25zdCBTdHJpbmc4JiB2YWx1ZSkgeworICAgIFN0cmluZzggaW1tdXRhYmxlS2V5czsKKyAgICBpbW11dGFibGVLZXlzLmFwcGVuZEZvcm1hdCgiJXMsJXMsJXMsJXMiLAorICAgICAgICAgICAga0FsZ29yaXRobXNLZXkuc3RyaW5nKCksIGtQbHVnaW5EZXNjcmlwdGlvbktleS5zdHJpbmcoKSwKKyAgICAgICAgICAgIGtWZW5kb3JLZXkuc3RyaW5nKCksIGtWZXJzaW9uS2V5LnN0cmluZygpKTsKKyAgICBpZiAoaW1tdXRhYmxlS2V5cy5jb250YWlucyhuYW1lLnN0cmluZygpKSkgeworICAgICAgICBBTE9HRCgiQ2Fubm90IHNldCBpbW11dGFibGUgcHJvcGVydHk6ICVzIiwgbmFtZS5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbVN0cmluZ1Byb3BlcnRpZXMuaW5kZXhPZktleShuYW1lKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dFKCJDYW5ub3Qgc2V0IHVuZGVmaW5lZCBwcm9wZXJ0eSBzdHJpbmcsIGtleT0lcyIsIG5hbWUuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgaWYgKG1TdHJpbmdQcm9wZXJ0aWVzLmFkZChuYW1lLCB2YWx1ZSkgPCAwKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IHByb3BlcnR5IHN0cmluZywga2V5PSVzIiwgbmFtZS5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fVU5LTk9XTjsKKyAgICB9CisgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOworfQorCitzdGF0dXNfdCBEcm1QbHVnaW46OnF1ZXJ5S2V5U3RhdHVzKAorICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4mIGluZm9NYXApIGNvbnN0IHsKKworICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpbmZvTWFwLmNsZWFyKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheVBvbGljeS5zaXplKCk7ICsraSkgeworICAgICAgICBpbmZvTWFwLmFkZChtUGxheVBvbGljeS5rZXlBdChpKSwgbVBsYXlQb2xpY3kudmFsdWVBdChpKSk7CisgICAgfQorICAgIHJldHVybiBhbmRyb2lkOjpPSzsKK30KK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSW5pdERhdGFQYXJzZXIuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9Jbml0RGF0YVBhcnNlci5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0luaXREYXRhUGFyc2VyLmNwcApyZW5hbWUgdG8gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9Jbml0RGF0YVBhcnNlci5jcHAKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0pzb25XZWJLZXkuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9Kc29uV2ViS2V5LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSnNvbldlYktleS5jcHAKcmVuYW1lIHRvIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvSnNvbldlYktleS5jcHAKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvU2Vzc2lvbi5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L1Nlc3Npb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzY2VhZWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L1Nlc3Npb24uY3BwCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNsZWFyS2V5U2Vzc2lvbiIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSAiU2Vzc2lvbi5oIgorCisjaW5jbHVkZSAiQWVzQ3RyRGVjcnlwdG9yLmgiCisjaW5jbHVkZSAiSW5pdERhdGFQYXJzZXIuaCIKKyNpbmNsdWRlICJKc29uV2ViS2V5LmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK3VzaW5nIGFuZHJvaWQ6Ok11dGV4OwordXNpbmcgYW5kcm9pZDo6U3RyaW5nODsKK3VzaW5nIGFuZHJvaWQ6OlZlY3RvcjsKK3VzaW5nIGFuZHJvaWQ6OnN0YXR1c190OworCitzdGF0dXNfdCBTZXNzaW9uOjpnZXRLZXlSZXF1ZXN0KAorICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSwKKyAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+KiBrZXlSZXF1ZXN0KSBjb25zdCB7CisgICAgSW5pdERhdGFQYXJzZXIgcGFyc2VyOworICAgIHJldHVybiBwYXJzZXIucGFyc2UoaW5pdERhdGEsIG1pbWVUeXBlLCBrZXlSZXF1ZXN0KTsKK30KKworc3RhdHVzX3QgU2Vzc2lvbjo6cHJvdmlkZUtleVJlc3BvbnNlKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgcmVzcG9uc2UpIHsKKyAgICBTdHJpbmc4IHJlc3BvbnNlU3RyaW5nKAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocmVzcG9uc2UuYXJyYXkoKSksIHJlc3BvbnNlLnNpemUoKSk7CisgICAgS2V5TWFwIGtleXM7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTWFwTG9jayk7CisgICAgSnNvbldlYktleSBwYXJzZXI7CisgICAgaWYgKHBhcnNlci5leHRyYWN0S2V5c0Zyb21Kc29uV2ViS2V5U2V0KHJlc3BvbnNlU3RyaW5nLCAma2V5cykpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrZXlzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBLZXlNYXA6OmtleV90eXBlJiBrZXlJZCA9IGtleXMua2V5QXQoaSk7CisgICAgICAgICAgICBjb25zdCBLZXlNYXA6OnZhbHVlX3R5cGUmIGtleSA9IGtleXMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIG1LZXlNYXAuYWRkKGtleUlkLCBrZXkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpPSzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX1VOS05PV047CisgICAgfQorfQorCitzdGF0dXNfdCBTZXNzaW9uOjpkZWNyeXB0KAorICAgICAgICBjb25zdCBLZXlJZCBrZXlJZCwgY29uc3QgSXYgaXYsIGNvbnN0IHZvaWQqIHNvdXJjZSwKKyAgICAgICAgdm9pZCogZGVzdGluYXRpb24sIGNvbnN0IFN1YlNhbXBsZSogc3ViU2FtcGxlcywKKyAgICAgICAgc2l6ZV90IG51bVN1YlNhbXBsZXMsIHNpemVfdCogYnl0ZXNEZWNyeXB0ZWRPdXQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTWFwTG9jayk7CisKKyAgICBWZWN0b3I8dWludDhfdD4ga2V5SWRWZWN0b3I7CisgICAga2V5SWRWZWN0b3IuYXBwZW5kQXJyYXkoa2V5SWQsIGtCbG9ja1NpemUpOworICAgIGlmIChtS2V5TWFwLmluZGV4T2ZLZXkoa2V5SWRWZWN0b3IpIDwgMCkgeworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX05PX0xJQ0VOU0U7CisgICAgfQorCisgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBrZXkgPSBtS2V5TWFwLnZhbHVlRm9yKGtleUlkVmVjdG9yKTsKKyAgICBBZXNDdHJEZWNyeXB0b3IgZGVjcnlwdG9yOworICAgIHJldHVybiBkZWNyeXB0b3IuZGVjcnlwdCgKKyAgICAgICAgICAgIGtleSwgaXYsCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihzb3VyY2UpLAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oZGVzdGluYXRpb24pLCBzdWJTYW1wbGVzLAorICAgICAgICAgICAgbnVtU3ViU2FtcGxlcywgYnl0ZXNEZWNyeXB0ZWRPdXQpOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9TZXNzaW9uTGlicmFyeS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L1Nlc3Npb25MaWJyYXJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjkyMzBlCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9TZXNzaW9uTGlicmFyeS5jcHAKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2xlYXJLZXlTZXNzaW9uTGlicmFyeSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgIlNlc3Npb25MaWJyYXJ5LmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK3VzaW5nIGFuZHJvaWQ6Ok11dGV4OwordXNpbmcgYW5kcm9pZDo6c3A7Cit1c2luZyBhbmRyb2lkOjpTdHJpbmc4OwordXNpbmcgYW5kcm9pZDo6VmVjdG9yOworCitNdXRleCBTZXNzaW9uTGlicmFyeTo6c1NpbmdsZXRvbkxvY2s7CitTZXNzaW9uTGlicmFyeSogU2Vzc2lvbkxpYnJhcnk6OnNTaW5nbGV0b24gPSBOVUxMOworCitTZXNzaW9uTGlicmFyeSogU2Vzc2lvbkxpYnJhcnk6OmdldCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhzU2luZ2xldG9uTG9jayk7CisKKyAgICBpZiAoc1NpbmdsZXRvbiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dEKCJJbnN0YW50aWF0aW5nIFNlc3Npb24gTGlicmFyeSBTaW5nbGV0b24uIik7CisgICAgICAgIHNTaW5nbGV0b24gPSBuZXcgU2Vzc2lvbkxpYnJhcnkoKTsKKyAgICB9CisKKyAgICByZXR1cm4gc1NpbmdsZXRvbjsKK30KKworc3A8U2Vzc2lvbj4gU2Vzc2lvbkxpYnJhcnk6OmNyZWF0ZVNlc3Npb24oKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlc3Npb25zTG9jayk7CisKKyAgICBTdHJpbmc4IHNlc3Npb25JZFN0cmluZyA9IFN0cmluZzg6OmZvcm1hdCgiJXUiLCBtTmV4dFNlc3Npb25JZCk7CisgICAgbU5leHRTZXNzaW9uSWQgKz0gMTsKKyAgICBWZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkOworICAgIHNlc3Npb25JZC5hcHBlbmRBcnJheSgKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHNlc3Npb25JZFN0cmluZy5zdHJpbmcoKSksCisgICAgICAgICAgICBzZXNzaW9uSWRTdHJpbmcuc2l6ZSgpKTsKKworICAgIG1TZXNzaW9ucy5hZGQoc2Vzc2lvbklkLCBuZXcgU2Vzc2lvbihzZXNzaW9uSWQpKTsKKyAgICByZXR1cm4gbVNlc3Npb25zLnZhbHVlRm9yKHNlc3Npb25JZCk7Cit9CisKK3NwPFNlc3Npb24+IFNlc3Npb25MaWJyYXJ5OjpmaW5kU2Vzc2lvbigKKyAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2Vzc2lvbnNMb2NrKTsKKyAgICBpZiAobVNlc3Npb25zLmluZGV4T2ZLZXkoc2Vzc2lvbklkKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIHNwPFNlc3Npb24+KE5VTEwpOworICAgIH0KKyAgICByZXR1cm4gbVNlc3Npb25zLnZhbHVlRm9yKHNlc3Npb25JZCk7Cit9CisKK3ZvaWQgU2Vzc2lvbkxpYnJhcnk6OmRlc3Ryb3lTZXNzaW9uKGNvbnN0IHNwPFNlc3Npb24+JiBzZXNzaW9uKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlc3Npb25zTG9jayk7XAorICAgIG1TZXNzaW9ucy5yZW1vdmVJdGVtKHNlc3Npb24tPnNlc3Npb25JZCgpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0Flc0N0ckRlY3J5cHRvci5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9pbmNsdWRlL0Flc0N0ckRlY3J5cHRvci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9BZXNDdHJEZWNyeXB0b3IuaApyZW5hbWUgdG8gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9pbmNsdWRlL0Flc0N0ckRlY3J5cHRvci5oCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L2luY2x1ZGUvQ2xlYXJLZXlEcm1Qcm9wZXJ0aWVzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L2luY2x1ZGUvQ2xlYXJLZXlEcm1Qcm9wZXJ0aWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk5ZTE3NAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvaW5jbHVkZS9DbGVhcktleURybVByb3BlcnRpZXMuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUktFWV9EUk1fUFJPUEVSVElFU19IXworI2RlZmluZSBDTEVBUktFWV9EUk1fUFJPUEVSVElFU19IXworCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgY2xlYXJrZXlkcm0geworCitzdGF0aWMgY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrVmVuZG9yS2V5KCJ2ZW5kb3IiKTsKK3N0YXRpYyBjb25zdCBhbmRyb2lkOjpTdHJpbmc4IGtWZW5kb3JWYWx1ZSgiR29vZ2xlIik7CitzdGF0aWMgY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrVmVyc2lvbktleSgidmVyc2lvbiIpOworc3RhdGljIGNvbnN0IGFuZHJvaWQ6OlN0cmluZzgga1ZlcnNpb25WYWx1ZSgiMS4wIik7CitzdGF0aWMgY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrUGx1Z2luRGVzY3JpcHRpb25LZXkoImRlc2NyaXB0aW9uIik7CitzdGF0aWMgY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrUGx1Z2luRGVzY3JpcHRpb25WYWx1ZSgiQ2xlYXJLZXkgQ0RNIik7CitzdGF0aWMgY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrQWxnb3JpdGhtc0tleSgiYWxnb3JpdGhtcyIpOworc3RhdGljIGNvbnN0IGFuZHJvaWQ6OlN0cmluZzgga0FsZ29yaXRobXNWYWx1ZSgiIik7CitzdGF0aWMgY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrTGlzdGVuZXJUZXN0U3VwcG9ydEtleSgibGlzdGVuZXJUZXN0U3VwcG9ydCIpOworc3RhdGljIGNvbnN0IGFuZHJvaWQ6OlN0cmluZzgga0xpc3RlbmVyVGVzdFN1cHBvcnRWYWx1ZSgidHJ1ZSIpOworCitzdGF0aWMgY29uc3QgYW5kcm9pZDo6U3RyaW5nOCBrRGV2aWNlSWRLZXkoImRldmljZUlkIik7CitzdGF0aWMgY29uc3QgdWludDhfdCBrVGVzdERldmljZUlkRGF0YVtdID0KKyAgICAgICAgezB4MCwgMHgxLCAweDIsIDB4MywgMHg0LCAweDUsIDB4NiwgMHg3LAorICAgICAgICAgMHg4LCAweDksIDB4YSwgMHhiLCAweGMsIDB4ZCwgMHhlLCAweGZ9OworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXlkcm0KKworI2VuZGlmIC8vIENMRUFSS0VZX0RSTV9QUk9QRVJUSUVTX0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVR5cGVzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L2luY2x1ZGUvQ2xlYXJLZXlUeXBlcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVR5cGVzLmgKcmVuYW1lIHRvIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvaW5jbHVkZS9DbGVhcktleVR5cGVzLmgKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9pbmNsdWRlL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaApyZW5hbWUgdG8gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9pbmNsdWRlL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcnlwdG9GYWN0b3J5LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L2luY2x1ZGUvQ3J5cHRvRmFjdG9yeS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcnlwdG9GYWN0b3J5LmgKcmVuYW1lIHRvIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvaW5jbHVkZS9DcnlwdG9GYWN0b3J5LmgKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L0NyeXB0b1BsdWdpbi5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9pbmNsdWRlL0NyeXB0b1BsdWdpbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9DcnlwdG9QbHVnaW4uaApyZW5hbWUgdG8gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9pbmNsdWRlL0NyeXB0b1BsdWdpbi5oCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1GYWN0b3J5LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L2luY2x1ZGUvRHJtRmFjdG9yeS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Ecm1GYWN0b3J5LmgKcmVuYW1lIHRvIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvaW5jbHVkZS9Ecm1GYWN0b3J5LmgKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvaW5jbHVkZS9Ecm1QbHVnaW4uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvaW5jbHVkZS9Ecm1QbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmE0MmU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9pbmNsdWRlL0RybVBsdWdpbi5oCkBAIC0wLDAgKzEsMjc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUktFWV9EUk1fUExVR0lOX0hfCisjZGVmaW5lIENMRUFSS0VZX0RSTV9QTFVHSU5fSF8KKworI2luY2x1ZGUgPG1lZGlhL2RybS9Ecm1BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpbmNsdWRlICJTZXNzaW9uTGlicmFyeS5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCisKK25hbWVzcGFjZSBjbGVhcmtleWRybSB7CisKK3VzaW5nIGFuZHJvaWQ6OktleWVkVmVjdG9yOwordXNpbmcgYW5kcm9pZDo6TGlzdDsKK3VzaW5nIGFuZHJvaWQ6OnN0YXR1c190OwordXNpbmcgYW5kcm9pZDo6U3RyaW5nODsKK3VzaW5nIGFuZHJvaWQ6OlZlY3RvcjsKKworY2xhc3MgRHJtUGx1Z2luIDogcHVibGljIGFuZHJvaWQ6OkRybVBsdWdpbiB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgRHJtUGx1Z2luKFNlc3Npb25MaWJyYXJ5KiBzZXNzaW9uTGlicmFyeSk7CisKKyAgICB2aXJ0dWFsIH5Ecm1QbHVnaW4oKSB7fQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuU2Vzc2lvbihWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEtleVJlcXVlc3QoCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNjb3BlLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBtaW1lVHlwZSwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGluaXREYXRhVHlwZSwKKyAgICAgICAgICAgIEtleVR5cGUga2V5VHlwZSwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+JiBvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIHJlcXVlc3QsCisgICAgICAgICAgICBTdHJpbmc4JiBkZWZhdWx0VXJsLAorICAgICAgICAgICAgRHJtUGx1Z2luOjpLZXlSZXF1ZXN0VHlwZSAqa2V5UmVxdWVzdFR5cGUpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcm92aWRlS2V5UmVzcG9uc2UoCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNjb3BlLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiByZXNwb25zZSwKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYga2V5U2V0SWQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVLZXlzKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCByZXN0b3JlS2V5cygKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlTZXRJZCkgeworICAgICAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwIHx8IGtleVNldElkLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5S2V5U3RhdHVzKAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiYgaW5mb01hcCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3Zpc2lvblJlcXVlc3QoCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjZXJ0X3R5cGUsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjZXJ0X2F1dGhvcml0eSwKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgcmVxdWVzdCwKKyAgICAgICAgICAgIFN0cmluZzgmIGRlZmF1bHRVcmwpIHsKKyAgICAgICAgVU5VU0VEKGNlcnRfdHlwZSk7CisgICAgICAgIFVOVVNFRChjZXJ0X2F1dGhvcml0eSk7CisgICAgICAgIFVOVVNFRChyZXF1ZXN0KTsKKyAgICAgICAgVU5VU0VEKGRlZmF1bHRVcmwpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHJlc3BvbnNlLAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiYgd3JhcHBlZEtleSkgeworICAgICAgICBVTlVTRUQoY2VydGlmaWNhdGUpOworICAgICAgICBVTlVTRUQod3JhcHBlZEtleSk7CisgICAgICAgIGlmIChyZXNwb25zZS5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgLy8gZW1wdHkgcmVzcG9uc2UKKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4gPiYgc2VjdXJlU3RvcHMpIHsKKyAgICAgICAgVU5VU0VEKHNlY3VyZVN0b3BzKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzaWQsIFZlY3Rvcjx1aW50OF90PiAmc2VjdXJlU3RvcCkgeworICAgICAgICBpZiAoc3NpZC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIFVOVVNFRChzZWN1cmVTdG9wKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNlY3VyZVN0b3BzKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc3NSZWxlYXNlKSB7CisgICAgICAgIGlmIChzc1JlbGVhc2Uuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUFsbFNlY3VyZVN0b3BzKCkgeworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRIZGNwTGV2ZWxzKEhkY3BMZXZlbCAqY29ubmVjdGVkTGV2ZWwsCisgICAgICAgICAgICBIZGNwTGV2ZWwgKm1heExldmVsKSBjb25zdCB7CisgICAgICAgIFVOVVNFRChjb25uZWN0ZWRMZXZlbCk7CisgICAgICAgIFVOVVNFRChtYXhMZXZlbCk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TnVtYmVyT2ZTZXNzaW9ucyh1aW50MzJfdCAqY3VycmVudFNlc3Npb25zLAorICAgICAgICAgICAgdWludDMyX3QgKm1heFNlc3Npb25zKSBjb25zdCB7CisgICAgICAgIFVOVVNFRChjdXJyZW50U2Vzc2lvbnMpOworICAgICAgICBVTlVTRUQobWF4U2Vzc2lvbnMpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cml0eUxldmVsKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgU2VjdXJpdHlMZXZlbCAqbGV2ZWwpIGNvbnN0IHsKKyAgICAgICAgVU5VU0VEKHNlc3Npb25JZCk7CisgICAgICAgIFVOVVNFRChsZXZlbCk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFNlY3VyaXR5TGV2ZWwoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBTZWN1cml0eUxldmVsJiBsZXZlbCkgeworICAgICAgICBVTlVTRUQoc2Vzc2lvbklkKTsKKyAgICAgICAgVU5VU0VEKGxldmVsKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmcoCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBuYW1lLCBTdHJpbmc4JiB2YWx1ZSkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5Qnl0ZUFycmF5KAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZSwgVmVjdG9yPHVpbnQ4X3Q+JiB2YWx1ZSkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByb3BlcnR5U3RyaW5nKAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZSwgY29uc3QgU3RyaW5nOCYgdmFsdWUpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcm9wZXJ0eUJ5dGVBcnJheSgKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgdmFsdWUpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDaXBoZXJBbGdvcml0aG0oCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwgY29uc3QgU3RyaW5nOCYgYWxnb3JpdGhtKSB7CisgICAgICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDAgfHwgYWxnb3JpdGhtLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hY0FsZ29yaXRobSgKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLCBjb25zdCBTdHJpbmc4JiBhbGdvcml0aG0pIHsKKyAgICAgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCB8fCBhbGdvcml0aG0uc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5jcnlwdCgKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBrZXlJZCwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaW5wdXQsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGl2LAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+JiBvdXRwdXQpIHsKKyAgICAgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCB8fCBrZXlJZC5zaXplKCkgPT0gMCB8fAorICAgICAgICAgICAgICAgIGlucHV0LnNpemUoKSA9PSAwIHx8IGl2LnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6QkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFVOVVNFRChvdXRwdXQpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBkZWNyeXB0KAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGtleUlkLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBpbnB1dCwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgaXYsCisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIG91dHB1dCkgeworICAgICAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwIHx8IGtleUlkLnNpemUoKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgaW5wdXQuc2l6ZSgpID09IDAgfHwgaXYuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgVU5VU0VEKG91dHB1dCk7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNpZ24oCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYga2V5SWQsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIG1lc3NhZ2UsCisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIHNpZ25hdHVyZSkgeworICAgICAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwIHx8IGtleUlkLnNpemUoKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgbWVzc2FnZS5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBVTlVTRUQoc2lnbmF0dXJlKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5KAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIGtleUlkLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBtZXNzYWdlLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzaWduYXR1cmUsIGJvb2wmIG1hdGNoKSB7CisgICAgICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDAgfHwga2V5SWQuc2l6ZSgpID09IDAgfHwKKyAgICAgICAgICAgICAgICBtZXNzYWdlLnNpemUoKSA9PSAwIHx8IHNpZ25hdHVyZS5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBVTlVTRUQobWF0Y2gpOworICAgICAgICByZXR1cm4gYW5kcm9pZDo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzaWduUlNBKAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhbGdvcml0aG0sCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIG1lc3NhZ2UsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHdyYXBwZWRLZXksCisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4mIHNpZ25hdHVyZSkgeworICAgICAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwIHx8IGFsZ29yaXRobS5zaXplKCkgPT0gMCB8fAorICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2l6ZSgpID09IDAgfHwgd3JhcHBlZEtleS5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBVTlVTRUQoc2lnbmF0dXJlKTsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworcHJpdmF0ZToKKyAgICB2b2lkIGluaXRQcm9wZXJ0aWVzKCk7CisgICAgdm9pZCBzZXRQbGF5UG9saWN5KCk7CisKKyAgICBhbmRyb2lkOjpLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtUGxheVBvbGljeTsKKyAgICBhbmRyb2lkOjpLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtU3RyaW5nUHJvcGVydGllczsKKyAgICBhbmRyb2lkOjpLZXllZFZlY3RvcjxTdHJpbmc4LCBWZWN0b3I8dWludDhfdD4+IG1CeXRlQXJyYXlQcm9wZXJ0aWVzOworCisgICAgU2Vzc2lvbkxpYnJhcnkqIG1TZXNzaW9uTGlicmFyeTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERybVBsdWdpbik7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleWRybQorCisjZW5kaWYgLy8gQ0xFQVJLRVlfRFJNX1BMVUdJTl9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSW5pdERhdGFQYXJzZXIuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvaW5jbHVkZS9Jbml0RGF0YVBhcnNlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9Jbml0RGF0YVBhcnNlci5oCnJlbmFtZSB0byBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L2luY2x1ZGUvSW5pdERhdGFQYXJzZXIuaApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSnNvbldlYktleS5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9pbmNsdWRlL0pzb25XZWJLZXkuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvSnNvbldlYktleS5oCnJlbmFtZSB0byBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L2luY2x1ZGUvSnNvbldlYktleS5oCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9TZXNzaW9uLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L2luY2x1ZGUvU2Vzc2lvbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9TZXNzaW9uLmgKcmVuYW1lIHRvIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvaW5jbHVkZS9TZXNzaW9uLmgKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L1Nlc3Npb25MaWJyYXJ5LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L2luY2x1ZGUvU2Vzc2lvbkxpYnJhcnkuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvU2Vzc2lvbkxpYnJhcnkuaApyZW5hbWUgdG8gZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9pbmNsdWRlL1Nlc3Npb25MaWJyYXJ5LmgKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0Flc0N0ckRlY3J5cHRvclVuaXR0ZXN0LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvdGVzdHMvQWVzQ3RyRGVjcnlwdG9yVW5pdHRlc3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BZXNDdHJEZWNyeXB0b3JVbml0dGVzdC5jcHAKcmVuYW1lIHRvIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvdGVzdHMvQWVzQ3RyRGVjcnlwdG9yVW5pdHRlc3QuY3BwCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L3Rlc3RzL0FuZHJvaWQuYnAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQxOTg2NQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvdGVzdHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDQyIEBACisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQnVpbGRzIENsZWFyS2V5IERybSBUZXN0cworLy8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIkNsZWFyS2V5RHJtVW5pdFRlc3QiLAorICAgIHZlbmRvcjogdHJ1ZSwKKworICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJBZXNDdHJEZWNyeXB0b3JVbml0dGVzdC5jcHAiLAorICAgICAgICAiSW5pdERhdGFQYXJzZXJVbml0dGVzdC5jcHAiLAorICAgICAgICAiSnNvbldlYktleVVuaXR0ZXN0LmNwcCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYmNsZWFya2V5Y29tbW9uIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3J5cHRvIiwKKyAgICAgICAgImxpYmRybWNsZWFya2V5cGx1Z2luIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbIm1lZGlhX3BsdWdpbl9oZWFkZXJzIl0sCit9CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9Jbml0RGF0YVBhcnNlclVuaXR0ZXN0LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvdGVzdHMvSW5pdERhdGFQYXJzZXJVbml0dGVzdC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0luaXREYXRhUGFyc2VyVW5pdHRlc3QuY3BwCnJlbmFtZSB0byBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L3Rlc3RzL0luaXREYXRhUGFyc2VyVW5pdHRlc3QuY3BwCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9Kc29uV2ViS2V5VW5pdHRlc3QuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC90ZXN0cy9Kc29uV2ViS2V5VW5pdHRlc3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9Kc29uV2ViS2V5VW5pdHRlc3QuY3BwCnJlbmFtZSB0byBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L3Rlc3RzL0pzb25XZWJLZXlVbml0dGVzdC5jcHAKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQWVzQ3RyRGVjcnlwdG9yLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQWVzQ3RyRGVjcnlwdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmNlMDc5MAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQWVzQ3RyRGVjcnlwdG9yLmNwcApAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJoaWRsX0NsZWFya2V5RGVjcnlwdG9yIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KKworI2luY2x1ZGUgIkFlc0N0ckRlY3J5cHRvci5oIgorI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIGNsZWFya2V5IHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdWJTYW1wbGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN0YXR1czsKKworc3RhdGljIGNvbnN0IHNpemVfdCBrQmxvY2tCaXRDb3VudCA9IGtCbG9ja1NpemUgKiA4OworCitTdGF0dXMgQWVzQ3RyRGVjcnlwdG9yOjpkZWNyeXB0KAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYga2V5LAorICAgICAgICBjb25zdCBJdiBpdiwgY29uc3QgdWludDhfdCogc291cmNlLAorICAgICAgICB1aW50OF90KiBkZXN0aW5hdGlvbiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8U3ViU2FtcGxlPiBzdWJTYW1wbGVzLAorICAgICAgICBzaXplX3QgbnVtU3ViU2FtcGxlcywKKyAgICAgICAgc2l6ZV90KiBieXRlc0RlY3J5cHRlZE91dCkgeworICAgIHVpbnQzMl90IGJsb2NrT2Zmc2V0ID0gMDsKKyAgICB1aW50OF90IHByZXZpb3VzRW5jcnlwdGVkQ291bnRlcltrQmxvY2tTaXplXTsKKyAgICBtZW1zZXQocHJldmlvdXNFbmNyeXB0ZWRDb3VudGVyLCAwLCBrQmxvY2tTaXplKTsKKworICAgIGlmIChrZXkuc2l6ZSgpICE9IGtCbG9ja1NpemUgfHwgKHNpemVvZihJdikgLyBzaXplb2YodWludDhfdCkpICE9IGtCbG9ja1NpemUpIHsKKyAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI2Mzk4Mjc2OCIpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fREVDUllQVDsKKyAgICB9CisKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICBBRVNfS0VZIG9wZW5zc2xLZXk7CisgICAgQUVTX3NldF9lbmNyeXB0X2tleShrZXkuZGF0YSgpLCBrQmxvY2tCaXRDb3VudCwgJm9wZW5zc2xLZXkpOworICAgIEl2IG9wZW5zc2xJdjsKKyAgICBtZW1jcHkob3BlbnNzbEl2LCBpdiwgc2l6ZW9mKG9wZW5zc2xJdikpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdWJTYW1wbGVzOyArK2kpIHsKKyAgICAgICAgY29uc3QgU3ViU2FtcGxlJiBzdWJTYW1wbGUgPSBzdWJTYW1wbGVzW2ldOworCisgICAgICAgIGlmIChzdWJTYW1wbGUubnVtQnl0ZXNPZkNsZWFyRGF0YSA+IDApIHsKKyAgICAgICAgICAgIG1lbWNweShkZXN0aW5hdGlvbiArIG9mZnNldCwgc291cmNlICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGUubnVtQnl0ZXNPZkNsZWFyRGF0YSk7CisgICAgICAgICAgICBvZmZzZXQgKz0gc3ViU2FtcGxlLm51bUJ5dGVzT2ZDbGVhckRhdGE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3ViU2FtcGxlLm51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhID4gMCkgeworICAgICAgICAgICAgQUVTX2N0cjEyOF9lbmNyeXB0KHNvdXJjZSArIG9mZnNldCwgZGVzdGluYXRpb24gKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIHN1YlNhbXBsZS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YSwgJm9wZW5zc2xLZXksCisgICAgICAgICAgICAgICAgICAgIG9wZW5zc2xJdiwgcHJldmlvdXNFbmNyeXB0ZWRDb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAmYmxvY2tPZmZzZXQpOworICAgICAgICAgICAgb2Zmc2V0ICs9IHN1YlNhbXBsZS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YTsKKyAgICAgICAgfQorICAgIH0KKworICAgICpieXRlc0RlY3J5cHRlZE91dCA9IG9mZnNldDsKKyAgICByZXR1cm4gU3RhdHVzOjpPSzsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKK30gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIGRybQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BbmRyb2lkLmJwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MWQ0ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2OCBAQAorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8KKworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xLXNlcnZpY2UuY2xlYXJrZXkiLAorICAgIHZlbmRvcjogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkFlc0N0ckRlY3J5cHRvci5jcHAiLAorICAgICAgICAiQmFzZTY0LmNwcCIsCisgICAgICAgICJCdWZmZXIuY3BwIiwKKyAgICAgICAgIkNyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAiLAorICAgICAgICAiQ3J5cHRvRmFjdG9yeS5jcHAiLAorICAgICAgICAiQ3J5cHRvUGx1Z2luLmNwcCIsCisgICAgICAgICJEcm1GYWN0b3J5LmNwcCIsCisgICAgICAgICJEcm1QbHVnaW4uY3BwIiwKKyAgICAgICAgIkluaXREYXRhUGFyc2VyLmNwcCIsCisgICAgICAgICJKc29uV2ViS2V5LmNwcCIsCisgICAgICAgICJTZXNzaW9uLmNwcCIsCisgICAgICAgICJTZXNzaW9uTGlicmFyeS5jcHAiLAorICAgICAgICAic2VydmljZS5jcHAiLAorICAgIF0sCisKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJodyIsCisKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAorICAgIGluaXRfcmM6IFsiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xLXNlcnZpY2UuY2xlYXJrZXkucmMiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmNyeXB0byIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmNsZWFya2V5Y29tbW9uIiwKKyAgICAgICAgImxpYmpzbW4iLAorICAgIF0sCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorCisgICAgZXhwb3J0X3N0YXRpY19saWJfaGVhZGVyczogWyJsaWJqc21uIl0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBpbnRlZ2VyX292ZXJmbG93OiB0cnVlLAorICAgIH0sCit9CisKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQmFzZTY0LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQmFzZTY0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmVkNzUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9CYXNlNjQuY3BwCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkJhc2U2NC5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCitzcDxCdWZmZXI+IGRlY29kZUJhc2U2NChjb25zdCBzdGQ6OnN0cmluZyAmcykgeworICAgIHNpemVfdCBuID0gcy5zaXplKCk7CisKKyAgICBpZiAoKG4gJSA0KSAhPSAwKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHNpemVfdCBwYWRkaW5nID0gMDsKKyAgICBpZiAobiA+PSAxICYmIHMuY19zdHIoKVtuIC0gMV0gPT0gJz0nKSB7CisgICAgICAgIHBhZGRpbmcgPSAxOworCisgICAgICAgIGlmIChuID49IDIgJiYgcy5jX3N0cigpW24gLSAyXSA9PSAnPScpIHsKKyAgICAgICAgICAgIHBhZGRpbmcgPSAyOworCisgICAgICAgICAgICBpZiAobiA+PSAzICYmIHMuY19zdHIoKVtuIC0gM10gPT0gJz0nKSB7CisgICAgICAgICAgICAgICAgcGFkZGluZyA9IDM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBXZSBkaXZpZGUgZmlyc3QgdG8gYXZvaWQgb3ZlcmZsb3cuIEl0J3MgT0sgdG8gZG8gdGhpcyBiZWNhdXNlIHdlCisgICAgLy8gYWxyZWFkeSBtYWRlIHN1cmUgdGhhdCBuICUgNCA9PSAwLgorICAgIHNpemVfdCBvdXRMZW4gPSAobiAvIDQpICogMyAtIHBhZGRpbmc7CisKKyAgICBzcDxCdWZmZXI+IGJ1ZmZlciA9IG5ldyBCdWZmZXIob3V0TGVuKTsKKyAgICB1aW50OF90ICpvdXQgPSBidWZmZXItPmRhdGEoKTsKKyAgICBpZiAob3V0ID09IG51bGxwdHIgfHwgYnVmZmVyLT5zaXplKCkgPCBvdXRMZW4pIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgc2l6ZV90IGogPSAwOworICAgIHVpbnQzMl90IGFjY3VtID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBjaGFyIGMgPSBzLmNfc3RyKClbaV07CisgICAgICAgIHVuc2lnbmVkIHZhbHVlOworICAgICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHsKKyAgICAgICAgICAgIHZhbHVlID0gYyAtICdBJzsKKyAgICAgICAgfSBlbHNlIGlmIChjID49ICdhJyAmJiBjIDw9ICd6JykgeworICAgICAgICAgICAgdmFsdWUgPSAyNiArIGMgLSAnYSc7CisgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsKKyAgICAgICAgICAgIHZhbHVlID0gNTIgKyBjIC0gJzAnOworICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJysnIHx8IGMgPT0gJy0nKSB7CisgICAgICAgICAgICB2YWx1ZSA9IDYyOworICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJy8nIHx8IGMgPT0gJ18nKSB7CisgICAgICAgICAgICB2YWx1ZSA9IDYzOworICAgICAgICB9IGVsc2UgaWYgKGMgIT0gJz0nKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpIDwgbiAtIHBhZGRpbmcpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFsdWUgPSAwOworICAgICAgICB9CisKKyAgICAgICAgYWNjdW0gPSAoYWNjdW0gPDwgNikgfCB2YWx1ZTsKKworICAgICAgICBpZiAoKChpICsgMSkgJSA0KSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoaiA8IG91dExlbikgeyBvdXRbaisrXSA9IChhY2N1bSA+PiAxNik7IH0KKyAgICAgICAgICAgIGlmIChqIDwgb3V0TGVuKSB7IG91dFtqKytdID0gKGFjY3VtID4+IDgpICYgMHhmZjsgfQorICAgICAgICAgICAgaWYgKGogPCBvdXRMZW4pIHsgb3V0W2orK10gPSBhY2N1bSAmIDB4ZmY7IH0KKworICAgICAgICAgICAgYWNjdW0gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGJ1ZmZlcjsKK30KKworc3RhdGljIGNoYXIgZW5jb2RlNkJpdCh1bnNpZ25lZCB4KSB7CisgICAgaWYgKHggPD0gMjUpIHsKKyAgICAgICAgcmV0dXJuICdBJyArIHg7CisgICAgfSBlbHNlIGlmICh4IDw9IDUxKSB7CisgICAgICAgIHJldHVybiAnYScgKyB4IC0gMjY7CisgICAgfSBlbHNlIGlmICh4IDw9IDYxKSB7CisgICAgICAgIHJldHVybiAnMCcgKyB4IC0gNTI7CisgICAgfSBlbHNlIGlmICh4ID09IDYyKSB7CisgICAgICAgIHJldHVybiAnKyc7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICcvJzsKKyAgICB9Cit9CisKK3ZvaWQgZW5jb2RlQmFzZTY0KGNvbnN0IHZvaWQgKl9kYXRhLCBzaXplX3Qgc2l6ZSwgc3RkOjpzdHJpbmcgKm91dCkgeworICAgIG91dC0+Y2xlYXIoKTsKKworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSAoY29uc3QgdWludDhfdCAqKV9kYXRhOworCisgICAgc2l6ZV90IGk7CisgICAgZm9yIChpID0gMDsgaSA8IChzaXplIC8gMykgKiAzOyBpICs9IDMpIHsKKyAgICAgICAgdWludDhfdCB4MSA9IGRhdGFbaV07CisgICAgICAgIHVpbnQ4X3QgeDIgPSBkYXRhW2kgKyAxXTsKKyAgICAgICAgdWludDhfdCB4MyA9IGRhdGFbaSArIDJdOworCisgICAgICAgIG91dC0+cHVzaF9iYWNrKGVuY29kZTZCaXQoeDEgPj4gMikpOworICAgICAgICBvdXQtPnB1c2hfYmFjayhlbmNvZGU2Qml0KCh4MSA8PCA0IHwgeDIgPj4gNCkgJiAweDNmKSk7CisgICAgICAgIG91dC0+cHVzaF9iYWNrKGVuY29kZTZCaXQoKHgyIDw8IDIgfCB4MyA+PiA2KSAmIDB4M2YpKTsKKyAgICAgICAgb3V0LT5wdXNoX2JhY2soZW5jb2RlNkJpdCh4MyAmIDB4M2YpKTsKKyAgICB9CisgICAgc3dpdGNoIChzaXplICUgMykgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHgxID0gZGF0YVtpXTsKKyAgICAgICAgICAgIHVpbnQ4X3QgeDIgPSBkYXRhW2kgKyAxXTsKKyAgICAgICAgICAgIG91dC0+cHVzaF9iYWNrKGVuY29kZTZCaXQoeDEgPj4gMikpOworICAgICAgICAgICAgb3V0LT5wdXNoX2JhY2soZW5jb2RlNkJpdCgoeDEgPDwgNCB8IHgyID4+IDQpICYgMHgzZikpOworICAgICAgICAgICAgb3V0LT5wdXNoX2JhY2soZW5jb2RlNkJpdCgoeDIgPDwgMikgJiAweDNmKSk7CisgICAgICAgICAgICBvdXQtPnB1c2hfYmFjaygnPScpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB4MSA9IGRhdGFbaV07CisgICAgICAgICAgICBvdXQtPnB1c2hfYmFjayhlbmNvZGU2Qml0KHgxID4+IDIpKTsKKyAgICAgICAgICAgIG91dC0+cHVzaF9iYWNrKGVuY29kZTZCaXQoKHgxIDw8IDQpICYgMHgzZikpOworICAgICAgICAgICAgb3V0LT5hcHBlbmQoIj09Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBlbmNvZGVCYXNlNjRVcmwoY29uc3Qgdm9pZCAqX2RhdGEsIHNpemVfdCBzaXplLCBzdGQ6OnN0cmluZyAqb3V0KSB7CisgICAgZW5jb2RlQmFzZTY0KF9kYXRhLCBzaXplLCBvdXQpOworCisgICAgaWYgKChzdGQ6OnN0cmluZzo6bnBvcyAhPSBvdXQtPmZpbmQoIisiKSkgfHwKKyAgICAgICAgICAgIChzdGQ6OnN0cmluZzo6bnBvcyAhPSBvdXQtPmZpbmQoIi8iKSkpIHsKKyAgICAgICAgc2l6ZV90IG91dExlbiA9IG91dC0+c2l6ZSgpOworICAgICAgICBjaGFyICpiYXNlNjR1cmwgPSBuZXcgY2hhcltvdXRMZW5dOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dExlbjsgKytpKSB7CisgICAgICAgICAgICBpZiAob3V0LT5jX3N0cigpW2ldID09ICcrJykKKyAgICAgICAgICAgICAgICBiYXNlNjR1cmxbaV0gPSAnLSc7CisgICAgICAgICAgICBlbHNlIGlmIChvdXQtPmNfc3RyKClbaV0gPT0gJy8nKQorICAgICAgICAgICAgICAgIGJhc2U2NHVybFtpXSA9ICdfJzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBiYXNlNjR1cmxbaV0gPSBvdXQtPmNfc3RyKClbaV07CisgICAgICAgIH0KKworICAgICAgICBvdXQtPmFzc2lnbihiYXNlNjR1cmwsIG91dExlbik7CisgICAgICAgIGRlbGV0ZVtdIGJhc2U2NHVybDsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBkcm0KK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0J1ZmZlci5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0J1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU4ZjU4YQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQnVmZmVyLmNwcApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkJ1ZmZlci5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL3R5cGVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK0J1ZmZlcjo6QnVmZmVyKHNpemVfdCBjYXBhY2l0eSkKKyAgICAgIDogbVJhbmdlT2Zmc2V0KDApLAorICAgICAgbU93bnNEYXRhKHRydWUpIHsKKyAgICBtRGF0YSA9IG1hbGxvYyhjYXBhY2l0eSk7CisgICAgaWYgKG1EYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgbUNhcGFjaXR5ID0gMDsKKyAgICAgICAgbVJhbmdlTGVuZ3RoID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ2FwYWNpdHkgPSBjYXBhY2l0eTsKKyAgICAgICAgbVJhbmdlTGVuZ3RoID0gY2FwYWNpdHk7CisgICAgfQorfQorCitCdWZmZXI6On5CdWZmZXIoKSB7CisgICAgaWYgKG1Pd25zRGF0YSkgeworICAgICAgICBpZiAobURhdGEgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZnJlZShtRGF0YSk7CisgICAgICAgICAgICBtRGF0YSA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBkcm0KK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJhNWM2YQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkNyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oIgorCisjaW5jbHVkZSAiQ3J5cHRvRmFjdG9yeS5oIgorI2luY2x1ZGUgIkRybUZhY3RvcnkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIGNsZWFya2V5IHsKKworZXh0ZXJuICJDIiB7CisKK0lEcm1GYWN0b3J5KiBjcmVhdGVEcm1GYWN0b3J5KCkgeworICAgIHJldHVybiBuZXcgRHJtRmFjdG9yeSgpOworfQorCitJQ3J5cHRvRmFjdG9yeSogY3JlYXRlQ3J5cHRvRmFjdG9yeSgpIHsKKyAgICByZXR1cm4gbmV3IENyeXB0b0ZhY3RvcnkoKTsKK30KKworfSAvLyBleHRlcm4gIkMiCisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAgLy8gbmFtZXNwYWNlIFYxXzEKK30gIC8vIG5hbWVzcGFjZSBkcm0KK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3J5cHRvRmFjdG9yeS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b0ZhY3RvcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NDhjZWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b0ZhY3RvcnkuY3BwCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImhpZGxfQ2xlYXJLZXlDcnlwdG9GYWN0b3J5IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQ3J5cHRvRmFjdG9yeS5oIgorCisjaW5jbHVkZSAiQ2xlYXJLZXlVVUlELmgiCisjaW5jbHVkZSAiQ3J5cHRvUGx1Z2luLmgiCisjaW5jbHVkZSAiVHlwZUNvbnZlcnQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIGNsZWFya2V5IHsKKworUmV0dXJuPGJvb2w+IENyeXB0b0ZhY3Rvcnk6OmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKAorICAgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgMTY+ICZ1dWlkKQoreworICAgIHJldHVybiBjbGVhcmtleWRybTo6aXNDbGVhcktleVVVSUQodXVpZC5kYXRhKCkpOworfQorCitSZXR1cm48dm9pZD4gQ3J5cHRvRmFjdG9yeTo6Y3JlYXRlUGx1Z2luKAorICAgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgMTY+ICZ1dWlkLAorICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+ICZpbml0RGF0YSwKKyAgICBjcmVhdGVQbHVnaW5fY2IgX2hpZGxfY2IpIHsKKworICAgIGlmICghaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZC5kYXRhKCkpKSB7CisgICAgICAgIEFMT0dFKCJDbGVhcmtleSBEcm0gSEFMOiBmYWlsZWQgdG8gY3JlYXRlIGNsZWFya2V5IHBsdWdpbiwgIiBcCisgICAgICAgICAgICAgICAgImludmFsaWQgY3J5cHRvIHNjaGVtZSIpOworICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkJBRF9WQUxVRSwgbnVsbHB0cik7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgQ3J5cHRvUGx1Z2luICpjcnlwdG9QbHVnaW4gPSBuZXcgQ3J5cHRvUGx1Z2luKGluaXREYXRhKTsKKyAgICBTdGF0dXMgc3RhdHVzID0gY3J5cHRvUGx1Z2luLT5nZXRJbml0U3RhdHVzKCk7CisgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6T0ssIGNyeXB0b1BsdWdpbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVsZXRlIGNyeXB0b1BsdWdpbjsKKyAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBudWxscHRyKTsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKK30gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIGRybQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9QbHVnaW4uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9QbHVnaW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzM2Y5NGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b1BsdWdpbi5jcHAKQEAgLTAsMCArMSwxODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImhpZGxfQ2xlYXJLZXlDcnlwdG9QbHVnaW4iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJDcnlwdG9QbHVnaW4uaCIKKyNpbmNsdWRlICJTZXNzaW9uTGlicmFyeS5oIgorI2luY2x1ZGUgIlR5cGVDb252ZXJ0LmgiCisKKyNpbmNsdWRlIDxoaWRsbWVtb3J5L21hcHBpbmcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIGNsZWFya2V5IHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpCdWZmZXJUeXBlOworCitSZXR1cm48dm9pZD4gQ3J5cHRvUGx1Z2luOjpzZXRTaGFyZWRCdWZmZXJCYXNlKAorICAgICAgICBjb25zdCBoaWRsX21lbW9yeSYgYmFzZSwgdWludDMyX3QgYnVmZmVySWQpIHsKKyAgICBzcDxJTWVtb3J5PiBoaWRsTWVtb3J5ID0gbWFwTWVtb3J5KGJhc2UpOworICAgIEFMT0dFX0lGKGhpZGxNZW1vcnkgPT0gbnVsbHB0ciwgIm1hcE1lbW9yeSByZXR1cm5zIG51bGxwdHIiKTsKKworICAgIC8vIGFsbG93IG1hcE1lbW9yeSB0byByZXR1cm4gbnVsbHB0cgorICAgIG1TaGFyZWRCdWZmZXJNYXBbYnVmZmVySWRdID0gaGlkbE1lbW9yeTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCisvLyBSZXR1cm5zIG5lZ2F0aXZlIHZhbHVlcyBmb3IgZXJyb3IgY29kZSBhbmQgcG9zaXRpdmUgdmFsdWVzIGZvciB0aGUgc2l6ZSBvZgorLy8gZGVjcnlwdGVkIGRhdGEuICBJbiB0aGVvcnksIHRoZSBvdXRwdXQgc2l6ZSBjYW4gYmUgbGFyZ2VyIHRoYW4gdGhlIGlucHV0CisvLyBzaXplLCBidXQgaW4gcHJhY3RpY2UgdGhpcyB3aWxsIG5ldmVyIGhhcHBlbiBmb3IgQUVTLUNUUi4KK1JldHVybjx2b2lkPiBDcnlwdG9QbHVnaW46OmRlY3J5cHQoCisgICAgICAgIGJvb2wgc2VjdXJlLAorICAgICAgICBjb25zdCBoaWRsX2FycmF5PHVpbnQ4X3QsIEtFWV9JRF9TSVpFPiYga2V5SWQsCisgICAgICAgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgS0VZX0lWX1NJWkU+JiBpdiwKKyAgICAgICAgTW9kZSBtb2RlLAorICAgICAgICBjb25zdCBQYXR0ZXJuJiBwYXR0ZXJuLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzxTdWJTYW1wbGU+JiBzdWJTYW1wbGVzLAorICAgICAgICBjb25zdCBTaGFyZWRCdWZmZXImIHNvdXJjZSwKKyAgICAgICAgdWludDY0X3Qgb2Zmc2V0LAorICAgICAgICBjb25zdCBEZXN0aW5hdGlvbkJ1ZmZlciYgZGVzdGluYXRpb24sCisgICAgICAgIGRlY3J5cHRfY2IgX2hpZGxfY2IpIHsKKyAgICBVTlVTRUQocGF0dGVybik7CisKKyAgICBpZiAoc2VjdXJlKSB7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCisgICAgICAgICAgICAiU2VjdXJlIGRlY3J5cHRpb24gaXMgbm90IHN1cHBvcnRlZCB3aXRoIENsZWFyS2V5LiIpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIGlmIChtU2hhcmVkQnVmZmVyTWFwLmZpbmQoc291cmNlLmJ1ZmZlcklkKSA9PSBtU2hhcmVkQnVmZmVyTWFwLmVuZCgpKSB7CisgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAorICAgICAgICAgICAgICAgInNvdXJjZSBkZWNyeXB0IGJ1ZmZlciBiYXNlIG5vdCBzZXQiKTsKKyAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgaWYgKGRlc3RpbmF0aW9uLnR5cGUgPT0gQnVmZmVyVHlwZTo6U0hBUkVEX01FTU9SWSkgeworICAgICAgY29uc3QgU2hhcmVkQnVmZmVyJiBkZXN0ID0gZGVzdGluYXRpb24ubm9uc2VjdXJlTWVtb3J5OworICAgICAgaWYgKG1TaGFyZWRCdWZmZXJNYXAuZmluZChkZXN0LmJ1ZmZlcklkKSA9PSBtU2hhcmVkQnVmZmVyTWFwLmVuZCgpKSB7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCisgICAgICAgICAgICAgICAgICJkZXN0aW5hdGlvbiBkZWNyeXB0IGJ1ZmZlciBiYXNlIG5vdCBzZXQiKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzcDxJTWVtb3J5PiBzb3VyY2VCYXNlID0gbVNoYXJlZEJ1ZmZlck1hcFtzb3VyY2UuYnVmZmVySWRdOworICAgIGlmIChzb3VyY2VCYXNlID09IG51bGxwdHIpIHsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwgInNvdXJjZSBpcyBhIG51bGxwdHIiKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBpZiAoc291cmNlLm9mZnNldCArIG9mZnNldCArIHNvdXJjZS5zaXplID4gc291cmNlQmFzZS0+Z2V0U2l6ZSgpKSB7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsICJpbnZhbGlkIGJ1ZmZlciBzaXplIik7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgdWludDhfdCAqYmFzZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4KKyAgICAgICAgICAgIChzdGF0aWNfY2FzdDx2b2lkICo+KHNvdXJjZUJhc2UtPmdldFBvaW50ZXIoKSkpOworICAgIHVpbnQ4X3QqIHNyY1B0ciA9IHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4oYmFzZSArIHNvdXJjZS5vZmZzZXQgKyBvZmZzZXQpOworICAgIHZvaWQqIGRlc3RQdHIgPSBOVUxMOworICAgIGlmIChkZXN0aW5hdGlvbi50eXBlID09IEJ1ZmZlclR5cGU6OlNIQVJFRF9NRU1PUlkpIHsKKyAgICAgICAgY29uc3QgU2hhcmVkQnVmZmVyJiBkZXN0QnVmZmVyID0gZGVzdGluYXRpb24ubm9uc2VjdXJlTWVtb3J5OworICAgICAgICBzcDxJTWVtb3J5PiBkZXN0QmFzZSA9IG1TaGFyZWRCdWZmZXJNYXBbZGVzdEJ1ZmZlci5idWZmZXJJZF07CisgICAgICAgIGlmIChkZXN0QmFzZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLCAiZGVzdGluYXRpb24gaXMgYSBudWxscHRyIik7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlc3RCdWZmZXIub2Zmc2V0ICsgZGVzdEJ1ZmZlci5zaXplID4gZGVzdEJhc2UtPmdldFNpemUoKSkgeworICAgICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwgImludmFsaWQgYnVmZmVyIHNpemUiKTsKKyAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgIH0KKyAgICAgICAgZGVzdFB0ciA9IHN0YXRpY19jYXN0PHZvaWQgKj4oYmFzZSArIGRlc3RpbmF0aW9uLm5vbnNlY3VyZU1lbW9yeS5vZmZzZXQpOworICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24udHlwZSA9PSBCdWZmZXJUeXBlOjpOQVRJVkVfSEFORExFKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4oCisgICAgICAgIGRlc3RpbmF0aW9uLnNlY3VyZU1lbW9yeS5nZXROYXRpdmVIYW5kbGUoKSk7CisgICAgICAgIGRlc3RQdHIgPSBzdGF0aWNfY2FzdDx2b2lkICo+KGhhbmRsZSk7CisgICAgfQorCisgICAgLy8gQ2FsY3VsYXRlIHRoZSBvdXRwdXQgYnVmZmVyIHNpemUgYW5kIGRldGVybWluZSBpZiBhbnkgc3Vic2FtcGxlcyBhcmUKKyAgICAvLyBlbmNyeXB0ZWQuCisgICAgc2l6ZV90IGRlc3RTaXplID0gMDsKKyAgICBib29sIGhhdmVFbmNyeXB0ZWRTdWJzYW1wbGVzID0gZmFsc2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdWJTYW1wbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IFN1YlNhbXBsZSAmc3ViU2FtcGxlID0gc3ViU2FtcGxlc1tpXTsKKyAgICAgICAgZGVzdFNpemUgKz0gc3ViU2FtcGxlLm51bUJ5dGVzT2ZDbGVhckRhdGE7CisgICAgICAgIGRlc3RTaXplICs9IHN1YlNhbXBsZS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YTsKKyAgICAgICAgaWYgKHN1YlNhbXBsZS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YSA+IDApIHsKKyAgICAgICAgaGF2ZUVuY3J5cHRlZFN1YnNhbXBsZXMgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1vZGUgPT0gTW9kZTo6VU5FTkNSWVBURUQpIHsKKyAgICAgICAgaWYgKGhhdmVFbmNyeXB0ZWRTdWJzYW1wbGVzKSB7CisgICAgICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAorICAgICAgICAgICAgICAgICAgICAiRW5jcnlwdGVkIHN1YnNhbXBsZXMgZm91bmQgaW4gYWxsZWdlZGx5IHVuZW5jcnlwdGVkIGRhdGEuIik7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3ViU2FtcGxlcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgY29uc3QgU3ViU2FtcGxlJiBzdWJTYW1wbGUgPSBzdWJTYW1wbGVzW2ldOworICAgICAgICAgICAgaWYgKHN1YlNhbXBsZS5udW1CeXRlc09mQ2xlYXJEYXRhICE9IDApIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oZGVzdFB0cikgKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHNyY1B0cikgKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHN1YlNhbXBsZS5udW1CeXRlc09mQ2xlYXJEYXRhKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc3ViU2FtcGxlLm51bUJ5dGVzT2ZDbGVhckRhdGE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCBzdGF0aWNfY2FzdDxzc2l6ZV90PihvZmZzZXQpLCAiIik7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfSBlbHNlIGlmIChtb2RlID09IE1vZGU6OkFFU19DVFIpIHsKKyAgICAgICAgc2l6ZV90IGJ5dGVzRGVjcnlwdGVkOworICAgICAgICBTdGF0dXMgcmVzID0gbVNlc3Npb24tPmRlY3J5cHQoa2V5SWQuZGF0YSgpLCBpdi5kYXRhKCksIHNyY1B0ciwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90Kj4oZGVzdFB0ciksIHRvVmVjdG9yKHN1YlNhbXBsZXMpLCAmYnl0ZXNEZWNyeXB0ZWQpOworICAgICAgICBpZiAocmVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6T0ssIHN0YXRpY19jYXN0PHNzaXplX3Q+KGJ5dGVzRGVjcnlwdGVkKSwgIiIpOworICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0RFQ1JZUFQsIHN0YXRpY19jYXN0PHNzaXplX3Q+KHJlcyksCisgICAgICAgICAgICAgICAgICAgICJEZWNyeXB0aW9uIEVycm9yIik7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwKKyAgICAgICAgICAgICAgICAiU2VsZWN0ZWQgZW5jcnlwdGlvbiBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIENsZWFyS2V5IERSTSBQbHVnaW4uIik7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorfQorCitSZXR1cm48U3RhdHVzPiBDcnlwdG9QbHVnaW46OnNldE1lZGlhRHJtU2Vzc2lvbigKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgIGlmICghc2Vzc2lvbklkLnNpemUoKSkgeworICAgICAgICBtU2Vzc2lvbiA9IG51bGxwdHI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNlc3Npb24gPSBTZXNzaW9uTGlicmFyeTo6Z2V0KCktPmZpbmRTZXNzaW9uKHNlc3Npb25JZCk7CisgICAgICAgIGlmICghbVNlc3Npb24uZ2V0KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6T0s7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBkcm0KK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybUZhY3RvcnkuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1GYWN0b3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzU1N2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1GYWN0b3J5LmNwcApAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJoaWRsX0NsZWFyS2V5RHJtRmFjdG9yeSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisjaW5jbHVkZSAiRHJtRmFjdG9yeS5oIgorCisjaW5jbHVkZSAiRHJtUGx1Z2luLmgiCisjaW5jbHVkZSAiQ2xlYXJLZXlVVUlELmgiCisjaW5jbHVkZSAiTWltZVR5cGUuaCIKKyNpbmNsdWRlICJTZXNzaW9uTGlicmFyeS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CisKK1JldHVybjxib29sPiBEcm1GYWN0b3J5Ojppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCgKKyAgICAgICAgY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCAxNj4mIHV1aWQpIHsKKyAgICByZXR1cm4gY2xlYXJrZXlkcm06OmlzQ2xlYXJLZXlVVUlEKHV1aWQuZGF0YSgpKTsKK30KKworUmV0dXJuPGJvb2w+IERybUZhY3Rvcnk6OmlzQ29udGVudFR5cGVTdXBwb3J0ZWQoY29uc3QgaGlkbF9zdHJpbmcgJm1pbWVUeXBlKSB7CisgICAgLy8gVGhpcyBzaG91bGQgbWF0Y2ggdGhlIG1pbWVUeXBlcyBoYW5kZWQgYnkgSW5pdERhdGFQYXJzZXIuCisgICAgcmV0dXJuIG1pbWVUeXBlID09IGtJc29CbWZmVmlkZW9NaW1lVHlwZSB8fAorICAgICAgICAgICAgbWltZVR5cGUgPT0ga0lzb0JtZmZBdWRpb01pbWVUeXBlIHx8CisgICAgICAgICAgICBtaW1lVHlwZSA9PSBrQ2VuY0luaXREYXRhRm9ybWF0IHx8CisgICAgICAgICAgICBtaW1lVHlwZSA9PSBrV2VibVZpZGVvTWltZVR5cGUgfHwKKyAgICAgICAgICAgIG1pbWVUeXBlID09IGtXZWJtQXVkaW9NaW1lVHlwZSB8fAorICAgICAgICAgICAgbWltZVR5cGUgPT0ga1dlYm1Jbml0RGF0YUZvcm1hdDsKK30KKworUmV0dXJuPHZvaWQ+IERybUZhY3Rvcnk6OmNyZWF0ZVBsdWdpbigKKyAgICBjb25zdCBoaWRsX2FycmF5PHVpbnQ4X3QsIDE2PiYgdXVpZCwKKyAgICBjb25zdCBoaWRsX3N0cmluZyYgYXBwUGFja2FnZU5hbWUsCisgICAgY3JlYXRlUGx1Z2luX2NiIF9oaWRsX2NiKSB7CisgICAgVU5VU0VEKGFwcFBhY2thZ2VOYW1lKTsKKworICAgIERybVBsdWdpbiAqcGx1Z2luID0gTlVMTDsKKyAgICBpZiAoIWlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQuZGF0YSgpKSkgeworICAgICAgICBBTE9HRSgiQ2xlYXIga2V5IERybSBIQUw6IGZhaWxlZCB0byBjcmVhdGUgZHJtIHBsdWdpbiwgIiBcCisgICAgICAgICAgICAgICAgImludmFsaWQgY3J5cHRvIHNjaGVtZSIpOworICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkJBRF9WQUxVRSwgcGx1Z2luKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBwbHVnaW4gPSBuZXcgRHJtUGx1Z2luKFNlc3Npb25MaWJyYXJ5OjpnZXQoKSk7CisgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywgcGx1Z2luKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgZHJtCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1QbHVnaW4uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1QbHVnaW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MWUyOWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybVBsdWdpbi5jcHAKQEAgLTAsMCArMSw1NzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImhpZGxfQ2xlYXJLZXlQbHVnaW4iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJEcm1QbHVnaW4uaCIKKyNpbmNsdWRlICJDbGVhcktleURybVByb3BlcnRpZXMuaCIKKyNpbmNsdWRlICJTZXNzaW9uLmgiCisjaW5jbHVkZSAiVHlwZUNvbnZlcnQuaCIKKworbmFtZXNwYWNlIHsKK2NvbnN0IGludCBrU2VjdXJlU3RvcElkU3RhcnQgPSAxMDA7Citjb25zdCBzdGQ6OnN0cmluZyBrU3RyZWFtaW5nKCJTdHJlYW1pbmciKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtPZmZsaW5lKCJPZmZsaW5lIik7Citjb25zdCBzdGQ6OnN0cmluZyBrVHJ1ZSgiVHJ1ZSIpOworCitjb25zdCBzdGQ6OnN0cmluZyBrUXVlcnlLZXlMaWNlbnNlVHlwZSgiTGljZW5zZVR5cGUiKTsKKyAgICAvLyBWYWx1ZTogIlN0cmVhbWluZyIgb3IgIk9mZmxpbmUiCitjb25zdCBzdGQ6OnN0cmluZyBrUXVlcnlLZXlQbGF5QWxsb3dlZCgiUGxheUFsbG93ZWQiKTsKKyAgICAvLyBWYWx1ZTogIlRydWUiIG9yICJGYWxzZSIKK2NvbnN0IHN0ZDo6c3RyaW5nIGtRdWVyeUtleVJlbmV3QWxsb3dlZCgiUmVuZXdBbGxvd2VkIik7CisgICAgLy8gVmFsdWU6ICJUcnVlIiBvciAiRmFsc2UiCisKK2NvbnN0IGludCBrU2VjdXJlU3RvcElkU2l6ZSA9IDEwOworCitzdGQ6OnZlY3Rvcjx1aW50OF90PiB1aW50MzJUb1ZlY3Rvcih1aW50MzJfdCB2YWx1ZSkgeworICAgIC8vIDEwIGJ5dGVzIHRvIGRpc3BsYXkgbWF4IHZhbHVlIDQyOTQ5NjcyOTUgKyBvbmUgYnl0ZSBudWxsIHRlcm1pbmF0b3IKKyAgICBjaGFyIGJ1ZmZlcltrU2VjdXJlU3RvcElkU2l6ZV07CisgICAgbWVtc2V0KGJ1ZmZlciwgMCwga1NlY3VyZVN0b3BJZFNpemUpOworICAgIHNucHJpbnRmKGJ1ZmZlciwga1NlY3VyZVN0b3BJZFNpemUsICIlIiBQUkl1MzIsIHZhbHVlKTsKKyAgICByZXR1cm4gc3RkOjp2ZWN0b3I8dWludDhfdD4oYnVmZmVyLCBidWZmZXIgKyBzaXplb2YoYnVmZmVyKSk7Cit9CisKK307IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK0RybVBsdWdpbjo6RHJtUGx1Z2luKFNlc3Npb25MaWJyYXJ5KiBzZXNzaW9uTGlicmFyeSkKKyAgICAgICAgOiBtU2Vzc2lvbkxpYnJhcnkoc2Vzc2lvbkxpYnJhcnkpLAorICAgICAgICAgIG1PcGVuU2Vzc2lvbk9rQ291bnQoMCksCisgICAgICAgICAgbUNsb3NlU2Vzc2lvbk9rQ291bnQoMCksCisgICAgICAgICAgbUNsb3NlU2Vzc2lvbk5vdE9wZW5lZENvdW50KDApLAorICAgICAgICAgIG1OZXh0U2VjdXJlU3RvcElkKGtTZWN1cmVTdG9wSWRTdGFydCkgeworICAgIG1QbGF5UG9saWN5LmNsZWFyKCk7CisgICAgaW5pdFByb3BlcnRpZXMoKTsKKyAgICBtU2VjdXJlU3RvcHMuY2xlYXIoKTsKK30KKwordm9pZCBEcm1QbHVnaW46OmluaXRQcm9wZXJ0aWVzKCkgeworICAgIG1TdHJpbmdQcm9wZXJ0aWVzLmNsZWFyKCk7CisgICAgbVN0cmluZ1Byb3BlcnRpZXNba1ZlbmRvcktleV0gPSBrVmVuZG9yVmFsdWU7CisgICAgbVN0cmluZ1Byb3BlcnRpZXNba1ZlcnNpb25LZXldID0ga1ZlcnNpb25WYWx1ZTsKKyAgICBtU3RyaW5nUHJvcGVydGllc1trUGx1Z2luRGVzY3JpcHRpb25LZXldID0ga1BsdWdpbkRlc2NyaXB0aW9uVmFsdWU7CisgICAgbVN0cmluZ1Byb3BlcnRpZXNba0FsZ29yaXRobXNLZXldID0ga0FsZ29yaXRobXNWYWx1ZTsKKyAgICBtU3RyaW5nUHJvcGVydGllc1trTGlzdGVuZXJUZXN0U3VwcG9ydEtleV0gPSBrTGlzdGVuZXJUZXN0U3VwcG9ydFZhbHVlOworCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWVWZWN0b3I7CisgICAgdmFsdWVWZWN0b3IuY2xlYXIoKTsKKyAgICB2YWx1ZVZlY3Rvci5pbnNlcnQodmFsdWVWZWN0b3IuZW5kKCksCisgICAgICAgICAgICBrVGVzdERldmljZUlkRGF0YSwga1Rlc3REZXZpY2VJZERhdGEgKyBzaXplb2Yoa1Rlc3REZXZpY2VJZERhdGEpIC8gc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICBtQnl0ZUFycmF5UHJvcGVydGllc1trRGV2aWNlSWRLZXldID0gdmFsdWVWZWN0b3I7CisKKyAgICB2YWx1ZVZlY3Rvci5jbGVhcigpOworICAgIHZhbHVlVmVjdG9yLmluc2VydCh2YWx1ZVZlY3Rvci5lbmQoKSwKKyAgICAgICAgICAgIGtNZXRyaWNzRGF0YSwga01ldHJpY3NEYXRhICsgc2l6ZW9mKGtNZXRyaWNzRGF0YSkgLyBzaXplb2YodWludDhfdCkpOworICAgIG1CeXRlQXJyYXlQcm9wZXJ0aWVzW2tNZXRyaWNzS2V5XSA9IHZhbHVlVmVjdG9yOworfQorCisvLyBUaGUgc2VjdXJlIHN0b3AgaW4gQ2xlYXJLZXkgaW1wbGVtZW50YXRpb24gaXMgbm90IGluc3RhbGxlZCBzZWN1cmVseS4KKy8vIFRoaXMgZnVuY3Rpb24gbWVyZWx5IGNyZWF0ZXMgYSB0ZXN0IGVudmlyb25tZW50IGZvciB0ZXN0aW5nIHNlY3VyZSBzdG9wcyBBUElzLgorLy8gVGhlIGNvbnRlbnQgaW4gdGhpcyBzZWN1cmUgc3RvcCBpcyBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQsIHRoZSBjbGVhcmtleQorLy8gc2VjdXJlU3RvcCBkb2VzIG5vdCBzZXJ2ZSBhcyBhIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbi4KK3ZvaWQgRHJtUGx1Z2luOjppbnN0YWxsU2VjdXJlU3RvcChjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgQ2xlYXJrZXlTZWN1cmVTdG9wIGNsZWFya2V5U2VjdXJlU3RvcDsKKyAgICBjbGVhcmtleVNlY3VyZVN0b3AuaWQgPSB1aW50MzJUb1ZlY3RvcigrK21OZXh0U2VjdXJlU3RvcElkKTsKKyAgICBjbGVhcmtleVNlY3VyZVN0b3AuZGF0YS5hc3NpZ24oc2Vzc2lvbklkLmJlZ2luKCksIHNlc3Npb25JZC5lbmQoKSk7CisKKyAgICBtU2VjdXJlU3RvcHMuaW5zZXJ0KHN0ZDo6cGFpcjxzdGQ6OnZlY3Rvcjx1aW50OF90PiwgQ2xlYXJrZXlTZWN1cmVTdG9wPigKKyAgICAgICAgICAgIGNsZWFya2V5U2VjdXJlU3RvcC5pZCwgY2xlYXJrZXlTZWN1cmVTdG9wKSk7Cit9CisKK1JldHVybjx2b2lkPiBEcm1QbHVnaW46Om9wZW5TZXNzaW9uKG9wZW5TZXNzaW9uX2NiIF9oaWRsX2NiKSB7CisgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+Y3JlYXRlU2Vzc2lvbigpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZCA9IHNlc3Npb24tPnNlc3Npb25JZCgpOworCisgICAgU3RhdHVzIHN0YXR1cyA9IHNldFNlY3VyaXR5TGV2ZWwoc2Vzc2lvbklkLCBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPKTsKKyAgICBfaGlkbF9jYihzdGF0dXMsIHRvSGlkbFZlYyhzZXNzaW9uSWQpKTsKKyAgICBtT3BlblNlc3Npb25Pa0NvdW50Kys7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6b3BlblNlc3Npb25fMV8xKFNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlMZXZlbCwKKyAgICAgICAgb3BlblNlc3Npb25fMV8xX2NiIF9oaWRsX2NiKSB7CisgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+Y3JlYXRlU2Vzc2lvbigpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZCA9IHNlc3Npb24tPnNlc3Npb25JZCgpOworCisgICAgU3RhdHVzIHN0YXR1cyA9IHNldFNlY3VyaXR5TGV2ZWwoc2Vzc2lvbklkLCBzZWN1cml0eUxldmVsKTsKKyAgICBfaGlkbF9jYihzdGF0dXMsIHRvSGlkbFZlYyhzZXNzaW9uSWQpKTsKKyAgICBtT3BlblNlc3Npb25Pa0NvdW50Kys7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPFN0YXR1cz4gRHJtUGx1Z2luOjpjbG9zZVNlc3Npb24oY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHRvVmVjdG9yKHNlc3Npb25JZCkpOworICAgIGlmIChzZXNzaW9uLmdldCgpKSB7CisgICAgICAgIG1DbG9zZVNlc3Npb25Pa0NvdW50Kys7CisgICAgICAgIG1TZXNzaW9uTGlicmFyeS0+ZGVzdHJveVNlc3Npb24oc2Vzc2lvbik7CisgICAgICAgIHJldHVybiBTdGF0dXM6Ok9LOworICAgIH0KKyAgICBtQ2xvc2VTZXNzaW9uTm90T3BlbmVkQ291bnQrKzsKKyAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOworfQorCitTdGF0dXMgRHJtUGx1Z2luOjpnZXRLZXlSZXF1ZXN0Q29tbW9uKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzY29wZSwKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbWltZVR5cGUsCisgICAgICAgIEtleVR5cGUga2V5VHlwZSwKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8S2V5VmFsdWU+JiBvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpyZXF1ZXN0LAorICAgICAgICBLZXlSZXF1ZXN0VHlwZSAqa2V5UmVxdWVzdFR5cGUsCisgICAgICAgIHN0ZDo6c3RyaW5nICpkZWZhdWx0VXJsKSB7CisgICAgICAgIFVOVVNFRChvcHRpb25hbFBhcmFtZXRlcnMpOworCisgICAgKmRlZmF1bHRVcmwgPSAiIjsKKyAgICAqa2V5UmVxdWVzdFR5cGUgPSBLZXlSZXF1ZXN0VHlwZTo6VU5LTk9XTjsKKyAgICAqcmVxdWVzdCA9IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KCk7CisKKyAgICBpZiAoc2NvcGUuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChrZXlUeXBlICE9IEtleVR5cGU6OlNUUkVBTUlORykgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbih0b1ZlY3RvcihzY29wZSkpOworICAgIGlmICghc2Vzc2lvbi5nZXQoKSkgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOworICAgIH0KKworICAgIFN0YXR1cyBzdGF0dXMgPSBzZXNzaW9uLT5nZXRLZXlSZXF1ZXN0KGluaXREYXRhLCBtaW1lVHlwZSwgcmVxdWVzdCk7CisgICAgKmtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGU6OklOSVRJQUw7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6Z2V0S2V5UmVxdWVzdCgKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNjb3BlLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgS2V5VHlwZSBrZXlUeXBlLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlWYWx1ZT4mIG9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgZ2V0S2V5UmVxdWVzdF9jYiBfaGlkbF9jYikgeworICAgIFVOVVNFRChvcHRpb25hbFBhcmFtZXRlcnMpOworCisgICAgS2V5UmVxdWVzdFR5cGUga2V5UmVxdWVzdFR5cGUgPSBLZXlSZXF1ZXN0VHlwZTo6VU5LTk9XTjsKKyAgICBzdGQ6OnN0cmluZyBkZWZhdWx0VXJsKCIiKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXF1ZXN0OworICAgIFN0YXR1cyBzdGF0dXMgPSBnZXRLZXlSZXF1ZXN0Q29tbW9uKAorICAgICAgICAgICAgc2NvcGUsIGluaXREYXRhLCBtaW1lVHlwZSwga2V5VHlwZSwgb3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgICAgICAgJnJlcXVlc3QsICZrZXlSZXF1ZXN0VHlwZSwgJmRlZmF1bHRVcmwpOworCisgICAgX2hpZGxfY2Ioc3RhdHVzLCB0b0hpZGxWZWMocmVxdWVzdCksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxkcm06OlYxXzA6OktleVJlcXVlc3RUeXBlPihrZXlSZXF1ZXN0VHlwZSksCisgICAgICAgICAgICBoaWRsX3N0cmluZyhkZWZhdWx0VXJsKSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6Z2V0S2V5UmVxdWVzdF8xXzEoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzY29wZSwKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbWltZVR5cGUsCisgICAgICAgIEtleVR5cGUga2V5VHlwZSwKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8S2V5VmFsdWU+JiBvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgIGdldEtleVJlcXVlc3RfMV8xX2NiIF9oaWRsX2NiKSB7CisgICAgVU5VU0VEKG9wdGlvbmFsUGFyYW1ldGVycyk7CisKKyAgICBLZXlSZXF1ZXN0VHlwZSBrZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlOjpVTktOT1dOOworICAgIHN0ZDo6c3RyaW5nIGRlZmF1bHRVcmwoIiIpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlcXVlc3Q7CisgICAgU3RhdHVzIHN0YXR1cyA9IGdldEtleVJlcXVlc3RDb21tb24oCisgICAgICAgICAgICBzY29wZSwgaW5pdERhdGEsIG1pbWVUeXBlLCBrZXlUeXBlLCBvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAmcmVxdWVzdCwgJmtleVJlcXVlc3RUeXBlLCAmZGVmYXVsdFVybCk7CisKKyAgICBfaGlkbF9jYihzdGF0dXMsIHRvSGlkbFZlYyhyZXF1ZXN0KSwga2V5UmVxdWVzdFR5cGUsIGhpZGxfc3RyaW5nKGRlZmF1bHRVcmwpKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCit2b2lkIERybVBsdWdpbjo6c2V0UGxheVBvbGljeSgpIHsKKyAgICBtUGxheVBvbGljeS5jbGVhcigpOworCisgICAgS2V5VmFsdWUgcG9saWN5OworICAgIHBvbGljeS5rZXkgPSBrUXVlcnlLZXlMaWNlbnNlVHlwZTsKKyAgICBwb2xpY3kudmFsdWUgPSBrU3RyZWFtaW5nOworICAgIG1QbGF5UG9saWN5LnB1c2hfYmFjayhwb2xpY3kpOworCisgICAgcG9saWN5LmtleSA9IGtRdWVyeUtleVBsYXlBbGxvd2VkOworICAgIHBvbGljeS52YWx1ZSA9IGtUcnVlOworICAgIG1QbGF5UG9saWN5LnB1c2hfYmFjayhwb2xpY3kpOworCisgICAgcG9saWN5LmtleSA9IGtRdWVyeUtleVJlbmV3QWxsb3dlZDsKKyAgICBtUGxheVBvbGljeS5wdXNoX2JhY2socG9saWN5KTsKK30KKworUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6cHJvdmlkZUtleVJlc3BvbnNlKAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiByZXNwb25zZSwKKyAgICAgICAgcHJvdmlkZUtleVJlc3BvbnNlX2NiIF9oaWRsX2NiKSB7CisgICAgaWYgKHNjb3BlLnNpemUoKSA9PSAwIHx8IHJlc3BvbnNlLnNpemUoKSA9PSAwKSB7CisgICAgICAgIC8vIFJldHVybnMgZW1wdHkga2V5U2V0SWQKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpCQURfVkFMVUUsIGhpZGxfdmVjPHVpbnQ4X3Q+KCkpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHRvVmVjdG9yKHNjb3BlKSk7CisgICAgaWYgKCFzZXNzaW9uLmdldCgpKSB7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRCwgaGlkbF92ZWM8dWludDhfdD4oKSk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgc2V0UGxheVBvbGljeSgpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGtleVNldElkOworICAgIFN0YXR1cyBzdGF0dXMgPSBzZXNzaW9uLT5wcm92aWRlS2V5UmVzcG9uc2UocmVzcG9uc2UpOworICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAvLyBUaGlzIGlzIGZvciB0ZXN0aW5nIEFNZWRpYURybV9zZXRPbkV2ZW50TGlzdGVuZXIgb25seS4KKyAgICAgICAgc2VuZEV2ZW50KEV2ZW50VHlwZTo6VkVORE9SX0RFRklORUQsIDAsIHNjb3BlKTsKKyAgICAgICAga2V5U2V0SWQuY2xlYXIoKTsKKyAgICB9CisKKyAgICBpbnN0YWxsU2VjdXJlU3RvcChzY29wZSk7CisKKyAgICAvLyBSZXR1cm5zIHN0YXR1cyBhbmQgZW1wdHkga2V5U2V0SWQKKyAgICBfaGlkbF9jYihzdGF0dXMsIHRvSGlkbFZlYyhrZXlTZXRJZCkpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBEcm1QbHVnaW46OmdldFByb3BlcnR5U3RyaW5nKAorICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgcHJvcGVydHlOYW1lLCBnZXRQcm9wZXJ0eVN0cmluZ19jYiBfaGlkbF9jYikgeworICAgIHN0ZDo6c3RyaW5nIG5hbWUocHJvcGVydHlOYW1lLmNfc3RyKCkpOworICAgIHN0ZDo6c3RyaW5nIHZhbHVlOworCisgICAgaWYgKG5hbWUgPT0ga1ZlbmRvcktleSkgeworICAgICAgICB2YWx1ZSA9IG1TdHJpbmdQcm9wZXJ0aWVzW2tWZW5kb3JLZXldOworICAgIH0gZWxzZSBpZiAobmFtZSA9PSBrVmVyc2lvbktleSkgeworICAgICAgICB2YWx1ZSA9IG1TdHJpbmdQcm9wZXJ0aWVzW2tWZXJzaW9uS2V5XTsKKyAgICB9IGVsc2UgaWYgKG5hbWUgPT0ga1BsdWdpbkRlc2NyaXB0aW9uS2V5KSB7CisgICAgICAgIHZhbHVlID0gbVN0cmluZ1Byb3BlcnRpZXNba1BsdWdpbkRlc2NyaXB0aW9uS2V5XTsKKyAgICB9IGVsc2UgaWYgKG5hbWUgPT0ga0FsZ29yaXRobXNLZXkpIHsKKyAgICAgICAgdmFsdWUgPSBtU3RyaW5nUHJvcGVydGllc1trQWxnb3JpdGhtc0tleV07CisgICAgfSBlbHNlIGlmIChuYW1lID09IGtMaXN0ZW5lclRlc3RTdXBwb3J0S2V5KSB7CisgICAgICAgIHZhbHVlID0gbVN0cmluZ1Byb3BlcnRpZXNba0xpc3RlbmVyVGVzdFN1cHBvcnRLZXldOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJBcHAgcmVxdWVzdGVkIHVua25vd24gc3RyaW5nIHByb3BlcnR5ICVzIiwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgIiIpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCB2YWx1ZS5jX3N0cigpKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpnZXRQcm9wZXJ0eUJ5dGVBcnJheSgKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIHByb3BlcnR5TmFtZSwgZ2V0UHJvcGVydHlCeXRlQXJyYXlfY2IgX2hpZGxfY2IpIHsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8dWludDhfdD4gPjo6aXRlcmF0b3IgaXRyID0KKyAgICAgICAgICAgIG1CeXRlQXJyYXlQcm9wZXJ0aWVzLmZpbmQoc3RkOjpzdHJpbmcocHJvcGVydHlOYW1lLmNfc3RyKCkpKTsKKyAgICBpZiAoaXRyID09IG1CeXRlQXJyYXlQcm9wZXJ0aWVzLmVuZCgpKSB7CisgICAgICAgIEFMT0dFKCJBcHAgcmVxdWVzdGVkIHVua25vd24gcHJvcGVydHk6ICVzIiwgcHJvcGVydHlOYW1lLmNfc3RyKCkpOworICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkJBRF9WQUxVRSwgc3RkOjp2ZWN0b3I8dWludDhfdD4oKSk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIF9oaWRsX2NiKFN0YXR1czo6T0ssIGl0ci0+c2Vjb25kKTsKKyAgICByZXR1cm4gVm9pZCgpOworCit9CisKK1JldHVybjxTdGF0dXM+IERybVBsdWdpbjo6c2V0UHJvcGVydHlTdHJpbmcoCisgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsIGNvbnN0IGhpZGxfc3RyaW5nJiB2YWx1ZSkgeworICAgIHN0ZDo6c3RyaW5nIGltbXV0YWJsZUtleXM7CisgICAgaW1tdXRhYmxlS2V5cy5hcHBlbmQoa0FsZ29yaXRobXNLZXkgKyAiLCIpOworICAgIGltbXV0YWJsZUtleXMuYXBwZW5kKGtQbHVnaW5EZXNjcmlwdGlvbktleSArICIsIik7CisgICAgaW1tdXRhYmxlS2V5cy5hcHBlbmQoa1ZlbmRvcktleSArICIsIik7CisgICAgaW1tdXRhYmxlS2V5cy5hcHBlbmQoa1ZlcnNpb25LZXkgKyAiLCIpOworCisgICAgc3RkOjpzdHJpbmcga2V5ID0gc3RkOjpzdHJpbmcobmFtZS5jX3N0cigpKTsKKyAgICBpZiAoaW1tdXRhYmxlS2V5cy5maW5kKGtleSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0QoIkNhbm5vdCBzZXQgaW1tdXRhYmxlIHByb3BlcnR5OiAlcyIsIGtleS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0ciA9CisgICAgICAgICAgICBtU3RyaW5nUHJvcGVydGllcy5maW5kKGtleSk7CisgICAgaWYgKGl0ciA9PSBtU3RyaW5nUHJvcGVydGllcy5lbmQoKSkgeworICAgICAgICBBTE9HRSgiQ2Fubm90IHNldCB1bmRlZmluZWQgcHJvcGVydHkgc3RyaW5nLCBrZXk9JXMiLCBrZXkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBtU3RyaW5nUHJvcGVydGllc1trZXldID0gc3RkOjpzdHJpbmcodmFsdWUuY19zdHIoKSk7CisgICAgcmV0dXJuIFN0YXR1czo6T0s7Cit9CisKK1JldHVybjxTdGF0dXM+IERybVBsdWdpbjo6c2V0UHJvcGVydHlCeXRlQXJyYXkoCisgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiB2YWx1ZSkgeworICAgVU5VU0VEKHZhbHVlKTsKKyAgIGlmIChuYW1lID09IGtEZXZpY2VJZEtleSkgeworICAgICAgQUxPR0QoIkNhbm5vdCBzZXQgaW1tdXRhYmxlIHByb3BlcnR5OiAlcyIsIG5hbWUuY19zdHIoKSk7CisgICAgICByZXR1cm4gU3RhdHVzOjpCQURfVkFMVUU7CisgICB9CisKKyAgIC8vIFNldHRpbmcgb2YgdW5kZWZpbmVkIHByb3BlcnRpZXMgaXMgbm90IHN1cHBvcnRlZAorICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgcHJvcGVydHkgYnl0ZSBhcnJheSwga2V5PSVzIiwgbmFtZS5jX3N0cigpKTsKKyAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworfQorCitSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpxdWVyeUtleVN0YXR1cygKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgcXVlcnlLZXlTdGF0dXNfY2IgX2hpZGxfY2IpIHsKKworICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgLy8gUmV0dXJucyBlbXB0eSBrZXkgc3RhdHVzIEtleVZhbHVlIHBhaXIKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpCQURfVkFMVUUsIGhpZGxfdmVjPEtleVZhbHVlPigpKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxLZXlWYWx1ZT4gaW5mb01hcFZlYzsKKyAgICBpbmZvTWFwVmVjLmNsZWFyKCk7CisKKyAgICBLZXlWYWx1ZSBrZXlWYWx1ZVBhaXI7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheVBvbGljeS5zaXplKCk7ICsraSkgeworICAgICAgICBrZXlWYWx1ZVBhaXIua2V5ID0gbVBsYXlQb2xpY3lbaV0ua2V5OworICAgICAgICBrZXlWYWx1ZVBhaXIudmFsdWUgPSBtUGxheVBvbGljeVtpXS52YWx1ZTsKKyAgICAgICAgaW5mb01hcFZlYy5wdXNoX2JhY2soa2V5VmFsdWVQYWlyKTsKKyAgICB9CisgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywgdG9IaWRsVmVjKGluZm9NYXBWZWMpKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpnZXROdW1iZXJPZlNlc3Npb25zKGdldE51bWJlck9mU2Vzc2lvbnNfY2IgX2hpZGxfY2IpIHsKKyAgICAgICAgdWludDMyX3QgY3VycmVudFNlc3Npb25zID0gbVNlc3Npb25MaWJyYXJ5LT5udW1PcGVuU2Vzc2lvbnMoKTsKKyAgICAgICAgdWludDMyX3QgbWF4U2Vzc2lvbnMgPSAxMDsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywgY3VycmVudFNlc3Npb25zLCBtYXhTZXNzaW9ucyk7CisgICAgICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBEcm1QbHVnaW46OmdldFNlY3VyaXR5TGV2ZWwoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgIGdldFNlY3VyaXR5TGV2ZWxfY2IgX2hpZGxfY2IpIHsKKyAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6QkFEX1ZBTFVFLCBTZWN1cml0eUxldmVsOjpVTktOT1dOKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzaWQgPSB0b1ZlY3RvcihzZXNzaW9uSWQpOworICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHNpZCk7CisgICAgaWYgKCFzZXNzaW9uLmdldCgpKSB7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRCwgU2VjdXJpdHlMZXZlbDo6VU5LTk9XTik7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIFNlY3VyaXR5TGV2ZWw+OjppdGVyYXRvciBpdHIgPQorICAgICAgICAgICAgbVNlY3VyaXR5TGV2ZWwuZmluZChzaWQpOworICAgIGlmIChpdHIgPT0gbVNlY3VyaXR5TGV2ZWwuZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIlNlc3Npb24gaWQgbm90IGZvdW5kIik7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0lOVkFMSURfU1RBVEUsIFNlY3VyaXR5TGV2ZWw6OlVOS05PV04pOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIF9oaWRsX2NiKFN0YXR1czo6T0ssIGl0ci0+c2Vjb25kKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48U3RhdHVzPiBEcm1QbHVnaW46OnNldFNlY3VyaXR5TGV2ZWwoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgIFNlY3VyaXR5TGV2ZWwgbGV2ZWwpIHsKKyAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGVtcHR5IHNlc3Npb24gaWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChsZXZlbCA+IFNlY3VyaXR5TGV2ZWw6OlNXX1NFQ1VSRV9DUllQVE8pIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBzZXQgc2VjdXJpdHkgbGV2ZWwgPiBtYXgiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2lkID0gdG9WZWN0b3Ioc2Vzc2lvbklkKTsKKyAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbihzaWQpOworICAgIGlmICghc2Vzc2lvbi5nZXQoKSkgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOworICAgIH0KKworICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBTZWN1cml0eUxldmVsPjo6aXRlcmF0b3IgaXRyID0KKyAgICAgICAgICAgIG1TZWN1cml0eUxldmVsLmZpbmQoc2lkKTsKKyAgICBpZiAoaXRyICE9IG1TZWN1cml0eUxldmVsLmVuZCgpKSB7CisgICAgICAgIG1TZWN1cml0eUxldmVsW3NpZF0gPSBsZXZlbDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIW1TZWN1cml0eUxldmVsLmluc2VydCgKKyAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8c3RkOjp2ZWN0b3I8dWludDhfdD4sIFNlY3VyaXR5TGV2ZWw+KHNpZCwgbGV2ZWwpKS5zZWNvbmQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IHNlY3VyaXR5IGxldmVsIik7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fSU5WQUxJRF9TVEFURTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpPSzsKK30KKworUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6Z2V0TWV0cmljcyhnZXRNZXRyaWNzX2NiIF9oaWRsX2NiKSB7CisgICAgLy8gU2V0IHRoZSBvcGVuIHNlc3Npb24gY291bnQgbWV0cmljLgorICAgIERybU1ldHJpY0dyb3VwOjpBdHRyaWJ1dGUgb3BlblNlc3Npb25Pa0F0dHJpYnV0ZSA9IHsKKyAgICAgICJzdGF0dXMiLCBEcm1NZXRyaWNHcm91cDo6VmFsdWVUeXBlOjpJTlQ2NF9UWVBFLCAoaW50NjRfdCkgU3RhdHVzOjpPSywgMC4wLCAiIgorICAgIH07CisgICAgRHJtTWV0cmljR3JvdXA6OlZhbHVlIG9wZW5TZXNzaW9uTWV0cmljVmFsdWUgPSB7CisgICAgICAiY291bnQiLCBEcm1NZXRyaWNHcm91cDo6VmFsdWVUeXBlOjpJTlQ2NF9UWVBFLCBtT3BlblNlc3Npb25Pa0NvdW50LCAwLjAsICIiCisgICAgfTsKKyAgICBEcm1NZXRyaWNHcm91cDo6TWV0cmljIG9wZW5TZXNzaW9uTWV0cmljID0geworICAgICAgIm9wZW5fc2Vzc2lvbiIsIHsgb3BlblNlc3Npb25Pa0F0dHJpYnV0ZSB9LCB7IG9wZW5TZXNzaW9uTWV0cmljVmFsdWUgfQorICAgIH07CisKKyAgICAvLyBTZXQgdGhlIGNsb3NlIHNlc3Npb24gY291bnQgbWV0cmljLgorICAgIERybU1ldHJpY0dyb3VwOjpBdHRyaWJ1dGUgY2xvc2VTZXNzaW9uT2tBdHRyaWJ1dGUgPSB7CisgICAgICAic3RhdHVzIiwgRHJtTWV0cmljR3JvdXA6OlZhbHVlVHlwZTo6SU5UNjRfVFlQRSwgKGludDY0X3QpIFN0YXR1czo6T0ssIDAuMCwgIiIKKyAgICB9OworICAgIERybU1ldHJpY0dyb3VwOjpWYWx1ZSBjbG9zZVNlc3Npb25NZXRyaWNWYWx1ZSA9IHsKKyAgICAgICJjb3VudCIsIERybU1ldHJpY0dyb3VwOjpWYWx1ZVR5cGU6OklOVDY0X1RZUEUsIG1DbG9zZVNlc3Npb25Pa0NvdW50LCAwLjAsICIiCisgICAgfTsKKyAgICBEcm1NZXRyaWNHcm91cDo6TWV0cmljIGNsb3NlU2Vzc2lvbk1ldHJpYyA9IHsKKyAgICAgICJjbG9zZV9zZXNzaW9uIiwgeyBjbG9zZVNlc3Npb25Pa0F0dHJpYnV0ZSB9LCB7IGNsb3NlU2Vzc2lvbk1ldHJpY1ZhbHVlIH0KKyAgICB9OworCisgICAgLy8gU2V0IHRoZSBjbG9zZSBzZXNzaW9uLCBub3Qgb3BlbmVkIG1ldHJpYy4KKyAgICBEcm1NZXRyaWNHcm91cDo6QXR0cmlidXRlIGNsb3NlU2Vzc2lvbk5vdE9wZW5lZEF0dHJpYnV0ZSA9IHsKKyAgICAgICJzdGF0dXMiLCBEcm1NZXRyaWNHcm91cDo6VmFsdWVUeXBlOjpJTlQ2NF9UWVBFLAorICAgICAgKGludDY0X3QpIFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRCwgMC4wLCAiIgorICAgIH07CisgICAgRHJtTWV0cmljR3JvdXA6OlZhbHVlIGNsb3NlU2Vzc2lvbk5vdE9wZW5lZE1ldHJpY1ZhbHVlID0geworICAgICAgImNvdW50IiwgRHJtTWV0cmljR3JvdXA6OlZhbHVlVHlwZTo6SU5UNjRfVFlQRSwgbUNsb3NlU2Vzc2lvbk5vdE9wZW5lZENvdW50LCAwLjAsICIiCisgICAgfTsKKyAgICBEcm1NZXRyaWNHcm91cDo6TWV0cmljIGNsb3NlU2Vzc2lvbk5vdE9wZW5lZE1ldHJpYyA9IHsKKyAgICAgICJjbG9zZV9zZXNzaW9uIiwgeyBjbG9zZVNlc3Npb25Ob3RPcGVuZWRBdHRyaWJ1dGUgfSwgeyBjbG9zZVNlc3Npb25Ob3RPcGVuZWRNZXRyaWNWYWx1ZSB9CisgICAgfTsKKworICAgIERybU1ldHJpY0dyb3VwIG1ldHJpY3MgPSB7IHsgb3BlblNlc3Npb25NZXRyaWMsIGNsb3NlU2Vzc2lvbk1ldHJpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VTZXNzaW9uTm90T3BlbmVkTWV0cmljIH0gfTsKKworICAgIF9oaWRsX2NiKFN0YXR1czo6T0ssIGhpZGxfdmVjPERybU1ldHJpY0dyb3VwPih7bWV0cmljc30pKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpnZXRTZWN1cmVTdG9wcyhnZXRTZWN1cmVTdG9wc19jYiBfaGlkbF9jYikgeworICAgIHN0ZDo6dmVjdG9yPFNlY3VyZVN0b3A+IHN0b3BzOworICAgIGZvciAoYXV0byBpdHIgPSBtU2VjdXJlU3RvcHMuYmVnaW4oKTsgaXRyICE9IG1TZWN1cmVTdG9wcy5lbmQoKTsgKytpdHIpIHsKKyAgICAgICAgQ2xlYXJrZXlTZWN1cmVTdG9wIGNsZWFya2V5U3RvcCA9IGl0ci0+c2Vjb25kOworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzdG9wVmVjOworICAgICAgICBzdG9wVmVjLmluc2VydChzdG9wVmVjLmVuZCgpLCBjbGVhcmtleVN0b3AuaWQuYmVnaW4oKSwgY2xlYXJrZXlTdG9wLmlkLmVuZCgpKTsKKyAgICAgICAgc3RvcFZlYy5pbnNlcnQoc3RvcFZlYy5lbmQoKSwgY2xlYXJrZXlTdG9wLmRhdGEuYmVnaW4oKSwgY2xlYXJrZXlTdG9wLmRhdGEuZW5kKCkpOworCisgICAgICAgIFNlY3VyZVN0b3Agc3RvcDsKKyAgICAgICAgc3RvcC5vcGFxdWVEYXRhID0gdG9IaWRsVmVjKHN0b3BWZWMpOworICAgICAgICBzdG9wcy5wdXNoX2JhY2soc3RvcCk7CisgICAgfQorICAgIF9oaWRsX2NiKFN0YXR1czo6T0ssIHN0b3BzKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpnZXRTZWN1cmVTdG9wKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZWN1cmVTdG9wSWQsCisgICAgICAgIGdldFNlY3VyZVN0b3BfY2IgX2hpZGxfY2IpIHsKKyAgICBTZWN1cmVTdG9wIHN0b3A7CisgICAgYXV0byBpdHIgPSBtU2VjdXJlU3RvcHMuZmluZCh0b1ZlY3RvcihzZWN1cmVTdG9wSWQpKTsKKyAgICBpZiAoaXRyICE9IG1TZWN1cmVTdG9wcy5lbmQoKSkgeworICAgICAgICBDbGVhcmtleVNlY3VyZVN0b3AgY2xlYXJrZXlTdG9wID0gaXRyLT5zZWNvbmQ7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHN0b3BWZWM7CisgICAgICAgIHN0b3BWZWMuaW5zZXJ0KHN0b3BWZWMuZW5kKCksIGNsZWFya2V5U3RvcC5pZC5iZWdpbigpLCBjbGVhcmtleVN0b3AuaWQuZW5kKCkpOworICAgICAgICBzdG9wVmVjLmluc2VydChzdG9wVmVjLmVuZCgpLCBjbGVhcmtleVN0b3AuZGF0YS5iZWdpbigpLCBjbGVhcmtleVN0b3AuZGF0YS5lbmQoKSk7CisKKyAgICAgICAgc3RvcC5vcGFxdWVEYXRhID0gdG9IaWRsVmVjKHN0b3BWZWMpOworICAgICAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCBzdG9wKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkJBRF9WQUxVRSwgc3RvcCk7CisgICAgfQorCisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPFN0YXR1cz4gRHJtUGx1Z2luOjpyZWxlYXNlU2VjdXJlU3RvcChjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2VjdXJlU3RvcElkKSB7CisgICAgcmV0dXJuIHJlbW92ZVNlY3VyZVN0b3Aoc2VjdXJlU3RvcElkKTsKK30KKworUmV0dXJuPFN0YXR1cz4gRHJtUGx1Z2luOjpyZWxlYXNlQWxsU2VjdXJlU3RvcHMoKSB7CisgICAgcmV0dXJuIHJlbW92ZUFsbFNlY3VyZVN0b3BzKCk7Cit9CisKK1JldHVybjx2b2lkPiBEcm1QbHVnaW46OmdldFNlY3VyZVN0b3BJZHMoZ2V0U2VjdXJlU3RvcElkc19jYiBfaGlkbF9jYikgeworICAgIHN0ZDo6dmVjdG9yPFNlY3VyZVN0b3BJZD4gaWRzOworICAgIGZvciAoYXV0byBpdHIgPSBtU2VjdXJlU3RvcHMuYmVnaW4oKTsgaXRyICE9IG1TZWN1cmVTdG9wcy5lbmQoKTsgKytpdHIpIHsKKyAgICAgICAgaWRzLnB1c2hfYmFjayhpdHItPmZpcnN0KTsKKyAgICB9CisKKyAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCB0b0hpZGxWZWMoaWRzKSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPFN0YXR1cz4gRHJtUGx1Z2luOjpyZWxlYXNlU2VjdXJlU3RvcHMoY29uc3QgU2VjdXJlU3RvcFJlbGVhc2UmIHNzUmVsZWFzZSkgeworICAgIGlmIChzc1JlbGVhc2Uub3BhcXVlRGF0YS5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpCQURfVkFMVUU7CisgICAgfQorCisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaW5wdXQgPSB0b1ZlY3Rvcihzc1JlbGVhc2Uub3BhcXVlRGF0YSk7CisKKyAgICAvLyBUaGUgZm9ybWF0IG9mIG9wYXF1ZURhdGEgaXMgc2hhcmVkIGJldHdlZW4gdGhlIHNlcnZlcgorICAgIC8vIGFuZCB0aGUgZHJtIHNlcnZpY2UuIFRoZSBjbGVhcmtleSBpbXBsZW1lbnRhdGlvbiBjb25zaXN0cyBvZjoKKyAgICAvLyAgICBjb3VudCAtIG51bWJlciBvZiBzZWN1cmUgc3RvcHMKKyAgICAvLyAgICBsaXN0IG9mIGZpeGVkIGxlbmd0aCBzZWN1cmUgc3RvcHMKKyAgICBzaXplX3QgY291bnRCdWZmZXJTaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgc3NjYW5mKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGlucHV0LmRhdGEoKSksICIlMDQiIFBSSXUzMiwgJmNvdW50KTsKKworICAgIC8vIEF2b2lkIGRpdmlkZSBieSAwIGJlbG93LgorICAgIGlmIChjb3VudCA9PSAwKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzaXplX3Qgc2VjdXJlU3RvcFNpemUgPSAoaW5wdXQuc2l6ZSgpIC0gY291bnRCdWZmZXJTaXplKSAvIGNvdW50OworICAgIHVpbnQ4X3QgYnVmZmVyW3NlY3VyZVN0b3BTaXplXTsKKyAgICBzaXplX3Qgb2Zmc2V0ID0gY291bnRCdWZmZXJTaXplOyAvLyBza2lwIHRoZSBjb3VudAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSwgb2Zmc2V0ICs9IHNlY3VyZVN0b3BTaXplKSB7CisgICAgICAgIG1lbWNweShidWZmZXIsIGlucHV0LmRhdGEoKSArIG9mZnNldCwgc2VjdXJlU3RvcFNpemUpOworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBpZChidWZmZXIsIGJ1ZmZlciArIGtTZWN1cmVTdG9wSWRTaXplKTsKKworICAgICAgICBzdGF0dXMgPSByZW1vdmVTZWN1cmVTdG9wKHRvSGlkbFZlYyhpZCkpOworICAgICAgICBpZiAoU3RhdHVzOjpPSyAhPSBzdGF0dXMpIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1JldHVybjxTdGF0dXM+IERybVBsdWdpbjo6cmVtb3ZlU2VjdXJlU3RvcChjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2VjdXJlU3RvcElkKSB7CisgICAgaWYgKDEgIT0gbVNlY3VyZVN0b3BzLmVyYXNlKHRvVmVjdG9yKHNlY3VyZVN0b3BJZCkpKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6T0s7Cit9CisKK1JldHVybjxTdGF0dXM+IERybVBsdWdpbjo6cmVtb3ZlQWxsU2VjdXJlU3RvcHMoKSB7CisgICAgbVNlY3VyZVN0b3BzLmNsZWFyKCk7CisgICAgbU5leHRTZWN1cmVTdG9wSWQgPSBrU2VjdXJlU3RvcElkU3RhcnQ7CisgICAgcmV0dXJuIFN0YXR1czo6T0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAgLy8gbmFtZXNwYWNlIFYxXzEKK30gIC8vIG5hbWVzcGFjZSBkcm0KK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSW5pdERhdGFQYXJzZXIuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Jbml0RGF0YVBhcnNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJiYjY1MQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSW5pdERhdGFQYXJzZXIuY3BwCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJoaWRsX0luaXREYXRhUGFyc2VyIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiSW5pdERhdGFQYXJzZXIuaCIKKworI2luY2x1ZGUgIkJhc2U2NC5oIgorCisjaW5jbHVkZSAiQ2xlYXJLZXlVVUlELmgiCisjaW5jbHVkZSAiTWltZVR5cGUuaCIKKyNpbmNsdWRlICJVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCituYW1lc3BhY2UgeworICAgIGNvbnN0IHNpemVfdCBrS2V5SWRTaXplID0gMTY7CisgICAgY29uc3Qgc2l6ZV90IGtTeXN0ZW1JZFNpemUgPSAxNjsKK30KKworc3RkOjp2ZWN0b3I8dWludDhfdD4gU3RyVG9WZWN0b3IoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlYyhzdHIuYmVnaW4oKSwgc3RyLmVuZCgpKTsKKyAgICByZXR1cm4gdmVjOworfQorCitTdGF0dXMgSW5pdERhdGFQYXJzZXI6OnBhcnNlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGUsCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBsaWNlbnNlUmVxdWVzdCkgeworICAgIC8vIEJ1aWxkIGEgbGlzdCBvZiB0aGUga2V5IElEcworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHVpbnQ4X3QqPiBrZXlJZHM7CisKKyAgICBpZiAodHlwZSA9PSBrSXNvQm1mZlZpZGVvTWltZVR5cGUgfHwKKyAgICAgICAgdHlwZSA9PSBrSXNvQm1mZkF1ZGlvTWltZVR5cGUgfHwKKyAgICAgICAgdHlwZSA9PSBrQ2VuY0luaXREYXRhRm9ybWF0KSB7CisgICAgICAgIFN0YXR1cyByZXMgPSBwYXJzZVBzc2goaW5pdERhdGEsICZrZXlJZHMpOworICAgICAgICBpZiAocmVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0ga1dlYm1WaWRlb01pbWVUeXBlIHx8CisgICAgICAgIHR5cGUgPT0ga1dlYm1BdWRpb01pbWVUeXBlIHx8CisgICAgICAgIHR5cGUgPT0ga1dlYm1Jbml0RGF0YUZvcm1hdCkgeworICAgICAgICAvLyBXZWJNICJpbml0IGRhdGEiIGlzIGp1c3QgYSBzaW5nbGUga2V5IElECisgICAgICAgIGlmIChpbml0RGF0YS5zaXplKCkgIT0ga0tleUlkU2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgICAgIH0KKyAgICAgICAga2V5SWRzLnB1c2hfYmFjayhpbml0RGF0YS5kYXRhKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIC8vIEJ1aWxkIHRoZSByZXF1ZXN0CisgICAgc3RkOjpzdHJpbmcgcmVxdWVzdEpzb24gPSBnZW5lcmF0ZVJlcXVlc3Qoa2V5SWRzKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXF1ZXN0SnNvblZlYyA9IFN0clRvVmVjdG9yKHJlcXVlc3RKc29uKTsKKworICAgIGxpY2Vuc2VSZXF1ZXN0LT5jbGVhcigpOworICAgIGxpY2Vuc2VSZXF1ZXN0LT5pbnNlcnQobGljZW5zZVJlcXVlc3QtPmVuZCgpLCByZXF1ZXN0SnNvblZlYy5iZWdpbigpLCByZXF1ZXN0SnNvblZlYy5lbmQoKSk7CisgICAgcmV0dXJuIFN0YXR1czo6T0s7Cit9CisKK1N0YXR1cyBJbml0RGF0YVBhcnNlcjo6cGFyc2VQc3NoKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgdWludDhfdCo+KiBrZXlJZHMpIHsKKyAgICBzaXplX3QgcmVhZFBvc2l0aW9uID0gMDsKKworICAgIC8vIFZhbGlkYXRlIHNpemUgZmllbGQKKyAgICB1aW50MzJfdCBleHBlY3RlZFNpemUgPSBpbml0RGF0YS5zaXplKCk7CisgICAgZXhwZWN0ZWRTaXplID0gaHRvbmwoZXhwZWN0ZWRTaXplKTsKKyAgICBpZiAobWVtY21wKCZpbml0RGF0YVtyZWFkUG9zaXRpb25dLCAmZXhwZWN0ZWRTaXplLAorICAgICAgICAgICAgICAgc2l6ZW9mKGV4cGVjdGVkU2l6ZSkpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorICAgIHJlYWRQb3NpdGlvbiArPSBzaXplb2YoZXhwZWN0ZWRTaXplKTsKKworICAgIC8vIFZhbGlkYXRlIFBTU0ggYm94IGlkZW50aWZpZXIKKyAgICBjb25zdCBjaGFyIHBzc2hJZGVudGlmaWVyWzRdID0geydwJywgJ3MnLCAncycsICdoJ307CisgICAgaWYgKG1lbWNtcCgmaW5pdERhdGFbcmVhZFBvc2l0aW9uXSwgcHNzaElkZW50aWZpZXIsCisgICAgICAgICAgICAgICBzaXplb2YocHNzaElkZW50aWZpZXIpKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKyAgICByZWFkUG9zaXRpb24gKz0gc2l6ZW9mKHBzc2hJZGVudGlmaWVyKTsKKworICAgIC8vIFZhbGlkYXRlIEVNRSB2ZXJzaW9uIG51bWJlcgorICAgIGNvbnN0IHVpbnQ4X3QgcHNzaFZlcnNpb24xWzRdID0gezEsIDAsIDAsIDB9OworICAgIGlmIChtZW1jbXAoJmluaXREYXRhW3JlYWRQb3NpdGlvbl0sIHBzc2hWZXJzaW9uMSwKKyAgICAgICAgICAgICAgIHNpemVvZihwc3NoVmVyc2lvbjEpKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKyAgICByZWFkUG9zaXRpb24gKz0gc2l6ZW9mKHBzc2hWZXJzaW9uMSk7CisKKyAgICAvLyBWYWxpZGF0ZSBzeXN0ZW0gSUQKKyAgICBpZiAoIWNsZWFya2V5ZHJtOjppc0NsZWFyS2V5VVVJRCgmaW5pdERhdGFbcmVhZFBvc2l0aW9uXSkpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorICAgIHJlYWRQb3NpdGlvbiArPSBrU3lzdGVtSWRTaXplOworCisgICAgLy8gUmVhZCBrZXkgSUQgY291bnQKKyAgICB1aW50MzJfdCBrZXlJZENvdW50OworICAgIG1lbWNweSgma2V5SWRDb3VudCwgJmluaXREYXRhW3JlYWRQb3NpdGlvbl0sIHNpemVvZihrZXlJZENvdW50KSk7CisgICAga2V5SWRDb3VudCA9IG50b2hsKGtleUlkQ291bnQpOworICAgIHJlYWRQb3NpdGlvbiArPSBzaXplb2Yoa2V5SWRDb3VudCk7CisgICAgaWYgKHJlYWRQb3NpdGlvbiArICgodWludDY0X3Qpa2V5SWRDb3VudCAqIGtLZXlJZFNpemUpICE9CisgICAgICAgICAgICBpbml0RGF0YS5zaXplKCkgLSBzaXplb2YodWludDMyX3QpKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIC8vIENhbGN1bGF0ZSB0aGUga2V5IElEIG9mZnNldHMKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwga2V5SWRDb3VudDsgKytpKSB7CisgICAgICAgIHNpemVfdCBrZXlJZFBvc2l0aW9uID0gcmVhZFBvc2l0aW9uICsgKGkgKiBrS2V5SWRTaXplKTsKKyAgICAgICAga2V5SWRzLT5wdXNoX2JhY2soJmluaXREYXRhW2tleUlkUG9zaXRpb25dKTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6T0s7Cit9CisKK3N0ZDo6c3RyaW5nIEluaXREYXRhUGFyc2VyOjpnZW5lcmF0ZVJlcXVlc3QoY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgdWludDhfdCo+JiBrZXlJZHMpIHsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBrUmVxdWVzdFByZWZpeCgie1wia2lkc1wiOlsiKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBrUmVxdWVzdFN1ZmZpeCgiXSxcInR5cGVcIjpcInRlbXBvcmFyeVwifSIpOworCisgICAgc3RkOjpzdHJpbmcgcmVxdWVzdChrUmVxdWVzdFByZWZpeCk7CisgICAgc3RkOjpzdHJpbmcgZW5jb2RlZElkOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga2V5SWRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGVuY29kZWRJZC5jbGVhcigpOworICAgICAgICBlbmNvZGVCYXNlNjRVcmwoa2V5SWRzW2ldLCBrS2V5SWRTaXplLCAmZW5jb2RlZElkKTsKKyAgICAgICAgaWYgKGkgIT0gMCkgeworICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIiwiKTsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0LnB1c2hfYmFjaygnXCInKTsKKyAgICAgICAgcmVxdWVzdC5hcHBlbmQoZW5jb2RlZElkKTsKKyAgICAgICAgcmVxdWVzdC5wdXNoX2JhY2soJ1wiJyk7CisgICAgfQorICAgIHJlcXVlc3QuYXBwZW5kKGtSZXF1ZXN0U3VmZml4KTsKKworICAgIC8vIEFuZHJvaWQncyBCYXNlNjQgZW5jb2RlciBwcm9kdWNlcyBwYWRkaW5nLiBFTUUgZm9yYmlkcyBwYWRkaW5nLgorICAgIGNvbnN0IGNoYXIga0Jhc2U2NFBhZGRpbmcgPSAnPSc7CisgICAgcmVxdWVzdC5lcmFzZShzdGQ6OnJlbW92ZShyZXF1ZXN0LmJlZ2luKCksIHJlcXVlc3QuZW5kKCksIGtCYXNlNjRQYWRkaW5nKSwgcmVxdWVzdC5lbmQoKSk7CisKKyAgICByZXR1cm4gcmVxdWVzdDsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKK30gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIGRybQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSnNvbldlYktleS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0pzb25XZWJLZXkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjY2I0MWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0pzb25XZWJLZXkuY3BwCkBAIC0wLDAgKzEsMjc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiaGlkbF9Kc29uV2ViS2V5IgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJKc29uV2ViS2V5LmgiCisKKyNpbmNsdWRlICJCYXNlNjQuaCIKKworbmFtZXNwYWNlIHsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtLZXlzVGFnKCJrZXlzIik7Citjb25zdCBzdGQ6OnN0cmluZyBrS2V5VHlwZVRhZygia3R5Iik7Citjb25zdCBzdGQ6OnN0cmluZyBrU3ltbWV0cmljS2V5VmFsdWUoIm9jdCIpOworY29uc3Qgc3RkOjpzdHJpbmcga0tleVRhZygiayIpOworY29uc3Qgc3RkOjpzdHJpbmcga0tleUlkVGFnKCJraWQiKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtCYXNlNjRQYWRkaW5nKCI9Iik7Cit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK0pzb25XZWJLZXk6Okpzb25XZWJLZXkoKSB7Cit9CisKK0pzb25XZWJLZXk6On5Kc29uV2ViS2V5KCkgeworfQorCisvKgorICogUGFyc2VzIGEgSlNPTiBXZWIgS2V5IFNldCBzdHJpbmcsIGluaXRpYWxpemVzIGEgS2V5TWFwIHdpdGgga2V5IGlkOmtleQorICogcGFpcnMgZnJvbSB0aGUgSlNPTiBXZWIgS2V5IFNldC4gQm90aCBrZXkgaWRzIGFuZCBrZXlzIGFyZSBiYXNlNjR1cmwKKyAqIGVuY29kZWQuIFRoZSBLZXlNYXAgY29udGFpbnMgYmFzZTY0dXJsIGRlY29kZWQga2V5IGlkOmtleSBwYWlycy4KKyAqCisgKiBAcmV0dXJuIFJldHVybnMgZmFsc2UgZm9yIGVycm9ycywgdHJ1ZSBmb3Igc3VjY2Vzcy4KKyAqLworYm9vbCBKc29uV2ViS2V5OjpleHRyYWN0S2V5c0Zyb21Kc29uV2ViS2V5U2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBqc29uV2ViS2V5U2V0LAorICAgICAgICBLZXlNYXAqIGtleXMpIHsKKworICAgIGtleXMtPmNsZWFyKCk7CisKKyAgICBpZiAoIXBhcnNlSnNvbldlYktleVNldChqc29uV2ViS2V5U2V0LCAmbUpzb25PYmplY3RzKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gbUpzb25PYmplY3RzWzBdIGNvbnRhaW5zIHRoZSBlbnRpcmUgSlNPTiBXZWIgS2V5IFNldCwgaW5jbHVkaW5nCisgICAgLy8gYWxsIHRoZSBiYXNlNjQgZW5jb2RlZCBrZXlzLiBFYWNoIGtleSBpcyBhbHNvIHN0b3JlZCBzZXBhcmF0ZWx5IGFzCisgICAgLy8gYSBKU09OIG9iamVjdCBpbiBtSnNvbk9iamVjdHNbMS4ubl0gd2hlcmUgbiBpcyB0aGUgdG90YWwKKyAgICAvLyBudW1iZXIgb2Yga2V5cyBpbiB0aGUgc2V0LgorICAgIGlmICghaXNKc29uV2ViS2V5U2V0KG1Kc29uT2JqZWN0c1swXSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGVuY29kZWRLZXksIGVuY29kZWRLZXlJZDsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkZWNvZGVkS2V5LCBkZWNvZGVkS2V5SWQ7CisKKyAgICAvLyBtSnNvbk9iamVjdHNbMV0gY29udGFpbnMgdGhlIGZpcnN0IEpTT04gV2ViIEtleSBpbiB0aGUgc2V0CisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBtSnNvbk9iamVjdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgZW5jb2RlZEtleUlkLmNsZWFyKCk7CisgICAgICAgIGVuY29kZWRLZXkuY2xlYXIoKTsKKworICAgICAgICBpZiAoIXBhcnNlSnNvbk9iamVjdChtSnNvbk9iamVjdHNbaV0sICZtVG9rZW5zKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAoZmluZEtleShtSnNvbk9iamVjdHNbaV0sICZlbmNvZGVkS2V5SWQsICZlbmNvZGVkS2V5KSkgeworICAgICAgICAgICAgaWYgKGVuY29kZWRLZXlJZC5lbXB0eSgpIHx8IGVuY29kZWRLZXkuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJNdXN0IGhhdmUgYm90aCBrZXkgaWQgYW5kIGtleSBpbiB0aGUgSnNvbldlYktleSBzZXQuIik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghZGVjb2RlQmFzZTY0U3RyaW5nKGVuY29kZWRLZXlJZCwgJmRlY29kZWRLZXlJZCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRlY29kZSBrZXkgaWQoJXMpIiwgZW5jb2RlZEtleUlkLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWRlY29kZUJhc2U2NFN0cmluZyhlbmNvZGVkS2V5LCAmZGVjb2RlZEtleSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRlY29kZSBrZXkoJXMpIiwgZW5jb2RlZEtleS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAga2V5cy0+aW5zZXJ0KHN0ZDo6cGFpcjxzdGQ6OnZlY3Rvcjx1aW50OF90PiwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gPihkZWNvZGVkS2V5SWQsIGRlY29kZWRLZXkpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBKc29uV2ViS2V5OjpkZWNvZGVCYXNlNjRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGVuY29kZWRUZXh0LAorICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiogZGVjb2RlZFRleHQpIHsKKworICAgIGRlY29kZWRUZXh0LT5jbGVhcigpOworCisgICAgLy8gZW5jb2RlZFRleHQgc2hvdWxkIG5vdCBjb250YWluIHBhZGRpbmcgY2hhcmFjdGVycyBhcyBwZXIgRU1FIHNwZWMuCisgICAgaWYgKGVuY29kZWRUZXh0LmZpbmQoa0Jhc2U2NFBhZGRpbmcpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBTaW5jZSBkZWNvZGVCYXNlNjQoKSByZXF1aXJlcyBwYWRkaW5nIGNoYXJhY3RlcnMsCisgICAgLy8gYWRkIHRoZW0gc28gbGVuZ3RoIG9mIGVuY29kZWRUZXh0IGlzIGV4YWN0bHkgYSBtdWx0aXBsZSBvZiA0LgorICAgIGludCByZW1haW5kZXIgPSBlbmNvZGVkVGV4dC5sZW5ndGgoKSAlIDQ7CisgICAgc3RkOjpzdHJpbmcgcGFkZGVkVGV4dChlbmNvZGVkVGV4dCk7CisgICAgaWYgKHJlbWFpbmRlciA+IDApIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0IC0gcmVtYWluZGVyOyArK2kpIHsKKyAgICAgICAgICAgIHBhZGRlZFRleHQuYXBwZW5kKGtCYXNlNjRQYWRkaW5nKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNwPEJ1ZmZlcj4gYnVmZmVyID0gZGVjb2RlQmFzZTY0KHBhZGRlZFRleHQpOworICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiTWFsZm9ybWVkIGJhc2U2NCBlbmNvZGVkIGNvbnRlbnQgZm91bmQuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBkZWNvZGVkVGV4dC0+aW5zZXJ0KGRlY29kZWRUZXh0LT5lbmQoKSwgYnVmZmVyLT5iYXNlKCksIGJ1ZmZlci0+YmFzZSgpICsgYnVmZmVyLT5zaXplKCkpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEpzb25XZWJLZXk6OmZpbmRLZXkoY29uc3Qgc3RkOjpzdHJpbmcmIGpzb25PYmplY3QsIHN0ZDo6c3RyaW5nKiBrZXlJZCwKKyAgICAgICAgc3RkOjpzdHJpbmcqIGVuY29kZWRLZXkpIHsKKworICAgIHN0ZDo6c3RyaW5nIGtleSwgdmFsdWU7CisKKyAgICAvLyBPbmx5IGFsbG93IHN5bW1ldHJpYyBrZXksIGkuZS4gImt0eSI6Im9jdCIgcGFpci4KKyAgICBpZiAoanNvbk9iamVjdC5maW5kKGtLZXlUeXBlVGFnKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBmaW5kVmFsdWUoa0tleVR5cGVUYWcsICZ2YWx1ZSk7CisgICAgICAgIGlmICgwICE9IHZhbHVlLmNvbXBhcmUoa1N5bW1ldHJpY0tleVZhbHVlKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoanNvbk9iamVjdC5maW5kKGtLZXlJZFRhZykgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgZmluZFZhbHVlKGtLZXlJZFRhZywga2V5SWQpOworICAgIH0KKworICAgIGlmIChqc29uT2JqZWN0LmZpbmQoa0tleVRhZykgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgZmluZFZhbHVlKGtLZXlUYWcsIGVuY29kZWRLZXkpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBKc29uV2ViS2V5OjpmaW5kVmFsdWUoY29uc3Qgc3RkOjpzdHJpbmcgJmtleSwgc3RkOjpzdHJpbmcqIHZhbHVlKSB7CisgICAgdmFsdWUtPmNsZWFyKCk7CisgICAgY29uc3QgY2hhciogdmFsdWVUb2tlbjsKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgbmV4dFRva2VuID0gbVRva2Vucy5iZWdpbigpOworICAgICAgICBuZXh0VG9rZW4gIT0gbVRva2Vucy5lbmQoKTsgKytuZXh0VG9rZW4pIHsKKyAgICAgICAgaWYgKDAgPT0gKCpuZXh0VG9rZW4pLmNvbXBhcmUoa2V5KSkgeworICAgICAgICAgICAgaWYgKG5leHRUb2tlbiArIDEgPT0gbVRva2Vucy5lbmQoKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHZhbHVlVG9rZW4gPSAoKihuZXh0VG9rZW4gKyAxKSkuY19zdHIoKTsKKyAgICAgICAgICAgIHZhbHVlLT5hc3NpZ24odmFsdWVUb2tlbik7CisgICAgICAgICAgICBuZXh0VG9rZW4rKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitib29sIEpzb25XZWJLZXk6OmlzSnNvbldlYktleVNldChjb25zdCBzdGQ6OnN0cmluZyYganNvbk9iamVjdCkgY29uc3QgeworICAgIGlmIChqc29uT2JqZWN0LmZpbmQoa0tleXNUYWcpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFMT0dFKCJKU09OIFdlYiBLZXkgZG9lcyBub3QgY29udGFpbiBrZXlzLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvKgorICogUGFyc2VzIGEgSlNPTiBvYmplY3RzIHN0cmluZyBhbmQgaW5pdGlhbGl6ZXMgYSB2ZWN0b3Igb2YgdG9rZW5zLgorICoKKyAqIEByZXR1cm4gUmV0dXJucyBmYWxzZSBmb3IgZXJyb3JzLCB0cnVlIGZvciBzdWNjZXNzLgorICovCitib29sIEpzb25XZWJLZXk6OnBhcnNlSnNvbk9iamVjdChjb25zdCBzdGQ6OnN0cmluZyYganNvbk9iamVjdCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiB0b2tlbnMpIHsKKyAgICBqc21uX3BhcnNlciBwYXJzZXI7CisKKyAgICBqc21uX2luaXQoJnBhcnNlcik7CisgICAgaW50IG51bVRva2VucyA9IGpzbW5fcGFyc2UoJnBhcnNlciwKKyAgICAgICAganNvbk9iamVjdC5jX3N0cigpLCBqc29uT2JqZWN0LnNpemUoKSwgbnVsbHB0ciwgMCk7CisgICAgaWYgKG51bVRva2VucyA8IDApIHsKKyAgICAgICAgQUxPR0UoIlBhcnNlciByZXR1cm5zIGVycm9yIGNvZGU9JWQiLCBudW1Ub2tlbnMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdW5zaWduZWQgaW50IGpzbW5Ub2tlbnNTaXplID0gbnVtVG9rZW5zICogc2l6ZW9mKGpzbW50b2tfdCk7CisgICAgbUpzbW5Ub2tlbnMuY2xlYXIoKTsKKyAgICBtSnNtblRva2Vucy5yZXNpemUoanNtblRva2Vuc1NpemUpOworCisgICAganNtbl9pbml0KCZwYXJzZXIpOworICAgIGludCBzdGF0dXMgPSBqc21uX3BhcnNlKCZwYXJzZXIsIGpzb25PYmplY3QuY19zdHIoKSwKKyAgICAgICAganNvbk9iamVjdC5zaXplKCksIG1Kc21uVG9rZW5zLmRhdGEoKSwgbnVtVG9rZW5zKTsKKyAgICBpZiAoc3RhdHVzIDwgMCkgeworICAgICAgICBBTE9HRSgiUGFyc2VyIHJldHVybnMgZXJyb3IgY29kZT0lZCIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0b2tlbnMtPmNsZWFyKCk7CisgICAgc3RkOjpzdHJpbmcgdG9rZW47CisgICAgY29uc3QgY2hhciAqcGpzOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgbnVtVG9rZW5zOyArK2opIHsKKyAgICAgICAgcGpzID0ganNvbk9iamVjdC5jX3N0cigpICsgbUpzbW5Ub2tlbnNbal0uc3RhcnQ7CisgICAgICAgIGlmIChtSnNtblRva2Vuc1tqXS50eXBlID09IEpTTU5fU1RSSU5HIHx8CisgICAgICAgICAgICAgICAgbUpzbW5Ub2tlbnNbal0udHlwZSA9PSBKU01OX1BSSU1JVElWRSkgeworICAgICAgICAgICAgdG9rZW4uYXNzaWduKHBqcywgbUpzbW5Ub2tlbnNbal0uZW5kIC0gbUpzbW5Ub2tlbnNbal0uc3RhcnQpOworICAgICAgICAgICAgdG9rZW5zLT5wdXNoX2JhY2sodG9rZW4pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvKgorICogUGFyc2VzIEpTT04gV2ViIEtleSBTZXQgc3RyaW5nIGFuZCBpbml0aWFsaXplcyBhIHZlY3RvciBvZiBKU09OIG9iamVjdHMuCisgKgorICogQHJldHVybiBSZXR1cm5zIGZhbHNlIGZvciBlcnJvcnMsIHRydWUgZm9yIHN1Y2Nlc3MuCisgKi8KK2Jvb2wgSnNvbldlYktleTo6cGFyc2VKc29uV2ViS2V5U2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBqc29uV2ViS2V5U2V0LAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGpzb25PYmplY3RzKSB7CisgICAgaWYgKGpzb25XZWJLZXlTZXQuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiRW1wdHkgSlNPTiBXZWIgS2V5Iik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBUaGUganNtbiBwYXJzZXIgb25seSBzdXBwb3J0cyB1bmljb2RlIGVuY29kaW5nLgorICAgIGpzbW5fcGFyc2VyIHBhcnNlcjsKKworICAgIC8vIENvbXB1dGVzIG51bWJlciBvZiB0b2tlbnMuIEEgdG9rZW4gbWFya3MgdGhlIHR5cGUsIG9mZnNldCBpbgorICAgIC8vIHRoZSBvcmlnaW5hbCBzdHJpbmcuCisgICAganNtbl9pbml0KCZwYXJzZXIpOworICAgIGludCBudW1Ub2tlbnMgPSBqc21uX3BhcnNlKCZwYXJzZXIsCisgICAgICAgICAgICBqc29uV2ViS2V5U2V0LmNfc3RyKCksIGpzb25XZWJLZXlTZXQuc2l6ZSgpLCBudWxscHRyLCAwKTsKKyAgICBpZiAobnVtVG9rZW5zIDwgMCkgeworICAgICAgICBBTE9HRSgiUGFyc2VyIHJldHVybnMgZXJyb3IgY29kZT0lZCIsIG51bVRva2Vucyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBpbnQganNtblRva2Vuc1NpemUgPSBudW1Ub2tlbnMgKiBzaXplb2YoanNtbnRva190KTsKKyAgICBtSnNtblRva2Vucy5yZXNpemUoanNtblRva2Vuc1NpemUpOworCisgICAganNtbl9pbml0KCZwYXJzZXIpOworICAgIGludCBzdGF0dXMgPSBqc21uX3BhcnNlKCZwYXJzZXIsIGpzb25XZWJLZXlTZXQuY19zdHIoKSwKKyAgICAgICAgICAgIGpzb25XZWJLZXlTZXQuc2l6ZSgpLCBtSnNtblRva2Vucy5kYXRhKCksIG51bVRva2Vucyk7CisgICAgaWYgKHN0YXR1cyA8IDApIHsKKyAgICAgICAgQUxPR0UoIlBhcnNlciByZXR1cm5zIGVycm9yIGNvZGU9JWQiLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgdG9rZW47CisgICAgY29uc3QgY2hhciAqcGpzOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVG9rZW5zOyArK2kpIHsKKyAgICAgICAgcGpzID0ganNvbldlYktleVNldC5jX3N0cigpICsgbUpzbW5Ub2tlbnNbaV0uc3RhcnQ7CisgICAgICAgIGlmIChtSnNtblRva2Vuc1tpXS50eXBlID09IEpTTU5fT0JKRUNUKSB7CisgICAgICAgICAgICB0b2tlbi5hc3NpZ24ocGpzLCBtSnNtblRva2Vuc1tpXS5lbmQgLSBtSnNtblRva2Vuc1tpXS5zdGFydCk7CisgICAgICAgICAgICBqc29uT2JqZWN0cy0+cHVzaF9iYWNrKHRva2VuKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKK30gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIGRybQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvU2Vzc2lvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdjOTI2OQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvU2Vzc2lvbi5jcHAKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiaGlkbF9DbGVhcktleVNlc3Npb24iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJTZXNzaW9uLmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKworI2luY2x1ZGUgIkFlc0N0ckRlY3J5cHRvci5oIgorI2luY2x1ZGUgIkluaXREYXRhUGFyc2VyLmgiCisjaW5jbHVkZSAiSnNvbldlYktleS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OktleVZhbHVlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdGF0dXM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN1YlNhbXBsZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3VzaW5nIGFuZHJvaWQ6Ok11dGV4OworCitTdGF0dXMgU2Vzc2lvbjo6Z2V0S2V5UmVxdWVzdCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWltZVR5cGUsCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBrZXlSZXF1ZXN0KSBjb25zdCB7CisgICAgSW5pdERhdGFQYXJzZXIgcGFyc2VyOworICAgIHJldHVybiBwYXJzZXIucGFyc2UoaW5pdERhdGEsIG1pbWVUeXBlLCBrZXlSZXF1ZXN0KTsKK30KKworU3RhdHVzIFNlc3Npb246OnByb3ZpZGVLZXlSZXNwb25zZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcmVzcG9uc2UpIHsKKyAgICBzdGQ6OnN0cmluZyByZXNwb25zZVN0cmluZygKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHJlc3BvbnNlLmRhdGEoKSksIHJlc3BvbnNlLnNpemUoKSk7CisgICAgS2V5TWFwIGtleXM7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTWFwTG9jayk7CisgICAgSnNvbldlYktleSBwYXJzZXI7CisgICAgaWYgKHBhcnNlci5leHRyYWN0S2V5c0Zyb21Kc29uV2ViS2V5U2V0KHJlc3BvbnNlU3RyaW5nLCAma2V5cykpIHsKKyAgICAgICAgZm9yIChhdXRvICZrZXkgOiBrZXlzKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaXJzdChrZXkuZmlyc3QuYmVnaW4oKSwga2V5LmZpcnN0LmVuZCgpKTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNlY29uZChrZXkuc2Vjb25kLmJlZ2luKCksIGtleS5zZWNvbmQuZW5kKCkpOworICAgICAgICAgICAgbUtleU1hcC5pbnNlcnQoc3RkOjpwYWlyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiA+KGtleS5maXJzdCwga2V5LnNlY29uZCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBTdGF0dXM6Ok9LOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9VTktOT1dOOworICAgIH0KK30KKworU3RhdHVzIFNlc3Npb246OmRlY3J5cHQoCisgICAgICAgIGNvbnN0IEtleUlkIGtleUlkLCBjb25zdCBJdiBpdiwgY29uc3QgdWludDhfdCogc3JjUHRyLAorICAgICAgICB1aW50OF90KiBkZXN0UHRyLCBjb25zdCBzdGQ6OnZlY3RvcjxTdWJTYW1wbGU+IHN1YlNhbXBsZXMsCisgICAgICAgIHNpemVfdCogYnl0ZXNEZWNyeXB0ZWRPdXQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTWFwTG9jayk7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlJZFZlY3RvcjsKKyAgICBrZXlJZFZlY3Rvci5jbGVhcigpOworICAgIGtleUlkVmVjdG9yLmluc2VydChrZXlJZFZlY3Rvci5lbmQoKSwga2V5SWQsIGtleUlkICsga0Jsb2NrU2l6ZSk7CisgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ID46Oml0ZXJhdG9yIGl0cjsKKyAgICBpdHIgPSBtS2V5TWFwLmZpbmQoa2V5SWRWZWN0b3IpOworICAgIGlmIChpdHIgPT0gbUtleU1hcC5lbmQoKSkgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fTk9fTElDRU5TRTsKKyAgICB9CisKKyAgICBBZXNDdHJEZWNyeXB0b3IgZGVjcnlwdG9yOworICAgIHJldHVybiBkZWNyeXB0b3IuZGVjcnlwdCgKKyAgICAgICAgICAgIGl0ci0+c2Vjb25kIC8qa2V5Ki8sIGl2LCBzcmNQdHIsIGRlc3RQdHIsIHN1YlNhbXBsZXMsCisgICAgICAgICAgICBzdWJTYW1wbGVzLnNpemUoKSwgYnl0ZXNEZWNyeXB0ZWRPdXQpOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgZHJtCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uTGlicmFyeS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL1Nlc3Npb25MaWJyYXJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDMxOWU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uTGlicmFyeS5jcHAKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiaGlkbF9DbGVhcktleVNlc3Npb25MaWJyYXJ5IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiU2Vzc2lvbkxpYnJhcnkuaCIKKyNpbmNsdWRlICJVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworTXV0ZXggU2Vzc2lvbkxpYnJhcnk6OnNTaW5nbGV0b25Mb2NrOworU2Vzc2lvbkxpYnJhcnkqIFNlc3Npb25MaWJyYXJ5OjpzU2luZ2xldG9uID0gTlVMTDsKKworU2Vzc2lvbkxpYnJhcnkqIFNlc3Npb25MaWJyYXJ5OjpnZXQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soc1NpbmdsZXRvbkxvY2spOworCisgICAgaWYgKHNTaW5nbGV0b24gPT0gTlVMTCkgeworICAgICAgICBBTE9HRCgiSW5zdGFudGlhdGluZyBTZXNzaW9uIExpYnJhcnkgU2luZ2xldG9uLiIpOworICAgICAgICBzU2luZ2xldG9uID0gbmV3IFNlc3Npb25MaWJyYXJ5KCk7CisgICAgfQorCisgICAgcmV0dXJuIHNTaW5nbGV0b247Cit9CisKK3NwPFNlc3Npb24+IFNlc3Npb25MaWJyYXJ5OjpjcmVhdGVTZXNzaW9uKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXNzaW9uc0xvY2spOworCisgICAgY2hhciBzZXNzaW9uSWRSYXdbMTZdOworICAgIHNucHJpbnRmKHNlc3Npb25JZFJhdywgc2l6ZW9mKHNlc3Npb25JZFJhdyksICIldSIsIG1OZXh0U2Vzc2lvbklkKTsKKworICAgIG1OZXh0U2Vzc2lvbklkICs9IDE7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQ7CisgICAgc2Vzc2lvbklkLmluc2VydChzZXNzaW9uSWQuZW5kKCksIHNlc3Npb25JZFJhdywKKyAgICAgICAgICAgIHNlc3Npb25JZFJhdyArIHNpemVvZihzZXNzaW9uSWRSYXcpIC8gc2l6ZW9mKHVpbnQ4X3QpKTsKKworICAgIG1TZXNzaW9ucy5pbnNlcnQoc3RkOjpwYWlyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LAorICAgICAgICAgICAgc3A8U2Vzc2lvbj4gPihzZXNzaW9uSWQsIG5ldyBTZXNzaW9uKHNlc3Npb25JZCkpKTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3A8U2Vzc2lvbj4gPjo6aXRlcmF0b3IgaXRyID0gbVNlc3Npb25zLmZpbmQoc2Vzc2lvbklkKTsKKyAgICBpZiAoaXRyICE9IG1TZXNzaW9ucy5lbmQoKSkgeworICAgICAgICByZXR1cm4gaXRyLT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorfQorCitzcDxTZXNzaW9uPiBTZXNzaW9uTGlicmFyeTo6ZmluZFNlc3Npb24oCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2Vzc2lvbnNMb2NrKTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3A8U2Vzc2lvbj4gPjo6aXRlcmF0b3IgaXRyID0gbVNlc3Npb25zLmZpbmQoc2Vzc2lvbklkKTsKKyAgICBpZiAoaXRyICE9IG1TZXNzaW9ucy5lbmQoKSkgeworICAgICAgICByZXR1cm4gaXRyLT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorfQorCit2b2lkIFNlc3Npb25MaWJyYXJ5OjpkZXN0cm95U2Vzc2lvbihjb25zdCBzcDxTZXNzaW9uPiYgc2Vzc2lvbikgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXNzaW9uc0xvY2spOworICAgIG1TZXNzaW9ucy5lcmFzZShzZXNzaW9uLT5zZXNzaW9uSWQoKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBkcm0KK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5LnJjIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmU4NTZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleS5yYwpAQCAtMCwwICsxLDYgQEAKK3NlcnZpY2UgdmVuZG9yLmRybS1jbGVhcmtleS1oYWwtMS0xIC92ZW5kb3IvYmluL2h3L2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5CisgICAgY2xhc3MgaGFsCisgICAgdXNlciBtZWRpYQorICAgIGdyb3VwIG1lZGlhIG1lZGlhZHJtCisgICAgaW9wcmlvIHJ0IDQKKyAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQWVzQ3RyRGVjcnlwdG9yLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQWVzQ3RyRGVjcnlwdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM3ZWYyMAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9BZXNDdHJEZWNyeXB0b3IuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUktFWV9BRVNfQ1RSX0RFQ1JZUFRPUl9IXworI2RlZmluZSBDTEVBUktFWV9BRVNfQ1RSX0RFQ1JZUFRPUl9IXworCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3ViU2FtcGxlOworCitjbGFzcyBBZXNDdHJEZWNyeXB0b3IgeworcHVibGljOgorICAgIEFlc0N0ckRlY3J5cHRvcigpIHt9CisKKyAgICBTdGF0dXMgZGVjcnlwdChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYga2V5LCBjb25zdCBJdiBpdiwKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNvdXJjZSwgdWludDhfdCogZGVzdGluYXRpb24sCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxTdWJTYW1wbGU+IHN1YlNhbXBsZXMsIHNpemVfdCBudW1TdWJTYW1wbGVzLAorICAgICAgICAgICAgc2l6ZV90KiBieXRlc0RlY3J5cHRlZE91dCk7CisKK3ByaXZhdGU6CisgICAgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEFlc0N0ckRlY3J5cHRvcik7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgZHJtCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQ0xFQVJLRVlfQUVTX0NUUl9ERUNSWVBUT1JfSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CYXNlNjQuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CYXNlNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTM4NWJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0Jhc2U2NC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEJBU0VfNjRfSF8KKworI2RlZmluZSBCQVNFXzY0X0hfCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgIkJ1ZmZlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQnVmZmVyOworCitzcDxCdWZmZXI+IGRlY29kZUJhc2U2NChjb25zdCBzdGQ6OnN0cmluZyAmcyk7Cit2b2lkIGVuY29kZUJhc2U2NChjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgc3RkOjpzdHJpbmcgKm91dCk7CisKK3ZvaWQgZW5jb2RlQmFzZTY0VXJsKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBzdGQ6OnN0cmluZyAqb3V0KTsKKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKK30gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIGRybQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBCQVNFXzY0X0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQnVmZmVyLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJiYjI4YQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CdWZmZXIuaApAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBCVUZGRVJfSF8KKyNkZWZpbmUgQlVGRkVSX0hfCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBCdWZmZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgZXhwbGljaXQgQnVmZmVyKHNpemVfdCBjYXBhY2l0eSk7CisKKyAgICB1aW50OF90ICpiYXNlKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KG1EYXRhKTsgfQorICAgIHVpbnQ4X3QgKmRhdGEoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4obURhdGEpICsgbVJhbmdlT2Zmc2V0OyB9CisgICAgc2l6ZV90IGNhcGFjaXR5KCkgY29uc3QgeyByZXR1cm4gbUNhcGFjaXR5OyB9CisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBtUmFuZ2VMZW5ndGg7IH0KKyAgICBzaXplX3Qgb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbVJhbmdlT2Zmc2V0OyB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5CdWZmZXIoKTsKKworcHJpdmF0ZToKKyAgICB2b2lkICptRGF0YTsKKyAgICBzaXplX3QgbUNhcGFjaXR5OworICAgIHNpemVfdCBtUmFuZ2VPZmZzZXQ7CisgICAgc2l6ZV90IG1SYW5nZUxlbmd0aDsKKworICAgIGJvb2wgbU93bnNEYXRhOworCisgICAgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEJ1ZmZlcik7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgZHJtCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEJVRkZFUl9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5RHJtUHJvcGVydGllcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5RHJtUHJvcGVydGllcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NWIyNWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlEcm1Qcm9wZXJ0aWVzLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0xFQVJLRVlfRFJNX1BST1BFUlRJRVNfSF8KKyNkZWZpbmUgQ0xFQVJLRVlfRFJNX1BST1BFUlRJRVNfSF8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1ZlbmRvcktleSgidmVuZG9yIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1ZlbmRvclZhbHVlKCJHb29nbGUiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVmVyc2lvbktleSgidmVyc2lvbiIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtWZXJzaW9uVmFsdWUoIjEuMSIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtQbHVnaW5EZXNjcmlwdGlvbktleSgiZGVzY3JpcHRpb24iKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrUGx1Z2luRGVzY3JpcHRpb25WYWx1ZSgiQ2xlYXJLZXkgQ0RNIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0FsZ29yaXRobXNLZXkoImFsZ29yaXRobXMiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQWxnb3JpdGhtc1ZhbHVlKCIiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrTGlzdGVuZXJUZXN0U3VwcG9ydEtleSgibGlzdGVuZXJUZXN0U3VwcG9ydCIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtMaXN0ZW5lclRlc3RTdXBwb3J0VmFsdWUoInRydWUiKTsKKworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtEZXZpY2VJZEtleSgiZGV2aWNlSWQiKTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtUZXN0RGV2aWNlSWREYXRhW10gPQorICAgICAgICB7MHgwLCAweDEsIDB4MiwgMHgzLCAweDQsIDB4NSwgMHg2LCAweDcsCisgICAgICAgICAweDgsIDB4OSwgMHhhLCAweGIsIDB4YywgMHhkLCAweGUsIDB4Zn07CisvLyBUT0RPIHN0dWIgb3V0IG1ldHJpY3MgZm9yIG53CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga01ldHJpY3NLZXkoIm1ldHJpY3MiKTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtNZXRyaWNzRGF0YVtdID0geyAwIH07CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBkcm0KK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBDTEVBUktFWV9EUk1fUFJPUEVSVElFU19IXworCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlUeXBlcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5VHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmNiNWU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5VHlwZXMuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUktFWV9NQUNST1NfSF8KKyNkZWZpbmUgQ0xFQVJLRVlfTUFDUk9TX0hfCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIGNsZWFya2V5IHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlWYWx1ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOworCitjb25zdCB1aW50OF90IGtCbG9ja1NpemUgPSAxNjsgLy9BRVNfQkxPQ0tfU0laRTsKK3R5cGVkZWYgdWludDhfdCBLZXlJZFtrQmxvY2tTaXplXTsKK3R5cGVkZWYgdWludDhfdCBJdltrQmxvY2tTaXplXTsKKwordHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN1YlNhbXBsZSBTdWJTYW1wbGU7Cit0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzdGQ6OnZlY3Rvcjx1aW50OF90PiA+IEtleU1hcDsKKworI2RlZmluZSBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oVHlwZU5hbWUpIFwKKyAgVHlwZU5hbWUoY29uc3QgVHlwZU5hbWUmKSA9IGRlbGV0ZTsgICAgICBcCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFR5cGVOYW1lJikgPSBkZWxldGU7CisKKyNkZWZpbmUgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOX0FORF9ORVcoVHlwZU5hbWUpIFwKKyAgVHlwZU5hbWUoKSA9IGRlbGV0ZTsgICAgICAgICAgICAgICAgICAgICBcCisgIFR5cGVOYW1lKGNvbnN0IFR5cGVOYW1lJikgPSBkZWxldGU7ICAgICAgXAorICB2b2lkIG9wZXJhdG9yPShjb25zdCBUeXBlTmFtZSYpID0gZGVsZXRlOworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgZHJtCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQ0xFQVJLRVlfTUFDUk9TX0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1MjAyNwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUktFWV9DUkVBVEVfUExVR0lOX0ZBQ1RPUklFU19IXworI2RlZmluZSBDTEVBUktFWV9DUkVBVEVfUExVR0lOX0ZBQ1RPUklFU19IXworCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lDcnlwdG9GYWN0b3J5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lEcm1GYWN0b3J5Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6SUNyeXB0b0ZhY3Rvcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OklEcm1GYWN0b3J5OworCitleHRlcm4gIkMiIHsKKyAgICBJRHJtRmFjdG9yeSogY3JlYXRlRHJtRmFjdG9yeSgpOworICAgIElDcnlwdG9GYWN0b3J5KiBjcmVhdGVDcnlwdG9GYWN0b3J5KCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAgLy8gbmFtZXNwYWNlIFYxXzEKK30gIC8vIG5hbWVzcGFjZSBkcm0KK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNlbmRpZiAvLyBDTEVBUktFWV9DUkVBVEVfUExVR0lOX0ZBQ1RPUklFU19IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b0ZhY3RvcnkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9GYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc1YWI3NgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9GYWN0b3J5LmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0xFQVJLRVlfQ1JZUFRPX0ZBQ1RPUllfSF8KKyNkZWZpbmUgQ0xFQVJLRVlfQ1JZUFRPX0ZBQ1RPUllfSF8KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JQ3J5cHRvUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lDcnlwdG9GYWN0b3J5Lmg+CisKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6SUNyeXB0b0ZhY3Rvcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OklDcnlwdG9QbHVnaW47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CisKK3N0cnVjdCBDcnlwdG9GYWN0b3J5IDogcHVibGljIElDcnlwdG9GYWN0b3J5IHsKKyAgICBDcnlwdG9GYWN0b3J5KCkge30KKyAgICB2aXJ0dWFsIH5DcnlwdG9GYWN0b3J5KCkge30KKworICAgIFJldHVybjxib29sPiBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCBoaWRsX2FycmF5PHVpbnQ4X3QsIDE2PiYgdXVpZCkKKyAgICAgICAgICAgIG92ZXJyaWRlOworCisgICAgUmV0dXJuPHZvaWQ+IGNyZWF0ZVBsdWdpbigKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgMTY+JiB1dWlkLAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGluaXREYXRhLAorICAgICAgICAgICAgY3JlYXRlUGx1Z2luX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oQ3J5cHRvRmFjdG9yeSk7CisKK307CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBkcm0KK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBDTEVBUktFWV9DUllQVE9fRkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b1BsdWdpbi5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b1BsdWdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNzM4MDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3J5cHRvUGx1Z2luLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMRUFSS0VZX0NSWVBUT19QTFVHSU5fSF8KKyNkZWZpbmUgQ0xFQVJLRVlfQ1JZUFRPX1BMVUdJTl9IXworCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lDcnlwdG9QbHVnaW4uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+CisKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisjaW5jbHVkZSAiU2Vzc2lvbi5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCisKK25hbWVzcGFjZSB7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBLRVlfSURfU0laRSA9IDE2OworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgS0VZX0lWX1NJWkUgPSAxNjsKK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIGNsZWFya2V5IHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpEZXN0aW5hdGlvbkJ1ZmZlcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6SUNyeXB0b1BsdWdpbjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6TW9kZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6UGF0dGVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U2hhcmVkQnVmZmVyOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdGF0dXM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN1YlNhbXBsZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpoaWRsOjptZW1vcnk6OlYxXzA6OklNZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQ3J5cHRvUGx1Z2luIDogcHVibGljIElDcnlwdG9QbHVnaW4geworICAgIGV4cGxpY2l0IENyeXB0b1BsdWdpbihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkKSB7CisgICAgICAgIG1Jbml0U3RhdHVzID0gc2V0TWVkaWFEcm1TZXNzaW9uKHNlc3Npb25JZCk7CisgICAgfQorICAgIHZpcnR1YWwgfkNyeXB0b1BsdWdpbigpIHt9CisKKyAgICBSZXR1cm48Ym9vbD4gcmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KGNvbnN0IGhpZGxfc3RyaW5nJiBtaW1lKSB7CisgICAgICAgIFVOVVNFRChtaW1lKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFJldHVybjx2b2lkPiBub3RpZnlSZXNvbHV0aW9uKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKKyAgICAgICAgVU5VU0VEKHdpZHRoKTsKKyAgICAgICAgVU5VU0VEKGhlaWdodCk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgUmV0dXJuPHZvaWQ+IGRlY3J5cHQoCisgICAgICAgICAgICBib29sIHNlY3VyZSwKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgS0VZX0lEX1NJWkU+JiBrZXlJZCwKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgS0VZX0lWX1NJWkU+JiBpdiwKKyAgICAgICAgICAgIE1vZGUgbW9kZSwKKyAgICAgICAgICAgIGNvbnN0IFBhdHRlcm4mIHBhdHRlcm4sCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxTdWJTYW1wbGU+JiBzdWJTYW1wbGVzLAorICAgICAgICAgICAgY29uc3QgU2hhcmVkQnVmZmVyJiBzb3VyY2UsCisgICAgICAgICAgICB1aW50NjRfdCBvZmZzZXQsCisgICAgICAgICAgICBjb25zdCBEZXN0aW5hdGlvbkJ1ZmZlciYgZGVzdGluYXRpb24sCisgICAgICAgICAgICBkZWNyeXB0X2NiIF9oaWRsX2NiKTsKKworICAgIFJldHVybjx2b2lkPiBzZXRTaGFyZWRCdWZmZXJCYXNlKGNvbnN0IGhpZGxfbWVtb3J5JiBiYXNlLAorICAgICAgICAgICAgdWludDMyX3QgYnVmZmVySWQpOworCisgICAgUmV0dXJuPFN0YXR1cz4gc2V0TWVkaWFEcm1TZXNzaW9uKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOworCisgICAgUmV0dXJuPFN0YXR1cz4gZ2V0SW5pdFN0YXR1cygpIGNvbnN0IHsgcmV0dXJuIG1Jbml0U3RhdHVzOyB9CisKK3ByaXZhdGU6CisgICAgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKENyeXB0b1BsdWdpbik7CisKKyAgICBzdGQ6Om1hcDx1aW50MzJfdCwgc3A8SU1lbW9yeT4gPiBtU2hhcmVkQnVmZmVyTWFwOworICAgIHNwPFNlc3Npb24+IG1TZXNzaW9uOworICAgIFN0YXR1cyBtSW5pdFN0YXR1czsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBkcm0KK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBDTEVBUktFWV9DUllQVE9fUExVR0lOX0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtRmFjdG9yeS5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybUZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjU4MTk1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybUZhY3RvcnkuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUktFWV9EUk1fRkFDVE9SWV9IXworI2RlZmluZSBDTEVBUktFWV9EUk1fRkFDVE9SWV9IXworCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lEcm1QbHVnaW4uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybUZhY3RvcnkuaD4KKworI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIGNsZWFya2V5IHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOworCitzdHJ1Y3QgRHJtRmFjdG9yeSA6IHB1YmxpYyBJRHJtRmFjdG9yeSB7CisgICAgRHJtRmFjdG9yeSgpIHt9CisgICAgdmlydHVhbCB+RHJtRmFjdG9yeSgpIHt9CisKKyAgICBSZXR1cm48Ym9vbD4gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCAxNj4mIHV1aWQpCisgICAgICAgICAgICBvdmVycmlkZTsKKworICAgIFJldHVybjxib29sPiBpc0NvbnRlbnRUeXBlU3VwcG9ydGVkKGNvbnN0IGhpZGxfc3RyaW5nICZtaW1lVHlwZSkKKyAgICAgICAgICAgIG92ZXJyaWRlOworCisgICAgUmV0dXJuPHZvaWQ+IGNyZWF0ZVBsdWdpbigKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgMTY+JiB1dWlkLAorICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGFwcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgY3JlYXRlUGx1Z2luX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oRHJtRmFjdG9yeSk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgZHJtCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQ0xFQVJLRVlfRFJNX0ZBQ1RPUllfSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1QbHVnaW4uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1QbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjA2OTVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybVBsdWdpbi5oCkBAIC0wLDAgKzEsMzQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUktFWV9EUk1fUExVR0lOX0hfCisjZGVmaW5lIENMRUFSS0VZX0RSTV9QTFVHSU5fSF8KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JRHJtUGx1Z2luLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgIlNlc3Npb25MaWJyYXJ5LmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIGNsZWFya2V5IHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpFdmVudFR5cGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OklEcm1QbHVnaW5MaXN0ZW5lcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6S2V5U3RhdHVzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlUeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlWYWx1ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U2VjdXJlU3RvcDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U2VjdXJlU3RvcElkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTZXNzaW9uSWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OklEcm1QbHVnaW47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlOworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBEcm1QbHVnaW4gOiBwdWJsaWMgSURybVBsdWdpbiB7CisgICAgZXhwbGljaXQgRHJtUGx1Z2luKFNlc3Npb25MaWJyYXJ5KiBzZXNzaW9uTGlicmFyeSk7CisKKyAgICB2aXJ0dWFsIH5Ecm1QbHVnaW4oKSB7fQorCisgICAgUmV0dXJuPHZvaWQ+IG9wZW5TZXNzaW9uKG9wZW5TZXNzaW9uX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKyAgICBSZXR1cm48dm9pZD4gb3BlblNlc3Npb25fMV8xKFNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlMZXZlbCwKKyAgICAgICAgICAgIG9wZW5TZXNzaW9uX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIFJldHVybjxTdGF0dXM+IGNsb3NlU2Vzc2lvbihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkKSBvdmVycmlkZTsKKworICAgIFJldHVybjx2b2lkPiBnZXRLZXlSZXF1ZXN0KAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICBLZXlUeXBlIGtleVR5cGUsCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVZhbHVlPiYgb3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgICBnZXRLZXlSZXF1ZXN0X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIFJldHVybjx2b2lkPiBnZXRLZXlSZXF1ZXN0XzFfMSgKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNjb3BlLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgS2V5VHlwZSBrZXlUeXBlLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlWYWx1ZT4mIG9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgZ2V0S2V5UmVxdWVzdF8xXzFfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgUmV0dXJuPHZvaWQ+IHByb3ZpZGVLZXlSZXNwb25zZSgKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNjb3BlLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgcmVzcG9uc2UsCisgICAgICAgIHByb3ZpZGVLZXlSZXNwb25zZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48U3RhdHVzPiByZW1vdmVLZXlzKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKKyAgICAgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIFJldHVybjxTdGF0dXM+IHJlc3RvcmVLZXlzKAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYga2V5U2V0SWQpIHsKKworICAgICAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwIHx8IGtleVNldElkLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfQorCisgICAgUmV0dXJuPHZvaWQ+IHF1ZXJ5S2V5U3RhdHVzKAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICBxdWVyeUtleVN0YXR1c19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48dm9pZD4gZ2V0UHJvdmlzaW9uUmVxdWVzdCgKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGNlcnRpZmljYXRlVHlwZSwKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGNlcnRpZmljYXRlQXV0aG9yaXR5LAorICAgICAgICBnZXRQcm92aXNpb25SZXF1ZXN0X2NiIF9oaWRsX2NiKSB7CisgICAgICAgIFVOVVNFRChjZXJ0aWZpY2F0ZVR5cGUpOworICAgICAgICBVTlVTRUQoY2VydGlmaWNhdGVBdXRob3JpdHkpOworCisgICAgICAgIGhpZGxfc3RyaW5nIGRlZmF1bHRVcmw7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIGhpZGxfdmVjPHVpbnQ4X3Q+KCksIGRlZmF1bHRVcmwpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIFJldHVybjx2b2lkPiBwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiByZXNwb25zZSwKKyAgICAgICAgcHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlX2NiIF9oaWRsX2NiKSB7CisKKyAgICAgICAgaWYgKHJlc3BvbnNlLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkJBRF9WQUxVRSwgaGlkbF92ZWM8dWludDhfdD4oKSwgaGlkbF92ZWM8dWludDhfdD4oKSk7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIGhpZGxfdmVjPHVpbnQ4X3Q+KCksIGhpZGxfdmVjPHVpbnQ4X3Q+KCkpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIFJldHVybjx2b2lkPiBnZXRIZGNwTGV2ZWxzKGdldEhkY3BMZXZlbHNfY2IgX2hpZGxfY2IpIHsKKyAgICAgICAgSGRjcExldmVsIGNvbm5lY3RlZExldmVsID0gSGRjcExldmVsOjpIRENQX05PTkU7CisgICAgICAgIEhkY3BMZXZlbCBtYXhMZXZlbCA9IEhkY3BMZXZlbDo6SERDUF9OT19PVVRQVVQ7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6T0ssIGNvbm5lY3RlZExldmVsLCBtYXhMZXZlbCk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgUmV0dXJuPHZvaWQ+IGdldE51bWJlck9mU2Vzc2lvbnMoZ2V0TnVtYmVyT2ZTZXNzaW9uc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48dm9pZD4gZ2V0U2VjdXJpdHlMZXZlbChjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgZ2V0U2VjdXJpdHlMZXZlbF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48dm9pZD4gZ2V0TWV0cmljcyhnZXRNZXRyaWNzX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIFJldHVybjx2b2lkPiBnZXRQcm9wZXJ0eVN0cmluZygKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsCisgICAgICAgIGdldFByb3BlcnR5U3RyaW5nX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIFJldHVybjx2b2lkPiBnZXRQcm9wZXJ0eUJ5dGVBcnJheSgKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsCisgICAgICAgIGdldFByb3BlcnR5Qnl0ZUFycmF5X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIFJldHVybjxTdGF0dXM+IHNldFByb3BlcnR5U3RyaW5nKAorICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsIGNvbnN0IGhpZGxfc3RyaW5nJiB2YWx1ZSkgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48U3RhdHVzPiBzZXRQcm9wZXJ0eUJ5dGVBcnJheSgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBuYW1lLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgdmFsdWUpIG92ZXJyaWRlOworCisgICAgUmV0dXJuPFN0YXR1cz4gc2V0Q2lwaGVyQWxnb3JpdGhtKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwgY29uc3QgaGlkbF9zdHJpbmcmIGFsZ29yaXRobSkgeworICAgICAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwIHx8IGFsZ29yaXRobS5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKworICAgIFJldHVybjxTdGF0dXM+IHNldE1hY0FsZ29yaXRobSgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsIGNvbnN0IGhpZGxfc3RyaW5nJiBhbGdvcml0aG0pIHsKKyAgICAgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCB8fCBhbGdvcml0aG0uc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gZW5jcnlwdCgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYga2V5SWQsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaW5wdXQsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaXYsCisgICAgICAgICAgICBlbmNyeXB0X2NiIF9oaWRsX2NiKSB7CisgICAgICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDAgfHwga2V5SWQuc2l6ZSgpID09IDAgfHwKKyAgICAgICAgICAgICAgICBpbnB1dC5zaXplKCkgPT0gMCB8fCBpdi5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpCQURfVkFMVUUsIGhpZGxfdmVjPHVpbnQ4X3Q+KCkpOworICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgfQorICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCBoaWRsX3ZlYzx1aW50OF90PigpKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gZGVjcnlwdCgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYga2V5SWQsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaW5wdXQsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaXYsCisgICAgICAgICAgICBkZWNyeXB0X2NiIF9oaWRsX2NiKSB7CisgICAgICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDAgfHwga2V5SWQuc2l6ZSgpID09IDAgfHwKKyAgICAgICAgICAgICAgICBpbnB1dC5zaXplKCkgPT0gMCB8fCBpdi5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpCQURfVkFMVUUsIGhpZGxfdmVjPHVpbnQ4X3Q+KCkpOworICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgfQorICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCBoaWRsX3ZlYzx1aW50OF90PigpKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gc2lnbigKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYga2V5SWQsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgbWVzc2FnZSwKKyAgICAgICAgICAgIHNpZ25fY2IgX2hpZGxfY2IpIHsKKyAgICAgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCB8fCBrZXlJZC5zaXplKCkgPT0gMCB8fAorICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6QkFEX1ZBTFVFLCBoaWRsX3ZlYzx1aW50OF90PigpKTsKKyAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgIH0KKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgaGlkbF92ZWM8dWludDhfdD4oKSk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgUmV0dXJuPHZvaWQ+IHZlcmlmeSgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYga2V5SWQsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgbWVzc2FnZSwKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzaWduYXR1cmUsCisgICAgICAgICAgICB2ZXJpZnlfY2IgX2hpZGxfY2IpIHsKKworICAgICAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwIHx8IGtleUlkLnNpemUoKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgbWVzc2FnZS5zaXplKCkgPT0gMCB8fCBzaWduYXR1cmUuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6QkFEX1ZBTFVFLCBmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gc2lnblJTQSgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgYWxnb3JpdGhtLAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIG1lc3NhZ2UsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgd3JhcHBlZEtleSwKKyAgICAgICAgICAgIHNpZ25SU0FfY2IgX2hpZGxfY2IpIHsKKyAgICAgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCB8fCBhbGdvcml0aG0uc2l6ZSgpID09IDAgfHwKKyAgICAgICAgICAgICAgICBtZXNzYWdlLnNpemUoKSA9PSAwIHx8IHdyYXBwZWRLZXkuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkJBRF9WQUxVRSwgaGlkbF92ZWM8dWludDhfdD4oKSk7CisgICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgIH0KKyAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIGhpZGxfdmVjPHVpbnQ4X3Q+KCkpOworICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gc2V0TGlzdGVuZXIoY29uc3Qgc3A8SURybVBsdWdpbkxpc3RlbmVyPiYgbGlzdGVuZXIpIHsKKyAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfTsKKworICAgIFJldHVybjx2b2lkPiBzZW5kRXZlbnQoRXZlbnRUeXBlIGV2ZW50VHlwZSwgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBkYXRhKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgbUxpc3RlbmVyLT5zZW5kRXZlbnQoZXZlbnRUeXBlLCBzZXNzaW9uSWQsIGRhdGEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIk51bGwgZXZlbnQgbGlzdGVuZXIsIGV2ZW50IG5vdCBzZW50Iik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gc2VuZEV4cGlyYXRpb25VcGRhdGUoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwgaW50NjRfdCBleHBpcnlUaW1lSW5NUykgeworICAgICAgICBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1MaXN0ZW5lci0+c2VuZEV4cGlyYXRpb25VcGRhdGUoc2Vzc2lvbklkLCBleHBpcnlUaW1lSW5NUyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiTnVsbCBldmVudCBsaXN0ZW5lciwgZXZlbnQgbm90IHNlbnQiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIFJldHVybjx2b2lkPiBzZW5kS2V5c0NoYW5nZShjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8S2V5U3RhdHVzPiYga2V5U3RhdHVzTGlzdCwgYm9vbCBoYXNOZXdVc2FibGVLZXkpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgICAgICBtTGlzdGVuZXItPnNlbmRLZXlzQ2hhbmdlKHNlc3Npb25JZCwga2V5U3RhdHVzTGlzdCwgaGFzTmV3VXNhYmxlS2V5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJOdWxsIGV2ZW50IGxpc3RlbmVyLCBldmVudCBub3Qgc2VudCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgUmV0dXJuPHZvaWQ+IGdldFNlY3VyZVN0b3BzKGdldFNlY3VyZVN0b3BzX2NiIF9oaWRsX2NiKTsKKworICAgIFJldHVybjx2b2lkPiBnZXRTZWN1cmVTdG9wKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZWN1cmVTdG9wSWQsCisgICAgICAgICAgICBnZXRTZWN1cmVTdG9wX2NiIF9oaWRsX2NiKTsKKworICAgIFJldHVybjxTdGF0dXM+IHJlbGVhc2VTZWN1cmVTdG9wKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzc1JlbGVhc2UpOworCisgICAgUmV0dXJuPFN0YXR1cz4gcmVsZWFzZUFsbFNlY3VyZVN0b3BzKCk7CisKKyAgICBSZXR1cm48dm9pZD4gZ2V0U2VjdXJlU3RvcElkcyhnZXRTZWN1cmVTdG9wSWRzX2NiIF9oaWRsX2NiKTsKKworICAgIFJldHVybjxTdGF0dXM+IHJlbGVhc2VTZWN1cmVTdG9wcyhjb25zdCBTZWN1cmVTdG9wUmVsZWFzZSYgc3NSZWxlYXNlKTsKKworICAgIFJldHVybjxTdGF0dXM+IHJlbW92ZVNlY3VyZVN0b3AoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlY3VyZVN0b3BJZCk7CisKKyAgICBSZXR1cm48U3RhdHVzPiByZW1vdmVBbGxTZWN1cmVTdG9wcygpOworCitwcml2YXRlOgorICAgIHZvaWQgaW5pdFByb3BlcnRpZXMoKTsKKyAgICB2b2lkIGluc3RhbGxTZWN1cmVTdG9wKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOworICAgIHZvaWQgc2V0UGxheVBvbGljeSgpOworCisgICAgUmV0dXJuPFN0YXR1cz4gc2V0U2VjdXJpdHlMZXZlbChjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgU2VjdXJpdHlMZXZlbCBsZXZlbCk7CisKKyAgICBTdGF0dXMgZ2V0S2V5UmVxdWVzdENvbW1vbihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbWltZVR5cGUsCisgICAgICAgICAgICBLZXlUeXBlIGtleVR5cGUsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlWYWx1ZT4mIG9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpyZXF1ZXN0LAorICAgICAgICAgICAgS2V5UmVxdWVzdFR5cGUgKmdldEtleVJlcXVlc3RUeXBlLAorICAgICAgICAgICAgc3RkOjpzdHJpbmcgKmRlZmF1bHRVcmwpOworCisgICAgc3RydWN0IENsZWFya2V5U2VjdXJlU3RvcCB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGlkOworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhOworICAgIH07CisKKyAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90PiwgQ2xlYXJrZXlTZWN1cmVTdG9wPiBtU2VjdXJlU3RvcHM7CisgICAgc3RkOjp2ZWN0b3I8S2V5VmFsdWU+IG1QbGF5UG9saWN5OworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gbVN0cmluZ1Byb3BlcnRpZXM7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ID4gbUJ5dGVBcnJheVByb3BlcnRpZXM7CisgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIFNlY3VyaXR5TGV2ZWw+IG1TZWN1cml0eUxldmVsOworICAgIHNwPElEcm1QbHVnaW5MaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIFNlc3Npb25MaWJyYXJ5ICptU2Vzc2lvbkxpYnJhcnk7CisgICAgaW50NjRfdCBtT3BlblNlc3Npb25Pa0NvdW50OworICAgIGludDY0X3QgbUNsb3NlU2Vzc2lvbk9rQ291bnQ7CisgICAgaW50NjRfdCBtQ2xvc2VTZXNzaW9uTm90T3BlbmVkQ291bnQ7CisgICAgdWludDMyX3QgbU5leHRTZWN1cmVTdG9wSWQ7CisKKyAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fQU5EX05FVyhEcm1QbHVnaW4pOworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKK30gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIGRybQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIENMRUFSS0VZX0RSTV9QTFVHSU5fSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Jbml0RGF0YVBhcnNlci5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0luaXREYXRhUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE4OWM0YQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Jbml0RGF0YVBhcnNlci5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMRUFSS0VZX0lOSVRfREFUQV9QQVJTRVJfSF8KKyNkZWZpbmUgQ0xFQVJLRVlfSU5JVF9EQVRBX1BBUlNFUl9IXworCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL3R5cGVzLmg+CisKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3RhdHVzOworCitjbGFzcyBJbml0RGF0YVBhcnNlciB7CitwdWJsaWM6CisgICAgSW5pdERhdGFQYXJzZXIoKSB7fQorCisgICAgU3RhdHVzIHBhcnNlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGxpY2Vuc2VSZXF1ZXN0KTsKKworcHJpdmF0ZToKKyAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oSW5pdERhdGFQYXJzZXIpOworCisgICAgU3RhdHVzIHBhcnNlUHNzaChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCB1aW50OF90Kj4qIGtleUlkcyk7CisKKyAgICBzdGQ6OnN0cmluZyBnZW5lcmF0ZVJlcXVlc3QoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCB1aW50OF90Kj4mIGtleUlkcyk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgZHJtCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQ0xFQVJLRVlfSU5JVF9EQVRBX1BBUlNFUl9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0pzb25XZWJLZXkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Kc29uV2ViS2V5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFiMDM0YwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Kc29uV2ViS2V5LmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIENMRUFSS0VZX0pTT05fV0VCX0tFWV9IXworI2RlZmluZSBDTEVBUktFWV9KU09OX1dFQl9LRVlfSF8KKworI2luY2x1ZGUgImpzbW4uaCIKKyNpbmNsdWRlICJVdGlscy5oIgorI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIGNsZWFya2V5IHsKKworY2xhc3MgSnNvbldlYktleSB7CisgcHVibGljOgorICAgIEpzb25XZWJLZXkoKTsKKyAgICB2aXJ0dWFsIH5Kc29uV2ViS2V5KCk7CisKKyAgICBib29sIGV4dHJhY3RLZXlzRnJvbUpzb25XZWJLZXlTZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGpzb25XZWJLZXlTZXQsCisgICAgICAgICAgICBLZXlNYXAqIGtleXMpOworCisgcHJpdmF0ZToKKyAgICBzdGQ6OnZlY3Rvcjxqc21udG9rX3Q+IG1Kc21uVG9rZW5zOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtSnNvbk9iamVjdHM7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1Ub2tlbnM7CisKKyAgICBib29sIGRlY29kZUJhc2U2NFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgZW5jb2RlZFRleHQsCisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiogZGVjb2RlZFRleHQpOworICAgIGJvb2wgZmluZEtleShjb25zdCBzdGQ6OnN0cmluZyYganNvbk9iamVjdCwgc3RkOjpzdHJpbmcqIGtleUlkLAorICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGVuY29kZWRLZXkpOworICAgIHZvaWQgZmluZFZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nICZrZXksIHN0ZDo6c3RyaW5nKiB2YWx1ZSk7CisgICAgYm9vbCBpc0pzb25XZWJLZXlTZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGpzb25PYmplY3QpIGNvbnN0OworICAgIGJvb2wgcGFyc2VKc29uT2JqZWN0KGNvbnN0IHN0ZDo6c3RyaW5nJiBqc29uT2JqZWN0LAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiB0b2tlbnMpOworICAgIGJvb2wgcGFyc2VKc29uV2ViS2V5U2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBqc29uV2ViS2V5U2V0LAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBqc29uT2JqZWN0cyk7CisKKyAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oSnNvbldlYktleSk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgZHJtCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENMRUFSS0VZX0pTT05fV0VCX0tFWV9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1Nlc3Npb24uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RkZmNhNQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0xFQVJLRVlfU0VTU0lPTl9IXworI2RlZmluZSBDTEVBUktFWV9TRVNTSU9OX0hfCisKKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIGNsZWFya2V5IHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdGF0dXM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN1YlNhbXBsZTsKKworY2xhc3MgU2Vzc2lvbiA6IHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBTZXNzaW9uKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpCisgICAgICAgICAgICA6IG1TZXNzaW9uSWQoc2Vzc2lvbklkKSB7fQorICAgIHZpcnR1YWwgflNlc3Npb24oKSB7fQorCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCgpIGNvbnN0IHsgcmV0dXJuIG1TZXNzaW9uSWQ7IH0KKworICAgIFN0YXR1cyBnZXRLZXlSZXF1ZXN0KAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIG1pbWVUeXBlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluaXREYXRhVHlwZSwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBrZXlSZXF1ZXN0KSBjb25zdDsKKworICAgIFN0YXR1cyBwcm92aWRlS2V5UmVzcG9uc2UoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcmVzcG9uc2UpOworCisgICAgU3RhdHVzIGRlY3J5cHQoCisgICAgICAgICAgICBjb25zdCBLZXlJZCBrZXlJZCwgY29uc3QgSXYgaXYsIGNvbnN0IHVpbnQ4X3QqIHNyY1B0ciwKKyAgICAgICAgICAgIHVpbnQ4X3QqIGRzdFB0ciwgY29uc3Qgc3RkOjp2ZWN0b3I8U3ViU2FtcGxlPiBzdWJTYW1wbGVzLAorICAgICAgICAgICAgc2l6ZV90KiBieXRlc0RlY3J5cHRlZE91dCk7CisKK3ByaXZhdGU6CisgICAgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNlc3Npb24pOworCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gbVNlc3Npb25JZDsKKyAgICBLZXlNYXAgbUtleU1hcDsKKyAgICBNdXRleCBtTWFwTG9jazsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBkcm0KK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBDTEVBUktFWV9TRVNTSU9OX0hfCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvU2Vzc2lvbkxpYnJhcnkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uTGlicmFyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNmEwYzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvU2Vzc2lvbkxpYnJhcnkuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUktFWV9TRVNTSU9OX0xJQlJBUllfSF8KKyNkZWZpbmUgQ0xFQVJLRVlfU0VTU0lPTl9MSUJSQVJZX0hfCisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKworI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKKyNpbmNsdWRlICJTZXNzaW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK2NsYXNzIFNlc3Npb25MaWJyYXJ5IDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIHN0YXRpYyBTZXNzaW9uTGlicmFyeSogZ2V0KCk7CisKKyAgICBzcDxTZXNzaW9uPiBjcmVhdGVTZXNzaW9uKCk7CisKKyAgICBzcDxTZXNzaW9uPiBmaW5kU2Vzc2lvbigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOworCisgICAgdm9pZCBkZXN0cm95U2Vzc2lvbihjb25zdCBzcDxTZXNzaW9uPiYgc2Vzc2lvbik7CisKKyAgICBzaXplX3QgbnVtT3BlblNlc3Npb25zKCkgY29uc3QgeyByZXR1cm4gbVNlc3Npb25zLnNpemUoKTsgfQorCitwcml2YXRlOgorICAgIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTZXNzaW9uTGlicmFyeSk7CisKKyAgICBTZXNzaW9uTGlicmFyeSgpIDogbU5leHRTZXNzaW9uSWQoMSkge30KKworICAgIHN0YXRpYyBNdXRleCBzU2luZ2xldG9uTG9jazsKKyAgICBzdGF0aWMgU2Vzc2lvbkxpYnJhcnkqIHNTaW5nbGV0b247CisKKyAgICBNdXRleCBtU2Vzc2lvbnNMb2NrOworICAgIHVpbnQzMl90IG1OZXh0U2Vzc2lvbklkOworICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzcDxTZXNzaW9uPiA+IG1TZXNzaW9uczsKK307CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBkcm0KK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBDTEVBUktFWV9TRVNTSU9OX0xJQlJBUllfSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9UeXBlQ29udmVydC5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1R5cGVDb252ZXJ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MwNjMyOQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9UeXBlQ29udmVydC5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMRUFSS0VZX0FORFJPSURfSEFSRFdBUkVfRFJNX1YxXzFfVFlQRUNPTlZFUlQKKyNkZWZpbmUgQ0xFQVJLRVlfQU5EUk9JRF9IQVJEV0FSRV9EUk1fVjFfMV9UWVBFQ09OVkVSVAorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL3R5cGVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gY29uc3QgaGlkbF92ZWM8VD4gdG9IaWRsVmVjKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZ2ZWMpIHsKKyAgICBoaWRsX3ZlYzxUPiBoVmVjOworICAgIGhWZWMuc2V0VG9FeHRlcm5hbChjb25zdF9jYXN0PFQgKj4odmVjLmRhdGEoKSksIHZlYy5zaXplKCkpOworICAgIHJldHVybiBoVmVjOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBoaWRsX3ZlYzxUPiB0b0hpZGxWZWMoc3RkOjp2ZWN0b3I8VD4gJnZlYykgeworICAgIGhpZGxfdmVjPFQ+IGhWZWM7CisgICAgaFZlYy5zZXRUb0V4dGVybmFsKHZlYy5kYXRhKCksIHZlYy5zaXplKCkpOworICAgIHJldHVybiBoVmVjOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjb25zdCBzdGQ6OnZlY3RvcjxUPiB0b1ZlY3Rvcihjb25zdCBoaWRsX3ZlYzxUPiAmaFZlYykgeworICAgIHN0ZDo6dmVjdG9yPFQ+IHZlYzsKKyAgICB2ZWMuYXNzaWduKGhWZWMuZGF0YSgpLCBoVmVjLmRhdGEoKSArIGhWZWMuc2l6ZSgpKTsKKyAgICByZXR1cm4gKmNvbnN0X2Nhc3Q8Y29uc3Qgc3RkOjp2ZWN0b3I8VD4gKj4oJnZlYyk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0ZDo6dmVjdG9yPFQ+IHRvVmVjdG9yKGhpZGxfdmVjPFQ+ICZoVmVjKSB7CisgICAgc3RkOjp2ZWN0b3I8VD4gdmVjOworICAgIHZlYy5hc3NpZ24oaFZlYy5kYXRhKCksIGhWZWMuZGF0YSgpICsgaFZlYy5zaXplKCkpOworICAgIHJldHVybiB2ZWM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBTSVpFPiBjb25zdCBzdGQ6OnZlY3RvcjxUPiB0b1ZlY3RvcigKKyAgICAgICAgY29uc3QgaGlkbF9hcnJheTxULCBTSVpFPiAmaEFycmF5KSB7CisgICAgc3RkOjp2ZWN0b3I8VD4gdmVjOworICAgIHZlYy5hc3NpZ24oaEFycmF5LmRhdGEoKSwgaEFycmF5LmRhdGEoKSArIGhBcnJheS5zaXplKCkpOworICAgIHJldHVybiB2ZWM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHNpemVfdCBTSVpFPiBzdGQ6OnZlY3RvcjxUPiB0b1ZlY3RvcigKKyAgICAgICAgaGlkbF9hcnJheTxULCBTSVpFPiAmaEFycmF5KSB7CisgICAgc3RkOjp2ZWN0b3I8VD4gdmVjOworICAgIHZlYy5hc3NpZ24oaEFycmF5LmRhdGEoKSwgaEFycmF5LmRhdGEoKSArIGhBcnJheS5zaXplKCkpOworICAgIHJldHVybiB2ZWM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAgLy8gbmFtZXNwYWNlIFYxXzEKK30gIC8vIG5hbWVzcGFjZSBkcm0KK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIENMRUFSS0VZX0FORFJPSURfSEFSRFdBUkVfRFJNX1YxXzFfVFlQRUNPTlZFUlQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvc2VydmljZS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3NlcnZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhOTdiNzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3NlcnZpY2UuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIExPR19UQUcgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5IgorCisjaW5jbHVkZSA8Q3J5cHRvRmFjdG9yeS5oPgorI2luY2x1ZGUgPERybUZhY3RvcnkuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmpvaW5ScGNUaHJlYWRwb29sOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6SUNyeXB0b0ZhY3Rvcnk7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpJRHJtRmFjdG9yeTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OmNsZWFya2V5OjpDcnlwdG9GYWN0b3J5OwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6Y2xlYXJrZXk6OkRybUZhY3Rvcnk7CisKKworaW50IG1haW4oaW50IC8qIGFyZ2MgKi8sIGNoYXIqKiAvKiBhcmd2ICovKSB7CisgICAgQUxPR0QoImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5IHN0YXJ0aW5nLi4uIik7CisKKyAgICAvLyBUaGUgRFJNIEhBTCBtYXkgY29tbXVuaWNhdGUgdG8gb3RoZXIgdmVuZG9yIGNvbXBvbmVudHMgdmlhCisgICAgLy8gL2Rldi92bmRiaW5kZXIKKyAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OmluaXRXaXRoRHJpdmVyKCIvZGV2L3ZuZGJpbmRlciIpOworCisgICAgc3A8SURybUZhY3Rvcnk+IGRybUZhY3RvcnkgPSBuZXcgRHJtRmFjdG9yeTsKKyAgICBzcDxJQ3J5cHRvRmFjdG9yeT4gY3J5cHRvRmFjdG9yeSA9IG5ldyBDcnlwdG9GYWN0b3J5OworCisgICAgY29uZmlndXJlUnBjVGhyZWFkcG9vbCg4LCB0cnVlIC8qIGNhbGxlcldpbGxKb2luICovKTsKKworICAgIC8vIFNldHVwIGh3YmluZGVyIHNlcnZpY2UKKyAgICBDSEVDS19FUShkcm1GYWN0b3J5LT5yZWdpc3RlckFzU2VydmljZSgiY2xlYXJrZXkiKSwgYW5kcm9pZDo6Tk9fRVJST1IpCisgICAgICAgIDw8ICJGYWlsZWQgdG8gcmVnaXN0ZXIgQ2xlYXJrZXkgRmFjdG9yeSBIQUwiOworICAgIENIRUNLX0VRKGNyeXB0b0ZhY3RvcnktPnJlZ2lzdGVyQXNTZXJ2aWNlKCJjbGVhcmtleSIpLCBhbmRyb2lkOjpOT19FUlJPUikKKyAgICAgICAgPDwgIkZhaWxlZCB0byByZWdpc3RlciBDbGVhcmtleSBDcnlwdG8gIEhBTCI7CisKKyAgICBqb2luUnBjVGhyZWFkcG9vbCgpOworfQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQW5kcm9pZC5icCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmY2ZjNjQuLjAwMDAwMDAKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vCi0vLyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBCdWlsZHMgQ2xlYXJLZXkgRHJtIFRlc3RzCi0vLwotCi1jY190ZXN0IHsKLSAgICBuYW1lOiAiQ2xlYXJLZXlEcm1Vbml0VGVzdCIsCi0gICAgdmVuZG9yOiB0cnVlLAotCi0gICAgc3JjczogWwotICAgICAgICAiQWVzQ3RyRGVjcnlwdG9yVW5pdHRlc3QuY3BwIiwKLSAgICAgICAgIkluaXREYXRhUGFyc2VyVW5pdHRlc3QuY3BwIiwKLSAgICAgICAgIkpzb25XZWJLZXlVbml0dGVzdC5jcHAiLAotICAgIF0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliY3J5cHRvIiwKLSAgICAgICAgImxpYmRybWNsZWFya2V5cGx1Z2luIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICBdLAotICAgIGhlYWRlcl9saWJzOiBbIm1lZGlhX3BsdWdpbl9oZWFkZXJzIl0sCi19CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL0FuZHJvaWQuYnAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL0FuZHJvaWQuYnAKaW5kZXggYWJkMTg4NC4uZGQyYWQ3YiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9BbmRyb2lkLmJwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svQW5kcm9pZC5icApAQCAtMzIsNSArMzIsNyBAQAogICAgIGNmbGFnczogWwogICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBmbGFnIHRvIGVuYWJsZSB0aGUgZGVjcnlwdGlvbiBwYXNzdGhydSBmbG93CiAgICAgICAgIC8vIi1ERU5BQkxFX1BBU1NUSFJVX0RFQ1JZUFRJT04iLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvT1dORVJTIGIvaW5jbHVkZS9PV05FUlMKaW5kZXggM2NiNmQ5Yy4uZDZiZDk5OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9PV05FUlMKKysrIGIvaW5jbHVkZS9PV05FUlMKQEAgLTEsNSArMSw1IEBACiBlbGF1cmVudEBnb29nbGUuY29tCi1na2FzdGVuQGFuZHJvaWQuY29tCitna2FzdGVuQGdvb2dsZS5jb20KIGh1bmdhQGdvb2dsZS5jb20KIGp0aW5rZXJAZ29vZ2xlLmNvbQogbGFqb3NAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb21tb25fdGltZS9PV05FUlMgYi9pbmNsdWRlL2NvbW1vbl90aW1lL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWNiNTY3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jb21tb25fdGltZS9PV05FUlMKQEAgLTAsMCArMSBAQAorZ2thc3RlbkBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZmQ3NmQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb0NsaWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotI2lmbmRlZiBBTkRST0lEX0FVRElPX0NMSUVOVF9ICi0jZGVmaW5lIEFORFJPSURfQVVESU9fQ0xJRU5UX0gKLQotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgQXVkaW9DbGllbnQgewotIHB1YmxpYzoKLSAgICBBdWRpb0NsaWVudCgpIDoKLSAgICAgICAgY2xpZW50VWlkKC0xKSwgY2xpZW50UGlkKC0xKSwgcGFja2FnZU5hbWUoIiIpIHt9Ci0KLSAgICB1aWRfdCBjbGllbnRVaWQ7Ci0gICAgcGlkX3QgY2xpZW50UGlkOwotICAgIFN0cmluZzE2IHBhY2thZ2VOYW1lOwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBBTkRST0lEX0FVRElPX0NMSUVOVF9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYTA1MzBlNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9DbGllbnQuaApAQCAtMCwwICsxIEBACisuLi8uLi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1ByZXNlbnRhdGlvbkluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTFhOTkyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1ByZXNlbnRhdGlvbkluZm8uaApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBVURJT19QUkVTRU5UQVRJT05fSU5GT19IXworI2RlZmluZSBBVURJT19QUkVTRU5UQVRJT05fSU5GT19IXworCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIG1hc3RlcmluZ19pbmRpY2F0aW9uIHsKKyAgICBNQVNURVJJTkdfTk9UX0lORElDQVRFRCwKKyAgICBNQVNURVJFRF9GT1JfU1RFUkVPLAorICAgIE1BU1RFUkVEX0ZPUl9TVVJST1VORCwKKyAgICBNQVNURVJFRF9GT1JfM0QsCisgICAgTUFTVEVSRURfRk9SX0hFQURQSE9ORSwKK307CisKK3N0cnVjdCBBdWRpb1ByZXNlbnRhdGlvbiA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBpbnQzMl90IG1QcmVzZW50YXRpb25JZDsKKyAgICBpbnQzMl90IG1Qcm9ncmFtSWQ7CisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUxhYmVsczsKKyAgICBTdHJpbmc4IG1MYW5ndWFnZTsKKyAgICBpbnQzMl90IG1NYXN0ZXJpbmdJbmRpY2F0aW9uOworICAgIGJvb2wgbUF1ZGlvRGVzY3JpcHRpb25BdmFpbGFibGU7CisgICAgYm9vbCBtU3Bva2VuU3VidGl0bGVzQXZhaWxhYmxlOworICAgIGJvb2wgbURpYWxvZ3VlRW5oYW5jZW1lbnRBdmFpbGFibGU7CisKKyAgICBBdWRpb1ByZXNlbnRhdGlvbigpIHsKKyAgICAgICAgbVByZXNlbnRhdGlvbklkID0gLTE7CisgICAgICAgIG1Qcm9ncmFtSWQgPSAtMTsKKyAgICAgICAgbUxhbmd1YWdlID0gIiI7CisgICAgICAgIG1NYXN0ZXJpbmdJbmRpY2F0aW9uID0gTUFTVEVSSU5HX05PVF9JTkRJQ0FURUQ7CisgICAgICAgIG1BdWRpb0Rlc2NyaXB0aW9uQXZhaWxhYmxlID0gZmFsc2U7CisgICAgICAgIG1TcG9rZW5TdWJ0aXRsZXNBdmFpbGFibGUgPSBmYWxzZTsKKyAgICAgICAgbURpYWxvZ3VlRW5oYW5jZW1lbnRBdmFpbGFibGUgPSBmYWxzZTsKKyAgICB9Cit9OworCit0eXBlZGVmIFZlY3RvcjxzcDxBdWRpb1ByZXNlbnRhdGlvbj4+IEF1ZGlvUHJlc2VudGF0aW9uczsKKworY2xhc3MgQXVkaW9QcmVzZW50YXRpb25JbmZvIDogcHVibGljIFJlZkJhc2UgeworIHB1YmxpYzoKKyAgICBBdWRpb1ByZXNlbnRhdGlvbkluZm8oKTsKKworICAgIH5BdWRpb1ByZXNlbnRhdGlvbkluZm8oKTsKKworICAgIHZvaWQgYWRkUHJlc2VudGF0aW9uKHNwPEF1ZGlvUHJlc2VudGF0aW9uPiBwcmVzZW50YXRpb24pOworCisgICAgc2l6ZV90IGNvdW50UHJlc2VudGF0aW9ucygpIGNvbnN0OworCisgICAgY29uc3Qgc3A8QXVkaW9QcmVzZW50YXRpb24+IGdldFByZXNlbnRhdGlvbihzaXplX3QgaW5kZXgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgICBBdWRpb1ByZXNlbnRhdGlvbnMgbVByZXNlbnRhdGlvbnM7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFVRElPX1BSRVNFTlRBVElPTl9JTkZPX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0NvdW50ZXJNZXRyaWMuaCBiL2luY2x1ZGUvbWVkaWEvQ291bnRlck1ldHJpYy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmJhYmEwNDMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0NvdW50ZXJNZXRyaWMuaApAQCAtMCwwICsxIEBACisuLi8uLi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0NvdW50ZXJNZXRyaWMuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uOTA1YmVjMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZS5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlQmFzZS5oIGIvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjU0YzgwNDcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VCYXNlLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlQmFzZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9FdmVudE1ldHJpYy5oIGIvaW5jbHVkZS9tZWRpYS9FdmVudE1ldHJpYy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjU3MDdkOWEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0V2ZW50TWV0cmljLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9FdmVudE1ldHJpYy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9FeHRyYWN0b3JVdGlscy5oIGIvaW5jbHVkZS9tZWRpYS9FeHRyYWN0b3JVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmUyZGQwODIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0V4dHJhY3RvclV0aWxzLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9FeHRyYWN0b3JVdGlscy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9SZWNvcmQuaCBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUmVjb3JkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDdmYmY4ZjIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9SZWNvcmQuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUmVjb3JkLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lIRENQLmggYi9pbmNsdWRlL21lZGlhL0lIRENQLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDlkNDU2OGUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9JSERDUC5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JSERDUC5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFDb2RlY1NlcnZpY2UuaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhQ29kZWNTZXJ2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDM3ZjY4MjIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFDb2RlY1NlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhQ29kZWNTZXJ2aWNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhRGVmcy5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYURlZnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggOTg1MDYwMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhRGVmcy5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYURlZnMuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi40YjM1ZmUxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3Rvci5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4yZTE0N2M0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVNvdXJjZS5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFTb3VyY2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNWE2MzI4N2EKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaApAQCAtMCwwICsxIEBACisuLi8uLi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWljcm9waG9uZUluZm8uaCBiL2luY2x1ZGUvbWVkaWEvTWljcm9waG9uZUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjg3YWNhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9NaWNyb3Bob25lSW5mby5oCkBAIC0wLDAgKzEsMjQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01JQ1JPUEhPTkVfSU5GT19ICisjZGVmaW5lIEFORFJPSURfTUlDUk9QSE9ORV9JTkZPX0gKKworI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CisKKyNkZWZpbmUgUkVUVVJOX0lGX0ZBSUxFRChjYWxsZWRPbmNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGF0dXNfdCByZXR1cm5TdGF0dXMgPSBjYWxsZWRPbmNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHJldHVyblN0YXR1cykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIGF0ICVzOiVkICglcykiLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsgXAorICAgICAgICAgICAgcmV0dXJuIHJldHVyblN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCitjbGFzcyBNaWNyb3Bob25lSW5mbyA6IHB1YmxpYyBQYXJjZWxhYmxlIHsKK3B1YmxpYzoKKyAgICBNaWNyb3Bob25lSW5mbygpID0gZGVmYXVsdDsKKyAgICBNaWNyb3Bob25lSW5mbyhjb25zdCBNaWNyb3Bob25lSW5mbyYgbWljcm9waG9uZUluZm8pID0gZGVmYXVsdDsKKyAgICBNaWNyb3Bob25lSW5mbyhhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QmIGNoYXJhY3RlcmlzdGljKSB7CisgICAgICAgIG1EZXZpY2VJZCA9IFN0cmluZzE2KCZjaGFyYWN0ZXJpc3RpYy5kZXZpY2VfaWRbMF0pOworICAgICAgICBtUG9ydElkID0gY2hhcmFjdGVyaXN0aWMuaWQ7CisgICAgICAgIG1UeXBlID0gY2hhcmFjdGVyaXN0aWMuZGV2aWNlOworICAgICAgICBtQWRkcmVzcyA9IFN0cmluZzE2KCZjaGFyYWN0ZXJpc3RpYy5hZGRyZXNzWzBdKTsKKyAgICAgICAgbURldmljZUxvY2F0aW9uID0gY2hhcmFjdGVyaXN0aWMubG9jYXRpb247CisgICAgICAgIG1EZXZpY2VHcm91cCA9IGNoYXJhY3RlcmlzdGljLmdyb3VwOworICAgICAgICBtSW5kZXhJblRoZUdyb3VwID0gY2hhcmFjdGVyaXN0aWMuaW5kZXhfaW5fdGhlX2dyb3VwOworICAgICAgICBtR2VvbWV0cmljTG9jYXRpb24ucHVzaF9iYWNrKGNoYXJhY3RlcmlzdGljLmdlb21ldHJpY19sb2NhdGlvbi54KTsKKyAgICAgICAgbUdlb21ldHJpY0xvY2F0aW9uLnB1c2hfYmFjayhjaGFyYWN0ZXJpc3RpYy5nZW9tZXRyaWNfbG9jYXRpb24ueSk7CisgICAgICAgIG1HZW9tZXRyaWNMb2NhdGlvbi5wdXNoX2JhY2soY2hhcmFjdGVyaXN0aWMuZ2VvbWV0cmljX2xvY2F0aW9uLnopOworICAgICAgICBtT3JpZW50YXRpb24ucHVzaF9iYWNrKGNoYXJhY3RlcmlzdGljLm9yaWVudGF0aW9uLngpOworICAgICAgICBtT3JpZW50YXRpb24ucHVzaF9iYWNrKGNoYXJhY3RlcmlzdGljLm9yaWVudGF0aW9uLnkpOworICAgICAgICBtT3JpZW50YXRpb24ucHVzaF9iYWNrKGNoYXJhY3RlcmlzdGljLm9yaWVudGF0aW9uLnopOworICAgICAgICBWZWN0b3I8ZmxvYXQ+IGZyZXF1ZW5jaWVzOworICAgICAgICBWZWN0b3I8ZmxvYXQ+IHJlc3BvbnNlczsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjaGFyYWN0ZXJpc3RpYy5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlczsgaSsrKSB7CisgICAgICAgICAgICBmcmVxdWVuY2llcy5wdXNoX2JhY2soY2hhcmFjdGVyaXN0aWMuZnJlcXVlbmN5X3Jlc3BvbnNlc1swXVtpXSk7CisgICAgICAgICAgICByZXNwb25zZXMucHVzaF9iYWNrKGNoYXJhY3RlcmlzdGljLmZyZXF1ZW5jeV9yZXNwb25zZXNbMV1baV0pOworICAgICAgICB9CisgICAgICAgIG1GcmVxdWVuY3lSZXNwb25zZXMucHVzaF9iYWNrKGZyZXF1ZW5jaWVzKTsKKyAgICAgICAgbUZyZXF1ZW5jeVJlc3BvbnNlcy5wdXNoX2JhY2socmVzcG9uc2VzKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBVURJT19DSEFOTkVMX0NPVU5UX01BWDsgaSsrKSB7CisgICAgICAgICAgICBtQ2hhbm5lbE1hcHBpbmcucHVzaF9iYWNrKGNoYXJhY3RlcmlzdGljLmNoYW5uZWxfbWFwcGluZ1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgbVNlbnNpdGl2aXR5ID0gY2hhcmFjdGVyaXN0aWMuc2Vuc2l0aXZpdHk7CisgICAgICAgIG1NYXhTcGwgPSBjaGFyYWN0ZXJpc3RpYy5tYXhfc3BsOworICAgICAgICBtTWluU3BsID0gY2hhcmFjdGVyaXN0aWMubWluX3NwbDsKKyAgICAgICAgbURpcmVjdGlvbmFsaXR5ID0gY2hhcmFjdGVyaXN0aWMuZGlyZWN0aW9uYWxpdHk7CisgICAgfQorCisgICAgdmlydHVhbCB+TWljcm9waG9uZUluZm8oKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKKyAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPndyaXRlU3RyaW5nMTYobURldmljZUlkKSk7CisgICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT53cml0ZUludDMyKG1Qb3J0SWQpKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPndyaXRlVWludDMyKG1UeXBlKSk7CisgICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT53cml0ZVN0cmluZzE2KG1BZGRyZXNzKSk7CisgICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT53cml0ZUludDMyKG1EZXZpY2VMb2NhdGlvbikpOworICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHBhcmNlbC0+d3JpdGVJbnQzMihtRGV2aWNlR3JvdXApKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPndyaXRlSW50MzIobUluZGV4SW5UaGVHcm91cCkpOworICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHdyaXRlRmxvYXRWZWN0b3IocGFyY2VsLCBtR2VvbWV0cmljTG9jYXRpb24pKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRCh3cml0ZUZsb2F0VmVjdG9yKHBhcmNlbCwgbU9yaWVudGF0aW9uKSk7CisgICAgICAgIGlmIChtRnJlcXVlbmN5UmVzcG9uc2VzLnNpemUoKSAhPSAyKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZyZXF1ZW5jeVJlc3BvbnNlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPndyaXRlSW50MzIobUZyZXF1ZW5jeVJlc3BvbnNlc1tpXS5zaXplKCkpKTsKKyAgICAgICAgICAgIFJFVFVSTl9JRl9GQUlMRUQod3JpdGVGbG9hdFZlY3RvcihwYXJjZWwsIG1GcmVxdWVuY3lSZXNwb25zZXNbaV0pKTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IGNoYW5uZWxNYXBwaW5nOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFwcGluZy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgY2hhbm5lbE1hcHBpbmcucHVzaF9iYWNrKG1DaGFubmVsTWFwcGluZ1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPndyaXRlSW50MzJWZWN0b3IoY2hhbm5lbE1hcHBpbmcpKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPndyaXRlRmxvYXQobVNlbnNpdGl2aXR5KSk7CisgICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT53cml0ZUZsb2F0KG1NYXhTcGwpKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPndyaXRlRmxvYXQobU1pblNwbCkpOworICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHBhcmNlbC0+d3JpdGVJbnQzMihtRGlyZWN0aW9uYWxpdHkpKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIHsKKyAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPnJlYWRTdHJpbmcxNigmbURldmljZUlkKSk7CisgICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT5yZWFkSW50MzIoJm1Qb3J0SWQpKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPnJlYWRVaW50MzIoJm1UeXBlKSk7CisgICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT5yZWFkU3RyaW5nMTYoJm1BZGRyZXNzKSk7CisgICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT5yZWFkSW50MzIoJm1EZXZpY2VMb2NhdGlvbikpOworICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHBhcmNlbC0+cmVhZEludDMyKCZtRGV2aWNlR3JvdXApKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPnJlYWRJbnQzMigmbUluZGV4SW5UaGVHcm91cCkpOworICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHJlYWRGbG9hdFZlY3RvcihwYXJjZWwsICZtR2VvbWV0cmljTG9jYXRpb24sIDMpKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChyZWFkRmxvYXRWZWN0b3IocGFyY2VsLCAmbU9yaWVudGF0aW9uLCAzKSk7CisgICAgICAgIGludDMyX3QgZnJlcXVlbmNpZXNOdW07CisgICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT5yZWFkSW50MzIoJmZyZXF1ZW5jaWVzTnVtKSk7CisgICAgICAgIFZlY3RvcjxmbG9hdD4gZnJlcXVlbmNpZXM7CisgICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocmVhZEZsb2F0VmVjdG9yKHBhcmNlbCwgJmZyZXF1ZW5jaWVzLCBmcmVxdWVuY2llc051bSkpOworICAgICAgICBpbnQzMl90IHJlc3BvbnNlc051bTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPnJlYWRJbnQzMigmcmVzcG9uc2VzTnVtKSk7CisgICAgICAgIFZlY3RvcjxmbG9hdD4gcmVzcG9uc2VzOworICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHJlYWRGbG9hdFZlY3RvcihwYXJjZWwsICZyZXNwb25zZXMsIHJlc3BvbnNlc051bSkpOworICAgICAgICBpZiAoZnJlcXVlbmNpZXMuc2l6ZSgpICE9IHJlc3BvbnNlcy5zaXplKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgbUZyZXF1ZW5jeVJlc3BvbnNlcy5wdXNoX2JhY2soZnJlcXVlbmNpZXMpOworICAgICAgICBtRnJlcXVlbmN5UmVzcG9uc2VzLnB1c2hfYmFjayhyZXNwb25zZXMpOworICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IGNoYW5uZWxNYXBwaW5nOworICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBwYXJjZWwtPnJlYWRJbnQzMlZlY3RvcigmY2hhbm5lbE1hcHBpbmcpOworICAgICAgICBpZiAocmVzdWx0ICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChjaGFubmVsTWFwcGluZy5zaXplKCkgIT0gQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVgpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjaGFubmVsTWFwcGluZy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgbUNoYW5uZWxNYXBwaW5nLnB1c2hfYmFjayhjaGFubmVsTWFwcGluZ1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPnJlYWRGbG9hdCgmbVNlbnNpdGl2aXR5KSk7CisgICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT5yZWFkRmxvYXQoJm1NYXhTcGwpKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPnJlYWRGbG9hdCgmbU1pblNwbCkpOworICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHBhcmNlbC0+cmVhZEludDMyKCZtRGlyZWN0aW9uYWxpdHkpKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIFN0cmluZzE2IGdldERldmljZUlkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURldmljZUlkOworICAgIH0KKworICAgIGludCBnZXRQb3J0SWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUG9ydElkOworICAgIH0KKworICAgIHVuc2lnbmVkIGludCBnZXRUeXBlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVR5cGU7CisgICAgfQorCisgICAgU3RyaW5nMTYgZ2V0QWRkcmVzcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BZGRyZXNzOworICAgIH0KKworICAgIGludCBnZXREZXZpY2VMb2NhdGlvbigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EZXZpY2VMb2NhdGlvbjsKKyAgICB9CisKKyAgICBpbnQgZ2V0RGV2aWNlR3JvdXAoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRGV2aWNlR3JvdXA7CisgICAgfQorCisgICAgaW50IGdldEluZGV4SW5UaGVHcm91cCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1JbmRleEluVGhlR3JvdXA7CisgICAgfQorCisgICAgY29uc3QgVmVjdG9yPGZsb2F0PiYgZ2V0R2VvbWV0cmljTG9jYXRpb24oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtR2VvbWV0cmljTG9jYXRpb247CisgICAgfQorCisgICAgY29uc3QgVmVjdG9yPGZsb2F0PiYgZ2V0T3JpZW50YXRpb24oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtT3JpZW50YXRpb247CisgICAgfQorCisgICAgY29uc3QgVmVjdG9yPFZlY3RvcjxmbG9hdD4+JiBnZXRGcmVxdWVuY3lSZXNwb25zZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRnJlcXVlbmN5UmVzcG9uc2VzOworICAgIH0KKworICAgIGNvbnN0IFZlY3RvcjxpbnQ+JiBnZXRDaGFubmVsTWFwcGluZygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DaGFubmVsTWFwcGluZzsKKyAgICB9CisKKyAgICBmbG9hdCBnZXRTZW5zaXRpdml0eSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TZW5zaXRpdml0eTsKKyAgICB9CisKKyAgICBmbG9hdCBnZXRNYXhTcGwoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTWF4U3BsOworICAgIH0KKworICAgIGZsb2F0IGdldE1pblNwbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1NaW5TcGw7CisgICAgfQorCisgICAgaW50IGdldERpcmVjdGlvbmFsaXR5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURpcmVjdGlvbmFsaXR5OworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGF0dXNfdCByZWFkRmxvYXRWZWN0b3IoCisgICAgICAgICAgICBjb25zdCBQYXJjZWwqIHBhcmNlbCwgVmVjdG9yPGZsb2F0PiAqdmVjdG9yUHRyLCBzaXplX3QgZGVmYXVsdExlbmd0aCkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp2ZWN0b3I8ZmxvYXQ+PiB2OworICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBwYXJjZWwtPnJlYWRGbG9hdFZlY3Rvcigmdik7CisgICAgICAgIGlmIChyZXN1bHQgIT0gT0spIHJldHVybiByZXN1bHQ7CisgICAgICAgIHZlY3RvclB0ci0+Y2xlYXIoKTsKKyAgICAgICAgaWYgKHYuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpdGVyIDogKnYpIHsKKyAgICAgICAgICAgICAgICB2ZWN0b3JQdHItPnB1c2hfYmFjayhpdGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZlY3RvclB0ci0+cmVzaXplKGRlZmF1bHRMZW5ndGgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgc3RhdHVzX3Qgd3JpdGVGbG9hdFZlY3RvcihQYXJjZWwqIHBhcmNlbCwgY29uc3QgVmVjdG9yPGZsb2F0PiYgdmVjdG9yKSBjb25zdCB7CisgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiB2OworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZlY3Rvci5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgdi5wdXNoX2JhY2sodmVjdG9yW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFyY2VsLT53cml0ZUZsb2F0VmVjdG9yKHYpOworICAgIH0KKworICAgIFN0cmluZzE2IG1EZXZpY2VJZDsKKyAgICBpbnQzMl90IG1Qb3J0SWQ7CisgICAgdWludDMyX3QgbVR5cGU7CisgICAgU3RyaW5nMTYgbUFkZHJlc3M7CisgICAgaW50MzJfdCBtRGV2aWNlTG9jYXRpb247CisgICAgaW50MzJfdCBtRGV2aWNlR3JvdXA7CisgICAgaW50MzJfdCBtSW5kZXhJblRoZUdyb3VwOworICAgIFZlY3RvcjxmbG9hdD4gbUdlb21ldHJpY0xvY2F0aW9uOworICAgIFZlY3RvcjxmbG9hdD4gbU9yaWVudGF0aW9uOworICAgIFZlY3RvcjxWZWN0b3I8ZmxvYXQ+PiBtRnJlcXVlbmN5UmVzcG9uc2VzOworICAgIFZlY3RvcjxpbnQ+IG1DaGFubmVsTWFwcGluZzsKKyAgICBmbG9hdCBtU2Vuc2l0aXZpdHk7CisgICAgZmxvYXQgbU1heFNwbDsKKyAgICBmbG9hdCBtTWluU3BsOworICAgIGludDMyX3QgbURpcmVjdGlvbmFsaXR5OworfTsKKworfSAvLyBuYW1lc3BhY2UgbWVkaWEKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01tYXBTdHJlYW1DYWxsYmFjay5oIGIvaW5jbHVkZS9tZWRpYS9NbWFwU3RyZWFtQ2FsbGJhY2suaAppbmRleCA4MDk4ZTc5Li4zMWI4ZWI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL01tYXBTdHJlYW1DYWxsYmFjay5oCisrKyBiL2luY2x1ZGUvbWVkaWEvTW1hcFN0cmVhbUNhbGxiYWNrLmgKQEAgLTMxLDggKzMxLDkgQEAKICAgICAgKiBUaGUgbW1hcCBzdHJlYW0gc2hvdWxkIGJlIHRvcm4gZG93biBiZWNhdXNlIGNvbmRpdGlvbnMgdGhhdCBwZXJtaXR0ZWQgaXRzIGNyZWF0aW9uIHdpdGgKICAgICAgKiB0aGUgcmVxdWVzdGVkIHBhcmFtZXRlcnMgaGF2ZSBjaGFuZ2VkIGFuZCBkbyBub3QgYWxsb3cgaXQgdG8gb3BlcmF0ZSB3aXRoIHRoZSByZXF1ZXN0ZWQKICAgICAgKiBjb25zdHJhaW50cyBhbnkgbW9yZS4KKyAgICAgKiBccGFyYW1baW5dIGhhbmRsZSBoYW5kbGUgZm9yIHRoZSBjbGllbnQgc3RyZWFtIHRvIHRlYXIgZG93bi4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHZvaWQgb25UZWFyRG93bigpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgb25UZWFyRG93bihhdWRpb19wb3J0X2hhbmRsZV90IGhhbmRsZSkgPSAwOwogCiAgICAgLyoqCiAgICAgICogVGhlIHZvbHVtZSB0byBiZSBhcHBsaWVkIHRvIHRoZSB1c2UgY2FzZSBzcGVjaWZpZWQgd2hlbiBvcGVuaW5nIHRoZSBzdHJlYW0gaGFzIGNoYW5nZWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTW1hcFN0cmVhbUludGVyZmFjZS5oIGIvaW5jbHVkZS9tZWRpYS9NbWFwU3RyZWFtSW50ZXJmYWNlLmgKaW5kZXggZDY4OWUyNS4uMDE5NmEwYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9NbWFwU3RyZWFtSW50ZXJmYWNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NbWFwU3RyZWFtSW50ZXJmYWNlLmgKQEAgLTUyLDYgKzUyLDkgQEAKICAgICAgKiBccGFyYW1baW4sb3V0XSBkZXZpY2VJZCBhdWRpbyBkZXZpY2UgdGhlIHN0cmVhbSBzaG91bGQgcHJlZmVyYWJseSBiZSByb3V0ZWQgdG8vZnJvbQogICAgICAqICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0ZWQgYXMgaW5wdXQsCiAgICAgICogICAgICAgICAgICAgICAgICAgICAgIEFjdHVhbCBhcyBvdXRwdXQKKyAgICAgKiBccGFyYW1baW4sb3V0XSBzZXNzaW9uSWQgYXVkaW8gc2Vzc2lvbklkIGZvciB0aGUgc3RyZWFtCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RlZCBhcyBpbnB1dCwgbWF5IGJlIEFVRElPX1NFU1NJT05fQUxMT0NBVEUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgQWN0dWFsIGFzIG91dHB1dAogICAgICAqIFxwYXJhbVtpbl0gY2FsbGJhY2sgdGhlIE1tYXBTdHJlYW1DYWxsYmFjayBpbnRlcmZhY2UgdXNlZCBieSBBdWRpb0ZsaW5nZXIgdG8gbm90aWZ5CiAgICAgICogICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24gY2hhbmdlcyBhZmZlY3RpbmcgdGhlIHN0cmVhbSBvcGVyYXRpb24KICAgICAgKiBccGFyYW1bb3V0XSBpbnRlcmZhY2UgdGhlIE1tYXBTdHJlYW1JbnRlcmZhY2UgaW50ZXJmYWNlIGNvbnRyb2xsaW5nIHRoZSBjcmVhdGVkIHN0cmVhbQpAQCAtNjYsNiArNjksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0NsaWVudCYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmRldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPE1tYXBTdHJlYW1DYWxsYmFjaz4mIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPE1tYXBTdHJlYW1JbnRlcmZhY2U+JiBpbnRlcmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqaGFuZGxlKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvVGltZUNoZWNrLmggYi9pbmNsdWRlL21lZGlhL1RpbWVDaGVjay5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmUzZWYxMzQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL1RpbWVDaGVjay5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVGltZUNoZWNrLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL1ZvbHVtZVNoYXBlci5oIGIvaW5jbHVkZS9tZWRpYS9Wb2x1bWVTaGFwZXIuaAppbmRleCAzMDI2NDFmLi5hM2FhZWNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL1ZvbHVtZVNoYXBlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvVm9sdW1lU2hhcGVyLmgKQEAgLTM3LDYgKzM3LDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCituYW1lc3BhY2UgbWVkaWEgeworCiAvLyBUaGUgbmF0aXZlIFZvbHVtZVNoYXBlciBjbGFzcyBtaXJyb3JzIHRoZSBqYXZhIFZvbHVtZVNoYXBlciBjbGFzczsKIC8vIGluIGFkZGl0aW9uLCB0aGUgbmF0aXZlIGNsYXNzIGNvbnRhaW5zIGltcGxlbWVudGF0aW9uIGZvciBhY3R1YWwgb3BlcmF0aW9uLgogLy8KQEAgLTEwMSw3ICsxMDMsNyBAQAogICAgICAqIFNlZSAiZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIuamF2YSIgZm9yCiAgICAgICogZGV0YWlscyBvbiB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbi4KICAgICAgKi8KLSAgICBjbGFzcyBDb25maWd1cmF0aW9uIDogcHVibGljIEludGVycG9sYXRvcjxTLCBUPiwgcHVibGljIFJlZkJhc2UgeworICAgIGNsYXNzIENvbmZpZ3VyYXRpb24gOiBwdWJsaWMgSW50ZXJwb2xhdG9yPFMsIFQ+LCBwdWJsaWMgUmVmQmFzZSwgcHVibGljIFBhcmNlbGFibGUgewogICAgIHB1YmxpYzoKICAgICAgICAgLy8gTXVzdCBtYXRjaCB3aXRoIFZvbHVtZVNoYXBlci5qYXZhIGluIGZyYW1ld29ya3MvYmFzZS4KICAgICAgICAgZW51bSBUeXBlIDogaW50MzJfdCB7CkBAIC0yODMsNyArMjg1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIFRoZSBwYXJjZWwgbGF5b3V0IG11c3QgbWF0Y2ggVm9sdW1lU2hhcGVyLmphdmEKLSAgICAgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QgeworICAgICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICAgICAgICBpZiAocGFyY2VsID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICByZXR1cm4gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KW1UeXBlKQogICAgICAgICAgICAgICAgICAgICA/OiBwYXJjZWwtPndyaXRlSW50MzIobUlkKQpAQCAtMjk0LDE3ICsyOTYsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/OiBJbnRlcnBvbGF0b3I8UywgVD46OndyaXRlVG9QYXJjZWwocGFyY2VsKTsKICAgICAgICAgfQogCi0gICAgICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKSB7CisgICAgICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKSBvdmVycmlkZSB7CiAgICAgICAgICAgICBpbnQzMl90IHR5cGUsIG9wdGlvbkZsYWdzOwotICAgICAgICAgICAgcmV0dXJuIHBhcmNlbC5yZWFkSW50MzIoJnR5cGUpCisgICAgICAgICAgICByZXR1cm4gcGFyY2VsLT5yZWFkSW50MzIoJnR5cGUpCiAgICAgICAgICAgICAgICAgICAgID86IHNldFR5cGUoKFR5cGUpdHlwZSkKLSAgICAgICAgICAgICAgICAgICAgPzogcGFyY2VsLnJlYWRJbnQzMigmbUlkKQorICAgICAgICAgICAgICAgICAgICA/OiBwYXJjZWwtPnJlYWRJbnQzMigmbUlkKQogICAgICAgICAgICAgICAgICAgICA/OiBtVHlwZSA9PSBUWVBFX0lECiAgICAgICAgICAgICAgICAgICAgICAgICA/IE5PX0VSUk9SCi0gICAgICAgICAgICAgICAgICAgICAgICA6IHBhcmNlbC5yZWFkSW50MzIoJm9wdGlvbkZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBwYXJjZWwtPnJlYWRJbnQzMigmb3B0aW9uRmxhZ3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPzogc2V0T3B0aW9uRmxhZ3MoKE9wdGlvbkZsYWcpb3B0aW9uRmxhZ3MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPzogcGFyY2VsLnJlYWREb3VibGUoJm1EdXJhdGlvbk1zKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID86IEludGVycG9sYXRvcjxTLCBUPjo6cmVhZEZyb21QYXJjZWwocGFyY2VsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID86IHBhcmNlbC0+cmVhZERvdWJsZSgmbUR1cmF0aW9uTXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPzogSW50ZXJwb2xhdG9yPFMsIFQ+OjpyZWFkRnJvbVBhcmNlbCgqcGFyY2VsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgID86IGNoZWNrQ3VydmUoKTsKICAgICAgICAgfQogCkBAIC0zMzYsNyArMzM4LDcgQEAKICAgICAgKiBTZWUgImZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyLmphdmEiIGZvcgogICAgICAqIGRldGFpbHMgb24gdGhlIEphdmEgaW1wbGVtZW50YXRpb24uCiAgICAgICovCi0gICAgY2xhc3MgT3BlcmF0aW9uIDogcHVibGljIFJlZkJhc2UgeworICAgIGNsYXNzIE9wZXJhdGlvbiA6IHB1YmxpYyBSZWZCYXNlLCBwdWJsaWMgUGFyY2VsYWJsZSB7CiAgICAgcHVibGljOgogICAgICAgICAvLyBNdXN0IG1hdGNoIHdpdGggVm9sdW1lU2hhcGVyLmphdmEuCiAgICAgICAgIGVudW0gRmxhZyA6IGludDMyX3QgewpAQCAtNDE4LDE4ICs0MjAsMTggQEAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogCi0gICAgICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IHsKKyAgICAgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgICAgICAgaWYgKHBhcmNlbCA9PSBudWxscHRyKSByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgcmV0dXJuIHBhcmNlbC0+d3JpdGVJbnQzMigoaW50MzJfdCltRmxhZ3MpCiAgICAgICAgICAgICAgICAgICAgID86IHBhcmNlbC0+d3JpdGVJbnQzMihtUmVwbGFjZUlkKQogICAgICAgICAgICAgICAgICAgICA/OiBwYXJjZWwtPndyaXRlRmxvYXQobVhPZmZzZXQpOwogICAgICAgICB9CiAKLSAgICAgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpIHsKKyAgICAgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpIG92ZXJyaWRlIHsKICAgICAgICAgICAgIGludDMyX3QgZmxhZ3M7Ci0gICAgICAgICAgICByZXR1cm4gcGFyY2VsLnJlYWRJbnQzMigmZmxhZ3MpCi0gICAgICAgICAgICAgICAgICAgID86IHBhcmNlbC5yZWFkSW50MzIoJm1SZXBsYWNlSWQpCi0gICAgICAgICAgICAgICAgICAgID86IHBhcmNlbC5yZWFkRmxvYXQoJm1YT2Zmc2V0KQorICAgICAgICAgICAgcmV0dXJuIHBhcmNlbC0+cmVhZEludDMyKCZmbGFncykKKyAgICAgICAgICAgICAgICAgICAgPzogcGFyY2VsLT5yZWFkSW50MzIoJm1SZXBsYWNlSWQpCisgICAgICAgICAgICAgICAgICAgID86IHBhcmNlbC0+cmVhZEZsb2F0KCZtWE9mZnNldCkKICAgICAgICAgICAgICAgICAgICAgPzogc2V0RmxhZ3MoKEZsYWcpZmxhZ3MpOwogICAgICAgICB9CiAKQEAgLTQ1NSw3ICs0NTcsNyBAQAogICAgICAqIFNlZSAiZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIuamF2YSIgZm9yCiAgICAgICogZGV0YWlscyBvbiB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbi4KICAgICAgKi8KLSAgICBjbGFzcyBTdGF0ZSA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBjbGFzcyBTdGF0ZSA6IHB1YmxpYyBSZWZCYXNlLCBwdWJsaWMgUGFyY2VsYWJsZSB7CiAgICAgcHVibGljOgogICAgICAgICBTdGF0ZShUIHZvbHVtZSwgUyB4T2Zmc2V0KQogICAgICAgICAgICAgOiBtVm9sdW1lKHZvbHVtZSkKQEAgLTQ4MSwxNSArNDgzLDE1IEBACiAgICAgICAgICAgICBtWE9mZnNldCA9IHhPZmZzZXQ7CiAgICAgICAgIH0KIAotICAgICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCB7CisgICAgICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgICAgICAgIGlmIChwYXJjZWwgPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIHJldHVybiBwYXJjZWwtPndyaXRlRmxvYXQobVZvbHVtZSkKICAgICAgICAgICAgICAgICAgICAgPzogcGFyY2VsLT53cml0ZUZsb2F0KG1YT2Zmc2V0KTsKICAgICAgICAgfQogCi0gICAgICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyY2VsLnJlYWRGbG9hdCgmbVZvbHVtZSkKLSAgICAgICAgICAgICAgICAgICAgID86IHBhcmNlbC5yZWFkRmxvYXQoJm1YT2Zmc2V0KTsKKyAgICAgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJjZWwtPnJlYWRGbG9hdCgmbVZvbHVtZSkKKyAgICAgICAgICAgICAgICAgICAgID86IHBhcmNlbC0+cmVhZEZsb2F0KCZtWE9mZnNldCk7CiAgICAgICAgIH0KIAogICAgICAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKQEAgLTEwMjAsNiArMTAyMiw4IEBACiAgICAgc3RkOjpsaXN0PFZvbHVtZVNoYXBlcj4gbVZvbHVtZVNoYXBlcnM7IC8vIGxpc3QgcHJvdmlkZXMgc3RhYmxlIGl0ZXJhdG9ycyBvbiBlcmFzZQogfTsgLy8gVm9sdW1lSGFuZGxlcgogCit9IC8vIG5hbWVzcGFjZSBtZWRpYQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNwcmFnbWEgcG9wX21hY3JvKCJMT0dfVEFHIikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oIGIvaW5jbHVkZS9tZWRpYS9Wb3JiaXNDb21tZW50LmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYWRhYTQ4OQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkxvZy5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkxvZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCBjMzU0MDFlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGVyZm9ybWFuY2VBbmFseXNpcy5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDdhY2ZjOTAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9uYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJsb2cvTkJMb2cuaCBiL2luY2x1ZGUvbWVkaWEvbmJsb2cvTkJMb2cuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4zY2MzNjZjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmxvZy9OQkxvZy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvTkJMb2cuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oIGIvaW5jbHVkZS9tZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNmVhZDNiYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oIGIvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmU5YjhlODAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9DcnlwdG8uaCBiL2luY2x1ZGUvbWVkaWFkcm0vQ3J5cHRvLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvbWVkaWEvQ3J5cHRvLmgKcmVuYW1lIHRvIGluY2x1ZGUvbWVkaWFkcm0vQ3J5cHRvLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQ3J5cHRvSGFsLmggYi9pbmNsdWRlL21lZGlhZHJtL0NyeXB0b0hhbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL21lZGlhL0NyeXB0b0hhbC5oCnJlbmFtZSB0byBpbmNsdWRlL21lZGlhZHJtL0NyeXB0b0hhbC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0RybS5oIGIvaW5jbHVkZS9tZWRpYWRybS9Ecm0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9tZWRpYS9Ecm0uaApyZW5hbWUgdG8gaW5jbHVkZS9tZWRpYWRybS9Ecm0uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9Ecm1IYWwuaCBiL2luY2x1ZGUvbWVkaWFkcm0vRHJtSGFsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvbWVkaWEvRHJtSGFsLmgKcmVuYW1lIHRvIGluY2x1ZGUvbWVkaWFkcm0vRHJtSGFsLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWFkcm0vRHJtTWV0cmljcy5oIGIvaW5jbHVkZS9tZWRpYWRybS9Ecm1NZXRyaWNzLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYWJjOTY2YgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWFkcm0vRHJtTWV0cmljcy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtTWV0cmljcy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9Ecm1QbHVnaW5QYXRoLmggYi9pbmNsdWRlL21lZGlhZHJtL0RybVBsdWdpblBhdGguaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9tZWRpYS9Ecm1QbHVnaW5QYXRoLmgKcmVuYW1lIHRvIGluY2x1ZGUvbWVkaWFkcm0vRHJtUGx1Z2luUGF0aC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0RybVNlc3Npb25DbGllbnRJbnRlcmZhY2UuaCBiL2luY2x1ZGUvbWVkaWFkcm0vRHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL21lZGlhL0RybVNlc3Npb25DbGllbnRJbnRlcmZhY2UuaApyZW5hbWUgdG8gaW5jbHVkZS9tZWRpYWRybS9Ecm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvRHJtU2Vzc2lvbk1hbmFnZXIuaCBiL2luY2x1ZGUvbWVkaWFkcm0vRHJtU2Vzc2lvbk1hbmFnZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9tZWRpYS9Ecm1TZXNzaW9uTWFuYWdlci5oCnJlbmFtZSB0byBpbmNsdWRlL21lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSUNyeXB0by5oIGIvaW5jbHVkZS9tZWRpYWRybS9JQ3J5cHRvLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvbWVkaWEvSUNyeXB0by5oCnJlbmFtZSB0byBpbmNsdWRlL21lZGlhZHJtL0lDcnlwdG8uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JRHJtLmggYi9pbmNsdWRlL21lZGlhZHJtL0lEcm0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9tZWRpYS9JRHJtLmgKcmVuYW1lIHRvIGluY2x1ZGUvbWVkaWFkcm0vSURybS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lEcm1DbGllbnQuaCBiL2luY2x1ZGUvbWVkaWFkcm0vSURybUNsaWVudC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL21lZGlhL0lEcm1DbGllbnQuaApyZW5hbWUgdG8gaW5jbHVkZS9tZWRpYWRybS9JRHJtQ2xpZW50LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhRHJtU2VydmljZS5oIGIvaW5jbHVkZS9tZWRpYWRybS9JTWVkaWFEcm1TZXJ2aWNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvbWVkaWEvSU1lZGlhRHJtU2VydmljZS5oCnJlbmFtZSB0byBpbmNsdWRlL21lZGlhZHJtL0lNZWRpYURybVNlcnZpY2UuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYWRybS9PV05FUlMgYi9pbmNsdWRlL21lZGlhZHJtL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzg4NzU0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYWRybS9PV05FUlMKQEAgLTAsMCArMSBAQAoranRpbmtlckBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL1NoYXJlZExpYnJhcnkuaCBiL2luY2x1ZGUvbWVkaWFkcm0vU2hhcmVkTGlicmFyeS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL21lZGlhL1NoYXJlZExpYnJhcnkuaApyZW5hbWUgdG8gaW5jbHVkZS9tZWRpYWRybS9TaGFyZWRMaWJyYXJ5LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmggYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCmluZGV4IGZmNDQwYmMuLmNhMTE5ZDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKKysrIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaApAQCAtNjAsNiArNjAsOCBAQAogICAgIHZvbGF0aWxlIGludDMyX3QgbVJlYXI7ICAgICAvLyB3cml0dGVuIGJ5IHByb2R1Y2VyIChvdXRwdXQ6IGNsaWVudCwgaW5wdXQ6IHNlcnZlcikKICAgICB2b2xhdGlsZSBpbnQzMl90IG1GbHVzaDsgICAgLy8gaW5jcmVtZW50ZWQgYnkgY2xpZW50IHRvIGluZGljYXRlIGEgcmVxdWVzdCB0byBmbHVzaDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VydmVyIG5vdGljZXMgYW5kIGRpc2NhcmRzIGFsbCBkYXRhIGJldHdlZW4gbUZyb250IGFuZCBtUmVhcgorICAgIHZvbGF0aWxlIGludDMyX3QgbVN0b3A7ICAgICAvLyBzZXQgYnkgY2xpZW50IHRvIGluZGljYXRlIGEgc3RvcCBmcmFtZSBwb3NpdGlvbjsgc2VydmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgbm90IHJlYWQgYmV5b25kIHRoaXMgcG9zaXRpb24gdW50aWwgc3RhcnQgaXMgY2FsbGVkLgogICAgIHZvbGF0aWxlIHVpbnQzMl90IG1VbmRlcnJ1bkZyYW1lczsgLy8gc2VydmVyIGluY3JlbWVudHMgZm9yIGVhY2ggdW5hdmFpbGFibGUgYnV0IGRlc2lyZWQgZnJhbWUKICAgICB2b2xhdGlsZSB1aW50MzJfdCBtVW5kZXJydW5Db3VudDsgIC8vIHNlcnZlciBpbmNyZW1lbnRzIGZvciBlYWNoIHVuZGVycnVuIG9jY3VycmVuY2UKIH07CkBAIC0zMzUsNiArMzM3LDggQEAKICAgICAgICAgbVRpbWVzdGFtcC5jbGVhcigpOwogICAgIH0KIAorICAgIHZpcnR1YWwgdm9pZCBzdG9wKCkgeyB9OyAvLyBjYWxsZWQgYnkgY2xpZW50IGluIEF1ZGlvVHJhY2s6OnN0b3AoKQorCiBwcml2YXRlOgogICAgIC8vIFRoaXMgaXMgYSBjb3B5IG9mIG1DYmxrLT5tQnVmZmVyU2l6ZUluRnJhbWVzCiAgICAgdWludDMyX3QgICBtQnVmZmVyU2l6ZUluRnJhbWVzOyAgLy8gZWZmZWN0aXZlIHNpemUgb2YgdGhlIGJ1ZmZlcgpAQCAtMzgzLDggKzM4NywxNCBAQAogICAgICAgICBtUGxheWJhY2tSYXRlTXV0YXRvci5wdXNoKHBsYXliYWNrUmF0ZSk7CiAgICAgfQogCisgICAgLy8gU2VuZHMgZmx1c2ggYW5kIHN0b3AgcG9zaXRpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUgY2xpZW50IHRvIHRoZSBzZXJ2ZXIsCisgICAgLy8gdXNlZCBieSBzdHJlYW1pbmcgQXVkaW9UcmFjayBmbHVzaCgpIG9yIHN0b3AoKS4KKyAgICB2b2lkIHNlbmRTdHJlYW1pbmdGbHVzaFN0b3AoYm9vbCBmbHVzaCk7CisKICAgICB2aXJ0dWFsIHZvaWQgZmx1c2goKTsKIAorICAgICAgICAgICAgdm9pZCBzdG9wKCkgb3ZlcnJpZGU7CisKICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgIGdldFVuZGVycnVuRnJhbWVzKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbUNibGstPnUubVN0cmVhbWluZy5tVW5kZXJydW5GcmFtZXM7CiAgICAgfQpAQCAtNDEwLDYgKzQyMCw4IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgICAgZmx1c2goKTsKIAorICAgIHZvaWQgc3RvcCgpIG92ZXJyaWRlOworCiAjZGVmaW5lIE1JTl9MT09QICAgIDE2ICAvLyBtaW5pbXVtIGxlbmd0aCBvZiBlYWNoIGxvb3AgaXRlcmF0aW9uIGluIGZyYW1lcwogCiAgICAgICAgICAgICAvLyBzZXRMb29wKCksIHNldEJ1ZmZlclBvc2l0aW9uKCksIGFuZCBzZXRCdWZmZXJQb3NpdGlvbkFuZExvb3AoKSBzZXQgdGhlCkBAIC00MzgsNyArNDUwLDExIEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIHZpcnR1YWwgdWludDMyX3QgICAgZ2V0VW5kZXJydW5GcmFtZXMoKSBjb25zdCB7CisgICAgdmlydHVhbCB1aW50MzJfdCBnZXRVbmRlcnJ1bkZyYW1lcygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdmlydHVhbCB1aW50MzJfdCBnZXRVbmRlcnJ1bkNvdW50KCkgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKQEAgLTUyOCw2ICs1NDQsMTAgQEAKICAgICAvLyAgIGNsaWVudCB3aWxsIGJlIG5vdGlmaWVkIHZpYSBGdXRleAogICAgIHZpcnR1YWwgdm9pZCAgICBmbHVzaEJ1ZmZlcklmTmVlZGVkKCk7CiAKKyAgICAvLyBSZXR1cm5zIHRoZSByZWFyIHBvc2l0aW9uIG9mIHRoZSBBdWRpb1RyYWNrIHNoYXJlZCByaW5nIGJ1ZmZlciwgbGltaXRlZCBieQorICAgIC8vIHRoZSBzdG9wIGZyYW1lIHBvc2l0aW9uIGxldmVsLgorICAgIHZpcnR1YWwgaW50MzJfdCBnZXRSZWFyKCkgY29uc3QgPSAwOworCiAgICAgLy8gVG90YWwgY291bnQgb2YgdGhlIG51bWJlciBvZiBmbHVzaGVkIGZyYW1lcyBzaW5jZSBjcmVhdGlvbiAobmV2ZXIgcmVzZXQpLgogICAgIHZpcnR1YWwgaW50NjRfdCAgICAgZnJhbWVzRmx1c2hlZCgpIGNvbnN0IHsgcmV0dXJuIG1GbHVzaGVkOyB9CiAKQEAgLTYwMywxMCArNjIzLDE4IEBACiAgICAgICAgIHJldHVybiBtRHJhaW5lZC5sb2FkKCk7CiAgICAgfQogCisgICAgaW50MzJfdCAgICAgICAgICAgICBnZXRSZWFyKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLyBDYWxsZWQgb24gc2VydmVyIHNpZGUgdHJhY2sgc3RhcnQoKS4KKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHN0YXJ0KCk7CisKIHByaXZhdGU6CiAgICAgQXVkaW9QbGF5YmFja1JhdGUgICAgICAgICAgICAgbVBsYXliYWNrUmF0ZTsgIC8vIGxhc3Qgb2JzZXJ2ZWQgcGxheWJhY2sgcmF0ZQogICAgIFBsYXliYWNrUmF0ZVF1ZXVlOjpPYnNlcnZlciAgIG1QbGF5YmFja1JhdGVPYnNlcnZlcjsKIAorICAgIC8vIExhc3QgY2xpZW50IHN0b3AtYXQgcG9zaXRpb24gd2hlbiBzdGFydCgpIHdhcyBjYWxsZWQuIFVzZWQgZm9yIHN0cmVhbWluZyBBdWRpb1RyYWNrcy4KKyAgICBzdGQ6OmF0b21pYzxpbnQzMl90PiAgICAgICAgICBtU3RvcExhc3R7MH07CisKICAgICAvLyBUaGUgc2VydmVyIGtlZXBzIGEgY29weSBoZXJlIHdoZXJlIGl0IGlzIHNhZmUgZnJvbSB0aGUgY2xpZW50LgogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgIG1VbmRlcnJ1bkNvdW50OyAvLyBlY2hvZWQgdG8gbUNibGsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICBtVW5kZXJydW5uaW5nOyAgLy8gdXNlZCB0byBkZXRlY3QgZWRnZSBvZiB1bmRlcnJ1bgpAQCAtNjMwLDYgKzY1OCwxMCBAQAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgdGFsbHlVbmRlcnJ1bkZyYW1lcyh1aW50MzJfdCBmcmFtZUNvdW50KTsKICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgIGdldFVuZGVycnVuRnJhbWVzKCkgY29uc3QgeyByZXR1cm4gMDsgfQogCisgICAgaW50MzJfdCBnZXRSZWFyKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHN0YXJ0KCkgb3ZlcnJpZGUgeyB9IC8vIGlnbm9yZSBmb3Igc3RhdGljIHRyYWNrcworCiBwcml2YXRlOgogICAgIHN0YXR1c190ICAgICAgICAgICAgdXBkYXRlU3RhdGVXaXRoTG9vcChTdGF0aWNBdWRpb1RyYWNrU3RhdGUgKmxvY2FsU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXRpY0F1ZGlvVHJhY2tTdGF0ZSAmdXBkYXRlKSBjb25zdDsKQEAgLTY1Nyw2ICs2ODksMTAgQEAKICAgICAgICAgICAgIHNpemVfdCBmcmFtZVNpemUsIGJvb2wgY2xpZW50SW5TZXJ2ZXIpCiAgICAgICAgIDogU2VydmVyUHJveHkoY2JsaywgYnVmZmVycywgZnJhbWVDb3VudCwgZnJhbWVTaXplLCBmYWxzZSAvKmlzT3V0Ki8sIGNsaWVudEluU2VydmVyKSB7IH0KIAorICAgIGludDMyX3QgZ2V0UmVhcigpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1DYmxrLT51Lm1TdHJlYW1pbmcubVJlYXI7IC8vIEZvciBjb21wbGV0ZW5lc3Mgb25seTsgbVJlYXIgd3JpdHRlbiBieSBzZXJ2ZXIuCisgICAgfQorCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QXVkaW9SZWNvcmRTZXJ2ZXJQcm94eSgpIHsgfQogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9PV05FUlMgYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNzIzYmEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvT1dORVJTCkBAIC0wLDAgKzEsMyBAQAorZWxhdXJlbnRAZ29vZ2xlLmNvbQorZ2thc3RlbkBnb29nbGUuY29tCitodW5nYUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaAppbmRleCBhOWQ0ZGQxLi43MTJmMTE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oCisrKyBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9WaWRlb0ZyYW1lLmgKQEAgLTI1LDk0ICsyNSwzNCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLS8vIFJlcHJlc2VudHMgYSBjb2xvciBjb252ZXJ0ZWQgKFJHQi1iYXNlZCkgdmlkZW8gZnJhbWUKLS8vIHdpdGggYml0bWFwIHBpeGVscyBzdG9yZWQgaW4gRnJhbWVCdWZmZXIKKy8vIFJlcHJlc2VudHMgYSBjb2xvciBjb252ZXJ0ZWQgKFJHQi1iYXNlZCkgdmlkZW8gZnJhbWUgd2l0aCBiaXRtYXAKKy8vIHBpeGVscyBzdG9yZWQgaW4gRnJhbWVCdWZmZXIuCisvLyBJbiBhIFZpZGVvRnJhbWUgc3RydWN0IHN0b3JlZCBpbiBJTWVtb3J5LCBmcmFtZSBkYXRhIGFuZCBJQ0MgZGF0YQorLy8gY29tZSBhZnRlciB0aGUgVmlkZW9GcmFtZSBzdHJ1Y3R1cmUuIFRoZWlyIGxvY2F0aW9ucyBjYW4gYmUgcmV0cmlldmVkCisvLyBieSBnZXRGbGF0dGVuZWREYXRhKCkgYW5kIGdldEZsYXR0ZW5lZEljY0RhdGEoKTsKIGNsYXNzIFZpZGVvRnJhbWUKIHsKIHB1YmxpYzoKICAgICAvLyBDb25zdHJ1Y3QgYSBWaWRlb0ZyYW1lIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycywKLSAgICAvLyB3aWxsIGFsbG9jYXRlIGZyYW1lIGJ1ZmZlciBpZiB8YWxsb2NhdGV8IGlzIHNldCB0byB0cnVlLCB3aWxsCi0gICAgLy8gYWxsb2NhdGUgYnVmZmVyIHRvIGhvbGQgSUNDIGRhdGEgaWYgfGljY0RhdGF8IGFuZCB8aWNjU2l6ZXwKLSAgICAvLyBpbmRpY2F0ZSBpdHMgcHJlc2VuY2UuCisgICAgLy8gd2lsbCBjYWxjdWxhdGUgZnJhbWUgYnVmZmVyIHNpemUgaWYgfGhhc0RhdGF8IGlzIHNldCB0byB0cnVlLgogICAgIFZpZGVvRnJhbWUodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKICAgICAgICAgICAgIHVpbnQzMl90IGRpc3BsYXlXaWR0aCwgdWludDMyX3QgZGlzcGxheUhlaWdodCwKLSAgICAgICAgICAgIHVpbnQzMl90IGFuZ2xlLCB1aW50MzJfdCBicHAsIGJvb2wgYWxsb2NhdGUsCi0gICAgICAgICAgICBjb25zdCB2b2lkICppY2NEYXRhLCBzaXplX3QgaWNjU2l6ZSk6CisgICAgICAgICAgICB1aW50MzJfdCB0aWxlV2lkdGgsIHVpbnQzMl90IHRpbGVIZWlnaHQsCisgICAgICAgICAgICB1aW50MzJfdCBhbmdsZSwgdWludDMyX3QgYnBwLCBib29sIGhhc0RhdGEsIHNpemVfdCBpY2NTaXplKToKICAgICAgICAgbVdpZHRoKHdpZHRoKSwgbUhlaWdodChoZWlnaHQpLAogICAgICAgICBtRGlzcGxheVdpZHRoKGRpc3BsYXlXaWR0aCksIG1EaXNwbGF5SGVpZ2h0KGRpc3BsYXlIZWlnaHQpLAorICAgICAgICBtVGlsZVdpZHRoKHRpbGVXaWR0aCksIG1UaWxlSGVpZ2h0KHRpbGVIZWlnaHQpLAogICAgICAgICBtUm90YXRpb25BbmdsZShhbmdsZSksIG1CeXRlc1BlclBpeGVsKGJwcCksIG1Sb3dCeXRlcyhicHAgKiB3aWR0aCksCi0gICAgICAgIG1TaXplKDApLCBtSWNjU2l6ZSgwKSwgbVJlc2VydmVkKDApLCBtRGF0YSgwKSwgbUljY0RhdGEoMCkgewotICAgICAgICBpZiAoYWxsb2NhdGUpIHsKLSAgICAgICAgICAgIG1TaXplID0gbVJvd0J5dGVzICogbUhlaWdodDsKLSAgICAgICAgICAgIG1EYXRhID0gbmV3IHVpbnQ4X3RbbVNpemVdOwotICAgICAgICAgICAgaWYgKG1EYXRhID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtU2l6ZSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaWNjRGF0YSAhPSBOVUxMICYmIGljY1NpemUgPiAwKSB7Ci0gICAgICAgICAgICBtSWNjU2l6ZSA9IGljY1NpemU7Ci0gICAgICAgICAgICBtSWNjRGF0YSA9IG5ldyB1aW50OF90W2ljY1NpemVdOwotICAgICAgICAgICAgaWYgKG1JY2NEYXRhICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkobUljY0RhdGEsIGljY0RhdGEsIGljY1NpemUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtSWNjU2l6ZSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgbVNpemUoaGFzRGF0YSA/IChicHAgKiB3aWR0aCAqIGhlaWdodCkgOiAwKSwKKyAgICAgICAgbUljY1NpemUoaWNjU2l6ZSksIG1SZXNlcnZlZCgwKSB7CiAgICAgfQogCi0gICAgLy8gRGVlcCBjb3B5IG9mIGJvdGggdGhlIGluZm9ybWF0aW9uIGZpZWxkcyBhbmQgdGhlIGZyYW1lIGRhdGEKLSAgICBWaWRlb0ZyYW1lKGNvbnN0IFZpZGVvRnJhbWUmIGNvcHkpIHsKLSAgICAgICAgY29weUluZm9Pbmx5KGNvcHkpOwotCi0gICAgICAgIG1TaXplID0gY29weS5tU2l6ZTsKLSAgICAgICAgbURhdGEgPSBOVUxMOyAgLy8gaW5pdGlhbGl6ZSBpdCBmaXJzdAotICAgICAgICBpZiAobVNpemUgPiAwICYmIGNvcHkubURhdGEgIT0gTlVMTCkgewotICAgICAgICAgICAgbURhdGEgPSBuZXcgdWludDhfdFttU2l6ZV07Ci0gICAgICAgICAgICBpZiAobURhdGEgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1lbWNweShtRGF0YSwgY29weS5tRGF0YSwgbVNpemUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU2l6ZSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtSWNjU2l6ZSA9IGNvcHkubUljY1NpemU7Ci0gICAgICAgIG1JY2NEYXRhID0gTlVMTDsgIC8vIGluaXRpYWxpemUgaXQgZmlyc3QKLSAgICAgICAgaWYgKG1JY2NTaXplID4gMCAmJiBjb3B5Lm1JY2NEYXRhICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1JY2NEYXRhID0gbmV3IHVpbnQ4X3RbbUljY1NpemVdOwotICAgICAgICAgICAgaWYgKG1JY2NEYXRhICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkobUljY0RhdGEsIGNvcHkubUljY0RhdGEsIG1JY2NTaXplKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUljY1NpemUgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgflZpZGVvRnJhbWUoKSB7Ci0gICAgICAgIGlmIChtRGF0YSAhPSAwKSB7Ci0gICAgICAgICAgICBkZWxldGVbXSBtRGF0YTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUljY0RhdGEgIT0gMCkgewotICAgICAgICAgICAgZGVsZXRlW10gbUljY0RhdGE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDb3B5IHxjb3B5fCB0byBhIGZsYXR0ZW5lZCBWaWRlb0ZyYW1lIGluIElNZW1vcnksICd0aGlzJyBtdXN0IHBvaW50IHRvCi0gICAgLy8gYSBjaHVuayBvZiBtZW1vcnkgYmFjayBieSBJTWVtb3J5IG9mIHNpemUgYXQgbGVhc3QgZ2V0RmxhdHRlbmVkU2l6ZSgpCi0gICAgLy8gb2YgfGNvcHl8LgotICAgIHZvaWQgY29weUZsYXR0ZW5lZChjb25zdCBWaWRlb0ZyYW1lJiBjb3B5KSB7Ci0gICAgICAgIGNvcHlJbmZvT25seShjb3B5KTsKLQotICAgICAgICBtU2l6ZSA9IGNvcHkubVNpemU7Ci0gICAgICAgIG1EYXRhID0gTlVMTDsgIC8vIGluaXRpYWxpemUgaXQgZmlyc3QKLSAgICAgICAgaWYgKGNvcHkubVNpemUgPiAwICYmIGNvcHkubURhdGEgIT0gTlVMTCkgewotICAgICAgICAgICAgbWVtY3B5KGdldEZsYXR0ZW5lZERhdGEoKSwgY29weS5tRGF0YSwgY29weS5tU2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtSWNjU2l6ZSA9IGNvcHkubUljY1NpemU7Ci0gICAgICAgIG1JY2NEYXRhID0gTlVMTDsgIC8vIGluaXRpYWxpemUgaXQgZmlyc3QKLSAgICAgICAgaWYgKGNvcHkubUljY1NpemUgPiAwICYmIGNvcHkubUljY0RhdGEgIT0gTlVMTCkgewotICAgICAgICAgICAgbWVtY3B5KGdldEZsYXR0ZW5lZEljY0RhdGEoKSwgY29weS5tSWNjRGF0YSwgY29weS5tSWNjU2l6ZSk7CisgICAgdm9pZCBpbml0KGNvbnN0IFZpZGVvRnJhbWUmIGNvcHksIGNvbnN0IHZvaWQqIGljY0RhdGEsIHNpemVfdCBpY2NTaXplKSB7CisgICAgICAgICp0aGlzID0gY29weTsKKyAgICAgICAgaWYgKG1JY2NTaXplID09IGljY1NpemUgJiYgaWNjU2l6ZSA+IDAgJiYgaWNjRGF0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtZW1jcHkoZ2V0RmxhdHRlbmVkSWNjRGF0YSgpLCBpY2NEYXRhLCBpY2NTaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1JY2NTaXplID0gMDsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTM2LDM4ICs3NiwxNCBAQAogICAgIHVpbnQzMl90IG1IZWlnaHQ7ICAgICAgICAgIC8vIERlY29kZWQgaW1hZ2UgaGVpZ2h0IGJlZm9yZSByb3RhdGlvbgogICAgIHVpbnQzMl90IG1EaXNwbGF5V2lkdGg7ICAgIC8vIERpc3BsYXkgd2lkdGggYmVmb3JlIHJvdGF0aW9uCiAgICAgdWludDMyX3QgbURpc3BsYXlIZWlnaHQ7ICAgLy8gRGlzcGxheSBoZWlnaHQgYmVmb3JlIHJvdGF0aW9uCisgICAgdWludDMyX3QgbVRpbGVXaWR0aDsgICAgICAgLy8gVGlsZSB3aWR0aCAoMCBpZiBpbWFnZSBkb2Vzbid0IGhhdmUgZ3JpZCkKKyAgICB1aW50MzJfdCBtVGlsZUhlaWdodDsgICAgICAvLyBUaWxlIGhlaWdodCAoMCBpZiBpbWFnZSBkb2Vzbid0IGhhdmUgZ3JpZCkKICAgICBpbnQzMl90ICBtUm90YXRpb25BbmdsZTsgICAvLyBSb3RhdGlvbiBhbmdsZSwgY2xvY2t3aXNlLCBzaG91bGQgYmUgbXVsdGlwbGUgb2YgOTAKICAgICB1aW50MzJfdCBtQnl0ZXNQZXJQaXhlbDsgICAvLyBOdW1iZXIgb2YgYnl0ZXMgcGVyIHBpeGVsCiAgICAgdWludDMyX3QgbVJvd0J5dGVzOyAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIHBlciByb3cgYmVmb3JlIHJvdGF0aW9uCi0gICAgdWludDMyX3QgbVNpemU7ICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIG1EYXRhCi0gICAgdWludDMyX3QgbUljY1NpemU7ICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIG1JY2NEYXRhCisgICAgdWludDMyX3QgbVNpemU7ICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIG9mIGZyYW1lIGRhdGEKKyAgICB1aW50MzJfdCBtSWNjU2l6ZTsgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgb2YgSUNDIGRhdGEKICAgICB1aW50MzJfdCBtUmVzZXJ2ZWQ7ICAgICAgICAvLyAocGFkZGluZyB0byBtYWtlIG1EYXRhIDY0LWJpdCBhbGlnbmVkKQotCi0gICAgLy8gbURhdGEgc2hvdWxkIGJlIDY0LWJpdCBhbGlnbmVkIHRvIHByZXZlbnQgYWRkaXRpb25hbCBwYWRkaW5nCi0gICAgdWludDhfdCogbURhdGE7ICAgICAgICAgICAgLy8gQWN0dWFsIGJpbmFyeSBkYXRhCi0gICAgLy8gcGFkIHN0cnVjdHVyZSBzbyBpdCdzIHRoZSBzYW1lIHNpemUgb24gNjQtYml0IGFuZCAzMi1iaXQKLSAgICBjaGFyICAgICBtUGFkZGluZ1s4IC0gc2l6ZW9mKG1EYXRhKV07Ci0KLSAgICAvLyBtSWNjRGF0YSBzaG91bGQgYmUgNjQtYml0IGFsaWduZWQgdG8gcHJldmVudCBhZGRpdGlvbmFsIHBhZGRpbmcKLSAgICB1aW50OF90KiBtSWNjRGF0YTsgICAgICAgICAgICAvLyBBY3R1YWwgYmluYXJ5IGRhdGEKLSAgICAvLyBwYWQgc3RydWN0dXJlIHNvIGl0J3MgdGhlIHNhbWUgc2l6ZSBvbiA2NC1iaXQgYW5kIDMyLWJpdAotICAgIGNoYXIgICAgIG1JY2NQYWRkaW5nWzggLSBzaXplb2YobUljY0RhdGEpXTsKLQotcHJpdmF0ZToKLSAgICAvLwotICAgIC8vIFV0aWxpdHkgbWV0aG9kcyB1c2VkIG9ubHkgd2l0aGluIFZpZGVvRnJhbWUgc3RydWN0Ci0gICAgLy8KLQotICAgIC8vIENvcHkgdGhlIGluZm9ybWF0aW9uIGZpZWxkcyBvbmx5Ci0gICAgdm9pZCBjb3B5SW5mb09ubHkoY29uc3QgVmlkZW9GcmFtZSYgY29weSkgewotICAgICAgICBtV2lkdGggPSBjb3B5Lm1XaWR0aDsKLSAgICAgICAgbUhlaWdodCA9IGNvcHkubUhlaWdodDsKLSAgICAgICAgbURpc3BsYXlXaWR0aCA9IGNvcHkubURpc3BsYXlXaWR0aDsKLSAgICAgICAgbURpc3BsYXlIZWlnaHQgPSBjb3B5Lm1EaXNwbGF5SGVpZ2h0OwotICAgICAgICBtUm90YXRpb25BbmdsZSA9IGNvcHkubVJvdGF0aW9uQW5nbGU7Ci0gICAgICAgIG1CeXRlc1BlclBpeGVsID0gY29weS5tQnl0ZXNQZXJQaXhlbDsKLSAgICAgICAgbVJvd0J5dGVzID0gY29weS5tUm93Qnl0ZXM7Ci0gICAgfQogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmR0cmlnZ2VyL09XTkVSUyBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODNmNmI5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvT1dORVJTCkBAIC0wLDAgKzEsMiBAQAorZWxhdXJlbnRAZ29vZ2xlLmNvbQordGhvcm50b25jQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL09XTkVSUyBiL21lZGlhL09XTkVSUwppbmRleCAxNjA1ZWZkLi5kNDllYjhkIDEwMDY0NAotLS0gYS9tZWRpYS9PV05FUlMKKysrIGIvbWVkaWEvT1dORVJTCkBAIC0yLDYgKzIsNyBAQAogZHdrYW5nQGdvb2dsZS5jb20KIGVsYXVyZW50QGdvb2dsZS5jb20KIGVzc2lja0Bnb29nbGUuY29tCitoa3VhbmdAZ29vZ2xlLmNvbQogaHVuZ2FAZ29vZ2xlLmNvbQogam10cml2aUBnb29nbGUuY29tCiBrcm9jYXJkQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsgYi9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rCmluZGV4IDNlZTc0OTQuLjcwYzI4MWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5tawpAQCAtMyw3ICszLDggQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TUkNfRklMRVMgOj0gXAotCW1haW5fYXVkaW9zZXJ2ZXIuY3BwCisJbWFpbl9hdWRpb3NlcnZlci5jcHAgXAorCS4uL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9SZWNvcmQuYWlkbAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJhYXVkaW9zZXJ2aWNlIFwKQEAgLTEyLDExICsxMywxMyBAQAogCWxpYmJpbmRlciBcCiAJbGliY3V0aWxzIFwKIAlsaWJsb2cgXAorCWxpYmhpZGx0cmFuc3BvcnQgXAorCWxpYmh3YmluZGVyIFwKKwlsaWJtZWRpYSBcCiAJbGlibWVkaWFsb2dzZXJ2aWNlIFwKIAlsaWJuYmFpbyBcCiAJbGlic291bmR0cmlnZ2Vyc2VydmljZSBcCi0JbGlidXRpbHMgXAotCWxpYmh3YmluZGVyCisJbGlidXRpbHMKIAogIyBUT0RPIG9ib2VzZXJ2aWNlIGlzIHRoZSBvbGQgZm9sZGVyIG5hbWUgZm9yIGFhdWRpb3NlcnZpY2UuIEl0IHdpbGwgYmUgY2hhbmdlZC4KIExPQ0FMX0NfSU5DTFVERVMgOj0gXApAQCAtMzMsOSArMzYsMTMgQEAKIAlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIFwKIAlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9zcmMgXAogCWZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nIFwKKwlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhIFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKIAlleHRlcm5hbC9zb25pYyBcCiAKK0xPQ0FMX0FJRExfSU5DTFVERVMgOj0gXAorICAgICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwKKwogIyBJZiBBVURJT1NFUlZFUl9NVUxUSUxJQiBpbiBkZXZpY2UubWsgaXMgbm9uLWVtcHR5IHRoZW4gaXQgaXMgdXNlZCB0byBjb250cm9sCiAjIHRoZSBMT0NBTF9NVUxUSUxJQiBmb3IgYWxsIGF1ZGlvc2VydmVyIGV4Y2x1c2l2ZSBsaWJyYXJpZXMuCiAjIFRoaXMgaXMgcmVsZXZhbnQgZm9yIDY0IGJpdCBhcmNoaXRlY3R1cmVzIHdoZXJlIGVpdGhlciBvciBib3RoCmRpZmYgLS1naXQgYS9tZWRpYS9hdWRpb3NlcnZlci9PV05FUlMgYi9tZWRpYS9hdWRpb3NlcnZlci9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljYjU2NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2F1ZGlvc2VydmVyL09XTkVSUwpAQCAtMCwwICsxIEBACitna2FzdGVuQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2F1ZGlvc2VydmVyL2F1ZGlvc2VydmVyLnJjIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvYXVkaW9zZXJ2ZXIucmMKaW5kZXggOWQ0MmJjZS4uNzU2NzVhOSAxMDA2NDQKLS0tIGEvbWVkaWEvYXVkaW9zZXJ2ZXIvYXVkaW9zZXJ2ZXIucmMKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvYXVkaW9zZXJ2ZXIucmMKQEAgLTEsMTAgKzEsMTMgQEAKIHNlcnZpY2UgYXVkaW9zZXJ2ZXIgL3N5c3RlbS9iaW4vYXVkaW9zZXJ2ZXIKLSAgICBjbGFzcyBtYWluCisgICAgY2xhc3MgY29yZQogICAgIHVzZXIgYXVkaW9zZXJ2ZXIKICAgICAjIG1lZGlhIGdpZCBuZWVkZWQgZm9yIC9kZXYvZm0gKHJhZGlvKSBhbmQgZm9yIC9kYXRhL21pc2MvbWVkaWEgKHRlZSkKICAgICBncm91cCBhdWRpbyBjYW1lcmEgZHJtcnBjIGluZXQgbWVkaWEgbWVkaWFkcm0gbmV0X2J0IG5ldF9idF9hZG1pbiBuZXRfYndfYWNjdAogICAgIGlvcHJpbyBydCA0CiAgICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcyAvZGV2L3N0dW5lL2ZvcmVncm91bmQvdGFza3MKKyAgICBvbnJlc3RhcnQgcmVzdGFydCB2ZW5kb3IuYXVkaW8taGFsLTItMAorICAgICMgS2VlcCB0aGUgb3JpZ2luYWwgc2VydmljZSBuYW1lIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdoZW4gdXBncmFkaW5nCisgICAgIyBPLU1SMSBkZXZpY2VzIHdpdGggZnJhbWV3b3JrLW9ubHkuCiAgICAgb25yZXN0YXJ0IHJlc3RhcnQgYXVkaW8taGFsLTItMAogCiBvbiBwcm9wZXJ0eTp2dHMubmF0aXZlX3NlcnZlci5vbj0xCmRpZmYgLS1naXQgYS9tZWRpYS9hdWRpb3NlcnZlci9tYWluX2F1ZGlvc2VydmVyLmNwcCBiL21lZGlhL2F1ZGlvc2VydmVyL21haW5fYXVkaW9zZXJ2ZXIuY3BwCmluZGV4IDQ3NGVmOTcuLmRiNTcyNDggMTAwNjQ0Ci0tLSBhL21lZGlhL2F1ZGlvc2VydmVyL21haW5fYXVkaW9zZXJ2ZXIuY3BwCisrKyBiL21lZGlhL2F1ZGlvc2VydmVyL21haW5fYXVkaW9zZXJ2ZXIuY3BwCkBAIC0yNSwxMiArMjUsOSBAQAogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0vLyBGSVhNRTogcmVtb3ZlIHdoZW4gQlVHIDMxNzQ4OTk2IGlzIGZpeGVkCi0jaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxod2JpbmRlci9Qcm9jZXNzU3RhdGUuaD4KLQogLy8gZnJvbSBMT0NBTF9DX0lOQ0xVREVTCiAjaW5jbHVkZSAiYWF1ZGlvL0FBdWRpb1Rlc3RpbmcuaCIKICNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKQEAgLTM4LDEyICszNSwxOSBAQAogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2UuaCIKICNpbmNsdWRlICJ1dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oIgogI2luY2x1ZGUgIk1lZGlhTG9nU2VydmljZS5oIgorI2luY2x1ZGUgIk1lZGlhVXRpbHMuaCIKICNpbmNsdWRlICJTb3VuZFRyaWdnZXJId1NlcnZpY2UuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKIGludCBtYWluKGludCBhcmdjIF9fdW51c2VkLCBjaGFyICoqYXJndikKIHsKKyAgICAvLyBUT0RPOiB1cGRhdGUgd2l0aCByZWZpbmVkIHBhcmFtZXRlcnMKKyAgICBsaW1pdFByb2Nlc3NNZW1vcnkoCisgICAgICAgICJhdWRpby5tYXhtZW0iLCAvKiAicm8uYXVkaW8ubWF4bWVtIiwgcHJvcGVydHkgdGhhdCBkZWZpbmVzIGxpbWl0ICovCisgICAgICAgIChzaXplX3QpNTEyICogKDEgPDwgMjApLCAvKiBTSVpFX01BWCwgdXBwZXIgbGltaXQgaW4gYnl0ZXMgKi8KKyAgICAgICAgMjAgLyogdXBwZXIgbGltaXQgYXMgcGVyY2VudGFnZSBvZiBwaHlzaWNhbCBSQU0gKi8pOworCiAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwogCiAgICAgYm9vbCBkb0xvZyA9IChib29sKSBwcm9wZXJ0eV9nZXRfYm9vbCgicm8udGVzdF9oYXJuZXNzIiwgMCk7CkBAIC0xMjgsNiArMTMyLDcgQEAKICAgICAgICAgICAgIHByY3RsKFBSX1NFVF9QREVBVEhTSUcsIFNJR0tJTEwpOyAgIC8vIGlmIHBhcmVudCBtZWRpYS5sb2cgZGllcyBiZWZvcmUgbWUsIGtpbGwgbWUgYWxzbwogICAgICAgICAgICAgc2V0cGdpZCgwLCAwKTsgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IGlmIEkgZGllIGZpcnN0LCBkb24ndCBraWxsIG15IHBhcmVudAogICAgICAgICB9CisgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpjb25maWd1cmVScGNUaHJlYWRwb29sKDQsIGZhbHNlIC8qY2FsbGVyV2lsbEpvaW4qLyk7CiAgICAgICAgIHNwPFByb2Nlc3NTdGF0ZT4gcHJvYyhQcm9jZXNzU3RhdGU6OnNlbGYoKSk7CiAgICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKICAgICAgICAgQUxPR0koIlNlcnZpY2VNYW5hZ2VyOiAlcCIsIHNtLmdldCgpKTsKQEAgLTE0NSwxMCArMTUwLDYgQEAKIAogICAgICAgICBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAgICAgICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKLQotLy8gRklYTUU6IHJlbW92ZSB3aGVuIEJVRyAzMTc0ODk5NiBpcyBmaXhlZAotICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwotCiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmpvaW5UaHJlYWRQb29sKCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29tbW9uX3RpbWUvT1dORVJTIGIvbWVkaWEvY29tbW9uX3RpbWUvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Y2I1NjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb21tb25fdGltZS9PV05FUlMKQEAgLTAsMCArMSBAQAorZ2thc3RlbkBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgxNzZjZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvQW5kcm9pZC5icApAQCAtMCwwICsxLDMgQEAKK3N1YmRpcnMgPSBbCisgICAgIioiLAorXQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FBQ0V4dHJhY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZjNWE3NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FBQ0V4dHJhY3Rvci5jcHAKQEAgLTAsMCArMSw0MDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFBQ0V4dHJhY3RvciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkFBQ0V4dHJhY3Rvci5oIgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBBQUNTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CitwdWJsaWM6CisgICAgQUFDU291cmNlKAorICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50NjRfdD4gJm9mZnNldF92ZWN0b3IsCisgICAgICAgICAgICBpbnQ2NF90IGZyYW1lX2R1cmF0aW9uX3VzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSYpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QUFDU291cmNlKCk7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4RnJhbWVTaXplOworICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBNZXRhRGF0YUJhc2UgbU1ldGE7CisKKyAgICBvZmY2NF90IG1PZmZzZXQ7CisgICAgaW50NjRfdCBtQ3VycmVudFRpbWVVczsKKyAgICBib29sIG1TdGFydGVkOworICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1Hcm91cDsKKworICAgIFZlY3Rvcjx1aW50NjRfdD4gbU9mZnNldFZlY3RvcjsKKyAgICBpbnQ2NF90IG1GcmFtZUR1cmF0aW9uVXM7CisKKyAgICBBQUNTb3VyY2UoY29uc3QgQUFDU291cmNlICYpOworICAgIEFBQ1NvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IEFBQ1NvdXJjZSAmKTsKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIFJldHVybnMgdGhlIHNhbXBsZSByYXRlIGJhc2VkIG9uIHRoZSBzYW1wbGluZyBmcmVxdWVuY3kgaW5kZXgKK3VpbnQzMl90IGdldF9zYW1wbGVfcmF0ZShjb25zdCB1aW50OF90IHNmX2luZGV4KQoreworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBzYW1wbGVfcmF0ZXNbXSA9CisgICAgeworICAgICAgICA5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsIDMyMDAwLAorICAgICAgICAyNDAwMCwgMjIwNTAsIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAKKyAgICB9OworCisgICAgaWYgKHNmX2luZGV4IDwgc2l6ZW9mKHNhbXBsZV9yYXRlcykgLyBzaXplb2Yoc2FtcGxlX3JhdGVzWzBdKSkgeworICAgICAgICByZXR1cm4gc2FtcGxlX3JhdGVzW3NmX2luZGV4XTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLy8gUmV0dXJucyB0aGUgZnJhbWUgbGVuZ3RoIGluIGJ5dGVzIGFzIGRlc2NyaWJlZCBpbiBhbiBBRFRTIGhlYWRlciBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gb2Zmc2V0LAorLy8gICAgIG9yIDAgaWYgdGhlIHNpemUgY2FuJ3QgYmUgcmVhZCBkdWUgdG8gYW4gZXJyb3IgaW4gdGhlIGhlYWRlciBvciBhIHJlYWQgZmFpbHVyZS4KKy8vIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyB0aGUgQUFDIGZyYW1lIHNpemUgd2l0aCB0aGUgQURUUyBoZWFkZXIgbGVuZ3RoIChyZWdhcmRsZXNzIG9mCisvLyAgICAgdGhlIHByZXNlbmNlIG9mIHRoZSBDUkMpLgorLy8gSWYgaGVhZGVyU2l6ZSBpcyBub24tTlVMTCwgaXQgd2lsbCBiZSB1c2VkIHRvIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyIG9mIHRoaXMgQURUUyBmcmFtZS4KK3N0YXRpYyBzaXplX3QgZ2V0QWR0c0ZyYW1lTGVuZ3RoKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3QqIGhlYWRlclNpemUpIHsKKworICAgIGNvbnN0IHNpemVfdCBrQWR0c0hlYWRlckxlbmd0aE5vQ3JjID0gNzsKKyAgICBjb25zdCBzaXplX3Qga0FkdHNIZWFkZXJMZW5ndGhXaXRoQ3JjID0gOTsKKworICAgIHNpemVfdCBmcmFtZVNpemUgPSAwOworCisgICAgdWludDhfdCBzeW5jd29yZFsyXTsKKyAgICBpZiAoc291cmNlLT5yZWFkQXQob2Zmc2V0LCAmc3luY3dvcmQsIDIpICE9IDIpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgoc3luY3dvcmRbMF0gIT0gMHhmZikgfHwgKChzeW5jd29yZFsxXSAmIDB4ZjYpICE9IDB4ZjApKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHVpbnQ4X3QgcHJvdGVjdGlvbkFic2VudDsKKyAgICBpZiAoc291cmNlLT5yZWFkQXQob2Zmc2V0ICsgMSwgJnByb3RlY3Rpb25BYnNlbnQsIDEpIDwgMSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcHJvdGVjdGlvbkFic2VudCAmPSAweDE7CisKKyAgICB1aW50OF90IGhlYWRlclszXTsKKyAgICBpZiAoc291cmNlLT5yZWFkQXQob2Zmc2V0ICsgMywgJmhlYWRlciwgMykgPCAzKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZyYW1lU2l6ZSA9IChoZWFkZXJbMF0gJiAweDMpIDw8IDExIHwgaGVhZGVyWzFdIDw8IDMgfCBoZWFkZXJbMl0gPj4gNTsKKworICAgIC8vIHByb3RlY3Rpb25BYnNlbnQgaXMgMCBpZiB0aGVyZSBpcyBDUkMKKyAgICBzaXplX3QgaGVhZFNpemUgPSBwcm90ZWN0aW9uQWJzZW50ID8ga0FkdHNIZWFkZXJMZW5ndGhOb0NyYyA6IGtBZHRzSGVhZGVyTGVuZ3RoV2l0aENyYzsKKyAgICBpZiAoaGVhZFNpemUgPiBmcmFtZVNpemUpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChoZWFkZXJTaXplICE9IE5VTEwpIHsKKyAgICAgICAgKmhlYWRlclNpemUgPSBoZWFkU2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZnJhbWVTaXplOworfQorCitBQUNFeHRyYWN0b3I6OkFBQ0V4dHJhY3RvcigKKyAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgb2ZmNjRfdCBvZmZzZXQpCisgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAorICAgICAgbUluaXRDaGVjayhOT19JTklUKSwKKyAgICAgIG1GcmFtZUR1cmF0aW9uVXMoMCkgeworCisgICAgdWludDhfdCBwcm9maWxlLCBzZl9pbmRleCwgY2hhbm5lbCwgaGVhZGVyWzJdOworICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCArIDIsICZoZWFkZXIsIDIpIDwgMikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcHJvZmlsZSA9IChoZWFkZXJbMF0gPj4gNikgJiAweDM7CisgICAgc2ZfaW5kZXggPSAoaGVhZGVyWzBdID4+IDIpICYgMHhmOworICAgIHVpbnQzMl90IHNyID0gZ2V0X3NhbXBsZV9yYXRlKHNmX2luZGV4KTsKKyAgICBpZiAoc3IgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNoYW5uZWwgPSAoaGVhZGVyWzBdICYgMHgxKSA8PCAyIHwgKGhlYWRlclsxXSA+PiA2KTsKKworICAgIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShtTWV0YSwgcHJvZmlsZSwgc2ZfaW5kZXgsIGNoYW5uZWwpOworCisgICAgb2ZmNjRfdCBzdHJlYW1TaXplLCBudW1GcmFtZXMgPSAwOworICAgIHNpemVfdCBmcmFtZVNpemUgPSAwOworICAgIGludDY0X3QgZHVyYXRpb24gPSAwOworCisgICAgaWYgKG1EYXRhU291cmNlLT5nZXRTaXplKCZzdHJlYW1TaXplKSA9PSBPSykgeworICAgICAgICAgd2hpbGUgKG9mZnNldCA8IHN0cmVhbVNpemUpIHsKKyAgICAgICAgICAgIGlmICgoZnJhbWVTaXplID0gZ2V0QWR0c0ZyYW1lTGVuZ3RoKHNvdXJjZSwgb2Zmc2V0LCBOVUxMKSkgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJwcmVtYXR1cmVkIEFBQyBzdHJlYW0gKCVsbGQgdnMgJWxsZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylvZmZzZXQsIChsb25nIGxvbmcpc3RyZWFtU2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1PZmZzZXRWZWN0b3IucHVzaChvZmZzZXQpOworCisgICAgICAgICAgICBvZmZzZXQgKz0gZnJhbWVTaXplOworICAgICAgICAgICAgbnVtRnJhbWVzICsrOworICAgICAgICB9CisKKyAgICAgICAgLy8gUm91bmQgdXAgYW5kIGdldCB0aGUgZHVyYXRpb24KKyAgICAgICAgbUZyYW1lRHVyYXRpb25VcyA9ICgxMDI0ICogMTAwMDAwMGxsICsgKHNyIC0gMSkpIC8gc3I7CisgICAgICAgIGR1cmF0aW9uID0gbnVtRnJhbWVzICogbUZyYW1lRHVyYXRpb25VczsKKyAgICAgICAgbU1ldGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvbik7CisgICAgfQorCisgICAgbUluaXRDaGVjayA9IE9LOworfQorCitBQUNFeHRyYWN0b3I6On5BQUNFeHRyYWN0b3IoKSB7Cit9CisKK3N0YXR1c190IEFBQ0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7CisgICAgbWV0YS5jbGVhcigpOworICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7CisgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3NpemVfdCBBQUNFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgeworICAgIHJldHVybiBtSW5pdENoZWNrID09IE9LID8gMSA6IDA7Cit9CisKK01lZGlhVHJhY2sgKkFBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IEFBQ1NvdXJjZShtRGF0YVNvdXJjZSwgbU1ldGEsIG1PZmZzZXRWZWN0b3IsIG1GcmFtZUR1cmF0aW9uVXMpOworfQorCitzdGF0dXNfdCBBQUNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBtZXRhID0gbU1ldGE7CisgICAgcmV0dXJuIE9LOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyA4MTkyID0gMl4xMywgMTNiaXQgQUFDIGZyYW1lIHNpemUgKGluIGJ5dGVzKQorY29uc3Qgc2l6ZV90IEFBQ1NvdXJjZTo6a01heEZyYW1lU2l6ZSA9IDgxOTI7CisKK0FBQ1NvdXJjZTo6QUFDU291cmNlKAorICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50NjRfdD4gJm9mZnNldF92ZWN0b3IsCisgICAgICAgIGludDY0X3QgZnJhbWVfZHVyYXRpb25fdXMpCisgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAorICAgICAgbU1ldGEobWV0YSksCisgICAgICBtT2Zmc2V0KDApLAorICAgICAgbUN1cnJlbnRUaW1lVXMoMCksCisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtR3JvdXAoTlVMTCksCisgICAgICBtT2Zmc2V0VmVjdG9yKG9mZnNldF92ZWN0b3IpLAorICAgICAgbUZyYW1lRHVyYXRpb25VcyhmcmFtZV9kdXJhdGlvbl91cykgeworfQorCitBQUNTb3VyY2U6On5BQUNTb3VyY2UoKSB7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIHN0b3AoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEFBQ1NvdXJjZTo6c3RhcnQoTWV0YURhdGFCYXNlICogLyogcGFyYW1zICovKSB7CisgICAgQ0hFQ0soIW1TdGFydGVkKTsKKworICAgIGlmIChtT2Zmc2V0VmVjdG9yLmVtcHR5KCkpIHsKKyAgICAgICAgbU9mZnNldCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbU9mZnNldCA9IG1PZmZzZXRWZWN0b3IuaXRlbUF0KDApOworICAgIH0KKworICAgIG1DdXJyZW50VGltZVVzID0gMDsKKyAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKKyAgICBtR3JvdXAtPmFkZF9idWZmZXIoTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoa01heEZyYW1lU2l6ZSkpOworICAgIG1TdGFydGVkID0gdHJ1ZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQUFDU291cmNlOjpzdG9wKCkgeworICAgIENIRUNLKG1TdGFydGVkKTsKKworICAgIGRlbGV0ZSBtR3JvdXA7CisgICAgbUdyb3VwID0gTlVMTDsKKworICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBQUNTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKKyAgICBtZXRhID0gbU1ldGE7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBQUNTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICAqb3V0ID0gTlVMTDsKKworICAgIGludDY0X3Qgc2Vla1RpbWVVczsKKyAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKKyAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgeworICAgICAgICBpZiAobUZyYW1lRHVyYXRpb25VcyA+IDApIHsKKyAgICAgICAgICAgIGludDY0X3Qgc2Vla0ZyYW1lID0gc2Vla1RpbWVVcyAvIG1GcmFtZUR1cmF0aW9uVXM7CisgICAgICAgICAgICBpZiAoc2Vla0ZyYW1lIDwgMCB8fCBzZWVrRnJhbWUgPj0gKGludDY0X3QpbU9mZnNldFZlY3Rvci5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjcwMjM5NTA3Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DdXJyZW50VGltZVVzID0gc2Vla0ZyYW1lICogbUZyYW1lRHVyYXRpb25VczsKKworICAgICAgICAgICAgbU9mZnNldCA9IG1PZmZzZXRWZWN0b3IuaXRlbUF0KHNlZWtGcmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzaXplX3QgZnJhbWVTaXplLCBmcmFtZVNpemVXaXRob3V0SGVhZGVyLCBoZWFkZXJTaXplOworICAgIGlmICgoZnJhbWVTaXplID0gZ2V0QWR0c0ZyYW1lTGVuZ3RoKG1EYXRhU291cmNlLCBtT2Zmc2V0LCAmaGVhZGVyU2l6ZSkpID09IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgfQorCisgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7CisgICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgZnJhbWVTaXplV2l0aG91dEhlYWRlciA9IGZyYW1lU2l6ZSAtIGhlYWRlclNpemU7CisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQobU9mZnNldCArIGhlYWRlclNpemUsIGJ1ZmZlci0+ZGF0YSgpLAorICAgICAgICAgICAgICAgIGZyYW1lU2l6ZVdpdGhvdXRIZWFkZXIpICE9IChzc2l6ZV90KWZyYW1lU2l6ZVdpdGhvdXRIZWFkZXIpIHsKKyAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKworICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIGZyYW1lU2l6ZVdpdGhvdXRIZWFkZXIpOworICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIG1DdXJyZW50VGltZVVzKTsKKyAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisKKyAgICBtT2Zmc2V0ICs9IGZyYW1lU2l6ZTsKKyAgICBtQ3VycmVudFRpbWVVcyArPSBtRnJhbWVEdXJhdGlvblVzOworCisgICAgKm91dCA9IGJ1ZmZlcjsKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAorICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICB2b2lkICptZXRhKSB7CisgICAgb2ZmNjRfdCBvZmZzZXQgPSAqc3RhdGljX2Nhc3Q8b2ZmNjRfdCo+KG1ldGEpOworICAgIHJldHVybiBuZXcgQUFDRXh0cmFjdG9yKHNvdXJjZSwgb2Zmc2V0KTsKK30KKworc3RhdGljIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBTbmlmZigKKyAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiptZXRhLAorICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICpmcmVlTWV0YSkgeworICAgIG9mZjY0X3QgcG9zID0gMDsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgdWludDhfdCBpZDNoZWFkZXJbMTBdOworICAgICAgICBpZiAoc291cmNlLT5yZWFkQXQocG9zLCBpZDNoZWFkZXIsIHNpemVvZihpZDNoZWFkZXIpKQorICAgICAgICAgICAgICAgIDwgKHNzaXplX3Qpc2l6ZW9mKGlkM2hlYWRlcikpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1lbWNtcCgiSUQzIiwgaWQzaGVhZGVyLCAzKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBTa2lwIHRoZSBJRDN2MiBoZWFkZXIuCisKKyAgICAgICAgc2l6ZV90IGxlbiA9CisgICAgICAgICAgICAoKGlkM2hlYWRlcls2XSAmIDB4N2YpIDw8IDIxKQorICAgICAgICAgICAgfCAoKGlkM2hlYWRlcls3XSAmIDB4N2YpIDw8IDE0KQorICAgICAgICAgICAgfCAoKGlkM2hlYWRlcls4XSAmIDB4N2YpIDw8IDcpCisgICAgICAgICAgICB8IChpZDNoZWFkZXJbOV0gJiAweDdmKTsKKworICAgICAgICBsZW4gKz0gMTA7CisKKyAgICAgICAgcG9zICs9IGxlbjsKKworICAgICAgICBBTE9HVigic2tpcHBlZCBJRDMgdGFnLCBuZXcgc3RhcnRpbmcgb2Zmc2V0IGlzICVsbGQgKDB4JTAxNmxseCkiLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpcG9zLCAobG9uZyBsb25nKXBvcyk7CisgICAgfQorCisgICAgdWludDhfdCBoZWFkZXJbMl07CisKKyAgICBpZiAoc291cmNlLT5yZWFkQXQocG9zLCAmaGVhZGVyLCAyKSAhPSAyKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIEFEVFMgc3luY3dvcmQKKyAgICBpZiAoKGhlYWRlclswXSA9PSAweGZmKSAmJiAoKGhlYWRlclsxXSAmIDB4ZjYpID09IDB4ZjApKSB7CisgICAgICAgICpjb25maWRlbmNlID0gMC4yOworCisgICAgICAgIG9mZjY0X3QgKm9mZlB0ciA9IChvZmY2NF90KikgbWFsbG9jKHNpemVvZihvZmY2NF90KSk7CisgICAgICAgICpvZmZQdHIgPSBwb3M7CisgICAgICAgICptZXRhID0gb2ZmUHRyOworICAgICAgICAqZnJlZU1ldGEgPSA6OmZyZWU7CisKKyAgICAgICAgcmV0dXJuIENyZWF0ZUV4dHJhY3RvcjsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworCitleHRlcm4gIkMiIHsKKy8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKK19fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKK01lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworICAgIHJldHVybiB7CisgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgVVVJRCgiNGZkODBlYWUtMDNkMi00ZDcyLTllYjktNDhmYTZiYjU0NjEzIiksCisgICAgICAgIDEsIC8vIHZlcnNpb24KKyAgICAgICAgIkFBQyBFeHRyYWN0b3IiLAorICAgICAgICBTbmlmZgorICAgIH07Cit9CisKK30gLy8gZXh0ZXJuICJDIgorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FBQ0V4dHJhY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYWRiZWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuaApAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBQUNfRVhUUkFDVE9SX0hfCisKKyNkZWZpbmUgQUFDX0VYVFJBQ1RPUl9IXworCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKworI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBTWVzc2FnZTsKK2NsYXNzIFN0cmluZzg7CisKK2NsYXNzIEFBQ0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CitwdWJsaWM6CisgICAgQUFDRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0KTsKKworICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiQUFDRXh0cmFjdG9yIjsgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QUFDRXh0cmFjdG9yKCk7CisKK3ByaXZhdGU6CisgICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIE1ldGFEYXRhQmFzZSBtTWV0YTsKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworCisgICAgVmVjdG9yPHVpbnQ2NF90PiBtT2Zmc2V0VmVjdG9yOworICAgIGludDY0X3QgbUZyYW1lRHVyYXRpb25VczsKKworICAgIEFBQ0V4dHJhY3Rvcihjb25zdCBBQUNFeHRyYWN0b3IgJik7CisgICAgQUFDRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgQUFDRXh0cmFjdG9yICYpOworfTsKKworYm9vbCBTbmlmZkFBQygKKyAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLCBvZmY2NF90ICpvZmZzZXQpOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFBQ19FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMDViNDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDMgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKworICAgIHNyY3M6IFsiQUFDRXh0cmFjdG9yLmNwcCJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0LyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgbmFtZTogImxpYmFhY2V4dHJhY3RvciIsCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiZXh0cmFjdG9ycyIsCisKKyAgICBjb21waWxlX211bHRpbGliOiAiZmlyc3QiLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAorICAgIF0sCisgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBkaWFnOiB7CisgICAgICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpyZW5hbWUgdG8gbWVkaWEvZXh0cmFjdG9ycy9hYWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL05PVElDRSBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL05PVElDRQpyZW5hbWUgdG8gbWVkaWEvZXh0cmFjdG9ycy9hYWMvTk9USUNFCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9leHBvcnRzLmxkcyBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMzA5ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9leHBvcnRzLmxkcwpAQCAtMCwwICsxIEBACit7IGdsb2JhbDogR0VURVhUUkFDVE9SREVGOyBsb2NhbDogKjsgfTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FNUkV4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NmQ1ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuY3BwCkBAIC0wLDAgKzEsMzkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBTVJFeHRyYWN0b3IiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJBTVJFeHRyYWN0b3IuaCIKKworI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQU1SU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworcHVibGljOgorICAgIEFNUlNvdXJjZSgKKyAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgICAgICBib29sIGlzV2lkZSwKKyAgICAgICAgICAgIGNvbnN0IG9mZjY0X3QgKm9mZnNldF90YWJsZSwKKyAgICAgICAgICAgIHNpemVfdCBvZmZzZXRfdGFibGVfbGVuZ3RoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkFNUlNvdXJjZSgpOworCitwcml2YXRlOgorICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBNZXRhRGF0YUJhc2UgbU1ldGE7CisgICAgYm9vbCBtSXNXaWRlOworCisgICAgb2ZmNjRfdCBtT2Zmc2V0OworICAgIGludDY0X3QgbUN1cnJlbnRUaW1lVXM7CisgICAgYm9vbCBtU3RhcnRlZDsKKyAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CisKKyAgICBvZmY2NF90IG1PZmZzZXRUYWJsZVtPRkZTRVRfVEFCTEVfTEVOXTsKKyAgICBzaXplX3QgbU9mZnNldFRhYmxlTGVuZ3RoOworCisgICAgQU1SU291cmNlKGNvbnN0IEFNUlNvdXJjZSAmKTsKKyAgICBBTVJTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBBTVJTb3VyY2UgJik7Cit9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgc2l6ZV90IGdldEZyYW1lU2l6ZShib29sIGlzV2lkZSwgdW5zaWduZWQgRlQpIHsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtGcmFtZVNpemVOQlsxNl0gPSB7CisgICAgICAgIDk1LCAxMDMsIDExOCwgMTM0LCAxNDgsIDE1OSwgMjA0LCAyNDQsCisgICAgICAgIDM5LCA0MywgMzgsIDM3LCAvLyBTSUQKKyAgICAgICAgMCwgMCwgMCwgLy8gZnV0dXJlIHVzZQorICAgICAgICAwIC8vIG5vIGRhdGEKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0ZyYW1lU2l6ZVdCWzE2XSA9IHsKKyAgICAgICAgMTMyLCAxNzcsIDI1MywgMjg1LCAzMTcsIDM2NSwgMzk3LCA0NjEsIDQ3NywKKyAgICAgICAgNDAsIC8vIFNJRAorICAgICAgICAwLCAwLCAwLCAwLCAvLyBmdXR1cmUgdXNlCisgICAgICAgIDAsIC8vIHNwZWVjaCBsb3N0CisgICAgICAgIDAgLy8gbm8gZGF0YQorICAgIH07CisKKyAgICBpZiAoRlQgPiAxNSB8fCAoaXNXaWRlICYmIEZUID4gOSAmJiBGVCA8IDE0KSB8fCAoIWlzV2lkZSAmJiBGVCA+IDExICYmIEZUIDwgMTUpKSB7CisgICAgICAgIEFMT0dFKCJpbGxlZ2FsIEFNUiBmcmFtZSB0eXBlICVkIiwgRlQpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzaXplX3QgZnJhbWVTaXplID0gaXNXaWRlID8ga0ZyYW1lU2l6ZVdCW0ZUXSA6IGtGcmFtZVNpemVOQltGVF07CisKKyAgICAvLyBSb3VuZCB1cCBiaXRzIHRvIGJ5dGVzIGFuZCBhZGQgMSBmb3IgdGhlIGhlYWRlciBieXRlLgorICAgIGZyYW1lU2l6ZSA9IChmcmFtZVNpemUgKyA3KSAvIDggKyAxOworCisgICAgcmV0dXJuIGZyYW1lU2l6ZTsKK30KKworc3RhdGljIHN0YXR1c190IGdldEZyYW1lU2l6ZUJ5T2Zmc2V0KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCBib29sIGlzV2lkZSwgc2l6ZV90ICpmcmFtZVNpemUpIHsKKyAgICB1aW50OF90IGhlYWRlcjsKKyAgICBzc2l6ZV90IGNvdW50ID0gc291cmNlLT5yZWFkQXQob2Zmc2V0LCAmaGVhZGVyLCAxKTsKKyAgICBpZiAoY291bnQgPT0gMCkgeworICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9IGVsc2UgaWYgKGNvdW50IDwgMCkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorCisgICAgdW5zaWduZWQgRlQgPSAoaGVhZGVyID4+IDMpICYgMHgwZjsKKworICAgICpmcmFtZVNpemUgPSBnZXRGcmFtZVNpemUoaXNXaWRlLCBGVCk7CisgICAgaWYgKCpmcmFtZVNpemUgPT0gMCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXRpYyBib29sIFNuaWZmQU1SKAorICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBib29sICppc1dpZGUsIGZsb2F0ICpjb25maWRlbmNlKSB7CisgICAgY2hhciBoZWFkZXJbOV07CisKKyAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgIT0gc2l6ZW9mKGhlYWRlcikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghbWVtY21wKGhlYWRlciwgIiMhQU1SXG4iLCA2KSkgeworICAgICAgICBpZiAoaXNXaWRlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICppc1dpZGUgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAqY29uZmlkZW5jZSA9IDAuNTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCFtZW1jbXAoaGVhZGVyLCAiIyFBTVItV0JcbiIsIDkpKSB7CisgICAgICAgIGlmIChpc1dpZGUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgKmlzV2lkZSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgKmNvbmZpZGVuY2UgPSAwLjU7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitBTVJFeHRyYWN0b3I6OkFNUkV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKKyAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCisgICAgICBtT2Zmc2V0VGFibGVMZW5ndGgoMCkgeworICAgIGZsb2F0IGNvbmZpZGVuY2U7CisgICAgaWYgKCFTbmlmZkFNUihtRGF0YVNvdXJjZSwgJm1Jc1dpZGUsICZjb25maWRlbmNlKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbU1ldGEuc2V0Q1N0cmluZygKKyAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgbUlzV2lkZSA/IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CKTsKKworICAgIG1NZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIDEpOworICAgIG1NZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtSXNXaWRlID8gMTYwMDAgOiA4MDAwKTsKKworICAgIG9mZjY0X3Qgb2Zmc2V0ID0gbUlzV2lkZSA/IDkgOiA2OworICAgIG9mZjY0X3Qgc3RyZWFtU2l6ZTsKKyAgICBzaXplX3QgZnJhbWVTaXplLCBudW1GcmFtZXMgPSAwOworICAgIGludDY0X3QgZHVyYXRpb24gPSAwOworCisgICAgaWYgKG1EYXRhU291cmNlLT5nZXRTaXplKCZzdHJlYW1TaXplKSA9PSBPSykgeworICAgICAgICAgd2hpbGUgKG9mZnNldCA8IHN0cmVhbVNpemUpIHsKKyAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRGcmFtZVNpemVCeU9mZnNldChzb3VyY2UsIG9mZnNldCwgbUlzV2lkZSwgJmZyYW1lU2l6ZSk7CisgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKG51bUZyYW1lcyAlIDUwID09IDApICYmIChudW1GcmFtZXMgLyA1MCA8IE9GRlNFVF9UQUJMRV9MRU4pKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobU9mZnNldFRhYmxlTGVuZ3RoLCBudW1GcmFtZXMgLyA1MCk7CisgICAgICAgICAgICAgICAgbU9mZnNldFRhYmxlW21PZmZzZXRUYWJsZUxlbmd0aF0gPSBvZmZzZXQgLSAobUlzV2lkZSA/IDk6IDYpOworICAgICAgICAgICAgICAgIG1PZmZzZXRUYWJsZUxlbmd0aCArKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb2Zmc2V0ICs9IGZyYW1lU2l6ZTsKKyAgICAgICAgICAgIGR1cmF0aW9uICs9IDIwMDAwOyAgLy8gRWFjaCBmcmFtZSBpcyAyMG1zCisgICAgICAgICAgICBudW1GcmFtZXMgKys7CisgICAgICAgIH0KKworICAgICAgICBtTWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uKTsKKyAgICB9CisKKyAgICBtSW5pdENoZWNrID0gT0s7Cit9CisKK0FNUkV4dHJhY3Rvcjo6fkFNUkV4dHJhY3RvcigpIHsKK30KKworc3RhdHVzX3QgQU1SRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKKyAgICBtZXRhLmNsZWFyKCk7CisKKyAgICBpZiAobUluaXRDaGVjayA9PSBPSykgeworICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtSXNXaWRlID8gImF1ZGlvL2Ftci13YiIgOiAiYXVkaW8vYW1yIik7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzaXplX3QgQU1SRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKKyAgICByZXR1cm4gbUluaXRDaGVjayA9PSBPSyA/IDEgOiAwOworfQorCitNZWRpYVRyYWNrICpBTVJFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBBTVJTb3VyY2UobURhdGFTb3VyY2UsIG1NZXRhLCBtSXNXaWRlLAorICAgICAgICAgICAgbU9mZnNldFRhYmxlLCBtT2Zmc2V0VGFibGVMZW5ndGgpOworfQorCitzdGF0dXNfdCBBTVJFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBtZXRhID0gbU1ldGE7CisgICAgcmV0dXJuIE9LOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitBTVJTb3VyY2U6OkFNUlNvdXJjZSgKKyAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICBib29sIGlzV2lkZSwgY29uc3Qgb2ZmNjRfdCAqb2Zmc2V0X3RhYmxlLCBzaXplX3Qgb2Zmc2V0X3RhYmxlX2xlbmd0aCkKKyAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCisgICAgICBtTWV0YShtZXRhKSwKKyAgICAgIG1Jc1dpZGUoaXNXaWRlKSwKKyAgICAgIG1PZmZzZXQobUlzV2lkZSA/IDkgOiA2KSwKKyAgICAgIG1DdXJyZW50VGltZVVzKDApLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbUdyb3VwKE5VTEwpLAorICAgICAgbU9mZnNldFRhYmxlTGVuZ3RoKG9mZnNldF90YWJsZV9sZW5ndGgpIHsKKyAgICBpZiAobU9mZnNldFRhYmxlTGVuZ3RoID4gMCAmJiBtT2Zmc2V0VGFibGVMZW5ndGggPD0gT0ZGU0VUX1RBQkxFX0xFTikgeworICAgICAgICBtZW1jcHkgKChjaGFyKiltT2Zmc2V0VGFibGUsIChjaGFyKilvZmZzZXRfdGFibGUsIHNpemVvZihvZmY2NF90KSAqIG1PZmZzZXRUYWJsZUxlbmd0aCk7CisgICAgfQorfQorCitBTVJTb3VyY2U6On5BTVJTb3VyY2UoKSB7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIHN0b3AoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEFNUlNvdXJjZTo6c3RhcnQoTWV0YURhdGFCYXNlICogLyogcGFyYW1zICovKSB7CisgICAgQ0hFQ0soIW1TdGFydGVkKTsKKworICAgIG1PZmZzZXQgPSBtSXNXaWRlID8gOSA6IDY7CisgICAgbUN1cnJlbnRUaW1lVXMgPSAwOworICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOworICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZSgxMjgpKTsKKyAgICBtU3RhcnRlZCA9IHRydWU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFNUlNvdXJjZTo6c3RvcCgpIHsKKyAgICBDSEVDSyhtU3RhcnRlZCk7CisKKyAgICBkZWxldGUgbUdyb3VwOworICAgIG1Hcm91cCA9IE5VTEw7CisKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQU1SU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7CisgICAgbWV0YSA9IG1NZXRhOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQU1SU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgKm91dCA9IE5VTEw7CisKKyAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CisgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CisgICAgaWYgKG1PZmZzZXRUYWJsZUxlbmd0aCA+IDAgJiYgb3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgeworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgaW50NjRfdCBzZWVrRnJhbWUgPSBzZWVrVGltZVVzIC8gMjAwMDBsbDsgIC8vIDIwbXMgcGVyIGZyYW1lLgorICAgICAgICBtQ3VycmVudFRpbWVVcyA9IHNlZWtGcmFtZSAqIDIwMDAwbGw7CisKKyAgICAgICAgc2l6ZV90IGluZGV4ID0gc2Vla0ZyYW1lIDwgMCA/IDAgOiBzZWVrRnJhbWUgLyA1MDsKKyAgICAgICAgaWYgKGluZGV4ID49IG1PZmZzZXRUYWJsZUxlbmd0aCkgeworICAgICAgICAgICAgaW5kZXggPSBtT2Zmc2V0VGFibGVMZW5ndGggLSAxOworICAgICAgICB9CisKKyAgICAgICAgbU9mZnNldCA9IG1PZmZzZXRUYWJsZVtpbmRleF0gKyAobUlzV2lkZSA/IDkgOiA2KTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaTwgc2Vla0ZyYW1lIC0gaW5kZXggKiA1MDsgaSsrKSB7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgICAgICBpZiAoKGVyciA9IGdldEZyYW1lU2l6ZUJ5T2Zmc2V0KG1EYXRhU291cmNlLCBtT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jc1dpZGUsICZzaXplKSkgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU9mZnNldCArPSBzaXplOworICAgICAgICB9CisgICAgfQorCisgICAgdWludDhfdCBoZWFkZXI7CisgICAgc3NpemVfdCBuID0gbURhdGFTb3VyY2UtPnJlYWRBdChtT2Zmc2V0LCAmaGVhZGVyLCAxKTsKKworICAgIGlmIChuIDwgMSkgeworICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9CisKKyAgICBpZiAoaGVhZGVyICYgMHg4MykgeworICAgICAgICAvLyBQYWRkaW5nIGJpdHMgbXVzdCBiZSAwLgorCisgICAgICAgIEFMT0dFKCJwYWRkaW5nIGJpdHMgbXVzdCBiZSAwLCBoZWFkZXIgaXMgMHglMDJ4IiwgaGVhZGVyKTsKKworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVuc2lnbmVkIEZUID0gKGhlYWRlciA+PiAzKSAmIDB4MGY7CisKKyAgICBzaXplX3QgZnJhbWVTaXplID0gZ2V0RnJhbWVTaXplKG1Jc1dpZGUsIEZUKTsKKyAgICBpZiAoZnJhbWVTaXplID09IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKKyAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBuID0gbURhdGFTb3VyY2UtPnJlYWRBdChtT2Zmc2V0LCBidWZmZXItPmRhdGEoKSwgZnJhbWVTaXplKTsKKworICAgIGlmIChuICE9IChzc2l6ZV90KWZyYW1lU2l6ZSkgeworICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgYnVmZmVyID0gTlVMTDsKKworICAgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG9ubHkgcGFydGlhbCBmcmFtZSBpcyBhdmFpbGFibGUsIHRyZWF0IGl0IGFzIEVPUy4KKyAgICAgICAgICAgIG1PZmZzZXQgKz0gbjsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICB9CisgICAgfQorCisgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZnJhbWVTaXplKTsKKyAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCBtQ3VycmVudFRpbWVVcyk7CisgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworCisgICAgbU9mZnNldCArPSBmcmFtZVNpemU7CisgICAgbUN1cnJlbnRUaW1lVXMgKz0gMjAwMDA7ICAvLyBFYWNoIGZyYW1lIGlzIDIwbXMKKworICAgICpvdXQgPSBidWZmZXI7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2V4dGVybiAiQyIgeworLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAorX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQorTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CisgICAgcmV0dXJuIHsKKyAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICBVVUlEKCJjODY2MzljOS0yZjMxLTQwYWMtYTcxNS1mYTAxYjQ0OTNhYWYiKSwKKyAgICAgICAgMSwKKyAgICAgICAgIkFNUiBFeHRyYWN0b3IiLAorICAgICAgICBbXSgKKyAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICAgICAgICAgIHZvaWQgKiosCisgICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSAtPiBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgeworICAgICAgICAgICAgaWYgKFNuaWZmQU1SKHNvdXJjZSwgbnVsbHB0ciwgY29uZmlkZW5jZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gW10oCisgICAgICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBNZWRpYUV4dHJhY3RvciogeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFNUkV4dHJhY3Rvcihzb3VyY2UpO307CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH07Cit9CisKK30gLy8gZXh0ZXJuICJDIgorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQU1SRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTBiMzI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQU1SRXh0cmFjdG9yLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU1SX0VYVFJBQ1RPUl9IXworCisjZGVmaW5lIEFNUl9FWFRSQUNUT1JfSF8KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFNZXNzYWdlOworY2xhc3MgU3RyaW5nODsKKyNkZWZpbmUgT0ZGU0VUX1RBQkxFX0xFTiAgICAzMDAKKworY2xhc3MgQU1SRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBBTVJFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CisKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOworICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIkFNUkV4dHJhY3RvciI7IH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkFNUkV4dHJhY3RvcigpOworCitwcml2YXRlOgorICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBNZXRhRGF0YUJhc2UgbU1ldGE7CisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKyAgICBib29sIG1Jc1dpZGU7CisKKyAgICBvZmY2NF90IG1PZmZzZXRUYWJsZVtPRkZTRVRfVEFCTEVfTEVOXTsgLy81IG1pbgorICAgIHNpemVfdCBtT2Zmc2V0VGFibGVMZW5ndGg7CisKKyAgICBBTVJFeHRyYWN0b3IoY29uc3QgQU1SRXh0cmFjdG9yICYpOworICAgIEFNUkV4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IEFNUkV4dHJhY3RvciAmKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU1SX0VYVFJBQ1RPUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk2MmI5MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0MSBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworCisgICAgc3JjczogWyJBTVJFeHRyYWN0b3IuY3BwIl0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgXSwKKworICAgIG5hbWU6ICJsaWJhbXJleHRyYWN0b3IiLAorICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImV4dHJhY3RvcnMiLAorCisgICAgY29tcGlsZV9tdWx0aWxpYjogImZpcnN0IiwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKKyAgICBdLAorICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgZGlhZzogeworICAgICAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCisKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpjb3B5IHRvIG1lZGlhL2V4dHJhY3RvcnMvYW1yL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL05PVElDRSBiL21lZGlhL2V4dHJhY3RvcnMvYW1yL05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL05PVElDRQpjb3B5IHRvIG1lZGlhL2V4dHJhY3RvcnMvYW1yL05PVElDRQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hbXIvZXhwb3J0cy5sZHMgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9leHBvcnRzLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTMwOWVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvZXhwb3J0cy5sZHMKQEAgLTAsMCArMSBAQAoreyBnbG9iYWw6IEdFVEVYVFJBQ1RPUkRFRjsgbG9jYWw6ICo7IH07CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyODI3OTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvQW5kcm9pZC5icApAQCAtMCwwICsxLDQzIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisKKyAgICBzcmNzOiBbIkZMQUNFeHRyYWN0b3IuY3BwIl0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCisgICAgICAgICJleHRlcm5hbC9mbGFjL2luY2x1ZGUiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYkZMQUMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgXSwKKworICAgIG5hbWU6ICJsaWJmbGFjZXh0cmFjdG9yIiwKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJleHRyYWN0b3JzIiwKKworICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJmaXJzdCIsCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgXSwKKyAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorCit9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNkYTI1OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmNwcApAQCAtMCwwICsxLDg4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRkxBQ0V4dHJhY3RvciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkZMQUNFeHRyYWN0b3IuaCIKKy8vIGxpYkZMQUMgcGFyc2VyCisjaW5jbHVkZSAiRkxBQy9zdHJlYW1fZGVjb2Rlci5oIgorCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvVm9yYmlzQ29tbWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBGTEFDUGFyc2VyOworCitjbGFzcyBGTEFDU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworCitwdWJsaWM6CisgICAgRkxBQ1NvdXJjZSgKKyAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAorICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5GTEFDU291cmNlKCk7CisKK3ByaXZhdGU6CisgICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIE1ldGFEYXRhQmFzZSBtVHJhY2tNZXRhZGF0YTsKKyAgICBGTEFDUGFyc2VyICptUGFyc2VyOworICAgIGJvb2wgbUluaXRDaGVjazsKKyAgICBib29sIG1TdGFydGVkOworCisgICAgLy8gbm8gY29weSBjb25zdHJ1Y3RvciBvciBhc3NpZ25tZW50CisgICAgRkxBQ1NvdXJjZShjb25zdCBGTEFDU291cmNlICYpOworICAgIEZMQUNTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBGTEFDU291cmNlICYpOworCit9OworCisvLyBGTEFDUGFyc2VyIHdyYXBzIGEgQyBsaWJGTEFDIHBhcnNlciBha2Egc3RyZWFtIGRlY29kZXIKKworY2xhc3MgRkxBQ1BhcnNlciB7CisKK3B1YmxpYzoKKyAgICBlbnVtIHsKKyAgICAgICAga01heENoYW5uZWxzID0gOCwKKyAgICB9OworCisgICAgZXhwbGljaXQgRkxBQ1BhcnNlcigKKyAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCisgICAgICAgIC8vIElmIG1ldGFkYXRhIHBvaW50ZXJzIGFyZW4ndCBwcm92aWRlZCwgd2UgZG9uJ3QgZmlsbCB0aGVtCisgICAgICAgIE1ldGFEYXRhQmFzZSAqZmlsZU1ldGFkYXRhID0gMCwKKyAgICAgICAgTWV0YURhdGFCYXNlICp0cmFja01ldGFkYXRhID0gMCk7CisKKyAgICB2aXJ0dWFsIH5GTEFDUGFyc2VyKCk7CisKKyAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIC8vIHN0cmVhbSBwcm9wZXJ0aWVzCisgICAgdW5zaWduZWQgZ2V0TWF4QmxvY2tTaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVN0cmVhbUluZm8ubWF4X2Jsb2Nrc2l6ZTsKKyAgICB9CisgICAgdW5zaWduZWQgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TdHJlYW1JbmZvLnNhbXBsZV9yYXRlOworICAgIH0KKyAgICB1bnNpZ25lZCBnZXRDaGFubmVscygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TdHJlYW1JbmZvLmNoYW5uZWxzOworICAgIH0KKyAgICB1bnNpZ25lZCBnZXRCaXRzUGVyU2FtcGxlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVN0cmVhbUluZm8uYml0c19wZXJfc2FtcGxlOworICAgIH0KKyAgICBGTEFDX191aW50NjQgZ2V0VG90YWxTYW1wbGVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVN0cmVhbUluZm8udG90YWxfc2FtcGxlczsKKyAgICB9CisKKyAgICAvLyBtZWRpYSBidWZmZXJzCisgICAgdm9pZCBhbGxvY2F0ZUJ1ZmZlcnMoKTsKKyAgICB2b2lkIHJlbGVhc2VCdWZmZXJzKCk7CisgICAgTWVkaWFCdWZmZXJCYXNlICpyZWFkQnVmZmVyKCkgeworICAgICAgICByZXR1cm4gcmVhZEJ1ZmZlcihmYWxzZSwgMExMKTsKKyAgICB9CisgICAgTWVkaWFCdWZmZXJCYXNlICpyZWFkQnVmZmVyKEZMQUNfX3VpbnQ2NCBzYW1wbGUpIHsKKyAgICAgICAgcmV0dXJuIHJlYWRCdWZmZXIodHJ1ZSwgc2FtcGxlKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIE1ldGFEYXRhQmFzZSAqbUZpbGVNZXRhZGF0YTsKKyAgICBNZXRhRGF0YUJhc2UgKm1UcmFja01ldGFkYXRhOworICAgIGJvb2wgbUluaXRDaGVjazsKKworICAgIC8vIG1lZGlhIGJ1ZmZlcnMKKyAgICBzaXplX3QgbU1heEJ1ZmZlclNpemU7CisgICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOworICAgIHZvaWQgKCptQ29weSkoc2hvcnQgKmRzdCwgY29uc3QgaW50ICogc3JjW2tNYXhDaGFubmVsc10sIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpOworCisgICAgLy8gaGFuZGxlIHRvIHVuZGVybHlpbmcgbGliRkxBQyBwYXJzZXIKKyAgICBGTEFDX19TdHJlYW1EZWNvZGVyICptRGVjb2RlcjsKKworICAgIC8vIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBkYXRhIHNvdXJjZQorICAgIG9mZjY0X3QgbUN1cnJlbnRQb3M7CisgICAgYm9vbCBtRU9GOworCisgICAgLy8gY2FjaGVkIHdoZW4gdGhlIFNUUkVBTUlORk8gbWV0YWRhdGEgaXMgcGFyc2VkIGJ5IGxpYkZMQUMKKyAgICBGTEFDX19TdHJlYW1NZXRhZGF0YV9TdHJlYW1JbmZvIG1TdHJlYW1JbmZvOworICAgIGJvb2wgbVN0cmVhbUluZm9WYWxpZDsKKworICAgIC8vIGNhY2hlZCB3aGVuIGEgZGVjb2RlZCBQQ00gYmxvY2sgaXMgIndyaXR0ZW4iIGJ5IGxpYkZMQUMgcGFyc2VyCisgICAgYm9vbCBtV3JpdGVSZXF1ZXN0ZWQ7CisgICAgYm9vbCBtV3JpdGVDb21wbGV0ZWQ7CisgICAgRkxBQ19fRnJhbWVIZWFkZXIgbVdyaXRlSGVhZGVyOworICAgIEZMQUNfX2ludDMyIGNvbnN0ICogbVdyaXRlQnVmZmVyW2tNYXhDaGFubmVsc107CisKKyAgICAvLyBtb3N0IHJlY2VudCBlcnJvciByZXBvcnRlZCBieSBsaWJGTEFDIHBhcnNlcgorICAgIEZMQUNfX1N0cmVhbURlY29kZXJFcnJvclN0YXR1cyBtRXJyb3JTdGF0dXM7CisKKyAgICBzdGF0dXNfdCBpbml0KCk7CisgICAgTWVkaWFCdWZmZXJCYXNlICpyZWFkQnVmZmVyKGJvb2wgZG9TZWVrLCBGTEFDX191aW50NjQgc2FtcGxlKTsKKworICAgIC8vIG5vIGNvcHkgY29uc3RydWN0b3Igb3IgYXNzaWdubWVudAorICAgIEZMQUNQYXJzZXIoY29uc3QgRkxBQ1BhcnNlciAmKTsKKyAgICBGTEFDUGFyc2VyICZvcGVyYXRvcj0oY29uc3QgRkxBQ1BhcnNlciAmKTsKKworICAgIC8vIEZMQUMgcGFyc2VyIGNhbGxiYWNrcyBhcyBDKysgaW5zdGFuY2UgbWV0aG9kcworICAgIEZMQUNfX1N0cmVhbURlY29kZXJSZWFkU3RhdHVzIHJlYWRDYWxsYmFjaygKKyAgICAgICAgICAgIEZMQUNfX2J5dGUgYnVmZmVyW10sIHNpemVfdCAqYnl0ZXMpOworICAgIEZMQUNfX1N0cmVhbURlY29kZXJTZWVrU3RhdHVzIHNlZWtDYWxsYmFjaygKKyAgICAgICAgICAgIEZMQUNfX3VpbnQ2NCBhYnNvbHV0ZV9ieXRlX29mZnNldCk7CisgICAgRkxBQ19fU3RyZWFtRGVjb2RlclRlbGxTdGF0dXMgdGVsbENhbGxiYWNrKAorICAgICAgICAgICAgRkxBQ19fdWludDY0ICphYnNvbHV0ZV9ieXRlX29mZnNldCk7CisgICAgRkxBQ19fU3RyZWFtRGVjb2Rlckxlbmd0aFN0YXR1cyBsZW5ndGhDYWxsYmFjaygKKyAgICAgICAgICAgIEZMQUNfX3VpbnQ2NCAqc3RyZWFtX2xlbmd0aCk7CisgICAgRkxBQ19fYm9vbCBlb2ZDYWxsYmFjaygpOworICAgIEZMQUNfX1N0cmVhbURlY29kZXJXcml0ZVN0YXR1cyB3cml0ZUNhbGxiYWNrKAorICAgICAgICAgICAgY29uc3QgRkxBQ19fRnJhbWUgKmZyYW1lLCBjb25zdCBGTEFDX19pbnQzMiAqIGNvbnN0IGJ1ZmZlcltdKTsKKyAgICB2b2lkIG1ldGFkYXRhQ2FsbGJhY2soY29uc3QgRkxBQ19fU3RyZWFtTWV0YWRhdGEgKm1ldGFkYXRhKTsKKyAgICB2b2lkIGVycm9yQ2FsbGJhY2soRkxBQ19fU3RyZWFtRGVjb2RlckVycm9yU3RhdHVzIHN0YXR1cyk7CisKKyAgICAvLyBGTEFDIHBhcnNlciBjYWxsYmFja3MgYXMgQy1jYWxsYWJsZSBmdW5jdGlvbnMKKyAgICBzdGF0aWMgRkxBQ19fU3RyZWFtRGVjb2RlclJlYWRTdGF0dXMgcmVhZF9jYWxsYmFjaygKKyAgICAgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKmRlY29kZXIsCisgICAgICAgICAgICBGTEFDX19ieXRlIGJ1ZmZlcltdLCBzaXplX3QgKmJ5dGVzLAorICAgICAgICAgICAgdm9pZCAqY2xpZW50X2RhdGEpOworICAgIHN0YXRpYyBGTEFDX19TdHJlYW1EZWNvZGVyU2Vla1N0YXR1cyBzZWVrX2NhbGxiYWNrKAorICAgICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqZGVjb2RlciwKKyAgICAgICAgICAgIEZMQUNfX3VpbnQ2NCBhYnNvbHV0ZV9ieXRlX29mZnNldCwKKyAgICAgICAgICAgIHZvaWQgKmNsaWVudF9kYXRhKTsKKyAgICBzdGF0aWMgRkxBQ19fU3RyZWFtRGVjb2RlclRlbGxTdGF0dXMgdGVsbF9jYWxsYmFjaygKKyAgICAgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKmRlY29kZXIsCisgICAgICAgICAgICBGTEFDX191aW50NjQgKmFic29sdXRlX2J5dGVfb2Zmc2V0LAorICAgICAgICAgICAgdm9pZCAqY2xpZW50X2RhdGEpOworICAgIHN0YXRpYyBGTEFDX19TdHJlYW1EZWNvZGVyTGVuZ3RoU3RhdHVzIGxlbmd0aF9jYWxsYmFjaygKKyAgICAgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKmRlY29kZXIsCisgICAgICAgICAgICBGTEFDX191aW50NjQgKnN0cmVhbV9sZW5ndGgsCisgICAgICAgICAgICB2b2lkICpjbGllbnRfZGF0YSk7CisgICAgc3RhdGljIEZMQUNfX2Jvb2wgZW9mX2NhbGxiYWNrKAorICAgICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqZGVjb2RlciwKKyAgICAgICAgICAgIHZvaWQgKmNsaWVudF9kYXRhKTsKKyAgICBzdGF0aWMgRkxBQ19fU3RyZWFtRGVjb2RlcldyaXRlU3RhdHVzIHdyaXRlX2NhbGxiYWNrKAorICAgICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqZGVjb2RlciwKKyAgICAgICAgICAgIGNvbnN0IEZMQUNfX0ZyYW1lICpmcmFtZSwgY29uc3QgRkxBQ19faW50MzIgKiBjb25zdCBidWZmZXJbXSwKKyAgICAgICAgICAgIHZvaWQgKmNsaWVudF9kYXRhKTsKKyAgICBzdGF0aWMgdm9pZCBtZXRhZGF0YV9jYWxsYmFjaygKKyAgICAgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKmRlY29kZXIsCisgICAgICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1NZXRhZGF0YSAqbWV0YWRhdGEsCisgICAgICAgICAgICB2b2lkICpjbGllbnRfZGF0YSk7CisgICAgc3RhdGljIHZvaWQgZXJyb3JfY2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICpkZWNvZGVyLAorICAgICAgICAgICAgRkxBQ19fU3RyZWFtRGVjb2RlckVycm9yU3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgIHZvaWQgKmNsaWVudF9kYXRhKTsKKworfTsKKworLy8gVGhlIEZMQUMgcGFyc2VyIGNhbGxzIG91ciBDKysgc3RhdGljIGNhbGxiYWNrcyB1c2luZyBDIGNhbGxpbmcgY29udmVudGlvbnMsCisvLyBpbnNpZGUgRkxBQ19fc3RyZWFtX2RlY29kZXJfcHJvY2Vzc191bnRpbF9lbmRfb2ZfbWV0YWRhdGEKKy8vIGFuZCBGTEFDX19zdHJlYW1fZGVjb2Rlcl9wcm9jZXNzX3NpbmdsZS4KKy8vIFdlIGltbWVkaWF0ZWx5IHRoZW4gY2FsbCBvdXIgY29ycmVzcG9uZGluZyBDKysgaW5zdGFuY2UgbWV0aG9kcworLy8gd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXIgbGlzdCwgYnV0IGRpc2NhcmQgcmVkdW5kYW50IGluZm9ybWF0aW9uLgorCitGTEFDX19TdHJlYW1EZWNvZGVyUmVhZFN0YXR1cyBGTEFDUGFyc2VyOjpyZWFkX2NhbGxiYWNrKAorICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICogLyogZGVjb2RlciAqLywgRkxBQ19fYnl0ZSBidWZmZXJbXSwKKyAgICAgICAgc2l6ZV90ICpieXRlcywgdm9pZCAqY2xpZW50X2RhdGEpCit7CisgICAgcmV0dXJuICgoRkxBQ1BhcnNlciAqKSBjbGllbnRfZGF0YSktPnJlYWRDYWxsYmFjayhidWZmZXIsIGJ5dGVzKTsKK30KKworRkxBQ19fU3RyZWFtRGVjb2RlclNlZWtTdGF0dXMgRkxBQ1BhcnNlcjo6c2Vla19jYWxsYmFjaygKKyAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqIC8qIGRlY29kZXIgKi8sCisgICAgICAgIEZMQUNfX3VpbnQ2NCBhYnNvbHV0ZV9ieXRlX29mZnNldCwgdm9pZCAqY2xpZW50X2RhdGEpCit7CisgICAgcmV0dXJuICgoRkxBQ1BhcnNlciAqKSBjbGllbnRfZGF0YSktPnNlZWtDYWxsYmFjayhhYnNvbHV0ZV9ieXRlX29mZnNldCk7Cit9CisKK0ZMQUNfX1N0cmVhbURlY29kZXJUZWxsU3RhdHVzIEZMQUNQYXJzZXI6OnRlbGxfY2FsbGJhY2soCisgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKiAvKiBkZWNvZGVyICovLAorICAgICAgICBGTEFDX191aW50NjQgKmFic29sdXRlX2J5dGVfb2Zmc2V0LCB2b2lkICpjbGllbnRfZGF0YSkKK3sKKyAgICByZXR1cm4gKChGTEFDUGFyc2VyICopIGNsaWVudF9kYXRhKS0+dGVsbENhbGxiYWNrKGFic29sdXRlX2J5dGVfb2Zmc2V0KTsKK30KKworRkxBQ19fU3RyZWFtRGVjb2Rlckxlbmd0aFN0YXR1cyBGTEFDUGFyc2VyOjpsZW5ndGhfY2FsbGJhY2soCisgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKiAvKiBkZWNvZGVyICovLAorICAgICAgICBGTEFDX191aW50NjQgKnN0cmVhbV9sZW5ndGgsIHZvaWQgKmNsaWVudF9kYXRhKQoreworICAgIHJldHVybiAoKEZMQUNQYXJzZXIgKikgY2xpZW50X2RhdGEpLT5sZW5ndGhDYWxsYmFjayhzdHJlYW1fbGVuZ3RoKTsKK30KKworRkxBQ19fYm9vbCBGTEFDUGFyc2VyOjplb2ZfY2FsbGJhY2soCisgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKiAvKiBkZWNvZGVyICovLCB2b2lkICpjbGllbnRfZGF0YSkKK3sKKyAgICByZXR1cm4gKChGTEFDUGFyc2VyICopIGNsaWVudF9kYXRhKS0+ZW9mQ2FsbGJhY2soKTsKK30KKworRkxBQ19fU3RyZWFtRGVjb2RlcldyaXRlU3RhdHVzIEZMQUNQYXJzZXI6OndyaXRlX2NhbGxiYWNrKAorICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICogLyogZGVjb2RlciAqLywgY29uc3QgRkxBQ19fRnJhbWUgKmZyYW1lLAorICAgICAgICBjb25zdCBGTEFDX19pbnQzMiAqIGNvbnN0IGJ1ZmZlcltdLCB2b2lkICpjbGllbnRfZGF0YSkKK3sKKyAgICByZXR1cm4gKChGTEFDUGFyc2VyICopIGNsaWVudF9kYXRhKS0+d3JpdGVDYWxsYmFjayhmcmFtZSwgYnVmZmVyKTsKK30KKwordm9pZCBGTEFDUGFyc2VyOjptZXRhZGF0YV9jYWxsYmFjaygKKyAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqIC8qIGRlY29kZXIgKi8sCisgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbU1ldGFkYXRhICptZXRhZGF0YSwgdm9pZCAqY2xpZW50X2RhdGEpCit7CisgICAgKChGTEFDUGFyc2VyICopIGNsaWVudF9kYXRhKS0+bWV0YWRhdGFDYWxsYmFjayhtZXRhZGF0YSk7Cit9CisKK3ZvaWQgRkxBQ1BhcnNlcjo6ZXJyb3JfY2FsbGJhY2soCisgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKiAvKiBkZWNvZGVyICovLAorICAgICAgICBGTEFDX19TdHJlYW1EZWNvZGVyRXJyb3JTdGF0dXMgc3RhdHVzLCB2b2lkICpjbGllbnRfZGF0YSkKK3sKKyAgICAoKEZMQUNQYXJzZXIgKikgY2xpZW50X2RhdGEpLT5lcnJvckNhbGxiYWNrKHN0YXR1cyk7Cit9CisKKy8vIFRoZXNlIGFyZSB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFja3Mgd2l0aCBDKysgY2FsbGluZyBjb252ZW50aW9ucworCitGTEFDX19TdHJlYW1EZWNvZGVyUmVhZFN0YXR1cyBGTEFDUGFyc2VyOjpyZWFkQ2FsbGJhY2soCisgICAgICAgIEZMQUNfX2J5dGUgYnVmZmVyW10sIHNpemVfdCAqYnl0ZXMpCit7CisgICAgc2l6ZV90IHJlcXVlc3RlZCA9ICpieXRlczsKKyAgICBzc2l6ZV90IGFjdHVhbCA9IG1EYXRhU291cmNlLT5yZWFkQXQobUN1cnJlbnRQb3MsIGJ1ZmZlciwgcmVxdWVzdGVkKTsKKyAgICBpZiAoMCA+IGFjdHVhbCkgeworICAgICAgICAqYnl0ZXMgPSAwOworICAgICAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0RFQ09ERVJfUkVBRF9TVEFUVVNfQUJPUlQ7CisgICAgfSBlbHNlIGlmICgwID09IGFjdHVhbCkgeworICAgICAgICAqYnl0ZXMgPSAwOworICAgICAgICBtRU9GID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9ERUNPREVSX1JFQURfU1RBVFVTX0VORF9PRl9TVFJFQU07CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KGFjdHVhbCA8PSByZXF1ZXN0ZWQpOworICAgICAgICAqYnl0ZXMgPSBhY3R1YWw7CisgICAgICAgIG1DdXJyZW50UG9zICs9IGFjdHVhbDsKKyAgICAgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9ERUNPREVSX1JFQURfU1RBVFVTX0NPTlRJTlVFOworICAgIH0KK30KKworRkxBQ19fU3RyZWFtRGVjb2RlclNlZWtTdGF0dXMgRkxBQ1BhcnNlcjo6c2Vla0NhbGxiYWNrKAorICAgICAgICBGTEFDX191aW50NjQgYWJzb2x1dGVfYnl0ZV9vZmZzZXQpCit7CisgICAgbUN1cnJlbnRQb3MgPSBhYnNvbHV0ZV9ieXRlX29mZnNldDsKKyAgICBtRU9GID0gZmFsc2U7CisgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9ERUNPREVSX1NFRUtfU1RBVFVTX09LOworfQorCitGTEFDX19TdHJlYW1EZWNvZGVyVGVsbFN0YXR1cyBGTEFDUGFyc2VyOjp0ZWxsQ2FsbGJhY2soCisgICAgICAgIEZMQUNfX3VpbnQ2NCAqYWJzb2x1dGVfYnl0ZV9vZmZzZXQpCit7CisgICAgKmFic29sdXRlX2J5dGVfb2Zmc2V0ID0gbUN1cnJlbnRQb3M7CisgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9ERUNPREVSX1RFTExfU1RBVFVTX09LOworfQorCitGTEFDX19TdHJlYW1EZWNvZGVyTGVuZ3RoU3RhdHVzIEZMQUNQYXJzZXI6Omxlbmd0aENhbGxiYWNrKAorICAgICAgICBGTEFDX191aW50NjQgKnN0cmVhbV9sZW5ndGgpCit7CisgICAgb2ZmNjRfdCBzaXplOworICAgIGlmIChPSyA9PSBtRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSkpIHsKKyAgICAgICAgKnN0cmVhbV9sZW5ndGggPSBzaXplOworICAgICAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0RFQ09ERVJfTEVOR1RIX1NUQVRVU19PSzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0RFQ09ERVJfTEVOR1RIX1NUQVRVU19VTlNVUFBPUlRFRDsKKyAgICB9Cit9CisKK0ZMQUNfX2Jvb2wgRkxBQ1BhcnNlcjo6ZW9mQ2FsbGJhY2soKQoreworICAgIHJldHVybiBtRU9GOworfQorCitGTEFDX19TdHJlYW1EZWNvZGVyV3JpdGVTdGF0dXMgRkxBQ1BhcnNlcjo6d3JpdGVDYWxsYmFjaygKKyAgICAgICAgY29uc3QgRkxBQ19fRnJhbWUgKmZyYW1lLCBjb25zdCBGTEFDX19pbnQzMiAqIGNvbnN0IGJ1ZmZlcltdKQoreworICAgIGlmIChtV3JpdGVSZXF1ZXN0ZWQpIHsKKyAgICAgICAgbVdyaXRlUmVxdWVzdGVkID0gZmFsc2U7CisgICAgICAgIC8vIEZMQUMgcGFyc2VyIGRvZXNuJ3QgZnJlZSBvciByZWFsbG9jIGJ1ZmZlciB1bnRpbCBuZXh0IGZyYW1lIG9yIGZpbmlzaAorICAgICAgICBtV3JpdGVIZWFkZXIgPSBmcmFtZS0+aGVhZGVyOworICAgICAgICBtZW1tb3ZlKG1Xcml0ZUJ1ZmZlciwgYnVmZmVyLCBzaXplb2YoY29uc3QgRkxBQ19faW50MzIgKiBjb25zdCkgKiBnZXRDaGFubmVscygpKTsKKyAgICAgICAgbVdyaXRlQ29tcGxldGVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9ERUNPREVSX1dSSVRFX1NUQVRVU19DT05USU5VRTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRkxBQ1BhcnNlcjo6d3JpdGVDYWxsYmFjayB1bmV4cGVjdGVkIik7CisgICAgICAgIHJldHVybiBGTEFDX19TVFJFQU1fREVDT0RFUl9XUklURV9TVEFUVVNfQUJPUlQ7CisgICAgfQorfQorCit2b2lkIEZMQUNQYXJzZXI6Om1ldGFkYXRhQ2FsbGJhY2soY29uc3QgRkxBQ19fU3RyZWFtTWV0YWRhdGEgKm1ldGFkYXRhKQoreworICAgIHN3aXRjaCAobWV0YWRhdGEtPnR5cGUpIHsKKyAgICBjYXNlIEZMQUNfX01FVEFEQVRBX1RZUEVfU1RSRUFNSU5GTzoKKyAgICAgICAgaWYgKCFtU3RyZWFtSW5mb1ZhbGlkKSB7CisgICAgICAgICAgICBtU3RyZWFtSW5mbyA9IG1ldGFkYXRhLT5kYXRhLnN0cmVhbV9pbmZvOworICAgICAgICAgICAgbVN0cmVhbUluZm9WYWxpZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiRkxBQ1BhcnNlcjo6bWV0YWRhdGFDYWxsYmFjayB1bmV4cGVjdGVkIFNUUkVBTUlORk8iKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZMQUNfX01FVEFEQVRBX1RZUEVfVk9SQklTX0NPTU1FTlQ6CisgICAgICAgIHsKKyAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtTWV0YWRhdGFfVm9yYmlzQ29tbWVudCAqdmM7CisgICAgICAgIHZjID0gJm1ldGFkYXRhLT5kYXRhLnZvcmJpc19jb21tZW50OworICAgICAgICBmb3IgKEZMQUNfX3VpbnQzMiBpID0gMDsgaSA8IHZjLT5udW1fY29tbWVudHM7ICsraSkgeworICAgICAgICAgICAgRkxBQ19fU3RyZWFtTWV0YWRhdGFfVm9yYmlzQ29tbWVudF9FbnRyeSAqdmNlOworICAgICAgICAgICAgdmNlID0gJnZjLT5jb21tZW50c1tpXTsKKyAgICAgICAgICAgIGlmIChtRmlsZU1ldGFkYXRhICE9IDAgJiYgdmNlLT5lbnRyeSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcGFyc2VWb3JiaXNDb21tZW50KG1GaWxlTWV0YWRhdGEsIChjb25zdCBjaGFyICopIHZjZS0+ZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICB2Y2UtPmxlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZMQUNfX01FVEFEQVRBX1RZUEVfUElDVFVSRToKKyAgICAgICAgaWYgKG1GaWxlTWV0YWRhdGEgIT0gMCkgeworICAgICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtTWV0YWRhdGFfUGljdHVyZSAqcCA9ICZtZXRhZGF0YS0+ZGF0YS5waWN0dXJlOworICAgICAgICAgICAgbUZpbGVNZXRhZGF0YS0+c2V0RGF0YShrS2V5QWxidW1BcnQsCisgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhOjpUWVBFX05PTkUsIHAtPmRhdGEsIHAtPmRhdGFfbGVuZ3RoKTsKKyAgICAgICAgICAgIG1GaWxlTWV0YWRhdGEtPnNldENTdHJpbmcoa0tleUFsYnVtQXJ0TUlNRSwgcC0+bWltZV90eXBlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HVygiRkxBQ1BhcnNlcjo6bWV0YWRhdGFDYWxsYmFjayB1bmV4cGVjdGVkIHR5cGUgJXUiLCBtZXRhZGF0YS0+dHlwZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBGTEFDUGFyc2VyOjplcnJvckNhbGxiYWNrKEZMQUNfX1N0cmVhbURlY29kZXJFcnJvclN0YXR1cyBzdGF0dXMpCit7CisgICAgQUxPR0UoIkZMQUNQYXJzZXI6OmVycm9yQ2FsbGJhY2sgc3RhdHVzPSVkIiwgc3RhdHVzKTsKKyAgICBtRXJyb3JTdGF0dXMgPSBzdGF0dXM7Cit9CisKKy8vIENvcHkgc2FtcGxlcyBmcm9tIEZMQUMgbmF0aXZlIDMyLWJpdCBub24taW50ZXJsZWF2ZWQgdG8gMTYtYml0IGludGVybGVhdmVkLgorLy8gVGhlc2UgYXJlIGNhbmRpZGF0ZXMgZm9yIG9wdGltaXphdGlvbiBpZiBuZWVkZWQuCisKK3N0YXRpYyB2b2lkIGNvcHlNb25vOCgKKyAgICAgICAgc2hvcnQgKmRzdCwKKyAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sCisgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAorICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgeworICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPDwgODsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlTdGVyZW84KAorICAgICAgICBzaG9ydCAqZHN0LAorICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwKKyAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCisgICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgeworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7CisgICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA8PCA4OworICAgICAgICAqZHN0KysgPSBzcmNbMV1baV0gPDwgODsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlNdWx0aUNoOChzaG9ydCAqZHN0LCBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscykKK3sKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKKyAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXSA8PCA4OworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb3B5TW9ubzE2KAorICAgICAgICBzaG9ydCAqZHN0LAorICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwKKyAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCisgICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgeworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7CisgICAgICAgICpkc3QrKyA9IHNyY1swXVtpXTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlTdGVyZW8xNigKKyAgICAgICAgc2hvcnQgKmRzdCwKKyAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sCisgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAorICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgeworICAgICAgICAqZHN0KysgPSBzcmNbMF1baV07CisgICAgICAgICpkc3QrKyA9IHNyY1sxXVtpXTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlNdWx0aUNoMTYoc2hvcnQgKmRzdCwgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpCit7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7CisgICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV07CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIDI0LWJpdCB2ZXJzaW9ucyBzaG91bGQgZG8gZGl0aGVyaW5nIG9yIG5vaXNlLXNoYXBpbmcsIGhlcmUgb3IgaW4gQXVkaW9GbGluZ2VyCisKK3N0YXRpYyB2b2lkIGNvcHlNb25vMjQoCisgICAgICAgIHNob3J0ICpkc3QsCisgICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLAorICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKKyAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKKyAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldID4+IDg7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb3B5U3RlcmVvMjQoCisgICAgICAgIHNob3J0ICpkc3QsCisgICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLAorICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKKyAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKKyAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldID4+IDg7CisgICAgICAgICpkc3QrKyA9IHNyY1sxXVtpXSA+PiA4OworICAgIH0KK30KKworc3RhdGljIHZvaWQgY29weU11bHRpQ2gyNChzaG9ydCAqZHN0LCBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscykKK3sKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKKyAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXSA+PiA4OworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb3B5VHJlc3Bhc3MoCisgICAgICAgIHNob3J0ICogLyogZHN0ICovLAorICAgICAgICBjb25zdCBpbnQgKltGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdIC8qIHNyYyAqLywKKyAgICAgICAgdW5zaWduZWQgLyogblNhbXBsZXMgKi8sCisgICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgeworICAgIFRSRVNQQVNTKCk7Cit9CisKKy8vIEZMQUNQYXJzZXIKKworRkxBQ1BhcnNlcjo6RkxBQ1BhcnNlcigKKyAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCisgICAgICAgIE1ldGFEYXRhQmFzZSAqZmlsZU1ldGFkYXRhLAorICAgICAgICBNZXRhRGF0YUJhc2UgKnRyYWNrTWV0YWRhdGEpCisgICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKKyAgICAgIG1GaWxlTWV0YWRhdGEoZmlsZU1ldGFkYXRhKSwKKyAgICAgIG1UcmFja01ldGFkYXRhKHRyYWNrTWV0YWRhdGEpLAorICAgICAgbUluaXRDaGVjayhmYWxzZSksCisgICAgICBtTWF4QnVmZmVyU2l6ZSgwKSwKKyAgICAgIG1Hcm91cChOVUxMKSwKKyAgICAgIG1Db3B5KGNvcHlUcmVzcGFzcyksCisgICAgICBtRGVjb2RlcihOVUxMKSwKKyAgICAgIG1DdXJyZW50UG9zKDBMTCksCisgICAgICBtRU9GKGZhbHNlKSwKKyAgICAgIG1TdHJlYW1JbmZvVmFsaWQoZmFsc2UpLAorICAgICAgbVdyaXRlUmVxdWVzdGVkKGZhbHNlKSwKKyAgICAgIG1Xcml0ZUNvbXBsZXRlZChmYWxzZSksCisgICAgICBtRXJyb3JTdGF0dXMoKEZMQUNfX1N0cmVhbURlY29kZXJFcnJvclN0YXR1cykgLTEpCit7CisgICAgQUxPR1YoIkZMQUNQYXJzZXI6OkZMQUNQYXJzZXIiKTsKKyAgICBtZW1zZXQoJm1TdHJlYW1JbmZvLCAwLCBzaXplb2YobVN0cmVhbUluZm8pKTsKKyAgICBtZW1zZXQoJm1Xcml0ZUhlYWRlciwgMCwgc2l6ZW9mKG1Xcml0ZUhlYWRlcikpOworICAgIG1Jbml0Q2hlY2sgPSBpbml0KCk7Cit9CisKK0ZMQUNQYXJzZXI6On5GTEFDUGFyc2VyKCkKK3sKKyAgICBBTE9HVigiRkxBQ1BhcnNlcjo6fkZMQUNQYXJzZXIiKTsKKyAgICBpZiAobURlY29kZXIgIT0gTlVMTCkgeworICAgICAgICBGTEFDX19zdHJlYW1fZGVjb2Rlcl9kZWxldGUobURlY29kZXIpOworICAgICAgICBtRGVjb2RlciA9IE5VTEw7CisgICAgfQorfQorCitzdGF0dXNfdCBGTEFDUGFyc2VyOjppbml0KCkKK3sKKyAgICAvLyBzZXR1cCBsaWJGTEFDIHBhcnNlcgorICAgIG1EZWNvZGVyID0gRkxBQ19fc3RyZWFtX2RlY29kZXJfbmV3KCk7CisgICAgaWYgKG1EZWNvZGVyID09IE5VTEwpIHsKKyAgICAgICAgLy8gVGhlIG5ldyBzaG91bGQgc3VjY2VlZCwgc2luY2UgcHJvYmFibHkgYWxsIGl0IGRvZXMgaXMgYSBtYWxsb2MKKyAgICAgICAgLy8gdGhhdCBhbHdheXMgc3VjY2VlZHMgaW4gQW5kcm9pZC4gIEJ1dCB0byBhdm9pZCBkZXBlbmRlbmNlIG9uIHRoZQorICAgICAgICAvLyBsaWJGTEFDIGludGVybmFscywgd2UgY2hlY2sgYW5kIGxvZyBoZXJlLgorICAgICAgICBBTE9HRSgibmV3IGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgRkxBQ19fc3RyZWFtX2RlY29kZXJfc2V0X21kNV9jaGVja2luZyhtRGVjb2RlciwgZmFsc2UpOworICAgIEZMQUNfX3N0cmVhbV9kZWNvZGVyX3NldF9tZXRhZGF0YV9pZ25vcmVfYWxsKG1EZWNvZGVyKTsKKyAgICBGTEFDX19zdHJlYW1fZGVjb2Rlcl9zZXRfbWV0YWRhdGFfcmVzcG9uZCgKKyAgICAgICAgICAgIG1EZWNvZGVyLCBGTEFDX19NRVRBREFUQV9UWVBFX1NUUkVBTUlORk8pOworICAgIEZMQUNfX3N0cmVhbV9kZWNvZGVyX3NldF9tZXRhZGF0YV9yZXNwb25kKAorICAgICAgICAgICAgbURlY29kZXIsIEZMQUNfX01FVEFEQVRBX1RZUEVfUElDVFVSRSk7CisgICAgRkxBQ19fc3RyZWFtX2RlY29kZXJfc2V0X21ldGFkYXRhX3Jlc3BvbmQoCisgICAgICAgICAgICBtRGVjb2RlciwgRkxBQ19fTUVUQURBVEFfVFlQRV9WT1JCSVNfQ09NTUVOVCk7CisgICAgRkxBQ19fU3RyZWFtRGVjb2RlckluaXRTdGF0dXMgaW5pdFN0YXR1czsKKyAgICBpbml0U3RhdHVzID0gRkxBQ19fc3RyZWFtX2RlY29kZXJfaW5pdF9zdHJlYW0oCisgICAgICAgICAgICBtRGVjb2RlciwKKyAgICAgICAgICAgIHJlYWRfY2FsbGJhY2ssIHNlZWtfY2FsbGJhY2ssIHRlbGxfY2FsbGJhY2ssCisgICAgICAgICAgICBsZW5ndGhfY2FsbGJhY2ssIGVvZl9jYWxsYmFjaywgd3JpdGVfY2FsbGJhY2ssCisgICAgICAgICAgICBtZXRhZGF0YV9jYWxsYmFjaywgZXJyb3JfY2FsbGJhY2ssICh2b2lkICopIHRoaXMpOworICAgIGlmIChpbml0U3RhdHVzICE9IEZMQUNfX1NUUkVBTV9ERUNPREVSX0lOSVRfU1RBVFVTX09LKSB7CisgICAgICAgIC8vIEEgZmFpbHVyZSBoZXJlIHByb2JhYmx5IGluZGljYXRlcyBhIHByb2dyYW1taW5nIGVycm9yIGFuZCBzbyBpcworICAgICAgICAvLyB1bmxpa2VseSB0byBoYXBwZW4uIEJ1dCB3ZSBjaGVjayBhbmQgbG9nIGhlcmUgc2ltaWxhcmx5IHRvIGFib3ZlLgorICAgICAgICBBTE9HRSgiaW5pdF9zdHJlYW0gZmFpbGVkICVkIiwgaW5pdFN0YXR1cyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICAvLyBwYXJzZSBhbGwgbWV0YWRhdGEKKyAgICBpZiAoIUZMQUNfX3N0cmVhbV9kZWNvZGVyX3Byb2Nlc3NfdW50aWxfZW5kX29mX21ldGFkYXRhKG1EZWNvZGVyKSkgeworICAgICAgICBBTE9HRSgiZW5kX29mX21ldGFkYXRhIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaWYgKG1TdHJlYW1JbmZvVmFsaWQpIHsKKyAgICAgICAgLy8gY2hlY2sgY2hhbm5lbCBjb3VudAorICAgICAgICBpZiAoZ2V0Q2hhbm5lbHMoKSA9PSAwIHx8IGdldENoYW5uZWxzKCkgPiBrTWF4Q2hhbm5lbHMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ1bnN1cHBvcnRlZCBjaGFubmVsIGNvdW50ICV1IiwgZ2V0Q2hhbm5lbHMoKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorICAgICAgICAvLyBjaGVjayBiaXQgZGVwdGgKKyAgICAgICAgc3dpdGNoIChnZXRCaXRzUGVyU2FtcGxlKCkpIHsKKyAgICAgICAgY2FzZSA4OgorICAgICAgICBjYXNlIDE2OgorICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgidW5zdXBwb3J0ZWQgYml0cyBwZXIgc2FtcGxlICV1IiwgZ2V0Qml0c1BlclNhbXBsZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisgICAgICAgIC8vIGNoZWNrIHNhbXBsZSByYXRlCisgICAgICAgIHN3aXRjaCAoZ2V0U2FtcGxlUmF0ZSgpKSB7CisgICAgICAgIGNhc2UgIDgwMDA6CisgICAgICAgIGNhc2UgMTEwMjU6CisgICAgICAgIGNhc2UgMTIwMDA6CisgICAgICAgIGNhc2UgMTYwMDA6CisgICAgICAgIGNhc2UgMjIwNTA6CisgICAgICAgIGNhc2UgMjQwMDA6CisgICAgICAgIGNhc2UgMzIwMDA6CisgICAgICAgIGNhc2UgNDQxMDA6CisgICAgICAgIGNhc2UgNDgwMDA6CisgICAgICAgIGNhc2UgODgyMDA6CisgICAgICAgIGNhc2UgOTYwMDA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJ1bnN1cHBvcnRlZCBzYW1wbGUgcmF0ZSAldSIsIGdldFNhbXBsZVJhdGUoKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorICAgICAgICAvLyBjb25maWd1cmUgdGhlIGFwcHJvcHJpYXRlIGNvcHkgZnVuY3Rpb24sIGRlZmF1bHRpbmcgdG8gdHJlc3Bhc3MKKyAgICAgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgICAgICB1bnNpZ25lZCBtQ2hhbm5lbHM7CisgICAgICAgICAgICB1bnNpZ25lZCBtQml0c1BlclNhbXBsZTsKKyAgICAgICAgICAgIHZvaWQgKCptQ29weSkoc2hvcnQgKmRzdCwgY29uc3QgaW50ICogc3JjW2tNYXhDaGFubmVsc10sIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpOworICAgICAgICB9IHRhYmxlW10gPSB7CisgICAgICAgICAgICB7IDEsICA4LCBjb3B5TW9ubzggICAgfSwKKyAgICAgICAgICAgIHsgMiwgIDgsIGNvcHlTdGVyZW84ICB9LAorICAgICAgICAgICAgeyA4LCAgOCwgY29weU11bHRpQ2g4ICB9LAorICAgICAgICAgICAgeyAxLCAxNiwgY29weU1vbm8xNiAgIH0sCisgICAgICAgICAgICB7IDIsIDE2LCBjb3B5U3RlcmVvMTYgfSwKKyAgICAgICAgICAgIHsgOCwgMTYsIGNvcHlNdWx0aUNoMTYgfSwKKyAgICAgICAgICAgIHsgMSwgMjQsIGNvcHlNb25vMjQgICB9LAorICAgICAgICAgICAgeyAyLCAyNCwgY29weVN0ZXJlbzI0IH0sCisgICAgICAgICAgICB7IDgsIDI0LCBjb3B5TXVsdGlDaDI0IH0sCisgICAgICAgIH07CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplb2YodGFibGUpL3NpemVvZih0YWJsZVswXSk7ICsraSkgeworICAgICAgICAgICAgaWYgKHRhYmxlW2ldLm1DaGFubmVscyA+PSBnZXRDaGFubmVscygpICYmCisgICAgICAgICAgICAgICAgICAgIHRhYmxlW2ldLm1CaXRzUGVyU2FtcGxlID09IGdldEJpdHNQZXJTYW1wbGUoKSkgeworICAgICAgICAgICAgICAgIG1Db3B5ID0gdGFibGVbaV0ubUNvcHk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gcG9wdWxhdGUgdHJhY2sgbWV0YWRhdGEKKyAgICAgICAgaWYgKG1UcmFja01ldGFkYXRhICE9IDApIHsKKyAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKKyAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBnZXRDaGFubmVscygpKTsKKyAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgZ2V0U2FtcGxlUmF0ZSgpKTsKKyAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5UGNtRW5jb2RpbmcsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOworICAgICAgICAgICAgLy8gc2FtcGxlIHJhdGUgaXMgbm9uLXplcm8sIHNvIGRpdmlzaW9uIGJ5IHplcm8gbm90IHBvc3NpYmxlCisgICAgICAgICAgICBtVHJhY2tNZXRhZGF0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAoZ2V0VG90YWxTYW1wbGVzKCkgKiAxMDAwMDAwTEwpIC8gZ2V0U2FtcGxlUmF0ZSgpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJtaXNzaW5nIFNUUkVBTUlORk8iKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmIChtRmlsZU1ldGFkYXRhICE9IDApIHsKKyAgICAgICAgbUZpbGVNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgRkxBQ1BhcnNlcjo6YWxsb2NhdGVCdWZmZXJzKCkKK3sKKyAgICBDSEVDSyhtR3JvdXAgPT0gTlVMTCk7CisgICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7CisgICAgbU1heEJ1ZmZlclNpemUgPSBnZXRNYXhCbG9ja1NpemUoKSAqIGdldENoYW5uZWxzKCkgKiBzaXplb2Yoc2hvcnQpOworICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShtTWF4QnVmZmVyU2l6ZSkpOworfQorCit2b2lkIEZMQUNQYXJzZXI6OnJlbGVhc2VCdWZmZXJzKCkKK3sKKyAgICBDSEVDSyhtR3JvdXAgIT0gTlVMTCk7CisgICAgZGVsZXRlIG1Hcm91cDsKKyAgICBtR3JvdXAgPSBOVUxMOworfQorCitNZWRpYUJ1ZmZlckJhc2UgKkZMQUNQYXJzZXI6OnJlYWRCdWZmZXIoYm9vbCBkb1NlZWssIEZMQUNfX3VpbnQ2NCBzYW1wbGUpCit7CisgICAgbVdyaXRlUmVxdWVzdGVkID0gdHJ1ZTsKKyAgICBtV3JpdGVDb21wbGV0ZWQgPSBmYWxzZTsKKyAgICBpZiAoZG9TZWVrKSB7CisgICAgICAgIC8vIFdlIGltcGxlbWVudCB0aGUgc2VlayBjYWxsYmFjaywgc28gdGhpcyB3b3JrcyB3aXRob3V0IGV4cGxpY2l0IGZsdXNoCisgICAgICAgIGlmICghRkxBQ19fc3RyZWFtX2RlY29kZXJfc2Vla19hYnNvbHV0ZShtRGVjb2Rlciwgc2FtcGxlKSkgeworICAgICAgICAgICAgQUxPR0UoIkZMQUNQYXJzZXI6OnJlYWRCdWZmZXIgc2VlayB0byBzYW1wbGUgJWxsZCBmYWlsZWQiLCAobG9uZyBsb25nKXNhbXBsZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiRkxBQ1BhcnNlcjo6cmVhZEJ1ZmZlciBzZWVrIHRvIHNhbXBsZSAlbGxkIHN1Y2NlZWRlZCIsIChsb25nIGxvbmcpc2FtcGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIUZMQUNfX3N0cmVhbV9kZWNvZGVyX3Byb2Nlc3Nfc2luZ2xlKG1EZWNvZGVyKSkgeworICAgICAgICAgICAgQUxPR0UoIkZMQUNQYXJzZXI6OnJlYWRCdWZmZXIgcHJvY2Vzc19zaW5nbGUgZmFpbGVkIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIW1Xcml0ZUNvbXBsZXRlZCkgeworICAgICAgICBBTE9HVigiRkxBQ1BhcnNlcjo6cmVhZEJ1ZmZlciB3cml0ZSBkaWQgbm90IGNvbXBsZXRlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvLyB2ZXJpZnkgdGhhdCBibG9jayBoZWFkZXIga2VlcHMgdGhlIHByb21pc2VzIG1hZGUgYnkgU1RSRUFNSU5GTworICAgIHVuc2lnbmVkIGJsb2Nrc2l6ZSA9IG1Xcml0ZUhlYWRlci5ibG9ja3NpemU7CisgICAgaWYgKGJsb2Nrc2l6ZSA9PSAwIHx8IGJsb2Nrc2l6ZSA+IGdldE1heEJsb2NrU2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCJGTEFDUGFyc2VyOjpyZWFkQnVmZmVyIHdyaXRlIGludmFsaWQgYmxvY2tzaXplICV1IiwgYmxvY2tzaXplKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChtV3JpdGVIZWFkZXIuc2FtcGxlX3JhdGUgIT0gZ2V0U2FtcGxlUmF0ZSgpIHx8CisgICAgICAgIG1Xcml0ZUhlYWRlci5jaGFubmVscyAhPSBnZXRDaGFubmVscygpIHx8CisgICAgICAgIG1Xcml0ZUhlYWRlci5iaXRzX3Blcl9zYW1wbGUgIT0gZ2V0Qml0c1BlclNhbXBsZSgpKSB7CisgICAgICAgIEFMT0dFKCJGTEFDUGFyc2VyOjpyZWFkQnVmZmVyIHdyaXRlIGNoYW5nZWQgcGFyYW1ldGVycyBtaWQtc3RyZWFtOiAlZC8lZC8lZCAtPiAlZC8lZC8lZCIsCisgICAgICAgICAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpLCBnZXRDaGFubmVscygpLCBnZXRCaXRzUGVyU2FtcGxlKCksCisgICAgICAgICAgICAgICAgbVdyaXRlSGVhZGVyLnNhbXBsZV9yYXRlLCBtV3JpdGVIZWFkZXIuY2hhbm5lbHMsIG1Xcml0ZUhlYWRlci5iaXRzX3Blcl9zYW1wbGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLy8gYWNxdWlyZSBhIG1lZGlhIGJ1ZmZlcgorICAgIENIRUNLKG1Hcm91cCAhPSBOVUxMKTsKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKKyAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHNpemVfdCBidWZmZXJTaXplID0gYmxvY2tzaXplICogZ2V0Q2hhbm5lbHMoKSAqIHNpemVvZihzaG9ydCk7CisgICAgQ0hFQ0soYnVmZmVyU2l6ZSA8PSBtTWF4QnVmZmVyU2l6ZSk7CisgICAgc2hvcnQgKmRhdGEgPSAoc2hvcnQgKikgYnVmZmVyLT5kYXRhKCk7CisgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgYnVmZmVyU2l6ZSk7CisgICAgLy8gY29weSBQQ00gZnJvbSBGTEFDIHdyaXRlIGJ1ZmZlciB0byBvdXIgbWVkaWEgYnVmZmVyLCB3aXRoIGludGVybGVhdmluZworICAgICgqbUNvcHkpKGRhdGEsIG1Xcml0ZUJ1ZmZlciwgYmxvY2tzaXplLCBnZXRDaGFubmVscygpKTsKKyAgICAvLyBmaWxsIGluIGJ1ZmZlciBtZXRhZGF0YQorICAgIENIRUNLKG1Xcml0ZUhlYWRlci5udW1iZXJfdHlwZSA9PSBGTEFDX19GUkFNRV9OVU1CRVJfVFlQRV9TQU1QTEVfTlVNQkVSKTsKKyAgICBGTEFDX191aW50NjQgc2FtcGxlTnVtYmVyID0gbVdyaXRlSGVhZGVyLm51bWJlci5zYW1wbGVfbnVtYmVyOworICAgIGludDY0X3QgdGltZVVzID0gKDEwMDAwMDBMTCAqIHNhbXBsZU51bWJlcikgLyBnZXRTYW1wbGVSYXRlKCk7CisgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKyAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgcmV0dXJuIGJ1ZmZlcjsKK30KKworLy8gRkxBQ3NvdXJjZQorCitGTEFDU291cmNlOjpGTEFDU291cmNlKAorICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKKyAgICAgICAgTWV0YURhdGFCYXNlICZ0cmFja01ldGFkYXRhKQorICAgIDogbURhdGFTb3VyY2UoZGF0YVNvdXJjZSksCisgICAgICBtVHJhY2tNZXRhZGF0YSh0cmFja01ldGFkYXRhKSwKKyAgICAgIG1QYXJzZXIoMCksCisgICAgICBtSW5pdENoZWNrKGZhbHNlKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKQoreworICAgIEFMT0dWKCJGTEFDU291cmNlOjpGTEFDU291cmNlIik7CisgICAgLy8gcmUtdXNlIHRoZSBzYW1lIHRyYWNrIG1ldGFkYXRhIHBhc3NlZCBpbnRvIGNvbnN0cnVjdG9yIGZyb20gRkxBQ0V4dHJhY3RvcgorICAgIG1QYXJzZXIgPSBuZXcgRkxBQ1BhcnNlcihtRGF0YVNvdXJjZSk7CisgICAgbUluaXRDaGVjayAgPSBtUGFyc2VyLT5pbml0Q2hlY2soKTsKK30KKworRkxBQ1NvdXJjZTo6fkZMQUNTb3VyY2UoKQoreworICAgIEFMT0dWKCJ+RkxBQ1NvdXJjZTo6RkxBQ1NvdXJjZSIpOworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICBzdG9wKCk7CisgICAgfQorICAgIGRlbGV0ZSBtUGFyc2VyOworfQorCitzdGF0dXNfdCBGTEFDU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKiAvKiBwYXJhbXMgKi8pCit7CisgICAgQUxPR1YoIkZMQUNTb3VyY2U6OnN0YXJ0Iik7CisKKyAgICBDSEVDSyghbVN0YXJ0ZWQpOworICAgIG1QYXJzZXItPmFsbG9jYXRlQnVmZmVycygpOworICAgIG1TdGFydGVkID0gdHJ1ZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRkxBQ1NvdXJjZTo6c3RvcCgpCit7CisgICAgQUxPR1YoIkZMQUNTb3VyY2U6OnN0b3AiKTsKKworICAgIENIRUNLKG1TdGFydGVkKTsKKyAgICBtUGFyc2VyLT5yZWxlYXNlQnVmZmVycygpOworICAgIG1TdGFydGVkID0gZmFsc2U7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEZMQUNTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpCit7CisgICAgbWV0YSA9IG1UcmFja01ldGFkYXRhOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRkxBQ1NvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0QnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykKK3sKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKKyAgICAvLyBwcm9jZXNzIGFuIG9wdGlvbmFsIHNlZWsgcmVxdWVzdAorICAgIGludDY0X3Qgc2Vla1RpbWVVczsKKyAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKKyAgICBpZiAoKE5VTEwgIT0gb3B0aW9ucykgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKKyAgICAgICAgRkxBQ19fdWludDY0IHNhbXBsZTsKKyAgICAgICAgaWYgKHNlZWtUaW1lVXMgPD0gMExMKSB7CisgICAgICAgICAgICBzYW1wbGUgPSAwTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBzYW1wbGUgYW5kIHRvdGFsIHNhbXBsZXMgYXJlIGJvdGggemVyby1iYXNlZCwgYW5kIHNlZWsgdG8gRU9GIG9rCisgICAgICAgICAgICBzYW1wbGUgPSAoc2Vla1RpbWVVcyAqIG1QYXJzZXItPmdldFNhbXBsZVJhdGUoKSkgLyAxMDAwMDAwTEw7CisgICAgICAgICAgICBpZiAoc2FtcGxlID49IG1QYXJzZXItPmdldFRvdGFsU2FtcGxlcygpKSB7CisgICAgICAgICAgICAgICAgc2FtcGxlID0gbVBhcnNlci0+Z2V0VG90YWxTYW1wbGVzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyID0gbVBhcnNlci0+cmVhZEJ1ZmZlcihzYW1wbGUpOworICAgIC8vIG90aGVyd2lzZSByZWFkIHNlcXVlbnRpYWxseQorICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZmZlciA9IG1QYXJzZXItPnJlYWRCdWZmZXIoKTsKKyAgICB9CisgICAgKm91dEJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICByZXR1cm4gYnVmZmVyICE9IE5VTEwgPyAoc3RhdHVzX3QpIE9LIDogKHN0YXR1c190KSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworfQorCisvLyBGTEFDRXh0cmFjdG9yCisKK0ZMQUNFeHRyYWN0b3I6OkZMQUNFeHRyYWN0b3IoCisgICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlKQorICAgIDogbURhdGFTb3VyY2UoZGF0YVNvdXJjZSksCisgICAgICBtUGFyc2VyKG51bGxwdHIpLAorICAgICAgbUluaXRDaGVjayhmYWxzZSkKK3sKKyAgICBBTE9HVigiRkxBQ0V4dHJhY3Rvcjo6RkxBQ0V4dHJhY3RvciIpOworICAgIC8vIEZMQUNQYXJzZXIgd2lsbCBmaWxsIGluIHRoZSBtZXRhZGF0YSBmb3IgdXMKKyAgICBtUGFyc2VyID0gbmV3IEZMQUNQYXJzZXIobURhdGFTb3VyY2UsICZtRmlsZU1ldGFkYXRhLCAmbVRyYWNrTWV0YWRhdGEpOworICAgIG1Jbml0Q2hlY2sgPSBtUGFyc2VyLT5pbml0Q2hlY2soKTsKK30KKworRkxBQ0V4dHJhY3Rvcjo6fkZMQUNFeHRyYWN0b3IoKQoreworICAgIEFMT0dWKCJ+RkxBQ0V4dHJhY3Rvcjo6RkxBQ0V4dHJhY3RvciIpOworICAgIGRlbGV0ZSBtUGFyc2VyOworfQorCitzaXplX3QgRkxBQ0V4dHJhY3Rvcjo6Y291bnRUcmFja3MoKQoreworICAgIHJldHVybiBtSW5pdENoZWNrID09IE9LID8gMSA6IDA7Cit9CisKK01lZGlhVHJhY2sgKkZMQUNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkKK3sKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBuZXcgRkxBQ1NvdXJjZShtRGF0YVNvdXJjZSwgbVRyYWNrTWV0YWRhdGEpOworfQorCitzdGF0dXNfdCBGTEFDRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIG1ldGEgPSBtVHJhY2tNZXRhZGF0YTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEZMQUNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkKK3sKKyAgICBtZXRhID0gbUZpbGVNZXRhZGF0YTsKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIFNuaWZmZXIKKworYm9vbCBTbmlmZkZMQUMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpCit7CisgICAgLy8gZmlyc3QgNCBpcyB0aGUgc2lnbmF0dXJlIHdvcmQKKyAgICAvLyBzZWNvbmQgNCBpcyB0aGUgc2l6ZW9mIFNUUkVBTUlORk8KKyAgICAvLyAwNDIgaXMgdGhlIG1hbmRhdG9yeSBTVFJFQU1JTkZPCisgICAgLy8gbm8gbmVlZCB0byByZWFkIHJlc3Qgb2YgdGhlIGhlYWRlciwgYXMgYSBwcmVtYXR1cmUgRU9GIHdpbGwgYmUgY2F1Z2h0IGxhdGVyCisgICAgdWludDhfdCBoZWFkZXJbNCs0XTsKKyAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgIT0gc2l6ZW9mKGhlYWRlcikKKyAgICAgICAgICAgIHx8IG1lbWNtcCgiZkxhQ1wwXDBcMFwwNDIiLCBoZWFkZXIsIDQrNCkpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKmNvbmZpZGVuY2UgPSAwLjU7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCitleHRlcm4gIkMiIHsKKy8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKK19fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKK01lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworICAgIHJldHVybiB7CisgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgICAgIFVVSUQoIjEzNjRiMDQ4LWNjNDUtNGZkYS05OTM0LTMyN2QwZWJmOTgyOSIpLAorICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICJGTEFDIEV4dHJhY3RvciIsCisgICAgICAgICAgICBbXSgKKyAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKiosCisgICAgICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKikgLT4gTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIHsKKyAgICAgICAgICAgICAgICBpZiAoU25pZmZGTEFDKHNvdXJjZSwgY29uZmlkZW5jZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBNZWRpYUV4dHJhY3RvciogeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGTEFDRXh0cmFjdG9yKHNvdXJjZSk7fTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgIH07Cit9CisKK30gLy8gZXh0ZXJuICJDIgorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0ZMQUNFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZiNmVjNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxBQ19FWFRSQUNUT1JfSF8KKyNkZWZpbmUgRkxBQ19FWFRSQUNUT1JfSF8KKworI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRkxBQ1BhcnNlcjsKKworY2xhc3MgRkxBQ0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CisKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBGTEFDRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworCisgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJGTEFDRXh0cmFjdG9yIjsgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+RkxBQ0V4dHJhY3RvcigpOworCitwcml2YXRlOgorICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBGTEFDUGFyc2VyICptUGFyc2VyOworICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CisgICAgTWV0YURhdGFCYXNlIG1GaWxlTWV0YWRhdGE7CisKKyAgICAvLyBUaGVyZSBpcyBvbmx5IG9uZSB0cmFjaworICAgIE1ldGFEYXRhQmFzZSBtVHJhY2tNZXRhZGF0YTsKKworICAgIEZMQUNFeHRyYWN0b3IoY29uc3QgRkxBQ0V4dHJhY3RvciAmKTsKKyAgICBGTEFDRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgRkxBQ0V4dHJhY3RvciAmKTsKKworfTsKKworYm9vbCBTbmlmZkZMQUMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEZMQUNfRVhUUkFDVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKY29weSB0byBtZWRpYS9leHRyYWN0b3JzL2ZsYWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL05PVElDRSBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9OT1RJQ0UKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvTk9USUNFCmNvcHkgdG8gbWVkaWEvZXh0cmFjdG9ycy9mbGFjL05PVElDRQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL2V4cG9ydHMubGRzIGIvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMzA5ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvZXhwb3J0cy5sZHMKQEAgLTAsMCArMSBAQAoreyBnbG9iYWw6IEdFVEVYVFJBQ1RPUkRFRjsgbG9jYWw6ICo7IH07CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21pZGkvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZTA5ZGYxOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDIgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKworICAgIHNyY3M6IFsiTWlkaUV4dHJhY3Rvci5jcHAiXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJtZWRpYV9taWRpaW93cmFwcGVyIiwKKyAgICAgICAgImxpYnNvbml2b3giLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIKKyAgICBdLAorICAgIG5hbWU6ICJsaWJtaWRpZXh0cmFjdG9yIiwKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJleHRyYWN0b3JzIiwKKworICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJmaXJzdCIsCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgXSwKKyAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmNvcHkgdG8gbWVkaWEvZXh0cmFjdG9ycy9taWRpL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDlmYmUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuY3BwCkBAIC0wLDAgKzEsMzUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNaWRpRXh0cmFjdG9yIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiTWlkaUV4dHJhY3Rvci5oIgorCisjaW5jbHVkZSA8bWVkaWEvTWlkaUlvV3JhcHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgorI2luY2x1ZGUgPGxpYnNvbml2b3gvZWFzX3JldmVyYi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIGhvdyBtYW55IFNvbml2b3ggb3V0cHV0IGJ1ZmZlcnMgdG8gYWdncmVnYXRlIGludG8gb25lIE1lZGlhQnVmZmVyQmFzZQorc3RhdGljIGNvbnN0IGludCBOVU1fQ09NQklORV9CVUZGRVJTID0gNDsKKworY2xhc3MgTWlkaVNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKKworcHVibGljOgorICAgIE1pZGlTb3VyY2UoCisgICAgICAgICAgICBNaWRpRW5naW5lICZlbmdpbmUsCisgICAgICAgICAgICBNZXRhRGF0YUJhc2UgJnRyYWNrTWV0YWRhdGEpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlJik7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5NaWRpU291cmNlKCk7CisKK3ByaXZhdGU6CisgICAgTWlkaUVuZ2luZSAmbUVuZ2luZTsKKyAgICBNZXRhRGF0YUJhc2UgJm1UcmFja01ldGFkYXRhOworICAgIGJvb2wgbUluaXRDaGVjazsKKyAgICBib29sIG1TdGFydGVkOworCisgICAgc3RhdHVzX3QgaW5pdCgpOworCisgICAgLy8gbm8gY29weSBjb25zdHJ1Y3RvciBvciBhc3NpZ25tZW50CisgICAgTWlkaVNvdXJjZShjb25zdCBNaWRpU291cmNlICYpOworICAgIE1pZGlTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBNaWRpU291cmNlICYpOworCit9OworCisKKy8vIE1pZGlzb3VyY2UKKworTWlkaVNvdXJjZTo6TWlkaVNvdXJjZSgKKyAgICAgICAgTWlkaUVuZ2luZSAmZW5naW5lLAorICAgICAgICBNZXRhRGF0YUJhc2UgJnRyYWNrTWV0YWRhdGEpCisgICAgOiBtRW5naW5lKGVuZ2luZSksCisgICAgICBtVHJhY2tNZXRhZGF0YSh0cmFja01ldGFkYXRhKSwKKyAgICAgIG1Jbml0Q2hlY2soZmFsc2UpLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpCit7CisgICAgQUxPR1YoIk1pZGlTb3VyY2UgY3RvciIpOworICAgIG1Jbml0Q2hlY2sgPSBpbml0KCk7Cit9CisKK01pZGlTb3VyY2U6On5NaWRpU291cmNlKCkKK3sKKyAgICBBTE9HVigiTWlkaVNvdXJjZSBkdG9yIik7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIHN0b3AoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IE1pZGlTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykKK3sKKyAgICBBTE9HVigiTWlkaVNvdXJjZTo6c3RhcnQiKTsKKworICAgIENIRUNLKCFtU3RhcnRlZCk7CisgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgIG1FbmdpbmUuYWxsb2NhdGVCdWZmZXJzKCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNaWRpU291cmNlOjpzdG9wKCkKK3sKKyAgICBBTE9HVigiTWlkaVNvdXJjZTo6c3RvcCIpOworCisgICAgQ0hFQ0sobVN0YXJ0ZWQpOworICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgbUVuZ2luZS5yZWxlYXNlQnVmZmVycygpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNaWRpU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKQoreworICAgIG1ldGEgPSBtVHJhY2tNZXRhZGF0YTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1pZGlTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dEJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpCit7CisgICAgQUxPR1YoIk1pZGlTb3VyY2U6OnJlYWQiKTsKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKKyAgICAvLyBwcm9jZXNzIGFuIG9wdGlvbmFsIHNlZWsgcmVxdWVzdAorICAgIGludDY0X3Qgc2Vla1RpbWVVczsKKyAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKKyAgICBpZiAoKE5VTEwgIT0gb3B0aW9ucykgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKKyAgICAgICAgaWYgKHNlZWtUaW1lVXMgPD0gMExMKSB7CisgICAgICAgICAgICBzZWVrVGltZVVzID0gMExMOworICAgICAgICB9CisgICAgICAgIG1FbmdpbmUuc2Vla1RvKHNlZWtUaW1lVXMpOworICAgIH0KKyAgICBidWZmZXIgPSBtRW5naW5lLnJlYWRCdWZmZXIoKTsKKyAgICAqb3V0QnVmZmVyID0gYnVmZmVyOworICAgIEFMT0dWKCJNaWRpU291cmNlOjpyZWFkICVwIGRvbmUiLCB0aGlzKTsKKyAgICByZXR1cm4gYnVmZmVyICE9IE5VTEwgPyAoc3RhdHVzX3QpIE9LIDogKHN0YXR1c190KSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworfQorCitzdGF0dXNfdCBNaWRpU291cmNlOjppbml0KCkKK3sKKyAgICBBTE9HVigiTWlkaVNvdXJjZTo6aW5pdCIpOworICAgIHJldHVybiBPSzsKK30KKworLy8gTWlkaUVuZ2luZQorCitNaWRpRW5naW5lOjpNaWRpRW5naW5lKERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAorICAgICAgICBNZXRhRGF0YUJhc2UgKmZpbGVNZXRhZGF0YSwKKyAgICAgICAgTWV0YURhdGFCYXNlICp0cmFja01ldGFkYXRhKSA6CisgICAgICAgICAgICBtR3JvdXAoTlVMTCksCisgICAgICAgICAgICBtRWFzRGF0YShOVUxMKSwKKyAgICAgICAgICAgIG1FYXNIYW5kbGUoTlVMTCksCisgICAgICAgICAgICBtRWFzQ29uZmlnKE5VTEwpLAorICAgICAgICAgICAgbUlzSW5pdGlhbGl6ZWQoZmFsc2UpIHsKKyAgICBtSW9XcmFwcGVyID0gbmV3IE1pZGlJb1dyYXBwZXIoZGF0YVNvdXJjZSk7CisgICAgLy8gc3BpbiB1cCBhIG5ldyBFQVMgZW5naW5lCisgICAgRUFTX0kzMiB0ZW1wOworICAgIEVBU19SRVNVTFQgcmVzdWx0ID0gRUFTX0luaXQoJm1FYXNEYXRhKTsKKworICAgIGlmIChyZXN1bHQgPT0gRUFTX1NVQ0NFU1MpIHsKKyAgICAgICAgcmVzdWx0ID0gRUFTX09wZW5GaWxlKG1FYXNEYXRhLCBtSW9XcmFwcGVyLT5nZXRMb2NhdG9yKCksICZtRWFzSGFuZGxlKTsKKyAgICB9CisgICAgaWYgKHJlc3VsdCA9PSBFQVNfU1VDQ0VTUykgeworICAgICAgICByZXN1bHQgPSBFQVNfUHJlcGFyZShtRWFzRGF0YSwgbUVhc0hhbmRsZSk7CisgICAgfQorICAgIGlmIChyZXN1bHQgPT0gRUFTX1NVQ0NFU1MpIHsKKyAgICAgICAgcmVzdWx0ID0gRUFTX1BhcnNlTWV0YURhdGEobUVhc0RhdGEsIG1FYXNIYW5kbGUsICZ0ZW1wKTsKKyAgICB9CisKKyAgICBpZiAocmVzdWx0ICE9IEVBU19TVUNDRVNTKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZmlsZU1ldGFkYXRhICE9IE5VTEwpIHsKKyAgICAgICAgZmlsZU1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTUlESSk7CisgICAgfQorCisgICAgaWYgKHRyYWNrTWV0YWRhdGEgIT0gTlVMTCkgeworICAgICAgICB0cmFja01ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKKyAgICAgICAgdHJhY2tNZXRhZGF0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCAxMDAwbGwgKiB0ZW1wKTsgLy8gbWlsbGktPm1pY3JvCisgICAgICAgIG1FYXNDb25maWcgPSBFQVNfQ29uZmlnKCk7CisgICAgICAgIHRyYWNrTWV0YWRhdGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtRWFzQ29uZmlnLT5zYW1wbGVSYXRlKTsKKyAgICAgICAgdHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbUVhc0NvbmZpZy0+bnVtQ2hhbm5lbHMpOworICAgICAgICB0cmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5UGNtRW5jb2RpbmcsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOworICAgIH0KKyAgICBtSXNJbml0aWFsaXplZCA9IHRydWU7Cit9CisKK01pZGlFbmdpbmU6On5NaWRpRW5naW5lKCkgeworICAgIGlmIChtRWFzSGFuZGxlKSB7CisgICAgICAgIEVBU19DbG9zZUZpbGUobUVhc0RhdGEsIG1FYXNIYW5kbGUpOworICAgIH0KKyAgICBpZiAobUVhc0RhdGEpIHsKKyAgICAgICAgRUFTX1NodXRkb3duKG1FYXNEYXRhKTsKKyAgICB9CisgICAgZGVsZXRlIG1Hcm91cDsKKyAgICBkZWxldGUgbUlvV3JhcHBlcjsKK30KKworc3RhdHVzX3QgTWlkaUVuZ2luZTo6aW5pdENoZWNrKCkgeworICAgIHJldHVybiBtSXNJbml0aWFsaXplZCA/IE9LIDogVU5LTk9XTl9FUlJPUjsKK30KKworc3RhdHVzX3QgTWlkaUVuZ2luZTo6YWxsb2NhdGVCdWZmZXJzKCkgeworICAgIC8vIHNlbGVjdCByZXZlcmIgcHJlc2V0IGFuZCBlbmFibGUKKyAgICBFQVNfU2V0UGFyYW1ldGVyKG1FYXNEYXRhLCBFQVNfTU9EVUxFX1JFVkVSQiwgRUFTX1BBUkFNX1JFVkVSQl9QUkVTRVQsIEVBU19QQVJBTV9SRVZFUkJfQ0hBTUJFUik7CisgICAgRUFTX1NldFBhcmFtZXRlcihtRWFzRGF0YSwgRUFTX01PRFVMRV9SRVZFUkIsIEVBU19QQVJBTV9SRVZFUkJfQllQQVNTLCBFQVNfRkFMU0UpOworCisgICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7CisgICAgaW50IGJ1ZnNpemUgPSBzaXplb2YoRUFTX1BDTSkKKyAgICAgICAgICAgICogbUVhc0NvbmZpZy0+bWl4QnVmZmVyU2l6ZSAqIG1FYXNDb25maWctPm51bUNoYW5uZWxzICogTlVNX0NPTUJJTkVfQlVGRkVSUzsKKyAgICBBTE9HVigidXNpbmcgJWQgYnl0ZSBidWZmZXIiLCBidWZzaXplKTsKKyAgICBtR3JvdXAtPmFkZF9idWZmZXIoTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoYnVmc2l6ZSkpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWlkaUVuZ2luZTo6cmVsZWFzZUJ1ZmZlcnMoKSB7CisgICAgZGVsZXRlIG1Hcm91cDsKKyAgICBtR3JvdXAgPSBOVUxMOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWlkaUVuZ2luZTo6c2Vla1RvKGludDY0X3QgcG9zaXRpb25VcykgeworICAgIEFMT0dWKCJzZWVrVG8gJWxsZCIsIChsb25nIGxvbmcpcG9zaXRpb25Vcyk7CisgICAgRUFTX1JFU1VMVCByZXN1bHQgPSBFQVNfTG9jYXRlKG1FYXNEYXRhLCBtRWFzSGFuZGxlLCBwb3NpdGlvblVzIC8gMTAwMCwgZmFsc2UpOworICAgIHJldHVybiByZXN1bHQgPT0gRUFTX1NVQ0NFU1MgPyBPSyA6IFVOS05PV05fRVJST1I7Cit9CisKK01lZGlhQnVmZmVyQmFzZSogTWlkaUVuZ2luZTo6cmVhZEJ1ZmZlcigpIHsKKyAgICBFQVNfU1RBVEUgc3RhdGU7CisgICAgRUFTX1N0YXRlKG1FYXNEYXRhLCBtRWFzSGFuZGxlLCAmc3RhdGUpOworICAgIGlmICgoc3RhdGUgPT0gRUFTX1NUQVRFX1NUT1BQRUQpIHx8IChzdGF0ZSA9PSBFQVNfU1RBVEVfRVJST1IpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKKyAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoInJlYWRCdWZmZXI6IG5vIGJ1ZmZlciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgRUFTX0kzMiB0aW1lTXM7CisgICAgRUFTX0dldExvY2F0aW9uKG1FYXNEYXRhLCBtRWFzSGFuZGxlLCAmdGltZU1zKTsKKyAgICBpbnQ2NF90IHRpbWVVcyA9IDEwMDBsbCAqIHRpbWVNczsKKyAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworCisgICAgRUFTX1BDTSogcCA9IChFQVNfUENNKikgYnVmZmVyLT5kYXRhKCk7CisgICAgaW50IG51bUJ5dGVzT3V0cHV0ID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9DT01CSU5FX0JVRkZFUlM7IGkrKykgeworICAgICAgICBFQVNfSTMyIG51bVJlbmRlcmVkOworICAgICAgICBFQVNfUkVTVUxUIHJlc3VsdCA9IEVBU19SZW5kZXIobUVhc0RhdGEsIHAsIG1FYXNDb25maWctPm1peEJ1ZmZlclNpemUsICZudW1SZW5kZXJlZCk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gRUFTX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFQVNfUmVuZGVyIHJldHVybmVkICVsZCIsIHJlc3VsdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwICs9IG51bVJlbmRlcmVkICogbUVhc0NvbmZpZy0+bnVtQ2hhbm5lbHM7CisgICAgICAgIG51bUJ5dGVzT3V0cHV0ICs9IG51bVJlbmRlcmVkICogbUVhc0NvbmZpZy0+bnVtQ2hhbm5lbHMgKiBzaXplb2YoRUFTX1BDTSk7CisgICAgfQorICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIG51bUJ5dGVzT3V0cHV0KTsKKyAgICBBTE9HVigicmVhZEJ1ZmZlcjogcmV0dXJuaW5nICV6ZCBpbiBidWZmZXIgJXAiLCBidWZmZXItPnJhbmdlX2xlbmd0aCgpLCBidWZmZXIpOworICAgIHJldHVybiBidWZmZXI7Cit9CisKKworLy8gTWlkaUV4dHJhY3RvcgorCitNaWRpRXh0cmFjdG9yOjpNaWRpRXh0cmFjdG9yKAorICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSkKKyAgICA6IG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAorICAgICAgbUluaXRDaGVjayhmYWxzZSkKK3sKKyAgICBBTE9HVigiTWlkaUV4dHJhY3RvciBjdG9yIik7CisgICAgbUVuZ2luZSA9IG5ldyBNaWRpRW5naW5lKG1EYXRhU291cmNlLCAmbUZpbGVNZXRhZGF0YSwgJm1UcmFja01ldGFkYXRhKTsKKyAgICBtSW5pdENoZWNrID0gbUVuZ2luZS0+aW5pdENoZWNrKCk7Cit9CisKK01pZGlFeHRyYWN0b3I6On5NaWRpRXh0cmFjdG9yKCkKK3sKKyAgICBBTE9HVigiTWlkaUV4dHJhY3RvciBkdG9yIik7Cit9CisKK3NpemVfdCBNaWRpRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpCit7CisgICAgcmV0dXJuIG1Jbml0Q2hlY2sgPT0gT0sgPyAxIDogMDsKK30KKworTWVkaWFUcmFjayAqTWlkaUV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KQoreworICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ID4gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBNaWRpU291cmNlKCptRW5naW5lLCBtVHJhY2tNZXRhZGF0YSk7Cit9CisKK3N0YXR1c190IE1pZGlFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgeworICAgIEFMT0dWKCJNaWRpRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhIik7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggPiAwKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtZXRhID0gbVRyYWNrTWV0YWRhdGE7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNaWRpRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpCit7CisgICAgQUxPR1YoIk1pZGlFeHRyYWN0b3I6OmdldE1ldGFEYXRhIik7CisgICAgbWV0YSA9IG1GaWxlTWV0YWRhdGE7CisgICAgcmV0dXJuIE9LOworfQorCisvLyBTbmlmZmVyCisKK2Jvb2wgU25pZmZNaWRpKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKQoreworICAgIE1pZGlFbmdpbmUgcChzb3VyY2UsIE5VTEwsIE5VTEwpOworICAgIGlmIChwLmluaXRDaGVjaygpID09IE9LKSB7CisgICAgICAgICpjb25maWRlbmNlID0gMC44OworICAgICAgICBBTE9HVigiU25pZmZNaWRpOiB5ZXMiKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIEFMT0dWKCJTbmlmZk1pZGk6IG5vIik7CisgICAgcmV0dXJuIGZhbHNlOworCit9CisKK2V4dGVybiAiQyIgeworLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAorX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQorTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CisgICAgcmV0dXJuIHsKKyAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICBVVUlEKCJlZjZjY2EwYS1mOGEyLTQzZTYtYmE1Zi1kZmNkN2M5YTdlZjIiKSwKKyAgICAgICAgMSwKKyAgICAgICAgIk1JREkgRXh0cmFjdG9yIiwKKyAgICAgICAgW10oCisgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgICAgICAgICB2b2lkICoqLAorICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKikgLT4gTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIHsKKyAgICAgICAgICAgIGlmIChTbmlmZk1pZGkoc291cmNlLCBjb25maWRlbmNlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IE1lZGlhRXh0cmFjdG9yKiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWlkaUV4dHJhY3Rvcihzb3VyY2UpO307CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH07Cit9CisKK30gLy8gZXh0ZXJuICJDIgorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ0ZGQwZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUlESV9FWFRSQUNUT1JfSF8KKyNkZWZpbmUgTUlESV9FWFRSQUNUT1JfSF8KKworI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWlkaUlvV3JhcHBlci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxsaWJzb25pdm94L2Vhcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1pZGlFbmdpbmUgeworcHVibGljOgorICAgIGV4cGxpY2l0IE1pZGlFbmdpbmUoRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCisgICAgICAgICAgICBNZXRhRGF0YUJhc2UgKmZpbGVNZXRhZGF0YSwKKyAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAqdHJhY2tNZXRhZGF0YSk7CisgICAgfk1pZGlFbmdpbmUoKTsKKworICAgIHN0YXR1c190IGluaXRDaGVjaygpOworCisgICAgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXJzKCk7CisgICAgc3RhdHVzX3QgcmVsZWFzZUJ1ZmZlcnMoKTsKKyAgICBzdGF0dXNfdCBzZWVrVG8oaW50NjRfdCBwb3NpdGlvblVzKTsKKyAgICBNZWRpYUJ1ZmZlckJhc2UqIHJlYWRCdWZmZXIoKTsKK3ByaXZhdGU6CisgICAgTWlkaUlvV3JhcHBlciAqbUlvV3JhcHBlcjsKKyAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CisgICAgRUFTX0RBVEFfSEFORExFIG1FYXNEYXRhOworICAgIEVBU19IQU5ETEUgbUVhc0hhbmRsZTsKKyAgICBjb25zdCBTX0VBU19MSUJfQ09ORklHKiBtRWFzQ29uZmlnOworICAgIGJvb2wgbUlzSW5pdGlhbGl6ZWQ7Cit9OworCitjbGFzcyBNaWRpRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKKworcHVibGljOgorICAgIGV4cGxpY2l0IE1pZGlFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CisKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOworICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1pZGlFeHRyYWN0b3IiOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5NaWRpRXh0cmFjdG9yKCk7CisKK3ByaXZhdGU6CisgICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CisgICAgTWV0YURhdGFCYXNlIG1GaWxlTWV0YWRhdGE7CisKKyAgICAvLyBUaGVyZSBpcyBvbmx5IG9uZSB0cmFjaworICAgIE1ldGFEYXRhQmFzZSBtVHJhY2tNZXRhZGF0YTsKKworICAgIE1pZGlFbmdpbmUgKm1FbmdpbmU7CisKKyAgICBFQVNfREFUQV9IQU5ETEUgICAgIG1FYXNEYXRhOworICAgIEVBU19IQU5ETEUgICAgICAgICAgbUVhc0hhbmRsZTsKKyAgICBFQVNfUENNKiAgICAgICAgICAgIG1BdWRpb0J1ZmZlcjsKKyAgICBFQVNfSTMyICAgICAgICAgICAgIG1QbGF5VGltZTsKKyAgICBFQVNfSTMyICAgICAgICAgICAgIG1EdXJhdGlvbjsKKyAgICBFQVNfU1RBVEUgICAgICAgICAgIG1TdGF0ZTsKKyAgICBFQVNfRklMRSAgICAgICAgICAgIG1GaWxlTG9jYXRvcjsKKworICAgIE1pZGlFeHRyYWN0b3IoY29uc3QgTWlkaUV4dHJhY3RvciAmKTsKKyAgICBNaWRpRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgTWlkaUV4dHJhY3RvciAmKTsKKworfTsKKworYm9vbCBTbmlmZk1pZGkoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1JRElfRVhUUkFDVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9OT1RJQ0UgYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvTk9USUNFCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTk9USUNFCmNvcHkgdG8gbWVkaWEvZXh0cmFjdG9ycy9taWRpL05PVElDRQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL2V4cG9ydHMubGRzIGIvbWVkaWEvZXh0cmFjdG9ycy9taWRpL2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMzA5ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvZXhwb3J0cy5sZHMKQEAgLTAsMCArMSBAQAoreyBnbG9iYWw6IEdFVEVYVFJBQ1RPUkRFRjsgbG9jYWw6ICo7IH07CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21rdi9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODFmZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvQW5kcm9pZC5icApAQCAtMCwwICsxLDQ4IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisKKyAgICBzcmNzOiBbIk1hdHJvc2thRXh0cmFjdG9yLmNwcCJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJleHRlcm5hbC9mbGFjL2luY2x1ZGUiLAorICAgICAgICAiZXh0ZXJuYWwvbGlidnB4L2xpYndlYm0iLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYyIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZsYWNkZWMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKKyAgICAgICAgImxpYndlYm0iLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBuYW1lOiAibGlibWt2ZXh0cmFjdG9yIiwKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJleHRyYWN0b3JzIiwKKworICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJmaXJzdCIsCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgXSwKKyAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKY29weSB0byBtZWRpYS9leHRyYWN0b3JzL21rdi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY1NzU4MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmNwcApAQCAtMCwwICsxLDE2NjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1hdHJvc2thRXh0cmFjdG9yIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRkxBQ0RlY29kZXIuaCIKKyNpbmNsdWRlICJNYXRyb3NrYUV4dHJhY3Rvci5oIgorCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9FeHRyYWN0b3JVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBEYXRhU291cmNlQmFzZVJlYWRlciA6IHB1YmxpYyBta3ZwYXJzZXI6OklNa3ZSZWFkZXIgeworICAgIGV4cGxpY2l0IERhdGFTb3VyY2VCYXNlUmVhZGVyKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCisgICAgICAgIDogbVNvdXJjZShzb3VyY2UpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGludCBSZWFkKGxvbmcgbG9uZyBwb3NpdGlvbiwgbG9uZyBsZW5ndGgsIHVuc2lnbmVkIGNoYXIqIGJ1ZmZlcikgeworICAgICAgICBDSEVDSyhwb3NpdGlvbiA+PSAwKTsKKyAgICAgICAgQ0hFQ0sobGVuZ3RoID49IDApOworCisgICAgICAgIGlmIChsZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBzc2l6ZV90IG4gPSBtU291cmNlLT5yZWFkQXQocG9zaXRpb24sIGJ1ZmZlciwgbGVuZ3RoKTsKKworICAgICAgICBpZiAobiA8PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGludCBMZW5ndGgobG9uZyBsb25nKiB0b3RhbCwgbG9uZyBsb25nKiBhdmFpbGFibGUpIHsKKyAgICAgICAgb2ZmNjRfdCBzaXplOworICAgICAgICBpZiAobVNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSkgIT0gT0spIHsKKyAgICAgICAgICAgICp0b3RhbCA9IC0xOworICAgICAgICAgICAgKmF2YWlsYWJsZSA9IChsb25nIGxvbmcpKCgxdWxsIDw8IDYzKSAtIDEpOworCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0b3RhbCkgeworICAgICAgICAgICAgKnRvdGFsID0gc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhdmFpbGFibGUpIHsKKyAgICAgICAgICAgICphdmFpbGFibGUgPSBzaXplOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCitwcml2YXRlOgorICAgIERhdGFTb3VyY2VCYXNlICptU291cmNlOworCisgICAgRGF0YVNvdXJjZUJhc2VSZWFkZXIoY29uc3QgRGF0YVNvdXJjZUJhc2VSZWFkZXIgJik7CisgICAgRGF0YVNvdXJjZUJhc2VSZWFkZXIgJm9wZXJhdG9yPShjb25zdCBEYXRhU291cmNlQmFzZVJlYWRlciAmKTsKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0cnVjdCBCbG9ja0l0ZXJhdG9yIHsKKyAgICBCbG9ja0l0ZXJhdG9yKE1hdHJvc2thRXh0cmFjdG9yICpleHRyYWN0b3IsIHVuc2lnbmVkIGxvbmcgdHJhY2tOdW0sIHVuc2lnbmVkIGxvbmcgaW5kZXgpOworCisgICAgYm9vbCBlb3MoKSBjb25zdDsKKworICAgIHZvaWQgYWR2YW5jZSgpOworICAgIHZvaWQgcmVzZXQoKTsKKworICAgIHZvaWQgc2VlaygKKyAgICAgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVcywgYm9vbCBpc0F1ZGlvLAorICAgICAgICAgICAgaW50NjRfdCAqYWN0dWFsRnJhbWVUaW1lVXMpOworCisgICAgY29uc3QgbWt2cGFyc2VyOjpCbG9jayAqYmxvY2soKSBjb25zdDsKKyAgICBpbnQ2NF90IGJsb2NrVGltZVVzKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgTWF0cm9za2FFeHRyYWN0b3IgKm1FeHRyYWN0b3I7CisgICAgbG9uZyBsb25nIG1UcmFja051bTsKKyAgICB1bnNpZ25lZCBsb25nIG1JbmRleDsKKworICAgIGNvbnN0IG1rdnBhcnNlcjo6Q2x1c3RlciAqbUNsdXN0ZXI7CisgICAgY29uc3QgbWt2cGFyc2VyOjpCbG9ja0VudHJ5ICptQmxvY2tFbnRyeTsKKyAgICBsb25nIG1CbG9ja0VudHJ5SW5kZXg7CisKKyAgICB2b2lkIGFkdmFuY2VfbCgpOworCisgICAgQmxvY2tJdGVyYXRvcihjb25zdCBCbG9ja0l0ZXJhdG9yICYpOworICAgIEJsb2NrSXRlcmF0b3IgJm9wZXJhdG9yPShjb25zdCBCbG9ja0l0ZXJhdG9yICYpOworfTsKKworc3RydWN0IE1hdHJvc2thU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworICAgIE1hdHJvc2thU291cmNlKE1hdHJvc2thRXh0cmFjdG9yICpleHRyYWN0b3IsIHNpemVfdCBpbmRleCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TWF0cm9za2FTb3VyY2UoKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIFR5cGUgeworICAgICAgICBBVkMsCisgICAgICAgIEFBQywKKyAgICAgICAgSEVWQywKKyAgICAgICAgT1RIRVIKKyAgICB9OworCisgICAgTWF0cm9za2FFeHRyYWN0b3IgKm1FeHRyYWN0b3I7CisgICAgc2l6ZV90IG1UcmFja0luZGV4OworICAgIFR5cGUgbVR5cGU7CisgICAgYm9vbCBtSXNBdWRpbzsKKyAgICBCbG9ja0l0ZXJhdG9yIG1CbG9ja0l0ZXI7CisgICAgc3NpemVfdCBtTkFMU2l6ZUxlbjsgIC8vIGZvciB0eXBlIEFWQyBvciBIRVZDCisKKyAgICBMaXN0PE1lZGlhQnVmZmVyQmFzZSAqPiBtUGVuZGluZ0ZyYW1lczsKKworICAgIHN0YXR1c190IGFkdmFuY2UoKTsKKworICAgIHN0YXR1c190IHNldFdlYm1CbG9ja0NyeXB0b0luZm8oTWVkaWFCdWZmZXJCYXNlICptYnVmKTsKKyAgICBzdGF0dXNfdCByZWFkQmxvY2soKTsKKyAgICB2b2lkIGNsZWFyUGVuZGluZ0ZyYW1lcygpOworCisgICAgTWF0cm9za2FTb3VyY2UoY29uc3QgTWF0cm9za2FTb3VyY2UgJik7CisgICAgTWF0cm9za2FTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBNYXRyb3NrYVNvdXJjZSAmKTsKK307CisKK2NvbnN0IG1rdnBhcnNlcjo6VHJhY2sqIE1hdHJvc2thRXh0cmFjdG9yOjpUcmFja0luZm86OmdldFRyYWNrKCkgY29uc3QgeworICAgIHJldHVybiBtRXh0cmFjdG9yLT5tU2VnbWVudC0+R2V0VHJhY2tzKCktPkdldFRyYWNrQnlOdW1iZXIobVRyYWNrTnVtKTsKK30KKworLy8gVGhpcyBmdW5jdGlvbiBkb2VzIGV4YWN0bHkgdGhlIHNhbWUgYXMgbWt2cGFyc2VyOjpDdWVzOjpGaW5kLCBleGNlcHQgdGhhdCBpdAorLy8gc2VhcmNoZXMgaW4gb3VyIG93biB0cmFjayBiYXNlZCB2ZWN0b3JzLiBXZSBzaG91bGQgbm90IG5lZWQgdGhpcyBvbmNlIG1rdnBhcnNlcgorLy8gYWRkcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5LgorY29uc3QgbWt2cGFyc2VyOjpDdWVQb2ludDo6VHJhY2tQb3NpdGlvbiAqTWF0cm9za2FFeHRyYWN0b3I6OlRyYWNrSW5mbzo6ZmluZCgKKyAgICAgICAgbG9uZyBsb25nIHRpbWVOcykgY29uc3QgeworICAgIEFMT0dWKCJtQ3VlUG9pbnRzLnNpemUgJXp1IiwgbUN1ZVBvaW50cy5zaXplKCkpOworICAgIGlmIChtQ3VlUG9pbnRzLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgY29uc3QgbWt2cGFyc2VyOjpDdWVQb2ludCogY3AgPSBtQ3VlUG9pbnRzLml0ZW1BdCgwKTsKKyAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrKiB0cmFjayA9IGdldFRyYWNrKCk7CisgICAgaWYgKHRpbWVOcyA8PSBjcC0+R2V0VGltZShtRXh0cmFjdG9yLT5tU2VnbWVudCkpIHsKKyAgICAgICAgcmV0dXJuIGNwLT5GaW5kKHRyYWNrKTsKKyAgICB9CisKKyAgICAvLyBCaW5hcnkgc2VhcmNoZXMgdGhyb3VnaCByZWxldmFudCBjdWVzOyBhc3N1bWVzIGN1ZXMgYXJlIG9yZGVyZWQgYnkgdGltZWNvZGUuCisgICAgLy8gSWYgd2UgZG8gZGV0ZWN0IG91dC1vZi1vcmRlciBjdWVzLCByZXR1cm4gTlVMTC4KKyAgICBzaXplX3QgbG8gPSAwOworICAgIHNpemVfdCBoaSA9IG1DdWVQb2ludHMuc2l6ZSgpOworICAgIHdoaWxlIChsbyA8IGhpKSB7CisgICAgICAgIGNvbnN0IHNpemVfdCBtaWQgPSBsbyArIChoaSAtIGxvKSAvIDI7CisgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQqIGNvbnN0IG1pZENwID0gbUN1ZVBvaW50cy5pdGVtQXQobWlkKTsKKyAgICAgICAgY29uc3QgbG9uZyBsb25nIGN1ZVRpbWVOcyA9IG1pZENwLT5HZXRUaW1lKG1FeHRyYWN0b3ItPm1TZWdtZW50KTsKKyAgICAgICAgaWYgKGN1ZVRpbWVOcyA8PSB0aW1lTnMpIHsKKyAgICAgICAgICAgIGxvID0gbWlkICsgMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGhpID0gbWlkOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGxvID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgY3AgPSBtQ3VlUG9pbnRzLml0ZW1BdChsbyAtIDEpOworICAgIGlmIChjcC0+R2V0VGltZShtRXh0cmFjdG9yLT5tU2VnbWVudCkgPiB0aW1lTnMpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGNwLT5GaW5kKHRyYWNrKTsKK30KKworTWF0cm9za2FTb3VyY2U6Ok1hdHJvc2thU291cmNlKAorICAgICAgICBNYXRyb3NrYUV4dHJhY3RvciAqZXh0cmFjdG9yLCBzaXplX3QgaW5kZXgpCisgICAgOiBtRXh0cmFjdG9yKGV4dHJhY3RvciksCisgICAgICBtVHJhY2tJbmRleChpbmRleCksCisgICAgICBtVHlwZShPVEhFUiksCisgICAgICBtSXNBdWRpbyhmYWxzZSksCisgICAgICBtQmxvY2tJdGVyKG1FeHRyYWN0b3IsCisgICAgICAgICAgICAgICAgIG1FeHRyYWN0b3ItPm1UcmFja3MuaXRlbUF0KGluZGV4KS5tVHJhY2tOdW0sCisgICAgICAgICAgICAgICAgIGluZGV4KSwKKyAgICAgIG1OQUxTaXplTGVuKC0xKSB7CisgICAgTWV0YURhdGFCYXNlICZtZXRhID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5lZGl0SXRlbUF0KGluZGV4KS5tTWV0YTsKKworICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgQ0hFQ0sobWV0YS5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisKKyAgICBtSXNBdWRpbyA9ICFzdHJuY2FzZWNtcCgiYXVkaW8vIiwgbWltZSwgNik7CisKKyAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSkgeworICAgICAgICBtVHlwZSA9IEFWQzsKKworICAgICAgICB1aW50MzJfdCBkdW1teTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqYXZjYzsKKyAgICAgICAgc2l6ZV90IGF2Y2NTaXplOworICAgICAgICBpbnQzMl90IG5hbFNpemVMZW4gPSAwOworICAgICAgICBpZiAobWV0YS5maW5kSW50MzIoa0tleU5hbExlbmd0aFNpemUsICZuYWxTaXplTGVuKSkgeworICAgICAgICAgICAgaWYgKG5hbFNpemVMZW4gPj0gMCAmJiBuYWxTaXplTGVuIDw9IDQpIHsKKyAgICAgICAgICAgICAgICBtTkFMU2l6ZUxlbiA9IG5hbFNpemVMZW47CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobWV0YS5maW5kRGF0YShrS2V5QVZDQywgJmR1bW15LCAoY29uc3Qgdm9pZCAqKikmYXZjYywgJmF2Y2NTaXplKQorICAgICAgICAgICAgICAgICYmIGF2Y2NTaXplID49IDV1KSB7CisgICAgICAgICAgICBtTkFMU2l6ZUxlbiA9IDEgKyAoYXZjY1s0XSAmIDMpOworICAgICAgICAgICAgQUxPR1YoIm1OQUxTaXplTGVuID0gJXpkIiwgbU5BTFNpemVMZW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIk5vIG1OQUxTaXplTGVuIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpKSB7CisgICAgICAgIG1UeXBlID0gSEVWQzsKKworICAgICAgICB1aW50MzJfdCBkdW1teTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqaHZjYzsKKyAgICAgICAgc2l6ZV90IGh2Y2NTaXplOworICAgICAgICBpZiAobWV0YS5maW5kRGF0YShrS2V5SFZDQywgJmR1bW15LCAoY29uc3Qgdm9pZCAqKikmaHZjYywgJmh2Y2NTaXplKQorICAgICAgICAgICAgICAgICYmIGh2Y2NTaXplID49IDIydSkgeworICAgICAgICAgICAgbU5BTFNpemVMZW4gPSAxICsgKGh2Y2NbMTQrN10gJiAzKTsKKyAgICAgICAgICAgIEFMT0dWKCJtTkFMU2l6ZUxlbiA9ICV6dSIsIG1OQUxTaXplTGVuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJObyBtTkFMU2l6ZUxlbiIpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKSB7CisgICAgICAgIG1UeXBlID0gQUFDOworICAgIH0KK30KKworTWF0cm9za2FTb3VyY2U6On5NYXRyb3NrYVNvdXJjZSgpIHsKKyAgICBjbGVhclBlbmRpbmdGcmFtZXMoKTsKK30KKworc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykgeworICAgIGlmIChtVHlwZSA9PSBBVkMgJiYgbU5BTFNpemVMZW4gPCAwKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgbUJsb2NrSXRlci5yZXNldCgpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6c3RvcCgpIHsKKyAgICBjbGVhclBlbmRpbmdGcmFtZXMoKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKKyAgICBtZXRhID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQobVRyYWNrSW5kZXgpLm1NZXRhOworICAgIHJldHVybiBPSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQmxvY2tJdGVyYXRvcjo6QmxvY2tJdGVyYXRvcigKKyAgICAgICAgTWF0cm9za2FFeHRyYWN0b3IgKmV4dHJhY3RvciwgdW5zaWduZWQgbG9uZyB0cmFja051bSwgdW5zaWduZWQgbG9uZyBpbmRleCkKKyAgICA6IG1FeHRyYWN0b3IoZXh0cmFjdG9yKSwKKyAgICAgIG1UcmFja051bSh0cmFja051bSksCisgICAgICBtSW5kZXgoaW5kZXgpLAorICAgICAgbUNsdXN0ZXIoTlVMTCksCisgICAgICBtQmxvY2tFbnRyeShOVUxMKSwKKyAgICAgIG1CbG9ja0VudHJ5SW5kZXgoMCkgeworICAgIHJlc2V0KCk7Cit9CisKK2Jvb2wgQmxvY2tJdGVyYXRvcjo6ZW9zKCkgY29uc3QgeworICAgIHJldHVybiBtQ2x1c3RlciA9PSBOVUxMIHx8IG1DbHVzdGVyLT5FT1MoKTsKK30KKwordm9pZCBCbG9ja0l0ZXJhdG9yOjphZHZhbmNlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtRXh0cmFjdG9yLT5tTG9jayk7CisgICAgYWR2YW5jZV9sKCk7Cit9CisKK3ZvaWQgQmxvY2tJdGVyYXRvcjo6YWR2YW5jZV9sKCkgeworICAgIGZvciAoOzspIHsKKyAgICAgICAgbG9uZyByZXMgPSBtQ2x1c3Rlci0+R2V0RW50cnkobUJsb2NrRW50cnlJbmRleCwgbUJsb2NrRW50cnkpOworICAgICAgICBBTE9HVigiR2V0RW50cnkgcmV0dXJuZWQgJWxkIiwgcmVzKTsKKworICAgICAgICBsb25nIGxvbmcgcG9zOworICAgICAgICBsb25nIGxlbjsKKyAgICAgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgICAgIC8vIE5lZWQgdG8gcGFyc2UgdGhpcyBjbHVzdGVyIHNvbWUgbW9yZQorCisgICAgICAgICAgICBDSEVDS19FUShyZXMsIG1rdnBhcnNlcjo6RV9CVUZGRVJfTk9UX0ZVTEwpOworCisgICAgICAgICAgICByZXMgPSBtQ2x1c3Rlci0+UGFyc2UocG9zLCBsZW4pOworICAgICAgICAgICAgQUxPR1YoIlBhcnNlIHJldHVybmVkICVsZCIsIHJlcyk7CisKKyAgICAgICAgICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgICAgICAgICAgLy8gSS9PIGVycm9yCisKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ2x1c3Rlcjo6UGFyc2UgcmV0dXJuZWQgcmVzdWx0ICVsZCIsIHJlcyk7CisKKyAgICAgICAgICAgICAgICBtQ2x1c3RlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKHJlcyA9PSAwKSB7CisgICAgICAgICAgICAvLyBXZSdyZSBkb25lIHdpdGggdGhpcyBjbHVzdGVyCisKKyAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q2x1c3RlciAqbmV4dENsdXN0ZXI7CisgICAgICAgICAgICByZXMgPSBtRXh0cmFjdG9yLT5tU2VnbWVudC0+UGFyc2VOZXh0KAorICAgICAgICAgICAgICAgICAgICBtQ2x1c3RlciwgbmV4dENsdXN0ZXIsIHBvcywgbGVuKTsKKyAgICAgICAgICAgIEFMT0dWKCJQYXJzZU5leHQgcmV0dXJuZWQgJWxkIiwgcmVzKTsKKworICAgICAgICAgICAgaWYgKHJlcyAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy8gRU9GIG9yIGVycm9yCisKKyAgICAgICAgICAgICAgICBtQ2x1c3RlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENIRUNLX0VRKHJlcywgMCk7CisgICAgICAgICAgICBDSEVDSyhuZXh0Q2x1c3RlciAhPSBOVUxMKTsKKyAgICAgICAgICAgIENIRUNLKCFuZXh0Q2x1c3Rlci0+RU9TKCkpOworCisgICAgICAgICAgICBtQ2x1c3RlciA9IG5leHRDbHVzdGVyOworCisgICAgICAgICAgICByZXMgPSBtQ2x1c3Rlci0+UGFyc2UocG9zLCBsZW4pOworICAgICAgICAgICAgQUxPR1YoIlBhcnNlICgyKSByZXR1cm5lZCAlbGQiLCByZXMpOworCisgICAgICAgICAgICBpZiAocmVzIDwgMCkgeworICAgICAgICAgICAgICAgIC8vIEkvTyBlcnJvcgorCisgICAgICAgICAgICAgICAgQUxPR0UoIkNsdXN0ZXI6OlBhcnNlIHJldHVybmVkIHJlc3VsdCAlbGQiLCByZXMpOworCisgICAgICAgICAgICAgICAgbUNsdXN0ZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtQmxvY2tFbnRyeUluZGV4ID0gMDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgQ0hFQ0sobUJsb2NrRW50cnkgIT0gTlVMTCk7CisgICAgICAgIENIRUNLKG1CbG9ja0VudHJ5LT5HZXRCbG9jaygpICE9IE5VTEwpOworICAgICAgICArK21CbG9ja0VudHJ5SW5kZXg7CisKKyAgICAgICAgaWYgKG1CbG9ja0VudHJ5LT5HZXRCbG9jaygpLT5HZXRUcmFja051bWJlcigpID09IG1UcmFja051bSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQmxvY2tJdGVyYXRvcjo6cmVzZXQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1FeHRyYWN0b3ItPm1Mb2NrKTsKKworICAgIG1DbHVzdGVyID0gbUV4dHJhY3Rvci0+bVNlZ21lbnQtPkdldEZpcnN0KCk7CisgICAgbUJsb2NrRW50cnkgPSBOVUxMOworICAgIG1CbG9ja0VudHJ5SW5kZXggPSAwOworCisgICAgZG8geworICAgICAgICBhZHZhbmNlX2woKTsKKyAgICB9IHdoaWxlICghZW9zKCkgJiYgYmxvY2soKS0+R2V0VHJhY2tOdW1iZXIoKSAhPSBtVHJhY2tOdW0pOworfQorCit2b2lkIEJsb2NrSXRlcmF0b3I6OnNlZWsoCisgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVcywgYm9vbCBpc0F1ZGlvLAorICAgICAgICBpbnQ2NF90ICphY3R1YWxGcmFtZVRpbWVVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtRXh0cmFjdG9yLT5tTG9jayk7CisKKyAgICAqYWN0dWFsRnJhbWVUaW1lVXMgPSAtMWxsOworCisgICAgaWYgKHNlZWtUaW1lVXMgPiBJTlQ2NF9NQVggLyAxMDAwbGwgfHwKKyAgICAgICAgICAgIHNlZWtUaW1lVXMgPCBJTlQ2NF9NSU4gLyAxMDAwbGwgfHwKKyAgICAgICAgICAgIChtRXh0cmFjdG9yLT5tU2Vla1ByZVJvbGxOcyA+IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgKHNlZWtUaW1lVXMgKiAxMDAwbGwpIDwgSU5UNjRfTUlOICsgbUV4dHJhY3Rvci0+bVNlZWtQcmVSb2xsTnMpIHx8CisgICAgICAgICAgICAobUV4dHJhY3Rvci0+bVNlZWtQcmVSb2xsTnMgPCAwICYmCisgICAgICAgICAgICAgICAgICAgIChzZWVrVGltZVVzICogMTAwMGxsKSA+IElOVDY0X01BWCArIG1FeHRyYWN0b3ItPm1TZWVrUHJlUm9sbE5zKSkgeworICAgICAgICBBTE9HRSgiY2Fubm90IHNlZWsgdG8gJWxsZCIsIChsb25nIGxvbmcpIHNlZWtUaW1lVXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgaW50NjRfdCBzZWVrVGltZU5zID0gc2Vla1RpbWVVcyAqIDEwMDBsbCAtIG1FeHRyYWN0b3ItPm1TZWVrUHJlUm9sbE5zOworCisgICAgbWt2cGFyc2VyOjpTZWdtZW50KiBjb25zdCBwU2VnbWVudCA9IG1FeHRyYWN0b3ItPm1TZWdtZW50OworCisgICAgLy8gU3BlY2lhbCBjYXNlIHRoZSAwIHNlZWsgdG8gYXZvaWQgbG9hZGluZyBDdWVzIHdoZW4gdGhlIGFwcGxpY2F0aW9uCisgICAgLy8gZXh0cmFuZW91c2x5IHNlZWtzIHRvIDAgYmVmb3JlIHBsYXlpbmcuCisgICAgaWYgKHNlZWtUaW1lTnMgPD0gMCkgeworICAgICAgICBBTE9HVigiU2VlayB0byBiZWdpbm5pbmc6ICUiIFBSSWQ2NCwgc2Vla1RpbWVVcyk7CisgICAgICAgIG1DbHVzdGVyID0gcFNlZ21lbnQtPkdldEZpcnN0KCk7CisgICAgICAgIG1CbG9ja0VudHJ5SW5kZXggPSAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICBhZHZhbmNlX2woKTsKKyAgICAgICAgfSB3aGlsZSAoIWVvcygpICYmIGJsb2NrKCktPkdldFRyYWNrTnVtYmVyKCkgIT0gbVRyYWNrTnVtKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dWKCJTZWVraW5nIHRvOiAlIiBQUklkNjQsIHNlZWtUaW1lVXMpOworCisgICAgLy8gSWYgdGhlIEN1ZXMgaGF2ZSBub3QgYmVlbiBsb2NhdGVkIHRoZW4gZmluZCB0aGVtLgorICAgIGNvbnN0IG1rdnBhcnNlcjo6Q3VlcyogcEN1ZXMgPSBwU2VnbWVudC0+R2V0Q3VlcygpOworICAgIGNvbnN0IG1rdnBhcnNlcjo6U2Vla0hlYWQqIHBTSCA9IHBTZWdtZW50LT5HZXRTZWVrSGVhZCgpOworICAgIGlmICghcEN1ZXMgJiYgcFNIKSB7CisgICAgICAgIGNvbnN0IHNpemVfdCBjb3VudCA9IHBTSC0+R2V0Q291bnQoKTsKKyAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpTZWVrSGVhZDo6RW50cnkqIHBFbnRyeTsKKyAgICAgICAgQUxPR1YoIk5vIEN1ZXMgeWV0Iik7CisKKyAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IGNvdW50OyBpbmRleCsrKSB7CisgICAgICAgICAgICBwRW50cnkgPSBwU0gtPkdldEVudHJ5KGluZGV4KTsKKworICAgICAgICAgICAgaWYgKHBFbnRyeS0+aWQgPT0gMHgwQzUzQkI2QikgeyAvLyBDdWVzIElECisgICAgICAgICAgICAgICAgbG9uZyBsZW47IGxvbmcgbG9uZyBwb3M7CisgICAgICAgICAgICAgICAgcFNlZ21lbnQtPlBhcnNlQ3VlcyhwRW50cnktPnBvcywgcG9zLCBsZW4pOworICAgICAgICAgICAgICAgIHBDdWVzID0gcFNlZ21lbnQtPkdldEN1ZXMoKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiQ3VlcyBmb3VuZCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFwQ3VlcykgeworICAgICAgICAgICAgQUxPR0UoIk5vIEN1ZXMgaW4gZmlsZSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCFwU0gpIHsKKyAgICAgICAgQUxPR0UoIk5vIFNlZWtIZWFkIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBta3ZwYXJzZXI6OkN1ZVBvaW50KiBwQ1A7CisgICAgbWt2cGFyc2VyOjpUcmFja3MgY29uc3QgKnBUcmFja3MgPSBwU2VnbWVudC0+R2V0VHJhY2tzKCk7CisgICAgd2hpbGUgKCFwQ3Vlcy0+RG9uZVBhcnNpbmcoKSkgeworICAgICAgICBwQ3Vlcy0+TG9hZEN1ZVBvaW50KCk7CisgICAgICAgIHBDUCA9IHBDdWVzLT5HZXRMYXN0KCk7CisgICAgICAgIENIRUNLKHBDUCk7CisKKyAgICAgICAgc2l6ZV90IHRyYWNrQ291bnQgPSBtRXh0cmFjdG9yLT5tVHJhY2tzLnNpemUoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHRyYWNrQ291bnQ7ICsraW5kZXgpIHsKKyAgICAgICAgICAgIE1hdHJvc2thRXh0cmFjdG9yOjpUcmFja0luZm8mIHRyYWNrID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5lZGl0SXRlbUF0KGluZGV4KTsKKyAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2sgKnBUcmFjayA9IHBUcmFja3MtPkdldFRyYWNrQnlOdW1iZXIodHJhY2subVRyYWNrTnVtKTsKKyAgICAgICAgICAgIGlmIChwVHJhY2sgJiYgcFRyYWNrLT5HZXRUeXBlKCkgPT0gMSAmJiBwQ1AtPkZpbmQocFRyYWNrKSkgeyAvLyBWSURFT19UUkFDSworICAgICAgICAgICAgICAgIHRyYWNrLm1DdWVQb2ludHMucHVzaF9iYWNrKHBDUCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocENQLT5HZXRUaW1lKHBTZWdtZW50KSA+PSBzZWVrVGltZU5zKSB7CisgICAgICAgICAgICBBTE9HVigiUGFyc2VkIHBhc3QgcmVsZXZhbnQgQ3VlIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQ6OlRyYWNrUG9zaXRpb24gKnBUUCA9IE5VTEw7CisgICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayAqdGhpc1RyYWNrID0gcFRyYWNrcy0+R2V0VHJhY2tCeU51bWJlcihtVHJhY2tOdW0pOworICAgIGlmICh0aGlzVHJhY2stPkdldFR5cGUoKSA9PSAxKSB7IC8vIHZpZGVvCisgICAgICAgIE1hdHJvc2thRXh0cmFjdG9yOjpUcmFja0luZm8mIHRyYWNrID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5lZGl0SXRlbUF0KG1JbmRleCk7CisgICAgICAgIHBUUCA9IHRyYWNrLmZpbmQoc2Vla1RpbWVOcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhlIEN1ZSBpbmRleCBpcyBidWlsdCBhcm91bmQgdmlkZW8ga2V5ZnJhbWVzCisgICAgICAgIHVuc2lnbmVkIGxvbmcgaW50IHRyYWNrQ291bnQgPSBwVHJhY2tzLT5HZXRUcmFja3NDb3VudCgpOworICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgdHJhY2tDb3VudDsgKytpbmRleCkgeworICAgICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayAqcFRyYWNrID0gcFRyYWNrcy0+R2V0VHJhY2tCeUluZGV4KGluZGV4KTsKKyAgICAgICAgICAgIGlmIChwVHJhY2sgJiYgcFRyYWNrLT5HZXRUeXBlKCkgPT0gMSAmJiBwQ3Vlcy0+RmluZChzZWVrVGltZU5zLCBwVHJhY2ssIHBDUCwgcFRQKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlbyB0cmFjayBsb2NhdGVkIGF0ICV6dSIsIGluZGV4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gQWx3YXlzICpzZWFyY2gqIGJhc2VkIG9uIHRoZSB2aWRlbyB0cmFjaywgYnV0IGZpbmFsaXplIGJhc2VkIG9uIG1UcmFja051bQorICAgIGlmICghcFRQKSB7CisgICAgICAgIEFMT0dFKCJEaWQgbm90IGxvY2F0ZSB0aGUgdmlkZW8gdHJhY2sgZm9yIHNlZWtpbmciKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1DbHVzdGVyID0gcFNlZ21lbnQtPkZpbmRPclByZWxvYWRDbHVzdGVyKHBUUC0+bV9wb3MpOworCisgICAgQ0hFQ0sobUNsdXN0ZXIpOworICAgIENIRUNLKCFtQ2x1c3Rlci0+RU9TKCkpOworCisgICAgLy8gbUJsb2NrRW50cnlJbmRleCBzdGFydHMgYXQgMCBidXQgbV9ibG9jayBzdGFydHMgYXQgMQorICAgIENIRUNLX0dUKHBUUC0+bV9ibG9jaywgMCk7CisgICAgbUJsb2NrRW50cnlJbmRleCA9IHBUUC0+bV9ibG9jayAtIDE7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGFkdmFuY2VfbCgpOworCisgICAgICAgIGlmIChlb3MoKSkgYnJlYWs7CisKKyAgICAgICAgaWYgKGlzQXVkaW8gfHwgYmxvY2soKS0+SXNLZXkoKSkgeworICAgICAgICAgICAgLy8gQWNjZXB0IHRoZSBmaXJzdCBrZXkgZnJhbWUKKyAgICAgICAgICAgIGludDY0X3QgZnJhbWVUaW1lVXMgPSAoYmxvY2soKS0+R2V0VGltZShtQ2x1c3RlcikgKyA1MDBMTCkgLyAxMDAwTEw7CisgICAgICAgICAgICBpZiAodGhpc1RyYWNrLT5HZXRUeXBlKCkgPT0gMSB8fCBmcmFtZVRpbWVVcyA+PSBzZWVrVGltZVVzKSB7CisgICAgICAgICAgICAgICAgKmFjdHVhbEZyYW1lVGltZVVzID0gZnJhbWVUaW1lVXM7CisgICAgICAgICAgICAgICAgQUxPR1YoIlJlcXVlc3RlZCBzZWVrIHBvaW50OiAlIiBQUklkNjQgIiBhY3R1YWw6ICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICBzZWVrVGltZVVzLCAqYWN0dWFsRnJhbWVUaW1lVXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitjb25zdCBta3ZwYXJzZXI6OkJsb2NrICpCbG9ja0l0ZXJhdG9yOjpibG9jaygpIGNvbnN0IHsKKyAgICBDSEVDSyghZW9zKCkpOworCisgICAgcmV0dXJuIG1CbG9ja0VudHJ5LT5HZXRCbG9jaygpOworfQorCitpbnQ2NF90IEJsb2NrSXRlcmF0b3I6OmJsb2NrVGltZVVzKCkgY29uc3QgeworICAgIGlmIChtQ2x1c3RlciA9PSBOVUxMIHx8IG1CbG9ja0VudHJ5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gKG1CbG9ja0VudHJ5LT5HZXRCbG9jaygpLT5HZXRUaW1lKG1DbHVzdGVyKSArIDUwMGxsKSAvIDEwMDBsbDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIHVuc2lnbmVkIFUyNF9BVChjb25zdCB1aW50OF90ICpwdHIpIHsKKyAgICByZXR1cm4gcHRyWzBdIDw8IDE2IHwgcHRyWzFdIDw8IDggfCBwdHJbMl07Cit9CisKK3N0YXRpYyBBU3RyaW5nIHVyaURlYnVnU3RyaW5nKGNvbnN0IGNoYXIgKnVyaSkgeworICAgIC8vIGZpbmQgc2NoZW1lCisgICAgQVN0cmluZyBzY2hlbWU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHJsZW4odXJpKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IGNoYXIgYyA9IHVyaVtpXTsKKyAgICAgICAgaWYgKCFpc2FzY2lpKGMpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChpc2FscGhhKGMpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChpID09IDApIHsKKyAgICAgICAgICAgIC8vIGZpcnN0IGNoYXJhY3RlciBtdXN0IGJlIGEgbGV0dGVyCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChpc2RpZ2l0KGMpIHx8IGMgPT0gJysnIHx8IGMgPT0gJy4nIHx8IGMgPT0nLScpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKGMgIT0gJzonKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzY2hlbWUgPSBBU3RyaW5nKHVyaSwgMCwgaSk7CisgICAgICAgIHNjaGVtZS5hcHBlbmQoIjovLzxzdXBwcmVzc2VkPiIpOworICAgICAgICByZXR1cm4gc2NoZW1lOworICAgIH0KKyAgICByZXR1cm4gQVN0cmluZygiPG5vLXNjaGVtZSBVUkkgc3VwcHJlc3NlZD4iKTsKK30KKwordm9pZCBNYXRyb3NrYVNvdXJjZTo6Y2xlYXJQZW5kaW5nRnJhbWVzKCkgeworICAgIHdoaWxlICghbVBlbmRpbmdGcmFtZXMuZW1wdHkoKSkgeworICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmZyYW1lID0gKm1QZW5kaW5nRnJhbWVzLmJlZ2luKCk7CisgICAgICAgIG1QZW5kaW5nRnJhbWVzLmVyYXNlKG1QZW5kaW5nRnJhbWVzLmJlZ2luKCkpOworCisgICAgICAgIGZyYW1lLT5yZWxlYXNlKCk7CisgICAgICAgIGZyYW1lID0gTlVMTDsKKyAgICB9Cit9CisKK3N0YXR1c190IE1hdHJvc2thU291cmNlOjpzZXRXZWJtQmxvY2tDcnlwdG9JbmZvKE1lZGlhQnVmZmVyQmFzZSAqbWJ1ZikgeworICAgIGlmIChtYnVmLT5yYW5nZV9sZW5ndGgoKSA8IDEgfHwgbWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSAxID4gSU5UMzJfTUFYKSB7CisgICAgICAgIC8vIDEtYnl0ZSBzaWduYWwKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gKGNvbnN0IHVpbnQ4X3QgKiltYnVmLT5kYXRhKCkgKyBtYnVmLT5yYW5nZV9vZmZzZXQoKTsKKyAgICBib29sIGVuY3J5cHRlZCA9IGRhdGFbMF0gJiAweDE7CisgICAgYm9vbCBwYXJ0aXRpb25lZCA9IGRhdGFbMF0gJiAweDI7CisgICAgaWYgKGVuY3J5cHRlZCAmJiBtYnVmLT5yYW5nZV9sZW5ndGgoKSA8IDkpIHsKKyAgICAgICAgLy8gMS1ieXRlIHNpZ25hbCArIDgtYnl0ZSBJVgorICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIE1ldGFEYXRhQmFzZSAmbWV0YSA9IG1idWYtPm1ldGFfZGF0YSgpOworICAgIGlmIChlbmNyeXB0ZWQpIHsKKyAgICAgICAgdWludDhfdCBjdHJDb3VudGVyWzE2XSA9IHsgMCB9OworICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICBjb25zdCB1aW50OF90ICprZXlJZDsKKyAgICAgICAgc2l6ZV90IGtleUlkU2l6ZTsKKyAgICAgICAgY29uc3QgTWV0YURhdGFCYXNlICZ0cmFja01ldGEgPSBtRXh0cmFjdG9yLT5tVHJhY2tzLml0ZW1BdChtVHJhY2tJbmRleCkubU1ldGE7CisgICAgICAgIENIRUNLKHRyYWNrTWV0YS5maW5kRGF0YShrS2V5Q3J5cHRvS2V5LCAmdHlwZSwgKGNvbnN0IHZvaWQgKiopJmtleUlkLCAma2V5SWRTaXplKSk7CisgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvS2V5LCAwLCBrZXlJZCwga2V5SWRTaXplKTsKKyAgICAgICAgbWVtY3B5KGN0ckNvdW50ZXIsIGRhdGEgKyAxLCA4KTsKKyAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlDcnlwdG9JViwgMCwgY3RyQ291bnRlciwgMTYpOworICAgICAgICBpZiAocGFydGl0aW9uZWQpIHsKKyAgICAgICAgICAgIC8qICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgICAgICAgICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgICAgICogfCAgU2lnbmFsIEJ5dGUgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAqICstKy0rLSstKy0rLSstKy0rICAgICAgICAgICAgIElWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICogfCAgICAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICAgICAqIHwgICAgICAgICAgICAgICB8IG51bV9wYXJ0aXRpb24gfCAgICAgUGFydGl0aW9uIDAgb2Zmc2V0IC0+ICAgICB8CisgICAgICAgICAgICAgKiB8LSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstfAorICAgICAgICAgICAgICogfCAgICAgLT4gUGFydGl0aW9uIDAgb2Zmc2V0ICAgICB8ICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAqIHwtKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy18CisgICAgICAgICAgICAgKiB8ICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgIHwgICAgIFBhcnRpdGlvbiBuLTEgb2Zmc2V0IC0+ICAgfAorICAgICAgICAgICAgICogfC0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLXwKKyAgICAgICAgICAgICAqIHwgICAgIC0+IFBhcnRpdGlvbiBuLTEgb2Zmc2V0ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICogfCAgICAgICAgICAgICAgICAgICAgQ2xlYXIvZW5jcnlwdGVkIHNhbXBsZSBkYXRhICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKG1idWYtPnJhbmdlX2xlbmd0aCgpIDwgMTApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDhfdCBudW1QYXJ0aXRpb25zID0gZGF0YVs5XTsKKyAgICAgICAgICAgIGlmIChtYnVmLT5yYW5nZV9sZW5ndGgoKSAtIDEwIDwgbnVtUGFydGl0aW9ucyAqIHNpemVvZih1aW50MzJfdCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHBsYWluU2l6ZXMsIGVuY3J5cHRlZFNpemVzOworICAgICAgICAgICAgdWludDMyX3QgcHJldiA9IDA7CisgICAgICAgICAgICB1aW50MzJfdCBmcmFtZU9mZnNldCA9IDEwICsgbnVtUGFydGl0aW9ucyAqIHNpemVvZih1aW50MzJfdCk7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAqcGFydGl0aW9ucyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QqPihkYXRhICsgMTApOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8PSBudW1QYXJ0aXRpb25zOyArK2kpIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwX2kgPSBpIDwgbnVtUGFydGl0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgPyBudG9obChwYXJ0aXRpb25zW2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgOiAobWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSBmcmFtZU9mZnNldCk7CisgICAgICAgICAgICAgICAgaWYgKHBfaSA8IHByZXYpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSA9IHBfaSAtIHByZXY7CisgICAgICAgICAgICAgICAgcHJldiA9IHBfaTsKKyAgICAgICAgICAgICAgICBpZiAoaSAlIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkU2l6ZXMucHVzaF9iYWNrKHNpemUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBsYWluU2l6ZXMucHVzaF9iYWNrKHNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwbGFpblNpemVzLnNpemUoKSA+IGVuY3J5cHRlZFNpemVzLnNpemUoKSkgeworICAgICAgICAgICAgICAgIGVuY3J5cHRlZFNpemVzLnB1c2hfYmFjaygwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVpbnQzMl90IHNpemVvZlBsYWluU2l6ZXMgPSBzaXplb2YodWludDMyX3QpICogcGxhaW5TaXplcy5zaXplKCk7CisgICAgICAgICAgICB1aW50MzJfdCBzaXplb2ZFbmNyeXB0ZWRTaXplcyA9IHNpemVvZih1aW50MzJfdCkgKiBlbmNyeXB0ZWRTaXplcy5zaXplKCk7CisgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleVBsYWluU2l6ZXMsIDAsIHBsYWluU2l6ZXMuZGF0YSgpLCBzaXplb2ZQbGFpblNpemVzKTsKKyAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsIDAsIGVuY3J5cHRlZFNpemVzLmRhdGEoKSwgc2l6ZW9mRW5jcnlwdGVkU2l6ZXMpOworICAgICAgICAgICAgbWJ1Zi0+c2V0X3JhbmdlKGZyYW1lT2Zmc2V0LCBtYnVmLT5yYW5nZV9sZW5ndGgoKSAtIGZyYW1lT2Zmc2V0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAgICAgICAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICAgICAgICAgICogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgICAgKiAgfCAgU2lnbmFsIEJ5dGUgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAqICArLSstKy0rLSstKy0rLSstKyAgICAgICAgICAgICBJViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgKiAgfCAgICAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICAgICAqICB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICogIHwtKy0rLSstKy0rLSstKy0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgKiAgOiAgICAgICAgICAgICAgIEJ5dGVzIDEuLk4gb2YgZW5jcnlwdGVkIGZyYW1lICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW50MzJfdCBwbGFpblNpemVzW10gPSB7IDAgfTsKKyAgICAgICAgICAgIGludDMyX3QgZW5jcnlwdGVkU2l6ZXNbXSA9IHsgc3RhdGljX2Nhc3Q8aW50MzJfdD4obWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSA5KSB9OworICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlQbGFpblNpemVzLCAwLCBwbGFpblNpemVzLCBzaXplb2YocGxhaW5TaXplcykpOworICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgMCwgZW5jcnlwdGVkU2l6ZXMsIHNpemVvZihlbmNyeXB0ZWRTaXplcykpOworICAgICAgICAgICAgbWJ1Zi0+c2V0X3JhbmdlKDksIG1idWYtPnJhbmdlX2xlbmd0aCgpIC0gOSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKgorICAgICAgICAgKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAgICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgICAgICAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKiAgfCAgU2lnbmFsIEJ5dGUgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICogICstKy0rLSstKy0rLSstKy0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAqICA6ICAgICAgICAgICAgICAgQnl0ZXMgMS4uTiBvZiB1bmVuY3J5cHRlZCBmcmFtZSAgICAgICAgICAgICAgICAgOgorICAgICAgICAgKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKi8KKyAgICAgICAgaW50MzJfdCBwbGFpblNpemVzW10gPSB7IHN0YXRpY19jYXN0PGludDMyX3Q+KG1idWYtPnJhbmdlX2xlbmd0aCgpIC0gMSkgfTsKKyAgICAgICAgaW50MzJfdCBlbmNyeXB0ZWRTaXplc1tdID0geyAwIH07CisgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5UGxhaW5TaXplcywgMCwgcGxhaW5TaXplcywgc2l6ZW9mKHBsYWluU2l6ZXMpKTsKKyAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgMCwgZW5jcnlwdGVkU2l6ZXMsIHNpemVvZihlbmNyeXB0ZWRTaXplcykpOworICAgICAgICBtYnVmLT5zZXRfcmFuZ2UoMSwgbWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSAxKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1hdHJvc2thU291cmNlOjpyZWFkQmxvY2soKSB7CisgICAgQ0hFQ0sobVBlbmRpbmdGcmFtZXMuZW1wdHkoKSk7CisKKyAgICBpZiAobUJsb2NrSXRlci5lb3MoKSkgeworICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9CisKKyAgICBjb25zdCBta3ZwYXJzZXI6OkJsb2NrICpibG9jayA9IG1CbG9ja0l0ZXIuYmxvY2soKTsKKworICAgIGludDY0X3QgdGltZVVzID0gbUJsb2NrSXRlci5ibG9ja1RpbWVVcygpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBibG9jay0+R2V0RnJhbWVDb3VudCgpOyArK2kpIHsKKyAgICAgICAgTWF0cm9za2FFeHRyYWN0b3I6OlRyYWNrSW5mbyAqdHJhY2tJbmZvID0gJm1FeHRyYWN0b3ItPm1UcmFja3MuZWRpdEl0ZW1BdChtVHJhY2tJbmRleCk7CisgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6QmxvY2s6OkZyYW1lICZmcmFtZSA9IGJsb2NrLT5HZXRGcmFtZShpKTsKKyAgICAgICAgc2l6ZV90IGxlbiA9IGZyYW1lLmxlbjsKKyAgICAgICAgaWYgKFNJWkVfTUFYIC0gbGVuIDwgdHJhY2tJbmZvLT5tSGVhZGVyTGVuKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgbGVuICs9IHRyYWNrSW5mby0+bUhlYWRlckxlbjsKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICptYnVmID0gTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUobGVuKTsKKyAgICAgICAgdWludDhfdCAqZGF0YSA9IHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4obWJ1Zi0+ZGF0YSgpKTsKKyAgICAgICAgaWYgKHRyYWNrSW5mby0+bUhlYWRlcikgeworICAgICAgICAgICAgbWVtY3B5KGRhdGEsIHRyYWNrSW5mby0+bUhlYWRlciwgdHJhY2tJbmZvLT5tSGVhZGVyTGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIGJsb2NrLT5Jc0tleSgpKTsKKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBmcmFtZS5SZWFkKG1FeHRyYWN0b3ItPm1SZWFkZXIsIGRhdGEgKyB0cmFja0luZm8tPm1IZWFkZXJMZW4pOworICAgICAgICBpZiAoZXJyID09IE9LCisgICAgICAgICAgICAgICAgJiYgbUV4dHJhY3Rvci0+bUlzV2VibQorICAgICAgICAgICAgICAgICYmIHRyYWNrSW5mby0+bUVuY3J5cHRlZCkgeworICAgICAgICAgICAgZXJyID0gc2V0V2VibUJsb2NrQ3J5cHRvSW5mbyhtYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIG1QZW5kaW5nRnJhbWVzLmNsZWFyKCk7CisKKyAgICAgICAgICAgIG1CbG9ja0l0ZXIuYWR2YW5jZSgpOworICAgICAgICAgICAgbWJ1Zi0+cmVsZWFzZSgpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIG1QZW5kaW5nRnJhbWVzLnB1c2hfYmFjayhtYnVmKTsKKyAgICB9CisKKyAgICBtQmxvY2tJdGVyLmFkdmFuY2UoKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICAqb3V0ID0gTlVMTDsKKworICAgIGludDY0X3QgdGFyZ2V0U2FtcGxlVGltZVVzID0gLTFsbDsKKworICAgIGludDY0X3Qgc2Vla1RpbWVVczsKKyAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKKyAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgeworICAgICAgICBpZiAobW9kZSA9PSBSZWFkT3B0aW9uczo6U0VFS19GUkFNRV9JTkRFWCkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtRXh0cmFjdG9yLT5pc0xpdmVTdHJlYW1pbmcoKSkgeworICAgICAgICAgICAgY2xlYXJQZW5kaW5nRnJhbWVzKCk7CisKKyAgICAgICAgICAgIC8vIFRoZSBhdWRpbyB3ZSB3YW50IGlzIGxvY2F0ZWQgYnkgdXNpbmcgdGhlIEN1ZXMgdG8gc2VlayB0aGUgdmlkZW8KKyAgICAgICAgICAgIC8vIHN0cmVhbSB0byBmaW5kIHRoZSB0YXJnZXQgQ2x1c3RlciB0aGVuIGl0ZXJhdGluZyB0byBmaW5hbGl6ZSBmb3IKKyAgICAgICAgICAgIC8vIGF1ZGlvLgorICAgICAgICAgICAgaW50NjRfdCBhY3R1YWxGcmFtZVRpbWVVczsKKyAgICAgICAgICAgIG1CbG9ja0l0ZXIuc2VlayhzZWVrVGltZVVzLCBtSXNBdWRpbywgJmFjdHVhbEZyYW1lVGltZVVzKTsKKyAgICAgICAgICAgIGlmIChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QpIHsKKyAgICAgICAgICAgICAgICB0YXJnZXRTYW1wbGVUaW1lVXMgPSBhY3R1YWxGcmFtZVRpbWVVczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHdoaWxlIChtUGVuZGluZ0ZyYW1lcy5lbXB0eSgpKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IHJlYWRCbG9jaygpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIGNsZWFyUGVuZGluZ0ZyYW1lcygpOworCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgTWVkaWFCdWZmZXJCYXNlICpmcmFtZSA9ICptUGVuZGluZ0ZyYW1lcy5iZWdpbigpOworICAgIG1QZW5kaW5nRnJhbWVzLmVyYXNlKG1QZW5kaW5nRnJhbWVzLmJlZ2luKCkpOworCisgICAgaWYgKChtVHlwZSAhPSBBVkMgJiYgbVR5cGUgIT0gSEVWQykgfHwgbU5BTFNpemVMZW4gPT0gMCkgeworICAgICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDBsbCkgeworICAgICAgICAgICAgZnJhbWUtPm1ldGFfZGF0YSgpLnNldEludDY0KAorICAgICAgICAgICAgICAgICAgICBrS2V5VGFyZ2V0VGltZSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKKyAgICAgICAgfQorCisgICAgICAgICpvdXQgPSBmcmFtZTsKKworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgLy8gRWFjaCBpbnB1dCBmcmFtZSBjb250YWlucyBvbmUgb3IgbW9yZSBOQUwgZnJhZ21lbnRzLCBlYWNoIGZyYWdtZW50CisgICAgLy8gaXMgcHJlZml4ZWQgYnkgbU5BTFNpemVMZW4gYnl0ZXMgZ2l2aW5nIHRoZSBmcmFnbWVudCBsZW5ndGgsCisgICAgLy8gZm9sbG93ZWQgYnkgYSBjb3JyZXNwb25kaW5nIG51bWJlciBvZiBieXRlcyBjb250YWluaW5nIHRoZSBmcmFnbWVudC4KKyAgICAvLyBXZSBvdXRwdXQgYWxsIHRoZXNlIGZyYWdtZW50cyBpbnRvIGEgc2luZ2xlIGxhcmdlIGJ1ZmZlciBzZXBhcmF0ZWQKKyAgICAvLyBieSBzdGFydGNvZGVzICgweDAwIDB4MDAgMHgwMCAweDAxKS4KKyAgICAvLworICAgIC8vIFdoZW4gbU5BTFNpemVMZW4gaXMgMCwgd2UgYXNzdW1lIHRoZSBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIGZvcm1hdAorICAgIC8vIGRlc2lyZWQuCisKKyAgICBjb25zdCB1aW50OF90ICpzcmNQdHIgPQorICAgICAgICAoY29uc3QgdWludDhfdCAqKWZyYW1lLT5kYXRhKCkgKyBmcmFtZS0+cmFuZ2Vfb2Zmc2V0KCk7CisKKyAgICBzaXplX3Qgc3JjU2l6ZSA9IGZyYW1lLT5yYW5nZV9sZW5ndGgoKTsKKworICAgIHNpemVfdCBkc3RTaXplID0gMDsKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciA9IE5VTEw7CisgICAgdWludDhfdCAqZHN0UHRyID0gTlVMTDsKKworICAgIGZvciAoaW50MzJfdCBwYXNzID0gMDsgcGFzcyA8IDI7ICsrcGFzcykgeworICAgICAgICBzaXplX3Qgc3JjT2Zmc2V0ID0gMDsKKyAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7CisgICAgICAgIHdoaWxlIChzcmNPZmZzZXQgKyBtTkFMU2l6ZUxlbiA8PSBzcmNTaXplKSB7CisgICAgICAgICAgICBzaXplX3QgTkFMc2l6ZTsKKyAgICAgICAgICAgIHN3aXRjaCAobU5BTFNpemVMZW4pIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE6IE5BTHNpemUgPSBzcmNQdHJbc3JjT2Zmc2V0XTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOiBOQUxzaXplID0gVTE2X0FUKHNyY1B0ciArIHNyY09mZnNldCk7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzogTkFMc2l6ZSA9IFUyNF9BVChzcmNQdHIgKyBzcmNPZmZzZXQpOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6IE5BTHNpemUgPSBVMzJfQVQoc3JjUHRyICsgc3JjT2Zmc2V0KTsgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNyY09mZnNldCArIG1OQUxTaXplTGVuICsgTkFMc2l6ZSA8PSBzcmNPZmZzZXQgKyBtTkFMU2l6ZUxlbikgeworICAgICAgICAgICAgICAgIGZyYW1lLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgZnJhbWUgPSBOVUxMOworCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjT2Zmc2V0ICsgbU5BTFNpemVMZW4gKyBOQUxzaXplID4gc3JjU2l6ZSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGFzcyA9PSAxKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZkc3RQdHJbZHN0T2Zmc2V0XSwgIlx4MDBceDAwXHgwMFx4MDEiLCA0KTsKKworICAgICAgICAgICAgICAgIGlmIChmcmFtZSAhPSBidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZkc3RQdHJbZHN0T2Zmc2V0ICsgNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUHRyW3NyY09mZnNldCArIG1OQUxTaXplTGVuXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BTHNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHN0T2Zmc2V0ICs9IDQ7ICAvLyAweDAwIDAwIDAwIDAxCisgICAgICAgICAgICBkc3RPZmZzZXQgKz0gTkFMc2l6ZTsKKworICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG1OQUxTaXplTGVuICsgTkFMc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzcmNPZmZzZXQgPCBzcmNTaXplKSB7CisgICAgICAgICAgICAvLyBUaGVyZSB3ZXJlIHRyYWlsaW5nIGJ5dGVzIG9yIG5vdCBlbm91Z2ggZGF0YSB0byBjb21wbGV0ZQorICAgICAgICAgICAgLy8gYSBmcmFnbWVudC4KKworICAgICAgICAgICAgZnJhbWUtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGZyYW1lID0gTlVMTDsKKworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYXNzID09IDApIHsKKyAgICAgICAgICAgIGRzdFNpemUgPSBkc3RPZmZzZXQ7CisKKyAgICAgICAgICAgIGlmIChkc3RTaXplID09IHNyY1NpemUgJiYgbU5BTFNpemVMZW4gPT0gNCkgeworICAgICAgICAgICAgICAgIC8vIEluIHRoaXMgc3BlY2lhbCBjYXNlIHdlIGNhbiByZS11c2UgdGhlIGlucHV0IGJ1ZmZlciBieSBzdWJzdGl0dXRpbmcKKyAgICAgICAgICAgICAgICAvLyBlYWNoIDQtYnl0ZSBuYWwgc2l6ZSB3aXRoIGEgNC1ieXRlIHN0YXJ0IGNvZGUKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBmcmFtZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmZmVyID0gTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoZHN0U2l6ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICAgICAgQ0hFQ0soZnJhbWUtPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOworICAgICAgICAgICAgaW50MzJfdCBpc1N5bmM7CisgICAgICAgICAgICBDSEVDSyhmcmFtZS0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlJc1N5bmNGcmFtZSwgJmlzU3luYykpOworCisgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIGlzU3luYyk7CisKKyAgICAgICAgICAgIGRzdFB0ciA9ICh1aW50OF90ICopYnVmZmVyLT5kYXRhKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZnJhbWUgIT0gYnVmZmVyKSB7CisgICAgICAgIGZyYW1lLT5yZWxlYXNlKCk7CisgICAgICAgIGZyYW1lID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDBsbCkgeworICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAorICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCB0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgIH0KKworICAgICpvdXQgPSBidWZmZXI7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK01hdHJvc2thRXh0cmFjdG9yOjpNYXRyb3NrYUV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKKyAgICAgIG1SZWFkZXIobmV3IERhdGFTb3VyY2VCYXNlUmVhZGVyKG1EYXRhU291cmNlKSksCisgICAgICBtU2VnbWVudChOVUxMKSwKKyAgICAgIG1FeHRyYWN0ZWRUaHVtYm5haWxzKGZhbHNlKSwKKyAgICAgIG1Jc1dlYm0oZmFsc2UpLAorICAgICAgbVNlZWtQcmVSb2xsTnMoMCkgeworICAgIG9mZjY0X3Qgc2l6ZTsKKyAgICBtSXNMaXZlU3RyZWFtaW5nID0KKyAgICAgICAgKG1EYXRhU291cmNlLT5mbGFncygpCisgICAgICAgICAgICAmIChEYXRhU291cmNlQmFzZTo6a1dhbnRzUHJlZmV0Y2hpbmcKKyAgICAgICAgICAgICAgICB8IERhdGFTb3VyY2VCYXNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSkpCisgICAgICAgICYmIG1EYXRhU291cmNlLT5nZXRTaXplKCZzaXplKSAhPSBPSzsKKworICAgIG1rdnBhcnNlcjo6RUJNTEhlYWRlciBlYm1sSGVhZGVyOworICAgIGxvbmcgbG9uZyBwb3M7CisgICAgaWYgKGVibWxIZWFkZXIuUGFyc2UobVJlYWRlciwgcG9zKSA8IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChlYm1sSGVhZGVyLm1fZG9jVHlwZSAmJiAhc3RyY21wKCJ3ZWJtIiwgZWJtbEhlYWRlci5tX2RvY1R5cGUpKSB7CisgICAgICAgIG1Jc1dlYm0gPSB0cnVlOworICAgIH0KKworICAgIGxvbmcgbG9uZyByZXQgPQorICAgICAgICBta3ZwYXJzZXI6OlNlZ21lbnQ6OkNyZWF0ZUluc3RhbmNlKG1SZWFkZXIsIHBvcywgbVNlZ21lbnQpOworCisgICAgaWYgKHJldCkgeworICAgICAgICBDSEVDSyhtU2VnbWVudCA9PSBOVUxMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGZyb20gbWt2cGFyc2VyOjpTZWdtZW50OjpMb2FkKCksIGJ1dCBzdG9wIGF0IGZpcnN0IGNsdXN0ZXIKKyAgICByZXQgPSBtU2VnbWVudC0+UGFyc2VIZWFkZXJzKCk7CisgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgIGxvbmcgbGVuOworICAgICAgICByZXQgPSBtU2VnbWVudC0+TG9hZENsdXN0ZXIocG9zLCBsZW4pOworICAgICAgICBpZiAocmV0ID49IDEpIHsKKyAgICAgICAgICAgIC8vIG5vIG1vcmUgY2x1c3RlcnMKKyAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHJldCA+IDApIHsKKyAgICAgICAgcmV0ID0gbWt2cGFyc2VyOjpFX0JVRkZFUl9OT1RfRlVMTDsKKyAgICB9CisKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBjaGFyIHVyaVsxMDI0XTsKKyAgICAgICAgaWYoIW1EYXRhU291cmNlLT5nZXRVcmkodXJpLCBzaXplb2YodXJpKSkpIHsKKyAgICAgICAgICAgIHVyaVswXSA9ICdcMCc7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1coIkNvcnJ1cHQgJXMgc291cmNlOiAlcyIsIG1Jc1dlYm0gPyAid2VibSIgOiAibWF0cm9za2EiLAorICAgICAgICAgICAgICAgIHVyaURlYnVnU3RyaW5nKHVyaSkuY19zdHIoKSk7CisgICAgICAgIGRlbGV0ZSBtU2VnbWVudDsKKyAgICAgICAgbVNlZ21lbnQgPSBOVUxMOworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWYgMAorICAgIGNvbnN0IG1rdnBhcnNlcjo6U2VnbWVudEluZm8gKmluZm8gPSBtU2VnbWVudC0+R2V0SW5mbygpOworICAgIEFMT0dJKCJtdXhpbmcgYXBwOiAlcywgd3JpdGluZyBhcHA6ICVzIiwKKyAgICAgICAgIGluZm8tPkdldE11eGluZ0FwcEFzVVRGOCgpLAorICAgICAgICAgaW5mby0+R2V0V3JpdGluZ0FwcEFzVVRGOCgpKTsKKyNlbmRpZgorCisgICAgYWRkVHJhY2tzKCk7Cit9CisKK01hdHJvc2thRXh0cmFjdG9yOjp+TWF0cm9za2FFeHRyYWN0b3IoKSB7CisgICAgZGVsZXRlIG1TZWdtZW50OworICAgIG1TZWdtZW50ID0gTlVMTDsKKworICAgIGRlbGV0ZSBtUmVhZGVyOworICAgIG1SZWFkZXIgPSBOVUxMOworfQorCitzaXplX3QgTWF0cm9za2FFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgeworICAgIHJldHVybiBtVHJhY2tzLnNpemUoKTsKK30KKworTWVkaWFUcmFjayAqTWF0cm9za2FFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworICAgIGlmIChpbmRleCA+PSBtVHJhY2tzLnNpemUoKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IE1hdHJvc2thU291cmNlKHRoaXMsIGluZGV4KTsKK30KKworc3RhdHVzX3QgTWF0cm9za2FFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykgeworICAgIGlmIChpbmRleCA+PSBtVHJhY2tzLnNpemUoKSkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoKGZsYWdzICYga0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSkgJiYgIW1FeHRyYWN0ZWRUaHVtYm5haWxzCisgICAgICAgICAgICAmJiAhaXNMaXZlU3RyZWFtaW5nKCkpIHsKKyAgICAgICAgZmluZFRodW1ibmFpbHMoKTsKKyAgICAgICAgbUV4dHJhY3RlZFRodW1ibmFpbHMgPSB0cnVlOworICAgIH0KKworICAgIG1ldGEgPSBtVHJhY2tzLml0ZW1BdChpbmRleCkubU1ldGE7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIE1hdHJvc2thRXh0cmFjdG9yOjppc0xpdmVTdHJlYW1pbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jc0xpdmVTdHJlYW1pbmc7Cit9CisKK3N0YXRpYyBpbnQgYnl0ZXNGb3JTaXplKHNpemVfdCBzaXplKSB7CisgICAgLy8gdXNlIGF0IG1vc3QgMjggYml0cyAoNCB0aW1lcyA3KQorICAgIENIRUNLKHNpemUgPD0gMHhmZmZmZmZmKTsKKworICAgIGlmIChzaXplID4gMHgxZmZmZmYpIHsKKyAgICAgICAgcmV0dXJuIDQ7CisgICAgfSBlbHNlIGlmIChzaXplID4gMHgzZmZmKSB7CisgICAgICAgIHJldHVybiAzOworICAgIH0gZWxzZSBpZiAoc2l6ZSA+IDB4N2YpIHsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBzdG9yZVNpemUodWludDhfdCAqZGF0YSwgc2l6ZV90ICZpZHgsIHNpemVfdCBzaXplKSB7CisgICAgaW50IG51bUJ5dGVzID0gYnl0ZXNGb3JTaXplKHNpemUpOworICAgIGlkeCArPSBudW1CeXRlczsKKworICAgIGRhdGEgKz0gaWR4OworICAgIHNpemVfdCBuZXh0ID0gMDsKKyAgICB3aGlsZSAobnVtQnl0ZXMtLSkgeworICAgICAgICAqLS1kYXRhID0gKHNpemUgJiAweDdmKSB8IG5leHQ7CisgICAgICAgIHNpemUgPj49IDc7CisgICAgICAgIG5leHQgPSAweDgwOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYWRkRVNEU0Zyb21Db2RlY1ByaXZhdGUoCisgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgYm9vbCBpc0F1ZGlvLCBjb25zdCB2b2lkICpwcml2LCBzaXplX3QgcHJpdlNpemUpIHsKKworICAgIGludCBwcml2U2l6ZUJ5dGVzUmVxdWlyZWQgPSBieXRlc0ZvclNpemUocHJpdlNpemUpOworICAgIGludCBlc2RzU2l6ZTIgPSAxNCArIHByaXZTaXplQnl0ZXNSZXF1aXJlZCArIHByaXZTaXplOworICAgIGludCBlc2RzU2l6ZTJCeXRlc1JlcXVpcmVkID0gYnl0ZXNGb3JTaXplKGVzZHNTaXplMik7CisgICAgaW50IGVzZHNTaXplMSA9IDQgKyBlc2RzU2l6ZTJCeXRlc1JlcXVpcmVkICsgZXNkc1NpemUyOworICAgIGludCBlc2RzU2l6ZTFCeXRlc1JlcXVpcmVkID0gYnl0ZXNGb3JTaXplKGVzZHNTaXplMSk7CisgICAgc2l6ZV90IGVzZHNTaXplID0gMSArIGVzZHNTaXplMUJ5dGVzUmVxdWlyZWQgKyBlc2RzU2l6ZTE7CisgICAgdWludDhfdCAqZXNkcyA9IG5ldyB1aW50OF90W2VzZHNTaXplXTsKKworICAgIHNpemVfdCBpZHggPSAwOworICAgIGVzZHNbaWR4KytdID0gMHgwMzsKKyAgICBzdG9yZVNpemUoZXNkcywgaWR4LCBlc2RzU2l6ZTEpOworICAgIGVzZHNbaWR4KytdID0gMHgwMDsgLy8gRVNfSUQKKyAgICBlc2RzW2lkeCsrXSA9IDB4MDA7IC8vIEVTX0lECisgICAgZXNkc1tpZHgrK10gPSAweDAwOyAvLyBzdHJlYW1EZXBlbmRlbmNlRmxhZywgVVJMX0ZsYWcsIE9DUnN0cmVhbUZsYWcKKyAgICBlc2RzW2lkeCsrXSA9IDB4MDQ7CisgICAgc3RvcmVTaXplKGVzZHMsIGlkeCwgZXNkc1NpemUyKTsKKyAgICBlc2RzW2lkeCsrXSA9IGlzQXVkaW8gPyAweDQwICAgLy8gQXVkaW8gSVNPL0lFQyAxNDQ5Ni0zCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogMHgyMDsgIC8vIFZpc3VhbCBJU08vSUVDIDE0NDk2LTIKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDEyOyBpKyspIHsKKyAgICAgICAgZXNkc1tpZHgrK10gPSAweDAwOworICAgIH0KKyAgICBlc2RzW2lkeCsrXSA9IDB4MDU7CisgICAgc3RvcmVTaXplKGVzZHMsIGlkeCwgcHJpdlNpemUpOworICAgIG1lbWNweShlc2RzICsgaWR4LCBwcml2LCBwcml2U2l6ZSk7CisKKyAgICBtZXRhLnNldERhdGEoa0tleUVTRFMsIDAsIGVzZHMsIGVzZHNTaXplKTsKKworICAgIGRlbGV0ZVtdIGVzZHM7CisgICAgZXNkcyA9IE5VTEw7Cit9CisKK3N0YXR1c190IGFkZFZvcmJpc0NvZGVjSW5mbygKKyAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICBjb25zdCB2b2lkICpfY29kZWNQcml2YXRlLCBzaXplX3QgY29kZWNQcml2YXRlU2l6ZSkgeworICAgIC8vIGhleGR1bXAoX2NvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisKKyAgICBpZiAoY29kZWNQcml2YXRlU2l6ZSA8IDEpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpjb2RlY1ByaXZhdGUgPSAoY29uc3QgdWludDhfdCAqKV9jb2RlY1ByaXZhdGU7CisKKyAgICBpZiAoY29kZWNQcml2YXRlWzBdICE9IDB4MDIpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICAvLyBjb2RlY0luZm8gc3RhcnRzIHdpdGggdHdvIGxlbmd0aHMsIGxlbjEgYW5kIGxlbjIsIHRoYXQgYXJlCisgICAgLy8gIlhpcGgtc3R5bGUtbGFjaW5nIGVuY29kZWQiLi4uCisKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMTsKKyAgICBzaXplX3QgbGVuMSA9IDA7CisgICAgd2hpbGUgKG9mZnNldCA8IGNvZGVjUHJpdmF0ZVNpemUgJiYgY29kZWNQcml2YXRlW29mZnNldF0gPT0gMHhmZikgeworICAgICAgICBpZiAobGVuMSA+IChTSVpFX01BWCAtIDB4ZmYpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOyAvLyB3b3VsZCBvdmVyZmxvdworICAgICAgICB9CisgICAgICAgIGxlbjEgKz0gMHhmZjsKKyAgICAgICAgKytvZmZzZXQ7CisgICAgfQorICAgIGlmIChvZmZzZXQgPj0gY29kZWNQcml2YXRlU2l6ZSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICBpZiAobGVuMSA+IChTSVpFX01BWCAtIGNvZGVjUHJpdmF0ZVtvZmZzZXRdKSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOyAvLyB3b3VsZCBvdmVyZmxvdworICAgIH0KKyAgICBsZW4xICs9IGNvZGVjUHJpdmF0ZVtvZmZzZXQrK107CisKKyAgICBzaXplX3QgbGVuMiA9IDA7CisgICAgd2hpbGUgKG9mZnNldCA8IGNvZGVjUHJpdmF0ZVNpemUgJiYgY29kZWNQcml2YXRlW29mZnNldF0gPT0gMHhmZikgeworICAgICAgICBpZiAobGVuMiA+IChTSVpFX01BWCAtIDB4ZmYpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOyAvLyB3b3VsZCBvdmVyZmxvdworICAgICAgICB9CisgICAgICAgIGxlbjIgKz0gMHhmZjsKKyAgICAgICAgKytvZmZzZXQ7CisgICAgfQorICAgIGlmIChvZmZzZXQgPj0gY29kZWNQcml2YXRlU2l6ZSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICBpZiAobGVuMiA+IChTSVpFX01BWCAtIGNvZGVjUHJpdmF0ZVtvZmZzZXRdKSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOyAvLyB3b3VsZCBvdmVyZmxvdworICAgIH0KKyAgICBsZW4yICs9IGNvZGVjUHJpdmF0ZVtvZmZzZXQrK107CisKKyAgICBpZiAobGVuMSA+IFNJWkVfTUFYIC0gbGVuMiB8fCBvZmZzZXQgPiBTSVpFX01BWCAtIChsZW4xICsgbGVuMikgfHwKKyAgICAgICAgICAgIGNvZGVjUHJpdmF0ZVNpemUgPCBvZmZzZXQgKyBsZW4xICsgbGVuMikgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGlmIChjb2RlY1ByaXZhdGVbb2Zmc2V0XSAhPSAweDAxKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIG1ldGEuc2V0RGF0YShrS2V5Vm9yYmlzSW5mbywgMCwgJmNvZGVjUHJpdmF0ZVtvZmZzZXRdLCBsZW4xKTsKKworICAgIG9mZnNldCArPSBsZW4xOworICAgIGlmIChjb2RlY1ByaXZhdGVbb2Zmc2V0XSAhPSAweDAzKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgb2Zmc2V0ICs9IGxlbjI7CisgICAgaWYgKGNvZGVjUHJpdmF0ZVtvZmZzZXRdICE9IDB4MDUpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBtZXRhLnNldERhdGEoCisgICAgICAgICAgICBrS2V5Vm9yYmlzQm9va3MsIDAsICZjb2RlY1ByaXZhdGVbb2Zmc2V0XSwKKyAgICAgICAgICAgIGNvZGVjUHJpdmF0ZVNpemUgLSBvZmZzZXQpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0aWMgc3RhdHVzX3QgYWRkRmxhY01ldGFkYXRhKAorICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIGNvbnN0IHZvaWQgKmNvZGVjUHJpdmF0ZSwgc2l6ZV90IGNvZGVjUHJpdmF0ZVNpemUpIHsKKyAgICAvLyBoZXhkdW1wKGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisKKyAgICBtZXRhLnNldERhdGEoa0tleUZsYWNNZXRhZGF0YSwgMCwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKworICAgIGludDMyX3QgbWF4SW5wdXRTaXplID0gNjQgPDwgMTA7CisgICAgRkxBQ0RlY29kZXIgKmZsYWNEZWNvZGVyID0gRkxBQ0RlY29kZXI6OkNyZWF0ZSgpOworICAgIGlmIChmbGFjRGVjb2RlciAhPSBOVUxMCisgICAgICAgICAgICAmJiBmbGFjRGVjb2Rlci0+cGFyc2VNZXRhZGF0YSgoY29uc3QgdWludDhfdCopY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKSA9PSBPSykgeworICAgICAgICBGTEFDX19TdHJlYW1NZXRhZGF0YV9TdHJlYW1JbmZvIHN0cmVhbUluZm8gPSBmbGFjRGVjb2Rlci0+Z2V0U3RyZWFtSW5mbygpOworICAgICAgICBtYXhJbnB1dFNpemUgPSBzdHJlYW1JbmZvLm1heF9mcmFtZXNpemU7CisgICAgICAgIGlmIChtYXhJbnB1dFNpemUgPT0gMCkgeworICAgICAgICAgICAgLy8gSW4gY2FzZSBtYXggZnJhbWVzaXplIGlzIG5vdCBhdmFpbGFibGUsIHVzZSByYXcgZGF0YSBzaXplIGFzIG1heCBmcmFtZXNpemUsCisgICAgICAgICAgICAvLyBhc3N1bWluZyB0aGVyZSBpcyBubyBleHBhbnNpb24uCisgICAgICAgICAgICBpZiAoc3RyZWFtSW5mby5tYXhfYmxvY2tzaXplICE9IDAKKyAgICAgICAgICAgICAgICAgICAgJiYgc3RyZWFtSW5mby5jaGFubmVscyAhPSAwCisgICAgICAgICAgICAgICAgICAgICYmICgoc3RyZWFtSW5mby5iaXRzX3Blcl9zYW1wbGUgKyA3KSAvIDgpID4KKyAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyX01BWCAvIHN0cmVhbUluZm8ubWF4X2Jsb2Nrc2l6ZSAvIHN0cmVhbUluZm8uY2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICBkZWxldGUgZmxhY0RlY29kZXI7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1heElucHV0U2l6ZSA9ICgoc3RyZWFtSW5mby5iaXRzX3Blcl9zYW1wbGUgKyA3KSAvIDgpCisgICAgICAgICAgICAgICAgKiBzdHJlYW1JbmZvLm1heF9ibG9ja3NpemUgKiBzdHJlYW1JbmZvLmNoYW5uZWxzOworICAgICAgICB9CisgICAgfQorICAgIG1ldGEuc2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgbWF4SW5wdXRTaXplKTsKKworICAgIGRlbGV0ZSBmbGFjRGVjb2RlcjsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1hdHJvc2thRXh0cmFjdG9yOjpzeW50aGVzaXplQVZDQyhUcmFja0luZm8gKnRyYWNrSW5mbywgc2l6ZV90IGluZGV4KSB7CisgICAgQmxvY2tJdGVyYXRvciBpdGVyKHRoaXMsIHRyYWNrSW5mby0+bVRyYWNrTnVtLCBpbmRleCk7CisgICAgaWYgKGl0ZXIuZW9zKCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBjb25zdCBta3ZwYXJzZXI6OkJsb2NrICpibG9jayA9IGl0ZXIuYmxvY2soKTsKKyAgICBpZiAoYmxvY2stPkdldEZyYW1lQ291bnQoKSA8PSAwKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgY29uc3QgbWt2cGFyc2VyOjpCbG9jazo6RnJhbWUgJmZyYW1lID0gYmxvY2stPkdldEZyYW1lKDApOworICAgIGF1dG8gdG1wRGF0YSA9IGhlYXBidWZmZXI8dW5zaWduZWQgY2hhcj4oZnJhbWUubGVuKTsKKyAgICBsb25nIG4gPSBmcmFtZS5SZWFkKG1SZWFkZXIsIHRtcERhdGEuZ2V0KCkpOworICAgIGlmIChuICE9IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBpZiAoIU1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YSh0cmFja0luZm8tPm1NZXRhLCB0bXBEYXRhLmdldCgpLCBmcmFtZS5sZW4pKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgLy8gT3ZlcnJpZGUgdGhlIHN5bnRoZXNpemVkIG5hbCBsZW5ndGggc2l6ZSwgd2hpY2ggaXMgYXJiaXRyYXJ5CisgICAgdHJhY2tJbmZvLT5tTWV0YS5zZXRJbnQzMihrS2V5TmFsTGVuZ3RoU2l6ZSwgMCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNWYWxpZEludDMyQ29sb3VyVmFsdWUobG9uZyBsb25nIHZhbHVlKSB7CisgICAgcmV0dXJuIHZhbHVlICE9IG1rdnBhcnNlcjo6Q29sb3VyOjprVmFsdWVOb3RQcmVzZW50CisgICAgICAgICAgICAmJiB2YWx1ZSA+PSBJTlQzMl9NSU4KKyAgICAgICAgICAgICYmIHZhbHVlIDw9IElOVDMyX01BWDsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzVmFsaWRVaW50MTZDb2xvdXJWYWx1ZShsb25nIGxvbmcgdmFsdWUpIHsKKyAgICByZXR1cm4gdmFsdWUgIT0gbWt2cGFyc2VyOjpDb2xvdXI6OmtWYWx1ZU5vdFByZXNlbnQKKyAgICAgICAgICAgICYmIHZhbHVlID49IDAKKyAgICAgICAgICAgICYmIHZhbHVlIDw9IFVJTlQxNl9NQVg7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1ZhbGlkUHJpbWFyeShjb25zdCBta3ZwYXJzZXI6OlByaW1hcnlDaHJvbWF0aWNpdHkgKnByaW1hcnkpIHsKKyAgICByZXR1cm4gcHJpbWFyeSAhPSBOVUxMICYmIHByaW1hcnktPnggPj0gMCAmJiBwcmltYXJ5LT54IDw9IDEKKyAgICAgICAgICAgICAmJiBwcmltYXJ5LT55ID49IDAgJiYgcHJpbWFyeS0+eSA8PSAxOworfQorCit2b2lkIE1hdHJvc2thRXh0cmFjdG9yOjpnZXRDb2xvckluZm9ybWF0aW9uKAorICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlZpZGVvVHJhY2sgKnZ0cmFjaywgTWV0YURhdGFCYXNlICZtZXRhKSB7CisgICAgY29uc3QgbWt2cGFyc2VyOjpDb2xvdXIgKmNvbG9yID0gdnRyYWNrLT5HZXRDb2xvdXIoKTsKKyAgICBpZiAoY29sb3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gQ29sb3IgQXNwZWN0cworICAgIHsKKyAgICAgICAgaW50MzJfdCBwcmltYXJpZXMgPSAyOyAvLyBJU08gdW5zcGVjaWZpZWQKKyAgICAgICAgaW50MzJfdCB0cmFuc2ZlciA9IDI7IC8vIElTTyB1bnNwZWNpZmllZAorICAgICAgICBpbnQzMl90IGNvZWZmcyA9IDI7IC8vIElTTyB1bnNwZWNpZmllZAorICAgICAgICBib29sIGZ1bGxSYW5nZSA9IGZhbHNlOyAvLyBkZWZhdWx0CisgICAgICAgIGJvb2wgcmFuZ2VTcGVjaWZpZWQgPSBmYWxzZTsKKworICAgICAgICBpZiAoaXNWYWxpZEludDMyQ29sb3VyVmFsdWUoY29sb3ItPnByaW1hcmllcykpIHsKKyAgICAgICAgICAgIHByaW1hcmllcyA9IGNvbG9yLT5wcmltYXJpZXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzVmFsaWRJbnQzMkNvbG91clZhbHVlKGNvbG9yLT50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MpKSB7CisgICAgICAgICAgICB0cmFuc2ZlciA9IGNvbG9yLT50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3M7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzVmFsaWRJbnQzMkNvbG91clZhbHVlKGNvbG9yLT5tYXRyaXhfY29lZmZpY2llbnRzKSkgeworICAgICAgICAgICAgY29lZmZzID0gY29sb3ItPm1hdHJpeF9jb2VmZmljaWVudHM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbG9yLT5yYW5nZSAhPSBta3ZwYXJzZXI6OkNvbG91cjo6a1ZhbHVlTm90UHJlc2VudAorICAgICAgICAgICAgICAgICYmIGNvbG9yLT5yYW5nZSAhPSAwIC8qIE1LViB1bnNwZWNpZmllZCAqLykgeworICAgICAgICAgICAgLy8gV2Ugb25seSBzdXBwb3J0IE1LViBicm9hZGNhc3QgcmFuZ2UgKD09IGxpbWl0ZWQpIGFuZCBmdWxsIHJhbmdlLgorICAgICAgICAgICAgLy8gV2UgdHJlYXQgYWxsIG90aGVyIHZhbHVlIGFzIHRoZSBkZWZhdWx0IGxpbWl0ZWQgcmFuZ2UuCisgICAgICAgICAgICBmdWxsUmFuZ2UgPSBjb2xvci0+cmFuZ2UgPT0gMiAvKiBNS1YgZnVsbFJhbmdlICovOworICAgICAgICAgICAgcmFuZ2VTcGVjaWZpZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQ29sb3JBc3BlY3RzIGFzcGVjdHM7CisgICAgICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cygKKyAgICAgICAgICAgICAgICBwcmltYXJpZXMsIHRyYW5zZmVyLCBjb2VmZnMsIGZ1bGxSYW5nZSwgYXNwZWN0cyk7CisgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUNvbG9yUHJpbWFyaWVzLCBhc3BlY3RzLm1QcmltYXJpZXMpOworICAgICAgICBtZXRhLnNldEludDMyKGtLZXlUcmFuc2ZlckZ1bmN0aW9uLCBhc3BlY3RzLm1UcmFuc2Zlcik7CisgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUNvbG9yTWF0cml4LCBhc3BlY3RzLm1NYXRyaXhDb2VmZnMpOworICAgICAgICBtZXRhLnNldEludDMyKAorICAgICAgICAgICAgICAgIGtLZXlDb2xvclJhbmdlLCByYW5nZVNwZWNpZmllZCA/IGFzcGVjdHMubVJhbmdlIDogQ29sb3JBc3BlY3RzOjpSYW5nZVVuc3BlY2lmaWVkKTsKKyAgICB9CisKKyAgICAvLyBIRFIgU3RhdGljIEluZm8KKyAgICB7CisgICAgICAgIEhEUlN0YXRpY0luZm8gaW5mbywgbnVsbEluZm87IC8vIG51bGxJbmZvIGlzIGEgZnVsbHkgdW5zcGVjaWZpZWQgc3RhdGljIGluZm8KKyAgICAgICAgbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworICAgICAgICBtZW1zZXQoJm51bGxJbmZvLCAwLCBzaXplb2YobnVsbEluZm8pKTsKKyAgICAgICAgaWYgKGlzVmFsaWRVaW50MTZDb2xvdXJWYWx1ZShjb2xvci0+bWF4X2NsbCkpIHsKKyAgICAgICAgICAgIGluZm8uc1R5cGUxLm1NYXhDb250ZW50TGlnaHRMZXZlbCA9IGNvbG9yLT5tYXhfY2xsOworICAgICAgICB9CisgICAgICAgIGlmIChpc1ZhbGlkVWludDE2Q29sb3VyVmFsdWUoY29sb3ItPm1heF9mYWxsKSkgeworICAgICAgICAgICAgaW5mby5zVHlwZTEubU1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWwgPSBjb2xvci0+bWF4X2ZhbGw7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpNYXN0ZXJpbmdNZXRhZGF0YSAqbWFzdGVyaW5nID0gY29sb3ItPm1hc3RlcmluZ19tZXRhZGF0YTsKKyAgICAgICAgaWYgKG1hc3RlcmluZyAhPSBOVUxMKSB7CisgICAgICAgICAgICAvLyBDb252ZXJ0IG1hdHJvc2thIHZhbHVlcyB0byBIRFJTdGF0aWNJbmZvIGVxdWl2YWxlbnQgdmFsdWVzIGZvciBlYWNoIGZ1bGx5IHNwZWNpZmllZAorICAgICAgICAgICAgLy8gZ3JvdXAuIFNlZSBDVEEtNjgxLjMgc2VjdGlvbiAzLjIuMSBmb3IgbW9yZSBpbmZvLgorICAgICAgICAgICAgaWYgKG1hc3RlcmluZy0+bHVtaW5hbmNlX21heCA+PSAwLjUgJiYgbWFzdGVyaW5nLT5sdW1pbmFuY2VfbWF4IDwgNjU1MzUuNSkgeworICAgICAgICAgICAgICAgIGluZm8uc1R5cGUxLm1NYXhEaXNwbGF5THVtaW5hbmNlID0gKHVpbnQxNl90KShtYXN0ZXJpbmctPmx1bWluYW5jZV9tYXggKyAwLjUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1hc3RlcmluZy0+bHVtaW5hbmNlX21pbiA+PSAwLjAwMDA1ICYmIG1hc3RlcmluZy0+bHVtaW5hbmNlX21pbiA8IDYuNTUzNTUpIHsKKyAgICAgICAgICAgICAgICAvLyBIRFJTdGF0aWNJbmZvIFR5cGUxIHN0b3JlcyBtaW4gbHVtaW5hbmNlIHNjYWxlZCAxMDAwMDoxCisgICAgICAgICAgICAgICAgaW5mby5zVHlwZTEubU1pbkRpc3BsYXlMdW1pbmFuY2UgPQorICAgICAgICAgICAgICAgICAgICAodWludDE2X3QpKDEwMDAwICogbWFzdGVyaW5nLT5sdW1pbmFuY2VfbWluICsgMC41KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEhEUlN0YXRpY0luZm8gVHlwZTEgc3RvcmVzIHByaW1hcmllcyBzY2FsZWQgNTAwMDA6MQorICAgICAgICAgICAgaWYgKGlzVmFsaWRQcmltYXJ5KG1hc3RlcmluZy0+d2hpdGVfcG9pbnQpKSB7CisgICAgICAgICAgICAgICAgaW5mby5zVHlwZTEubVcueCA9ICh1aW50MTZfdCkoNTAwMDAgKiBtYXN0ZXJpbmctPndoaXRlX3BvaW50LT54ICsgMC41KTsKKyAgICAgICAgICAgICAgICBpbmZvLnNUeXBlMS5tVy55ID0gKHVpbnQxNl90KSg1MDAwMCAqIG1hc3RlcmluZy0+d2hpdGVfcG9pbnQtPnkgKyAwLjUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzVmFsaWRQcmltYXJ5KG1hc3RlcmluZy0+cikgJiYgaXNWYWxpZFByaW1hcnkobWFzdGVyaW5nLT5nKQorICAgICAgICAgICAgICAgICAgICAmJiBpc1ZhbGlkUHJpbWFyeShtYXN0ZXJpbmctPmIpKSB7CisgICAgICAgICAgICAgICAgaW5mby5zVHlwZTEubVIueCA9ICh1aW50MTZfdCkoNTAwMDAgKiBtYXN0ZXJpbmctPnItPnggKyAwLjUpOworICAgICAgICAgICAgICAgIGluZm8uc1R5cGUxLm1SLnkgPSAodWludDE2X3QpKDUwMDAwICogbWFzdGVyaW5nLT5yLT55ICsgMC41KTsKKyAgICAgICAgICAgICAgICBpbmZvLnNUeXBlMS5tRy54ID0gKHVpbnQxNl90KSg1MDAwMCAqIG1hc3RlcmluZy0+Zy0+eCArIDAuNSk7CisgICAgICAgICAgICAgICAgaW5mby5zVHlwZTEubUcueSA9ICh1aW50MTZfdCkoNTAwMDAgKiBtYXN0ZXJpbmctPmctPnkgKyAwLjUpOworICAgICAgICAgICAgICAgIGluZm8uc1R5cGUxLm1CLnggPSAodWludDE2X3QpKDUwMDAwICogbWFzdGVyaW5nLT5iLT54ICsgMC41KTsKKyAgICAgICAgICAgICAgICBpbmZvLnNUeXBlMS5tQi55ID0gKHVpbnQxNl90KSg1MDAwMCAqIG1hc3RlcmluZy0+Yi0+eSArIDAuNSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gT25seSBhZHZlcnRpc2Ugc3RhdGljIGluZm8gaWYgYXQgbGVhc3Qgb25lIG9mIHRoZSBncm91cHMgaGF2ZSBiZWVuIHNwZWNpZmllZC4KKyAgICAgICAgaWYgKG1lbWNtcCgmaW5mbywgJm51bGxJbmZvLCBzaXplb2YoaW5mbykpICE9IDApIHsKKyAgICAgICAgICAgIGluZm8ubUlEID0gSERSU3RhdGljSW5mbzo6a1R5cGUxOworICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlIZHJTdGF0aWNJbmZvLCAnaGRyUycsICZpbmZvLCBzaXplb2YoaW5mbykpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6aW5pdFRyYWNrSW5mbygKKyAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayAqdHJhY2ssIE1ldGFEYXRhQmFzZSAmbWV0YSwgVHJhY2tJbmZvICp0cmFja0luZm8pIHsKKyAgICB0cmFja0luZm8tPm1UcmFja051bSA9IHRyYWNrLT5HZXROdW1iZXIoKTsKKyAgICB0cmFja0luZm8tPm1NZXRhID0gbWV0YTsKKyAgICB0cmFja0luZm8tPm1FeHRyYWN0b3IgPSB0aGlzOworICAgIHRyYWNrSW5mby0+bUVuY3J5cHRlZCA9IGZhbHNlOworICAgIHRyYWNrSW5mby0+bUhlYWRlciA9IE5VTEw7CisgICAgdHJhY2tJbmZvLT5tSGVhZGVyTGVuID0gMDsKKworICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCB0cmFjay0+R2V0Q29udGVudEVuY29kaW5nQ291bnQoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q29udGVudEVuY29kaW5nICplbmNvZGluZyA9IHRyYWNrLT5HZXRDb250ZW50RW5jb2RpbmdCeUluZGV4KGkpOworICAgICAgICBmb3Ioc2l6ZV90IGogPSAwOyBqIDwgZW5jb2RpbmctPkdldEVuY3J5cHRpb25Db3VudCgpOyBqKyspIHsKKyAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q29udGVudEVuY29kaW5nOjpDb250ZW50RW5jcnlwdGlvbiAqZW5jcnlwdGlvbjsKKyAgICAgICAgICAgIGVuY3J5cHRpb24gPSBlbmNvZGluZy0+R2V0RW5jcnlwdGlvbkJ5SW5kZXgoaik7CisgICAgICAgICAgICB0cmFja0luZm8tPm1NZXRhLnNldERhdGEoa0tleUNyeXB0b0tleSwgMCwgZW5jcnlwdGlvbi0+a2V5X2lkLCBlbmNyeXB0aW9uLT5rZXlfaWRfbGVuKTsKKyAgICAgICAgICAgIHRyYWNrSW5mby0+bUVuY3J5cHRlZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGZvcihzaXplX3QgaiA9IDA7IGogPCBlbmNvZGluZy0+R2V0Q29tcHJlc3Npb25Db3VudCgpOyBqKyspIHsKKyAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q29udGVudEVuY29kaW5nOjpDb250ZW50Q29tcHJlc3Npb24gKmNvbXByZXNzaW9uOworICAgICAgICAgICAgY29tcHJlc3Npb24gPSBlbmNvZGluZy0+R2V0Q29tcHJlc3Npb25CeUluZGV4KGopOworICAgICAgICAgICAgQUxPR1YoImNvbXByZXNzaW9uIGFsZ28gJWxsdSBzZXR0aW5nc19sZW4gJWxsZCIsCisgICAgICAgICAgICAgICAgY29tcHJlc3Npb24tPmFsZ28sIGNvbXByZXNzaW9uLT5zZXR0aW5nc19sZW4pOworICAgICAgICAgICAgaWYgKGNvbXByZXNzaW9uLT5hbGdvID09IDMKKyAgICAgICAgICAgICAgICAgICAgJiYgY29tcHJlc3Npb24tPnNldHRpbmdzCisgICAgICAgICAgICAgICAgICAgICYmIGNvbXByZXNzaW9uLT5zZXR0aW5nc19sZW4gPiAwKSB7CisgICAgICAgICAgICAgICAgdHJhY2tJbmZvLT5tSGVhZGVyID0gY29tcHJlc3Npb24tPnNldHRpbmdzOworICAgICAgICAgICAgICAgIHRyYWNrSW5mby0+bUhlYWRlckxlbiA9IGNvbXByZXNzaW9uLT5zZXR0aW5nc19sZW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTWF0cm9za2FFeHRyYWN0b3I6OmFkZFRyYWNrcygpIHsKKyAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrcyAqdHJhY2tzID0gbVNlZ21lbnQtPkdldFRyYWNrcygpOworCisgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHRyYWNrcy0+R2V0VHJhY2tzQ291bnQoKTsgKytpbmRleCkgeworICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrICp0cmFjayA9IHRyYWNrcy0+R2V0VHJhY2tCeUluZGV4KGluZGV4KTsKKworICAgICAgICBpZiAodHJhY2sgPT0gTlVMTCkgeworICAgICAgICAgICAgLy8gQXBwYXJlbnRseSB0aGlzIGlzIGN1cnJlbnRseSB2YWxpZCAoaWYgdW5leHBlY3RlZCkgYmVoYXZpb3VyCisgICAgICAgICAgICAvLyBvZiB0aGUgbWt2IHBhcnNlciBsaWIuCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IGNvZGVjSUQgPSB0cmFjay0+R2V0Q29kZWNJZCgpOworICAgICAgICBBTE9HVigiY29kZWMgaWQgPSAlcyIsIGNvZGVjSUQpOworICAgICAgICBBTE9HVigiY29kZWMgbmFtZSA9ICVzIiwgdHJhY2stPkdldENvZGVjTmFtZUFzVVRGOCgpKTsKKworICAgICAgICBpZiAoY29kZWNJRCA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HVygidW5rbm93biBjb2RlY0lEIGlzIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBjb2RlY1ByaXZhdGVTaXplOworICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpjb2RlY1ByaXZhdGUgPQorICAgICAgICAgICAgdHJhY2stPkdldENvZGVjUHJpdmF0ZShjb2RlY1ByaXZhdGVTaXplKTsKKworICAgICAgICBlbnVtIHsgVklERU9fVFJBQ0sgPSAxLCBBVURJT19UUkFDSyA9IDIgfTsKKworICAgICAgICBNZXRhRGF0YUJhc2UgbWV0YTsKKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKworICAgICAgICBzd2l0Y2ggKHRyYWNrLT5HZXRUeXBlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgVklERU9fVFJBQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpWaWRlb1RyYWNrICp2dHJhY2sgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBta3ZwYXJzZXI6OlZpZGVvVHJhY2sgKj4odHJhY2spOworCisgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoIlZfTVBFRzQvSVNPL0FWQyIsIGNvZGVjSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5QVZDQywgMCwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIlZfTVBFR0gvSVNPL0hFVkMiLCBjb2RlY0lEKSkgeworICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjUHJpdmF0ZVNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleUhWQ0MsIGtUeXBlSFZDQywgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJIRVZDIGlzIGRldGVjdGVkLCBidXQgZG9lcyBub3QgaGF2ZSBjb25maWd1cmF0aW9uLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIlZfTVBFRzQvSVNPL0FTUCIsIGNvZGVjSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlY1ByaXZhdGVTaXplID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVTRFNGcm9tQ29kZWNQcml2YXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBmYWxzZSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBpcyBkZXRlY3RlZCwgYnV0IGRvZXMgbm90IGhhdmUgY29uZmlndXJhdGlvbi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY0lEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJWX1ZQOCIsIGNvZGVjSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJWX1ZQOSIsIGNvZGVjSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlY1ByaXZhdGVTaXplID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgIC8vICdjc2QtMCcgZm9yIFZQOSBpcyB0aGUgQmxvYiBvZiBDb2RlYyBQcml2YXRlIGRhdGEgYXMKKyAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWZpZWQgaW4gaHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvdnA5L3Byb2ZpbGVzLy4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0RGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlWcDlDb2RlY1ByaXZhdGUsIDAsIGNvZGVjUHJpdmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzIGlzIG5vdCBzdXBwb3J0ZWQuIiwgY29kZWNJRCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbnN0IGxvbmcgbG9uZyB3aWR0aCA9IHZ0cmFjay0+R2V0V2lkdGgoKTsKKyAgICAgICAgICAgICAgICBjb25zdCBsb25nIGxvbmcgaGVpZ2h0ID0gdnRyYWNrLT5HZXRIZWlnaHQoKTsKKyAgICAgICAgICAgICAgICBpZiAod2lkdGggPD0gMCB8fCB3aWR0aCA+IElOVDMyX01BWCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygidHJhY2sgd2lkdGggZXhjZWVkcyBpbnQzMl90LCAlbGxkIiwgd2lkdGgpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGhlaWdodCA8PSAwIHx8IGhlaWdodCA+IElOVDMyX01BWCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygidHJhY2sgaGVpZ2h0IGV4Y2VlZHMgaW50MzJfdCwgJWxsZCIsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlXaWR0aCwgKGludDMyX3Qpd2lkdGgpOworICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUhlaWdodCwgKGludDMyX3QpaGVpZ2h0KTsKKworICAgICAgICAgICAgICAgIC8vIHNldHRpbmcgZGlzcGxheSB3aWR0aC9oZWlnaHQgaXMgb3B0aW9uYWwKKyAgICAgICAgICAgICAgICBjb25zdCBsb25nIGxvbmcgZGlzcGxheVVuaXQgPSB2dHJhY2stPkdldERpc3BsYXlVbml0KCk7CisgICAgICAgICAgICAgICAgY29uc3QgbG9uZyBsb25nIGRpc3BsYXlXaWR0aCA9IHZ0cmFjay0+R2V0RGlzcGxheVdpZHRoKCk7CisgICAgICAgICAgICAgICAgY29uc3QgbG9uZyBsb25nIGRpc3BsYXlIZWlnaHQgPSB2dHJhY2stPkdldERpc3BsYXlIZWlnaHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcGxheVdpZHRoID4gMCAmJiBkaXNwbGF5V2lkdGggPD0gSU5UMzJfTUFYCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBkaXNwbGF5SGVpZ2h0ID4gMCAmJiBkaXNwbGF5SGVpZ2h0IDw9IElOVDMyX01BWCkgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRpc3BsYXlVbml0KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMDogLy8gcGl4ZWxzCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlEaXNwbGF5V2lkdGgsIChpbnQzMl90KWRpc3BsYXlXaWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlEaXNwbGF5SGVpZ2h0LCAoaW50MzJfdClkaXNwbGF5SGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IC8vIGNlbnRpbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogLy8gaW5jaGVzCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzogLy8gYXNwZWN0IHJhdGlvCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBoeXNpY2FsIGxheW91dCBzaXplIGlzIHRyZWF0ZWQgdGhlIHNhbWUgYXMgYXNwZWN0IHJhdGlvLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogZGlzcGxheVdpZHRoIGFuZCBkaXNwbGF5SGVpZ2h0IGFyZSBuZXZlciB6ZXJvIGFzIHRoZXkgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVja2VkIGluIHRoZSBpZiBhYm92ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBjb21wdXRlZFdpZHRoID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXgod2lkdGgsIGhlaWdodCAqIGRpc3BsYXlXaWR0aCAvIGRpc3BsYXlIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9uZyBsb25nIGNvbXB1dGVkSGVpZ2h0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXgoaGVpZ2h0LCB3aWR0aCAqIGRpc3BsYXlIZWlnaHQgLyBkaXNwbGF5V2lkdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXB1dGVkV2lkdGggPD0gSU5UMzJfTUFYICYmIGNvbXB1dGVkSGVpZ2h0IDw9IElOVDMyX01BWCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleURpc3BsYXlXaWR0aCwgKGludDMyX3QpY29tcHV0ZWRXaWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5RGlzcGxheUhlaWdodCwgKGludDMyX3QpY29tcHV0ZWRIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogLy8gdW5rbm93biBkaXNwbGF5IHVuaXRzLCBwZXJoYXBzIGZ1dHVyZSB2ZXJzaW9uIG9mIHNwZWMuCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGdldENvbG9ySW5mb3JtYXRpb24odnRyYWNrLCBtZXRhKTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEFVRElPX1RSQUNLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6QXVkaW9UcmFjayAqYXRyYWNrID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgbWt2cGFyc2VyOjpBdWRpb1RyYWNrICo+KHRyYWNrKTsKKworICAgICAgICAgICAgICAgIGlmICghc3RyY21wKCJBX0FBQyIsIGNvZGVjSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKGNvZGVjUHJpdmF0ZVNpemUgPj0gMik7CisKKyAgICAgICAgICAgICAgICAgICAgYWRkRVNEU0Zyb21Db2RlY1ByaXZhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgdHJ1ZSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIkFfVk9SQklTIiwgY29kZWNJRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKTsKKworICAgICAgICAgICAgICAgICAgICBlcnIgPSBhZGRWb3JiaXNDb2RlY0luZm8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIkFfT1BVUyIsIGNvZGVjSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpOworICAgICAgICAgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleU9wdXNIZWFkZXIsIDAsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50NjQoa0tleU9wdXNDb2RlY0RlbGF5LCB0cmFjay0+R2V0Q29kZWNEZWxheSgpKTsKKyAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQ2NChrS2V5T3B1c1NlZWtQcmVSb2xsLCB0cmFjay0+R2V0U2Vla1ByZVJvbGwoKSk7CisgICAgICAgICAgICAgICAgICAgIG1TZWVrUHJlUm9sbE5zID0gdHJhY2stPkdldFNlZWtQcmVSb2xsKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJBX01QRUcvTDMiLCBjb2RlY0lEKSkgeworICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIkFfRkxBQyIsIGNvZGVjSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBhZGRGbGFjTWV0YWRhdGEobWV0YSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMgaXMgbm90IHN1cHBvcnRlZC4iLCBjb2RlY0lEKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgYXRyYWNrLT5HZXRTYW1wbGluZ1JhdGUoKSk7CisgICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBhdHJhY2stPkdldENoYW5uZWxzKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgY2hhciAqbGFuZ3VhZ2UgPSB0cmFjay0+R2V0TGFuZ3VhZ2UoKTsKKyAgICAgICAgaWYgKGxhbmd1YWdlICE9IE5VTEwpIHsKKyAgICAgICAgICAgY2hhciBsYW5nWzRdOworICAgICAgICAgICBzdHJuY3B5KGxhbmcsIGxhbmd1YWdlLCAzKTsKKyAgICAgICAgICAgbGFuZ1szXSA9ICdcMCc7CisgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TWVkaWFMYW5ndWFnZSwgbGFuZyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgic2tpcHBpbmcgdHJhY2ssIGNvZGVjIHNwZWNpZmljIGRhdGEgd2FzIG1hbGZvcm1lZC4iKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgbG9uZyBsb25nIGR1cmF0aW9uTnMgPSBtU2VnbWVudC0+R2V0RHVyYXRpb24oKTsKKyAgICAgICAgbWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIChkdXJhdGlvbk5zICsgNTAwKSAvIDEwMDApOworCisgICAgICAgIG1UcmFja3MucHVzaCgpOworICAgICAgICBzaXplX3QgbiA9IG1UcmFja3Muc2l6ZSgpIC0gMTsKKyAgICAgICAgVHJhY2tJbmZvICp0cmFja0luZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KG4pOworICAgICAgICBpbml0VHJhY2tJbmZvKHRyYWNrLCBtZXRhLCB0cmFja0luZm8pOworCisgICAgICAgIGlmICghc3RyY21wKCJWX01QRUc0L0lTTy9BVkMiLCBjb2RlY0lEKSAmJiBjb2RlY1ByaXZhdGVTaXplID09IDApIHsKKyAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gcmVjb3ZlciBmcm9tIEFWQyB0cmFjayB3aXRob3V0IGNvZGVjIHByaXZhdGUgZGF0YQorICAgICAgICAgICAgZXJyID0gc3ludGhlc2l6ZUFWQ0ModHJhY2tJbmZvLCBuKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBtVHJhY2tzLnBvcCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE1hdHJvc2thRXh0cmFjdG9yOjpmaW5kVGh1bWJuYWlscygpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MuZWRpdEl0ZW1BdChpKTsKKworICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICBDSEVDSyhpbmZvLT5tTWV0YS5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisKKyAgICAgICAgaWYgKHN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby8iLCA2KSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBCbG9ja0l0ZXJhdG9yIGl0ZXIodGhpcywgaW5mby0+bVRyYWNrTnVtLCBpKTsKKyAgICAgICAgaW50MzJfdCBqID0gMDsKKyAgICAgICAgaW50NjRfdCB0aHVtYm5haWxUaW1lVXMgPSAwOworICAgICAgICBzaXplX3QgbWF4QmxvY2tTaXplID0gMDsKKyAgICAgICAgd2hpbGUgKCFpdGVyLmVvcygpICYmIGogPCAyMCkgeworICAgICAgICAgICAgaWYgKGl0ZXIuYmxvY2soKS0+SXNLZXkoKSkgeworICAgICAgICAgICAgICAgICsrajsKKworICAgICAgICAgICAgICAgIHNpemVfdCBibG9ja1NpemUgPSAwOworICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgaXRlci5ibG9jaygpLT5HZXRGcmFtZUNvdW50KCk7ICsraykgeworICAgICAgICAgICAgICAgICAgICBibG9ja1NpemUgKz0gaXRlci5ibG9jaygpLT5HZXRGcmFtZShrKS5sZW47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGJsb2NrU2l6ZSA+IG1heEJsb2NrU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBtYXhCbG9ja1NpemUgPSBibG9ja1NpemU7CisgICAgICAgICAgICAgICAgICAgIHRodW1ibmFpbFRpbWVVcyA9IGl0ZXIuYmxvY2tUaW1lVXMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpdGVyLmFkdmFuY2UoKTsKKyAgICAgICAgfQorICAgICAgICBpbmZvLT5tTWV0YS5zZXRJbnQ2NChrS2V5VGh1bWJuYWlsVGltZSwgdGh1bWJuYWlsVGltZVVzKTsKKyAgICB9Cit9CisKK3N0YXR1c190IE1hdHJvc2thRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKKyAgICBtZXRhLnNldENTdHJpbmcoCisgICAgICAgICAgICBrS2V5TUlNRVR5cGUsCisgICAgICAgICAgICBtSXNXZWJtID8gInZpZGVvL3dlYm0iIDogTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01BVFJPU0tBKTsKKworICAgIHJldHVybiBPSzsKK30KKwordWludDMyX3QgTWF0cm9za2FFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgeworICAgIHVpbnQzMl90IHggPSBDQU5fUEFVU0U7CisgICAgaWYgKCFpc0xpdmVTdHJlYW1pbmcoKSkgeworICAgICAgICB4IHw9IENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9TRUVLOworICAgIH0KKworICAgIHJldHVybiB4OworfQorCitib29sIFNuaWZmTWF0cm9za2EoCisgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CisgICAgRGF0YVNvdXJjZUJhc2VSZWFkZXIgcmVhZGVyKHNvdXJjZSk7CisgICAgbWt2cGFyc2VyOjpFQk1MSGVhZGVyIGVibWxIZWFkZXI7CisgICAgbG9uZyBsb25nIHBvczsKKyAgICBpZiAoZWJtbEhlYWRlci5QYXJzZSgmcmVhZGVyLCBwb3MpIDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKmNvbmZpZGVuY2UgPSAwLjY7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCitleHRlcm4gIkMiIHsKKy8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKK19fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKK01lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworICAgIHJldHVybiB7CisgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgVVVJRCgiYWJiZWRkOTItMzhjNC00OTA0LWE0YzEtYjNmNDVmODk5OTgwIiksCisgICAgICAgIDEsCisgICAgICAgICJNYXRyb3NrYSBFeHRyYWN0b3IiLAorICAgICAgICBbXSgKKyAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICAgICAgICAgIHZvaWQgKiosCisgICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSAtPiBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgeworICAgICAgICAgICAgaWYgKFNuaWZmTWF0cm9za2Eoc291cmNlLCBjb25maWRlbmNlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IE1lZGlhRXh0cmFjdG9yKiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWF0cm9za2FFeHRyYWN0b3Ioc291cmNlKTt9OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9OworfQorCit9IC8vIGV4dGVybiAiQyIKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NjhlYTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5oCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNQVRST1NLQV9FWFRSQUNUT1JfSF8KKworI2RlZmluZSBNQVRST1NLQV9FWFRSQUNUT1JfSF8KKworI2luY2x1ZGUgIm1rdnBhcnNlci9ta3ZwYXJzZXIuaCIKKworI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBTWVzc2FnZTsKK2NsYXNzIFN0cmluZzg7CisKK2NsYXNzIE1ldGFEYXRhOworc3RydWN0IERhdGFTb3VyY2VCYXNlUmVhZGVyOworc3RydWN0IE1hdHJvc2thU291cmNlOworCitzdHJ1Y3QgTWF0cm9za2FFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworICAgIGV4cGxpY2l0IE1hdHJvc2thRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworCisgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKKworICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OworCisgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJNYXRyb3NrYUV4dHJhY3RvciI7IH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk1hdHJvc2thRXh0cmFjdG9yKCk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBNYXRyb3NrYVNvdXJjZTsKKyAgICBmcmllbmQgc3RydWN0IEJsb2NrSXRlcmF0b3I7CisKKyAgICBzdHJ1Y3QgVHJhY2tJbmZvIHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBtVHJhY2tOdW07CisgICAgICAgIGJvb2wgbUVuY3J5cHRlZDsKKyAgICAgICAgTWV0YURhdGFCYXNlIG1NZXRhOworICAgICAgICBjb25zdCBNYXRyb3NrYUV4dHJhY3RvciAqbUV4dHJhY3RvcjsKKyAgICAgICAgVmVjdG9yPGNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQqPiBtQ3VlUG9pbnRzOworCisgICAgICAgIC8vIG1IZWFkZXIgcG9pbnRzIHRvIG1lbW9yeSBtYW5hZ2VkIGJ5IG1rdnBhcnNlcjsKKyAgICAgICAgLy8gbUhlYWRlciB3b3VsZCBiZSBkZWxldGVkIHdoZW4gbVNlZ21lbnQgaXMgZGVsZXRlZAorICAgICAgICAvLyBpbiB+TWF0cm9za2FFeHRyYWN0b3IuCisgICAgICAgIHVuc2lnbmVkIGNoYXIgKm1IZWFkZXI7CisgICAgICAgIHNpemVfdCBtSGVhZGVyTGVuOworCisgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2sqIGdldFRyYWNrKCkgY29uc3Q7CisgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQ6OlRyYWNrUG9zaXRpb24gKmZpbmQobG9uZyBsb25nIHRpbWVOcykgY29uc3Q7CisgICAgfTsKKworICAgIE11dGV4IG1Mb2NrOworICAgIFZlY3RvcjxUcmFja0luZm8+IG1UcmFja3M7CisKKyAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZUJhc2VSZWFkZXIgKm1SZWFkZXI7CisgICAgbWt2cGFyc2VyOjpTZWdtZW50ICptU2VnbWVudDsKKyAgICBib29sIG1FeHRyYWN0ZWRUaHVtYm5haWxzOworICAgIGJvb2wgbUlzTGl2ZVN0cmVhbWluZzsKKyAgICBib29sIG1Jc1dlYm07CisgICAgaW50NjRfdCBtU2Vla1ByZVJvbGxOczsKKworICAgIHN0YXR1c190IHN5bnRoZXNpemVBVkNDKFRyYWNrSW5mbyAqdHJhY2tJbmZvLCBzaXplX3QgaW5kZXgpOworICAgIHN0YXR1c190IGluaXRUcmFja0luZm8oCisgICAgICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrICp0cmFjaywKKyAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvKTsKKyAgICB2b2lkIGFkZFRyYWNrcygpOworICAgIHZvaWQgZmluZFRodW1ibmFpbHMoKTsKKyAgICB2b2lkIGdldENvbG9ySW5mb3JtYXRpb24oCisgICAgICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlZpZGVvVHJhY2sgKnZ0cmFjaywKKyAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSk7CisgICAgYm9vbCBpc0xpdmVTdHJlYW1pbmcoKSBjb25zdDsKKworICAgIE1hdHJvc2thRXh0cmFjdG9yKGNvbnN0IE1hdHJvc2thRXh0cmFjdG9yICYpOworICAgIE1hdHJvc2thRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgTWF0cm9za2FFeHRyYWN0b3IgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1BVFJPU0tBX0VYVFJBQ1RPUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTk9USUNFIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTk9USUNFCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTk9USUNFCmNvcHkgdG8gbWVkaWEvZXh0cmFjdG9ycy9ta3YvTk9USUNFCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21rdi9leHBvcnRzLmxkcyBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMzA5ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9leHBvcnRzLmxkcwpAQCAtMCwwICsxIEBACit7IGdsb2JhbDogR0VURVhUUkFDVE9SREVGOyBsb2NhbDogKjsgfTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYWVhY2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDcgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKworICAgIHNyY3M6IFsKKyAgICAgICAgICAgICJNUDNFeHRyYWN0b3IuY3BwIiwKKyAgICAgICAgICAgICJWQlJJU2Vla2VyLmNwcCIsCisgICAgICAgICAgICAiWElOR1NlZWtlci5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9pZDMiLAorICAgIF0sCisKKyAgICBuYW1lOiAibGlibXAzZXh0cmFjdG9yIiwKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJleHRyYWN0b3JzIiwKKworICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJmaXJzdCIsCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgXSwKKyAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorCit9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvTVAzRXh0cmFjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2NmZjk2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvTVAzRXh0cmFjdG9yLmNwcApAQCAtMCwwICsxLDcyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTVAzRXh0cmFjdG9yIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiTVAzRXh0cmFjdG9yLmgiCisKKyNpbmNsdWRlICJJRDMuaCIKKyNpbmNsdWRlICJWQlJJU2Vla2VyLmgiCisjaW5jbHVkZSAiWElOR1NlZWtlci5oIgorCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEV2ZXJ5dGhpbmcgbXVzdCBtYXRjaCBleGNlcHQgZm9yCisvLyBwcm90ZWN0aW9uLCBiaXRyYXRlLCBwYWRkaW5nLCBwcml2YXRlIGJpdHMsIG1vZGUsIG1vZGUgZXh0ZW5zaW9uLAorLy8gY29weXJpZ2h0IGJpdCwgb3JpZ2luYWwgYml0IGFuZCBlbXBoYXNpcy4KKy8vIFllcyAuLi4gdGhlcmUgYXJlIHRoaW5ncyB0aGF0IG11c3QgaW5kZWVkIG1hdGNoLi4uCitzdGF0aWMgY29uc3QgdWludDMyX3Qga01hc2sgPSAweGZmZmUwYzAwOworCitzdGF0aWMgYm9vbCBSZXN5bmMoCisgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIHVpbnQzMl90IG1hdGNoX2hlYWRlciwKKyAgICAgICAgb2ZmNjRfdCAqaW5vdXRfcG9zLCBvZmY2NF90ICpwb3N0X2lkM19wb3MsIHVpbnQzMl90ICpvdXRfaGVhZGVyKSB7CisgICAgaWYgKHBvc3RfaWQzX3BvcyAhPSBOVUxMKSB7CisgICAgICAgICpwb3N0X2lkM19wb3MgPSAwOworICAgIH0KKworICAgIGlmICgqaW5vdXRfcG9zID09IDApIHsKKyAgICAgICAgLy8gU2tpcCBhbiBvcHRpb25hbCBJRDMgaGVhZGVyIGlmIHN5bmNpbmcgYXQgdGhlIHZlcnkgYmVnaW5uaW5nCisgICAgICAgIC8vIG9mIHRoZSBkYXRhc291cmNlLgorCisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgaWQzaGVhZGVyWzEwXTsKKyAgICAgICAgICAgIGlmIChzb3VyY2UtPnJlYWRBdCgqaW5vdXRfcG9zLCBpZDNoZWFkZXIsIHNpemVvZihpZDNoZWFkZXIpKQorICAgICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihpZDNoZWFkZXIpKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgd2UgY2FuJ3QgZXZlbiByZWFkIHRoZXNlIDEwIGJ5dGVzLCB3ZSBtaWdodCBhcyB3ZWxsIGJhaWwKKyAgICAgICAgICAgICAgICAvLyBvdXQsIGV2ZW4gaWYgdGhlcmUgX3dlcmVfIDEwIGJ5dGVzIG9mIHZhbGlkIG1wMyBhdWRpbyBkYXRhLi4uCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobWVtY21wKCJJRDMiLCBpZDNoZWFkZXIsIDMpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNraXAgdGhlIElEM3YyIGhlYWRlci4KKworICAgICAgICAgICAgc2l6ZV90IGxlbiA9CisgICAgICAgICAgICAgICAgKChpZDNoZWFkZXJbNl0gJiAweDdmKSA8PCAyMSkKKyAgICAgICAgICAgICAgICB8ICgoaWQzaGVhZGVyWzddICYgMHg3ZikgPDwgMTQpCisgICAgICAgICAgICAgICAgfCAoKGlkM2hlYWRlcls4XSAmIDB4N2YpIDw8IDcpCisgICAgICAgICAgICAgICAgfCAoaWQzaGVhZGVyWzldICYgMHg3Zik7CisKKyAgICAgICAgICAgIGxlbiArPSAxMDsKKworICAgICAgICAgICAgKmlub3V0X3BvcyArPSBsZW47CisKKyAgICAgICAgICAgIEFMT0dWKCJza2lwcGVkIElEMyB0YWcsIG5ldyBzdGFydGluZyBvZmZzZXQgaXMgJWxsZCAoMHglMDE2bGx4KSIsCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpKmlub3V0X3BvcywgKGxvbmcgbG9uZykqaW5vdXRfcG9zKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwb3N0X2lkM19wb3MgIT0gTlVMTCkgeworICAgICAgICAgICAgKnBvc3RfaWQzX3BvcyA9ICppbm91dF9wb3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvZmY2NF90IHBvcyA9ICppbm91dF9wb3M7CisgICAgYm9vbCB2YWxpZCA9IGZhbHNlOworCisgICAgY29uc3Qgc2l6ZV90IGtNYXhSZWFkQnl0ZXMgPSAxMDI0OworICAgIGNvbnN0IHNpemVfdCBrTWF4Qnl0ZXNDaGVja2VkID0gMTI4ICogMTAyNDsKKyAgICB1aW50OF90IGJ1ZltrTWF4UmVhZEJ5dGVzXTsKKyAgICBzc2l6ZV90IGJ5dGVzVG9SZWFkID0ga01heFJlYWRCeXRlczsKKyAgICBzc2l6ZV90IHRvdGFsQnl0ZXNSZWFkID0gMDsKKyAgICBzc2l6ZV90IHJlbWFpbmluZ0J5dGVzID0gMDsKKyAgICBib29sIHJlYWNoRU9TID0gZmFsc2U7CisgICAgdWludDhfdCAqdG1wID0gYnVmOworCisgICAgZG8geworICAgICAgICBpZiAocG9zID49IChvZmY2NF90KSgqaW5vdXRfcG9zICsga01heEJ5dGVzQ2hlY2tlZCkpIHsKKyAgICAgICAgICAgIC8vIERvbid0IHNjYW4gZm9yZXZlci4KKyAgICAgICAgICAgIEFMT0dWKCJnaXZpbmcgdXAgYXQgb2Zmc2V0ICVsbGQiLCAobG9uZyBsb25nKXBvcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZW1haW5pbmdCeXRlcyA8IDQpIHsKKyAgICAgICAgICAgIGlmIChyZWFjaEVPUykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoYnVmLCB0bXAsIHJlbWFpbmluZ0J5dGVzKTsKKyAgICAgICAgICAgICAgICBieXRlc1RvUmVhZCA9IGtNYXhSZWFkQnl0ZXMgLSByZW1haW5pbmdCeXRlczsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogVGhlIG5leHQgcmVhZCBwb3NpdGlvbiBzaG91bGQgc3RhcnQgZnJvbSB0aGUgZW5kIG9mCisgICAgICAgICAgICAgICAgICogdGhlIGxhc3QgYnVmZmVyLCBhbmQgdGh1cyBzaG91bGQgaW5jbHVkZSB0aGUgcmVtYWluaW5nCisgICAgICAgICAgICAgICAgICogYnl0ZXMgaW4gdGhlIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzUmVhZCA9IHNvdXJjZS0+cmVhZEF0KHBvcyArIHJlbWFpbmluZ0J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmICsgcmVtYWluaW5nQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1RvUmVhZCk7CisgICAgICAgICAgICAgICAgaWYgKHRvdGFsQnl0ZXNSZWFkIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlYWNoRU9TID0gKHRvdGFsQnl0ZXNSZWFkICE9IGJ5dGVzVG9SZWFkKTsKKyAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzUmVhZCArPSByZW1haW5pbmdCeXRlczsKKyAgICAgICAgICAgICAgICByZW1haW5pbmdCeXRlcyA9IHRvdGFsQnl0ZXNSZWFkOworICAgICAgICAgICAgICAgIHRtcCA9IGJ1ZjsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IGhlYWRlciA9IFUzMl9BVCh0bXApOworCisgICAgICAgIGlmIChtYXRjaF9oZWFkZXIgIT0gMCAmJiAoaGVhZGVyICYga01hc2spICE9IChtYXRjaF9oZWFkZXIgJiBrTWFzaykpIHsKKyAgICAgICAgICAgICsrcG9zOworICAgICAgICAgICAgKyt0bXA7CisgICAgICAgICAgICAtLXJlbWFpbmluZ0J5dGVzOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgZnJhbWVfc2l6ZTsKKyAgICAgICAgaW50IHNhbXBsZV9yYXRlLCBudW1fY2hhbm5lbHMsIGJpdHJhdGU7CisgICAgICAgIGlmICghR2V0TVBFR0F1ZGlvRnJhbWVTaXplKAorICAgICAgICAgICAgICAgICAgICBoZWFkZXIsICZmcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAmc2FtcGxlX3JhdGUsICZudW1fY2hhbm5lbHMsICZiaXRyYXRlKSkgeworICAgICAgICAgICAgKytwb3M7CisgICAgICAgICAgICArK3RtcDsKKyAgICAgICAgICAgIC0tcmVtYWluaW5nQnl0ZXM7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJmb3VuZCBwb3NzaWJsZSAxc3QgZnJhbWUgYXQgJWxsZCAoaGVhZGVyID0gMHglMDh4KSIsIChsb25nIGxvbmcpcG9zLCBoZWFkZXIpOworCisgICAgICAgIC8vIFdlIGZvdW5kIHdoYXQgbG9va3MgbGlrZSBhIHZhbGlkIGZyYW1lLAorICAgICAgICAvLyBub3cgZmluZCBpdHMgc3VjY2Vzc29ycy4KKworICAgICAgICBvZmY2NF90IHRlc3RfcG9zID0gcG9zICsgZnJhbWVfc2l6ZTsKKworICAgICAgICB2YWxpZCA9IHRydWU7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7CisgICAgICAgICAgICB1aW50OF90IHRtcFs0XTsKKyAgICAgICAgICAgIGlmIChzb3VyY2UtPnJlYWRBdCh0ZXN0X3BvcywgdG1wLCA0KSA8IDQpIHsKKyAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MzJfdCB0ZXN0X2hlYWRlciA9IFUzMl9BVCh0bXApOworCisgICAgICAgICAgICBBTE9HVigic3Vic2VxdWVudCBoZWFkZXIgaXMgJTA4eCIsIHRlc3RfaGVhZGVyKTsKKworICAgICAgICAgICAgaWYgKCh0ZXN0X2hlYWRlciAmIGtNYXNrKSAhPSAoaGVhZGVyICYga01hc2spKSB7CisgICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2l6ZV90IHRlc3RfZnJhbWVfc2l6ZTsKKyAgICAgICAgICAgIGlmICghR2V0TVBFR0F1ZGlvRnJhbWVTaXplKAorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9oZWFkZXIsICZ0ZXN0X2ZyYW1lX3NpemUpKSB7CisgICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR1YoImZvdW5kIHN1YnNlcXVlbnQgZnJhbWUgIyVkIGF0ICVsbGQiLCBqICsgMiwgKGxvbmcgbG9uZyl0ZXN0X3Bvcyk7CisKKyAgICAgICAgICAgIHRlc3RfcG9zICs9IHRlc3RfZnJhbWVfc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2YWxpZCkgeworICAgICAgICAgICAgKmlub3V0X3BvcyA9IHBvczsKKworICAgICAgICAgICAgaWYgKG91dF9oZWFkZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICpvdXRfaGVhZGVyID0gaGVhZGVyOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoIm5vIGRpY2UsIG5vIHZhbGlkIHNlcXVlbmNlIG9mIGZyYW1lcyBmb3VuZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgICsrcG9zOworICAgICAgICArK3RtcDsKKyAgICAgICAgLS1yZW1haW5pbmdCeXRlczsKKyAgICB9IHdoaWxlICghdmFsaWQpOworCisgICAgcmV0dXJuIHZhbGlkOworfQorCitjbGFzcyBNUDNTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CitwdWJsaWM6CisgICAgTVAzU291cmNlKAorICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLCBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICAgICAgb2ZmNjRfdCBmaXJzdF9mcmFtZV9wb3MsIHVpbnQzMl90IGZpeGVkX2hlYWRlciwKKyAgICAgICAgICAgIE1QM1NlZWtlciAqc2Vla2VyKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5NUDNTb3VyY2UoKTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhGcmFtZVNpemU7CisgICAgTWV0YURhdGFCYXNlICZtTWV0YTsKKyAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgb2ZmNjRfdCBtRmlyc3RGcmFtZVBvczsKKyAgICB1aW50MzJfdCBtRml4ZWRIZWFkZXI7CisgICAgb2ZmNjRfdCBtQ3VycmVudFBvczsKKyAgICBpbnQ2NF90IG1DdXJyZW50VGltZVVzOworICAgIGJvb2wgbVN0YXJ0ZWQ7CisgICAgTVAzU2Vla2VyICptU2Vla2VyOworICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1Hcm91cDsKKworICAgIGludDY0X3QgbUJhc2lzVGltZVVzOworICAgIGludDY0X3QgbVNhbXBsZXNSZWFkOworCisgICAgTVAzU291cmNlKGNvbnN0IE1QM1NvdXJjZSAmKTsKKyAgICBNUDNTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBNUDNTb3VyY2UgJik7Cit9OworCitzdHJ1Y3QgTXAzTWV0YSB7CisgICAgb2ZmNjRfdCBwb3M7CisgICAgb2ZmNjRfdCBwb3N0X2lkM19wb3M7CisgICAgdWludDMyX3QgaGVhZGVyOworfTsKKworTVAzRXh0cmFjdG9yOjpNUDNFeHRyYWN0b3IoCisgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIE1wM01ldGEgKm1ldGEpCisgICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpLAorICAgICAgbURhdGFTb3VyY2Uoc291cmNlKSwKKyAgICAgIG1GaXJzdEZyYW1lUG9zKC0xKSwKKyAgICAgIG1GaXhlZEhlYWRlcigwKSwKKyAgICAgIG1TZWVrZXIoTlVMTCkgeworCisgICAgb2ZmNjRfdCBwb3MgPSAwOworICAgIG9mZjY0X3QgcG9zdF9pZDNfcG9zOworICAgIHVpbnQzMl90IGhlYWRlcjsKKyAgICBib29sIHN1Y2Nlc3M7CisKKyAgICBpZiAobWV0YSAhPSBOVUxMKSB7CisgICAgICAgIC8vIFRoZSBzbmlmZmVyIGhhcyBhbHJlYWR5IGRvbmUgYWxsIHRoZSBoYXJkIHdvcmsgZm9yIHVzLCBzaW1wbHkKKyAgICAgICAgLy8gYWNjZXB0IGl0cyBqdWRnZW1lbnQuCisgICAgICAgIHBvcyA9IG1ldGEtPnBvczsKKyAgICAgICAgaGVhZGVyID0gbWV0YS0+aGVhZGVyOworICAgICAgICBwb3N0X2lkM19wb3MgPSBtZXRhLT5wb3N0X2lkM19wb3M7CisgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIHN1Y2Nlc3MgPSBSZXN5bmMobURhdGFTb3VyY2UsIDAsICZwb3MsICZwb3N0X2lkM19wb3MsICZoZWFkZXIpOworICAgIH0KKworICAgIGlmICghc3VjY2VzcykgeworICAgICAgICAvLyBtSW5pdENoZWNrIHdpbGwgcmVtYWluIE5PX0lOSVQKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1GaXJzdEZyYW1lUG9zID0gcG9zOworICAgIG1GaXhlZEhlYWRlciA9IGhlYWRlcjsKKyAgICBYSU5HU2Vla2VyICpzZWVrZXIgPSBYSU5HU2Vla2VyOjpDcmVhdGVGcm9tU291cmNlKG1EYXRhU291cmNlLCBtRmlyc3RGcmFtZVBvcyk7CisKKyAgICBpZiAoc2Vla2VyID09IE5VTEwpIHsKKyAgICAgICAgbVNlZWtlciA9IFZCUklTZWVrZXI6OkNyZWF0ZUZyb21Tb3VyY2UobURhdGFTb3VyY2UsIHBvc3RfaWQzX3Bvcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNlZWtlciA9IHNlZWtlcjsKKyAgICAgICAgaW50IGVuY2QgPSBzZWVrZXItPmdldEVuY29kZXJEZWxheSgpOworICAgICAgICBpbnQgZW5jcCA9IHNlZWtlci0+Z2V0RW5jb2RlclBhZGRpbmcoKTsKKyAgICAgICAgaWYgKGVuY2QgIT0gMCB8fCBlbmNwICE9IDApIHsKKyAgICAgICAgICAgIG1NZXRhLnNldEludDMyKGtLZXlFbmNvZGVyRGVsYXksIGVuY2QpOworICAgICAgICAgICAgbU1ldGEuc2V0SW50MzIoa0tleUVuY29kZXJQYWRkaW5nLCBlbmNwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtU2Vla2VyICE9IE5VTEwpIHsKKyAgICAgICAgLy8gV2hpbGUgaXQgaXMgc2FmZSB0byBzZW5kIHRoZSBYSU5HL1ZCUkkgZnJhbWUgdG8gdGhlIGRlY29kZXIsIHRoaXMgd2lsbAorICAgICAgICAvLyByZXN1bHQgaW4gYW4gZXh0cmEgMTE1MiBzYW1wbGVzIGJlaW5nIG91dHB1dC4gSW4gYWRkaXRpb24sIHRoZSBiaXRyYXRlCisgICAgICAgIC8vIG9mIHRoZSBYaW5nIGhlYWRlciBtaWdodCBub3QgbWF0Y2ggdGhlIHJlc3Qgb2YgdGhlIGZpbGUsIHdoaWNoIGNvdWxkCisgICAgICAgIC8vIGxlYWQgdG8gcHJvYmxlbXMgd2hlbiBzZWVraW5nLiBUaGUgcmVhbCBmaXJzdCBmcmFtZSB0byBkZWNvZGUgaXMgYWZ0ZXIKKyAgICAgICAgLy8gdGhlIFhJTkcvVkJSSSBmcmFtZSwgc28gc2tpcCB0aGVyZS4KKyAgICAgICAgc2l6ZV90IGZyYW1lX3NpemU7CisgICAgICAgIGludCBzYW1wbGVfcmF0ZTsKKyAgICAgICAgaW50IG51bV9jaGFubmVsczsKKyAgICAgICAgaW50IGJpdHJhdGU7CisgICAgICAgIEdldE1QRUdBdWRpb0ZyYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICBoZWFkZXIsICZmcmFtZV9zaXplLCAmc2FtcGxlX3JhdGUsICZudW1fY2hhbm5lbHMsICZiaXRyYXRlKTsKKyAgICAgICAgcG9zICs9IGZyYW1lX3NpemU7CisgICAgICAgIGlmICghUmVzeW5jKG1EYXRhU291cmNlLCAwLCAmcG9zLCAmcG9zdF9pZDNfcG9zLCAmaGVhZGVyKSkgeworICAgICAgICAgICAgLy8gbUluaXRDaGVjayB3aWxsIHJlbWFpbiBOT19JTklUCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUZpcnN0RnJhbWVQb3MgPSBwb3M7CisgICAgICAgIG1GaXhlZEhlYWRlciA9IGhlYWRlcjsKKyAgICB9CisKKyAgICBzaXplX3QgZnJhbWVfc2l6ZTsKKyAgICBpbnQgc2FtcGxlX3JhdGU7CisgICAgaW50IG51bV9jaGFubmVsczsKKyAgICBpbnQgYml0cmF0ZTsKKyAgICBHZXRNUEVHQXVkaW9GcmFtZVNpemUoCisgICAgICAgICAgICBoZWFkZXIsICZmcmFtZV9zaXplLCAmc2FtcGxlX3JhdGUsICZudW1fY2hhbm5lbHMsICZiaXRyYXRlKTsKKworICAgIHVuc2lnbmVkIGxheWVyID0gNCAtICgoaGVhZGVyID4+IDE3KSAmIDMpOworCisgICAgc3dpdGNoIChsYXllcikgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBtTWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBtTWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JSSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgbU1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgIH0KKworICAgIG1NZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVfcmF0ZSk7CisgICAgbU1ldGEuc2V0SW50MzIoa0tleUJpdFJhdGUsIGJpdHJhdGUgKiAxMDAwKTsKKyAgICBtTWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBudW1fY2hhbm5lbHMpOworCisgICAgaW50NjRfdCBkdXJhdGlvblVzOworCisgICAgaWYgKG1TZWVrZXIgPT0gTlVMTCB8fCAhbVNlZWtlci0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpKSB7CisgICAgICAgIG9mZjY0X3QgZmlsZVNpemU7CisgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmZmlsZVNpemUpID09IE9LKSB7CisgICAgICAgICAgICBvZmY2NF90IGRhdGFMZW5ndGggPSBmaWxlU2l6ZSAtIG1GaXJzdEZyYW1lUG9zOworICAgICAgICAgICAgaWYgKGRhdGFMZW5ndGggPiBJTlQ2NF9NQVggLyA4MDAwTEwpIHsKKyAgICAgICAgICAgICAgICAvLyBkdXJhdGlvbiB3b3VsZCBvdmVyZmxvdworICAgICAgICAgICAgICAgIGR1cmF0aW9uVXMgPSBJTlQ2NF9NQVg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGR1cmF0aW9uVXMgPSA4MDAwTEwgKiBkYXRhTGVuZ3RoIC8gYml0cmF0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGR1cmF0aW9uVXMgPSAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChkdXJhdGlvblVzID49IDApIHsKKyAgICAgICAgbU1ldGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKKyAgICB9CisKKyAgICBtSW5pdENoZWNrID0gT0s7CisKKyAgICAvLyBHZXQgaVR1bmVzLXN0eWxlIGdhcGxlc3MgaW5mbyBpZiBwcmVzZW50LgorICAgIC8vIFdoZW4gZ2V0dGluZyB0aGUgaWQzIHRhZywgc2tpcCB0aGUgVjEgdGFncyB0byBwcmV2ZW50IHRoZSBzb3VyY2UgY2FjaGUKKyAgICAvLyBmcm9tIGJlaW5nIGl0ZXJhdGVkIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUuCisgICAgSUQzIGlkMyhtRGF0YVNvdXJjZSwgdHJ1ZSk7CisgICAgaWYgKGlkMy5pc1ZhbGlkKCkpIHsKKyAgICAgICAgSUQzOjpJdGVyYXRvciAqY29tID0gbmV3IElEMzo6SXRlcmF0b3IoaWQzLCAiQ09NIik7CisgICAgICAgIGlmIChjb20tPmRvbmUoKSkgeworICAgICAgICAgICAgZGVsZXRlIGNvbTsKKyAgICAgICAgICAgIGNvbSA9IG5ldyBJRDM6Okl0ZXJhdG9yKGlkMywgIkNPTU0iKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSghY29tLT5kb25lKCkpIHsKKyAgICAgICAgICAgIFN0cmluZzggY29tbWVudGRlc2M7CisgICAgICAgICAgICBTdHJpbmc4IGNvbW1lbnR2YWx1ZTsKKyAgICAgICAgICAgIGNvbS0+Z2V0U3RyaW5nKCZjb21tZW50ZGVzYywgJmNvbW1lbnR2YWx1ZSk7CisgICAgICAgICAgICBjb25zdCBjaGFyICogZGVzYyA9IGNvbW1lbnRkZXNjLnN0cmluZygpOworICAgICAgICAgICAgY29uc3QgY2hhciAqIHZhbHVlID0gY29tbWVudHZhbHVlLnN0cmluZygpOworCisgICAgICAgICAgICAvLyBmaXJzdCAzIGNoYXJhY3RlcnMgYXJlIHRoZSBsYW5ndWFnZSwgd2hpY2ggd2UgZG9uJ3QgY2FyZSBhYm91dAorICAgICAgICAgICAgaWYoc3RybGVuKGRlc2MpID4gMyAmJiBzdHJjbXAoZGVzYyArIDMsICJpVHVuU01QQiIpID09IDApIHsKKworICAgICAgICAgICAgICAgIGludDMyX3QgZGVsYXksIHBhZGRpbmc7CisgICAgICAgICAgICAgICAgaWYgKHNzY2FuZih2YWx1ZSwgIiAlKnggJXggJXggJSp4IiwgJmRlbGF5LCAmcGFkZGluZykgPT0gMikgeworICAgICAgICAgICAgICAgICAgICBtTWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlckRlbGF5LCBkZWxheSk7CisgICAgICAgICAgICAgICAgICAgIG1NZXRhLnNldEludDMyKGtLZXlFbmNvZGVyUGFkZGluZywgcGFkZGluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29tLT5uZXh0KCk7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIGNvbTsKKyAgICAgICAgY29tID0gTlVMTDsKKyAgICB9Cit9CisKK01QM0V4dHJhY3Rvcjo6fk1QM0V4dHJhY3RvcigpIHsKKyAgICBkZWxldGUgbVNlZWtlcjsKK30KKworc2l6ZV90IE1QM0V4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7CisgICAgcmV0dXJuIG1Jbml0Q2hlY2sgIT0gT0sgPyAwIDogMTsKK30KKworTWVkaWFUcmFjayAqTVAzRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCAhPSAwKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBuZXcgTVAzU291cmNlKAorICAgICAgICAgICAgbU1ldGEsIG1EYXRhU291cmNlLCBtRmlyc3RGcmFtZVBvcywgbUZpeGVkSGVhZGVyLAorICAgICAgICAgICAgbVNlZWtlcik7Cit9CisKK3N0YXR1c190IE1QM0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgbWV0YSA9IG1NZXRhOworICAgIHJldHVybiBPSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gVGhlIHRoZW9yZXRpY2FsIG1heGltdW0gZnJhbWUgc2l6ZSBmb3IgYW4gTVBFRyBhdWRpbyBzdHJlYW0gc2hvdWxkIG9jY3VyCisvLyB3aGlsZSBwbGF5aW5nIGEgTGF5ZXIgMiwgTVBFR3YyLjUgYXVkaW8gc3RyZWFtIGF0IDE2MGticHMgKHdpdGggcGFkZGluZykuCisvLyBUaGUgc2l6ZSBvZiB0aGlzIGZyYW1lIHNob3VsZCBiZS4uLgorLy8gKCgxMTUyIHNhbXBsZXMvZnJhbWUgKiAxNjAwMDAgYml0cy9zZWMpIC8KKy8vICAoODAwMCBzYW1wbGVzL3NlYyAqIDggYml0cy9ieXRlKSkgKyAxIHBhZGRpbmcgYnl0ZS9mcmFtZSA9IDI4ODEgYnl0ZXMvZnJhbWUuCisvLyBTZXQgb3VyIG1heCBmcmFtZSBzaXplIHRvIHRoZSBuZWFyZXN0IHBvd2VyIG9mIDIgYWJvdmUgdGhpcyBzaXplIChha2EsIDRrQikKK2NvbnN0IHNpemVfdCBNUDNTb3VyY2U6OmtNYXhGcmFtZVNpemUgPSAoMSA8PCAxMik7IC8qIDQwOTYgYnl0ZXMgKi8KK01QM1NvdXJjZTo6TVAzU291cmNlKAorICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgIG9mZjY0X3QgZmlyc3RfZnJhbWVfcG9zLCB1aW50MzJfdCBmaXhlZF9oZWFkZXIsCisgICAgICAgIE1QM1NlZWtlciAqc2Vla2VyKQorICAgIDogbU1ldGEobWV0YSksCisgICAgICBtRGF0YVNvdXJjZShzb3VyY2UpLAorICAgICAgbUZpcnN0RnJhbWVQb3MoZmlyc3RfZnJhbWVfcG9zKSwKKyAgICAgIG1GaXhlZEhlYWRlcihmaXhlZF9oZWFkZXIpLAorICAgICAgbUN1cnJlbnRQb3MoMCksCisgICAgICBtQ3VycmVudFRpbWVVcygwKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1TZWVrZXIoc2Vla2VyKSwKKyAgICAgIG1Hcm91cChOVUxMKSwKKyAgICAgIG1CYXNpc1RpbWVVcygwKSwKKyAgICAgIG1TYW1wbGVzUmVhZCgwKSB7Cit9CisKK01QM1NvdXJjZTo6fk1QM1NvdXJjZSgpIHsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgc3RvcCgpOworICAgIH0KK30KKworc3RhdHVzX3QgTVAzU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKikgeworICAgIENIRUNLKCFtU3RhcnRlZCk7CisKKyAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKKworICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShrTWF4RnJhbWVTaXplKSk7CisKKyAgICBtQ3VycmVudFBvcyA9IG1GaXJzdEZyYW1lUG9zOworICAgIG1DdXJyZW50VGltZVVzID0gMDsKKworICAgIG1CYXNpc1RpbWVVcyA9IG1DdXJyZW50VGltZVVzOworICAgIG1TYW1wbGVzUmVhZCA9IDA7CisKKyAgICBtU3RhcnRlZCA9IHRydWU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QM1NvdXJjZTo6c3RvcCgpIHsKKyAgICBDSEVDSyhtU3RhcnRlZCk7CisKKyAgICBkZWxldGUgbUdyb3VwOworICAgIG1Hcm91cCA9IE5VTEw7CisKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUDNTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKKyAgICBtZXRhID0gbU1ldGE7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUDNTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICAqb3V0ID0gTlVMTDsKKworICAgIGludDY0X3Qgc2Vla1RpbWVVczsKKyAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKKyAgICBib29sIHNlZWtDQlIgPSBmYWxzZTsKKworICAgIGlmIChvcHRpb25zICE9IE5VTEwgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKKyAgICAgICAgaW50NjRfdCBhY3R1YWxTZWVrVGltZVVzID0gc2Vla1RpbWVVczsKKyAgICAgICAgaWYgKG1TZWVrZXIgPT0gTlVMTAorICAgICAgICAgICAgICAgIHx8ICFtU2Vla2VyLT5nZXRPZmZzZXRGb3JUaW1lKCZhY3R1YWxTZWVrVGltZVVzLCAmbUN1cnJlbnRQb3MpKSB7CisgICAgICAgICAgICBpbnQzMl90IGJpdHJhdGU7CisgICAgICAgICAgICBpZiAoIW1NZXRhLmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmJpdHJhdGUpKSB7CisgICAgICAgICAgICAgICAgLy8gYml0cmF0ZSBpcyBpbiBiaXRzL3NlYy4KKyAgICAgICAgICAgICAgICBBTE9HSSgibm8gYml0cmF0ZSIpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtQ3VycmVudFRpbWVVcyA9IHNlZWtUaW1lVXM7CisgICAgICAgICAgICBtQ3VycmVudFBvcyA9IG1GaXJzdEZyYW1lUG9zICsgc2Vla1RpbWVVcyAqIGJpdHJhdGUgLyA4MDAwMDAwOworICAgICAgICAgICAgc2Vla0NCUiA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQ3VycmVudFRpbWVVcyA9IGFjdHVhbFNlZWtUaW1lVXM7CisgICAgICAgIH0KKworICAgICAgICBtQmFzaXNUaW1lVXMgPSBtQ3VycmVudFRpbWVVczsKKyAgICAgICAgbVNhbXBsZXNSZWFkID0gMDsKKyAgICB9CisKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKKyAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBzaXplX3QgZnJhbWVfc2l6ZTsKKyAgICBpbnQgYml0cmF0ZTsKKyAgICBpbnQgbnVtX3NhbXBsZXM7CisgICAgaW50IHNhbXBsZV9yYXRlOworICAgIGZvciAoOzspIHsKKyAgICAgICAgc3NpemVfdCBuID0gbURhdGFTb3VyY2UtPnJlYWRBdChtQ3VycmVudFBvcywgYnVmZmVyLT5kYXRhKCksIDQpOworICAgICAgICBpZiAobiA8IDQpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKKworICAgICAgICAgICAgcmV0dXJuIChuIDwgMCA/IG4gOiBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IGhlYWRlciA9IFUzMl9BVCgoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpKTsKKworICAgICAgICBpZiAoKGhlYWRlciAmIGtNYXNrKSA9PSAobUZpeGVkSGVhZGVyICYga01hc2spCisgICAgICAgICAgICAmJiBHZXRNUEVHQXVkaW9GcmFtZVNpemUoCisgICAgICAgICAgICAgICAgaGVhZGVyLCAmZnJhbWVfc2l6ZSwgJnNhbXBsZV9yYXRlLCBOVUxMLAorICAgICAgICAgICAgICAgICZiaXRyYXRlLCAmbnVtX3NhbXBsZXMpKSB7CisKKyAgICAgICAgICAgIC8vIHJlLWNhbGN1bGF0ZSBtQ3VycmVudFRpbWVVcyBiZWNhdXNlIHdlIG1pZ2h0IGhhdmUgY2FsbGVkIFJlc3luYygpCisgICAgICAgICAgICBpZiAoc2Vla0NCUikgeworICAgICAgICAgICAgICAgIG1DdXJyZW50VGltZVVzID0gKG1DdXJyZW50UG9zIC0gbUZpcnN0RnJhbWVQb3MpICogODAwMCAvIGJpdHJhdGU7CisgICAgICAgICAgICAgICAgbUJhc2lzVGltZVVzID0gbUN1cnJlbnRUaW1lVXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gTG9zdCBzeW5jLgorICAgICAgICBBTE9HVigibG9zdCBzeW5jISBoZWFkZXIgPSAweCUwOHgsIG9sZCBoZWFkZXIgPSAweCUwOHhcbiIsIGhlYWRlciwgbUZpeGVkSGVhZGVyKTsKKworICAgICAgICBvZmY2NF90IHBvcyA9IG1DdXJyZW50UG9zOworICAgICAgICBpZiAoIVJlc3luYyhtRGF0YVNvdXJjZSwgbUZpeGVkSGVhZGVyLCAmcG9zLCBOVUxMLCBOVUxMKSkgeworICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byByZXN5bmMuIFNpZ25hbGxpbmcgZW5kIG9mIHN0cmVhbS4iKTsKKworICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBidWZmZXIgPSBOVUxMOworCisgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgfQorCisgICAgICAgIG1DdXJyZW50UG9zID0gcG9zOworCisgICAgICAgIC8vIFRyeSBhZ2FpbiB3aXRoIHRoZSBuZXcgcG9zaXRpb24uCisgICAgfQorCisgICAgQ0hFQ0soZnJhbWVfc2l6ZSA8PSBidWZmZXItPnNpemUoKSk7CisKKyAgICBzc2l6ZV90IG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG1DdXJyZW50UG9zLCBidWZmZXItPmRhdGEoKSwgZnJhbWVfc2l6ZSk7CisgICAgaWYgKG4gPCAoc3NpemVfdClmcmFtZV9zaXplKSB7CisgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICBidWZmZXIgPSBOVUxMOworCisgICAgICAgIHJldHVybiAobiA8IDAgPyBuIDogRVJST1JfRU5EX09GX1NUUkVBTSk7CisgICAgfQorCisgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZnJhbWVfc2l6ZSk7CisKKyAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCBtQ3VycmVudFRpbWVVcyk7CisgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworCisgICAgbUN1cnJlbnRQb3MgKz0gZnJhbWVfc2l6ZTsKKworICAgIG1TYW1wbGVzUmVhZCArPSBudW1fc2FtcGxlczsKKyAgICBtQ3VycmVudFRpbWVVcyA9IG1CYXNpc1RpbWVVcyArICgobVNhbXBsZXNSZWFkICogMTAwMDAwMCkgLyBzYW1wbGVfcmF0ZSk7CisKKyAgICAqb3V0ID0gYnVmZmVyOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUDNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgeworICAgIG1ldGEuY2xlYXIoKTsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgImF1ZGlvL21wZWciKTsKKworICAgIElEMyBpZDMobURhdGFTb3VyY2UpOworCisgICAgaWYgKCFpZDMuaXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdHJ1Y3QgTWFwIHsKKyAgICAgICAgaW50IGtleTsKKyAgICAgICAgY29uc3QgY2hhciAqdGFnMTsKKyAgICAgICAgY29uc3QgY2hhciAqdGFnMjsKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBNYXAga01hcFtdID0geworICAgICAgICB7IGtLZXlBbGJ1bSwgIlRBTEIiLCAiVEFMIiB9LAorICAgICAgICB7IGtLZXlBcnRpc3QsICJUUEUxIiwgIlRQMSIgfSwKKyAgICAgICAgeyBrS2V5QWxidW1BcnRpc3QsICJUUEUyIiwgIlRQMiIgfSwKKyAgICAgICAgeyBrS2V5Q29tcG9zZXIsICJUQ09NIiwgIlRDTSIgfSwKKyAgICAgICAgeyBrS2V5R2VucmUsICJUQ09OIiwgIlRDTyIgfSwKKyAgICAgICAgeyBrS2V5VGl0bGUsICJUSVQyIiwgIlRUMiIgfSwKKyAgICAgICAgeyBrS2V5WWVhciwgIlRZRSIsICJUWUVSIiB9LAorICAgICAgICB7IGtLZXlBdXRob3IsICJUWFQiLCAiVEVYVCIgfSwKKyAgICAgICAgeyBrS2V5Q0RUcmFja051bWJlciwgIlRSSyIsICJUUkNLIiB9LAorICAgICAgICB7IGtLZXlEaXNjTnVtYmVyLCAiVFBBIiwgIlRQT1MiIH0sCisgICAgICAgIHsga0tleUNvbXBpbGF0aW9uLCAiVENQIiwgIlRDTVAiIH0sCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1NYXBFbnRyaWVzID0gc2l6ZW9mKGtNYXApIC8gc2l6ZW9mKGtNYXBbMF0pOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtTWFwRW50cmllczsgKytpKSB7CisgICAgICAgIElEMzo6SXRlcmF0b3IgKml0ID0gbmV3IElEMzo6SXRlcmF0b3IoaWQzLCBrTWFwW2ldLnRhZzEpOworICAgICAgICBpZiAoaXQtPmRvbmUoKSkgeworICAgICAgICAgICAgZGVsZXRlIGl0OworICAgICAgICAgICAgaXQgPSBuZXcgSUQzOjpJdGVyYXRvcihpZDMsIGtNYXBbaV0udGFnMik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXQtPmRvbmUoKSkgeworICAgICAgICAgICAgZGVsZXRlIGl0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmc4IHM7CisgICAgICAgIGl0LT5nZXRTdHJpbmcoJnMpOworICAgICAgICBkZWxldGUgaXQ7CisKKyAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtNYXBbaV0ua2V5LCBzKTsKKyAgICB9CisKKyAgICBzaXplX3QgZGF0YVNpemU7CisgICAgU3RyaW5nOCBtaW1lOworICAgIGNvbnN0IHZvaWQgKmRhdGEgPSBpZDMuZ2V0QWxidW1BcnQoJmRhdGFTaXplLCAmbWltZSk7CisKKyAgICBpZiAoZGF0YSkgeworICAgICAgICBtZXRhLnNldERhdGEoa0tleUFsYnVtQXJ0LCBNZXRhRGF0YTo6VFlQRV9OT05FLCBkYXRhLCBkYXRhU2l6ZSk7CisgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5QWxidW1BcnRNSU1FLCBtaW1lLnN0cmluZygpKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXRpYyBNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAorICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICB2b2lkICptZXRhKSB7CisgICAgTXAzTWV0YSAqbWV0YURhdGEgPSBzdGF0aWNfY2FzdDxNcDNNZXRhICo+KG1ldGEpOworICAgIHJldHVybiBuZXcgTVAzRXh0cmFjdG9yKHNvdXJjZSwgbWV0YURhdGEpOworfQorCitzdGF0aWMgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIFNuaWZmKAorICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsCisgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKmZyZWVNZXRhKSB7CisgICAgb2ZmNjRfdCBwb3MgPSAwOworICAgIG9mZjY0X3QgcG9zdF9pZDNfcG9zOworICAgIHVpbnQzMl90IGhlYWRlcjsKKyAgICB1aW50OF90IG1wZWdfaGVhZGVyWzVdOworICAgIGlmIChzb3VyY2UtPnJlYWRBdCgwLCBtcGVnX2hlYWRlciwgc2l6ZW9mKG1wZWdfaGVhZGVyKSkgPCAoc3NpemVfdClzaXplb2YobXBlZ19oZWFkZXIpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICghbWVtY21wKCJceDAwXHgwMFx4MDFceGJhIiwgbXBlZ19oZWFkZXIsIDQpICYmIChtcGVnX2hlYWRlcls0XSA+PiA0KSA9PSAyKSB7CisgICAgICAgIEFMT0dWKCJNUEVHMVBTIGNvbnRhaW5lciBpcyBub3Qgc3VwcG9ydGVkISIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCFSZXN5bmMoc291cmNlLCAwLCAmcG9zLCAmcG9zdF9pZDNfcG9zLCAmaGVhZGVyKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBNcDNNZXRhICptcDNNZXRhID0gbmV3IE1wM01ldGE7CisgICAgbXAzTWV0YS0+cG9zID0gcG9zOworICAgIG1wM01ldGEtPmhlYWRlciA9IGhlYWRlcjsKKyAgICBtcDNNZXRhLT5wb3N0X2lkM19wb3MgPSBwb3N0X2lkM19wb3M7CisgICAgKm1ldGEgPSBtcDNNZXRhOworICAgICpmcmVlTWV0YSA9IDo6ZnJlZTsKKworICAgICpjb25maWRlbmNlID0gMC4yZjsKKworICAgIHJldHVybiBDcmVhdGVFeHRyYWN0b3I7Cit9CisKK2V4dGVybiAiQyIgeworLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAorX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQorTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CisgICAgcmV0dXJuIHsKKyAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICBVVUlEKCI4MTJhM2Y2Yy1jOGNmLTQ2ZGUtYjUyOS0zNzc0YjE0MTAzZDQiKSwKKyAgICAgICAgMSwgLy8gdmVyc2lvbgorICAgICAgICAiTVAzIEV4dHJhY3RvciIsCisgICAgICAgIFNuaWZmCisgICAgfTsKK30KKworfSAvLyBleHRlcm4gIkMiCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL01QM0V4dHJhY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NWIwY2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNUDNfRVhUUkFDVE9SX0hfCisKKyNkZWZpbmUgTVAzX0VYVFJBQ1RPUl9IXworCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQU1lc3NhZ2U7CitjbGFzcyBEYXRhU291cmNlQmFzZTsKK3N0cnVjdCBNUDNTZWVrZXI7CitjbGFzcyBTdHJpbmc4Oworc3RydWN0IE1wM01ldGE7CisKK2NsYXNzIE1QM0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CitwdWJsaWM6CisgICAgTVAzRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIE1wM01ldGEgKm1ldGEpOworICAgIH5NUDNFeHRyYWN0b3IoKTsKKworICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiTVAzRXh0cmFjdG9yIjsgfQorCitwcml2YXRlOgorICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CisKKyAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgb2ZmNjRfdCBtRmlyc3RGcmFtZVBvczsKKyAgICBNZXRhRGF0YUJhc2UgbU1ldGE7CisgICAgdWludDMyX3QgbUZpeGVkSGVhZGVyOworICAgIE1QM1NlZWtlciAqbVNlZWtlcjsKKworICAgIE1QM0V4dHJhY3Rvcihjb25zdCBNUDNFeHRyYWN0b3IgJik7CisgICAgTVAzRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgTVAzRXh0cmFjdG9yICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNUDNfRVhUUkFDVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNTZWVrZXIuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL01QM1NlZWtlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlM2FmMjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNTZWVrZXIuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNUDNfU0VFS0VSX0hfCisKKyNkZWZpbmUgTVAzX1NFRUtFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTVAzU2Vla2VyIHsKKyAgICBNUDNTZWVrZXIoKSB7fQorCisgICAgdmlydHVhbCBib29sIGdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpID0gMDsKKworICAgIC8vIEdpdmVuIGEgcmVxdWVzdCBzZWVrIHRpbWUgaW4gIip0aW1lVXMiLCBmaW5kIHRoZSBieXRlIG9mZnNldCBjbG9zZXN0CisgICAgLy8gdG8gdGhhdCBwb3NpdGlvbiBhbmQgcmV0dXJuIGl0IGluICIqcG9zIi4gVXBkYXRlICIqdGltZVVzIiB0byByZWZsZWN0CisgICAgLy8gdGhlIGFjdHVhbCB0aW1lIHRoYXQgc2Vla3BvaW50IHJlcHJlc2VudHMuCisgICAgdmlydHVhbCBib29sIGdldE9mZnNldEZvclRpbWUoaW50NjRfdCAqdGltZVVzLCBvZmY2NF90ICpwb3MpID0gMDsKKworICAgIHZpcnR1YWwgfk1QM1NlZWtlcigpIHt9CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTVAzU2Vla2VyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTVAzX1NFRUtFUl9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL1ZCUklTZWVrZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyM2YxNGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmNwcApAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVkJSSVNlZWtlciIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIlZCUklTZWVrZXIuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgdWludDMyX3QgVTI0X0FUKGNvbnN0IHVpbnQ4X3QgKnB0cikgeworICAgIHJldHVybiBwdHJbMF0gPDwgMTYgfCBwdHJbMV0gPDwgOCB8IHB0clsyXTsKK30KKworLy8gc3RhdGljCitWQlJJU2Vla2VyICpWQlJJU2Vla2VyOjpDcmVhdGVGcm9tU291cmNlKAorICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBvZmY2NF90IHBvc3RfaWQzX3BvcykgeworICAgIG9mZjY0X3QgcG9zID0gcG9zdF9pZDNfcG9zOworCisgICAgdWludDhfdCBoZWFkZXJbNF07CisgICAgc3NpemVfdCBuID0gc291cmNlLT5yZWFkQXQocG9zLCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKTsKKyAgICBpZiAobiA8IChzc2l6ZV90KXNpemVvZihoZWFkZXIpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHVpbnQzMl90IHRtcCA9IFUzMl9BVCgmaGVhZGVyWzBdKTsKKyAgICBzaXplX3QgZnJhbWVTaXplOworICAgIGludCBzYW1wbGVSYXRlOworICAgIGlmICghR2V0TVBFR0F1ZGlvRnJhbWVTaXplKHRtcCwgJmZyYW1lU2l6ZSwgJnNhbXBsZVJhdGUpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIFZCUkkgaGVhZGVyIGZvbGxvd3MgMzIgYnl0ZXMgYWZ0ZXIgdGhlIGhlYWRlciBfZW5kc18uCisgICAgcG9zICs9IHNpemVvZihoZWFkZXIpICsgMzI7CisKKyAgICB1aW50OF90IHZicmlIZWFkZXJbMjZdOworICAgIG4gPSBzb3VyY2UtPnJlYWRBdChwb3MsIHZicmlIZWFkZXIsIHNpemVvZih2YnJpSGVhZGVyKSk7CisgICAgaWYgKG4gPCAoc3NpemVfdClzaXplb2YodmJyaUhlYWRlcikpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKG1lbWNtcCh2YnJpSGVhZGVyLCAiVkJSSSIsIDQpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNpemVfdCBudW1GcmFtZXMgPSBVMzJfQVQoJnZicmlIZWFkZXJbMTRdKTsKKworICAgIGludDY0X3QgZHVyYXRpb25VcyA9CisgICAgICAgIG51bUZyYW1lcyAqIDEwMDAwMDBsbCAqIChzYW1wbGVSYXRlID49IDMyMDAwID8gMTE1MiA6IDU3NikgLyBzYW1wbGVSYXRlOworCisgICAgQUxPR1YoImR1cmF0aW9uID0gJS4yZiBzZWNzIiwgZHVyYXRpb25VcyAvIDFFNik7CisKKyAgICBzaXplX3QgbnVtRW50cmllcyA9IFUxNl9BVCgmdmJyaUhlYWRlclsxOF0pOworICAgIHNpemVfdCBlbnRyeVNpemUgPSBVMTZfQVQoJnZicmlIZWFkZXJbMjJdKTsKKyAgICBzaXplX3Qgc2NhbGUgPSBVMTZfQVQoJnZicmlIZWFkZXJbMjBdKTsKKworICAgIEFMT0dWKCIlenUgZW50cmllcywgc2NhbGU9JXp1LCBzaXplX3Blcl9lbnRyeT0lenUiLAorICAgICAgICAgbnVtRW50cmllcywKKyAgICAgICAgIHNjYWxlLAorICAgICAgICAgZW50cnlTaXplKTsKKworICAgIGlmIChlbnRyeVNpemUgPiA0KSB7CisgICAgICAgIEFMT0dFKCJpbnZhbGlkIFZCUkkgZW50cnkgc2l6ZTogJXp1IiwgZW50cnlTaXplKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgVkJSSVNlZWtlciAqc2Vla2VyID0gbmV3IChzdGQ6Om5vdGhyb3cpIFZCUklTZWVrZXI7CisgICAgaWYgKHNlZWtlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJDb3VsZG4ndCBhbGxvY2F0ZSBWQlJJU2Vla2VyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNpemVfdCB0b3RhbEVudHJ5U2l6ZSA9IG51bUVudHJpZXMgKiBlbnRyeVNpemU7CisgICAgdWludDhfdCAqYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3RbdG90YWxFbnRyeVNpemVdOworICAgIGlmICghYnVmZmVyKSB7CisgICAgICAgIEFMT0dXKCJDb3VsZG4ndCBhbGxvY2F0ZSAlenUgYnl0ZXMiLCB0b3RhbEVudHJ5U2l6ZSk7CisgICAgICAgIGRlbGV0ZSBzZWVrZXI7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG4gPSBzb3VyY2UtPnJlYWRBdChwb3MgKyBzaXplb2YodmJyaUhlYWRlciksIGJ1ZmZlciwgdG90YWxFbnRyeVNpemUpOworICAgIGlmIChuIDwgKHNzaXplX3QpdG90YWxFbnRyeVNpemUpIHsKKyAgICAgICAgZGVsZXRlW10gYnVmZmVyOworICAgICAgICBidWZmZXIgPSBOVUxMOworICAgICAgICBkZWxldGUgc2Vla2VyOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzZWVrZXItPm1CYXNlUG9zID0gcG9zdF9pZDNfcG9zICsgZnJhbWVTaXplOworICAgIC8vIG9ubHkgdXBkYXRlIG1EdXJhdGlvblVzIGlmIHRoZSBjYWxjdWxhdGVkIGR1cmF0aW9uIGlzIHZhbGlkIChub24gemVybykKKyAgICAvLyBvdGhlcndpc2UsIGxlYXZlIGR1cmF0aW9uIGF0IC0xIHNvIHRoYXQgZ2V0RHVyYXRpb24oKSBhbmQgZ2V0T2Zmc2V0Rm9yVGltZSgpCisgICAgLy8gcmV0dXJuIGZhbHNlIHdoZW4gY2FsbGVkLCB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgdmJyaSB0YWcgZG9lcyBub3QgaGF2ZSB0aGUKKyAgICAvLyByZXF1ZXN0ZWQgaW5mb3JtYXRpb24KKyAgICBpZiAoZHVyYXRpb25VcykgeworICAgICAgICBzZWVrZXItPm1EdXJhdGlvblVzID0gZHVyYXRpb25VczsKKyAgICB9CisKKyAgICBvZmY2NF90IG9mZnNldCA9IHBvc3RfaWQzX3BvczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUVudHJpZXM7ICsraSkgeworICAgICAgICB1aW50MzJfdCBudW1CeXRlczsKKyAgICAgICAgc3dpdGNoIChlbnRyeVNpemUpIHsKKyAgICAgICAgICAgIGNhc2UgMTogbnVtQnl0ZXMgPSBidWZmZXJbaV07IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiBudW1CeXRlcyA9IFUxNl9BVChidWZmZXIgKyAyICogaSk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOiBudW1CeXRlcyA9IFUyNF9BVChidWZmZXIgKyAzICogaSk7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDSEVDS19FUShlbnRyeVNpemUsIDR1KTsKKyAgICAgICAgICAgICAgICBudW1CeXRlcyA9IFUzMl9BVChidWZmZXIgKyA0ICogaSk7IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbnVtQnl0ZXMgKj0gc2NhbGU7CisKKyAgICAgICAgc2Vla2VyLT5tU2VnbWVudHMucHVzaChudW1CeXRlcyk7CisKKyAgICAgICAgQUxPR1YoImVudHJ5ICMlenU6ICV1IG9mZnNldCAlIzAxNmxseCIsIGksIG51bUJ5dGVzLCAobG9uZyBsb25nKW9mZnNldCk7CisgICAgICAgIG9mZnNldCArPSBudW1CeXRlczsKKyAgICB9CisKKyAgICBkZWxldGVbXSBidWZmZXI7CisgICAgYnVmZmVyID0gTlVMTDsKKworICAgIEFMT0dJKCJGb3VuZCBWQlJJIGhlYWRlci4iKTsKKworICAgIHJldHVybiBzZWVrZXI7Cit9CisKK1ZCUklTZWVrZXI6OlZCUklTZWVrZXIoKQorICAgIDogbUR1cmF0aW9uVXMoLTEpIHsKK30KKworYm9vbCBWQlJJU2Vla2VyOjpnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKSB7CisgICAgaWYgKG1EdXJhdGlvblVzIDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKmR1cmF0aW9uVXMgPSBtRHVyYXRpb25VczsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFZCUklTZWVrZXI6OmdldE9mZnNldEZvclRpbWUoaW50NjRfdCAqdGltZVVzLCBvZmY2NF90ICpwb3MpIHsKKyAgICBpZiAobUR1cmF0aW9uVXMgPCAwIHx8IG1TZWdtZW50cy5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50NjRfdCBzZWdtZW50RHVyYXRpb25VcyA9IG1EdXJhdGlvblVzIC8gbVNlZ21lbnRzLnNpemUoKTsKKworICAgIGludDY0X3Qgbm93VXMgPSAwOworICAgICpwb3MgPSBtQmFzZVBvczsKKyAgICBzaXplX3Qgc2VnbWVudEluZGV4ID0gMDsKKyAgICB3aGlsZSAoc2VnbWVudEluZGV4IDwgbVNlZ21lbnRzLnNpemUoKSAmJiBub3dVcyA8ICp0aW1lVXMpIHsKKyAgICAgICAgbm93VXMgKz0gc2VnbWVudER1cmF0aW9uVXM7CisgICAgICAgICpwb3MgKz0gbVNlZ21lbnRzLml0ZW1BdChzZWdtZW50SW5kZXgrKyk7CisgICAgfQorCisgICAgQUxPR1YoImdldE9mZnNldEZvclRpbWUgJWxsZCB1cyA9PiAweCUwMTZsbHgiLCAobG9uZyBsb25nKSp0aW1lVXMsIChsb25nIGxvbmcpKnBvcyk7CisKKyAgICAqdGltZVVzID0gbm93VXM7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvVkJSSVNlZWtlci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvVkJSSVNlZWtlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMTNmNmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVkJSSV9TRUVLRVJfSF8KKworI2RlZmluZSBWQlJJX1NFRUtFUl9IXworCisjaW5jbHVkZSAiTVAzU2Vla2VyLmgiCisKKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEYXRhU291cmNlQmFzZTsKKworc3RydWN0IFZCUklTZWVrZXIgOiBwdWJsaWMgTVAzU2Vla2VyIHsKKyAgICBzdGF0aWMgVkJSSVNlZWtlciAqQ3JlYXRlRnJvbVNvdXJjZSgKKyAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3QgcG9zdF9pZDNfcG9zKTsKKworICAgIHZpcnR1YWwgYm9vbCBnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKTsKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0T2Zmc2V0Rm9yVGltZShpbnQ2NF90ICp0aW1lVXMsIG9mZjY0X3QgKnBvcyk7CisKK3ByaXZhdGU6CisgICAgb2ZmNjRfdCBtQmFzZVBvczsKKyAgICBpbnQ2NF90IG1EdXJhdGlvblVzOworICAgIFZlY3Rvcjx1aW50MzJfdD4gbVNlZ21lbnRzOworCisgICAgVkJSSVNlZWtlcigpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVkJSSVNlZWtlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFZCUklfU0VFS0VSX0hfCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9YSU5HU2Vla2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWNhNTU2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5jcHAKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlhJTkdTRUVLRVIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJYSU5HU2Vla2VyLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitYSU5HU2Vla2VyOjpYSU5HU2Vla2VyKCkKKyAgICA6IG1EdXJhdGlvblVzKC0xKSwKKyAgICAgIG1TaXplQnl0ZXMoMCksCisgICAgICBtRW5jb2RlckRlbGF5KDApLAorICAgICAgbUVuY29kZXJQYWRkaW5nKDApLAorICAgICAgbVRPQ1ZhbGlkKGZhbHNlKSB7Cit9CisKK2Jvb2wgWElOR1NlZWtlcjo6Z2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25VcykgeworICAgIGlmIChtRHVyYXRpb25VcyA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgICpkdXJhdGlvblVzID0gbUR1cmF0aW9uVXM7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBYSU5HU2Vla2VyOjpnZXRPZmZzZXRGb3JUaW1lKGludDY0X3QgKnRpbWVVcywgb2ZmNjRfdCAqcG9zKSB7CisgICAgaWYgKG1TaXplQnl0ZXMgPT0gMCB8fCAhbVRPQ1ZhbGlkIHx8IG1EdXJhdGlvblVzIDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZmxvYXQgcGVyY2VudCA9IChmbG9hdCkoKnRpbWVVcykgKiAxMDAgLyBtRHVyYXRpb25VczsKKyAgICBmbG9hdCBmeDsKKyAgICBpZiggcGVyY2VudCA8PSAwLjBmICkgeworICAgICAgICBmeCA9IDAuMGY7CisgICAgfSBlbHNlIGlmKCBwZXJjZW50ID49IDEwMC4wZiApIHsKKyAgICAgICAgZnggPSAyNTYuMGY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGEgPSAoaW50KXBlcmNlbnQ7CisgICAgICAgIGZsb2F0IGZhLCBmYjsKKyAgICAgICAgaWYgKCBhID09IDAgKSB7CisgICAgICAgICAgICBmYSA9IDAuMGY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmYSA9IChmbG9hdCltVE9DW2EtMV07CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBhIDwgOTkgKSB7CisgICAgICAgICAgICBmYiA9IChmbG9hdCltVE9DW2FdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmIgPSAyNTYuMGY7CisgICAgICAgIH0KKyAgICAgICAgZnggPSBmYSArIChmYi1mYSkqKHBlcmNlbnQtYSk7CisgICAgfQorCisgICAgKnBvcyA9IChpbnQpKCgxLjBmLzI1Ni4wZikqZngqbVNpemVCeXRlcykgKyBtRmlyc3RGcmFtZVBvczsKKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBzdGF0aWMKK1hJTkdTZWVrZXIgKlhJTkdTZWVrZXI6OkNyZWF0ZUZyb21Tb3VyY2UoCisgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3QgZmlyc3RfZnJhbWVfcG9zKSB7CisKKyAgICB1aW50OF90IGJ1ZmZlcls0XTsKKyAgICBpbnQgb2Zmc2V0ID0gZmlyc3RfZnJhbWVfcG9zOworICAgIGlmIChzb3VyY2UtPnJlYWRBdChvZmZzZXQsICZidWZmZXIsIDQpIDwgNCkgeyAvLyBnZXQgaGVhZGVyCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBvZmZzZXQgKz0gNDsKKworICAgIGludCBoZWFkZXIgPSBVMzJfQVQoYnVmZmVyKTs7CisgICAgc2l6ZV90IHhpbmdmcmFtZXNpemUgPSAwOworICAgIGludCBzYW1wbGluZ19yYXRlID0gMDsKKyAgICBpbnQgbnVtX2NoYW5uZWxzOworICAgIGludCBzYW1wbGVzX3Blcl9mcmFtZSA9IDA7CisgICAgaWYgKCFHZXRNUEVHQXVkaW9GcmFtZVNpemUoaGVhZGVyLCAmeGluZ2ZyYW1lc2l6ZSwgJnNhbXBsaW5nX3JhdGUsICZudW1fY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJnNhbXBsZXNfcGVyX2ZyYW1lKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdWludDhfdCB2ZXJzaW9uID0gKGJ1ZmZlclsxXSA+PiAzKSAmIDM7CisKKyAgICAvLyBkZXRlcm1pbmUgb2Zmc2V0IG9mIFhJTkcgaGVhZGVyCisgICAgaWYodmVyc2lvbiAmIDEpIHsgLy8gbXBlZzEKKyAgICAgICAgaWYgKG51bV9jaGFubmVscyAhPSAxKSBvZmZzZXQgKz0gMzI7CisgICAgICAgIGVsc2Ugb2Zmc2V0ICs9IDE3OworICAgIH0gZWxzZSB7IC8vIG1wZWcgMiBvciAyLjUKKyAgICAgICAgaWYgKG51bV9jaGFubmVscyAhPSAxKSBvZmZzZXQgKz0gMTc7CisgICAgICAgIGVsc2Ugb2Zmc2V0ICs9IDk7CisgICAgfQorCisgICAgaW50IHhpbmdiYXNlID0gb2Zmc2V0OworCisgICAgaWYgKHNvdXJjZS0+cmVhZEF0KG9mZnNldCwgJmJ1ZmZlciwgNCkgPCA0KSB7IC8vIFhJTkcgaGVhZGVyIElECisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBvZmZzZXQgKz0gNDsKKyAgICAvLyBDaGVjayBYSU5HIElECisgICAgaWYgKChidWZmZXJbMF0gIT0gJ1gnKSB8fCAoYnVmZmVyWzFdICE9ICdpJykKKyAgICAgICAgICAgICAgICB8fCAoYnVmZmVyWzJdICE9ICduJykgfHwgKGJ1ZmZlclszXSAhPSAnZycpKSB7CisgICAgICAgIGlmICgoYnVmZmVyWzBdICE9ICdJJykgfHwgKGJ1ZmZlclsxXSAhPSAnbicpCisgICAgICAgICAgICAgICAgICAgIHx8IChidWZmZXJbMl0gIT0gJ2YnKSB8fCAoYnVmZmVyWzNdICE9ICdvJykpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNvdXJjZS0+cmVhZEF0KG9mZnNldCwgJmJ1ZmZlciwgNCkgPCA0KSB7IC8vIGZsYWdzCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBvZmZzZXQgKz0gNDsKKyAgICB1aW50MzJfdCBmbGFncyA9IFUzMl9BVChidWZmZXIpOworCisgICAgWElOR1NlZWtlciAqc2Vla2VyID0gbmV3IFhJTkdTZWVrZXI7CisgICAgc2Vla2VyLT5tRmlyc3RGcmFtZVBvcyA9IGZpcnN0X2ZyYW1lX3BvcyArIHhpbmdmcmFtZXNpemU7CisKKyAgICBpZiAoZmxhZ3MgJiAweDAwMDEpIHsgIC8vIEZyYW1lcyBmaWVsZCBpcyBwcmVzZW50CisgICAgICAgIGlmIChzb3VyY2UtPnJlYWRBdChvZmZzZXQsIGJ1ZmZlciwgNCkgPCA0KSB7CisgICAgICAgICAgICBkZWxldGUgc2Vla2VyOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBmcmFtZXMgPSBVMzJfQVQoYnVmZmVyKTsKKyAgICAgICAgLy8gb25seSB1cGRhdGUgbUR1cmF0aW9uVXMgaWYgdGhlIGNhbGN1bGF0ZWQgZHVyYXRpb24gaXMgdmFsaWQgKG5vbiB6ZXJvKQorICAgICAgICAvLyBvdGhlcndpc2UsIGxlYXZlIGR1cmF0aW9uIGF0IC0xIHNvIHRoYXQgZ2V0RHVyYXRpb24oKSBhbmQgZ2V0T2Zmc2V0Rm9yVGltZSgpCisgICAgICAgIC8vIHJldHVybiBmYWxzZSB3aGVuIGNhbGxlZCwgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIHhpbmcgdGFnIGRvZXMgbm90IGhhdmUgdGhlCisgICAgICAgIC8vIHJlcXVlc3RlZCBpbmZvcm1hdGlvbgorICAgICAgICBpZiAoZnJhbWVzKSB7CisgICAgICAgICAgICBzZWVrZXItPm1EdXJhdGlvblVzID0gKGludDY0X3QpZnJhbWVzICogc2FtcGxlc19wZXJfZnJhbWUgKiAxMDAwMDAwTEwgLyBzYW1wbGluZ19yYXRlOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSA0OworICAgIH0KKyAgICBpZiAoZmxhZ3MgJiAweDAwMDIpIHsgIC8vIEJ5dGVzIGZpZWxkIGlzIHByZXNlbnQKKyAgICAgICAgaWYgKHNvdXJjZS0+cmVhZEF0KG9mZnNldCwgYnVmZmVyLCA0KSA8IDQpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBzZWVrZXI7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzZWVrZXItPm1TaXplQnl0ZXMgPSBVMzJfQVQoYnVmZmVyKTsKKyAgICAgICAgb2Zmc2V0ICs9IDQ7CisgICAgfQorICAgIGlmIChmbGFncyAmIDB4MDAwNCkgeyAgLy8gVE9DIGZpZWxkIGlzIHByZXNlbnQKKyAgICAgICAgaWYgKHNvdXJjZS0+cmVhZEF0KG9mZnNldCArIDEsIHNlZWtlci0+bVRPQywgOTkpIDwgOTkpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBzZWVrZXI7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzZWVrZXItPm1UT0NWYWxpZCA9IHRydWU7CisgICAgICAgIG9mZnNldCArPSAxMDA7CisgICAgfQorCisjaWYgMAorICAgIGlmIChmbGFncyAmIDB4MDAwOCkgeyAgLy8gUXVhbGl0eSBpbmRpY2F0b3IgZmllbGQgaXMgcHJlc2VudAorICAgICAgICBpZiAoc291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWZmZXIsIDQpIDwgNCkgeworICAgICAgICAgICAgZGVsZXRlIHNlZWtlcjsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIC8vIGRvIHNvbWV0aGluZyB3aXRoIHRoZSBxdWFsaXR5IGluZGljYXRvcgorICAgICAgICBvZmZzZXQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoc291cmNlLT5yZWFkQXQoeGluZ2Jhc2UgKyAweGFmIC0gMHgyNCwgJmJ1ZmZlciwgMSkgPCAxKSB7IC8vIGVuY29kaW5nIGZsYWdzCisgICAgICAgIGRlbGV0ZSBzZWVrZXI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBTE9HVigibm9nYXAgcHJlY2VkaW5nOiAlcywgbm9nYXAgY29udGludWVkIGluIG5leHQ6ICVzIiwKKyAgICAgICAgICAgICAgKGJ1ZmZlclswXSAmIDB4ODApID8gInRydWUiIDogImZhbHNlIiwKKyAgICAgICAgICAgICAgKGJ1ZmZlclswXSAmIDB4NDApID8gInRydWUiIDogImZhbHNlIik7CisjZW5kaWYKKworICAgIGlmIChzb3VyY2UtPnJlYWRBdCh4aW5nYmFzZSArIDB4YjEgLSAweDI0LCAmYnVmZmVyLCAzKSA9PSAzKSB7CisgICAgICAgIHNlZWtlci0+bUVuY29kZXJEZWxheSA9IChidWZmZXJbMF0gPDwgNCkgKyAoYnVmZmVyWzFdID4+IDQpOworICAgICAgICBzZWVrZXItPm1FbmNvZGVyUGFkZGluZyA9ICgoYnVmZmVyWzFdICYgMHhmKSA8PCA4KSArIGJ1ZmZlclsyXTsKKyAgICB9CisKKyAgICByZXR1cm4gc2Vla2VyOworfQorCitpbnQzMl90IFhJTkdTZWVrZXI6OmdldEVuY29kZXJEZWxheSgpIHsKKyAgICByZXR1cm4gbUVuY29kZXJEZWxheTsKK30KKworaW50MzJfdCBYSU5HU2Vla2VyOjpnZXRFbmNvZGVyUGFkZGluZygpIHsKKyAgICByZXR1cm4gbUVuY29kZXJQYWRkaW5nOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9YSU5HU2Vla2VyLmggYi9tZWRpYS9leHRyYWN0b3JzL21wMy9YSU5HU2Vla2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg2N2VhZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL1hJTkdTZWVrZXIuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBYSU5HX1NFRUtFUl9IXworCisjZGVmaW5lIFhJTkdfU0VFS0VSX0hfCisKKyNpbmNsdWRlICJNUDNTZWVrZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEYXRhU291cmNlQmFzZTsKKworc3RydWN0IFhJTkdTZWVrZXIgOiBwdWJsaWMgTVAzU2Vla2VyIHsKKyAgICBzdGF0aWMgWElOR1NlZWtlciAqQ3JlYXRlRnJvbVNvdXJjZSgKKyAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3QgZmlyc3RfZnJhbWVfcG9zKTsKKworICAgIHZpcnR1YWwgYm9vbCBnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKTsKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0T2Zmc2V0Rm9yVGltZShpbnQ2NF90ICp0aW1lVXMsIG9mZjY0X3QgKnBvcyk7CisKKyAgICB2aXJ0dWFsIGludDMyX3QgZ2V0RW5jb2RlckRlbGF5KCk7CisgICAgdmlydHVhbCBpbnQzMl90IGdldEVuY29kZXJQYWRkaW5nKCk7CisKK3ByaXZhdGU6CisgICAgaW50NjRfdCBtRmlyc3RGcmFtZVBvczsKKyAgICBpbnQ2NF90IG1EdXJhdGlvblVzOworICAgIGludDMyX3QgbVNpemVCeXRlczsKKyAgICBpbnQzMl90IG1FbmNvZGVyRGVsYXk7CisgICAgaW50MzJfdCBtRW5jb2RlclBhZGRpbmc7CisKKyAgICAvLyBUT0MgZW50cmllcyBpbiBYSU5HIGhlYWRlci4gU2tpcCB0aGUgZmlyc3Qgb25lIHNpbmNlIGl0J3MgYWx3YXlzIDAuCisgICAgdW5zaWduZWQgY2hhciBtVE9DWzk5XTsKKyAgICBib29sIG1UT0NWYWxpZDsKKworICAgIFhJTkdTZWVrZXIoKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFhJTkdTZWVrZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBYSU5HX1NFRUtFUl9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9leHBvcnRzLmxkcyBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMzA5ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9leHBvcnRzLmxkcwpAQCAtMCwwICsxIEBACit7IGdsb2JhbDogR0VURVhUUkFDVE9SREVGOyBsb2NhbDogKjsgfTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNzM5ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNjAgQEAKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGlibXA0ZXh0cmFjdG9yX2RlZmF1bHRzIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkl0ZW1UYWJsZS5jcHAiLAorICAgICAgICAiTVBFRzRFeHRyYWN0b3IuY3BwIiwKKyAgICAgICAgIlNhbXBsZUl0ZXJhdG9yLmNwcCIsCisgICAgICAgICJTYW1wbGVUYWJsZS5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9lc2RzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaWQzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAorICAgIF0sCisgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiZXh0cmFjdG9ycyIsCisgICAgY29tcGlsZV9tdWx0aWxpYjogImZpcnN0IiwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworCisKKyAgICBuYW1lOiAibGlibXA0ZXh0cmFjdG9yIiwKKyAgICBkZWZhdWx0czogWyJsaWJtcDRleHRyYWN0b3JfZGVmYXVsdHMiXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorCit9CisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlibXA0ZXh0cmFjdG9yX2Z1enppbmciLAorCisgICAgZGVmYXVsdHM6IFsibGlibXA0ZXh0cmFjdG9yX2RlZmF1bHRzIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjc4N2FmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmNwcApAQCAtMCwwICsxLDE2NzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkl0ZW1UYWJsZSIKKworI2luY2x1ZGUgPEl0ZW1UYWJsZS5oPgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgaGVpZiB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBzdHJ1Y3QgdG8ga2VlcCB0cmFjayBvZiBvbmUgaW1hZ2UgaXRlbQorLy8KKworc3RydWN0IEltYWdlSXRlbSB7CisgICAgZnJpZW5kIHN0cnVjdCBJdGVtUmVmZXJlbmNlOworICAgIGZyaWVuZCBzdHJ1Y3QgSXRlbVByb3BlcnR5OworCisgICAgSW1hZ2VJdGVtKCkgOiBJbWFnZUl0ZW0oMCwgMCwgZmFsc2UpIHt9CisgICAgSW1hZ2VJdGVtKHVpbnQzMl90IF90eXBlLCB1aW50MzJfdCBfaWQsIGJvb2wgX2hpZGRlbikgOgorICAgICAgICAgICAgdHlwZShfdHlwZSksIGl0ZW1JZChfaWQpLCBoaWRkZW4oX2hpZGRlbiksCisgICAgICAgICAgICByb3dzKDApLCBjb2x1bW5zKDApLCB3aWR0aCgwKSwgaGVpZ2h0KDApLCByb3RhdGlvbigwKSwKKyAgICAgICAgICAgIG9mZnNldCgwKSwgc2l6ZSgwKSwgbmV4dFRpbGVJbmRleCgwKSB7fQorCisgICAgYm9vbCBpc0dyaWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiB0eXBlID09IEZPVVJDQygnZycsICdyJywgJ2knLCAnZCcpOworICAgIH0KKworICAgIHN0YXR1c190IGdldE5leHRUaWxlSXRlbUlkKHVpbnQzMl90ICpuZXh0VGlsZUl0ZW1JZCwgYm9vbCByZXNldCkgeworICAgICAgICBpZiAocmVzZXQpIHsKKyAgICAgICAgICAgIG5leHRUaWxlSW5kZXggPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChuZXh0VGlsZUluZGV4ID49IGRpbWdSZWZzLnNpemUoKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKyAgICAgICAgKm5leHRUaWxlSXRlbUlkID0gZGltZ1JlZnNbbmV4dFRpbGVJbmRleCsrXTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHVpbnQzMl90IHR5cGU7CisgICAgdWludDMyX3QgaXRlbUlkOworICAgIGJvb2wgaGlkZGVuOworICAgIGludDMyX3Qgcm93czsKKyAgICBpbnQzMl90IGNvbHVtbnM7CisgICAgaW50MzJfdCB3aWR0aDsKKyAgICBpbnQzMl90IGhlaWdodDsKKyAgICBpbnQzMl90IHJvdGF0aW9uOworICAgIG9mZjY0X3Qgb2Zmc2V0OworICAgIHNpemVfdCBzaXplOworICAgIHNwPEFCdWZmZXI+IGh2Y2M7CisgICAgc3A8QUJ1ZmZlcj4gaWNjOworCisgICAgVmVjdG9yPHVpbnQzMl90PiB0aHVtYm5haWxzOworICAgIFZlY3Rvcjx1aW50MzJfdD4gZGltZ1JlZnM7CisgICAgVmVjdG9yPHVpbnQzMl90PiBjZHNjUmVmczsKKyAgICBzaXplX3QgbmV4dFRpbGVJbmRleDsKK307CisKK3N0cnVjdCBFeGlmSXRlbSB7CisgICAgb2ZmNjRfdCBvZmZzZXQ7CisgICAgc2l6ZV90IHNpemU7Cit9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSVNPIGJveGVzCisvLworCitzdHJ1Y3QgQm94IHsKK3Byb3RlY3RlZDoKKyAgICBCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgdWludDMyX3QgdHlwZSkgOgorICAgICAgICBtRGF0YVNvdXJjZShzb3VyY2UpLCBtVHlwZSh0eXBlKSB7fQorCisgICAgdmlydHVhbCB+Qm94KCkge30KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25DaHVua0RhdGEoCisgICAgICAgICAgICB1aW50MzJfdCAvKnR5cGUqLywgb2ZmNjRfdCAvKm9mZnNldCovLCBzaXplX3QgLypzaXplKi8pIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlubGluZSB1aW50MzJfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gbVR5cGU7IH0KKworICAgIGlubGluZSBEYXRhU291cmNlQmFzZSAqc291cmNlKCkgY29uc3QgeyByZXR1cm4gbURhdGFTb3VyY2U7IH0KKworICAgIHN0YXR1c190IHBhcnNlQ2h1bmsob2ZmNjRfdCAqb2Zmc2V0KTsKKworICAgIHN0YXR1c190IHBhcnNlQ2h1bmtzKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisKK3ByaXZhdGU6CisgICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIHVpbnQzMl90IG1UeXBlOworfTsKKworc3RhdHVzX3QgQm94OjpwYXJzZUNodW5rKG9mZjY0X3QgKm9mZnNldCkgeworICAgIGlmICgqb2Zmc2V0IDwgMCkgeworICAgICAgICBBTE9HRSgiYi8yMzU0MDkxNCIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICB1aW50MzJfdCBoZHJbMl07CisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgaGRyLCA4KSA8IDgpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICB1aW50NjRfdCBjaHVua19zaXplID0gbnRvaGwoaGRyWzBdKTsKKyAgICBpbnQzMl90IGNodW5rX3R5cGUgPSBudG9obChoZHJbMV0pOworICAgIG9mZjY0X3QgZGF0YV9vZmZzZXQgPSAqb2Zmc2V0ICsgODsKKworICAgIGlmIChjaHVua19zaXplID09IDEpIHsKKyAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCArIDgsICZjaHVua19zaXplLCA4KSA8IDgpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBjaHVua19zaXplID0gbnRvaDY0KGNodW5rX3NpemUpOworICAgICAgICBkYXRhX29mZnNldCArPSA4OworCisgICAgICAgIGlmIChjaHVua19zaXplIDwgMTYpIHsKKyAgICAgICAgICAgIC8vIFRoZSBzbWFsbGVzdCB2YWxpZCBjaHVuayBpcyAxNiBieXRlcyBsb25nIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNodW5rX3NpemUgPT0gMCkgeworICAgICAgICAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4gc2luY2Ugd2Ugc2hvdWxkIG5ldmVyIGJlIHRvcCBsZXZlbAorICAgICAgICBBTE9HRSgiaW52YWxpZCBjaHVuayBzaXplIDAgZm9yIG5vbi10b3AgbGV2ZWwgYm94Iik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfSBlbHNlIGlmIChjaHVua19zaXplIDwgOCkgeworICAgICAgICAvLyBUaGUgc21hbGxlc3QgdmFsaWQgY2h1bmsgaXMgOCBieXRlcyBsb25nLgorICAgICAgICBBTE9HRSgiaW52YWxpZCBjaHVuayBzaXplOiAlbGxkIiwgKGxvbmcgbG9uZyljaHVua19zaXplKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBjaGFyIGNodW5rWzVdOworICAgIE1ha2VGb3VyQ0NTdHJpbmcoY2h1bmtfdHlwZSwgY2h1bmspOworICAgIEFMT0dWKCJjaHVuazogJXMgQCAlbGxkIiwgY2h1bmssIChsb25nIGxvbmcpKm9mZnNldCk7CisKKyAgICBvZmY2NF90IGNodW5rX2RhdGFfc2l6ZSA9IGNodW5rX3NpemUgLSAoZGF0YV9vZmZzZXQgLSAqb2Zmc2V0KTsKKyAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgMCkgeworICAgICAgICBBTE9HRSgiYi8yMzU0MDkxNCIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IG9uQ2h1bmtEYXRhKGNodW5rX3R5cGUsIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBCb3g6OnBhcnNlQ2h1bmtzKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIG9mZjY0X3Qgc3RvcE9mZnNldCA9IG9mZnNldCArIHNpemU7CisgICAgd2hpbGUgKG9mZnNldCA8IHN0b3BPZmZzZXQpIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuaygmb2Zmc2V0KTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAob2Zmc2V0ICE9IHN0b3BPZmZzZXQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdHJ1Y3QgRnVsbEJveCA6IHB1YmxpYyBCb3ggeworcHJvdGVjdGVkOgorICAgIEZ1bGxCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgdWludDMyX3QgdHlwZSkgOgorICAgICAgICBCb3goc291cmNlLCB0eXBlKSwgbVZlcnNpb24oMCksIG1GbGFncygwKSB7fQorCisgICAgaW5saW5lIHVpbnQ4X3QgdmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1WZXJzaW9uOyB9CisKKyAgICBpbmxpbmUgdWludDMyX3QgZmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KKworICAgIHN0YXR1c190IHBhcnNlRnVsbEJveEhlYWRlcihvZmY2NF90ICpvZmZzZXQsIHNpemVfdCAqc2l6ZSk7CisKK3ByaXZhdGU6CisgICAgdWludDhfdCBtVmVyc2lvbjsKKyAgICB1aW50MzJfdCBtRmxhZ3M7Cit9OworCitzdGF0dXNfdCBGdWxsQm94OjpwYXJzZUZ1bGxCb3hIZWFkZXIob2ZmNjRfdCAqb2Zmc2V0LCBzaXplX3QgKnNpemUpIHsKKyAgICBpZiAoKnNpemUgPCA0KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGlmICghc291cmNlKCktPnJlYWRBdCgqb2Zmc2V0LCAmbVZlcnNpb24sIDEpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDI0KCpvZmZzZXQgKyAxLCAmbUZsYWdzKSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorICAgICpvZmZzZXQgKz0gNDsKKyAgICAqc2l6ZSAtPSA0OworICAgIHJldHVybiBPSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIFByaW1hcnlJbWFnZSBib3gKKy8vCisKK3N0cnVjdCBQaXRtQm94IDogcHVibGljIEZ1bGxCb3ggeworICAgIFBpdG1Cb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkgOgorICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCdwJywgJ2knLCAndCcsICdtJykpIHt9CisKKyAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUsIHVpbnQzMl90ICpwcmltYXJ5SXRlbUlkKTsKK307CisKK3N0YXR1c190IFBpdG1Cb3g6OnBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgdWludDMyX3QgKnByaW1hcnlJdGVtSWQpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUZ1bGxCb3hIZWFkZXIoJm9mZnNldCwgJnNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBzaXplX3QgaXRlbUlkU2l6ZSA9ICh2ZXJzaW9uKCkgPT0gMCkgPyAyIDogNDsKKyAgICBpZiAoc2l6ZSA8IGl0ZW1JZFNpemUpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgdWludDMyX3QgaXRlbUlkOworICAgIGlmICghc291cmNlKCktPmdldFVJbnQzMlZhcihvZmZzZXQsICZpdGVtSWQsIGl0ZW1JZFNpemUpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisKKyAgICBBTE9HVigicHJpbWFyeSBpZCAlZCIsIGl0ZW1JZCk7CisgICAgKnByaW1hcnlJdGVtSWQgPSBpdGVtSWQ7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJdGVtTG9jYXRpb24gcmVsYXRlZCBib3hlcworLy8KKworc3RydWN0IEV4dGVudEVudHJ5IHsKKyAgICB1aW50NjRfdCBleHRlbnRJbmRleDsKKyAgICB1aW50NjRfdCBleHRlbnRPZmZzZXQ7CisgICAgdWludDY0X3QgZXh0ZW50TGVuZ3RoOworfTsKKworc3RydWN0IEl0ZW1Mb2MgeworICAgIEl0ZW1Mb2MoKSA6IEl0ZW1Mb2MoMCwgMCwgMCwgMCkge30KKyAgICBJdGVtTG9jKHVpbnQzMl90IGl0ZW1faWQsIHVpbnQxNl90IGNvbnN0cnVjdGlvbl9tZXRob2QsCisgICAgICAgICAgICB1aW50MTZfdCBkYXRhX3JlZmVyZW5jZV9pbmRleCwgdWludDY0X3QgYmFzZV9vZmZzZXQpIDoKKyAgICAgICAgaXRlbUlkKGl0ZW1faWQpLAorICAgICAgICBjb25zdHJ1Y3Rpb25NZXRob2QoY29uc3RydWN0aW9uX21ldGhvZCksCisgICAgICAgIGRhdGFSZWZlcmVuY2VJbmRleChkYXRhX3JlZmVyZW5jZV9pbmRleCksCisgICAgICAgIGJhc2VPZmZzZXQoYmFzZV9vZmZzZXQpIHt9CisKKyAgICB2b2lkIGFkZEV4dGVudChjb25zdCBFeHRlbnRFbnRyeSYgZXh0ZW50KSB7CisgICAgICAgIGV4dGVudHMucHVzaF9iYWNrKGV4dGVudCk7CisgICAgfQorCisgICAgc3RhdHVzX3QgZ2V0TG9jKG9mZjY0X3QgKm9mZnNldCwgc2l6ZV90ICpzaXplLAorICAgICAgICAgICAgb2ZmNjRfdCBpZGF0T2Zmc2V0LCBzaXplX3QgaWRhdFNpemUpIGNvbnN0IHsKKyAgICAgICAgLy8gVE9ETzogZml4IGV4dGVudCBoYW5kbGluZywgZml4IGNvbnN0cnVjdGlvbk1ldGhvZCA9IDIKKyAgICAgICAgQ0hFQ0soZXh0ZW50cy5zaXplKCkgPT0gMSk7CisgICAgICAgIGlmIChjb25zdHJ1Y3Rpb25NZXRob2QgPT0gMCkgeworICAgICAgICAgICAgKm9mZnNldCA9IGJhc2VPZmZzZXQgKyBleHRlbnRzWzBdLmV4dGVudE9mZnNldDsKKyAgICAgICAgICAgICpzaXplID0gZXh0ZW50c1swXS5leHRlbnRMZW5ndGg7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0gZWxzZSBpZiAoY29uc3RydWN0aW9uTWV0aG9kID09IDEpIHsKKyAgICAgICAgICAgIGlmIChiYXNlT2Zmc2V0ICsgZXh0ZW50c1swXS5leHRlbnRPZmZzZXQgKyBleHRlbnRzWzBdLmV4dGVudExlbmd0aAorICAgICAgICAgICAgICAgICAgICA+IGlkYXRTaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpvZmZzZXQgPSBiYXNlT2Zmc2V0ICsgZXh0ZW50c1swXS5leHRlbnRPZmZzZXQgKyBpZGF0T2Zmc2V0OworICAgICAgICAgICAgKnNpemUgPSBleHRlbnRzWzBdLmV4dGVudExlbmd0aDsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgLy8gcGFyc2VkIGluZm8KKyAgICB1aW50MzJfdCBpdGVtSWQ7CisgICAgdWludDE2X3QgY29uc3RydWN0aW9uTWV0aG9kOworICAgIHVpbnQxNl90IGRhdGFSZWZlcmVuY2VJbmRleDsKKyAgICBvZmY2NF90IGJhc2VPZmZzZXQ7CisgICAgVmVjdG9yPEV4dGVudEVudHJ5PiBleHRlbnRzOworfTsKKworc3RydWN0IElsb2NCb3ggOiBwdWJsaWMgRnVsbEJveCB7CisgICAgSWxvY0JveChEYXRhU291cmNlQmFzZSAqc291cmNlLCBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSXRlbUxvYz4gKml0ZW1Mb2NzKSA6CisgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAnbCcsICdvJywgJ2MnKSksCisgICAgICAgIG1JdGVtTG9jcyhpdGVtTG9jcyksIG1IYXNDb25zdHJ1Y3RNZXRob2QxKGZhbHNlKSB7fQorCisgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKworICAgIGJvb2wgaGFzQ29uc3RydWN0TWV0aG9kMSgpIHsgcmV0dXJuIG1IYXNDb25zdHJ1Y3RNZXRob2QxOyB9CisKK3ByaXZhdGU6CisgICAgc3RhdGljIGJvb2wgaXNTaXplRmllbGRWYWxpZCh1aW50MzJfdCBvZmZzZXRfc2l6ZSkgeworICAgICAgICByZXR1cm4gb2Zmc2V0X3NpemUgPT0gMCB8fCBvZmZzZXRfc2l6ZSA9PSA0IHx8IG9mZnNldF9zaXplID09IDg7CisgICAgfQorICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBJdGVtTG9jPiAqbUl0ZW1Mb2NzOworICAgIGJvb2wgbUhhc0NvbnN0cnVjdE1ldGhvZDE7Cit9OworCitzdGF0dXNfdCBJbG9jQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUZ1bGxCb3hIZWFkZXIoJm9mZnNldCwgJnNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgaWYgKHZlcnNpb24oKSA+IDIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIHZlcnNpb24gJWQiLCBfX0ZVTkNUSU9OX18sIHZlcnNpb24oKSk7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKHNpemUgPCAyKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIHVpbnQ4X3Qgb2Zmc2V0X3NpemU7CisgICAgaWYgKCFzb3VyY2UoKS0+cmVhZEF0KG9mZnNldCsrLCAmb2Zmc2V0X3NpemUsIDEpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgdWludDhfdCBsZW5ndGhfc2l6ZSA9IChvZmZzZXRfc2l6ZSAmIDB4Rik7CisgICAgb2Zmc2V0X3NpemUgPj49IDQ7CisKKyAgICB1aW50OF90IGJhc2Vfb2Zmc2V0X3NpemU7CisgICAgaWYgKCFzb3VyY2UoKS0+cmVhZEF0KG9mZnNldCsrLCAmYmFzZV9vZmZzZXRfc2l6ZSwgMSkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICB1aW50OF90IGluZGV4X3NpemUgPSAwOworICAgIGlmICh2ZXJzaW9uKCkgPT0gMSB8fCB2ZXJzaW9uKCkgPT0gMikgeworICAgICAgICBpbmRleF9zaXplID0gKGJhc2Vfb2Zmc2V0X3NpemUgJiAweEYpOworICAgIH0KKyAgICBiYXNlX29mZnNldF9zaXplID4+PSA0OworICAgIHNpemUgLT0gMjsKKworICAgIGlmICghaXNTaXplRmllbGRWYWxpZChvZmZzZXRfc2l6ZSkKKyAgICAgICAgICAgIHx8ICFpc1NpemVGaWVsZFZhbGlkKGxlbmd0aF9zaXplKQorICAgICAgICAgICAgfHwgIWlzU2l6ZUZpZWxkVmFsaWQoYmFzZV9vZmZzZXRfc2l6ZSkKKyAgICAgICAgICAgIHx8ICFpc1NpemVGaWVsZFZhbGlkKChpbmRleF9zaXplKSkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBvZmZzZXQgc2l6ZSBub3QgdmFsaWQ6ICVkLCAlZCwgJWQsICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIG9mZnNldF9zaXplLCBsZW5ndGhfc2l6ZSwgYmFzZV9vZmZzZXRfc2l6ZSwgaW5kZXhfc2l6ZSk7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdWludDMyX3QgaXRlbV9jb3VudDsKKyAgICBzaXplX3QgaXRlbUZpZWxkU2l6ZSA9IHZlcnNpb24oKSA8IDIgPyAyIDogNDsKKyAgICBpZiAoc2l6ZSA8IGl0ZW1GaWVsZFNpemUpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyVmFyKG9mZnNldCwgJml0ZW1fY291bnQsIGl0ZW1GaWVsZFNpemUpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisKKyAgICBBTE9HVigiaXRlbV9jb3VudCAlbGxkIiwgKGxvbmcgbG9uZykgaXRlbV9jb3VudCk7CisgICAgb2Zmc2V0ICs9IGl0ZW1GaWVsZFNpemU7CisgICAgc2l6ZSAtPSBpdGVtRmllbGRTaXplOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpdGVtX2NvdW50OyBpKyspIHsKKyAgICAgICAgdWludDMyX3QgaXRlbV9pZDsKKyAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyVmFyKG9mZnNldCwgJml0ZW1faWQsIGl0ZW1GaWVsZFNpemUpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIml0ZW1bJXp1XTogaWQgJWxsZCIsIGksIChsb25nIGxvbmcpaXRlbV9pZCk7CisgICAgICAgIG9mZnNldCArPSBpdGVtRmllbGRTaXplOworCisgICAgICAgIHVpbnQ4X3QgY29uc3RydWN0aW9uX21ldGhvZCA9IDA7CisgICAgICAgIGlmICh2ZXJzaW9uKCkgPT0gMSB8fCB2ZXJzaW9uKCkgPT0gMikgeworICAgICAgICAgICAgdWludDhfdCBidWZbMl07CisgICAgICAgICAgICBpZiAoIXNvdXJjZSgpLT5yZWFkQXQob2Zmc2V0LCBidWYsIDIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3RydWN0aW9uX21ldGhvZCA9IChidWZbMV0gJiAweEYpOworICAgICAgICAgICAgQUxPR1YoImNvbnN0cnVjdGlvbl9tZXRob2QgJWQiLCBjb25zdHJ1Y3Rpb25fbWV0aG9kKTsKKyAgICAgICAgICAgIGlmIChjb25zdHJ1Y3Rpb25fbWV0aG9kID09IDEpIHsKKyAgICAgICAgICAgICAgICBtSGFzQ29uc3RydWN0TWV0aG9kMSA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICB9CisKKyAgICAgICAgdWludDE2X3QgZGF0YV9yZWZlcmVuY2VfaW5kZXg7CisgICAgICAgIGlmICghc291cmNlKCktPmdldFVJbnQxNihvZmZzZXQsICZkYXRhX3JlZmVyZW5jZV9pbmRleCkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiZGF0YV9yZWZlcmVuY2VfaW5kZXggJWQiLCBkYXRhX3JlZmVyZW5jZV9pbmRleCk7CisgICAgICAgIGlmIChkYXRhX3JlZmVyZW5jZV9pbmRleCAhPSAwKSB7CisgICAgICAgICAgICAvLyB3ZSBkb24ndCBzdXBwb3J0IHJlZmVyZW5jZSB0byBvdGhlciBmaWxlcworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSAyOworCisgICAgICAgIHVpbnQ2NF90IGJhc2Vfb2Zmc2V0ID0gMDsKKyAgICAgICAgaWYgKGJhc2Vfb2Zmc2V0X3NpemUgIT0gMCkgeworICAgICAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDY0VmFyKG9mZnNldCwgJmJhc2Vfb2Zmc2V0LCBiYXNlX29mZnNldF9zaXplKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9mZnNldCArPSBiYXNlX29mZnNldF9zaXplOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJiYXNlX29mZnNldCAlbGxkIiwgKGxvbmcgbG9uZykgYmFzZV9vZmZzZXQpOworCisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtSXRlbUxvY3MtPmFkZChpdGVtX2lkLCBJdGVtTG9jKAorICAgICAgICAgICAgICAgIGl0ZW1faWQsIGNvbnN0cnVjdGlvbl9tZXRob2QsIGRhdGFfcmVmZXJlbmNlX2luZGV4LCBiYXNlX29mZnNldCkpOworICAgICAgICBJdGVtTG9jICZpdGVtID0gbUl0ZW1Mb2NzLT5lZGl0VmFsdWVBdChpbmRleCk7CisKKyAgICAgICAgdWludDE2X3QgZXh0ZW50X2NvdW50OworICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MTYob2Zmc2V0LCAmZXh0ZW50X2NvdW50KSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJleHRlbnRfY291bnQgJWQiLCBleHRlbnRfY291bnQpOworCisgICAgICAgIGlmIChleHRlbnRfY291bnQgPiAxICYmIChvZmZzZXRfc2l6ZSA9PSAwIHx8IGxlbmd0aF9zaXplID09IDApKSB7CisgICAgICAgICAgICAvLyBpZiB0aGUgaXRlbSBpcyBkaXZpZGVjIGludG8gbW9yZSB0aGFuIG9uZSBleHRlbnRzLCBvZmZzZXQgYW5kCisgICAgICAgICAgICAvLyBsZW5ndGggbXVzdCBiZSBwcmVzZW50LgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQgKz0gMjsKKworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGV4dGVudF9jb3VudDsgaisrKSB7CisgICAgICAgICAgICB1aW50NjRfdCBleHRlbnRfaW5kZXggPSAxOyAvLyBkZWZhdWx0PTEKKyAgICAgICAgICAgIGlmICgodmVyc2lvbigpID09IDEgfHwgdmVyc2lvbigpID09IDIpICYmIChpbmRleF9zaXplID4gMCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50NjRWYXIob2Zmc2V0LCAmZXh0ZW50X2luZGV4LCBpbmRleF9zaXplKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciB0aGlzIG1vZGUKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gaW5kZXhfc2l6ZTsKKyAgICAgICAgICAgICAgICBBTE9HVigiZXh0ZW50X2luZGV4ICVsbGQiLCAobG9uZyBsb25nKWV4dGVudF9pbmRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQ2NF90IGV4dGVudF9vZmZzZXQgPSAwOyAvLyBkZWZhdWx0PTAKKyAgICAgICAgICAgIGlmIChvZmZzZXRfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50NjRWYXIob2Zmc2V0LCAmZXh0ZW50X29mZnNldCwgb2Zmc2V0X3NpemUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IG9mZnNldF9zaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoImV4dGVudF9vZmZzZXQgJWxsZCIsIChsb25nIGxvbmcpZXh0ZW50X29mZnNldCk7CisKKyAgICAgICAgICAgIHVpbnQ2NF90IGV4dGVudF9sZW5ndGggPSAwOyAvLyB0aGlzIGluZGljYXRlcyBmdWxsIGxlbmd0aCBvZiBmaWxlCisgICAgICAgICAgICBpZiAobGVuZ3RoX3NpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDY0VmFyKG9mZnNldCwgJmV4dGVudF9sZW5ndGgsIGxlbmd0aF9zaXplKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9mZnNldCArPSBsZW5ndGhfc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJleHRlbnRfbGVuZ3RoICVsbGQiLCAobG9uZyBsb25nKWV4dGVudF9sZW5ndGgpOworCisgICAgICAgICAgICBpdGVtLmFkZEV4dGVudCh7IGV4dGVudF9pbmRleCwgZXh0ZW50X29mZnNldCwgZXh0ZW50X2xlbmd0aCB9KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJdGVtUmVmZXJlbmNlIHJlbGF0ZWQgYm94ZXMKKy8vCisKK3N0cnVjdCBJdGVtUmVmZXJlbmNlIDogcHVibGljIEJveCwgcHVibGljIFJlZkJhc2UgeworICAgIEl0ZW1SZWZlcmVuY2UoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgdWludDMyX3QgdHlwZSwgdWludDMyX3QgaXRlbUlkU2l6ZSkgOgorICAgICAgICBCb3goc291cmNlLCB0eXBlKSwgbUl0ZW1JZCgwKSwgbVJlZklkU2l6ZShpdGVtSWRTaXplKSB7fQorCisgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKworICAgIHVpbnQzMl90IGl0ZW1JZCgpIHsgcmV0dXJuIG1JdGVtSWQ7IH0KKworICAgIHZvaWQgYXBwbHkoCisgICAgICAgICAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSW1hZ2VJdGVtPiAmaXRlbUlkVG9JdGVtTWFwLAorICAgICAgICAgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIEV4aWZJdGVtPiAmaXRlbUlkVG9FeGlmTWFwKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICB1aW50MzJfdCBtSXRlbUlkOworICAgIHVpbnQzMl90IG1SZWZJZFNpemU7CisgICAgVmVjdG9yPHVpbnQzMl90PiBtUmVmczsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEl0ZW1SZWZlcmVuY2UpOworfTsKKwordm9pZCBJdGVtUmVmZXJlbmNlOjphcHBseSgKKyAgICAgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIEltYWdlSXRlbT4gJml0ZW1JZFRvSXRlbU1hcCwKKyAgICAgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIEV4aWZJdGVtPiAmaXRlbUlkVG9FeGlmTWFwKSBjb25zdCB7CisgICAgQUxPR1YoImF0dGFjaCByZWZlcmVuY2UgdHlwZSAweCV4IHRvIGl0ZW0gaWQgJWQpIiwgdHlwZSgpLCBtSXRlbUlkKTsKKworICAgIHN3aXRjaCh0eXBlKCkpIHsKKyAgICBjYXNlIEZPVVJDQygnZCcsICdpJywgJ20nLCAnZycpOiB7CisgICAgICAgIHNzaXplX3QgaXRlbUluZGV4ID0gaXRlbUlkVG9JdGVtTWFwLmluZGV4T2ZLZXkobUl0ZW1JZCk7CisKKyAgICAgICAgLy8gaWdub3JlIG5vbi1pbWFnZSBpdGVtcworICAgICAgICBpZiAoaXRlbUluZGV4IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgSW1hZ2VJdGVtICZkZXJpdmVkSW1hZ2UgPSBpdGVtSWRUb0l0ZW1NYXAuZWRpdFZhbHVlQXQoaXRlbUluZGV4KTsKKyAgICAgICAgaWYgKCFkZXJpdmVkSW1hZ2UuZGltZ1JlZnMuZW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR1coImRpbWdSZWZzIGlmIG5vdCBjbGVhbiEiKTsKKyAgICAgICAgfQorICAgICAgICBkZXJpdmVkSW1hZ2UuZGltZ1JlZnMuYXBwZW5kVmVjdG9yKG1SZWZzKTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1SZWZzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpdGVtSW5kZXggPSBpdGVtSWRUb0l0ZW1NYXAuaW5kZXhPZktleShtUmVmc1tpXSk7CisKKyAgICAgICAgICAgIC8vIGlnbm9yZSBub24taW1hZ2UgaXRlbXMKKyAgICAgICAgICAgIGlmIChpdGVtSW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJbWFnZUl0ZW0gJnNvdXJjZUltYWdlID0gaXRlbUlkVG9JdGVtTWFwLmVkaXRWYWx1ZUF0KGl0ZW1JbmRleCk7CisKKyAgICAgICAgICAgIC8vIG1hcmsgdGhlIHNvdXJjZSBpbWFnZSBvZiB0aGUgZGVyaXZhdGlvbiBhcyBoaWRkZW4KKyAgICAgICAgICAgIHNvdXJjZUltYWdlLmhpZGRlbiA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRk9VUkNDKCd0JywgJ2gnLCAnbScsICdiJyk6IHsKKyAgICAgICAgc3NpemVfdCBpdGVtSW5kZXggPSBpdGVtSWRUb0l0ZW1NYXAuaW5kZXhPZktleShtSXRlbUlkKTsKKworICAgICAgICAvLyBpZ25vcmUgbm9uLWltYWdlIGl0ZW1zCisgICAgICAgIGlmIChpdGVtSW5kZXggPCAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBtYXJrIHRodW1ibmFpbCBpbWFnZSBhcyBoaWRkZW4sIHRoZXNlIGNhbiBiZSByZXRyaWV2ZWQgaWYgdGhlIGNsaWVudAorICAgICAgICAvLyByZXF1ZXN0IHRodW1ibmFpbCBleHBsaWNpdGx5LCBidXQgd29uJ3QgYmUgZXhwb3NlZCBhcyBkaXNwbGF5YWJsZXMuCisgICAgICAgIEltYWdlSXRlbSAmdGh1bWJJbWFnZSA9IGl0ZW1JZFRvSXRlbU1hcC5lZGl0VmFsdWVBdChpdGVtSW5kZXgpOworICAgICAgICB0aHVtYkltYWdlLmhpZGRlbiA9IHRydWU7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUmVmcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaXRlbUluZGV4ID0gaXRlbUlkVG9JdGVtTWFwLmluZGV4T2ZLZXkobVJlZnNbaV0pOworCisgICAgICAgICAgICAvLyBpZ25vcmUgbm9uLWltYWdlIGl0ZW1zCisgICAgICAgICAgICBpZiAoaXRlbUluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIkltYWdlIGl0ZW0gaWQgJWQgdXNlcyB0aHVtYm5haWwgaXRlbSBpZCAlZCIsIG1SZWZzW2ldLCBtSXRlbUlkKTsKKyAgICAgICAgICAgIEltYWdlSXRlbSAmbWFzdGVySW1hZ2UgPSBpdGVtSWRUb0l0ZW1NYXAuZWRpdFZhbHVlQXQoaXRlbUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbWFzdGVySW1hZ2UudGh1bWJuYWlscy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImFscmVhZHkgaGFzIHRodW1ibmFpbHMhIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXN0ZXJJbWFnZS50aHVtYm5haWxzLnB1c2hfYmFjayhtSXRlbUlkKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGT1VSQ0MoJ2MnLCAnZCcsICdzJywgJ2MnKTogeworICAgICAgICBzc2l6ZV90IGl0ZW1JbmRleCA9IGl0ZW1JZFRvRXhpZk1hcC5pbmRleE9mS2V5KG1JdGVtSWQpOworCisgICAgICAgIC8vIGlnbm9yZSBub24tZXhpZiBibG9jayBpdGVtcworICAgICAgICBpZiAoaXRlbUluZGV4IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUmVmcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaXRlbUluZGV4ID0gaXRlbUlkVG9JdGVtTWFwLmluZGV4T2ZLZXkobVJlZnNbaV0pOworCisgICAgICAgICAgICAvLyBpZ25vcmUgbm9uLWltYWdlIGl0ZW1zCisgICAgICAgICAgICBpZiAoaXRlbUluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIkltYWdlIGl0ZW0gaWQgJWQgdXNlcyBtZXRhZGF0YSBpdGVtIGlkICVkIiwgbVJlZnNbaV0sIG1JdGVtSWQpOworICAgICAgICAgICAgSW1hZ2VJdGVtICZpbWFnZSA9IGl0ZW1JZFRvSXRlbU1hcC5lZGl0VmFsdWVBdChpdGVtSW5kZXgpOworICAgICAgICAgICAgaW1hZ2UuY2RzY1JlZnMucHVzaF9iYWNrKG1JdGVtSWQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZPVVJDQygnYScsICd1JywgJ3gnLCAnbCcpOiB7CisgICAgICAgIHNzaXplX3QgaXRlbUluZGV4ID0gaXRlbUlkVG9JdGVtTWFwLmluZGV4T2ZLZXkobUl0ZW1JZCk7CisKKyAgICAgICAgLy8gaWdub3JlIG5vbi1pbWFnZSBpdGVtcworICAgICAgICBpZiAoaXRlbUluZGV4IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gbWFyayBhdXhpbGlhcnkgaW1hZ2UgYXMgaGlkZGVuCisgICAgICAgIEltYWdlSXRlbSAmYXV4SW1hZ2UgPSBpdGVtSWRUb0l0ZW1NYXAuZWRpdFZhbHVlQXQoaXRlbUluZGV4KTsKKyAgICAgICAgYXV4SW1hZ2UuaGlkZGVuID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dXKCJpZ25vcmluZyB1bnN1cHBvcnRlZCByZWYgdHlwZSAweCV4IiwgdHlwZSgpKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEl0ZW1SZWZlcmVuY2U6OnBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChzaXplIDwgbVJlZklkU2l6ZSArIDIpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyVmFyKG9mZnNldCwgJm1JdGVtSWQsIG1SZWZJZFNpemUpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgb2Zmc2V0ICs9IG1SZWZJZFNpemU7CisKKyAgICB1aW50MTZfdCBjb3VudDsKKyAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MTYob2Zmc2V0LCAmY291bnQpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgb2Zmc2V0ICs9IDI7CisgICAgc2l6ZSAtPSAobVJlZklkU2l6ZSArIDIpOworCisgICAgaWYgKHNpemUgPCBjb3VudCAqIG1SZWZJZFNpemUpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgdWludDMyX3QgcmVmSXRlbUlkOworICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MzJWYXIob2Zmc2V0LCAmcmVmSXRlbUlkLCBtUmVmSWRTaXplKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSBtUmVmSWRTaXplOworICAgICAgICBtUmVmcy5wdXNoX2JhY2socmVmSXRlbUlkKTsKKyAgICAgICAgQUxPR1YoIml0ZW0gaWQgJWQ6IHJlZmVyZW5jaW5nIGl0ZW0gaWQgJWQiLCBtSXRlbUlkLCByZWZJdGVtSWQpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RydWN0IElyZWZCb3ggOiBwdWJsaWMgRnVsbEJveCB7CisgICAgSXJlZkJveChEYXRhU291cmNlQmFzZSAqc291cmNlLCBWZWN0b3I8c3A8SXRlbVJlZmVyZW5jZT4gPiAqaXRlbVJlZnMpIDoKKyAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygnaScsICdyJywgJ2UnLCAnZicpKSwgbVJlZklkU2l6ZSgwKSwgbUl0ZW1SZWZzKGl0ZW1SZWZzKSB7fQorCisgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKworcHJvdGVjdGVkOgorICAgIHN0YXR1c190IG9uQ2h1bmtEYXRhKHVpbnQzMl90IHR5cGUsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgdWludDMyX3QgbVJlZklkU2l6ZTsKKyAgICBWZWN0b3I8c3A8SXRlbVJlZmVyZW5jZT4gPiAqbUl0ZW1SZWZzOworfTsKKworc3RhdHVzX3QgSXJlZkJveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUZ1bGxCb3hIZWFkZXIoJm9mZnNldCwgJnNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBtUmVmSWRTaXplID0gKHZlcnNpb24oKSA9PSAwKSA/IDIgOiA0OworICAgIHJldHVybiBwYXJzZUNodW5rcyhvZmZzZXQsIHNpemUpOworfQorCitzdGF0dXNfdCBJcmVmQm94OjpvbkNodW5rRGF0YSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBzcDxJdGVtUmVmZXJlbmNlPiBpdGVtUmVmID0gbmV3IEl0ZW1SZWZlcmVuY2Uoc291cmNlKCksIHR5cGUsIG1SZWZJZFNpemUpOworCisgICAgc3RhdHVzX3QgZXJyID0gaXRlbVJlZi0+cGFyc2Uob2Zmc2V0LCBzaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIG1JdGVtUmVmcy0+cHVzaF9iYWNrKGl0ZW1SZWYpOworICAgIHJldHVybiBPSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIEl0ZW1Qcm9wZXJ0eSByZWxhdGVkIGJveGVzCisvLworCitzdHJ1Y3QgQXNzb2NpYXRpb25FbnRyeSB7CisgICAgdWludDMyX3QgaXRlbUlkOworICAgIGJvb2wgZXNzZW50aWFsOworICAgIHVpbnQxNl90IGluZGV4OworfTsKKworc3RydWN0IEl0ZW1Qcm9wZXJ0eSA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBJdGVtUHJvcGVydHkoKSB7fQorCisgICAgdmlydHVhbCB2b2lkIGF0dGFjaFRvKEltYWdlSXRlbSAmLyppbWFnZSovKSBjb25zdCB7CisgICAgICAgIEFMT0dXKCJVbnJlY29nbml6ZWQgcHJvcGVydHkiKTsKKyAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBwYXJzZShvZmY2NF90IC8qb2Zmc2V0Ki8sIHNpemVfdCAvKnNpemUqLykgeworICAgICAgICBBTE9HVygiVW5yZWNvZ25pemVkIHByb3BlcnR5Iik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSXRlbVByb3BlcnR5KTsKK307CisKK3N0cnVjdCBJc3BlQm94IDogcHVibGljIEZ1bGxCb3gsIHB1YmxpYyBJdGVtUHJvcGVydHkgeworICAgIElzcGVCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkgOgorICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ3MnLCAncCcsICdlJykpLCBtV2lkdGgoMCksIG1IZWlnaHQoMCkge30KKworICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGF0dGFjaFRvKEltYWdlSXRlbSAmaW1hZ2UpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgaW1hZ2Uud2lkdGggPSBtV2lkdGg7CisgICAgICAgIGltYWdlLmhlaWdodCA9IG1IZWlnaHQ7CisgICAgfQorCitwcml2YXRlOgorICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworfTsKKworc3RhdHVzX3QgSXNwZUJveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKworICAgIHN0YXR1c190IGVyciA9IHBhcnNlRnVsbEJveEhlYWRlcigmb2Zmc2V0LCAmc2l6ZSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmIChzaXplIDwgOCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MzIob2Zmc2V0LCAmbVdpZHRoKQorICAgICAgICAgICAgfHwgIXNvdXJjZSgpLT5nZXRVSW50MzIob2Zmc2V0ICsgNCwgJm1IZWlnaHQpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgQUxPR1YoInByb3BlcnR5IGlzcGU6ICVkeCVkIiwgbVdpZHRoLCBtSGVpZ2h0KTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RydWN0IEh2Y2NCb3ggOiBwdWJsaWMgQm94LCBwdWJsaWMgSXRlbVByb3BlcnR5IHsKKyAgICBIdmNjQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKKyAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCdoJywgJ3YnLCAnYycsICdDJykpIHt9CisKKyAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworCisgICAgdm9pZCBhdHRhY2hUbyhJbWFnZUl0ZW0gJmltYWdlKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIGltYWdlLmh2Y2MgPSBtSFZDQzsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3A8QUJ1ZmZlcj4gbUhWQ0M7Cit9OworCitzdGF0dXNfdCBIdmNjQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworCisgICAgbUhWQ0MgPSBuZXcgQUJ1ZmZlcihzaXplKTsKKworICAgIGlmIChtSFZDQy0+ZGF0YSgpID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImIvMjg0NzEyMDYiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBpZiAoc291cmNlKCktPnJlYWRBdChvZmZzZXQsIG1IVkNDLT5kYXRhKCksIHNpemUpIDwgKHNzaXplX3Qpc2l6ZSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorCisgICAgQUxPR1YoInByb3BlcnR5IGh2Y0MiKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RydWN0IElyb3RCb3ggOiBwdWJsaWMgQm94LCBwdWJsaWMgSXRlbVByb3BlcnR5IHsKKyAgICBJcm90Qm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKKyAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ3InLCAnbycsICd0JykpLCBtQW5nbGUoMCkge30KKworICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGF0dGFjaFRvKEltYWdlSXRlbSAmaW1hZ2UpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgaW1hZ2Uucm90YXRpb24gPSBtQW5nbGUgKiA5MDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdWludDhfdCBtQW5nbGU7Cit9OworCitzdGF0dXNfdCBJcm90Qm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworCisgICAgaWYgKHNpemUgPCAxKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGlmIChzb3VyY2UoKS0+cmVhZEF0KG9mZnNldCwgJm1BbmdsZSwgMSkgIT0gMSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorICAgIG1BbmdsZSAmPSAweDM7CisgICAgQUxPR1YoInByb3BlcnR5IGlyb3Q6ICVkIiwgbUFuZ2xlKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RydWN0IENvbHJCb3ggOiBwdWJsaWMgQm94LCBwdWJsaWMgSXRlbVByb3BlcnR5IHsKKyAgICBDb2xyQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKKyAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCdjJywgJ28nLCAnbCcsICdyJykpIHt9CisKKyAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworCisgICAgdm9pZCBhdHRhY2hUbyhJbWFnZUl0ZW0gJmltYWdlKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIGltYWdlLmljYyA9IG1JQ0NEYXRhOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzcDxBQnVmZmVyPiBtSUNDRGF0YTsKK307CisKK3N0YXR1c190IENvbHJCb3g6OnBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIEFMT0dWKCIlczogb2Zmc2V0ICVsbGQsIHNpemUgJXp1IiwgX19GVU5DVElPTl9fLCAobG9uZyBsb25nKW9mZnNldCwgc2l6ZSk7CisKKyAgICBpZiAoc2l6ZSA8IDQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgdWludDMyX3QgY29sb3VyX3R5cGU7CisgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyKG9mZnNldCwgJmNvbG91cl90eXBlKSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorICAgIG9mZnNldCArPSA0OworICAgIHNpemUgLT0gNDsKKyAgICBpZiAoY29sb3VyX3R5cGUgPT0gRk9VUkNDKCduJywgJ2MnLCAnbCcsICd4JykpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBpZiAoKGNvbG91cl90eXBlICE9IEZPVVJDQygncicsICdJJywgJ0MnLCAnQycpKSAmJgorICAgICAgICAoY29sb3VyX3R5cGUgIT0gRk9VUkNDKCdwJywgJ3InLCAnbycsICdmJykpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgbUlDQ0RhdGEgPSBuZXcgQUJ1ZmZlcihzaXplKTsKKyAgICBpZiAobUlDQ0RhdGEtPmRhdGEoKSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJiLzI4NDcxMjA2Iik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgaWYgKHNvdXJjZSgpLT5yZWFkQXQob2Zmc2V0LCBtSUNDRGF0YS0+ZGF0YSgpLCBzaXplKSAhPSAoc3NpemVfdClzaXplKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisKKyAgICBBTE9HVigicHJvcGVydHkgQ29scjogc2l6ZSAlemQiLCBzaXplKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0cnVjdCBJcG1hQm94IDogcHVibGljIEZ1bGxCb3ggeworICAgIElwbWFCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgVmVjdG9yPEFzc29jaWF0aW9uRW50cnk+ICphc3NvY2lhdGlvbnMpIDoKKyAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygnaScsICdwJywgJ20nLCAnYScpKSwgbUFzc29jaWF0aW9ucyhhc3NvY2lhdGlvbnMpIHt9CisKKyAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOworcHJpdmF0ZToKKyAgICBWZWN0b3I8QXNzb2NpYXRpb25FbnRyeT4gKm1Bc3NvY2lhdGlvbnM7Cit9OworCitzdGF0dXNfdCBJcG1hQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUZ1bGxCb3hIZWFkZXIoJm9mZnNldCwgJnNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoc2l6ZSA8IDQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgdWludDMyX3QgZW50cnlDb3VudDsKKyAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MzIob2Zmc2V0LCAmZW50cnlDb3VudCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICBvZmZzZXQgKz0gNDsKKyAgICBzaXplIC09IDQ7CisKKyAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IGVudHJ5Q291bnQ7ICsraykgeworICAgICAgICB1aW50MzJfdCBpdGVtSWQgPSAwOworICAgICAgICBzaXplX3QgaXRlbUlkU2l6ZSA9ICh2ZXJzaW9uKCkgPCAxKSA/IDIgOiA0OworCisgICAgICAgIGlmIChzaXplIDwgaXRlbUlkU2l6ZSArIDEpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MzJWYXIob2Zmc2V0LCAmaXRlbUlkLCBpdGVtSWRTaXplKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSBpdGVtSWRTaXplOworICAgICAgICBzaXplIC09IGl0ZW1JZFNpemU7CisKKyAgICAgICAgdWludDhfdCBhc3NvY2lhdGlvbkNvdW50OworICAgICAgICBpZiAoIXNvdXJjZSgpLT5yZWFkQXQob2Zmc2V0LCAmYXNzb2NpYXRpb25Db3VudCwgMSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQrKzsKKyAgICAgICAgc2l6ZS0tOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXNzb2NpYXRpb25Db3VudDsgKytpKSB7CisgICAgICAgICAgICBzaXplX3QgcHJvcEluZGV4U2l6ZSA9IChmbGFncygpICYgMSkgPyAyIDogMTsKKyAgICAgICAgICAgIGlmIChzaXplIDwgcHJvcEluZGV4U2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1aW50MTZfdCBwcm9wSW5kZXg7CisgICAgICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MTZWYXIob2Zmc2V0LCAmcHJvcEluZGV4LCBwcm9wSW5kZXhTaXplKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9mZnNldCArPSBwcm9wSW5kZXhTaXplOworICAgICAgICAgICAgc2l6ZSAtPSBwcm9wSW5kZXhTaXplOworICAgICAgICAgICAgdWludDE2X3QgYml0bWFzayA9ICgxIDw8ICg4ICogcHJvcEluZGV4U2l6ZSAtIDEpKTsKKyAgICAgICAgICAgIEFzc29jaWF0aW9uRW50cnkgZW50cnkgPSB7CisgICAgICAgICAgICAgICAgICAgIC5pdGVtSWQgPSBpdGVtSWQsCisgICAgICAgICAgICAgICAgICAgIC5lc3NlbnRpYWwgPSAhIShwcm9wSW5kZXggJiBiaXRtYXNrKSwKKyAgICAgICAgICAgICAgICAgICAgLmluZGV4ID0gKHVpbnQxNl90KSAocHJvcEluZGV4ICYgfmJpdG1hc2spCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBBTE9HVigiaXRlbSBpZCAlZCBhc3NvY2lhdGVkIHRvIHByb3BlcnR5ICVkIChlc3NlbnRpYWwgJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgaXRlbUlkLCBlbnRyeS5pbmRleCwgZW50cnkuZXNzZW50aWFsKTsKKworICAgICAgICAgICAgbUFzc29jaWF0aW9ucy0+cHVzaF9iYWNrKGVudHJ5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RydWN0IElwY29Cb3ggOiBwdWJsaWMgQm94IHsKKyAgICBJcGNvQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIFZlY3RvcjxzcDxJdGVtUHJvcGVydHk+ID4gKnByb3BlcnRpZXMpIDoKKyAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ3AnLCAnYycsICdvJykpLCBtSXRlbVByb3BlcnRpZXMocHJvcGVydGllcykge30KKworICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7Citwcm90ZWN0ZWQ6CisgICAgc3RhdHVzX3Qgb25DaHVua0RhdGEodWludDMyX3QgdHlwZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBWZWN0b3I8c3A8SXRlbVByb3BlcnR5PiA+ICptSXRlbVByb3BlcnRpZXM7Cit9OworCitzdGF0dXNfdCBJcGNvQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworICAgIC8vIHB1c2ggZHVtbXkgYXMgdGhlIGluZGV4IGlzIDEtYmFzZWQKKyAgICBtSXRlbVByb3BlcnRpZXMtPnB1c2hfYmFjayhuZXcgSXRlbVByb3BlcnR5KCkpOworICAgIHJldHVybiBwYXJzZUNodW5rcyhvZmZzZXQsIHNpemUpOworfQorCitzdGF0dXNfdCBJcGNvQm94OjpvbkNodW5rRGF0YSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBzcDxJdGVtUHJvcGVydHk+IGl0ZW1Qcm9wZXJ0eTsKKyAgICBzd2l0Y2godHlwZSkgeworICAgICAgICBjYXNlIEZPVVJDQygnaCcsICd2JywgJ2MnLCAnQycpOgorICAgICAgICB7CisgICAgICAgICAgICBpdGVtUHJvcGVydHkgPSBuZXcgSHZjY0JveChzb3VyY2UoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdzJywgJ3AnLCAnZScpOgorICAgICAgICB7CisgICAgICAgICAgICBpdGVtUHJvcGVydHkgPSBuZXcgSXNwZUJveChzb3VyY2UoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdyJywgJ28nLCAndCcpOgorICAgICAgICB7CisgICAgICAgICAgICBpdGVtUHJvcGVydHkgPSBuZXcgSXJvdEJveChzb3VyY2UoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygnYycsICdvJywgJ2wnLCAncicpOgorICAgICAgICB7CisgICAgICAgICAgICBpdGVtUHJvcGVydHkgPSBuZXcgQ29sckJveChzb3VyY2UoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICAvLyBwdXNoIGR1bW15IHRvIG1haW50YWluIGNvcnJlY3QgaXRlbSBwcm9wZXJ0eSBpbmRleAorICAgICAgICAgICAgaXRlbVByb3BlcnR5ID0gbmV3IEl0ZW1Qcm9wZXJ0eSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdHVzX3QgZXJyID0gaXRlbVByb3BlcnR5LT5wYXJzZShvZmZzZXQsIHNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgbUl0ZW1Qcm9wZXJ0aWVzLT5wdXNoX2JhY2soaXRlbVByb3BlcnR5KTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0cnVjdCBJcHJwQm94IDogcHVibGljIEJveCB7CisgICAgSXBycEJveChEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICAgICAgVmVjdG9yPHNwPEl0ZW1Qcm9wZXJ0eT4gPiAqcHJvcGVydGllcywKKyAgICAgICAgICAgIFZlY3RvcjxBc3NvY2lhdGlvbkVudHJ5PiAqYXNzb2NpYXRpb25zKSA6CisgICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygnaScsICdwJywgJ3InLCAncCcpKSwKKyAgICAgICAgbVByb3BlcnRpZXMocHJvcGVydGllcyksIG1Bc3NvY2lhdGlvbnMoYXNzb2NpYXRpb25zKSB7fQorCisgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKK3Byb3RlY3RlZDoKKyAgICBzdGF0dXNfdCBvbkNodW5rRGF0YSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIFZlY3RvcjxzcDxJdGVtUHJvcGVydHk+ID4gKm1Qcm9wZXJ0aWVzOworICAgIFZlY3RvcjxBc3NvY2lhdGlvbkVudHJ5PiAqbUFzc29jaWF0aW9uczsKK307CisKK3N0YXR1c190IElwcnBCb3g6OnBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIEFMT0dWKCIlczogb2Zmc2V0ICVsbGQsIHNpemUgJXp1IiwgX19GVU5DVElPTl9fLCAobG9uZyBsb25nKW9mZnNldCwgc2l6ZSk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rcyhvZmZzZXQsIHNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBJcHJwQm94OjpvbkNodW5rRGF0YSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBzd2l0Y2godHlwZSkgeworICAgICAgICBjYXNlIEZPVVJDQygnaScsICdwJywgJ2MnLCAnbycpOgorICAgICAgICB7CisgICAgICAgICAgICBJcGNvQm94IGlwY29Cb3goc291cmNlKCksIG1Qcm9wZXJ0aWVzKTsKKyAgICAgICAgICAgIHJldHVybiBpcGNvQm94LnBhcnNlKG9mZnNldCwgc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAncCcsICdtJywgJ2EnKToKKyAgICAgICAgeworICAgICAgICAgICAgSXBtYUJveCBpcG1hQm94KHNvdXJjZSgpLCBtQXNzb2NpYXRpb25zKTsKKyAgICAgICAgICAgIHJldHVybiBpcG1hQm94LnBhcnNlKG9mZnNldCwgc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR1coIlVucmVjb2duaXplZCBib3guIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJdGVtSW5mbyByZWxhdGVkIGJveGVzCisvLworc3RydWN0IEl0ZW1JbmZvIHsKKyAgICB1aW50MzJfdCBpdGVtSWQ7CisgICAgdWludDMyX3QgaXRlbVR5cGU7CisgICAgYm9vbCBoaWRkZW47Cit9OworCitzdHJ1Y3QgSW5mZUJveCA6IHB1YmxpYyBGdWxsQm94IHsKKyAgICBJbmZlQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKKyAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygnaScsICduJywgJ2YnLCAnZScpKSB7fQorCisgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBJdGVtSW5mbyAqaXRlbUluZm8pOworCitwcml2YXRlOgorICAgIGJvb2wgcGFyc2VOdWxsVGVybWluYXRlZFN0cmluZyhvZmY2NF90ICpvZmZzZXQsIHNpemVfdCAqc2l6ZSwgU3RyaW5nOCAqb3V0KTsKK307CisKK2Jvb2wgSW5mZUJveDo6cGFyc2VOdWxsVGVybWluYXRlZFN0cmluZygKKyAgICAgICAgb2ZmNjRfdCAqb2Zmc2V0LCBzaXplX3QgKnNpemUsIFN0cmluZzggKm91dCkgeworICAgIGNoYXIgdG1wOworICAgIFZlY3RvcjxjaGFyPiBidWY7CisgICAgYnVmLnNldENhcGFjaXR5KDI1Nik7CisgICAgb2ZmNjRfdCBuZXdPZmZzZXQgPSAqb2Zmc2V0OworICAgIG9mZjY0X3Qgc3RvcE9mZnNldCA9ICpvZmZzZXQgKyAqc2l6ZTsKKyAgICB3aGlsZSAobmV3T2Zmc2V0IDwgc3RvcE9mZnNldCkgeworICAgICAgICBpZiAoIXNvdXJjZSgpLT5yZWFkQXQobmV3T2Zmc2V0KyssICZ0bXAsIDEpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgYnVmLnB1c2hfYmFjayh0bXApOworICAgICAgICBpZiAodG1wID09IDApIHsKKyAgICAgICAgICAgIG91dC0+c2V0VG8oYnVmLmFycmF5KCkpOworCisgICAgICAgICAgICAqb2Zmc2V0ID0gbmV3T2Zmc2V0OworICAgICAgICAgICAgKnNpemUgPSBzdG9wT2Zmc2V0IC0gbmV3T2Zmc2V0OworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IEluZmVCb3g6OnBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgSXRlbUluZm8gKml0ZW1JbmZvKSB7CisgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VGdWxsQm94SGVhZGVyKCZvZmZzZXQsICZzaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKHZlcnNpb24oKSA9PSAwIHx8IHZlcnNpb24oKSA9PSAxKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9IGVsc2UgeyAvLyB2ZXJzaW9uID49IDIKKyAgICAgICAgdWludDMyX3QgaXRlbV9pZDsKKyAgICAgICAgc2l6ZV90IGl0ZW1JZFNpemUgPSAodmVyc2lvbigpID09IDIpID8gMiA6IDQ7CisgICAgICAgIGlmIChzaXplIDwgaXRlbUlkU2l6ZSArIDYpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyVmFyKG9mZnNldCwgJml0ZW1faWQsIGl0ZW1JZFNpemUpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIml0ZW1faWQgJWQiLCBpdGVtX2lkKTsKKyAgICAgICAgb2Zmc2V0ICs9IGl0ZW1JZFNpemU7CisgICAgICAgIHVpbnQxNl90IGl0ZW1fcHJvdGVjdGlvbl9pbmRleDsKKyAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDE2KG9mZnNldCwgJml0ZW1fcHJvdGVjdGlvbl9pbmRleCkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiaXRlbV9wcm90ZWN0aW9uX2luZGV4ICVkIiwgaXRlbV9wcm90ZWN0aW9uX2luZGV4KTsKKyAgICAgICAgb2Zmc2V0ICs9IDI7CisgICAgICAgIHVpbnQzMl90IGl0ZW1fdHlwZTsKKyAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyKG9mZnNldCwgJml0ZW1fdHlwZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorCisgICAgICAgIGl0ZW1JbmZvLT5pdGVtSWQgPSBpdGVtX2lkOworICAgICAgICBpdGVtSW5mby0+aXRlbVR5cGUgPSBpdGVtX3R5cGU7CisgICAgICAgIC8vIEFjY29yZGluZyB0byBIRUlGIHNwZWMsIChmbGFncyAmIDEpIGluZGljYXRlcyB0aGUgaW1hZ2UgaXMgaGlkZGVuCisgICAgICAgIC8vIGFuZCBub3Qgc3VwcG9zZWQgdG8gYmUgZGlzcGxheWVkLgorICAgICAgICBpdGVtSW5mby0+aGlkZGVuID0gKGZsYWdzKCkgJiAxKTsKKworICAgICAgICBjaGFyIGl0ZW1UeXBlU3RyaW5nWzVdOworICAgICAgICBNYWtlRm91ckNDU3RyaW5nKGl0ZW1fdHlwZSwgaXRlbVR5cGVTdHJpbmcpOworICAgICAgICBBTE9HVigiaXRlbV90eXBlICVzIiwgaXRlbVR5cGVTdHJpbmcpOworICAgICAgICBvZmZzZXQgKz0gNDsKKyAgICAgICAgc2l6ZSAtPSBpdGVtSWRTaXplICsgNjsKKworICAgICAgICBTdHJpbmc4IGl0ZW1fbmFtZTsKKyAgICAgICAgaWYgKCFwYXJzZU51bGxUZXJtaW5hdGVkU3RyaW5nKCZvZmZzZXQsICZzaXplLCAmaXRlbV9uYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiaXRlbV9uYW1lICVzIiwgaXRlbV9uYW1lLmNfc3RyKCkpOworCisgICAgICAgIGlmIChpdGVtX3R5cGUgPT0gRk9VUkNDKCdtJywgJ2knLCAnbScsICdlJykpIHsKKyAgICAgICAgICAgIFN0cmluZzggY29udGVudF90eXBlOworICAgICAgICAgICAgaWYgKCFwYXJzZU51bGxUZXJtaW5hdGVkU3RyaW5nKCZvZmZzZXQsICZzaXplLCAmY29udGVudF90eXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNvbnRlbnRfZW5jb2RpbmcgaXMgb3B0aW9uYWw7IGNhbiBiZSBvbWl0dGVkIGlmIHdvdWxkIGJlIGVtcHR5CisgICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnRlbnRfZW5jb2Rpbmc7CisgICAgICAgICAgICAgICAgaWYgKCFwYXJzZU51bGxUZXJtaW5hdGVkU3RyaW5nKCZvZmZzZXQsICZzaXplLCAmY29udGVudF9lbmNvZGluZykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoaXRlbV90eXBlID09IEZPVVJDQygndScsICdyJywgJ2knLCAnICcpKSB7CisgICAgICAgICAgICBTdHJpbmc4IGl0ZW1fdXJpX3R5cGU7CisgICAgICAgICAgICBpZiAoIXBhcnNlTnVsbFRlcm1pbmF0ZWRTdHJpbmcoJm9mZnNldCwgJnNpemUsICZpdGVtX3VyaV90eXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdHJ1Y3QgSWluZkJveCA6IHB1YmxpYyBGdWxsQm94IHsKKyAgICBJaW5mQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIFZlY3RvcjxJdGVtSW5mbz4gKml0ZW1JbmZvcykgOgorICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ2knLCAnbicsICdmJykpLAorICAgICAgICBtSXRlbUluZm9zKGl0ZW1JbmZvcyksIG1IYXNHcmlkcyhmYWxzZSkge30KKworICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisKKyAgICBib29sIGhhc0dyaWRzKCkgeyByZXR1cm4gbUhhc0dyaWRzOyB9CisKK3Byb3RlY3RlZDoKKyAgICBzdGF0dXNfdCBvbkNodW5rRGF0YSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIFZlY3RvcjxJdGVtSW5mbz4gKm1JdGVtSW5mb3M7CisgICAgYm9vbCBtSGFzR3JpZHM7Cit9OworCitzdGF0dXNfdCBJaW5mQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworCisgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VGdWxsQm94SGVhZGVyKCZvZmZzZXQsICZzaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgc2l6ZV90IGVudHJ5Q291bnRTaXplID0gdmVyc2lvbigpID09IDAgPyAyIDogNDsKKyAgICBpZiAoc2l6ZSA8IGVudHJ5Q291bnRTaXplKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIHVpbnQzMl90IGVudHJ5X2NvdW50OworICAgIGlmICghc291cmNlKCktPmdldFVJbnQzMlZhcihvZmZzZXQsICZlbnRyeV9jb3VudCwgZW50cnlDb3VudFNpemUpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgQUxPR1YoImVudHJ5X2NvdW50ICVkIiwgZW50cnlfY291bnQpOworCisgICAgb2ZmNjRfdCBzdG9wT2Zmc2V0ID0gb2Zmc2V0ICsgc2l6ZTsKKyAgICBvZmZzZXQgKz0gZW50cnlDb3VudFNpemU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeV9jb3VudCAmJiBvZmZzZXQgPCBzdG9wT2Zmc2V0OyBpKyspIHsKKyAgICAgICAgQUxPR1YoImVudHJ5ICV6dSIsIGkpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rKCZvZmZzZXQpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorICAgIGlmIChvZmZzZXQgIT0gc3RvcE9mZnNldCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSWluZkJveDo6b25DaHVua0RhdGEodWludDMyX3QgdHlwZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKHR5cGUgIT0gRk9VUkNDKCdpJywgJ24nLCAnZicsICdlJykpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIEluZmVCb3ggaW5mZUJveChzb3VyY2UoKSk7CisgICAgSXRlbUluZm8gaXRlbUluZm87CisgICAgc3RhdHVzX3QgZXJyID0gaW5mZUJveC5wYXJzZShvZmZzZXQsIHNpemUsICZpdGVtSW5mbyk7CisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBtSXRlbUluZm9zLT5wdXNoX2JhY2soaXRlbUluZm8pOworICAgICAgICBtSGFzR3JpZHMgfD0gKGl0ZW1JbmZvLml0ZW1UeXBlID09IEZPVVJDQygnZycsICdyJywgJ2knLCAnZCcpKTsKKyAgICB9CisgICAgLy8gSW5mZUJveCBwYXJzZSByZXR1cm5zIEVSUk9SX1VOU1VQUE9SVEVEIGlmIHRoZSBib3ggaWYgYW4gdW5zdXBwb3J0ZWQKKyAgICAvLyB2ZXJzaW9uLiBJZ25vcmUgdGhpcyBlcnJvciBhcyBpdCdzIG5vdCBmYXRhbC4KKyAgICByZXR1cm4gKGVyciA9PSBFUlJPUl9VTlNVUFBPUlRFRCkgPyBPSyA6IGVycjsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0l0ZW1UYWJsZTo6SXRlbVRhYmxlKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCisgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAorICAgICAgbVByaW1hcnlJdGVtSWQoMCksCisgICAgICBtSWRhdE9mZnNldCgwKSwKKyAgICAgIG1JZGF0U2l6ZSgwKSwKKyAgICAgIG1JbWFnZUl0ZW1zVmFsaWQoZmFsc2UpLAorICAgICAgbUN1cnJlbnRJdGVtSW5kZXgoMCkgeworICAgIG1SZXF1aXJlZEJveGVzLmluc2VydCgnaXBycCcpOworICAgIG1SZXF1aXJlZEJveGVzLmluc2VydCgnaWxvYycpOworICAgIG1SZXF1aXJlZEJveGVzLmluc2VydCgncGl0bScpOworICAgIG1SZXF1aXJlZEJveGVzLmluc2VydCgnaWluZicpOworfQorCitJdGVtVGFibGU6On5JdGVtVGFibGUoKSB7fQorCitzdGF0dXNfdCBJdGVtVGFibGU6OnBhcnNlKHVpbnQzMl90IHR5cGUsIG9mZjY0X3QgZGF0YV9vZmZzZXQsIHNpemVfdCBjaHVua19kYXRhX3NpemUpIHsKKyAgICBzd2l0Y2godHlwZSkgeworICAgICAgICBjYXNlIEZPVVJDQygnaScsICdsJywgJ28nLCAnYycpOgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcGFyc2VJbG9jQm94KGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ2knLCAnbicsICdmJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJzZUlpbmZCb3goZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAncCcsICdyJywgJ3AnKToKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHBhcnNlSXBycEJveChkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygncCcsICdpJywgJ3QnLCAnbScpOgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcGFyc2VQaXRtQm94KGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ2QnLCAnYScsICd0Jyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJzZUlkYXRCb3goZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAncicsICdlJywgJ2YnKToKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHBhcnNlSXJlZkJveChkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdwJywgJ3InLCAnbycpOgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HVygiaXBybyBib3ggbm90IHN1cHBvcnRlZCEiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dXKCJ1bnJlY29nbml6ZWQgYm94IHR5cGU6IDB4JXgiLCB0eXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgSXRlbVRhYmxlOjpwYXJzZUlsb2NCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKworICAgIElsb2NCb3ggaWxvY0JveChtRGF0YVNvdXJjZSwgJm1JdGVtTG9jcyk7CisgICAgc3RhdHVzX3QgZXJyID0gaWxvY0JveC5wYXJzZShvZmZzZXQsIHNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoaWxvY0JveC5oYXNDb25zdHJ1Y3RNZXRob2QxKCkpIHsKKyAgICAgICAgbVJlcXVpcmVkQm94ZXMuaW5zZXJ0KCdpZGF0Jyk7CisgICAgfQorCisgICAgcmV0dXJuIGJ1aWxkSW1hZ2VJdGVtc0lmUG9zc2libGUoJ2lsb2MnKTsKK30KKworc3RhdHVzX3QgSXRlbVRhYmxlOjpwYXJzZUlpbmZCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKworICAgIElpbmZCb3ggaWluZkJveChtRGF0YVNvdXJjZSwgJm1JdGVtSW5mb3MpOworICAgIHN0YXR1c190IGVyciA9IGlpbmZCb3gucGFyc2Uob2Zmc2V0LCBzaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKGlpbmZCb3guaGFzR3JpZHMoKSkgeworICAgICAgICBtUmVxdWlyZWRCb3hlcy5pbnNlcnQoJ2lyZWYnKTsKKyAgICB9CisKKyAgICByZXR1cm4gYnVpbGRJbWFnZUl0ZW1zSWZQb3NzaWJsZSgnaWluZicpOworfQorCitzdGF0dXNfdCBJdGVtVGFibGU6OnBhcnNlUGl0bUJveChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworCisgICAgUGl0bUJveCBwaXRtQm94KG1EYXRhU291cmNlKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBwaXRtQm94LnBhcnNlKG9mZnNldCwgc2l6ZSwgJm1QcmltYXJ5SXRlbUlkKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIGJ1aWxkSW1hZ2VJdGVtc0lmUG9zc2libGUoJ3BpdG0nKTsKK30KKworc3RhdHVzX3QgSXRlbVRhYmxlOjpwYXJzZUlwcnBCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKworICAgIElwcnBCb3ggaXBycEJveChtRGF0YVNvdXJjZSwgJm1JdGVtUHJvcGVydGllcywgJm1Bc3NvY2lhdGlvbnMpOworICAgIHN0YXR1c190IGVyciA9IGlwcnBCb3gucGFyc2Uob2Zmc2V0LCBzaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIGJ1aWxkSW1hZ2VJdGVtc0lmUG9zc2libGUoJ2lwcnAnKTsKK30KKworc3RhdHVzX3QgSXRlbVRhYmxlOjpwYXJzZUlkYXRCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBpZGF0IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworCisgICAgLy8gb25seSByZW1lbWJlciB0aGUgb2Zmc2V0IGFuZCBzaXplIG9mIGlkYXQgYm94IGZvciBsYXRlciB1c2UKKyAgICBtSWRhdE9mZnNldCA9IG9mZnNldDsKKyAgICBtSWRhdFNpemUgPSBzaXplOworCisgICAgcmV0dXJuIGJ1aWxkSW1hZ2VJdGVtc0lmUG9zc2libGUoJ2lkYXQnKTsKK30KKworc3RhdHVzX3QgSXRlbVRhYmxlOjpwYXJzZUlyZWZCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKworICAgIElyZWZCb3ggaXJlZkJveChtRGF0YVNvdXJjZSwgJm1JdGVtUmVmZXJlbmNlcyk7CisgICAgc3RhdHVzX3QgZXJyID0gaXJlZkJveC5wYXJzZShvZmZzZXQsIHNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICByZXR1cm4gYnVpbGRJbWFnZUl0ZW1zSWZQb3NzaWJsZSgnaXJlZicpOworfQorCitzdGF0dXNfdCBJdGVtVGFibGU6OmJ1aWxkSW1hZ2VJdGVtc0lmUG9zc2libGUodWludDMyX3QgdHlwZSkgeworICAgIGlmIChtSW1hZ2VJdGVtc1ZhbGlkKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBtQm94ZXNTZWVuLmluc2VydCh0eXBlKTsKKworICAgIC8vIG5lZWQgYXQgbGVhc3QgJ2lwcnAnLCAnaWxvYycsICdwaXRtJywgJ2lpbmYnOworICAgIC8vIG5lZWQgJ2lkYXQnIGlmIGFueSBpdGVtcyB1c2VkIGNvbnN0cnVjdGlvbl9tZXRob2Qgb2YgMjsKKyAgICAvLyBuZWVkICdpcmVmJyBpZiB0aGVyZSBhcmUgZ3JpZHMuCisgICAgaWYgKCFzdGQ6OmluY2x1ZGVzKAorICAgICAgICAgICAgbUJveGVzU2Vlbi5iZWdpbigpLCBtQm94ZXNTZWVuLmVuZCgpLAorICAgICAgICAgICAgbVJlcXVpcmVkQm94ZXMuYmVnaW4oKSwgbVJlcXVpcmVkQm94ZXMuZW5kKCkpKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBBTE9HVigiYnVpbGRpbmcgaW1hZ2UgdGFibGUuLi4iKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUl0ZW1JbmZvcy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBJdGVtSW5mbyAmaW5mbyA9IG1JdGVtSW5mb3NbaV07CisKKyAgICAgICAgLy8gT25seSBoYW5kbGUgMyB0eXBlcyBvZiBpdGVtcywgYWxsIG90aGVycyBhcmUgaWdub3JlZDoKKyAgICAgICAgLy8gICAnZ3JpZCc6IGRlcml2ZWQgaW1hZ2UgZnJvbSB0aWxlcworICAgICAgICAvLyAgICdodmMxJzogY29kZWQgaW1hZ2UgKG9yIHRpbGUpCisgICAgICAgIC8vICAgJ0V4aWYnOiBFWElGIG1ldGFkYXRhCisgICAgICAgIGlmIChpbmZvLml0ZW1UeXBlICE9IEZPVVJDQygnZycsICdyJywgJ2knLCAnZCcpICYmCisgICAgICAgICAgICBpbmZvLml0ZW1UeXBlICE9IEZPVVJDQygnaCcsICd2JywgJ2MnLCAnMScpICYmCisgICAgICAgICAgICBpbmZvLml0ZW1UeXBlICE9IEZPVVJDQygnRScsICd4JywgJ2knLCAnZicpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNzaXplX3QgaXRlbUluZGV4ID0gbUl0ZW1JZFRvSXRlbU1hcC5pbmRleE9mS2V5KGluZm8uaXRlbUlkKTsKKyAgICAgICAgaWYgKGl0ZW1JbmRleCA+PSAwKSB7CisgICAgICAgICAgICBBTE9HVygiaWdub3JpbmcgZHVwbGljYXRlIGltYWdlIGl0ZW0gaWQgJWQiLCBpbmZvLml0ZW1JZCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNzaXplX3QgaWxvY0luZGV4ID0gbUl0ZW1Mb2NzLmluZGV4T2ZLZXkoaW5mby5pdGVtSWQpOworICAgICAgICBpZiAoaWxvY0luZGV4IDwgMCkgeworICAgICAgICAgICAgQUxPR0UoImlsb2MgbWlzc2luZyBmb3IgaW1hZ2UgaXRlbSBpZCAlZCIsIGluZm8uaXRlbUlkKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IEl0ZW1Mb2MgJmlsb2MgPSBtSXRlbUxvY3NbaWxvY0luZGV4XTsKKworICAgICAgICBvZmY2NF90IG9mZnNldDsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGlmIChpbG9jLmdldExvYygmb2Zmc2V0LCAmc2l6ZSwgbUlkYXRPZmZzZXQsIG1JZGF0U2l6ZSkgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5mby5pdGVtVHlwZSA9PSBGT1VSQ0MoJ0UnLCAneCcsICdpJywgJ2YnKSkgeworICAgICAgICAgICAgLy8gT25seSBhZGQgaWYgdGhlIEV4aWYgZGF0YSBpcyBub24tZW1wdHkuIFRoZSBmaXJzdCA0IGJ5dGVzIGNvbnRhaW4KKyAgICAgICAgICAgIC8vIHRoZSBvZmZzZXQgdG8gVElGRiBoZWFkZXIsIHdoaWNoIHRoZSBFeGlmIHBhcnNlciBkb2Vzbid0IHVzZS4KKyAgICAgICAgICAgIGlmIChzaXplID4gNCkgeworICAgICAgICAgICAgICAgIEV4aWZJdGVtIGV4aWZJdGVtID0geworICAgICAgICAgICAgICAgICAgICAgICAgLm9mZnNldCA9IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zaXplID0gc2l6ZSwKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIG1JdGVtSWRUb0V4aWZNYXAuYWRkKGluZm8uaXRlbUlkLCBleGlmSXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEltYWdlSXRlbSBpbWFnZShpbmZvLml0ZW1UeXBlLCBpbmZvLml0ZW1JZCwgaW5mby5oaWRkZW4pOworCisgICAgICAgIEFMT0dWKCJhZGRpbmcgJXM6IGl0ZW1JZCAlZCIsIGltYWdlLmlzR3JpZCgpID8gImdyaWQiIDogImltYWdlIiwgaW5mby5pdGVtSWQpOworCisgICAgICAgIGlmIChpbWFnZS5pc0dyaWQoKSkgeworICAgICAgICAgICAgLy8gSW1hZ2VHcmlkIHN0cnVjdCBpcyBhdCBsZWFzdCA4LWJ5dGUsIGF0IG1vc3QgMTItYnl0ZSAoaWYgZmxhZ3MmMSkKKyAgICAgICAgICAgIGlmIChzaXplIDwgOCB8fCBzaXplID4gMTIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDhfdCBidWZbMTJdOworICAgICAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgYnVmLCBzaXplKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW1hZ2Uucm93cyA9IGJ1ZlsyXSArIDE7CisgICAgICAgICAgICBpbWFnZS5jb2x1bW5zID0gYnVmWzNdICsgMTsKKworICAgICAgICAgICAgQUxPR1YoInJvd3MgJWQsIGNvbHVtYW5zICVkIiwgaW1hZ2Uucm93cywgaW1hZ2UuY29sdW1ucyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbWFnZS5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgICAgICBpbWFnZS5zaXplID0gc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBtSXRlbUlkVG9JdGVtTWFwLmFkZChpbmZvLml0ZW1JZCwgaW1hZ2UpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUFzc29jaWF0aW9ucy5zaXplKCk7IGkrKykgeworICAgICAgICBhdHRhY2hQcm9wZXJ0eShtQXNzb2NpYXRpb25zW2ldKTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JdGVtUmVmZXJlbmNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBtSXRlbVJlZmVyZW5jZXNbaV0tPmFwcGx5KG1JdGVtSWRUb0l0ZW1NYXAsIG1JdGVtSWRUb0V4aWZNYXApOworICAgIH0KKworICAgIGJvb2wgZm91bmRQcmltYXJ5ID0gZmFsc2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSXRlbUlkVG9JdGVtTWFwLnNpemUoKTsgaSsrKSB7CisgICAgICAgIC8vIGFkZCBhbGwgbm9uLWhpZGRlbiBpbWFnZXMsIGFsc28gYWRkIHRoZSBwcmltYXJ5IGV2ZW4gaWYgaXQncyBtYXJrZWQKKyAgICAgICAgLy8gaGlkZGVuLCBpbiBjYXNlIHRoZSBwcmltYXJ5IGlzIHNldCB0byBhIHRodW1ibmFpbAorICAgICAgICBib29sIGlzUHJpbWFyeSA9IChtSXRlbUlkVG9JdGVtTWFwW2ldLml0ZW1JZCA9PSBtUHJpbWFyeUl0ZW1JZCk7CisgICAgICAgIGlmICghbUl0ZW1JZFRvSXRlbU1hcFtpXS5oaWRkZW4gfHwgaXNQcmltYXJ5KSB7CisgICAgICAgICAgICBtRGlzcGxheWFibGVzLnB1c2hfYmFjayhpKTsKKyAgICAgICAgfQorICAgICAgICBmb3VuZFByaW1hcnkgfD0gaXNQcmltYXJ5OworICAgIH0KKworICAgIEFMT0dWKCJmb3VuZCAlenUgZGlzcGxheWFibGVzIiwgbURpc3BsYXlhYmxlcy5zaXplKCkpOworCisgICAgLy8gZmFpbCBpZiBubyBkaXNwbGF5YWJsZXMgYXJlIGZvdW5kCisgICAgaWYgKG1EaXNwbGF5YWJsZXMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIC8vIGlmIHRoZSBwcmltYXJ5IGl0ZW0gaWQgaXMgaW52YWxpZCwgc2V0IHByaW1hcnkgdG8gdGhlIGZpcnN0IGRpc3BsYXlhYmxlCisgICAgaWYgKCFmb3VuZFByaW1hcnkpIHsKKyAgICAgICAgbVByaW1hcnlJdGVtSWQgPSBtSXRlbUlkVG9JdGVtTWFwW21EaXNwbGF5YWJsZXNbMF1dLml0ZW1JZDsKKyAgICB9CisKKyAgICBtSW1hZ2VJdGVtc1ZhbGlkID0gdHJ1ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgSXRlbVRhYmxlOjphdHRhY2hQcm9wZXJ0eShjb25zdCBBc3NvY2lhdGlvbkVudHJ5ICZhc3NvY2lhdGlvbikgeworICAgIHNzaXplX3QgaXRlbUluZGV4ID0gbUl0ZW1JZFRvSXRlbU1hcC5pbmRleE9mS2V5KGFzc29jaWF0aW9uLml0ZW1JZCk7CisKKyAgICAvLyBpZ25vcmUgbm9uLWltYWdlIGl0ZW1zCisgICAgaWYgKGl0ZW1JbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQxNl90IHByb3BlcnR5SW5kZXggPSBhc3NvY2lhdGlvbi5pbmRleDsKKyAgICBpZiAocHJvcGVydHlJbmRleCA+PSBtSXRlbVByb3BlcnRpZXMuc2l6ZSgpKSB7CisgICAgICAgIEFMT0dXKCJJZ25vcmluZyBpbnZhbGlkIHByb3BlcnR5IGluZGV4ICVkIiwgcHJvcGVydHlJbmRleCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVigiYXR0YWNoIHByb3BlcnR5ICVkIHRvIGl0ZW0gaWQgJWQpIiwKKyAgICAgICAgICAgIHByb3BlcnR5SW5kZXgsIGFzc29jaWF0aW9uLml0ZW1JZCk7CisKKyAgICBtSXRlbVByb3BlcnRpZXNbcHJvcGVydHlJbmRleF0tPmF0dGFjaFRvKG1JdGVtSWRUb0l0ZW1NYXAuZWRpdFZhbHVlQXQoaXRlbUluZGV4KSk7Cit9CisKK3VpbnQzMl90IEl0ZW1UYWJsZTo6Y291bnRJbWFnZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbWFnZUl0ZW1zVmFsaWQgPyBtRGlzcGxheWFibGVzLnNpemUoKSA6IDA7Cit9CisKK3NwPE1ldGFEYXRhPiBJdGVtVGFibGU6OmdldEltYWdlTWV0YShjb25zdCB1aW50MzJfdCBpbWFnZUluZGV4KSB7CisgICAgaWYgKCFtSW1hZ2VJdGVtc1ZhbGlkKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChpbWFnZUluZGV4ID49IG1EaXNwbGF5YWJsZXMuc2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBpbWFnZSBpbmRleCAldSIsIF9fRlVOQ1RJT05fXywgaW1hZ2VJbmRleCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBjb25zdCB1aW50MzJfdCBpdGVtSW5kZXggPSBtRGlzcGxheWFibGVzW2ltYWdlSW5kZXhdOworICAgIEFMT0dWKCJpbWFnZVsldV06IGl0ZW0gaW5kZXggJXUiLCBpbWFnZUluZGV4LCBpdGVtSW5kZXgpOworCisgICAgY29uc3QgSW1hZ2VJdGVtICppbWFnZSA9ICZtSXRlbUlkVG9JdGVtTWFwW2l0ZW1JbmRleF07CisKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKKyAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDKTsKKworICAgIGlmIChpbWFnZS0+aXRlbUlkID09IG1QcmltYXJ5SXRlbUlkKSB7CisgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUcmFja0lzRGVmYXVsdCwgMSk7CisgICAgfQorCisgICAgQUxPR1YoImltYWdlWyV1XTogc2l6ZSAlZHglZCIsIGltYWdlSW5kZXgsIGltYWdlLT53aWR0aCwgaW1hZ2UtPmhlaWdodCk7CisKKyAgICBtZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIGltYWdlLT53aWR0aCk7CisgICAgbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaW1hZ2UtPmhlaWdodCk7CisgICAgaWYgKGltYWdlLT5yb3RhdGlvbiAhPSAwKSB7CisgICAgICAgIC8vIFJvdGF0aW9uIGFuZ2xlIGluIEhFSUYgaXMgQ0NXLCBjb252ZXJ0IHRvIENXIGhlcmUgdG8gYmUKKyAgICAgICAgLy8gY29uc2lzdGVudCB3aXRoIHRoZSBvdGhlciBtZWRpYSBmb3JtYXRzLgorICAgICAgICBzd2l0Y2goaW1hZ2UtPnJvdGF0aW9uKSB7CisgICAgICAgICAgICBjYXNlIDkwOiBtZXRhLT5zZXRJbnQzMihrS2V5Um90YXRpb24sIDI3MCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxODA6IG1ldGEtPnNldEludDMyKGtLZXlSb3RhdGlvbiwgMTgwKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI3MDogbWV0YS0+c2V0SW50MzIoa0tleVJvdGF0aW9uLCA5MCk7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogYnJlYWs7IC8vIGRvbid0IHNldCBpZiBpbnZhbGlkCisgICAgICAgIH0KKyAgICB9CisgICAgbWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgaW1hZ2UtPndpZHRoICogaW1hZ2UtPmhlaWdodCAqIDEuNSk7CisKKyAgICBpZiAoIWltYWdlLT50aHVtYm5haWxzLmVtcHR5KCkpIHsKKyAgICAgICAgc3NpemVfdCB0aHVtYkl0ZW1JbmRleCA9IG1JdGVtSWRUb0l0ZW1NYXAuaW5kZXhPZktleShpbWFnZS0+dGh1bWJuYWlsc1swXSk7CisgICAgICAgIGlmICh0aHVtYkl0ZW1JbmRleCA+PSAwKSB7CisgICAgICAgICAgICBjb25zdCBJbWFnZUl0ZW0gJnRodW1ibmFpbCA9IG1JdGVtSWRUb0l0ZW1NYXBbdGh1bWJJdGVtSW5kZXhdOworCisgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGh1bWJuYWlsV2lkdGgsIHRodW1ibmFpbC53aWR0aCk7CisgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGh1bWJuYWlsSGVpZ2h0LCB0aHVtYm5haWwuaGVpZ2h0KTsKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleVRodW1ibmFpbEhWQ0MsIGtUeXBlSFZDQywKKyAgICAgICAgICAgICAgICAgICAgdGh1bWJuYWlsLmh2Y2MtPmRhdGEoKSwgdGh1bWJuYWlsLmh2Y2MtPnNpemUoKSk7CisgICAgICAgICAgICBBTE9HVigiaW1hZ2VbJXVdOiB0aHVtYm5haWw6IHNpemUgJWR4JWQsIGl0ZW0gaW5kZXggJXpkIiwKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCwgdGh1bWJuYWlsLndpZHRoLCB0aHVtYm5haWwuaGVpZ2h0LCB0aHVtYkl0ZW1JbmRleCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IFJlZmVyZW5jZWQgdGh1bWJuYWlsIGRvZXMgbm90IGV4aXN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaW1hZ2UtPmlzR3JpZCgpKSB7CisgICAgICAgIHNzaXplX3QgdGlsZUl0ZW1JbmRleCA9IG1JdGVtSWRUb0l0ZW1NYXAuaW5kZXhPZktleShpbWFnZS0+ZGltZ1JlZnNbMF0pOworICAgICAgICBpZiAodGlsZUl0ZW1JbmRleCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlHcmlkUm93cywgaW1hZ2UtPnJvd3MpOworICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5R3JpZENvbHMsIGltYWdlLT5jb2x1bW5zKTsKKworICAgICAgICAvLyBwb2ludCBpbWFnZSB0byB0aGUgZmlyc3QgdGlsZSBmb3IgZ3JpZCBzaXplIGFuZCBIVkNDCisgICAgICAgIGltYWdlID0gJm1JdGVtSWRUb0l0ZW1NYXAuZWRpdFZhbHVlQXQodGlsZUl0ZW1JbmRleCk7CisgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUaWxlV2lkdGgsIGltYWdlLT53aWR0aCk7CisgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUaWxlSGVpZ2h0LCBpbWFnZS0+aGVpZ2h0KTsKKyAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgaW1hZ2UtPndpZHRoICogaW1hZ2UtPmhlaWdodCAqIDEuNSk7CisgICAgfQorCisgICAgaWYgKGltYWdlLT5odmNjID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBodmNjIGlzIG1pc3NpbmcgZm9yIGltYWdlWyV1XSEiLCBfX0ZVTkNUSU9OX18sIGltYWdlSW5kZXgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbWV0YS0+c2V0RGF0YShrS2V5SFZDQywga1R5cGVIVkNDLCBpbWFnZS0+aHZjYy0+ZGF0YSgpLCBpbWFnZS0+aHZjYy0+c2l6ZSgpKTsKKworICAgIGlmIChpbWFnZS0+aWNjICE9IE5VTEwpIHsKKyAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5SWNjUHJvZmlsZSwgMCwgaW1hZ2UtPmljYy0+ZGF0YSgpLCBpbWFnZS0+aWNjLT5zaXplKCkpOworICAgIH0KKyAgICByZXR1cm4gbWV0YTsKK30KKworc3RhdHVzX3QgSXRlbVRhYmxlOjpmaW5kSW1hZ2VJdGVtKGNvbnN0IHVpbnQzMl90IGltYWdlSW5kZXgsIHVpbnQzMl90ICppdGVtSW5kZXgpIHsKKyAgICBpZiAoIW1JbWFnZUl0ZW1zVmFsaWQpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChpbWFnZUluZGV4ID49IG1EaXNwbGF5YWJsZXMuc2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBpbWFnZSBpbmRleCAlZCIsIF9fRlVOQ1RJT05fXywgaW1hZ2VJbmRleCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgKml0ZW1JbmRleCA9IG1EaXNwbGF5YWJsZXNbaW1hZ2VJbmRleF07CisKKyAgICBBTE9HVigiaW1hZ2VbJXVdOiBpdGVtIGluZGV4ICV1IiwgaW1hZ2VJbmRleCwgKml0ZW1JbmRleCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBJdGVtVGFibGU6OmZpbmRUaHVtYm5haWxJdGVtKGNvbnN0IHVpbnQzMl90IGltYWdlSW5kZXgsIHVpbnQzMl90ICppdGVtSW5kZXgpIHsKKyAgICBpZiAoIW1JbWFnZUl0ZW1zVmFsaWQpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChpbWFnZUluZGV4ID49IG1EaXNwbGF5YWJsZXMuc2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBpbWFnZSBpbmRleCAlZCIsIF9fRlVOQ1RJT05fXywgaW1hZ2VJbmRleCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgdWludDMyX3QgbWFzdGVySXRlbUluZGV4ID0gbURpc3BsYXlhYmxlc1tpbWFnZUluZGV4XTsKKworICAgIGNvbnN0IEltYWdlSXRlbSAmbWFzdGVySW1hZ2UgPSBtSXRlbUlkVG9JdGVtTWFwW21hc3Rlckl0ZW1JbmRleF07CisgICAgaWYgKG1hc3RlckltYWdlLnRodW1ibmFpbHMuZW1wdHkoKSkgeworICAgICAgICAqaXRlbUluZGV4ID0gbWFzdGVySXRlbUluZGV4OworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3NpemVfdCB0aHVtYkl0ZW1JbmRleCA9IG1JdGVtSWRUb0l0ZW1NYXAuaW5kZXhPZktleShtYXN0ZXJJbWFnZS50aHVtYm5haWxzWzBdKTsKKyAgICBpZiAodGh1bWJJdGVtSW5kZXggPCAwKSB7CisgICAgICAgIC8vIERvIG5vdCByZXR1cm4gdGhlIG1hc3RlciBpbWFnZSBpbiB0aGlzIGNhc2UsIGZhaWwgaXQgc28gdGhhdCB0aGUKKyAgICAgICAgLy8gdGh1bWJuYWlsIGV4dHJhY3Rpb24gY29kZSBrbm93cyB3ZSByZWFsbHkgZG9uJ3QgaGF2ZSBpdC4KKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgICppdGVtSW5kZXggPSB0aHVtYkl0ZW1JbmRleDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEl0ZW1UYWJsZTo6Z2V0SW1hZ2VPZmZzZXRBbmRTaXplKAorICAgICAgICB1aW50MzJfdCAqaXRlbUluZGV4LCBvZmY2NF90ICpvZmZzZXQsIHNpemVfdCAqc2l6ZSkgeworICAgIGlmICghbUltYWdlSXRlbXNWYWxpZCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKGl0ZW1JbmRleCAhPSBOVUxMKSB7CisgICAgICAgIGlmICgqaXRlbUluZGV4ID49IG1JdGVtSWRUb0l0ZW1NYXAuc2l6ZSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEJhZCBpdGVtIGluZGV4ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIG1DdXJyZW50SXRlbUluZGV4ID0gKml0ZW1JbmRleDsKKyAgICB9CisKKyAgICBJbWFnZUl0ZW0gJmltYWdlID0gbUl0ZW1JZFRvSXRlbU1hcC5lZGl0VmFsdWVBdChtQ3VycmVudEl0ZW1JbmRleCk7CisgICAgaWYgKGltYWdlLmlzR3JpZCgpKSB7CisgICAgICAgIHVpbnQzMl90IHRpbGVJdGVtSWQ7CisgICAgICAgIHN0YXR1c190IGVyciA9IGltYWdlLmdldE5leHRUaWxlSXRlbUlkKCZ0aWxlSXRlbUlkLCBpdGVtSW5kZXggIT0gTlVMTCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgc3NpemVfdCB0aWxlSXRlbUluZGV4ID0gbUl0ZW1JZFRvSXRlbU1hcC5pbmRleE9mS2V5KHRpbGVJdGVtSWQpOworICAgICAgICBpZiAodGlsZUl0ZW1JbmRleCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICB9CisgICAgICAgICpvZmZzZXQgPSBtSXRlbUlkVG9JdGVtTWFwW3RpbGVJdGVtSW5kZXhdLm9mZnNldDsKKyAgICAgICAgKnNpemUgPSBtSXRlbUlkVG9JdGVtTWFwW3RpbGVJdGVtSW5kZXhdLnNpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGl0ZW1JbmRleCA9PSBOVUxMKSB7CisgICAgICAgICAgICAvLyBGb3Igc2luZ2xlIGltYWdlcywgd2Ugb25seSBhbGxvdyBpdCB0byBiZSByZWFkIG9uY2UsIGFmdGVyIHRoYXQKKyAgICAgICAgICAgIC8vIGl0J3MgRU9TLiAgTmV3IGl0ZW0gaW5kZXggbXVzdCBiZSByZXF1ZXN0ZWQgZWFjaCB0aW1lLgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKyAgICAgICAgKm9mZnNldCA9IG1JdGVtSWRUb0l0ZW1NYXBbbUN1cnJlbnRJdGVtSW5kZXhdLm9mZnNldDsKKyAgICAgICAgKnNpemUgPSBtSXRlbUlkVG9JdGVtTWFwW21DdXJyZW50SXRlbUluZGV4XS5zaXplOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSXRlbVRhYmxlOjpnZXRFeGlmT2Zmc2V0QW5kU2l6ZShvZmY2NF90ICpvZmZzZXQsIHNpemVfdCAqc2l6ZSkgeworICAgIGlmICghbUltYWdlSXRlbXNWYWxpZCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3NpemVfdCBpdGVtSW5kZXggPSBtSXRlbUlkVG9JdGVtTWFwLmluZGV4T2ZLZXkobVByaW1hcnlJdGVtSWQpOworCisgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbiwgc29tZXRoaW5nJ3Mgc2VyaW91c2x5IHdyb25nLgorICAgIGlmIChpdGVtSW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBjb25zdCBJbWFnZUl0ZW0gJmltYWdlID0gbUl0ZW1JZFRvSXRlbU1hcFtpdGVtSW5kZXhdOworICAgIGlmIChpbWFnZS5jZHNjUmVmcy5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgc3NpemVfdCBleGlmSW5kZXggPSBtSXRlbUlkVG9FeGlmTWFwLmluZGV4T2ZLZXkoaW1hZ2UuY2RzY1JlZnNbMF0pOworICAgIGlmIChleGlmSW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICB9CisKKyAgICAvLyBza2lwIHRoZSBmaXJzdCA0LWJ5dGUgb2YgdGhlIG9mZnNldCB0byBUSUZGIGhlYWRlcgorICAgICpvZmZzZXQgPSBtSXRlbUlkVG9FeGlmTWFwW2V4aWZJbmRleF0ub2Zmc2V0ICsgNDsKKyAgICAqc2l6ZSA9IG1JdGVtSWRUb0V4aWZNYXBbZXhpZkluZGV4XS5zaXplIC0gNDsKKyAgICByZXR1cm4gT0s7Cit9CisKK30gLy8gbmFtZXNwYWNlIGhlaWYKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM2ZGNiMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5oCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBJVEVNX1RBQkxFX0hfCisjZGVmaW5lIElURU1fVEFCTEVfSF8KKworI2luY2x1ZGUgPHNldD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitjbGFzcyBNZXRhRGF0YTsKKworbmFtZXNwYWNlIGhlaWYgeworCitzdHJ1Y3QgQXNzb2NpYXRpb25FbnRyeTsKK3N0cnVjdCBJbWFnZUl0ZW07CitzdHJ1Y3QgRXhpZkl0ZW07CitzdHJ1Y3QgSXRlbUxvYzsKK3N0cnVjdCBJdGVtSW5mbzsKK3N0cnVjdCBJdGVtUHJvcGVydHk7CitzdHJ1Y3QgSXRlbVJlZmVyZW5jZTsKKworLyoKKyAqIEl0ZW1UYWJsZSBrZWVwcyB0cmFjayBvZiBhbGwgaW1hZ2UgaXRlbXMgKGluY2x1ZGluZyBjb2RlZCBpbWFnZXMsIGdyaWRzIGFuZAorICogdGlsZXMpIGluc2lkZSBhIEhFSUYgc3RpbGwgaW1hZ2UgKElTTy9JRUMgRkRJUyAyMzAwOC0xMi4yOjIwMTcoRSkpLgorICovCisKK2NsYXNzIEl0ZW1UYWJsZSA6IHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJdGVtVGFibGUoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CisKKyAgICBzdGF0dXNfdCBwYXJzZSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOworCisgICAgYm9vbCBpc1ZhbGlkKCkgeyByZXR1cm4gbUltYWdlSXRlbXNWYWxpZDsgfQorICAgIHVpbnQzMl90IGNvdW50SW1hZ2VzKCkgY29uc3Q7CisgICAgc3A8TWV0YURhdGE+IGdldEltYWdlTWV0YShjb25zdCB1aW50MzJfdCBpbWFnZUluZGV4KTsKKyAgICBzdGF0dXNfdCBmaW5kSW1hZ2VJdGVtKGNvbnN0IHVpbnQzMl90IGltYWdlSW5kZXgsIHVpbnQzMl90ICppdGVtSW5kZXgpOworICAgIHN0YXR1c190IGZpbmRUaHVtYm5haWxJdGVtKGNvbnN0IHVpbnQzMl90IGltYWdlSW5kZXgsIHVpbnQzMl90ICppdGVtSW5kZXgpOworICAgIHN0YXR1c190IGdldEltYWdlT2Zmc2V0QW5kU2l6ZSgKKyAgICAgICAgICAgIHVpbnQzMl90ICppdGVtSW5kZXgsIG9mZjY0X3QgKm9mZnNldCwgc2l6ZV90ICpzaXplKTsKKyAgICBzdGF0dXNfdCBnZXRFeGlmT2Zmc2V0QW5kU2l6ZShvZmY2NF90ICpvZmZzZXQsIHNpemVfdCAqc2l6ZSk7CisKK3Byb3RlY3RlZDoKKyAgICB+SXRlbVRhYmxlKCk7CisKK3ByaXZhdGU6CisgICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworCisgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIEl0ZW1Mb2M+IG1JdGVtTG9jczsKKyAgICBWZWN0b3I8SXRlbUluZm8+IG1JdGVtSW5mb3M7CisgICAgVmVjdG9yPEFzc29jaWF0aW9uRW50cnk+IG1Bc3NvY2lhdGlvbnM7CisgICAgVmVjdG9yPHNwPEl0ZW1Qcm9wZXJ0eT4gPiBtSXRlbVByb3BlcnRpZXM7CisgICAgVmVjdG9yPHNwPEl0ZW1SZWZlcmVuY2U+ID4gbUl0ZW1SZWZlcmVuY2VzOworCisgICAgdWludDMyX3QgbVByaW1hcnlJdGVtSWQ7CisgICAgb2ZmNjRfdCBtSWRhdE9mZnNldDsKKyAgICBzaXplX3QgbUlkYXRTaXplOworCisgICAgc3RkOjpzZXQ8dWludDMyX3Q+IG1SZXF1aXJlZEJveGVzOworICAgIHN0ZDo6c2V0PHVpbnQzMl90PiBtQm94ZXNTZWVuOworCisgICAgYm9vbCBtSW1hZ2VJdGVtc1ZhbGlkOworICAgIHVpbnQzMl90IG1DdXJyZW50SXRlbUluZGV4OworICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBJbWFnZUl0ZW0+IG1JdGVtSWRUb0l0ZW1NYXA7CisgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIEV4aWZJdGVtPiBtSXRlbUlkVG9FeGlmTWFwOworICAgIFZlY3Rvcjx1aW50MzJfdD4gbURpc3BsYXlhYmxlczsKKworICAgIHN0YXR1c190IHBhcnNlSWxvY0JveChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOworICAgIHN0YXR1c190IHBhcnNlSWluZkJveChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOworICAgIHN0YXR1c190IHBhcnNlUGl0bUJveChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOworICAgIHN0YXR1c190IHBhcnNlSXBycEJveChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOworICAgIHN0YXR1c190IHBhcnNlSWRhdEJveChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOworICAgIHN0YXR1c190IHBhcnNlSXJlZkJveChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOworCisgICAgdm9pZCBhdHRhY2hQcm9wZXJ0eShjb25zdCBBc3NvY2lhdGlvbkVudHJ5ICZhc3NvY2lhdGlvbik7CisgICAgc3RhdHVzX3QgYnVpbGRJbWFnZUl0ZW1zSWZQb3NzaWJsZSh1aW50MzJfdCB0eXBlKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEl0ZW1UYWJsZSk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBoZWlmCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gSVRFTV9UQUJMRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmNvcHkgdG8gbWVkaWEvZXh0cmFjdG9ycy9tcDQvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNWNhNjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5jcHAKQEAgLTAsMCArMSw1NDIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNUEVHNEV4dHJhY3RvciIKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIk1QRUc0RXh0cmFjdG9yLmgiCisjaW5jbHVkZSAiU2FtcGxlVGFibGUuaCIKKyNpbmNsdWRlICJJdGVtVGFibGUuaCIKKyNpbmNsdWRlICJpbmNsdWRlL0VTRFMuaCIKKworI2luY2x1ZGUgPG1lZGlhL0V4dHJhY3RvclV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjaW5jbHVkZSAiaW5jbHVkZS9JRDMuaCIKKworI2lmbmRlZiBVSU5UMzJfTUFYCisjZGVmaW5lIFVJTlQzMl9NQVggICAgICAgKDQyOTQ5NjcyOTVVKQorI2VuZGlmCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZW51bSB7CisgICAgLy8gbWF4IHRyYWNrIGhlYWRlciBjaHVuayB0byByZXR1cm4KKyAgICBrTWF4VHJhY2tIZWFkZXJTaXplID0gMzIsCisKKyAgICAvLyBtYXhpbXVtIHNpemUgb2YgYW4gYXRvbS4gU29tZSBhdG9tcyBjYW4gYmUgYmlnZ2VyIGFjY29yZGluZyB0byB0aGUgc3BlYywKKyAgICAvLyBidXQgd2Ugb25seSBhbGxvdyB1cCB0byB0aGlzIHNpemUuCisgICAga01heEF0b21TaXplID0gNjQgKiAxMDI0ICogMTAyNCwKK307CisKK2NsYXNzIE1QRUc0U291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworcHVibGljOgorICAgIC8vIENhbGxlciByZXRhaW5zIG93bmVyc2hpcCBvZiBib3RoICJkYXRhU291cmNlIiBhbmQgInNhbXBsZVRhYmxlIi4KKyAgICBNUEVHNFNvdXJjZShNZXRhRGF0YUJhc2UgJmZvcm1hdCwKKyAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKKyAgICAgICAgICAgICAgICBpbnQzMl90IHRpbWVTY2FsZSwKKyAgICAgICAgICAgICAgICBjb25zdCBzcDxTYW1wbGVUYWJsZT4gJnNhbXBsZVRhYmxlLAorICAgICAgICAgICAgICAgIFZlY3RvcjxTaWR4RW50cnk+ICZzaWR4LAorICAgICAgICAgICAgICAgIGNvbnN0IFRyZXggKnRyZXgsCisgICAgICAgICAgICAgICAgb2ZmNjRfdCBmaXJzdE1vb2ZPZmZzZXQsCisgICAgICAgICAgICAgICAgY29uc3Qgc3A8SXRlbVRhYmxlPiAmaXRlbVRhYmxlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXQoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBib29sIHN1cHBvcnROb25ibG9ja2luZ1JlYWQoKSB7IHJldHVybiB0cnVlOyB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBmcmFnbWVudGVkUmVhZChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisKKyAgICB2aXJ0dWFsIH5NUEVHNFNvdXJjZSgpOworCitwcml2YXRlOgorICAgIE11dGV4IG1Mb2NrOworCisgICAgTWV0YURhdGFCYXNlICZtRm9ybWF0OworICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBpbnQzMl90IG1UaW1lc2NhbGU7CisgICAgc3A8U2FtcGxlVGFibGU+IG1TYW1wbGVUYWJsZTsKKyAgICB1aW50MzJfdCBtQ3VycmVudFNhbXBsZUluZGV4OworICAgIHVpbnQzMl90IG1DdXJyZW50RnJhZ21lbnRJbmRleDsKKyAgICBWZWN0b3I8U2lkeEVudHJ5PiAmbVNlZ21lbnRzOworICAgIGNvbnN0IFRyZXggKm1UcmV4OworICAgIG9mZjY0X3QgbUZpcnN0TW9vZk9mZnNldDsKKyAgICBvZmY2NF90IG1DdXJyZW50TW9vZk9mZnNldDsKKyAgICBvZmY2NF90IG1OZXh0TW9vZk9mZnNldDsKKyAgICB1aW50MzJfdCBtQ3VycmVudFRpbWU7CisgICAgaW50MzJfdCBtTGFzdFBhcnNlZFRyYWNrSWQ7CisgICAgaW50MzJfdCBtVHJhY2tJZDsKKworICAgIGludDMyX3QgbUNyeXB0b01vZGU7ICAgIC8vIHBhc3NlZCBpbiBmcm9tIGV4dHJhY3RvcgorICAgIGludDMyX3QgbURlZmF1bHRJVlNpemU7IC8vIHBhc3NlZCBpbiBmcm9tIGV4dHJhY3RvcgorICAgIHVpbnQ4X3QgbUNyeXB0b0tleVsxNl07IC8vIHBhc3NlZCBpbiBmcm9tIGV4dHJhY3RvcgorICAgIHVpbnQzMl90IG1DdXJyZW50QXV4SW5mb1R5cGU7CisgICAgdWludDMyX3QgbUN1cnJlbnRBdXhJbmZvVHlwZVBhcmFtZXRlcjsKKyAgICBpbnQzMl90IG1DdXJyZW50RGVmYXVsdFNhbXBsZUluZm9TaXplOworICAgIHVpbnQzMl90IG1DdXJyZW50U2FtcGxlSW5mb0NvdW50OworICAgIHVpbnQzMl90IG1DdXJyZW50U2FtcGxlSW5mb0FsbG9jU2l6ZTsKKyAgICB1aW50OF90KiBtQ3VycmVudFNhbXBsZUluZm9TaXplczsKKyAgICB1aW50MzJfdCBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRDb3VudDsKKyAgICB1aW50MzJfdCBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzQWxsb2NTaXplOworICAgIHVpbnQ2NF90KiBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzOworCisgICAgYm9vbCBtSXNBVkM7CisgICAgYm9vbCBtSXNIRVZDOworICAgIHNpemVfdCBtTkFMTGVuZ3RoU2l6ZTsKKworICAgIGJvb2wgbVN0YXJ0ZWQ7CisKKyAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CisKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKm1CdWZmZXI7CisKKyAgICBib29sIG1XYW50c05BTEZyYWdtZW50czsKKworICAgIHVpbnQ4X3QgKm1TcmNCdWZmZXI7CisKKyAgICBib29sIG1Jc0hlaWY7CisgICAgc3A8SXRlbVRhYmxlPiBtSXRlbVRhYmxlOworCisgICAgc2l6ZV90IHBhcnNlTkFMU2l6ZShjb25zdCB1aW50OF90ICpkYXRhKSBjb25zdDsKKyAgICBzdGF0dXNfdCBwYXJzZUNodW5rKG9mZjY0X3QgKm9mZnNldCk7CisgICAgc3RhdHVzX3QgcGFyc2VUcmFja0ZyYWdtZW50SGVhZGVyKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IHNpemUpOworICAgIHN0YXR1c190IHBhcnNlVHJhY2tGcmFnbWVudFJ1bihvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBzaXplKTsKKyAgICBzdGF0dXNfdCBwYXJzZVNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uU2l6ZXMob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VTYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvbk9mZnNldHMob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3Qgc2l6ZSk7CisKKyAgICBzdHJ1Y3QgVHJhY2tGcmFnbWVudEhlYWRlckluZm8geworICAgICAgICBlbnVtIEZsYWdzIHsKKyAgICAgICAgICAgIGtCYXNlRGF0YU9mZnNldFByZXNlbnQgICAgICAgICA9IDB4MDEsCisgICAgICAgICAgICBrU2FtcGxlRGVzY3JpcHRpb25JbmRleFByZXNlbnQgPSAweDAyLAorICAgICAgICAgICAga0RlZmF1bHRTYW1wbGVEdXJhdGlvblByZXNlbnQgID0gMHgwOCwKKyAgICAgICAgICAgIGtEZWZhdWx0U2FtcGxlU2l6ZVByZXNlbnQgICAgICA9IDB4MTAsCisgICAgICAgICAgICBrRGVmYXVsdFNhbXBsZUZsYWdzUHJlc2VudCAgICAgPSAweDIwLAorICAgICAgICAgICAga0R1cmF0aW9uSXNFbXB0eSAgICAgICAgICAgICAgID0gMHgxMDAwMCwKKyAgICAgICAgfTsKKworICAgICAgICB1aW50MzJfdCBtVHJhY2tJRDsKKyAgICAgICAgdWludDMyX3QgbUZsYWdzOworICAgICAgICB1aW50NjRfdCBtQmFzZURhdGFPZmZzZXQ7CisgICAgICAgIHVpbnQzMl90IG1TYW1wbGVEZXNjcmlwdGlvbkluZGV4OworICAgICAgICB1aW50MzJfdCBtRGVmYXVsdFNhbXBsZUR1cmF0aW9uOworICAgICAgICB1aW50MzJfdCBtRGVmYXVsdFNhbXBsZVNpemU7CisgICAgICAgIHVpbnQzMl90IG1EZWZhdWx0U2FtcGxlRmxhZ3M7CisKKyAgICAgICAgdWludDY0X3QgbURhdGFPZmZzZXQ7CisgICAgfTsKKyAgICBUcmFja0ZyYWdtZW50SGVhZGVySW5mbyBtVHJhY2tGcmFnbWVudEhlYWRlckluZm87CisKKyAgICBzdHJ1Y3QgU2FtcGxlIHsKKyAgICAgICAgb2ZmNjRfdCBvZmZzZXQ7CisgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICB1aW50MzJfdCBkdXJhdGlvbjsKKyAgICAgICAgaW50MzJfdCBjb21wb3NpdGlvbk9mZnNldDsKKyAgICAgICAgdWludDhfdCBpdlsxNl07CisgICAgICAgIFZlY3RvcjxzaXplX3Q+IGNsZWFyc2l6ZXM7CisgICAgICAgIFZlY3RvcjxzaXplX3Q+IGVuY3J5cHRlZHNpemVzOworICAgIH07CisgICAgVmVjdG9yPFNhbXBsZT4gbUN1cnJlbnRTYW1wbGVzOworCisgICAgTVBFRzRTb3VyY2UoY29uc3QgTVBFRzRTb3VyY2UgJik7CisgICAgTVBFRzRTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBNUEVHNFNvdXJjZSAmKTsKK307CisKKy8vIFRoaXMgY3VzdG9tIGRhdGEgc291cmNlIHdyYXBzIGFuIGV4aXN0aW5nIG9uZSBhbmQgc2F0aXNmaWVzIHJlcXVlc3RzCisvLyBmYWxsaW5nIGVudGlyZWx5IHdpdGhpbiBhIGNhY2hlZCByYW5nZSBmcm9tIHRoZSBjYWNoZSB3aGlsZSBmb3J3YXJkaW5nCisvLyBhbGwgcmVtYWluaW5nIHJlcXVlc3RzIHRvIHRoZSB3cmFwcGVkIGRhdGFzb3VyY2UuCisvLyBUaGlzIGlzIHVzZWQgdG8gY2FjaGUgdGhlIGZ1bGwgc2FtcGxldGFibGUgbWV0YWRhdGEgZm9yIGEgc2luZ2xlIHRyYWNrLAorLy8gcG9zc2libHkgd3JhcHBpbmcgbXVsdGlwbGUgdGltZXMgdG8gY292ZXIgYWxsIHRyYWNrcywgaS5lLgorLy8gRWFjaCBDYWNoZWRSYW5nZWREYXRhU291cmNlIGNhY2hlcyB0aGUgc2FtcGxldGFibGUgbWV0YWRhdGEgZm9yIGEgc2luZ2xlIHRyYWNrLgorCitzdHJ1Y3QgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlQmFzZSB7CisgICAgZXhwbGljaXQgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZShEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKyAgICB2aXJ0dWFsIH5DYWNoZWRSYW5nZWREYXRhU291cmNlKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7CisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOworCisgICAgc3RhdHVzX3Qgc2V0Q2FjaGVkUmFuZ2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBib29sIGFzc3VtZVNvdXJjZU93bmVyc2hpcE9uU3VjY2Vzcyk7CisKKworcHJpdmF0ZToKKyAgICBNdXRleCBtTG9jazsKKworICAgIERhdGFTb3VyY2VCYXNlICptU291cmNlOworICAgIGJvb2wgbU93bnNEYXRhU291cmNlOworICAgIG9mZjY0X3QgbUNhY2hlZE9mZnNldDsKKyAgICBzaXplX3QgbUNhY2hlZFNpemU7CisgICAgdWludDhfdCAqbUNhY2hlOworCisgICAgdm9pZCBjbGVhckNhY2hlKCk7CisKKyAgICBDYWNoZWRSYW5nZWREYXRhU291cmNlKGNvbnN0IENhY2hlZFJhbmdlZERhdGFTb3VyY2UgJik7CisgICAgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IENhY2hlZFJhbmdlZERhdGFTb3VyY2UgJik7Cit9OworCitDYWNoZWRSYW5nZWREYXRhU291cmNlOjpDYWNoZWRSYW5nZWREYXRhU291cmNlKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCisgICAgOiBtU291cmNlKHNvdXJjZSksCisgICAgICBtT3duc0RhdGFTb3VyY2UoZmFsc2UpLAorICAgICAgbUNhY2hlZE9mZnNldCgwKSwKKyAgICAgIG1DYWNoZWRTaXplKDApLAorICAgICAgbUNhY2hlKE5VTEwpIHsKK30KKworQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZTo6fkNhY2hlZFJhbmdlZERhdGFTb3VyY2UoKSB7CisgICAgY2xlYXJDYWNoZSgpOworICAgIGlmIChtT3duc0RhdGFTb3VyY2UpIHsKKyAgICAgICAgZGVsZXRlIChDYWNoZWRSYW5nZWREYXRhU291cmNlKiltU291cmNlOworICAgIH0KK30KKwordm9pZCBDYWNoZWRSYW5nZWREYXRhU291cmNlOjpjbGVhckNhY2hlKCkgeworICAgIGlmIChtQ2FjaGUpIHsKKyAgICAgICAgZnJlZShtQ2FjaGUpOworICAgICAgICBtQ2FjaGUgPSBOVUxMOworICAgIH0KKworICAgIG1DYWNoZWRPZmZzZXQgPSAwOworICAgIG1DYWNoZWRTaXplID0gMDsKK30KKworc3RhdHVzX3QgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZTo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBtU291cmNlLT5pbml0Q2hlY2soKTsKK30KKworc3NpemVfdCBDYWNoZWRSYW5nZWREYXRhU291cmNlOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChpc0luUmFuZ2UobUNhY2hlZE9mZnNldCwgbUNhY2hlZFNpemUsIG9mZnNldCwgc2l6ZSkpIHsKKyAgICAgICAgbWVtY3B5KGRhdGEsICZtQ2FjaGVbb2Zmc2V0IC0gbUNhY2hlZE9mZnNldF0sIHNpemUpOworICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gbVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgZGF0YSwgc2l6ZSk7Cit9CisKK3N0YXR1c190IENhY2hlZFJhbmdlZERhdGFTb3VyY2U6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgeworICAgIHJldHVybiBtU291cmNlLT5nZXRTaXplKHNpemUpOworfQorCit1aW50MzJfdCBDYWNoZWRSYW5nZWREYXRhU291cmNlOjpmbGFncygpIHsKKyAgICByZXR1cm4gbVNvdXJjZS0+ZmxhZ3MoKTsKK30KKworc3RhdHVzX3QgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZTo6c2V0Q2FjaGVkUmFuZ2Uob2ZmNjRfdCBvZmZzZXQsCisgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICBib29sIGFzc3VtZVNvdXJjZU93bmVyc2hpcE9uU3VjY2VzcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBjbGVhckNhY2hlKCk7CisKKyAgICBtQ2FjaGUgPSAodWludDhfdCAqKW1hbGxvYyhzaXplKTsKKworICAgIGlmIChtQ2FjaGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICB9CisKKyAgICBtQ2FjaGVkT2Zmc2V0ID0gb2Zmc2V0OworICAgIG1DYWNoZWRTaXplID0gc2l6ZTsKKworICAgIHNzaXplX3QgZXJyID0gbVNvdXJjZS0+cmVhZEF0KG1DYWNoZWRPZmZzZXQsIG1DYWNoZSwgbUNhY2hlZFNpemUpOworCisgICAgaWYgKGVyciA8IChzc2l6ZV90KXNpemUpIHsKKyAgICAgICAgY2xlYXJDYWNoZSgpOworCisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgbU93bnNEYXRhU291cmNlID0gYXNzdW1lU291cmNlT3duZXJzaGlwT25TdWNjZXNzOworICAgIHJldHVybiBPSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIGNvbnN0IGJvb2wga1VzZUhleER1bXAgPSBmYWxzZTsKKworc3RhdGljIGNvbnN0IGNoYXIgKkZvdXJDQzJNSU1FKHVpbnQzMl90IGZvdXJjYykgeworICAgIHN3aXRjaCAoZm91cmNjKSB7CisgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICdhJyk6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDOworCisgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ2EnLCAnbScsICdyJyk6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05COworCisgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ2EnLCAndycsICdiJyk6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCOworCisgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICd2Jyk6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQ7CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnMicsICc2JywgJzMnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAnMicsICc2JywgJzMnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ0gnLCAnMicsICc2JywgJzMnKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzOworCisgICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ3YnLCAnYycsICcxJyk6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fQVZDOworCisgICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ3YnLCAnYycsICcxJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ2UnLCAndicsICcxJyk6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQzsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJVbmtub3duIGZvdXJjYzogJWMlYyVjJWMiLAorICAgICAgICAgICAgICAgICAgIChmb3VyY2MgPj4gMjQpICYgMHhmZiwKKyAgICAgICAgICAgICAgICAgICAoZm91cmNjID4+IDE2KSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgKGZvdXJjYyA+PiA4KSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgZm91cmNjICYgMHhmZgorICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICByZXR1cm4gImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSI7CisgICAgfQorfQorCitzdGF0aWMgYm9vbCBBZGp1c3RDaGFubmVsc0FuZFJhdGUodWludDMyX3QgZm91cmNjLCB1aW50MzJfdCAqY2hhbm5lbHMsIHVpbnQzMl90ICpyYXRlKSB7CisgICAgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgRm91ckNDMk1JTUUoZm91cmNjKSkpIHsKKyAgICAgICAgLy8gQU1SIE5CIGF1ZGlvIGlzIGFsd2F5cyBtb25vLCA4a0h6CisgICAgICAgICpjaGFubmVscyA9IDE7CisgICAgICAgICpyYXRlID0gODAwMDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsIEZvdXJDQzJNSU1FKGZvdXJjYykpKSB7CisgICAgICAgIC8vIEFNUiBXQiBhdWRpbyBpcyBhbHdheXMgbW9ubywgMTZrSHoKKyAgICAgICAgKmNoYW5uZWxzID0gMTsKKyAgICAgICAgKnJhdGUgPSAxNjAwMDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworTVBFRzRFeHRyYWN0b3I6Ok1QRUc0RXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpCisgICAgOiBtTW9vZk9mZnNldCgwKSwKKyAgICAgIG1Nb29mRm91bmQoZmFsc2UpLAorICAgICAgbU1kYXRGb3VuZChmYWxzZSksCisgICAgICBtRGF0YVNvdXJjZShzb3VyY2UpLAorICAgICAgbUNhY2hlZFNvdXJjZShOVUxMKSwKKyAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCisgICAgICBtSGVhZGVyVGltZXNjYWxlKDApLAorICAgICAgbUlzUVQoZmFsc2UpLAorICAgICAgbUlzSGVpZihmYWxzZSksCisgICAgICBtSGFzTW9vdkJveChmYWxzZSksCisgICAgICBtUHJlZmVySGVpZihtaW1lICE9IE5VTEwgJiYgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX0hFSUYpKSwKKyAgICAgIG1GaXJzdFRyYWNrKE5VTEwpLAorICAgICAgbUxhc3RUcmFjayhOVUxMKSB7CisgICAgQUxPR1YoIm1pbWU9JXMsIG1QcmVmZXJIZWlmPSVkIiwgbWltZSwgbVByZWZlckhlaWYpOworfQorCitNUEVHNEV4dHJhY3Rvcjo6fk1QRUc0RXh0cmFjdG9yKCkgeworICAgIFRyYWNrICp0cmFjayA9IG1GaXJzdFRyYWNrOworICAgIHdoaWxlICh0cmFjaykgeworICAgICAgICBUcmFjayAqbmV4dCA9IHRyYWNrLT5uZXh0OworCisgICAgICAgIGRlbGV0ZSB0cmFjazsKKyAgICAgICAgdHJhY2sgPSBuZXh0OworICAgIH0KKyAgICBtRmlyc3RUcmFjayA9IG1MYXN0VHJhY2sgPSBOVUxMOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUHNzaC5zaXplKCk7IGkrKykgeworICAgICAgICBkZWxldGUgW10gbVBzc2hbaV0uZGF0YTsKKyAgICB9CisgICAgbVBzc2guY2xlYXIoKTsKKworICAgIGRlbGV0ZSBtQ2FjaGVkU291cmNlOworfQorCit1aW50MzJfdCBNUEVHNEV4dHJhY3Rvcjo6ZmxhZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIENBTl9QQVVTRSB8CisgICAgICAgICAgICAoKG1Nb29mT2Zmc2V0ID09IDAgfHwgbVNpZHhFbnRyaWVzLnNpemUoKSAhPSAwKSA/CisgICAgICAgICAgICAgICAgICAgIChDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQgfCBDQU5fU0VFSykgOiAwKTsKK30KKworc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgeworICAgIHN0YXR1c190IGVycjsKKyAgICBpZiAoKGVyciA9IHJlYWRNZXRhRGF0YSgpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgbWV0YSA9IG1GaWxlTWV0YURhdGE7CisgICAgcmV0dXJuIE9LOworfQorCitzaXplX3QgTVBFRzRFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgeworICAgIHN0YXR1c190IGVycjsKKyAgICBpZiAoKGVyciA9IHJlYWRNZXRhRGF0YSgpKSAhPSBPSykgeworICAgICAgICBBTE9HVigiTVBFRzRFeHRyYWN0b3I6OmNvdW50VHJhY2tzOiBubyB0cmFja3MiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc2l6ZV90IG4gPSAwOworICAgIFRyYWNrICp0cmFjayA9IG1GaXJzdFRyYWNrOworICAgIHdoaWxlICh0cmFjaykgeworICAgICAgICArK247CisgICAgICAgIHRyYWNrID0gdHJhY2stPm5leHQ7CisgICAgfQorCisgICAgQUxPR1YoIk1QRUc0RXh0cmFjdG9yOjpjb3VudFRyYWNrczogJXp1IHRyYWNrcyIsIG4pOworICAgIHJldHVybiBuOworfQorCitzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CisgICAgc3RhdHVzX3QgZXJyOworICAgIGlmICgoZXJyID0gcmVhZE1ldGFEYXRhKCkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIFRyYWNrICp0cmFjayA9IG1GaXJzdFRyYWNrOworICAgIHdoaWxlIChpbmRleCA+IDApIHsKKyAgICAgICAgaWYgKHRyYWNrID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgdHJhY2sgPSB0cmFjay0+bmV4dDsKKyAgICAgICAgLS1pbmRleDsKKyAgICB9CisKKyAgICBpZiAodHJhY2sgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBbPV0geworICAgICAgICBpbnQ2NF90IGR1cmF0aW9uOworICAgICAgICBpbnQzMl90IHNhbXBsZXJhdGU7CisgICAgICAgIGlmICh0cmFjay0+aGFzX2Vsc3QgJiYgbUhlYWRlclRpbWVzY2FsZSAhPSAwICYmCisgICAgICAgICAgICAgICAgdHJhY2stPm1ldGEuZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uKSAmJgorICAgICAgICAgICAgICAgIHRyYWNrLT5tZXRhLmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZXJhdGUpKSB7CisKKyAgICAgICAgICAgIHRyYWNrLT5oYXNfZWxzdCA9IGZhbHNlOworCisgICAgICAgICAgICBpZiAodHJhY2stPmVsc3Rfc2VnbWVudF9kdXJhdGlvbiA+IElOVDY0X01BWCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDY0X3Qgc2VnbWVudF9kdXJhdGlvbiA9IHRyYWNrLT5lbHN0X3NlZ21lbnRfZHVyYXRpb247CisgICAgICAgICAgICBpbnQ2NF90IG1lZGlhX3RpbWUgPSB0cmFjay0+ZWxzdF9tZWRpYV90aW1lOworICAgICAgICAgICAgaW50NjRfdCBoYWxmc2NhbGUgPSBtSGVhZGVyVGltZXNjYWxlIC8gMjsKKyAgICAgICAgICAgIEFMT0dWKCJzZWdtZW50X2R1cmF0aW9uID0gJSIgUFJJZDY0ICIsIG1lZGlhX3RpbWUgPSAlIiBQUklkNjQKKyAgICAgICAgICAgICAgICAgICIsIGhhbGZzY2FsZSA9ICUiIFBSSWQ2NCAiLCB0aW1lc2NhbGUgPSAlZCIsCisgICAgICAgICAgICAgICAgICBzZWdtZW50X2R1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgbWVkaWFfdGltZSwKKyAgICAgICAgICAgICAgICAgIGhhbGZzY2FsZSwKKyAgICAgICAgICAgICAgICAgIG1IZWFkZXJUaW1lc2NhbGUpOworCisgICAgICAgICAgICBpbnQ2NF90IGRlbGF5OworICAgICAgICAgICAgLy8gZGVsYXkgPSAoKG1lZGlhX3RpbWUgKiBzYW1wbGVyYXRlKSArIGhhbGZzY2FsZSkgLyBtSGVhZGVyVGltZXNjYWxlOworICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cobWVkaWFfdGltZSwgc2FtcGxlcmF0ZSwgJmRlbGF5KSB8fAorICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KGRlbGF5LCBoYWxmc2NhbGUsICZkZWxheSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGRlbGF5IC89IG1IZWFkZXJUaW1lc2NhbGUsIGZhbHNlKSB8fAorICAgICAgICAgICAgICAgICAgICBkZWxheSA+IElOVDMyX01BWCB8fAorICAgICAgICAgICAgICAgICAgICBkZWxheSA8IElOVDMyX01JTikgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJkZWxheSA9ICUiIFBSSWQ2NCwgZGVsYXkpOworICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUVuY29kZXJEZWxheSwgZGVsYXkpOworCisgICAgICAgICAgICBpbnQ2NF90IHNjYWxlZF9kdXJhdGlvbjsKKyAgICAgICAgICAgIC8vIHNjYWxlZF9kdXJhdGlvbiA9IGR1cmF0aW9uICogbUhlYWRlclRpbWVzY2FsZTsKKyAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KGR1cmF0aW9uLCBtSGVhZGVyVGltZXNjYWxlLCAmc2NhbGVkX2R1cmF0aW9uKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJzY2FsZWRfZHVyYXRpb24gPSAlIiBQUklkNjQsIHNjYWxlZF9kdXJhdGlvbik7CisKKyAgICAgICAgICAgIGludDY0X3Qgc2VnbWVudF9lbmQ7CisgICAgICAgICAgICBpbnQ2NF90IHBhZGRpbmc7CisgICAgICAgICAgICAvLyBwYWRkaW5nID0gc2NhbGVkX2R1cmF0aW9uIC0gKChzZWdtZW50X2R1cmF0aW9uICsgbWVkaWFfdGltZSkgKiAxMDAwMDAwKTsKKyAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fYWRkX292ZXJmbG93KHNlZ21lbnRfZHVyYXRpb24sIG1lZGlhX3RpbWUsICZzZWdtZW50X2VuZCkgfHwKKyAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhzZWdtZW50X2VuZCwgMTAwMDAwMCwgJnNlZ21lbnRfZW5kKSB8fAorICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fc3ViX292ZXJmbG93KHNjYWxlZF9kdXJhdGlvbiwgc2VnbWVudF9lbmQsICZwYWRkaW5nKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJzZWdtZW50X2VuZCA9ICUiIFBSSWQ2NCAiLCBwYWRkaW5nID0gJSIgUFJJZDY0LCBzZWdtZW50X2VuZCwgcGFkZGluZyk7CisKKyAgICAgICAgICAgIGlmIChwYWRkaW5nIDwgMCkgeworICAgICAgICAgICAgICAgIC8vIHRyYWNrIGR1cmF0aW9uIGZyb20gbWVkaWEgaGVhZGVyICh3aGljaCBpcyB3aGF0IGtLZXlEdXJhdGlvbiBpcykgbWlnaHQKKyAgICAgICAgICAgICAgICAvLyBiZSBzbGlnaHRseSBzaG9ydGVyIHRoYW4gdGhlIHNlZ21lbnQgZHVyYXRpb24sIHdoaWNoIHdvdWxkIG1ha2UgdGhlCisgICAgICAgICAgICAgICAgLy8gcGFkZGluZyBuZWdhdGl2ZS4gQ2xhbXAgdG8gemVyby4KKyAgICAgICAgICAgICAgICBwYWRkaW5nID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50NjRfdCBwYWRkaW5nc2FtcGxlczsKKyAgICAgICAgICAgIGludDY0X3QgaGFsZnNjYWxlX2U2OworICAgICAgICAgICAgaW50NjRfdCB0aW1lc2NhbGVfZTY7CisgICAgICAgICAgICAvLyBwYWRkaW5nc2FtcGxlcyA9ICgocGFkZGluZyAqIHNhbXBsZXJhdGUpICsgKGhhbGZzY2FsZSAqIDEwMDAwMDApKQorICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgLyAobUhlYWRlclRpbWVzY2FsZSAqIDEwMDAwMDApOworICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cocGFkZGluZywgc2FtcGxlcmF0ZSwgJnBhZGRpbmdzYW1wbGVzKSB8fAorICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fbXVsX292ZXJmbG93KGhhbGZzY2FsZSwgMTAwMDAwMCwgJmhhbGZzY2FsZV9lNikgfHwKKyAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhtSGVhZGVyVGltZXNjYWxlLCAxMDAwMDAwLCAmdGltZXNjYWxlX2U2KSB8fAorICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KHBhZGRpbmdzYW1wbGVzLCBoYWxmc2NhbGVfZTYsICZwYWRkaW5nc2FtcGxlcykgfHwKKyAgICAgICAgICAgICAgICAgICAgKHBhZGRpbmdzYW1wbGVzIC89IHRpbWVzY2FsZV9lNiwgZmFsc2UpIHx8CisgICAgICAgICAgICAgICAgICAgIHBhZGRpbmdzYW1wbGVzID4gSU5UMzJfTUFYKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoInBhZGRpbmdzYW1wbGVzID0gJSIgUFJJZDY0LCBwYWRkaW5nc2FtcGxlcyk7CisgICAgICAgICAgICB0cmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlclBhZGRpbmcsIHBhZGRpbmdzYW1wbGVzKTsKKyAgICAgICAgfQorICAgIH0oKTsKKworICAgIGlmICgoZmxhZ3MgJiBrSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhKQorICAgICAgICAgICAgJiYgIXRyYWNrLT5pbmNsdWRlc19leHBlbnNpdmVfbWV0YWRhdGEpIHsKKyAgICAgICAgdHJhY2stPmluY2x1ZGVzX2V4cGVuc2l2ZV9tZXRhZGF0YSA9IHRydWU7CisKKyAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgQ0hFQ0sodHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICBpZiAoIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtaW1lLCA2KSkgeworICAgICAgICAgICAgLy8gTVBFRzIgdHJhY2tzIGRvIG5vdCBwcm92aWRlIENTRCwgc28gcmVhZCB0aGUgc3RyZWFtIGhlYWRlcgorICAgICAgICAgICAgaWYgKCFzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpKSB7CisgICAgICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQ7CisgICAgICAgICAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5zYW1wbGVUYWJsZS0+Z2V0TWV0YURhdGFGb3JTYW1wbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBzYW1wbGVJbmRleCAqLywgJm9mZnNldCwgJnNpemUsIE5VTEwgLyogc2FtcGxlVGltZSAqLykgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPiBrTWF4VHJhY2tIZWFkZXJTaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0ga01heFRyYWNrSGVhZGVyU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB1aW50OF90IGhlYWRlcltrTWF4VHJhY2tIZWFkZXJTaXplXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCAmaGVhZGVyLCBzaXplKSA9PSAoc3NpemVfdClzaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS5zZXREYXRhKGtLZXlTdHJlYW1IZWFkZXIsICdtZGF0JywgaGVhZGVyLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1Nb29mT2Zmc2V0ID4gMCkgeworICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb247CisgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tZXRhLmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyBmYW5jeSwganVzdCBwaWNrIGEgZnJhbWUgbmVhciAxLzR0aCBvZiB0aGUgZHVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleVRodW1ibmFpbFRpbWUsIGR1cmF0aW9uIC8gNCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleDsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVUaW1lOworICAgICAgICAgICAgICAgIGlmICh0cmFjay0+dGltZXNjYWxlICE9IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zYW1wbGVUYWJsZS0+ZmluZFRodW1ibmFpbFNhbXBsZSgmc2FtcGxlSW5kZXgpID09IE9LCisgICAgICAgICAgICAgICAgICAgICAgICAmJiB0cmFjay0+c2FtcGxlVGFibGUtPmdldE1ldGFEYXRhRm9yU2FtcGxlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUluZGV4LCBOVUxMIC8qIG9mZnNldCAqLywgTlVMTCAvKiBzaXplICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lKSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VGh1bWJuYWlsVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludDY0X3Qpc2FtcGxlVGltZSAqIDEwMDAwMDApIC8gdHJhY2stPnRpbWVzY2FsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbWV0YSA9IHRyYWNrLT5tZXRhOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnJlYWRNZXRhRGF0YSgpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBOT19JTklUKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIG9mZjY0X3Qgb2Zmc2V0ID0gMDsKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgYm9vbCBzYXdNb292T3JTaWR4ID0gZmFsc2U7CisKKyAgICB3aGlsZSAoISgobUhhc01vb3ZCb3ggJiYgc2F3TW9vdk9yU2lkeCAmJiAobU1kYXRGb3VuZCB8fCBtTW9vZkZvdW5kKSkgfHwKKyAgICAgICAgICAgICAobUlzSGVpZiAmJiAobVByZWZlckhlaWYgfHwgIW1IYXNNb292Qm94KSAmJgorICAgICAgICAgICAgICAgICAgICAgKG1JdGVtVGFibGUgIT0gTlVMTCkgJiYgbUl0ZW1UYWJsZS0+aXNWYWxpZCgpKSkpIHsKKyAgICAgICAgb2ZmNjRfdCBvcmlnX29mZnNldCA9IG9mZnNldDsKKyAgICAgICAgZXJyID0gcGFyc2VDaHVuaygmb2Zmc2V0LCAwKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LICYmIGVyciAhPSBVTktOT1dOX0VSUk9SKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChvZmZzZXQgPD0gb3JpZ19vZmZzZXQpIHsKKyAgICAgICAgICAgIC8vIG9ubHkgY29udGludWUgcGFyc2luZyBpZiB0aGUgb2Zmc2V0IHdhcyBhZHZhbmNlZCwKKyAgICAgICAgICAgIC8vIG90aGVyd2lzZSB3ZSBtaWdodCBlbmQgdXAgaW4gYW4gaW5maW5pdGUgbG9vcAorICAgICAgICAgICAgQUxPR0UoImRpZCBub3QgYWR2YW5jZTogJWxsZC0+JWxsZCIsIChsb25nIGxvbmcpb3JpZ19vZmZzZXQsIChsb25nIGxvbmcpb2Zmc2V0KTsKKyAgICAgICAgICAgIGVyciA9IEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBVTktOT1dOX0VSUk9SKSB7CisgICAgICAgICAgICBzYXdNb292T3JTaWR4ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtSXNIZWlmICYmIChtSXRlbVRhYmxlICE9IE5VTEwpICYmIChtSXRlbVRhYmxlLT5jb3VudEltYWdlcygpID4gMCkpIHsKKyAgICAgICAgb2ZmNjRfdCBleGlmT2Zmc2V0OworICAgICAgICBzaXplX3QgZXhpZlNpemU7CisgICAgICAgIGlmIChtSXRlbVRhYmxlLT5nZXRFeGlmT2Zmc2V0QW5kU2l6ZSgmZXhpZk9mZnNldCwgJmV4aWZTaXplKSA9PSBPSykgeworICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRJbnQ2NChrS2V5RXhpZk9mZnNldCwgKGludDY0X3QpZXhpZk9mZnNldCk7CisgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldEludDY0KGtLZXlFeGlmU2l6ZSwgKGludDY0X3QpZXhpZlNpemUpOworICAgICAgICB9CisgICAgICAgIGZvciAodWludDMyX3QgaW1hZ2VJbmRleCA9IDA7CisgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCA8IG1JdGVtVGFibGUtPmNvdW50SW1hZ2VzKCk7IGltYWdlSW5kZXgrKykgeworICAgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtSXRlbVRhYmxlLT5nZXRJbWFnZU1ldGEoaW1hZ2VJbmRleCk7CisgICAgICAgICAgICBpZiAobWV0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImhlaWYgaW1hZ2UgJXUgaGFzIG5vIG1ldGEhIiwgaW1hZ2VJbmRleCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBTb21lIGhlaWYgZmlsZXMgYWR2ZXJ0aXNlIGltYWdlIHNlcXVlbmNlIGJyYW5kcyAoZWcuICdoZXZjJykgaW4KKyAgICAgICAgICAgIC8vIGZ0eXAgYm94LCBidXQgZG9uJ3QgaGF2ZSBhbnkgdmFsaWQgdHJhY2tzIGluIHRoZW0uIEluc3RlYWQgb2YKKyAgICAgICAgICAgIC8vIHJlcG9ydGluZyB0aGUgZW50aXJlIGZpbGUgYXMgbWFsZm9ybWVkLCB3ZSBvdmVycmlkZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIC8vIHRvIGFsbG93IHN0aWxsIGltYWdlcyB0byBiZSBleHRyYWN0ZWQuCisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIkV4dHJhY3Rpbmcgc3RpbGwgaW1hZ2VzIG9ubHkiKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBPSzsKKworICAgICAgICAgICAgQUxPR1YoImFkZGluZyBIRUlGIGltYWdlIHRyYWNrICV1IiwgaW1hZ2VJbmRleCk7CisgICAgICAgICAgICBUcmFjayAqdHJhY2sgPSBuZXcgVHJhY2s7CisgICAgICAgICAgICB0cmFjay0+bmV4dCA9IE5VTEw7CisgICAgICAgICAgICBpZiAobUxhc3RUcmFjayAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bmV4dCA9IHRyYWNrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtRmlyc3RUcmFjayA9IHRyYWNrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUxhc3RUcmFjayA9IHRyYWNrOworCisgICAgICAgICAgICB0cmFjay0+bWV0YSA9ICoobWV0YS5nZXQoKSk7CisgICAgICAgICAgICB0cmFjay0+bWV0YS5zZXRJbnQzMihrS2V5VHJhY2tJRCwgaW1hZ2VJbmRleCk7CisgICAgICAgICAgICB0cmFjay0+aW5jbHVkZXNfZXhwZW5zaXZlX21ldGFkYXRhID0gZmFsc2U7CisgICAgICAgICAgICB0cmFjay0+c2tpcFRyYWNrID0gZmFsc2U7CisgICAgICAgICAgICB0cmFjay0+dGltZXNjYWxlID0gMTAwMDAwMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7CisgICAgICAgIGlmIChmaW5kVHJhY2tCeU1pbWVQcmVmaXgoInZpZGVvLyIpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZygKKyAgICAgICAgICAgICAgICAgICAga0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzQpOworICAgICAgICB9IGVsc2UgaWYgKGZpbmRUcmFja0J5TWltZVByZWZpeCgiYXVkaW8vIikgIT0gTlVMTCkgeworICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgImF1ZGlvL21wNCIpOworICAgICAgICB9IGVsc2UgaWYgKGZpbmRUcmFja0J5TWltZVByZWZpeCgKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZygKKyAgICAgICAgICAgICAgICAgICAga0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfSEVJRik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtSW5pdENoZWNrID0gZXJyOworICAgIH0KKworICAgIENIRUNLX05FKGVyciwgKHN0YXR1c190KU5PX0lOSVQpOworCisgICAgLy8gY29weSBwc3NoIGRhdGEgaW50byBmaWxlIG1ldGFkYXRhCisgICAgdWludDY0X3QgcHNzaHNpemUgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBzc2guc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgcHNzaHNpemUgKz0gMjAgKyBtUHNzaFtpXS5kYXRhbGVuOworICAgIH0KKyAgICBpZiAocHNzaHNpemUgPiAwICYmIHBzc2hzaXplIDw9IFVJTlQzMl9NQVgpIHsKKyAgICAgICAgY2hhciAqYnVmID0gKGNoYXIqKW1hbGxvYyhwc3Noc2l6ZSk7CisgICAgICAgIGlmICghYnVmKSB7CisgICAgICAgICAgICBBTE9HRSgiYi8yODQ3MTIwNiIpOworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICBjaGFyICpwdHIgPSBidWY7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBzc2guc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG1lbWNweShwdHIsIG1Qc3NoW2ldLnV1aWQsIDIwKTsgLy8gdXVpZCArIGxlbmd0aAorICAgICAgICAgICAgbWVtY3B5KHB0ciArIDIwLCBtUHNzaFtpXS5kYXRhLCBtUHNzaFtpXS5kYXRhbGVuKTsKKyAgICAgICAgICAgIHB0ciArPSAoMjAgKyBtUHNzaFtpXS5kYXRhbGVuKTsKKyAgICAgICAgfQorICAgICAgICBtRmlsZU1ldGFEYXRhLnNldERhdGEoa0tleVBzc2gsICdwc3NoJywgYnVmLCBwc3Noc2l6ZSk7CisgICAgICAgIGZyZWUoYnVmKTsKKyAgICB9CisKKyAgICByZXR1cm4gbUluaXRDaGVjazsKK30KKworc3RydWN0IFBhdGhBZGRlciB7CisgICAgUGF0aEFkZGVyKFZlY3Rvcjx1aW50MzJfdD4gKnBhdGgsIHVpbnQzMl90IGNodW5rVHlwZSkKKyAgICAgICAgOiBtUGF0aChwYXRoKSB7CisgICAgICAgIG1QYXRoLT5wdXNoKGNodW5rVHlwZSk7CisgICAgfQorCisgICAgflBhdGhBZGRlcigpIHsKKyAgICAgICAgbVBhdGgtPnBvcCgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBWZWN0b3I8dWludDMyX3Q+ICptUGF0aDsKKworICAgIFBhdGhBZGRlcihjb25zdCBQYXRoQWRkZXIgJik7CisgICAgUGF0aEFkZGVyICZvcGVyYXRvcj0oY29uc3QgUGF0aEFkZGVyICYpOworfTsKKworc3RhdGljIGJvb2wgdW5kZXJNZXRhRGF0YVBhdGgoY29uc3QgVmVjdG9yPHVpbnQzMl90PiAmcGF0aCkgeworICAgIHJldHVybiBwYXRoLnNpemUoKSA+PSA1CisgICAgICAgICYmIHBhdGhbMF0gPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICd2JykKKyAgICAgICAgJiYgcGF0aFsxXSA9PSBGT1VSQ0MoJ3UnLCAnZCcsICd0JywgJ2EnKQorICAgICAgICAmJiBwYXRoWzJdID09IEZPVVJDQygnbScsICdlJywgJ3QnLCAnYScpCisgICAgICAgICYmIHBhdGhbM10gPT0gRk9VUkNDKCdpJywgJ2wnLCAncycsICd0Jyk7Cit9CisKK3N0YXRpYyBib29sIHVuZGVyUVRNZXRhUGF0aChjb25zdCBWZWN0b3I8dWludDMyX3Q+ICZwYXRoLCBpbnQzMl90IGRlcHRoKSB7CisgICAgcmV0dXJuIHBhdGguc2l6ZSgpID49IDIKKyAgICAgICAgICAgICYmIHBhdGhbMF0gPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICd2JykKKyAgICAgICAgICAgICYmIHBhdGhbMV0gPT0gRk9VUkNDKCdtJywgJ2UnLCAndCcsICdhJykKKyAgICAgICAgICAgICYmIChkZXB0aCA9PSAyCisgICAgICAgICAgICB8fCAoZGVwdGggPT0gMworICAgICAgICAgICAgICAgICAgICAmJiAocGF0aFsyXSA9PSBGT1VSQ0MoJ2gnLCAnZCcsICdsJywgJ3InKQorICAgICAgICAgICAgICAgICAgICB8fCAgcGF0aFsyXSA9PSBGT1VSQ0MoJ2knLCAnbCcsICdzJywgJ3QnKQorICAgICAgICAgICAgICAgICAgICB8fCAgcGF0aFsyXSA9PSBGT1VSQ0MoJ2snLCAnZScsICd5JywgJ3MnKSkpKTsKK30KKworLy8gR2l2ZW4gYSB0aW1lIGluIHNlY29uZHMgc2luY2UgSmFuIDEgMTkwNCwgcHJvZHVjZSBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZy4KK3N0YXRpYyBib29sIGNvbnZlcnRUaW1lVG9EYXRlKGludDY0X3QgdGltZV8xOTA0LCBTdHJpbmc4ICpzKSB7CisgICAgLy8gZGVsdGEgYmV0d2VlbiBtcGVnNCB0aW1lIGFuZCB1bml4IGVwb2NoIHRpbWUKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBkZWx0YSA9ICgoKDY2ICogMzY1ICsgMTcpICogMjQpICogMzYwMCk7CisgICAgaWYgKHRpbWVfMTkwNCA8IElOVDY0X01JTiArIGRlbHRhKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdGltZV90IHRpbWVfMTk3MCA9IHRpbWVfMTkwNCAtIGRlbHRhOworCisgICAgY2hhciB0bXBbMzJdOworICAgIHN0cnVjdCB0bSogdG0gPSBnbXRpbWUoJnRpbWVfMTk3MCk7CisgICAgaWYgKHRtICE9IE5VTEwgJiYKKyAgICAgICAgICAgIHN0cmZ0aW1lKHRtcCwgc2l6ZW9mKHRtcCksICIlWSVtJWRUJUglTSVTLjAwMFoiLCB0bSkgPiAwKSB7CisgICAgICAgIHMtPnNldFRvKHRtcCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZUNodW5rKG9mZjY0X3QgKm9mZnNldCwgaW50IGRlcHRoKSB7CisgICAgQUxPR1YoImVudGVyaW5nIHBhcnNlQ2h1bmsgJWxsZC8lZCIsIChsb25nIGxvbmcpKm9mZnNldCwgZGVwdGgpOworCisgICAgaWYgKCpvZmZzZXQgPCAwKSB7CisgICAgICAgIEFMT0dFKCJiLzIzNTQwOTE0Iik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGlmIChkZXB0aCA+IDEwMCkgeworICAgICAgICBBTE9HRSgiYi8yNzQ1NjI5OSIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICB1aW50MzJfdCBoZHJbMl07CisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgaGRyLCA4KSA8IDgpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICB1aW50NjRfdCBjaHVua19zaXplID0gbnRvaGwoaGRyWzBdKTsKKyAgICBpbnQzMl90IGNodW5rX3R5cGUgPSBudG9obChoZHJbMV0pOworICAgIG9mZjY0X3QgZGF0YV9vZmZzZXQgPSAqb2Zmc2V0ICsgODsKKworICAgIGlmIChjaHVua19zaXplID09IDEpIHsKKyAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCArIDgsICZjaHVua19zaXplLCA4KSA8IDgpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBjaHVua19zaXplID0gbnRvaDY0KGNodW5rX3NpemUpOworICAgICAgICBkYXRhX29mZnNldCArPSA4OworCisgICAgICAgIGlmIChjaHVua19zaXplIDwgMTYpIHsKKyAgICAgICAgICAgIC8vIFRoZSBzbWFsbGVzdCB2YWxpZCBjaHVuayBpcyAxNiBieXRlcyBsb25nIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNodW5rX3NpemUgPT0gMCkgeworICAgICAgICBpZiAoZGVwdGggPT0gMCkgeworICAgICAgICAgICAgLy8gYXRvbSBleHRlbmRzIHRvIGVuZCBvZiBmaWxlCisgICAgICAgICAgICBvZmY2NF90IHNvdXJjZVNpemU7CisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPmdldFNpemUoJnNvdXJjZVNpemUpID09IE9LKSB7CisgICAgICAgICAgICAgICAgY2h1bmtfc2l6ZSA9IChzb3VyY2VTaXplIC0gKm9mZnNldCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFhYWCBjb3VsZCB3ZSBqdXN0IHBpY2sgYSAic3VmZmljaWVudGx5IGxhcmdlIiB2YWx1ZSBoZXJlPworICAgICAgICAgICAgICAgIEFMT0dFKCJhdG9tIHNpemUgaXMgMCwgYW5kIGRhdGEgc291cmNlIGhhcyBubyBzaXplIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG5vdCBhbGxvd2VkIGZvciBub24tdG9wbGV2ZWwgYXRvbXMsIHNraXAgaXQKKyAgICAgICAgICAgICpvZmZzZXQgKz0gNDsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoY2h1bmtfc2l6ZSA8IDgpIHsKKyAgICAgICAgLy8gVGhlIHNtYWxsZXN0IHZhbGlkIGNodW5rIGlzIDggYnl0ZXMgbG9uZy4KKyAgICAgICAgQUxPR0UoImludmFsaWQgY2h1bmsgc2l6ZTogJSIgUFJJdTY0LCBjaHVua19zaXplKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBjaGFyIGNodW5rWzVdOworICAgIE1ha2VGb3VyQ0NTdHJpbmcoY2h1bmtfdHlwZSwgY2h1bmspOworICAgIEFMT0dWKCJjaHVuazogJXMgQCAlbGxkLCAlZCIsIGNodW5rLCAobG9uZyBsb25nKSpvZmZzZXQsIGRlcHRoKTsKKworICAgIGlmIChrVXNlSGV4RHVtcCkgeworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBrV2hpdGVzcGFjZVtdID0gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOworICAgICAgICBjb25zdCBjaGFyICppbmRlbnQgPSAma1doaXRlc3BhY2Vbc2l6ZW9mKGtXaGl0ZXNwYWNlKSAtIDEgLSAyICogZGVwdGhdOworICAgICAgICBwcmludGYoIiVzZm91bmQgY2h1bmsgJyVzJyBvZiBzaXplICUiIFBSSXU2NCAiXG4iLCBpbmRlbnQsIGNodW5rLCBjaHVua19zaXplKTsKKworICAgICAgICBjaGFyIGJ1ZmZlclsyNTZdOworICAgICAgICBzaXplX3QgbiA9IGNodW5rX3NpemU7CisgICAgICAgIGlmIChuID4gc2l6ZW9mKGJ1ZmZlcikpIHsKKyAgICAgICAgICAgIG4gPSBzaXplb2YoYnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgqb2Zmc2V0LCBidWZmZXIsIG4pCisgICAgICAgICAgICAgICAgPCAoc3NpemVfdCluKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKworICAgICAgICBoZXhkdW1wKGJ1ZmZlciwgbik7CisgICAgfQorCisgICAgUGF0aEFkZGVyIGF1dG9BZGRlcigmbVBhdGgsIGNodW5rX3R5cGUpOworCisgICAgLy8gKGRhdGFfb2Zmc2V0IC0gKm9mZnNldCkgaXMgZWl0aGVyIDggb3IgMTYKKyAgICBvZmY2NF90IGNodW5rX2RhdGFfc2l6ZSA9IGNodW5rX3NpemUgLSAoZGF0YV9vZmZzZXQgLSAqb2Zmc2V0KTsKKyAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgMCkgeworICAgICAgICBBTE9HRSgiYi8yMzU0MDkxNCIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICBpZiAoY2h1bmtfdHlwZSAhPSBGT1VSQ0MoJ20nLCAnZCcsICdhJywgJ3QnKSAmJiBjaHVua19kYXRhX3NpemUgPiBrTWF4QXRvbVNpemUpIHsKKyAgICAgICAgY2hhciBlcnJNc2dbMTAwXTsKKyAgICAgICAgc3ByaW50ZihlcnJNc2csICIlcyBhdG9tIGhhcyBzaXplICUiIFBSSWQ2NCwgY2h1bmssIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgIEFMT0dFKCIlcyAoYi8yODYxNTQ0OCkiLCBlcnJNc2cpOworICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVXaXRoSW5mb0xvZygweDUzNGU0NTU0LCAiMjg2MTU0NDgiLCAtMSwgZXJyTXNnLCBzdHJsZW4oZXJyTXNnKSk7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKGNodW5rX3R5cGUgIT0gRk9VUkNDKCdjJywgJ3AnLCAncicsICd0JykKKyAgICAgICAgICAgICYmIGNodW5rX3R5cGUgIT0gRk9VUkNDKCdjJywgJ28nLCAndicsICdyJykKKyAgICAgICAgICAgICYmIG1QYXRoLnNpemUoKSA9PSA1ICYmIHVuZGVyTWV0YURhdGFQYXRoKG1QYXRoKSkgeworICAgICAgICBvZmY2NF90IHN0b3Bfb2Zmc2V0ID0gKm9mZnNldCArIGNodW5rX3NpemU7CisgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldDsKKyAgICAgICAgd2hpbGUgKCpvZmZzZXQgPCBzdG9wX29mZnNldCkgeworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuayhvZmZzZXQsIGRlcHRoICsgMSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICgqb2Zmc2V0ICE9IHN0b3Bfb2Zmc2V0KSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN3aXRjaChjaHVua190eXBlKSB7CisgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ28nLCAnbycsICd2Jyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ3InLCAnYScsICdrJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2QnLCAnaScsICdhJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2knLCAnbicsICdmJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJ2knLCAnbicsICdmJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAnYicsICdsJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ3YnLCAnZScsICd4Jyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ28nLCAnbycsICdmJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ3InLCAnYScsICdmJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2YnLCAncicsICdhJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCd1JywgJ2QnLCAndCcsICdhJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ2wnLCAncycsICd0Jyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ2knLCAnbicsICdmJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ2MnLCAnaCcsICdpJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdlJywgJ2QnLCAndCcsICdzJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCd3JywgJ2EnLCAndicsICdlJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygnbScsICdvJywgJ28nLCAndicpICYmIGRlcHRoICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgibW9vdjogZGVwdGggJWQiLCBkZXB0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICd2JykgJiYgbUluaXRDaGVjayA9PSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJkdXBsaWNhdGUgbW9vdiIpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygnbScsICdvJywgJ28nLCAnZicpICYmICFtTW9vZkZvdW5kKSB7CisgICAgICAgICAgICAgICAgLy8gc3RvcmUgdGhlIG9mZnNldCBvZiB0aGUgZmlyc3Qgc2VnbWVudAorICAgICAgICAgICAgICAgIG1Nb29mRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIG1Nb29mT2Zmc2V0ID0gKm9mZnNldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdzJywgJ3QnLCAnYicsICdsJykpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigic2FtcGxlVGFibGUgY2h1bmsgaXMgJSIgUFJJdTY0ICIgYnl0ZXMgbG9uZy4iLCBjaHVua19zaXplKTsKKworICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+ZmxhZ3MoKQorICAgICAgICAgICAgICAgICAgICAgICAgJiAoRGF0YVNvdXJjZUJhc2U6OmtXYW50c1ByZWZldGNoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEYXRhU291cmNlQmFzZTo6a0lzQ2FjaGluZ0RhdGFTb3VyY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIENhY2hlZFJhbmdlZERhdGFTb3VyY2UgKmNhY2hlZFNvdXJjZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZShtRGF0YVNvdXJjZSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZFNvdXJjZS0+c2V0Q2FjaGVkUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9mZnNldCwgY2h1bmtfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGVkU291cmNlICE9IE5VTEwgLyogYXNzdW1lIG93bmVyc2hpcCBvbiBzdWNjZXNzICovKSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBtQ2FjaGVkU291cmNlID0gY2FjaGVkU291cmNlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNhY2hlZFNvdXJjZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZSA9IG5ldyBTYW1wbGVUYWJsZShtRGF0YVNvdXJjZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgaXNUcmFjayA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCd0JywgJ3InLCAnYScsICdrJykpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVwdGggIT0gMSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgidHJhazogZGVwdGggJWQiLCBkZXB0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlzVHJhY2sgPSB0cnVlOworCisgICAgICAgICAgICAgICAgQUxPR1YoImFkZGluZyBuZXcgdHJhY2siKTsKKyAgICAgICAgICAgICAgICBUcmFjayAqdHJhY2sgPSBuZXcgVHJhY2s7CisgICAgICAgICAgICAgICAgdHJhY2stPm5leHQgPSBOVUxMOworICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrKSB7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm5leHQgPSB0cmFjazsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtRmlyc3RUcmFjayA9IHRyYWNrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrID0gdHJhY2s7CisKKyAgICAgICAgICAgICAgICB0cmFjay0+aW5jbHVkZXNfZXhwZW5zaXZlX21ldGFkYXRhID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdHJhY2stPnNraXBUcmFjayA9IGZhbHNlOworICAgICAgICAgICAgICAgIHRyYWNrLT50aW1lc2NhbGUgPSAwOworICAgICAgICAgICAgICAgIHRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisgICAgICAgICAgICAgICAgdHJhY2stPmhhc19lbHN0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9mZjY0X3Qgc3RvcF9vZmZzZXQgPSAqb2Zmc2V0ICsgY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldDsKKyAgICAgICAgICAgIHdoaWxlICgqb2Zmc2V0IDwgc3RvcF9vZmZzZXQpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rKG9mZnNldCwgZGVwdGggKyAxKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc1RyYWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5za2lwVHJhY2sgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgqb2Zmc2V0ICE9IHN0b3Bfb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGlzVHJhY2spIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHRyYWNrSWQ7CisgICAgICAgICAgICAgICAgLy8gVGhlcmUgbXVzdCBiZSBleGFjdCBvbmUgdHJhY2sgaGVhZGVyIHBlciB0cmFjay4KKyAgICAgICAgICAgICAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlUcmFja0lELCAmdHJhY2tJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2tpcFRyYWNrID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSB2ZXJpZnlUcmFjayhtTGFzdFRyYWNrKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNraXBUcmFjayA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2stPnNraXBUcmFjaykgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgdGhpcyB0cmFjay4uLiIpOworICAgICAgICAgICAgICAgICAgICBUcmFjayAqY3VyID0gbUZpcnN0VHJhY2s7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1ciA9PSBtTGFzdFRyYWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgY3VyOworICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0VHJhY2sgPSBtTGFzdFRyYWNrID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjdXIgJiYgY3VyLT5uZXh0ICE9IG1MYXN0VHJhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXIgPSBjdXItPm5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyLT5uZXh0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtTGFzdFRyYWNrOworICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjayA9IGN1cjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICd2JykpIHsKKyAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gT0s7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsgIC8vIFJldHVybiBhIGR1bW15IGVycm9yLgorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygnZScsICdsJywgJ3MnLCAndCcpOgorICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKKyAgICAgICAgICAgIGlmICghbUxhc3RUcmFjaykgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNlZSAxNDQ5Ni0xMiA4LjYuNgorICAgICAgICAgICAgdWludDhfdCB2ZXJzaW9uOworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQsICZ2ZXJzaW9uLCAxKSA8IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQzMl90IGVudHJ5X2NvdW50OworICAgICAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKGRhdGFfb2Zmc2V0ICsgNCwgJmVudHJ5X2NvdW50KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGVudHJ5X2NvdW50ICE9IDEpIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBvbmx5IHN1cHBvcnQgYSBzaW5nbGUgZW50cnkgYXQgdGhlIG1vbWVudCwgZm9yIGdhcGxlc3MgcGxheWJhY2sKKyAgICAgICAgICAgICAgICBBTE9HVygiaWdub3JpbmcgZWRpdCBsaXN0IHdpdGggJWQgZW50cmllcyIsIGVudHJ5X2NvdW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb2ZmNjRfdCBlbnRyaWVzb2Zmc2V0ID0gZGF0YV9vZmZzZXQgKyA4OworICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNlZ21lbnRfZHVyYXRpb247CisgICAgICAgICAgICAgICAgaW50NjRfdCBtZWRpYV90aW1lOworCisgICAgICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50NjQoZW50cmllc29mZnNldCwgJnNlZ21lbnRfZHVyYXRpb24pIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW1EYXRhU291cmNlLT5nZXRVSW50NjQoZW50cmllc29mZnNldCArIDgsICh1aW50NjRfdCopJm1lZGlhX3RpbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb24gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzZDsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtdDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKGVudHJpZXNvZmZzZXQsICZzZCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbURhdGFTb3VyY2UtPmdldFVJbnQzMihlbnRyaWVzb2Zmc2V0ICsgNCwgKHVpbnQzMl90KikmbXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2VnbWVudF9kdXJhdGlvbiA9IHNkOworICAgICAgICAgICAgICAgICAgICBtZWRpYV90aW1lID0gbXQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHNhdmUgdGhlc2UgZm9yIGxhdGVyLCBiZWNhdXNlIHRoZSBlbHN0IGF0b20gbWlnaHQgcHJlY2VkZQorICAgICAgICAgICAgICAgIC8vIHRoZSBhdG9tcyB0aGF0IGFjdHVhbGx5IGdpdmVzIHVzIHRoZSBkdXJhdGlvbiBhbmQgc2FtcGxlIHJhdGUKKyAgICAgICAgICAgICAgICAvLyBuZWVkZWQgdG8gY2FsY3VsYXRlIHRoZSBwYWRkaW5nIGFuZCBkZWxheSB2YWx1ZXMKKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5oYXNfZWxzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+ZWxzdF9tZWRpYV90aW1lID0gbWVkaWFfdGltZTsKKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5lbHN0X3NlZ21lbnRfZHVyYXRpb24gPSBzZWdtZW50X2R1cmF0aW9uOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygnZicsICdyJywgJ20nLCAnYScpOgorICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKKyAgICAgICAgICAgIHVpbnQzMl90IG9yaWdpbmFsX2ZvdXJjYzsKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0LCAmb3JpZ2luYWxfZm91cmNjLCA0KSA8IDQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcmlnaW5hbF9mb3VyY2MgPSBudG9obChvcmlnaW5hbF9mb3VyY2MpOworICAgICAgICAgICAgQUxPR1YoInJlYWQgb3JpZ2luYWwgZm9ybWF0OiAlZCIsIG9yaWdpbmFsX2ZvdXJjYyk7CisKKyAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBGb3VyQ0MyTUlNRShvcmlnaW5hbF9mb3VyY2MpKTsKKyAgICAgICAgICAgIHVpbnQzMl90IG51bV9jaGFubmVscyA9IDA7CisgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVfcmF0ZSA9IDA7CisgICAgICAgICAgICBpZiAoQWRqdXN0Q2hhbm5lbHNBbmRSYXRlKG9yaWdpbmFsX2ZvdXJjYywgJm51bV9jaGFubmVscywgJnNhbXBsZV9yYXRlKSkgeworICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtX2NoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ2UnLCAnbicsICdjJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKworICAgICAgICAgICAgaWYgKGNodW5rX3NpemUgPCAzMikgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHRlbmMgYm94IGNvbnRhaW5zIDEgYnl0ZSB2ZXJzaW9uLCAzIGJ5dGUgZmxhZ3MsIDMgYnl0ZSBkZWZhdWx0IGFsZ29yaXRobSBpZCwgb25lIGJ5dGUKKyAgICAgICAgICAgIC8vIGRlZmF1bHQgSVYgc2l6ZSwgMTYgYnl0ZXMgZGVmYXVsdCBLZXlJRAorICAgICAgICAgICAgLy8gKElTTyAyMzAwMS03KQorICAgICAgICAgICAgY2hhciBidWZbNF07CisgICAgICAgICAgICBtZW1zZXQoYnVmLCAwLCA0KTsKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0ICsgNCwgYnVmICsgMSwgMykgPCAzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDMyX3QgZGVmYXVsdEFsZ29yaXRobUlkID0gbnRvaGwoKigoaW50MzJfdCopYnVmKSk7CisgICAgICAgICAgICBpZiAoZGVmYXVsdEFsZ29yaXRobUlkID4gMSkgeworICAgICAgICAgICAgICAgIC8vIG9ubHkgMCAoY2xlYXIpIGFuZCAxIChBRVMtMTI4KSBhcmUgdmFsaWQKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZW1zZXQoYnVmLCAwLCA0KTsKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0ICsgNywgYnVmICsgMywgMSkgPCAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDMyX3QgZGVmYXVsdElWU2l6ZSA9IG50b2hsKCooKGludDMyX3QqKWJ1ZikpOworCisgICAgICAgICAgICBpZiAoKGRlZmF1bHRBbGdvcml0aG1JZCA9PSAwICYmIGRlZmF1bHRJVlNpemUgIT0gMCkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHRBbGdvcml0aG1JZCAhPSAwICYmIGRlZmF1bHRJVlNpemUgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICAvLyBvbmx5IHVuZW5jcnlwdGVkIGRhdGEgbXVzdCBoYXZlIDAgSVYgc2l6ZQorICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRlZmF1bHRJVlNpemUgIT0gMCAmJgorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0SVZTaXplICE9IDggJiYKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdElWU2l6ZSAhPSAxNikgeworICAgICAgICAgICAgICAgIC8vIG9ubHkgc3VwcG9ydGVkIHNpemVzIGFyZSAwLCA4IGFuZCAxNgorICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQ4X3QgZGVmYXVsdEtleUlkWzE2XTsKKworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQgKyA4LCAmZGVmYXVsdEtleUlkLCAxNikgPCAxNikgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCisgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDcnlwdG9Nb2RlLCBkZWZhdWx0QWxnb3JpdGhtSWQpOworICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSwgZGVmYXVsdElWU2l6ZSk7CisgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoa0tleUNyeXB0b0tleSwgJ3RlbmMnLCBkZWZhdWx0S2V5SWQsIDE2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAnaycsICdoJywgJ2QnKToKKyAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCisgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgICAgICBpZiAoKGVyciA9IHBhcnNlVHJhY2tIZWFkZXIoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSkpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygndCcsICdyJywgJ2UnLCAnZicpOgorICAgICAgICB7CisgICAgICAgICAgICBvZmY2NF90IHN0b3Bfb2Zmc2V0ID0gKm9mZnNldCArIGNodW5rX3NpemU7CisgICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQ7CisgICAgICAgICAgICB3aGlsZSAoKm9mZnNldCA8IHN0b3Bfb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuayhvZmZzZXQsIGRlcHRoICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqb2Zmc2V0ICE9IHN0b3Bfb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAnaCcsICdtJywgJ2InKToKKyAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCisgICAgICAgICAgICBpZiAobUxhc3RUcmFjayAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLy8gU2tpcCB0aHVtYm5haWwgdHJhY2sgZm9yIG5vdyBzaW5jZSB3ZSBkb24ndCBoYXZlIGFuCisgICAgICAgICAgICAgICAgLy8gQVBJIHRvIHJldHJpZXZlIGl0IHlldC4KKyAgICAgICAgICAgICAgICAvLyBUaGUgdGh1bWJuYWlsIHRyYWNrIGNhbid0IGJlIGFjY2Vzc2VkIGJ5IG5lZ2F0aXZlIGluZGV4IG9yIHRpbWUsCisgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBlYWNoIHRpbWVkIHNhbXBsZSBoYXMgaXRzIG93biBjb3JyZXNwb25kaW5nIHRodW1ibmFpbAorICAgICAgICAgICAgICAgIC8vIGluIHRoZSB0aHVtYm5haWwgdHJhY2suIFdlJ2xsIG5lZWQgYSBkZWRpY2F0ZWQgQVBJIHRvIHJldHJpZXZlCisgICAgICAgICAgICAgICAgLy8gdGh1bWJuYWlsIGF0IHRpbWUgaW5zdGVhZC4KKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5za2lwVHJhY2sgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCdwJywgJ3MnLCAncycsICdoJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKworICAgICAgICAgICAgUHNzaEluZm8gcHNzaDsKKworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQgKyA0LCAmcHNzaC51dWlkLCAxNikgPCAxNikgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDMyX3QgcHNzaGRhdGFsZW4gPSAwOworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQgKyAyMCwgJnBzc2hkYXRhbGVuLCA0KSA8IDQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwc3NoLmRhdGFsZW4gPSBudG9obChwc3NoZGF0YWxlbik7CisgICAgICAgICAgICBBTE9HVigicHNzaCBkYXRhIHNpemU6ICVkIiwgcHNzaC5kYXRhbGVuKTsKKyAgICAgICAgICAgIGlmIChjaHVua19zaXplIDwgMjAgfHwgcHNzaC5kYXRhbGVuID4gY2h1bmtfc2l6ZSAtIDIwKSB7CisgICAgICAgICAgICAgICAgLy8gcHNzaCBkYXRhIGxlbmd0aCBleGNlZWRzIHNpemUgb2YgY29udGFpbmluZyBib3gKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwc3NoLmRhdGEgPSBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtwc3NoLmRhdGFsZW5dOworICAgICAgICAgICAgaWYgKHBzc2guZGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJhbGxvY2F0ZWQgcHNzaCBAICVwIiwgcHNzaC5kYXRhKTsKKyAgICAgICAgICAgIHNzaXplX3QgcmVxdWVzdGVkID0gKHNzaXplX3QpIHBzc2guZGF0YWxlbjsKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0ICsgMjQsIHBzc2guZGF0YSwgcmVxdWVzdGVkKSA8IHJlcXVlc3RlZCkgeworICAgICAgICAgICAgICAgIGRlbGV0ZVtdIHBzc2guZGF0YTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUHNzaC5wdXNoX2JhY2socHNzaCk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZCcsICdoJywgJ2QnKToKKyAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCisgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgNCB8fCBtTGFzdFRyYWNrID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50OF90IHZlcnNpb247CisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCAmdmVyc2lvbiwgc2l6ZW9mKHZlcnNpb24pKQorICAgICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZih2ZXJzaW9uKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb2ZmNjRfdCB0aW1lc2NhbGVfb2Zmc2V0OworCisgICAgICAgICAgICBpZiAodmVyc2lvbiA9PSAxKSB7CisgICAgICAgICAgICAgICAgdGltZXNjYWxlX29mZnNldCA9IGRhdGFfb2Zmc2V0ICsgNCArIDE2OworICAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDApIHsKKyAgICAgICAgICAgICAgICB0aW1lc2NhbGVfb2Zmc2V0ID0gZGF0YV9vZmZzZXQgKyA0ICsgODsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MzJfdCB0aW1lc2NhbGU7CisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzY2FsZV9vZmZzZXQsICZ0aW1lc2NhbGUsIHNpemVvZih0aW1lc2NhbGUpKQorICAgICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZih0aW1lc2NhbGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXRpbWVzY2FsZSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJ0aW1lc2NhbGUgc2hvdWxkIG5vdCBiZSBaRVJPLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1MYXN0VHJhY2stPnRpbWVzY2FsZSA9IG50b2hsKHRpbWVzY2FsZSk7CisKKyAgICAgICAgICAgIC8vIDE0NDk2LTEyIHNheXMgYWxsIG9uZXMgbWVhbnMgaW5kZXRlcm1pbmF0ZSwgYnV0IHNvbWUgZmlsZXMgc2VlbSB0byB1c2UKKyAgICAgICAgICAgIC8vIDAgaW5zdGVhZC4gV2UgdHJlYXQgYm90aCB0aGUgc2FtZS4KKyAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb24gPSAwOworICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gMSkgeworICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzY2FsZV9vZmZzZXQgKyA0LCAmZHVyYXRpb24sIHNpemVvZihkdXJhdGlvbikpCisgICAgICAgICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihkdXJhdGlvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBudG9oNjQoZHVyYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZHVyYXRpb24zMjsKKyAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc2NhbGVfb2Zmc2V0ICsgNCwgJmR1cmF0aW9uMzIsIHNpemVvZihkdXJhdGlvbjMyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDwgKHNzaXplX3Qpc2l6ZW9mKGR1cmF0aW9uMzIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGR1cmF0aW9uMzIgIT0gMHhmZmZmZmZmZikgeworICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IG50b2hsKGR1cmF0aW9uMzIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkdXJhdGlvbiAhPSAwICYmIG1MYXN0VHJhY2stPnRpbWVzY2FsZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlEdXJhdGlvbiwgKGR1cmF0aW9uICogMTAwMDAwMCkgLyBtTGFzdFRyYWNrLT50aW1lc2NhbGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50OF90IGxhbmdbMl07CisgICAgICAgICAgICBvZmY2NF90IGxhbmdfb2Zmc2V0OworICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gMSkgeworICAgICAgICAgICAgICAgIGxhbmdfb2Zmc2V0ID0gdGltZXNjYWxlX29mZnNldCArIDQgKyA4OworICAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDApIHsKKyAgICAgICAgICAgICAgICBsYW5nX29mZnNldCA9IHRpbWVzY2FsZV9vZmZzZXQgKyA0ICsgNDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChsYW5nX29mZnNldCwgJmxhbmcsIHNpemVvZihsYW5nKSkKKyAgICAgICAgICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YobGFuZykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRvIGdldCB0aGUgSVNPLTYzOS0yL1QgdGhyZWUgY2hhcmFjdGVyIGxhbmd1YWdlIGNvZGUKKyAgICAgICAgICAgIC8vIDEgYml0IHBhZCBmb2xsb3dlZCBieSAzIDUtYml0cyBjaGFyYWN0ZXJzLiBFYWNoIGNoYXJhY3RlcgorICAgICAgICAgICAgLy8gaXMgcGFja2VkIGFzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gaXRzIEFTQ0lJIHZhbHVlIGFuZCAweDYwLgorICAgICAgICAgICAgY2hhciBsYW5nX2NvZGVbNF07CisgICAgICAgICAgICBsYW5nX2NvZGVbMF0gPSAoKGxhbmdbMF0gPj4gMikgJiAweDFmKSArIDB4NjA7CisgICAgICAgICAgICBsYW5nX2NvZGVbMV0gPSAoKGxhbmdbMF0gJiAweDMpIDw8IDMgfCAobGFuZ1sxXSA+PiA1KSkgKyAweDYwOworICAgICAgICAgICAgbGFuZ19jb2RlWzJdID0gKGxhbmdbMV0gJiAweDFmKSArIDB4NjA7CisgICAgICAgICAgICBsYW5nX2NvZGVbM10gPSAnXDAnOworCisgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIGtLZXlNZWRpYUxhbmd1YWdlLCBsYW5nX2NvZGUpOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAncycsICdkJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgYnVmZmVyWzhdOworICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IChvZmY2NF90KXNpemVvZihidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgYnVmZmVyLCA4KSA8IDgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChVMzJfQVQoYnVmZmVyKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy8gU2hvdWxkIGJlIHZlcnNpb24gMCwgZmxhZ3MgMC4KKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MzJfdCBlbnRyeV9jb3VudCA9IFUzMl9BVCgmYnVmZmVyWzRdKTsKKworICAgICAgICAgICAgaWYgKGVudHJ5X2NvdW50ID4gMSkgeworICAgICAgICAgICAgICAgIC8vIEZvciAzR1BQIHRpbWVkIHRleHQsIHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIHR4M2cgYm94ZXMgY29udGFpbgorICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIHRleHQgZGlzcGxheSBmb3JtYXRzLiBUaGVzZSBmb3JtYXRzIHdpbGwgYmUgdXNlZCB0bworICAgICAgICAgICAgICAgIC8vIGRpc3BsYXkgdGhlIHRpbWVkIHRleHQuCisgICAgICAgICAgICAgICAgLy8gRm9yIGVuY3J5cHRlZCBmaWxlcywgdGhlcmUgbWF5IGFsc28gYmUgbW9yZSB0aGFuIG9uZSBlbnRyeS4KKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOworCisgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKworICAgICAgICAgICAgICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICAgICAgICAgIGlmIChzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNhc2VjbXAobWltZSwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZvciBub3cgd2Ugb25seSBzdXBwb3J0IGEgc2luZ2xlIHR5cGUgb2YgbWVkaWEgcGVyIHRyYWNrLgorICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5za2lwVHJhY2sgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9mZjY0X3Qgc3RvcF9vZmZzZXQgPSAqb2Zmc2V0ICsgY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldCArIDg7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZW50cnlfY291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsob2Zmc2V0LCBkZXB0aCArIDEpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgqb2Zmc2V0ICE9IHN0b3Bfb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2UnLCAndCcsICd0Jyk6CisgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKworICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCisgICAgICAgICAgICBhdXRvIGJ1ZmZlciA9IGhlYXBidWZmZXI8dWludDhfdD4oY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGJ1ZmZlci5nZXQoKSwgY2h1bmtfZGF0YV9zaXplKSA8IGNodW5rX2RhdGFfc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nOCBtaW1lRm9ybWF0KChjb25zdCBjaGFyICopKGJ1ZmZlci5nZXQoKSksIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtaW1lRm9ybWF0LnN0cmluZygpKTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygnbScsICdwJywgJzQnLCAnYScpOgorICAgICAgICBjYXNlIEZPVVJDQygnZScsICduJywgJ2MnLCAnYScpOgorICAgICAgICBjYXNlIEZPVVJDQygncycsICdhJywgJ20nLCAncicpOgorICAgICAgICBjYXNlIEZPVVJDQygncycsICdhJywgJ3cnLCAnYicpOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAobUlzUVQgJiYgY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ2EnKQorICAgICAgICAgICAgICAgICAgICAmJiBkZXB0aCA+PSAxICYmIG1QYXRoW2RlcHRoIC0gMV0gPT0gRk9VUkNDKCd3JywgJ2EnLCAndicsICdlJykpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUgbXA0YSBlbWJlZGRlZCBpbiBRVCB3YXZlIGF0b20KKyAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQ4X3QgYnVmZmVyWzggKyAyMF07CisgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgKHNzaXplX3Qpc2l6ZW9mKGJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICAvLyBCYXNpYyBBdWRpb1NhbXBsZUVudHJ5IHNpemUuCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSkgPCAoc3NpemVfdClzaXplb2YoYnVmZmVyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDE2X3QgZGF0YV9yZWZfaW5kZXggX191bnVzZWQgPSBVMTZfQVQoJmJ1ZmZlcls2XSk7CisgICAgICAgICAgICB1aW50MTZfdCB2ZXJzaW9uID0gVTE2X0FUKCZidWZmZXJbOF0pOworICAgICAgICAgICAgdWludDMyX3QgbnVtX2NoYW5uZWxzID0gVTE2X0FUKCZidWZmZXJbMTZdKTsKKworICAgICAgICAgICAgdWludDE2X3Qgc2FtcGxlX3NpemUgPSBVMTZfQVQoJmJ1ZmZlclsxOF0pOworICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlX3JhdGUgPSBVMzJfQVQoJmJ1ZmZlclsyNF0pID4+IDE2OworCisgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKKyAgICAgICAgICAgIG9mZjY0X3Qgc3RvcF9vZmZzZXQgPSAqb2Zmc2V0ICsgY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldCArIHNpemVvZihidWZmZXIpOworCisgICAgICAgICAgICBpZiAobUlzUVQgJiYgY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ2EnKSkgeworICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgYnVmZmVyLCAxNikgPCAxNikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgICAgICAgICB9CisKKyNpZiAwCisgICAgICAgICAgICAgICAgICAgIFUzMl9BVChidWZmZXIpOyAgLy8gc2FtcGxlcyBwZXIgcGFja2V0CisgICAgICAgICAgICAgICAgICAgIFUzMl9BVCgmYnVmZmVyWzRdKTsgIC8vIGJ5dGVzIHBlciBwYWNrZXQKKyAgICAgICAgICAgICAgICAgICAgVTMyX0FUKCZidWZmZXJbOF0pOyAgLy8gYnl0ZXMgcGVyIGZyYW1lCisgICAgICAgICAgICAgICAgICAgIFUzMl9BVCgmYnVmZmVyWzEyXSk7ICAvLyBieXRlcyBwZXIgc2FtcGxlCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgKm9mZnNldCArPSAxNjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb24gPT0gMikgeworICAgICAgICAgICAgICAgICAgICB1aW50OF90IHYyYnVmZmVyWzM2XTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgdjJidWZmZXIsIDM2KSA8IDM2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICAgICAgICAgIH0KKworI2lmIDAKKyAgICAgICAgICAgICAgICAgICAgVTMyX0FUKHYyYnVmZmVyKTsgIC8vIHNpemUgb2Ygc3RydWN0IG9ubHkKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3JhdGUgPSAodWludDMyX3QpVTY0X0FUKCZ2MmJ1ZmZlcls0XSk7ICAvLyBhdWRpbyBzYW1wbGUgcmF0ZQorICAgICAgICAgICAgICAgICAgICBudW1fY2hhbm5lbHMgPSBVMzJfQVQoJnYyYnVmZmVyWzEyXSk7ICAvLyBudW0gYXVkaW8gY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgVTMyX0FUKCZ2MmJ1ZmZlclsxNl0pOyAgLy8gYWx3YXlzIDB4N2YwMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3NpemUgPSAodWludDE2X3QpVTMyX0FUKCZ2MmJ1ZmZlclsyMF0pOyAgLy8gY29uc3QgYml0cyBwZXIgY2hhbm5lbAorICAgICAgICAgICAgICAgICAgICBVMzJfQVQoJnYyYnVmZmVyWzI0XSk7ICAvLyBmb3JtYXQgc3BlY2lmYyBmbGFncworICAgICAgICAgICAgICAgICAgICBVMzJfQVQoJnYyYnVmZmVyWzI4XSk7ICAvLyBjb25zdCBieXRlcyBwZXIgYXVkaW8gcGFja2V0CisgICAgICAgICAgICAgICAgICAgIFUzMl9BVCgmdjJidWZmZXJbMzJdKTsgIC8vIGNvbnN0IExQQ00gZnJhbWVzIHBlciBhdWRpbyBwYWNrZXQKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IDM2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgIT0gRk9VUkNDKCdlJywgJ24nLCAnYycsICdhJykpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY2h1bmsgdHlwZSBpcyBlbmNhLCB3ZSdsbCBnZXQgdGhlIHR5cGUgZnJvbSB0aGUgZnJtYSBib3ggbGF0ZXIKKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBGb3VyQ0MyTUlNRShjaHVua190eXBlKSk7CisgICAgICAgICAgICAgICAgQWRqdXN0Q2hhbm5lbHNBbmRSYXRlKGNodW5rX3R5cGUsICZudW1fY2hhbm5lbHMsICZzYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiKioqIGNvZGluZz0nJXMnICVkIGNoYW5uZWxzLCBzaXplICVkLCByYXRlICVkXG4iLAorICAgICAgICAgICAgICAgICAgIGNodW5rLCBudW1fY2hhbm5lbHMsIHNhbXBsZV9zaXplLCBzYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bV9jaGFubmVscyk7CisgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVfcmF0ZSk7CisKKyAgICAgICAgICAgIHdoaWxlICgqb2Zmc2V0IDwgc3RvcF9vZmZzZXQpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rKG9mZnNldCwgZGVwdGggKyAxKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKm9mZnNldCAhPSBzdG9wX29mZnNldCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICd2Jyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdlJywgJ24nLCAnYycsICd2Jyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJzInLCAnNicsICczJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdIJywgJzInLCAnNicsICczJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJzInLCAnNicsICczJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ3YnLCAnYycsICcxJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ3YnLCAnYycsICcxJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ2UnLCAndicsICcxJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgYnVmZmVyWzc4XTsKKyAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAoc3NpemVfdClzaXplb2YoYnVmZmVyKSkgeworICAgICAgICAgICAgICAgIC8vIEJhc2ljIFZpZGVvU2FtcGxlRW50cnkgc2l6ZS4KKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXIsIHNpemVvZihidWZmZXIpKSA8IChzc2l6ZV90KXNpemVvZihidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MTZfdCBkYXRhX3JlZl9pbmRleCBfX3VudXNlZCA9IFUxNl9BVCgmYnVmZmVyWzZdKTsKKyAgICAgICAgICAgIHVpbnQxNl90IHdpZHRoID0gVTE2X0FUKCZidWZmZXJbNiArIDE4XSk7CisgICAgICAgICAgICB1aW50MTZfdCBoZWlnaHQgPSBVMTZfQVQoJmJ1ZmZlcls2ICsgMjBdKTsKKworICAgICAgICAgICAgLy8gVGhlIHZpZGVvIHNhbXBsZSBpcyBub3Qgc3RhbmRhcmQtY29tcGxpYW50IGlmIGl0IGhhcyBpbnZhbGlkIGRpbWVuc2lvbi4KKyAgICAgICAgICAgIC8vIFVzZSBzb21lIGRlZmF1bHQgd2lkdGggYW5kIGhlaWdodCB2YWx1ZSwgYW5kCisgICAgICAgICAgICAvLyBsZXQgdGhlIGRlY29kZXIgZmlndXJlIG91dCB0aGUgYWN0dWFsIHdpZHRoIGFuZCBoZWlnaHQgKGFuZCB0aHVzCisgICAgICAgICAgICAvLyBiZSBwcmVwYXJlZCBmb3IgSU5GT19GT01SQVRfQ0hBTkdFRCBldmVudCkuCisgICAgICAgICAgICBpZiAod2lkdGggPT0gMCkgIHdpZHRoICA9IDM1MjsKKyAgICAgICAgICAgIGlmIChoZWlnaHQgPT0gMCkgaGVpZ2h0ID0gMjg4OworCisgICAgICAgICAgICAvLyBwcmludGYoIioqKiBjb2Rpbmc9JyVzJyB3aWR0aD0lZCBoZWlnaHQ9JWRcbiIsCisgICAgICAgICAgICAvLyAgICAgICAgY2h1bmssIHdpZHRoLCBoZWlnaHQpOworCisgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKKyAgICAgICAgICAgIGlmIChjaHVua190eXBlICE9IEZPVVJDQygnZScsICduJywgJ2MnLCAndicpKSB7CisgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNodW5rIHR5cGUgaXMgZW5jdiwgd2UnbGwgZ2V0IHRoZSB0eXBlIGZyb20gdGhlIGZybWEgYm94IGxhdGVyCisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKKyAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKKworICAgICAgICAgICAgb2ZmNjRfdCBzdG9wX29mZnNldCA9ICpvZmZzZXQgKyBjaHVua19zaXplOworICAgICAgICAgICAgKm9mZnNldCA9IGRhdGFfb2Zmc2V0ICsgc2l6ZW9mKGJ1ZmZlcik7CisgICAgICAgICAgICB3aGlsZSAoKm9mZnNldCA8IHN0b3Bfb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuayhvZmZzZXQsIGRlcHRoICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCpvZmZzZXQgIT0gc3RvcF9vZmZzZXQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ2MnLCAnbycpOgorICAgICAgICBjYXNlIEZPVVJDQygnYycsICdvJywgJzYnLCAnNCcpOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKG1MYXN0VHJhY2sgPT0gTlVMTCkgfHwgKG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0KKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+c2V0Q2h1bmtPZmZzZXRQYXJhbXMoCisgICAgICAgICAgICAgICAgICAgICAgICBjaHVua190eXBlLCBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKKworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3MnLCAnYycpOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKG1MYXN0VHJhY2sgPT0gTlVMTCkgfHwgKG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9CisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPnNldFNhbXBsZVRvQ2h1bmtQYXJhbXMoCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKKworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3MnLCAneicpOgorICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3onLCAnMicpOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKG1MYXN0VHJhY2sgPT0gTlVMTCkgfHwgKG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0KKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+c2V0U2FtcGxlU2l6ZVBhcmFtcygKKyAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX3R5cGUsIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOworCisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaXplX3QgbWF4X3NpemU7CisgICAgICAgICAgICBlcnIgPSBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+Z2V0TWF4U2FtcGxlU2l6ZSgmbWF4X3NpemUpOworCisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1heF9zaXplICE9IDApIHsKKyAgICAgICAgICAgICAgICAvLyBBc3N1bWUgdGhhdCBhIGdpdmVuIGJ1ZmZlciBvbmx5IGNvbnRhaW5zIGF0IG1vc3QgMTAgY2h1bmtzLAorICAgICAgICAgICAgICAgIC8vIGVhY2ggY2h1bmsgb3JpZ2luYWxseSBwcmVmaXhlZCB3aXRoIGEgMiBieXRlIGxlbmd0aCB3aWxsCisgICAgICAgICAgICAgICAgLy8gaGF2ZSBhIDQgYnl0ZSBoZWFkZXIgKDB4MDAgMHgwMCAweDAwIDB4MDEpIGFmdGVyIGNvbnZlcnNpb24sCisgICAgICAgICAgICAgICAgLy8gYW5kIHRodXMgd2lsbCBncm93IGJ5IDIgYnl0ZXMgcGVyIGNodW5rLgorICAgICAgICAgICAgICAgIGlmIChtYXhfc2l6ZSA+IFNJWkVfTUFYIC0gMTAgKiAyKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJtYXggc2FtcGxlIHNpemUgdG9vIGJpZzogJXp1IiwgbWF4X3NpemUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIG1heF9zaXplICsgMTAgKiAyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gTm8gc2l6ZSB3YXMgc3BlY2lmaWVkLiBQaWNrIGEgY29uc2VydmF0aXZlbHkgbGFyZ2Ugc2l6ZS4KKyAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgICAgICAgICAgICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleVdpZHRoLCAoaW50MzJfdCopJndpZHRoKSB8fAorICAgICAgICAgICAgICAgICAgICAhbUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleUhlaWdodCwoaW50MzJfdCopICZoZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJObyB3aWR0aCBvciBoZWlnaHQsIGFzc3VtaW5nIHdvcnN0IGNhc2UgMTA4MHAiKTsKKyAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAxOTIwOworICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSAxMDgwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEEgcmVzb2x1dGlvbiB3YXMgc3BlY2lmaWVkLCBjaGVjayB0aGF0IGl0J3Mgbm90IHRvbyBiaWcuIFRoZSB2YWx1ZXMgYmVsb3cKKyAgICAgICAgICAgICAgICAgICAgLy8gd2VyZSBjaG9zZW4gc28gdGhhdCB0aGUgY2FsY3VsYXRpb25zIGJlbG93IGRvbid0IGNhdXNlIG92ZXJmbG93cywgdGhleSdyZQorICAgICAgICAgICAgICAgICAgICAvLyBub3QgaW5kaWNhdGluZyB0aGF0IHJlc29sdXRpb25zIHVwIHRvIDMya3gzMmsgYXJlIGFjdHVhbGx5IHN1cHBvcnRlZC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKHdpZHRoID4gMzI3NjggfHwgaGVpZ2h0ID4gMzI3NjgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjYW4ndCBzdXBwb3J0ICV1IHggJXUgdmlkZW8iLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICAgICAgICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICAgICAgICAgIGlmICghc3RyY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQykpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQVZDICYgSEVWQyByZXF1aXJlcyBjb21wcmVzc2lvbiByYXRpbyBvZiBhdCBsZWFzdCAyLCBhbmQgdXNlcworICAgICAgICAgICAgICAgICAgICAvLyBtYWNyb2Jsb2NrcworICAgICAgICAgICAgICAgICAgICBtYXhfc2l6ZSA9ICgod2lkdGggKyAxNSkgLyAxNikgKiAoKGhlaWdodCArIDE1KSAvIDE2KSAqIDE5MjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBGb3IgYWxsIG90aGVyIGZvcm1hdHMgdGhlcmUgaXMgbm8gbWluaW11bSBjb21wcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAvLyByYXRpby4gVXNlIGNvbXByZXNzaW9uIHJhdGlvIG9mIDEuCisgICAgICAgICAgICAgICAgICAgIG1heF9zaXplID0gd2lkdGggKiBoZWlnaHQgKiAzIC8gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gSEFDSzogYWxsb3cgMTAlIG92ZXJoZWFkCisgICAgICAgICAgICAgICAgLy8gVE9ETzogcmVhZCBzYW1wbGUgc2l6ZSBmcm9tIHRyYWYgYXRvbSBmb3IgZnJhZ21lbnRlZCBNUEVHNC4KKyAgICAgICAgICAgICAgICBtYXhfc2l6ZSArPSBtYXhfc2l6ZSAvIDEwOworICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgbWF4X3NpemUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBOT1RFOiBzZXR0aW5nIGFub3RoZXIgcGllY2Ugb2YgbWV0YWRhdGEgaW52YWxpZGF0ZXMgYW55IHBvaW50ZXJzIChzdWNoIGFzIHRoZQorICAgICAgICAgICAgLy8gbWltZXR5cGUpIHByZXZpb3VzbHkgb2J0YWluZWQsIHNvIGRvbid0IGNhY2hlIHRoZW0uCisgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICAgICAgQ0hFQ0sobUxhc3RUcmFjay0+bWV0YS5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisgICAgICAgICAgICAvLyBDYWxjdWxhdGUgYXZlcmFnZSBmcmFtZSByYXRlLgorICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikpIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgblNhbXBsZXMgPSBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+Y291bnRTYW1wbGVzKCk7CisgICAgICAgICAgICAgICAgaWYgKG5TYW1wbGVzID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0cmFja0lkOworICAgICAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleVRyYWNrSUQsICZ0cmFja0lkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJleC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyZXggKnQgPSAmbVRyZXguZWRpdEl0ZW1BdChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC0+dHJhY2tfSUQgPT0gKHVpbnQzMl90KSB0cmFja0lkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LT5kZWZhdWx0X3NhbXBsZV9kdXJhdGlvbiA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVSYXRlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+dGltZXNjYWxlIC8gdC0+ZGVmYXVsdF9zYW1wbGVfZHVyYXRpb247CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlGcmFtZVJhdGUsIGZyYW1lUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgICAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjay0+bWV0YS5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkdXJhdGlvblVzID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVSYXRlID0gKG5TYW1wbGVzICogMTAwMDAwMExMICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZHVyYXRpb25VcyA+PiAxKSkgLyBkdXJhdGlvblVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUZyYW1lUmF0ZSwgZnJhbWVSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBBTE9HVigic2V0dGluZyBmcmFtZSBjb3VudCAlenUiLCBuU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUZyYW1lQ291bnQsIG5TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAndCcsICd0JywgJ3MnKToKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChtTGFzdFRyYWNrID09IE5VTEwpIHx8IChtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9CisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPnNldFRpbWVUb1NhbXBsZVBhcmFtcygKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOworCisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygnYycsICd0JywgJ3QnLCAncycpOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKG1MYXN0VHJhY2sgPT0gTlVMTCkgfHwgKG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0KKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+c2V0Q29tcG9zaXRpb25UaW1lVG9TYW1wbGVQYXJhbXMoCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKKworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAndCcsICdzJywgJ3MnKToKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChtTGFzdFRyYWNrID09IE5VTEwpIHx8IChtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9CisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPnNldFN5bmNTYW1wbGVQYXJhbXMoCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKKworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gXHhBOXh5egorICAgICAgICBjYXNlIEZPVVJDQygweEE5LCAneCcsICd5JywgJ3onKToKKyAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCisgICAgICAgICAgICAvLyBCZXN0IGNhc2UgdGhlIHRvdGFsIGRhdGEgbGVuZ3RoIGluc2lkZSAiXHhBOXh5eiIgYm94IHdvdWxkCisgICAgICAgICAgICAvLyBiZSA5LCBmb3IgaW5zdGFuY2UgIlx4QTl4eXoiICsgIlx4MDBceDA1XHgxNVx4YzciICsgIiswKzAvIiwKKyAgICAgICAgICAgIC8vIHdoZXJlICJceDAwXHgwNSIgaXMgdGhlIHRleHQgc3RyaW5nIGxlbmd0aCB3aXRoIHZhbHVlID0gNSwKKyAgICAgICAgICAgIC8vICJcMHgxNVx4YzciIGlzIHRoZSBsYW5ndWFnZSBjb2RlID0gZW4sIGFuZCAiKzArMC8iIGlzIGEKKyAgICAgICAgICAgIC8vIGxvY2F0aW9uIChzdHJpbmcpIHZhbHVlIHdpdGggbG9uZ2l0dWRlID0gMCBhbmQgbGF0aXR1ZGUgPSAwLgorICAgICAgICAgICAgLy8gU2luY2Ugc29tZSBkZXZpY2VzIGVuY291bnRlcmVkIGluIHRoZSB3aWxkIG9taXQgdGhlIHRyYWlsaW5nCisgICAgICAgICAgICAvLyBzbGFzaCwgd2UnbGwgYWxsb3cgdGhhdC4KKyAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCA4KSB7IC8vIDggaW5zdGVhZCBvZiA5IHRvIGFsbG93IGZvciBtaXNzaW5nIC8KKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MTZfdCBsZW47CisgICAgICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MTYoZGF0YV9vZmZzZXQsICZsZW4pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBhbGxvdyAiKzArMCIgd2l0aG91dCB0cmFpbGluZyBzbGFzaAorICAgICAgICAgICAgaWYgKGxlbiA8IDQgfHwgbGVuID4gY2h1bmtfZGF0YV9zaXplIC0gNCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUaGUgbG9jYXRpb24gc3RyaW5nIGZvbGxvd2luZyB0aGUgbGFuZ3VhZ2UgY29kZSBpcyBmb3JtYXR0ZWQKKyAgICAgICAgICAgIC8vIGFjY29yZGluZyB0byBJU08gNjcwOToyMDA4IChodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fNjcwOSkuCisgICAgICAgICAgICAvLyBBbGxvY2F0ZSAyIGV4dHJhIGJ5dGVzLCBpbiBjYXNlIHdlIG5lZWQgdG8gYWRkIGEgdHJhaWxpbmcgc2xhc2gsCisgICAgICAgICAgICAvLyBhbmQgdG8gYWRkIGEgdGVybWluYXRpbmcgMC4KKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxjaGFyW10+IGJ1ZmZlcihuZXcgKHN0ZDo6bm90aHJvdykgY2hhcltsZW4rMl0oKSk7CisgICAgICAgICAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQgKyA0LCAmYnVmZmVyWzBdLCBsZW4pIDwgbGVuKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsZW4gPSBzdHJsZW4oJmJ1ZmZlclswXSk7CisgICAgICAgICAgICBpZiAobGVuIDwgNCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBBZGQgYSB0cmFpbGluZyBzbGFzaCBpZiB0aGVyZSB3YXNuJ3Qgb25lLgorICAgICAgICAgICAgaWYgKGJ1ZmZlcltsZW4gLSAxXSAhPSAnLycpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJbbGVuXSA9ICcvJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5TG9jYXRpb24sICZidWZmZXJbMF0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygnZScsICdzJywgJ2QnLCAncycpOgorICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKKyAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCA0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDhfdCBidWZmZXJbMjU2XTsKKyAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPiAob2ZmNjRfdClzaXplb2YoYnVmZmVyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9CVUZGRVJfVE9PX1NNQUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXIsIGNodW5rX2RhdGFfc2l6ZSkgPCBjaHVua19kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChVMzJfQVQoYnVmZmVyKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy8gU2hvdWxkIGJlIHZlcnNpb24gMCwgZmxhZ3MgMC4KKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKKyAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YSgKKyAgICAgICAgICAgICAgICAgICAga0tleUVTRFMsIGtUeXBlRVNEUywgJmJ1ZmZlcls0XSwgY2h1bmtfZGF0YV9zaXplIC0gNCk7CisKKyAgICAgICAgICAgIGlmIChtUGF0aC5zaXplKCkgPj0gMgorICAgICAgICAgICAgICAgICAgICAmJiBtUGF0aFttUGF0aC5zaXplKCkgLSAyXSA9PSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ2EnKSkgeworICAgICAgICAgICAgICAgIC8vIEluZm9ybWF0aW9uIGZyb20gdGhlIEVTRFMgbXVzdCBiZSByZWxpZWQgb24gZm9yIHByb3BlcgorICAgICAgICAgICAgICAgIC8vIHNldHVwIG9mIHNhbXBsZSByYXRlIGFuZCBjaGFubmVsIGNvdW50IGZvciBNUEVHNCBBdWRpby4KKyAgICAgICAgICAgICAgICAvLyBUaGUgZ2VuZXJpYyBoZWFkZXIgYXBwZWFycyB0byBvbmx5IGNvbnRhaW4gZ2VuZXJpYworICAgICAgICAgICAgICAgIC8vIGluZm9ybWF0aW9uLi4uCisKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSB1cGRhdGVBdWRpb1RyYWNrSW5mb0Zyb21FU0RTX01QRUc0QXVkaW8oCisgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyWzRdLCBjaHVua19kYXRhX3NpemUgLSA0KTsKKworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVBhdGguc2l6ZSgpID49IDIKKyAgICAgICAgICAgICAgICAgICAgJiYgbVBhdGhbbVBhdGguc2l6ZSgpIC0gMl0gPT0gRk9VUkNDKCdtJywgJ3AnLCAnNCcsICd2JykpIHsKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmlkZW8gaXMgTVBFRzIKKyAgICAgICAgICAgICAgICBFU0RTIGVzZHMoJmJ1ZmZlcls0XSwgY2h1bmtfZGF0YV9zaXplIC0gNCk7CisKKyAgICAgICAgICAgICAgICB1aW50OF90IG9iamVjdFR5cGVJbmRpY2F0aW9uOworICAgICAgICAgICAgICAgIGlmIChlc2RzLmdldE9iamVjdFR5cGVJbmRpY2F0aW9uKCZvYmplY3RUeXBlSW5kaWNhdGlvbikgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdFR5cGVJbmRpY2F0aW9uID49IDB4NjAgJiYgb2JqZWN0VHlwZUluZGljYXRpb24gPD0gMHg2NSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygnYicsICd0JywgJ3InLCAndCcpOgorICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDhfdCBidWZmZXJbMTJdOworICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSAhPSBzaXplb2YoYnVmZmVyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgYnVmZmVyLCBjaHVua19kYXRhX3NpemUpIDwgY2h1bmtfZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MzJfdCBtYXhCaXRyYXRlID0gVTMyX0FUKCZidWZmZXJbNF0pOworICAgICAgICAgICAgdWludDMyX3QgYXZnQml0cmF0ZSA9IFUzMl9BVCgmYnVmZmVyWzhdKTsKKyAgICAgICAgICAgIGlmIChtYXhCaXRyYXRlID4gMCAmJiBtYXhCaXRyYXRlIDwgSU5UMzJfTUFYKSB7CisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5TWF4Qml0UmF0ZSwgKGludDMyX3QpbWF4Qml0cmF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXZnQml0cmF0ZSA+IDAgJiYgYXZnQml0cmF0ZSA8IElOVDMyX01BWCkgeworICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUJpdFJhdGUsIChpbnQzMl90KWF2Z0JpdHJhdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygnYScsICd2JywgJ2MnLCAnQycpOgorICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKKyAgICAgICAgICAgIGF1dG8gYnVmZmVyID0gaGVhcGJ1ZmZlcjx1aW50OF90PihjaHVua19kYXRhX3NpemUpOworCisgICAgICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYi8yODQ3MTIwNiIpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGJ1ZmZlci5nZXQoKSwgY2h1bmtfZGF0YV9zaXplKSA8IGNodW5rX2RhdGFfc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCisgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoCisgICAgICAgICAgICAgICAgICAgIGtLZXlBVkNDLCBrVHlwZUFWQ0MsIGJ1ZmZlci5nZXQoKSwgY2h1bmtfZGF0YV9zaXplKTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAndicsICdjJywgJ0MnKToKKyAgICAgICAgeworICAgICAgICAgICAgYXV0byBidWZmZXIgPSBoZWFwYnVmZmVyPHVpbnQ4X3Q+KGNodW5rX2RhdGFfc2l6ZSk7CisKKyAgICAgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJiLzI4NDcxMjA2Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgYnVmZmVyLmdldCgpLCBjaHVua19kYXRhX3NpemUpIDwgY2h1bmtfZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKKyAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YSgKKyAgICAgICAgICAgICAgICAgICAga0tleUhWQ0MsIGtUeXBlSFZDQywgYnVmZmVyLmdldCgpLCBjaHVua19kYXRhX3NpemUpOworCisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJzInLCAnNicsICczJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBkMjYzIGNvbnRhaW5zIGEgZml4ZWQgNyBieXRlcyBwYXJ0OgorICAgICAgICAgICAgICogICB2ZW5kb3IgLSA0IGJ5dGVzCisgICAgICAgICAgICAgKiAgIHZlcnNpb24gLSAxIGJ5dGUKKyAgICAgICAgICAgICAqICAgbGV2ZWwgLSAxIGJ5dGUKKyAgICAgICAgICAgICAqICAgcHJvZmlsZSAtIDEgYnl0ZQorICAgICAgICAgICAgICogb3B0aW9uYWxseSwgImQyNjMiIGJveCBpdHNlbGYgbWF5IGNvbnRhaW4gYSAxNi1ieXRlCisgICAgICAgICAgICAgKiBiaXQgcmF0ZSBib3ggKGJpdHIpCisgICAgICAgICAgICAgKiAgIGF2ZXJhZ2UgYml0IHJhdGUgLSA0IGJ5dGVzCisgICAgICAgICAgICAgKiAgIG1heCBiaXQgcmF0ZSAtIDQgYnl0ZXMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgY2hhciBidWZmZXJbMjNdOworICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSAhPSA3ICYmCisgICAgICAgICAgICAgICAgY2h1bmtfZGF0YV9zaXplICE9IDIzKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkluY29ycmVjdCBEMjYzIGJveCBzaXplICVsbGQiLCAobG9uZyBsb25nKWNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXIsIGNodW5rX2RhdGFfc2l6ZSkgPCBjaHVua19kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKworICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKGtLZXlEMjYzLCBrVHlwZUQyNjMsIGJ1ZmZlciwgY2h1bmtfZGF0YV9zaXplKTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygnbScsICdlJywgJ3QnLCAnYScpOgorICAgICAgICB7CisgICAgICAgICAgICBvZmY2NF90IHN0b3Bfb2Zmc2V0ID0gKm9mZnNldCArIGNodW5rX3NpemU7CisgICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQ7CisgICAgICAgICAgICBib29sIGlzUGFyc2luZ01ldGFLZXlzID0gdW5kZXJRVE1ldGFQYXRoKG1QYXRoLCAyKTsKKyAgICAgICAgICAgIGlmICghaXNQYXJzaW5nTWV0YUtleXMpIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGJ1ZmZlcls0XTsKKyAgICAgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgKG9mZjY0X3Qpc2l6ZW9mKGJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgKm9mZnNldCA9IHN0b3Bfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXIsIDQpIDwgNCkgeworICAgICAgICAgICAgICAgICAgICAqb2Zmc2V0ID0gc3RvcF9vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoVTMyX0FUKGJ1ZmZlcikgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgYmUgdmVyc2lvbiAwLCBmbGFncyAwLgorCisgICAgICAgICAgICAgICAgICAgIC8vIElmIGl0J3Mgbm90LCBsZXQncyBhc3N1bWUgdGhpcyBpcyBvbmUgb2YgdGhvc2UKKyAgICAgICAgICAgICAgICAgICAgLy8gYXBwYXJlbnRseSBtYWxmb3JtZWQgY2h1bmtzIHRoYXQgZG9uJ3QgaGF2ZSBmbGFncworICAgICAgICAgICAgICAgICAgICAvLyBhbmQgY29tcGxldGVseSBkaWZmZXJlbnQgc2VtYW50aWNzIHRoYW4gd2hhdCdzCisgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBNUEVHNCBzcGVjcyBhbmQgc2tpcCBpdC4KKyAgICAgICAgICAgICAgICAgICAgKm9mZnNldCA9IHN0b3Bfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpvZmZzZXQgKz0gIHNpemVvZihidWZmZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAoKm9mZnNldCA8IHN0b3Bfb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuayhvZmZzZXQsIGRlcHRoICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCpvZmZzZXQgIT0gc3RvcF9vZmZzZXQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygnaScsICdsJywgJ28nLCAnYycpOgorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdpJywgJ24nLCAnZicpOgorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdwJywgJ3InLCAncCcpOgorICAgICAgICBjYXNlIEZPVVJDQygncCcsICdpJywgJ3QnLCAnbScpOgorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdkJywgJ2EnLCAndCcpOgorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdyJywgJ2UnLCAnZicpOgorICAgICAgICBjYXNlIEZPVVJDQygnaScsICdwJywgJ3InLCAnbycpOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAobUlzSGVpZikgeworICAgICAgICAgICAgICAgIGlmIChtSXRlbVRhYmxlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUl0ZW1UYWJsZSA9IG5ldyBJdGVtVGFibGUobURhdGFTb3VyY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtSXRlbVRhYmxlLT5wYXJzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX3R5cGUsIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2UnLCAnYScsICduJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCduJywgJ2EnLCAnbScsICdlJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJ2EnLCAndCcsICdhJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKworICAgICAgICAgICAgaWYgKG1QYXRoLnNpemUoKSA9PSA2ICYmIHVuZGVyTWV0YURhdGFQYXRoKG1QYXRoKSkgeworICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlSVR1bmVzTWV0YURhdGEoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ3YnLCAnaCcsICdkJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKworICAgICAgICAgICAgaWYgKGRlcHRoICE9IDEpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgibXZoZDogZGVwdGggJWQiLCBkZXB0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAzMikgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQ4X3QgaGVhZGVyWzMyXTsKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpCisgICAgICAgICAgICAgICAgICAgIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQ2NF90IGNyZWF0aW9uVGltZTsKKyAgICAgICAgICAgIHVpbnQ2NF90IGR1cmF0aW9uID0gMDsKKyAgICAgICAgICAgIGlmIChoZWFkZXJbMF0gPT0gMSkgeworICAgICAgICAgICAgICAgIGNyZWF0aW9uVGltZSA9IFU2NF9BVCgmaGVhZGVyWzRdKTsKKyAgICAgICAgICAgICAgICBtSGVhZGVyVGltZXNjYWxlID0gVTMyX0FUKCZoZWFkZXJbMjBdKTsKKyAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IFU2NF9BVCgmaGVhZGVyWzI0XSk7CisgICAgICAgICAgICAgICAgaWYgKGR1cmF0aW9uID09IDB4ZmZmZmZmZmZmZmZmZmZmZikgeworICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChoZWFkZXJbMF0gIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNyZWF0aW9uVGltZSA9IFUzMl9BVCgmaGVhZGVyWzRdKTsKKyAgICAgICAgICAgICAgICBtSGVhZGVyVGltZXNjYWxlID0gVTMyX0FUKCZoZWFkZXJbMTJdKTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBkMzIgPSBVMzJfQVQoJmhlYWRlclsxNl0pOworICAgICAgICAgICAgICAgIGlmIChkMzIgPT0gMHhmZmZmZmZmZikgeworICAgICAgICAgICAgICAgICAgICBkMzIgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IGQzMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkdXJhdGlvbiAhPSAwICYmIG1IZWFkZXJUaW1lc2NhbGUgIT0gMCAmJiBkdXJhdGlvbiA8IFVJTlQ2NF9NQVggLyAxMDAwMDAwKSB7CisgICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uICogMTAwMDAwMCAvIG1IZWFkZXJUaW1lc2NhbGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmc4IHM7CisgICAgICAgICAgICBpZiAoY29udmVydFRpbWVUb0RhdGUoY3JlYXRpb25UaW1lLCAmcykpIHsKKyAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleURhdGUsIHMuc3RyaW5nKCkpOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZScsICdoJywgJ2QnKToKKyAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCisgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgOCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQ4X3QgZmxhZ3NbNF07CisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBmbGFncywgc2l6ZW9mKGZsYWdzKSkKKyAgICAgICAgICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YoZmxhZ3MpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50NjRfdCBkdXJhdGlvbiA9IDA7CisgICAgICAgICAgICBpZiAoZmxhZ3NbMF0gPT0gMSkgeworICAgICAgICAgICAgICAgIC8vIDY0IGJpdAorICAgICAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAxMikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZS0+Z2V0VUludDY0KGRhdGFfb2Zmc2V0ICsgNCwgJmR1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb24gPT0gMHhmZmZmZmZmZmZmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZsYWdzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyAzMiBiaXQKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBkMzI7CisgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UtPmdldFVJbnQzMihkYXRhX29mZnNldCArIDQsICZkMzIpOworICAgICAgICAgICAgICAgIGlmIChkMzIgPT0gMHhmZmZmZmZmZikgeworICAgICAgICAgICAgICAgICAgICBkMzIgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IGQzMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGR1cmF0aW9uICE9IDAgJiYgbUhlYWRlclRpbWVzY2FsZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uICogMTAwMDAwMCAvIG1IZWFkZXJUaW1lc2NhbGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2QnLCAnYScsICd0Jyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1NZGF0Rm91bmQgPSB0cnVlOworCisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ2QnLCAnbCcsICdyJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKworICAgICAgICAgICAgaWYgKHVuZGVyUVRNZXRhUGF0aChtUGF0aCwgMykpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDMyX3QgYnVmZmVyOworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCArIDgsICZidWZmZXIsIDQpIDwgNCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDMyX3QgdHlwZSA9IG50b2hsKGJ1ZmZlcik7CisgICAgICAgICAgICAvLyBGb3IgdGhlIDNHUFAgZmlsZSBmb3JtYXQsIHRoZSBoYW5kbGVyLXR5cGUgd2l0aGluIHRoZSAnaGRscicgYm94CisgICAgICAgICAgICAvLyBzaGFsbCBiZSAndGV4dCcuIFdlIGFsc28gd2FudCB0byBzdXBwb3J0ICdzYnRsJyBoYW5kbGVyIHR5cGUKKyAgICAgICAgICAgIC8vIGZvciBhIHByYWN0aWNhbCByZWFzb24gYXMgdmFyaW91cyBNUEVHNCBjb250YWluZXJzIHVzZSBpdC4KKyAgICAgICAgICAgIGlmICh0eXBlID09IEZPVVJDQygndCcsICdlJywgJ3gnLCAndCcpIHx8IHR5cGUgPT0gRk9VUkNDKCdzJywgJ2InLCAndCcsICdsJykpIHsKKyAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCdrJywgJ2UnLCAneScsICdzJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKworICAgICAgICAgICAgaWYgKHVuZGVyUVRNZXRhUGF0aChtUGF0aCwgMykpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZVFUTWV0YUtleShkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygndCcsICdyJywgJ2UnLCAneCcpOgorICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisKKyAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAyNCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRyZXggdHJleDsKKyAgICAgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihkYXRhX29mZnNldCArIDQsICZ0cmV4LnRyYWNrX0lEKSB8fAorICAgICAgICAgICAgICAgICFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKGRhdGFfb2Zmc2V0ICsgOCwgJnRyZXguZGVmYXVsdF9zYW1wbGVfZGVzY3JpcHRpb25faW5kZXgpIHx8CisgICAgICAgICAgICAgICAgIW1EYXRhU291cmNlLT5nZXRVSW50MzIoZGF0YV9vZmZzZXQgKyAxMiwgJnRyZXguZGVmYXVsdF9zYW1wbGVfZHVyYXRpb24pIHx8CisgICAgICAgICAgICAgICAgIW1EYXRhU291cmNlLT5nZXRVSW50MzIoZGF0YV9vZmZzZXQgKyAxNiwgJnRyZXguZGVmYXVsdF9zYW1wbGVfc2l6ZSkgfHwKKyAgICAgICAgICAgICAgICAhbURhdGFTb3VyY2UtPmdldFVJbnQzMihkYXRhX29mZnNldCArIDIwLCAmdHJleC5kZWZhdWx0X3NhbXBsZV9mbGFncykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVHJleC5hZGQodHJleCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ3gnLCAnMycsICdnJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKworICAgICAgICAgICAgdWludDMyX3QgdHlwZTsKKyAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IDA7CisgICAgICAgICAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEuZmluZERhdGEoCisgICAgICAgICAgICAgICAgICAgIGtLZXlUZXh0Rm9ybWF0RGF0YSwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICBzaXplID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChjaHVua19zaXplID4gU0laRV9NQVgpIHx8IChTSVpFX01BWCAtIGNodW5rX3NpemUgPD0gc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50OF90ICpidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtzaXplICsgY2h1bmtfc2l6ZV07CisgICAgICAgICAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoYnVmZmVyLCBkYXRhLCBzaXplKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChzaXplX3QpKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgYnVmZmVyICsgc2l6ZSwgY2h1bmtfc2l6ZSkpCisgICAgICAgICAgICAgICAgICAgIDwgY2h1bmtfc2l6ZSkgeworICAgICAgICAgICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOworCisgICAgICAgICAgICAgICAgLy8gYWR2YW5jZSByZWFkIHBvaW50ZXIgc28gd2UgZG9uJ3QgZW5kIHVwIHJlYWRpbmcgdGhpcyBhZ2FpbgorICAgICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YSgKKyAgICAgICAgICAgICAgICAgICAga0tleVRleHRGb3JtYXREYXRhLCAwLCBidWZmZXIsIHNpemUgKyBjaHVua19zaXplKTsKKworICAgICAgICAgICAgZGVsZXRlW10gYnVmZmVyOworCisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCdjJywgJ28nLCAndicsICdyJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKworICAgICAgICAgICAgQUxPR1YoImNodW5rX2RhdGFfc2l6ZSA9ICUiIFBSSWQ2NCAiIGFuZCBkYXRhX29mZnNldCA9ICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICAgIGNodW5rX2RhdGFfc2l6ZSwgZGF0YV9vZmZzZXQpOworCisgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgMCB8fCBzdGF0aWNfY2FzdDx1aW50NjRfdD4oY2h1bmtfZGF0YV9zaXplKSA+PSBTSVpFX01BWCAtIDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0byBidWZmZXIgPSBoZWFwYnVmZmVyPHVpbnQ4X3Q+KGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYi8yODQ3MTIwNiIpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgYnVmZmVyLmdldCgpLCBjaHVua19kYXRhX3NpemUpICE9IChzc2l6ZV90KWNodW5rX2RhdGFfc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IGludCBrU2tpcEJ5dGVzT2ZEYXRhQm94ID0gMTY7CisgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDw9IGtTa2lwQnl0ZXNPZkRhdGFCb3gpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldERhdGEoCisgICAgICAgICAgICAgICAga0tleUFsYnVtQXJ0LCBNZXRhRGF0YTo6VFlQRV9OT05FLAorICAgICAgICAgICAgICAgIGJ1ZmZlci5nZXQoKSArIGtTa2lwQnl0ZXNPZkRhdGFCb3gsIGNodW5rX2RhdGFfc2l6ZSAtIGtTa2lwQnl0ZXNPZkRhdGFCb3gpOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCdjJywgJ28nLCAnbCcsICdyJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgIC8vIHRoaXMgbXVzdCBiZSBpbiBhIFZpc3VhbFNhbXBsZUVudHJ5IGJveCB1bmRlciB0aGUgU2FtcGxlIERlc2NyaXB0aW9uIEJveCAoJ3N0c2QnKQorICAgICAgICAgICAgLy8gaWdub3JlIG90aGVyd2lzZQorICAgICAgICAgICAgaWYgKGRlcHRoID49IDIgJiYgbVBhdGhbZGVwdGggLSAyXSA9PSBGT1VSQ0MoJ3MnLCAndCcsICdzJywgJ2QnKSkgeworICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ29sb3JJbmZvKGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAnaScsICd0JywgJ2wnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ3AnLCAnZScsICdyJywgJ2YnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAndScsICd0JywgJ2gnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2cnLCAnbicsICdyJywgJ2UnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAnbCcsICdiJywgJ20nKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ3knLCAncicsICdyJywgJ2MnKToKKyAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZTNHUFBNZXRhRGF0YShkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplLCBkZXB0aCk7CisKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCdJJywgJ0QnLCAnMycsICcyJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKworICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDYpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwYXJzZUlEM3YyTWV0YURhdGEoZGF0YV9vZmZzZXQgKyA2KTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygnLScsICctJywgJy0nLCAnLScpOgorICAgICAgICB7CisgICAgICAgICAgICBtTGFzdENvbW1lbnRNZWFuLmNsZWFyKCk7CisgICAgICAgICAgICBtTGFzdENvbW1lbnROYW1lLmNsZWFyKCk7CisgICAgICAgICAgICBtTGFzdENvbW1lbnREYXRhLmNsZWFyKCk7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ2knLCAnZCcsICd4Jyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlU2VnbWVudEluZGV4KGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsgLy8gc3RvcCBwYXJzaW5nIGFmdGVyIHNpZHgKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ2MnLCAnLScsICczJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgIHJldHVybiBwYXJzZUFDM1NhbXBsZUVudHJ5KGRhdGFfb2Zmc2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCdmJywgJ3QnLCAneScsICdwJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCA4IHx8IGRlcHRoICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvZmY2NF90IHN0b3Bfb2Zmc2V0ID0gKm9mZnNldCArIGNodW5rX3NpemU7CisgICAgICAgICAgICB1aW50MzJfdCBudW1Db21wYXRpYmxlQnJhbmRzID0gKGNodW5rX2RhdGFfc2l6ZSAtIDgpIC8gNDsKKyAgICAgICAgICAgIHN0ZDo6c2V0PHVpbnQzMl90PiBicmFuZFNldDsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtQ29tcGF0aWJsZUJyYW5kcyArIDI7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB0aGlzIGluZGV4LCBpdCByZWZlcnMgdG8gdGhlIG1pbm9yVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90IGEgYnJhbmQuCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJyYW5kOworICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0ICsgNCAqIGksICZicmFuZCwgNCkgPCA0KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJhbmQgPSBudG9obChicmFuZCk7CisgICAgICAgICAgICAgICAgYnJhbmRTZXQuaW5zZXJ0KGJyYW5kKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGJyYW5kU2V0LmNvdW50KEZPVVJDQygncScsICd0JywgJyAnLCAnICcpKSA+IDApIHsKKyAgICAgICAgICAgICAgICBtSXNRVCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChicmFuZFNldC5jb3VudChGT1VSQ0MoJ20nLCAnaScsICdmJywgJzEnKSkgPiAwCisgICAgICAgICAgICAgICAgICYmIGJyYW5kU2V0LmNvdW50KEZPVVJDQygnaCcsICdlJywgJ2knLCAnYycpKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImlkZW50aWZpZWQgSEVJRiBpbWFnZSIpOworCisgICAgICAgICAgICAgICAgICAgIG1Jc0hlaWYgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmFuZFNldC5lcmFzZShGT1VSQ0MoJ20nLCAnaScsICdmJywgJzEnKSk7CisgICAgICAgICAgICAgICAgICAgIGJyYW5kU2V0LmVyYXNlKEZPVVJDQygnaCcsICdlJywgJ2knLCAnYycpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJyYW5kU2V0LmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHRoZSBmaWxlIHNob3VsZCBoYXZlIG1vb3YgYm94LgorICAgICAgICAgICAgICAgICAgICAvLyBJdCBjb3VsZCBiZSBhbnkgaXNvIGZpbGVzIChtcDQsIGhlaWZzLCBldGMuKQorICAgICAgICAgICAgICAgICAgICBtSGFzTW9vdkJveCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChtSXNIZWlmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiaWRlbnRpZmllZCBIRUlGIGltYWdlIHdpdGggb3RoZXIgdHJhY2tzIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICpvZmZzZXQgPSBzdG9wX29mZnNldDsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICAvLyBjaGVjayBpZiB3ZSdyZSBwYXJzaW5nICdpbHN0JyBmb3IgbWV0YSBrZXlzCisgICAgICAgICAgICAvLyBpZiBzbywgdHJlYXQgdHlwZSBhcyBhIG51bWJlciAoa2V5LWlkKS4KKyAgICAgICAgICAgIGlmICh1bmRlclFUTWV0YVBhdGgobVBhdGgsIDMpKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VRVE1ldGFWYWwoY2h1bmtfdHlwZSwgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZUFDM1NhbXBsZUVudHJ5KG9mZjY0X3Qgb2Zmc2V0KSB7CisgICAgLy8gc2tpcCAxNiBieXRlczoKKyAgICAvLyAgKyA2LWJ5dGUgcmVzZXJ2ZWQsCisgICAgLy8gICsgMi1ieXRlIGRhdGEgcmVmZXJlbmNlIGluZGV4LAorICAgIC8vICArIDgtYnl0ZSByZXNlcnZlZAorICAgIG9mZnNldCArPSAxNjsKKyAgICB1aW50MTZfdCBjaGFubmVsQ291bnQ7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDE2KG9mZnNldCwgJmNoYW5uZWxDb3VudCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgLy8gc2tpcCA4IGJ5dGVzOgorICAgIC8vICArIDItYnl0ZSBjaGFubmVsQ291bnQsCisgICAgLy8gICsgMi1ieXRlIHNhbXBsZSBzaXplLAorICAgIC8vICArIDQtYnl0ZSByZXNlcnZlZAorICAgIG9mZnNldCArPSA4OworICAgIHVpbnQxNl90IHNhbXBsZVJhdGU7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDE2KG9mZnNldCwgJnNhbXBsZVJhdGUpKSB7CisgICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBhYy0zIGJsb2NrOiBjYW5ub3QgcmVhZCBzYW1wbGUgcmF0ZSIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIC8vIHNraXAgNCBieXRlczoKKyAgICAvLyAgKyAyLWJ5dGUgc2FtcGxlUmF0ZSwKKyAgICAvLyAgKyAyLWJ5dGUgcmVzZXJ2ZWQKKyAgICBvZmZzZXQgKz0gNDsKKyAgICByZXR1cm4gcGFyc2VBQzNTcGVjaWZpY0JveChvZmZzZXQsIHNhbXBsZVJhdGUpOworfQorCitzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VBQzNTcGVjaWZpY0JveCgKKyAgICAgICAgb2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90IHNhbXBsZVJhdGUpIHsKKyAgICB1aW50MzJfdCBzaXplOworICAgIC8vICsgNC1ieXRlIHNpemUKKyAgICAvLyArIDQtYnl0ZSB0eXBlCisgICAgLy8gKyAzLWJ5dGUgcGF5bG9hZAorICAgIGNvbnN0IHVpbnQzMl90IGtBQzNTcGVjaWZpY0JveFNpemUgPSAxMTsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmc2l6ZSkgfHwgc2l6ZSA8IGtBQzNTcGVjaWZpY0JveFNpemUpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGFjLTMgYmxvY2s6IGNhbm5vdCByZWFkIHNwZWNpZmljIGJveCBzaXplIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgb2Zmc2V0ICs9IDQ7CisgICAgdWludDMyX3QgdHlwZTsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmdHlwZSkgfHwgdHlwZSAhPSBGT1VSQ0MoJ2QnLCAnYScsICdjJywgJzMnKSkgeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgYWMtMyBzcGVjaWZpYyBibG9jazogaGVhZGVyIG5vdCBkYWMzIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgb2Zmc2V0ICs9IDQ7CisgICAgY29uc3QgdWludDMyX3Qga0FDM1NwZWNpZmljQm94UGF5bG9hZFNpemUgPSAzOworICAgIHVpbnQ4X3QgY2h1bmtba0FDM1NwZWNpZmljQm94UGF5bG9hZFNpemVdOworICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgY2h1bmssIHNpemVvZihjaHVuaykpICE9IHNpemVvZihjaHVuaykpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGFjLTMgc3BlY2lmaWMgYmxvY2s6IGJpdHN0cmVhbSBmaWVsZHMiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBBQml0UmVhZGVyIGJyKGNodW5rLCBzaXplb2YoY2h1bmspKTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhbm5lbENvdW50VGFibGVbXSA9IHsyLCAxLCAyLCAzLCAzLCA0LCA0LCA1fTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxlUmF0ZVRhYmxlW10gPSB7NDgwMDAsIDQ0MTAwLCAzMjAwMH07CisKKyAgICB1bnNpZ25lZCBmc2NvZCA9IGJyLmdldEJpdHMoMik7CisgICAgaWYgKGZzY29kID09IDMpIHsKKyAgICAgICAgQUxPR0UoIkluY29ycmVjdCBmc2NvZCAoMykgaW4gQUMzIGhlYWRlciIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICB1bnNpZ25lZCBib3hTYW1wbGVSYXRlID0gc2FtcGxlUmF0ZVRhYmxlW2ZzY29kXTsKKyAgICBpZiAoYm94U2FtcGxlUmF0ZSAhPSBzYW1wbGVSYXRlKSB7CisgICAgICAgIEFMT0dFKCJzYW1wbGUgcmF0ZSBtaXNtYXRjaDogYm94U2FtcGxlUmF0ZSA9ICVkLCBzYW1wbGVSYXRlID0gJWQiLAorICAgICAgICAgICAgYm94U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdW5zaWduZWQgYnNpZCA9IGJyLmdldEJpdHMoNSk7CisgICAgaWYgKGJzaWQgPiA4KSB7CisgICAgICAgIEFMT0dXKCJJbmNvcnJlY3QgYnNpZCBpbiBBQzMgaGVhZGVyLiBQb3NzaWJseSBFLUFDLTM/Iik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgLy8gc2tpcAorICAgIHVuc2lnbmVkIGJzbW9kIF9fdW51c2VkID0gYnIuZ2V0Qml0cygzKTsKKworICAgIHVuc2lnbmVkIGFjbW9kID0gYnIuZ2V0Qml0cygzKTsKKyAgICB1bnNpZ25lZCBsZmVvbiA9IGJyLmdldEJpdHMoMSk7CisgICAgdW5zaWduZWQgY2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50VGFibGVbYWNtb2RdICsgbGZlb247CisKKyAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FDMyk7CisgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBjaGFubmVsQ291bnQpOworICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlU2VnbWVudEluZGV4KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICBBTE9HVigiTVBFRzRFeHRyYWN0b3I6OnBhcnNlU2VnbWVudEluZGV4Iik7CisKKyAgICBpZiAoc2l6ZSA8IDEyKSB7CisgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBmbGFnczsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmZmxhZ3MpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdWludDMyX3QgdmVyc2lvbiA9IGZsYWdzID4+IDI0OworICAgIGZsYWdzICY9IDB4ZmZmZmZmOworCisgICAgQUxPR1YoInNpZHggdmVyc2lvbiAlZCIsIHZlcnNpb24pOworCisgICAgdWludDMyX3QgcmVmZXJlbmNlSWQ7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCArIDQsICZyZWZlcmVuY2VJZCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1aW50MzJfdCB0aW1lU2NhbGU7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCArIDgsICZ0aW1lU2NhbGUpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIEFMT0dWKCJzaWR4IHJlZmlkL3RpbWVzY2FsZTogJWQvJWQiLCByZWZlcmVuY2VJZCwgdGltZVNjYWxlKTsKKyAgICBpZiAodGltZVNjYWxlID09IDApCisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKKyAgICB1aW50NjRfdCBlYXJsaWVzdFByZXNlbnRhdGlvblRpbWU7CisgICAgdWludDY0X3QgZmlyc3RPZmZzZXQ7CisKKyAgICBvZmZzZXQgKz0gMTI7CisgICAgc2l6ZSAtPSAxMjsKKworICAgIGlmICh2ZXJzaW9uID09IDApIHsKKyAgICAgICAgaWYgKHNpemUgPCA4KSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICB1aW50MzJfdCB0bXA7CisgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZ0bXApKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIGVhcmxpZXN0UHJlc2VudGF0aW9uVGltZSA9IHRtcDsKKyAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCArIDQsICZ0bXApKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIGZpcnN0T2Zmc2V0ID0gdG1wOworICAgICAgICBvZmZzZXQgKz0gODsKKyAgICAgICAgc2l6ZSAtPSA4OworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzaXplIDwgMTYpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQ2NChvZmZzZXQsICZlYXJsaWVzdFByZXNlbnRhdGlvblRpbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQ2NChvZmZzZXQgKyA4LCAmZmlyc3RPZmZzZXQpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSAxNjsKKyAgICAgICAgc2l6ZSAtPSAxNjsKKyAgICB9CisgICAgQUxPR1YoInNpZHggcHJlcy9vZmY6ICUiIFBSSXU2NCAiLyUiIFBSSXU2NCwgZWFybGllc3RQcmVzZW50YXRpb25UaW1lLCBmaXJzdE9mZnNldCk7CisKKyAgICBpZiAoc2l6ZSA8IDQpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgdWludDE2X3QgcmVmZXJlbmNlQ291bnQ7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDE2KG9mZnNldCArIDIsICZyZWZlcmVuY2VDb3VudCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgb2Zmc2V0ICs9IDQ7CisgICAgc2l6ZSAtPSA0OworICAgIEFMT0dWKCJyZWZjb3VudDogJWQiLCByZWZlcmVuY2VDb3VudCk7CisKKyAgICBpZiAoc2l6ZSA8IHJlZmVyZW5jZUNvdW50ICogMTIpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgdWludDY0X3QgdG90YWxfZHVyYXRpb24gPSAwOworICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlQ291bnQ7IGkrKykgeworICAgICAgICB1aW50MzJfdCBkMSwgZDIsIGQzOworCisgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZkMSkgfHwgICAgIC8vIHNpemUKKyAgICAgICAgICAgICFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCArIDQsICZkMikgfHwgLy8gZHVyYXRpb24KKyAgICAgICAgICAgICFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCArIDgsICZkMykpIHsgLy8gZmxhZ3MKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZDEgJiAweDgwMDAwMDAwKSB7CisgICAgICAgICAgICBBTE9HVygic3ViLXNpZHggYm94ZXMgbm90IHN1cHBvcnRlZCB5ZXQiKTsKKyAgICAgICAgfQorICAgICAgICBib29sIHNhcCA9IGQzICYgMHg4MDAwMDAwMDsKKyAgICAgICAgdWludDMyX3Qgc2FwdHlwZSA9IChkMyA+PiAyOCkgJiA3OworICAgICAgICBpZiAoIXNhcCB8fCAoc2FwdHlwZSAhPSAxICYmIHNhcHR5cGUgIT0gMikpIHsKKyAgICAgICAgICAgIC8vIHR5cGUgMSBhbmQgMiBhcmUgc3luYyBzYW1wbGVzCisgICAgICAgICAgICBBTE9HVygibm90IGEgc3RyZWFtIGFjY2VzcyBwb2ludCwgb3IgdW5zdXBwb3J0ZWQgdHlwZTogJTA4eCIsIGQzKTsKKyAgICAgICAgfQorICAgICAgICB0b3RhbF9kdXJhdGlvbiArPSBkMjsKKyAgICAgICAgb2Zmc2V0ICs9IDEyOworICAgICAgICBBTE9HVigiIGl0ZW0gJWQsICUwOHggJTA4eCAlMDh4IiwgaSwgZDEsIGQyLCBkMyk7CisgICAgICAgIFNpZHhFbnRyeSBzZTsKKyAgICAgICAgc2UubVNpemUgPSBkMSAmIDB4N2ZmZmZmZmY7CisgICAgICAgIHNlLm1EdXJhdGlvblVzID0gMTAwMDAwMExMICogZDIgLyB0aW1lU2NhbGU7CisgICAgICAgIG1TaWR4RW50cmllcy5hZGQoc2UpOworICAgIH0KKworICAgIHVpbnQ2NF90IHNpZHhEdXJhdGlvbiA9IHRvdGFsX2R1cmF0aW9uICogMTAwMDAwMCAvIHRpbWVTY2FsZTsKKworICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKKyAgICBpbnQ2NF90IG1ldGFEdXJhdGlvbjsKKyAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEuZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJm1ldGFEdXJhdGlvbikgfHwgbWV0YUR1cmF0aW9uID09IDApIHsKKyAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIHNpZHhEdXJhdGlvbik7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlUVRNZXRhS2V5KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChzaXplIDwgOCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVpbnQzMl90IGNvdW50OworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQgKyA0LCAmY291bnQpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKG1NZXRhS2V5TWFwLnNpemUoKSA+IDApIHsKKyAgICAgICAgQUxPR1coIidrZXlzJyBhdG9tIHNlZW4gYWdhaW4sIGRpc2NhcmRpbmcgZXhpc3RpbmcgZW50cmllcyIpOworICAgICAgICBtTWV0YUtleU1hcC5jbGVhcigpOworICAgIH0KKworICAgIG9mZjY0X3Qga2V5T2Zmc2V0ID0gb2Zmc2V0ICsgODsKKyAgICBvZmY2NF90IHN0b3BPZmZzZXQgPSBvZmZzZXQgKyBzaXplOworICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDw9IGNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKGtleU9mZnNldCArIDggPiBzdG9wT2Zmc2V0KSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3Qga2V5U2l6ZTsKKyAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKGtleU9mZnNldCwgJmtleVNpemUpCisgICAgICAgICAgICAgICAgfHwga2V5U2l6ZSA8IDgKKyAgICAgICAgICAgICAgICB8fCBrZXlPZmZzZXQgKyBrZXlTaXplID4gc3RvcE9mZnNldCkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihrZXlPZmZzZXQgKyA0LCAmdHlwZSkKKyAgICAgICAgICAgICAgICB8fCB0eXBlICE9IEZPVVJDQygnbScsICdkJywgJ3QnLCAnYScpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAga2V5U2l6ZSAtPSA4OworICAgICAgICBrZXlPZmZzZXQgKz0gODsKKworICAgICAgICBhdXRvIGtleURhdGEgPSBoZWFwYnVmZmVyPHVpbnQ4X3Q+KGtleVNpemUpOworICAgICAgICBpZiAoa2V5RGF0YS5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgIGtleU9mZnNldCwga2V5RGF0YS5nZXQoKSwga2V5U2l6ZSkgPCAoc3NpemVfdCkga2V5U2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIEFTdHJpbmcga2V5KChjb25zdCBjaGFyICopa2V5RGF0YS5nZXQoKSwga2V5U2l6ZSk7CisgICAgICAgIG1NZXRhS2V5TWFwLmFkZChpLCBrZXkpOworCisgICAgICAgIGtleU9mZnNldCArPSBrZXlTaXplOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZVFUTWV0YVZhbCgKKyAgICAgICAgaW50MzJfdCBrZXlJZCwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgc3NpemVfdCBpbmRleCA9IG1NZXRhS2V5TWFwLmluZGV4T2ZLZXkoa2V5SWQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgLy8gY29ycmVzcG9uZGluZyBrZXkgaXMgbm90IHByZXNlbnQsIGlnbm9yZQorICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGlmIChzaXplIDw9IDE2KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIHVpbnQzMl90IGRhdGFTaXplOworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZkYXRhU2l6ZSkKKyAgICAgICAgICAgIHx8IGRhdGFTaXplID4gc2l6ZSB8fCBkYXRhU2l6ZSA8PSAxNikgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICB1aW50MzJfdCBhdG9tRm91ckNDOworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQgKyA0LCAmYXRvbUZvdXJDQykKKyAgICAgICAgICAgIHx8IGF0b21Gb3VyQ0MgIT0gRk9VUkNDKCdkJywgJ2EnLCAndCcsICdhJykpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgdWludDMyX3QgZGF0YVR5cGU7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCArIDgsICZkYXRhVHlwZSkKKyAgICAgICAgICAgIHx8ICgoZGF0YVR5cGUgJiAweGZmMDAwMDAwKSAhPSAwKSkgeworICAgICAgICAvLyBub3Qgd2VsbC1rbm93biB0eXBlCisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgZGF0YVNpemUgLT0gMTY7CisgICAgb2Zmc2V0ICs9IDE2OworCisgICAgaWYgKGRhdGFUeXBlID09IDIzICYmIGRhdGFTaXplID49IDQpIHsKKyAgICAgICAgLy8gQkUgRmxvYXQzMgorICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZ2YWwpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIGlmICghc3RyY2FzZWNtcChtTWV0YUtleU1hcFtpbmRleF0uY19zdHIoKSwgImNvbS5hbmRyb2lkLmNhcHR1cmUuZnBzIikpIHsKKyAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0RmxvYXQoa0tleUNhcHR1cmVGcmFtZXJhdGUsICooZmxvYXQgKikmdmFsKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgPT0gNjcgJiYgZGF0YVNpemUgPj0gNCkgeworICAgICAgICAvLyBCRSBzaWduZWQgaW50MzIKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmdmFsKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXN0cmNhc2VjbXAobU1ldGFLZXlNYXBbaW5kZXhdLmNfc3RyKCksICJjb20uYW5kcm9pZC52aWRlby50ZW1wb3JhbF9sYXllcnNfY291bnQiKSkgeworICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRJbnQzMihrS2V5VGVtcG9yYWxMYXllckNvdW50LCB2YWwpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gYWRkIG1vcmUga2V5cyBpZiBuZWVkZWQKKyAgICAgICAgQUxPR1YoImlnbm9yaW5nIGtleTogdHlwZSAlZCwgc2l6ZSAlZCIsIGRhdGFUeXBlLCBkYXRhU2l6ZSk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VUcmFja0hlYWRlcigKKyAgICAgICAgb2ZmNjRfdCBkYXRhX29mZnNldCwgb2ZmNjRfdCBkYXRhX3NpemUpIHsKKyAgICBpZiAoZGF0YV9zaXplIDwgNCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVpbnQ4X3QgdmVyc2lvbjsKKyAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCwgJnZlcnNpb24sIDEpIDwgMSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorCisgICAgc2l6ZV90IGR5blNpemUgPSAodmVyc2lvbiA9PSAxKSA/IDM2IDogMjQ7CisKKyAgICB1aW50OF90IGJ1ZmZlclszNiArIDYwXTsKKworICAgIGlmIChkYXRhX3NpemUgIT0gKG9mZjY0X3QpZHluU2l6ZSArIDYwKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGJ1ZmZlciwgZGF0YV9zaXplKSA8IChzc2l6ZV90KWRhdGFfc2l6ZSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorCisgICAgdWludDY0X3QgY3RpbWUgX191bnVzZWQsIG10aW1lIF9fdW51c2VkLCBkdXJhdGlvbiBfX3VudXNlZDsKKyAgICBpbnQzMl90IGlkOworCisgICAgaWYgKHZlcnNpb24gPT0gMSkgeworICAgICAgICBjdGltZSA9IFU2NF9BVCgmYnVmZmVyWzRdKTsKKyAgICAgICAgbXRpbWUgPSBVNjRfQVQoJmJ1ZmZlclsxMl0pOworICAgICAgICBpZCA9IFUzMl9BVCgmYnVmZmVyWzIwXSk7CisgICAgICAgIGR1cmF0aW9uID0gVTY0X0FUKCZidWZmZXJbMjhdKTsKKyAgICB9IGVsc2UgaWYgKHZlcnNpb24gPT0gMCkgeworICAgICAgICBjdGltZSA9IFUzMl9BVCgmYnVmZmVyWzRdKTsKKyAgICAgICAgbXRpbWUgPSBVMzJfQVQoJmJ1ZmZlcls4XSk7CisgICAgICAgIGlkID0gVTMyX0FUKCZidWZmZXJbMTJdKTsKKyAgICAgICAgZHVyYXRpb24gPSBVMzJfQVQoJmJ1ZmZlclsyMF0pOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCisgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5VHJhY2tJRCwgaWQpOworCisgICAgc2l6ZV90IG1hdHJpeE9mZnNldCA9IGR5blNpemUgKyAxNjsKKyAgICBpbnQzMl90IGEwMCA9IFUzMl9BVCgmYnVmZmVyW21hdHJpeE9mZnNldF0pOworICAgIGludDMyX3QgYTAxID0gVTMyX0FUKCZidWZmZXJbbWF0cml4T2Zmc2V0ICsgNF0pOworICAgIGludDMyX3QgYTEwID0gVTMyX0FUKCZidWZmZXJbbWF0cml4T2Zmc2V0ICsgMTJdKTsKKyAgICBpbnQzMl90IGExMSA9IFUzMl9BVCgmYnVmZmVyW21hdHJpeE9mZnNldCArIDE2XSk7CisKKyNpZiAwCisgICAgaW50MzJfdCBkeCA9IFUzMl9BVCgmYnVmZmVyW21hdHJpeE9mZnNldCArIDhdKTsKKyAgICBpbnQzMl90IGR5ID0gVTMyX0FUKCZidWZmZXJbbWF0cml4T2Zmc2V0ICsgMjBdKTsKKworICAgIEFMT0dJKCJ4JyA9ICUuMmYgKiB4ICsgJS4yZiAqIHkgKyAlLjJmIiwKKyAgICAgICAgIGEwMCAvIDY1NTM2LjBmLCBhMDEgLyA2NTUzNi4wZiwgZHggLyA2NTUzNi4wZik7CisgICAgQUxPR0koInknID0gJS4yZiAqIHggKyAlLjJmICogeSArICUuMmYiLAorICAgICAgICAgYTEwIC8gNjU1MzYuMGYsIGExMSAvIDY1NTM2LjBmLCBkeSAvIDY1NTM2LjBmKTsKKyNlbmRpZgorCisgICAgdWludDMyX3Qgcm90YXRpb25EZWdyZWVzOworCisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga0ZpeGVkT25lID0gMHgxMDAwMDsKKyAgICBpZiAoYTAwID09IGtGaXhlZE9uZSAmJiBhMDEgPT0gMCAmJiBhMTAgPT0gMCAmJiBhMTEgPT0ga0ZpeGVkT25lKSB7CisgICAgICAgIC8vIElkZW50aXR5LCBubyByb3RhdGlvbgorICAgICAgICByb3RhdGlvbkRlZ3JlZXMgPSAwOworICAgIH0gZWxzZSBpZiAoYTAwID09IDAgJiYgYTAxID09IGtGaXhlZE9uZSAmJiBhMTAgPT0gLWtGaXhlZE9uZSAmJiBhMTEgPT0gMCkgeworICAgICAgICByb3RhdGlvbkRlZ3JlZXMgPSA5MDsKKyAgICB9IGVsc2UgaWYgKGEwMCA9PSAwICYmIGEwMSA9PSAta0ZpeGVkT25lICYmIGExMCA9PSBrRml4ZWRPbmUgJiYgYTExID09IDApIHsKKyAgICAgICAgcm90YXRpb25EZWdyZWVzID0gMjcwOworICAgIH0gZWxzZSBpZiAoYTAwID09IC1rRml4ZWRPbmUgJiYgYTAxID09IDAgJiYgYTEwID09IDAgJiYgYTExID09IC1rRml4ZWRPbmUpIHsKKyAgICAgICAgcm90YXRpb25EZWdyZWVzID0gMTgwOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCJXZSBvbmx5IHN1cHBvcnQgMCw5MCwxODAsMjcwIGRlZ3JlZSByb3RhdGlvbiBtYXRyaWNlcyIpOworICAgICAgICByb3RhdGlvbkRlZ3JlZXMgPSAwOworICAgIH0KKworICAgIGlmIChyb3RhdGlvbkRlZ3JlZXMgIT0gMCkgeworICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlSb3RhdGlvbiwgcm90YXRpb25EZWdyZWVzKTsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgcHJlc2VudGF0aW9uIGRpc3BsYXkgc2l6ZSwgd2hpY2ggY291bGQgYmUgZGlmZmVyZW50CisgICAgLy8gZnJvbSB0aGUgaW1hZ2Ugc2l6ZSBpbmRpY2F0ZWQgYnkga0tleVdpZHRoIGFuZCBrS2V5SGVpZ2h0LgorICAgIHVpbnQzMl90IHdpZHRoID0gVTMyX0FUKCZidWZmZXJbZHluU2l6ZSArIDUyXSk7CisgICAgdWludDMyX3QgaGVpZ2h0ID0gVTMyX0FUKCZidWZmZXJbZHluU2l6ZSArIDU2XSk7CisgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RGlzcGxheVdpZHRoLCB3aWR0aCA+PiAxNik7CisgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RGlzcGxheUhlaWdodCwgaGVpZ2h0ID4+IDE2KTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlSVR1bmVzTWV0YURhdGEob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaWYgKHNpemUgPCA0IHx8IHNpemUgPT0gU0laRV9NQVgpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1aW50OF90ICpidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtzaXplICsgMV07CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgIG9mZnNldCwgYnVmZmVyLCBzaXplKSAhPSAoc3NpemVfdClzaXplKSB7CisgICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKKyAgICAgICAgYnVmZmVyID0gTlVMTDsKKworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorCisgICAgdWludDMyX3QgZmxhZ3MgPSBVMzJfQVQoYnVmZmVyKTsKKworICAgIHVpbnQzMl90IG1ldGFkYXRhS2V5ID0gMDsKKyAgICBjaGFyIGNodW5rWzVdOworICAgIE1ha2VGb3VyQ0NTdHJpbmcobVBhdGhbNF0sIGNodW5rKTsKKyAgICBBTE9HVigibWV0YTogJXMgQCAlbGxkIiwgY2h1bmssIChsb25nIGxvbmcpb2Zmc2V0KTsKKyAgICBzd2l0Y2ggKChpbnQzMl90KW1QYXRoWzRdKSB7CisgICAgICAgIGNhc2UgRk9VUkNDKDB4YTksICdhJywgJ2wnLCAnYicpOgorICAgICAgICB7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlBbGJ1bTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKDB4YTksICdBJywgJ1InLCAnVCcpOgorICAgICAgICB7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlBcnRpc3Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygnYScsICdBJywgJ1InLCAnVCcpOgorICAgICAgICB7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlBbGJ1bUFydGlzdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKDB4YTksICdkJywgJ2EnLCAneScpOgorICAgICAgICB7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlZZWFyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0MoMHhhOSwgJ24nLCAnYScsICdtJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleVRpdGxlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0MoMHhhOSwgJ3cnLCAncicsICd0Jyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleVdyaXRlcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCdjJywgJ28nLCAndicsICdyJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFsYnVtQXJ0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2cnLCAnbicsICdyJywgJ2UnKToKKyAgICAgICAgeworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5R2VucmU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygweGE5LCAnZycsICdlJywgJ24nKToKKyAgICAgICAgeworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5R2VucmU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygnYycsICdwJywgJ2knLCAnbCcpOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2l6ZSA9PSA5ICYmIGZsYWdzID09IDIxKSB7CisgICAgICAgICAgICAgICAgY2hhciB0bXBbMTZdOworICAgICAgICAgICAgICAgIHNwcmludGYodG1wLCAiJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludClidWZmZXJbc2l6ZSAtIDFdKTsKKworICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5Q29tcGlsYXRpb24sIHRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygndCcsICdyJywgJ2snLCAnbicpOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2l6ZSA9PSAxNiAmJiBmbGFncyA9PSAwKSB7CisgICAgICAgICAgICAgICAgY2hhciB0bXBbMTZdOworICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwVHJhY2sgPSAodWludDE2X3QqKSZidWZmZXJbMTBdOworICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwVG90YWxUcmFja3MgPSAodWludDE2X3QqKSZidWZmZXJbMTJdOworICAgICAgICAgICAgICAgIHNwcmludGYodG1wLCAiJWQvJWQiLCBudG9ocygqcFRyYWNrKSwgbnRvaHMoKnBUb3RhbFRyYWNrcykpOworCisgICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlDRFRyYWNrTnVtYmVyLCB0bXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2QnLCAnaScsICdzJywgJ2snKToKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChzaXplID09IDE0IHx8IHNpemUgPT0gMTYpICYmIGZsYWdzID09IDApIHsKKyAgICAgICAgICAgICAgICBjaGFyIHRtcFsxNl07CisgICAgICAgICAgICAgICAgdWludDE2X3QqIHBEaXNjID0gKHVpbnQxNl90KikmYnVmZmVyWzEwXTsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCogcFRvdGFsRGlzY3MgPSAodWludDE2X3QqKSZidWZmZXJbMTJdOworICAgICAgICAgICAgICAgIHNwcmludGYodG1wLCAiJWQvJWQiLCBudG9ocygqcERpc2MpLCBudG9ocygqcFRvdGFsRGlzY3MpKTsKKworICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5RGlzY051bWJlciwgdG1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCctJywgJy0nLCAnLScsICctJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZmZlcltzaXplXSA9ICdcMCc7CisgICAgICAgICAgICBzd2l0Y2ggKG1QYXRoWzVdKSB7CisgICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZScsICdhJywgJ24nKToKKyAgICAgICAgICAgICAgICAgICAgbUxhc3RDb21tZW50TWVhbi5zZXRUbygoY29uc3QgY2hhciAqKWJ1ZmZlciArIDQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZPVVJDQygnbicsICdhJywgJ20nLCAnZScpOgorICAgICAgICAgICAgICAgICAgICBtTGFzdENvbW1lbnROYW1lLnNldFRvKChjb25zdCBjaGFyICopYnVmZmVyICsgNCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJ2EnLCAndCcsICdhJyk6CisgICAgICAgICAgICAgICAgICAgIGlmIChzaXplIDwgOCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlW10gYnVmZmVyOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJiLzI0MzQ2NDMwIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1MYXN0Q29tbWVudERhdGEuc2V0VG8oKGNvbnN0IGNoYXIgKilidWZmZXIgKyA4KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE9uY2Ugd2UgaGF2ZSBhIHNldCBvZiBtZWFuL25hbWUvZGF0YSBpbmZvLCBnbyBhaGVhZCBhbmQgcHJvY2VzcworICAgICAgICAgICAgLy8gaXQgdG8gc2VlIGlmIGl0cyBzb21ldGhpbmcgd2UgYXJlIGludGVyZXN0ZWQgaW4uICBXaGV0aGVyIG9yIG5vdAorICAgICAgICAgICAgLy8gd2VyZSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgc3BlY2lmaWMgdGFnLCBtYWtlIHN1cmUgdG8gY2xlYXIgb3V0CisgICAgICAgICAgICAvLyB0aGUgc2V0IHNvIHdlIGNhbiBiZSByZWFkeSB0byBwcm9jZXNzIGFub3RoZXIgdHVwbGUgc2hvdWxkIG9uZQorICAgICAgICAgICAgLy8gc2hvdyB1cCBsYXRlciBpbiB0aGUgZmlsZS4KKyAgICAgICAgICAgIGlmICgobUxhc3RDb21tZW50TWVhbi5sZW5ndGgoKSAhPSAwKSAmJgorICAgICAgICAgICAgICAgIChtTGFzdENvbW1lbnROYW1lLmxlbmd0aCgpICE9IDApICYmCisgICAgICAgICAgICAgICAgKG1MYXN0Q29tbWVudERhdGEubGVuZ3RoKCkgIT0gMCkpIHsKKworICAgICAgICAgICAgICAgIGlmIChtTGFzdENvbW1lbnRNZWFuID09ICJjb20uYXBwbGUuaVR1bmVzIgorICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUxhc3RDb21tZW50TmFtZSA9PSAiaVR1blNNUEIiKSB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGVsYXksIHBhZGRpbmc7CisgICAgICAgICAgICAgICAgICAgIGlmIChzc2NhbmYobUxhc3RDb21tZW50RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICUqeCAleCAleCAlKngiLCAmZGVsYXksICZwYWRkaW5nKSA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlW10gYnVmZmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUVuY29kZXJEZWxheSwgZGVsYXkpOworICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlclBhZGRpbmcsIHBhZGRpbmcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbUxhc3RDb21tZW50TWVhbi5jbGVhcigpOworICAgICAgICAgICAgICAgIG1MYXN0Q29tbWVudE5hbWUuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtTGFzdENvbW1lbnREYXRhLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoc2l6ZSA+PSA4ICYmIG1ldGFkYXRhS2V5ICYmICFtRmlsZU1ldGFEYXRhLmhhc0RhdGEobWV0YWRhdGFLZXkpKSB7CisgICAgICAgIGlmIChtZXRhZGF0YUtleSA9PSBrS2V5QWxidW1BcnQpIHsKKyAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0RGF0YSgKKyAgICAgICAgICAgICAgICAgICAga0tleUFsYnVtQXJ0LCBNZXRhRGF0YTo6VFlQRV9OT05FLAorICAgICAgICAgICAgICAgICAgICBidWZmZXIgKyA4LCBzaXplIC0gOCk7CisgICAgICAgIH0gZWxzZSBpZiAobWV0YWRhdGFLZXkgPT0ga0tleUdlbnJlKSB7CisgICAgICAgICAgICBpZiAoZmxhZ3MgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIHVpbnQ4X3QgZ2VucmUgY29kZSwgaVR1bmVzIGdlbnJlIGNvZGVzIGFyZQorICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFuZGFyZCBpZDMgY29kZXMsIGV4Y2VwdCB0aGV5IHN0YXJ0CisgICAgICAgICAgICAgICAgLy8gYXQgMSBpbnN0ZWFkIG9mIDAgKGUuZy4gUG9wIGlzIDE0LCBub3QgMTMpCisgICAgICAgICAgICAgICAgLy8gV2UgdXNlIHN0YW5kYXJkIGlkMyBudW1iZXJpbmcsIHNvIHN1YnRyYWN0IDEuCisgICAgICAgICAgICAgICAgaW50IGdlbnJlY29kZSA9IChpbnQpYnVmZmVyW3NpemUgLSAxXTsKKyAgICAgICAgICAgICAgICBnZW5yZWNvZGUtLTsKKyAgICAgICAgICAgICAgICBpZiAoZ2VucmVjb2RlIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBnZW5yZWNvZGUgPSAyNTU7IC8vIHJlc2VydmVkIGZvciAndW5rbm93biBnZW5yZScKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2hhciBnZW5yZVsxMF07CisgICAgICAgICAgICAgICAgc3ByaW50ZihnZW5yZSwgIiVkIiwgZ2VucmVjb2RlKTsKKworICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhtZXRhZGF0YUtleSwgZ2VucmUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChmbGFncyA9PSAxKSB7CisgICAgICAgICAgICAgICAgLy8gY3VzdG9tIGdlbnJlIHN0cmluZworICAgICAgICAgICAgICAgIGJ1ZmZlcltzaXplXSA9ICdcMCc7CisKKyAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUtleSwgKGNvbnN0IGNoYXIgKilidWZmZXIgKyA4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZmZlcltzaXplXSA9ICdcMCc7CisKKyAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZygKKyAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFLZXksIChjb25zdCBjaGFyICopYnVmZmVyICsgOCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZWxldGVbXSBidWZmZXI7CisgICAgYnVmZmVyID0gTlVMTDsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlQ29sb3JJbmZvKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChzaXplIDwgNCB8fCBzaXplID09IFNJWkVfTUFYIHx8IG1MYXN0VHJhY2sgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVpbnQ4X3QgKmJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W3NpemUgKyAxXTsKKyAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWZmZXIsIHNpemUpICE9IChzc2l6ZV90KXNpemUpIHsKKyAgICAgICAgZGVsZXRlW10gYnVmZmVyOworICAgICAgICBidWZmZXIgPSBOVUxMOworCisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisKKyAgICBpbnQzMl90IHR5cGUgPSBVMzJfQVQoJmJ1ZmZlclswXSk7CisgICAgaWYgKCh0eXBlID09IEZPVVJDQygnbicsICdjJywgJ2wnLCAneCcpICYmIHNpemUgPj0gMTEpCisgICAgICAgICAgICB8fCAodHlwZSA9PSBGT1VSQ0MoJ24nLCAnYycsICdsJywgJ2MnKSAmJiBzaXplID49IDEwKSkgeworICAgICAgICBpbnQzMl90IHByaW1hcmllcyA9IFUxNl9BVCgmYnVmZmVyWzRdKTsKKyAgICAgICAgaW50MzJfdCB0cmFuc2ZlciA9IFUxNl9BVCgmYnVmZmVyWzZdKTsKKyAgICAgICAgaW50MzJfdCBjb2VmZnMgPSBVMTZfQVQoJmJ1ZmZlcls4XSk7CisgICAgICAgIGJvb2wgZnVsbFJhbmdlID0gKHR5cGUgPT0gRk9VUkNDKCduJywgJ2MnLCAnbCcsICd4JykpICYmIChidWZmZXJbMTBdICYgMTI4KTsKKworICAgICAgICBDb2xvckFzcGVjdHMgYXNwZWN0czsKKyAgICAgICAgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvQ29kZWNBc3BlY3RzKAorICAgICAgICAgICAgICAgIHByaW1hcmllcywgdHJhbnNmZXIsIGNvZWZmcywgZnVsbFJhbmdlLCBhc3BlY3RzKTsKKworICAgICAgICAvLyBvbmx5IHN0b3JlIHRoZSBmaXJzdCBjb2xvciBzcGVjaWZpY2F0aW9uCisgICAgICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS5oYXNEYXRhKGtLZXlDb2xvclByaW1hcmllcykpIHsKKyAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNvbG9yUHJpbWFyaWVzLCBhc3BlY3RzLm1QcmltYXJpZXMpOworICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5VHJhbnNmZXJGdW5jdGlvbiwgYXNwZWN0cy5tVHJhbnNmZXIpOworICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q29sb3JNYXRyaXgsIGFzcGVjdHMubU1hdHJpeENvZWZmcyk7CisgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDb2xvclJhbmdlLCBhc3BlY3RzLm1SYW5nZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZWxldGVbXSBidWZmZXI7CisgICAgYnVmZmVyID0gTlVMTDsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlM0dQUE1ldGFEYXRhKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgaW50IGRlcHRoKSB7CisgICAgaWYgKHNpemUgPCA0IHx8IHNpemUgPT0gU0laRV9NQVgpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1aW50OF90ICpidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtzaXplICsgMV07CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgIG9mZnNldCwgYnVmZmVyLCBzaXplKSAhPSAoc3NpemVfdClzaXplKSB7CisgICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKKyAgICAgICAgYnVmZmVyID0gTlVMTDsKKworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorCisgICAgdWludDMyX3QgbWV0YWRhdGFLZXkgPSAwOworICAgIHN3aXRjaCAobVBhdGhbZGVwdGhdKSB7CisgICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ2knLCAndCcsICdsJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleVRpdGxlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0MoJ3AnLCAnZScsICdyJywgJ2YnKToKKyAgICAgICAgeworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5QXJ0aXN0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAndScsICd0JywgJ2gnKToKKyAgICAgICAgeworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5V3JpdGVyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2cnLCAnbicsICdyJywgJ2UnKToKKyAgICAgICAgeworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5R2VucmU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygnYScsICdsJywgJ2InLCAnbScpOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYnVmZmVyW3NpemUgLSAxXSAhPSAnXDAnKSB7CisgICAgICAgICAgICAgIGNoYXIgdG1wWzRdOworICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiV1IiwgYnVmZmVyW3NpemUgLSAxXSk7CisKKyAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlDRFRyYWNrTnVtYmVyLCB0bXApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlBbGJ1bTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCd5JywgJ3InLCAncicsICdjJyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzaXplIDwgNikgeworICAgICAgICAgICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIEFMT0dFKCJiLzYyMTMzMjI3Iik7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI2MjEzMzIyNyIpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGFyIHRtcFs1XTsKKyAgICAgICAgICAgIHVpbnQxNl90IHllYXIgPSBVMTZfQVQoJmJ1ZmZlcls0XSk7CisKKyAgICAgICAgICAgIGlmICh5ZWFyIDwgMTAwMDApIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiV1IiwgeWVhcik7CisKKyAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleVllYXIsIHRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAobWV0YWRhdGFLZXkgPiAwKSB7CisgICAgICAgIGJvb2wgaXNVVEY4ID0gdHJ1ZTsgLy8gQ29tbW9uIGNhc2UKKyAgICAgICAgY2hhcjE2X3QgKmZyYW1lZGF0YSA9IE5VTEw7CisgICAgICAgIGludCBsZW4xNiA9IDA7IC8vIE51bWJlciBvZiBVVEYtMTYgY2hhcmFjdGVycworCisgICAgICAgIC8vIHNtYWxsZXN0IHBvc3NpYmxlIHZhbGlkIFVURi0xNiBzdHJpbmcgdyBCT006IDB4ZmUgMHhmZiAweDAwIDB4MDAKKyAgICAgICAgaWYgKHNpemUgPCA2KSB7CisgICAgICAgICAgICBkZWxldGVbXSBidWZmZXI7CisgICAgICAgICAgICBidWZmZXIgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzaXplIC0gNiA+PSA0KSB7CisgICAgICAgICAgICBsZW4xNiA9ICgoc2l6ZSAtIDYpIC8gMikgLSAxOyAvLyBkb24ndCBpbmNsdWRlIDB4MDAwMCB0ZXJtaW5hdG9yCisgICAgICAgICAgICBmcmFtZWRhdGEgPSAoY2hhcjE2X3QgKikoYnVmZmVyICsgNik7CisgICAgICAgICAgICBpZiAoMHhmZmZlID09ICpmcmFtZWRhdGEpIHsKKyAgICAgICAgICAgICAgICAvLyBlbmRpYW5uZXNzIG1hcmtlciAoQk9NKSBkb2Vzbid0IG1hdGNoIGhvc3QgZW5kaWFubmVzcworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuMTY7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmcmFtZWRhdGFbaV0gPSBic3dhcF8xNihmcmFtZWRhdGFbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBCT00gaXMgbm93IHN3YXBwZWQgdG8gMHhmZWZmLCB3ZSB3aWxsIGV4ZWN1dGUgbmV4dCBibG9jayB0b28KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKDB4ZmVmZiA9PSAqZnJhbWVkYXRhKSB7CisgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBCT00KKyAgICAgICAgICAgICAgICBmcmFtZWRhdGErKzsKKyAgICAgICAgICAgICAgICBsZW4xNi0tOworICAgICAgICAgICAgICAgIGlzVVRGOCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZWxzZSBub3JtYWwgbm9uLXplcm8tbGVuZ3RoIFVURi04IHN0cmluZworICAgICAgICAgICAgLy8gd2UgY2FuJ3QgaGFuZGxlIFVURi0xNiB3aXRob3V0IEJPTSBhcyB0aGVyZSBpcyBubyBvdGhlcgorICAgICAgICAgICAgLy8gaW5kaWNhdGlvbiBvZiBlbmNvZGluZy4KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc1VURjgpIHsKKyAgICAgICAgICAgIGJ1ZmZlcltzaXplXSA9IDA7CisgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcobWV0YWRhdGFLZXksIChjb25zdCBjaGFyICopYnVmZmVyICsgNik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBDb252ZXJ0IGZyb20gVVRGLTE2IHN0cmluZyB0byBVVEYtOCBzdHJpbmcuCisgICAgICAgICAgICBTdHJpbmc4IHRtcFVURjhzdHIoZnJhbWVkYXRhLCBsZW4xNik7CisgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcobWV0YWRhdGFLZXksIHRtcFVURjhzdHIuc3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgZGVsZXRlW10gYnVmZmVyOworICAgIGJ1ZmZlciA9IE5VTEw7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTVBFRzRFeHRyYWN0b3I6OnBhcnNlSUQzdjJNZXRhRGF0YShvZmY2NF90IG9mZnNldCkgeworICAgIElEMyBpZDMobURhdGFTb3VyY2UsIHRydWUgLyogaWdub3JldjEgKi8sIG9mZnNldCk7CisKKyAgICBpZiAoaWQzLmlzVmFsaWQoKSkgeworICAgICAgICBzdHJ1Y3QgTWFwIHsKKyAgICAgICAgICAgIGludCBrZXk7CisgICAgICAgICAgICBjb25zdCBjaGFyICp0YWcxOworICAgICAgICAgICAgY29uc3QgY2hhciAqdGFnMjsKKyAgICAgICAgfTsKKyAgICAgICAgc3RhdGljIGNvbnN0IE1hcCBrTWFwW10gPSB7CisgICAgICAgICAgICB7IGtLZXlBbGJ1bSwgIlRBTEIiLCAiVEFMIiB9LAorICAgICAgICAgICAgeyBrS2V5QXJ0aXN0LCAiVFBFMSIsICJUUDEiIH0sCisgICAgICAgICAgICB7IGtLZXlBbGJ1bUFydGlzdCwgIlRQRTIiLCAiVFAyIiB9LAorICAgICAgICAgICAgeyBrS2V5Q29tcG9zZXIsICJUQ09NIiwgIlRDTSIgfSwKKyAgICAgICAgICAgIHsga0tleUdlbnJlLCAiVENPTiIsICJUQ08iIH0sCisgICAgICAgICAgICB7IGtLZXlUaXRsZSwgIlRJVDIiLCAiVFQyIiB9LAorICAgICAgICAgICAgeyBrS2V5WWVhciwgIlRZRSIsICJUWUVSIiB9LAorICAgICAgICAgICAgeyBrS2V5QXV0aG9yLCAiVFhUIiwgIlRFWFQiIH0sCisgICAgICAgICAgICB7IGtLZXlDRFRyYWNrTnVtYmVyLCAiVFJLIiwgIlRSQ0siIH0sCisgICAgICAgICAgICB7IGtLZXlEaXNjTnVtYmVyLCAiVFBBIiwgIlRQT1MiIH0sCisgICAgICAgICAgICB7IGtLZXlDb21waWxhdGlvbiwgIlRDUCIsICJUQ01QIiB9LAorICAgICAgICB9OworICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1NYXBFbnRyaWVzID0gc2l6ZW9mKGtNYXApIC8gc2l6ZW9mKGtNYXBbMF0pOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bU1hcEVudHJpZXM7ICsraSkgeworICAgICAgICAgICAgaWYgKCFtRmlsZU1ldGFEYXRhLmhhc0RhdGEoa01hcFtpXS5rZXkpKSB7CisgICAgICAgICAgICAgICAgSUQzOjpJdGVyYXRvciAqaXQgPSBuZXcgSUQzOjpJdGVyYXRvcihpZDMsIGtNYXBbaV0udGFnMSk7CisgICAgICAgICAgICAgICAgaWYgKGl0LT5kb25lKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGl0OworICAgICAgICAgICAgICAgICAgICBpdCA9IG5ldyBJRDM6Okl0ZXJhdG9yKGlkMywga01hcFtpXS50YWcyKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaXQtPmRvbmUoKSkgeworICAgICAgICAgICAgICAgICAgICBkZWxldGUgaXQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFN0cmluZzggczsKKyAgICAgICAgICAgICAgICBpdC0+Z2V0U3RyaW5nKCZzKTsKKyAgICAgICAgICAgICAgICBkZWxldGUgaXQ7CisKKyAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa01hcFtpXS5rZXksIHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IGRhdGFTaXplOworICAgICAgICBTdHJpbmc4IG1pbWU7CisgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEgPSBpZDMuZ2V0QWxidW1BcnQoJmRhdGFTaXplLCAmbWltZSk7CisKKyAgICAgICAgaWYgKGRhdGEpIHsKKyAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0RGF0YShrS2V5QWxidW1BcnQsIE1ldGFEYXRhOjpUWVBFX05PTkUsIGRhdGEsIGRhdGFTaXplKTsKKyAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5QWxidW1BcnRNSU1FLCBtaW1lLnN0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworTWVkaWFUcmFjayAqTVBFRzRFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworICAgIHN0YXR1c190IGVycjsKKyAgICBpZiAoKGVyciA9IHJlYWRNZXRhRGF0YSgpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBUcmFjayAqdHJhY2sgPSBtRmlyc3RUcmFjazsKKyAgICB3aGlsZSAoaW5kZXggPiAwKSB7CisgICAgICAgIGlmICh0cmFjayA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHRyYWNrID0gdHJhY2stPm5leHQ7CisgICAgICAgIC0taW5kZXg7CisgICAgfQorCisgICAgaWYgKHRyYWNrID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisKKyAgICBUcmV4ICp0cmV4ID0gTlVMTDsKKyAgICBpbnQzMl90IHRyYWNrSWQ7CisgICAgaWYgKHRyYWNrLT5tZXRhLmZpbmRJbnQzMihrS2V5VHJhY2tJRCwgJnRyYWNrSWQpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyZXguc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIFRyZXggKnQgPSAmbVRyZXguZWRpdEl0ZW1BdChpKTsKKyAgICAgICAgICAgIGlmICh0LT50cmFja19JRCA9PSAodWludDMyX3QpIHRyYWNrSWQpIHsKKyAgICAgICAgICAgICAgICB0cmV4ID0gdDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJiLzIxNjU3OTU3Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIEFMT0dWKCJnZXRUcmFjayBjYWxsZWQsIHBzc2g6ICV6dSIsIG1Qc3NoLnNpemUoKSk7CisKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIGlmICghdHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3A8SXRlbVRhYmxlPiBpdGVtVGFibGU7CisgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykpIHsKKyAgICAgICAgdWludDMyX3QgdHlwZTsKKyAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGlmICghdHJhY2stPm1ldGEuZmluZERhdGEoa0tleUFWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKKworICAgICAgICBpZiAoc2l6ZSA8IDcgfHwgcHRyWzBdICE9IDEpIHsgIC8vIGNvbmZpZ3VyYXRpb25WZXJzaW9uID09IDEKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKQorICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDKSkgeworICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICBjb25zdCB2b2lkICpkYXRhOworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgaWYgKCF0cmFjay0+bWV0YS5maW5kRGF0YShrS2V5SFZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOworCisgICAgICAgIGlmIChzaXplIDwgMjIgfHwgcHRyWzBdICE9IDEpIHsgIC8vIGNvbmZpZ3VyYXRpb25WZXJzaW9uID09IDEKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpKSB7CisgICAgICAgICAgICBpdGVtVGFibGUgPSBtSXRlbVRhYmxlOworICAgICAgICB9CisgICAgfQorCisgICAgTVBFRzRTb3VyY2UgKnNvdXJjZSA9ICBuZXcgTVBFRzRTb3VyY2UoCisgICAgICAgICAgICB0cmFjay0+bWV0YSwgbURhdGFTb3VyY2UsIHRyYWNrLT50aW1lc2NhbGUsIHRyYWNrLT5zYW1wbGVUYWJsZSwKKyAgICAgICAgICAgIG1TaWR4RW50cmllcywgdHJleCwgbU1vb2ZPZmZzZXQsIGl0ZW1UYWJsZSk7CisgICAgaWYgKHNvdXJjZS0+aW5pdCgpICE9IE9LKSB7CisgICAgICAgIGRlbGV0ZSBzb3VyY2U7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gc291cmNlOworfQorCisvLyBzdGF0aWMKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjp2ZXJpZnlUcmFjayhUcmFjayAqdHJhY2spIHsKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIENIRUNLKHRyYWNrLT5tZXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKworICAgIHVpbnQzMl90IHR5cGU7CisgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSkgeworICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKQorICAgICAgICAgICAgICAgIHx8IHR5cGUgIT0ga1R5cGVBVkNDKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSkgeworICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKQorICAgICAgICAgICAgICAgICAgICB8fCB0eXBlICE9IGtUeXBlSFZDQykgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpCisgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMikKKyAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpIHsKKyAgICAgICAgaWYgKCF0cmFjay0+bWV0YS5maW5kRGF0YShrS2V5RVNEUywgJnR5cGUsICZkYXRhLCAmc2l6ZSkKKyAgICAgICAgICAgICAgICB8fCB0eXBlICE9IGtUeXBlRVNEUykgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0cmFjay0+c2FtcGxlVGFibGUgPT0gTlVMTCB8fCAhdHJhY2stPnNhbXBsZVRhYmxlLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgYWxsIHRoZSBtZXRhZGF0YSB3ZSBuZWVkLgorICAgICAgICBBTE9HRSgic3RibCBhdG9tIG1pc3NpbmcvaW52YWxpZC4iKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBpZiAodHJhY2stPnRpbWVzY2FsZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJ0aW1lc2NhbGUgaW52YWxpZC4iKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3R5cGVkZWYgZW51bSB7CisgICAgLy9BT1RfTk9ORSAgICAgICAgICAgICA9IC0xLAorICAgIC8vQU9UX05VTExfT0JKRUNUICAgICAgPSAwLAorICAgIC8vQU9UX0FBQ19NQUlOICAgICAgICAgPSAxLCAvKio8IE1haW4gcHJvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgQU9UX0FBQ19MQyAgICAgICAgICAgPSAyLCAgIC8qKjwgTG93IENvbXBsZXhpdHkgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvL0FPVF9BQUNfU1NSICAgICAgICAgID0gMywKKyAgICAvL0FPVF9BQUNfTFRQICAgICAgICAgID0gNCwKKyAgICBBT1RfU0JSICAgICAgICAgICAgICA9IDUsCisgICAgLy9BT1RfQUFDX1NDQUwgICAgICAgICA9IDYsCisgICAgLy9BT1RfVFdJTl9WUSAgICAgICAgICA9IDcsCisgICAgLy9BT1RfQ0VMUCAgICAgICAgICAgICA9IDgsCisgICAgLy9BT1RfSFZYQyAgICAgICAgICAgICA9IDksCisgICAgLy9BT1RfUlNWRF8xMCAgICAgICAgICA9IDEwLCAvKio8IChyZXNlcnZlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfUlNWRF8xMSAgICAgICAgICA9IDExLCAvKio8IChyZXNlcnZlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfVFRTSSAgICAgICAgICAgICA9IDEyLCAvKio8IFRUU0kgT2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfTUFJTl9TWU5USCAgICAgICA9IDEzLCAvKio8IE1haW4gU3ludGhldGljIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfV0FWX1RBQl9TWU5USCAgICA9IDE0LCAvKio8IFdhdmV0YWJsZSBTeW50aGVzaXMgb2JqZWN0ICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfR0VOX01JREkgICAgICAgICA9IDE1LCAvKio8IEdlbmVyYWwgTUlESSBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfQUxHX1NZTlRIX0FVRF9GWCA9IDE2LCAvKio8IEFsZ29yaXRobWljIFN5bnRoZXNpcyBhbmQgQXVkaW8gRlggb2JqZWN0ICovCisgICAgQU9UX0VSX0FBQ19MQyAgICAgICAgPSAxNywgICAvKio8IEVycm9yIFJlc2lsaWVudChFUikgQUFDIExvdyBDb21wbGV4aXR5ICAgICovCisgICAgLy9BT1RfUlNWRF8xOCAgICAgICAgICA9IDE4LCAvKio8IChyZXNlcnZlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfRVJfQUFDX0xUUCAgICAgICA9IDE5LCAvKio8IEVycm9yIFJlc2lsaWVudChFUikgQUFDIExUUCBvYmplY3QgICAgICAgICovCisgICAgQU9UX0VSX0FBQ19TQ0FMICAgICAgPSAyMCwgICAvKio8IEVycm9yIFJlc2lsaWVudChFUikgQUFDIFNjYWxhYmxlIG9iamVjdCAgICovCisgICAgLy9BT1RfRVJfVFdJTl9WUSAgICAgICA9IDIxLCAvKio8IEVycm9yIFJlc2lsaWVudChFUikgVHdpblZRIG9iamVjdCAgICAgICAgICovCisgICAgQU9UX0VSX0JTQUMgICAgICAgICAgPSAyMiwgICAvKio8IEVycm9yIFJlc2lsaWVudChFUikgQlNBQyBvYmplY3QgICAgICAgICAgICovCisgICAgQU9UX0VSX0FBQ19MRCAgICAgICAgPSAyMywgICAvKio8IEVycm9yIFJlc2lsaWVudChFUikgQUFDIExvd0RlbGF5IG9iamVjdCAgICovCisgICAgLy9BT1RfRVJfQ0VMUCAgICAgICAgICA9IDI0LCAvKio8IEVycm9yIFJlc2lsaWVudChFUikgQ0VMUCBvYmplY3QgICAgICAgICAgICovCisgICAgLy9BT1RfRVJfSFZYQyAgICAgICAgICA9IDI1LCAvKio8IEVycm9yIFJlc2lsaWVudChFUikgSFZYQyBvYmplY3QgICAgICAgICAgICovCisgICAgLy9BT1RfRVJfSElMTiAgICAgICAgICA9IDI2LCAvKio8IEVycm9yIFJlc2lsaWVudChFUikgSElMTiBvYmplY3QgICAgICAgICAgICovCisgICAgLy9BT1RfRVJfUEFSQSAgICAgICAgICA9IDI3LCAvKio8IEVycm9yIFJlc2lsaWVudChFUikgUGFyYW1ldHJpYyBvYmplY3QgICAgICovCisgICAgLy9BT1RfUlNWRF8yOCAgICAgICAgICA9IDI4LCAvKio8IG1pZ2h0IGJlY29tZSBTU0MgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgQU9UX1BTICAgICAgICAgICAgICAgPSAyOSwgICAvKio8IFBTLCBQYXJhbWV0cmljIFN0ZXJlbyAoaW5jbHVkZXMgU0JSKSAgICAgICovCisgICAgLy9BT1RfTVBFR1MgICAgICAgICAgICA9IDMwLCAvKio8IE1QRUcgU3Vycm91bmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBBT1RfRVNDQVBFICAgICAgICAgICA9IDMxLCAgIC8qKjwgU2lnbmFsIEFPVCB1c2VzIG1vcmUgdGhhbiA1IGJpdHMgICAgICAgICAgKi8KKworICAgIC8vQU9UX01QM09OTVA0X0wxICAgICAgPSAzMiwgLyoqPCBNUEVHLUxheWVyMSBpbiBtcDQgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX01QM09OTVA0X0wyICAgICAgPSAzMywgLyoqPCBNUEVHLUxheWVyMiBpbiBtcDQgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX01QM09OTVA0X0wzICAgICAgPSAzNCwgLyoqPCBNUEVHLUxheWVyMyBpbiBtcDQgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX1JTVkRfMzUgICAgICAgICAgPSAzNSwgLyoqPCBtaWdodCBiZWNvbWUgRFNUICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX1JTVkRfMzYgICAgICAgICAgPSAzNiwgLyoqPCBtaWdodCBiZWNvbWUgQUxTICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX0FBQ19TTFMgICAgICAgICAgPSAzNywgLyoqPCBBQUMgKyBTTFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX1NMUyAgICAgICAgICAgICAgPSAzOCwgLyoqPCBTTFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8vQU9UX0VSX0FBQ19FTEQgICAgICAgPSAzOSwgLyoqPCBBQUMgRW5oYW5jZWQgTG93IERlbGF5ICAgICAgICAgICAgICAgICAgICAqLworCisgICAgLy9BT1RfVVNBQyAgICAgICAgICAgICA9IDQyLCAvKio8IFVTQUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfU0FPQyAgICAgICAgICAgICA9IDQzLCAvKio8IFNBT0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLy9BT1RfTERfTVBFR1MgICAgICAgICA9IDQ0LCAvKio8IExvdyBEZWxheSBNUEVHIFN1cnJvdW5kICAgICAgICAgICAgICAgICAgICovCisKKyAgICAvL0FPVF9SU1ZENTAgICAgICAgICAgID0gNTAsICAvKio8IEludGVyaW0gQU9UIGZvciBSc3ZkNTAgICAgICAgICAgICAgICAgICAgKi8KK30gQVVESU9fT0JKRUNUX1RZUEU7CisKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjp1cGRhdGVBdWRpb1RyYWNrSW5mb0Zyb21FU0RTX01QRUc0QXVkaW8oCisgICAgICAgIGNvbnN0IHZvaWQgKmVzZHNfZGF0YSwgc2l6ZV90IGVzZHNfc2l6ZSkgeworICAgIEVTRFMgZXNkcyhlc2RzX2RhdGEsIGVzZHNfc2l6ZSk7CisKKyAgICB1aW50OF90IG9iamVjdFR5cGVJbmRpY2F0aW9uOworICAgIGlmIChlc2RzLmdldE9iamVjdFR5cGVJbmRpY2F0aW9uKCZvYmplY3RUeXBlSW5kaWNhdGlvbikgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBpZiAob2JqZWN0VHlwZUluZGljYXRpb24gPT0gMHhlMSkgeworICAgICAgICAvLyBUaGlzIGlzbid0IE1QRUc0IGF1ZGlvIGF0IGFsbCwgaXQncyBRQ0VMUCAxNGsuLi4KKyAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKKyAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUUNFTFApOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaWYgKG9iamVjdFR5cGVJbmRpY2F0aW9uICA9PSAweDZiKSB7CisgICAgICAgIC8vIFRoZSBtZWRpYSBzdWJ0eXBlIGlzIE1QMyBhdWRpbworICAgICAgICAvLyBPdXIgc29mdHdhcmUgTVAzIGF1ZGlvIGRlY29kZXIgbWF5IG5vdCBiZSBhYmxlIHRvIGhhbmRsZQorICAgICAgICAvLyBwYWNrZXRpemVkIE1QMyBhdWRpbzsgZm9yIG5vdywgbGV0cyBqdXN0IHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRAorICAgICAgICBBTE9HRSgiTVAzIHRyYWNrIGluIE1QNC8zR1BQIGZpbGUgaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgaWYgKG1MYXN0VHJhY2sgIT0gTlVMTCkgeworICAgICAgICB1aW50MzJfdCBtYXhCaXRyYXRlID0gMDsKKyAgICAgICAgdWludDMyX3QgYXZnQml0cmF0ZSA9IDA7CisgICAgICAgIGVzZHMuZ2V0Qml0UmF0ZSgmbWF4Qml0cmF0ZSwgJmF2Z0JpdHJhdGUpOworICAgICAgICBpZiAobWF4Qml0cmF0ZSA+IDAgJiYgbWF4Qml0cmF0ZSA8IElOVDMyX01BWCkgeworICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5TWF4Qml0UmF0ZSwgKGludDMyX3QpbWF4Qml0cmF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2Z0JpdHJhdGUgPiAwICYmIGF2Z0JpdHJhdGUgPCBJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUJpdFJhdGUsIChpbnQzMl90KWF2Z0JpdHJhdGUpOworICAgICAgICB9CisgICAgfQorCisgICAgY29uc3QgdWludDhfdCAqY3NkOworICAgIHNpemVfdCBjc2Rfc2l6ZTsKKyAgICBpZiAoZXNkcy5nZXRDb2RlY1NwZWNpZmljSW5mbygKKyAgICAgICAgICAgICAgICAoY29uc3Qgdm9pZCAqKikmY3NkLCAmY3NkX3NpemUpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKGtVc2VIZXhEdW1wKSB7CisgICAgICAgIHByaW50ZigiRVNEIG9mIHNpemUgJXp1XG4iLCBjc2Rfc2l6ZSk7CisgICAgICAgIGhleGR1bXAoY3NkLCBjc2Rfc2l6ZSk7CisgICAgfQorCisgICAgaWYgKGNzZF9zaXplID09IDApIHsKKyAgICAgICAgLy8gVGhlcmUncyBubyBmdXJ0aGVyIGluZm9ybWF0aW9uLCBpLmUuIG5vIGNvZGVjIHNwZWNpZmljIGRhdGEKKyAgICAgICAgLy8gTGV0J3MgYXNzdW1lIHRoYXQgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGluIHRoZSBtcGVnNCBoZWFkZXJzCisgICAgICAgIC8vIGlzIGFjY3VyYXRlIGFuZCBob3BlIGZvciB0aGUgYmVzdC4KKworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaWYgKGNzZF9zaXplIDwgMikgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHN0YXRpYyB1aW50MzJfdCBrU2FtcGxpbmdSYXRlW10gPSB7CisgICAgICAgIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsIDI0MDAwLCAyMjA1MCwKKyAgICAgICAgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMCwgNzM1MAorICAgIH07CisKKyAgICBBQml0UmVhZGVyIGJyKGNzZCwgY3NkX3NpemUpOworICAgIHVpbnQzMl90IG9iamVjdFR5cGUgPSBici5nZXRCaXRzKDUpOworCisgICAgaWYgKG9iamVjdFR5cGUgPT0gMzEpIHsgIC8vIEFBQy1FTEQgPT4gYWRkaXRpb25hbCA2IGJpdHMKKyAgICAgICAgb2JqZWN0VHlwZSA9IDMyICsgYnIuZ2V0Qml0cyg2KTsKKyAgICB9CisKKyAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQorICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCisgICAgLy9rZWVwIEFPVCB0eXBlCisgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5QUFDQU9ULCBvYmplY3RUeXBlKTsKKworICAgIHVpbnQzMl90IGZyZXFJbmRleCA9IGJyLmdldEJpdHMoNCk7CisKKyAgICBpbnQzMl90IHNhbXBsZVJhdGUgPSAwOworICAgIGludDMyX3QgbnVtQ2hhbm5lbHMgPSAwOworICAgIGlmIChmcmVxSW5kZXggPT0gMTUpIHsKKyAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAyOCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgc2FtcGxlUmF0ZSA9IGJyLmdldEJpdHMoMjQpOworICAgICAgICBudW1DaGFubmVscyA9IGJyLmdldEJpdHMoNCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICBudW1DaGFubmVscyA9IGJyLmdldEJpdHMoNCk7CisKKyAgICAgICAgaWYgKGZyZXFJbmRleCA9PSAxMyB8fCBmcmVxSW5kZXggPT0gMTQpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBzYW1wbGVSYXRlID0ga1NhbXBsaW5nUmF0ZVtmcmVxSW5kZXhdOworICAgIH0KKworICAgIGlmIChvYmplY3RUeXBlID09IEFPVF9TQlIgfHwgb2JqZWN0VHlwZSA9PSBBT1RfUFMpIHsvL1NCUiBzcGVjaWZpYyBjb25maWcgcGVyIDE0NDk2LTMgdGFibGUgMS4xMworICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDQpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHVpbnQzMl90IGV4dEZyZXFJbmRleCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgIGludDMyX3QgZXh0U2FtcGxlUmF0ZSBfX3VudXNlZDsKKyAgICAgICAgaWYgKGV4dEZyZXFJbmRleCA9PSAxNSkgeworICAgICAgICAgICAgaWYgKGNzZF9zaXplIDwgOCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDI0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgZXh0U2FtcGxlUmF0ZSA9IGJyLmdldEJpdHMoMjQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGV4dEZyZXFJbmRleCA9PSAxMyB8fCBleHRGcmVxSW5kZXggPT0gMTQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXh0U2FtcGxlUmF0ZSA9IGtTYW1wbGluZ1JhdGVbZXh0RnJlcUluZGV4XTsKKyAgICAgICAgfQorICAgICAgICAvL1RPRE86IHNhdmUgdGhlIGV4dGVuc2lvbiBzYW1wbGluZyByYXRlIHZhbHVlIGluIG1ldGEgZGF0YSA9PgorICAgICAgICAvLyAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUV4dFNhbXBsZVJhdGUsIGV4dFNhbXBsZVJhdGUpOworICAgIH0KKworICAgIHN3aXRjaCAobnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgLy8gdmFsdWVzIGRlZmluZWQgaW4gMTQ0OTYtM18yMDA5IGFtZW5kbWVudC00IFRhYmxlIDEuMTkgLSBDaGFubmVsIENvbmZpZ3VyYXRpb24KKyAgICAgICAgY2FzZSAwOgorICAgICAgICBjYXNlIDE6Ly8gRkMKKyAgICAgICAgY2FzZSAyOi8vIEZMIEZSCisgICAgICAgIGNhc2UgMzovLyBGQywgRkwgRlIKKyAgICAgICAgY2FzZSA0Oi8vIEZDLCBGTCBGUiwgUkMKKyAgICAgICAgY2FzZSA1Oi8vIEZDLCBGTCBGUiwgU0wgU1IKKyAgICAgICAgY2FzZSA2Oi8vIEZDLCBGTCBGUiwgU0wgU1IsIExGRQorICAgICAgICAgICAgLy9udW1DaGFubmVscyBhbHJlYWR5IGNvbnRhaW5zIHRoZSByaWdodCB2YWx1ZQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTE6Ly8gRkMsIEZMIEZSLCBTTCBTUiwgUkMsIExGRQorICAgICAgICAgICAgbnVtQ2hhbm5lbHMgPSA3OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzogLy8gRkMsIEZDTCBGQ1IsIEZMIEZSLCBTTCBTUiwgTEZFCisgICAgICAgIGNhc2UgMTI6Ly8gRkMsIEZMICBGUiwgIFNMIFNSLCBSTCBSUiwgTEZFCisgICAgICAgIGNhc2UgMTQ6Ly8gRkMsIEZMICBGUiwgIFNMIFNSLCBMRkUsIEZITCBGSFIKKyAgICAgICAgICAgIG51bUNoYW5uZWxzID0gODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIHsKKyAgICAgICAgaWYgKG9iamVjdFR5cGUgPT0gQU9UX1NCUiB8fCBvYmplY3RUeXBlID09IEFPVF9QUykgeworICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA1KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgb2JqZWN0VHlwZSA9IGJyLmdldEJpdHMoNSk7CisKKyAgICAgICAgICAgIGlmIChvYmplY3RUeXBlID09IEFPVF9FU0NBUEUpIHsKKyAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDYpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgb2JqZWN0VHlwZSA9IDMyICsgYnIuZ2V0Qml0cyg2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfQUFDX0xDIHx8IG9iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19MQyB8fAorICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19MRCB8fCBvYmplY3RUeXBlID09IEFPVF9FUl9BQUNfU0NBTCB8fAorICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgPT0gQU9UX0VSX0JTQUMpIHsKKyAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMikgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZnJhbWVMZW5ndGhGbGFnIF9fdW51c2VkID0gYnIuZ2V0Qml0cygxKTsKKworICAgICAgICAgICAgY29uc3QgaW50MzJfdCBkZXBlbmRzT25Db3JlQ29kZXIgPSBici5nZXRCaXRzKDEpOworCisgICAgICAgICAgICBpZiAoZGVwZW5kc09uQ29yZUNvZGVyICkgeworICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMTQpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBjb3JlQ29kZXJEZWxheSBfX3VudXNlZCA9IGJyLmdldEJpdHMoMTQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQzMl90IGV4dGVuc2lvbkZsYWcgPSAtMTsKKyAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpID4gMCkgeworICAgICAgICAgICAgICAgIGV4dGVuc2lvbkZsYWcgPSBici5nZXRCaXRzKDEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG9iamVjdFR5cGUpIHsKKyAgICAgICAgICAgICAgICAvLyAxNDQ5Ni0zIDQuNS4xLjEgZXh0ZW5zaW9uRmxhZworICAgICAgICAgICAgICAgIGNhc2UgQU9UX0FBQ19MQzoKKyAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uRmxhZyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQU9UX0VSX0FBQ19MQzoKKyAgICAgICAgICAgICAgICBjYXNlIEFPVF9FUl9BQUNfU0NBTDoKKyAgICAgICAgICAgICAgICBjYXNlIEFPVF9FUl9CU0FDOgorICAgICAgICAgICAgICAgIGNhc2UgQU9UX0VSX0FBQ19MRDoKKyAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uRmxhZyA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVygiY3NkIG1pc3NpbmcgZXh0ZW5zaW9uIGZsYWc7IGFzc3VtaW5nICVkIGZvciBvYmplY3QgdHlwZSAldS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uRmxhZywgb2JqZWN0VHlwZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChudW1DaGFubmVscyA9PSAwKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsc0VmZmVjdGl2ZU51bSA9IDA7CisgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsc051bSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAzMikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEVsZW1lbnRJbnN0YW5jZVRhZyBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBQcm9maWxlIF9fdW51c2VkID0gYnIuZ2V0Qml0cygyKTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFNhbXBsaW5nRnJlcXVlbmN5SW5kZXggX191bnVzZWQgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtRnJvbnRDaGFubmVsRWxlbWVudHMgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtU2lkZUNoYW5uZWxFbGVtZW50cyA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1CYWNrQ2hhbm5lbEVsZW1lbnRzID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bUxmZUNoYW5uZWxFbGVtZW50cyA9IGJyLmdldEJpdHMoMik7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1Bc3NvY0RhdGFFbGVtZW50cyBfX3VudXNlZCA9IGJyLmdldEJpdHMoMyk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1WYWxpZENjRWxlbWVudHMgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOworCisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNb25vTWl4ZG93blByZXNlbnQgPSBici5nZXRCaXRzKDEpOworCisgICAgICAgICAgICAgICAgaWYgKE1vbm9NaXhkb3duUHJlc2VudCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNb25vTWl4ZG93bkVsZW1lbnROdW1iZXIgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMSkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFN0ZXJlb01peGRvd25QcmVzZW50ID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgICAgICBpZiAoU3RlcmVvTWl4ZG93blByZXNlbnQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDQpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgU3RlcmVvTWl4ZG93bkVsZW1lbnROdW1iZXIgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMSkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE1hdHJpeE1peGRvd25JbmRleFByZXNlbnQgPSBici5nZXRCaXRzKDEpOworICAgICAgICAgICAgICAgIGlmIChNYXRyaXhNaXhkb3duSW5kZXhQcmVzZW50ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAzKSByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE1hdHJpeE1peGRvd25JbmRleCBfX3VudXNlZCA9IGJyLmdldEJpdHMoMik7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgUHNldWRvU3Vycm91bmRFbmFibGUgX191bnVzZWQgPSBici5nZXRCaXRzKDEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgTnVtRnJvbnRDaGFubmVsRWxlbWVudHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDUpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgRnJvbnRFbGVtZW50SXNDcGUgPSBici5nZXRCaXRzKDEpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEZyb250RWxlbWVudFRhZ1NlbGVjdCBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzTnVtICs9IEZyb250RWxlbWVudElzQ3BlID8gMiA6IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBOdW1TaWRlQ2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA1KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFNpZGVFbGVtZW50SXNDcGUgPSBici5nZXRCaXRzKDEpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFNpZGVFbGVtZW50VGFnU2VsZWN0IF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNOdW0gKz0gU2lkZUVsZW1lbnRJc0NwZSA/IDIgOiAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgTnVtQmFja0NoYW5uZWxFbGVtZW50czsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNSkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBCYWNrRWxlbWVudElzQ3BlID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBCYWNrRWxlbWVudFRhZ1NlbGVjdCBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzTnVtICs9IEJhY2tFbGVtZW50SXNDcGUgPyAyIDogMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2hhbm5lbHNFZmZlY3RpdmVOdW0gPSBjaGFubmVsc051bTsKKworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgTnVtTGZlQ2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IExmZUVsZW1lbnRUYWdTZWxlY3QgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgICAgICBjaGFubmVsc051bSArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigibXBlZzQgYXVkaW8gY2hhbm5lbHNOdW0gPSAlZCIsIGNoYW5uZWxzTnVtKTsKKyAgICAgICAgICAgICAgICBBTE9HVigibXBlZzQgYXVkaW8gY2hhbm5lbHNFZmZlY3RpdmVOdW0gPSAlZCIsIGNoYW5uZWxzRWZmZWN0aXZlTnVtKTsKKyAgICAgICAgICAgICAgICBudW1DaGFubmVscyA9IGNoYW5uZWxzTnVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG51bUNoYW5uZWxzID09IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKKyAgICBpbnQzMl90IHByZXZTYW1wbGVSYXRlOworICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmcHJldlNhbXBsZVJhdGUpKTsKKworICAgIGlmIChwcmV2U2FtcGxlUmF0ZSAhPSBzYW1wbGVSYXRlKSB7CisgICAgICAgIEFMT0dWKCJtcGVnNCBhdWRpbyBzYW1wbGUgcmF0ZSBkaWZmZXJlbnQgZnJvbSBwcmV2aW91cyBzZXR0aW5nLiAiCisgICAgICAgICAgICAgIndhczogJWQsIG5vdzogJWQiLCBwcmV2U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CisgICAgfQorCisgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CisKKyAgICBpbnQzMl90IHByZXZDaGFubmVsQ291bnQ7CisgICAgQ0hFQ0sobUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJnByZXZDaGFubmVsQ291bnQpKTsKKworICAgIGlmIChwcmV2Q2hhbm5lbENvdW50ICE9IG51bUNoYW5uZWxzKSB7CisgICAgICAgIEFMT0dWKCJtcGVnNCBhdWRpbyBjaGFubmVsIGNvdW50IGRpZmZlcmVudCBmcm9tIHByZXZpb3VzIHNldHRpbmcuICIKKyAgICAgICAgICAgICAid2FzOiAlZCwgbm93OiAlZCIsIHByZXZDaGFubmVsQ291bnQsIG51bUNoYW5uZWxzKTsKKyAgICB9CisKKyAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bUNoYW5uZWxzKTsKKworICAgIHJldHVybiBPSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworTVBFRzRTb3VyY2U6Ok1QRUc0U291cmNlKAorICAgICAgICBNZXRhRGF0YUJhc2UgJmZvcm1hdCwKKyAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCisgICAgICAgIGludDMyX3QgdGltZVNjYWxlLAorICAgICAgICBjb25zdCBzcDxTYW1wbGVUYWJsZT4gJnNhbXBsZVRhYmxlLAorICAgICAgICBWZWN0b3I8U2lkeEVudHJ5PiAmc2lkeCwKKyAgICAgICAgY29uc3QgVHJleCAqdHJleCwKKyAgICAgICAgb2ZmNjRfdCBmaXJzdE1vb2ZPZmZzZXQsCisgICAgICAgIGNvbnN0IHNwPEl0ZW1UYWJsZT4gJml0ZW1UYWJsZSkKKyAgICA6IG1Gb3JtYXQoZm9ybWF0KSwKKyAgICAgIG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAorICAgICAgbVRpbWVzY2FsZSh0aW1lU2NhbGUpLAorICAgICAgbVNhbXBsZVRhYmxlKHNhbXBsZVRhYmxlKSwKKyAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXgoMCksCisgICAgICBtQ3VycmVudEZyYWdtZW50SW5kZXgoMCksCisgICAgICBtU2VnbWVudHMoc2lkeCksCisgICAgICBtVHJleCh0cmV4KSwKKyAgICAgIG1GaXJzdE1vb2ZPZmZzZXQoZmlyc3RNb29mT2Zmc2V0KSwKKyAgICAgIG1DdXJyZW50TW9vZk9mZnNldChmaXJzdE1vb2ZPZmZzZXQpLAorICAgICAgbU5leHRNb29mT2Zmc2V0KC0xKSwKKyAgICAgIG1DdXJyZW50VGltZSgwKSwKKyAgICAgIG1DdXJyZW50U2FtcGxlSW5mb0FsbG9jU2l6ZSgwKSwKKyAgICAgIG1DdXJyZW50U2FtcGxlSW5mb1NpemVzKE5VTEwpLAorICAgICAgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0c0FsbG9jU2l6ZSgwKSwKKyAgICAgIG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHMoTlVMTCksCisgICAgICBtSXNBVkMoZmFsc2UpLAorICAgICAgbUlzSEVWQyhmYWxzZSksCisgICAgICBtTkFMTGVuZ3RoU2l6ZSgwKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1Hcm91cChOVUxMKSwKKyAgICAgIG1CdWZmZXIoTlVMTCksCisgICAgICBtV2FudHNOQUxGcmFnbWVudHMoZmFsc2UpLAorICAgICAgbVNyY0J1ZmZlcihOVUxMKSwKKyAgICAgIG1Jc0hlaWYoaXRlbVRhYmxlICE9IE5VTEwpLAorICAgICAgbUl0ZW1UYWJsZShpdGVtVGFibGUpIHsKKworICAgIG1lbXNldCgmbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLCAwLCBzaXplb2YobVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvKSk7CisKKyAgICBtRm9ybWF0LmZpbmRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgJm1DcnlwdG9Nb2RlKTsKKyAgICBtRGVmYXVsdElWU2l6ZSA9IDA7CisgICAgbUZvcm1hdC5maW5kSW50MzIoa0tleUNyeXB0b0RlZmF1bHRJVlNpemUsICZtRGVmYXVsdElWU2l6ZSk7CisgICAgdWludDMyX3Qga2V5dHlwZTsKKyAgICBjb25zdCB2b2lkICprZXk7CisgICAgc2l6ZV90IGtleXNpemU7CisgICAgaWYgKG1Gb3JtYXQuZmluZERhdGEoa0tleUNyeXB0b0tleSwgJmtleXR5cGUsICZrZXksICZrZXlzaXplKSkgeworICAgICAgICBDSEVDSyhrZXlzaXplIDw9IDE2KTsKKyAgICAgICAgbWVtc2V0KG1DcnlwdG9LZXksIDAsIDE2KTsKKyAgICAgICAgbWVtY3B5KG1DcnlwdG9LZXksIGtleSwga2V5c2l6ZSk7CisgICAgfQorCisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBib29sIHN1Y2Nlc3MgPSBtRm9ybWF0LmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOworICAgIENIRUNLKHN1Y2Nlc3MpOworCisgICAgbUlzQVZDID0gIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICBtSXNIRVZDID0gIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQykgfHwKKyAgICAgICAgICAgICAgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDKTsKKworICAgIGlmIChtSXNBVkMpIHsKKyAgICAgICAgdWludDMyX3QgdHlwZTsKKyAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIENIRUNLKGZvcm1hdC5maW5kRGF0YShrS2V5QVZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpOworCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKKworICAgICAgICBDSEVDSyhzaXplID49IDcpOworICAgICAgICBDSEVDS19FUSgodW5zaWduZWQpcHRyWzBdLCAxdSk7ICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbiA9PSAxCisKKyAgICAgICAgLy8gVGhlIG51bWJlciBvZiBieXRlcyB1c2VkIHRvIGVuY29kZSB0aGUgbGVuZ3RoIG9mIGEgTkFMIHVuaXQuCisgICAgICAgIG1OQUxMZW5ndGhTaXplID0gMSArIChwdHJbNF0gJiAzKTsKKyAgICB9IGVsc2UgaWYgKG1Jc0hFVkMpIHsKKyAgICAgICAgdWludDMyX3QgdHlwZTsKKyAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIENIRUNLKGZvcm1hdC5maW5kRGF0YShrS2V5SFZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpOworCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKKworICAgICAgICBDSEVDSyhzaXplID49IDIyKTsKKyAgICAgICAgQ0hFQ0tfRVEoKHVuc2lnbmVkKXB0clswXSwgMXUpOyAgLy8gY29uZmlndXJhdGlvblZlcnNpb24gPT0gMQorCisgICAgICAgIG1OQUxMZW5ndGhTaXplID0gMSArIChwdHJbMTQgKyA3XSAmIDMpOworICAgIH0KKworICAgIENIRUNLKGZvcm1hdC5maW5kSW50MzIoa0tleVRyYWNrSUQsICZtVHJhY2tJZCkpOworCit9CisKK3N0YXR1c190IE1QRUc0U291cmNlOjppbml0KCkgeworICAgIGlmIChtRmlyc3RNb29mT2Zmc2V0ICE9IDApIHsKKyAgICAgICAgb2ZmNjRfdCBvZmZzZXQgPSBtRmlyc3RNb29mT2Zmc2V0OworICAgICAgICByZXR1cm4gcGFyc2VDaHVuaygmb2Zmc2V0KTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitNUEVHNFNvdXJjZTo6fk1QRUc0U291cmNlKCkgeworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICBzdG9wKCk7CisgICAgfQorICAgIGZyZWUobUN1cnJlbnRTYW1wbGVJbmZvU2l6ZXMpOworICAgIGZyZWUobUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0cyk7Cit9CisKK3N0YXR1c190IE1QRUc0U291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBDSEVDSyghbVN0YXJ0ZWQpOworCisgICAgaW50MzJfdCB2YWw7CisgICAgaWYgKHBhcmFtcyAmJiBwYXJhbXMtPmZpbmRJbnQzMihrS2V5V2FudHNOQUxGcmFnbWVudHMsICZ2YWwpCisgICAgICAgICYmIHZhbCAhPSAwKSB7CisgICAgICAgIG1XYW50c05BTEZyYWdtZW50cyA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVdhbnRzTkFMRnJhZ21lbnRzID0gZmFsc2U7CisgICAgfQorCisgICAgaW50MzJfdCB0bXA7CisgICAgQ0hFQ0sobUZvcm1hdC5maW5kSW50MzIoa0tleU1heElucHV0U2l6ZSwgJnRtcCkpOworICAgIHNpemVfdCBtYXhfc2l6ZSA9IHRtcDsKKworICAgIC8vIEEgc29tZXdoYXQgYXJiaXRyYXJ5IGxpbWl0IHRoYXQgc2hvdWxkIGJlIHN1ZmZpY2llbnQgZm9yIDhrIHZpZGVvIGZyYW1lcworICAgIC8vIElmIHlvdSBzZWUgdGhlIG1lc3NhZ2UgYmVsb3cgZm9yIGEgdmFsaWQgaW5wdXQgc3RyZWFtOiBpbmNyZWFzZSB0aGUgbGltaXQKKyAgICBjb25zdCBzaXplX3Qga01heEJ1ZmZlclNpemUgPSA2NCAqIDEwMjQgKiAxMDI0OworICAgIGlmIChtYXhfc2l6ZSA+IGtNYXhCdWZmZXJTaXplKSB7CisgICAgICAgIEFMT0dFKCJib2d1cyBtYXggaW5wdXQgc2l6ZTogJXp1ID4gJXp1IiwgbWF4X3NpemUsIGtNYXhCdWZmZXJTaXplKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgaWYgKG1heF9zaXplID09IDApIHsKKyAgICAgICAgQUxPR0UoInplcm8gbWF4IGlucHV0IHNpemUiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICAvLyBBbGxvdyB1cCB0byBrTWF4QnVmZmVycywgYnV0IG5vdCBpZiB0aGUgdG90YWwgZXhjZWVkcyBrTWF4QnVmZmVyU2l6ZS4KKyAgICBjb25zdCBzaXplX3Qga01heEJ1ZmZlcnMgPSA4OworICAgIGNvbnN0IHNpemVfdCBidWZmZXJzID0gbWluKGtNYXhCdWZmZXJTaXplIC8gbWF4X3NpemUsIGtNYXhCdWZmZXJzKTsKKyAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cChidWZmZXJzLCBtYXhfc2l6ZSk7CisgICAgbVNyY0J1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W21heF9zaXplXTsKKyAgICBpZiAobVNyY0J1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIC8vIGZpbGUgcHJvYmFibHkgc3BlY2lmaWVkIGEgYmFkIG1heCBzaXplCisgICAgICAgIGRlbGV0ZSBtR3JvdXA7CisgICAgICAgIG1Hcm91cCA9IE5VTEw7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgbVN0YXJ0ZWQgPSB0cnVlOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUEVHNFNvdXJjZTo6c3RvcCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgQ0hFQ0sobVN0YXJ0ZWQpOworCisgICAgaWYgKG1CdWZmZXIgIT0gTlVMTCkgeworICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgIH0KKworICAgIGRlbGV0ZVtdIG1TcmNCdWZmZXI7CisgICAgbVNyY0J1ZmZlciA9IE5VTEw7CisKKyAgICBkZWxldGUgbUdyb3VwOworICAgIG1Hcm91cCA9IE5VTEw7CisKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSAwOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUEVHNFNvdXJjZTo6cGFyc2VDaHVuayhvZmY2NF90ICpvZmZzZXQpIHsKKyAgICB1aW50MzJfdCBoZHJbMl07CisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgaGRyLCA4KSA8IDgpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICB1aW50NjRfdCBjaHVua19zaXplID0gbnRvaGwoaGRyWzBdKTsKKyAgICB1aW50MzJfdCBjaHVua190eXBlID0gbnRvaGwoaGRyWzFdKTsKKyAgICBvZmY2NF90IGRhdGFfb2Zmc2V0ID0gKm9mZnNldCArIDg7CisKKyAgICBpZiAoY2h1bmtfc2l6ZSA9PSAxKSB7CisgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KCpvZmZzZXQgKyA4LCAmY2h1bmtfc2l6ZSwgOCkgPCA4KSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKyAgICAgICAgY2h1bmtfc2l6ZSA9IG50b2g2NChjaHVua19zaXplKTsKKyAgICAgICAgZGF0YV9vZmZzZXQgKz0gODsKKworICAgICAgICBpZiAoY2h1bmtfc2l6ZSA8IDE2KSB7CisgICAgICAgICAgICAvLyBUaGUgc21hbGxlc3QgdmFsaWQgY2h1bmsgaXMgMTYgYnl0ZXMgbG9uZyBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChjaHVua19zaXplIDwgOCkgeworICAgICAgICAvLyBUaGUgc21hbGxlc3QgdmFsaWQgY2h1bmsgaXMgOCBieXRlcyBsb25nLgorICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGNoYXIgY2h1bmtbNV07CisgICAgTWFrZUZvdXJDQ1N0cmluZyhjaHVua190eXBlLCBjaHVuayk7CisgICAgQUxPR1YoIk1QRUc0U291cmNlIGNodW5rICVzIEAgJSNsbHgiLCBjaHVuaywgKGxvbmcgbG9uZykqb2Zmc2V0KTsKKworICAgIG9mZjY0X3QgY2h1bmtfZGF0YV9zaXplID0gKm9mZnNldCArIGNodW5rX3NpemUgLSBkYXRhX29mZnNldDsKKworICAgIHN3aXRjaChjaHVua190eXBlKSB7CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAncicsICdhJywgJ2YnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ2YnKTogeworICAgICAgICAgICAgb2ZmNjRfdCBzdG9wX29mZnNldCA9ICpvZmZzZXQgKyBjaHVua19zaXplOworICAgICAgICAgICAgKm9mZnNldCA9IGRhdGFfb2Zmc2V0OworICAgICAgICAgICAgd2hpbGUgKCpvZmZzZXQgPCBzdG9wX29mZnNldCkgeworICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsob2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICdmJykpIHsKKyAgICAgICAgICAgICAgICAvLyAqb2Zmc2V0IHBvaW50cyB0byB0aGUgYm94IGZvbGxvd2luZyB0aGlzIG1vb2YuIEZpbmQgdGhlIG5leHQgbW9vZiBmcm9tIHRoZXJlLgorCisgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgaGRyLCA4KSA8IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIG1vcmUgYm94IHRvIHRoZSBlbmQgb2YgZmlsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNodW5rX3NpemUgPSBudG9obChoZHJbMF0pOworICAgICAgICAgICAgICAgICAgICBjaHVua190eXBlID0gbnRvaGwoaGRyWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNodW5rX3NpemUgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSVNPL0lFQyAxNDQ5Ni0xMjoyMDEyLCA4LjguNCBNb3ZpZSBGcmFnbWVudCBCb3gsIG1vb2YgaXMgYSBCb3gKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGlzIGRlZmluZWQgaW4gNC4yIE9iamVjdCBTdHJ1Y3R1cmUuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIGNodW5rX3NpemU9PTEsIDggYnl0ZXMgZm9sbG93cyBhcyAibGFyZ2VzaXplIi4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KCpvZmZzZXQgKyA4LCAmY2h1bmtfc2l6ZSwgOCkgPCA4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtfc2l6ZSA9IG50b2g2NChjaHVua19zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaHVua19zaXplIDwgMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc21hbGxlc3QgdmFsaWQgY2h1bmsgaXMgMTYgYnl0ZXMgbG9uZyBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaHVua19zaXplID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgYm94IGV4dGVuZHMgdG8gZW5kIG9mIGZpbGUuCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2h1bmtfc2l6ZSA8IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzbWFsbGVzdCB2YWxpZCBjaHVuayBpcyA4IGJ5dGVzIGxvbmcgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygnbScsICdvJywgJ28nLCAnZicpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTmV4dE1vb2ZPZmZzZXQgPSAqb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2h1bmtfc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygndCcsICdmJywgJ2gnLCAnZCcpOiB7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICAgICAgICAgIGlmICgoZXJyID0gcGFyc2VUcmFja0ZyYWdtZW50SGVhZGVyKGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpKSAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygndCcsICdyJywgJ3UnLCAnbicpOiB7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICAgICAgICAgIGlmIChtTGFzdFBhcnNlZFRyYWNrSWQgPT0gbVRyYWNrSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChlcnIgPSBwYXJzZVRyYWNrRnJhZ21lbnRSdW4oZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSkpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnYScsICdpJywgJ3onKTogeworICAgICAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICAgICAgaWYgKChlcnIgPSBwYXJzZVNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uU2l6ZXMoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSkpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ2EnLCAnaScsICdvJyk6IHsKKyAgICAgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgICAgIGlmICgoZXJyID0gcGFyc2VTYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvbk9mZnNldHMoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSkpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZCcsICdhJywgJ3QnKTogeworICAgICAgICAgICAgLy8gcGFyc2UgRFJNIGluZm8gaWYgcHJlc2VudAorICAgICAgICAgICAgQUxPR1YoIk1QRUc0U291cmNlOjpwYXJzZUNodW5rIG1kYXQiKTsKKyAgICAgICAgICAgIC8vIGlmIHNhaXovc2FvaSB3YXMgcHJldmlvdXNseSBvYnNlcnZlZCwgZG8gc29tZXRoaW5nIHdpdGggdGhlIHNhbXBsZWluZm9zCisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnBhcnNlU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25TaXplcygKKyAgICAgICAgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgLyogc2l6ZSAqLykgeworICAgIEFMT0dWKCJwYXJzZVNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uU2l6ZXMiKTsKKyAgICAvLyAxNDQ5Ni0xMiA4LjcuMTIKKyAgICB1aW50OF90IHZlcnNpb247CisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICBvZmZzZXQsICZ2ZXJzaW9uLCBzaXplb2YodmVyc2lvbikpCisgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZih2ZXJzaW9uKSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorCisgICAgaWYgKHZlcnNpb24gIT0gMCkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorICAgIG9mZnNldCsrOworCisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDI0KG9mZnNldCwgJmZsYWdzKSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorICAgIG9mZnNldCArPSAzOworCisgICAgaWYgKGZsYWdzICYgMSkgeworICAgICAgICB1aW50MzJfdCB0bXA7CisgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZ0bXApKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIG1DdXJyZW50QXV4SW5mb1R5cGUgPSB0bXA7CisgICAgICAgIG9mZnNldCArPSA0OworICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmdG1wKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICBtQ3VycmVudEF1eEluZm9UeXBlUGFyYW1ldGVyID0gdG1wOworICAgICAgICBvZmZzZXQgKz0gNDsKKyAgICB9CisKKyAgICB1aW50OF90IGRlZnNpemU7CisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCAmZGVmc2l6ZSwgMSkgIT0gMSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICBtQ3VycmVudERlZmF1bHRTYW1wbGVJbmZvU2l6ZSA9IGRlZnNpemU7CisgICAgb2Zmc2V0Kys7CisKKyAgICB1aW50MzJfdCBzbXBsY250OworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZzbXBsY250KSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICBtQ3VycmVudFNhbXBsZUluZm9Db3VudCA9IHNtcGxjbnQ7CisgICAgb2Zmc2V0ICs9IDQ7CisKKyAgICBpZiAobUN1cnJlbnREZWZhdWx0U2FtcGxlSW5mb1NpemUgIT0gMCkgeworICAgICAgICBBTE9HVigiQEBAQCB1c2luZyBkZWZhdWx0IHNhbXBsZSBpbmZvIHNpemUgb2YgJWQiLCBtQ3VycmVudERlZmF1bHRTYW1wbGVJbmZvU2l6ZSk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgaWYgKHNtcGxjbnQgPiBtQ3VycmVudFNhbXBsZUluZm9BbGxvY1NpemUpIHsKKyAgICAgICAgdWludDhfdCAqIG5ld1B0ciA9ICAodWludDhfdCopIHJlYWxsb2MobUN1cnJlbnRTYW1wbGVJbmZvU2l6ZXMsIHNtcGxjbnQpOworICAgICAgICBpZiAobmV3UHRyID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gcmVhbGxvYyAldSAtPiAldSIsIG1DdXJyZW50U2FtcGxlSW5mb0FsbG9jU2l6ZSwgc21wbGNudCk7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIG1DdXJyZW50U2FtcGxlSW5mb1NpemVzID0gbmV3UHRyOworICAgICAgICBtQ3VycmVudFNhbXBsZUluZm9BbGxvY1NpemUgPSBzbXBsY250OworICAgIH0KKworICAgIG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBtQ3VycmVudFNhbXBsZUluZm9TaXplcywgc21wbGNudCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUEVHNFNvdXJjZTo6cGFyc2VTYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvbk9mZnNldHMoCisgICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IC8qIHNpemUgKi8pIHsKKyAgICBBTE9HVigicGFyc2VTYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvbk9mZnNldHMiKTsKKyAgICAvLyAxNDQ5Ni0xMiA4LjcuMTMKKyAgICB1aW50OF90IHZlcnNpb247CisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCAmdmVyc2lvbiwgc2l6ZW9mKHZlcnNpb24pKSAhPSAxKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgb2Zmc2V0Kys7CisKKyAgICB1aW50MzJfdCBmbGFnczsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MjQob2Zmc2V0LCAmZmxhZ3MpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgb2Zmc2V0ICs9IDM7CisKKyAgICB1aW50MzJfdCBlbnRyeWNvdW50OworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZlbnRyeWNvdW50KSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorICAgIG9mZnNldCArPSA0OworICAgIGlmIChlbnRyeWNvdW50ID09IDApIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBpZiAoZW50cnljb3VudCA+IFVJTlQzMl9NQVggLyA4KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKGVudHJ5Y291bnQgPiBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzQWxsb2NTaXplKSB7CisgICAgICAgIHVpbnQ2NF90ICpuZXdQdHIgPSAodWludDY0X3QgKilyZWFsbG9jKG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHMsIGVudHJ5Y291bnQgKiA4KTsKKyAgICAgICAgaWYgKG5ld1B0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHJlYWxsb2MgJXUgLT4gJXUiLCBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzQWxsb2NTaXplLCBlbnRyeWNvdW50ICogOCk7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHMgPSBuZXdQdHI7CisgICAgICAgIG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHNBbGxvY1NpemUgPSBlbnRyeWNvdW50OworICAgIH0KKyAgICBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRDb3VudCA9IGVudHJ5Y291bnQ7CisKKyAgICBpZiAobUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0cyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5Y291bnQ7IGkrKykgeworICAgICAgICBpZiAodmVyc2lvbiA9PSAwKSB7CisgICAgICAgICAgICB1aW50MzJfdCB0bXA7CisgICAgICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmdG1wKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHNbaV0gPSB0bXA7CisgICAgICAgICAgICBvZmZzZXQgKz0gNDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHRtcDsKKyAgICAgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQ2NChvZmZzZXQsICZ0bXApKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0c1tpXSA9IHRtcDsKKyAgICAgICAgICAgIG9mZnNldCArPSA4OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gcGFyc2UgY2xlYXIvZW5jcnlwdGVkIGRhdGEKKworICAgIG9mZjY0X3QgZHJtb2Zmc2V0ID0gbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0c1swXTsgLy8gZnJvbSBtb29mCisKKyAgICBkcm1vZmZzZXQgKz0gbUN1cnJlbnRNb29mT2Zmc2V0OworICAgIGludCBpdmxlbmd0aDsKKyAgICBDSEVDSyhtRm9ybWF0LmZpbmRJbnQzMihrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSwgJml2bGVuZ3RoKSk7CisKKyAgICAvLyBvbmx5IDAsIDggYW5kIDE2IGJ5dGUgaW5pdGlhbGl6YXRpb24gdmVjdG9ycyBhcmUgc3VwcG9ydGVkCisgICAgaWYgKGl2bGVuZ3RoICE9IDAgJiYgaXZsZW5ndGggIT0gOCAmJiBpdmxlbmd0aCAhPSAxNikgeworICAgICAgICBBTE9HVygidW5zdXBwb3J0ZWQgSVYgbGVuZ3RoOiAlZCIsIGl2bGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgLy8gcmVhZCBDZW5jU2FtcGxlQXV4aWxpYXJ5RGF0YUZvcm1hdHMKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DdXJyZW50U2FtcGxlSW5mb0NvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKGkgPj0gbUN1cnJlbnRTYW1wbGVzLnNpemUoKSkgeworICAgICAgICAgICAgQUxPR1coInRvbyBmZXcgc2FtcGxlcyIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgU2FtcGxlICpzbXBsID0gJm1DdXJyZW50U2FtcGxlcy5lZGl0SXRlbUF0KGkpOworCisgICAgICAgIG1lbXNldChzbXBsLT5pdiwgMCwgMTYpOworICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkcm1vZmZzZXQsIHNtcGwtPml2LCBpdmxlbmd0aCkgIT0gaXZsZW5ndGgpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorCisgICAgICAgIGRybW9mZnNldCArPSBpdmxlbmd0aDsKKworICAgICAgICBpbnQzMl90IHNtcGxpbmZvc2l6ZSA9IG1DdXJyZW50RGVmYXVsdFNhbXBsZUluZm9TaXplOworICAgICAgICBpZiAoc21wbGluZm9zaXplID09IDApIHsKKyAgICAgICAgICAgIHNtcGxpbmZvc2l6ZSA9IG1DdXJyZW50U2FtcGxlSW5mb1NpemVzW2ldOworICAgICAgICB9CisgICAgICAgIGlmIChzbXBsaW5mb3NpemUgPiBpdmxlbmd0aCkgeworICAgICAgICAgICAgdWludDE2X3QgbnVtc3Vic2FtcGxlczsKKyAgICAgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQxNihkcm1vZmZzZXQsICZudW1zdWJzYW1wbGVzKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRybW9mZnNldCArPSAyOworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBudW1zdWJzYW1wbGVzOyBqKyspIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBudW1jbGVhcjsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBudW1lbmNyeXB0ZWQ7CisgICAgICAgICAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDE2KGRybW9mZnNldCwgJm51bWNsZWFyKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRybW9mZnNldCArPSAyOworICAgICAgICAgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihkcm1vZmZzZXQsICZudW1lbmNyeXB0ZWQpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZHJtb2Zmc2V0ICs9IDQ7CisgICAgICAgICAgICAgICAgc21wbC0+Y2xlYXJzaXplcy5hZGQobnVtY2xlYXIpOworICAgICAgICAgICAgICAgIHNtcGwtPmVuY3J5cHRlZHNpemVzLmFkZChudW1lbmNyeXB0ZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc21wbC0+Y2xlYXJzaXplcy5hZGQoMCk7CisgICAgICAgICAgICBzbXBsLT5lbmNyeXB0ZWRzaXplcy5hZGQoc21wbC0+c2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnBhcnNlVHJhY2tGcmFnbWVudEhlYWRlcihvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBzaXplKSB7CisKKyAgICBpZiAoc2l6ZSA8IDgpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJmZsYWdzKSkgeyAvLyBhY3R1YWxseSB2ZXJzaW9uICsgZmxhZ3MKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBpZiAoZmxhZ3MgJiAweGZmMDAwMDAwKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQgKyA0LCAodWludDMyX3QqKSZtTGFzdFBhcnNlZFRyYWNrSWQpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKG1MYXN0UGFyc2VkVHJhY2tJZCAhPSBtVHJhY2tJZCkgeworICAgICAgICAvLyB0aGlzIGlzIG5vdCB0aGUgcmlnaHQgdHJhY2ssIHNraXAgaXQKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRmxhZ3MgPSBmbGFnczsKKyAgICBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubVRyYWNrSUQgPSBtTGFzdFBhcnNlZFRyYWNrSWQ7CisgICAgb2Zmc2V0ICs9IDg7CisgICAgc2l6ZSAtPSA4OworCisgICAgQUxPR1YoImZyYWdtZW50IGhlYWRlcjogJTA4eCAlMDh4IiwgZmxhZ3MsIG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tVHJhY2tJRCk7CisKKyAgICBpZiAoZmxhZ3MgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a0Jhc2VEYXRhT2Zmc2V0UHJlc2VudCkgeworICAgICAgICBpZiAoc2l6ZSA8IDgpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDY0KG9mZnNldCwgJm1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tQmFzZURhdGFPZmZzZXQpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSA4OworICAgICAgICBzaXplIC09IDg7CisgICAgfQorCisgICAgaWYgKGZsYWdzICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtTYW1wbGVEZXNjcmlwdGlvbkluZGV4UHJlc2VudCkgeworICAgICAgICBpZiAoc2l6ZSA8IDQpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJm1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tU2FtcGxlRGVzY3JpcHRpb25JbmRleCkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0ICs9IDQ7CisgICAgICAgIHNpemUgLT0gNDsKKyAgICB9CisKKyAgICBpZiAoZmxhZ3MgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a0RlZmF1bHRTYW1wbGVEdXJhdGlvblByZXNlbnQpIHsKKyAgICAgICAgaWYgKHNpemUgPCA0KSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURlZmF1bHRTYW1wbGVEdXJhdGlvbikpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0ICs9IDQ7CisgICAgICAgIHNpemUgLT0gNDsKKyAgICB9CisKKyAgICBpZiAoZmxhZ3MgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a0RlZmF1bHRTYW1wbGVTaXplUHJlc2VudCkgeworICAgICAgICBpZiAoc2l6ZSA8IDQpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJm1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGVmYXVsdFNhbXBsZVNpemUpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSA0OworICAgICAgICBzaXplIC09IDQ7CisgICAgfQorCisgICAgaWYgKGZsYWdzICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtEZWZhdWx0U2FtcGxlRmxhZ3NQcmVzZW50KSB7CisgICAgICAgIGlmIChzaXplIDwgNCkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EZWZhdWx0U2FtcGxlRmxhZ3MpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSA0OworICAgICAgICBzaXplIC09IDQ7CisgICAgfQorCisgICAgaWYgKCEoZmxhZ3MgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a0Jhc2VEYXRhT2Zmc2V0UHJlc2VudCkpIHsKKyAgICAgICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1CYXNlRGF0YU9mZnNldCA9IG1DdXJyZW50TW9vZk9mZnNldDsKKyAgICB9CisKKyAgICBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURhdGFPZmZzZXQgPSAwOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnBhcnNlVHJhY2tGcmFnbWVudFJ1bihvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBzaXplKSB7CisKKyAgICBBTE9HVigiTVBFRzRFeHRyYWN0b3I6OnBhcnNlVHJhY2tGcmFnbWVudFJ1biIpOworICAgIGlmIChzaXplIDwgOCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBlbnVtIHsKKyAgICAgICAga0RhdGFPZmZzZXRQcmVzZW50ICAgICAgICAgICAgICAgICAgPSAweDAxLAorICAgICAgICBrRmlyc3RTYW1wbGVGbGFnc1ByZXNlbnQgICAgICAgICAgICA9IDB4MDQsCisgICAgICAgIGtTYW1wbGVEdXJhdGlvblByZXNlbnQgICAgICAgICAgICAgID0gMHgxMDAsCisgICAgICAgIGtTYW1wbGVTaXplUHJlc2VudCAgICAgICAgICAgICAgICAgID0gMHgyMDAsCisgICAgICAgIGtTYW1wbGVGbGFnc1ByZXNlbnQgICAgICAgICAgICAgICAgID0gMHg0MDAsCisgICAgICAgIGtTYW1wbGVDb21wb3NpdGlvblRpbWVPZmZzZXRQcmVzZW50ID0gMHg4MDAsCisgICAgfTsKKworICAgIHVpbnQzMl90IGZsYWdzOworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZmbGFncykpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgLy8gfHZlcnNpb258IG9ubHkgYWZmZWN0cyBTYW1wbGVDb21wb3NpdGlvblRpbWVPZmZzZXQgZmllbGQuCisgICAgLy8gSWYgdmVyc2lvbiA9PSAwLCBTYW1wbGVDb21wb3NpdGlvblRpbWVPZmZzZXQgaXMgdWludDMyX3Q7CisgICAgLy8gT3RoZXJ3aXNlLCBTYW1wbGVDb21wb3NpdGlvblRpbWVPZmZzZXQgaXMgaW50MzJfdC4KKyAgICAvLyBTYW1wbGUuY29tcG9zaXRpb25PZmZzZXQgaXMgZGVmaW5lZCBhcyBpbnQzMl90LgorICAgIHVpbnQ4X3QgdmVyc2lvbiA9IGZsYWdzID4+IDI0OworICAgIGZsYWdzICY9IDB4ZmZmZmZmOworICAgIEFMT0dWKCJmcmFnbWVudCBydW4gdmVyc2lvbjogMHglMDJ4LCBmbGFnczogMHglMDZ4IiwgdmVyc2lvbiwgZmxhZ3MpOworCisgICAgaWYgKChmbGFncyAmIGtGaXJzdFNhbXBsZUZsYWdzUHJlc2VudCkgJiYgKGZsYWdzICYga1NhbXBsZUZsYWdzUHJlc2VudCkpIHsKKyAgICAgICAgLy8gVGhlc2UgdHdvIHNoYWxsIG5vdCBiZSB1c2VkIHRvZ2V0aGVyLgorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBzYW1wbGVDb3VudDsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0ICsgNCwgJnNhbXBsZUNvdW50KSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICBvZmZzZXQgKz0gODsKKyAgICBzaXplIC09IDg7CisKKyAgICB1aW50NjRfdCBkYXRhT2Zmc2V0ID0gbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EYXRhT2Zmc2V0OworCisgICAgdWludDMyX3QgZmlyc3RTYW1wbGVGbGFncyA9IDA7CisKKyAgICBpZiAoZmxhZ3MgJiBrRGF0YU9mZnNldFByZXNlbnQpIHsKKyAgICAgICAgaWYgKHNpemUgPCA0KSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgZGF0YU9mZnNldERlbHRhOworICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAodWludDMyX3QqKSZkYXRhT2Zmc2V0RGVsdGEpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgZGF0YU9mZnNldCA9IG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tQmFzZURhdGFPZmZzZXQgKyBkYXRhT2Zmc2V0RGVsdGE7CisKKyAgICAgICAgb2Zmc2V0ICs9IDQ7CisgICAgICAgIHNpemUgLT0gNDsKKyAgICB9CisKKyAgICBpZiAoZmxhZ3MgJiBrRmlyc3RTYW1wbGVGbGFnc1ByZXNlbnQpIHsKKyAgICAgICAgaWYgKHNpemUgPCA0KSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZmaXJzdFNhbXBsZUZsYWdzKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQgKz0gNDsKKyAgICAgICAgc2l6ZSAtPSA0OworICAgIH0KKworICAgIHVpbnQzMl90IHNhbXBsZUR1cmF0aW9uID0gMCwgc2FtcGxlU2l6ZSA9IDAsIHNhbXBsZUZsYWdzID0gMCwKKyAgICAgICAgICAgICBzYW1wbGVDdHNPZmZzZXQgPSAwOworCisgICAgc2l6ZV90IGJ5dGVzUGVyU2FtcGxlID0gMDsKKyAgICBpZiAoZmxhZ3MgJiBrU2FtcGxlRHVyYXRpb25QcmVzZW50KSB7CisgICAgICAgIGJ5dGVzUGVyU2FtcGxlICs9IDQ7CisgICAgfSBlbHNlIGlmIChtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUZsYWdzCisgICAgICAgICAgICAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprRGVmYXVsdFNhbXBsZUR1cmF0aW9uUHJlc2VudCkgeworICAgICAgICBzYW1wbGVEdXJhdGlvbiA9IG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGVmYXVsdFNhbXBsZUR1cmF0aW9uOworICAgIH0gZWxzZSBpZiAobVRyZXgpIHsKKyAgICAgICAgc2FtcGxlRHVyYXRpb24gPSBtVHJleC0+ZGVmYXVsdF9zYW1wbGVfZHVyYXRpb247CisgICAgfQorCisgICAgaWYgKGZsYWdzICYga1NhbXBsZVNpemVQcmVzZW50KSB7CisgICAgICAgIGJ5dGVzUGVyU2FtcGxlICs9IDQ7CisgICAgfSBlbHNlIGlmIChtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUZsYWdzCisgICAgICAgICAgICAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprRGVmYXVsdFNhbXBsZVNpemVQcmVzZW50KSB7CisgICAgICAgIHNhbXBsZVNpemUgPSBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURlZmF1bHRTYW1wbGVTaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIHNhbXBsZVNpemUgPSBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURlZmF1bHRTYW1wbGVTaXplOworICAgIH0KKworICAgIGlmIChmbGFncyAmIGtTYW1wbGVGbGFnc1ByZXNlbnQpIHsKKyAgICAgICAgYnl0ZXNQZXJTYW1wbGUgKz0gNDsKKyAgICB9IGVsc2UgaWYgKG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRmxhZ3MKKyAgICAgICAgICAgICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtEZWZhdWx0U2FtcGxlRmxhZ3NQcmVzZW50KSB7CisgICAgICAgIHNhbXBsZUZsYWdzID0gbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EZWZhdWx0U2FtcGxlRmxhZ3M7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2FtcGxlRmxhZ3MgPSBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURlZmF1bHRTYW1wbGVGbGFnczsKKyAgICB9CisKKyAgICBpZiAoZmxhZ3MgJiBrU2FtcGxlQ29tcG9zaXRpb25UaW1lT2Zmc2V0UHJlc2VudCkgeworICAgICAgICBieXRlc1BlclNhbXBsZSArPSA0OworICAgIH0gZWxzZSB7CisgICAgICAgIHNhbXBsZUN0c09mZnNldCA9IDA7CisgICAgfQorCisgICAgaWYgKHNpemUgPCAob2ZmNjRfdCkoc2FtcGxlQ291bnQgKiBieXRlc1BlclNhbXBsZSkpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgU2FtcGxlIHRtcDsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc2FtcGxlQ291bnQ7ICsraSkgeworICAgICAgICBpZiAoZmxhZ3MgJiBrU2FtcGxlRHVyYXRpb25QcmVzZW50KSB7CisgICAgICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmc2FtcGxlRHVyYXRpb24pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9mZnNldCArPSA0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZsYWdzICYga1NhbXBsZVNpemVQcmVzZW50KSB7CisgICAgICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmc2FtcGxlU2l6ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmxhZ3MgJiBrU2FtcGxlRmxhZ3NQcmVzZW50KSB7CisgICAgICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmc2FtcGxlRmxhZ3MpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9mZnNldCArPSA0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZsYWdzICYga1NhbXBsZUNvbXBvc2l0aW9uVGltZU9mZnNldFByZXNlbnQpIHsKKyAgICAgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZzYW1wbGVDdHNPZmZzZXQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9mZnNldCArPSA0OworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoImFkZGluZyBzYW1wbGUgJWQgYXQgb2Zmc2V0IDB4JTA4IiBQUkl4NjQgIiwgc2l6ZSAldSwgZHVyYXRpb24gJXUsICIKKyAgICAgICAgICAgICAgIiBmbGFncyAweCUwOHgiLCBpICsgMSwKKyAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LCBzYW1wbGVTaXplLCBzYW1wbGVEdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAoZmxhZ3MgJiBrRmlyc3RTYW1wbGVGbGFnc1ByZXNlbnQpICYmIGkgPT0gMAorICAgICAgICAgICAgICAgICAgICA/IGZpcnN0U2FtcGxlRmxhZ3MgOiBzYW1wbGVGbGFncyk7CisgICAgICAgIHRtcC5vZmZzZXQgPSBkYXRhT2Zmc2V0OworICAgICAgICB0bXAuc2l6ZSA9IHNhbXBsZVNpemU7CisgICAgICAgIHRtcC5kdXJhdGlvbiA9IHNhbXBsZUR1cmF0aW9uOworICAgICAgICB0bXAuY29tcG9zaXRpb25PZmZzZXQgPSBzYW1wbGVDdHNPZmZzZXQ7CisgICAgICAgIG1DdXJyZW50U2FtcGxlcy5hZGQodG1wKTsKKworICAgICAgICBkYXRhT2Zmc2V0ICs9IHNhbXBsZVNpemU7CisgICAgfQorCisgICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EYXRhT2Zmc2V0ID0gZGF0YU9mZnNldDsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzRTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG1ldGEgPSBtRm9ybWF0OworICAgIHJldHVybiBPSzsKK30KKworc2l6ZV90IE1QRUc0U291cmNlOjpwYXJzZU5BTFNpemUoY29uc3QgdWludDhfdCAqZGF0YSkgY29uc3QgeworICAgIHN3aXRjaCAobU5BTExlbmd0aFNpemUpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgcmV0dXJuICpkYXRhOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICByZXR1cm4gVTE2X0FUKGRhdGEpOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICByZXR1cm4gKChzaXplX3QpZGF0YVswXSA8PCAxNikgfCBVMTZfQVQoJmRhdGFbMV0pOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICByZXR1cm4gVTMyX0FUKGRhdGEpOworICAgIH0KKworICAgIC8vIFRoaXMgY2Fubm90IGhhcHBlbiwgbU5BTExlbmd0aFNpemUgc3ByaW5ncyB0byBsaWZlIGJ5IGFkZGluZyAxIHRvCisgICAgLy8gYSAyLWJpdCBpbnRlZ2VyLgorICAgIENIRUNLKCEiU2hvdWxkIG5vdCBiZSBoZXJlLiIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXR1c190IE1QRUc0U291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIENIRUNLKG1TdGFydGVkKTsKKworICAgIGlmIChvcHRpb25zICE9IG51bGxwdHIgJiYgb3B0aW9ucy0+Z2V0Tm9uQmxvY2tpbmcoKSAmJiAhbUdyb3VwLT5oYXNfYnVmZmVycygpKSB7CisgICAgICAgICpvdXQgPSBudWxscHRyOworICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CisgICAgfQorCisgICAgaWYgKG1GaXJzdE1vb2ZPZmZzZXQgPiAwKSB7CisgICAgICAgIHJldHVybiBmcmFnbWVudGVkUmVhZChvdXQsIG9wdGlvbnMpOworICAgIH0KKworICAgICpvdXQgPSBOVUxMOworCisgICAgaW50NjRfdCB0YXJnZXRTYW1wbGVUaW1lVXMgPSAtMTsKKworICAgIGludDY0X3Qgc2Vla1RpbWVVczsKKyAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKKyAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgeworICAgICAgICBpZiAobUlzSGVpZikgeworICAgICAgICAgICAgQ0hFQ0sobVNhbXBsZVRhYmxlID09IE5VTEwpOworICAgICAgICAgICAgQ0hFQ0sobUl0ZW1UYWJsZSAhPSBOVUxMKTsKKyAgICAgICAgICAgIGludDMyX3QgaW1hZ2VJbmRleDsKKyAgICAgICAgICAgIGlmICghbUZvcm1hdC5maW5kSW50MzIoa0tleVRyYWNrSUQsICZpbWFnZUluZGV4KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgICAgIGlmIChzZWVrVGltZVVzID49IDApIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtSXRlbVRhYmxlLT5maW5kSW1hZ2VJdGVtKGltYWdlSW5kZXgsICZtQ3VycmVudFNhbXBsZUluZGV4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyID0gbUl0ZW1UYWJsZS0+ZmluZFRodW1ibmFpbEl0ZW0oaW1hZ2VJbmRleCwgJm1DdXJyZW50U2FtcGxlSW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1aW50MzJfdCBmaW5kRmxhZ3MgPSAwOworICAgICAgICAgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DOgorICAgICAgICAgICAgICAgICAgICBmaW5kRmxhZ3MgPSBTYW1wbGVUYWJsZTo6a0ZsYWdCZWZvcmU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUmVhZE9wdGlvbnM6OlNFRUtfTkVYVF9TWU5DOgorICAgICAgICAgICAgICAgICAgICBmaW5kRmxhZ3MgPSBTYW1wbGVUYWJsZTo6a0ZsYWdBZnRlcjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkM6CisgICAgICAgICAgICAgICAgY2FzZSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUOgorICAgICAgICAgICAgICAgICAgICBmaW5kRmxhZ3MgPSBTYW1wbGVUYWJsZTo6a0ZsYWdDbG9zZXN0OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJlYWRPcHRpb25zOjpTRUVLX0ZSQU1FX0lOREVYOgorICAgICAgICAgICAgICAgICAgICBmaW5kRmxhZ3MgPSBTYW1wbGVUYWJsZTo6a0ZsYWdGcmFtZUluZGV4OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBDSEVDSyghIlNob3VsZCBub3QgYmUgaGVyZS4iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4OworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNhbXBsZVRhYmxlLT5maW5kU2FtcGxlQXRUaW1lKAorICAgICAgICAgICAgICAgICAgICBzZWVrVGltZVVzLCAxMDAwMDAwLCBtVGltZXNjYWxlLAorICAgICAgICAgICAgICAgICAgICAmc2FtcGxlSW5kZXgsIGZpbmRGbGFncyk7CisKKyAgICAgICAgICAgIGlmIChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QKKyAgICAgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBSZWFkT3B0aW9uczo6U0VFS19GUkFNRV9JTkRFWCkgeworICAgICAgICAgICAgICAgIC8vIFdlIGZvdW5kIHRoZSBjbG9zZXN0IHNhbXBsZSBhbHJlYWR5LCBub3cgd2Ugd2FudCB0aGUgc3luYworICAgICAgICAgICAgICAgIC8vIHNhbXBsZSBwcmVjZWRpbmcgaXQgKG9yIHRoZSBzYW1wbGUgaXRzZWxmIG9mIGNvdXJzZSksIGV2ZW4KKyAgICAgICAgICAgICAgICAvLyBpZiB0aGUgc3Vic2VxdWVudCBzeW5jIHNhbXBsZSBpcyBjbG9zZXIuCisgICAgICAgICAgICAgICAgZmluZEZsYWdzID0gU2FtcGxlVGFibGU6OmtGbGFnQmVmb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MzJfdCBzeW5jU2FtcGxlSW5kZXg7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgZXJyID0gbVNhbXBsZVRhYmxlLT5maW5kU3luY1NhbXBsZU5lYXIoCisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVJbmRleCwgJnN5bmNTYW1wbGVJbmRleCwgZmluZEZsYWdzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlVGltZTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtU2FtcGxlVGFibGUtPmdldE1ldGFEYXRhRm9yU2FtcGxlKAorICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlSW5kZXgsIE5VTEwsIE5VTEwsICZzYW1wbGVUaW1lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfT1VUX09GX1JBTkdFKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEFuIGF0dGVtcHQgdG8gc2VlayBwYXN0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbSB3b3VsZAorICAgICAgICAgICAgICAgICAgICAvLyBub3JtYWxseSBjYXVzZSB0aGlzIEVSUk9SX09VVF9PRl9SQU5HRSBlcnJvci4gUHJvcGFnYXRpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBhbGwgdGhlIHdheSB0byB0aGUgTWVkaWFQbGF5ZXIgd291bGQgY2F1c2UgYWJub3JtYWwKKyAgICAgICAgICAgICAgICAgICAgLy8gdGVybWluYXRpb24uIExlZ2FjeSBiZWhhdmlvdXIgYXBwZWFycyB0byBiZSB0byBiZWhhdmUgYXMgaWYKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGFkIHNlZWtlZCB0byB0aGUgZW5kIG9mIHN0cmVhbSwgZW5kaW5nIG5vcm1hbGx5LgorICAgICAgICAgICAgICAgICAgICBlcnIgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiZW5kIG9mIHN0cmVhbSIpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QKKyAgICAgICAgICAgICAgICB8fCBtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX0ZSQU1FX0lOREVYKSB7CisgICAgICAgICAgICAgICAgdGFyZ2V0U2FtcGxlVGltZVVzID0gKHNhbXBsZVRpbWUgKiAxMDAwMDAwbGwpIC8gbVRpbWVzY2FsZTsKKyAgICAgICAgICAgIH0KKworI2lmIDAKKyAgICAgICAgICAgIHVpbnQzMl90IHN5bmNTYW1wbGVUaW1lOworICAgICAgICAgICAgQ0hFQ0tfRVEoT0ssIG1TYW1wbGVUYWJsZS0+Z2V0TWV0YURhdGFGb3JTYW1wbGUoCisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jU2FtcGxlSW5kZXgsIE5VTEwsIE5VTEwsICZzeW5jU2FtcGxlVGltZSkpOworCisgICAgICAgICAgICBBTE9HSSgic2VlayB0byB0aW1lICVsbGQgdXMgPT4gc2FtcGxlIGF0IHRpbWUgJWxsZCB1cywgIgorICAgICAgICAgICAgICAgICAic3luYyBzYW1wbGUgYXQgdGltZSAlbGxkIHVzIiwKKyAgICAgICAgICAgICAgICAgc2Vla1RpbWVVcywKKyAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSAqIDEwMDAwMDBsbCAvIG1UaW1lc2NhbGUsCisgICAgICAgICAgICAgICAgIHN5bmNTYW1wbGVUaW1lICogMTAwMDAwMGxsIC8gbVRpbWVzY2FsZSk7CisjZW5kaWYKKworICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IHN5bmNTYW1wbGVJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtQnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgfQorCisgICAgb2ZmNjRfdCBvZmZzZXQgPSAwOworICAgIHNpemVfdCBzaXplID0gMDsKKyAgICB1aW50MzJfdCBjdHMsIHN0dHM7CisgICAgYm9vbCBpc1N5bmNTYW1wbGU7CisgICAgYm9vbCBuZXdCdWZmZXIgPSBmYWxzZTsKKyAgICBpZiAobUJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIG5ld0J1ZmZlciA9IHRydWU7CisKKyAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICBpZiAoIW1Jc0hlaWYpIHsKKyAgICAgICAgICAgIGVyciA9IG1TYW1wbGVUYWJsZS0+Z2V0TWV0YURhdGFGb3JTYW1wbGUoCisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXgsICZvZmZzZXQsICZzaXplLCAmY3RzLCAmaXNTeW5jU2FtcGxlLCAmc3R0cyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnIgPSBtSXRlbVRhYmxlLT5nZXRJbWFnZU9mZnNldEFuZFNpemUoCisgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ3VycmVudFNhbXBsZUluZGV4IDogTlVMTCwgJm9mZnNldCwgJnNpemUpOworCisgICAgICAgICAgICBjdHMgPSBzdHRzID0gMDsKKyAgICAgICAgICAgIGlzU3luY1NhbXBsZSA9IDA7CisgICAgICAgICAgICBBTE9HVigiaW1hZ2Ugb2Zmc2V0ICVsbGQsIHNpemUgJXp1IiwgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJm1CdWZmZXIpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgPT0gTlVMTCk7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIGlmIChzaXplID4gbUJ1ZmZlci0+c2l6ZSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiYnVmZmVyIHRvbyBzbWFsbDogJXp1ID4gJXp1Iiwgc2l6ZSwgbUJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0JVRkZFUl9UT09fU01BTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCFtSXNBVkMgJiYgIW1Jc0hFVkMpIHx8IG1XYW50c05BTEZyYWdtZW50cykgeworICAgICAgICBpZiAobmV3QnVmZmVyKSB7CisgICAgICAgICAgICBzc2l6ZV90IG51bV9ieXRlc19yZWFkID0KKyAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgKHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCksIHNpemUpOworCisgICAgICAgICAgICBpZiAobnVtX2J5dGVzX3JlYWQgPCAoc3NpemVfdClzaXplKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOworICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUpOworICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuY2xlYXIoKTsKKyAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAorICAgICAgICAgICAgICAgICAgICBrS2V5VGltZSwgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoKGludDY0X3Qpc3R0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisKKyAgICAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgeworICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAorICAgICAgICAgICAgICAgICAgICAgICAga0tleVRhcmdldFRpbWUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpc1N5bmNTYW1wbGUpIHsKKyAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1Jc0FWQyAmJiAhbUlzSEVWQykgeworICAgICAgICAgICAgKm91dCA9IG1CdWZmZXI7CisgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgLy8gRWFjaCBOQUwgdW5pdCBpcyBzcGxpdCB1cCBpbnRvIGl0cyBjb25zdGl0dWVudCBmcmFnbWVudHMgYW5kCisgICAgICAgIC8vIGVhY2ggb25lIG9mIHRoZW0gcmV0dXJuZWQgaW4gaXRzIG93biBidWZmZXIuCisKKyAgICAgICAgQ0hFQ0sobUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPj0gbU5BTExlbmd0aFNpemUpOworCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9CisgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSArIG1CdWZmZXItPnJhbmdlX29mZnNldCgpOworCisgICAgICAgIHNpemVfdCBuYWxfc2l6ZSA9IHBhcnNlTkFMU2l6ZShzcmMpOworICAgICAgICBpZiAobU5BTExlbmd0aFNpemUgPiBTSVpFX01BWCAtIG5hbF9zaXplKSB7CisgICAgICAgICAgICBBTE9HRSgiYi8yNDQ0MTU1MywgYi8yNDQ0NTEyMiIpOworICAgICAgICB9CisgICAgICAgIGlmIChtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIG1OQUxMZW5ndGhTaXplIDwgbmFsX3NpemUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJpbmNvbXBsZXRlIE5BTCB1bml0LiIpOworCisgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqY2xvbmUgPSBtQnVmZmVyLT5jbG9uZSgpOworICAgICAgICBDSEVDSyhjbG9uZSAhPSBOVUxMKTsKKyAgICAgICAgY2xvbmUtPnNldF9yYW5nZShtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIG1OQUxMZW5ndGhTaXplLCBuYWxfc2l6ZSk7CisKKyAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKAorICAgICAgICAgICAgICAgIG1CdWZmZXItPnJhbmdlX29mZnNldCgpICsgbU5BTExlbmd0aFNpemUgKyBuYWxfc2l6ZSwKKyAgICAgICAgICAgICAgICBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIG1OQUxMZW5ndGhTaXplIC0gbmFsX3NpemUpOworCisgICAgICAgIGlmIChtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgICpvdXQgPSBjbG9uZTsKKworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gV2hvbGUgTkFMIHVuaXRzIGFyZSByZXR1cm5lZCBidXQgZWFjaCBmcmFnbWVudCBpcyBwcmVmaXhlZCBieQorICAgICAgICAvLyB0aGUgc3RhcnQgY29kZSAoMHgwMCAwMCAwMCAwMSkuCisgICAgICAgIHNzaXplX3QgbnVtX2J5dGVzX3JlYWQgPSAwOworICAgICAgICBpbnQzMl90IGRybSA9IDA7CisgICAgICAgIGJvb2wgdXNlc0RSTSA9IChtRm9ybWF0LmZpbmRJbnQzMihrS2V5SXNEUk0sICZkcm0pICYmIGRybSAhPSAwKTsKKyAgICAgICAgaWYgKHVzZXNEUk0pIHsKKyAgICAgICAgICAgIG51bV9ieXRlc19yZWFkID0KKyAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgKHVpbnQ4X3QqKW1CdWZmZXItPmRhdGEoKSwgc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBudW1fYnl0ZXNfcmVhZCA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBtU3JjQnVmZmVyLCBzaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChudW1fYnl0ZXNfcmVhZCA8IChzc2l6ZV90KXNpemUpIHsKKyAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworCisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKworICAgICAgICBpZiAodXNlc0RSTSkgeworICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBzaXplKTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdWludDhfdCAqZHN0RGF0YSA9ICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpOworICAgICAgICAgICAgc2l6ZV90IHNyY09mZnNldCA9IDA7CisgICAgICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKKworICAgICAgICAgICAgd2hpbGUgKHNyY09mZnNldCA8IHNpemUpIHsKKyAgICAgICAgICAgICAgICBib29sIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG1OQUxMZW5ndGhTaXplKTsKKyAgICAgICAgICAgICAgICBzaXplX3QgbmFsTGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWlzTWFsRm9ybWVkKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbExlbmd0aCA9IHBhcnNlTkFMU2l6ZSgmbVNyY0J1ZmZlcltzcmNPZmZzZXRdKTsKKyAgICAgICAgICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG1OQUxMZW5ndGhTaXplOworICAgICAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBuYWxMZW5ndGgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpc01hbEZvcm1lZCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVmlkZW8gaXMgbWFsZm9ybWVkIik7CisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG5hbExlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChkc3RPZmZzZXQgPiBTSVpFX01BWCAtIDQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCArIDQgPiBTSVpFX01BWCAtIG5hbExlbmd0aCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCArIG5hbExlbmd0aCA+IG1CdWZmZXItPnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiYi8yNzIwODYyMSA6ICV6dSAlenUiLCBkc3RPZmZzZXQsIG1CdWZmZXItPnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjcyMDg2MjEiKTsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKKyAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDE7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZkc3REYXRhW2RzdE9mZnNldF0sICZtU3JjQnVmZmVyW3NyY09mZnNldF0sIG5hbExlbmd0aCk7CisgICAgICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG5hbExlbmd0aDsKKyAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKz0gbmFsTGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ0hFQ0tfRVEoc3JjT2Zmc2V0LCBzaXplKTsKKyAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7CisgICAgICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgZHN0T2Zmc2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLmNsZWFyKCk7CisgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAorICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCisgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoKGludDY0X3Qpc3R0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisKKyAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwKSB7CisgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAga0tleVRhcmdldFRpbWUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUlzQVZDKSB7CisgICAgICAgICAgICB1aW50MzJfdCBsYXllcklkID0gRmluZEFWQ0xheWVySWQoCisgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5VGVtcG9yYWxMYXllcklkLCBsYXllcklkKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc1N5bmNTYW1wbGUpIHsKKyAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgICAgIH0KKworICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CisKKyAgICAgICAgKm91dCA9IG1CdWZmZXI7CisgICAgICAgIG1CdWZmZXIgPSBOVUxMOworCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9Cit9CisKK3N0YXR1c190IE1QRUc0U291cmNlOjpmcmFnbWVudGVkUmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworCisgICAgQUxPR1YoIk1QRUc0U291cmNlOjpmcmFnbWVudGVkUmVhZCIpOworCisgICAgQ0hFQ0sobVN0YXJ0ZWQpOworCisgICAgKm91dCA9IE5VTEw7CisKKyAgICBpbnQ2NF90IHRhcmdldFNhbXBsZVRpbWVVcyA9IC0xOworCisgICAgaW50NjRfdCBzZWVrVGltZVVzOworICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CisKKyAgICAgICAgaW50IG51bVNpZHhFbnRyaWVzID0gbVNlZ21lbnRzLnNpemUoKTsKKyAgICAgICAgaWYgKG51bVNpZHhFbnRyaWVzICE9IDApIHsKKyAgICAgICAgICAgIGludDY0X3QgdG90YWxUaW1lID0gMDsKKyAgICAgICAgICAgIG9mZjY0X3QgdG90YWxPZmZzZXQgPSBtRmlyc3RNb29mT2Zmc2V0OworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TaWR4RW50cmllczsgaSsrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgU2lkeEVudHJ5ICpzZSA9ICZtU2VnbWVudHNbaV07CisgICAgICAgICAgICAgICAgaWYgKHRvdGFsVGltZSArIHNlLT5tRHVyYXRpb25VcyA+IHNlZWtUaW1lVXMpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlcXVlc3RlZCB0aW1lIGlzIHNvbWV3aGVyZSBpbiB0aGlzIHNlZ21lbnQKKyAgICAgICAgICAgICAgICAgICAgaWYgKChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQyAmJiBzZWVrVGltZVVzID4gdG90YWxUaW1lKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKG1vZGUgPT0gUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoc2Vla1RpbWVVcyAtIHRvdGFsVGltZSkgPiAodG90YWxUaW1lICsgc2UtPm1EdXJhdGlvblVzIC0gc2Vla1RpbWVVcykpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0ZWQgbmV4dCBzeW5jLCBvciBjbG9zZXN0IHN5bmMgYW5kIGl0IHdhcyBjbG9zZXIgdG8gdGhlIGVuZCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBzZWdtZW50CisgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFRpbWUgKz0gc2UtPm1EdXJhdGlvblVzOworICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxPZmZzZXQgKz0gc2UtPm1TaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0b3RhbFRpbWUgKz0gc2UtPm1EdXJhdGlvblVzOworICAgICAgICAgICAgICAgIHRvdGFsT2Zmc2V0ICs9IHNlLT5tU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DdXJyZW50TW9vZk9mZnNldCA9IHRvdGFsT2Zmc2V0OworICAgICAgICAgICAgbU5leHRNb29mT2Zmc2V0ID0gLTE7CisgICAgICAgICAgICBtQ3VycmVudFNhbXBsZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSAwOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuaygmdG90YWxPZmZzZXQpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ3VycmVudFRpbWUgPSB0b3RhbFRpbWUgKiBtVGltZXNjYWxlIC8gMTAwMDAwMGxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gd2l0aG91dCBzaWR4IGJveGVzLCB3ZSBjYW4gb25seSBzZWVrIHRvIDAKKyAgICAgICAgICAgIG1DdXJyZW50TW9vZk9mZnNldCA9IG1GaXJzdE1vb2ZPZmZzZXQ7CisgICAgICAgICAgICBtTmV4dE1vb2ZPZmZzZXQgPSAtMTsKKyAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlcy5jbGVhcigpOworICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IDA7CisgICAgICAgICAgICBvZmY2NF90IHRtcCA9IG1DdXJyZW50TW9vZk9mZnNldDsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsoJnRtcCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DdXJyZW50VGltZSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgIH0KKworICAgIG9mZjY0X3Qgb2Zmc2V0ID0gMDsKKyAgICBzaXplX3Qgc2l6ZSA9IDA7CisgICAgdWludDMyX3QgY3RzID0gMDsKKyAgICBib29sIGlzU3luY1NhbXBsZSA9IGZhbHNlOworICAgIGJvb2wgbmV3QnVmZmVyID0gZmFsc2U7CisgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCkgeworICAgICAgICBuZXdCdWZmZXIgPSB0cnVlOworCisgICAgICAgIGlmIChtQ3VycmVudFNhbXBsZUluZGV4ID49IG1DdXJyZW50U2FtcGxlcy5zaXplKCkpIHsKKyAgICAgICAgICAgIC8vIG1vdmUgdG8gbmV4dCBmcmFnbWVudCBpZiB0aGVyZSBpcyBvbmUKKyAgICAgICAgICAgIGlmIChtTmV4dE1vb2ZPZmZzZXQgPD0gbUN1cnJlbnRNb29mT2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvZmY2NF90IG5leHRNb29mID0gbU5leHRNb29mT2Zmc2V0OworICAgICAgICAgICAgbUN1cnJlbnRNb29mT2Zmc2V0ID0gbmV4dE1vb2Y7CisgICAgICAgICAgICBtQ3VycmVudFNhbXBsZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSAwOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuaygmbmV4dE1vb2YpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUN1cnJlbnRTYW1wbGVJbmRleCA+PSBtQ3VycmVudFNhbXBsZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBTYW1wbGUgKnNtcGwgPSAmbUN1cnJlbnRTYW1wbGVzW21DdXJyZW50U2FtcGxlSW5kZXhdOworICAgICAgICBvZmZzZXQgPSBzbXBsLT5vZmZzZXQ7CisgICAgICAgIHNpemUgPSBzbXBsLT5zaXplOworICAgICAgICBjdHMgPSBtQ3VycmVudFRpbWUgKyBzbXBsLT5jb21wb3NpdGlvbk9mZnNldDsKKyAgICAgICAgbUN1cnJlbnRUaW1lICs9IHNtcGwtPmR1cmF0aW9uOworICAgICAgICBpc1N5bmNTYW1wbGUgPSAobUN1cnJlbnRTYW1wbGVJbmRleCA9PSAwKTsgLy8gWFhYCisKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmbUJ1ZmZlcik7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciA9PSBOVUxMKTsKKyAgICAgICAgICAgIEFMT0dWKCJhY3F1aXJlX2J1ZmZlciByZXR1cm5lZCAlZCIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIGlmIChzaXplID4gbUJ1ZmZlci0+c2l6ZSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiYnVmZmVyIHRvbyBzbWFsbDogJXp1ID4gJXp1Iiwgc2l6ZSwgbUJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0JVRkZFUl9UT09fU01BTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBTYW1wbGUgKnNtcGwgPSAmbUN1cnJlbnRTYW1wbGVzW21DdXJyZW50U2FtcGxlSW5kZXhdOworICAgIE1ldGFEYXRhQmFzZSAmYnVmbWV0YSA9IG1CdWZmZXItPm1ldGFfZGF0YSgpOworICAgIGJ1Zm1ldGEuY2xlYXIoKTsKKyAgICBpZiAoc21wbC0+ZW5jcnlwdGVkc2l6ZXMuc2l6ZSgpKSB7CisgICAgICAgIC8vIHN0b3JlIGNsZWFyL2VuY3J5cHRlZCBsZW5ndGhzIGluIG1ldGFkYXRhCisgICAgICAgIGJ1Zm1ldGEuc2V0RGF0YShrS2V5UGxhaW5TaXplcywgMCwKKyAgICAgICAgICAgICAgICBzbXBsLT5jbGVhcnNpemVzLmFycmF5KCksIHNtcGwtPmNsZWFyc2l6ZXMuc2l6ZSgpICogNCk7CisgICAgICAgIGJ1Zm1ldGEuc2V0RGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsIDAsCisgICAgICAgICAgICAgICAgc21wbC0+ZW5jcnlwdGVkc2l6ZXMuYXJyYXkoKSwgc21wbC0+ZW5jcnlwdGVkc2l6ZXMuc2l6ZSgpICogNCk7CisgICAgICAgIGJ1Zm1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvSVYsIDAsIHNtcGwtPml2LCAxNik7IC8vIHVzZSAxNiBvciB0aGUgYWN0dWFsIHNpemU/CisgICAgICAgIGJ1Zm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b0RlZmF1bHRJVlNpemUsIG1EZWZhdWx0SVZTaXplKTsKKyAgICAgICAgYnVmbWV0YS5zZXRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgbUNyeXB0b01vZGUpOworICAgICAgICBidWZtZXRhLnNldERhdGEoa0tleUNyeXB0b0tleSwgMCwgbUNyeXB0b0tleSwgMTYpOworICAgIH0KKworICAgIGlmICgoIW1Jc0FWQyAmJiAhbUlzSEVWQyl8fCBtV2FudHNOQUxGcmFnbWVudHMpIHsKKyAgICAgICAgaWYgKG5ld0J1ZmZlcikgeworICAgICAgICAgICAgaWYgKCFpc0luUmFuZ2UoKHNpemVfdCkwdSwgbUJ1ZmZlci0+c2l6ZSgpLCBzaXplKSkgeworICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKworICAgICAgICAgICAgICAgIEFMT0dFKCJmcmFnbWVudGVkUmVhZCBFUlJPUl9NQUxGT1JNRUQgc2l6ZSAlenUiLCBzaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzc2l6ZV90IG51bV9ieXRlc19yZWFkID0KKyAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgKHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCksIHNpemUpOworCisgICAgICAgICAgICBpZiAobnVtX2J5dGVzX3JlYWQgPCAoc3NpemVfdClzaXplKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworCisgICAgICAgICAgICAgICAgQUxPR0UoImkvbyBlcnJvciIpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBzaXplKTsKKyAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAorICAgICAgICAgICAgICAgICAgICBrS2V5VGltZSwgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoKGludDY0X3Qpc21wbC0+ZHVyYXRpb24gKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworCisgICAgICAgICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDApIHsKKyAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCB0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUlzQVZDKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgbGF5ZXJJZCA9IEZpbmRBVkNMYXllcklkKAorICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5VGVtcG9yYWxMYXllcklkLCBsYXllcklkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGlzU3luY1NhbXBsZSkgeworICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICsrbUN1cnJlbnRTYW1wbGVJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbUlzQVZDICYmICFtSXNIRVZDKSB7CisgICAgICAgICAgICAqb3V0ID0gbUJ1ZmZlcjsKKyAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworCisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICAvLyBFYWNoIE5BTCB1bml0IGlzIHNwbGl0IHVwIGludG8gaXRzIGNvbnN0aXR1ZW50IGZyYWdtZW50cyBhbmQKKyAgICAgICAgLy8gZWFjaCBvbmUgb2YgdGhlbSByZXR1cm5lZCBpbiBpdHMgb3duIGJ1ZmZlci4KKworICAgICAgICBDSEVDSyhtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA+PSBtTkFMTGVuZ3RoU2l6ZSk7CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjID0KKyAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpICsgbUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CisKKyAgICAgICAgc2l6ZV90IG5hbF9zaXplID0gcGFyc2VOQUxTaXplKHNyYyk7CisgICAgICAgIGlmIChtTkFMTGVuZ3RoU2l6ZSA+IFNJWkVfTUFYIC0gbmFsX3NpemUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJiLzI0NDQxNTUzLCBiLzI0NDQ1MTIyIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSBtTkFMTGVuZ3RoU2l6ZSA8IG5hbF9zaXplKSB7CisgICAgICAgICAgICBBTE9HRSgiaW5jb21wbGV0ZSBOQUwgdW5pdC4iKTsKKworICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmNsb25lID0gbUJ1ZmZlci0+Y2xvbmUoKTsKKyAgICAgICAgQ0hFQ0soY2xvbmUgIT0gTlVMTCk7CisgICAgICAgIGNsb25lLT5zZXRfcmFuZ2UobUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkgKyBtTkFMTGVuZ3RoU2l6ZSwgbmFsX3NpemUpOworCisgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7CisgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgKKyAgICAgICAgICAgICAgICBtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIG1OQUxMZW5ndGhTaXplICsgbmFsX3NpemUsCisgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSBtTkFMTGVuZ3RoU2l6ZSAtIG5hbF9zaXplKTsKKworICAgICAgICBpZiAobUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICAqb3V0ID0gY2xvbmU7CisKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJ3aG9sZSBOQUwiKTsKKyAgICAgICAgLy8gV2hvbGUgTkFMIHVuaXRzIGFyZSByZXR1cm5lZCBidXQgZWFjaCBmcmFnbWVudCBpcyBwcmVmaXhlZCBieQorICAgICAgICAvLyB0aGUgc3RhcnQgY29kZSAoMHgwMCAwMCAwMCAwMSkuCisgICAgICAgIHNzaXplX3QgbnVtX2J5dGVzX3JlYWQgPSAwOworICAgICAgICBpbnQzMl90IGRybSA9IDA7CisgICAgICAgIGJvb2wgdXNlc0RSTSA9IChtRm9ybWF0LmZpbmRJbnQzMihrS2V5SXNEUk0sICZkcm0pICYmIGRybSAhPSAwKTsKKyAgICAgICAgdm9pZCAqZGF0YSA9IE5VTEw7CisgICAgICAgIGJvb2wgaXNNYWxGb3JtZWQgPSBmYWxzZTsKKyAgICAgICAgaWYgKHVzZXNEUk0pIHsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyID09IE5VTEwgfHwgIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBtQnVmZmVyLT5zaXplKCksIHNpemUpKSB7CisgICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkYXRhID0gbUJ1ZmZlci0+ZGF0YSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50MzJfdCBtYXhfc2l6ZTsKKyAgICAgICAgICAgIGlmICghbUZvcm1hdC5maW5kSW50MzIoa0tleU1heElucHV0U2l6ZSwgJm1heF9zaXplKQorICAgICAgICAgICAgICAgICAgICB8fCAhaXNJblJhbmdlKChzaXplX3QpMHUsIChzaXplX3QpbWF4X3NpemUsIHNpemUpKSB7CisgICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkYXRhID0gbVNyY0J1ZmZlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc01hbEZvcm1lZCB8fCBkYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJpc01hbEZvcm1lZCBzaXplICV6dSIsIHNpemUpOworICAgICAgICAgICAgaWYgKG1CdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgbnVtX2J5dGVzX3JlYWQgPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgaWYgKG51bV9ieXRlc19yZWFkIDwgKHNzaXplX3Qpc2l6ZSkgeworICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgICAgIEFMT0dFKCJpL28gZXJyb3IiKTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh1c2VzRFJNKSB7CisgICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOworICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUpOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1aW50OF90ICpkc3REYXRhID0gKHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCk7CisgICAgICAgICAgICBzaXplX3Qgc3JjT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIHNpemVfdCBkc3RPZmZzZXQgPSAwOworCisgICAgICAgICAgICB3aGlsZSAoc3JjT2Zmc2V0IDwgc2l6ZSkgeworICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG1OQUxMZW5ndGhTaXplKTsKKyAgICAgICAgICAgICAgICBzaXplX3QgbmFsTGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWlzTWFsRm9ybWVkKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbExlbmd0aCA9IHBhcnNlTkFMU2l6ZSgmbVNyY0J1ZmZlcltzcmNPZmZzZXRdKTsKKyAgICAgICAgICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG1OQUxMZW5ndGhTaXplOworICAgICAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBuYWxMZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBtQnVmZmVyLT5zaXplKCksIGRzdE9mZnNldCwgKHNpemVfdCk0dSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhaXNJblJhbmdlKChzaXplX3QpMHUsIG1CdWZmZXItPnNpemUoKSwgZHN0T2Zmc2V0ICsgNCwgbmFsTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaXNNYWxGb3JtZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlZpZGVvIGlzIG1hbGZvcm1lZDsgbmFsTGVuZ3RoICV6dSIsIG5hbExlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG5hbExlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChkc3RPZmZzZXQgPiBTSVpFX01BWCAtIDQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCArIDQgPiBTSVpFX01BWCAtIG5hbExlbmd0aCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCArIG5hbExlbmd0aCA+IG1CdWZmZXItPnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiYi8yNjM2NTM0OSA6ICV6dSAlenUiLCBkc3RPZmZzZXQsIG1CdWZmZXItPnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjYzNjUzNDkiKTsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKKyAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDE7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZkc3REYXRhW2RzdE9mZnNldF0sICZtU3JjQnVmZmVyW3NyY09mZnNldF0sIG5hbExlbmd0aCk7CisgICAgICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG5hbExlbmd0aDsKKyAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKz0gbmFsTGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ0hFQ0tfRVEoc3JjT2Zmc2V0LCBzaXplKTsKKyAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7CisgICAgICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgZHN0T2Zmc2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAorICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCisgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoKGludDY0X3Qpc21wbC0+ZHVyYXRpb24gKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworCisgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgeworICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCB0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzU3luY1NhbXBsZSkgeworICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICAgICAgfQorCisgICAgICAgICsrbUN1cnJlbnRTYW1wbGVJbmRleDsKKworICAgICAgICAqb3V0ID0gbUJ1ZmZlcjsKKyAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KK30KKworTVBFRzRFeHRyYWN0b3I6OlRyYWNrICpNUEVHNEV4dHJhY3Rvcjo6ZmluZFRyYWNrQnlNaW1lUHJlZml4KAorICAgICAgICBjb25zdCBjaGFyICptaW1lUHJlZml4KSB7CisgICAgZm9yIChUcmFjayAqdHJhY2sgPSBtRmlyc3RUcmFjazsgdHJhY2sgIT0gTlVMTDsgdHJhY2sgPSB0cmFjay0+bmV4dCkgeworICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICBpZiAodHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkKKyAgICAgICAgICAgICAgICAmJiAhc3RybmNhc2VjbXAobWltZSwgbWltZVByZWZpeCwgc3RybGVuKG1pbWVQcmVmaXgpKSkgeworICAgICAgICAgICAgcmV0dXJuIHRyYWNrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBib29sIExlZ2FjeVNuaWZmTVBFRzQoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKKyAgICB1aW50OF90IGhlYWRlcls4XTsKKworICAgIHNzaXplX3QgbiA9IHNvdXJjZS0+cmVhZEF0KDQsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpOworICAgIGlmIChuIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghbWVtY21wKGhlYWRlciwgImZ0eXAzZ3AiLCA3KSB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBtcDQyIiwgOCkKKyAgICAgICAgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwM2dyNiIsIDgpIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cDNnczYiLCA4KQorICAgICAgICB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXAzZ2U2IiwgOCkgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwM2dnNiIsIDgpCisgICAgICAgIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cGlzb20iLCA4KSB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBNNFYgIiwgOCkKKyAgICAgICAgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwTTRBICIsIDgpIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cGY0diAiLCA4KQorICAgICAgICB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBrZGRpIiwgOCkgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwTTRWUCIsIDgpCisgICAgICAgIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cG1pZjEiLCA4KSB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBoZWljIiwgOCkKKyAgICAgICAgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwbXNmMSIsIDgpIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cGhldmMiLCA4KSkgeworICAgICAgICAqY29uZmlkZW5jZSA9IDAuNDsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGlzQ29tcGF0aWJsZUJyYW5kKHVpbnQzMl90IGZvdXJjYykgeworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrQ29tcGF0aWJsZUJyYW5kc1tdID0geworICAgICAgICBGT1VSQ0MoJ2knLCAncycsICdvJywgJ20nKSwKKyAgICAgICAgRk9VUkNDKCdpJywgJ3MnLCAnbycsICcyJyksCisgICAgICAgIEZPVVJDQygnYScsICd2JywgJ2MnLCAnMScpLAorICAgICAgICBGT1VSQ0MoJ2gnLCAndicsICdjJywgJzEnKSwKKyAgICAgICAgRk9VUkNDKCdoJywgJ2UnLCAndicsICcxJyksCisgICAgICAgIEZPVVJDQygnMycsICdnJywgJ3AnLCAnNCcpLAorICAgICAgICBGT1VSQ0MoJ20nLCAncCcsICc0JywgJzEnKSwKKyAgICAgICAgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICcyJyksCisgICAgICAgIEZPVVJDQygnZCcsICdhJywgJ3MnLCAnaCcpLAorCisgICAgICAgIC8vIFdvbid0IHByb21pc2UgdGhhdCB0aGUgZm9sbG93aW5nIGZpbGUgdHlwZXMgY2FuIGJlIHBsYXllZC4KKyAgICAgICAgLy8gSnVzdCBnaXZlIHRoZXNlIGZpbGUgdHlwZXMgYSBjaGFuY2UuCisgICAgICAgIEZPVVJDQygncScsICd0JywgJyAnLCAnICcpLCAgLy8gQXBwbGUncyBRdWlja1RpbWUKKyAgICAgICAgRk9VUkNDKCdNJywgJ1MnLCAnTicsICdWJyksICAvLyBTb255J3MgUFNQCisKKyAgICAgICAgRk9VUkNDKCczJywgJ2cnLCAnMicsICdhJyksICAvLyAzR1BQMgorICAgICAgICBGT1VSQ0MoJzMnLCAnZycsICcyJywgJ2InKSwKKyAgICAgICAgRk9VUkNDKCdtJywgJ2knLCAnZicsICcxJyksICAvLyBIRUlGIGltYWdlCisgICAgICAgIEZPVVJDQygnaCcsICdlJywgJ2knLCAnYycpLCAgLy8gSEVJRiBpbWFnZQorICAgICAgICBGT1VSQ0MoJ20nLCAncycsICdmJywgJzEnKSwgIC8vIEhFSUYgaW1hZ2Ugc2VxdWVuY2UKKyAgICAgICAgRk9VUkNDKCdoJywgJ2UnLCAndicsICdjJyksICAvLyBIRUlGIGltYWdlIHNlcXVlbmNlCisgICAgfTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOworICAgICAgICAgaSA8IHNpemVvZihrQ29tcGF0aWJsZUJyYW5kcykgLyBzaXplb2Yoa0NvbXBhdGlibGVCcmFuZHNbMF0pOworICAgICAgICAgKytpKSB7CisgICAgICAgIGlmIChrQ29tcGF0aWJsZUJyYW5kc1tpXSA9PSBmb3VyY2MpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBBdHRlbXB0IHRvIGFjdHVhbGx5IHBhcnNlIHRoZSAnZnR5cCcgYXRvbSBhbmQgZGV0ZXJtaW5lIGlmIGEgc3VpdGFibGUKKy8vIGNvbXBhdGlibGUgYnJhbmQgaXMgcHJlc2VudC4KKy8vIEFsc28gdHJ5IHRvIGlkZW50aWZ5IHdoZXJlIHRoaXMgZmlsZSdzIG1ldGFkYXRhIGVuZHMKKy8vIChlbmQgb2YgdGhlICdtb292JyBhdG9tKSBhbmQgcmVwb3J0IGl0IHRvIHRoZSBjYWxsZXIgYXMgcGFydCBvZgorLy8gdGhlIG1ldGFkYXRhLgorc3RhdGljIGJvb2wgQmV0dGVyU25pZmZNUEVHNChEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworICAgIC8vIFdlIHNjYW4gdXAgdG8gMTI4IGJ5dGVzIHRvIGlkZW50aWZ5IHRoaXMgZmlsZSBhcyBhbiBNUDQuCisgICAgc3RhdGljIGNvbnN0IG9mZjY0X3Qga01heFNjYW5PZmZzZXQgPSAxMjhsbDsKKworICAgIG9mZjY0X3Qgb2Zmc2V0ID0gMGxsOworICAgIGJvb2wgZm91bmRHb29kRmlsZVR5cGUgPSBmYWxzZTsKKyAgICBvZmY2NF90IG1vb3ZBdG9tRW5kT2Zmc2V0ID0gLTFsbDsKKyAgICBib29sIGRvbmUgPSBmYWxzZTsKKworICAgIHdoaWxlICghZG9uZSAmJiBvZmZzZXQgPCBrTWF4U2Nhbk9mZnNldCkgeworICAgICAgICB1aW50MzJfdCBoZHJbMl07CisgICAgICAgIGlmIChzb3VyY2UtPnJlYWRBdChvZmZzZXQsIGhkciwgOCkgPCA4KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB1aW50NjRfdCBjaHVua1NpemUgPSBudG9obChoZHJbMF0pOworICAgICAgICB1aW50MzJfdCBjaHVua1R5cGUgPSBudG9obChoZHJbMV0pOworICAgICAgICBvZmY2NF90IGNodW5rRGF0YU9mZnNldCA9IG9mZnNldCArIDg7CisKKyAgICAgICAgaWYgKGNodW5rU2l6ZSA9PSAxKSB7CisgICAgICAgICAgICBpZiAoc291cmNlLT5yZWFkQXQob2Zmc2V0ICsgOCwgJmNodW5rU2l6ZSwgOCkgPCA4KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjaHVua1NpemUgPSBudG9oNjQoY2h1bmtTaXplKTsKKyAgICAgICAgICAgIGNodW5rRGF0YU9mZnNldCArPSA4OworCisgICAgICAgICAgICBpZiAoY2h1bmtTaXplIDwgMTYpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgc21hbGxlc3QgdmFsaWQgY2h1bmsgaXMgMTYgYnl0ZXMgbG9uZyBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSBpZiAoY2h1bmtTaXplIDwgOCkgeworICAgICAgICAgICAgLy8gVGhlIHNtYWxsZXN0IHZhbGlkIGNodW5rIGlzIDggYnl0ZXMgbG9uZy4KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIChkYXRhX29mZnNldCAtIG9mZnNldCkgaXMgZWl0aGVyIDggb3IgMTYKKyAgICAgICAgb2ZmNjRfdCBjaHVua0RhdGFTaXplID0gY2h1bmtTaXplIC0gKGNodW5rRGF0YU9mZnNldCAtIG9mZnNldCk7CisgICAgICAgIGlmIChjaHVua0RhdGFTaXplIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoImIvMjM1NDA5MTQiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGNoYXIgY2h1bmtzdHJpbmdbNV07CisgICAgICAgIE1ha2VGb3VyQ0NTdHJpbmcoY2h1bmtUeXBlLCBjaHVua3N0cmluZyk7CisgICAgICAgIEFMT0dWKCJzYXcgY2h1bmsgdHlwZSAlcywgc2l6ZSAlIiBQUkl1NjQgIiBAICVsbGQiLCBjaHVua3N0cmluZywgY2h1bmtTaXplLCAobG9uZyBsb25nKW9mZnNldCk7CisgICAgICAgIHN3aXRjaCAoY2h1bmtUeXBlKSB7CisgICAgICAgICAgICBjYXNlIEZPVVJDQygnZicsICd0JywgJ3knLCAncCcpOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjaHVua0RhdGFTaXplIDwgOCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdWludDMyX3QgbnVtQ29tcGF0aWJsZUJyYW5kcyA9IChjaHVua0RhdGFTaXplIC0gOCkgLyA0OworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtQ29tcGF0aWJsZUJyYW5kcyArIDI7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHRoaXMgaW5kZXgsIGl0IHJlZmVycyB0byB0aGUgbWlub3JWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IGEgYnJhbmQuCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJyYW5kOworICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rRGF0YU9mZnNldCArIDQgKiBpLCAmYnJhbmQsIDQpIDwgNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYnJhbmQgPSBudG9obChicmFuZCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29tcGF0aWJsZUJyYW5kKGJyYW5kKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRHb29kRmlsZVR5cGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWZvdW5kR29vZEZpbGVUeXBlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ3YnKToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtb292QXRvbUVuZE9mZnNldCA9IG9mZnNldCArIGNodW5rU2l6ZTsKKworICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgb2Zmc2V0ICs9IGNodW5rU2l6ZTsKKyAgICB9CisKKyAgICBpZiAoIWZvdW5kR29vZEZpbGVUeXBlKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAqY29uZmlkZW5jZSA9IDAuNGY7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIE1lZGlhRXh0cmFjdG9yKiBDcmVhdGVFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgdm9pZCAqKSB7CisgICAgcmV0dXJuIG5ldyBNUEVHNEV4dHJhY3Rvcihzb3VyY2UpOworfQorCitzdGF0aWMgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIFNuaWZmKAorICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKiwKKyAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSB7CisgICAgaWYgKEJldHRlclNuaWZmTVBFRzQoc291cmNlLCBjb25maWRlbmNlKSkgeworICAgICAgICByZXR1cm4gQ3JlYXRlRXh0cmFjdG9yOworICAgIH0KKworICAgIGlmIChMZWdhY3lTbmlmZk1QRUc0KHNvdXJjZSwgY29uZmlkZW5jZSkpIHsKKyAgICAgICAgQUxPR1coIklkZW50aWZpZWQgc3VwcG9ydGVkIG1wZWc0IHRocm91Z2ggTGVnYWN5U25pZmZNUEVHNC4iKTsKKyAgICAgICAgcmV0dXJuIENyZWF0ZUV4dHJhY3RvcjsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworZXh0ZXJuICJDIiB7CisvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCitfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCitNZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKKyAgICByZXR1cm4geworICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIFVVSUQoIjI3NTc1YzY3LTQ0MTctNGM1NC04ZDNkLThlNjI2OTg1YTE2NCIpLAorICAgICAgICAxLCAvLyB2ZXJzaW9uCisgICAgICAgICJNUDQgRXh0cmFjdG9yIiwKKyAgICAgICAgU25pZmYKKyAgICB9OworfQorCit9IC8vIGV4dGVybiAiQyIKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMWYxMjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5oCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNUEVHNF9FWFRSQUNUT1JfSF8KKworI2RlZmluZSBNUEVHNF9FWFRSQUNUT1JfSF8KKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworc3RydWN0IEFNZXNzYWdlOworY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitzdHJ1Y3QgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZTsKK2NsYXNzIFNhbXBsZVRhYmxlOworY2xhc3MgU3RyaW5nODsKK25hbWVzcGFjZSBoZWlmIHsKK2NsYXNzIEl0ZW1UYWJsZTsKK30KK3VzaW5nIGhlaWY6Okl0ZW1UYWJsZTsKKworc3RydWN0IFNpZHhFbnRyeSB7CisgICAgc2l6ZV90IG1TaXplOworICAgIHVpbnQzMl90IG1EdXJhdGlvblVzOworfTsKKworc3RydWN0IFRyZXggeworICAgIHVpbnQzMl90IHRyYWNrX0lEOworICAgIHVpbnQzMl90IGRlZmF1bHRfc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4OworICAgIHVpbnQzMl90IGRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uOworICAgIHVpbnQzMl90IGRlZmF1bHRfc2FtcGxlX3NpemU7CisgICAgdWludDMyX3QgZGVmYXVsdF9zYW1wbGVfZmxhZ3M7Cit9OworCitjbGFzcyBNUEVHNEV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgTVBFRzRFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSA9IE5VTEwpOworCisgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiTVBFRzRFeHRyYWN0b3IiOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5NUEVHNEV4dHJhY3RvcigpOworCitwcml2YXRlOgorCisgICAgc3RydWN0IFBzc2hJbmZvIHsKKyAgICAgICAgdWludDhfdCB1dWlkWzE2XTsKKyAgICAgICAgdWludDMyX3QgZGF0YWxlbjsKKyAgICAgICAgdWludDhfdCAqZGF0YTsKKyAgICB9OworICAgIHN0cnVjdCBUcmFjayB7CisgICAgICAgIFRyYWNrICpuZXh0OworICAgICAgICBNZXRhRGF0YUJhc2UgbWV0YTsKKyAgICAgICAgdWludDMyX3QgdGltZXNjYWxlOworICAgICAgICBzcDxTYW1wbGVUYWJsZT4gc2FtcGxlVGFibGU7CisgICAgICAgIGJvb2wgaW5jbHVkZXNfZXhwZW5zaXZlX21ldGFkYXRhOworICAgICAgICBib29sIHNraXBUcmFjazsKKyAgICAgICAgYm9vbCBoYXNfZWxzdDsKKyAgICAgICAgaW50NjRfdCBlbHN0X21lZGlhX3RpbWU7CisgICAgICAgIHVpbnQ2NF90IGVsc3Rfc2VnbWVudF9kdXJhdGlvbjsKKyAgICB9OworCisgICAgVmVjdG9yPFNpZHhFbnRyeT4gbVNpZHhFbnRyaWVzOworICAgIG9mZjY0X3QgbU1vb2ZPZmZzZXQ7CisgICAgYm9vbCBtTW9vZkZvdW5kOworICAgIGJvb2wgbU1kYXRGb3VuZDsKKworICAgIFZlY3RvcjxQc3NoSW5mbz4gbVBzc2g7CisKKyAgICBWZWN0b3I8VHJleD4gbVRyZXg7CisKKyAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSAqbUNhY2hlZFNvdXJjZTsKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworICAgIHVpbnQzMl90IG1IZWFkZXJUaW1lc2NhbGU7CisgICAgYm9vbCBtSXNRVDsKKyAgICBib29sIG1Jc0hlaWY7CisgICAgYm9vbCBtSGFzTW9vdkJveDsKKyAgICBib29sIG1QcmVmZXJIZWlmOworCisgICAgVHJhY2sgKm1GaXJzdFRyYWNrLCAqbUxhc3RUcmFjazsKKworICAgIE1ldGFEYXRhQmFzZSBtRmlsZU1ldGFEYXRhOworCisgICAgVmVjdG9yPHVpbnQzMl90PiBtUGF0aDsKKyAgICBTdHJpbmc4IG1MYXN0Q29tbWVudE1lYW47CisgICAgU3RyaW5nOCBtTGFzdENvbW1lbnROYW1lOworICAgIFN0cmluZzggbUxhc3RDb21tZW50RGF0YTsKKworICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBBU3RyaW5nPiBtTWV0YUtleU1hcDsKKworICAgIHN0YXR1c190IHJlYWRNZXRhRGF0YSgpOworICAgIHN0YXR1c190IHBhcnNlQ2h1bmsob2ZmNjRfdCAqb2Zmc2V0LCBpbnQgZGVwdGgpOworICAgIHN0YXR1c190IHBhcnNlSVR1bmVzTWV0YURhdGEob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKyAgICBzdGF0dXNfdCBwYXJzZUNvbG9ySW5mbyhvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOworICAgIHN0YXR1c190IHBhcnNlM0dQUE1ldGFEYXRhKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgaW50IGRlcHRoKTsKKyAgICB2b2lkIHBhcnNlSUQzdjJNZXRhRGF0YShvZmY2NF90IG9mZnNldCk7CisgICAgc3RhdHVzX3QgcGFyc2VRVE1ldGFLZXkob2ZmNjRfdCBkYXRhX29mZnNldCwgc2l6ZV90IGRhdGFfc2l6ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VRVE1ldGFWYWwoaW50MzJfdCBrZXlJZCwgb2ZmNjRfdCBkYXRhX29mZnNldCwgc2l6ZV90IGRhdGFfc2l6ZSk7CisKKyAgICBzdGF0dXNfdCB1cGRhdGVBdWRpb1RyYWNrSW5mb0Zyb21FU0RTX01QRUc0QXVkaW8oCisgICAgICAgICAgICBjb25zdCB2b2lkICplc2RzX2RhdGEsIHNpemVfdCBlc2RzX3NpemUpOworCisgICAgc3RhdGljIHN0YXR1c190IHZlcmlmeVRyYWNrKFRyYWNrICp0cmFjayk7CisKKyAgICBzcDxJdGVtVGFibGU+IG1JdGVtVGFibGU7CisKKyAgICBzdGF0dXNfdCBwYXJzZVRyYWNrSGVhZGVyKG9mZjY0X3QgZGF0YV9vZmZzZXQsIG9mZjY0X3QgZGF0YV9zaXplKTsKKworICAgIHN0YXR1c190IHBhcnNlU2VnbWVudEluZGV4KG9mZjY0X3QgZGF0YV9vZmZzZXQsIHNpemVfdCBkYXRhX3NpemUpOworCisgICAgVHJhY2sgKmZpbmRUcmFja0J5TWltZVByZWZpeChjb25zdCBjaGFyICptaW1lUHJlZml4KTsKKworICAgIHN0YXR1c190IHBhcnNlQUMzU2FtcGxlRW50cnkob2ZmNjRfdCBvZmZzZXQpOworICAgIHN0YXR1c190IHBhcnNlQUMzU3BlY2lmaWNCb3gob2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90IHNhbXBsZVJhdGUpOworCisgICAgTVBFRzRFeHRyYWN0b3IoY29uc3QgTVBFRzRFeHRyYWN0b3IgJik7CisgICAgTVBFRzRFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBNUEVHNEV4dHJhY3RvciAmKTsKK307CisKK2Jvb2wgU25pZmZNUEVHNCgKKyAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICBzcDxBTWVzc2FnZT4gKik7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTVBFRzRfRVhUUkFDVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9OT1RJQ0UgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9OT1RJQ0UKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9OT1RJQ0UKY29weSB0byBtZWRpYS9leHRyYWN0b3JzL21wNC9OT1RJQ0UKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZUl0ZXJhdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZUl0ZXJhdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2VlN2M2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlSXRlcmF0b3IuY3BwCkBAIC0wLDAgKzEsMzUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJTYW1wbGVJdGVyYXRvciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIlNhbXBsZUl0ZXJhdG9yLmgiCisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgorCisjaW5jbHVkZSAiU2FtcGxlVGFibGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitTYW1wbGVJdGVyYXRvcjo6U2FtcGxlSXRlcmF0b3IoU2FtcGxlVGFibGUgKnRhYmxlKQorICAgIDogbVRhYmxlKHRhYmxlKSwKKyAgICAgIG1Jbml0aWFsaXplZChmYWxzZSksCisgICAgICBtVGltZVRvU2FtcGxlSW5kZXgoMCksCisgICAgICBtVFRTU2FtcGxlSW5kZXgoMCksCisgICAgICBtVFRTU2FtcGxlVGltZSgwKSwKKyAgICAgIG1UVFNDb3VudCgwKSwKKyAgICAgIG1UVFNEdXJhdGlvbigwKSB7CisgICAgcmVzZXQoKTsKK30KKwordm9pZCBTYW1wbGVJdGVyYXRvcjo6cmVzZXQoKSB7CisgICAgbVNhbXBsZVRvQ2h1bmtJbmRleCA9IDA7CisgICAgbUZpcnN0Q2h1bmsgPSAwOworICAgIG1GaXJzdENodW5rU2FtcGxlSW5kZXggPSAwOworICAgIG1TdG9wQ2h1bmsgPSAwOworICAgIG1TdG9wQ2h1bmtTYW1wbGVJbmRleCA9IDA7CisgICAgbVNhbXBsZXNQZXJDaHVuayA9IDA7CisgICAgbUNodW5rRGVzYyA9IDA7Cit9CisKK3N0YXR1c190IFNhbXBsZUl0ZXJhdG9yOjpzZWVrVG8odWludDMyX3Qgc2FtcGxlSW5kZXgpIHsKKyAgICBBTE9HVigic2Vla1RvKCVkKSIsIHNhbXBsZUluZGV4KTsKKworICAgIGlmIChzYW1wbGVJbmRleCA+PSBtVGFibGUtPm1OdW1TYW1wbGVTaXplcykgeworICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9CisKKyAgICBpZiAobVRhYmxlLT5tU2FtcGxlVG9DaHVua09mZnNldCA8IDAKKyAgICAgICAgICAgIHx8IG1UYWJsZS0+bUNodW5rT2Zmc2V0T2Zmc2V0IDwgMAorICAgICAgICAgICAgfHwgbVRhYmxlLT5tU2FtcGxlU2l6ZU9mZnNldCA8IDAKKyAgICAgICAgICAgIHx8IG1UYWJsZS0+bVRpbWVUb1NhbXBsZUNvdW50ID09IDApIHsKKworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGlmIChtSW5pdGlhbGl6ZWQgJiYgbUN1cnJlbnRTYW1wbGVJbmRleCA9PSBzYW1wbGVJbmRleCkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaWYgKCFtSW5pdGlhbGl6ZWQgfHwgc2FtcGxlSW5kZXggPCBtRmlyc3RDaHVua1NhbXBsZUluZGV4KSB7CisgICAgICAgIHJlc2V0KCk7CisgICAgfQorCisgICAgaWYgKHNhbXBsZUluZGV4ID49IG1TdG9wQ2h1bmtTYW1wbGVJbmRleCkgeworICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgIGlmICgoZXJyID0gZmluZENodW5rUmFuZ2Uoc2FtcGxlSW5kZXgpKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoImZpbmRDaHVua1JhbmdlIGZhaWxlZCIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIENIRUNLKHNhbXBsZUluZGV4IDwgbVN0b3BDaHVua1NhbXBsZUluZGV4KTsKKworICAgIGlmIChtU2FtcGxlc1BlckNodW5rID09IDApIHsKKyAgICAgICAgQUxPR0UoImIvMjI4MDIzNDQiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBjaHVuayA9CisgICAgICAgIChzYW1wbGVJbmRleCAtIG1GaXJzdENodW5rU2FtcGxlSW5kZXgpIC8gbVNhbXBsZXNQZXJDaHVuaworICAgICAgICArIG1GaXJzdENodW5rOworCisgICAgaWYgKCFtSW5pdGlhbGl6ZWQgfHwgY2h1bmsgIT0gbUN1cnJlbnRDaHVua0luZGV4KSB7CisgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgaWYgKChlcnIgPSBnZXRDaHVua09mZnNldChjaHVuaywgJm1DdXJyZW50Q2h1bmtPZmZzZXQpKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoImdldENodW5rT2Zmc2V0IHJldHVybiBlcnJvciIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIG1DdXJyZW50Q2h1bmtTYW1wbGVTaXplcy5jbGVhcigpOworCisgICAgICAgIHVpbnQzMl90IGZpcnN0Q2h1bmtTYW1wbGVJbmRleCA9CisgICAgICAgICAgICBtRmlyc3RDaHVua1NhbXBsZUluZGV4CisgICAgICAgICAgICAgICAgKyBtU2FtcGxlc1BlckNodW5rICogKGNodW5rIC0gbUZpcnN0Q2h1bmspOworCisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtU2FtcGxlc1BlckNodW5rOyArK2kpIHsKKyAgICAgICAgICAgIHNpemVfdCBzYW1wbGVTaXplOworICAgICAgICAgICAgaWYgKChlcnIgPSBnZXRTYW1wbGVTaXplRGlyZWN0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q2h1bmtTYW1wbGVJbmRleCArIGksICZzYW1wbGVTaXplKSkgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0U2FtcGxlU2l6ZURpcmVjdCByZXR1cm4gZXJyb3IiKTsKKyAgICAgICAgICAgICAgICBtQ3VycmVudENodW5rU2FtcGxlU2l6ZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtQ3VycmVudENodW5rU2FtcGxlU2l6ZXMucHVzaChzYW1wbGVTaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIG1DdXJyZW50Q2h1bmtJbmRleCA9IGNodW5rOworICAgIH0KKworICAgIHVpbnQzMl90IGNodW5rUmVsYXRpdmVTYW1wbGVJbmRleCA9CisgICAgICAgIChzYW1wbGVJbmRleCAtIG1GaXJzdENodW5rU2FtcGxlSW5kZXgpICUgbVNhbXBsZXNQZXJDaHVuazsKKworICAgIG1DdXJyZW50U2FtcGxlT2Zmc2V0ID0gbUN1cnJlbnRDaHVua09mZnNldDsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY2h1bmtSZWxhdGl2ZVNhbXBsZUluZGV4OyArK2kpIHsKKyAgICAgICAgbUN1cnJlbnRTYW1wbGVPZmZzZXQgKz0gbUN1cnJlbnRDaHVua1NhbXBsZVNpemVzW2ldOworICAgIH0KKworICAgIG1DdXJyZW50U2FtcGxlU2l6ZSA9IG1DdXJyZW50Q2h1bmtTYW1wbGVTaXplc1tjaHVua1JlbGF0aXZlU2FtcGxlSW5kZXhdOworICAgIGlmIChzYW1wbGVJbmRleCA8IG1UVFNTYW1wbGVJbmRleCkgeworICAgICAgICBtVGltZVRvU2FtcGxlSW5kZXggPSAwOworICAgICAgICBtVFRTU2FtcGxlSW5kZXggPSAwOworICAgICAgICBtVFRTU2FtcGxlVGltZSA9IDA7CisgICAgICAgIG1UVFNDb3VudCA9IDA7CisgICAgICAgIG1UVFNEdXJhdGlvbiA9IDA7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyOworICAgIGlmICgoZXJyID0gZmluZFNhbXBsZVRpbWVBbmREdXJhdGlvbigKKyAgICAgICAgICAgIHNhbXBsZUluZGV4LCAmbUN1cnJlbnRTYW1wbGVUaW1lLCAmbUN1cnJlbnRTYW1wbGVEdXJhdGlvbikpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJmaW5kU2FtcGxlVGltZSByZXR1cm4gZXJyb3IiKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBtQ3VycmVudFNhbXBsZUluZGV4ID0gc2FtcGxlSW5kZXg7CisKKyAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTYW1wbGVJdGVyYXRvcjo6ZmluZENodW5rUmFuZ2UodWludDMyX3Qgc2FtcGxlSW5kZXgpIHsKKyAgICBDSEVDSyhzYW1wbGVJbmRleCA+PSBtRmlyc3RDaHVua1NhbXBsZUluZGV4KTsKKworICAgIHdoaWxlIChzYW1wbGVJbmRleCA+PSBtU3RvcENodW5rU2FtcGxlSW5kZXgpIHsKKyAgICAgICAgaWYgKG1TYW1wbGVUb0NodW5rSW5kZXggPT0gbVRhYmxlLT5tTnVtU2FtcGxlVG9DaHVua09mZnNldHMpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgICAgIH0KKworICAgICAgICBtRmlyc3RDaHVua1NhbXBsZUluZGV4ID0gbVN0b3BDaHVua1NhbXBsZUluZGV4OworCisgICAgICAgIGNvbnN0IFNhbXBsZVRhYmxlOjpTYW1wbGVUb0NodW5rRW50cnkgKmVudHJ5ID0KKyAgICAgICAgICAgICZtVGFibGUtPm1TYW1wbGVUb0NodW5rRW50cmllc1ttU2FtcGxlVG9DaHVua0luZGV4XTsKKworICAgICAgICBtRmlyc3RDaHVuayA9IGVudHJ5LT5zdGFydENodW5rOworICAgICAgICBtU2FtcGxlc1BlckNodW5rID0gZW50cnktPnNhbXBsZXNQZXJDaHVuazsKKyAgICAgICAgbUNodW5rRGVzYyA9IGVudHJ5LT5jaHVua0Rlc2M7CisKKyAgICAgICAgaWYgKG1TYW1wbGVUb0NodW5rSW5kZXggKyAxIDwgbVRhYmxlLT5tTnVtU2FtcGxlVG9DaHVua09mZnNldHMpIHsKKyAgICAgICAgICAgIG1TdG9wQ2h1bmsgPSBlbnRyeVsxXS5zdGFydENodW5rOworCisgICAgICAgICAgICBpZiAobVNhbXBsZXNQZXJDaHVuayA9PSAwIHx8IG1TdG9wQ2h1bmsgPCBtRmlyc3RDaHVuayB8fAorICAgICAgICAgICAgICAgIChtU3RvcENodW5rIC0gbUZpcnN0Q2h1bmspID4gVUlOVDMyX01BWCAvIG1TYW1wbGVzUGVyQ2h1bmsgfHwKKyAgICAgICAgICAgICAgICAoKG1TdG9wQ2h1bmsgLSBtRmlyc3RDaHVuaykgKiBtU2FtcGxlc1BlckNodW5rID4KKyAgICAgICAgICAgICAgICAgVUlOVDMyX01BWCAtIG1GaXJzdENodW5rU2FtcGxlSW5kZXgpKSB7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVN0b3BDaHVua1NhbXBsZUluZGV4ID0KKyAgICAgICAgICAgICAgICBtRmlyc3RDaHVua1NhbXBsZUluZGV4CisgICAgICAgICAgICAgICAgICAgICsgKG1TdG9wQ2h1bmsgLSBtRmlyc3RDaHVuaykgKiBtU2FtcGxlc1BlckNodW5rOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVN0b3BDaHVuayA9IDB4ZmZmZmZmZmY7CisgICAgICAgICAgICBtU3RvcENodW5rU2FtcGxlSW5kZXggPSAweGZmZmZmZmZmOworICAgICAgICB9CisKKyAgICAgICAgKyttU2FtcGxlVG9DaHVua0luZGV4OworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU2FtcGxlSXRlcmF0b3I6OmdldENodW5rT2Zmc2V0KHVpbnQzMl90IGNodW5rLCBvZmY2NF90ICpvZmZzZXQpIHsKKyAgICAqb2Zmc2V0ID0gMDsKKworICAgIGlmIChjaHVuayA+PSBtVGFibGUtPm1OdW1DaHVua09mZnNldHMpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICB9CisKKyAgICBpZiAobVRhYmxlLT5tQ2h1bmtPZmZzZXRUeXBlID09IFNhbXBsZVRhYmxlOjprQ2h1bmtPZmZzZXRUeXBlMzIpIHsKKyAgICAgICAgdWludDMyX3Qgb2Zmc2V0MzI7CisKKyAgICAgICAgaWYgKG1UYWJsZS0+bURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgbVRhYmxlLT5tQ2h1bmtPZmZzZXRPZmZzZXQgKyA4ICsgNCAqIGNodW5rLAorICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0MzIsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihvZmZzZXQzMikpIDwgKHNzaXplX3Qpc2l6ZW9mKG9mZnNldDMyKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICB9CisKKyAgICAgICAgKm9mZnNldCA9IG50b2hsKG9mZnNldDMyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBDSEVDS19FUShtVGFibGUtPm1DaHVua09mZnNldFR5cGUsIFNhbXBsZVRhYmxlOjprQ2h1bmtPZmZzZXRUeXBlNjQpOworCisgICAgICAgIHVpbnQ2NF90IG9mZnNldDY0OworICAgICAgICBpZiAobVRhYmxlLT5tRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICBtVGFibGUtPm1DaHVua09mZnNldE9mZnNldCArIDggKyA4ICogY2h1bmssCisgICAgICAgICAgICAgICAgICAgICZvZmZzZXQ2NCwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9mZnNldDY0KSkgPCAoc3NpemVfdClzaXplb2Yob2Zmc2V0NjQpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKworICAgICAgICAqb2Zmc2V0ID0gbnRvaDY0KG9mZnNldDY0KTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFNhbXBsZUl0ZXJhdG9yOjpnZXRTYW1wbGVTaXplRGlyZWN0KAorICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCwgc2l6ZV90ICpzaXplKSB7CisgICAgKnNpemUgPSAwOworCisgICAgaWYgKHNhbXBsZUluZGV4ID49IG1UYWJsZS0+bU51bVNhbXBsZVNpemVzKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgfQorCisgICAgaWYgKG1UYWJsZS0+bURlZmF1bHRTYW1wbGVTaXplID4gMCkgeworICAgICAgICAqc2l6ZSA9IG1UYWJsZS0+bURlZmF1bHRTYW1wbGVTaXplOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3dpdGNoIChtVGFibGUtPm1TYW1wbGVTaXplRmllbGRTaXplKSB7CisgICAgICAgIGNhc2UgMzI6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHg7CisgICAgICAgICAgICBpZiAobVRhYmxlLT5tRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICAgICAgbVRhYmxlLT5tU2FtcGxlU2l6ZU9mZnNldCArIDEyICsgNCAqIHNhbXBsZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgJngsIHNpemVvZih4KSkgPCAoc3NpemVfdClzaXplb2YoeCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICpzaXplID0gbnRvaGwoeCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgMTY6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHg7CisgICAgICAgICAgICBpZiAobVRhYmxlLT5tRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICAgICAgbVRhYmxlLT5tU2FtcGxlU2l6ZU9mZnNldCArIDEyICsgMiAqIHNhbXBsZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgJngsIHNpemVvZih4KSkgPCAoc3NpemVfdClzaXplb2YoeCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICpzaXplID0gbnRvaHMoeCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgODoKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB4OworICAgICAgICAgICAgaWYgKG1UYWJsZS0+bURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UYWJsZS0+bVNhbXBsZVNpemVPZmZzZXQgKyAxMiArIHNhbXBsZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgJngsIHNpemVvZih4KSkgPCAoc3NpemVfdClzaXplb2YoeCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICpzaXplID0geDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfRVEobVRhYmxlLT5tU2FtcGxlU2l6ZUZpZWxkU2l6ZSwgNHUpOworCisgICAgICAgICAgICB1aW50OF90IHg7CisgICAgICAgICAgICBpZiAobVRhYmxlLT5tRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICAgICAgbVRhYmxlLT5tU2FtcGxlU2l6ZU9mZnNldCArIDEyICsgc2FtcGxlSW5kZXggLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgJngsIHNpemVvZih4KSkgPCAoc3NpemVfdClzaXplb2YoeCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICpzaXplID0gKHNhbXBsZUluZGV4ICYgMSkgPyB4ICYgMHgwZiA6IHggPj4gNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTYW1wbGVJdGVyYXRvcjo6ZmluZFNhbXBsZVRpbWVBbmREdXJhdGlvbigKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXgsIHVpbnQzMl90ICp0aW1lLCB1aW50MzJfdCAqZHVyYXRpb24pIHsKKyAgICBpZiAoc2FtcGxlSW5kZXggPj0gbVRhYmxlLT5tTnVtU2FtcGxlU2l6ZXMpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICB9CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAobVRUU1NhbXBsZUluZGV4ID4gVUlOVDMyX01BWCAtIG1UVFNDb3VudCkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICAgICAgfQorICAgICAgICBpZihzYW1wbGVJbmRleCA8IG1UVFNTYW1wbGVJbmRleCArIG1UVFNDb3VudCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1UaW1lVG9TYW1wbGVJbmRleCA9PSBtVGFibGUtPm1UaW1lVG9TYW1wbGVDb3VudCB8fAorICAgICAgICAgICAgKG1UVFNEdXJhdGlvbiAhPSAwICYmIG1UVFNDb3VudCA+IFVJTlQzMl9NQVggLyBtVFRTRHVyYXRpb24pIHx8CisgICAgICAgICAgICBtVFRTU2FtcGxlVGltZSA+IFVJTlQzMl9NQVggLSAobVRUU0NvdW50ICogbVRUU0R1cmF0aW9uKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICAgICAgfQorCisgICAgICAgIG1UVFNTYW1wbGVJbmRleCArPSBtVFRTQ291bnQ7CisgICAgICAgIG1UVFNTYW1wbGVUaW1lICs9IG1UVFNDb3VudCAqIG1UVFNEdXJhdGlvbjsKKworICAgICAgICBtVFRTQ291bnQgPSBtVGFibGUtPm1UaW1lVG9TYW1wbGVbMiAqIG1UaW1lVG9TYW1wbGVJbmRleF07CisgICAgICAgIG1UVFNEdXJhdGlvbiA9IG1UYWJsZS0+bVRpbWVUb1NhbXBsZVsyICogbVRpbWVUb1NhbXBsZUluZGV4ICsgMV07CisKKyAgICAgICAgKyttVGltZVRvU2FtcGxlSW5kZXg7CisgICAgfQorCisgICAgKnRpbWUgPSBtVFRTU2FtcGxlVGltZSArIG1UVFNEdXJhdGlvbiAqIChzYW1wbGVJbmRleCAtIG1UVFNTYW1wbGVJbmRleCk7CisKKyAgICBpbnQzMl90IG9mZnNldCA9IG1UYWJsZS0+Z2V0Q29tcG9zaXRpb25UaW1lT2Zmc2V0KHNhbXBsZUluZGV4KTsKKyAgICBpZiAoKG9mZnNldCA8IDAgJiYgKnRpbWUgPCAob2Zmc2V0ID09IElOVDMyX01JTiA/CisgICAgICAgICAgICBJTlQzMl9NQVggOiB1aW50MzJfdCgtb2Zmc2V0KSkpIHx8CisgICAgICAgICAgICAob2Zmc2V0ID4gMCAmJiAqdGltZSA+IFVJTlQzMl9NQVggLSBvZmZzZXQpKSB7CisgICAgICAgIEFMT0dFKCIldSArICVkIHdvdWxkIG92ZXJmbG93IiwgKnRpbWUsIG9mZnNldCk7CisgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgfQorICAgIGlmIChvZmZzZXQgPiAwKSB7CisgICAgICAgICp0aW1lICs9IG9mZnNldDsKKyAgICB9IGVsc2UgeworICAgICAgICAqdGltZSAtPSAob2Zmc2V0ID09IElOVDMyX01JTiA/IElOVDMyX01BWCA6ICgtb2Zmc2V0KSk7CisgICAgfQorCisgICAgKmR1cmF0aW9uID0gbVRUU0R1cmF0aW9uOworCisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NhbXBsZUl0ZXJhdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVJdGVyYXRvci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NhbXBsZUl0ZXJhdG9yLmgKcmVuYW1lIHRvIG1lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZUl0ZXJhdG9yLmgKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZVRhYmxlLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZVRhYmxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWMzNTNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuY3BwCkBAIC0wLDAgKzEsMTAwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiU2FtcGxlVGFibGUiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlICJTYW1wbGVUYWJsZS5oIgorI2luY2x1ZGUgIlNhbXBsZUl0ZXJhdG9yLmgiCisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgorCisvKiBUT0RPOiByZW1vdmUgYWZ0ZXIgYmVpbmcgbWVyZ2VkIGludG8gb3RoZXIgYnJhbmNoZXMgKi8KKyNpZm5kZWYgVUlOVDMyX01BWAorI2RlZmluZSBVSU5UMzJfTUFYICAgICAgICg0Mjk0OTY3Mjk1VSkKKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0YXRpYworY29uc3QgdWludDMyX3QgU2FtcGxlVGFibGU6OmtDaHVua09mZnNldFR5cGUzMiA9IEZPVVJDQygncycsICd0JywgJ2MnLCAnbycpOworLy8gc3RhdGljCitjb25zdCB1aW50MzJfdCBTYW1wbGVUYWJsZTo6a0NodW5rT2Zmc2V0VHlwZTY0ID0gRk9VUkNDKCdjJywgJ28nLCAnNicsICc0Jyk7CisvLyBzdGF0aWMKK2NvbnN0IHVpbnQzMl90IFNhbXBsZVRhYmxlOjprU2FtcGxlU2l6ZVR5cGUzMiA9IEZPVVJDQygncycsICd0JywgJ3MnLCAneicpOworLy8gc3RhdGljCitjb25zdCB1aW50MzJfdCBTYW1wbGVUYWJsZTo6a1NhbXBsZVNpemVUeXBlQ29tcGFjdCA9IEZPVVJDQygncycsICd0JywgJ3onLCAnMicpOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjb25zdCBvZmY2NF90IGtNYXhPZmZzZXQgPSBzdGQ6Om51bWVyaWNfbGltaXRzPG9mZjY0X3Q+OjptYXgoKTsKKworc3RydWN0IFNhbXBsZVRhYmxlOjpDb21wb3NpdGlvbkRlbHRhTG9va3VwIHsKKyAgICBDb21wb3NpdGlvbkRlbHRhTG9va3VwKCk7CisKKyAgICB2b2lkIHNldEVudHJpZXMoCisgICAgICAgICAgICBjb25zdCBpbnQzMl90ICpkZWx0YUVudHJpZXMsIHNpemVfdCBudW1EZWx0YUVudHJpZXMpOworCisgICAgaW50MzJfdCBnZXRDb21wb3NpdGlvblRpbWVPZmZzZXQodWludDMyX3Qgc2FtcGxlSW5kZXgpOworCitwcml2YXRlOgorICAgIE11dGV4IG1Mb2NrOworCisgICAgY29uc3QgaW50MzJfdCAqbURlbHRhRW50cmllczsKKyAgICBzaXplX3QgbU51bURlbHRhRW50cmllczsKKworICAgIHNpemVfdCBtQ3VycmVudERlbHRhRW50cnk7CisgICAgc2l6ZV90IG1DdXJyZW50RW50cnlTYW1wbGVJbmRleDsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENvbXBvc2l0aW9uRGVsdGFMb29rdXApOworfTsKKworU2FtcGxlVGFibGU6OkNvbXBvc2l0aW9uRGVsdGFMb29rdXA6OkNvbXBvc2l0aW9uRGVsdGFMb29rdXAoKQorICAgIDogbURlbHRhRW50cmllcyhOVUxMKSwKKyAgICAgIG1OdW1EZWx0YUVudHJpZXMoMCksCisgICAgICBtQ3VycmVudERlbHRhRW50cnkoMCksCisgICAgICBtQ3VycmVudEVudHJ5U2FtcGxlSW5kZXgoMCkgeworfQorCit2b2lkIFNhbXBsZVRhYmxlOjpDb21wb3NpdGlvbkRlbHRhTG9va3VwOjpzZXRFbnRyaWVzKAorICAgICAgICBjb25zdCBpbnQzMl90ICpkZWx0YUVudHJpZXMsIHNpemVfdCBudW1EZWx0YUVudHJpZXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOworCisgICAgbURlbHRhRW50cmllcyA9IGRlbHRhRW50cmllczsKKyAgICBtTnVtRGVsdGFFbnRyaWVzID0gbnVtRGVsdGFFbnRyaWVzOworICAgIG1DdXJyZW50RGVsdGFFbnRyeSA9IDA7CisgICAgbUN1cnJlbnRFbnRyeVNhbXBsZUluZGV4ID0gMDsKK30KKworaW50MzJfdCBTYW1wbGVUYWJsZTo6Q29tcG9zaXRpb25EZWx0YUxvb2t1cDo6Z2V0Q29tcG9zaXRpb25UaW1lT2Zmc2V0KAorICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CisKKyAgICBpZiAobURlbHRhRW50cmllcyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChzYW1wbGVJbmRleCA8IG1DdXJyZW50RW50cnlTYW1wbGVJbmRleCkgeworICAgICAgICBtQ3VycmVudERlbHRhRW50cnkgPSAwOworICAgICAgICBtQ3VycmVudEVudHJ5U2FtcGxlSW5kZXggPSAwOworICAgIH0KKworICAgIHdoaWxlIChtQ3VycmVudERlbHRhRW50cnkgPCBtTnVtRGVsdGFFbnRyaWVzKSB7CisgICAgICAgIHVpbnQzMl90IHNhbXBsZUNvdW50ID0gbURlbHRhRW50cmllc1syICogbUN1cnJlbnREZWx0YUVudHJ5XTsKKyAgICAgICAgaWYgKHNhbXBsZUluZGV4IDwgbUN1cnJlbnRFbnRyeVNhbXBsZUluZGV4ICsgc2FtcGxlQ291bnQpIHsKKyAgICAgICAgICAgIHJldHVybiBtRGVsdGFFbnRyaWVzWzIgKiBtQ3VycmVudERlbHRhRW50cnkgKyAxXTsKKyAgICAgICAgfQorCisgICAgICAgIG1DdXJyZW50RW50cnlTYW1wbGVJbmRleCArPSBzYW1wbGVDb3VudDsKKyAgICAgICAgKyttQ3VycmVudERlbHRhRW50cnk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1NhbXBsZVRhYmxlOjpTYW1wbGVUYWJsZShEYXRhU291cmNlQmFzZSAqc291cmNlKQorICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKKyAgICAgIG1DaHVua09mZnNldE9mZnNldCgtMSksCisgICAgICBtQ2h1bmtPZmZzZXRUeXBlKDApLAorICAgICAgbU51bUNodW5rT2Zmc2V0cygwKSwKKyAgICAgIG1TYW1wbGVUb0NodW5rT2Zmc2V0KC0xKSwKKyAgICAgIG1OdW1TYW1wbGVUb0NodW5rT2Zmc2V0cygwKSwKKyAgICAgIG1TYW1wbGVTaXplT2Zmc2V0KC0xKSwKKyAgICAgIG1TYW1wbGVTaXplRmllbGRTaXplKDApLAorICAgICAgbURlZmF1bHRTYW1wbGVTaXplKDApLAorICAgICAgbU51bVNhbXBsZVNpemVzKDApLAorICAgICAgbUhhc1RpbWVUb1NhbXBsZShmYWxzZSksCisgICAgICBtVGltZVRvU2FtcGxlQ291bnQoMCksCisgICAgICBtVGltZVRvU2FtcGxlKE5VTEwpLAorICAgICAgbVNhbXBsZVRpbWVFbnRyaWVzKE5VTEwpLAorICAgICAgbUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllcyhOVUxMKSwKKyAgICAgIG1OdW1Db21wb3NpdGlvblRpbWVEZWx0YUVudHJpZXMoMCksCisgICAgICBtQ29tcG9zaXRpb25EZWx0YUxvb2t1cChuZXcgQ29tcG9zaXRpb25EZWx0YUxvb2t1cCksCisgICAgICBtU3luY1NhbXBsZU9mZnNldCgtMSksCisgICAgICBtTnVtU3luY1NhbXBsZXMoMCksCisgICAgICBtU3luY1NhbXBsZXMoTlVMTCksCisgICAgICBtTGFzdFN5bmNTYW1wbGVJbmRleCgwKSwKKyAgICAgIG1TYW1wbGVUb0NodW5rRW50cmllcyhOVUxMKSwKKyAgICAgIG1Ub3RhbFNpemUoMCkgeworICAgIG1TYW1wbGVJdGVyYXRvciA9IG5ldyBTYW1wbGVJdGVyYXRvcih0aGlzKTsKK30KKworU2FtcGxlVGFibGU6On5TYW1wbGVUYWJsZSgpIHsKKyAgICBkZWxldGVbXSBtU2FtcGxlVG9DaHVua0VudHJpZXM7CisgICAgbVNhbXBsZVRvQ2h1bmtFbnRyaWVzID0gTlVMTDsKKworICAgIGRlbGV0ZVtdIG1TeW5jU2FtcGxlczsKKyAgICBtU3luY1NhbXBsZXMgPSBOVUxMOworCisgICAgZGVsZXRlW10gbVRpbWVUb1NhbXBsZTsKKyAgICBtVGltZVRvU2FtcGxlID0gTlVMTDsKKworICAgIGRlbGV0ZSBtQ29tcG9zaXRpb25EZWx0YUxvb2t1cDsKKyAgICBtQ29tcG9zaXRpb25EZWx0YUxvb2t1cCA9IE5VTEw7CisKKyAgICBkZWxldGVbXSBtQ29tcG9zaXRpb25UaW1lRGVsdGFFbnRyaWVzOworICAgIG1Db21wb3NpdGlvblRpbWVEZWx0YUVudHJpZXMgPSBOVUxMOworCisgICAgZGVsZXRlW10gbVNhbXBsZVRpbWVFbnRyaWVzOworICAgIG1TYW1wbGVUaW1lRW50cmllcyA9IE5VTEw7CisKKyAgICBkZWxldGUgbVNhbXBsZUl0ZXJhdG9yOworICAgIG1TYW1wbGVJdGVyYXRvciA9IE5VTEw7Cit9CisKK2Jvb2wgU2FtcGxlVGFibGU6OmlzVmFsaWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1DaHVua09mZnNldE9mZnNldCA+PSAwCisgICAgICAgICYmIG1TYW1wbGVUb0NodW5rT2Zmc2V0ID49IDAKKyAgICAgICAgJiYgbVNhbXBsZVNpemVPZmZzZXQgPj0gMAorICAgICAgICAmJiBtSGFzVGltZVRvU2FtcGxlOworfQorCitzdGF0dXNfdCBTYW1wbGVUYWJsZTo6c2V0Q2h1bmtPZmZzZXRQYXJhbXMoCisgICAgICAgIHVpbnQzMl90IHR5cGUsIG9mZjY0X3QgZGF0YV9vZmZzZXQsIHNpemVfdCBkYXRhX3NpemUpIHsKKyAgICBpZiAobUNodW5rT2Zmc2V0T2Zmc2V0ID49IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBDSEVDSyh0eXBlID09IGtDaHVua09mZnNldFR5cGUzMiB8fCB0eXBlID09IGtDaHVua09mZnNldFR5cGU2NCk7CisKKyAgICBtQ2h1bmtPZmZzZXRPZmZzZXQgPSBkYXRhX29mZnNldDsKKyAgICBtQ2h1bmtPZmZzZXRUeXBlID0gdHlwZTsKKworICAgIGlmIChkYXRhX3NpemUgPCA4KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdWludDhfdCBoZWFkZXJbOF07CisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKworICAgIGlmIChVMzJfQVQoaGVhZGVyKSAhPSAwKSB7CisgICAgICAgIC8vIEV4cGVjdGVkIHZlcnNpb24gPSAwLCBmbGFncyA9IDAuCisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgbU51bUNodW5rT2Zmc2V0cyA9IFUzMl9BVCgmaGVhZGVyWzRdKTsKKworICAgIGlmIChtQ2h1bmtPZmZzZXRUeXBlID09IGtDaHVua09mZnNldFR5cGUzMikgeworICAgICAgaWYgKChkYXRhX3NpemUgLSA4KSAvIDQgPCBtTnVtQ2h1bmtPZmZzZXRzKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICgoZGF0YV9zaXplIC0gOCkgLyA4IDwgbU51bUNodW5rT2Zmc2V0cykgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU2FtcGxlVGFibGU6OnNldFNhbXBsZVRvQ2h1bmtQYXJhbXMoCisgICAgICAgIG9mZjY0X3QgZGF0YV9vZmZzZXQsIHNpemVfdCBkYXRhX3NpemUpIHsKKyAgICBpZiAobVNhbXBsZVRvQ2h1bmtPZmZzZXQgPj0gMCkgeworICAgICAgICAvLyBhbHJlYWR5IHNldAorICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGlmIChkYXRhX29mZnNldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBtU2FtcGxlVG9DaHVua09mZnNldCA9IGRhdGFfb2Zmc2V0OworCisgICAgaWYgKGRhdGFfc2l6ZSA8IDgpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1aW50OF90IGhlYWRlcls4XTsKKyAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorCisgICAgaWYgKFUzMl9BVChoZWFkZXIpICE9IDApIHsKKyAgICAgICAgLy8gRXhwZWN0ZWQgdmVyc2lvbiA9IDAsIGZsYWdzID0gMC4KKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBtTnVtU2FtcGxlVG9DaHVua09mZnNldHMgPSBVMzJfQVQoJmhlYWRlcls0XSk7CisKKyAgICBpZiAoKGRhdGFfc2l6ZSAtIDgpIC8gc2l6ZW9mKFNhbXBsZVRvQ2h1bmtFbnRyeSkgPCBtTnVtU2FtcGxlVG9DaHVua09mZnNldHMpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBpZiAoKHVpbnQ2NF90KWtNYXhUb3RhbFNpemUgLyBzaXplb2YoU2FtcGxlVG9DaHVua0VudHJ5KSA8PQorICAgICAgICAgICAgKHVpbnQ2NF90KW1OdW1TYW1wbGVUb0NodW5rT2Zmc2V0cykgeworICAgICAgICBBTE9HRSgiU2FtcGxlLXRvLWNodW5rIHRhYmxlIHNpemUgdG9vIGxhcmdlLiIpOworICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgIH0KKworICAgIG1Ub3RhbFNpemUgKz0gKHVpbnQ2NF90KW1OdW1TYW1wbGVUb0NodW5rT2Zmc2V0cyAqCisgICAgICAgICAgICBzaXplb2YoU2FtcGxlVG9DaHVua0VudHJ5KTsKKyAgICBpZiAobVRvdGFsU2l6ZSA+IGtNYXhUb3RhbFNpemUpIHsKKyAgICAgICAgQUxPR0UoIlNhbXBsZS10by1jaHVuayB0YWJsZSBzaXplIHdvdWxkIG1ha2Ugc2FtcGxlIHRhYmxlIHRvbyBsYXJnZS5cbiIKKyAgICAgICAgICAgICAgIiAgICBSZXF1ZXN0ZWQgc2FtcGxlLXRvLWNodW5rIHRhYmxlIHNpemUgPSAlbGx1XG4iCisgICAgICAgICAgICAgICIgICAgRXZlbnR1YWwgc2FtcGxlIHRhYmxlIHNpemUgPj0gJWxsdVxuIgorICAgICAgICAgICAgICAiICAgIEFsbG93ZWQgc2FtcGxlIHRhYmxlIHNpemUgPSAlbGx1XG4iLAorICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW1OdW1TYW1wbGVUb0NodW5rT2Zmc2V0cyAqCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFNhbXBsZVRvQ2h1bmtFbnRyeSksCisgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbVRvdGFsU2l6ZSwKKyAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylrTWF4VG90YWxTaXplKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICB9CisKKyAgICBtU2FtcGxlVG9DaHVua0VudHJpZXMgPQorICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgU2FtcGxlVG9DaHVua0VudHJ5W21OdW1TYW1wbGVUb0NodW5rT2Zmc2V0c107CisgICAgaWYgKCFtU2FtcGxlVG9DaHVua0VudHJpZXMpIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBhbGxvY2F0ZSBzYW1wbGUtdG8tY2h1bmsgdGFibGUgd2l0aCAlbGx1IGVudHJpZXMuIiwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW1OdW1TYW1wbGVUb0NodW5rT2Zmc2V0cyk7CisgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgfQorCisgICAgaWYgKG1OdW1TYW1wbGVUb0NodW5rT2Zmc2V0cyA9PSAwKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBpZiAoKG9mZjY0X3QpKGtNYXhPZmZzZXQgLSA4IC0KKyAgICAgICAgICAgICgobU51bVNhbXBsZVRvQ2h1bmtPZmZzZXRzIC0gMSkgKiBzaXplb2YoU2FtcGxlVG9DaHVua0VudHJ5KSkpCisgICAgICAgICAgICA8IG1TYW1wbGVUb0NodW5rT2Zmc2V0KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1OdW1TYW1wbGVUb0NodW5rT2Zmc2V0czsgKytpKSB7CisgICAgICAgIHVpbnQ4X3QgYnVmZmVyW3NpemVvZihTYW1wbGVUb0NodW5rRW50cnkpXTsKKworICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVRvQ2h1bmtPZmZzZXQgKyA4ICsgaSAqIHNpemVvZihTYW1wbGVUb0NodW5rRW50cnkpLAorICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihidWZmZXIpKQorICAgICAgICAgICAgICAgICE9IChzc2l6ZV90KXNpemVvZihidWZmZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKyAgICAgICAgLy8gY2h1bmsgaW5kZXggaXMgMSBiYXNlZCBpbiB0aGUgc3BlYy4KKyAgICAgICAgaWYgKFUzMl9BVChidWZmZXIpIDwgMSkgeworICAgICAgICAgICAgQUxPR0UoImIvMjM1MzQxNjAiKTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSB3YW50IHRoZSBjaHVuayBpbmRleCB0byBiZSAwLWJhc2VkLgorICAgICAgICBtU2FtcGxlVG9DaHVua0VudHJpZXNbaV0uc3RhcnRDaHVuayA9IFUzMl9BVChidWZmZXIpIC0gMTsKKyAgICAgICAgbVNhbXBsZVRvQ2h1bmtFbnRyaWVzW2ldLnNhbXBsZXNQZXJDaHVuayA9IFUzMl9BVCgmYnVmZmVyWzRdKTsKKyAgICAgICAgbVNhbXBsZVRvQ2h1bmtFbnRyaWVzW2ldLmNodW5rRGVzYyA9IFUzMl9BVCgmYnVmZmVyWzhdKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFNhbXBsZVRhYmxlOjpzZXRTYW1wbGVTaXplUGFyYW1zKAorICAgICAgICB1aW50MzJfdCB0eXBlLCBvZmY2NF90IGRhdGFfb2Zmc2V0LCBzaXplX3QgZGF0YV9zaXplKSB7CisgICAgaWYgKG1TYW1wbGVTaXplT2Zmc2V0ID49IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBDSEVDSyh0eXBlID09IGtTYW1wbGVTaXplVHlwZTMyIHx8IHR5cGUgPT0ga1NhbXBsZVNpemVUeXBlQ29tcGFjdCk7CisKKyAgICBtU2FtcGxlU2l6ZU9mZnNldCA9IGRhdGFfb2Zmc2V0OworCisgICAgaWYgKGRhdGFfc2l6ZSA8IDEyKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdWludDhfdCBoZWFkZXJbMTJdOworICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKSA8IChzc2l6ZV90KXNpemVvZihoZWFkZXIpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisKKyAgICBpZiAoVTMyX0FUKGhlYWRlcikgIT0gMCkgeworICAgICAgICAvLyBFeHBlY3RlZCB2ZXJzaW9uID0gMCwgZmxhZ3MgPSAwLgorICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIG1EZWZhdWx0U2FtcGxlU2l6ZSA9IFUzMl9BVCgmaGVhZGVyWzRdKTsKKyAgICBtTnVtU2FtcGxlU2l6ZXMgPSBVMzJfQVQoJmhlYWRlcls4XSk7CisgICAgaWYgKG1OdW1TYW1wbGVTaXplcyA+IChVSU5UMzJfTUFYIC0gMTIpIC8gMTYpIHsKKyAgICAgICAgQUxPR0UoImIvMjMyNDcwNTUsIG1OdW1TYW1wbGVTaXplcygldSkiLCBtTnVtU2FtcGxlU2l6ZXMpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGlmICh0eXBlID09IGtTYW1wbGVTaXplVHlwZTMyKSB7CisgICAgICAgIG1TYW1wbGVTaXplRmllbGRTaXplID0gMzI7CisKKyAgICAgICAgaWYgKG1EZWZhdWx0U2FtcGxlU2l6ZSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGF0YV9zaXplIDwgMTIgKyBtTnVtU2FtcGxlU2l6ZXMgKiA0KSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKChtRGVmYXVsdFNhbXBsZVNpemUgJiAweGZmZmZmZjAwKSAhPSAwKSB7CisgICAgICAgICAgICAvLyBUaGUgaGlnaCAyNCBiaXRzIGFyZSByZXNlcnZlZCBhbmQgbXVzdCBiZSAwLgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIG1TYW1wbGVTaXplRmllbGRTaXplID0gbURlZmF1bHRTYW1wbGVTaXplICYgMHhmZjsKKyAgICAgICAgbURlZmF1bHRTYW1wbGVTaXplID0gMDsKKworICAgICAgICBpZiAobVNhbXBsZVNpemVGaWVsZFNpemUgIT0gNCAmJiBtU2FtcGxlU2l6ZUZpZWxkU2l6ZSAhPSA4CisgICAgICAgICAgICAmJiBtU2FtcGxlU2l6ZUZpZWxkU2l6ZSAhPSAxNikgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkYXRhX3NpemUgPCAxMiArIChtTnVtU2FtcGxlU2l6ZXMgKiBtU2FtcGxlU2l6ZUZpZWxkU2l6ZSArIDQpIC8gOCkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU2FtcGxlVGFibGU6OnNldFRpbWVUb1NhbXBsZVBhcmFtcygKKyAgICAgICAgb2ZmNjRfdCBkYXRhX29mZnNldCwgc2l6ZV90IGRhdGFfc2l6ZSkgeworICAgIGlmIChtSGFzVGltZVRvU2FtcGxlIHx8IGRhdGFfc2l6ZSA8IDgpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1aW50OF90IGhlYWRlcls4XTsKKyAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorCisgICAgaWYgKFUzMl9BVChoZWFkZXIpICE9IDApIHsKKyAgICAgICAgLy8gRXhwZWN0ZWQgdmVyc2lvbiA9IDAsIGZsYWdzID0gMC4KKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBtVGltZVRvU2FtcGxlQ291bnQgPSBVMzJfQVQoJmhlYWRlcls0XSk7CisgICAgaWYgKG1UaW1lVG9TYW1wbGVDb3VudCA+IFVJTlQzMl9NQVggLyAoMiAqIHNpemVvZih1aW50MzJfdCkpKSB7CisgICAgICAgIC8vIENob29zZSB0aGlzIGJvdW5kIGJlY2F1c2UKKyAgICAgICAgLy8gMSkgMiAqIHNpemVvZih1aW50MzJfdCkgaXMgdGhlIGFtb3VudCBvZiBtZW1vcnkgbmVlZGVkIGZvciBvbmUKKyAgICAgICAgLy8gICAgdGltZS10by1zYW1wbGUgZW50cnkgaW4gdGhlIHRpbWUtdG8tc2FtcGxlIHRhYmxlLgorICAgICAgICAvLyAyKSBtVGltZVRvU2FtcGxlQ291bnQgaXMgdGhlIG51bWJlciBvZiBlbnRyaWVzIG9mIHRoZSB0aW1lLXRvLXNhbXBsZQorICAgICAgICAvLyAgICB0YWJsZS4KKyAgICAgICAgLy8gMykgV2UgaG9wZSB0aGF0IHRoZSB0YWJsZSBzaXplIGRvZXMgbm90IGV4Y2VlZCBVSU5UMzJfTUFYLgorICAgICAgICBBTE9HRSgiVGltZS10by1zYW1wbGUgdGFibGUgc2l6ZSB0b28gbGFyZ2UuIik7CisgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgfQorCisgICAgLy8gTm90ZTogQXQgdGhpcyBwb2ludCwgd2Uga25vdyB0aGF0IG1UaW1lVG9TYW1wbGVDb3VudCAqIDIgd2lsbCBub3QKKyAgICAvLyBvdmVyZmxvdyBiZWNhdXNlIG9mIHRoZSBhYm92ZSBjb25kaXRpb24uCisKKyAgICB1aW50NjRfdCBhbGxvY1NpemUgPSAodWludDY0X3QpbVRpbWVUb1NhbXBsZUNvdW50ICogMiAqIHNpemVvZih1aW50MzJfdCk7CisgICAgbVRvdGFsU2l6ZSArPSBhbGxvY1NpemU7CisgICAgaWYgKG1Ub3RhbFNpemUgPiBrTWF4VG90YWxTaXplKSB7CisgICAgICAgIEFMT0dFKCJUaW1lLXRvLXNhbXBsZSB0YWJsZSBzaXplIHdvdWxkIG1ha2Ugc2FtcGxlIHRhYmxlIHRvbyBsYXJnZS5cbiIKKyAgICAgICAgICAgICAgIiAgICBSZXF1ZXN0ZWQgdGltZS10by1zYW1wbGUgdGFibGUgc2l6ZSA9ICVsbHVcbiIKKyAgICAgICAgICAgICAgIiAgICBFdmVudHVhbCBzYW1wbGUgdGFibGUgc2l6ZSA+PSAlbGx1XG4iCisgICAgICAgICAgICAgICIgICAgQWxsb3dlZCBzYW1wbGUgdGFibGUgc2l6ZSA9ICVsbHVcbiIsCisgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWxsb2NTaXplLAorICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW1Ub3RhbFNpemUsCisgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpa01heFRvdGFsU2l6ZSk7CisgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgfQorCisgICAgbVRpbWVUb1NhbXBsZSA9IG5ldyAoc3RkOjpub3Rocm93KSB1aW50MzJfdFttVGltZVRvU2FtcGxlQ291bnQgKiAyXTsKKyAgICBpZiAoIW1UaW1lVG9TYW1wbGUpIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBhbGxvY2F0ZSB0aW1lLXRvLXNhbXBsZSB0YWJsZSB3aXRoICVsbHUgZW50cmllcy4iLAorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbVRpbWVUb1NhbXBsZUNvdW50KTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICB9CisKKyAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCArIDgsIG1UaW1lVG9TYW1wbGUsCisgICAgICAgICAgICAoc2l6ZV90KWFsbG9jU2l6ZSkgPCAoc3NpemVfdClhbGxvY1NpemUpIHsKKyAgICAgICAgQUxPR0UoIkluY29tcGxldGUgZGF0YSByZWFkIGZvciB0aW1lLXRvLXNhbXBsZSB0YWJsZS4iKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRpbWVUb1NhbXBsZUNvdW50ICogMjsgKytpKSB7CisgICAgICAgIG1UaW1lVG9TYW1wbGVbaV0gPSBudG9obChtVGltZVRvU2FtcGxlW2ldKTsKKyAgICB9CisKKyAgICBtSGFzVGltZVRvU2FtcGxlID0gdHJ1ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIE5PVEU6IHBlciAxNDk5Ni0xMiwgdmVyc2lvbiAwIGN0dHMgY29udGFpbnMgdW5zaWduZWQgdmFsdWVzLCB3aGlsZSB2ZXJzaW9uIDEKKy8vIGNvbnRhaW5zIHNpZ25lZCB2YWx1ZXMsIGhvd2V2ZXIgc29tZSBzb2Z0d2FyZSBjcmVhdGVzIHZlcnNpb24gMCBmaWxlcyB0aGF0CisvLyBjb250YWluIHNpZ25lZCB2YWx1ZXMsIHNvIHdlJ3JlIGFsd2F5cyB0cmVhdGluZyB0aGUgdmFsdWVzIGFzIHNpZ25lZCwKKy8vIHJlZ2FyZGxlc3Mgb2YgdmVyc2lvbi4KK3N0YXR1c190IFNhbXBsZVRhYmxlOjpzZXRDb21wb3NpdGlvblRpbWVUb1NhbXBsZVBhcmFtcygKKyAgICAgICAgb2ZmNjRfdCBkYXRhX29mZnNldCwgc2l6ZV90IGRhdGFfc2l6ZSkgeworICAgIEFMT0dJKCJUaGVyZSBhcmUgcmVvcmRlcmVkIGZyYW1lcyBwcmVzZW50LiIpOworCisgICAgaWYgKG1Db21wb3NpdGlvblRpbWVEZWx0YUVudHJpZXMgIT0gTlVMTCB8fCBkYXRhX3NpemUgPCA4KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdWludDhfdCBoZWFkZXJbOF07CisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpCisgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihoZWFkZXIpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisKKyAgICB1aW50MzJfdCBmbGFncyA9IFUzMl9BVChoZWFkZXIpOworICAgIHVpbnQzMl90IHZlcnNpb24gPSBmbGFncyA+PiAyNDsKKyAgICBmbGFncyAmPSAweGZmZmZmZjsKKworICAgIGlmICgodmVyc2lvbiAhPSAwICYmIHZlcnNpb24gIT0gMSkgfHwgZmxhZ3MgIT0gMCkgeworICAgICAgICAvLyBFeHBlY3RlZCB2ZXJzaW9uID0gMCBvciAxLCBmbGFncyA9IDAuCisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgc2l6ZV90IG51bUVudHJpZXMgPSBVMzJfQVQoJmhlYWRlcls0XSk7CisKKyAgICBpZiAoKChTSVpFX01BWCAvIDgpIC0gMSA8IG51bUVudHJpZXMpIHx8IChkYXRhX3NpemUgIT0gKG51bUVudHJpZXMgKyAxKSAqIDgpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgbU51bUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllcyA9IG51bUVudHJpZXM7CisgICAgdWludDY0X3QgYWxsb2NTaXplID0gKHVpbnQ2NF90KW51bUVudHJpZXMgKiAyICogc2l6ZW9mKGludDMyX3QpOworICAgIGlmIChhbGxvY1NpemUgPiBrTWF4VG90YWxTaXplKSB7CisgICAgICAgIEFMT0dFKCJDb21wb3NpdGlvbi10aW1lLXRvLXNhbXBsZSB0YWJsZSBzaXplIHRvbyBsYXJnZS4iKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICB9CisKKyAgICBtVG90YWxTaXplICs9IGFsbG9jU2l6ZTsKKyAgICBpZiAobVRvdGFsU2l6ZSA+IGtNYXhUb3RhbFNpemUpIHsKKyAgICAgICAgQUxPR0UoIkNvbXBvc2l0aW9uLXRpbWUtdG8tc2FtcGxlIHRhYmxlIHdvdWxkIG1ha2Ugc2FtcGxlIHRhYmxlIHRvbyBsYXJnZS5cbiIKKyAgICAgICAgICAgICAgIiAgICBSZXF1ZXN0ZWQgY29tcG9zaXRpb24tdGltZS10by1zYW1wbGUgdGFibGUgc2l6ZSA9ICVsbHVcbiIKKyAgICAgICAgICAgICAgIiAgICBFdmVudHVhbCBzYW1wbGUgdGFibGUgc2l6ZSA+PSAlbGx1XG4iCisgICAgICAgICAgICAgICIgICAgQWxsb3dlZCBzYW1wbGUgdGFibGUgc2l6ZSA9ICVsbHVcbiIsCisgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWxsb2NTaXplLAorICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW1Ub3RhbFNpemUsCisgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpa01heFRvdGFsU2l6ZSk7CisgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgfQorCisgICAgbUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllcyA9IG5ldyAoc3RkOjpub3Rocm93KSBpbnQzMl90WzIgKiBudW1FbnRyaWVzXTsKKyAgICBpZiAoIW1Db21wb3NpdGlvblRpbWVEZWx0YUVudHJpZXMpIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBhbGxvY2F0ZSBjb21wb3NpdGlvbi10aW1lLXRvLXNhbXBsZSB0YWJsZSB3aXRoICVsbHUgIgorICAgICAgICAgICAgICAgICJlbnRyaWVzLiIsICh1bnNpZ25lZCBsb25nIGxvbmcpbnVtRW50cmllcyk7CisgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgfQorCisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQgKyA4LCBtQ29tcG9zaXRpb25UaW1lRGVsdGFFbnRyaWVzLAorICAgICAgICAgICAgKHNpemVfdClhbGxvY1NpemUpIDwgKHNzaXplX3QpYWxsb2NTaXplKSB7CisgICAgICAgIGRlbGV0ZVtdIG1Db21wb3NpdGlvblRpbWVEZWx0YUVudHJpZXM7CisgICAgICAgIG1Db21wb3NpdGlvblRpbWVEZWx0YUVudHJpZXMgPSBOVUxMOworCisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDIgKiBudW1FbnRyaWVzOyArK2kpIHsKKyAgICAgICAgbUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllc1tpXSA9IG50b2hsKG1Db21wb3NpdGlvblRpbWVEZWx0YUVudHJpZXNbaV0pOworICAgIH0KKworICAgIG1Db21wb3NpdGlvbkRlbHRhTG9va3VwLT5zZXRFbnRyaWVzKAorICAgICAgICAgICAgbUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllcywgbU51bUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllcyk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFNhbXBsZVRhYmxlOjpzZXRTeW5jU2FtcGxlUGFyYW1zKG9mZjY0X3QgZGF0YV9vZmZzZXQsIHNpemVfdCBkYXRhX3NpemUpIHsKKyAgICBpZiAobVN5bmNTYW1wbGVPZmZzZXQgPj0gMCB8fCBkYXRhX3NpemUgPCA4KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdWludDhfdCBoZWFkZXJbOF07CisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKworICAgIGlmIChVMzJfQVQoaGVhZGVyKSAhPSAwKSB7CisgICAgICAgIC8vIEV4cGVjdGVkIHZlcnNpb24gPSAwLCBmbGFncyA9IDAuCisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdWludDMyX3QgbnVtU3luY1NhbXBsZXMgPSBVMzJfQVQoJmhlYWRlcls0XSk7CisKKyAgICBpZiAobnVtU3luY1NhbXBsZXMgPCAyKSB7CisgICAgICAgIEFMT0dWKCJUYWJsZSBvZiBzeW5jIHNhbXBsZXMgaXMgZW1wdHkgb3IgaGFzIG9ubHkgYSBzaW5nbGUgZW50cnkhIik7CisgICAgfQorCisgICAgdWludDY0X3QgYWxsb2NTaXplID0gKHVpbnQ2NF90KW51bVN5bmNTYW1wbGVzICogc2l6ZW9mKHVpbnQzMl90KTsKKyAgICBpZiAoYWxsb2NTaXplID4ga01heFRvdGFsU2l6ZSkgeworICAgICAgICBBTE9HRSgiU3luYyBzYW1wbGUgdGFibGUgc2l6ZSB0b28gbGFyZ2UuIik7CisgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgfQorCisgICAgbVRvdGFsU2l6ZSArPSBhbGxvY1NpemU7CisgICAgaWYgKG1Ub3RhbFNpemUgPiBrTWF4VG90YWxTaXplKSB7CisgICAgICAgIEFMT0dFKCJTeW5jIHNhbXBsZSB0YWJsZSBzaXplIHdvdWxkIG1ha2Ugc2FtcGxlIHRhYmxlIHRvbyBsYXJnZS5cbiIKKyAgICAgICAgICAgICAgIiAgICBSZXF1ZXN0ZWQgc3luYyBzYW1wbGUgdGFibGUgc2l6ZSA9ICVsbHVcbiIKKyAgICAgICAgICAgICAgIiAgICBFdmVudHVhbCBzYW1wbGUgdGFibGUgc2l6ZSA+PSAlbGx1XG4iCisgICAgICAgICAgICAgICIgICAgQWxsb3dlZCBzYW1wbGUgdGFibGUgc2l6ZSA9ICVsbHVcbiIsCisgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWxsb2NTaXplLAorICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW1Ub3RhbFNpemUsCisgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpa01heFRvdGFsU2l6ZSk7CisgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgfQorCisgICAgbVN5bmNTYW1wbGVzID0gbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQzMl90W251bVN5bmNTYW1wbGVzXTsKKyAgICBpZiAoIW1TeW5jU2FtcGxlcykgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGFsbG9jYXRlIHN5bmMgc2FtcGxlIHRhYmxlIHdpdGggJWxsdSBlbnRyaWVzLiIsCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyludW1TeW5jU2FtcGxlcyk7CisgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgfQorCisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQgKyA4LCBtU3luY1NhbXBsZXMsCisgICAgICAgICAgICAoc2l6ZV90KWFsbG9jU2l6ZSkgIT0gKHNzaXplX3QpYWxsb2NTaXplKSB7CisgICAgICAgIGRlbGV0ZVtdIG1TeW5jU2FtcGxlczsKKyAgICAgICAgbVN5bmNTYW1wbGVzID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3luY1NhbXBsZXM7ICsraSkgeworICAgICAgICBpZiAobVN5bmNTYW1wbGVzW2ldID09IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJiLzMyNDIzODYyLCB1bmV4cGVjdGVkIHplcm8gdmFsdWUgaW4gc3RzcyIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgbVN5bmNTYW1wbGVzW2ldID0gbnRvaGwobVN5bmNTYW1wbGVzW2ldKSAtIDE7CisgICAgfQorCisgICAgbVN5bmNTYW1wbGVPZmZzZXQgPSBkYXRhX29mZnNldDsKKyAgICBtTnVtU3luY1NhbXBsZXMgPSBudW1TeW5jU2FtcGxlczsKKworICAgIHJldHVybiBPSzsKK30KKwordWludDMyX3QgU2FtcGxlVGFibGU6OmNvdW50Q2h1bmtPZmZzZXRzKCkgY29uc3QgeworICAgIHJldHVybiBtTnVtQ2h1bmtPZmZzZXRzOworfQorCit1aW50MzJfdCBTYW1wbGVUYWJsZTo6Y291bnRTYW1wbGVzKCkgY29uc3QgeworICAgIHJldHVybiBtTnVtU2FtcGxlU2l6ZXM7Cit9CisKK3N0YXR1c190IFNhbXBsZVRhYmxlOjpnZXRNYXhTYW1wbGVTaXplKHNpemVfdCAqbWF4X3NpemUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgKm1heF9zaXplID0gMDsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtTnVtU2FtcGxlU2l6ZXM7ICsraSkgeworICAgICAgICBzaXplX3Qgc2FtcGxlX3NpemU7CisgICAgICAgIHN0YXR1c190IGVyciA9IGdldFNhbXBsZVNpemVfbChpLCAmc2FtcGxlX3NpemUpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2FtcGxlX3NpemUgPiAqbWF4X3NpemUpIHsKKyAgICAgICAgICAgICptYXhfc2l6ZSA9IHNhbXBsZV9zaXplOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit1aW50MzJfdCBhYnNfZGlmZmVyZW5jZSh1aW50MzJfdCB0aW1lMSwgdWludDMyX3QgdGltZTIpIHsKKyAgICByZXR1cm4gdGltZTEgPiB0aW1lMiA/IHRpbWUxIC0gdGltZTIgOiB0aW1lMiAtIHRpbWUxOworfQorCisvLyBzdGF0aWMKK2ludCBTYW1wbGVUYWJsZTo6Q29tcGFyZUluY3JlYXNpbmdUaW1lKGNvbnN0IHZvaWQgKl9hLCBjb25zdCB2b2lkICpfYikgeworICAgIGNvbnN0IFNhbXBsZVRpbWVFbnRyeSAqYSA9IChjb25zdCBTYW1wbGVUaW1lRW50cnkgKilfYTsKKyAgICBjb25zdCBTYW1wbGVUaW1lRW50cnkgKmIgPSAoY29uc3QgU2FtcGxlVGltZUVudHJ5ICopX2I7CisKKyAgICBpZiAoYS0+bUNvbXBvc2l0aW9uVGltZSA8IGItPm1Db21wb3NpdGlvblRpbWUpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSBpZiAoYS0+bUNvbXBvc2l0aW9uVGltZSA+IGItPm1Db21wb3NpdGlvblRpbWUpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgU2FtcGxlVGFibGU6OmJ1aWxkU2FtcGxlRW50cmllc1RhYmxlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobVNhbXBsZVRpbWVFbnRyaWVzICE9IE5VTEwgfHwgbU51bVNhbXBsZVNpemVzID09IDApIHsKKyAgICAgICAgaWYgKG1OdW1TYW1wbGVTaXplcyA9PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiYi8yMzI0NzA1NSwgbU51bVNhbXBsZVNpemVzKCV1KSIsIG1OdW1TYW1wbGVTaXplcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1Ub3RhbFNpemUgKz0gKHVpbnQ2NF90KW1OdW1TYW1wbGVTaXplcyAqIHNpemVvZihTYW1wbGVUaW1lRW50cnkpOworICAgIGlmIChtVG90YWxTaXplID4ga01heFRvdGFsU2l6ZSkgeworICAgICAgICBBTE9HRSgiU2FtcGxlIGVudHJ5IHRhYmxlIHNpemUgd291bGQgbWFrZSBzYW1wbGUgdGFibGUgdG9vIGxhcmdlLlxuIgorICAgICAgICAgICAgICAiICAgIFJlcXVlc3RlZCBzYW1wbGUgZW50cnkgdGFibGUgc2l6ZSA9ICVsbHVcbiIKKyAgICAgICAgICAgICAgIiAgICBFdmVudHVhbCBzYW1wbGUgdGFibGUgc2l6ZSA+PSAlbGx1XG4iCisgICAgICAgICAgICAgICIgICAgQWxsb3dlZCBzYW1wbGUgdGFibGUgc2l6ZSA9ICVsbHVcbiIsCisgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbU51bVNhbXBsZVNpemVzICogc2l6ZW9mKFNhbXBsZVRpbWVFbnRyeSksCisgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbVRvdGFsU2l6ZSwKKyAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylrTWF4VG90YWxTaXplKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1TYW1wbGVUaW1lRW50cmllcyA9IG5ldyAoc3RkOjpub3Rocm93KSBTYW1wbGVUaW1lRW50cnlbbU51bVNhbXBsZVNpemVzXTsKKyAgICBpZiAoIW1TYW1wbGVUaW1lRW50cmllcykgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGFsbG9jYXRlIHNhbXBsZSBlbnRyeSB0YWJsZSB3aXRoICVsbHUgZW50cmllcy4iLAorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbU51bVNhbXBsZVNpemVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQzMl90IHNhbXBsZUluZGV4ID0gMDsKKyAgICB1aW50MzJfdCBzYW1wbGVUaW1lID0gMDsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtVGltZVRvU2FtcGxlQ291bnQ7ICsraSkgeworICAgICAgICB1aW50MzJfdCBuID0gbVRpbWVUb1NhbXBsZVsyICogaV07CisgICAgICAgIHVpbnQzMl90IGRlbHRhID0gbVRpbWVUb1NhbXBsZVsyICogaSArIDFdOworCisgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBuOyArK2opIHsKKyAgICAgICAgICAgIGlmIChzYW1wbGVJbmRleCA8IG1OdW1TYW1wbGVTaXplcykgeworICAgICAgICAgICAgICAgIC8vIFRlY2huaWNhbGx5IHRoaXMgc2hvdWxkIGFsd2F5cyBiZSB0aGUgY2FzZSBpZiB0aGUgZmlsZQorICAgICAgICAgICAgICAgIC8vIGlzIHdlbGwtZm9ybWVkLCBidXQgeW91IGtub3cuLi4gdGhlcmUncyAoZ2FzcCkgbWFsZm9ybWVkCisgICAgICAgICAgICAgICAgLy8gY29udGVudCBvdXQgdGhlcmUuCisKKyAgICAgICAgICAgICAgICBtU2FtcGxlVGltZUVudHJpZXNbc2FtcGxlSW5kZXhdLm1TYW1wbGVJbmRleCA9IHNhbXBsZUluZGV4OworCisgICAgICAgICAgICAgICAgaW50MzJfdCBjb21wVGltZURlbHRhID0KKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvc2l0aW9uRGVsdGFMb29rdXAtPmdldENvbXBvc2l0aW9uVGltZU9mZnNldCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVJbmRleCk7CisKKyAgICAgICAgICAgICAgICBpZiAoKGNvbXBUaW1lRGVsdGEgPCAwICYmIHNhbXBsZVRpbWUgPAorICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBUaW1lRGVsdGEgPT0gSU5UMzJfTUlOID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzJfTUFYIDogdWludDMyX3QoLWNvbXBUaW1lRGVsdGEpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IChjb21wVGltZURlbHRhID4gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lID4gVUlOVDMyX01BWCAtIGNvbXBUaW1lRGVsdGEpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIldSArICVkIHdvdWxkIG92ZXJmbG93LCBjbGFtcGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSwgY29tcFRpbWVEZWx0YSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb21wVGltZURlbHRhIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lID0gVUlOVDMyX01BWDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb21wVGltZURlbHRhID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtU2FtcGxlVGltZUVudHJpZXNbc2FtcGxlSW5kZXhdLm1Db21wb3NpdGlvblRpbWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgY29tcFRpbWVEZWx0YSA+IDAgPyBzYW1wbGVUaW1lICsgY29tcFRpbWVEZWx0YToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSAtICgtY29tcFRpbWVEZWx0YSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICsrc2FtcGxlSW5kZXg7CisgICAgICAgICAgICBpZiAoc2FtcGxlVGltZSA+IFVJTlQzMl9NQVggLSBkZWx0YSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIldSArICV1IHdvdWxkIG92ZXJmbG93LCBjbGFtcGluZyIsCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUsIGRlbHRhKTsKKyAgICAgICAgICAgICAgICBzYW1wbGVUaW1lID0gVUlOVDMyX01BWDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2FtcGxlVGltZSArPSBkZWx0YTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHFzb3J0KG1TYW1wbGVUaW1lRW50cmllcywgbU51bVNhbXBsZVNpemVzLCBzaXplb2YoU2FtcGxlVGltZUVudHJ5KSwKKyAgICAgICAgICBDb21wYXJlSW5jcmVhc2luZ1RpbWUpOworfQorCitzdGF0dXNfdCBTYW1wbGVUYWJsZTo6ZmluZFNhbXBsZUF0VGltZSgKKyAgICAgICAgdWludDY0X3QgcmVxX3RpbWUsIHVpbnQ2NF90IHNjYWxlX251bSwgdWludDY0X3Qgc2NhbGVfZGVuLAorICAgICAgICB1aW50MzJfdCAqc2FtcGxlX2luZGV4LCB1aW50MzJfdCBmbGFncykgeworICAgIGJ1aWxkU2FtcGxlRW50cmllc1RhYmxlKCk7CisKKyAgICBpZiAobVNhbXBsZVRpbWVFbnRyaWVzID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICB9CisKKyAgICBpZiAoZmxhZ3MgPT0ga0ZsYWdGcmFtZUluZGV4KSB7CisgICAgICAgIGlmIChyZXFfdGltZSA+PSBtTnVtU2FtcGxlU2l6ZXMpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgICAgIH0KKyAgICAgICAgKnNhbXBsZV9pbmRleCA9IG1TYW1wbGVUaW1lRW50cmllc1tyZXFfdGltZV0ubVNhbXBsZUluZGV4OworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgdWludDMyX3QgbGVmdCA9IDA7CisgICAgdWludDMyX3QgcmlnaHRfcGx1c19vbmUgPSBtTnVtU2FtcGxlU2l6ZXM7CisgICAgd2hpbGUgKGxlZnQgPCByaWdodF9wbHVzX29uZSkgeworICAgICAgICB1aW50MzJfdCBjZW50ZXIgPSBsZWZ0ICsgKHJpZ2h0X3BsdXNfb25lIC0gbGVmdCkgLyAyOworICAgICAgICB1aW50NjRfdCBjZW50ZXJUaW1lID0KKyAgICAgICAgICAgIGdldFNhbXBsZVRpbWUoY2VudGVyLCBzY2FsZV9udW0sIHNjYWxlX2Rlbik7CisKKyAgICAgICAgaWYgKHJlcV90aW1lIDwgY2VudGVyVGltZSkgeworICAgICAgICAgICAgcmlnaHRfcGx1c19vbmUgPSBjZW50ZXI7CisgICAgICAgIH0gZWxzZSBpZiAocmVxX3RpbWUgPiBjZW50ZXJUaW1lKSB7CisgICAgICAgICAgICBsZWZ0ID0gY2VudGVyICsgMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpzYW1wbGVfaW5kZXggPSBtU2FtcGxlVGltZUVudHJpZXNbY2VudGVyXS5tU2FtcGxlSW5kZXg7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1aW50MzJfdCBjbG9zZXN0SW5kZXggPSBsZWZ0OworCisgICAgaWYgKGNsb3Nlc3RJbmRleCA9PSBtTnVtU2FtcGxlU2l6ZXMpIHsKKyAgICAgICAgaWYgKGZsYWdzID09IGtGbGFnQWZ0ZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgICAgIH0KKyAgICAgICAgZmxhZ3MgPSBrRmxhZ0JlZm9yZTsKKyAgICB9IGVsc2UgaWYgKGNsb3Nlc3RJbmRleCA9PSAwKSB7CisgICAgICAgIGlmIChmbGFncyA9PSBrRmxhZ0JlZm9yZSkgeworICAgICAgICAgICAgLy8gbm9ybWFsbHkgd2Ugc2hvdWxkIHJldHVybiBvdXQgb2YgcmFuZ2UsIGJ1dCB0aGF0IGlzCisgICAgICAgICAgICAvLyB0cmVhdGVkIGFzIGVuZC1vZi1zdHJlYW0uICBpbnN0ZWFkIHJldHVybiBmaXJzdCBzYW1wbGUKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgICAgICB9CisgICAgICAgIGZsYWdzID0ga0ZsYWdBZnRlcjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGZsYWdzKSB7CisgICAgICAgIGNhc2Uga0ZsYWdCZWZvcmU6CisgICAgICAgIHsKKyAgICAgICAgICAgIC0tY2xvc2VzdEluZGV4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtGbGFnQWZ0ZXI6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0soZmxhZ3MgPT0ga0ZsYWdDbG9zZXN0KTsKKyAgICAgICAgICAgIC8vIHBpY2sgY2xvc2VzdCBiYXNlZCBvbiB0aW1lc3RhbXAuIHVzZSBhYnNfZGlmZmVyZW5jZSBmb3Igc2FmZXR5CisgICAgICAgICAgICBpZiAoYWJzX2RpZmZlcmVuY2UoCisgICAgICAgICAgICAgICAgICAgIGdldFNhbXBsZVRpbWUoY2xvc2VzdEluZGV4LCBzY2FsZV9udW0sIHNjYWxlX2RlbiksIHJlcV90aW1lKSA+CisgICAgICAgICAgICAgICAgYWJzX2RpZmZlcmVuY2UoCisgICAgICAgICAgICAgICAgICAgIHJlcV90aW1lLCBnZXRTYW1wbGVUaW1lKGNsb3Nlc3RJbmRleCAtIDEsIHNjYWxlX251bSwgc2NhbGVfZGVuKSkpIHsKKyAgICAgICAgICAgICAgICAtLWNsb3Nlc3RJbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgKnNhbXBsZV9pbmRleCA9IG1TYW1wbGVUaW1lRW50cmllc1tjbG9zZXN0SW5kZXhdLm1TYW1wbGVJbmRleDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFNhbXBsZVRhYmxlOjpmaW5kU3luY1NhbXBsZU5lYXIoCisgICAgICAgIHVpbnQzMl90IHN0YXJ0X3NhbXBsZV9pbmRleCwgdWludDMyX3QgKnNhbXBsZV9pbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgKnNhbXBsZV9pbmRleCA9IDA7CisKKyAgICBpZiAobVN5bmNTYW1wbGVPZmZzZXQgPCAwKSB7CisgICAgICAgIC8vIEFsbCBzYW1wbGVzIGFyZSBzeW5jLXNhbXBsZXMuCisgICAgICAgICpzYW1wbGVfaW5kZXggPSBzdGFydF9zYW1wbGVfaW5kZXg7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBpZiAobU51bVN5bmNTYW1wbGVzID09IDApIHsKKyAgICAgICAgKnNhbXBsZV9pbmRleCA9IDA7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICB1aW50MzJfdCBsZWZ0ID0gMDsKKyAgICB1aW50MzJfdCByaWdodF9wbHVzX29uZSA9IG1OdW1TeW5jU2FtcGxlczsKKyAgICB3aGlsZSAobGVmdCA8IHJpZ2h0X3BsdXNfb25lKSB7CisgICAgICAgIHVpbnQzMl90IGNlbnRlciA9IGxlZnQgKyAocmlnaHRfcGx1c19vbmUgLSBsZWZ0KSAvIDI7CisgICAgICAgIHVpbnQzMl90IHggPSBtU3luY1NhbXBsZXNbY2VudGVyXTsKKworICAgICAgICBpZiAoc3RhcnRfc2FtcGxlX2luZGV4IDwgeCkgeworICAgICAgICAgICAgcmlnaHRfcGx1c19vbmUgPSBjZW50ZXI7CisgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRfc2FtcGxlX2luZGV4ID4geCkgeworICAgICAgICAgICAgbGVmdCA9IGNlbnRlciArIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqc2FtcGxlX2luZGV4ID0geDsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChsZWZ0ID09IG1OdW1TeW5jU2FtcGxlcykgeworICAgICAgICBpZiAoZmxhZ3MgPT0ga0ZsYWdBZnRlcikgeworICAgICAgICAgICAgQUxPR0UoInRyaWVkIHRvIGZpbmQgYSBzeW5jIGZyYW1lIGFmdGVyIHRoZSBsYXN0IG9uZTogJWQiLCBsZWZ0KTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgICAgIH0KKyAgICAgICAgZmxhZ3MgPSBrRmxhZ0JlZm9yZTsKKyAgICB9CisgICAgZWxzZSBpZiAobGVmdCA9PSAwKSB7CisgICAgICAgIGlmIChmbGFncyA9PSBrRmxhZ0JlZm9yZSkgeworICAgICAgICAgICAgQUxPR0UoInRyaWVkIHRvIGZpbmQgYSBzeW5jIGZyYW1lIGJlZm9yZSB0aGUgZmlyc3Qgb25lOiAlZCIsIGxlZnQpOworCisgICAgICAgICAgICAvLyBub3JtYWxseSB3ZSBzaG91bGQgcmV0dXJuIG91dCBvZiByYW5nZSwgYnV0IHRoYXQgaXMKKyAgICAgICAgICAgIC8vIHRyZWF0ZWQgYXMgZW5kLW9mLXN0cmVhbS4gIGluc3RlYWQgc2VlayB0byBmaXJzdCBzeW5jCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICAgICAgfQorICAgICAgICBmbGFncyA9IGtGbGFnQWZ0ZXI7CisgICAgfQorCisgICAgLy8gTm93IHNzaVtsZWZ0IC0gMV0gPCg9KSBzdGFydF9zYW1wbGVfaW5kZXggPD0gc3NpW2xlZnRdCisgICAgc3dpdGNoIChmbGFncykgeworICAgICAgICBjYXNlIGtGbGFnQmVmb3JlOgorICAgICAgICB7CisgICAgICAgICAgICAtLWxlZnQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtGbGFnQWZ0ZXI6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHRoaXMgcm91dGUgaXMgbm90IHVzZWQsIGJ1dCBpbXBsZW1lbnQgaXQgbm9uZXRoZWxlc3MKKyAgICAgICAgICAgIENIRUNLKGZsYWdzID09IGtGbGFnQ2xvc2VzdCk7CisKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1TYW1wbGVJdGVyYXRvci0+c2Vla1RvKHN0YXJ0X3NhbXBsZV9pbmRleCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZV90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7CisKKyAgICAgICAgICAgIGVyciA9IG1TYW1wbGVJdGVyYXRvci0+c2Vla1RvKG1TeW5jU2FtcGxlc1tsZWZ0XSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVpbnQzMl90IHVwcGVyX3RpbWUgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZVRpbWUoKTsKKworICAgICAgICAgICAgZXJyID0gbVNhbXBsZUl0ZXJhdG9yLT5zZWVrVG8obVN5bmNTYW1wbGVzW2xlZnQgLSAxXSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVpbnQzMl90IGxvd2VyX3RpbWUgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZVRpbWUoKTsKKworICAgICAgICAgICAgLy8gdXNlIGFic19kaWZmZXJlbmNlIGZvciBzYWZldHkKKyAgICAgICAgICAgIGlmIChhYnNfZGlmZmVyZW5jZSh1cHBlcl90aW1lLCBzYW1wbGVfdGltZSkgPgorICAgICAgICAgICAgICAgIGFic19kaWZmZXJlbmNlKHNhbXBsZV90aW1lLCBsb3dlcl90aW1lKSkgeworICAgICAgICAgICAgICAgIC0tbGVmdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgKnNhbXBsZV9pbmRleCA9IG1TeW5jU2FtcGxlc1tsZWZ0XTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFNhbXBsZVRhYmxlOjpmaW5kVGh1bWJuYWlsU2FtcGxlKHVpbnQzMl90ICpzYW1wbGVfaW5kZXgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1TeW5jU2FtcGxlT2Zmc2V0IDwgMCkgeworICAgICAgICAvLyBBbGwgc2FtcGxlcyBhcmUgc3luYy1zYW1wbGVzLgorICAgICAgICAqc2FtcGxlX2luZGV4ID0gMDsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHVpbnQzMl90IGJlc3RTYW1wbGVJbmRleCA9IDA7CisgICAgc2l6ZV90IG1heFNhbXBsZVNpemUgPSAwOworCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4TnVtU3luY1NhbXBsZXNUb1NjYW4gPSAyMDsKKworICAgIC8vIENvbnNpZGVyIHRoZSBmaXJzdCBrTWF4TnVtU3luY1NhbXBsZXNUb1NjYW4gc3luYyBzYW1wbGVzIGFuZAorICAgIC8vIHBpY2sgdGhlIG9uZSB3aXRoIHRoZSBsYXJnZXN0IChjb21wcmVzc2VkKSBzaXplIGFzIHRoZSB0aHVtYm5haWwuCisKKyAgICBzaXplX3QgbnVtU2FtcGxlc1RvU2NhbiA9IG1OdW1TeW5jU2FtcGxlczsKKyAgICBpZiAobnVtU2FtcGxlc1RvU2NhbiA+IGtNYXhOdW1TeW5jU2FtcGxlc1RvU2NhbikgeworICAgICAgICBudW1TYW1wbGVzVG9TY2FuID0ga01heE51bVN5bmNTYW1wbGVzVG9TY2FuOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU2FtcGxlc1RvU2NhbjsgKytpKSB7CisgICAgICAgIHVpbnQzMl90IHggPSBtU3luY1NhbXBsZXNbaV07CisKKyAgICAgICAgLy8gTm93IHggaXMgYSBzYW1wbGUgaW5kZXguCisgICAgICAgIHNpemVfdCBzYW1wbGVTaXplOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBnZXRTYW1wbGVTaXplX2woeCwgJnNhbXBsZVNpemUpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGkgPT0gMCB8fCBzYW1wbGVTaXplID4gbWF4U2FtcGxlU2l6ZSkgeworICAgICAgICAgICAgYmVzdFNhbXBsZUluZGV4ID0geDsKKyAgICAgICAgICAgIG1heFNhbXBsZVNpemUgPSBzYW1wbGVTaXplOworICAgICAgICB9CisgICAgfQorCisgICAgKnNhbXBsZV9pbmRleCA9IGJlc3RTYW1wbGVJbmRleDsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU2FtcGxlVGFibGU6OmdldFNhbXBsZVNpemVfbCgKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXgsIHNpemVfdCAqc2FtcGxlU2l6ZSkgeworICAgIHJldHVybiBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZVNpemVEaXJlY3QoCisgICAgICAgICAgICBzYW1wbGVJbmRleCwgc2FtcGxlU2l6ZSk7Cit9CisKK3N0YXR1c190IFNhbXBsZVRhYmxlOjpnZXRNZXRhRGF0YUZvclNhbXBsZSgKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXgsCisgICAgICAgIG9mZjY0X3QgKm9mZnNldCwKKyAgICAgICAgc2l6ZV90ICpzaXplLAorICAgICAgICB1aW50MzJfdCAqY29tcG9zaXRpb25UaW1lLAorICAgICAgICBib29sICppc1N5bmNTYW1wbGUsCisgICAgICAgIHVpbnQzMl90ICpzYW1wbGVEdXJhdGlvbikgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgaWYgKChlcnIgPSBtU2FtcGxlSXRlcmF0b3ItPnNlZWtUbyhzYW1wbGVJbmRleCkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKG9mZnNldCkgeworICAgICAgICAqb2Zmc2V0ID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVPZmZzZXQoKTsKKyAgICB9CisKKyAgICBpZiAoc2l6ZSkgeworICAgICAgICAqc2l6ZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlU2l6ZSgpOworICAgIH0KKworICAgIGlmIChjb21wb3NpdGlvblRpbWUpIHsKKyAgICAgICAgKmNvbXBvc2l0aW9uVGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOworICAgIH0KKworICAgIGlmIChpc1N5bmNTYW1wbGUpIHsKKyAgICAgICAgKmlzU3luY1NhbXBsZSA9IGZhbHNlOworICAgICAgICBpZiAobVN5bmNTYW1wbGVPZmZzZXQgPCAwKSB7CisgICAgICAgICAgICAvLyBFdmVyeSBzYW1wbGUgaXMgYSBzeW5jIHNhbXBsZS4KKyAgICAgICAgICAgICppc1N5bmNTYW1wbGUgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2l6ZV90IGkgPSAobUxhc3RTeW5jU2FtcGxlSW5kZXggPCBtTnVtU3luY1NhbXBsZXMpCisgICAgICAgICAgICAgICAgICAgICYmIChtU3luY1NhbXBsZXNbbUxhc3RTeW5jU2FtcGxlSW5kZXhdIDw9IHNhbXBsZUluZGV4KQorICAgICAgICAgICAgICAgID8gbUxhc3RTeW5jU2FtcGxlSW5kZXggOiAwOworCisgICAgICAgICAgICB3aGlsZSAoaSA8IG1OdW1TeW5jU2FtcGxlcyAmJiBtU3luY1NhbXBsZXNbaV0gPCBzYW1wbGVJbmRleCkgeworICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGkgPCBtTnVtU3luY1NhbXBsZXMgJiYgbVN5bmNTYW1wbGVzW2ldID09IHNhbXBsZUluZGV4KSB7CisgICAgICAgICAgICAgICAgKmlzU3luY1NhbXBsZSA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1MYXN0U3luY1NhbXBsZUluZGV4ID0gaTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzYW1wbGVEdXJhdGlvbikgeworICAgICAgICAqc2FtcGxlRHVyYXRpb24gPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZUR1cmF0aW9uKCk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitpbnQzMl90IFNhbXBsZVRhYmxlOjpnZXRDb21wb3NpdGlvblRpbWVPZmZzZXQodWludDMyX3Qgc2FtcGxlSW5kZXgpIHsKKyAgICByZXR1cm4gbUNvbXBvc2l0aW9uRGVsdGFMb29rdXAtPmdldENvbXBvc2l0aW9uVGltZU9mZnNldChzYW1wbGVJbmRleCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGU5NzRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuaApAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU0FNUExFX1RBQkxFX0hfCisKKyNkZWZpbmUgU0FNUExFX1RBQkxFX0hfCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEYXRhU291cmNlQmFzZTsKK3N0cnVjdCBTYW1wbGVJdGVyYXRvcjsKKworY2xhc3MgU2FtcGxlVGFibGUgOiBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgU2FtcGxlVGFibGUoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CisKKyAgICBib29sIGlzVmFsaWQoKSBjb25zdDsKKworICAgIC8vIHR5cGUgY2FuIGJlICdzdGNvJyBvciAnY282NCcuCisgICAgc3RhdHVzX3Qgc2V0Q2h1bmtPZmZzZXRQYXJhbXMoCisgICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBvZmY2NF90IGRhdGFfb2Zmc2V0LCBzaXplX3QgZGF0YV9zaXplKTsKKworICAgIHN0YXR1c190IHNldFNhbXBsZVRvQ2h1bmtQYXJhbXMob2ZmNjRfdCBkYXRhX29mZnNldCwgc2l6ZV90IGRhdGFfc2l6ZSk7CisKKyAgICAvLyB0eXBlIGNhbiBiZSAnc3Rzeicgb3IgJ3N0ejInLgorICAgIHN0YXR1c190IHNldFNhbXBsZVNpemVQYXJhbXMoCisgICAgICAgICAgICB1aW50MzJfdCB0eXBlLCBvZmY2NF90IGRhdGFfb2Zmc2V0LCBzaXplX3QgZGF0YV9zaXplKTsKKworICAgIHN0YXR1c190IHNldFRpbWVUb1NhbXBsZVBhcmFtcyhvZmY2NF90IGRhdGFfb2Zmc2V0LCBzaXplX3QgZGF0YV9zaXplKTsKKworICAgIHN0YXR1c190IHNldENvbXBvc2l0aW9uVGltZVRvU2FtcGxlUGFyYW1zKAorICAgICAgICAgICAgb2ZmNjRfdCBkYXRhX29mZnNldCwgc2l6ZV90IGRhdGFfc2l6ZSk7CisKKyAgICBzdGF0dXNfdCBzZXRTeW5jU2FtcGxlUGFyYW1zKG9mZjY0X3QgZGF0YV9vZmZzZXQsIHNpemVfdCBkYXRhX3NpemUpOworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgdWludDMyX3QgY291bnRDaHVua09mZnNldHMoKSBjb25zdDsKKworICAgIHVpbnQzMl90IGNvdW50U2FtcGxlcygpIGNvbnN0OworCisgICAgc3RhdHVzX3QgZ2V0TWF4U2FtcGxlU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgc3RhdHVzX3QgZ2V0TWV0YURhdGFGb3JTYW1wbGUoCisgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCwKKyAgICAgICAgICAgIG9mZjY0X3QgKm9mZnNldCwKKyAgICAgICAgICAgIHNpemVfdCAqc2l6ZSwKKyAgICAgICAgICAgIHVpbnQzMl90ICpjb21wb3NpdGlvblRpbWUsCisgICAgICAgICAgICBib29sICppc1N5bmNTYW1wbGUgPSBOVUxMLAorICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZUR1cmF0aW9uID0gTlVMTCk7CisKKyAgICBlbnVtIHsKKyAgICAgICAga0ZsYWdCZWZvcmUsCisgICAgICAgIGtGbGFnQWZ0ZXIsCisgICAgICAgIGtGbGFnQ2xvc2VzdCwKKyAgICAgICAga0ZsYWdGcmFtZUluZGV4LAorICAgIH07CisgICAgc3RhdHVzX3QgZmluZFNhbXBsZUF0VGltZSgKKyAgICAgICAgICAgIHVpbnQ2NF90IHJlcV90aW1lLCB1aW50NjRfdCBzY2FsZV9udW0sIHVpbnQ2NF90IHNjYWxlX2RlbiwKKyAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVfaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKworICAgIHN0YXR1c190IGZpbmRTeW5jU2FtcGxlTmVhcigKKyAgICAgICAgICAgIHVpbnQzMl90IHN0YXJ0X3NhbXBsZV9pbmRleCwgdWludDMyX3QgKnNhbXBsZV9pbmRleCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKTsKKworICAgIHN0YXR1c190IGZpbmRUaHVtYm5haWxTYW1wbGUodWludDMyX3QgKnNhbXBsZV9pbmRleCk7CisKK3Byb3RlY3RlZDoKKyAgICB+U2FtcGxlVGFibGUoKTsKKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgQ29tcG9zaXRpb25EZWx0YUxvb2t1cDsKKworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrQ2h1bmtPZmZzZXRUeXBlMzI7CisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtDaHVua09mZnNldFR5cGU2NDsKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1NhbXBsZVNpemVUeXBlMzI7CisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtTYW1wbGVTaXplVHlwZUNvbXBhY3Q7CisKKyAgICAvLyBMaW1pdCB0aGUgdG90YWwgc2l6ZSBvZiBhbGwgaW50ZXJuYWwgdGFibGVzIHRvIDIwME1pQi4KKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhUb3RhbFNpemUgPSAyMDAgKiAoMSA8PCAyMCk7CisKKyAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgTXV0ZXggbUxvY2s7CisKKyAgICBvZmY2NF90IG1DaHVua09mZnNldE9mZnNldDsKKyAgICB1aW50MzJfdCBtQ2h1bmtPZmZzZXRUeXBlOworICAgIHVpbnQzMl90IG1OdW1DaHVua09mZnNldHM7CisKKyAgICBvZmY2NF90IG1TYW1wbGVUb0NodW5rT2Zmc2V0OworICAgIHVpbnQzMl90IG1OdW1TYW1wbGVUb0NodW5rT2Zmc2V0czsKKworICAgIG9mZjY0X3QgbVNhbXBsZVNpemVPZmZzZXQ7CisgICAgdWludDMyX3QgbVNhbXBsZVNpemVGaWVsZFNpemU7CisgICAgdWludDMyX3QgbURlZmF1bHRTYW1wbGVTaXplOworICAgIHVpbnQzMl90IG1OdW1TYW1wbGVTaXplczsKKworICAgIGJvb2wgbUhhc1RpbWVUb1NhbXBsZTsKKyAgICB1aW50MzJfdCBtVGltZVRvU2FtcGxlQ291bnQ7CisgICAgdWludDMyX3QqIG1UaW1lVG9TYW1wbGU7CisKKyAgICBzdHJ1Y3QgU2FtcGxlVGltZUVudHJ5IHsKKyAgICAgICAgdWludDMyX3QgbVNhbXBsZUluZGV4OworICAgICAgICB1aW50MzJfdCBtQ29tcG9zaXRpb25UaW1lOworICAgIH07CisgICAgU2FtcGxlVGltZUVudHJ5ICptU2FtcGxlVGltZUVudHJpZXM7CisKKyAgICBpbnQzMl90ICptQ29tcG9zaXRpb25UaW1lRGVsdGFFbnRyaWVzOworICAgIHNpemVfdCBtTnVtQ29tcG9zaXRpb25UaW1lRGVsdGFFbnRyaWVzOworICAgIENvbXBvc2l0aW9uRGVsdGFMb29rdXAgKm1Db21wb3NpdGlvbkRlbHRhTG9va3VwOworCisgICAgb2ZmNjRfdCBtU3luY1NhbXBsZU9mZnNldDsKKyAgICB1aW50MzJfdCBtTnVtU3luY1NhbXBsZXM7CisgICAgdWludDMyX3QgKm1TeW5jU2FtcGxlczsKKyAgICBzaXplX3QgbUxhc3RTeW5jU2FtcGxlSW5kZXg7CisKKyAgICBTYW1wbGVJdGVyYXRvciAqbVNhbXBsZUl0ZXJhdG9yOworCisgICAgc3RydWN0IFNhbXBsZVRvQ2h1bmtFbnRyeSB7CisgICAgICAgIHVpbnQzMl90IHN0YXJ0Q2h1bms7CisgICAgICAgIHVpbnQzMl90IHNhbXBsZXNQZXJDaHVuazsKKyAgICAgICAgdWludDMyX3QgY2h1bmtEZXNjOworICAgIH07CisgICAgU2FtcGxlVG9DaHVua0VudHJ5ICptU2FtcGxlVG9DaHVua0VudHJpZXM7CisKKyAgICAvLyBBcHByb3hpbWF0ZSBzaXplIG9mIGFsbCB0YWJsZXMgY29tYmluZWQuCisgICAgdWludDY0X3QgbVRvdGFsU2l6ZTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgU2FtcGxlSXRlcmF0b3I7CisKKyAgICAvLyBub3JtYWxseSB3ZSBkb24ndCByb3VuZAorICAgIGlubGluZSB1aW50NjRfdCBnZXRTYW1wbGVUaW1lKAorICAgICAgICAgICAgc2l6ZV90IHNhbXBsZV9pbmRleCwgdWludDY0X3Qgc2NhbGVfbnVtLCB1aW50NjRfdCBzY2FsZV9kZW4pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIChzYW1wbGVfaW5kZXggPCAoc2l6ZV90KW1OdW1TYW1wbGVTaXplcyAmJiBtU2FtcGxlVGltZUVudHJpZXMgIT0gTlVMTAorICAgICAgICAgICAgICAgICYmIHNjYWxlX2RlbiAhPSAwKQorICAgICAgICAgICAgICAgID8gKG1TYW1wbGVUaW1lRW50cmllc1tzYW1wbGVfaW5kZXhdLm1Db21wb3NpdGlvblRpbWUgKiBzY2FsZV9udW0pIC8gc2NhbGVfZGVuIDogMDsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBnZXRTYW1wbGVTaXplX2wodWludDMyX3Qgc2FtcGxlX2luZGV4LCBzaXplX3QgKnNhbXBsZV9zaXplKTsKKyAgICBpbnQzMl90IGdldENvbXBvc2l0aW9uVGltZU9mZnNldCh1aW50MzJfdCBzYW1wbGVJbmRleCk7CisKKyAgICBzdGF0aWMgaW50IENvbXBhcmVJbmNyZWFzaW5nVGltZShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKik7CisKKyAgICB2b2lkIGJ1aWxkU2FtcGxlRW50cmllc1RhYmxlKCk7CisKKyAgICBTYW1wbGVUYWJsZShjb25zdCBTYW1wbGVUYWJsZSAmKTsKKyAgICBTYW1wbGVUYWJsZSAmb3BlcmF0b3I9KGNvbnN0IFNhbXBsZVRhYmxlICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBTQU1QTEVfVEFCTEVfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L2V4cG9ydHMubGRzIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvZXhwb3J0cy5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEzMDllZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L2V4cG9ydHMubGRzCkBAIC0wLDAgKzEgQEAKK3sgZ2xvYmFsOiBHRVRFWFRSQUNUT1JERUY7IGxvY2FsOiAqOyB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNGE1OTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1NiBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworCisgICAgc3JjczogWworICAgICAgICAiRXh0cmFjdG9yQnVuZGxlLmNwcCIsCisgICAgICAgICJNUEVHMlBTRXh0cmFjdG9yLmNwcCIsCisgICAgICAgICJNUEVHMlRTRXh0cmFjdG9yLmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXNAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzLm5hdGl2ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3J5cHRvIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJoaWRsYWxsb2NhdG9ydXRpbHMiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0IiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgbmFtZTogImxpYm1wZWcyZXh0cmFjdG9yIiwKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJleHRyYWN0b3JzIiwKKworICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJmaXJzdCIsCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgXSwKKyAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorCit9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0V4dHJhY3RvckJ1bmRsZS5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0V4dHJhY3RvckJ1bmRsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEwZmEwMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvRXh0cmFjdG9yQnVuZGxlLmNwcApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNUEVHMkV4dHJhY3RvckJ1bmRsZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSAiTVBFRzJQU0V4dHJhY3Rvci5oIgorI2luY2x1ZGUgIk1QRUcyVFNFeHRyYWN0b3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitleHRlcm4gIkMiIHsKKy8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKK19fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKK01lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworICAgIHJldHVybiB7CisgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgVVVJRCgiM2QxZGNmZWItZTQwYS00MzZkLWE1NzQtYzI0MzhhNTU1ZTVmIiksCisgICAgICAgIDEsCisgICAgICAgICJNUEVHMi1QUy9UUyBFeHRyYWN0b3IiLAorICAgICAgICBbXSgKKyAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICAgICAgICAgIHZvaWQgKiosCisgICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSAtPiBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgeworICAgICAgICAgICAgaWYgKFNuaWZmTVBFRzJUUyhzb3VyY2UsIGNvbmZpZGVuY2UpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFtdKAorICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gTWVkaWFFeHRyYWN0b3IqIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNUEVHMlRTRXh0cmFjdG9yKHNvdXJjZSk7fTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoU25pZmZNUEVHMlBTKHNvdXJjZSwgY29uZmlkZW5jZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBNZWRpYUV4dHJhY3RvciogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTVBFRzJQU0V4dHJhY3Rvcihzb3VyY2UpO307CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH07Cit9CisKK30gLy8gZXh0ZXJuICJDIgorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpjb3B5IHRvIG1lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJQU0V4dHJhY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk4MGI4MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJQU0V4dHJhY3Rvci5jcHAKQEAgLTAsMCArMSw3NzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1QRUcyUFNFeHRyYWN0b3IiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJNUEVHMlBTRXh0cmFjdG9yLmgiCisKKyNpbmNsdWRlICJtcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaCIKKyNpbmNsdWRlICJtcGVnMnRzL0VTUXVldWUuaCIKKworI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrIDogcHVibGljIE1lZGlhVHJhY2ssIHB1YmxpYyBSZWZCYXNlIHsKKyAgICBUcmFjayhNUEVHMlBTRXh0cmFjdG9yICpleHRyYWN0b3IsCisgICAgICAgICAgdW5zaWduZWQgc3RyZWFtX2lkLCB1bnNpZ25lZCBzdHJlYW1fdHlwZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJik7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflRyYWNrKCk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBNUEVHMlBTRXh0cmFjdG9yOworCisgICAgTVBFRzJQU0V4dHJhY3RvciAqbUV4dHJhY3RvcjsKKworICAgIHVuc2lnbmVkIG1TdHJlYW1JRDsKKyAgICB1bnNpZ25lZCBtU3RyZWFtVHlwZTsKKyAgICBFbGVtZW50YXJ5U3RyZWFtUXVldWUgKm1RdWV1ZTsKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBtU291cmNlOworCisgICAgc3RhdHVzX3QgYXBwZW5kUEVTRGF0YSgKKyAgICAgICAgICAgIHVuc2lnbmVkIFBUU19EVFNfZmxhZ3MsCisgICAgICAgICAgICB1aW50NjRfdCBQVFMsIHVpbnQ2NF90IERUUywKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRyYWNrKTsKK307CisKK3N0cnVjdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2sgOiBwdWJsaWMgTWVkaWFUcmFjayB7CisgICAgV3JhcHBlZFRyYWNrKE1QRUcyUFNFeHRyYWN0b3IgKmV4dHJhY3RvciwgY29uc3Qgc3A8VHJhY2s+ICZ0cmFjayk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJik7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfldyYXBwZWRUcmFjaygpOworCitwcml2YXRlOgorICAgIE1QRUcyUFNFeHRyYWN0b3IgKm1FeHRyYWN0b3I7CisgICAgc3A8TVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s+IG1UcmFjazsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFdyYXBwZWRUcmFjayk7Cit9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitNUEVHMlBTRXh0cmFjdG9yOjpNUEVHMlBTRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCisgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAorICAgICAgbU9mZnNldCgwKSwKKyAgICAgIG1GaW5hbFJlc3VsdChPSyksCisgICAgICBtQnVmZmVyKG5ldyBBQnVmZmVyKDApKSwKKyAgICAgIG1TY2FubmluZyh0cnVlKSwKKyAgICAgIG1Qcm9ncmFtU3RyZWFtTWFwVmFsaWQoZmFsc2UpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDUwMDsgKytpKSB7CisgICAgICAgIGlmIChmZWVkTW9yZSgpICE9IE9LKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJlbW92ZSBhbGwgdHJhY2tzIHRoYXQgd2VyZSB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZWlyIGZvcm1hdC4KKyAgICBNZXRhRGF0YUJhc2UgbWV0YTsKKyAgICBmb3IgKHNpemVfdCBpID0gbVRyYWNrcy5zaXplKCk7IGkgPiAwOykgeworICAgICAgICBpLS07CisgICAgICAgIGlmIChtVHJhY2tzLnZhbHVlQXQoaSktPmdldEZvcm1hdChtZXRhKSAhPSBPSykgeworICAgICAgICAgICAgbVRyYWNrcy5yZW1vdmVJdGVtc0F0KGkpOworICAgICAgICB9CisgICAgfQorCisgICAgbVNjYW5uaW5nID0gZmFsc2U7Cit9CisKK01QRUcyUFNFeHRyYWN0b3I6On5NUEVHMlBTRXh0cmFjdG9yKCkgeworfQorCitzaXplX3QgTVBFRzJQU0V4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7CisgICAgcmV0dXJuIG1UcmFja3Muc2l6ZSgpOworfQorCitNZWRpYVRyYWNrICpNUEVHMlBTRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKKyAgICBpZiAoaW5kZXggPj0gbVRyYWNrcy5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBXcmFwcGVkVHJhY2sodGhpcywgbVRyYWNrcy52YWx1ZUF0KGluZGV4KSk7Cit9CisKK3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgeworICAgIGlmIChpbmRleCA+PSBtVHJhY2tzLnNpemUoKSkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gbVRyYWNrcy52YWx1ZUF0KGluZGV4KS0+Z2V0Rm9ybWF0KG1ldGEpOworfQorCitzdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKKyAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJQUyk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3VpbnQzMl90IE1QRUcyUFNFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgeworICAgIHJldHVybiBDQU5fUEFVU0U7Cit9CisKK3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OmZlZWRNb3JlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICAvLyBIb3cgbXVjaCBkYXRhIHdlJ3JlIHJlYWRpbmcgYXQgYSB0aW1lCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrQ2h1bmtTaXplID0gODE5MjsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gZGVxdWV1ZUNodW5rKCk7CisKKyAgICAgICAgaWYgKGVyciA9PSAtRUFHQUlOICYmIG1GaW5hbFJlc3VsdCA9PSBPSykgeworICAgICAgICAgICAgbWVtbW92ZShtQnVmZmVyLT5iYXNlKCksIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIG1CdWZmZXItPnNpemUoKSk7CisKKyAgICAgICAgICAgIGlmIChtQnVmZmVyLT5zaXplKCkgKyBrQ2h1bmtTaXplID4gbUJ1ZmZlci0+Y2FwYWNpdHkoKSkgeworICAgICAgICAgICAgICAgIHNpemVfdCBuZXdDYXBhY2l0eSA9IG1CdWZmZXItPmNhcGFjaXR5KCkgKyBrQ2h1bmtTaXplOworICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IG5ld0J1ZmZlciA9IG5ldyBBQnVmZmVyKG5ld0NhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICBtZW1jcHkobmV3QnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBuZXdCdWZmZXItPnNldFJhbmdlKDAsIG1CdWZmZXItPnNpemUoKSk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IG5ld0J1ZmZlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3NpemVfdCBuID0gbURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgbU9mZnNldCwgbUJ1ZmZlci0+ZGF0YSgpICsgbUJ1ZmZlci0+c2l6ZSgpLCBrQ2h1bmtTaXplKTsKKworICAgICAgICAgICAgaWYgKG4gPCAoc3NpemVfdClrQ2h1bmtTaXplKSB7CisgICAgICAgICAgICAgICAgbUZpbmFsUmVzdWx0ID0gKG4gPCAwKSA/IChzdGF0dXNfdCluIDogRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUZpbmFsUmVzdWx0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZShtQnVmZmVyLT5vZmZzZXQoKSwgbUJ1ZmZlci0+c2l6ZSgpICsgbik7CisgICAgICAgICAgICBtT2Zmc2V0ICs9IG47CisgICAgICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBtRmluYWxSZXN1bHQgPSBlcnI7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpkZXF1ZXVlQ2h1bmsoKSB7CisgICAgaWYgKG1CdWZmZXItPnNpemUoKSA8IDQpIHsKKyAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgfQorCisgICAgaWYgKG1lbWNtcCgiXHgwMFx4MDBceDAxIiwgbUJ1ZmZlci0+ZGF0YSgpLCAzKSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVuc2lnbmVkIGNodW5rVHlwZSA9IG1CdWZmZXItPmRhdGEoKVszXTsKKworICAgIHNzaXplX3QgcmVzOworCisgICAgc3dpdGNoIChjaHVua1R5cGUpIHsKKyAgICAgICAgY2FzZSAweGJhOgorICAgICAgICB7CisgICAgICAgICAgICByZXMgPSBkZXF1ZXVlUGFjaygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIDB4YmI6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlcyA9IGRlcXVldWVTeXN0ZW1IZWFkZXIoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgcmVzID0gZGVxdWV1ZVBFUygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmVzID4gMCkgeworICAgICAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpIDwgKHNpemVfdClyZXMpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgICAgICB9CisKKyAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UobUJ1ZmZlci0+b2Zmc2V0KCkgKyByZXMsIG1CdWZmZXItPnNpemUoKSAtIHJlcyk7CisgICAgICAgIHJlcyA9IE9LOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3NzaXplX3QgTVBFRzJQU0V4dHJhY3Rvcjo6ZGVxdWV1ZVBhY2soKSB7CisgICAgLy8gMzIgKyAyICsgMyArIDEgKyAxNSArIDEgKyAxNSsgMSArIDkgKyAxICsgMjIgKyAxICsgMSB8ICs1CisKKyAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpIDwgMTQpIHsKKyAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgfQorCisgICAgdW5zaWduZWQgcGFja19zdHVmZmluZ19sZW5ndGggPSBtQnVmZmVyLT5kYXRhKClbMTNdICYgNzsKKworICAgIHJldHVybiBwYWNrX3N0dWZmaW5nX2xlbmd0aCArIDE0OworfQorCitzc2l6ZV90IE1QRUcyUFNFeHRyYWN0b3I6OmRlcXVldWVTeXN0ZW1IZWFkZXIoKSB7CisgICAgaWYgKG1CdWZmZXItPnNpemUoKSA8IDYpIHsKKyAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgfQorCisgICAgdW5zaWduZWQgaGVhZGVyX2xlbmd0aCA9IFUxNl9BVChtQnVmZmVyLT5kYXRhKCkgKyA0KTsKKworICAgIHJldHVybiBoZWFkZXJfbGVuZ3RoICsgNjsKK30KKworc3NpemVfdCBNUEVHMlBTRXh0cmFjdG9yOjpkZXF1ZXVlUEVTKCkgeworICAgIGlmIChtQnVmZmVyLT5zaXplKCkgPCA2KSB7CisgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgIH0KKworICAgIHVuc2lnbmVkIFBFU19wYWNrZXRfbGVuZ3RoID0gVTE2X0FUKG1CdWZmZXItPmRhdGEoKSArIDQpOworICAgIGlmIChQRVNfcGFja2V0X2xlbmd0aCA9PSAwdSkgeworICAgICAgICBBTE9HRSgiUEVTX3BhY2tldF9sZW5ndGggaXMgMCIpOworICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICB9CisKKyAgICBzaXplX3QgbiA9IFBFU19wYWNrZXRfbGVuZ3RoICsgNjsKKworICAgIGlmIChtQnVmZmVyLT5zaXplKCkgPCBuKSB7CisgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgIH0KKworICAgIEFCaXRSZWFkZXIgYnIobUJ1ZmZlci0+ZGF0YSgpLCBuKTsKKworICAgIHVuc2lnbmVkIHBhY2tldF9zdGFydGNvZGVfcHJlZml4ID0gYnIuZ2V0Qml0cygyNCk7CisKKyAgICBBTE9HVigicGFja2V0X3N0YXJ0Y29kZV9wcmVmaXggPSAweCUwOHgiLCBwYWNrZXRfc3RhcnRjb2RlX3ByZWZpeCk7CisKKyAgICBpZiAocGFja2V0X3N0YXJ0Y29kZV9wcmVmaXggIT0gMSkgeworICAgICAgICBBTE9HVigiU3VwcG9zZWRseSBwYXlsb2FkX3VuaXRfc3RhcnQ9MSB1bml0IGRvZXMgbm90IHN0YXJ0ICIKKyAgICAgICAgICAgICAid2l0aCBzdGFydGNvZGUuIik7CisKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBpZiAocGFja2V0X3N0YXJ0Y29kZV9wcmVmaXggIT0gMHgwMDAwMDF1KSB7CisgICAgICAgIEFMT0dFKCJXcm9uZyBQRVMgcHJlZml4Iik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdW5zaWduZWQgc3RyZWFtX2lkID0gYnIuZ2V0Qml0cyg4KTsKKyAgICBBTE9HVigic3RyZWFtX2lkID0gMHglMDJ4Iiwgc3RyZWFtX2lkKTsKKworICAgIC8qIHVuc2lnbmVkIFBFU19wYWNrZXRfbGVuZ3RoID0gKi9ici5nZXRCaXRzKDE2KTsKKworICAgIGlmIChzdHJlYW1faWQgPT0gMHhiYykgeworICAgICAgICAvLyBwcm9ncmFtX3N0cmVhbV9tYXAKKworICAgICAgICBpZiAoIW1TY2FubmluZykgeworICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIH0KKworICAgICAgICBtU3RyZWFtVHlwZUJ5RVNJRC5jbGVhcigpOworCisgICAgICAgIC8qIHVuc2lnbmVkIGN1cnJlbnRfbmV4dF9pbmRpY2F0b3IgPSAqL2JyLmdldEJpdHMoMSk7CisgICAgICAgIC8qIHVuc2lnbmVkIHJlc2VydmVkID0gKi9ici5nZXRCaXRzKDIpOworICAgICAgICAvKiB1bnNpZ25lZCBwcm9ncmFtX3N0cmVhbV9tYXBfdmVyc2lvbiA9ICovYnIuZ2V0Qml0cyg1KTsKKyAgICAgICAgLyogdW5zaWduZWQgcmVzZXJ2ZWQgPSAqL2JyLmdldEJpdHMoNyk7CisgICAgICAgIC8qIHVuc2lnbmVkIG1hcmtlcl9iaXQgPSAqL2JyLmdldEJpdHMoMSk7CisgICAgICAgIHVuc2lnbmVkIHByb2dyYW1fc3RyZWFtX2luZm9fbGVuZ3RoID0gYnIuZ2V0Qml0cygxNik7CisKKyAgICAgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgICAgIHdoaWxlIChvZmZzZXQgPCBwcm9ncmFtX3N0cmVhbV9pbmZvX2xlbmd0aCkgeworICAgICAgICAgICAgaWYgKG9mZnNldCArIDIgPiBwcm9ncmFtX3N0cmVhbV9pbmZvX2xlbmd0aCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVuc2lnbmVkIGRlc2NyaXB0b3JfdGFnID0gYnIuZ2V0Qml0cyg4KTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGRlc2NyaXB0b3JfbGVuZ3RoID0gYnIuZ2V0Qml0cyg4KTsKKworICAgICAgICAgICAgQUxPR0koImZvdW5kIGRlc2NyaXB0b3IgdGFnIDB4JTAyeCBvZiBsZW5ndGggJXUiLAorICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3RhZywgZGVzY3JpcHRvcl9sZW5ndGgpOworCisgICAgICAgICAgICBpZiAob2Zmc2V0ICsgMiArIGRlc2NyaXB0b3JfbGVuZ3RoID4gcHJvZ3JhbV9zdHJlYW1faW5mb19sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBici5za2lwQml0cyg4ICogZGVzY3JpcHRvcl9sZW5ndGgpOworCisgICAgICAgICAgICBvZmZzZXQgKz0gMiArIGRlc2NyaXB0b3JfbGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgdW5zaWduZWQgZWxlbWVudGFyeV9zdHJlYW1fbWFwX2xlbmd0aCA9IGJyLmdldEJpdHMoMTYpOworCisgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgIHdoaWxlIChvZmZzZXQgPCBlbGVtZW50YXJ5X3N0cmVhbV9tYXBfbGVuZ3RoKSB7CisgICAgICAgICAgICBpZiAob2Zmc2V0ICsgNCA+IGVsZW1lbnRhcnlfc3RyZWFtX21hcF9sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1bnNpZ25lZCBzdHJlYW1fdHlwZSA9IGJyLmdldEJpdHMoOCk7CisgICAgICAgICAgICB1bnNpZ25lZCBlbGVtZW50YXJ5X3N0cmVhbV9pZCA9IGJyLmdldEJpdHMoOCk7CisKKyAgICAgICAgICAgIEFMT0dJKCJlbGVtZW50YXJ5IHN0cmVhbSBpZCAweCUwMnggaGFzIHN0cmVhbSB0eXBlIDB4JTAyeCIsCisgICAgICAgICAgICAgICAgIGVsZW1lbnRhcnlfc3RyZWFtX2lkLCBzdHJlYW1fdHlwZSk7CisKKyAgICAgICAgICAgIG1TdHJlYW1UeXBlQnlFU0lELmFkZChlbGVtZW50YXJ5X3N0cmVhbV9pZCwgc3RyZWFtX3R5cGUpOworCisgICAgICAgICAgICB1bnNpZ25lZCBlbGVtZW50YXJ5X3N0cmVhbV9pbmZvX2xlbmd0aCA9IGJyLmdldEJpdHMoMTYpOworCisgICAgICAgICAgICBpZiAob2Zmc2V0ICsgNCArIGVsZW1lbnRhcnlfc3RyZWFtX2luZm9fbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgID4gZWxlbWVudGFyeV9zdHJlYW1fbWFwX2xlbmd0aCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9mZnNldCArPSA0ICsgZWxlbWVudGFyeV9zdHJlYW1faW5mb19sZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICAvKiB1bnNpZ25lZCBDUkMzMiA9ICovYnIuZ2V0Qml0cygzMik7CisKKyAgICAgICAgbVByb2dyYW1TdHJlYW1NYXBWYWxpZCA9IHRydWU7CisgICAgfSBlbHNlIGlmIChzdHJlYW1faWQgIT0gMHhiZSAgLy8gcGFkZGluZ19zdHJlYW0KKyAgICAgICAgICAgICYmIHN0cmVhbV9pZCAhPSAweGJmICAvLyBwcml2YXRlX3N0cmVhbV8yCisgICAgICAgICAgICAmJiBzdHJlYW1faWQgIT0gMHhmMCAgLy8gRUNNCisgICAgICAgICAgICAmJiBzdHJlYW1faWQgIT0gMHhmMSAgLy8gRU1NCisgICAgICAgICAgICAmJiBzdHJlYW1faWQgIT0gMHhmZiAgLy8gcHJvZ3JhbV9zdHJlYW1fZGlyZWN0b3J5CisgICAgICAgICAgICAmJiBzdHJlYW1faWQgIT0gMHhmMiAgLy8gRFNNQ0MKKyAgICAgICAgICAgICYmIHN0cmVhbV9pZCAhPSAweGY4KSB7ICAvLyBILjIyMi4xIHR5cGUgRQorICAgICAgICAvKiB1bnNpZ25lZCBQRVNfbWFya2VyX2JpdHMgPSAqL2JyLmdldEJpdHMoMik7ICAvLyBzaG91bGQgYmUgMHgyKGhleCkKKyAgICAgICAgLyogdW5zaWduZWQgUEVTX3NjcmFtYmxpbmdfY29udHJvbCA9ICovYnIuZ2V0Qml0cygyKTsKKyAgICAgICAgLyogdW5zaWduZWQgUEVTX3ByaW9yaXR5ID0gKi9ici5nZXRCaXRzKDEpOworICAgICAgICAvKiB1bnNpZ25lZCBkYXRhX2FsaWdubWVudF9pbmRpY2F0b3IgPSAqL2JyLmdldEJpdHMoMSk7CisgICAgICAgIC8qIHVuc2lnbmVkIGNvcHlyaWdodCA9ICovYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgLyogdW5zaWduZWQgb3JpZ2luYWxfb3JfY29weSA9ICovYnIuZ2V0Qml0cygxKTsKKworICAgICAgICB1bnNpZ25lZCBQVFNfRFRTX2ZsYWdzID0gYnIuZ2V0Qml0cygyKTsKKyAgICAgICAgQUxPR1YoIlBUU19EVFNfZmxhZ3MgPSAldSIsIFBUU19EVFNfZmxhZ3MpOworCisgICAgICAgIHVuc2lnbmVkIEVTQ1JfZmxhZyA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgIEFMT0dWKCJFU0NSX2ZsYWcgPSAldSIsIEVTQ1JfZmxhZyk7CisKKyAgICAgICAgdW5zaWduZWQgRVNfcmF0ZV9mbGFnID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgQUxPR1YoIkVTX3JhdGVfZmxhZyA9ICV1IiwgRVNfcmF0ZV9mbGFnKTsKKworICAgICAgICB1bnNpZ25lZCBEU01fdHJpY2tfbW9kZV9mbGFnID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgQUxPR1YoIkRTTV90cmlja19tb2RlX2ZsYWcgPSAldSIsIERTTV90cmlja19tb2RlX2ZsYWcpOworCisgICAgICAgIHVuc2lnbmVkIGFkZGl0aW9uYWxfY29weV9pbmZvX2ZsYWcgPSBici5nZXRCaXRzKDEpOworICAgICAgICBBTE9HVigiYWRkaXRpb25hbF9jb3B5X2luZm9fZmxhZyA9ICV1IiwgYWRkaXRpb25hbF9jb3B5X2luZm9fZmxhZyk7CisKKyAgICAgICAgLyogdW5zaWduZWQgUEVTX0NSQ19mbGFnID0gKi9ici5nZXRCaXRzKDEpOworICAgICAgICAvKiBQRVNfZXh0ZW5zaW9uX2ZsYWcgPSAqL2JyLmdldEJpdHMoMSk7CisKKyAgICAgICAgdW5zaWduZWQgUEVTX2hlYWRlcl9kYXRhX2xlbmd0aCA9IGJyLmdldEJpdHMoOCk7CisgICAgICAgIEFMT0dWKCJQRVNfaGVhZGVyX2RhdGFfbGVuZ3RoID0gJXUiLCBQRVNfaGVhZGVyX2RhdGFfbGVuZ3RoKTsKKworICAgICAgICB1bnNpZ25lZCBvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgPSBQRVNfaGVhZGVyX2RhdGFfbGVuZ3RoOworCisgICAgICAgIHVpbnQ2NF90IFBUUyA9IDAsIERUUyA9IDA7CisKKyAgICAgICAgaWYgKFBUU19EVFNfZmxhZ3MgPT0gMiB8fCBQVFNfRFRTX2ZsYWdzID09IDMpIHsKKyAgICAgICAgICAgIGlmIChvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgPCA1dSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDQpICE9IFBUU19EVFNfZmxhZ3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBQVFMgPSAoKHVpbnQ2NF90KWJyLmdldEJpdHMoMykpIDw8IDMwOworICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUFRTIHw9ICgodWludDY0X3QpYnIuZ2V0Qml0cygxNSkpIDw8IDE1OworICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUFRTIHw9IGJyLmdldEJpdHMoMTUpOworICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTE9HVigiUFRTID0gJSIgUFJJdTY0LCBQVFMpOworICAgICAgICAgICAgLy8gQUxPR0koIlBUUyA9ICUuMmYgc2VjcyIsIFBUUyAvIDkwMDAwLjBmKTsKKworICAgICAgICAgICAgb3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIC09IDU7CisKKyAgICAgICAgICAgIGlmIChQVFNfRFRTX2ZsYWdzID09IDMpIHsKKyAgICAgICAgICAgICAgICBpZiAob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIDwgNXUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cyg0KSAhPSAxdSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIERUUyA9ICgodWludDY0X3QpYnIuZ2V0Qml0cygzKSkgPDwgMzA7CisgICAgICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRFRTIHw9ICgodWludDY0X3QpYnIuZ2V0Qml0cygxNSkpIDw8IDE1OworICAgICAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERUUyB8PSBici5nZXRCaXRzKDE1KTsKKyAgICAgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEFMT0dWKCJEVFMgPSAlIiBQUkl1NjQsIERUUyk7CisKKyAgICAgICAgICAgICAgICBvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgLT0gNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChFU0NSX2ZsYWcpIHsKKyAgICAgICAgICAgIGlmIChvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgPCA2dSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyLmdldEJpdHMoMik7CisKKyAgICAgICAgICAgIHVpbnQ2NF90IEVTQ1IgPSAoKHVpbnQ2NF90KWJyLmdldEJpdHMoMykpIDw8IDMwOworICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRVNDUiB8PSAoKHVpbnQ2NF90KWJyLmdldEJpdHMoMTUpKSA8PCAxNTsKKyAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEVTQ1IgfD0gYnIuZ2V0Qml0cygxNSk7CisgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFMT0dWKCJFU0NSID0gJSIgUFJJdTY0LCBFU0NSKTsKKyAgICAgICAgICAgIC8qIHVuc2lnbmVkIEVTQ1JfZXh0ZW5zaW9uID0gKi9ici5nZXRCaXRzKDkpOworCisgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyAtPSA2OworICAgICAgICB9CisKKyAgICAgICAgaWYgKEVTX3JhdGVfZmxhZykgeworICAgICAgICAgICAgaWYgKG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyA8IDN1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogdW5zaWduZWQgRVNfcmF0ZSA9ICovYnIuZ2V0Qml0cygyMik7CisgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyAtPSAzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCBvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgKiA4KSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgYnIuc2tpcEJpdHMob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nICogOCk7CisKKyAgICAgICAgLy8gRVMgZGF0YSBmb2xsb3dzLgorCisgICAgICAgIGlmIChQRVNfcGFja2V0X2xlbmd0aCA8IFBFU19oZWFkZXJfZGF0YV9sZW5ndGggKyAzKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgdW5zaWduZWQgZGF0YUxlbmd0aCA9CisgICAgICAgICAgICBQRVNfcGFja2V0X2xlbmd0aCAtIDMgLSBQRVNfaGVhZGVyX2RhdGFfbGVuZ3RoOworCisgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgZGF0YUxlbmd0aCAqIDgpIHsKKyAgICAgICAgICAgIEFMT0dFKCJQRVMgcGFja2V0IGRvZXMgbm90IGNhcnJ5IGVub3VnaCBkYXRhIHRvIGNvbnRhaW4gIgorICAgICAgICAgICAgICAgICAicGF5bG9hZC4gKG51bUJpdHNMZWZ0ID0gJXp1LCByZXF1aXJlZCA9ICV1KSIsCisgICAgICAgICAgICAgICAgIGJyLm51bUJpdHNMZWZ0KCksIGRhdGFMZW5ndGggKiA4KTsKKworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgZGF0YUxlbmd0aCAqIDgpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBzc2l6ZV90IGluZGV4ID0gbVRyYWNrcy5pbmRleE9mS2V5KHN0cmVhbV9pZCk7CisgICAgICAgIGlmIChpbmRleCA8IDAgJiYgbVNjYW5uaW5nKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBzdHJlYW1UeXBlOworCisgICAgICAgICAgICBzc2l6ZV90IHN0cmVhbVR5cGVJbmRleDsKKyAgICAgICAgICAgIGlmIChtUHJvZ3JhbVN0cmVhbU1hcFZhbGlkCisgICAgICAgICAgICAgICAgICAgICYmIChzdHJlYW1UeXBlSW5kZXggPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlQnlFU0lELmluZGV4T2ZLZXkoc3RyZWFtX2lkKSkgPj0gMCkgeworICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBtU3RyZWFtVHlwZUJ5RVNJRC52YWx1ZUF0KHN0cmVhbVR5cGVJbmRleCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChzdHJlYW1faWQgJiB+MHgxZikgPT0gMHhjMCkgeworICAgICAgICAgICAgICAgIC8vIElTTy9JRUMgMTM4MTgtMyBvciBJU08vSUVDIDExMTcyLTMgb3IgSVNPL0lFQyAxMzgxOC03CisgICAgICAgICAgICAgICAgLy8gb3IgSVNPL0lFQyAxNDQ5Ni0zIGF1ZGlvCisgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IEFUU1BhcnNlcjo6U1RSRUFNVFlQRV9NUEVHMl9BVURJTzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKHN0cmVhbV9pZCAmIH4weDBmKSA9PSAweGUwKSB7CisgICAgICAgICAgICAgICAgLy8gSVNPL0lFQyAxMzgxOC0yIG9yIElTTy9JRUMgMTExNzItMiBvciBJU08vSUVDIDE0NDk2LTIgdmlkZW8KKyAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gQVRTUGFyc2VyOjpTVFJFQU1UWVBFX01QRUcyX1ZJREVPOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gQVRTUGFyc2VyOjpTVFJFQU1UWVBFX1JFU0VSVkVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbmRleCA9IG1UcmFja3MuYWRkKAorICAgICAgICAgICAgICAgICAgICBzdHJlYW1faWQsIG5ldyBUcmFjayh0aGlzLCBzdHJlYW1faWQsIHN0cmVhbVR5cGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworCisgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICBlcnIgPQorICAgICAgICAgICAgICAgIG1UcmFja3MuZWRpdFZhbHVlQXQoaW5kZXgpLT5hcHBlbmRQRVNEYXRhKAorICAgICAgICAgICAgICAgICAgICBQVFNfRFRTX2ZsYWdzLCBQVFMsIERUUywgYnIuZGF0YSgpLCBkYXRhTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIGJyLnNraXBCaXRzKGRhdGFMZW5ndGggKiA4KTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChzdHJlYW1faWQgPT0gMHhiZSkgeyAgLy8gcGFkZGluZ19zdHJlYW0KKyAgICAgICAgaWYgKFBFU19wYWNrZXRfbGVuZ3RoID09IDB1KSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIGJyLnNraXBCaXRzKFBFU19wYWNrZXRfbGVuZ3RoICogOCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKFBFU19wYWNrZXRfbGVuZ3RoID09IDB1KSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIGJyLnNraXBCaXRzKFBFU19wYWNrZXRfbGVuZ3RoICogOCk7CisgICAgfQorCisgICAgcmV0dXJuIG47Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK01QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjpUcmFjaygKKyAgICAgICAgTVBFRzJQU0V4dHJhY3RvciAqZXh0cmFjdG9yLCB1bnNpZ25lZCBzdHJlYW1faWQsIHVuc2lnbmVkIHN0cmVhbV90eXBlKQorICAgIDogbUV4dHJhY3RvcihleHRyYWN0b3IpLAorICAgICAgbVN0cmVhbUlEKHN0cmVhbV9pZCksCisgICAgICBtU3RyZWFtVHlwZShzdHJlYW1fdHlwZSksCisgICAgICBtUXVldWUoTlVMTCkgeworICAgIGJvb2wgc3VwcG9ydGVkID0gdHJ1ZTsKKyAgICBFbGVtZW50YXJ5U3RyZWFtUXVldWU6Ok1vZGUgbW9kZTsKKworICAgIHN3aXRjaCAobVN0cmVhbVR5cGUpIHsKKyAgICAgICAgY2FzZSBBVFNQYXJzZXI6OlNUUkVBTVRZUEVfSDI2NDoKKyAgICAgICAgICAgIG1vZGUgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OkgyNjQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVFNQYXJzZXI6OlNUUkVBTVRZUEVfTVBFRzJfQVVESU9fQURUUzoKKyAgICAgICAgICAgIG1vZGUgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OkFBQzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFUU1BhcnNlcjo6U1RSRUFNVFlQRV9NUEVHMV9BVURJTzoKKyAgICAgICAgY2FzZSBBVFNQYXJzZXI6OlNUUkVBTVRZUEVfTVBFRzJfQVVESU86CisgICAgICAgICAgICBtb2RlID0gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpNUEVHX0FVRElPOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBVFNQYXJzZXI6OlNUUkVBTVRZUEVfTVBFRzFfVklERU86CisgICAgICAgIGNhc2UgQVRTUGFyc2VyOjpTVFJFQU1UWVBFX01QRUcyX1ZJREVPOgorICAgICAgICAgICAgbW9kZSA9IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6TVBFR19WSURFTzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVRTUGFyc2VyOjpTVFJFQU1UWVBFX01QRUc0X1ZJREVPOgorICAgICAgICAgICAgbW9kZSA9IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6TVBFRzRfVklERU87CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoc3VwcG9ydGVkKSB7CisgICAgICAgIG1RdWV1ZSA9IG5ldyBFbGVtZW50YXJ5U3RyZWFtUXVldWUobW9kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0koInVuc3VwcG9ydGVkIHN0cmVhbSBJRCAweCUwMngiLCBzdHJlYW1faWQpOworICAgIH0KK30KKworTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6On5UcmFjaygpIHsKKyAgICBkZWxldGUgbVF1ZXVlOworICAgIG1RdWV1ZSA9IE5VTEw7Cit9CisKK3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjpzdGFydChNZXRhRGF0YUJhc2UgKikgeworICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgcmV0dXJuIG1Tb3VyY2UtPnN0YXJ0KE5VTEwpOyAvLyBBbm90aGVyUGFja2V0U291cmNlOjpzdGFydCBkb2Vzbid0IHVzZSBpdHMgYXJndW1lbnQKK30KKworc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OnN0b3AoKSB7CisgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICByZXR1cm4gbVNvdXJjZS0+c3RvcCgpOworfQorCitzdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgeworICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgc3A8TWV0YURhdGE+IHNvdXJjZU1ldGEgPSBtU291cmNlLT5nZXRGb3JtYXQoKTsKKyAgICBtZXRhID0gKnNvdXJjZU1ldGE7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgc3RhdHVzX3QgZmluYWxSZXN1bHQ7CisgICAgd2hpbGUgKCFtU291cmNlLT5oYXNCdWZmZXJBdmFpbGFibGUoJmZpbmFsUmVzdWx0KSkgeworICAgICAgICBpZiAoZmluYWxSZXN1bHQgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+ZmVlZE1vcmUoKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBtU291cmNlLT5zaWduYWxFT1MoZXJyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtU291cmNlLT5yZWFkKGJ1ZmZlciwgb3B0aW9ucyk7Cit9CisKK3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjphcHBlbmRQRVNEYXRhKAorICAgICAgICB1bnNpZ25lZCBQVFNfRFRTX2ZsYWdzLAorICAgICAgICB1aW50NjRfdCBQVFMsIHVpbnQ2NF90IC8qIERUUyAqLywKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAobVF1ZXVlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGludDY0X3QgdGltZVVzOworICAgIGlmIChQVFNfRFRTX2ZsYWdzID09IDIgfHwgUFRTX0RUU19mbGFncyA9PSAzKSB7CisgICAgICAgIHRpbWVVcyA9IChQVFMgKiAxMDApIC8gOTsKKyAgICB9IGVsc2UgeworICAgICAgICB0aW1lVXMgPSAwOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IG1RdWV1ZS0+YXBwZW5kRGF0YShkYXRhLCBzaXplLCB0aW1lVXMpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQ7CisgICAgd2hpbGUgKChhY2Nlc3NVbml0ID0gbVF1ZXVlLT5kZXF1ZXVlQWNjZXNzVW5pdCgpKSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVF1ZXVlLT5nZXRGb3JtYXQoKTsKKworICAgICAgICAgICAgaWYgKG1ldGEgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJTdHJlYW0gSUQgMHglMDJ4IG5vdyBoYXMgZGF0YS4iLCBtU3RyZWFtSUQpOworCisgICAgICAgICAgICAgICAgbVNvdXJjZSA9IG5ldyBBbm90aGVyUGFja2V0U291cmNlKG1ldGEpOworICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtUXVldWUtPmdldEZvcm1hdCgpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1Tb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpXcmFwcGVkVHJhY2soCisgICAgICAgIE1QRUcyUFNFeHRyYWN0b3IgKmV4dHJhY3RvciwgY29uc3Qgc3A8VHJhY2s+ICZ0cmFjaykKKyAgICA6IG1FeHRyYWN0b3IoZXh0cmFjdG9yKSwKKyAgICAgIG1UcmFjayh0cmFjaykgeworfQorCitNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6On5XcmFwcGVkVHJhY2soKSB7Cit9CisKK3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6c3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMpIHsKKyAgICByZXR1cm4gbVRyYWNrLT5zdGFydChwYXJhbXMpOworfQorCitzdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6OnN0b3AoKSB7CisgICAgcmV0dXJuIG1UcmFjay0+c3RvcCgpOworfQorCitzdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKKyAgICByZXR1cm4gbVRyYWNrLT5nZXRGb3JtYXQobWV0YSk7Cit9CisKK3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgIHJldHVybiBtVHJhY2stPnJlYWQoYnVmZmVyLCBvcHRpb25zKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworYm9vbCBTbmlmZk1QRUcyUFMoCisgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CisgICAgdWludDhfdCBoZWFkZXJbNV07CisgICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChtZW1jbXAoIlx4MDBceDAwXHgwMVx4YmEiLCBoZWFkZXIsIDQpIHx8IChoZWFkZXJbNF0gPj4gNikgIT0gMSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKmNvbmZpZGVuY2UgPSAwLjI1ZjsgIC8vIFNsaWdodGx5IGxhcmdlciB0aGFuIC5tcDMgZXh0cmFjdG9yJ3MgY29uZmlkZW5jZQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJQU0V4dHJhY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOWRhZDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuaApAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNUEVHMl9QU19FWFRSQUNUT1JfSF8KKworI2RlZmluZSBNUEVHMl9QU19FWFRSQUNUT1JfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBQnVmZmVyOworc3RydWN0IEFNZXNzYWdlOworc3RydWN0IFRyYWNrOworY2xhc3MgU3RyaW5nODsKKworc3RydWN0IE1QRUcyUFNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworICAgIGV4cGxpY2l0IE1QRUcyUFNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CisKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOworICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1QRUcyUFNFeHRyYWN0b3IiOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5NUEVHMlBTRXh0cmFjdG9yKCk7CisKK3ByaXZhdGU6CisgICAgc3RydWN0IFRyYWNrOworICAgIHN0cnVjdCBXcmFwcGVkVHJhY2s7CisKKyAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOworICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKworICAgIG9mZjY0X3QgbU9mZnNldDsKKyAgICBzdGF0dXNfdCBtRmluYWxSZXN1bHQ7CisgICAgc3A8QUJ1ZmZlcj4gbUJ1ZmZlcjsKKyAgICBLZXllZFZlY3Rvcjx1bnNpZ25lZCwgc3A8VHJhY2s+ID4gbVRyYWNrczsKKyAgICBib29sIG1TY2FubmluZzsKKworICAgIGJvb2wgbVByb2dyYW1TdHJlYW1NYXBWYWxpZDsKKyAgICBLZXllZFZlY3Rvcjx1bnNpZ25lZCwgdW5zaWduZWQ+IG1TdHJlYW1UeXBlQnlFU0lEOworCisgICAgc3RhdHVzX3QgZmVlZE1vcmUoKTsKKworICAgIHN0YXR1c190IGRlcXVldWVDaHVuaygpOworICAgIHNzaXplX3QgZGVxdWV1ZVBhY2soKTsKKyAgICBzc2l6ZV90IGRlcXVldWVTeXN0ZW1IZWFkZXIoKTsKKyAgICBzc2l6ZV90IGRlcXVldWVQRVMoKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1QRUcyUFNFeHRyYWN0b3IpOworfTsKKworYm9vbCBTbmlmZk1QRUcyUFMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1QRUcyX1BTX0VYVFJBQ1RPUl9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODNmN2NlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmNwcApAQCAtMCwwICsxLDY2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTVBFRzJUU0V4dHJhY3RvciIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJNUEVHMlRTRXh0cmFjdG9yLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lTdHJlYW1Tb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFLZXlzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgIm1wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oIgorI2luY2x1ZGUgIm1wZWcydHMvQVRTUGFyc2VyLmgiCisKKyNpbmNsdWRlIDxoaWRsL0h5YnJpZEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzLzEuMC9JQ2FzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgaGFyZHdhcmU6OmNhczo6VjFfMDo6SUNhczsKKworc3RhdGljIGNvbnN0IHNpemVfdCBrVFNQYWNrZXRTaXplID0gMTg4Oworc3RhdGljIGNvbnN0IGludCBrTWF4RHVyYXRpb25SZWFkU2l6ZSA9IDI1MDAwMExMOworc3RhdGljIGNvbnN0IGludCBrTWF4RHVyYXRpb25SZXRyeSA9IDY7CisKK3N0cnVjdCBNUEVHMlRTU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworICAgIE1QRUcyVFNTb3VyY2UoCisgICAgICAgICAgICBNUEVHMlRTRXh0cmFjdG9yICpleHRyYWN0b3IsCisgICAgICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCwKKyAgICAgICAgICAgIGJvb2wgZG9lc1NlZWspOworICAgIHZpcnR1YWwgfk1QRUcyVFNTb3VyY2UoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJik7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisKK3ByaXZhdGU6CisgICAgTVBFRzJUU0V4dHJhY3RvciAqbUV4dHJhY3RvcjsKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBtSW1wbDsKKworICAgIC8vIElmIHRoZXJlIGFyZSBib3RoIGF1ZGlvIGFuZCB2aWRlbyBzdHJlYW1zLCBvbmx5IHRoZSB2aWRlbyBzdHJlYW0KKyAgICAvLyB3aWxsIHNpZ25hbCBzZWVrIG9uIHRoZSBleHRyYWN0b3I7IG90aGVyd2lzZSB0aGUgc2luZ2xlIHN0cmVhbSB3aWxsIHNlZWsuCisgICAgYm9vbCBtRG9lc1NlZWs7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNUEVHMlRTU291cmNlKTsKK307CisKK01QRUcyVFNTb3VyY2U6Ok1QRUcyVFNTb3VyY2UoCisgICAgICAgIE1QRUcyVFNFeHRyYWN0b3IgKmV4dHJhY3RvciwKKyAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwsCisgICAgICAgIGJvb2wgZG9lc1NlZWspCisgICAgOiBtRXh0cmFjdG9yKGV4dHJhY3RvciksCisgICAgICBtSW1wbChpbXBsKSwKKyAgICAgIG1Eb2VzU2Vlayhkb2VzU2VlaykgeworfQorCitNUEVHMlRTU291cmNlOjp+TVBFRzJUU1NvdXJjZSgpIHsKK30KKworc3RhdHVzX3QgTVBFRzJUU1NvdXJjZTo6c3RhcnQoTWV0YURhdGFCYXNlICopIHsKKyAgICByZXR1cm4gbUltcGwtPnN0YXJ0KE5VTEwpOyAvLyBBbm90aGVyUGFja2V0U291cmNlOjpzdGFydCgpIGRvZXNuJ3QgdXNlIGl0cyBhcmd1bWVudAorfQorCitzdGF0dXNfdCBNUEVHMlRTU291cmNlOjpzdG9wKCkgeworICAgIHJldHVybiBtSW1wbC0+c3RvcCgpOworfQorCitzdGF0dXNfdCBNUEVHMlRTU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7CisgICAgc3A8TWV0YURhdGE+IGltcGxNZXRhID0gbUltcGwtPmdldEZvcm1hdCgpOworICAgIG1ldGEgPSAqaW1wbE1ldGE7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUEVHMlRTU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgKm91dCA9IE5VTEw7CisKKyAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CisgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIHNlZWtNb2RlOworICAgIGlmIChtRG9lc1NlZWsgJiYgb3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZzZWVrTW9kZSkpIHsKKyAgICAgICAgLy8gc2VlayBpcyBuZWVkZWQKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+c2VlayhzZWVrVGltZVVzLCBzZWVrTW9kZSk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobUV4dHJhY3Rvci0+ZmVlZFVudGlsQnVmZmVyQXZhaWxhYmxlKG1JbXBsKSAhPSBPSykgeworICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9CisKKyAgICByZXR1cm4gbUltcGwtPnJlYWQob3V0LCBvcHRpb25zKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworTVBFRzJUU0V4dHJhY3Rvcjo6TVBFRzJUU0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKKyAgICAgIG1QYXJzZXIobmV3IEFUU1BhcnNlciksCisgICAgICBtTGFzdFN5bmNFdmVudCgwKSwKKyAgICAgIG1PZmZzZXQoMCkgeworICAgIGluaXQoKTsKK30KKworc2l6ZV90IE1QRUcyVFNFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgeworICAgIHJldHVybiBtU291cmNlSW1wbHMuc2l6ZSgpOworfQorCitNZWRpYVRyYWNrICpNUEVHMlRTRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKKyAgICBpZiAoaW5kZXggPj0gbVNvdXJjZUltcGxzLnNpemUoKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvLyBUaGUgc2VlayByZWZlcmVuY2UgdHJhY2sgKHZpZGVvIGlmIHByZXNlbnQ7IGF1ZGlvIG90aGVyd2lzZSkgcGVyZm9ybXMKKyAgICAvLyBzZWVrIHJlcXVlc3RzLCB3aGlsZSBvdGhlciB0cmFja3MgaWdub3JlIHJlcXVlc3RzLgorICAgIHJldHVybiBuZXcgTVBFRzJUU1NvdXJjZSh0aGlzLCBtU291cmNlSW1wbHMuZWRpdEl0ZW1BdChpbmRleCksCisgICAgICAgICAgICAobVNlZWtTeW5jUG9pbnRzID09ICZtU3luY1BvaW50cy5lZGl0SXRlbUF0KGluZGV4KSkpOworfQorCitzdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKKyAgICBzcDxNZXRhRGF0YT4gaW1wbE1ldGEgPSBpbmRleCA8IG1Tb3VyY2VJbXBscy5zaXplKCkKKyAgICAgICAgPyBtU291cmNlSW1wbHMuZWRpdEl0ZW1BdChpbmRleCktPmdldEZvcm1hdCgpIDogTlVMTDsKKyAgICBpZiAoaW1wbE1ldGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgbWV0YSA9ICppbXBsTWV0YTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgeworICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlRTKTsKKworICAgIHJldHVybiBPSzsKK30KKworLy9zdGF0aWMKK2Jvb2wgTVBFRzJUU0V4dHJhY3Rvcjo6aXNTY3JhbWJsZWRGb3JtYXQoTWV0YURhdGFCYXNlICZmb3JtYXQpIHsKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIHJldHVybiBmb3JtYXQuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkKKyAgICAgICAgICAgICYmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19TQ1JBTUJMRUQsIG1pbWUpCisgICAgICAgICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX1NDUkFNQkxFRCwgbWltZSkpOworfQorCitzdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiBjYXNUb2tlbiwgc2l6ZV90IHNpemUpIHsKKyAgICBIYWxUb2tlbiBoYWxUb2tlbjsKKyAgICBoYWxUb2tlbi5zZXRUb0V4dGVybmFsKCh1aW50OF90KiljYXNUb2tlbiwgc2l6ZSk7CisgICAgc3A8SUNhcz4gY2FzID0gSUNhczo6Y2FzdEZyb20ocmV0cmlldmVIYWxJbnRlcmZhY2UoaGFsVG9rZW4pKTsKKyAgICBBTE9HRCgic2V0TWVkaWFDYXM6ICVwIiwgY2FzLmdldCgpKTsKKworICAgIHN0YXR1c190IGVyciA9IG1QYXJzZXItPnNldE1lZGlhQ2FzKGNhcyk7CisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBBTE9HSSgiQWxsIHRyYWNrcyBub3cgaGF2ZSBkZXNjcmFtYmxlcnMiKTsKKyAgICAgICAgaW5pdCgpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCit2b2lkIE1QRUcyVFNFeHRyYWN0b3I6OmFkZFNvdXJjZShjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCkgeworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Tb3VyY2VJbXBscy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobVNvdXJjZUltcGxzW2ldID09IGltcGwpIHsKKyAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgbVNvdXJjZUltcGxzLnB1c2goaW1wbCk7CisgICAgfQorfQorCit2b2lkIE1QRUcyVFNFeHRyYWN0b3I6OmluaXQoKSB7CisgICAgYm9vbCBoYXZlQXVkaW8gPSBmYWxzZTsKKyAgICBib29sIGhhdmVWaWRlbyA9IGZhbHNlOworICAgIGludDY0X3Qgc3RhcnRUaW1lID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKworICAgIHN0YXR1c190IGVycjsKKyAgICB3aGlsZSAoKGVyciA9IGZlZWRNb3JlKHRydWUgLyogaXNJbml0ICovKSkgPT0gT0sKKyAgICAgICAgICAgIHx8IGVyciA9PSBFUlJPUl9EUk1fREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRCkgeworICAgICAgICBpZiAoaGF2ZUF1ZGlvICYmIGhhdmVWaWRlbykgeworICAgICAgICAgICAgYWRkU3luY1BvaW50X2wobUxhc3RTeW5jRXZlbnQpOworICAgICAgICAgICAgbUxhc3RTeW5jRXZlbnQucmVzZXQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICghaGF2ZVZpZGVvKSB7CisgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBpbXBsID0gbVBhcnNlci0+Z2V0U291cmNlKEFUU1BhcnNlcjo6VklERU8pOworCisgICAgICAgICAgICBpZiAoaW1wbCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IGltcGwtPmdldEZvcm1hdCgpOworICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBoYXZlVmlkZW8gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBhZGRTb3VyY2UoaW1wbCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNTY3JhbWJsZWRGb3JtYXQoKihmb3JtYXQuZ2V0KCkpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN5bmNQb2ludHMucHVzaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbVNlZWtTeW5jUG9pbnRzID0gJm1TeW5jUG9pbnRzLmVkaXRUb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghaGF2ZUF1ZGlvKSB7CisgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBpbXBsID0gbVBhcnNlci0+Z2V0U291cmNlKEFUU1BhcnNlcjo6QVVESU8pOworCisgICAgICAgICAgICBpZiAoaW1wbCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IGltcGwtPmdldEZvcm1hdCgpOworICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBoYXZlQXVkaW8gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBhZGRTb3VyY2UoaW1wbCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNTY3JhbWJsZWRGb3JtYXQoKihmb3JtYXQuZ2V0KCkpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN5bmNQb2ludHMucHVzaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXZlVmlkZW8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vla1N5bmNQb2ludHMgPSAmbVN5bmNQb2ludHMuZWRpdFRvcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYWRkU3luY1BvaW50X2wobUxhc3RTeW5jRXZlbnQpOworICAgICAgICBtTGFzdFN5bmNFdmVudC5yZXNldCgpOworCisgICAgICAgIC8vIEVSUk9SX0RSTV9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVEIGlzIHJldHVybmVkIHdoZW4gdGhlIG1wZWcydHMKKyAgICAgICAgLy8gaXMgc2NyYW1ibGVkIGJ1dCB3ZSBkb24ndCBoYXZlIGEgTWVkaWFDYXMgb2JqZWN0IHNldC4gVGhlIGV4dHJhY3Rpb24KKyAgICAgICAgLy8gd2lsbCBvbmx5IGNvbnRpbnVlIHdoZW4gc2V0TWVkaWFDYXMoKSBpcyBjYWxsZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAgICBpZiAoZXJyID09IEVSUk9SX0RSTV9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVEKSB7CisgICAgICAgICAgICBBTE9HSSgic3RvcHBlZCBwYXJzaW5nIHNjcmFtYmxlZCBjb250ZW50LCAiCisgICAgICAgICAgICAgICAgICAiaGF2ZUF1ZGlvPSVkLCBoYXZlVmlkZW89JWQsIGVsYXNwZWRUaW1lPSUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICAgICAgaGF2ZUF1ZGlvLCBoYXZlVmlkZW8sIEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gV2FpdCBvbmx5IGZvciAyIHNlY29uZHMgdG8gZGV0ZWN0IGF1ZGlvL3ZpZGVvIHN0cmVhbXMuCisgICAgICAgIGlmIChBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lID4gMjAwMDAwMGxsKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIG9mZjY0X3Qgc2l6ZTsKKyAgICBpZiAobURhdGFTb3VyY2UtPmdldFNpemUoJnNpemUpID09IE9LICYmIChoYXZlQXVkaW8gfHwgaGF2ZVZpZGVvKSkgeworICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBpbXBsID0gaGF2ZVZpZGVvCisgICAgICAgICAgICAgICAgPyBtUGFyc2VyLT5nZXRTb3VyY2UoQVRTUGFyc2VyOjpWSURFTykKKyAgICAgICAgICAgICAgICA6IG1QYXJzZXItPmdldFNvdXJjZShBVFNQYXJzZXI6OkFVRElPKTsKKyAgICAgICAgc2l6ZV90IHByZXZTeW5jU2l6ZSA9IDE7CisgICAgICAgIGludDY0X3QgZHVyYXRpb25VcyA9IC0xOworICAgICAgICBMaXN0PGludDY0X3Q+IGR1cmF0aW9uczsKKyAgICAgICAgLy8gRXN0aW1hdGUgZHVyYXRpb24gLS0tIHN0YWJpbGl6ZSB1bnRpbCB5b3UgZ2V0IDw1MDBtcyBkZXZpYXRpb24uCisgICAgICAgIHdoaWxlIChmZWVkTW9yZSgpID09IE9LCisgICAgICAgICAgICAgICAgJiYgQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZSA8PSAyMDAwMDAwbGwpIHsKKyAgICAgICAgICAgIGlmIChtU2Vla1N5bmNQb2ludHMtPnNpemUoKSA+IHByZXZTeW5jU2l6ZSkgeworICAgICAgICAgICAgICAgIHByZXZTeW5jU2l6ZSA9IG1TZWVrU3luY1BvaW50cy0+c2l6ZSgpOworICAgICAgICAgICAgICAgIGludDY0X3QgZGlmZlVzID0gbVNlZWtTeW5jUG9pbnRzLT5rZXlBdChwcmV2U3luY1NpemUgLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgLSBtU2Vla1N5bmNQb2ludHMtPmtleUF0KDApOworICAgICAgICAgICAgICAgIG9mZjY0X3QgZGlmZk9mZnNldCA9IG1TZWVrU3luY1BvaW50cy0+dmFsdWVBdChwcmV2U3luY1NpemUgLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgLSBtU2Vla1N5bmNQb2ludHMtPnZhbHVlQXQoMCk7CisgICAgICAgICAgICAgICAgaW50NjRfdCBjdXJyZW50RHVyYXRpb25VcyA9IHNpemUgKiBkaWZmVXMgLyBkaWZmT2Zmc2V0OworICAgICAgICAgICAgICAgIGR1cmF0aW9ucy5wdXNoX2JhY2soY3VycmVudER1cmF0aW9uVXMpOworICAgICAgICAgICAgICAgIGlmIChkdXJhdGlvbnMuc2l6ZSgpID4gNSkgeworICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbnMuZXJhc2UoZHVyYXRpb25zLmJlZ2luKCkpOworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG1pbiA9ICpkdXJhdGlvbnMuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBtYXggPSAqZHVyYXRpb25zLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoYXV0byBkdXJhdGlvbiA6IGR1cmF0aW9ucykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pbiA+IGR1cmF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluID0gZHVyYXRpb247CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF4IDwgZHVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXggPSBkdXJhdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobWF4IC0gbWluIDwgNTAwICogMTAwMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25VcyA9IGN1cnJlbnREdXJhdGlvblVzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICBpbnQ2NF90IGJ1ZmZlcmVkRHVyYXRpb25VczsKKyAgICAgICAgYnVmZmVyZWREdXJhdGlvblVzID0gaW1wbC0+Z2V0QnVmZmVyZWREdXJhdGlvblVzKCZlcnIpOworICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIGR1cmF0aW9uVXMgPSBidWZmZXJlZER1cmF0aW9uVXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGR1cmF0aW9uVXMgPiAwKSB7CisgICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gbWV0YSA9IGltcGwtPmdldEZvcm1hdCgpOworICAgICAgICAgICAgbWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKKyAgICAgICAgICAgIGltcGwtPnNldEZvcm1hdChtZXRhKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVzdGltYXRlRHVyYXRpb25zRnJvbVRpbWVzVXNBdEVuZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR0koImhhdmVBdWRpbz0lZCwgaGF2ZVZpZGVvPSVkLCBlbGFzcGVkVGltZT0lIiBQUklkNjQsCisgICAgICAgICAgICBoYXZlQXVkaW8sIGhhdmVWaWRlbywgQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZSk7Cit9CisKK3N0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OmZlZWRNb3JlKGJvb2wgaXNJbml0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIHVpbnQ4X3QgcGFja2V0W2tUU1BhY2tldFNpemVdOworICAgIHNzaXplX3QgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQobU9mZnNldCwgcGFja2V0LCBrVFNQYWNrZXRTaXplKTsKKworICAgIGlmIChuIDwgKHNzaXplX3Qpa1RTUGFja2V0U2l6ZSkgeworICAgICAgICBpZiAobiA+PSAwKSB7CisgICAgICAgICAgICBtUGFyc2VyLT5zaWduYWxFT1MoRVJST1JfRU5EX09GX1NUUkVBTSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChuIDwgMCkgPyAoc3RhdHVzX3QpbiA6IEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgfQorCisgICAgQVRTUGFyc2VyOjpTeW5jRXZlbnQgZXZlbnQobU9mZnNldCk7CisgICAgbU9mZnNldCArPSBuOworICAgIHN0YXR1c190IGVyciA9IG1QYXJzZXItPmZlZWRUU1BhY2tldChwYWNrZXQsIGtUU1BhY2tldFNpemUsICZldmVudCk7CisgICAgaWYgKGV2ZW50Lmhhc1JldHVybmVkRGF0YSgpKSB7CisgICAgICAgIGlmIChpc0luaXQpIHsKKyAgICAgICAgICAgIG1MYXN0U3luY0V2ZW50ID0gZXZlbnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZGRTeW5jUG9pbnRfbChldmVudCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKwordm9pZCBNUEVHMlRTRXh0cmFjdG9yOjphZGRTeW5jUG9pbnRfbChjb25zdCBBVFNQYXJzZXI6OlN5bmNFdmVudCAmZXZlbnQpIHsKKyAgICBpZiAoIWV2ZW50Lmhhc1JldHVybmVkRGF0YSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Tb3VyY2VJbXBscy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAobVNvdXJjZUltcGxzW2ldLmdldCgpID09IGV2ZW50LmdldE1lZGlhU291cmNlKCkuZ2V0KCkpIHsKKyAgICAgICAgICAgIEtleWVkVmVjdG9yPGludDY0X3QsIG9mZjY0X3Q+ICpzeW5jUG9pbnRzID0gJm1TeW5jUG9pbnRzLmVkaXRJdGVtQXQoaSk7CisgICAgICAgICAgICBzeW5jUG9pbnRzLT5hZGQoZXZlbnQuZ2V0VGltZVVzKCksIGV2ZW50LmdldE9mZnNldCgpKTsKKyAgICAgICAgICAgIC8vIFdlJ3JlIGtlZXBpbmcgdGhlIHNpemUgb2YgdGhlIHN5bmMgcG9pbnRzIGF0IG1vc3QgNW1iIHBlciBhIHRyYWNrLgorICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBzeW5jUG9pbnRzLT5zaXplKCk7CisgICAgICAgICAgICBpZiAoc2l6ZSA+PSAzMjc2ODApIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGZpcnN0VGltZVVzID0gc3luY1BvaW50cy0+a2V5QXQoMCk7CisgICAgICAgICAgICAgICAgaW50NjRfdCBsYXN0VGltZVVzID0gc3luY1BvaW50cy0+a2V5QXQoc2l6ZSAtIDEpOworICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRUaW1lVXMoKSAtIGZpcnN0VGltZVVzID4gbGFzdFRpbWVVcyAtIGV2ZW50LmdldFRpbWVVcygpKSB7CisgICAgICAgICAgICAgICAgICAgIHN5bmNQb2ludHMtPnJlbW92ZUl0ZW1zQXQoMCwgNDA5Nik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3luY1BvaW50cy0+cmVtb3ZlSXRlbXNBdChzaXplIC0gNDA5NiwgNDA5Nik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OmVzdGltYXRlRHVyYXRpb25zRnJvbVRpbWVzVXNBdEVuZCgpICB7CisgICAgaWYgKCEobURhdGFTb3VyY2UtPmZsYWdzKCkgJiBEYXRhU291cmNlQmFzZTo6a0lzTG9jYWxGaWxlU291cmNlKSkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgb2ZmNjRfdCBzaXplID0gMDsKKyAgICBzdGF0dXNfdCBlcnIgPSBtRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHVpbnQ4X3QgcGFja2V0W2tUU1BhY2tldFNpemVdOworICAgIGNvbnN0IG9mZjY0X3QgemVybyA9IDA7CisgICAgb2ZmNjRfdCBvZmZzZXQgPSBtYXgoemVybywgc2l6ZSAtIGtNYXhEdXJhdGlvblJlYWRTaXplKTsKKyAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsICZwYWNrZXQsIDApIDwgMCkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorCisgICAgaW50IHJldHJ5ID0gMDsKKyAgICBib29sIGFsbER1cmF0aW9uc0ZvdW5kID0gZmFsc2U7CisgICAgaW50NjRfdCB0aW1lQW5jaG9yVXMgPSBtUGFyc2VyLT5nZXRGaXJzdFBUU1RpbWVVcygpOworICAgIGRvIHsKKyAgICAgICAgaW50IGJ5dGVzUmVhZCA9IDA7CisgICAgICAgIHNwPEFUU1BhcnNlcj4gcGFyc2VyID0gbmV3IEFUU1BhcnNlcihBVFNQYXJzZXI6OlRTX1RJTUVTVEFNUFNfQVJFX0FCU09MVVRFKTsKKyAgICAgICAgQVRTUGFyc2VyOjpTeW5jRXZlbnQgZXYoMCk7CisgICAgICAgIG9mZnNldCA9IG1heCh6ZXJvLCBzaXplIC0gKGtNYXhEdXJhdGlvblJlYWRTaXplIDw8IHJldHJ5KSk7CisgICAgICAgIG9mZnNldCA9IChvZmZzZXQgLyBrVFNQYWNrZXRTaXplKSAqIGtUU1BhY2tldFNpemU7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIGlmIChieXRlc1JlYWQgPj0ga01heER1cmF0aW9uUmVhZFNpemUgPDwgbWF4KDAsIHJldHJ5IC0gMSkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3NpemVfdCBuID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIHBhY2tldCwga1RTUGFja2V0U2l6ZSk7CisgICAgICAgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobiA8IChzc2l6ZV90KWtUU1BhY2tldFNpemUpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb2Zmc2V0ICs9IGtUU1BhY2tldFNpemU7CisgICAgICAgICAgICBieXRlc1JlYWQgKz0ga1RTUGFja2V0U2l6ZTsKKyAgICAgICAgICAgIGVyciA9IHBhcnNlci0+ZmVlZFRTUGFja2V0KHBhY2tldCwga1RTUGFja2V0U2l6ZSwgJmV2KTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZXYuaGFzUmV0dXJuZWREYXRhKCkpIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSBldi5nZXRUaW1lVXMoKTsKKyAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OlNvdXJjZVR5cGUgdHlwZSA9IGV2LmdldFR5cGUoKTsKKyAgICAgICAgICAgICAgICBldi5yZXNldCgpOworCisgICAgICAgICAgICAgICAgaW50NjRfdCBmaXJzdFRpbWVVczsKKyAgICAgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzcmMgPSBtUGFyc2VyLT5nZXRTb3VyY2UodHlwZSk7CisgICAgICAgICAgICAgICAgaWYgKHNyYyA9PSBOVUxMIHx8IHNyYy0+bmV4dEJ1ZmZlclRpbWUoJmZpcnN0VGltZVVzKSAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZHVyYXRpb25VcyArPSBzcmMtPmdldEVzdGltYXRlZEJ1ZmZlckR1cmF0aW9uVXMoKTsKKyAgICAgICAgICAgICAgICBkdXJhdGlvblVzIC09IHRpbWVBbmNob3JVczsKKyAgICAgICAgICAgICAgICBkdXJhdGlvblVzIC09IGZpcnN0VGltZVVzOworICAgICAgICAgICAgICAgIGlmIChkdXJhdGlvblVzID4gMCkgeworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG9yaWdEdXJhdGlvblVzLCBsYXN0RHVyYXRpb25VczsKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+IG1ldGEgPSBzcmMtPmdldEZvcm1hdCgpOworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBrS2V5TGFzdER1cmF0aW9uID0gJ2xkdXInOworICAgICAgICAgICAgICAgICAgICAvLyBSZXF1aXJlIHR3byBjb25zZWN1dGl2ZSBkdXJhdGlvbiBjYWxjdWxhdGlvbnMgdG8gYmUgd2l0aGluIDEgc2VjIGJlZm9yZQorICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGluZzsgdXNlIE1ldGFEYXRhIHRvIHN0b3JlIHByZXZpb3VzIGR1cmF0aW9uIGVzdGltYXRlIGluIHBlci1zdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgLy8gY29udGV4dC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtZXRhLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmb3JpZ0R1cmF0aW9uVXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIW1ldGEtPmZpbmRJbnQ2NChrS2V5TGFzdER1cmF0aW9uLCAmbGFzdER1cmF0aW9uVXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKG9yaWdEdXJhdGlvblVzIDwgZHVyYXRpb25VcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBhYnMoZHVyYXRpb25VcyAtIGxhc3REdXJhdGlvblVzKSA8IDYwMDAwMDAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5TGFzdER1cmF0aW9uLCBkdXJhdGlvblVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWFsbER1cmF0aW9uc0ZvdW5kKSB7CisgICAgICAgICAgICBhbGxEdXJhdGlvbnNGb3VuZCA9IHRydWU7CisgICAgICAgICAgICBmb3IgKGF1dG8gdDoge0FUU1BhcnNlcjo6VklERU8sIEFUU1BhcnNlcjo6QVVESU99KSB7CisgICAgICAgICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc3JjID0gbVBhcnNlci0+Z2V0U291cmNlKHQpOworICAgICAgICAgICAgICAgIGlmIChzcmMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgICAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiBtZXRhID0gc3JjLT5nZXRGb3JtYXQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvblVzKSkgeworICAgICAgICAgICAgICAgICAgICBhbGxEdXJhdGlvbnNGb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICArK3JldHJ5OworICAgIH0gd2hpbGUoIWFsbER1cmF0aW9uc0ZvdW5kICYmIG9mZnNldCA+IDAgJiYgcmV0cnkgPD0ga01heER1cmF0aW9uUmV0cnkpOworCisgICAgcmV0dXJuIGFsbER1cmF0aW9uc0ZvdW5kPyBPSyA6IEVSUk9SX1VOU1VQUE9SVEVEOworfQorCit1aW50MzJfdCBNUEVHMlRTRXh0cmFjdG9yOjpmbGFncygpIGNvbnN0IHsKKyAgICByZXR1cm4gQ0FOX1BBVVNFIHwgQ0FOX1NFRUtfQkFDS1dBUkQgfCBDQU5fU0VFS19GT1JXQVJEOworfQorCitzdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpzZWVrKGludDY0X3Qgc2Vla1RpbWVVcywKKyAgICAgICAgY29uc3QgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlICZzZWVrTW9kZSkgeworICAgIGlmIChtU2Vla1N5bmNQb2ludHMgPT0gTlVMTCB8fCBtU2Vla1N5bmNQb2ludHMtPmlzRW1wdHkoKSkgeworICAgICAgICBBTE9HVygiTm8gc3luYyBwb2ludCB0byBzZWVrIHRvLiIpOworICAgICAgICAvLyAuLi4gYW5kIHRoZXJlZm9yZSB3ZSBoYXZlIG5vdGhpbmcgdXNlZnVsIHRvIGRvIGhlcmUuCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICAvLyBEZXRlcm1pbmUgd2hldGhlciB3ZSdyZSBzZWVraW5nIGJleW9uZCB0aGUga25vd24gYXJlYS4KKyAgICBib29sIHNob3VsZFNlZWtCZXlvbmQgPQorICAgICAgICAgICAgKHNlZWtUaW1lVXMgPiBtU2Vla1N5bmNQb2ludHMtPmtleUF0KG1TZWVrU3luY1BvaW50cy0+c2l6ZSgpIC0gMSkpOworCisgICAgLy8gRGV0ZXJtaW5lIHRoZSBzeW5jIHBvaW50IHRvIHNlZWsuCisgICAgc2l6ZV90IGluZGV4ID0gMDsKKyAgICBmb3IgKDsgaW5kZXggPCBtU2Vla1N5bmNQb2ludHMtPnNpemUoKTsgKytpbmRleCkgeworICAgICAgICBpbnQ2NF90IHRpbWVVcyA9IG1TZWVrU3luY1BvaW50cy0+a2V5QXQoaW5kZXgpOworICAgICAgICBpZiAodGltZVVzID4gc2Vla1RpbWVVcykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2ggKHNlZWtNb2RlKSB7CisgICAgICAgIGNhc2UgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OlNFRUtfTkVYVF9TWU5DOgorICAgICAgICAgICAgaWYgKGluZGV4ID09IG1TZWVrU3luY1BvaW50cy0+c2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIk5leHQgc3luYyBub3QgZm91bmQ7IHN0YXJ0aW5nIGZyb20gdGhlIGxhdGVzdCBzeW5jLiIpOworICAgICAgICAgICAgICAgIC0taW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkM6CisgICAgICAgIGNhc2UgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVDoKKyAgICAgICAgICAgIEFMT0dXKCJzZWVrTW9kZSBub3Qgc3VwcG9ydGVkOiAlZDsgZmFsbGluZyBiYWNrIHRvIFBSRVZJT1VTX1NZTkMiLAorICAgICAgICAgICAgICAgICAgICBzZWVrTW9kZSk7CisgICAgICAgICAgICAvLyBmYWxsLXRocm91Z2gKKyAgICAgICAgY2FzZSBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DOgorICAgICAgICAgICAgaWYgKGluZGV4ID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiUHJldmlvdXMgc3luYyBub3QgZm91bmQ7IHN0YXJ0aW5nIGZyb20gdGhlIGVhcmxpZXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzeW5jLiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAtLWluZGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorICAgIGlmICghc2hvdWxkU2Vla0JleW9uZCB8fCBtT2Zmc2V0IDw9IG1TZWVrU3luY1BvaW50cy0+dmFsdWVBdChpbmRleCkpIHsKKyAgICAgICAgaW50NjRfdCBhY3R1YWxTZWVrVGltZVVzID0gbVNlZWtTeW5jUG9pbnRzLT5rZXlBdChpbmRleCk7CisgICAgICAgIG1PZmZzZXQgPSBtU2Vla1N5bmNQb2ludHMtPnZhbHVlQXQoaW5kZXgpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBxdWV1ZURpc2NvbnRpbnVpdHlGb3JTZWVrKGFjdHVhbFNlZWtUaW1lVXMpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNob3VsZFNlZWtCZXlvbmQpIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gc2Vla0JleW9uZChzZWVrVGltZVVzKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEZhc3QtZm9yd2FyZCB0byBzeW5jIGZyYW1lLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNvdXJjZUltcGxzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsID0gbVNvdXJjZUltcGxzW2ldOworICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgIGZlZWRVbnRpbEJ1ZmZlckF2YWlsYWJsZShpbXBsKTsKKyAgICAgICAgd2hpbGUgKGltcGwtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZXJyKSkgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1ldGEgPSBpbXBsLT5nZXRNZXRhQWZ0ZXJMYXN0RGVxdWV1ZWQoMCk7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgICAgICAgICBpZiAobWV0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQzMl90IHN5bmM7CisgICAgICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKCJpc1N5bmMiLCAmc3luYykgJiYgc3luYykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyID0gaW1wbC0+ZGVxdWV1ZUFjY2Vzc1VuaXQoJmJ1ZmZlcik7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZlZWRVbnRpbEJ1ZmZlckF2YWlsYWJsZShpbXBsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6cXVldWVEaXNjb250aW51aXR5Rm9yU2VlayhpbnQ2NF90IGFjdHVhbFNlZWtUaW1lVXMpIHsKKyAgICAvLyBTaWduYWwgZGlzY29udGludWl0eQorICAgIHNwPEFNZXNzYWdlPiBleHRyYShuZXcgQU1lc3NhZ2UpOworICAgIGV4dHJhLT5zZXRJbnQ2NChrQVRTUGFyc2VyS2V5TWVkaWFUaW1lVXMsIGFjdHVhbFNlZWtUaW1lVXMpOworICAgIG1QYXJzZXItPnNpZ25hbERpc2NvbnRpbnVpdHkoQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX1RJTUUsIGV4dHJhKTsKKworICAgIC8vIEFmdGVyIGRpc2NvbnRpbnVpdHksIGltcGwgc2hvdWxkIG9ubHkgaGF2ZSBkaXNjb250aW51aXRpZXMKKyAgICAvLyB3aXRoIHRoZSBsYXN0IGJlaW5nIHdoYXQgd2UgcXVldWVkLiBEZXF1ZXVlIHRoZW0gYWxsIGhlcmUuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU291cmNlSW1wbHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwgPSBtU291cmNlSW1wbHMuaXRlbUF0KGkpOworICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgd2hpbGUgKGltcGwtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZXJyKSkgeworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnIgPSBpbXBsLT5kZXF1ZXVlQWNjZXNzVW5pdCgmYnVmZmVyKTsKKyAgICAgICAgICAgIC8vIElmIHRoZSBzb3VyY2UgY29udGFpbnMgYW55dGhpbmcgYnV0IGRpc2NvbnRpbnVpdHksIHRoYXQncworICAgICAgICAgICAgLy8gYSBwcm9ncmFtbWluZyBtaXN0YWtlLgorICAgICAgICAgICAgQ0hFQ0soZXJyID09IElORk9fRElTQ09OVElOVUlUWSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGZWVkIHVudGlsIHdlIGhhdmUgYSBidWZmZXIgZm9yIGVhY2ggc291cmNlLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNvdXJjZUltcGxzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsID0gbVNvdXJjZUltcGxzLml0ZW1BdChpKTsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBmZWVkVW50aWxCdWZmZXJBdmFpbGFibGUoaW1wbCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OnNlZWtCZXlvbmQoaW50NjRfdCBzZWVrVGltZVVzKSB7CisgICAgLy8gSWYgd2UncmUgc2Vla2luZyBiZXlvbmQgd2hlcmUgd2Uga25vdyAtLS0gcmVhZCB1bnRpbCB3ZSByZWFjaCB0aGVyZS4KKyAgICBzaXplX3Qgc3luY1BvaW50c1NpemUgPSBtU2Vla1N5bmNQb2ludHMtPnNpemUoKTsKKworICAgIHdoaWxlIChzZWVrVGltZVVzID4gbVNlZWtTeW5jUG9pbnRzLT5rZXlBdCgKKyAgICAgICAgICAgIG1TZWVrU3luY1BvaW50cy0+c2l6ZSgpIC0gMSkpIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICBpZiAoc3luY1BvaW50c1NpemUgPCBtU2Vla1N5bmNQb2ludHMtPnNpemUoKSkgeworICAgICAgICAgICAgc3luY1BvaW50c1NpemUgPSBtU2Vla1N5bmNQb2ludHMtPnNpemUoKTsKKyAgICAgICAgICAgIGludDY0X3Qgc3luY1RpbWVVcyA9IG1TZWVrU3luY1BvaW50cy0+a2V5QXQoc3luY1BvaW50c1NpemUgLSAxKTsKKyAgICAgICAgICAgIC8vIERlcXVldWUgYnVmZmVycyBiZWZvcmUgc3luYyBwb2ludCBpbiBvcmRlciB0byBhdm9pZCB0b28gbXVjaAorICAgICAgICAgICAgLy8gY2FjaGUgYnVpbGRpbmcgdXAuCisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Tb3VyY2VJbXBscy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsID0gbVNvdXJjZUltcGxzW2ldOworICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICAgICAgICAgIHdoaWxlICgoZXJyID0gaW1wbC0+bmV4dEJ1ZmZlclRpbWUoJnRpbWVVcykpID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lVXMgPCBzeW5jVGltZVVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbXBsLT5kZXF1ZXVlQWNjZXNzVW5pdCgmYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0sgJiYgZXJyICE9IC1FV09VTERCTE9DSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZmVlZE1vcmUoKSAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OmZlZWRVbnRpbEJ1ZmZlckF2YWlsYWJsZSgKKyAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwpIHsKKyAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKKyAgICB3aGlsZSAoIWltcGwtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpKSB7CisgICAgICAgIGlmIChmaW5hbFJlc3VsdCAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGZpbmFsUmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gZmVlZE1vcmUoKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgaW1wbC0+c2lnbmFsRU9TKGVycik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitib29sIFNuaWZmTVBFRzJUUyhEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgKytpKSB7CisgICAgICAgIGNoYXIgaGVhZGVyOworICAgICAgICBpZiAoc291cmNlLT5yZWFkQXQoa1RTUGFja2V0U2l6ZSAqIGksICZoZWFkZXIsIDEpICE9IDEKKyAgICAgICAgICAgICAgICB8fCBoZWFkZXIgIT0gMHg0NykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgKmNvbmZpZGVuY2UgPSAwLjFmOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZGQzY2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuaApAQCAtMCwwICsxLDEwOCBAQAorLyoKKworICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNUEVHMl9UU19FWFRSQUNUT1JfSF8KKworI2RlZmluZSBNUEVHMl9UU19FWFRSQUNUT1JfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgIm1wZWcydHMvQVRTUGFyc2VyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFNZXNzYWdlOworc3RydWN0IEFub3RoZXJQYWNrZXRTb3VyY2U7CitzdHJ1Y3QgQVRTUGFyc2VyOworY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitzdHJ1Y3QgTVBFRzJUU1NvdXJjZTsKK2NsYXNzIFN0cmluZzg7CisKK3N0cnVjdCBNUEVHMlRTRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKKyAgICBleHBsaWNpdCBNUEVHMlRTRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworCisgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHVpbnQ4X3QqIC8qY2FzVG9rZW4qLywgc2l6ZV90IC8qc2l6ZSovKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1QRUcyVFNFeHRyYWN0b3IiOyB9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBNUEVHMlRTU291cmNlOworCisgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKKworICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKworICAgIHNwPEFUU1BhcnNlcj4gbVBhcnNlcjsKKworICAgIC8vIFVzZWQgdG8gcmVtZW1iZXIgU3luY0V2ZW50IG9jY3VycmVkIGluIGZlZWRNb3JlKCkgd2hlbiBjYWxsZWQgZnJvbSBpbml0KCksCisgICAgLy8gYmVjYXVzZSBpbml0KCkgbmVlZHMgdG8gdXBkYXRlIHxtU291cmNlSW1wbHN8IGJlZm9yZSBhZGRpbmcgU3luY1BvaW50LgorICAgIEFUU1BhcnNlcjo6U3luY0V2ZW50IG1MYXN0U3luY0V2ZW50OworCisgICAgVmVjdG9yPHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ID4gbVNvdXJjZUltcGxzOworCisgICAgVmVjdG9yPEtleWVkVmVjdG9yPGludDY0X3QsIG9mZjY0X3Q+ID4gbVN5bmNQb2ludHM7CisgICAgLy8gU3luYyBwb2ludHMgdXNlZCBmb3Igc2Vla2luZyAtLS0gbm9ybWFsbHkgb25lIGZvciB2aWRlbyB0cmFjayBpcyB1c2VkLgorICAgIC8vIElmIG5vIHZpZGVvIHRyYWNrIGlzIHByZXNlbnQsIGF1ZGlvIHRyYWNrIHdpbGwgYmUgdXNlZCBpbnN0ZWFkLgorICAgIEtleWVkVmVjdG9yPGludDY0X3QsIG9mZjY0X3Q+ICptU2Vla1N5bmNQb2ludHM7CisKKyAgICBvZmY2NF90IG1PZmZzZXQ7CisKKyAgICBzdGF0aWMgYm9vbCBpc1NjcmFtYmxlZEZvcm1hdChNZXRhRGF0YUJhc2UgJmZvcm1hdCk7CisKKyAgICB2b2lkIGluaXQoKTsKKyAgICB2b2lkIGFkZFNvdXJjZShjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCk7CisgICAgLy8gVHJ5IHRvIGZlZWQgbW9yZSBkYXRhIGZyb20gc291cmNlIHRvIHBhcnNlci4KKyAgICAvLyB8aXNJbml0fCBtZWFucyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbnNpZGUgaW5pdCgpLiBUaGlzIGlzIGEgc2lnbmFsIHRvCisgICAgLy8gc2F2ZSBTeW5jRXZlbnQgc28gdGhhdCBpbml0KCkgY2FuIGFkZCBTeW5jUG9pbnQgYWZ0ZXIgaXQgdXBkYXRlcyB8bVNvdXJjZUltcGxzfC4KKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgT0sgaWYgZXhwZWN0ZWQgYW1vdW50IG9mIGRhdGEgaXMgZmVkIGZyb20gRGF0YVNvdXJjZUJhc2UgdG8KKyAgICAvLyBwYXJzZXIgYW5kIGlzIHN1Y2Nlc3NmdWxseSBwYXJzZWQuIE90aGVyd2lzZSwgdmFyaW91cyBlcnJvciBjb2RlcyBjb3VsZCBiZQorICAgIC8vIHJldHVybmVkLCBlLmcuLCBFUlJPUl9FTkRfT0ZfU1RSRUFNLCBvciBubyBkYXRhIGF2YWlsYWxiZSBmcm9tIERhdGFTb3VyY2VCYXNlLCBvcgorICAgIC8vIHRoZSBkYXRhIGhhcyBzeW50YXggZXJyb3IgZHVyaW5nIHBhcnNpbmcsIGV0Yy4KKyAgICBzdGF0dXNfdCBmZWVkTW9yZShib29sIGlzSW5pdCA9IGZhbHNlKTsKKyAgICBzdGF0dXNfdCBzZWVrKGludDY0X3Qgc2Vla1RpbWVVcywKKyAgICAgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUmIHNlZWtNb2RlKTsKKyAgICBzdGF0dXNfdCBxdWV1ZURpc2NvbnRpbnVpdHlGb3JTZWVrKGludDY0X3QgYWN0dWFsU2Vla1RpbWVVcyk7CisgICAgc3RhdHVzX3Qgc2Vla0JleW9uZChpbnQ2NF90IHNlZWtUaW1lVXMpOworCisgICAgc3RhdHVzX3QgZmVlZFVudGlsQnVmZmVyQXZhaWxhYmxlKGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsKTsKKworICAgIC8vIEFkZCBhIFN5blBvaW50IGRlcml2ZWQgZnJvbSB8ZXZlbnR8LgorICAgIHZvaWQgYWRkU3luY1BvaW50X2woY29uc3QgQVRTUGFyc2VyOjpTeW5jRXZlbnQgJmV2ZW50KTsKKworICAgIHN0YXR1c190ICBlc3RpbWF0ZUR1cmF0aW9uc0Zyb21UaW1lc1VzQXRFbmQoKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1QRUcyVFNFeHRyYWN0b3IpOworfTsKKworYm9vbCBTbmlmZk1QRUcyVFMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1QRUcyX1RTX0VYVFJBQ1RPUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTk9USUNFIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9OT1RJQ0UKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9OT1RJQ0UKY29weSB0byBtZWRpYS9leHRyYWN0b3JzL21wZWcyL05PVElDRQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9leHBvcnRzLmxkcyBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvZXhwb3J0cy5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEzMDllZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvZXhwb3J0cy5sZHMKQEAgLTAsMCArMSBAQAoreyBnbG9iYWw6IEdFVEVYVFJBQ1RPUkRFRjsgbG9jYWw6ICo7IH07CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL29nZy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzZmYzc1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvQW5kcm9pZC5icApAQCAtMCwwICsxLDQ0IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisKKyAgICBzcmNzOiBbIk9nZ0V4dHJhY3Rvci5jcHAiXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKKyAgICAgICAgImV4dGVybmFsL3RyZW1vbG8iLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlidm9yYmlzaWRlYyIsCisgICAgXSwKKworICAgIG5hbWU6ICJsaWJvZ2dleHRyYWN0b3IiLAorICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImV4dHJhY3RvcnMiLAorCisgICAgY29tcGlsZV9tdWx0aWxpYjogImZpcnN0IiwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKKyAgICBdLAorICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgZGlhZzogeworICAgICAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCisKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9leHRyYWN0b3JzL29nZy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpjb3B5IHRvIG1lZGlhL2V4dHJhY3RvcnMvb2dnL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL05PVElDRSBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL05PVElDRQpjb3B5IHRvIG1lZGlhL2V4dHJhY3RvcnMvb2dnL05PVElDRQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvT2dnRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJmZTY5YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5jcHAKQEAgLTAsMCArMSwxMjg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJPZ2dFeHRyYWN0b3IiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJPZ2dFeHRyYWN0b3IuaCIKKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9FeHRyYWN0b3JVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9Wb3JiaXNDb21tZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCitleHRlcm4gIkMiIHsKKyAgICAjaW5jbHVkZSA8VHJlbW9sby9jb2RlY19pbnRlcm5hbC5oPgorCisgICAgaW50IF92b3JiaXNfdW5wYWNrX2Jvb2tzKHZvcmJpc19pbmZvICp2aSxvZ2dwYWNrX2J1ZmZlciAqb3BiKTsKKyAgICBpbnQgX3ZvcmJpc191bnBhY2tfaW5mbyh2b3JiaXNfaW5mbyAqdmksb2dncGFja19idWZmZXIgKm9wYik7CisgICAgaW50IF92b3JiaXNfdW5wYWNrX2NvbW1lbnQodm9yYmlzX2NvbW1lbnQgKnZjLG9nZ3BhY2tfYnVmZmVyICpvcGIpOworICAgIGxvbmcgdm9yYmlzX3BhY2tldF9ibG9ja3NpemUodm9yYmlzX2luZm8gKnZpLG9nZ19wYWNrZXQgKm9wKTsKK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgT2dnU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworICAgIGV4cGxpY2l0IE9nZ1NvdXJjZShPZ2dFeHRyYWN0b3IgKmV4dHJhY3Rvcik7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJik7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5PZ2dTb3VyY2UoKTsKKworcHJpdmF0ZToKKyAgICBPZ2dFeHRyYWN0b3IgKm1FeHRyYWN0b3I7CisgICAgYm9vbCBtU3RhcnRlZDsKKworICAgIE9nZ1NvdXJjZShjb25zdCBPZ2dTb3VyY2UgJik7CisgICAgT2dnU291cmNlICZvcGVyYXRvcj0oY29uc3QgT2dnU291cmNlICYpOworfTsKKworc3RydWN0IE15T2dnRXh0cmFjdG9yIHsKKyAgICBNeU9nZ0V4dHJhY3RvcigKKyAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lVHlwZSwKKyAgICAgICAgICAgIHNpemVfdCBudW1IZWFkZXJzLAorICAgICAgICAgICAgaW50NjRfdCBzZWVrUHJlUm9sbFVzKTsKKyAgICB2aXJ0dWFsIH5NeU9nZ0V4dHJhY3RvcigpOworCisgICAgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmKSBjb25zdDsKKworICAgIC8vIFJldHVybnMgYW4gYXBwcm94aW1hdGUgYml0cmF0ZSBpbiBiaXRzIHBlciBzZWNvbmQuCisgICAgdmlydHVhbCB1aW50NjRfdCBhcHByb3hCaXRyYXRlKCkgY29uc3QgPSAwOworCisgICAgc3RhdHVzX3Qgc2Vla1RvVGltZShpbnQ2NF90IHRpbWVVcyk7CisgICAgc3RhdHVzX3Qgc2Vla1RvT2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlcikgPSAwOworCisgICAgc3RhdHVzX3QgaW5pdCgpOworCisgICAgc3RhdHVzX3QgZ2V0RmlsZU1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgeworICAgICAgICBtZXRhID0gbUZpbGVNZXRhOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgc3RydWN0IFBhZ2UgeworICAgICAgICB1aW50NjRfdCBtR3JhbnVsZVBvc2l0aW9uOworICAgICAgICBpbnQzMl90IG1QcmV2UGFja2V0U2l6ZTsKKyAgICAgICAgdWludDY0X3QgbVByZXZQYWNrZXRQb3M7CisgICAgICAgIHVpbnQzMl90IG1TZXJpYWxObzsKKyAgICAgICAgdWludDMyX3QgbVBhZ2VObzsKKyAgICAgICAgdWludDhfdCBtRmxhZ3M7CisgICAgICAgIHVpbnQ4X3QgbU51bVNlZ21lbnRzOworICAgICAgICB1aW50OF90IG1MYWNlWzI1NV07CisgICAgfTsKKworICAgIHN0cnVjdCBUT0NFbnRyeSB7CisgICAgICAgIG9mZjY0X3QgbVBhZ2VPZmZzZXQ7CisgICAgICAgIGludDY0X3QgbVRpbWVVczsKKyAgICB9OworCisgICAgRGF0YVNvdXJjZUJhc2UgKm1Tb3VyY2U7CisgICAgb2ZmNjRfdCBtT2Zmc2V0OworICAgIFBhZ2UgbUN1cnJlbnRQYWdlOworICAgIHVpbnQ2NF90IG1DdXJHcmFudWxlUG9zaXRpb247CisgICAgdWludDY0X3QgbVByZXZHcmFudWxlUG9zaXRpb247CisgICAgc2l6ZV90IG1DdXJyZW50UGFnZVNpemU7CisgICAgYm9vbCBtRmlyc3RQYWNrZXRJblBhZ2U7CisgICAgdWludDY0X3QgbUN1cnJlbnRQYWdlU2FtcGxlczsKKyAgICBzaXplX3QgbU5leHRMYWNlSW5kZXg7CisKKyAgICBjb25zdCBjaGFyICptTWltZVR5cGU7CisgICAgc2l6ZV90IG1OdW1IZWFkZXJzOworICAgIGludDY0X3QgbVNlZWtQcmVSb2xsVXM7CisKKyAgICBvZmY2NF90IG1GaXJzdERhdGFPZmZzZXQ7CisKKyAgICB2b3JiaXNfaW5mbyBtVmk7CisgICAgdm9yYmlzX2NvbW1lbnQgbVZjOworCisgICAgTWV0YURhdGFCYXNlIG1NZXRhOworICAgIE1ldGFEYXRhQmFzZSBtRmlsZU1ldGE7CisKKyAgICBWZWN0b3I8VE9DRW50cnk+IG1UYWJsZU9mQ29udGVudHM7CisKKyAgICBzc2l6ZV90IHJlYWRQYWdlKG9mZjY0X3Qgb2Zmc2V0LCBQYWdlICpwYWdlKTsKKyAgICBzdGF0dXNfdCBmaW5kTmV4dFBhZ2Uob2ZmNjRfdCBzdGFydE9mZnNldCwgb2ZmNjRfdCAqcGFnZU9mZnNldCk7CisKKyAgICB2aXJ0dWFsIGludDY0X3QgZ2V0VGltZVVzT2ZHcmFudWxlKHVpbnQ2NF90IGdyYW51bGVQb3MpIGNvbnN0ID0gMDsKKworICAgIC8vIEV4dHJhY3QgY29kZWMgZm9ybWF0LCBtZXRhZGF0YSB0YWdzLCBhbmQgdmFyaW91cyBjb2RlYyBzcGVjaWZpYyBkYXRhOworICAgIC8vIHRoZSBmb3JtYXQgYW5kIENTRCdzIGFyZSByZXF1aXJlZCB0byBzZXR1cCB0aGUgZGVjb2RlcnMgZm9yIHRoZSBlbmNsb3NlZCBtZWRpYSBjb250ZW50LgorICAgIC8vCisgICAgLy8gVmFsaWQgdmFsdWVzIGZvciBgdHlwZWAgYXJlOgorICAgIC8vIDEgLSBiaXRzdHJlYW0gaWRlbnRpZmljYXRpb24gaGVhZGVyCisgICAgLy8gMyAtIGNvbW1lbnQgaGVhZGVyCisgICAgLy8gNSAtIGNvZGVjIHNldHVwIGhlYWRlciAoVm9yYmlzIG9ubHkpCisgICAgdmlydHVhbCBzdGF0dXNfdCB2ZXJpZnlIZWFkZXIoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIsIHVpbnQ4X3QgdHlwZSkgPSAwOworCisgICAgLy8gUmVhZCB0aGUgbmV4dCBvZ2cgcGFja2V0IGZyb20gdGhlIHVuZGVybHlpbmcgZGF0YSBzb3VyY2U7IG9wdGlvbmFsbHkKKyAgICAvLyBjYWxjdWxhdGUgdGhlIHRpbWVzdGFtcCBmb3IgdGhlIG91dHB1dCBwYWNrZXQgd2hpbHN0IHByZXRlbmRpbmcKKyAgICAvLyB0aGF0IHdlIGFyZSBwYXJzaW5nIGFuIE9nZyBWb3JiaXMgc3RyZWFtLgorICAgIC8vCisgICAgLy8gKmJ1ZmZlciBpcyBOVUxMJ2VkIG91dCBpbW1lZGlhdGVseSB1cG9uIGVudHJ5LCBhbmQgaWYgc3VjY2Vzc2Z1bCBhIG5ldyBidWZmZXIgaXMgYWxsb2NhdGVkOworICAgIC8vIGNsaWVudHMgYXJlIHJlc3BvbnNpYmxlIGZvciByZWxlYXNpbmcgdGhlIG9yaWdpbmFsIGJ1ZmZlci4KKyAgICBzdGF0dXNfdCBfcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBib29sIGNhbGNWb3JiaXNUaW1lc3RhbXApOworCisgICAgaW50MzJfdCBnZXRQYWNrZXRCbG9ja1NpemUoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpOworCisgICAgdm9pZCBwYXJzZUZpbGVNZXRhRGF0YSgpOworCisgICAgc3RhdHVzX3QgZmluZFByZXZHcmFudWxlUG9zaXRpb24ob2ZmNjRfdCBwYWdlT2Zmc2V0LCB1aW50NjRfdCAqZ3JhbnVsZVBvcyk7CisKKyAgICB2b2lkIGJ1aWxkVGFibGVPZkNvbnRlbnRzKCk7CisKKyAgICBNeU9nZ0V4dHJhY3Rvcihjb25zdCBNeU9nZ0V4dHJhY3RvciAmKTsKKyAgICBNeU9nZ0V4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE15T2dnRXh0cmFjdG9yICYpOworfTsKKworc3RydWN0IE15Vm9yYmlzRXh0cmFjdG9yIDogcHVibGljIE15T2dnRXh0cmFjdG9yIHsKKyAgICBleHBsaWNpdCBNeVZvcmJpc0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorICAgICAgICA6IE15T2dnRXh0cmFjdG9yKHNvdXJjZSwKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsCisgICAgICAgICAgICAgICAgLyogbnVtSGVhZGVycyAqLyAzLAorICAgICAgICAgICAgICAgIC8qIHNlZWtQcmVSb2xsVXMgKi8gMCkgeworICAgIH0KKworICAgIHZpcnR1YWwgdWludDY0X3QgYXBwcm94Qml0cmF0ZSgpIGNvbnN0OworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIpIHsKKyAgICAgICAgcmV0dXJuIF9yZWFkTmV4dFBhY2tldChidWZmZXIsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqLyB0cnVlKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIGludDY0X3QgZ2V0VGltZVVzT2ZHcmFudWxlKHVpbnQ2NF90IGdyYW51bGVQb3MpIGNvbnN0IHsKKyAgICAgICAgaWYgKGdyYW51bGVQb3MgPiBJTlQ2NF9NQVggLyAxMDAwMDAwbGwpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlQ2NF9NQVg7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdyYW51bGVQb3MgKiAxMDAwMDAwbGwgLyBtVmkucmF0ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciwgdWludDhfdCB0eXBlKTsKK307CisKK3N0cnVjdCBNeU9wdXNFeHRyYWN0b3IgOiBwdWJsaWMgTXlPZ2dFeHRyYWN0b3IgeworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtPcHVzU2FtcGxlUmF0ZSA9IDQ4MDAwOworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtPcHVzU2Vla1ByZVJvbGxVcyA9IDgwMDAwOyAvLyA4MCBtcworCisgICAgZXhwbGljaXQgTXlPcHVzRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCisgICAgICAgIDogTXlPZ2dFeHRyYWN0b3Ioc291cmNlLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTLCAvKm51bUhlYWRlcnMqLyAyLCBrT3B1c1NlZWtQcmVSb2xsVXMpLAorICAgICAgICAgIG1DaGFubmVsQ291bnQoMCksCisgICAgICAgICAgbUNvZGVjRGVsYXkoMCksCisgICAgICAgICAgbVN0YXJ0R3JhbnVsZVBvc2l0aW9uKC0xKSB7CisgICAgfQorCisgICAgdmlydHVhbCB1aW50NjRfdCBhcHByb3hCaXRyYXRlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlcik7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIGludDY0X3QgZ2V0VGltZVVzT2ZHcmFudWxlKHVpbnQ2NF90IGdyYW51bGVQb3MpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLCB1aW50OF90IHR5cGUpOworCitwcml2YXRlOgorICAgIHN0YXR1c190IHZlcmlmeU9wdXNIZWFkZXIoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpOworICAgIHN0YXR1c190IHZlcmlmeU9wdXNDb21tZW50cyhNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7CisgICAgdWludDMyX3QgZ2V0TnVtU2FtcGxlc0luUGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSBjb25zdDsKKworICAgIHVpbnQ4X3QgbUNoYW5uZWxDb3VudDsKKyAgICB1aW50MTZfdCBtQ29kZWNEZWxheTsKKyAgICBpbnQ2NF90IG1TdGFydEdyYW51bGVQb3NpdGlvbjsKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK09nZ1NvdXJjZTo6T2dnU291cmNlKE9nZ0V4dHJhY3RvciAqZXh0cmFjdG9yKQorICAgIDogbUV4dHJhY3RvcihleHRyYWN0b3IpLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpIHsKK30KKworT2dnU291cmNlOjp+T2dnU291cmNlKCkgeworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICBzdG9wKCk7CisgICAgfQorfQorCitzdGF0dXNfdCBPZ2dTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKKyAgICByZXR1cm4gbUV4dHJhY3Rvci0+bUltcGwtPmdldEZvcm1hdChtZXRhKTsKK30KKworc3RhdHVzX3QgT2dnU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKiAvKiBwYXJhbXMgKi8pIHsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIG1TdGFydGVkID0gdHJ1ZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgT2dnU291cmNlOjpzdG9wKCkgeworICAgIG1TdGFydGVkID0gZmFsc2U7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE9nZ1NvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgICpvdXQgPSBOVUxMOworCisgICAgaW50NjRfdCBzZWVrVGltZVVzOworICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPm1JbXBsLT5zZWVrVG9UaW1lKHNlZWtUaW1lVXMpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgTWVkaWFCdWZmZXJCYXNlICpwYWNrZXQ7CisgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+bUltcGwtPnJlYWROZXh0UGFja2V0KCZwYWNrZXQpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworI2lmIDAKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBpZiAocGFja2V0LT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKSB7CisgICAgICAgIEFMT0dJKCJmb3VuZCB0aW1lID0gJWxsZCB1cyIsIHRpbWVVcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0koIk5PIHRpbWUiKTsKKyAgICB9CisjZW5kaWYKKworICAgIHBhY2tldC0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKworICAgICpvdXQgPSBwYWNrZXQ7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK015T2dnRXh0cmFjdG9yOjpNeU9nZ0V4dHJhY3RvcigKKyAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICAgICAgY29uc3QgY2hhciAqbWltZVR5cGUsCisgICAgICAgIHNpemVfdCBudW1IZWFkZXJzLAorICAgICAgICBpbnQ2NF90IHNlZWtQcmVSb2xsVXMpCisgICAgOiBtU291cmNlKHNvdXJjZSksCisgICAgICBtT2Zmc2V0KDApLAorICAgICAgbUN1ckdyYW51bGVQb3NpdGlvbigwKSwKKyAgICAgIG1QcmV2R3JhbnVsZVBvc2l0aW9uKDApLAorICAgICAgbUN1cnJlbnRQYWdlU2l6ZSgwKSwKKyAgICAgIG1GaXJzdFBhY2tldEluUGFnZSh0cnVlKSwKKyAgICAgIG1DdXJyZW50UGFnZVNhbXBsZXMoMCksCisgICAgICBtTmV4dExhY2VJbmRleCgwKSwKKyAgICAgIG1NaW1lVHlwZShtaW1lVHlwZSksCisgICAgICBtTnVtSGVhZGVycyhudW1IZWFkZXJzKSwKKyAgICAgIG1TZWVrUHJlUm9sbFVzKHNlZWtQcmVSb2xsVXMpLAorICAgICAgbUZpcnN0RGF0YU9mZnNldCgtMSkgeworICAgIG1DdXJyZW50UGFnZS5tTnVtU2VnbWVudHMgPSAwOworCisgICAgdm9yYmlzX2luZm9faW5pdCgmbVZpKTsKKyAgICB2b3JiaXNfY29tbWVudF9pbml0KCZtVmMpOworfQorCitNeU9nZ0V4dHJhY3Rvcjo6fk15T2dnRXh0cmFjdG9yKCkgeworICAgIHZvcmJpc19jb21tZW50X2NsZWFyKCZtVmMpOworICAgIHZvcmJpc19pbmZvX2NsZWFyKCZtVmkpOworfQorCitzdGF0dXNfdCBNeU9nZ0V4dHJhY3Rvcjo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgY29uc3QgeworICAgIG1ldGEgPSBtTWV0YTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE15T2dnRXh0cmFjdG9yOjpmaW5kTmV4dFBhZ2UoCisgICAgICAgIG9mZjY0X3Qgc3RhcnRPZmZzZXQsIG9mZjY0X3QgKnBhZ2VPZmZzZXQpIHsKKyAgICAqcGFnZU9mZnNldCA9IHN0YXJ0T2Zmc2V0OworCisgICAgZm9yICg7OykgeworICAgICAgICBjaGFyIHNpZ25hdHVyZVs0XTsKKyAgICAgICAgc3NpemVfdCBuID0gbVNvdXJjZS0+cmVhZEF0KCpwYWdlT2Zmc2V0LCAmc2lnbmF0dXJlLCA0KTsKKworICAgICAgICBpZiAobiA8IDQpIHsKKyAgICAgICAgICAgICpwYWdlT2Zmc2V0ID0gMDsKKworICAgICAgICAgICAgcmV0dXJuIChuIDwgMCkgPyBuIDogKHN0YXR1c190KUVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1lbWNtcChzaWduYXR1cmUsICJPZ2dTIiwgNCkpIHsKKyAgICAgICAgICAgIGlmICgqcGFnZU9mZnNldCA+IHN0YXJ0T2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInNraXBwZWQgJWxsZCBieXRlcyBvZiBqdW5rIHRvIHJlYWNoIG5leHQgZnJhbWUiLAorICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykoKnBhZ2VPZmZzZXQgLSBzdGFydE9mZnNldCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICArKypwYWdlT2Zmc2V0OworICAgIH0KK30KKworLy8gR2l2ZW4gdGhlIG9mZnNldCBvZiB0aGUgImN1cnJlbnQiIHBhZ2UsIGZpbmQgdGhlIHBhZ2UgaW1tZWRpYXRlbHkgcHJlY2VkaW5nCisvLyBpdCAoaWYgYW55KSBhbmQgcmV0dXJuIGl0cyBncmFudWxlIHBvc2l0aW9uLgorLy8gVG8gZG8gdGhpcyB3ZSBiYWNrIHVwIGZyb20gdGhlICJjdXJyZW50IiBwYWdlJ3Mgb2Zmc2V0IHVudGlsIHdlIGZpbmQgYW55CisvLyBwYWdlIHByZWNlZGluZyBpdCBhbmQgdGhlbiBzY2FuIGZvcndhcmQgdG8ganVzdCBiZWZvcmUgdGhlIGN1cnJlbnQgcGFnZS4KK3N0YXR1c190IE15T2dnRXh0cmFjdG9yOjpmaW5kUHJldkdyYW51bGVQb3NpdGlvbigKKyAgICAgICAgb2ZmNjRfdCBwYWdlT2Zmc2V0LCB1aW50NjRfdCAqZ3JhbnVsZVBvcykgeworICAgICpncmFudWxlUG9zID0gMDsKKworICAgIG9mZjY0X3QgcHJldlBhZ2VPZmZzZXQgPSAwOworICAgIG9mZjY0X3QgcHJldkd1ZXNzID0gcGFnZU9mZnNldDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmIChwcmV2R3Vlc3MgPj0gNTAwMCkgeworICAgICAgICAgICAgcHJldkd1ZXNzIC09IDUwMDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmV2R3Vlc3MgPSAwOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoImJhY2tpbmcgdXAgJWxsZCBieXRlcyIsIChsb25nIGxvbmcpKHBhZ2VPZmZzZXQgLSBwcmV2R3Vlc3MpKTsKKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBmaW5kTmV4dFBhZ2UocHJldkd1ZXNzLCAmcHJldlBhZ2VPZmZzZXQpOworICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIC8vIFdlIGFyZSBhdCB0aGUgbGFzdCBwYWdlIGFuZCBkaWRuJ3QgYmFjayBvZmYgZW5vdWdoOworICAgICAgICAgICAgLy8gYmFjayBvZmYgNTAwMCBieXRlcyBtb3JlIGFuZCB0cnkgYWdhaW4uCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJldlBhZ2VPZmZzZXQgPCBwYWdlT2Zmc2V0IHx8IHByZXZHdWVzcyA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwcmV2UGFnZU9mZnNldCA9PSBwYWdlT2Zmc2V0KSB7CisgICAgICAgIC8vIFdlIGRpZCBub3QgZmluZCBhIHBhZ2UgcHJlY2VkaW5nIHRoaXMgb25lLgorICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBBTE9HVigicHJldlBhZ2VPZmZzZXQgYXQgJWxsZCwgcGFnZU9mZnNldCBhdCAlbGxkIiwKKyAgICAgICAgICAgIChsb25nIGxvbmcpcHJldlBhZ2VPZmZzZXQsIChsb25nIGxvbmcpcGFnZU9mZnNldCk7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIFBhZ2UgcHJldlBhZ2U7CisgICAgICAgIHNzaXplX3QgbiA9IHJlYWRQYWdlKHByZXZQYWdlT2Zmc2V0LCAmcHJldlBhZ2UpOworCisgICAgICAgIGlmIChuIDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybiAoc3RhdHVzX3QpbjsKKyAgICAgICAgfQorCisgICAgICAgIHByZXZQYWdlT2Zmc2V0ICs9IG47CisKKyAgICAgICAgaWYgKHByZXZQYWdlT2Zmc2V0ID09IHBhZ2VPZmZzZXQpIHsKKyAgICAgICAgICAgICpncmFudWxlUG9zID0gcHJldlBhZ2UubUdyYW51bGVQb3NpdGlvbjsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6OnNlZWtUb1RpbWUoaW50NjRfdCB0aW1lVXMpIHsKKyAgICB0aW1lVXMgLT0gbVNlZWtQcmVSb2xsVXM7CisgICAgaWYgKHRpbWVVcyA8IDApIHsKKyAgICAgICAgdGltZVVzID0gMDsKKyAgICB9CisKKyAgICBpZiAobVRhYmxlT2ZDb250ZW50cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgLy8gUGVyZm9ybSBhcHByb3hpbWF0ZSBzZWVraW5nIGJhc2VkIG9uIGF2Zy4gYml0cmF0ZS4KKyAgICAgICAgdWludDY0X3QgYnBzID0gYXBwcm94Qml0cmF0ZSgpOworICAgICAgICBpZiAoYnBzIDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorCisgICAgICAgIG9mZjY0X3QgcG9zID0gdGltZVVzICogYnBzIC8gODAwMDAwMGxsOworCisgICAgICAgIEFMT0dWKCJzZWVraW5nIHRvIG9mZnNldCAlbGxkIiwgKGxvbmcgbG9uZylwb3MpOworICAgICAgICByZXR1cm4gc2Vla1RvT2Zmc2V0KHBvcyk7CisgICAgfQorCisgICAgc2l6ZV90IGxlZnQgPSAwOworICAgIHNpemVfdCByaWdodF9wbHVzX29uZSA9IG1UYWJsZU9mQ29udGVudHMuc2l6ZSgpOworICAgIHdoaWxlIChsZWZ0IDwgcmlnaHRfcGx1c19vbmUpIHsKKyAgICAgICAgc2l6ZV90IGNlbnRlciA9IGxlZnQgKyAocmlnaHRfcGx1c19vbmUgLSBsZWZ0KSAvIDI7CisKKyAgICAgICAgY29uc3QgVE9DRW50cnkgJmVudHJ5ID0gbVRhYmxlT2ZDb250ZW50cy5pdGVtQXQoY2VudGVyKTsKKworICAgICAgICBpZiAodGltZVVzIDwgZW50cnkubVRpbWVVcykgeworICAgICAgICAgICAgcmlnaHRfcGx1c19vbmUgPSBjZW50ZXI7CisgICAgICAgIH0gZWxzZSBpZiAodGltZVVzID4gZW50cnkubVRpbWVVcykgeworICAgICAgICAgICAgbGVmdCA9IGNlbnRlciArIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZWZ0ID0gY2VudGVyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobGVmdCA9PSBtVGFibGVPZkNvbnRlbnRzLnNpemUoKSkgeworICAgICAgICAtLWxlZnQ7CisgICAgfQorCisgICAgY29uc3QgVE9DRW50cnkgJmVudHJ5ID0gbVRhYmxlT2ZDb250ZW50cy5pdGVtQXQobGVmdCk7CisKKyAgICBBTE9HVigic2Vla2luZyB0byBlbnRyeSAlenUgLyAlenUgYXQgb2Zmc2V0ICVsbGQiLAorICAgICAgICAgbGVmdCwgbVRhYmxlT2ZDb250ZW50cy5zaXplKCksIChsb25nIGxvbmcpZW50cnkubVBhZ2VPZmZzZXQpOworCisgICAgcmV0dXJuIHNlZWtUb09mZnNldChlbnRyeS5tUGFnZU9mZnNldCk7Cit9CisKK3N0YXR1c190IE15T2dnRXh0cmFjdG9yOjpzZWVrVG9PZmZzZXQob2ZmNjRfdCBvZmZzZXQpIHsKKyAgICBpZiAobUZpcnN0RGF0YU9mZnNldCA+PSAwICYmIG9mZnNldCA8IG1GaXJzdERhdGFPZmZzZXQpIHsKKyAgICAgICAgLy8gT25jZSB3ZSBrbm93IHdoZXJlIHRoZSBhY3R1YWwgYXVkaW8gZGF0YSBzdGFydHMgKHBhc3QgdGhlIGhlYWRlcnMpCisgICAgICAgIC8vIGRvbid0IGV2ZXIgc2VlayB0byBhbnl3aGVyZSBiZWZvcmUgdGhhdC4KKyAgICAgICAgb2Zmc2V0ID0gbUZpcnN0RGF0YU9mZnNldDsKKyAgICB9CisKKyAgICBvZmY2NF90IHBhZ2VPZmZzZXQ7CisgICAgc3RhdHVzX3QgZXJyID0gZmluZE5leHRQYWdlKG9mZnNldCwgJnBhZ2VPZmZzZXQpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIC8vIFdlIGZvdW5kIHRoZSBwYWdlIHdlIHdhbnRlZCB0byBzZWVrIHRvLCBidXQgd2UnbGwgYWxzbyBuZWVkCisgICAgLy8gdGhlIHBhZ2UgcHJlY2VkaW5nIGl0IHRvIGRldGVybWluZSBob3cgbWFueSB2YWxpZCBzYW1wbGVzIGFyZSBvbgorICAgIC8vIHRoaXMgcGFnZS4KKyAgICBmaW5kUHJldkdyYW51bGVQb3NpdGlvbihwYWdlT2Zmc2V0LCAmbVByZXZHcmFudWxlUG9zaXRpb24pOworCisgICAgbU9mZnNldCA9IHBhZ2VPZmZzZXQ7CisKKyAgICBtQ3VycmVudFBhZ2VTaXplID0gMDsKKyAgICBtRmlyc3RQYWNrZXRJblBhZ2UgPSB0cnVlOworICAgIG1DdXJyZW50UGFnZVNhbXBsZXMgPSAwOworICAgIG1DdXJyZW50UGFnZS5tTnVtU2VnbWVudHMgPSAwOworICAgIG1DdXJyZW50UGFnZS5tUHJldlBhY2tldFNpemUgPSAtMTsKKyAgICBtTmV4dExhY2VJbmRleCA9IDA7CisKKyAgICAvLyBYWFggd2hhdCBpZiBuZXcgcGFnZSBjb250aW51ZXMgcGFja2V0IGZyb20gbGFzdD8/PworCisgICAgcmV0dXJuIE9LOworfQorCitzc2l6ZV90IE15T2dnRXh0cmFjdG9yOjpyZWFkUGFnZShvZmY2NF90IG9mZnNldCwgUGFnZSAqcGFnZSkgeworICAgIHVpbnQ4X3QgaGVhZGVyWzI3XTsKKyAgICBzc2l6ZV90IG47CisgICAgaWYgKChuID0gbVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkpCisgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihoZWFkZXIpKSB7CisgICAgICAgIEFMT0dWKCJmYWlsZWQgdG8gcmVhZCAlenUgYnl0ZXMgYXQgb2Zmc2V0ICUjMDE2bGx4LCBnb3QgJXpkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICBzaXplb2YoaGVhZGVyKSwgKGxvbmcgbG9uZylvZmZzZXQsIG4pOworCisgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtZW1jbXAoaGVhZGVyLCAiT2dnUyIsIDQpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKGhlYWRlcls0XSAhPSAwKSB7CisgICAgICAgIC8vIFdyb25nIHZlcnNpb24uCisKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIHBhZ2UtPm1GbGFncyA9IGhlYWRlcls1XTsKKworICAgIGlmIChwYWdlLT5tRmxhZ3MgJiB+NykgeworICAgICAgICAvLyBPbmx5IGJpdHMgMC0yIGFyZSBkZWZpbmVkIGluIHZlcnNpb24gMC4KKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBwYWdlLT5tR3JhbnVsZVBvc2l0aW9uID0gVTY0TEVfQVQoJmhlYWRlcls2XSk7CisKKyNpZiAwCisgICAgcHJpbnRmKCJncmFudWxlUG9zaXRpb24gPSAlbGx1ICgweCVsbHgpXG4iLAorICAgICAgICAgICBwYWdlLT5tR3JhbnVsZVBvc2l0aW9uLCBwYWdlLT5tR3JhbnVsZVBvc2l0aW9uKTsKKyNlbmRpZgorCisgICAgcGFnZS0+bVNlcmlhbE5vID0gVTMyTEVfQVQoJmhlYWRlclsxNF0pOworICAgIHBhZ2UtPm1QYWdlTm8gPSBVMzJMRV9BVCgmaGVhZGVyWzE4XSk7CisKKyAgICBwYWdlLT5tTnVtU2VnbWVudHMgPSBoZWFkZXJbMjZdOworICAgIGlmIChtU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgb2Zmc2V0ICsgc2l6ZW9mKGhlYWRlciksIHBhZ2UtPm1MYWNlLCBwYWdlLT5tTnVtU2VnbWVudHMpCisgICAgICAgICAgICA8IChzc2l6ZV90KXBhZ2UtPm1OdW1TZWdtZW50cykgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorCisgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IDA7OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFnZS0+bU51bVNlZ21lbnRzOyArK2kpIHsKKyAgICAgICAgdG90YWxTaXplICs9IHBhZ2UtPm1MYWNlW2ldOworICAgIH0KKworI2lmIDAKKyAgICBTdHJpbmc4IHRtcDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhZ2UtPm1OdW1TZWdtZW50czsgKytpKSB7CisgICAgICAgIGNoYXIgeFszMl07CisgICAgICAgIHNwcmludGYoeCwgIiVzJXUiLCBpID4gMCA/ICIsICIgOiAiIiwgKHVuc2lnbmVkKXBhZ2UtPm1MYWNlW2ldKTsKKworICAgICAgICB0bXAuYXBwZW5kKHgpOworICAgIH0KKworICAgIEFMT0dWKCIlYyAlcyIsIHBhZ2UtPm1GbGFncyAmIDEgPyAnKycgOiAnICcsIHRtcC5zdHJpbmcoKSk7CisjZW5kaWYKKworICAgIHJldHVybiBzaXplb2YoaGVhZGVyKSArIHBhZ2UtPm1OdW1TZWdtZW50cyArIHRvdGFsU2l6ZTsKK30KKworc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjpyZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKipvdXQpIHsKKyAgICBpZiAobU9mZnNldCA8PSBtRmlyc3REYXRhT2Zmc2V0ICYmIG1TdGFydEdyYW51bGVQb3NpdGlvbiA8IDApIHsKKyAgICAgICAgLy8gVGhlIGZpcnN0IHNhbXBsZSBtaWdodCBub3Qgc3RhcnQgYXQgdGltZSAwOyBmaW5kIG91dCB3aGVyZSBieSBzdWJ0cmFjdGluZworICAgICAgICAvLyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgb24gdGhlIGZpcnN0IHBhZ2UgZnJvbSB0aGUgZ3JhbnVsZSBwb3NpdGlvbgorICAgICAgICAvLyAocG9zaXRpb24gb2YgbGFzdCBjb21wbGV0ZSBzYW1wbGUpIG9mIHRoZSBmaXJzdCBwYWdlLiBUaGlzIGhhcHBlbnMKKyAgICAgICAgLy8gdGhlIGZpcnN0IHRpbWUgYmVmb3JlIHdlIGF0dGVtcHQgdG8gcmVhZCBhIHBhY2tldCBmcm9tIHRoZSBmaXJzdCBwYWdlLgorICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKm1CdWY7CisgICAgICAgIHVpbnQzMl90IG51bVNhbXBsZXMgPSAwOworICAgICAgICB1aW50NjRfdCBjdXJHcmFudWxlUG9zaXRpb24gPSAwOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gX3JlYWROZXh0UGFja2V0KCZtQnVmLCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi9mYWxzZSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LICYmIGVyciAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEZpcnN0IHR3byBwYWdlcyBhcmUgaGVhZGVyIHBhZ2VzLgorICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNIHx8IG1DdXJyZW50UGFnZS5tUGFnZU5vID4gMikgeworICAgICAgICAgICAgICAgIGlmIChtQnVmICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUJ1Zi0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICBtQnVmID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXJHcmFudWxlUG9zaXRpb24gPSBtQ3VycmVudFBhZ2UubUdyYW51bGVQb3NpdGlvbjsKKyAgICAgICAgICAgIG51bVNhbXBsZXMgKz0gZ2V0TnVtU2FtcGxlc0luUGFja2V0KG1CdWYpOworICAgICAgICAgICAgbUJ1Zi0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUJ1ZiA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3VyR3JhbnVsZVBvc2l0aW9uID4gbnVtU2FtcGxlcykgeworICAgICAgICAgICAgbVN0YXJ0R3JhbnVsZVBvc2l0aW9uID0gY3VyR3JhbnVsZVBvc2l0aW9uIC0gbnVtU2FtcGxlczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TdGFydEdyYW51bGVQb3NpdGlvbiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgc2Vla1RvT2Zmc2V0KDApOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IF9yZWFkTmV4dFBhY2tldChvdXQsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqL2ZhbHNlKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50MzJfdCBjdXJyZW50UGFnZVNhbXBsZXM7CisgICAgLy8gQ2FsY3VsYXRlIHRpbWVzdGFtcHMgYnkgYWNjdW11bGF0aW5nIGR1cmF0aW9ucyBzdGFydGluZyBmcm9tIHRoZSBmaXJzdCBzYW1wbGUgb2YgYSBwYWdlOworICAgIC8vIFdlIGFzc3VtZSB0aGF0IHdlIG9ubHkgc2VlayB0byBwYWdlIGJvdW5kYXJpZXMuCisgICAgaWYgKCgqb3V0KS0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlWYWxpZFNhbXBsZXMsICZjdXJyZW50UGFnZVNhbXBsZXMpKSB7CisgICAgICAgIC8vIGZpcnN0IHBhY2tldCBpbiBwYWdlCisgICAgICAgIGlmIChtT2Zmc2V0ID09IG1GaXJzdERhdGFPZmZzZXQpIHsKKyAgICAgICAgICAgIGN1cnJlbnRQYWdlU2FtcGxlcyAtPSBtU3RhcnRHcmFudWxlUG9zaXRpb247CisgICAgICAgICAgICAoKm91dCktPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlWYWxpZFNhbXBsZXMsIGN1cnJlbnRQYWdlU2FtcGxlcyk7CisgICAgICAgIH0KKyAgICAgICAgbUN1ckdyYW51bGVQb3NpdGlvbiA9IG1DdXJyZW50UGFnZS5tR3JhbnVsZVBvc2l0aW9uIC0gY3VycmVudFBhZ2VTYW1wbGVzOworICAgIH0KKworICAgIGludDY0X3QgdGltZVVzID0gZ2V0VGltZVVzT2ZHcmFudWxlKG1DdXJHcmFudWxlUG9zaXRpb24pOworICAgICgqb3V0KS0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisKKyAgICB1aW50MzJfdCBmcmFtZXMgPSBnZXROdW1TYW1wbGVzSW5QYWNrZXQoKm91dCk7CisgICAgbUN1ckdyYW51bGVQb3NpdGlvbiArPSBmcmFtZXM7CisgICAgcmV0dXJuIE9LOworfQorCit1aW50MzJfdCBNeU9wdXNFeHRyYWN0b3I6OmdldE51bVNhbXBsZXNJblBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgY29uc3QgeworICAgIGlmIChidWZmZXIgPT0gTlVMTCB8fCBidWZmZXItPnJhbmdlX2xlbmd0aCgpIDwgMSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB1aW50OF90ICpkYXRhID0gKHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CisgICAgdWludDhfdCB0b2MgPSBkYXRhWzBdOworICAgIHVpbnQ4X3QgY29uZmlnID0gKHRvYyA+PiAzKSAmIDB4MWY7CisgICAgdWludDMyX3QgZnJhbWVTaXplc1VzW10gPSB7CisgICAgICAgIDEwMDAwLCAyMDAwMCwgNDAwMDAsIDYwMDAwLCAvLyAwLi4uMworICAgICAgICAxMDAwMCwgMjAwMDAsIDQwMDAwLCA2MDAwMCwgLy8gNC4uLjcKKyAgICAgICAgMTAwMDAsIDIwMDAwLCA0MDAwMCwgNjAwMDAsIC8vIDguLi4xMQorICAgICAgICAxMDAwMCwgMjAwMDAsICAgICAgICAgICAgICAgLy8gMTIuLi4xMworICAgICAgICAxMDAwMCwgMjAwMDAsICAgICAgICAgICAgICAgLy8gMTQuLi4xNQorICAgICAgICAyNTAwLCA1MDAwLCAxMDAwMCwgMjAwMDAsICAgLy8gMTYuLi4xOQorICAgICAgICAyNTAwLCA1MDAwLCAxMDAwMCwgMjAwMDAsICAgLy8gMjAuLi4yMworICAgICAgICAyNTAwLCA1MDAwLCAxMDAwMCwgMjAwMDAsICAgLy8gMjQuLi4yNworICAgICAgICAyNTAwLCA1MDAwLCAxMDAwMCwgMjAwMDAgICAgLy8gMjguLi4zMQorICAgIH07CisgICAgdWludDMyX3QgZnJhbWVTaXplVXMgPSBmcmFtZVNpemVzVXNbY29uZmlnXTsKKworICAgIHVpbnQzMl90IG51bUZyYW1lczsKKyAgICB1aW50OF90IGMgPSB0b2MgJiAzOworICAgIHN3aXRjaCAoYykgeworICAgIGNhc2UgMDoKKyAgICAgICAgbnVtRnJhbWVzID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgIGNhc2UgMjoKKyAgICAgICAgbnVtRnJhbWVzID0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBpZiAoYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA8IDMpIHsKKyAgICAgICAgICAgIG51bUZyYW1lcyA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBudW1GcmFtZXMgPSBkYXRhWzJdICYgMHgzZjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBUUkVTUEFTUygpOworICAgIH0KKworICAgIHVpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZVNpemVVcyAqIG51bUZyYW1lcyAqIGtPcHVzU2FtcGxlUmF0ZSAvIDEwMDAwMDA7CisgICAgcmV0dXJuIG51bVNhbXBsZXM7Cit9CisKK3N0YXR1c190IE15T2dnRXh0cmFjdG9yOjpfcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBib29sIGNhbGNWb3JiaXNUaW1lc3RhbXApIHsKKyAgICAqb3V0ID0gTlVMTDsKKworICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyID0gTlVMTDsKKyAgICBpbnQ2NF90IHRpbWVVcyA9IC0xOworCisgICAgZm9yICg7OykgeworICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgc2l6ZV90IHBhY2tldFNpemUgPSAwOworICAgICAgICBib29sIGdvdEZ1bGxQYWNrZXQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpID0gbU5leHRMYWNlSW5kZXg7IGkgPCBtQ3VycmVudFBhZ2UubU51bVNlZ21lbnRzOyArK2kpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbGFjZSA9IG1DdXJyZW50UGFnZS5tTGFjZVtpXTsKKworICAgICAgICAgICAgcGFja2V0U2l6ZSArPSBsYWNlOworCisgICAgICAgICAgICBpZiAobGFjZSA8IDI1NSkgeworICAgICAgICAgICAgICAgIGdvdEZ1bGxQYWNrZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtTmV4dExhY2VJbmRleCA8IG1DdXJyZW50UGFnZS5tTnVtU2VnbWVudHMpIHsKKyAgICAgICAgICAgIG9mZjY0X3QgZGF0YU9mZnNldCA9IG1PZmZzZXQgKyAyNyArIG1DdXJyZW50UGFnZS5tTnVtU2VnbWVudHM7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1OZXh0TGFjZUluZGV4OyArK2opIHsKKyAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0ICs9IG1DdXJyZW50UGFnZS5tTGFjZVtqXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2l6ZV90IGZ1bGxTaXplID0gcGFja2V0U2l6ZTsKKyAgICAgICAgICAgIGlmIChidWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGZ1bGxTaXplICs9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZnVsbFNpemUgPiAxNiAqIDEwMjQgKiAxMDI0KSB7IC8vIGFyYml0cmFyeSBsaW1pdCBvZiAxNiBNQiBwYWNrZXQgc2l6ZQorICAgICAgICAgICAgICAgIGlmIChidWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR0UoImIvMzY1OTIyMDIiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICp0bXAgPSBNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShmdWxsU2l6ZSk7CisgICAgICAgICAgICBpZiAodG1wID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dFKCJiLzM2NTkyMjAyIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChidWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1lbWNweSh0bXAtPmRhdGEoKSwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIHRtcC0+c2V0X3JhbmdlKDAsIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0bXAtPnNldF9yYW5nZSgwLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlciA9IHRtcDsKKworICAgICAgICAgICAgc3NpemVfdCBuID0gbVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAodWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgcGFja2V0U2l6ZSk7CisKKyAgICAgICAgICAgIGlmIChuIDwgKHNzaXplX3QpcGFja2V0U2l6ZSkgeworICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIEFMT0dWKCJmYWlsZWQgdG8gcmVhZCAlenUgYnl0ZXMgYXQgJSMwMTZsbHgsIGdvdCAlemQgYnl0ZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0U2l6ZSwgKGxvbmcgbG9uZylkYXRhT2Zmc2V0LCBuKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIGZ1bGxTaXplKTsKKworICAgICAgICAgICAgbU5leHRMYWNlSW5kZXggPSBpOworCisgICAgICAgICAgICBpZiAoZ290RnVsbFBhY2tldCkgeworICAgICAgICAgICAgICAgIC8vIFdlJ3ZlIGp1c3QgcmVhZCB0aGUgZW50aXJlIHBhY2tldC4KKworICAgICAgICAgICAgICAgIGlmIChtRmlyc3RQYWNrZXRJblBhZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VmFsaWRTYW1wbGVzLCBtQ3VycmVudFBhZ2VTYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgbUZpcnN0UGFja2V0SW5QYWdlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGNhbGNWb3JiaXNUaW1lc3RhbXApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjdXJCbG9ja1NpemUgPSBnZXRQYWNrZXRCbG9ja1NpemUoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50UGFnZS5tUHJldlBhY2tldFNpemUgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFBhZ2UubVByZXZQYWNrZXRTaXplID0gY3VyQmxvY2tTaXplOworICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRQYWdlLm1QcmV2UGFja2V0UG9zID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRQYWdlLm1HcmFudWxlUG9zaXRpb24gLSBtQ3VycmVudFBhZ2VTYW1wbGVzOworICAgICAgICAgICAgICAgICAgICAgICAgdGltZVVzID0gbUN1cnJlbnRQYWdlLm1QcmV2UGFja2V0UG9zICogMTAwMDAwMGxsIC8gbVZpLnJhdGU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZWZmZWN0aXZlIGJsb2NrIHNpemUgaXMgdGhlIGF2ZXJhZ2Ugb2YgdGhlIHR3byBvdmVybGFwcGVkIGJsb2NrcworICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBhY3R1YWxCbG9ja1NpemUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3VyQmxvY2tTaXplICsgbUN1cnJlbnRQYWdlLm1QcmV2UGFja2V0U2l6ZSkgLyAyOworICAgICAgICAgICAgICAgICAgICAgICAgdGltZVVzID0gbUN1cnJlbnRQYWdlLm1QcmV2UGFja2V0UG9zICogMTAwMDAwMGxsIC8gbVZpLnJhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgYWN0dWFsIHNpemUgb3V0cHV0IGJ5IHRoZSBkZWNvZGVyIHdpbGwgYmUgaGFsZiB0aGUgZWZmZWN0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaXplLCBkdWUgdG8gdGhlIG92ZXJsYXAKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50UGFnZS5tUHJldlBhY2tldFBvcyArPSBhY3R1YWxCbG9ja1NpemUgLyAyOworICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRQYWdlLm1QcmV2UGFja2V0U2l6ZSA9IGN1ckJsb2NrU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqb3V0ID0gYnVmZmVyOworCisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gsIHRoZSBidWZmZXIgbm93IGNvbnRhaW5zIHRoZSBzdGFydCBvZiB0aGUgcGFja2V0LgorICAgICAgICB9CisKKyAgICAgICAgQ0hFQ0tfRVEobU5leHRMYWNlSW5kZXgsIG1DdXJyZW50UGFnZS5tTnVtU2VnbWVudHMpOworCisgICAgICAgIG1PZmZzZXQgKz0gbUN1cnJlbnRQYWdlU2l6ZTsKKyAgICAgICAgc3NpemVfdCBuID0gcmVhZFBhZ2UobU9mZnNldCwgJm1DdXJyZW50UGFnZSk7CisKKyAgICAgICAgaWYgKG4gPD0gMCkgeworICAgICAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFMT0dWKCJyZWFkUGFnZSByZXR1cm5lZCAlemQiLCBuKTsKKworICAgICAgICAgICAgcmV0dXJuIG4gPCAwID8gbiA6IChzdGF0dXNfdClFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJldmVudCBhIGhhcm1sZXNzIHVuc2lnbmVkIGludGVnZXIgb3ZlcmZsb3cgYnkgY2xhbXBpbmcgdG8gMAorICAgICAgICBpZiAobUN1cnJlbnRQYWdlLm1HcmFudWxlUG9zaXRpb24gPj0gbVByZXZHcmFudWxlUG9zaXRpb24pIHsKKyAgICAgICAgICAgIG1DdXJyZW50UGFnZVNhbXBsZXMgPQorICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFBhZ2UubUdyYW51bGVQb3NpdGlvbiAtIG1QcmV2R3JhbnVsZVBvc2l0aW9uOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUN1cnJlbnRQYWdlU2FtcGxlcyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgbUZpcnN0UGFja2V0SW5QYWdlID0gdHJ1ZTsKKworICAgICAgICBtUHJldkdyYW51bGVQb3NpdGlvbiA9IG1DdXJyZW50UGFnZS5tR3JhbnVsZVBvc2l0aW9uOworCisgICAgICAgIG1DdXJyZW50UGFnZVNpemUgPSBuOworICAgICAgICBtTmV4dExhY2VJbmRleCA9IDA7CisKKyAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoKG1DdXJyZW50UGFnZS5tRmxhZ3MgJiAxKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBwYWdlIGRvZXMgbm90IGNvbnRpbnVlIHRoZSBwYWNrZXQsIGkuZS4gdGhlIHBhY2tldAorICAgICAgICAgICAgICAgIC8vIGlzIGFscmVhZHkgY29tcGxldGUuCisKKyAgICAgICAgICAgICAgICBpZiAodGltZVVzID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKAorICAgICAgICAgICAgICAgICAgICAgICAga0tleVZhbGlkU2FtcGxlcywgbUN1cnJlbnRQYWdlU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgbUZpcnN0UGFja2V0SW5QYWdlID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAqb3V0ID0gYnVmZmVyOworCisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBNeU9nZ0V4dHJhY3Rvcjo6aW5pdCgpIHsKKyAgICBtTWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbU1pbWVUeXBlKTsKKworICAgIHN0YXR1c190IGVycjsKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKnBhY2tldDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1IZWFkZXJzOyArK2kpIHsKKyAgICAgICAgLy8gaWdub3JlIHRpbWVzdGFtcCBmb3IgY29uZmlndXJhdGlvbiBwYWNrZXRzCisgICAgICAgIGlmICgoZXJyID0gX3JlYWROZXh0UGFja2V0KCZwYWNrZXQsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqLyBmYWxzZSkpICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJyZWFkIHBhY2tldCBvZiBzaXplICV6dVxuIiwgcGFja2V0LT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgIGVyciA9IHZlcmlmeUhlYWRlcihwYWNrZXQsIC8qIHR5cGUgPSAqLyBpICogMiArIDEpOworICAgICAgICBwYWNrZXQtPnJlbGVhc2UoKTsKKyAgICAgICAgcGFja2V0ID0gTlVMTDsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1GaXJzdERhdGFPZmZzZXQgPSBtT2Zmc2V0ICsgbUN1cnJlbnRQYWdlU2l6ZTsKKworICAgIG9mZjY0X3Qgc2l6ZTsKKyAgICB1aW50NjRfdCBsYXN0R3JhbnVsZVBvc2l0aW9uOworICAgIGlmICghKG1Tb3VyY2UtPmZsYWdzKCkgJiBEYXRhU291cmNlQmFzZTo6a0lzQ2FjaGluZ0RhdGFTb3VyY2UpCisgICAgICAgICAgICAmJiBtU291cmNlLT5nZXRTaXplKCZzaXplKSA9PSBPSworICAgICAgICAgICAgJiYgZmluZFByZXZHcmFudWxlUG9zaXRpb24oc2l6ZSwgJmxhc3RHcmFudWxlUG9zaXRpb24pID09IE9LKSB7CisgICAgICAgIC8vIExldCdzIGFzc3VtZSBpdCdzIGNoZWFwIHRvIHNlZWsgdG8gdGhlIGVuZC4KKyAgICAgICAgLy8gVGhlIGdyYW51bGUgcG9zaXRpb24gb2YgdGhlIGZpbmFsIHBhZ2UgaW4gdGhlIHN0cmVhbSB3aWxsCisgICAgICAgIC8vIGdpdmUgdXMgdGhlIGV4YWN0IGR1cmF0aW9uIG9mIHRoZSBjb250ZW50LCBzb21ldGhpbmcgdGhhdAorICAgICAgICAvLyB3ZSBjYW4gb25seSBhcHByb3hpbWF0ZSB1c2luZyBhdmcuIGJpdHJhdGUgaWYgc2Vla2luZyB0bworICAgICAgICAvLyB0aGUgZW5kIGlzIHRvbyBleHBlbnNpdmUgb3IgaW1wb3NzaWJsZSAobGl2ZSBzdHJlYW1pbmcpLgorCisgICAgICAgIGludDY0X3QgZHVyYXRpb25VcyA9IGdldFRpbWVVc09mR3JhbnVsZShsYXN0R3JhbnVsZVBvc2l0aW9uKTsKKworICAgICAgICBtTWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOworCisgICAgICAgIGJ1aWxkVGFibGVPZkNvbnRlbnRzKCk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIE15T2dnRXh0cmFjdG9yOjpidWlsZFRhYmxlT2ZDb250ZW50cygpIHsKKyAgICBvZmY2NF90IG9mZnNldCA9IG1GaXJzdERhdGFPZmZzZXQ7CisgICAgUGFnZSBwYWdlOworICAgIHNzaXplX3QgcGFnZVNpemU7CisgICAgd2hpbGUgKChwYWdlU2l6ZSA9IHJlYWRQYWdlKG9mZnNldCwgJnBhZ2UpKSA+IDApIHsKKyAgICAgICAgbVRhYmxlT2ZDb250ZW50cy5wdXNoKCk7CisKKyAgICAgICAgVE9DRW50cnkgJmVudHJ5ID0KKyAgICAgICAgICAgIG1UYWJsZU9mQ29udGVudHMuZWRpdEl0ZW1BdChtVGFibGVPZkNvbnRlbnRzLnNpemUoKSAtIDEpOworCisgICAgICAgIGVudHJ5Lm1QYWdlT2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICBlbnRyeS5tVGltZVVzID0gZ2V0VGltZVVzT2ZHcmFudWxlKHBhZ2UubUdyYW51bGVQb3NpdGlvbik7CisKKyAgICAgICAgb2Zmc2V0ICs9IChzaXplX3QpcGFnZVNpemU7CisgICAgfQorCisgICAgLy8gTGltaXQgdGhlIG1heGltdW0gYW1vdW50IG9mIFJBTSB3ZSBzcGVuZCBvbiB0aGUgdGFibGUgb2YgY29udGVudHMsCisgICAgLy8gaWYgbmVjZXNzYXJ5IHRoaW4gb3V0IHRoZSB0YWJsZSBldmVubHkgdG8gdHJpbSBpdCBkb3duIHRvIG1heGltdW0KKyAgICAvLyBzaXplLgorCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4VE9DU2l6ZSA9IDgxOTI7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4TnVtVE9DRW50cmllcyA9IGtNYXhUT0NTaXplIC8gc2l6ZW9mKFRPQ0VudHJ5KTsKKworICAgIHNpemVfdCBudW1lcmF0b3IgPSBtVGFibGVPZkNvbnRlbnRzLnNpemUoKTsKKworICAgIGlmIChudW1lcmF0b3IgPiBrTWF4TnVtVE9DRW50cmllcykgeworICAgICAgICBzaXplX3QgZGVub20gPSBudW1lcmF0b3IgLSBrTWF4TnVtVE9DRW50cmllczsKKworICAgICAgICBzaXplX3QgYWNjdW0gPSAwOworICAgICAgICBmb3IgKHNzaXplX3QgaSA9IG1UYWJsZU9mQ29udGVudHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgICAgIGFjY3VtICs9IGRlbm9tOworICAgICAgICAgICAgaWYgKGFjY3VtID49IG51bWVyYXRvcikgeworICAgICAgICAgICAgICAgIG1UYWJsZU9mQ29udGVudHMucmVtb3ZlQXQoaSk7CisgICAgICAgICAgICAgICAgYWNjdW0gLT0gbnVtZXJhdG9yOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitpbnQzMl90IE15T2dnRXh0cmFjdG9yOjpnZXRQYWNrZXRCbG9ja1NpemUoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIHsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0KKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CisKKyAgICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CisKKyAgICBvZ2dfYnVmZmVyIGJ1ZjsKKyAgICBidWYuZGF0YSA9ICh1aW50OF90ICopZGF0YTsKKyAgICBidWYuc2l6ZSA9IHNpemU7CisgICAgYnVmLnJlZmNvdW50ID0gMTsKKyAgICBidWYucHRyLm93bmVyID0gTlVMTDsKKworICAgIG9nZ19yZWZlcmVuY2UgcmVmOworICAgIHJlZi5idWZmZXIgPSAmYnVmOworICAgIHJlZi5iZWdpbiA9IDA7CisgICAgcmVmLmxlbmd0aCA9IHNpemU7CisgICAgcmVmLm5leHQgPSBOVUxMOworCisgICAgb2dnX3BhY2tldCBwYWNrOworICAgIHBhY2sucGFja2V0ID0gJnJlZjsKKyAgICBwYWNrLmJ5dGVzID0gcmVmLmxlbmd0aDsKKyAgICBwYWNrLmJfb19zID0gMDsKKyAgICBwYWNrLmVfb19zID0gMDsKKyAgICBwYWNrLmdyYW51bGVwb3MgPSAwOworICAgIHBhY2sucGFja2V0bm8gPSAwOworCisgICAgcmV0dXJuIHZvcmJpc19wYWNrZXRfYmxvY2tzaXplKCZtVmksICZwYWNrKTsKK30KKworaW50NjRfdCBNeU9wdXNFeHRyYWN0b3I6OmdldFRpbWVVc09mR3JhbnVsZSh1aW50NjRfdCBncmFudWxlUG9zKSBjb25zdCB7CisgICAgdWludDY0X3QgcGNtU2FtcGxlUG9zaXRpb24gPSAwOworICAgIGlmIChncmFudWxlUG9zID4gbUNvZGVjRGVsYXkpIHsKKyAgICAgICAgcGNtU2FtcGxlUG9zaXRpb24gPSBncmFudWxlUG9zIC0gbUNvZGVjRGVsYXk7CisgICAgfQorICAgIGlmIChwY21TYW1wbGVQb3NpdGlvbiA+IElOVDY0X01BWCAvIDEwMDAwMDBsbCkgeworICAgICAgICByZXR1cm4gSU5UNjRfTUFYOworICAgIH0KKyAgICByZXR1cm4gcGNtU2FtcGxlUG9zaXRpb24gKiAxMDAwMDAwbGwgLyBrT3B1c1NhbXBsZVJhdGU7Cit9CisKK3N0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6dmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLCB1aW50OF90IHR5cGUpIHsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgLy8gdGhlcmUgYXJlIGFjdHVhbGx5IG5vIGhlYWRlciB0eXBlcyBkZWZpbmVkIGluIHRoZSBPcHVzIHNwZWM7IHdlIGNob29zZSAxIGFuZCAzIHRvIG1lYW4KKyAgICAgICAgLy8gaGVhZGVyIGFuZCBjb21tZW50cyBzdWNoIHRoYXQgd2UgY2FuIHNoYXJlIGNvZGUgd2l0aCBNeVZvcmJpc0V4dHJhY3Rvci4KKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgcmV0dXJuIHZlcmlmeU9wdXNIZWFkZXIoYnVmZmVyKTsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgcmV0dXJuIHZlcmlmeU9wdXNDb21tZW50cyhidWZmZXIpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KK30KKworc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjp2ZXJpZnlPcHVzSGVhZGVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSB7CisgICAgY29uc3Qgc2l6ZV90IGtPcHVzSGVhZGVyU2l6ZSA9IDE5OworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPQorICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKKworICAgIHNpemVfdCBzaXplID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKworICAgIGlmIChzaXplIDwga09wdXNIZWFkZXJTaXplCisgICAgICAgICAgICB8fCBtZW1jbXAoZGF0YSwgIk9wdXNIZWFkIiwgOCkKKyAgICAgICAgICAgIHx8IC8qIHZlcnNpb24gPSAqLyBkYXRhWzhdICE9IDEpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBtQ2hhbm5lbENvdW50ID0gZGF0YVs5XTsKKyAgICBtQ29kZWNEZWxheSA9IFUxNkxFX0FUKCZkYXRhWzEwXSk7CisKKyAgICBtTWV0YS5zZXREYXRhKGtLZXlPcHVzSGVhZGVyLCAwLCBkYXRhLCBzaXplKTsKKyAgICBtTWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwga09wdXNTYW1wbGVSYXRlKTsKKyAgICBtTWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBtQ2hhbm5lbENvdW50KTsKKyAgICBtTWV0YS5zZXRJbnQ2NChrS2V5T3B1c1NlZWtQcmVSb2xsIC8qIG5zICovLCBrT3B1c1NlZWtQcmVSb2xsVXMgKiAxMDAwIC8qID0gODAgbXMqLyk7CisgICAgbU1ldGEuc2V0SW50NjQoa0tleU9wdXNDb2RlY0RlbGF5IC8qIG5zICovLAorICAgICAgICAgICAgbUNvZGVjRGVsYXkgLyogc2FtcGxlL3MgKi8gKiAxMDAwMDAwMDAwbGwgLyBrT3B1c1NhbXBsZVJhdGUpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnZlcmlmeU9wdXNDb21tZW50cyhNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgeworICAgIC8vIGFkZCBhcnRpZmljaWFsIGZyYW1pbmcgYml0IHNvIHdlIGNhbiByZXVzZSBfdm9yYmlzX3VucGFja19jb21tZW50CisgICAgaW50MzJfdCBjb21tZW50U2l6ZSA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgKyAxOworICAgIGF1dG8gdG1wID0gaGVhcGJ1ZmZlcjx1aW50OF90Pihjb21tZW50U2l6ZSk7CisgICAgdWludDhfdCAqY29tbWVudERhdGEgPSB0bXAuZ2V0KCk7CisgICAgaWYgKGNvbW1lbnREYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBtZW1jcHkoY29tbWVudERhdGEsCisgICAgICAgICAgICAodWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworCisgICAgb2dnX2J1ZmZlciBidWY7CisgICAgYnVmLmRhdGEgPSBjb21tZW50RGF0YTsKKyAgICBidWYuc2l6ZSA9IGNvbW1lbnRTaXplOworICAgIGJ1Zi5yZWZjb3VudCA9IDE7CisgICAgYnVmLnB0ci5vd25lciA9IE5VTEw7CisKKyAgICBvZ2dfcmVmZXJlbmNlIHJlZjsKKyAgICByZWYuYnVmZmVyID0gJmJ1ZjsKKyAgICByZWYuYmVnaW4gPSAwOworICAgIHJlZi5sZW5ndGggPSBjb21tZW50U2l6ZTsKKyAgICByZWYubmV4dCA9IE5VTEw7CisKKyAgICBvZ2dwYWNrX2J1ZmZlciBiaXRzOworICAgIG9nZ3BhY2tfcmVhZGluaXQoJmJpdHMsICZyZWYpOworCisgICAgLy8gc2tpcCAnT3B1c1RhZ3MnCisgICAgY29uc3QgY2hhciAqT3B1c1RhZ3MgPSAiT3B1c1RhZ3MiOworICAgIGNvbnN0IGludDMyX3QgaGVhZGVyTGVuID0gc3RybGVuKE9wdXNUYWdzKTsKKyAgICBpbnQzMl90IGZyYW1pbmdCaXRPZmZzZXQgPSBoZWFkZXJMZW47CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoZWFkZXJMZW47ICsraSkgeworICAgICAgICBjaGFyIGNociA9IG9nZ3BhY2tfcmVhZCgmYml0cywgOCk7CisgICAgICAgIGlmIChjaHIgIT0gT3B1c1RhZ3NbaV0pIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQzMl90IHZlbmRvckxlbiA9IG9nZ3BhY2tfcmVhZCgmYml0cywgMzIpOworICAgIGZyYW1pbmdCaXRPZmZzZXQgKz0gNDsKKyAgICBpZiAodmVuZG9yTGVuIDwgMCB8fCB2ZW5kb3JMZW4gPiBjb21tZW50U2l6ZSAtIDgpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgLy8gc2tpcCB2ZW5kb3Igc3RyaW5nCisgICAgZnJhbWluZ0JpdE9mZnNldCArPSB2ZW5kb3JMZW47CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2ZW5kb3JMZW47ICsraSkgeworICAgICAgICBvZ2dwYWNrX3JlYWQoJmJpdHMsIDgpOworICAgIH0KKworICAgIGludDMyX3QgbiA9IG9nZ3BhY2tfcmVhZCgmYml0cywgMzIpOworICAgIGZyYW1pbmdCaXRPZmZzZXQgKz0gNDsKKyAgICBpZiAobiA8IDAgfHwgbiA+ICgoY29tbWVudFNpemUgLSBvZ2dwYWNrX2J5dGVzKCZiaXRzKSkgPj4gMikpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgaW50MzJfdCBsZW4gPSBvZ2dwYWNrX3JlYWQoJmJpdHMsIDMyKTsKKyAgICAgICAgZnJhbWluZ0JpdE9mZnNldCArPSA0OworICAgICAgICBpZiAobGVuICA8IDAgfHwgbGVuICA+IChjb21tZW50U2l6ZSAtIG9nZ3BhY2tfYnl0ZXMoJmJpdHMpKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICBmcmFtaW5nQml0T2Zmc2V0ICs9IGxlbjsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsZW47ICsraikgeworICAgICAgICAgICAgb2dncGFja19yZWFkKCZiaXRzLCA4KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZnJhbWluZ0JpdE9mZnNldCA8IDAgfHwgZnJhbWluZ0JpdE9mZnNldCA+PSBjb21tZW50U2l6ZSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICBjb21tZW50RGF0YVtmcmFtaW5nQml0T2Zmc2V0XSA9IDE7CisKKyAgICBidWYuZGF0YSA9IGNvbW1lbnREYXRhICsgaGVhZGVyTGVuOworICAgIGJ1Zi5zaXplID0gY29tbWVudFNpemUgLSBoZWFkZXJMZW47CisgICAgYnVmLnJlZmNvdW50ID0gMTsKKyAgICBidWYucHRyLm93bmVyID0gTlVMTDsKKworICAgIHJlZi5idWZmZXIgPSAmYnVmOworICAgIHJlZi5iZWdpbiA9IDA7CisgICAgcmVmLmxlbmd0aCA9IGNvbW1lbnRTaXplIC0gaGVhZGVyTGVuOworICAgIHJlZi5uZXh0ID0gTlVMTDsKKworICAgIG9nZ3BhY2tfcmVhZGluaXQoJmJpdHMsICZyZWYpOworICAgIGludCBlcnIgPSBfdm9yYmlzX3VucGFja19jb21tZW50KCZtVmMsICZiaXRzKTsKKyAgICBpZiAoMCAhPSBlcnIpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBwYXJzZUZpbGVNZXRhRGF0YSgpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTXlWb3JiaXNFeHRyYWN0b3I6OnZlcmlmeUhlYWRlcigKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIsIHVpbnQ4X3QgdHlwZSkgeworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPQorICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKKworICAgIHNpemVfdCBzaXplID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKworICAgIGlmIChzaXplIDwgNyB8fCBkYXRhWzBdICE9IHR5cGUgfHwgbWVtY21wKCZkYXRhWzFdLCAidm9yYmlzIiwgNikpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBvZ2dfYnVmZmVyIGJ1ZjsKKyAgICBidWYuZGF0YSA9ICh1aW50OF90ICopZGF0YTsKKyAgICBidWYuc2l6ZSA9IHNpemU7CisgICAgYnVmLnJlZmNvdW50ID0gMTsKKyAgICBidWYucHRyLm93bmVyID0gTlVMTDsKKworICAgIG9nZ19yZWZlcmVuY2UgcmVmOworICAgIHJlZi5idWZmZXIgPSAmYnVmOworICAgIHJlZi5iZWdpbiA9IDA7CisgICAgcmVmLmxlbmd0aCA9IHNpemU7CisgICAgcmVmLm5leHQgPSBOVUxMOworCisgICAgb2dncGFja19idWZmZXIgYml0czsKKyAgICBvZ2dwYWNrX3JlYWRpbml0KCZiaXRzLCAmcmVmKTsKKworICAgIGlmIChvZ2dwYWNrX3JlYWQoJmJpdHMsIDgpICE9IHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA2OyArK2kpIHsKKyAgICAgICAgb2dncGFja19yZWFkKCZiaXRzLCA4KTsgIC8vIHNraXAgJ3ZvcmJpcycKKyAgICB9CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoMCAhPSBfdm9yYmlzX3VucGFja19pbmZvKCZtVmksICZiaXRzKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1NZXRhLnNldERhdGEoa0tleVZvcmJpc0luZm8sIDAsIGRhdGEsIHNpemUpOworICAgICAgICAgICAgbU1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1WaS5yYXRlKTsKKyAgICAgICAgICAgIG1NZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG1WaS5jaGFubmVscyk7CisgICAgICAgICAgICBtTWV0YS5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgbVZpLmJpdHJhdGVfbm9taW5hbCk7CisKKyAgICAgICAgICAgIEFMT0dWKCJsb3dlci1iaXRyYXRlID0gJWxkIiwgbVZpLmJpdHJhdGVfbG93ZXIpOworICAgICAgICAgICAgQUxPR1YoInVwcGVyLWJpdHJhdGUgPSAlbGQiLCBtVmkuYml0cmF0ZV91cHBlcik7CisgICAgICAgICAgICBBTE9HVigibm9taW5hbC1iaXRyYXRlID0gJWxkIiwgbVZpLmJpdHJhdGVfbm9taW5hbCk7CisgICAgICAgICAgICBBTE9HVigid2luZG93LWJpdHJhdGUgPSAlbGQiLCBtVmkuYml0cmF0ZV93aW5kb3cpOworICAgICAgICAgICAgQUxPR1YoImJsb2Nrc2l6ZXM6ICVkLyVkIiwKKyAgICAgICAgICAgICAgICAgICAgdm9yYmlzX2luZm9fYmxvY2tzaXplKCZtVmksIDApLAorICAgICAgICAgICAgICAgICAgICB2b3JiaXNfaW5mb19ibG9ja3NpemUoJm1WaSwgMSkKKyAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgb2ZmNjRfdCBzaXplOworICAgICAgICAgICAgaWYgKG1Tb3VyY2UtPmdldFNpemUoJnNpemUpID09IE9LKSB7CisgICAgICAgICAgICAgICAgdWludDY0X3QgYnBzID0gYXBwcm94Qml0cmF0ZSgpOworICAgICAgICAgICAgICAgIGlmIChicHMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtTWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIHNpemUgKiA4MDAwMDAwbGwgLyBicHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSAzOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoMCAhPSBfdm9yYmlzX3VucGFja19jb21tZW50KCZtVmMsICZiaXRzKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBhcnNlRmlsZU1ldGFEYXRhKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgNToKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKDAgIT0gX3ZvcmJpc191bnBhY2tfYm9va3MoJm1WaSwgJmJpdHMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbU1ldGEuc2V0RGF0YShrS2V5Vm9yYmlzQm9va3MsIDAsIGRhdGEsIHNpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3VpbnQ2NF90IE15Vm9yYmlzRXh0cmFjdG9yOjphcHByb3hCaXRyYXRlKCkgY29uc3QgeworICAgIGlmIChtVmkuYml0cmF0ZV9ub21pbmFsICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1WaS5iaXRyYXRlX25vbWluYWw7CisgICAgfQorCisgICAgcmV0dXJuIChtVmkuYml0cmF0ZV9sb3dlciArIG1WaS5iaXRyYXRlX3VwcGVyKSAvIDI7Cit9CisKKwordm9pZCBNeU9nZ0V4dHJhY3Rvcjo6cGFyc2VGaWxlTWV0YURhdGEoKSB7CisgICAgbUZpbGVNZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfT0dHKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVZjLmNvbW1lbnRzOyArK2kpIHsKKyAgICAgICAgY29uc3QgY2hhciAqY29tbWVudCA9IG1WYy51c2VyX2NvbW1lbnRzW2ldOworICAgICAgICBzaXplX3QgY29tbWVudExlbmd0aCA9IG1WYy5jb21tZW50X2xlbmd0aHNbaV07CisgICAgICAgIHBhcnNlVm9yYmlzQ29tbWVudCgmbUZpbGVNZXRhLCBjb21tZW50LCBjb21tZW50TGVuZ3RoKTsKKyAgICAgICAgLy9BTE9HSSgiY29tbWVudCAjJWQ6ICclcyciLCBpICsgMSwgbVZjLnVzZXJfY29tbWVudHNbaV0pOworICAgIH0KK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitPZ2dFeHRyYWN0b3I6Ok9nZ0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKKyAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCisgICAgICBtSW1wbChOVUxMKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAgICAgaWYgKG1JbXBsICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBtSW1wbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICBtSW1wbCA9IG5ldyBNeVZvcmJpc0V4dHJhY3RvcihtRGF0YVNvdXJjZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSW1wbCA9IG5ldyBNeU9wdXNFeHRyYWN0b3IobURhdGFTb3VyY2UpOworICAgICAgICB9CisgICAgICAgIG1Jbml0Q2hlY2sgPSBtSW1wbC0+c2Vla1RvT2Zmc2V0KDApOworCisgICAgICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7CisgICAgICAgICAgICBtSW5pdENoZWNrID0gbUltcGwtPmluaXQoKTsKKyAgICAgICAgICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK09nZ0V4dHJhY3Rvcjo6fk9nZ0V4dHJhY3RvcigpIHsKKyAgICBkZWxldGUgbUltcGw7CisgICAgbUltcGwgPSBOVUxMOworfQorCitzaXplX3QgT2dnRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKKyAgICByZXR1cm4gbUluaXRDaGVjayAhPSBPSyA/IDAgOiAxOworfQorCitNZWRpYVRyYWNrICpPZ2dFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworICAgIGlmIChpbmRleCA+PSAxKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBuZXcgT2dnU291cmNlKHRoaXMpOworfQorCitzdGF0dXNfdCBPZ2dFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgeworICAgIGlmIChpbmRleCA+PSAxKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBtSW1wbC0+Z2V0Rm9ybWF0KG1ldGEpOworfQorCitzdGF0dXNfdCBPZ2dFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgeworICAgIHJldHVybiBtSW1wbC0+Z2V0RmlsZU1ldGFEYXRhKG1ldGEpOworfQorCitzdGF0aWMgTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcigKKyAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICAgICAgdm9pZCAqKSB7CisgICAgcmV0dXJuIG5ldyBPZ2dFeHRyYWN0b3Ioc291cmNlKTsKK30KKworc3RhdGljIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBTbmlmZigKKyAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgIHZvaWQgKiosCisgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKikgeworICAgIGNoYXIgdG1wWzRdOworICAgIGlmIChzb3VyY2UtPnJlYWRBdCgwLCB0bXAsIDQpIDwgNCB8fCBtZW1jbXAodG1wLCAiT2dnUyIsIDQpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgICpjb25maWRlbmNlID0gMC4yZjsKKworICAgIHJldHVybiBDcmVhdGVFeHRyYWN0b3I7Cit9CisKK2V4dGVybiAiQyIgeworLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAorX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQorTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CisgICAgcmV0dXJuIHsKKyAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICBVVUlEKCI4Y2M1Y2QwNi1mNzcyLTQ5NWUtOGE2Mi1jYmE5NjQ5Mzc0ZTkiKSwKKyAgICAgICAgMSwgLy8gdmVyc2lvbgorICAgICAgICAiT2dnIEV4dHJhY3RvciIsCisgICAgICAgIFNuaWZmCisgICAgfTsKK30KKworfSAvLyBleHRlcm4gIkMiCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL29nZy9PZ2dFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZTI5NDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL29nZy9PZ2dFeHRyYWN0b3IuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBPR0dfRVhUUkFDVE9SX0hfCisKKyNkZWZpbmUgT0dHX0VYVFJBQ1RPUl9IXworCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQU1lc3NhZ2U7CitjbGFzcyBEYXRhU291cmNlQmFzZTsKK2NsYXNzIFN0cmluZzg7CisKK3N0cnVjdCBNeU9nZ0V4dHJhY3RvcjsKK3N0cnVjdCBPZ2dTb3VyY2U7CisKK3N0cnVjdCBPZ2dFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworICAgIGV4cGxpY2l0IE9nZ0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKworICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiT2dnRXh0cmFjdG9yIjsgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+T2dnRXh0cmFjdG9yKCk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBPZ2dTb3VyY2U7CisKKyAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKworICAgIE15T2dnRXh0cmFjdG9yICptSW1wbDsKKworICAgIE9nZ0V4dHJhY3Rvcihjb25zdCBPZ2dFeHRyYWN0b3IgJik7CisgICAgT2dnRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgT2dnRXh0cmFjdG9yICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBPR0dfRVhUUkFDVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL29nZy9leHBvcnRzLmxkcyBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMzA5ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL29nZy9leHBvcnRzLmxkcwpAQCAtMCwwICsxIEBACit7IGdsb2JhbDogR0VURVhUUkFDVE9SREVGOyBsb2NhbDogKjsgfTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NzkzM2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDIgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKworICAgIHNyY3M6IFsiV0FWRXh0cmFjdG9yLmNwcCJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmZpZm8iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgXSwKKworICAgIG5hbWU6ICJsaWJ3YXZleHRyYWN0b3IiLAorICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImV4dHJhY3RvcnMiLAorCisgICAgY29tcGlsZV9tdWx0aWxpYjogImZpcnN0IiwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKKyAgICBdLAorICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgZGlhZzogeworICAgICAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCisKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpjb3B5IHRvIG1lZGlhL2V4dHJhY3RvcnMvd2F2L01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL05PVElDRSBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL05PVElDRQpjb3B5IHRvIG1lZGlhL2V4dHJhY3RvcnMvd2F2L05PVElDRQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L1dBVkV4dHJhY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVhMWIwMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L1dBVkV4dHJhY3Rvci5jcHAKQEAgLTAsMCArMSw1OTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIldBVkV4dHJhY3RvciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIldBVkV4dHJhY3Rvci5oIgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8Y3V0aWxzL2JpdG9wcy5oPgorCisjZGVmaW5lIENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUiAwCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZW51bSB7CisgICAgV0FWRV9GT1JNQVRfUENNICAgICAgICA9IDB4MDAwMSwKKyAgICBXQVZFX0ZPUk1BVF9JRUVFX0ZMT0FUID0gMHgwMDAzLAorICAgIFdBVkVfRk9STUFUX0FMQVcgICAgICAgPSAweDAwMDYsCisgICAgV0FWRV9GT1JNQVRfTVVMQVcgICAgICA9IDB4MDAwNywKKyAgICBXQVZFX0ZPUk1BVF9NU0dTTSAgICAgID0gMHgwMDMxLAorICAgIFdBVkVfRk9STUFUX0VYVEVOU0lCTEUgPSAweEZGRkUKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKiBXQVZFRVhUX1NVQkZPUk1BVCA9ICJceDAwXHgwMFx4MDBceDAwXHgxMFx4MDBceDgwXHgwMFx4MDBceEFBXHgwMFx4MzhceDlCXHg3MSI7CitzdGF0aWMgY29uc3QgY2hhciogQU1CSVNPTklDX1NVQkZPUk1BVCA9ICJceDAwXHgwMFx4MjFceDA3XHhEM1x4MTFceDg2XHg0NFx4QzhceEMxXHhDQVx4MDBceDAwXHgwMCI7CisKK3N0YXRpYyB1aW50MzJfdCBVMzJfTEVfQVQoY29uc3QgdWludDhfdCAqcHRyKSB7CisgICAgcmV0dXJuIHB0clszXSA8PCAyNCB8IHB0clsyXSA8PCAxNiB8IHB0clsxXSA8PCA4IHwgcHRyWzBdOworfQorCitzdGF0aWMgdWludDE2X3QgVTE2X0xFX0FUKGNvbnN0IHVpbnQ4X3QgKnB0cikgeworICAgIHJldHVybiBwdHJbMV0gPDwgOCB8IHB0clswXTsKK30KKworc3RydWN0IFdBVlNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKKyAgICBXQVZTb3VyY2UoCisgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKKyAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgICAgIHVpbnQxNl90IHdhdmVGb3JtYXQsCisgICAgICAgICAgICBpbnQzMl90IGJpdHNQZXJTYW1wbGUsCisgICAgICAgICAgICBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydE5vbmJsb2NraW5nUmVhZCgpIHsgcmV0dXJuIHRydWU7IH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfldBVlNvdXJjZSgpOworCitwcml2YXRlOgorICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heEZyYW1lU2l6ZTsKKworICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBNZXRhRGF0YUJhc2UgJm1NZXRhOworICAgIHVpbnQxNl90IG1XYXZlRm9ybWF0OworICAgIGludDMyX3QgbVNhbXBsZVJhdGU7CisgICAgaW50MzJfdCBtTnVtQ2hhbm5lbHM7CisgICAgaW50MzJfdCBtQml0c1BlclNhbXBsZTsKKyAgICBvZmY2NF90IG1PZmZzZXQ7CisgICAgc2l6ZV90IG1TaXplOworICAgIGJvb2wgbVN0YXJ0ZWQ7CisgICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOworICAgIG9mZjY0X3QgbUN1cnJlbnRQb3M7CisKKyAgICBXQVZTb3VyY2UoY29uc3QgV0FWU291cmNlICYpOworICAgIFdBVlNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IFdBVlNvdXJjZSAmKTsKK307CisKK1dBVkV4dHJhY3Rvcjo6V0FWRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCisgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAorICAgICAgbVZhbGlkRm9ybWF0KGZhbHNlKSwKKyAgICAgIG1DaGFubmVsTWFzayhDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVIpIHsKKyAgICBtSW5pdENoZWNrID0gaW5pdCgpOworfQorCitXQVZFeHRyYWN0b3I6On5XQVZFeHRyYWN0b3IoKSB7Cit9CisKK3N0YXR1c190IFdBVkV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7CisgICAgbWV0YS5jbGVhcigpOworICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7CisgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9XQVYpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc2l6ZV90IFdBVkV4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7CisgICAgcmV0dXJuIG1Jbml0Q2hlY2sgPT0gT0sgPyAxIDogMDsKK30KKworTWVkaWFUcmFjayAqV0FWRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBXQVZTb3VyY2UoCisgICAgICAgICAgICBtRGF0YVNvdXJjZSwgbVRyYWNrTWV0YSwKKyAgICAgICAgICAgIG1XYXZlRm9ybWF0LCBtQml0c1BlclNhbXBsZSwgbURhdGFPZmZzZXQsIG1EYXRhU2l6ZSk7Cit9CisKK3N0YXR1c190IFdBVkV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggPiAwKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG1ldGEgPSBtVHJhY2tNZXRhOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgV0FWRXh0cmFjdG9yOjppbml0KCkgeworICAgIHVpbnQ4X3QgaGVhZGVyWzEyXTsKKyAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAwLCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKSA8IChzc2l6ZV90KXNpemVvZihoZWFkZXIpKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGlmIChtZW1jbXAoaGVhZGVyLCAiUklGRiIsIDQpIHx8IG1lbWNtcCgmaGVhZGVyWzhdLCAiV0FWRSIsIDQpKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHNpemVfdCB0b3RhbFNpemUgPSBVMzJfTEVfQVQoJmhlYWRlcls0XSk7CisKKyAgICBvZmY2NF90IG9mZnNldCA9IDEyOworICAgIHNpemVfdCByZW1haW5pbmdTaXplID0gdG90YWxTaXplOworICAgIHdoaWxlIChyZW1haW5pbmdTaXplID49IDgpIHsKKyAgICAgICAgdWludDhfdCBjaHVua0hlYWRlcls4XTsKKyAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBjaHVua0hlYWRlciwgOCkgPCA4KSB7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorCisgICAgICAgIHJlbWFpbmluZ1NpemUgLT0gODsKKyAgICAgICAgb2Zmc2V0ICs9IDg7CisKKyAgICAgICAgdWludDMyX3QgY2h1bmtTaXplID0gVTMyX0xFX0FUKCZjaHVua0hlYWRlcls0XSk7CisKKyAgICAgICAgaWYgKGNodW5rU2l6ZSA+IHJlbWFpbmluZ1NpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtZW1jbXAoY2h1bmtIZWFkZXIsICJmbXQgIiwgNCkpIHsKKyAgICAgICAgICAgIGlmIChjaHVua1NpemUgPCAxNikgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50OF90IGZvcm1hdFNwZWNbNDBdOworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBmb3JtYXRTcGVjLCAyKSA8IDIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVdhdmVGb3JtYXQgPSBVMTZfTEVfQVQoZm9ybWF0U3BlYyk7CisgICAgICAgICAgICBpZiAobVdhdmVGb3JtYXQgIT0gV0FWRV9GT1JNQVRfUENNCisgICAgICAgICAgICAgICAgICAgICYmIG1XYXZlRm9ybWF0ICE9IFdBVkVfRk9STUFUX0lFRUVfRkxPQVQKKyAgICAgICAgICAgICAgICAgICAgJiYgbVdhdmVGb3JtYXQgIT0gV0FWRV9GT1JNQVRfQUxBVworICAgICAgICAgICAgICAgICAgICAmJiBtV2F2ZUZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9NVUxBVworICAgICAgICAgICAgICAgICAgICAmJiBtV2F2ZUZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9NU0dTTQorICAgICAgICAgICAgICAgICAgICAmJiBtV2F2ZUZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9FWFRFTlNJQkxFKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50OF90IGZtdFNpemUgPSAxNjsKKyAgICAgICAgICAgIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9FWFRFTlNJQkxFKSB7CisgICAgICAgICAgICAgICAgZm10U2l6ZSA9IDQwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBmb3JtYXRTcGVjLCBmbXRTaXplKSA8IGZtdFNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbU51bUNoYW5uZWxzID0gVTE2X0xFX0FUKCZmb3JtYXRTcGVjWzJdKTsKKworICAgICAgICAgICAgaWYgKG1OdW1DaGFubmVscyA8IDEgfHwgbU51bUNoYW5uZWxzID4gOCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBudW1iZXIgb2YgY2hhbm5lbHMgKCVkKSIsIG1OdW1DaGFubmVscyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobVdhdmVGb3JtYXQgIT0gV0FWRV9GT1JNQVRfRVhURU5TSUJMRSkgeworICAgICAgICAgICAgICAgIGlmIChtTnVtQ2hhbm5lbHMgIT0gMSAmJiBtTnVtQ2hhbm5lbHMgIT0gMikgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiTW9yZSB0aGFuIDIgY2hhbm5lbHMgKCVkKSBpbiBub24tV0FWRV9FWFQsIHVua25vd24gY2hhbm5lbCBtYXNrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVNhbXBsZVJhdGUgPSBVMzJfTEVfQVQoJmZvcm1hdFNwZWNbNF0pOworCisgICAgICAgICAgICBpZiAobVNhbXBsZVJhdGUgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1CaXRzUGVyU2FtcGxlID0gVTE2X0xFX0FUKCZmb3JtYXRTcGVjWzE0XSk7CisKKyAgICAgICAgICAgIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9FWFRFTlNJQkxFKSB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgdmFsaWRCaXRzUGVyU2FtcGxlID0gVTE2X0xFX0FUKCZmb3JtYXRTcGVjWzE4XSk7CisgICAgICAgICAgICAgICAgaWYgKHZhbGlkQml0c1BlclNhbXBsZSAhPSBtQml0c1BlclNhbXBsZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRCaXRzUGVyU2FtcGxlICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJ2YWxpZEJpdHMoJWQpICE9IGJpdHNQZXJTYW1wbGUoJWQpIGFyZSBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRCaXRzUGVyU2FtcGxlLCBtQml0c1BlclNhbXBsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBvbmx5IHN1cHBvcnQgdmFsaXRCaXRzUGVyU2FtcGxlID09IGJpdHNQZXJTYW1wbGUgYnV0IHNvbWUgV0FWX0VYVAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGVycyBkb24ndCBjb3JyZWN0bHkgc2V0IHRoZSB2YWxpZCBiaXRzIHZhbHVlLCBhbmQgbGVhdmUgaXQgYXQgMC4KKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJXQVZFX0VYVCBoYXMgMCB2YWxpZCBiaXRzIHBlciBzYW1wbGUsIGlnbm9yaW5nIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2sgPSBVMzJfTEVfQVQoJmZvcm1hdFNwZWNbMjBdKTsKKyAgICAgICAgICAgICAgICBBTE9HVigibnVtQ2hhbm5lbHM9JWQgY2hhbm5lbE1hc2s9MHgleCIsIG1OdW1DaGFubmVscywgbUNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICBpZiAoKG1DaGFubmVsTWFzayA+PiAxOCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiaW52YWxpZCBjaGFubmVsIG1hc2sgMHgleCIsIG1DaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKChtQ2hhbm5lbE1hc2sgIT0gQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBvcGNvdW50KG1DaGFubmVsTWFzaykgIT0gbU51bUNoYW5uZWxzKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiaW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHMgKCVkKSBpbiBjaGFubmVsIG1hc2sgKDB4JXgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3Bjb3VudChtQ2hhbm5lbE1hc2spLCBtQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEluIGEgV0FWRV9FWFQgaGVhZGVyLCB0aGUgZmlyc3QgdHdvIGJ5dGVzIG9mIHRoZSBHVUlEIHN0b3JlZCBhdCBieXRlIDI0IGNvbnRhaW4KKyAgICAgICAgICAgICAgICAvLyB0aGUgc2FtcGxlIGZvcm1hdCwgdXNpbmcgdGhlIHNhbWUgZGVmaW5pdGlvbnMgYXMgYSByZWd1bGFyIFdBViBoZWFkZXIKKyAgICAgICAgICAgICAgICBtV2F2ZUZvcm1hdCA9IFUxNl9MRV9BVCgmZm9ybWF0U3BlY1syNF0pOworICAgICAgICAgICAgICAgIGlmIChtZW1jbXAoJmZvcm1hdFNwZWNbMjZdLCBXQVZFRVhUX1NVQkZPUk1BVCwgMTQpICYmCisgICAgICAgICAgICAgICAgICAgIG1lbWNtcCgmZm9ybWF0U3BlY1syNl0sIEFNQklTT05JQ19TVUJGT1JNQVQsIDE0KSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgidW5zdXBwb3J0ZWQgR1VJRCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobVdhdmVGb3JtYXQgPT0gV0FWRV9GT1JNQVRfUENNKSB7CisgICAgICAgICAgICAgICAgaWYgKG1CaXRzUGVyU2FtcGxlICE9IDggJiYgbUJpdHNQZXJTYW1wbGUgIT0gMTYKKyAgICAgICAgICAgICAgICAgICAgJiYgbUJpdHNQZXJTYW1wbGUgIT0gMjQgJiYgbUJpdHNQZXJTYW1wbGUgIT0gMzIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVdhdmVGb3JtYXQgPT0gV0FWRV9GT1JNQVRfSUVFRV9GTE9BVCkgeworICAgICAgICAgICAgICAgIGlmIChtQml0c1BlclNhbXBsZSAhPSAzMikgeyAgLy8gVE9ETyB3ZSBkb24ndCBzdXBwb3J0IGRvdWJsZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobVdhdmVGb3JtYXQgPT0gV0FWRV9GT1JNQVRfTVNHU00pIHsKKyAgICAgICAgICAgICAgICBpZiAobUJpdHNQZXJTYW1wbGUgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9NVUxBVyB8fCBtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9BTEFXKSB7CisgICAgICAgICAgICAgICAgaWYgKG1CaXRzUGVyU2FtcGxlICE9IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtVmFsaWRGb3JtYXQgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKCFtZW1jbXAoY2h1bmtIZWFkZXIsICJkYXRhIiwgNCkpIHsKKyAgICAgICAgICAgIGlmIChtVmFsaWRGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICBtRGF0YU9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgICAgICAgICBtRGF0YVNpemUgPSBjaHVua1NpemU7CisKKyAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLmNsZWFyKCk7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1XYXZlRm9ybWF0KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgV0FWRV9GT1JNQVRfUENNOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFdBVkVfRk9STUFUX0lFRUVfRkxPQVQ6CisgICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldENTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFdBVkVfRk9STUFUX0FMQVc6CisgICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldENTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFdBVkVfRk9STUFUX01TR1NNOgorICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRDU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01TR1NNKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobVdhdmVGb3JtYXQsICh1aW50MTZfdClXQVZFX0ZPUk1BVF9NVUxBVyk7CisgICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldENTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbU51bUNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldEludDMyKGtLZXlDaGFubmVsTWFzaywgbUNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRJbnQzMihrS2V5UGNtRW5jb2RpbmcsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOworCisgICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzID0gMDsKKyAgICAgICAgICAgICAgICBpZiAobVdhdmVGb3JtYXQgPT0gV0FWRV9GT1JNQVRfTVNHU00pIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gNjUgYnl0ZXMgZGVjb2RlIHRvIDMyMCA4a0h6IHNhbXBsZXMKKyAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25VcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwTEwgKiAobURhdGFTaXplIC8gNjUgKiAzMjApIC8gODAwMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnl0ZXNQZXJTYW1wbGUgPSBtQml0c1BlclNhbXBsZSA+PiAzOworCisgICAgICAgICAgICAgICAgICAgIGlmICghYnl0ZXNQZXJTYW1wbGUgfHwgIW1OdW1DaGFubmVscykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bV9zYW1wbGVzID0gbURhdGFTaXplIC8gKG1OdW1DaGFubmVscyAqIGJ5dGVzUGVyU2FtcGxlKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIW1TYW1wbGVSYXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKworICAgICAgICAgICAgICAgICAgICBkdXJhdGlvblVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDBMTCAqIG51bV9zYW1wbGVzIC8gbVNhbXBsZVJhdGU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb2Zmc2V0ICs9IGNodW5rU2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKworY29uc3Qgc2l6ZV90IFdBVlNvdXJjZTo6a01heEZyYW1lU2l6ZSA9IDMyNzY4OworCitXQVZTb3VyY2U6OldBVlNvdXJjZSgKKyAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCisgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgdWludDE2X3Qgd2F2ZUZvcm1hdCwKKyAgICAgICAgaW50MzJfdCBiaXRzUGVyU2FtcGxlLAorICAgICAgICBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpCisgICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKKyAgICAgIG1NZXRhKG1ldGEpLAorICAgICAgbVdhdmVGb3JtYXQod2F2ZUZvcm1hdCksCisgICAgICBtU2FtcGxlUmF0ZSgwKSwKKyAgICAgIG1OdW1DaGFubmVscygwKSwKKyAgICAgIG1CaXRzUGVyU2FtcGxlKGJpdHNQZXJTYW1wbGUpLAorICAgICAgbU9mZnNldChvZmZzZXQpLAorICAgICAgbVNpemUoc2l6ZSksCisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtR3JvdXAoTlVMTCkgeworICAgIENIRUNLKG1NZXRhLmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJm1TYW1wbGVSYXRlKSk7CisgICAgQ0hFQ0sobU1ldGEuZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZtTnVtQ2hhbm5lbHMpKTsKKworICAgIG1NZXRhLnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIGtNYXhGcmFtZVNpemUpOworfQorCitXQVZTb3VyY2U6On5XQVZTb3VyY2UoKSB7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIHN0b3AoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IFdBVlNvdXJjZTo6c3RhcnQoTWV0YURhdGFCYXNlICogLyogcGFyYW1zICovKSB7CisgICAgQUxPR1YoIldBVlNvdXJjZTo6c3RhcnQiKTsKKworICAgIENIRUNLKCFtU3RhcnRlZCk7CisKKyAgICAvLyBzb21lIFdBViBmaWxlcyBtYXkgaGF2ZSBsYXJnZSBhdWRpbyBidWZmZXJzIHRoYXQgdXNlIHNoYXJlZCBtZW1vcnkgdHJhbnNmZXIuCisgICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXAoNCAvKiBidWZmZXJzICovLCBrTWF4RnJhbWVTaXplKTsKKworICAgIGlmIChtQml0c1BlclNhbXBsZSA9PSA4KSB7CisgICAgICAgIC8vIEFzIGEgdGVtcG9yYXJ5IGJ1ZmZlciBmb3IgOC0+MTYgYml0IGNvbnZlcnNpb24uCisgICAgICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShrTWF4RnJhbWVTaXplKSk7CisgICAgfQorCisgICAgbUN1cnJlbnRQb3MgPSBtT2Zmc2V0OworCisgICAgbVN0YXJ0ZWQgPSB0cnVlOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBXQVZTb3VyY2U6OnN0b3AoKSB7CisgICAgQUxPR1YoIldBVlNvdXJjZTo6c3RvcCIpOworCisgICAgQ0hFQ0sobVN0YXJ0ZWQpOworCisgICAgZGVsZXRlIG1Hcm91cDsKKyAgICBtR3JvdXAgPSBOVUxMOworCisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgV0FWU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7CisgICAgQUxPR1YoIldBVlNvdXJjZTo6Z2V0Rm9ybWF0Iik7CisKKyAgICBtZXRhID0gbU1ldGE7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBXQVZTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICAqb3V0ID0gTlVMTDsKKworICAgIGlmIChvcHRpb25zICE9IG51bGxwdHIgJiYgb3B0aW9ucy0+Z2V0Tm9uQmxvY2tpbmcoKSAmJiAhbUdyb3VwLT5oYXNfYnVmZmVycygpKSB7CisgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICB9CisKKyAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CisgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CisgICAgaWYgKG9wdGlvbnMgIT0gTlVMTCAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgeworICAgICAgICBpbnQ2NF90IHBvcyA9IDA7CisKKyAgICAgICAgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX01TR1NNKSB7CisgICAgICAgICAgICAvLyA2NSBieXRlcyBkZWNvZGUgdG8gMzIwIDhrSHogc2FtcGxlcworICAgICAgICAgICAgaW50NjRfdCBzYW1wbGVudW1iZXIgPSAoc2Vla1RpbWVVcyAqIG1TYW1wbGVSYXRlKSAvIDEwMDAwMDA7CisgICAgICAgICAgICBpbnQ2NF90IGZyYW1lbnVtYmVyID0gc2FtcGxlbnVtYmVyIC8gMzIwOworICAgICAgICAgICAgcG9zID0gZnJhbWVudW1iZXIgKiA2NTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBvcyA9IChzZWVrVGltZVVzICogbVNhbXBsZVJhdGUpIC8gMTAwMDAwMCAqIG1OdW1DaGFubmVscyAqIChtQml0c1BlclNhbXBsZSA+PiAzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocG9zID4gKG9mZjY0X3QpbVNpemUpIHsKKyAgICAgICAgICAgIHBvcyA9IG1TaXplOworICAgICAgICB9CisgICAgICAgIG1DdXJyZW50UG9zID0gcG9zICsgbU9mZnNldDsKKyAgICB9CisKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKKyAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAvLyBtYWtlIHN1cmUgdGhhdCBtYXhCeXRlc1RvUmVhZCBpcyBtdWx0aXBsZSBvZiAzLCBpbiAyNC1iaXQgY2FzZQorICAgIHNpemVfdCBtYXhCeXRlc1RvUmVhZCA9CisgICAgICAgIG1CaXRzUGVyU2FtcGxlID09IDggPyBrTWF4RnJhbWVTaXplIC8gMiA6IAorICAgICAgICAobUJpdHNQZXJTYW1wbGUgPT0gMjQgPyAzKihrTWF4RnJhbWVTaXplLzMpOiBrTWF4RnJhbWVTaXplKTsKKworICAgIHNpemVfdCBtYXhCeXRlc0F2YWlsYWJsZSA9CisgICAgICAgIChtQ3VycmVudFBvcyAtIG1PZmZzZXQgPj0gKG9mZjY0X3QpbVNpemUpCisgICAgICAgICAgICA/IDAgOiBtU2l6ZSAtIChtQ3VycmVudFBvcyAtIG1PZmZzZXQpOworCisgICAgaWYgKG1heEJ5dGVzVG9SZWFkID4gbWF4Qnl0ZXNBdmFpbGFibGUpIHsKKyAgICAgICAgbWF4Qnl0ZXNUb1JlYWQgPSBtYXhCeXRlc0F2YWlsYWJsZTsKKyAgICB9CisKKyAgICBpZiAobVdhdmVGb3JtYXQgPT0gV0FWRV9GT1JNQVRfTVNHU00pIHsKKyAgICAgICAgLy8gTWljcm9zb2Z0IHBhY2tzIDIgZnJhbWVzIGludG8gNjUgYnl0ZXMsIHJhdGhlciB0aGFuIHVzaW5nIHNlcGFyYXRlIDMzLWJ5dGUgZnJhbWVzLAorICAgICAgICAvLyBzbyByZWFkIG11bHRpcGxlcyBvZiA2NSwgYW5kIHVzZSBzbWFsbGVyIGJ1ZmZlcnMgdG8gYWNjb3VudCBmb3IgfjEwOjEgZXhwYW5zaW9uIHJhdGlvCisgICAgICAgIGlmIChtYXhCeXRlc1RvUmVhZCA+IDEwMjQpIHsKKyAgICAgICAgICAgIG1heEJ5dGVzVG9SZWFkID0gMTAyNDsKKyAgICAgICAgfQorICAgICAgICBtYXhCeXRlc1RvUmVhZCA9IChtYXhCeXRlc1RvUmVhZCAvIDY1KSAqIDY1OworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHJlYWQgb25seSBpbnRlZ3JhbCBhbW91bnRzIG9mIGF1ZGlvIHVuaXQgZnJhbWVzLgorICAgICAgICBjb25zdCBzaXplX3QgaW5wdXRVbml0RnJhbWVTaXplID0gbU51bUNoYW5uZWxzICogbUJpdHNQZXJTYW1wbGUgLyA4OworICAgICAgICBtYXhCeXRlc1RvUmVhZCAtPSBtYXhCeXRlc1RvUmVhZCAlIGlucHV0VW5pdEZyYW1lU2l6ZTsKKyAgICB9CisKKyAgICBzc2l6ZV90IG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgbUN1cnJlbnRQb3MsIGJ1ZmZlci0+ZGF0YSgpLAorICAgICAgICAgICAgbWF4Qnl0ZXNUb1JlYWQpOworCisgICAgaWYgKG4gPD0gMCkgeworICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgYnVmZmVyID0gTlVMTDsKKworICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9CisKKyAgICBidWZmZXItPnNldF9yYW5nZSgwLCBuKTsKKworICAgIC8vIFRPRE86IGFkZCBjYXBhYmlsaXR5IHRvIHJldHVybiBkYXRhIGFzIGZsb2F0IFBDTSBpbnN0ZWFkIG9mIDE2IGJpdCBQQ00uCisgICAgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX1BDTSkgeworICAgICAgICBpZiAobUJpdHNQZXJTYW1wbGUgPT0gOCkgeworICAgICAgICAgICAgLy8gQ29udmVydCA4LWJpdCB1bnNpZ25lZCBzYW1wbGVzIHRvIDE2LWJpdCBzaWduZWQuCisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBuZXcgYnVmZmVyIHdpdGggMiBieXRlIHdpZGUgc2FtcGxlcworICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICp0bXA7CisgICAgICAgICAgICBDSEVDS19FUShtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZ0bXApLCAoc3RhdHVzX3QpT0spOworICAgICAgICAgICAgdG1wLT5zZXRfcmFuZ2UoMCwgMiAqIG4pOworCisgICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fdTgoKGludDE2X3QgKil0bXAtPmRhdGEoKSwgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSwgbik7CisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IHRtcDsKKyAgICAgICAgfSBlbHNlIGlmIChtQml0c1BlclNhbXBsZSA9PSAyNCkgeworICAgICAgICAgICAgLy8gQ29udmVydCAyNC1iaXQgc2lnbmVkIHNhbXBsZXMgdG8gMTYtYml0IHNpZ25lZCBpbiBwbGFjZQorICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBuIC8gMzsKKworICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX3AyNCgoaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpLCAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDIgKiBudW1TYW1wbGVzKTsKKyAgICAgICAgfSAgZWxzZSBpZiAobUJpdHNQZXJTYW1wbGUgPT0gMzIpIHsKKyAgICAgICAgICAgIC8vIENvbnZlcnQgMzItYml0IHNpZ25lZCBzYW1wbGVzIHRvIDE2LWJpdCBzaWduZWQgaW4gcGxhY2UKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBudW1TYW1wbGVzID0gbiAvIDQ7CisKKyAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9pMzIoKGludDE2X3QgKilidWZmZXItPmRhdGEoKSwgKGNvbnN0IGludDMyX3QgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7CisgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCAyICogbnVtU2FtcGxlcyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX0lFRUVfRkxPQVQpIHsKKyAgICAgICAgaWYgKG1CaXRzUGVyU2FtcGxlID09IDMyKSB7CisgICAgICAgICAgICAvLyBDb252ZXJ0IDMyLWJpdCBmbG9hdCBzYW1wbGVzIHRvIDE2LWJpdCBzaWduZWQgaW4gcGxhY2UKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBudW1TYW1wbGVzID0gbiAvIDQ7CisKKyAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdCgoaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpLCAoY29uc3QgZmxvYXQgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7CisgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCAyICogbnVtU2FtcGxlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQ2NF90IHRpbWVTdGFtcFVzID0gMDsKKworICAgIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9NU0dTTSkgeworICAgICAgICB0aW1lU3RhbXBVcyA9IDEwMDAwMDBMTCAqIChtQ3VycmVudFBvcyAtIG1PZmZzZXQpICogMzIwIC8gNjUgLyBtU2FtcGxlUmF0ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBzaXplX3QgYnl0ZXNQZXJTYW1wbGUgPSBtQml0c1BlclNhbXBsZSA+PiAzOworICAgICAgICB0aW1lU3RhbXBVcyA9IDEwMDAwMDBMTCAqIChtQ3VycmVudFBvcyAtIG1PZmZzZXQpCisgICAgICAgICAgICAgICAgLyAobU51bUNoYW5uZWxzICogYnl0ZXNQZXJTYW1wbGUpIC8gbVNhbXBsZVJhdGU7CisgICAgfQorCisgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVN0YW1wVXMpOworCisgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgIG1DdXJyZW50UG9zICs9IG47CisKKyAgICAqb3V0ID0gYnVmZmVyOworCisgICAgcmV0dXJuIE9LOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcigKKyAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICAgICAgdm9pZCAqKSB7CisgICAgcmV0dXJuIG5ldyBXQVZFeHRyYWN0b3Ioc291cmNlKTsKK30KKworc3RhdGljIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBTbmlmZigKKyAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgIHZvaWQgKiosCisgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKikgeworICAgIGNoYXIgaGVhZGVyWzEyXTsKKyAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobWVtY21wKGhlYWRlciwgIlJJRkYiLCA0KSB8fCBtZW1jbXAoJmhlYWRlcls4XSwgIldBVkUiLCA0KSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBNZWRpYUV4dHJhY3RvciAqZXh0cmFjdG9yID0gbmV3IFdBVkV4dHJhY3Rvcihzb3VyY2UpOworICAgIGludCBudW1UcmFja3MgPSBleHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CisgICAgZGVsZXRlIGV4dHJhY3RvcjsKKyAgICBpZiAobnVtVHJhY2tzID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgKmNvbmZpZGVuY2UgPSAwLjNmOworCisgICAgcmV0dXJuIENyZWF0ZUV4dHJhY3RvcjsKK30KKworZXh0ZXJuICJDIiB7CisvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCitfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCitNZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKKyAgICByZXR1cm4geworICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIFVVSUQoIjdkNjEzODU4LTU4MzctNGEzOC04NGM1LTMzMmQxY2RkZWUyNyIpLAorICAgICAgICAxLCAvLyB2ZXJzaW9uCisgICAgICAgICJXQVYgRXh0cmFjdG9yIiwKKyAgICAgICAgU25pZmYKKyAgICB9OworfQorCit9IC8vIGV4dGVybiAiQyIKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjdkMGI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgV0FWX0VYVFJBQ1RPUl9IXworCisjZGVmaW5lIFdBVl9FWFRSQUNUT1JfSF8KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFNZXNzYWdlOworY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitjbGFzcyBTdHJpbmc4OworCitjbGFzcyBXQVZFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworcHVibGljOgorICAgIGV4cGxpY2l0IFdBVkV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKworICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiV0FWRXh0cmFjdG9yIjsgfQorCisgICAgdmlydHVhbCB+V0FWRXh0cmFjdG9yKCk7CisKK3ByaXZhdGU6CisgICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CisgICAgYm9vbCBtVmFsaWRGb3JtYXQ7CisgICAgdWludDE2X3QgbVdhdmVGb3JtYXQ7CisgICAgdWludDE2X3QgbU51bUNoYW5uZWxzOworICAgIHVpbnQzMl90IG1DaGFubmVsTWFzazsKKyAgICB1aW50MzJfdCBtU2FtcGxlUmF0ZTsKKyAgICB1aW50MTZfdCBtQml0c1BlclNhbXBsZTsKKyAgICBvZmY2NF90IG1EYXRhT2Zmc2V0OworICAgIHNpemVfdCBtRGF0YVNpemU7CisgICAgTWV0YURhdGFCYXNlIG1UcmFja01ldGE7CisKKyAgICBzdGF0dXNfdCBpbml0KCk7CisKKyAgICBXQVZFeHRyYWN0b3IoY29uc3QgV0FWRXh0cmFjdG9yICYpOworICAgIFdBVkV4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IFdBVkV4dHJhY3RvciAmKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gV0FWX0VYVFJBQ1RPUl9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL3dhdi9leHBvcnRzLmxkcyBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMzA5ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9leHBvcnRzLmxkcwpAQCAtMCwwICsxIEBACit7IGdsb2JhbDogR0VURVhUUkFDVE9SREVGOyBsb2NhbDogKjsgfTsKZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9EbmdVdGlscy5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0RuZ1V0aWxzLmgKaW5kZXggMWQ4ZGY5Yy4uZGU4ZjEyMCAxMDA2NDQKLS0tIGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0RuZ1V0aWxzLmgKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0RuZ1V0aWxzLmgKQEAgLTM5LDExICszOSwxNiBAQAogICovCiBjbGFzcyBBTkRST0lEX0FQSSBPcGNvZGVMaXN0QnVpbGRlciA6IHB1YmxpYyBMaWdodFJlZkJhc2U8T3Bjb2RlTGlzdEJ1aWxkZXI+IHsKICAgICBwdWJsaWM6CisgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgQWRvYmUgRE5HIDEuNCBzcGVjIGZvciBCYXllciBwaGFzZSAoZGVmaW5lZCBmb3IgdGhlCisgICAgICAgIC8vIEZpeEJhZFBpeGVsc0NvbnN0YW50IGFuZCBGaXhCYWRQaXhlbHNMaXN0IG9wY29kZXMpIGlzIGluY29ycmVjdC4gSXQncworICAgICAgICAvLyBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgRE5HIFNESyAoY2YuIGRuZ19uZWdhdGl2ZTo6U2V0QmF5ZXJNb3NhaWMgYW5kCisgICAgICAgIC8vIGRuZ19vcGNvZGVfRml4QmFkUGl4ZWxzTGlzdDo6SXNHcmVlbiksIGFuZCBBZG9iZSBjb25maXJtcyB0aGF0IHRoZQorICAgICAgICAvLyBzcGVjIHNob3VsZCBiZSB1cGRhdGVkIHRvIG1hdGNoIHRoZSBTREsuCiAgICAgICAgIGVudW0gQ2ZhTGF5b3V0IHsKLSAgICAgICAgICAgIENGQV9SR0dCID0gMCwKLSAgICAgICAgICAgIENGQV9HUkJHLAotICAgICAgICAgICAgQ0ZBX0dCUkcsCisgICAgICAgICAgICBDRkFfR1JCRyA9IDAsCisgICAgICAgICAgICBDRkFfUkdHQiwKICAgICAgICAgICAgIENGQV9CR0dSLAorICAgICAgICAgICAgQ0ZBX0dCUkcsCiAgICAgICAgIH07CiAKICAgICAgICAgT3Bjb2RlTGlzdEJ1aWxkZXIoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9zcmMvRG5nVXRpbHMuY3BwIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9EbmdVdGlscy5jcHAKaW5kZXggOWRjNWYwNS4uNjdlYzI0NCAxMDA2NDQKLS0tIGEvbWVkaWEvaW1nX3V0aWxzL3NyYy9EbmdVdGlscy5jcHAKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9EbmdVdGlscy5jcHAKQEAgLTE4LDYgKzE4LDcgQEAKIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPG1hdGguaD4KIApAQCAtNjEsOCArNjIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGxlbnNTaGFkaW5nTWFwKSB7CiAgICAgdWludDMyX3QgYWN0aXZlQXJlYVdpZHRoID0gYWN0aXZlQXJlYVJpZ2h0IC0gYWN0aXZlQXJlYUxlZnQ7CiAgICAgdWludDMyX3QgYWN0aXZlQXJlYUhlaWdodCA9IGFjdGl2ZUFyZWFCb3R0b20gLSBhY3RpdmVBcmVhVG9wOwotICAgIGRvdWJsZSBzcGFjaW5nViA9IDEuMCAvIGxzbUhlaWdodDsKLSAgICBkb3VibGUgc3BhY2luZ0ggPSAxLjAgLyBsc21XaWR0aDsKKyAgICBkb3VibGUgc3BhY2luZ1YgPSAxLjAgLyBzdGQ6Om1heCgxdSwgbHNtSGVpZ2h0IC0gMSk7CisgICAgZG91YmxlIHNwYWNpbmdIID0gMS4wIC8gc3RkOjptYXgoMXUsIGxzbVdpZHRoIC0gMSk7CiAKICAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gcmVkTWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKICAgICBmbG9hdCAqcmVkTWFwID0gcmVkTWFwVmVjdG9yLmRhdGEoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZldyaXRlci5jcHAgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL1RpZmZXcml0ZXIuY3BwCmluZGV4IDU2NDQ3NGYuLjE3MTEyNDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2ltZ191dGlscy9zcmMvVGlmZldyaXRlci5jcHAKKysrIGIvbWVkaWEvaW1nX3V0aWxzL3NyYy9UaWZmV3JpdGVyLmNwcApAQCAtMzUwLDcgKzM1MCw3IEBACiAgICAgICAgIGlmIChuZXh0SWZkID09IE5VTEwpIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGlmZCA9IG5leHRJZmQ7CisgICAgICAgIGlmZCA9IHN0ZDo6bW92ZShuZXh0SWZkKTsKICAgICB9CiAgICAgcmV0dXJuIGlmZDsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL0FuZHJvaWQuYnAKaW5kZXggNmU2MGYyNC4uZjAwZjdhOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL0FuZHJvaWQuYnAKQEAgLTI4LDMgKzI4LDEwIEBACiAgICAgZmlyc3RfdmVyc2lvbjogIjI2IiwKICAgICB1bnZlcnNpb25lZF91bnRpbDogImN1cnJlbnQiLAogfQorCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJhYXVkaW9faGVhZGVycyIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCit9CisKK3N1YmRpcnMgPSBbIioiXQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL0FuZHJvaWQubWsgYi9tZWRpYS9saWJhYXVkaW8vQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA1M2U3ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWluY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzlmYWIyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2IEBACitzdWJkaXJzID0gWyIqIl0KKworY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGliYWF1ZGlvX2V4YW1wbGVfdXRpbHMiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsidXRpbHMiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNTNlN2QuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YzU4NDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTcgQEAKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJpbnB1dF9tb25pdG9yIiwKKyAgICBndGVzdDogZmFsc2UsCisgICAgc3JjczogWyJzcmMvaW5wdXRfbW9uaXRvci5jcHAiXSwKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAorICAgIGhlYWRlcl9saWJzOiBbImxpYmFhdWRpb19leGFtcGxlX3V0aWxzIl0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJpbnB1dF9tb25pdG9yX2NhbGxiYWNrIiwKKyAgICBndGVzdDogZmFsc2UsCisgICAgc3JjczogWyJzcmMvaW5wdXRfbW9uaXRvcl9jYWxsYmFjay5jcHAiXSwKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAorICAgIGhlYWRlcl9saWJzOiBbImxpYmFhdWRpb19leGFtcGxlX3V0aWxzIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3IvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA1M2U3ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9qbmkvQW5kcm9pZC5tayBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL2puaS9BbmRyb2lkLm1rCmluZGV4IDliMWNlMmMuLmEwYjk4MWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL2puaS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL2puaS9BbmRyb2lkLm1rCkBAIC0xMCw2ICsxMCw3IEBACiAKICMgTkRLIHJlY29tbWVuZHMgdXNpbmcgdGhpcyBraW5kIG9mIHJlbGF0aXZlIHBhdGggaW5zdGVhZCBvZiBhbiBhYnNvbHV0ZSBwYXRoLgogTE9DQUxfU1JDX0ZJTEVTOj0gLi4vc3JjL2lucHV0X21vbml0b3IuY3BwCitMT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8KIExPQ0FMX01PRFVMRSA6PSBpbnB1dF9tb25pdG9yCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKQEAgLTIyLDYgKzIzLDcgQEAKICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscwogCiBMT0NBTF9TUkNfRklMRVM6PSAuLi9zcmMvaW5wdXRfbW9uaXRvcl9jYWxsYmFjay5jcHAKK0xPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbwogTE9DQUxfTU9EVUxFIDo9IGlucHV0X21vbml0b3JfY2FsbGJhY2sKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivc3JjL2lucHV0X21vbml0b3IuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivc3JjL2lucHV0X21vbml0b3IuY3BwCmluZGV4IDlmZWIxMTguLmMxZmYzNGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL3NyYy9pbnB1dF9tb25pdG9yLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9zcmMvaW5wdXRfbW9uaXRvci5jcHAKQEAgLTI2LDI0ICsyNiwyMiBAQAogI2luY2x1ZGUgIkFBdWRpb0V4YW1wbGVVdGlscy5oIgogI2luY2x1ZGUgIkFBdWRpb1NpbXBsZVJlY29yZGVyLmgiCiAKLS8vIFRPRE8gc3VwcG9ydCBGTE9BVAotI2RlZmluZSBSRVFVSVJFRF9GT1JNQVQgICAgQUFVRElPX0ZPUk1BVF9QQ01fSTE2CiAjZGVmaW5lIE1JTl9GUkFNRVNfVE9fUkVBRCA0OCAgLyogYXJiaXRyYXJ5LCAxIG1zZWMgYXQgNDgwMDAgSHogKi8KIAogc3RhdGljIGNvbnN0IGludCBGUkFNRVNfUEVSX0xJTkUgPSAyMDAwMDsKIAogaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQogewotICAgIEFBdWRpb0FyZ3NQYXJzZXIgICBhcmdQYXJzZXI7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdDsKLSAgICBBQXVkaW9TaW1wbGVSZWNvcmRlciByZWNvcmRlcjsKLSAgICBpbnQgYWN0dWFsU2FtcGxlc1BlckZyYW1lOwotICAgIGludCBhY3R1YWxTYW1wbGVSYXRlOwotICAgIGFhdWRpb19mb3JtYXRfdCAgICAgICBhY3R1YWxEYXRhRm9ybWF0OwotICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBhY3R1YWxTaGFyaW5nTW9kZTsKKyAgICBBQXVkaW9BcmdzUGFyc2VyICAgICAgYXJnUGFyc2VyOworICAgIEFBdWRpb1NpbXBsZVJlY29yZGVyICByZWNvcmRlcjsKKyAgICBBQXVkaW9TdHJlYW0gICAgICAgICAqYWF1ZGlvU3RyZWFtID0gbnVsbHB0cjsKIAotICAgIEFBdWRpb1N0cmVhbSAqYWF1ZGlvU3RyZWFtID0gbnVsbHB0cjsKKyAgICBhYXVkaW9fcmVzdWx0X3QgICAgICAgcmVzdWx0OworICAgIGFhdWRpb19mb3JtYXRfdCAgICAgICBhY3R1YWxEYXRhRm9ybWF0OwogICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBzdGF0ZTsKKworICAgIGludDMyX3QgYWN0dWFsU2FtcGxlc1BlckZyYW1lOworICAgIGludDMyX3QgYWN0dWFsU2FtcGxlUmF0ZTsKICAgICBpbnQzMl90IGZyYW1lc1BlckJ1cnN0ID0gMDsKICAgICBpbnQzMl90IGZyYW1lc1BlclJlYWQgPSAwOwogICAgIGludDMyX3QgZnJhbWVzVG9SZWNvcmQgPSAwOwpAQCAtNTEsMTkgKzQ5LDE4IEBACiAgICAgaW50MzJfdCBuZXh0RnJhbWVDb3VudCA9IDA7CiAgICAgaW50MzJfdCBmcmFtZUNvdW50ID0gMDsKICAgICBpbnQzMl90IHhSdW5Db3VudCA9IDA7Ci0gICAgaW50NjRfdCBwcmV2aW91c0ZyYW1lUG9zaXRpb24gPSAtMTsKLSAgICBpbnQxNl90ICpkYXRhID0gbnVsbHB0cjsKLSAgICBmbG9hdCBwZWFrTGV2ZWwgPSAwLjA7Ci0gICAgaW50IGxvb3BDb3VudGVyID0gMDsKICAgICBpbnQzMl90IGRldmljZUlkOwogCisgICAgaW50MTZfdCAqc2hvcnREYXRhID0gbnVsbHB0cjsKKyAgICBmbG9hdCAgICpmbG9hdERhdGEgPSBudWxscHRyOworICAgIGZsb2F0ICAgIHBlYWtMZXZlbCA9IDAuMDsKKwogICAgIC8vIE1ha2UgcHJpbnRmIHByaW50IGltbWVkaWF0ZWx5IHNvIHRoYXQgZGVidWcgaW5mbyBpcyBub3Qgc3R1Y2sKICAgICAvLyBpbiBhIGJ1ZmZlciBpZiB3ZSBoYW5nIG9yIGNyYXNoLgogICAgIHNldHZidWYoc3Rkb3V0LCBudWxscHRyLCBfSU9OQkYsIChzaXplX3QpIDApOwogCi0gICAgcHJpbnRmKCIlcyAtIE1vbml0b3IgaW5wdXQgbGV2ZWwgdXNpbmcgQUF1ZGlvIHJlYWQsIFYwLjEuMlxuIiwgYXJndlswXSk7CisgICAgcHJpbnRmKCIlcyAtIE1vbml0b3IgaW5wdXQgbGV2ZWwgdXNpbmcgQUF1ZGlvIHJlYWQsIFYwLjEuM1xuIiwgYXJndlswXSk7CiAKLSAgICBhcmdQYXJzZXIuc2V0Rm9ybWF0KFJFUVVJUkVEX0ZPUk1BVCk7CiAgICAgaWYgKGFyZ1BhcnNlci5wYXJzZUFyZ3MoYXJnYywgYXJndikpIHsKICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKICAgICB9CkBAIC03MSw2ICs2OCw3IEBACiAgICAgcmVzdWx0ID0gcmVjb3JkZXIub3BlbihhcmdQYXJzZXIpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgLSAgcmVjb3JkZXIub3BlbigpIHJldHVybmVkICVkXG4iLCByZXN1bHQpOworICAgICAgICBwcmludGYoIklNUE9SVEFOVCAtIERpZCB5b3UgcmVtZW1iZXIgdG8gZW50ZXI6ICAgYWRiIHJvb3RcbiIpOwogICAgICAgICBnb3RvIGZpbmlzaDsKICAgICB9CiAgICAgYWF1ZGlvU3RyZWFtID0gcmVjb3JkZXIuZ2V0U3RyZWFtKCk7CkBAIC05OCwxNyArOTYsMTggQEAKICAgICBwcmludGYoIkRhdGFGb3JtYXQ6IGZyYW1lc1BlclJlYWQgID0gJWRcbiIsZnJhbWVzUGVyUmVhZCk7CiAKICAgICBhY3R1YWxEYXRhRm9ybWF0ID0gQUF1ZGlvU3RyZWFtX2dldEZvcm1hdChhYXVkaW9TdHJlYW0pOwotICAgIHByaW50ZigiRGF0YUZvcm1hdDogcmVxdWVzdGVkICAgICAgPSAlZCwgYWN0dWFsID0gJWRcbiIsCi0gICAgICAgICAgIFJFUVVJUkVEX0ZPUk1BVCwgYWN0dWFsRGF0YUZvcm1hdCk7Ci0gICAgLy8gVE9ETyBoYW5kbGUgb3RoZXIgZGF0YSBmb3JtYXRzCi0gICAgYXNzZXJ0KGFjdHVhbERhdGFGb3JtYXQgPT0gUkVRVUlSRURfRk9STUFUKTsKIAogICAgIC8vIEFsbG9jYXRlIGEgYnVmZmVyIGZvciB0aGUgUENNXzE2IGF1ZGlvIGRhdGEuCi0gICAgZGF0YSA9IG5ldyhzdGQ6Om5vdGhyb3cpIGludDE2X3RbZnJhbWVzUGVyUmVhZCAqIGFjdHVhbFNhbXBsZXNQZXJGcmFtZV07Ci0gICAgaWYgKGRhdGEgPT0gbnVsbHB0cikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gY291bGQgbm90IGFsbG9jYXRlIGRhdGEgYnVmZmVyXG4iKTsKLSAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX05PX01FTU9SWTsKLSAgICAgICAgZ290byBmaW5pc2g7CisgICAgc3dpdGNoIChhY3R1YWxEYXRhRm9ybWF0KSB7CisgICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fSTE2OgorICAgICAgICAgICAgc2hvcnREYXRhID0gbmV3IGludDE2X3RbZnJhbWVzUGVyUmVhZCAqIGFjdHVhbFNhbXBsZXNQZXJGcmFtZV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIGZsb2F0RGF0YSA9IG5ldyBmbG9hdFtmcmFtZXNQZXJSZWFkICogYWN0dWFsU2FtcGxlc1BlckZyYW1lXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVTkVYUEVDVEVEIEZPUk1BVCEgJWQiLCBhY3R1YWxEYXRhRm9ybWF0KTsKKyAgICAgICAgICAgIGdvdG8gZmluaXNoOwogICAgIH0KIAogICAgIC8vIFN0YXJ0IHRoZSBzdHJlYW0uCkBAIC0xMjgsNyArMTI3LDEyIEBACiAgICAgICAgIC8vIFJlYWQgYXVkaW8gZGF0YSBmcm9tIHRoZSBzdHJlYW0uCiAgICAgICAgIGNvbnN0IGludDY0X3QgdGltZW91dE5hbm9zID0gMTAwMCAqIE5BTk9TX1BFUl9NSUxMSVNFQ09ORDsKICAgICAgICAgaW50IG1pbkZyYW1lcyA9IChmcmFtZXNUb1JlY29yZCA8IGZyYW1lc1BlclJlYWQpID8gZnJhbWVzVG9SZWNvcmQgOiBmcmFtZXNQZXJSZWFkOwotICAgICAgICBpbnQgYWN0dWFsID0gQUF1ZGlvU3RyZWFtX3JlYWQoYWF1ZGlvU3RyZWFtLCBkYXRhLCBtaW5GcmFtZXMsIHRpbWVvdXROYW5vcyk7CisgICAgICAgIGludCBhY3R1YWwgPSAwOworICAgICAgICBpZiAoYWN0dWFsRGF0YUZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKKyAgICAgICAgICAgIGFjdHVhbCA9IEFBdWRpb1N0cmVhbV9yZWFkKGFhdWRpb1N0cmVhbSwgc2hvcnREYXRhLCBtaW5GcmFtZXMsIHRpbWVvdXROYW5vcyk7CisgICAgICAgIH0gZWxzZSBpZiAoYWN0dWFsRGF0YUZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICAgICAgYWN0dWFsID0gQUF1ZGlvU3RyZWFtX3JlYWQoYWF1ZGlvU3RyZWFtLCBmbG9hdERhdGEsIG1pbkZyYW1lcywgdGltZW91dE5hbm9zKTsKKyAgICAgICAgfQogICAgICAgICBpZiAoYWN0dWFsIDwgMCkgewogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAtIEFBdWRpb1N0cmVhbV9yZWFkKCkgcmV0dXJuZWQgJWRcbiIsIGFjdHVhbCk7CiAgICAgICAgICAgICByZXN1bHQgPSBhY3R1YWw7CkBAIC0xNDIsNyArMTQ2LDEyIEBACiAKICAgICAgICAgLy8gUGVhayBmaW5kZXIuCiAgICAgICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgYWN0dWFsOyBmcmFtZUluZGV4KyspIHsKLSAgICAgICAgICAgIGZsb2F0IHNhbXBsZSA9IGRhdGFbZnJhbWVJbmRleCAqIGFjdHVhbFNhbXBsZXNQZXJGcmFtZV0gKiAoMS4wLzMyNzY4KTsKKyAgICAgICAgICAgIGZsb2F0IHNhbXBsZSA9IDAuMGY7CisgICAgICAgICAgICBpZiAoYWN0dWFsRGF0YUZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKKyAgICAgICAgICAgICAgICBzYW1wbGUgPSBzaG9ydERhdGFbZnJhbWVJbmRleCAqIGFjdHVhbFNhbXBsZXNQZXJGcmFtZV0gKiAoMS4wLzMyNzY4KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0dWFsRGF0YUZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICAgICAgICAgIHNhbXBsZSA9IGZsb2F0RGF0YVtmcmFtZUluZGV4ICogYWN0dWFsU2FtcGxlc1BlckZyYW1lXTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzYW1wbGUgPiBwZWFrTGV2ZWwpIHsKICAgICAgICAgICAgICAgICBwZWFrTGV2ZWwgPSBzYW1wbGU7CiAgICAgICAgICAgICB9CkBAIC0xNTMsMTcgKzE2MiwxNSBAQAogICAgICAgICAgICAgZGlzcGxheVBlYWtMZXZlbChwZWFrTGV2ZWwpOwogICAgICAgICAgICAgcGVha0xldmVsID0gMC4wOwogICAgICAgICAgICAgbmV4dEZyYW1lQ291bnQgKz0gRlJBTUVTX1BFUl9MSU5FOwotICAgICAgICB9CiAKLSAgICAgICAgLy8gUHJpbnQgdGltZXN0YW1wcy4KLSAgICAgICAgaW50NjRfdCBmcmFtZVBvc2l0aW9uID0gMDsKLSAgICAgICAgaW50NjRfdCBmcmFtZVRpbWUgPSAwOwotICAgICAgICBhYXVkaW9fcmVzdWx0X3QgdGltZVJlc3VsdDsKLSAgICAgICAgdGltZVJlc3VsdCA9IEFBdWRpb1N0cmVhbV9nZXRUaW1lc3RhbXAoYWF1ZGlvU3RyZWFtLCBDTE9DS19NT05PVE9OSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcmFtZVBvc2l0aW9uLCAmZnJhbWVUaW1lKTsKKyAgICAgICAgICAgIC8vIFByaW50IHRpbWVzdGFtcHMuCisgICAgICAgICAgICBpbnQ2NF90IGZyYW1lUG9zaXRpb24gPSAwOworICAgICAgICAgICAgaW50NjRfdCBmcmFtZVRpbWUgPSAwOworICAgICAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHRpbWVSZXN1bHQ7CisgICAgICAgICAgICB0aW1lUmVzdWx0ID0gQUF1ZGlvU3RyZWFtX2dldFRpbWVzdGFtcChhYXVkaW9TdHJlYW0sIENMT0NLX01PTk9UT05JQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcmFtZVBvc2l0aW9uLCAmZnJhbWVUaW1lKTsKIAotICAgICAgICBpZiAodGltZVJlc3VsdCA9PSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgIGlmIChmcmFtZVBvc2l0aW9uID4gKHByZXZpb3VzRnJhbWVQb3NpdGlvbiArIEZSQU1FU19QRVJfTElORSkpIHsKKyAgICAgICAgICAgIGlmICh0aW1lUmVzdWx0ID09IEFBVURJT19PSykgewogICAgICAgICAgICAgICAgIGludDY0X3QgcmVhbFRpbWUgPSBnZXROYW5vc2Vjb25kcygpOwogICAgICAgICAgICAgICAgIGludDY0X3QgZnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKGFhdWRpb1N0cmVhbSk7CiAKQEAgLTE3NywxMSArMTg0LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIGZyYW1lUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIGZyYW1lVGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZW5jeU1pbGxpcyk7Ci0gICAgICAgICAgICAgICAgcHJldmlvdXNGcmFtZVBvc2l0aW9uID0gZnJhbWVQb3NpdGlvbjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJXQVJOSU5HIC0gQUF1ZGlvU3RyZWFtX2dldFRpbWVzdGFtcCgpIHJldHVybmVkICVkXG4iLCB0aW1lUmVzdWx0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAorICAgIHN0YXRlID0gQUF1ZGlvU3RyZWFtX2dldFN0YXRlKGFhdWRpb1N0cmVhbSk7CisgICAgcHJpbnRmKCJhZnRlciBsb29wLCBzdGF0ZSA9ICVzXG4iLCBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KHN0YXRlKSk7CisKICAgICB4UnVuQ291bnQgPSBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50KGFhdWRpb1N0cmVhbSk7CiAgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50ICVkXG4iLCB4UnVuQ291bnQpOwogCkBAIC0xOTQsNyArMjA1LDggQEAKIAogZmluaXNoOgogICAgIHJlY29yZGVyLmNsb3NlKCk7Ci0gICAgZGVsZXRlW10gZGF0YTsKKyAgICBkZWxldGVbXSBzaG9ydERhdGE7CisgICAgZGVsZXRlW10gZmxvYXREYXRhOwogICAgIHByaW50ZigiZXhpdGluZyAtIEFBdWRpbyByZXN1bHQgPSAlZCA9ICVzXG4iLCByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwogICAgIHJldHVybiAocmVzdWx0ICE9IEFBVURJT19PSykgPyBFWElUX0ZBSUxVUkUgOiBFWElUX1NVQ0NFU1M7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9zcmMvaW5wdXRfbW9uaXRvcl9jYWxsYmFjay5jcHAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9zcmMvaW5wdXRfbW9uaXRvcl9jYWxsYmFjay5jcHAKaW5kZXggODkzNzk1Yi4uZDEwZjgxMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivc3JjL2lucHV0X21vbml0b3JfY2FsbGJhY2suY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL3NyYy9pbnB1dF9tb25pdG9yX2NhbGxiYWNrLmNwcApAQCAtMjYsMjkgKzI2LDM5IEBACiAjaW5jbHVkZSAiQUF1ZGlvRXhhbXBsZVV0aWxzLmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2ltcGxlUmVjb3JkZXIuaCIKIAotI2RlZmluZSBOVU1fU0VDT05EUyAgICAgICAgICAgNQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCiB7Ci0gICAgKHZvaWQpYXJnYzsgLy8gdW51c2VkCi0gICAgQUF1ZGlvU2ltcGxlUmVjb3JkZXIgcmVjb3JkZXI7Ci0gICAgUGVha1RyYWNrZXJEYXRhX3QgbXlEYXRhID0gezAuMH07Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdDsKKyAgICBBQXVkaW9BcmdzUGFyc2VyICAgICAgYXJnUGFyc2VyOworICAgIEFBdWRpb1NpbXBsZVJlY29yZGVyICByZWNvcmRlcjsKKyAgICBQZWFrVHJhY2tlckRhdGFfdCAgICAgbXlEYXRhID0gezAuMH07CisgICAgQUF1ZGlvU3RyZWFtICAgICAgICAgKmFhdWRpb1N0cmVhbSA9IG51bGxwdHI7CisgICAgYWF1ZGlvX3Jlc3VsdF90ICAgICAgIHJlc3VsdDsKICAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGU7CisKKyAgICBpbnQgICAgICAgbG9vcHNOZWVkZWQgPSAwOwogICAgIGNvbnN0IGludCBkaXNwbGF5UmF0ZUh6ID0gMjA7IC8vIGFyYml0cmFyeQotICAgIGNvbnN0IGludCBsb29wc05lZWRlZCA9IE5VTV9TRUNPTkRTICogZGlzcGxheVJhdGVIejsKIAogICAgIC8vIE1ha2UgcHJpbnRmIHByaW50IGltbWVkaWF0ZWx5IHNvIHRoYXQgZGVidWcgaW5mbyBpcyBub3Qgc3R1Y2sKICAgICAvLyBpbiBhIGJ1ZmZlciBpZiB3ZSBoYW5nIG9yIGNyYXNoLgogICAgIHNldHZidWYoc3Rkb3V0LCBudWxscHRyLCBfSU9OQkYsIChzaXplX3QpIDApOwotICAgIHByaW50ZigiJXMgLSBEaXNwbGF5IGF1ZGlvIGlucHV0IHVzaW5nIGFuIEFBdWRpbyBjYWxsYmFjaywgVjAuMS4yXG4iLCBhcmd2WzBdKTsKKyAgICBwcmludGYoIiVzIC0gRGlzcGxheSBhdWRpbyBpbnB1dCB1c2luZyBhbiBBQXVkaW8gY2FsbGJhY2ssIFYwLjEuM1xuIiwgYXJndlswXSk7CiAKLSAgICByZXN1bHQgPSByZWNvcmRlci5vcGVuKDIsIDQ4MDAwLCBBQVVESU9fRk9STUFUX1BDTV9JMTYsCi0gICAgICAgICAgICAgICAgICAgICAgIFNpbXBsZVJlY29yZGVyRGF0YUNhbGxiYWNrUHJvYywgU2ltcGxlUmVjb3JkZXJFcnJvckNhbGxiYWNrUHJvYywgJm15RGF0YSk7CisgICAgaWYgKGFyZ1BhcnNlci5wYXJzZUFyZ3MoYXJnYywgYXJndikpIHsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICByZXN1bHQgPSByZWNvcmRlci5vcGVuKGFyZ1BhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXBsZVJlY29yZGVyRGF0YUNhbGxiYWNrUHJvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXBsZVJlY29yZGVyRXJyb3JDYWxsYmFja1Byb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXlEYXRhKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gIHJlY29yZGVyLm9wZW4oKSByZXR1cm5lZCAlZFxuIiwgcmVzdWx0KTsKKyAgICAgICAgcHJpbnRmKCJJTVBPUlRBTlQgLSBEaWQgeW91IHJlbWVtYmVyIHRvIGVudGVyOiAgIGFkYiByb290XG4iKTsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CisgICAgYWF1ZGlvU3RyZWFtID0gcmVjb3JkZXIuZ2V0U3RyZWFtKCk7CisgICAgYXJnUGFyc2VyLmNvbXBhcmVXaXRoU3RyZWFtKGFhdWRpb1N0cmVhbSk7CisKICAgICBwcmludGYoInJlY29yZGVyLmdldEZyYW1lc1BlclNlY29uZCgpID0gJWRcbiIsIHJlY29yZGVyLmdldEZyYW1lc1BlclNlY29uZCgpKTsKICAgICBwcmludGYoInJlY29yZGVyLmdldFNhbXBsZXNQZXJGcmFtZSgpID0gJWRcbiIsIHJlY29yZGVyLmdldFNhbXBsZXNQZXJGcmFtZSgpKTsKIApAQCAtNTgsNyArNjgsOSBAQAogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAotICAgIHByaW50ZigiU2xlZXAgZm9yICVkIHNlY29uZHMgd2hpbGUgYXVkaW8gcmVjb3JkIGluIGEgY2FsbGJhY2sgdGhyZWFkLlxuIiwgTlVNX1NFQ09ORFMpOworICAgIHByaW50ZigiU2xlZXAgZm9yICVkIHNlY29uZHMgd2hpbGUgYXVkaW8gcmVjb3JkIGluIGEgY2FsbGJhY2sgdGhyZWFkLlxuIiwKKyAgICAgICAgICAgYXJnUGFyc2VyLmdldER1cmF0aW9uU2Vjb25kcygpKTsKKyAgICBsb29wc05lZWRlZCA9IGFyZ1BhcnNlci5nZXREdXJhdGlvblNlY29uZHMoKSAqIGRpc3BsYXlSYXRlSHo7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb29wc05lZWRlZDsgaSsrKQogICAgIHsKICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjIHJlcXVlc3QgPSB7IC50dl9zZWMgPSAwLApAQCAtNjcsNyArNzksNyBAQAogICAgICAgICBwcmludGYoIiUwOGQ6ICIsIChpbnQpcmVjb3JkZXIuZ2V0RnJhbWVzUmVhZCgpKTsKICAgICAgICAgZGlzcGxheVBlYWtMZXZlbChteURhdGEucGVha0xldmVsKTsKIAotICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1fd2FpdEZvclN0YXRlQ2hhbmdlKHJlY29yZGVyLmdldFN0cmVhbSgpLAorICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1fd2FpdEZvclN0YXRlQ2hhbmdlKGFhdWRpb1N0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CkBAIC05Myw3ICsxMDUsOCBAQAogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAotICAgIHByaW50ZigiU2xlZXAgZm9yICVkIHNlY29uZHMgd2hpbGUgYXVkaW8gcmVjb3JkcyBpbiBhIGNhbGxiYWNrIHRocmVhZC5cbiIsIE5VTV9TRUNPTkRTKTsKKyAgICBwcmludGYoIlNsZWVwIGZvciAlZCBzZWNvbmRzIHdoaWxlIGF1ZGlvIHJlY29yZHMgaW4gYSBjYWxsYmFjayB0aHJlYWQuXG4iLAorICAgICAgICAgICBhcmdQYXJzZXIuZ2V0RHVyYXRpb25TZWNvbmRzKCkpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG9vcHNOZWVkZWQ7IGkrKykKICAgICB7CiAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyByZXF1ZXN0ID0geyAudHZfc2VjID0gMCwKQEAgLTEwMiwxMyArMTE1LDE0IEBACiAgICAgICAgIHByaW50ZigiJTA4ZDogIiwgKGludClyZWNvcmRlci5nZXRGcmFtZXNSZWFkKCkpOwogICAgICAgICBkaXNwbGF5UGVha0xldmVsKG15RGF0YS5wZWFrTGV2ZWwpOwogCi0gICAgICAgIHN0YXRlID0gQUF1ZGlvU3RyZWFtX2dldFN0YXRlKHJlY29yZGVyLmdldFN0cmVhbSgpKTsKKyAgICAgICAgc3RhdGUgPSBBQXVkaW9TdHJlYW1fZ2V0U3RhdGUoYWF1ZGlvU3RyZWFtKTsKICAgICAgICAgaWYgKHN0YXRlICE9IEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRJTkcgJiYgc3RhdGUgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEKSB7CiAgICAgICAgICAgICBwcmludGYoIlN0cmVhbSBzdGF0ZSBpcyAlZCAlcyFcbiIsIHN0YXRlLCBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KHN0YXRlKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KICAgICBwcmludGYoIldva2UgdXAgbm93LlxuIik7CisgICAgYXJnUGFyc2VyLmNvbXBhcmVXaXRoU3RyZWFtKGFhdWRpb1N0cmVhbSk7CiAKICAgICByZXN1bHQgPSByZWNvcmRlci5zdG9wKCk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI3ZDk1NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTIgQEAKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJhYXVkaW9fbG9vcGJhY2siLAorICAgIGd0ZXN0OiBmYWxzZSwKKyAgICBzcmNzOiBbInNyYy9sb29wYmFjay5jcHAiXSwKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAorICAgIHN0YXRpY19saWJzOiBbImxpYnNuZGZpbGUiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYWF1ZGlvIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbImxpYmFhdWRpb19leGFtcGxlX3V0aWxzIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svQW5kcm9pZC5tayBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDUzZTdkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svam5pL0FuZHJvaWQubWsgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svam5pL0FuZHJvaWQubWsKaW5kZXggZDc4ZjI4Ni4uYWViZTg3NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL2puaS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9qbmkvQW5kcm9pZC5tawpAQCAtOSw2ICs5LDggQEAKIAogIyBOREsgcmVjb21tZW5kcyB1c2luZyB0aGlzIGtpbmQgb2YgcmVsYXRpdmUgcGF0aCBpbnN0ZWFkIG9mIGFuIGFic29sdXRlIHBhdGguCiBMT0NBTF9TUkNfRklMRVM6PSAuLi9zcmMvbG9vcGJhY2suY3BwCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbworTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGlic25kZmlsZQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8gbGliYXVkaW91dGlscwogTE9DQUxfTU9EVUxFIDo9IGFhdWRpb19sb29wYmFjawogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL0xvb3BiYWNrQW5hbHl6ZXIuaCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvTG9vcGJhY2tBbmFseXplci5oCmluZGV4IDIxY2YzNDEuLmY2MThkM2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvTG9vcGJhY2tBbmFseXplci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvTG9vcGJhY2tBbmFseXplci5oCkBAIC0zMCw2ICszMCw4IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKKyNpbmNsdWRlIDxhdWRpb191dGlscy9zbmRmaWxlLmg+CisKIC8vIFRhZyBmb3IgbWFjaGluZSByZWFkYWJsZSByZXN1bHRzIGFzIHByb3BlcnR5ID0gdmFsdWUgcGFpcnMKICNkZWZpbmUgTE9PUEJBQ0tfUkVTVUxUX1RBRyAgICAgICJSRVNVTFQ6ICIKICNkZWZpbmUgTE9PUEJBQ0tfU0FNUExFX1JBVEUgICAgIDQ4MDAwCkBAIC0zNyw2ICszOSw3IEBACiAjZGVmaW5lIE1JTExJU19QRVJfU0VDT05EICAgICAgICAxMDAwCiAKICNkZWZpbmUgTUFYX1pFUk9USF9QQVJUSUFMX0JJTlMgIDQwCitjb25zdGV4cHIgZG91YmxlIE1BWF9FQ0hPX0dBSU4gPSAxMC4wOyAvLyBiYXNlZCBvbiBleHBlcmltZW50cywgb3RoZXJ3aXNlIGF1dG9jb3JyZWxhdGlvbiB0b28gbm9pc3kKIAogc3RhdGljIGNvbnN0IGZsb2F0IHNfSW1wdWxzZVtdID0gewogICAgICAgICAwLjBmLCAwLjBmLCAwLjBmLCAwLjBmLCAwLjJmLCAvLyBzaWxlbmNlIG9uIGVhY2ggc2lkZSBvZiB0aGUgaW1wdWxzZQpAQCAtMTU2LDYgKzE1OSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKm5lZWRsZSwgaW50IG5lZWRsZVNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF0ZW5jeVJlcG9ydCAqcmVwb3J0KSB7CiAgICAgY29uc3QgZG91YmxlIHRocmVzaG9sZCA9IDAuMTsKKyAgICBwcmludGYoIm1lYXN1cmVMYXRlbmN5RnJvbUVjaG9zOiBoYXlzdGFja1NpemUgPSAlZCwgbmVlZGxlU2l6ZSA9ICVkXG4iLAorICAgICAgICAgICBoYXlzdGFja1NpemUsIG5lZWRsZVNpemUpOwogCiAgICAgLy8gRmluZCBmaXJzdCBwZWFrCiAgICAgaW50IGZpcnN0ID0gKGludCkgKGZpbmRGaXJzdE1hdGNoKGhheXN0YWNrLApAQCAtMTczLDcgKzE3OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRsZVNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZCkgKyAwLjUpOwogCi0gICAgcHJpbnRmKCJmaXJzdCA9ICVkLCBhZ2FpbiBhdCAlZFxuIiwgZmlyc3QsIGFnYWluKTsKKyAgICBwcmludGYoIm1lYXN1cmVMYXRlbmN5RnJvbUVjaG9zOiBmaXJzdCA9ICVkLCBhZ2FpbiBhdCAlZFxuIiwgZmlyc3QsIGFnYWluKTsKICAgICBmaXJzdCA9IGFnYWluOwogCiAgICAgLy8gQWxsb2NhdGUgcmVzdWx0cyBhcnJheQpAQCAtMjcwLDM3ICsyNzUsNjAgQEAKICAgICAgICAgcmV0dXJuIG1EYXRhOwogICAgIH0KIAorICAgIHZvaWQgc2V0U2FtcGxlUmF0ZShpbnQzMl90IHNhbXBsZVJhdGUpIHsKKyAgICAgICAgbVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworICAgIH0KKworICAgIGludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1TYW1wbGVSYXRlOworICAgIH0KKwogICAgIGludCBzYXZlKGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBib29sIHdyaXRlU2hvcnRzID0gdHJ1ZSkgeworICAgICAgICBTTkRGSUxFICpzbmRGaWxlID0gbnVsbHB0cjsKICAgICAgICAgaW50IHdyaXR0ZW4gPSAwOwotICAgICAgICBjb25zdCBpbnQgY2h1bmtTaXplID0gNjQ7Ci0gICAgICAgIEZJTEUgKmZpZCA9IGZvcGVuKGZpbGVOYW1lLCAid2IiKTsKLSAgICAgICAgaWYgKGZpZCA9PSBOVUxMKSB7CisgICAgICAgIFNGX0lORk8gaW5mbyA9IHsKKyAgICAgICAgICAgICAgICAuZnJhbWVzID0gbUZyYW1lQ291bnRlciwKKyAgICAgICAgICAgICAgICAuc2FtcGxlcmF0ZSA9IG1TYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgIC5jaGFubmVscyA9IDEsCisgICAgICAgICAgICAgICAgLmZvcm1hdCA9IFNGX0ZPUk1BVF9XQVYgfCAod3JpdGVTaG9ydHMgPyBTRl9GT1JNQVRfUENNXzE2IDogU0ZfRk9STUFUX0ZMT0FUKQorICAgICAgICB9OworCisgICAgICAgIHNuZEZpbGUgPSBzZl9vcGVuKGZpbGVOYW1lLCBTRk1fV1JJVEUsICZpbmZvKTsKKyAgICAgICAgaWYgKHNuZEZpbGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcHJpbnRmKCJBdWRpb1JlY29yZGluZzo6c2F2ZSglcykgZmFpbGVkIHRvIG9wZW4gZmlsZVxuIiwgZmlsZU5hbWUpOwogICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh3cml0ZVNob3J0cykgewotICAgICAgICAgICAgaW50MTZfdCBidWZmZXJbY2h1bmtTaXplXTsKLSAgICAgICAgICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IG1GcmFtZUNvdW50ZXI7Ci0gICAgICAgICAgICBpbnQzMl90IGN1cnNvciA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoZnJhbWVzTGVmdCkgewotICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVzVG9Xcml0ZSA9IGZyYW1lc0xlZnQgPCBjaHVua1NpemUgPyBmcmFtZXNMZWZ0IDogY2h1bmtTaXplOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVzVG9Xcml0ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9IChpbnQxNl90KSAobURhdGFbY3Vyc29yKytdICogMzI3NjcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3cml0dGVuICs9IGZ3cml0ZShidWZmZXIsIHNpemVvZihpbnQxNl90KSwgZnJhbWVzVG9Xcml0ZSwgZmlkKTsKLSAgICAgICAgICAgICAgICBmcmFtZXNMZWZ0IC09IGZyYW1lc1RvV3JpdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3cml0dGVuID0gKGludCkgZndyaXRlKG1EYXRhLCBzaXplb2YoZmxvYXQpLCBtRnJhbWVDb3VudGVyLCBmaWQpOwotICAgICAgICB9Ci0gICAgICAgIGZjbG9zZShmaWQpOworICAgICAgICB3cml0dGVuID0gc2Zfd3JpdGVmX2Zsb2F0KHNuZEZpbGUsIG1EYXRhLCBtRnJhbWVDb3VudGVyKTsKKworICAgICAgICBzZl9jbG9zZShzbmRGaWxlKTsKICAgICAgICAgcmV0dXJuIHdyaXR0ZW47CiAgICAgfQogCisgICAgaW50IGxvYWQoY29uc3QgY2hhciAqZmlsZU5hbWUpIHsKKyAgICAgICAgU05ERklMRSAqc25kRmlsZSA9IG51bGxwdHI7CisgICAgICAgIFNGX0lORk8gaW5mbzsKKworICAgICAgICBzbmRGaWxlID0gc2Zfb3BlbihmaWxlTmFtZSwgU0ZNX1JFQUQsICZpbmZvKTsKKyAgICAgICAgaWYgKHNuZEZpbGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcHJpbnRmKCJBdWRpb1JlY29yZGluZzo6bG9hZCglcykgZmFpbGVkIHRvIG9wZW4gZmlsZVxuIiwgZmlsZU5hbWUpOworICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydChpbmZvLmNoYW5uZWxzID09IDEpOworCisgICAgICAgIGFsbG9jYXRlKGluZm8uZnJhbWVzKTsKKyAgICAgICAgbUZyYW1lQ291bnRlciA9IHNmX3JlYWRmX2Zsb2F0KHNuZEZpbGUsIG1EYXRhLCBpbmZvLmZyYW1lcyk7CisKKyAgICAgICAgc2ZfY2xvc2Uoc25kRmlsZSk7CisgICAgICAgIHJldHVybiBtRnJhbWVDb3VudGVyOworICAgIH0KKwogcHJpdmF0ZToKICAgICBmbG9hdCAgKm1EYXRhID0gbnVsbHB0cjsKICAgICBpbnQzMl90IG1GcmFtZUNvdW50ZXIgPSAwOwogICAgIGludDMyX3QgbU1heEZyYW1lcyA9IDA7CisgICAgaW50MzJfdCBtU2FtcGxlUmF0ZSA9IDQ4MDAwOyAvLyBjb21tb24gZGVmYXVsdAogfTsKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0zMjAsMTEgKzM0OCwyNSBAQAogCiAgICAgdmlydHVhbCB2b2lkIHByaW50U3RhdHVzKCkge307CiAKKyAgICB2aXJ0dWFsIGludCBnZXRSZXN1bHQoKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKICAgICB2aXJ0dWFsIGJvb2wgaXNEb25lKCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgdm9pZCBzZXRTYW1wbGVSYXRlKGludDMyX3Qgc2FtcGxlUmF0ZSkgeworICAgIHZpcnR1YWwgaW50IHNhdmUoY29uc3QgY2hhciAqZmlsZU5hbWUpIHsKKyAgICAgICAgKHZvaWQpIGZpbGVOYW1lOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOSU1QTEVNRU5URUQ7CisgICAgfQorCisgICAgdmlydHVhbCBpbnQgbG9hZChjb25zdCBjaGFyICpmaWxlTmFtZSkgeworICAgICAgICAodm9pZCkgZmlsZU5hbWU7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0U2FtcGxlUmF0ZShpbnQzMl90IHNhbXBsZVJhdGUpIHsKICAgICAgICAgbVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOwogICAgIH0KIApAQCAtMzY4LDggKzQxMCw3IEBACiAKIAogc3RhdGljIHZvaWQgcHJpbnRBdWRpb1Njb3BlKGZsb2F0IHNhbXBsZSkgewotICAgIGNvbnN0IGludCBtYXhTdGFycyA9IDgwCi0gICAgOyAvLyBhcmJpdHJhcnksIGZpdHMgb24gb25lIGxpbmUKKyAgICBjb25zdCBpbnQgbWF4U3RhcnMgPSA4MDsgLy8gYXJiaXRyYXJ5LCBmaXRzIG9uIG9uZSBsaW5lCiAgICAgY2hhciBjID0gJyonOwogICAgIGlmIChzYW1wbGUgPCAtMS4wKSB7CiAgICAgICAgIHNhbXBsZSA9IC0xLjA7CkBAIC0zOTUsNyArNDM2LDEzIEBACiBwdWJsaWM6CiAKICAgICBFY2hvQW5hbHl6ZXIoKSA6IExvb3BiYWNrUHJvY2Vzc29yKCkgewotICAgICAgICBhdWRpb1JlY29yZGVyLmFsbG9jYXRlKDIgKiBMT09QQkFDS19TQU1QTEVfUkFURSk7CisgICAgICAgIG1BdWRpb1JlY29yZGluZy5hbGxvY2F0ZSgyICogZ2V0U2FtcGxlUmF0ZSgpKTsKKyAgICAgICAgbUF1ZGlvUmVjb3JkaW5nLnNldFNhbXBsZVJhdGUoZ2V0U2FtcGxlUmF0ZSgpKTsKKyAgICB9CisKKyAgICB2b2lkIHNldFNhbXBsZVJhdGUoaW50MzJfdCBzYW1wbGVSYXRlKSBvdmVycmlkZSB7CisgICAgICAgIExvb3BiYWNrUHJvY2Vzc29yOjpzZXRTYW1wbGVSYXRlKHNhbXBsZVJhdGUpOworICAgICAgICBtQXVkaW9SZWNvcmRpbmcuc2V0U2FtcGxlUmF0ZShzYW1wbGVSYXRlKTsKICAgICB9CiAKICAgICB2b2lkIHJlc2V0KCkgb3ZlcnJpZGUgewpAQCAtNDA2LDggKzQ1MywxMiBAQAogICAgICAgICBtU3RhdGUgPSBTVEFURV9JTklUSUFMX1NJTEVOQ0U7CiAgICAgfQogCisgICAgdmlydHVhbCBpbnQgZ2V0UmVzdWx0KCkgeworICAgICAgICByZXR1cm4gbVN0YXRlID09IFNUQVRFX0RPTkUgPyAwIDogLTE7CisgICAgfQorCiAgICAgdmlydHVhbCBib29sIGlzRG9uZSgpIHsKLSAgICAgICAgcmV0dXJuIG1TdGF0ZSA9PSBTVEFURV9ET05FOworICAgICAgICByZXR1cm4gbVN0YXRlID09IFNUQVRFX0RPTkUgfHwgbVN0YXRlID09IFNUQVRFX0ZBSUxFRDsKICAgICB9CiAKICAgICB2b2lkIHNldEdhaW4oZmxvYXQgZ2FpbikgewpAQCAtNDIzLDM3ICs0NzQsMjggQEAKICAgICAgICAgcHJpbnRmKCJFY2hvQW5hbHl6ZXIgLS0tLS0tLS0tLS0tLS0tXG4iKTsKICAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgIm1lYXN1cmVkLmdhaW4gICAgICAgICAgPSAlZlxuIiwgbU1lYXN1cmVkTG9vcEdhaW4pOwogICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAiZWNoby5nYWluICAgICAgICAgICAgICA9ICVmXG4iLCBtRWNob0dhaW4pOwotICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAiZnJhbWUuY291bnQgICAgICAgICAgICA9ICVkXG4iLCBtRnJhbWVDb3VudGVyKTsKICAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgInRlc3Quc3RhdGUgICAgICAgICAgICAgPSAlZFxuIiwgbVN0YXRlKTsKICAgICAgICAgaWYgKG1NZWFzdXJlZExvb3BHYWluID49IDAuOTk5OSkgewogICAgICAgICAgICAgcHJpbnRmKCIgICBFUlJPUiAtIGNsaXBwaW5nLCB0dXJuIGRvd24gdm9sdW1lIHNsaWdodGx5XG4iKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpuZWVkbGUgPSBzX0ltcHVsc2U7CiAgICAgICAgICAgICBpbnQgbmVlZGxlU2l6ZSA9IChpbnQpIChzaXplb2Yoc19JbXB1bHNlKSAvIHNpemVvZihmbG9hdCkpOwotICAgICAgICAgICAgZmxvYXQgKmhheXN0YWNrID0gYXVkaW9SZWNvcmRlci5nZXREYXRhKCk7Ci0gICAgICAgICAgICBpbnQgaGF5c3RhY2tTaXplID0gYXVkaW9SZWNvcmRlci5zaXplKCk7Ci0gICAgICAgICAgICBpbnQgcmVzdWx0ID0gbWVhc3VyZUxhdGVuY3lGcm9tRWNob3MoaGF5c3RhY2ssIGhheXN0YWNrU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkbGUsIG5lZWRsZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxhdGVuY3lSZXBvcnQpOwotICAgICAgICAgICAgaWYgKGxhdGVuY3lSZXBvcnQuY29uZmlkZW5jZSA8IDAuMDEpIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIiAgIEVSUk9SIC0gY29uZmlkZW5jZSB0b28gbG93ID0gJWZcbiIsIGxhdGVuY3lSZXBvcnQuY29uZmlkZW5jZSk7CisgICAgICAgICAgICBmbG9hdCAqaGF5c3RhY2sgPSBtQXVkaW9SZWNvcmRpbmcuZ2V0RGF0YSgpOworICAgICAgICAgICAgaW50IGhheXN0YWNrU2l6ZSA9IG1BdWRpb1JlY29yZGluZy5zaXplKCk7CisgICAgICAgICAgICBtZWFzdXJlTGF0ZW5jeUZyb21FY2hvcyhoYXlzdGFjaywgaGF5c3RhY2tTaXplLCBuZWVkbGUsIG5lZWRsZVNpemUsICZtTGF0ZW5jeVJlcG9ydCk7CisgICAgICAgICAgICBpZiAobUxhdGVuY3lSZXBvcnQuY29uZmlkZW5jZSA8IDAuMDEpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiAgIEVSUk9SIC0gY29uZmlkZW5jZSB0b28gbG93ID0gJWZcbiIsIG1MYXRlbmN5UmVwb3J0LmNvbmZpZGVuY2UpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkb3VibGUgbGF0ZW5jeU1pbGxpcyA9IDEwMDAuMCAqIGxhdGVuY3lSZXBvcnQubGF0ZW5jeUluRnJhbWVzIC8gZ2V0U2FtcGxlUmF0ZSgpOwotICAgICAgICAgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJsYXRlbmN5LmZyYW1lcyAgICAgICAgPSAlOC4yZlxuIiwgbGF0ZW5jeVJlcG9ydC5sYXRlbmN5SW5GcmFtZXMpOworICAgICAgICAgICAgICAgIGRvdWJsZSBsYXRlbmN5TWlsbGlzID0gMTAwMC4wICogbUxhdGVuY3lSZXBvcnQubGF0ZW5jeUluRnJhbWVzIC8gZ2V0U2FtcGxlUmF0ZSgpOworICAgICAgICAgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJsYXRlbmN5LmZyYW1lcyAgICAgICAgPSAlOC4yZlxuIiwgbUxhdGVuY3lSZXBvcnQubGF0ZW5jeUluRnJhbWVzKTsKICAgICAgICAgICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAibGF0ZW5jeS5tc2VjICAgICAgICAgID0gJTguMmZcbiIsIGxhdGVuY3lNaWxsaXMpOwotICAgICAgICAgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJsYXRlbmN5LmNvbmZpZGVuY2UgICAgPSAlOC42ZlxuIiwgbGF0ZW5jeVJlcG9ydC5jb25maWRlbmNlKTsKKyAgICAgICAgICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAibGF0ZW5jeS5jb25maWRlbmNlICAgID0gJTguNmZcbiIsIG1MYXRlbmN5UmVwb3J0LmNvbmZpZGVuY2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgewotI2RlZmluZSBFQ0hPX0ZJTEVOQU1FICIvZGF0YS9vYm9lX2VjaG8ucmF3IgotICAgICAgICAgICAgaW50IHdyaXR0ZW4gPSBhdWRpb1JlY29yZGVyLnNhdmUoRUNIT19GSUxFTkFNRSk7Ci0gICAgICAgICAgICBwcmludGYoIkVjaG8gd3JvdGUgJWQgbW9ubyBzYW1wbGVzIHRvICVzIG9uIEFuZHJvaWQgZGV2aWNlXG4iLCB3cml0dGVuLCBFQ0hPX0ZJTEVOQU1FKTsKLSAgICAgICAgfQogICAgIH0KIAogICAgIHZvaWQgcHJpbnRTdGF0dXMoKSBvdmVycmlkZSB7Ci0gICAgICAgIHByaW50Zigic3RhdGUgPSAlZCwgZWNobyBnYWluID0gJWYgIiwgbVN0YXRlLCBtRWNob0dhaW4pOworICAgICAgICBwcmludGYoInN0ID0gJWQsIGVjaG8gZ2FpbiA9ICVmICIsIG1TdGF0ZSwgbUVjaG9HYWluKTsKICAgICB9CiAKICAgICBzdGF0aWMgdm9pZCBzZW5kSW1wdWxzZShmbG9hdCAqb3V0cHV0RGF0YSwgaW50IG91dHB1dENoYW5uZWxDb3VudCkgewpAQCAtNDkzLDEzICs1MzUsMTggQEAKICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBnZXQgc2V2ZXJhbCBpbiBhIHJvdyB0aGVuIGdvIHRvIG5leHQgc3RhdGUuCiAgICAgICAgICAgICAgICAgaWYgKHBlYWsgPiBtUHVsc2VUaHJlc2hvbGQpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1Eb3duQ291bnRlci0tIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5leHRTdGF0ZSA9IFNUQVRFX1dBSVRJTkdfRk9SX1NJTEVOQ0U7CiAgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50ZigiJTVkOiBzd2l0Y2ggdG8gU1RBVEVfV0FJVElOR19GT1JfU0lMRU5DRSwgbWVhc3VyZWQgcGVhayA9ICVmXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgbUxvb3BDb3VudGVyLCBwZWFrKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Eb3duQ291bnRlciA9IDg7CiAgICAgICAgICAgICAgICAgICAgICAgICBtTWVhc3VyZWRMb29wR2FpbiA9IHBlYWs7ICAvLyBhc3N1bWVzIG9yaWdpbmFsIHB1bHNlIGFtcGxpdHVkZSBpcyBvbmUKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBnYWluIHRoYXQgd2lsbCBnaXZlIHVzIGEgbmljZSBkZWNheWluZyBlY2hvLgogICAgICAgICAgICAgICAgICAgICAgICAgbUVjaG9HYWluID0gbURlc2lyZWRFY2hvR2FpbiAvIG1NZWFzdXJlZExvb3BHYWluOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1FY2hvR2FpbiA+IE1BWF9FQ0hPX0dBSU4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gbG9vcCBnYWluIHRvbyBsb3cuIEluY3JlYXNlIHRoZSB2b2x1bWUuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U3RhdGUgPSBTVEFURV9GQUlMRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRTdGF0ZSA9IFNUQVRFX1dBSVRJTkdfRk9SX1NJTEVOQ0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBtRG93bkNvdW50ZXIgPSA4OwpAQCAtNTA3LDcgKzU1NCw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgU1RBVEVfV0FJVElOR19GT1JfU0lMRU5DRToKLSAgICAgICAgICAgICAgICAvLyBPdXRwdXQgc2lsZW5jZS4KKyAgICAgICAgICAgICAgICAvLyBPdXRwdXQgc2lsZW5jZSBhbmQgd2FpdCBmb3IgdGhlIGVjaG9zIHRvIGRpZSBkb3duLgogICAgICAgICAgICAgICAgIG51bVNhbXBsZXMgPSBudW1GcmFtZXMgKiBvdXRwdXRDaGFubmVsQ291bnQ7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGF0YVtpXSA9IDA7CkBAIC01MjYsMTQgKzU3MywxNCBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBjYXNlIFNUQVRFX1NFTkRJTkdfUFVMU0U6Ci0gICAgICAgICAgICAgICAgYXVkaW9SZWNvcmRlci53cml0ZShpbnB1dERhdGEsIGlucHV0Q2hhbm5lbENvdW50LCBudW1GcmFtZXMpOworICAgICAgICAgICAgICAgIG1BdWRpb1JlY29yZGluZy53cml0ZShpbnB1dERhdGEsIGlucHV0Q2hhbm5lbENvdW50LCBudW1GcmFtZXMpOwogICAgICAgICAgICAgICAgIHNlbmRJbXB1bHNlKG91dHB1dERhdGEsIG91dHB1dENoYW5uZWxDb3VudCk7CiAgICAgICAgICAgICAgICAgbmV4dFN0YXRlID0gU1RBVEVfR0FUSEVSSU5HX0VDSE9TOwogICAgICAgICAgICAgICAgIC8vcHJpbnRmKCIlNWQ6IHN3aXRjaCB0byBTVEFURV9HQVRIRVJJTkdfRUNIT1NcbiIsIG1Mb29wQ291bnRlcik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgU1RBVEVfR0FUSEVSSU5HX0VDSE9TOgotICAgICAgICAgICAgICAgIG51bVdyaXR0ZW4gPSBhdWRpb1JlY29yZGVyLndyaXRlKGlucHV0RGF0YSwgaW5wdXRDaGFubmVsQ291bnQsIG51bUZyYW1lcyk7CisgICAgICAgICAgICAgICAgbnVtV3JpdHRlbiA9IG1BdWRpb1JlY29yZGluZy53cml0ZShpbnB1dERhdGEsIGlucHV0Q2hhbm5lbENvdW50LCBudW1GcmFtZXMpOwogICAgICAgICAgICAgICAgIHBlYWsgPSBtZWFzdXJlUGVha0FtcGxpdHVkZShpbnB1dERhdGEsIGlucHV0Q2hhbm5lbENvdW50LCBudW1GcmFtZXMpOwogICAgICAgICAgICAgICAgIGlmIChwZWFrID4gbU1lYXN1cmVkTG9vcEdhaW4pIHsKICAgICAgICAgICAgICAgICAgICAgbU1lYXN1cmVkTG9vcEdhaW4gPSBwZWFrOyAgLy8gQUdDIG1pZ2h0IGJlIHJhaXNpbmcgZ2FpbiBzbyBhZGp1c3QgaXQgb24gdGhlIGZseS4KQEAgLTU2Nyw2ICs2MTQsMTQgQEAKICAgICAgICAgbUxvb3BDb3VudGVyKys7CiAgICAgfQogCisgICAgaW50IHNhdmUoY29uc3QgY2hhciAqZmlsZU5hbWUpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1BdWRpb1JlY29yZGluZy5zYXZlKGZpbGVOYW1lKTsKKyAgICB9CisKKyAgICBpbnQgbG9hZChjb25zdCBjaGFyICpmaWxlTmFtZSkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUF1ZGlvUmVjb3JkaW5nLmxvYWQoZmlsZU5hbWUpOworICAgIH0KKwogcHJpdmF0ZToKIAogICAgIGVudW0gZWNob19zdGF0ZV90IHsKQEAgLTU3NSwyMyArNjMwLDIyIEBACiAgICAgICAgIFNUQVRFX1dBSVRJTkdfRk9SX1NJTEVOQ0UsCiAgICAgICAgIFNUQVRFX1NFTkRJTkdfUFVMU0UsCiAgICAgICAgIFNUQVRFX0dBVEhFUklOR19FQ0hPUywKLSAgICAgICAgU1RBVEVfRE9ORQorICAgICAgICBTVEFURV9ET05FLAorICAgICAgICBTVEFURV9GQUlMRUQKICAgICB9OwogCi0gICAgaW50ICAgICAgICAgICBtRG93bkNvdW50ZXIgPSA1MDA7Ci0gICAgaW50ICAgICAgICAgICBtTG9vcENvdW50ZXIgPSAwOwotICAgIGludCAgICAgICAgICAgbUxvb3BTdGFydCA9IDEwMDA7Ci0gICAgZmxvYXQgICAgICAgICBtUHVsc2VUaHJlc2hvbGQgPSAwLjAyZjsKLSAgICBmbG9hdCAgICAgICAgIG1TaWxlbmNlVGhyZXNob2xkID0gMC4wMDJmOwotICAgIGZsb2F0ICAgICAgICAgbU1lYXN1cmVkTG9vcEdhaW4gPSAwLjBmOwotICAgIGZsb2F0ICAgICAgICAgbURlc2lyZWRFY2hvR2FpbiA9IDAuOTVmOwotICAgIGZsb2F0ICAgICAgICAgbUVjaG9HYWluID0gMS4wZjsKLSAgICBlY2hvX3N0YXRlX3QgIG1TdGF0ZSA9IFNUQVRFX0lOSVRJQUxfU0lMRU5DRTsKLSAgICBpbnQzMl90ICAgICAgIG1GcmFtZUNvdW50ZXIgPSAwOworICAgIGludCAgICAgICAgICAgICBtRG93bkNvdW50ZXIgPSA1MDA7CisgICAgaW50ICAgICAgICAgICAgIG1Mb29wQ291bnRlciA9IDA7CisgICAgZmxvYXQgICAgICAgICAgIG1QdWxzZVRocmVzaG9sZCA9IDAuMDJmOworICAgIGZsb2F0ICAgICAgICAgICBtU2lsZW5jZVRocmVzaG9sZCA9IDAuMDAyZjsKKyAgICBmbG9hdCAgICAgICAgICAgbU1lYXN1cmVkTG9vcEdhaW4gPSAwLjBmOworICAgIGZsb2F0ICAgICAgICAgICBtRGVzaXJlZEVjaG9HYWluID0gMC45NWY7CisgICAgZmxvYXQgICAgICAgICAgIG1FY2hvR2FpbiA9IDEuMGY7CisgICAgZWNob19zdGF0ZV90ICAgIG1TdGF0ZSA9IFNUQVRFX0lOSVRJQUxfU0lMRU5DRTsKIAotICAgIEF1ZGlvUmVjb3JkaW5nICAgICBhdWRpb1JlY29yZGVyOwotICAgIExhdGVuY3lSZXBvcnQgICAgICBsYXRlbmN5UmVwb3J0OwotICAgIFBlYWtEZXRlY3RvciAgICAgICBtUGVha0RldGVjdG9yOworICAgIEF1ZGlvUmVjb3JkaW5nICBtQXVkaW9SZWNvcmRpbmc7IC8vIGNvbnRhaW5zIG9ubHkgdGhlIGlucHV0IGFmdGVyIHRoZSBnYWluIGRldGVjdGlvbiBidXJzdAorICAgIExhdGVuY3lSZXBvcnQgICBtTGF0ZW5jeVJlcG9ydDsKKyAgICAvLyBQZWFrRGV0ZWN0b3IgICAgbVBlYWtEZXRlY3RvcjsKIH07CiAKIApAQCAtNjA1LDYgKzY1OSwxMCBAQAogY2xhc3MgU2luZUFuYWx5emVyIDogcHVibGljIExvb3BiYWNrUHJvY2Vzc29yIHsKIHB1YmxpYzoKIAorICAgIHZpcnR1YWwgaW50IGdldFJlc3VsdCgpIHsKKyAgICAgICAgcmV0dXJuIG1TdGF0ZSA9PSBTVEFURV9MT0NLRUQgPyAwIDogLTE7CisgICAgfQorCiAgICAgdm9pZCByZXBvcnQoKSBvdmVycmlkZSB7CiAgICAgICAgIHByaW50ZigiU2luZUFuYWx5emVyIC0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJwZWFrLmFtcGxpdHVkZSAgICAgPSAlNy41ZlxuIiwgbVBlYWtBbXBsaXR1ZGUpOwpAQCAtNjEyLDcgKzY3MCw3IEBACiAgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJwaGFzZS5vZmZzZXQgICAgICAgPSAlNy41ZlxuIiwgbVBoYXNlT2Zmc2V0KTsKICAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgInJlZi5waGFzZSAgICAgICAgICA9ICU3LjVmXG4iLCBtUGhhc2UpOwogICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAiZnJhbWVzLmFjY3VtdWxhdGVkID0gJTZkXG4iLCBtRnJhbWVzQWNjdW11bGF0ZWQpOwotICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAic2luZS5wZXJpb2QgICAgICAgID0gJTZkXG4iLCBtUGVyaW9kKTsKKyAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgInNpbmUucGVyaW9kICAgICAgICA9ICU2ZFxuIiwgbVNpbmVQZXJpb2QpOwogICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAidGVzdC5zdGF0ZSAgICAgICAgID0gJTZkXG4iLCBtU3RhdGUpOwogICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAiZnJhbWUuY291bnQgICAgICAgID0gJTZkXG4iLCBtRnJhbWVDb3VudGVyKTsKICAgICAgICAgLy8gRGlkIHdlIGV2ZXIgZ2V0IGEgbG9jaz8KQEAgLTYyNiw3ICs2ODQsNyBAQAogICAgIH0KIAogICAgIHZvaWQgcHJpbnRTdGF0dXMoKSBvdmVycmlkZSB7Ci0gICAgICAgIHByaW50ZigiICBzdGF0ZSA9ICVkLCBnbGl0Y2hlcyA9ICVkLCIsIG1TdGF0ZSwgbUdsaXRjaENvdW50KTsKKyAgICAgICAgcHJpbnRmKCJzdCA9ICVkLCAjZ2wgPSAlM2QsIiwgbVN0YXRlLCBtR2xpdGNoQ291bnQpOwogICAgIH0KIAogICAgIGRvdWJsZSBjYWxjdWxhdGVNYWduaXR1ZGUoZG91YmxlICpwaGFzZVB0ciA9IE5VTEwpIHsKQEAgLTY1MSw3ICs3MDksOCBAQAogICAgIHZvaWQgcHJvY2VzcyhmbG9hdCAqaW5wdXREYXRhLCBpbnQgaW5wdXRDaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgIGZsb2F0ICpvdXRwdXREYXRhLCBpbnQgb3V0cHV0Q2hhbm5lbENvdW50LAogICAgICAgICAgICAgICAgICBpbnQgbnVtRnJhbWVzKSBvdmVycmlkZSB7Ci0gICAgICAgIGZsb2F0IHNhbXBsZTsKKyAgICAgICAgbVByb2Nlc3NDb3VudCsrOworCiAgICAgICAgIGZsb2F0IHBlYWsgPSBtZWFzdXJlUGVha0FtcGxpdHVkZShpbnB1dERhdGEsIGlucHV0Q2hhbm5lbENvdW50LCBudW1GcmFtZXMpOwogICAgICAgICBpZiAocGVhayA+IG1QZWFrQW1wbGl0dWRlKSB7CiAgICAgICAgICAgICBtUGVha0FtcGxpdHVkZSA9IHBlYWs7CkBAIC02NjMsNiArNzIyLDcgQEAKICAgICAgICAgICAgIGZsb2F0IHNpbk91dCA9IHNpbmYobVBoYXNlKTsKIAogICAgICAgICAgICAgc3dpdGNoIChtU3RhdGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0lETEU6CiAgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9JTU1VTkU6CiAgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9XQUlUSU5HX0ZPUl9TSUdOQUw6CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjcxLDcgKzczMSw3IEBACiAgICAgICAgICAgICAgICAgICAgIG1Db3NBY2N1bXVsYXRvciArPSBzYW1wbGUgKiBjb3NmKG1QaGFzZSk7CiAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNBY2N1bXVsYXRlZCsrOwogICAgICAgICAgICAgICAgICAgICAvLyBNdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIHBlcmlvZCBvciB0aGUgY2FsY3VsYXRpb24gd2lsbCBub3QgYmUgYWNjdXJhdGUuCi0gICAgICAgICAgICAgICAgICAgIGlmIChtRnJhbWVzQWNjdW11bGF0ZWQgPT0gbVBlcmlvZCAqIDQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1GcmFtZXNBY2N1bXVsYXRlZCA9PSBtU2luZVBlcmlvZCAqIFBFUklPRFNfTkVFREVEX0ZPUl9MT0NLKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtUGhhc2VPZmZzZXQgPSAwLjA7CiAgICAgICAgICAgICAgICAgICAgICAgICBtTWFnbml0dWRlID0gY2FsY3VsYXRlTWFnbml0dWRlKCZtUGhhc2VPZmZzZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1NYWduaXR1ZGUgPiBtVGhyZXNob2xkKSB7CkBAIC02OTcsNyArNzU3LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBtRnJhbWVDb3VudGVyLCBtR2xpdGNoQ291bnQsIHByZWRpY3RlZCwgc2FtcGxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0lNTVVORTsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRmKCIlNWQ6IHN3aXRjaCB0byBTVEFURV9JTU1VTkVcbiIsIG1GcmFtZUNvdW50ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbURvd25Db3VudGVyID0gbVBlcmlvZDsgIC8vIFNldCBkdXJhdGlvbiBvZiBJTU1VTkUgc3RhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICBtRG93bkNvdW50ZXIgPSBtU2luZVBlcmlvZDsgIC8vIFNldCBkdXJhdGlvbiBvZiBJTU1VTkUgc3RhdGUuCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBUcmFjayBpbmNvbWluZyBzaWduYWwgYW5kIHNsb3dseSBhZGp1c3QgbWFnbml0dWRlIHRvIGFjY291bnQKKyAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGRyaWZ0IGluIHRoZSBEUkMgb3IgQUdDLgorICAgICAgICAgICAgICAgICAgICBtU2luQWNjdW11bGF0b3IgKz0gc2FtcGxlICogc2luT3V0OworICAgICAgICAgICAgICAgICAgICBtQ29zQWNjdW11bGF0b3IgKz0gc2FtcGxlICogY29zZihtUGhhc2UpOworICAgICAgICAgICAgICAgICAgICBtRnJhbWVzQWNjdW11bGF0ZWQrKzsKKyAgICAgICAgICAgICAgICAgICAgLy8gTXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBwZXJpb2Qgb3IgdGhlIGNhbGN1bGF0aW9uIHdpbGwgbm90IGJlIGFjY3VyYXRlLgorICAgICAgICAgICAgICAgICAgICBpZiAobUZyYW1lc0FjY3VtdWxhdGVkID09IG1TaW5lUGVyaW9kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgY29lZmZpY2llbnQgPSAwLjE7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGhhc2VPZmZzZXQgPSAwLjA7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbWFnbml0dWRlID0gY2FsY3VsYXRlTWFnbml0dWRlKCZwaGFzZU9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmUgcG9sZSBhdmVyYWdpbmcgZmlsdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgbU1hZ25pdHVkZSA9IChtTWFnbml0dWRlICogKDEuMCAtIGNvZWZmaWNpZW50KSkgKyAobWFnbml0dWRlICogY29lZmZpY2llbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRBY2N1bXVsYXRvcigpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTcxOCw2ICs3OTMsOSBAQAogCiAgICAgICAgIC8vIERvIHRoZXNlIG9uY2UgcGVyIGJ1ZmZlci4KICAgICAgICAgc3dpdGNoIChtU3RhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfSURMRToKKyAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9JTU1VTkU7IC8vIHNvIHdlIGNhbiB0ZWxsIHdoZW4KKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgU1RBVEVfSU1NVU5FOgogICAgICAgICAgICAgICAgIG1Eb3duQ291bnRlciAtPSBudW1GcmFtZXM7CiAgICAgICAgICAgICAgICAgaWYgKG1Eb3duQ291bnRlciA8PSAwKSB7CkBAIC03NDgsMjEgKzgyNiwyOSBAQAogICAgIHZvaWQgcmVzZXQoKSBvdmVycmlkZSB7CiAgICAgICAgIG1HbGl0Y2hDb3VudCA9IDA7CiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0lNTVVORTsKLSAgICAgICAgbVBoYXNlSW5jcmVtZW50ID0gMi4wICogTV9QSSAvIG1QZXJpb2Q7Ci0gICAgICAgIHByaW50ZigicGhhc2VJbmMgPSAlZiBmb3IgcGVyaW9kICVkXG4iLCBtUGhhc2VJbmNyZW1lbnQsIG1QZXJpb2QpOworICAgICAgICBtRG93bkNvdW50ZXIgPSBJTU1VTkVfRlJBTUVfQ09VTlQ7CisgICAgICAgIG1QaGFzZUluY3JlbWVudCA9IDIuMCAqIE1fUEkgLyBtU2luZVBlcmlvZDsKKyAgICAgICAgcHJpbnRmKCJwaGFzZUluYyA9ICVmIGZvciBwZXJpb2QgJWRcbiIsIG1QaGFzZUluY3JlbWVudCwgbVNpbmVQZXJpb2QpOwogICAgICAgICByZXNldEFjY3VtdWxhdG9yKCk7CisgICAgICAgIG1Qcm9jZXNzQ291bnQgPSAwOwogICAgIH0KIAogcHJpdmF0ZToKIAogICAgIGVudW0gc2luZV9zdGF0ZV90IHsKKyAgICAgICAgU1RBVEVfSURMRSwKICAgICAgICAgU1RBVEVfSU1NVU5FLAogICAgICAgICBTVEFURV9XQUlUSU5HX0ZPUl9TSUdOQUwsCiAgICAgICAgIFNUQVRFX1dBSVRJTkdfRk9SX0xPQ0ssCiAgICAgICAgIFNUQVRFX0xPQ0tFRAogICAgIH07CiAKLSAgICBpbnQgICAgIG1QZXJpb2QgPSA3OTsKKyAgICBlbnVtIGNvbnN0YW50cyB7CisgICAgICAgIElNTVVORV9GUkFNRV9DT1VOVCA9IDQ4ICogNTAwLAorICAgICAgICBQRVJJT0RTX05FRURFRF9GT1JfTE9DSyA9IDgKKyAgICB9OworCisgICAgaW50ICAgICBtU2luZVBlcmlvZCA9IDc5OwogICAgIGRvdWJsZSAgbVBoYXNlSW5jcmVtZW50ID0gMC4wOwogICAgIGRvdWJsZSAgbVBoYXNlID0gMC4wOwogICAgIGRvdWJsZSAgbVBoYXNlT2Zmc2V0ID0gMC4wOwpAQCAtNzcxLDIwICs4NTcsMTkgQEAKICAgICBkb3VibGUgIG1UaHJlc2hvbGQgPSAwLjAwNTsKICAgICBkb3VibGUgIG1Ub2xlcmFuY2UgPSAwLjAxOwogICAgIGludDMyX3QgbUZyYW1lc0FjY3VtdWxhdGVkID0gMDsKKyAgICBpbnQzMl90IG1Qcm9jZXNzQ291bnQgPSAwOwogICAgIGRvdWJsZSAgbVNpbkFjY3VtdWxhdG9yID0gMC4wOwogICAgIGRvdWJsZSAgbUNvc0FjY3VtdWxhdG9yID0gMC4wOwogICAgIGludDMyX3QgbUdsaXRjaENvdW50ID0gMDsKICAgICBkb3VibGUgIG1QZWFrQW1wbGl0dWRlID0gMC4wOwotICAgIGludCAgICAgbURvd25Db3VudGVyID0gNDAwMDsKKyAgICBpbnQgICAgIG1Eb3duQ291bnRlciA9IElNTVVORV9GUkFNRV9DT1VOVDsKICAgICBpbnQzMl90IG1GcmFtZUNvdW50ZXIgPSAwOwogICAgIGZsb2F0ICAgbU91dHB1dEFtcGxpdHVkZSA9IDAuNzU7CiAKLSAgICBpbnQzMl90IG1aZXJvQ3Jvc3NpbmdzID0gMDsKLQogICAgIFBzZXVkb1JhbmRvbSAgbVdoaXRlTm9pc2U7CiAgICAgZmxvYXQgICBtTm9pc2VBbXBsaXR1ZGUgPSAwLjAwOyAvLyBVc2VkIHRvIGV4cGVyaW1lbnQgd2l0aCB3YXJibGluZyBjYXVzZWQgYnkgRFJDLgogCi0gICAgc2luZV9zdGF0ZV90ICBtU3RhdGUgPSBTVEFURV9JTU1VTkU7CisgICAgc2luZV9zdGF0ZV90ICBtU3RhdGUgPSBTVEFURV9JRExFOwogfTsKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2xvb3BiYWNrLmNwcCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvbG9vcGJhY2suY3BwCmluZGV4IGRmMGRmMDQuLjI2ZDFlNGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvbG9vcGJhY2suY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvbG9vcGJhY2suY3BwCkBAIC0xOSw5ICsxOSwxMiBAQAogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxjY3R5cGU+CisjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KQEAgLTM0LDIzICszNywzMiBAQAogCiAvLyBUYWcgZm9yIG1hY2hpbmUgcmVhZGFibGUgcmVzdWx0cyBhcyBwcm9wZXJ0eSA9IHZhbHVlIHBhaXJzCiAjZGVmaW5lIFJFU1VMVF9UQUcgICAgICAgICAgICAgICJSRVNVTFQ6ICIKLSNkZWZpbmUgU0FNUExFX1JBVEUgICAgICAgICAgICAgNDgwMDAKICNkZWZpbmUgTlVNX1NFQ09ORFMgICAgICAgICAgICAgNQorI2RlZmluZSBQRVJJT0RfTUlMTElTICAgICAgICAgICAxMDAwCiAjZGVmaW5lIE5VTV9JTlBVVF9DSEFOTkVMUyAgICAgIDEKLSNkZWZpbmUgRklMRU5BTUUgICAgICAgICAgICAgICAgIi9kYXRhL29ib2VfaW5wdXQucmF3IgotI2RlZmluZSBBUFBfVkVSU0lPTiAgICAgICAgICAgICAiMC4xLjIyIgorI2RlZmluZSBGSUxFTkFNRV9BTEwgICAgICAgICAgICAiL2RhdGEvbG9vcGJhY2tfYWxsLndhdiIKKyNkZWZpbmUgRklMRU5BTUVfRUNIT1MgICAgICAgICAgIi9kYXRhL2xvb3BiYWNrX2VjaG9zLndhdiIKKyNkZWZpbmUgQVBQX1ZFUlNJT04gICAgICAgICAgICAgIjAuMi4wMyIKKworY29uc3RleHByIGludCBrTnVtQ2FsbGJhY2tzVG9EcmFpbiAgID0gMjA7Citjb25zdGV4cHIgaW50IGtOdW1DYWxsYmFja3NUb0Rpc2NhcmQgPSAyMDsKIAogc3RydWN0IExvb3BiYWNrRGF0YSB7CiAgICAgQUF1ZGlvU3RyZWFtICAgICAgKmlucHV0U3RyZWFtID0gbnVsbHB0cjsKICAgICBpbnQzMl90ICAgICAgICAgICAgaW5wdXRGcmFtZXNNYXhpbXVtID0gMDsKLSAgICBpbnQxNl90ICAgICAgICAgICAqaW5wdXREYXRhID0gbnVsbHB0cjsKLSAgICBpbnQxNl90ICAgICAgICAgICAgcGVha1Nob3J0ID0gMDsKLSAgICBmbG9hdCAgICAgICAgICAgICAqY29udmVyc2lvbkJ1ZmZlciA9IG51bGxwdHI7CisgICAgaW50MTZfdCAgICAgICAgICAgKmlucHV0U2hvcnREYXRhID0gbnVsbHB0cjsKKyAgICBmbG9hdCAgICAgICAgICAgICAqaW5wdXRGbG9hdERhdGEgPSBudWxscHRyOworICAgIGFhdWRpb19mb3JtYXRfdCAgICBhY3R1YWxJbnB1dEZvcm1hdCA9IEFBVURJT19GT1JNQVRfSU5WQUxJRDsKICAgICBpbnQzMl90ICAgICAgICAgICAgYWN0dWFsSW5wdXRDaGFubmVsQ291bnQgPSAwOwogICAgIGludDMyX3QgICAgICAgICAgICBhY3R1YWxPdXRwdXRDaGFubmVsQ291bnQgPSAwOwotICAgIGludDMyX3QgICAgICAgICAgICBpbnB1dEJ1ZmZlcnNUb0Rpc2NhcmQgPSAxMDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgbnVtQ2FsbGJhY2tzVG9EcmFpbiA9IGtOdW1DYWxsYmFja3NUb0RyYWluOworICAgIGludDMyX3QgICAgICAgICAgICBudW1DYWxsYmFja3NUb0Rpc2NhcmQgPSBrTnVtQ2FsbGJhY2tzVG9EaXNjYXJkOwogICAgIGludDMyX3QgICAgICAgICAgICBtaW5OdW1GcmFtZXMgPSBJTlQzMl9NQVg7CiAgICAgaW50MzJfdCAgICAgICAgICAgIG1heE51bUZyYW1lcyA9IDA7CisgICAgaW50MzJfdCAgICAgICAgICAgIGluc3VmZmljaWVudFJlYWRDb3VudCA9IDA7CisgICAgaW50MzJfdCAgICAgICAgICAgIGluc3VmZmljaWVudFJlYWRGcmFtZXMgPSAwOworICAgIGludDMyX3QgICAgICAgICAgICBmcmFtZXNSZWFkVG90YWwgPSAwOworICAgIGludDMyX3QgICAgICAgICAgICBmcmFtZXNXcml0dGVuVG90YWwgPSAwOwogICAgIGJvb2wgICAgICAgICAgICAgICBpc0RvbmUgPSBmYWxzZTsKIAogICAgIGFhdWRpb19yZXN1bHRfdCAgICBpbnB1dEVycm9yID0gQUFVRElPX09LOwpAQCAtNTgsMTQgKzcwLDE0IEBACiAKICAgICBTaW5lQW5hbHl6ZXIgICAgICAgc2luZUFuYWx5emVyOwogICAgIEVjaG9BbmFseXplciAgICAgICBlY2hvQW5hbHl6ZXI7Ci0gICAgQXVkaW9SZWNvcmRpbmcgICAgIGF1ZGlvUmVjb3JkZXI7CisgICAgQXVkaW9SZWNvcmRpbmcgICAgIGF1ZGlvUmVjb3JkaW5nOwogICAgIExvb3BiYWNrUHJvY2Vzc29yICpsb29wYmFja1Byb2Nlc3NvcjsKIH07CiAKIHN0YXRpYyB2b2lkIGNvbnZlcnRQY20xNlRvRmxvYXQoY29uc3QgaW50MTZfdCAqc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcykgewotICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IDEuMGYgLyAzMjc2OC4wZjsKKyAgICBjb25zdGV4cHIgZmxvYXQgc2NhbGVyID0gMS4wZiAvIDMyNzY4LjBmOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CiAgICAgICAgIGRlc3RpbmF0aW9uW2ldID0gc291cmNlW2ldICogc2NhbGVyOwogICAgIH0KQEAgLTc1LDYgKzg3LDI4IEBACiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IENBTExCQUNLID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gQ2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBmaWxscyB0aGUgYXVkaW8gb3V0cHV0IGJ1ZmZlci4KKworc3RhdGljIGludDMyX3QgcmVhZEZvcm1hdHRlZERhdGEoTG9vcGJhY2tEYXRhICpteURhdGEsIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gQUFVRElPX0VSUk9SX0lOVkFMSURfRk9STUFUOworICAgIGlmIChteURhdGEtPmFjdHVhbElucHV0Rm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgeworICAgICAgICBmcmFtZXNSZWFkID0gQUF1ZGlvU3RyZWFtX3JlYWQobXlEYXRhLT5pbnB1dFN0cmVhbSwgbXlEYXRhLT5pbnB1dFNob3J0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogdGltZW91dE5hbm9zZWNvbmRzICovKTsKKyAgICB9IGVsc2UgaWYgKG15RGF0YS0+YWN0dWFsSW5wdXRGb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICAgICAgZnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9yZWFkKG15RGF0YS0+aW5wdXRTdHJlYW0sIG15RGF0YS0+aW5wdXRGbG9hdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIHRpbWVvdXROYW5vc2Vjb25kcyAqLyk7CisgICAgfQorICAgIGlmIChmcmFtZXNSZWFkIDwgMCkgeworICAgICAgICBteURhdGEtPmlucHV0RXJyb3IgPSBmcmFtZXNSZWFkOworICAgICAgICBwcmludGYoIkVSUk9SIGluIHJlYWQgPSAlZCA9ICVzXG4iLCBmcmFtZXNSZWFkLAorICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQoZnJhbWVzUmVhZCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIG15RGF0YS0+ZnJhbWVzUmVhZFRvdGFsICs9IGZyYW1lc1JlYWQ7CisgICAgfQorICAgIHJldHVybiBmcmFtZXNSZWFkOworfQorCiBzdGF0aWMgYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgTXlEYXRhQ2FsbGJhY2tQcm9jKAogICAgICAgICBBQXVkaW9TdHJlYW0gKm91dHB1dFN0cmVhbSwKICAgICAgICAgdm9pZCAqdXNlckRhdGEsCkBAIC0xMDEsNDYgKzEzNSw3MSBAQAogICAgICAgICBteURhdGEtPm1pbk51bUZyYW1lcyA9IG51bUZyYW1lczsKICAgICB9CiAKLSAgICBpZiAobXlEYXRhLT5pbnB1dEJ1ZmZlcnNUb0Rpc2NhcmQgPiAwKSB7CisgICAgLy8gU2lsZW5jZSB0aGUgb3V0cHV0LgorICAgIGludDMyX3QgbnVtQnl0ZXMgPSBudW1GcmFtZXMgKiBteURhdGEtPmFjdHVhbE91dHB1dENoYW5uZWxDb3VudCAqIHNpemVvZihmbG9hdCk7CisgICAgbWVtc2V0KGF1ZGlvRGF0YSwgMCAvKiB2YWx1ZSAqLywgbnVtQnl0ZXMpOworCisgICAgaWYgKG15RGF0YS0+bnVtQ2FsbGJhY2tzVG9EcmFpbiA+IDApIHsKICAgICAgICAgLy8gRHJhaW4gdGhlIGlucHV0LgogICAgICAgICBkbyB7Ci0gICAgICAgICAgICBmcmFtZXNSZWFkID0gQUF1ZGlvU3RyZWFtX3JlYWQobXlEYXRhLT5pbnB1dFN0cmVhbSwgbXlEYXRhLT5pbnB1dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsIDApOwotICAgICAgICAgICAgaWYgKGZyYW1lc1JlYWQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgbXlEYXRhLT5pbnB1dEVycm9yID0gZnJhbWVzUmVhZDsKLSAgICAgICAgICAgICAgICBwcmludGYoIkVSUk9SIGluIHJlYWQgPSAlZCIsIGZyYW1lc1JlYWQpOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZnJhbWVzUmVhZCA+IDApIHsKLSAgICAgICAgICAgICAgICBteURhdGEtPmlucHV0QnVmZmVyc1RvRGlzY2FyZC0tOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlKGZyYW1lc1JlYWQgPiAwKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcmFtZXNSZWFkID0gQUF1ZGlvU3RyZWFtX3JlYWQobXlEYXRhLT5pbnB1dFN0cmVhbSwgbXlEYXRhLT5pbnB1dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsIDApOwotICAgICAgICBpZiAoZnJhbWVzUmVhZCA8IDApIHsKLSAgICAgICAgICAgIG15RGF0YS0+aW5wdXRFcnJvciA9IGZyYW1lc1JlYWQ7Ci0gICAgICAgICAgICBwcmludGYoIkVSUk9SIGluIHJlYWQgPSAlZCIsIGZyYW1lc1JlYWQpOwotICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QOwotICAgICAgICB9IGVsc2UgaWYgKGZyYW1lc1JlYWQgPiAwKSB7CisgICAgICAgICAgICBmcmFtZXNSZWFkID0gcmVhZEZvcm1hdHRlZERhdGEobXlEYXRhLCBudW1GcmFtZXMpOworICAgICAgICAgICAgLy8gSWdub3JlIGVycm9ycyBiZWNhdXNlIGlucHV0IHN0cmVhbSBtYXkgbm90IGJlIHN0YXJ0ZWQgeWV0LgorICAgICAgICB9IHdoaWxlIChmcmFtZXNSZWFkID4gMCk7CisgICAgICAgIG15RGF0YS0+bnVtQ2FsbGJhY2tzVG9EcmFpbi0tOwogCi0gICAgICAgICAgICBteURhdGEtPmF1ZGlvUmVjb3JkZXIud3JpdGUobXlEYXRhLT5pbnB1dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlEYXRhLT5hY3R1YWxJbnB1dENoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMpOworICAgIH0gZWxzZSBpZiAobXlEYXRhLT5udW1DYWxsYmFja3NUb0Rpc2NhcmQgPiAwKSB7CisgICAgICAgIC8vIElnbm9yZS4gQWxsb3cgdGhlIGlucHV0IHRvIGZpbGwgYmFjayB1cCB0byBlcXVpbGlicml1bSB3aXRoIHRoZSBvdXRwdXQuCisgICAgICAgIGZyYW1lc1JlYWQgPSByZWFkRm9ybWF0dGVkRGF0YShteURhdGEsIG51bUZyYW1lcyk7CisgICAgICAgIGlmIChmcmFtZXNSZWFkIDwgMCkgeworICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QOworICAgICAgICB9CisgICAgICAgIG15RGF0YS0+bnVtQ2FsbGJhY2tzVG9EaXNjYXJkLS07CisKKyAgICB9IGVsc2UgeworCisgICAgICAgIGludDMyX3QgbnVtSW5wdXRCeXRlcyA9IG51bUZyYW1lcyAqIG15RGF0YS0+YWN0dWFsSW5wdXRDaGFubmVsQ291bnQgKiBzaXplb2YoZmxvYXQpOworICAgICAgICBtZW1zZXQobXlEYXRhLT5pbnB1dEZsb2F0RGF0YSwgMCAvKiB2YWx1ZSAqLywgbnVtSW5wdXRCeXRlcyk7CisKKyAgICAgICAgLy8gUHJvY2VzcyBkYXRhIGFmdGVyIGVxdWlsaWJyaXVtLgorICAgICAgICBpbnQ2NF90IGlucHV0RnJhbWVzV3JpdHRlbiA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKG15RGF0YS0+aW5wdXRTdHJlYW0pOworICAgICAgICBpbnQ2NF90IGlucHV0RnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKG15RGF0YS0+aW5wdXRTdHJlYW0pOworICAgICAgICBpbnQ2NF90IGZyYW1lc0F2YWlsYWJsZSA9IGlucHV0RnJhbWVzV3JpdHRlbiAtIGlucHV0RnJhbWVzUmVhZDsKKyAgICAgICAgZnJhbWVzUmVhZCA9IHJlYWRGb3JtYXR0ZWREYXRhKG15RGF0YSwgbnVtRnJhbWVzKTsKKyAgICAgICAgaWYgKGZyYW1lc1JlYWQgPCAwKSB7CisgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1A7CisgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgIGlmIChmcmFtZXNSZWFkIDwgbnVtRnJhbWVzKSB7CisgICAgICAgICAgICAgICAgaWYoZnJhbWVzUmVhZCA8IChpbnQzMl90KSBmcmFtZXNBdmFpbGFibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJpbnN1ZmZpY2llbnQgYnV0IG51bUZyYW1lcyA9ICVkLCBmcmFtZXNSZWFkID0gJWQsIGF2YWlsYWJsZSA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLCBmcmFtZXNSZWFkLCAoaW50KSBmcmFtZXNBdmFpbGFibGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBteURhdGEtPmluc3VmZmljaWVudFJlYWRDb3VudCsrOworICAgICAgICAgICAgICAgIG15RGF0YS0+aW5zdWZmaWNpZW50UmVhZEZyYW1lcyArPSBudW1GcmFtZXMgLSBmcmFtZXNSZWFkOyAvLyBkZWZpY2l0CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1JlYWQgKiBteURhdGEtPmFjdHVhbElucHV0Q2hhbm5lbENvdW50OwotICAgICAgICAgICAgY29udmVydFBjbTE2VG9GbG9hdChteURhdGEtPmlucHV0RGF0YSwgbXlEYXRhLT5jb252ZXJzaW9uQnVmZmVyLCBudW1TYW1wbGVzKTsKIAotICAgICAgICAgICAgbXlEYXRhLT5sb29wYmFja1Byb2Nlc3Nvci0+cHJvY2VzcyhteURhdGEtPmNvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlEYXRhLT5hY3R1YWxJbnB1dENoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15RGF0YS0+YWN0dWFsT3V0cHV0Q2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc1JlYWQpOworICAgICAgICAgICAgaWYgKG15RGF0YS0+YWN0dWFsSW5wdXRGb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7CisgICAgICAgICAgICAgICAgY29udmVydFBjbTE2VG9GbG9hdChteURhdGEtPmlucHV0U2hvcnREYXRhLCBteURhdGEtPmlucHV0RmxvYXREYXRhLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFNhdmUgZm9yIGxhdGVyLgorICAgICAgICAgICAgbXlEYXRhLT5hdWRpb1JlY29yZGluZy53cml0ZShteURhdGEtPmlucHV0RmxvYXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteURhdGEtPmFjdHVhbElucHV0Q2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMpOworICAgICAgICAgICAgLy8gQW5hbHl6ZSB0aGUgZGF0YS4KKyAgICAgICAgICAgIG15RGF0YS0+bG9vcGJhY2tQcm9jZXNzb3ItPnByb2Nlc3MobXlEYXRhLT5pbnB1dEZsb2F0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlEYXRhLT5hY3R1YWxJbnB1dENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlEYXRhLT5hY3R1YWxPdXRwdXRDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcyk7CiAgICAgICAgICAgICBteURhdGEtPmlzRG9uZSA9IG15RGF0YS0+bG9vcGJhY2tQcm9jZXNzb3ItPmlzRG9uZSgpOwogICAgICAgICAgICAgaWYgKG15RGF0YS0+aXNEb25lKSB7CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQorICAgIG15RGF0YS0+ZnJhbWVzV3JpdHRlblRvdGFsICs9IG51bUZyYW1lczsKIAogICAgIHJldHVybiByZXN1bHQ7CiB9CkBAIC0xNDgsMjkgKzIwNywyOCBAQAogc3RhdGljIHZvaWQgTXlFcnJvckNhbGxiYWNrUHJvYygKICAgICAgICAgQUF1ZGlvU3RyZWFtICpzdHJlYW0gX191bnVzZWQsCiAgICAgICAgIHZvaWQgKnVzZXJEYXRhIF9fdW51c2VkLAotICAgICAgICBhYXVkaW9fcmVzdWx0X3QgZXJyb3IpCi17CisgICAgICAgIGFhdWRpb19yZXN1bHRfdCBlcnJvcikgewogICAgIHByaW50ZigiRXJyb3IgQ2FsbGJhY2ssIGVycm9yOiAlZFxuIiwoaW50KWVycm9yKTsKICAgICBMb29wYmFja0RhdGEgKm15RGF0YSA9IChMb29wYmFja0RhdGEgKikgdXNlckRhdGE7CiAgICAgbXlEYXRhLT5vdXRwdXRFcnJvciA9IGVycm9yOwogfQogCiBzdGF0aWMgdm9pZCB1c2FnZSgpIHsKLSAgICBwcmludGYoImxvb3BiYWNrOiAtbntudW1CdXJzdHN9IC1we291dFBlcmZ9IC1Qe2luUGVyZn0gLXR7dGVzdH0gLWd7Z2Fpbn0gLWZ7ZnJlcX1cbiIpOwotICAgIHByaW50ZigiICAgICAgICAgIC1je2lucHV0Q2hhbm5lbHN9XG4iKTsKLSAgICBwcmludGYoIiAgICAgICAgICAtZntmcmVxfSAgc2luZSBmcmVxdWVuY3lcbiIpOwotICAgIHByaW50ZigiICAgICAgICAgIC1ne2dhaW59ICByZWNpcmN1bGF0aW5nIGxvb3BiYWNrIGdhaW5cbiIpOwotICAgIHByaW50ZigiICAgICAgICAgIC1tIGVuYWJsZSBNTUFQIG1vZGVcbiIpOwotICAgIHByaW50ZigiICAgICAgICAgIC1ue251bUJ1cnN0c30gYnVmZmVyIHNpemUsIGZvciBleGFtcGxlIDIgZm9yIGRvdWJsZSBidWZmZXJlZFxuIik7Ci0gICAgcHJpbnRmKCIgICAgICAgICAgLXB7b3V0UGVyZn0gIHNldCBvdXRwdXQgQUFVRElPX1BFUkZPUk1BTkNFX01PREUqXG4iKTsKLSAgICBwcmludGYoIiAgICAgICAgICAtUHtpblBlcmZ9ICAgc2V0IGlucHV0IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFKlxuIik7Ci0gICAgcHJpbnRmKCIgICAgICAgICAgICAgIG4gZm9yIF9OT05FXG4iKTsKLSAgICBwcmludGYoIiAgICAgICAgICAgICAgbCBmb3IgX0xBVEVOQ1lcbiIpOwotICAgIHByaW50ZigiICAgICAgICAgICAgICBwIGZvciBfUE9XRVJfU0FWSU5HO1xuIik7Ci0gICAgcHJpbnRmKCIgICAgICAgICAgLXR7dGVzdH0gICBzZWxlY3QgdGVzdCBtb2RlXG4iKTsKLSAgICBwcmludGYoIiAgICAgICAgICAgICAgbSBmb3Igc2luZSBtYWduaXR1ZGVcbiIpOwotICAgIHByaW50ZigiICAgICAgICAgICAgICBlIGZvciBlY2hvIGxhdGVuY3kgKGRlZmF1bHQpXG4iKTsKLSAgICBwcmludGYoIkZvciBleGFtcGxlOiAgbG9vcGJhY2sgLWIyIC1wbCAtUG5cbiIpOworICAgIHByaW50ZigiVXNhZ2U6IGFhdWRpb19sb29wYmFjayBbT1BUSU9OXS4uLlxuXG4iKTsKKyAgICBBQXVkaW9BcmdzUGFyc2VyOjp1c2FnZSgpOworICAgIHByaW50ZigiICAgICAgLUN7Y2hhbm5lbHN9ICAgICAgbnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzXG4iKTsKKyAgICBwcmludGYoIiAgICAgIC1GezAsMSwyfSAgICAgICAgIGlucHV0IGZvcm1hdCwgMT1JMTYsIDI9RkxPQVRcbiIpOworICAgIHByaW50ZigiICAgICAgLWd7Z2Fpbn0gICAgICAgICAgcmVjaXJjdWxhdGluZyBsb29wYmFjayBnYWluXG4iKTsKKyAgICBwcmludGYoIiAgICAgIC1Qe2luUGVyZn0gICAgICAgIHNldCBpbnB1dCBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERSpcbiIpOworICAgIHByaW50ZigiICAgICAgICAgIG4gZm9yIF9OT05FXG4iKTsKKyAgICBwcmludGYoIiAgICAgICAgICBsIGZvciBfTEFURU5DWVxuIik7CisgICAgcHJpbnRmKCIgICAgICAgICAgcCBmb3IgX1BPV0VSX1NBVklOR1xuIik7CisgICAgcHJpbnRmKCIgICAgICAtdHt0ZXN0fSAgICAgICAgICBzZWxlY3QgdGVzdCBtb2RlXG4iKTsKKyAgICBwcmludGYoIiAgICAgICAgICBtIGZvciBzaW5lIG1hZ25pdHVkZVxuIik7CisgICAgcHJpbnRmKCIgICAgICAgICAgZSBmb3IgZWNobyBsYXRlbmN5IChkZWZhdWx0KVxuIik7CisgICAgcHJpbnRmKCIgICAgICAgICAgZiBmb3IgZmlsZSBsYXRlbmN5LCBhbmFseXplcyAlc1xuXG4iLCBGSUxFTkFNRV9FQ0hPUyk7CisgICAgcHJpbnRmKCIgICAgICAtWCAgdXNlIEVYQ0xVU0lWRSBtb2RlIGZvciBpbnB1dFxuIik7CisgICAgcHJpbnRmKCJFeGFtcGxlOiAgYWF1ZGlvX2xvb3BiYWNrIC1uMiAtcGwgLVBsIC14XG4iKTsKIH0KIAogc3RhdGljIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGFyc2VQZXJmb3JtYW5jZU1vZGUoY2hhciBjKSB7CkBAIC0xOTYsNiArMjU0LDcgQEAKIGVudW0gewogICAgIFRFU1RfU0lORV9NQUdOSVRVREUgPSAwLAogICAgIFRFU1RfRUNIT19MQVRFTkNZLAorICAgIFRFU1RfRklMRV9MQVRFTkNZLAogfTsKIAogc3RhdGljIGludCBwYXJzZVRlc3RNb2RlKGNoYXIgYykgewpAQCAtMjA4LDYgKzI2Nyw5IEBACiAgICAgICAgIGNhc2UgJ2UnOgogICAgICAgICAgICAgdGVzdE1vZGUgPSBURVNUX0VDSE9fTEFURU5DWTsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdmJzoKKyAgICAgICAgICAgIHRlc3RNb2RlID0gVEVTVF9GSUxFX0xBVEVOQ1k7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHByaW50ZigiRVJST1IgaW4gdmFsdWUgdGVzdCBtb2RlICVjXG4iLCBjKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjMxLDkgKzI5MywxMCBAQAogICAgICAgICB9CiAgICAgfQogICAgIGZsb2F0IGdhaW4gPSAwLjk4ZiAvIG1heFNhbXBsZTsKKwogICAgIGZvciAoaW50MzJfdCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICAgICBmbG9hdCBzYW1wbGUgPSBkYXRhW2ldOwotICAgICAgICBwcmludGYoIiU1LjNmICIsIHNhbXBsZSk7IC8vIGFjdHVhbCB2YWx1ZQorICAgICAgICBwcmludGYoIiU2ZDogJTcuNGYgIiwgaSwgc2FtcGxlKTsgLy8gYWN0dWFsIHZhbHVlCiAgICAgICAgIHNhbXBsZSAqPSBnYWluOwogICAgICAgICBwcmludEF1ZGlvU2NvcGUoc2FtcGxlKTsKICAgICB9CkBAIC0yNDUsMzMgKzMwOCwyNiBAQAogaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQogewogCi0gICAgQUF1ZGlvQXJnc1BhcnNlciAgICAgYXJnUGFyc2VyOwotICAgIEFBdWRpb1NpbXBsZVBsYXllciAgIHBsYXllcjsKLSAgICBBQXVkaW9TaW1wbGVSZWNvcmRlciByZWNvcmRlcjsKLSAgICBMb29wYmFja0RhdGEgICAgICAgICBsb29wYmFja0RhdGE7Ci0gICAgQUF1ZGlvU3RyZWFtICAgICAgICAqb3V0cHV0U3RyZWFtID0gbnVsbHB0cjsKKyAgICBBQXVkaW9BcmdzUGFyc2VyICAgICAgYXJnUGFyc2VyOworICAgIEFBdWRpb1NpbXBsZVBsYXllciAgICBwbGF5ZXI7CisgICAgQUF1ZGlvU2ltcGxlUmVjb3JkZXIgIHJlY29yZGVyOworICAgIExvb3BiYWNrRGF0YSAgICAgICAgICBsb29wYmFja0RhdGE7CisgICAgQUF1ZGlvU3RyZWFtICAgICAgICAgKmlucHV0U3RyZWFtICAgICAgICAgICAgICAgPSBudWxscHRyOworICAgIEFBdWRpb1N0cmVhbSAgICAgICAgICpvdXRwdXRTdHJlYW0gICAgICAgICAgICAgICA9IG51bGxwdHI7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgICAgICByZXN1bHQgPSBBQVVESU9fT0s7Ci0gICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHJlcXVlc3RlZElucHV0U2hhcmluZ01vZGUgICAgID0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQ7CisgICAgYWF1ZGlvX3Jlc3VsdF90ICAgICAgIHJlc3VsdCA9IEFBVURJT19PSzsKKyAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3QgcmVxdWVzdGVkSW5wdXRTaGFyaW5nTW9kZSAgPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkSW5wdXRDaGFubmVsQ291bnQgPSBOVU1fSU5QVVRfQ0hBTk5FTFM7Ci0gICAgY29uc3QgaW50ICAgICAgICAgICAgIHJlcXVlc3RlZE91dHB1dENoYW5uZWxDb3VudCA9IEFBVURJT19VTlNQRUNJRklFRDsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgYWN0dWFsU2FtcGxlUmF0ZSA9IDA7Ci0gICAgY29uc3QgYWF1ZGlvX2Zvcm1hdF90IHJlcXVlc3RlZElucHV0Rm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2OwotICAgIGNvbnN0IGFhdWRpb19mb3JtYXRfdCByZXF1ZXN0ZWRPdXRwdXRGb3JtYXQgPSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKLSAgICBhYXVkaW9fZm9ybWF0X3QgICAgICAgYWN0dWFsSW5wdXRGb3JtYXQ7Ci0gICAgYWF1ZGlvX2Zvcm1hdF90ICAgICAgIGFjdHVhbE91dHB1dEZvcm1hdDsKLSAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IG91dHB1dFBlcmZvcm1hbmNlTGV2ZWwgPSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWTsKLSAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IGlucHV0UGVyZm9ybWFuY2VMZXZlbCA9IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZOworICAgIGFhdWRpb19mb3JtYXRfdCAgICAgICByZXF1ZXN0ZWRJbnB1dEZvcm1hdCAgICAgICA9IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ7CisgICAgY29uc3QgYWF1ZGlvX2Zvcm1hdF90IHJlcXVlc3RlZE91dHB1dEZvcm1hdCAgICAgID0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBpbnB1dFBlcmZvcm1hbmNlTGV2ZWwgID0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1k7CiAKLSAgICBpbnQgdGVzdE1vZGUgPSBURVNUX0VDSE9fTEFURU5DWTsKLSAgICBkb3VibGUgZ2FpbiA9IDEuMDsKKyAgICBhYXVkaW9fZm9ybWF0X3QgICAgICAgYWN0dWFsT3V0cHV0Rm9ybWF0ICAgICAgICAgPSBBQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgIGFjdHVhbFNhbXBsZVJhdGUgICAgICAgICAgID0gMDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgd3JpdHRlbiAgICAgICAgICAgICAgICAgICAgPSAwOwogCi0gICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IHN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9VTklOSVRJQUxJWkVEOwotICAgIGludDMyX3QgZnJhbWVzUGVyQnVyc3QgPSAwOwotICAgIGZsb2F0ICpvdXRwdXREYXRhID0gTlVMTDsKLSAgICBkb3VibGUgZGV2aWF0aW9uOwotICAgIGRvdWJsZSBsYXRlbmN5OwotICAgIGludDMyX3QgYnVyc3RzUGVyQnVmZmVyID0gMTsgLy8gc2luZ2xlIGJ1ZmZlcmVkCisgICAgaW50ICAgICAgICAgICAgICAgICAgIHRlc3RNb2RlICAgICAgICAgICAgICAgICAgID0gVEVTVF9FQ0hPX0xBVEVOQ1k7CisgICAgZG91YmxlICAgICAgICAgICAgICAgIGdhaW4gICAgICAgICAgICAgICAgICAgICAgID0gMS4wOwogCiAgICAgLy8gTWFrZSBwcmludGYgcHJpbnQgaW1tZWRpYXRlbHkgc28gdGhhdCBkZWJ1ZyBpbmZvIGlzIG5vdCBzdHVjawogICAgIC8vIGluIGEgYnVmZmVyIGlmIHdlIGhhbmcgb3IgY3Jhc2guCkBAIC0yODksNiArMzQ1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQyc6CiAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRJbnB1dENoYW5uZWxDb3VudCA9IGF0b2koJmFyZ1syXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnRic6CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRJbnB1dEZvcm1hdCA9IGF0b2koJmFyZ1syXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZyc6CiAgICAgICAgICAgICAgICAgICAgICAgICBnYWluID0gYXRvZigmYXJnWzJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMzIxLDggKzM4MCw5IEBACiAgICAgfQogCiAgICAgaW50MzJfdCByZXF1ZXN0ZWREdXJhdGlvbiA9IGFyZ1BhcnNlci5nZXREdXJhdGlvblNlY29uZHMoKTsKLSAgICBpbnQzMl90IHJlY29yZGluZ0R1cmF0aW9uID0gc3RkOjptaW4oNjAsIHJlcXVlc3RlZER1cmF0aW9uKTsKLSAgICBsb29wYmFja0RhdGEuYXVkaW9SZWNvcmRlci5hbGxvY2F0ZShyZWNvcmRpbmdEdXJhdGlvbiAqIFNBTVBMRV9SQVRFKTsKKyAgICBpbnQzMl90IHJlcXVlc3RlZER1cmF0aW9uTWlsbGlzID0gcmVxdWVzdGVkRHVyYXRpb24gKiBNSUxMSVNfUEVSX1NFQ09ORDsKKyAgICBpbnQzMl90IHRpbWVNaWxsaXMgPSAwOworICAgIGludDMyX3QgcmVjb3JkaW5nRHVyYXRpb24gPSBzdGQ6Om1pbig2MCAqIDUsIHJlcXVlc3RlZER1cmF0aW9uKTsKIAogICAgIHN3aXRjaCh0ZXN0TW9kZSkgewogICAgICAgICBjYXNlIFRFU1RfU0lORV9NQUdOSVRVREU6CkBAIC0zMzIsNiArMzkyLDE2IEBACiAgICAgICAgICAgICBsb29wYmFja0RhdGEuZWNob0FuYWx5emVyLnNldEdhaW4oZ2Fpbik7CiAgICAgICAgICAgICBsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3IgPSAmbG9vcGJhY2tEYXRhLmVjaG9BbmFseXplcjsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRFU1RfRklMRV9MQVRFTkNZOiB7CisgICAgICAgICAgICBsb29wYmFja0RhdGEuZWNob0FuYWx5emVyLnNldEdhaW4oZ2Fpbik7CisKKyAgICAgICAgICAgIGxvb3BiYWNrRGF0YS5sb29wYmFja1Byb2Nlc3NvciA9ICZsb29wYmFja0RhdGEuZWNob0FuYWx5emVyOworICAgICAgICAgICAgaW50IHJlYWQgPSBsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3ItPmxvYWQoRklMRU5BTUVfRUNIT1MpOworICAgICAgICAgICAgcHJpbnRmKCJtYWluKCkgcmVhZCAlZCBtb25vIHNhbXBsZXMgZnJvbSAlcyBvbiBBbmRyb2lkIGRldmljZVxuIiwgcmVhZCwgRklMRU5BTUVfRUNIT1MpOworICAgICAgICAgICAgbG9vcGJhY2tEYXRhLmxvb3BiYWNrUHJvY2Vzc29yLT5yZXBvcnQoKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTM0Miw1MSArNDEyLDc3IEBACiAgICAgcmVzdWx0ID0gcGxheWVyLm9wZW4oYXJnUGFyc2VyLCBNeURhdGFDYWxsYmFja1Byb2MsIE15RXJyb3JDYWxsYmFja1Byb2MsICZsb29wYmFja0RhdGEpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgLSAgcGxheWVyLm9wZW4oKSByZXR1cm5lZCAlZFxuIiwgcmVzdWx0KTsKLSAgICAgICAgZ290byBmaW5pc2g7CisgICAgICAgIGV4aXQoMSk7CiAgICAgfQogICAgIG91dHB1dFN0cmVhbSA9IHBsYXllci5nZXRTdHJlYW0oKTsKLSAgICBhcmdQYXJzZXIuY29tcGFyZVdpdGhTdHJlYW0ob3V0cHV0U3RyZWFtKTsKIAogICAgIGFjdHVhbE91dHB1dEZvcm1hdCA9IEFBdWRpb1N0cmVhbV9nZXRGb3JtYXQob3V0cHV0U3RyZWFtKTsKICAgICBhc3NlcnQoYWN0dWFsT3V0cHV0Rm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKIAotICAgIHByaW50ZigiSU5QVVQgc3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgIGFjdHVhbFNhbXBsZVJhdGUgPSBBQXVkaW9TdHJlYW1fZ2V0U2FtcGxlUmF0ZShvdXRwdXRTdHJlYW0pOworICAgIGxvb3BiYWNrRGF0YS5hdWRpb1JlY29yZGluZy5hbGxvY2F0ZShyZWNvcmRpbmdEdXJhdGlvbiAqIGFjdHVhbFNhbXBsZVJhdGUpOworICAgIGxvb3BiYWNrRGF0YS5hdWRpb1JlY29yZGluZy5zZXRTYW1wbGVSYXRlKGFjdHVhbFNhbXBsZVJhdGUpOworCisgICAgYXJnUGFyc2VyLmNvbXBhcmVXaXRoU3RyZWFtKG91dHB1dFN0cmVhbSk7CisKKyAgICBwcmludGYoIklOUFVUICBzdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAgICAgLy8gVXNlIGRpZmZlcmVudCBwYXJhbWV0ZXJzIGZvciB0aGUgaW5wdXQuCiAgICAgYXJnUGFyc2VyLnNldE51bWJlck9mQnVyc3RzKEFBVURJT19VTlNQRUNJRklFRCk7CiAgICAgYXJnUGFyc2VyLnNldEZvcm1hdChyZXF1ZXN0ZWRJbnB1dEZvcm1hdCk7CiAgICAgYXJnUGFyc2VyLnNldFBlcmZvcm1hbmNlTW9kZShpbnB1dFBlcmZvcm1hbmNlTGV2ZWwpOwogICAgIGFyZ1BhcnNlci5zZXRDaGFubmVsQ291bnQocmVxdWVzdGVkSW5wdXRDaGFubmVsQ291bnQpOwogICAgIGFyZ1BhcnNlci5zZXRTaGFyaW5nTW9kZShyZXF1ZXN0ZWRJbnB1dFNoYXJpbmdNb2RlKTsKKworICAgIC8vIE1ha2Ugc3VyZSB0aGUgaW5wdXQgYnVmZmVyIGhhcyBwbGVudHkgb2YgY2FwYWNpdHkuCisgICAgLy8gRXh0cmEgY2FwYWNpdHkgb24gaW5wdXQgc2hvdWxkIG5vdCBpbmNyZWFzZSBsYXRlbmN5IGlmIHdlIGtlZXAgaXQgZHJhaW5lZC4KKyAgICBpbnQzMl90IG91dHB1dEJ1ZmZlckNhcGFjaXR5ID0gQUF1ZGlvU3RyZWFtX2dldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMob3V0cHV0U3RyZWFtKTsKKyAgICBpbnQzMl90IGlucHV0QnVmZmVyQ2FwYWNpdHkgPSAyICogb3V0cHV0QnVmZmVyQ2FwYWNpdHk7CisgICAgYXJnUGFyc2VyLnNldEJ1ZmZlckNhcGFjaXR5KGlucHV0QnVmZmVyQ2FwYWNpdHkpOworCiAgICAgcmVzdWx0ID0gcmVjb3JkZXIub3BlbihhcmdQYXJzZXIpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgLSAgcmVjb3JkZXIub3BlbigpIHJldHVybmVkICVkXG4iLCByZXN1bHQpOwogICAgICAgICBnb3RvIGZpbmlzaDsKICAgICB9Ci0gICAgbG9vcGJhY2tEYXRhLmlucHV0U3RyZWFtID0gcmVjb3JkZXIuZ2V0U3RyZWFtKCk7Ci0gICAgYXJnUGFyc2VyLmNvbXBhcmVXaXRoU3RyZWFtKGxvb3BiYWNrRGF0YS5pbnB1dFN0cmVhbSk7CisgICAgaW5wdXRTdHJlYW0gPSBsb29wYmFja0RhdGEuaW5wdXRTdHJlYW0gPSByZWNvcmRlci5nZXRTdHJlYW0oKTsKIAotICAgIC8vIFRoaXMgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMgdGhhdCBhcmUgcmVhZCBpbiBvbmUgY2h1bmsgYnkgYSBETUEgY29udHJvbGxlcgotICAgIC8vIG9yIGEgRFNQIG9yIGEgbWl4ZXIuCi0gICAgZnJhbWVzUGVyQnVyc3QgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUGVyQnVyc3Qob3V0cHV0U3RyZWFtKTsKKyAgICB7CisgICAgICAgIGludDMyX3QgYWN0dWFsQ2FwYWNpdHkgPSBBQXVkaW9TdHJlYW1fZ2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyhpbnB1dFN0cmVhbSk7CisgICAgICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMoaW5wdXRTdHJlYW0sIGFjdHVhbENhcGFjaXR5KTsKKyAgICAgICAgaWYgKHJlc3VsdCA8IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgLSAgQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcygpIHJldHVybmVkICVkXG4iLCByZXN1bHQpOworICAgICAgICAgICAgZ290byBmaW5pc2g7CisgICAgICAgIH0gZWxzZSB7fQorICAgIH0KIAotICAgIGFjdHVhbElucHV0Rm9ybWF0ID0gQUF1ZGlvU3RyZWFtX2dldEZvcm1hdChvdXRwdXRTdHJlYW0pOwotICAgIGFzc2VydChhY3R1YWxJbnB1dEZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpOworICAgIGFyZ1BhcnNlci5jb21wYXJlV2l0aFN0cmVhbShpbnB1dFN0cmVhbSk7CiAKKyAgICAvLyAtLS0tLS0tIFNldHVwIGxvb3BiYWNrRGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGxvb3BiYWNrRGF0YS5hY3R1YWxJbnB1dEZvcm1hdCA9IEFBdWRpb1N0cmVhbV9nZXRGb3JtYXQoaW5wdXRTdHJlYW0pOwogCiAgICAgbG9vcGJhY2tEYXRhLmFjdHVhbElucHV0Q2hhbm5lbENvdW50ID0gcmVjb3JkZXIuZ2V0Q2hhbm5lbENvdW50KCk7CiAgICAgbG9vcGJhY2tEYXRhLmFjdHVhbE91dHB1dENoYW5uZWxDb3VudCA9IHBsYXllci5nZXRDaGFubmVsQ291bnQoKTsKIAogICAgIC8vIEFsbG9jYXRlIGEgYnVmZmVyIGZvciB0aGUgYXVkaW8gZGF0YS4KLSAgICBsb29wYmFja0RhdGEuaW5wdXRGcmFtZXNNYXhpbXVtID0gMzIgKiBmcmFtZXNQZXJCdXJzdDsKLSAgICBsb29wYmFja0RhdGEuaW5wdXRCdWZmZXJzVG9EaXNjYXJkID0gMTAwOworICAgIGxvb3BiYWNrRGF0YS5pbnB1dEZyYW1lc01heGltdW0gPSAzMiAqIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNQZXJCdXJzdChpbnB1dFN0cmVhbSk7CiAKLSAgICBsb29wYmFja0RhdGEuaW5wdXREYXRhID0gbmV3IGludDE2X3RbbG9vcGJhY2tEYXRhLmlucHV0RnJhbWVzTWF4aW11bQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGxvb3BiYWNrRGF0YS5hY3R1YWxJbnB1dENoYW5uZWxDb3VudF07Ci0gICAgbG9vcGJhY2tEYXRhLmNvbnZlcnNpb25CdWZmZXIgPSBuZXcgZmxvYXRbbG9vcGJhY2tEYXRhLmlucHV0RnJhbWVzTWF4aW11bSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcGJhY2tEYXRhLmFjdHVhbElucHV0Q2hhbm5lbENvdW50XTsKKyAgICBpZiAobG9vcGJhY2tEYXRhLmFjdHVhbElucHV0Rm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgeworICAgICAgICBsb29wYmFja0RhdGEuaW5wdXRTaG9ydERhdGEgPSBuZXcgaW50MTZfdFtsb29wYmFja0RhdGEuaW5wdXRGcmFtZXNNYXhpbXVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbG9vcGJhY2tEYXRhLmFjdHVhbElucHV0Q2hhbm5lbENvdW50XXt9OworICAgIH0KKyAgICBsb29wYmFja0RhdGEuaW5wdXRGbG9hdERhdGEgPSBuZXcgZmxvYXRbbG9vcGJhY2tEYXRhLmlucHV0RnJhbWVzTWF4aW11bSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcGJhY2tEYXRhLmFjdHVhbElucHV0Q2hhbm5lbENvdW50XXt9OwogCiAgICAgbG9vcGJhY2tEYXRhLmxvb3BiYWNrUHJvY2Vzc29yLT5yZXNldCgpOwogCisgICAgLy8gU3RhcnQgT1VUUFVUIGZpcnN0IHNvIElOUFVUIGRvZXMgbm90IG92ZXJmbG93LgorICAgIHJlc3VsdCA9IHBsYXllci5zdGFydCgpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIHByaW50ZigiRVJST1IgLSBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KG91dHB1dCkgcmV0dXJuZWQgJWQgPSAlc1xuIiwKKyAgICAgICAgICAgICAgIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKwogICAgIHJlc3VsdCA9IHJlY29yZGVyLnN0YXJ0KCk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgcHJpbnRmKCJFUlJPUiAtIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoaW5wdXQpIHJldHVybmVkICVkID0gJXNcbiIsCkBAIC0zOTQsMTYgKzQ5MCw4IEBACiAgICAgICAgIGdvdG8gZmluaXNoOwogICAgIH0KIAotICAgIHJlc3VsdCA9IHBsYXllci5zdGFydCgpOwotICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIHByaW50ZigiRVJST1IgLSBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KG91dHB1dCkgcmV0dXJuZWQgJWQgPSAlc1xuIiwKLSAgICAgICAgICAgICAgIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7Ci0gICAgICAgIGdvdG8gZmluaXNoOwotICAgIH0KLQotICAgIHByaW50ZigiLS0tLS0tLSBzbGVlcCB3aGlsZSB0aGUgY2FsbGJhY2sgcnVucyAtLS0tLS0tLS0tLS0tLVxuIik7Ci0gICAgZmZsdXNoKHN0ZG91dCk7Ci0gICAgZm9yIChpbnQgaSA9IHJlcXVlc3RlZER1cmF0aW9uOyBpID4gMCA7IGktLSkgeworICAgIHByaW50ZigiLS0tLS0tLSBzbGVlcCBhbmQgbG9nIHdoaWxlIHRoZSBjYWxsYmFjayBydW5zIC0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgICB3aGlsZSAodGltZU1pbGxpcyA8PSByZXF1ZXN0ZWREdXJhdGlvbk1pbGxpcykgewogICAgICAgICBpZiAobG9vcGJhY2tEYXRhLmlucHV0RXJyb3IgIT0gQUFVRElPX09LKSB7CiAgICAgICAgICAgICBwcmludGYoIiAgRVJST1Igb24gaW5wdXQgc3RyZWFtXG4iKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNDE0LDU3ICs1MDIsMTI1IEBACiAgICAgICAgICAgICAgICAgcHJpbnRmKCIgIHRlc3Qgc2F5cyBpdCBpcyBkb25lIVxuIik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzbGVlcCgxKTsKLSAgICAgICAgICAgIHByaW50ZigiJTRkOiAiLCBpKTsKKyAgICAgICAgICAgIC8vIExvZyBhIGxpbmUgb2Ygc3RyZWFtIGRhdGEuCisgICAgICAgICAgICBwcmludGYoIiU3LjNmOiAiLCAwLjAwMSAqIHRpbWVNaWxsaXMpOyAvLyBkaXNwbGF5IGluIHNlY29uZHMKICAgICAgICAgICAgIGxvb3BiYWNrRGF0YS5sb29wYmFja1Byb2Nlc3Nvci0+cHJpbnRTdGF0dXMoKTsKKyAgICAgICAgICAgIHByaW50ZigiIGluc2YgJTNkLCIsIChpbnQpIGxvb3BiYWNrRGF0YS5pbnN1ZmZpY2llbnRSZWFkQ291bnQpOwogCi0gICAgICAgICAgICBpbnQ2NF90IGlucHV0RnJhbWVzV3JpdHRlbiA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKGxvb3BiYWNrRGF0YS5pbnB1dFN0cmVhbSk7Ci0gICAgICAgICAgICBpbnQ2NF90IGlucHV0RnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKGxvb3BiYWNrRGF0YS5pbnB1dFN0cmVhbSk7CisgICAgICAgICAgICBpbnQ2NF90IGlucHV0RnJhbWVzV3JpdHRlbiA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKGlucHV0U3RyZWFtKTsKKyAgICAgICAgICAgIGludDY0X3QgaW5wdXRGcmFtZXNSZWFkID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoaW5wdXRTdHJlYW0pOwogICAgICAgICAgICAgaW50NjRfdCBvdXRwdXRGcmFtZXNXcml0dGVuID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4ob3V0cHV0U3RyZWFtKTsKICAgICAgICAgICAgIGludDY0X3Qgb3V0cHV0RnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKG91dHB1dFN0cmVhbSk7Ci0gICAgICAgICAgICBwcmludGYoIiBJTlBVVDogd3IgJWxsZCByZCAlbGxkIHN0YXRlICVzLCBPVVRQVVQ6IHdyICVsbGQgcmQgJWxsZCBzdGF0ZSAlcywgeHJ1bnMgJWRcbiIsCisgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IHRleHRPZmZzZXQgPSBzdHJsZW4oIkFBVURJT19TVFJFQU1fU1RBVEVfIik7IC8vIHN0cmlwIHRoaXMgb2ZmCisgICAgICAgICAgICBwcmludGYoIiB8IElOUFVUOiB3ciAlN2xsZCAtIHJkICU3bGxkID0gJTVsbGQsIHN0ICU4cywgb3J1bnMgJTNkIiwKICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBpbnB1dEZyYW1lc1dyaXR0ZW4sCiAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgaW5wdXRGcmFtZXNSZWFkLAotICAgICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQoQUF1ZGlvU3RyZWFtX2dldFN0YXRlKGxvb3BiYWNrRGF0YS5pbnB1dFN0cmVhbSkpLAorICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIChpbnB1dEZyYW1lc1dyaXR0ZW4gLSBpbnB1dEZyYW1lc1JlYWQpLAorICAgICAgICAgICAgICAgICAgICZBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUF1ZGlvU3RyZWFtX2dldFN0YXRlKGlucHV0U3RyZWFtKSlbdGV4dE9mZnNldF0sCisgICAgICAgICAgICAgICAgICAgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChpbnB1dFN0cmVhbSkpOworCisgICAgICAgICAgICBwcmludGYoIiB8IE9VVFBVVDogd3IgJTdsbGQgLSByZCAlN2xsZCA9ICU1bGxkLCBzdCAlOHMsIHVydW5zICUzZFxuIiwKICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBvdXRwdXRGcmFtZXNXcml0dGVuLAogICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIG91dHB1dEZyYW1lc1JlYWQsCi0gICAgICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChBQXVkaW9TdHJlYW1fZ2V0U3RhdGUob3V0cHV0U3RyZWFtKSksCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIChvdXRwdXRGcmFtZXNXcml0dGVuIC0gb3V0cHV0RnJhbWVzUmVhZCksCisgICAgICAgICAgICAgICAgICAgJkFBdWRpb19jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBQXVkaW9TdHJlYW1fZ2V0U3RhdGUob3V0cHV0U3RyZWFtKSlbdGV4dE9mZnNldF0sCiAgICAgICAgICAgICAgICAgICAgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChvdXRwdXRTdHJlYW0pCiAgICAgICAgICAgICApOwogICAgICAgICB9CisgICAgICAgIGludDMyX3QgcGVyaW9kTWlsbGlzID0gKHRpbWVNaWxsaXMgPCAyMDAwKSA/IFBFUklPRF9NSUxMSVMgLyA0IDogUEVSSU9EX01JTExJUzsKKyAgICAgICAgdXNsZWVwKHBlcmlvZE1pbGxpcyAqIDEwMDApOworICAgICAgICB0aW1lTWlsbGlzICs9IHBlcmlvZE1pbGxpczsKKyAgICB9CisKKyAgICByZXN1bHQgPSBwbGF5ZXIuc3RvcCgpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIHByaW50ZigiRVJST1IgLSBwbGF5ZXIuc3RvcCgpIHJldHVybmVkICVkID0gJXNcbiIsCisgICAgICAgICAgICAgICByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9CisKKyAgICByZXN1bHQgPSByZWNvcmRlci5zdG9wKCk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgcHJpbnRmKCJFUlJPUiAtIHJlY29yZGVyLnN0b3AoKSByZXR1cm5lZCAlZCA9ICVzXG4iLAorICAgICAgICAgICAgICAgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICAgICAgZ290byBmaW5pc2g7CiAgICAgfQogCiAgICAgcHJpbnRmKCJpbnB1dCBlcnJvciA9ICVkID0gJXNcbiIsCi0gICAgICAgICAgICAgICAgbG9vcGJhY2tEYXRhLmlucHV0RXJyb3IsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KGxvb3BiYWNrRGF0YS5pbnB1dEVycm9yKSk7Ci0KLSAgICBwcmludGYoIkFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQgJWRcbiIsIEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQob3V0cHV0U3RyZWFtKSk7Ci0gICAgcHJpbnRmKCJmcmFtZXNSZWFkICAgID0gJThkXG4iLCAoaW50KSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChvdXRwdXRTdHJlYW0pKTsKLSAgICBwcmludGYoImZyYW1lc1dyaXR0ZW4gPSAlOGRcbiIsIChpbnQpIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKG91dHB1dFN0cmVhbSkpOwotICAgIHByaW50ZigibWluIG51bUZyYW1lcyA9ICU4ZFxuIiwgKGludCkgbG9vcGJhY2tEYXRhLm1pbk51bUZyYW1lcyk7Ci0gICAgcHJpbnRmKCJtYXggbnVtRnJhbWVzID0gJThkXG4iLCAoaW50KSBsb29wYmFja0RhdGEubWF4TnVtRnJhbWVzKTsKKyAgICAgICAgICAgbG9vcGJhY2tEYXRhLmlucHV0RXJyb3IsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KGxvb3BiYWNrRGF0YS5pbnB1dEVycm9yKSk7CiAKICAgICBpZiAobG9vcGJhY2tEYXRhLmlucHV0RXJyb3IgPT0gQUFVRElPX09LKSB7CiAgICAgICAgIGlmICh0ZXN0TW9kZSA9PSBURVNUX1NJTkVfTUFHTklUVURFKSB7Ci0gICAgICAgICAgICBwcmludEF1ZGlvR3JhcGgobG9vcGJhY2tEYXRhLmF1ZGlvUmVjb3JkZXIsIDIwMCk7CisgICAgICAgICAgICBwcmludEF1ZGlvR3JhcGgobG9vcGJhY2tEYXRhLmF1ZGlvUmVjb3JkaW5nLCAyMDApOwogICAgICAgICB9CisgICAgICAgIC8vIFByaW50IGFnYWluIHNvIHdlIGRvbid0IGhhdmUgdG8gc2Nyb2xsIHBhc3Qgd2F2ZWZvcm0uCisgICAgICAgIHByaW50ZigiT1VUUFVUIFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgICAgICAgYXJnUGFyc2VyLmNvbXBhcmVXaXRoU3RyZWFtKG91dHB1dFN0cmVhbSk7CisgICAgICAgIHByaW50ZigiSU5QVVQgIFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgICAgICAgYXJnUGFyc2VyLmNvbXBhcmVXaXRoU3RyZWFtKGlucHV0U3RyZWFtKTsKKwogICAgICAgICBsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3ItPnJlcG9ydCgpOwogICAgIH0KIAogICAgIHsKLSAgICAgICAgaW50IHdyaXR0ZW4gPSBsb29wYmFja0RhdGEuYXVkaW9SZWNvcmRlci5zYXZlKEZJTEVOQU1FKTsKLSAgICAgICAgcHJpbnRmKCJtYWluKCkgd3JvdGUgJWQgbW9ubyBzYW1wbGVzIHRvICVzIG9uIEFuZHJvaWQgZGV2aWNlXG4iLCB3cml0dGVuLCBGSUxFTkFNRSk7CisgICAgICAgIGludDMyX3QgZnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKGlucHV0U3RyZWFtKTsKKyAgICAgICAgaW50MzJfdCBmcmFtZXNXcml0dGVuID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4oaW5wdXRTdHJlYW0pOworICAgICAgICBwcmludGYoIkNhbGxiYWNrIFJlc3VsdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJTlBVVFxuIik7CisgICAgICAgIHByaW50ZigiICBpbnB1dCBvdmVycnVucyAgID0gJWRcbiIsIEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQoaW5wdXRTdHJlYW0pKTsKKyAgICAgICAgcHJpbnRmKCIgIGZyYW1lc1dyaXR0ZW4gICAgPSAlOGRcbiIsIGZyYW1lc1dyaXR0ZW4pOworICAgICAgICBwcmludGYoIiAgZnJhbWVzUmVhZCAgICAgICA9ICU4ZFxuIiwgZnJhbWVzUmVhZCk7CisgICAgICAgIHByaW50ZigiICBteUZyYW1lc1JlYWQgICAgID0gJThkXG4iLCAoaW50KSBsb29wYmFja0RhdGEuZnJhbWVzUmVhZFRvdGFsKTsKKyAgICAgICAgcHJpbnRmKCIgIHdyaXR0ZW4gLSByZWFkICAgPSAlOGRcbiIsIChpbnQpIChmcmFtZXNXcml0dGVuIC0gZnJhbWVzUmVhZCkpOworICAgICAgICBwcmludGYoIiAgaW5zdWZmaWNpZW50ICMgICA9ICU4ZFxuIiwgKGludCkgbG9vcGJhY2tEYXRhLmluc3VmZmljaWVudFJlYWRDb3VudCk7CisgICAgICAgIGlmIChsb29wYmFja0RhdGEuaW5zdWZmaWNpZW50UmVhZENvdW50ID4gMCkgeworICAgICAgICAgICAgcHJpbnRmKCIgIGluc3VmZmljaWVudCBmcmFtZXMgPSAlOGRcbiIsIChpbnQpIGxvb3BiYWNrRGF0YS5pbnN1ZmZpY2llbnRSZWFkRnJhbWVzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICAgIGludDMyX3QgZnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKG91dHB1dFN0cmVhbSk7CisgICAgICAgIGludDMyX3QgZnJhbWVzV3JpdHRlbiA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKG91dHB1dFN0cmVhbSk7CisgICAgICAgIHByaW50ZigiQ2FsbGJhY2sgUmVzdWx0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9VVFBVVFxuIik7CisgICAgICAgIHByaW50ZigiICBvdXRwdXQgdW5kZXJydW5zID0gJWRcbiIsIEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQob3V0cHV0U3RyZWFtKSk7CisgICAgICAgIHByaW50ZigiICBteUZyYW1lc1dyaXR0ZW4gID0gJThkXG4iLCAoaW50KSBsb29wYmFja0RhdGEuZnJhbWVzV3JpdHRlblRvdGFsKTsKKyAgICAgICAgcHJpbnRmKCIgIGZyYW1lc1dyaXR0ZW4gICAgPSAlOGRcbiIsIGZyYW1lc1dyaXR0ZW4pOworICAgICAgICBwcmludGYoIiAgZnJhbWVzUmVhZCAgICAgICA9ICU4ZFxuIiwgZnJhbWVzUmVhZCk7CisgICAgICAgIHByaW50ZigiICBtaW4gbnVtRnJhbWVzICAgID0gJThkXG4iLCAoaW50KSBsb29wYmFja0RhdGEubWluTnVtRnJhbWVzKTsKKyAgICAgICAgcHJpbnRmKCIgIG1heCBudW1GcmFtZXMgICAgPSAlOGRcbiIsIChpbnQpIGxvb3BiYWNrRGF0YS5tYXhOdW1GcmFtZXMpOworICAgIH0KKworICAgIHdyaXR0ZW4gPSBsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3ItPnNhdmUoRklMRU5BTUVfRUNIT1MpOworICAgIGlmICh3cml0dGVuID4gMCkgeworICAgICAgICBwcmludGYoIm1haW4oKSB3cm90ZSAlOGQgbW9ubyBzYW1wbGVzIHRvIFwiJXNcIiBvbiBBbmRyb2lkIGRldmljZVxuIiwKKyAgICAgICAgICAgICAgIHdyaXR0ZW4sIEZJTEVOQU1FX0VDSE9TKTsKKyAgICB9CisKKyAgICB3cml0dGVuID0gbG9vcGJhY2tEYXRhLmF1ZGlvUmVjb3JkaW5nLnNhdmUoRklMRU5BTUVfQUxMKTsKKyAgICBpZiAod3JpdHRlbiA+IDApIHsKKyAgICAgICAgcHJpbnRmKCJtYWluKCkgd3JvdGUgJThkIG1vbm8gc2FtcGxlcyB0byBcIiVzXCIgb24gQW5kcm9pZCBkZXZpY2VcbiIsCisgICAgICAgICAgICAgICB3cml0dGVuLCBGSUxFTkFNRV9BTEwpOworICAgIH0KKworICAgIGlmIChsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3ItPmdldFJlc3VsdCgpIDwgMCkgeworICAgICAgICBwcmludGYoIkVSUk9SOiBMT09QQkFDSyBQUk9DRVNTSU5HIEZBSUxFRC4gTWF5YmUgYmVjYXVzZSB0aGUgdm9sdW1lIHdhcyB0b28gbG93LlxuIik7CisgICAgICAgIHJlc3VsdCA9IGxvb3BiYWNrRGF0YS5sb29wYmFja1Byb2Nlc3Nvci0+Z2V0UmVzdWx0KCk7CisgICAgfQorICAgIGlmIChsb29wYmFja0RhdGEuaW5zdWZmaWNpZW50UmVhZENvdW50ID4gMykgeworICAgICAgICBwcmludGYoIkVSUk9SOiBMT09QQkFDSyBQUk9DRVNTSU5HIEZBSUxFRC4gaW5zdWZmaWNpZW50UmVhZENvdW50IHRvbyBoaWdoXG4iKTsKKyAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOwogICAgIH0KIAogZmluaXNoOgogICAgIHBsYXllci5jbG9zZSgpOwogICAgIHJlY29yZGVyLmNsb3NlKCk7Ci0gICAgZGVsZXRlW10gbG9vcGJhY2tEYXRhLmNvbnZlcnNpb25CdWZmZXI7Ci0gICAgZGVsZXRlW10gbG9vcGJhY2tEYXRhLmlucHV0RGF0YTsKLSAgICBkZWxldGVbXSBvdXRwdXREYXRhOworICAgIGRlbGV0ZVtdIGxvb3BiYWNrRGF0YS5pbnB1dEZsb2F0RGF0YTsKKyAgICBkZWxldGVbXSBsb29wYmFja0RhdGEuaW5wdXRTaG9ydERhdGE7CiAKLSAgICBwcmludGYoUkVTVUxUX1RBRyAiZXJyb3IgPSAlZCA9ICVzXG4iLCByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwotICAgIGlmICgocmVzdWx0ICE9IEFBVURJT19PSykpIHsKLSAgICAgICAgcHJpbnRmKCJlcnJvciAlZCA9ICVzXG4iLCByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgIHByaW50ZihSRVNVTFRfVEFHICJyZXN1bHQgPSAlZCBcbiIsIHJlc3VsdCk7IC8vIG1hY2hpbmUgcmVhZGFibGUKKyAgICBwcmludGYoInJlc3VsdCBpcyAlc1xuIiwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7IC8vIGh1bWFuIHJlYWRhYmxlCisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgcHJpbnRmKCJGQUlMVVJFXG4iKTsKICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKICAgICB9IGVsc2UgewogICAgICAgICBwcmludGYoIlNVQ0NFU1NcbiIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0FyZ3NQYXJzZXIuaCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9BcmdzUGFyc2VyLmgKaW5kZXggYWRhMzdlMi4uODhkNzQwMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0FyZ3NQYXJzZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvQXJnc1BhcnNlci5oCkBAIC0xNyw3ICsxNywxMCBAQAogI2lmbmRlZiBBQVVESU9fRVhBTVBMRV9BUkdTX1BBUlNFUl9ICiAjZGVmaW5lIEFBVURJT19FWEFNUExFX0FSR1NfUEFSU0VSX0gKIAotI2luY2x1ZGUgPGNjdHlwZT4KKyNkZWZpbmUgTUFYX0NIQU5ORUxTICAgICAgICAgICAgICAgICAgICAgOAorCisvLyNpbmNsdWRlIDxjY3R5cGU+CisjaW5jbHVkZSA8ZGxmY24uaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtMjcsNyArMzAsNjMgQEAKIAogI2luY2x1ZGUgIkFBdWRpb0V4YW1wbGVVdGlscy5oIgogCi0vLyBUT0RPIHVzZSB0aGlzIGFzIGEgYmFzZSBjbGFzcyB3aXRoaW4gQUF1ZGlvCisKK3N0YXRpYyB2b2lkICgqc19zZXRVc2FnZSkoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwgYWF1ZGlvX3VzYWdlX3QgdXNhZ2UpID0gbnVsbHB0cjsKK3N0YXRpYyB2b2lkICgqc19zZXRDb250ZW50VHlwZSkoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2NvbnRlbnRfdHlwZV90IGNvbnRlbnRUeXBlKSA9IG51bGxwdHI7CitzdGF0aWMgdm9pZCAoKnNfc2V0SW5wdXRQcmVzZXQpKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19pbnB1dF9wcmVzZXRfdCBpbnB1dFByZXNldCkgPSBudWxscHRyOworCitzdGF0aWMgYm9vbCBzX2xvYWRBdHRlbXB0ZWQgPSBmYWxzZTsKK3N0YXRpYyBhYXVkaW9fdXNhZ2VfdCAoKnNfZ2V0VXNhZ2UpKEFBdWRpb1N0cmVhbSAqc3RyZWFtKSA9IG51bGxwdHI7CitzdGF0aWMgYWF1ZGlvX2NvbnRlbnRfdHlwZV90ICgqc19nZXRDb250ZW50VHlwZSkoQUF1ZGlvU3RyZWFtICpzdHJlYW0pID0gbnVsbHB0cjsKK3N0YXRpYyBhYXVkaW9faW5wdXRfcHJlc2V0X3QgKCpzX2dldElucHV0UHJlc2V0KShBQXVkaW9TdHJlYW0gKnN0cmVhbSkgPSBudWxscHRyOworCisvLyBMaW5rIHRvIHRlc3QgZnVuY3Rpb25zIGluIHNoYXJlZCBsaWJyYXJ5Lgorc3RhdGljIHZvaWQgbG9hZEZ1dHVyZUZ1bmN0aW9ucygpIHsKKyAgICBpZiAoc19sb2FkQXR0ZW1wdGVkKSAgcmV0dXJuOyAvLyBvbmx5IHRyeSBvbmNlCisgICAgc19sb2FkQXR0ZW1wdGVkID0gdHJ1ZTsKKworICAgIHZvaWQgKmhhbmRsZSA9IGRsb3BlbigibGliYWF1ZGlvLnNvIiwgUlRMRF9OT1cpOworICAgIGlmIChoYW5kbGUgIT0gbnVsbHB0cikgeworICAgICAgICBzX3NldFVzYWdlID0gKHZvaWQgKCopKEFBdWRpb1N0cmVhbUJ1aWxkZXIgKiwgYWF1ZGlvX3VzYWdlX3QpKQorICAgICAgICAgICAgICAgIGRsc3ltKGhhbmRsZSwgIkFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0VXNhZ2UiKTsKKyAgICAgICAgaWYgKHNfc2V0VXNhZ2UgPT0gbnVsbHB0cikgZ290byBlcnJvcjsKKworICAgICAgICBzX3NldENvbnRlbnRUeXBlID0gKHZvaWQgKCopKEFBdWRpb1N0cmVhbUJ1aWxkZXIgKiwgYWF1ZGlvX2NvbnRlbnRfdHlwZV90KSkKKyAgICAgICAgICAgICAgICBkbHN5bShoYW5kbGUsICJBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENvbnRlbnRUeXBlIik7CisgICAgICAgIGlmIChzX3NldENvbnRlbnRUeXBlID09IG51bGxwdHIpIGdvdG8gZXJyb3I7CisKKyAgICAgICAgc19zZXRJbnB1dFByZXNldCA9ICh2b2lkICgqKShBQXVkaW9TdHJlYW1CdWlsZGVyICosIGFhdWRpb19pbnB1dF9wcmVzZXRfdCkpCisgICAgICAgICAgICAgICAgZGxzeW0oaGFuZGxlLCAiQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRJbnB1dFByZXNldCIpOworICAgICAgICBpZiAoc19zZXRJbnB1dFByZXNldCA9PSBudWxscHRyKSBnb3RvIGVycm9yOworCisgICAgICAgIHNfZ2V0VXNhZ2UgPSAoYWF1ZGlvX3VzYWdlX3QgKCopKEFBdWRpb1N0cmVhbSAqKSkKKyAgICAgICAgICAgICAgICBkbHN5bShoYW5kbGUsICJBQXVkaW9TdHJlYW1fZ2V0VXNhZ2UiKTsKKyAgICAgICAgaWYgKHNfZ2V0VXNhZ2UgPT0gbnVsbHB0cikgZ290byBlcnJvcjsKKworICAgICAgICBzX2dldENvbnRlbnRUeXBlID0gKGFhdWRpb19jb250ZW50X3R5cGVfdCAoKikoQUF1ZGlvU3RyZWFtICopKQorICAgICAgICAgICAgICAgIGRsc3ltKGhhbmRsZSwgIkFBdWRpb1N0cmVhbV9nZXRDb250ZW50VHlwZSIpOworICAgICAgICBpZiAoc19nZXRDb250ZW50VHlwZSA9PSBudWxscHRyKSBnb3RvIGVycm9yOworCisgICAgICAgIHNfZ2V0SW5wdXRQcmVzZXQgPSAoYWF1ZGlvX2lucHV0X3ByZXNldF90ICgqKShBQXVkaW9TdHJlYW0gKikpCisgICAgICAgICAgICAgICAgZGxzeW0oaGFuZGxlLCAiQUF1ZGlvU3RyZWFtX2dldElucHV0UHJlc2V0Iik7CisgICAgICAgIGlmIChzX2dldElucHV0UHJlc2V0ID09IG51bGxwdHIpIGdvdG8gZXJyb3I7CisgICAgfQorICAgIHJldHVybjsKKworZXJyb3I6CisgICAgLy8gcHJldmVudCBhbnkgY2FsbHMgdG8gdGhlc2UgZnVuY3Rpb25zCisgICAgc19zZXRVc2FnZSA9IG51bGxwdHI7CisgICAgc19zZXRDb250ZW50VHlwZSA9IG51bGxwdHI7CisgICAgc19zZXRJbnB1dFByZXNldCA9IG51bGxwdHI7CisgICAgc19nZXRVc2FnZSA9IG51bGxwdHI7CisgICAgc19nZXRDb250ZW50VHlwZSA9IG51bGxwdHI7CisgICAgc19nZXRJbnB1dFByZXNldCA9IG51bGxwdHI7CisgICAgZGxjbG9zZShoYW5kbGUpOworICAgIHJldHVybjsKK30KKwogY2xhc3MgQUF1ZGlvUGFyYW1ldGVycyB7CiBwdWJsaWM6CiAKQEAgLTM5LDYgKzk4LDEwIEBACiAgICAgfQogCiAgICAgdm9pZCBzZXRDaGFubmVsQ291bnQoaW50MzJfdCBjaGFubmVsQ291bnQpIHsKKyAgICAgICAgaWYgKGNoYW5uZWxDb3VudCA+IE1BWF9DSEFOTkVMUykgeworICAgICAgICAgICAgcHJpbnRmKCJTb3JyeSwgTUFYIG9mICVkIGNoYW5uZWxzIVxuIiwgTUFYX0NIQU5ORUxTKTsKKyAgICAgICAgICAgIGNoYW5uZWxDb3VudCA9IE1BWF9DSEFOTkVMUzsKKyAgICAgICAgfQogICAgICAgICBtQ2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50OwogICAgIH0KIApAQCAtODIsNiArMTQ1LDMwIEBACiAgICAgICAgIG1QZXJmb3JtYW5jZU1vZGUgPSBwZXJmb3JtYW5jZU1vZGU7CiAgICAgfQogCisgICAgYWF1ZGlvX3VzYWdlX3QgZ2V0VXNhZ2UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVXNhZ2U7CisgICAgfQorCisgICAgdm9pZCBzZXRVc2FnZShhYXVkaW9fdXNhZ2VfdCB1c2FnZSkgeworICAgICAgICBtVXNhZ2UgPSB1c2FnZTsKKyAgICB9CisKKyAgICBhYXVkaW9fY29udGVudF90eXBlX3QgZ2V0Q29udGVudFR5cGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ29udGVudFR5cGU7CisgICAgfQorCisgICAgdm9pZCBzZXRDb250ZW50VHlwZShhYXVkaW9fY29udGVudF90eXBlX3QgY29udGVudFR5cGUpIHsKKyAgICAgICAgbUNvbnRlbnRUeXBlID0gY29udGVudFR5cGU7CisgICAgfQorCisgICAgYWF1ZGlvX2lucHV0X3ByZXNldF90IGdldElucHV0UHJlc2V0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUlucHV0UHJlc2V0OworICAgIH0KKworICAgIHZvaWQgc2V0SW5wdXRQcmVzZXQoYWF1ZGlvX2lucHV0X3ByZXNldF90IGlucHV0UHJlc2V0KSB7CisgICAgICAgIG1JbnB1dFByZXNldCA9IGlucHV0UHJlc2V0OworICAgIH0KKwogICAgIGludDMyX3QgZ2V0RGV2aWNlSWQoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtRGV2aWNlSWQ7CiAgICAgfQpAQCAtMTEwLDYgKzE5NywyNCBAQAogICAgICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERldmljZUlkKGJ1aWxkZXIsIG1EZXZpY2VJZCk7CiAgICAgICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2hhcmluZ01vZGUoYnVpbGRlciwgbVNoYXJpbmdNb2RlKTsKICAgICAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRQZXJmb3JtYW5jZU1vZGUoYnVpbGRlciwgbVBlcmZvcm1hbmNlTW9kZSk7CisKKyAgICAgICAgLy8gQ2FsbCBQIGZ1bmN0aW9ucyBpZiBzdXBwb3J0ZWQuCisgICAgICAgIGxvYWRGdXR1cmVGdW5jdGlvbnMoKTsKKyAgICAgICAgaWYgKHNfc2V0VXNhZ2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc19zZXRVc2FnZShidWlsZGVyLCBtVXNhZ2UpOworICAgICAgICB9IGVsc2UgaWYgKG1Vc2FnZSAhPSBBQVVESU9fVU5TUEVDSUZJRUQpeworICAgICAgICAgICAgcHJpbnRmKCJXQVJOSU5HOiBzZXRVc2FnZSBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNfc2V0Q29udGVudFR5cGUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc19zZXRDb250ZW50VHlwZShidWlsZGVyLCBtQ29udGVudFR5cGUpOworICAgICAgICB9IGVsc2UgaWYgKG1Vc2FnZSAhPSBBQVVESU9fVU5TUEVDSUZJRUQpeworICAgICAgICAgICAgcHJpbnRmKCJXQVJOSU5HOiBzZXRDb250ZW50VHlwZSBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNfc2V0SW5wdXRQcmVzZXQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc19zZXRJbnB1dFByZXNldChidWlsZGVyLCBtSW5wdXRQcmVzZXQpOworICAgICAgICB9IGVsc2UgaWYgKG1Vc2FnZSAhPSBBQVVESU9fVU5TUEVDSUZJRUQpeworICAgICAgICAgICAgcHJpbnRmKCJXQVJOSU5HOiBzZXRJbnB1dFByZXNldCBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIH0KICAgICB9CiAKIHByaXZhdGU6CkBAIC0xMjIsNiArMjI3LDEwIEBACiAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90ICAgICAgbVNoYXJpbmdNb2RlICAgICA9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOwogICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgIG1QZXJmb3JtYW5jZU1vZGUgPSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FOwogCisgICAgYWF1ZGlvX3VzYWdlX3QgICAgICAgICAgICAgbVVzYWdlICAgICAgICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKKyAgICBhYXVkaW9fY29udGVudF90eXBlX3QgICAgICBtQ29udGVudFR5cGUgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGFhdWRpb19pbnB1dF9wcmVzZXRfdCAgICAgIG1JbnB1dFByZXNldCAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CisKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtTnVtYmVyT2ZCdXJzdHMgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogfTsKIApAQCAtMTUyLDggKzI2MSwxMSBAQAogICAgICAgICAgICAgICAgIGNhc2UgJ2QnOgogICAgICAgICAgICAgICAgICAgICBzZXREZXZpY2VJZChhdG9pKCZhcmdbMl0pKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAncyc6Ci0gICAgICAgICAgICAgICAgICAgIG1EdXJhdGlvblNlY29uZHMgPSBhdG9pKCZhcmdbMl0pOworICAgICAgICAgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgICAgICAgICAgICBzZXRGb3JtYXQoYXRvaSgmYXJnWzJdKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ2knOgorICAgICAgICAgICAgICAgICAgICBzZXRJbnB1dFByZXNldChhdG9pKCZhcmdbMl0pKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAnbSc6IHsKICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3BvbGljeV90IHBvbGljeSA9IEFBVURJT19QT0xJQ1lfQVVUTzsKQEAgLTE3MSw5ICsyODMsMTggQEAKICAgICAgICAgICAgICAgICBjYXNlICdyJzoKICAgICAgICAgICAgICAgICAgICAgc2V0U2FtcGxlUmF0ZShhdG9pKCZhcmdbMl0pKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAncyc6CisgICAgICAgICAgICAgICAgICAgIG1EdXJhdGlvblNlY29uZHMgPSBhdG9pKCZhcmdbMl0pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICd1JzoKKyAgICAgICAgICAgICAgICAgICAgc2V0VXNhZ2UoYXRvaSgmYXJnWzJdKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgJ3gnOgogICAgICAgICAgICAgICAgICAgICBzZXRTaGFyaW5nTW9kZShBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ3knOgorICAgICAgICAgICAgICAgICAgICBzZXRDb250ZW50VHlwZShhdG9pKCZhcmdbMl0pKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgdW5yZWNvZ25pemVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0yMDEsMjQgKzMyMiwzMiBAQAogICAgIH0KIAogICAgIHN0YXRpYyB2b2lkIHVzYWdlKCkgewotICAgICAgICBwcmludGYoIi1je2NoYW5uZWxzfSAtZHtkdXJhdGlvbn0gLW0gLW57YnVyc3RzUGVyQnVmZmVyfSAtcHtwZXJmTW9kZX0gLXJ7cmF0ZX0gLXhcbiIpOworICAgICAgICBwcmludGYoIi1je2NoYW5uZWxzfSAtZHtkZXZpY2VJZH0gLW17bW1hcFBvbGljeX0gLW57YnVyc3RzUGVyQnVmZmVyfSAtcHtwZXJmTW9kZX0iKTsKKyAgICAgICAgcHJpbnRmKCIgLXJ7cmF0ZX0gLXN7c2Vjb25kc30gLXhcbiIpOwogICAgICAgICBwcmludGYoIiAgICAgIERlZmF1bHQgdmFsdWVzIGFyZSBVTlNQRUNJRklFRCB1bmxlc3Mgb3RoZXJ3aXNlIHN0YXRlZC5cbiIpOwogICAgICAgICBwcmludGYoIiAgICAgIC1ie2J1ZmZlckNhcGFjaXR5fSBmcmFtZXNcbiIpOwogICAgICAgICBwcmludGYoIiAgICAgIC1je2NoYW5uZWxzfSBmb3IgZXhhbXBsZSAyIGZvciBzdGVyZW9cbiIpOwogICAgICAgICBwcmludGYoIiAgICAgIC1ke2RldmljZUlkfSBkZWZhdWx0IGlzICVkXG4iLCBBQVVESU9fVU5TUEVDSUZJRUQpOwotICAgICAgICBwcmludGYoIiAgICAgIC1ze2R1cmF0aW9ufSBpbiBzZWNvbmRzLCBkZWZhdWx0IGlzICVkXG4iLCBERUZBVUxUX0RVUkFUSU9OX1NFQ09ORFMpOworICAgICAgICBwcmludGYoIiAgICAgIC1mezB8MXwyfSBzZXQgZm9ybWF0XG4iKTsKKyAgICAgICAgcHJpbnRmKCIgICAgICAgICAgMCA9IFVOU1BFQ0lGSUVEXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgICAgICAgICAgMSA9IFBDTV9JMTZcbiIpOworICAgICAgICBwcmludGYoIiAgICAgICAgICAyID0gRkxPQVRcbiIpOworICAgICAgICBwcmludGYoIiAgICAgIC1pe2lucHV0UHJlc2V0fSBlZy4gNSBmb3IgQUFVRElPX0lOUFVUX1BSRVNFVF9DQU1DT1JERVJcbiIpOwogICAgICAgICBwcmludGYoIiAgICAgIC1tezB8MXwyfDN9IHNldCBNTUFQIHBvbGljeVxuIik7Ci0gICAgICAgIHByaW50ZigiICAgICAgICAgIDAgPSBfVU5TUEVDSUZJRUQsIGRlZmF1bHRcbiIpOwotICAgICAgICBwcmludGYoIiAgICAgICAgICAxID0gX05FVkVSXG4iKTsKLSAgICAgICAgcHJpbnRmKCIgICAgICAgICAgMiA9IF9BVVRPLCBhbHNvIGlmIC1tIGlzIHVzZWQgd2l0aCBubyBudW1iZXJcbiIpOwotICAgICAgICBwcmludGYoIiAgICAgICAgICAzID0gX0FMV0FZU1xuIik7CisgICAgICAgIHByaW50ZigiICAgICAgICAgIDAgPSBfVU5TUEVDSUZJRUQsIHVzZSBhYXVkaW8ubW1hcF9wb2xpY3kgc3lzdGVtIHByb3BlcnR5LCBkZWZhdWx0XG4iKTsKKyAgICAgICAgcHJpbnRmKCIgICAgICAgICAgMSA9IF9ORVZFUiwgbmV2ZXIgdXNlIE1NQVBcbiIpOworICAgICAgICBwcmludGYoIiAgICAgICAgICAyID0gX0FVVE8sIHVzZSBNTUFQIGlmIGF2YWlsYWJsZSwgZGVmYXVsdCBmb3IgLW0gd2l0aCBubyBudW1iZXJcbiIpOworICAgICAgICBwcmludGYoIiAgICAgICAgICAzID0gX0FMV0FZUywgdXNlIE1NQVAgb3IgZmFpbFxuIik7CiAgICAgICAgIHByaW50ZigiICAgICAgLW57bnVtYmVyT2ZCdXJzdHN9IGZvciBzZXRCdWZmZXJTaXplXG4iKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAtcHtwZXJmb3JtYW5jZU1vZGV9IHNldCBvdXRwdXQgQUFVRElPX1BFUkZPUk1BTkNFX01PREUqLCBkZWZhdWx0IE5PTkVcbiIpOwogICAgICAgICBwcmludGYoIiAgICAgICAgICBuIGZvciBfTk9ORVxuIik7CiAgICAgICAgIHByaW50ZigiICAgICAgICAgIGwgZm9yIF9MQVRFTkNZXG4iKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAgICAgcCBmb3IgX1BPV0VSX1NBVklORztcbiIpOwogICAgICAgICBwcmludGYoIiAgICAgIC1ye3NhbXBsZVJhdGV9IGZvciBleGFtcGxlIDQ0MTAwXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgICAgICAtc3tkdXJhdGlvbn0gaW4gc2Vjb25kcywgZGVmYXVsdCBpcyAlZFxuIiwgREVGQVVMVF9EVVJBVElPTl9TRUNPTkRTKTsKKyAgICAgICAgcHJpbnRmKCIgICAgICAtdXt1c2FnZX0gZWcuIDE0IGZvciBBQVVESU9fVVNBR0VfR0FNRVxuIik7CiAgICAgICAgIHByaW50ZigiICAgICAgLXggdG8gdXNlIEVYQ0xVU0lWRSBtb2RlXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgICAgICAteXtjb250ZW50VHlwZX0gZWcuIDEgZm9yIEFBVURJT19DT05URU5UX1RZUEVfU1BFRUNIXG4iKTsKICAgICB9CiAKICAgICBzdGF0aWMgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwYXJzZVBlcmZvcm1hbmNlTW9kZShjaGFyIGMpIHsKQEAgLTI4MSw2ICs0MTAsMjQgQEAKIAogICAgICAgICBwcmludGYoIiAgUGVyZm9ybWFuY2VNb2RlOiByZXF1ZXN0ZWQgPSAlZCwgYWN0dWFsID0gJWRcbiIsCiAgICAgICAgICAgICAgICBnZXRQZXJmb3JtYW5jZU1vZGUoKSwgQUF1ZGlvU3RyZWFtX2dldFBlcmZvcm1hbmNlTW9kZShzdHJlYW0pKTsKKworICAgICAgICBsb2FkRnV0dXJlRnVuY3Rpb25zKCk7CisKKyAgICAgICAgaWYgKHNfc2V0VXNhZ2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcHJpbnRmKCIgIFVzYWdlOiAgICAgICAgcmVxdWVzdGVkID0gJWQsIGFjdHVhbCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgIGdldFVzYWdlKCksIHNfZ2V0VXNhZ2Uoc3RyZWFtKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNfZ2V0Q29udGVudFR5cGUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcHJpbnRmKCIgIENvbnRlbnRUeXBlOiAgcmVxdWVzdGVkID0gJWQsIGFjdHVhbCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgIGdldENvbnRlbnRUeXBlKCksIHNfZ2V0Q29udGVudFR5cGUoc3RyZWFtKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoQUF1ZGlvU3RyZWFtX2dldERpcmVjdGlvbihzdHJlYW0pID09IEFBVURJT19ESVJFQ1RJT05fSU5QVVQKKyAgICAgICAgICAgICYmIHNfZ2V0SW5wdXRQcmVzZXQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHByaW50ZigiICBJbnB1dFByZXNldDogIHJlcXVlc3RlZCA9ICVkLCBhY3R1YWwgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW5wdXRQcmVzZXQoKSwgc19nZXRJbnB1dFByZXNldChzdHJlYW0pKTsKKyAgICAgICAgfQorCiAgICAgICAgIHByaW50ZigiICBJcyBNTUFQIHVzZWQ/ICVzXG4iLCBBQXVkaW9TdHJlYW1faXNNTWFwVXNlZChzdHJlYW0pCiAgICAgICAgICAgICAgICA/ICJ5ZXMiIDogIm5vIik7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9FeGFtcGxlVXRpbHMuaCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9FeGFtcGxlVXRpbHMuaAppbmRleCBjMTc5Y2U2Li40NmI4ODk1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvRXhhbXBsZVV0aWxzLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0V4YW1wbGVVdGlscy5oCkBAIC0xOCw4ICsxOCwxMCBAQAogI2RlZmluZSBBQVVESU9fRVhBTVBMRV9VVElMU19ICiAKICNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgogI2luY2x1ZGUgPHNjaGVkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIApAQCAtMzAsNiArMzIsNyBAQAogI2RlZmluZSBOQU5PU19QRVJfTUlMTElTRUNPTkQgKE5BTk9TX1BFUl9NSUNST1NFQ09ORCAqIDEwMDApCiAjZGVmaW5lIE5BTk9TX1BFUl9TRUNPTkQgICAgICAoTkFOT1NfUEVSX01JTExJU0VDT05EICogMTAwMCkKIAordGVtcGxhdGUgPGNsYXNzIFQgPSBhYXVkaW9fc2hhcmluZ19tb2RlX3Q+CiBjb25zdCBjaGFyICpnZXRTaGFyaW5nTW9kZVRleHQoYWF1ZGlvX3NoYXJpbmdfbW9kZV90IG1vZGUpIHsKICAgICBjb25zdCBjaGFyICp0ZXh0ID0gInVua25vd24iOwogICAgIHN3aXRjaCAobW9kZSkgewpAQCAtNzgsMTMgKzgxLDE1IEBACiAgICAgcmV0dXJuIHRleHQ7CiB9CiAKLXN0YXRpYyB2b2lkIGNvbnZlcnROYW5vc2Vjb25kc1RvVGltZXNwZWMoaW50NjRfdCBuYW5vc2Vjb25kcywgc3RydWN0IHRpbWVzcGVjICp0aW1lKSB7Cit0ZW1wbGF0ZSA8Y2xhc3MgVCA9IGludDY0X3Q+Cit2b2lkIGNvbnZlcnROYW5vc2Vjb25kc1RvVGltZXNwZWMoaW50NjRfdCBuYW5vc2Vjb25kcywgc3RydWN0IHRpbWVzcGVjICp0aW1lKSB7CiAgICAgdGltZS0+dHZfc2VjID0gbmFub3NlY29uZHMgLyBOQU5PU19QRVJfU0VDT05EOwogICAgIC8vIENhbGN1bGF0ZSB0aGUgZnJhY3Rpb25hbCBuYW5vc2Vjb25kcy4gQXZvaWRzIGV4cGVuc2l2ZSAlIG9wZXJhdGlvbi4KICAgICB0aW1lLT50dl9uc2VjID0gbmFub3NlY29uZHMgLSAodGltZS0+dHZfc2VjICogTkFOT1NfUEVSX1NFQ09ORCk7CiB9CiAKLXN0YXRpYyBpbnQ2NF90IGdldE5hbm9zZWNvbmRzKGNsb2NraWRfdCBjbG9ja0lkID0gQ0xPQ0tfTU9OT1RPTklDKSB7Cit0ZW1wbGF0ZSA8Y2xhc3MgVCA9IGNsb2NraWRfdD4KK2ludDY0X3QgZ2V0TmFub3NlY29uZHMoY2xvY2tpZF90IGNsb2NrSWQgPSBDTE9DS19NT05PVE9OSUMpIHsKICAgICBzdHJ1Y3QgdGltZXNwZWMgdGltZTsKICAgICBpbnQgcmVzdWx0ID0gY2xvY2tfZ2V0dGltZShjbG9ja0lkLCAmdGltZSk7CiAgICAgaWYgKHJlc3VsdCA8IDApIHsKQEAgLTkzLDcgKzk4LDggQEAKICAgICByZXR1cm4gKHRpbWUudHZfc2VjICogTkFOT1NfUEVSX1NFQ09ORCkgKyB0aW1lLnR2X25zZWM7CiB9CiAKLXN0YXRpYyB2b2lkIGRpc3BsYXlQZWFrTGV2ZWwoZmxvYXQgcGVha0xldmVsKSB7Cit0ZW1wbGF0ZSA8Y2xhc3MgVCA9IGZsb2F0Pgordm9pZCBkaXNwbGF5UGVha0xldmVsKGZsb2F0IHBlYWtMZXZlbCkgewogICAgIHByaW50ZigiJTUuM2YgIiwgcGVha0xldmVsKTsKICAgICBjb25zdCBpbnQgbWF4U3RhcnMgPSA1MDsgLy8gYXJiaXRyYXJ5LCBmaXRzIG9uIG9uZSBsaW5lCiAgICAgaW50IG51bVN0YXJzID0gKGludCkgKHBlYWtMZXZlbCAqIG1heFN0YXJzKTsKQEAgLTExMSw3ICsxMTcsOCBAQAogICogQHBhcmFtIHNhbXBsZVJhdGUKICAqIEByZXR1cm4gbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMKICAqLwotc3RhdGljIGRvdWJsZSBjYWxjdWxhdGVMYXRlbmN5TWlsbGlzKGludDY0X3QgcG9zaXRpb24xLCBpbnQ2NF90IG5hbm9zZWNvbmRzMSwKK3RlbXBsYXRlIDxjbGFzcyBUID0gaW50NjRfdD4KK2RvdWJsZSBjYWxjdWxhdGVMYXRlbmN5TWlsbGlzKGludDY0X3QgcG9zaXRpb24xLCBpbnQ2NF90IG5hbm9zZWNvbmRzMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb24yLCBpbnQ2NF90IG5hbm9zZWNvbmRzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgc2FtcGxlUmF0ZSkgewogICAgIGludDY0X3QgZGVsdGFGcmFtZXMgPSBwb3NpdGlvbjIgLSBwb3NpdGlvbjE7CkBAIC0xMjUsNyArMTMyLDggQEAKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vIFRoZXNlIEZ1dGV4IGNhbGxzIGFyZSBjb21tb24gb25saW5lIGV4YW1wbGVzLgotc3RhdGljIGFuZHJvaWQ6OnN0YXR1c190IHN5c19mdXRleCh2b2lkICphZGRyMSwgaW50IG9wLCBpbnQgdmFsMSwKK3RlbXBsYXRlIDxjbGFzcyBUID0gaW50PgorYW5kcm9pZDo6c3RhdHVzX3Qgc3lzX2Z1dGV4KHZvaWQgKmFkZHIxLCBpbnQgb3AsIGludCB2YWwxLAogICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyAqdGltZW91dCwgdm9pZCAqYWRkcjIsIGludCB2YWwzKSB7CiAgICAgYW5kcm9pZDo6c3RhdHVzX3QgcmVzdWx0ID0gKGFuZHJvaWQ6OnN0YXR1c190KSBzeXNjYWxsKFNZU19mdXRleCwgYWRkcjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLCB2YWwxLCB0aW1lb3V0LApAQCAtMTMzLDEyICsxNDEsMTQgQEAKICAgICByZXR1cm4gKHJlc3VsdCA9PSAwKSA/IDAgOiAtZXJybm87CiB9CiAKLXN0YXRpYyBhbmRyb2lkOjpzdGF0dXNfdCBmdXRleF93YWtlKHZvaWQgKmFkZHIsIGludCBudW1XYWtlKSB7Cit0ZW1wbGF0ZSA8Y2xhc3MgVCA9IGludD4KK2FuZHJvaWQ6OnN0YXR1c190IGZ1dGV4X3dha2Uodm9pZCAqYWRkciwgaW50IG51bVdha2UpIHsKICAgICAvLyBVc2UgX1BSSVZBVEUgYmVjYXVzZSB3ZSBhcmUganVzdCB1c2luZyB0aGUgZnV0ZXggaW4gb25lIHByb2Nlc3MuCiAgICAgcmV0dXJuIHN5c19mdXRleChhZGRyLCBGVVRFWF9XQUtFX1BSSVZBVEUsIG51bVdha2UsIE5VTEwsIE5VTEwsIDApOwogfQogCi1zdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZnV0ZXhfd2FpdCh2b2lkICphZGRyLCBpbnQgY3VycmVudCwgc3RydWN0IHRpbWVzcGVjICp0aW1lKSB7Cit0ZW1wbGF0ZSA8Y2xhc3MgVCA9IGludD4KK2FuZHJvaWQ6OnN0YXR1c190IGZ1dGV4X3dhaXQodm9pZCAqYWRkciwgaW50IGN1cnJlbnQsIHN0cnVjdCB0aW1lc3BlYyAqdGltZSkgewogICAgIC8vIFVzZSBfUFJJVkFURSBiZWNhdXNlIHdlIGFyZSBqdXN0IHVzaW5nIHRoZSBmdXRleCBpbiBvbmUgcHJvY2Vzcy4KICAgICByZXR1cm4gc3lzX2Z1dGV4KGFkZHIsIEZVVEVYX1dBSVRfUFJJVkFURSwgY3VycmVudCwgdGltZSwgTlVMTCwgMCk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUGxheWVyLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUGxheWVyLmgKaW5kZXggNjA2YzRiYS4uNTRiNzdiYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVBsYXllci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVQbGF5ZXIuaApAQCAtMTksMTEgKzE5LDEwIEBACiAjaWZuZGVmIEFBVURJT19TSU1QTEVfUExBWUVSX0gKICNkZWZpbmUgQUFVRElPX1NJTVBMRV9QTEFZRVJfSAogCi0jaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KLSNpbmNsdWRlIDxhdG9taWM+CiAjaW5jbHVkZSAiQUF1ZGlvQXJnc1BhcnNlci5oIgogI2luY2x1ZGUgIlNpbmVHZW5lcmF0b3IuaCIKIApAQCAtMzEsMTIgKzMwLDEyIEBACiAjZGVmaW5lIFNIQVJJTkdfTU9ERSAgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQKICNkZWZpbmUgUEVSRk9STUFOQ0VfTU9ERSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FCiAKLS8vIEFyYml0cmFyeSBwZXJpb2QgZm9yIGdsaXRjaGVzLCBvbmNlIHBlciBzZWNvbmQgYXQgNDgwMDAgSHouCi0jZGVmaW5lIEZPUkNFRF9VTkRFUlJVTl9QRVJJT0RfRlJBTUVTICAgIDQ4MDAwCisvLyBBcmJpdHJhcnkgcGVyaW9kIGZvciBnbGl0Y2hlcworI2RlZmluZSBGT1JDRURfVU5ERVJSVU5fUEVSSU9EX0ZSQU1FUyAgICAoMiAqIDQ4MDAwKQogLy8gSG93IGxvbmcgdG8gc2xlZXAgaW4gYSBjYWxsYmFjayB0byBjYXVzZSBhbiBpbnRlbnRpb25hbCBnbGl0Y2guIEZvciB0ZXN0aW5nLgogI2RlZmluZSBGT1JDRURfVU5ERVJSVU5fU0xFRVBfTUlDUk9TICAgICAoMTAgKiAxMDAwKQogCi0jZGVmaW5lIE1BWF9USU1FU1RBTVBTICAgMTYKKyNkZWZpbmUgTUFYX1RJTUVTVEFNUFMgICAgICAgICAgICAgICAgICAgMTYKIAogdHlwZWRlZiBzdHJ1Y3QgVGltZXN0YW1wIHsKICAgICBpbnQ2NF90IHBvc2l0aW9uOwpAQCAtNzAsMTMgKzY5LDYgQEAKICAgICB9CiAKICAgICAvLyBUT0RPIEV4dHJhY3QgYSBjb21tb24gYmFzZSBjbGFzcyBmb3IgcmVjb3JkIGFuZCBwbGF5YmFjay4KLSAgICAvKioKLSAgICAgKiBBbHNvIGtub3duIGFzICJzYW1wbGUgcmF0ZSIKLSAgICAgKiBPbmx5IGNhbGwgdGhpcyBhZnRlciBvcGVuKCkgaGFzIGJlZW4gY2FsbGVkLgotICAgICAqLwotICAgIGludDMyX3QgZ2V0RnJhbWVzUGVyU2Vjb25kKCkgY29uc3QgewotICAgICAgICByZXR1cm4gZ2V0U2FtcGxlUmF0ZSgpOyAvLyBhbGlhcwotICAgIH0KIAogICAgIC8qKgogICAgICAqIE9ubHkgY2FsbCB0aGlzIGFmdGVyIG9wZW4oKSBoYXMgYmVlbiBjYWxsZWQuCkBAIC0xNzIsMTIgKzE2NCwxMiBAQAogICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oYnVpbGRlciwgJm1TdHJlYW0pOwogCiAgICAgICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfZGVsZXRlKGJ1aWxkZXIpOworCiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlKCkgewogICAgICAgICBpZiAobVN0cmVhbSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBwcmludGYoImNhbGwgQUF1ZGlvU3RyZWFtX2Nsb3NlKCVwKVxuIiwgbVN0cmVhbSk7ICBmZmx1c2goc3Rkb3V0KTsKICAgICAgICAgICAgIEFBdWRpb1N0cmVhbV9jbG9zZShtU3RyZWFtKTsKICAgICAgICAgICAgIG1TdHJlYW0gPSBudWxscHRyOwogICAgICAgICB9CkBAIC0yMTIsMTMgKzIwNCwzNSBAQAogICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKG1TdHJlYW0pOwogICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICAgICAgcHJpbnRmKCJFUlJPUiAtIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcCgpIHJldHVybmVkICVkICVzXG4iLAotICAgICAgICAgICAgICAgICAgICByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CiAgICAgICAgIH0KICAgICAgICAgaW50MzJfdCB4UnVuQ291bnQgPSBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50KG1TdHJlYW0pOwogICAgICAgICBwcmludGYoIkFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQgJWRcbiIsIHhSdW5Db3VudCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCisgICAgLy8gUGF1c2UgdGhlIHN0cmVhbS4gQUF1ZGlvIHdpbGwgc3RvcCBjYWxsaW5nIHlvdXIgY2FsbGJhY2sgZnVuY3Rpb24uCisgICAgYWF1ZGlvX3Jlc3VsdF90IHBhdXNlKCkgeworICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RQYXVzZShtU3RyZWFtKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIHByaW50ZigiRVJST1IgLSBBQXVkaW9TdHJlYW1fcmVxdWVzdFBhdXNlKCkgcmV0dXJuZWQgJWQgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IHhSdW5Db3VudCA9IEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQobVN0cmVhbSk7CisgICAgICAgIHByaW50ZigiQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudCAlZFxuIiwgeFJ1bkNvdW50KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvLyBGbHVzaCB0aGUgc3RyZWFtLiBBQXVkaW8gd2lsbCBzdG9wIGNhbGxpbmcgeW91ciBjYWxsYmFjayBmdW5jdGlvbi4KKyAgICBhYXVkaW9fcmVzdWx0X3QgZmx1c2goKSB7CisgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TdHJlYW1fcmVxdWVzdEZsdXNoKG1TdHJlYW0pOworICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgcHJpbnRmKCJFUlJPUiAtIEFBdWRpb1N0cmVhbV9yZXF1ZXN0Rmx1c2goKSByZXR1cm5lZCAlZCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCiAgICAgQUF1ZGlvU3RyZWFtICpnZXRTdHJlYW0oKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtU3RyZWFtOwogICAgIH0KQEAgLTIzMiwyMyArMjQ2LDQ5IEBACiAKIHR5cGVkZWYgc3RydWN0IFNpbmVUaHJlYWRlZERhdGFfcyB7CiAKLSAgICBTaW5lR2VuZXJhdG9yICBzaW5lT3NjMTsKLSAgICBTaW5lR2VuZXJhdG9yICBzaW5lT3NjMjsKLSAgICBUaW1lc3RhbXAgICAgICB0aW1lc3RhbXBzW01BWF9USU1FU1RBTVBTXTsKLSAgICBpbnQ2NF90ICAgICAgICBmcmFtZXNUb3RhbCA9IDA7Ci0gICAgaW50NjRfdCAgICAgICAgbmV4dEZyYW1lVG9HbGl0Y2ggPSBGT1JDRURfVU5ERVJSVU5fUEVSSU9EX0ZSQU1FUzsKLSAgICBpbnQzMl90ICAgICAgICBtaW5OdW1GcmFtZXMgPSBJTlQzMl9NQVg7Ci0gICAgaW50MzJfdCAgICAgICAgbWF4TnVtRnJhbWVzID0gMDsKLSAgICBpbnQzMl90ICAgICAgICB0aW1lc3RhbXBDb3VudCA9IDA7IC8vIGluIHRpbWVzdGFtcHMKKyAgICBTaW5lR2VuZXJhdG9yICAgICAgc2luZU9zY2lsbGF0b3JzW01BWF9DSEFOTkVMU107CisgICAgVGltZXN0YW1wICAgICAgICAgIHRpbWVzdGFtcHNbTUFYX1RJTUVTVEFNUFNdOworICAgIGludDY0X3QgICAgICAgICAgICBmcmFtZXNUb3RhbCA9IDA7CisgICAgaW50NjRfdCAgICAgICAgICAgIG5leHRGcmFtZVRvR2xpdGNoID0gRk9SQ0VEX1VOREVSUlVOX1BFUklPRF9GUkFNRVM7CisgICAgaW50MzJfdCAgICAgICAgICAgIG1pbk51bUZyYW1lcyA9IElOVDMyX01BWDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgbWF4TnVtRnJhbWVzID0gMDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgdGltZXN0YW1wQ291bnQgPSAwOyAvLyBpbiB0aW1lc3RhbXBzCisgICAgaW50MzJfdCAgICAgICAgICAgIHNhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgcHJlZml4VG9uZUZyYW1lcyA9IDA7CisgICAgYm9vbCAgICAgICAgICAgICAgIHN3ZWVwU2V0dXAgPSBmYWxzZTsKIAotICAgIGludCAgICAgICAgICAgIHNjaGVkdWxlciA9IDA7Ci0gICAgYm9vbCAgICAgICAgICAgc2NoZWR1bGVyQ2hlY2tlZCA9IGZhbHNlOwotICAgIGJvb2wgICAgICAgICAgIGZvcmNlVW5kZXJydW5zID0gZmFsc2U7CisgICAgaW50ICAgICAgICAgICAgICAgIHNjaGVkdWxlciA9IDA7CisgICAgYm9vbCAgICAgICAgICAgICAgIHNjaGVkdWxlckNoZWNrZWQgPSBmYWxzZTsKKyAgICBib29sICAgICAgICAgICAgICAgZm9yY2VVbmRlcnJ1bnMgPSBmYWxzZTsKIAogICAgIEFBdWRpb1NpbXBsZVBsYXllciBzaW1wbGVQbGF5ZXI7CiAgICAgaW50MzJfdCAgICAgICAgICAgIGNhbGxiYWNrQ291bnQgPSAwOwogICAgIFdha2VVcCAgICAgICAgICAgICB3YWtlcntBQVVESU9fT0t9OwogCisgICAgLyoqCisgICAgICogU2V0IHNhbXBsZVJhdGUgZmlyc3QuCisgICAgICovCisgICAgdm9pZCBzZXR1cFNpbmVCbGlwKCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9DSEFOTkVMUzsgKytpKSB7CisgICAgICAgICAgICBkb3VibGUgY2VudGVyRnJlcXVlbmN5ID0gODgwLjAgKiAoaSArIDIpOworICAgICAgICAgICAgc2luZU9zY2lsbGF0b3JzW2ldLnNldHVwKGNlbnRlckZyZXF1ZW5jeSwgc2FtcGxlUmF0ZSk7CisgICAgICAgICAgICBzaW5lT3NjaWxsYXRvcnNbaV0uc2V0U3dlZXAoY2VudGVyRnJlcXVlbmN5LCBjZW50ZXJGcmVxdWVuY3ksIDAuMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHNldHVwU2luZVN3ZWVwcygpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfQ0hBTk5FTFM7ICsraSkgeworICAgICAgICAgICAgZG91YmxlIGNlbnRlckZyZXF1ZW5jeSA9IDIyMC4wICogKGkgKyAyKTsKKyAgICAgICAgICAgIHNpbmVPc2NpbGxhdG9yc1tpXS5zZXR1cChjZW50ZXJGcmVxdWVuY3ksIHNhbXBsZVJhdGUpOworICAgICAgICAgICAgZG91YmxlIG1pbkZyZXF1ZW5jeSA9IGNlbnRlckZyZXF1ZW5jeSAqIDIuMCAvIDMuMDsKKyAgICAgICAgICAgIC8vIENoYW5nZSByYW5nZSBzbGlnaHRseSBzbyB0aGV5IHdpbGwgZ28gb3V0IG9mIHBoYXNlLgorICAgICAgICAgICAgZG91YmxlIG1heEZyZXF1ZW5jeSA9IGNlbnRlckZyZXF1ZW5jeSAqIDMuMCAvIDIuMDsKKyAgICAgICAgICAgIGRvdWJsZSBzd2VlcFNlY29uZHMgPSA1LjAgKyBpOworICAgICAgICAgICAgc2luZU9zY2lsbGF0b3JzW2ldLnNldFN3ZWVwKG1pbkZyZXF1ZW5jeSwgbWF4RnJlcXVlbmN5LCBzd2VlcFNlY29uZHMpOworICAgICAgICB9CisgICAgICAgIHN3ZWVwU2V0dXAgPSB0cnVlOworICAgIH0KKwogfSBTaW5lVGhyZWFkZWREYXRhX3Q7CiAKIC8vIENhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgZmlsbHMgdGhlIGF1ZGlvIG91dHB1dCBidWZmZXIuCkBAIC0yNjUsOSArMzA1LDExIEBACiAgICAgICAgIHJldHVybiBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1A7CiAgICAgfQogICAgIFNpbmVUaHJlYWRlZERhdGFfdCAqc2luZURhdGEgPSAoU2luZVRocmVhZGVkRGF0YV90ICopIHVzZXJEYXRhOwotICAgIHNpbmVEYXRhLT5jYWxsYmFja0NvdW50Kys7CiAKLSAgICBzaW5lRGF0YS0+ZnJhbWVzVG90YWwgKz0gbnVtRnJhbWVzOworICAgIC8vIFBsYXkgYW4gaW5pdGlhbCBoaWdoIHRvbmUgc28gd2UgY2FuIHRlbGwgd2hldGhlciB0aGUgYmVnaW5uaW5nIHdhcyB0cnVuY2F0ZWQuCisgICAgaWYgKCFzaW5lRGF0YS0+c3dlZXBTZXR1cCAmJiBzaW5lRGF0YS0+ZnJhbWVzVG90YWwgPj0gc2luZURhdGEtPnByZWZpeFRvbmVGcmFtZXMpIHsKKyAgICAgICAgc2luZURhdGEtPnNldHVwU2luZVN3ZWVwcygpOworICAgIH0KIAogICAgIGlmIChzaW5lRGF0YS0+Zm9yY2VVbmRlcnJ1bnMpIHsKICAgICAgICAgaWYgKHNpbmVEYXRhLT5mcmFtZXNUb3RhbCA+IHNpbmVEYXRhLT5uZXh0RnJhbWVUb0dsaXRjaCkgewpAQCAtMzAxLDMzICszNDMsMzIgQEAKICAgICB9CiAKICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSA9IEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQoc3RyZWFtKTsKLSAgICAvLyBUaGlzIGNvZGUgb25seSBwbGF5cyBvbiB0aGUgZmlyc3Qgb25lIG9yIHR3byBjaGFubmVscy4KLSAgICAvLyBUT0RPIFN1cHBvcnQgYXJiaXRyYXJ5IG51bWJlciBvZiBjaGFubmVscy4KKworCisgICAgaW50IG51bUFjdGl2ZU9zY2lsYXRvcnMgPSAoc2FtcGxlc1BlckZyYW1lID4gTUFYX0NIQU5ORUxTKSA/IE1BWF9DSEFOTkVMUyA6IHNhbXBsZXNQZXJGcmFtZTsKICAgICBzd2l0Y2ggKEFBdWRpb1N0cmVhbV9nZXRGb3JtYXQoc3RyZWFtKSkgewogICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0kxNjogewogICAgICAgICAgICAgaW50MTZfdCAqYXVkaW9CdWZmZXIgPSAoaW50MTZfdCAqKSBhdWRpb0RhdGE7Ci0gICAgICAgICAgICAvLyBSZW5kZXIgc2luZSB3YXZlcyBhcyBzaG9ydHMgdG8gZmlyc3QgY2hhbm5lbC4KLSAgICAgICAgICAgIHNpbmVEYXRhLT5zaW5lT3NjMS5yZW5kZXIoJmF1ZGlvQnVmZmVyWzBdLCBzYW1wbGVzUGVyRnJhbWUsIG51bUZyYW1lcyk7Ci0gICAgICAgICAgICAvLyBSZW5kZXIgc2luZSB3YXZlcyB0byBzZWNvbmQgY2hhbm5lbCBpZiB0aGVyZSBpcyBvbmUuCi0gICAgICAgICAgICBpZiAoc2FtcGxlc1BlckZyYW1lID4gMSkgewotICAgICAgICAgICAgICAgIHNpbmVEYXRhLT5zaW5lT3NjMi5yZW5kZXIoJmF1ZGlvQnVmZmVyWzFdLCBzYW1wbGVzUGVyRnJhbWUsIG51bUZyYW1lcyk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFjdGl2ZU9zY2lsYXRvcnM7ICsraSkgeworICAgICAgICAgICAgICAgIHNpbmVEYXRhLT5zaW5lT3NjaWxsYXRvcnNbaV0ucmVuZGVyKCZhdWRpb0J1ZmZlcltpXSwgc2FtcGxlc1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVDogewogICAgICAgICAgICAgZmxvYXQgKmF1ZGlvQnVmZmVyID0gKGZsb2F0ICopIGF1ZGlvRGF0YTsKLSAgICAgICAgICAgIC8vIFJlbmRlciBzaW5lIHdhdmVzIGFzIGZsb2F0cyB0byBmaXJzdCBjaGFubmVsLgotICAgICAgICAgICAgc2luZURhdGEtPnNpbmVPc2MxLnJlbmRlcigmYXVkaW9CdWZmZXJbMF0sIHNhbXBsZXNQZXJGcmFtZSwgbnVtRnJhbWVzKTsKLSAgICAgICAgICAgIC8vIFJlbmRlciBzaW5lIHdhdmVzIHRvIHNlY29uZCBjaGFubmVsIGlmIHRoZXJlIGlzIG9uZS4KLSAgICAgICAgICAgIGlmIChzYW1wbGVzUGVyRnJhbWUgPiAxKSB7Ci0gICAgICAgICAgICAgICAgc2luZURhdGEtPnNpbmVPc2MyLnJlbmRlcigmYXVkaW9CdWZmZXJbMV0sIHNhbXBsZXNQZXJGcmFtZSwgbnVtRnJhbWVzKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQWN0aXZlT3NjaWxhdG9yczsgKytpKSB7CisgICAgICAgICAgICAgICAgc2luZURhdGEtPnNpbmVPc2NpbGxhdG9yc1tpXS5yZW5kZXIoJmF1ZGlvQnVmZmVyW2ldLCBzYW1wbGVzUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUDsKICAgICB9CiAKKyAgICBzaW5lRGF0YS0+Y2FsbGJhY2tDb3VudCsrOworICAgIHNpbmVEYXRhLT5mcmFtZXNUb3RhbCArPSBudW1GcmFtZXM7CiAgICAgcmV0dXJuIEFBVURJT19DQUxMQkFDS19SRVNVTFRfQ09OVElOVUU7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVSZWNvcmRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVJlY29yZGVyLmgKaW5kZXggMTM0NDI3My4uODY5ZmFkMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVJlY29yZGVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVJlY29yZGVyLmgKQEAgLTE3OCw3ICsxNzgsNiBAQAogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlKCkgewogICAgICAgICBpZiAobVN0cmVhbSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBwcmludGYoImNhbGwgQUF1ZGlvU3RyZWFtX2Nsb3NlKCVwKVxuIiwgbVN0cmVhbSk7ICBmZmx1c2goc3Rkb3V0KTsKICAgICAgICAgICAgIEFBdWRpb1N0cmVhbV9jbG9zZShtU3RyZWFtKTsKICAgICAgICAgICAgIG1TdHJlYW0gPSBudWxscHRyOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvU2luZUdlbmVyYXRvci5oIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL1NpbmVHZW5lcmF0b3IuaAppbmRleCBhNzU1NTgyLi45ZTZkNDZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvU2luZUdlbmVyYXRvci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9TaW5lR2VuZXJhdG9yLmgKQEAgLTMxLDIwICszMSwyMCBAQAogICAgIH0KIAogICAgIHZvaWQgc2V0U3dlZXAoZG91YmxlIGZyZXF1ZW5jeUxvdywgZG91YmxlIGZyZXF1ZW5jeUhpZ2gsIGRvdWJsZSBzZWNvbmRzKSB7Ci0gICAgICAgIG1QaGFzZUluY3JlbWVudExvdyA9IGZyZXF1ZW5jeUxvdyAqIE1fUEkgKiAyIC8gbUZyYW1lUmF0ZTsKLSAgICAgICAgbVBoYXNlSW5jcmVtZW50SGlnaCA9IGZyZXF1ZW5jeUhpZ2ggKiBNX1BJICogMiAvIG1GcmFtZVJhdGU7Ci0KLSAgICAgICAgZG91YmxlIG51bUZyYW1lcyA9IHNlY29uZHMgKiBtRnJhbWVSYXRlOwotICAgICAgICBtVXBTY2FsZXIgPSBwb3coKGZyZXF1ZW5jeUhpZ2ggLyBmcmVxdWVuY3lMb3cpLCAoMS4wIC8gbnVtRnJhbWVzKSk7Ci0gICAgICAgIG1Eb3duU2NhbGVyID0gMS4wIC8gbVVwU2NhbGVyOwotICAgICAgICBtR29pbmdVcCA9IHRydWU7Ci0gICAgICAgIG1Td2VlcGluZyA9IHRydWU7CisgICAgICAgIG1Td2VlcGluZyA9IHNlY29uZHMgPiAwLjA7CisgICAgICAgIGlmIChtU3dlZXBpbmcpIHsKKyAgICAgICAgICAgIG1QaGFzZUluY3JlbWVudExvdyA9IGZyZXF1ZW5jeUxvdyAqIE1fUEkgKiAyIC8gbUZyYW1lUmF0ZTsKKyAgICAgICAgICAgIG1QaGFzZUluY3JlbWVudEhpZ2ggPSBmcmVxdWVuY3lIaWdoICogTV9QSSAqIDIgLyBtRnJhbWVSYXRlOworICAgICAgICAgICAgZG91YmxlIG51bUZyYW1lcyA9IHNlY29uZHMgKiBtRnJhbWVSYXRlOworICAgICAgICAgICAgbVVwU2NhbGVyID0gcG93KChmcmVxdWVuY3lIaWdoIC8gZnJlcXVlbmN5TG93KSwgKDEuMCAvIG51bUZyYW1lcykpOworICAgICAgICAgICAgbURvd25TY2FsZXIgPSAxLjAgLyBtVXBTY2FsZXI7CisgICAgICAgIH0KICAgICB9CiAKICAgICB2b2lkIHJlbmRlcihpbnQxNl90ICpidWZmZXIsIGludDMyX3QgY2hhbm5lbFN0cmlkZSwgaW50MzJfdCBudW1GcmFtZXMpIHsKICAgICAgICAgaW50IHNhbXBsZUluZGV4ID0gMDsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgewotICAgICAgICAgICAgYnVmZmVyW3NhbXBsZUluZGV4XSA9IChpbnQxNl90KSAoMzI3NjcgKiBzaW4obVBoYXNlKSAqIG1BbXBsaXR1ZGUpOworICAgICAgICAgICAgYnVmZmVyW3NhbXBsZUluZGV4XSA9IChpbnQxNl90KSAoSU5UMTZfTUFYICogc2luKG1QaGFzZSkgKiBtQW1wbGl0dWRlKTsKICAgICAgICAgICAgIHNhbXBsZUluZGV4ICs9IGNoYW5uZWxTdHJpZGU7CiAgICAgICAgICAgICBhZHZhbmNlUGhhc2UoKTsKICAgICAgICAgfQpAQCAtNjEsNiArNjEsNyBAQAogICAgIHZvaWQgc2V0QW1wbGl0dWRlKGRvdWJsZSBhbXBsaXR1ZGUpIHsKICAgICAgICAgbUFtcGxpdHVkZSA9IGFtcGxpdHVkZTsKICAgICB9CisKICAgICBkb3VibGUgZ2V0QW1wbGl0dWRlKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbUFtcGxpdHVkZTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTI1ZTY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvQW5kcm9pZC5icApAQCAtMCwwICsxLDE1IEBACitjY190ZXN0IHsKKyAgICBuYW1lOiAid3JpdGVfc2luZSIsCisgICAgc3JjczogWyJzcmMvd3JpdGVfc2luZS5jcHAiXSwKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAorICAgIGhlYWRlcl9saWJzOiBbImxpYmFhdWRpb19leGFtcGxlX3V0aWxzIl0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ3cml0ZV9zaW5lX2NhbGxiYWNrIiwKKyAgICBzcmNzOiBbInNyYy93cml0ZV9zaW5lX2NhbGxiYWNrLmNwcCJdLAorICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCisgICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvIl0sCisgICAgaGVhZGVyX2xpYnM6IFsibGliYWF1ZGlvX2V4YW1wbGVfdXRpbHMiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL0FuZHJvaWQubWsgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDUzZTdkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL2puaS9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvam5pL0FuZHJvaWQubWsKaW5kZXggZDYzMGU3Ni4uMWExYmQ0MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvam5pL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvam5pL0FuZHJvaWQubWsKQEAgLTEwLDYgKzEwLDcgQEAKIAogIyBOREsgcmVjb21tZW5kcyB1c2luZyB0aGlzIGtpbmQgb2YgcmVsYXRpdmUgcGF0aCBpbnN0ZWFkIG9mIGFuIGFic29sdXRlIHBhdGguCiBMT0NBTF9TUkNfRklMRVM6PSAuLi9zcmMvd3JpdGVfc2luZS5jcHAKK0xPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbwogTE9DQUxfTU9EVUxFIDo9IHdyaXRlX3NpbmUKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpAQCAtMjIsNiArMjMsNyBAQAogICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzCiAKIExPQ0FMX1NSQ19GSUxFUzo9IC4uL3NyYy93cml0ZV9zaW5lX2NhbGxiYWNrLmNwcAorTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvCiBMT0NBTF9NT0RVTEUgOj0gd3JpdGVfc2luZV9jYWxsYmFjawogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZS5jcHAKaW5kZXggNjc3ZmI2Yy4uOGUzM2EzMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmUuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lLmNwcApAQCAtNDQsMTAgKzQ0LDEwIEBACiAgICAgQUF1ZGlvU3RyZWFtICphYXVkaW9TdHJlYW0gPSBudWxscHRyOwogICAgIGludDMyX3QgIGZyYW1lc1BlckJ1cnN0ID0gMDsKICAgICBpbnQzMl90ICBmcmFtZXNQZXJXcml0ZSA9IDA7Ci0gICAgaW50MzJfdCAgYnVmZmVyQ2FwYWNpdHkgPSAwOwogICAgIGludDMyX3QgIGZyYW1lc1RvUGxheSA9IDA7CiAgICAgaW50MzJfdCAgZnJhbWVzTGVmdCA9IDA7CiAgICAgaW50MzJfdCAgeFJ1bkNvdW50ID0gMDsKKyAgICBpbnQgICAgICBudW1BY3RpdmVPc2NpbGF0b3JzID0gMDsKICAgICBmbG9hdCAgICpmbG9hdERhdGEgPSBudWxscHRyOwogICAgIGludDE2X3QgKnNob3J0RGF0YSA9IG51bGxwdHI7CiAKQEAgLTU3LDcgKzU3LDcgQEAKICAgICAvLyBpbiBhIGJ1ZmZlciBpZiB3ZSBoYW5nIG9yIGNyYXNoLgogICAgIHNldHZidWYoc3Rkb3V0LCBudWxscHRyLCBfSU9OQkYsIChzaXplX3QpIDApOwogCi0gICAgcHJpbnRmKCIlcyAtIFBsYXkgYSBzaW5lIHdhdmUgdXNpbmcgQUF1ZGlvIFYwLjEuMlxuIiwgYXJndlswXSk7CisgICAgcHJpbnRmKCIlcyAtIFBsYXkgYSBzaW5lIHdhdmUgdXNpbmcgQUF1ZGlvIFYwLjEuM1xuIiwgYXJndlswXSk7CiAKICAgICBpZiAoYXJnUGFyc2VyLnBhcnNlQXJncyhhcmdjLCBhcmd2KSkgewogICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwpAQCAtNzcsOCArNzcsOCBAQAogICAgIGFjdHVhbFNhbXBsZVJhdGUgPSBBQXVkaW9TdHJlYW1fZ2V0U2FtcGxlUmF0ZShhYXVkaW9TdHJlYW0pOwogICAgIGFjdHVhbERhdGFGb3JtYXQgPSBBQXVkaW9TdHJlYW1fZ2V0Rm9ybWF0KGFhdWRpb1N0cmVhbSk7CiAKLSAgICBteURhdGEuc2luZU9zYzEuc2V0dXAoNDQwLjAsIGFjdHVhbFNhbXBsZVJhdGUpOwotICAgIG15RGF0YS5zaW5lT3NjMi5zZXR1cCg2NjAuMCwgYWN0dWFsU2FtcGxlUmF0ZSk7CisgICAgbXlEYXRhLnNhbXBsZVJhdGUgPSBhY3R1YWxTYW1wbGVSYXRlOworICAgIG15RGF0YS5zZXR1cFNpbmVTd2VlcHMoKTsKIAogICAgIC8vIFNvbWUgRE1BIG1pZ2h0IHVzZSB2ZXJ5IHNob3J0IGJ1cnN0cyBvZiAxNiBmcmFtZXMuIFdlIGRvbid0IG5lZWQgdG8gd3JpdGUgc3VjaCBzbWFsbAogICAgIC8vIGJ1ZmZlcnMuIEJ1dCBpdCBoZWxwcyB0byB1c2UgYSBtdWx0aXBsZSBvZiB0aGUgYnVyc3Qgc2l6ZSBmb3IgcHJlZGljdGFibGUgc2NoZWR1bGluZy4KQEAgLTExNywxOSArMTE3LDE4IEBACiAgICAgLy8gUGxheSBmb3IgYSB3aGlsZS4KICAgICBmcmFtZXNUb1BsYXkgPSBhY3R1YWxTYW1wbGVSYXRlICogYXJnUGFyc2VyLmdldER1cmF0aW9uU2Vjb25kcygpOwogICAgIGZyYW1lc0xlZnQgPSBmcmFtZXNUb1BsYXk7CisgICAgbnVtQWN0aXZlT3NjaWxhdG9ycyA9IChhY3R1YWxDaGFubmVsQ291bnQgPiBNQVhfQ0hBTk5FTFMpID8gTUFYX0NIQU5ORUxTIDogYWN0dWFsQ2hhbm5lbENvdW50OwogICAgIHdoaWxlIChmcmFtZXNMZWZ0ID4gMCkgewotCisgICAgICAgIC8vIFJlbmRlciBhcyBGTE9BVCBvciBQQ00KICAgICAgICAgaWYgKGFjdHVhbERhdGFGb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgICAgIC8vIFJlbmRlciBzaW5lIHdhdmVzIHRvIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWxzLgotICAgICAgICAgICAgbXlEYXRhLnNpbmVPc2MxLnJlbmRlcigmZmxvYXREYXRhWzBdLCBhY3R1YWxDaGFubmVsQ291bnQsIGZyYW1lc1BlcldyaXRlKTsKLSAgICAgICAgICAgIGlmIChhY3R1YWxDaGFubmVsQ291bnQgPiAxKSB7Ci0gICAgICAgICAgICAgICAgbXlEYXRhLnNpbmVPc2MyLnJlbmRlcigmZmxvYXREYXRhWzFdLCBhY3R1YWxDaGFubmVsQ291bnQsIGZyYW1lc1BlcldyaXRlKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQWN0aXZlT3NjaWxhdG9yczsgKytpKSB7CisgICAgICAgICAgICAgICAgbXlEYXRhLnNpbmVPc2NpbGxhdG9yc1tpXS5yZW5kZXIoJmZsb2F0RGF0YVtpXSwgYWN0dWFsQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNQZXJXcml0ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoYWN0dWFsRGF0YUZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgICAgIC8vIFJlbmRlciBzaW5lIHdhdmVzIHRvIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWxzLgotICAgICAgICAgICAgbXlEYXRhLnNpbmVPc2MxLnJlbmRlcigmc2hvcnREYXRhWzBdLCBhY3R1YWxDaGFubmVsQ291bnQsIGZyYW1lc1BlcldyaXRlKTsKLSAgICAgICAgICAgIGlmIChhY3R1YWxDaGFubmVsQ291bnQgPiAxKSB7Ci0gICAgICAgICAgICAgICAgbXlEYXRhLnNpbmVPc2MyLnJlbmRlcigmc2hvcnREYXRhWzFdLCBhY3R1YWxDaGFubmVsQ291bnQsIGZyYW1lc1BlcldyaXRlKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQWN0aXZlT3NjaWxhdG9yczsgKytpKSB7CisgICAgICAgICAgICAgICAgbXlEYXRhLnNpbmVPc2NpbGxhdG9yc1tpXS5yZW5kZXIoJnNob3J0RGF0YVtpXSwgYWN0dWFsQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNQZXJXcml0ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmVfY2FsbGJhY2suY3BwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmVfY2FsbGJhY2suY3BwCmluZGV4IDRmOWNkZTYuLmUzM2U5ZjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lX2NhbGxiYWNrLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZV9jYWxsYmFjay5jcHAKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAjaW5jbHVkZSAiQUF1ZGlvRXhhbXBsZVV0aWxzLmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2ltcGxlUGxheWVyLmgiCi0jaW5jbHVkZSAiLi4vLi4vdXRpbHMvQUF1ZGlvU2ltcGxlUGxheWVyLmgiCisjaW5jbHVkZSAiQUF1ZGlvQXJnc1BhcnNlci5oIgogCiAvKioKICAqIE9wZW4gc3RyZWFtLCBwbGF5IHNvbWUgc2luZSB3YXZlcywgdGhlbiBjbG9zZSB0aGUgc3RyZWFtLgpAQCAtMzYsMzcgKzM2LDM5IEBACiAgKiBAcGFyYW0gYXJnUGFyc2VyCiAgKiBAcmV0dXJuIEFBVURJT19PSyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlCiAgKi8KLXN0YXRpYyBhYXVkaW9fcmVzdWx0X3QgdGVzdE9wZW5QbGF5Q2xvc2UoQUF1ZGlvQXJnc1BhcnNlciAmYXJnUGFyc2VyKQorc3RhdGljIGFhdWRpb19yZXN1bHRfdCB0ZXN0T3BlblBsYXlDbG9zZShBQXVkaW9BcmdzUGFyc2VyICZhcmdQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbG9vcENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByZWZpeFRvbmVNc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlVW5kZXJydW5zKQogewogICAgIFNpbmVUaHJlYWRlZERhdGFfdCBteURhdGE7CiAgICAgQUF1ZGlvU2ltcGxlUGxheWVyICZwbGF5ZXIgPSBteURhdGEuc2ltcGxlUGxheWVyOwogICAgIGFhdWRpb19yZXN1bHRfdCAgICByZXN1bHQgPSBBQVVESU9fT0s7CiAgICAgYm9vbCAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RlZCA9IGZhbHNlOworICAgIGJvb2wgICAgICAgICAgICAgICBiYWlsT3V0ID0gZmFsc2U7CiAgICAgaW50NjRfdCAgICAgICAgICAgIHN0YXJ0ZWRBdE5hbm9zOwogCiAgICAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBydW4gY29tcGxldGUgdGVzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAgICAgbXlEYXRhLnNjaGVkdWxlckNoZWNrZWQgPSBmYWxzZTsKICAgICBteURhdGEuY2FsbGJhY2tDb3VudCA9IDA7Ci0gICAgbXlEYXRhLmZvcmNlVW5kZXJydW5zID0gZmFsc2U7IC8vIHNldCB0cnVlIHRvIHRlc3QgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudCgpCisgICAgbXlEYXRhLmZvcmNlVW5kZXJydW5zID0gZm9yY2VVbmRlcnJ1bnM7IC8vIHRlc3QgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudCgpCiAKICAgICByZXN1bHQgPSBwbGF5ZXIub3BlbihhcmdQYXJzZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgU2ltcGxlUGxheWVyRGF0YUNhbGxiYWNrUHJvYywgU2ltcGxlUGxheWVyRXJyb3JDYWxsYmFja1Byb2MsICZteURhdGEpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgLSAgcGxheWVyLm9wZW4oKSByZXR1cm5lZCAlZFxuIiwgcmVzdWx0KTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAtICBwbGF5ZXIub3BlbigpIHJldHVybmVkICVzXG4iLAorICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAogICAgIGFyZ1BhcnNlci5jb21wYXJlV2l0aFN0cmVhbShwbGF5ZXIuZ2V0U3RyZWFtKCkpOwogCi0gICAgLy8gU2V0dXAgc2luZSB3YXZlIGdlbmVyYXRvcnMuCi0gICAgewotICAgICAgICBpbnQzMl90IGFjdHVhbFNhbXBsZVJhdGUgPSBwbGF5ZXIuZ2V0U2FtcGxlUmF0ZSgpOwotICAgICAgICBteURhdGEuc2luZU9zYzEuc2V0dXAoNDQwLjAsIGFjdHVhbFNhbXBsZVJhdGUpOwotICAgICAgICBteURhdGEuc2luZU9zYzEuc2V0U3dlZXAoMzAwLjAsIDYwMC4wLCA1LjApOwotICAgICAgICBteURhdGEuc2luZU9zYzEuc2V0QW1wbGl0dWRlKDAuMik7Ci0gICAgICAgIG15RGF0YS5zaW5lT3NjMi5zZXR1cCg2NjAuMCwgYWN0dWFsU2FtcGxlUmF0ZSk7Ci0gICAgICAgIG15RGF0YS5zaW5lT3NjMi5zZXRTd2VlcCgzNTAuMCwgOTAwLjAsIDcuMCk7Ci0gICAgICAgIG15RGF0YS5zaW5lT3NjMi5zZXRBbXBsaXR1ZGUoMC4yKTsKKyAgICBteURhdGEuc2FtcGxlUmF0ZSA9IHBsYXllci5nZXRTYW1wbGVSYXRlKCk7CisgICAgbXlEYXRhLnByZWZpeFRvbmVGcmFtZXMgPSBwcmVmaXhUb25lTXNlYyAqIG15RGF0YS5zYW1wbGVSYXRlIC8gMTAwMDsKKyAgICBpZiAobXlEYXRhLnByZWZpeFRvbmVGcmFtZXMgPiAwKSB7CisgICAgICAgIG15RGF0YS5zZXR1cFNpbmVCbGlwKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbXlEYXRhLnNldHVwU2luZVN3ZWVwcygpOwogICAgIH0KIAogI2lmIDAKQEAgLTc4LDQyICs4MCw5MyBAQAogICAgIH0KICNlbmRpZgogCi0gICAgcmVzdWx0ID0gcGxheWVyLnN0YXJ0KCk7Ci0gICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAtIHBsYXllci5zdGFydCgpIHJldHVybmVkICVkXG4iLCByZXN1bHQpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KKyAgICBmb3IgKGludCBsb29wSW5kZXggPSAwOyBsb29wSW5kZXggPCBsb29wQ291bnQ7IGxvb3BJbmRleCsrKSB7CisgICAgICAgIC8vIE9ubHkgcGxheSBkYXRhIG9uIGV2ZXJ5IG90aGVyIGxvb3Agc28gd2UgY2FuIGhlYXIgaWYgdGhlcmUgaXMgc3RhbGUgZGF0YS4KKyAgICAgICAgZG91YmxlIGFtcGxpdHVkZTsKKyAgICAgICAgaW50MzJfdCBkdXJhdGlvblNlY29uZHM7CisgICAgICAgIGlmICgobG9vcEluZGV4ICYgMSkgPT0gMCkgeworICAgICAgICAgICAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0gU0lORSAtLS0tLS1cbiIpOworICAgICAgICAgICAgYW1wbGl0dWRlID0gMC4yOworICAgICAgICAgICAgZHVyYXRpb25TZWNvbmRzID0gYXJnUGFyc2VyLmdldER1cmF0aW9uU2Vjb25kcygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0gUVVJRVQgLS0tLS1cbiIpOworICAgICAgICAgICAgYW1wbGl0dWRlID0gMC4wOworICAgICAgICAgICAgZHVyYXRpb25TZWNvbmRzID0gMjsgLy8ganVzdCB3YWl0IGJyaWVmbHkgd2hlbiBxdWlldAorICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0NIQU5ORUxTOyArK2kpIHsKKyAgICAgICAgICAgIG15RGF0YS5zaW5lT3NjaWxsYXRvcnNbaV0uc2V0QW1wbGl0dWRlKGFtcGxpdHVkZSk7CisgICAgICAgIH0KIAotICAgIC8vIFBsYXkgYSBzaW5lIHdhdmUgaW4gdGhlIGJhY2tncm91bmQuCi0gICAgcHJpbnRmKCJTbGVlcCBmb3IgJWQgc2Vjb25kcyB3aGlsZSBhdWRpbyBwbGF5cyBpbiBhIGNhbGxiYWNrIHRocmVhZC5cbiIsCi0gICAgICAgICAgIGFyZ1BhcnNlci5nZXREdXJhdGlvblNlY29uZHMoKSk7Ci0gICAgc3RhcnRlZEF0TmFub3MgPSBnZXROYW5vc2Vjb25kcyhDTE9DS19NT05PVE9OSUMpOwotICAgIGZvciAoaW50IHNlY29uZCA9IDA7IHNlY29uZCA8IGFyZ1BhcnNlci5nZXREdXJhdGlvblNlY29uZHMoKTsgc2Vjb25kKyspCi0gICAgewotICAgICAgICAvLyBTbGVlcCBhIHdoaWxlLiBXYWtlIHVwIGVhcmx5IGlmIHRoZXJlIGlzIGFuIGVycm9yLCBmb3IgZXhhbXBsZSBhIERJU0NPTk5FQ1QuCi0gICAgICAgIGxvbmcgcmV0ID0gbXlEYXRhLndha2VyLndhaXQoQUFVRElPX09LLCBOQU5PU19QRVJfU0VDT05EKTsKLSAgICAgICAgaW50NjRfdCBtaWxsaXMgPSAoZ2V0TmFub3NlY29uZHMoQ0xPQ0tfTU9OT1RPTklDKSAtIHN0YXJ0ZWRBdE5hbm9zKSAvIE5BTk9TX1BFUl9NSUxMSVNFQ09ORDsKLSAgICAgICAgcmVzdWx0ID0gbXlEYXRhLndha2VyLmdldCgpOwotICAgICAgICBwcmludGYoIndhaXQoKSByZXR1cm5zICVsZCwgYWF1ZGlvX3Jlc3VsdCA9ICVkLCBhdCAlNmQgbWlsbGlzIgotICAgICAgICAgICAgICAgIiwgc2Vjb25kID0gJWQsIGZyYW1lc1dyaXR0ZW4gPSAlOGQsIHVuZGVycnVucyA9ICVkXG4iLAotICAgICAgICAgICAgICAgcmV0LCByZXN1bHQsIChpbnQpIG1pbGxpcywKLSAgICAgICAgICAgICAgIHNlY29uZCwKLSAgICAgICAgICAgICAgIChpbnQpIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKHBsYXllci5nZXRTdHJlYW0oKSksCi0gICAgICAgICAgICAgICAoaW50KSBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50KHBsYXllci5nZXRTdHJlYW0oKSkpOworICAgICAgICByZXN1bHQgPSBwbGF5ZXIuc3RhcnQoKTsKICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RlZCA9IHRydWU7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gcGxheWVyLnN0YXJ0KCkgcmV0dXJuZWQgJWRcbiIsIHJlc3VsdCk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGxheSBhIHNpbmUgd2F2ZSBpbiB0aGUgYmFja2dyb3VuZC4KKyAgICAgICAgcHJpbnRmKCJTbGVlcCBmb3IgJWQgc2Vjb25kcyB3aGlsZSBhdWRpbyBwbGF5cyBpbiBhIGNhbGxiYWNrIHRocmVhZC4gJWQgb2YgJWRcbiIsCisgICAgICAgICAgICAgICBhcmdQYXJzZXIuZ2V0RHVyYXRpb25TZWNvbmRzKCksIChsb29wSW5kZXggKyAxKSwgbG9vcENvdW50KTsKKyAgICAgICAgc3RhcnRlZEF0TmFub3MgPSBnZXROYW5vc2Vjb25kcyhDTE9DS19NT05PVE9OSUMpOworICAgICAgICBmb3IgKGludCBzZWNvbmQgPSAwOyBzZWNvbmQgPCBkdXJhdGlvblNlY29uZHM7IHNlY29uZCsrKSB7CisgICAgICAgICAgICAvLyBTbGVlcCBhIHdoaWxlLiBXYWtlIHVwIGVhcmx5IGlmIHRoZXJlIGlzIGFuIGVycm9yLCBmb3IgZXhhbXBsZSBhIERJU0NPTk5FQ1QuCisgICAgICAgICAgICBsb25nIHJldCA9IG15RGF0YS53YWtlci53YWl0KEFBVURJT19PSywgTkFOT1NfUEVSX1NFQ09ORCk7CisgICAgICAgICAgICBpbnQ2NF90IG1pbGxpcyA9CisgICAgICAgICAgICAgICAgICAgIChnZXROYW5vc2Vjb25kcyhDTE9DS19NT05PVE9OSUMpIC0gc3RhcnRlZEF0TmFub3MpIC8gTkFOT1NfUEVSX01JTExJU0VDT05EOworICAgICAgICAgICAgcmVzdWx0ID0gbXlEYXRhLndha2VyLmdldCgpOworICAgICAgICAgICAgcHJpbnRmKCJ3YWl0KCkgcmV0dXJucyAlbGQsIGFhdWRpb19yZXN1bHQgPSAlZCwgYXQgJTZkIG1pbGxpcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIHNlY29uZCA9ICUzZCwgZnJhbWVzV3JpdHRlbiA9ICU4ZCwgdW5kZXJydW5zID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgcmV0LCByZXN1bHQsIChpbnQpIG1pbGxpcywKKyAgICAgICAgICAgICAgICAgICBzZWNvbmQsCisgICAgICAgICAgICAgICAgICAgKGludCkgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4ocGxheWVyLmdldFN0cmVhbSgpKSwKKyAgICAgICAgICAgICAgICAgICAoaW50KSBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50KHBsYXllci5nZXRTdHJlYW0oKSkpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgICAgICBkaXNjb25uZWN0ZWQgPSAocmVzdWx0ID09IEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQpOworICAgICAgICAgICAgICAgIGJhaWxPdXQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaW50ZigiQUF1ZGlvIHJlc3VsdCA9ICVkID0gJXNcbiIsIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisKKyAgICAgICAgLy8gQWx0ZXJuYXRlIGJldHdlZW4gdXNpbmcgc3RvcCBvciBwYXVzZSBmb3IgZWFjaCBzaW5lL3F1aWV0IHBhaXIuCisgICAgICAgIC8vIFJlcGVhdCB0aGlzIHBhdHRlcm46IHtzaW5lLXN0b3AtcXVpZXQtc3RvcC1zaW5lLXBhdXNlLXF1aWV0LXBhdXNlfQorICAgICAgICBpZiAoKGxvb3BJbmRleCAmIDIpID09IDApIHsKKyAgICAgICAgICAgIHByaW50ZigiU1RPUCwgY2FsbGJhY2sgIyA9ICVkXG4iLCBteURhdGEuY2FsbGJhY2tDb3VudCk7CisgICAgICAgICAgICByZXN1bHQgPSBwbGF5ZXIuc3RvcCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCJQQVVTRS9GTFVTSCwgY2FsbGJhY2sgIyA9ICVkXG4iLCBteURhdGEuY2FsbGJhY2tDb3VudCk7CisgICAgICAgICAgICByZXN1bHQgPSBwbGF5ZXIucGF1c2UoKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdCA9IHBsYXllci5mbHVzaCgpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJhaWxPdXQpIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgfQotICAgIHByaW50ZigiQUF1ZGlvIHJlc3VsdCA9ICVkID0gJXNcbiIsIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CiAKLSAgICBwcmludGYoImNhbGwgc3RvcCgpIGNhbGxiYWNrICMgPSAlZFxuIiwgbXlEYXRhLmNhbGxiYWNrQ291bnQpOwotICAgIHJlc3VsdCA9IHBsYXllci5zdG9wKCk7Ci0gICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgeworICAgICAgICAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IHN0YXRlID0gQUF1ZGlvU3RyZWFtX2dldFN0YXRlKHBsYXllci5nZXRTdHJlYW0oKSk7CisgICAgICAgICAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgZmluYWxTdGF0ZSA9IEFBVURJT19TVFJFQU1fU1RBVEVfVU5JTklUSUFMSVpFRDsKKyAgICAgICAgICAgIGludDY0X3QgdGltZW91dE5hbm9zID0gMjAwMCAqIE5BTk9TX1BFUl9NSUxMSVNFQ09ORDsKKyAgICAgICAgICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV93YWl0Rm9yU3RhdGVDaGFuZ2UocGxheWVyLmdldFN0cmVhbSgpLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbmFsU3RhdGUsIHRpbWVvdXROYW5vcyk7CisgICAgICAgICAgICBwcmludGYoIndhaXRGb3JTdGF0ZUNoYW5nZSByZXR1cm5zICVzLCBzdGF0ZSA9ICVzXG4iLAorICAgICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCksCisgICAgICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChmaW5hbFN0YXRlKSk7CisgICAgICAgICAgICBpbnQ2NF90IHdyaXR0ZW4gPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihwbGF5ZXIuZ2V0U3RyZWFtKCkpOworICAgICAgICAgICAgaW50NjRfdCByZWFkID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQocGxheWVyLmdldFN0cmVhbSgpKTsKKyAgICAgICAgICAgIHByaW50ZigiICAgZnJhbWVzV3JpdHRlbiA9ICVsbGQsIGZyYW1lc1JlYWQgPSAlbGxkLCBkaWZmID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSByZWFkLAorICAgICAgICAgICAgICAgICAgIChpbnQpICh3cml0dGVuIC0gcmVhZCkpOworICAgICAgICB9CisKICAgICB9CisKICAgICBwcmludGYoImNhbGwgY2xvc2UoKVxuIik7CiAgICAgcmVzdWx0ID0gcGxheWVyLmNsb3NlKCk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKQEAgLTE0NywyMyArMjAwLDU5IEBACiAgICAgcmV0dXJuIGRpc2Nvbm5lY3RlZCA/IEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQgOiByZXN1bHQ7CiB9CiAKK3N0YXRpYyB2b2lkIHVzYWdlKCkgeworICAgIEFBdWRpb0FyZ3NQYXJzZXI6OnVzYWdlKCk7CisgICAgcHJpbnRmKCIgICAgICAtbHtjb3VudH0gbG9vcENvdW50IHN0YXJ0L3N0b3AsIGV2ZXJ5IG90aGVyIG9uZSBpcyBzaWxlbnRcbiIpOworICAgIHByaW50ZigiICAgICAgLXR7bXNlY30gIHBsYXkgYSBoaWdoIHBpdGNoZWQgdG9uZSBhdCB0aGUgYmVnaW5uaW5nXG4iKTsKKyAgICBwcmludGYoIiAgICAgIC16ICAgICAgICBmb3JjZSBwZXJpb2RpYyB1bmRlcnJ1bnMgYnkgc2xlZXBpbmcgaW4gY2FsbGJhY2tcbiIpOworfQorCiBpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCiB7CiAgICAgQUF1ZGlvQXJnc1BhcnNlciAgIGFyZ1BhcnNlcjsKICAgICBhYXVkaW9fcmVzdWx0X3QgICAgcmVzdWx0OworICAgIGludDMyX3QgICAgICAgICAgICBsb29wQ291bnQgPSAxOworICAgIGludDMyX3QgICAgICAgICAgICBwcmVmaXhUb25lTXNlYyA9IDA7CisgICAgYm9vbCAgICAgICAgICAgICAgIGZvcmNlVW5kZXJydW5zID0gZmFsc2U7CiAKICAgICAvLyBNYWtlIHByaW50ZiBwcmludCBpbW1lZGlhdGVseSBzbyB0aGF0IGRlYnVnIGluZm8gaXMgbm90IHN0dWNrCiAgICAgLy8gaW4gYSBidWZmZXIgaWYgd2UgaGFuZyBvciBjcmFzaC4KICAgICBzZXR2YnVmKHN0ZG91dCwgbnVsbHB0ciwgX0lPTkJGLCAoc2l6ZV90KSAwKTsKIAotICAgIHByaW50ZigiJXMgLSBQbGF5IGEgc2luZSBzd2VlcCB1c2luZyBhbiBBQXVkaW8gY2FsbGJhY2sgVjAuMS4yXG4iLCBhcmd2WzBdKTsKKyAgICBwcmludGYoIiVzIC0gUGxheSBhIHNpbmUgc3dlZXAgdXNpbmcgYW4gQUF1ZGlvIGNhbGxiYWNrIFYwLjEuNFxuIiwgYXJndlswXSk7CiAKLSAgICBpZiAoYXJnUGFyc2VyLnBhcnNlQXJncyhhcmdjLCBhcmd2KSkgewotICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisgICAgICAgIGlmIChhcmdQYXJzZXIucGFyc2VBcmcoYXJnKSkgeworICAgICAgICAgICAgLy8gSGFuZGxlIG9wdGlvbnMgdGhhdCBhcmUgbm90IGhhbmRsZWQgYnkgdGhlIEFyZ1BhcnNlcgorICAgICAgICAgICAgaWYgKGFyZ1swXSA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICBjaGFyIG9wdGlvbiA9IGFyZ1sxXTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbikgeworICAgICAgICAgICAgICAgICAgICBjYXNlICdsJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BDb3VudCA9IGF0b2koJmFyZ1syXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhUb25lTXNlYyA9IGF0b2koJmFyZ1syXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAneic6CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVVuZGVycnVucyA9IHRydWU7ICAvLyBaenp6enp6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVzYWdlKCk7CisgICAgICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gS2VlcCBsb29waW5nIHVudGlsIHdlIGNhbiBjb21wbGV0ZSB0aGUgdGVzdCB3aXRob3V0IGRpc2Nvbm5lY3RpbmcuCi0gICAgd2hpbGUoKHJlc3VsdCA9IHRlc3RPcGVuUGxheUNsb3NlKGFyZ1BhcnNlcikpID09IEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQpOworICAgIHdoaWxlKChyZXN1bHQgPSB0ZXN0T3BlblBsYXlDbG9zZShhcmdQYXJzZXIsIGxvb3BDb3VudCwgcHJlZml4VG9uZU1zZWMsIGZvcmNlVW5kZXJydW5zKSkKKyAgICAgICAgICAgID09IEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQpOwogCiAgICAgcmV0dXJuIChyZXN1bHQpID8gRVhJVF9GQUlMVVJFIDogRVhJVF9TVUNDRVNTOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oIGIvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oCmluZGV4IDNjMjM3MzYuLjIyMDdjYjhjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oCkBAIC0xMjMsMjAgKzEyMywxOTUgQEAKICAgICAvKioKICAgICAgKiBObyBwYXJ0aWN1bGFyIHBlcmZvcm1hbmNlIG5lZWRzLiBEZWZhdWx0LgogICAgICAqLwotICAgICAgICAgICAgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSA9IDEwLAorICAgIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUgPSAxMCwKIAogICAgIC8qKgogICAgICAqIEV4dGVuZGluZyBiYXR0ZXJ5IGxpZmUgaXMgbW9zdCBpbXBvcnRhbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1vZGUgaXMgbm90IHN1cHBvcnRlZCBpbiBpbnB1dCBzdHJlYW1zLgorICAgICAqIE1vZGUgTk9ORSB3aWxsIGJlIHVzZWQgaWYgdGhpcyBpcyByZXF1ZXN0ZWQuCiAgICAgICovCi0gICAgICAgICAgICBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9QT1dFUl9TQVZJTkcsCisgICAgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfUE9XRVJfU0FWSU5HLAogCiAgICAgLyoqCiAgICAgICogUmVkdWNpbmcgbGF0ZW5jeSBpcyBtb3N0IGltcG9ydGFudC4KICAgICAgKi8KLSAgICAgICAgICAgIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZCisgICAgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kKIH07CiB0eXBlZGVmIGludDMyX3QgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdDsKIAorLyoqCisgKiBUaGUgVVNBR0UgYXR0cmlidXRlIGV4cHJlc3NlcyAid2h5IiB5b3UgYXJlIHBsYXlpbmcgYSBzb3VuZCwgd2hhdCBpcyB0aGlzIHNvdW5kIHVzZWQgZm9yLgorICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGJ5IGNlcnRhaW4gcGxhdGZvcm1zIG9yIHJvdXRpbmcgcG9saWNpZXMKKyAqIHRvIG1ha2UgbW9yZSByZWZpbmVkIHZvbHVtZSBvciByb3V0aW5nIGRlY2lzaW9ucy4KKyAqCisgKiBOb3RlIHRoYXQgdGhlc2UgbWF0Y2ggdGhlIGVxdWl2YWxlbnQgdmFsdWVzIGluIEF1ZGlvQXR0cmlidXRlcyBpbiB0aGUgQW5kcm9pZCBKYXZhIEFQSS4KKyAqCisgKiBBZGRlZCBpbiBBUEkgbGV2ZWwgMjguCisgKi8KK2VudW0geworICAgIC8qKgorICAgICAqIFVzZSB0aGlzIGZvciBzdHJlYW1pbmcgbWVkaWEsIG11c2ljIHBlcmZvcm1hbmNlLCB2aWRlbywgcG9kY2FzdHMsIGV0Y2V0ZXJhLgorICAgICAqLworICAgIEFBVURJT19VU0FHRV9NRURJQSA9IDEsCisKKyAgICAvKioKKyAgICAgKiBVc2UgdGhpcyBmb3Igdm9pY2Ugb3ZlciBJUCwgdGVsZXBob255LCBldGNldGVyYS4KKyAgICAgKi8KKyAgICBBQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTiA9IDIsCisKKyAgICAvKioKKyAgICAgKiBVc2UgdGhpcyBmb3Igc291bmRzIGFzc29jaWF0ZWQgd2l0aCB0ZWxlcGhvbnkgc3VjaCBhcyBidXN5IHRvbmVzLCBEVE1GLCBldGNldGVyYS4KKyAgICAgKi8KKyAgICBBQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HID0gMywKKworICAgIC8qKgorICAgICAqIFVzZSB0aGlzIHRvIGRlbWFuZCB0aGUgdXNlcnMgYXR0ZW50aW9uLgorICAgICAqLworICAgIEFBVURJT19VU0FHRV9BTEFSTSA9IDQsCisKKyAgICAvKioKKyAgICAgKiBVc2UgdGhpcyBmb3Igbm90aWZ5aW5nIHRoZSB1c2VyIHdoZW4gYSBtZXNzYWdlIGhhcyBhcnJpdmVkIG9yIHNvbWUKKyAgICAgKiBvdGhlciBiYWNrZ3JvdW5kIGV2ZW50IGhhcyBvY2N1cmVkLgorICAgICAqLworICAgIEFBVURJT19VU0FHRV9OT1RJRklDQVRJT04gPSA1LAorCisgICAgLyoqCisgICAgICogVXNlIHRoaXMgd2hlbiB0aGUgcGhvbmUgcmluZ3MuCisgICAgICovCisgICAgQUFVRElPX1VTQUdFX05PVElGSUNBVElPTl9SSU5HVE9ORSA9IDYsCisKKyAgICAvKioKKyAgICAgKiBVc2UgdGhpcyB0byBhdHRyYWN0IHRoZSB1c2VycyBhdHRlbnRpb24gd2hlbiwgZm9yIGV4YW1wbGUsIHRoZSBiYXR0ZXJ5IGlzIGxvdy4KKyAgICAgKi8KKyAgICBBQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UID0gMTAsCisKKyAgICAvKioKKyAgICAgKiBVc2UgdGhpcyBmb3Igc2NyZWVuIHJlYWRlcnMsIGV0Y2V0ZXJhLgorICAgICAqLworICAgIEFBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFkgPSAxMSwKKworICAgIC8qKgorICAgICAqIFVzZSB0aGlzIGZvciBkcml2aW5nIG9yIG5hdmlnYXRpb24gZGlyZWN0aW9ucy4KKyAgICAgKi8KKyAgICBBQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFID0gMTIsCisKKyAgICAvKioKKyAgICAgKiBVc2UgdGhpcyBmb3IgdXNlciBpbnRlcmZhY2Ugc291bmRzLCBiZWVwcywgZXRjZXRlcmEuCisgICAgICovCisgICAgQUFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OID0gMTMsCisKKyAgICAvKioKKyAgICAgKiBVc2UgdGhpcyBmb3IgZ2FtZSBhdWRpbyBhbmQgc291bmQgZWZmZWN0cy4KKyAgICAgKi8KKyAgICBBQVVESU9fVVNBR0VfR0FNRSA9IDE0LAorCisgICAgLyoqCisgICAgICogVXNlIHRoaXMgZm9yIGF1ZGlvIHJlc3BvbnNlcyB0byB1c2VyIHF1ZXJpZXMsIGF1ZGlvIGluc3RydWN0aW9ucyBvciBoZWxwIHV0dGVyYW5jZXMuCisgICAgICovCisgICAgQUFVRElPX1VTQUdFX0FTU0lTVEFOVCA9IDE2Cit9OwordHlwZWRlZiBpbnQzMl90IGFhdWRpb191c2FnZV90OworCisvKioKKyAqIFRoZSBDT05URU5UX1RZUEUgYXR0cmlidXRlIGRlc2NyaWJlcyAid2hhdCIgeW91IGFyZSBwbGF5aW5nLgorICogSXQgZXhwcmVzc2VzIHRoZSBnZW5lcmFsIGNhdGVnb3J5IG9mIHRoZSBjb250ZW50LiBUaGlzIGluZm9ybWF0aW9uIGlzIG9wdGlvbmFsLgorICogQnV0IGluIGNhc2UgaXQgaXMga25vd24gKGZvciBpbnN0YW5jZSB7QGxpbmsgI0FBVURJT19DT05URU5UX1RZUEVfTU9WSUV9IGZvciBhCisgKiBtb3ZpZSBzdHJlYW1pbmcgc2VydmljZSBvciB7QGxpbmsgI0FBVURJT19DT05URU5UX1RZUEVfU1BFRUNIfSBmb3IKKyAqIGFuIGF1ZGlvIGJvb2sgYXBwbGljYXRpb24pIHRoaXMgaW5mb3JtYXRpb24gbWlnaHQgYmUgdXNlZCBieSB0aGUgYXVkaW8gZnJhbWV3b3JrIHRvCisgKiBlbmZvcmNlIGF1ZGlvIGZvY3VzLgorICoKKyAqIE5vdGUgdGhhdCB0aGVzZSBtYXRjaCB0aGUgZXF1aXZhbGVudCB2YWx1ZXMgaW4gQXVkaW9BdHRyaWJ1dGVzIGluIHRoZSBBbmRyb2lkIEphdmEgQVBJLgorICoKKyAqIEFkZGVkIGluIEFQSSBsZXZlbCAyOC4KKyAqLworZW51bSB7CisKKyAgICAvKioKKyAgICAgKiBVc2UgdGhpcyBmb3Igc3Bva2VuIHZvaWNlLCBhdWRpbyBib29rcywgZXRjZXRlcmEuCisgICAgICovCisgICAgQUFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0ggPSAxLAorCisgICAgLyoqCisgICAgICogVXNlIHRoaXMgZm9yIHByZS1yZWNvcmRlZCBvciBsaXZlIG11c2ljLgorICAgICAqLworICAgIEFBVURJT19DT05URU5UX1RZUEVfTVVTSUMgPSAyLAorCisgICAgLyoqCisgICAgICogVXNlIHRoaXMgZm9yIGEgbW92aWUgb3IgdmlkZW8gc291bmR0cmFjay4KKyAgICAgKi8KKyAgICBBQVVESU9fQ09OVEVOVF9UWVBFX01PVklFID0gMywKKworICAgIC8qKgorICAgICAqIFVzZSB0aGlzIGZvciBzb3VuZCBpcyBkZXNpZ25lZCB0byBhY2NvbXBhbnkgYSB1c2VyIGFjdGlvbiwKKyAgICAgKiBzdWNoIGFzIGEgY2xpY2sgb3IgYmVlcCBzb3VuZCBtYWRlIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyBhIGJ1dHRvbi4KKyAgICAgKi8KKyAgICBBQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTiA9IDQKK307Cit0eXBlZGVmIGludDMyX3QgYWF1ZGlvX2NvbnRlbnRfdHlwZV90OworCisvKioKKyAqIERlZmluZXMgdGhlIGF1ZGlvIHNvdXJjZS4KKyAqIEFuIGF1ZGlvIHNvdXJjZSBkZWZpbmVzIGJvdGggYSBkZWZhdWx0IHBoeXNpY2FsIHNvdXJjZSBvZiBhdWRpbyBzaWduYWwsIGFuZCBhIHJlY29yZGluZworICogY29uZmlndXJhdGlvbi4KKyAqCisgKiBOb3RlIHRoYXQgdGhlc2UgbWF0Y2ggdGhlIGVxdWl2YWxlbnQgdmFsdWVzIGluIE1lZGlhUmVjb3JkZXIuQXVkaW9Tb3VyY2UgaW4gdGhlIEFuZHJvaWQgSmF2YSBBUEkuCisgKgorICogQWRkZWQgaW4gQVBJIGxldmVsIDI4LgorICovCitlbnVtIHsKKyAgICAvKioKKyAgICAgKiBVc2UgdGhpcyBwcmVzZXQgd2hlbiBvdGhlciBwcmVzZXRzIGRvIG5vdCBhcHBseS4KKyAgICAgKi8KKyAgICBBQVVESU9fSU5QVVRfUFJFU0VUX0dFTkVSSUMgPSAxLAorCisgICAgLyoqCisgICAgICogVXNlIHRoaXMgcHJlc2V0IHdoZW4gcmVjb3JkaW5nIHZpZGVvLgorICAgICAqLworICAgIEFBVURJT19JTlBVVF9QUkVTRVRfQ0FNQ09SREVSID0gNSwKKworICAgIC8qKgorICAgICAqIFVzZSB0aGlzIHByZXNldCB3aGVuIGRvaW5nIHNwZWVjaCByZWNvZ25pdGlvbi4KKyAgICAgKi8KKyAgICBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1JFQ09HTklUSU9OID0gNiwKKworICAgIC8qKgorICAgICAqIFVzZSB0aGlzIHByZXNldCB3aGVuIGRvaW5nIHRlbGVwaG9ueSBvciB2b2ljZSBtZXNzYWdpbmcuCisgICAgICovCisgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9DT01NVU5JQ0FUSU9OID0gNywKKworICAgIC8qKgorICAgICAqIFVzZSB0aGlzIHByZXNldCB0byBvYnRhaW4gYW4gaW5wdXQgd2l0aCBubyBlZmZlY3RzLgorICAgICAqIE5vdGUgdGhhdCB0aGlzIGlucHV0IHdpbGwgbm90IGhhdmUgYXV0b21hdGljIGdhaW4gY29udHJvbAorICAgICAqIHNvIHRoZSByZWNvcmRlZCB2b2x1bWUgbWF5IGJlIHZlcnkgbG93LgorICAgICAqLworICAgIEFBVURJT19JTlBVVF9QUkVTRVRfVU5QUk9DRVNTRUQgPSA5LAorfTsKK3R5cGVkZWYgaW50MzJfdCBhYXVkaW9faW5wdXRfcHJlc2V0X3Q7CisKK2VudW0geworICAgIC8qKgorICAgICAqIERvIG5vdCBhbGxvY2F0ZSBhIHNlc3Npb24gSUQuCisgICAgICogRWZmZWN0cyBjYW5ub3QgYmUgdXNlZCB3aXRoIHRoaXMgc3RyZWFtLgorICAgICAqIERlZmF1bHQuCisgICAgICoKKyAgICAgKiBBZGRlZCBpbiBBUEkgbGV2ZWwgMjguCisgICAgICovCisgICAgQUFVRElPX1NFU1NJT05fSURfTk9ORSA9IC0xLAorCisgICAgLyoqCisgICAgICogQWxsb2NhdGUgYSBzZXNzaW9uIElEIHRoYXQgY2FuIGJlIHVzZWQgdG8gYXR0YWNoIGFuZCBjb250cm9sCisgICAgICogZWZmZWN0cyB1c2luZyB0aGUgSmF2YSBBdWRpb0VmZmVjdHMgQVBJLgorICAgICAqIE5vdGUgdGhhdCB0aGUgdXNlIG9mIHRoaXMgZmxhZyBtYXkgcmVzdWx0IGluIGhpZ2hlciBsYXRlbmN5LgorICAgICAqCisgICAgICogTm90ZSB0aGF0IHRoaXMgbWF0Y2hlcyB0aGUgdmFsdWUgb2YgQXVkaW9NYW5hZ2VyLkFVRElPX1NFU1NJT05fSURfR0VORVJBVEUuCisgICAgICoKKyAgICAgKiBBZGRlZCBpbiBBUEkgbGV2ZWwgMjguCisgICAgICovCisgICAgQUFVRElPX1NFU1NJT05fSURfQUxMT0NBVEUgPSAwLAorfTsKK3R5cGVkZWYgaW50MzJfdCBhYXVkaW9fc2Vzc2lvbl9pZF90OworCiB0eXBlZGVmIHN0cnVjdCBBQXVkaW9TdHJlYW1TdHJ1Y3QgICAgICAgICBBQXVkaW9TdHJlYW07CiB0eXBlZGVmIHN0cnVjdCBBQXVkaW9TdHJlYW1CdWlsZGVyU3RydWN0ICBBQXVkaW9TdHJlYW1CdWlsZGVyOwogCkBAIC0zMDgsNiArNDgzLDg4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IG1vZGUpOwogCiAvKioKKyAqIFNldCB0aGUgaW50ZW5kZWQgdXNlIGNhc2UgZm9yIHRoZSBzdHJlYW0uCisgKgorICogVGhlIEFBdWRpbyBzeXN0ZW0gd2lsbCB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBvcHRpbWl6ZSB0aGUKKyAqIGJlaGF2aW9yIG9mIHRoZSBzdHJlYW0uCisgKiBUaGlzIGNvdWxkLCBmb3IgZXhhbXBsZSwgYWZmZWN0IGhvdyB2b2x1bWUgYW5kIGZvY3VzIGlzIGhhbmRsZWQgZm9yIHRoZSBzdHJlYW0uCisgKgorICogVGhlIGRlZmF1bHQsIGlmIHlvdSBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLCBpcyBBQVVESU9fVVNBR0VfTUVESUEuCisgKgorICogQWRkZWQgaW4gQVBJIGxldmVsIDI4LgorICoKKyAqIEBwYXJhbSBidWlsZGVyIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigpCisgKiBAcGFyYW0gdXNhZ2UgdGhlIGRlc2lyZWQgdXNhZ2UsIGVnLiBBQVVESU9fVVNBR0VfR0FNRQorICovCitBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRVc2FnZShBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb191c2FnZV90IHVzYWdlKTsKKworLyoqCisgKiBTZXQgdGhlIHR5cGUgb2YgYXVkaW8gZGF0YSB0aGF0IHRoZSBzdHJlYW0gd2lsbCBjYXJyeS4KKyAqCisgKiBUaGUgQUF1ZGlvIHN5c3RlbSB3aWxsIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIG9wdGltaXplIHRoZQorICogYmVoYXZpb3Igb2YgdGhlIHN0cmVhbS4KKyAqIFRoaXMgY291bGQsIGZvciBleGFtcGxlLCBhZmZlY3Qgd2hldGhlciBhIHN0cmVhbSBpcyBwYXVzZWQgd2hlbiBhIG5vdGlmaWNhdGlvbiBvY2N1cnMuCisgKgorICogVGhlIGRlZmF1bHQsIGlmIHlvdSBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLCBpcyBBQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLgorICoKKyAqIEFkZGVkIGluIEFQSSBsZXZlbCAyOC4KKyAqCisgKiBAcGFyYW0gYnVpbGRlciByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoKQorICogQHBhcmFtIGNvbnRlbnRUeXBlIHRoZSB0eXBlIG9mIGF1ZGlvIGRhdGEsIGVnLiBBQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSAorICovCitBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDb250ZW50VHlwZShBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2NvbnRlbnRfdHlwZV90IGNvbnRlbnRUeXBlKTsKKworLyoqCisgKiBTZXQgdGhlIGlucHV0IChjYXB0dXJlKSBwcmVzZXQgZm9yIHRoZSBzdHJlYW0uCisgKgorICogVGhlIEFBdWRpbyBzeXN0ZW0gd2lsbCB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBvcHRpbWl6ZSB0aGUKKyAqIGJlaGF2aW9yIG9mIHRoZSBzdHJlYW0uCisgKiBUaGlzIGNvdWxkLCBmb3IgZXhhbXBsZSwgYWZmZWN0IHdoaWNoIG1pY3JvcGhvbmVzIGFyZSB1c2VkIGFuZCBob3cgdGhlCisgKiByZWNvcmRlZCBkYXRhIGlzIHByb2Nlc3NlZC4KKyAqCisgKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUkVDT0dOSVRJT04uCisgKiBUaGF0IGlzIGJlY2F1c2UgVk9JQ0VfUkVDT0dOSVRJT04gaXMgdGhlIHByZXNldCB3aXRoIHRoZSBsb3dlc3QgbGF0ZW5jeQorICogb24gbWFueSBwbGF0Zm9ybXMuCisgKgorICogQWRkZWQgaW4gQVBJIGxldmVsIDI4LgorICoKKyAqIEBwYXJhbSBidWlsZGVyIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigpCisgKiBAcGFyYW0gaW5wdXRQcmVzZXQgdGhlIGRlc2lyZWQgY29uZmlndXJhdGlvbiBmb3IgcmVjb3JkaW5nCisgKi8KK0FBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldElucHV0UHJlc2V0KEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9faW5wdXRfcHJlc2V0X3QgaW5wdXRQcmVzZXQpOworCisvKiogU2V0IHRoZSByZXF1ZXN0ZWQgc2Vzc2lvbiBJRC4KKyAqCisgKiBUaGUgc2Vzc2lvbiBJRCBjYW4gYmUgdXNlZCB0byBhc3NvY2lhdGUgYSBzdHJlYW0gd2l0aCBlZmZlY3RzIHByb2Nlc3NvcnMuCisgKiBUaGUgZWZmZWN0cyBhcmUgY29udHJvbGxlZCB1c2luZyB0aGUgQW5kcm9pZCBBdWRpb0VmZmVjdCBKYXZhIEFQSS4KKyAqCisgKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIEFBVURJT19TRVNTSU9OX0lEX05PTkUuCisgKgorICogSWYgc2V0IHRvIEFBVURJT19TRVNTSU9OX0lEX0FMTE9DQVRFIHRoZW4gYSBzZXNzaW9uIElEIHdpbGwgYmUgYWxsb2NhdGVkCisgKiB3aGVuIHRoZSBzdHJlYW0gaXMgb3BlbmVkLgorICoKKyAqIFRoZSBhbGxvY2F0ZWQgc2Vzc2lvbiBJRCBjYW4gYmUgb2J0YWluZWQgYnkgY2FsbGluZyBBQXVkaW9TdHJlYW1fZ2V0U2Vzc2lvbklkKCkKKyAqIGFuZCB0aGVuIHVzZWQgd2l0aCB0aGlzIGZ1bmN0aW9uIHdoZW4gb3BlbmluZyBhbm90aGVyIHN0cmVhbS4KKyAqIFRoaXMgYWxsb3dzIGVmZmVjdHMgdG8gYmUgc2hhcmVkIGJldHdlZW4gc3RyZWFtcy4KKyAqCisgKiBTZXNzaW9uIElEcyBmcm9tIEFBdWRpbyBjYW4gYmUgdXNlZCB0aGUgQW5kcm9pZCBKYXZhIEFQSXMgYW5kIHZpY2UgdmVyc2EuCisgKiBTbyBhIHNlc3Npb24gSUQgZnJvbSBhbiBBQXVkaW8gc3RyZWFtIGNhbiBiZSBwYXNzZWQgdG8gSmF2YQorICogYW5kIGVmZmVjdHMgYXBwbGllZCB1c2luZyB0aGUgSmF2YSBBdWRpb0VmZmVjdCBBUEkuCisgKgorICogQWxsb2NhdGVkIHNlc3Npb24gSURzIHdpbGwgYWx3YXlzIGJlIHBvc2l0aXZlIGFuZCBub256ZXJvLgorICoKKyAqIEFkZGVkIGluIEFQSSBsZXZlbCAyOC4KKyAqCisgKiBAcGFyYW0gYnVpbGRlciByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoKQorICogQHBhcmFtIHNlc3Npb25JZCBhbiBhbGxvY2F0ZWQgc2Vzc2lvbklEIG9yIEFBVURJT19TRVNTSU9OX0lEX0FMTE9DQVRFCisgKi8KK0FBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNlc3Npb25JZChBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3Nlc3Npb25faWRfdCBzZXNzaW9uSWQpOworCisvKioKICAqIFJldHVybiBvbmUgb2YgdGhlc2UgdmFsdWVzIGZyb20gdGhlIGRhdGEgY2FsbGJhY2sgZnVuY3Rpb24uCiAgKi8KIGVudW0gewpAQCAtMzM3LDcgKzU5NCwxMyBAQAogICogRm9yIGFuIGlucHV0IHN0cmVhbSwgdGhpcyBmdW5jdGlvbiBzaG91bGQgcmVhZCBhbmQgcHJvY2VzcyBudW1GcmFtZXMgb2YgZGF0YQogICogZnJvbSB0aGUgYXVkaW9EYXRhIGJ1ZmZlci4KICAqCi0gKiBOb3RlIHRoYXQgdGhpcyBjYWxsYmFjayBmdW5jdGlvbiBzaG91bGQgYmUgY29uc2lkZXJlZCBhICJyZWFsLXRpbWUiIGZ1bmN0aW9uLgorICogVGhlIGF1ZGlvIGRhdGEgaXMgcGFzc2VkIHRocm91Z2ggdGhlIGJ1ZmZlci4gU28gZG8gTk9UIGNhbGwgQUF1ZGlvU3RyZWFtX3JlYWQoKSBvcgorICogQUF1ZGlvU3RyZWFtX3dyaXRlKCkgb24gdGhlIHN0cmVhbSB0aGF0IGlzIG1ha2luZyB0aGUgY2FsbGJhY2suCisgKgorICogTm90ZSB0aGF0IG51bUZyYW1lcyBjYW4gdmFyeSB1bmxlc3MgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soKQorICogaXMgY2FsbGVkLgorICoKKyAqIEFsc28gbm90ZSB0aGF0IHRoaXMgY2FsbGJhY2sgZnVuY3Rpb24gc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSAicmVhbC10aW1lIiBmdW5jdGlvbi4KICAqIEl0IG11c3Qgbm90IGRvIGFueXRoaW5nIHRoYXQgY291bGQgY2F1c2UgYW4gdW5ib3VuZGVkIGRlbGF5IGJlY2F1c2UgdGhhdCBjYW4gY2F1c2UgdGhlCiAgKiBhdWRpbyB0byBnbGl0Y2ggb3IgcG9wLgogICoKQEAgLTM0OCw2ICs2MTEsNyBAQAogICogPGxpPmFueSBuZXR3b3JrIG9wZXJhdGlvbnMgc3VjaCBhcyBzdHJlYW1pbmc8L2xpPgogICogPGxpPnVzZSBhbnkgbXV0ZXhlcyBvciBvdGhlciBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczwvbGk+CiAgKiA8bGk+c2xlZXA8L2xpPgorICogPGxpPnN0b3Agb3IgY2xvc2UgdGhlIHN0cmVhbTwvbGk+CiAgKiA8L3VsPgogICoKICAqIElmIHlvdSBuZWVkIHRvIG1vdmUgZGF0YSwgZWcuIE1JREkgY29tbWFuZHMsIGluIG9yIG91dCBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdGhlbgpAQCAtMzU2LDcgKzYyMCw3IEBACiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICogQHBhcmFtIHVzZXJEYXRhIHRoZSBzYW1lIGFkZHJlc3MgdGhhdCB3YXMgcGFzc2VkIHRvIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q2FsbGJhY2soKQogICogQHBhcmFtIGF1ZGlvRGF0YSBhIHBvaW50ZXIgdG8gdGhlIGF1ZGlvIGRhdGEKLSAqIEBwYXJhbSBudW1GcmFtZXMgdGhlIG51bWJlciBvZiBmcmFtZXMgdG8gYmUgcHJvY2Vzc2VkCisgKiBAcGFyYW0gbnVtRnJhbWVzIHRoZSBudW1iZXIgb2YgZnJhbWVzIHRvIGJlIHByb2Nlc3NlZCwgd2hpY2ggY2FuIHZhcnkKICAqIEByZXR1cm4gQUFVRElPX0NBTExCQUNLX1JFU1VMVF8qCiAgKi8KIHR5cGVkZWYgYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgKCpBQXVkaW9TdHJlYW1fZGF0YUNhbGxiYWNrKSgKQEAgLTQzMSwxOCArNjk1LDE5IEBACiAgICAgICAgIGFhdWRpb19yZXN1bHRfdCBlcnJvcik7CiAKIC8qKgotICogUmVxdWVzdCB0aGF0IEFBdWRpbyBjYWxsIHRoaXMgZnVuY3Rpb25zIGlmIGFueSBlcnJvciBvY2N1cnMgb24gYSBjYWxsYmFjayB0aHJlYWQuCisgKiBSZXF1ZXN0IHRoYXQgQUF1ZGlvIGNhbGwgdGhpcyBmdW5jdGlvbiBpZiBhbnkgZXJyb3Igb2NjdXJzIG9yIHRoZSBzdHJlYW0gaXMgZGlzY29ubmVjdGVkLgogICoKICAqIEl0IHdpbGwgYmUgY2FsbGVkLCBmb3IgZXhhbXBsZSwgaWYgYSBoZWFkc2V0IG9yIGEgVVNCIGRldmljZSBpcyB1bnBsdWdnZWQgY2F1c2luZyB0aGUgc3RyZWFtJ3MKLSAqIGRldmljZSB0byBiZSB1bmF2YWlsYWJsZS4KLSAqIEluIHJlc3BvbnNlLCB0aGlzIGZ1bmN0aW9uIGNvdWxkIHNpZ25hbCBvciBsYXVuY2ggYW5vdGhlciB0aHJlYWQgdG8gcmVvcGVuIGEKLSAqIHN0cmVhbSBvbiBhbm90aGVyIGRldmljZS4gRG8gbm90IHJlb3BlbiB0aGUgc3RyZWFtIGluIHRoaXMgY2FsbGJhY2suCi0gKgotICogVGhpcyB3aWxsIG5vdCBiZSBjYWxsZWQgYmVjYXVzZSBvZiBhY3Rpb25zIGJ5IHRoZSBhcHBsaWNhdGlvbiwgc3VjaCBhcyBzdG9wcGluZwotICogb3IgY2xvc2luZyBhIHN0cmVhbS4KLSAqCisgKiBkZXZpY2UgdG8gYmUgdW5hdmFpbGFibGUgb3IgImRpc2Nvbm5lY3RlZCIuCiAgKiBBbm90aGVyIHBvc3NpYmxlIGNhdXNlIG9mIGVycm9yIHdvdWxkIGJlIGEgdGltZW91dCBvciBhbiB1bmFudGljaXBhdGVkIGludGVybmFsIGVycm9yLgogICoKKyAqIEluIHJlc3BvbnNlLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBzaWduYWwgb3IgY3JlYXRlIGFub3RoZXIgdGhyZWFkIHRvIHN0b3AKKyAqIGFuZCBjbG9zZSB0aGlzIHN0cmVhbS4gVGhlIG90aGVyIHRocmVhZCBjb3VsZCB0aGVuIHJlb3BlbiBhIHN0cmVhbSBvbiBhbm90aGVyIGRldmljZS4KKyAqIERvIG5vdCBzdG9wIG9yIGNsb3NlIHRoZSBzdHJlYW0sIG9yIHJlb3BlbiB0aGUgbmV3IHN0cmVhbSwgZGlyZWN0bHkgZnJvbSB0aGlzIGNhbGxiYWNrLgorICoKKyAqIFRoaXMgY2FsbGJhY2sgd2lsbCBub3QgYmUgY2FsbGVkIGJlY2F1c2Ugb2YgYWN0aW9ucyBieSB0aGUgYXBwbGljYXRpb24sIHN1Y2ggYXMgc3RvcHBpbmcKKyAqIG9yIGNsb3NpbmcgYSBzdHJlYW0uCisgKgogICogTm90ZSB0aGF0IHRoZSBBQXVkaW8gY2FsbGJhY2tzIHdpbGwgbmV2ZXIgYmUgY2FsbGVkIHNpbXVsdGFuZW91c2x5IGZyb20gbXVsdGlwbGUgdGhyZWFkcy4KICAqCiAgKiBAcGFyYW0gYnVpbGRlciByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoKQpAQCAtNTU0LDExICs4MTksMTMgQEAKICAqIFRoaXMgd2lsbCB1cGRhdGUgdGhlIGN1cnJlbnQgY2xpZW50IHN0YXRlLgogICoKICAqIDxwcmU+PGNvZGU+Ci0gKiBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgY3VycmVudFN0YXRlOwotICogYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9nZXRTdGF0ZShzdHJlYW0sICZjdXJyZW50U3RhdGUpOwotICogd2hpbGUgKHJlc3VsdCA9PSBBQVVESU9fT0sgJiYgY3VycmVudFN0YXRlICE9IEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0lORykgeworICogYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKKyAqIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBjdXJyZW50U3RhdGUgPSBBQXVkaW9TdHJlYW1fZ2V0U3RhdGUoc3RyZWFtKTsKKyAqIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBpbnB1dFN0YXRlID0gY3VycmVudFN0YXRlOworICogd2hpbGUgKHJlc3VsdCA9PSBBQVVESU9fT0sgJiYgY3VycmVudFN0YXRlICE9IEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VEKSB7CiAgKiAgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3dhaXRGb3JTdGF0ZUNoYW5nZSgKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIGN1cnJlbnRTdGF0ZSwgJmN1cnJlbnRTdGF0ZSwgTVlfVElNRU9VVF9OQU5PUyk7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCBpbnB1dFN0YXRlLCAmY3VycmVudFN0YXRlLCBNWV9USU1FT1VUX05BTk9TKTsKKyAqICAgICBpbnB1dFN0YXRlID0gY3VycmVudFN0YXRlOwogICogfQogICogPC9jb2RlPjwvcHJlPgogICoKQEAgLTY4MywxMCArOTUwLDEwIEBACiAgKiBUaGlzIGNhbGwgY2FuIGJlIHVzZWQgaWYgdGhlIGFwcGxpY2F0aW9uIG5lZWRzIHRvIGtub3cgdGhlIHZhbHVlIG9mIG51bUZyYW1lcyBiZWZvcmUKICAqIHRoZSBzdHJlYW0gaXMgc3RhcnRlZC4gVGhpcyBpcyBub3Qgbm9ybWFsbHkgbmVjZXNzYXJ5LgogICoKLSAqIElmIGEgc3BlY2lmaWMgc2l6ZSB3YXMgcmVxdWVzdGVkIGJ5IGNhbGxpbmcgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDYWxsYmFja1NpemVJbkZyYW1lcygpCisgKiBJZiBhIHNwZWNpZmljIHNpemUgd2FzIHJlcXVlc3RlZCBieSBjYWxsaW5nIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RnJhbWVzUGVyRGF0YUNhbGxiYWNrKCkKICAqIHRoZW4gdGhpcyB3aWxsIGJlIHRoZSBzYW1lIHNpemUuCiAgKgotICogSWYgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDYWxsYmFja1NpemVJbkZyYW1lcygpIHdhcyBub3QgY2FsbGVkIHRoZW4gdGhpcyB3aWxsCisgKiBJZiBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEZyYW1lc1BlckRhdGFDYWxsYmFjaygpIHdhcyBub3QgY2FsbGVkIHRoZW4gdGhpcyB3aWxsCiAgKiByZXR1cm4gdGhlIHNpemUgY2hvc2VuIGJ5IEFBdWRpbywgb3IgQUFVRElPX1VOU1BFQ0lGSUVELgogICoKICAqIEFBVURJT19VTlNQRUNJRklFRCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2FsbGJhY2sgYnVmZmVyIHNpemUgZm9yIHRoaXMgc3RyZWFtCkBAIC03OTQsNiArMTA2MSwzMCBAQAogQUFVRElPX0FQSSBpbnQ2NF90IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKEFBdWRpb1N0cmVhbSogc3RyZWFtKTsKIAogLyoqCisgKiBQYXNzZXMgYmFjayB0aGUgc2Vzc2lvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdHJlYW0uCisgKgorICogVGhlIHNlc3Npb24gSUQgY2FuIGJlIHVzZWQgdG8gYXNzb2NpYXRlIGEgc3RyZWFtIHdpdGggZWZmZWN0cyBwcm9jZXNzb3JzLgorICogVGhlIGVmZmVjdHMgYXJlIGNvbnRyb2xsZWQgdXNpbmcgdGhlIEFuZHJvaWQgQXVkaW9FZmZlY3QgSmF2YSBBUEkuCisgKgorICogSWYgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTZXNzaW9uSWQoKSB3YXMgY2FsbGVkIHdpdGggQUFVRElPX1NFU1NJT05fSURfQUxMT0NBVEUKKyAqIHRoZW4gYSBuZXcgc2Vzc2lvbiBJRCBzaG91bGQgYmUgYWxsb2NhdGVkIG9uY2Ugd2hlbiB0aGUgc3RyZWFtIGlzIG9wZW5lZC4KKyAqCisgKiBJZiBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNlc3Npb25JZCgpIHdhcyBjYWxsZWQgd2l0aCBhIHByZXZpb3VzbHkgYWxsb2NhdGVkCisgKiBzZXNzaW9uIElEIHRoZW4gdGhhdCB2YWx1ZSBzaG91bGQgYmUgcmV0dXJuZWQuCisgKgorICogSWYgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTZXNzaW9uSWQoKSB3YXMgbm90IGNhbGxlZCB0aGVuIHRoaXMgZnVuY3Rpb24gc2hvdWxkCisgKiByZXR1cm4gQUFVRElPX1NFU1NJT05fSURfTk9ORS4KKyAqCisgKiBUaGUgc2Vzc2lvbklEIGZvciBhIHN0cmVhbSBzaG91bGQgbm90IGNoYW5nZSBvbmNlIHRoZSBzdHJlYW0gaGFzIGJlZW4gb3BlbmVkLgorICoKKyAqIEFkZGVkIGluIEFQSSBsZXZlbCAyOC4KKyAqCisgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQorICogQHJldHVybiBzZXNzaW9uIElEIG9yIEFBVURJT19TRVNTSU9OX0lEX05PTkUKKyAqLworQUFVRElPX0FQSSBhYXVkaW9fc2Vzc2lvbl9pZF90IEFBdWRpb1N0cmVhbV9nZXRTZXNzaW9uSWQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pOworCisvKioKICAqIFBhc3NlcyBiYWNrIHRoZSB0aW1lIGF0IHdoaWNoIGEgcGFydGljdWxhciBmcmFtZSB3YXMgcHJlc2VudGVkLgogICogVGhpcyBjYW4gYmUgdXNlZCB0byBzeW5jaHJvbml6ZSBhdWRpbyB3aXRoIHZpZGVvIG9yIE1JREkuCiAgKiBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFsaWduIGEgcmVjb3JkZWQgc3RyZWFtIHdpdGggYSBwbGF5YmFjayBzdHJlYW0uCkBAIC04MjAsNiArMTExMSwzNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpmcmFtZVBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3NlY29uZHMpOwogCisvKioKKyAqIFJldHVybiB0aGUgdXNlIGNhc2UgZm9yIHRoZSBzdHJlYW0uCisgKgorICogQWRkZWQgaW4gQVBJIGxldmVsIDI4LgorICoKKyAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCisgKiBAcmV0dXJuIGZyYW1lcyByZWFkCisgKi8KK0FBVURJT19BUEkgYWF1ZGlvX3VzYWdlX3QgQUF1ZGlvU3RyZWFtX2dldFVzYWdlKEFBdWRpb1N0cmVhbSogc3RyZWFtKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIGNvbnRlbnQgdHlwZSBmb3IgdGhlIHN0cmVhbS4KKyAqCisgKiBBZGRlZCBpbiBBUEkgbGV2ZWwgMjguCisgKgorICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKKyAqIEByZXR1cm4gY29udGVudCB0eXBlLCBmb3IgZXhhbXBsZSBBQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDCisgKi8KK0FBVURJT19BUEkgYWF1ZGlvX2NvbnRlbnRfdHlwZV90IEFBdWRpb1N0cmVhbV9nZXRDb250ZW50VHlwZShBQXVkaW9TdHJlYW0qIHN0cmVhbSk7CisKKy8qKgorICogUmV0dXJuIHRoZSBpbnB1dCBwcmVzZXQgZm9yIHRoZSBzdHJlYW0uCisgKgorICogQWRkZWQgaW4gQVBJIGxldmVsIDI4LgorICoKKyAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCisgKiBAcmV0dXJuIGlucHV0IHByZXNldCwgZm9yIGV4YW1wbGUgQUFVRElPX0lOUFVUX1BSRVNFVF9DQU1DT1JERVIKKyAqLworQUFVRElPX0FQSSBhYXVkaW9faW5wdXRfcHJlc2V0X3QgQUF1ZGlvU3RyZWFtX2dldElucHV0UHJlc2V0KEFBdWRpb1N0cmVhbSogc3RyZWFtKTsKKwogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9saWJhYXVkaW8ubWFwLnR4dCBiL21lZGlhL2xpYmFhdWRpby9saWJhYXVkaW8ubWFwLnR4dAppbmRleCAyYmE1MjUwLi5jYmY1OTIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vbGliYWF1ZGlvLm1hcC50eHQKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2xpYmFhdWRpby5tYXAudHh0CkBAIC0xNyw2ICsxNywxMCBAQAogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2hhcmluZ01vZGU7CiAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREaXJlY3Rpb247CiAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0VXNhZ2U7ICAgICAgICMgaW50cm9kdWNlZD0yOAorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q29udGVudFR5cGU7ICMgaW50cm9kdWNlZD0yOAorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0SW5wdXRQcmVzZXQ7ICMgaW50cm9kdWNlZD0yOAorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2Vzc2lvbklkOyAgICMgaW50cm9kdWNlZD0yOAogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbTsKICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZTsKICAgICBBQXVkaW9TdHJlYW1fY2xvc2U7CkBAIC00Miw4ICs0NiwxMiBAQAogICAgIEFBdWRpb1N0cmVhbV9nZXRGb3JtYXQ7CiAgICAgQUF1ZGlvU3RyZWFtX2dldFNoYXJpbmdNb2RlOwogICAgIEFBdWRpb1N0cmVhbV9nZXREaXJlY3Rpb247CisgICAgQUF1ZGlvU3RyZWFtX2dldFVzYWdlOyAgICAgICAjIGludHJvZHVjZWQ9MjgKKyAgICBBQXVkaW9TdHJlYW1fZ2V0Q29udGVudFR5cGU7ICMgaW50cm9kdWNlZD0yOAorICAgIEFBdWRpb1N0cmVhbV9nZXRJbnB1dFByZXNldDsgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW47CiAgICAgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQ7CisgICAgQUF1ZGlvU3RyZWFtX2dldFNlc3Npb25JZDsgICAjIGludHJvZHVjZWQ9MjgKICAgICBBQXVkaW9TdHJlYW1fZ2V0VGltZXN0YW1wOwogICAgIEFBdWRpb1N0cmVhbV9pc01NYXBVc2VkOwogICBsb2NhbDoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWUyOGEwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNjcgQEAKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJhYXVkaW8iLAorCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJiaW5kaW5nIiwKKyAgICAgICAgImNsaWVudCIsCisgICAgICAgICJjb3JlIiwKKyAgICAgICAgImZpZm8iLAorICAgICAgICAibGVnYWN5IiwKKyAgICAgICAgInV0aWxpdHkiLAorICAgIF0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCisgICAgaGVhZGVyX2xpYnM6IFsibGliYWF1ZGlvX2hlYWRlcnMiXSwKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbImxpYmFhdWRpb19oZWFkZXJzIl0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJjb3JlL0F1ZGlvU3RyZWFtLmNwcCIsCisgICAgICAgICJjb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5jcHAiLAorICAgICAgICAiY29yZS9BQXVkaW9BdWRpby5jcHAiLAorICAgICAgICAiY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcCIsCisgICAgICAgICJsZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuY3BwIiwKKyAgICAgICAgImxlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAiLAorICAgICAgICAibGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwIiwKKyAgICAgICAgInV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmNwcCIsCisgICAgICAgICJ1dGlsaXR5L0ZpeGVkQmxvY2tBZGFwdGVyLmNwcCIsCisgICAgICAgICJ1dGlsaXR5L0ZpeGVkQmxvY2tSZWFkZXIuY3BwIiwKKyAgICAgICAgInV0aWxpdHkvRml4ZWRCbG9ja1dyaXRlci5jcHAiLAorICAgICAgICAidXRpbGl0eS9MaW5lYXJSYW1wLmNwcCIsCisgICAgICAgICJmaWZvL0ZpZm9CdWZmZXIuY3BwIiwKKyAgICAgICAgImZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmNwcCIsCisgICAgICAgICJjbGllbnQvQXVkaW9FbmRwb2ludC5jcHAiLAorICAgICAgICAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuY3BwIiwKKyAgICAgICAgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAiLAorICAgICAgICAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcCIsCisgICAgICAgICJjbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmNwcCIsCisgICAgICAgICJiaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmNwcCIsCisgICAgICAgICJiaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5jcHAiLAorICAgICAgICAiYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmNwcCIsCisgICAgICAgICJiaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uY3BwIiwKKyAgICAgICAgImJpbmRpbmcvSUFBdWRpb0NsaWVudC5jcHAiLAorICAgICAgICAiYmluZGluZy9JQUF1ZGlvU2VydmljZS5jcHAiLAorICAgICAgICAiYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5jcHAiLAorICAgICAgICAiYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcCIsCisgICAgICAgICJiaW5kaW5nL1NoYXJlZFJlZ2lvblBhcmNlbGFibGUuY3BwIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisKKyAgICAgICAgLy8gQnkgZGVmYXVsdCwgYWxsIHN5bWJvbHMgYXJlIGhpZGRlbi4KKyAgICAgICAgLy8gIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAorICAgICAgICAvLyBBQVVESU9fQVBJIGlzIHVzZWQgdG8gZXhwbGljaXRseSBleHBvcnQgYSBmdW5jdGlvbiBvciBhIHZhcmlhYmxlIGFzIGEgdmlzaWJsZSBzeW1ib2wuCisgICAgICAgICItREFBVURJT19BUEk9X19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eShcImRlZmF1bHRcIikpKSIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmF1ZGlvbWFuYWdlciIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5tayBiL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg2MTI0OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT0gU1RBVElDIExJQlJBUlkgPT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVGhpcyBpcyBiZWluZyBidWlsdCBiZWNhdXNlIGl0IG1ha2UgQUF1ZGlvIHRlc3RpbmcgdmVyeSBlYXN5IHdpdGggYSBjb21wbGV0ZSBleGVjdXRhYmxlLgotIyBUT0RPIFJlbW92ZSB0aGlzIHRhcmdldCBsYXRlciwgd2hlbiBub3QgbmVlZGVkLgotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBsaWJhYXVkaW8KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxJQkFBVURJT19ESVIgOj0gJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvCi1MSUJBQVVESU9fU1JDX0RJUiA6PSAkKExJQkFBVURJT19ESVIpL3NyYwotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlIFwKLSAgICBzeXN0ZW0vY29yZS9iYXNlL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvbmF0aXZlL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZSBcCi0gICAgJChMT0NBTF9QQVRIKSBcCi0gICAgJChMT0NBTF9QQVRIKS9iaW5kaW5nIFwKLSAgICAkKExPQ0FMX1BBVEgpL2NsaWVudCBcCi0gICAgJChMT0NBTF9QQVRIKS9jb3JlIFwKLSAgICAkKExPQ0FMX1BBVEgpL2ZpZm8gXAotICAgICQoTE9DQUxfUEFUSCkvbGVnYWN5IFwKLSAgICAkKExPQ0FMX1BBVEgpL3V0aWxpdHkKLQotIyBJZiB5b3UgYWRkIGEgZmlsZSBoZXJlIHRoZW4gYWxzbyBhZGQgaXQgYmVsb3cgaW4gdGhlIFNIQVJFRCB0YXJnZXQKLUxPQ0FMX1NSQ19GSUxFUyA9IFwKLSAgICBjb3JlL0F1ZGlvU3RyZWFtLmNwcCBcCi0gICAgY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuY3BwIFwKLSAgICBjb3JlL0FBdWRpb0F1ZGlvLmNwcCBcCi0gICAgY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcCBcCi0gICAgbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmNwcCBcCi0gICAgbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcCBcCi0gICAgbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwIFwKLSAgICB1dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAgXAotICAgIHV0aWxpdHkvRml4ZWRCbG9ja0FkYXB0ZXIuY3BwIFwKLSAgICB1dGlsaXR5L0ZpeGVkQmxvY2tSZWFkZXIuY3BwIFwKLSAgICB1dGlsaXR5L0ZpeGVkQmxvY2tXcml0ZXIuY3BwIFwKLSAgICB1dGlsaXR5L0xpbmVhclJhbXAuY3BwIFwKLSAgICBmaWZvL0ZpZm9CdWZmZXIuY3BwIFwKLSAgICBmaWZvL0ZpZm9Db250cm9sbGVyQmFzZS5jcHAgXAotICAgIGNsaWVudC9BdWRpb0VuZHBvaW50LmNwcCBcCi0gICAgY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuY3BwIFwKLSAgICBjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwIFwKLSAgICBjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwIFwKLSAgICBjbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmNwcCBcCi0gICAgYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5jcHAgXAotICAgIGJpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmNwcCBcCi0gICAgYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmNwcCBcCi0gICAgYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmNwcCBcCi0gICAgYmluZGluZy9JQUF1ZGlvQ2xpZW50LmNwcCBcCi0gICAgYmluZGluZy9JQUF1ZGlvU2VydmljZS5jcHAgXAotICAgIGJpbmRpbmcvUmluZ0J1ZmZlclBhcmNlbGFibGUuY3BwIFwKLSAgICBiaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwIFwKLSAgICBiaW5kaW5nL1NoYXJlZFJlZ2lvblBhcmNlbGFibGUuY3BwCi0KLUxPQ0FMX0NGTEFHUyArPSAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVdhbGwgLVdlcnJvcgotCi0jIEJ5IGRlZmF1bHQsIGFsbCBzeW1ib2xzIGFyZSBoaWRkZW4uCi0jIExPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCi0jIEFBVURJT19BUEkgaXMgdXNlZCB0byBleHBsaWNpdGx5IGV4cG9ydCBhIGZ1bmN0aW9uIG9yIGEgdmFyaWFibGUgYXMgYSB2aXNpYmxlIHN5bWJvbC4KLUxPQ0FMX0NGTEFHUyArPSAtREFBVURJT19BUEk9J19fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpJwotCi1pbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT0gU0hBUkVEIExJQlJBUlkgPT09PT09PT09PT09PT09PT09PT09PT09PT0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gbGliYWF1ZGlvCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlIFwKLSAgICBzeXN0ZW0vY29yZS9iYXNlL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvbmF0aXZlL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotICAgICQoTE9DQUxfUEFUSCkgXAotICAgICQoTE9DQUxfUEFUSCkvYmluZGluZyBcCi0gICAgJChMT0NBTF9QQVRIKS9jbGllbnQgXAotICAgICQoTE9DQUxfUEFUSCkvY29yZSBcCi0gICAgJChMT0NBTF9QQVRIKS9maWZvIFwKLSAgICAkKExPQ0FMX1BBVEgpL2xlZ2FjeSBcCi0gICAgJChMT0NBTF9QQVRIKS91dGlsaXR5Ci0KLUxPQ0FMX1NSQ19GSUxFUyA9IGNvcmUvQXVkaW9TdHJlYW0uY3BwIFwKLSAgICBjb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5jcHAgXAotICAgIGNvcmUvQUF1ZGlvQXVkaW8uY3BwIFwKLSAgICBjb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuY3BwIFwKLSAgICBsZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuY3BwIFwKLSAgICBsZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwIFwKLSAgICBsZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAgXAotICAgIHV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmNwcCBcCi0gICAgdXRpbGl0eS9GaXhlZEJsb2NrQWRhcHRlci5jcHAgXAotICAgIHV0aWxpdHkvRml4ZWRCbG9ja1JlYWRlci5jcHAgXAotICAgIHV0aWxpdHkvRml4ZWRCbG9ja1dyaXRlci5jcHAgXAotICAgIHV0aWxpdHkvTGluZWFyUmFtcC5jcHAgXAotICAgIGZpZm8vRmlmb0J1ZmZlci5jcHAgXAotICAgIGZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmNwcCBcCi0gICAgY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwIFwKLSAgICBjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAgXAotICAgIGNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAgXAotICAgIGNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5jcHAgXAotICAgIGNsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuY3BwIFwKLSAgICBiaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmNwcCBcCi0gICAgYmluZGluZy9BQXVkaW9CaW5kZXJDbGllbnQuY3BwIFwKLSAgICBiaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuY3BwIFwKLSAgICBiaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uY3BwIFwKLSAgICBiaW5kaW5nL0lBQXVkaW9DbGllbnQuY3BwIFwKLSAgICBiaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmNwcCBcCi0gICAgYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5jcHAgXAotICAgIGJpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5jcHAgXAotICAgIGJpbmRpbmcvU2hhcmVkUmVnaW9uUGFyY2VsYWJsZS5jcHAKLQotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tdW51c2VkLXBhcmFtZXRlciAtV2FsbCAtV2Vycm9yCi0KLSMgQnkgZGVmYXVsdCwgYWxsIHN5bWJvbHMgYXJlIGhpZGRlbi4KLSMgTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KLSMgQUFVRElPX0FQSSBpcyB1c2VkIHRvIGV4cGxpY2l0bHkgZXhwb3J0IGEgZnVuY3Rpb24gb3IgYSB2YXJpYWJsZSBhcyBhIHZpc2libGUgc3ltYm9sLgotTE9DQUxfQ0ZMQUdTICs9IC1EQUFVRElPX0FQST0nX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSknCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYXVkaW9jbGllbnQgbGlibG9nIGxpYmN1dGlscyBsaWJ1dGlscyBsaWJiaW5kZXIgbGliYXVkaW9tYW5hZ2VyCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9CaW5kZXJDbGllbnQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5jcHAKaW5kZXggMDdlZTJkZS4uZGQ2MjBlMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5jcHAKQEAgLTE1LDcgKzE1LDcgQEAKICAqLwogCiAKLSNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvIgorI2RlZmluZSBMT0dfVEFHICJBQXVkaW9CaW5kZXJDbGllbnQiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKQEAgLTYxLDExICs2MSwxMSBAQAogICAgICAgICAsIFNpbmdsZXRvbjxBQXVkaW9CaW5kZXJDbGllbnQ+KCkgewogICAgIGdLZWVwQmluZGVyQ2xpZW50ID0gdGhpczsgLy8gc28gdGhpcyBzaW5nbGV0b24gd29uJ3QgZ2V0IGRlbGV0ZWQKICAgICBtQUF1ZGlvQ2xpZW50ID0gbmV3IEFBdWRpb0NsaWVudCh0aGlzKTsKLSAgICBBTE9HVigiQUF1ZGlvQmluZGVyQ2xpZW50KCkgdGhpcyA9ICVwLCBjcmVhdGVkIG1BQXVkaW9DbGllbnQgPSAlcCIsIHRoaXMsIG1BQXVkaW9DbGllbnQuZ2V0KCkpOworICAgIEFMT0dWKCIlcyAtIHRoaXMgPSAlcCwgY3JlYXRlZCBtQUF1ZGlvQ2xpZW50ID0gJXAiLCBfX2Z1bmNfXywgdGhpcywgbUFBdWRpb0NsaWVudC5nZXQoKSk7CiB9CiAKIEFBdWRpb0JpbmRlckNsaWVudDo6fkFBdWRpb0JpbmRlckNsaWVudCgpIHsKLSAgICBBTE9HVigiQUF1ZGlvQmluZGVyQ2xpZW50KCk6On5BQXVkaW9CaW5kZXJDbGllbnQoKSBkZXN0cm95aW5nICVwIiwgdGhpcyk7CisgICAgQUxPR1YoIiVzIC0gZGVzdHJveWluZyAlcCIsIF9fZnVuY19fLCB0aGlzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlcnZpY2VMb2NrKTsKICAgICBpZiAobUFBdWRpb1NlcnZpY2UgIT0gMCkgewogICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQUF1ZGlvU2VydmljZSktPnVubGlua1RvRGVhdGgobUFBdWRpb0NsaWVudCk7CkBAIC0xMzcsNyArMTM3LDcgQEAKICAgICAgICAgc3RyZWFtID0gc2VydmljZS0+b3BlblN0cmVhbShyZXF1ZXN0LCBjb25maWd1cmF0aW9uT3V0cHV0KTsKIAogICAgICAgICBpZiAoc3RyZWFtID09IEFBVURJT19FUlJPUl9OT19TRVJWSUNFKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQUF1ZGlvQmluZGVyQ2xpZW50OjpvcGVuU3RyZWFtIGxvc3QgY29ubmVjdGlvbiB0byBBQXVkaW9TZXJ2aWNlLiIpOworICAgICAgICAgICAgQUxPR0UoIm9wZW5TdHJlYW0gbG9zdCBjb25uZWN0aW9uIHRvIEFBdWRpb1NlcnZpY2UuIik7CiAgICAgICAgICAgICBkcm9wQUF1ZGlvU2VydmljZSgpOyAvLyBmb3JjZSBhIHJlY29ubmVjdAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU2VydmljZU1lc3NhZ2UuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TZXJ2aWNlTWVzc2FnZS5oCmluZGV4IDU0ZTgwMDEuLjM5ODE0NTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TZXJ2aWNlTWVzc2FnZS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TZXJ2aWNlTWVzc2FnZS5oCkBAIC0zNiwxNSArMzYsMTcgQEAKICAgICBBQVVESU9fU0VSVklDRV9FVkVOVF9QQVVTRUQsCiAgICAgQUFVRElPX1NFUlZJQ0VfRVZFTlRfU1RPUFBFRCwKICAgICBBQVVESU9fU0VSVklDRV9FVkVOVF9GTFVTSEVELAotICAgIEFBVURJT19TRVJWSUNFX0VWRU5UX0NMT1NFRCwKICAgICBBQVVESU9fU0VSVklDRV9FVkVOVF9ESVNDT05ORUNURUQsCi0gICAgQUFVRElPX1NFUlZJQ0VfRVZFTlRfVk9MVU1FCisgICAgQUFVRElPX1NFUlZJQ0VfRVZFTlRfVk9MVU1FLAorICAgIEFBVURJT19TRVJWSUNFX0VWRU5UX1hSVU4KIH0gYWF1ZGlvX3NlcnZpY2VfZXZlbnRfdDsKIAogc3RydWN0IEFBdWRpb01lc3NhZ2VFdmVudCB7CiAgICAgYWF1ZGlvX3NlcnZpY2VfZXZlbnRfdCBldmVudDsKLSAgICBkb3VibGUgICAgICAgICAgICAgICAgIGRhdGFEb3VibGU7Ci0gICAgaW50NjRfdCAgICAgICAgICAgICAgICBkYXRhTG9uZzsKKyAgICB1bmlvbiB7CisgICAgICAgIGRvdWJsZSAgZGF0YURvdWJsZTsKKyAgICAgICAgaW50NjRfdCBkYXRhTG9uZzsKKyAgICB9OwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgQUF1ZGlvU2VydmljZU1lc3NhZ2VfcyB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAKaW5kZXggMTUzZmNlMy4uOTU5ZGI2MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmNwcApAQCAtNTAsNiArNTAsMTQgQEAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihnZXRCdWZmZXJDYXBhY2l0eSgpKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOworICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMigoaW50MzJfdCkgZ2V0VXNhZ2UoKSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKKyAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoKGludDMyX3QpIGdldENvbnRlbnRUeXBlKCkpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CisgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KSBnZXRJbnB1dFByZXNldCgpKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOworICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihnZXRTZXNzaW9uSWQoKSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICByZXR1cm4gTk9fRVJST1I7CiBlcnJvcjoKICAgICBBTE9HRSgiQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi53cml0ZVRvUGFyY2VsKCk6IHdyaXRlIGZhaWxlZCA9ICVkIiwgc3RhdHVzKTsKQEAgLTY5LDE2ICs3NywyOCBAQAogICAgIHNldFNhbXBsZXNQZXJGcmFtZSh2YWx1ZSk7CiAgICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnZhbHVlKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIHNldFNoYXJpbmdNb2RlKHZhbHVlKTsKKyAgICBzZXRTaGFyaW5nTW9kZSgoYWF1ZGlvX3NoYXJpbmdfbW9kZV90KSB2YWx1ZSk7CiAgICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnZhbHVlKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIHNldEZvcm1hdCh2YWx1ZSk7CisgICAgc2V0Rm9ybWF0KChhYXVkaW9fZm9ybWF0X3QpIHZhbHVlKTsKICAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgc2V0RGlyZWN0aW9uKChhYXVkaW9fZGlyZWN0aW9uX3QpIHZhbHVlKTsKICAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgc2V0QnVmZmVyQ2FwYWNpdHkodmFsdWUpOworICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ2YWx1ZSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKKyAgICBzZXRVc2FnZSgoYWF1ZGlvX3VzYWdlX3QpIHZhbHVlKTsKKyAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CisgICAgc2V0Q29udGVudFR5cGUoKGFhdWRpb19jb250ZW50X3R5cGVfdCkgdmFsdWUpOworICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ2YWx1ZSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKKyAgICBzZXRJbnB1dFByZXNldCgoYWF1ZGlvX2lucHV0X3ByZXNldF90KSB2YWx1ZSk7CisgICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnZhbHVlKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOworICAgIHNldFNlc3Npb25JZCh2YWx1ZSk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogZXJyb3I6CiAgICAgQUxPR0UoIkFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24ucmVhZEZyb21QYXJjZWwoKTogcmVhZCBmYWlsZWQgPSAlZCIsIHN0YXR1cyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtUmVxdWVzdC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtUmVxdWVzdC5jcHAKaW5kZXggMTIwMGFiMi4uYzMwYzViOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmNwcApAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBMT0dfVEFHICJBQXVkaW8iCisjZGVmaW5lIExPR19UQUcgIkFBdWRpb1N0cmVhbVJlcXVlc3QiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKQEAgLTU4LDcgKzU4LDcgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiAKIGVycm9yOgotICAgIEFMT0dFKCJBQXVkaW9TdHJlYW1SZXF1ZXN0LndyaXRlVG9QYXJjZWwoKTogd3JpdGUgZmFpbGVkID0gJWQiLCBzdGF0dXMpOworICAgIEFMT0dFKCJ3cml0ZVRvUGFyY2VsKCk6IHdyaXRlIGZhaWxlZCA9ICVkIiwgc3RhdHVzKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCkBAIC04MCw3ICs4MCw3IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogCiBlcnJvcjoKLSAgICBBTE9HRSgiQUF1ZGlvU3RyZWFtUmVxdWVzdC5yZWFkRnJvbVBhcmNlbCgpOiByZWFkIGZhaWxlZCA9ICVkIiwgc3RhdHVzKTsKKyAgICBBTE9HRSgicmVhZEZyb21QYXJjZWwoKTogcmVhZCBmYWlsZWQgPSAlZCIsIHN0YXR1cyk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtODksOSArODksOSBAQAogfQogCiB2b2lkIEFBdWRpb1N0cmVhbVJlcXVlc3Q6OmR1bXAoKSBjb25zdCB7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbVJlcXVlc3QgbVVzZXJJZCAgICA9ICVkIiwgbVVzZXJJZCk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbVJlcXVlc3QgbVByb2Nlc3NJZCA9ICVkIiwgbVByb2Nlc3NJZCk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbVJlcXVlc3QgbVNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCA9ICVkIiwgbVNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbVJlcXVlc3QgbUluU2VydmljZSA9ICVkIiwgbUluU2VydmljZSk7CisgICAgQUxPR0QoIm1Vc2VySWQgICAgPSAlZCIsIG1Vc2VySWQpOworICAgIEFMT0dEKCJtUHJvY2Vzc0lkID0gJWQiLCBtUHJvY2Vzc0lkKTsKKyAgICBBTE9HRCgibVNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCA9ICVkIiwgbVNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCk7CisgICAgQUxPR0QoIm1JblNlcnZpY2UgPSAlZCIsIG1JblNlcnZpY2UpOwogICAgIG1Db25maWd1cmF0aW9uLmR1bXAoKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuY3BwCmluZGV4IDFhOTc1NTUuLjYxZDdkMjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmNwcApAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBMT0dfVEFHICJBQXVkaW8iCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCkBAIC02NCwyNyArNjQsNTQgQEAKICAqIFRoZSByZWFkIGFuZCB3cml0ZSBtdXN0IGJlIHN5bW1ldHJpYy4KICAqLwogc3RhdHVzX3QgQXVkaW9FbmRwb2ludFBhcmNlbGFibGU6OndyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKLSAgICBwYXJjZWwtPndyaXRlSW50MzIobU51bVNoYXJlZE1lbW9yaWVzKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyh2YWxpZGF0ZSgpKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOworCisgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKG1OdW1TaGFyZWRNZW1vcmllcyk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKKwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bVNoYXJlZE1lbW9yaWVzOyBpKyspIHsKLSAgICAgICAgbVNoYXJlZE1lbW9yaWVzW2ldLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgc3RhdHVzID0gbVNoYXJlZE1lbW9yaWVzW2ldLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICB9Ci0gICAgbVVwTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7Ci0gICAgbURvd25NZXNzYWdlUXVldWVQYXJjZWxhYmxlLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKLSAgICBtVXBEYXRhUXVldWVQYXJjZWxhYmxlLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKLSAgICBtRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUud3JpdGVUb1BhcmNlbChwYXJjZWwpOwotICAgIHJldHVybiBOT19FUlJPUjsgLy8gVE9ETyBjaGVjayBmb3IgZXJyb3JzIGFib3ZlCisgICAgc3RhdHVzID0gbVVwTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKKyAgICBzdGF0dXMgPSBtRG93bk1lc3NhZ2VRdWV1ZVBhcmNlbGFibGUud3JpdGVUb1BhcmNlbChwYXJjZWwpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CisgICAgc3RhdHVzID0gbVVwRGF0YVF1ZXVlUGFyY2VsYWJsZS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKKyAgICBzdGF0dXMgPSBtRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUud3JpdGVUb1BhcmNlbChwYXJjZWwpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CisKKyAgICByZXR1cm4gTk9fRVJST1I7CisKK2Vycm9yOgorICAgIEFMT0dFKCIlcyByZXR1cm5pbmcgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0dXNfdCBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZTo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIHsKLSAgICBwYXJjZWwtPnJlYWRJbnQzMigmbU51bVNoYXJlZE1lbW9yaWVzKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmbU51bVNoYXJlZE1lbW9yaWVzKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOworCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtU2hhcmVkTWVtb3JpZXM7IGkrKykgewogICAgICAgICBtU2hhcmVkTWVtb3JpZXNbaV0ucmVhZEZyb21QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICB9Ci0gICAgbVVwTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpOwotICAgIG1Eb3duTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpOwotICAgIG1VcERhdGFRdWV1ZVBhcmNlbGFibGUucmVhZEZyb21QYXJjZWwocGFyY2VsKTsKLSAgICBtRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUucmVhZEZyb21QYXJjZWwocGFyY2VsKTsKLSAgICByZXR1cm4gTk9fRVJST1I7IC8vIFRPRE8gY2hlY2sgZm9yIGVycm9ycyBhYm92ZQorICAgIHN0YXR1cyA9IG1VcE1lc3NhZ2VRdWV1ZVBhcmNlbGFibGUucmVhZEZyb21QYXJjZWwocGFyY2VsKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOworICAgIHN0YXR1cyA9IG1Eb3duTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CisgICAgc3RhdHVzID0gbVVwRGF0YVF1ZXVlUGFyY2VsYWJsZS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CisgICAgc3RhdHVzID0gbURvd25EYXRhUXVldWVQYXJjZWxhYmxlLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKKworICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyh2YWxpZGF0ZSgpKTsKKworZXJyb3I6CisgICAgQUxPR0UoIiVzIHJldHVybmluZyAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZTo6cmVzb2x2ZShFbmRwb2ludERlc2NyaXB0b3IgKmRlc2NyaXB0b3IpIHsKQEAgLTEwOSw1MiArMTM2LDI4IEBACiAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KGVycik7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZTo6dmFsaWRhdGUoKSB7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdDsKK2FhdWRpb19yZXN1bHRfdCBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZTo6dmFsaWRhdGUoKSBjb25zdCB7CiAgICAgaWYgKG1OdW1TaGFyZWRNZW1vcmllcyA8IDAgfHwgbU51bVNoYXJlZE1lbW9yaWVzID49IE1BWF9TSEFSRURfTUVNT1JJRVMpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlIGludmFsaWQgbU51bVNoYXJlZE1lbW9yaWVzID0gJWQiLCBtTnVtU2hhcmVkTWVtb3JpZXMpOworICAgICAgICBBTE9HRSgiaW52YWxpZCBtTnVtU2hhcmVkTWVtb3JpZXMgPSAlZCIsIG1OdW1TaGFyZWRNZW1vcmllcyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7CiAgICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bVNoYXJlZE1lbW9yaWVzOyBpKyspIHsKLSAgICAgICAgcmVzdWx0ID0gbVNoYXJlZE1lbW9yaWVzW2ldLnZhbGlkYXRlKCk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgaW52YWxpZCBtU2hhcmVkTWVtb3JpZXNbJWRdID0gJWQiLCBpLCByZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoKHJlc3VsdCA9IG1VcE1lc3NhZ2VRdWV1ZVBhcmNlbGFibGUudmFsaWRhdGUoKSkgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSBpbnZhbGlkIG1VcE1lc3NhZ2VRdWV1ZVBhcmNlbGFibGUgPSAlZCIsIHJlc3VsdCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGlmICgocmVzdWx0ID0gbURvd25NZXNzYWdlUXVldWVQYXJjZWxhYmxlLnZhbGlkYXRlKCkpICE9IEFBVURJT19PSykgewotICAgICAgICBBTE9HRSgiQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgaW52YWxpZCBtRG93bk1lc3NhZ2VRdWV1ZVBhcmNlbGFibGUgPSAlZCIsIHJlc3VsdCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGlmICgocmVzdWx0ID0gbVVwRGF0YVF1ZXVlUGFyY2VsYWJsZS52YWxpZGF0ZSgpKSAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlIGludmFsaWQgbVVwRGF0YVF1ZXVlUGFyY2VsYWJsZSA9ICVkIiwgcmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgaWYgKChyZXN1bHQgPSBtRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUudmFsaWRhdGUoKSkgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSBpbnZhbGlkIG1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZSA9ICVkIiwgcmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9CiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAogdm9pZCBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZTo6ZHVtcCgpIHsKLSAgICBBTE9HRCgiQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEJFR0lOIik7Ci0gICAgQUxPR0QoIkF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlIG1OdW1TaGFyZWRNZW1vcmllcyA9ICVkIiwgbU51bVNoYXJlZE1lbW9yaWVzKTsKKyAgICBBTE9HRCgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEJFR0lOIik7CisgICAgQUxPR0QoIm1OdW1TaGFyZWRNZW1vcmllcyA9ICVkIiwgbU51bVNoYXJlZE1lbW9yaWVzKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1TaGFyZWRNZW1vcmllczsgaSsrKSB7CiAgICAgICAgIG1TaGFyZWRNZW1vcmllc1tpXS5kdW1wKCk7CiAgICAgfQotICAgIEFMT0dEKCJBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSBtVXBNZXNzYWdlUXVldWVQYXJjZWxhYmxlID09PT09PT09PSIpOworICAgIEFMT0dEKCJtVXBNZXNzYWdlUXVldWVQYXJjZWxhYmxlID09PT09PT09PSIpOwogICAgIG1VcE1lc3NhZ2VRdWV1ZVBhcmNlbGFibGUuZHVtcCgpOwotICAgIEFMT0dEKCJBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSBtRG93bk1lc3NhZ2VRdWV1ZVBhcmNlbGFibGUgPT09PT09PSIpOworICAgIEFMT0dEKCJtRG93bk1lc3NhZ2VRdWV1ZVBhcmNlbGFibGUgPT09PT09PSIpOwogICAgIG1Eb3duTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZS5kdW1wKCk7Ci0gICAgQUxPR0QoIkF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlIG1VcERhdGFRdWV1ZVBhcmNlbGFibGUgPT09PT09PT09PT09Iik7CisgICAgQUxPR0QoIm1VcERhdGFRdWV1ZVBhcmNlbGFibGUgPT09PT09PT09PT09Iik7CiAgICAgbVVwRGF0YVF1ZXVlUGFyY2VsYWJsZS5kdW1wKCk7Ci0gICAgQUxPR0QoIkF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlIG1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZSA9PT09PT09PT09Iik7CisgICAgQUxPR0QoIm1Eb3duRGF0YVF1ZXVlUGFyY2VsYWJsZSA9PT09PT09PT09Iik7CiAgICAgbURvd25EYXRhUXVldWVQYXJjZWxhYmxlLmR1bXAoKTsKLSAgICBBTE9HRCgiQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEVORCIpOworICAgIEFMT0dEKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRU5EIik7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmgKaW5kZXggYWE4NTczZi4uZTRmOGI5ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmgKQEAgLTU2LDggKzU2LDYgQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCByZXNvbHZlKEVuZHBvaW50RGVzY3JpcHRvciAqZGVzY3JpcHRvcik7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgdmFsaWRhdGUoKTsKLQogICAgIGFhdWRpb19yZXN1bHRfdCBjbG9zZSgpOwogCiAgICAgdm9pZCBkdW1wKCk7CkBAIC03MCw2ICs2OCw4IEBACiAgICAgUmluZ0J1ZmZlclBhcmNlbGFibGUgICAgbURvd25EYXRhUXVldWVQYXJjZWxhYmxlOyAgICAvLyBlZy4gcGxheWJhY2sKIAogcHJpdmF0ZToKKyAgICBhYXVkaW9fcmVzdWx0X3QgICAgICAgICB2YWxpZGF0ZSgpIGNvbnN0OworCiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbU51bVNoYXJlZE1lbW9yaWVzID0gMDsKICAgICBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlICBtU2hhcmVkTWVtb3JpZXNbTUFYX1NIQVJFRF9NRU1PUklFU107CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9JQUF1ZGlvU2VydmljZS5jcHAKaW5kZXggYjNjNDkzNC4uNjIwZWRjNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb1NlcnZpY2UuY3BwCkBAIC0xMjEsMTcgKzEyMSwxMSBAQAogICAgICAgICAgICAgQUxPR0UoIkJwQUF1ZGlvU2VydmljZTo6Y2xpZW50IEdFVF9TVFJFQU1fREVTQ1JJUFRJT04gcGFzc2VkIHJlc3VsdCAlZCIsIHJlc3VsdCk7CiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9Ci0gICAgICAgIGVyciA9IHBhcmNlbGFibGUucmVhZEZyb21QYXJjZWwoJnJlcGx5KTs7CisgICAgICAgIGVyciA9IHBhcmNlbGFibGUucmVhZEZyb21QYXJjZWwoJnJlcGx5KTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgQUxPR0UoIkJwQUF1ZGlvU2VydmljZTo6Y2xpZW50IHRyYW5zYWN0KEdFVF9TVFJFQU1fREVTQ1JJUFRJT04pIHJlYWQgZW5kcG9pbnQgJWQiLCBlcnIpOwogICAgICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KGVycik7CiAgICAgICAgIH0KLSAgICAgICAgLy9wYXJjZWxhYmxlLmR1bXAoKTsKLSAgICAgICAgcmVzdWx0ID0gcGFyY2VsYWJsZS52YWxpZGF0ZSgpOwotICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgQUxPR0UoIkJwQUF1ZGlvU2VydmljZTo6Y2xpZW50IEdFVF9TVFJFQU1fREVTQ1JJUFRJT04gdmFsaWRhdGlvbiBmYWlscyAlZCIsIHJlc3VsdCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCkBAIC0yNTAsNiArMjQ0LDcgQEAKICAgICBwaWRfdCB0aWQ7CiAgICAgaW50NjRfdCBuYW5vc2Vjb25kczsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0OworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogICAgIEFMT0dWKCJCbkFBdWRpb1NlcnZpY2U6Om9uVHJhbnNhY3QoJWkpICVpIiwgY29kZSwgZmxhZ3MpOwogCiAgICAgc3dpdGNoKGNvZGUpIHsKQEAgLTI5NCwyMSArMjg5LDIwIEBACiAKICAgICAgICAgY2FzZSBHRVRfU1RSRUFNX0RFU0NSSVBUSU9OOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUFBdWRpb1NlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGRhdGEucmVhZEludDMyKCZzdHJlYW1IYW5kbGUpOworICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoJnN0cmVhbUhhbmRsZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGFhdWRpbzo6QXVkaW9FbmRwb2ludFBhcmNlbGFibGUgcGFyY2VsYWJsZTsKICAgICAgICAgICAgIHJlc3VsdCA9IGdldFN0cmVhbURlc2NyaXB0aW9uKHN0cmVhbUhhbmRsZSwgcGFyY2VsYWJsZSk7CiAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyhyZXN1bHQpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzdWx0ID0gcGFyY2VsYWJsZS52YWxpZGF0ZSgpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiQm5BQXVkaW9TZXJ2aWNlOjpvblRyYW5zYWN0IGdldFN0cmVhbURlc2NyaXB0aW9uKCkgcmV0dXJucyAlZCIsIHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgcGFyY2VsYWJsZS5kdW1wKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKHJlc3VsdCk7CisgICAgICAgICAgICBzdGF0dXMgPSByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwotICAgICAgICAgICAgcGFyY2VsYWJsZS53cml0ZVRvUGFyY2VsKHJlcGx5KTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIHJldHVybiBwYXJjZWxhYmxlLndyaXRlVG9QYXJjZWwocmVwbHkpOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgU1RBUlRfU1RSRUFNOiB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvUmluZ0J1ZmZlclBhcmNlbGFibGUuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1JpbmdCdWZmZXJQYXJjZWxhYmxlLmNwcAppbmRleCA2Yjc0YjIxLi40OTk2YjNmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvUmluZ0J1ZmZlclBhcmNlbGFibGUuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5jcHAKQEAgLTE0LDEzICsxNCwxNCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBMT0dfVEFHICJBQXVkaW8iCisjZGVmaW5lIExPR19UQUcgIlJpbmdCdWZmZXJQYXJjZWxhYmxlIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgorI2luY2x1ZGUgPHV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmg+CiAKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VEZWZpbml0aW9ucy5oIgogI2luY2x1ZGUgImJpbmRpbmcvU2hhcmVkUmVnaW9uUGFyY2VsYWJsZS5oIgpAQCAtNzksNyArODAsMTAgQEAKICAqIFRoZSByZWFkIGFuZCB3cml0ZSBtdXN0IGJlIHN5bW1ldHJpYy4KICAqLwogc3RhdHVzX3QgUmluZ0J1ZmZlclBhcmNlbGFibGU6OndyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIobUNhcGFjaXR5SW5GcmFtZXMpOworICAgIHN0YXR1c190IHN0YXR1cyA9IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKHZhbGlkYXRlKCkpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CisKKyAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIobUNhcGFjaXR5SW5GcmFtZXMpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgaWYgKG1DYXBhY2l0eUluRnJhbWVzID4gMCkgewogICAgICAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIobUJ5dGVzUGVyRnJhbWUpOwpAQCAtOTcsNyArMTAxLDcgQEAKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogZXJyb3I6Ci0gICAgQUxPR0UoIlJpbmdCdWZmZXJQYXJjZWxhYmxlOjp3cml0ZVRvUGFyY2VsKCkgZXJyb3IgPSAlZCIsIHN0YXR1cyk7CisgICAgQUxPR0UoIiVzIHJldHVybmluZyAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTExOCw5ICsxMjIsOSBAQAogICAgICAgICBzdGF0dXMgPSBtRGF0YVBhcmNlbGFibGUucmVhZEZyb21QYXJjZWwocGFyY2VsKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyh2YWxpZGF0ZSgpKTsKIGVycm9yOgotICAgIEFMT0dFKCJSaW5nQnVmZmVyUGFyY2VsYWJsZTo6cmVhZEZyb21QYXJjZWwoKSBlcnJvciA9ICVkIiwgc3RhdHVzKTsKKyAgICBBTE9HRSgiJXMgcmV0dXJuaW5nICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMTUxLDQyICsxNTUsMjkgQEAKICAgICByZXR1cm4gQUFVRElPX09LOwogfQogCi1hYXVkaW9fcmVzdWx0X3QgUmluZ0J1ZmZlclBhcmNlbGFibGU6OnZhbGlkYXRlKCkgewotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQ7CithYXVkaW9fcmVzdWx0X3QgUmluZ0J1ZmZlclBhcmNlbGFibGU6OnZhbGlkYXRlKCkgY29uc3QgewogICAgIGlmIChtQ2FwYWNpdHlJbkZyYW1lcyA8IDAgfHwgbUNhcGFjaXR5SW5GcmFtZXMgPj0gMzIgKiAxMDI0KSB7Ci0gICAgICAgIEFMT0dFKCJSaW5nQnVmZmVyUGFyY2VsYWJsZSBpbnZhbGlkIG1DYXBhY2l0eUluRnJhbWVzID0gJWQiLCBtQ2FwYWNpdHlJbkZyYW1lcyk7CisgICAgICAgIEFMT0dFKCJpbnZhbGlkIG1DYXBhY2l0eUluRnJhbWVzID0gJWQiLCBtQ2FwYWNpdHlJbkZyYW1lcyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7CiAgICAgfQogICAgIGlmIChtQnl0ZXNQZXJGcmFtZSA8IDAgfHwgbUJ5dGVzUGVyRnJhbWUgPj0gMjU2KSB7Ci0gICAgICAgIEFMT0dFKCJSaW5nQnVmZmVyUGFyY2VsYWJsZSBpbnZhbGlkIG1CeXRlc1BlckZyYW1lID0gJWQiLCBtQnl0ZXNQZXJGcmFtZSk7CisgICAgICAgIEFMT0dFKCJpbnZhbGlkIG1CeXRlc1BlckZyYW1lID0gJWQiLCBtQnl0ZXNQZXJGcmFtZSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7CiAgICAgfQogICAgIGlmIChtRnJhbWVzUGVyQnVyc3QgPCAwIHx8IG1GcmFtZXNQZXJCdXJzdCA+PSAxNiAqIDEwMjQpIHsKLSAgICAgICAgQUxPR0UoIlJpbmdCdWZmZXJQYXJjZWxhYmxlIGludmFsaWQgbUZyYW1lc1BlckJ1cnN0ID0gJWQiLCBtRnJhbWVzUGVyQnVyc3QpOworICAgICAgICBBTE9HRSgiaW52YWxpZCBtRnJhbWVzUGVyQnVyc3QgPSAlZCIsIG1GcmFtZXNQZXJCdXJzdCk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7CiAgICAgfQotICAgIGlmICgocmVzdWx0ID0gbVJlYWRDb3VudGVyUGFyY2VsYWJsZS52YWxpZGF0ZSgpKSAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgQUxPR0UoIlJpbmdCdWZmZXJQYXJjZWxhYmxlIGludmFsaWQgbVJlYWRDb3VudGVyUGFyY2VsYWJsZSA9ICVkIiwgcmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgaWYgKChyZXN1bHQgPSBtV3JpdGVDb3VudGVyUGFyY2VsYWJsZS52YWxpZGF0ZSgpKSAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgQUxPR0UoIlJpbmdCdWZmZXJQYXJjZWxhYmxlIGludmFsaWQgbVdyaXRlQ291bnRlclBhcmNlbGFibGUgPSAlZCIsIHJlc3VsdCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGlmICgocmVzdWx0ID0gbURhdGFQYXJjZWxhYmxlLnZhbGlkYXRlKCkpICE9IEFBVURJT19PSykgewotICAgICAgICBBTE9HRSgiUmluZ0J1ZmZlclBhcmNlbGFibGUgaW52YWxpZCBtRGF0YVBhcmNlbGFibGUgPSAlZCIsIHJlc3VsdCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKIAogdm9pZCBSaW5nQnVmZmVyUGFyY2VsYWJsZTo6ZHVtcCgpIHsKLSAgICBBTE9HRCgiUmluZ0J1ZmZlclBhcmNlbGFibGUgbUNhcGFjaXR5SW5GcmFtZXMgPSAlZCAtLS0tLS0tLS0iLCBtQ2FwYWNpdHlJbkZyYW1lcyk7CisgICAgQUxPR0QoIm1DYXBhY2l0eUluRnJhbWVzID0gJWQgLS0tLS0tLS0tIiwgbUNhcGFjaXR5SW5GcmFtZXMpOwogICAgIGlmIChtQ2FwYWNpdHlJbkZyYW1lcyA+IDApIHsKLSAgICAgICAgQUxPR0QoIlJpbmdCdWZmZXJQYXJjZWxhYmxlIG1CeXRlc1BlckZyYW1lID0gJWQiLCBtQnl0ZXNQZXJGcmFtZSk7Ci0gICAgICAgIEFMT0dEKCJSaW5nQnVmZmVyUGFyY2VsYWJsZSBtRnJhbWVzUGVyQnVyc3QgPSAlZCIsIG1GcmFtZXNQZXJCdXJzdCk7Ci0gICAgICAgIEFMT0dEKCJSaW5nQnVmZmVyUGFyY2VsYWJsZSBtRmxhZ3MgPSAldSIsIG1GbGFncyk7CisgICAgICAgIEFMT0dEKCJtQnl0ZXNQZXJGcmFtZSA9ICVkIiwgbUJ5dGVzUGVyRnJhbWUpOworICAgICAgICBBTE9HRCgibUZyYW1lc1BlckJ1cnN0ID0gJWQiLCBtRnJhbWVzUGVyQnVyc3QpOworICAgICAgICBBTE9HRCgibUZsYWdzID0gJXUiLCBtRmxhZ3MpOwogICAgICAgICBtUmVhZENvdW50ZXJQYXJjZWxhYmxlLmR1bXAoKTsKICAgICAgICAgbVdyaXRlQ291bnRlclBhcmNlbGFibGUuZHVtcCgpOwogICAgICAgICBtRGF0YVBhcmNlbGFibGUuZHVtcCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1JpbmdCdWZmZXJQYXJjZWxhYmxlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvUmluZ0J1ZmZlclBhcmNlbGFibGUuaAppbmRleCBiZDU2MmYyLi4xZGJjZjA3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvUmluZ0J1ZmZlclBhcmNlbGFibGUuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvUmluZ0J1ZmZlclBhcmNlbGFibGUuaApAQCAtNjYsMTEgKzY2LDEyIEBACiAKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzb2x2ZShTaGFyZWRNZW1vcnlQYXJjZWxhYmxlICptZW1vcnlQYXJjZWxzLCBSaW5nQnVmZmVyRGVzY3JpcHRvciAqZGVzY3JpcHRvcik7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgdmFsaWRhdGUoKTsKLQogICAgIHZvaWQgZHVtcCgpOwogCiBwcml2YXRlOgorCisgICAgYWF1ZGlvX3Jlc3VsdF90IHZhbGlkYXRlKCkgY29uc3Q7CisKICAgICBTaGFyZWRSZWdpb25QYXJjZWxhYmxlICBtUmVhZENvdW50ZXJQYXJjZWxhYmxlOwogICAgIFNoYXJlZFJlZ2lvblBhcmNlbGFibGUgIG1Xcml0ZUNvdW50ZXJQYXJjZWxhYmxlOwogICAgIFNoYXJlZFJlZ2lvblBhcmNlbGFibGUgIG1EYXRhUGFyY2VsYWJsZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcAppbmRleCA5MDIxN2FiLi4wYjBjZjc3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIExPR19UQUcgIkFBdWRpbyIKKyNkZWZpbmUgTE9HX1RBRyAiU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIApAQCAtNDMsMTYgKzQzLDE4IEBACiAKIHZvaWQgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZTo6c2V0dXAoY29uc3QgdW5pcXVlX2ZkJiBmZCwgaW50MzJfdCBzaXplSW5CeXRlcykgewogICAgIG1GZC5yZXNldChkdXAoZmQuZ2V0KCkpKTsgLy8gc3RvcmUgYSBkdXBsaWNhdGUgZmQKLSAgICBBTE9HVigiU2hhcmVkTWVtb3J5UGFyY2VsYWJsZTo6c2V0dXAoJWQgLT4gJWQsICVkKSB0aGlzID0gJXBcbiIsCi0gICAgICAgICAgZmQuZ2V0KCksIG1GZC5nZXQoKSwgc2l6ZUluQnl0ZXMsIHRoaXMpOworICAgIEFMT0dWKCJzZXR1cCglZCAtPiAlZCwgJWQpIHRoaXMgPSAlcFxuIiwgZmQuZ2V0KCksIG1GZC5nZXQoKSwgc2l6ZUluQnl0ZXMsIHRoaXMpOwogICAgIG1TaXplSW5CeXRlcyA9IHNpemVJbkJ5dGVzOwogfQogCiBzdGF0dXNfdCBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKG1TaXplSW5CeXRlcyk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTdGF0dXModmFsaWRhdGUoKSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKworICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihtU2l6ZUluQnl0ZXMpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CiAgICAgaWYgKG1TaXplSW5CeXRlcyA+IDApIHsKLSAgICAgICAgQUxPR1YoIlNoYXJlZE1lbW9yeVBhcmNlbGFibGU6OndyaXRlVG9QYXJjZWwoKSBtRmQgPSAlZCwgdGhpcyA9ICVwXG4iLCBtRmQuZ2V0KCksIHRoaXMpOworICAgICAgICBBTE9HVigid3JpdGVUb1BhcmNlbCgpIG1GZCA9ICVkLCB0aGlzID0gJXBcbiIsIG1GZC5nZXQoKSwgdGhpcyk7CiAgICAgICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVVbmlxdWVGaWxlRGVzY3JpcHRvcihtRmQpOwogICAgICAgICBBTE9HRV9JRihzdGF0dXMgIT0gTk9fRVJST1IsICJTaGFyZWRNZW1vcnlQYXJjZWxhYmxlIHdyaXRlRHVwRmlsZURlc2NyaXB0b3IgZmFpbGVkIDogJWQiLAogICAgICAgICAgICAgICAgICBzdGF0dXMpOwpAQCAtNjIsMjIgKzY0LDI3IEBACiAKIHN0YXR1c190IFNoYXJlZE1lbW9yeVBhcmNlbGFibGU6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJm1TaXplSW5CeXRlcyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOworCiAgICAgaWYgKG1TaXplSW5CeXRlcyA+IDApIHsKICAgICAgICAgLy8gVGhlIFBhcmNlbCBvd25zIHRoZSBmaWxlIGRlc2NyaXB0b3IgYW5kIHdpbGwgY2xvc2UgaXQgbGF0ZXIuCiAgICAgICAgIHVuaXF1ZV9mZCBtbWFwRmQ7CiAgICAgICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZFVuaXF1ZUZpbGVEZXNjcmlwdG9yKCZtbWFwRmQpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiU2hhcmVkTWVtb3J5UGFyY2VsYWJsZTo6cmVhZEZyb21QYXJjZWwoKSByZWFkVW5pcXVlRmlsZURlc2NyaXB0b3IoKSBmYWlsZWQgOiAlZCIsCi0gICAgICAgICAgICAgICAgICBzdGF0dXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gUmVzb2x2ZSB0aGUgbWVtb3J5IG5vdyB3aGlsZSB3ZSBzdGlsbCBoYXZlIHRoZSBGRCBmcm9tIHRoZSBQYXJjZWwuCi0gICAgICAgICAgICAvLyBDbG9zaW5nIHRoZSBGRCB3aWxsIG5vdCBhZmZlY3QgdGhlIHNoYXJlZCBtZW1vcnkgb25jZSBtbWFwKCkgaGFzIGJlZW4gY2FsbGVkLgotICAgICAgICAgICAgc3RhdHVzID0gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQocmVzb2x2ZVNoYXJlZE1lbW9yeShtbWFwRmQpKTsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkRnJvbVBhcmNlbCgpIHJlYWRVbmlxdWVGaWxlRGVzY3JpcHRvcigpIGZhaWxlZCA6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KKworICAgICAgICAvLyBSZXNvbHZlIHRoZSBtZW1vcnkgbm93IHdoaWxlIHdlIHN0aWxsIGhhdmUgdGhlIEZEIGZyb20gdGhlIFBhcmNlbC4KKyAgICAgICAgLy8gQ2xvc2luZyB0aGUgRkQgd2lsbCBub3QgYWZmZWN0IHRoZSBzaGFyZWQgbWVtb3J5IG9uY2UgbW1hcCgpIGhhcyBiZWVuIGNhbGxlZC4KKyAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHJlc29sdmVTaGFyZWRNZW1vcnkobW1hcEZkKTsKKyAgICAgICAgc3RhdHVzID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTdGF0dXMocmVzdWx0KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICB9CisKKyAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTdGF0dXModmFsaWRhdGUoKSk7CisKK2Vycm9yOgogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTg1LDcgKzkyLDcgQEAKICAgICBpZiAobVJlc29sdmVkQWRkcmVzcyAhPSBNTUFQX1VOUkVTT0xWRURfQUREUkVTUykgewogICAgICAgICBpbnQgZXJyID0gbXVubWFwKG1SZXNvbHZlZEFkZHJlc3MsIG1TaXplSW5CeXRlcyk7CiAgICAgICAgIGlmIChlcnIgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiU2hhcmVkTWVtb3J5UGFyY2VsYWJsZTo6Y2xvc2UoKSBtdW5tYXAoKSBmYWlsZWQgJWQiLCBlcnIpOworICAgICAgICAgICAgQUxPR0UoImNsb3NlKCkgbXVubWFwKCkgZmFpbGVkICVkIiwgZXJyKTsKICAgICAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwogICAgICAgICB9CiAgICAgICAgIG1SZXNvbHZlZEFkZHJlc3MgPSBNTUFQX1VOUkVTT0xWRURfQUREUkVTUzsKQEAgLTk3LDggKzEwNCw3IEBACiAgICAgbVJlc29sdmVkQWRkcmVzcyA9ICh1aW50OF90ICopIG1tYXAoMCwgbVNpemVJbkJ5dGVzLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BUF9TSEFSRUQsIGZkLmdldCgpLCAwKTsKICAgICBpZiAobVJlc29sdmVkQWRkcmVzcyA9PSBNTUFQX1VOUkVTT0xWRURfQUREUkVTUykgewotICAgICAgICBBTE9HRSgiU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSBtbWFwKCkgZmFpbGVkIGZvciBmZCA9ICVkLCBlcnJubyA9ICVzIiwKLSAgICAgICAgICAgICAgZmQuZ2V0KCksIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIEFMT0dFKCJtbWFwKCkgZmFpbGVkIGZvciBmZCA9ICVkLCBlcnJubyA9ICVzIiwgZmQuZ2V0KCksIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7CiAgICAgfQogICAgIHJldHVybiBBQVVESU9fT0s7CkBAIC0xMDcsMTAgKzExMywxMCBAQAogYWF1ZGlvX3Jlc3VsdF90IFNoYXJlZE1lbW9yeVBhcmNlbGFibGU6OnJlc29sdmUoaW50MzJfdCBvZmZzZXRJbkJ5dGVzLCBpbnQzMl90IHNpemVJbkJ5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipyZWdpb25BZGRyZXNzUHRyKSB7CiAgICAgaWYgKG9mZnNldEluQnl0ZXMgPCAwKSB7Ci0gICAgICAgIEFMT0dFKCJTaGFyZWRNZW1vcnlQYXJjZWxhYmxlIGlsbGVnYWwgb2Zmc2V0SW5CeXRlcyA9ICVkIiwgb2Zmc2V0SW5CeXRlcyk7CisgICAgICAgIEFMT0dFKCJpbGxlZ2FsIG9mZnNldEluQnl0ZXMgPSAlZCIsIG9mZnNldEluQnl0ZXMpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKICAgICB9IGVsc2UgaWYgKChvZmZzZXRJbkJ5dGVzICsgc2l6ZUluQnl0ZXMpID4gbVNpemVJbkJ5dGVzKSB7Ci0gICAgICAgIEFMT0dFKCJTaGFyZWRNZW1vcnlQYXJjZWxhYmxlIG91dCBvZiByYW5nZSwgb2Zmc2V0SW5CeXRlcyA9ICVkLCAiCisgICAgICAgIEFMT0dFKCJvdXQgb2YgcmFuZ2UsIG9mZnNldEluQnl0ZXMgPSAlZCwgIgogICAgICAgICAgICAgICAgICAgICAgICJzaXplSW5CeXRlcyA9ICVkLCBtU2l6ZUluQnl0ZXMgPSAlZCIsCiAgICAgICAgICAgICAgIG9mZnNldEluQnl0ZXMsIHNpemVJbkJ5dGVzLCBtU2l6ZUluQnl0ZXMpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKQEAgLTEyMiwxNiArMTI4LDE1IEBACiAgICAgICAgIGlmIChtRmQuZ2V0KCkgIT0gLTEpIHsKICAgICAgICAgICAgIHJlc3VsdCA9IHJlc29sdmVTaGFyZWRNZW1vcnkobUZkKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJTaGFyZWRNZW1vcnlQYXJjZWxhYmxlIGhhcyBubyBmaWxlIGRlc2NyaXB0b3IgZm9yIHNoYXJlZCBtZW1vcnkuIik7CisgICAgICAgICAgICBBTE9HRSgiaGFzIG5vIGZpbGUgZGVzY3JpcHRvciBmb3Igc2hhcmVkIG1lbW9yeS4iKTsKICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlRFUk5BTDsKICAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LICYmIG1SZXNvbHZlZEFkZHJlc3MgIT0gTU1BUF9VTlJFU09MVkVEX0FERFJFU1MpIHsKICAgICAgICAgKnJlZ2lvbkFkZHJlc3NQdHIgPSBtUmVzb2x2ZWRBZGRyZXNzICsgb2Zmc2V0SW5CeXRlczsKLSAgICAgICAgQUxPR1YoIlNoYXJlZE1lbW9yeVBhcmNlbGFibGUgbVJlc29sdmVkQWRkcmVzcyA9ICVwIiwgbVJlc29sdmVkQWRkcmVzcyk7Ci0gICAgICAgIEFMT0dWKCJTaGFyZWRNZW1vcnlQYXJjZWxhYmxlIG9mZnNldCBieSAlZCwgKnJlZ2lvbkFkZHJlc3NQdHIgPSAlcCIsCi0gICAgICAgICAgICAgIG9mZnNldEluQnl0ZXMsICpyZWdpb25BZGRyZXNzUHRyKTsKKyAgICAgICAgQUxPR1YoIm1SZXNvbHZlZEFkZHJlc3MgPSAlcCIsIG1SZXNvbHZlZEFkZHJlc3MpOworICAgICAgICBBTE9HVigib2Zmc2V0IGJ5ICVkLCAqcmVnaW9uQWRkcmVzc1B0ciA9ICVwIiwgb2Zmc2V0SW5CeXRlcywgKnJlZ2lvbkFkZHJlc3NQdHIpOwogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwogfQpAQCAtMTQwLDE2ICsxNDUsMTYgQEAKICAgICByZXR1cm4gbVNpemVJbkJ5dGVzOwogfQogCi1hYXVkaW9fcmVzdWx0X3QgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZTo6dmFsaWRhdGUoKSB7CithYXVkaW9fcmVzdWx0X3QgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZTo6dmFsaWRhdGUoKSBjb25zdCB7CiAgICAgaWYgKG1TaXplSW5CeXRlcyA8IDAgfHwgbVNpemVJbkJ5dGVzID49IE1BWF9NTUFQX1NJWkVfQllURVMpIHsKLSAgICAgICAgQUxPR0UoIlNoYXJlZE1lbW9yeVBhcmNlbGFibGUgaW52YWxpZCBtU2l6ZUluQnl0ZXMgPSAlZCIsIG1TaXplSW5CeXRlcyk7CisgICAgICAgIEFMT0dFKCJpbnZhbGlkIG1TaXplSW5CeXRlcyA9ICVkIiwgbVNpemVJbkJ5dGVzKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfQogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKIHZvaWQgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZTo6ZHVtcCgpIHsKLSAgICBBTE9HRCgiU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSBtRmQgPSAlZCIsIG1GZC5nZXQoKSk7Ci0gICAgQUxPR0QoIlNoYXJlZE1lbW9yeVBhcmNlbGFibGUgbVNpemVJbkJ5dGVzID0gJWQiLCBtU2l6ZUluQnl0ZXMpOwotICAgIEFMT0dEKCJTaGFyZWRNZW1vcnlQYXJjZWxhYmxlIG1SZXNvbHZlZEFkZHJlc3MgPSAlcCIsIG1SZXNvbHZlZEFkZHJlc3MpOworICAgIEFMT0dEKCJtRmQgPSAlZCIsIG1GZC5nZXQoKSk7CisgICAgQUxPR0QoIm1TaXplSW5CeXRlcyA9ICVkIiwgbVNpemVJbkJ5dGVzKTsKKyAgICBBTE9HRCgibVJlc29sdmVkQWRkcmVzcyA9ICVwIiwgbVJlc29sdmVkQWRkcmVzcyk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaAppbmRleCAyYTYzNGUwLi44MmMyMjQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmgKQEAgLTYxLDggKzYxLDYgQEAKIAogICAgIGludDMyX3QgZ2V0U2l6ZUluQnl0ZXMoKTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCB2YWxpZGF0ZSgpOwotCiAgICAgdm9pZCBkdW1wKCk7CiAKIHByb3RlY3RlZDoKQEAgLTc0LDYgKzcyLDExIEBACiAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkICAgbUZkOwogICAgIGludDMyX3QgICAgIG1TaXplSW5CeXRlcyA9IDA7CiAgICAgdWludDhfdCAgICAqbVJlc29sdmVkQWRkcmVzcyA9IE1NQVBfVU5SRVNPTFZFRF9BRERSRVNTOworCitwcml2YXRlOgorCisgICAgYWF1ZGlvX3Jlc3VsdF90IHZhbGlkYXRlKCkgY29uc3Q7CisKIH07CiAKIH0gLyogbmFtZXNwYWNlIGFhdWRpbyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZFJlZ2lvblBhcmNlbGFibGUuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZFJlZ2lvblBhcmNlbGFibGUuY3BwCmluZGV4IDczODFkY2IuLmM3NzYxMTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRSZWdpb25QYXJjZWxhYmxlLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkUmVnaW9uUGFyY2VsYWJsZS5jcHAKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvIgorI2RlZmluZSBMT0dfVEFHICJTaGFyZWRSZWdpb25QYXJjZWxhYmxlIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KIAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oPgogCiAjaW5jbHVkZSAiYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmgiCiAjaW5jbHVkZSAiYmluZGluZy9TaGFyZWRSZWdpb25QYXJjZWxhYmxlLmgiCkBAIC00NywyMSArNDgsMzggQEAKIH0KIAogc3RhdHVzX3QgU2hhcmVkUmVnaW9uUGFyY2VsYWJsZTo6d3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3QgewotICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtU2l6ZUluQnl0ZXMpOworICAgIHN0YXR1c190IHN0YXR1cyA9IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKHZhbGlkYXRlKCkpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CisKKyAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIobVNpemVJbkJ5dGVzKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIGlmIChtU2l6ZUluQnl0ZXMgPiAwKSB7Ci0gICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtU2hhcmVkTWVtb3J5SW5kZXgpOwotICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIobU9mZnNldEluQnl0ZXMpOworICAgICAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIobVNoYXJlZE1lbW9yeUluZGV4KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKKyAgICAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKG1PZmZzZXRJbkJ5dGVzKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOyAvLyBUT0RPIGNoZWNrIGZvciBlcnJvcnMgYWJvdmUKKyAgICByZXR1cm4gTk9fRVJST1I7CisKK2Vycm9yOgorICAgIEFMT0dFKCIlcyByZXR1cm5pbmcgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0dXNfdCBTaGFyZWRSZWdpb25QYXJjZWxhYmxlOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgewotICAgIHBhcmNlbC0+cmVhZEludDMyKCZtU2l6ZUluQnl0ZXMpOworICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZtU2l6ZUluQnl0ZXMpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgaWYgKG1TaXplSW5CeXRlcyA+IDApIHsKLSAgICAgICAgcGFyY2VsLT5yZWFkSW50MzIoJm1TaGFyZWRNZW1vcnlJbmRleCk7Ci0gICAgICAgIHBhcmNlbC0+cmVhZEludDMyKCZtT2Zmc2V0SW5CeXRlcyk7CisgICAgICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZtU2hhcmVkTWVtb3J5SW5kZXgpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOworICAgICAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmbU9mZnNldEluQnl0ZXMpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7IC8vIFRPRE8gY2hlY2sgZm9yIGVycm9ycyBhYm92ZQorICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyh2YWxpZGF0ZSgpKTsKKworZXJyb3I6CisgICAgQUxPR0UoIiVzIHJldHVybmluZyAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBTaGFyZWRSZWdpb25QYXJjZWxhYmxlOjpyZXNvbHZlKFNoYXJlZE1lbW9yeVBhcmNlbGFibGUgKm1lbW9yeVBhcmNlbHMsCkBAIC03MSwyNSArODksMjUgQEAKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKICAgICB9CiAgICAgaWYgKG1TaGFyZWRNZW1vcnlJbmRleCA8IDApIHsKLSAgICAgICAgQUxPR0UoIlNoYXJlZFJlZ2lvblBhcmNlbGFibGUgaW52YWxpZCBtU2hhcmVkTWVtb3J5SW5kZXggPSAlZCIsIG1TaGFyZWRNZW1vcnlJbmRleCk7CisgICAgICAgIEFMT0dFKCJpbnZhbGlkIG1TaGFyZWRNZW1vcnlJbmRleCA9ICVkIiwgbVNoYXJlZE1lbW9yeUluZGV4KTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsKICAgICB9CiAgICAgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSAqbWVtb3J5UGFyY2VsID0gJm1lbW9yeVBhcmNlbHNbbVNoYXJlZE1lbW9yeUluZGV4XTsKICAgICByZXR1cm4gbWVtb3J5UGFyY2VsLT5yZXNvbHZlKG1PZmZzZXRJbkJ5dGVzLCBtU2l6ZUluQnl0ZXMsIHJlZ2lvbkFkZHJlc3NQdHIpOwogfQogCi1hYXVkaW9fcmVzdWx0X3QgU2hhcmVkUmVnaW9uUGFyY2VsYWJsZTo6dmFsaWRhdGUoKSB7CithYXVkaW9fcmVzdWx0X3QgU2hhcmVkUmVnaW9uUGFyY2VsYWJsZTo6dmFsaWRhdGUoKSBjb25zdCB7CiAgICAgaWYgKG1TaXplSW5CeXRlcyA8IDAgfHwgbVNpemVJbkJ5dGVzID49IE1BWF9NTUFQX1NJWkVfQllURVMpIHsKLSAgICAgICAgQUxPR0UoIlNoYXJlZFJlZ2lvblBhcmNlbGFibGUgaW52YWxpZCBtU2l6ZUluQnl0ZXMgPSAlZCIsIG1TaXplSW5CeXRlcyk7CisgICAgICAgIEFMT0dFKCJpbnZhbGlkIG1TaXplSW5CeXRlcyA9ICVkIiwgbVNpemVJbkJ5dGVzKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfQogICAgIGlmIChtU2l6ZUluQnl0ZXMgPiAwKSB7CiAgICAgICAgIGlmIChtT2Zmc2V0SW5CeXRlcyA8IDAgfHwgbU9mZnNldEluQnl0ZXMgPj0gTUFYX01NQVBfT0ZGU0VUX0JZVEVTKSB7Ci0gICAgICAgICAgICBBTE9HRSgiU2hhcmVkUmVnaW9uUGFyY2VsYWJsZSBpbnZhbGlkIG1PZmZzZXRJbkJ5dGVzID0gJWQiLCBtT2Zmc2V0SW5CeXRlcyk7CisgICAgICAgICAgICBBTE9HRSgiaW52YWxpZCBtT2Zmc2V0SW5CeXRlcyA9ICVkIiwgbU9mZnNldEluQnl0ZXMpOwogICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1TaGFyZWRNZW1vcnlJbmRleCA8IDAgfHwgbVNoYXJlZE1lbW9yeUluZGV4ID49IE1BWF9TSEFSRURfTUVNT1JJRVMpIHsKLSAgICAgICAgICAgIEFMT0dFKCJTaGFyZWRSZWdpb25QYXJjZWxhYmxlIGludmFsaWQgbVNoYXJlZE1lbW9yeUluZGV4ID0gJWQiLCBtU2hhcmVkTWVtb3J5SW5kZXgpOworICAgICAgICAgICAgQUxPR0UoImludmFsaWQgbVNoYXJlZE1lbW9yeUluZGV4ID0gJWQiLCBtU2hhcmVkTWVtb3J5SW5kZXgpOwogICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsKICAgICAgICAgfQogICAgIH0KQEAgLTk3LDkgKzExNSw5IEBACiB9CiAKIHZvaWQgU2hhcmVkUmVnaW9uUGFyY2VsYWJsZTo6ZHVtcCgpIHsKLSAgICBBTE9HRCgiU2hhcmVkUmVnaW9uUGFyY2VsYWJsZSBtU2l6ZUluQnl0ZXMgPSAlZCAtLS0tLSIsIG1TaXplSW5CeXRlcyk7CisgICAgQUxPR0QoIm1TaXplSW5CeXRlcyA9ICVkIC0tLS0tIiwgbVNpemVJbkJ5dGVzKTsKICAgICBpZiAobVNpemVJbkJ5dGVzID4gMCkgewotICAgICAgICBBTE9HRCgiU2hhcmVkUmVnaW9uUGFyY2VsYWJsZSBtU2hhcmVkTWVtb3J5SW5kZXggPSAlZCIsIG1TaGFyZWRNZW1vcnlJbmRleCk7Ci0gICAgICAgIEFMT0dEKCJTaGFyZWRSZWdpb25QYXJjZWxhYmxlIG1PZmZzZXRJbkJ5dGVzID0gJWQiLCBtT2Zmc2V0SW5CeXRlcyk7CisgICAgICAgIEFMT0dEKCJtU2hhcmVkTWVtb3J5SW5kZXggPSAlZCIsIG1TaGFyZWRNZW1vcnlJbmRleCk7CisgICAgICAgIEFMT0dEKCJtT2Zmc2V0SW5CeXRlcyA9ICVkIiwgbU9mZnNldEluQnl0ZXMpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRSZWdpb25QYXJjZWxhYmxlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkUmVnaW9uUGFyY2VsYWJsZS5oCmluZGV4IGY2YmFiZmQuLjBjZDhjMDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRSZWdpb25QYXJjZWxhYmxlLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZFJlZ2lvblBhcmNlbGFibGUuaApAQCAtNDcsMTQgKzQ3LDE1IEBACiAKICAgICBib29sIGlzRmlsZURlc2NyaXB0b3JTYWZlKFNoYXJlZE1lbW9yeVBhcmNlbGFibGUgKm1lbW9yeVBhcmNlbHMpOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHZhbGlkYXRlKCk7Ci0KICAgICB2b2lkIGR1bXAoKTsKIAogcHJvdGVjdGVkOgogICAgIGludDMyX3QgbVNoYXJlZE1lbW9yeUluZGV4ID0gLTE7CiAgICAgaW50MzJfdCBtT2Zmc2V0SW5CeXRlcyAgICAgPSAwOwogICAgIGludDMyX3QgbVNpemVJbkJ5dGVzICAgICAgID0gMDsKKworcHJpdmF0ZToKKyAgICBhYXVkaW9fcmVzdWx0X3QgdmFsaWRhdGUoKSBjb25zdDsKIH07CiAKIH0gLyogbmFtZXNwYWNlIGFhdWRpbyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmNwcAppbmRleCA2MDRlZWQ1Li5mOGUzNGQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmNwcApAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBMT0dfVEFHICJBQXVkaW8iCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvRW5kcG9pbnQiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKQEAgLTQ1LDYgKzQ1LDcgQEAKICAgICBkZWxldGUgbVVwQ29tbWFuZFF1ZXVlOwogfQogCisvLyBUT0RPIENvbnNpZGVyIG1vdmluZyB0byBhIG1ldGhvZCBpbiBSaW5nQnVmZmVyRGVzY3JpcHRvcgogc3RhdGljIGFhdWRpb19yZXN1bHRfdCBBdWRpb0VuZHBvaW50X3ZhbGlkYXRlUXVldWVEZXNjcmlwdG9yKGNvbnN0IGNoYXIgKnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJpbmdCdWZmZXJEZXNjcmlwdG9yICpkZXNjcmlwdG9yKSB7CiAgICAgaWYgKGRlc2NyaXB0b3IgPT0gbnVsbHB0cikgewpAQCAtMTI3LDE5ICsxMjgsMTkgQEAKICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IHVwIG1lc3NhZ2UgcXVldWUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICBjb25zdCBSaW5nQnVmZmVyRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9ICZwRW5kcG9pbnREZXNjcmlwdG9yLT51cE1lc3NhZ2VRdWV1ZURlc2NyaXB0b3I7CiAgICAgaWYoZGVzY3JpcHRvci0+Ynl0ZXNQZXJGcmFtZSAhPSBzaXplb2YoQUF1ZGlvU2VydmljZU1lc3NhZ2UpKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb0VuZHBvaW50LmNvbmZpZ3VyZSgpIGJ5dGVzUGVyRnJhbWUgIT0gc2l6ZW9mKEFBdWRpb1NlcnZpY2VNZXNzYWdlKSA9ICVkIiwKKyAgICAgICAgQUxPR0UoImNvbmZpZ3VyZSgpIGJ5dGVzUGVyRnJhbWUgIT0gc2l6ZW9mKEFBdWRpb1NlcnZpY2VNZXNzYWdlKSA9ICVkIiwKICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+Ynl0ZXNQZXJGcmFtZSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7CiAgICAgfQogCiAgICAgaWYoZGVzY3JpcHRvci0+cmVhZENvdW50ZXJBZGRyZXNzID09IG51bGxwdHIgfHwgZGVzY3JpcHRvci0+d3JpdGVDb3VudGVyQWRkcmVzcyA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb0VuZHBvaW50LmNvbmZpZ3VyZSgpIE5VTEwgY291bnRlciBhZGRyZXNzIik7CisgICAgICAgIEFMT0dFKCJjb25maWd1cmUoKSBOVUxMIGNvdW50ZXIgYWRkcmVzcyIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX05VTEw7CiAgICAgfQogCiAgICAgLy8gUHJldmVudCBtZW1vcnkgbGVhayBhbmQgcmV1c2UuCiAgICAgaWYobVVwQ29tbWFuZFF1ZXVlICE9IG51bGxwdHIgfHwgbURhdGFRdWV1ZSAhPSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb0VuZHBvaW50LmNvbmZpZ3VyZSgpIGVuZHBvaW50IGFscmVhZHkgdXNlZCIpOworICAgICAgICBBTE9HRSgiY29uZmlndXJlKCkgZW5kcG9pbnQgYWxyZWFkeSB1c2VkIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7CiAgICAgfQogCkBAIC0xNTMsOCArMTU0LDggQEAKIAogICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gZGF0YSBxdWV1ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIGRlc2NyaXB0b3IgPSAmcEVuZHBvaW50RGVzY3JpcHRvci0+ZGF0YVF1ZXVlRGVzY3JpcHRvcjsKLSAgICBBTE9HVigiQXVkaW9FbmRwb2ludC5jb25maWd1cmUoKSBkYXRhIGZyYW1lc1BlckJ1cnN0ID0gJWQiLCBkZXNjcmlwdG9yLT5mcmFtZXNQZXJCdXJzdCk7Ci0gICAgQUxPR1YoIkF1ZGlvRW5kcG9pbnQuY29uZmlndXJlKCkgZGF0YSByZWFkQ291bnRlckFkZHJlc3MgPSAlcCIsCisgICAgQUxPR1YoImNvbmZpZ3VyZSgpIGRhdGEgZnJhbWVzUGVyQnVyc3QgPSAlZCIsIGRlc2NyaXB0b3ItPmZyYW1lc1BlckJ1cnN0KTsKKyAgICBBTE9HVigiY29uZmlndXJlKCkgZGF0YSByZWFkQ291bnRlckFkZHJlc3MgPSAlcCIsCiAgICAgICAgICAgZGVzY3JpcHRvci0+cmVhZENvdW50ZXJBZGRyZXNzKTsKIAogICAgIC8vIEFuIGV4YW1wbGUgb2YgZnJlZSBydW5uaW5nIGlzIHdoZW4gdGhlIG90aGVyIHNpZGUgaXMgcmVhZCBvciB3cml0dGVuIGJ5IGhhcmR3YXJlIERNQQpAQCAtMTYzLDcgKzE2NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZGVzY3JpcHRvci0+cmVhZENvdW50ZXJBZGRyZXNzIC8vIHJlYWQgYnkgb3RoZXIgc2lkZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRlc2NyaXB0b3ItPndyaXRlQ291bnRlckFkZHJlc3M7IC8vIHdyaXR0ZW4gYnkgb3RoZXIgc2lkZQogICAgIG1GcmVlUnVubmluZyA9IChyZW1vdGVDb3VudGVyID09IG51bGxwdHIpOwotICAgIEFMT0dWKCJBdWRpb0VuZHBvaW50LmNvbmZpZ3VyZSgpIG1GcmVlUnVubmluZyA9ICVkIiwgbUZyZWVSdW5uaW5nID8gMSA6IDApOworICAgIEFMT0dWKCJjb25maWd1cmUoKSBtRnJlZVJ1bm5pbmcgPSAlZCIsIG1GcmVlUnVubmluZyA/IDEgOiAwKTsKIAogICAgIGludDY0X3QgKnJlYWRDb3VudGVyQWRkcmVzcyA9IChkZXNjcmlwdG9yLT5yZWFkQ291bnRlckFkZHJlc3MgPT0gbnVsbHB0cikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICZtRGF0YVJlYWRDb3VudGVyCkBAIC0yNTgsOCArMjU5LDggQEAKIH0KIAogdm9pZCBBdWRpb0VuZHBvaW50OjpkdW1wKCkgY29uc3QgewotICAgIEFMT0dEKCJBdWRpb0VuZHBvaW50OiBkYXRhIHJlYWRDb3VudGVyICA9ICVsbGQiLCAobG9uZyBsb25nKSBtRGF0YVF1ZXVlLT5nZXRSZWFkQ291bnRlcigpKTsKLSAgICBBTE9HRCgiQXVkaW9FbmRwb2ludDogZGF0YSB3cml0ZUNvdW50ZXIgPSAlbGxkIiwgKGxvbmcgbG9uZykgbURhdGFRdWV1ZS0+Z2V0V3JpdGVDb3VudGVyKCkpOworICAgIEFMT0dEKCJkYXRhIHJlYWRDb3VudGVyICA9ICVsbGQiLCAobG9uZyBsb25nKSBtRGF0YVF1ZXVlLT5nZXRSZWFkQ291bnRlcigpKTsKKyAgICBBTE9HRCgiZGF0YSB3cml0ZUNvdW50ZXIgPSAlbGxkIiwgKGxvbmcgbG9uZykgbURhdGFRdWV1ZS0+Z2V0V3JpdGVDb3VudGVyKCkpOwogfQogCiB2b2lkIEF1ZGlvRW5kcG9pbnQ6OmVyYXNlRGF0YU1lbW9yeSgpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAKaW5kZXggMmZkYmZhZi4uOTIwNDgyNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAKQEAgLTYxLDE1ICs2MSwxMiBAQAogICAgICAgICAsIG1DbG9ja01vZGVsKCkKICAgICAgICAgLCBtQXVkaW9FbmRwb2ludCgpCiAgICAgICAgICwgbVNlcnZpY2VTdHJlYW1IYW5kbGUoQUFVRElPX0hBTkRMRV9JTlZBTElEKQotICAgICAgICAsIG1GcmFtZXNQZXJCdXJzdCgxNikKICAgICAgICAgLCBtSW5TZXJ2aWNlKGluU2VydmljZSkKICAgICAgICAgLCBtU2VydmljZUludGVyZmFjZShzZXJ2aWNlSW50ZXJmYWNlKQogICAgICAgICAsIG1BdG9taWNUaW1lc3RhbXAoKQogICAgICAgICAsIG1XYWtldXBEZWxheU5hbm9zKEFBdWRpb1Byb3BlcnR5X2dldFdha2V1cERlbGF5TWljcm9zKCkgKiBBQVVESU9fTkFOT1NfUEVSX01JQ1JPU0VDT05EKQogICAgICAgICAsIG1NaW5pbXVtU2xlZXBOYW5vcyhBQXVkaW9Qcm9wZXJ0eV9nZXRNaW5pbXVtU2xlZXBNaWNyb3MoKSAqIEFBVURJT19OQU5PU19QRVJfTUlDUk9TRUNPTkQpCiAgICAgICAgIHsKLSAgICBBTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbCgpOiBtV2FrZXVwRGVsYXlOYW5vcyA9ICVkLCBtTWluaW11bVNsZWVwTmFub3MgPSAlZCIsCi0gICAgICAgICAgbVdha2V1cERlbGF5TmFub3MsIG1NaW5pbXVtU2xlZXBOYW5vcyk7CiB9CiAKIEF1ZGlvU3RyZWFtSW50ZXJuYWw6On5BdWRpb1N0cmVhbUludGVybmFsKCkgewpAQCAtNzksMTEgKzc2LDEyIEBACiAKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwogICAgIGludDMyX3QgY2FwYWNpdHk7CisgICAgaW50MzJfdCBmcmFtZXNQZXJCdXJzdDsKICAgICBBQXVkaW9TdHJlYW1SZXF1ZXN0IHJlcXVlc3Q7CiAgICAgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uT3V0cHV0OwogCiAgICAgaWYgKGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9VTklOSVRJQUxJWkVEKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbUludGVybmFsOjpvcGVuKCk6IGFscmVhZHkgb3BlbiEgc3RhdGUgPSAlZCIsIGdldFN0YXRlKCkpOworICAgICAgICBBTE9HRSgiJXMgLSBhbHJlYWR5IG9wZW4hIHN0YXRlID0gJWQiLCBfX2Z1bmNfXywgZ2V0U3RhdGUoKSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAKQEAgLTEwNCw3ICsxMDIsNyBAQAogICAgIHJlcXVlc3Quc2V0VXNlcklkKGdldHVpZCgpKTsKICAgICByZXF1ZXN0LnNldFByb2Nlc3NJZChnZXRwaWQoKSk7CiAgICAgcmVxdWVzdC5zZXRTaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQoaXNTaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQoKSk7Ci0gICAgcmVxdWVzdC5zZXRJblNlcnZpY2UobUluU2VydmljZSk7CisgICAgcmVxdWVzdC5zZXRJblNlcnZpY2UoaXNJblNlcnZpY2UoKSk7CiAKICAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXREZXZpY2VJZChnZXREZXZpY2VJZCgpKTsKICAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRTYW1wbGVSYXRlKGdldFNhbXBsZVJhdGUoKSk7CkBAIC0xMTIsMTMgKzExMCwzMCBAQAogICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldERpcmVjdGlvbihnZXREaXJlY3Rpb24oKSk7CiAgICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0U2hhcmluZ01vZGUoZ2V0U2hhcmluZ01vZGUoKSk7CiAKKyAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRVc2FnZShnZXRVc2FnZSgpKTsKKyAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRDb250ZW50VHlwZShnZXRDb250ZW50VHlwZSgpKTsKKyAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRJbnB1dFByZXNldChnZXRJbnB1dFByZXNldCgpKTsKKwogICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldEJ1ZmZlckNhcGFjaXR5KGJ1aWxkZXIuZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CiAKKyAgICBtRGV2aWNlQ2hhbm5lbENvdW50ID0gZ2V0U2FtcGxlc1BlckZyYW1lKCk7IC8vIEFzc3VtZSBpdCB3aWxsIGJlIHRoZSBzYW1lLiBVcGRhdGUgaWYgbm90LgorCiAgICAgbVNlcnZpY2VTdHJlYW1IYW5kbGUgPSBtU2VydmljZUludGVyZmFjZS5vcGVuU3RyZWFtKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb25PdXRwdXQpOworICAgIGlmIChtU2VydmljZVN0cmVhbUhhbmRsZSA8IDAKKyAgICAgICAgICAgICYmIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLmdldFNhbXBsZXNQZXJGcmFtZSgpID09IDEgLy8gbW9ubz8KKyAgICAgICAgICAgICYmIGdldERpcmVjdGlvbigpID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUCisgICAgICAgICAgICAmJiAhaXNJblNlcnZpY2UoKSkgeworICAgICAgICAvLyBpZiB0aGF0IGZhaWxlZCB0aGVuIHRyeSBzd2l0Y2hpbmcgZnJvbSBtb25vIHRvIHN0ZXJlbyBpZiBPVVRQVVQuCisgICAgICAgIC8vIE9ubHkgZG8gdGhpcyBpbiB0aGUgY2xpZW50LiBPdGhlcndpc2Ugd2UgZW5kIHVwIHdpdGggYSBtb25vIG1peGVyIGluIHRoZSBzZXJ2aWNlCisgICAgICAgIC8vIHRoYXQgd3JpdGVzIHRvIGEgc3RlcmVvIE1NQVAgc3RyZWFtLgorICAgICAgICBBTE9HRCgiJXMgLSBvcGVuU3RyZWFtKCkgcmV0dXJuZWQgJWQsIHRyeSBzd2l0Y2hpbmcgZnJvbSBNT05PIHRvIFNURVJFTyIsCisgICAgICAgICAgICAgIF9fZnVuY19fLCBtU2VydmljZVN0cmVhbUhhbmRsZSk7CisgICAgICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldFNhbXBsZXNQZXJGcmFtZSgyKTsgLy8gc3RlcmVvCisgICAgICAgIG1TZXJ2aWNlU3RyZWFtSGFuZGxlID0gbVNlcnZpY2VJbnRlcmZhY2Uub3BlblN0cmVhbShyZXF1ZXN0LCBjb25maWd1cmF0aW9uT3V0cHV0KTsKKyAgICB9CiAgICAgaWYgKG1TZXJ2aWNlU3RyZWFtSGFuZGxlIDwgMCkgewotICAgICAgICByZXN1bHQgPSBtU2VydmljZVN0cmVhbUhhbmRsZTsKLSAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9wZW4oKTogb3BlblN0cmVhbSgpIHJldHVybmVkICVkIiwgcmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgQUxPR0UoIiVzIC0gb3BlblN0cmVhbSgpIHJldHVybmVkICVkIiwgX19mdW5jX18sIG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIG1TZXJ2aWNlU3RyZWFtSGFuZGxlOwogICAgIH0KIAogICAgIHJlc3VsdCA9IGNvbmZpZ3VyYXRpb25PdXRwdXQudmFsaWRhdGUoKTsKQEAgLTEyNiwxMyArMTQxLDIyIEBACiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogICAgIC8vIFNhdmUgcmVzdWx0cyBvZiB0aGUgb3Blbi4KKyAgICBpZiAoZ2V0U2FtcGxlc1BlckZyYW1lKCkgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgIHNldFNhbXBsZXNQZXJGcmFtZShjb25maWd1cmF0aW9uT3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpKTsKKyAgICB9CisgICAgbURldmljZUNoYW5uZWxDb3VudCA9IGNvbmZpZ3VyYXRpb25PdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisKICAgICBzZXRTYW1wbGVSYXRlKGNvbmZpZ3VyYXRpb25PdXRwdXQuZ2V0U2FtcGxlUmF0ZSgpKTsKLSAgICBzZXRTYW1wbGVzUGVyRnJhbWUoY29uZmlndXJhdGlvbk91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKSk7CiAgICAgc2V0RGV2aWNlSWQoY29uZmlndXJhdGlvbk91dHB1dC5nZXREZXZpY2VJZCgpKTsKKyAgICBzZXRTZXNzaW9uSWQoY29uZmlndXJhdGlvbk91dHB1dC5nZXRTZXNzaW9uSWQoKSk7CiAgICAgc2V0U2hhcmluZ01vZGUoY29uZmlndXJhdGlvbk91dHB1dC5nZXRTaGFyaW5nTW9kZSgpKTsKIAorICAgIHNldFVzYWdlKGNvbmZpZ3VyYXRpb25PdXRwdXQuZ2V0VXNhZ2UoKSk7CisgICAgc2V0Q29udGVudFR5cGUoY29uZmlndXJhdGlvbk91dHB1dC5nZXRDb250ZW50VHlwZSgpKTsKKyAgICBzZXRJbnB1dFByZXNldChjb25maWd1cmF0aW9uT3V0cHV0LmdldElucHV0UHJlc2V0KCkpOworCiAgICAgLy8gU2F2ZSBkZXZpY2UgZm9ybWF0IHNvIHdlIGNhbiBkbyBmb3JtYXQgY29udmVyc2lvbiBhbmQgdm9sdW1lIHNjYWxpbmcgdG9nZXRoZXIuCi0gICAgbURldmljZUZvcm1hdCA9IGNvbmZpZ3VyYXRpb25PdXRwdXQuZ2V0Rm9ybWF0KCk7CisgICAgc2V0RGV2aWNlRm9ybWF0KGNvbmZpZ3VyYXRpb25PdXRwdXQuZ2V0Rm9ybWF0KCkpOwogCiAgICAgcmVzdWx0ID0gbVNlcnZpY2VJbnRlcmZhY2UuZ2V0U3RyZWFtRGVzY3JpcHRpb24obVNlcnZpY2VTdHJlYW1IYW5kbGUsIG1FbmRQb2ludFBhcmNlbGFibGUpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CkBAIC0xNTEsMTcgKzE3NSwxOCBAQAogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAotICAgIG1GcmFtZXNQZXJCdXJzdCA9IG1FbmRwb2ludERlc2NyaXB0b3IuZGF0YVF1ZXVlRGVzY3JpcHRvci5mcmFtZXNQZXJCdXJzdDsKLSAgICBjYXBhY2l0eSA9IG1FbmRwb2ludERlc2NyaXB0b3IuZGF0YVF1ZXVlRGVzY3JpcHRvci5jYXBhY2l0eUluRnJhbWVzOwotCiAgICAgLy8gVmFsaWRhdGUgcmVzdWx0IGZyb20gc2VydmVyLgotICAgIGlmIChtRnJhbWVzUGVyQnVyc3QgPCAxNiB8fCBtRnJhbWVzUGVyQnVyc3QgPiAxNiAqIDEwMjQpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9wZW4oKTogZnJhbWVzUGVyQnVyc3Qgb3V0IG9mIHJhbmdlID0gJWQiLCBtRnJhbWVzUGVyQnVyc3QpOworICAgIGZyYW1lc1BlckJ1cnN0ID0gbUVuZHBvaW50RGVzY3JpcHRvci5kYXRhUXVldWVEZXNjcmlwdG9yLmZyYW1lc1BlckJ1cnN0OworICAgIGlmIChmcmFtZXNQZXJCdXJzdCA8IE1JTl9GUkFNRVNfUEVSX0JVUlNUIHx8IGZyYW1lc1BlckJ1cnN0ID4gTUFYX0ZSQU1FU19QRVJfQlVSU1QpIHsKKyAgICAgICAgQUxPR0UoIiVzIC0gZnJhbWVzUGVyQnVyc3Qgb3V0IG9mIHJhbmdlID0gJWQiLCBfX2Z1bmNfXywgZnJhbWVzUGVyQnVyc3QpOwogICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KLSAgICBpZiAoY2FwYWNpdHkgPCBtRnJhbWVzUGVyQnVyc3QgfHwgY2FwYWNpdHkgPiAzMiAqIDEwMjQpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9wZW4oKTogYnVmZmVyQ2FwYWNpdHkgb3V0IG9mIHJhbmdlID0gJWQiLCBjYXBhY2l0eSk7CisgICAgbUZyYW1lc1BlckJ1cnN0ID0gZnJhbWVzUGVyQnVyc3Q7IC8vIG9ubHkgc2F2ZSBnb29kIHZhbHVlCisKKyAgICBjYXBhY2l0eSA9IG1FbmRwb2ludERlc2NyaXB0b3IuZGF0YVF1ZXVlRGVzY3JpcHRvci5jYXBhY2l0eUluRnJhbWVzOworICAgIGlmIChjYXBhY2l0eSA8IG1GcmFtZXNQZXJCdXJzdCB8fCBjYXBhY2l0eSA+IE1BWF9CVUZGRVJfQ0FQQUNJVFlfSU5fRlJBTUVTKSB7CisgICAgICAgIEFMT0dFKCIlcyAtIGJ1ZmZlckNhcGFjaXR5IG91dCBvZiByYW5nZSA9ICVkIiwgX19mdW5jX18sIGNhcGFjaXR5KTsKICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CkBAIC0xNjksMTYgKzE5NCwxNiBAQAogICAgIG1DbG9ja01vZGVsLnNldFNhbXBsZVJhdGUoZ2V0U2FtcGxlUmF0ZSgpKTsKICAgICBtQ2xvY2tNb2RlbC5zZXRGcmFtZXNQZXJCdXJzdChtRnJhbWVzUGVyQnVyc3QpOwogCi0gICAgaWYgKGdldERhdGFDYWxsYmFja1Byb2MoKSkgeworICAgIGlmIChpc0RhdGFDYWxsYmFja1NldCgpKSB7CiAgICAgICAgIG1DYWxsYmFja0ZyYW1lcyA9IGJ1aWxkZXIuZ2V0RnJhbWVzUGVyRGF0YUNhbGxiYWNrKCk7CiAgICAgICAgIGlmIChtQ2FsbGJhY2tGcmFtZXMgPiBnZXRCdWZmZXJDYXBhY2l0eSgpIC8gMikgewotICAgICAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9wZW4oKTogZnJhbWVzUGVyQ2FsbGJhY2sgdG9vIGJpZyA9ICVkLCBjYXBhY2l0eSA9ICVkIiwKLSAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0ZyYW1lcywgZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CisgICAgICAgICAgICBBTE9HRSgiJXMgLSBmcmFtZXNQZXJDYWxsYmFjayB0b28gYmlnID0gJWQsIGNhcGFjaXR5ID0gJWQiLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1DYWxsYmFja0ZyYW1lcywgZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CiAgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwogICAgICAgICAgICAgZ290byBlcnJvcjsKIAogICAgICAgICB9IGVsc2UgaWYgKG1DYWxsYmFja0ZyYW1lcyA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbUludGVybmFsOjpvcGVuKCk6IGZyYW1lc1BlckNhbGxiYWNrIG5lZ2F0aXZlIik7CisgICAgICAgICAgICBBTE9HRSgiJXMgLSBmcmFtZXNQZXJDYWxsYmFjayBuZWdhdGl2ZSIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwogCkBAIC0yMDQsOCArMjI5LDcgQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OmNsb3NlKCkgewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7Ci0gICAgQUxPR0QoImNsb3NlKCk6IG1TZXJ2aWNlU3RyZWFtSGFuZGxlID0gMHglMDhYIiwKLSAgICAgICAgICAgICBtU2VydmljZVN0cmVhbUhhbmRsZSk7CisgICAgQUxPR0QoIiVzKCk6IG1TZXJ2aWNlU3RyZWFtSGFuZGxlID0gMHglMDhYIiwgX19mdW5jX18sIG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgIT0gQUFVRElPX0hBTkRMRV9JTlZBTElEKSB7CiAgICAgICAgIC8vIERvbid0IGNsb3NlIGEgc3RyZWFtIHdoaWxlIGl0IGlzIHJ1bm5pbmcuCiAgICAgICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBjdXJyZW50U3RhdGUgPSBnZXRTdGF0ZSgpOwpAQCAtMjE2LDggKzI0MCw4IEBACiAgICAgICAgICAgICByZXN1bHQgPSB3YWl0Rm9yU3RhdGVDaGFuZ2UoY3VycmVudFN0YXRlLCAmbmV4dFN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXROYW5vc2Vjb25kcyk7CiAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJjbG9zZSgpIHdhaXRGb3JTdGF0ZUNoYW5nZSgpIHJldHVybmVkICVkICVzIiwKLSAgICAgICAgICAgICAgICByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgICAgICAgICAgICAgIEFMT0dFKCIlcygpIHdhaXRGb3JTdGF0ZUNoYW5nZSgpIHJldHVybmVkICVkICVzIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NJTkcpOwpAQCAtMjQwLDcgKzI2NCw3IEBACiBzdGF0aWMgdm9pZCAqYWF1ZGlvX2NhbGxiYWNrX3RocmVhZF9wcm9jKHZvaWQgKmNvbnRleHQpCiB7CiAgICAgQXVkaW9TdHJlYW1JbnRlcm5hbCAqc3RyZWFtID0gKEF1ZGlvU3RyZWFtSW50ZXJuYWwgKiljb250ZXh0OwotICAgIC8vTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbCgpOiBvYm9lX2NhbGxiYWNrX3RocmVhZCwgc3RyZWFtID0gJXAiLCBzdHJlYW0pOworICAgIC8vTE9HRCgib2JvZV9jYWxsYmFja190aHJlYWQsIHN0cmVhbSA9ICVwIiwgc3RyZWFtKTsKICAgICBpZiAoc3RyZWFtICE9IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIHN0cmVhbS0+Y2FsbGJhY2tMb29wKCk7CiAgICAgfSBlbHNlIHsKQEAgLTI4OCw3ICszMTIsNyBAQAogICAgIG1OZWVkQ2F0Y2hVcC5yZXF1ZXN0KCk7ICAvLyBBc2sgZGF0YSBwcm9jZXNzaW5nIGNvZGUgdG8gY2F0Y2ggdXAgd2hlbiBmaXJzdCB0aW1lc3RhbXAgcmVjZWl2ZWQuCiAKICAgICAvLyBTdGFydCBkYXRhIGNhbGxiYWNrIHRocmVhZC4KLSAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSyAmJiBnZXREYXRhQ2FsbGJhY2tQcm9jKCkgIT0gbnVsbHB0cikgeworICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LICYmIGlzRGF0YUNhbGxiYWNrU2V0KCkpIHsKICAgICAgICAgLy8gTGF1bmNoIHRoZSBjYWxsYmFjayBsb29wIHRocmVhZC4KICAgICAgICAgaW50NjRfdCBwZXJpb2ROYW5vcyA9IG1DYWxsYmFja0ZyYW1lcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBQVVESU9fTkFOT1NfUEVSX1NFQ09ORApAQCAtMzI5LDggKzM1MywxMyBAQAogICAgIH0KIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnJlcXVlc3RTdG9wSW50ZXJuYWwoKQorYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnJlcXVlc3RTdG9wKCkKIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gc3RvcENhbGxiYWNrKCk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgPT0gQUFVRElPX0hBTkRMRV9JTlZBTElEKSB7CiAgICAgICAgIEFMT0dFKCJyZXF1ZXN0U3RvcEludGVybmFsKCkgbVNlcnZpY2VTdHJlYW1IYW5kbGUgaW52YWxpZCA9IDB4JTA4WCIsCiAgICAgICAgICAgICAgIG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKQEAgLTM0NCwxNiArMzczLDYgQEAKICAgICByZXR1cm4gbVNlcnZpY2VJbnRlcmZhY2Uuc3RvcFN0cmVhbShtU2VydmljZVN0cmVhbUhhbmRsZSk7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpyZXF1ZXN0U3RvcCgpCi17Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHN0b3BDYWxsYmFjaygpOwotICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIHJlc3VsdCA9IHJlcXVlc3RTdG9wSW50ZXJuYWwoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6cmVnaXN0ZXJUaHJlYWQoKSB7CiAgICAgaWYgKG1TZXJ2aWNlU3RyZWFtSGFuZGxlID09IEFBVURJT19IQU5ETEVfSU5WQUxJRCkgewogICAgICAgICBBTE9HRSgicmVnaXN0ZXJUaHJlYWQoKSBtU2VydmljZVN0cmVhbUhhbmRsZSBpbnZhbGlkIik7CkBAIC0zNzMsMTkgKzM5MiwyNSBAQAogfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6c3RhcnRDbGllbnQoY29uc3QgYW5kcm9pZDo6QXVkaW9DbGllbnQmIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpjbGllbnRIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SGFuZGxlKSB7CisgICAgQUxPR1YoIiVzKCkgY2FsbGVkIiwgX19mdW5jX18pOwogICAgIGlmIChtU2VydmljZVN0cmVhbUhhbmRsZSA9PSBBQVVESU9fSEFORExFX0lOVkFMSUQpIHsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KLQotICAgIHJldHVybiBtU2VydmljZUludGVyZmFjZS5zdGFydENsaWVudChtU2VydmljZVN0cmVhbUhhbmRsZSwgY2xpZW50LCBjbGllbnRIYW5kbGUpOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSAgbVNlcnZpY2VJbnRlcmZhY2Uuc3RhcnRDbGllbnQobVNlcnZpY2VTdHJlYW1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQsIHBvcnRIYW5kbGUpOworICAgIEFMT0dWKCIlcyglZCkgcmV0dXJuaW5nICVkIiwgX19mdW5jX18sICpwb3J0SGFuZGxlLCByZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpzdG9wQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgY2xpZW50SGFuZGxlKSB7CithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6c3RvcENsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRIYW5kbGUpIHsKKyAgICBBTE9HVigiJXMoJWQpIGNhbGxlZCIsIF9fZnVuY19fLCBwb3J0SGFuZGxlKTsKICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgPT0gQUFVRElPX0hBTkRMRV9JTlZBTElEKSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9Ci0gICAgcmV0dXJuIG1TZXJ2aWNlSW50ZXJmYWNlLnN0b3BDbGllbnQobVNlcnZpY2VTdHJlYW1IYW5kbGUsIGNsaWVudEhhbmRsZSk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IG1TZXJ2aWNlSW50ZXJmYWNlLnN0b3BDbGllbnQobVNlcnZpY2VTdHJlYW1IYW5kbGUsIHBvcnRIYW5kbGUpOworICAgIEFMT0dWKCIlcyglZCkgcmV0dXJuaW5nICVkIiwgX19mdW5jX18sIHBvcnRIYW5kbGUsIHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OmdldFRpbWVzdGFtcChjbG9ja2lkX3QgY2xvY2tJZCwKQEAgLTQ0OCwzNCArNDczLDMwIEBACiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKICAgICBzd2l0Y2ggKG1lc3NhZ2UtPmV2ZW50LmV2ZW50KSB7CiAgICAgICAgIGNhc2UgQUFVRElPX1NFUlZJQ0VfRVZFTlRfU1RBUlRFRDoKLSAgICAgICAgICAgIEFMT0dEKCJBdWRpb1N0cmVhbUludGVybmFsOjpvbkV2ZW50RnJvbVNlcnZlcigpIGdvdCBBQVVESU9fU0VSVklDRV9FVkVOVF9TVEFSVEVEIik7CisgICAgICAgICAgICBBTE9HRCgiJXMgLSBnb3QgQUFVRElPX1NFUlZJQ0VfRVZFTlRfU1RBUlRFRCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIGlmIChnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRJTkcpIHsKICAgICAgICAgICAgICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQUFVRElPX1NFUlZJQ0VfRVZFTlRfUEFVU0VEOgotICAgICAgICAgICAgQUxPR0QoIkF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9uRXZlbnRGcm9tU2VydmVyKCkgZ290IEFBVURJT19TRVJWSUNFX0VWRU5UX1BBVVNFRCIpOworICAgICAgICAgICAgQUxPR0QoIiVzIC0gZ290IEFBVURJT19TRVJWSUNFX0VWRU5UX1BBVVNFRCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIGlmIChnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0lORykgewogICAgICAgICAgICAgICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VEKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFBVURJT19TRVJWSUNFX0VWRU5UX1NUT1BQRUQ6Ci0gICAgICAgICAgICBBTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6b25FdmVudEZyb21TZXJ2ZXIoKSBnb3QgQUFVRElPX1NFUlZJQ0VfRVZFTlRfU1RPUFBFRCIpOworICAgICAgICAgICAgQUxPR0QoIiVzIC0gZ290IEFBVURJT19TRVJWSUNFX0VWRU5UX1NUT1BQRUQiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICBpZiAoZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQSU5HKSB7CiAgICAgICAgICAgICAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUEVEKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFBVURJT19TRVJWSUNFX0VWRU5UX0ZMVVNIRUQ6Ci0gICAgICAgICAgICBBTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6b25FdmVudEZyb21TZXJ2ZXIoKSBnb3QgQUFVRElPX1NFUlZJQ0VfRVZFTlRfRkxVU0hFRCIpOworICAgICAgICAgICAgQUxPR0QoIiVzIC0gZ290IEFBVURJT19TRVJWSUNFX0VWRU5UX0ZMVVNIRUQiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICBpZiAoZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNISU5HKSB7CiAgICAgICAgICAgICAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9GTFVTSEVEKTsKICAgICAgICAgICAgICAgICBvbkZsdXNoRnJvbVNlcnZlcigpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQUFVRElPX1NFUlZJQ0VfRVZFTlRfQ0xPU0VEOgotICAgICAgICAgICAgQUxPR0QoIkF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9uRXZlbnRGcm9tU2VydmVyKCkgZ290IEFBVURJT19TRVJWSUNFX0VWRU5UX0NMT1NFRCIpOwotICAgICAgICAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQpOwotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQUFVRElPX1NFUlZJQ0VfRVZFTlRfRElTQ09OTkVDVEVEOgogICAgICAgICAgICAgLy8gUHJldmVudCBoYXJkd2FyZSBmcm9tIGxvb3Bpbmcgb24gb2xkIGRhdGEgYW5kIG1ha2luZyBidXp6aW5nIHNvdW5kcy4KICAgICAgICAgICAgIGlmIChnZXREaXJlY3Rpb24oKSA9PSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCkgewpAQCAtNDgzLDE4ICs1MDQsMTggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQ7CiAgICAgICAgICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCk7Ci0gICAgICAgICAgICBBTE9HVygiV0FSTklORyAtIEF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9uRXZlbnRGcm9tU2VydmVyKCkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgQUFVRElPX1NFUlZJQ0VfRVZFTlRfRElTQ09OTkVDVEVEIC0gRklGTyBjbGVhcmVkIik7CisgICAgICAgICAgICBBTE9HVygiJXMgLSBBQVVESU9fU0VSVklDRV9FVkVOVF9ESVNDT05ORUNURUQgLSBGSUZPIGNsZWFyZWQiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBQVVESU9fU0VSVklDRV9FVkVOVF9WT0xVTUU6CisgICAgICAgICAgICBBTE9HRCgiJXMgLSBBQVVESU9fU0VSVklDRV9FVkVOVF9WT0xVTUUgJWxmIiwgX19mdW5jX18sIG1lc3NhZ2UtPmV2ZW50LmRhdGFEb3VibGUpOwogICAgICAgICAgICAgbVN0cmVhbVZvbHVtZSA9IChmbG9hdCltZXNzYWdlLT5ldmVudC5kYXRhRG91YmxlOwogICAgICAgICAgICAgZG9TZXRWb2x1bWUoKTsKLSAgICAgICAgICAgIEFMT0dEKCJBdWRpb1N0cmVhbUludGVybmFsOjpvbkV2ZW50RnJvbVNlcnZlcigpIEFBVURJT19TRVJWSUNFX0VWRU5UX1ZPTFVNRSAlbGYiLAotICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS0+ZXZlbnQuZGF0YURvdWJsZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBQVVESU9fU0VSVklDRV9FVkVOVF9YUlVOOgorICAgICAgICAgICAgbVhSdW5Db3VudCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KG1lc3NhZ2UtPmV2ZW50LmRhdGFMb25nKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1coIldBUk5JTkcgLSBBdWRpb1N0cmVhbUludGVybmFsOjpvbkV2ZW50RnJvbVNlcnZlcigpIFVucmVjb2duaXplZCBldmVudCA9ICVkIiwKLSAgICAgICAgICAgICAgICAgKGludCkgbWVzc2FnZS0+ZXZlbnQuZXZlbnQpOworICAgICAgICAgICAgQUxPR0UoIiVzIC0gVW5yZWNvZ25pemVkIGV2ZW50ID0gJWQiLCBfX2Z1bmNfXywgKGludCkgbWVzc2FnZS0+ZXZlbnQuZXZlbnQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CkBAIC01MTksOCArNTQwLDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBBTE9HRSgiV0FSTklORyAtIGRyYWluVGltZXN0YW1wc0Zyb21TZXJ2aWNlKCkgVW5yZWNvZ25pemVkIHdoYXQgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgKGludCkgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMgLSB1bnJlY29nbml6ZWQgbWVzc2FnZS53aGF0ID0gJWQiLCBfX2Z1bmNfXywgKGludCkgbWVzc2FnZS53aGF0KTsKICAgICAgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSU5URVJOQUw7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTUzMyw3ICs1NTMsNiBAQAogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAKICAgICB3aGlsZSAocmVzdWx0ID09IEFBVURJT19PSykgewotICAgICAgICAvL0FMT0dEKCJBdWRpb1N0cmVhbUludGVybmFsOjpwcm9jZXNzQ29tbWFuZHMoKSAtIGxvb3BpbmcsICVkIiwgcmVzdWx0KTsKICAgICAgICAgQUF1ZGlvU2VydmljZU1lc3NhZ2UgbWVzc2FnZTsKICAgICAgICAgaWYgKG1BdWRpb0VuZHBvaW50LnJlYWRVcENvbW1hbmQoJm1lc3NhZ2UpICE9IDEpIHsKICAgICAgICAgICAgIGJyZWFrOyAvLyBubyBjb21tYW5kIHRoaXMgdGltZSwgbm8gcHJvYmxlbQpAQCAtNTUyLDggKzU3MSw3IEBACiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoIldBUk5JTkcgLSBwcm9jZXNzQ29tbWFuZHMoKSBVbnJlY29nbml6ZWQgd2hhdCA9ICVkIiwKLSAgICAgICAgICAgICAgICAgKGludCkgbWVzc2FnZS53aGF0KTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyAtIHVucmVjb2duaXplZCBtZXNzYWdlLndoYXQgPSAlZCIsIF9fZnVuY19fLCAoaW50KSBtZXNzYWdlLndoYXQpOwogICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0lOVEVSTkFMOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTYxNCwxMyArNjMyLDEzIEBACiAgICAgICAgICAgICBpZiAod2FrZVRpbWVOYW5vcyA+IGRlYWRsaW5lTmFub3MpIHsKICAgICAgICAgICAgICAgICAvLyBJZiB3ZSB0aW1lIG91dCwganVzdCByZXR1cm4gdGhlIGZyYW1lc1dyaXR0ZW4gc28gZmFyLgogICAgICAgICAgICAgICAgIC8vIFRPRE8gcmVtb3ZlIGFmdGVyIHdlIGZpeCB0aGUgZGVhZGxpbmUgYnVnCi0gICAgICAgICAgICAgICAgQUxPR1coIkF1ZGlvU3RyZWFtSW50ZXJuYWw6OnByb2Nlc3NEYXRhKCk6IGVudGVyZWQgYXQgJWxsZCBuYW5vcywgY3VycmVudGx5ICVsbGQiLAorICAgICAgICAgICAgICAgIEFMT0dXKCJwcm9jZXNzRGF0YSgpOiBlbnRlcmVkIGF0ICVsbGQgbmFub3MsIGN1cnJlbnRseSAlbGxkIiwKICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBlbnRyeVRpbWVOYW5vcywgKGxvbmcgbG9uZykgY3VycmVudFRpbWVOYW5vcyk7Ci0gICAgICAgICAgICAgICAgQUxPR1coIkF1ZGlvU3RyZWFtSW50ZXJuYWw6OnByb2Nlc3NEYXRhKCk6IFRJTUVPVVQgYWZ0ZXIgJWxsZCBuYW5vcyIsCisgICAgICAgICAgICAgICAgQUxPR1coInByb2Nlc3NEYXRhKCk6IFRJTUVPVVQgYWZ0ZXIgJWxsZCBuYW5vcyIsCiAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgdGltZW91dE5hbm9zZWNvbmRzKTsKLSAgICAgICAgICAgICAgICBBTE9HVygiQXVkaW9TdHJlYW1JbnRlcm5hbDo6cHJvY2Vzc0RhdGEoKTogd2FrZVRpbWUgPSAlbGxkLCBkZWFkbGluZSA9ICVsbGQgbmFub3MiLAorICAgICAgICAgICAgICAgIEFMT0dXKCJwcm9jZXNzRGF0YSgpOiB3YWtlVGltZSA9ICVsbGQsIGRlYWRsaW5lID0gJWxsZCBuYW5vcyIsCiAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgd2FrZVRpbWVOYW5vcywgKGxvbmcgbG9uZykgZGVhZGxpbmVOYW5vcyk7Ci0gICAgICAgICAgICAgICAgQUxPR1coIkF1ZGlvU3RyZWFtSW50ZXJuYWw6OnByb2Nlc3NEYXRhKCk6IHBhc3QgZGVhZGxpbmUgYnkgJWQgbWljcm9zIiwKKyAgICAgICAgICAgICAgICBBTE9HVygicHJvY2Vzc0RhdGEoKTogcGFzdCBkZWFkbGluZSBieSAlZCBtaWNyb3MiLAogICAgICAgICAgICAgICAgICAgICAgIChpbnQpKCh3YWtlVGltZU5hbm9zIC0gZGVhZGxpbmVOYW5vcykgLyBBQVVESU9fTkFOT1NfUEVSX01JQ1JPU0VDT05EKSk7CiAgICAgICAgICAgICAgICAgbUNsb2NrTW9kZWwuZHVtcCgpOwogICAgICAgICAgICAgICAgIG1BdWRpb0VuZHBvaW50LmR1bXAoKTsKQEAgLTY1NSwxNCArNjczLDI5IEBACiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpzZXRCdWZmZXJTaXplKGludDMyX3QgcmVxdWVzdGVkRnJhbWVzKSB7CisgICAgaW50MzJfdCBhZGp1c3RlZEZyYW1lcyA9IHJlcXVlc3RlZEZyYW1lczsKICAgICBpbnQzMl90IGFjdHVhbEZyYW1lcyA9IDA7Ci0gICAgLy8gUm91bmQgdG8gdGhlIG5leHQgaGlnaGVzdCBidXJzdCBzaXplLgotICAgIGlmIChnZXRGcmFtZXNQZXJCdXJzdCgpID4gMCkgewotICAgICAgICBpbnQzMl90IG51bUJ1cnN0cyA9IChyZXF1ZXN0ZWRGcmFtZXMgKyBnZXRGcmFtZXNQZXJCdXJzdCgpIC0gMSkgLyBnZXRGcmFtZXNQZXJCdXJzdCgpOwotICAgICAgICByZXF1ZXN0ZWRGcmFtZXMgPSBudW1CdXJzdHMgKiBnZXRGcmFtZXNQZXJCdXJzdCgpOworICAgIGludDMyX3QgbWF4aW11bVNpemUgPSBnZXRCdWZmZXJDYXBhY2l0eSgpOworCisgICAgLy8gQ2xpcCB0byBtaW5pbXVtIHNpemUgc28gdGhhdCByb3VuZGluZyB1cCB3aWxsIHdvcmsgYmV0dGVyLgorICAgIGlmIChhZGp1c3RlZEZyYW1lcyA8IDEpIHsKKyAgICAgICAgYWRqdXN0ZWRGcmFtZXMgPSAxOwogICAgIH0KIAotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBtQXVkaW9FbmRwb2ludC5zZXRCdWZmZXJTaXplSW5GcmFtZXMocmVxdWVzdGVkRnJhbWVzLCAmYWN0dWFsRnJhbWVzKTsKKyAgICBpZiAoYWRqdXN0ZWRGcmFtZXMgPiBtYXhpbXVtU2l6ZSkgeworICAgICAgICAvLyBDbGlwIHRvIG1heGltdW0gc2l6ZS4KKyAgICAgICAgYWRqdXN0ZWRGcmFtZXMgPSBtYXhpbXVtU2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBSb3VuZCB0byB0aGUgbmV4dCBoaWdoZXN0IGJ1cnN0IHNpemUuCisgICAgICAgIGludDMyX3QgbnVtQnVyc3RzID0gKGFkanVzdGVkRnJhbWVzICsgbUZyYW1lc1BlckJ1cnN0IC0gMSkgLyBtRnJhbWVzUGVyQnVyc3Q7CisgICAgICAgIGFkanVzdGVkRnJhbWVzID0gbnVtQnVyc3RzICogbUZyYW1lc1BlckJ1cnN0OworICAgICAgICAvLyBSb3VuZGluZyBtYXkgaGF2ZSBnb25lIGFib3ZlIG1heGltdW0uCisgICAgICAgIGlmIChhZGp1c3RlZEZyYW1lcyA+IG1heGltdW1TaXplKSB7CisgICAgICAgICAgICBhZGp1c3RlZEZyYW1lcyA9IG1heGltdW1TaXplOworICAgICAgICB9CisgICAgfQorCisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IG1BdWRpb0VuZHBvaW50LnNldEJ1ZmZlclNpemVJbkZyYW1lcyhhZGp1c3RlZEZyYW1lcywgJmFjdHVhbEZyYW1lcyk7CiAgICAgQUxPR0QoInNldEJ1ZmZlclNpemUoKSByZXEgPSAlZCA9PiAlZCIsIHJlcXVlc3RlZEZyYW1lcywgYWN0dWFsRnJhbWVzKTsKICAgICBpZiAocmVzdWx0IDwgMCkgewogICAgICAgICByZXR1cm4gcmVzdWx0OwpAQCAtNjgwLDcgKzcxMyw3IEBACiB9CiAKIGludDMyX3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6Z2V0RnJhbWVzUGVyQnVyc3QoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1FbmRwb2ludERlc2NyaXB0b3IuZGF0YVF1ZXVlRGVzY3JpcHRvci5mcmFtZXNQZXJCdXJzdDsKKyAgICByZXR1cm4gbUZyYW1lc1BlckJ1cnN0OwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6am9pblRocmVhZCh2b2lkKiogcmV0dXJuQXJnKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgKaW5kZXggNDcwMjRjMC4uMDQyNWNkNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaApAQCAtMzQsNiArMzQsMTIgQEAKIAogbmFtZXNwYWNlIGFhdWRpbyB7CiAKKyAgICAvLyBUaGVzZSBhcmUgaW50ZW5kZWQgdG8gYmUgb3V0c2lkZSB0aGUgcmFuZ2Ugb2Ygd2hhdCBpcyBub3JtYWxseSBlbmNvdW50ZXJlZC4KKyAgICAvLyBUT0RPIE1BWGVzIHNob3VsZCBwcm9iYWJseSBiZSBtdWNoIGJpZ2dlci4KKyAgICBjb25zdGV4cHIgaW50MzJfdCBNSU5fRlJBTUVTX1BFUl9CVVJTVCA9IDE2OyAvLyBhcmJpdHJhcnkKKyAgICBjb25zdGV4cHIgaW50MzJfdCBNQVhfRlJBTUVTX1BFUl9CVVJTVCA9IDE2ICogMTAyNDsgIC8vIGFyYml0cmFyeQorICAgIGNvbnN0ZXhwciBpbnQzMl90IE1BWF9CVUZGRVJfQ0FQQUNJVFlfSU5fRlJBTUVTID0gMzIgKiAxMDI0OyAgLy8gYXJiaXRyYXJ5CisKIC8vIEEgc3RyZWFtIHRoYXQgdGFsa3MgdG8gdGhlIEFBdWRpb1NlcnZpY2Ugb3IgZGlyZWN0bHkgdG8gYSBIQUwuCiBjbGFzcyBBdWRpb1N0cmVhbUludGVybmFsIDogcHVibGljIEF1ZGlvU3RyZWFtIHsKIApAQCAtMTE1LDggKzEyMSw2IEBACiAKICAgICBhYXVkaW9fcmVzdWx0X3QgcHJvY2Vzc0NvbW1hbmRzKCk7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVxdWVzdFN0b3BJbnRlcm5hbCgpOwotCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHN0b3BDYWxsYmFjaygpOwogCiAgICAgdmlydHVhbCB2b2lkIGFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oKSA9IDA7CkBAIC0xMzQsMTQgKzEzOCwxOSBAQAogICAgIC8vIENhbGN1bGF0ZSB0aW1lb3V0IGZvciBhbiBvcGVyYXRpb24gaW52b2x2aW5nIGZyYW1lc1Blck9wZXJhdGlvbi4KICAgICBpbnQ2NF90IGNhbGN1bGF0ZVJlYXNvbmFibGVUaW1lb3V0KGludDMyX3QgZnJhbWVzUGVyT3BlcmF0aW9uKTsKIAotICAgIGFhdWRpb19mb3JtYXRfdCAgICAgICAgICBtRGV2aWNlRm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDsKKyAgICBpbnQzMl90IGdldERldmljZUNoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VDaGFubmVsQ291bnQ7IH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBydW5uaW5nIGluIGF1ZGlvIHNlcnZpY2UsIHZlcnN1cyBpbiBhcHAgcHJvY2VzcworICAgICAqLworICAgIGJvb2wgaXNJblNlcnZpY2UoKSBjb25zdCB7IHJldHVybiBtSW5TZXJ2aWNlOyB9CiAKICAgICBJc29jaHJvbm91c0Nsb2NrTW9kZWwgICAgbUNsb2NrTW9kZWw7ICAgICAgLy8gdGltaW5nIG1vZGVsIGZvciBjaGFzaW5nIHRoZSBIQUwKIAogICAgIEF1ZGlvRW5kcG9pbnQgICAgICAgICAgICBtQXVkaW9FbmRwb2ludDsgICAvLyBzb3VyY2UgZm9yIHJlYWRzIG9yIHNpbmsgZm9yIHdyaXRlcwogICAgIGFhdWRpb19oYW5kbGVfdCAgICAgICAgICBtU2VydmljZVN0cmVhbUhhbmRsZTsgLy8gb3BhcXVlIGhhbmRsZSByZXR1cm5lZCBmcm9tIHNlcnZpY2UKIAotICAgIGludDMyX3QgICAgICAgICAgICAgICAgICBtRnJhbWVzUGVyQnVyc3Q7ICAgICAvLyBmcmFtZXMgcGVyIEhBTCB0cmFuc2ZlcgorICAgIGludDMyX3QgICAgICAgICAgICAgICAgICBtRnJhbWVzUGVyQnVyc3QgPSBNSU5fRlJBTUVTX1BFUl9CVVJTVDsgLy8gZnJhbWVzIHBlciBIQUwgdHJhbnNmZXIKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgbVhSdW5Db3VudCA9IDA7ICAgICAgLy8gaG93IG1hbnkgdW5kZXJydW4gZXZlbnRzPwogCiAgICAgLy8gT2Zmc2V0IGZyb20gdW5kZXJseWluZyBmcmFtZSBwb3NpdGlvbi4KQEAgLTE4Myw2ICsxOTIsOCBAQAogICAgIEVuZHBvaW50RGVzY3JpcHRvciAgICAgICBtRW5kcG9pbnREZXNjcmlwdG9yOyAvLyBidWZmZXIgZGVzY3JpcHRpb24gd2l0aCByZXNvbHZlZCBhZGRyZXNzZXMKIAogICAgIGludDY0X3QgICAgICAgICAgICAgICAgICBtU2VydmljZUxhdGVuY3lOYW5vcyA9IDA7CisKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgbURldmljZUNoYW5uZWxDb3VudCA9IDA7CiB9OwogCiB9IC8qIG5hbWVzcGFjZSBhYXVkaW8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcAppbmRleCBiNzkyZWNkLi4wNzE5ZmUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwCkBAIC0xNCw3ICsxNCw4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIExPR19UQUcgKG1JblNlcnZpY2UgPyAiQUF1ZGlvU2VydmljZSIgOiAiQUF1ZGlvIikKKyNkZWZpbmUgTE9HX1RBRyAobUluU2VydmljZSA/ICJBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZV9TZXJ2aWNlIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogIkF1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlX0NsaWVudCIpCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKQEAgLTEwMSw3ICsxMDIsOCBAQAogICAgIH0KIAogICAgIC8vIElmIHRoZSB3cml0ZSBpbmRleCBwYXNzZWQgdGhlIHJlYWQgaW5kZXggdGhlbiBjb25zaWRlciBpdCBhbiBvdmVycnVuLgotICAgIGlmIChtQXVkaW9FbmRwb2ludC5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpIDwgMCkgeworICAgIC8vIEZvciBzaGFyZWQgc3RyZWFtcywgdGhlIHhSdW5Db3VudCBpcyBwYXNzZWQgdXAgZnJvbSB0aGUgc2VydmljZS4KKyAgICBpZiAobUF1ZGlvRW5kcG9pbnQuaXNGcmVlUnVubmluZygpICYmIG1BdWRpb0VuZHBvaW50LmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCkgPCAwKSB7CiAgICAgICAgIG1YUnVuQ291bnQrKzsKICAgICAgICAgaWYgKEFUUkFDRV9FTkFCTEVEKCkpIHsKICAgICAgICAgICAgIEFUUkFDRV9JTlQoImFhT3ZlclJ1bnMiLCBtWFJ1bkNvdW50KTsKQEAgLTE1Miw3ICsxNTQsNyBAQAogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmU6OnJlYWROb3dXaXRoQ29udmVyc2lvbih2b2lkICpidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMpIHsKLSAgICAvLyBBTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmU6OnJlYWROb3dXaXRoQ29udmVyc2lvbiglcCwgJWQpIiwKKyAgICAvLyBBTE9HRCgicmVhZE5vd1dpdGhDb252ZXJzaW9uKCVwLCAlZCkiLAogICAgIC8vICAgICAgICAgICAgICBidWZmZXIsIG51bUZyYW1lcyk7CiAgICAgV3JhcHBpbmdCdWZmZXIgd3JhcHBpbmdCdWZmZXI7CiAgICAgdWludDhfdCAqZGVzdGluYXRpb24gPSAodWludDhfdCAqKSBidWZmZXI7CkBAIC0xNzQsMTYgKzE3NiwxNiBAQAogICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNUb1Byb2Nlc3MgKiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKIAogICAgICAgICAvLyBUT0RPIGZhY3RvciB0aGlzIG91dCBpbnRvIGEgdXRpbGl0eSBmdW5jdGlvbgotICAgICAgICBpZiAobURldmljZUZvcm1hdCA9PSBnZXRGb3JtYXQoKSkgeworICAgICAgICBpZiAoZ2V0RGV2aWNlRm9ybWF0KCkgPT0gZ2V0Rm9ybWF0KCkpIHsKICAgICAgICAgICAgIG1lbWNweShkZXN0aW5hdGlvbiwgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLCBudW1CeXRlcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAobURldmljZUZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYKKyAgICAgICAgfSBlbHNlIGlmIChnZXREZXZpY2VGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYKICAgICAgICAgICAgICAgICAgICAmJiBnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewogICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoCiAgICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwKICAgICAgICAgICAgICAgICAgICAgKGZsb2F0ICopIGRlc3RpbmF0aW9uLAogICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLAogICAgICAgICAgICAgICAgICAgICAxLjBmKTsKLSAgICAgICAgfSBlbHNlIGlmIChtRGV2aWNlRm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUCisgICAgICAgIH0gZWxzZSBpZiAoZ2V0RGV2aWNlRm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQKICAgICAgICAgICAgICAgICAgICAmJiBnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfZmxvYXRUb1BjbTE2KAogICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLApAQCAtMjAxLDcgKzIwMyw3IEBACiAgICAgaW50MzJfdCBmcmFtZXNQcm9jZXNzZWQgPSBudW1GcmFtZXMgLSBmcmFtZXNMZWZ0OwogICAgIG1BdWRpb0VuZHBvaW50LmFkdmFuY2VSZWFkSW5kZXgoZnJhbWVzUHJvY2Vzc2VkKTsKIAotICAgIC8vQUxPR0QoIkF1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlOjpyZWFkTm93V2l0aENvbnZlcnNpb24oKSByZXR1cm5zICVkIiwgZnJhbWVzUHJvY2Vzc2VkKTsKKyAgICAvL0FMT0dEKCJyZWFkTm93V2l0aENvbnZlcnNpb24oKSByZXR1cm5zICVkIiwgZnJhbWVzUHJvY2Vzc2VkKTsKICAgICByZXR1cm4gZnJhbWVzUHJvY2Vzc2VkOwogfQogCkBAIC0yMTUsMTQgKzIxNywxNCBAQAogICAgIC8vIFByZXZlbnQgcmV0cm9ncmFkZSBtb3Rpb24uCiAgICAgbUxhc3RGcmFtZXNXcml0dGVuID0gc3RkOjptYXgobUxhc3RGcmFtZXNXcml0dGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc1dyaXR0ZW5IYXJkd2FyZSArIG1GcmFtZXNPZmZzZXRGcm9tU2VydmljZSk7Ci0gICAgLy9BTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmU6OmdldEZyYW1lc1dyaXR0ZW4oKSByZXR1cm5zICVsbGQiLAorICAgIC8vQUxPR0QoImdldEZyYW1lc1dyaXR0ZW4oKSByZXR1cm5zICVsbGQiLAogICAgIC8vICAgICAgKGxvbmcgbG9uZyltTGFzdEZyYW1lc1dyaXR0ZW4pOwogICAgIHJldHVybiBtTGFzdEZyYW1lc1dyaXR0ZW47CiB9CiAKIGludDY0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmU6OmdldEZyYW1lc1JlYWQoKSB7CiAgICAgaW50NjRfdCBmcmFtZXMgPSBtQXVkaW9FbmRwb2ludC5nZXREYXRhUmVhZENvdW50ZXIoKSArIG1GcmFtZXNPZmZzZXRGcm9tU2VydmljZTsKLSAgICAvL0FMT0dEKCJBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZTo6Z2V0RnJhbWVzUmVhZCgpIHJldHVybnMgJWxsZCIsIChsb25nIGxvbmcpZnJhbWVzKTsKKyAgICAvL0FMT0dEKCJnZXRGcmFtZXNSZWFkKCkgcmV0dXJucyAlbGxkIiwgKGxvbmcgbG9uZylmcmFtZXMpOwogICAgIHJldHVybiBmcmFtZXM7CiB9CiAKQEAgLTIzMCw4ICsyMzIsNyBAQAogdm9pZCAqQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmU6OmNhbGxiYWNrTG9vcCgpIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwogICAgIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IGNhbGxiYWNrUmVzdWx0ID0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9DT05USU5VRTsKLSAgICBBQXVkaW9TdHJlYW1fZGF0YUNhbGxiYWNrIGFwcENhbGxiYWNrID0gZ2V0RGF0YUNhbGxiYWNrUHJvYygpOwotICAgIGlmIChhcHBDYWxsYmFjayA9PSBudWxscHRyKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWlzRGF0YUNhbGxiYWNrU2V0KCkpIHJldHVybiBOVUxMOwogCiAgICAgLy8gcmVzdWx0IG1pZ2h0IGJlIGEgZnJhbWUgY291bnQKICAgICB3aGlsZSAobUNhbGxiYWNrRW5hYmxlZC5sb2FkKCkgJiYgaXNBY3RpdmUoKSAmJiAocmVzdWx0ID49IDApKSB7CkBAIC0yNDIsMzUgKzI0MywyNSBAQAogICAgICAgICAvLyBUaGlzIGlzIGEgQkxPQ0tJTkcgUkVBRCEKICAgICAgICAgcmVzdWx0ID0gcmVhZChtQ2FsbGJhY2tCdWZmZXIsIG1DYWxsYmFja0ZyYW1lcywgdGltZW91dE5hbm9zKTsKICAgICAgICAgaWYgKChyZXN1bHQgIT0gbUNhbGxiYWNrRnJhbWVzKSkgewotICAgICAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlKCk6IGNhbGxiYWNrTG9vcDogcmVhZCgpIHJldHVybmVkICVkIiwgcmVzdWx0KTsKKyAgICAgICAgICAgIEFMT0dFKCJjYWxsYmFja0xvb3A6IHJlYWQoKSByZXR1cm5lZCAlZCIsIHJlc3VsdCk7CiAgICAgICAgICAgICBpZiAocmVzdWx0ID49IDApIHsKICAgICAgICAgICAgICAgICAvLyBPbmx5IHJlYWQgc29tZSBvZiB0aGUgZnJhbWVzIHJlcXVlc3RlZC4gTXVzdCBoYXZlIHRpbWVkIG91dC4KICAgICAgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfVElNRU9VVDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFBdWRpb1N0cmVhbV9lcnJvckNhbGxiYWNrIGVycm9yQ2FsbGJhY2sgPSBnZXRFcnJvckNhbGxiYWNrUHJvYygpOwotICAgICAgICAgICAgaWYgKGVycm9yQ2FsbGJhY2sgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICgqZXJyb3JDYWxsYmFjaykoCi0gICAgICAgICAgICAgICAgICAgICAgICAoQUF1ZGlvU3RyZWFtICopIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRFcnJvckNhbGxiYWNrVXNlckRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtYXliZUNhbGxFcnJvckNhbGxiYWNrKHJlc3VsdCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIC8vIENhbGwgYXBwbGljYXRpb24gdXNpbmcgdGhlIEFBdWRpbyBjYWxsYmFjayBpbnRlcmZhY2UuCi0gICAgICAgIGNhbGxiYWNrUmVzdWx0ID0gKCphcHBDYWxsYmFjaykoCi0gICAgICAgICAgICAgICAgKEFBdWRpb1N0cmVhbSAqKSB0aGlzLAotICAgICAgICAgICAgICAgIGdldERhdGFDYWxsYmFja1VzZXJEYXRhKCksCi0gICAgICAgICAgICAgICAgbUNhbGxiYWNrQnVmZmVyLAotICAgICAgICAgICAgICAgIG1DYWxsYmFja0ZyYW1lcyk7CisgICAgICAgIGNhbGxiYWNrUmVzdWx0ID0gbWF5YmVDYWxsRGF0YUNhbGxiYWNrKG1DYWxsYmFja0J1ZmZlciwgbUNhbGxiYWNrRnJhbWVzKTsKIAogICAgICAgICBpZiAoY2FsbGJhY2tSZXN1bHQgPT0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QKSB7Ci0gICAgICAgICAgICBBTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUoKTogY2FsbGJhY2sgcmV0dXJuZWQgQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QIik7CisgICAgICAgICAgICBBTE9HRCgiY2FsbGJhY2sgcmV0dXJuZWQgQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QIik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAotICAgIEFMT0dEKCJBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZSgpOiBjYWxsYmFja0xvb3AoKSBleGl0aW5nLCByZXN1bHQgPSAlZCwgaXNBY3RpdmUoKSA9ICVkIiwKKyAgICBBTE9HRCgiY2FsbGJhY2tMb29wKCkgZXhpdGluZywgcmVzdWx0ID0gJWQsIGlzQWN0aXZlKCkgPSAlZCIsCiAgICAgICAgICAgcmVzdWx0LCAoaW50KSBpc0FjdGl2ZSgpKTsKICAgICByZXR1cm4gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcAppbmRleCAxZTAyZWVlLi43OTViYTJjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwCkBAIC0xNCw3ICsxNCw4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIExPR19UQUcgKG1JblNlcnZpY2UgPyAiQUF1ZGlvU2VydmljZSIgOiAiQUF1ZGlvIikKKyNkZWZpbmUgTE9HX1RBRyAobUluU2VydmljZSA/ICJBdWRpb1N0cmVhbUludGVybmFsUGxheV9TZXJ2aWNlIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogIkF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5X0NsaWVudCIpCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKQEAgLTM3LDEyICszOCwyNiBAQAogCiBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6fkF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5KCkge30KIAorY29uc3RleHByIGludCBrUmFtcE1TZWMgPSAxMDsgLy8gdGltZSB0byBhcHBseSBhIGNoYW5nZSBpbiB2b2x1bWUKIAotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5OjpyZXF1ZXN0UGF1c2VJbnRlcm5hbCgpCithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6Om9wZW4oY29uc3QgQXVkaW9TdHJlYW1CdWlsZGVyICZidWlsZGVyKSB7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9wZW4oYnVpbGRlcik7CisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgLy8gU2FtcGxlIHJhdGUgaXMgY29uc3RyYWluZWQgdG8gY29tbW9uIHZhbHVlcyBieSBub3cgYW5kIHNob3VsZCBub3Qgb3ZlcmZsb3cuCisgICAgICAgIGludDMyX3QgbnVtRnJhbWVzID0ga1JhbXBNU2VjICogZ2V0U2FtcGxlUmF0ZSgpIC8gQUFVRElPX01JTExJU19QRVJfU0VDT05EOworICAgICAgICBtVm9sdW1lUmFtcC5zZXRMZW5ndGhJbkZyYW1lcyhudW1GcmFtZXMpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OnJlcXVlc3RQYXVzZSgpCiB7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHN0b3BDYWxsYmFjaygpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogICAgIGlmIChtU2VydmljZVN0cmVhbUhhbmRsZSA9PSBBQVVESU9fSEFORExFX0lOVkFMSUQpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtSW50ZXJuYWw6OnJlcXVlc3RQYXVzZUludGVybmFsKCkgbVNlcnZpY2VTdHJlYW1IYW5kbGUgaW52YWxpZCA9IDB4JTA4WCIsCi0gICAgICAgICAgICAgIG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKKyAgICAgICAgQUxPR0UoIiVzKCkgbVNlcnZpY2VTdHJlYW1IYW5kbGUgaW52YWxpZCIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KIApAQCAtNTIsMjAgKzY3LDkgQEAKICAgICByZXR1cm4gbVNlcnZpY2VJbnRlcmZhY2UucGF1c2VTdHJlYW0obVNlcnZpY2VTdHJlYW1IYW5kbGUpOwogfQogCi1hYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OnJlcXVlc3RQYXVzZSgpCi17Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHN0b3BDYWxsYmFjaygpOwotICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIHJlc3VsdCA9IHJlcXVlc3RQYXVzZUludGVybmFsKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5OjpyZXF1ZXN0Rmx1c2goKSB7CiAgICAgaWYgKG1TZXJ2aWNlU3RyZWFtSGFuZGxlID09IEFBVURJT19IQU5ETEVfSU5WQUxJRCkgewotICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6cmVxdWVzdEZsdXNoKCkgbVNlcnZpY2VTdHJlYW1IYW5kbGUgaW52YWxpZCA9IDB4JTA4WCIsCi0gICAgICAgICAgICAgIG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKKyAgICAgICAgQUxPR0UoIiVzKCkgbVNlcnZpY2VTdHJlYW1IYW5kbGUgaW52YWxpZCIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KIApAQCAtODAsNyArODQsNyBAQAogICAgIC8vIEJ1bXAgb2Zmc2V0IHNvIGNhbGxlciBkb2VzIG5vdCBzZWUgdGhlIHJldHJvZ3JhZGUgbW90aW9uIGluIGdldEZyYW1lc1JlYWQoKS4KICAgICBpbnQ2NF90IG9mZnNldCA9IHdyaXRlQ291bnRlciAtIHJlYWRDb3VudGVyOwogICAgIG1GcmFtZXNPZmZzZXRGcm9tU2VydmljZSArPSBvZmZzZXQ7Ci0gICAgQUxPR0QoImFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oKSByZWFkTiA9ICVsbGQsIHdyaXRlTiA9ICVsbGQsIG9mZnNldCA9ICVsbGQiLAorICAgIEFMT0dWKCIlcygpIHJlYWROID0gJWxsZCwgd3JpdGVOID0gJWxsZCwgb2Zmc2V0ID0gJWxsZCIsIF9fZnVuY19fLAogICAgICAgICAgIChsb25nIGxvbmcpcmVhZENvdW50ZXIsIChsb25nIGxvbmcpd3JpdGVDb3VudGVyLCAobG9uZyBsb25nKW1GcmFtZXNPZmZzZXRGcm9tU2VydmljZSk7CiAKICAgICAvLyBGb3JjZSB3cml0ZUNvdW50ZXIgdG8gbWF0Y2ggcmVhZENvdW50ZXIuCkBAIC05NCw5ICs5OCw3IEBACiAKIC8vIFdyaXRlIHRoZSBkYXRhLCBibG9jayBpZiBuZWVkZWQgYW5kIHRpbWVvdXRNaWxsaXMgPiAwCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OndyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lb3V0TmFub3NlY29uZHMpCi0KLXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lb3V0TmFub3NlY29uZHMpIHsKICAgICByZXR1cm4gcHJvY2Vzc0RhdGEoKHZvaWQgKilidWZmZXIsIG51bUZyYW1lcywgdGltZW91dE5hbm9zZWNvbmRzKTsKIH0KIApAQCAtMTE1LDcgKzExNyw3IEBACiAgICAgICAgIC8vIFN0aWxsIGhhdmVuJ3QgZ290IGFueSB0aW1lc3RhbXBzIGZyb20gc2VydmVyLgogICAgICAgICAvLyBLZWVwIHdhaXRpbmcgdW50aWwgd2UgZ2V0IHNvbWUgdmFsaWQgdGltZXN0YW1wcyB0aGVuIHN0YXJ0IHdyaXRpbmcgdG8gdGhlCiAgICAgICAgIC8vIGN1cnJlbnQgYnVmZmVyIHBvc2l0aW9uLgotICAgICAgICBBTE9HRCgicHJvY2Vzc0RhdGFOb3coKSB3YWl0IGZvciB2YWxpZCB0aW1lc3RhbXBzIik7CisgICAgICAgIEFMT0dWKCIlcygpIHdhaXQgZm9yIHZhbGlkIHRpbWVzdGFtcHMiLCBfX2Z1bmNfXyk7CiAgICAgICAgIC8vIFNsZWVwIHZlcnkgYnJpZWZseSBhbmQgaG9wZSB3ZSBnZXQgYSB0aW1lc3RhbXAgc29vbi4KICAgICAgICAgKndha2VUaW1lUHRyID0gY3VycmVudE5hbm9UaW1lICsgKDIwMDAgKiBBQVVESU9fTkFOT1NfUEVSX01JQ1JPU0VDT05EKTsKICAgICAgICAgQVRSQUNFX0VORCgpOwpAQCAtMTM5LDcgKzE0MSw4IEBACiAgICAgfQogCiAgICAgLy8gSWYgdGhlIHJlYWQgaW5kZXggcGFzc2VkIHRoZSB3cml0ZSBpbmRleCB0aGVuIGNvbnNpZGVyIGl0IGFuIHVuZGVycnVuLgotICAgIGlmIChtQXVkaW9FbmRwb2ludC5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCkgPCAwKSB7CisgICAgLy8gRm9yIHNoYXJlZCBzdHJlYW1zLCB0aGUgeFJ1bkNvdW50IGlzIHBhc3NlZCB1cCBmcm9tIHRoZSBzZXJ2aWNlLgorICAgIGlmIChtQXVkaW9FbmRwb2ludC5pc0ZyZWVSdW5uaW5nKCkgJiYgbUF1ZGlvRW5kcG9pbnQuZ2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpIDwgMCkgewogICAgICAgICBtWFJ1bkNvdW50Kys7CiAgICAgICAgIGlmIChBVFJBQ0VfRU5BQkxFRCgpKSB7CiAgICAgICAgICAgICBBVFJBQ0VfSU5UKCJhYVVuZGVyUnVucyIsIG1YUnVuQ291bnQpOwpAQCAtMTk2LDEwICsxOTksOCBAQAogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OndyaXRlTm93V2l0aENvbnZlcnNpb24oY29uc3Qgdm9pZCAqYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMpIHsKLSAgICAvLyBBTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbDo6d3JpdGVOb3dXaXRoQ29udmVyc2lvbiglcCwgJWQpIiwKLSAgICAvLyAgICAgICAgICAgICAgYnVmZmVyLCBudW1GcmFtZXMpOwogICAgIFdyYXBwaW5nQnVmZmVyIHdyYXBwaW5nQnVmZmVyOwotICAgIHVpbnQ4X3QgKnNvdXJjZSA9ICh1aW50OF90ICopIGJ1ZmZlcjsKKyAgICB1aW50OF90ICpieXRlQnVmZmVyID0gKHVpbnQ4X3QgKikgYnVmZmVyOwogICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IG51bUZyYW1lczsKIAogICAgIG1BdWRpb0VuZHBvaW50LmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCZ3cmFwcGluZ0J1ZmZlcik7CkBAIC0yMTMsNzAgKzIxNCwyNiBAQAogICAgICAgICAgICAgaWYgKGZyYW1lc1RvV3JpdGUgPiBmcmFtZXNBdmFpbGFibGUpIHsKICAgICAgICAgICAgICAgICBmcmFtZXNUb1dyaXRlID0gZnJhbWVzQXZhaWxhYmxlOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpbnQzMl90IG51bUJ5dGVzID0gZ2V0Qnl0ZXNQZXJGcmFtZSgpICogZnJhbWVzVG9Xcml0ZTsKLSAgICAgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1RvV3JpdGUgKiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKICAgICAgICAgICAgIC8vIERhdGEgY29udmVyc2lvbi4KICAgICAgICAgICAgIGZsb2F0IGxldmVsRnJvbTsKICAgICAgICAgICAgIGZsb2F0IGxldmVsVG87Ci0gICAgICAgICAgICBib29sIHJhbXBpbmcgPSBtVm9sdW1lUmFtcC5uZXh0U2VnbWVudChmcmFtZXNUb1dyaXRlICogZ2V0U2FtcGxlc1BlckZyYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGV2ZWxGcm9tLCAmbGV2ZWxUbyk7Ci0gICAgICAgICAgICAvLyBUaGUgZm9ybWF0cyBhcmUgdmFsaWRhdGVkIHdoZW4gdGhlIHN0cmVhbSBpcyBvcGVuZWQgc28gd2UgZG8gbm90IGhhdmUgdG8KLSAgICAgICAgICAgIC8vIGNoZWNrIGZvciBpbGxlZ2FsIGNvbWJpbmF0aW9ucyBoZXJlLgotICAgICAgICAgICAgLy8gVE9ETyBmYWN0b3IgdGhpcyBvdXQgaW50byBhIHV0aWxpdHkgZnVuY3Rpb24KLSAgICAgICAgICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICAgICAgICAgIGlmIChtRGV2aWNlRm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFBdWRpb19saW5lYXJSYW1wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0ICopIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNUb1dyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNhbXBsZXNQZXJGcmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1EZXZpY2VGb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyYW1waW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNUb1dyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTYW1wbGVzUGVyRnJhbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfZmxvYXRUb1BjbTE2KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKSB3cmFwcGluZ0J1ZmZlci5kYXRhW3BhcnRJbmRleF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgICAgICAgICBpZiAobURldmljZUZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmFtcGluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0ICopIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzVG9Xcml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2FtcGxlc1BlckZyYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobURldmljZUZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgICAgICAgICAgICAgQUF1ZGlvX2xpbmVhclJhbXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNUb1dyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNhbXBsZXNQZXJGcmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzb3VyY2UgKz0gbnVtQnl0ZXM7CisgICAgICAgICAgICBtVm9sdW1lUmFtcC5uZXh0U2VnbWVudChmcmFtZXNUb1dyaXRlLCAmbGV2ZWxGcm9tLCAmbGV2ZWxUbyk7CisKKyAgICAgICAgICAgIEFBdWRpb0RhdGFDb252ZXJ0ZXI6OkZvcm1hdHRlZERhdGEgc291cmNlKAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWJ5dGVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgIGdldEZvcm1hdCgpLAorICAgICAgICAgICAgICAgICAgICBnZXRTYW1wbGVzUGVyRnJhbWUoKSk7CisgICAgICAgICAgICBBQXVkaW9EYXRhQ29udmVydGVyOjpGb3JtYXR0ZWREYXRhIGRlc3RpbmF0aW9uKAorICAgICAgICAgICAgICAgICAgICB3cmFwcGluZ0J1ZmZlci5kYXRhW3BhcnRJbmRleF0sCisgICAgICAgICAgICAgICAgICAgIGdldERldmljZUZvcm1hdCgpLAorICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VDaGFubmVsQ291bnQoKSk7CisKKyAgICAgICAgICAgIEFBdWRpb0RhdGFDb252ZXJ0ZXI6OmNvbnZlcnQoc291cmNlLCBkZXN0aW5hdGlvbiwgZnJhbWVzVG9Xcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLCBsZXZlbFRvKTsKKworICAgICAgICAgICAgYnl0ZUJ1ZmZlciArPSBudW1CeXRlczsKICAgICAgICAgICAgIGZyYW1lc0xlZnQgLT0gZnJhbWVzVG9Xcml0ZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjg2LDcgKzI0Myw2IEBACiAgICAgaW50MzJfdCBmcmFtZXNXcml0dGVuID0gbnVtRnJhbWVzIC0gZnJhbWVzTGVmdDsKICAgICBtQXVkaW9FbmRwb2ludC5hZHZhbmNlV3JpdGVJbmRleChmcmFtZXNXcml0dGVuKTsKIAotICAgIC8vIEFMT0dEKCJBdWRpb1N0cmVhbUludGVybmFsOjp3cml0ZU5vd1dpdGhDb252ZXJzaW9uKCkgcmV0dXJucyAlZCIsIGZyYW1lc1dyaXR0ZW4pOwogICAgIHJldHVybiBmcmFtZXNXcml0dGVuOwogfQogCkBAIC0zMDUsNyArMjYxLDYgQEAKICAgICB9IGVsc2UgewogICAgICAgICBtTGFzdEZyYW1lc1JlYWQgPSBmcmFtZXNSZWFkOwogICAgIH0KLSAgICAvL0FMT0dEKCJBdWRpb1N0cmVhbUludGVybmFsUGxheTo6Z2V0RnJhbWVzUmVhZCgpIHJldHVybnMgJWxsZCIsIChsb25nIGxvbmcpZnJhbWVzUmVhZCk7CiAgICAgcmV0dXJuIGZyYW1lc1JlYWQ7CiB9CiAKQEAgLTMxMyw2MCArMjY4LDUxIEBACiB7CiAgICAgaW50NjRfdCBmcmFtZXNXcml0dGVuID0gbUF1ZGlvRW5kcG9pbnQuZ2V0RGF0YVdyaXRlQ291bnRlcigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtRnJhbWVzT2Zmc2V0RnJvbVNlcnZpY2U7Ci0gICAgLy9BTE9HRCgiQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OmdldEZyYW1lc1dyaXR0ZW4oKSByZXR1cm5zICVsbGQiLCAobG9uZyBsb25nKWZyYW1lc1dyaXR0ZW4pOwogICAgIHJldHVybiBmcmFtZXNXcml0dGVuOwogfQogCiAKIC8vIFJlbmRlciBhdWRpbyBpbiB0aGUgYXBwbGljYXRpb24gY2FsbGJhY2sgYW5kIHRoZW4gd3JpdGUgdGhlIGRhdGEgdG8gdGhlIHN0cmVhbS4KIHZvaWQgKkF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5OjpjYWxsYmFja0xvb3AoKSB7CisgICAgQUxPR0QoIiVzKCkgZW50ZXJpbmcgPj4+Pj4+Pj4+Pj4+Pj4+IiwgX19mdW5jX18pOwogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAgICAgYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgY2FsbGJhY2tSZXN1bHQgPSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX0NPTlRJTlVFOwotICAgIEFBdWRpb1N0cmVhbV9kYXRhQ2FsbGJhY2sgYXBwQ2FsbGJhY2sgPSBnZXREYXRhQ2FsbGJhY2tQcm9jKCk7Ci0gICAgaWYgKGFwcENhbGxiYWNrID09IG51bGxwdHIpIHJldHVybiBOVUxMOworICAgIGlmICghaXNEYXRhQ2FsbGJhY2tTZXQoKSkgcmV0dXJuIE5VTEw7CiAgICAgaW50NjRfdCB0aW1lb3V0TmFub3MgPSBjYWxjdWxhdGVSZWFzb25hYmxlVGltZW91dChtQ2FsbGJhY2tGcmFtZXMpOwogCiAgICAgLy8gcmVzdWx0IG1pZ2h0IGJlIGEgZnJhbWUgY291bnQKICAgICB3aGlsZSAobUNhbGxiYWNrRW5hYmxlZC5sb2FkKCkgJiYgaXNBY3RpdmUoKSAmJiAocmVzdWx0ID49IDApKSB7CiAgICAgICAgIC8vIENhbGwgYXBwbGljYXRpb24gdXNpbmcgdGhlIEFBdWRpbyBjYWxsYmFjayBpbnRlcmZhY2UuCi0gICAgICAgIGNhbGxiYWNrUmVzdWx0ID0gKCphcHBDYWxsYmFjaykoCi0gICAgICAgICAgICAgICAgKEFBdWRpb1N0cmVhbSAqKSB0aGlzLAotICAgICAgICAgICAgICAgIGdldERhdGFDYWxsYmFja1VzZXJEYXRhKCksCi0gICAgICAgICAgICAgICAgbUNhbGxiYWNrQnVmZmVyLAotICAgICAgICAgICAgICAgIG1DYWxsYmFja0ZyYW1lcyk7CisgICAgICAgIGNhbGxiYWNrUmVzdWx0ID0gbWF5YmVDYWxsRGF0YUNhbGxiYWNrKG1DYWxsYmFja0J1ZmZlciwgbUNhbGxiYWNrRnJhbWVzKTsKIAogICAgICAgICBpZiAoY2FsbGJhY2tSZXN1bHQgPT0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9DT05USU5VRSkgewogICAgICAgICAgICAgLy8gV3JpdGUgYXVkaW8gZGF0YSB0byBzdHJlYW0uIFRoaXMgaXMgYSBCTE9DS0lORyBXUklURSEKICAgICAgICAgICAgIHJlc3VsdCA9IHdyaXRlKG1DYWxsYmFja0J1ZmZlciwgbUNhbGxiYWNrRnJhbWVzLCB0aW1lb3V0TmFub3MpOwogICAgICAgICAgICAgaWYgKChyZXN1bHQgIT0gbUNhbGxiYWNrRnJhbWVzKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbUludGVybmFsUGxheSgpOiBjYWxsYmFja0xvb3A6IHdyaXRlKCkgcmV0dXJuZWQgJWQiLCByZXN1bHQpOwogICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHdyb3RlIHNvbWUgb2YgdGhlIGZyYW1lcyByZXF1ZXN0ZWQuIE11c3QgaGF2ZSB0aW1lZCBvdXQuCiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9USU1FT1VUOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBQXVkaW9TdHJlYW1fZXJyb3JDYWxsYmFjayBlcnJvckNhbGxiYWNrID0gZ2V0RXJyb3JDYWxsYmFja1Byb2MoKTsKLSAgICAgICAgICAgICAgICBpZiAoZXJyb3JDYWxsYmFjayAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgICgqZXJyb3JDYWxsYmFjaykoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFBdWRpb1N0cmVhbSAqKSB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVycm9yQ2FsbGJhY2tVc2VyRGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1heWJlQ2FsbEVycm9yQ2FsbGJhY2socmVzdWx0KTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChjYWxsYmFja1Jlc3VsdCA9PSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1ApIHsKLSAgICAgICAgICAgIEFMT0dEKCJBdWRpb1N0cmVhbUludGVybmFsUGxheSgpOiBjYWxsYmFjayByZXR1cm5lZCBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1AiKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcygpOiBjYWxsYmFjayByZXR1cm5lZCBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1AiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAotICAgIEFMT0dEKCJBdWRpb1N0cmVhbUludGVybmFsUGxheSgpOiBjYWxsYmFja0xvb3AoKSBleGl0aW5nLCByZXN1bHQgPSAlZCwgaXNBY3RpdmUoKSA9ICVkIiwKLSAgICAgICAgICByZXN1bHQsIChpbnQpIGlzQWN0aXZlKCkpOworICAgIEFMT0dEKCIlcygpIGV4aXRpbmcsIHJlc3VsdCA9ICVkLCBpc0FjdGl2ZSgpID0gJWQgPDw8PDw8PDw8PDw8PDwiLAorICAgICAgICAgIF9fZnVuY19fLCByZXN1bHQsIChpbnQpIGlzQWN0aXZlKCkpOwogICAgIHJldHVybiBOVUxMOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gSW1wbGVtZW50YXRpb24gb2YgUGxheWVyQmFzZQogc3RhdHVzX3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OmRvU2V0Vm9sdW1lKCkgewotICAgIG1Wb2x1bWVSYW1wLnNldFRhcmdldChtU3RyZWFtVm9sdW1lICogZ2V0RHVja0FuZE11dGVWb2x1bWUoKSk7CisgICAgZmxvYXQgY29tYmluZWRWb2x1bWUgPSBtU3RyZWFtVm9sdW1lICogZ2V0RHVja0FuZE11dGVWb2x1bWUoKTsKKyAgICBBTE9HRCgiJXMoKSBtU3RyZWFtVm9sdW1lICogZHVja0FuZE11dGVWb2x1bWUgPSAlZiAqICVmID0gJWYiLAorICAgICAgICAgIF9fZnVuY19fLCBtU3RyZWFtVm9sdW1lLCBnZXREdWNrQW5kTXV0ZVZvbHVtZSgpLCBjb21iaW5lZFZvbHVtZSk7CisgICAgbVZvbHVtZVJhbXAuc2V0VGFyZ2V0KGNvbWJpbmVkVm9sdW1lKTsKICAgICByZXR1cm4gYW5kcm9pZDo6Tk9fRVJST1I7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaAppbmRleCBkNWMxYjFlLi45NzdhOTA5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmgKQEAgLTMzLDEwICszMywyMiBAQAogICAgIEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5KEFBdWRpb1NlcnZpY2VJbnRlcmZhY2UgICZzZXJ2aWNlSW50ZXJmYWNlLCBib29sIGluU2VydmljZSA9IGZhbHNlKTsKICAgICB2aXJ0dWFsIH5BdWRpb1N0cmVhbUludGVybmFsUGxheSgpOwogCisgICAgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgQXVkaW9TdHJlYW1CdWlsZGVyICZidWlsZGVyKSBvdmVycmlkZTsKKwogICAgIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0UGF1c2UoKSBvdmVycmlkZTsKIAogICAgIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0Rmx1c2goKSBvdmVycmlkZTsKIAorICAgIGJvb2wgaXNGbHVzaFN1cHBvcnRlZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgLy8gT25seSBpbXBsZW1lbnQgRkxVU0ggZm9yIE9VVFBVVCBzdHJlYW1zLgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIGlzUGF1c2VTdXBwb3J0ZWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIC8vIE9ubHkgaW1wbGVtZW50IFBBVVNFIGZvciBPVVRQVVQgc3RyZWFtcy4KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZW91dE5hbm9zZWNvbmRzKSBvdmVycmlkZTsKQEAgLTUyLDggKzY0LDYgQEAKIAogcHJvdGVjdGVkOgogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RQYXVzZUludGVybmFsKCk7Ci0KICAgICB2b2lkIGFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oKSBvdmVycmlkZTsKIAogICAgIHZvaWQgb25GbHVzaEZyb21TZXJ2ZXIoKSBvdmVycmlkZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuY3BwCmluZGV4IGJhYzY5ZjEuLjk1YjUyYmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmNwcApAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBMT0dfVEFHICJBQXVkaW8iCisjZGVmaW5lIExPR19UQUcgIklzb2Nocm9ub3VzQ2xvY2tNb2RlbCIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKQEAgLTQxLDIwICs0MSwyMCBAQAogfQogCiB2b2lkIElzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6c2V0UG9zaXRpb25BbmRUaW1lKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50NjRfdCBuYW5vVGltZSkgewotICAgIEFMT0dWKCJJc29jaHJvbm91c0Nsb2NrTW9kZWw6OnNldFBvc2l0aW9uQW5kVGltZSglbGxkLCAlbGxkKSIsCisgICAgQUxPR1YoInNldFBvc2l0aW9uQW5kVGltZSglbGxkLCAlbGxkKSIsCiAgICAgICAgICAgKGxvbmcgbG9uZykgZnJhbWVQb3NpdGlvbiwgKGxvbmcgbG9uZykgbmFub1RpbWUpOwogICAgIG1NYXJrZXJGcmFtZVBvc2l0aW9uID0gZnJhbWVQb3NpdGlvbjsKICAgICBtTWFya2VyTmFub1RpbWUgPSBuYW5vVGltZTsKIH0KIAogdm9pZCBJc29jaHJvbm91c0Nsb2NrTW9kZWw6OnN0YXJ0KGludDY0X3QgbmFub1RpbWUpIHsKLSAgICBBTE9HVigiSXNvY2hyb25vdXNDbG9ja01vZGVsOjpzdGFydChuYW5vcyA9ICVsbGQpXG4iLCAobG9uZyBsb25nKSBuYW5vVGltZSk7CisgICAgQUxPR1YoInN0YXJ0KG5hbm9zID0gJWxsZClcbiIsIChsb25nIGxvbmcpIG5hbm9UaW1lKTsKICAgICBtTWFya2VyTmFub1RpbWUgPSBuYW5vVGltZTsKICAgICBtU3RhdGUgPSBTVEFURV9TVEFSVElORzsKIH0KIAogdm9pZCBJc29jaHJvbm91c0Nsb2NrTW9kZWw6OnN0b3AoaW50NjRfdCBuYW5vVGltZSkgewotICAgIEFMT0dWKCJJc29jaHJvbm91c0Nsb2NrTW9kZWw6OnN0b3AobmFub3MgPSAlbGxkKVxuIiwgKGxvbmcgbG9uZykgbmFub1RpbWUpOworICAgIEFMT0dWKCJzdG9wKG5hbm9zID0gJWxsZClcbiIsIChsb25nIGxvbmcpIG5hbm9UaW1lKTsKICAgICBzZXRQb3NpdGlvbkFuZFRpbWUoY29udmVydFRpbWVUb1Bvc2l0aW9uKG5hbm9UaW1lKSwgbmFub1RpbWUpOwogICAgIC8vIFRPRE8gc2hvdWxkIHdlIHNldCBwb3NpdGlvbj8KICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEOwpAQCAtMTU2LDcgKzE1Niw3IEBACiAgICAgaW50NjRfdCBmcmFtZXNEZWx0YSA9IG5leHRCdXJzdFBvc2l0aW9uIC0gbU1hcmtlckZyYW1lUG9zaXRpb247CiAgICAgaW50NjRfdCBuYW5vc0RlbHRhID0gY29udmVydERlbHRhUG9zaXRpb25Ub1RpbWUoZnJhbWVzRGVsdGEpOwogICAgIGludDY0X3QgdGltZSA9IG1NYXJrZXJOYW5vVGltZSArIG5hbm9zRGVsdGE7Ci0vLyAgICBBTE9HRCgiSXNvY2hyb25vdXNDbG9ja01vZGVsOjpjb252ZXJ0UG9zaXRpb25Ub1RpbWU6IHBvcyA9ICVsbHUgLS0+IHRpbWUgPSAlbGx1IiwKKy8vICAgIEFMT0dEKCJjb252ZXJ0UG9zaXRpb25Ub1RpbWU6IHBvcyA9ICVsbHUgLS0+IHRpbWUgPSAlbGx1IiwKIC8vICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylmcmFtZVBvc2l0aW9uLAogLy8gICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXRpbWUpOwogICAgIHJldHVybiB0aW1lOwpAQCAtMTcxLDE5ICsxNzEsMTkgQEAKICAgICBpbnQ2NF90IG5leHRCdXJzdFBvc2l0aW9uID0gbU1hcmtlckZyYW1lUG9zaXRpb24gKyBmcmFtZXNEZWx0YTsKICAgICBpbnQ2NF90IG5leHRCdXJzdEluZGV4ID0gbmV4dEJ1cnN0UG9zaXRpb24gLyBtRnJhbWVzUGVyQnVyc3Q7CiAgICAgaW50NjRfdCBwb3NpdGlvbiA9IG5leHRCdXJzdEluZGV4ICogbUZyYW1lc1BlckJ1cnN0OwotLy8gICAgQUxPR0QoIklzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6Y29udmVydFRpbWVUb1Bvc2l0aW9uOiB0aW1lID0gJWxsdSAtLT4gcG9zID0gJWxsdSIsCisvLyAgICBBTE9HRCgiY29udmVydFRpbWVUb1Bvc2l0aW9uOiB0aW1lID0gJWxsdSAtLT4gcG9zID0gJWxsdSIsCiAvLyAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbmFub1RpbWUsCiAvLyAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcG9zaXRpb24pOwotLy8gICAgQUxPR0QoIklzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6Y29udmVydFRpbWVUb1Bvc2l0aW9uOiBmcmFtZXNEZWx0YSA9ICVsbHUsIG1GcmFtZXNQZXJCdXJzdCA9ICVkIiwKKy8vICAgIEFMT0dEKCJjb252ZXJ0VGltZVRvUG9zaXRpb246IGZyYW1lc0RlbHRhID0gJWxsdSwgbUZyYW1lc1BlckJ1cnN0ID0gJWQiLAogLy8gICAgICAgICAobG9uZyBsb25nKSBmcmFtZXNEZWx0YSwgbUZyYW1lc1BlckJ1cnN0KTsKICAgICByZXR1cm4gcG9zaXRpb247CiB9CiAKIHZvaWQgSXNvY2hyb25vdXNDbG9ja01vZGVsOjpkdW1wKCkgY29uc3QgewotICAgIEFMT0dEKCJJc29jaHJvbm91c0Nsb2NrTW9kZWw6Om1NYXJrZXJGcmFtZVBvc2l0aW9uID0gJWxsZCIsIChsb25nIGxvbmcpIG1NYXJrZXJGcmFtZVBvc2l0aW9uKTsKLSAgICBBTE9HRCgiSXNvY2hyb25vdXNDbG9ja01vZGVsOjptTWFya2VyTmFub1RpbWUgICAgICA9ICVsbGQiLCAobG9uZyBsb25nKSBtTWFya2VyTmFub1RpbWUpOwotICAgIEFMT0dEKCJJc29jaHJvbm91c0Nsb2NrTW9kZWw6Om1TYW1wbGVSYXRlICAgICAgICAgID0gJTZkIiwgbVNhbXBsZVJhdGUpOwotICAgIEFMT0dEKCJJc29jaHJvbm91c0Nsb2NrTW9kZWw6Om1GcmFtZXNQZXJCdXJzdCAgICAgID0gJTZkIiwgbUZyYW1lc1BlckJ1cnN0KTsKLSAgICBBTE9HRCgiSXNvY2hyb25vdXNDbG9ja01vZGVsOjptTWF4TGF0ZW5lc3NJbk5hbm9zICA9ICU2ZCIsIG1NYXhMYXRlbmVzc0luTmFub3MpOwotICAgIEFMT0dEKCJJc29jaHJvbm91c0Nsb2NrTW9kZWw6Om1TdGF0ZSAgICAgICAgICAgICAgID0gJTZkIiwgbVN0YXRlKTsKKyAgICBBTE9HRCgibU1hcmtlckZyYW1lUG9zaXRpb24gPSAlbGxkIiwgKGxvbmcgbG9uZykgbU1hcmtlckZyYW1lUG9zaXRpb24pOworICAgIEFMT0dEKCJtTWFya2VyTmFub1RpbWUgICAgICA9ICVsbGQiLCAobG9uZyBsb25nKSBtTWFya2VyTmFub1RpbWUpOworICAgIEFMT0dEKCJtU2FtcGxlUmF0ZSAgICAgICAgICA9ICU2ZCIsIG1TYW1wbGVSYXRlKTsKKyAgICBBTE9HRCgibUZyYW1lc1BlckJ1cnN0ICAgICAgPSAlNmQiLCBtRnJhbWVzUGVyQnVyc3QpOworICAgIEFMT0dEKCJtTWF4TGF0ZW5lc3NJbk5hbm9zICA9ICU2ZCIsIG1NYXhMYXRlbmVzc0luTmFub3MpOworICAgIEFMT0dEKCJtU3RhdGUgICAgICAgICAgICAgICA9ICU2ZCIsIG1TdGF0ZSk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcAppbmRleCAxZWFlZTgxLi5kZjBkYjc5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAKQEAgLTE4LDYgKzE4LDggQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bXV0ZXg+CiAjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPHB0aHJlYWQuaD4KIApAQCAtMTc1LDEzICsxNzcsMzggQEAKICAgICBzdHJlYW1CdWlsZGVyLT5zZXRTaGFyaW5nTW9kZShzaGFyaW5nTW9kZSk7CiB9CiAKK0FBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFVzYWdlKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fdXNhZ2VfdCB1c2FnZSkgeworICAgIEF1ZGlvU3RyZWFtQnVpbGRlciAqc3RyZWFtQnVpbGRlciA9IGNvbnZlcnRBQXVkaW9CdWlsZGVyVG9TdHJlYW1CdWlsZGVyKGJ1aWxkZXIpOworICAgIHN0cmVhbUJ1aWxkZXItPnNldFVzYWdlKHVzYWdlKTsKK30KKworQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q29udGVudFR5cGUoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19jb250ZW50X3R5cGVfdCBjb250ZW50VHlwZSkgeworICAgIEF1ZGlvU3RyZWFtQnVpbGRlciAqc3RyZWFtQnVpbGRlciA9IGNvbnZlcnRBQXVkaW9CdWlsZGVyVG9TdHJlYW1CdWlsZGVyKGJ1aWxkZXIpOworICAgIHN0cmVhbUJ1aWxkZXItPnNldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKTsKK30KKworQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0SW5wdXRQcmVzZXQoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19pbnB1dF9wcmVzZXRfdCBpbnB1dFByZXNldCkgeworICAgIEF1ZGlvU3RyZWFtQnVpbGRlciAqc3RyZWFtQnVpbGRlciA9IGNvbnZlcnRBQXVkaW9CdWlsZGVyVG9TdHJlYW1CdWlsZGVyKGJ1aWxkZXIpOworICAgIHN0cmVhbUJ1aWxkZXItPnNldElucHV0UHJlc2V0KGlucHV0UHJlc2V0KTsKK30KKwogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyhBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZXMpCiB7CiAgICAgQXVkaW9TdHJlYW1CdWlsZGVyICpzdHJlYW1CdWlsZGVyID0gY29udmVydEFBdWRpb0J1aWxkZXJUb1N0cmVhbUJ1aWxkZXIoYnVpbGRlcik7CiAgICAgc3RyZWFtQnVpbGRlci0+c2V0QnVmZmVyQ2FwYWNpdHkoZnJhbWVzKTsKIH0KIAorQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2Vzc2lvbklkKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3Nlc3Npb25faWRfdCBzZXNzaW9uSWQpCit7CisgICAgQXVkaW9TdHJlYW1CdWlsZGVyICpzdHJlYW1CdWlsZGVyID0gY29udmVydEFBdWRpb0J1aWxkZXJUb1N0cmVhbUJ1aWxkZXIoYnVpbGRlcik7CisgICAgc3RyZWFtQnVpbGRlci0+c2V0U2Vzc2lvbklkKHNlc3Npb25JZCk7Cit9CisKIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERhdGFDYWxsYmFjayhBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBdWRpb1N0cmVhbV9kYXRhQ2FsbGJhY2sgY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEpCkBAIC0yMzgsMTUgKzI2NSwyNiBAQAogCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtX2Nsb3NlKEFBdWRpb1N0cmVhbSogc3RyZWFtKQogeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fRVJST1JfTlVMTDsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOwotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fY2xvc2UoJXApIiwgc3RyZWFtKTsKKyAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtX2Nsb3NlKCVwKSBjYWxsZWQgLS0tLS0tLS0tLS0tLS0tIiwgc3RyZWFtKTsKICAgICBpZiAoYXVkaW9TdHJlYW0gIT0gbnVsbHB0cikgewotICAgICAgICBhdWRpb1N0cmVhbS0+Y2xvc2UoKTsKLSAgICAgICAgYXVkaW9TdHJlYW0tPnVucmVnaXN0ZXJQbGF5ZXJCYXNlKCk7Ci0gICAgICAgIGRlbGV0ZSBhdWRpb1N0cmVhbTsKLSAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKKyAgICAgICAgcmVzdWx0ID0gYXVkaW9TdHJlYW0tPnNhZmVDbG9zZSgpOworICAgICAgICAvLyBDbG9zZSB3aWxsIG9ubHkgZmFpbCBpZiBjYWxsZWQgaWxsZWdhbGx5LCBmb3IgZXhhbXBsZSwgZnJvbSBhIGNhbGxiYWNrLgorICAgICAgICAvLyBUaGF0IHdvdWxkIHJlc3VsdCBpbiBkZWxldGluZyBhbiBhY3RpdmUgc3RyZWFtLCB3aGljaCB3b3VsZCBjYXVzZSBhIGNyYXNoLgorICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICAgICAgYXVkaW9TdHJlYW0tPnVucmVnaXN0ZXJQbGF5ZXJCYXNlKCk7CisgICAgICAgICAgICBkZWxldGUgYXVkaW9TdHJlYW07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiJXMgYXR0ZW1wdCB0byBjbG9zZSBmYWlsZWQuIENsb3NlIGl0IGZyb20gYW5vdGhlciB0aHJlYWQuIiwgX19mdW5jX18pOworICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBBQVVESU9fRVJST1JfTlVMTDsKKyAgICAvLyBXZSdyZSBwb3RlbnRpYWxseSBmcmVlaW5nIGBzdHJlYW1gIGFib3ZlLCBzbyBpdHMgdXNlIGhlcmUgbWFrZXMgc29tZQorICAgIC8vIHN0YXRpYyBhbmFseXNpcyB0b29scyB1bmhhcHB5LiBDYXN0aW5nIHRvIHVpbnRwdHJfdCBoZWxwcyBhc3N1cmUKKyAgICAvLyBzYWlkIHRvb2xzIHRoYXQgd2UncmUgbm90IGRvaW5nIGFueXRoaW5nIGJhZCBoZXJlLgorICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fY2xvc2UoJSMiIFBSSXhQVFIgIikgcmV0dXJuZWQgJWQgLS0tLS0tLS0tIiwKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oc3RyZWFtKSwgcmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChBQXVkaW9TdHJlYW0qIHN0cmVhbSkKQEAgLTI2OSw3ICszMDcsNyBAQAogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7CiAgICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0Rmx1c2goJXApIiwgc3RyZWFtKTsKLSAgICByZXR1cm4gYXVkaW9TdHJlYW0tPnJlcXVlc3RGbHVzaCgpOworICAgIHJldHVybiBhdWRpb1N0cmVhbS0+c2FmZUZsdXNoKCk7CiB9CiAKIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCkBAIC0zMjQsNyArMzYyLDcgQEAKICAgICB9CiAKICAgICAvLyBEb24ndCBhbGxvdyB3cml0ZXMgd2hlbiBwbGF5aW5nIHdpdGggYSBjYWxsYmFjay4KLSAgICBpZiAoYXVkaW9TdHJlYW0tPmdldERhdGFDYWxsYmFja1Byb2MoKSAhPSBudWxscHRyICYmIGF1ZGlvU3RyZWFtLT5pc0FjdGl2ZSgpKSB7CisgICAgaWYgKGF1ZGlvU3RyZWFtLT5pc0RhdGFDYWxsYmFja0FjdGl2ZSgpKSB7CiAgICAgICAgIEFMT0dFKCJDYW5ub3Qgd3JpdGUgdG8gYSBjYWxsYmFjayBzdHJlYW0gd2hlbiBydW5uaW5nLiIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQpAQCAtNDM0LDYgKzQ3MiwzMCBAQAogICAgIHJldHVybiBhdWRpb1N0cmVhbS0+Z2V0U2hhcmluZ01vZGUoKTsKIH0KIAorQUFVRElPX0FQSSBhYXVkaW9fdXNhZ2VfdCBBQXVkaW9TdHJlYW1fZ2V0VXNhZ2UoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCit7CisgICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oc3RyZWFtKTsKKyAgICByZXR1cm4gYXVkaW9TdHJlYW0tPmdldFVzYWdlKCk7Cit9CisKK0FBVURJT19BUEkgYWF1ZGlvX2NvbnRlbnRfdHlwZV90IEFBdWRpb1N0cmVhbV9nZXRDb250ZW50VHlwZShBQXVkaW9TdHJlYW0qIHN0cmVhbSkKK3sKKyAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOworICAgIHJldHVybiBhdWRpb1N0cmVhbS0+Z2V0Q29udGVudFR5cGUoKTsKK30KKworQUFVRElPX0FQSSBhYXVkaW9faW5wdXRfcHJlc2V0X3QgQUF1ZGlvU3RyZWFtX2dldElucHV0UHJlc2V0KEFBdWRpb1N0cmVhbSogc3RyZWFtKQoreworICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7CisgICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5nZXRJbnB1dFByZXNldCgpOworfQorCitBQVVESU9fQVBJIGludDMyX3QgQUF1ZGlvU3RyZWFtX2dldFNlc3Npb25JZChBQXVkaW9TdHJlYW0qIHN0cmVhbSkKK3sKKyAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOworICAgIHJldHVybiBhdWRpb1N0cmVhbS0+Z2V0U2Vzc2lvbklkKCk7Cit9CisKIEFBVURJT19BUEkgaW50NjRfdCBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihBQXVkaW9TdHJlYW0qIHN0cmVhbSkKIHsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuY3BwCmluZGV4IDgyNDQ1ZTcuLmQ1NjcwMWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5jcHAKQEAgLTE1LDkgKzE1LDkgQEAKICAqLwogCiAKLSNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvIgorI2RlZmluZSBMT0dfVEFHICJBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKICNpbmNsdWRlICJBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmgiCiAKQEAgLTM4LDMwICszOCw0MyBAQAogICAgIG1TYW1wbGVzUGVyRnJhbWUgPSBvdGhlci5tU2FtcGxlc1BlckZyYW1lOwogICAgIG1TYW1wbGVSYXRlICAgICAgPSBvdGhlci5tU2FtcGxlUmF0ZTsKICAgICBtRGV2aWNlSWQgICAgICAgID0gb3RoZXIubURldmljZUlkOworICAgIG1TZXNzaW9uSWQgICAgICAgPSBvdGhlci5tU2Vzc2lvbklkOwogICAgIG1TaGFyaW5nTW9kZSAgICAgPSBvdGhlci5tU2hhcmluZ01vZGU7CiAgICAgbUF1ZGlvRm9ybWF0ICAgICA9IG90aGVyLm1BdWRpb0Zvcm1hdDsKICAgICBtRGlyZWN0aW9uICAgICAgID0gb3RoZXIubURpcmVjdGlvbjsKICAgICBtQnVmZmVyQ2FwYWNpdHkgID0gb3RoZXIubUJ1ZmZlckNhcGFjaXR5OworICAgIG1Vc2FnZSAgICAgICAgICAgPSBvdGhlci5tVXNhZ2U7CisgICAgbUNvbnRlbnRUeXBlICAgICA9IG90aGVyLm1Db250ZW50VHlwZTsKKyAgICBtSW5wdXRQcmVzZXQgICAgID0gb3RoZXIubUlucHV0UHJlc2V0OwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU3RyZWFtUGFyYW1ldGVyczo6dmFsaWRhdGUoKSBjb25zdCB7CiAgICAgaWYgKG1TYW1wbGVzUGVyRnJhbWUgIT0gQUFVRElPX1VOU1BFQ0lGSUVECiAgICAgICAgICYmIChtU2FtcGxlc1BlckZyYW1lIDwgU0FNUExFU19QRVJfRlJBTUVfTUlOIHx8IG1TYW1wbGVzUGVyRnJhbWUgPiBTQU1QTEVTX1BFUl9GUkFNRV9NQVgpKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzOiBjaGFubmVsQ291bnQgb3V0IG9mIHJhbmdlID0gJWQiLCBtU2FtcGxlc1BlckZyYW1lKTsKKyAgICAgICAgQUxPR0UoImNoYW5uZWxDb3VudCBvdXQgb2YgcmFuZ2UgPSAlZCIsIG1TYW1wbGVzUGVyRnJhbWUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKICAgICB9CiAKICAgICBpZiAobURldmljZUlkIDwgMCkgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU3RyZWFtUGFyYW1ldGVyczogZGV2aWNlSWQgb3V0IG9mIHJhbmdlID0gJWQiLCBtRGV2aWNlSWQpOworICAgICAgICBBTE9HRSgiZGV2aWNlSWQgb3V0IG9mIHJhbmdlID0gJWQiLCBtRGV2aWNlSWQpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKICAgICB9CiAKKyAgICAvLyBBbGwgU2Vzc2lvbiBJRCB2YWx1ZXMgYXJlIGxlZ2FsLgorICAgIHN3aXRjaCAobVNlc3Npb25JZCkgeworICAgICAgICBjYXNlIEFBVURJT19TRVNTSU9OX0lEX05PTkU6CisgICAgICAgIGNhc2UgQUFVRElPX1NFU1NJT05fSURfQUxMT0NBVEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKwogICAgIHN3aXRjaCAobVNoYXJpbmdNb2RlKSB7CiAgICAgICAgIGNhc2UgQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU6CiAgICAgICAgIGNhc2UgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQ6CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzOiBpbGxlZ2FsIHNoYXJpbmdNb2RlID0gJWQiLCBtU2hhcmluZ01vZGUpOworICAgICAgICAgICAgQUxPR0UoImlsbGVnYWwgc2hhcmluZ01vZGUgPSAlZCIsIG1TaGFyaW5nTW9kZSk7CiAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQ7CiAgICAgICAgICAgICAvLyBicmVhazsKICAgICB9CkBAIC03MiwxOSArODUsMTkgQEAKICAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKICAgICAgICAgICAgIGJyZWFrOyAvLyB2YWxpZAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoIkFBdWRpb1N0cmVhbVBhcmFtZXRlcnM6IGF1ZGlvRm9ybWF0IG5vdCB2YWxpZCA9ICVkIiwgbUF1ZGlvRm9ybWF0KTsKKyAgICAgICAgICAgIEFMT0dFKCJhdWRpb0Zvcm1hdCBub3QgdmFsaWQgPSAlZCIsIG1BdWRpb0Zvcm1hdCk7CiAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfRk9STUFUOwogICAgICAgICAgICAgLy8gYnJlYWs7CiAgICAgfQogCiAgICAgaWYgKG1TYW1wbGVSYXRlICE9IEFBVURJT19VTlNQRUNJRklFRAogICAgICAgICAmJiAobVNhbXBsZVJhdGUgPCBTQU1QTEVfUkFURV9IWl9NSU4gfHwgbVNhbXBsZVJhdGUgPiBTQU1QTEVfUkFURV9IWl9NQVgpKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzOiBzYW1wbGVSYXRlIG91dCBvZiByYW5nZSA9ICVkIiwgbVNhbXBsZVJhdGUpOworICAgICAgICBBTE9HRSgic2FtcGxlUmF0ZSBvdXQgb2YgcmFuZ2UgPSAlZCIsIG1TYW1wbGVSYXRlKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1JBVEU7CiAgICAgfQogCiAgICAgaWYgKG1CdWZmZXJDYXBhY2l0eSA8IDApIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1N0cmVhbVBhcmFtZXRlcnM6IGJ1ZmZlckNhcGFjaXR5IG91dCBvZiByYW5nZSA9ICVkIiwgbUJ1ZmZlckNhcGFjaXR5KTsKKyAgICAgICAgQUxPR0UoImJ1ZmZlckNhcGFjaXR5IG91dCBvZiByYW5nZSA9ICVkIiwgbUJ1ZmZlckNhcGFjaXR5KTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfQogCkBAIC05Myw3ICsxMDYsNTUgQEAKICAgICAgICAgY2FzZSBBQVVESU9fRElSRUNUSU9OX09VVFBVVDoKICAgICAgICAgICAgIGJyZWFrOyAvLyB2YWxpZAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoIkFBdWRpb1N0cmVhbVBhcmFtZXRlcnM6IGRpcmVjdGlvbiBub3QgdmFsaWQgPSAlZCIsIG1EaXJlY3Rpb24pOworICAgICAgICAgICAgQUxPR0UoImRpcmVjdGlvbiBub3QgdmFsaWQgPSAlZCIsIG1EaXJlY3Rpb24pOworICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UOworICAgICAgICAgICAgLy8gYnJlYWs7CisgICAgfQorCisgICAgc3dpdGNoIChtVXNhZ2UpIHsKKyAgICAgICAgY2FzZSBBQVVESU9fVU5TUEVDSUZJRUQ6CisgICAgICAgIGNhc2UgQUFVRElPX1VTQUdFX01FRElBOgorICAgICAgICBjYXNlIEFBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgorICAgICAgICBjYXNlIEFBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc6CisgICAgICAgIGNhc2UgQUFVRElPX1VTQUdFX0FMQVJNOgorICAgICAgICBjYXNlIEFBVURJT19VU0FHRV9OT1RJRklDQVRJT046CisgICAgICAgIGNhc2UgQUFVRElPX1VTQUdFX05PVElGSUNBVElPTl9SSU5HVE9ORToKKyAgICAgICAgY2FzZSBBQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UOgorICAgICAgICBjYXNlIEFBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk6CisgICAgICAgIGNhc2UgQUFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKKyAgICAgICAgY2FzZSBBQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT046CisgICAgICAgIGNhc2UgQUFVRElPX1VTQUdFX0dBTUU6CisgICAgICAgIGNhc2UgQUFVRElPX1VTQUdFX0FTU0lTVEFOVDoKKyAgICAgICAgICAgIGJyZWFrOyAvLyB2YWxpZAorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoInVzYWdlIG5vdCB2YWxpZCA9ICVkIiwgbVVzYWdlKTsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKKyAgICAgICAgICAgIC8vIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAobUNvbnRlbnRUeXBlKSB7CisgICAgICAgIGNhc2UgQUFVRElPX1VOU1BFQ0lGSUVEOgorICAgICAgICBjYXNlIEFBVURJT19DT05URU5UX1RZUEVfTVVTSUM6CisgICAgICAgIGNhc2UgQUFVRElPX0NPTlRFTlRfVFlQRV9NT1ZJRToKKyAgICAgICAgY2FzZSBBQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTjoKKyAgICAgICAgY2FzZSBBQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSDoKKyAgICAgICAgICAgIGJyZWFrOyAvLyB2YWxpZAorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoImNvbnRlbnQgdHlwZSBub3QgdmFsaWQgPSAlZCIsIG1Db250ZW50VHlwZSk7CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQ7CisgICAgICAgICAgICAvLyBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1JbnB1dFByZXNldCkgeworICAgICAgICBjYXNlIEFBVURJT19VTlNQRUNJRklFRDoKKyAgICAgICAgY2FzZSBBQVVESU9fSU5QVVRfUFJFU0VUX0dFTkVSSUM6CisgICAgICAgIGNhc2UgQUFVRElPX0lOUFVUX1BSRVNFVF9DQU1DT1JERVI6CisgICAgICAgIGNhc2UgQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9DT01NVU5JQ0FUSU9OOgorICAgICAgICBjYXNlIEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUkVDT0dOSVRJT046CisgICAgICAgIGNhc2UgQUFVRElPX0lOUFVUX1BSRVNFVF9VTlBST0NFU1NFRDoKKyAgICAgICAgICAgIGJyZWFrOyAvLyB2YWxpZAorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoImlucHV0IHByZXNldCBub3QgdmFsaWQgPSAlZCIsIG1JbnB1dFByZXNldCk7CiAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQ7CiAgICAgICAgICAgICAvLyBicmVhazsKICAgICB9CkBAIC0xMDIsMTIgKzE2MywxNSBAQAogfQogCiB2b2lkIEFBdWRpb1N0cmVhbVBhcmFtZXRlcnM6OmR1bXAoKSBjb25zdCB7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbVBhcmFtZXRlcnMgbURldmljZUlkICAgICAgICA9ICVkIiwgbURldmljZUlkKTsKLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtUGFyYW1ldGVycyBtU2FtcGxlUmF0ZSAgICAgID0gJWQiLCBtU2FtcGxlUmF0ZSk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbVBhcmFtZXRlcnMgbVNhbXBsZXNQZXJGcmFtZSA9ICVkIiwgbVNhbXBsZXNQZXJGcmFtZSk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbVBhcmFtZXRlcnMgbVNoYXJpbmdNb2RlICAgICA9ICVkIiwgKGludCltU2hhcmluZ01vZGUpOwotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzIG1BdWRpb0Zvcm1hdCAgICAgPSAlZCIsIChpbnQpbUF1ZGlvRm9ybWF0KTsKLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtUGFyYW1ldGVycyBtRGlyZWN0aW9uICAgICAgID0gJWQiLCBtRGlyZWN0aW9uKTsKLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtUGFyYW1ldGVycyBtQnVmZmVyQ2FwYWNpdHkgID0gJWQiLCBtQnVmZmVyQ2FwYWNpdHkpOworICAgIEFMT0dEKCJtRGV2aWNlSWQgICAgICAgID0gJTZkIiwgbURldmljZUlkKTsKKyAgICBBTE9HRCgibVNlc3Npb25JZCAgICAgICA9ICU2ZCIsIG1TZXNzaW9uSWQpOworICAgIEFMT0dEKCJtU2FtcGxlUmF0ZSAgICAgID0gJTZkIiwgbVNhbXBsZVJhdGUpOworICAgIEFMT0dEKCJtU2FtcGxlc1BlckZyYW1lID0gJTZkIiwgbVNhbXBsZXNQZXJGcmFtZSk7CisgICAgQUxPR0QoIm1TaGFyaW5nTW9kZSAgICAgPSAlNmQiLCAoaW50KW1TaGFyaW5nTW9kZSk7CisgICAgQUxPR0QoIm1BdWRpb0Zvcm1hdCAgICAgPSAlNmQiLCAoaW50KW1BdWRpb0Zvcm1hdCk7CisgICAgQUxPR0QoIm1EaXJlY3Rpb24gICAgICAgPSAlNmQiLCBtRGlyZWN0aW9uKTsKKyAgICBBTE9HRCgibUJ1ZmZlckNhcGFjaXR5ICA9ICU2ZCIsIG1CdWZmZXJDYXBhY2l0eSk7CisgICAgQUxPR0QoIm1Vc2FnZSAgICAgICAgICAgPSAlNmQiLCBtVXNhZ2UpOworICAgIEFMT0dEKCJtQ29udGVudFR5cGUgICAgID0gJTZkIiwgbUNvbnRlbnRUeXBlKTsKKyAgICBBTE9HRCgibUlucHV0UHJlc2V0ICAgICA9ICU2ZCIsIG1JbnB1dFByZXNldCk7CiB9Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5oCmluZGV4IDVlNjdjOTMuLmNlNWRhY2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaApAQCAtODgsNiArODgsMzggQEAKICAgICAgICAgbURpcmVjdGlvbiA9IGRpcmVjdGlvbjsKICAgICB9CiAKKyAgICBhYXVkaW9fdXNhZ2VfdCBnZXRVc2FnZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Vc2FnZTsKKyAgICB9CisKKyAgICB2b2lkIHNldFVzYWdlKGFhdWRpb191c2FnZV90IHVzYWdlKSB7CisgICAgICAgIG1Vc2FnZSA9IHVzYWdlOworICAgIH0KKworICAgIGFhdWRpb19jb250ZW50X3R5cGVfdCBnZXRDb250ZW50VHlwZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Db250ZW50VHlwZTsKKyAgICB9CisKKyAgICB2b2lkIHNldENvbnRlbnRUeXBlKGFhdWRpb19jb250ZW50X3R5cGVfdCBjb250ZW50VHlwZSkgeworICAgICAgICBtQ29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKKyAgICB9CisKKyAgICBhYXVkaW9faW5wdXRfcHJlc2V0X3QgZ2V0SW5wdXRQcmVzZXQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSW5wdXRQcmVzZXQ7CisgICAgfQorCisgICAgdm9pZCBzZXRJbnB1dFByZXNldChhYXVkaW9faW5wdXRfcHJlc2V0X3QgaW5wdXRQcmVzZXQpIHsKKyAgICAgICAgbUlucHV0UHJlc2V0ID0gaW5wdXRQcmVzZXQ7CisgICAgfQorCisgICAgYWF1ZGlvX3Nlc3Npb25faWRfdCBnZXRTZXNzaW9uSWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU2Vzc2lvbklkOworICAgIH0KKworICAgIHZvaWQgc2V0U2Vzc2lvbklkKGFhdWRpb19zZXNzaW9uX2lkX3Qgc2Vzc2lvbklkKSB7CisgICAgICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgfQorCiAgICAgaW50MzJfdCBjYWxjdWxhdGVCeXRlc1BlckZyYW1lKCkgY29uc3QgewogICAgICAgICByZXR1cm4gZ2V0U2FtcGxlc1BlckZyYW1lKCkgKiBBQXVkaW9Db252ZXJ0X2Zvcm1hdFRvU2l6ZUluQnl0ZXMoZ2V0Rm9ybWF0KCkpOwogICAgIH0KQEAgLTEwOSw3ICsxNDEsMTEgQEAKICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3QgICAgICBtU2hhcmluZ01vZGUgICAgID0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQ7CiAgICAgYWF1ZGlvX2Zvcm1hdF90ICAgICAgICAgICAgbUF1ZGlvRm9ybWF0ICAgICA9IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ7CiAgICAgYWF1ZGlvX2RpcmVjdGlvbl90ICAgICAgICAgbURpcmVjdGlvbiAgICAgICA9IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUOworICAgIGFhdWRpb191c2FnZV90ICAgICAgICAgICAgIG1Vc2FnZSAgICAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CisgICAgYWF1ZGlvX2NvbnRlbnRfdHlwZV90ICAgICAgbUNvbnRlbnRUeXBlICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKKyAgICBhYXVkaW9faW5wdXRfcHJlc2V0X3QgICAgICBtSW5wdXRQcmVzZXQgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJDYXBhY2l0eSAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CisgICAgYWF1ZGlvX3Nlc3Npb25faWRfdCAgICAgICAgbVNlc3Npb25JZCAgICAgICA9IEFBVURJT19TRVNTSU9OX0lEX05PTkU7CiB9OwogCiB9IC8qIG5hbWVzcGFjZSBhYXVkaW8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uY3BwCmluZGV4IDhkY2MzN2EuLjM1ODAyMWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmNwcApAQCAtNDMsNyArNDMsNyBAQAogICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIShnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VECiAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9VTklOSVRJQUxJWkVECiAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpLAotICAgICAgICAgICAgICAgICAgICAgICAgImFhdWRpbyBzdHJlYW0gc3RpbGwgaW4gdXNlLCBzdGF0ZSA9ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ+QXVkaW9TdHJlYW0oKSAtIHN0aWxsIGluIHVzZSwgc3RhdGUgPSAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KGdldFN0YXRlKCkpKTsKIAogICAgIG1QbGF5ZXJCYXNlLT5jbGVhclBhcmVudFJlZmVyZW5jZSgpOyAvLyByZW1vdmUgcmVmZXJlbmNlIHRvIHRoaXMgQXVkaW9TdHJlYW0KQEAgLTc0LDE1ICs3NCwyOCBAQAogICAgIH0KIAogICAgIC8vIENvcHkgcGFyYW1ldGVycyBmcm9tIHRoZSBCdWlsZGVyIGJlY2F1c2UgdGhlIEJ1aWxkZXIgbWF5IGJlIGRlbGV0ZWQgYWZ0ZXIgdGhpcyBjYWxsLgorICAgIC8vIFRPRE8gQXVkaW9TdHJlYW0gc2hvdWxkIGJlIGEgc3ViY2xhc3Mgb2YgQXVkaW9TdHJlYW1QYXJhbWV0ZXJzCiAgICAgbVNhbXBsZXNQZXJGcmFtZSA9IGJ1aWxkZXIuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CiAgICAgbVNhbXBsZVJhdGUgPSBidWlsZGVyLmdldFNhbXBsZVJhdGUoKTsKICAgICBtRGV2aWNlSWQgPSBidWlsZGVyLmdldERldmljZUlkKCk7CiAgICAgbUZvcm1hdCA9IGJ1aWxkZXIuZ2V0Rm9ybWF0KCk7CiAgICAgbVNoYXJpbmdNb2RlID0gYnVpbGRlci5nZXRTaGFyaW5nTW9kZSgpOwogICAgIG1TaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQgPSBidWlsZGVyLmlzU2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkKCk7Ci0KICAgICBtUGVyZm9ybWFuY2VNb2RlID0gYnVpbGRlci5nZXRQZXJmb3JtYW5jZU1vZGUoKTsKIAorICAgIG1Vc2FnZSA9IGJ1aWxkZXIuZ2V0VXNhZ2UoKTsKKyAgICBpZiAobVVzYWdlID09IEFBVURJT19VTlNQRUNJRklFRCkgeworICAgICAgICBtVXNhZ2UgPSBBQVVESU9fVVNBR0VfTUVESUE7CisgICAgfQorICAgIG1Db250ZW50VHlwZSA9IGJ1aWxkZXIuZ2V0Q29udGVudFR5cGUoKTsKKyAgICBpZiAobUNvbnRlbnRUeXBlID09IEFBVURJT19VTlNQRUNJRklFRCkgeworICAgICAgICBtQ29udGVudFR5cGUgPSBBQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDOworICAgIH0KKyAgICBtSW5wdXRQcmVzZXQgPSBidWlsZGVyLmdldElucHV0UHJlc2V0KCk7CisgICAgaWYgKG1JbnB1dFByZXNldCA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgbUlucHV0UHJlc2V0ID0gQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9SRUNPR05JVElPTjsKKyAgICB9CisKICAgICAvLyBjYWxsYmFja3MKICAgICBtRnJhbWVzUGVyRGF0YUNhbGxiYWNrID0gYnVpbGRlci5nZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soKTsKICAgICBtRGF0YUNhbGxiYWNrUHJvYyA9IGJ1aWxkZXIuZ2V0RGF0YUNhbGxiYWNrUHJvYygpOwpAQCAtOTEsMTggKzEwNCwxNTkgQEAKICAgICBtRXJyb3JDYWxsYmFja1VzZXJEYXRhID0gYnVpbGRlci5nZXRFcnJvckNhbGxiYWNrVXNlckRhdGEoKTsKIAogICAgIC8vIFRoaXMgaXMgdmVyeSBoZWxwZnVsIGZvciBkZWJ1Z2dpbmcgaW4gdGhlIGZ1dHVyZS4gUGxlYXNlIGxlYXZlIGl0IGluLgotICAgIEFMT0dJKCJBdWRpb1N0cmVhbTo6b3BlbigpIHJhdGUgPSAlZCwgY2hhbm5lbHMgPSAlZCwgZm9ybWF0ID0gJWQsIHNoYXJpbmcgPSAlcywgZGlyID0gJXMiLAorICAgIEFMT0dJKCJvcGVuKCkgcmF0ZSAgID0gJWQsIGNoYW5uZWxzICAgID0gJWQsIGZvcm1hdCAgID0gJWQsIHNoYXJpbmcgPSAlcywgZGlyID0gJXMiLAogICAgICAgICAgIG1TYW1wbGVSYXRlLCBtU2FtcGxlc1BlckZyYW1lLCBtRm9ybWF0LAogICAgICAgICAgIEF1ZGlvU3RyZWFtX2NvbnZlcnRTaGFyaW5nTW9kZVRvU2hvcnRUZXh0KG1TaGFyaW5nTW9kZSksCiAgICAgICAgICAgKGdldERpcmVjdGlvbigpID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKSA/ICJPVVRQVVQiIDogIklOUFVUIik7Ci0gICAgQUxPR0koIkF1ZGlvU3RyZWFtOjpvcGVuKCkgZGV2aWNlID0gJWQsIHBlcmZNb2RlID0gJWQsIGNhbGxiYWNrOiAlcyB3aXRoIGZyYW1lcyA9ICVkIiwKLSAgICAgICAgICBtRGV2aWNlSWQsIG1QZXJmb3JtYW5jZU1vZGUsCi0gICAgICAgICAgKG1EYXRhQ2FsbGJhY2tQcm9jID09IG51bGxwdHIgPyAiT0ZGIiA6ICJPTiIpLAorICAgIEFMT0dJKCJvcGVuKCkgZGV2aWNlID0gJWQsIHNlc3Npb25JZCAgID0gJWQsIHBlcmZNb2RlID0gJWQsIGNhbGxiYWNrOiAlcyB3aXRoIGZyYW1lcyA9ICVkIiwKKyAgICAgICAgICBtRGV2aWNlSWQsCisgICAgICAgICAgbVNlc3Npb25JZCwKKyAgICAgICAgICBtUGVyZm9ybWFuY2VNb2RlLAorICAgICAgICAgIChpc0RhdGFDYWxsYmFja1NldCgpID8gIk9OIiA6ICJPRkYiKSwKICAgICAgICAgICBtRnJhbWVzUGVyRGF0YUNhbGxiYWNrKTsKKyAgICBBTE9HSSgib3BlbigpIHVzYWdlICA9ICVkLCBjb250ZW50VHlwZSA9ICVkLCBpbnB1dFByZXNldCA9ICVkIiwKKyAgICAgICAgICBtVXNhZ2UsIG1Db250ZW50VHlwZSwgbUlucHV0UHJlc2V0KTsKIAogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c2FmZVN0YXJ0KCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1Mb2NrKTsKKyAgICBpZiAoY29sbGlkZXNXaXRoQ2FsbGJhY2soKSkgeworICAgICAgICBBTE9HRSgiJXMgY2Fubm90IGJlIGNhbGxlZCBmcm9tIGEgY2FsbGJhY2shIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgfQorICAgIHJldHVybiByZXF1ZXN0U3RhcnQoKTsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzYWZlUGF1c2UoKSB7CisgICAgaWYgKCFpc1BhdXNlU3VwcG9ydGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTklNUExFTUVOVEVEOworICAgIH0KKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1Mb2NrKTsKKyAgICBpZiAoY29sbGlkZXNXaXRoQ2FsbGJhY2soKSkgeworICAgICAgICBBTE9HRSgiJXMgY2Fubm90IGJlIGNhbGxlZCBmcm9tIGEgY2FsbGJhY2shIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgfQorCisgICAgc3dpdGNoIChnZXRTdGF0ZSgpKSB7CisgICAgICAgIC8vIFByb2NlZWQgd2l0aCBwYXVzaW5nLgorICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRJTkc6CisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEOgorICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8vIFRyYW5zaXRpb24gZnJvbSBvbmUgaW5hY3RpdmUgc3RhdGUgdG8gYW5vdGhlci4KKyAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX09QRU46CisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUEVEOgorICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfRkxVU0hFRDoKKyAgICAgICAgICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VEKTsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CisKKyAgICAgICAgICAgIC8vIFJlZHVuZGFudD8KKyAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNJTkc6CisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTRUQ6CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX09LOworCisgICAgICAgICAgICAvLyBEb24ndCBpbnRlcmZlcmUgd2l0aCB0cmFuc2l0aW9uYWwgc3RhdGVzIG9yIHdoZW4gY2xvc2VkLgorICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkc6CisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9GTFVTSElORzoKKyAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NJTkc6CisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVygic2FmZVBhdXNlKCkgc3RyZWFtIG5vdCBydW5uaW5nLCBzdGF0ZSA9ICVzIiwKKyAgICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQoZ2V0U3RhdGUoKSkpOworICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgIH0KKworICAgIHJldHVybiByZXF1ZXN0UGF1c2UoKTsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzYWZlRmx1c2goKSB7CisgICAgaWYgKCFpc0ZsdXNoU3VwcG9ydGVkKCkpIHsKKyAgICAgICAgQUxPR0UoImZsdXNoIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgc3RyZWFtIik7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRDsKKyAgICB9CisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RyZWFtTG9jayk7CisgICAgaWYgKGNvbGxpZGVzV2l0aENhbGxiYWNrKCkpIHsKKyAgICAgICAgQUxPR0UoInN0cmVhbSBjYW5ub3QgYmUgZmx1c2hlZCBmcm9tIGEgY2FsbGJhY2shIik7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKKyAgICB9CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvX2lzRmx1c2hBbGxvd2VkKGdldFN0YXRlKCkpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcmV0dXJuIHJlcXVlc3RGbHVzaCgpOworfQorCithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OnNhZmVTdG9wKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1Mb2NrKTsKKyAgICBpZiAoY29sbGlkZXNXaXRoQ2FsbGJhY2soKSkgeworICAgICAgICBBTE9HRSgic3RyZWFtIGNhbm5vdCBiZSBzdG9wcGVkIGZyb20gYSBjYWxsYmFjayEiKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgIH0KKworICAgIHN3aXRjaCAoZ2V0U3RhdGUoKSkgeworICAgICAgICAvLyBQcm9jZWVkIHdpdGggc3RvcHBpbmcuCisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVElORzoKKyAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQ6CisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQ6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvLyBUcmFuc2l0aW9uIGZyb20gb25lIGluYWN0aXZlIHN0YXRlIHRvIGFub3RoZXIuCisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9PUEVOOgorICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VEOgorICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfRkxVU0hFRDoKKyAgICAgICAgICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBFRCk7CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX09LOworCisgICAgICAgIC8vIFJlZHVuZGFudD8KKyAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQSU5HOgorICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBFRDoKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CisKKyAgICAgICAgLy8gRG9uJ3QgaW50ZXJmZXJlIHdpdGggdHJhbnNpdGlvbmFsIHN0YXRlcyBvciB3aGVuIGNsb3NlZC4KKyAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNJTkc6CisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9GTFVTSElORzoKKyAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NJTkc6CisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVygicmVxdWVzdFN0b3AoKSBzdHJlYW0gbm90IHJ1bm5pbmcsIHN0YXRlID0gJXMiLAorICAgICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChnZXRTdGF0ZSgpKSk7CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgfQorCisgICAgcmV0dXJuIHJlcXVlc3RTdG9wKCk7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c2FmZUNsb3NlKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1Mb2NrKTsKKyAgICBpZiAoY29sbGlkZXNXaXRoQ2FsbGJhY2soKSkgeworICAgICAgICBBTE9HRSgiJXMgY2Fubm90IGJlIGNhbGxlZCBmcm9tIGEgY2FsbGJhY2shIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgfQorICAgIHJldHVybiBjbG9zZSgpOworfQorCit2b2lkIEF1ZGlvU3RyZWFtOjpzZXRTdGF0ZShhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGUpIHsKKyAgICBBTE9HVigiJXMoJXApIGZyb20gJWQgdG8gJWQiLCBfX2Z1bmNfXywgdGhpcywgbVN0YXRlLCBzdGF0ZSk7CisgICAgLy8gQ0xPU0VEIGlzIGEgZmluYWwgc3RhdGUKKyAgICBpZiAobVN0YXRlID09IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VEKSB7CisgICAgICAgIEFMT0dFKCIlcyglcCkgdHJpZWQgdG8gc2V0IHRvICVkIGJ1dCBhbHJlYWR5IENMT1NFRCIsIF9fZnVuY19fLCB0aGlzLCBzdGF0ZSk7CisKKyAgICAvLyBPbmNlIERJU0NPTk5FQ1RFRCwgd2UgY2FuIG9ubHkgbW92ZSB0byBDTE9TRUQgc3RhdGUuCisgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQKKyAgICAgICAgICAgICAgICYmIHN0YXRlICE9IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VEKSB7CisgICAgICAgIEFMT0dFKCIlcyglcCkgdHJpZWQgdG8gc2V0IHRvICVkIGJ1dCBhbHJlYWR5IERJU0NPTk5FQ1RFRCIsIF9fZnVuY19fLCB0aGlzLCBzdGF0ZSk7CisKKyAgICB9IGVsc2UgeworICAgICAgICBtU3RhdGUgPSBzdGF0ZTsKKyAgICB9Cit9CiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6d2FpdEZvclN0YXRlQ2hhbmdlKGFhdWRpb19zdHJlYW1fc3RhdGVfdCBjdXJyZW50U3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgKm5leHRTdGF0ZSwKQEAgLTE2Myw3ICszMTcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHRocmVhZEFyZykKIHsKICAgICBpZiAobUhhc1RocmVhZCkgewotICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW06OmNyZWF0ZVRocmVhZCgpIC0gbUhhc1RocmVhZCBhbHJlYWR5IHRydWUiKTsKKyAgICAgICAgQUxPR0UoImNyZWF0ZVRocmVhZCgpIC0gbUhhc1RocmVhZCBhbHJlYWR5IHRydWUiKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KICAgICBpZiAodGhyZWFkUHJvYyA9PSBudWxscHRyKSB7CkBAIC0xNzUsOCArMzI5LDIyIEBACiAgICAgc2V0UGVyaW9kTmFub3NlY29uZHMocGVyaW9kTmFub3NlY29uZHMpOwogICAgIGludCBlcnIgPSBwdGhyZWFkX2NyZWF0ZSgmbVRocmVhZCwgbnVsbHB0ciwgQXVkaW9TdHJlYW1faW50ZXJuYWxUaHJlYWRQcm9jLCB0aGlzKTsKICAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KC1lcnJubyk7CisgICAgICAgIGFuZHJvaWQ6OnN0YXR1c190IHN0YXR1cyA9IC1lcnJubzsKKyAgICAgICAgQUxPR0UoImNyZWF0ZVRocmVhZCgpIC0gcHRocmVhZF9jcmVhdGUoKSBmYWlsZWQsICVkIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1cyk7CiAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVE9ETyBVc2UgQUF1ZGlvVGhyZWFkIG9yIG1heWJlIEFuZHJvaWRUaHJlYWQKKyAgICAgICAgLy8gTmFtZSB0aGUgdGhyZWFkIHdpdGggYW4gaW5jcmVhc2luZyBpbmRleCwgIkFBdWRpb18jIiwgZm9yIGRlYnVnZ2luZy4KKyAgICAgICAgc3RhdGljIHN0ZDo6YXRvbWljPHVpbnQzMl90PiBuZXh0VGhyZWFkSW5kZXh7MX07CisgICAgICAgIGNoYXIgbmFtZVsxNl07IC8vIG1heCBsZW5ndGggZm9yIGEgcHRocmVhZF9uYW1lCisgICAgICAgIHVpbnQzMl90IGluZGV4ID0gbmV4dFRocmVhZEluZGV4Kys7CisgICAgICAgIC8vIFdyYXAgdGhlIGluZGV4IHNvIHRoYXQgd2UgZG8gbm90IGhpdCB0aGUgMTYgY2hhciBsaW1pdAorICAgICAgICAvLyBhbmQgdG8gYXZvaWQgaGFyZC10by1yZWFkIGxhcmdlIG51bWJlcnMuCisgICAgICAgIGluZGV4ID0gaW5kZXggJSAxMDAwMDA7ICAvLyBhcmJpdHJhcnkKKyAgICAgICAgc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiQUF1ZGlvXyV1IiwgaW5kZXgpOworICAgICAgICBlcnIgPSBwdGhyZWFkX3NldG5hbWVfbnAobVRocmVhZCwgbmFtZSk7CisgICAgICAgIEFMT0dXX0lGKChlcnIgIT0gMCksICJDb3VsZCBub3Qgc2V0IG5hbWUgb2YgQUF1ZGlvIHRocmVhZC4gZXJyID0gJWQiLCBlcnIpOworCiAgICAgICAgIG1IYXNUaHJlYWQgPSB0cnVlOwogICAgICAgICByZXR1cm4gQUFVRElPX09LOwogICAgIH0KQEAgLTE4NSw3ICszNTMsNyBAQAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpqb2luVGhyZWFkKHZvaWQqKiByZXR1cm5BcmcsIGludDY0X3QgdGltZW91dE5hbm9zZWNvbmRzKQogewogICAgIGlmICghbUhhc1RocmVhZCkgewotICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW06OmpvaW5UaHJlYWQoKSAtIGJ1dCBoYXMgbm8gdGhyZWFkIik7CisgICAgICAgIEFMT0dFKCJqb2luVGhyZWFkKCkgLSBidXQgaGFzIG5vIHRocmVhZCIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogI2lmIDAKQEAgLTE5OSw2ICszNjcsNTcgQEAKICAgICByZXR1cm4gZXJyID8gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoLWVycm5vKSA6IG1UaHJlYWRSZWdpc3RyYXRpb25SZXN1bHQ7CiB9CiAKK2FhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjptYXliZUNhbGxEYXRhQ2FsbGJhY2sodm9pZCAqYXVkaW9EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUDsKKyAgICBBQXVkaW9TdHJlYW1fZGF0YUNhbGxiYWNrIGRhdGFDYWxsYmFjayA9IGdldERhdGFDYWxsYmFja1Byb2MoKTsKKyAgICBpZiAoZGF0YUNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gU3RvcmUgdGhyZWFkIElEIG9mIGNhbGxlciB0byBkZXRlY3Qgc3RvcCgpIGFuZCBjbG9zZSgpIGNhbGxzIGZyb20gY2FsbGJhY2suCisgICAgICAgIHBpZF90IGV4cGVjdGVkID0gQ0FMTEJBQ0tfVEhSRUFEX05PTkU7CisgICAgICAgIGlmIChtRGF0YUNhbGxiYWNrVGhyZWFkLmNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKGV4cGVjdGVkLCBnZXR0aWQoKSkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9ICgqZGF0YUNhbGxiYWNrKSgKKyAgICAgICAgICAgICAgICAgICAgKEFBdWRpb1N0cmVhbSAqKSB0aGlzLAorICAgICAgICAgICAgICAgICAgICBnZXREYXRhQ2FsbGJhY2tVc2VyRGF0YSgpLAorICAgICAgICAgICAgICAgICAgICBhdWRpb0RhdGEsCisgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcyk7CisgICAgICAgICAgICBtRGF0YUNhbGxiYWNrVGhyZWFkLnN0b3JlKENBTExCQUNLX1RIUkVBRF9OT05FKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcygpIGRhdGEgY2FsbGJhY2sgYWxyZWFkeSBydW5uaW5nISIsIF9fZnVuY19fKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIEF1ZGlvU3RyZWFtOjptYXliZUNhbGxFcnJvckNhbGxiYWNrKGFhdWRpb19yZXN1bHRfdCByZXN1bHQpIHsKKyAgICBBQXVkaW9TdHJlYW1fZXJyb3JDYWxsYmFjayBlcnJvckNhbGxiYWNrID0gZ2V0RXJyb3JDYWxsYmFja1Byb2MoKTsKKyAgICBpZiAoZXJyb3JDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIC8vIFN0b3JlIHRocmVhZCBJRCBvZiBjYWxsZXIgdG8gZGV0ZWN0IHN0b3AoKSBhbmQgY2xvc2UoKSBjYWxscyBmcm9tIGNhbGxiYWNrLgorICAgICAgICBwaWRfdCBleHBlY3RlZCA9IENBTExCQUNLX1RIUkVBRF9OT05FOworICAgICAgICBpZiAobUVycm9yQ2FsbGJhY2tUaHJlYWQuY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoZXhwZWN0ZWQsIGdldHRpZCgpKSkgeworICAgICAgICAgICAgKCplcnJvckNhbGxiYWNrKSgKKyAgICAgICAgICAgICAgICAgICAgKEFBdWRpb1N0cmVhbSAqKSB0aGlzLAorICAgICAgICAgICAgICAgICAgICBnZXRFcnJvckNhbGxiYWNrVXNlckRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKyAgICAgICAgICAgIG1FcnJvckNhbGxiYWNrVGhyZWFkLnN0b3JlKENBTExCQUNLX1RIUkVBRF9OT05FKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcygpIGVycm9yIGNhbGxiYWNrIGFscmVhZHkgcnVubmluZyEiLCBfX2Z1bmNfXyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIElzIHRoaXMgcnVubmluZyBvbiB0aGUgc2FtZSB0aHJlYWQgYXMgYSBjYWxsYmFjaz8KKy8vIE5vdGU6IFRoaXMgY2Fubm90IGJlIGltcGxlbWVudGVkIHVzaW5nIGEgdGhyZWFkX2xvY2FsIGJlY2F1c2UgdGhhdCB3b3VsZAorLy8gcmVxdWlyZSB1c2luZyBhIHRocmVhZF9sb2NhbCB2YXJpYWJsZSB0aGF0IGlzIHNoYXJlZCBiZXR3ZWVuIHN0cmVhbXMuCisvLyBTbyBhIHRocmVhZF9sb2NhbCB2YXJpYWJsZSB3b3VsZCBwcmV2ZW50IHN0b3BwaW5nIG9yIGNsb3Npbmcgc3RyZWFtIEEgZnJvbQorLy8gYSBjYWxsYmFjayBvbiBzdHJlYW0gQiwgd2hpY2ggaXMgY3VycmVudGx5IGxlZ2FsIGFuZCBub3Qgc28gdGVycmlibGUuCitib29sIEF1ZGlvU3RyZWFtOjpjb2xsaWRlc1dpdGhDYWxsYmFjaygpIGNvbnN0IHsKKyAgICBwaWRfdCB0aGlzVGhyZWFkID0gZ2V0dGlkKCk7CisgICAgLy8gQ29tcGFyZSB0aGUgY3VycmVudCB0aHJlYWQgSUQgd2l0aCB0aGUgdGhyZWFkIElEIG9mIHRoZSBjYWxsYmFjaworICAgIC8vIHRocmVhZHMgdG8gc2VlIGl0IHRoZXkgbWF0Y2guIElmIHNvIHRoZW4gdGhpcyBjb2RlIGlzIGJlaW5nCisgICAgLy8gY2FsbGVkIGZyb20gb25lIG9mIHRoZSBzdHJlYW0gY2FsbGJhY2sgZnVuY3Rpb25zLgorICAgIHJldHVybiAoKG1FcnJvckNhbGxiYWNrVGhyZWFkLmxvYWQoKSA9PSB0aGlzVGhyZWFkKQorICAgICAgICAgICAgfHwgKG1EYXRhQ2FsbGJhY2tUaHJlYWQubG9hZCgpID09IHRoaXNUaHJlYWQpKTsKK30KIAogI2lmIEFBVURJT19VU0VfVk9MVU1FX1NIQVBFUgogYW5kcm9pZDo6bWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzIEF1ZGlvU3RyZWFtOjphcHBseVZvbHVtZVNoYXBlcigKQEAgLTIwOSw2ICs0MjgsMTIgQEAKIH0KICNlbmRpZgogCit2b2lkIEF1ZGlvU3RyZWFtOjpzZXREdWNrQW5kTXV0ZVZvbHVtZShmbG9hdCBkdWNrQW5kTXV0ZVZvbHVtZSkgeworICAgIEFMT0dEKCIlcygpIHRvICVmIiwgX19mdW5jX18sIGR1Y2tBbmRNdXRlVm9sdW1lKTsKKyAgICBtRHVja0FuZE11dGVWb2x1bWUgPSBkdWNrQW5kTXV0ZVZvbHVtZTsKKyAgICBkb1NldFZvbHVtZSgpOyAvLyBhcHBseSB0aGlzIGNoYW5nZQorfQorCiBBdWRpb1N0cmVhbTo6TXlQbGF5ZXJCYXNlOjpNeVBsYXllckJhc2UoQXVkaW9TdHJlYW0gKnBhcmVudCkgOiBtUGFyZW50KHBhcmVudCkgewogfQogCkBAIC0yMzAsNyArNDU1LDYgQEAKICAgICB9CiB9CiAKLQogdm9pZCBBdWRpb1N0cmVhbTo6TXlQbGF5ZXJCYXNlOjpkZXN0cm95KCkgewogICAgIHVucmVnaXN0ZXJXaXRoQXVkaW9NYW5hZ2VyKCk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oCmluZGV4IDM0MjAyZDIuLjMxYjg5NWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oCkBAIC0zOSw2ICszOSw4IEBACiAKIGNsYXNzIEF1ZGlvU3RyZWFtQnVpbGRlcjsKIAorY29uc3RleHByIHBpZF90ICAgICAgICBDQUxMQkFDS19USFJFQURfTk9ORSA9IDA7CisKIC8qKgogICogQUF1ZGlvIGF1ZGlvIHN0cmVhbS4KICAqLwpAQCAtNDksMTQgKzUxLDQ2IEBACiAKICAgICB2aXJ0dWFsIH5BdWRpb1N0cmVhbSgpOwogCisgICAgLyoqCisgICAgICogTG9jayBhIG11dGV4IGFuZCBtYWtlIHN1cmUgd2UgYXJlIG5vdCBjYWxsaW5nIGZyb20gYSBjYWxsYmFjayBmdW5jdGlvbi4KKyAgICAgKiBAcmV0dXJuIHJlc3VsdCBvZiByZXF1ZXN0U3RhcnQoKTsKKyAgICAgKi8KKyAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZVN0YXJ0KCk7CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZVBhdXNlKCk7CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZUZsdXNoKCk7CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZVN0b3AoKTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBzYWZlQ2xvc2UoKTsKIAogICAgIC8vID09PT09PT09PT09IEJlZ2luIEFCU1RSQUNUIG1ldGhvZHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09Citwcm90ZWN0ZWQ6CiAKICAgICAvKiBBc3luY2hyb25vdXMgcmVxdWVzdHMuCiAgICAgICogVXNlIHdhaXRGb3JTdGF0ZUNoYW5nZSgpIHRvIHdhaXQgZm9yIGNvbXBsZXRpb24uCiAgICAgICovCiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgcmVxdWVzdFN0YXJ0KCkgPSAwOwogCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhlIHN0YXRlIHRvIHNlZSBpZiBQYXVzZSBpZiBjdXJyZW50bHkgbGVnYWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzdWx0IHBvaW50ZXIgdG8gcmV0dXJuIGNvZGUKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgT0sgdG8gY29udGludWUsIGlmIGZhbHNlIHRoZW4gcmV0dXJuIHJlc3VsdAorICAgICAqLworICAgIGJvb2wgY2hlY2tQYXVzZVN0YXRlVHJhbnNpdGlvbihhYXVkaW9fcmVzdWx0X3QgKnJlc3VsdCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNGbHVzaFN1cHBvcnRlZCgpIGNvbnN0IHsKKyAgICAgICAgLy8gT25seSBpbXBsZW1lbnQgRkxVU0ggZm9yIE9VVFBVVCBzdHJlYW1zLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGlzUGF1c2VTdXBwb3J0ZWQoKSBjb25zdCB7CisgICAgICAgIC8vIE9ubHkgaW1wbGVtZW50IFBBVVNFIGZvciBPVVRQVVQgc3RyZWFtcy4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RQYXVzZSgpCiAgICAgewogICAgICAgICAvLyBPbmx5IGltcGxlbWVudCB0aGlzIGZvciBPVVRQVVQgc3RyZWFtcy4KQEAgLTcwLDYgKzEwNCw3IEBACiAKICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0U3RvcCgpID0gMDsKIAorcHVibGljOgogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGdldFRpbWVzdGFtcChjbG9ja2lkX3QgY2xvY2tJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmZyYW1lUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3NlY29uZHMpID0gMDsKQEAgLTgxLDcgKzExNiw2IEBACiAgICAgICovCiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgdXBkYXRlU3RhdGVNYWNoaW5lKCkgPSAwOwogCi0KICAgICAvLyA9PT09PT09PT09PSBFbmQgQUJTVFJBQ1QgbWV0aG9kcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHdhaXRGb3JTdGF0ZUNoYW5nZShhYXVkaW9fc3RyZWFtX3N0YXRlX3QgY3VycmVudFN0YXRlLApAQCAtMTg4LDYgKzIyMiwyMiBAQAogCiAgICAgdmlydHVhbCBhYXVkaW9fZGlyZWN0aW9uX3QgZ2V0RGlyZWN0aW9uKCkgY29uc3QgPSAwOwogCisgICAgYWF1ZGlvX3VzYWdlX3QgZ2V0VXNhZ2UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVXNhZ2U7CisgICAgfQorCisgICAgYWF1ZGlvX2NvbnRlbnRfdHlwZV90IGdldENvbnRlbnRUeXBlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNvbnRlbnRUeXBlOworICAgIH0KKworICAgIGFhdWRpb19pbnB1dF9wcmVzZXRfdCBnZXRJbnB1dFByZXNldCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1JbnB1dFByZXNldDsKKyAgICB9CisKKyAgICBpbnQzMl90IGdldFNlc3Npb25JZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TZXNzaW9uSWQ7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogVGhpcyBpcyBvbmx5IHZhbGlkIGFmdGVyIHNldFNhbXBsZXNQZXJGcmFtZSgpIGFuZCBzZXRGb3JtYXQoKSBoYXZlIGJlZW4gY2FsbGVkLgogICAgICAqLwpAQCAtMjAyLDYgKzI1MiwyMCBAQAogICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9mb3JtYXRUb1NpemVJbkJ5dGVzKG1Gb3JtYXQpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRoaXMgaXMgb25seSB2YWxpZCBhZnRlciBzZXRTYW1wbGVzUGVyRnJhbWUoKSBhbmQgc2V0RGV2aWNlRm9ybWF0KCkgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgICAgKi8KKyAgICBpbnQzMl90IGdldEJ5dGVzUGVyRGV2aWNlRnJhbWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU2FtcGxlc1BlckZyYW1lICogZ2V0Qnl0ZXNQZXJEZXZpY2VTYW1wbGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIG9ubHkgdmFsaWQgYWZ0ZXIgc2V0RGV2aWNlRm9ybWF0KCkgaGFzIGJlZW4gY2FsbGVkLgorICAgICAqLworICAgIGludDMyX3QgZ2V0Qnl0ZXNQZXJEZXZpY2VTYW1wbGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2Zvcm1hdFRvU2l6ZUluQnl0ZXMoZ2V0RGV2aWNlRm9ybWF0KCkpOworICAgIH0KKwogICAgIHZpcnR1YWwgaW50NjRfdCBnZXRGcmFtZXNXcml0dGVuKCkgPSAwOwogCiAgICAgdmlydHVhbCBpbnQ2NF90IGdldEZyYW1lc1JlYWQoKSA9IDA7CkBAIC0yMDksMTMgKzI3MywxOSBAQAogICAgIEFBdWRpb1N0cmVhbV9kYXRhQ2FsbGJhY2sgZ2V0RGF0YUNhbGxiYWNrUHJvYygpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1EYXRhQ2FsbGJhY2tQcm9jOwogICAgIH0KKwogICAgIEFBdWRpb1N0cmVhbV9lcnJvckNhbGxiYWNrIGdldEVycm9yQ2FsbGJhY2tQcm9jKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbUVycm9yQ2FsbGJhY2tQcm9jOwogICAgIH0KIAorICAgIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IG1heWJlQ2FsbERhdGFDYWxsYmFjayh2b2lkICphdWRpb0RhdGEsIGludDMyX3QgbnVtRnJhbWVzKTsKKworICAgIHZvaWQgbWF5YmVDYWxsRXJyb3JDYWxsYmFjayhhYXVkaW9fcmVzdWx0X3QgcmVzdWx0KTsKKwogICAgIHZvaWQgKmdldERhdGFDYWxsYmFja1VzZXJEYXRhKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbURhdGFDYWxsYmFja1VzZXJEYXRhOwogICAgIH0KKwogICAgIHZvaWQgKmdldEVycm9yQ2FsbGJhY2tVc2VyRGF0YSgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1FcnJvckNhbGxiYWNrVXNlckRhdGE7CiAgICAgfQpAQCAtMjI0LDEwICsyOTQsMjUgQEAKICAgICAgICAgcmV0dXJuIG1GcmFtZXNQZXJEYXRhQ2FsbGJhY2s7CiAgICAgfQogCi0gICAgYm9vbCBpc0RhdGFDYWxsYmFja0FjdGl2ZSgpIHsKLSAgICAgICAgcmV0dXJuIChtRGF0YUNhbGxiYWNrUHJvYyAhPSBudWxscHRyKSAmJiBpc0FjdGl2ZSgpOworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBkYXRhIGNhbGxiYWNrIGhhcyBiZWVuIHNwZWNpZmllZAorICAgICAqLworICAgIGJvb2wgaXNEYXRhQ2FsbGJhY2tTZXQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRGF0YUNhbGxiYWNrUHJvYyAhPSBudWxscHRyOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBkYXRhIGNhbGxiYWNrIGhhcyBiZWVuIHNwZWNpZmllZCBhbmQgc3RyZWFtIGlzIHJ1bm5pbmcKKyAgICAgKi8KKyAgICBib29sIGlzRGF0YUNhbGxiYWNrQWN0aXZlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gaXNEYXRhQ2FsbGJhY2tTZXQoKSAmJiBpc0FjdGl2ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBjYWxsZWQgZnJvbSB0aGUgc2FtZSB0aHJlYWQgYXMgdGhlIGNhbGxiYWNrCisgICAgICovCisgICAgYm9vbCBjb2xsaWRlc1dpdGhDYWxsYmFjaygpIGNvbnN0OworCiAgICAgLy8gPT09PT09PT09PT09PT0gSS9PID09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIC8vIEEgU3RyZWFtIHdpbGwgb25seSBpbXBsZW1lbnQgcmVhZCgpIG9yIHdyaXRlKCkgZGVwZW5kaW5nIG9uIGl0cyBkaXJlY3Rpb24uCiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyIF9fdW51c2VkLApAQCAtMjQzLDEyICszMjgsOSBAQAogICAgIH0KIAogICAgIC8vIFRoaXMgaXMgdXNlZCBieSB0aGUgQXVkaW9NYW5hZ2VyIHRvIGR1Y2sgYW5kIG11dGUgdGhlIHN0cmVhbSB3aGVuIGNoYW5naW5nIGF1ZGlvIGZvY3VzLgotICAgIHZvaWQgc2V0RHVja0FuZE11dGVWb2x1bWUoZmxvYXQgZHVja0FuZE11dGVWb2x1bWUpIHsKLSAgICAgICAgbUR1Y2tBbmRNdXRlVm9sdW1lID0gZHVja0FuZE11dGVWb2x1bWU7Ci0gICAgICAgIGRvU2V0Vm9sdW1lKCk7IC8vIGFwcGx5IHRoaXMgY2hhbmdlCi0gICAgfQorICAgIHZvaWQgc2V0RHVja0FuZE11dGVWb2x1bWUoZmxvYXQgZHVja0FuZE11dGVWb2x1bWUpOwogCi0gICAgZmxvYXQgZ2V0RHVja0FuZE11dGVWb2x1bWUoKSB7CisgICAgZmxvYXQgZ2V0RHVja0FuZE11dGVWb2x1bWUoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtRHVja0FuZE11dGVWb2x1bWU7CiAgICAgfQogCkBAIC0yODgsMTEgKzM3MCwxMyBAQAogICAgICAgICByZXR1cm4gbVBsYXllckJhc2UtPmdldFJlc3VsdCgpOwogICAgIH0KIAorICAgIC8vIFBhc3MgcGF1c2UgcmVxdWVzdCB0aHJvdWdoIFBsYXllckJhc2UgZm9yIHRyYWNraW5nLgogICAgIGFhdWRpb19yZXN1bHRfdCBzeXN0ZW1QYXVzZSgpIHsKICAgICAgICAgbVBsYXllckJhc2UtPnBhdXNlKCk7CiAgICAgICAgIHJldHVybiBtUGxheWVyQmFzZS0+Z2V0UmVzdWx0KCk7CiAgICAgfQogCisgICAgLy8gUGFzcyBzdG9wIHJlcXVlc3QgdGhyb3VnaCBQbGF5ZXJCYXNlIGZvciB0cmFja2luZy4KICAgICBhYXVkaW9fcmVzdWx0X3Qgc3lzdGVtU3RvcCgpIHsKICAgICAgICAgbVBsYXllckJhc2UtPnN0b3AoKTsKICAgICAgICAgcmV0dXJuIG1QbGF5ZXJCYXNlLT5nZXRSZXN1bHQoKTsKQEAgLTMzMSwxNyArNDE1LDE3IEBACiAKICAgICAgICAgYW5kcm9pZDo6c3RhdHVzX3QgcGxheWVyU3RhcnQoKSBvdmVycmlkZSB7CiAgICAgICAgICAgICAvLyBtUGFyZW50IHNob3VsZCBOT1QgYmUgbnVsbC4gU28gZ28gYWhlYWQgYW5kIGNyYXNoIGlmIGl0IGlzLgotICAgICAgICAgICAgbVJlc3VsdCA9IG1QYXJlbnQtPnJlcXVlc3RTdGFydCgpOworICAgICAgICAgICAgbVJlc3VsdCA9IG1QYXJlbnQtPnNhZmVTdGFydCgpOwogICAgICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKG1SZXN1bHQpOwogICAgICAgICB9CiAKICAgICAgICAgYW5kcm9pZDo6c3RhdHVzX3QgcGxheWVyUGF1c2UoKSBvdmVycmlkZSB7Ci0gICAgICAgICAgICBtUmVzdWx0ID0gbVBhcmVudC0+cmVxdWVzdFBhdXNlKCk7CisgICAgICAgICAgICBtUmVzdWx0ID0gbVBhcmVudC0+c2FmZVBhdXNlKCk7CiAgICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTdGF0dXMobVJlc3VsdCk7CiAgICAgICAgIH0KIAogICAgICAgICBhbmRyb2lkOjpzdGF0dXNfdCBwbGF5ZXJTdG9wKCkgb3ZlcnJpZGUgewotICAgICAgICAgICAgbVJlc3VsdCA9IG1QYXJlbnQtPnJlcXVlc3RTdG9wKCk7CisgICAgICAgICAgICBtUmVzdWx0ID0gbVBhcmVudC0+c2FmZVN0b3AoKTsKICAgICAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyhtUmVzdWx0KTsKICAgICAgICAgfQogCkBAIC0zNzEsNiArNDU1LDcgQEAKIAogICAgIC8qKgogICAgICAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgorICAgICAqIFRPRE8gZm9yIG11bHRpcGxlIHNldHRlcnM6IGFzc2VydChtU3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9VTklOSVRJQUxJWkVEKQogICAgICAqLwogICAgIHZvaWQgc2V0U2FtcGxlUmF0ZShpbnQzMl90IHNhbXBsZVJhdGUpIHsKICAgICAgICAgbVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOwpAQCAtMzk3LDE1ICs0ODIsMjYgQEAKICAgICAgICAgbUZvcm1hdCA9IGZvcm1hdDsKICAgICB9CiAKLSAgICB2b2lkIHNldFN0YXRlKGFhdWRpb19zdHJlYW1fc3RhdGVfdCBzdGF0ZSkgewotICAgICAgICBtU3RhdGUgPSBzdGF0ZTsKKyAgICAvKioKKyAgICAgKiBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBvcGVuKCkgY2FsbC4KKyAgICAgKi8KKyAgICB2b2lkIHNldERldmljZUZvcm1hdChhYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CisgICAgICAgIG1EZXZpY2VGb3JtYXQgPSBmb3JtYXQ7CiAgICAgfQogCisgICAgYWF1ZGlvX2Zvcm1hdF90IGdldERldmljZUZvcm1hdCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EZXZpY2VGb3JtYXQ7CisgICAgfQorCisgICAgdm9pZCBzZXRTdGF0ZShhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGUpOworCiAgICAgdm9pZCBzZXREZXZpY2VJZChpbnQzMl90IGRldmljZUlkKSB7CiAgICAgICAgIG1EZXZpY2VJZCA9IGRldmljZUlkOwogICAgIH0KIAotICAgIHN0ZDo6bXV0ZXggICAgICAgICAgIG1TdHJlYW1NdXRleDsKKyAgICB2b2lkIHNldFNlc3Npb25JZChpbnQzMl90IHNlc3Npb25JZCkgeworICAgICAgICBtU2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgIH0KIAogICAgIHN0ZDo6YXRvbWljPGJvb2w+ICAgIG1DYWxsYmFja0VuYWJsZWR7ZmFsc2V9OwogCkBAIC00MTMsNiArNTA5LDIxIEBACiAKIHByb3RlY3RlZDoKIAorICAgIC8qKgorICAgICAqIEVpdGhlciBjb252ZXJ0IHRoZSBkYXRhIGZyb20gZGV2aWNlIGZvcm1hdCB0byBhcHAgZm9ybWF0IGFuZCByZXR1cm4gYSBwb2ludGVyCisgICAgICogdG8gdGhlIGNvbnZlcnNpb24gYnVmZmVyLAorICAgICAqIE9SIGp1c3QgcGFzcyBiYWNrIHRoZSBvcmlnaW5hbCBwb2ludGVyLgorICAgICAqCisgICAgICogTm90ZSB0aGF0IHRoaXMgaXMgb25seSB1c2VkIGZvciB0aGUgSU5QVVQgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdWRpb0RhdGEKKyAgICAgKiBAcGFyYW0gbnVtRnJhbWVzCisgICAgICogQHJldHVybiBvcmlnaW5hbCBwb2ludGVyIG9yIHRoZSBjb252ZXJzaW9uIGJ1ZmZlcgorICAgICAqLworICAgIHZpcnR1YWwgY29uc3Qgdm9pZCAqIG1heWJlQ29udmVydERldmljZURhdGEoY29uc3Qgdm9pZCAqYXVkaW9EYXRhLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgICAgICByZXR1cm4gYXVkaW9EYXRhOworICAgIH0KKwogICAgIHZvaWQgc2V0UGVyaW9kTmFub3NlY29uZHMoaW50NjRfdCBwZXJpb2ROYW5vc2Vjb25kcykgewogICAgICAgICBtUGVyaW9kTmFub3NlY29uZHMuc3RvcmUocGVyaW9kTmFub3NlY29uZHMsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UpOwogICAgIH0KQEAgLTQyMSw0MCArNTMyLDc0IEBACiAgICAgICAgIHJldHVybiBtUGVyaW9kTmFub3NlY29uZHMubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBvcGVuKCkgY2FsbC4KKyAgICAgKi8KKyAgICB2b2lkIHNldFVzYWdlKGFhdWRpb191c2FnZV90IHVzYWdlKSB7CisgICAgICAgIG1Vc2FnZSA9IHVzYWdlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgorICAgICAqLworICAgIHZvaWQgc2V0Q29udGVudFR5cGUoYWF1ZGlvX2NvbnRlbnRfdHlwZV90IGNvbnRlbnRUeXBlKSB7CisgICAgICAgIG1Db250ZW50VHlwZSA9IGNvbnRlbnRUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgorICAgICAqLworICAgIHZvaWQgc2V0SW5wdXRQcmVzZXQoYWF1ZGlvX2lucHV0X3ByZXNldF90IGlucHV0UHJlc2V0KSB7CisgICAgICAgIG1JbnB1dFByZXNldCA9IGlucHV0UHJlc2V0OworICAgIH0KKwogcHJpdmF0ZToKKworICAgIHN0ZDo6bXV0ZXggICAgICAgICAgICAgICAgIG1TdHJlYW1Mb2NrOworCiAgICAgY29uc3QgYW5kcm9pZDo6c3A8TXlQbGF5ZXJCYXNlPiAgIG1QbGF5ZXJCYXNlOwogCiAgICAgLy8gVGhlc2UgZG8gbm90IGNoYW5nZSBhZnRlciBvcGVuKCkuCi0gICAgaW50MzJfdCAgICAgICAgICAgICAgICBtU2FtcGxlc1BlckZyYW1lID0gQUFVRElPX1VOU1BFQ0lGSUVEOwotICAgIGludDMyX3QgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUgPSBBQVVESU9fVU5TUEVDSUZJRUQ7Ci0gICAgaW50MzJfdCAgICAgICAgICAgICAgICBtRGV2aWNlSWQgPSBBQVVESU9fVU5TUEVDSUZJRUQ7Ci0gICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90ICBtU2hhcmluZ01vZGUgPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDsKLSAgICBib29sICAgICAgICAgICAgICAgICAgIG1TaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQgPSBmYWxzZTsgLy8gbXVzdCBtYXRjaCBzaGFyaW5nIG1vZGUgcmVxdWVzdGVkCi0gICAgYWF1ZGlvX2Zvcm1hdF90ICAgICAgICBtRm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDsKLSAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgIG1TdGF0ZSA9IEFBVURJT19TVFJFQU1fU1RBVEVfVU5JTklUSUFMSVpFRDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZXNQZXJGcmFtZSA9IEFBVURJT19VTlNQRUNJRklFRDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VJZCA9IEFBVURJT19VTlNQRUNJRklFRDsKKyAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3QgICAgICAgbVNoYXJpbmdNb2RlID0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQ7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQgPSBmYWxzZTsgLy8gbXVzdCBtYXRjaCBzaGFyaW5nIG1vZGUgcmVxdWVzdGVkCisgICAgYWF1ZGlvX2Zvcm1hdF90ICAgICAgICAgICAgIG1Gb3JtYXQgPSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOworICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCAgICAgICBtU3RhdGUgPSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOSU5JVElBTElaRUQ7CisgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCAgIG1QZXJmb3JtYW5jZU1vZGUgPSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FOwogCi0gICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBtUGVyZm9ybWFuY2VNb2RlID0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORTsKKyAgICBhYXVkaW9fdXNhZ2VfdCAgICAgICAgICAgICAgbVVzYWdlICAgICAgICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKKyAgICBhYXVkaW9fY29udGVudF90eXBlX3QgICAgICAgbUNvbnRlbnRUeXBlICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKKyAgICBhYXVkaW9faW5wdXRfcHJlc2V0X3QgICAgICAgbUlucHV0UHJlc2V0ICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKKworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkID0gQUFVRElPX1VOU1BFQ0lGSUVEOworCisgICAgLy8gU29tZXRpbWVzIHRoZSBoYXJkd2FyZSBpcyBvcGVyYXRpbmcgd2l0aCBhIGRpZmZlcmVudCBmb3JtYXQgZnJvbSB0aGUgYXBwLgorICAgIC8vIFRoZW4gd2UgcmVxdWlyZSBjb252ZXJzaW9uIGluIEFBdWRpby4KKyAgICBhYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICAgbURldmljZUZvcm1hdCA9IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ7CiAKICAgICAvLyBjYWxsYmFjayAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICAgICBBQXVkaW9TdHJlYW1fZGF0YUNhbGxiYWNrICAgbURhdGFDYWxsYmFja1Byb2MgPSBudWxscHRyOyAgLy8gZXh0ZXJuYWwgY2FsbGJhY2sgZnVuY3Rpb25zCiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKm1EYXRhQ2FsbGJhY2tVc2VyRGF0YSA9IG51bGxwdHI7CiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNQZXJEYXRhQ2FsbGJhY2sgPSBBQVVESU9fVU5TUEVDSUZJRUQ7IC8vIGZyYW1lcworICAgIHN0ZDo6YXRvbWljPHBpZF90PiAgICAgICAgICBtRGF0YUNhbGxiYWNrVGhyZWFke0NBTExCQUNLX1RIUkVBRF9OT05FfTsKIAogICAgIEFBdWRpb1N0cmVhbV9lcnJvckNhbGxiYWNrICBtRXJyb3JDYWxsYmFja1Byb2MgPSBudWxscHRyOwogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICptRXJyb3JDYWxsYmFja1VzZXJEYXRhID0gbnVsbHB0cjsKKyAgICBzdGQ6OmF0b21pYzxwaWRfdD4gICAgICAgICAgbUVycm9yQ2FsbGJhY2tUaHJlYWR7Q0FMTEJBQ0tfVEhSRUFEX05PTkV9OwogCiAgICAgLy8gYmFja2dyb3VuZCB0aHJlYWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgbUhhc1RocmVhZCA9IGZhbHNlOwotICAgIHB0aHJlYWRfdCAgICAgICAgICAgICAgbVRocmVhZDsgLy8gaW5pdGlhbGl6ZWQgaW4gY29uc3RydWN0b3IKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUhhc1RocmVhZCA9IGZhbHNlOworICAgIHB0aHJlYWRfdCAgICAgICAgICAgICAgICAgICBtVGhyZWFkOyAvLyBpbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvcgogCiAgICAgLy8gVGhlc2UgYXJlIHNldCBieSB0aGUgYXBwbGljYXRpb24gdGhyZWFkIGFuZCB0aGVuIHJlYWQgYnkgdGhlIGF1ZGlvIHB0aHJlYWQuCi0gICAgc3RkOjphdG9taWM8aW50NjRfdD4gICBtUGVyaW9kTmFub3NlY29uZHM7IC8vIGZvciB0dW5pbmcgU0NIRURfRklGTyB0aHJlYWRzCisgICAgc3RkOjphdG9taWM8aW50NjRfdD4gICAgICAgIG1QZXJpb2ROYW5vc2Vjb25kczsgLy8gZm9yIHR1bmluZyBTQ0hFRF9GSUZPIHRocmVhZHMKICAgICAvLyBUT0RPIG1ha2UgYXRvbWljPwotICAgIGFhdWRpb19hdWRpb190aHJlYWRfcHJvY190IG1UaHJlYWRQcm9jID0gbnVsbHB0cjsKLSAgICB2b2lkKiAgICAgICAgICAgICAgICAgIG1UaHJlYWRBcmcgPSBudWxscHRyOwotICAgIGFhdWRpb19yZXN1bHRfdCAgICAgICAgbVRocmVhZFJlZ2lzdHJhdGlvblJlc3VsdCA9IEFBVURJT19PSzsKLQorICAgIGFhdWRpb19hdWRpb190aHJlYWRfcHJvY190ICBtVGhyZWFkUHJvYyA9IG51bGxwdHI7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKm1UaHJlYWRBcmcgPSBudWxscHRyOworICAgIGFhdWRpb19yZXN1bHRfdCAgICAgICAgICAgICBtVGhyZWFkUmVnaXN0cmF0aW9uUmVzdWx0ID0gQUFVRElPX09LOwogCiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuY3BwCmluZGV4IDA5ZWJiM2UuLjNhN2E1NzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuY3BwCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIExPR19UQUcgIkFBdWRpbyIKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9TdHJlYW1CdWlsZGVyIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCkBAIC04Nyw3ICs4Nyw3IEBACiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtQnVpbGRlcigpOiBiYWQgZGlyZWN0aW9uID0gJWQiLCBkaXJlY3Rpb24pOworICAgICAgICAgICAgQUxPR0UoIiVzKCkgYmFkIGRpcmVjdGlvbiA9ICVkIiwgX19mdW5jX18sIGRpcmVjdGlvbik7CiAgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTk5LDcgKzk5LDcgQEAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUJ1aWxkZXI6OmJ1aWxkKEF1ZGlvU3RyZWFtKiogc3RyZWFtUHRyKSB7CiAgICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gbnVsbHB0cjsKICAgICBpZiAoc3RyZWFtUHRyID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtQnVpbGRlcjo6YnVpbGQoKSBzdHJlYW1QdHIgaXMgbnVsbCIpOworICAgICAgICBBTE9HRSgiJXMoKSBzdHJlYW1QdHIgaXMgbnVsbCIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9OVUxMOwogICAgIH0KICAgICAqc3RyZWFtUHRyID0gbnVsbHB0cjsKQEAgLTEyNCwxMyArMTI0LDExIEBACiAgICAgaWYgKG1hcEV4Y2x1c2l2ZVBvbGljeSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKICAgICAgICAgbWFwRXhjbHVzaXZlUG9saWN5ID0gQUFVRElPX01NQVBfRVhDTFVTSVZFX1BPTElDWV9ERUZBVUxUOwogICAgIH0KLSAgICBBTE9HRCgiQXVkaW9TdHJlYW1CdWlsZGVyKCk6IG1tYXBQb2xpY3kgPSAlZCwgbWFwRXhjbHVzaXZlUG9saWN5ID0gJWQiLAotICAgICAgICAgIG1tYXBQb2xpY3ksIG1hcEV4Y2x1c2l2ZVBvbGljeSk7CiAKICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUgPSBnZXRTaGFyaW5nTW9kZSgpOwogICAgIGlmICgoc2hhcmluZ01vZGUgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpCiAgICAgICAgICYmIChtYXBFeGNsdXNpdmVQb2xpY3kgPT0gQUFVRElPX1BPTElDWV9ORVZFUikpIHsKLSAgICAgICAgQUxPR1coIkF1ZGlvU3RyZWFtQnVpbGRlcigpOiBFWENMVVNJVkUgc2hhcmluZyBtb2RlIG5vdCBzdXBwb3J0ZWQuIFVzZSBTSEFSRUQuIik7CisgICAgICAgIEFMT0dEKCIlcygpIEVYQ0xVU0lWRSBzaGFyaW5nIG1vZGUgbm90IHN1cHBvcnRlZC4gVXNlIFNIQVJFRC4iLCBfX2Z1bmNfXyk7CiAgICAgICAgIHNoYXJpbmdNb2RlID0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQ7CiAgICAgICAgIHNldFNoYXJpbmdNb2RlKHNoYXJpbmdNb2RlKTsKICAgICB9CkBAIC0xNDEsNiArMTM5LDE0IEBACiAgICAgLy8gVE9ETyBTdXBwb3J0IG90aGVyIHBlcmZvcm1hbmNlIHNldHRpbmdzIGluIE1NQVAgbW9kZS4KICAgICAvLyBEaXNhYmxlIE1NQVAgaWYgbG93IGxhdGVuY3kgbm90IHJlcXVlc3RlZC4KICAgICBpZiAoZ2V0UGVyZm9ybWFuY2VNb2RlKCkgIT0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kpIHsKKyAgICAgICAgQUxPR0QoIiVzKCkgTU1BUCBub3QgYXZhaWxhYmxlIGJlY2F1c2UgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kgbm90IHVzZWQuIiwKKyAgICAgICAgICAgICAgX19mdW5jX18pOworICAgICAgICBhbGxvd01NYXAgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBTZXNzaW9uSUQgYW5kIEVmZmVjdHMgYXJlIG9ubHkgc3VwcG9ydGVkIGluIExlZ2FjeSBtb2RlLgorICAgIGlmIChnZXRTZXNzaW9uSWQoKSAhPSBBQVVESU9fU0VTU0lPTl9JRF9OT05FKSB7CisgICAgICAgIEFMT0dEKCIlcygpIE1NQVAgbm90IGF2YWlsYWJsZSBiZWNhdXNlIHNlc3Npb25JZCB1c2VkLiIsIF9fZnVuY19fKTsKICAgICAgICAgYWxsb3dNTWFwID0gZmFsc2U7CiAgICAgfQogCkBAIC0xNTYsNyArMTYyLDcgQEAKICAgICAgICAgICAgIGF1ZGlvU3RyZWFtID0gbnVsbHB0cjsKIAogICAgICAgICAgICAgaWYgKGlzTU1hcCAmJiBhbGxvd0xlZ2FjeSkgewotICAgICAgICAgICAgICAgIEFMT0dEKCJBdWRpb1N0cmVhbUJ1aWxkZXIuYnVpbGQoKSBNTUFQIHN0cmVhbSBkaWQgbm90IG9wZW4gc28gdHJ5IExlZ2FjeSBwYXRoIik7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzKCkgTU1BUCBzdHJlYW0gZGlkIG5vdCBvcGVuIHNvIHRyeSBMZWdhY3kgcGF0aCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgICAgICAvLyBJZiBNTUFQIHN0cmVhbSBmYWlsZWQgdG8gb3BlbiB0aGVuIFRSWSB1c2luZyBhIGxlZ2FjeSBzdHJlYW0uCiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYnVpbGRlcl9jcmVhdGVTdHJlYW0oZ2V0RGlyZWN0aW9uKCksIHNoYXJpbmdNb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAmYXVkaW9TdHJlYW0pOwpAQCAtMTkwLDcgKzE5Niw3IEBACiAgICAgICAgIGNhc2UgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1k6CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbUJ1aWxkZXI6IGlsbGVnYWwgcGVyZm9ybWFuY2VNb2RlID0gJWQiLCBtUGVyZm9ybWFuY2VNb2RlKTsKKyAgICAgICAgICAgIEFMT0dFKCJpbGxlZ2FsIHBlcmZvcm1hbmNlTW9kZSA9ICVkIiwgbVBlcmZvcm1hbmNlTW9kZSk7CiAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQ7CiAgICAgICAgICAgICAvLyBicmVhazsKICAgICB9CkBAIC0xOTksNyArMjA1LDcgQEAKICAgICBpZiAobUZyYW1lc1BlckRhdGFDYWxsYmFjayAhPSBBQVVESU9fVU5TUEVDSUZJRUQKICAgICAgICAgJiYgKG1GcmFtZXNQZXJEYXRhQ2FsbGJhY2sgPCBGUkFNRVNfUEVSX0RBVEFfQ0FMTEJBQ0tfTUlOCiAgICAgICAgICAgICB8fCBtRnJhbWVzUGVyRGF0YUNhbGxiYWNrID4gRlJBTUVTX1BFUl9EQVRBX0NBTExCQUNLX01BWCkpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtQnVpbGRlcjogZnJhbWVzUGVyRGF0YUNhbGxiYWNrIG91dCBvZiByYW5nZSA9ICVkIiwKKyAgICAgICAgQUxPR0UoImZyYW1lc1BlckRhdGFDYWxsYmFjayBvdXQgb2YgcmFuZ2UgPSAlZCIsCiAgICAgICAgICAgICAgIG1GcmFtZXNQZXJEYXRhQ2FsbGJhY2spOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5jcHAKaW5kZXggYTg2OTg4Ni4uYjA5MjU4ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmNwcApAQCAtMjIsNiArMjIsOCBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCiAjaW5jbHVkZSAiRmlmb0NvbnRyb2xsZXJCYXNlLmgiCiAjaW5jbHVkZSAiRmlmb0NvbnRyb2xsZXIuaCIKICNpbmNsdWRlICJGaWZvQ29udHJvbGxlckluZGlyZWN0LmgiCkBAIC00Myw3ICs0NSw3IEBACiAgICAgaW50MzJfdCBieXRlc1BlckJ1ZmZlciA9IGJ5dGVzUGVyRnJhbWUgKiBjYXBhY2l0eUluRnJhbWVzOwogICAgIG1TdG9yYWdlID0gbmV3IHVpbnQ4X3RbYnl0ZXNQZXJCdWZmZXJdOwogICAgIG1TdG9yYWdlT3duZWQgPSB0cnVlOwotICAgIEFMT0dEKCJGaWZvQnVmZmVyOiBjYXBhY2l0eUluRnJhbWVzID0gJWQsIGJ5dGVzUGVyRnJhbWUgPSAlZCIsCisgICAgQUxPR1YoImNhcGFjaXR5SW5GcmFtZXMgPSAlZCwgYnl0ZXNQZXJGcmFtZSA9ICVkIiwKICAgICAgICAgICBjYXBhY2l0eUluRnJhbWVzLCBieXRlc1BlckZyYW1lKTsKIH0KIApAQCAtODUsMTUgKzg3LDE0IEBACiAgICAgd3JhcHBpbmdCdWZmZXItPmRhdGFbMV0gPSBudWxscHRyOwogICAgIHdyYXBwaW5nQnVmZmVyLT5udW1GcmFtZXNbMV0gPSAwOwogICAgIGlmIChmcmFtZXNBdmFpbGFibGUgPiAwKSB7Ci0KICAgICAgICAgdWludDhfdCAqc291cmNlID0gJm1TdG9yYWdlW2NvbnZlcnRGcmFtZXNUb0J5dGVzKHN0YXJ0SW5kZXgpXTsKICAgICAgICAgLy8gRG9lcyB0aGUgYXZhaWxhYmxlIGRhdGEgY3Jvc3MgdGhlIGVuZCBvZiB0aGUgRklGTz8KICAgICAgICAgaWYgKChzdGFydEluZGV4ICsgZnJhbWVzQXZhaWxhYmxlKSA+IG1GcmFtZUNhcGFjaXR5KSB7CiAgICAgICAgICAgICB3cmFwcGluZ0J1ZmZlci0+ZGF0YVswXSA9IHNvdXJjZTsKLSAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLT5udW1GcmFtZXNbMF0gPSBtRnJhbWVDYXBhY2l0eSAtIHN0YXJ0SW5kZXg7CisgICAgICAgICAgICBmaWZvX2ZyYW1lc190IGZpcnN0RnJhbWVzID0gbUZyYW1lQ2FwYWNpdHkgLSBzdGFydEluZGV4OworICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXItPm51bUZyYW1lc1swXSA9IGZpcnN0RnJhbWVzOwogICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXItPmRhdGFbMV0gPSAmbVN0b3JhZ2VbMF07Ci0gICAgICAgICAgICB3cmFwcGluZ0J1ZmZlci0+bnVtRnJhbWVzWzFdID0gbUZyYW1lQ2FwYWNpdHkgLSBzdGFydEluZGV4OwotCisgICAgICAgICAgICB3cmFwcGluZ0J1ZmZlci0+bnVtRnJhbWVzWzFdID0gZnJhbWVzQXZhaWxhYmxlIC0gZmlyc3RGcmFtZXM7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB3cmFwcGluZ0J1ZmZlci0+ZGF0YVswXSA9IHNvdXJjZTsKICAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLT5udW1GcmFtZXNbMF0gPSBmcmFtZXNBdmFpbGFibGU7CkBAIC0xMDIsMTggKzEwMywxOSBAQAogICAgICAgICB3cmFwcGluZ0J1ZmZlci0+ZGF0YVswXSA9IG51bGxwdHI7CiAgICAgICAgIHdyYXBwaW5nQnVmZmVyLT5udW1GcmFtZXNbMF0gPSAwOwogICAgIH0KLQogfQogCiBmaWZvX2ZyYW1lc190IEZpZm9CdWZmZXI6OmdldEZ1bGxEYXRhQXZhaWxhYmxlKFdyYXBwaW5nQnVmZmVyICp3cmFwcGluZ0J1ZmZlcikgewotICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0gbUZpZm8tPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAvLyBUaGUgRklGTyBtaWdodCBiZSBvdmVyZnVsbCBzbyBjbGlwIHRvIGNhcGFjaXR5LgorICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0gc3RkOjptaW4obUZpZm8tPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKSwgbUZyYW1lQ2FwYWNpdHkpOwogICAgIGZpZm9fZnJhbWVzX3Qgc3RhcnRJbmRleCA9IG1GaWZvLT5nZXRSZWFkSW5kZXgoKTsKICAgICBmaWxsV3JhcHBpbmdCdWZmZXIod3JhcHBpbmdCdWZmZXIsIGZyYW1lc0F2YWlsYWJsZSwgc3RhcnRJbmRleCk7CiAgICAgcmV0dXJuIGZyYW1lc0F2YWlsYWJsZTsKIH0KIAogZmlmb19mcmFtZXNfdCBGaWZvQnVmZmVyOjpnZXRFbXB0eVJvb21BdmFpbGFibGUoV3JhcHBpbmdCdWZmZXIgKndyYXBwaW5nQnVmZmVyKSB7Ci0gICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPSBtRmlmby0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAvLyBUaGUgRklGTyBtaWdodCBoYXZlIHVuZGVycnVuIHNvIGNsaXAgdG8gY2FwYWNpdHkuCisgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPSBzdGQ6Om1pbihtRmlmby0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKSwgbUZyYW1lQ2FwYWNpdHkpOwogICAgIGZpZm9fZnJhbWVzX3Qgc3RhcnRJbmRleCA9IG1GaWZvLT5nZXRXcml0ZUluZGV4KCk7CiAgICAgZmlsbFdyYXBwaW5nQnVmZmVyKHdyYXBwaW5nQnVmZmVyLCBmcmFtZXNBdmFpbGFibGUsIHN0YXJ0SW5kZXgpOwogICAgIHJldHVybiBmcmFtZXNBdmFpbGFibGU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAKaW5kZXggZWUyNTA0ZC4uYTZiOWY1ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmNwcApAQCAtMTksMTAgKzE5LDEyIEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorCisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UaW1lc3RhbXAuaD4KLSNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KIAogI2luY2x1ZGUgImNvcmUvQXVkaW9TdHJlYW0uaCIKICNpbmNsdWRlICJsZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuaCIKQEAgLTQ4LDE5ICs1MCwxNyBAQAogICAgIHJldHVybiBBdWRpb1N0cmVhbUxlZ2FjeV9jYWxsYmFjazsKIH0KIAotaW50MzJfdCBBdWRpb1N0cmVhbUxlZ2FjeTo6Y2FsbERhdGFDYWxsYmFja0ZyYW1lcyh1aW50OF90ICpidWZmZXIsIGludDMyX3QgbnVtRnJhbWVzKSB7CithYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBBdWRpb1N0cmVhbUxlZ2FjeTo6Y2FsbERhdGFDYWxsYmFja0ZyYW1lcyh1aW50OF90ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcykgeworICAgIHZvaWQgKmZpbmFsQXVkaW9EYXRhID0gYnVmZmVyOwogICAgIGlmIChnZXREaXJlY3Rpb24oKSA9PSBBQVVESU9fRElSRUNUSU9OX0lOUFVUKSB7CiAgICAgICAgIC8vIEluY3JlbWVudCBiZWZvcmUgYmVjYXVzZSB3ZSBhbHJlYWR5IGdvdCB0aGUgZGF0YSBmcm9tIHRoZSBkZXZpY2UuCiAgICAgICAgIGluY3JlbWVudEZyYW1lc1JlYWQobnVtRnJhbWVzKTsKKyAgICAgICAgZmluYWxBdWRpb0RhdGEgPSAodm9pZCAqKSBtYXliZUNvbnZlcnREZXZpY2VEYXRhKGJ1ZmZlciwgbnVtRnJhbWVzKTsKICAgICB9CiAKICAgICAvLyBDYWxsIHVzaW5nIHRoZSBBQXVkaW8gY2FsbGJhY2sgaW50ZXJmYWNlLgotICAgIEFBdWRpb1N0cmVhbV9kYXRhQ2FsbGJhY2sgYXBwQ2FsbGJhY2sgPSBnZXREYXRhQ2FsbGJhY2tQcm9jKCk7Ci0gICAgYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgY2FsbGJhY2tSZXN1bHQgPSAoKmFwcENhbGxiYWNrKSgKLSAgICAgICAgICAgIChBQXVkaW9TdHJlYW0gKikgdGhpcywKLSAgICAgICAgICAgIGdldERhdGFDYWxsYmFja1VzZXJEYXRhKCksCi0gICAgICAgICAgICBidWZmZXIsCi0gICAgICAgICAgICBudW1GcmFtZXMpOworICAgIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IGNhbGxiYWNrUmVzdWx0ID0gbWF5YmVDYWxsRGF0YUNhbGxiYWNrKGZpbmFsQXVkaW9EYXRhLCBudW1GcmFtZXMpOwogCiAgICAgaWYgKGNhbGxiYWNrUmVzdWx0ID09IEFBVURJT19DQUxMQkFDS19SRVNVTFRfQ09OVElOVUUKICAgICAgICAgICAgICYmIGdldERpcmVjdGlvbigpID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKSB7CkBAIC03MiwzMSArNzIsNDAgQEAKIAogLy8gSW1wbGVtZW50IEZpeGVkQmxvY2tQcm9jZXNzb3IKIGludDMyX3QgQXVkaW9TdHJlYW1MZWdhY3k6Om9uUHJvY2Vzc0ZpeGVkQmxvY2sodWludDhfdCAqYnVmZmVyLCBpbnQzMl90IG51bUJ5dGVzKSB7Ci0gICAgaW50MzJfdCBudW1GcmFtZXMgPSBudW1CeXRlcyAvIGdldEJ5dGVzUGVyRnJhbWUoKTsKLSAgICByZXR1cm4gY2FsbERhdGFDYWxsYmFja0ZyYW1lcyhidWZmZXIsIG51bUZyYW1lcyk7CisgICAgaW50MzJfdCBudW1GcmFtZXMgPSBudW1CeXRlcyAvIGdldEJ5dGVzUGVyRGV2aWNlRnJhbWUoKTsKKyAgICByZXR1cm4gKGludDMyX3QpIGNhbGxEYXRhQ2FsbGJhY2tGcmFtZXMoYnVmZmVyLCBudW1GcmFtZXMpOwogfQogCiB2b2lkIEF1ZGlvU3RyZWFtTGVnYWN5Ojpwcm9jZXNzQ2FsbGJhY2tDb21tb24oYWF1ZGlvX2NhbGxiYWNrX29wZXJhdGlvbl90IG9wY29kZSwgdm9pZCAqaW5mbykgewogICAgIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IGNhbGxiYWNrUmVzdWx0OworICAgIC8vIFRoaXMgaWxsZWdhbCBzaXplIGNhbiBiZSB1c2VkIHRvIHRlbGwgQXVkaW9GbGluZ2VyIHRvIHN0b3AgY2FsbGluZyB1cy4KKyAgICAvLyBUaGlzIHRha2VzIGFkdmFudGFnZSBvZiBBdWRpb0ZsaW5nZXIga2lsbGluZyB0aGUgc3RyZWFtLgorICAgIC8vIFRPRE8gYWRkIHRvIEFQSSBpbiBBdWRpb1JlY29yZCBhbmQgQXVkaW9UcmFjaworICAgIGNvbnN0IHNpemVfdCBTSVpFX1NUT1BfQ0FMTEJBQ0tTID0gU0laRV9NQVg7CiAKICAgICBzd2l0Y2ggKG9wY29kZSkgewogICAgICAgICBjYXNlIEFBVURJT19DQUxMQkFDS19PUEVSQVRJT05fUFJPQ0VTU19EQVRBOiB7Ci0gICAgICAgICAgICBjaGVja0ZvckRpc2Nvbm5lY3RSZXF1ZXN0KCk7CisgICAgICAgICAgICAodm9pZCkgY2hlY2tGb3JEaXNjb25uZWN0UmVxdWVzdCh0cnVlKTsKIAogICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgY29kZSBhc3N1bWVzIGFuIEF1ZGlvVHJhY2s6OkJ1ZmZlciBpcyB0aGUgc2FtZSBhcwogICAgICAgICAgICAgLy8gQXVkaW9SZWNvcmQ6OkJ1ZmZlcgogICAgICAgICAgICAgLy8gVE9ETyBkZWZpbmUgb3VyIG93biBBdWRpb0J1ZmZlciBhbmQgcGFzcyBpdCBmcm9tIHRoZSBzdWJjbGFzc2VzLgogICAgICAgICAgICAgQXVkaW9UcmFjazo6QnVmZmVyICphdWRpb0J1ZmZlciA9IHN0YXRpY19jYXN0PEF1ZGlvVHJhY2s6OkJ1ZmZlciAqPihpbmZvKTsKLSAgICAgICAgICAgIGlmIChnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEIHx8ICFtQ2FsbGJhY2tFbmFibGVkLmxvYWQoKSkgewotICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gMDsgLy8gc2lsZW5jZSB0aGUgYnVmZmVyCisgICAgICAgICAgICBpZiAoZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJwcm9jZXNzQ2FsbGJhY2tDb21tb24oKSBkYXRhLCBzdHJlYW0gZGlzY29ubmVjdGVkIik7CisgICAgICAgICAgICAgICAgYXVkaW9CdWZmZXItPnNpemUgPSBTSVpFX1NUT1BfQ0FMTEJBQ0tTOworICAgICAgICAgICAgfSBlbHNlIGlmICghbUNhbGxiYWNrRW5hYmxlZC5sb2FkKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygicHJvY2Vzc0NhbGxiYWNrQ29tbW9uKCkgc3RvcHBpbmcgYmVjYXVzZSBjYWxsYmFjayBkaXNhYmxlZCIpOworICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gU0laRV9TVE9QX0NBTExCQUNLUzsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coInByb2Nlc3NDYWxsYmFja0NvbW1vbigpIGRhdGEsIGZyYW1lQ291bnQgaXMgemVybyIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNhbGxlciBzcGVjaWZpZWQgYW4gZXhhY3Qgc2l6ZSB0aGVuIHVzZSBhIGJsb2NrIHNpemUgYWRhcHRlci4KICAgICAgICAgICAgICAgICBpZiAobUJsb2NrQWRhcHRlciAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgYnl0ZUNvdW50ID0gYXVkaW9CdWZmZXItPmZyYW1lQ291bnQgKiBnZXRCeXRlc1BlckZyYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYnl0ZUNvdW50ID0gYXVkaW9CdWZmZXItPmZyYW1lQ291bnQgKiBnZXRCeXRlc1BlckRldmljZUZyYW1lKCk7CiAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrUmVzdWx0ID0gbUJsb2NrQWRhcHRlci0+cHJvY2Vzc1ZhcmlhYmxlQmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKikgYXVkaW9CdWZmZXItPnJhdywgYnl0ZUNvdW50KTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTA1LDkgKzExNCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9CdWZmZXItPmZyYW1lQ291bnQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tSZXN1bHQgPT0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9DT05USU5VRSkgewotICAgICAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50ICogZ2V0Qnl0ZXNQZXJGcmFtZSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9CdWZmZXItPnNpemUgPSBhdWRpb0J1ZmZlci0+ZnJhbWVDb3VudCAqIGdldEJ5dGVzUGVyRGV2aWNlRnJhbWUoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBTVE9QIG9yIGludmFsaWQgcmVzdWx0CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGNhbGxiYWNrIHJlcXVlc3RlZCBzdG9wLCBmYWtlIGFuIGVycm9yIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IFNJWkVfU1RPUF9DQUxMQkFDS1M7CisgICAgICAgICAgICAgICAgICAgIC8vIERpc2FibGUgdGhlIGNhbGxiYWNrIGp1c3QgaW4gY2FzZSBBdWRpb0ZsaW5nZXIga2VlcHMgdHJ5aW5nIHRvIGNhbGwgdXMuCisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmICh1cGRhdGVTdGF0ZU1hY2hpbmUoKSAhPSBBQVVESU9fT0spIHsKQEAgLTEzMCwyNiArMTQyLDIzIEBACiAgICAgfQogfQogCi0KLQotdm9pZCBBdWRpb1N0cmVhbUxlZ2FjeTo6Y2hlY2tGb3JEaXNjb25uZWN0UmVxdWVzdCgpIHsKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUxlZ2FjeTo6Y2hlY2tGb3JEaXNjb25uZWN0UmVxdWVzdChib29sIGVycm9yQ2FsbGJhY2tFbmFibGVkKSB7CiAgICAgaWYgKG1SZXF1ZXN0RGlzY29ubmVjdC5pc1JlcXVlc3RlZCgpKSB7CiAgICAgICAgIEFMT0dEKCJjaGVja0ZvckRpc2Nvbm5lY3RSZXF1ZXN0KCkgbVJlcXVlc3REaXNjb25uZWN0IGFja25vd2xlZGdlZCIpOwotICAgICAgICBmb3JjZURpc2Nvbm5lY3QoKTsKKyAgICAgICAgZm9yY2VEaXNjb25uZWN0KGVycm9yQ2FsbGJhY2tFbmFibGVkKTsKICAgICAgICAgbVJlcXVlc3REaXNjb25uZWN0LmFja25vd2xlZGdlKCk7CiAgICAgICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQUFVRElPX09LOwogICAgIH0KIH0KIAotdm9pZCBBdWRpb1N0cmVhbUxlZ2FjeTo6Zm9yY2VEaXNjb25uZWN0KCkgewordm9pZCBBdWRpb1N0cmVhbUxlZ2FjeTo6Zm9yY2VEaXNjb25uZWN0KGJvb2wgZXJyb3JDYWxsYmFja0VuYWJsZWQpIHsKICAgICBpZiAoZ2V0U3RhdGUoKSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCkgewogICAgICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCk7Ci0gICAgICAgIGlmIChnZXRFcnJvckNhbGxiYWNrUHJvYygpICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICgqZ2V0RXJyb3JDYWxsYmFja1Byb2MoKSkoCi0gICAgICAgICAgICAgICAgICAgIChBQXVkaW9TdHJlYW0gKikgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgZ2V0RXJyb3JDYWxsYmFja1VzZXJEYXRhKCksCi0gICAgICAgICAgICAgICAgICAgIEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQKLSAgICAgICAgICAgICk7CisgICAgICAgIGlmIChlcnJvckNhbGxiYWNrRW5hYmxlZCkgeworICAgICAgICAgICAgbWF5YmVDYWxsRXJyb3JDYWxsYmFjayhBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTE3NSwxOSArMTg0LDE3IEBACiAgICAgaW50NjRfdCBsb2NhbFBvc2l0aW9uOwogICAgIHN0YXR1c190IHN0YXR1cyA9IGV4dGVuZGVkVGltZXN0YW1wLT5nZXRCZXN0VGltZXN0YW1wKCZsb2NhbFBvc2l0aW9uLCB0aW1lTmFub3NlY29uZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZWJhc2UsICZsb2NhdGlvbik7Ci0gICAgLy8gdXNlIE1vbm90b25pY0NvdW50ZXIgdG8gcHJldmVudCByZXRyb2dyYWRlIG1vdGlvbi4KLSAgICBtVGltZXN0YW1wUG9zaXRpb24udXBkYXRlMzIoKGludDMyX3QpbG9jYWxQb3NpdGlvbik7Ci0gICAgKmZyYW1lUG9zaXRpb24gPSBtVGltZXN0YW1wUG9zaXRpb24uZ2V0KCk7CisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICAvLyB1c2UgTW9ub3RvbmljQ291bnRlciB0byBwcmV2ZW50IHJldHJvZ3JhZGUgbW90aW9uLgorICAgICAgICBtVGltZXN0YW1wUG9zaXRpb24udXBkYXRlMzIoKGludDMyX3QpIGxvY2FsUG9zaXRpb24pOworICAgICAgICAqZnJhbWVQb3NpdGlvbiA9IG1UaW1lc3RhbXBQb3NpdGlvbi5nZXQoKTsKKyAgICB9CiAKIC8vICAgIEFMT0dEKCJnZXRCZXN0VGltZXN0YW1wKCkgZnBvc2l0aW9uOiBzZXJ2ZXIgPSAlNmxsZCwga2VybmVsID0gJTZsbGQsIGxvY2F0aW9uID0gJWQiLAogLy8gICAgICAgICAgKGxvbmcgbG9uZykgZXh0ZW5kZWRUaW1lc3RhbXAtPm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TG9jYXRpb246OkxPQ0FUSU9OX1NFUlZFUl0sCiAvLyAgICAgICAgICAobG9uZyBsb25nKSBleHRlbmRlZFRpbWVzdGFtcC0+bVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMb2NhdGlvbjo6TE9DQVRJT05fS0VSTkVMXSwKIC8vICAgICAgICAgIChpbnQpbG9jYXRpb24pOwotICAgIGlmIChzdGF0dXMgPT0gV09VTERfQkxPQ0spIHsKLSAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChzdGF0dXMpOwotICAgIH0KKyAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzKTsKIH0KIAogdm9pZCBBdWRpb1N0cmVhbUxlZ2FjeTo6b25BdWRpb0RldmljZVVwZGF0ZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmgKaW5kZXggN2UyODU3OS4uNDk0ZWRiYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oCkBAIC0xMTIsMTIgKzExMiwxNCBAQAogCiAgICAgdm9pZCBvbkF1ZGlvRGV2aWNlVXBkYXRlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpOwogCi0gICAgdm9pZCBjaGVja0ZvckRpc2Nvbm5lY3RSZXF1ZXN0KCk7CisgICAgLyoKKyAgICAgKiBDaGVjayB0byBzZWUgd2hldGhlciBhIGNhbGxiYWNrIHRocmVhZCBoYXMgcmVxdWVzdGVkIGEgZGlzY29ubmVjdGVkLgorICAgICAqIEBwYXJhbSBlcnJvckNhbGxiYWNrRW5hYmxlZCBzZXQgdHJ1ZSB0byBjYWxsIGVycm9yQ2FsbGJhY2sgb24gZGlzY29ubmVjdAorICAgICAqIEByZXR1cm4gQUFVRElPX09LIG9yIEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQKKyAgICAgKi8KKyAgICBhYXVkaW9fcmVzdWx0X3QgY2hlY2tGb3JEaXNjb25uZWN0UmVxdWVzdChib29sIGVycm9yQ2FsbGJhY2tFbmFibGVkKTsKIAotICAgIHZvaWQgZm9yY2VEaXNjb25uZWN0KCk7Ci0KLSAgICB2b2lkIG9uU3RhcnQoKSB7IG1DYWxsYmFja0VuYWJsZWQuc3RvcmUodHJ1ZSk7IH0KLSAgICB2b2lkIG9uU3RvcCgpIHsgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7IH0KKyAgICB2b2lkIGZvcmNlRGlzY29ubmVjdChib29sIGVycm9yQ2FsbGJhY2tFbmFibGVkID0gdHJ1ZSk7CiAKICAgICBpbnQ2NF90IGluY3JlbWVudEZyYW1lc1dyaXR0ZW4oaW50MzJfdCBmcmFtZXMpIHsKICAgICAgICAgcmV0dXJuIG1GcmFtZXNXcml0dGVuLmluY3JlbWVudChmcmFtZXMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwCmluZGV4IGJjNmU2MGMuLjUwNWYyZWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAKQEAgLTE5LDEzICsxOSwxNSBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1JlY29yZC5oPgotI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KIAotI2luY2x1ZGUgIkF1ZGlvQ2xvY2suaCIKKyNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVjb3JkLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKwogI2luY2x1ZGUgImxlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oIgogI2luY2x1ZGUgImxlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5oIgorI2luY2x1ZGUgInV0aWxpdHkvQXVkaW9DbG9jay5oIgogI2luY2x1ZGUgInV0aWxpdHkvRml4ZWRCbG9ja1dyaXRlci5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKQEAgLTYzLDEwICs2NSw2IEBACiAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAoYnVpbGRlci5nZXRCdWZmZXJDYXBhY2l0eSgpID09IEFBVURJT19VTlNQRUNJRklFRCkgPyAwCiAgICAgICAgICAgICAgICAgICAgICAgICA6IGJ1aWxkZXIuZ2V0QnVmZmVyQ2FwYWNpdHkoKTsKIAotICAgIC8vIFRPRE8gaW1wbGVtZW50IGFuIHVuc3BlY2lmaWVkIEFuZHJvaWQgZm9ybWF0IHRoZW4gdXNlIHRoYXQuCi0gICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQpCi0gICAgICAgICAgICA/IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQKLSAgICAgICAgICAgIDogQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWREYXRhRm9ybWF0KGdldEZvcm1hdCgpKTsKIAogICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19JTlBVVF9GTEFHX05PTkU7CiAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSA9IGdldFBlcmZvcm1hbmNlTW9kZSgpOwpAQCAtODIsNiArODAsMzUgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAorICAgIC8vIFByZXNlcnZlIGJlaGF2aW9yIG9mIEFQSSAyNgorICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgIHNldEZvcm1hdChBQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CisgICAgfQorCisgICAgLy8gTWF5YmUgY2hhbmdlIGRldmljZSBmb3JtYXQgdG8gZ2V0IGEgRkFTVCBwYXRoLgorICAgIC8vIEF1ZGlvUmVjb3JkIGRvZXMgbm90IHN1cHBvcnQgRkFTVCBtb2RlIGZvciBGTE9BVCBkYXRhLgorICAgIC8vIFRPRE8gQXVkaW9SZWNvcmQgc2hvdWxkIGFsbG93IEZMT0FUIGRhdGEgcGF0aHMgZm9yIEZBU1QgdHJhY2tzLgorICAgIC8vIFNvIElGIHRoZSB1c2VyIGFza3MgZm9yIGxvdyBsYXRlbmN5IEZMT0FUCisgICAgLy8gQU5EIHRoZSBzYW1wbGVSYXRlIGlzIGxpa2VseSB0byBiZSBjb21wYXRpYmxlIHdpdGggRkFTVAorICAgIC8vIFRIRU4gcmVxdWVzdCBJMTYgYW5kIGNvbnZlcnQgdG8gRkxPQVQgd2hlbiBwYXNzaW5nIHRvIHVzZXIuCisgICAgLy8gTm90ZSB0aGF0IGhhcmQgY29kaW5nIDQ4MDAwIEh6IGlzIG5vdCBpZGVhbCBiZWNhdXNlIHRoZSBzYW1wbGVSYXRlCisgICAgLy8gZm9yIGEgRkFTVCBwYXRoIG1pZ2h0IG5vdCBiZSA0ODAwMCBIei4KKyAgICAvLyBJdCBub3JtYWxseSBpcyBidXQgdGhlcmUgaXMgYSBjaGFuY2UgdGhhdCBpdCBpcyBub3QuCisgICAgLy8gQW5kIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0byBrbm93IHRoYXQgaW4gYWR2YW5jZS4KKyAgICAvLyBMdWNraWx5IHRoZSBjb25zZXF1ZW5jZXMgb2YgYSB3cm9uZyBndWVzcyBhcmUgbWlub3IuCisgICAgLy8gV2UganVzdCBtYXkgbm90IGdldCBhIEZBU1QgdHJhY2suCisgICAgLy8gQnV0IHdlIHdvdWxkbid0IGhhdmUgYW55d2F5IHdpdGhvdXQgdGhpcyBoYWNrLgorICAgIGNvbnN0ZXhwciBpbnQzMl90IGtNb3N0TGlrZWx5U2FtcGxlUmF0ZUZvckZhc3QgPSA0ODAwMDsKKyAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQKKyAgICAgICAgICAgICYmIHBlcmZNb2RlID09IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZCisgICAgICAgICAgICAmJiAoc2FtcGxlc1BlckZyYW1lIDw9IDIpIC8vIEZBU1Qgb25seSBmb3IgbW9ubyBhbmQgc3RlcmVvCisgICAgICAgICAgICAmJiAoZ2V0U2FtcGxlUmF0ZSgpID09IGtNb3N0TGlrZWx5U2FtcGxlUmF0ZUZvckZhc3QKKyAgICAgICAgICAgICAgICB8fCBnZXRTYW1wbGVSYXRlKCkgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSkgeworICAgICAgICBzZXREZXZpY2VGb3JtYXQoQUFVRElPX0ZPUk1BVF9QQ01fSTE2KTsKKyAgICB9IGVsc2UgeworICAgICAgICBzZXREZXZpY2VGb3JtYXQoZ2V0Rm9ybWF0KCkpOworICAgIH0KKwogICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDA7CiAKICAgICAvLyBTZXR1cCB0aGUgY2FsbGJhY2sgaWYgdGhlcmUgaXMgb25lLgpAQCAtOTYsNDcgKzEyMyw4NCBAQAogICAgIH0KICAgICBtQ2FsbGJhY2tCdWZmZXJTaXplID0gYnVpbGRlci5nZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soKTsKIAotICAgIEFMT0dEKCJBdWRpb1N0cmVhbVJlY29yZDo6b3BlbigpLCByZXF1ZXN0IG5vdGlmaWNhdGlvbkZyYW1lcyA9ICV1LCBmcmFtZUNvdW50ID0gJXUiLAotICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywgKHVpbnQpZnJhbWVDb3VudCk7Ci0gICAgbUF1ZGlvUmVjb3JkID0gbmV3IEF1ZGlvUmVjb3JkKAotICAgICAgICAgICAgbU9wUGFja2FnZU5hbWUgLy8gY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUgVE9ETyBkb2VzIG5vdCBjb21waWxlCi0gICAgICAgICAgICApOwotICAgIGlmIChnZXREZXZpY2VJZCgpICE9IEFBVURJT19VTlNQRUNJRklFRCkgewotICAgICAgICBtQXVkaW9SZWNvcmQtPnNldElucHV0RGV2aWNlKGdldERldmljZUlkKCkpOwotICAgIH0KLSAgICBtQXVkaW9SZWNvcmQtPnNldCgKLSAgICAgICAgICAgIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiwKLSAgICAgICAgICAgIGdldFNhbXBsZVJhdGUoKSwKLSAgICAgICAgICAgIGZvcm1hdCwKLSAgICAgICAgICAgIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgZnJhbWVDb3VudCwKLSAgICAgICAgICAgIGNhbGxiYWNrLAotICAgICAgICAgICAgY2FsbGJhY2tEYXRhLAotICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLAotICAgICAgICAgICAgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLAotICAgICAgICAgICAgQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKLSAgICAgICAgICAgIHN0cmVhbVRyYW5zZmVyVHlwZSwKLSAgICAgICAgICAgIGZsYWdzCi0gICAgICAgICAgICAvLyAgIGludCB1aWQgPSAtMSwKLSAgICAgICAgICAgIC8vICAgcGlkX3QgcGlkID0gLTEsCi0gICAgICAgICAgICAvLyAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBudWxscHRyCi0gICAgICAgICAgICApOworICAgIC8vIERvbid0IGNhbGwgbUF1ZGlvUmVjb3JkLT5zZXRJbnB1dERldmljZSgpIGJlY2F1c2UgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiBieSBzZXQoKSEKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSAoZ2V0RGV2aWNlSWQoKSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBVURJT19QT1JUX0hBTkRMRV9OT05FCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBnZXREZXZpY2VJZCgpOwogCi0gICAgLy8gRGlkIHdlIGdldCBhIHZhbGlkIHRyYWNrPwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1JlY29yZC0+aW5pdENoZWNrKCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICBjbG9zZSgpOwotICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW1SZWNvcmQ6Om9wZW4oKSwgaW5pdENoZWNrKCkgcmV0dXJuZWQgJWQiLCBzdGF0dXMpOwotICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzKTsKKyAgICBjb25zdCBhdWRpb19jb250ZW50X3R5cGVfdCBjb250ZW50VHlwZSA9CisgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2NvbnRlbnRUeXBlVG9JbnRlcm5hbChidWlsZGVyLmdldENvbnRlbnRUeXBlKCkpOworICAgIGNvbnN0IGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9CisgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2lucHV0UHJlc2V0VG9BdWRpb1NvdXJjZShidWlsZGVyLmdldElucHV0UHJlc2V0KCkpOworCisgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7CisgICAgICAgICAgICAuY29udGVudF90eXBlID0gY29udGVudFR5cGUsCisgICAgICAgICAgICAudXNhZ2UgPSBBVURJT19VU0FHRV9VTktOT1dOLCAvLyBvbmx5IHVzZWQgZm9yIG91dHB1dAorICAgICAgICAgICAgLnNvdXJjZSA9IHNvdXJjZSwKKyAgICAgICAgICAgIC5mbGFncyA9IEFVRElPX0ZMQUdfTk9ORSwgLy8gRGlmZmVyZW50IHRoYW4gdGhlIEFVRElPX0lOUFVUX0ZMQUdTCisgICAgICAgICAgICAudGFncyA9ICIiCisgICAgfTsKKworICAgIGFhdWRpb19zZXNzaW9uX2lkX3QgcmVxdWVzdGVkU2Vzc2lvbklkID0gYnVpbGRlci5nZXRTZXNzaW9uSWQoKTsKKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTZXNzaW9uSWQocmVxdWVzdGVkU2Vzc2lvbklkKTsKKworICAgIC8vIC0tLS0tLS0tLS0tIG9wZW4gdGhlIEF1ZGlvUmVjb3JkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIE1pZ2h0IHJldHJ5LCBidXQgbmV2ZXIgbW9yZSB0aGFuIG9uY2UuCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpICsrKSB7CisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IHJlcXVlc3RlZEludGVybmFsRm9ybWF0ID0KKyAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZERhdGFGb3JtYXQoZ2V0RGV2aWNlRm9ybWF0KCkpOworCisgICAgICAgIG1BdWRpb1JlY29yZCA9IG5ldyBBdWRpb1JlY29yZCgKKyAgICAgICAgICAgICAgICBtT3BQYWNrYWdlTmFtZSAvLyBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSBUT0RPIGRvZXMgbm90IGNvbXBpbGUKKyAgICAgICAgKTsKKyAgICAgICAgbUF1ZGlvUmVjb3JkLT5zZXQoCisgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIC8vIGlnbm9yZWQgYmVjYXVzZSB3ZSBwYXNzIGF0dHJpYnV0ZXMgYmVsb3cKKyAgICAgICAgICAgICAgICBnZXRTYW1wbGVSYXRlKCksCisgICAgICAgICAgICAgICAgcmVxdWVzdGVkSW50ZXJuYWxGb3JtYXQsCisgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICBjYWxsYmFja0RhdGEsCisgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICAgICAgICAgIGZhbHNlIC8qdGhyZWFkQ2FuQ2FsbEphdmEqLywKKyAgICAgICAgICAgICAgICBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgc3RyZWFtVHJhbnNmZXJUeXBlLAorICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgIEFVRElPX1VJRF9JTlZBTElELCAvLyBERUZBVUxUIHVpZAorICAgICAgICAgICAgICAgIC0xLCAgICAgICAgICAgICAgICAvLyBERUZBVUxUIHBpZAorICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgIHNlbGVjdGVkRGV2aWNlSWQKKyAgICAgICAgKTsKKworICAgICAgICAvLyBEaWQgd2UgZ2V0IGEgdmFsaWQgdHJhY2s/CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1JlY29yZC0+aW5pdENoZWNrKCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICBBTE9HRSgib3BlbigpLCBpbml0Q2hlY2soKSByZXR1cm5lZCAlZCIsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiBpdCB3YXMgd29ydGggaGFja2luZyB0aGUgZGV2aWNlRm9ybWF0LgorICAgICAgICBib29sIGdvdEZhc3RQYXRoID0gKG1BdWRpb1JlY29yZC0+Z2V0RmxhZ3MoKSAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgID09IEFVRElPX0lOUFVUX0ZMQUdfRkFTVDsKKyAgICAgICAgaWYgKGdldEZvcm1hdCgpICE9IGdldERldmljZUZvcm1hdCgpICYmICFnb3RGYXN0UGF0aCkgeworICAgICAgICAgICAgLy8gV2UgdHJpZWQgdG8gZ2V0IGEgRkFTVCBwYXRoIGJ5IHN3aXRjaGluZyB0aGUgZGV2aWNlIGZvcm1hdC4KKyAgICAgICAgICAgIC8vIEJ1dCBpdCBkaWRuJ3Qgd29yay4gU28gd2UgbWlnaHQgYXMgd2VsbCByZW9wZW4gdXNpbmcgdGhlIHNhbWUKKyAgICAgICAgICAgIC8vIGZvcm1hdCBmb3IgZGV2aWNlIGFuZCBmb3IgYXBwLgorICAgICAgICAgICAgQUxPR0QoIiVzKCkgdXNlZCBhIGRpZmZlcmVudCBkZXZpY2UgZm9ybWF0IGJ1dCBubyBGQVNUIHBhdGgsIHJlb3BlbiIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIG1BdWRpb1JlY29yZC5jbGVhcigpOworICAgICAgICAgICAgc2V0RGV2aWNlRm9ybWF0KGdldEZvcm1hdCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJyZWFrOyAvLyBLZWVwIHRoZSBvbmUgd2UganVzdCBvcGVuZWQuCisgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBHZXQgdGhlIGFjdHVhbCB2YWx1ZXMgZnJvbSB0aGUgQXVkaW9SZWNvcmQuCiAgICAgc2V0U2FtcGxlc1BlckZyYW1lKG1BdWRpb1JlY29yZC0+Y2hhbm5lbENvdW50KCkpOwotICAgIHNldEZvcm1hdChBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb0RhdGFGb3JtYXQobUF1ZGlvUmVjb3JkLT5mb3JtYXQoKSkpOwogCiAgICAgaW50MzJfdCBhY3R1YWxTYW1wbGVSYXRlID0gbUF1ZGlvUmVjb3JkLT5nZXRTYW1wbGVSYXRlKCk7CiAgICAgQUxPR1dfSUYoYWN0dWFsU2FtcGxlUmF0ZSAhPSBnZXRTYW1wbGVSYXRlKCksCi0gICAgICAgICAgICAgIkF1ZGlvU3RyZWFtUmVjb3JkOjpvcGVuKCkgc2FtcGxlUmF0ZSBjaGFuZ2VkIGZyb20gJWQgdG8gJWQiLAorICAgICAgICAgICAgICJvcGVuKCkgc2FtcGxlUmF0ZSBjaGFuZ2VkIGZyb20gJWQgdG8gJWQiLAogICAgICAgICAgICAgIGdldFNhbXBsZVJhdGUoKSwgYWN0dWFsU2FtcGxlUmF0ZSk7CiAgICAgc2V0U2FtcGxlUmF0ZShhY3R1YWxTYW1wbGVSYXRlKTsKIApAQCAtMTQ5LDYgKzIxMywyOSBAQAogICAgICAgICBtQmxvY2tBZGFwdGVyID0gbnVsbHB0cjsKICAgICB9CiAKKyAgICAvLyBBbGxvY2F0ZSBmb3JtYXQgY29udmVyc2lvbiBidWZmZXIgaWYgbmVlZGVkLgorICAgIGlmIChnZXREZXZpY2VGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYKKyAgICAgICAgJiYgZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKworICAgICAgICBpZiAoYnVpbGRlci5nZXREYXRhQ2FsbGJhY2tQcm9jKCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIGNhbGxiYWNrIHRoZW4gd2UgbmVlZCB0byBjb252ZXJ0IHRoZSBkYXRhIGludG8gYW4gaW50ZXJuYWwgZmxvYXQKKyAgICAgICAgICAgIC8vIGFycmF5IGFuZCB0aGVuIHBhc3MgdGhhdCBlbnRpcmUgYXJyYXkgdG8gdGhlIGFwcC4KKyAgICAgICAgICAgIG1Gb3JtYXRDb252ZXJzaW9uQnVmZmVyU2l6ZUluRnJhbWVzID0KKyAgICAgICAgICAgICAgICAgICAgKG1DYWxsYmFja0J1ZmZlclNpemUgIT0gQUFVRElPX1VOU1BFQ0lGSUVEKQorICAgICAgICAgICAgICAgICAgICA/IG1DYWxsYmFja0J1ZmZlclNpemUgOiBnZXRGcmFtZXNQZXJCdXJzdCgpOworICAgICAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzID0gbUZvcm1hdENvbnZlcnNpb25CdWZmZXJTaXplSW5GcmFtZXMgKiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICAgICAgICAgIG1Gb3JtYXRDb252ZXJzaW9uQnVmZmVyRmxvYXQgPSBzdGQ6Om1ha2VfdW5pcXVlPGZsb2F0W10+KG51bVNhbXBsZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIGNhbGxiYWNrIHRoZW4gd2Ugd2lsbCByZWFkIGludG8gYW4gaW50ZXJuYWwgc2hvcnQgYXJyYXkKKyAgICAgICAgICAgIC8vIGFuZCB0aGVuIGNvbnZlcnQgaW50byB0aGUgYXBwIGZsb2F0IGFycmF5IGluIHJlYWQoKS4KKyAgICAgICAgICAgIG1Gb3JtYXRDb252ZXJzaW9uQnVmZmVyU2l6ZUluRnJhbWVzID0gZ2V0RnJhbWVzUGVyQnVyc3QoKTsKKyAgICAgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IG1Gb3JtYXRDb252ZXJzaW9uQnVmZmVyU2l6ZUluRnJhbWVzICogZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgICAgICAgICBtRm9ybWF0Q29udmVyc2lvbkJ1ZmZlckkxNiA9IHN0ZDo6bWFrZV91bmlxdWU8aW50MTZfdFtdPihudW1TYW1wbGVzKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HRCgiJXMoKSBzZXR1cCBJMTY+RkxPQVQgY29udmVyc2lvbiBidWZmZXIgd2l0aCAlZCBmcmFtZXMiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgbUZvcm1hdENvbnZlcnNpb25CdWZmZXJTaXplSW5GcmFtZXMpOworICAgIH0KKwogICAgIC8vIFVwZGF0ZSBwZXJmb3JtYW5jZSBtb2RlIGJhc2VkIG9uIHRoZSBhY3R1YWwgc3RyZWFtLgogICAgIC8vIEZvciBleGFtcGxlLCBpZiB0aGUgc2FtcGxlIHJhdGUgZG9lcyBub3QgbWF0Y2ggbmF0aXZlIHRoZW4geW91IHdvbid0IGdldCBhIEZBU1QgdHJhY2suCiAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBhY3R1YWxGbGFncyA9IG1BdWRpb1JlY29yZC0+Z2V0RmxhZ3MoKTsKQEAgLTE2NCwxNCArMjUxLDIxIEBACiAKICAgICAvLyBMb2cgd2FybmluZyBpZiB3ZSBkaWQgbm90IGdldCB3aGF0IHdlIGFza2VkIGZvci4KICAgICBBTE9HV19JRihhY3R1YWxGbGFncyAhPSBmbGFncywKLSAgICAgICAgICAgICAiQXVkaW9TdHJlYW1SZWNvcmQ6Om9wZW4oKSBmbGFncyBjaGFuZ2VkIGZyb20gMHglMDhYIHRvIDB4JTA4WCIsCisgICAgICAgICAgICAgIm9wZW4oKSBmbGFncyBjaGFuZ2VkIGZyb20gMHglMDhYIHRvIDB4JTA4WCIsCiAgICAgICAgICAgICAgZmxhZ3MsIGFjdHVhbEZsYWdzKTsKICAgICBBTE9HV19JRihhY3R1YWxQZXJmb3JtYW5jZU1vZGUgIT0gcGVyZk1vZGUsCi0gICAgICAgICAgICAgIkF1ZGlvU3RyZWFtUmVjb3JkOjpvcGVuKCkgcGVyZk1vZGUgY2hhbmdlZCBmcm9tICVkIHRvICVkIiwKKyAgICAgICAgICAgICAib3BlbigpIHBlcmZNb2RlIGNoYW5nZWQgZnJvbSAlZCB0byAlZCIsCiAgICAgICAgICAgICAgcGVyZk1vZGUsIGFjdHVhbFBlcmZvcm1hbmNlTW9kZSk7CiAKICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX09QRU4pOwogICAgIHNldERldmljZUlkKG1BdWRpb1JlY29yZC0+Z2V0Um91dGVkRGV2aWNlSWQoKSk7CisKKyAgICBhYXVkaW9fc2Vzc2lvbl9pZF90IGFjdHVhbFNlc3Npb25JZCA9CisgICAgICAgICAgICAocmVxdWVzdGVkU2Vzc2lvbklkID09IEFBVURJT19TRVNTSU9OX0lEX05PTkUpCisgICAgICAgICAgICA/IEFBVURJT19TRVNTSU9OX0lEX05PTkUKKyAgICAgICAgICAgIDogKGFhdWRpb19zZXNzaW9uX2lkX3QpIG1BdWRpb1JlY29yZC0+Z2V0U2Vzc2lvbklkKCk7CisgICAgc2V0U2Vzc2lvbklkKGFjdHVhbFNlc3Npb25JZCk7CisKICAgICBtQXVkaW9SZWNvcmQtPmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrKTsKIAogICAgIHJldHVybiBBQVVESU9fT0s7CkBAIC0xODksNiArMjgzLDI0IEBACiAgICAgcmV0dXJuIEF1ZGlvU3RyZWFtOjpjbG9zZSgpOwogfQogCitjb25zdCB2b2lkICogQXVkaW9TdHJlYW1SZWNvcmQ6Om1heWJlQ29udmVydERldmljZURhdGEoY29uc3Qgdm9pZCAqYXVkaW9EYXRhLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGlmIChtRm9ybWF0Q29udmVyc2lvbkJ1ZmZlckZsb2F0LmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihudW1GcmFtZXMgPiBtRm9ybWF0Q29udmVyc2lvbkJ1ZmZlclNpemVJbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKSBjb252ZXJzaW9uIHNpemUgJWQgdG9vIGxhcmdlIGZvciBidWZmZXIgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBudW1GcmFtZXMsIG1Gb3JtYXRDb252ZXJzaW9uQnVmZmVyU2l6ZUluRnJhbWVzKTsKKworICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBudW1GcmFtZXMgKiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICAgICAgLy8gT25seSBjb252ZXJzaW9uIHN1cHBvcnRlZCBpcyBJMTYgdG8gRkxPQVQKKyAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KAorICAgICAgICAgICAgICAgICAgICBtRm9ybWF0Q29udmVyc2lvbkJ1ZmZlckZsb2F0LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBhdWRpb0RhdGEsCisgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMpOworICAgICAgICByZXR1cm4gbUZvcm1hdENvbnZlcnNpb25CdWZmZXJGbG9hdC5nZXQoKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gYXVkaW9EYXRhOworICAgIH0KK30KKwogdm9pZCBBdWRpb1N0cmVhbVJlY29yZDo6cHJvY2Vzc0NhbGxiYWNrKGludCBldmVudCwgdm9pZCAqaW5mbykgewogICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICAgICAgY2FzZSBBdWRpb1JlY29yZDo6RVZFTlRfTU9SRV9EQVRBOgpAQCAtMjE3LDExICszMjksMTMgQEAKICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KGVycik7CiAgICAgfQogCisgICAgLy8gRW5hYmxlIGNhbGxiYWNrIGJlZm9yZSBzdGFydGluZyBBdWRpb1RyYWNrIHRvIGF2b2lkIHNodXR0aW5nCisgICAgLy8gZG93biBiZWNhdXNlIG9mIGEgcmFjZSBjb25kaXRpb24uCisgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZSh0cnVlKTsKICAgICBlcnIgPSBtQXVkaW9SZWNvcmQtPnN0YXJ0KCk7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKICAgICB9IGVsc2UgewotICAgICAgICBvblN0YXJ0KCk7CiAgICAgICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRJTkcpOwogICAgIH0KICAgICByZXR1cm4gQUFVRElPX09LOwpAQCAtMjMxLDE1ICszNDUsMTYgQEAKICAgICBpZiAobUF1ZGlvUmVjb3JkLmdldCgpID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KLSAgICBvblN0b3AoKTsKICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQSU5HKTsKICAgICBpbmNyZW1lbnRGcmFtZXNXcml0dGVuKGdldEZyYW1lc1JlYWQoKSAtIGdldEZyYW1lc1dyaXR0ZW4oKSk7IC8vIFRPRE8gcmV2aWV3CiAgICAgbVRpbWVzdGFtcFBvc2l0aW9uLnNldChnZXRGcmFtZXNSZWFkKCkpOwogICAgIG1BdWRpb1JlY29yZC0+c3RvcCgpOwotICAgIG1GcmFtZXNSZWFkLnJlc2V0MzIoKTsKKyAgICBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKGZhbHNlKTsKKyAgICBtRnJhbWVzV3JpdHRlbi5yZXNldDMyKCk7IC8vIHNlcnZpY2Ugd3JpdGVzIGZyYW1lcywgc2VydmljZSBwb3NpdGlvbiByZXNldCBvbiBmbHVzaAogICAgIG1UaW1lc3RhbXBQb3NpdGlvbi5yZXNldDMyKCk7Ci0gICAgY2hlY2tGb3JEaXNjb25uZWN0UmVxdWVzdCgpOwotICAgIHJldHVybiBBQVVESU9fT0s7CisgICAgLy8gUGFzcyBmYWxzZSB0byBwcmV2ZW50IGVycm9yQ2FsbGJhY2sgZnJvbSBiZWluZyBjYWxsZWQgYWZ0ZXIgZGlzY29ubmVjdAorICAgIC8vIHdoZW4gYXBwIGhhcyBhbHJlYWR5IHJlcXVlc3RlZCBhIHN0b3AoKS4KKyAgICByZXR1cm4gY2hlY2tGb3JEaXNjb25uZWN0UmVxdWVzdChmYWxzZSk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVJlY29yZDo6dXBkYXRlU3RhdGVNYWNoaW5lKCkKQEAgLTI3Miw5ICszODcsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZW91dE5hbm9zZWNvbmRzKQogewotICAgIGludDMyX3QgYnl0ZXNQZXJGcmFtZSA9IGdldEJ5dGVzUGVyRnJhbWUoKTsKKyAgICBpbnQzMl90IGJ5dGVzUGVyRGV2aWNlRnJhbWUgPSBnZXRCeXRlc1BlckRldmljZUZyYW1lKCk7CiAgICAgaW50MzJfdCBudW1CeXRlczsKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvQ29udmVydF9mcmFtZXNUb0J5dGVzKG51bUZyYW1lcywgYnl0ZXNQZXJGcmFtZSwgJm51bUJ5dGVzKTsKKyAgICAvLyBUaGlzIHdpbGwgZGV0ZWN0IG91dCBvZiByYW5nZSB2YWx1ZXMgZm9yIG51bUZyYW1lcy4KKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvQ29udmVydF9mcmFtZXNUb0J5dGVzKG51bUZyYW1lcywgYnl0ZXNQZXJEZXZpY2VGcmFtZSwgJm51bUJ5dGVzKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KQEAgLTI4NSwxOSArNDAxLDQ5IEBACiAKICAgICAvLyBUT0RPIGFkZCB0aW1lb3V0IHRvIEF1ZGlvUmVjb3JkCiAgICAgYm9vbCBibG9ja2luZyA9ICh0aW1lb3V0TmFub3NlY29uZHMgPiAwKTsKLSAgICBzc2l6ZV90IGJ5dGVzUmVhZCA9IG1BdWRpb1JlY29yZC0+cmVhZChidWZmZXIsIG51bUJ5dGVzLCBibG9ja2luZyk7Ci0gICAgaWYgKGJ5dGVzUmVhZCA9PSBXT1VMRF9CTE9DSykgeworCisgICAgc3NpemVfdCBieXRlc0FjdHVhbGx5UmVhZCA9IDA7CisgICAgc3NpemVfdCB0b3RhbEJ5dGVzUmVhZCA9IDA7CisgICAgaWYgKG1Gb3JtYXRDb252ZXJzaW9uQnVmZmVySTE2LmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gQ29udmVydCBJMTYgZGF0YSB0byBmbG9hdCB1c2luZyBhbiBpbnRlcm1lZGlhdGUgYnVmZmVyLgorICAgICAgICBmbG9hdCAqZmxvYXRCdWZmZXIgPSAoZmxvYXQgKikgYnVmZmVyOworICAgICAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBudW1GcmFtZXM7CisgICAgICAgIC8vIFBlcmZvcm0gY29udmVyc2lvbiB1c2luZyBtdWx0aXBsZSByZWFkKClzIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgd2hpbGUgKGZyYW1lc0xlZnQgPiAwKSB7CisgICAgICAgICAgICAvLyBSZWFkIGludG8gc2hvcnQgaW50ZXJuYWwgYnVmZmVyLgorICAgICAgICAgICAgaW50MzJfdCBmcmFtZXNUb1JlYWQgPSBzdGQ6Om1pbihmcmFtZXNMZWZ0LCBtRm9ybWF0Q29udmVyc2lvbkJ1ZmZlclNpemVJbkZyYW1lcyk7CisgICAgICAgICAgICBzaXplX3QgYnl0ZXNUb1JlYWQgPSBmcmFtZXNUb1JlYWQgKiBieXRlc1BlckRldmljZUZyYW1lOworICAgICAgICAgICAgYnl0ZXNBY3R1YWxseVJlYWQgPSBtQXVkaW9SZWNvcmQtPnJlYWQobUZvcm1hdENvbnZlcnNpb25CdWZmZXJJMTYuZ2V0KCksIGJ5dGVzVG9SZWFkLCBibG9ja2luZyk7CisgICAgICAgICAgICBpZiAoYnl0ZXNBY3R1YWxseVJlYWQgPD0gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG90YWxCeXRlc1JlYWQgKz0gYnl0ZXNBY3R1YWxseVJlYWQ7CisgICAgICAgICAgICBpbnQzMl90IGZyYW1lc1RvQ29udmVydCA9IGJ5dGVzQWN0dWFsbHlSZWFkIC8gYnl0ZXNQZXJEZXZpY2VGcmFtZTsKKyAgICAgICAgICAgIC8vIENvbnZlcnQgaW50byBhcHAgZmxvYXQgYnVmZmVyLgorICAgICAgICAgICAgc2l6ZV90IG51bVNhbXBsZXMgPSBmcmFtZXNUb0NvbnZlcnQgKiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICAgICAgICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kxNigKKyAgICAgICAgICAgICAgICAgICAgZmxvYXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXRDb252ZXJzaW9uQnVmZmVySTE2LmdldCgpLAorICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgIGZsb2F0QnVmZmVyICs9IG51bVNhbXBsZXM7CisgICAgICAgICAgICBmcmFtZXNMZWZ0IC09IGZyYW1lc1RvQ29udmVydDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGJ5dGVzQWN0dWFsbHlSZWFkID0gbUF1ZGlvUmVjb3JkLT5yZWFkKGJ1ZmZlciwgbnVtQnl0ZXMsIGJsb2NraW5nKTsKKyAgICAgICAgdG90YWxCeXRlc1JlYWQgPSBieXRlc0FjdHVhbGx5UmVhZDsKKyAgICB9CisgICAgaWYgKGJ5dGVzQWN0dWFsbHlSZWFkID09IFdPVUxEX0JMT0NLKSB7CiAgICAgICAgIHJldHVybiAwOwotICAgIH0gZWxzZSBpZiAoYnl0ZXNSZWFkIDwgMCkgewotICAgICAgICAvLyBpbiB0aGlzIGNvbnRleHQsIGEgREVBRF9PQkpFQ1QgaXMgbW9yZSBsaWtlbHkgdG8gYmUgYSBkaXNjb25uZWN0IG5vdGlmaWNhdGlvbiBkdWUgdG8KLSAgICAgICAgLy8gQXVkaW9SZWNvcmQgaW52YWxpZGF0aW9uCi0gICAgICAgIGlmIChieXRlc1JlYWQgPT0gREVBRF9PQkpFQ1QpIHsKKyAgICB9IGVsc2UgaWYgKGJ5dGVzQWN0dWFsbHlSZWFkIDwgMCkgeworICAgICAgICAvLyBJbiB0aGlzIGNvbnRleHQsIGEgREVBRF9PQkpFQ1QgaXMgbW9yZSBsaWtlbHkgdG8gYmUgYSBkaXNjb25uZWN0IG5vdGlmaWNhdGlvbiBkdWUgdG8KKyAgICAgICAgLy8gQXVkaW9SZWNvcmQgaW52YWxpZGF0aW9uLgorICAgICAgICBpZiAoYnl0ZXNBY3R1YWxseVJlYWQgPT0gREVBRF9PQkpFQ1QpIHsKICAgICAgICAgICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKTsKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChieXRlc1JlYWQpOworICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoYnl0ZXNBY3R1YWxseVJlYWQpOwogICAgIH0KLSAgICBpbnQzMl90IGZyYW1lc1JlYWQgPSAoaW50MzJfdCkoYnl0ZXNSZWFkIC8gYnl0ZXNQZXJGcmFtZSk7CisgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gKGludDMyX3QpKHRvdGFsQnl0ZXNSZWFkIC8gYnl0ZXNQZXJEZXZpY2VGcmFtZSk7CiAgICAgaW5jcmVtZW50RnJhbWVzUmVhZChmcmFtZXNSZWFkKTsKIAogICAgIHJlc3VsdCA9IHVwZGF0ZVN0YXRlTWFjaGluZSgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmgKaW5kZXggYzE3MjNiYS4uMmY0MWQzNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5oCkBAIC03Niw2ICs3Niw4IEBACiAgICAgICAgIHJldHVybiBpbmNyZW1lbnRGcmFtZXNSZWFkKGZyYW1lcyk7CiAgICAgfQogCisgICAgY29uc3Qgdm9pZCAqIG1heWJlQ29udmVydERldmljZURhdGEoY29uc3Qgdm9pZCAqYXVkaW9EYXRhLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisKIHByaXZhdGU6CiAgICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6QXVkaW9SZWNvcmQ+IG1BdWRpb1JlY29yZDsKICAgICAvLyBhZGFwdHMgYmV0d2VlbiB2YXJpYWJsZSBzaXplZCBibG9ja3MgYW5kIGZpeGVkIHNpemUgYmxvY2tzCkBAIC04Myw2ICs4NSwxMSBAQAogCiAgICAgLy8gVE9ETyBhZGQgNjQtYml0IHBvc2l0aW9uIHJlcG9ydGluZyB0byBBdWRpb1JlY29yZCBhbmQgdXNlIGl0LgogICAgIGFuZHJvaWQ6OlN0cmluZzE2ICAgICAgICAgICAgICAgIG1PcFBhY2thZ2VOYW1lOworCisgICAgLy8gT25seSBvbmUgdHlwZSBvZiBjb252ZXJzaW9uIGJ1ZmZlciBpcyB1c2VkLgorICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG9hdFtdPiAgICAgICAgIG1Gb3JtYXRDb252ZXJzaW9uQnVmZmVyRmxvYXQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPGludDE2X3RbXT4gICAgICAgbUZvcm1hdENvbnZlcnNpb25CdWZmZXJJMTY7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdENvbnZlcnNpb25CdWZmZXJTaXplSW5GcmFtZXMgPSAwOwogfTsKIAogfSAvKiBuYW1lc3BhY2UgYWF1ZGlvICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwCmluZGV4IDBlOWFhZWYuLjUwNWNkNzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgogCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgInV0aWxpdHkvQXVkaW9DbG9jay5oIgogI2luY2x1ZGUgImxlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oIgogI2luY2x1ZGUgImxlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmgiCkBAIC0xMTMsMTQgKzExNCwzNSBAQAogICAgIH0KICAgICBtQ2FsbGJhY2tCdWZmZXJTaXplID0gYnVpbGRlci5nZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soKTsKIAotICAgIEFMT0dEKCJBdWRpb1N0cmVhbVRyYWNrOjpvcGVuKCksIHJlcXVlc3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gJWQsIGZyYW1lQ291bnQgPSAldSIsCisgICAgQUxPR0QoIm9wZW4oKSwgcmVxdWVzdCBub3RpZmljYXRpb25GcmFtZXMgPSAlZCwgZnJhbWVDb3VudCA9ICV1IiwKICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsICh1aW50KWZyYW1lQ291bnQpOwotICAgIG1BdWRpb1RyYWNrID0gbmV3IEF1ZGlvVHJhY2soKTsgLy8gVE9ETyByZXZpZXcKLSAgICBpZiAoZ2V0RGV2aWNlSWQoKSAhPSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgbUF1ZGlvVHJhY2stPnNldE91dHB1dERldmljZShnZXREZXZpY2VJZCgpKTsKLSAgICB9CisKKyAgICAvLyBEb24ndCBjYWxsIG1BdWRpb1RyYWNrLT5zZXREZXZpY2VJZCgpIGJlY2F1c2UgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiBieSBzZXQoKSEKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSAoZ2V0RGV2aWNlSWQoKSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBVURJT19QT1JUX0hBTkRMRV9OT05FCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBnZXREZXZpY2VJZCgpOworCisgICAgY29uc3QgYXVkaW9fY29udGVudF90eXBlX3QgY29udGVudFR5cGUgPQorICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9jb250ZW50VHlwZVRvSW50ZXJuYWwoYnVpbGRlci5nZXRDb250ZW50VHlwZSgpKTsKKyAgICBjb25zdCBhdWRpb191c2FnZV90IHVzYWdlID0KKyAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfdXNhZ2VUb0ludGVybmFsKGJ1aWxkZXIuZ2V0VXNhZ2UoKSk7CisKKyAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHsKKyAgICAgICAgICAgIC5jb250ZW50X3R5cGUgPSBjb250ZW50VHlwZSwKKyAgICAgICAgICAgIC51c2FnZSA9IHVzYWdlLAorICAgICAgICAgICAgLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9ERUZBVUxULCAvLyBvbmx5IHVzZWQgZm9yIHJlY29yZGluZworICAgICAgICAgICAgLmZsYWdzID0gQVVESU9fRkxBR19OT05FLCAvLyBEaWZmZXJlbnQgdGhhbiB0aGUgQVVESU9fT1VUUFVUX0ZMQUdTCisgICAgICAgICAgICAudGFncyA9ICIiCisgICAgfTsKKworICAgIHN0YXRpY19hc3NlcnQoQUFVRElPX1VOU1BFQ0lGSUVEID09IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsICJTZXNzaW9uIElEcyBzaG91bGQgbWF0Y2giKTsKKworICAgIGFhdWRpb19zZXNzaW9uX2lkX3QgcmVxdWVzdGVkU2Vzc2lvbklkID0gYnVpbGRlci5nZXRTZXNzaW9uSWQoKTsKKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTZXNzaW9uSWQocmVxdWVzdGVkU2Vzc2lvbklkKTsKKworICAgIG1BdWRpb1RyYWNrID0gbmV3IEF1ZGlvVHJhY2soKTsKICAgICBtQXVkaW9UcmFjay0+c2V0KAotICAgICAgICAgICAgKGF1ZGlvX3N0cmVhbV90eXBlX3QpIEFVRElPX1NUUkVBTV9NVVNJQywKKyAgICAgICAgICAgIEFVRElPX1NUUkVBTV9ERUZBVUxULCAgLy8gaWdub3JlZCBiZWNhdXNlIHdlIHBhc3MgYXR0cmlidXRlcyBiZWxvdwogICAgICAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpLAogICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgY2hhbm5lbE1hc2ssCkBAIC0xMjksMTcgKzE1MSwyNiBAQAogICAgICAgICAgICAgY2FsbGJhY2ssCiAgICAgICAgICAgICBjYWxsYmFja0RhdGEsCiAgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsCi0gICAgICAgICAgICAwIC8qc2hhcmVkQnVmZmVyKi8sCi0gICAgICAgICAgICBmYWxzZSAvKnRocmVhZENhbkNhbGxKYXZhKi8sCi0gICAgICAgICAgICBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAotICAgICAgICAgICAgc3RyZWFtVHJhbnNmZXJUeXBlCi0gICAgICAgICAgICApOworICAgICAgICAgICAgMCwgICAgICAgLy8gREVGQVVMVCBzaGFyZWRCdWZmZXIqLywKKyAgICAgICAgICAgIGZhbHNlLCAgIC8vIERFRkFVTFQgdGhyZWFkQ2FuQ2FsbEphdmEKKyAgICAgICAgICAgIHNlc3Npb25JZCwKKyAgICAgICAgICAgIHN0cmVhbVRyYW5zZmVyVHlwZSwKKyAgICAgICAgICAgIE5VTEwsICAgIC8vIERFRkFVTFQgYXVkaW9fb2ZmbG9hZF9pbmZvX3QKKyAgICAgICAgICAgIEFVRElPX1VJRF9JTlZBTElELCAvLyBERUZBVUxUIHVpZAorICAgICAgICAgICAgLTEsICAgICAgLy8gREVGQVVMVCBwaWQKKyAgICAgICAgICAgICZhdHRyaWJ1dGVzLAorICAgICAgICAgICAgLy8gV0FSTklORyAtIElmIGRvTm90UmVjb25uZWN0IHNldCB0cnVlIHRoZW4gYXVkaW8gc3RvcHMgYWZ0ZXIgcGx1Z2dpbmcgYW5kIHVucGx1Z2dpbmcKKyAgICAgICAgICAgIC8vIGhlYWRwaG9uZXMgYSBmZXcgdGltZXMuCisgICAgICAgICAgICBmYWxzZSwgICAvLyBERUZBVUxUIGRvTm90UmVjb25uZWN0LAorICAgICAgICAgICAgMS4wZiwgICAgLy8gREVGQVVMVCBtYXhSZXF1aXJlZFNwZWVkCisgICAgICAgICAgICBzZWxlY3RlZERldmljZUlkCisgICAgKTsKIAogICAgIC8vIERpZCB3ZSBnZXQgYSB2YWxpZCB0cmFjaz8KICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9UcmFjay0+aW5pdENoZWNrKCk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBjbG9zZSgpOwotICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW1UcmFjazo6b3BlbigpLCBpbml0Q2hlY2soKSByZXR1cm5lZCAlZCIsIHN0YXR1cyk7CisgICAgICAgIEFMT0dFKCJvcGVuKCksIGluaXRDaGVjaygpIHJldHVybmVkICVkIiwgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1cyk7CiAgICAgfQogCkBAIC0xNTAsMTAgKzE4MSwxMSBAQAogICAgIGFhdWRpb19mb3JtYXRfdCBhYXVkaW9Gb3JtYXQgPQogICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9EYXRhRm9ybWF0KG1BdWRpb1RyYWNrLT5mb3JtYXQoKSk7CiAgICAgc2V0Rm9ybWF0KGFhdWRpb0Zvcm1hdCk7CisgICAgc2V0RGV2aWNlRm9ybWF0KGFhdWRpb0Zvcm1hdCk7CiAKICAgICBpbnQzMl90IGFjdHVhbFNhbXBsZVJhdGUgPSBtQXVkaW9UcmFjay0+Z2V0U2FtcGxlUmF0ZSgpOwogICAgIEFMT0dXX0lGKGFjdHVhbFNhbXBsZVJhdGUgIT0gZ2V0U2FtcGxlUmF0ZSgpLAotICAgICAgICAgICAgICJBdWRpb1N0cmVhbVRyYWNrOjpvcGVuKCkgc2FtcGxlUmF0ZSBjaGFuZ2VkIGZyb20gJWQgdG8gJWQiLAorICAgICAgICAgICAgICJvcGVuKCkgc2FtcGxlUmF0ZSBjaGFuZ2VkIGZyb20gJWQgdG8gJWQiLAogICAgICAgICAgICAgIGdldFNhbXBsZVJhdGUoKSwgYWN0dWFsU2FtcGxlUmF0ZSk7CiAgICAgc2V0U2FtcGxlUmF0ZShhY3R1YWxTYW1wbGVSYXRlKTsKIApAQCAtMTY4LDYgKzIwMCwxMyBAQAogCiAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9PUEVOKTsKICAgICBzZXREZXZpY2VJZChtQXVkaW9UcmFjay0+Z2V0Um91dGVkRGV2aWNlSWQoKSk7CisKKyAgICBhYXVkaW9fc2Vzc2lvbl9pZF90IGFjdHVhbFNlc3Npb25JZCA9CisgICAgICAgICAgICAocmVxdWVzdGVkU2Vzc2lvbklkID09IEFBVURJT19TRVNTSU9OX0lEX05PTkUpCisgICAgICAgICAgICA/IEFBVURJT19TRVNTSU9OX0lEX05PTkUKKyAgICAgICAgICAgIDogKGFhdWRpb19zZXNzaW9uX2lkX3QpIG1BdWRpb1RyYWNrLT5nZXRTZXNzaW9uSWQoKTsKKyAgICBzZXRTZXNzaW9uSWQoYWN0dWFsU2Vzc2lvbklkKTsKKwogICAgIG1BdWRpb1RyYWNrLT5hZGRBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjayk7CiAKICAgICAvLyBVcGRhdGUgcGVyZm9ybWFuY2UgbW9kZSBiYXNlZCBvbiB0aGUgYWN0dWFsIHN0cmVhbSBmbGFncy4KQEAgLTE4NiwxMCArMjI1LDEwIEBACiAKICAgICAvLyBMb2cgd2FybmluZyBpZiB3ZSBkaWQgbm90IGdldCB3aGF0IHdlIGFza2VkIGZvci4KICAgICBBTE9HV19JRihhY3R1YWxGbGFncyAhPSBmbGFncywKLSAgICAgICAgICAgICAiQXVkaW9TdHJlYW1UcmFjazo6b3BlbigpIGZsYWdzIGNoYW5nZWQgZnJvbSAweCUwOFggdG8gMHglMDhYIiwKKyAgICAgICAgICAgICAib3BlbigpIGZsYWdzIGNoYW5nZWQgZnJvbSAweCUwOFggdG8gMHglMDhYIiwKICAgICAgICAgICAgICBmbGFncywgYWN0dWFsRmxhZ3MpOwogICAgIEFMT0dXX0lGKGFjdHVhbFBlcmZvcm1hbmNlTW9kZSAhPSBwZXJmTW9kZSwKLSAgICAgICAgICAgICAiQXVkaW9TdHJlYW1UcmFjazo6b3BlbigpIHBlcmZNb2RlIGNoYW5nZWQgZnJvbSAlZCB0byAlZCIsCisgICAgICAgICAgICAgIm9wZW4oKSBwZXJmTW9kZSBjaGFuZ2VkIGZyb20gJWQgdG8gJWQiLAogICAgICAgICAgICAgIHBlcmZNb2RlLCBhY3R1YWxQZXJmb3JtYW5jZU1vZGUpOwogCiAgICAgcmV0dXJuIEFBVURJT19PSzsKQEAgLTIyNCwxMCArMjYzLDggQEAKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RTdGFydCgpIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RyZWFtTXV0ZXgpOwotCiAgICAgaWYgKG1BdWRpb1RyYWNrLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RTdGFydCgpIG5vIEF1ZGlvVHJhY2siKTsKKyAgICAgICAgQUxPR0UoInJlcXVlc3RTdGFydCgpIG5vIEF1ZGlvVHJhY2siKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KICAgICAvLyBHZXQgY3VycmVudCBwb3NpdGlvbiBzbyB3ZSBjYW4gZGV0ZWN0IHdoZW4gdGhlIHRyYWNrIGlzIHBsYXlpbmcuCkBAIC0yMzYsNzMgKzI3Myw2MiBAQAogICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKICAgICB9CiAKKyAgICAvLyBFbmFibGUgY2FsbGJhY2sgYmVmb3JlIHN0YXJ0aW5nIEF1ZGlvVHJhY2sgdG8gYXZvaWQgc2h1dHRpbmcKKyAgICAvLyBkb3duIGJlY2F1c2Ugb2YgYSByYWNlIGNvbmRpdGlvbi4KKyAgICBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKHRydWUpOwogICAgIGVyciA9IG1BdWRpb1RyYWNrLT5zdGFydCgpOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KGVycik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgb25TdGFydCgpOwogICAgICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJUSU5HKTsKICAgICB9CiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RQYXVzZSgpIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RyZWFtTXV0ZXgpOwotCiAgICAgaWYgKG1BdWRpb1RyYWNrLmdldCgpID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoInJlcXVlc3RQYXVzZSgpIG5vIEF1ZGlvVHJhY2siKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwotICAgIH0gZWxzZSBpZiAoZ2V0U3RhdGUoKSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJUSU5HCi0gICAgICAgICAgICAmJiBnZXRTdGF0ZSgpICE9IEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRCkgewotICAgICAgICBBTE9HRSgicmVxdWVzdFBhdXNlKCksIGNhbGxlZCB3aGVuIHN0YXRlIGlzICVzIiwKLSAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChnZXRTdGF0ZSgpKSk7Ci0gICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9Ci0gICAgb25TdG9wKCk7CisKICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNJTkcpOwogICAgIG1BdWRpb1RyYWNrLT5wYXVzZSgpOwotICAgIGNoZWNrRm9yRGlzY29ubmVjdFJlcXVlc3QoKTsKKyAgICBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKGZhbHNlKTsKICAgICBzdGF0dXNfdCBlcnIgPSBtQXVkaW9UcmFjay0+Z2V0UG9zaXRpb24oJm1Qb3NpdGlvbldoZW5QYXVzaW5nKTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwogICAgIH0KLSAgICByZXR1cm4gQUFVRElPX09LOworICAgIHJldHVybiBjaGVja0ZvckRpc2Nvbm5lY3RSZXF1ZXN0KGZhbHNlKTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RGbHVzaCgpIHsKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RyZWFtTXV0ZXgpOwotCiAgICAgaWYgKG1BdWRpb1RyYWNrLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RGbHVzaCgpIG5vIEF1ZGlvVHJhY2siKTsKLSAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwotICAgIH0gZWxzZSBpZiAoZ2V0U3RhdGUoKSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNFRCkgewotICAgICAgICBBTE9HRSgiQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdEZsdXNoKCkgbm90IHBhdXNlZCIpOworICAgICAgICBBTE9HRSgicmVxdWVzdEZsdXNoKCkgbm8gQXVkaW9UcmFjayIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQorCiAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9GTFVTSElORyk7CiAgICAgaW5jcmVtZW50RnJhbWVzUmVhZChnZXRGcmFtZXNXcml0dGVuKCkgLSBnZXRGcmFtZXNSZWFkKCkpOwogICAgIG1BdWRpb1RyYWNrLT5mbHVzaCgpOwotICAgIG1GcmFtZXNXcml0dGVuLnJlc2V0MzIoKTsKKyAgICBtRnJhbWVzUmVhZC5yZXNldDMyKCk7IC8vIHNlcnZpY2UgcmVhZHMgZnJhbWVzLCBzZXJ2aWNlIHBvc2l0aW9uIHJlc2V0IG9uIGZsdXNoCiAgICAgbVRpbWVzdGFtcFBvc2l0aW9uLnJlc2V0MzIoKTsKICAgICByZXR1cm4gQUFVRElPX09LOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdFN0b3AoKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbU11dGV4KTsKLQogICAgIGlmIChtQXVkaW9UcmFjay5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb1N0cmVhbVRyYWNrOjpyZXF1ZXN0U3RvcCgpIG5vIEF1ZGlvVHJhY2siKTsKKyAgICAgICAgQUxPR0UoInJlcXVlc3RTdG9wKCkgbm8gQXVkaW9UcmFjayIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQotICAgIG9uU3RvcCgpOworCiAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORyk7CiAgICAgaW5jcmVtZW50RnJhbWVzUmVhZChnZXRGcmFtZXNXcml0dGVuKCkgLSBnZXRGcmFtZXNSZWFkKCkpOyAvLyBUT0RPIHJldmlldwogICAgIG1UaW1lc3RhbXBQb3NpdGlvbi5zZXQoZ2V0RnJhbWVzV3JpdHRlbigpKTsKLSAgICBtRnJhbWVzV3JpdHRlbi5yZXNldDMyKCk7CisgICAgbUZyYW1lc1JlYWQucmVzZXQzMigpOyAvLyBzZXJ2aWNlIHJlYWRzIGZyYW1lcywgc2VydmljZSBwb3NpdGlvbiByZXNldCBvbiBzdG9wCiAgICAgbVRpbWVzdGFtcFBvc2l0aW9uLnJlc2V0MzIoKTsKICAgICBtQXVkaW9UcmFjay0+c3RvcCgpOwotICAgIGNoZWNrRm9yRGlzY29ubmVjdFJlcXVlc3QoKTsKLSAgICByZXR1cm4gQUFVRElPX09LOworICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOworICAgIHJldHVybiBjaGVja0ZvckRpc2Nvbm5lY3RSZXF1ZXN0KGZhbHNlKTs7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVRyYWNrOjp1cGRhdGVTdGF0ZU1hY2hpbmUoKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5oCmluZGV4IGE4NzFkYjQuLjY4NjA4ZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmgKQEAgLTQ4LDYgKzQ4LDE2IEBACiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RGbHVzaCgpIG92ZXJyaWRlOwogICAgIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0U3RvcCgpIG92ZXJyaWRlOwogCisgICAgYm9vbCBpc0ZsdXNoU3VwcG9ydGVkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAvLyBPbmx5IGltcGxlbWVudCBGTFVTSCBmb3IgT1VUUFVUIHN0cmVhbXMuCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgaXNQYXVzZVN1cHBvcnRlZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgLy8gT25seSBpbXBsZW1lbnQgUEFVU0UgZm9yIE9VVFBVVCBzdHJlYW1zLgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKICAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0VGltZXN0YW1wKGNsb2NraWRfdCBjbG9ja0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqZnJhbWVQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vc2Vjb25kcykgb3ZlcnJpZGU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuY3BwCmluZGV4IDI0NTA5MjAuLjQwZWJiNzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuY3BwCkBAIC0yNSw2ICsyNSw5IEBACiAKICNpbmNsdWRlICJhYXVkaW8vQUF1ZGlvLmgiCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpb1Rlc3RpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLWJhc2UuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KIAogI2luY2x1ZGUgInV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgiCiAKQEAgLTUwLDUwICs1MywyMSBAQAogICAgIHJldHVybiBzaXplOwogfQogCi0KIC8vIFRPRE8gZXhwb3NlIGFuZCBjYWxsIGNsYW1wMTZfZnJvbV9mbG9hdCBmdW5jdGlvbiBpbiBwcmltaXRpdmVzLmgKIHN0YXRpYyBpbmxpbmUgaW50MTZfdCBjbGFtcDE2X2Zyb21fZmxvYXQoZmxvYXQgZikgewotICAgIC8qIE9mZnNldCBpcyB1c2VkIHRvIGV4cGFuZCB0aGUgdmFsaWQgcmFuZ2Ugb2YgWy0xLjAsIDEuMCkgaW50byB0aGUgMTYgbHNicyBvZiB0aGUKLSAgICAgKiBmbG9hdGluZyBwb2ludCBzaWduaWZpY2FuZC4gVGhlIG5vcm1hbCBzaGlmdCBpcyAzPDwyMiwgYnV0IHRoZSAtMTUgb2Zmc2V0Ci0gICAgICogaXMgdXNlZCB0byBtdWx0aXBseSBieSAzMjc2OC4KLSAgICAgKi8KLSAgICBzdGF0aWMgY29uc3QgZmxvYXQgb2Zmc2V0ID0gKGZsb2F0KSgzIDw8ICgyMiAtIDE1KSk7Ci0gICAgLyogemVybyA9ICgweDEwZiA8PCAyMikgPSAgMHg0M2MwMDAwMCAobm90IGRpcmVjdGx5IHVzZWQpICovCi0gICAgc3RhdGljIGNvbnN0IGludDMyX3QgbGltbmVnID0gKDB4MTBmIDw8IDIyKSAvKnplcm8qLyAtIDMyNzY4OyAvKiAweDQzYmY4MDAwICovCi0gICAgc3RhdGljIGNvbnN0IGludDMyX3QgbGltcG9zID0gKDB4MTBmIDw8IDIyKSAvKnplcm8qLyArIDMyNzY3OyAvKiAweDQzYzA3ZmZmICovCi0KLSAgICB1bmlvbiB7Ci0gICAgICAgIGZsb2F0IGY7Ci0gICAgICAgIGludDMyX3QgaTsKLSAgICB9IHU7Ci0KLSAgICB1LmYgPSBmICsgb2Zmc2V0OyAvKiByZWNlbnRlciB2YWxpZCByYW5nZSAqLwotICAgIC8qIE5vdyB0aGUgdmFsaWQgcmFuZ2UgaXMgcmVwcmVzZW50ZWQgYXMgaW50ZWdlcnMgYmV0d2VlbiBbbGltbmVnLCBsaW1wb3NdLgotICAgICAqIENsYW1wIHVzaW5nIHRoZSBmYWN0IHRoYXQgZmxvYXQgcmVwcmVzZW50YXRpb24gKGFzIGFuIGludGVnZXIpIGlzIGFuIG9yZGVyZWQgc2V0LgotICAgICAqLwotICAgIGlmICh1LmkgPCBsaW1uZWcpCi0gICAgICAgIHUuaSA9IC0zMjc2ODsKLSAgICBlbHNlIGlmICh1LmkgPiBsaW1wb3MpCi0gICAgICAgIHUuaSA9IDMyNzY3OwotICAgIHJldHVybiB1Lmk7IC8qIFJldHVybiBsb3dlciAxNiBiaXRzLCB0aGUgcGFydCBvZiBpbnRlcmVzdCBpbiB0aGUgc2lnbmlmaWNhbmQuICovCisgICAgc3RhdGljIGNvbnN0IGZsb2F0IHNjYWxlID0gMSA8PCAxNTsKKyAgICByZXR1cm4gKGludDE2X3QpIHJvdW5kZihmbWF4ZihmbWluZihmICogc2NhbGUsIHNjYWxlIC0gMS5mKSwgLXNjYWxlKSk7CiB9CiAKLS8vIFNhbWUgYnV0IHdpdGhvdXQgY2xpcHBpbmcuCi0vLyBDb252ZXJ0IC0xLjBmIHRvICsxLjBmIHRvIC0zMjc2OCB0byArMzI3NjcKLXN0YXRpYyBpbmxpbmUgaW50MTZfdCBmbG9hdFRvSW50MTYoZmxvYXQgZikgewotICAgIHN0YXRpYyBjb25zdCBmbG9hdCBvZmZzZXQgPSAoZmxvYXQpKDMgPDwgKDIyIC0gMTUpKTsKLSAgICB1bmlvbiB7Ci0gICAgICAgIGZsb2F0IGY7Ci0gICAgICAgIGludDMyX3QgaTsKLSAgICB9IHU7Ci0gICAgdS5mID0gZiArIG9mZnNldDsgLyogcmVjZW50ZXIgdmFsaWQgcmFuZ2UgKi8KLSAgICByZXR1cm4gdS5pOyAvKiBSZXR1cm4gbG93ZXIgMTYgYml0cywgdGhlIHBhcnQgb2YgaW50ZXJlc3QgaW4gdGhlIHNpZ25pZmljYW5kLiAqLworLy8gQ2xpcCB0byB2YWxpZCByYW5nZSBvZiBhIGZsb2F0IHNhbXBsZSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSB2b2x1bWUuCisvLyBCeSB1c2luZyBmbWluIGFuZCBmbWF4IHdlIGFsc28gcHJvdGVjdCBhZ2FpbnN0IE5hTi4KK3N0YXRpYyBmbG9hdCBjbGlwVG9NaW5NYXhIZWFkcm9vbShmbG9hdCBpbnB1dCkgeworICAgIHJldHVybiBmbWluKE1BWF9IRUFEUk9PTSwgZm1heChNSU5fSEVBRFJPT00sIGlucHV0KSk7CiB9CiAKIHN0YXRpYyBmbG9hdCBjbGlwQW5kQ2xhbXBGbG9hdFRvUGNtMTYoZmxvYXQgc2FtcGxlLCBmbG9hdCBzY2FsZXIpIHsKICAgICAvLyBDbGlwIHRvIHZhbGlkIHJhbmdlIG9mIGEgZmxvYXQgc2FtcGxlIHRvIHByZXZlbnQgZXhjZXNzaXZlIHZvbHVtZS4KLSAgICBpZiAoc2FtcGxlID4gTUFYX0hFQURST09NKSBzYW1wbGUgPSBNQVhfSEVBRFJPT007Ci0gICAgZWxzZSBpZiAoc2FtcGxlIDwgTUlOX0hFQURST09NKSBzYW1wbGUgPSBNSU5fSEVBRFJPT007CisgICAgc2FtcGxlID0gY2xpcFRvTWluTWF4SGVhZHJvb20oc2FtcGxlKTsKIAogICAgIC8vIFNjYWxlIGFuZCBjb252ZXJ0IHRvIGEgc2hvcnQuCiAgICAgZmxvYXQgZnZhbCA9IHNhbXBsZSAqIHNjYWxlcjsKQEAgLTEwNCw3ICs3OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSkgewotICAgIGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTsKKyAgICBjb25zdCBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGU7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKICAgICAgICAgZmxvYXQgc2FtcGxlID0gKnNvdXJjZSsrOwogICAgICAgICAqZGVzdGluYXRpb24rKyA9IGNsaXBBbmRDbGFtcEZsb2F0VG9QY20xNihzYW1wbGUsIHNjYWxlcik7CkBAIC0xMzUsNyArMTA5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSkgewotICAgIGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZSAvIFNIT1JUX1NDQUxFOworICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZSAvIFNIT1JUX1NDQUxFOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CiAgICAgICAgIGRlc3RpbmF0aW9uW2ldID0gc291cmNlW2ldICogc2NhbGVyOwogICAgIH0KQEAgLTE0OSw3ICsxMjMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7CiAgICAgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlMSAvIFNIT1JUX1NDQUxFOwotICAgIGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIChTSE9SVF9TQ0FMRSAqIChmbG9hdCkgbnVtRnJhbWVzKTsKKyAgICBjb25zdCBmbG9hdCBkZWx0YSA9IChhbXBsaXR1ZGUyIC0gYW1wbGl0dWRlMSkgLyAoU0hPUlRfU0NBTEUgKiAoZmxvYXQpIG51bUZyYW1lcyk7CiAgICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBudW1GcmFtZXM7IGZyYW1lSW5kZXgrKykgewogICAgICAgICBmb3IgKGludCBzYW1wbGVJbmRleCA9IDA7IHNhbXBsZUluZGV4IDwgc2FtcGxlc1BlckZyYW1lOyBzYW1wbGVJbmRleCsrKSB7CiAgICAgICAgICAgICAqZGVzdGluYXRpb24rKyA9ICpzb3VyY2UrKyAqIHNjYWxlcjsKQEAgLTE1OCw2ICsxMzIsNyBAQAogICAgIH0KIH0KIAorCiAvLyBUaGlzIGNvZGUgYXNzdW1lcyBhbXBsaXR1ZGUxIGFuZCBhbXBsaXR1ZGUyIGFyZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCiB2b2lkIEFBdWRpb19saW5lYXJSYW1wKGNvbnN0IGZsb2F0ICpzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKQEAgLTE2NiwxNCArMTQxLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCiAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKICAgICBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUxOwotICAgIGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIG51bUZyYW1lczsKKyAgICBjb25zdCBmbG9hdCBkZWx0YSA9IChhbXBsaXR1ZGUyIC0gYW1wbGl0dWRlMSkgLyBudW1GcmFtZXM7CiAgICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBudW1GcmFtZXM7IGZyYW1lSW5kZXgrKykgewogICAgICAgICBmb3IgKGludCBzYW1wbGVJbmRleCA9IDA7IHNhbXBsZUluZGV4IDwgc2FtcGxlc1BlckZyYW1lOyBzYW1wbGVJbmRleCsrKSB7CiAgICAgICAgICAgICBmbG9hdCBzYW1wbGUgPSAqc291cmNlKys7Ci0KICAgICAgICAgICAgIC8vIENsaXAgdG8gdmFsaWQgcmFuZ2Ugb2YgYSBmbG9hdCBzYW1wbGUgdG8gcHJldmVudCBleGNlc3NpdmUgdm9sdW1lLgotICAgICAgICAgICAgaWYgKHNhbXBsZSA+IE1BWF9IRUFEUk9PTSkgc2FtcGxlID0gTUFYX0hFQURST09NOwotICAgICAgICAgICAgZWxzZSBpZiAoc2FtcGxlIDwgTUlOX0hFQURST09NKSBzYW1wbGUgPSBNSU5fSEVBRFJPT007CisgICAgICAgICAgICBzYW1wbGUgPSBjbGlwVG9NaW5NYXhIZWFkcm9vbShzYW1wbGUpOwogCiAgICAgICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZSAqIHNjYWxlcjsKICAgICAgICAgfQpAQCAtMTg4LDE4ICsxNjEsMjY3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAogICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlMSAvIFNIT1JUX1NDQUxFOwotICAgIGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIChTSE9SVF9TQ0FMRSAqIChmbG9hdCkgbnVtRnJhbWVzKTsKKyAgICAvLyBCZWNhdXNlIHdlIGFyZSBjb252ZXJ0aW5nIGZyb20gaW50MTYgdG8gMW50MTYsIHdlIGRvIG5vdCBoYXZlIHRvIHNjYWxlIGJ5IDEvMzI3NjguCisgICAgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlMTsKKyAgICBjb25zdCBmbG9hdCBkZWx0YSA9IChhbXBsaXR1ZGUyIC0gYW1wbGl0dWRlMSkgLyBudW1GcmFtZXM7CiAgICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBudW1GcmFtZXM7IGZyYW1lSW5kZXgrKykgewogICAgICAgICBmb3IgKGludCBzYW1wbGVJbmRleCA9IDA7IHNhbXBsZUluZGV4IDwgc2FtcGxlc1BlckZyYW1lOyBzYW1wbGVJbmRleCsrKSB7CiAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIGNsaXAgYmVjYXVzZSBpbnQxNl90IHJhbmdlIGlzIGluaGVyZW50bHkgbGltaXRlZC4KICAgICAgICAgICAgIGZsb2F0IHNhbXBsZSA9ICAqc291cmNlKysgKiBzY2FsZXI7Ci0gICAgICAgICAgICAqZGVzdGluYXRpb24rKyA9ICBmbG9hdFRvSW50MTYoc2FtcGxlKTsKKyAgICAgICAgICAgICpkZXN0aW5hdGlvbisrID0gKGludDE2X3QpIHJvdW5kZihzYW1wbGUpOwogICAgICAgICB9CiAgICAgICAgIHNjYWxlciArPSBkZWx0YTsKICAgICB9CiB9CiAKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIENvbnZlcnQgTW9ubyBUbyBTdGVyZW8gYXQgdGhlIHNhbWUgdGltZSBhcyBjb252ZXJ0aW5nIGZvcm1hdC4KK3ZvaWQgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oY29uc3QgZmxvYXQgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUpIHsKKyAgICBjb25zdCBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGU7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgeworICAgICAgICBmbG9hdCBzYW1wbGUgPSAqc291cmNlKys7CisgICAgICAgIGludDE2X3Qgc2FtcGxlMTYgPSBjbGlwQW5kQ2xhbXBGbG9hdFRvUGNtMTYoc2FtcGxlLCBzY2FsZXIpOworICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTE2OworICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTE2OworICAgIH0KK30KKwordm9pZCBBQXVkaW9Db252ZXJ0X2Zvcm1hdE1vbm9Ub1N0ZXJlbyhjb25zdCBmbG9hdCAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKKyAgICAvLyBkaXZpZGUgYnkgbnVtRnJhbWVzIHNvIHRoYXQgd2UgYWxtb3N0IHJlYWNoIGFtcGxpdHVkZTIKKyAgICBjb25zdCBmbG9hdCBkZWx0YSA9IChhbXBsaXR1ZGUyIC0gYW1wbGl0dWRlMSkgLyBudW1GcmFtZXM7CisgICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBudW1GcmFtZXM7IGZyYW1lSW5kZXgrKykgeworICAgICAgICBjb25zdCBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUxICsgKGZyYW1lSW5kZXggKiBkZWx0YSk7CisgICAgICAgIGNvbnN0IGZsb2F0IHNhbXBsZSA9ICpzb3VyY2UrKzsKKyAgICAgICAgaW50MTZfdCBzYW1wbGUxNiA9IGNsaXBBbmRDbGFtcEZsb2F0VG9QY20xNihzYW1wbGUsIHNjYWxlcik7CisgICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7CisgICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7CisgICAgfQorfQorCit2b2lkIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKGNvbnN0IGludDE2X3QgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKSB7CisgICAgY29uc3QgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlIC8gU0hPUlRfU0NBTEU7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgeworICAgICAgICBmbG9hdCBzYW1wbGUgPSBzb3VyY2VbaV0gKiBzY2FsZXI7CisgICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlOworICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTsKKyAgICB9Cit9CisKKy8vIFRoaXMgY29kZSBhc3N1bWVzIGFtcGxpdHVkZTEgYW5kIGFtcGxpdHVkZTIgYXJlIGJldHdlZW4gMC4wIGFuZCAxLjAKK3ZvaWQgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oY29uc3QgaW50MTZfdCAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7CisgICAgY29uc3QgZmxvYXQgc2NhbGVyMSA9IGFtcGxpdHVkZTEgLyBTSE9SVF9TQ0FMRTsKKyAgICBjb25zdCBmbG9hdCBkZWx0YSA9IChhbXBsaXR1ZGUyIC0gYW1wbGl0dWRlMSkgLyAoU0hPUlRfU0NBTEUgKiAoZmxvYXQpIG51bUZyYW1lcyk7CisgICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBudW1GcmFtZXM7IGZyYW1lSW5kZXgrKykgeworICAgICAgICBmbG9hdCBzY2FsZXIgPSBzY2FsZXIxICsgKGZyYW1lSW5kZXggKiBkZWx0YSk7CisgICAgICAgIGZsb2F0IHNhbXBsZSA9IHNvdXJjZVtmcmFtZUluZGV4XSAqIHNjYWxlcjsKKyAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGU7CisgICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlOworICAgIH0KK30KKworLy8gVGhpcyBjb2RlIGFzc3VtZXMgYW1wbGl0dWRlMSBhbmQgYW1wbGl0dWRlMiBhcmUgYmV0d2VlbiAwLjAgYW5kIDEuMAordm9pZCBBQXVkaW9fbGluZWFyUmFtcE1vbm9Ub1N0ZXJlbyhjb25zdCBmbG9hdCAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7CisgICAgY29uc3QgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gbnVtRnJhbWVzOworICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgbnVtRnJhbWVzOyBmcmFtZUluZGV4KyspIHsKKyAgICAgICAgZmxvYXQgc2FtcGxlID0gKnNvdXJjZSsrOworCisgICAgICAgIC8vIENsaXAgdG8gdmFsaWQgcmFuZ2Ugb2YgYSBmbG9hdCBzYW1wbGUgdG8gcHJldmVudCBleGNlc3NpdmUgdm9sdW1lLgorICAgICAgICBzYW1wbGUgPSBjbGlwVG9NaW5NYXhIZWFkcm9vbShzYW1wbGUpOworCisgICAgICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTEgKyAoZnJhbWVJbmRleCAqIGRlbHRhKTsKKyAgICAgICAgZmxvYXQgc2FtcGxlU2NhbGVkID0gc2FtcGxlICogc2NhbGVyOworICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZVNjYWxlZDsKKyAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGVTY2FsZWQ7CisgICAgfQorfQorCisvLyBUaGlzIGNvZGUgYXNzdW1lcyBhbXBsaXR1ZGUxIGFuZCBhbXBsaXR1ZGUyIGFyZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCit2b2lkIEFBdWRpb19saW5lYXJSYW1wTW9ub1RvU3RlcmVvKGNvbnN0IGludDE2X3QgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7CisgICAgLy8gQmVjYXVzZSB3ZSBhcmUgY29udmVydGluZyBmcm9tIGludDE2IHRvIDFudDE2LCB3ZSBkbyBub3QgaGF2ZSB0byBzY2FsZSBieSAxLzMyNzY4LgorICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIG51bUZyYW1lczsKKyAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7CisgICAgICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTEgKyAoZnJhbWVJbmRleCAqIGRlbHRhKTsKKyAgICAgICAgLy8gTm8gbmVlZCB0byBjbGlwIGJlY2F1c2UgaW50MTZfdCByYW5nZSBpcyBpbmhlcmVudGx5IGxpbWl0ZWQuCisgICAgICAgIGNvbnN0IGZsb2F0IHNhbXBsZSA9ICAqc291cmNlKysgKiBzY2FsZXI7CisgICAgICAgIGludDE2X3Qgc2FtcGxlMTYgPSAoaW50MTZfdCkgcm91bmRmKHNhbXBsZSk7CisgICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7CisgICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7CisgICAgfQorfQorCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCit2b2lkIEFBdWRpb0RhdGFDb252ZXJ0ZXI6OmNvbnZlcnQoCisgICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKKyAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmZGVzdGluYXRpb24sCisgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAorICAgICAgICBmbG9hdCBsZXZlbEZyb20sCisgICAgICAgIGZsb2F0IGxldmVsVG8pIHsKKworICAgIGlmIChzb3VyY2UuY2hhbm5lbENvdW50ID09IDEgJiYgZGVzdGluYXRpb24uY2hhbm5lbENvdW50ID09IDIpIHsKKyAgICAgICAgY29udmVydE1vbm9Ub1N0ZXJlbyhzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBXZSBvbmx5IHN1cHBvcnQgbW9ubyB0byBzdGVyZW8gY29udmVyc2lvbi4gT3RoZXJ3aXNlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24KKyAgICAgICAgLy8gbXVzdCBtYXRjaC4KKyAgICAgICAgYXNzZXJ0KHNvdXJjZS5jaGFubmVsQ291bnQgPT0gZGVzdGluYXRpb24uY2hhbm5lbENvdW50KTsKKyAgICAgICAgY29udmVydENoYW5uZWxzTWF0Y2goc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOworICAgIH0KK30KKwordm9pZCBBQXVkaW9EYXRhQ29udmVydGVyOjpjb252ZXJ0TW9ub1RvU3RlcmVvKAorICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZzb3VyY2UsCisgICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJmRlc3RpbmF0aW9uLAorICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKKyAgICAgICAgZmxvYXQgbGV2ZWxGcm9tLAorICAgICAgICBmbG9hdCBsZXZlbFRvKSB7CisKKyAgICAvLyBUaGUgZm9ybWF0cyBhcmUgdmFsaWRhdGVkIHdoZW4gdGhlIHN0cmVhbSBpcyBvcGVuZWQgc28gd2UgZG8gbm90IGhhdmUgdG8KKyAgICAvLyBjaGVjayBmb3IgaWxsZWdhbCBjb21iaW5hdGlvbnMgaGVyZS4KKyAgICBpZiAoc291cmNlLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CisgICAgICAgICAgICBBQXVkaW9fbGluZWFyUmFtcE1vbm9Ub1N0ZXJlbygKKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHNvdXJjZS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgZGVzdGluYXRpb24uZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCisgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOworICAgICAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKKyAgICAgICAgICAgIGlmIChsZXZlbEZyb20gIT0gbGV2ZWxUbykgeworICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKAorICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHNvdXJjZS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgZGVzdGluYXRpb24uZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2Zvcm1hdE1vbm9Ub1N0ZXJlbygKKyAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSBzb3VyY2UuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopIGRlc3RpbmF0aW9uLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoc291cmNlLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKKyAgICAgICAgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICAgICAgaWYgKGxldmVsRnJvbSAhPSBsZXZlbFRvKSB7CisgICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKAorICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgc291cmNlLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgZGVzdGluYXRpb24uZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKKyAgICAgICAgICAgIEFBdWRpb19saW5lYXJSYW1wTW9ub1RvU3RlcmVvKAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgZGVzdGluYXRpb24uZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCisgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEFBdWRpb0RhdGFDb252ZXJ0ZXI6OmNvbnZlcnRDaGFubmVsc01hdGNoKAorICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZzb3VyY2UsCisgICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJmRlc3RpbmF0aW9uLAorICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKKyAgICAgICAgZmxvYXQgbGV2ZWxGcm9tLAorICAgICAgICBmbG9hdCBsZXZlbFRvKSB7CisgICAgY29uc3QgaW50MzJfdCBudW1TYW1wbGVzID0gbnVtRnJhbWVzICogc291cmNlLmNoYW5uZWxDb3VudDsKKworICAgIC8vIFRoZSBmb3JtYXRzIGFyZSB2YWxpZGF0ZWQgd2hlbiB0aGUgc3RyZWFtIGlzIG9wZW5lZCBzbyB3ZSBkbyBub3QgaGF2ZSB0bworICAgIC8vIGNoZWNrIGZvciBpbGxlZ2FsIGNvbWJpbmF0aW9ucyBoZXJlLgorICAgIGlmIChzb3VyY2UuZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CisgICAgICAgIGlmIChkZXN0aW5hdGlvbi5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICAgICAgICAgIEFBdWRpb19saW5lYXJSYW1wKAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgc291cmNlLmRhdGEsCisgICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAorICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5jaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7CisgICAgICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgeworICAgICAgICAgICAgaWYgKGxldmVsRnJvbSAhPSBsZXZlbFRvKSB7CisgICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgc291cmNlLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNigKKyAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSBzb3VyY2UuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopIGRlc3RpbmF0aW9uLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHNvdXJjZS5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7CisgICAgICAgIGlmIChkZXN0aW5hdGlvbi5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICAgICAgICAgIGlmIChsZXZlbEZyb20gIT0gbGV2ZWxUbykgeworICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KAorICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgc291cmNlLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgZGVzdGluYXRpb24uZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5jaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKKyAgICAgICAgICAgIEFBdWRpb19saW5lYXJSYW1wKAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgZGVzdGluYXRpb24uZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICBzb3VyY2UuY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCisgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOworICAgICAgICB9CisgICAgfQorfQorCiBzdGF0dXNfdCBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyhhYXVkaW9fcmVzdWx0X3QgcmVzdWx0KSB7CiAgICAgLy8gVGhpcyBjb3ZlcnMgdGhlIGNhc2UgZm9yIEFBVURJT19PSyBhbmQgZm9yIHBvc2l0aXZlIHJlc3VsdHMuCiAgICAgaWYgKHJlc3VsdCA+PSAwKSB7CkBAIC0yODEsNiArNTAzLDEzIEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorYXVkaW9fc2Vzc2lvbl90IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU2Vzc2lvbklkKGFhdWRpb19zZXNzaW9uX2lkX3Qgc2Vzc2lvbklkKSB7CisgICAgLy8gSWYgbm90IGEgcmVndWxhciBzZXNzaW9uSWQgdGhlbiBjb252ZXJ0IHRvIGEgc2FmZSB2YWx1ZSBvZiBBVURJT19TRVNTSU9OX0FMTE9DQVRFLgorICAgIHJldHVybiAoc2Vzc2lvbklkID09IEFBVURJT19TRVNTSU9OX0lEX0FMTE9DQVRFIHx8IHNlc3Npb25JZCA9PSBBQVVESU9fU0VTU0lPTl9JRF9OT05FKQorICAgICAgICAgICA/IEFVRElPX1NFU1NJT05fQUxMT0NBVEUKKyAgICAgICAgICAgOiAoYXVkaW9fc2Vzc2lvbl90KSBzZXNzaW9uSWQ7Cit9CisKIGF1ZGlvX2Zvcm1hdF90IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkRGF0YUZvcm1hdChhYXVkaW9fZm9ybWF0X3QgYWF1ZGlvRm9ybWF0KSB7CiAgICAgYXVkaW9fZm9ybWF0X3QgYW5kcm9pZEZvcm1hdDsKICAgICBzd2l0Y2ggKGFhdWRpb0Zvcm1hdCkgewpAQCAtMzE1LDE3ICs1NDQsNzcgQEAKICAgICByZXR1cm4gYWF1ZGlvRm9ybWF0OwogfQogCisvLyBNYWtlIGEgbWVzc2FnZSBzdHJpbmcgZnJvbSB0aGUgY29uZGl0aW9uLgorI2RlZmluZSBTVEFUSUNfQVNTRVJUKGNvbmRpdGlvbikgc3RhdGljX2Fzc2VydChjb25kaXRpb24sICNjb25kaXRpb24pCisKK2F1ZGlvX3VzYWdlX3QgQUF1ZGlvQ29udmVydF91c2FnZVRvSW50ZXJuYWwoYWF1ZGlvX3VzYWdlX3QgdXNhZ2UpIHsKKyAgICAvLyBUaGUgcHVibGljIGFhdWRpb19jb250ZW50X3R5cGVfdCBjb25zdGFudHMgYXJlIHN1cHBvc2VkIHRvIGhhdmUgdGhlIHNhbWUKKyAgICAvLyB2YWx1ZXMgYXMgdGhlIGludGVybmFsIGF1ZGlvX2NvbnRlbnRfdHlwZV90IHZhbHVlcy4KKyAgICBTVEFUSUNfQVNTRVJUKEFBVURJT19VU0FHRV9NRURJQSA9PSBBVURJT19VU0FHRV9NRURJQSk7CisgICAgU1RBVElDX0FTU0VSVChBQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTiA9PSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OKTsKKyAgICBTVEFUSUNfQVNTRVJUKEFBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkcKKyAgICAgICAgICAgICAgICAgID09IEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORyk7CisgICAgU1RBVElDX0FTU0VSVChBQVVESU9fVVNBR0VfQUxBUk0gPT0gQVVESU9fVVNBR0VfQUxBUk0pOworICAgIFNUQVRJQ19BU1NFUlQoQUFVRElPX1VTQUdFX05PVElGSUNBVElPTiA9PSBBVURJT19VU0FHRV9OT1RJRklDQVRJT04pOworICAgIFNUQVRJQ19BU1NFUlQoQUFVRElPX1VTQUdFX05PVElGSUNBVElPTl9SSU5HVE9ORQorICAgICAgICAgICAgICAgICAgPT0gQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORSk7CisgICAgU1RBVElDX0FTU0VSVChBQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UID09IEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVCk7CisgICAgU1RBVElDX0FTU0VSVChBQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZID09IEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWSk7CisgICAgU1RBVElDX0FTU0VSVChBQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFCisgICAgICAgICAgICAgICAgICA9PSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UpOworICAgIFNUQVRJQ19BU1NFUlQoQUFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OID09IEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OKTsKKyAgICBTVEFUSUNfQVNTRVJUKEFBVURJT19VU0FHRV9HQU1FID09IEFVRElPX1VTQUdFX0dBTUUpOworICAgIFNUQVRJQ19BU1NFUlQoQUFVRElPX1VTQUdFX0FTU0lTVEFOVCA9PSBBVURJT19VU0FHRV9BU1NJU1RBTlQpOworICAgIGlmICh1c2FnZSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgdXNhZ2UgPSBBQVVESU9fVVNBR0VfTUVESUE7CisgICAgfQorICAgIHJldHVybiAoYXVkaW9fdXNhZ2VfdCkgdXNhZ2U7IC8vIHNhbWUgdmFsdWUKK30KKworYXVkaW9fY29udGVudF90eXBlX3QgQUF1ZGlvQ29udmVydF9jb250ZW50VHlwZVRvSW50ZXJuYWwoYWF1ZGlvX2NvbnRlbnRfdHlwZV90IGNvbnRlbnRUeXBlKSB7CisgICAgLy8gVGhlIHB1YmxpYyBhYXVkaW9fY29udGVudF90eXBlX3QgY29uc3RhbnRzIGFyZSBzdXBwb3NlZCB0byBoYXZlIHRoZSBzYW1lCisgICAgLy8gdmFsdWVzIGFzIHRoZSBpbnRlcm5hbCBhdWRpb19jb250ZW50X3R5cGVfdCB2YWx1ZXMuCisgICAgU1RBVElDX0FTU0VSVChBQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDID09IEFVRElPX0NPTlRFTlRfVFlQRV9NVVNJQyk7CisgICAgU1RBVElDX0FTU0VSVChBQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCA9PSBBVURJT19DT05URU5UX1RZUEVfU1BFRUNIKTsKKyAgICBTVEFUSUNfQVNTRVJUKEFBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OID09IEFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT04pOworICAgIFNUQVRJQ19BU1NFUlQoQUFVRElPX0NPTlRFTlRfVFlQRV9NT1ZJRSA9PSBBVURJT19DT05URU5UX1RZUEVfTU9WSUUpOworICAgIGlmIChjb250ZW50VHlwZSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgY29udGVudFR5cGUgPSBBQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDOworICAgIH0KKyAgICByZXR1cm4gKGF1ZGlvX2NvbnRlbnRfdHlwZV90KSBjb250ZW50VHlwZTsgLy8gc2FtZSB2YWx1ZQorfQorCithdWRpb19zb3VyY2VfdCBBQXVkaW9Db252ZXJ0X2lucHV0UHJlc2V0VG9BdWRpb1NvdXJjZShhYXVkaW9faW5wdXRfcHJlc2V0X3QgcHJlc2V0KSB7CisgICAgLy8gVGhlIHB1YmxpYyBhYXVkaW9faW5wdXRfcHJlc2V0X3QgY29uc3RhbnRzIGFyZSBzdXBwb3NlZCB0byBoYXZlIHRoZSBzYW1lCisgICAgLy8gdmFsdWVzIGFzIHRoZSBpbnRlcm5hbCBhdWRpb19zb3VyY2VfdCB2YWx1ZXMuCisgICAgU1RBVElDX0FTU0VSVChBQVVESU9fVU5TUEVDSUZJRUQgPT0gQVVESU9fU09VUkNFX0RFRkFVTFQpOworICAgIFNUQVRJQ19BU1NFUlQoQUFVRElPX0lOUFVUX1BSRVNFVF9HRU5FUklDID09IEFVRElPX1NPVVJDRV9NSUMpOworICAgIFNUQVRJQ19BU1NFUlQoQUFVRElPX0lOUFVUX1BSRVNFVF9DQU1DT1JERVIgPT0gQVVESU9fU09VUkNFX0NBTUNPUkRFUik7CisgICAgU1RBVElDX0FTU0VSVChBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1JFQ09HTklUSU9OID09IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTik7CisgICAgU1RBVElDX0FTU0VSVChBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX0NPTU1VTklDQVRJT04gPT0gQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04pOworICAgIFNUQVRJQ19BU1NFUlQoQUFVRElPX0lOUFVUX1BSRVNFVF9VTlBST0NFU1NFRCA9PSBBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQpOworICAgIGlmIChwcmVzZXQgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgIHByZXNldCA9IEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUkVDT0dOSVRJT047CisgICAgfQorICAgIHJldHVybiAoYXVkaW9fc291cmNlX3QpIHByZXNldDsgLy8gc2FtZSB2YWx1ZQorfQorCiBpbnQzMl90IEFBdWRpb0NvbnZlcnRfZnJhbWVzVG9CeXRlcyhpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBieXRlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICpzaXplSW5CeXRlcykgewotICAgIC8vIFRPRE8gaW1wbGVtZW50IG1vcmUgZWxlZ2FudGx5Ci0gICAgY29uc3QgaW50MzJfdCBtYXhDaGFubmVscyA9IDI1NjsgLy8gcmlkaWN1bG91c2x5IGxhcmdlCi0gICAgY29uc3QgaW50MzJfdCBtYXhCeXRlc1BlckZyYW1lID0gbWF4Q2hhbm5lbHMgKiBzaXplb2YoZmxvYXQpOwotICAgIC8vIFByZXZlbnQgb3ZlcmZsb3cgYnkgbGltaXRpbmcgbXVsdGlwbGljYW5kcy4KLSAgICBpZiAoYnl0ZXNQZXJGcmFtZSA+IG1heEJ5dGVzUGVyRnJhbWUgfHwgbnVtRnJhbWVzID4gKDB4M0ZGRkZGRkYgLyBtYXhCeXRlc1BlckZyYW1lKSkgewotICAgICAgICBBTE9HRSgic2l6ZSBvdmVyZmxvdywgbnVtRnJhbWVzID0gJWQsIGZyYW1lU2l6ZSA9ICV6ZCIsIG51bUZyYW1lcywgYnl0ZXNQZXJGcmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJ5dGVzUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICpzaXplSW5CeXRlcykgeworICAgICpzaXplSW5CeXRlcyA9IDA7CisKKyAgICBpZiAobnVtRnJhbWVzIDwgMCB8fCBieXRlc1BlckZyYW1lIDwgMCkgeworICAgICAgICBBTE9HRSgibmVnYXRpdmUgc2l6ZSwgbnVtRnJhbWVzID0gJWQsIGZyYW1lU2l6ZSA9ICVkIiwgbnVtRnJhbWVzLCBieXRlc1BlckZyYW1lKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfQorCisgICAgLy8gUHJldmVudCBudW1lcmljIG92ZXJmbG93LgorICAgIGlmIChudW1GcmFtZXMgPiAoSU5UMzJfTUFYIC8gYnl0ZXNQZXJGcmFtZSkpIHsKKyAgICAgICAgQUxPR0UoInNpemUgb3ZlcmZsb3csIG51bUZyYW1lcyA9ICVkLCBmcmFtZVNpemUgPSAlZCIsIG51bUZyYW1lcywgYnl0ZXNQZXJGcmFtZSk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOworICAgIH0KKwogICAgICpzaXplSW5CeXRlcyA9IG51bUZyYW1lcyAqIGJ5dGVzUGVyRnJhbWU7CiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KQEAgLTQxMCwzICs2OTksMzEgQEAKICAgICB9CiAgICAgcmV0dXJuIHByb3A7CiB9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9faXNGbHVzaEFsbG93ZWQoYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IHN0YXRlKSB7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKKyAgICBzd2l0Y2ggKHN0YXRlKSB7CisvLyBQcm9jZWVkIHdpdGggZmx1c2hpbmcuCisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9PUEVOOgorICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VEOgorICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBFRDoKKyAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNIRUQ6CisgICAgICAgICAgICBicmVhazsKKworLy8gVHJhbnNpdGlvbiBmcm9tIG9uZSBpbmFjdGl2ZSBzdGF0ZSB0byBhbm90aGVyLgorICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRJTkc6CisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEOgorICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkc6CisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTSU5HOgorICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfRkxVU0hJTkc6CisgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TSU5HOgorICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VEOgorICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoImNhbiBvbmx5IGZsdXNoIHN0cmVhbSB3aGVuIFBBVVNFRCwgT1BFTiBvciBTVE9QUEVELCBzdGF0ZSA9ICVzIiwKKyAgICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQoc3RhdGUpKTsKKyAgICAgICAgICAgIHJlc3VsdCA9ICBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oCmluZGV4IDNhZmE5NzYuLjRiOTc1ZTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKICNpbmNsdWRlICJhYXVkaW8vQUF1ZGlvLmgiCiAKQEAgLTM4LDYgKzM4LDEzIEBACiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoYW5kcm9pZDo6c3RhdHVzX3Qgc3RhdHVzKTsKIAogLyoqCisgKiBDb252ZXJ0IGFuIGFhdWRpb19zZXNzaW9uX2lkX3QgdG8gYSB2YWx1ZSB0aGF0IGlzIHNhZmUgdG8gcGFzcyB0byBBdWRpb0ZsaW5nZXIuCisgKiBAcGFyYW0gc2Vzc2lvbklkCisgKiBAcmV0dXJuIHNhZmUgdmFsdWUKKyAqLworYXVkaW9fc2Vzc2lvbl90IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU2Vzc2lvbklkKGFhdWRpb19zZXNzaW9uX2lkX3Qgc2Vzc2lvbklkKTsKKworLyoqCiAgKiBDb252ZXJ0IGFuIGFycmF5IG9mIGZsb2F0cyB0byBhbiBhcnJheSBvZiBpbnQxNl90LgogICoKICAqIEBwYXJhbSBzb3VyY2UKQEAgLTE1MiwyMSArMTU5LDgxIEBACiAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCiAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpOwogCitjbGFzcyBBQXVkaW9EYXRhQ29udmVydGVyIHsKK3B1YmxpYzoKKworICAgIHN0cnVjdCBGb3JtYXR0ZWREYXRhIHsKKworICAgICAgICBGb3JtYXR0ZWREYXRhKHZvaWQgKmRhdGEsIGFhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICAgICAgOiBkYXRhKGRhdGEpCisgICAgICAgICAgICAsIGZvcm1hdChmb3JtYXQpCisgICAgICAgICAgICAsIGNoYW5uZWxDb3VudChjaGFubmVsQ291bnQpIHt9CisKKyAgICAgICAgY29uc3Qgdm9pZCAgICAgICAgICAgICpkYXRhID0gbnVsbHB0cjsKKyAgICAgICAgY29uc3QgYWF1ZGlvX2Zvcm1hdF90ICBmb3JtYXQgPSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOworICAgICAgICBjb25zdCBpbnQzMl90ICAgICAgICAgIGNoYW5uZWxDb3VudCA9IDE7CisgICAgfTsKKworICAgIHN0YXRpYyB2b2lkIGNvbnZlcnQoY29uc3QgRm9ybWF0dGVkRGF0YSAmc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmZGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxldmVsRnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxldmVsVG8pOworCitwcml2YXRlOgorICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRNb25vVG9TdGVyZW8oY29uc3QgRm9ybWF0dGVkRGF0YSAmc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmZGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxldmVsRnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxldmVsVG8pOworCisgICAgc3RhdGljIHZvaWQgY29udmVydENoYW5uZWxzTWF0Y2goY29uc3QgRm9ybWF0dGVkRGF0YSAmc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJmRlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxldmVsRnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbFRvKTsKK307CisKIC8qKgogICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgYW5kIHByZXZlbnQgbnVtZXJpYyBvdmVyZmxvdy4KKyAqIFRoZSAqc2l6ZUluQnl0ZXMgd2lsbCBiZSBzZXQgdG8gemVybyBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKyAqCiAgKiBAcGFyYW0gbnVtRnJhbWVzIGZyYW1lIGNvdW50CiAgKiBAcGFyYW0gYnl0ZXNQZXJGcmFtZSBzaXplIG9mIGEgZnJhbWUgaW4gYnl0ZXMKLSAqIEBwYXJhbSBzaXplSW5CeXRlcyB0b3RhbCBzaXplIGluIGJ5dGVzCisgKiBAcGFyYW0gc2l6ZUluQnl0ZXMgcG9pbnRlciB0byBhIHZhcmlhYmxlIHRvIHJlY2VpdmUgdG90YWwgc2l6ZSBpbiBieXRlcwogICogQHJldHVybiBBQVVESU9fT0sgb3IgbmVnYXRpdmUgZXJyb3IsIGVnLiBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFCiAgKi8KIGludDMyX3QgQUF1ZGlvQ29udmVydF9mcmFtZXNUb0J5dGVzKGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJ5dGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKnNpemVJbkJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYnl0ZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKnNpemVJbkJ5dGVzKTsKIAogYXVkaW9fZm9ybWF0X3QgQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWREYXRhRm9ybWF0KGFhdWRpb19mb3JtYXRfdCBhYXVkaW9fZm9ybWF0KTsKIAogYWF1ZGlvX2Zvcm1hdF90IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvRGF0YUZvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpOwogCisKKy8qKgorICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdmFsaWRhdGUgdGhlIHBhc3NlZCBpbiB2YWx1ZS4KKyAqIFRoYXQgaXMgZG9uZSBzb21ld2hlcmUgZWxzZS4KKyAqIEByZXR1cm4gaW50ZXJuYWwgdmFsdWUKKyAqLworCithdWRpb191c2FnZV90IEFBdWRpb0NvbnZlcnRfdXNhZ2VUb0ludGVybmFsKGFhdWRpb191c2FnZV90IHVzYWdlKTsKKworLyoqCisgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB2YWxpZGF0ZSB0aGUgcGFzc2VkIGluIHZhbHVlLgorICogVGhhdCBpcyBkb25lIHNvbWV3aGVyZSBlbHNlLgorICogQHJldHVybiBpbnRlcm5hbCB2YWx1ZQorICovCithdWRpb19jb250ZW50X3R5cGVfdCBBQXVkaW9Db252ZXJ0X2NvbnRlbnRUeXBlVG9JbnRlcm5hbChhYXVkaW9fY29udGVudF90eXBlX3QgY29udGVudFR5cGUpOworCisvKioKKyAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHZhbGlkYXRlIHRoZSBwYXNzZWQgaW4gdmFsdWUuCisgKiBUaGF0IGlzIGRvbmUgc29tZXdoZXJlIGVsc2UuCisgKiBAcmV0dXJuIGludGVybmFsIGF1ZGlvIHNvdXJjZQorICovCithdWRpb19zb3VyY2VfdCBBQXVkaW9Db252ZXJ0X2lucHV0UHJlc2V0VG9BdWRpb1NvdXJjZShhYXVkaW9faW5wdXRfcHJlc2V0X3QgcHJlc2V0KTsKKwogLyoqCiAgKiBAcmV0dXJuIHRoZSBzaXplIG9mIGEgc2FtcGxlIG9mIHRoZSBnaXZlbiBmb3JtYXQgaW4gYnl0ZXMgb3IgQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQKICAqLwpAQCAtMjM1LDYgKzMwMiwxNCBAQAogICovCiBpbnQzMl90IEFBdWRpb1Byb3BlcnR5X2dldEhhcmR3YXJlQnVyc3RNaW5NaWNyb3MoKTsKIAorCisvKioKKyAqIElzIGZsdXNoIGFsbG93ZWQgZm9yIHRoZSBnaXZlbiBzdGF0ZT8KKyAqIEBwYXJhbSBzdGF0ZQorICogQHJldHVybiBBQVVESU9fT0sgaWYgYWxsb3dlZCBvciBhbiBlcnJvcgorICovCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvX2lzRmx1c2hBbGxvd2VkKGFhdWRpb19zdHJlYW1fc3RhdGVfdCBzdGF0ZSk7CisKIC8qKgogICogVHJ5IGEgZnVuY3Rpb24gZiB1bnRpbCBpdCByZXR1cm5zIHRydWUuCiAgKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0F1ZGlvQ2xvY2suaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BdWRpb0Nsb2NrLmgKaW5kZXggNDNiNzFiMC4uZDVkNGVmNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0F1ZGlvQ2xvY2suaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQXVkaW9DbG9jay5oCkBAIC0xNyw2ICsxNyw3IEBACiAjaWZuZGVmIFVUSUxJVFlfQVVESU9fQ0xPQ0tfSAogI2RlZmluZSBVVElMSVRZX0FVRElPX0NMT0NLX0gKIAorI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8dGltZS5oPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTGluZWFyUmFtcC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0xpbmVhclJhbXAuaAppbmRleCBmZjA5ZGNlLi4yYjFiOGUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTGluZWFyUmFtcC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9MaW5lYXJSYW1wLmgKQEAgLTg3LDcgKzg3LDcgQEAKIAogICAgIHN0ZDo6YXRvbWljPGZsb2F0PiAgIG1UYXJnZXQ7CiAKLSAgICBpbnQzMl90IG1MZW5ndGhJbkZyYW1lcyAgPSA0ODAwMCAvIDUwOyAvLyAyMCBtc2VjIGF0IDQ4MDAwIEh6CisgICAgaW50MzJfdCBtTGVuZ3RoSW5GcmFtZXMgID0gNDgwMDAgLyAxMDA7IC8vIDEwIG1zZWMgYXQgNDgwMDAgSHoKICAgICBpbnQzMl90IG1SZW1haW5pbmcgICAgICAgPSAwOwogICAgIGZsb2F0ICAgbUxldmVsRnJvbSAgICAgICA9IDAuMGY7CiAgICAgZmxvYXQgICBtTGV2ZWxUbyAgICAgICAgID0gMC4wZjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgxOTRkYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTY5IEBACitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyIsCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAidGVzdF9hYXVkaW9fbWFyc2hhbGxpbmciLAorICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsidGVzdF9tYXJzaGFsbGluZy5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYWF1ZGlvIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ0ZXN0X2Jsb2NrX2FkYXB0ZXIiLAorICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsidGVzdF9ibG9ja19hZGFwdGVyLmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAidGVzdF90aW1lc3RhbXBzIiwKKyAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInRlc3RfdGltZXN0YW1wcy5jcHAiXSwKKyAgICBoZWFkZXJfbGliczogWyJsaWJhYXVkaW9fZXhhbXBsZV91dGlscyJdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAidGVzdF9saW5lYXJfcmFtcCIsCisgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJ0ZXN0X2xpbmVhcl9yYW1wLmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAidGVzdF9vcGVuX3BhcmFtcyIsCisgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJ0ZXN0X29wZW5fcGFyYW1zLmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhYXVkaW8iLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogInRlc3Rfbm9fY2xvc2UiLAorICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsidGVzdF9ub19jbG9zZS5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYWF1ZGlvIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ0ZXN0X2FhdWRpb19yZWNvdmVyeSIsCisgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJ0ZXN0X3JlY292ZXJ5LmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhYXVkaW8iLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogInRlc3Rfbl9zdHJlYW1zIiwKKyAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInRlc3Rfbl9zdHJlYW1zLmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhYXVkaW8iLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogInRlc3RfYmFkX2Rpc2Nvbm5lY3QiLAorICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsidGVzdF9iYWRfZGlzY29ubmVjdC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYWF1ZGlvIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ0ZXN0X3ZhcmlvdXMiLAorICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsidGVzdF92YXJpb3VzLmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhYXVkaW8iLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogInRlc3Rfc2Vzc2lvbl9pZCIsCisgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJ0ZXN0X3Nlc3Npb25faWQuY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmFhdWRpbyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAidGVzdF9hYXVkaW9fbW9ua2V5IiwKKyAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInRlc3RfYWF1ZGlvX21vbmtleS5jcHAiXSwKKyAgICBoZWFkZXJfbGliczogWyJsaWJhYXVkaW9fZXhhbXBsZV91dGlscyJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhYXVkaW8iLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogInRlc3RfYXR0cmlidXRlcyIsCisgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJ0ZXN0X2F0dHJpYnV0ZXMuY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmFhdWRpbyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAidGVzdF9pbnRlcmZlcmVuY2UiLAorICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsidGVzdF9pbnRlcmZlcmVuY2UuY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmFhdWRpbyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAidGVzdF9hdG9taWNfZmlmbyIsCisgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJ0ZXN0X2F0b21pY19maWZvLmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdiMDEwZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9zcmMKLUxPQ0FMX1NSQ19GSUxFUzo9IHRlc3RfbWFyc2hhbGxpbmcuY3BwCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbyBsaWJiaW5kZXIgbGliY3V0aWxzIGxpYnV0aWxzCi1MT0NBTF9NT0RVTEUgOj0gdGVzdF9hYXVkaW9fbWFyc2hhbGxpbmcKLWluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9zcmMKLUxPQ0FMX1NSQ19GSUxFUzo9IHRlc3RfYmxvY2tfYWRhcHRlci5jcHAKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvCi1MT0NBTF9NT0RVTEUgOj0gdGVzdF9ibG9ja19hZGFwdGVyCi1pbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vc3JjIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9leGFtcGxlcwotTE9DQUxfU1JDX0ZJTEVTOj0gdGVzdF90aW1lc3RhbXBzLmNwcAotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8KLUxPQ0FMX01PRFVMRSA6PSB0ZXN0X3RpbWVzdGFtcHMKLWluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9zcmMKLUxPQ0FMX1NSQ19GSUxFUzo9IHRlc3RfbGluZWFyX3JhbXAuY3BwCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbwotTE9DQUxfTU9EVUxFIDo9IHRlc3RfbGluZWFyX3JhbXAKLWluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9zcmMKLUxPQ0FMX1NSQ19GSUxFUzo9IHRlc3Rfb3Blbl9wYXJhbXMuY3BwCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbyBsaWJiaW5kZXIgbGliY3V0aWxzIGxpYnV0aWxzCi1MT0NBTF9NT0RVTEUgOj0gdGVzdF9vcGVuX3BhcmFtcwotaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL3NyYwotTE9DQUxfU1JDX0ZJTEVTOj0gdGVzdF9ub19jbG9zZS5jcHAKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvIGxpYmJpbmRlciBsaWJjdXRpbHMgbGlidXRpbHMKLUxPQ0FMX01PRFVMRSA6PSB0ZXN0X25vX2Nsb3NlCi1pbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vc3JjCi1MT0NBTF9TUkNfRklMRVM6PSB0ZXN0X3JlY292ZXJ5LmNwcAotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8gbGliYmluZGVyIGxpYmN1dGlscyBsaWJ1dGlscwotTE9DQUxfTU9EVUxFIDo9IHRlc3RfYWF1ZGlvX3JlY292ZXJ5Ci1pbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vc3JjCi1MT0NBTF9TUkNfRklMRVM6PSB0ZXN0X25fc3RyZWFtcy5jcHAKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvIGxpYmJpbmRlciBsaWJjdXRpbHMgbGlidXRpbHMKLUxPQ0FMX01PRFVMRSA6PSB0ZXN0X25fc3RyZWFtcwotaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYWF1ZGlvX21vbmtleS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hYXVkaW9fbW9ua2V5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTU0ODM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYWF1ZGlvX21vbmtleS5jcHAKQEAgLTAsMCArMSwzMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBUcnkgdG8gdHJpZ2dlciBidWdzIGJ5IHBsYXlpbmcgcmFuZG9tbHkgb24gbXVsdGlwbGUgc3RyZWFtcy4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgIkFBdWRpb0FyZ3NQYXJzZXIuaCIKKyNpbmNsdWRlICJBQXVkaW9FeGFtcGxlVXRpbHMuaCIKKyNpbmNsdWRlICJBQXVkaW9TaW1wbGVQbGF5ZXIuaCIKKyNpbmNsdWRlICJTaW5lR2VuZXJhdG9yLmgiCisKKyNkZWZpbmUgREVGQVVMVF9USU1FT1VUX05BTk9TICAoMSAqIE5BTk9TX1BFUl9TRUNPTkQpCisKKyNkZWZpbmUgTlVNX0xPT1BTICAgICAgICAgIDEwMDAKKyNkZWZpbmUgTUFYX01JQ1JPU19ERUxBWSAgICgyICogMTAwMCAqIDEwMDApCisKKy8vIFRPRE8gQ29uc2lkZXIgYWRkaW5nIGFuIGlucHV0IHN0cmVhbS4KKyNkZWZpbmUgUFJPQl9TVEFSVCAgICgwLjIwKQorI2RlZmluZSBQUk9CX1BBVVNFICAgKFBST0JfU1RBUlQgKyAwLjEwKQorI2RlZmluZSBQUk9CX0ZMVVNIICAgKFBST0JfUEFVU0UgKyAwLjEwKQorI2RlZmluZSBQUk9CX1NUT1AgICAgKFBST0JfRkxVU0ggKyAwLjEwKQorI2RlZmluZSBQUk9CX0NMT1NFICAgKFBST0JfU1RPUCArIDAuMTApCitzdGF0aWNfYXNzZXJ0KFBST0JfQ0xPU0UgPCAwLjksICJQcm9iYWJpbGl0eSBzdW0gdG9vIGhpZ2guIik7CisKK2FhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IEFBdWRpb01vbmtleURhdGFDYWxsYmFjaygKKyAgICAgICAgQUF1ZGlvU3RyZWFtICpzdHJlYW0sCisgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICB2b2lkICphdWRpb0RhdGEsCisgICAgICAgIGludDMyX3QgbnVtRnJhbWVzKTsKKwordm9pZCBBQXVkaW9Nb25rZXlFcnJvckNhbGxiYWNrUHJvYygKKyAgICAgICAgQUF1ZGlvU3RyZWFtICpzdHJlYW0gX191bnVzZWQsCisgICAgICAgIHZvaWQgKnVzZXJEYXRhIF9fdW51c2VkLAorICAgICAgICBhYXVkaW9fcmVzdWx0X3QgZXJyb3IpIHsKKyAgICBwcmludGYoIkVycm9yIENhbGxiYWNrLCBlcnJvcjogJWRcbiIsKGludCllcnJvcik7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gaXMgbm90IHRocmVhZCBzYWZlLiBPbmx5IHVzZSB0aGlzIGZyb20gYSBzaW5nbGUgdGhyZWFkLgorZG91YmxlIG5leHRSYW5kb21Eb3VibGUoKSB7CisgICAgcmV0dXJuIGRyYW5kNDgoKTsKK30KKworY2xhc3MgQUF1ZGlvTW9ua2V5IDogcHVibGljIEFBdWRpb1NpbXBsZVBsYXllciB7CitwdWJsaWM6CisKKyAgICBBQXVkaW9Nb25rZXkoaW50IGluZGV4LCBBQXVkaW9BcmdzUGFyc2VyICphcmdQYXJzZXIpCisgICAgICAgICAgICA6IG1BcmdQYXJzZXIoYXJnUGFyc2VyKQorICAgICAgICAgICAgLCBtSW5kZXgoaW5kZXgpIHt9CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgb3BlbigpIHsKKyAgICAgICAgcHJpbnRmKCJNb25rZXkgIyAlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9QRU5cbiIsIG1JbmRleCk7CisgICAgICAgIGRvdWJsZSBvZmZzZXQgPSBtSW5kZXggKiA1MDsKKyAgICAgICAgbVNpbmUxLnNldHVwKDQ0MC4wLCA0ODAwMCk7CisgICAgICAgIG1TaW5lMS5zZXRTd2VlcCgzMDAuMCArIG9mZnNldCwgNjAwLjAgKyBvZmZzZXQsIDUuMCk7CisgICAgICAgIG1TaW5lMi5zZXR1cCg2NjAuMCwgNDgwMDApOworICAgICAgICBtU2luZTIuc2V0U3dlZXAoMzUwLjAgKyBvZmZzZXQsIDkwMC4wICsgb2Zmc2V0LCA3LjApOworCisgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TaW1wbGVQbGF5ZXI6Om9wZW4oKm1BcmdQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBdWRpb01vbmtleURhdGFDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUF1ZGlvTW9ua2V5RXJyb3JDYWxsYmFja1Byb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpOworICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgcHJpbnRmKCJFUlJPUiAtICBwbGF5ZXIub3BlbigpIHJldHVybmVkICVkXG4iLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgbUFyZ1BhcnNlci0+Y29tcGFyZVdpdGhTdHJlYW0oZ2V0U3RyZWFtKCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGJvb2wgaXNPcGVuKCkgeworICAgICAgICByZXR1cm4gKGdldFN0cmVhbSgpICE9IG51bGxwdHIpOworCisgICAgfQorICAgIC8qKgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHN0cmVhbSBwYXNzZXMgdGVzdHMKKyAgICAgKi8KKyAgICBib29sIHZhbGlkYXRlKCkgeworICAgICAgICBpZiAoIWlzT3BlbigpKSByZXR1cm4gdHJ1ZTsgLy8gY2xvc2VkIGlzIE9LCisKKyAgICAgICAgLy8gdXBkYXRlIGFuZCBxdWVyeSBzdHJlYW0gc3RhdGUKKyAgICAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IHN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9VTktOT1dOOworICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3dhaXRGb3JTdGF0ZUNoYW5nZShnZXRTdHJlYW0oKSwKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfVU5LTk9XTiwgJnN0YXRlLCAwKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIHByaW50ZigiRVJST1IgLSBBQXVkaW9TdHJlYW1fd2FpdEZvclN0YXRlQ2hhbmdlIHJldHVybmVkICVkXG4iLCByZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaW50NjRfdCBmcmFtZXNSZWFkID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoZ2V0U3RyZWFtKCkpOworICAgICAgICBpbnQ2NF90IGZyYW1lc1dyaXR0ZW4gPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihnZXRTdHJlYW0oKSk7CisgICAgICAgIGludDMyX3QgeFJ1bnMgPSBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50KGdldFN0cmVhbSgpKTsKKyAgICAgICAgLy8gUHJpbnQgc3RhdHVzCisgICAgICAgIHByaW50ZigiJTMwcywgZnJhbWVzV3JpdHRlbiA9ICU4bGxkLCBmcmFtZXNSZWFkID0gJThsbGQsIHhSdW5zID0gJWRcbiIsCisgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KHN0YXRlKSwKKyAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGZyYW1lc1dyaXR0ZW4sCisgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBmcmFtZXNSZWFkLAorICAgICAgICAgICAgICAgeFJ1bnMpOworCisgICAgICAgIGlmIChmcmFtZXNXcml0dGVuIDwgZnJhbWVzUmVhZCkgeworICAgICAgICAgICAgcHJpbnRmKCJXQVJOSU5HIC0gVU5ERVJGTE9XIC0gZGlmZiA9ICVkICEhISEhISEhISEhIVxuIiwKKyAgICAgICAgICAgICAgICAgICAoaW50KSAoZnJhbWVzV3JpdHRlbiAtIGZyYW1lc1JlYWQpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgaW52b2tlKCkgeworICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOworICAgICAgICBpZiAoIWlzT3BlbigpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBvcGVuKCk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghdmFsaWRhdGUoKSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgZG91YmxlIGRpY2UgPSBuZXh0UmFuZG9tRG91YmxlKCk7CisgICAgICAgIC8vIFNlbGVjdCBhbiBhY3Rpb24gYmFzZWQgb24gYSB3ZWlnaHRlZCBwcm9iYWJpbGl0eS4KKyAgICAgICAgaWYgKGRpY2UgPCBQUk9CX1NUQVJUKSB7CisgICAgICAgICAgICBwcmludGYoInN0YXJ0XG4iKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoZ2V0U3RyZWFtKCkpOworICAgICAgICB9IGVsc2UgaWYgKGRpY2UgPCBQUk9CX1BBVVNFKSB7CisgICAgICAgICAgICBwcmludGYoInBhdXNlXG4iKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9yZXF1ZXN0UGF1c2UoZ2V0U3RyZWFtKCkpOworICAgICAgICB9IGVsc2UgaWYgKGRpY2UgPCBQUk9CX0ZMVVNIKSB7CisgICAgICAgICAgICBwcmludGYoImZsdXNoXG4iKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9yZXF1ZXN0Rmx1c2goZ2V0U3RyZWFtKCkpOworICAgICAgICB9IGVsc2UgaWYgKGRpY2UgPCBQUk9CX1NUT1ApIHsKKyAgICAgICAgICAgIHByaW50Zigic3RvcFxuIik7CisgICAgICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoZ2V0U3RyZWFtKCkpOworICAgICAgICB9IGVsc2UgaWYgKGRpY2UgPCBQUk9CX0NMT1NFKSB7CisgICAgICAgICAgICBwcmludGYoImNsb3NlXG4iKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IGNsb3NlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoImRvIG5vdGhpbmdcbiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURSkgeworICAgICAgICAgICAgcHJpbnRmKCIgICAgZ290IEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFIC0gZXhwZWN0ZWQgZnJvbSBhIG1vbmtleVxuIik7CisgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fT0s7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0sgJiYgaXNPcGVuKCkpIHsKKyAgICAgICAgICAgIGlmICghdmFsaWRhdGUoKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgcmVuZGVyQXVkaW8oCisgICAgICAgICAgICBBQXVkaW9TdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgICAgIHZvaWQgKmF1ZGlvRGF0YSwKKyAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzKSB7CisKKyAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUgPSBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KHN0cmVhbSk7CisgICAgICAgIC8vIFRoaXMgY29kZSBvbmx5IHBsYXlzIG9uIHRoZSBmaXJzdCBvbmUgb3IgdHdvIGNoYW5uZWxzLgorICAgICAgICAvLyBUT0RPIFN1cHBvcnQgYXJiaXRyYXJ5IG51bWJlciBvZiBjaGFubmVscy4KKyAgICAgICAgc3dpdGNoIChBQXVkaW9TdHJlYW1fZ2V0Rm9ybWF0KHN0cmVhbSkpIHsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fSTE2OiB7CisgICAgICAgICAgICAgICAgaW50MTZfdCAqYXVkaW9CdWZmZXIgPSAoaW50MTZfdCAqKSBhdWRpb0RhdGE7CisgICAgICAgICAgICAgICAgLy8gUmVuZGVyIHNpbmUgd2F2ZXMgYXMgc2hvcnRzIHRvIGZpcnN0IGNoYW5uZWwuCisgICAgICAgICAgICAgICAgbVNpbmUxLnJlbmRlcigmYXVkaW9CdWZmZXJbMF0sIHNhbXBsZXNQZXJGcmFtZSwgbnVtRnJhbWVzKTsKKyAgICAgICAgICAgICAgICAvLyBSZW5kZXIgc2luZSB3YXZlcyB0byBzZWNvbmQgY2hhbm5lbCBpZiB0aGVyZSBpcyBvbmUuCisgICAgICAgICAgICAgICAgaWYgKHNhbXBsZXNQZXJGcmFtZSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNpbmUyLnJlbmRlcigmYXVkaW9CdWZmZXJbMV0sIHNhbXBsZXNQZXJGcmFtZSwgbnVtRnJhbWVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0ZMT0FUOiB7CisgICAgICAgICAgICAgICAgZmxvYXQgKmF1ZGlvQnVmZmVyID0gKGZsb2F0ICopIGF1ZGlvRGF0YTsKKyAgICAgICAgICAgICAgICAvLyBSZW5kZXIgc2luZSB3YXZlcyBhcyBmbG9hdHMgdG8gZmlyc3QgY2hhbm5lbC4KKyAgICAgICAgICAgICAgICBtU2luZTEucmVuZGVyKCZhdWRpb0J1ZmZlclswXSwgc2FtcGxlc1BlckZyYW1lLCBudW1GcmFtZXMpOworICAgICAgICAgICAgICAgIC8vIFJlbmRlciBzaW5lIHdhdmVzIHRvIHNlY29uZCBjaGFubmVsIGlmIHRoZXJlIGlzIG9uZS4KKyAgICAgICAgICAgICAgICBpZiAoc2FtcGxlc1BlckZyYW1lID4gMSkgeworICAgICAgICAgICAgICAgICAgICBtU2luZTIucmVuZGVyKCZhdWRpb0J1ZmZlclsxXSwgc2FtcGxlc1BlckZyYW1lLCBudW1GcmFtZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9DT05USU5VRTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgQUF1ZGlvQXJnc1BhcnNlciAgKm1BcmdQYXJzZXI7CisgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgIG1JbmRleDsKKyAgICBTaW5lR2VuZXJhdG9yICAgICAgICAgICAgbVNpbmUxOworICAgIFNpbmVHZW5lcmF0b3IgICAgICAgICAgICBtU2luZTI7Cit9OworCisvLyBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGZpbGxzIHRoZSBhdWRpbyBvdXRwdXQgYnVmZmVyLgorYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgQUF1ZGlvTW9ua2V5RGF0YUNhbGxiYWNrKAorICAgICAgICBBQXVkaW9TdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgIHZvaWQgKmF1ZGlvRGF0YSwKKyAgICAgICAgaW50MzJfdCBudW1GcmFtZXMKKykgeworICAgIC8vIHNob3VsZCBub3QgaGFwcGVuIGJ1dCBqdXN0IGluIGNhc2UuLi4KKyAgICBpZiAodXNlckRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICBwcmludGYoIkVSUk9SIC0gQUF1ZGlvTW9ua2V5RGF0YUNhbGxiYWNrIG5lZWRzIHVzZXJEYXRhXG4iKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUDsKKyAgICB9CisgICAgQUF1ZGlvTW9ua2V5ICptb25rZXkgPSAoQUF1ZGlvTW9ua2V5ICopIHVzZXJEYXRhOworICAgIHJldHVybiBtb25rZXktPnJlbmRlckF1ZGlvKHN0cmVhbSwgYXVkaW9EYXRhLCBudW1GcmFtZXMpOworfQorCisKK3N0YXRpYyB2b2lkIHVzYWdlKCkgeworICAgIEFBdWRpb0FyZ3NQYXJzZXI6OnVzYWdlKCk7CisgICAgcHJpbnRmKCIgICAgICAtaXtzZWVkfSAgSW5pdGlhbCByYW5kb20gc2VlZFxuIik7CisgICAgcHJpbnRmKCIgICAgICAtdHtjb3VudH0gbnVtYmVyIG9mIG1vbmtleXMgaW4gdGhlIFRyb29wXG4iKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KSB7CisgICAgQUF1ZGlvQXJnc1BhcnNlciBhcmdQYXJzZXI7CisgICAgc3RkOjp2ZWN0b3I8QUF1ZGlvTW9ua2V5PiBtb25rZXlzOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQ7CisgICAgaW50IG51bU1vbmtleXMgPSAxOworCisgICAgLy8gTWFrZSBwcmludGYgcHJpbnQgaW1tZWRpYXRlbHkgc28gdGhhdCBkZWJ1ZyBpbmZvIGlzIG5vdCBzdHVjaworICAgIC8vIGluIGEgYnVmZmVyIGlmIHdlIGhhbmcgb3IgY3Jhc2guCisgICAgc2V0dmJ1ZihzdGRvdXQsIG51bGxwdHIsIF9JT05CRiwgKHNpemVfdCkgMCk7CisKKyAgICBwcmludGYoIiVzIC0gTW9ua2V5c1xuIiwgYXJndlswXSk7CisKKyAgICBsb25nIGludCBzZWVkID0gKGxvbmcgaW50KWdldE5hbm9zZWNvbmRzKCk7ICAvLyBkaWZmZXJlbnQgZXZlcnkgdGltZSBieSBkZWZhdWx0CisKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgICBjb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworICAgICAgICBpZiAoYXJnUGFyc2VyLnBhcnNlQXJnKGFyZykpIHsKKyAgICAgICAgICAgIC8vIEhhbmRsZSBvcHRpb25zIHRoYXQgYXJlIG5vdCBoYW5kbGVkIGJ5IHRoZSBBcmdQYXJzZXIKKyAgICAgICAgICAgIGlmIChhcmdbMF0gPT0gJy0nKSB7CisgICAgICAgICAgICAgICAgY2hhciBvcHRpb24gPSBhcmdbMV07CisgICAgICAgICAgICAgICAgc3dpdGNoIChvcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWVkID0gYXRvbCgmYXJnWzJdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bU1vbmtleXMgPSBhdG9pKCZhcmdbMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1c2FnZSgpOworICAgICAgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHNyYW5kNDgoc2VlZCk7CisgICAgcHJpbnRmKCJzZWVkID0gJWxkLCBuZXh0UmFuZG9tRG91YmxlKCkgPSAlZlxuIiwgc2VlZCwgbmV4dFJhbmRvbURvdWJsZSgpKTsKKworICAgIGZvciAoaW50IG0gPSAwOyBtIDwgbnVtTW9ua2V5czsgbSsrKSB7CisgICAgICAgIG1vbmtleXMuZW1wbGFjZV9iYWNrKG0sICZhcmdQYXJzZXIpOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX0xPT1BTOyBpKyspIHsKKyAgICAgICAgLy8gcGljayBhIHJhbmRvbSBtb25rZXkgYW5kIGludm9rZSBpdAorICAgICAgICBkb3VibGUgZGljZSA9IG5leHRSYW5kb21Eb3VibGUoKTsKKyAgICAgICAgaW50IG1vbmtleUluZGV4ID0gZmxvb3IoZGljZSAqIG51bU1vbmtleXMpOworICAgICAgICBwcmludGYoIi0tLS0tLS0tLS0tIE1vbmtleSAjJWRcbiIsIG1vbmtleUluZGV4KTsKKyAgICAgICAgcmVzdWx0ID0gbW9ua2V5c1ttb25rZXlJbmRleF0uaW52b2tlKCk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2xlZXAgc29tZSByYW5kb20gdGltZQorICAgICAgICBkaWNlID0gbmV4dFJhbmRvbURvdWJsZSgpOworICAgICAgICBkaWNlID0gZGljZSAqIGRpY2UgKiBkaWNlOyAvLyBza2V3IHRvd2FyZHMgc21hbGxlciBkZWxheXMKKyAgICAgICAgaW50IG1pY3JvcyA9IChpbnQpIChkaWNlICogTUFYX01JQ1JPU19ERUxBWSk7CisgICAgICAgIHVzbGVlcChtaWNyb3MpOworCisgICAgICAgIC8vIFRPRE8gY29uc2lkZXIgbWFraW5nIHRoaXMgbXVsdGktdGhyZWFkZWQsIG9uZSB0aHJlYWQgcGVyIG1vbmtleSwgdG8gY2F0Y2ggbW9yZSBidWdzCisgICAgfQorCisgICAgcHJpbnRmKCJQQVNTXG4iKTsKKyAgICByZXR1cm4gRVhJVF9TVUNDRVNTOworCitlcnJvcjoKKyAgICBwcmludGYoIkZBSUwgLSBBQXVkaW8gcmVzdWx0ID0gJWQgPSAlc1xuIiwgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICB1c2xlZXAoMTAwMCAqIDEwMDApOyAvLyBnaXZlIG1lIHRpbWUgdG8gc3RvcCB0aGUgbG9nY2F0CisgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXRvbWljX2ZpZm8uY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXRvbWljX2ZpZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwODUyMTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdG9taWNfZmlmby5jcHAKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiZmlmby9GaWZvQnVmZmVyLmgiCisjaW5jbHVkZSAiZmlmby9GaWZvQ29udHJvbGxlci5oIgorCit1c2luZyBhbmRyb2lkOjpmaWZvX2ZyYW1lc190OwordXNpbmcgYW5kcm9pZDo6Rmlmb0NvbnRyb2xsZXI7Cit1c2luZyBhbmRyb2lkOjpGaWZvQnVmZmVyOwordXNpbmcgYW5kcm9pZDo6V3JhcHBpbmdCdWZmZXI7CisKKy8vdm9pZCBmb28oKSB7CitURVNUKHRlc3RfZmlmaV9jb250cm9sbGVyLCBmaWZvX2luZGljZXMpIHsKKyAgICAvLyBWYWx1ZXMgYXJlIGFyYml0cmFyeSBwcmltZXMgZGVzaWduZWQgdG8gdHJpZ2dlciBlZGdlIGNhc2VzLgorICAgIGNvbnN0ZXhwciBpbnQgY2FwYWNpdHkgPSA4MzsKKyAgICBjb25zdGV4cHIgaW50IHRocmVzaG9sZCA9IDQ3OworICAgIEZpZm9Db250cm9sbGVyICAgZmlmb0NvbnRyb2xsZXIoY2FwYWNpdHksIHRocmVzaG9sZCk7CisgICAgQVNTRVJUX0VRKGNhcGFjaXR5LCBmaWZvQ29udHJvbGxlci5nZXRDYXBhY2l0eSgpKTsKKyAgICBBU1NFUlRfRVEodGhyZXNob2xkLCBmaWZvQ29udHJvbGxlci5nZXRUaHJlc2hvbGQoKSk7CisKKyAgICBBU1NFUlRfRVEoMCwgZmlmb0NvbnRyb2xsZXIuZ2V0UmVhZENvdW50ZXIoKSk7CisgICAgQVNTRVJUX0VRKDAsIGZpZm9Db250cm9sbGVyLmdldFdyaXRlQ291bnRlcigpKTsKKyAgICBBU1NFUlRfRVEoMCwgZmlmb0NvbnRyb2xsZXIuZ2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpKTsKKyAgICBBU1NFUlRfRVEodGhyZXNob2xkLCBmaWZvQ29udHJvbGxlci5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpKTsKKworICAgIC8vIFByZXRlbmQgdG8gd3JpdGUgc29tZSBkYXRhLgorICAgIGNvbnN0ZXhwciBpbnQgYWR2YW5jZTEgPSAyMzsKKyAgICBmaWZvQ29udHJvbGxlci5hZHZhbmNlV3JpdGVJbmRleChhZHZhbmNlMSk7CisgICAgaW50IGFkdmFuY2VkID0gYWR2YW5jZTE7CisgICAgQVNTRVJUX0VRKDAsIGZpZm9Db250cm9sbGVyLmdldFJlYWRDb3VudGVyKCkpOworICAgIEFTU0VSVF9FUSgwLCBmaWZvQ29udHJvbGxlci5nZXRSZWFkSW5kZXgoKSk7CisgICAgQVNTRVJUX0VRKGFkdmFuY2VkLCBmaWZvQ29udHJvbGxlci5nZXRXcml0ZUNvdW50ZXIoKSk7CisgICAgQVNTRVJUX0VRKGFkdmFuY2VkLCBmaWZvQ29udHJvbGxlci5nZXRXcml0ZUluZGV4KCkpOworICAgIEFTU0VSVF9FUShhZHZhbmNlZCwgZmlmb0NvbnRyb2xsZXIuZ2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpKTsKKyAgICBBU1NFUlRfRVEodGhyZXNob2xkIC0gYWR2YW5jZWQsIGZpZm9Db250cm9sbGVyLmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCkpOworCisgICAgLy8gUHJldGVuZCB0byByZWFkIHRoZSBkYXRhLgorICAgIGZpZm9Db250cm9sbGVyLmFkdmFuY2VSZWFkSW5kZXgoYWR2YW5jZTEpOworICAgIEFTU0VSVF9FUShhZHZhbmNlZCwgZmlmb0NvbnRyb2xsZXIuZ2V0UmVhZENvdW50ZXIoKSk7CisgICAgQVNTRVJUX0VRKGFkdmFuY2VkLCBmaWZvQ29udHJvbGxlci5nZXRSZWFkSW5kZXgoKSk7CisgICAgQVNTRVJUX0VRKGFkdmFuY2VkLCBmaWZvQ29udHJvbGxlci5nZXRXcml0ZUNvdW50ZXIoKSk7CisgICAgQVNTRVJUX0VRKGFkdmFuY2VkLCBmaWZvQ29udHJvbGxlci5nZXRXcml0ZUluZGV4KCkpOworICAgIEFTU0VSVF9FUSgwLCBmaWZvQ29udHJvbGxlci5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCkpOworICAgIEFTU0VSVF9FUSh0aHJlc2hvbGQsIGZpZm9Db250cm9sbGVyLmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCkpOworCisgICAgLy8gV3JpdGUgcGFzdCBlbmQgb2YgYnVmZmVyLgorICAgIGNvbnN0ZXhwciBpbnQgYWR2YW5jZTIgPSAxMyArIGNhcGFjaXR5IC0gYWR2YW5jZTE7CisgICAgZmlmb0NvbnRyb2xsZXIuYWR2YW5jZVdyaXRlSW5kZXgoYWR2YW5jZTIpOworICAgIGFkdmFuY2VkICs9IGFkdmFuY2UyOworICAgIEFTU0VSVF9FUShhZHZhbmNlMSwgZmlmb0NvbnRyb2xsZXIuZ2V0UmVhZENvdW50ZXIoKSk7CisgICAgQVNTRVJUX0VRKGFkdmFuY2UxLCBmaWZvQ29udHJvbGxlci5nZXRSZWFkSW5kZXgoKSk7CisgICAgQVNTRVJUX0VRKGFkdmFuY2VkLCBmaWZvQ29udHJvbGxlci5nZXRXcml0ZUNvdW50ZXIoKSk7CisgICAgQVNTRVJUX0VRKGFkdmFuY2VkIC0gY2FwYWNpdHksIGZpZm9Db250cm9sbGVyLmdldFdyaXRlSW5kZXgoKSk7CisgICAgQVNTRVJUX0VRKGFkdmFuY2UyLCBmaWZvQ29udHJvbGxlci5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCkpOworICAgIEFTU0VSVF9FUSh0aHJlc2hvbGQgLSBhZHZhbmNlMiwgZmlmb0NvbnRyb2xsZXIuZ2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKSk7Cit9CisKKy8vIFRPRE8gY29uc2lkZXIgdXNpbmcgYSB0ZW1wbGF0ZSBmb3Igb3RoZXIgZGF0YSB0eXBlcy4KK2NsYXNzIFRlc3RGaWZvQnVmZmVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBUZXN0Rmlmb0J1ZmZlcihmaWZvX2ZyYW1lc190IGNhcGFjaXR5LCBmaWZvX2ZyYW1lc190IHRocmVzaG9sZCA9IDApCisgICAgICAgIDogbUZpZm9CdWZmZXIoc2l6ZW9mKGludDE2X3QpLCBjYXBhY2l0eSkgeworICAgICAgICAvLyBGb3IgcmVhZGluZyBhbmQgd3JpdGluZy4KKyAgICAgICAgbURhdGEgPSBuZXcgaW50MTZfdFtjYXBhY2l0eV07CisgICAgICAgIGlmICh0aHJlc2hvbGQgPD0gMCkgeworICAgICAgICAgICAgdGhyZXNob2xkID0gY2FwYWNpdHk7CisgICAgICAgIH0KKyAgICAgICAgbUZpZm9CdWZmZXIuc2V0VGhyZXNob2xkKHRocmVzaG9sZCk7CisgICAgICAgIG1UaHJlc2hvbGQgPSB0aHJlc2hvbGQ7CisgICAgfQorCisgICAgdm9pZCBjaGVja01pc2MoKSB7CisgICAgICAgIEFTU0VSVF9FUSgoaW50MzJfdCkoMiAqIHNpemVvZihpbnQxNl90KSksIG1GaWZvQnVmZmVyLmNvbnZlcnRGcmFtZXNUb0J5dGVzKDIpKTsKKyAgICAgICAgQVNTRVJUX0VRKG1UaHJlc2hvbGQsIG1GaWZvQnVmZmVyLmdldFRocmVzaG9sZCgpKTsKKyAgICB9CisKKyAgICAvLyBWZXJpZnkgdGhhdCB0aGUgYXZhaWxhYmxlIGZyYW1lcyBpbiBlYWNoIHBhcnQgYWRkIHVwIGNvcnJlY3RseS4KKyAgICB2b2lkIGNoZWNrV3JhcHBpbmdCdWZmZXIoKSB7CisgICAgICAgIFdyYXBwaW5nQnVmZmVyIHdyYXBwaW5nQnVmZmVyOworICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0F2YWlsYWJsZSA9CisgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CisgICAgICAgIGZpZm9fZnJhbWVzX3Qgd3JhcEF2YWlsYWJsZSA9IG1GaWZvQnVmZmVyLmdldEVtcHR5Um9vbUF2YWlsYWJsZSgmd3JhcHBpbmdCdWZmZXIpOworICAgICAgICBFWFBFQ1RfRVEoZnJhbWVzQXZhaWxhYmxlLCB3cmFwQXZhaWxhYmxlKTsKKyAgICAgICAgZmlmb19mcmFtZXNfdCBib3RoQXZhaWxhYmxlID0gd3JhcHBpbmdCdWZmZXIubnVtRnJhbWVzWzBdICsgd3JhcHBpbmdCdWZmZXIubnVtRnJhbWVzWzFdOworICAgICAgICBFWFBFQ1RfRVEoZnJhbWVzQXZhaWxhYmxlLCBib3RoQXZhaWxhYmxlKTsKKworICAgICAgICBmcmFtZXNBdmFpbGFibGUgPQorICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CisgICAgICAgIHdyYXBBdmFpbGFibGUgPSBtRmlmb0J1ZmZlci5nZXRGdWxsRGF0YUF2YWlsYWJsZSgmd3JhcHBpbmdCdWZmZXIpOworICAgICAgICBFWFBFQ1RfRVEoZnJhbWVzQXZhaWxhYmxlLCB3cmFwQXZhaWxhYmxlKTsKKyAgICAgICAgYm90aEF2YWlsYWJsZSA9IHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1swXSArIHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1sxXTsKKyAgICAgICAgRVhQRUNUX0VRKGZyYW1lc0F2YWlsYWJsZSwgYm90aEF2YWlsYWJsZSk7CisgICAgfQorCisgICAgLy8gV3JpdGUgZGF0YSBidXQgZG8gbm90IG92ZXJmbG93LgorICAgIHZvaWQgd3JpdGVEYXRhKGZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzKSB7CisgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0KKyAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNUb1dyaXRlID0gc3RkOjptaW4oZnJhbWVzQXZhaWxhYmxlLCBudW1GcmFtZXMpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lc1RvV3JpdGU7IGkrKykgeworICAgICAgICAgICAgbURhdGFbaV0gPSBtTmV4dFdyaXRlSW5kZXgrKzsKKyAgICAgICAgfQorICAgICAgICBmaWZvX2ZyYW1lc190IGFjdHVhbCA9IG1GaWZvQnVmZmVyLndyaXRlKG1EYXRhLCBmcmFtZXNUb1dyaXRlKTsKKyAgICAgICAgQVNTRVJUX0VRKGZyYW1lc1RvV3JpdGUsIGFjdHVhbCk7CisgICAgfQorCisgICAgLy8gUmVhZCBkYXRhIGJ1dCBkbyBub3QgdW5kZXJmbG93LgorICAgIHZvaWQgdmVyaWZ5RGF0YShmaWZvX2ZyYW1lc190IG51bUZyYW1lcykgeworICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0F2YWlsYWJsZSA9CisgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNUb1JlYWQgPSBzdGQ6Om1pbihmcmFtZXNBdmFpbGFibGUsIG51bUZyYW1lcyk7CisgICAgICAgIGZpZm9fZnJhbWVzX3QgYWN0dWFsID0gbUZpZm9CdWZmZXIucmVhZChtRGF0YSwgZnJhbWVzVG9SZWFkKTsKKyAgICAgICAgQVNTRVJUX0VRKGZyYW1lc1RvUmVhZCwgYWN0dWFsKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZXNUb1JlYWQ7IGkrKykgeworICAgICAgICAgICAgQVNTRVJUX0VRKG1OZXh0VmVyaWZ5SW5kZXgrKywgbURhdGFbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gV3JhcCBhcm91bmQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgorICAgIHZvaWQgY2hlY2tXcmFwcGluZ1dyaXRlUmVhZCgpIHsKKyAgICAgICAgY29uc3RleHByIGludCBmcmFtZXMxID0gNDM7CisgICAgICAgIGNvbnN0ZXhwciBpbnQgZnJhbWVzMiA9IDE1OworCisgICAgICAgIHdyaXRlRGF0YShmcmFtZXMxKTsKKyAgICAgICAgY2hlY2tXcmFwcGluZ0J1ZmZlcigpOworICAgICAgICB2ZXJpZnlEYXRhKGZyYW1lczEpOworICAgICAgICBjaGVja1dyYXBwaW5nQnVmZmVyKCk7CisKKyAgICAgICAgd3JpdGVEYXRhKGZyYW1lczIpOworICAgICAgICBjaGVja1dyYXBwaW5nQnVmZmVyKCk7CisgICAgICAgIHZlcmlmeURhdGEoZnJhbWVzMik7CisgICAgICAgIGNoZWNrV3JhcHBpbmdCdWZmZXIoKTsKKyAgICB9CisKKyAgICAvLyBXcml0ZSBhbmQgUmVhZCBhIHNwZWNpZmljIGFtb3VudCBvZiBkYXRhLgorICAgIHZvaWQgY2hlY2tXcml0ZVJlYWQoKSB7CisgICAgICAgIGNvbnN0IGZpZm9fZnJhbWVzX3QgY2FwYWNpdHkgPSBtRmlmb0J1ZmZlci5nZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKCk7CisgICAgICAgIC8vIFdyYXAgYXJvdW5kIHdpdGggdGhlIHNtYWxsZXIgcmVnaW9uIGluIHRoZSBzZWNvbmQgaGFsZi4KKyAgICAgICAgY29uc3QgaW50IGZyYW1lczEgPSBjYXBhY2l0eSAtIDQ7CisgICAgICAgIGNvbnN0IGludCBmcmFtZXMyID0gNzsgLy8gYXJiaXRyYXJ5LCBzbWFsbAorICAgICAgICB3cml0ZURhdGEoZnJhbWVzMSk7CisgICAgICAgIHZlcmlmeURhdGEoZnJhbWVzMSk7CisgICAgICAgIHdyaXRlRGF0YShmcmFtZXMyKTsKKyAgICAgICAgdmVyaWZ5RGF0YShmcmFtZXMyKTsKKyAgICB9CisKKyAgICAvLyBXcml0ZSBhbmQgUmVhZCBhIHNwZWNpZmljIGFtb3VudCBvZiBkYXRhLgorICAgIHZvaWQgY2hlY2tXcml0ZVJlYWRTbWFsbExhcmdlKCkgeworICAgICAgICBjb25zdCBmaWZvX2ZyYW1lc190IGNhcGFjaXR5ID0gbUZpZm9CdWZmZXIuZ2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcygpOworICAgICAgICAvLyBXcmFwIGFyb3VuZCB3aXRoIHRoZSBsYXJnZXIgcmVnaW9uIGluIHRoZSBzZWNvbmQgaGFsZi4KKyAgICAgICAgY29uc3QgaW50IGZyYW1lczEgPSBjYXBhY2l0eSAtIDQ7CisgICAgICAgIGNvbnN0IGludCBmcmFtZXMyID0gY2FwYWNpdHkgLSA5OyAvLyBhcmJpdHJhcnksIGxhcmdlCisgICAgICAgIHdyaXRlRGF0YShmcmFtZXMxKTsKKyAgICAgICAgdmVyaWZ5RGF0YShmcmFtZXMxKTsKKyAgICAgICAgd3JpdGVEYXRhKGZyYW1lczIpOworICAgICAgICB2ZXJpZnlEYXRhKGZyYW1lczIpOworICAgIH0KKworICAgIC8vIFJhbmRvbWx5IHJlYWQgb3Igd3JpdGUgdXAgdG8gdGhlIG1heGltdW0gYW1vdW50IG9mIGRhdGEuCisgICAgdm9pZCBjaGVja1JhbmRvbVdyaXRlUmVhZCgpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisgICAgICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0VtcHR5ID0KKyAgICAgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CisgICAgICAgICAgICBmaWZvX2ZyYW1lc190IG51bUZyYW1lcyA9IChmaWZvX2ZyYW1lc190KShkcmFuZDQ4KCkgKiBmcmFtZXNFbXB0eSk7CisgICAgICAgICAgICB3cml0ZURhdGEobnVtRnJhbWVzKTsKKworICAgICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNGdWxsID0KKyAgICAgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgIG51bUZyYW1lcyA9IChmaWZvX2ZyYW1lc190KShkcmFuZDQ4KCkgKiBmcmFtZXNGdWxsKTsKKyAgICAgICAgICAgIHZlcmlmeURhdGEobnVtRnJhbWVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEZpZm9CdWZmZXIgICAgIG1GaWZvQnVmZmVyOworICAgIGludDE2X3QgICAgICAgKm1EYXRhOworICAgIGZpZm9fZnJhbWVzX3QgIG1OZXh0V3JpdGVJbmRleCA9IDA7CisgICAgZmlmb19mcmFtZXNfdCAgbU5leHRWZXJpZnlJbmRleCA9IDA7CisgICAgZmlmb19mcmFtZXNfdCAgbVRocmVzaG9sZDsKK307CisKK1RFU1QodGVzdF9maWZvX2J1ZmZlciwgZmlmb19yZWFkX3dyaXRlKSB7CisgICAgY29uc3RleHByIGludCBjYXBhY2l0eSA9IDUxOyAvLyBhcmJpdHJhcnkKKyAgICBUZXN0Rmlmb0J1ZmZlciB0ZXN0ZXIoY2FwYWNpdHkpOworICAgIHRlc3Rlci5jaGVja01pc2MoKTsKKyAgICB0ZXN0ZXIuY2hlY2tXcml0ZVJlYWQoKTsKK30KKworVEVTVCh0ZXN0X2ZpZm9fYnVmZmVyLCBmaWZvX3dyYXBwaW5nX3JlYWRfd3JpdGUpIHsKKyAgICBjb25zdGV4cHIgaW50IGNhcGFjaXR5ID0gNTk7IC8vIGFyYml0cmFyeSwgYSBsaXR0bGUgYmlnZ2VyIHRoaXMgdGltZQorICAgIFRlc3RGaWZvQnVmZmVyIHRlc3RlcihjYXBhY2l0eSk7CisgICAgdGVzdGVyLmNoZWNrV3JhcHBpbmdXcml0ZVJlYWQoKTsKK30KKworVEVTVCh0ZXN0X2ZpZm9fYnVmZmVyLCBmaWZvX3JlYWRfd3JpdGVfc21hbGxfbGFyZ2UpIHsKKyAgICBjb25zdGV4cHIgaW50IGNhcGFjaXR5ID0gNTE7IC8vIGFyYml0cmFyeQorICAgIFRlc3RGaWZvQnVmZmVyIHRlc3RlcihjYXBhY2l0eSk7CisgICAgdGVzdGVyLmNoZWNrV3JpdGVSZWFkU21hbGxMYXJnZSgpOworfQorCitURVNUKHRlc3RfZmlmb19idWZmZXIsIGZpZm9fcmFuZG9tX3JlYWRfd3JpdGUpIHsKKyAgICBjb25zdGV4cHIgaW50IGNhcGFjaXR5ID0gNTE7IC8vIGFyYml0cmFyeQorICAgIFRlc3RGaWZvQnVmZmVyIHRlc3RlcihjYXBhY2l0eSk7CisgICAgdGVzdGVyLmNoZWNrUmFuZG9tV3JpdGVSZWFkKCk7Cit9CisKK1RFU1QodGVzdF9maWZvX2J1ZmZlciwgZmlmb19yYW5kb21fdGhyZXNob2xkKSB7CisgICAgY29uc3RleHByIGludCBjYXBhY2l0eSA9IDY3OyAvLyBhcmJpdHJhcnkKKyAgICBjb25zdGV4cHIgaW50IHRocmVzaG9sZCA9IDM3OyAvLyBhcmJpdHJhcnkKKyAgICBUZXN0Rmlmb0J1ZmZlciB0ZXN0ZXIoY2FwYWNpdHksIHRocmVzaG9sZCk7CisgICAgdGVzdGVyLmNoZWNrUmFuZG9tV3JpdGVSZWFkKCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdHRyaWJ1dGVzLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2F0dHJpYnV0ZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMWFmMjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdHRyaWJ1dGVzLmNwcApAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFRlc3QgQUF1ZGlvIGF0dHJpYnV0ZXMgc3VjaCBhcyBVc2FnZSwgQ29udGVudFR5cGUgYW5kIElucHV0UHJlc2V0LgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCitjb25zdGV4cHIgaW50NjRfdCBrTmFub3NQZXJTZWNvbmQgPSAxMDAwMDAwMDAwOworY29uc3RleHByIGludCBrTnVtRnJhbWVzID0gMjU2OworY29uc3RleHByIGludCBrQ2hhbm5lbENvdW50ID0gMjsKKworY29uc3RleHByIGludDMyX3QgRE9OVF9TRVQgPSAtMTAwMDsKKworc3RhdGljIHZvaWQgY2hlY2tBdHRyaWJ1dGVzKGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3VzYWdlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2NvbnRlbnRfdHlwZV90IGNvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19pbnB1dF9wcmVzZXRfdCBwcmVzZXQgPSBET05UX1NFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uID0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpIHsKKworICAgIGZsb2F0ICpidWZmZXIgPSBuZXcgZmxvYXRba051bUZyYW1lcyAqIGtDaGFubmVsQ291bnRdOworCisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlciAqYWF1ZGlvQnVpbGRlciA9IG51bGxwdHI7CisgICAgQUF1ZGlvU3RyZWFtICphYXVkaW9TdHJlYW0gPSBudWxscHRyOworCisgICAgLy8gVXNlIGFuIEFBdWRpb1N0cmVhbUJ1aWxkZXIgdG8gY29udGFpbiByZXF1ZXN0ZWQgcGFyYW1ldGVycy4KKyAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigmYWF1ZGlvQnVpbGRlcikpOworCisgICAgLy8gUmVxdWVzdCBzdHJlYW0gcHJvcGVydGllcy4KKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFBlcmZvcm1hbmNlTW9kZShhYXVkaW9CdWlsZGVyLCBwZXJmTW9kZSk7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREaXJlY3Rpb24oYWF1ZGlvQnVpbGRlciwgZGlyZWN0aW9uKTsKKworICAgIC8vIFNldCB0aGUgYXR0cmlidXRlIGluIHRoZSBidWlsZGVyLgorICAgIGlmICh1c2FnZSAhPSBET05UX1NFVCkgeworICAgICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFVzYWdlKGFhdWRpb0J1aWxkZXIsIHVzYWdlKTsKKyAgICB9CisgICAgaWYgKGNvbnRlbnRUeXBlICE9IERPTlRfU0VUKSB7CisgICAgICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q29udGVudFR5cGUoYWF1ZGlvQnVpbGRlciwgY29udGVudFR5cGUpOworICAgIH0KKyAgICBpZiAocHJlc2V0ICE9IERPTlRfU0VUKSB7CisgICAgICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0SW5wdXRQcmVzZXQoYWF1ZGlvQnVpbGRlciwgcHJlc2V0KTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgYW4gQUF1ZGlvU3RyZWFtIHVzaW5nIHRoZSBCdWlsZGVyLgorICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbShhYXVkaW9CdWlsZGVyLCAmYWF1ZGlvU3RyZWFtKSk7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9kZWxldGUoYWF1ZGlvQnVpbGRlcik7CisKKyAgICAvLyBNYWtlIHN1cmUgd2UgZ2V0IHRoZSBzYW1lIGF0dHJpYnV0ZXMgYmFjayBmcm9tIHRoZSBzdHJlYW0uCisgICAgYWF1ZGlvX3VzYWdlX3QgZXhwZWN0ZWRVc2FnZSA9CisgICAgICAgICAgICAodXNhZ2UgPT0gRE9OVF9TRVQgfHwgdXNhZ2UgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKQorICAgICAgICAgICAgPyBBQVVESU9fVVNBR0VfTUVESUEgLy8gZGVmYXVsdAorICAgICAgICAgICAgOiB1c2FnZTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRVc2FnZSwgQUF1ZGlvU3RyZWFtX2dldFVzYWdlKGFhdWRpb1N0cmVhbSkpOworCisgICAgYWF1ZGlvX2NvbnRlbnRfdHlwZV90IGV4cGVjdGVkQ29udGVudFR5cGUgPQorICAgICAgICAgICAgKGNvbnRlbnRUeXBlID09IERPTlRfU0VUIHx8IGNvbnRlbnRUeXBlID09IEFBVURJT19VTlNQRUNJRklFRCkKKyAgICAgICAgICAgID8gQUFVRElPX0NPTlRFTlRfVFlQRV9NVVNJQyAvLyBkZWZhdWx0CisgICAgICAgICAgICA6IGNvbnRlbnRUeXBlOworICAgIEVYUEVDVF9FUShleHBlY3RlZENvbnRlbnRUeXBlLCBBQXVkaW9TdHJlYW1fZ2V0Q29udGVudFR5cGUoYWF1ZGlvU3RyZWFtKSk7CisKKyAgICBhYXVkaW9faW5wdXRfcHJlc2V0X3QgZXhwZWN0ZWRQcmVzZXQgPQorICAgICAgICAgICAgKHByZXNldCA9PSBET05UX1NFVCB8fCBwcmVzZXQgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKQorICAgICAgICAgICAgPyBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1JFQ09HTklUSU9OIC8vIGRlZmF1bHQKKyAgICAgICAgICAgIDogcHJlc2V0OworICAgIEVYUEVDVF9FUShleHBlY3RlZFByZXNldCwgQUF1ZGlvU3RyZWFtX2dldElucHV0UHJlc2V0KGFhdWRpb1N0cmVhbSkpOworCisgICAgRVhQRUNUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChhYXVkaW9TdHJlYW0pKTsKKworICAgIGlmIChkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9JTlBVVCkgeworICAgICAgICBFWFBFQ1RfRVEoa051bUZyYW1lcywKKyAgICAgICAgICAgICAgICAgIEFBdWRpb1N0cmVhbV9yZWFkKGFhdWRpb1N0cmVhbSwgYnVmZmVyLCBrTnVtRnJhbWVzLCBrTmFub3NQZXJTZWNvbmQpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBFWFBFQ1RfRVEoa051bUZyYW1lcywKKyAgICAgICAgICAgICAgICAgIEFBdWRpb1N0cmVhbV93cml0ZShhYXVkaW9TdHJlYW0sIGJ1ZmZlciwga051bUZyYW1lcywga05hbm9zUGVyU2Vjb25kKSk7CisgICAgfQorCisgICAgRVhQRUNUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKGFhdWRpb1N0cmVhbSkpOworCisgICAgRVhQRUNUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtX2Nsb3NlKGFhdWRpb1N0cmVhbSkpOworICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKK30KKworc3RhdGljIGNvbnN0IGFhdWRpb191c2FnZV90IHNVc2FnZXNbXSA9IHsKKyAgICBET05UX1NFVCwKKyAgICBBQVVESU9fVU5TUEVDSUZJRUQsCisgICAgQUFVRElPX1VTQUdFX01FRElBLAorICAgIEFBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OLAorICAgIEFBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkcsCisgICAgQUFVRElPX1VTQUdFX0FMQVJNLAorICAgIEFBVURJT19VU0FHRV9OT1RJRklDQVRJT04sCisgICAgQUFVRElPX1VTQUdFX05PVElGSUNBVElPTl9SSU5HVE9ORSwKKyAgICBBQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5ULAorICAgIEFBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFksCisgICAgQUFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSwKKyAgICBBQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04sCisgICAgQUFVRElPX1VTQUdFX0dBTUUsCisgICAgQUFVRElPX1VTQUdFX0FTU0lTVEFOVAorfTsKKworc3RhdGljIGNvbnN0IGFhdWRpb19jb250ZW50X3R5cGVfdCBzQ29udGVudHlwZXNbXSA9IHsKKyAgICBET05UX1NFVCwKKyAgICBBQVVESU9fVU5TUEVDSUZJRUQsCisgICAgQUFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0gsCisgICAgQUFVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywKKyAgICBBQVVESU9fQ09OVEVOVF9UWVBFX01PVklFLAorICAgIEFBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OCit9OworCitzdGF0aWMgY29uc3QgYWF1ZGlvX2lucHV0X3ByZXNldF90IHNJbnB1dFByZXNldHNbXSA9IHsKKyAgICBET05UX1NFVCwKKyAgICBBQVVESU9fVU5TUEVDSUZJRUQsCisgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9HRU5FUklDLAorICAgIEFBVURJT19JTlBVVF9QUkVTRVRfQ0FNQ09SREVSLAorICAgIEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUkVDT0dOSVRJT04sCisgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9DT01NVU5JQ0FUSU9OLAorICAgIEFBVURJT19JTlBVVF9QUkVTRVRfVU5QUk9DRVNTRUQsCit9OworCitzdGF0aWMgdm9pZCBjaGVja0F0dHJpYnV0ZXNVc2FnZShhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHBlcmZNb2RlKSB7CisgICAgZm9yIChhYXVkaW9fdXNhZ2VfdCB1c2FnZSA6IHNVc2FnZXMpIHsKKyAgICAgICAgY2hlY2tBdHRyaWJ1dGVzKHBlcmZNb2RlLCB1c2FnZSwgRE9OVF9TRVQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY2hlY2tBdHRyaWJ1dGVzQ29udGVudFR5cGUoYWF1ZGlvX2lucHV0X3ByZXNldF90IHBlcmZNb2RlKSB7CisgICAgZm9yIChhYXVkaW9fY29udGVudF90eXBlX3QgY29udGVudFR5cGUgOiBzQ29udGVudHlwZXMpIHsKKyAgICAgICAgY2hlY2tBdHRyaWJ1dGVzKHBlcmZNb2RlLCBET05UX1NFVCwgY29udGVudFR5cGUpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY2hlY2tBdHRyaWJ1dGVzSW5wdXRQcmVzZXQoYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSkgeworICAgIGZvciAoYWF1ZGlvX2lucHV0X3ByZXNldF90IGlucHV0UHJlc2V0IDogc0lucHV0UHJlc2V0cykgeworICAgICAgICBjaGVja0F0dHJpYnV0ZXMocGVyZk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBET05UX1NFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERPTlRfU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcmVzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fRElSRUNUSU9OX0lOUFVUKTsKKyAgICB9Cit9CisKK1RFU1QodGVzdF9hdHRyaWJ1dGVzLCBhYXVkaW9fdXNhZ2VfcGVyZm5vbmUpIHsKKyAgICBjaGVja0F0dHJpYnV0ZXNVc2FnZShBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FKTsKK30KKworVEVTVCh0ZXN0X2F0dHJpYnV0ZXMsIGFhdWRpb19jb250ZW50X3R5cGVfcGVyZm5vbmUpIHsKKyAgICBjaGVja0F0dHJpYnV0ZXNDb250ZW50VHlwZShBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FKTsKK30KKworVEVTVCh0ZXN0X2F0dHJpYnV0ZXMsIGFhdWRpb19pbnB1dF9wcmVzZXRfcGVyZm5vbmUpIHsKKyAgICBjaGVja0F0dHJpYnV0ZXNJbnB1dFByZXNldChBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FKTsKK30KKworVEVTVCh0ZXN0X2F0dHJpYnV0ZXMsIGFhdWRpb191c2FnZV9sb3dsYXQpIHsKKyAgICBjaGVja0F0dHJpYnV0ZXNVc2FnZShBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSk7Cit9CisKK1RFU1QodGVzdF9hdHRyaWJ1dGVzLCBhYXVkaW9fY29udGVudF90eXBlX2xvd2xhdCkgeworICAgIGNoZWNrQXR0cmlidXRlc0NvbnRlbnRUeXBlKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZKTsKK30KKworVEVTVCh0ZXN0X2F0dHJpYnV0ZXMsIGFhdWRpb19pbnB1dF9wcmVzZXRfbG93bGF0KSB7CisgICAgY2hlY2tBdHRyaWJ1dGVzSW5wdXRQcmVzZXQoQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYmFkX2Rpc2Nvbm5lY3QuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYmFkX2Rpc2Nvbm5lY3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNTk5MGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9iYWRfZGlzY29ubmVjdC5jcHAKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIEhhbmRsZSBhIERJU0NPTk5FQ1QgYnkgb25seSBvcGVuaW5nIGFuZCBzdGFydGluZyBhIG5ldyBzdHJlYW0KKyAqIHdpdGhvdXQgc3RvcHBpbmcgYW5kIGNsb3NpbmcgdGhlIG9sZCBvbmUuCisgKiBUaGlzIGNhdXNlZCB0aGUgbmV3IHN0cmVhbSB0byB1c2UgdGhlIG9sZCBkaXNjb25uZWN0ZWQgZGV2aWNlLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKworI2RlZmluZSBERUZBVUxUX1RJTUVPVVRfTkFOT1MgICgoaW50NjRfdCkxMDAwMDAwMDAwKQorCitzdGF0aWMgdm9pZCBzX215RXJyb3JDYWxsYmFja1Byb2MoCisgICAgICAgIEFBdWRpb1N0cmVhbSAqc3RyZWFtLAorICAgICAgICB2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IGVycm9yKTsKKworc3RydWN0IEF1ZGlvRW5naW5lIHsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyICpidWlsZGVyID0gbnVsbHB0cjsKKyAgICBBQXVkaW9TdHJlYW0gKnN0cmVhbSA9IG51bGxwdHI7CisgICAgc3RkOjp0aHJlYWQgKnRocmVhZCA9IG51bGxwdHI7CisgICAgaW50NjRfdCBmcmFtZXNSZWFkID0gMDsKK307CisKK0F1ZGlvRW5naW5lIHNfQXVkaW9FbmdpbmU7CisKKy8vIENhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgZmlsbHMgdGhlIGF1ZGlvIG91dHB1dCBidWZmZXIuCitzdGF0aWMgYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3Qgc19teURhdGFDYWxsYmFja1Byb2MoCisgICAgICAgIEFBdWRpb1N0cmVhbSAqc3RyZWFtLAorICAgICAgICB2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgdm9pZCAqYXVkaW9EYXRhLAorICAgICAgICBpbnQzMl90IG51bUZyYW1lcworKSB7CisgICAgKHZvaWQpIHVzZXJEYXRhOworICAgICh2b2lkKSBhdWRpb0RhdGE7CisgICAgKHZvaWQpIG51bUZyYW1lczsKKyAgICBzX0F1ZGlvRW5naW5lLmZyYW1lc1JlYWQgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChzdHJlYW0pOworICAgIHJldHVybiBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX0NPTlRJTlVFOworfQorCitzdGF0aWMgYWF1ZGlvX3Jlc3VsdF90IHNfU3RhcnRBdWRpbygpIHsKKyAgICBpbnQzMl90IGZyYW1lc1BlckJ1cnN0ID0gMDsKKyAgICBpbnQzMl90IGRldmljZUlkID0gMDsKKworICAgIC8vIFVzZSBhbiBBQXVkaW9TdHJlYW1CdWlsZGVyIHRvIGNvbnRhaW4gcmVxdWVzdGVkIHBhcmFtZXRlcnMuCisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCZzX0F1ZGlvRW5naW5lLmJ1aWxkZXIpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIHByaW50ZigiQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIgcmV0dXJuZWQgJXMiLAorICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLy8gUmVxdWVzdCBzdHJlYW0gcHJvcGVydGllcy4KKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEZvcm1hdChzX0F1ZGlvRW5naW5lLmJ1aWxkZXIsIEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFBlcmZvcm1hbmNlTW9kZShzX0F1ZGlvRW5naW5lLmJ1aWxkZXIsIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERhdGFDYWxsYmFjayhzX0F1ZGlvRW5naW5lLmJ1aWxkZXIsIHNfbXlEYXRhQ2FsbGJhY2tQcm9jLCBudWxscHRyKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEVycm9yQ2FsbGJhY2soc19BdWRpb0VuZ2luZS5idWlsZGVyLCBzX215RXJyb3JDYWxsYmFja1Byb2MsIG51bGxwdHIpOworCisgICAgLy8gQ3JlYXRlIGFuIEFBdWRpb1N0cmVhbSB1c2luZyB0aGUgQnVpbGRlci4KKyAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oc19BdWRpb0VuZ2luZS5idWlsZGVyLCAmc19BdWRpb0VuZ2luZS5zdHJlYW0pOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIHByaW50ZigiQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtIHJldHVybmVkICVzIiwKKyAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoc19BdWRpb0VuZ2luZS5zdHJlYW0pOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIHByaW50ZigiQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydCByZXR1cm5lZCAlcyIsCisgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICB9CisKKyAgICAvLyBDaGVjayB0byBzZWUgd2hhdCBraW5kIG9mIHN0cmVhbSB3ZSBhY3R1YWxseSBnb3QuCisgICAgZGV2aWNlSWQgPSBBQXVkaW9TdHJlYW1fZ2V0RGV2aWNlSWQoc19BdWRpb0VuZ2luZS5zdHJlYW0pOworICAgIGZyYW1lc1BlckJ1cnN0ID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1BlckJ1cnN0KHNfQXVkaW9FbmdpbmUuc3RyZWFtKTsKKworICAgIHByaW50ZigiLS0tLS0tLS0gc3RhcnRlZDogZGV2aWNlSWQgPSAlM2QsIGZyYW1lc1BlckJ1cnN0ID0gJTNkXG4iLCBkZXZpY2VJZCwgZnJhbWVzUGVyQnVyc3QpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGFhdWRpb19yZXN1bHRfdCBzX1N0b3BBdWRpbygpIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOworICAgIGlmIChzX0F1ZGlvRW5naW5lLnN0cmVhbSAhPSBudWxscHRyKSB7CisgICAgICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcChzX0F1ZGlvRW5naW5lLnN0cmVhbSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICBwcmludGYoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcCByZXR1cm5lZCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1fY2xvc2Uoc19BdWRpb0VuZ2luZS5zdHJlYW0pOworICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1fY2xvc2UgcmV0dXJuZWQgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgIH0KKyAgICAgICAgc19BdWRpb0VuZ2luZS5zdHJlYW0gPSBudWxscHRyOworICAgICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZShzX0F1ZGlvRW5naW5lLmJ1aWxkZXIpOworICAgICAgICBzX0F1ZGlvRW5naW5lLmJ1aWxkZXIgPSBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBzX1N0YXJ0VGhyZWFkUHJvYygpIHsKKyAgICAvLyBBIGdvb2QgYXBwIHdvdWxkIGNhbGwgc19TdG9wQXVkaW8gaGVyZSEgVGhpcyB0ZXN0IHNpbXVsYXRlcyBhIGJhZCBhcHAuCisgICAgc19TdGFydEF1ZGlvKCk7CisgICAgc19BdWRpb0VuZ2luZS50aHJlYWQgPSBudWxscHRyOworfQorCitzdGF0aWMgdm9pZCBzX215RXJyb3JDYWxsYmFja1Byb2MoCisgICAgICAgIEFBdWRpb1N0cmVhbSAqc3RyZWFtIF9fdW51c2VkLAorICAgICAgICB2b2lkICp1c2VyRGF0YSBfX3VudXNlZCwKKyAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IGVycm9yKSB7CisgICAgaWYgKGVycm9yID09IEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgLy8gSGFuZGxlIHN0cmVhbSByZXN0YXJ0IG9uIGEgc2VwYXJhdGUgdGhyZWFkCisgICAgICAgIGlmIChzX0F1ZGlvRW5naW5lLnRocmVhZCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBzX0F1ZGlvRW5naW5lLnRocmVhZCA9IG5ldyBzdGQ6OnRocmVhZChzX1N0YXJ0VGhyZWFkUHJvYyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgICh2b2lkKSBhcmdjOworICAgICh2b2lkKSBhcmd2OworCisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKKworICAgIC8vIE1ha2UgcHJpbnRmIHByaW50IGltbWVkaWF0ZWx5IHNvIHRoYXQgZGVidWcgaW5mbyBpcyBub3Qgc3R1Y2sKKyAgICAvLyBpbiBhIGJ1ZmZlciBpZiB3ZSBoYW5nIG9yIGNyYXNoLgorICAgIHNldHZidWYoc3Rkb3V0LCBudWxscHRyLCBfSU9OQkYsIChzaXplX3QpIDApOworCisgICAgcHJpbnRmKCJUZXN0IEJhZCBEaXNjb25uZWN0IFYxLjBcbiIpOworICAgIHByaW50ZigiXG49PT09PT09PT09PSBQbGVhc2UgUExVRyBhbmQgVU5QTFVHIGhlYWRwaG9uZXMhID09PT09PT09PT09PT09XG5cbiIpOworICAgIHByaW50ZigiWW91IHNob3VsZCBzZWUgdGhlIGRldmljZUlEIGNoYW5nZSBvbiBlYWNoIHBsdWcgZXZlbnQuXG4iKTsKKyAgICBwcmludGYoIkhlYWRwaG9uZXMgd2lsbCBnZW5lcmFsbHkgZ2V0IGEgbmV3IGRldmljZUlkIGVhY2ggdGltZS5cbiIpOworICAgIHByaW50ZigiU3BlYWtlcnMgd2lsbCBoYXZlIHRoZSBzYW1lIGRldmljZUlkIGVhY2ggdGltZS5cbiIpOworICAgIHByaW50ZigiVGhlIGZyYW1lc1JlYWQgc2hvdWxkIHJlc2V0IG9uIGVhY2ggcGx1ZyBldmVudCB0aGVuIGluY3JlYXNlIG92ZXIgdGltZS5cbiIpOworICAgIHByaW50ZigiXG4iKTsKKworICAgIHJlc3VsdCA9IHNfU3RhcnRBdWRpbygpOworCisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDIwOyBpID4gMDsgaS0tKSB7CisgICAgICAgICAgICBzbGVlcCgxKTsKKyAgICAgICAgICAgIHByaW50ZigicGxheWluZyBzaWxlbmNlICMlZCwgZnJhbWVzUmVhZCA9ICVkXG4iLCBpLCAoaW50KSBzX0F1ZGlvRW5naW5lLmZyYW1lc1JlYWQpOworICAgICAgICB9CisgICAgfQorCisgICAgc19TdG9wQXVkaW8oKTsKKworICAgIHByaW50ZigicmVzdWx0ID0gJWQgPSAlc1xuIiwgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2ludGVyZmVyZW5jZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9pbnRlcmZlcmVuY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYWYyMjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9pbnRlcmZlcmVuY2UuY3BwCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBQbGF5IGEgc2hhcmVkIHN0cmVhbSB0aGF0IG1pZ2h0IHVzZSBNTUFQLgorLy8gVGhlbiBwbGF5IGEgc2Vjb25kIHN0cmVhbSBhdCBhIGRpZmZlcmVudCBzYW1wbGUgcmF0ZS4KKy8vIE1ha2Ugc3VyZSB0aGUgZmlyc3Qgc3RyZWFtIGlzIHN0aWxsIHJ1bm5pbmcuCisvLyBTZWU6IGIvNzMzNjkxMTIgfCBBQXVkaW8gZGlzY29ubmVjdHMgc2hhcmVkIHN0cmVhbSBpZiBzZWNvbmQgTU1BUCBvcGVuIGZhaWxzCisKKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgorI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKy8vIENhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgZmlsbHMgdGhlIGF1ZGlvIG91dHB1dCBidWZmZXIuCithYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBNeURhdGFDYWxsYmFja1Byb2MoCisgICAgICAgIEFBdWRpb1N0cmVhbSAqc3RyZWFtLAorICAgICAgICB2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgdm9pZCAqYXVkaW9EYXRhLAorICAgICAgICBpbnQzMl90IG51bUZyYW1lcykgeworICAgICh2b2lkKSB1c2VyRGF0YTsKKyAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KHN0cmVhbSkgKiBudW1GcmFtZXM7CisgICAgYWF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFBdWRpb1N0cmVhbV9nZXRGb3JtYXQoc3RyZWFtKTsKKyAgICBpZiAoZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgeworICAgICAgICBtZW1zZXQoYXVkaW9EYXRhLCAwLCBudW1TYW1wbGVzICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICBtZW1zZXQoYXVkaW9EYXRhLCAwLCBudW1TYW1wbGVzICogc2l6ZW9mKGZsb2F0KSk7CisgICAgfQorICAgIHJldHVybiBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX0NPTlRJTlVFOworfQorCisvL3ZvaWQgZm9vKCkgeyAvLyBmb3IgdHJpY2tpbmcgdGhlIEFuZHJvaWQgU3R1ZGlvIGZvcm1hdHRlcgorVEVTVCh0ZXN0X2ludGVyZmVyZW5jZSwgYWF1ZGlvX21tYXBfaW50ZXJmZXJlbmNlKSB7CisKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyICphYXVkaW9CdWlsZGVyID0gbnVsbHB0cjsKKyAgICBBQXVkaW9TdHJlYW0gKmFhdWRpb1N0cmVhbTEgPSBudWxscHRyOworICAgIEFBdWRpb1N0cmVhbSAqYWF1ZGlvU3RyZWFtMiA9IG51bGxwdHI7CisKKyAgICAvLyBVc2UgYW4gQUF1ZGlvU3RyZWFtQnVpbGRlciB0byBjb250YWluIHJlcXVlc3RlZCBwYXJhbWV0ZXJzLgorICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCZhYXVkaW9CdWlsZGVyKSk7CisKKyAgICAvLyBSZXF1ZXN0IHN0cmVhbSBwcm9wZXJ0aWVzLgorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2FtcGxlUmF0ZShhYXVkaW9CdWlsZGVyLCA0ODAwMCk7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREYXRhQ2FsbGJhY2soYWF1ZGlvQnVpbGRlciwgTXlEYXRhQ2FsbGJhY2tQcm9jLCBudWxscHRyKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFBlcmZvcm1hbmNlTW9kZShhYXVkaW9CdWlsZGVyLCBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSk7CisKKyAgICAvLyBDcmVhdGUgYW4gQUF1ZGlvU3RyZWFtIHVzaW5nIHRoZSBCdWlsZGVyLgorICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbShhYXVkaW9CdWlsZGVyLCAmYWF1ZGlvU3RyZWFtMSkpOworICAgIC8vIFN0YXJ0IGl0IHJ1bm5pbmcuCisgICAgQVNTRVJUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChhYXVkaW9TdHJlYW0xKSk7CisKKyAgICAvLyBWZXJpZnkgdGhhdCB0aGUgc3RyZWFtIGlzIHJ1bm5pbmcuCisgICAgc2xlZXAoMSk7CisgICAgRVhQRUNUX0xUKDAsIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKGFhdWRpb1N0cmVhbTEpKTsKKyAgICBBU1NFUlRfRVEoQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVELCBBQXVkaW9TdHJlYW1fZ2V0U3RhdGUoYWF1ZGlvU3RyZWFtMSkpOworCisgICAgLy8gTm93IHRyeSB0byBvcGVuIGEgc2Vjb25kIHN0cmVhbSB3aXRoIGEgZGlmZmVyZW50IHJhdGUuCisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVSYXRlKGFhdWRpb0J1aWxkZXIsIDQ0MTAwKTsKKyAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oYWF1ZGlvQnVpbGRlciwgJmFhdWRpb1N0cmVhbTIpKTsKKyAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KGFhdWRpb1N0cmVhbTIpKTsKKworICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBzZWNvbmQgc3RyZWFtIGlzIHJ1bm5pbmcuCisgICAgc2xlZXAoMSk7CisgICAgRVhQRUNUX0xUKDAsIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKGFhdWRpb1N0cmVhbTIpKTsKKworICAgIEVYUEVDVF9FUShBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQsIEFBdWRpb1N0cmVhbV9nZXRTdGF0ZShhYXVkaW9TdHJlYW0yKSk7CisKKyAgICAvLyBOb3cgdmVyaWZ5IHRoYXQgdGhlIGZpcnN0IHN0cmVhbSBpcyBzdGlsbCBydW5uaW5nLgorICAgIEVYUEVDVF9FUShBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQsIEFBdWRpb1N0cmVhbV9nZXRTdGF0ZShhYXVkaW9TdHJlYW0xKSk7CisKKyAgICBpbnQzMl90IGZyYW1lc1JlYWQxXzEgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChhYXVkaW9TdHJlYW0xKTsKKyAgICBFWFBFQ1RfTFQoMCwgZnJhbWVzUmVhZDFfMSk7CisgICAgc2xlZXAoMSk7CisgICAgaW50MzJfdCBmcmFtZXNSZWFkMV8yID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoYWF1ZGlvU3RyZWFtMSk7CisgICAgRVhQRUNUX0xUKDAsIGZyYW1lc1JlYWQxXzIpOworICAgIEVYUEVDVF9MVChmcmFtZXNSZWFkMV8xLCBmcmFtZXNSZWFkMV8yKTsgLy8gYWR2YW5jaW5nPworCisgICAgQUF1ZGlvU3RyZWFtX2Nsb3NlKGFhdWRpb1N0cmVhbTIpOworICAgIEFBdWRpb1N0cmVhbV9jbG9zZShhYXVkaW9TdHJlYW0xKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZShhYXVkaW9CdWlsZGVyKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2xpbmVhcl9yYW1wLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2xpbmVhcl9yYW1wLmNwcAppbmRleCA1YzUzOTgyLi45MzIyNmJhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9saW5lYXJfcmFtcC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfbGluZWFyX3JhbXAuY3BwCkBAIC0xNSwxMyArMTUsMTMgQEAKICAqLwogCiAjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWF0aC5oPgogCiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KIAogI2luY2x1ZGUgInV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgiCiAjaW5jbHVkZSAidXRpbGl0eS9MaW5lYXJSYW1wLmgiCiAKLQogVEVTVCh0ZXN0X2xpbmVhcl9yYW1wLCBsaW5lYXJfcmFtcF9zZWdtZW50cykgewogICAgIExpbmVhclJhbXAgcmFtcDsKICAgICBjb25zdCBmbG9hdCBzb3VyY2VbNF0gPSB7MS4wZiwgMS4wZiwgMS4wZiwgMS4wZiB9OwpAQCAtMzIsNDAgKzMyLDQwIEBACiAgICAgcmFtcC5zZXRMZW5ndGhJbkZyYW1lcyg4KTsKICAgICByYW1wLnNldFRhcmdldCg4LjBmKTsKIAotICAgIEFTU0VSVF9FUSg4LCByYW1wLmdldExlbmd0aEluRnJhbWVzKCkpOworICAgIEVYUEVDVF9FUSg4LCByYW1wLmdldExlbmd0aEluRnJhbWVzKCkpOwogCiAgICAgYm9vbCByYW1waW5nID0gcmFtcC5uZXh0U2VnbWVudCg0LCAmbGV2ZWxGcm9tLCAmbGV2ZWxUbyk7Ci0gICAgQVNTRVJUX0VRKDEsIHJhbXBpbmcpOwotICAgIEFTU0VSVF9FUSgwLjBmLCBsZXZlbEZyb20pOwotICAgIEFTU0VSVF9FUSg0LjBmLCBsZXZlbFRvKTsKKyAgICBFWFBFQ1RfRVEoMSwgcmFtcGluZyk7CisgICAgRVhQRUNUX0VRKDAuMGYsIGxldmVsRnJvbSk7CisgICAgRVhQRUNUX0VRKDQuMGYsIGxldmVsVG8pOwogCiAgICAgQUF1ZGlvX2xpbmVhclJhbXAoc291cmNlLCBkZXN0aW5hdGlvbiwgNCwgMSwgbGV2ZWxGcm9tLCBsZXZlbFRvKTsKLSAgICBBU1NFUlRfRVEoMC4wZiwgZGVzdGluYXRpb25bMF0pOwotICAgIEFTU0VSVF9FUSgxLjBmLCBkZXN0aW5hdGlvblsxXSk7Ci0gICAgQVNTRVJUX0VRKDIuMGYsIGRlc3RpbmF0aW9uWzJdKTsKLSAgICBBU1NFUlRfRVEoMy4wZiwgZGVzdGluYXRpb25bM10pOworICAgIEVYUEVDVF9FUSgwLjBmLCBkZXN0aW5hdGlvblswXSk7CisgICAgRVhQRUNUX0VRKDEuMGYsIGRlc3RpbmF0aW9uWzFdKTsKKyAgICBFWFBFQ1RfRVEoMi4wZiwgZGVzdGluYXRpb25bMl0pOworICAgIEVYUEVDVF9FUSgzLjBmLCBkZXN0aW5hdGlvblszXSk7CiAKICAgICByYW1waW5nID0gcmFtcC5uZXh0U2VnbWVudCg0LCAmbGV2ZWxGcm9tLCAmbGV2ZWxUbyk7Ci0gICAgQVNTRVJUX0VRKDEsIHJhbXBpbmcpOwotICAgIEFTU0VSVF9FUSg0LjBmLCBsZXZlbEZyb20pOwotICAgIEFTU0VSVF9FUSg4LjBmLCBsZXZlbFRvKTsKKyAgICBFWFBFQ1RfRVEoMSwgcmFtcGluZyk7CisgICAgRVhQRUNUX0VRKDQuMGYsIGxldmVsRnJvbSk7CisgICAgRVhQRUNUX0VRKDguMGYsIGxldmVsVG8pOwogCiAgICAgQUF1ZGlvX2xpbmVhclJhbXAoc291cmNlLCBkZXN0aW5hdGlvbiwgNCwgMSwgbGV2ZWxGcm9tLCBsZXZlbFRvKTsKLSAgICBBU1NFUlRfRVEoNC4wZiwgZGVzdGluYXRpb25bMF0pOwotICAgIEFTU0VSVF9FUSg1LjBmLCBkZXN0aW5hdGlvblsxXSk7Ci0gICAgQVNTRVJUX0VRKDYuMGYsIGRlc3RpbmF0aW9uWzJdKTsKLSAgICBBU1NFUlRfRVEoNy4wZiwgZGVzdGluYXRpb25bM10pOworICAgIEVYUEVDVF9FUSg0LjBmLCBkZXN0aW5hdGlvblswXSk7CisgICAgRVhQRUNUX0VRKDUuMGYsIGRlc3RpbmF0aW9uWzFdKTsKKyAgICBFWFBFQ1RfRVEoNi4wZiwgZGVzdGluYXRpb25bMl0pOworICAgIEVYUEVDVF9FUSg3LjBmLCBkZXN0aW5hdGlvblszXSk7CiAKICAgICByYW1waW5nID0gcmFtcC5uZXh0U2VnbWVudCg0LCAmbGV2ZWxGcm9tLCAmbGV2ZWxUbyk7Ci0gICAgQVNTRVJUX0VRKDAsIHJhbXBpbmcpOwotICAgIEFTU0VSVF9FUSg4LjBmLCBsZXZlbEZyb20pOwotICAgIEFTU0VSVF9FUSg4LjBmLCBsZXZlbFRvKTsKKyAgICBFWFBFQ1RfRVEoMCwgcmFtcGluZyk7CisgICAgRVhQRUNUX0VRKDguMGYsIGxldmVsRnJvbSk7CisgICAgRVhQRUNUX0VRKDguMGYsIGxldmVsVG8pOwogCiAgICAgQUF1ZGlvX2xpbmVhclJhbXAoc291cmNlLCBkZXN0aW5hdGlvbiwgNCwgMSwgbGV2ZWxGcm9tLCBsZXZlbFRvKTsKLSAgICBBU1NFUlRfRVEoOC4wZiwgZGVzdGluYXRpb25bMF0pOwotICAgIEFTU0VSVF9FUSg4LjBmLCBkZXN0aW5hdGlvblsxXSk7Ci0gICAgQVNTRVJUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzJdKTsKLSAgICBBU1NFUlRfRVEoOC4wZiwgZGVzdGluYXRpb25bM10pOworICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblswXSk7CisgICAgRVhQRUNUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzFdKTsKKyAgICBFWFBFQ1RfRVEoOC4wZiwgZGVzdGluYXRpb25bMl0pOworICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblszXSk7CiAKIH07CiAKQEAgLTgwLDI5ICs4MCwxMDEgQEAKICAgICByYW1wLnNldExlbmd0aEluRnJhbWVzKDQpOwogICAgIHJhbXAuc2V0VGFyZ2V0KDguMGYpOwogICAgIHJhbXAuZm9yY2VDdXJyZW50KDQuMGYpOwotICAgIEFTU0VSVF9FUSg0LjBmLCByYW1wLmdldEN1cnJlbnQoKSk7CisgICAgRVhQRUNUX0VRKDQuMGYsIHJhbXAuZ2V0Q3VycmVudCgpKTsKIAogICAgIGJvb2wgcmFtcGluZyA9IHJhbXAubmV4dFNlZ21lbnQoNCwgJmxldmVsRnJvbSwgJmxldmVsVG8pOwotICAgIEFTU0VSVF9FUSgxLCByYW1waW5nKTsKLSAgICBBU1NFUlRfRVEoNC4wZiwgbGV2ZWxGcm9tKTsKLSAgICBBU1NFUlRfRVEoOC4wZiwgbGV2ZWxUbyk7CisgICAgRVhQRUNUX0VRKDEsIHJhbXBpbmcpOworICAgIEVYUEVDVF9FUSg0LjBmLCBsZXZlbEZyb20pOworICAgIEVYUEVDVF9FUSg4LjBmLCBsZXZlbFRvKTsKIAogICAgIEFBdWRpb19saW5lYXJSYW1wKHNvdXJjZSwgZGVzdGluYXRpb24sIDQsIDEsIGxldmVsRnJvbSwgbGV2ZWxUbyk7Ci0gICAgQVNTRVJUX0VRKDQuMGYsIGRlc3RpbmF0aW9uWzBdKTsKLSAgICBBU1NFUlRfRVEoNS4wZiwgZGVzdGluYXRpb25bMV0pOwotICAgIEFTU0VSVF9FUSg2LjBmLCBkZXN0aW5hdGlvblsyXSk7Ci0gICAgQVNTRVJUX0VRKDcuMGYsIGRlc3RpbmF0aW9uWzNdKTsKKyAgICBFWFBFQ1RfRVEoNC4wZiwgZGVzdGluYXRpb25bMF0pOworICAgIEVYUEVDVF9FUSg1LjBmLCBkZXN0aW5hdGlvblsxXSk7CisgICAgRVhQRUNUX0VRKDYuMGYsIGRlc3RpbmF0aW9uWzJdKTsKKyAgICBFWFBFQ1RfRVEoNy4wZiwgZGVzdGluYXRpb25bM10pOwogCiAgICAgcmFtcGluZyA9IHJhbXAubmV4dFNlZ21lbnQoNCwgJmxldmVsRnJvbSwgJmxldmVsVG8pOwotICAgIEFTU0VSVF9FUSgwLCByYW1waW5nKTsKLSAgICBBU1NFUlRfRVEoOC4wZiwgbGV2ZWxGcm9tKTsKLSAgICBBU1NFUlRfRVEoOC4wZiwgbGV2ZWxUbyk7CisgICAgRVhQRUNUX0VRKDAsIHJhbXBpbmcpOworICAgIEVYUEVDVF9FUSg4LjBmLCBsZXZlbEZyb20pOworICAgIEVYUEVDVF9FUSg4LjBmLCBsZXZlbFRvKTsKIAogICAgIEFBdWRpb19saW5lYXJSYW1wKHNvdXJjZSwgZGVzdGluYXRpb24sIDQsIDEsIGxldmVsRnJvbSwgbGV2ZWxUbyk7Ci0gICAgQVNTRVJUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzBdKTsKLSAgICBBU1NFUlRfRVEoOC4wZiwgZGVzdGluYXRpb25bMV0pOwotICAgIEFTU0VSVF9FUSg4LjBmLCBkZXN0aW5hdGlvblsyXSk7Ci0gICAgQVNTRVJUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzNdKTsKKyAgICBFWFBFQ1RfRVEoOC4wZiwgZGVzdGluYXRpb25bMF0pOworICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblsxXSk7CisgICAgRVhQRUNUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzJdKTsKKyAgICBFWFBFQ1RfRVEoOC4wZiwgZGVzdGluYXRpb25bM10pOwogCiB9OwogCitjb25zdGV4cHIgaW50MTZfdCBrTWF4STE2ID0gSU5UMTZfTUFYOworY29uc3RleHByIGludDE2X3Qga01pbkkxNiA9IElOVDE2X01JTjsKK2NvbnN0ZXhwciBpbnQxNl90IGtIYWxmSTE2ID0gMTYzODQ7Citjb25zdGV4cHIgaW50MTZfdCBrVGVudGhJMTYgPSAzMjc3OworCisvL3ZvaWQgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoY29uc3QgZmxvYXQgKnNvdXJjZSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKTsKK1RFU1QodGVzdF9saW5lYXJfcmFtcCwgZmxvYXRfdG9faTE2KSB7CisgICAgY29uc3QgZmxvYXQgc291cmNlW10gPSB7MTIzNDUuNmYsIDEuMGYsIDAuNWYsIDAuMWYsIDAuMGYsIC0wLjFmLCAtMC41ZiwgLTEuMGYsIC0xMjM0NS42Zn07CisgICAgY29uc3RleHByIHNpemVfdCBjb3VudCA9IHNpemVvZihzb3VyY2UpIC8gc2l6ZW9mKHNvdXJjZVswXSk7CisgICAgaW50MTZfdCBkZXN0aW5hdGlvbltjb3VudF07CisgICAgY29uc3QgaW50MTZfdCBleHBlY3RlZFtjb3VudF0gPSB7a01heEkxNiwga01heEkxNiwga0hhbGZJMTYsIGtUZW50aEkxNiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAta1RlbnRoSTE2LCAta0hhbGZJMTYsIGtNaW5JMTYsIGtNaW5JMTZ9OworCisgICAgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoc291cmNlLCBkZXN0aW5hdGlvbiwgY291bnQsIDEuMGYpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbaV0sIGRlc3RpbmF0aW9uW2ldKTsKKyAgICB9CisKK30KKworLy92b2lkIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KGNvbnN0IGludDE2X3QgKnNvdXJjZSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSk7CitURVNUKHRlc3RfbGluZWFyX3JhbXAsIGkxNl90b19mbG9hdCkgeworICAgIGNvbnN0IGludDE2X3Qgc291cmNlW10gPSB7a01heEkxNiwga0hhbGZJMTYsIGtUZW50aEkxNiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1rVGVudGhJMTYsIC1rSGFsZkkxNiwga01pbkkxNn07CisgICAgY29uc3RleHByIHNpemVfdCBjb3VudCA9IHNpemVvZihzb3VyY2UpIC8gc2l6ZW9mKHNvdXJjZVswXSk7CisgICAgZmxvYXQgZGVzdGluYXRpb25bY291bnRdOworICAgIGNvbnN0IGZsb2F0IGV4cGVjdGVkW2NvdW50XSA9IHsoMzI3NjcuMGYgLyAzMjc2OC4wZiksIDAuNWYsIDAuMWYsIDAuMGYsIC0wLjFmLCAtMC41ZiwgLTEuMGZ9OworCisgICAgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoc291cmNlLCBkZXN0aW5hdGlvbiwgY291bnQsIDEuMGYpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBFWFBFQ1RfTkVBUihleHBlY3RlZFtpXSwgZGVzdGluYXRpb25baV0sIDAuMDAwMWYpOworICAgIH0KKworfQorCisvL3ZvaWQgQUF1ZGlvX2xpbmVhclJhbXAoY29uc3QgaW50MTZfdCAqc291cmNlLAorLy8gICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAorLy8gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAorLy8gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAorLy8gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCisvLyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMik7CitURVNUKHRlc3RfbGluZWFyX3JhbXAsIHJhbXBfaTE2X3RvX2kxNikgeworICAgIGNvbnN0IGludDE2X3Qgc291cmNlW10gPSB7MSwgMSwgMSwgMSwgMSwgMSwgMSwgMX07CisgICAgY29uc3RleHByIHNpemVfdCBjb3VudCA9IHNpemVvZihzb3VyY2UpIC8gc2l6ZW9mKHNvdXJjZVswXSk7CisgICAgaW50MTZfdCBkZXN0aW5hdGlvbltjb3VudF07CisgICAgLy8gUmFtcCB3aWxsIHN3ZWVwIGZyb20gLTEgdG8gYWxtb3N0ICsxCisgICAgY29uc3QgaW50MTZfdCBleHBlY3RlZFtjb3VudF0gPSB7CisgICAgICAgICAgICAtMSwgLy8gZnJvbSAtMS4wMAorICAgICAgICAgICAgLTEsIC8vIGZyb20gLTAuNzUKKyAgICAgICAgICAgIC0xLCAvLyBmcm9tIC0wLjU1LCByb3VuZCBhd2F5IGZyb20gemVybworICAgICAgICAgICAgMCwgIC8vIGZyb20gLTAuMjUsIHJvdW5kIHVwIHRvIHplcm8KKyAgICAgICAgICAgIDAsICAvLyBmcm9tICAwLjAwCisgICAgICAgICAgICAwLCAgLy8gZnJvbSAgMC4yNSwgcm91bmQgZG93biB0byB6ZXJvCisgICAgICAgICAgICAxLCAgLy8gZnJvbSAgMC41MCwgcm91bmQgYXdheSBmcm9tIHplcm8KKyAgICAgICAgICAgIDEgICAvLyBmcm9tICAwLjc1CisgICAgfTsKKworICAgIC8vIHN3ZWVwIGFjcm9zcyB6ZXJvIHRvIHRlc3Qgc3ltbWV0cnkKKyAgICBjb25zdGV4cHIgZmxvYXQgYW1wbGl0dWRlMSA9IC0xLjA7CisgICAgY29uc3RleHByIGZsb2F0IGFtcGxpdHVkZTIgPSAxLjA7CisgICAgQUF1ZGlvX2xpbmVhclJhbXAoc291cmNlLCBkZXN0aW5hdGlvbiwgY291bnQsIDEsIGFtcGxpdHVkZTEsIGFtcGxpdHVkZTIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbaV0sIGRlc3RpbmF0aW9uW2ldKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X25fc3RyZWFtcy5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9uX3N0cmVhbXMuY3BwCmluZGV4IDI3MWQwMjQuLmUyZDRhODIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X25fc3RyZWFtcy5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3Rfbl9zdHJlYW1zLmNwcApAQCAtNzEsNyArNzEsNiBAQAogCiAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9kZWxldGUoYWF1ZGlvQnVpbGRlcik7CiAKLWZpbmlzaDoKICAgICByZXR1cm4gcmVzdWx0OwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9vcGVuX3BhcmFtcy5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9vcGVuX3BhcmFtcy5jcHAKaW5kZXggMDFiODc5OS4uMzQ1MTI0MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3Rfb3Blbl9wYXJhbXMuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X29wZW5fcGFyYW1zLmNwcApAQCAtMjUsMjEgKzI1LDYgQEAKIAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAKLXN0YXRpYyBjb25zdCBjaGFyICpnZXRTaGFyaW5nTW9kZVRleHQoYWF1ZGlvX3NoYXJpbmdfbW9kZV90IG1vZGUpIHsKLSAgICBjb25zdCBjaGFyICptb2RlVGV4dCA9ICJ1bmtub3duIjsKLSAgICBzd2l0Y2ggKG1vZGUpIHsKLSAgICBjYXNlIEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFOgotICAgICAgICBtb2RlVGV4dCA9ICJFWENMVVNJVkUiOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOgotICAgICAgICBtb2RlVGV4dCA9ICJTSEFSRUQiOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIG1vZGVUZXh0OwotfQotCiAvLyBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGZpbGxzIHRoZSBhdWRpbyBvdXRwdXQgYnVmZmVyLgogYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgTXlEYXRhQ2FsbGJhY2tQcm9jKAogICAgICAgICBBQXVkaW9TdHJlYW0gKnN0cmVhbSwKQEAgLTY3LDcgKzUyLDYgQEAKICAgICBpbnQzMl90IGFjdHVhbENoYW5uZWxDb3VudCA9IDA7CiAgICAgaW50MzJfdCBhY3R1YWxTYW1wbGVSYXRlID0gMDsKICAgICBhYXVkaW9fZm9ybWF0X3QgYWN0dWFsRGF0YUZvcm1hdCA9IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ7Ci0gICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IGFjdHVhbFNoYXJpbmdNb2RlID0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQ7CiAgICAgYWF1ZGlvX2RpcmVjdGlvbl90IGFjdHVhbERpcmVjdGlvbjsKIAogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXIgKmFhdWRpb0J1aWxkZXIgPSBudWxscHRyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfcmVjb3ZlcnkuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfcmVjb3ZlcnkuY3BwCmluZGV4IDcyNjhhMzAuLjZlODlmODMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3JlY292ZXJ5LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9yZWNvdmVyeS5jcHAKQEAgLTIzLDI0ICsyMyw5IEBACiAKICNkZWZpbmUgREVGQVVMVF9USU1FT1VUX05BTk9TICAoKGludDY0X3QpMTAwMDAwMDAwMCkKIAotc3RhdGljIGNvbnN0IGNoYXIgKmdldFNoYXJpbmdNb2RlVGV4dChhYXVkaW9fc2hhcmluZ19tb2RlX3QgbW9kZSkgewotICAgIGNvbnN0IGNoYXIgKm1vZGVUZXh0ID0gInVua25vd24iOwotICAgIHN3aXRjaCAobW9kZSkgewotICAgICAgICBjYXNlIEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFOgotICAgICAgICAgICAgbW9kZVRleHQgPSAiRVhDTFVTSVZFIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOgotICAgICAgICAgICAgbW9kZVRleHQgPSAiU0hBUkVEIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBtb2RlVGV4dDsKLX0KLQogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CiAgICAgKHZvaWQpIGFyZ2M7Ci0gICAgKHZvaWQgKilhcmd2OworICAgICh2b2lkKSBhcmd2OwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKIApAQCAtNTIsNyArMzcsNiBAQAogICAgIGludDMyX3QgYWN0dWFsQ2hhbm5lbENvdW50ID0gMDsKICAgICBpbnQzMl90IGFjdHVhbFNhbXBsZVJhdGUgPSAwOwogICAgIGFhdWRpb19mb3JtYXRfdCBhY3R1YWxEYXRhRm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7Ci0gICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IGFjdHVhbFNoYXJpbmdNb2RlID0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQ7CiAKICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyICphYXVkaW9CdWlsZGVyID0gbnVsbHB0cjsKICAgICBBQXVkaW9TdHJlYW0gKmFhdWRpb1N0cmVhbSA9IG51bGxwdHI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9zZXNzaW9uX2lkLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3Nlc3Npb25faWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmN2Q0ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9zZXNzaW9uX2lkLmNwcApAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFRlc3QgQUF1ZGlvIFNlc3Npb25JZCwgd2hpY2ggaXMgdXNlZCB0byBhc3NvY2lhdGUgRWZmZWN0cyB3aXRoIGEgc3RyZWFtCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK2NvbnN0ZXhwciBpbnQ2NF90IGtOYW5vc1BlclNlY29uZCA9IDEwMDAwMDAwMDA7Citjb25zdGV4cHIgaW50IGtOdW1GcmFtZXMgPSAyNTY7Citjb25zdGV4cHIgaW50IGtDaGFubmVsQ291bnQgPSAyOworCisvLyBUZXN0IEFBVURJT19TRVNTSU9OX0lEX05PTkUgZGVmYXVsdAorc3RhdGljIHZvaWQgY2hlY2tTZXNzaW9uSWROb25lKGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUpIHsKKworICAgIGZsb2F0ICpidWZmZXIgPSBuZXcgZmxvYXRba051bUZyYW1lcyAqIGtDaGFubmVsQ291bnRdOworCisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlciAqYWF1ZGlvQnVpbGRlciA9IG51bGxwdHI7CisKKyAgICBBQXVkaW9TdHJlYW0gKmFhdWRpb1N0cmVhbTEgPSBudWxscHRyOworICAgIGludDMyX3QgICAgICAgc2Vzc2lvbklkMSA9IDA7CisKKyAgICAvLyBVc2UgYW4gQUF1ZGlvU3RyZWFtQnVpbGRlciB0byBjb250YWluIHJlcXVlc3RlZCBwYXJhbWV0ZXJzLgorICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCZhYXVkaW9CdWlsZGVyKSk7CisKKyAgICAvLyBSZXF1ZXN0IHN0cmVhbSBwcm9wZXJ0aWVzLgorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0UGVyZm9ybWFuY2VNb2RlKGFhdWRpb0J1aWxkZXIsIHBlcmZNb2RlKTsKKworICAgIC8vIENyZWF0ZSBhbiBBQXVkaW9TdHJlYW0gdXNpbmcgdGhlIEJ1aWxkZXIuCisgICAgQVNTRVJUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKGFhdWRpb0J1aWxkZXIsICZhYXVkaW9TdHJlYW0xKSk7CisKKyAgICAvLyBTaW5jZSB3ZSBkaWQgbm90IHJlcXVlc3Qgb3Igc3BlY2lmeSBhIFNlc3Npb25JRCwgd2Ugc2hvdWxkIGdldCBOT05FCisgICAgc2Vzc2lvbklkMSA9IEFBdWRpb1N0cmVhbV9nZXRTZXNzaW9uSWQoYWF1ZGlvU3RyZWFtMSk7CisgICAgQVNTRVJUX0VRKEFBVURJT19TRVNTSU9OX0lEX05PTkUsIHNlc3Npb25JZDEpOworCisgICAgQVNTRVJUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChhYXVkaW9TdHJlYW0xKSk7CisKKyAgICBBU1NFUlRfRVEoa051bUZyYW1lcywgQUF1ZGlvU3RyZWFtX3dyaXRlKGFhdWRpb1N0cmVhbTEsIGJ1ZmZlciwga051bUZyYW1lcywga05hbm9zUGVyU2Vjb25kKSk7CisKKyAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoYWF1ZGlvU3RyZWFtMSkpOworCisgICAgRVhQRUNUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtX2Nsb3NlKGFhdWRpb1N0cmVhbTEpKTsKKyAgICBkZWxldGVbXSBidWZmZXI7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9kZWxldGUoYWF1ZGlvQnVpbGRlcik7Cit9CisKK1RFU1QodGVzdF9zZXNzaW9uX2lkLCBhYXVkaW9fc2Vzc2lvbl9pZF9ub25lX3BlcmZub25lKSB7CisgICAgY2hlY2tTZXNzaW9uSWROb25lKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUpOworfQorCitURVNUKHRlc3Rfc2Vzc2lvbl9pZCwgYWF1ZGlvX3Nlc3Npb25faWRfbm9uZV9sb3dsYXQpIHsKKyAgICBjaGVja1Nlc3Npb25JZE5vbmUoQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kpOworfQorCisvLyBUZXN0IEFBVURJT19TRVNTSU9OX0lEX0FMTE9DQVRFCitzdGF0aWMgdm9pZCBjaGVja1Nlc3Npb25JZEFsbG9jYXRlKGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIHsKKworICAgIGZsb2F0ICpidWZmZXIgPSBuZXcgZmxvYXRba051bUZyYW1lcyAqIGtDaGFubmVsQ291bnRdOworCisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlciAqYWF1ZGlvQnVpbGRlciA9IG51bGxwdHI7CisKKyAgICBBQXVkaW9TdHJlYW0gKmFhdWRpb1N0cmVhbTEgPSBudWxscHRyOworICAgIGludDMyX3QgICAgICAgc2Vzc2lvbklkMSA9IDA7CisgICAgQUF1ZGlvU3RyZWFtICphYXVkaW9TdHJlYW0yID0gbnVsbHB0cjsKKyAgICBpbnQzMl90ICAgICAgIHNlc3Npb25JZDIgPSAwOworCisgICAgLy8gVXNlIGFuIEFBdWRpb1N0cmVhbUJ1aWxkZXIgdG8gY29udGFpbiByZXF1ZXN0ZWQgcGFyYW1ldGVycy4KKyAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigmYWF1ZGlvQnVpbGRlcikpOworCisgICAgLy8gUmVxdWVzdCBzdHJlYW0gcHJvcGVydGllcy4KKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFBlcmZvcm1hbmNlTW9kZShhYXVkaW9CdWlsZGVyLCBwZXJmTW9kZSk7CisgICAgLy8gVGhpcyBzdHJlYW0gY291bGQgYmUgaW5wdXQgb3Igb3V0cHV0LgorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGlyZWN0aW9uKGFhdWRpb0J1aWxkZXIsIGRpcmVjdGlvbik7CisKKyAgICAvLyBBc2sgQUF1ZGlvIHRvIGFsbG9jYXRlIGEgU2Vzc2lvbiBJRC4KKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNlc3Npb25JZChhYXVkaW9CdWlsZGVyLCBBQVVESU9fU0VTU0lPTl9JRF9BTExPQ0FURSk7CisKKyAgICAvLyBDcmVhdGUgYW4gQUF1ZGlvU3RyZWFtIHVzaW5nIHRoZSBCdWlsZGVyLgorICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbShhYXVkaW9CdWlsZGVyLCAmYWF1ZGlvU3RyZWFtMSkpOworCisgICAgLy8gR2V0IHRoZSBhbGxvY2F0ZWQgSUQgZnJvbSB0aGUgc3RyZWFtLgorICAgIHNlc3Npb25JZDEgPSBBQXVkaW9TdHJlYW1fZ2V0U2Vzc2lvbklkKGFhdWRpb1N0cmVhbTEpOworCisgICAgLy8gQ2hlY2sgZm9yIGludmFsaWQgc2Vzc2lvbiBJRHMuCisgICAgQVNTRVJUX05FKEFBVURJT19TRVNTSU9OX0lEX05PTkUsIHNlc3Npb25JZDEpOworICAgIEFTU0VSVF9ORShBQVVESU9fU0VTU0lPTl9JRF9BTExPQ0FURSwgc2Vzc2lvbklkMSk7CisKKyAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KGFhdWRpb1N0cmVhbTEpKTsKKworICAgIGlmIChkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9JTlBVVCkgeworICAgICAgICBBU1NFUlRfRVEoa051bUZyYW1lcywgQUF1ZGlvU3RyZWFtX3JlYWQoYWF1ZGlvU3RyZWFtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwga051bUZyYW1lcywga05hbm9zUGVyU2Vjb25kKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX0VRKGtOdW1GcmFtZXMsIEFBdWRpb1N0cmVhbV93cml0ZShhYXVkaW9TdHJlYW0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGtOdW1GcmFtZXMsIGtOYW5vc1BlclNlY29uZCkpOworICAgIH0KKworICAgIEVYUEVDVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcChhYXVkaW9TdHJlYW0xKSk7CisKKyAgICAvLyBOb3cgb3BlbiBhIHNlY29uZCBzdHJlYW0gdXNpbmcgdGhlIHNhbWUgc2Vzc2lvbiBJRC4gPT09PT09PT09PT09PT09PT09CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTZXNzaW9uSWQoYWF1ZGlvQnVpbGRlciwgc2Vzc2lvbklkMSk7CisKKyAgICAvLyBSZXZlcnNlIGRpcmVjdGlvbiBmb3Igc2Vjb25kIHN0cmVhbS4KKyAgICBhYXVkaW9fZGlyZWN0aW9uX3Qgb3RoZXJEaXJlY3Rpb24gPSAoZGlyZWN0aW9uID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQUFVRElPX0RJUkVDVElPTl9JTlBVVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQUFVRElPX0RJUkVDVElPTl9PVVRQVVQ7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREaXJlY3Rpb24oYWF1ZGlvQnVpbGRlciwgb3RoZXJEaXJlY3Rpb24pOworCisgICAgLy8gQ3JlYXRlIGFuIEFBdWRpb1N0cmVhbSB1c2luZyB0aGUgQnVpbGRlci4KKyAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oYWF1ZGlvQnVpbGRlciwgJmFhdWRpb1N0cmVhbTIpKTsKKworICAgIC8vIEdldCB0aGUgYWxsb2NhdGVkIElEIGZyb20gdGhlIHN0cmVhbS4KKyAgICAvLyBJdCBzaG91bGQgbWF0Y2ggdGhlIElEIHRoYXQgd2Ugc2V0IGl0IHRvIGluIHRoZSBidWlsZGVyLgorICAgIHNlc3Npb25JZDIgPSBBQXVkaW9TdHJlYW1fZ2V0U2Vzc2lvbklkKGFhdWRpb1N0cmVhbTIpOworICAgIEFTU0VSVF9FUShzZXNzaW9uSWQxLCBzZXNzaW9uSWQyKTsKKworICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoYWF1ZGlvU3RyZWFtMikpOworCisgICAgaWYgKG90aGVyRGlyZWN0aW9uID09IEFBVURJT19ESVJFQ1RJT05fSU5QVVQpIHsKKyAgICAgICAgQVNTRVJUX0VRKGtOdW1GcmFtZXMsIEFBdWRpb1N0cmVhbV9yZWFkKGFhdWRpb1N0cmVhbTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBrTnVtRnJhbWVzLCBrTmFub3NQZXJTZWNvbmQpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfRVEoa051bUZyYW1lcywgQUF1ZGlvU3RyZWFtX3dyaXRlKGFhdWRpb1N0cmVhbTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBrTnVtRnJhbWVzLCBrTmFub3NQZXJTZWNvbmQpKTsKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoYWF1ZGlvU3RyZWFtMikpOworCisgICAgRVhQRUNUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtX2Nsb3NlKGFhdWRpb1N0cmVhbTIpKTsKKworCisgICAgRVhQRUNUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtX2Nsb3NlKGFhdWRpb1N0cmVhbTEpKTsKKyAgICBkZWxldGVbXSBidWZmZXI7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9kZWxldGUoYWF1ZGlvQnVpbGRlcik7Cit9CisKK1RFU1QodGVzdF9zZXNzaW9uX2lkLCBhYXVkaW9fc2Vzc2lvbl9pZF9hbGxvY19wZXJmbm9uZV9pbikgeworICAgIGNoZWNrU2Vzc2lvbklkQWxsb2NhdGUoQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSwgQUFVRElPX0RJUkVDVElPTl9JTlBVVCk7Cit9CitURVNUKHRlc3Rfc2Vzc2lvbl9pZCwgYWF1ZGlvX3Nlc3Npb25faWRfYWxsb2NfcGVyZm5vbmVfb3V0KSB7CisgICAgY2hlY2tTZXNzaW9uSWRBbGxvY2F0ZShBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FLCBBQVVESU9fRElSRUNUSU9OX09VVFBVVCk7Cit9CisKK1RFU1QodGVzdF9zZXNzaW9uX2lkLCBhYXVkaW9fc2Vzc2lvbl9pZF9hbGxvY19sb3dsYXRfaW4pIHsKKyAgICBjaGVja1Nlc3Npb25JZEFsbG9jYXRlKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLCBBQVVESU9fRElSRUNUSU9OX0lOUFVUKTsKK30KK1RFU1QodGVzdF9zZXNzaW9uX2lkLCBhYXVkaW9fc2Vzc2lvbl9pZF9hbGxvY19sb3dsYXRfb3V0KSB7CisgICAgY2hlY2tTZXNzaW9uSWRBbGxvY2F0ZShBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfdGltZXN0YW1wcy5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF90aW1lc3RhbXBzLmNwcAppbmRleCBmYjM2M2U3Li5kZmE3ODE1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF90aW1lc3RhbXBzLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF90aW1lc3RhbXBzLmNwcApAQCAtMjIsOCArMjIsNyBAQAogCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW9UZXN0aW5nLmg+Ci0jaW5jbHVkZSAidXRpbHMvQUF1ZGlvRXhhbXBsZVV0aWxzLmgiCi0jaW5jbHVkZSAiLi4vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvRXhhbXBsZVV0aWxzLmgiCisjaW5jbHVkZSAiQUF1ZGlvRXhhbXBsZVV0aWxzLmgiCiAKIC8vIEFyYml0cmFyeSBwZXJpb2QgZm9yIGdsaXRjaGVzLCBvbmNlIHBlciBzZWNvbmQgYXQgNDgwMDAgSHouCiAjZGVmaW5lIEZPUkNFRF9VTkRFUlJVTl9QRVJJT0RfRlJBTUVTICAgIDQ4MDAwCkBAIC0xMTEsOCArMTEwLDYgQEAKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwogCiAgICAgaW50MzJfdCBmcmFtZXNQZXJCdXJzdCA9IDA7Ci0gICAgZmxvYXQgKmJ1ZmZlciA9IG51bGxwdHI7Ci0KICAgICBpbnQzMl90IGFjdHVhbENoYW5uZWxDb3VudCA9IDA7CiAgICAgaW50MzJfdCBhY3R1YWxTYW1wbGVSYXRlID0gMDsKICAgICBpbnQzMl90IG9yaWdpbmFsQnVmZmVyU2l6ZSA9IDA7CkBAIC0yODcsNyArMjg0LDcgQEAKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CiAgICAgKHZvaWQpIGFyZ2M7Ci0gICAgKHZvaWQgKikgYXJndjsKKyAgICAodm9pZCkgYXJndjsKIAogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3ZhcmlvdXMuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfdmFyaW91cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIwNjVjOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3ZhcmlvdXMuY3BwCkBAIC0wLDAgKzEsNjI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVGVzdCB2YXJpb3VzIEFBdWRpbyBmZWF0dXJlcyBpbmNsdWRpbmcgQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcygpLgorCisjaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworLy8gQ2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBkb2VzIG5vdGhpbmcuCithYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBOb29wRGF0YUNhbGxiYWNrUHJvYygKKyAgICAgICAgQUF1ZGlvU3RyZWFtICpzdHJlYW0sCisgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICB2b2lkICphdWRpb0RhdGEsCisgICAgICAgIGludDMyX3QgbnVtRnJhbWVzCispIHsKKyAgICAodm9pZCkgc3RyZWFtOworICAgICh2b2lkKSB1c2VyRGF0YTsKKyAgICAodm9pZCkgYXVkaW9EYXRhOworICAgICh2b2lkKSBudW1GcmFtZXM7CisgICAgcmV0dXJuIEFBVURJT19DQUxMQkFDS19SRVNVTFRfQ09OVElOVUU7Cit9CisKKy8vIFRlc3QgQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcygpCisKK2NvbnN0ZXhwciBpbnQ2NF90IE5BTk9TX1BFUl9NSUxMSVNFQ09ORCA9IDEwMDAgKiAxMDAwOworCitlbnVtIEZ1bmN0aW9uVG9DYWxsIHsKKyAgICBDQUxMX1NUQVJULCBDQUxMX1NUT1AsIENBTExfUEFVU0UsIENBTExfRkxVU0gKK307CisKK3ZvaWQgY2hlY2tTdGF0ZVRyYW5zaXRpb24oYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IG9yaWdpbmFsU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uVG9DYWxsIGZ1bmN0aW9uVG9DYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fcmVzdWx0X3QgZXhwZWN0ZWRSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBleHBlY3RlZFN0YXRlKSB7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlciAqYWF1ZGlvQnVpbGRlciA9IG51bGxwdHI7CisgICAgQUF1ZGlvU3RyZWFtICphYXVkaW9TdHJlYW0gPSBudWxscHRyOworCisgICAgLy8gVXNlIGFuIEFBdWRpb1N0cmVhbUJ1aWxkZXIgdG8gY29udGFpbiByZXF1ZXN0ZWQgcGFyYW1ldGVycy4KKyAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigmYWF1ZGlvQnVpbGRlcikpOworCisgICAgLy8gUmVxdWVzdCBzdHJlYW0gcHJvcGVydGllcy4KKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERhdGFDYWxsYmFjayhhYXVkaW9CdWlsZGVyLCBOb29wRGF0YUNhbGxiYWNrUHJvYywgbnVsbHB0cik7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRQZXJmb3JtYW5jZU1vZGUoYWF1ZGlvQnVpbGRlciwgcGVyZk1vZGUpOworCisgICAgLy8gQ3JlYXRlIGFuIEFBdWRpb1N0cmVhbSB1c2luZyB0aGUgQnVpbGRlci4KKyAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oYWF1ZGlvQnVpbGRlciwgJmFhdWRpb1N0cmVhbSkpOworCisgICAgLy8gVmVyaWZ5IE9wZW4gU3RhdGUKKyAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGUgPSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOS05PV047CisgICAgRVhQRUNUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtX3dhaXRGb3JTdGF0ZUNoYW5nZShhYXVkaW9TdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1VOS05PV04sICZzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAgKiBOQU5PU19QRVJfTUlMTElTRUNPTkQpKTsKKyAgICBFWFBFQ1RfRVEoQUFVRElPX1NUUkVBTV9TVEFURV9PUEVOLCBzdGF0ZSk7CisKKyAgICAvLyBQdXQgc3RyZWFtIGludG8gZGVzaXJlZCBzdGF0ZS4KKyAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgaW5wdXRTdGF0ZSA9IEFBVURJT19TVFJFQU1fU1RBVEVfVU5JTklUSUFMSVpFRDsKKyAgICBpZiAob3JpZ2luYWxTdGF0ZSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX09QRU4pIHsKKworICAgICAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KGFhdWRpb1N0cmVhbSkpOworCisgICAgICAgIGlmIChvcmlnaW5hbFN0YXRlICE9IEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRJTkcpIHsKKworICAgICAgICAgICAgQVNTRVJUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtX3dhaXRGb3JTdGF0ZUNoYW5nZShhYXVkaW9TdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMCAqIE5BTk9TX1BFUl9NSUxMSVNFQ09ORCkpOworICAgICAgICAgICAgQVNTRVJUX0VRKEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRCwgc3RhdGUpOworCisgICAgICAgICAgICBpZiAob3JpZ2luYWxTdGF0ZSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQSU5HKSB7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKGFhdWRpb1N0cmVhbSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChvcmlnaW5hbFN0YXRlID09IEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBFRCkgeworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcChhYXVkaW9TdHJlYW0pKTsKKyAgICAgICAgICAgICAgICBpbnB1dFN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3JpZ2luYWxTdGF0ZSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNJTkcpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fcmVxdWVzdFBhdXNlKGFhdWRpb1N0cmVhbSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChvcmlnaW5hbFN0YXRlID09IEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VEKSB7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtX3JlcXVlc3RQYXVzZShhYXVkaW9TdHJlYW0pKTsKKyAgICAgICAgICAgICAgICBpbnB1dFN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTSU5HOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gV2FpdCB1bnRpbCBwYXN0IHRyYW5zaXRpb25hbCBzdGF0ZS4KKyAgICBpZiAoaW5wdXRTdGF0ZSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOSU5JVElBTElaRUQpIHsKKyAgICAgICAgQVNTRVJUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtX3dhaXRGb3JTdGF0ZUNoYW5nZShhYXVkaW9TdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMCAqIE5BTk9TX1BFUl9NSUxMSVNFQ09ORCkpOworICAgICAgICBBU1NFUlRfRVEob3JpZ2luYWxTdGF0ZSwgc3RhdGUpOworICAgIH0KKworICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCB0cmFuc2l0aW9uYWxTdGF0ZSA9IG9yaWdpbmFsU3RhdGU7CisgICAgc3dpdGNoKGZ1bmN0aW9uVG9DYWxsKSB7CisgICAgICAgIGNhc2UgRnVuY3Rpb25Ub0NhbGw6OkNBTExfU1RBUlQ6CisgICAgICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRSZXN1bHQsIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoYWF1ZGlvU3RyZWFtKSk7CisgICAgICAgICAgICB0cmFuc2l0aW9uYWxTdGF0ZSA9IEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRJTkc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGdW5jdGlvblRvQ2FsbDo6Q0FMTF9TVE9QOgorICAgICAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkUmVzdWx0LCBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoYWF1ZGlvU3RyZWFtKSk7CisgICAgICAgICAgICB0cmFuc2l0aW9uYWxTdGF0ZSA9IEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGdW5jdGlvblRvQ2FsbDo6Q0FMTF9QQVVTRToKKyAgICAgICAgICAgIEVYUEVDVF9FUShleHBlY3RlZFJlc3VsdCwgQUF1ZGlvU3RyZWFtX3JlcXVlc3RQYXVzZShhYXVkaW9TdHJlYW0pKTsKKyAgICAgICAgICAgIHRyYW5zaXRpb25hbFN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTSU5HOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRnVuY3Rpb25Ub0NhbGw6OkNBTExfRkxVU0g6CisgICAgICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRSZXN1bHQsIEFBdWRpb1N0cmVhbV9yZXF1ZXN0Rmx1c2goYWF1ZGlvU3RyZWFtKSk7CisgICAgICAgICAgICB0cmFuc2l0aW9uYWxTdGF0ZSA9IEFBVURJT19TVFJFQU1fU1RBVEVfRkxVU0hJTkc7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fd2FpdEZvclN0YXRlQ2hhbmdlKGFhdWRpb1N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25hbFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMCAqIE5BTk9TX1BFUl9NSUxMSVNFQ09ORCkpOworICAgIC8vIFdlIHNob3VsZCBub3QgY2hhbmdlIHN0YXRlIHdoZW4gYSBmdW5jdGlvbiBmYWlscy4KKyAgICBpZiAoZXhwZWN0ZWRSZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIEFTU0VSVF9FUShvcmlnaW5hbFN0YXRlLCBleHBlY3RlZFN0YXRlKTsKKyAgICB9CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkU3RhdGUsIHN0YXRlKTsKKyAgICBpZiAoc3RhdGUgIT0gZXhwZWN0ZWRTdGF0ZSkgeworICAgICAgICBwcmludGYoIkVSUk9SIC0gZXhwZWN0ZWQgJXMsIGFjdHVhbCA9ICVzXG4iLAorICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQoZXhwZWN0ZWRTdGF0ZSksCisgICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChzdGF0ZSkpOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICB9CisKKyAgICBBQXVkaW9TdHJlYW1fY2xvc2UoYWF1ZGlvU3RyZWFtKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZShhYXVkaW9CdWlsZGVyKTsKK30KKworLy8gVE9ETyBVc2UgcGFyYW1ldGVyaXplZCB0ZXN0cyBpbnN0ZWFkIG9mIHRoZXNlIGluZGl2aWR1YWwgc3BlY2lmaWMgdGVzdHMuCisKKy8vIE9QRU4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fc3RhdGVfbG93bGF0X29wZW5fc3RhcnQpIHsKKyAgICBjaGVja1N0YXRlVHJhbnNpdGlvbihBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfT1BFTiwKKyAgICAgICAgICAgIEZ1bmN0aW9uVG9DYWxsOjpDQUxMX1NUQVJULAorICAgICAgICAgICAgQUFVRElPX09LLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEKTsKK30KKworVEVTVCh0ZXN0X3ZhcmlvdXMsIGFhdWRpb19zdGF0ZV9ub25lX29wZW5fc3RhcnQpIHsKKyAgICBjaGVja1N0YXRlVHJhbnNpdGlvbihBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9PUEVOLAorICAgICAgICAgICAgRnVuY3Rpb25Ub0NhbGw6OkNBTExfU1RBUlQsCisgICAgICAgICAgICBBQVVESU9fT0ssCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQpOworfQorCitURVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX3N0YXRlX2xvd2xhdF9vcGVuX3N0b3ApIHsKKyAgICBjaGVja1N0YXRlVHJhbnNpdGlvbihBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfT1BFTiwKKyAgICAgICAgICAgIEZ1bmN0aW9uVG9DYWxsOjpDQUxMX1NUT1AsCisgICAgICAgICAgICBBQVVESU9fT0ssCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQRUQpOworfQorCitURVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX3N0YXRlX25vbmVfb3Blbl9zdG9wKSB7CisgICAgY2hlY2tTdGF0ZVRyYW5zaXRpb24oQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSwKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfT1BFTiwKKyAgICAgICAgICAgIEZ1bmN0aW9uVG9DYWxsOjpDQUxMX1NUT1AsCisgICAgICAgICAgICBBQVVESU9fT0ssCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQRUQpOworfQorCitURVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX3N0YXRlX2xvd2xhdF9vcGVuX3BhdXNlKSB7CisgICAgY2hlY2tTdGF0ZVRyYW5zaXRpb24oQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1ksCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX09QRU4sCisgICAgICAgICAgICBGdW5jdGlvblRvQ2FsbDo6Q0FMTF9QQVVTRSwKKyAgICAgICAgICAgIEFBVURJT19PSywKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VEKTsKK30KKworVEVTVCh0ZXN0X3ZhcmlvdXMsIGFhdWRpb19zdGF0ZV9ub25lX29wZW5fcGF1c2UpIHsKKyAgICBjaGVja1N0YXRlVHJhbnNpdGlvbihBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9PUEVOLAorICAgICAgICAgICAgRnVuY3Rpb25Ub0NhbGw6OkNBTExfUEFVU0UsCisgICAgICAgICAgICBBQVVESU9fT0ssCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNFRCk7Cit9CisKK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fc3RhdGVfbG93bGF0X29wZW5fZmx1c2gpIHsKKyAgICBjaGVja1N0YXRlVHJhbnNpdGlvbihBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfT1BFTiwKKyAgICAgICAgICAgIEZ1bmN0aW9uVG9DYWxsOjpDQUxMX0ZMVVNILAorICAgICAgICAgICAgQUFVRElPX09LLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9GTFVTSEVEKTsKK30KKworVEVTVCh0ZXN0X3ZhcmlvdXMsIGFhdWRpb19zdGF0ZV9ub25lX29wZW5fZmx1c2gpIHsKKyAgICBjaGVja1N0YXRlVHJhbnNpdGlvbihBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9PUEVOLAorICAgICAgICAgICAgRnVuY3Rpb25Ub0NhbGw6OkNBTExfRkxVU0gsCisgICAgICAgICAgICBBQVVESU9fT0ssCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNIRUQpOworfQorCisKKy8vIFNUQVJURUQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fc3RhdGVfbG93bGF0X3N0YXJ0ZWRfc3RhcnQpIHsKKyAgICBjaGVja1N0YXRlVHJhbnNpdGlvbihBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRCwKKyAgICAgICAgICAgIEZ1bmN0aW9uVG9DYWxsOjpDQUxMX1NUQVJULAorICAgICAgICAgICAgQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEUsCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQpOworfQorCitURVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX3N0YXRlX25vbmVfc3RhcnRlZF9zdGFydCkgeworICAgIGNoZWNrU3RhdGVUcmFuc2l0aW9uKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUsCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQsCisgICAgICAgICAgICBGdW5jdGlvblRvQ2FsbDo6Q0FMTF9TVEFSVCwKKyAgICAgICAgICAgIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEKTsKK30KKworVEVTVCh0ZXN0X3ZhcmlvdXMsIGFhdWRpb19zdGF0ZV9sb3dsYXRfc3RhcnRlZF9zdG9wKSB7CisgICAgY2hlY2tTdGF0ZVRyYW5zaXRpb24oQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1ksCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQsCisgICAgICAgICAgICBGdW5jdGlvblRvQ2FsbDo6Q0FMTF9TVE9QLAorICAgICAgICAgICAgQUFVRElPX09LLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUEVEKTsKK30KKworVEVTVCh0ZXN0X3ZhcmlvdXMsIGFhdWRpb19zdGF0ZV9ub25lX3N0YXJ0ZWRfc3RvcCkgeworICAgIGNoZWNrU3RhdGVUcmFuc2l0aW9uKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUsCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQsCisgICAgICAgICAgICBGdW5jdGlvblRvQ2FsbDo6Q0FMTF9TVE9QLAorICAgICAgICAgICAgQUFVRElPX09LLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUEVEKTsKK30KKworVEVTVCh0ZXN0X3ZhcmlvdXMsIGFhdWRpb19zdGF0ZV9sb3dsYXRfc3RhcnRlZF9wYXVzZSkgeworICAgIGNoZWNrU3RhdGVUcmFuc2l0aW9uKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVELAorICAgICAgICAgICAgRnVuY3Rpb25Ub0NhbGw6OkNBTExfUEFVU0UsCisgICAgICAgICAgICBBQVVESU9fT0ssCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNFRCk7Cit9CisKK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fc3RhdGVfbm9uZV9zdGFydGVkX3BhdXNlKSB7CisgICAgY2hlY2tTdGF0ZVRyYW5zaXRpb24oQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSwKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRCwKKyAgICAgICAgICAgIEZ1bmN0aW9uVG9DYWxsOjpDQUxMX1BBVVNFLAorICAgICAgICAgICAgQUFVRElPX09LLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTRUQpOworfQorCitURVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX3N0YXRlX2xvd2xhdF9zdGFydGVkX2ZsdXNoKSB7CisgICAgY2hlY2tTdGF0ZVRyYW5zaXRpb24oQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1ksCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQsCisgICAgICAgICAgICBGdW5jdGlvblRvQ2FsbDo6Q0FMTF9GTFVTSCwKKyAgICAgICAgICAgIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEKTsKK30KKworVEVTVCh0ZXN0X3ZhcmlvdXMsIGFhdWRpb19zdGF0ZV9ub25lX3N0YXJ0ZWRfZmx1c2gpIHsKKyAgICBjaGVja1N0YXRlVHJhbnNpdGlvbihBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVELAorICAgICAgICAgICAgRnVuY3Rpb25Ub0NhbGw6OkNBTExfRkxVU0gsCisgICAgICAgICAgICBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURSwKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRCk7Cit9CisKKy8vIFNUT1BQRUQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fc3RhdGVfbG93bGF0X3N0b3BwZWRfc3RhcnQpIHsKKyAgICBjaGVja1N0YXRlVHJhbnNpdGlvbihBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBFRCwKKyAgICAgICAgICAgIEZ1bmN0aW9uVG9DYWxsOjpDQUxMX1NUQVJULAorICAgICAgICAgICAgQUFVRElPX09LLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEKTsKK30KKworVEVTVCh0ZXN0X3ZhcmlvdXMsIGFhdWRpb19zdGF0ZV9ub25lX3N0b3BwZWRfc3RhcnQpIHsKKyAgICBjaGVja1N0YXRlVHJhbnNpdGlvbihBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUEVELAorICAgICAgICAgICAgRnVuY3Rpb25Ub0NhbGw6OkNBTExfU1RBUlQsCisgICAgICAgICAgICBBQVVESU9fT0ssCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQpOworfQorCitURVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX3N0YXRlX2xvd2xhdF9zdG9wcGVkX3N0b3ApIHsKKyAgICBjaGVja1N0YXRlVHJhbnNpdGlvbihBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBFRCwKKyAgICAgICAgICAgIEZ1bmN0aW9uVG9DYWxsOjpDQUxMX1NUT1AsCisgICAgICAgICAgICBBQVVESU9fT0ssCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQRUQpOworfQorCitURVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX3N0YXRlX25vbmVfc3RvcHBlZF9zdG9wKSB7CisgICAgY2hlY2tTdGF0ZVRyYW5zaXRpb24oQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSwKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBFRCwKKyAgICAgICAgICAgIEZ1bmN0aW9uVG9DYWxsOjpDQUxMX1NUT1AsCisgICAgICAgICAgICBBQVVESU9fT0ssCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQRUQpOworfQorCitURVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX3N0YXRlX2xvd2xhdF9zdG9wcGVkX3BhdXNlKSB7CisgICAgY2hlY2tTdGF0ZVRyYW5zaXRpb24oQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1ksCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQRUQsCisgICAgICAgICAgICBGdW5jdGlvblRvQ2FsbDo6Q0FMTF9QQVVTRSwKKyAgICAgICAgICAgIEFBVURJT19PSywKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VEKTsKK30KKworVEVTVCh0ZXN0X3ZhcmlvdXMsIGFhdWRpb19zdGF0ZV9ub25lX3N0b3BwZWRfcGF1c2UpIHsKKyAgICBjaGVja1N0YXRlVHJhbnNpdGlvbihBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUEVELAorICAgICAgICAgICAgRnVuY3Rpb25Ub0NhbGw6OkNBTExfUEFVU0UsCisgICAgICAgICAgICBBQVVESU9fT0ssCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNFRCk7Cit9CisKK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fc3RhdGVfbG93bGF0X3N0b3BwZWRfZmx1c2gpIHsKKyAgICBjaGVja1N0YXRlVHJhbnNpdGlvbihBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwKKyAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBFRCwKKyAgICAgICAgICAgIEZ1bmN0aW9uVG9DYWxsOjpDQUxMX0ZMVVNILAorICAgICAgICAgICAgQUFVRElPX09LLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9GTFVTSEVEKTsKK30KKworVEVTVCh0ZXN0X3ZhcmlvdXMsIGFhdWRpb19zdGF0ZV9ub25lX3N0b3BwZWRfZmx1c2gpIHsKKyAgICBjaGVja1N0YXRlVHJhbnNpdGlvbihBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FLAorICAgICAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUEVELAorICAgICAgICAgICAgRnVuY3Rpb25Ub0NhbGw6OkNBTExfRkxVU0gsCisgICAgICAgICAgICBBQVVESU9fT0ssCisgICAgICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNIRUQpOworfQorCisvLyBQQVVTRUQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fc3RhdGVfbG93bGF0X3BhdXNlZF9zdGFydCkgeworY2hlY2tTdGF0ZVRyYW5zaXRpb24oQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1ksCisgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VELAorICAgICAgICBGdW5jdGlvblRvQ2FsbDo6Q0FMTF9TVEFSVCwKKyAgICAgICAgQUFVRElPX09LLAorICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQpOworfQorCitURVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX3N0YXRlX25vbmVfcGF1c2VkX3N0YXJ0KSB7CitjaGVja1N0YXRlVHJhbnNpdGlvbihBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FLAorICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNFRCwKKyAgICAgICAgRnVuY3Rpb25Ub0NhbGw6OkNBTExfU1RBUlQsCisgICAgICAgIEFBVURJT19PSywKKyAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEKTsKK30KKworVEVTVCh0ZXN0X3ZhcmlvdXMsIGFhdWRpb19zdGF0ZV9sb3dsYXRfcGF1c2VkX3N0b3ApIHsKK2NoZWNrU3RhdGVUcmFuc2l0aW9uKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLAorICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNFRCwKKyAgICAgICAgRnVuY3Rpb25Ub0NhbGw6OkNBTExfU1RPUCwKKyAgICAgICAgQUFVRElPX09LLAorICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQRUQpOworfQorCitURVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX3N0YXRlX25vbmVfcGF1c2VkX3N0b3ApIHsKK2NoZWNrU3RhdGVUcmFuc2l0aW9uKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUsCisgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VELAorICAgICAgICBGdW5jdGlvblRvQ2FsbDo6Q0FMTF9TVE9QLAorICAgICAgICBBQVVESU9fT0ssCisgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBFRCk7Cit9CisKK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fc3RhdGVfbG93bGF0X3BhdXNlZF9wYXVzZSkgeworY2hlY2tTdGF0ZVRyYW5zaXRpb24oQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1ksCisgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VELAorICAgICAgICBGdW5jdGlvblRvQ2FsbDo6Q0FMTF9QQVVTRSwKKyAgICAgICAgQUFVRElPX09LLAorICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNFRCk7Cit9CisKK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fc3RhdGVfbm9uZV9wYXVzZWRfcGF1c2UpIHsKK2NoZWNrU3RhdGVUcmFuc2l0aW9uKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUsCisgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VELAorICAgICAgICBGdW5jdGlvblRvQ2FsbDo6Q0FMTF9QQVVTRSwKKyAgICAgICAgQUFVRElPX09LLAorICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNFRCk7Cit9CisKK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fc3RhdGVfbG93bGF0X3BhdXNlZF9mbHVzaCkgeworY2hlY2tTdGF0ZVRyYW5zaXRpb24oQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1ksCisgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VELAorICAgICAgICBGdW5jdGlvblRvQ2FsbDo6Q0FMTF9GTFVTSCwKKyAgICAgICAgQUFVRElPX09LLAorICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNIRUQpOworfQorCitURVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX3N0YXRlX25vbmVfcGF1c2VkX2ZsdXNoKSB7CitjaGVja1N0YXRlVHJhbnNpdGlvbihBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FLAorICAgICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNFRCwKKyAgICAgICAgRnVuY3Rpb25Ub0NhbGw6OkNBTExfRkxVU0gsCisgICAgICAgIEFBVURJT19PSywKKyAgICAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9GTFVTSEVEKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fc2V0X2J1ZmZlcl9zaXplKSB7CisKKyAgICBpbnQzMl90IGJ1ZmZlckNhcGFjaXR5OworICAgIGludDMyX3QgZnJhbWVzUGVyQnVyc3QgPSAwOworICAgIGludDMyX3QgYWN0dWFsU2l6ZSA9IDA7CisKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyICphYXVkaW9CdWlsZGVyID0gbnVsbHB0cjsKKyAgICBBQXVkaW9TdHJlYW0gKmFhdWRpb1N0cmVhbSA9IG51bGxwdHI7CisKKyAgICAvLyBVc2UgYW4gQUF1ZGlvU3RyZWFtQnVpbGRlciB0byBjb250YWluIHJlcXVlc3RlZCBwYXJhbWV0ZXJzLgorICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCZhYXVkaW9CdWlsZGVyKSk7CisKKyAgICAvLyBSZXF1ZXN0IHN0cmVhbSBwcm9wZXJ0aWVzLgorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGF0YUNhbGxiYWNrKGFhdWRpb0J1aWxkZXIsIE5vb3BEYXRhQ2FsbGJhY2tQcm9jLCBudWxscHRyKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFBlcmZvcm1hbmNlTW9kZShhYXVkaW9CdWlsZGVyLCBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSk7CisKKyAgICAvLyBDcmVhdGUgYW4gQUF1ZGlvU3RyZWFtIHVzaW5nIHRoZSBCdWlsZGVyLgorICAgIEVYUEVDVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbShhYXVkaW9CdWlsZGVyLCAmYWF1ZGlvU3RyZWFtKSk7CisKKyAgICAvLyBUaGlzIGlzIHRoZSBudW1iZXIgb2YgZnJhbWVzIHRoYXQgYXJlIHJlYWQgaW4gb25lIGNodW5rIGJ5IGEgRE1BIGNvbnRyb2xsZXIKKyAgICAvLyBvciBhIERTUCBvciBhIG1peGVyLgorICAgIGZyYW1lc1BlckJ1cnN0ID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1BlckJ1cnN0KGFhdWRpb1N0cmVhbSk7CisgICAgYnVmZmVyQ2FwYWNpdHkgPSBBQXVkaW9TdHJlYW1fZ2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyhhYXVkaW9TdHJlYW0pOworICAgIHByaW50ZigiICAgICAgICAgIGJ1ZmZlckNhcGFjaXR5ID0gJWQsIHJlbWFpbmRlciA9ICVkXG4iLAorICAgICAgICAgICBidWZmZXJDYXBhY2l0eSwgYnVmZmVyQ2FwYWNpdHkgJSBmcmFtZXNQZXJCdXJzdCk7CisKKyAgICBhY3R1YWxTaXplID0gQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcyhhYXVkaW9TdHJlYW0sIDApOworICAgIEVYUEVDVF9HVChhY3R1YWxTaXplLCAwKTsKKyAgICBFWFBFQ1RfTEUoYWN0dWFsU2l6ZSwgYnVmZmVyQ2FwYWNpdHkpOworCisgICAgYWN0dWFsU2l6ZSA9IEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMoYWF1ZGlvU3RyZWFtLCAyICogZnJhbWVzUGVyQnVyc3QpOworICAgIEVYUEVDVF9HVChhY3R1YWxTaXplLCBmcmFtZXNQZXJCdXJzdCk7CisgICAgRVhQRUNUX0xFKGFjdHVhbFNpemUsIGJ1ZmZlckNhcGFjaXR5KTsKKworICAgIGFjdHVhbFNpemUgPSBBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzKGFhdWRpb1N0cmVhbSwgYnVmZmVyQ2FwYWNpdHkgLSAxKTsKKyAgICBFWFBFQ1RfR1QoYWN0dWFsU2l6ZSwgZnJhbWVzUGVyQnVyc3QpOworICAgIEVYUEVDVF9MRShhY3R1YWxTaXplLCBidWZmZXJDYXBhY2l0eSk7CisKKyAgICBhY3R1YWxTaXplID0gQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcyhhYXVkaW9TdHJlYW0sIGJ1ZmZlckNhcGFjaXR5KTsKKyAgICBFWFBFQ1RfR1QoYWN0dWFsU2l6ZSwgZnJhbWVzUGVyQnVyc3QpOworICAgIEVYUEVDVF9MRShhY3R1YWxTaXplLCBidWZmZXJDYXBhY2l0eSk7CisKKyAgICBhY3R1YWxTaXplID0gQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcyhhYXVkaW9TdHJlYW0sIGJ1ZmZlckNhcGFjaXR5ICsgMSk7CisgICAgRVhQRUNUX0dUKGFjdHVhbFNpemUsIGZyYW1lc1BlckJ1cnN0KTsKKyAgICBFWFBFQ1RfTEUoYWN0dWFsU2l6ZSwgYnVmZmVyQ2FwYWNpdHkpOworCisgICAgYWN0dWFsU2l6ZSA9IEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMoYWF1ZGlvU3RyZWFtLCAxMjM0NTY3KTsKKyAgICBFWFBFQ1RfR1QoYWN0dWFsU2l6ZSwgZnJhbWVzUGVyQnVyc3QpOworICAgIEVYUEVDVF9MRShhY3R1YWxTaXplLCBidWZmZXJDYXBhY2l0eSk7CisKKyAgICBhY3R1YWxTaXplID0gQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcyhhYXVkaW9TdHJlYW0sIElOVDMyX01BWCk7CisgICAgRVhQRUNUX0dUKGFjdHVhbFNpemUsIGZyYW1lc1BlckJ1cnN0KTsKKyAgICBFWFBFQ1RfTEUoYWN0dWFsU2l6ZSwgYnVmZmVyQ2FwYWNpdHkpOworCisgICAgYWN0dWFsU2l6ZSA9IEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMoYWF1ZGlvU3RyZWFtLCBJTlQzMl9NSU4pOworICAgIEVYUEVDVF9HVChhY3R1YWxTaXplLCAwKTsKKyAgICBFWFBFQ1RfTEUoYWN0dWFsU2l6ZSwgYnVmZmVyQ2FwYWNpdHkpOworCisgICAgQUF1ZGlvU3RyZWFtX2Nsb3NlKGFhdWRpb1N0cmVhbSk7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9kZWxldGUoYWF1ZGlvQnVpbGRlcik7Cit9CisKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gVGVzdCB0byBtYWtlIHN1cmUgdGhhdCBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1Agd29ya3MuCisKKy8vIENhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgY291bnRzIGNhbGxzLgorYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgQ2FsbGJhY2tPbmNlUHJvYygKKyAgICAgICAgQUF1ZGlvU3RyZWFtICpzdHJlYW0sCisgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICB2b2lkICphdWRpb0RhdGEsCisgICAgICAgIGludDMyX3QgbnVtRnJhbWVzCispIHsKKyAgICAodm9pZCkgc3RyZWFtOworICAgICh2b2lkKSBhdWRpb0RhdGE7CisgICAgKHZvaWQpIG51bUZyYW1lczsKKworICAgIHN0ZDo6YXRvbWljPGludDMyX3Q+ICpjYWxsYmFja0NvdW50UHRyID0gKHN0ZDo6YXRvbWljPGludDMyX3Q+ICopdXNlckRhdGE7CisgICAgKCpjYWxsYmFja0NvdW50UHRyKSsrOworCisgICAgcmV0dXJuIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUDsKK30KKwordm9pZCBjaGVja0NhbGxiYWNrT25jZShhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHBlcmZNb2RlKSB7CisKKyAgICBzdGQ6OmF0b21pYzxpbnQzMl90PiAgIGNhbGxiYWNrQ291bnR7MH07CisKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyICphYXVkaW9CdWlsZGVyID0gbnVsbHB0cjsKKyAgICBBQXVkaW9TdHJlYW0gKmFhdWRpb1N0cmVhbSA9IG51bGxwdHI7CisKKyAgICAvLyBVc2UgYW4gQUF1ZGlvU3RyZWFtQnVpbGRlciB0byBjb250YWluIHJlcXVlc3RlZCBwYXJhbWV0ZXJzLgorICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCZhYXVkaW9CdWlsZGVyKSk7CisKKyAgICAvLyBSZXF1ZXN0IHN0cmVhbSBwcm9wZXJ0aWVzLgorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGF0YUNhbGxiYWNrKGFhdWRpb0J1aWxkZXIsIENhbGxiYWNrT25jZVByb2MsICZjYWxsYmFja0NvdW50KTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFBlcmZvcm1hbmNlTW9kZShhYXVkaW9CdWlsZGVyLCBwZXJmTW9kZSk7CisKKyAgICAvLyBDcmVhdGUgYW4gQUF1ZGlvU3RyZWFtIHVzaW5nIHRoZSBCdWlsZGVyLgorICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbShhYXVkaW9CdWlsZGVyLCAmYWF1ZGlvU3RyZWFtKSk7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9kZWxldGUoYWF1ZGlvQnVpbGRlcik7CisKKyAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KGFhdWRpb1N0cmVhbSkpOworCisgICAgc2xlZXAoMSk7IC8vIEdpdmUgY2FsbGJhY2sgYSBjaGFuY2UgdG8gcnVuIG1hbnkgdGltZXMuCisKKyAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoYWF1ZGlvU3RyZWFtKSk7CisKKyAgICBFWFBFQ1RfRVEoMSwgY2FsbGJhY2tDb3VudC5sb2FkKCkpOyAvLyBzaG91bGQgc3RvcCBhZnRlciBmaXJzdCBjYWxsCisKKyAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fY2xvc2UoYWF1ZGlvU3RyZWFtKSk7Cit9CisKK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fY2FsbGJhY2tfb25jZV9ub25lKSB7CisgICAgY2hlY2tDYWxsYmFja09uY2UoQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSk7Cit9CisKK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fY2FsbGJhY2tfb25jZV9sb3dsYXQpIHsKKyAgICBjaGVja0NhbGxiYWNrT25jZShBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSk7Cit9CisKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RydWN0IFdha2VVcENhbGxiYWNrRGF0YSB7CisgICAgdm9pZCB3YWtlT3RoZXIoKSB7CisgICAgICAgIC8vIHNpZ25hbCB3YWl0aW5nIHRlc3QgdG8gd2FrZSB1cAorICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXgpOworICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGNvbmRpdGlvblZhcmlhYmxlLm5vdGlmeV9vbmUoKTsKKyAgICB9CisKKyAgICB2b2lkIHdhaXRGb3JGaW5pc2hlZCgpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jayA8c3RkOjptdXRleD4gYUxvY2sobXV0ZXgpOworICAgICAgICBjb25kaXRpb25WYXJpYWJsZS53YWl0KGFMb2NrLCBbPV0geyByZXR1cm4gZmluaXNoZWQ7IH0pOworICAgIH0KKworICAgIC8vIEZvciBzaWduYWxsaW5nIGZvcmVncm91bmQgdGVzdCB3aGVuIGNhbGxiYWNrIGZpbmlzaGVkCisgICAgc3RkOjptdXRleCAgICAgICAgICAgICAgbXV0ZXg7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgY29uZGl0aW9uVmFyaWFibGU7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgPSBmYWxzZTsKK307CisKKy8vIFRlc3QgdG8gbWFrZSBzdXJlIHdlIGNhbm5vdCBjYWxsIHJlY3Vyc2l2ZWx5IGludG8gdGhlIHN5c3RlbSBmcm9tIGEgY2FsbGJhY2suCitzdHJ1Y3QgRGFuZ2Vyb3VzRGF0YSA6IHB1YmxpYyBXYWtlVXBDYWxsYmFja0RhdGEgeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHRTdGFydCA9IEFBVURJT19PSzsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0U3RvcCA9IEFBVURJT19PSzsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0UGF1c2UgPSBBQVVESU9fT0s7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdEZsdXNoID0gQUFVRElPX09LOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHRDbG9zZSA9IEFBVURJT19PSzsKK307CisKKy8vIENhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgdHJpZXMgdG8gY2FsbCBiYWNrIGludG8gdGhlIHN0cmVhbS4KK2FhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IERhbmdlcm91c0RhdGFDYWxsYmFja1Byb2MoCisgICAgICAgIEFBdWRpb1N0cmVhbSAqc3RyZWFtLAorICAgICAgICB2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgdm9pZCAqYXVkaW9EYXRhLAorICAgICAgICBpbnQzMl90IG51bUZyYW1lcykgeworICAgICh2b2lkKSBhdWRpb0RhdGE7CisgICAgKHZvaWQpIG51bUZyYW1lczsKKworICAgIERhbmdlcm91c0RhdGEgKmRhdGEgPSAoRGFuZ2Vyb3VzRGF0YSAqKXVzZXJEYXRhOworICAgIGRhdGEtPnJlc3VsdFN0YXJ0ID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChzdHJlYW0pOworICAgIGRhdGEtPnJlc3VsdFN0b3AgPSBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3Aoc3RyZWFtKTsKKyAgICBkYXRhLT5yZXN1bHRQYXVzZSA9IEFBdWRpb1N0cmVhbV9yZXF1ZXN0UGF1c2Uoc3RyZWFtKTsKKyAgICBkYXRhLT5yZXN1bHRGbHVzaCA9IEFBdWRpb1N0cmVhbV9yZXF1ZXN0Rmx1c2goc3RyZWFtKTsKKyAgICBkYXRhLT5yZXN1bHRDbG9zZSA9IEFBdWRpb1N0cmVhbV9jbG9zZShzdHJlYW0pOworCisgICAgZGF0YS0+d2FrZU90aGVyKCk7CisKKyAgICByZXR1cm4gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QOworfQorCisvL2ludCBtYWluKCkgeyAvLyBUbyBmaXggQW5kcm9pZCBTdHVkaW8gZm9ybWF0dGluZyB3aGVuIGVkaXRpbmcuCit2b2lkIGNoZWNrRGFuZ2Vyb3VzQ2FsbGJhY2soYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSkgeworICAgIERhbmdlcm91c0RhdGEgICAgICAgIGRhbmdlcm91c0RhdGE7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlciAqYWF1ZGlvQnVpbGRlciA9IG51bGxwdHI7CisgICAgQUF1ZGlvU3RyZWFtICAgICAgICAqYWF1ZGlvU3RyZWFtID0gbnVsbHB0cjsKKworICAgIC8vIFVzZSBhbiBBQXVkaW9TdHJlYW1CdWlsZGVyIHRvIGNvbnRhaW4gcmVxdWVzdGVkIHBhcmFtZXRlcnMuCisgICAgQVNTRVJUX0VRKEFBVURJT19PSywgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoJmFhdWRpb0J1aWxkZXIpKTsKKworICAgIC8vIFJlcXVlc3Qgc3RyZWFtIHByb3BlcnRpZXMuCisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREYXRhQ2FsbGJhY2soYWF1ZGlvQnVpbGRlciwgRGFuZ2Vyb3VzRGF0YUNhbGxiYWNrUHJvYywgJmRhbmdlcm91c0RhdGEpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0UGVyZm9ybWFuY2VNb2RlKGFhdWRpb0J1aWxkZXIsIHBlcmZNb2RlKTsKKworICAgIC8vIENyZWF0ZSBhbiBBQXVkaW9TdHJlYW0gdXNpbmcgdGhlIEJ1aWxkZXIuCisgICAgQVNTRVJUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKGFhdWRpb0J1aWxkZXIsICZhYXVkaW9TdHJlYW0pKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZShhYXVkaW9CdWlsZGVyKTsKKworICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoYWF1ZGlvU3RyZWFtKSk7CisKKyAgICBkYW5nZXJvdXNEYXRhLndhaXRGb3JGaW5pc2hlZCgpOworCisgICAgRVhQRUNUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKGFhdWRpb1N0cmVhbSkpOworCisgICAgRVhQRUNUX0VRKEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFLCBkYW5nZXJvdXNEYXRhLnJlc3VsdFN0YXJ0KTsKKyAgICBFWFBFQ1RfRVEoQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEUsIGRhbmdlcm91c0RhdGEucmVzdWx0U3RvcCk7CisgICAgRVhQRUNUX0VRKEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFLCBkYW5nZXJvdXNEYXRhLnJlc3VsdFBhdXNlKTsKKyAgICBFWFBFQ1RfRVEoQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEUsIGRhbmdlcm91c0RhdGEucmVzdWx0Rmx1c2gpOworICAgIEVYUEVDVF9FUShBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURSwgZGFuZ2Vyb3VzRGF0YS5yZXN1bHRDbG9zZSk7CisKKyAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fY2xvc2UoYWF1ZGlvU3RyZWFtKSk7Cit9CisKKy8vaW50IG1haW4oKSB7IC8vIFRvIGZpeCBBbmRyb2lkIFN0dWRpbyBmb3JtYXR0aW5nIHdoZW4gZWRpdGluZy4KKworVEVTVCh0ZXN0X3ZhcmlvdXMsIGFhdWRpb19jYWxsYmFja19ibG9ja2Vyc19ub25lKSB7CisgICAgY2hlY2tEYW5nZXJvdXNDYWxsYmFjayhBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FKTsKK30KKworVEVTVCh0ZXN0X3ZhcmlvdXMsIGFhdWRpb19jYWxsYmFja19ibG9ja2Vyc19sb3dsYXQpIHsKKyAgICBjaGVja0Rhbmdlcm91c0NhbGxiYWNrKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BbmRyb2lkLmJwCmluZGV4IDYxYzk0NmMuLjJkZjM3YTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQW5kcm9pZC5icApAQCAtNiw3ICs2LDIyIEBACiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGliYXVkaW9jbGllbnQiLAorCisgICAgYWlkbDogeworICAgICAgICBleHBvcnRfYWlkbF9oZWFkZXJzOiB0cnVlLAorICAgICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsiYWlkbCJdLAorICAgICAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwiLAorICAgICAgICBdLAorICAgIH0sCisKICAgICBzcmNzOiBbCisgICAgICAgIC8vIEFJREwgZmlsZXMgZm9yIGF1ZGlvY2xpZW50IGludGVyZmFjZXMKKyAgICAgICAgLy8gVGhlIGhlYWRlcnMgZm9yIHRoZXNlIGludGVyZmFjZXMgd2lsbCBiZSBhdmFpbGFibGUgdG8gYW55IG1vZHVsZXMgdGhhdAorICAgICAgICAvLyBpbmNsdWRlIGxpYmF1ZGlvY2xpZW50LCBhdCB0aGUgcGF0aCAiYWlkbC9wYWNrYWdlL3BhdGgvQm5Gb28uaCIKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9SZWNvcmQuYWlkbCIsCisgICAgICAgICI6bGliYXVkaW9jbGllbnRfYWlkbCIsCisKICAgICAgICAgIkF1ZGlvRWZmZWN0LmNwcCIsCiAgICAgICAgICJBdWRpb1BvbGljeS5jcHAiLAogICAgICAgICAiQXVkaW9SZWNvcmQuY3BwIiwKQEAgLTE3LDcgKzMyLDYgQEAKICAgICAgICAgIklBdWRpb0ZsaW5nZXJDbGllbnQuY3BwIiwKICAgICAgICAgIklBdWRpb1BvbGljeVNlcnZpY2UuY3BwIiwKICAgICAgICAgIklBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwIiwKLSAgICAgICAgIklBdWRpb1JlY29yZC5jcHAiLAogICAgICAgICAiSUF1ZGlvVHJhY2suY3BwIiwKICAgICAgICAgIklFZmZlY3QuY3BwIiwKICAgICAgICAgIklFZmZlY3RDbGllbnQuY3BwIiwKQEAgLTMzLDEwICs0NywxMiBAQAogICAgICAgICAibGliZGwiLAogICAgICAgICAibGliYXVkaW91dGlscyIsCiAgICAgICAgICJsaWJhdWRpb21hbmFnZXIiLAorICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKKyAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCiAgICAgXSwKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbImxpYmJpbmRlciJdLAogCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUvbWVkaWEiXSwKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZS9tZWRpYSIsICJhaWRsIl0sCiAgICAgaGVhZGVyX2xpYnM6IFsibGliYXVkaW9jbGllbnRfaGVhZGVycyJdLAogICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsibGliYXVkaW9jbGllbnRfaGVhZGVycyJdLAogCkBAIC01NiwzICs3MiwxMSBAQAogICAgICAgICBdLAogICAgIH0sCiB9CisKKy8vIEFJREwgaW50ZXJmYWNlIGJldHdlZW4gbGliYXVkaW9jbGllbnQgYW5kIGZyYW1ld29yay5qYXIKK2ZpbGVncm91cCB7CisgICAgbmFtZTogImxpYmF1ZGlvY2xpZW50X2FpZGwiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JUGxheWVyLmFpZGwiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAKaW5kZXggYmE0YWNjNi4uZjlkZjViMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcApAQCAtMjYsNiArMjYsOCBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb0ZsaW5nZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+CiAKICNkZWZpbmUgV0FJVF9QRVJJT0RfTVMgICAgICAgICAgMTAKIApAQCAtNjUsMTIgKzY3LDkwIEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitzdGF0aWMgc3RkOjpzdHJpbmcgYXVkaW9Gb3JtYXRUeXBlU3RyaW5nKGF1ZGlvX2Zvcm1hdF90IHZhbHVlKSB7CisgICAgc3RkOjpzdHJpbmcgZm9ybWF0VHlwZTsKKyAgICBpZiAoRm9ybWF0Q29udmVydGVyOjp0b1N0cmluZyh2YWx1ZSwgZm9ybWF0VHlwZSkpIHsKKyAgICAgICAgcmV0dXJuIGZvcm1hdFR5cGU7CisgICAgfQorICAgIGNoYXIgcmF3YnVmZmVyWzE2XTsgIC8vIHJvb20gZm9yICIlZCIKKyAgICBzbnByaW50ZihyYXdidWZmZXIsIHNpemVvZihyYXdidWZmZXIpLCAiJWQiLCB2YWx1ZSk7CisgICAgcmV0dXJuIHJhd2J1ZmZlcjsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIGF1ZGlvU291cmNlU3RyaW5nKGF1ZGlvX3NvdXJjZV90IHZhbHVlKSB7CisgICAgc3RkOjpzdHJpbmcgc291cmNlOworICAgIGlmIChTb3VyY2VUeXBlQ29udmVydGVyOjp0b1N0cmluZyh2YWx1ZSwgc291cmNlKSkgeworICAgICAgICByZXR1cm4gc291cmNlOworICAgIH0KKyAgICBjaGFyIHJhd2J1ZmZlclsxNl07ICAvLyByb29tIGZvciAiJWQiCisgICAgc25wcmludGYocmF3YnVmZmVyLCBzaXplb2YocmF3YnVmZmVyKSwgIiVkIiwgdmFsdWUpOworICAgIHJldHVybiByYXdidWZmZXI7Cit9CisKK3ZvaWQgQXVkaW9SZWNvcmQ6Ok1lZGlhTWV0cmljczo6Z2F0aGVyKGNvbnN0IEF1ZGlvUmVjb3JkICpyZWNvcmQpCit7CisgICAgLy8ga2V5IGZvciBtZWRpYSBzdGF0aXN0aWNzIGlzIGRlZmluZWQgaW4gdGhlIGhlYWRlcgorICAgIC8vIGF0dHJzIGZvciBtZWRpYSBzdGF0aXN0aWNzCisgICAgLy8gTkI6IHRoZXNlIGFyZSBtYXRjaGVkIHdpdGggcHVibGljIEphdmEgQVBJIGNvbnN0YW50cyBkZWZpbmVkCisgICAgLy8gaW4gZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb1JlY29yZC5qYXZhCisgICAgLy8gVGhlc2UgbXVzdCBiZSBrZXB0IHN5bmNocm9uaXplZCB3aXRoIHRoZSBjb25zdGFudHMgdGhlcmUuCisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1JlY29yZEVuY29kaW5nW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5lbmNvZGluZyI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1JlY29yZFNvdXJjZVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuc291cmNlIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUmVjb3JkTGF0ZW5jeVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQubGF0ZW5jeSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1JlY29yZFNhbXBsZVJhdGVbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLnNhbXBsZXJhdGUiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9SZWNvcmRDaGFubmVsQ291bnRbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLmNoYW5uZWxzIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUmVjb3JkQ3JlYXRlZFtdID0gImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuY3JlYXRlZE1zIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUmVjb3JkRHVyYXRpb25bXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLmR1cmF0aW9uTXMiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9SZWNvcmRDb3VudFtdID0gImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQubiI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1JlY29yZEVycm9yW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5lcnJjb2RlIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUmVjb3JkRXJyb3JGdW5jdGlvbltdID0gImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuZXJyZnVuYyI7CisKKyAgICAvLyBjb25zdHJ1Y3RvciBndWFyYW50ZWVzIG1BbmFseXRpY3NJdGVtIGlzIHZhbGlkCisKKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0F1ZGlvUmVjb3JkTGF0ZW5jeSwgcmVjb3JkLT5tTGF0ZW5jeSk7CisgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtBdWRpb1JlY29yZFNhbXBsZVJhdGUsIHJlY29yZC0+bVNhbXBsZVJhdGUpOworICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQXVkaW9SZWNvcmRDaGFubmVsQ291bnQsIHJlY29yZC0+bUNoYW5uZWxDb3VudCk7CisgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUmVjb3JkRW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXRUeXBlU3RyaW5nKHJlY29yZC0+bUZvcm1hdCkuY19zdHIoKSk7CisgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUmVjb3JkU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvU291cmNlU3RyaW5nKHJlY29yZC0+bUF0dHJpYnV0ZXMuc291cmNlKS5jX3N0cigpKTsKKworICAgIC8vIGxvZyB0b3RhbCBkdXJhdGlvbiByZWNvcmRpbmcsIGluY2x1ZGluZyBhbnl0aGluZyBjdXJyZW50bHkgcnVubmluZyBbYW5kIGNvdW50XS4KKyAgICBuc2Vjc190IGFjdGl2ZSA9IDA7CisgICAgaWYgKG1TdGFydGVkTnMgIT0gMCkgeworICAgICAgICBhY3RpdmUgPSBzeXN0ZW1UaW1lKCkgLSBtU3RhcnRlZE5zOworICAgIH0KKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa0F1ZGlvUmVjb3JkRHVyYXRpb24sIChtRHVyYXRpb25OcyArIGFjdGl2ZSkgLyAoMTAwMCAqIDEwMDApKTsKKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0F1ZGlvUmVjb3JkQ291bnQsIG1Db3VudCk7CisKKyAgICAvLyBYWFggSSBkb24ndCBrbm93IHRoYXQgdGhpcyBhZGRzIGEgbG90IG9mIHZhbHVlLCBsb25nIHRlcm0KKyAgICBpZiAobUNyZWF0ZWROcyAhPSAwKSB7CisgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrQXVkaW9SZWNvcmRDcmVhdGVkLCBtQ3JlYXRlZE5zIC8gKDEwMDAgKiAxMDAwKSk7CisgICAgfQorCisgICAgaWYgKG1MYXN0RXJyb3IgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtBdWRpb1JlY29yZEVycm9yLCBtTGFzdEVycm9yKTsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUmVjb3JkRXJyb3JGdW5jdGlvbiwgbUxhc3RFcnJvckZ1bmMuY19zdHIoKSk7CisgICAgfQorfQorCisvLyBoYW5kIHRoZSB1c2VyIGEgc25hcHNob3Qgb2YgdGhlIG1ldHJpY3MuCitzdGF0dXNfdCBBdWRpb1JlY29yZDo6Z2V0TWV0cmljcyhNZWRpYUFuYWx5dGljc0l0ZW0gKiAmaXRlbSkKK3sKKyAgICBtTWVkaWFNZXRyaWNzLmdhdGhlcih0aGlzKTsKKyAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKnRtcCA9IG1NZWRpYU1ldHJpY3MuZHVwKCk7CisgICAgaWYgKHRtcCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGl0ZW0gPSB0bXA7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCiBBdWRpb1JlY29yZDo6QXVkaW9SZWNvcmQoY29uc3QgU3RyaW5nMTYgJm9wUGFja2FnZU5hbWUpCiAgICAgOiBtQWN0aXZlKGZhbHNlKSwgbVN0YXR1cyhOT19JTklUKSwgbU9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSksCiAgICAgICBtU2Vzc2lvbklkKEFVRElPX1NFU1NJT05fQUxMT0NBVEUpLAogICAgICAgbVByZXZpb3VzUHJpb3JpdHkoQU5EUk9JRF9QUklPUklUWV9OT1JNQUwpLCBtUHJldmlvdXNTY2hlZHVsaW5nR3JvdXAoU1BfREVGQVVMVCksCi0gICAgICBtU2VsZWN0ZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwgbVJvdXRlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAotICAgICAgbVBvcnRJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKQorICAgICAgbVNlbGVjdGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksIG1Sb3V0ZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKQogewogfQogCkBAIC04OSwyNCArMTY5LDI1IEBACiAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgcGlkX3QgcGlkLAotICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzKQorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzLAorICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQpCiAgICAgOiBtQWN0aXZlKGZhbHNlKSwKICAgICAgIG1TdGF0dXMoTk9fSU5JVCksCiAgICAgICBtT3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKSwKICAgICAgIG1TZXNzaW9uSWQoQVVESU9fU0VTU0lPTl9BTExPQ0FURSksCiAgICAgICBtUHJldmlvdXNQcmlvcml0eShBTkRST0lEX1BSSU9SSVRZX05PUk1BTCksCiAgICAgICBtUHJldmlvdXNTY2hlZHVsaW5nR3JvdXAoU1BfREVGQVVMVCksCi0gICAgICBtUHJveHkoTlVMTCksCi0gICAgICBtU2VsZWN0ZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwKLSAgICAgIG1Qb3J0SWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkKKyAgICAgIG1Qcm94eShOVUxMKQogewotICAgIG1TdGF0dXMgPSBzZXQoaW5wdXRTb3VyY2UsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIGNiZiwgdXNlciwKKyAgICAodm9pZClzZXQoaW5wdXRTb3VyY2UsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIGNiZiwgdXNlciwKICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLCBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgZmxhZ3MsCi0gICAgICAgICAgICB1aWQsIHBpZCwgcEF0dHJpYnV0ZXMpOworICAgICAgICAgICAgdWlkLCBwaWQsIHBBdHRyaWJ1dGVzLCBzZWxlY3RlZERldmljZUlkKTsKIH0KIAogQXVkaW9SZWNvcmQ6On5BdWRpb1JlY29yZCgpCiB7CisgICAgbU1lZGlhTWV0cmljcy5nYXRoZXIodGhpcyk7CisKICAgICBpZiAobVN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBjYWxsYmFjayBmdW5jdGlvbiBleGl0cyBpbiB0aGUgY2FzZSB3aGVyZQogICAgICAgICAvLyBpdCBpcyBsb29waW5nIG9uIGJ1ZmZlciBlbXB0eSBjb25kaXRpb24gaW4gb2J0YWluQnVmZmVyKCkuCkBAIC0xNDgsMTQgKzIyOSwyMiBAQAogICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgIHBpZF90IHBpZCwKLSAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcykKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcywKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkKQogeworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudDsKKyAgICBwaWRfdCBjYWxsaW5nUGlkOworICAgIHBpZF90IG15UGlkOworCiAgICAgQUxPR1YoInNldCgpOiBpbnB1dFNvdXJjZSAlZCwgc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgJSN4LCBmcmFtZUNvdW50ICV6dSwgIgogICAgICAgICAgICJub3RpZmljYXRpb25GcmFtZXMgJXUsIHNlc3Npb25JZCAlZCwgdHJhbnNmZXJUeXBlICVkLCBmbGFncyAlI3gsIG9wUGFja2FnZU5hbWUgJXMgIgogICAgICAgICAgICJ1aWQgJWQsIHBpZCAlZCIsCiAgICAgICAgICAgaW5wdXRTb3VyY2UsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgZmxhZ3MsIFN0cmluZzgobU9wUGFja2FnZU5hbWUpLnN0cmluZygpLCB1aWQsIHBpZCk7CiAKKyAgICBtU2VsZWN0ZWREZXZpY2VJZCA9IHNlbGVjdGVkRGV2aWNlSWQ7CisKICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewogICAgIGNhc2UgVFJBTlNGRVJfREVGQVVMVDoKICAgICAgICAgaWYgKGNiZiA9PSBOVUxMIHx8IHRocmVhZENhbkNhbGxKYXZhKSB7CkBAIC0xNjcsNyArMjU2LDggQEAKICAgICBjYXNlIFRSQU5TRkVSX0NBTExCQUNLOgogICAgICAgICBpZiAoY2JmID09IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dFKCJUcmFuc2ZlciB0eXBlIFRSQU5TRkVSX0NBTExCQUNLIGJ1dCBjYmYgPT0gTlVMTCIpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBjYXNlIFRSQU5TRkVSX09CVEFJTjoKQEAgLTE3NSwxNCArMjY1LDE2IEBACiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHRyYW5zZmVyIHR5cGUgJWQiLCB0cmFuc2ZlclR5cGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAgICAgbVRyYW5zZmVyID0gdHJhbnNmZXJUeXBlOwogCiAgICAgLy8gaW52YXJpYW50IHRoYXQgbUF1ZGlvUmVjb3JkICE9IDAgaXMgdHJ1ZSBvbmx5IGFmdGVyIHNldCgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5CiAgICAgaWYgKG1BdWRpb1JlY29yZCAhPSAwKSB7CiAgICAgICAgIEFMT0dFKCJUcmFjayBhbHJlYWR5IGluIHVzZSIpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogCiAgICAgaWYgKHBBdHRyaWJ1dGVzID09IE5VTEwpIHsKQEAgLTIwNiwxNiArMjk4LDE4IEBACiAgICAgLy8gQXVkaW9GbGluZ2VyIGNhcHR1cmUgb25seSBzdXBwb3J0cyBsaW5lYXIgUENNCiAgICAgaWYgKCFhdWRpb19pc192YWxpZF9mb3JtYXQoZm9ybWF0KSB8fCAhYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CiAgICAgICAgIEFMT0dFKCJGb3JtYXQgJSN4IGlzIG5vdCBsaW5lYXIgcGNtIiwgZm9ybWF0KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CiAKICAgICBpZiAoIWF1ZGlvX2lzX2lucHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spKSB7CiAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGNoYW5uZWwgbWFzayAlI3giLCBjaGFubmVsTWFzayk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICBtQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKLSAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjaGFubmVsTWFzayk7CisgICAgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY2hhbm5lbE1hc2spOwogICAgIG1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CiAKICAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CkBAIC0yMjQsMjggKzMxOCwyNCBAQAogICAgICAgICBtRnJhbWVTaXplID0gc2l6ZW9mKHVpbnQ4X3QpOwogICAgIH0KIAotICAgIC8vIG1GcmFtZUNvdW50IGlzIGluaXRpYWxpemVkIGluIG9wZW5SZWNvcmRfbAorICAgIC8vIG1GcmFtZUNvdW50IGlzIGluaXRpYWxpemVkIGluIGNyZWF0ZVJlY29yZF9sCiAgICAgbVJlcUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwogCiAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc1JlcSA9IG5vdGlmaWNhdGlvbkZyYW1lczsKLSAgICAvLyBtTm90aWZpY2F0aW9uRnJhbWVzQWN0IGlzIGluaXRpYWxpemVkIGluIG9wZW5SZWNvcmRfbAorICAgIC8vIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgaXMgaW5pdGlhbGl6ZWQgaW4gY3JlYXRlUmVjb3JkX2wKIAotICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSkgewotICAgICAgICBtU2Vzc2lvbklkID0gKGF1ZGlvX3Nlc3Npb25fdCkgQXVkaW9TeXN0ZW06Om5ld0F1ZGlvVW5pcXVlSWQoQVVESU9fVU5JUVVFX0lEX1VTRV9TRVNTSU9OKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtU2Vzc2lvbklkID0gc2Vzc2lvbklkOwotICAgIH0KKyAgICBtU2Vzc2lvbklkID0gc2Vzc2lvbklkOwogICAgIEFMT0dWKCJzZXQoKTogbVNlc3Npb25JZCAlZCIsIG1TZXNzaW9uSWQpOwogCi0gICAgaW50IGNhbGxpbmdwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgaW50IG15cGlkID0gZ2V0cGlkKCk7Ci0gICAgaWYgKHVpZCA9PSBBVURJT19VSURfSU5WQUxJRCB8fCAoY2FsbGluZ3BpZCAhPSBteXBpZCkpIHsKKyAgICBjYWxsaW5nUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIG15UGlkID0gZ2V0cGlkKCk7CisgICAgaWYgKHVpZCA9PSBBVURJT19VSURfSU5WQUxJRCB8fCAoY2FsbGluZ1BpZCAhPSBteVBpZCkpIHsKICAgICAgICAgbUNsaWVudFVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKICAgICB9IGVsc2UgewogICAgICAgICBtQ2xpZW50VWlkID0gdWlkOwogICAgIH0KLSAgICBpZiAocGlkID09IC0xIHx8IChjYWxsaW5ncGlkICE9IG15cGlkKSkgewotICAgICAgICBtQ2xpZW50UGlkID0gY2FsbGluZ3BpZDsKKyAgICBpZiAocGlkID09IC0xIHx8IChjYWxsaW5nUGlkICE9IG15UGlkKSkgeworICAgICAgICBtQ2xpZW50UGlkID0gY2FsbGluZ1BpZDsKICAgICB9IGVsc2UgewogICAgICAgICBtQ2xpZW50UGlkID0gcGlkOwogICAgIH0KQEAgLTI2MCw3ICszNTAsNyBAQAogICAgIH0KIAogICAgIC8vIGNyZWF0ZSB0aGUgSUF1ZGlvUmVjb3JkCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gb3BlblJlY29yZF9sKDAgLyplcG9jaCovLCBtT3BQYWNrYWdlTmFtZSk7CisgICAgc3RhdHVzID0gY3JlYXRlUmVjb3JkX2woMCAvKmVwb2NoKi8sIG1PcFBhY2thZ2VOYW1lKTsKIAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgaWYgKG1BdWRpb1JlY29yZFRocmVhZCAhPSAwKSB7CkBAIC0yNjgsMTAgKzM1OCw5IEBACiAgICAgICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQtPnJlcXVlc3RFeGl0QW5kV2FpdCgpOwogICAgICAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkLmNsZWFyKCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgZ290byBleGl0OwogICAgIH0KIAotICAgIG1TdGF0dXMgPSBOT19FUlJPUjsKICAgICBtVXNlckRhdGEgPSB1c2VyOwogICAgIC8vIFRPRE86IGFkZCBhdWRpbyBoYXJkd2FyZSBpbnB1dCBsYXRlbmN5IGhlcmUKICAgICBtTGF0ZW5jeSA9ICgxMDAwTEwgKiBtRnJhbWVDb3VudCkgLyBtU2FtcGxlUmF0ZTsKQEAgLTI4Niw3ICszNzUsMTIgQEAKICAgICBtRnJhbWVzUmVhZCA9IDA7CiAgICAgbUZyYW1lc1JlYWRTZXJ2ZXJPZmZzZXQgPSAwOwogCi0gICAgcmV0dXJuIE5PX0VSUk9SOworZXhpdDoKKyAgICBtU3RhdHVzID0gc3RhdHVzOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgbU1lZGlhTWV0cmljcy5tYXJrRXJyb3Ioc3RhdHVzLCBfX0ZVTkNUSU9OX18pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zMjMsNyArNDE3LDcgQEAKIAogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogICAgIGlmICghKGZsYWdzICYgQ0JMS19JTlZBTElEKSkgewotICAgICAgICBzdGF0dXMgPSBtQXVkaW9SZWNvcmQtPnN0YXJ0KGV2ZW50LCB0cmlnZ2VyU2Vzc2lvbik7CisgICAgICAgIHN0YXR1cyA9IG1BdWRpb1JlY29yZC0+c3RhcnQoZXZlbnQsIHRyaWdnZXJTZXNzaW9uKS50cmFuc2FjdGlvbkVycm9yKCk7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gREVBRF9PQkpFQ1QpIHsKICAgICAgICAgICAgIGZsYWdzIHw9IENCTEtfSU5WQUxJRDsKICAgICAgICAgfQpAQCAtMzQ0LDggKzQzOCwxNCBAQAogICAgICAgICAgICAgZ2V0X3NjaGVkX3BvbGljeSgwLCAmbVByZXZpb3VzU2NoZWR1bGluZ0dyb3VwKTsKICAgICAgICAgICAgIGFuZHJvaWRTZXRUaHJlYWRQcmlvcml0eSgwLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKICAgICAgICAgfQorCisgICAgICAgIC8vIHdlJ3ZlIHN1Y2Nlc3NmdWxseSBzdGFydGVkLCBsb2cgdGhhdCB0aW1lCisgICAgICAgIG1NZWRpYU1ldHJpY3MubG9nU3RhcnQoc3lzdGVtVGltZSgpKTsKICAgICB9CiAKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIG1NZWRpYU1ldHJpY3MubWFya0Vycm9yKHN0YXR1cywgX19GVU5DVElPTl9fKTsKKyAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMzcwLDYgKzQ3MCw5IEBACiAgICAgICAgIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgMCwgbVByZXZpb3VzUHJpb3JpdHkpOwogICAgICAgICBzZXRfc2NoZWRfcG9saWN5KDAsIG1QcmV2aW91c1NjaGVkdWxpbmdHcm91cCk7CiAgICAgfQorCisgICAgLy8gd2UndmUgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQsIGxvZyB0aGF0IHRpbWUKKyAgICBtTWVkaWFNZXRyaWNzLmxvZ1N0b3Aoc3lzdGVtVGltZSgpKTsKIH0KIAogYm9vbCBBdWRpb1JlY29yZDo6c3RvcHBlZCgpIGNvbnN0CkBAIC00ODksNiArNTkyLDcgQEAKICAgICAgICAgICAgICAgICBtQXVkaW9SZWNvcmQtPnN0b3AoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGFuZHJvaWRfYXRvbWljX29yKENCTEtfSU5WQUxJRCwgJm1DYmxrLT5tRmxhZ3MpOworICAgICAgICAgICAgbVByb3h5LT5pbnRlcnJ1cHQoKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC01MjEsNiArNjI1LDI3IEBACiAgICAgcmV0dXJuIG1Sb3V0ZWREZXZpY2VJZDsKIH0KIAorc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKSBjb25zdAoreworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgcmVzdWx0LmFwcGVuZCgiIEF1ZGlvUmVjb3JkOjpkdW1wXG4iKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHN0YXR1cyglZCksIGFjdGl2ZSglZCksIHNlc3Npb24gSWQoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1cywgbUFjdGl2ZSwgbVNlc3Npb25JZCk7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBmbGFncyglI3gpLCByZXEuIGZsYWdzKCUjeCksIGF1ZGlvIHNvdXJjZSglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ3MsIG1PcmlnRmxhZ3MsIG1BdHRyaWJ1dGVzLnNvdXJjZSk7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBmb3JtYXQoJSN4KSwgY2hhbm5lbCBtYXNrKCUjeCksIGNoYW5uZWwgY291bnQoJXUpLCBzYW1wbGUgcmF0ZSgldSlcbiIsCisgICAgICAgICAgICAgICAgICBtRm9ybWF0LCBtQ2hhbm5lbE1hc2ssIG1DaGFubmVsQ291bnQsIG1TYW1wbGVSYXRlKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIGZyYW1lIGNvdW50KCV6dSksIHJlcS4gZnJhbWUgY291bnQoJXp1KVxuIiwKKyAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50LCBtUmVxRnJhbWVDb3VudCk7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBub3RpZi4gZnJhbWUgY291bnQoJXUpLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgldSlcbiIsCisgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCwgbU5vdGlmaWNhdGlvbkZyYW1lc1JlcSk7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBpbnB1dCglZCksIGxhdGVuY3koJXUpLCBzZWxlY3RlZCBkZXZpY2UgSWQoJWQpLCByb3V0ZWQgZGV2aWNlIElkKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dCwgbUxhdGVuY3ksIG1TZWxlY3RlZERldmljZUlkLCBtUm91dGVkRGV2aWNlSWQpOworICAgIDo6d3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBUT0RPIE1vdmUgdGhpcyBtYWNybyB0byBhIGNvbW1vbiBoZWFkZXIgZmlsZSBmb3IgZW51bSB0byBzdHJpbmcgY29udmVyc2lvbiBpbiBhdWRpbyBmcmFtZXdvcmsuCiAjZGVmaW5lIE1FRElBX0NBU0VfRU5VTShuYW1lKSBjYXNlIG5hbWU6IHJldHVybiAjbmFtZQpAQCAtNTM2LDcwICs2NjEsMjkgQEAKIH0KIAogLy8gbXVzdCBiZSBjYWxsZWQgd2l0aCBtTG9jayBoZWxkCi1zdGF0dXNfdCBBdWRpb1JlY29yZDo6b3BlblJlY29yZF9sKGNvbnN0IE1vZHVsbzx1aW50MzJfdD4gJmVwb2NoLCBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSkKK3N0YXR1c190IEF1ZGlvUmVjb3JkOjpjcmVhdGVSZWNvcmRfbChjb25zdCBNb2R1bG88dWludDMyX3Q+ICZlcG9jaCwgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIElBdWRpb0ZsaW5nZXI6OkNyZWF0ZVJlY29yZElucHV0IGlucHV0OworICAgIElBdWRpb0ZsaW5nZXI6OkNyZWF0ZVJlY29yZE91dHB1dCBvdXRwdXQ7CisgICAgYXVkaW9fc2Vzc2lvbl90IG9yaWdpbmFsU2Vzc2lvbklkOworICAgIHNwPG1lZGlhOjpJQXVkaW9SZWNvcmQ+IHJlY29yZDsKKyAgICB2b2lkICppTWVtUG9pbnRlcjsKKyAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGs7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworCiAgICAgaWYgKGF1ZGlvRmxpbmdlciA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGF1ZGlvZmxpbmdlciIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKKyAgICAgICAgZ290byBleGl0OwogICAgIH0KIAotICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0OwotCiAgICAgLy8gbUZsYWdzIChub3QgbU9yaWdGbGFncykgaXMgbW9kaWZpZWQgZGVwZW5kaW5nIG9uIHdoZXRoZXIgZmFzdCByZXF1ZXN0IGlzIGFjY2VwdGVkLgogICAgIC8vIEFmdGVyIGZhc3QgcmVxdWVzdCBpcyBkZW5pZWQsIHdlIHdpbGwgcmVxdWVzdCBhZ2FpbiBpZiBJQXVkaW9SZWNvcmQgaXMgcmUtY3JlYXRlZC4KIAotICAgIHN0YXR1c190IHN0YXR1czsKLQotICAgIC8vIE5vdCBhIGNvbnZlbnRpb25hbCBsb29wLCBidXQgYSByZXRyeSBsb29wIGZvciBhdCBtb3N0IHR3byBpdGVyYXRpb25zIHRvdGFsLgotICAgIC8vIFRyeSBmaXJzdCBtYXliZSB3aXRoIEZBU1QgZmxhZyB0aGVuIHRyeSBhZ2FpbiB3aXRob3V0IEZBU1QgZmxhZyBpZiB0aGF0IGZhaWxzLgotICAgIC8vIEV4aXRzIGxvb3Agbm9ybWFsbHkgdmlhIGEgcmV0dXJuIGF0IHRoZSBib3R0b20sIG9yIHdpdGggZXJyb3IgdmlhIGEgYnJlYWsuCi0gICAgLy8gVGhlIHNwPD4gcmVmZXJlbmNlcyB3aWxsIGJlIGRyb3BwZWQgd2hlbiByZS1lbnRlcmluZyBzY29wZS4KLSAgICAvLyBUaGUgbGFjayBvZiBpbmRlbnRhdGlvbiBpcyBkZWxpYmVyYXRlLCB0byByZWR1Y2UgY29kZSBjaHVybiBhbmQgZWFzZSBtZXJnZXMuCi0gICAgZm9yICg7OykgewotICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnICA9IHsKLSAgICAgICAgICAgIC5zYW1wbGVfcmF0ZSA9IG1TYW1wbGVSYXRlLAotICAgICAgICAgICAgLmNoYW5uZWxfbWFzayA9IG1DaGFubmVsTWFzaywKLSAgICAgICAgICAgIC5mb3JtYXQgPSBtRm9ybWF0Ci0gICAgICAgIH07Ci0gICAgbVJvdXRlZERldmljZUlkID0gbVNlbGVjdGVkRGV2aWNlSWQ7Ci0gICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldElucHV0Rm9yQXR0cigmbUF0dHJpYnV0ZXMsICZpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIGNvbXBhcmUgdG8gQXVkaW9UcmFjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRQaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncywgJm1Sb3V0ZWREZXZpY2VJZCwgJm1Qb3J0SWQpOwotCi0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fCBpbnB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBhdWRpbyBpbnB1dCBmb3Igc2Vzc2lvbiAlZCwgcmVjb3JkIHNvdXJjZSAlZCwgc2FtcGxlIHJhdGUgJXUsICIKLSAgICAgICAgICAgICAgImZvcm1hdCAlI3gsIGNoYW5uZWwgbWFzayAlI3gsIGZsYWdzICUjeCIsCi0gICAgICAgICAgICAgIG1TZXNzaW9uSWQsIG1BdHRyaWJ1dGVzLnNvdXJjZSwgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywgbUZsYWdzKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KICAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGEgcmVmZXJlbmNlIHRvIGFuIEkvTyBoYW5kbGUgYW5kIGhhdmUgbm90IHlldCBoYW5kZWQgaXQgb2ZmIHRvIEF1ZGlvRmxpbmdlciwKICAgICAvLyB3ZSBtdXN0IHJlbGVhc2UgaXQgb3Vyc2VsdmVzIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcuCiAKLSNpZiAwCi0gICAgc2l6ZV90IGFmRnJhbWVDb3VudDsKLSAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0RnJhbWVDb3VudChpbnB1dCwgJmFmRnJhbWVDb3VudCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZ2V0RnJhbWVDb3VudChpbnB1dD0lZCkgc3RhdHVzICVkIiwgaW5wdXQsIHN0YXR1cyk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSNlbmRpZgotCi0gICAgdWludDMyX3QgYWZTYW1wbGVSYXRlOwotICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRTYW1wbGluZ1JhdGUoaW5wdXQsICZhZlNhbXBsZVJhdGUpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoImdldFNhbXBsaW5nUmF0ZShpbnB1dD0lZCkgc3RhdHVzICVkIiwgaW5wdXQsIHN0YXR1cyk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAobVNhbXBsZVJhdGUgPT0gMCkgewotICAgICAgICBtU2FtcGxlUmF0ZSA9IGFmU2FtcGxlUmF0ZTsKLSAgICB9Ci0KICAgICAvLyBDbGllbnQgY2FuIG9ubHkgZXhwcmVzcyBhIHByZWZlcmVuY2UgZm9yIEZBU1QuICBTZXJ2ZXIgd2lsbCBwZXJmb3JtIGFkZGl0aW9uYWwgdGVzdHMuCiAgICAgaWYgKG1GbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgewogICAgICAgICBib29sIHVzZUNhc2VBbGxvd2VkID0KQEAgLTYxOCw2NiArNzAyLDQxIEBACiAgICAgICAgIGlmICghdXNlQ2FzZUFsbG93ZWQpIHsKICAgICAgICAgICAgIEFMT0dXKCJBVURJT19JTlBVVF9GTEFHX0ZBU1QgZGVuaWVkLCBpbmNvbXBhdGlibGUgdHJhbnNmZXIgPSAlcyIsCiAgICAgICAgICAgICAgICAgICBjb252ZXJ0VHJhbnNmZXJUb1RleHQobVRyYW5zZmVyKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzYW1wbGUgcmF0ZXMgbXVzdCBhbHNvIG1hdGNoCi0gICAgICAgIGJvb2wgc2FtcGxlUmF0ZUFsbG93ZWQgPSBtU2FtcGxlUmF0ZSA9PSBhZlNhbXBsZVJhdGU7Ci0gICAgICAgIGlmICghc2FtcGxlUmF0ZUFsbG93ZWQpIHsKLSAgICAgICAgICAgIEFMT0dXKCJBVURJT19JTlBVVF9GTEFHX0ZBU1QgZGVuaWVkLCByYXRlcyBkbyBub3QgbWF0Y2ggJXUgSHosIHJlcXVpcmUgJXUgSHoiLAotICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIGFmU2FtcGxlUmF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sIGZhc3RBbGxvd2VkID0gdXNlQ2FzZUFsbG93ZWQgJiYgc2FtcGxlUmF0ZUFsbG93ZWQ7Ci0gICAgICAgIGlmICghZmFzdEFsbG93ZWQpIHsKICAgICAgICAgICAgIG1GbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSAobUZsYWdzICYgfihBVURJT19JTlBVVF9GTEFHX0ZBU1QgfAogICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX1JBVykpOwotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChpbnB1dCwgbVNlc3Npb25JZCk7Ci0gICAgICAgICAgICBjb250aW51ZTsgICAvLyByZXRyeQogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gVGhlIG5vdGlmaWNhdGlvbiBmcmFtZSBjb3VudCBpcyB0aGUgcGVyaW9kIGJldHdlZW4gY2FsbGJhY2tzLCBhcyBzdWdnZXN0ZWQgYnkgdGhlIGNsaWVudAotICAgIC8vIGJ1dCBtb2RlcmF0ZWQgYnkgdGhlIHNlcnZlci4gIEZvciByZWNvcmQsIHRoZSBjYWxjdWxhdGlvbnMgYXJlIGRvbmUgZW50aXJlbHkgb24gc2VydmVyIHNpZGUuCi0gICAgc2l6ZV90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IG1Ob3RpZmljYXRpb25GcmFtZXNSZXE7Ci0gICAgc2l6ZV90IGZyYW1lQ291bnQgPSBtUmVxRnJhbWVDb3VudDsKLQotICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgPSBtRmxhZ3M7Ci0KLSAgICBwaWRfdCB0aWQgPSAtMTsKKyAgICBpbnB1dC5hdHRyID0gbUF0dHJpYnV0ZXM7CisgICAgaW5wdXQuY29uZmlnLnNhbXBsZV9yYXRlID0gbVNhbXBsZVJhdGU7CisgICAgaW5wdXQuY29uZmlnLmNoYW5uZWxfbWFzayA9IG1DaGFubmVsTWFzazsKKyAgICBpbnB1dC5jb25maWcuZm9ybWF0ID0gbUZvcm1hdDsKKyAgICBpbnB1dC5jbGllbnRJbmZvLmNsaWVudFVpZCA9IG1DbGllbnRVaWQ7CisgICAgaW5wdXQuY2xpZW50SW5mby5jbGllbnRQaWQgPSBtQ2xpZW50UGlkOworICAgIGlucHV0LmNsaWVudEluZm8uY2xpZW50VGlkID0gLTE7CiAgICAgaWYgKG1GbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgewogICAgICAgICBpZiAobUF1ZGlvUmVjb3JkVGhyZWFkICE9IDApIHsKLSAgICAgICAgICAgIHRpZCA9IG1BdWRpb1JlY29yZFRocmVhZC0+Z2V0VGlkKCk7CisgICAgICAgICAgICBpbnB1dC5jbGllbnRJbmZvLmNsaWVudFRpZCA9IG1BdWRpb1JlY29yZFRocmVhZC0+Z2V0VGlkKCk7CiAgICAgICAgIH0KICAgICB9CisgICAgaW5wdXQub3BQYWNrYWdlTmFtZSA9IG9wUGFja2FnZU5hbWU7CiAKLSAgICBzaXplX3QgdGVtcCA9IGZyYW1lQ291bnQ7ICAgLy8gdGVtcCBtYXkgYmUgcmVwbGFjZWQgYnkgYSByZXZpc2VkIHZhbHVlIG9mIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSB3aWxsIHN0aWxsIG5lZWQgdGhlIG9yaWdpbmFsIHZhbHVlIGFsc28KLSAgICBhdWRpb19zZXNzaW9uX3Qgb3JpZ2luYWxTZXNzaW9uSWQgPSBtU2Vzc2lvbklkOworICAgIGlucHV0LmZsYWdzID0gbUZsYWdzOworICAgIC8vIFRoZSBub3RpZmljYXRpb24gZnJhbWUgY291bnQgaXMgdGhlIHBlcmlvZCBiZXR3ZWVuIGNhbGxiYWNrcywgYXMgc3VnZ2VzdGVkIGJ5IHRoZSBjbGllbnQKKyAgICAvLyBidXQgbW9kZXJhdGVkIGJ5IHRoZSBzZXJ2ZXIuICBGb3IgcmVjb3JkLCB0aGUgY2FsY3VsYXRpb25zIGFyZSBkb25lIGVudGlyZWx5IG9uIHNlcnZlciBzaWRlLgorICAgIGlucHV0LmZyYW1lQ291bnQgPSBtUmVxRnJhbWVDb3VudDsKKyAgICBpbnB1dC5ub3RpZmljYXRpb25GcmFtZUNvdW50ID0gbU5vdGlmaWNhdGlvbkZyYW1lc1JlcTsKKyAgICBpbnB1dC5zZWxlY3RlZERldmljZUlkID0gbVNlbGVjdGVkRGV2aWNlSWQ7CisgICAgaW5wdXQuc2Vzc2lvbklkID0gbVNlc3Npb25JZDsKKyAgICBvcmlnaW5hbFNlc3Npb25JZCA9IG1TZXNzaW9uSWQ7CiAKLSAgICBzcDxJTWVtb3J5PiBpTWVtOyAgICAgICAgICAgLy8gZm9yIGNibGsKLSAgICBzcDxJTWVtb3J5PiBidWZmZXJNZW07Ci0gICAgc3A8SUF1ZGlvUmVjb3JkPiByZWNvcmQgPSBhdWRpb0ZsaW5nZXItPm9wZW5SZWNvcmQoaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudFBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm90aWZpY2F0aW9uRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlNZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTWVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvcnRJZCk7Ci0gICAgQUxPR0VfSUYob3JpZ2luYWxTZXNzaW9uSWQgIT0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSAmJiBtU2Vzc2lvbklkICE9IG9yaWdpbmFsU2Vzc2lvbklkLAotICAgICAgICAgICAgInNlc3Npb24gSUQgY2hhbmdlZCBmcm9tICVkIHRvICVkIiwgb3JpZ2luYWxTZXNzaW9uSWQsIG1TZXNzaW9uSWQpOworICAgIHJlY29yZCA9IGF1ZGlvRmxpbmdlci0+Y3JlYXRlUmVjb3JkKGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOwogCiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HRSgiQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgcmVjb3JkIHRyYWNrLCBzdGF0dXM6ICVkIiwgc3RhdHVzKTsKLSAgICAgICAgYnJlYWs7CisgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAgICAgQUxPR19BU1NFUlQocmVjb3JkICE9IDApOwogCkBAIC02ODUsNDEgKzc0NCw0MSBAQAogICAgIC8vIHNvIHdlIGFyZSBubyBsb25nZXIgcmVzcG9uc2libGUgZm9yIHJlbGVhc2luZyBpdC4KIAogICAgIG1Bd2FpdEJvb3N0ID0gZmFsc2U7Ci0gICAgaWYgKG1GbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgewotICAgICAgICBpZiAoZmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0ZBU1QpIHsKLSAgICAgICAgICAgIEFMT0dJKCJBVURJT19JTlBVVF9GTEFHX0ZBU1Qgc3VjY2Vzc2Z1bDsgZnJhbWVDb3VudCAlenUgLT4gJXp1IiwgZnJhbWVDb3VudCwgdGVtcCk7Ci0gICAgICAgICAgICBtQXdhaXRCb29zdCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygiQVVESU9fSU5QVVRfRkxBR19GQVNUIGRlbmllZCBieSBzZXJ2ZXI7IGZyYW1lQ291bnQgJXp1IC0+ICV6dSIsIGZyYW1lQ291bnQsIHRlbXApOwotICAgICAgICAgICAgbUZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIChtRmxhZ3MgJiB+KEFVRElPX0lOUFVUX0ZMQUdfRkFTVCB8Ci0gICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfUkFXKSk7Ci0gICAgICAgICAgICBjb250aW51ZTsgICAvLyByZXRyeQotICAgICAgICB9CisgICAgaWYgKG91dHB1dC5mbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgeworICAgICAgICBBTE9HSSgiQVVESU9fSU5QVVRfRkxBR19GQVNUIHN1Y2Nlc3NmdWw7IGZyYW1lQ291bnQgJXp1IC0+ICV6dSIsCisgICAgICAgICAgICAgIG1SZXFGcmFtZUNvdW50LCBvdXRwdXQuZnJhbWVDb3VudCk7CisgICAgICAgIG1Bd2FpdEJvb3N0ID0gdHJ1ZTsKICAgICB9Ci0gICAgbUZsYWdzID0gZmxhZ3M7CisgICAgbUZsYWdzID0gb3V0cHV0LmZsYWdzOworICAgIG1Sb3V0ZWREZXZpY2VJZCA9IG91dHB1dC5zZWxlY3RlZERldmljZUlkOworICAgIG1TZXNzaW9uSWQgPSBvdXRwdXQuc2Vzc2lvbklkOworICAgIG1TYW1wbGVSYXRlID0gb3V0cHV0LnNhbXBsZVJhdGU7CiAKLSAgICBpZiAoaU1lbSA9PSAwKSB7CisgICAgaWYgKG91dHB1dC5jYmxrID09IDApIHsKICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKKyAgICAgICAgZ290byBleGl0OwogICAgIH0KLSAgICB2b2lkICppTWVtUG9pbnRlciA9IGlNZW0tPnBvaW50ZXIoKTsKKyAgICBpTWVtUG9pbnRlciA9IG91dHB1dC5jYmxrIC0+cG9pbnRlcigpOwogICAgIGlmIChpTWVtUG9pbnRlciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2sgcG9pbnRlciIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKKyAgICAgICAgZ290byBleGl0OwogICAgIH0KLSAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSBzdGF0aWNfY2FzdDxhdWRpb190cmFja19jYmxrX3QqPihpTWVtUG9pbnRlcik7CisgICAgY2JsayA9IHN0YXRpY19jYXN0PGF1ZGlvX3RyYWNrX2NibGtfdCo+KGlNZW1Qb2ludGVyKTsKIAogICAgIC8vIFN0YXJ0aW5nIGFkZHJlc3Mgb2YgYnVmZmVycyBpbiBzaGFyZWQgbWVtb3J5LgogICAgIC8vIFRoZSBidWZmZXJzIGFyZSBlaXRoZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGNvbnRyb2wgYmxvY2ssCiAgICAgLy8gb3IgaW4gYSBzZXBhcmF0ZSBhcmVhIGF0IGRpc2NyZXRpb24gb2Ygc2VydmVyLgogICAgIHZvaWQgKmJ1ZmZlcnM7Ci0gICAgaWYgKGJ1ZmZlck1lbSA9PSAwKSB7CisgICAgaWYgKG91dHB1dC5idWZmZXJzID09IDApIHsKICAgICAgICAgYnVmZmVycyA9IGNibGsgKyAxOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ1ZmZlcnMgPSBidWZmZXJNZW0tPnBvaW50ZXIoKTsKKyAgICAgICAgYnVmZmVycyA9IG91dHB1dC5idWZmZXJzLT5wb2ludGVyKCk7CiAgICAgICAgIGlmIChidWZmZXJzID09IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGJ1ZmZlciBwb2ludGVyIik7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTcyOSw0MyArNzg4LDQyIEBACiAgICAgICAgIG1EZWF0aE5vdGlmaWVyLmNsZWFyKCk7CiAgICAgfQogICAgIG1BdWRpb1JlY29yZCA9IHJlY29yZDsKLSAgICBtQ2Jsa01lbW9yeSA9IGlNZW07Ci0gICAgbUJ1ZmZlck1lbW9yeSA9IGJ1ZmZlck1lbTsKKyAgICBtQ2Jsa01lbW9yeSA9IG91dHB1dC5jYmxrOworICAgIG1CdWZmZXJNZW1vcnkgPSBvdXRwdXQuYnVmZmVyczsKICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CiAKICAgICBtQ2JsayA9IGNibGs7Ci0gICAgLy8gbm90ZSB0aGF0IHRlbXAgaXMgdGhlIChwb3NzaWJseSByZXZpc2VkKSB2YWx1ZSBvZiBmcmFtZUNvdW50Ci0gICAgaWYgKHRlbXAgPCBmcmFtZUNvdW50IHx8IChmcmFtZUNvdW50ID09IDAgJiYgdGVtcCA9PSAwKSkgewotICAgICAgICBBTE9HVygiUmVxdWVzdGVkIGZyYW1lQ291bnQgJXp1IGJ1dCByZWNlaXZlZCBmcmFtZUNvdW50ICV6dSIsIGZyYW1lQ291bnQsIHRlbXApOworICAgIC8vIG5vdGUgdGhhdCBvdXRwdXQuZnJhbWVDb3VudCBpcyB0aGUgKHBvc3NpYmx5IHJldmlzZWQpIHZhbHVlIG9mIG1SZXFGcmFtZUNvdW50CisgICAgaWYgKG91dHB1dC5mcmFtZUNvdW50IDwgbVJlcUZyYW1lQ291bnQgfHwgKG1SZXFGcmFtZUNvdW50ID09IDAgJiYgb3V0cHV0LmZyYW1lQ291bnQgPT0gMCkpIHsKKyAgICAgICAgQUxPR1coIlJlcXVlc3RlZCBmcmFtZUNvdW50ICV6dSBidXQgcmVjZWl2ZWQgZnJhbWVDb3VudCAlenUiLAorICAgICAgICAgICAgICBtUmVxRnJhbWVDb3VudCwgIG91dHB1dC5mcmFtZUNvdW50KTsKICAgICB9Ci0gICAgZnJhbWVDb3VudCA9IHRlbXA7CiAKICAgICAvLyBNYWtlIHN1cmUgdGhhdCBhcHBsaWNhdGlvbiBpcyBub3RpZmllZCB3aXRoIHN1ZmZpY2llbnQgbWFyZ2luIGJlZm9yZSBvdmVycnVuLgogICAgIC8vIFRoZSBjb21wdXRhdGlvbiBpcyBkb25lIG9uIHNlcnZlciBzaWRlLgotICAgIGlmIChtTm90aWZpY2F0aW9uRnJhbWVzUmVxID4gMCAmJiBub3RpZmljYXRpb25GcmFtZXMgIT0gbU5vdGlmaWNhdGlvbkZyYW1lc1JlcSkgeworICAgIGlmIChtTm90aWZpY2F0aW9uRnJhbWVzUmVxID4gMCAmJiBvdXRwdXQubm90aWZpY2F0aW9uRnJhbWVDb3VudCAhPSBtTm90aWZpY2F0aW9uRnJhbWVzUmVxKSB7CiAgICAgICAgIEFMT0dXKCJTZXJ2ZXIgYWRqdXN0ZWQgbm90aWZpY2F0aW9uRnJhbWVzIGZyb20gJXUgdG8gJXp1IGZvciBmcmFtZUNvdW50ICV6dSIsCi0gICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc1JlcSwgbm90aWZpY2F0aW9uRnJhbWVzLCBmcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzUmVxLCBvdXRwdXQubm90aWZpY2F0aW9uRnJhbWVDb3VudCwgb3V0cHV0LmZyYW1lQ291bnQpOwogICAgIH0KLSAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gKHVpbnQzMl90KSBub3RpZmljYXRpb25GcmFtZXM7Ci0KKyAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gKHVpbnQzMl90KW91dHB1dC5ub3RpZmljYXRpb25GcmFtZUNvdW50OwogCiAgICAgLy9tSW5wdXQgIT0gaW5wdXQgaW5jbHVkZXMgdGhlIGNhc2Ugd2hlcmUgbUlucHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FIGZvciBmaXJzdCBjcmVhdGlvbgotICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCAmJiBtSW5wdXQgIT0gaW5wdXQpIHsKKyAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDAgJiYgbUlucHV0ICE9IG91dHB1dC5pbnB1dElkKSB7CiAgICAgICAgIGlmIChtSW5wdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1JbnB1dCk7CiAgICAgICAgIH0KLSAgICAgICAgQXVkaW9TeXN0ZW06OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgaW5wdXQpOworICAgICAgICBBdWRpb1N5c3RlbTo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBvdXRwdXQuaW5wdXRJZCk7CiAgICAgfQogCiAgICAgLy8gV2UgcmV0YWluIGEgY29weSBvZiB0aGUgSS9PIGhhbmRsZSwgYnV0IGRvbid0IG93biB0aGUgcmVmZXJlbmNlCi0gICAgbUlucHV0ID0gaW5wdXQ7CisgICAgbUlucHV0ID0gb3V0cHV0LmlucHV0SWQ7CiAgICAgbVJlZnJlc2hSZW1haW5pbmcgPSB0cnVlOwogCi0gICAgbUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgIG1GcmFtZUNvdW50ID0gb3V0cHV0LmZyYW1lQ291bnQ7CiAgICAgLy8gSWYgSUF1ZGlvUmVjb3JkIGlzIHJlLWNyZWF0ZWQsIGRvbid0IGxldCB0aGUgcmVxdWVzdGVkIGZyYW1lQ291bnQKICAgICAvLyBkZWNyZWFzZS4gIFRoaXMgY2FuIGNvbmZ1c2UgY2xpZW50cyB0aGF0IGNhY2hlIGZyYW1lQ291bnQoKS4KLSAgICBpZiAoZnJhbWVDb3VudCA+IG1SZXFGcmFtZUNvdW50KSB7Ci0gICAgICAgIG1SZXFGcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICBpZiAobUZyYW1lQ291bnQgPiBtUmVxRnJhbWVDb3VudCkgeworICAgICAgICBtUmVxRnJhbWVDb3VudCA9IG1GcmFtZUNvdW50OwogICAgIH0KIAogICAgIC8vIHVwZGF0ZSBwcm94eQpAQCAtNzc2LDE3ICs4MzQsOSBAQAogICAgIG1EZWF0aE5vdGlmaWVyID0gbmV3IERlYXRoTm90aWZpZXIodGhpcyk7CiAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUF1ZGlvUmVjb3JkKS0+bGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOwogCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotCi0gICAgLy8gRW5kIG9mIHJldHJ5IGxvb3AuCi0gICAgLy8gVGhlIGxhY2sgb2YgaW5kZW50YXRpb24gaXMgZGVsaWJlcmF0ZSwgdG8gcmVkdWNlIGNvZGUgY2h1cm4gYW5kIGVhc2UgbWVyZ2VzLgotICAgIH0KLQotLy8gQXJyaXZlIGhlcmUgb24gZXJyb3IsIHZpYSBhIGJyZWFrCi0gICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChpbnB1dCwgbVNlc3Npb25JZCk7Ci0gICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICBzdGF0dXMgPSBOT19JTklUOwotICAgIH0KK2V4aXQ6CisgICAgbVN0YXR1cyA9IHN0YXR1czsKKyAgICAvLyBzcDxJQXVkaW9UcmFjaz4gdHJhY2sgZGVzdHJ1Y3RvciB3aWxsIGNhdXNlIHJlbGVhc2VPdXRwdXQoKSB0byBiZSBjYWxsZWQgYnkgQXVkaW9GbGluZ2VyCiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMTIxNiwyMiArMTI2Niw0MyBAQAogICAgIEFMT0dXKCJkZWFkIElBdWRpb1JlY29yZCwgY3JlYXRpbmcgYSBuZXcgb25lIGZyb20gJXMoKSIsIGZyb20pOwogICAgICsrbVNlcXVlbmNlOwogCisgICAgY29uc3QgaW50IElOSVRJQUxfUkVUUklFUyA9IDM7CisgICAgaW50IHJldHJpZXMgPSBJTklUSUFMX1JFVFJJRVM7CityZXRyeToKKyAgICBpZiAocmV0cmllcyA8IElOSVRJQUxfUkVUUklFUykgeworICAgICAgICAvLyByZWZyZXNoIHRoZSBhdWRpbyBjb25maWd1cmF0aW9uIGNhY2hlIGluIHRoaXMgcHJvY2VzcyB0byBtYWtlIHN1cmUgd2UgZ2V0IG5ldworICAgICAgICAvLyBpbnB1dCBwYXJhbWV0ZXJzIGFuZCBuZXcgSUF1ZGlvUmVjb3JkIGluIGNyZWF0ZVJlY29yZF9sKCkKKyAgICAgICAgQXVkaW9TeXN0ZW06OmNsZWFyQXVkaW9Db25maWdDYWNoZSgpOworICAgIH0KICAgICBtRmxhZ3MgPSBtT3JpZ0ZsYWdzOwogCi0gICAgLy8gaWYgdGhlIG5ldyBJQXVkaW9SZWNvcmQgaXMgY3JlYXRlZCwgb3BlblJlY29yZF9sKCkgd2lsbCBtb2RpZnkgdGhlCisgICAgLy8gaWYgdGhlIG5ldyBJQXVkaW9SZWNvcmQgaXMgY3JlYXRlZCwgY3JlYXRlUmVjb3JkX2woKSB3aWxsIG1vZGlmeSB0aGUKICAgICAvLyBmb2xsb3dpbmcgbWVtYmVyIHZhcmlhYmxlczogbUF1ZGlvUmVjb3JkLCBtQ2Jsa01lbW9yeSwgbUNibGssIG1CdWZmZXJNZW1vcnkuCiAgICAgLy8gSXQgd2lsbCBhbHNvIGRlbGV0ZSB0aGUgc3Ryb25nIHJlZmVyZW5jZXMgb24gcHJldmlvdXMgSUF1ZGlvUmVjb3JkIGFuZCBJTWVtb3J5CiAgICAgTW9kdWxvPHVpbnQzMl90PiBwb3NpdGlvbihtUHJveHktPmdldFBvc2l0aW9uKCkpOwogICAgIG1OZXdQb3NpdGlvbiA9IHBvc2l0aW9uICsgbVVwZGF0ZVBlcmlvZDsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBvcGVuUmVjb3JkX2wocG9zaXRpb24sIG1PcFBhY2thZ2VOYW1lKTsKLSAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gY3JlYXRlUmVjb3JkX2wocG9zaXRpb24sIG1PcFBhY2thZ2VOYW1lKTsKKworICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1coIiVzKCk6IGNyZWF0ZVJlY29yZF9sIGZhaWxlZCwgZG8gbm90IHJldHJ5IiwgX19mdW5jX18pOworICAgICAgICByZXRyaWVzID0gMDsKKyAgICB9IGVsc2UgewogICAgICAgICBpZiAobUFjdGl2ZSkgewogICAgICAgICAgICAgLy8gY2FsbGJhY2sgdGhyZWFkIG9yIHN5bmMgZXZlbnQgaGFzbid0IGNoYW5nZWQKICAgICAgICAgICAgIC8vIEZJWE1FIHRoaXMgZmFpbHMgaWYgd2UgaGF2ZSBhIG5ldyBBdWRpb0ZsaW5nZXIgaW5zdGFuY2UKLSAgICAgICAgICAgIHJlc3VsdCA9IG1BdWRpb1JlY29yZC0+c3RhcnQoQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfU0FNRSwgQVVESU9fU0VTU0lPTl9OT05FKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IG1BdWRpb1JlY29yZC0+c3RhcnQoCisgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfU0FNRSwgQVVESU9fU0VTU0lPTl9OT05FKS50cmFuc2FjdGlvbkVycm9yKCk7CiAgICAgICAgIH0KICAgICAgICAgbUZyYW1lc1JlYWRTZXJ2ZXJPZmZzZXQgPSBtRnJhbWVzUmVhZDsgLy8gc2VydmVyIHJlc2V0cyB0byB6ZXJvIHNvIHdlIG5lZWQgYW4gb2Zmc2V0LgogICAgIH0KKworICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1coIiVzKCkgZmFpbGVkIHN0YXR1cyAlZCwgcmV0cmllcyAlZCIsIF9fZnVuY19fLCByZXN1bHQsIHJldHJpZXMpOworICAgICAgICBpZiAoLS1yZXRyaWVzID4gMCkgeworICAgICAgICAgICAgZ290byByZXRyeTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR1coInJlc3RvcmVSZWNvcmRfbCgpIGZhaWxlZCBzdGF0dXMgJWQiLCByZXN1bHQpOwogICAgICAgICBtQWN0aXZlID0gZmFsc2U7CkBAIC0xMzAzLDYgKzEzNzQsMTQgQEAKICAgICB9CiB9CiAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKQoreworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUmVjb3JkLT5nZXRBY3RpdmVNaWNyb3Bob25lcyhhY3RpdmVNaWNyb3Bob25lcykudHJhbnNhY3Rpb25FcnJvcigpOworfQorCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIHZvaWQgQXVkaW9SZWNvcmQ6OkRlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcAppbmRleCBjZGM3NWFjLi4zOWVlNDM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwCkBAIC0yMCw2ICsyMCw4IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvRmxpbmdlci5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaD4KQEAgLTM4LDggKzQwLDcgQEAKIHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0ZsaW5nZXJDbGllbnQ+IEF1ZGlvU3lzdGVtOjpnQXVkaW9GbGluZ2VyQ2xpZW50OwogYXVkaW9fZXJyb3JfY2FsbGJhY2sgQXVkaW9TeXN0ZW06OmdBdWRpb0Vycm9yQ2FsbGJhY2sgPSBOVUxMOwogZHluYW1pY19wb2xpY3lfY2FsbGJhY2sgQXVkaW9TeXN0ZW06OmdEeW5Qb2xpY3lDYWxsYmFjayA9IE5VTEw7Ci1yZWNvcmRfY29uZmlnX2NhbGxiYWNrICBBdWRpb1N5c3RlbTo6Z1JlY29yZENvbmZpZ0NhbGxiYWNrID0gTlVMTDsKLQorcmVjb3JkX2NvbmZpZ19jYWxsYmFjayBBdWRpb1N5c3RlbTo6Z1JlY29yZENvbmZpZ0NhbGxiYWNrID0gTlVMTDsKIAogLy8gZXN0YWJsaXNoIGJpbmRlciBpbnRlcmZhY2UgdG8gQXVkaW9GbGluZ2VyIHNlcnZpY2UKIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpCkBAIC03NSw3ICs3Niw5IEBACiAgICAgICAgIGFmID0gZ0F1ZGlvRmxpbmdlcjsKICAgICB9CiAgICAgaWYgKGFmYyAhPSAwKSB7CisgICAgICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICBhZi0+cmVnaXN0ZXJDbGllbnQoYWZjKTsKKyAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiAgICAgfQogICAgIHJldHVybiBhZjsKIH0KQEAgLTI1Myw2ICsyNTYsMzEgQEAKICAgICByZXR1cm4gdm9sdW1lID8gMTAwIC0gaW50KGRCQ29udmVydEludmVyc2UgKiBsb2codm9sdW1lKSArIDAuNSkgOiAwOwogfQogCisvKiBzdGF0aWMgKi8gc2l6ZV90IEF1ZGlvU3lzdGVtOjpjYWxjdWxhdGVNaW5GcmFtZUNvdW50KAorICAgICAgICB1aW50MzJfdCBhZkxhdGVuY3lNcywgdWludDMyX3QgYWZGcmFtZUNvdW50LCB1aW50MzJfdCBhZlNhbXBsZVJhdGUsCisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGZsb2F0IHNwZWVkIC8qLCB1aW50MzJfdCBub3RpZmljYXRpb25zUGVyQnVmZmVyUmVxKi8pCit7CisgICAgLy8gRW5zdXJlIHRoYXQgYnVmZmVyIGRlcHRoIGNvdmVycyBhdCBsZWFzdCBhdWRpbyBoYXJkd2FyZSBsYXRlbmN5CisgICAgdWludDMyX3QgbWluQnVmQ291bnQgPSBhZkxhdGVuY3lNcyAvICgoMTAwMCAqIGFmRnJhbWVDb3VudCkgLyBhZlNhbXBsZVJhdGUpOworICAgIGlmIChtaW5CdWZDb3VudCA8IDIpIHsKKyAgICAgICAgbWluQnVmQ291bnQgPSAyOworICAgIH0KKyNpZiAwCisgICAgLy8gVGhlIG5vdGlmaWNhdGlvbnNQZXJCdWZmZXJSZXEgcGFyYW1ldGVyIGlzIG5vdCB5ZXQgdXNlZCBmb3Igbm9uLWZhc3QgdHJhY2tzLAorICAgIC8vIGJ1dCBrZWVwaW5nIHRoZSBjb2RlIGhlcmUgdG8gbWFrZSBpdCBlYXNpZXIgdG8gYWRkIGxhdGVyLgorICAgIGlmIChtaW5CdWZDb3VudCA8IG5vdGlmaWNhdGlvbnNQZXJCdWZmZXJSZXEpIHsKKyAgICAgICAgbWluQnVmQ291bnQgPSBub3RpZmljYXRpb25zUGVyQnVmZmVyUmVxOworICAgIH0KKyNlbmRpZgorICAgIEFMT0dWKCJjYWxjdWxhdGVNaW5GcmFtZUNvdW50IGFmTGF0ZW5jeSAldSAgYWZGcmFtZUNvdW50ICV1ICBhZlNhbXBsZVJhdGUgJXUgICIKKyAgICAgICAgICAgICJzYW1wbGVSYXRlICV1ICBzcGVlZCAlZiAgbWluQnVmQ291bnQ6ICV1IiAvKiIgIG5vdGlmaWNhdGlvbnNQZXJCdWZmZXJSZXEgJXUiKi8sCisgICAgICAgICAgICBhZkxhdGVuY3lNcywgYWZGcmFtZUNvdW50LCBhZlNhbXBsZVJhdGUsIHNhbXBsZVJhdGUsIHNwZWVkLCBtaW5CdWZDb3VudAorICAgICAgICAgICAgLyosIG5vdGlmaWNhdGlvbnNQZXJCdWZmZXJSZXEqLyk7CisgICAgcmV0dXJuIG1pbkJ1ZkNvdW50ICogc291cmNlRnJhbWVzTmVlZGVkV2l0aFRpbWVzdHJldGNoKAorICAgICAgICAgICAgc2FtcGxlUmF0ZSwgYWZGcmFtZUNvdW50LCBhZlNhbXBsZVJhdGUsIHNwZWVkKTsKK30KKworCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0U2FtcGxpbmdSYXRlKHVpbnQzMl90KiBzYW1wbGluZ1JhdGUsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkKIHsKICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQ7CkBAIC02MDUsNyArNjMzLDcgQEAKICAgICAgICAgfHwgKGNoYW5uZWxNYXNrICE9IG1JbkNoYW5uZWxNYXNrKSkgewogICAgICAgICBzaXplX3QgaW5CdWZmU2l6ZSA9IGFmLT5nZXRJbnB1dEJ1ZmZlclNpemUoc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzayk7CiAgICAgICAgIGlmIChpbkJ1ZmZTaXplID09IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJBdWRpb1N5c3RlbTo6Z2V0SW5wdXRCdWZmZXJTaXplIGZhaWxlZCBzYW1wbGVSYXRlICVkIGZvcm1hdCAlI3ggY2hhbm5lbE1hc2sgJXgiLAorICAgICAgICAgICAgQUxPR0UoIkF1ZGlvU3lzdGVtOjpnZXRJbnB1dEJ1ZmZlclNpemUgZmFpbGVkIHNhbXBsZVJhdGUgJWQgZm9ybWF0ICUjeCBjaGFubmVsTWFzayAlI3giLAogICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KQEAgLTc0Miw3ICs3NzAsMTAgQEAKICAgICAgICAgYXAgPSBnQXVkaW9Qb2xpY3lTZXJ2aWNlOwogICAgIH0KICAgICBpZiAoYXBjICE9IDApIHsKKyAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIGFwLT5yZWdpc3RlckNsaWVudChhcGMpOworICAgICAgICBhcC0+c2V0QXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChhcGMtPmlzQXVkaW9Qb3J0Q2JFbmFibGVkKCkpOworICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKICAgICB9CiAKICAgICByZXR1cm4gYXA7CkBAIC04MjIsMjIgKzg1MywxOCBAQAogfQogCiAKLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQorYXVkaW9faW9faGFuZGxlX3QgQXVkaW9TeXN0ZW06OmdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIGFwcy0+Z2V0T3V0cHV0KHN0cmVhbSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncywgb2ZmbG9hZEluZm8pOworICAgIHJldHVybiBhcHMtPmdldE91dHB1dChzdHJlYW0pOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLApAQCAtODQ2LDcgKzg3Myw3IEBACiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBhcHMtPmdldE91dHB1dEZvckF0dHIoYXR0ciwgb3V0cHV0LCBzZXNzaW9uLCBzdHJlYW0sIHVpZCwKKyAgICByZXR1cm4gYXBzLT5nZXRPdXRwdXRGb3JBdHRyKGF0dHIsIG91dHB1dCwgc2Vzc2lvbiwgc3RyZWFtLCBwaWQsIHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQpOwogfQpAQCAtODgzLDYgKzkxMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKQEAgLTg5MSwzMiArOTE5LDI5IEBACiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBhcHMtPmdldElucHV0Rm9yQXR0cigKLSAgICAgICAgICAgIGF0dHIsIGlucHV0LCBzZXNzaW9uLCBwaWQsIHVpZCwKKyAgICAgICAgICAgIGF0dHIsIGlucHV0LCBzZXNzaW9uLCBwaWQsIHVpZCwgb3BQYWNrYWdlTmFtZSwKICAgICAgICAgICAgIGNvbmZpZywgZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgYm9vbCAqc2lsZW5jZWQpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5zdGFydElucHV0KGlucHV0LCBzZXNzaW9uKTsKKyAgICByZXR1cm4gYXBzLT5zdGFydElucHV0KHBvcnRJZCwgc2lsZW5jZWQpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5zdG9wSW5wdXQoaW5wdXQsIHNlc3Npb24pOworICAgIHJldHVybiBhcHMtPnN0b3BJbnB1dChwb3J0SWQpOwogfQogCi12b2lkIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit2b2lkIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybjsKLSAgICBhcHMtPnJlbGVhc2VJbnB1dChpbnB1dCwgc2Vzc2lvbik7CisgICAgYXBzLT5yZWxlYXNlSW5wdXQocG9ydElkKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCkBAIC0xMDM1LDExICsxMDYwLDExIEBACiAgICAgcmV0dXJuIGFmLT5nZXRQcmltYXJ5T3V0cHV0RnJhbWVDb3VudCgpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0TG93UmFtRGV2aWNlKGJvb2wgaXNMb3dSYW1EZXZpY2UpCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0TG93UmFtRGV2aWNlKGJvb2wgaXNMb3dSYW1EZXZpY2UsIGludDY0X3QgdG90YWxNZW1vcnkpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYWYtPnNldExvd1JhbURldmljZShpc0xvd1JhbURldmljZSk7CisgICAgcmV0dXJuIGFmLT5zZXRMb3dSYW1EZXZpY2UoaXNMb3dSYW1EZXZpY2UsIHRvdGFsTWVtb3J5KTsKIH0KIAogdm9pZCBBdWRpb1N5c3RlbTo6Y2xlYXJBdWRpb0NvbmZpZ0NhY2hlKCkKQEAgLTEyNTQsNiArMTI3OSwxMyBAQAogICAgIHJldHVybiBhcHMtPmdldFN0cmVhbVZvbHVtZURCKHN0cmVhbSwgaW5kZXgsIGRldmljZSk7CiB9CiAKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhZi0+Z2V0TWljcm9waG9uZXMobWljcm9waG9uZXMpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogaW50IEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OmFkZEF1ZGlvUG9ydENhbGxiYWNrKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFjay5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcAppbmRleCAzNTI5ZDJjLi5hYjllZmU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcApAQCAtMjksOCArMjksMTEgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+CisjaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgogCiAjZGVmaW5lIFdBSVRfUEVSSU9EX01TICAgICAgICAgICAgICAgICAgMTAKICNkZWZpbmUgV0FJVF9TVFJFQU1fRU5EX1RJTUVPVVRfU0VDICAgICAxMjAKQEAgLTM5LDYgKzQyLDggQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCit1c2luZyBtZWRpYTo6Vm9sdW1lU2hhcGVyOworCiAvLyBUT0RPOiBNb3ZlIHRvIGEgc2VwYXJhdGUgLmgKIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CkBAIC01MSw4ICs1Niw2IEBACiAgICAgcmV0dXJuIHggPiB5ID8geCA6IHk7CiB9CiAKLXN0YXRpYyBjb25zdCBpbnQzMl90IE5BTk9TX1BFUl9TRUNPTkQgPSAxMDAwMDAwMDAwOwotCiBzdGF0aWMgaW5saW5lIG5zZWNzX3QgZnJhbWVzVG9OYW5vc2Vjb25kcyhzc2l6ZV90IGZyYW1lcywgdWludDMyX3Qgc2FtcGxlUmF0ZSwgZmxvYXQgc3BlZWQpCiB7CiAgICAgcmV0dXJuICgoZG91YmxlKWZyYW1lcyAqIDEwMDAwMDAwMDApIC8gKChkb3VibGUpc2FtcGxlUmF0ZSAqIHNwZWVkKTsKQEAgLTk3LDMyICsxMDAsNiBAQAogICAgIHJldHVybiBrRml4UGl0Y2ggPyBBVURJT19USU1FU1RSRVRDSF9QSVRDSF9OT1JNQUwgOiBwaXRjaDsKIH0KIAotLy8gTXVzdCBtYXRjaCBzaW1pbGFyIGNvbXB1dGF0aW9uIGluIGNyZWF0ZVRyYWNrX2wgaW4gVGhyZWFkcy5jcHAuCi0vLyBUT0RPOiBNb3ZlIHRvIGEgY29tbW9uIGxpYnJhcnkKLXN0YXRpYyBzaXplX3QgY2FsY3VsYXRlTWluRnJhbWVDb3VudCgKLSAgICAgICAgdWludDMyX3QgYWZMYXRlbmN5TXMsIHVpbnQzMl90IGFmRnJhbWVDb3VudCwgdWludDMyX3QgYWZTYW1wbGVSYXRlLAotICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCBmbG9hdCBzcGVlZCAvKiwgdWludDMyX3Qgbm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSovKQotewotICAgIC8vIEVuc3VyZSB0aGF0IGJ1ZmZlciBkZXB0aCBjb3ZlcnMgYXQgbGVhc3QgYXVkaW8gaGFyZHdhcmUgbGF0ZW5jeQotICAgIHVpbnQzMl90IG1pbkJ1ZkNvdW50ID0gYWZMYXRlbmN5TXMgLyAoKDEwMDAgKiBhZkZyYW1lQ291bnQpIC8gYWZTYW1wbGVSYXRlKTsKLSAgICBpZiAobWluQnVmQ291bnQgPCAyKSB7Ci0gICAgICAgIG1pbkJ1ZkNvdW50ID0gMjsKLSAgICB9Ci0jaWYgMAotICAgIC8vIFRoZSBub3RpZmljYXRpb25zUGVyQnVmZmVyUmVxIHBhcmFtZXRlciBpcyBub3QgeWV0IHVzZWQgZm9yIG5vbi1mYXN0IHRyYWNrcywKLSAgICAvLyBidXQga2VlcGluZyB0aGUgY29kZSBoZXJlIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGFkZCBsYXRlci4KLSAgICBpZiAobWluQnVmQ291bnQgPCBub3RpZmljYXRpb25zUGVyQnVmZmVyUmVxKSB7Ci0gICAgICAgIG1pbkJ1ZkNvdW50ID0gbm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcTsKLSAgICB9Ci0jZW5kaWYKLSAgICBBTE9HVigiY2FsY3VsYXRlTWluRnJhbWVDb3VudCBhZkxhdGVuY3kgJXUgIGFmRnJhbWVDb3VudCAldSAgYWZTYW1wbGVSYXRlICV1ICAiCi0gICAgICAgICAgICAic2FtcGxlUmF0ZSAldSAgc3BlZWQgJWYgIG1pbkJ1ZkNvdW50OiAldSIgLyoiICBub3RpZmljYXRpb25zUGVyQnVmZmVyUmVxICV1IiovLAotICAgICAgICAgICAgYWZMYXRlbmN5TXMsIGFmRnJhbWVDb3VudCwgYWZTYW1wbGVSYXRlLCBzYW1wbGVSYXRlLCBzcGVlZCwgbWluQnVmQ291bnQKLSAgICAgICAgICAgIC8qLCBub3RpZmljYXRpb25zUGVyQnVmZmVyUmVxKi8pOwotICAgIHJldHVybiBtaW5CdWZDb3VudCAqIHNvdXJjZUZyYW1lc05lZWRlZFdpdGhUaW1lc3RyZXRjaCgKLSAgICAgICAgICAgIHNhbXBsZVJhdGUsIGFmRnJhbWVDb3VudCwgYWZTYW1wbGVSYXRlLCBzcGVlZCk7Ci19Ci0KIC8vIHN0YXRpYwogc3RhdHVzX3QgQXVkaW9UcmFjazo6Z2V0TWluRnJhbWVDb3VudCgKICAgICAgICAgc2l6ZV90KiBmcmFtZUNvdW50LApAQCAtMTYzLDggKzE0MCw4IEBACiAKICAgICAvLyBXaGVuIGNhbGxlZCBmcm9tIGNyZWF0ZVRyYWNrLCBzcGVlZCBpcyAxLjBmIChub3JtYWwgc3BlZWQpLgogICAgIC8vIFRoaXMgaXMgcmVjaGVja2VkIGFnYWluIG9uIHNldHRpbmcgcGxheWJhY2sgcmF0ZSAoVE9ETzogb24gc2V0dGluZyBzYW1wbGUgcmF0ZSwgdG9vKS4KLSAgICAqZnJhbWVDb3VudCA9IGNhbGN1bGF0ZU1pbkZyYW1lQ291bnQoYWZMYXRlbmN5LCBhZkZyYW1lQ291bnQsIGFmU2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSwgMS4wZgotICAgICAgICAgICAgLyosIDAgbm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSovKTsKKyAgICAqZnJhbWVDb3VudCA9IEF1ZGlvU3lzdGVtOjpjYWxjdWxhdGVNaW5GcmFtZUNvdW50KGFmTGF0ZW5jeSwgYWZGcmFtZUNvdW50LCBhZlNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgMS4wZiAvKiwgMCBub3RpZmljYXRpb25zUGVyQnVmZmVyUmVxKi8pOwogCiAgICAgLy8gVGhlIGZvcm11bGEgYWJvdmUgc2hvdWxkIGFsd2F5cyBwcm9kdWNlIGEgbm9uLXplcm8gdmFsdWUgdW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXM6CiAgICAgLy8gQXVkaW9UcmFjay5TQU1QTEVfUkFURV9IWl9NSU4gPD0gc2FtcGxlUmF0ZSA8PSBBdWRpb1RyYWNrLlNBTVBMRV9SQVRFX0haX01BWC4KQEAgLTE4MSw2ICsxNTgsODggQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK3N0YXRpYyBzdGQ6OnN0cmluZyBhdWRpb0NvbnRlbnRUeXBlU3RyaW5nKGF1ZGlvX2NvbnRlbnRfdHlwZV90IHZhbHVlKSB7CisgICAgc3RkOjpzdHJpbmcgY29udGVudFR5cGU7CisgICAgaWYgKEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKHZhbHVlLCBjb250ZW50VHlwZSkpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRUeXBlOworICAgIH0KKyAgICBjaGFyIHJhd2J1ZmZlclsxNl07ICAvLyByb29tIGZvciAiJWQiCisgICAgc25wcmludGYocmF3YnVmZmVyLCBzaXplb2YocmF3YnVmZmVyKSwgIiVkIiwgdmFsdWUpOworICAgIHJldHVybiByYXdidWZmZXI7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBhdWRpb1VzYWdlU3RyaW5nKGF1ZGlvX3VzYWdlX3QgdmFsdWUpIHsKKyAgICBzdGQ6OnN0cmluZyB1c2FnZTsKKyAgICBpZiAoVXNhZ2VUeXBlQ29udmVydGVyOjp0b1N0cmluZyh2YWx1ZSwgdXNhZ2UpKSB7CisgICAgICAgIHJldHVybiB1c2FnZTsKKyAgICB9CisgICAgY2hhciByYXdidWZmZXJbMTZdOyAgLy8gcm9vbSBmb3IgIiVkIgorICAgIHNucHJpbnRmKHJhd2J1ZmZlciwgc2l6ZW9mKHJhd2J1ZmZlciksICIlZCIsIHZhbHVlKTsKKyAgICByZXR1cm4gcmF3YnVmZmVyOworfQorCit2b2lkIEF1ZGlvVHJhY2s6Ok1lZGlhTWV0cmljczo6Z2F0aGVyKGNvbnN0IEF1ZGlvVHJhY2sgKnRyYWNrKQoreworCisgICAgLy8ga2V5IGZvciBtZWRpYSBzdGF0aXN0aWNzIGlzIGRlZmluZWQgaW4gdGhlIGhlYWRlcgorICAgIC8vIGF0dHJzIGZvciBtZWRpYSBzdGF0aXN0aWNzCisgICAgLy8gTkI6IHRoZXNlIGFyZSBtYXRjaGVkIHdpdGggcHVibGljIEphdmEgQVBJIGNvbnN0YW50cyBkZWZpbmVkCisgICAgLy8gaW4gZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrLmphdmEKKyAgICAvLyBUaGVzZSBtdXN0IGJlIGtlcHQgc3luY2hyb25pemVkIHdpdGggdGhlIGNvbnN0YW50cyB0aGVyZS4KKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvVHJhY2tTdHJlYW1UeXBlW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLnN0cmVhbXR5cGUiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9UcmFja0NvbnRlbnRUeXBlW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLnR5cGUiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9UcmFja1VzYWdlW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLnVzYWdlIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvVHJhY2tTYW1wbGVSYXRlW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLnNhbXBsZXJhdGUiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9UcmFja0NoYW5uZWxNYXNrW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLmNoYW5uZWxtYXNrIjsKKworICAgIC8vIE5COiBUaGVzZSBhcmUgbm90IHlldCBleHBvc2VkIGFzIHB1YmxpYyBKYXZhIEFQSSBjb25zdGFudHMuCisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1RyYWNrVW5kZXJydW5GcmFtZXNbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2sudW5kZXJydW5mcmFtZXMiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9UcmFja1N0YXJ0dXBHbGl0Y2hbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suZ2xpdGNoLnN0YXJ0dXAiOworCisgICAgLy8gb25seSBpZiB3ZSdyZSBpbiBhIGdvb2Qgc3RhdGUuLi4KKyAgICAvLyBYWFg6IHNoYWxsIHdlIGdhdGhlciBhbHRlcm5hdGl2ZSBpbmZvIGlmIGZhaWxpbmc/CisgICAgY29uc3Qgc3RhdHVzX3QgbHN0YXR1cyA9IHRyYWNrLT5pbml0Q2hlY2soKTsKKyAgICBpZiAobHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRCgibm8gbWV0cmljcyBnYXRoZXJlZCwgdHJhY2sgc3RhdHVzPSVkIiwgKGludCkgbHN0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBjb25zdHJ1Y3RvciBndWFyYW50ZWVzIG1BbmFseXRpY3NJdGVtIGlzIHZhbGlkCisKKyAgICBjb25zdCBpbnQzMl90IHVuZGVycnVuRnJhbWVzID0gdHJhY2stPmdldFVuZGVycnVuRnJhbWVzKCk7CisgICAgaWYgKHVuZGVycnVuRnJhbWVzICE9IDApIHsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtBdWRpb1RyYWNrVW5kZXJydW5GcmFtZXMsIHVuZGVycnVuRnJhbWVzKTsKKyAgICB9CisKKyAgICBpZiAodHJhY2stPm1UaW1lc3RhbXBTdGFydHVwR2xpdGNoUmVwb3J0ZWQpIHsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtBdWRpb1RyYWNrU3RhcnR1cEdsaXRjaCwgMSk7CisgICAgfQorCisgICAgaWYgKHRyYWNrLT5tU3RyZWFtVHlwZSAhPSAtMSkgeworICAgICAgICAvLyBkZXByZWNhdGVkLCBidXQgdGhpcyB3aWxsIHRlbGwgdXMgd2hvIHN0aWxsIHVzZXMgaXQuCisgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQXVkaW9UcmFja1N0cmVhbVR5cGUsIHRyYWNrLT5tU3RyZWFtVHlwZSk7CisgICAgfQorICAgIC8vIFhYWDogY29uc2lkZXIgaW5jbHVkaW5nIGZyb20gbUF0dHJpYnV0ZXM6IHNvdXJjZSB0eXBlCisgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa0F1ZGlvVHJhY2tDb250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0NvbnRlbnRUeXBlU3RyaW5nKHRyYWNrLT5tQXR0cmlidXRlcy5jb250ZW50X3R5cGUpLmNfc3RyKCkpOworICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1RyYWNrVXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Vc2FnZVN0cmluZyh0cmFjay0+bUF0dHJpYnV0ZXMudXNhZ2UpLmNfc3RyKCkpOworICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQXVkaW9UcmFja1NhbXBsZVJhdGUsIHRyYWNrLT5tU2FtcGxlUmF0ZSk7CisgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtBdWRpb1RyYWNrQ2hhbm5lbE1hc2ssIHRyYWNrLT5tQ2hhbm5lbE1hc2spOworfQorCisvLyBoYW5kIHRoZSB1c2VyIGEgc25hcHNob3Qgb2YgdGhlIG1ldHJpY3MuCitzdGF0dXNfdCBBdWRpb1RyYWNrOjpnZXRNZXRyaWNzKE1lZGlhQW5hbHl0aWNzSXRlbSAqICZpdGVtKQoreworICAgIG1NZWRpYU1ldHJpY3MuZ2F0aGVyKHRoaXMpOworICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqdG1wID0gbU1lZGlhTWV0cmljcy5kdXAoKTsKKyAgICBpZiAodG1wID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaXRlbSA9IHRtcDsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKIEF1ZGlvVHJhY2s6OkF1ZGlvVHJhY2soKQogICAgIDogbVN0YXR1cyhOT19JTklUKSwKICAgICAgIG1TdGF0ZShTVEFURV9TVE9QUEVEKSwKQEAgLTE4OCw4ICsyNDcsNyBAQAogICAgICAgbVByZXZpb3VzU2NoZWR1bGluZ0dyb3VwKFNQX0RFRkFVTFQpLAogICAgICAgbVBhdXNlZFBvc2l0aW9uKDApLAogICAgICAgbVNlbGVjdGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksCi0gICAgICBtUm91dGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksCi0gICAgICBtUG9ydElkKEFVRElPX1BPUlRfSEFORExFX05PTkUpCisgICAgICBtUm91dGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkKIHsKICAgICBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTjsKICAgICBtQXR0cmlidXRlcy51c2FnZSA9IEFVRElPX1VTQUdFX1VOS05PV047CkBAIC0yMTQsMTkgKzI3MiwxOCBAQAogICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMsCiAgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QsCi0gICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQpCisgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQsCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCkKICAgICA6IG1TdGF0dXMoTk9fSU5JVCksCiAgICAgICBtU3RhdGUoU1RBVEVfU1RPUFBFRCksCiAgICAgICBtUHJldmlvdXNQcmlvcml0eShBTkRST0lEX1BSSU9SSVRZX05PUk1BTCksCiAgICAgICBtUHJldmlvdXNTY2hlZHVsaW5nR3JvdXAoU1BfREVGQVVMVCksCi0gICAgICBtUGF1c2VkUG9zaXRpb24oMCksCi0gICAgICBtU2VsZWN0ZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwKLSAgICAgIG1Qb3J0SWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkKKyAgICAgIG1QYXVzZWRQb3NpdGlvbigwKQogewotICAgIG1TdGF0dXMgPSBzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKKyAgICAodm9pZClzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIGZyYW1lQ291bnQsIGZsYWdzLCBjYmYsIHVzZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICAgIDAgLypzaGFyZWRCdWZmZXIqLywgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLCBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwKLSAgICAgICAgICAgIG9mZmxvYWRJbmZvLCB1aWQsIHBpZCwgcEF0dHJpYnV0ZXMsIGRvTm90UmVjb25uZWN0LCBtYXhSZXF1aXJlZFNwZWVkKTsKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvLCB1aWQsIHBpZCwgcEF0dHJpYnV0ZXMsIGRvTm90UmVjb25uZWN0LCBtYXhSZXF1aXJlZFNwZWVkLCBzZWxlY3RlZERldmljZUlkKTsKIH0KIAogQXVkaW9UcmFjazo6QXVkaW9UcmFjaygKQEAgLTI1MiwxMCArMzA5LDkgQEAKICAgICAgIG1QcmV2aW91c1ByaW9yaXR5KEFORFJPSURfUFJJT1JJVFlfTk9STUFMKSwKICAgICAgIG1QcmV2aW91c1NjaGVkdWxpbmdHcm91cChTUF9ERUZBVUxUKSwKICAgICAgIG1QYXVzZWRQb3NpdGlvbigwKSwKLSAgICAgIG1TZWxlY3RlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAotICAgICAgbVBvcnRJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKQorICAgICAgbVNlbGVjdGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkKIHsKLSAgICBtU3RhdHVzID0gc2V0KHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCisgICAgKHZvaWQpc2V0KHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAwIC8qZnJhbWVDb3VudCovLCBmbGFncywgY2JmLCB1c2VyLCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgICAgICBzaGFyZWRCdWZmZXIsIGZhbHNlIC8qdGhyZWFkQ2FuQ2FsbEphdmEqLywgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIG9mZmxvYWRJbmZvLAogICAgICAgICAgICAgdWlkLCBwaWQsIHBBdHRyaWJ1dGVzLCBkb05vdFJlY29ubmVjdCwgbWF4UmVxdWlyZWRTcGVlZCk7CkBAIC0yNjMsNiArMzE5LDkgQEAKIAogQXVkaW9UcmFjazo6fkF1ZGlvVHJhY2soKQogeworICAgIC8vIHB1bGwgdG9nZXRoZXIgdGhlIG51bWJlcnMsIGJlZm9yZSB3ZSBjbGVhbiB1cCBvdXIgc3RydWN0dXJlcworICAgIG1NZWRpYU1ldHJpY3MuZ2F0aGVyKHRoaXMpOworCiAgICAgaWYgKG1TdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgY2FsbGJhY2sgZnVuY3Rpb24gZXhpdHMgaW4gdGhlIGNhc2Ugd2hlcmUKICAgICAgICAgLy8gaXQgaXMgbG9vcGluZyBvbiBidWZmZXIgZnVsbCBjb25kaXRpb24gaW4gb2J0YWluQnVmZmVyKCkuCkBAIC0zMDgsMTQgKzM2NywyMiBAQAogICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMsCiAgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QsCi0gICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQpCisgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQsCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCkKIHsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgdWludDMyX3QgY2hhbm5lbENvdW50OworICAgIHBpZF90IGNhbGxpbmdQaWQ7CisgICAgcGlkX3QgbXlQaWQ7CisKICAgICBBTE9HVigic2V0KCk6IHN0cmVhbVR5cGUgJWQsIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCwgZnJhbWVDb3VudCAlenUsICIKICAgICAgICAgICAiZmxhZ3MgIyV4LCBub3RpZmljYXRpb25GcmFtZXMgJWQsIHNlc3Npb25JZCAlZCwgdHJhbnNmZXJUeXBlICVkLCB1aWQgJWQsIHBpZCAlZCIsCiAgICAgICAgICAgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgZmxhZ3MsIG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgdWlkLCBwaWQpOwogCiAgICAgbVRocmVhZENhbkNhbGxKYXZhID0gdGhyZWFkQ2FuQ2FsbEphdmE7CisgICAgbVNlbGVjdGVkRGV2aWNlSWQgPSBzZWxlY3RlZERldmljZUlkOworICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CiAKICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewogICAgIGNhc2UgVFJBTlNGRVJfREVGQVVMVDoKQEAgLTMzMCwyNSArMzk3LDI5IEBACiAgICAgY2FzZSBUUkFOU0ZFUl9DQUxMQkFDSzoKICAgICAgICAgaWYgKGNiZiA9PSBOVUxMIHx8IHNoYXJlZEJ1ZmZlciAhPSAwKSB7CiAgICAgICAgICAgICBBTE9HRSgiVHJhbnNmZXIgdHlwZSBUUkFOU0ZFUl9DQUxMQkFDSyBidXQgY2JmID09IE5VTEwgfHwgc2hhcmVkQnVmZmVyICE9IDAiKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBUUkFOU0ZFUl9PQlRBSU46CiAgICAgY2FzZSBUUkFOU0ZFUl9TWU5DOgogICAgICAgICBpZiAoc2hhcmVkQnVmZmVyICE9IDApIHsKICAgICAgICAgICAgIEFMT0dFKCJUcmFuc2ZlciB0eXBlIFRSQU5TRkVSX09CVEFJTiBidXQgc2hhcmVkQnVmZmVyICE9IDAiKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBUUkFOU0ZFUl9TSEFSRUQ6CiAgICAgICAgIGlmIChzaGFyZWRCdWZmZXIgPT0gMCkgewogICAgICAgICAgICAgQUxPR0UoIlRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfU0hBUkVEIGJ1dCBzaGFyZWRCdWZmZXIgPT0gMCIpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICBBTE9HRSgiSW52YWxpZCB0cmFuc2ZlciB0eXBlICVkIiwgdHJhbnNmZXJUeXBlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogICAgIG1TaGFyZWRCdWZmZXIgPSBzaGFyZWRCdWZmZXI7CiAgICAgbVRyYW5zZmVyID0gdHJhbnNmZXJUeXBlOwpAQCAtMzYyLDcgKzQzMyw4IEBACiAgICAgLy8gaW52YXJpYW50IHRoYXQgbUF1ZGlvVHJhY2sgIT0gMCBpcyB0cnVlIG9ubHkgYWZ0ZXIgc2V0KCkgcmV0dXJucyBzdWNjZXNzZnVsbHkKICAgICBpZiAobUF1ZGlvVHJhY2sgIT0gMCkgewogICAgICAgICBBTE9HRSgiVHJhY2sgYWxyZWFkeSBpbiB1c2UiKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgZ290byBleGl0OwogICAgIH0KIAogICAgIC8vIGhhbmRsZSBkZWZhdWx0IHZhbHVlcyBmaXJzdC4KQEAgLTM3Miw3ICs0NDQsOCBAQAogICAgIGlmIChwQXR0cmlidXRlcyA9PSBOVUxMKSB7CiAgICAgICAgIGlmICh1aW50MzJfdChzdHJlYW1UeXBlKSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgewogICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgc3RyZWFtIHR5cGUgJWQiLCBzdHJlYW1UeXBlKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KICAgICAgICAgbVN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOwogCkBAIC00MDQsMTYgKzQ3NywxOCBAQAogICAgIC8vIHZhbGlkYXRlIHBhcmFtZXRlcnMKICAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpKSB7CiAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGZvcm1hdCAlI3giLCBmb3JtYXQpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAgICAgbUZvcm1hdCA9IGZvcm1hdDsKIAogICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spKSB7CiAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGNoYW5uZWwgbWFzayAlI3giLCBjaGFubmVsTWFzayk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICBtQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKLSAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOworICAgIGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7CiAgICAgbUNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDsKIAogICAgIC8vIGZvcmNlIGRpcmVjdCBmbGFnIGlmIGZvcm1hdCBpcyBub3QgbGluZWFyIFBDTQpAQCAtNDQ4LDcgKzUyMyw4IEBACiAKICAgICAvLyBzYW1wbGluZyByYXRlIG11c3QgYmUgc3BlY2lmaWVkIGZvciBkaXJlY3Qgb3V0cHV0cwogICAgIGlmIChzYW1wbGVSYXRlID09IDAgJiYgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICBtU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CiAgICAgbU9yaWdpbmFsU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CkBAIC00NzksMTIgKzU1NSwxNCBAQAogICAgICAgICBpZiAoIShmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpKSB7CiAgICAgICAgICAgICBBTE9HRSgibm90aWZpY2F0aW9uRnJhbWVzPSVkIG5vdCBwZXJtaXR0ZWQgZm9yIG5vbi1mYXN0IHRyYWNrIiwKICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGZyYW1lQ291bnQgPiAwKSB7CiAgICAgICAgICAgICBBTE9HRSgibm90aWZpY2F0aW9uRnJhbWVzPSVkIG5vdCBwZXJtaXR0ZWQgd2l0aCBub24temVybyBmcmFtZUNvdW50PSV6dSIsCiAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywgZnJhbWVDb3VudCk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CiAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNSZXEgPSAwOwogICAgICAgICBjb25zdCB1aW50MzJfdCBtaW5Ob3RpZmljYXRpb25zUGVyQnVmZmVyID0gMTsKQEAgLTQ5NiwyMCArNTc0LDE1IEBACiAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLCBtaW5Ob3RpZmljYXRpb25zUGVyQnVmZmVyLCBtYXhOb3RpZmljYXRpb25zUGVyQnVmZmVyKTsKICAgICB9CiAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9IDA7Ci0gICAgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX0FMTE9DQVRFKSB7Ci0gICAgICAgIG1TZXNzaW9uSWQgPSAoYXVkaW9fc2Vzc2lvbl90KSBBdWRpb1N5c3RlbTo6bmV3QXVkaW9VbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX1NFU1NJT04pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7Ci0gICAgfQotICAgIGludCBjYWxsaW5ncGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgIGludCBteXBpZCA9IGdldHBpZCgpOwotICAgIGlmICh1aWQgPT0gQVVESU9fVUlEX0lOVkFMSUQgfHwgKGNhbGxpbmdwaWQgIT0gbXlwaWQpKSB7CisgICAgY2FsbGluZ1BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKKyAgICBteVBpZCA9IGdldHBpZCgpOworICAgIGlmICh1aWQgPT0gQVVESU9fVUlEX0lOVkFMSUQgfHwgKGNhbGxpbmdQaWQgIT0gbXlQaWQpKSB7CiAgICAgICAgIG1DbGllbnRVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUNsaWVudFVpZCA9IHVpZDsKICAgICB9Ci0gICAgaWYgKHBpZCA9PSAtMSB8fCAoY2FsbGluZ3BpZCAhPSBteXBpZCkpIHsKLSAgICAgICAgbUNsaWVudFBpZCA9IGNhbGxpbmdwaWQ7CisgICAgaWYgKHBpZCA9PSAtMSB8fCAoY2FsbGluZ1BpZCAhPSBteVBpZCkpIHsKKyAgICAgICAgbUNsaWVudFBpZCA9IGNhbGxpbmdQaWQ7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUNsaWVudFBpZCA9IHBpZDsKICAgICB9CkBAIC01MjQsNyArNTk3LDcgQEAKICAgICB9CiAKICAgICAvLyBjcmVhdGUgdGhlIElBdWRpb1RyYWNrCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gY3JlYXRlVHJhY2tfbCgpOworICAgIHN0YXR1cyA9IGNyZWF0ZVRyYWNrX2woKTsKIAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgaWYgKG1BdWRpb1RyYWNrVGhyZWFkICE9IDApIHsKQEAgLTUzMiwxMCArNjA1LDkgQEAKICAgICAgICAgICAgIG1BdWRpb1RyYWNrVGhyZWFkLT5yZXF1ZXN0RXhpdEFuZFdhaXQoKTsKICAgICAgICAgICAgIG1BdWRpb1RyYWNrVGhyZWFkLmNsZWFyKCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgZ290byBleGl0OwogICAgIH0KIAotICAgIG1TdGF0dXMgPSBOT19FUlJPUjsKICAgICBtVXNlckRhdGEgPSB1c2VyOwogICAgIG1Mb29wQ291bnQgPSAwOwogICAgIG1Mb29wU3RhcnQgPSAwOwpAQCAtNTYyLDggKzYzNCwxMSBAQAogICAgIG1GcmFtZXNXcml0dGVuID0gMDsKICAgICBtRnJhbWVzV3JpdHRlblNlcnZlck9mZnNldCA9IDA7CiAgICAgbUZyYW1lc1dyaXR0ZW5BdFJlc3RvcmUgPSAtMTsgLy8gLTEgaXMgYSB1bmlxdWUgaW5pdGlhbGl6ZXIuCi0gICAgbVZvbHVtZUhhbmRsZXIgPSBuZXcgVm9sdW1lSGFuZGxlcigpOwotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICBtVm9sdW1lSGFuZGxlciA9IG5ldyBtZWRpYTo6Vm9sdW1lSGFuZGxlcigpOworCitleGl0OgorICAgIG1TdGF0dXMgPSBzdGF0dXM7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNjk1LDYgKzc3MCw3IEBACiAgICAgICAgIG1SZWxlYXNlZCA9IDA7CiAgICAgfQogCisgICAgbVByb3h5LT5zdG9wKCk7IC8vIG5vdGlmeSBzZXJ2ZXIgbm90IHRvIHJlYWQgYmV5b25kIGN1cnJlbnQgY2xpZW50IHBvc2l0aW9uIHVudGlsIHN0YXJ0KCkuCiAgICAgbVByb3h5LT5pbnRlcnJ1cHQoKTsKICAgICBtQXVkaW9UcmFjay0+c3RvcCgpOwogCkBAIC03MzAsNyArODA2LDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9BQ1RJVkUgfHwgbVN0YXRlID09IFNUQVRFX0ZMVVNIRUQpIHsKKyAgICBpZiAobVN0YXRlID09IFNUQVRFX0FDVElWRSkgewogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGZsdXNoX2woKTsKQEAgLTEyMTksNiArMTI5NSw3IEBACiAgICAgICAgIG1TZWxlY3RlZERldmljZUlkID0gZGV2aWNlSWQ7CiAgICAgICAgIGlmIChtU3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBhbmRyb2lkX2F0b21pY19vcihDQkxLX0lOVkFMSUQsICZtQ2Jsay0+bUZsYWdzKTsKKyAgICAgICAgICAgIG1Qcm94eS0+aW50ZXJydXB0KCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtMTMwNiw3NiArMTM4MywxOSBAQAogCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpjcmVhdGVUcmFja19sKCkKIHsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgYm9vbCBjYWxsYmFja0FkZGVkID0gZmFsc2U7CisKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGF1ZGlvRmxpbmdlciA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGF1ZGlvZmxpbmdlciIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKKyAgICAgICAgZ290byBleGl0OwogICAgIH0KIAotICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDsKLSAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBtU3RyZWFtVHlwZTsKLSAgICBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIgPSAobVN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpID8gJm1BdHRyaWJ1dGVzIDogTlVMTDsKLSAgICBib29sIGNhbGxiYWNrQWRkZWQgPSBmYWxzZTsKLQorICAgIHsKICAgICAvLyBtRmxhZ3MgKG5vdCBtT3JpZ0ZsYWdzKSBpcyBtb2RpZmllZCBkZXBlbmRpbmcgb24gd2hldGhlciBmYXN0IHJlcXVlc3QgaXMgYWNjZXB0ZWQuCiAgICAgLy8gQWZ0ZXIgZmFzdCByZXF1ZXN0IGlzIGRlbmllZCwgd2Ugd2lsbCByZXF1ZXN0IGFnYWluIGlmIElBdWRpb1RyYWNrIGlzIHJlLWNyZWF0ZWQuCi0KLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOwotICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IG1TYW1wbGVSYXRlOwotICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBtQ2hhbm5lbE1hc2s7Ci0gICAgY29uZmlnLmZvcm1hdCA9IG1Gb3JtYXQ7Ci0gICAgY29uZmlnLm9mZmxvYWRfaW5mbyA9IG1PZmZsb2FkSW5mb0NvcHk7Ci0gICAgbVJvdXRlZERldmljZUlkID0gbVNlbGVjdGVkRGV2aWNlSWQ7Ci0gICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckF0dHIoYXR0ciwgJm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLCAmc3RyZWFtVHlwZSwgbUNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncywgJm1Sb3V0ZWREZXZpY2VJZCwgJm1Qb3J0SWQpOwotCi0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fCBvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYXVkaW8gb3V0cHV0IGZvciBzZXNzaW9uICVkLCBzdHJlYW0gdHlwZSAlZCwgdXNhZ2UgJWQsIHNhbXBsZSByYXRlICV1LCIKLSAgICAgICAgICAgICAgIiBmb3JtYXQgJSN4LCBjaGFubmVsIG1hc2sgJSN4LCBmbGFncyAlI3giLAotICAgICAgICAgICAgICBtU2Vzc2lvbklkLCBzdHJlYW1UeXBlLCBtQXR0cmlidXRlcy51c2FnZSwgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgbUZsYWdzKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgewotICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSByZWZlcmVuY2UgdG8gYW4gSS9PIGhhbmRsZSBhbmQgaGF2ZSBub3QgeWV0IGhhbmRlZCBpdCBvZmYgdG8gQXVkaW9GbGluZ2VyLAotICAgIC8vIHdlIG11c3QgcmVsZWFzZSBpdCBvdXJzZWx2ZXMgaWYgYW55dGhpbmcgZ29lcyB3cm9uZy4KLQotICAgIC8vIE5vdCBhbGwgb2YgdGhlc2UgdmFsdWVzIGFyZSBuZWVkZWQgdW5kZXIgYWxsIGNvbmRpdGlvbnMsIGJ1dCBpdCBpcyBlYXNpZXIgdG8gZ2V0IHRoZW0gYWxsCi0gICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldExhdGVuY3kob3V0cHV0LCAmbUFmTGF0ZW5jeSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZ2V0TGF0ZW5jeSglZCkgZmFpbGVkIHN0YXR1cyAlZCIsIG91dHB1dCwgc3RhdHVzKTsKLSAgICAgICAgZ290byByZWxlYXNlOwotICAgIH0KLSAgICBBTE9HVigiY3JlYXRlVHJhY2tfbCgpIG91dHB1dCAlZCBhZkxhdGVuY3kgJXUiLCBvdXRwdXQsIG1BZkxhdGVuY3kpOwotCi0gICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldEZyYW1lQ291bnQob3V0cHV0LCAmbUFmRnJhbWVDb3VudCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZ2V0RnJhbWVDb3VudChvdXRwdXQ9JWQpIHN0YXR1cyAlZCIsIG91dHB1dCwgc3RhdHVzKTsKLSAgICAgICAgZ290byByZWxlYXNlOwotICAgIH0KLQotICAgIC8vIFRPRE8gY29uc2lkZXIgbWFraW5nIHRoaXMgYSBtZW1iZXIgdmFyaWFibGUgaWYgdGhlcmUgYXJlIG90aGVyIHVzZXMgZm9yIGl0IGxhdGVyCi0gICAgc2l6ZV90IGFmRnJhbWVDb3VudEhBTDsKLSAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0RnJhbWVDb3VudEhBTChvdXRwdXQsICZhZkZyYW1lQ291bnRIQUwpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoImdldEZyYW1lQ291bnRIQUwob3V0cHV0PSVkKSBzdGF0dXMgJWQiLCBvdXRwdXQsIHN0YXR1cyk7Ci0gICAgICAgIGdvdG8gcmVsZWFzZTsKLSAgICB9Ci0gICAgQUxPR19BU1NFUlQoYWZGcmFtZUNvdW50SEFMID4gMCk7Ci0KLSAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0U2FtcGxpbmdSYXRlKG91dHB1dCwgJm1BZlNhbXBsZVJhdGUpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoImdldFNhbXBsaW5nUmF0ZShvdXRwdXQ9JWQpIHN0YXR1cyAlZCIsIG91dHB1dCwgc3RhdHVzKTsKLSAgICAgICAgZ290byByZWxlYXNlOwotICAgIH0KLSAgICBpZiAobVNhbXBsZVJhdGUgPT0gMCkgewotICAgICAgICBtU2FtcGxlUmF0ZSA9IG1BZlNhbXBsZVJhdGU7Ci0gICAgICAgIG1PcmlnaW5hbFNhbXBsZVJhdGUgPSBtQWZTYW1wbGVSYXRlOwotICAgIH0KLQogICAgIC8vIENsaWVudCBjYW4gb25seSBleHByZXNzIGEgcHJlZmVyZW5jZSBmb3IgRkFTVC4gIFNlcnZlciB3aWxsIHBlcmZvcm0gYWRkaXRpb25hbCB0ZXN0cy4KICAgICBpZiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgewogICAgICAgICAvLyBlaXRoZXIgb2YgdGhlc2UgdXNlIGNhc2VzOgpAQCAtMTM4OSwxMzAgKzE0MDksODEgQEAKICAgICAgICAgICAgIC8vIHVzZSBjYXNlIDQ6IHN5bmNocm9ub3VzIHdyaXRlCiAgICAgICAgICAgICAoKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9TWU5DKSAmJiBtVGhyZWFkQ2FuQ2FsbEphdmEpOwogCi0gICAgICAgIGJvb2wgdXNlQ2FzZUFsbG93ZWQgPSBzaGFyZWRCdWZmZXIgfHwgdHJhbnNmZXJBbGxvd2VkOwotICAgICAgICBpZiAoIXVzZUNhc2VBbGxvd2VkKSB7Ci0gICAgICAgICAgICBBTE9HVygiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQsIG5vdCBzaGFyZWQgYnVmZmVyIGFuZCB0cmFuc2ZlciA9ICVzIiwKLSAgICAgICAgICAgICAgICAgIGNvbnZlcnRUcmFuc2ZlclRvVGV4dChtVHJhbnNmZXIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNhbXBsZSByYXRlcyBtdXN0IGFsc28gbWF0Y2gKLSAgICAgICAgYm9vbCBzYW1wbGVSYXRlQWxsb3dlZCA9IG1TYW1wbGVSYXRlID09IG1BZlNhbXBsZVJhdGU7Ci0gICAgICAgIGlmICghc2FtcGxlUmF0ZUFsbG93ZWQpIHsKLSAgICAgICAgICAgIEFMT0dXKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIGRlbmllZCwgcmF0ZXMgZG8gbm90IG1hdGNoICV1IEh6LCByZXF1aXJlICV1IEh6IiwKLSAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtQWZTYW1wbGVSYXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2wgZmFzdEFsbG93ZWQgPSB1c2VDYXNlQWxsb3dlZCAmJiBzYW1wbGVSYXRlQWxsb3dlZDsKKyAgICAgICAgYm9vbCBmYXN0QWxsb3dlZCA9IHNoYXJlZEJ1ZmZlciB8fCB0cmFuc2ZlckFsbG93ZWQ7CiAgICAgICAgIGlmICghZmFzdEFsbG93ZWQpIHsKKyAgICAgICAgICAgIEFMT0dXKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIGRlbmllZCBieSBjbGllbnQsIG5vdCBzaGFyZWQgYnVmZmVyIGFuZCB0cmFuc2ZlciA9ICVzIiwKKyAgICAgICAgICAgICAgICAgIGNvbnZlcnRUcmFuc2ZlclRvVGV4dChtVHJhbnNmZXIpKTsKICAgICAgICAgICAgIG1GbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKG1GbGFncyAmIH5BVURJT19PVVRQVVRfRkxBR19GQVNUKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSBtTm90aWZpY2F0aW9uRnJhbWVzUmVxOwotCi0gICAgc2l6ZV90IGZyYW1lQ291bnQgPSBtUmVxRnJhbWVDb3VudDsKLSAgICBpZiAoIWF1ZGlvX2hhc19wcm9wb3J0aW9uYWxfZnJhbWVzKG1Gb3JtYXQpKSB7Ci0KLSAgICAgICAgaWYgKG1TaGFyZWRCdWZmZXIgIT0gMCkgewotICAgICAgICAgICAgLy8gU2FtZSBjb21tZW50IGFzIGJlbG93IGFib3V0IGlnbm9yaW5nIGZyYW1lQ291bnQgcGFyYW1ldGVyIGZvciBzZXQoKQotICAgICAgICAgICAgZnJhbWVDb3VudCA9IG1TaGFyZWRCdWZmZXItPnNpemUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChmcmFtZUNvdW50ID09IDApIHsKLSAgICAgICAgICAgIGZyYW1lQ291bnQgPSBtQWZGcmFtZUNvdW50OwotICAgICAgICB9Ci0gICAgICAgIGlmIChtTm90aWZpY2F0aW9uRnJhbWVzQWN0ICE9IGZyYW1lQ291bnQpIHsKLSAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSBmcmFtZUNvdW50OwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtU2hhcmVkQnVmZmVyICE9IDApIHsKLSAgICAgICAgLy8gRklYTUU6IEVuc3VyZSBjbGllbnQgc2lkZSBtZW1vcnkgYnVmZmVycyBuZWVkCi0gICAgICAgIC8vIG5vdCBoYXZlIGFkZGl0aW9uYWwgYWxpZ25tZW50IGJleW9uZCBzYW1wbGUKLSAgICAgICAgLy8gKGUuZy4gMTYgYml0IHN0ZXJlbyBhY2Nlc3NlZCBhcyAzMiBiaXQgZnJhbWUpLgotICAgICAgICBzaXplX3QgYWxpZ25tZW50ID0gYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtRm9ybWF0KTsKLSAgICAgICAgaWYgKGFsaWdubWVudCAmIDEpIHsKLSAgICAgICAgICAgIC8vIGZvciBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQgKG5vdCBleHBvc2VkIHRocm91Z2ggSmF2YSkuCi0gICAgICAgICAgICBhbGlnbm1lbnQgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ2hhbm5lbENvdW50ID4gMSkgewotICAgICAgICAgICAgLy8gTW9yZSB0aGFuIDIgY2hhbm5lbHMgZG9lcyBub3QgcmVxdWlyZSBzdHJvbmdlciBhbGlnbm1lbnQgdGhhbiBzdGVyZW8KLSAgICAgICAgICAgIGFsaWdubWVudCA8PD0gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKCh1aW50cHRyX3QpbVNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpICYgKGFsaWdubWVudCAtIDEpKSAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBidWZmZXIgYWxpZ25tZW50OiBhZGRyZXNzICVwLCBjaGFubmVsIGNvdW50ICV1IiwKLSAgICAgICAgICAgICAgICAgICAgbVNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpLCBtQ2hhbm5lbENvdW50KTsKLSAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgIGdvdG8gcmVsZWFzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdoZW4gaW5pdGlhbGl6aW5nIGEgc2hhcmVkIGJ1ZmZlciBBdWRpb1RyYWNrIHZpYSBjb25zdHJ1Y3RvcnMsCi0gICAgICAgIC8vIHRoZXJlJ3Mgbm8gZnJhbWVDb3VudCBwYXJhbWV0ZXIuCi0gICAgICAgIC8vIEJ1dCB3aGVuIGluaXRpYWxpemluZyBhIHNoYXJlZCBidWZmZXIgQXVkaW9UcmFjayB2aWEgc2V0KCksCi0gICAgICAgIC8vIHRoZXJlIF9pc18gYSBmcmFtZUNvdW50IHBhcmFtZXRlci4gIFdlIHNpbGVudGx5IGlnbm9yZSBpdC4KLSAgICAgICAgZnJhbWVDb3VudCA9IG1TaGFyZWRCdWZmZXItPnNpemUoKSAvIG1GcmFtZVNpemU7CisgICAgSUF1ZGlvRmxpbmdlcjo6Q3JlYXRlVHJhY2tJbnB1dCBpbnB1dDsKKyAgICBpZiAobVN0cmVhbVR5cGUgIT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpIHsKKyAgICAgICAgc3RyZWFtX3R5cGVfdG9fYXVkaW9fYXR0cmlidXRlcyhtU3RyZWFtVHlwZSwgJmlucHV0LmF0dHIpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHNpemVfdCBtaW5GcmFtZUNvdW50ID0gMDsKLSAgICAgICAgLy8gRm9yIGZhc3QgdHJhY2tzIHRoZSBmcmFtZSBjb3VudCBjYWxjdWxhdGlvbnMgYW5kIGNoZWNrcyBhcmUgbW9zdGx5IGRvbmUgYnkgc2VydmVyLAotICAgICAgICAvLyBidXQgd2UgdHJ5IHRvIHJlc3BlY3QgdGhlIGFwcGxpY2F0aW9uJ3MgcmVxdWVzdCBmb3Igbm90aWZpY2F0aW9ucyBwZXIgYnVmZmVyLgotICAgICAgICBpZiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgewotICAgICAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25zUGVyQnVmZmVyUmVxID4gMCkgewotICAgICAgICAgICAgICAgIC8vIEF2b2lkIHBvc3NpYmxlIGFyaXRobWV0aWMgb3ZlcmZsb3cgZHVyaW5nIG11bHRpcGxpY2F0aW9uLgotICAgICAgICAgICAgICAgIC8vIG1Ob3RpZmljYXRpb25zUGVyQnVmZmVyIGlzIGNsYW1wZWQgdG8gYSBzbWFsbCBpbnRlZ2VyIGVhcmxpZXIsIHNvIGl0IGlzIHVubGlrZWx5LgotICAgICAgICAgICAgICAgIGlmIChtTm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSA+IFNJWkVfTUFYIC8gYWZGcmFtZUNvdW50SEFMKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJSZXF1ZXN0ZWQgbm90aWZpY2F0aW9uUGVyQnVmZmVyPSV1IGlnbm9yZWQgZm9yIEhBTCBmcmFtZUNvdW50PSV6dSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbnNQZXJCdWZmZXJSZXEsIGFmRnJhbWVDb3VudEhBTCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbWluRnJhbWVDb3VudCA9IGFmRnJhbWVDb3VudEhBTCAqIG1Ob3RpZmljYXRpb25zUGVyQnVmZmVyUmVxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGZvciBub3JtYWwgdHJhY2tzIHByZWNvbXB1dGUgdGhlIGZyYW1lIGNvdW50IGJhc2VkIG9uIHNwZWVkLgotICAgICAgICAgICAgY29uc3QgZmxvYXQgc3BlZWQgPSAhaXNQdXJlUGNtRGF0YV9sKCkgfHwgaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkgPyAxLjBmIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgobU1heFJlcXVpcmVkU3BlZWQsIG1QbGF5YmFja1JhdGUubVNwZWVkKTsKLSAgICAgICAgICAgIG1pbkZyYW1lQ291bnQgPSBjYWxjdWxhdGVNaW5GcmFtZUNvdW50KAotICAgICAgICAgICAgICAgICAgICBtQWZMYXRlbmN5LCBtQWZGcmFtZUNvdW50LCBtQWZTYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgc3BlZWQgLyosIDAgbU5vdGlmaWNhdGlvbnNQZXJCdWZmZXJSZXEqLyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZyYW1lQ291bnQgPCBtaW5GcmFtZUNvdW50KSB7Ci0gICAgICAgICAgICBmcmFtZUNvdW50ID0gbWluRnJhbWVDb3VudDsKLSAgICAgICAgfQorICAgICAgICBpbnB1dC5hdHRyID0gbUF0dHJpYnV0ZXM7CiAgICAgfQotCi0gICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBtRmxhZ3M7Ci0KLSAgICBwaWRfdCB0aWQgPSAtMTsKKyAgICBpbnB1dC5jb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgaW5wdXQuY29uZmlnLnNhbXBsZV9yYXRlID0gbVNhbXBsZVJhdGU7CisgICAgaW5wdXQuY29uZmlnLmNoYW5uZWxfbWFzayA9IG1DaGFubmVsTWFzazsKKyAgICBpbnB1dC5jb25maWcuZm9ybWF0ID0gbUZvcm1hdDsKKyAgICBpbnB1dC5jb25maWcub2ZmbG9hZF9pbmZvID0gbU9mZmxvYWRJbmZvQ29weTsKKyAgICBpbnB1dC5jbGllbnRJbmZvLmNsaWVudFVpZCA9IG1DbGllbnRVaWQ7CisgICAgaW5wdXQuY2xpZW50SW5mby5jbGllbnRQaWQgPSBtQ2xpZW50UGlkOworICAgIGlucHV0LmNsaWVudEluZm8uY2xpZW50VGlkID0gLTE7CiAgICAgaWYgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpIHsKICAgICAgICAgLy8gSXQgaXMgY3VycmVudGx5IG1lYW5pbmdsZXNzIHRvIHJlcXVlc3QgU0NIRURfRklGTyBmb3IgYSBKYXZhIHRocmVhZC4gIEV2ZW4gaWYgdGhlCiAgICAgICAgIC8vIGFwcGxpY2F0aW9uLWxldmVsIGNvZGUgZm9sbG93cyBhbGwgbm9uLWJsb2NraW5nIGRlc2lnbiBydWxlcywgdGhlIGxhbmd1YWdlIHJ1bnRpbWUKICAgICAgICAgLy8gZG9lc24ndCBhbHNvIGZvbGxvdyB0aG9zZSBydWxlcywgc28gdGhlIHRocmVhZCB3aWxsIG5vdCBiZW5lZml0IG92ZXJhbGwuCiAgICAgICAgIGlmIChtQXVkaW9UcmFja1RocmVhZCAhPSAwICYmICFtVGhyZWFkQ2FuQ2FsbEphdmEpIHsKLSAgICAgICAgICAgIHRpZCA9IG1BdWRpb1RyYWNrVGhyZWFkLT5nZXRUaWQoKTsKKyAgICAgICAgICAgIGlucHV0LmNsaWVudEluZm8uY2xpZW50VGlkID0gbUF1ZGlvVHJhY2tUaHJlYWQtPmdldFRpZCgpOwogICAgICAgICB9CiAgICAgfQorICAgIGlucHV0LnNoYXJlZEJ1ZmZlciA9IG1TaGFyZWRCdWZmZXI7CisgICAgaW5wdXQubm90aWZpY2F0aW9uc1BlckJ1ZmZlciA9IG1Ob3RpZmljYXRpb25zUGVyQnVmZmVyUmVxOworICAgIGlucHV0LnNwZWVkID0gMS4wOworICAgIGlmIChhdWRpb19oYXNfcHJvcG9ydGlvbmFsX2ZyYW1lcyhtRm9ybWF0KSAmJiBtU2hhcmVkQnVmZmVyID09IDAgJiYKKyAgICAgICAgICAgIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSA9PSAwKSB7CisgICAgICAgIGlucHV0LnNwZWVkICA9ICFpc1B1cmVQY21EYXRhX2woKSB8fCBpc09mZmxvYWRlZE9yRGlyZWN0X2woKSA/IDEuMGYgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWF4KG1NYXhSZXF1aXJlZFNwZWVkLCBtUGxheWJhY2tSYXRlLm1TcGVlZCk7CisgICAgfQorICAgIGlucHV0LmZsYWdzID0gbUZsYWdzOworICAgIGlucHV0LmZyYW1lQ291bnQgPSBtUmVxRnJhbWVDb3VudDsKKyAgICBpbnB1dC5ub3RpZmljYXRpb25GcmFtZUNvdW50ID0gbU5vdGlmaWNhdGlvbkZyYW1lc1JlcTsKKyAgICBpbnB1dC5zZWxlY3RlZERldmljZUlkID0gbVNlbGVjdGVkRGV2aWNlSWQ7CisgICAgaW5wdXQuc2Vzc2lvbklkID0gbVNlc3Npb25JZDsKIAotICAgIHNpemVfdCB0ZW1wID0gZnJhbWVDb3VudDsgICAvLyB0ZW1wIG1heSBiZSByZXBsYWNlZCBieSBhIHJldmlzZWQgdmFsdWUgb2YgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHdlIHdpbGwgc3RpbGwgbmVlZCB0aGUgb3JpZ2luYWwgdmFsdWUgYWxzbwotICAgIGF1ZGlvX3Nlc3Npb25fdCBvcmlnaW5hbFNlc3Npb25JZCA9IG1TZXNzaW9uSWQ7Ci0gICAgc3A8SUF1ZGlvVHJhY2s+IHRyYWNrID0gYXVkaW9GbGluZ2VyLT5jcmVhdGVUcmFjayhzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2hhcmVkQnVmZmVyLAorICAgIElBdWRpb0ZsaW5nZXI6OkNyZWF0ZVRyYWNrT3V0cHV0IG91dHB1dDsKKworICAgIHNwPElBdWRpb1RyYWNrPiB0cmFjayA9IGF1ZGlvRmxpbmdlci0+Y3JlYXRlVHJhY2soaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50UGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1TZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qb3J0SWQpOwotICAgIEFMT0dFX0lGKG9yaWdpbmFsU2Vzc2lvbklkICE9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUgJiYgbVNlc3Npb25JZCAhPSBvcmlnaW5hbFNlc3Npb25JZCwKLSAgICAgICAgICAgICJzZXNzaW9uIElEIGNoYW5nZWQgZnJvbSAlZCB0byAlZCIsIG9yaWdpbmFsU2Vzc2lvbklkLCBtU2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOwogCi0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgdHJhY2ssIHN0YXR1czogJWQiLCBzdGF0dXMpOwotICAgICAgICBnb3RvIHJlbGVhc2U7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fCBvdXRwdXQub3V0cHV0SWQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgQUxPR0UoIkF1ZGlvRmxpbmdlciBjb3VsZCBub3QgY3JlYXRlIHRyYWNrLCBzdGF0dXM6ICVkIG91dHB1dCAlZCIsIHN0YXR1cywgb3V0cHV0Lm91dHB1dElkKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKKyAgICAgICAgfQorICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogICAgIEFMT0dfQVNTRVJUKHRyYWNrICE9IDApOwogCisgICAgbUZyYW1lQ291bnQgPSBvdXRwdXQuZnJhbWVDb3VudDsKKyAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gKHVpbnQzMl90KW91dHB1dC5ub3RpZmljYXRpb25GcmFtZUNvdW50OworICAgIG1Sb3V0ZWREZXZpY2VJZCA9IG91dHB1dC5zZWxlY3RlZERldmljZUlkOworICAgIG1TZXNzaW9uSWQgPSBvdXRwdXQuc2Vzc2lvbklkOworCisgICAgbVNhbXBsZVJhdGUgPSBvdXRwdXQuc2FtcGxlUmF0ZTsKKyAgICBpZiAobU9yaWdpbmFsU2FtcGxlUmF0ZSA9PSAwKSB7CisgICAgICAgIG1PcmlnaW5hbFNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKKyAgICB9CisKKyAgICBtQWZGcmFtZUNvdW50ID0gb3V0cHV0LmFmRnJhbWVDb3VudDsKKyAgICBtQWZTYW1wbGVSYXRlID0gb3V0cHV0LmFmU2FtcGxlUmF0ZTsKKyAgICBtQWZMYXRlbmN5ID0gb3V0cHV0LmFmTGF0ZW5jeU1zOworCisgICAgbUxhdGVuY3kgPSBtQWZMYXRlbmN5ICsgKDEwMDBMTCAqIG1GcmFtZUNvdW50KSAvIG1TYW1wbGVSYXRlOworCiAgICAgLy8gQXVkaW9GbGluZ2VyIG5vdyBvd25zIHRoZSByZWZlcmVuY2UgdG8gdGhlIEkvTyBoYW5kbGUsCiAgICAgLy8gc28gd2UgYXJlIG5vIGxvbmdlciByZXNwb25zaWJsZSBmb3IgcmVsZWFzaW5nIGl0LgogCkBAIC0xNTIxLDEzICsxNDkyLDEzIEBACiAgICAgaWYgKGlNZW0gPT0gMCkgewogICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIik7CiAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7Ci0gICAgICAgIGdvdG8gcmVsZWFzZTsKKyAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICB2b2lkICppTWVtUG9pbnRlciA9IGlNZW0tPnBvaW50ZXIoKTsKICAgICBpZiAoaU1lbVBvaW50ZXIgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIHBvaW50ZXIiKTsKICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKLSAgICAgICAgZ290byByZWxlYXNlOworICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogICAgIC8vIGludmFyaWFudCB0aGF0IG1BdWRpb1RyYWNrICE9IDAgaXMgdHJ1ZSBvbmx5IGFmdGVyIHNldCgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5CiAgICAgaWYgKG1BdWRpb1RyYWNrICE9IDApIHsKQEAgLTE1NDAsNjYgKzE1MTEsMzMgQEAKIAogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IHN0YXRpY19jYXN0PGF1ZGlvX3RyYWNrX2NibGtfdCo+KGlNZW1Qb2ludGVyKTsKICAgICBtQ2JsayA9IGNibGs7Ci0gICAgLy8gbm90ZSB0aGF0IHRlbXAgaXMgdGhlIChwb3NzaWJseSByZXZpc2VkKSB2YWx1ZSBvZiBmcmFtZUNvdW50Ci0gICAgaWYgKHRlbXAgPCBmcmFtZUNvdW50IHx8IChmcmFtZUNvdW50ID09IDAgJiYgdGVtcCA9PSAwKSkgewotICAgICAgICAvLyBJbiBjdXJyZW50IGRlc2lnbiwgQXVkaW9UcmFjayBjbGllbnQgY2hlY2tzIGFuZCBlbnN1cmVzIGZyYW1lIGNvdW50IHZhbGlkaXR5IGJlZm9yZQotICAgICAgICAvLyBwYXNzaW5nIGl0IHRvIEF1ZGlvRmxpbmdlciBzbyBBdWRpb0ZsaW5nZXIgc2hvdWxkIG5vdCByZXR1cm4gYSBkaWZmZXJlbnQgdmFsdWUgZXhjZXB0Ci0gICAgICAgIC8vIGZvciBmYXN0IHRyYWNrIGFzIGl0IHVzZXMgYSBzcGVjaWFsIG1ldGhvZCBvZiBhc3NpZ25pbmcgZnJhbWUgY291bnQuCi0gICAgICAgIEFMT0dXKCJSZXF1ZXN0ZWQgZnJhbWVDb3VudCAlenUgYnV0IHJlY2VpdmVkIGZyYW1lQ291bnQgJXp1IiwgZnJhbWVDb3VudCwgdGVtcCk7Ci0gICAgfQotICAgIGZyYW1lQ291bnQgPSB0ZW1wOwogCiAgICAgbUF3YWl0Qm9vc3QgPSBmYWxzZTsKICAgICBpZiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgewotICAgICAgICBpZiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSB7Ci0gICAgICAgICAgICBBTE9HSSgiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBzdWNjZXNzZnVsOyBmcmFtZUNvdW50ICV6dSAtPiAlenUiLCBmcmFtZUNvdW50LCB0ZW1wKTsKKyAgICAgICAgaWYgKG91dHB1dC5mbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpIHsKKyAgICAgICAgICAgIEFMT0dJKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIHN1Y2Nlc3NmdWw7IGZyYW1lQ291bnQgJXp1IC0+ICV6dSIsCisgICAgICAgICAgICAgICAgICBtUmVxRnJhbWVDb3VudCwgbUZyYW1lQ291bnQpOwogICAgICAgICAgICAgaWYgKCFtVGhyZWFkQ2FuQ2FsbEphdmEpIHsKICAgICAgICAgICAgICAgICBtQXdhaXRCb29zdCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgc2VydmVyOyBmcmFtZUNvdW50ICV6dSAtPiAlenUiLCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICB0ZW1wKTsKKyAgICAgICAgICAgIEFMT0dXKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIGRlbmllZCBieSBzZXJ2ZXI7IGZyYW1lQ291bnQgJXp1IC0+ICV6dSIsIG1SZXFGcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQpOwogICAgICAgICB9CiAgICAgfQotICAgIG1GbGFncyA9IGZsYWdzOwotCi0gICAgLy8gTWFrZSBzdXJlIHRoYXQgYXBwbGljYXRpb24gaXMgbm90aWZpZWQgd2l0aCBzdWZmaWNpZW50IG1hcmdpbiBiZWZvcmUgdW5kZXJydW4uCi0gICAgLy8gVGhlIGNsaWVudCBjYW4gZGl2aWRlIHRoZSBBdWRpb1RyYWNrIGJ1ZmZlciBpbnRvIHN1Yi1idWZmZXJzLAotICAgIC8vIGFuZCBleHByZXNzZXMgaXRzIGRlc2lyZSB0byBzZXJ2ZXIgYXMgdGhlIG5vdGlmaWNhdGlvbiBmcmFtZSBjb3VudC4KLSAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwICYmIGF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkpIHsKLSAgICAgICAgc2l6ZV90IG1heE5vdGlmaWNhdGlvbkZyYW1lczsKLSAgICAgICAgaWYgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpIHsKLSAgICAgICAgICAgIC8vIG5vdGlmeSBldmVyeSBIQUwgYnVmZmVyLCByZWdhcmRsZXNzIG9mIHRoZSBzaXplIG9mIHRoZSB0cmFjayBidWZmZXIKLSAgICAgICAgICAgIG1heE5vdGlmaWNhdGlvbkZyYW1lcyA9IGFmRnJhbWVDb3VudEhBTDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEZvciBub3JtYWwgdHJhY2tzLCB1c2UgYXQgbGVhc3QgZG91YmxlLWJ1ZmZlcmluZyBpZiBubyBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uLAotICAgICAgICAgICAgLy8gb3IgYXQgbGVhc3QgdHJpcGxlLWJ1ZmZlcmluZyBpZiB0aGVyZSBpcyBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uCi0gICAgICAgICAgICBjb25zdCBpbnQgbkJ1ZmZlcmluZyA9IG1PcmlnaW5hbFNhbXBsZVJhdGUgPT0gbUFmU2FtcGxlUmF0ZSA/IDIgOiAzOwotICAgICAgICAgICAgbWF4Tm90aWZpY2F0aW9uRnJhbWVzID0gZnJhbWVDb3VudCAvIG5CdWZmZXJpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPT0gMCB8fCBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID4gbWF4Tm90aWZpY2F0aW9uRnJhbWVzKSB7Ci0gICAgICAgICAgICBpZiAobU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0QoIkNsaWVudCBkZWZhdWx0ZWQgbm90aWZpY2F0aW9uRnJhbWVzIHRvICV6dSBmb3IgZnJhbWVDb3VudCAlenUiLAotICAgICAgICAgICAgICAgICAgICBtYXhOb3RpZmljYXRpb25GcmFtZXMsIGZyYW1lQ291bnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiQ2xpZW50IGFkanVzdGVkIG5vdGlmaWNhdGlvbkZyYW1lcyBmcm9tICV1IHRvICV6dSBmb3IgZnJhbWVDb3VudCAlenUiLAotICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0LCBtYXhOb3RpZmljYXRpb25GcmFtZXMsIGZyYW1lQ291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9ICh1aW50MzJfdCkgbWF4Tm90aWZpY2F0aW9uRnJhbWVzOwotICAgICAgICB9Ci0gICAgfQorICAgIG1GbGFncyA9IG91dHB1dC5mbGFnczsKIAogICAgIC8vbU91dHB1dCAhPSBvdXRwdXQgaW5jbHVkZXMgdGhlIGNhc2Ugd2hlcmUgbU91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSBmb3IgZmlyc3QgY3JlYXRpb24KLSAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDAgJiYgbU91dHB1dCAhPSBvdXRwdXQpIHsKKyAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDAgJiYgbU91dHB1dCAhPSBvdXRwdXQub3V0cHV0SWQpIHsKICAgICAgICAgaWYgKG1PdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1PdXRwdXQpOwogICAgICAgICB9Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG91dHB1dCk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG91dHB1dC5vdXRwdXRJZCk7CiAgICAgICAgIGNhbGxiYWNrQWRkZWQgPSB0cnVlOwogICAgIH0KIAogICAgIC8vIFdlIHJldGFpbiBhIGNvcHkgb2YgdGhlIEkvTyBoYW5kbGUsIGJ1dCBkb24ndCBvd24gdGhlIHJlZmVyZW5jZQotICAgIG1PdXRwdXQgPSBvdXRwdXQ7CisgICAgbU91dHB1dCA9IG91dHB1dC5vdXRwdXRJZDsKICAgICBtUmVmcmVzaFJlbWFpbmluZyA9IHRydWU7CiAKICAgICAvLyBTdGFydGluZyBhZGRyZXNzIG9mIGJ1ZmZlcnMgaW4gc2hhcmVkIG1lbW9yeS4gIElmIHRoZXJlIGlzIGEgc2hhcmVkIGJ1ZmZlciwgYnVmZmVycwpAQCAtMTYxNCwxOCArMTU1MiwxNiBAQAogICAgICAgICBpZiAoYnVmZmVycyA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBidWZmZXIgcG9pbnRlciIpOwogICAgICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKLSAgICAgICAgICAgIGdvdG8gcmVsZWFzZTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQogICAgIH0KIAogICAgIG1BdWRpb1RyYWNrLT5hdHRhY2hBdXhFZmZlY3QobUF1eEVmZmVjdElkKTsKLSAgICBtRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7Ci0gICAgdXBkYXRlTGF0ZW5jeV9sKCk7ICAvLyB0aGlzIHJlZmV0Y2hlcyBtQWZMYXRlbmN5IGFuZCBzZXRzIG1MYXRlbmN5CiAKICAgICAvLyBJZiBJQXVkaW9UcmFjayBpcyByZS1jcmVhdGVkLCBkb24ndCBsZXQgdGhlIHJlcXVlc3RlZCBmcmFtZUNvdW50CiAgICAgLy8gZGVjcmVhc2UuICBUaGlzIGNhbiBjb25mdXNlIGNsaWVudHMgdGhhdCBjYWNoZSBmcmFtZUNvdW50KCkuCi0gICAgaWYgKGZyYW1lQ291bnQgPiBtUmVxRnJhbWVDb3VudCkgewotICAgICAgICBtUmVxRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgaWYgKG1GcmFtZUNvdW50ID4gbVJlcUZyYW1lQ291bnQpIHsKKyAgICAgICAgbVJlcUZyYW1lQ291bnQgPSBtRnJhbWVDb3VudDsKICAgICB9CiAKICAgICAvLyByZXNldCBzZXJ2ZXIgcG9zaXRpb24gdG8gMCBhcyB3ZSBoYXZlIG5ldyBjYmxrLgpAQCAtMTYzNCw5ICsxNTcwLDkgQEAKICAgICAvLyB1cGRhdGUgcHJveHkKICAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwKSB7CiAgICAgICAgIG1TdGF0aWNQcm94eS5jbGVhcigpOwotICAgICAgICBtUHJveHkgPSBuZXcgQXVkaW9UcmFja0NsaWVudFByb3h5KGNibGssIGJ1ZmZlcnMsIGZyYW1lQ291bnQsIG1GcmFtZVNpemUpOworICAgICAgICBtUHJveHkgPSBuZXcgQXVkaW9UcmFja0NsaWVudFByb3h5KGNibGssIGJ1ZmZlcnMsIG1GcmFtZUNvdW50LCBtRnJhbWVTaXplKTsKICAgICB9IGVsc2UgewotICAgICAgICBtU3RhdGljUHJveHkgPSBuZXcgU3RhdGljQXVkaW9UcmFja0NsaWVudFByb3h5KGNibGssIGJ1ZmZlcnMsIGZyYW1lQ291bnQsIG1GcmFtZVNpemUpOworICAgICAgICBtU3RhdGljUHJveHkgPSBuZXcgU3RhdGljQXVkaW9UcmFja0NsaWVudFByb3h5KGNibGssIGJ1ZmZlcnMsIG1GcmFtZUNvdW50LCBtRnJhbWVTaXplKTsKICAgICAgICAgbVByb3h5ID0gbVN0YXRpY1Byb3h5OwogICAgIH0KIApAQCAtMTY1OSwxOCArMTU5NSwxNyBAQAogICAgIG1EZWF0aE5vdGlmaWVyID0gbmV3IERlYXRoTm90aWZpZXIodGhpcyk7CiAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUF1ZGlvVHJhY2spLT5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CiAKLSAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCi1yZWxlYXNlOgotICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG91dHB1dCwgc3RyZWFtVHlwZSwgbVNlc3Npb25JZCk7Ci0gICAgaWYgKGNhbGxiYWNrQWRkZWQpIHsKK2V4aXQ6CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBjYWxsYmFja0FkZGVkKSB7CiAgICAgICAgIC8vIG5vdGU6IG1PdXRwdXQgaXMgYWx3YXlzIHZhbGlkIGlzIGNhbGxiYWNrQWRkZWQgaXMgdHJ1ZQogICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtT3V0cHV0KTsKICAgICB9Ci0gICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICBzdGF0dXMgPSBOT19JTklUOwotICAgIH0KKworICAgIG1TdGF0dXMgPSBzdGF0dXM7CisKKyAgICAvLyBzcDxJQXVkaW9UcmFjaz4gdHJhY2sgZGVzdHJ1Y3RvciB3aWxsIGNhdXNlIHJlbGVhc2VPdXRwdXQoKSB0byBiZSBjYWxsZWQgYnkgQXVkaW9GbGluZ2VyCiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMjMxNCw2ICsyMjQ5LDE2IEBACiAgICAgICAgIHN0YXRpY1Bvc2l0aW9uID0gbVN0YXRpY1Byb3h5LT5nZXRQb3NpdGlvbigpLnVuc2lnbmVkVmFsdWUoKTsKICAgICB9CiAKKyAgICAvLyBTZWUgYi83NDQwOTI2Ny4gQ29ubmVjdGluZyB0byBhIEJUIEEyRFAgZGV2aWNlIHN1cHBvcnRpbmcgbXVsdGlwbGUgY29kZWNzCisgICAgLy8gY2F1c2VzIGEgbG90IG9mIGNodXJuIG9uIHRoZSBzZXJ2aWNlIHNpZGUsIGFuZCBpdCBjYW4gcmVqZWN0IHN0YXJ0aW5nCisgICAgLy8gcGxheWJhY2sgb2YgYSBwcmV2aW91c2x5IGNyZWF0ZWQgdHJhY2suIE1heSBhbHNvIGFwcGx5IHRvIG90aGVyIGNhc2VzLgorICAgIGNvbnN0IGludCBJTklUSUFMX1JFVFJJRVMgPSAzOworICAgIGludCByZXRyaWVzID0gSU5JVElBTF9SRVRSSUVTOworcmV0cnk6CisgICAgaWYgKHJldHJpZXMgPCBJTklUSUFMX1JFVFJJRVMpIHsKKyAgICAgICAgLy8gU2VlIHRoZSBjb21tZW50IGZvciBjbGVhckF1ZGlvQ29uZmlnQ2FjaGUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbi4KKyAgICAgICAgQXVkaW9TeXN0ZW06OmNsZWFyQXVkaW9Db25maWdDYWNoZSgpOworICAgIH0KICAgICBtRmxhZ3MgPSBtT3JpZ0ZsYWdzOwogCiAgICAgLy8gSWYgYSBuZXcgSUF1ZGlvVHJhY2sgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQsIGNyZWF0ZVRyYWNrX2woKSB3aWxsIG1vZGlmeSB0aGUKQEAgLTIzMjIsNyArMjI2NywxMCBAQAogICAgIC8vIElmIGEgbmV3IElBdWRpb1RyYWNrIGNhbm5vdCBiZSBjcmVhdGVkLCB0aGUgcHJldmlvdXMgKGRlYWQpIGluc3RhbmNlIHdpbGwgYmUgbGVmdCBpbnRhY3QuCiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY3JlYXRlVHJhY2tfbCgpOwogCi0gICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgeworICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1coIiVzKCk6IGNyZWF0ZVRyYWNrX2wgZmFpbGVkLCBkbyBub3QgcmV0cnkiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHJpZXMgPSAwOworICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIHRha2UgdGhlIGZyYW1lcyB0aGF0IHdpbGwgYmUgbG9zdCBieSB0cmFjayByZWNyZWF0aW9uIGludG8gYWNjb3VudCBpbiBzYXZlZCBwb3NpdGlvbgogICAgICAgICAvLyBGb3Igc3RyZWFtaW5nIHRyYWNrcywgdGhpcyBpcyB0aGUgYW1vdW50IHdlIG9idGFpbmVkIGZyb20gdGhlIHVzZXIvY2xpZW50CiAgICAgICAgIC8vIChub3QgdGhlIG51bWJlciBhY3R1YWxseSBjb25zdW1lZCBhdCB0aGUgc2VydmVyIC0gdGhvc2UgYXJlIGFscmVhZHkgbG9zdCkuCkBAIC0yMzY3LDcgKzIzMTUsMTAgQEAKICAgICAgICAgbUZyYW1lc1dyaXR0ZW5BdFJlc3RvcmUgPSBtRnJhbWVzV3JpdHRlblNlcnZlck9mZnNldDsKICAgICB9CiAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HVygicmVzdG9yZVRyYWNrX2woKSBmYWlsZWQgc3RhdHVzICVkIiwgcmVzdWx0KTsKKyAgICAgICAgQUxPR1coIiVzKCkgZmFpbGVkIHN0YXR1cyAlZCwgcmV0cmllcyAlZCIsIF9fZnVuY19fLCByZXN1bHQsIHJldHJpZXMpOworICAgICAgICBpZiAoLS1yZXRyaWVzID4gMCkgeworICAgICAgICAgICAgZ290byByZXRyeTsKKyAgICAgICAgfQogICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEOwogICAgICAgICBtUmVsZWFzZWQgPSAwOwogICAgIH0KQEAgLTI0MDYsOCArMjM1Nyw4IEBACiAgICAgICAgIHJldHVybiB0cnVlOyAvLyBzdGF0aWMgdHJhY2tzIGRvIG5vdCBoYXZlIGlzc3VlcyB3aXRoIGJ1ZmZlciBzaXppbmcuCiAgICAgfQogICAgIGNvbnN0IHNpemVfdCBtaW5GcmFtZUNvdW50ID0KLSAgICAgICAgICAgIGNhbGN1bGF0ZU1pbkZyYW1lQ291bnQobUFmTGF0ZW5jeSwgbUFmRnJhbWVDb3VudCwgbUFmU2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSwgc3BlZWQKLSAgICAgICAgICAgICAgICAvKiwgMCBtTm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSovKTsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpjYWxjdWxhdGVNaW5GcmFtZUNvdW50KG1BZkxhdGVuY3ksIG1BZkZyYW1lQ291bnQsIG1BZlNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIHNwZWVkIC8qLCAwIG1Ob3RpZmljYXRpb25zUGVyQnVmZmVyUmVxKi8pOwogICAgIGNvbnN0IGJvb2wgYWxsb3dlZCA9IG1GcmFtZUNvdW50ID49IG1pbkZyYW1lQ291bnQ7CiAgICAgQUxPR0RfSUYoIWFsbG93ZWQsCiAgICAgICAgICAgICAiaXNTYW1wbGVSYXRlU3BlZWRBbGxvd2VkX2wgZGVuaWVkICIKQEAgLTI0MjQsNiArMjM3NSwxNyBAQAogICAgIHJldHVybiBtQXVkaW9UcmFjay0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9UcmFjazo6c2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCkKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOworICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlQcmVzZW50YXRpb25JZCksIHByZXNlbnRhdGlvbklkKTsKKyAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5UHJvZ3JhbUlkKSwgcHJvZ3JhbUlkKTsKKyAgICBBTE9HVigiUHJlc2VudGF0aW9uSWQvUHJvZ3JhbUlkWyVzXSIscGFyYW0udG9TdHJpbmcoKS5zdHJpbmcoKSk7CisKKyAgICByZXR1cm4gbUF1ZGlvVHJhY2stPnNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7Cit9CisKIFZvbHVtZVNoYXBlcjo6U3RhdHVzIEF1ZGlvVHJhY2s6OmFwcGx5Vm9sdW1lU2hhcGVyKAogICAgICAgICBjb25zdCBzcDxWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAogICAgICAgICBjb25zdCBzcDxWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbikKQEAgLTI4MjMsMjMgKzI3ODUsMjggQEAKIAogc3RhdHVzX3QgQXVkaW9UcmFjazo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpIGNvbnN0CiB7Ci0KLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKICAgICBTdHJpbmc4IHJlc3VsdDsKIAogICAgIHJlc3VsdC5hcHBlbmQoIiBBdWRpb1RyYWNrOjpkdW1wXG4iKTsKLSAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgc3RyZWFtIHR5cGUoJWQpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKCVmLCAlZilcbiIsIG1TdHJlYW1UeXBlLAotICAgICAgICAgICAgbVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX0xFRlRdLCBtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfUklHSFRdKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIGZvcm1hdCglZCksIGNoYW5uZWwgY291bnQoJWQpLCBmcmFtZSBjb3VudCglenUpXG4iLCBtRm9ybWF0LAotICAgICAgICAgICAgbUNoYW5uZWxDb3VudCwgbUZyYW1lQ291bnQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgc2FtcGxlIHJhdGUoJXUpLCBzcGVlZCglZiksIHN0YXR1cyglZClcbiIsCi0gICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbVBsYXliYWNrUmF0ZS5tU3BlZWQsIG1TdGF0dXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgc3RhdGUoJWQpLCBsYXRlbmN5ICglZClcbiIsIG1TdGF0ZSwgbUxhdGVuY3kpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHN0YXR1cyglZCksIHN0YXRlKCVkKSwgc2Vzc2lvbiBJZCglZCksIGZsYWdzKCUjeClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzLCBtU3RhdGUsIG1TZXNzaW9uSWQsIG1GbGFncyk7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBzdHJlYW0gdHlwZSglZCksIGxlZnQgLSByaWdodCB2b2x1bWUoJWYsICVmKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChtU3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKCZtQXR0cmlidXRlcykgOiBtU3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVbQVVESU9fSU5URVJMRUFWRV9MRUZUXSwgbVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX1JJR0hUXSk7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBmb3JtYXQoJSN4KSwgY2hhbm5lbCBtYXNrKCUjeCksIGNoYW5uZWwgY291bnQoJXUpXG4iLAorICAgICAgICAgICAgICAgICAgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLCBtQ2hhbm5lbENvdW50KTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHNhbXBsZSByYXRlKCV1KSwgb3JpZ2luYWwgc2FtcGxlIHJhdGUoJXUpLCBzcGVlZCglZilcbiIsCisgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbU9yaWdpbmFsU2FtcGxlUmF0ZSwgbVBsYXliYWNrUmF0ZS5tU3BlZWQpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgZnJhbWUgY291bnQoJXp1KSwgcmVxLiBmcmFtZSBjb3VudCglenUpXG4iLAorICAgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQsIG1SZXFGcmFtZUNvdW50KTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIG5vdGlmLiBmcmFtZSBjb3VudCgldSksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KCV1KSwiCisgICAgICAgICAgICAiIHJlcS4gbm90aWYuIHBlciBidWZmKCV1KVxuIiwKKyAgICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0LCBtTm90aWZpY2F0aW9uRnJhbWVzUmVxLCBtTm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSk7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBsYXRlbmN5ICglZCksIHNlbGVjdGVkIGRldmljZSBJZCglZCksIHJvdXRlZCBkZXZpY2UgSWQoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbUxhdGVuY3ksIG1TZWxlY3RlZERldmljZUlkLCBtUm91dGVkRGV2aWNlSWQpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgb3V0cHV0KCVkKSBBRiBsYXRlbmN5ICgldSkgQUYgZnJhbWUgY291bnQoJXp1KSBBRiBTYW1wbGVSYXRlKCV1KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXQsIG1BZkxhdGVuY3ksIG1BZkZyYW1lQ291bnQsIG1BZlNhbXBsZVJhdGUpOwogICAgIDo6d3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcAppbmRleCA3YmY0Zjk5Li5kY2VkM2M0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcApAQCAtMzkzLDE5ICszOTMsNTAgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLV9fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJpbnRlZ2VyIikpKQogdm9pZCBBdWRpb1RyYWNrQ2xpZW50UHJveHk6OmZsdXNoKCkKIHsKKyAgICBzZW5kU3RyZWFtaW5nRmx1c2hTdG9wKHRydWUgLyogZmx1c2ggKi8pOworfQorCit2b2lkIEF1ZGlvVHJhY2tDbGllbnRQcm94eTo6c3RvcCgpCit7CisgICAgc2VuZFN0cmVhbWluZ0ZsdXNoU3RvcChmYWxzZSAvKiBmbHVzaCAqLyk7Cit9CisKKy8vIFNldHMgdGhlIGNsaWVudC13cml0dGVuIG1GbHVzaCBhbmQgbVN0b3AgcG9zaXRpb25zLCB3aGljaCBjb250cm9sIHNlcnZlciBiZWhhdmlvci4KKy8vCisvLyBAcGFyYW0gZmx1c2ggaW5kaWNhdGVzIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBpcyBhIGZsdXNoIG9yIHN0b3AuCisvLyBBIGNsaWVudCBzdG9wIHNldHMgbVN0b3AgdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb247CisvLyB0aGUgc2VydmVyIHdpbGwgbm90IHJlYWQgcGFzdCB0aGlzIHBvaW50IHVudGlsIHN0YXJ0KCkgb3Igc3Vic2VxdWVudCBmbHVzaCgpLgorLy8gQSBjbGllbnQgZmx1c2ggc2V0cyBib3RoIG1TdG9wIGFuZCBtRmx1c2ggdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24uCisvLyBUaGlzIGFkdmFuY2VzIHRoZSBzZXJ2ZXIgcmVhZCBsaW1pdCAoaWYgcHJldmlvdXNseSBzZXQpIGFuZCBvbiB0aGUgbmV4dAorLy8gc2VydmVyIHJlYWQgYWR2YW5jZXMgdGhlIHNlcnZlciByZWFkIHBvc2l0aW9uIHRvIHRoaXMgbGltaXQuCisvLwordm9pZCBBdWRpb1RyYWNrQ2xpZW50UHJveHk6OnNlbmRTdHJlYW1pbmdGbHVzaFN0b3AoYm9vbCBmbHVzaCkKK3sKKyAgICAvLyBUT0RPOiBSZXBsYWNlIHRoaXMgYnkgNjQgYml0IGNvdW50ZXJzIC0gYXZvaWRzIHdyYXAgY29tcGxpY2F0aW9uLgogICAgIC8vIFRoaXMgd29ya3MgZm9yIG1GcmFtZUNvdW50UDIgPD0gMl4zMAotICAgIHNpemVfdCBpbmNyZW1lbnQgPSBtRnJhbWVDb3VudFAyIDw8IDE7Ci0gICAgc2l6ZV90IG1hc2sgPSBpbmNyZW1lbnQgLSAxOwotICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IG1DYmxrOwogICAgIC8vIG1GbHVzaCBpcyAzMiBiaXRzIGNvbmNhdGVuYXRlZCBhcyBbIGZsdXNoX2NvdW50ZXIgXSBbIG5ld2Zyb250X29mZnNldCBdCiAgICAgLy8gU2hvdWxkIG5ld0ZsdXNoID0gY2Jsay0+dS5tU3RyZWFtaW5nLm1SZWFyPyAgT25seSBwcm9ibGVtIGlzCiAgICAgLy8gaWYgeW91IHdhbnQgdG8gZmx1c2ggdHdpY2UgdG8gdGhlIHNhbWUgcmVhciBsb2NhdGlvbiBhZnRlciBhIDMyIGJpdCB3cmFwLgotICAgIGludDMyX3QgbmV3Rmx1c2ggPSAoY2Jsay0+dS5tU3RyZWFtaW5nLm1SZWFyICYgbWFzaykgfAotICAgICAgICAgICAgICAgICAgICAgICAgKChjYmxrLT51Lm1TdHJlYW1pbmcubUZsdXNoICYgfm1hc2spICsgaW5jcmVtZW50KTsKLSAgICBhbmRyb2lkX2F0b21pY19yZWxlYXNlX3N0b3JlKG5ld0ZsdXNoLCAmY2Jsay0+dS5tU3RyZWFtaW5nLm1GbHVzaCk7CisKKyAgICBjb25zdCBzaXplX3QgaW5jcmVtZW50ID0gbUZyYW1lQ291bnRQMiA8PCAxOworICAgIGNvbnN0IHNpemVfdCBtYXNrID0gaW5jcmVtZW50IC0gMTsKKyAgICAvLyBObyBuZWVkIGZvciBjbGllbnQgYXRvbWljIHN5bmNocm9uaXphdGlvbiBvbiBtUmVhciwgbVN0b3AsIG1GbHVzaAorICAgIC8vIGFzIEF1ZGlvVHJhY2sgY2xpZW50IG9ubHkgcmVhZC93cml0ZXMgdG8gdGhlbSB1bmRlciBjbGllbnQgbG9jay4gU2VydmVyIG9ubHkgcmVhZHMuCisgICAgY29uc3QgaW50MzJfdCByZWFyTWFza2VkID0gbUNibGstPnUubVN0cmVhbWluZy5tUmVhciAmIG1hc2s7CisKKyAgICAvLyB1cGRhdGUgc3RvcCBiZWZvcmUgZmx1c2ggc28gdGhhdCB0aGUgc2VydmVyIGZyb250CisgICAgLy8gbmV2ZXIgYWR2YW5jZXMgYmV5b25kIGEgKHBvdGVudGlhbCkgcHJldmlvdXMgc3RvcCdzIHJlYXIgbGltaXQuCisgICAgaW50MzJfdCBzdG9wQml0czsgLy8gdGhlIGZvbGxvd2luZyBhZGQgY2FuIG92ZXJmbG93CisgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhtQ2Jsay0+dS5tU3RyZWFtaW5nLm1TdG9wICYgfm1hc2ssIGluY3JlbWVudCwgJnN0b3BCaXRzKTsKKyAgICBhbmRyb2lkX2F0b21pY19yZWxlYXNlX3N0b3JlKHJlYXJNYXNrZWQgfCBzdG9wQml0cywgJm1DYmxrLT51Lm1TdHJlYW1pbmcubVN0b3ApOworCisgICAgaWYgKGZsdXNoKSB7CisgICAgICAgIGludDMyX3QgZmx1c2hCaXRzOyAvLyB0aGUgZm9sbG93aW5nIGFkZCBjYW4gb3ZlcmZsb3cKKyAgICAgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhtQ2Jsay0+dS5tU3RyZWFtaW5nLm1GbHVzaCAmIH5tYXNrLCBpbmNyZW1lbnQsICZmbHVzaEJpdHMpOworICAgICAgICBhbmRyb2lkX2F0b21pY19yZWxlYXNlX3N0b3JlKHJlYXJNYXNrZWQgfCBmbHVzaEJpdHMsICZtQ2Jsay0+dS5tU3RyZWFtaW5nLm1GbHVzaCk7CisgICAgfQogfQogCiBib29sIEF1ZGlvVHJhY2tDbGllbnRQcm94eTo6Y2xlYXJTdHJlYW1FbmREb25lKCkgewpAQCAtNTQwLDYgKzU3MSwxMSBAQAogICAgIExPR19BTFdBWVNfRkFUQUwoInN0YXRpYyBmbHVzaCIpOwogfQogCit2b2lkIFN0YXRpY0F1ZGlvVHJhY2tDbGllbnRQcm94eTo6c3RvcCgpCit7CisgICAgOyAvLyBubyBzcGVjaWFsIGhhbmRsaW5nIHJlcXVpcmVkIGZvciBzdGF0aWMgdHJhY2tzLgorfQorCiB2b2lkIFN0YXRpY0F1ZGlvVHJhY2tDbGllbnRQcm94eTo6c2V0TG9vcChzaXplX3QgbG9vcFN0YXJ0LCBzaXplX3QgbG9vcEVuZCwgaW50IGxvb3BDb3VudCkKIHsKICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbiBvbiBhIDY0LWJpdCBjbGllbnQKQEAgLTYzOCw2ICs2NzQsNyBAQAogICAgIGlmIChmbHVzaCAhPSBtRmx1c2gpIHsKICAgICAgICAgQUxPR1YoIlNlcnZlclByb3h5OjpmbHVzaEJ1ZmZlcklmTmVlZGVkKCkgbVN0cmVhbWluZy5tRmx1c2ggPSAweCV4LCBtRmx1c2ggPSAweCUweCIsCiAgICAgICAgICAgICAgICAgZmx1c2gsIG1GbHVzaCk7CisgICAgICAgIC8vIHNob3VsZG4ndCBtYXR0ZXIsIGJ1dCBmb3IgcmFuZ2Ugc2FmZXR5IHVzZSBtUmVhciBpbnN0ZWFkIG9mIGdldFJlYXIoKS4KICAgICAgICAgaW50MzJfdCByZWFyID0gYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZjYmxrLT51Lm1TdHJlYW1pbmcubVJlYXIpOwogICAgICAgICBpbnQzMl90IGZyb250ID0gY2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udDsKIApAQCAtNjc3LDYgKzcxNCw0NiBAQAogfQogCiBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKK2ludDMyX3QgQXVkaW9UcmFja1NlcnZlclByb3h5OjpnZXRSZWFyKCkgY29uc3QKK3sKKyAgICBjb25zdCBpbnQzMl90IHN0b3AgPSBhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJm1DYmxrLT51Lm1TdHJlYW1pbmcubVN0b3ApOworICAgIGNvbnN0IGludDMyX3QgcmVhciA9IGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgmbUNibGstPnUubVN0cmVhbWluZy5tUmVhcik7CisgICAgY29uc3QgaW50MzJfdCBzdG9wTGFzdCA9IG1TdG9wTGFzdC5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX2FjcXVpcmUpOworICAgIGlmIChzdG9wICE9IHN0b3BMYXN0KSB7CisgICAgICAgIGNvbnN0IGludDMyX3QgZnJvbnQgPSBtQ2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udDsKKyAgICAgICAgY29uc3Qgc2l6ZV90IG92ZXJmbG93Qml0ID0gbUZyYW1lQ291bnRQMiA8PCAxOworICAgICAgICBjb25zdCBzaXplX3QgbWFzayA9IG92ZXJmbG93Qml0IC0gMTsKKyAgICAgICAgaW50MzJfdCBuZXdSZWFyID0gKHJlYXIgJiB+bWFzaykgfCAoc3RvcCAmIG1hc2spOworICAgICAgICBzc2l6ZV90IGZpbGxlZCA9IG5ld1JlYXIgLSBmcm9udDsKKyAgICAgICAgLy8gb3ZlcmZsb3dCaXQgaXMgdW5zaWduZWQsIHNvIGNhc3QgdG8gc2lnbmVkIGZvciBjb21wYXJpc29uLgorICAgICAgICBpZiAoZmlsbGVkID49IChzc2l6ZV90KW92ZXJmbG93Qml0KSB7CisgICAgICAgICAgICAvLyBmcm9udCBhbmQgcmVhciBvZmZzZXRzIHNwYW4gdGhlIG92ZXJmbG93IGJpdCBvZiB0aGUgcDIgbWFzaworICAgICAgICAgICAgLy8gc28gcmViYXNpbmcgbmV3UmVhciBvbiB0aGUgcmVhciBvZmZzZXQgaXMgb2ZmIGJ5IHRoZSBvdmVyZmxvdyBiaXQuCisgICAgICAgICAgICBBTE9HVigic3RvcCB3cmFwOiBmaWxsZWQgJXp4ID49IG92ZXJmbG93Qml0ICV6eCIsIGZpbGxlZCwgb3ZlcmZsb3dCaXQpOworICAgICAgICAgICAgbmV3UmVhciAtPSBvdmVyZmxvd0JpdDsKKyAgICAgICAgICAgIGZpbGxlZCAtPSBvdmVyZmxvd0JpdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IG1GcmFtZUNvdW50KSB7CisgICAgICAgICAgICAvLyB3ZSdyZSBzdG9wcGVkLCByZXR1cm4gdGhlIHN0b3AgbGV2ZWwgYXMgbmV3UmVhcgorICAgICAgICAgICAgcmV0dXJuIG5ld1JlYXI7CisgICAgICAgIH0KKworICAgICAgICAvLyBBIGNvcnJ1cHQgc3RvcC4gTG9nIGVycm9yIGFuZCBpZ25vcmUuCisgICAgICAgIEFMT0dFKCJtU3RvcExhc3QgJSN4IC0+IHN0b3AgJSN4LCBmcm9udCAlI3gsIHJlYXIgJSN4LCBtYXNrICUjeCwgbmV3UmVhciAlI3gsICIKKyAgICAgICAgICAgICAgICAiZmlsbGVkICV6ZD0lI3giLAorICAgICAgICAgICAgICAgIHN0b3BMYXN0LCBzdG9wLCBmcm9udCwgcmVhciwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQpbWFzaywgbmV3UmVhciwgZmlsbGVkLCAodW5zaWduZWQpZmlsbGVkKTsKKyAgICAgICAgLy8gRG9uJ3QgcmVzZXQgbVN0b3BMYXN0IGFzIHRoaXMgaXMgY29uc3QuCisgICAgfQorICAgIHJldHVybiByZWFyOworfQorCit2b2lkIEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6c3RhcnQoKQoreworICAgIG1TdG9wTGFzdCA9IGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgmbUNibGstPnUubVN0cmVhbWluZy5tU3RvcCk7Cit9CisKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJpbnRlZ2VyIikpKQogc3RhdHVzX3QgU2VydmVyUHJveHk6Om9idGFpbkJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwgYm9vbCBhY2tGbHVzaCkKIHsKICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGJ1ZmZlciA9PSBOVUxMIHx8IGJ1ZmZlci0+bUZyYW1lQ291bnQgPT0gMCwKQEAgLTY5Myw3ICs3NzAsNyBAQAogICAgIC8vIFNlZSBub3RlcyBvbiBiYXJyaWVycyBhdCBDbGllbnRQcm94eTo6b2J0YWluQnVmZmVyKCkKICAgICBpZiAobUlzT3V0KSB7CiAgICAgICAgIGZsdXNoQnVmZmVySWZOZWVkZWQoKTsgLy8gbWlnaHQgbW9kaWZ5IG1Gcm9udAotICAgICAgICByZWFyID0gYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZjYmxrLT51Lm1TdHJlYW1pbmcubVJlYXIpOworICAgICAgICByZWFyID0gZ2V0UmVhcigpOwogICAgICAgICBmcm9udCA9IGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQ7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZnJvbnQgPSBhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJmNibGstPnUubVN0cmVhbWluZy5tRnJvbnQpOwpAQCAtODI1LDggKzkwMiw3IEBACiAgICAgICAgIC8vIEZJWE1FIHNob3VsZCByZXR1cm4gYW4gYWNjdXJhdGUgdmFsdWUsIGJ1dCBvdmVyLWVzdGltYXRlIGlzIGJldHRlciB0aGFuIHVuZGVyLWVzdGltYXRlCiAgICAgICAgIHJldHVybiBtRnJhbWVDb3VudDsKICAgICB9Ci0gICAgLy8gdGhlIGFjcXVpcmUgbWlnaHQgbm90IGJlIG5lY2Vzc2FyeSBzaW5jZSBub3QgZG9pbmcgYSBzdWJzZXF1ZW50IHJlYWQKLSAgICBpbnQzMl90IHJlYXIgPSBhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJmNibGstPnUubVN0cmVhbWluZy5tUmVhcik7CisgICAgY29uc3QgaW50MzJfdCByZWFyID0gZ2V0UmVhcigpOwogICAgIHNzaXplX3QgZmlsbGVkID0gcmVhciAtIGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQ7CiAgICAgLy8gcGlwZSBzaG91bGQgbm90IGFscmVhZHkgYmUgb3ZlcmZ1bGwKICAgICBpZiAoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gbUZyYW1lQ291bnQpKSB7CkBAIC04NTIsNyArOTI4LDcgQEAKICAgICBpZiAoZmx1c2ggIT0gbUZsdXNoKSB7CiAgICAgICAgIHJldHVybiBtRnJhbWVDb3VudDsKICAgICB9Ci0gICAgY29uc3QgaW50MzJfdCByZWFyID0gYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZjYmxrLT51Lm1TdHJlYW1pbmcubVJlYXIpOworICAgIGNvbnN0IGludDMyX3QgcmVhciA9IGdldFJlYXIoKTsKICAgICBjb25zdCBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBjYmxrLT51Lm1TdHJlYW1pbmcubUZyb250OwogICAgIGlmICghKDAgPD0gZmlsbGVkICYmIChzaXplX3QpIGZpbGxlZCA8PSBtRnJhbWVDb3VudCkpIHsKICAgICAgICAgcmV0dXJuIDA7IC8vIGVycm9yIGNvbmRpdGlvbiwgc2lsZW50bHkgcmV0dXJuIDAuCkBAIC0xMTQ5LDYgKzEyMjUsMTIgQEAKICAgICB9CiB9CiAKK2ludDMyX3QgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5OjpnZXRSZWFyKCkgY29uc3QKK3sKKyAgICBMT0dfQUxXQVlTX0ZBVEFMKCJnZXRSZWFyKCkgbm90IHBlcm1pdHRlZCBmb3Igc3RhdGljIHRyYWNrcyIpOworICAgIHJldHVybiAwOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9GbGluZ2VyLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwCmluZGV4IDE0ZmVhZGEuLjAwYWY3ZTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwCkBAIC0yMiw3ICsyMiwxMSBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGN1dGlscy9tdWx0aXVzZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9UaW1lQ2hlY2suaD4KKyNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KIAogI2luY2x1ZGUgIklBdWRpb0ZsaW5nZXIuaCIKIApAQCAtMzAsNyArMzQsNyBAQAogCiBlbnVtIHsKICAgICBDUkVBVEVfVFJBQ0sgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAotICAgIE9QRU5fUkVDT1JELAorICAgIENSRUFURV9SRUNPUkQsCiAgICAgU0FNUExFX1JBVEUsCiAgICAgUkVTRVJWRUQsICAgLy8gb2Jzb2xldGUsIHdhcyBDSEFOTkVMX0NPVU5UCiAgICAgRk9STUFULApAQCAtNDcsNiArNTEsNyBAQAogICAgIFNFVF9NT0RFLAogICAgIFNFVF9NSUNfTVVURSwKICAgICBHRVRfTUlDX01VVEUsCisgICAgU0VUX1JFQ09SRF9TSUxFTkNFRCwKICAgICBTRVRfUEFSQU1FVEVSUywKICAgICBHRVRfUEFSQU1FVEVSUywKICAgICBSRUdJU1RFUl9DTElFTlQsCkBAIC04Myw2ICs4OCw3IEBACiAgICAgR0VUX0FVRElPX0hXX1NZTkNfRk9SX1NFU1NJT04sCiAgICAgU1lTVEVNX1JFQURZLAogICAgIEZSQU1FX0NPVU5UX0hBTCwKKyAgICBHRVRfTUlDUk9QSE9ORVMsCiB9OwogCiAjZGVmaW5lIE1BWF9JVEVNU19QRVJfTElTVCAxMDI0CkBAIC05NSwxODIgKzEwMSw3NCBAQAogICAgIHsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHNwPElBdWRpb1RyYWNrPiBjcmVhdGVUcmFjaygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAqZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKKyAgICB2aXJ0dWFsIHNwPElBdWRpb1RyYWNrPiBjcmVhdGVUcmFjayhjb25zdCBDcmVhdGVUcmFja0lucHV0JiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVUcmFja091dHB1dCYgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIHNwPElBdWRpb1RyYWNrPiB0cmFjazsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc3RyZWFtVHlwZSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzYW1wbGVSYXRlKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGZvcm1hdCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihjaGFubmVsTWFzayk7Ci0gICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gcEZyYW1lQ291bnQgIT0gTlVMTCA/ICpwRnJhbWVDb3VudCA6IDA7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQ2NChmcmFtZUNvdW50KTsKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbEZsYWdzID0gZmxhZ3MgIT0gTlVMTCA/ICpmbGFncyA6IEFVRElPX09VVFBVVF9GTEFHX05PTkU7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihsRmxhZ3MpOwotICAgICAgICAvLyBoYXZlU2hhcmVkQnVmZmVyCi0gICAgICAgIGlmIChzaGFyZWRCdWZmZXIgIT0gMCkgewotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKHRydWUpOwotICAgICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihzaGFyZWRCdWZmZXIpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihmYWxzZSk7CisKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gdHJhY2s7CiAgICAgICAgIH0KLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBvdXRwdXQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHBpZCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgdGlkKTsKLSAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGxTZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFOwotICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGxTZXNzaW9uSWQgPSAqc2Vzc2lvbklkOwotICAgICAgICB9Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihsU2Vzc2lvbklkKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGNsaWVudFVpZCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0SWQpOworCisgICAgICAgIGlucHV0LndyaXRlVG9QYXJjZWwoJmRhdGEpOworCiAgICAgICAgIHN0YXR1c190IGxTdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQ1JFQVRFX1RSQUNLLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrIGVycm9yOiAlcyIsIHN0cmVycm9yKC1sU3RhdHVzKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmcmFtZUNvdW50ID0gcmVwbHkucmVhZEludDY0KCk7Ci0gICAgICAgICAgICBpZiAocEZyYW1lQ291bnQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICpwRnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoZmxhZ3MgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICpmbGFncyA9IGxGbGFnczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxTZXNzaW9uSWQgPSAoYXVkaW9fc2Vzc2lvbl90KSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICpzZXNzaW9uSWQgPSBsU2Vzc2lvbklkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbFN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdHJhY2sgPSBpbnRlcmZhY2VfY2FzdDxJQXVkaW9UcmFjaz4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICAgICAgICAgIGlmIChsU3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYWNrID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrIHNob3VsZCBoYXZlIHJldHVybmVkIGFuIElBdWRpb1RyYWNrIik7Ci0gICAgICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBVTktOT1dOX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYWNrICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrIHJldHVybmVkIGFuIElBdWRpb1RyYWNrIGJ1dCB3aXRoIHN0YXR1cyAlZCIsIGxTdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICB0cmFjay5jbGVhcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFjayB0cmFuc2FjdGlvbiBlcnJvciAlZCIsIGxTdGF0dXMpOworICAgICAgICAgICAgKnN0YXR1cyA9IERFQURfT0JKRUNUOworICAgICAgICAgICAgcmV0dXJuIHRyYWNrOwogICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTlVMTCkgewotICAgICAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7CisgICAgICAgICpzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKCpzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFjayByZXR1cm5lZCBlcnJvciAlZCIsICpzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIHRyYWNrOwogICAgICAgICB9CisgICAgICAgIHRyYWNrID0gaW50ZXJmYWNlX2Nhc3Q8SUF1ZGlvVHJhY2s+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgIGlmICh0cmFjayA9PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2sgcmV0dXJuZWQgYW4gTlVMTCBJQXVkaW9UcmFjayB3aXRoIHN0YXR1cyBPSyIpOworICAgICAgICAgICAgKnN0YXR1cyA9IERFQURfT0JKRUNUOworICAgICAgICAgICAgcmV0dXJuIHRyYWNrOworICAgICAgICB9CisgICAgICAgIG91dHB1dC5yZWFkRnJvbVBhcmNlbCgmcmVwbHkpOwogICAgICAgICByZXR1cm4gdHJhY2s7CiAgICAgfQogCi0gICAgdmlydHVhbCBzcDxJQXVkaW9SZWNvcmQ+IG9wZW5SZWNvcmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwRnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCAqZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgKnNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpub3RpZmljYXRpb25GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+JiBjYmxrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJTWVtb3J5PiYgYnVmZmVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCisgICAgdmlydHVhbCBzcDxtZWRpYTo6SUF1ZGlvUmVjb3JkPiBjcmVhdGVSZWNvcmQoY29uc3QgQ3JlYXRlUmVjb3JkSW5wdXQmIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVJlY29yZE91dHB1dCYgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIHNwPElBdWRpb1JlY29yZD4gcmVjb3JkOworICAgICAgICBzcDxtZWRpYTo6SUF1ZGlvUmVjb3JkPiByZWNvcmQ7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGlucHV0KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNhbXBsZVJhdGUpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoZm9ybWF0KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxNYXNrKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KG9wUGFja2FnZU5hbWUpOwotICAgICAgICBzaXplX3QgZnJhbWVDb3VudCA9IHBGcmFtZUNvdW50ICE9IE5VTEwgPyAqcEZyYW1lQ291bnQgOiAwOwotICAgICAgICBkYXRhLndyaXRlSW50NjQoZnJhbWVDb3VudCk7Ci0gICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgbEZsYWdzID0gZmxhZ3MgIT0gTlVMTCA/ICpmbGFncyA6IEFVRElPX0lOUFVUX0ZMQUdfTk9ORTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGxGbGFncyk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgcGlkKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSB0aWQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGNsaWVudFVpZCk7Ci0gICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBsU2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURTsKLSAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBsU2Vzc2lvbklkID0gKnNlc3Npb25JZDsKKworICAgICAgICBpZiAoc3RhdHVzID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiByZWNvcmQ7CiAgICAgICAgIH0KLSAgICAgICAgZGF0YS53cml0ZUludDMyKGxTZXNzaW9uSWQpOwotICAgICAgICBkYXRhLndyaXRlSW50NjQobm90aWZpY2F0aW9uRnJhbWVzICE9IE5VTEwgPyAqbm90aWZpY2F0aW9uRnJhbWVzIDogMCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0SWQpOwotICAgICAgICBjYmxrLmNsZWFyKCk7Ci0gICAgICAgIGJ1ZmZlcnMuY2xlYXIoKTsKLSAgICAgICAgc3RhdHVzX3QgbFN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX1JFQ09SRCwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICBpbnB1dC53cml0ZVRvUGFyY2VsKCZkYXRhKTsKKworICAgICAgICBzdGF0dXNfdCBsU3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KENSRUFURV9SRUNPUkQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgib3BlblJlY29yZCBlcnJvcjogJXMiLCBzdHJlcnJvcigtbFN0YXR1cykpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZnJhbWVDb3VudCA9IHJlcGx5LnJlYWRJbnQ2NCgpOwotICAgICAgICAgICAgaWYgKHBGcmFtZUNvdW50ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqcEZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbEZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoZmxhZ3MgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICpmbGFncyA9IGxGbGFnczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxTZXNzaW9uSWQgPSAoYXVkaW9fc2Vzc2lvbl90KSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICpzZXNzaW9uSWQgPSBsU2Vzc2lvbklkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2l6ZV90IGxOb3RpZmljYXRpb25GcmFtZXMgPSAoc2l6ZV90KSByZXBseS5yZWFkSW50NjQoKTsKLSAgICAgICAgICAgIGlmIChub3RpZmljYXRpb25GcmFtZXMgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICpub3RpZmljYXRpb25GcmFtZXMgPSBsTm90aWZpY2F0aW9uRnJhbWVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbFN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVjb3JkID0gaW50ZXJmYWNlX2Nhc3Q8SUF1ZGlvUmVjb3JkPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICAgICAgY2JsayA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICAgICBpZiAoY2JsayAhPSAwICYmIGNibGstPnBvaW50ZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgY2Jsay5jbGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmZmVycyA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICAgICBpZiAoYnVmZmVycyAhPSAwICYmIGJ1ZmZlcnMtPnBvaW50ZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVycy5jbGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxTdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVjb3JkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIm9wZW5SZWNvcmQgc2hvdWxkIGhhdmUgcmV0dXJuZWQgYW4gSUF1ZGlvUmVjb3JkIik7Ci0gICAgICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBVTktOT1dOX0VSUk9SOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2JsayA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJvcGVuUmVjb3JkIHNob3VsZCBoYXZlIHJldHVybmVkIGEgY2JsayIpOwotICAgICAgICAgICAgICAgICAgICBsU3RhdHVzID0gTk9fTUVNT1JZOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBidWZmZXJzIGlzIHBlcm1pdHRlZCB0byBiZSAwCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChyZWNvcmQgIT0gMCB8fCBjYmxrICE9IDAgfHwgYnVmZmVycyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJvcGVuUmVjb3JkIHJldHVybmVkIGFuIElBdWRpb1JlY29yZCwgY2JsaywgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAib3IgYnVmZmVycyBidXQgd2l0aCBzdGF0dXMgJWQiLCBsU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJlY29yZC5jbGVhcigpOwotICAgICAgICAgICAgICAgIGNibGsuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBidWZmZXJzLmNsZWFyKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HRSgiY3JlYXRlUmVjb3JkIHRyYW5zYWN0aW9uIGVycm9yICVkIiwgbFN0YXR1cyk7CisgICAgICAgICAgICAqc3RhdHVzID0gREVBRF9PQkpFQ1Q7CisgICAgICAgICAgICByZXR1cm4gcmVjb3JkOwogICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTlVMTCkgewotICAgICAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7CisgICAgICAgICpzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKCpzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVSZWNvcmQgcmV0dXJuZWQgZXJyb3IgJWQiLCAqc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiByZWNvcmQ7CiAgICAgICAgIH0KKworICAgICAgICByZWNvcmQgPSBpbnRlcmZhY2VfY2FzdDxtZWRpYTo6SUF1ZGlvUmVjb3JkPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICBpZiAocmVjb3JkID09IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVSZWNvcmQgcmV0dXJuZWQgYSBOVUxMIElBdWRpb1JlY29yZCB3aXRoIHN0YXR1cyBPSyIpOworICAgICAgICAgICAgKnN0YXR1cyA9IERFQURfT0JKRUNUOworICAgICAgICAgICAgcmV0dXJuIHJlY29yZDsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXQucmVhZEZyb21QYXJjZWwoJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHJlY29yZDsKICAgICB9CiAKQEAgLTQxMyw2ICszMTEsMTUgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAorICAgIHZpcnR1YWwgdm9pZCBzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIodWlkKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHNpbGVuY2VkID8gMSA6IDApOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1JFQ09SRF9TSUxFTkNFRCwgZGF0YSwgJnJlcGx5KTsKKyAgICB9CisKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC04MDQsMTQgKzcxMSwxOCBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDY0KCk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMb3dSYW1EZXZpY2UoYm9vbCBpc0xvd1JhbURldmljZSkKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldExvd1JhbURldmljZShib29sIGlzTG93UmFtRGV2aWNlLCBpbnQ2NF90IHRvdGFsTWVtb3J5KSBvdmVycmlkZQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQpIGlzTG93UmFtRGV2aWNlKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9MT1dfUkFNX0RFVklDRSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworCisgICAgICAgIHN0YXRpY19hc3NlcnQoTk9fRVJST1IgPT0gMCwgIk5PX0VSUk9SIG11c3QgYmUgMCIpOworICAgICAgICByZXR1cm4gZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSkKKyAgICAgICAgICAgICAgICA/OiBkYXRhLndyaXRlSW50MzIoKGludCkgaXNMb3dSYW1EZXZpY2UpCisgICAgICAgICAgICAgICAgPzogZGF0YS53cml0ZUludDY0KHRvdGFsTWVtb3J5KQorICAgICAgICAgICAgICAgID86IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfTE9XX1JBTV9ERVZJQ0UsIGRhdGEsICZyZXBseSkKKyAgICAgICAgICAgICAgICA/OiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzKQogICAgIHsKQEAgLTkzNSw2ICs4NDYsMTggQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDY0KCk7CiAgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX01JQ1JPUEhPTkVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8CisgICAgICAgICAgICAgICAgKHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZFBhcmNlbGFibGVWZWN0b3IobWljcm9waG9uZXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShBdWRpb0ZsaW5nZXIsICJhbmRyb2lkLm1lZGlhLklBdWRpb0ZsaW5nZXIiKTsKQEAgLTk0NCwyMSArODY3LDgxIEBACiBzdGF0dXNfdCBCbkF1ZGlvRmxpbmdlcjo6b25UcmFuc2FjdCgKICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQogeworICAgIC8vIG1ha2Ugc3VyZSB0cmFuc2FjdGlvbnMgcmVzZXJ2ZWQgdG8gQXVkaW9Qb2xpY3lNYW5hZ2VyIGRvIG5vdCBjb21lIGZyb20gb3RoZXIgcHJvY2Vzc2VzCisgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICAgIGNhc2UgU0VUX1NUUkVBTV9WT0xVTUU6CisgICAgICAgIGNhc2UgU0VUX1NUUkVBTV9NVVRFOgorICAgICAgICBjYXNlIE9QRU5fT1VUUFVUOgorICAgICAgICBjYXNlIE9QRU5fRFVQTElDQVRFX09VVFBVVDoKKyAgICAgICAgY2FzZSBDTE9TRV9PVVRQVVQ6CisgICAgICAgIGNhc2UgU1VTUEVORF9PVVRQVVQ6CisgICAgICAgIGNhc2UgUkVTVE9SRV9PVVRQVVQ6CisgICAgICAgIGNhc2UgT1BFTl9JTlBVVDoKKyAgICAgICAgY2FzZSBDTE9TRV9JTlBVVDoKKyAgICAgICAgY2FzZSBJTlZBTElEQVRFX1NUUkVBTToKKyAgICAgICAgY2FzZSBTRVRfVk9JQ0VfVk9MVU1FOgorICAgICAgICBjYXNlIE1PVkVfRUZGRUNUUzoKKyAgICAgICAgY2FzZSBMT0FEX0hXX01PRFVMRToKKyAgICAgICAgY2FzZSBMSVNUX0FVRElPX1BPUlRTOgorICAgICAgICBjYXNlIEdFVF9BVURJT19QT1JUOgorICAgICAgICBjYXNlIENSRUFURV9BVURJT19QQVRDSDoKKyAgICAgICAgY2FzZSBSRUxFQVNFX0FVRElPX1BBVENIOgorICAgICAgICBjYXNlIExJU1RfQVVESU9fUEFUQ0hFUzoKKyAgICAgICAgY2FzZSBTRVRfQVVESU9fUE9SVF9DT05GSUc6CisgICAgICAgIGNhc2UgU0VUX1JFQ09SRF9TSUxFTkNFRDoKKyAgICAgICAgICAgIEFMT0dXKCIlczogdHJhbnNhY3Rpb24gJWQgcmVjZWl2ZWQgZnJvbSBQSUQgJWQiLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNvZGUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CisgICAgICAgICAgICAvLyByZXR1cm4gc3RhdHVzIG9ubHkgZm9yIG5vbiB2b2lkIG1ldGhvZHMKKyAgICAgICAgICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgU0VUX1JFQ09SRF9TSUxFTkNFRDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4gKElOVkFMSURfT1BFUkFUSU9OKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gbWFrZSBzdXJlIHRoZSBmb2xsb3dpbmcgdHJhbnNhY3Rpb25zIGNvbWUgZnJvbSBzeXN0ZW0gY29tcG9uZW50cworICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgICBjYXNlIFNFVF9NQVNURVJfVk9MVU1FOgorICAgICAgICBjYXNlIFNFVF9NQVNURVJfTVVURToKKyAgICAgICAgY2FzZSBTRVRfTU9ERToKKyAgICAgICAgY2FzZSBTRVRfTUlDX01VVEU6CisgICAgICAgIGNhc2UgU0VUX0xPV19SQU1fREVWSUNFOgorICAgICAgICBjYXNlIFNZU1RFTV9SRUFEWTogeworICAgICAgICAgICAgaWYgKG11bHRpdXNlcl9nZXRfYXBwX2lkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkgPj0gQUlEX0FQUF9TVEFSVCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlczogdHJhbnNhY3Rpb24gJWQgcmVjZWl2ZWQgZnJvbSBQSUQgJWQgdW5hdXRob3JpemVkIFVJRCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNvZGUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOworICAgICAgICAgICAgICAgIC8vIHJldHVybiBzdGF0dXMgb25seSBmb3Igbm9uIHZvaWQgbWV0aG9kcworICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFNZU1RFTV9SRUFEWToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4gKElOVkFMSURfT1BFUkFUSU9OKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCiAgICAgLy8gV2hpdGVsaXN0IG9mIHJlbGV2YW50IGV2ZW50cyB0byB0cmlnZ2VyIGxvZyBtZXJnaW5nLgogICAgIC8vIExvZyBtZXJnaW5nIHNob3VsZCBhY3RpdmF0ZSBkdXJpbmcgYXVkaW8gYWN0aXZpdHkgb2YgYW55IGtpbmQuIFRoaXMgYXJlIGNvbnNpZGVyZWQgdGhlCiAgICAgLy8gbW9zdCByZWxldmFudCBldmVudHMuCiAgICAgLy8gVE9ETyBzaG91bGQgc2VsZWN0IG1vcmUgd2lzZWx5IHRoZSBpdGVtcyBmcm9tIHRoZSBsaXN0CiAgICAgc3dpdGNoIChjb2RlKSB7CiAgICAgICAgIGNhc2UgQ1JFQVRFX1RSQUNLOgotICAgICAgICBjYXNlIE9QRU5fUkVDT1JEOgorICAgICAgICBjYXNlIENSRUFURV9SRUNPUkQ6CiAgICAgICAgIGNhc2UgU0VUX01BU1RFUl9WT0xVTUU6CiAgICAgICAgIGNhc2UgU0VUX01BU1RFUl9NVVRFOgotICAgICAgICBjYXNlIFNFVF9TVFJFQU1fVk9MVU1FOgotICAgICAgICBjYXNlIFNFVF9TVFJFQU1fTVVURToKICAgICAgICAgY2FzZSBTRVRfTUlDX01VVEU6CiAgICAgICAgIGNhc2UgU0VUX1BBUkFNRVRFUlM6Ci0gICAgICAgIGNhc2UgT1BFTl9JTlBVVDoKLSAgICAgICAgY2FzZSBTRVRfVk9JQ0VfVk9MVU1FOgogICAgICAgICBjYXNlIENSRUFURV9FRkZFQ1Q6CiAgICAgICAgIGNhc2UgU1lTVEVNX1JFQURZOiB7CiAgICAgICAgICAgICByZXF1ZXN0TG9nTWVyZ2UoKTsKQEAgLTk2Nyw3NyArOTUwLDU4IEBACiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBicmVhazsKICAgICB9CisKKyAgICBUaW1lQ2hlY2sgY2hlY2soIklBdWRpb0ZsaW5nZXIiKTsKKwogICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICBjYXNlIENSRUFURV9UUkFDSzogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGludCBzdHJlYW1UeXBlID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBkYXRhLnJlYWRJbnQ2NCgpOwotICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBib29sIGhhdmVTaGFyZWRCdWZmZXIgPSBkYXRhLnJlYWRJbnQzMigpICE9IDA7Ci0gICAgICAgICAgICBzcDxJTWVtb3J5PiBidWZmZXI7Ci0gICAgICAgICAgICBpZiAoaGF2ZVNoYXJlZEJ1ZmZlcikgewotICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKworICAgICAgICAgICAgQ3JlYXRlVHJhY2tJbnB1dCBpbnB1dDsKKyAgICAgICAgICAgIGlmIChpbnB1dC5yZWFkRnJvbVBhcmNlbCgoUGFyY2VsKikmZGF0YSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihERUFEX09CSkVDVCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcGlkX3QgcGlkID0gKHBpZF90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcGlkX3QgdGlkID0gKHBpZF90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IChhdWRpb19zZXNzaW9uX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpbnQgY2xpZW50VWlkID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gKGF1ZGlvX3BvcnRfaGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICAgICAgICAgIHNwPElBdWRpb1RyYWNrPiB0cmFjazsKLSAgICAgICAgICAgIGlmICgoaGF2ZVNoYXJlZEJ1ZmZlciAmJiAoYnVmZmVyID09IDApKSB8fAotICAgICAgICAgICAgICAgICAgICAoKGJ1ZmZlciAhPSAwKSAmJiAoYnVmZmVyLT5wb2ludGVyKCkgPT0gTlVMTCkpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIkNSRUFURV9UUkFDSzogY2Fubm90IHJldHJpZXZlIHNoYXJlZCBtZW1vcnkiKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBERUFEX09CSkVDVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHJhY2sgPSBjcmVhdGVUcmFjaygKLSAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19zdHJlYW1fdHlwZV90KSBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgJmZyYW1lQ291bnQsICZmbGFncywgYnVmZmVyLCBvdXRwdXQsIHBpZCwgdGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgJnNlc3Npb25JZCwgY2xpZW50VWlkLCAmc3RhdHVzLCBwb3J0SWQpOwotICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKHRyYWNrICE9IDApICE9IChzdGF0dXMgPT0gTk9fRVJST1IpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KGZyYW1lQ291bnQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZmxhZ3MpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2Vzc2lvbklkKTsKKworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICAgICAgQ3JlYXRlVHJhY2tPdXRwdXQgb3V0cHV0OworCisgICAgICAgICAgICBzcDxJQXVkaW9UcmFjaz4gdHJhY2s9IGNyZWF0ZVRyYWNrKGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOworCisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCh0cmFjayAhPSAwKSAhPSAoc3RhdHVzID09IE5PX0VSUk9SKSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcih0cmFjaykpOworICAgICAgICAgICAgb3V0cHV0LndyaXRlVG9QYXJjZWwocmVwbHkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIE9QRU5fUkVDT1JEOiB7CisgICAgICAgIGNhc2UgQ1JFQVRFX1JFQ09SRDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSA9IGRhdGEucmVhZFN0cmluZzE2KCk7Ci0gICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCA9IGRhdGEucmVhZEludDY0KCk7Ci0gICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBwaWRfdCBwaWQgPSAocGlkX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBwaWRfdCB0aWQgPSAocGlkX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpbnQgY2xpZW50VWlkID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSAoYXVkaW9fc2Vzc2lvbl90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc2l6ZV90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IGRhdGEucmVhZEludDY0KCk7Ci0gICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IChhdWRpb19wb3J0X2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc3A8SU1lbW9yeT4gY2JsazsKLSAgICAgICAgICAgIHNwPElNZW1vcnk+IGJ1ZmZlcnM7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICAgICAgICAgIHNwPElBdWRpb1JlY29yZD4gcmVjb3JkID0gb3BlblJlY29yZChpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgb3BQYWNrYWdlTmFtZSwgJmZyYW1lQ291bnQsICZmbGFncywKLSAgICAgICAgICAgICAgICAgICAgcGlkLCB0aWQsIGNsaWVudFVpZCwgJnNlc3Npb25JZCwgJm5vdGlmaWNhdGlvbkZyYW1lcywgY2JsaywgYnVmZmVycywKLSAgICAgICAgICAgICAgICAgICAgJnN0YXR1cywgcG9ydElkKTsKKworICAgICAgICAgICAgQ3JlYXRlUmVjb3JkSW5wdXQgaW5wdXQ7CisgICAgICAgICAgICBpZiAoaW5wdXQucmVhZEZyb21QYXJjZWwoKFBhcmNlbCopJmRhdGEpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoREVBRF9PQkpFQ1QpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICAgICAgQ3JlYXRlUmVjb3JkT3V0cHV0IG91dHB1dDsKKworICAgICAgICAgICAgc3A8bWVkaWE6OklBdWRpb1JlY29yZD4gcmVjb3JkID0gY3JlYXRlUmVjb3JkKGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKKwogICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigocmVjb3JkICE9IDApICE9IChzdGF0dXMgPT0gTk9fRVJST1IpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KGZyYW1lQ291bnQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZmxhZ3MpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2Vzc2lvbklkKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KG5vdGlmaWNhdGlvbkZyYW1lcyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihyZWNvcmQpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihjYmxrKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoYnVmZmVycykpOworICAgICAgICAgICAgb3V0cHV0LndyaXRlVG9QYXJjZWwocmVwbHkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNBTVBMRV9SQVRFOiB7CkBAIC0xMTI3LDYgKzEwOTEsMTUgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCBnZXRNaWNNdXRlKCkgKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBTRVRfUkVDT1JEX1NJTEVOQ0VEOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgdWlkX3QgdWlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZTsKKyAgICAgICAgICAgIGRhdGEucmVhZCgmc291cmNlLCBzaXplb2YoYXVkaW9fc291cmNlX3QpKTsKKyAgICAgICAgICAgIGJvb2wgc2lsZW5jZWQgPSBkYXRhLnJlYWRJbnQzMigpID09IDE7CisgICAgICAgICAgICBzZXRSZWNvcmRTaWxlbmNlZCh1aWQsIHNpbGVuY2VkKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTRVRfUEFSQU1FVEVSUzogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlID0gKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwpAQCAtMTM2NCw4ICsxMzM3LDEzIEBACiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgU0VUX0xPV19SQU1fREVWSUNFOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYm9vbCBpc0xvd1JhbURldmljZSA9IGRhdGEucmVhZEludDMyKCkgIT0gMDsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldExvd1JhbURldmljZShpc0xvd1JhbURldmljZSkpOworICAgICAgICAgICAgaW50MzJfdCBpc0xvd1JhbURldmljZTsKKyAgICAgICAgICAgIGludDY0X3QgdG90YWxNZW1vcnk7CisgICAgICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgICAgICAgICBkYXRhLnJlYWRJbnQzMigmaXNMb3dSYW1EZXZpY2UpID86CisgICAgICAgICAgICAgICAgICAgIGRhdGEucmVhZEludDY0KCZ0b3RhbE1lbW9yeSkgPzoKKyAgICAgICAgICAgICAgICAgICAgc2V0TG93UmFtRGV2aWNlKGlzTG93UmFtRGV2aWNlICE9IDAsIHRvdGFsTWVtb3J5KTsKKyAgICAgICAgICAgICh2b2lkKXJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgTElTVF9BVURJT19QT1JUUzogewpAQCAtMTQ4MSw2ICsxNDU5LDE2IEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NCggZnJhbWVDb3VudEhBTCgoYXVkaW9faW9faGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCkpICk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgR0VUX01JQ1JPUEhPTkVTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiBtaWNyb3Bob25lczsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldE1pY3JvcGhvbmVzKCZtaWNyb3Bob25lcyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVBhcmNlbGFibGVWZWN0b3IobWljcm9waG9uZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKaW5kZXggZjA3MWEwMi4uZWNhNmZlZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAKQEAgLTIyLDExICsyMiwxMyBAQAogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLQorI2luY2x1ZGUgPGN1dGlscy9tdWx0aXVzZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaD4KLQorI2luY2x1ZGUgPG1lZGlhL1RpbWVDaGVjay5oPgorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0xNjAsMjggKzE2MiwxMSBAQAogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCisgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdHJlYW0pKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNhbXBsaW5nUmF0ZSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGZvcm1hdCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoY2hhbm5lbE1hc2spOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihmbGFncykpOwotICAgICAgICAvLyBoYXNPZmZsb2FkSW5mbwotICAgICAgICBpZiAob2ZmbG9hZEluZm8gPT0gTlVMTCkgewotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOwotICAgICAgICAgICAgZGF0YS53cml0ZShvZmZsb2FkSW5mbywgc2l6ZW9mKGF1ZGlvX29mZmxvYWRfaW5mb190KSk7Ci0gICAgICAgIH0KICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9PVVRQVVQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQpAQCAtMTkwLDYgKzE3NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLApAQCAtMjMzLDYgKzIxOSw3IEBACiAgICAgICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOwogICAgICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigqc3RyZWFtKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwaWQpOwogICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKHVpZCk7CiAgICAgICAgICAgICBkYXRhLndyaXRlKGNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSk7CiAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihmbGFncykpOwpAQCAtMjk5LDYgKzI4Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLApAQCAtMzI3LDYgKzMxNSw3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBpZCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMih1aWQpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYob3BQYWNrYWdlTmFtZSk7CiAgICAgICAgIGRhdGEud3JpdGUoY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX2Jhc2VfdCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZmxhZ3MpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoKnNlbGVjdGVkRGV2aWNlSWQpOwpAQCAtMzQ1LDM1ICszMzQsMzMgQEAKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzaWxlbmNlZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihpbnB1dCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRJZCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigqc2lsZW5jZWQgPyAxIDogMCk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTVEFSVF9JTlBVVCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICAqc2lsZW5jZWQgPSByZXBseS5yZWFkSW50MzIoKSA9PSAxOworICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGlucHV0KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNlc3Npb24pOworICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydElkKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNUT1BfSU5QVVQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoaW5wdXQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2Vzc2lvbik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0SWQpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRV9JTlBVVCwgZGF0YSwgJnJlcGx5KTsKICAgICB9CiAKQEAgLTg0OCwxMCArODM1LDY5IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotCiBzdGF0dXNfdCBCbkF1ZGlvUG9saWN5U2VydmljZTo6b25UcmFuc2FjdCgKICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQogeworICAgIC8vIG1ha2Ugc3VyZSB0cmFuc2FjdGlvbnMgcmVzZXJ2ZWQgdG8gQXVkaW9GbGluZ2VyIGRvIG5vdCBjb21lIGZyb20gb3RoZXIgcHJvY2Vzc2VzCisgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICAgIGNhc2UgU1RBUlRfT1VUUFVUOgorICAgICAgICBjYXNlIFNUT1BfT1VUUFVUOgorICAgICAgICBjYXNlIFJFTEVBU0VfT1VUUFVUOgorICAgICAgICBjYXNlIEdFVF9JTlBVVF9GT1JfQVRUUjoKKyAgICAgICAgY2FzZSBTVEFSVF9JTlBVVDoKKyAgICAgICAgY2FzZSBTVE9QX0lOUFVUOgorICAgICAgICBjYXNlIFJFTEVBU0VfSU5QVVQ6CisgICAgICAgIGNhc2UgR0VUX1NUUkFURUdZX0ZPUl9TVFJFQU06CisgICAgICAgIGNhc2UgR0VUX09VVFBVVF9GT1JfRUZGRUNUOgorICAgICAgICBjYXNlIFJFR0lTVEVSX0VGRkVDVDoKKyAgICAgICAgY2FzZSBVTlJFR0lTVEVSX0VGRkVDVDoKKyAgICAgICAgY2FzZSBTRVRfRUZGRUNUX0VOQUJMRUQ6CisgICAgICAgIGNhc2UgR0VUX09VVFBVVF9GT1JfQVRUUjoKKyAgICAgICAgY2FzZSBBQ1FVSVJFX1NPVU5EVFJJR0dFUl9TRVNTSU9OOgorICAgICAgICBjYXNlIFJFTEVBU0VfU09VTkRUUklHR0VSX1NFU1NJT046CisgICAgICAgICAgICBBTE9HVygiJXM6IHRyYW5zYWN0aW9uICVkIHJlY2VpdmVkIGZyb20gUElEICVkIiwKKyAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjb2RlLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOworICAgICAgICAgICAgLy8gcmV0dXJuIHN0YXR1cyBvbmx5IGZvciBub24gdm9pZCBtZXRob2RzCisgICAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFJFTEVBU0VfT1VUUFVUOgorICAgICAgICAgICAgICAgIGNhc2UgUkVMRUFTRV9JTlBVVDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4gKElOVkFMSURfT1BFUkFUSU9OKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gbWFrZSBzdXJlIHRoZSBmb2xsb3dpbmcgdHJhbnNhY3Rpb25zIGNvbWUgZnJvbSBzeXN0ZW0gY29tcG9uZW50cworICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgICBjYXNlIFNFVF9ERVZJQ0VfQ09OTkVDVElPTl9TVEFURToKKyAgICAgICAgY2FzZSBIQU5ETEVfREVWSUNFX0NPTkZJR19DSEFOR0U6CisgICAgICAgIGNhc2UgU0VUX1BIT05FX1NUQVRFOgorLy9GSVhNRTogQWxsb3cgU0VUX0ZPUkNFX1VTRSBjYWxscyBmcm9tIHN5c3RlbSBhcHBzIHVudGlsIGEgYmV0dGVyIHVzZSBjYXNlIHJvdXRpbmcgQVBJIGlzIGF2YWlsYWJsZQorLy8gICAgICBjYXNlIFNFVF9GT1JDRV9VU0U6CisgICAgICAgIGNhc2UgSU5JVF9TVFJFQU1fVk9MVU1FOgorICAgICAgICBjYXNlIFNFVF9TVFJFQU1fVk9MVU1FOgorICAgICAgICBjYXNlIFJFR0lTVEVSX1BPTElDWV9NSVhFUzoKKyAgICAgICAgY2FzZSBTRVRfTUFTVEVSX01PTk86CisgICAgICAgIGNhc2UgU1RBUlRfQVVESU9fU09VUkNFOgorICAgICAgICBjYXNlIFNUT1BfQVVESU9fU09VUkNFOiB7CisgICAgICAgICAgICBpZiAobXVsdGl1c2VyX2dldF9hcHBfaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSA+PSBBSURfQVBQX1NUQVJUKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzOiB0cmFuc2FjdGlvbiAlZCByZWNlaXZlZCBmcm9tIFBJRCAlZCB1bmF1dGhvcml6ZWQgVUlEICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY29kZSwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAorICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4gKElOVkFMSURfT1BFUkFUSU9OKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgVGltZUNoZWNrIGNoZWNrKCJJQXVkaW9Qb2xpY3lTZXJ2aWNlIik7CisKICAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgICAgY2FzZSBTRVRfREVWSUNFX0NPTk5FQ1RJT05fU1RBVEU6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CkBAIC05MzQsMjIgKzk4MCw3IEBACiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPQogICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fc3RyZWFtX3R5cGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYm9vbCBoYXNPZmZsb2FkSW5mbyA9IGRhdGEucmVhZEludDMyKCkgIT0gMDsKLSAgICAgICAgICAgIGF1ZGlvX29mZmxvYWRfaW5mb190IG9mZmxvYWRJbmZvID0ge307Ci0gICAgICAgICAgICBpZiAoaGFzT2ZmbG9hZEluZm8pIHsKLSAgICAgICAgICAgICAgICBkYXRhLnJlYWQoJm9mZmxvYWRJbmZvLCBzaXplb2YoYXVkaW9fb2ZmbG9hZF9pbmZvX3QpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IGdldE91dHB1dChzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNPZmZsb2FkSW5mbyA/ICZvZmZsb2FkSW5mbyA6IE5VTEwpOworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gZ2V0T3V0cHV0KHN0cmVhbSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50PihvdXRwdXQpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTk2OCw2ICs5OTksNyBAQAogICAgICAgICAgICAgaWYgKGhhc1N0cmVhbSkgewogICAgICAgICAgICAgICAgIHN0cmVhbSA9IChhdWRpb19zdHJlYW1fdHlwZV90KWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBwaWRfdCBwaWQgPSAocGlkX3QpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHVpZF90IHVpZCA9ICh1aWRfdClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnOwogICAgICAgICAgICAgbWVtc2V0KCZjb25maWcsIDAsIHNpemVvZihhdWRpb19jb25maWdfdCkpOwpAQCAtOTc4LDcgKzEwMTAsNyBAQAogICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSAoYXVkaW9fcG9ydF9oYW5kbGVfdClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gMDsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldE91dHB1dEZvckF0dHIoaGFzQXR0cmlidXRlcyA/ICZhdHRyIDogTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwgc2Vzc2lvbiwgJnN0cmVhbSwgdWlkLAorICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LCBzZXNzaW9uLCAmc3RyZWFtLCBwaWQsIHVpZCwKICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsICZzZWxlY3RlZERldmljZUlkLCAmcG9ydElkKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CkBAIC0xMDMxLDYgKzEwNjMsNyBAQAogICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBwaWRfdCBwaWQgPSAocGlkX3QpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHVpZF90IHVpZCA9ICh1aWRfdClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYgb3BQYWNrYWdlTmFtZSA9IGRhdGEucmVhZFN0cmluZzE2KCk7CiAgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZzsKICAgICAgICAgICAgIG1lbXNldCgmY29uZmlnLCAwLCBzaXplb2YoYXVkaW9fY29uZmlnX2Jhc2VfdCkpOwogICAgICAgICAgICAgZGF0YS5yZWFkKCZjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfYmFzZV90KSk7CkBAIC0xMDM4LDcgKzEwNzEsNyBAQAogICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gKGF1ZGlvX3BvcnRfaGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IChhdWRpb19wb3J0X2hhbmRsZV90KWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRJbnB1dEZvckF0dHIoJmF0dHIsICZpbnB1dCwgc2Vzc2lvbiwgcGlkLCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcFBhY2thZ2VOYW1lLCAmY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCAmc2VsZWN0ZWREZXZpY2VJZCwgJnBvcnRJZCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewpAQCAtMTA1MSwyNSArMTA4NCwyNSBAQAogCiAgICAgICAgIGNhc2UgU1RBUlRfSU5QVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IHN0YXRpY19jYXN0IDxhdWRpb19zZXNzaW9uX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdGFydElucHV0KGlucHV0LCBzZXNzaW9uKSkpOworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBzdGF0aWNfY2FzdCA8YXVkaW9fcG9ydF9oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICBib29sIHNpbGVuY2VkID0gZGF0YS5yZWFkSW50MzIoKSA9PSAxOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhcnRJbnB1dChwb3J0SWQsICZzaWxlbmNlZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXR1cykpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2lsZW5jZWQgPyAxIDogMCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBTVE9QX0lOUFVUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSBzdGF0aWNfY2FzdCA8YXVkaW9fc2Vzc2lvbl90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RvcElucHV0KGlucHV0LCBzZXNzaW9uKSkpOworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBzdGF0aWNfY2FzdCA8YXVkaW9fcG9ydF9oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0b3BJbnB1dChwb3J0SWQpKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBSRUxFQVNFX0lOUFVUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSBzdGF0aWNfY2FzdCA8YXVkaW9fc2Vzc2lvbl90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIHJlbGVhc2VJbnB1dChpbnB1dCwgc2Vzc2lvbik7CisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IHN0YXRpY19jYXN0IDxhdWRpb19wb3J0X2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJlbGVhc2VJbnB1dChwb3J0SWQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9SZWNvcmQuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUmVjb3JkLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMzMWMwZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9SZWNvcmQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2RlZmluZSBMT0dfVEFHICJJQXVkaW9SZWNvcmQiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLQotI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1JlY29yZC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWVudW0gewotICAgIFVOVVNFRF9XQVNfR0VUX0NCTEsgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAotICAgIFNUQVJULAotICAgIFNUT1AKLX07Ci0KLWNsYXNzIEJwQXVkaW9SZWNvcmQgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SUF1ZGlvUmVjb3JkPgotewotcHVibGljOgotICAgIGV4cGxpY2l0IEJwQXVkaW9SZWNvcmQoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCi0gICAgICAgIDogQnBJbnRlcmZhY2U8SUF1ZGlvUmVjb3JkPihpbXBsKQotICAgIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KGludCAvKkF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QqLyBldmVudCwgYXVkaW9fc2Vzc2lvbl90IHRyaWdnZXJTZXNzaW9uKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUmVjb3JkOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoZXZlbnQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIodHJpZ2dlclNlc3Npb24pOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU1RBUlQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1coInN0YXJ0KCkgZXJyb3I6ICVzIiwgc3RyZXJyb3IoLXN0YXR1cykpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIHN0b3AoKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUmVjb3JkOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1RPUCwgZGF0YSwgJnJlcGx5KTsKLSAgICB9Ci0KLX07Ci0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShBdWRpb1JlY29yZCwgImFuZHJvaWQubWVkaWEuSUF1ZGlvUmVjb3JkIik7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgQm5BdWRpb1JlY29yZDo6b25UcmFuc2FjdCgKLSAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIHN3aXRjaCAoY29kZSkgewotICAgICAgICBjYXNlIFNUQVJUOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUmVjb3JkLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQgLypBdWRpb1N5c3RlbTo6c3luY19ldmVudF90Ki8gZXZlbnQgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHRyaWdnZXJTZXNzaW9uID0gKGF1ZGlvX3Nlc3Npb25fdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXJ0KGV2ZW50LCB0cmlnZ2VyU2Vzc2lvbikpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNUT1A6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9SZWNvcmQsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHN0b3AoKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci0gICAgfQotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9UcmFjay5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9UcmFjay5jcHAKaW5kZXggNzllODY0ZC4uYWRmZjA1NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1RyYWNrLmNwcApAQCAtMjgsNiArMjgsOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3VzaW5nIG1lZGlhOjpWb2x1bWVTaGFwZXI7CisKIGVudW0gewogICAgIEdFVF9DQkxLID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKICAgICBTVEFSVCwKQEAgLTE4NSw3ICsxODcsNyBAQAogICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgICAgIH0KICAgICAgICAgc3A8Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gc3RhdGUgPSBuZXcgVm9sdW1lU2hhcGVyOjpTdGF0ZTsKLSAgICAgICAgc3RhdHVzID0gc3RhdGUtPnJlYWRGcm9tUGFyY2VsKHJlcGx5KTsKKyAgICAgICAgc3RhdHVzID0gc3RhdGUtPnJlYWRGcm9tUGFyY2VsKCZyZXBseSk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgICAgICB9CkBAIC0yNjMsMTIgKzI2NSwxMiBAQAogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoJnByZXNlbnQpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBwcmVzZW50ICE9IDApIHsKICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uID0gbmV3IFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbigpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNvbmZpZ3VyYXRpb24tPnJlYWRGcm9tUGFyY2VsKGRhdGEpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNvbmZpZ3VyYXRpb24tPnJlYWRGcm9tUGFyY2VsKCZkYXRhKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXR1cyA/OiBkYXRhLnJlYWRJbnQzMigmcHJlc2VudCk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIHByZXNlbnQgIT0gMCkgewogICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9IG5ldyBWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbigpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IG9wZXJhdGlvbi0+cmVhZEZyb21QYXJjZWwoZGF0YSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gb3BlcmF0aW9uLT5yZWFkRnJvbVBhcmNlbCgmZGF0YSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KWFwcGx5Vm9sdW1lU2hhcGVyKGNvbmZpZ3VyYXRpb24sIG9wZXJhdGlvbik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9QbGF5ZXJCYXNlLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L1BsYXllckJhc2UuY3BwCmluZGV4IDc4NjgzMTguLmIwYzY4ZTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L1BsYXllckJhc2UuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L1BsYXllckJhc2UuY3BwCkBAIC0yMiw2ICsyMiw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgbWVkaWE6OlZvbHVtZVNoYXBlcjsKKwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogUGxheWVyQmFzZTo6UGxheWVyQmFzZSgpIDogQm5QbGF5ZXIoKSwKICAgICAgICAgbVBhbk11bHRpcGxpZXJMKDEuMGYpLCBtUGFuTXVsdGlwbGllclIoMS4wZiksCkBAIC0xMTcsMjMgKzExOSwyNiBAQAogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gSW1wbGVtZW50YXRpb24gb2YgSVBsYXllcgotdm9pZCBQbGF5ZXJCYXNlOjpzdGFydCgpIHsKK2JpbmRlcjo6U3RhdHVzIFBsYXllckJhc2U6OnN0YXJ0KCkgewogICAgIEFMT0dEKCJQbGF5ZXJCYXNlOjpzdGFydCgpIGZyb20gSVBsYXllciIpOwogICAgICh2b2lkKXN0YXJ0V2l0aFN0YXR1cygpOworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKIH0KIAotdm9pZCBQbGF5ZXJCYXNlOjpwYXVzZSgpIHsKK2JpbmRlcjo6U3RhdHVzIFBsYXllckJhc2U6OnBhdXNlKCkgewogICAgIEFMT0dEKCJQbGF5ZXJCYXNlOjpwYXVzZSgpIGZyb20gSVBsYXllciIpOwogICAgICh2b2lkKXBhdXNlV2l0aFN0YXR1cygpOworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKIH0KIAogCi12b2lkIFBsYXllckJhc2U6OnN0b3AoKSB7CitiaW5kZXI6OlN0YXR1cyBQbGF5ZXJCYXNlOjpzdG9wKCkgewogICAgIEFMT0dEKCJQbGF5ZXJCYXNlOjpzdG9wKCkgZnJvbSBJUGxheWVyIik7CiAgICAgKHZvaWQpc3RvcFdpdGhTdGF0dXMoKTsKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiB9CiAKLXZvaWQgUGxheWVyQmFzZTo6c2V0Vm9sdW1lKGZsb2F0IHZvbCkgeworYmluZGVyOjpTdGF0dXMgUGxheWVyQmFzZTo6c2V0Vm9sdW1lKGZsb2F0IHZvbCkgewogICAgIEFMT0dEKCJQbGF5ZXJCYXNlOjpzZXRWb2x1bWUoKSBmcm9tIElQbGF5ZXIiKTsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2V0dGluZ3NMb2NrKTsKQEAgLTE0NCw5ICsxNDksMTAgQEAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dXKCJQbGF5ZXJCYXNlOjpzZXRWb2x1bWUoKSBlcnJvciAlZCIsIHN0YXR1cyk7CiAgICAgfQorICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKTsKIH0KIAotdm9pZCBQbGF5ZXJCYXNlOjpzZXRQYW4oZmxvYXQgcGFuKSB7CitiaW5kZXI6OlN0YXR1cyBQbGF5ZXJCYXNlOjpzZXRQYW4oZmxvYXQgcGFuKSB7CiAgICAgQUxPR0QoIlBsYXllckJhc2U6OnNldFBhbigpIGZyb20gSVBsYXllciIpOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZXR0aW5nc0xvY2spOwpAQCAtMTYzLDIyICsxNjksMTkgQEAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dXKCJQbGF5ZXJCYXNlOjpzZXRQYW4oKSBlcnJvciAlZCIsIHN0YXR1cyk7CiAgICAgfQorICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKTsKIH0KIAotdm9pZCBQbGF5ZXJCYXNlOjpzZXRTdGFydERlbGF5TXMoaW50MzJfdCBkZWxheU1zIF9fdW51c2VkKSB7CitiaW5kZXI6OlN0YXR1cyBQbGF5ZXJCYXNlOjpzZXRTdGFydERlbGF5TXMoaW50MzJfdCBkZWxheU1zIF9fdW51c2VkKSB7CiAgICAgQUxPR1coInNldFN0YXJ0RGVsYXkoKSBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwogfQogCi12b2lkIFBsYXllckJhc2U6OmFwcGx5Vm9sdW1lU2hhcGVyKAotICAgICAgICBjb25zdCBzcDxWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uICBfX3VudXNlZCwKLSAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24gX191bnVzZWQpIHsKK2JpbmRlcjo6U3RhdHVzIFBsYXllckJhc2U6OmFwcGx5Vm9sdW1lU2hhcGVyKAorICAgICAgICAgICAgY29uc3QgVm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uIF9fdW51c2VkLAorICAgICAgICAgICAgY29uc3QgVm9sdW1lU2hhcGVyOjpPcGVyYXRpb24mIG9wZXJhdGlvbiBfX3VudXNlZCkgewogICAgIEFMT0dXKCJhcHBseVZvbHVtZVNoYXBlcigpIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLX0KLQotc3RhdHVzX3QgUGxheWVyQmFzZTo6b25UcmFuc2FjdCgKLSAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIHJldHVybiBCblBsYXllcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvVG9uZUdlbmVyYXRvci5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9Ub25lR2VuZXJhdG9yLmNwcAppbmRleCA5YmMyNTk0Li41NzE2NzI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9Ub25lR2VuZXJhdG9yLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9Ub25lR2VuZXJhdG9yLmNwcApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+CiAjaW5jbHVkZSAibWVkaWEvVG9uZUdlbmVyYXRvci5oIgogCiAKQEAgLTc0MCw2ICs3NDEsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCiAgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAogICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfSkFQQU5fUkFESU9fQUNLCisgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDM3NSwgLndhdmVGcmVxID0geyA0MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAzNzUsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0dCX0JVU1kKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gNDAwLCAud2F2ZUZyZXEgPSB7IDQwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDM1MCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjI1LCAud2F2ZUZyZXEgPSB7IDQwMCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDUyNSwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfR0JfQ09OR0VTVElPTgogICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSA0MDAsIC53YXZlRnJlcSA9IHsgNDAwLCA0NTAsIDAgfSwgMCwgMCB9LAogICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDQwMCwgLndhdmVGcmVxID0geyA0MDAsIDQ1MCwgMCB9LCAwLCAwIH0sCkBAIC03NDcsNiArNzYwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCiAgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAogICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfR0JfUklOR1RPTkUKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsIC53YXZlRnJlcSA9IHsgNDAwLCA0MjUsIDQ1MCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0FVU1RSQUxJQV9ESUFMCiAgICAgICAgIHsgLnNlZ21lbnRzID0geyB7IC5kdXJhdGlvbiA9IDQwMCwgLndhdmVGcmVxID0geyA0MDAsIDQ1MCwgMCB9LCAwLCAwIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNDAwLCAud2F2ZUZyZXEgPSB7IDQwMCwgNDUwLCAwIH0sIDAsIDAgfSwKQEAgLTc3MSw2ICs3ODgsNDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCiAgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAogICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfQVVTVFJBTElBX0NPTkdFU1RJT04KKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gNzUwLCAud2F2ZUZyZXEgPSB7IDQyNSwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDc1MCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfU0dfQlVTWQorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSA0MDAsIC53YXZlRnJlcSA9IHsgNDAxLCA0MjUsIDQ0OSwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNDAwLCAud2F2ZUZyZXEgPSB7IDQwMSwgNDI1LCA0NDksIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9TR19SSU5HVE9ORQorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSA1MDAsIC53YXZlRnJlcSA9IHsgNDgwLCA2MjAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA1MDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAorICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKKyAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX0hLX0JVU1kKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gNDAwLCAud2F2ZUZyZXEgPSB7IDQ0MCwgNDgwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSA0MDAsIC53YXZlRnJlcSA9IHsgNDQwLCA0ODAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAzMDAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9IS19SSU5HVE9ORQorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSA0MDAsIC53YXZlRnJlcSA9IHsgNDAwLCA0NTAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDQwMCwgLndhdmVGcmVxID0geyA0MDAsIDQ1MCwgMCB9LCAwLCAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDIwMDAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9JRV9SSU5HVE9ORQorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAxODAsIC53YXZlRnJlcSA9IHsgNDI1LCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAsIC53YXZlRnJlcSA9IHsgNDI1LCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gNDUwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPTkVfSUVfQ0FMTF9XQUlUSU5HCiB9OwogCiAvLyBVc2VkIGJ5IFRvbmVHZW5lcmF0b3I6OmdldFRvbmVGb3JSZWdpb24oKSB0byBjb252ZXJ0IHVzZXIgc3BlY2lmaWVkIHN1cGVydmlzb3J5IHRvbmUgdHlwZQpAQCAtNzk3LDkgKzg1Miw5IEBACiAgICAgICAgICAgICBUT05FX1NVUF9SSU5HVE9ORSAgICAgICAgICAgIC8vIFRPTkVfU1VQX1JJTkdUT05FCiAgICAgICAgIH0sCiAgICAgICAgIHsgICAvLyBHQgotICAgICAgICAgICAgVE9ORV9TVVBfRElBTCwgICAgICAgICAgICAgICAvLyBUT05FX1NVUF9ESUFMCi0gICAgICAgICAgICBUT05FX1NVUF9CVVNZLCAgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX0JVU1kKLSAgICAgICAgICAgIFRPTkVfU1VQX0NPTkdFU1RJT04sICAgICAgICAgLy8gVE9ORV9TVVBfQ09OR0VTVElPTgorICAgICAgICAgICAgVE9ORV9BTlNJX0RJQUwsICAgICAgICAgICAgICAvLyBUT05FX1NVUF9ESUFMCisgICAgICAgICAgICBUT05FX0dCX0JVU1ksICAgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX0JVU1kKKyAgICAgICAgICAgIFRPTkVfR0JfQ09OR0VTVElPTiwgICAgICAgICAgLy8gVE9ORV9TVVBfQ09OR0VTVElPTgogICAgICAgICAgICAgVE9ORV9TVVBfUkFESU9fQUNLLCAgICAgICAgICAvLyBUT05FX1NVUF9SQURJT19BQ0sKICAgICAgICAgICAgIFRPTkVfU1VQX1JBRElPX05PVEFWQUlMLCAgICAgLy8gVE9ORV9TVVBfUkFESU9fTk9UQVZBSUwKICAgICAgICAgICAgIFRPTkVfU1VQX0VSUk9SLCAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfRVJST1IKQEAgLTgwNyw3ICs4NjIsNyBAQAogICAgICAgICAgICAgVE9ORV9HQl9SSU5HVE9ORSAgICAgICAgICAgICAvLyBUT05FX1NVUF9SSU5HVE9ORQogICAgICAgICB9LAogICAgICAgICB7ICAgLy8gQVVTVFJBTElBCi0gICAgICAgICAgICBUT05FX0FOU0lfRElBTCwgICAgICAgICAgICAgLy8gVE9ORV9TVVBfRElBTAorICAgICAgICAgICAgVE9ORV9BVVNUUkFMSUFfRElBTCwgICAgICAgIC8vIFRPTkVfU1VQX0RJQUwKICAgICAgICAgICAgIFRPTkVfQVVTVFJBTElBX0JVU1ksICAgICAgICAvLyBUT05FX1NVUF9CVVNZCiAgICAgICAgICAgICBUT05FX0FVU1RSQUxJQV9DT05HRVNUSU9OLCAgLy8gVE9ORV9TVVBfQ09OR0VTVElPTgogICAgICAgICAgICAgVE9ORV9TVVBfUkFESU9fQUNLLCAgICAgICAgIC8vIFRPTkVfU1VQX1JBRElPX0FDSwpAQCAtODE1LDYgKzg3MCwzNiBAQAogICAgICAgICAgICAgVE9ORV9TVVBfRVJST1IsICAgICAgICAgICAgIC8vIFRPTkVfU1VQX0VSUk9SCiAgICAgICAgICAgICBUT05FX0FVU1RSQUxJQV9DQUxMX1dBSVRJTkcsLy8gVE9ORV9TVVBfQ0FMTF9XQUlUSU5HCiAgICAgICAgICAgICBUT05FX0FVU1RSQUxJQV9SSU5HVE9ORSAgICAgLy8gVE9ORV9TVVBfUklOR1RPTkUKKyAgICAgICAgfSwKKyAgICAgICAgeyAgIC8vIFNJTkdBUE9SRQorICAgICAgICAgICAgVE9ORV9TVVBfRElBTCwgICAgICAgICAgICAgICAvLyBUT05FX1NVUF9ESUFMCisgICAgICAgICAgICBUT05FX1NHX0JVU1ksICAgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX0JVU1kKKyAgICAgICAgICAgIFRPTkVfU1VQX0NPTkdFU1RJT04sICAgICAgICAgLy8gVE9ORV9TVVBfQ09OR0VTVElPTgorICAgICAgICAgICAgVE9ORV9TVVBfUkFESU9fQUNLLCAgICAgICAgICAvLyBUT05FX1NVUF9SQURJT19BQ0sKKyAgICAgICAgICAgIFRPTkVfU1VQX1JBRElPX05PVEFWQUlMLCAgICAgLy8gVE9ORV9TVVBfUkFESU9fTk9UQVZBSUwKKyAgICAgICAgICAgIFRPTkVfU1VQX0VSUk9SLCAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfRVJST1IKKyAgICAgICAgICAgIFRPTkVfU1VQX0NBTExfV0FJVElORywgICAgICAgLy8gVE9ORV9TVVBfQ0FMTF9XQUlUSU5HCisgICAgICAgICAgICBUT05FX1NHX1JJTkdUT05FICAgICAgICAgICAgIC8vIFRPTkVfU1VQX1JJTkdUT05FCisgICAgICAgIH0sCisgICAgICAgIHsgICAvLyBIT05HS09ORworICAgICAgICAgICAgVE9ORV9TVVBfRElBTCwgICAgICAgICAgICAgICAvLyBUT05FX1NVUF9ESUFMCisgICAgICAgICAgICBUT05FX0hLX0JVU1ksICAgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX0JVU1kKKyAgICAgICAgICAgIFRPTkVfU1VQX0NPTkdFU1RJT04sICAgICAgICAgLy8gVE9ORV9TVVBfQ09OR0VTVElPTgorICAgICAgICAgICAgVE9ORV9TVVBfUkFESU9fQUNLLCAgICAgICAgICAvLyBUT05FX1NVUF9SQURJT19BQ0sKKyAgICAgICAgICAgIFRPTkVfU1VQX1JBRElPX05PVEFWQUlMLCAgICAgLy8gVE9ORV9TVVBfUkFESU9fTk9UQVZBSUwKKyAgICAgICAgICAgIFRPTkVfU1VQX0VSUk9SLCAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfRVJST1IKKyAgICAgICAgICAgIFRPTkVfU1VQX0NBTExfV0FJVElORywgICAgICAgLy8gVE9ORV9TVVBfQ0FMTF9XQUlUSU5HCisgICAgICAgICAgICBUT05FX0hLX1JJTkdUT05FICAgICAgICAgICAgIC8vIFRPTkVfU1VQX1JJTkdUT05FCisgICAgICAgIH0sCisgICAgICAgIHsgICAvLyBJUkVMQU5ECisgICAgICAgICAgICBUT05FX1NVUF9ESUFMLCAgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX0RJQUwKKyAgICAgICAgICAgIFRPTkVfU1VQX0JVU1ksICAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfQlVTWQorICAgICAgICAgICAgVE9ORV9TVVBfQ09OR0VTVElPTiwgICAgICAgICAvLyBUT05FX1NVUF9DT05HRVNUSU9OCisgICAgICAgICAgICBUT05FX1NVUF9SQURJT19BQ0ssICAgICAgICAgIC8vIFRPTkVfU1VQX1JBRElPX0FDSworICAgICAgICAgICAgVE9ORV9TVVBfUkFESU9fTk9UQVZBSUwsICAgICAvLyBUT05FX1NVUF9SQURJT19OT1RBVkFJTAorICAgICAgICAgICAgVE9ORV9TVVBfRVJST1IsICAgICAgICAgICAgICAvLyBUT05FX1NVUF9FUlJPUgorICAgICAgICAgICAgVE9ORV9JRV9DQUxMX1dBSVRJTkcsICAgICAgICAvLyBUT05FX1NVUF9DQUxMX1dBSVRJTkcKKyAgICAgICAgICAgIFRPTkVfSUVfUklOR1RPTkUgICAgICAgICAgICAgLy8gVE9ORV9TVVBfUklOR1RPTkUKICAgICAgICAgfQogfTsKIApAQCAtODY0LDYgKzk0OSwxMyBAQAogICAgIGlmIChwcm9wZXJ0eV9nZXQoImdzbS5vcGVyYXRvci5pc28tY291bnRyeSIsIHZhbHVlLCAiIikgPT0gMCkgewogICAgICAgICBwcm9wZXJ0eV9nZXQoImdzbS5zaW0ub3BlcmF0b3IuaXNvLWNvdW50cnkiLCB2YWx1ZSwgIiIpOwogICAgIH0KKyAgICAvLyBJZiBkdWFsIHNpbSBkZXZpY2UgaGFzIHR3byBTSU0gY2FyZHMgaW5zZXJ0ZWQgYW5kIGlzIG5vdCByZWdpc3RlcmQgdG8gYW55IG5ldHdvcmssCisgICAgLy8gIiwiIGlzIHNldCB0byAiZ3NtLm9wZXJhdG9yLmlzby1jb3VudHJ5IiBwcm9wLgorICAgIC8vIEluIHRoaXMgY2FzZSwgImdzbS5zaW0ub3BlcmF0b3IuaXNvLWNvdW50cnkiIHByb3Agc2hvdWxkIGJlIHVzZWQuCisgICAgaWYgKHN0cmxlbih2YWx1ZSkgPT0gMSAmJiBzdHJzdHIodmFsdWUsICIsIikgIT0gTlVMTCkgeworICAgICAgICBwcm9wZXJ0eV9nZXQoImdzbS5zaW0ub3BlcmF0b3IuaXNvLWNvdW50cnkiLCB2YWx1ZSwgIiIpOworICAgIH0KKwogICAgIGlmIChzdHJzdHIodmFsdWUsICJ1cyIpICE9IE5VTEwgfHwKICAgICAgICAgc3Ryc3RyKHZhbHVlLCAiY2EiKSAhPSBOVUxMKSB7CiAgICAgICAgIG1SZWdpb24gPSBBTlNJOwpAQCAtODczLDYgKzk2NSwxMiBAQAogICAgICAgICBtUmVnaW9uID0gR0I7CiAgICAgfSBlbHNlIGlmIChzdHJzdHIodmFsdWUsICJhdSIpICE9IE5VTEwpIHsKICAgICAgICAgbVJlZ2lvbiA9IEFVU1RSQUxJQTsKKyAgICB9IGVsc2UgaWYgKHN0cnN0cih2YWx1ZSwgInNnIikgIT0gTlVMTCkgeworICAgICAgICBtUmVnaW9uID0gU0lOR0FQT1JFOworICAgIH0gZWxzZSBpZiAoc3Ryc3RyKHZhbHVlLCAiaGsiKSAhPSBOVUxMKSB7CisgICAgICAgIG1SZWdpb24gPSBIT05HS09ORzsKKyAgICB9IGVsc2UgaWYgKHN0cnN0cih2YWx1ZSwgImllIikgIT0gTlVMTCkgeworICAgICAgICBtUmVnaW9uID0gSVJFTEFORDsKICAgICB9IGVsc2UgewogICAgICAgICBtUmVnaW9uID0gQ0VQVDsKICAgICB9CkBAIC05MzIsNyArMTAzMCw3IEBACiAgICAgYm9vbCBsUmVzdWx0ID0gZmFsc2U7CiAgICAgc3RhdHVzX3QgbFN0YXR1czsKIAotICAgIGlmICgodG9uZVR5cGUgPCAwKSB8fCAodG9uZVR5cGUgPj0gTlVNX1RPTkVTKSkKKyAgICBpZiAodG9uZVR5cGUgPj0gTlVNX1RPTkVTKQogICAgICAgICByZXR1cm4gbFJlc3VsdDsKIAogICAgIHRvbmVUeXBlID0gZ2V0VG9uZUZvclJlZ2lvbih0b25lVHlwZSk7CkBAIC05NDcsNyArMTA0NSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBBTE9HVigic3RhcnRUb25lIik7CisgICAgQUxPR1YoInN0YXJ0VG9uZSB0b25lVHlwZSAlZCIsIHRvbmVUeXBlKTsKIAogICAgIG1Mb2NrLmxvY2soKTsKIApAQCAtMTA5OSw5ICsxMTk3LDE2IEBACiAgICAgbXBBdWRpb1RyYWNrID0gbmV3IEF1ZGlvVHJhY2soKTsKICAgICBBTE9HVigiQXVkaW9UcmFjayglcCkgY3JlYXRlZCIsIG1wQXVkaW9UcmFjay5nZXQoKSk7CiAKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cjsKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBtU3RyZWFtVHlwZTsKKyAgICBpZiAobVN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpIHsKKyAgICAgICAgc3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9EVE1GOworICAgIH0KKyAgICBzdHJlYW1fdHlwZV90b19hdWRpb19hdHRyaWJ1dGVzKHN0cmVhbVR5cGUsICZhdHRyKTsKKwogICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0gbVByb2Nlc3NTaXplOwogICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQXVkaW9UcmFjay0+c2V0KAotICAgICAgICAgICAgbVN0cmVhbVR5cGUsCisgICAgICAgICAgICBBVURJT19TVFJFQU1fREVGQVVMVCwKICAgICAgICAgICAgIDAsICAgIC8vIHNhbXBsZVJhdGUKICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAogICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfTU9OTywKQEAgLTExMTMsNyArMTIxOCwxMSBAQAogICAgICAgICAgICAgMCwgICAgLy8gc2hhcmVkQnVmZmVyCiAgICAgICAgICAgICBtVGhyZWFkQ2FuQ2FsbEphdmEsCiAgICAgICAgICAgICBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAotICAgICAgICAgICAgQXVkaW9UcmFjazo6VFJBTlNGRVJfQ0FMTEJBQ0spOworICAgICAgICAgICAgQXVkaW9UcmFjazo6VFJBTlNGRVJfQ0FMTEJBQ0ssCisgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgQVVESU9fVUlEX0lOVkFMSUQsCisgICAgICAgICAgICAtMSwKKyAgICAgICAgICAgICZhdHRyKTsKIAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoIkF1ZGlvVHJhY2soJXApIHNldCBmYWlsZWQgd2l0aCBlcnJvciAlZCIsIG1wQXVkaW9UcmFjay5nZXQoKSwgc3RhdHVzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RyYWNrUGxheWVyQmFzZS5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9UcmFja1BsYXllckJhc2UuY3BwCmluZGV4IDQ4Y2Q4MDMuLjBhOTE0ZmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RyYWNrUGxheWVyQmFzZS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvVHJhY2tQbGF5ZXJCYXNlLmNwcApAQCAtMTgsNiArMTgsOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3VzaW5nIG1lZGlhOjpWb2x1bWVTaGFwZXI7CisKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFRyYWNrUGxheWVyQmFzZTo6VHJhY2tQbGF5ZXJCYXNlKCkgOiBQbGF5ZXJCYXNlKCksCiAgICAgICAgIG1QbGF5ZXJWb2x1bWVMKDEuMGYpLCBtUGxheWVyVm9sdW1lUigxLjBmKQpAQCAtMTAzLDE4ICsxMDUsMjQgQEAKIH0KIAogCi12b2lkIFRyYWNrUGxheWVyQmFzZTo6YXBwbHlWb2x1bWVTaGFwZXIoCi0gICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCi0gICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKSB7CitiaW5kZXI6OlN0YXR1cyBUcmFja1BsYXllckJhc2U6OmFwcGx5Vm9sdW1lU2hhcGVyKAorICAgICAgICBjb25zdCBWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24sCisgICAgICAgIGNvbnN0IFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uJiBvcGVyYXRpb24pIHsKKworICAgIHNwPFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4gc3BDb25maWd1cmF0aW9uID0gbmV3IFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKTsKKyAgICBzcDxWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4gc3BPcGVyYXRpb24gPSBuZXcgVm9sdW1lU2hhcGVyOjpPcGVyYXRpb24ob3BlcmF0aW9uKTsKKwogICAgIGlmIChtQXVkaW9UcmFjayAhPSAwKSB7CiAgICAgICAgIEFMT0dEKCJUcmFja1BsYXllckJhc2U6OmFwcGx5Vm9sdW1lU2hhcGVyKCkgZnJvbSBJUGxheWVyIik7Ci0gICAgICAgIFZvbHVtZVNoYXBlcjo6U3RhdHVzIHN0YXR1cyA9IG1BdWRpb1RyYWNrLT5hcHBseVZvbHVtZVNoYXBlcihjb25maWd1cmF0aW9uLCBvcGVyYXRpb24pOworICAgICAgICBWb2x1bWVTaGFwZXI6OlN0YXR1cyBzdGF0dXMgPSBtQXVkaW9UcmFjay0+YXBwbHlWb2x1bWVTaGFwZXIoc3BDb25maWd1cmF0aW9uLCBzcE9wZXJhdGlvbik7CiAgICAgICAgIGlmIChzdGF0dXMgPCAwKSB7IC8vIGEgbm9uLW5lZ2F0aXZlIHZhbHVlIGlzIHRoZSB2b2x1bWUgc2hhcGVyIGlkLgogICAgICAgICAgICAgQUxPR0UoIlRyYWNrUGxheWVyQmFzZTo6YXBwbHlWb2x1bWVTaGFwZXIoKSBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBzdGF0dXMpOwogICAgICAgICB9CisgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HRCgiVHJhY2tQbGF5ZXJCYXNlOjphcHBseVZvbHVtZVNoYXBlcigpIgotICAgICAgICAgICAgICAgICIgbm8gQXVkaW9UcmFjayBmb3Igdm9sdW1lIGNvbnRyb2wgZnJvbSBJUGxheWVyIik7CisgICAgICAgICAgICAgICIgbm8gQXVkaW9UcmFjayBmb3Igdm9sdW1lIGNvbnRyb2wgZnJvbSBJUGxheWVyIik7CisgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9SZWNvcmQuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9SZWNvcmQuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWUwYTcxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1JlY29yZC5haWRsCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWljcm9waG9uZUluZm87CisKKy8qIE5hdGl2ZSBjb2RlIG11c3Qgc3BlY2lmeSBuYW1lc3BhY2UgbWVkaWEgKG1lZGlhOjpJQXVkaW9SZWNvcmQpIHdoZW4gcmVmZXJyaW5nIHRvIHRoaXMgY2xhc3MgKi8KK2ludGVyZmFjZSBJQXVkaW9SZWNvcmQgeworCisgIC8qIEFmdGVyIGl0J3MgY3JlYXRlZCB0aGUgdHJhY2sgaXMgbm90IGFjdGl2ZS4gQ2FsbCBzdGFydCgpIHRvCisgICAqIG1ha2UgaXQgYWN0aXZlLgorICAgKi8KKyAgdm9pZCBzdGFydChpbnQgLypBdWRpb1N5c3RlbTo6c3luY19ldmVudF90Ki8gZXZlbnQsCisgICAgICAgICAgICAgaW50IC8qYXVkaW9fc2Vzc2lvbl90Ki8gdHJpZ2dlclNlc3Npb24pOworCisgIC8qIFN0b3AgYSB0cmFjay4gSWYgc2V0LCB0aGUgY2FsbGJhY2sgd2lsbCBjZWFzZSBiZWluZyBjYWxsZWQgYW5kCisgICAqIG9idGFpbkJ1ZmZlciB3aWxsIHJldHVybiBhbiBlcnJvci4gQnVmZmVycyB0aGF0IGFyZSBhbHJlYWR5IHJlbGVhc2VkCisgICAqIHdpbGwgYmUgcHJvY2Vzc2VkLCB1bmxlc3MgZmx1c2goKSBpcyBjYWxsZWQuCisgICAqLworICB2b2lkIHN0b3AoKTsKKworICAvKiBHZXQgYSBsaXN0IG9mIGN1cnJlbnQgYWN0aXZlIG1pY3JvcGhvbmVzLgorICAgKi8KKyAgdm9pZCBnZXRBY3RpdmVNaWNyb3Bob25lcyhvdXQgTWljcm9waG9uZUluZm9bXSBhY3RpdmVNaWNyb3Bob25lcyk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSVBsYXllci5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lQbGF5ZXIuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTBmY2RkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lQbGF5ZXIuYWlkbApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5Wb2x1bWVTaGFwZXIuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVNoYXBlci5PcGVyYXRpb247CisKKy8qKgorICogQGhpZGUKKyAqLworaW50ZXJmYWNlIElQbGF5ZXIgeworICAgIG9uZXdheSB2b2lkIHN0YXJ0KCk7CisgICAgb25ld2F5IHZvaWQgcGF1c2UoKTsKKyAgICBvbmV3YXkgdm9pZCBzdG9wKCk7CisgICAgb25ld2F5IHZvaWQgc2V0Vm9sdW1lKGZsb2F0IHZvbCk7CisgICAgb25ld2F5IHZvaWQgc2V0UGFuKGZsb2F0IHBhbik7CisgICAgb25ld2F5IHZvaWQgc2V0U3RhcnREZWxheU1zKGludCBkZWxheU1zKTsKKyAgICBvbmV3YXkgdm9pZCBhcHBseVZvbHVtZVNoYXBlcihpbiBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gT3BlcmF0aW9uIG9wZXJhdGlvbik7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvTWljcm9waG9uZUluZm8uYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9NaWNyb3Bob25lSW5mby5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZTQ2Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvTWljcm9waG9uZUluZm8uYWlkbApAQCAtMCwwICsxLDE5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK3BhcmNlbGFibGUgTWljcm9waG9uZUluZm8gY3BwX2hlYWRlciAibWVkaWEvTWljcm9waG9uZUluZm8uaCI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyL0NvbmZpZ3VyYXRpb24uYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIvQ29uZmlndXJhdGlvbi5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMGU2MGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyL0NvbmZpZ3VyYXRpb24uYWlkbApAQCAtMCwwICsxLDE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLlZvbHVtZVNoYXBlcjsKKworcGFyY2VsYWJsZSBDb25maWd1cmF0aW9uIGNwcF9oZWFkZXIgIm1lZGlhL1ZvbHVtZVNoYXBlci5oIjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIvT3BlcmF0aW9uLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyL09wZXJhdGlvbi5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyOTBkOWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyL09wZXJhdGlvbi5haWRsCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEuVm9sdW1lU2hhcGVyOworCitwYXJjZWxhYmxlIE9wZXJhdGlvbiBjcHBfaGVhZGVyICJtZWRpYS9Wb2x1bWVTaGFwZXIuaCI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyL1N0YXRlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyL1N0YXRlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhMjJiOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIvU3RhdGUuYWlkbApAQCAtMCwwICsxLDE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLlZvbHVtZVNoYXBlcjsKKworcGFyY2VsYWJsZSBTdGF0ZSBjcHBfaGVhZGVyICJtZWRpYS9Wb2x1bWVTaGFwZXIuaCI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmgKaW5kZXggOWVmZDc2ZC4uMjQ3YWY5ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0NsaWVudC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9DbGllbnQuaApAQCAtMTgsMTkgKzE4LDM4IEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9fQ0xJRU5UX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT19DTElFTlRfSAogCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBBdWRpb0NsaWVudCB7CitjbGFzcyBBdWRpb0NsaWVudCA6IHB1YmxpYyBQYXJjZWxhYmxlIHsKICBwdWJsaWM6CiAgICAgQXVkaW9DbGllbnQoKSA6Ci0gICAgICAgIGNsaWVudFVpZCgtMSksIGNsaWVudFBpZCgtMSksIHBhY2thZ2VOYW1lKCIiKSB7fQorICAgICAgICBjbGllbnRVaWQoLTEpLCBjbGllbnRQaWQoLTEpLCBjbGllbnRUaWQoLTEpLCBwYWNrYWdlTmFtZSgiIikge30KIAogICAgIHVpZF90IGNsaWVudFVpZDsKICAgICBwaWRfdCBjbGllbnRQaWQ7CisgICAgcGlkX3QgY2xpZW50VGlkOwogICAgIFN0cmluZzE2IHBhY2thZ2VOYW1lOworCisgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpIG92ZXJyaWRlIHsKKyAgICAgICAgY2xpZW50VWlkID0gcGFyY2VsLT5yZWFkSW50MzIoKTsKKyAgICAgICAgY2xpZW50UGlkID0gcGFyY2VsLT5yZWFkSW50MzIoKTsKKyAgICAgICAgY2xpZW50VGlkID0gcGFyY2VsLT5yZWFkSW50MzIoKTsKKyAgICAgICAgcGFja2FnZU5hbWUgPSBwYXJjZWwtPnJlYWRTdHJpbmcxNigpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoY2xpZW50VWlkKTsKKyAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKGNsaWVudFBpZCk7CisgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihjbGllbnRUaWQpOworICAgICAgICBwYXJjZWwtPndyaXRlU3RyaW5nMTYocGFja2FnZU5hbWUpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9NaXhlci5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb01peGVyLmgKaW5kZXggMmJkMmQwMS4uY2Y3ZDkwZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb01peGVyLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb01peGVyLmgKQEAgLTE4LDE0ICsxOCwxNyBAQAogI2lmbmRlZiBBTkRST0lEX0FVRElPX01JWEVSX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT19NSVhFUl9ICiAKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KICNpbmNsdWRlIDxtZWRpYS9CdWZmZXJQcm92aWRlcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkxvZy5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL05CTG9nLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8dXRpbHMvQ29tcGF0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgpAQCAtMzMsNiArMzYsOSBAQAogLy8gRklYTUUgVGhpcyBpcyBhY3R1YWxseSB1bml0eSBnYWluLCB3aGljaCBtaWdodCBub3QgYmUgbWF4IGluIGZ1dHVyZSwgZXhwcmVzc2VkIGluIFUuMTIKICNkZWZpbmUgTUFYX0dBSU5fSU5UIEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fSU5UCiAKKy8vIFRoaXMgbXVzdCBtYXRjaCBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9Db25maWd1cmF0aW9uLmgKKyNkZWZpbmUgRkxPQVRfQVVYCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDAsMjAgKzQ2LDEwIEBACiBjbGFzcyBBdWRpb01peGVyCiB7CiBwdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcihzaXplX3QgZnJhbWVDb3VudCwgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heE51bVRyYWNrcyA9IE1BWF9OVU1fVFJBQ0tTKTsKLQotICAgIC8qdmlydHVhbCovICAgICAgICAgICAgIH5BdWRpb01peGVyKCk7ICAvLyBub24tdmlydHVhbCBzYXZlcyBhIHYtdGFibGUsIHJlc3RvcmUgaWYgc3ViLWNsYXNzZWQKLQotCi0gICAgLy8gVGhpcyBtaXhlciBoYXMgYSBoYXJkLWNvZGVkIHVwcGVyIGxpbWl0IG9mIDMyIGFjdGl2ZSB0cmFjayBpbnB1dHMuCi0gICAgLy8gQWRkaW5nIHN1cHBvcnQgZm9yID4gMzIgdHJhY2tzIHdvdWxkIHJlcXVpcmUgbW9yZSB0aGFuIHNpbXBseSBjaGFuZ2luZyB0aGlzIHZhbHVlLgotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBNQVhfTlVNX1RSQUNLUyA9IDMyOwotICAgIC8vIG1heGltdW0gbnVtYmVyIG9mIGNoYW5uZWxzIHN1cHBvcnRlZCBieSB0aGUgbWl4ZXIKLQorICAgIC8vIERvIG5vdCBjaGFuZ2UgdGhlc2UgdW5sZXNzIHVuZGVybHlpbmcgY29kZSBjaGFuZ2VzLgogICAgIC8vIFRoaXMgbWl4ZXIgaGFzIGEgaGFyZC1jb2RlZCB1cHBlciBsaW1pdCBvZiA4IGNoYW5uZWxzIGZvciBvdXRwdXQuCi0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9OVU1fQ0hBTk5FTFMgPSA4OwotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBNQVhfTlVNX1ZPTFVNRVMgPSAyOyAvLyBzdGVyZW8gdm9sdW1lIG9ubHkKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IE1BWF9OVU1fQ0hBTk5FTFMgPSBGQ0NfODsKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IE1BWF9OVU1fVk9MVU1FUyA9IEZDQ18yOyAvLyBzdGVyZW8gdm9sdW1lIG9ubHkKICAgICAvLyBtYXhpbXVtIG51bWJlciBvZiBjaGFubmVscyBzdXBwb3J0ZWQgZm9yIHRoZSBjb250ZW50CiAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9OVU1fQ0hBTk5FTFNfVE9fRE9XTk1JWCA9IEFVRElPX0NIQU5ORUxfQ09VTlRfTUFYOwogCkBAIC02MSwxMiArNTcsNiBAQAogICAgIHN0YXRpYyBjb25zdCBDT05TVEVYUFIgZmxvYXQgVU5JVFlfR0FJTl9GTE9BVCA9IDEuMGY7CiAKICAgICBlbnVtIHsgLy8gbmFtZXMKLQotICAgICAgICAvLyB0cmFjayBuYW1lcyAoTUFYX05VTV9UUkFDS1MgdW5pdHMpCi0gICAgICAgIFRSQUNLMCAgICAgICAgICA9IDB4MTAwMCwKLQotICAgICAgICAvLyAweDIwMDAgaXMgdW51c2VkCi0KICAgICAgICAgLy8gc2V0UGFyYW1ldGVyIHRhcmdldHMKICAgICAgICAgVFJBQ0sgICAgICAgICAgID0gMHgzMDAwLAogICAgICAgICBSRVNBTVBMRSAgICAgICAgPSAweDMwMDEsCkBAIC0xMDUsMTcgKzk1LDMzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyYW1ldGVyICd2YWx1ZScgaXMgYSBwb2ludGVyIHRvIHRoZSBuZXcgcGxheWJhY2sgcmF0ZS4KICAgICB9OwogCisgICAgQXVkaW9NaXhlcihzaXplX3QgZnJhbWVDb3VudCwgdWludDMyX3Qgc2FtcGxlUmF0ZSkKKyAgICAgICAgOiBtU2FtcGxlUmF0ZShzYW1wbGVSYXRlKQorICAgICAgICAsIG1GcmFtZUNvdW50KGZyYW1lQ291bnQpIHsKKyAgICAgICAgcHRocmVhZF9vbmNlKCZzT25jZUNvbnRyb2wsICZzSW5pdFJvdXRpbmUpOworICAgIH0KIAotICAgIC8vIEZvciBhbGwgQVBJcyB3aXRoICJuYW1lIjogVFJBQ0swIDw9IG5hbWUgPCBUUkFDSzAgKyBNQVhfTlVNX1RSQUNLUworICAgIC8vIENyZWF0ZSBhIG5ldyB0cmFjayBpbiB0aGUgbWl4ZXIuCisgICAgLy8KKyAgICAvLyBccGFyYW0gbmFtZSAgICAgICAgYSB1bmlxdWUgdXNlci1wcm92aWRlZCBpbnRlZ2VyIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhY2suCisgICAgLy8gICAgICAgICAgICAgICAgICAgIElmIG5hbWUgYWxyZWFkeSBleGlzdHMsIHRoZSBmdW5jdGlvbiB3aWxsIGFib3J0LgorICAgIC8vIFxwYXJhbSBjaGFubmVsTWFzayBvdXRwdXQgY2hhbm5lbCBtYXNrLgorICAgIC8vIFxwYXJhbSBmb3JtYXQgICAgICBQQ00gZm9ybWF0CisgICAgLy8gXHBhcmFtIHNlc3Npb25JZCAgIFNlc3Npb24gaWQgZm9yIHRoZSB0cmFjay4gVHJhY2tzIHdpdGggdGhlIHNhbWUKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiBpZCB3aWxsIGJlIHN1Ym1peGVkIHRvZ2V0aGVyLgorICAgIC8vCisgICAgLy8gXHJldHVybiBPSyAgICAgICAgb24gc3VjY2Vzcy4KKyAgICAvLyAgICAgICAgIEJBRF9WQUxVRSBpZiB0aGUgZm9ybWF0IGRvZXMgbm90IHNhdGlzZnkgaXNWYWxpZEZvcm1hdCgpCisgICAgLy8gICAgICAgICAgICAgICAgICAgb3IgdGhlIGNoYW5uZWxNYXNrIGRvZXMgbm90IHNhdGlzZnkgaXNWYWxpZENoYW5uZWxNYXNrKCkuCisgICAgc3RhdHVzX3QgICAgY3JlYXRlKAorICAgICAgICAgICAgaW50IG5hbWUsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBzZXNzaW9uSWQpOwogCi0gICAgLy8gQWxsb2NhdGUgYSB0cmFjayBuYW1lLiAgUmV0dXJucyBuZXcgdHJhY2sgbmFtZSBpZiBzdWNjZXNzZnVsLCAtMSBvbiBmYWlsdXJlLgotICAgIC8vIFRoZSBmYWlsdXJlIGNvdWxkIGJlIGJlY2F1c2Ugb2YgYW4gaW52YWxpZCBjaGFubmVsTWFzayBvciBmb3JtYXQsIG9yIHRoYXQKLSAgICAvLyB0aGUgdHJhY2sgY2FwYWNpdHkgb2YgdGhlIG1peGVyIGlzIGV4Y2VlZGVkLgotICAgIGludCAgICAgICAgIGdldFRyYWNrTmFtZShhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgc2Vzc2lvbklkKTsKKyAgICBib29sICAgICAgICBleGlzdHMoaW50IG5hbWUpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UcmFja3MuY291bnQobmFtZSkgPiAwOworICAgIH0KIAotICAgIC8vIEZyZWUgYW4gYWxsb2NhdGVkIHRyYWNrIGJ5IG5hbWUKLSAgICB2b2lkICAgICAgICBkZWxldGVUcmFja05hbWUoaW50IG5hbWUpOworICAgIC8vIEZyZWUgYW4gYWxsb2NhdGVkIHRyYWNrIGJ5IG5hbWUuCisgICAgdm9pZCAgICAgICAgZGVzdHJveShpbnQgbmFtZSk7CiAKICAgICAvLyBFbmFibGUgb3IgZGlzYWJsZSBhbiBhbGxvY2F0ZWQgdHJhY2sgYnkgbmFtZQogICAgIHZvaWQgICAgICAgIGVuYWJsZShpbnQgbmFtZSk7CkBAIC0xMjQsMTMgKzEzMCwyNiBAQAogICAgIHZvaWQgICAgICAgIHNldFBhcmFtZXRlcihpbnQgbmFtZSwgaW50IHRhcmdldCwgaW50IHBhcmFtLCB2b2lkICp2YWx1ZSk7CiAKICAgICB2b2lkICAgICAgICBzZXRCdWZmZXJQcm92aWRlcihpbnQgbmFtZSwgQXVkaW9CdWZmZXJQcm92aWRlciogYnVmZmVyUHJvdmlkZXIpOwotICAgIHZvaWQgICAgICAgIHByb2Nlc3MoKTsKIAotICAgIHVpbnQzMl90ICAgIHRyYWNrTmFtZXMoKSBjb25zdCB7IHJldHVybiBtVHJhY2tOYW1lczsgfQorICAgIHZvaWQgICAgICAgIHByb2Nlc3MoKSB7CisgICAgICAgICh0aGlzLT4qbUhvb2spKCk7CisgICAgfQogCiAgICAgc2l6ZV90ICAgICAgZ2V0VW5yZWxlYXNlZEZyYW1lcyhpbnQgbmFtZSkgY29uc3Q7CiAKLSAgICBzdGF0aWMgaW5saW5lIGJvb2wgaXNWYWxpZFBjbVRyYWNrRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgeworICAgIHN0ZDo6c3RyaW5nIHRyYWNrTmFtZXMoKSBjb25zdCB7CisgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnBhaXIgOiBtVHJhY2tzKSB7CisgICAgICAgICAgICBzcyA8PCBwYWlyLmZpcnN0IDw8ICIgIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3Muc3RyKCk7CisgICAgfQorCisgICAgdm9pZCAgICAgICAgc2V0TkJMb2dXcml0ZXIoTkJMb2c6OldyaXRlciAqbG9nV3JpdGVyKSB7CisgICAgICAgIG1OQkxvZ1dyaXRlciA9IGxvZ1dyaXRlcjsKKyAgICB9CisKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgaXNWYWxpZEZvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKICAgICAgICAgc3dpdGNoIChmb3JtYXQpIHsKICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzhfQklUOgogICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgpAQCAtMTQzLDggKzE2MiwyMyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgc3RhdGljIGlubGluZSBib29sIGlzVmFsaWRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgeworICAgICAgICByZXR1cm4gYXVkaW9fY2hhbm5lbF9tYXNrX2lzX3ZhbGlkKGNoYW5uZWxNYXNrKTsgLy8gdGhlIFJlbWl4QnVmZmVyUHJvdmlkZXIgaXMgZmxleGlibGUuCisgICAgfQorCiBwcml2YXRlOgogCisgICAgLyogRm9yIG11bHRpLWZvcm1hdCBmdW5jdGlvbnMgKGNhbGxzIHRlbXBsYXRlIGZ1bmN0aW9ucworICAgICAqIGluIEF1ZGlvTWl4ZXJPcHMuaCkuICBUaGUgdGVtcGxhdGUgcGFyYW1ldGVycyBhcmUgYXMgZm9sbG93czoKKyAgICAgKgorICAgICAqICAgTUlYVFlQRSAgICAgKHNlZSBBdWRpb01peGVyT3BzLmggTUlYVFlQRV8qIGVudW1lcmF0aW9uKQorICAgICAqICAgVVNFRkxPQVRWT0wgKHNldCB0byB0cnVlIGlmIGZsb2F0IHZvbHVtZSBpcyB1c2VkKQorICAgICAqICAgQURKVVNUVk9MICAgKHNldCB0byB0cnVlIGlmIHZvbHVtZSByYW1wIHBhcmFtZXRlcnMgbmVlZHMgYWRqdXN0bWVudCBhZnRlcndhcmRzKQorICAgICAqICAgVE86IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAorICAgICAqICAgVEk6IGludDMyX3QgKFE0LjI3KSBvciBpbnQxNl90IChRMC4xNSkgb3IgZmxvYXQKKyAgICAgKiAgIFRBOiBpbnQzMl90IChRNC4yNykKKyAgICAgKi8KKwogICAgIGVudW0gewogICAgICAgICAvLyBGSVhNRSB0aGlzIHJlcHJlc2VudGF0aW9uIHBlcm1pdHMgdXAgdG8gOCBjaGFubmVscwogICAgICAgICBORUVEU19DSEFOTkVMX0NPVU5UX19NQVNLICAgPSAweDAwMDAwMDA3LApAQCAtMTYxLDE0ICsxOTUsNjcgQEAKICAgICAgICAgTkVFRFNfQVVYICAgICAgICAgICAgICAgICAgID0gMHgwMDAxMDAwMCwKICAgICB9OwogCi0gICAgc3RydWN0IHN0YXRlX3Q7Ci0gICAgc3RydWN0IHRyYWNrX3Q7CisgICAgLy8gaG9vayB0eXBlcworICAgIGVudW0geworICAgICAgICBQUk9DRVNTVFlQRV9OT1JFU0FNUExFT05FVFJBQ0ssIC8vIG90aGVycyBzZXQgZWxzZXdoZXJlCisgICAgfTsKIAotICAgIHR5cGVkZWYgdm9pZCAoKmhvb2tfdCkodHJhY2tfdCogdCwgaW50MzJfdCogb3V0cHV0LCBzaXplX3QgbnVtT3V0RnJhbWVzLCBpbnQzMl90KiB0ZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYXV4KTsKLSAgICBzdGF0aWMgY29uc3QgaW50IEJMT0NLU0laRSA9IDE2OyAvLyA0IGNhY2hlIGxpbmVzCisgICAgZW51bSB7CisgICAgICAgIFRSQUNLVFlQRV9OT1AsCisgICAgICAgIFRSQUNLVFlQRV9SRVNBTVBMRSwKKyAgICAgICAgVFJBQ0tUWVBFX05PUkVTQU1QTEUsCisgICAgICAgIFRSQUNLVFlQRV9OT1JFU0FNUExFTU9OTywKKyAgICB9OwogCi0gICAgc3RydWN0IHRyYWNrX3QgeworICAgIC8vIHByb2Nlc3MgaG9vayBmdW5jdGlvbmFsaXR5CisgICAgdXNpbmcgcHJvY2Vzc19ob29rX3QgPSB2b2lkKEF1ZGlvTWl4ZXI6OiopKCk7CisKKyAgICBzdHJ1Y3QgVHJhY2s7CisgICAgdXNpbmcgaG9va190ID0gdm9pZChUcmFjazo6KikoaW50MzJfdCogb3V0cHV0LCBzaXplX3QgbnVtT3V0RnJhbWVzLCBpbnQzMl90KiB0ZW1wLCBpbnQzMl90KiBhdXgpOworCisgICAgc3RydWN0IFRyYWNrIHsKKyAgICAgICAgVHJhY2soKQorICAgICAgICAgICAgOiBidWZmZXJQcm92aWRlcihudWxscHRyKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUT0RPOiBtb3ZlIGFkZGl0aW9uYWwgaW5pdGlhbGl6YXRpb24gaGVyZS4KKyAgICAgICAgfQorCisgICAgICAgIH5UcmFjaygpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGJ1ZmZlclByb3ZpZGVyLCBtSW5wdXRCdWZmZXJQcm92aWRlciBuZWVkIG5vdCBiZSBkZWxldGVkLgorICAgICAgICAgICAgbVJlc2FtcGxlci5yZXNldChudWxscHRyKTsKKyAgICAgICAgICAgIC8vIEVuc3VyZSB0aGUgb3JkZXIgb2YgZGVzdHJ1Y3Rpb24gb2YgYnVmZmVyIHByb3ZpZGVycyBhcyB0aGV5CisgICAgICAgICAgICAvLyByZWxlYXNlIHRoZSB1cHN0cmVhbSBwcm92aWRlciBpbiB0aGUgZGVzdHJ1Y3Rvci4KKyAgICAgICAgICAgIG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOworICAgICAgICAgICAgbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlci5yZXNldChudWxscHRyKTsKKyAgICAgICAgICAgIG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci5yZXNldChudWxscHRyKTsKKyAgICAgICAgICAgIG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCAgICAgICAgbmVlZHNSYW1wKCkgeyByZXR1cm4gKHZvbHVtZUluY1swXSB8IHZvbHVtZUluY1sxXSB8IGF1eEluYykgIT0gMDsgfQorICAgICAgICBib29sICAgICAgICBzZXRSZXNhbXBsZXIodWludDMyX3QgdHJhY2tTYW1wbGVSYXRlLCB1aW50MzJfdCBkZXZTYW1wbGVSYXRlKTsKKyAgICAgICAgYm9vbCAgICAgICAgZG9lc1Jlc2FtcGxlKCkgY29uc3QgeyByZXR1cm4gbVJlc2FtcGxlci5nZXQoKSAhPSBudWxscHRyOyB9CisgICAgICAgIHZvaWQgICAgICAgIHJlc2V0UmVzYW1wbGVyKCkgeyBpZiAobVJlc2FtcGxlci5nZXQoKSAhPSBudWxscHRyKSBtUmVzYW1wbGVyLT5yZXNldCgpOyB9CisgICAgICAgIHZvaWQgICAgICAgIGFkanVzdFZvbHVtZVJhbXAoYm9vbCBhdXgsIGJvb2wgdXNlRmxvYXQgPSBmYWxzZSk7CisgICAgICAgIHNpemVfdCAgICAgIGdldFVucmVsZWFzZWRGcmFtZXMoKSBjb25zdCB7IHJldHVybiBtUmVzYW1wbGVyLmdldCgpICE9IG51bGxwdHIgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNhbXBsZXItPmdldFVucmVsZWFzZWRGcmFtZXMoKSA6IDA7IH07CisKKyAgICAgICAgc3RhdHVzX3QgICAgcHJlcGFyZUZvckRvd25taXgoKTsKKyAgICAgICAgdm9pZCAgICAgICAgdW5wcmVwYXJlRm9yRG93bm1peCgpOworICAgICAgICBzdGF0dXNfdCAgICBwcmVwYXJlRm9yUmVmb3JtYXQoKTsKKyAgICAgICAgdm9pZCAgICAgICAgdW5wcmVwYXJlRm9yUmVmb3JtYXQoKTsKKyAgICAgICAgYm9vbCAgICAgICAgc2V0UGxheWJhY2tSYXRlKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwbGF5YmFja1JhdGUpOworICAgICAgICB2b2lkICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOworCisgICAgICAgIHN0YXRpYyBob29rX3QgZ2V0VHJhY2tIb29rKGludCB0cmFja1R5cGUsIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBtaXhlckluRm9ybWF0LCBhdWRpb19mb3JtYXRfdCBtaXhlck91dEZvcm1hdCk7CisKKyAgICAgICAgdm9pZCB0cmFja19fbm9wKGludDMyX3QqIG91dCwgc2l6ZV90IG51bUZyYW1lcywgaW50MzJfdCogdGVtcCwgaW50MzJfdCogYXV4KTsKKworICAgICAgICB0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIGJvb2wgVVNFRkxPQVRWT0wsIGJvb2wgQURKVVNUVk9MLAorICAgICAgICAgICAgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUQT4KKyAgICAgICAgdm9pZCB2b2x1bWVNaXgoVE8gKm91dCwgc2l6ZV90IG91dEZyYW1lcywgY29uc3QgVEkgKmluLCBUQSAqYXV4LCBib29sIHJhbXApOworCiAgICAgICAgIHVpbnQzMl90ICAgIG5lZWRzOwogCiAgICAgICAgIC8vIFRPRE86IEV2ZW50dWFsbHkgcmVtb3ZlIGxlZ2FjeSBpbnRlZ2VyIHZvbHVtZSBzZXR0aW5ncwpAQCAtMTc4LDE2ICsyNjUsMTEgQEAKICAgICAgICAgfTsKIAogICAgICAgICBpbnQzMl90ICAgICBwcmV2Vm9sdW1lW01BWF9OVU1fVk9MVU1FU107Ci0KLSAgICAgICAgLy8gMTYtYnl0ZSBib3VuZGFyeQotCiAgICAgICAgIGludDMyX3QgICAgIHZvbHVtZUluY1tNQVhfTlVNX1ZPTFVNRVNdOwogICAgICAgICBpbnQzMl90ICAgICBhdXhJbmM7CiAgICAgICAgIGludDMyX3QgICAgIHByZXZBdXhMZXZlbDsKLQotICAgICAgICAvLyAxNi1ieXRlIGJvdW5kYXJ5Ci0KICAgICAgICAgaW50MTZfdCAgICAgYXV4TGV2ZWw7ICAgICAgIC8vIDAgPD0gYXV4TGV2ZWwgPD0gTUFYX0dBSU5fSU5ULCBidXQgc2lnbmVkIGZvciBtdWwgcGVyZm9ybWFuY2UKKwogICAgICAgICB1aW50MTZfdCAgICBmcmFtZUNvdW50OwogCiAgICAgICAgIHVpbnQ4X3QgICAgIGNoYW5uZWxDb3VudDsgICAvLyAxIG9yIDIsIHJlZHVuZGFudCB3aXRoIChuZWVkcyAmIE5FRURTX0NIQU5ORUxfQ09VTlRfX01BU0spCkBAIC0xOTksMjIgKzI4MSwxNiBAQAogICAgICAgICAvLyAgZm9yIGhvdyB0aGUgVHJhY2sgYnVmZmVyIHByb3ZpZGVyIGlzIHdyYXBwZWQgYnkgYW5vdGhlciBvbmUgd2hlbiBkb3dtaXhpbmcgaXMgcmVxdWlyZWQKICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogICAgICAgICAgICAgICAgYnVmZmVyUHJvdmlkZXI7CiAKLSAgICAgICAgLy8gMTYtYnl0ZSBib3VuZGFyeQotCiAgICAgICAgIG11dGFibGUgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyIGJ1ZmZlcjsgLy8gOCBieXRlcwogCiAgICAgICAgIGhvb2tfdCAgICAgIGhvb2s7Ci0gICAgICAgIGNvbnN0IHZvaWQqIGluOyAgICAgICAgICAgICAvLyBjdXJyZW50IGxvY2F0aW9uIGluIGJ1ZmZlcgorICAgICAgICBjb25zdCB2b2lkICAqbUluOyAgICAgICAgICAgICAvLyBjdXJyZW50IGxvY2F0aW9uIGluIGJ1ZmZlcgogCi0gICAgICAgIC8vIDE2LWJ5dGUgYm91bmRhcnkKLQotICAgICAgICBBdWRpb1Jlc2FtcGxlciogICAgIHJlc2FtcGxlcjsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEF1ZGlvUmVzYW1wbGVyPiBtUmVzYW1wbGVyOwogICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIHNhbXBsZVJhdGU7CiAgICAgICAgIGludDMyX3QqICAgICAgICAgICBtYWluQnVmZmVyOwogICAgICAgICBpbnQzMl90KiAgICAgICAgICAgYXV4QnVmZmVyOwogCi0gICAgICAgIC8vIDE2LWJ5dGUgYm91bmRhcnkKLQogICAgICAgICAvKiBCdWZmZXIgcHJvdmlkZXJzIGFyZSBjb25zdHJ1Y3RlZCB0byB0cmFuc2xhdGUgdGhlIHRyYWNrIGlucHV0IGRhdGEgYXMgbmVlZGVkLgogICAgICAgICAgKgogICAgICAgICAgKiBUT0RPOiBwZXJoYXBzIG1ha2UgYSBzaW5nbGUgUGxheWJhY2tDb252ZXJ0ZXJQcm92aWRlciBjbGFzcyB0byBtb3ZlCkBAIC0yMjUsMTcgKzMwMSwxNyBAQAogICAgICAgICAgKiAgICBtYXRjaCBlaXRoZXIgbU1peGVySW5Gb3JtYXQgb3IgbURvd25taXhSZXF1aXJlc0Zvcm1hdCwgaWYgdGhlIGRvd25taXhlcgogICAgICAgICAgKiAgICByZXF1aXJlcyByZWZvcm1hdC4gRm9yIGV4YW1wbGUsIGl0IG1heSBjb252ZXJ0IGZsb2F0aW5nIHBvaW50IGlucHV0IHRvCiAgICAgICAgICAqICAgIFBDTV8xNl9iaXQgaWYgdGhhdCdzIHJlcXVpcmVkIGJ5IHRoZSBkb3dubWl4ZXIuCi0gICAgICAgICAqIDMpIGRvd25taXhlckJ1ZmZlclByb3ZpZGVyOiBJZiBub3QgTlVMTCwgcGVyZm9ybXMgdGhlIGNoYW5uZWwgcmVtaXhpbmcgdG8gbWF0Y2gKKyAgICAgICAgICogMykgbURvd25taXhlckJ1ZmZlclByb3ZpZGVyOiBJZiBub3QgTlVMTCwgcGVyZm9ybXMgdGhlIGNoYW5uZWwgcmVtaXhpbmcgdG8gbWF0Y2gKICAgICAgICAgICogICAgdGhlIG51bWJlciBvZiBjaGFubmVscyByZXF1aXJlZCBieSB0aGUgbWl4ZXIgc2luay4KICAgICAgICAgICogNCkgbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlcjogSWYgbm90IE5VTEwsIHBlcmZvcm1zIHJlZm9ybWF0dGluZyBmcm9tCiAgICAgICAgICAqICAgIHRoZSBkb3dubWl4ZXIgcmVxdWlyZW1lbnRzIHRvIHRoZSBtaXhlciBlbmdpbmUgaW5wdXQgcmVxdWlyZW1lbnRzLgogICAgICAgICAgKiA1KSBtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjogQWRkcyB0aW1lc3RyZXRjaGluZyBmb3IgcGxheWJhY2sgcmF0ZQogICAgICAgICAgKi8KICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogICAgIG1JbnB1dEJ1ZmZlclByb3ZpZGVyOyAgICAvLyBleHRlcm5hbGx5IHByb3ZpZGVkIGJ1ZmZlciBwcm92aWRlci4KLSAgICAgICAgUGFzc3RocnVCdWZmZXJQcm92aWRlciogIG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOyAvLyBwcm92aWRlciB3cmFwcGVyIGZvciByZWZvcm1hdHRpbmcuCi0gICAgICAgIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXIqICBkb3dubWl4ZXJCdWZmZXJQcm92aWRlcjsgLy8gd3JhcHBlciBmb3IgY2hhbm5lbCBjb252ZXJzaW9uLgotICAgICAgICBQYXNzdGhydUJ1ZmZlclByb3ZpZGVyKiAgbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlcjsKLSAgICAgICAgUGFzc3RocnVCdWZmZXJQcm92aWRlciogIG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFzc3RocnVCdWZmZXJQcm92aWRlcj4gbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxQYXNzdGhydUJ1ZmZlclByb3ZpZGVyPiBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXI7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxQYXNzdGhydUJ1ZmZlclByb3ZpZGVyPiBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFzc3RocnVCdWZmZXJQcm92aWRlcj4gbVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXI7CiAKICAgICAgICAgaW50MzJfdCAgICAgc2Vzc2lvbklkOwogCkBAIC0yNjAsMTI5ICszMzYsNzQgQEAKIAogICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSAgICBtUGxheWJhY2tSYXRlOwogCi0gICAgICAgIGJvb2wgICAgICAgIG5lZWRzUmFtcCgpIHsgcmV0dXJuICh2b2x1bWVJbmNbMF0gfCB2b2x1bWVJbmNbMV0gfCBhdXhJbmMpICE9IDA7IH0KLSAgICAgICAgYm9vbCAgICAgICAgc2V0UmVzYW1wbGVyKHVpbnQzMl90IHRyYWNrU2FtcGxlUmF0ZSwgdWludDMyX3QgZGV2U2FtcGxlUmF0ZSk7Ci0gICAgICAgIGJvb2wgICAgICAgIGRvZXNSZXNhbXBsZSgpIGNvbnN0IHsgcmV0dXJuIHJlc2FtcGxlciAhPSBOVUxMOyB9Ci0gICAgICAgIHZvaWQgICAgICAgIHJlc2V0UmVzYW1wbGVyKCkgeyBpZiAocmVzYW1wbGVyICE9IE5VTEwpIHJlc2FtcGxlci0+cmVzZXQoKTsgfQotICAgICAgICB2b2lkICAgICAgICBhZGp1c3RWb2x1bWVSYW1wKGJvb2wgYXV4LCBib29sIHVzZUZsb2F0ID0gZmFsc2UpOwotICAgICAgICBzaXplX3QgICAgICBnZXRVbnJlbGVhc2VkRnJhbWVzKCkgY29uc3QgeyByZXR1cm4gcmVzYW1wbGVyICE9IE5VTEwgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2FtcGxlci0+Z2V0VW5yZWxlYXNlZEZyYW1lcygpIDogMDsgfTsKKyAgICBwcml2YXRlOgorICAgICAgICAvLyBob29rcworICAgICAgICB2b2lkIHRyYWNrX19nZW5lcmljUmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3QgbnVtRnJhbWVzLCBpbnQzMl90KiB0ZW1wLCBpbnQzMl90KiBhdXgpOworICAgICAgICB2b2lkIHRyYWNrX18xNkJpdHNTdGVyZW8oaW50MzJfdCogb3V0LCBzaXplX3QgbnVtRnJhbWVzLCBpbnQzMl90KiB0ZW1wLCBpbnQzMl90KiBhdXgpOworICAgICAgICB2b2lkIHRyYWNrX18xNkJpdHNNb25vKGludDMyX3QqIG91dCwgc2l6ZV90IG51bUZyYW1lcywgaW50MzJfdCogdGVtcCwgaW50MzJfdCogYXV4KTsKIAotICAgICAgICBzdGF0dXNfdCAgICBwcmVwYXJlRm9yRG93bm1peCgpOwotICAgICAgICB2b2lkICAgICAgICB1bnByZXBhcmVGb3JEb3dubWl4KCk7Ci0gICAgICAgIHN0YXR1c190ICAgIHByZXBhcmVGb3JSZWZvcm1hdCgpOwotICAgICAgICB2b2lkICAgICAgICB1bnByZXBhcmVGb3JSZWZvcm1hdCgpOwotICAgICAgICBib29sICAgICAgICBzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnBsYXliYWNrUmF0ZSk7Ci0gICAgICAgIHZvaWQgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CisgICAgICAgIHZvaWQgdm9sdW1lUmFtcFN0ZXJlbyhpbnQzMl90KiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LCBpbnQzMl90KiB0ZW1wLCBpbnQzMl90KiBhdXgpOworICAgICAgICB2b2lkIHZvbHVtZVN0ZXJlbyhpbnQzMl90KiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LCBpbnQzMl90KiB0ZW1wLCBpbnQzMl90KiBhdXgpOworCisgICAgICAgIC8vIG11bHRpLWZvcm1hdCB0cmFjayBob29rcworICAgICAgICB0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVEE+CisgICAgICAgIHZvaWQgdHJhY2tfX1Jlc2FtcGxlKFRPKiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LCBUTyogdGVtcCBfX3VudXNlZCwgVEEqIGF1eCk7CisgICAgICAgIHRlbXBsYXRlIDxpbnQgTUlYVFlQRSwgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUQT4KKyAgICAgICAgdm9pZCB0cmFja19fTm9SZXNhbXBsZShUTyogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwgVE8qIHRlbXAgX191bnVzZWQsIFRBKiBhdXgpOwogICAgIH07CiAKLSAgICB0eXBlZGVmIHZvaWQgKCpwcm9jZXNzX2hvb2tfdCkoc3RhdGVfdCogc3RhdGUpOwotCi0gICAgLy8gcGFkIHRvIDMyLWJ5dGVzIHRvIGZpbGwgY2FjaGUgbGluZQotICAgIHN0cnVjdCBzdGF0ZV90IHsKLSAgICAgICAgdWludDMyX3QgICAgICAgIGVuYWJsZWRUcmFja3M7Ci0gICAgICAgIHVpbnQzMl90ICAgICAgICBuZWVkc0NoYW5nZWQ7Ci0gICAgICAgIHNpemVfdCAgICAgICAgICBmcmFtZUNvdW50OwotICAgICAgICBwcm9jZXNzX2hvb2tfdCAgaG9vazsgICAvLyBvbmUgb2YgcHJvY2Vzc19fKiwgbmV2ZXIgTlVMTAotICAgICAgICBpbnQzMl90ICAgICAgICAgKm91dHB1dFRlbXA7Ci0gICAgICAgIGludDMyX3QgICAgICAgICAqcmVzYW1wbGVUZW1wOwotICAgICAgICBOQkxvZzo6V3JpdGVyKiAgbU5CTG9nV3JpdGVyOyAgIC8vIGFzc29jaWF0ZWQgTkJMb2c6OldyaXRlciBvciAmbUR1bW15TG9nCi0gICAgICAgIGludDMyX3QgICAgICAgICByZXNlcnZlZFsxXTsKLSAgICAgICAgLy8gRklYTUUgYWxsb2NhdGUgZHluYW1pY2FsbHkgdG8gc2F2ZSBzb21lIG1lbW9yeSB3aGVuIG1heE51bVRyYWNrcyA8IE1BWF9OVU1fVFJBQ0tTCi0gICAgICAgIHRyYWNrX3QgICAgICAgICB0cmFja3NbTUFYX05VTV9UUkFDS1NdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7Ci0gICAgfTsKLQotICAgIC8vIGJpdG1hc2sgb2YgYWxsb2NhdGVkIHRyYWNrIG5hbWVzLCB3aGVyZSBiaXQgMCBjb3JyZXNwb25kcyB0byBUUkFDSzAgZXRjLgotICAgIHVpbnQzMl90ICAgICAgICBtVHJhY2tOYW1lczsKLQotICAgIC8vIGJpdG1hc2sgb2YgY29uZmlndXJlZCB0cmFjayBuYW1lczsgfjAgaWYgbWF4TnVtVHJhY2tzID09IE1BWF9OVU1fVFJBQ0tTLAotICAgIC8vIGJ1dCB3aWxsIGhhdmUgZmV3ZXIgYml0cyBzZXQgaWYgbWF4TnVtVHJhY2tzIDwgTUFYX05VTV9UUkFDS1MKLSAgICBjb25zdCB1aW50MzJfdCAgbUNvbmZpZ3VyZWROYW1lczsKLQotICAgIGNvbnN0IHVpbnQzMl90ICBtU2FtcGxlUmF0ZTsKLQotICAgIE5CTG9nOjpXcml0ZXIgICBtRHVtbXlMb2dXcml0ZXI7Ci1wdWJsaWM6Ci0gICAgLy8gQ2FsbGVkIGJ5IEZhc3RNaXhlciB0byBpbmZvcm0gQXVkaW9NaXhlciBvZiBpdCdzIGFzc29jaWF0ZWQgTkJMb2c6OldyaXRlci4KLSAgICAvLyBGSVhNRSBJdCB3b3VsZCBiZSBzYWZlciB0byB1c2UgVExTIGZvciB0aGlzLCBzbyB3ZSBkb24ndCBhY2NpZGVudGFsbHkgdXNlIHdyb25nIG9uZS4KLSAgICB2b2lkICAgICAgICAgICAgc2V0TkJMb2dXcml0ZXIoTkJMb2c6OldyaXRlciogbG9nKTsKLXByaXZhdGU6Ci0gICAgc3RhdGVfdCAgICAgICAgIG1TdGF0ZSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDMyKSkpOwotCi0gICAgLy8gQ2FsbCBhZnRlciBjaGFuZ2luZyBlaXRoZXIgdGhlIGVuYWJsZWQgc3RhdHVzIG9mIGEgdHJhY2ssIG9yIHBhcmFtZXRlcnMgb2YgYW4gZW5hYmxlZCB0cmFjay4KLSAgICAvLyBPSyB0byBjYWxsIG1vcmUgb2Z0ZW4gdGhhbiB0aGF0LCBidXQgdW5uZWNlc3NhcnkuCi0gICAgdm9pZCBpbnZhbGlkYXRlU3RhdGUodWludDMyX3QgbWFzayk7CisgICAgLy8gVE9ETzogcmVtb3ZlIEJMT0NLU0laRSB1bml0IG9mIHByb2Nlc3NpbmcgLSBpdCBpc24ndCBuZWVkZWQgYW55bW9yZS4KKyAgICBzdGF0aWMgY29uc3RleHByIGludCBCTE9DS1NJWkUgPSAxNjsKIAogICAgIGJvb2wgc2V0Q2hhbm5lbE1hc2tzKGludCBuYW1lLAogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgdHJhY2tDaGFubmVsTWFzaywgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWl4ZXJDaGFubmVsTWFzayk7CiAKLSAgICBzdGF0aWMgdm9pZCB0cmFja19fZ2VuZXJpY1Jlc2FtcGxlKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IG51bUZyYW1lcywgaW50MzJfdCogdGVtcCwKLSAgICAgICAgICAgIGludDMyX3QqIGF1eCk7Ci0gICAgc3RhdGljIHZvaWQgdHJhY2tfX25vcCh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBudW1GcmFtZXMsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCk7Ci0gICAgc3RhdGljIHZvaWQgdHJhY2tfXzE2Qml0c1N0ZXJlbyh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBudW1GcmFtZXMsIGludDMyX3QqIHRlbXAsCi0gICAgICAgICAgICBpbnQzMl90KiBhdXgpOwotICAgIHN0YXRpYyB2b2lkIHRyYWNrX18xNkJpdHNNb25vKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IG51bUZyYW1lcywgaW50MzJfdCogdGVtcCwKLSAgICAgICAgICAgIGludDMyX3QqIGF1eCk7Ci0gICAgc3RhdGljIHZvaWQgdm9sdW1lUmFtcFN0ZXJlbyh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LCBpbnQzMl90KiB0ZW1wLAotICAgICAgICAgICAgaW50MzJfdCogYXV4KTsKLSAgICBzdGF0aWMgdm9pZCB2b2x1bWVTdGVyZW8odHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwgaW50MzJfdCogdGVtcCwKLSAgICAgICAgICAgIGludDMyX3QqIGF1eCk7CisgICAgLy8gQ2FsbGVkIHdoZW4gdHJhY2sgaW5mbyBjaGFuZ2VzIGFuZCBhIG5ldyBwcm9jZXNzIGhvb2sgc2hvdWxkIGJlIGRldGVybWluZWQuCisgICAgdm9pZCBpbnZhbGlkYXRlKCkgeworICAgICAgICBtSG9vayA9ICZBdWRpb01peGVyOjpwcm9jZXNzX192YWxpZGF0ZTsKKyAgICB9CiAKLSAgICBzdGF0aWMgdm9pZCBwcm9jZXNzX192YWxpZGF0ZShzdGF0ZV90KiBzdGF0ZSk7Ci0gICAgc3RhdGljIHZvaWQgcHJvY2Vzc19fbm9wKHN0YXRlX3QqIHN0YXRlKTsKLSAgICBzdGF0aWMgdm9pZCBwcm9jZXNzX19nZW5lcmljTm9SZXNhbXBsaW5nKHN0YXRlX3QqIHN0YXRlKTsKLSAgICBzdGF0aWMgdm9pZCBwcm9jZXNzX19nZW5lcmljUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSk7Ci0gICAgc3RhdGljIHZvaWQgcHJvY2Vzc19fT25lVHJhY2sxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmcoc3RhdGVfdCogc3RhdGUpOworICAgIHZvaWQgcHJvY2Vzc19fdmFsaWRhdGUoKTsKKyAgICB2b2lkIHByb2Nlc3NfX25vcCgpOworICAgIHZvaWQgcHJvY2Vzc19fZ2VuZXJpY05vUmVzYW1wbGluZygpOworICAgIHZvaWQgcHJvY2Vzc19fZ2VuZXJpY1Jlc2FtcGxpbmcoKTsKKyAgICB2b2lkIHByb2Nlc3NfX29uZVRyYWNrMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nKCk7CiAKLSAgICBzdGF0aWMgcHRocmVhZF9vbmNlX3QgICBzT25jZUNvbnRyb2w7Ci0gICAgc3RhdGljIHZvaWQgICAgICAgICAgICAgc0luaXRSb3V0aW5lKCk7Ci0KLSAgICAvKiBtdWx0aS1mb3JtYXQgdm9sdW1lIG1peGluZyBmdW5jdGlvbiAoY2FsbHMgdGVtcGxhdGUgZnVuY3Rpb25zCi0gICAgICogaW4gQXVkaW9NaXhlck9wcy5oKS4gIFRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFyZSBhcyBmb2xsb3dzOgotICAgICAqCi0gICAgICogICBNSVhUWVBFICAgICAoc2VlIEF1ZGlvTWl4ZXJPcHMuaCBNSVhUWVBFXyogZW51bWVyYXRpb24pCi0gICAgICogICBVU0VGTE9BVFZPTCAoc2V0IHRvIHRydWUgaWYgZmxvYXQgdm9sdW1lIGlzIHVzZWQpCi0gICAgICogICBBREpVU1RWT0wgICAoc2V0IHRvIHRydWUgaWYgdm9sdW1lIHJhbXAgcGFyYW1ldGVycyBuZWVkcyBhZGp1c3RtZW50IGFmdGVyd2FyZHMpCi0gICAgICogICBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0Ci0gICAgICogICBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAotICAgICAqICAgVEE6IGludDMyX3QgKFE0LjI3KQotICAgICAqLwotICAgIHRlbXBsYXRlIDxpbnQgTUlYVFlQRSwgYm9vbCBVU0VGTE9BVFZPTCwgYm9vbCBBREpVU1RWT0wsCi0gICAgICAgIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVEE+Ci0gICAgc3RhdGljIHZvaWQgdm9sdW1lTWl4KFRPICpvdXQsIHNpemVfdCBvdXRGcmFtZXMsCi0gICAgICAgICAgICBjb25zdCBUSSAqaW4sIFRBICphdXgsIGJvb2wgcmFtcCwgQXVkaW9NaXhlcjo6dHJhY2tfdCAqdCk7Ci0KLSAgICAvLyBtdWx0aS1mb3JtYXQgcHJvY2VzcyBob29rcwogICAgIHRlbXBsYXRlIDxpbnQgTUlYVFlQRSwgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUQT4KLSAgICBzdGF0aWMgdm9pZCBwcm9jZXNzX05vUmVzYW1wbGVPbmVUcmFjayhzdGF0ZV90KiBzdGF0ZSk7CisgICAgdm9pZCBwcm9jZXNzX19ub1Jlc2FtcGxlT25lVHJhY2soKTsKIAotICAgIC8vIG11bHRpLWZvcm1hdCB0cmFjayBob29rcwotICAgIHRlbXBsYXRlIDxpbnQgTUlYVFlQRSwgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUQT4KLSAgICBzdGF0aWMgdm9pZCB0cmFja19fUmVzYW1wbGUodHJhY2tfdCogdCwgVE8qIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsCi0gICAgICAgICAgICBUTyogdGVtcCBfX3VudXNlZCwgVEEqIGF1eCk7Ci0gICAgdGVtcGxhdGUgPGludCBNSVhUWVBFLCB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRBPgotICAgIHN0YXRpYyB2b2lkIHRyYWNrX19Ob1Jlc2FtcGxlKHRyYWNrX3QqIHQsIFRPKiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LAotICAgICAgICAgICAgVE8qIHRlbXAgX191bnVzZWQsIFRBKiBhdXgpOworICAgIHN0YXRpYyBwcm9jZXNzX2hvb2tfdCBnZXRQcm9jZXNzSG9vayhpbnQgcHJvY2Vzc1R5cGUsIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IG1peGVySW5Gb3JtYXQsIGF1ZGlvX2Zvcm1hdF90IG1peGVyT3V0Rm9ybWF0KTsKIAogICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRNaXhlckZvcm1hdCh2b2lkICpvdXQsIGF1ZGlvX2Zvcm1hdF90IG1peGVyT3V0Rm9ybWF0LAogICAgICAgICAgICAgdm9pZCAqaW4sIGF1ZGlvX2Zvcm1hdF90IG1peGVySW5Gb3JtYXQsIHNpemVfdCBzYW1wbGVDb3VudCk7CiAKLSAgICAvLyBob29rIHR5cGVzCi0gICAgZW51bSB7Ci0gICAgICAgIFBST0NFU1NUWVBFX05PUkVTQU1QTEVPTkVUUkFDSywKLSAgICB9OwotICAgIGVudW0gewotICAgICAgICBUUkFDS1RZUEVfTk9QLAotICAgICAgICBUUkFDS1RZUEVfUkVTQU1QTEUsCi0gICAgICAgIFRSQUNLVFlQRV9OT1JFU0FNUExFLAotICAgICAgICBUUkFDS1RZUEVfTk9SRVNBTVBMRU1PTk8sCi0gICAgfTsKKyAgICBzdGF0aWMgdm9pZCBzSW5pdFJvdXRpbmUoKTsKIAotICAgIC8vIGZ1bmN0aW9ucyBmb3IgZGV0ZXJtaW5pbmcgdGhlIHByb3BlciBwcm9jZXNzIGFuZCB0cmFjayBob29rcy4KLSAgICBzdGF0aWMgcHJvY2Vzc19ob29rX3QgZ2V0UHJvY2Vzc0hvb2soaW50IHByb2Nlc3NUeXBlLCB1aW50MzJfdCBjaGFubmVsQ291bnQsCi0gICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBtaXhlckluRm9ybWF0LCBhdWRpb19mb3JtYXRfdCBtaXhlck91dEZvcm1hdCk7Ci0gICAgc3RhdGljIGhvb2tfdCBnZXRUcmFja0hvb2soaW50IHRyYWNrVHlwZSwgdWludDMyX3QgY2hhbm5lbENvdW50LAotICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgbWl4ZXJJbkZvcm1hdCwgYXVkaW9fZm9ybWF0X3QgbWl4ZXJPdXRGb3JtYXQpOworICAgIC8vIGluaXRpYWxpemF0aW9uIGNvbnN0YW50cworICAgIGNvbnN0IHVpbnQzMl90IG1TYW1wbGVSYXRlOworICAgIGNvbnN0IHNpemVfdCBtRnJhbWVDb3VudDsKKworICAgIE5CTG9nOjpXcml0ZXIgKm1OQkxvZ1dyaXRlciA9IG51bGxwdHI7ICAgLy8gYXNzb2NpYXRlZCBOQkxvZzo6V3JpdGVyCisKKyAgICBwcm9jZXNzX2hvb2tfdCBtSG9vayA9ICZBdWRpb01peGVyOjpwcm9jZXNzX19ub3A7ICAgLy8gb25lIG9mIHByb2Nlc3NfXyosIG5ldmVyIG51bGxwdHIKKworICAgIC8vIHRoZSBzaXplIG9mIHRoZSB0eXBlIChpbnQzMl90KSBzaG91bGQgYmUgdGhlIGxhcmdlc3Qgb2YgYWxsIHR5cGVzIHN1cHBvcnRlZAorICAgIC8vIGJ5IHRoZSBtaXhlci4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8aW50MzJfdFtdPiBtT3V0cHV0VGVtcDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8aW50MzJfdFtdPiBtUmVzYW1wbGVUZW1wOworCisgICAgLy8gdHJhY2sgbmFtZXMgZ3JvdXBlZCBieSBtYWluIGJ1ZmZlciwgaW4gbm8gcGFydGljdWxhciBvcmRlciBvZiBtYWluIGJ1ZmZlci4KKyAgICAvLyBob3dldmVyIG5hbWVzIGZvciBhIHBhcnRpY3VsYXIgbWFpbiBidWZmZXIgYXJlIGluIG9yZGVyIChieSBjb25zdHJ1Y3Rpb24pLgorICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx2b2lkICogLyogbWFpbkJ1ZmZlciAqLywgc3RkOjp2ZWN0b3I8aW50IC8qIG5hbWUgKi8+PiBtR3JvdXBzOworCisgICAgLy8gdHJhY2sgbmFtZXMgdGhhdCBhcmUgZW5hYmxlZCwgaW4gaW5jcmVhc2luZyBvcmRlciAoYnkgY29uc3RydWN0aW9uKS4KKyAgICBzdGQ6OnZlY3RvcjxpbnQgLyogbmFtZSAqLz4gbUVuYWJsZWQ7CisKKyAgICAvLyB0cmFjayBzbWFydCBwb2ludGVycywgYnkgbmFtZSwgaW4gaW5jcmVhc2luZyBvcmRlciBvZiBuYW1lLgorICAgIHN0ZDo6bWFwPGludCAvKiBuYW1lICovLCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2s+PiBtVHJhY2tzOworCisgICAgc3RhdGljIHB0aHJlYWRfb25jZV90IHNPbmNlQ29udHJvbDsgLy8gaW5pdGlhbGl6ZWQgaW4gY29uc3RydWN0b3IgYnkgZmlyc3QgbmV3CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUGFyYW1ldGVyLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUGFyYW1ldGVyLmgKaW5kZXggMWFjZTYwNy4uNTlhYzFkYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BhcmFtZXRlci5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9QYXJhbWV0ZXIuaApAQCAtNTgsNiArNTgsMTIgQEAKICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleU1vbm9PdXRwdXQ7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlTdHJlYW1Id0F2U3luYzsKIAorICAgIC8vICBrZXlzIGZvciBwcmVzZW50YXRpb24gc2VsZWN0aW9uCisgICAgLy8gIGtleVByZXNlbnRhdGlvbklkOiBBdWRpbyBwcmVzZW50YXRpb24gaWRlbnRpZmllcgorICAgIC8vICBrZXlQcm9ncmFtSWQ6IEF1ZGlvIHByZXNlbnRhdGlvbiBwcm9ncmFtIGlkZW50aWZpZXIKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleVByZXNlbnRhdGlvbklkOworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5UHJvZ3JhbUlkOworCiAgICAgLy8gIGtleVN0cmVhbUNvbm5lY3QgLyBEaXNjb25uZWN0OiB2YWx1ZSBpcyBhbiBpbnQgaW4gYXVkaW9fZGV2aWNlc190CiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlTdHJlYW1Db25uZWN0OwogICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5U3RyZWFtRGlzY29ubmVjdDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaAppbmRleCBkZDcyMTcwLi5jZjQ0NmE1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCkBAIC0xNywxMiArMTcsMTggQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT1JFQ09SRF9ICiAjZGVmaW5lIEFORFJPSURfQVVESU9SRUNPUkRfSAogCisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KICNpbmNsdWRlIDxjdXRpbHMvc2NoZWRfcG9saWN5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RpbWVzdGFtcC5oPgotI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1JlY29yZC5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgogI2luY2x1ZGUgPG1lZGlhL01vZHVsby5oPgorI2luY2x1ZGUgPG1lZGlhL01pY3JvcGhvbmVJbmZvLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJhbmRyb2lkL21lZGlhL0lBdWRpb1JlY29yZC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTE4Miw3ICsxODgsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCA9IEFVRElPX1VJRF9JTlZBTElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkID0gLTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUpOwogCiAgICAgLyogVGVybWluYXRlcyB0aGUgQXVkaW9SZWNvcmQgYW5kIHVucmVnaXN0ZXJzIGl0IGZyb20gQXVkaW9GbGluZ2VyLgogICAgICAqIEFsc28gZGVzdHJveXMgYWxsIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIEF1ZGlvUmVjb3JkLgpAQCAtMjIwLDcgKzIyNyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQgPSBBVURJT19VSURfSU5WQUxJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQgPSAtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CiAKICAgICAvKiBSZXN1bHQgb2YgY29uc3RydWN0aW5nIHRoZSBBdWRpb1JlY29yZC4gVGhpcyBtdXN0IGJlIGNoZWNrZWQgZm9yIHN1Y2Nlc3NmdWwgaW5pdGlhbGl6YXRpb24KICAgICAgKiBiZWZvcmUgdXNpbmcgYW55IEF1ZGlvUmVjb3JkIEFQSSAoZXhjZXB0IGZvciBzZXQoKSksIGJlY2F1c2UgdXNpbmcKQEAgLTI1MCw2ICsyNTgsMTEgQEAKICAgICAgKi8KICAgICAgICAgICAgIHVpbnQzMl90ICAgIGdldE5vdGlmaWNhdGlvblBlcmlvZEluRnJhbWVzKCkgY29uc3QgeyByZXR1cm4gbU5vdGlmaWNhdGlvbkZyYW1lc0FjdDsgfQogCisgICAgLyoKKyAgICAgKiByZXR1cm4gbWV0cmljcyBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnQgaW5zdGFuY2UuCisgICAgICovCisgICAgICAgICAgICBzdGF0dXNfdCBnZXRNZXRyaWNzKE1lZGlhQW5hbHl0aWNzSXRlbSAqICZpdGVtKTsKKwogICAgIC8qIEFmdGVyIGl0J3MgY3JlYXRlZCB0aGUgdHJhY2sgaXMgbm90IGFjdGl2ZS4gQ2FsbCBzdGFydCgpIHRvCiAgICAgICogbWFrZSBpdCBhY3RpdmUuIElmIHNldCwgdGhlIGNhbGxiYWNrIHdpbGwgc3RhcnQgYmVpbmcgY2FsbGVkLgogICAgICAqIElmIGV2ZW50IGlzIG5vdCBBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9OT05FLCB0aGUgY2FwdHVyZSBzdGFydCB3aWxsIGJlIGRlbGF5ZWQgdW50aWwKQEAgLTUxNiw2ICs1MjksMTYgQEAKICAgICAvKiBHZXQgdGhlIGZsYWdzICovCiAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGdldEZsYWdzKCkgY29uc3QgeyBBdXRvTXV0ZXggX2wobUxvY2spOyByZXR1cm4gbUZsYWdzOyB9CiAKKyAgICAvKiBHZXQgYWN0aXZlIG1pY3JvcGhvbmVzLiBBIGVtcHR5IHZlY3RvciBvZiBNaWNyb3Bob25lSW5mbyB3aWxsIGJlIHBhc3NlZCBhcyBhIHBhcmFtZXRlciwKKyAgICAgKiB0aGUgZGF0YSB3aWxsIGJlIGZpbGxlZCB3aGVuIHF1ZXJ5aW5nIHRoZSBoYWwuCisgICAgICovCisgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcyk7CisKKyAgICAvKgorICAgICAqIER1bXBzIHRoZSBzdGF0ZSBvZiBhbiBhdWRpbyByZWNvcmQuCisgICAgICovCisgICAgICAgICAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CisKIHByaXZhdGU6CiAgICAgLyogY29weWluZyBhdWRpbyByZWNvcmQgb2JqZWN0cyBpcyBub3QgYWxsb3dlZCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9SZWNvcmQoY29uc3QgQXVkaW9SZWNvcmQmIG90aGVyKTsKQEAgLTU2NSw3ICs1ODgsNyBAQAogCiAgICAgICAgICAgICAvLyBjYWxsZXIgbXVzdCBob2xkIGxvY2sgb24gbUxvY2sgZm9yIGFsbCBfbCBtZXRob2RzCiAKLSAgICAgICAgICAgIHN0YXR1c190IG9wZW5SZWNvcmRfbChjb25zdCBNb2R1bG88dWludDMyX3Q+ICZlcG9jaCwgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpOworICAgICAgICAgICAgc3RhdHVzX3QgY3JlYXRlUmVjb3JkX2woY29uc3QgTW9kdWxvPHVpbnQzMl90PiAmZXBvY2gsIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lKTsKIAogICAgICAgICAgICAgLy8gRklYTUUgZW51bSBpcyBmYXN0ZXIgdGhhbiBzdHJjbXAoKSBmb3IgcGFyYW1ldGVyICdmcm9tJwogICAgICAgICAgICAgc3RhdHVzX3QgcmVzdG9yZVJlY29yZF9sKGNvbnN0IGNoYXIgKmZyb20pOwpAQCAtNjM1LDcgKzY1OCw3IEBACiAKICAgICAvLyBOZXh0IDUgZmllbGRzIG1heSBiZSBjaGFuZ2VkIGlmIElBdWRpb1JlY29yZCBpcyByZS1jcmVhdGVkLCBidXQgYWx3YXlzICE9IDAKICAgICAvLyBwcm92aWRlZCB0aGUgaW5pdGlhbCBzZXQoKSB3YXMgc3VjY2Vzc2Z1bAotICAgIHNwPElBdWRpb1JlY29yZD4gICAgICAgIG1BdWRpb1JlY29yZDsKKyAgICBzcDxtZWRpYTo6SUF1ZGlvUmVjb3JkPiBtQXVkaW9SZWNvcmQ7CiAgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbUNibGtNZW1vcnk7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiAgICAgbUNibGs7ICAgICAgICAgICAgICAvLyByZS1sb2FkIGFmdGVyIG1Mb2NrLnVubG9jaygpCiAgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbUJ1ZmZlck1lbW9yeTsKQEAgLTY3Nyw4ICs3MDAsNDAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXkgbm90IG1hdGNoIHRoZSBhcHAgc2VsZWN0aW9uIGRlcGVuZGluZyBvbiBvdGhlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjdGl2aXR5IGFuZCBjb25uZWN0ZWQgZGV2aWNlcwogICAgIHdwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiBtRGV2aWNlQ2FsbGJhY2s7Ci0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICBtUG9ydElkOyAgLy8gdW5pcXVlIElEIGFsbG9jYXRlZCBieSBhdWRpbyBwb2xpY3kKIAorcHJpdmF0ZToKKyAgICBjbGFzcyBNZWRpYU1ldHJpY3MgeworICAgICAgcHVibGljOgorICAgICAgICBNZWRpYU1ldHJpY3MoKSA6IG1BbmFseXRpY3NJdGVtKG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oImF1ZGlvcmVjb3JkIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1DcmVhdGVkTnMoc3lzdGVtVGltZShTWVNURU1fVElNRV9SRUFMVElNRSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydGVkTnMoMCksIG1EdXJhdGlvbk5zKDApLCBtQ291bnQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RFcnJvcihOT19FUlJPUikgeworICAgICAgICB9CisgICAgICAgIH5NZWRpYU1ldHJpY3MoKSB7CisgICAgICAgICAgICAvLyBtQW5hbHl0aWNzSXRlbSBhbGxvYyBmYWlsdXJlIHdpbGwgYmUgZmxhZ2dlZCBpbiB0aGUgY29uc3RydWN0b3IKKyAgICAgICAgICAgIC8vIGRvbid0IGxvZyBlbXB0eSByZWNvcmRzCisgICAgICAgICAgICBpZiAobUFuYWx5dGljc0l0ZW0tPmNvdW50KCkgPiAwKSB7CisgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNlbGZyZWNvcmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB2b2lkIGdhdGhlcihjb25zdCBBdWRpb1JlY29yZCAqcmVjb3JkKTsKKyAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICpkdXAoKSB7IHJldHVybiBtQW5hbHl0aWNzSXRlbS0+ZHVwKCk7IH0KKworICAgICAgICB2b2lkIGxvZ1N0YXJ0KG5zZWNzX3Qgd2hlbikgeyBtU3RhcnRlZE5zID0gd2hlbjsgbUNvdW50Kys7IH0KKyAgICAgICAgdm9pZCBsb2dTdG9wKG5zZWNzX3Qgd2hlbikgeyBtRHVyYXRpb25OcyArPSAod2hlbi1tU3RhcnRlZE5zKTsgbVN0YXJ0ZWROcyA9IDA7fQorICAgICAgICB2b2lkIG1hcmtFcnJvcihzdGF0dXNfdCBlcnJjb2RlLCBjb25zdCBjaGFyICpmdW5jKQorICAgICAgICAgICAgICAgICB7IG1MYXN0RXJyb3IgPSBlcnJjb2RlOyBtTGFzdEVycm9yRnVuYyA9IGZ1bmM7fQorICAgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQW5hbHl0aWNzSXRlbT4gbUFuYWx5dGljc0l0ZW07CisgICAgICAgIG5zZWNzX3QgbUNyZWF0ZWROczsgICAgIC8vIFhYWDogcGVyaGFwcyBub3Qgd29ydGggaXQgaW4gcHJvZHVjdGlvbgorICAgICAgICBuc2Vjc190IG1TdGFydGVkTnM7CisgICAgICAgIG5zZWNzX3QgbUR1cmF0aW9uTnM7CisgICAgICAgIGludDMyX3QgbUNvdW50OworCisgICAgICAgIHN0YXR1c190IG1MYXN0RXJyb3I7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1MYXN0RXJyb3JGdW5jOworICAgIH07CisgICAgTWVkaWFNZXRyaWNzIG1NZWRpYU1ldHJpY3M7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCmluZGV4IDVhODFkODMuLjBjNGQ2ZWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKQEAgLTIzLDExICsyMywxMyBAQAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvSW9EZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvRmxpbmdlckNsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9NaWNyb3Bob25lSW5mby5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMTA2LDYgKzEwOCw5IEBACiAKICAgICBzdGF0aWMgZmxvYXQgbGluZWFyVG9Mb2coaW50IHZvbHVtZSk7CiAgICAgc3RhdGljIGludCBsb2dUb0xpbmVhcihmbG9hdCB2b2x1bWUpOworICAgIHN0YXRpYyBzaXplX3QgY2FsY3VsYXRlTWluRnJhbWVDb3VudCgKKyAgICAgICAgICAgIHVpbnQzMl90IGFmTGF0ZW5jeU1zLCB1aW50MzJfdCBhZkZyYW1lQ291bnQsIHVpbnQzMl90IGFmU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGZsb2F0IHNwZWVkIC8qLCB1aW50MzJfdCBub3RpZmljYXRpb25zUGVyQnVmZmVyUmVxKi8pOwogCiAgICAgLy8gUmV0dXJuZWQgc2FtcGxpbmdSYXRlIGFuZCBmcmFtZUNvdW50IG91dHB1dCB2YWx1ZXMgYXJlIGd1YXJhbnRlZWQKICAgICAvLyB0byBiZSBub24temVybyBpZiBzdGF0dXMgPT0gTk9fRVJST1IKQEAgLTIwOSwxOCArMjE0LDExIEBACiAgICAgc3RhdGljIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpOwogICAgIHN0YXRpYyBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSk7CiAKLSAgICAvLyBDbGllbnQgbXVzdCBzdWNjZXNzZnVsbHkgaGFuZCBvZmYgdGhlIGhhbmRsZSByZWZlcmVuY2UgdG8gQXVkaW9GbGluZ2VyIHZpYSBjcmVhdGVUcmFjaygpLAotICAgIC8vIG9yIHJlbGVhc2UgaXQgd2l0aCByZWxlYXNlT3V0cHV0KCkuCi0gICAgc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLApAQCAtMjM2LDI0ICsyMzQsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwogCi0gICAgLy8gQ2xpZW50IG11c3Qgc3VjY2Vzc2Z1bGx5IGhhbmQgb2ZmIHRoZSBoYW5kbGUgcmVmZXJlbmNlIHRvIEF1ZGlvRmxpbmdlciB2aWEgb3BlblJlY29yZCgpLAorICAgIC8vIENsaWVudCBtdXN0IHN1Y2Nlc3NmdWxseSBoYW5kIG9mZiB0aGUgaGFuZGxlIHJlZmVyZW5jZSB0byBBdWRpb0ZsaW5nZXIgdmlhIGNyZWF0ZVJlY29yZCgpLAogICAgIC8vIG9yIHJlbGVhc2UgaXQgd2l0aCByZWxlYXNlSW5wdXQoKS4KICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCk7CiAKLSAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgc3RhdGljIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICBzdGF0aWMgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzaWxlbmNlZCk7CisgICAgc3RhdGljIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgc3RhdGljIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpOwpAQCAtMjg2LDcgKzI4Myw3IEBACiAgICAgc3RhdGljIHVpbnQzMl90IGdldFByaW1hcnlPdXRwdXRTYW1wbGluZ1JhdGUoKTsKICAgICBzdGF0aWMgc2l6ZV90IGdldFByaW1hcnlPdXRwdXRGcmFtZUNvdW50KCk7CiAKLSAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0TG93UmFtRGV2aWNlKGJvb2wgaXNMb3dSYW1EZXZpY2UpOworICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRMb3dSYW1EZXZpY2UoYm9vbCBpc0xvd1JhbURldmljZSwgaW50NjRfdCB0b3RhbE1lbW9yeSk7CiAKICAgICAvLyBDaGVjayBpZiBodyBvZmZsb2FkIGlzIHBvc3NpYmxlIGZvciBnaXZlbiBmb3JtYXQsIHN0cmVhbSB0eXBlLCBzYW1wbGUgcmF0ZSwKICAgICAvLyBiaXQgcmF0ZSwgZHVyYXRpb24sIHZpZGVvIGFuZCBzdHJlYW1pbmcgb3Igb2ZmbG9hZCBwcm9wZXJ0eSBpcyBlbmFibGVkCkBAIC0zNDEsNiArMzM4LDggQEAKICAgICBzdGF0aWMgZmxvYXQgICAgZ2V0U3RyZWFtVm9sdW1lREIoCiAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKIAorICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7CisKICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICAgICBjbGFzcyBBdWRpb1BvcnRDYWxsYmFjayA6IHB1YmxpYyBSZWZCYXNlCkBAIC00MzIsNiArNDMxLDcgQEAKIAogICAgICAgICBpbnQgYWRkQXVkaW9Qb3J0Q2FsbGJhY2soY29uc3Qgc3A8QXVkaW9Qb3J0Q2FsbGJhY2s+JiBjYWxsYmFjayk7CiAgICAgICAgIGludCByZW1vdmVBdWRpb1BvcnRDYWxsYmFjayhjb25zdCBzcDxBdWRpb1BvcnRDYWxsYmFjaz4mIGNhbGxiYWNrKTsKKyAgICAgICAgYm9vbCBpc0F1ZGlvUG9ydENiRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIChtQXVkaW9Qb3J0Q2FsbGJhY2tzLnNpemUoKSAhPSAwKTsgfQogCiAgICAgICAgIC8vIERlYXRoUmVjaXBpZW50CiAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOwpAQCAtNDUwLDYgKzQ1MCw3IEBACiAgICAgICAgIFZlY3RvciA8c3AgPEF1ZGlvUG9ydENhbGxiYWNrPiA+ICAgIG1BdWRpb1BvcnRDYWxsYmFja3M7CiAgICAgfTsKIAorICAgIHN0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwogICAgIHN0YXRpYyBjb25zdCBzcDxBdWRpb0ZsaW5nZXJDbGllbnQ+IGdldEF1ZGlvRmxpbmdlckNsaWVudCgpOwogICAgIHN0YXRpYyBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gZ2V0SW9EZXNjcmlwdG9yKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAppbmRleCA0N2Q4N2U5Li4zZWI2MjdkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVGltZXN0YW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgogI2luY2x1ZGUgPG1lZGlhL01vZHVsby5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIApAQCAtMjE4LDYgKzIxOSw4IEBACiAgICAgICogICAgICAgICAgICAgICAgICAgICBtYXhSZXF1aXJlZFNwZWVkIHBsYXliYWNrLiBWYWx1ZXMgbGVzcyB0aGFuIDEuMGYgYW5kIGdyZWF0ZXIgdGhhbgogICAgICAqICAgICAgICAgICAgICAgICAgICAgQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUFYIHdpbGwgYmUgY2xhbXBlZC4gIEZvciBub24tUENNIHRyYWNrcwogICAgICAqICAgICAgICAgICAgICAgICAgICAgYW5kIGRpcmVjdCBvciBvZmZsb2FkZWQgdHJhY2tzLCB0aGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkLgorICAgICAqIHNlbGVjdGVkRGV2aWNlSWQ6ICAgU2VsZWN0ZWQgZGV2aWNlIGlkIG9mIHRoZSBhcHAgd2hpY2ggaW5pdGlhbGx5IHJlcXVlc3RlZCB0aGUgQXVkaW9UcmFjaworICAgICAqICAgICAgICAgICAgICAgICAgICAgdG8gb3BlbiB3aXRoIGEgc3BlY2lmaWMgZGV2aWNlLgogICAgICAqIHRocmVhZENhbkNhbGxKYXZhOiAgTm90IHByZXNlbnQgaW4gcGFyYW1ldGVyIGxpc3QsIGFuZCBzbyBpcyBmaXhlZCBhdCBmYWxzZS4KICAgICAgKi8KIApAQCAtMjM3LDcgKzI0MCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQgPSAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4UmVxdWlyZWRTcGVlZCA9IDEuMGYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4UmVxdWlyZWRTcGVlZCA9IDEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKIAogICAgIC8qIENyZWF0ZXMgYW4gYXVkaW8gdHJhY2sgYW5kIHJlZ2lzdGVycyBpdCB3aXRoIEF1ZGlvRmxpbmdlci4KICAgICAgKiBXaXRoIHRoaXMgY29uc3RydWN0b3IsIHRoZSB0cmFjayBpcyBjb25maWd1cmVkIGZvciBzdGF0aWMgYnVmZmVyIG1vZGUuCkBAIC0zMTMsNyArMzE3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQgPSAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRvTm90UmVjb25uZWN0ID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4UmVxdWlyZWRTcGVlZCA9IDEuMGYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQgPSAxLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUpOwogCiAgICAgLyogUmVzdWx0IG9mIGNvbnN0cnVjdGluZyB0aGUgQXVkaW9UcmFjay4gVGhpcyBtdXN0IGJlIGNoZWNrZWQgZm9yIHN1Y2Nlc3NmdWwgaW5pdGlhbGl6YXRpb24KICAgICAgKiBiZWZvcmUgdXNpbmcgYW55IEF1ZGlvVHJhY2sgQVBJIChleGNlcHQgZm9yIHNldCgpKSwgYmVjYXVzZSB1c2luZwpAQCAtMzgxLDYgKzM4NiwxMSBAQAogICAgIC8qIFJldHVybiB0aGUgc3RhdGljIGJ1ZmZlciBzcGVjaWZpZWQgaW4gY29uc3RydWN0b3Igb3Igc2V0KCksIG9yIDAgZm9yIHN0cmVhbWluZyBtb2RlICovCiAgICAgICAgICAgICBzcDxJTWVtb3J5PiBzaGFyZWRCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtU2hhcmVkQnVmZmVyOyB9CiAKKyAgICAvKgorICAgICAqIHJldHVybiBtZXRyaWNzIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudCB0cmFjay4KKyAgICAgKi8KKyAgICAgICAgICAgIHN0YXR1c190IGdldE1ldHJpY3MoTWVkaWFBbmFseXRpY3NJdGVtICogJml0ZW0pOworCiAgICAgLyogQWZ0ZXIgaXQncyBjcmVhdGVkIHRoZSB0cmFjayBpcyBub3QgYWN0aXZlLiBDYWxsIHN0YXJ0KCkgdG8KICAgICAgKiBtYWtlIGl0IGFjdGl2ZS4gSWYgc2V0LCB0aGUgY2FsbGJhY2sgd2lsbCBzdGFydCBiZWluZyBjYWxsZWQuCiAgICAgICogSWYgdGhlIHRyYWNrIHdhcyBwcmV2aW91c2x5IHBhdXNlZCwgdm9sdW1lIGlzIHJhbXBlZCB1cCBvdmVyIHRoZSBmaXJzdCBtaXggYnVmZmVyLgpAQCAtNzQ4LDEyICs3NTgsMTUgQEAKICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CiAKICAgICAvKiBTZXRzIHRoZSB2b2x1bWUgc2hhcGVyIG9iamVjdCAqLwotICAgICAgICAgICAgVm9sdW1lU2hhcGVyOjpTdGF0dXMgYXBwbHlWb2x1bWVTaGFwZXIoCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKTsKKyAgICAgICAgICAgIG1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXR1cyBhcHBseVZvbHVtZVNoYXBlcigKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbik7CiAKICAgICAvKiBHZXRzIHRoZSB2b2x1bWUgc2hhcGVyIHN0YXRlICovCi0gICAgICAgICAgICBzcDxWb2x1bWVTaGFwZXI6OlN0YXRlPiBnZXRWb2x1bWVTaGFwZXJTdGF0ZShpbnQgaWQpOworICAgICAgICAgICAgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdGU+IGdldFZvbHVtZVNoYXBlclN0YXRlKGludCBpZCk7CisKKyAgICAvKiBTZWxlY3RzIHRoZSBwcmVzZW50YXRpb24gKGlmIGF2YWlsYWJsZSkgKi8KKyAgICAgICAgICAgIHN0YXR1c190ICAgIHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpOwogCiAgICAgLyogR2V0IHBhcmFtZXRlcnMgKi8KICAgICAgICAgICAgIFN0cmluZzggICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cyk7CkBAIC05OTAsNyArMTAwMyw3IEBACiAgICAgc3A8SUF1ZGlvVHJhY2s+ICAgICAgICAgbUF1ZGlvVHJhY2s7CiAgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbUNibGtNZW1vcnk7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiAgICAgbUNibGs7ICAgICAgICAgICAgICAgICAgLy8gcmUtbG9hZCBhZnRlciBtTG9jay51bmxvY2soKQotICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgIG1PdXRwdXQ7ICAgICAgICAgICAgICAgIC8vIHJldHVybmVkIGJ5IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXQoKQorICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgIG1PdXRwdXQ7ICAgICAgICAgICAgICAgIC8vIHJldHVybmVkIGJ5IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JBdHRyKCkKIAogICAgIHNwPEF1ZGlvVHJhY2tUaHJlYWQ+ICAgIG1BdWRpb1RyYWNrVGhyZWFkOwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1UaHJlYWRDYW5DYWxsSmF2YTsKQEAgLTExNjAsNyArMTE3Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF5IG5vdCBtYXRjaCB0aGUgYXBwIHNlbGVjdGlvbiBkZXBlbmRpbmcgb24gb3RoZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY3Rpdml0eSBhbmQgY29ubmVjdGVkIGRldmljZXMuCiAKLSAgICBzcDxWb2x1bWVIYW5kbGVyPiAgICAgICBtVm9sdW1lSGFuZGxlcjsKKyAgICBzcDxtZWRpYTo6Vm9sdW1lSGFuZGxlcj4gICAgICAgbVZvbHVtZUhhbmRsZXI7CiAKIHByaXZhdGU6CiAgICAgY2xhc3MgRGVhdGhOb3RpZmllciA6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7CkBAIC0xMTc4LDcgKzExOTEsMjUgQEAKICAgICBwaWRfdCAgICAgICAgICAgICAgICAgICBtQ2xpZW50UGlkOwogCiAgICAgd3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+IG1EZXZpY2VDYWxsYmFjazsKLSAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtUG9ydElkOyAgLy8gdW5pcXVlIElEIGFsbG9jYXRlZCBieSBhdWRpbyBwb2xpY3kKKworcHJpdmF0ZToKKyAgICBjbGFzcyBNZWRpYU1ldHJpY3MgeworICAgICAgcHVibGljOgorICAgICAgICBNZWRpYU1ldHJpY3MoKSA6IG1BbmFseXRpY3NJdGVtKG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oImF1ZGlvdHJhY2siKSkgeworICAgICAgICB9CisgICAgICAgIH5NZWRpYU1ldHJpY3MoKSB7CisgICAgICAgICAgICAvLyBtQW5hbHl0aWNzSXRlbSBhbGxvYyBmYWlsdXJlIHdpbGwgYmUgZmxhZ2dlZCBpbiB0aGUgY29uc3RydWN0b3IKKyAgICAgICAgICAgIC8vIGRvbid0IGxvZyBlbXB0eSByZWNvcmRzCisgICAgICAgICAgICBpZiAobUFuYWx5dGljc0l0ZW0tPmNvdW50KCkgPiAwKSB7CisgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNlbGZyZWNvcmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB2b2lkIGdhdGhlcihjb25zdCBBdWRpb1RyYWNrICp0cmFjayk7CisgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqZHVwKCkgeyByZXR1cm4gbUFuYWx5dGljc0l0ZW0tPmR1cCgpOyB9CisgICAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFBbmFseXRpY3NJdGVtPiBtQW5hbHl0aWNzSXRlbTsKKyAgICB9OworICAgIE1lZGlhTWV0cmljcyBtTWVkaWFNZXRyaWNzOwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKaW5kZXggMGFkNDIzMS4uZTZiZjcyZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKQEAgLTI0LDggKzI0LDEwIEBACiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9DbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9UcmFjay5oPgotI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1JlY29yZC5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+CkBAIC0zMyw2ICszNSwxMCBAQAogI2luY2x1ZGUgPG1lZGlhL0lFZmZlY3QuaD4KICNpbmNsdWRlIDxtZWRpYS9JRWZmZWN0Q2xpZW50Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPG1lZGlhL01pY3JvcGhvbmVJbmZvLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiYW5kcm9pZC9tZWRpYS9JQXVkaW9SZWNvcmQuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00Myw2ICs0OSwyNzEgQEAKIHB1YmxpYzoKICAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKEF1ZGlvRmxpbmdlcik7CiAKKyAgICAvKiBDcmVhdGVUcmFja0lucHV0IGNvbnRhaW5zIGFsbCBpbnB1dCBhcmd1bWVudHMgc2VudCBieSBBdWRpb1RyYWNrIHRvIEF1ZGlvRmxpbmdlcgorICAgICAqIHdoZW4gY2FsbGluZyBjcmVhdGVUcmFjaygpIGluY2x1ZGluZyBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHVwZGF0ZWQgYnkgQXVkaW9GbGluZ2VyCisgICAgICogYW5kIHJldHVybmVkIGluIENyZWF0ZVRyYWNrT3V0cHV0IG9iamVjdAorICAgICAqLworICAgIGNsYXNzIENyZWF0ZVRyYWNrSW5wdXQgOiBwdWJsaWMgUGFyY2VsYWJsZSB7CisgICAgcHVibGljOgorICAgICAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgLyogaW5wdXQgYXJndW1lbnRzKi8KKyAgICAgICAgICAgIG1lbXNldCgmYXR0ciwgMCwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICAgICAgaWYgKHBhcmNlbC0+cmVhZCgmYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXR0ci50YWdzW0FVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSAtMV0gPSAnXDAnOworICAgICAgICAgICAgbWVtc2V0KCZjb25maWcsIDAsIHNpemVvZihhdWRpb19jb25maWdfdCkpOworICAgICAgICAgICAgaWYgKHBhcmNlbC0+cmVhZCgmY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX3QpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjbGllbnRJbmZvLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGFyY2VsLT5yZWFkSW50MzIoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgc2hhcmVkQnVmZmVyID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4ocGFyY2VsLT5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgICAgIGlmIChzaGFyZWRCdWZmZXIgPT0gMCB8fCBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbm90aWZpY2F0aW9uc1BlckJ1ZmZlciA9IHBhcmNlbC0+cmVhZEludDMyKCk7CisgICAgICAgICAgICBzcGVlZCA9IHBhcmNlbC0+cmVhZEZsb2F0KCk7CisKKyAgICAgICAgICAgIC8qIGlucHV0L291dHB1dCBhcmd1bWVudHMqLworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkKCZmbGFncywgc2l6ZW9mKGF1ZGlvX291dHB1dF9mbGFnc190KSk7CisgICAgICAgICAgICBmcmFtZUNvdW50ID0gcGFyY2VsLT5yZWFkSW50NjQoKTsKKyAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lQ291bnQgPSBwYXJjZWwtPnJlYWRJbnQ2NCgpOworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkKCZzZWxlY3RlZERldmljZUlkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkKCZzZXNzaW9uSWQsIHNpemVvZihhdWRpb19zZXNzaW9uX3QpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgIC8qIGlucHV0IGFyZ3VtZW50cyovCisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfdCkpOworICAgICAgICAgICAgKHZvaWQpY2xpZW50SW5mby53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgICAgICAgICAgICBpZiAoc2hhcmVkQnVmZmVyICE9IDApIHsKKyAgICAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50MzIoMSk7CisgICAgICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihzaGFyZWRCdWZmZXIpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDMyKDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDMyKG5vdGlmaWNhdGlvbnNQZXJCdWZmZXIpOworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUZsb2F0KHNwZWVkKTsKKworICAgICAgICAgICAgLyogaW5wdXQvb3V0cHV0IGFyZ3VtZW50cyovCisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZmbGFncywgc2l6ZW9mKGF1ZGlvX291dHB1dF9mbGFnc190KSk7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50NjQoZnJhbWVDb3VudCk7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50NjQobm90aWZpY2F0aW9uRnJhbWVDb3VudCk7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZzZWxlY3RlZERldmljZUlkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmc2Vzc2lvbklkLCBzaXplb2YoYXVkaW9fc2Vzc2lvbl90KSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAvKiBpbnB1dCAqLworICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cjsKKyAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnOworICAgICAgICBBdWRpb0NsaWVudCBjbGllbnRJbmZvOworICAgICAgICBzcDxJTWVtb3J5PiBzaGFyZWRCdWZmZXI7CisgICAgICAgIHVpbnQzMl90IG5vdGlmaWNhdGlvbnNQZXJCdWZmZXI7CisgICAgICAgIGZsb2F0IHNwZWVkOworCisgICAgICAgIC8qIGlucHV0L291dHB1dCAqLworICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFnczsKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQ7CisgICAgICAgIHNpemVfdCBub3RpZmljYXRpb25GcmFtZUNvdW50OworICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQ7CisgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQ7CisgICAgfTsKKworICAgIC8qIENyZWF0ZVRyYWNrT3V0cHV0IGNvbnRhaW5zIGFsbCBvdXRwdXQgYXJndW1lbnRzIHJldHVybmVkIGJ5IEF1ZGlvRmxpbmdlciB0byBBdWRpb1RyYWNrCisgICAgICogd2hlbiBjYWxsaW5nIGNyZWF0ZVRyYWNrKCkgaW5jbHVkaW5nIGFyZ3VtZW50cyB0aGF0IHdlcmUgcGFzc2VkIGFzIEkvTyBmb3IgdXBkYXRlIGJ5CisgICAgICogQ3JlYXRlVHJhY2tJbnB1dC4KKyAgICAgKi8KKyAgICBjbGFzcyBDcmVhdGVUcmFja091dHB1dCA6IHB1YmxpYyBQYXJjZWxhYmxlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKSBvdmVycmlkZSB7CisgICAgICAgICAgICAvKiBpbnB1dC9vdXRwdXQgYXJndW1lbnRzKi8KKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+cmVhZCgmZmxhZ3MsIHNpemVvZihhdWRpb19vdXRwdXRfZmxhZ3NfdCkpOworICAgICAgICAgICAgZnJhbWVDb3VudCA9IHBhcmNlbC0+cmVhZEludDY0KCk7CisgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZUNvdW50ID0gcGFyY2VsLT5yZWFkSW50NjQoKTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+cmVhZCgmc2VsZWN0ZWREZXZpY2VJZCwgc2l6ZW9mKGF1ZGlvX3BvcnRfaGFuZGxlX3QpKTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+cmVhZCgmc2Vzc2lvbklkLCBzaXplb2YoYXVkaW9fc2Vzc2lvbl90KSk7CisKKyAgICAgICAgICAgIC8qIG91dHB1dCBhcmd1bWVudHMqLworICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IHBhcmNlbC0+cmVhZFVpbnQzMigpOworICAgICAgICAgICAgYWZGcmFtZUNvdW50ID0gcGFyY2VsLT5yZWFkSW50NjQoKTsKKyAgICAgICAgICAgIGFmU2FtcGxlUmF0ZSA9IHBhcmNlbC0+cmVhZEludDY0KCk7CisgICAgICAgICAgICBhZkxhdGVuY3lNcyA9IHBhcmNlbC0+cmVhZEludDMyKCk7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJm91dHB1dElkLCBzaXplb2YoYXVkaW9faW9faGFuZGxlX3QpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgIC8qIGlucHV0L291dHB1dCBhcmd1bWVudHMqLworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmZmxhZ3MsIHNpemVvZihhdWRpb19vdXRwdXRfZmxhZ3NfdCkpOworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDY0KGZyYW1lQ291bnQpOworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDY0KG5vdGlmaWNhdGlvbkZyYW1lQ291bnQpOworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmc2VsZWN0ZWREZXZpY2VJZCwgc2l6ZW9mKGF1ZGlvX3BvcnRfaGFuZGxlX3QpKTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJnNlc3Npb25JZCwgc2l6ZW9mKGF1ZGlvX3Nlc3Npb25fdCkpOworCisgICAgICAgICAgICAvKiBvdXRwdXQgYXJndW1lbnRzKi8KKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVVaW50MzIoc2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50NjQoYWZGcmFtZUNvdW50KTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQ2NChhZlNhbXBsZVJhdGUpOworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDMyKGFmTGF0ZW5jeU1zKTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJm91dHB1dElkLCBzaXplb2YoYXVkaW9faW9faGFuZGxlX3QpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGlucHV0L291dHB1dCAqLworICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFnczsKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQ7CisgICAgICAgIHNpemVfdCBub3RpZmljYXRpb25GcmFtZUNvdW50OworICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQ7CisgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQ7CisKKyAgICAgICAgLyogb3V0cHV0ICovCisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGU7CisgICAgICAgIHNpemVfdCAgIGFmRnJhbWVDb3VudDsKKyAgICAgICAgdWludDMyX3QgYWZTYW1wbGVSYXRlOworICAgICAgICB1aW50MzJfdCBhZkxhdGVuY3lNczsKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0SWQ7CisgICAgfTsKKworICAgIC8qIENyZWF0ZVJlY29yZElucHV0IGNvbnRhaW5zIGFsbCBpbnB1dCBhcmd1bWVudHMgc2VudCBieSBBdWRpb1JlY29yZCB0byBBdWRpb0ZsaW5nZXIKKyAgICAgKiB3aGVuIGNhbGxpbmcgY3JlYXRlUmVjb3JkKCkgaW5jbHVkaW5nIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgdXBkYXRlZCBieSBBdWRpb0ZsaW5nZXIKKyAgICAgKiBhbmQgcmV0dXJuZWQgaW4gQ3JlYXRlUmVjb3JkT3V0cHV0IG9iamVjdAorICAgICAqLworICAgIGNsYXNzIENyZWF0ZVJlY29yZElucHV0IDogcHVibGljIFBhcmNlbGFibGUgeworICAgIHB1YmxpYzoKKyAgICAgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIC8qIGlucHV0IGFyZ3VtZW50cyovCisgICAgICAgICAgICBtZW1zZXQoJmF0dHIsIDAsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgICAgIGlmIChwYXJjZWwtPnJlYWQoJmF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF0dHIudGFnc1tBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLTFdID0gJ1wwJzsKKyAgICAgICAgICAgIG1lbXNldCgmY29uZmlnLCAwLCBzaXplb2YoYXVkaW9fY29uZmlnX2Jhc2VfdCkpOworICAgICAgICAgICAgaWYgKHBhcmNlbC0+cmVhZCgmY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX2Jhc2VfdCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNsaWVudEluZm8ucmVhZEZyb21QYXJjZWwocGFyY2VsKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wUGFja2FnZU5hbWUgPSBwYXJjZWwtPnJlYWRTdHJpbmcxNigpOworCisgICAgICAgICAgICAvKiBpbnB1dC9vdXRwdXQgYXJndW1lbnRzKi8KKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+cmVhZCgmZmxhZ3MsIHNpemVvZihhdWRpb19pbnB1dF9mbGFnc190KSk7CisgICAgICAgICAgICBmcmFtZUNvdW50ID0gcGFyY2VsLT5yZWFkSW50NjQoKTsKKyAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lQ291bnQgPSBwYXJjZWwtPnJlYWRJbnQ2NCgpOworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkKCZzZWxlY3RlZERldmljZUlkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkKCZzZXNzaW9uSWQsIHNpemVvZihhdWRpb19zZXNzaW9uX3QpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgIC8qIGlucHV0IGFyZ3VtZW50cyovCisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfYmFzZV90KSk7CisgICAgICAgICAgICAodm9pZCljbGllbnRJbmZvLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVTdHJpbmcxNihvcFBhY2thZ2VOYW1lKTsKKworICAgICAgICAgICAgLyogaW5wdXQvb3V0cHV0IGFyZ3VtZW50cyovCisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZmbGFncywgc2l6ZW9mKGF1ZGlvX2lucHV0X2ZsYWdzX3QpKTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQ2NChmcmFtZUNvdW50KTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQ2NChub3RpZmljYXRpb25GcmFtZUNvdW50KTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJnNlbGVjdGVkRGV2aWNlSWQsIHNpemVvZihhdWRpb19wb3J0X2hhbmRsZV90KSk7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZzZXNzaW9uSWQsIHNpemVvZihhdWRpb19zZXNzaW9uX3QpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGlucHV0ICovCisgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyOworICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZzsKKyAgICAgICAgQXVkaW9DbGllbnQgY2xpZW50SW5mbzsKKyAgICAgICAgU3RyaW5nMTYgb3BQYWNrYWdlTmFtZTsKKworICAgICAgICAvKiBpbnB1dC9vdXRwdXQgKi8KKyAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFnczsKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQ7CisgICAgICAgIHNpemVfdCBub3RpZmljYXRpb25GcmFtZUNvdW50OworICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQ7CisgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQ7CisgICAgfTsKKworICAgIC8qIENyZWF0ZVJlY29yZE91dHB1dCBjb250YWlucyBhbGwgb3V0cHV0IGFyZ3VtZW50cyByZXR1cm5lZCBieSBBdWRpb0ZsaW5nZXIgdG8gQXVkaW9SZWNvcmQKKyAgICAgKiB3aGVuIGNhbGxpbmcgY3JlYXRlUmVjb3JkKCkgaW5jbHVkaW5nIGFyZ3VtZW50cyB0aGF0IHdlcmUgcGFzc2VkIGFzIEkvTyBmb3IgdXBkYXRlIGJ5CisgICAgICogQ3JlYXRlUmVjb3JkSW5wdXQuCisgICAgICovCisgICAgY2xhc3MgQ3JlYXRlUmVjb3JkT3V0cHV0IDogcHVibGljIFBhcmNlbGFibGUgeworICAgIHB1YmxpYzoKKyAgICAgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIC8qIGlucHV0L291dHB1dCBhcmd1bWVudHMqLworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkKCZmbGFncywgc2l6ZW9mKGF1ZGlvX2lucHV0X2ZsYWdzX3QpKTsKKyAgICAgICAgICAgIGZyYW1lQ291bnQgPSBwYXJjZWwtPnJlYWRJbnQ2NCgpOworICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVDb3VudCA9IHBhcmNlbC0+cmVhZEludDY0KCk7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJnNlbGVjdGVkRGV2aWNlSWQsIHNpemVvZihhdWRpb19wb3J0X2hhbmRsZV90KSk7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJnNlc3Npb25JZCwgc2l6ZW9mKGF1ZGlvX3Nlc3Npb25fdCkpOworCisgICAgICAgICAgICAvKiBvdXRwdXQgYXJndW1lbnRzKi8KKyAgICAgICAgICAgIHNhbXBsZVJhdGUgPSBwYXJjZWwtPnJlYWRVaW50MzIoKTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+cmVhZCgmaW5wdXRJZCwgc2l6ZW9mKGF1ZGlvX2lvX2hhbmRsZV90KSk7CisgICAgICAgICAgICBpZiAocGFyY2VsLT5yZWFkSW50MzIoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgY2JsayA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHBhcmNlbC0+cmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgICAgICBpZiAoY2JsayA9PSAwIHx8IGNibGstPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcmNlbC0+cmVhZEludDMyKCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGJ1ZmZlcnMgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihwYXJjZWwtPnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcnMgPT0gMCB8fCBidWZmZXJzLT5wb2ludGVyKCkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgIC8qIGlucHV0L291dHB1dCBhcmd1bWVudHMqLworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmZmxhZ3MsIHNpemVvZihhdWRpb19pbnB1dF9mbGFnc190KSk7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50NjQoZnJhbWVDb3VudCk7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50NjQobm90aWZpY2F0aW9uRnJhbWVDb3VudCk7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZzZWxlY3RlZERldmljZUlkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmc2Vzc2lvbklkLCBzaXplb2YoYXVkaW9fc2Vzc2lvbl90KSk7CisKKyAgICAgICAgICAgIC8qIG91dHB1dCBhcmd1bWVudHMqLworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZVVpbnQzMihzYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJmlucHV0SWQsIHNpemVvZihhdWRpb19pb19oYW5kbGVfdCkpOworICAgICAgICAgICAgaWYgKGNibGsgIT0gMCkgeworICAgICAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQzMigxKTsKKyAgICAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGNibGspKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDMyKDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJ1ZmZlcnMgIT0gMCkgeworICAgICAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQzMigxKTsKKyAgICAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGJ1ZmZlcnMpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDMyKDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAvKiBpbnB1dC9vdXRwdXQgKi8KKyAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFnczsKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQ7CisgICAgICAgIHNpemVfdCBub3RpZmljYXRpb25GcmFtZUNvdW50OworICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQ7CisgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQ7CisKKyAgICAgICAgLyogb3V0cHV0ICovCisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGU7CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0SWQ7CisgICAgICAgIHNwPElNZW1vcnk+IGNibGs7CisgICAgICAgIHNwPElNZW1vcnk+IGJ1ZmZlcnM7CisgICAgfTsKIAogICAgIC8vIGludmFyaWFudCBvbiBleGl0IGZvciBhbGwgQVBJcyB0aGF0IHJldHVybiBhbiBzcDw+OgogICAgIC8vICAgKHJldHVybiB2YWx1ZSAhPSAwKSA9PSAoKnN0YXR1cyA9PSBOT19FUlJPUikKQEAgLTUwLDQ1ICszMjEsMTMgQEAKICAgICAvKiBjcmVhdGUgYW4gYXVkaW8gdHJhY2sgYW5kIHJlZ2lzdGVycyBpdCB3aXRoIEF1ZGlvRmxpbmdlci4KICAgICAgKiByZXR1cm4gbnVsbCBpZiB0aGUgdHJhY2sgY2Fubm90IGJlIGNyZWF0ZWQuCiAgICAgICovCi0gICAgdmlydHVhbCBzcDxJQXVkaW9UcmFjaz4gY3JlYXRlVHJhY2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwRnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbiBzdWNjZXNzZnVsIHJldHVybiwgQXVkaW9GbGluZ2VyIHRha2VzIG92ZXIgdGhlIGhhbmRsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWZlcmVuY2UgYW5kIHdpbGwgcmVsZWFzZSBpdCB3aGVuIHRoZSB0cmFjayBpcyBkZXN0cm95ZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIgb24gZmFpbHVyZSwgdGhlIGNsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgcmVsZWFzZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHRpZCwgIC8vIC0xIG1lYW5zIHVudXNlZCwgb3RoZXJ3aXNlIG11c3QgYmUgdmFsaWQgbm9uLTAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90ICpzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CisgICAgdmlydHVhbCBzcDxJQXVkaW9UcmFjaz4gY3JlYXRlVHJhY2soY29uc3QgQ3JlYXRlVHJhY2tJbnB1dCYgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlVHJhY2tPdXRwdXQmIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHNwPElBdWRpb1JlY29yZD4gb3BlblJlY29yZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT24gc3VjY2Vzc2Z1bCByZXR1cm4sIEF1ZGlvRmxpbmdlciB0YWtlcyBvdmVyIHRoZSBoYW5kbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIGFuZCB3aWxsIHJlbGVhc2UgaXQgd2hlbiB0aGUgdHJhY2sgaXMgZGVzdHJveWVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIb3dldmVyIG9uIGZhaWx1cmUsIHRoZSBjbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIHJlbGVhc2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2FsbGluZ1BhY2thZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcEZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgKmZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHRpZCwgIC8vIC0xIG1lYW5zIHVudXNlZCwgb3RoZXJ3aXNlIG11c3QgYmUgdmFsaWQgbm9uLTAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90ICpzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqbm90aWZpY2F0aW9uRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJTWVtb3J5PiYgY2JsaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4mIGJ1ZmZlcnMsICAgLy8gcmV0dXJuIHZhbHVlIDAgbWVhbnMgaXQgZm9sbG93cyBjYmxrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CisgICAgdmlydHVhbCBzcDxtZWRpYTo6SUF1ZGlvUmVjb3JkPiBjcmVhdGVSZWNvcmQoY29uc3QgQ3JlYXRlUmVjb3JkSW5wdXQmIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVJlY29yZE91dHB1dCYgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpID0gMDsKIAogICAgIC8vIEZJWE1FIFN1cnByaXNpbmdseSwgZm9ybWF0L2xhdGVuY3kgZG9uJ3Qgd29yayBmb3IgaW5wdXQgaGFuZGxlcwogCkBAIC0xMzEsNiArMzcwLDcgQEAKICAgICAvLyBtaWMgbXV0ZS9zdGF0ZQogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHNldE1pY011dGUoYm9vbCBzdGF0ZSkgPSAwOwogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGdldE1pY011dGUoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgc2V0UmVjb3JkU2lsZW5jZWQodWlkX3QgdWlkLCBib29sIHNpbGVuY2VkKSA9IDA7CiAKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykgPSAwOwpAQCAtMjE2LDggKzQ1Niw5IEBACiAKICAgICAvLyBJbnRlbmRlZCBmb3IgQXVkaW9TZXJ2aWNlIHRvIGluZm9ybSBBdWRpb0ZsaW5nZXIgb2YgZGV2aWNlJ3MgbG93IFJBTSBhdHRyaWJ1dGUsCiAgICAgLy8gYW5kIHNob3VsZCBiZSBjYWxsZWQgYXQgbW9zdCBvbmNlLiAgRm9yIGEgZGVmaW5pdGlvbiBvZiB3aGF0ICJsb3cgUkFNIiBtZWFucywgc2VlCi0gICAgLy8gYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyLmlzTG93UmFtRGV2aWNlKCkuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMb3dSYW1EZXZpY2UoYm9vbCBpc0xvd1JhbURldmljZSkgPSAwOworICAgIC8vIGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlci5pc0xvd1JhbURldmljZSgpLiAgVGhlIHRvdGFsTWVtb3J5IHBhcmFtZXRlcgorICAgIC8vIGlzIG9idGFpbmVkIGZyb20gYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyLk1lbW9yeUluZm8udG90YWxNZW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMb3dSYW1EZXZpY2UoYm9vbCBpc0xvd1JhbURldmljZSwgaW50NjRfdCB0b3RhbE1lbW9yeSkgPSAwOwogCiAgICAgLyogTGlzdCBhdmFpbGFibGUgYXVkaW8gcG9ydHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLApAQCAtMjQ3LDYgKzQ4OCw5IEBACiAKICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZnJhbWVzIHBlciBhdWRpbyBIQUwgYnVmZmVyLgogICAgIHZpcnR1YWwgc2l6ZV90IGZyYW1lQ291bnRIQUwoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0ID0gMDsKKworICAgIC8qIExpc3QgYXZhaWxhYmxlIG1pY3JvcGhvbmVzIGFuZCB0aGVpciBjaGFyYWN0ZXJpc3RpY3MgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKSA9IDA7CiB9OwogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKaW5kZXggZWVjM2U4OC4uMTExNGVlYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKQEAgLTU1LDE2ICs1NSwxMiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpID0gMDsKICAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKSA9IDA7Ci0gICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwpID0gMDsKKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKQEAgLTg0LDE2ICs4MCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzaWxlbmNlZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUmVjb3JkLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1JlY29yZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzY4MTc2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUmVjb3JkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBJQVVESU9SRUNPUkRfSF8KLSNkZWZpbmUgSUFVRElPUkVDT1JEX0hfCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBJQXVkaW9SZWNvcmQgOiBwdWJsaWMgSUludGVyZmFjZQotewotcHVibGljOgotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoQXVkaW9SZWNvcmQpOwotCi0gICAgLyogQWZ0ZXIgaXQncyBjcmVhdGVkIHRoZSB0cmFjayBpcyBub3QgYWN0aXZlLiBDYWxsIHN0YXJ0KCkgdG8KLSAgICAgKiBtYWtlIGl0IGFjdGl2ZS4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN0YXJ0KGludCAvKkF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QqLyBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbikgPSAwOwotCi0gICAgLyogU3RvcCBhIHRyYWNrLiBJZiBzZXQsIHRoZSBjYWxsYmFjayB3aWxsIGNlYXNlIGJlaW5nIGNhbGxlZCBhbmQKLSAgICAgKiBvYnRhaW5CdWZmZXIgd2lsbCByZXR1cm4gYW4gZXJyb3IuIEJ1ZmZlcnMgdGhhdCBhcmUgYWxyZWFkeSByZWxlYXNlZAotICAgICAqIHdpbGwgYmUgcHJvY2Vzc2VkLCB1bmxlc3MgZmx1c2goKSBpcyBjYWxsZWQuCi0gICAgICovCi0gICAgdmlydHVhbCB2b2lkICAgICAgICBzdG9wKCkgPSAwOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBCbkF1ZGlvUmVjb3JkIDogcHVibGljIEJuSW50ZXJmYWNlPElBdWRpb1JlY29yZD4KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8qSUFVRElPUkVDT1JEX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaAppbmRleCAyN2E2MmQ2Li45NGFmZTNjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1RyYWNrLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oCkBAIC03NywxMiArNzcsMTIgQEAKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHNpZ25hbCgpID0gMDsKIAogICAgIC8qIFNldHMgdGhlIHZvbHVtZSBzaGFwZXIgKi8KLSAgICB2aXJ0dWFsIFZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAotICAgICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKSA9IDA7CisgICAgdmlydHVhbCBtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0dXMgYXBwbHlWb2x1bWVTaGFwZXIoCisgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbikgPSAwOwogCiAgICAgLyogZ2V0cyB0aGUgdm9sdW1lIHNoYXBlciBzdGF0ZSAqLwotICAgIHZpcnR1YWwgc3A8Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gZ2V0Vm9sdW1lU2hhcGVyU3RhdGUoaW50IGlkKSA9IDA7CisgICAgdmlydHVhbCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gZ2V0Vm9sdW1lU2hhcGVyU3RhdGUoaW50IGlkKSA9IDA7CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL1BsYXllckJhc2UuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvUGxheWVyQmFzZS5oCmluZGV4IGU2MzA5MGIuLmU3YThhYmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvUGxheWVyQmFzZS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvUGxheWVyQmFzZS5oCkBAIC0xNywzNSArMTcsMzEgQEAKICNpZm5kZWYgX19BTkRST0lEX1BMQVlFUl9CQVNFX0hfXwogI2RlZmluZSBfX0FORFJPSURfUExBWUVSX0JBU0VfSF9fCiAKLSNpbmNsdWRlIDxhdWRpb21hbmFnZXIvSVBsYXllci5oPgogI2luY2x1ZGUgPGF1ZGlvbWFuYWdlci9BdWRpb01hbmFnZXIuaD4KICNpbmNsdWRlIDxhdWRpb21hbmFnZXIvSUF1ZGlvTWFuYWdlci5oPgogCisjaW5jbHVkZSAiYW5kcm9pZC9tZWRpYS9CblBsYXllci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIFBsYXllckJhc2UgOiBwdWJsaWMgQm5QbGF5ZXIKK2NsYXNzIFBsYXllckJhc2UgOiBwdWJsaWMgOjphbmRyb2lkOjptZWRpYTo6Qm5QbGF5ZXIKIHsKIHB1YmxpYzoKICAgICBleHBsaWNpdCBQbGF5ZXJCYXNlKCk7Ci0gICAgdmlydHVhbCB+UGxheWVyQmFzZSgpOworICAgIHZpcnR1YWwgflBsYXllckJhc2UoKSBvdmVycmlkZTsKIAogICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95KCkgPSAwOwogCiAgICAgLy9JUGxheWVyIGltcGxlbWVudGF0aW9uCi0gICAgdmlydHVhbCB2b2lkIHN0YXJ0KCk7Ci0gICAgdmlydHVhbCB2b2lkIHBhdXNlKCk7Ci0gICAgdmlydHVhbCB2b2lkIHN0b3AoKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0Vm9sdW1lKGZsb2F0IHZvbCk7Ci0gICAgdmlydHVhbCB2b2lkIHNldFBhbihmbG9hdCBwYW4pOwotICAgIHZpcnR1YWwgdm9pZCBzZXRTdGFydERlbGF5TXMoaW50MzJfdCBkZWxheU1zKTsKLSAgICB2aXJ0dWFsIHZvaWQgYXBwbHlWb2x1bWVTaGFwZXIoCi0gICAgICAgICAgICBjb25zdCBzcDxWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAotICAgICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KAotICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpOwotCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBzdGFydCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgcGF1c2UoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIHN0b3AoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIHNldFZvbHVtZShmbG9hdCB2b2wpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgc2V0UGFuKGZsb2F0IHBhbikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBzZXRTdGFydERlbGF5TXMoaW50MzJfdCBkZWxheU1zKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAorICAgICAgICAgICAgY29uc3QgbWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbiYgb3BlcmF0aW9uKSBvdmVycmlkZTsKIAogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhcnRXaXRoU3RhdHVzKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCBwYXVzZVdpdGhTdGF0dXMoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvVG9uZUdlbmVyYXRvci5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9Ub25lR2VuZXJhdG9yLmgKaW5kZXggZmMzZDNlZS4uMjQ3NzAzZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9Ub25lR2VuZXJhdG9yLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9Ub25lR2VuZXJhdG9yLmgKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCiAKICAgICAvLyBSZWdpb24gc3BlY2lmaWMgdG9uZXMuCi0gICAgLy8gVGhlc2Ugc3VwZXJ2aXNvcnkgdG9uZXMgYXJlIGRpZmZlcmVudCBkZXBlbmRpbmcgb24gdGhlIHJlZ2lvbiAoVVNBL0NBTkFEQSwgSkFQQU4sIHJlc3Qgb2YgdGhlIHdvcmxkKS4KKyAgICAvLyBUaGVzZSBzdXBlcnZpc29yeSB0b25lcyBhcmUgZGlmZmVyZW50IGRlcGVuZGluZyBvbiB0aGUgcmVnaW9uIChVU0EvQ0FOQURBLCBKQVBBTiwgU2luZ2Fwb3JlLCBIb25nIEtvbmcsIHJlc3Qgb2YgdGhlIHdvcmxkKS4KICAgICAvLyBXaGVuIGEgdG9uZSBpbiB0aGUgcmFuZ2UgW0ZJUlNUX1NVUF9UT05FLCBMQVNUX1NVUF9UT05FXSBpcyByZXF1ZXN0ZWQsIHRoZSByZWdpb24gaXMgZGV0ZXJtaW5lZAogICAgIC8vIGZyb20gc3lzdGVtIHByb3BlcnR5IGdzbS5vcGVyYXRvci5pc28tY291bnRyeSBhbmQgdGhlIHByb3BlciB0b25lIGRlc2NyaXB0b3IgaXMgc2VsZWN0ZWQgd2l0aCB0aGUKICAgICAvLyBoZWxwIG9mIHNUb25lTWFwcGluZ1RhYmxlW10KQEAgLTE5NCwxMiArMTk0LDI0IEBACiAgICAgICAgIFRPTkVfSkFQQU5fQlVTWSwgICAgICAgICAgICAvLyBCdXN5IHRvbmU6IDQwMEh6LCA1MDBtcyBPTiwgNTAwbXMgT0ZGLi4uCiAgICAgICAgIFRPTkVfSkFQQU5fUkFESU9fQUNLLCAgICAgICAvLyBSYWRpbyBwYXRoIGFja25vd2xlZ21lbnQ6IDQwMEh6LCAxcyBPTiwgMnMgT0ZGLi4uCiAgICAgICAgIC8vIEdCIFN1cGVydmlzb3J5IHRvbmVzCisgICAgICAgIFRPTkVfR0JfQlVTWSwgICAgICAgICAgICAgICAvLyBCdXN5IHRvbmU6IDQwMCBIeiwgMzc1bXMgT04sIDM3NW1zIE9GRi4uLgorICAgICAgICBUT05FX0dCX0NPTkdFU1RJT04sICAgICAgICAgLy8gQ29uZ2VzdGlvbiBUb25lOiA0MDAgSHosIDQwMG1zIE9OLCAzNTBtcyBPRkYsIDIyNW1zIE9OLCA1MjVtcyBPRkYuLi4KICAgICAgICAgVE9ORV9HQl9SSU5HVE9ORSwgICAgICAgICAgIC8vIFJpbmcgVG9uZTogQSA0MDBIeiArIDQ1MEh6IHRvbmUgcmVwZWF0ZWQgaW4gYSAwLjRzIG9uLCAwLjJzIG9mZiwgMC40cyBvbiwgMi4wcyBvZmYgcGF0dGVybi4KICAgICAgICAgLy8gQVVTVFJBTElBIFN1cGVydmlzb3J5IHRvbmVzCisgICAgICAgIFRPTkVfQVVTVFJBTElBX0RJQUwsICAgICAgICAvLyBEaWFsIHRvbmU6IDQyNSBIeiB0b25lIG1vZHVsYXRlZCB3aXRoIDI1IEh6LCBjb250aW51b3VzCiAgICAgICAgIFRPTkVfQVVTVFJBTElBX1JJTkdUT05FLCAgICAvLyBSaW5nIHRvbmU6IEEgNDAwSHogKyA0NTBIeiB0b25lIHJlcGVhdGVkIGluIGEgMC40cyBvbiwgMC4ycyBvZmYsIDAuNHMgb24sIDIuMHMgb2ZmIHBhdHRlcm4uCiAgICAgICAgIFRPTkVfQVVTVFJBTElBX0JVU1ksICAgICAgICAvLyBCdXN5IHRvbmU6IDQyNSBIeiByZXBlYXRlZCBpbiBhIDAuMzc1cyBvbiwgMC4zNzVzIG9mZiBwYXR0ZXJuLgogICAgICAgICBUT05FX0FVU1RSQUxJQV9DQUxMX1dBSVRJTkcsLy8gQ2FsbCB3YWl0aW5nIHRvbmU6IDQyNUh6IHRvbmUgcmVwZWF0ZWQgaW4gYSAwLjJzIG9uLCAwLjJzIG9mZiwgMC4ycyBvbiwgNC40cyBvZmYgcGF0dGVybi4KICAgICAgICAgVE9ORV9BVVNUUkFMSUFfQ09OR0VTVElPTiwgIC8vIENvbmdlc3Rpb24gdG9uZTogNDI1SHogdG9uZSByZXBlYXRlZCBpbiBhIDAuMzc1cyBvbiwgMC4zNzVzIG9mZiBwYXR0ZXJuCisgICAgICAgIC8vIFNJTkdBUE9SRSBTdXBlcnZpc29yeSB0b25lcworICAgICAgICBUT05FX1NHX0JVU1ksICAgICAgICAgICAgICAgLy8gQnVzeSB0b25lOiA0MjUgSHosIDc1MG1zIE9OLCA3NTBtcyBPRkYuLi4KKyAgICAgICAgVE9ORV9TR19SSU5HVE9ORSwgICAgICAgICAgIC8vIFJpbmcgVG9uZTogNDI1IEh6IHRvbmUgbW9kdWxhdGVkIHdpdGggMjQgSHosIDQwMG1zIE9OLCAyMDBtcyBPRkYsIDQwMG1zIE9OLCAycyBPRkYuLi4KKyAgICAgICAgLy8gSE9ORyBLT05HIFN1cGVydmlzb3J5IHRvbmVzCisgICAgICAgIFRPTkVfSEtfQlVTWSwgICAgICAgICAgICAgICAvLyBCdXN5IHRvbmU6IDQ4MCBIeiArIDYyMCBIeiwgNTAwbXMgT04sIDUwMG1zIE9GRi4uLgorICAgICAgICBUT05FX0hLX1JJTkdUT05FLCAgICAgICAgICAgLy8gUmluZyBUb25lOiA0NDAgSHogKyA0ODAgSHogcmVwZWF0ZWQgd2l0aCBwYXR0ZXJuIDAsNHMgb24sIDAsMnMgb2ZmLCAwLDRzIG9uIGFuZCAzcyBvZmYuCisgICAgICAgIC8vIElSRUxBTkQgU3VwZXJ2aXNvcnkgdG9uZXMKKyAgICAgICAgVE9ORV9JRV9SSU5HVE9ORSwgICAgICAgICAgIC8vIFJpbmcgVG9uZTogQSA0MDBIeiArIDQ1MEh6IHRvbmUgcmVwZWF0ZWQgaW4gYSAwLjRzIG9uLCAwLjJzIG9mZiwgMC40cyBvbiwgMi4wcyBvZmYgcGF0dGVybi4KKyAgICAgICAgVE9ORV9JRV9DQUxMX1dBSVRJTkcsICAgICAgIC8vIENhbGwgd2FpdGluZyB0b25lOiA0MjVIeiB0b25lIHJlcGVhdGVkIGluIGEgMC4xOHMgb24sIDAuMnMgb2ZmLCAwLjJzIG9uLCA0LjVzIG9mZiBwYXR0ZXJuLgogICAgICAgICBOVU1fQUxURVJOQVRFX1RPTkVTCiAgICAgfTsKIApAQCAtMjA4LDYgKzIyMCw5IEBACiAgICAgICAgIEpBUEFOLAogICAgICAgICBHQiwKICAgICAgICAgQVVTVFJBTElBLAorICAgICAgICBTSU5HQVBPUkUsCisgICAgICAgIEhPTkdLT05HLAorICAgICAgICBJUkVMQU5ELAogICAgICAgICBDRVBULAogICAgICAgICBOVU1fUkVHSU9OUwogICAgIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL1RyYWNrUGxheWVyQmFzZS5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9UcmFja1BsYXllckJhc2UuaAppbmRleCAyZDExM2MwLi42NmU5YjNiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL1RyYWNrUGxheWVyQmFzZS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvVHJhY2tQbGF5ZXJCYXNlLmgKQEAgLTMyLDkgKzMyLDkgQEAKICAgICB2aXJ0dWFsIHZvaWQgZGVzdHJveSgpOwogCiAgICAgLy9JUGxheWVyIGltcGxlbWVudGF0aW9uCi0gICAgdmlydHVhbCB2b2lkIGFwcGx5Vm9sdW1lU2hhcGVyKAotICAgICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKTsKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAorICAgICAgICAgICAgY29uc3QgbWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbiYgb3BlcmF0aW9uKTsKIAogICAgIC8vRklYTUUgbW92ZSB0byBwcm90ZWN0ZWQgZmllbGQsIHNvIGZhciBtYWRlIHB1YmxpYyB0byBtaW5pbWl6ZSBjaGFuZ2VzIHRvIEF1ZGlvVHJhY2sgbG9naWMKICAgICBzcDxBdWRpb1RyYWNrPiBtQXVkaW9UcmFjazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYmIyZmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzUgQEAKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGliYXVkaW9jbGllbnRfdGVzdHNfZGVmYXVsdHMiLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogInRlc3RfY3JlYXRlX2F1ZGlvdHJhY2siLAorICAgIGRlZmF1bHRzOiBbImxpYmF1ZGlvY2xpZW50X3Rlc3RzX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJ0ZXN0X2NyZWF0ZV9hdWRpb3RyYWNrLmNwcCIsCisgICAgICAgICAgICJ0ZXN0X2NyZWF0ZV91dGlscy5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKyAgICBkYXRhOiBbInRyYWNrX3Rlc3RfaW5wdXRfKi50eHQiXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogInRlc3RfY3JlYXRlX2F1ZGlvcmVjb3JkIiwKKyAgICBkZWZhdWx0czogWyJsaWJhdWRpb2NsaWVudF90ZXN0c19kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsidGVzdF9jcmVhdGVfYXVkaW9yZWNvcmQuY3BwIiwKKyAgICAgICAgICAgInRlc3RfY3JlYXRlX3V0aWxzLmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorICAgIGRhdGE6IFsicmVjb3JkX3Rlc3RfaW5wdXRfKi50eHQiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3JlY29yZF90ZXN0X2lucHV0X3YxLjBfcmVmLnR4dCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3JlY29yZF90ZXN0X2lucHV0X3YxLjBfcmVmLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDE1OThlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvcmVjb3JkX3Rlc3RfaW5wdXRfdjEuMF9yZWYudHh0CkBAIC0wLDAgKzEsMzMgQEAKK3ZlcnNpb24gMS4wCisjIElucHV0IGZpbGUgZm9yIHRlc3RfY3JlYXRlX2F1ZGlvcmVjb3JkCisjIEFkZCBvbmUgbGluZSBmb3IgZWFjaCB0ZXN0ZWQgQXVkaW9SZWNvcmQgY29uc3RydWN0b3Igd2l0aCB0aGUgZm9sbG93aW5nIGFyZ3VtZW50czoKKyMgc2FtcGxlUmF0ZSBmb3JtYXQgICBjaGFubmVsTWFzayBmcmFtZUNvdW50IG5vdGlmaWNhdGlvbkZyYW1lcyBmbGFncyBzZXNzaW9uSWQgaW5wdXRTb3VyY2UKKyMgc2FtcGxlIHJhdGUgdGVzdHMKKyAgNDgwMDAgICAgICAweDEgICAgICAweDEwICAgICAgICA0ODAwICAgICAgIDI0MDAgICAgICAgICAgICAgICAweDAgICAwICAgICAgICAgMAorICAyNDAwMCAgICAgIDB4MSAgICAgIDB4MTAgICAgICAgIDQ4MDAgICAgICAgMjQwMCAgICAgICAgICAgICAgIDB4MCAgIDAgICAgICAgICAwCisgIDE2MDAwICAgICAgMHgxICAgICAgMHgxMCAgICAgICAgNDgwMCAgICAgICAyNDAwICAgICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDAKKyAgIDgwMDAgICAgICAweDEgICAgICAweDEwICAgICAgICA0ODAwICAgICAgIDI0MDAgICAgICAgICAgICAgICAweDAgICAwICAgICAgICAgMAorICA0NDEwMCAgICAgIDB4MSAgICAgIDB4MTAgICAgICAgIDQ0MTAgICAgICAgMjIwNSAgICAgICAgICAgICAgIDB4MCAgIDAgICAgICAgICAwCisgIDIyMDUwICAgICAgMHgxICAgICAgMHgxMCAgICAgICAgNDQxMCAgICAgICAyMjA1ICAgICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDAKKyAgMTEwMjUgICAgICAweDEgICAgICAweDEwICAgICAgICA0NDEwICAgICAgIDIyMDUgICAgICAgICAgICAgICAweDAgICAwICAgICAgICAgMAorIyBmb3JtYXQgdGVzdHMKKyAgNDgwMDAgICAgICAweDIgICAgICAweDEwICAgICAgICA0ODAwICAgICAgIDI0MDAgICAgICAgICAgICAgICAweDAgICAwICAgICAgICAgMAorICA0ODAwMCAgICAgIDB4MyAgICAgIDB4MTAgICAgICAgIDQ4MDAgICAgICAgMjQwMCAgICAgICAgICAgICAgIDB4MCAgIDAgICAgICAgICAwCisgIDQ4MDAwICAgICAgMHg1ICAgICAgMHgxMCAgICAgICAgNDgwMCAgICAgICAyNDAwICAgICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDAKKyMgY2hhbm5lbCBtYXNrIHRlc3RzCisgIDQ4MDAwICAgICAgMHgxICAgICAgMHgwQyAgICAgICAgNDgwMCAgICAgICAyNDAwICAgICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDAKKyMgZnJhbWUgY291bnQgdGVzdHMKKyAgNDgwMDAgICAgICAweDEgICAgICAweDEwICAgICAgICAwICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAweDAgICAwICAgICAgICAgMAorICA0ODAwMCAgICAgIDB4MSAgICAgIDB4MTAgICAgICAgIDQ4MDAwICAgICAgMCAgICAgICAgICAgICAgICAgIDB4MCAgIDAgICAgICAgICAwCisgIDQ4MDAwICAgICAgMHgxICAgICAgMHgxMCAgICAgICAgMTIwMDAgICAgICA2MDAwICAgICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDAKKyMgZmxhZ3MgdGVzdAorICA0ODAwMCAgICAgIDB4MSAgICAgIDB4MEMgICAgICAgIDAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgIDB4MSAgIDAgICAgICAgICAwCisgIDQ0MTAwICAgICAgMHgxICAgICAgMHgwQyAgICAgICAgMCAgICAgICAgICAwICAgICAgICAgICAgICAgICAgMHg1ICAgMCAgICAgICAgIDAKKyMgc2Vzc2lvbiB0ZXN0cworICA0ODAwMCAgICAgIDB4MSAgICAgIDB4MTAgICAgICAgIDAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgIDAgICAgIDEwMDEgICAgICAwCisjIGlucHV0IHNvdXJjZSB0ZXN0cworICA0ODAwMCAgICAgIDB4MSAgICAgIDB4MTAgICAgICAgIDAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgIDAgICAgIDAgICAgICAgICAxCisgIDQ4MDAwICAgICAgMHgxICAgICAgMHgxMCAgICAgICAgMCAgICAgICAgICAwICAgICAgICAgICAgICAgICAgMCAgICAgMCAgICAgICAgIDUKKyAgNDgwMDAgICAgICAweDEgICAgICAweDEwICAgICAgICAwICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAwICAgICAwICAgICAgICAgNgorICA0ODAwMCAgICAgIDB4MSAgICAgIDB4MTAgICAgICAgIDAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgIDAgICAgIDAgICAgICAgICA3CisgIDQ4MDAwICAgICAgMHgxICAgICAgMHgxMCAgICAgICAgMCAgICAgICAgICAwICAgICAgICAgICAgICAgICAgMCAgICAgMCAgICAgICAgIDkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3JlY29yZF90ZXN0X291dHB1dF92MS4wX3JlZl93YWxsZXllLnR4dCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3JlY29yZF90ZXN0X291dHB1dF92MS4wX3JlZl93YWxsZXllLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjYwOGViCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvcmVjb3JkX3Rlc3Rfb3V0cHV0X3YxLjBfcmVmX3dhbGxleWUudHh0CkBAIC0wLDAgKzEsMTk4IEBACisKKyMjIyMgVGVzdCAxIHN0YXR1cyAwCisgQXVkaW9SZWNvcmQ6OmR1bXAKKyAgc3RhdHVzKDApLCBhY3RpdmUoMCksIHNlc3Npb24gSWQoNjUpCisgIGZsYWdzKDApLCByZXEuIGZsYWdzKDApLCBhdWRpbyBzb3VyY2UoMCkKKyAgZm9ybWF0KDB4MSksIGNoYW5uZWwgbWFzaygweDEwKSwgY2hhbm5lbCBjb3VudCgxKSwgc2FtcGxlIHJhdGUoNDgwMDApCisgIGZyYW1lIGNvdW50KDQ4MDApLCByZXEuIGZyYW1lIGNvdW50KDQ4MDApCisgIG5vdGlmLiBmcmFtZSBjb3VudCg5NjApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwKQorICBpbnB1dCgxNTApLCBsYXRlbmN5KDEwMCksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgxMSkKKworIyMjIyBUZXN0IDIgc3RhdHVzIDAKKyBBdWRpb1JlY29yZDo6ZHVtcAorICBzdGF0dXMoMCksIGFjdGl2ZSgwKSwgc2Vzc2lvbiBJZCg3MykKKyAgZmxhZ3MoMCksIHJlcS4gZmxhZ3MoMCksIGF1ZGlvIHNvdXJjZSgwKQorICBmb3JtYXQoMHgxKSwgY2hhbm5lbCBtYXNrKDB4MTApLCBjaGFubmVsIGNvdW50KDEpLCBzYW1wbGUgcmF0ZSgyNDAwMCkKKyAgZnJhbWUgY291bnQoNDgwMCksIHJlcS4gZnJhbWUgY291bnQoNDgwMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDQ4MCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDI0MDApCisgIGlucHV0KDE1OCksIGxhdGVuY3koMjAwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDExKQorCisjIyMjIFRlc3QgMyBzdGF0dXMgMAorIEF1ZGlvUmVjb3JkOjpkdW1wCisgIHN0YXR1cygwKSwgYWN0aXZlKDApLCBzZXNzaW9uIElkKDgxKQorICBmbGFncygwKSwgcmVxLiBmbGFncygwKSwgYXVkaW8gc291cmNlKDApCisgIGZvcm1hdCgweDEpLCBjaGFubmVsIG1hc2soMHgxMCksIGNoYW5uZWwgY291bnQoMSksIHNhbXBsZSByYXRlKDE2MDAwKQorICBmcmFtZSBjb3VudCg0ODAwKSwgcmVxLiBmcmFtZSBjb3VudCg0ODAwKQorICBub3RpZi4gZnJhbWUgY291bnQoMzIwKSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMjQwMCkKKyAgaW5wdXQoMTY2KSwgbGF0ZW5jeSgzMDApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMTEpCisKKyMjIyMgVGVzdCA0IHN0YXR1cyAwCisgQXVkaW9SZWNvcmQ6OmR1bXAKKyAgc3RhdHVzKDApLCBhY3RpdmUoMCksIHNlc3Npb24gSWQoODkpCisgIGZsYWdzKDApLCByZXEuIGZsYWdzKDApLCBhdWRpbyBzb3VyY2UoMCkKKyAgZm9ybWF0KDB4MSksIGNoYW5uZWwgbWFzaygweDEwKSwgY2hhbm5lbCBjb3VudCgxKSwgc2FtcGxlIHJhdGUoODAwMCkKKyAgZnJhbWUgY291bnQoNDgwMCksIHJlcS4gZnJhbWUgY291bnQoNDgwMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDE2MCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDI0MDApCisgIGlucHV0KDE3NCksIGxhdGVuY3koNjAwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDExKQorCisjIyMjIFRlc3QgNSBzdGF0dXMgMAorIEF1ZGlvUmVjb3JkOjpkdW1wCisgIHN0YXR1cygwKSwgYWN0aXZlKDApLCBzZXNzaW9uIElkKDk3KQorICBmbGFncygwKSwgcmVxLiBmbGFncygwKSwgYXVkaW8gc291cmNlKDApCisgIGZvcm1hdCgweDEpLCBjaGFubmVsIG1hc2soMHgxMCksIGNoYW5uZWwgY291bnQoMSksIHNhbXBsZSByYXRlKDQ0MTAwKQorICBmcmFtZSBjb3VudCg0NDEwKSwgcmVxLiBmcmFtZSBjb3VudCg0NDEwKQorICBub3RpZi4gZnJhbWUgY291bnQoODk2KSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMjIwNSkKKyAgaW5wdXQoMTgyKSwgbGF0ZW5jeSgxMDApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMTEpCisKKyMjIyMgVGVzdCA2IHN0YXR1cyAwCisgQXVkaW9SZWNvcmQ6OmR1bXAKKyAgc3RhdHVzKDApLCBhY3RpdmUoMCksIHNlc3Npb24gSWQoMTA1KQorICBmbGFncygwKSwgcmVxLiBmbGFncygwKSwgYXVkaW8gc291cmNlKDApCisgIGZvcm1hdCgweDEpLCBjaGFubmVsIG1hc2soMHgxMCksIGNoYW5uZWwgY291bnQoMSksIHNhbXBsZSByYXRlKDIyMDUwKQorICBmcmFtZSBjb3VudCg0NDEwKSwgcmVxLiBmcmFtZSBjb3VudCg0NDEwKQorICBub3RpZi4gZnJhbWUgY291bnQoNDQ4KSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMjIwNSkKKyAgaW5wdXQoMTkwKSwgbGF0ZW5jeSgyMDApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMTEpCisKKyMjIyMgVGVzdCA3IHN0YXR1cyAwCisgQXVkaW9SZWNvcmQ6OmR1bXAKKyAgc3RhdHVzKDApLCBhY3RpdmUoMCksIHNlc3Npb24gSWQoMTEzKQorICBmbGFncygwKSwgcmVxLiBmbGFncygwKSwgYXVkaW8gc291cmNlKDApCisgIGZvcm1hdCgweDEpLCBjaGFubmVsIG1hc2soMHgxMCksIGNoYW5uZWwgY291bnQoMSksIHNhbXBsZSByYXRlKDExMDI1KQorICBmcmFtZSBjb3VudCg0NDEwKSwgcmVxLiBmcmFtZSBjb3VudCg0NDEwKQorICBub3RpZi4gZnJhbWUgY291bnQoMjI0KSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMjIwNSkKKyAgaW5wdXQoMTk4KSwgbGF0ZW5jeSg0MDApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMTEpCisKKyMjIyMgVGVzdCA4IHN0YXR1cyAwCisgQXVkaW9SZWNvcmQ6OmR1bXAKKyAgc3RhdHVzKDApLCBhY3RpdmUoMCksIHNlc3Npb24gSWQoMTIxKQorICBmbGFncygwKSwgcmVxLiBmbGFncygwKSwgYXVkaW8gc291cmNlKDApCisgIGZvcm1hdCgweDIpLCBjaGFubmVsIG1hc2soMHgxMCksIGNoYW5uZWwgY291bnQoMSksIHNhbXBsZSByYXRlKDQ4MDAwKQorICBmcmFtZSBjb3VudCg0ODAwKSwgcmVxLiBmcmFtZSBjb3VudCg0ODAwKQorICBub3RpZi4gZnJhbWUgY291bnQoOTYwKSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMjQwMCkKKyAgaW5wdXQoMjA2KSwgbGF0ZW5jeSgxMDApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMTEpCisKKyMjIyMgVGVzdCA5IHN0YXR1cyAwCisgQXVkaW9SZWNvcmQ6OmR1bXAKKyAgc3RhdHVzKDApLCBhY3RpdmUoMCksIHNlc3Npb24gSWQoMTI5KQorICBmbGFncygwKSwgcmVxLiBmbGFncygwKSwgYXVkaW8gc291cmNlKDApCisgIGZvcm1hdCgweDMpLCBjaGFubmVsIG1hc2soMHgxMCksIGNoYW5uZWwgY291bnQoMSksIHNhbXBsZSByYXRlKDQ4MDAwKQorICBmcmFtZSBjb3VudCg0ODAwKSwgcmVxLiBmcmFtZSBjb3VudCg0ODAwKQorICBub3RpZi4gZnJhbWUgY291bnQoOTYwKSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMjQwMCkKKyAgaW5wdXQoMjE0KSwgbGF0ZW5jeSgxMDApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMTEpCisKKyMjIyMgVGVzdCAxMCBzdGF0dXMgMAorIEF1ZGlvUmVjb3JkOjpkdW1wCisgIHN0YXR1cygwKSwgYWN0aXZlKDApLCBzZXNzaW9uIElkKDEzNykKKyAgZmxhZ3MoMCksIHJlcS4gZmxhZ3MoMCksIGF1ZGlvIHNvdXJjZSgwKQorICBmb3JtYXQoMHg1KSwgY2hhbm5lbCBtYXNrKDB4MTApLCBjaGFubmVsIGNvdW50KDEpLCBzYW1wbGUgcmF0ZSg0ODAwMCkKKyAgZnJhbWUgY291bnQoNDgwMCksIHJlcS4gZnJhbWUgY291bnQoNDgwMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDk2MCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDI0MDApCisgIGlucHV0KDIyMiksIGxhdGVuY3koMTAwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDExKQorCisjIyMjIFRlc3QgMTEgc3RhdHVzIDAKKyBBdWRpb1JlY29yZDo6ZHVtcAorICBzdGF0dXMoMCksIGFjdGl2ZSgwKSwgc2Vzc2lvbiBJZCgxNDUpCisgIGZsYWdzKDApLCByZXEuIGZsYWdzKDApLCBhdWRpbyBzb3VyY2UoMCkKKyAgZm9ybWF0KDB4MSksIGNoYW5uZWwgbWFzaygweGMpLCBjaGFubmVsIGNvdW50KDIpLCBzYW1wbGUgcmF0ZSg0ODAwMCkKKyAgZnJhbWUgY291bnQoNDgwMCksIHJlcS4gZnJhbWUgY291bnQoNDgwMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDk2MCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDI0MDApCisgIGlucHV0KDIzMCksIGxhdGVuY3koMTAwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDExKQorCisjIyMjIFRlc3QgMTIgc3RhdHVzIDAKKyBBdWRpb1JlY29yZDo6ZHVtcAorICBzdGF0dXMoMCksIGFjdGl2ZSgwKSwgc2Vzc2lvbiBJZCgxNTMpCisgIGZsYWdzKDApLCByZXEuIGZsYWdzKDApLCBhdWRpbyBzb3VyY2UoMCkKKyAgZm9ybWF0KDB4MSksIGNoYW5uZWwgbWFzaygweDEwKSwgY2hhbm5lbCBjb3VudCgxKSwgc2FtcGxlIHJhdGUoNDgwMDApCisgIGZyYW1lIGNvdW50KDI4ODApLCByZXEuIGZyYW1lIGNvdW50KDI4ODApCisgIG5vdGlmLiBmcmFtZSBjb3VudCg5NjApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgwKQorICBpbnB1dCgyMzgpLCBsYXRlbmN5KDYwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDExKQorCisjIyMjIFRlc3QgMTMgc3RhdHVzIDAKKyBBdWRpb1JlY29yZDo6ZHVtcAorICBzdGF0dXMoMCksIGFjdGl2ZSgwKSwgc2Vzc2lvbiBJZCgxNjEpCisgIGZsYWdzKDApLCByZXEuIGZsYWdzKDApLCBhdWRpbyBzb3VyY2UoMCkKKyAgZm9ybWF0KDB4MSksIGNoYW5uZWwgbWFzaygweDEwKSwgY2hhbm5lbCBjb3VudCgxKSwgc2FtcGxlIHJhdGUoNDgwMDApCisgIGZyYW1lIGNvdW50KDQ4MDAwKSwgcmVxLiBmcmFtZSBjb3VudCg0ODAwMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDk2MCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDApCisgIGlucHV0KDI0NiksIGxhdGVuY3koMTAwMCksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgxMSkKKworIyMjIyBUZXN0IDE0IHN0YXR1cyAwCisgQXVkaW9SZWNvcmQ6OmR1bXAKKyAgc3RhdHVzKDApLCBhY3RpdmUoMCksIHNlc3Npb24gSWQoMTY5KQorICBmbGFncygwKSwgcmVxLiBmbGFncygwKSwgYXVkaW8gc291cmNlKDApCisgIGZvcm1hdCgweDEpLCBjaGFubmVsIG1hc2soMHgxMCksIGNoYW5uZWwgY291bnQoMSksIHNhbXBsZSByYXRlKDQ4MDAwKQorICBmcmFtZSBjb3VudCgxMjAwMCksIHJlcS4gZnJhbWUgY291bnQoMTIwMDApCisgIG5vdGlmLiBmcmFtZSBjb3VudCg5NjApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCg2MDAwKQorICBpbnB1dCgyNTQpLCBsYXRlbmN5KDI1MCksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgxMSkKKworIyMjIyBUZXN0IDE1IHN0YXR1cyAwCisgQXVkaW9SZWNvcmQ6OmR1bXAKKyAgc3RhdHVzKDApLCBhY3RpdmUoMCksIHNlc3Npb24gSWQoMTc3KQorICBmbGFncygweDEpLCByZXEuIGZsYWdzKDB4MSksIGF1ZGlvIHNvdXJjZSgwKQorICBmb3JtYXQoMHgxKSwgY2hhbm5lbCBtYXNrKDB4YyksIGNoYW5uZWwgY291bnQoMiksIHNhbXBsZSByYXRlKDQ4MDAwKQorICBmcmFtZSBjb3VudCg0MDk2KSwgcmVxLiBmcmFtZSBjb3VudCg0MDk2KQorICBub3RpZi4gZnJhbWUgY291bnQoOTYpLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgwKQorICBpbnB1dCgyNjIpLCBsYXRlbmN5KDg1KSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDExKQorCisjIyMjIFRlc3QgMTYgc3RhdHVzIDAKKyBBdWRpb1JlY29yZDo6ZHVtcAorICBzdGF0dXMoMCksIGFjdGl2ZSgwKSwgc2Vzc2lvbiBJZCgxODUpCisgIGZsYWdzKDApLCByZXEuIGZsYWdzKDB4NSksIGF1ZGlvIHNvdXJjZSgwKQorICBmb3JtYXQoMHgxKSwgY2hhbm5lbCBtYXNrKDB4YyksIGNoYW5uZWwgY291bnQoMiksIHNhbXBsZSByYXRlKDQ0MTAwKQorICBmcmFtZSBjb3VudCgyNjY0KSwgcmVxLiBmcmFtZSBjb3VudCgyNjY0KQorICBub3RpZi4gZnJhbWUgY291bnQoODg4KSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMCkKKyAgaW5wdXQoMjc4KSwgbGF0ZW5jeSg2MCksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgxMSkKKworIyMjIyBUZXN0IDE3IHN0YXR1cyAwCisgQXVkaW9SZWNvcmQ6OmR1bXAKKyAgc3RhdHVzKDApLCBhY3RpdmUoMCksIHNlc3Npb24gSWQoMTAwMSkKKyAgZmxhZ3MoMCksIHJlcS4gZmxhZ3MoMCksIGF1ZGlvIHNvdXJjZSgwKQorICBmb3JtYXQoMHgxKSwgY2hhbm5lbCBtYXNrKDB4MTApLCBjaGFubmVsIGNvdW50KDEpLCBzYW1wbGUgcmF0ZSg0ODAwMCkKKyAgZnJhbWUgY291bnQoMjg4MCksIHJlcS4gZnJhbWUgY291bnQoMjg4MCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDk2MCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDApCisgIGlucHV0KDI4NiksIGxhdGVuY3koNjApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMTEpCisKKyMjIyMgVGVzdCAxOCBzdGF0dXMgMAorIEF1ZGlvUmVjb3JkOjpkdW1wCisgIHN0YXR1cygwKSwgYWN0aXZlKDApLCBzZXNzaW9uIElkKDE5MykKKyAgZmxhZ3MoMCksIHJlcS4gZmxhZ3MoMCksIGF1ZGlvIHNvdXJjZSgxKQorICBmb3JtYXQoMHgxKSwgY2hhbm5lbCBtYXNrKDB4MTApLCBjaGFubmVsIGNvdW50KDEpLCBzYW1wbGUgcmF0ZSg0ODAwMCkKKyAgZnJhbWUgY291bnQoMjg4MCksIHJlcS4gZnJhbWUgY291bnQoMjg4MCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDk2MCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDApCisgIGlucHV0KDI5NCksIGxhdGVuY3koNjApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMTEpCisKKyMjIyMgVGVzdCAxOSBzdGF0dXMgMAorIEF1ZGlvUmVjb3JkOjpkdW1wCisgIHN0YXR1cygwKSwgYWN0aXZlKDApLCBzZXNzaW9uIElkKDIwMSkKKyAgZmxhZ3MoMCksIHJlcS4gZmxhZ3MoMCksIGF1ZGlvIHNvdXJjZSg1KQorICBmb3JtYXQoMHgxKSwgY2hhbm5lbCBtYXNrKDB4MTApLCBjaGFubmVsIGNvdW50KDEpLCBzYW1wbGUgcmF0ZSg0ODAwMCkKKyAgZnJhbWUgY291bnQoMjg4MCksIHJlcS4gZnJhbWUgY291bnQoMjg4MCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDk2MCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDApCisgIGlucHV0KDMwMiksIGxhdGVuY3koNjApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMTIpCisKKyMjIyMgVGVzdCAyMCBzdGF0dXMgMAorIEF1ZGlvUmVjb3JkOjpkdW1wCisgIHN0YXR1cygwKSwgYWN0aXZlKDApLCBzZXNzaW9uIElkKDIwOSkKKyAgZmxhZ3MoMCksIHJlcS4gZmxhZ3MoMCksIGF1ZGlvIHNvdXJjZSg2KQorICBmb3JtYXQoMHgxKSwgY2hhbm5lbCBtYXNrKDB4MTApLCBjaGFubmVsIGNvdW50KDEpLCBzYW1wbGUgcmF0ZSg0ODAwMCkKKyAgZnJhbWUgY291bnQoMjg4MCksIHJlcS4gZnJhbWUgY291bnQoMjg4MCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDk2MCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDApCisgIGlucHV0KDMxMCksIGxhdGVuY3koNjApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMTEpCisKKyMjIyMgVGVzdCAyMSBzdGF0dXMgMAorIEF1ZGlvUmVjb3JkOjpkdW1wCisgIHN0YXR1cygwKSwgYWN0aXZlKDApLCBzZXNzaW9uIElkKDIxNykKKyAgZmxhZ3MoMCksIHJlcS4gZmxhZ3MoMCksIGF1ZGlvIHNvdXJjZSg3KQorICBmb3JtYXQoMHgxKSwgY2hhbm5lbCBtYXNrKDB4MTApLCBjaGFubmVsIGNvdW50KDEpLCBzYW1wbGUgcmF0ZSg0ODAwMCkKKyAgZnJhbWUgY291bnQoMjg4MCksIHJlcS4gZnJhbWUgY291bnQoMjg4MCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDk2MCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDApCisgIGlucHV0KDMxOCksIGxhdGVuY3koNjApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMTEpCisKKyMjIyMgVGVzdCAyMiBzdGF0dXMgMAorIEF1ZGlvUmVjb3JkOjpkdW1wCisgIHN0YXR1cygwKSwgYWN0aXZlKDApLCBzZXNzaW9uIElkKDIyNSkKKyAgZmxhZ3MoMCksIHJlcS4gZmxhZ3MoMCksIGF1ZGlvIHNvdXJjZSg5KQorICBmb3JtYXQoMHgxKSwgY2hhbm5lbCBtYXNrKDB4MTApLCBjaGFubmVsIGNvdW50KDEpLCBzYW1wbGUgcmF0ZSg0ODAwMCkKKyAgZnJhbWUgY291bnQoMjg4MCksIHJlcS4gZnJhbWUgY291bnQoMjg4MCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDk2MCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDApCisgIGlucHV0KDMyNiksIGxhdGVuY3koNjApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMTEpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90ZXN0X2NyZWF0ZV9hdWRpb3JlY29yZC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90ZXN0X2NyZWF0ZV9hdWRpb3JlY29yZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y2YTczNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3Rlc3RfY3JlYXRlX2F1ZGlvcmVjb3JkLmNwcApAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5QmFzZS5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1JlY29yZC5oPgorCisjaW5jbHVkZSAidGVzdF9jcmVhdGVfdXRpbHMuaCIKKworI2RlZmluZSBOVU1fQVJHVU1FTlRTIDgKKyNkZWZpbmUgVkVSU0lPTl9WQUxVRSAiMS4wIgorI2RlZmluZSBQQUNLQUdFX05BTUUgICJBdWRpb1JlY29yZCB0ZXN0IgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2ludCB0ZXN0UmVjb3JkKEZJTEUgKmlucHV0RmlsZSwgaW50IG91dHB1dEZpbGVGZCkKK3sKKyAgICBjaGFyIGxpbmVbTUFYX0lOUFVUX0ZJTEVfTElORV9MRU5HVEhdOworICAgIHVpbnQzMl90IHRlc3RDb3VudCA9IDA7CisgICAgVmVjdG9yPFN0cmluZzE2PiBhcmdzOworICAgIGludCByZXQgPSAwOworCisgICAgaWYgKGlucHV0RmlsZSA9PSBudWxscHRyKSB7CisgICAgICAgIHNwPEF1ZGlvUmVjb3JkPiByZWNvcmQgPSBuZXcgQXVkaW9SZWNvcmQoQVVESU9fU09VUkNFX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBzYW1wbGVSYXRlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fTU9OTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNihQQUNLQUdFX05BTUUpKTsKKyAgICAgICAgaWYgKHJlY29yZCA9PSAwIHx8IHJlY29yZC0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHdyaXRlKG91dHB1dEZpbGVGZCwgIkVycm9yIGNyZWF0aW5nIEF1ZGlvUmVjb3JkXG4iLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKCJFcnJvciBjcmVhdGluZyBBdWRpb1JlY29yZFxuIikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVjb3JkLT5kdW1wKG91dHB1dEZpbGVGZCwgYXJncyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gY2hlY2sgdmVyc2lvbgorICAgIGlmICghY2hlY2tWZXJzaW9uKGlucHV0RmlsZSwgVkVSU0lPTl9WQUxVRSkpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgd2hpbGUgKHJlYWRMaW5lKGlucHV0RmlsZSwgbGluZSwgTUFYX0lOUFVUX0ZJTEVfTElORV9MRU5HVEgpID09IDApIHsKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0OworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzazsKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQ7CisgICAgICAgIGludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzOworICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzOworICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkOworICAgICAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZTsKKyAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXM7CisgICAgICAgIHN0YXR1c190IHN0YXR1czsKKyAgICAgICAgY2hhciBzdGF0dXNTdHJbTUFYX09VVFBVVF9GSUxFX0xJTkVfTEVOR1RIXTsKKyAgICAgICAgYm9vbCBmYXN0ID0gZmFsc2U7CisKKyAgICAgICAgaWYgKHNzY2FuZihsaW5lLCAiICV1ICV4ICV4ICV6dSAlZCAleCAldSAldSIsCisgICAgICAgICAgICAgICAgICAgJnNhbXBsZVJhdGUsICZmb3JtYXQsICZjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAmZnJhbWVDb3VudCwgJm5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAmZmxhZ3MsICZzZXNzaW9uSWQsICZpbnB1dFNvdXJjZSkgIT0gTlVNX0FSR1VNRU5UUykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJNYWxmb3JtZWQgbGluZSBmb3IgdGVzdCAjJXUgaW4gaW5wdXQgZmlsZVxuIiwgdGVzdENvdW50KzEpOworICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHRlc3RDb3VudCsrOworCisgICAgICAgIGlmICgoZmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0ZBU1QpICE9IDApIHsKKyAgICAgICAgICAgIGZhc3QgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgbWVtc2V0KCZhdHRyaWJ1dGVzLCAwLCBzaXplb2YoYXR0cmlidXRlcykpOworICAgICAgICBhdHRyaWJ1dGVzLnNvdXJjZSA9IGlucHV0U291cmNlOworCisgICAgICAgIHNwPEF1ZGlvUmVjb3JkPiByZWNvcmQgPSBuZXcgQXVkaW9SZWNvcmQoU3RyaW5nMTYoUEFDS0FHRV9OQU1FKSk7CisKKyAgICAgICAgcmVjb3JkLT5zZXQoQVVESU9fU09VUkNFX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICBmYXN0ID8gY2FsbGJhY2sgOiBudWxscHRyLAorICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICBmYXN0ID8gQXVkaW9SZWNvcmQ6OlRSQU5TRkVSX0NBTExCQUNLIDogQXVkaW9SZWNvcmQ6OlRSQU5TRkVSX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgZ2V0dWlkKCksCisgICAgICAgICAgICAgICAgICAgZ2V0cGlkKCksCisgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CisgICAgICAgIHN0YXR1cyA9IHJlY29yZC0+aW5pdENoZWNrKCk7CisgICAgICAgIHNwcmludGYoc3RhdHVzU3RyLCAiXG4jIyMjIFRlc3QgJXUgc3RhdHVzICVkXG4iLCB0ZXN0Q291bnQsIHN0YXR1cyk7CisgICAgICAgIHdyaXRlKG91dHB1dEZpbGVGZCwgc3RhdHVzU3RyLCBzdHJsZW4oc3RhdHVzU3RyKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHJlY29yZC0+ZHVtcChvdXRwdXRGaWxlRmQsIGFyZ3MpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICByZXR1cm4gYW5kcm9pZDo6bWFpbihhcmdjLCBhcmd2LCBhbmRyb2lkOjp0ZXN0UmVjb3JkKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfYXVkaW90cmFjay5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90ZXN0X2NyZWF0ZV9hdWRpb3RyYWNrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjliOTI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfYXVkaW90cmFjay5jcHAKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CisjaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgorCisjaW5jbHVkZSAidGVzdF9jcmVhdGVfdXRpbHMuaCIKKworI2RlZmluZSBOVU1fQVJHVU1FTlRTIDEwCisjZGVmaW5lIFZFUlNJT05fVkFMVUUgIjEuMCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitpbnQgdGVzdFRyYWNrKEZJTEUgKmlucHV0RmlsZSwgaW50IG91dHB1dEZpbGVGZCkKK3sKKyAgICBjaGFyIGxpbmVbTUFYX0lOUFVUX0ZJTEVfTElORV9MRU5HVEhdOworICAgIHVpbnQzMl90IHRlc3RDb3VudCA9IDA7CisgICAgVmVjdG9yPFN0cmluZzE2PiBhcmdzOworICAgIGludCByZXQgPSAwOworCisgICAgaWYgKGlucHV0RmlsZSA9PSBudWxscHRyKSB7CisgICAgICAgIHNwPEF1ZGlvVHJhY2s+IHRyYWNrID0gbmV3IEF1ZGlvVHJhY2soQVVESU9fU1RSRUFNX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBzYW1wbGVSYXRlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyk7CisgICAgICAgIGlmICh0cmFjayA9PSAwIHx8IHRyYWNrLT5pbml0Q2hlY2soKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgd3JpdGUob3V0cHV0RmlsZUZkLCAiRXJyb3IgY3JlYXRpbmcgQXVkaW9UcmFja1xuIiwKKyAgICAgICAgICAgICAgICAgIHNpemVvZigiRXJyb3IgY3JlYXRpbmcgQXVkaW9UcmFja1xuIikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJhY2stPmR1bXAob3V0cHV0RmlsZUZkLCBhcmdzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBjaGVjayB2ZXJzaW9uCisgICAgaWYgKCFjaGVja1ZlcnNpb24oaW5wdXRGaWxlLCBWRVJTSU9OX1ZBTFVFKSkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICB3aGlsZSAocmVhZExpbmUoaW5wdXRGaWxlLCBsaW5lLCBNQVhfSU5QVVRfRklMRV9MSU5FX0xFTkdUSCkgPT0gMCkgeworICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlOworICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQ7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrOworICAgICAgICBzaXplX3QgZnJhbWVDb3VudDsKKyAgICAgICAgaW50MzJfdCBub3RpZmljYXRpb25GcmFtZXM7CisgICAgICAgIHVpbnQzMl90IHVzZVNoYXJlZEJ1ZmZlcjsKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3M7CisgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQ7CisgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2U7CisgICAgICAgIGF1ZGlvX2NvbnRlbnRfdHlwZV90IGNvbnRlbnRUeXBlOworICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlczsKKyAgICAgICAgc3A8SU1lbW9yeT4gc2hhcmVkQnVmZmVyOworICAgICAgICBzcDxNZW1vcnlEZWFsZXI+IGhlYXA7CisgICAgICAgIGF1ZGlvX29mZmxvYWRfaW5mb190IG9mZmxvYWRJbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICBjaGFyIHN0YXR1c1N0cltNQVhfT1VUUFVUX0ZJTEVfTElORV9MRU5HVEhdOworICAgICAgICBib29sIG9mZmxvYWQgPSBmYWxzZTsKKyAgICAgICAgYm9vbCBmYXN0ID0gZmFsc2U7CisKKyAgICAgICAgaWYgKHNzY2FuZihsaW5lLCAiICV1ICV4ICV4ICV6dSAlZCAldSAleCAldSAldSAldSIsCisgICAgICAgICAgICAgICAgICAgJnNhbXBsZVJhdGUsICZmb3JtYXQsICZjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAmZnJhbWVDb3VudCwgJm5vdGlmaWNhdGlvbkZyYW1lcywgJnVzZVNoYXJlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAmZmxhZ3MsICZzZXNzaW9uSWQsICZ1c2FnZSwgJmNvbnRlbnRUeXBlKSAhPSBOVU1fQVJHVU1FTlRTKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1hbGZvcm1lZCBsaW5lIGZvciB0ZXN0ICMldSBpbiBpbnB1dCBmaWxlXG4iLCB0ZXN0Q291bnQrMSk7CisgICAgICAgICAgICByZXQgPSAxOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgdGVzdENvdW50Kys7CisKKyAgICAgICAgaWYgKHVzZVNoYXJlZEJ1ZmZlciAhPSAwKSB7CisgICAgICAgICAgICBzaXplX3QgaGVhcFNpemUgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spICoKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpICogZnJhbWVDb3VudDsKKyAgICAgICAgICAgIGhlYXAgPSBuZXcgTWVtb3J5RGVhbGVyKGhlYXBTaXplLCAiQXVkaW9UcmFjayBIZWFwIEJhc2UiKTsKKyAgICAgICAgICAgIHNoYXJlZEJ1ZmZlciA9IGhlYXAtPmFsbG9jYXRlKGhlYXBTaXplKTsKKyAgICAgICAgICAgIGZyYW1lQ291bnQgPSAwOworICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMCkgeworICAgICAgICAgICAgb2ZmbG9hZEluZm8uc2FtcGxlX3JhdGUgPSBzYW1wbGVSYXRlOworICAgICAgICAgICAgb2ZmbG9hZEluZm8uY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2s7CisgICAgICAgICAgICBvZmZsb2FkSW5mby5mb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgICAgICBvZmZsb2FkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgIT0gMCkgeworICAgICAgICAgICAgZmFzdCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBtZW1zZXQoJmF0dHJpYnV0ZXMsIDAsIHNpemVvZihhdHRyaWJ1dGVzKSk7CisgICAgICAgIGF0dHJpYnV0ZXMuY29udGVudF90eXBlID0gY29udGVudFR5cGU7CisgICAgICAgIGF0dHJpYnV0ZXMudXNhZ2UgPSB1c2FnZTsKKworICAgICAgICBzcDxBdWRpb1RyYWNrPiB0cmFjayA9IG5ldyBBdWRpb1RyYWNrKCk7CisKKyAgICAgICAgdHJhY2stPnNldChBVURJT19TVFJFQU1fREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgIChmYXN0IHx8IG9mZmxvYWQpID8gY2FsbGJhY2sgOiBudWxscHRyLAorICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICAgICAgICAgICAgIHNoYXJlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgKChmYXN0ICYmIHNoYXJlZEJ1ZmZlciA9PSAwKSB8fCBvZmZsb2FkKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrOjpUUkFOU0ZFUl9DQUxMQkFDSyA6IEF1ZGlvVHJhY2s6OlRSQU5TRkVSX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgb2ZmbG9hZCA/ICZvZmZsb2FkSW5mbyA6IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgZ2V0dWlkKCksCisgICAgICAgICAgICAgICAgICAgZ2V0cGlkKCksCisgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgMS4wZiwKKyAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKKyAgICAgICAgc3RhdHVzID0gdHJhY2stPmluaXRDaGVjaygpOworICAgICAgICBzcHJpbnRmKHN0YXR1c1N0ciwgIlxuIyMjIyBUZXN0ICV1IHN0YXR1cyAlZFxuIiwgdGVzdENvdW50LCBzdGF0dXMpOworICAgICAgICB3cml0ZShvdXRwdXRGaWxlRmQsIHN0YXR1c1N0ciwgc3RybGVuKHN0YXR1c1N0cikpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICB0cmFjay0+ZHVtcChvdXRwdXRGaWxlRmQsIGFyZ3MpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICByZXR1cm4gYW5kcm9pZDo6bWFpbihhcmdjLCBhcmd2LCBhbmRyb2lkOjp0ZXN0VHJhY2spOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90ZXN0X2NyZWF0ZV91dGlscy5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90ZXN0X2NyZWF0ZV91dGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFhMWYxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3Rlc3RfY3JlYXRlX3V0aWxzLmNwcApAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJ0ZXN0X2NyZWF0ZV91dGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2ludCByZWFkTGluZShGSUxFICppbnB1dEZpbGUsIGNoYXIgKmxpbmUsIGludCBzaXplKSB7CisgICAgaW50IHJldCA9IDA7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgY2hhciAqc3RyID0gZmdldHMobGluZSwgc2l6ZSwgaW5wdXRGaWxlKTsKKyAgICAgICAgaWYgKHN0ciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChmZW9mKGlucHV0RmlsZSkgIT0gMCB8fCBmZXJyb3IoaW5wdXRGaWxlKSAhPSAwKSB7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJsZW4oc3RyKSAhPSAwICYmIHN0clswXSAhPSBDT01NRU5UX0NIQVIpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2Jvb2wgY2hlY2tWZXJzaW9uKEZJTEUgKmlucHV0RmlsZSwgY29uc3QgY2hhciAqdmVyc2lvbikKK3sKKyAgICBjaGFyIGxpbmVbTUFYX0lOUFVUX0ZJTEVfTElORV9MRU5HVEhdOworICAgIGNoYXIgdmVyc2lvbktleVtNQVhfSU5QVVRfRklMRV9MSU5FX0xFTkdUSF07CisgICAgY2hhciB2ZXJzaW9uVmFsdWVbTUFYX0lOUFVUX0ZJTEVfTElORV9MRU5HVEhdOworCisgICAgaWYgKHJlYWRMaW5lKGlucHV0RmlsZSwgbGluZSwgTUFYX0lOUFVUX0ZJTEVfTElORV9MRU5HVEgpICE9IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIHZlcnNpb24gaW4gaW5wdXQgZmlsZVxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoc3NjYW5mKGxpbmUsICIgJXMgJXMiLCB2ZXJzaW9uS2V5LCB2ZXJzaW9uVmFsdWUpICE9IDIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJNYWxmb3JtZWQgdmVyc2lvbiBpbiBpbnB1dCBmaWxlXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoc3RyY21wKHZlcnNpb25LZXksIFZFUlNJT05fS0VZKSAhPSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWFsZm9ybWVkIHZlcnNpb24gaW4gaW5wdXQgZmlsZVxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHN0cmNtcCh2ZXJzaW9uVmFsdWUsIHZlcnNpb24pICE9IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJXcm9uZyBpbnB1dCBmaWxlIHZlcnNpb24gJXMgZXhwZWN0aW5nICVzXG4iLCB2ZXJzaW9uVmFsdWUsIHZlcnNpb24pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIGNhbGxiYWNrKGludCBldmVudCBfX3VudXNlZCwgdm9pZCogdXNlciBfX3VudXNlZCwgdm9pZCAqaW5mbyBfX3VudXNlZCkKK3sKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2LCB0ZXN0X2Z1bmNfdCB0ZXN0RnVuYykKK3sKKyAgICBGSUxFICppbnB1dEZpbGUgPSBudWxscHRyOworICAgIGludCBvdXRwdXRGaWxlRmQgPSBTVERPVVRfRklMRU5POworICAgIG1vZGVfdCBtb2RlID0gU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JUk9USDsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGlmIChhcmdjID4gNSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbLWkgaW5wdXRfcGFyYW1zLnR4dF0gWy1vIG91dHB1dF9wYXJhbXMudHh0XVxuIiwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGFyZ3YrKzsKKyAgICB3aGlsZSAoKmFyZ3YpIHsKKyAgICAgICAgaWYgKHN0cmNtcCgqYXJndiwgIi1pIikgPT0gMCkgeworICAgICAgICAgICAgYXJndisrOworICAgICAgICAgICAgaWYgKCphcmd2KSB7CisgICAgICAgICAgICAgICAgaW5wdXRGaWxlID0gZm9wZW4oKmFyZ3YsICJyIik7CisgICAgICAgICAgICAgICAgaWYgKGlucHV0RmlsZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzdHJjbXAoKmFyZ3YsICItbyIpID09IDApIHsKKyAgICAgICAgICAgIGFyZ3YrKzsKKyAgICAgICAgICAgIGlmICgqYXJndikgeworICAgICAgICAgICAgICAgIG91dHB1dEZpbGVGZCA9IG9wZW4oKmFyZ3YsIE9fV1JPTkxZfE9fQ1JFQVQsIG1vZGUpOworICAgICAgICAgICAgICAgIGlmIChvdXRwdXRGaWxlRmQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXJndisrOworICAgICAgICB9CisgICAgICAgIGlmICgqYXJndikgeworICAgICAgICAgICAgYXJndisrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0ID0gdGVzdEZ1bmMoaW5wdXRGaWxlLCBvdXRwdXRGaWxlRmQpOworCisgICAgaWYgKGlucHV0RmlsZSkgeworICAgICAgICBmY2xvc2UoaW5wdXRGaWxlKTsKKyAgICB9CisgICAgaWYgKG91dHB1dEZpbGVGZCA+PSAwICYmIG91dHB1dEZpbGVGZCAhPSBTVERPVVRfRklMRU5PKSB7CisgICAgICAgIGNsb3NlKG91dHB1dEZpbGVGZCk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfdXRpbHMuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3Rlc3RfY3JlYXRlX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFkNjQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3Rlc3RfY3JlYXRlX3V0aWxzLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNkZWZpbmUgTUFYX0lOUFVUX0ZJTEVfTElORV9MRU5HVEggNTEyCisjZGVmaW5lIE1BWF9PVVRQVVRfRklMRV9MSU5FX0xFTkdUSCA1MTIKKworI2RlZmluZSBDT01NRU5UX0NIQVIgJyMnCisjZGVmaW5lIFZFUlNJT05fS0VZICJ2ZXJzaW9uIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2ludCByZWFkTGluZShGSUxFICppbnB1dEZpbGUsIGNoYXIgKmxpbmUsIGludCBzaXplKTsKKworYm9vbCBjaGVja1ZlcnNpb24oRklMRSAqaW5wdXRGaWxlLCBjb25zdCBjaGFyICp2ZXJzaW9uKTsKKwordm9pZCBjYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQqIHVzZXIsIHZvaWQgKmluZm8pOworCit0eXBlZGVmIGludCAoKnRlc3RfZnVuY190KShGSUxFICppbnB1dEZpbGUsIGludCBvdXRwdXRGaWxlRmQpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHRlc3RfZnVuY190IHRlc3RGdW5jKTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3RyYWNrX3Rlc3RfaW5wdXRfdjEuMF9yZWYudHh0IGIvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdHJhY2tfdGVzdF9pbnB1dF92MS4wX3JlZi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkyM2ZmMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3RyYWNrX3Rlc3RfaW5wdXRfdjEuMF9yZWYudHh0CkBAIC0wLDAgKzEsNDAgQEAKK3ZlcnNpb24gMS4wCisjIElucHV0IGZpbGUgZm9yIHRlc3RfY3JlYXRlX2F1ZGlvdHJhY2sKKyMgQWRkIG9uZSBsaW5lIGZvciBlYWNoIHRlc3RlZCBBdWRpb1RyYWNrIGNvbnN0cnVjdG9yIHdpdGggdGhlIGZvbGxvd2luZyBhcmd1bWVudHM6CisjIHNhbXBsZVJhdGUgZm9ybWF0IAljaGFubmVsTWFzayBmcmFtZUNvdW50IG5vdGlmaWNhdGlvbkZyYW1lcyBzaGFyZWRCdWZmZXIgZmxhZ3Mgc2Vzc2lvbklkIHVzYWdlIGNvbnRlbnRUeXBlCisjIHNhbXBsZSByYXRlIHRlc3RzCisgIDQ4MDAwICAgICAgMHgxICAgIAkweDMgICAgICAgICA0ODAwICAgICAgIDI0MDAgICAgICAgICAgICAgICAwICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDEgICAgIDIKKyAgMjQwMDAgICAgICAweDEgICAgCTB4MyAgICAgICAgIDQ4MDAgICAgICAgMjQwMCAgICAgICAgICAgICAgIDAgICAgICAgICAgICAweDAgICAwICAgICAgICAgMSAgICAgMgorICAxNjAwMCAgICAgIDB4MSAgICAJMHgzICAgICAgICAgNDgwMCAgICAgICAyNDAwICAgICAgICAgICAgICAgMCAgICAgICAgICAgIDB4MCAgIDAgICAgICAgICAxICAgICAyCisgICA4MDAwICAgICAgMHgxICAgIAkweDMgICAgICAgICA0ODAwICAgICAgIDI0MDAgICAgICAgICAgICAgICAwICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDEgICAgIDIKKyAgNDQxMDAgICAgICAweDEgICAgCTB4MyAgICAgICAgIDQ0MTAgICAgICAgMjIwNSAgICAgICAgICAgICAgIDAgICAgICAgICAgICAweDAgICAwICAgICAgICAgMSAgICAgMgorICAyMjA1MCAgICAgIDB4MSAgICAJMHgzICAgICAgICAgNDQxMCAgICAgICAyMjA1ICAgICAgICAgICAgICAgMCAgICAgICAgICAgIDB4MCAgIDAgICAgICAgICAxICAgICAyCisgIDExMDI1ICAgICAgMHgxICAgIAkweDMgICAgICAgICA0NDEwICAgICAgIDIyMDUgICAgICAgICAgICAgICAwICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDEgICAgIDIKKyMgZm9ybWF0IHRlc3RzCisgIDQ4MDAwICAgICAgMHgyICAgIAkweDMgICAgICAgICA0ODAwICAgICAgIDI0MDAgICAgICAgICAgICAgICAwICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDEgICAgIDIKKyAgNDgwMDAgICAgICAweDMgICAgCTB4MyAgICAgICAgIDQ4MDAgICAgICAgMjQwMCAgICAgICAgICAgICAgIDAgICAgICAgICAgICAweDAgICAwICAgICAgICAgMSAgICAgMgorICA0ODAwMCAgICAgIDB4NSAgICAJMHgzICAgICAgICAgNDgwMCAgICAgICAyNDAwICAgICAgICAgICAgICAgMCAgICAgICAgICAgIDB4MCAgIDAgICAgICAgICAxICAgICAyCisjIGNoYW5uZWwgbWFzayB0ZXN0cworICA0ODAwMCAgICAgIDB4MSAgICAJMHgxICAgICAgICAgNDgwMCAgICAgICAyNDAwICAgICAgICAgICAgICAgMCAgICAgICAgICAgIDB4MCAgIDAgICAgICAgICAxICAgICAyCisgIDQ4MDAwICAgICAgMHgxICAgIAkweDNGICAgICAgICA0ODAwICAgICAgIDI0MDAgICAgICAgICAgICAgICAwICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDEgICAgIDIKKyAgNDgwMDAgICAgICAweDEgICAgCTB4NjNGICAgICAgIDQ4MDAgICAgICAgMjQwMCAgICAgICAgICAgICAgIDAgICAgICAgICAgICAweDAgICAwICAgICAgICAgMSAgICAgMgorIyBmcmFtZWNvdW50IHRlc3RzCisgIDQ4MDAwICAgICAgMHgxICAgIAkweDMgICAgICAgICAwICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDEgICAgIDIKKyAgNDgwMDAgICAgICAweDEgICAgCTB4MyAgICAgICAgIDQ4MDAwICAgICAgMCAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAweDAgICAwICAgICAgICAgMSAgICAgMgorICA0ODAwMCAgICAgIDB4MSAgICAJMHgzICAgICAgICAgMCAgICAgICAgICAtMiAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgIDB4NCAgIDAgICAgICAgICAxICAgICAyCisjIHNoYXJlZCBtZW1vcnkgdGVzdHMKKyAgNDgwMDAgICAgICAweDEgICAgCTB4MyAgICAgICAgIDQ4MDAgICAgICAgMjQwMCAgICAgICAgICAgICAgIDEgICAgICAgICAgICAweDAgICAwICAgICAgICAgMSAgICAgMgorICA0ODAwMCAgICAgIDB4MSAgICAJMHgzICAgICAgICAgNDgwMCAgICAgICAyNDAwICAgICAgICAgICAgICAgMSAgICAgICAgICAgIDB4NCAgIDAgICAgICAgICAxICAgICAyCisjIGZsYWdzIHRlc3QKKyAgNDgwMDAgICAgICAweDEgICAgCTB4MyAgICAgICAgIDQ4MDAgICAgICAgMjQwMCAgICAgICAgICAgICAgIDAgICAgICAgICAgICAweDQgICAwICAgICAgICAgMSAgICAgMgorICA0ODAwMCAgICAgIDB4MSAgICAJMHgzICAgICAgICAgNDgwMCAgICAgICAyNDAwICAgICAgICAgICAgICAgMCAgICAgICAgICAgIDB4OCAgIDAgICAgICAgICAxICAgICAyCisgIDQ0MTAwICAgICAgMHgxMDAwMDAwICAweDMgICAgICAgICA0ODAwICAgICAgIDI0MDAgICAgICAgICAgICAgICAwICAgICAgICAgICAgMHgxMSAgMCAgICAgICAgIDEgICAgIDIKKyMgc2Vzc2lvbiB0ZXN0cworICA0ODAwMCAgICAgIDB4MSAgICAJMHgzICAgICAgICAgNDgwMCAgICAgICAyNDAwICAgICAgICAgICAgICAgMCAgICAgICAgICAgIDB4MCAgIDEwMDEgICAgICAxICAgICAyCisjIGF0dHJpYnV0ZXMgdGVzdHMKKyAgNDgwMDAgICAgICAweDEgICAgCTB4MyAgICAgICAgIDQ4MDAgICAgICAgMjQwMCAgICAgICAgICAgICAgIDAgICAgICAgICAgICAweDAgICAwICAgICAgICAgMCAgICAgMAorICA0ODAwMCAgICAgIDB4MSAgICAJMHgzICAgICAgICAgNDgwMCAgICAgICAyNDAwICAgICAgICAgICAgICAgMCAgICAgICAgICAgIDB4MCAgIDAgICAgICAgICAyICAgICAxCisgIDQ4MDAwICAgICAgMHgxICAgIAkweDMgICAgICAgICA0ODAwICAgICAgIDI0MDAgICAgICAgICAgICAgICAwICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDQgICAgIDIKKyAgNDgwMDAgICAgICAweDEgICAgCTB4MyAgICAgICAgIDQ4MDAgICAgICAgMjQwMCAgICAgICAgICAgICAgIDAgICAgICAgICAgICAweDAgICAwICAgICAgICAgNSAgICAgMgorICA0ODAwMCAgICAgIDB4MSAgICAJMHgzICAgICAgICAgNDgwMCAgICAgICAyNDAwICAgICAgICAgICAgICAgMCAgICAgICAgICAgIDB4MCAgIDAgICAgICAgICAxMSAgICAxCisgIDQ4MDAwICAgICAgMHgxICAgIAkweDMgICAgICAgICA0ODAwICAgICAgIDI0MDAgICAgICAgICAgICAgICAwICAgICAgICAgICAgMHgwICAgMCAgICAgICAgIDEyICAgIDEKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3RyYWNrX3Rlc3Rfb3V0cHV0X3YxLjBfcmVmX3dhbGxleWUudHh0IGIvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdHJhY2tfdGVzdF9vdXRwdXRfdjEuMF9yZWZfd2FsbGV5ZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZlNDMzYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3RyYWNrX3Rlc3Rfb3V0cHV0X3YxLjBfcmVmX3dhbGxleWUudHh0CkBAIC0wLDAgKzEsMzA4IEBACisKKyMjIyMgVGVzdCAxIHN0YXR1cyAwCisgQXVkaW9UcmFjazo6ZHVtcAorICBzdGF0dXMoMCksIHN0YXRlKDEpLCBzZXNzaW9uIElkKDQ5KSwgZmxhZ3MoMCkKKyAgc3RyZWFtIHR5cGUoMyksIGxlZnQgLSByaWdodCB2b2x1bWUoMS4wMDAwMDAsIDEuMDAwMDAwKQorICBmb3JtYXQoMSksIGNoYW5uZWwgbWFzaygzKSwgY2hhbm5lbCBjb3VudCgyKQorICBzYW1wbGUgcmF0ZSg0ODAwMCksIG9yaWdpbmFsIHNhbXBsZSByYXRlKDQ4MDAwKSwgc3BlZWQoMS4wMDAwMDApCisgIGZyYW1lIGNvdW50KDQ4MDApLCByZXEuIGZyYW1lIGNvdW50KDQ4MDApCisgIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwKSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMjQwMCksIHJlcS4gbm90aWYuIHBlciBidWZmKDApCisgIGxhdGVuY3kgKDE1MCksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgyKQorICBvdXRwdXQoMTMpIEFGIGxhdGVuY3kgKDUwKSBBRiBmcmFtZSBjb3VudCg5NjApIEFGIFNhbXBsZVJhdGUoNDgwMDApCisKKyMjIyMgVGVzdCAyIHN0YXR1cyAwCisgQXVkaW9UcmFjazo6ZHVtcAorICBzdGF0dXMoMCksIHN0YXRlKDEpLCBzZXNzaW9uIElkKDU3KSwgZmxhZ3MoMCkKKyAgc3RyZWFtIHR5cGUoMyksIGxlZnQgLSByaWdodCB2b2x1bWUoMS4wMDAwMDAsIDEuMDAwMDAwKQorICBmb3JtYXQoMSksIGNoYW5uZWwgbWFzaygzKSwgY2hhbm5lbCBjb3VudCgyKQorICBzYW1wbGUgcmF0ZSgyNDAwMCksIG9yaWdpbmFsIHNhbXBsZSByYXRlKDI0MDAwKSwgc3BlZWQoMS4wMDAwMDApCisgIGZyYW1lIGNvdW50KDQ4MDApLCByZXEuIGZyYW1lIGNvdW50KDQ4MDApCisgIG5vdGlmLiBmcmFtZSBjb3VudCgxNjAwKSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMjQwMCksIHJlcS4gbm90aWYuIHBlciBidWZmKDApCisgIGxhdGVuY3kgKDI1MCksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgyKQorICBvdXRwdXQoMTMpIEFGIGxhdGVuY3kgKDUwKSBBRiBmcmFtZSBjb3VudCg5NjApIEFGIFNhbXBsZVJhdGUoNDgwMDApCisKKyMjIyMgVGVzdCAzIHN0YXR1cyAwCisgQXVkaW9UcmFjazo6ZHVtcAorICBzdGF0dXMoMCksIHN0YXRlKDEpLCBzZXNzaW9uIElkKDY1KSwgZmxhZ3MoMCkKKyAgc3RyZWFtIHR5cGUoMyksIGxlZnQgLSByaWdodCB2b2x1bWUoMS4wMDAwMDAsIDEuMDAwMDAwKQorICBmb3JtYXQoMSksIGNoYW5uZWwgbWFzaygzKSwgY2hhbm5lbCBjb3VudCgyKQorICBzYW1wbGUgcmF0ZSgxNjAwMCksIG9yaWdpbmFsIHNhbXBsZSByYXRlKDE2MDAwKSwgc3BlZWQoMS4wMDAwMDApCisgIGZyYW1lIGNvdW50KDQ4MDApLCByZXEuIGZyYW1lIGNvdW50KDQ4MDApCisgIG5vdGlmLiBmcmFtZSBjb3VudCgxNjAwKSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMjQwMCksIHJlcS4gbm90aWYuIHBlciBidWZmKDApCisgIGxhdGVuY3kgKDM1MCksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgyKQorICBvdXRwdXQoMTMpIEFGIGxhdGVuY3kgKDUwKSBBRiBmcmFtZSBjb3VudCg5NjApIEFGIFNhbXBsZVJhdGUoNDgwMDApCisKKyMjIyMgVGVzdCA0IHN0YXR1cyAwCisgQXVkaW9UcmFjazo6ZHVtcAorICBzdGF0dXMoMCksIHN0YXRlKDEpLCBzZXNzaW9uIElkKDczKSwgZmxhZ3MoMCkKKyAgc3RyZWFtIHR5cGUoMyksIGxlZnQgLSByaWdodCB2b2x1bWUoMS4wMDAwMDAsIDEuMDAwMDAwKQorICBmb3JtYXQoMSksIGNoYW5uZWwgbWFzaygzKSwgY2hhbm5lbCBjb3VudCgyKQorICBzYW1wbGUgcmF0ZSg4MDAwKSwgb3JpZ2luYWwgc2FtcGxlIHJhdGUoODAwMCksIHNwZWVkKDEuMDAwMDAwKQorICBmcmFtZSBjb3VudCg0ODAwKSwgcmVxLiBmcmFtZSBjb3VudCg0ODAwKQorICBub3RpZi4gZnJhbWUgY291bnQoMTYwMCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDI0MDApLCByZXEuIG5vdGlmLiBwZXIgYnVmZigwKQorICBsYXRlbmN5ICg2NTApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMikKKyAgb3V0cHV0KDEzKSBBRiBsYXRlbmN5ICg1MCkgQUYgZnJhbWUgY291bnQoOTYwKSBBRiBTYW1wbGVSYXRlKDQ4MDAwKQorCisjIyMjIFRlc3QgNSBzdGF0dXMgMAorIEF1ZGlvVHJhY2s6OmR1bXAKKyAgc3RhdHVzKDApLCBzdGF0ZSgxKSwgc2Vzc2lvbiBJZCg4MSksIGZsYWdzKDApCisgIHN0cmVhbSB0eXBlKDMpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKDEuMDAwMDAwLCAxLjAwMDAwMCkKKyAgZm9ybWF0KDEpLCBjaGFubmVsIG1hc2soMyksIGNoYW5uZWwgY291bnQoMikKKyAgc2FtcGxlIHJhdGUoNDQxMDApLCBvcmlnaW5hbCBzYW1wbGUgcmF0ZSg0NDEwMCksIHNwZWVkKDEuMDAwMDAwKQorICBmcmFtZSBjb3VudCg0NDEwKSwgcmVxLiBmcmFtZSBjb3VudCg0NDEwKQorICBub3RpZi4gZnJhbWUgY291bnQoMTQ3MCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDIyMDUpLCByZXEuIG5vdGlmLiBwZXIgYnVmZigwKQorICBsYXRlbmN5ICgxNTApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMikKKyAgb3V0cHV0KDEzKSBBRiBsYXRlbmN5ICg1MCkgQUYgZnJhbWUgY291bnQoOTYwKSBBRiBTYW1wbGVSYXRlKDQ4MDAwKQorCisjIyMjIFRlc3QgNiBzdGF0dXMgMAorIEF1ZGlvVHJhY2s6OmR1bXAKKyAgc3RhdHVzKDApLCBzdGF0ZSgxKSwgc2Vzc2lvbiBJZCg4OSksIGZsYWdzKDApCisgIHN0cmVhbSB0eXBlKDMpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKDEuMDAwMDAwLCAxLjAwMDAwMCkKKyAgZm9ybWF0KDEpLCBjaGFubmVsIG1hc2soMyksIGNoYW5uZWwgY291bnQoMikKKyAgc2FtcGxlIHJhdGUoMjIwNTApLCBvcmlnaW5hbCBzYW1wbGUgcmF0ZSgyMjA1MCksIHNwZWVkKDEuMDAwMDAwKQorICBmcmFtZSBjb3VudCg0NDEwKSwgcmVxLiBmcmFtZSBjb3VudCg0NDEwKQorICBub3RpZi4gZnJhbWUgY291bnQoMTQ3MCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDIyMDUpLCByZXEuIG5vdGlmLiBwZXIgYnVmZigwKQorICBsYXRlbmN5ICgyNTApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMikKKyAgb3V0cHV0KDEzKSBBRiBsYXRlbmN5ICg1MCkgQUYgZnJhbWUgY291bnQoOTYwKSBBRiBTYW1wbGVSYXRlKDQ4MDAwKQorCisjIyMjIFRlc3QgNyBzdGF0dXMgMAorIEF1ZGlvVHJhY2s6OmR1bXAKKyAgc3RhdHVzKDApLCBzdGF0ZSgxKSwgc2Vzc2lvbiBJZCg5NyksIGZsYWdzKDApCisgIHN0cmVhbSB0eXBlKDMpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKDEuMDAwMDAwLCAxLjAwMDAwMCkKKyAgZm9ybWF0KDEpLCBjaGFubmVsIG1hc2soMyksIGNoYW5uZWwgY291bnQoMikKKyAgc2FtcGxlIHJhdGUoMTEwMjUpLCBvcmlnaW5hbCBzYW1wbGUgcmF0ZSgxMTAyNSksIHNwZWVkKDEuMDAwMDAwKQorICBmcmFtZSBjb3VudCg0NDEwKSwgcmVxLiBmcmFtZSBjb3VudCg0NDEwKQorICBub3RpZi4gZnJhbWUgY291bnQoMTQ3MCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDIyMDUpLCByZXEuIG5vdGlmLiBwZXIgYnVmZigwKQorICBsYXRlbmN5ICg0NTApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMikKKyAgb3V0cHV0KDEzKSBBRiBsYXRlbmN5ICg1MCkgQUYgZnJhbWUgY291bnQoOTYwKSBBRiBTYW1wbGVSYXRlKDQ4MDAwKQorCisjIyMjIFRlc3QgOCBzdGF0dXMgMAorIEF1ZGlvVHJhY2s6OmR1bXAKKyAgc3RhdHVzKDApLCBzdGF0ZSgxKSwgc2Vzc2lvbiBJZCgxMDUpLCBmbGFncygwKQorICBzdHJlYW0gdHlwZSgzKSwgbGVmdCAtIHJpZ2h0IHZvbHVtZSgxLjAwMDAwMCwgMS4wMDAwMDApCisgIGZvcm1hdCgyKSwgY2hhbm5lbCBtYXNrKDMpLCBjaGFubmVsIGNvdW50KDIpCisgIHNhbXBsZSByYXRlKDQ4MDAwKSwgb3JpZ2luYWwgc2FtcGxlIHJhdGUoNDgwMDApLCBzcGVlZCgxLjAwMDAwMCkKKyAgZnJhbWUgY291bnQoNDgwMCksIHJlcS4gZnJhbWUgY291bnQoNDgwMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDI0MDApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwKSwgcmVxLiBub3RpZi4gcGVyIGJ1ZmYoMCkKKyAgbGF0ZW5jeSAoMTUwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDIpCisgIG91dHB1dCgxMykgQUYgbGF0ZW5jeSAoNTApIEFGIGZyYW1lIGNvdW50KDk2MCkgQUYgU2FtcGxlUmF0ZSg0ODAwMCkKKworIyMjIyBUZXN0IDkgc3RhdHVzIDAKKyBBdWRpb1RyYWNrOjpkdW1wCisgIHN0YXR1cygwKSwgc3RhdGUoMSksIHNlc3Npb24gSWQoMTEzKSwgZmxhZ3MoMCkKKyAgc3RyZWFtIHR5cGUoMyksIGxlZnQgLSByaWdodCB2b2x1bWUoMS4wMDAwMDAsIDEuMDAwMDAwKQorICBmb3JtYXQoMyksIGNoYW5uZWwgbWFzaygzKSwgY2hhbm5lbCBjb3VudCgyKQorICBzYW1wbGUgcmF0ZSg0ODAwMCksIG9yaWdpbmFsIHNhbXBsZSByYXRlKDQ4MDAwKSwgc3BlZWQoMS4wMDAwMDApCisgIGZyYW1lIGNvdW50KDQ4MDApLCByZXEuIGZyYW1lIGNvdW50KDQ4MDApCisgIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwKSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMjQwMCksIHJlcS4gbm90aWYuIHBlciBidWZmKDApCisgIGxhdGVuY3kgKDE4MCksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgyKQorICBvdXRwdXQoMjkpIEFGIGxhdGVuY3kgKDgwKSBBRiBmcmFtZSBjb3VudCgxOTIwKSBBRiBTYW1wbGVSYXRlKDQ4MDAwKQorCisjIyMjIFRlc3QgMTAgc3RhdHVzIDAKKyBBdWRpb1RyYWNrOjpkdW1wCisgIHN0YXR1cygwKSwgc3RhdGUoMSksIHNlc3Npb24gSWQoMTIxKSwgZmxhZ3MoMCkKKyAgc3RyZWFtIHR5cGUoMyksIGxlZnQgLSByaWdodCB2b2x1bWUoMS4wMDAwMDAsIDEuMDAwMDAwKQorICBmb3JtYXQoNSksIGNoYW5uZWwgbWFzaygzKSwgY2hhbm5lbCBjb3VudCgyKQorICBzYW1wbGUgcmF0ZSg0ODAwMCksIG9yaWdpbmFsIHNhbXBsZSByYXRlKDQ4MDAwKSwgc3BlZWQoMS4wMDAwMDApCisgIGZyYW1lIGNvdW50KDQ4MDApLCByZXEuIGZyYW1lIGNvdW50KDQ4MDApCisgIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwKSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMjQwMCksIHJlcS4gbm90aWYuIHBlciBidWZmKDApCisgIGxhdGVuY3kgKDE4MCksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgyKQorICBvdXRwdXQoMjkpIEFGIGxhdGVuY3kgKDgwKSBBRiBmcmFtZSBjb3VudCgxOTIwKSBBRiBTYW1wbGVSYXRlKDQ4MDAwKQorCisjIyMjIFRlc3QgMTEgc3RhdHVzIDAKKyBBdWRpb1RyYWNrOjpkdW1wCisgIHN0YXR1cygwKSwgc3RhdGUoMSksIHNlc3Npb24gSWQoMTI5KSwgZmxhZ3MoMCkKKyAgc3RyZWFtIHR5cGUoMyksIGxlZnQgLSByaWdodCB2b2x1bWUoMS4wMDAwMDAsIDEuMDAwMDAwKQorICBmb3JtYXQoMSksIGNoYW5uZWwgbWFzaygxKSwgY2hhbm5lbCBjb3VudCgxKQorICBzYW1wbGUgcmF0ZSg0ODAwMCksIG9yaWdpbmFsIHNhbXBsZSByYXRlKDQ4MDAwKSwgc3BlZWQoMS4wMDAwMDApCisgIGZyYW1lIGNvdW50KDQ4MDApLCByZXEuIGZyYW1lIGNvdW50KDQ4MDApCisgIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwKSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMjQwMCksIHJlcS4gbm90aWYuIHBlciBidWZmKDApCisgIGxhdGVuY3kgKDE1MCksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgyKQorICBvdXRwdXQoMTMpIEFGIGxhdGVuY3kgKDUwKSBBRiBmcmFtZSBjb3VudCg5NjApIEFGIFNhbXBsZVJhdGUoNDgwMDApCisKKyMjIyMgVGVzdCAxMiBzdGF0dXMgMAorIEF1ZGlvVHJhY2s6OmR1bXAKKyAgc3RhdHVzKDApLCBzdGF0ZSgxKSwgc2Vzc2lvbiBJZCgxMzcpLCBmbGFncygwKQorICBzdHJlYW0gdHlwZSgzKSwgbGVmdCAtIHJpZ2h0IHZvbHVtZSgxLjAwMDAwMCwgMS4wMDAwMDApCisgIGZvcm1hdCgxKSwgY2hhbm5lbCBtYXNrKDNmKSwgY2hhbm5lbCBjb3VudCg2KQorICBzYW1wbGUgcmF0ZSg0ODAwMCksIG9yaWdpbmFsIHNhbXBsZSByYXRlKDQ4MDAwKSwgc3BlZWQoMS4wMDAwMDApCisgIGZyYW1lIGNvdW50KDQ4MDApLCByZXEuIGZyYW1lIGNvdW50KDQ4MDApCisgIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwKSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMjQwMCksIHJlcS4gbm90aWYuIHBlciBidWZmKDApCisgIGxhdGVuY3kgKDE1MCksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgyKQorICBvdXRwdXQoMTMpIEFGIGxhdGVuY3kgKDUwKSBBRiBmcmFtZSBjb3VudCg5NjApIEFGIFNhbXBsZVJhdGUoNDgwMDApCisKKyMjIyMgVGVzdCAxMyBzdGF0dXMgMAorIEF1ZGlvVHJhY2s6OmR1bXAKKyAgc3RhdHVzKDApLCBzdGF0ZSgxKSwgc2Vzc2lvbiBJZCgxNDUpLCBmbGFncygwKQorICBzdHJlYW0gdHlwZSgzKSwgbGVmdCAtIHJpZ2h0IHZvbHVtZSgxLjAwMDAwMCwgMS4wMDAwMDApCisgIGZvcm1hdCgxKSwgY2hhbm5lbCBtYXNrKDYzZiksIGNoYW5uZWwgY291bnQoOCkKKyAgc2FtcGxlIHJhdGUoNDgwMDApLCBvcmlnaW5hbCBzYW1wbGUgcmF0ZSg0ODAwMCksIHNwZWVkKDEuMDAwMDAwKQorICBmcmFtZSBjb3VudCg0ODAwKSwgcmVxLiBmcmFtZSBjb3VudCg0ODAwKQorICBub3RpZi4gZnJhbWUgY291bnQoMjQwMCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDI0MDApLCByZXEuIG5vdGlmLiBwZXIgYnVmZigwKQorICBsYXRlbmN5ICgxNTApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMikKKyAgb3V0cHV0KDEzKSBBRiBsYXRlbmN5ICg1MCkgQUYgZnJhbWUgY291bnQoOTYwKSBBRiBTYW1wbGVSYXRlKDQ4MDAwKQorCisjIyMjIFRlc3QgMTQgc3RhdHVzIDAKKyBBdWRpb1RyYWNrOjpkdW1wCisgIHN0YXR1cygwKSwgc3RhdGUoMSksIHNlc3Npb24gSWQoMTUzKSwgZmxhZ3MoMCkKKyAgc3RyZWFtIHR5cGUoMyksIGxlZnQgLSByaWdodCB2b2x1bWUoMS4wMDAwMDAsIDEuMDAwMDAwKQorICBmb3JtYXQoMSksIGNoYW5uZWwgbWFzaygzKSwgY2hhbm5lbCBjb3VudCgyKQorICBzYW1wbGUgcmF0ZSg0ODAwMCksIG9yaWdpbmFsIHNhbXBsZSByYXRlKDQ4MDAwKSwgc3BlZWQoMS4wMDAwMDApCisgIGZyYW1lIGNvdW50KDE5MjQpLCByZXEuIGZyYW1lIGNvdW50KDE5MjQpCisgIG5vdGlmLiBmcmFtZSBjb3VudCg5NjIpLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgwKSwgcmVxLiBub3RpZi4gcGVyIGJ1ZmYoMCkKKyAgbGF0ZW5jeSAoOTApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMikKKyAgb3V0cHV0KDEzKSBBRiBsYXRlbmN5ICg1MCkgQUYgZnJhbWUgY291bnQoOTYwKSBBRiBTYW1wbGVSYXRlKDQ4MDAwKQorCisjIyMjIFRlc3QgMTUgc3RhdHVzIDAKKyBBdWRpb1RyYWNrOjpkdW1wCisgIHN0YXR1cygwKSwgc3RhdGUoMSksIHNlc3Npb24gSWQoMTYxKSwgZmxhZ3MoMCkKKyAgc3RyZWFtIHR5cGUoMyksIGxlZnQgLSByaWdodCB2b2x1bWUoMS4wMDAwMDAsIDEuMDAwMDAwKQorICBmb3JtYXQoMSksIGNoYW5uZWwgbWFzaygzKSwgY2hhbm5lbCBjb3VudCgyKQorICBzYW1wbGUgcmF0ZSg0ODAwMCksIG9yaWdpbmFsIHNhbXBsZSByYXRlKDQ4MDAwKSwgc3BlZWQoMS4wMDAwMDApCisgIGZyYW1lIGNvdW50KDQ4MDAwKSwgcmVxLiBmcmFtZSBjb3VudCg0ODAwMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDI0MDAwKSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMCksIHJlcS4gbm90aWYuIHBlciBidWZmKDApCisgIGxhdGVuY3kgKDEwNTApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMikKKyAgb3V0cHV0KDEzKSBBRiBsYXRlbmN5ICg1MCkgQUYgZnJhbWUgY291bnQoOTYwKSBBRiBTYW1wbGVSYXRlKDQ4MDAwKQorCisjIyMjIFRlc3QgMTYgc3RhdHVzIDAKKyBBdWRpb1RyYWNrOjpkdW1wCisgIHN0YXR1cygwKSwgc3RhdGUoMSksIHNlc3Npb24gSWQoMTY5KSwgZmxhZ3MoNCkKKyAgc3RyZWFtIHR5cGUoMyksIGxlZnQgLSByaWdodCB2b2x1bWUoMS4wMDAwMDAsIDEuMDAwMDAwKQorICBmb3JtYXQoMSksIGNoYW5uZWwgbWFzaygzKSwgY2hhbm5lbCBjb3VudCgyKQorICBzYW1wbGUgcmF0ZSg0ODAwMCksIG9yaWdpbmFsIHNhbXBsZSByYXRlKDQ4MDAwKSwgc3BlZWQoMS4wMDAwMDApCisgIGZyYW1lIGNvdW50KDQ4MCksIHJlcS4gZnJhbWUgY291bnQoNDgwKQorICBub3RpZi4gZnJhbWUgY291bnQoMjQwKSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMCksIHJlcS4gbm90aWYuIHBlciBidWZmKDIpCisgIGxhdGVuY3kgKDYwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDIpCisgIG91dHB1dCgxMykgQUYgbGF0ZW5jeSAoNTApIEFGIGZyYW1lIGNvdW50KDk2MCkgQUYgU2FtcGxlUmF0ZSg0ODAwMCkKKworIyMjIyBUZXN0IDE3IHN0YXR1cyAwCisgQXVkaW9UcmFjazo6ZHVtcAorICBzdGF0dXMoMCksIHN0YXRlKDEpLCBzZXNzaW9uIElkKDE3NyksIGZsYWdzKDApCisgIHN0cmVhbSB0eXBlKDMpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKDEuMDAwMDAwLCAxLjAwMDAwMCkKKyAgZm9ybWF0KDEpLCBjaGFubmVsIG1hc2soMyksIGNoYW5uZWwgY291bnQoMikKKyAgc2FtcGxlIHJhdGUoNDgwMDApLCBvcmlnaW5hbCBzYW1wbGUgcmF0ZSg0ODAwMCksIHNwZWVkKDEuMDAwMDAwKQorICBmcmFtZSBjb3VudCg0ODAwKSwgcmVxLiBmcmFtZSBjb3VudCg0ODAwKQorICBub3RpZi4gZnJhbWUgY291bnQoMCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDApLCByZXEuIG5vdGlmLiBwZXIgYnVmZigwKQorICBsYXRlbmN5ICgxNTApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMikKKyAgb3V0cHV0KDEzKSBBRiBsYXRlbmN5ICg1MCkgQUYgZnJhbWUgY291bnQoOTYwKSBBRiBTYW1wbGVSYXRlKDQ4MDAwKQorCisjIyMjIFRlc3QgMTggc3RhdHVzIDAKKyBBdWRpb1RyYWNrOjpkdW1wCisgIHN0YXR1cygwKSwgc3RhdGUoMSksIHNlc3Npb24gSWQoMTg1KSwgZmxhZ3MoNCkKKyAgc3RyZWFtIHR5cGUoMyksIGxlZnQgLSByaWdodCB2b2x1bWUoMS4wMDAwMDAsIDEuMDAwMDAwKQorICBmb3JtYXQoMSksIGNoYW5uZWwgbWFzaygzKSwgY2hhbm5lbCBjb3VudCgyKQorICBzYW1wbGUgcmF0ZSg0ODAwMCksIG9yaWdpbmFsIHNhbXBsZSByYXRlKDQ4MDAwKSwgc3BlZWQoMS4wMDAwMDApCisgIGZyYW1lIGNvdW50KDQ4MDApLCByZXEuIGZyYW1lIGNvdW50KDQ4MDApCisgIG5vdGlmLiBmcmFtZSBjb3VudCgwKSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMCksIHJlcS4gbm90aWYuIHBlciBidWZmKDApCisgIGxhdGVuY3kgKDE1MCksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgyKQorICBvdXRwdXQoMTMpIEFGIGxhdGVuY3kgKDUwKSBBRiBmcmFtZSBjb3VudCg5NjApIEFGIFNhbXBsZVJhdGUoNDgwMDApCisKKyMjIyMgVGVzdCAxOSBzdGF0dXMgMAorIEF1ZGlvVHJhY2s6OmR1bXAKKyAgc3RhdHVzKDApLCBzdGF0ZSgxKSwgc2Vzc2lvbiBJZCgxOTMpLCBmbGFncyg0KQorICBzdHJlYW0gdHlwZSgzKSwgbGVmdCAtIHJpZ2h0IHZvbHVtZSgxLjAwMDAwMCwgMS4wMDAwMDApCisgIGZvcm1hdCgxKSwgY2hhbm5lbCBtYXNrKDMpLCBjaGFubmVsIGNvdW50KDIpCisgIHNhbXBsZSByYXRlKDQ4MDAwKSwgb3JpZ2luYWwgc2FtcGxlIHJhdGUoNDgwMDApLCBzcGVlZCgxLjAwMDAwMCkKKyAgZnJhbWUgY291bnQoNDgwMCksIHJlcS4gZnJhbWUgY291bnQoNDgwMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDI0MCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDI0MDApLCByZXEuIG5vdGlmLiBwZXIgYnVmZigwKQorICBsYXRlbmN5ICgxNTApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMikKKyAgb3V0cHV0KDEzKSBBRiBsYXRlbmN5ICg1MCkgQUYgZnJhbWUgY291bnQoOTYwKSBBRiBTYW1wbGVSYXRlKDQ4MDAwKQorCisjIyMjIFRlc3QgMjAgc3RhdHVzIDAKKyBBdWRpb1RyYWNrOjpkdW1wCisgIHN0YXR1cygwKSwgc3RhdGUoMSksIHNlc3Npb24gSWQoMjAxKSwgZmxhZ3MoOCkKKyAgc3RyZWFtIHR5cGUoMyksIGxlZnQgLSByaWdodCB2b2x1bWUoMS4wMDAwMDAsIDEuMDAwMDAwKQorICBmb3JtYXQoMSksIGNoYW5uZWwgbWFzaygzKSwgY2hhbm5lbCBjb3VudCgyKQorICBzYW1wbGUgcmF0ZSg0ODAwMCksIG9yaWdpbmFsIHNhbXBsZSByYXRlKDQ4MDAwKSwgc3BlZWQoMS4wMDAwMDApCisgIGZyYW1lIGNvdW50KDQ4MDApLCByZXEuIGZyYW1lIGNvdW50KDQ4MDApCisgIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwKSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMjQwMCksIHJlcS4gbm90aWYuIHBlciBidWZmKDApCisgIGxhdGVuY3kgKDE4MCksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgyKQorICBvdXRwdXQoMjkpIEFGIGxhdGVuY3kgKDgwKSBBRiBmcmFtZSBjb3VudCgxOTIwKSBBRiBTYW1wbGVSYXRlKDQ4MDAwKQorCisjIyMjIFRlc3QgMjEgc3RhdHVzIDAKKyBBdWRpb1RyYWNrOjpkdW1wCisgIHN0YXR1cygwKSwgc3RhdGUoMSksIHNlc3Npb24gSWQoMjA5KSwgZmxhZ3MoMTEpCisgIHN0cmVhbSB0eXBlKDMpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKDEuMDAwMDAwLCAxLjAwMDAwMCkKKyAgZm9ybWF0KDEwMDAwMDApLCBjaGFubmVsIG1hc2soMyksIGNoYW5uZWwgY291bnQoMikKKyAgc2FtcGxlIHJhdGUoNDQxMDApLCBvcmlnaW5hbCBzYW1wbGUgcmF0ZSg0NDEwMCksIHNwZWVkKDEuMDAwMDAwKQorICBmcmFtZSBjb3VudCg0ODAwKSwgcmVxLiBmcmFtZSBjb3VudCg0ODAwKQorICBub3RpZi4gZnJhbWUgY291bnQoNDgwMCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDI0MDApLCByZXEuIG5vdGlmLiBwZXIgYnVmZigwKQorICBsYXRlbmN5ICgyMDQpLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMikKKyAgb3V0cHV0KDUzKSBBRiBsYXRlbmN5ICg5NikgQUYgZnJhbWUgY291bnQoMjYyMTQ0KSBBRiBTYW1wbGVSYXRlKDQ0MTAwKQorCisjIyMjIFRlc3QgMjIgc3RhdHVzIDAKKyBBdWRpb1RyYWNrOjpkdW1wCisgIHN0YXR1cygwKSwgc3RhdGUoMSksIHNlc3Npb24gSWQoMTAwMSksIGZsYWdzKDApCisgIHN0cmVhbSB0eXBlKDMpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKDEuMDAwMDAwLCAxLjAwMDAwMCkKKyAgZm9ybWF0KDEpLCBjaGFubmVsIG1hc2soMyksIGNoYW5uZWwgY291bnQoMikKKyAgc2FtcGxlIHJhdGUoNDgwMDApLCBvcmlnaW5hbCBzYW1wbGUgcmF0ZSg0ODAwMCksIHNwZWVkKDEuMDAwMDAwKQorICBmcmFtZSBjb3VudCg0ODAwKSwgcmVxLiBmcmFtZSBjb3VudCg0ODAwKQorICBub3RpZi4gZnJhbWUgY291bnQoMjQwMCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDI0MDApLCByZXEuIG5vdGlmLiBwZXIgYnVmZigwKQorICBsYXRlbmN5ICgxNTApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMikKKyAgb3V0cHV0KDEzKSBBRiBsYXRlbmN5ICg1MCkgQUYgZnJhbWUgY291bnQoOTYwKSBBRiBTYW1wbGVSYXRlKDQ4MDAwKQorCisjIyMjIFRlc3QgMjMgc3RhdHVzIDAKKyBBdWRpb1RyYWNrOjpkdW1wCisgIHN0YXR1cygwKSwgc3RhdGUoMSksIHNlc3Npb24gSWQoMjE3KSwgZmxhZ3MoMCkKKyAgc3RyZWFtIHR5cGUoMyksIGxlZnQgLSByaWdodCB2b2x1bWUoMS4wMDAwMDAsIDEuMDAwMDAwKQorICBmb3JtYXQoMSksIGNoYW5uZWwgbWFzaygzKSwgY2hhbm5lbCBjb3VudCgyKQorICBzYW1wbGUgcmF0ZSg0ODAwMCksIG9yaWdpbmFsIHNhbXBsZSByYXRlKDQ4MDAwKSwgc3BlZWQoMS4wMDAwMDApCisgIGZyYW1lIGNvdW50KDQ4MDApLCByZXEuIGZyYW1lIGNvdW50KDQ4MDApCisgIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwKSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMjQwMCksIHJlcS4gbm90aWYuIHBlciBidWZmKDApCisgIGxhdGVuY3kgKDE1MCksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgyKQorICBvdXRwdXQoMTMpIEFGIGxhdGVuY3kgKDUwKSBBRiBmcmFtZSBjb3VudCg5NjApIEFGIFNhbXBsZVJhdGUoNDgwMDApCisKKyMjIyMgVGVzdCAyNCBzdGF0dXMgMAorIEF1ZGlvVHJhY2s6OmR1bXAKKyAgc3RhdHVzKDApLCBzdGF0ZSgxKSwgc2Vzc2lvbiBJZCgyMjUpLCBmbGFncygwKQorICBzdHJlYW0gdHlwZSgwKSwgbGVmdCAtIHJpZ2h0IHZvbHVtZSgxLjAwMDAwMCwgMS4wMDAwMDApCisgIGZvcm1hdCgxKSwgY2hhbm5lbCBtYXNrKDMpLCBjaGFubmVsIGNvdW50KDIpCisgIHNhbXBsZSByYXRlKDQ4MDAwKSwgb3JpZ2luYWwgc2FtcGxlIHJhdGUoNDgwMDApLCBzcGVlZCgxLjAwMDAwMCkKKyAgZnJhbWUgY291bnQoNDgwMCksIHJlcS4gZnJhbWUgY291bnQoNDgwMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDI0MDApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwKSwgcmVxLiBub3RpZi4gcGVyIGJ1ZmYoMCkKKyAgbGF0ZW5jeSAoMTQwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDEpCisgIG91dHB1dCg0NSkgQUYgbGF0ZW5jeSAoNDApIEFGIGZyYW1lIGNvdW50KDk2MCkgQUYgU2FtcGxlUmF0ZSg0ODAwMCkKKworIyMjIyBUZXN0IDI1IHN0YXR1cyAwCisgQXVkaW9UcmFjazo6ZHVtcAorICBzdGF0dXMoMCksIHN0YXRlKDEpLCBzZXNzaW9uIElkKDIzMyksIGZsYWdzKDApCisgIHN0cmVhbSB0eXBlKDQpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKDEuMDAwMDAwLCAxLjAwMDAwMCkKKyAgZm9ybWF0KDEpLCBjaGFubmVsIG1hc2soMyksIGNoYW5uZWwgY291bnQoMikKKyAgc2FtcGxlIHJhdGUoNDgwMDApLCBvcmlnaW5hbCBzYW1wbGUgcmF0ZSg0ODAwMCksIHNwZWVkKDEuMDAwMDAwKQorICBmcmFtZSBjb3VudCg0ODAwKSwgcmVxLiBmcmFtZSBjb3VudCg0ODAwKQorICBub3RpZi4gZnJhbWUgY291bnQoMjQwMCksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KDI0MDApLCByZXEuIG5vdGlmLiBwZXIgYnVmZigwKQorICBsYXRlbmN5ICgxNTApLCBzZWxlY3RlZCBkZXZpY2UgSWQoMCksIHJvdXRlZCBkZXZpY2UgSWQoMykKKyAgb3V0cHV0KDEzKSBBRiBsYXRlbmN5ICg1MCkgQUYgZnJhbWUgY291bnQoOTYwKSBBRiBTYW1wbGVSYXRlKDQ4MDAwKQorCisjIyMjIFRlc3QgMjYgc3RhdHVzIDAKKyBBdWRpb1RyYWNrOjpkdW1wCisgIHN0YXR1cygwKSwgc3RhdGUoMSksIHNlc3Npb24gSWQoMjQxKSwgZmxhZ3MoMCkKKyAgc3RyZWFtIHR5cGUoNSksIGxlZnQgLSByaWdodCB2b2x1bWUoMS4wMDAwMDAsIDEuMDAwMDAwKQorICBmb3JtYXQoMSksIGNoYW5uZWwgbWFzaygzKSwgY2hhbm5lbCBjb3VudCgyKQorICBzYW1wbGUgcmF0ZSg0ODAwMCksIG9yaWdpbmFsIHNhbXBsZSByYXRlKDQ4MDAwKSwgc3BlZWQoMS4wMDAwMDApCisgIGZyYW1lIGNvdW50KDQ4MDApLCByZXEuIGZyYW1lIGNvdW50KDQ4MDApCisgIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwKSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMjQwMCksIHJlcS4gbm90aWYuIHBlciBidWZmKDApCisgIGxhdGVuY3kgKDE1MCksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgzKQorICBvdXRwdXQoMTMpIEFGIGxhdGVuY3kgKDUwKSBBRiBmcmFtZSBjb3VudCg5NjApIEFGIFNhbXBsZVJhdGUoNDgwMDApCisKKyMjIyMgVGVzdCAyNyBzdGF0dXMgMAorIEF1ZGlvVHJhY2s6OmR1bXAKKyAgc3RhdHVzKDApLCBzdGF0ZSgxKSwgc2Vzc2lvbiBJZCgyNDkpLCBmbGFncygwKQorICBzdHJlYW0gdHlwZSgxMCksIGxlZnQgLSByaWdodCB2b2x1bWUoMS4wMDAwMDAsIDEuMDAwMDAwKQorICBmb3JtYXQoMSksIGNoYW5uZWwgbWFzaygzKSwgY2hhbm5lbCBjb3VudCgyKQorICBzYW1wbGUgcmF0ZSg0ODAwMCksIG9yaWdpbmFsIHNhbXBsZSByYXRlKDQ4MDAwKSwgc3BlZWQoMS4wMDAwMDApCisgIGZyYW1lIGNvdW50KDQ4MDApLCByZXEuIGZyYW1lIGNvdW50KDQ4MDApCisgIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwKSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoMjQwMCksIHJlcS4gbm90aWYuIHBlciBidWZmKDApCisgIGxhdGVuY3kgKDE1MCksIHNlbGVjdGVkIGRldmljZSBJZCgwKSwgcm91dGVkIGRldmljZSBJZCgyKQorICBvdXRwdXQoMTMpIEFGIGxhdGVuY3kgKDUwKSBBRiBmcmFtZSBjb3VudCg5NjApIEFGIFNhbXBsZVJhdGUoNDgwMDApCisKKyMjIyMgVGVzdCAyOCBzdGF0dXMgMAorIEF1ZGlvVHJhY2s6OmR1bXAKKyAgc3RhdHVzKDApLCBzdGF0ZSgxKSwgc2Vzc2lvbiBJZCgyNTcpLCBmbGFncygwKQorICBzdHJlYW0gdHlwZSgzKSwgbGVmdCAtIHJpZ2h0IHZvbHVtZSgxLjAwMDAwMCwgMS4wMDAwMDApCisgIGZvcm1hdCgxKSwgY2hhbm5lbCBtYXNrKDMpLCBjaGFubmVsIGNvdW50KDIpCisgIHNhbXBsZSByYXRlKDQ4MDAwKSwgb3JpZ2luYWwgc2FtcGxlIHJhdGUoNDgwMDApLCBzcGVlZCgxLjAwMDAwMCkKKyAgZnJhbWUgY291bnQoNDgwMCksIHJlcS4gZnJhbWUgY291bnQoNDgwMCkKKyAgbm90aWYuIGZyYW1lIGNvdW50KDI0MDApLCByZXEuIG5vdGlmLiBmcmFtZSBjb3VudCgyNDAwKSwgcmVxLiBub3RpZi4gcGVyIGJ1ZmYoMCkKKyAgbGF0ZW5jeSAoMTUwKSwgc2VsZWN0ZWQgZGV2aWNlIElkKDApLCByb3V0ZWQgZGV2aWNlIElkKDIpCisgIG91dHB1dCgxMykgQUYgbGF0ZW5jeSAoNTApIEFGIGZyYW1lIGNvdW50KDk2MCkgQUYgU2FtcGxlUmF0ZSg0ODAwMCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc0YjQzNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTQgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliYXVkaW9oYWxAMi4wIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkRldmljZUhhbExvY2FsLmNwcCIsCisgICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAiLAorICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAiLAorICAgICAgICAiU3RyZWFtSGFsTG9jYWwuY3BwIiwKKworICAgICAgICAiQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIiwKKyAgICAgICAgIkRldmljZUhhbEhpZGwuY3BwIiwKKyAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAiLAorICAgICAgICAiRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAiLAorICAgICAgICAiRWZmZWN0SGFsSGlkbC5jcHAiLAorICAgICAgICAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCIsCisgICAgICAgICJTdHJlYW1IYWxIaWRsLmNwcCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2hhbF9kZWF0aGhhbmRsZXIiLAorICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmhhcmR3YXJlIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliZm1xIiwKKyAgICAgICAgImxpYmh3YmluZGVyIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGxtZW1vcnkiLAorICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25AMi4wLXV0aWwiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2hhbF9oZWFkZXJzIgorICAgIF0sCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJmbXEiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb2hhbC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvaGFsLzIuMC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQ29udmVyc2lvbkhlbHBlckhpZGwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGliYXVkaW9oYWwvQ29udmVyc2lvbkhlbHBlckhpZGwuaApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9oYWwvMi4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yjk5ZDcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbEhpZGwuY3BwCkBAIC0wLDAgKzEsMzY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlSGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lQcmltYXJ5RGV2aWNlLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgorI2luY2x1ZGUgIkhpZGxVdGlscy5oIgorI2luY2x1ZGUgIlN0cmVhbUhhbEhpZGwuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Db25maWc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0RldmljZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvSW5wdXRGbGFnOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9PdXRwdXRGbGFnOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9QYXRjaEhhbmRsZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvUG9ydDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvUG9ydENvbmZpZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvTW9kZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvU291cmNlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6SGlkbFV0aWxzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OkRldmljZUFkZHJlc3M7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVByaW1hcnlEZXZpY2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6UGFyYW1ldGVyVmFsdWU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6UmVzdWx0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCitzdGF0dXNfdCBkZXZpY2VBZGRyZXNzRnJvbUhhbCgKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgY29uc3QgY2hhciogaGFsQWRkcmVzcywgRGV2aWNlQWRkcmVzcyogYWRkcmVzcykgeworICAgIGFkZHJlc3MtPmRldmljZSA9IEF1ZGlvRGV2aWNlKGRldmljZSk7CisKKyAgICBpZiAoaGFsQWRkcmVzcyA9PSBudWxscHRyIHx8IHN0cm5sZW4oaGFsQWRkcmVzcywgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTikgPT0gMCkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIGNvbnN0IGJvb2wgaXNJbnB1dCA9IChkZXZpY2UgJiBBVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwOworICAgIGlmIChpc0lucHV0KSBkZXZpY2UgJj0gfkFVRElPX0RFVklDRV9CSVRfSU47CisgICAgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCkgIT0gMCkKKyAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFApICE9IDApKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKKyAgICAgICAgICAgICAgICAiJWhoWDolaGhYOiVoaFg6JWhoWDolaGhYOiVoaFgiLAorICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLm1hY1swXSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzFdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMl0sCisgICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzNdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbNF0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1s1XSk7CisgICAgICAgIHJldHVybiBzdGF0dXMgPT0gNiA/IE9LIDogQkFEX1ZBTFVFOworICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0lQKSAhPSAwKQorICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9JUCkgIT0gMCkpIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAorICAgICAgICAgICAgICAgICIlaGh1LiVoaHUuJWhodS4laGh1IiwKKyAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzBdLCAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzFdLAorICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMl0sICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbM10pOworICAgICAgICByZXR1cm4gc3RhdHVzID09IDQgPyBPSyA6IEJBRF9WQUxVRTsKKyAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfVVNCKSkgIT0gMAorICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9BTExfVVNCKSkgIT0gMCkgeworICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCisgICAgICAgICAgICAgICAgImNhcmQ9JWQ7ZGV2aWNlPSVkIiwKKyAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5hbHNhLmNhcmQsICZhZGRyZXNzLT5hZGRyZXNzLmFsc2EuZGV2aWNlKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSAyID8gT0sgOiBCQURfVkFMVUU7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQlVTKSAhPSAwKQorICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9CVVMpICE9IDApKSB7CisgICAgICAgIGlmIChoYWxBZGRyZXNzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGFkZHJlc3MtPmJ1c0FkZHJlc3MgPSBoYWxBZGRyZXNzOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCkpICE9IDAKKyAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCkgIT0gMCkpIHsKKyAgICAgICAgaWYgKGhhbEFkZHJlc3MgIT0gTlVMTCkgeworICAgICAgICAgICAgYWRkcmVzcy0+clN1Ym1peEFkZHJlc3MgPSBoYWxBZGRyZXNzOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0RldmljZUhhbEhpZGw6OkRldmljZUhhbEhpZGwoY29uc3Qgc3A8SURldmljZT4mIGRldmljZSkKKyAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiRGV2aWNlIiksIG1EZXZpY2UoZGV2aWNlKSwKKyAgICAgICAgICBtUHJpbWFyeURldmljZShJUHJpbWFyeURldmljZTo6Y2FzdEZyb20oZGV2aWNlKSkgeworfQorCitEZXZpY2VIYWxIaWRsOjp+RGV2aWNlSGFsSGlkbCgpIHsKKyAgICBpZiAobURldmljZSAhPSAwKSB7CisgICAgICAgIG1EZXZpY2UuY2xlYXIoKTsKKyAgICAgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldFN1cHBvcnRlZERldmljZXModWludDMyX3QqKSB7CisgICAgLy8gT2Jzb2xldGUuCisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjppbml0Q2hlY2soKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImluaXRDaGVjayIsIG1EZXZpY2UtPmluaXRDaGVjaygpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0Vm9pY2VWb2x1bWUiLCBtUHJpbWFyeURldmljZS0+c2V0Vm9pY2VWb2x1bWUodm9sdW1lKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNYXN0ZXJWb2x1bWUiLCBtUHJpbWFyeURldmljZS0+c2V0TWFzdGVyVm9sdW1lKHZvbHVtZSkpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVByaW1hcnlEZXZpY2UtPmdldE1hc3RlclZvbHVtZSgKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgZmxvYXQgdikgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICp2b2x1bWUgPSB2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNYXN0ZXJWb2x1bWUiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNb2RlIiwgbVByaW1hcnlEZXZpY2UtPnNldE1vZGUoQXVkaW9Nb2RlKG1vZGUpKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1pY011dGUoYm9vbCBzdGF0ZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNaWNNdXRlIiwgbURldmljZS0+c2V0TWljTXV0ZShzdGF0ZSkpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0TWljTXV0ZSgKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgYm9vbCBtdXRlKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnN0YXRlID0gbXV0ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TWljTXV0ZSIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1hc3Rlck11dGUiLCBtRGV2aWNlLT5zZXRNYXN0ZXJNdXRlKHN0YXRlKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNYXN0ZXJNdXRlKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBib29sIG11dGUpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqc3RhdGUgPSBtdXRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNYXN0ZXJNdXRlIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gaGlkbFBhcmFtczsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbWV0ZXJzRnJvbUhhbChrdlBhaXJzLCAmaGlkbFBhcmFtcyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0UGFyYW1ldGVycyIsIG1EZXZpY2UtPnNldFBhcmFtZXRlcnMoaGlkbFBhcmFtcykpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgeworICAgIHZhbHVlcy0+Y2xlYXIoKTsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gaGlkbEtleXM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0ga2V5c0Zyb21IYWwoa2V5cywgJmhpZGxLZXlzKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldFBhcmFtZXRlcnMoCisgICAgICAgICAgICBoaWRsS2V5cywKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1RvSGFsKHBhcmFtZXRlcnMsIHZhbHVlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFBhcmFtZXRlcnMiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldElucHV0QnVmZmVyU2l6ZSgKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLCBzaXplX3QgKnNpemUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBBdWRpb0NvbmZpZyBoaWRsQ29uZmlnOworICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRJbnB1dEJ1ZmZlclNpemUoCisgICAgICAgICAgICBoaWRsQ29uZmlnLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBidWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRJbnB1dEJ1ZmZlclNpemUiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6Om9wZW5PdXRwdXRTdHJlYW0oCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIERldmljZUFkZHJlc3MgaGlkbERldmljZTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXZpY2VBZGRyZXNzRnJvbUhhbChkZXZpY2VzLCBhZGRyZXNzLCAmaGlkbERldmljZSk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICBBdWRpb0NvbmZpZyBoaWRsQ29uZmlnOworICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKKyAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPm9wZW5PdXRwdXRTdHJlYW0oCisgICAgICAgICAgICBoYW5kbGUsCisgICAgICAgICAgICBoaWRsRGV2aWNlLAorICAgICAgICAgICAgaGlkbENvbmZpZywKKyAgICAgICAgICAgIEF1ZGlvT3V0cHV0RmxhZyhmbGFncyksCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElTdHJlYW1PdXQ+JiByZXN1bHQsIGNvbnN0IEF1ZGlvQ29uZmlnJiBzdWdnZXN0ZWRDb25maWcpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqb3V0U3RyZWFtID0gbmV3IFN0cmVhbU91dEhhbEhpZGwocmVzdWx0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ1RvSGFsKHN1Z2dlc3RlZENvbmZpZywgY29uZmlnKTsKKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJvcGVuT3V0cHV0U3RyZWFtIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpvcGVuSW5wdXRTdHJlYW0oCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOworICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZXMsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7CisgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3BlbklucHV0U3RyZWFtKAorICAgICAgICAgICAgaGFuZGxlLAorICAgICAgICAgICAgaGlkbERldmljZSwKKyAgICAgICAgICAgIGhpZGxDb25maWcsCisgICAgICAgICAgICBBdWRpb0lucHV0RmxhZyhmbGFncyksCisgICAgICAgICAgICBBdWRpb1NvdXJjZShzb3VyY2UpLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJU3RyZWFtSW4+JiByZXN1bHQsIGNvbnN0IEF1ZGlvQ29uZmlnJiBzdWdnZXN0ZWRDb25maWcpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqaW5TdHJlYW0gPSBuZXcgU3RyZWFtSW5IYWxIaWRsKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdUb0hhbChzdWdnZXN0ZWRDb25maWcsIGNvbmZpZyk7CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigib3BlbklucHV0U3RyZWFtIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNBdWRpb1BhdGNoZXMiLCBtRGV2aWNlLT5zdXBwb3J0c0F1ZGlvUGF0Y2hlcygpLCBzdXBwb3J0c1BhdGNoZXMpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpjcmVhdGVBdWRpb1BhdGNoKAorICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKKyAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaGlkbF92ZWM8QXVkaW9Qb3J0Q29uZmlnPiBoaWRsU291cmNlcywgaGlkbFNpbmtzOworICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnc0Zyb21IYWwobnVtX3NvdXJjZXMsIHNvdXJjZXMsICZoaWRsU291cmNlcyk7CisgICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdzRnJvbUhhbChudW1fc2lua3MsIHNpbmtzLCAmaGlkbFNpbmtzKTsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5jcmVhdGVBdWRpb1BhdGNoKAorICAgICAgICAgICAgaGlkbFNvdXJjZXMsIGhpZGxTaW5rcywKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgQXVkaW9QYXRjaEhhbmRsZSBoaWRsUGF0Y2gpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqcGF0Y2ggPSBzdGF0aWNfY2FzdDxhdWRpb19wYXRjaF9oYW5kbGVfdD4oaGlkbFBhdGNoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiY3JlYXRlQXVkaW9QYXRjaCIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicmVsZWFzZUF1ZGlvUGF0Y2giLCBtRGV2aWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaCkpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBBdWRpb1BvcnQgaGlkbFBvcnQ7CisgICAgSGlkbFV0aWxzOjphdWRpb1BvcnRGcm9tSGFsKCpwb3J0LCAmaGlkbFBvcnQpOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldEF1ZGlvUG9ydCgKKyAgICAgICAgICAgIGhpZGxQb3J0LAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBBdWRpb1BvcnQmIHApIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydFRvSGFsKHAsIHBvcnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRBdWRpb1BvcnQiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIEF1ZGlvUG9ydENvbmZpZyBoaWRsQ29uZmlnOworICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldEF1ZGlvUG9ydENvbmZpZyIsIG1EZXZpY2UtPnNldEF1ZGlvUG9ydENvbmZpZyhoaWRsQ29uZmlnKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1pY3JvcGhvbmVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lc0luZm8gX191bnVzZWQpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmR1bXAoaW50IGZkKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7CisgICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5kZWJ1Z0R1bXAoaGlkbEhhbmRsZSk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImR1bXAiLCByZXQpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzFjYjU5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbEhpZGwuaApAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JRGV2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVByaW1hcnlEZXZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJRGV2aWNlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklQcmltYXJ5RGV2aWNlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIERldmljZUhhbEhpZGwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKK3sKKyAgcHVibGljOgorICAgIC8vIFNldHMgdGhlIHZhbHVlIG9mICdkZXZpY2VzJyB0byBhIGJpdG1hc2sgb2YgMSBvciBtb3JlIHZhbHVlcyBvZiBhdWRpb19kZXZpY2VzX3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKTsKKworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7CisKKyAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBvZiBhIHZvaWNlIGNhbGwuIFJhbmdlIGlzIGJldHdlZW4gMC4wIGFuZCAxLjAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgZm9yIGFsbCBhdWRpbyBhY3Rpdml0aWVzIG90aGVyIHRoYW4gdm9pY2UgY2FsbC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgLy8gR2V0IHRoZSBjdXJyZW50IG1hc3RlciB2b2x1bWUgdmFsdWUgZm9yIHRoZSBIQUwuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSk7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYXVkaW8gbW9kZSBjaGFuZ2VzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSk7CisKKyAgICAvLyBNdXRpbmcgY29udHJvbC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKTsKKworICAgIC8vIFNldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7CisKKyAgICAvLyBHZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7CisKKyAgICAvLyBSZXR1cm5zIGF1ZGlvIGlucHV0IGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIHBhc3NlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICBzaXplX3QgKnNpemUpOworCisgICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCisgICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0U3RyZWFtKAorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pOworCisgICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKKyAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dFN0cmVhbSgKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKTsKKworICAgIC8vIFJldHVybnMgd2hldGhlciBjcmVhdGVBdWRpb1BhdGNoIGFuZCByZWxlYXNlQXVkaW9QYXRjaCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpOworCisgICAgLy8gQ3JlYXRlcyBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAorICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKTsKKworICAgIC8vIFJlbGVhc2VzIGFuIGF1ZGlvIHBhdGNoLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpOworCisgICAgLy8gRmlsbHMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7CisKKyAgICAvLyBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKworICAgIC8vIExpc3QgbWljcm9waG9uZXMKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSGlkbDsKKyAgICBzcDxJRGV2aWNlPiBtRGV2aWNlOworICAgIHNwPElQcmltYXJ5RGV2aWNlPiBtUHJpbWFyeURldmljZTsgIC8vIE51bGwgaWYgaXQncyBub3QgYSBwcmltYXJ5IGRldmljZS4KKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBleHBsaWNpdCBEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPElEZXZpY2U+JiBkZXZpY2UpOworCisgICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIGRldmljZS4KKyAgICB2aXJ0dWFsIH5EZXZpY2VIYWxIaWRsKCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbExvY2FsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzNiZjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbExvY2FsLmNwcApAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlSGFsTG9jYWwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCisjaW5jbHVkZSAiU3RyZWFtSGFsTG9jYWwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitEZXZpY2VIYWxMb2NhbDo6RGV2aWNlSGFsTG9jYWwoYXVkaW9faHdfZGV2aWNlX3QgKmRldikKKyAgICAgICAgOiBtRGV2KGRldikgeworfQorCitEZXZpY2VIYWxMb2NhbDo6fkRldmljZUhhbExvY2FsKCkgeworICAgIGludCBzdGF0dXMgPSBhdWRpb19od19kZXZpY2VfY2xvc2UobURldik7CisgICAgQUxPR1dfSUYoc3RhdHVzLCAiRXJyb3IgY2xvc2luZyBhdWRpbyBodyBkZXZpY2UgJXA6ICVzIiwgbURldiwgc3RyZXJyb3IoLXN0YXR1cykpOworICAgIG1EZXYgPSAwOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCAqZGV2aWNlcykgeworICAgIGlmIChtRGV2LT5nZXRfc3VwcG9ydGVkX2RldmljZXMgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICpkZXZpY2VzID0gbURldi0+Z2V0X3N1cHBvcnRlZF9kZXZpY2VzKG1EZXYpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmluaXRDaGVjaygpIHsKKyAgICByZXR1cm4gbURldi0+aW5pdF9jaGVjayhtRGV2KTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIHJldHVybiBtRGV2LT5zZXRfdm9pY2Vfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CisgICAgaWYgKG1EZXYtPnNldF9tYXN0ZXJfdm9sdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbURldi0+c2V0X21hc3Rlcl92b2x1bWUobURldiwgdm9sdW1lKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKSB7CisgICAgaWYgKG1EZXYtPmdldF9tYXN0ZXJfdm9sdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbURldi0+Z2V0X21hc3Rlcl92b2x1bWUobURldiwgdm9sdW1lKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpIHsKKyAgICByZXR1cm4gbURldi0+c2V0X21vZGUobURldiwgbW9kZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNaWNNdXRlKGJvb2wgc3RhdGUpIHsKKyAgICByZXR1cm4gbURldi0+c2V0X21pY19tdXRlKG1EZXYsIHN0YXRlKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1pY011dGUoYm9vbCAqc3RhdGUpIHsKKyAgICByZXR1cm4gbURldi0+Z2V0X21pY19tdXRlKG1EZXYsIHN0YXRlKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSkgeworICAgIGlmIChtRGV2LT5zZXRfbWFzdGVyX211dGUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtRGV2LT5zZXRfbWFzdGVyX211dGUobURldiwgc3RhdGUpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSkgeworICAgIGlmIChtRGV2LT5nZXRfbWFzdGVyX211dGUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtRGV2LT5nZXRfbWFzdGVyX211dGUobURldiwgc3RhdGUpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7CisgICAgcmV0dXJuIG1EZXYtPnNldF9wYXJhbWV0ZXJzKG1EZXYsIGt2UGFpcnMuc3RyaW5nKCkpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKKyAgICBjaGFyICpoYWxWYWx1ZXMgPSBtRGV2LT5nZXRfcGFyYW1ldGVycyhtRGV2LCBrZXlzLnN0cmluZygpKTsKKyAgICBpZiAoaGFsVmFsdWVzICE9IE5VTEwpIHsKKyAgICAgICAgdmFsdWVzLT5zZXRUbyhoYWxWYWx1ZXMpOworICAgICAgICBmcmVlKGhhbFZhbHVlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsdWVzLT5jbGVhcigpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRJbnB1dEJ1ZmZlclNpemUoCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywgc2l6ZV90ICpzaXplKSB7CisgICAgKnNpemUgPSBtRGV2LT5nZXRfaW5wdXRfYnVmZmVyX3NpemUobURldiwgY29uZmlnKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpvcGVuT3V0cHV0U3RyZWFtKAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pIHsKKyAgICBhdWRpb19zdHJlYW1fb3V0X3QgKmhhbFN0cmVhbTsKKyAgICBBTE9HVigib3Blbl9vdXRwdXRfc3RyZWFtIGhhbmRsZTogJWQgZGV2aWNlczogJXggZmxhZ3M6ICUjeCIKKyAgICAgICAgICAgICJzcmF0ZTogJWQgZm9ybWF0ICUjeCBjaGFubmVscyAleCBhZGRyZXNzICVzIiwKKyAgICAgICAgICAgIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsCisgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssCisgICAgICAgICAgICBhZGRyZXNzKTsKKyAgICBpbnQgb3BlblJlc3V0ID0gbURldi0+b3Blbl9vdXRwdXRfc3RyZWFtKAorICAgICAgICAgICAgbURldiwgaGFuZGxlLCBkZXZpY2VzLCBmbGFncywgY29uZmlnLCAmaGFsU3RyZWFtLCBhZGRyZXNzKTsKKyAgICBpZiAob3BlblJlc3V0ID09IE9LKSB7CisgICAgICAgICpvdXRTdHJlYW0gPSBuZXcgU3RyZWFtT3V0SGFsTG9jYWwoaGFsU3RyZWFtLCB0aGlzKTsKKyAgICB9CisgICAgQUxPR1YoIm9wZW5fb3V0cHV0X3N0cmVhbSBzdGF0dXMgJWQgc3RyZWFtICVwIiwgb3BlblJlc3V0LCBoYWxTdHJlYW0pOworICAgIHJldHVybiBvcGVuUmVzdXQ7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpvcGVuSW5wdXRTdHJlYW0oCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKSB7CisgICAgYXVkaW9fc3RyZWFtX2luX3QgKmhhbFN0cmVhbTsKKyAgICBBTE9HVigib3Blbl9pbnB1dF9zdHJlYW0gaGFuZGxlOiAlZCBkZXZpY2VzOiAleCBmbGFnczogJSN4ICIKKyAgICAgICAgICAgICJzcmF0ZTogJWQgZm9ybWF0ICUjeCBjaGFubmVscyAleCBhZGRyZXNzICVzIHNvdXJjZSAlZCIsCisgICAgICAgICAgICBoYW5kbGUsIGRldmljZXMsIGZsYWdzLAorICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgYWRkcmVzcywgc291cmNlKTsKKyAgICBpbnQgb3BlblJlc3VsdCA9IG1EZXYtPm9wZW5faW5wdXRfc3RyZWFtKAorICAgICAgICAgICAgbURldiwgaGFuZGxlLCBkZXZpY2VzLCBjb25maWcsICZoYWxTdHJlYW0sIGZsYWdzLCBhZGRyZXNzLCBzb3VyY2UpOworICAgIGlmIChvcGVuUmVzdWx0ID09IE9LKSB7CisgICAgICAgICppblN0cmVhbSA9IG5ldyBTdHJlYW1JbkhhbExvY2FsKGhhbFN0cmVhbSwgdGhpcyk7CisgICAgfQorICAgIEFMT0dWKCJvcGVuX2lucHV0X3N0cmVhbSBzdGF0dXMgJWQgc3RyZWFtICVwIiwgb3BlblJlc3VsdCwgaW5TdHJlYW0pOworICAgIHJldHVybiBvcGVuUmVzdWx0OworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKSB7CisgICAgKnN1cHBvcnRzUGF0Y2hlcyA9IHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAorICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAorICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpIHsKKyAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICAgICAgcmV0dXJuIG1EZXYtPmNyZWF0ZV9hdWRpb19wYXRjaCgKKyAgICAgICAgICAgICAgICBtRGV2LCBudW1fc291cmNlcywgc291cmNlcywgbnVtX3NpbmtzLCBzaW5rcywgcGF0Y2gpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCkgeworICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgeworICAgICAgICByZXR1cm4gbURldi0+cmVsZWFzZV9hdWRpb19wYXRjaChtRGV2LCBwYXRjaCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgeworICAgIHJldHVybiBtRGV2LT5nZXRfYXVkaW9fcG9ydChtRGV2LCBwb3J0KTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgeworICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkKKyAgICAgICAgcmV0dXJuIG1EZXYtPnNldF9hdWRpb19wb3J0X2NvbmZpZyhtRGV2LCBjb25maWcpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWljcm9waG9uZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzIF9fdW51c2VkKSB7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6ZHVtcChpbnQgZmQpIHsKKyAgICByZXR1cm4gbURldi0+ZHVtcChtRGV2LCBmZCk7Cit9CisKK3ZvaWQgRGV2aWNlSGFsTG9jYWw6OmNsb3NlT3V0cHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0ICpzdHJlYW1fb3V0KSB7CisgICAgbURldi0+Y2xvc2Vfb3V0cHV0X3N0cmVhbShtRGV2LCBzdHJlYW1fb3V0KTsKK30KKwordm9pZCBEZXZpY2VIYWxMb2NhbDo6Y2xvc2VJbnB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luICpzdHJlYW1faW4pIHsKKyAgICBtRGV2LT5jbG9zZV9pbnB1dF9zdHJlYW0obURldiwgc3RyZWFtX2luKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsTG9jYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWMyMDFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbExvY2FsLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF9ICisKKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIERldmljZUhhbExvY2FsIDogcHVibGljIERldmljZUhhbEludGVyZmFjZQoreworICBwdWJsaWM6CisgICAgLy8gU2V0cyB0aGUgdmFsdWUgb2YgJ2RldmljZXMnIHRvIGEgYml0bWFzayBvZiAxIG9yIG1vcmUgdmFsdWVzIG9mIGF1ZGlvX2RldmljZXNfdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpOworCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKKworICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIG9mIGEgdm9pY2UgY2FsbC4gUmFuZ2UgaXMgYmV0d2VlbiAwLjAgYW5kIDEuMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSk7CisKKyAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBmb3IgYWxsIGF1ZGlvIGFjdGl2aXRpZXMgb3RoZXIgdGhhbiB2b2ljZSBjYWxsLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSk7CisKKyAgICAvLyBHZXQgdGhlIGN1cnJlbnQgbWFzdGVyIHZvbHVtZSB2YWx1ZSBmb3IgdGhlIEhBTC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKTsKKworICAgIC8vIENhbGxlZCB3aGVuIHRoZSBhdWRpbyBtb2RlIGNoYW5nZXMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKTsKKworICAgIC8vIE11dGluZyBjb250cm9sLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWljTXV0ZShib29sIHN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY011dGUoYm9vbCAqc3RhdGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpOworCisgICAgLy8gU2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKKworICAgIC8vIEdldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKKworICAgIC8vIFJldHVybnMgYXVkaW8gaW5wdXQgYnVmZmVyIHNpemUgYWNjb3JkaW5nIHRvIHBhcmFtZXRlcnMgcGFzc2VkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJTaXplKGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKKyAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXRTdHJlYW0oCisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSk7CisKKyAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAorICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbklucHV0U3RyZWFtKAorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIGNyZWF0ZUF1ZGlvUGF0Y2ggYW5kIHJlbGVhc2VBdWRpb1BhdGNoIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcyk7CisKKyAgICAvLyBDcmVhdGVzIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKAorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpOworCisgICAgLy8gUmVsZWFzZXMgYW4gYXVkaW8gcGF0Y2guCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCk7CisKKyAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKKworICAgIC8vIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworCisgICAgLy8gTGlzdCBtaWNyb3Bob25lcworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgICB2b2lkIGNsb3NlT3V0cHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0ICpzdHJlYW1fb3V0KTsKKyAgICB2b2lkIGNsb3NlSW5wdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqc3RyZWFtX2luKTsKKworICBwcml2YXRlOgorICAgIGF1ZGlvX2h3X2RldmljZV90ICptRGV2OworCisgICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsTG9jYWw7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgZXhwbGljaXQgRGV2aWNlSGFsTG9jYWwoYXVkaW9faHdfZGV2aWNlX3QgKmRldik7CisKKyAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgZGV2aWNlLgorICAgIHZpcnR1YWwgfkRldmljZUhhbExvY2FsKCk7CisKKyAgICB1aW50MzJfdCB2ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbURldi0+Y29tbW9uLnZlcnNpb247IH0KK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMzM1OTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lEZXZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9oaWRsL0hhbERlYXRoSGFuZGxlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKyNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCisjaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJRGV2aWNlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitEZXZpY2VzRmFjdG9yeUhhbEhpZGw6OkRldmljZXNGYWN0b3J5SGFsSGlkbCgpIHsKKyAgICBtRGV2aWNlc0ZhY3RvcnkgPSBJRGV2aWNlc0ZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKKyAgICBpZiAobURldmljZXNGYWN0b3J5ICE9IDApIHsKKyAgICAgICAgLy8gSXQgaXMgYXNzdW1lZCB0aGF0IERldmljZXNGYWN0b3J5IGlzIG93bmVkIGJ5IEF1ZGlvRmxpbmdlcgorICAgICAgICAvLyBhbmQgdGh1cyBoYXZlIHRoZSBzYW1lIGxpZmVzcGFuLgorICAgICAgICBtRGV2aWNlc0ZhY3RvcnktPmxpbmtUb0RlYXRoKEhhbERlYXRoSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKSwgMCAvKmNvb2tpZSovKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9idGFpbiBJRGV2aWNlc0ZhY3Rvcnkgc2VydmljZSwgdGVybWluYXRpbmcgcHJvY2Vzcy4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgLy8gVGhlIE1TRCBmYWN0b3J5IGlzIG9wdGlvbmFsCisgICAgbURldmljZXNGYWN0b3J5TXNkID0gSURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKEFVRElPX0hBTF9TRVJWSUNFX05BTUVfTVNEKTsKKyAgICAvLyBUT0RPOiBSZWdpc3RlciBkZWF0aCBoYW5kbGVyLCBhbmQgYWRkICdyZXN0YXJ0JyBkaXJlY3RpdmUgdG8gYXVkaW9zZXJ2ZXIucmMKK30KKworRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjp+RGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCkgeworfQorCisvLyBzdGF0aWMKK3N0YXR1c190IERldmljZXNGYWN0b3J5SGFsSGlkbDo6bmFtZUZyb21IYWwoY29uc3QgY2hhciAqbmFtZSwgSURldmljZXNGYWN0b3J5OjpEZXZpY2UgKmRldmljZSkgeworICAgIGlmIChzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlkpID09IDApIHsKKyAgICAgICAgKmRldmljZSA9IElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpQUklNQVJZOworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIGlmKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfQTJEUCkgPT0gMCkgeworICAgICAgICAqZGV2aWNlID0gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OkEyRFA7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9VU0IpID09IDApIHsKKyAgICAgICAgKmRldmljZSA9IElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpVU0I7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9SRU1PVEVfU1VCTUlYKSA9PSAwKSB7CisgICAgICAgICpkZXZpY2UgPSBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6Ul9TVUJNSVg7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9TVFVCKSA9PSAwKSB7CisgICAgICAgICpkZXZpY2UgPSBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6U1RVQjsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBBTE9HRSgiSW52YWxpZCBkZXZpY2UgbmFtZSAlcyIsIG5hbWUpOworICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK3N0YXR1c190IERldmljZXNGYWN0b3J5SGFsSGlkbDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKKyAgICBpZiAobURldmljZXNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOworICAgIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlIGhpZGxEZXZpY2U7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbmFtZUZyb21IYWwobmFtZSwgJmhpZGxEZXZpY2UpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlc0ZhY3RvcnktPm9wZW5EZXZpY2UoCisgICAgICAgICAgICBoaWRsRGV2aWNlLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJRGV2aWNlPiYgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKmRldmljZSA9IG5ldyBEZXZpY2VIYWxIaWRsKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKHJldC5pc09rKCkpIHsKKyAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7CisgICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBlbHNlIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gRkFJTEVEX1RSQU5TQUNUSU9OOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc0ODg0OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9ISURMX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lEZXZpY2VzRmFjdG9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SURldmljZXNGYWN0b3J5OworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIERldmljZXNGYWN0b3J5SGFsSGlkbCA6IHB1YmxpYyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZQoreworICBwdWJsaWM6CisgICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCisgICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOworCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkOworCisgICAgc3A8SURldmljZXNGYWN0b3J5PiBtRGV2aWNlc0ZhY3Rvcnk7CisgICAgc3A8SURldmljZXNGYWN0b3J5PiBtRGV2aWNlc0ZhY3RvcnlNc2Q7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgbmFtZUZyb21IYWwoY29uc3QgY2hhciAqbmFtZSwgSURldmljZXNGYWN0b3J5OjpEZXZpY2UgKmRldmljZSk7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCk7CisKKyAgICB2aXJ0dWFsIH5EZXZpY2VzRmFjdG9yeUhhbEhpZGwoKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNGJlNzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsSHlicmlkIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaCIKKyNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgiCisjaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6OkRldmljZXNGYWN0b3J5SGFsSHlicmlkKCkKKyAgICAgICAgOiBtTG9jYWxGYWN0b3J5KG5ldyBEZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkpLAorICAgICAgICAgIG1IaWRsRmFjdG9yeShuZXcgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCkpIHsKK30KKworRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6On5EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpIHsKK30KKworc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7CisgICAgaWYgKG1IaWRsRmFjdG9yeSAhPSAwICYmIHN0cmNtcChBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfQTJEUCwgbmFtZSkgIT0gMCAmJgorICAgICAgICBzdHJjbXAoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0hFQVJJTkdfQUlELCBuYW1lKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBtSGlkbEZhY3RvcnktPm9wZW5EZXZpY2UobmFtZSwgZGV2aWNlKTsKKyAgICB9CisgICAgcmV0dXJuIG1Mb2NhbEZhY3RvcnktPm9wZW5EZXZpY2UobmFtZSwgZGV2aWNlKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwCnJlbmFtZSB0byBtZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNmE1MDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YXRvbWljPgorCisjZGVmaW5lIExPR19UQUcgIkVmZmVjdEJ1ZmZlckhhbEhpZGwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvYWxsb2NhdG9yLzEuMC9JQWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8aGlkbG1lbW9yeS9tYXBwaW5nLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoaWRsOjphbGxvY2F0b3I6OlYxXzA6OklBbGxvY2F0b3I7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gc3RhdGljCit1aW50NjRfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjptYWtlVW5pcXVlSWQoKSB7CisgICAgc3RhdGljIHN0ZDo6YXRvbWljPHVpbnQ2NF90PiBjb3VudGVyezF9OworICAgIHJldHVybiBjb3VudGVyKys7Cit9CisKK3N0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmFsbG9jYXRlKAorICAgICAgICBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7CisgICAgcmV0dXJuIG1pcnJvcihudWxscHRyLCBzaXplLCBidWZmZXIpOworfQorCitzdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjptaXJyb3IoCisgICAgICAgIHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7CisgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiB0ZW1wQnVmZmVyID0gbmV3IEVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZSk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KHRlbXBCdWZmZXIuZ2V0KCkpLT5pbml0KCk7CisgICAgaWYgKHJlc3VsdCA9PSBPSykgeworICAgICAgICB0ZW1wQnVmZmVyLT5zZXRFeHRlcm5hbERhdGEoZXh0ZXJuYWwpOworICAgICAgICAqYnVmZmVyID0gdGVtcEJ1ZmZlcjsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworRWZmZWN0QnVmZmVySGFsSGlkbDo6RWZmZWN0QnVmZmVySGFsSGlkbChzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBtQnVmZmVyU2l6ZShzaXplKSwgbUZyYW1lQ291bnRDaGFuZ2VkKGZhbHNlKSwKKyAgICAgICAgICBtRXh0ZXJuYWxEYXRhKG51bGxwdHIpLCBtQXVkaW9CdWZmZXJ7MCwge251bGxwdHJ9fSB7CisgICAgbUhpZGxCdWZmZXIuaWQgPSBtYWtlVW5pcXVlSWQoKTsKKyAgICBtSGlkbEJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKK30KKworRWZmZWN0QnVmZmVySGFsSGlkbDo6fkVmZmVjdEJ1ZmZlckhhbEhpZGwoKSB7Cit9CisKK3N0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmluaXQoKSB7CisgICAgc3A8SUFsbG9jYXRvcj4gYXNobWVtID0gSUFsbG9jYXRvcjo6Z2V0U2VydmljZSgiYXNobWVtIik7CisgICAgaWYgKGFzaG1lbSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmV0cmlldmUgYXNobWVtIGFsbG9jYXRvciBzZXJ2aWNlIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBzdGF0dXNfdCByZXR2YWwgPSBOT19NRU1PUlk7CisgICAgUmV0dXJuPHZvaWQ+IHJlc3VsdCA9IGFzaG1lbS0+YWxsb2NhdGUoCisgICAgICAgICAgICBtQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgIFsmXShib29sIHN1Y2Nlc3MsIGNvbnN0IGhpZGxfbWVtb3J5JiBtZW1vcnkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICBtSGlkbEJ1ZmZlci5kYXRhID0gbWVtb3J5OworICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBPSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAocmVzdWx0LmlzT2soKSAmJiByZXR2YWwgPT0gT0spIHsKKyAgICAgICAgbU1lbW9yeSA9IGhhcmR3YXJlOjptYXBNZW1vcnkobUhpZGxCdWZmZXIuZGF0YSk7CisgICAgICAgIGlmIChtTWVtb3J5ICE9IDApIHsKKyAgICAgICAgICAgIG1NZW1vcnktPnVwZGF0ZSgpOworICAgICAgICAgICAgbUF1ZGlvQnVmZmVyLnJhdyA9IHN0YXRpY19jYXN0PHZvaWQqPihtTWVtb3J5LT5nZXRQb2ludGVyKCkpOworICAgICAgICAgICAgbWVtc2V0KG1BdWRpb0J1ZmZlci5yYXcsIDAsIG1NZW1vcnktPmdldFNpemUoKSk7CisgICAgICAgICAgICBtTWVtb3J5LT5jb21taXQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbWFwIGFsbG9jYXRlZCBhc2htZW0iKTsKKyAgICAgICAgICAgIHJldHZhbCA9IE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZnJvbSBhc2htZW0iLCAoaW50KW1CdWZmZXJTaXplKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdC5pc09rKCkgPyByZXR2YWwgOiBGQUlMRURfVFJBTlNBQ1RJT047Cit9CisKK2F1ZGlvX2J1ZmZlcl90KiBFZmZlY3RCdWZmZXJIYWxIaWRsOjphdWRpb0J1ZmZlcigpIHsKKyAgICByZXR1cm4gJm1BdWRpb0J1ZmZlcjsKK30KKwordm9pZCogRWZmZWN0QnVmZmVySGFsSGlkbDo6ZXh0ZXJuYWxEYXRhKCkgY29uc3QgeworICAgIHJldHVybiBtRXh0ZXJuYWxEYXRhOworfQorCit2b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnNldEZyYW1lQ291bnQoc2l6ZV90IGZyYW1lQ291bnQpIHsKKyAgICBtSGlkbEJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICBtQXVkaW9CdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgbUZyYW1lQ291bnRDaGFuZ2VkID0gdHJ1ZTsKK30KKworYm9vbCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpjaGVja0ZyYW1lQ291bnRDaGFuZ2UoKSB7CisgICAgYm9vbCByZXN1bHQgPSBtRnJhbWVDb3VudENoYW5nZWQ7CisgICAgbUZyYW1lQ291bnRDaGFuZ2VkID0gZmFsc2U7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpzZXRFeHRlcm5hbERhdGEodm9pZCogZXh0ZXJuYWwpIHsKKyAgICBtRXh0ZXJuYWxEYXRhID0gZXh0ZXJuYWw7Cit9CisKK3ZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6dXBkYXRlKCkgeworICAgIHVwZGF0ZShtQnVmZmVyU2l6ZSk7Cit9CisKK3ZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y29tbWl0KCkgeworICAgIGNvbW1pdChtQnVmZmVyU2l6ZSk7Cit9CisKK3ZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6dXBkYXRlKHNpemVfdCBzaXplKSB7CisgICAgaWYgKG1FeHRlcm5hbERhdGEgPT0gbnVsbHB0cikgcmV0dXJuOworICAgIG1NZW1vcnktPnVwZGF0ZSgpOworICAgIGlmIChzaXplID4gbUJ1ZmZlclNpemUpIHNpemUgPSBtQnVmZmVyU2l6ZTsKKyAgICBtZW1jcHkobUF1ZGlvQnVmZmVyLnJhdywgbUV4dGVybmFsRGF0YSwgc2l6ZSk7CisgICAgbU1lbW9yeS0+Y29tbWl0KCk7Cit9CisKK3ZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y29tbWl0KHNpemVfdCBzaXplKSB7CisgICAgaWYgKG1FeHRlcm5hbERhdGEgPT0gbnVsbHB0cikgcmV0dXJuOworICAgIGlmIChzaXplID4gbUJ1ZmZlclNpemUpIHNpemUgPSBtQnVmZmVyU2l6ZTsKKyAgICBtZW1jcHkobUV4dGVybmFsRGF0YSwgbUF1ZGlvQnVmZmVyLnJhdywgc2l6ZSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0QnVmZmVySGFsSGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZTAwODcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0QnVmZmVySGFsSGlkbC5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfSElETF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfSElETF9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkF1ZGlvQnVmZmVyOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgYW5kcm9pZDo6aGlkbDo6bWVtb3J5OjpWMV8wOjpJTWVtb3J5OworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEVmZmVjdEJ1ZmZlckhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlCit7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgc3RhdHVzX3QgYWxsb2NhdGUoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcik7CisgICAgc3RhdGljIHN0YXR1c190IG1pcnJvcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcik7CisKKyAgICB2aXJ0dWFsIGF1ZGlvX2J1ZmZlcl90KiBhdWRpb0J1ZmZlcigpOworICAgIHZpcnR1YWwgdm9pZCogZXh0ZXJuYWxEYXRhKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHNpemVfdCBnZXRTaXplKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbUJ1ZmZlclNpemU7IH0KKworICAgIHZpcnR1YWwgdm9pZCBzZXRFeHRlcm5hbERhdGEodm9pZCogZXh0ZXJuYWwpOworICAgIHZpcnR1YWwgdm9pZCBzZXRGcmFtZUNvdW50KHNpemVfdCBmcmFtZUNvdW50KTsKKyAgICB2aXJ0dWFsIGJvb2wgY2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlKCk7CisgICAgdmlydHVhbCB2b2lkIGNvbW1pdCgpOworICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoc2l6ZV90IHNpemUpOworICAgIHZpcnR1YWwgdm9pZCBjb21taXQoc2l6ZV90IHNpemUpOworCisgICAgY29uc3QgQXVkaW9CdWZmZXImIGhpZGxCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtSGlkbEJ1ZmZlcjsgfQorCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZTsKKworICAgIHN0YXRpYyB1aW50NjRfdCBtYWtlVW5pcXVlSWQoKTsKKworICAgIGNvbnN0IHNpemVfdCBtQnVmZmVyU2l6ZTsKKyAgICBib29sIG1GcmFtZUNvdW50Q2hhbmdlZDsKKyAgICB2b2lkKiBtRXh0ZXJuYWxEYXRhOworICAgIEF1ZGlvQnVmZmVyIG1IaWRsQnVmZmVyOworICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7CisgICAgYXVkaW9fYnVmZmVyX3QgbUF1ZGlvQnVmZmVyOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIGV4cGxpY2l0IEVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZV90IHNpemUpOworCisgICAgdmlydHVhbCB+RWZmZWN0QnVmZmVySGFsSGlkbCgpOworCisgICAgc3RhdHVzX3QgaW5pdCgpOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RIYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmIwMzJjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEhhbEhpZGwuY3BwCkBAIC0wLDAgKzEsMzM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJFZmZlY3RIYWxIaWRsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKyNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCisjaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgorI2luY2x1ZGUgIkhpZGxVdGlscy5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpBdWRpb0J1ZmZlcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkVmZmVjdEJ1ZmZlckFjY2VzczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkVmZmVjdENvbmZpZ1BhcmFtZXRlcnM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpNZXNzYWdlUXVldWVGbGFnQml0czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OlJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkhpZGxVdGlsczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvQ2hhbm5lbE1hc2s7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0Zvcm1hdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitFZmZlY3RIYWxIaWRsOjpFZmZlY3RIYWxIaWRsKGNvbnN0IHNwPElFZmZlY3Q+JiBlZmZlY3QsIHVpbnQ2NF90IGVmZmVjdElkKQorICAgICAgICA6IG1FZmZlY3QoZWZmZWN0KSwgbUVmZmVjdElkKGVmZmVjdElkKSwgbUJ1ZmZlcnNDaGFuZ2VkKHRydWUpLCBtRWZHcm91cChudWxscHRyKSB7Cit9CisKK0VmZmVjdEhhbEhpZGw6On5FZmZlY3RIYWxIaWRsKCkgeworICAgIGlmIChtRWZmZWN0ICE9IDApIHsKKyAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgbUVmZmVjdC5jbGVhcigpOworICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworICAgIH0KKyAgICBpZiAobUVmR3JvdXApIHsKKyAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKKyAgICB9Cit9CisKKy8vIHN0YXRpYwordm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwoCisgICAgICAgIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIGRlc2NyaXB0b3IsIGVmZmVjdF9kZXNjcmlwdG9yX3QqIGhhbERlc2NyaXB0b3IpIHsKKyAgICBIaWRsVXRpbHM6OnV1aWRUb0hhbChkZXNjcmlwdG9yLnR5cGUsICZoYWxEZXNjcmlwdG9yLT50eXBlKTsKKyAgICBIaWRsVXRpbHM6OnV1aWRUb0hhbChkZXNjcmlwdG9yLnV1aWQsICZoYWxEZXNjcmlwdG9yLT51dWlkKTsKKyAgICBoYWxEZXNjcmlwdG9yLT5mbGFncyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkZXNjcmlwdG9yLmZsYWdzKTsKKyAgICBoYWxEZXNjcmlwdG9yLT5jcHVMb2FkID0gZGVzY3JpcHRvci5jcHVMb2FkOworICAgIGhhbERlc2NyaXB0b3ItPm1lbW9yeVVzYWdlID0gZGVzY3JpcHRvci5tZW1vcnlVc2FnZTsKKyAgICBtZW1jcHkoaGFsRGVzY3JpcHRvci0+bmFtZSwgZGVzY3JpcHRvci5uYW1lLmRhdGEoKSwgZGVzY3JpcHRvci5uYW1lLnNpemUoKSk7CisgICAgbWVtY3B5KGhhbERlc2NyaXB0b3ItPmltcGxlbWVudG9yLAorICAgICAgICAgICAgZGVzY3JpcHRvci5pbXBsZW1lbnRvci5kYXRhKCksIGRlc2NyaXB0b3IuaW1wbGVtZW50b3Iuc2l6ZSgpKTsKK30KKworLy8gVE9ETyhtbmFnYW5vdik6IFRoZXNlIGJ1ZmZlciBjb252ZXJzaW9uIGZ1bmN0aW9ucyBzaG91bGQgYmUgc2hhcmVkIHdpdGggRWZmZWN0IHdyYXBwZXIKKy8vIHZpYSBIaWRsVXRpbHMuIE1vdmUgdGhlbSB0aGVyZSB3aGVuIGhhcmR3YXJlL2ludGVyZmFjZXMgd2lsbCBnZXQgdW4tZnJvemVuIGFnYWluLgorCisvLyBzdGF0aWMKK3ZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbCgKKyAgICAgICAgY29uc3QgYnVmZmVyX2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdEJ1ZmZlckNvbmZpZyogY29uZmlnKSB7CisgICAgY29uZmlnLT5zYW1wbGluZ1JhdGVIeiA9IGhhbENvbmZpZy5zYW1wbGluZ1JhdGU7CisgICAgY29uZmlnLT5jaGFubmVscyA9IEF1ZGlvQ2hhbm5lbE1hc2soaGFsQ29uZmlnLmNoYW5uZWxzKTsKKyAgICBjb25maWctPmZvcm1hdCA9IEF1ZGlvRm9ybWF0KGhhbENvbmZpZy5mb3JtYXQpOworICAgIGNvbmZpZy0+YWNjZXNzTW9kZSA9IEVmZmVjdEJ1ZmZlckFjY2VzcyhoYWxDb25maWcuYWNjZXNzTW9kZSk7CisgICAgY29uZmlnLT5tYXNrID0gRWZmZWN0Q29uZmlnUGFyYW1ldGVycyhoYWxDb25maWcubWFzayk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdUb0hhbCgKKyAgICAgICAgY29uc3QgRWZmZWN0QnVmZmVyQ29uZmlnJiBjb25maWcsIGJ1ZmZlcl9jb25maWdfdCogaGFsQ29uZmlnKSB7CisgICAgaGFsQ29uZmlnLT5idWZmZXIuZnJhbWVDb3VudCA9IDA7CisgICAgaGFsQ29uZmlnLT5idWZmZXIucmF3ID0gTlVMTDsKKyAgICBoYWxDb25maWctPnNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGluZ1JhdGVIejsKKyAgICBoYWxDb25maWctPmNoYW5uZWxzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNvbmZpZy5jaGFubmVscyk7CisgICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOworICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKKyAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOworICAgIGhhbENvbmZpZy0+Zm9ybWF0ID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmZvcm1hdCk7CisgICAgaGFsQ29uZmlnLT5hY2Nlc3NNb2RlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmFjY2Vzc01vZGUpOworICAgIGhhbENvbmZpZy0+bWFzayA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5tYXNrKTsKK30KKworLy8gc3RhdGljCit2b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdENvbmZpZ0Zyb21IYWwoY29uc3QgZWZmZWN0X2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdENvbmZpZyogY29uZmlnKSB7CisgICAgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbChoYWxDb25maWcuaW5wdXRDZmcsICZjb25maWctPmlucHV0Q2ZnKTsKKyAgICBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKGhhbENvbmZpZy5vdXRwdXRDZmcsICZjb25maWctPm91dHB1dENmZyk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RDb25maWdUb0hhbChjb25zdCBFZmZlY3RDb25maWcmIGNvbmZpZywgZWZmZWN0X2NvbmZpZ190KiBoYWxDb25maWcpIHsKKyAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcuaW5wdXRDZmcsICZoYWxDb25maWctPmlucHV0Q2ZnKTsKKyAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcub3V0cHV0Q2ZnLCAmaGFsQ29uZmlnLT5vdXRwdXRDZmcpOworfQorCisvLyBzdGF0aWMKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpIHsKKyAgICBzd2l0Y2ggKHJlc3VsdCkgeworICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKKyAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOiByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9TVEFURTogcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfU1VQUE9SVEVEOiByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIGNhc2UgUmVzdWx0OjpSRVNVTFRfVE9PX0JJRzogcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKKyAgICBpZiAoIW1CdWZmZXJzQ2hhbmdlZCkgeworICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgbUluQnVmZmVyLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci5nZXQoKSAhPSBtSW5CdWZmZXIuZ2V0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXItPmF1ZGlvQnVmZmVyKCkgIT0gbUluQnVmZmVyLT5hdWRpb0J1ZmZlcigpOworICAgICAgICB9CisgICAgfQorICAgIG1JbkJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldE91dEJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKKyAgICBpZiAoIW1CdWZmZXJzQ2hhbmdlZCkgeworICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgbU91dEJ1ZmZlci5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXIuZ2V0KCkgIT0gbU91dEJ1ZmZlci5nZXQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci0+YXVkaW9CdWZmZXIoKSAhPSBtT3V0QnVmZmVyLT5hdWRpb0J1ZmZlcigpOworICAgICAgICB9CisgICAgfQorICAgIG1PdXRCdWZmZXIgPSBidWZmZXI7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzKCkgeworICAgIHJldHVybiBwcm9jZXNzSW1wbChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OlJFUVVFU1RfUFJPQ0VTUykpOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzUmV2ZXJzZSgpIHsKKyAgICByZXR1cm4gcHJvY2Vzc0ltcGwoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpSRVFVRVNUX1BST0NFU1NfUkVWRVJTRSkpOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcmVwYXJlRm9yUHJvY2Vzc2luZygpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IHRlbXBTdGF0dXNNUTsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5wcmVwYXJlRm9yUHJvY2Vzc2luZygKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTVFEZXNjcmlwdG9yU3luYzxSZXN1bHQ+JiBzdGF0dXNNUSkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXBTdGF0dXNNUS5yZXNldChuZXcgU3RhdHVzTVEoc3RhdHVzTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpICYmIHRlbXBTdGF0dXNNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wU3RhdHVzTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSwgJm1FZkdyb3VwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgeworICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9CisgICAgaWYgKCF0ZW1wU3RhdHVzTVEgfHwgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpIHx8ICFtRWZHcm91cCkgeworICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgZWZmZWN0cyIpOworICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAorICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgZWZmZWN0cyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIGVmZmVjdHMgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBtU3RhdHVzTVEgPSBzdGQ6Om1vdmUodGVtcFN0YXR1c01RKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgRWZmZWN0SGFsSGlkbDo6bmVlZFRvUmVzZXRCdWZmZXJzKCkgeworICAgIGlmIChtQnVmZmVyc0NoYW5nZWQpIHJldHVybiB0cnVlOworICAgIGJvb2wgaW5CdWZmZXJGcmFtZUNvdW50VXBkYXRlZCA9IG1JbkJ1ZmZlci0+Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7CisgICAgYm9vbCBvdXRCdWZmZXJGcmFtZUNvdW50VXBkYXRlZCA9IG1PdXRCdWZmZXItPmNoZWNrRnJhbWVDb3VudENoYW5nZSgpOworICAgIHJldHVybiBpbkJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkIHx8IG91dEJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzSW1wbCh1aW50MzJfdCBtcUZsYWcpIHsKKyAgICBpZiAobUVmZmVjdCA9PSAwIHx8IG1JbkJ1ZmZlciA9PSAwIHx8IG1PdXRCdWZmZXIgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICghbVN0YXR1c01RICYmIChzdGF0dXMgPSBwcmVwYXJlRm9yUHJvY2Vzc2luZygpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBpZiAobmVlZFRvUmVzZXRCdWZmZXJzKCkgJiYgKHN0YXR1cyA9IHNldFByb2Nlc3NCdWZmZXJzKCkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIC8vIFRoZSBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIGJ1ZmZlcnMsIGp1c3QgbmVlZCB0byBmbHVzaCBpdCBhbmQgd2FrZSB1cCB0aGUgc2VydmVyIHNpZGUuCisgICAgc3RkOjphdG9taWNfdGhyZWFkX2ZlbmNlKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UpOworICAgIG1FZkdyb3VwLT53YWtlKG1xRmxhZyk7CisgICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7CityZXRyeToKKyAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdCgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6RE9ORV9QUk9DRVNTSU5HKSwgJmVmU3RhdGUpOworICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpET05FX1BST0NFU1NJTkcpKSB7CisgICAgICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICAgICAgbVN0YXR1c01RLT5yZWFkKCZyZXR2YWwpOworICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0sgfHwgcmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9TVEFURSkgeworICAgICAgICAgICAgLy8gU3luYyBiYWNrIHRoZSBjaGFuZ2VkIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIuCisgICAgICAgICAgICBzdGQ6OmF0b21pY190aHJlYWRfZmVuY2Uoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuYWx5emVSZXN1bHQocmV0dmFsKTsKKyAgICB9CisgICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKKyAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCisgICAgICAgIGdvdG8gcmV0cnk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldFByb2Nlc3NCdWZmZXJzKCkgeworICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IG1FZmZlY3QtPnNldFByb2Nlc3NCdWZmZXJzKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KG1JbkJ1ZmZlci5nZXQoKSktPmhpZGxCdWZmZXIoKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPihtT3V0QnVmZmVyLmdldCgpKS0+aGlkbEJ1ZmZlcigpKTsKKyAgICBpZiAocmV0LmlzT2soKSAmJiByZXQgPT0gUmVzdWx0OjpPSykgeworICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Y29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKKyAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgeworICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOworCisgICAgLy8gU3BlY2lhbCBjYXNlcy4KKyAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgfHwgY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUdfUkVWRVJTRSkgeworICAgICAgICByZXR1cm4gc2V0Q29uZmlnSW1wbChjbWRDb2RlLCBjbWRTaXplLCBwQ21kRGF0YSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKKyAgICB9IGVsc2UgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHIHx8IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHX1JFVkVSU0UpIHsKKyAgICAgICAgcmV0dXJuIGdldENvbmZpZ0ltcGwoY21kQ29kZSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKKyAgICB9CisKKyAgICAvLyBDb21tb24gY2FzZS4KKyAgICBoaWRsX3ZlYzx1aW50OF90PiBoaWRsRGF0YTsKKyAgICBpZiAocENtZERhdGEgIT0gbnVsbHB0ciAmJiBjbWRTaXplID4gMCkgeworICAgICAgICBoaWRsRGF0YS5zZXRUb0V4dGVybmFsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHBDbWREYXRhKSwgY21kU2l6ZSk7CisgICAgfQorICAgIHN0YXR1c190IHN0YXR1czsKKyAgICB1aW50MzJfdCByZXBseVNpemVTdHViID0gMDsKKyAgICBpZiAocmVwbHlTaXplID09IG51bGxwdHIgfHwgcFJlcGx5RGF0YSA9PSBudWxscHRyKSByZXBseVNpemUgPSAmcmVwbHlTaXplU3R1YjsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Y29tbWFuZChjbWRDb2RlLCBoaWRsRGF0YSwgKnJlcGx5U2l6ZSwKKyAgICAgICAgICAgIFsmXShpbnQzMl90IHMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKnJlcGx5U2l6ZSA+IHJlc3VsdC5zaXplKCkpICpyZXBseVNpemUgPSByZXN1bHQuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSAhPSBudWxscHRyICYmICpyZXBseVNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwgJnJlc3VsdFswXSwgKnJlcGx5U2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcmV0LmlzT2soKSA/IHN0YXR1cyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgeworICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Z2V0RGVzY3JpcHRvcigKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzY3JpcHRvclRvSGFsKHJlc3VsdCwgcERlc2NyaXB0b3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXR2YWwpIDogRkFJTEVEX1RSQU5TQUNUSU9OOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpjbG9zZSgpIHsKKyAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBtRWZmZWN0LT5jbG9zZSgpOworICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpnZXRDb25maWdJbXBsKAorICAgICAgICB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7CisgICAgaWYgKHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICBSZXR1cm48dm9pZD4gcmV0OworICAgIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJRykgeworICAgICAgICByZXQgPSBtRWZmZWN0LT5nZXRDb25maWcoWyZdIChSZXN1bHQgciwgY29uc3QgRWZmZWN0Q29uZmlnICZoaWRsQ29uZmlnKSB7CisgICAgICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHIpOworICAgICAgICAgICAgaWYgKHIgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgIGVmZmVjdENvbmZpZ1RvSGFsKGhpZGxDb25maWcsIHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBSZXBseURhdGEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gbUVmZmVjdC0+Z2V0Q29uZmlnUmV2ZXJzZShbJl0gKFJlc3VsdCByLCBjb25zdCBFZmZlY3RDb25maWcgJmhpZGxDb25maWcpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGFuYWx5emVSZXN1bHQocik7CisgICAgICAgICAgICBpZiAociA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgZWZmZWN0Q29uZmlnVG9IYWwoaGlkbENvbmZpZywgc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocFJlcGx5RGF0YSkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0Q29uZmlnSW1wbCgKKyAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKKyAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpIHx8CisgICAgICAgICAgICByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSB8fCBwUmVwbHlEYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgY29uc3QgZWZmZWN0X2NvbmZpZ190ICpoYWxDb25maWcgPSBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwQ21kRGF0YSk7CisgICAgaWYgKGhhbENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICE9IE5VTEwgfHwKKyAgICAgICAgICAgIGhhbENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAhPSBOVUxMIHx8CisgICAgICAgICAgICBoYWxDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgIT0gTlVMTCB8fAorICAgICAgICAgICAgaGFsQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJCdWZmZXIgcHJvdmlkZXIgY2FsbGJhY2tzIGFyZSBub3Qgc3VwcG9ydGVkIik7CisgICAgfQorICAgIEVmZmVjdENvbmZpZyBoaWRsQ29uZmlnOworICAgIGVmZmVjdENvbmZpZ0Zyb21IYWwoKmhhbENvbmZpZywgJmhpZGxDb25maWcpOworICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHID8KKyAgICAgICAgICAgIG1FZmZlY3QtPnNldENvbmZpZyhoaWRsQ29uZmlnLCBudWxscHRyLCBudWxscHRyKSA6CisgICAgICAgICAgICBtRWZmZWN0LT5zZXRDb25maWdSZXZlcnNlKGhpZGxDb25maWcsIG51bGxwdHIsIG51bGxwdHIpOworICAgIHN0YXR1c190IHJlc3VsdCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHJldCk7CisgICAgICAgICpzdGF0aWNfY2FzdDxpbnQzMl90Kj4ocFJlcGx5RGF0YSkgPSByZXN1bHQ7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdEhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RIYWxIaWRsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdEhhbEhpZGwuaApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEhhbEhpZGwuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDQwZTZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKKyNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCisjaW5jbHVkZSAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgiCisjaW5jbHVkZSAiSGlkbFV0aWxzLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkhpZGxVdGlsczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OlV1aWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpJRWZmZWN0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6UmVzdWx0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0VmZmVjdHNGYWN0b3J5SGFsSGlkbDo6RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCkgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiRWZmZWN0c0ZhY3RvcnkiKSB7CisgICAgbUVmZmVjdHNGYWN0b3J5ID0gSUVmZmVjdHNGYWN0b3J5OjpnZXRTZXJ2aWNlKCk7CisgICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb2J0YWluIElFZmZlY3RzRmFjdG9yeSBzZXJ2aWNlLCB0ZXJtaW5hdGluZyBwcm9jZXNzLiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KK30KKworRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjp+RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCkgeworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OnF1ZXJ5QWxsRGVzY3JpcHRvcnMoKSB7CisgICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Z2V0QWxsRGVzY3JpcHRvcnMoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPEVmZmVjdERlc2NyaXB0b3I+JiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBtTGFzdERlc2NyaXB0b3JzID0gcmVzdWx0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmIChyZXQuaXNPaygpKSB7CisgICAgICAgIHJldHVybiByZXR2YWwgPT0gUmVzdWx0OjpPSyA/IE9LIDogTk9fSU5JVDsKKyAgICB9CisgICAgbUxhc3REZXNjcmlwdG9ycy5yZXNpemUoMCk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OnF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpIHsKKyAgICBzdGF0dXNfdCBxdWVyeVJlc3VsdCA9IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKKyAgICBpZiAocXVlcnlSZXN1bHQgPT0gT0spIHsKKyAgICAgICAgKnBOdW1FZmZlY3RzID0gbUxhc3REZXNjcmlwdG9ycy5zaXplKCk7CisgICAgfQorICAgIHJldHVybiBxdWVyeVJlc3VsdDsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpnZXREZXNjcmlwdG9yKAorICAgICAgICB1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKKyAgICAvLyBUT0RPOiBXZSBuZWVkIHNvbWVob3cgdG8gdHJhY2sgdGhlIGNoYW5nZXMgb24gdGhlIHNlcnZlciBzaWRlCisgICAgLy8gb3IgZmlndXJlIG91dCBob3cgdG8gY29udmVydCBldmVyeWJvZHkgdG8gcXVlcnkgYWxsIHRoZSBkZXNjcmlwdG9ycyBhdCBvbmNlLgorICAgIC8vIFRPRE86IGNoZWNrIGZvciBudWxscHRyCisgICAgaWYgKG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgc3RhdHVzX3QgcXVlcnlSZXN1bHQgPSBxdWVyeUFsbERlc2NyaXB0b3JzKCk7CisgICAgICAgIGlmIChxdWVyeVJlc3VsdCAhPSBPSykgcmV0dXJuIHF1ZXJ5UmVzdWx0OworICAgIH0KKyAgICBpZiAoaW5kZXggPj0gbUxhc3REZXNjcmlwdG9ycy5zaXplKCkpIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwobUxhc3REZXNjcmlwdG9yc1tpbmRleF0sIHBEZXNjcmlwdG9yKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcigKKyAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CisgICAgLy8gVE9ETzogY2hlY2sgZm9yIG51bGxwdHIKKyAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOworICAgIFV1aWQgaGlkbFV1aWQ7CisgICAgSGlkbFV0aWxzOjp1dWlkRnJvbUhhbCgqcEVmZmVjdFV1aWQsICZoaWRsVXVpZCk7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmdldERlc2NyaXB0b3IoaGlkbFV1aWQsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbChyZXN1bHQsIHBEZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHJldHVybiBPSzsKKyAgICAgICAgZWxzZSBpZiAocmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFMpIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICAgICAgZWxzZSByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmNyZWF0ZUVmZmVjdCgKKyAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsCisgICAgICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gKmVmZmVjdCkgeworICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgVXVpZCBoaWRsVXVpZDsKKyAgICBIaWRsVXRpbHM6OnV1aWRGcm9tSGFsKCpwRWZmZWN0VXVpZCwgJmhpZGxVdWlkKTsKKyAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Y3JlYXRlRWZmZWN0KAorICAgICAgICAgICAgaGlkbFV1aWQsIHNlc3Npb25JZCwgaW9JZCwKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SUVmZmVjdD4mIHJlc3VsdCwgdWludDY0X3QgZWZmZWN0SWQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqZWZmZWN0ID0gbmV3IEVmZmVjdEhhbEhpZGwocmVzdWx0LCBlZmZlY3RJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKHJldC5pc09rKCkpIHsKKyAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7CisgICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpkdW1wRWZmZWN0cyhpbnQgZmQpIHsKKyAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOworICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOworICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5kZWJ1Z0R1bXAoaGlkbEhhbmRsZSk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmFsbG9jYXRlQnVmZmVyKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKKyAgICByZXR1cm4gRWZmZWN0QnVmZmVySGFsSGlkbDo6YWxsb2NhdGUoc2l6ZSwgYnVmZmVyKTsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjptaXJyb3JCdWZmZXIodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKKyAgICByZXR1cm4gRWZmZWN0QnVmZmVySGFsSGlkbDo6bWlycm9yKGV4dGVybmFsLCBzaXplLCBidWZmZXIpOworfQorCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmI1NDgxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvMi4wL0lFZmZlY3RzRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkVmZmVjdERlc2NyaXB0b3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpJRWZmZWN0c0ZhY3Rvcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKKworY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsIDogcHVibGljIEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKK3sKKyAgcHVibGljOgorICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgZWZmZWN0cyBpbiBhbGwgbG9hZGVkIGxpYnJhcmllcy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpOworCisgICAgLy8gUmV0dXJucyBhIGRlc2NyaXB0b3Igb2YgdGhlIG5leHQgYXZhaWxhYmxlIGVmZmVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IodWludDMyX3QgaW5kZXgsCisgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCisgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7CisKKyAgICAvLyBDcmVhdGVzIGFuIGVmZmVjdCBlbmdpbmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgorICAgIC8vIFRvIHJlbGVhc2UgdGhlIGVmZmVjdCBlbmdpbmUsIGl0IGlzIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMKKyAgICAvLyB0byB0aGUgcmV0dXJuZWQgZWZmZWN0IG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwKKyAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsCisgICAgICAgICAgICBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+ICplZmZlY3QpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wRWZmZWN0cyhpbnQgZmQpOworCisgICAgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXIoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgbWlycm9yQnVmZmVyKHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSBvdmVycmlkZTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTsKKworICAgIHNwPElFZmZlY3RzRmFjdG9yeT4gbUVmZmVjdHNGYWN0b3J5OworICAgIGhpZGxfdmVjPEVmZmVjdERlc2NyaXB0b3I+IG1MYXN0RGVzY3JpcHRvcnM7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCk7CisgICAgdmlydHVhbCB+RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCk7CisKKyAgICBzdGF0dXNfdCBxdWVyeUFsbERlc2NyaXB0b3JzKCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsSGlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg2OWNkMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxIaWRsLmNwcApAQCAtMCwwICsxLDc2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiU3RyZWFtSGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lTdHJlYW1PdXRDYWxsYmFjay5oPgorI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgorI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKKyNpbmNsdWRlICJTdHJlYW1IYWxIaWRsLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvQ2hhbm5lbE1hc2s7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0Zvcm1hdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OlRocmVhZEluZm87Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6QXVkaW9EcmFpbjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtT3V0Q2FsbGJhY2s7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6TWVzc2FnZVF1ZXVlRmxhZ0JpdHM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6TW1hcEJ1ZmZlckluZm87Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6TW1hcFBvc2l0aW9uOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlBhcmFtZXRlclZhbHVlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpUaW1lU3BlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgUmVhZENvbW1hbmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbUluOjpSZWFkQ29tbWFuZDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitTdHJlYW1IYWxIaWRsOjpTdHJlYW1IYWxIaWRsKElTdHJlYW0gKnN0cmVhbSkKKyAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiU3RyZWFtIiksCisgICAgICAgICAgbVN0cmVhbShzdHJlYW0pLAorICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eShIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQpLAorICAgICAgICAgIG1DYWNoZWRCdWZmZXJTaXplKDApeworCisgICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgorICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpKSB7CisgICAgICAgIC8vIE9idGFpbiBhdWRpbyBwcm9wZXJ0aWVzIChzZWUgU3RyZWFtSGFsSGlkbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKCkgYmVsb3cpLgorICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKAorICAgICAgICAgICAgICAgIFsmXSh1aW50MzJfdCBzciwgQXVkaW9DaGFubmVsTWFzayBtLCBBdWRpb0Zvcm1hdCBmKSB7CisgICAgICAgICAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmluaXQoc3IsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4obSksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4oZikpOworICAgICAgICAgICAgfSk7CisgICAgfQorfQorCitTdHJlYW1IYWxIaWRsOjp+U3RyZWFtSGFsSGlkbCgpIHsKKyAgICBtU3RyZWFtID0gbnVsbHB0cjsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFNhbXBsZVJhdGUiLCBtU3RyZWFtLT5nZXRTYW1wbGVSYXRlKCksIHJhdGUpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcHJvY2Vzc1JldHVybigiZ2V0QnVmZmVyU2l6ZSIsIG1TdHJlYW0tPmdldEJ1ZmZlclNpemUoKSwgc2l6ZSk7CisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICBtQ2FjaGVkQnVmZmVyU2l6ZSA9ICpzaXplOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaykgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldENoYW5uZWxNYXNrIiwgbVN0cmVhbS0+Z2V0Q2hhbm5lbE1hc2soKSwgbWFzayk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Rm9ybWF0IiwgbVN0cmVhbS0+Z2V0Rm9ybWF0KCksIGZvcm1hdCk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKAorICAgICAgICAgICAgWyZdKHVpbnQzMl90IHNyLCBBdWRpb0NoYW5uZWxNYXNrIG0sIEF1ZGlvRm9ybWF0IGYpIHsKKyAgICAgICAgICAgICAgICAqc2FtcGxlUmF0ZSA9IHNyOworICAgICAgICAgICAgICAgICptYXNrID0gc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pOworICAgICAgICAgICAgICAgICpmb3JtYXQgPSBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4oZik7CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qcm9wZXJ0aWVzIiwgcmV0KTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gaGlkbFBhcmFtczsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbWV0ZXJzRnJvbUhhbChrdlBhaXJzLCAmaGlkbFBhcmFtcyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0UGFyYW1ldGVycyIsIG1TdHJlYW0tPnNldFBhcmFtZXRlcnMoaGlkbFBhcmFtcykpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgeworICAgIHZhbHVlcy0+Y2xlYXIoKTsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBoaWRsS2V5czsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBrZXlzRnJvbUhhbChrZXlzLCAmaGlkbEtleXMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0UGFyYW1ldGVycygKKyAgICAgICAgICAgIGhpZGxLZXlzLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzVG9IYWwocGFyYW1ldGVycywgdmFsdWVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UGFyYW1ldGVycyIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6YWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiYWRkRWZmZWN0IiwgbVN0cmVhbS0+YWRkRWZmZWN0KAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxIaWRsKj4oZWZmZWN0LmdldCgpKS0+ZWZmZWN0SWQoKSkpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpyZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJyZW1vdmVFZmZlY3QiLCBtU3RyZWFtLT5yZW1vdmVFZmZlY3QoCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEhhbEhpZGwqPihlZmZlY3QuZ2V0KCkpLT5lZmZlY3RJZCgpKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YW5kYnkoKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RhbmRieSIsIG1TdHJlYW0tPnN0YW5kYnkoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmR1bXAoaW50IGZkKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmRlYnVnRHVtcChoaWRsSGFuZGxlKTsKKyAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKKyAgICBtU3RyZWFtUG93ZXJMb2cuZHVtcChmZCk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImR1bXAiLCByZXQpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzdGFydCgpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdGFydCIsIG1TdHJlYW0tPnN0YXJ0KCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzdG9wKCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0b3AiLCBtU3RyZWFtLT5zdG9wKCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgeworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmNyZWF0ZU1tYXBCdWZmZXIoCisgICAgICAgICAgICBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBNbWFwQnVmZmVySW5mbyYgaGlkbEluZm8pIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlICpoYW5kbGUgPSBoaWRsSW5mby5zaGFyZWRNZW1vcnkuaGFuZGxlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGUtPm51bUZkcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNoYXJlZF9tZW1vcnlfZmQgPSBoYW5kbGUtPmRhdGFbMF07CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5idWZmZXJfc2l6ZV9mcmFtZXMgPSBoaWRsSW5mby5idWZmZXJTaXplRnJhbWVzOworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVyc3Rfc2l6ZV9mcmFtZXMgPSBoaWRsSW5mby5idXJzdFNpemVGcmFtZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmZvLT5zaGFyZWRfbWVtb3J5X2FkZHJlc3MgaXMgbm90IG5lZWRlZCBpbiBISURMIGNvbnRleHQKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNoYXJlZF9tZW1vcnlfYWRkcmVzcyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJjcmVhdGVNbWFwQnVmZmVyIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0TW1hcFBvc2l0aW9uKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBNbWFwUG9zaXRpb24mIGhpZGxQb3NpdGlvbikgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLT50aW1lX25hbm9zZWNvbmRzID0gaGlkbFBvc2l0aW9uLnRpbWVOYW5vc2Vjb25kczsKKyAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24tPnBvc2l0aW9uX2ZyYW1lcyA9IGhpZGxQb3NpdGlvbi5wb3NpdGlvbkZyYW1lczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TW1hcFBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQgcHJpb3JpdHkpIHsKKyAgICBtSGFsVGhyZWFkUHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldENhY2hlZEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgaWYgKG1DYWNoZWRCdWZmZXJTaXplICE9IDApIHsKKyAgICAgICAgKnNpemUgPSBtQ2FjaGVkQnVmZmVyU2l6ZTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gZ2V0QnVmZmVyU2l6ZShzaXplKTsKK30KKworYm9vbCBTdHJlYW1IYWxIaWRsOjpyZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkocGlkX3QgdGhyZWFkUGlkLCBwaWRfdCB0aHJlYWRJZCkgeworICAgIGlmIChtSGFsVGhyZWFkUHJpb3JpdHkgPT0gSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpbnQgZXJyID0gcmVxdWVzdFByaW9yaXR5KAorICAgICAgICAgICAgdGhyZWFkUGlkLCB0aHJlYWRJZCwKKyAgICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eSwgZmFsc2UgLyppc0ZvckFwcCovLCB0cnVlIC8qYXN5bmNocm9ub3VzKi8pOworICAgIEFMT0dFX0lGKGVyciwgImZhaWxlZCB0byBzZXQgcHJpb3JpdHkgJWQgZm9yIHBpZCAlZCB0aWQgJWQ7IGVycm9yICVkIiwKKyAgICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eSwgdGhyZWFkUGlkLCB0aHJlYWRJZCwgZXJyKTsKKyAgICAvLyBBdWRpbyB3aWxsIHN0aWxsIHdvcmssIGJ1dCBsYXRlbmN5IHdpbGwgYmUgaGlnaGVyIGFuZCBzb21ldGltZXMgdW5hY2NlcHRhYmxlLgorICAgIHJldHVybiBlcnIgPT0gMDsKK30KKworbmFtZXNwYWNlIHsKKworLyogTm90ZXMgb24gY2FsbGJhY2sgb3duZXJzaGlwLgorCitUaGlzIGlzIGhvdyAoSHcpQmluZGVyIG93bmVyc2hpcCBtb2RlbCBsb29rcyBsaWtlLiBUaGUgc2VydmVyIGltcGxlbWVudGF0aW9uCitpcyBvd25lZCBieSBCaW5kZXIgZnJhbWV3b3JrICh2aWEgc3A8PikuIFByb3hpZXMgYXJlIG93bmVkIGJ5IGNsaWVudHMuCitXaGVuIHRoZSBsYXN0IHByb3h5IGRpc2FwcGVhcnMsIEJpbmRlciBmcmFtZXdvcmsgcmVsZWFzZXMgdGhlIHNlcnZlciBpbXBsLgorCitUaHVzLCBpdCBpcyBub3QgbmVlZGVkIHRvIGtlZXAgYW55IHJlZmVyZW5jZXMgdG8gU3RyZWFtT3V0Q2FsbGJhY2sgKHRoaXMgaXMKK3RoZSBzZXJ2ZXIgaW1wbCkgLS0gaXQgd2lsbCBsaXZlIGFzIGxvbmcgYXMgSEFMIHNlcnZlciBob2xkcyBhIHN0cm9uZyByZWYgdG8KK0lTdHJlYW1PdXRDYWxsYmFjayBwcm94eS4gV2UgY2xlYXIgdGhhdCByZWZlcmVuY2UgYnkgY2FsbGluZyAnY2xlYXJDYWxsYmFjaycKK2Zyb20gdGhlIGRlc3RydWN0b3Igb2YgU3RyZWFtT3V0SGFsSGlkbC4KKworVGhlIGNhbGxiYWNrIG9ubHkga2VlcHMgYSB3ZWFrIHJlZmVyZW5jZSB0byB0aGUgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIG93bmVkCitieSBBdWRpb0ZsaW5nZXIuCisKKyovCisKK3N0cnVjdCBTdHJlYW1PdXRDYWxsYmFjayA6IHB1YmxpYyBJU3RyZWFtT3V0Q2FsbGJhY2sgeworICAgIFN0cmVhbU91dENhbGxiYWNrKGNvbnN0IHdwPFN0cmVhbU91dEhhbEhpZGw+JiBzdHJlYW0pIDogbVN0cmVhbShzdHJlYW0pIHt9CisKKyAgICAvLyBJU3RyZWFtT3V0Q2FsbGJhY2sgaW1wbGVtZW50YXRpb24KKyAgICBSZXR1cm48dm9pZD4gb25Xcml0ZVJlYWR5KCkgIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChzdHJlYW0gIT0gMCkgeworICAgICAgICAgICAgc3RyZWFtLT5vbldyaXRlUmVhZHkoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIFJldHVybjx2b2lkPiBvbkRyYWluUmVhZHkoKSAgb3ZlcnJpZGUgeworICAgICAgICBzcDxTdHJlYW1PdXRIYWxIaWRsPiBzdHJlYW0gPSBtU3RyZWFtLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHN0cmVhbSAhPSAwKSB7CisgICAgICAgICAgICBzdHJlYW0tPm9uRHJhaW5SZWFkeSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgUmV0dXJuPHZvaWQ+IG9uRXJyb3IoKSAgb3ZlcnJpZGUgeworICAgICAgICBzcDxTdHJlYW1PdXRIYWxIaWRsPiBzdHJlYW0gPSBtU3RyZWFtLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHN0cmVhbSAhPSAwKSB7CisgICAgICAgICAgICBzdHJlYW0tPm9uRXJyb3IoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICBwcml2YXRlOgorICAgIHdwPFN0cmVhbU91dEhhbEhpZGw+IG1TdHJlYW07Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworU3RyZWFtT3V0SGFsSGlkbDo6U3RyZWFtT3V0SGFsSGlkbChjb25zdCBzcDxJU3RyZWFtT3V0PiYgc3RyZWFtKQorICAgICAgICA6IFN0cmVhbUhhbEhpZGwoc3RyZWFtLmdldCgpKSwgbVN0cmVhbShzdHJlYW0pLCBtV3JpdGVyQ2xpZW50KDApLCBtRWZHcm91cChudWxscHRyKSB7Cit9CisKK1N0cmVhbU91dEhhbEhpZGw6On5TdHJlYW1PdXRIYWxIaWRsKCkgeworICAgIGlmIChtU3RyZWFtICE9IDApIHsKKyAgICAgICAgaWYgKG1DYWxsYmFjay51bnNhZmVfZ2V0KCkpIHsKKyAgICAgICAgICAgIHByb2Nlc3NSZXR1cm4oImNsZWFyQ2FsbGJhY2siLCBtU3RyZWFtLT5jbGVhckNhbGxiYWNrKCkpOworICAgICAgICB9CisgICAgICAgIHByb2Nlc3NSZXR1cm4oImNsb3NlIiwgbVN0cmVhbS0+Y2xvc2UoKSk7CisgICAgICAgIG1TdHJlYW0uY2xlYXIoKTsKKyAgICB9CisgICAgbUNhbGxiYWNrLmNsZWFyKCk7CisgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKyAgICBpZiAobUVmR3JvdXApIHsKKyAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKKyAgICB9Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0RnJhbWVTaXplIiwgbVN0cmVhbS0+Z2V0RnJhbWVTaXplKCksIHNpemUpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaWYgKG1Xcml0ZXJDbGllbnQgPT0gZ2V0dGlkKCkgJiYgbUNvbW1hbmRNUSkgeworICAgICAgICByZXR1cm4gY2FsbFdyaXRlclRocmVhZCgKKyAgICAgICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OkdFVF9MQVRFTkNZLCAiZ2V0TGF0ZW5jeSIsIG51bGxwdHIsIDAsCisgICAgICAgICAgICAgICAgWyZdKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAqbGF0ZW5jeSA9IHdyaXRlU3RhdHVzLnJlcGx5LmxhdGVuY3lNczsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TGF0ZW5jeSIsIG1TdHJlYW0tPmdldExhdGVuY3koKSwgbGF0ZW5jeSk7CisgICAgfQorfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0Vm9sdW1lIiwgbVN0cmVhbS0+c2V0Vm9sdW1lKGxlZnQsIHJpZ2h0KSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OndyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICAqd3JpdHRlbiA9IDA7CisKKyAgICBpZiAoYnl0ZXMgPT0gMCAmJiAhbURhdGFNUSkgeworICAgICAgICAvLyBDYW4ndCBkZXRlcm1pbmUgdGhlIHNpemUgZm9yIHRoZSBNUSBidWZmZXIuIFdhaXQgZm9yIGEgbm9uLWVtcHR5IHdyaXRlIHJlcXVlc3QuCisgICAgICAgIEFMT0dXX0lGKG1DYWxsYmFjay51bnNhZmVfZ2V0KCksICJGaXJzdCBjYWxsIHRvIGFzeW5jIHdyaXRlIHdpdGggMCBieXRlcyIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICghbURhdGFNUSkgeworICAgICAgICAvLyBJbiBjYXNlIGlmIHBsYXliYWNrIHN0YXJ0cyBjbG9zZSB0byB0aGUgZW5kIG9mIGEgY29tcHJlc3NlZCB0cmFjaywgdGhlIGJ5dGVzCisgICAgICAgIC8vIHRoYXQgbmVlZCB0byBiZSB3cml0dGVuIGlzIGxlc3MgdGhhbiB0aGUgYWN0dWFsIGJ1ZmZlciBzaXplLiBOZWVkIHRvIHVzZQorICAgICAgICAvLyBmdWxsIGJ1ZmZlciBzaXplIGZvciB0aGUgTVEgc2luY2Ugb3RoZXJ3aXNlIGFmdGVyIHNlZWtpbmcgYmFjayB0byB0aGUgbWlkZGxlCisgICAgICAgIC8vIGRhdGEgd2lsbCBiZSB0cnVuY2F0ZWQuCisgICAgICAgIHNpemVfdCBidWZmZXJTaXplOworICAgICAgICBpZiAoKHN0YXR1cyA9IGdldENhY2hlZEJ1ZmZlclNpemUoJmJ1ZmZlclNpemUpKSAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnl0ZXMgPiBidWZmZXJTaXplKSBidWZmZXJTaXplID0gYnl0ZXM7CisgICAgICAgIGlmICgoc3RhdHVzID0gcHJlcGFyZUZvcldyaXRpbmcoYnVmZmVyU2l6ZSkpICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdHVzID0gY2FsbFdyaXRlclRocmVhZCgKKyAgICAgICAgICAgIFdyaXRlQ29tbWFuZDo6V1JJVEUsICJ3cml0ZSIsIHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QqPihidWZmZXIpLCBieXRlcywKKyAgICAgICAgICAgIFsmXSAoY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgKndyaXR0ZW4gPSB3cml0ZVN0YXR1cy5yZXBseS53cml0dGVuOworICAgICAgICAgICAgICAgIC8vIERpYWdub3N0aWNzIG9mIHRoZSBjYXVzZSBvZiBiLzM1ODEzMTEzLgorICAgICAgICAgICAgICAgIEFMT0dFX0lGKCp3cml0dGVuID4gYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAiaGFsIHJlcG9ydHMgbW9yZSBieXRlcyB3cml0dGVuIHRoYW4gYXNrZWQgZm9yOiAlbGxkID4gJWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSp3cml0dGVuLCAobG9uZyBsb25nKWJ5dGVzKTsKKyAgICAgICAgICAgIH0pOworICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqd3JpdHRlbik7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Y2FsbFdyaXRlclRocmVhZCgKKyAgICAgICAgV3JpdGVDb21tYW5kIGNtZCwgY29uc3QgY2hhciogY21kTmFtZSwKKyAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFTaXplLCBTdHJlYW1PdXRIYWxIaWRsOjpXcml0ZXJDYWxsYmFjayBjYWxsYmFjaykgeworICAgIGlmICghbUNvbW1hbmRNUS0+d3JpdGUoJmNtZCkpIHsKKyAgICAgICAgQUxPR0UoImNvbW1hbmQgbWVzc2FnZSBxdWV1ZSB3cml0ZSBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOworICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICB9CisgICAgaWYgKGRhdGEgIT0gbnVsbHB0cikgeworICAgICAgICBzaXplX3QgYXZhaWxhYmxlVG9Xcml0ZSA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvV3JpdGUoKTsKKyAgICAgICAgaWYgKGRhdGFTaXplID4gYXZhaWxhYmxlVG9Xcml0ZSkgeworICAgICAgICAgICAgQUxPR1coInRydW5jYXRpbmcgd3JpdGUgZGF0YSBmcm9tICVsbGQgdG8gJWxsZCBkdWUgdG8gaW5zdWZmaWNpZW50IGRhdGEgcXVldWUgc3BhY2UiLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWRhdGFTaXplLCAobG9uZyBsb25nKWF2YWlsYWJsZVRvV3JpdGUpOworICAgICAgICAgICAgZGF0YVNpemUgPSBhdmFpbGFibGVUb1dyaXRlOworICAgICAgICB9CisgICAgICAgIGlmICghbURhdGFNUS0+d3JpdGUoZGF0YSwgZGF0YVNpemUpKSB7CisgICAgICAgICAgICBBTE9HRSgiZGF0YSBtZXNzYWdlIHF1ZXVlIHdyaXRlIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgbUVmR3JvdXAtPndha2Uoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpKTsKKworICAgIC8vIFRPRE86IFJlbW92ZSBtYW51YWwgZXZlbnQgZmxhZyBoYW5kbGluZyBvbmNlIGJsb2NraW5nIE1RIGlzIGltcGxlbWVudGVkLiBiLzMzODE1NDIyCisgICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7CityZXRyeToKKyAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSwgJmVmU3RhdGUpOworICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRlVMTCkpIHsKKyAgICAgICAgV3JpdGVTdGF0dXMgd3JpdGVTdGF0dXM7CisgICAgICAgIHdyaXRlU3RhdHVzLnJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgICAgICBpZiAoIW1TdGF0dXNNUS0+cmVhZCgmd3JpdGVTdGF0dXMpKSB7CisgICAgICAgICAgICBBTE9HRSgic3RhdHVzIG1lc3NhZ2UgcmVhZCBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOworICAgICAgICB9CisgICAgICAgIGlmICh3cml0ZVN0YXR1cy5yZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgcmV0ID0gT0s7CisgICAgICAgICAgICBjYWxsYmFjayh3cml0ZVN0YXR1cyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBwcm9jZXNzUmV0dXJuKGNtZE5hbWUsIHdyaXRlU3RhdHVzLnJldHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKKyAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCisgICAgICAgIGdvdG8gcmV0cnk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnByZXBhcmVGb3JXcml0aW5nKHNpemVfdCBidWZmZXJTaXplKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gdGVtcENvbW1hbmRNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiB0ZW1wRGF0YU1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gdGVtcFN0YXR1c01ROworICAgIFJlc3VsdCByZXR2YWw7CisgICAgcGlkX3QgaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnByZXBhcmVGb3JXcml0aW5nKAorICAgICAgICAgICAgMSwgYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWFuZE1ROjpEZXNjcmlwdG9yJiBjb21tYW5kTVEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFNUTo6RGVzY3JpcHRvciYgZGF0YU1RLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0dXNNUTo6RGVzY3JpcHRvciYgc3RhdHVzTVEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmVhZEluZm8mIGhhbFRocmVhZEluZm8pIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICB0ZW1wQ29tbWFuZE1RLnJlc2V0KG5ldyBDb21tYW5kTVEoY29tbWFuZE1RKSk7CisgICAgICAgICAgICAgICAgICAgIHRlbXBEYXRhTVEucmVzZXQobmV3IERhdGFNUShkYXRhTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcFN0YXR1c01RLnJlc2V0KG5ldyBTdGF0dXNNUShzdGF0dXNNUSkpOworICAgICAgICAgICAgICAgICAgICBpZiAodGVtcERhdGFNUS0+aXNWYWxpZCgpICYmIHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFBpZCA9IGhhbFRocmVhZEluZm8ucGlkOworICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRUaWQgPSBoYWxUaHJlYWRJbmZvLnRpZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInByZXBhcmVGb3JXcml0aW5nIiwgcmV0LCByZXR2YWwpOworICAgIH0KKyAgICBpZiAoIXRlbXBDb21tYW5kTVEgfHwgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSB8fAorICAgICAgICAgICAgIXRlbXBEYXRhTVEgfHwgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSB8fAorICAgICAgICAgICAgIXRlbXBTdGF0dXNNUSB8fCAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgfHwKKyAgICAgICAgICAgICFtRWZHcm91cCkgeworICAgICAgICBBTE9HRV9JRighdGVtcENvbW1hbmRNUSwgIkZhaWxlZCB0byBvYnRhaW4gY29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBDb21tYW5kTVEgJiYgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSwKKyAgICAgICAgICAgICAgICAiQ29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0VfSUYoIXRlbXBEYXRhTVEsICJGYWlsZWQgdG8gb2J0YWluIGRhdGEgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOworICAgICAgICBBTE9HRV9JRih0ZW1wRGF0YU1RICYmICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCksICJEYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOworICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOworICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAorICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIHdyaXRpbmcgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkoaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQpOworCisgICAgbUNvbW1hbmRNUSA9IHN0ZDo6bW92ZSh0ZW1wQ29tbWFuZE1RKTsKKyAgICBtRGF0YU1RID0gc3RkOjptb3ZlKHRlbXBEYXRhTVEpOworICAgIG1TdGF0dXNNUSA9IHN0ZDo6bW92ZSh0ZW1wU3RhdHVzTVEpOworICAgIG1Xcml0ZXJDbGllbnQgPSBnZXR0aWQoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRSZW5kZXJQb3NpdGlvbigKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDMyX3QgZCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpkc3BGcmFtZXMgPSBkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRSZW5kZXJQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldE5leHRXcml0ZVRpbWVzdGFtcCgKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgaW50NjRfdCB0KSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnRpbWVzdGFtcCA9IHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFJlbmRlclBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBwcm9jZXNzUmV0dXJuKAorICAgICAgICAgICAgInNldENhbGxiYWNrIiwgbVN0cmVhbS0+c2V0Q2FsbGJhY2sobmV3IFN0cmVhbU91dENhbGxiYWNrKHRoaXMpKSk7CisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5zdXBwb3J0c1BhdXNlQW5kUmVzdW1lKAorICAgICAgICAgICAgWyZdKGJvb2wgcCwgYm9vbCByKSB7CisgICAgICAgICAgICAgICAgKnN1cHBvcnRzUGF1c2UgPSBwOworICAgICAgICAgICAgICAgICpzdXBwb3J0c1Jlc3VtZSA9IHI7CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNQYXVzZUFuZFJlc3VtZSIsIHJldCk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnBhdXNlKCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPnBhdXNlKCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpyZXN1bWUoKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+cmVzdW1lKCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNEcmFpbiIsIG1TdHJlYW0tPnN1cHBvcnRzRHJhaW4oKSwgc3VwcG9ydHNEcmFpbik7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmRyYWluKGJvb2wgZWFybHlOb3RpZnkpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigKKyAgICAgICAgICAgICJkcmFpbiIsIG1TdHJlYW0tPmRyYWluKGVhcmx5Tm90aWZ5ID8gQXVkaW9EcmFpbjo6RUFSTFlfTk9USUZZIDogQXVkaW9EcmFpbjo6QUxMKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmZsdXNoKCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPmZsdXNoKCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIGlmIChtV3JpdGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKKyAgICAgICAgcmV0dXJuIGNhbGxXcml0ZXJUaHJlYWQoCisgICAgICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpHRVRfUFJFU0VOVEFUSU9OX1BPU0lUSU9OLCAiZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24iLCBudWxscHRyLCAwLAorICAgICAgICAgICAgICAgIFsmXShjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLmZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9zZWMgPSB3cml0ZVN0YXR1cy5yZXBseS5wcmVzZW50YXRpb25Qb3NpdGlvbi50aW1lU3RhbXAudHZTZWM7CisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfbnNlYyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLnRpbWVTdGFtcC50dk5TZWM7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUmVzdWx0IHJldHZhbDsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFByZXNlbnRhdGlvblBvc2l0aW9uKAorICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgaGlkbEZyYW1lcywgY29uc3QgVGltZVNwZWMmIGhpZGxUaW1lU3RhbXApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gaGlkbEZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfc2VjID0gaGlkbFRpbWVTdGFtcC50dlNlYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfbnNlYyA9IGhpZGxUaW1lU3RhbXAudHZOU2VjOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRQcmVzZW50YXRpb25Qb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKKyAgICB9Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiAvKiBzb3VyY2VNZXRhZGF0YSAqLykgeworICAgIC8vIEF1ZGlvIEhBTCBWMi4wIGRvZXMgbm90IHN1cHBvcnQgcHJvcGFnYXRpbmcgc291cmNlIG1ldGFkYXRhCisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCit2b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uV3JpdGVSZWFkeSgpIHsKKyAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOworICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47CisgICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25Xcml0ZVJlYWR5Iik7CisgICAgY2FsbGJhY2stPm9uV3JpdGVSZWFkeSgpOworfQorCit2b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRHJhaW5SZWFkeSgpIHsKKyAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOworICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47CisgICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25EcmFpblJlYWR5Iik7CisgICAgY2FsbGJhY2stPm9uRHJhaW5SZWFkeSgpOworfQorCit2b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRXJyb3IoKSB7CisgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKKyAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOworICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uRXJyb3IiKTsKKyAgICBjYWxsYmFjay0+b25FcnJvcigpOworfQorCisKK1N0cmVhbUluSGFsSGlkbDo6U3RyZWFtSW5IYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1Jbj4mIHN0cmVhbSkKKyAgICAgICAgOiBTdHJlYW1IYWxIaWRsKHN0cmVhbS5nZXQoKSksIG1TdHJlYW0oc3RyZWFtKSwgbVJlYWRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgeworfQorCitTdHJlYW1JbkhhbEhpZGw6On5TdHJlYW1JbkhhbEhpZGwoKSB7CisgICAgaWYgKG1TdHJlYW0gIT0gMCkgeworICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbG9zZSIsIG1TdHJlYW0tPmNsb3NlKCkpOworICAgICAgICBtU3RyZWFtLmNsZWFyKCk7CisgICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisgICAgfQorICAgIGlmIChtRWZHcm91cCkgeworICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOworICAgIH0KK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZyYW1lU2l6ZSIsIG1TdHJlYW0tPmdldEZyYW1lU2l6ZSgpLCBzaXplKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpzZXRHYWluKGZsb2F0IGdhaW4pIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0R2FpbiIsIG1TdHJlYW0tPnNldEdhaW4oZ2FpbikpOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgICpyZWFkID0gMDsKKworICAgIGlmIChieXRlcyA9PSAwICYmICFtRGF0YU1RKSB7CisgICAgICAgIC8vIENhbid0IGRldGVybWluZSB0aGUgc2l6ZSBmb3IgdGhlIE1RIGJ1ZmZlci4gV2FpdCBmb3IgYSBub24tZW1wdHkgcmVhZCByZXF1ZXN0LgorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICghbURhdGFNUSAmJiAoc3RhdHVzID0gcHJlcGFyZUZvclJlYWRpbmcoYnl0ZXMpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKKyAgICBwYXJhbXMuY29tbWFuZCA9IFJlYWRDb21tYW5kOjpSRUFEOworICAgIHBhcmFtcy5wYXJhbXMucmVhZCA9IGJ5dGVzOworICAgIHN0YXR1cyA9IGNhbGxSZWFkZXJUaHJlYWQocGFyYW1zLCAicmVhZCIsCisgICAgICAgICAgICBbJl0oY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cykgeworICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhdmFpbFRvUmVhZCA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvUmVhZCgpOworICAgICAgICAgICAgICAgIGlmICghbURhdGFNUS0+cmVhZChzdGF0aWNfY2FzdDx1aW50OF90Kj4oYnVmZmVyKSwgc3RkOjptaW4oYnl0ZXMsIGF2YWlsVG9SZWFkKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImRhdGEgbWVzc2FnZSBxdWV1ZSByZWFkIGZhaWxlZCBmb3IgXCJyZWFkXCIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1dfSUYoYXZhaWxUb1JlYWQgIT0gcmVhZFN0YXR1cy5yZXBseS5yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgIkhBTCByZWFkIHJlcG9ydCBpbmNvbnNpc3RlbnQ6IG1xID0gJWQsIHN0YXR1cyA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KWF2YWlsVG9SZWFkLCAoaW50MzJfdClyZWFkU3RhdHVzLnJlcGx5LnJlYWQpOworICAgICAgICAgICAgICAgICpyZWFkID0gcmVhZFN0YXR1cy5yZXBseS5yZWFkOworICAgICAgICAgICAgfSk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICpyZWFkKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmNhbGxSZWFkZXJUaHJlYWQoCisgICAgICAgIGNvbnN0IFJlYWRQYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCisgICAgICAgIFN0cmVhbUluSGFsSGlkbDo6UmVhZGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICBpZiAoIW1Db21tYW5kTVEtPndyaXRlKCZwYXJhbXMpKSB7CisgICAgICAgIEFMT0dXKCJjb21tYW5kIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIik7CisgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgIH0KKyAgICBtRWZHcm91cC0+d2FrZShzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSk7CisKKyAgICAvLyBUT0RPOiBSZW1vdmUgbWFudWFsIGV2ZW50IGZsYWcgaGFuZGxpbmcgb25jZSBibG9ja2luZyBNUSBpcyBpbXBsZW1lbnRlZC4gYi8zMzgxNTQyMgorICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOworcmV0cnk6CisgICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpLCAmZWZTdGF0ZSk7CisgICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSkpIHsKKyAgICAgICAgUmVhZFN0YXR1cyByZWFkU3RhdHVzOworICAgICAgICByZWFkU3RhdHVzLnJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgICAgICBpZiAoIW1TdGF0dXNNUS0+cmVhZCgmcmVhZFN0YXR1cykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJzdGF0dXMgbWVzc2FnZSByZWFkIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgIGlmIChyZWFkU3RhdHVzLnJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICByZXQgPSBPSzsKKyAgICAgICAgICAgIGNhbGxiYWNrKHJlYWRTdGF0dXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc1JldHVybihjbWROYW1lLCByZWFkU3RhdHVzLnJldHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKKyAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCisgICAgICAgIGdvdG8gcmV0cnk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6cHJlcGFyZUZvclJlYWRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiB0ZW1wQ29tbWFuZE1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IHRlbXBEYXRhTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBwaWRfdCBoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+cHJlcGFyZUZvclJlYWRpbmcoCisgICAgICAgICAgICAxLCBidWZmZXJTaXplLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kTVE6OkRlc2NyaXB0b3ImIGNvbW1hbmRNUSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YU1ROjpEZXNjcmlwdG9yJiBkYXRhTVEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXR1c01ROjpEZXNjcmlwdG9yJiBzdGF0dXNNUSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkSW5mbyYgaGFsVGhyZWFkSW5mbykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXBDb21tYW5kTVEucmVzZXQobmV3IENvbW1hbmRNUShjb21tYW5kTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcERhdGFNUS5yZXNldChuZXcgRGF0YU1RKGRhdGFNUSkpOworICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgJiYgdGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkUGlkID0gaGFsVGhyZWFkSW5mby5waWQ7CisgICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFRpZCA9IGhhbFRocmVhZEluZm8udGlkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgeworICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicHJlcGFyZUZvclJlYWRpbmciLCByZXQsIHJldHZhbCk7CisgICAgfQorICAgIGlmICghdGVtcENvbW1hbmRNUSB8fCAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpIHx8CisgICAgICAgICAgICAhdGVtcERhdGFNUSB8fCAhdGVtcERhdGFNUS0+aXNWYWxpZCgpIHx8CisgICAgICAgICAgICAhdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fAorICAgICAgICAgICAgIW1FZkdyb3VwKSB7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wQ29tbWFuZE1RLCAiRmFpbGVkIHRvIG9idGFpbiBjb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKKyAgICAgICAgQUxPR0VfSUYodGVtcENvbW1hbmRNUSAmJiAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpLAorICAgICAgICAgICAgICAgICJDb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOworICAgICAgICBBTE9HRV9JRighdGVtcERhdGFNUSwgIkZhaWxlZCB0byBvYnRhaW4gZGF0YSBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBEYXRhTVEgJiYgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSwgIkRhdGEgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCisgICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3IgcmVhZGluZyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZCk7CisKKyAgICBtQ29tbWFuZE1RID0gc3RkOjptb3ZlKHRlbXBDb21tYW5kTVEpOworICAgIG1EYXRhTVEgPSBzdGQ6Om1vdmUodGVtcERhdGFNUSk7CisgICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7CisgICAgbVJlYWRlckNsaWVudCA9IGdldHRpZCgpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0SW5wdXRGcmFtZXNMb3N0IiwgbVN0cmVhbS0+Z2V0SW5wdXRGcmFtZXNMb3N0KCksIGZyYW1lc0xvc3QpOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBpZiAobVJlYWRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7CisgICAgICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKKyAgICAgICAgcGFyYW1zLmNvbW1hbmQgPSBSZWFkQ29tbWFuZDo6R0VUX0NBUFRVUkVfUE9TSVRJT047CisgICAgICAgIHJldHVybiBjYWxsUmVhZGVyVGhyZWFkKHBhcmFtcywgImdldENhcHR1cmVQb3NpdGlvbiIsCisgICAgICAgICAgICAgICAgWyZdKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IHJlYWRTdGF0dXMucmVwbHkuY2FwdHVyZVBvc2l0aW9uLmZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSByZWFkU3RhdHVzLnJlcGx5LmNhcHR1cmVQb3NpdGlvbi50aW1lOworICAgICAgICAgICAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICAgIFJlc3VsdCByZXR2YWw7CisgICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRDYXB0dXJlUG9zaXRpb24oCisgICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBoaWRsRnJhbWVzLCB1aW50NjRfdCBoaWRsVGltZSkgeworICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSBoaWRsRnJhbWVzOworICAgICAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSBoaWRsVGltZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Q2FwdHVyZVBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOworICAgIH0KK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMgX191bnVzZWQpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6dXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgLyogc2lua01ldGFkYXRhICovKSB7CisgICAgLy8gQXVkaW8gSEFMIFYyLjAgZG9lcyBub3Qgc3VwcG9ydCBwcm9wYWdhdGluZyBzaW5rIG1ldGFkYXRhCisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmFkOGFlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbEhpZGwuaApAQCAtMCwwICsxLDI0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSElETF9ICisKKyNpbmNsdWRlIDxhdG9taWM+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JU3RyZWFtLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVN0cmVhbUluLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVN0cmVhbU91dC5oPgorI2luY2x1ZGUgPGZtcS9FdmVudEZsYWcuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorI2luY2x1ZGUgIlN0cmVhbVBvd2VyTG9nLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1JbjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtT3V0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6RXZlbnRGbGFnOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgUmVhZFBhcmFtZXRlcnMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbUluOjpSZWFkUGFyYW1ldGVyczsKK3VzaW5nIFJlYWRTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbUluOjpSZWFkU3RhdHVzOwordXNpbmcgV3JpdGVDb21tYW5kID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1PdXQ6OldyaXRlQ29tbWFuZDsKK3VzaW5nIFdyaXRlU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1PdXQ6OldyaXRlU3RhdHVzOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIERldmljZUhhbEhpZGw7CisKK2NsYXNzIFN0cmVhbUhhbEhpZGwgOiBwdWJsaWMgdmlydHVhbCBTdHJlYW1IYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAoreworICBwdWJsaWM6CisgICAgLy8gUmV0dXJuIHRoZSBzYW1wbGluZyByYXRlIGluIEh6IC0gZWcuIDQ0MTAwLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSk7CisKKyAgICAvLyBSZXR1cm4gc2l6ZSBvZiBpbnB1dC9vdXRwdXQgYnVmZmVyIGluIGJ5dGVzIGZvciB0aGlzIHN0cmVhbSAtIGVnLiA0ODAwLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgLy8gUmV0dXJuIHRoZSBjaGFubmVsIG1hc2suCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzayk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGZvcm1hdCAtIGUuZy4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7CisKKyAgICAvLyBDb252ZW5pZW5jZSBtZXRob2QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1Byb3BlcnRpZXMoCisgICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOworCisgICAgLy8gU2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKKworICAgIC8vIEdldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKKworICAgIC8vIEFkZCBvciByZW1vdmUgdGhlIGVmZmVjdCBvbiB0aGUgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7CisKKyAgICAvLyBQdXQgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0L291dHB1dCBpbnRvIHN0YW5kYnkgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YW5kYnkoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworCisgICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CisKKyAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisKKyAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKKworICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKKworICAgIC8vIFNldCB0aGUgcHJpb3JpdHkgb2YgdGhlIHRocmVhZCB0aGF0IGludGVyYWN0cyB3aXRoIHRoZSBIQUwKKyAgICAvLyAobXVzdCBtYXRjaCB0aGUgcHJpb3JpdHkgb2YgdGhlIGF1ZGlvZmxpbmdlcidzIHRocmVhZCB0aGF0IGNhbGxzICdyZWFkJyAvICd3cml0ZScpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQgcHJpb3JpdHkpOworCisgIHByb3RlY3RlZDoKKyAgICAvLyBTdWJjbGFzc2VzIGNhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBleHBsaWNpdCBTdHJlYW1IYWxIaWRsKElTdHJlYW0gKnN0cmVhbSk7CisKKyAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgc3RyZWFtLgorICAgIHZpcnR1YWwgflN0cmVhbUhhbEhpZGwoKTsKKworICAgIHN0YXR1c190IGdldENhY2hlZEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIGJvb2wgcmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KHBpZF90IHRocmVhZFBpZCwgcGlkX3QgdGhyZWFkSWQpOworCisgICAgLy8gbVN0cmVhbVBvd2VyTG9nIGlzIHVzZWQgZm9yIGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgorICAgIFN0cmVhbVBvd2VyTG9nIG1TdHJlYW1Qb3dlckxvZzsKKworICBwcml2YXRlOgorICAgIGNvbnN0IGludCBIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQgPSAtMTsKKyAgICBJU3RyZWFtICptU3RyZWFtOworICAgIGludCBtSGFsVGhyZWFkUHJpb3JpdHk7CisgICAgc2l6ZV90IG1DYWNoZWRCdWZmZXJTaXplOworfTsKKworY2xhc3MgU3RyZWFtT3V0SGFsSGlkbCA6IHB1YmxpYyBTdHJlYW1PdXRIYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxIaWRsIHsKKyAgcHVibGljOgorICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGhhcmR3YXJlIGRyaXZlciBlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KTsKKworICAgIC8vIFVzZSB0aGlzIG1ldGhvZCBpbiBzaXR1YXRpb25zIHdoZXJlIGF1ZGlvIG1peGluZyBpcyBkb25lIGluIHRoZSBoYXJkd2FyZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7CisKKyAgICAvLyBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbik7CisKKyAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgd3JpdHRlbiBieSB0aGUgYXVkaW8gZHNwIHRvIERBQyBzaW5jZQorICAgIC8vIHRoZSBvdXRwdXQgaGFzIGV4aXRlZCBzdGFuZGJ5LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcyk7CisKKyAgICAvLyBHZXQgdGhlIGxvY2FsIHRpbWUgYXQgd2hpY2ggdGhlIG5leHQgd3JpdGUgdG8gdGhlIGF1ZGlvIGRyaXZlciB3aWxsIGJlIHByZXNlbnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApOworCisgICAgLy8gU2V0IHRoZSBjYWxsYmFjayBmb3Igbm90aWZ5aW5nIGNvbXBsZXRpb24gb2Ygbm9uLWJsb2NraW5nIHdyaXRlIGFuZCBkcmFpbi4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgcGF1c2UgYW5kIHJlc3VtZSBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKTsKKworICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKworICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdW1lKCk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgZHJhaW4gb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbik7CisKKyAgICAvLyBSZXF1ZXN0cyBub3RpZmljYXRpb24gd2hlbiBkYXRhIGJ1ZmZlcmVkIGJ5IHRoZSBkcml2ZXIvaGFyZHdhcmUgaGFzIGJlZW4gcGxheWVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJhaW4oYm9vbCBlYXJseU5vdGlmeSk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIGZsdXNoIHRoZSBxdWV1ZWQgZGF0YS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7CisKKyAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcHJlc2VudGVkIHRvIGFuIGV4dGVybmFsIG9ic2VydmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApOworCisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZC4KKyAgICBzdGF0dXNfdCB1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIG92ZXJyaWRlOworCisgICAgLy8gTWV0aG9kcyB1c2VkIGJ5IFN0cmVhbU91dENhbGxiYWNrIChISURMKS4KKyAgICB2b2lkIG9uV3JpdGVSZWFkeSgpOworICAgIHZvaWQgb25EcmFpblJlYWR5KCk7CisgICAgdm9pZCBvbkVycm9yKCk7CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsSGlkbDsKKyAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxXcml0ZUNvbW1hbmQsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBDb21tYW5kTVE7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IERhdGFNUTsKKyAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxXcml0ZVN0YXR1cywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROworCisgICAgd3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IG1DYWxsYmFjazsKKyAgICBzcDxJU3RyZWFtT3V0PiBtU3RyZWFtOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IG1Db21tYW5kTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gbURhdGFNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKKyAgICBzdGQ6OmF0b21pYzxwaWRfdD4gbVdyaXRlckNsaWVudDsKKyAgICBFdmVudEZsYWcqIG1FZkdyb3VwOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIFN0cmVhbU91dEhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbU91dD4mIHN0cmVhbSk7CisKKyAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxIaWRsKCk7CisKKyAgICB1c2luZyBXcml0ZXJDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpPjsKKyAgICBzdGF0dXNfdCBjYWxsV3JpdGVyVGhyZWFkKAorICAgICAgICAgICAgV3JpdGVDb21tYW5kIGNtZCwgY29uc3QgY2hhciogY21kTmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhU2l6ZSwgV3JpdGVyQ2FsbGJhY2sgY2FsbGJhY2spOworICAgIHN0YXR1c190IHByZXBhcmVGb3JXcml0aW5nKHNpemVfdCBidWZmZXJTaXplKTsKK307CisKK2NsYXNzIFN0cmVhbUluSGFsSGlkbCA6IHB1YmxpYyBTdHJlYW1JbkhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbEhpZGwgeworICBwdWJsaWM6CisgICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIC8vIFNldCB0aGUgaW5wdXQgZ2FpbiBmb3IgdGhlIGF1ZGlvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEdhaW4oZmxvYXQgZ2Fpbik7CisKKyAgICAvLyBSZWFkIGF1ZGlvIGJ1ZmZlciBpbiBmcm9tIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGFtb3VudCBvZiBpbnB1dCBmcmFtZXMgbG9zdCBpbiB0aGUgYXVkaW8gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KTsKKworICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyByZWNlaXZlZCBhbmQKKyAgICAvLyB0aGUgY2xvY2sgdGltZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBmcmFtZSBjb3VudC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpOworCisgICAgLy8gR2V0IGFjdGl2ZSBtaWNyb3Bob25lcworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOworCisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzaW5rIGhhcyBiZWVuIGNoYW5nZWQuCisgICAgc3RhdHVzX3QgdXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSBvdmVycmlkZTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxIaWRsOworICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFJlYWRQYXJhbWV0ZXJzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gQ29tbWFuZE1ROworICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBEYXRhTVE7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8UmVhZFN0YXR1cywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROworCisgICAgc3A8SVN0cmVhbUluPiBtU3RyZWFtOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IG1Db21tYW5kTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gbURhdGFNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKKyAgICBzdGQ6OmF0b21pYzxwaWRfdD4gbVJlYWRlckNsaWVudDsKKyAgICBFdmVudEZsYWcqIG1FZkdyb3VwOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIFN0cmVhbUluSGFsSGlkbChjb25zdCBzcDxJU3RyZWFtSW4+JiBzdHJlYW0pOworCisgICAgdmlydHVhbCB+U3RyZWFtSW5IYWxIaWRsKCk7CisKKyAgICB1c2luZyBSZWFkZXJDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSZWFkU3RhdHVzJiByZWFkU3RhdHVzKT47CisgICAgc3RhdHVzX3QgY2FsbFJlYWRlclRocmVhZCgKKyAgICAgICAgICAgIGNvbnN0IFJlYWRQYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IGNoYXIqIGNtZE5hbWUsIFJlYWRlckNhbGxiYWNrIGNhbGxiYWNrKTsKKyAgICBzdGF0dXNfdCBwcmVwYXJlRm9yUmVhZGluZyhzaXplX3QgYnVmZmVyU2l6ZSk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbExvY2FsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODEwN2U1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbExvY2FsLmNwcApAQCAtMCwwICsxLDM0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiU3RyZWFtSGFsTG9jYWwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKKyNpbmNsdWRlICJTdHJlYW1IYWxMb2NhbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1N0cmVhbUhhbExvY2FsOjpTdHJlYW1IYWxMb2NhbChhdWRpb19zdHJlYW1fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQorICAgICAgICA6IG1EZXZpY2UoZGV2aWNlKSwKKyAgICAgICAgICBtU3RyZWFtKHN0cmVhbSkgeworICAgIC8vIEluc3RydW1lbnQgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCisgICAgLy8gTm90ZTogVGhpcyBhc3N1bWVzIGNoYW5uZWwgbWFzaywgZm9ybWF0LCBhbmQgc2FtcGxlIHJhdGUgZG8gbm90IGNoYW5nZSBhZnRlciBjcmVhdGlvbi4KKyAgICBpZiAobVN0cmVhbSAhPSBudWxscHRyICYmIG1TdHJlYW1Qb3dlckxvZy5pc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSkgeworICAgICAgICBtU3RyZWFtUG93ZXJMb2cuaW5pdChtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSksCisgICAgICAgICAgICAgICAgbVN0cmVhbS0+Z2V0X2NoYW5uZWxzKG1TdHJlYW0pLAorICAgICAgICAgICAgICAgIG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSkpOworICAgIH0KK30KKworU3RyZWFtSGFsTG9jYWw6On5TdHJlYW1IYWxMb2NhbCgpIHsKKyAgICBtU3RyZWFtID0gMDsKKyAgICBtRGV2aWNlLmNsZWFyKCk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKSB7CisgICAgKnJhdGUgPSBtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICAqc2l6ZSA9IG1TdHJlYW0tPmdldF9idWZmZXJfc2l6ZShtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaykgeworICAgICptYXNrID0gbVN0cmVhbS0+Z2V0X2NoYW5uZWxzKG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7CisgICAgKmZvcm1hdCA9IG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKAorICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKKyAgICAqc2FtcGxlUmF0ZSA9IG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKTsKKyAgICAqbWFzayA9IG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKTsKKyAgICAqZm9ybWF0ID0gbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKKyAgICByZXR1cm4gbVN0cmVhbS0+c2V0X3BhcmFtZXRlcnMobVN0cmVhbSwga3ZQYWlycy5zdHJpbmcoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgeworICAgIGNoYXIgKmhhbFZhbHVlcyA9IG1TdHJlYW0tPmdldF9wYXJhbWV0ZXJzKG1TdHJlYW0sIGtleXMuc3RyaW5nKCkpOworICAgIGlmIChoYWxWYWx1ZXMgIT0gTlVMTCkgeworICAgICAgICB2YWx1ZXMtPnNldFRvKGhhbFZhbHVlcyk7CisgICAgICAgIGZyZWUoaGFsVmFsdWVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICB2YWx1ZXMtPmNsZWFyKCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+KSB7CisgICAgTE9HX0FMV0FZU19GQVRBTCgiTG9jYWwgc3RyZWFtcyBjYW4gbm90IGhhdmUgZWZmZWN0cyIpOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+KSB7CisgICAgTE9HX0FMV0FZU19GQVRBTCgiTG9jYWwgc3RyZWFtcyBjYW4gbm90IGhhdmUgZWZmZWN0cyIpOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnN0YW5kYnkoKSB7CisgICAgcmV0dXJuIG1TdHJlYW0tPnN0YW5kYnkobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpkdW1wKGludCBmZCkgeworICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdHJlYW0tPmR1bXAobVN0cmVhbSwgZmQpOworICAgIG1TdHJlYW1Qb3dlckxvZy5kdW1wKGZkKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50KSB7CisgICAgLy8gRG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBhcyBsb2NhbCBoYWwgaXMgZXhlY3V0ZWQgYnkgYXVkaW9mbGluZ2VyIGRpcmVjdGx5CisgICAgLy8gb24gdGhlIHNhbWUgdGhyZWFkLgorICAgIHJldHVybiBPSzsKK30KKworU3RyZWFtT3V0SGFsTG9jYWw6OlN0cmVhbU91dEhhbExvY2FsKGF1ZGlvX3N0cmVhbV9vdXRfdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQorICAgICAgICA6IFN0cmVhbUhhbExvY2FsKCZzdHJlYW0tPmNvbW1vbiwgZGV2aWNlKSwgbVN0cmVhbShzdHJlYW0pIHsKK30KKworU3RyZWFtT3V0SGFsTG9jYWw6On5TdHJlYW1PdXRIYWxMb2NhbCgpIHsKKyAgICBtQ2FsbGJhY2suY2xlYXIoKTsKKyAgICBtRGV2aWNlLT5jbG9zZU91dHB1dFN0cmVhbShtU3RyZWFtKTsKKyAgICBtU3RyZWFtID0gMDsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICAqc2l6ZSA9IGF1ZGlvX3N0cmVhbV9vdXRfZnJhbWVfc2l6ZShtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KSB7CisgICAgKmxhdGVuY3kgPSBtU3RyZWFtLT5nZXRfbGF0ZW5jeShtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKKyAgICBpZiAobVN0cmVhbS0+c2V0X3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnNldF92b2x1bWUobVN0cmVhbSwgbGVmdCwgcmlnaHQpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6d3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbikgeworICAgIHNzaXplX3Qgd3JpdGVSZXN1bHQgPSBtU3RyZWFtLT53cml0ZShtU3RyZWFtLCBidWZmZXIsIGJ5dGVzKTsKKyAgICBpZiAod3JpdGVSZXN1bHQgPiAwKSB7CisgICAgICAgICp3cml0dGVuID0gd3JpdGVSZXN1bHQ7CisgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqd3JpdHRlbik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgeworICAgICAgICAqd3JpdHRlbiA9IDA7CisgICAgICAgIHJldHVybiB3cml0ZVJlc3VsdDsKKyAgICB9Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKSB7CisgICAgcmV0dXJuIG1TdHJlYW0tPmdldF9yZW5kZXJfcG9zaXRpb24obVN0cmVhbSwgZHNwRnJhbWVzKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApIHsKKyAgICBpZiAobVN0cmVhbS0+Z2V0X25leHRfd3JpdGVfdGltZXN0YW1wID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X25leHRfd3JpdGVfdGltZXN0YW1wKG1TdHJlYW0sIHRpbWVzdGFtcCk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spIHsKKyAgICBpZiAobVN0cmVhbS0+c2V0X2NhbGxiYWNrID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBtU3RyZWFtLT5zZXRfY2FsbGJhY2sobVN0cmVhbSwgU3RyZWFtT3V0SGFsTG9jYWw6OmFzeW5jQ2FsbGJhY2ssIHRoaXMpOworICAgIGlmIChyZXN1bHQgPT0gT0spIHsKKyAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIHN0YXRpYworaW50IFN0cmVhbU91dEhhbExvY2FsOjphc3luY0NhbGxiYWNrKHN0cmVhbV9jYWxsYmFja19ldmVudF90IGV2ZW50LCB2b2lkKiwgdm9pZCAqY29va2llKSB7CisgICAgLy8gV2UgYWN0IGFzIGlmIHdlIGdhdmUgYSB3cDxTdHJlYW1PdXRIYWxMb2NhbD4gdG8gSEFMLiBUaGlzIHdheSB3ZSBzaG91bGQgaGFuZGxlCisgICAgLy8gY29ycmVjdGx5IHRoZSBjYXNlIHdoZW4gdGhlIGNhbGxiYWNrIGlzIGludm9rZWQgd2hpbGUgU3RyZWFtT3V0SGFsTG9jYWwncyBkZXN0cnVjdG9yIGlzCisgICAgLy8gYWxyZWFkeSBydW5uaW5nLCBiZWNhdXNlIHRoZSBkZXN0cnVjdG9yIGlzIGludm9rZWQgYWZ0ZXIgdGhlIHJlZmNvdW50IGhhcyBiZWVuIGF0b21pY2FsbHkKKyAgICAvLyBkZWNyZW1lbnRlZC4KKyAgICB3cDxTdHJlYW1PdXRIYWxMb2NhbD4gd2Vha1NlbGYoc3RhdGljX2Nhc3Q8U3RyZWFtT3V0SGFsTG9jYWwqPihjb29raWUpKTsKKyAgICBzcDxTdHJlYW1PdXRIYWxMb2NhbD4gc2VsZiA9IHdlYWtTZWxmLnByb21vdGUoKTsKKyAgICBpZiAoc2VsZiA9PSAwKSByZXR1cm4gMDsKKyAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBzZWxmLT5tQ2FsbGJhY2sucHJvbW90ZSgpOworICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm4gMDsKKyAgICBBTE9HVigiYXN5bmNDYWxsYmFjaygpIGV2ZW50ICVkIiwgZXZlbnQpOworICAgIHN3aXRjaCAoZXZlbnQpIHsKKyAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX1dSSVRFX1JFQURZOgorICAgICAgICAgICAgY2FsbGJhY2stPm9uV3JpdGVSZWFkeSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9EUkFJTl9SRUFEWToKKyAgICAgICAgICAgIGNhbGxiYWNrLT5vbkRyYWluUmVhZHkoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfRVJST1I6CisgICAgICAgICAgICBjYWxsYmFjay0+b25FcnJvcigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVygiYXN5bmNDYWxsYmFjaygpIHVua25vd24gZXZlbnQgJWQiLCBldmVudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKSB7CisgICAgKnN1cHBvcnRzUGF1c2UgPSBtU3RyZWFtLT5wYXVzZSAhPSBOVUxMOworICAgICpzdXBwb3J0c1Jlc3VtZSA9IG1TdHJlYW0tPnJlc3VtZSAhPSBOVUxMOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnBhdXNlKCkgeworICAgIGlmIChtU3RyZWFtLT5wYXVzZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnBhdXNlKG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6cmVzdW1lKCkgeworICAgIGlmIChtU3RyZWFtLT5yZXN1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5yZXN1bWUobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pIHsKKyAgICAqc3VwcG9ydHNEcmFpbiA9IG1TdHJlYW0tPmRyYWluICE9IE5VTEw7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6ZHJhaW4oYm9vbCBlYXJseU5vdGlmeSkgeworICAgIGlmIChtU3RyZWFtLT5kcmFpbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmRyYWluKG1TdHJlYW0sIGVhcmx5Tm90aWZ5ID8gQVVESU9fRFJBSU5fRUFSTFlfTk9USUZZIDogQVVESU9fRFJBSU5fQUxMKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmZsdXNoKCkgeworICAgIGlmIChtU3RyZWFtLT5mbHVzaCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmZsdXNoKG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApIHsKKyAgICBpZiAobVN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24obVN0cmVhbSwgZnJhbWVzLCB0aW1lc3RhbXApOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6dXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSB7CisgICAgaWYgKG1TdHJlYW0tPnVwZGF0ZV9zb3VyY2VfbWV0YWRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGNvbnN0IHNvdXJjZV9tZXRhZGF0YV90IG1ldGFkYXRhIHsKKyAgICAgICAgLnRyYWNrX2NvdW50ID0gc291cmNlTWV0YWRhdGEudHJhY2tzLnNpemUoKSwKKyAgICAgICAgLy8gY29uc3QgY2FzdCBpcyBmaW5lIGFzIGl0IGlzIGluIGEgY29uc3Qgc3RydWN0dXJlCisgICAgICAgIC50cmFja3MgPSBjb25zdF9jYXN0PHBsYXliYWNrX3RyYWNrX21ldGFkYXRhKj4oc291cmNlTWV0YWRhdGEudHJhY2tzLmRhdGEoKSksCisgICAgfTsKKyAgICBtU3RyZWFtLT51cGRhdGVfc291cmNlX21ldGFkYXRhKG1TdHJlYW0sICZtZXRhZGF0YSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3RhcnQoKSB7CisgICAgaWYgKG1TdHJlYW0tPnN0YXJ0ID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+c3RhcnQobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdG9wKCkgeworICAgIGlmIChtU3RyZWFtLT5zdG9wID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+c3RvcChtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7CisgICAgaWYgKG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlciA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlcihtU3RyZWFtLCBtaW5TaXplRnJhbWVzLCBpbmZvKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pIHsKKyAgICBpZiAobVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbihtU3RyZWFtLCBwb3NpdGlvbik7Cit9CisKK1N0cmVhbUluSGFsTG9jYWw6OlN0cmVhbUluSGFsTG9jYWwoYXVkaW9fc3RyZWFtX2luX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKKyAgICAgICAgOiBTdHJlYW1IYWxMb2NhbCgmc3RyZWFtLT5jb21tb24sIGRldmljZSksIG1TdHJlYW0oc3RyZWFtKSB7Cit9CisKK1N0cmVhbUluSGFsTG9jYWw6On5TdHJlYW1JbkhhbExvY2FsKCkgeworICAgIG1EZXZpY2UtPmNsb3NlSW5wdXRTdHJlYW0obVN0cmVhbSk7CisgICAgbVN0cmVhbSA9IDA7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICAqc2l6ZSA9IGF1ZGlvX3N0cmVhbV9pbl9mcmFtZV9zaXplKG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c2V0R2FpbihmbG9hdCBnYWluKSB7CisgICAgcmV0dXJuIG1TdHJlYW0tPnNldF9nYWluKG1TdHJlYW0sIGdhaW4pOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpyZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpIHsKKyAgICBzc2l6ZV90IHJlYWRSZXN1bHQgPSBtU3RyZWFtLT5yZWFkKG1TdHJlYW0sIGJ1ZmZlciwgYnl0ZXMpOworICAgIGlmIChyZWFkUmVzdWx0ID4gMCkgeworICAgICAgICAqcmVhZCA9IHJlYWRSZXN1bHQ7CisgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coIGJ1ZmZlciwgKnJlYWQpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnJlYWQgPSAwOworICAgICAgICByZXR1cm4gcmVhZFJlc3VsdDsKKyAgICB9Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCkgeworICAgICpmcmFtZXNMb3N0ID0gbVN0cmVhbS0+Z2V0X2lucHV0X2ZyYW1lc19sb3N0KG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSkgeworICAgIGlmIChtU3RyZWFtLT5nZXRfY2FwdHVyZV9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmdldF9jYXB0dXJlX3Bvc2l0aW9uKG1TdHJlYW0sIGZyYW1lcywgdGltZSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgeworICAgIGlmIChtU3RyZWFtLT51cGRhdGVfc2lua19tZXRhZGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgY29uc3Qgc2lua19tZXRhZGF0YV90IG1ldGFkYXRhIHsKKyAgICAgICAgLnRyYWNrX2NvdW50ID0gc2lua01ldGFkYXRhLnRyYWNrcy5zaXplKCksCisgICAgICAgIC8vIGNvbnN0IGNhc3QgaXMgZmluZSBhcyBpdCBpcyBpbiBhIGNvbnN0IHN0cnVjdHVyZQorICAgICAgICAudHJhY2tzID0gY29uc3RfY2FzdDxyZWNvcmRfdHJhY2tfbWV0YWRhdGEqPihzaW5rTWV0YWRhdGEudHJhY2tzLmRhdGEoKSksCisgICAgfTsKKyAgICBtU3RyZWFtLT51cGRhdGVfc2lua19tZXRhZGF0YShtU3RyZWFtLCAmbWV0YWRhdGEpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c3RhcnQoKSB7CisgICAgaWYgKG1TdHJlYW0tPnN0YXJ0ID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+c3RhcnQobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnN0b3AoKSB7CisgICAgaWYgKG1TdHJlYW0tPnN0b3AgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zdG9wKG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgeworICAgIGlmIChtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIobVN0cmVhbSwgbWluU2l6ZUZyYW1lcywgaW5mbyk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pIHsKKyAgICBpZiAobVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbihtU3RyZWFtLCBwb3NpdGlvbik7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyBfX3VudXNlZCkgeworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsTG9jYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGE4ZDBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbExvY2FsLmgKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICisKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlICJTdHJlYW1Qb3dlckxvZy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIERldmljZUhhbExvY2FsOworCitjbGFzcyBTdHJlYW1IYWxMb2NhbCA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZQoreworICBwdWJsaWM6CisgICAgLy8gUmV0dXJuIHRoZSBzYW1wbGluZyByYXRlIGluIEh6IC0gZWcuIDQ0MTAwLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSk7CisKKyAgICAvLyBSZXR1cm4gc2l6ZSBvZiBpbnB1dC9vdXRwdXQgYnVmZmVyIGluIGJ5dGVzIGZvciB0aGlzIHN0cmVhbSAtIGVnLiA0ODAwLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgLy8gUmV0dXJuIHRoZSBjaGFubmVsIG1hc2suCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzayk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGZvcm1hdCAtIGUuZy4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7CisKKyAgICAvLyBDb252ZW5pZW5jZSBtZXRob2QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1Byb3BlcnRpZXMoCisgICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOworCisgICAgLy8gU2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKKworICAgIC8vIEdldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKKworICAgIC8vIEFkZCBvciByZW1vdmUgdGhlIGVmZmVjdCBvbiB0aGUgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7CisKKyAgICAvLyBQdXQgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0L291dHB1dCBpbnRvIHN0YW5kYnkgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YW5kYnkoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworCisgICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOworCisgICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpID0gMDsKKworICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pID0gMDsKKworICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSA9IDA7CisKKyAgICAvLyBTZXQgdGhlIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUgSEFMCisgICAgLy8gKG11c3QgbWF0Y2ggdGhlIHByaW9yaXR5IG9mIHRoZSBhdWRpb2ZsaW5nZXIncyB0aHJlYWQgdGhhdCBjYWxscyAncmVhZCcgLyAnd3JpdGUnKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KTsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgU3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7CisKKyAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgc3RyZWFtLgorICAgIHZpcnR1YWwgflN0cmVhbUhhbExvY2FsKCk7CisKKyAgICBzcDxEZXZpY2VIYWxMb2NhbD4gbURldmljZTsKKworICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7CisKKyAgcHJpdmF0ZToKKyAgICBhdWRpb19zdHJlYW1fdCAqbVN0cmVhbTsKK307CisKK2NsYXNzIFN0cmVhbU91dEhhbExvY2FsIDogcHVibGljIFN0cmVhbU91dEhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbExvY2FsIHsKKyAgcHVibGljOgorICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGhhcmR3YXJlIGRyaXZlciBlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KTsKKworICAgIC8vIFVzZSB0aGlzIG1ldGhvZCBpbiBzaXR1YXRpb25zIHdoZXJlIGF1ZGlvIG1peGluZyBpcyBkb25lIGluIHRoZSBoYXJkd2FyZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7CisKKyAgICAvLyBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbik7CisKKyAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgd3JpdHRlbiBieSB0aGUgYXVkaW8gZHNwIHRvIERBQyBzaW5jZQorICAgIC8vIHRoZSBvdXRwdXQgaGFzIGV4aXRlZCBzdGFuZGJ5LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcyk7CisKKyAgICAvLyBHZXQgdGhlIGxvY2FsIHRpbWUgYXQgd2hpY2ggdGhlIG5leHQgd3JpdGUgdG8gdGhlIGF1ZGlvIGRyaXZlciB3aWxsIGJlIHByZXNlbnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApOworCisgICAgLy8gU2V0IHRoZSBjYWxsYmFjayBmb3Igbm90aWZ5aW5nIGNvbXBsZXRpb24gb2Ygbm9uLWJsb2NraW5nIHdyaXRlIGFuZCBkcmFpbi4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgcGF1c2UgYW5kIHJlc3VtZSBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKTsKKworICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKworICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdW1lKCk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgZHJhaW4gb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbik7CisKKyAgICAvLyBSZXF1ZXN0cyBub3RpZmljYXRpb24gd2hlbiBkYXRhIGJ1ZmZlcmVkIGJ5IHRoZSBkcml2ZXIvaGFyZHdhcmUgaGFzIGJlZW4gcGxheWVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJhaW4oYm9vbCBlYXJseU5vdGlmeSk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIGZsdXNoIHRoZSBxdWV1ZWQgZGF0YS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7CisKKyAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcHJlc2VudGVkIHRvIGFuIGV4dGVybmFsIG9ic2VydmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApOworCisgICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CisKKyAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisKKyAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKKworICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKKworICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc291cmNlIGhhcyBiZWVuIGNoYW5nZWQuCisgICAgc3RhdHVzX3QgdXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSBvdmVycmlkZTsKKworICBwcml2YXRlOgorICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCAqbVN0cmVhbTsKKyAgICB3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gbUNhbGxiYWNrOworCisgICAgZnJpZW5kIGNsYXNzIERldmljZUhhbExvY2FsOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIFN0cmVhbU91dEhhbExvY2FsKGF1ZGlvX3N0cmVhbV9vdXRfdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKKworICAgIHZpcnR1YWwgflN0cmVhbU91dEhhbExvY2FsKCk7CisKKyAgICBzdGF0aWMgaW50IGFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsIHZvaWQgKnBhcmFtLCB2b2lkICpjb29raWUpOworfTsKKworY2xhc3MgU3RyZWFtSW5IYWxMb2NhbCA6IHB1YmxpYyBTdHJlYW1JbkhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbExvY2FsIHsKKyAgcHVibGljOgorICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBTZXQgdGhlIGlucHV0IGdhaW4gZm9yIHRoZSBhdWRpbyBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRHYWluKGZsb2F0IGdhaW4pOworCisgICAgLy8gUmVhZCBhdWRpbyBidWZmZXIgaW4gZnJvbSBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpOworCisgICAgLy8gUmV0dXJuIHRoZSBhbW91bnQgb2YgaW5wdXQgZnJhbWVzIGxvc3QgaW4gdGhlIGF1ZGlvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCk7CisKKyAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcmVjZWl2ZWQgYW5kCisgICAgLy8gdGhlIGNsb2NrIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZnJhbWUgY291bnQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKTsKKworICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOworCisgICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworCisgICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7CisKKyAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7CisKKyAgICAvLyBHZXQgYWN0aXZlIG1pY3JvcGhvbmVzCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNpbmsgaGFzIGJlZW4gY2hhbmdlZC4KKyAgICBzdGF0dXNfdCB1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIG92ZXJyaWRlOworCisgIHByaXZhdGU6CisgICAgYXVkaW9fc3RyZWFtX2luX3QgKm1TdHJlYW07CisKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsTG9jYWw7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgU3RyZWFtSW5IYWxMb2NhbChhdWRpb19zdHJlYW1faW5fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKKworICAgIHZpcnR1YWwgflN0cmVhbUluSGFsTG9jYWwoKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1Qb3dlckxvZy5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbVBvd2VyTG9nLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbVBvd2VyTG9nLmgKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1Qb3dlckxvZy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzM2RlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvQW5kcm9pZC5icApAQCAtMCwwICsxLDU4IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmF1ZGlvaGFsQDQuMCIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJEZXZpY2VIYWxMb2NhbC5jcHAiLAorICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwIiwKKyAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwIiwKKyAgICAgICAgIlN0cmVhbUhhbExvY2FsLmNwcCIsCisKKyAgICAgICAgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmNwcCIsCisgICAgICAgICJEZXZpY2VIYWxIaWRsLmNwcCIsCisgICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwIiwKKyAgICAgICAgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwIiwKKyAgICAgICAgIkVmZmVjdEhhbEhpZGwuY3BwIiwKKyAgICAgICAgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAiLAorICAgICAgICAiU3RyZWFtSGFsSGlkbC5jcHAiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2hhbF9kZWF0aGhhbmRsZXIiLAorICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJoYXJkd2FyZSIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJsaWJod2JpbmRlciIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A0LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb24tdXRpbCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA0LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANC4wLXV0aWwiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RANC4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbi51dGlsQGFsbC12ZXJzaW9ucyIsCisgICAgICAgICJsaWJhdWRpb2hhbF9oZWFkZXJzIgorICAgIF0sCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJmbXEiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTI3NTA0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcApAQCAtMCwwICsxLDIzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBMT0dfVEFHICJIYWxIaWRsIgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6QXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6QXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6QXVkaW9NaWNyb3Bob25lTG9jYXRpb247Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6RGV2aWNlQWRkcmVzczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpNaWNyb3Bob25lSW5mbzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBWNF8wIHsKKworLy8gc3RhdGljCitzdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6a2V5c0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga2V5cywgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICpoaWRsS2V5cykgeworICAgIEF1ZGlvUGFyYW1ldGVyIGhhbEtleXMoa2V5cyk7CisgICAgaWYgKGhhbEtleXMuc2l6ZSgpID09IDApIHJldHVybiBCQURfVkFMVUU7CisgICAgaGlkbEtleXMtPnJlc2l6ZShoYWxLZXlzLnNpemUoKSk7CisgICAgLy9GSVhNRTogIGtleVN0cmVhbVN1cHBvcnRlZENoYW5uZWxzIGFuZCBrZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzIGNvbWUgd2l0aCBhCisgICAgLy8gImtleUZvcm1hdD08dmFsdWU+IiBwYWlyLiBXZSBuZWVkIHRvIHRyYW5zZm9ybSBpdCBpbnRvIGEgc2luZ2xlIGtleSBzdHJpbmcgc28gdGhhdCBpdCBpcworICAgIC8vIGNhcnJpZWQgb3ZlciB0byB0aGUgbGVnYWN5IEhBTCB2aWEgSElETC4KKyAgICBTdHJpbmc4IHZhbHVlOworICAgIGJvb2wga2VlcEZvcm1hdFZhbHVlID0gaGFsS2V5cy5zaXplKCkgPT0gMiAmJgorICAgICAgICAgKGhhbEtleXMuZ2V0KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZENoYW5uZWxzKSwgdmFsdWUpID09IE5PX0VSUk9SIHx8CisgICAgICAgICBoYWxLZXlzLmdldChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzKSwgdmFsdWUpID09IE5PX0VSUk9SKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGFsS2V5cy5zaXplKCk7ICsraSkgeworICAgICAgICBTdHJpbmc4IGtleTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaGFsS2V5cy5nZXRBdChpLCBrZXkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgICAgICBpZiAoa2VlcEZvcm1hdFZhbHVlICYmIGtleSA9PSBBdWRpb1BhcmFtZXRlcjo6a2V5Rm9ybWF0KSB7CisgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBmb3JtYXRQYXJhbTsKKyAgICAgICAgICAgIGhhbEtleXMuZ2V0QXQoaSwga2V5LCB2YWx1ZSk7CisgICAgICAgICAgICBmb3JtYXRQYXJhbS5hZGQoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICBrZXkgPSBmb3JtYXRQYXJhbS50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgICgqaGlkbEtleXMpW2ldID0ga2V5LnN0cmluZygpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIHN0YXRpYworc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OnBhcmFtZXRlcnNGcm9tSGFsKAorICAgICAgICBjb25zdCBTdHJpbmc4JiBrdlBhaXJzLCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gKmhpZGxQYXJhbXMpIHsKKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbXMoa3ZQYWlycyk7CisgICAgaWYgKHBhcmFtcy5zaXplKCkgPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBoaWRsUGFyYW1zLT5yZXNpemUocGFyYW1zLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJhbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgU3RyaW5nOCBrZXksIHZhbHVlOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbXMuZ2V0QXQoaSwga2V5LCB2YWx1ZSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgICAgICgqaGlkbFBhcmFtcylbaV0ua2V5ID0ga2V5LnN0cmluZygpOworICAgICAgICAoKmhpZGxQYXJhbXMpW2ldLnZhbHVlID0gdmFsdWUuc3RyaW5nKCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworLy8gc3RhdGljCit2b2lkIENvbnZlcnNpb25IZWxwZXJIaWRsOjpwYXJhbWV0ZXJzVG9IYWwoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycywgU3RyaW5nOCAqdmFsdWVzKSB7CisgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW1zOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5zaXplKCk7ICsraSkgeworICAgICAgICBwYXJhbXMuYWRkKFN0cmluZzgocGFyYW1ldGVyc1tpXS5rZXkuY19zdHIoKSksIFN0cmluZzgocGFyYW1ldGVyc1tpXS52YWx1ZS5jX3N0cigpKSk7CisgICAgfQorICAgIHZhbHVlcy0+c2V0VG8ocGFyYW1zLnRvU3RyaW5nKCkpOworfQorCitDb252ZXJzaW9uSGVscGVySGlkbDo6Q29udmVyc2lvbkhlbHBlckhpZGwoY29uc3QgY2hhciogY2xhc3NOYW1lKQorICAgICAgICA6IG1DbGFzc05hbWUoY2xhc3NOYW1lKSB7Cit9CisKKy8vIHN0YXRpYworc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpIHsKKyAgICBzd2l0Y2ggKHJlc3VsdCkgeworICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKKyAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOiByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9TVEFURTogcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfU1VQUE9SVEVEOiByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiBOT19JTklUOworICAgIH0KK30KKwordm9pZCBDb252ZXJzaW9uSGVscGVySGlkbDo6ZW1pdEVycm9yKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbikgeworICAgIEFMT0dFKCIlcyAlcCAlczogJXMgKGZyb20gcnBjKSIsIG1DbGFzc05hbWUsIHRoaXMsIGZ1bmNOYW1lLCBkZXNjcmlwdGlvbik7Cit9CisKKy8vIFRPRE86IFVzZSB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgaGFsIHdoZW4gaXQgbW92ZXMgdG8gYSB1dGlsIGxpYnJhcnkuCitzdGQ6OnN0cmluZyBkZXZpY2VBZGRyZXNzVG9IYWwoY29uc3QgRGV2aWNlQWRkcmVzcyYgYWRkcmVzcykgeworICAgIC8vIEhBTCBhc3N1bWVzIHRoYXQgdGhlIGFkZHJlc3MgaXMgTlVMLXRlcm1pbmF0ZWQuCisgICAgY2hhciBoYWxBZGRyZXNzW0FVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU5dOworICAgIG1lbXNldChoYWxBZGRyZXNzLCAwLCBzaXplb2YoaGFsQWRkcmVzcykpOworICAgIGF1ZGlvX2RldmljZXNfdCBoYWxEZXZpY2UgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KGFkZHJlc3MuZGV2aWNlKTsKKyAgICBjb25zdCBib29sIGlzSW5wdXQgPSAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0JJVF9JTikgIT0gMDsKKyAgICBpZiAoaXNJbnB1dCkgaGFsRGV2aWNlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOworICAgIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApICE9IDApIHx8CisgICAgICAgIChpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFApICE9IDApKSB7CisgICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIiwKKyAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLm1hY1swXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1sxXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1syXSwKKyAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLm1hY1szXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1s0XSwgYWRkcmVzcy5hZGRyZXNzLm1hY1s1XSk7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfSVApICE9IDApIHx8CisgICAgICAgICAgICAgICAoaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0lQKSAhPSAwKSkgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlZC4lZC4lZC4lZCIsIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzBdLAorICAgICAgICAgICAgICAgICBhZGRyZXNzLmFkZHJlc3MuaXB2NFsxXSwgYWRkcmVzcy5hZGRyZXNzLmlwdjRbMl0sIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzNdKTsKKyAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfVVNCKSAhPSAwKSB8fAorICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9BTExfVVNCKSAhPSAwKSkgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICJjYXJkPSVkO2RldmljZT0lZCIsIGFkZHJlc3MuYWRkcmVzcy5hbHNhLmNhcmQsCisgICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5hbHNhLmRldmljZSk7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQlVTKSAhPSAwKSB8fAorICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9CVVMpICE9IDApKSB7CisgICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiVzIiwgYWRkcmVzcy5idXNBZGRyZXNzLmNfc3RyKCkpOworICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgpKSAhPSAwIHx8CisgICAgICAgICAgICAgICAoaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpICE9IDApKSB7CisgICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiVzIiwgYWRkcmVzcy5yU3VibWl4QWRkcmVzcy5jX3N0cigpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlcyIsIGFkZHJlc3MuYnVzQWRkcmVzcy5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIGhhbEFkZHJlc3M7Cit9CisKKy8vbG9jYWwgY29udmVyc2lvbiBoZWxwZXJzCisKK2F1ZGlvX21pY3JvcGhvbmVfY2hhbm5lbF9tYXBwaW5nX3QgIGNoYW5uZWxNYXBwaW5nVG9IYWwoQXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmcgbWFwcGluZykgeworICAgIHN3aXRjaCAobWFwcGluZykgeworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUNoYW5uZWxNYXBwaW5nOjpVTlVTRUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9DSEFOTkVMX01BUFBJTkdfVU5VU0VEOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUNoYW5uZWxNYXBwaW5nOjpESVJFQ1Q6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9DSEFOTkVMX01BUFBJTkdfRElSRUNUOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUNoYW5uZWxNYXBwaW5nOjpQUk9DRVNTRUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9DSEFOTkVMX01BUFBJTkdfUFJPQ0VTU0VEOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBjaGFubmVsTWFwcGluZ1RvSGFsIGNvbnZlcnNpb24gJWQiLCBtYXBwaW5nKTsKKyAgICB9Cit9CisKK2F1ZGlvX21pY3JvcGhvbmVfbG9jYXRpb25fdCBsb2NhdGlvblRvSGFsKEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uIGxvY2F0aW9uKSB7CisgICAgc3dpdGNoIChsb2NhdGlvbikgeworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uOjpVTktOT1dOOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfTE9DQVRJT05fVU5LTk9XTjsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6TUFJTkJPRFk6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9NQUlOQk9EWTsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6TUFJTkJPRFlfTU9WQUJMRToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0xPQ0FUSU9OX01BSU5CT0RZX01PVkFCTEU7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lTG9jYXRpb246OlBFUklQSEVSQUw6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9QRVJJUEhFUkFMOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBsb2NhdGlvblRvSGFsIGNvbnZlcnNpb24gJWQiLCBsb2NhdGlvbik7CisgICAgfQorfQorYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25hbGl0eV90IGRpcmVjdGlvbmFsaXR5VG9IYWwoQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHkgZGlyKSB7CisgICAgc3dpdGNoIChkaXIpIHsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6VU5LTk9XTjoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX1VOS05PV047CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk6Ok9NTkk6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9PTU5JOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpCSV9ESVJFQ1RJT05BTDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX0JJX0RJUkVDVElPTkFMOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpDQVJESU9JRDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX0NBUkRJT0lEOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpIWVBFUl9DQVJESU9JRDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX0hZUEVSX0NBUkRJT0lEOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpTVVBFUl9DQVJESU9JRDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX1NVUEVSX0NBUkRJT0lEOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBkaXJlY3Rpb25hbGl0eVRvSGFsIGNvbnZlcnNpb24gJWQiLCBkaXIpOworICAgIH0KK30KKworLy8gc3RhdGljCit2b2lkIENvbnZlcnNpb25IZWxwZXJIaWRsOjptaWNyb3Bob25lSW5mb1RvSGFsKGNvbnN0IE1pY3JvcGhvbmVJbmZvJiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCAqcERzdCkgeworICAgIGlmIChwRHN0ICE9IE5VTEwpIHsKKyAgICAgICAgc25wcmludGYocERzdC0+ZGV2aWNlX2lkLCBzaXplb2YocERzdC0+ZGV2aWNlX2lkKSwKKyAgICAgICAgICAgICAgICAgIiVzIiwgc3JjLmRldmljZUlkLmNfc3RyKCkpOworICAgICAgICBwRHN0LT5kZXZpY2UgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KHNyYy5kZXZpY2VBZGRyZXNzLmRldmljZSk7CisgICAgICAgIHNucHJpbnRmKHBEc3QtPmFkZHJlc3MsIHNpemVvZihwRHN0LT5hZGRyZXNzKSwKKyAgICAgICAgICAgICAgICAgIiVzIiwgZGV2aWNlQWRkcmVzc1RvSGFsKHNyYy5kZXZpY2VBZGRyZXNzKS5jX3N0cigpKTsKKyAgICAgICAgaWYgKHNyYy5jaGFubmVsTWFwcGluZy5zaXplKCkgPiBBVURJT19DSEFOTkVMX0NPVU5UX01BWCkgeworICAgICAgICAgICAgQUxPR1coIm1pY3JvcGhvbmVJbmZvVG9TdHJ1Y3QgZm91bmQgJXp1IGNoYW5uZWxNYXBwaW5nIGVsZW1lbnRzLiBNYXggZXhwZWN0ZWQgaXMgJWQiLAorICAgICAgICAgICAgICAgICAgc3JjLmNoYW5uZWxNYXBwaW5nLnNpemUoKSwgQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVgpOworICAgICAgICB9CisgICAgICAgIHNpemVfdCBjaDsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgc3JjLmNoYW5uZWxNYXBwaW5nLnNpemUoKSAmJiBjaCA8IEFVRElPX0NIQU5ORUxfQ09VTlRfTUFYOyBjaCsrKSB7CisgICAgICAgICAgICBwRHN0LT5jaGFubmVsX21hcHBpbmdbY2hdID0gY2hhbm5lbE1hcHBpbmdUb0hhbChzcmMuY2hhbm5lbE1hcHBpbmdbY2hdKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKDsgY2ggPCBBVURJT19DSEFOTkVMX0NPVU5UX01BWDsgY2grKykgeworICAgICAgICAgICAgcERzdC0+Y2hhbm5lbF9tYXBwaW5nW2NoXSA9IEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX1VOVVNFRDsKKyAgICAgICAgfQorICAgICAgICBwRHN0LT5sb2NhdGlvbiA9IGxvY2F0aW9uVG9IYWwoc3JjLmxvY2F0aW9uKTsKKyAgICAgICAgcERzdC0+Z3JvdXAgPSAoYXVkaW9fbWljcm9waG9uZV9ncm91cF90KXNyYy5ncm91cDsKKyAgICAgICAgcERzdC0+aW5kZXhfaW5fdGhlX2dyb3VwID0gKHVuc2lnbmVkIGludClzcmMuaW5kZXhJblRoZUdyb3VwOworICAgICAgICBwRHN0LT5zZW5zaXRpdml0eSA9IHNyYy5zZW5zaXRpdml0eTsKKyAgICAgICAgcERzdC0+bWF4X3NwbCA9IHNyYy5tYXhTcGw7CisgICAgICAgIHBEc3QtPm1pbl9zcGwgPSBzcmMubWluU3BsOworICAgICAgICBwRHN0LT5kaXJlY3Rpb25hbGl0eSA9IGRpcmVjdGlvbmFsaXR5VG9IYWwoc3JjLmRpcmVjdGlvbmFsaXR5KTsKKyAgICAgICAgcERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXMgPSAodW5zaWduZWQgaW50KXNyYy5mcmVxdWVuY3lSZXNwb25zZS5zaXplKCk7CisgICAgICAgIGlmIChwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcyA+IEFVRElPX01JQ1JPUEhPTkVfTUFYX0ZSRVFVRU5DWV9SRVNQT05TRVMpIHsKKyAgICAgICAgICAgIEFMT0dXKCJtaWNyb3Bob25lSW5mb1RvU3RydWN0IGZvdW5kICVkIGZyZXF1ZW5jeSByZXNwb25zZXMuIE1heCBleHBlY3RlZCBpcyAlZCIsCisgICAgICAgICAgICAgICAgICBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcywgQVVESU9fTUlDUk9QSE9ORV9NQVhfRlJFUVVFTkNZX1JFU1BPTlNFUyk7CisgICAgICAgICAgICBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcyA9IEFVRElPX01JQ1JPUEhPTkVfTUFYX0ZSRVFVRU5DWV9SRVNQT05TRVM7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlczsgaysrKSB7CisgICAgICAgICAgICBwRHN0LT5mcmVxdWVuY3lfcmVzcG9uc2VzWzBdW2tdID0gc3JjLmZyZXF1ZW5jeVJlc3BvbnNlW2tdLmZyZXF1ZW5jeTsKKyAgICAgICAgICAgIHBEc3QtPmZyZXF1ZW5jeV9yZXNwb25zZXNbMV1ba10gPSBzcmMuZnJlcXVlbmN5UmVzcG9uc2Vba10ubGV2ZWw7CisgICAgICAgIH0KKyAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnggPSBzcmMucG9zaXRpb24ueDsKKyAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnkgPSBzcmMucG9zaXRpb24ueTsKKyAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnogPSBzcmMucG9zaXRpb24uejsKKyAgICAgICAgcERzdC0+b3JpZW50YXRpb24ueCA9IHNyYy5vcmllbnRhdGlvbi54OworICAgICAgICBwRHN0LT5vcmllbnRhdGlvbi55ID0gc3JjLm9yaWVudGF0aW9uLnk7CisgICAgICAgIHBEc3QtPm9yaWVudGF0aW9uLnogPSBzcmMub3JpZW50YXRpb24uejsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBWNF8wCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvQ29udmVyc2lvbkhlbHBlckhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODIzYThkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMXzRfMF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfQ09OVkVSU0lPTl9IRUxQRVJfSElETF80XzBfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UGFyYW1ldGVyVmFsdWU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6TWljcm9waG9uZUluZm87Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgVjRfMCB7CisKK2NsYXNzIENvbnZlcnNpb25IZWxwZXJIaWRsIHsKKyAgcHJvdGVjdGVkOgorICAgIHN0YXRpYyBzdGF0dXNfdCBrZXlzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrZXlzLCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gKmhpZGxLZXlzKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgcGFyYW1ldGVyc0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga3ZQYWlycywgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+ICpoaWRsUGFyYW1zKTsKKyAgICBzdGF0aWMgdm9pZCBwYXJhbWV0ZXJzVG9IYWwoY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzLCBTdHJpbmc4ICp2YWx1ZXMpOworICAgIHN0YXRpYyB2b2lkIG1pY3JvcGhvbmVJbmZvVG9IYWwoY29uc3QgTWljcm9waG9uZUluZm8mIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCAqcERzdCk7CisKKyAgICBDb252ZXJzaW9uSGVscGVySGlkbChjb25zdCBjaGFyKiBjbGFzc05hbWUpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVD4KKyAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48Uj4mIHJldCwgVCAqcmV0dmFsKSB7CisgICAgICAgIGlmIChyZXQuaXNPaygpKSB7CisgICAgICAgICAgICAvLyBUaGlzIHdheSBpdCBhbHNvIHdvcmtzIGZvciBlbnVtIGNsYXNzIHRvIHVuc2NvcGVkIGVudW0gY29udmVyc2lvbi4KKyAgICAgICAgICAgICpyZXR2YWwgPSBzdGF0aWNfY2FzdDxUPihzdGF0aWNfY2FzdDxSPihyZXQpKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybihmdW5jTmFtZSwgcmV0KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxUPiYgcmV0KSB7CisgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IE9LIDogRkFJTEVEX1RSQU5TQUNUSU9OOworICAgIH0KKworICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlJlc3VsdD4mIHJldCkgeworICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgIGVtaXRFcnJvcihmdW5jTmFtZSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldCkgOiBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKAorICAgICAgICAgICAgY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxUPiYgcmV0LCBoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlJlc3VsdCByZXR2YWwpIHsKKyAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgICBlbWl0RXJyb3IoZnVuY05hbWUsIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXR2YWwpIDogRkFJTEVEX1RSQU5TQUNUSU9OOworICAgIH0KKworICBwcml2YXRlOgorICAgIGNvbnN0IGNoYXIqIG1DbGFzc05hbWU7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgYW5hbHl6ZVJlc3VsdChjb25zdCBoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlJlc3VsdCYgcmVzdWx0KTsKKworICAgIHZvaWQgZW1pdEVycm9yKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgVjRfMAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfQ09OVkVSU0lPTl9IRUxQRVJfSElETF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbEhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYWNjYTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsSGlkbC5jcHAKQEAgLTAsMCArMSwzODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2RlZmluZSBMT0dfVEFHICJEZXZpY2VIYWxIaWRsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSVByaW1hcnlEZXZpY2UuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxjb21tb24vYWxsLXZlcnNpb25zL1ZlcnNpb25VdGlscy5oPgorCisjaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgorI2luY2x1ZGUgIkhpZGxVdGlscy5oIgorI2luY2x1ZGUgIlN0cmVhbUhhbEhpZGwuaCIKKyNpbmNsdWRlICJWZXJzaW9uVXRpbHMuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Db25maWc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb0RldmljZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvSW5wdXRGbGFnOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9PdXRwdXRGbGFnOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9QYXRjaEhhbmRsZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvUG9ydDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvUG9ydENvbmZpZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvTW9kZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvU291cmNlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6SGlkbFV0aWxzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6dXRpbHM6Om1rRW51bUNvbnZlcnRlcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpEZXZpY2VBZGRyZXNzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklQcmltYXJ5RGV2aWNlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlBhcmFtZXRlclZhbHVlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpTaW5rTWV0YWRhdGE7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgVjRfMCB7CisKK25hbWVzcGFjZSB7CisKK3N0YXR1c190IGRldmljZUFkZHJlc3NGcm9tSGFsKAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBjb25zdCBjaGFyKiBoYWxBZGRyZXNzLCBEZXZpY2VBZGRyZXNzKiBhZGRyZXNzKSB7CisgICAgYWRkcmVzcy0+ZGV2aWNlID0gQXVkaW9EZXZpY2UoZGV2aWNlKTsKKworICAgIGlmIChoYWxBZGRyZXNzID09IG51bGxwdHIgfHwgc3RybmxlbihoYWxBZGRyZXNzLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgY29uc3QgYm9vbCBpc0lucHV0ID0gKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDA7CisgICAgaWYgKGlzSW5wdXQpIGRldmljZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSAhPSAwKQorICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCkgIT0gMCkpIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAorICAgICAgICAgICAgICAgICIlaGhYOiVoaFg6JWhoWDolaGhYOiVoaFg6JWhoWCIsCisgICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzBdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMV0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1syXSwKKyAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbM10sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1s0XSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzVdKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSA2ID8gT0sgOiBCQURfVkFMVUU7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfSVApICE9IDApCisgICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0lQKSAhPSAwKSkgeworICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCisgICAgICAgICAgICAgICAgIiVoaHUuJWhodS4laGh1LiVoaHUiLAorICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMF0sICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMV0sCisgICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFsyXSwgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFszXSk7CisgICAgICAgIHJldHVybiBzdGF0dXMgPT0gNCA/IE9LIDogQkFEX1ZBTFVFOworICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9VU0IpKSAhPSAwCisgICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0FMTF9VU0IpKSAhPSAwKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKKyAgICAgICAgICAgICAgICAiY2FyZD0lZDtkZXZpY2U9JWQiLAorICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmFsc2EuY2FyZCwgJmFkZHJlc3MtPmFkZHJlc3MuYWxzYS5kZXZpY2UpOworICAgICAgICByZXR1cm4gc3RhdHVzID09IDIgPyBPSyA6IEJBRF9WQUxVRTsKKyAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9CVVMpICE9IDApCisgICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JVUykgIT0gMCkpIHsKKyAgICAgICAgaWYgKGhhbEFkZHJlc3MgIT0gTlVMTCkgeworICAgICAgICAgICAgYWRkcmVzcy0+YnVzQWRkcmVzcyA9IGhhbEFkZHJlc3M7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSkgIT0gMAorICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSAhPSAwKSkgeworICAgICAgICBpZiAoaGFsQWRkcmVzcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBhZGRyZXNzLT5yU3VibWl4QWRkcmVzcyA9IGhhbEFkZHJlc3M7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworRGV2aWNlSGFsSGlkbDo6RGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKQorICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJEZXZpY2UiKSwgbURldmljZShkZXZpY2UpLAorICAgICAgICAgIG1QcmltYXJ5RGV2aWNlKElQcmltYXJ5RGV2aWNlOjpjYXN0RnJvbShkZXZpY2UpKSB7Cit9CisKK0RldmljZUhhbEhpZGw6On5EZXZpY2VIYWxIaWRsKCkgeworICAgIGlmIChtRGV2aWNlICE9IDApIHsKKyAgICAgICAgbURldmljZS5jbGVhcigpOworICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworICAgIH0KK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCopIHsKKyAgICAvLyBPYnNvbGV0ZS4KKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmluaXRDaGVjaygpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiaW5pdENoZWNrIiwgbURldmljZS0+aW5pdENoZWNrKCkpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2ljZVZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1hc3RlclZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRNYXN0ZXJWb2x1bWUodm9sdW1lKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtUHJpbWFyeURldmljZS0+Z2V0TWFzdGVyVm9sdW1lKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBmbG9hdCB2KSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnZvbHVtZSA9IHY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3RlclZvbHVtZSIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1vZGUiLCBtUHJpbWFyeURldmljZS0+c2V0TW9kZShBdWRpb01vZGUobW9kZSkpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1pY011dGUiLCBtRGV2aWNlLT5zZXRNaWNNdXRlKHN0YXRlKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1pY011dGUoYm9vbCAqc3RhdGUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNaWNNdXRlKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBib29sIG11dGUpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqc3RhdGUgPSBtdXRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNaWNNdXRlIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyTXV0ZSIsIG1EZXZpY2UtPnNldE1hc3Rlck11dGUoc3RhdGUpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1hc3Rlck11dGUoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGJvb2wgbXV0ZSkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpzdGF0ZSA9IG11dGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3Rlck11dGUiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBoaWRsUGFyYW1zOworICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtZXRlcnNGcm9tSGFsKGt2UGFpcnMsICZoaWRsUGFyYW1zKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIC8vIFRPRE86IGNoYW5nZSB0aGUgQVBJIHNvIHRoYXQgY29udGV4dCBhbmQga3ZQYWlycyBhcmUgc2VwYXJhdGVkCisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFBhcmFtZXRlcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzOjpzZXRQYXJhbWV0ZXJzKG1EZXZpY2UsIHt9IC8qIGNvbnRleHQgKi8sIGhpZGxQYXJhbXMpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKKyAgICB2YWx1ZXMtPmNsZWFyKCk7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGhpZGxLZXlzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGtleXNGcm9tSGFsKGtleXMsICZoaWRsS2V5cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSB1dGlsczo6Z2V0UGFyYW1ldGVycyhtRGV2aWNlLAorICAgICAgICAgICAge30gLyogY29udGV4dCAqLywKKyAgICAgICAgICAgIGhpZGxLZXlzLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzVG9IYWwocGFyYW1ldGVycywgdmFsdWVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UGFyYW1ldGVycyIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7CisgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldElucHV0QnVmZmVyU2l6ZSgKKyAgICAgICAgICAgIGhpZGxDb25maWcsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldElucHV0QnVmZmVyU2l6ZSIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6b3Blbk91dHB1dFN0cmVhbSgKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOworICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZXMsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7CisgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3Blbk91dHB1dFN0cmVhbSgKKyAgICAgICAgICAgIGhhbmRsZSwKKyAgICAgICAgICAgIGhpZGxEZXZpY2UsCisgICAgICAgICAgICBoaWRsQ29uZmlnLAorICAgICAgICAgICAgbWtFbnVtQ29udmVydGVyPEF1ZGlvT3V0cHV0RmxhZz4oZmxhZ3MpLAorICAgICAgICAgICAge30gLyogbWV0YWRhdGEgKi8sCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElTdHJlYW1PdXQ+JiByZXN1bHQsIGNvbnN0IEF1ZGlvQ29uZmlnJiBzdWdnZXN0ZWRDb25maWcpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqb3V0U3RyZWFtID0gbmV3IFN0cmVhbU91dEhhbEhpZGwocmVzdWx0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ1RvSGFsKHN1Z2dlc3RlZENvbmZpZywgY29uZmlnKTsKKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJvcGVuT3V0cHV0U3RyZWFtIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpvcGVuSW5wdXRTdHJlYW0oCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOworICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZXMsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7CisgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICAvLyBUT0RPOiBjb3JyZWN0bHkgcHJvcGFnYXRlIHRoZSB0cmFja3Mgc291cmNlcyBhbmQgdm9sdW1lCisgICAgLy8gICAgICAgZm9yIG5vdywgb25seSBzZW5kIHRoZSBtYWluIHNvdXJjZSBhdCAxZGJmcworICAgIFNpbmtNZXRhZGF0YSBtZXRhZGF0YSA9IHt7e0F1ZGlvU291cmNlKHNvdXJjZSksIDF9fX07CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPm9wZW5JbnB1dFN0cmVhbSgKKyAgICAgICAgICAgIGhhbmRsZSwKKyAgICAgICAgICAgIGhpZGxEZXZpY2UsCisgICAgICAgICAgICBoaWRsQ29uZmlnLAorICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICBtZXRhZGF0YSwKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVN0cmVhbUluPiYgcmVzdWx0LCBjb25zdCBBdWRpb0NvbmZpZyYgc3VnZ2VzdGVkQ29uZmlnKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKmluU3RyZWFtID0gbmV3IFN0cmVhbUluSGFsSGlkbChyZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnVG9IYWwoc3VnZ2VzdGVkQ29uZmlnLCBjb25maWcpOworICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oIm9wZW5JbnB1dFN0cmVhbSIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzQXVkaW9QYXRjaGVzIiwgbURldmljZS0+c3VwcG9ydHNBdWRpb1BhdGNoZXMoKSwgc3VwcG9ydHNQYXRjaGVzKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Y3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCisgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGhpZGxfdmVjPEF1ZGlvUG9ydENvbmZpZz4gaGlkbFNvdXJjZXMsIGhpZGxTaW5rczsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ3NGcm9tSGFsKG51bV9zb3VyY2VzLCBzb3VyY2VzLCAmaGlkbFNvdXJjZXMpOworICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnc0Zyb21IYWwobnVtX3NpbmtzLCBzaW5rcywgJmhpZGxTaW5rcyk7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Y3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgICAgIGhpZGxTb3VyY2VzLCBoaWRsU2lua3MsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIEF1ZGlvUGF0Y2hIYW5kbGUgaGlkbFBhdGNoKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnBhdGNoID0gc3RhdGljX2Nhc3Q8YXVkaW9fcGF0Y2hfaGFuZGxlX3Q+KGhpZGxQYXRjaCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImNyZWF0ZUF1ZGlvUGF0Y2giLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInJlbGVhc2VBdWRpb1BhdGNoIiwgbURldmljZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2gpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgQXVkaW9Qb3J0IGhpZGxQb3J0OworICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0RnJvbUhhbCgqcG9ydCwgJmhpZGxQb3J0KTsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRBdWRpb1BvcnQoCisgICAgICAgICAgICBoaWRsUG9ydCwKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgQXVkaW9Qb3J0JiBwKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb1BvcnRUb0hhbChwLCBwb3J0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qb3J0IiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBBdWRpb1BvcnRDb25maWcgaGlkbENvbmZpZzsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRBdWRpb1BvcnRDb25maWciLCBtRGV2aWNlLT5zZXRBdWRpb1BvcnRDb25maWcoaGlkbENvbmZpZykpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lc0luZm8pIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNaWNyb3Bob25lcygKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgaGlkbF92ZWM8TWljcm9waG9uZUluZm8+IG1pY0FycmF5SGFsKSB7CisgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgbWljQXJyYXlIYWwuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBkc3Q7CisgICAgICAgICAgICAvL2NvbnZlcnQKKyAgICAgICAgICAgIG1pY3JvcGhvbmVJbmZvVG9IYWwobWljQXJyYXlIYWxba10sICZkc3QpOworICAgICAgICAgICAgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvIG1pY3JvcGhvbmUgPSBtZWRpYTo6TWljcm9waG9uZUluZm8oZHN0KTsKKyAgICAgICAgICAgIG1pY3JvcGhvbmVzSW5mby0+cHVzaF9iYWNrKG1pY3JvcGhvbmUpOworICAgICAgICB9CisgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1pY3JvcGhvbmVzIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpkdW1wKGludCBmZCkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOworICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+ZGVidWcoaGlkbEhhbmRsZSwge30gLyogb3B0aW9ucyAqLyk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImR1bXAiLCByZXQpOworfQorCit9IC8vIG5hbWVzcGFjZSBWNF8wCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmQyMTc1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbEhpZGwuaApAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfNF8wX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfNF8wX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lEZXZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JUHJpbWFyeURldmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklEZXZpY2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVByaW1hcnlEZXZpY2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBWNF8wIHsKKworY2xhc3MgRGV2aWNlSGFsSGlkbCA6IHB1YmxpYyBEZXZpY2VIYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAoreworICBwdWJsaWM6CisgICAgLy8gU2V0cyB0aGUgdmFsdWUgb2YgJ2RldmljZXMnIHRvIGEgYml0bWFzayBvZiAxIG9yIG1vcmUgdmFsdWVzIG9mIGF1ZGlvX2RldmljZXNfdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpOworCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKKworICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIG9mIGEgdm9pY2UgY2FsbC4gUmFuZ2UgaXMgYmV0d2VlbiAwLjAgYW5kIDEuMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSk7CisKKyAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBmb3IgYWxsIGF1ZGlvIGFjdGl2aXRpZXMgb3RoZXIgdGhhbiB2b2ljZSBjYWxsLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSk7CisKKyAgICAvLyBHZXQgdGhlIGN1cnJlbnQgbWFzdGVyIHZvbHVtZSB2YWx1ZSBmb3IgdGhlIEhBTC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKTsKKworICAgIC8vIENhbGxlZCB3aGVuIHRoZSBhdWRpbyBtb2RlIGNoYW5nZXMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKTsKKworICAgIC8vIE11dGluZyBjb250cm9sLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWljTXV0ZShib29sIHN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY011dGUoYm9vbCAqc3RhdGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpOworCisgICAgLy8gU2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKKworICAgIC8vIEdldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKKworICAgIC8vIFJldHVybnMgYXVkaW8gaW5wdXQgYnVmZmVyIHNpemUgYWNjb3JkaW5nIHRvIHBhcmFtZXRlcnMgcGFzc2VkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJTaXplKGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKKyAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXRTdHJlYW0oCisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSk7CisKKyAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAorICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbklucHV0U3RyZWFtKAorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIGNyZWF0ZUF1ZGlvUGF0Y2ggYW5kIHJlbGVhc2VBdWRpb1BhdGNoIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcyk7CisKKyAgICAvLyBDcmVhdGVzIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKAorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpOworCisgICAgLy8gUmVsZWFzZXMgYW4gYXVkaW8gcGF0Y2guCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCk7CisKKyAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKKworICAgIC8vIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworCisgICAgLy8gTGlzdCBtaWNyb3Bob25lcworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOworICAgIHNwPElEZXZpY2U+IG1EZXZpY2U7CisgICAgc3A8SVByaW1hcnlEZXZpY2U+IG1QcmltYXJ5RGV2aWNlOyAgLy8gTnVsbCBpZiBpdCdzIG5vdCBhIHByaW1hcnkgZGV2aWNlLgorCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIGV4cGxpY2l0IERldmljZUhhbEhpZGwoY29uc3Qgc3A8SURldmljZT4mIGRldmljZSk7CisKKyAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgZGV2aWNlLgorICAgIHZpcnR1YWwgfkRldmljZUhhbEhpZGwoKTsKK307CisKK30gLy8gbmFtZXNwYWNlIFY0XzAKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbExvY2FsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjQ1ZGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbExvY2FsLmNwcApAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlSGFsTG9jYWwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCisjaW5jbHVkZSAiU3RyZWFtSGFsTG9jYWwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFY0XzAgeworCitEZXZpY2VIYWxMb2NhbDo6RGV2aWNlSGFsTG9jYWwoYXVkaW9faHdfZGV2aWNlX3QgKmRldikKKyAgICAgICAgOiBtRGV2KGRldikgeworfQorCitEZXZpY2VIYWxMb2NhbDo6fkRldmljZUhhbExvY2FsKCkgeworICAgIGludCBzdGF0dXMgPSBhdWRpb19od19kZXZpY2VfY2xvc2UobURldik7CisgICAgQUxPR1dfSUYoc3RhdHVzLCAiRXJyb3IgY2xvc2luZyBhdWRpbyBodyBkZXZpY2UgJXA6ICVzIiwgbURldiwgc3RyZXJyb3IoLXN0YXR1cykpOworICAgIG1EZXYgPSAwOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCAqZGV2aWNlcykgeworICAgIGlmIChtRGV2LT5nZXRfc3VwcG9ydGVkX2RldmljZXMgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICpkZXZpY2VzID0gbURldi0+Z2V0X3N1cHBvcnRlZF9kZXZpY2VzKG1EZXYpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmluaXRDaGVjaygpIHsKKyAgICByZXR1cm4gbURldi0+aW5pdF9jaGVjayhtRGV2KTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIHJldHVybiBtRGV2LT5zZXRfdm9pY2Vfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CisgICAgaWYgKG1EZXYtPnNldF9tYXN0ZXJfdm9sdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbURldi0+c2V0X21hc3Rlcl92b2x1bWUobURldiwgdm9sdW1lKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKSB7CisgICAgaWYgKG1EZXYtPmdldF9tYXN0ZXJfdm9sdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbURldi0+Z2V0X21hc3Rlcl92b2x1bWUobURldiwgdm9sdW1lKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpIHsKKyAgICByZXR1cm4gbURldi0+c2V0X21vZGUobURldiwgbW9kZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNaWNNdXRlKGJvb2wgc3RhdGUpIHsKKyAgICByZXR1cm4gbURldi0+c2V0X21pY19tdXRlKG1EZXYsIHN0YXRlKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1pY011dGUoYm9vbCAqc3RhdGUpIHsKKyAgICByZXR1cm4gbURldi0+Z2V0X21pY19tdXRlKG1EZXYsIHN0YXRlKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSkgeworICAgIGlmIChtRGV2LT5zZXRfbWFzdGVyX211dGUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtRGV2LT5zZXRfbWFzdGVyX211dGUobURldiwgc3RhdGUpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSkgeworICAgIGlmIChtRGV2LT5nZXRfbWFzdGVyX211dGUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtRGV2LT5nZXRfbWFzdGVyX211dGUobURldiwgc3RhdGUpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7CisgICAgcmV0dXJuIG1EZXYtPnNldF9wYXJhbWV0ZXJzKG1EZXYsIGt2UGFpcnMuc3RyaW5nKCkpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKKyAgICBjaGFyICpoYWxWYWx1ZXMgPSBtRGV2LT5nZXRfcGFyYW1ldGVycyhtRGV2LCBrZXlzLnN0cmluZygpKTsKKyAgICBpZiAoaGFsVmFsdWVzICE9IE5VTEwpIHsKKyAgICAgICAgdmFsdWVzLT5zZXRUbyhoYWxWYWx1ZXMpOworICAgICAgICBmcmVlKGhhbFZhbHVlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsdWVzLT5jbGVhcigpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRJbnB1dEJ1ZmZlclNpemUoCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywgc2l6ZV90ICpzaXplKSB7CisgICAgKnNpemUgPSBtRGV2LT5nZXRfaW5wdXRfYnVmZmVyX3NpemUobURldiwgY29uZmlnKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpvcGVuT3V0cHV0U3RyZWFtKAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pIHsKKyAgICBhdWRpb19zdHJlYW1fb3V0X3QgKmhhbFN0cmVhbTsKKyAgICBBTE9HVigib3Blbl9vdXRwdXRfc3RyZWFtIGhhbmRsZTogJWQgZGV2aWNlczogJXggZmxhZ3M6ICUjeCIKKyAgICAgICAgICAgICJzcmF0ZTogJWQgZm9ybWF0ICUjeCBjaGFubmVscyAleCBhZGRyZXNzICVzIiwKKyAgICAgICAgICAgIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsCisgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssCisgICAgICAgICAgICBhZGRyZXNzKTsKKyAgICBpbnQgb3BlblJlc3V0ID0gbURldi0+b3Blbl9vdXRwdXRfc3RyZWFtKAorICAgICAgICAgICAgbURldiwgaGFuZGxlLCBkZXZpY2VzLCBmbGFncywgY29uZmlnLCAmaGFsU3RyZWFtLCBhZGRyZXNzKTsKKyAgICBpZiAob3BlblJlc3V0ID09IE9LKSB7CisgICAgICAgICpvdXRTdHJlYW0gPSBuZXcgU3RyZWFtT3V0SGFsTG9jYWwoaGFsU3RyZWFtLCB0aGlzKTsKKyAgICB9CisgICAgQUxPR1YoIm9wZW5fb3V0cHV0X3N0cmVhbSBzdGF0dXMgJWQgc3RyZWFtICVwIiwgb3BlblJlc3V0LCBoYWxTdHJlYW0pOworICAgIHJldHVybiBvcGVuUmVzdXQ7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpvcGVuSW5wdXRTdHJlYW0oCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKSB7CisgICAgYXVkaW9fc3RyZWFtX2luX3QgKmhhbFN0cmVhbTsKKyAgICBBTE9HVigib3Blbl9pbnB1dF9zdHJlYW0gaGFuZGxlOiAlZCBkZXZpY2VzOiAleCBmbGFnczogJSN4ICIKKyAgICAgICAgICAgICJzcmF0ZTogJWQgZm9ybWF0ICUjeCBjaGFubmVscyAleCBhZGRyZXNzICVzIHNvdXJjZSAlZCIsCisgICAgICAgICAgICBoYW5kbGUsIGRldmljZXMsIGZsYWdzLAorICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgYWRkcmVzcywgc291cmNlKTsKKyAgICBpbnQgb3BlblJlc3VsdCA9IG1EZXYtPm9wZW5faW5wdXRfc3RyZWFtKAorICAgICAgICAgICAgbURldiwgaGFuZGxlLCBkZXZpY2VzLCBjb25maWcsICZoYWxTdHJlYW0sIGZsYWdzLCBhZGRyZXNzLCBzb3VyY2UpOworICAgIGlmIChvcGVuUmVzdWx0ID09IE9LKSB7CisgICAgICAgICppblN0cmVhbSA9IG5ldyBTdHJlYW1JbkhhbExvY2FsKGhhbFN0cmVhbSwgdGhpcyk7CisgICAgfQorICAgIEFMT0dWKCJvcGVuX2lucHV0X3N0cmVhbSBzdGF0dXMgJWQgc3RyZWFtICVwIiwgb3BlblJlc3VsdCwgaW5TdHJlYW0pOworICAgIHJldHVybiBvcGVuUmVzdWx0OworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKSB7CisgICAgKnN1cHBvcnRzUGF0Y2hlcyA9IHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAorICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAorICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpIHsKKyAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICAgICAgcmV0dXJuIG1EZXYtPmNyZWF0ZV9hdWRpb19wYXRjaCgKKyAgICAgICAgICAgICAgICBtRGV2LCBudW1fc291cmNlcywgc291cmNlcywgbnVtX3NpbmtzLCBzaW5rcywgcGF0Y2gpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCkgeworICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgeworICAgICAgICByZXR1cm4gbURldi0+cmVsZWFzZV9hdWRpb19wYXRjaChtRGV2LCBwYXRjaCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgeworICAgIHJldHVybiBtRGV2LT5nZXRfYXVkaW9fcG9ydChtRGV2LCBwb3J0KTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgeworICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkKKyAgICAgICAgcmV0dXJuIG1EZXYtPnNldF9hdWRpb19wb3J0X2NvbmZpZyhtRGV2LCBjb25maWcpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpIHsKKyAgICBpZiAobURldi0+Z2V0X21pY3JvcGhvbmVzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBzaXplX3QgYWN0dWFsX21pY3MgPSBBVURJT19NSUNST1BIT05FX01BWF9DT1VOVDsKKyAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgbWljX2FycmF5W0FVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UXTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtRGV2LT5nZXRfbWljcm9waG9uZXMobURldiwgJm1pY19hcnJheVswXSwgJmFjdHVhbF9taWNzKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFjdHVhbF9taWNzOyBpKyspIHsKKyAgICAgICAgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvIG1pY3JvcGhvbmVJbmZvID0gbWVkaWE6Ok1pY3JvcGhvbmVJbmZvKG1pY19hcnJheVtpXSk7CisgICAgICAgIG1pY3JvcGhvbmVzLT5wdXNoX2JhY2sobWljcm9waG9uZUluZm8pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6ZHVtcChpbnQgZmQpIHsKKyAgICByZXR1cm4gbURldi0+ZHVtcChtRGV2LCBmZCk7Cit9CisKK3ZvaWQgRGV2aWNlSGFsTG9jYWw6OmNsb3NlT3V0cHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0ICpzdHJlYW1fb3V0KSB7CisgICAgbURldi0+Y2xvc2Vfb3V0cHV0X3N0cmVhbShtRGV2LCBzdHJlYW1fb3V0KTsKK30KKwordm9pZCBEZXZpY2VIYWxMb2NhbDo6Y2xvc2VJbnB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luICpzdHJlYW1faW4pIHsKKyAgICBtRGV2LT5jbG9zZV9pbnB1dF9zdHJlYW0obURldiwgc3RyZWFtX2luKTsKK30KKworfSAvLyBuYW1lc3BhY2UgVjRfMAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsTG9jYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODM0MWE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbExvY2FsLmgKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF80XzBfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfTE9DQUxfNF8wX0gKKworI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBWNF8wIHsKKworY2xhc3MgRGV2aWNlSGFsTG9jYWwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlCit7CisgIHB1YmxpYzoKKyAgICAvLyBTZXRzIHRoZSB2YWx1ZSBvZiAnZGV2aWNlcycgdG8gYSBiaXRtYXNrIG9mIDEgb3IgbW9yZSB2YWx1ZXMgb2YgYXVkaW9fZGV2aWNlc190LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCAqZGV2aWNlcyk7CisKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOworCisgICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgb2YgYSB2b2ljZSBjYWxsLiBSYW5nZSBpcyBiZXR3ZWVuIDAuMCBhbmQgMS4wLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKTsKKworICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIGZvciBhbGwgYXVkaW8gYWN0aXZpdGllcyBvdGhlciB0aGFuIHZvaWNlIGNhbGwuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKTsKKworICAgIC8vIEdldCB0aGUgY3VycmVudCBtYXN0ZXIgdm9sdW1lIHZhbHVlIGZvciB0aGUgSEFMLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpOworCisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGF1ZGlvIG1vZGUgY2hhbmdlcy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpOworCisgICAgLy8gTXV0aW5nIGNvbnRyb2wuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNNdXRlKGJvb2wgc3RhdGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljTXV0ZShib29sICpzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSk7CisKKyAgICAvLyBTZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOworCisgICAgLy8gR2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOworCisgICAgLy8gUmV0dXJucyBhdWRpbyBpbnB1dCBidWZmZXIgc2l6ZSBhY2NvcmRpbmcgdG8gcGFyYW1ldGVycyBwYXNzZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclNpemUoY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgc2l6ZV90ICpzaXplKTsKKworICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAorICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dFN0cmVhbSgKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKTsKKworICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCisgICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXRTdHJlYW0oCisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgY3JlYXRlQXVkaW9QYXRjaCBhbmQgcmVsZWFzZUF1ZGlvUGF0Y2ggb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKTsKKworICAgIC8vIENyZWF0ZXMgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCk7CisKKyAgICAvLyBSZWxlYXNlcyBhbiBhdWRpbyBwYXRjaC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKTsKKworICAgIC8vIEZpbGxzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOworCisgICAgLy8gU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisKKyAgICAvLyBMaXN0IG1pY3JvcGhvbmVzCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKworICAgIHZvaWQgY2xvc2VPdXRwdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbV9vdXQpOworICAgIHZvaWQgY2xvc2VJbnB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luICpzdHJlYW1faW4pOworCisgIHByaXZhdGU6CisgICAgYXVkaW9faHdfZGV2aWNlX3QgKm1EZXY7CisKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBleHBsaWNpdCBEZXZpY2VIYWxMb2NhbChhdWRpb19od19kZXZpY2VfdCAqZGV2KTsKKworICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBkZXZpY2UuCisgICAgdmlydHVhbCB+RGV2aWNlSGFsTG9jYWwoKTsKKworICAgIHVpbnQzMl90IHZlcnNpb24oKSBjb25zdCB7IHJldHVybiBtRGV2LT5jb21tb24udmVyc2lvbjsgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgVjRfMAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MzE5NGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcApAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lEZXZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9oaWRsL0hhbERlYXRoSGFuZGxlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKyNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCisjaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJRGV2aWNlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFY0XzAgeworCitEZXZpY2VzRmFjdG9yeUhhbEhpZGw6OkRldmljZXNGYWN0b3J5SGFsSGlkbCgpIHsKKyAgICBtRGV2aWNlc0ZhY3RvcnkgPSBJRGV2aWNlc0ZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKKyAgICBpZiAobURldmljZXNGYWN0b3J5ICE9IDApIHsKKyAgICAgICAgLy8gSXQgaXMgYXNzdW1lZCB0aGF0IERldmljZXNGYWN0b3J5IGlzIG93bmVkIGJ5IEF1ZGlvRmxpbmdlcgorICAgICAgICAvLyBhbmQgdGh1cyBoYXZlIHRoZSBzYW1lIGxpZmVzcGFuLgorICAgICAgICBtRGV2aWNlc0ZhY3RvcnktPmxpbmtUb0RlYXRoKEhhbERlYXRoSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKSwgMCAvKmNvb2tpZSovKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9idGFpbiBJRGV2aWNlc0ZhY3Rvcnkgc2VydmljZSwgdGVybWluYXRpbmcgcHJvY2Vzcy4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgLy8gVGhlIE1TRCBmYWN0b3J5IGlzIG9wdGlvbmFsCisgICAgbURldmljZXNGYWN0b3J5TXNkID0gSURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKEFVRElPX0hBTF9TRVJWSUNFX05BTUVfTVNEKTsKKyAgICAvLyBUT0RPOiBSZWdpc3RlciBkZWF0aCBoYW5kbGVyLCBhbmQgYWRkICdyZXN0YXJ0JyBkaXJlY3RpdmUgdG8gYXVkaW9zZXJ2ZXIucmMKK30KKworRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjp+RGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCkgeworfQorCitzdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEhpZGw6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7CisgICAgaWYgKG1EZXZpY2VzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2VzRmFjdG9yeS0+b3BlbkRldmljZSgKKyAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElEZXZpY2U+JiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqZGV2aWNlID0gbmV3IERldmljZUhhbEhpZGwocmVzdWx0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHJldHVybiBPSzsKKyAgICAgICAgZWxzZSBpZiAocmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFMpIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBGQUlMRURfVFJBTlNBQ1RJT047Cit9CisKK30gLy8gbmFtZXNwYWNlIFY0XzAKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTQ4ODliCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9ISURMXzRfMF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9ISURMXzRfMF9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JRGV2aWNlc0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklEZXZpY2VzRmFjdG9yeTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFY0XzAgeworCitjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEhpZGwgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKK3sKKyAgcHVibGljOgorICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcworICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDsKKworICAgIHNwPElEZXZpY2VzRmFjdG9yeT4gbURldmljZXNGYWN0b3J5OworICAgIHNwPElEZXZpY2VzRmFjdG9yeT4gbURldmljZXNGYWN0b3J5TXNkOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIERldmljZXNGYWN0b3J5SGFsSGlkbCgpOworCisgICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBWNF8wCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZmMWVjN2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsSHlicmlkIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8bGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmg+CisjaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIgorI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgVjRfMCB7CisKK0RldmljZXNGYWN0b3J5SGFsSHlicmlkOjpEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpCisgICAgICAgIDogbUxvY2FsRmFjdG9yeShuZXcgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCgpKSwKKyAgICAgICAgICBtSGlkbEZhY3RvcnkobmV3IERldmljZXNGYWN0b3J5SGFsSGlkbCgpKSB7Cit9CisKK0RldmljZXNGYWN0b3J5SGFsSHlicmlkOjp+RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKSB7Cit9CisKK3N0YXR1c190IERldmljZXNGYWN0b3J5SGFsSHlicmlkOjpvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSkgeworICAgIGlmIChtSGlkbEZhY3RvcnkgIT0gMCAmJiBzdHJjbXAoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0EyRFAsIG5hbWUpICE9IDAgJiYKKyAgICAgICAgc3RyY21wKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9IRUFSSU5HX0FJRCwgbmFtZSkgIT0gMCkgeworICAgICAgICByZXR1cm4gbUhpZGxGYWN0b3J5LT5vcGVuRGV2aWNlKG5hbWUsIGRldmljZSk7CisgICAgfQorICAgIHJldHVybiBtTG9jYWxGYWN0b3J5LT5vcGVuRGV2aWNlKG5hbWUsIGRldmljZSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFY0XzAKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTRlZGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgorI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFY0XzAgeworCitzdGF0aWMgc3RhdHVzX3QgbG9hZF9hdWRpb19pbnRlcmZhY2UoY29uc3QgY2hhciAqaWZfbmFtZSwgYXVkaW9faHdfZGV2aWNlX3QgKipkZXYpCit7CisgICAgY29uc3QgaHdfbW9kdWxlX3QgKm1vZDsKKyAgICBpbnQgcmM7CisKKyAgICByYyA9IGh3X2dldF9tb2R1bGVfYnlfY2xhc3MoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCAmbW9kKTsKKyAgICBpZiAocmMpIHsKKyAgICAgICAgQUxPR0UoIiVzIGNvdWxkbid0IGxvYWQgYXVkaW8gaHcgbW9kdWxlICVzLiVzICglcykiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIGlmX25hbWUsIHN0cmVycm9yKC1yYykpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgcmMgPSBhdWRpb19od19kZXZpY2Vfb3Blbihtb2QsIGRldik7CisgICAgaWYgKHJjKSB7CisgICAgICAgIEFMT0dFKCIlcyBjb3VsZG4ndCBvcGVuIGF1ZGlvIGh3IGRldmljZSBpbiAlcy4lcyAoJXMpIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCBzdHJlcnJvcigtcmMpKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIGlmICgoKmRldiktPmNvbW1vbi52ZXJzaW9uIDwgQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OX01JTikgeworICAgICAgICBBTE9HRSgiJXMgd3JvbmcgYXVkaW8gaHcgZGV2aWNlIHZlcnNpb24gJTA0eCIsIF9fZnVuY19fLCAoKmRldiktPmNvbW1vbi52ZXJzaW9uKTsKKyAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgICAgIGF1ZGlvX2h3X2RldmljZV9jbG9zZSgqZGV2KTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIHJldHVybiBPSzsKKworb3V0OgorICAgICpkZXYgPSBOVUxMOworICAgIHJldHVybiByYzsKK30KKworc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKKyAgICBhdWRpb19od19kZXZpY2VfdCAqZGV2OworICAgIHN0YXR1c190IHJjID0gbG9hZF9hdWRpb19pbnRlcmZhY2UobmFtZSwgJmRldik7CisgICAgaWYgKHJjID09IE9LKSB7CisgICAgICAgICpkZXZpY2UgPSBuZXcgRGV2aWNlSGFsTG9jYWwoZGV2KTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCit9IC8vIG5hbWVzcGFjZSBWNF8wCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzFjNTIxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfTE9DQUxfNF8wX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0xPQ0FMXzRfMF9ICisKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBWNF8wIHsKKworY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCA6IHB1YmxpYyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZQoreworICBwdWJsaWM6CisgICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCisgICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOworCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIERldmljZXNGYWN0b3J5SGFsTG9jYWwoKSB7fQorCisgICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCgpIHt9Cit9OworCit9IC8vIG5hbWVzcGFjZSBWNF8wCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfTE9DQUxfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTdjODlmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGF0b21pYz4KKworI2RlZmluZSBMT0dfVEFHICJFZmZlY3RCdWZmZXJIYWxIaWRsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL2FsbG9jYXRvci8xLjAvSUFsbG9jYXRvci5oPgorI2luY2x1ZGUgPGhpZGxtZW1vcnkvbWFwcGluZy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKyNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGlkbDo6YWxsb2NhdG9yOjpWMV8wOjpJQWxsb2NhdG9yOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgVjRfMCB7CisKKy8vIHN0YXRpYwordWludDY0X3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6bWFrZVVuaXF1ZUlkKCkgeworICAgIHN0YXRpYyBzdGQ6OmF0b21pYzx1aW50NjRfdD4gY291bnRlcnsxfTsKKyAgICByZXR1cm4gY291bnRlcisrOworfQorCitzdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjphbGxvY2F0ZSgKKyAgICAgICAgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgeworICAgIHJldHVybiBtaXJyb3IobnVsbHB0ciwgc2l6ZSwgYnVmZmVyKTsKK30KKworc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6bWlycm9yKAorICAgICAgICB2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgeworICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gdGVtcEJ1ZmZlciA9IG5ldyBFZmZlY3RCdWZmZXJIYWxIaWRsKHNpemUpOworICAgIHN0YXR1c190IHJlc3VsdCA9IHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPih0ZW1wQnVmZmVyLmdldCgpKS0+aW5pdCgpOworICAgIGlmIChyZXN1bHQgPT0gT0spIHsKKyAgICAgICAgdGVtcEJ1ZmZlci0+c2V0RXh0ZXJuYWxEYXRhKGV4dGVybmFsKTsKKyAgICAgICAgKmJ1ZmZlciA9IHRlbXBCdWZmZXI7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0VmZmVjdEJ1ZmZlckhhbEhpZGw6OkVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZV90IHNpemUpCisgICAgICAgIDogbUJ1ZmZlclNpemUoc2l6ZSksIG1GcmFtZUNvdW50Q2hhbmdlZChmYWxzZSksCisgICAgICAgICAgbUV4dGVybmFsRGF0YShudWxscHRyKSwgbUF1ZGlvQnVmZmVyezAsIHtudWxscHRyfX0geworICAgIG1IaWRsQnVmZmVyLmlkID0gbWFrZVVuaXF1ZUlkKCk7CisgICAgbUhpZGxCdWZmZXIuZnJhbWVDb3VudCA9IDA7Cit9CisKK0VmZmVjdEJ1ZmZlckhhbEhpZGw6On5FZmZlY3RCdWZmZXJIYWxIaWRsKCkgeworfQorCitzdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjppbml0KCkgeworICAgIHNwPElBbGxvY2F0b3I+IGFzaG1lbSA9IElBbGxvY2F0b3I6OmdldFNlcnZpY2UoImFzaG1lbSIpOworICAgIGlmIChhc2htZW0gPT0gMCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJldHJpZXZlIGFzaG1lbSBhbGxvY2F0b3Igc2VydmljZSIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgc3RhdHVzX3QgcmV0dmFsID0gTk9fTUVNT1JZOworICAgIFJldHVybjx2b2lkPiByZXN1bHQgPSBhc2htZW0tPmFsbG9jYXRlKAorICAgICAgICAgICAgbUJ1ZmZlclNpemUsCisgICAgICAgICAgICBbJl0oYm9vbCBzdWNjZXNzLCBjb25zdCBoaWRsX21lbW9yeSYgbWVtb3J5KSB7CisgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgbUhpZGxCdWZmZXIuZGF0YSA9IG1lbW9yeTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKHJlc3VsdC5pc09rKCkgJiYgcmV0dmFsID09IE9LKSB7CisgICAgICAgIG1NZW1vcnkgPSBoYXJkd2FyZTo6bWFwTWVtb3J5KG1IaWRsQnVmZmVyLmRhdGEpOworICAgICAgICBpZiAobU1lbW9yeSAhPSAwKSB7CisgICAgICAgICAgICBtTWVtb3J5LT51cGRhdGUoKTsKKyAgICAgICAgICAgIG1BdWRpb0J1ZmZlci5yYXcgPSBzdGF0aWNfY2FzdDx2b2lkKj4obU1lbW9yeS0+Z2V0UG9pbnRlcigpKTsKKyAgICAgICAgICAgIG1lbXNldChtQXVkaW9CdWZmZXIucmF3LCAwLCBtTWVtb3J5LT5nZXRTaXplKCkpOworICAgICAgICAgICAgbU1lbW9yeS0+Y29tbWl0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG1hcCBhbGxvY2F0ZWQgYXNobWVtIik7CisgICAgICAgICAgICByZXR2YWwgPSBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZyb20gYXNobWVtIiwgKGludCltQnVmZmVyU2l6ZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQuaXNPaygpID8gcmV0dmFsIDogRkFJTEVEX1RSQU5TQUNUSU9OOworfQorCithdWRpb19idWZmZXJfdCogRWZmZWN0QnVmZmVySGFsSGlkbDo6YXVkaW9CdWZmZXIoKSB7CisgICAgcmV0dXJuICZtQXVkaW9CdWZmZXI7Cit9CisKK3ZvaWQqIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmV4dGVybmFsRGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUV4dGVybmFsRGF0YTsKK30KKwordm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpzZXRGcmFtZUNvdW50KHNpemVfdCBmcmFtZUNvdW50KSB7CisgICAgbUhpZGxCdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgbUF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgIG1GcmFtZUNvdW50Q2hhbmdlZCA9IHRydWU7Cit9CisKK2Jvb2wgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCkgeworICAgIGJvb2wgcmVzdWx0ID0gbUZyYW1lQ291bnRDaGFuZ2VkOworICAgIG1GcmFtZUNvdW50Q2hhbmdlZCA9IGZhbHNlOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6c2V0RXh0ZXJuYWxEYXRhKHZvaWQqIGV4dGVybmFsKSB7CisgICAgbUV4dGVybmFsRGF0YSA9IGV4dGVybmFsOworfQorCit2b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnVwZGF0ZSgpIHsKKyAgICB1cGRhdGUobUJ1ZmZlclNpemUpOworfQorCit2b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNvbW1pdCgpIHsKKyAgICBjb21taXQobUJ1ZmZlclNpemUpOworfQorCit2b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnVwZGF0ZShzaXplX3Qgc2l6ZSkgeworICAgIGlmIChtRXh0ZXJuYWxEYXRhID09IG51bGxwdHIpIHJldHVybjsKKyAgICBtTWVtb3J5LT51cGRhdGUoKTsKKyAgICBpZiAoc2l6ZSA+IG1CdWZmZXJTaXplKSBzaXplID0gbUJ1ZmZlclNpemU7CisgICAgbWVtY3B5KG1BdWRpb0J1ZmZlci5yYXcsIG1FeHRlcm5hbERhdGEsIHNpemUpOworICAgIG1NZW1vcnktPmNvbW1pdCgpOworfQorCit2b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNvbW1pdChzaXplX3Qgc2l6ZSkgeworICAgIGlmIChtRXh0ZXJuYWxEYXRhID09IG51bGxwdHIpIHJldHVybjsKKyAgICBpZiAoc2l6ZSA+IG1CdWZmZXJTaXplKSBzaXplID0gbUJ1ZmZlclNpemU7CisgICAgbWVtY3B5KG1FeHRlcm5hbERhdGEsIG1BdWRpb0J1ZmZlci5yYXcsIHNpemUpOworfQorCit9IC8vIG5hbWVzcGFjZSBWNF8wCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0QnVmZmVySGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDU3OGM2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaApAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0hJRExfNF8wX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMXzRfMF9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC80LjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OkF1ZGlvQnVmZmVyOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgYW5kcm9pZDo6aGlkbDo6bWVtb3J5OjpWMV8wOjpJTWVtb3J5OworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgVjRfMCB7CisKK2NsYXNzIEVmZmVjdEJ1ZmZlckhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlCit7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgc3RhdHVzX3QgYWxsb2NhdGUoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcik7CisgICAgc3RhdGljIHN0YXR1c190IG1pcnJvcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcik7CisKKyAgICB2aXJ0dWFsIGF1ZGlvX2J1ZmZlcl90KiBhdWRpb0J1ZmZlcigpOworICAgIHZpcnR1YWwgdm9pZCogZXh0ZXJuYWxEYXRhKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHNpemVfdCBnZXRTaXplKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbUJ1ZmZlclNpemU7IH0KKworICAgIHZpcnR1YWwgdm9pZCBzZXRFeHRlcm5hbERhdGEodm9pZCogZXh0ZXJuYWwpOworICAgIHZpcnR1YWwgdm9pZCBzZXRGcmFtZUNvdW50KHNpemVfdCBmcmFtZUNvdW50KTsKKyAgICB2aXJ0dWFsIGJvb2wgY2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlKCk7CisgICAgdmlydHVhbCB2b2lkIGNvbW1pdCgpOworICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoc2l6ZV90IHNpemUpOworICAgIHZpcnR1YWwgdm9pZCBjb21taXQoc2l6ZV90IHNpemUpOworCisgICAgY29uc3QgQXVkaW9CdWZmZXImIGhpZGxCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtSGlkbEJ1ZmZlcjsgfQorCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZTsKKworICAgIHN0YXRpYyB1aW50NjRfdCBtYWtlVW5pcXVlSWQoKTsKKworICAgIGNvbnN0IHNpemVfdCBtQnVmZmVyU2l6ZTsKKyAgICBib29sIG1GcmFtZUNvdW50Q2hhbmdlZDsKKyAgICB2b2lkKiBtRXh0ZXJuYWxEYXRhOworICAgIEF1ZGlvQnVmZmVyIG1IaWRsQnVmZmVyOworICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7CisgICAgYXVkaW9fYnVmZmVyX3QgbUF1ZGlvQnVmZmVyOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIGV4cGxpY2l0IEVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZV90IHNpemUpOworCisgICAgdmlydHVhbCB+RWZmZWN0QnVmZmVySGFsSGlkbCgpOworCisgICAgc3RhdHVzX3QgaW5pdCgpOworfTsKKworfSAvLyBuYW1lc3BhY2UgVjRfMAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0SGFsSGlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk5YzRjOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RIYWxIaWRsLmNwcApAQCAtMCwwICsxLDM0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0SGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGNvbW1vbi9hbGwtdmVyc2lvbnMvVmVyc2lvblV0aWxzLmg+CisjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKyNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCisjaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgorI2luY2x1ZGUgIkhpZGxVdGlscy5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpBdWRpb0J1ZmZlcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OkVmZmVjdEJ1ZmZlckFjY2VzczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OkVmZmVjdENvbmZpZ1BhcmFtZXRlcnM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpNZXNzYWdlUXVldWVGbGFnQml0czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OlJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkhpZGxVdGlsczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvQ2hhbm5lbE1hc2s7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb0Zvcm1hdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OnV0aWxzOjpta0VudW1Db252ZXJ0ZXI7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBWNF8wIHsKKworRWZmZWN0SGFsSGlkbDo6RWZmZWN0SGFsSGlkbChjb25zdCBzcDxJRWZmZWN0PiYgZWZmZWN0LCB1aW50NjRfdCBlZmZlY3RJZCkKKyAgICAgICAgOiBtRWZmZWN0KGVmZmVjdCksIG1FZmZlY3RJZChlZmZlY3RJZCksIG1CdWZmZXJzQ2hhbmdlZCh0cnVlKSwgbUVmR3JvdXAobnVsbHB0cikgeworfQorCitFZmZlY3RIYWxIaWRsOjp+RWZmZWN0SGFsSGlkbCgpIHsKKyAgICBpZiAobUVmZmVjdCAhPSAwKSB7CisgICAgICAgIGNsb3NlKCk7CisgICAgICAgIG1FZmZlY3QuY2xlYXIoKTsKKyAgICAgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKyAgICB9CisgICAgaWYgKG1FZkdyb3VwKSB7CisgICAgICAgIEV2ZW50RmxhZzo6ZGVsZXRlRXZlbnRGbGFnKCZtRWZHcm91cCk7CisgICAgfQorfQorCisvLyBzdGF0aWMKK3ZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0RGVzY3JpcHRvclRvSGFsKAorICAgICAgICBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiBkZXNjcmlwdG9yLCBlZmZlY3RfZGVzY3JpcHRvcl90KiBoYWxEZXNjcmlwdG9yKSB7CisgICAgSGlkbFV0aWxzOjp1dWlkVG9IYWwoZGVzY3JpcHRvci50eXBlLCAmaGFsRGVzY3JpcHRvci0+dHlwZSk7CisgICAgSGlkbFV0aWxzOjp1dWlkVG9IYWwoZGVzY3JpcHRvci51dWlkLCAmaGFsRGVzY3JpcHRvci0+dXVpZCk7CisgICAgaGFsRGVzY3JpcHRvci0+ZmxhZ3MgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZGVzY3JpcHRvci5mbGFncyk7CisgICAgaGFsRGVzY3JpcHRvci0+Y3B1TG9hZCA9IGRlc2NyaXB0b3IuY3B1TG9hZDsKKyAgICBoYWxEZXNjcmlwdG9yLT5tZW1vcnlVc2FnZSA9IGRlc2NyaXB0b3IubWVtb3J5VXNhZ2U7CisgICAgbWVtY3B5KGhhbERlc2NyaXB0b3ItPm5hbWUsIGRlc2NyaXB0b3IubmFtZS5kYXRhKCksIGRlc2NyaXB0b3IubmFtZS5zaXplKCkpOworICAgIG1lbWNweShoYWxEZXNjcmlwdG9yLT5pbXBsZW1lbnRvciwKKyAgICAgICAgICAgIGRlc2NyaXB0b3IuaW1wbGVtZW50b3IuZGF0YSgpLCBkZXNjcmlwdG9yLmltcGxlbWVudG9yLnNpemUoKSk7Cit9CisKKy8vIFRPRE8obW5hZ2Fub3YpOiBUaGVzZSBidWZmZXIgY29udmVyc2lvbiBmdW5jdGlvbnMgc2hvdWxkIGJlIHNoYXJlZCB3aXRoIEVmZmVjdCB3cmFwcGVyCisvLyB2aWEgSGlkbFV0aWxzLiBNb3ZlIHRoZW0gdGhlcmUgd2hlbiBoYXJkd2FyZS9pbnRlcmZhY2VzIHdpbGwgZ2V0IHVuLWZyb3plbiBhZ2Fpbi4KKworLy8gc3RhdGljCit2b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoCisgICAgICAgIGNvbnN0IGJ1ZmZlcl9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RCdWZmZXJDb25maWcqIGNvbmZpZykgeworICAgIGNvbmZpZy0+c2FtcGxpbmdSYXRlSHogPSBoYWxDb25maWcuc2FtcGxpbmdSYXRlOworICAgIGNvbmZpZy0+Y2hhbm5lbHMgPSBta0VudW1Db252ZXJ0ZXI8QXVkaW9DaGFubmVsTWFzaz4oaGFsQ29uZmlnLmNoYW5uZWxzKTsKKyAgICBjb25maWctPmZvcm1hdCA9IEF1ZGlvRm9ybWF0KGhhbENvbmZpZy5mb3JtYXQpOworICAgIGNvbmZpZy0+YWNjZXNzTW9kZSA9IEVmZmVjdEJ1ZmZlckFjY2VzcyhoYWxDb25maWcuYWNjZXNzTW9kZSk7CisgICAgY29uZmlnLT5tYXNrID0gbWtFbnVtQ29udmVydGVyPEVmZmVjdENvbmZpZ1BhcmFtZXRlcnM+KGhhbENvbmZpZy5tYXNrKTsKK30KKworLy8gc3RhdGljCit2b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKAorICAgICAgICBjb25zdCBFZmZlY3RCdWZmZXJDb25maWcmIGNvbmZpZywgYnVmZmVyX2NvbmZpZ190KiBoYWxDb25maWcpIHsKKyAgICBoYWxDb25maWctPmJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKKyAgICBoYWxDb25maWctPmJ1ZmZlci5yYXcgPSBOVUxMOworICAgIGhhbENvbmZpZy0+c2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsaW5nUmF0ZUh6OworICAgIGhhbENvbmZpZy0+Y2hhbm5lbHMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY29uZmlnLmNoYW5uZWxzKTsKKyAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IE5VTEw7CisgICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOworICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CisgICAgaGFsQ29uZmlnLT5mb3JtYXQgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb25maWcuZm9ybWF0KTsKKyAgICBoYWxDb25maWctPmFjY2Vzc01vZGUgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb25maWcuYWNjZXNzTW9kZSk7CisgICAgaGFsQ29uZmlnLT5tYXNrID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLm1hc2spOworfQorCisvLyBzdGF0aWMKK3ZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0Q29uZmlnRnJvbUhhbChjb25zdCBlZmZlY3RfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0Q29uZmlnKiBjb25maWcpIHsKKyAgICBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKGhhbENvbmZpZy5pbnB1dENmZywgJmNvbmZpZy0+aW5wdXRDZmcpOworICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoaGFsQ29uZmlnLm91dHB1dENmZywgJmNvbmZpZy0+b3V0cHV0Q2ZnKTsKK30KKworLy8gc3RhdGljCit2b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdENvbmZpZ1RvSGFsKGNvbnN0IEVmZmVjdENvbmZpZyYgY29uZmlnLCBlZmZlY3RfY29uZmlnX3QqIGhhbENvbmZpZykgeworICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKGNvbmZpZy5pbnB1dENmZywgJmhhbENvbmZpZy0+aW5wdXRDZmcpOworICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKGNvbmZpZy5vdXRwdXRDZmcsICZoYWxDb25maWctPm91dHB1dENmZyk7Cit9CisKKy8vIHN0YXRpYworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6YW5hbHl6ZVJlc3VsdChjb25zdCBSZXN1bHQmIHJlc3VsdCkgeworICAgIHN3aXRjaCAocmVzdWx0KSB7CisgICAgICAgIGNhc2UgUmVzdWx0OjpPSzogcmV0dXJuIE9LOworICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFM6IHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX1NUQVRFOiByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOiByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9TVVBQT1JURUQ6IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgY2FzZSBSZXN1bHQ6OlJFU1VMVF9UT09fQklHOiByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gTk9fSU5JVDsKKyAgICB9Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldEluQnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcikgeworICAgIGlmICghbUJ1ZmZlcnNDaGFuZ2VkKSB7CisgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtSW5CdWZmZXIuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLmdldCgpICE9IG1JbkJ1ZmZlci5nZXQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci0+YXVkaW9CdWZmZXIoKSAhPSBtSW5CdWZmZXItPmF1ZGlvQnVmZmVyKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbUluQnVmZmVyID0gYnVmZmVyOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0T3V0QnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcikgeworICAgIGlmICghbUJ1ZmZlcnNDaGFuZ2VkKSB7CisgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtT3V0QnVmZmVyLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci5nZXQoKSAhPSBtT3V0QnVmZmVyLmdldCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLT5hdWRpb0J1ZmZlcigpICE9IG1PdXRCdWZmZXItPmF1ZGlvQnVmZmVyKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbU91dEJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByb2Nlc3MoKSB7CisgICAgcmV0dXJuIHByb2Nlc3NJbXBsKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6UkVRVUVTVF9QUk9DRVNTKSk7Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByb2Nlc3NSZXZlcnNlKCkgeworICAgIHJldHVybiBwcm9jZXNzSW1wbChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OlJFUVVFU1RfUFJPQ0VTU19SRVZFUlNFKSk7Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByZXBhcmVGb3JQcm9jZXNzaW5nKCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gdGVtcFN0YXR1c01ROworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3QtPnByZXBhcmVGb3JQcm9jZXNzaW5nKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBNUURlc2NyaXB0b3JTeW5jPFJlc3VsdD4mIHN0YXR1c01RKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcFN0YXR1c01RLnJlc2V0KG5ldyBTdGF0dXNNUShzdGF0dXNNUSkpOworICAgICAgICAgICAgICAgICAgICBpZiAodGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgJiYgdGVtcFN0YXR1c01RLT5nZXRFdmVudEZsYWdXb3JkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50RmxhZzo6Y3JlYXRlRXZlbnRGbGFnKHRlbXBTdGF0dXNNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCFyZXQuaXNPaygpIHx8IHJldHZhbCAhPSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXR2YWwpIDogRkFJTEVEX1RSQU5TQUNUSU9OOworICAgIH0KKyAgICBpZiAoIXRlbXBTdGF0dXNNUSB8fCAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgfHwgIW1FZkdyb3VwKSB7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciBlZmZlY3RzIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCisgICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciBlZmZlY3RzIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3IgZWZmZWN0cyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIG1TdGF0dXNNUSA9IHN0ZDo6bW92ZSh0ZW1wU3RhdHVzTVEpOworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBFZmZlY3RIYWxIaWRsOjpuZWVkVG9SZXNldEJ1ZmZlcnMoKSB7CisgICAgaWYgKG1CdWZmZXJzQ2hhbmdlZCkgcmV0dXJuIHRydWU7CisgICAgYm9vbCBpbkJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkID0gbUluQnVmZmVyLT5jaGVja0ZyYW1lQ291bnRDaGFuZ2UoKTsKKyAgICBib29sIG91dEJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkID0gbU91dEJ1ZmZlci0+Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7CisgICAgcmV0dXJuIGluQnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQgfHwgb3V0QnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQ7Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByb2Nlc3NJbXBsKHVpbnQzMl90IG1xRmxhZykgeworICAgIGlmIChtRWZmZWN0ID09IDAgfHwgbUluQnVmZmVyID09IDAgfHwgbU91dEJ1ZmZlciA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKCFtU3RhdHVzTVEgJiYgKHN0YXR1cyA9IHByZXBhcmVGb3JQcm9jZXNzaW5nKCkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGlmIChuZWVkVG9SZXNldEJ1ZmZlcnMoKSAmJiAoc3RhdHVzID0gc2V0UHJvY2Vzc0J1ZmZlcnMoKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgLy8gVGhlIGRhdGEgaXMgYWxyZWFkeSBpbiB0aGUgYnVmZmVycywganVzdCBuZWVkIHRvIGZsdXNoIGl0IGFuZCB3YWtlIHVwIHRoZSBzZXJ2ZXIgc2lkZS4KKyAgICBzdGQ6OmF0b21pY190aHJlYWRfZmVuY2Uoc3RkOjptZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisgICAgbUVmR3JvdXAtPndha2UobXFGbGFnKTsKKyAgICB1aW50MzJfdCBlZlN0YXRlID0gMDsKK3JldHJ5OgorICAgIHN0YXR1c190IHJldCA9IG1FZkdyb3VwLT53YWl0KAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpET05FX1BST0NFU1NJTkcpLCAmZWZTdGF0ZSk7CisgICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OkRPTkVfUFJPQ0VTU0lORykpIHsKKyAgICAgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgICAgICBtU3RhdHVzTVEtPnJlYWQoJnJldHZhbCk7CisgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSyB8fCByZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX1NUQVRFKSB7CisgICAgICAgICAgICAvLyBTeW5jIGJhY2sgdGhlIGNoYW5nZWQgY29udGVudHMgb2YgdGhlIGJ1ZmZlci4KKyAgICAgICAgICAgIHN0ZDo6YXRvbWljX3RocmVhZF9mZW5jZShzdGQ6Om1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5hbHl6ZVJlc3VsdChyZXR2YWwpOworICAgIH0KKyAgICBpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FSU5UUikgeworICAgICAgICAvLyBTcHVyaW91cyB3YWtldXAuIFRoaXMgbm9ybWFsbHkgcmV0cmllcyBubyBtb3JlIHRoYW4gb25jZS4KKyAgICAgICAgZ290byByZXRyeTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0UHJvY2Vzc0J1ZmZlcnMoKSB7CisgICAgUmV0dXJuPFJlc3VsdD4gcmV0ID0gbUVmZmVjdC0+c2V0UHJvY2Vzc0J1ZmZlcnMoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RCdWZmZXJIYWxIaWRsKj4obUluQnVmZmVyLmdldCgpKS0+aGlkbEJ1ZmZlcigpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KG1PdXRCdWZmZXIuZ2V0KCkpLT5oaWRsQnVmZmVyKCkpOworICAgIGlmIChyZXQuaXNPaygpICYmIHJldCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGZhbHNlOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAorICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7CisgICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisKKyAgICAvLyBTcGVjaWFsIGNhc2VzLgorICAgIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX0NPTkZJRyB8fCBjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX0NPTkZJR19SRVZFUlNFKSB7CisgICAgICAgIHJldHVybiBzZXRDb25maWdJbXBsKGNtZENvZGUsIGNtZFNpemUsIHBDbWREYXRhLCByZXBseVNpemUsIHBSZXBseURhdGEpOworICAgIH0gZWxzZSBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0dFVF9DT05GSUcgfHwgY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0dFVF9DT05GSUdfUkVWRVJTRSkgeworICAgICAgICByZXR1cm4gZ2V0Q29uZmlnSW1wbChjbWRDb2RlLCByZXBseVNpemUsIHBSZXBseURhdGEpOworICAgIH0KKworICAgIC8vIENvbW1vbiBjYXNlLgorICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IGhpZGxEYXRhOworICAgIGlmIChwQ21kRGF0YSAhPSBudWxscHRyICYmIGNtZFNpemUgPiAwKSB7CisgICAgICAgIGhpZGxEYXRhLnNldFRvRXh0ZXJuYWwocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4ocENtZERhdGEpLCBjbWRTaXplKTsKKyAgICB9CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIHVpbnQzMl90IHJlcGx5U2l6ZVN0dWIgPSAwOworICAgIGlmIChyZXBseVNpemUgPT0gbnVsbHB0ciB8fCBwUmVwbHlEYXRhID09IG51bGxwdHIpIHJlcGx5U2l6ZSA9ICZyZXBseVNpemVTdHViOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5jb21tYW5kKGNtZENvZGUsIGhpZGxEYXRhLCAqcmVwbHlTaXplLAorICAgICAgICAgICAgWyZdKGludDMyX3QgcywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgqcmVwbHlTaXplID4gcmVzdWx0LnNpemUoKSkgKnJlcGx5U2l6ZSA9IHJlc3VsdC5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhICE9IG51bGxwdHIgJiYgKnJlcGx5U2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShwUmVwbHlEYXRhLCAmcmVzdWx0WzBdLCAqcmVwbHlTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiByZXQuaXNPaygpID8gc3RhdHVzIDogRkFJTEVEX1RSQU5TQUNUSU9OOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpnZXREZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CisgICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5nZXREZXNjcmlwdG9yKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBlZmZlY3REZXNjcmlwdG9yVG9IYWwocmVzdWx0LCBwRGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldHZhbCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OmNsb3NlKCkgeworICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOworICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IG1FZmZlY3QtPmNsb3NlKCk7CisgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OmdldENvbmZpZ0ltcGwoCisgICAgICAgIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKKyAgICBpZiAocmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSB8fCBwUmVwbHlEYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gRkFJTEVEX1RSQU5TQUNUSU9OOworICAgIFJldHVybjx2b2lkPiByZXQ7CisgICAgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHKSB7CisgICAgICAgIHJldCA9IG1FZmZlY3QtPmdldENvbmZpZyhbJl0gKFJlc3VsdCByLCBjb25zdCBFZmZlY3RDb25maWcgJmhpZGxDb25maWcpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGFuYWx5emVSZXN1bHQocik7CisgICAgICAgICAgICBpZiAociA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgZWZmZWN0Q29uZmlnVG9IYWwoaGlkbENvbmZpZywgc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocFJlcGx5RGF0YSkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBtRWZmZWN0LT5nZXRDb25maWdSZXZlcnNlKFsmXSAoUmVzdWx0IHIsIGNvbnN0IEVmZmVjdENvbmZpZyAmaGlkbENvbmZpZykgeworICAgICAgICAgICAgcmVzdWx0ID0gYW5hbHl6ZVJlc3VsdChyKTsKKyAgICAgICAgICAgIGlmIChyID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICBlZmZlY3RDb25maWdUb0hhbChoaWRsQ29uZmlnLCBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwUmVwbHlEYXRhKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgcmVzdWx0ID0gRkFJTEVEX1RSQU5TQUNUSU9OOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRDb25maWdJbXBsKAorICAgICAgICB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgeworICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgfHwKKyAgICAgICAgICAgIHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludDMyX3QpIHx8IHBSZXBseURhdGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBjb25zdCBlZmZlY3RfY29uZmlnX3QgKmhhbENvbmZpZyA9IHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBDbWREYXRhKTsKKyAgICBpZiAoaGFsQ29uZmlnLT5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgIT0gTlVMTCB8fAorICAgICAgICAgICAgaGFsQ29uZmlnLT5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyICE9IE5VTEwgfHwKKyAgICAgICAgICAgIGhhbENvbmZpZy0+b3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciAhPSBOVUxMIHx8CisgICAgICAgICAgICBoYWxDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkJ1ZmZlciBwcm92aWRlciBjYWxsYmFja3MgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICB9CisgICAgRWZmZWN0Q29uZmlnIGhpZGxDb25maWc7CisgICAgZWZmZWN0Q29uZmlnRnJvbUhhbCgqaGFsQ29uZmlnLCAmaGlkbENvbmZpZyk7CisgICAgUmV0dXJuPFJlc3VsdD4gcmV0ID0gY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgPworICAgICAgICAgICAgbUVmZmVjdC0+c2V0Q29uZmlnKGhpZGxDb25maWcsIG51bGxwdHIsIG51bGxwdHIpIDoKKyAgICAgICAgICAgIG1FZmZlY3QtPnNldENvbmZpZ1JldmVyc2UoaGlkbENvbmZpZywgbnVsbHB0ciwgbnVsbHB0cik7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gRkFJTEVEX1RSQU5TQUNUSU9OOworICAgIGlmIChyZXQuaXNPaygpKSB7CisgICAgICAgIHJlc3VsdCA9IGFuYWx5emVSZXN1bHQocmV0KTsKKyAgICAgICAgKnN0YXRpY19jYXN0PGludDMyX3QqPihwUmVwbHlEYXRhKSA9IHJlc3VsdDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAvLyBuYW1lc3BhY2UgVjRfMAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RIYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE0ZGFiMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RIYWxIaWRsLmgKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9ISURMXzRfMF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9ISURMXzRfMF9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC80LjAvSUVmZmVjdC5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGZtcS9FdmVudEZsYWcuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpFZmZlY3RCdWZmZXJDb25maWc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpFZmZlY3RDb25maWc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpFZmZlY3REZXNjcmlwdG9yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6SUVmZmVjdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkV2ZW50RmxhZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFY0XzAgeworCitjbGFzcyBFZmZlY3RIYWxIaWRsIDogcHVibGljIEVmZmVjdEhhbEludGVyZmFjZQoreworICBwdWJsaWM6CisgICAgLy8gU2V0IHRoZSBpbnB1dCBidWZmZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpOworCisgICAgLy8gU2V0IHRoZSBvdXRwdXQgYnVmZmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0QnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcik7CisKKyAgICAvLyBFZmZlY3QgcHJvY2VzcyBmdW5jdGlvbi4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3MoKTsKKworICAgIC8vIFByb2Nlc3MgcmV2ZXJzZSBzdHJlYW0gZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwYXNzCisgICAgLy8gYSByZWZlcmVuY2Ugc3RyZWFtIHRvIHRoZSBlZmZlY3QgZW5naW5lLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2Vzc1JldmVyc2UoKTsKKworICAgIC8vIFNlbmQgYSBjb21tYW5kIGFuZCByZWNlaXZlIGEgcmVzcG9uc2UgdG8vZnJvbSBlZmZlY3QgZW5naW5lLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKKyAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpOworCisgICAgLy8gUmV0dXJucyB0aGUgZWZmZWN0IGRlc2NyaXB0b3IuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKKworICAgIC8vIEZyZWUgcmVzb3VyY2VzIG9uIHRoZSByZW1vdGUgc2lkZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCk7CisKKyAgICAvLyBXaGV0aGVyIGl0J3MgYSBsb2NhbCBpbXBsZW1lbnRhdGlvbi4KKyAgICB2aXJ0dWFsIGJvb2wgaXNMb2NhbCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICB1aW50NjRfdCBlZmZlY3RJZCgpIGNvbnN0IHsgcmV0dXJuIG1FZmZlY3RJZDsgfQorCisgICAgc3RhdGljIHZvaWQgZWZmZWN0RGVzY3JpcHRvclRvSGFsKAorICAgICAgICAgICAgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgZGVzY3JpcHRvciwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogaGFsRGVzY3JpcHRvcik7CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOworICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPAorICAgICAgICBoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6UmVzdWx0LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7CisKKyAgICBzcDxJRWZmZWN0PiBtRWZmZWN0OworICAgIGNvbnN0IHVpbnQ2NF90IG1FZmZlY3RJZDsKKyAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IG1JbkJ1ZmZlcjsKKyAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IG1PdXRCdWZmZXI7CisgICAgYm9vbCBtQnVmZmVyc0NoYW5nZWQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7CisgICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBhbmFseXplUmVzdWx0KGNvbnN0IGhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpSZXN1bHQmIHJlc3VsdCk7CisgICAgc3RhdGljIHZvaWQgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbCgKKyAgICAgICAgICAgIGNvbnN0IGJ1ZmZlcl9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RCdWZmZXJDb25maWcqIGNvbmZpZyk7CisgICAgc3RhdGljIHZvaWQgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoCisgICAgICAgICAgICBjb25zdCBFZmZlY3RCdWZmZXJDb25maWcmIGNvbmZpZywgYnVmZmVyX2NvbmZpZ190KiBoYWxDb25maWcpOworICAgIHN0YXRpYyB2b2lkIGVmZmVjdENvbmZpZ0Zyb21IYWwoY29uc3QgZWZmZWN0X2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdENvbmZpZyogY29uZmlnKTsKKyAgICBzdGF0aWMgdm9pZCBlZmZlY3RDb25maWdUb0hhbChjb25zdCBFZmZlY3RDb25maWcmIGNvbmZpZywgZWZmZWN0X2NvbmZpZ190KiBoYWxDb25maWcpOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIEVmZmVjdEhhbEhpZGwoY29uc3Qgc3A8SUVmZmVjdD4mIGVmZmVjdCwgdWludDY0X3QgZWZmZWN0SWQpOworCisgICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSByZWxlYXNlcyB0aGUgZWZmZWN0LgorICAgIHZpcnR1YWwgfkVmZmVjdEhhbEhpZGwoKTsKKworICAgIHN0YXR1c190IGdldENvbmZpZ0ltcGwodWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7CisgICAgc3RhdHVzX3QgcHJlcGFyZUZvclByb2Nlc3NpbmcoKTsKKyAgICBib29sIG5lZWRUb1Jlc2V0QnVmZmVycygpOworICAgIHN0YXR1c190IHByb2Nlc3NJbXBsKHVpbnQzMl90IG1xRmxhZyk7CisgICAgc3RhdHVzX3Qgc2V0Q29uZmlnSW1wbCgKKyAgICAgICAgICAgIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAorICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7CisgICAgc3RhdHVzX3Qgc2V0UHJvY2Vzc0J1ZmZlcnMoKTsKK307CisKK30gLy8gbmFtZXNwYWNlIFY0XzAKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9ISURMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZWQ3ODQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcApAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxsaWJhdWRpb2hhbC80LjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmg+CisKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKKyNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCisjaW5jbHVkZSAiSGlkbFV0aWxzLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkhpZGxVdGlsczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OlV1aWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpJRWZmZWN0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6UmVzdWx0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgVjRfMCB7CisKK0VmZmVjdHNGYWN0b3J5SGFsSGlkbDo6RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCkgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiRWZmZWN0c0ZhY3RvcnkiKSB7CisgICAgbUVmZmVjdHNGYWN0b3J5ID0gSUVmZmVjdHNGYWN0b3J5OjpnZXRTZXJ2aWNlKCk7CisgICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb2J0YWluIElFZmZlY3RzRmFjdG9yeSBzZXJ2aWNlLCB0ZXJtaW5hdGluZyBwcm9jZXNzLiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KK30KKworRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjp+RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCkgeworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OnF1ZXJ5QWxsRGVzY3JpcHRvcnMoKSB7CisgICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Z2V0QWxsRGVzY3JpcHRvcnMoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPEVmZmVjdERlc2NyaXB0b3I+JiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBtTGFzdERlc2NyaXB0b3JzID0gcmVzdWx0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmIChyZXQuaXNPaygpKSB7CisgICAgICAgIHJldHVybiByZXR2YWwgPT0gUmVzdWx0OjpPSyA/IE9LIDogTk9fSU5JVDsKKyAgICB9CisgICAgbUxhc3REZXNjcmlwdG9ycy5yZXNpemUoMCk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OnF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpIHsKKyAgICBzdGF0dXNfdCBxdWVyeVJlc3VsdCA9IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKKyAgICBpZiAocXVlcnlSZXN1bHQgPT0gT0spIHsKKyAgICAgICAgKnBOdW1FZmZlY3RzID0gbUxhc3REZXNjcmlwdG9ycy5zaXplKCk7CisgICAgfQorICAgIHJldHVybiBxdWVyeVJlc3VsdDsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpnZXREZXNjcmlwdG9yKAorICAgICAgICB1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKKyAgICAvLyBUT0RPOiBXZSBuZWVkIHNvbWVob3cgdG8gdHJhY2sgdGhlIGNoYW5nZXMgb24gdGhlIHNlcnZlciBzaWRlCisgICAgLy8gb3IgZmlndXJlIG91dCBob3cgdG8gY29udmVydCBldmVyeWJvZHkgdG8gcXVlcnkgYWxsIHRoZSBkZXNjcmlwdG9ycyBhdCBvbmNlLgorICAgIC8vIFRPRE86IGNoZWNrIGZvciBudWxscHRyCisgICAgaWYgKG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgc3RhdHVzX3QgcXVlcnlSZXN1bHQgPSBxdWVyeUFsbERlc2NyaXB0b3JzKCk7CisgICAgICAgIGlmIChxdWVyeVJlc3VsdCAhPSBPSykgcmV0dXJuIHF1ZXJ5UmVzdWx0OworICAgIH0KKyAgICBpZiAoaW5kZXggPj0gbUxhc3REZXNjcmlwdG9ycy5zaXplKCkpIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwobUxhc3REZXNjcmlwdG9yc1tpbmRleF0sIHBEZXNjcmlwdG9yKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcigKKyAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CisgICAgLy8gVE9ETzogY2hlY2sgZm9yIG51bGxwdHIKKyAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOworICAgIFV1aWQgaGlkbFV1aWQ7CisgICAgSGlkbFV0aWxzOjp1dWlkRnJvbUhhbCgqcEVmZmVjdFV1aWQsICZoaWRsVXVpZCk7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmdldERlc2NyaXB0b3IoaGlkbFV1aWQsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbChyZXN1bHQsIHBEZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHJldHVybiBPSzsKKyAgICAgICAgZWxzZSBpZiAocmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFMpIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICAgICAgZWxzZSByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmNyZWF0ZUVmZmVjdCgKKyAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsCisgICAgICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gKmVmZmVjdCkgeworICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgVXVpZCBoaWRsVXVpZDsKKyAgICBIaWRsVXRpbHM6OnV1aWRGcm9tSGFsKCpwRWZmZWN0VXVpZCwgJmhpZGxVdWlkKTsKKyAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Y3JlYXRlRWZmZWN0KAorICAgICAgICAgICAgaGlkbFV1aWQsIHNlc3Npb25JZCwgaW9JZCwKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SUVmZmVjdD4mIHJlc3VsdCwgdWludDY0X3QgZWZmZWN0SWQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqZWZmZWN0ID0gbmV3IEVmZmVjdEhhbEhpZGwocmVzdWx0LCBlZmZlY3RJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKHJldC5pc09rKCkpIHsKKyAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7CisgICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpkdW1wRWZmZWN0cyhpbnQgZmQpIHsKKyAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOworICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOworICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5kZWJ1ZyhoaWRsSGFuZGxlLCB7fSAvKiBvcHRpb25zICovKTsKKyAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Cit9CisKK3N0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6YWxsb2NhdGVCdWZmZXIoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgeworICAgIHJldHVybiBFZmZlY3RCdWZmZXJIYWxIaWRsOjphbGxvY2F0ZShzaXplLCBidWZmZXIpOworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6Om1pcnJvckJ1ZmZlcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgeworICAgIHJldHVybiBFZmZlY3RCdWZmZXJIYWxIaWRsOjptaXJyb3IoZXh0ZXJuYWwsIHNpemUsIGJ1ZmZlcik7Cit9CisKKworfSAvLyBuYW1lc3BhY2UgVjRfMAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbEhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMmZkYjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsSGlkbC5jcHAKQEAgLTAsMCArMSw4MTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlN0cmVhbUhhbEhpZGwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JU3RyZWFtT3V0Q2FsbGJhY2suaD4KKyNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKKyNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCisjaW5jbHVkZSAiU3RyZWFtSGFsSGlkbC5oIgorI2luY2x1ZGUgIlZlcnNpb25VdGlscy5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb0NoYW5uZWxNYXNrOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Db250ZW50VHlwZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvRm9ybWF0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Tb3VyY2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb1VzYWdlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6VGhyZWFkSW5mbzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpBdWRpb0RyYWluOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklTdHJlYW1PdXRDYWxsYmFjazsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpNZXNzYWdlUXVldWVGbGFnQml0czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpNaWNyb3Bob25lSW5mbzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpNbWFwQnVmZmVySW5mbzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpNbWFwUG9zaXRpb247Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UGFyYW1ldGVyVmFsdWU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UGxheWJhY2tUcmFja01ldGFkYXRhOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlJlY29yZFRyYWNrTWV0YWRhdGE7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UmVzdWx0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlRpbWVTcGVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyBSZWFkQ29tbWFuZCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJU3RyZWFtSW46OlJlYWRDb21tYW5kOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgVjRfMCB7CisKK1N0cmVhbUhhbEhpZGw6OlN0cmVhbUhhbEhpZGwoSVN0cmVhbSAqc3RyZWFtKQorICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJTdHJlYW0iKSwKKyAgICAgICAgICBtU3RyZWFtKHN0cmVhbSksCisgICAgICAgICAgbUhhbFRocmVhZFByaW9yaXR5KEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCksCisgICAgICAgICAgbUNhY2hlZEJ1ZmZlclNpemUoMCl7CisKKyAgICAvLyBJbnN0cnVtZW50IGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgorICAgIC8vIE5vdGU6IFRoaXMgYXNzdW1lcyBjaGFubmVsIG1hc2ssIGZvcm1hdCwgYW5kIHNhbXBsZSByYXRlIGRvIG5vdCBjaGFuZ2UgYWZ0ZXIgY3JlYXRpb24uCisgICAgaWYgKG1TdHJlYW0gIT0gbnVsbHB0ciAmJiBtU3RyZWFtUG93ZXJMb2cuaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkpIHsKKyAgICAgICAgLy8gT2J0YWluIGF1ZGlvIHByb3BlcnRpZXMgKHNlZSBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoKSBiZWxvdykuCisgICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRBdWRpb1Byb3BlcnRpZXMoCisgICAgICAgICAgICAgICAgWyZdKGF1dG8gc3IsIGF1dG8gbSwgYXV0byBmKSB7CisgICAgICAgICAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmluaXQoc3IsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4obSksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4oZikpOworICAgICAgICAgICAgfSk7CisgICAgfQorfQorCitTdHJlYW1IYWxIaWRsOjp+U3RyZWFtSGFsSGlkbCgpIHsKKyAgICBtU3RyZWFtID0gbnVsbHB0cjsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFNhbXBsZVJhdGUiLCBtU3RyZWFtLT5nZXRTYW1wbGVSYXRlKCksIHJhdGUpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcHJvY2Vzc1JldHVybigiZ2V0QnVmZmVyU2l6ZSIsIG1TdHJlYW0tPmdldEJ1ZmZlclNpemUoKSwgc2l6ZSk7CisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICBtQ2FjaGVkQnVmZmVyU2l6ZSA9ICpzaXplOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaykgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldENoYW5uZWxNYXNrIiwgbVN0cmVhbS0+Z2V0Q2hhbm5lbE1hc2soKSwgbWFzayk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Rm9ybWF0IiwgbVN0cmVhbS0+Z2V0Rm9ybWF0KCksIGZvcm1hdCk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKAorICAgICAgICAgICAgWyZdKHVpbnQzMl90IHNyLCBhdXRvIG0sIGF1dG8gZikgeworICAgICAgICAgICAgICAgICpzYW1wbGVSYXRlID0gc3I7CisgICAgICAgICAgICAgICAgKm1hc2sgPSBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4obSk7CisgICAgICAgICAgICAgICAgKmZvcm1hdCA9IHN0YXRpY19jYXN0PGF1ZGlvX2Zvcm1hdF90PihmKTsKKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRBdWRpb1Byb3BlcnRpZXMiLCByZXQpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBoaWRsUGFyYW1zOworICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtZXRlcnNGcm9tSGFsKGt2UGFpcnMsICZoaWRsUGFyYW1zKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRQYXJhbWV0ZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsczo6c2V0UGFyYW1ldGVycyhtU3RyZWFtLCBoaWRsUGFyYW1zLCB7fSAvKiBvcHRpb25zICovKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7CisgICAgdmFsdWVzLT5jbGVhcigpOworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGhpZGxLZXlzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGtleXNGcm9tSGFsKGtleXMsICZoaWRsS2V5cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSB1dGlsczo6Z2V0UGFyYW1ldGVycygKKyAgICAgICAgICAgIG1TdHJlYW0sCisgICAgICAgICAgICB7fSAvKiBjb250ZXh0ICovLAorICAgICAgICAgICAgaGlkbEtleXMsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNUb0hhbChwYXJhbWV0ZXJzLCB2YWx1ZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRQYXJhbWV0ZXJzIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjphZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJhZGRFZmZlY3QiLCBtU3RyZWFtLT5hZGRFZmZlY3QoCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEhhbEhpZGwqPihlZmZlY3QuZ2V0KCkpLT5lZmZlY3RJZCgpKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OnJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInJlbW92ZUVmZmVjdCIsIG1TdHJlYW0tPnJlbW92ZUVmZmVjdCgKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0SGFsSGlkbCo+KGVmZmVjdC5nZXQoKSktPmVmZmVjdElkKCkpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RhbmRieSgpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdGFuZGJ5IiwgbVN0cmVhbS0+c3RhbmRieSgpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6ZHVtcChpbnQgZmQpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOworICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+ZGVidWcoaGlkbEhhbmRsZSwge30gLyogb3B0aW9ucyAqLyk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJkdW1wIiwgcmV0KTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RhcnQoKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RhcnQiLCBtU3RyZWFtLT5zdGFydCgpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RvcCgpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdG9wIiwgbVN0cmVhbS0+c3RvcCgpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5jcmVhdGVNbWFwQnVmZmVyKAorICAgICAgICAgICAgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTW1hcEJ1ZmZlckluZm8mIGhpZGxJbmZvKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZSAqaGFuZGxlID0gaGlkbEluZm8uc2hhcmVkTWVtb3J5LmhhbmRsZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlLT5udW1GZHMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zaGFyZWRfbWVtb3J5X2ZkID0gaGFuZGxlLT5kYXRhWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVmZmVyX3NpemVfZnJhbWVzID0gaGlkbEluZm8uYnVmZmVyU2l6ZUZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1cnN0X3NpemVfZnJhbWVzID0gaGlkbEluZm8uYnVyc3RTaXplRnJhbWVzOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5mby0+c2hhcmVkX21lbW9yeV9hZGRyZXNzIGlzIG5vdCBuZWVkZWQgaW4gSElETCBjb250ZXh0CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zaGFyZWRfbWVtb3J5X2FkZHJlc3MgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiY3JlYXRlTW1hcEJ1ZmZlciIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgeworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldE1tYXBQb3NpdGlvbigKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTW1hcFBvc2l0aW9uJiBoaWRsUG9zaXRpb24pIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi0+dGltZV9uYW5vc2Vjb25kcyA9IGhpZGxQb3NpdGlvbi50aW1lTmFub3NlY29uZHM7CisgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLT5wb3NpdGlvbl9mcmFtZXMgPSBoaWRsUG9zaXRpb24ucG9zaXRpb25GcmFtZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1tYXBQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KSB7CisgICAgbUhhbFRocmVhZFByaW9yaXR5ID0gcHJpb3JpdHk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRDYWNoZWRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgeworICAgIGlmIChtQ2FjaGVkQnVmZmVyU2l6ZSAhPSAwKSB7CisgICAgICAgICpzaXplID0gbUNhY2hlZEJ1ZmZlclNpemU7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgcmV0dXJuIGdldEJ1ZmZlclNpemUoc2l6ZSk7Cit9CisKK2Jvb2wgU3RyZWFtSGFsSGlkbDo6cmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KHBpZF90IHRocmVhZFBpZCwgcGlkX3QgdGhyZWFkSWQpIHsKKyAgICBpZiAobUhhbFRocmVhZFByaW9yaXR5ID09IEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaW50IGVyciA9IHJlcXVlc3RQcmlvcml0eSgKKyAgICAgICAgICAgIHRocmVhZFBpZCwgdGhyZWFkSWQsCisgICAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHksIGZhbHNlIC8qaXNGb3JBcHAqLywgdHJ1ZSAvKmFzeW5jaHJvbm91cyovKTsKKyAgICBBTE9HRV9JRihlcnIsICJmYWlsZWQgdG8gc2V0IHByaW9yaXR5ICVkIGZvciBwaWQgJWQgdGlkICVkOyBlcnJvciAlZCIsCisgICAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHksIHRocmVhZFBpZCwgdGhyZWFkSWQsIGVycik7CisgICAgLy8gQXVkaW8gd2lsbCBzdGlsbCB3b3JrLCBidXQgbGF0ZW5jeSB3aWxsIGJlIGhpZ2hlciBhbmQgc29tZXRpbWVzIHVuYWNjZXB0YWJsZS4KKyAgICByZXR1cm4gZXJyID09IDA7Cit9CisKK25hbWVzcGFjZSB7CisKKy8qIE5vdGVzIG9uIGNhbGxiYWNrIG93bmVyc2hpcC4KKworVGhpcyBpcyBob3cgKEh3KUJpbmRlciBvd25lcnNoaXAgbW9kZWwgbG9va3MgbGlrZS4gVGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgoraXMgb3duZWQgYnkgQmluZGVyIGZyYW1ld29yayAodmlhIHNwPD4pLiBQcm94aWVzIGFyZSBvd25lZCBieSBjbGllbnRzLgorV2hlbiB0aGUgbGFzdCBwcm94eSBkaXNhcHBlYXJzLCBCaW5kZXIgZnJhbWV3b3JrIHJlbGVhc2VzIHRoZSBzZXJ2ZXIgaW1wbC4KKworVGh1cywgaXQgaXMgbm90IG5lZWRlZCB0byBrZWVwIGFueSByZWZlcmVuY2VzIHRvIFN0cmVhbU91dENhbGxiYWNrICh0aGlzIGlzCit0aGUgc2VydmVyIGltcGwpIC0tIGl0IHdpbGwgbGl2ZSBhcyBsb25nIGFzIEhBTCBzZXJ2ZXIgaG9sZHMgYSBzdHJvbmcgcmVmIHRvCitJU3RyZWFtT3V0Q2FsbGJhY2sgcHJveHkuIFdlIGNsZWFyIHRoYXQgcmVmZXJlbmNlIGJ5IGNhbGxpbmcgJ2NsZWFyQ2FsbGJhY2snCitmcm9tIHRoZSBkZXN0cnVjdG9yIG9mIFN0cmVhbU91dEhhbEhpZGwuCisKK1RoZSBjYWxsYmFjayBvbmx5IGtlZXBzIGEgd2VhayByZWZlcmVuY2UgdG8gdGhlIHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBvd25lZAorYnkgQXVkaW9GbGluZ2VyLgorCisqLworCitzdHJ1Y3QgU3RyZWFtT3V0Q2FsbGJhY2sgOiBwdWJsaWMgSVN0cmVhbU91dENhbGxiYWNrIHsKKyAgICBTdHJlYW1PdXRDYWxsYmFjayhjb25zdCB3cDxTdHJlYW1PdXRIYWxIaWRsPiYgc3RyZWFtKSA6IG1TdHJlYW0oc3RyZWFtKSB7fQorCisgICAgLy8gSVN0cmVhbU91dENhbGxiYWNrIGltcGxlbWVudGF0aW9uCisgICAgUmV0dXJuPHZvaWQ+IG9uV3JpdGVSZWFkeSgpICBvdmVycmlkZSB7CisgICAgICAgIHNwPFN0cmVhbU91dEhhbEhpZGw+IHN0cmVhbSA9IG1TdHJlYW0ucHJvbW90ZSgpOworICAgICAgICBpZiAoc3RyZWFtICE9IDApIHsKKyAgICAgICAgICAgIHN0cmVhbS0+b25Xcml0ZVJlYWR5KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gb25EcmFpblJlYWR5KCkgIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChzdHJlYW0gIT0gMCkgeworICAgICAgICAgICAgc3RyZWFtLT5vbkRyYWluUmVhZHkoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIFJldHVybjx2b2lkPiBvbkVycm9yKCkgIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChzdHJlYW0gIT0gMCkgeworICAgICAgICAgICAgc3RyZWFtLT5vbkVycm9yKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB3cDxTdHJlYW1PdXRIYWxIaWRsPiBtU3RyZWFtOworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK1N0cmVhbU91dEhhbEhpZGw6OlN0cmVhbU91dEhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbU91dD4mIHN0cmVhbSkKKyAgICAgICAgOiBTdHJlYW1IYWxIaWRsKHN0cmVhbS5nZXQoKSksIG1TdHJlYW0oc3RyZWFtKSwgbVdyaXRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgeworfQorCitTdHJlYW1PdXRIYWxIaWRsOjp+U3RyZWFtT3V0SGFsSGlkbCgpIHsKKyAgICBpZiAobVN0cmVhbSAhPSAwKSB7CisgICAgICAgIGlmIChtQ2FsbGJhY2sudW5zYWZlX2dldCgpKSB7CisgICAgICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbGVhckNhbGxiYWNrIiwgbVN0cmVhbS0+Y2xlYXJDYWxsYmFjaygpKTsKKyAgICAgICAgfQorICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbG9zZSIsIG1TdHJlYW0tPmNsb3NlKCkpOworICAgICAgICBtU3RyZWFtLmNsZWFyKCk7CisgICAgfQorICAgIG1DYWxsYmFjay5jbGVhcigpOworICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisgICAgaWYgKG1FZkdyb3VwKSB7CisgICAgICAgIEV2ZW50RmxhZzo6ZGVsZXRlRXZlbnRGbGFnKCZtRWZHcm91cCk7CisgICAgfQorfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZyYW1lU2l6ZSIsIG1TdHJlYW0tPmdldEZyYW1lU2l6ZSgpLCBzaXplKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIGlmIChtV3JpdGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKKyAgICAgICAgcmV0dXJuIGNhbGxXcml0ZXJUaHJlYWQoCisgICAgICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpHRVRfTEFURU5DWSwgImdldExhdGVuY3kiLCBudWxscHRyLCAwLAorICAgICAgICAgICAgICAgIFsmXShjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgKmxhdGVuY3kgPSB3cml0ZVN0YXR1cy5yZXBseS5sYXRlbmN5TXM7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldExhdGVuY3kiLCBtU3RyZWFtLT5nZXRMYXRlbmN5KCksIGxhdGVuY3kpOworICAgIH0KK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFZvbHVtZSIsIG1TdHJlYW0tPnNldFZvbHVtZShsZWZ0LCByaWdodCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgKndyaXR0ZW4gPSAwOworCisgICAgaWYgKGJ5dGVzID09IDAgJiYgIW1EYXRhTVEpIHsKKyAgICAgICAgLy8gQ2FuJ3QgZGV0ZXJtaW5lIHRoZSBzaXplIGZvciB0aGUgTVEgYnVmZmVyLiBXYWl0IGZvciBhIG5vbi1lbXB0eSB3cml0ZSByZXF1ZXN0LgorICAgICAgICBBTE9HV19JRihtQ2FsbGJhY2sudW5zYWZlX2dldCgpLCAiRmlyc3QgY2FsbCB0byBhc3luYyB3cml0ZSB3aXRoIDAgYnl0ZXMiKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAoIW1EYXRhTVEpIHsKKyAgICAgICAgLy8gSW4gY2FzZSBpZiBwbGF5YmFjayBzdGFydHMgY2xvc2UgdG8gdGhlIGVuZCBvZiBhIGNvbXByZXNzZWQgdHJhY2ssIHRoZSBieXRlcworICAgICAgICAvLyB0aGF0IG5lZWQgdG8gYmUgd3JpdHRlbiBpcyBsZXNzIHRoYW4gdGhlIGFjdHVhbCBidWZmZXIgc2l6ZS4gTmVlZCB0byB1c2UKKyAgICAgICAgLy8gZnVsbCBidWZmZXIgc2l6ZSBmb3IgdGhlIE1RIHNpbmNlIG90aGVyd2lzZSBhZnRlciBzZWVraW5nIGJhY2sgdG8gdGhlIG1pZGRsZQorICAgICAgICAvLyBkYXRhIHdpbGwgYmUgdHJ1bmNhdGVkLgorICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZTsKKyAgICAgICAgaWYgKChzdGF0dXMgPSBnZXRDYWNoZWRCdWZmZXJTaXplKCZidWZmZXJTaXplKSkgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ5dGVzID4gYnVmZmVyU2l6ZSkgYnVmZmVyU2l6ZSA9IGJ5dGVzOworICAgICAgICBpZiAoKHN0YXR1cyA9IHByZXBhcmVGb3JXcml0aW5nKGJ1ZmZlclNpemUpKSAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXR1cyA9IGNhbGxXcml0ZXJUaHJlYWQoCisgICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OldSSVRFLCAid3JpdGUiLCBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90Kj4oYnVmZmVyKSwgYnl0ZXMsCisgICAgICAgICAgICBbJl0gKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgeworICAgICAgICAgICAgICAgICp3cml0dGVuID0gd3JpdGVTdGF0dXMucmVwbHkud3JpdHRlbjsKKyAgICAgICAgICAgICAgICAvLyBEaWFnbm9zdGljcyBvZiB0aGUgY2F1c2Ugb2YgYi8zNTgxMzExMy4KKyAgICAgICAgICAgICAgICBBTE9HRV9JRigqd3JpdHRlbiA+IGJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgImhhbCByZXBvcnRzIG1vcmUgYnl0ZXMgd3JpdHRlbiB0aGFuIGFza2VkIGZvcjogJWxsZCA+ICVsbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykqd3JpdHRlbiwgKGxvbmcgbG9uZylieXRlcyk7CisgICAgICAgICAgICB9KTsKKyAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKndyaXR0ZW4pOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmNhbGxXcml0ZXJUaHJlYWQoCisgICAgICAgIFdyaXRlQ29tbWFuZCBjbWQsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhU2l6ZSwgU3RyZWFtT3V0SGFsSGlkbDo6V3JpdGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICBpZiAoIW1Db21tYW5kTVEtPndyaXRlKCZjbWQpKSB7CisgICAgICAgIEFMT0dFKCJjb21tYW5kIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKKyAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgfQorICAgIGlmIChkYXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgc2l6ZV90IGF2YWlsYWJsZVRvV3JpdGUgPSBtRGF0YU1RLT5hdmFpbGFibGVUb1dyaXRlKCk7CisgICAgICAgIGlmIChkYXRhU2l6ZSA+IGF2YWlsYWJsZVRvV3JpdGUpIHsKKyAgICAgICAgICAgIEFMT0dXKCJ0cnVuY2F0aW5nIHdyaXRlIGRhdGEgZnJvbSAlbGxkIHRvICVsbGQgZHVlIHRvIGluc3VmZmljaWVudCBkYXRhIHF1ZXVlIHNwYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylkYXRhU2l6ZSwgKGxvbmcgbG9uZylhdmFpbGFibGVUb1dyaXRlKTsKKyAgICAgICAgICAgIGRhdGFTaXplID0gYXZhaWxhYmxlVG9Xcml0ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1EYXRhTVEtPndyaXRlKGRhdGEsIGRhdGFTaXplKSkgeworICAgICAgICAgICAgQUxPR0UoImRhdGEgbWVzc2FnZSBxdWV1ZSB3cml0ZSBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOworICAgICAgICB9CisgICAgfQorICAgIG1FZkdyb3VwLT53YWtlKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0VNUFRZKSk7CisKKyAgICAvLyBUT0RPOiBSZW1vdmUgbWFudWFsIGV2ZW50IGZsYWcgaGFuZGxpbmcgb25jZSBibG9ja2luZyBNUSBpcyBpbXBsZW1lbnRlZC4gYi8zMzgxNTQyMgorICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOworcmV0cnk6CisgICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRlVMTCksICZlZlN0YXRlKTsKKyAgICBpZiAoZWZTdGF0ZSAmIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0ZVTEwpKSB7CisgICAgICAgIFdyaXRlU3RhdHVzIHdyaXRlU3RhdHVzOworICAgICAgICB3cml0ZVN0YXR1cy5yZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICAgICAgaWYgKCFtU3RhdHVzTVEtPnJlYWQoJndyaXRlU3RhdHVzKSkgeworICAgICAgICAgICAgQUxPR0UoInN0YXR1cyBtZXNzYWdlIHJlYWQgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAod3JpdGVTdGF0dXMucmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgIHJldCA9IE9LOworICAgICAgICAgICAgY2FsbGJhY2sod3JpdGVTdGF0dXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc1JldHVybihjbWROYW1lLCB3cml0ZVN0YXR1cy5yZXR2YWwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gLUVJTlRSKSB7CisgICAgICAgIC8vIFNwdXJpb3VzIHdha2V1cC4gVGhpcyBub3JtYWxseSByZXRyaWVzIG5vIG1vcmUgdGhhbiBvbmNlLgorICAgICAgICBnb3RvIHJldHJ5OworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpwcmVwYXJlRm9yV3JpdGluZyhzaXplX3QgYnVmZmVyU2l6ZSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IHRlbXBDb21tYW5kTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gdGVtcERhdGFNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IHRlbXBTdGF0dXNNUTsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIHBpZF90IGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5wcmVwYXJlRm9yV3JpdGluZygKKyAgICAgICAgICAgIDEsIGJ1ZmZlclNpemUsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbW1hbmRNUTo6RGVzY3JpcHRvciYgY29tbWFuZE1RLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTVE6OkRlc2NyaXB0b3ImIGRhdGFNUSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdHVzTVE6OkRlc2NyaXB0b3ImIHN0YXR1c01RLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJlYWRJbmZvJiBoYWxUaHJlYWRJbmZvKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcENvbW1hbmRNUS5yZXNldChuZXcgQ29tbWFuZE1RKGNvbW1hbmRNUSkpOworICAgICAgICAgICAgICAgICAgICB0ZW1wRGF0YU1RLnJlc2V0KG5ldyBEYXRhTVEoZGF0YU1RKSk7CisgICAgICAgICAgICAgICAgICAgIHRlbXBTdGF0dXNNUS5yZXNldChuZXcgU3RhdHVzTVEoc3RhdHVzTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBEYXRhTVEtPmlzVmFsaWQoKSAmJiB0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50RmxhZzo6Y3JlYXRlRXZlbnRGbGFnKHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSwgJm1FZkdyb3VwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRQaWQgPSBoYWxUaHJlYWRJbmZvLnBpZDsKKyAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkVGlkID0gaGFsVGhyZWFkSW5mby50aWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCFyZXQuaXNPaygpIHx8IHJldHZhbCAhPSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwcmVwYXJlRm9yV3JpdGluZyIsIHJldCwgcmV0dmFsKTsKKyAgICB9CisgICAgaWYgKCF0ZW1wQ29tbWFuZE1RIHx8ICF0ZW1wQ29tbWFuZE1RLT5pc1ZhbGlkKCkgfHwKKyAgICAgICAgICAgICF0ZW1wRGF0YU1RIHx8ICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgfHwKKyAgICAgICAgICAgICF0ZW1wU3RhdHVzTVEgfHwgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpIHx8CisgICAgICAgICAgICAhbUVmR3JvdXApIHsKKyAgICAgICAgQUxPR0VfSUYoIXRlbXBDb21tYW5kTVEsICJGYWlsZWQgdG8gb2J0YWluIGNvbW1hbmQgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOworICAgICAgICBBTE9HRV9JRih0ZW1wQ29tbWFuZE1RICYmICF0ZW1wQ29tbWFuZE1RLT5pc1ZhbGlkKCksCisgICAgICAgICAgICAgICAgIkNvbW1hbmQgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wRGF0YU1RLCAiRmFpbGVkIHRvIG9idGFpbiBkYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKKyAgICAgICAgQUxPR0VfSUYodGVtcERhdGFNUSAmJiAhdGVtcERhdGFNUS0+aXNWYWxpZCgpLCAiRGF0YSBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0VfSUYoIXRlbXBTdGF0dXNNUSwgIkZhaWxlZCB0byBvYnRhaW4gc3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKKyAgICAgICAgQUxPR0VfSUYodGVtcFN0YXR1c01RICYmICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSwKKyAgICAgICAgICAgICAgICAiU3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOworICAgICAgICBBTE9HRV9JRighbUVmR3JvdXAsICJFdmVudCBmbGFnIGNyZWF0aW9uIGZvciB3cml0aW5nIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkKTsKKworICAgIG1Db21tYW5kTVEgPSBzdGQ6Om1vdmUodGVtcENvbW1hbmRNUSk7CisgICAgbURhdGFNUSA9IHN0ZDo6bW92ZSh0ZW1wRGF0YU1RKTsKKyAgICBtU3RhdHVzTVEgPSBzdGQ6Om1vdmUodGVtcFN0YXR1c01RKTsKKyAgICBtV3JpdGVyQ2xpZW50ID0gZ2V0dGlkKCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0UmVuZGVyUG9zaXRpb24oCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQzMl90IGQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqZHNwRnJhbWVzID0gZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UmVuZGVyUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXROZXh0V3JpdGVUaW1lc3RhbXAoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGludDY0X3QgdCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICp0aW1lc3RhbXAgPSB0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRSZW5kZXJQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcHJvY2Vzc1JldHVybigKKyAgICAgICAgICAgICJzZXRDYWxsYmFjayIsIG1TdHJlYW0tPnNldENhbGxiYWNrKG5ldyBTdHJlYW1PdXRDYWxsYmFjayh0aGlzKSkpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+c3VwcG9ydHNQYXVzZUFuZFJlc3VtZSgKKyAgICAgICAgICAgIFsmXShib29sIHAsIGJvb2wgcikgeworICAgICAgICAgICAgICAgICpzdXBwb3J0c1BhdXNlID0gcDsKKyAgICAgICAgICAgICAgICAqc3VwcG9ydHNSZXN1bWUgPSByOworICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzUGF1c2VBbmRSZXN1bWUiLCByZXQpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpwYXVzZSgpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5wYXVzZSgpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cmVzdW1lKCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPnJlc3VtZSgpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzRHJhaW4iLCBtU3RyZWFtLT5zdXBwb3J0c0RyYWluKCksIHN1cHBvcnRzRHJhaW4pOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpkcmFpbihib29sIGVhcmx5Tm90aWZ5KSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oCisgICAgICAgICAgICAiZHJhaW4iLCBtU3RyZWFtLT5kcmFpbihlYXJseU5vdGlmeSA/IEF1ZGlvRHJhaW46OkVBUkxZX05PVElGWSA6IEF1ZGlvRHJhaW46OkFMTCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpmbHVzaCgpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5mbHVzaCgpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBpZiAobVdyaXRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7CisgICAgICAgIHJldHVybiBjYWxsV3JpdGVyVGhyZWFkKAorICAgICAgICAgICAgICAgIFdyaXRlQ29tbWFuZDo6R0VUX1BSRVNFTlRBVElPTl9QT1NJVElPTiwgImdldFByZXNlbnRhdGlvblBvc2l0aW9uIiwgbnVsbHB0ciwgMCwKKyAgICAgICAgICAgICAgICBbJl0oY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSB3cml0ZVN0YXR1cy5yZXBseS5wcmVzZW50YXRpb25Qb3NpdGlvbi5mcmFtZXM7CisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfc2VjID0gd3JpdGVTdGF0dXMucmVwbHkucHJlc2VudGF0aW9uUG9zaXRpb24udGltZVN0YW1wLnR2U2VjOworICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X25zZWMgPSB3cml0ZVN0YXR1cy5yZXBseS5wcmVzZW50YXRpb25Qb3NpdGlvbi50aW1lU3RhbXAudHZOU2VjOworICAgICAgICAgICAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICAgIFJlc3VsdCByZXR2YWw7CisgICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRQcmVzZW50YXRpb25Qb3NpdGlvbigKKyAgICAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGhpZGxGcmFtZXMsIGNvbnN0IFRpbWVTcGVjJiBoaWRsVGltZVN0YW1wKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IGhpZGxGcmFtZXM7CisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X3NlYyA9IGhpZGxUaW1lU3RhbXAudHZTZWM7CisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X25zZWMgPSBoaWRsVGltZVN0YW1wLnR2TlNlYzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24iLCByZXQsIHJldHZhbCk7CisgICAgfQorfQorCisvKiogVHJhbnNmb3JtIGEgc3RhbmRhcmQgY29sbGVjdGlvbiB0byBhbiBISURMIHZlY3Rvci4gKi8KK3RlbXBsYXRlIDxjbGFzcyBWYWx1ZXMsIGNsYXNzIEVsZW1lbnRDb252ZXJ0ZXI+CitzdGF0aWMgYXV0byB0cmFuc2Zvcm1Ub0hpZGxWZWMoY29uc3QgVmFsdWVzJiB2YWx1ZXMsIEVsZW1lbnRDb252ZXJ0ZXIgY29udmVydGVyKSB7CisgICAgaGlkbF92ZWM8ZGVjbHR5cGUoY29udmVydGVyKCp2YWx1ZXMuYmVnaW4oKSkpPiByZXN1bHR7dmFsdWVzLnNpemUoKX07CisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyAgICB0cmFuc2Zvcm0oYmVnaW4odmFsdWVzKSwgZW5kKHZhbHVlcyksIGJlZ2luKHJlc3VsdCksIGNvbnZlcnRlcik7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6dXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSB7CisgICAgaGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpTb3VyY2VNZXRhZGF0YSBoYWxNZXRhZGF0YSA9IHsKKyAgICAgICAgLnRyYWNrcyA9IHRyYW5zZm9ybVRvSGlkbFZlYyhzb3VyY2VNZXRhZGF0YS50cmFja3MsCisgICAgICAgICAgICAgIFtdKGNvbnN0IHBsYXliYWNrX3RyYWNrX21ldGFkYXRhJiBtZXRhZGF0YSkgLT4gUGxheWJhY2tUcmFja01ldGFkYXRhIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAgICAgICAgIC51c2FnZT1zdGF0aWNfY2FzdDxBdWRpb1VzYWdlPihtZXRhZGF0YS51c2FnZSksCisgICAgICAgICAgICAgICAgICAgIC5jb250ZW50VHlwZT1zdGF0aWNfY2FzdDxBdWRpb0NvbnRlbnRUeXBlPihtZXRhZGF0YS5jb250ZW50X3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAuZ2Fpbj1tZXRhZGF0YS5nYWluLAorICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgfSl9OworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJ1cGRhdGVTb3VyY2VNZXRhZGF0YSIsIG1TdHJlYW0tPnVwZGF0ZVNvdXJjZU1ldGFkYXRhKGhhbE1ldGFkYXRhKSk7Cit9CisKK3ZvaWQgU3RyZWFtT3V0SGFsSGlkbDo6b25Xcml0ZVJlYWR5KCkgeworICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7CisgICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybjsKKyAgICBBTE9HVigiYXN5bmNDYWxsYmFjayBvbldyaXRlUmVhZHkiKTsKKyAgICBjYWxsYmFjay0+b25Xcml0ZVJlYWR5KCk7Cit9CisKK3ZvaWQgU3RyZWFtT3V0SGFsSGlkbDo6b25EcmFpblJlYWR5KCkgeworICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7CisgICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybjsKKyAgICBBTE9HVigiYXN5bmNDYWxsYmFjayBvbkRyYWluUmVhZHkiKTsKKyAgICBjYWxsYmFjay0+b25EcmFpblJlYWR5KCk7Cit9CisKK3ZvaWQgU3RyZWFtT3V0SGFsSGlkbDo6b25FcnJvcigpIHsKKyAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOworICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47CisgICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25FcnJvciIpOworICAgIGNhbGxiYWNrLT5vbkVycm9yKCk7Cit9CisKKworU3RyZWFtSW5IYWxIaWRsOjpTdHJlYW1JbkhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbUluPiYgc3RyZWFtKQorICAgICAgICA6IFN0cmVhbUhhbEhpZGwoc3RyZWFtLmdldCgpKSwgbVN0cmVhbShzdHJlYW0pLCBtUmVhZGVyQ2xpZW50KDApLCBtRWZHcm91cChudWxscHRyKSB7Cit9CisKK1N0cmVhbUluSGFsSGlkbDo6flN0cmVhbUluSGFsSGlkbCgpIHsKKyAgICBpZiAobVN0cmVhbSAhPSAwKSB7CisgICAgICAgIHByb2Nlc3NSZXR1cm4oImNsb3NlIiwgbVN0cmVhbS0+Y2xvc2UoKSk7CisgICAgICAgIG1TdHJlYW0uY2xlYXIoKTsKKyAgICAgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKyAgICB9CisgICAgaWYgKG1FZkdyb3VwKSB7CisgICAgICAgIEV2ZW50RmxhZzo6ZGVsZXRlRXZlbnRGbGFnKCZtRWZHcm91cCk7CisgICAgfQorfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0RnJhbWVTaXplIiwgbVN0cmVhbS0+Z2V0RnJhbWVTaXplKCksIHNpemUpOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnNldEdhaW4oZmxvYXQgZ2FpbikgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRHYWluIiwgbVN0cmVhbS0+c2V0R2FpbihnYWluKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6cmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgKnJlYWQgPSAwOworCisgICAgaWYgKGJ5dGVzID09IDAgJiYgIW1EYXRhTVEpIHsKKyAgICAgICAgLy8gQ2FuJ3QgZGV0ZXJtaW5lIHRoZSBzaXplIGZvciB0aGUgTVEgYnVmZmVyLiBXYWl0IGZvciBhIG5vbi1lbXB0eSByZWFkIHJlcXVlc3QuCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKCFtRGF0YU1RICYmIChzdGF0dXMgPSBwcmVwYXJlRm9yUmVhZGluZyhieXRlcykpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgUmVhZFBhcmFtZXRlcnMgcGFyYW1zOworICAgIHBhcmFtcy5jb21tYW5kID0gUmVhZENvbW1hbmQ6OlJFQUQ7CisgICAgcGFyYW1zLnBhcmFtcy5yZWFkID0gYnl0ZXM7CisgICAgc3RhdHVzID0gY2FsbFJlYWRlclRocmVhZChwYXJhbXMsICJyZWFkIiwKKyAgICAgICAgICAgIFsmXShjb25zdCBSZWFkU3RhdHVzJiByZWFkU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGF2YWlsVG9SZWFkID0gbURhdGFNUS0+YXZhaWxhYmxlVG9SZWFkKCk7CisgICAgICAgICAgICAgICAgaWYgKCFtRGF0YU1RLT5yZWFkKHN0YXRpY19jYXN0PHVpbnQ4X3QqPihidWZmZXIpLCBzdGQ6Om1pbihieXRlcywgYXZhaWxUb1JlYWQpKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZGF0YSBtZXNzYWdlIHF1ZXVlIHJlYWQgZmFpbGVkIGZvciBcInJlYWRcIiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HV19JRihhdmFpbFRvUmVhZCAhPSByZWFkU3RhdHVzLnJlcGx5LnJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAiSEFMIHJlYWQgcmVwb3J0IGluY29uc2lzdGVudDogbXEgPSAlZCwgc3RhdHVzID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpYXZhaWxUb1JlYWQsIChpbnQzMl90KXJlYWRTdGF0dXMucmVwbHkucmVhZCk7CisgICAgICAgICAgICAgICAgKnJlYWQgPSByZWFkU3RhdHVzLnJlcGx5LnJlYWQ7CisgICAgICAgICAgICB9KTsKKyAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKnJlYWQpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Y2FsbFJlYWRlclRocmVhZCgKKyAgICAgICAgY29uc3QgUmVhZFBhcmFtZXRlcnMmIHBhcmFtcywgY29uc3QgY2hhciogY21kTmFtZSwKKyAgICAgICAgU3RyZWFtSW5IYWxIaWRsOjpSZWFkZXJDYWxsYmFjayBjYWxsYmFjaykgeworICAgIGlmICghbUNvbW1hbmRNUS0+d3JpdGUoJnBhcmFtcykpIHsKKyAgICAgICAgQUxPR1coImNvbW1hbmQgbWVzc2FnZSBxdWV1ZSB3cml0ZSBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgfQorICAgIG1FZkdyb3VwLT53YWtlKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0ZVTEwpKTsKKworICAgIC8vIFRPRE86IFJlbW92ZSBtYW51YWwgZXZlbnQgZmxhZyBoYW5kbGluZyBvbmNlIGJsb2NraW5nIE1RIGlzIGltcGxlbWVudGVkLiBiLzMzODE1NDIyCisgICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7CityZXRyeToKKyAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSksICZlZlN0YXRlKTsKKyAgICBpZiAoZWZTdGF0ZSAmIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0VNUFRZKSkgeworICAgICAgICBSZWFkU3RhdHVzIHJlYWRTdGF0dXM7CisgICAgICAgIHJlYWRTdGF0dXMucmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgICAgIGlmICghbVN0YXR1c01RLT5yZWFkKCZyZWFkU3RhdHVzKSkgeworICAgICAgICAgICAgQUxPR0UoInN0YXR1cyBtZXNzYWdlIHJlYWQgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKKyAgICAgICAgfQorICAgICAgICAgaWYgKHJlYWRTdGF0dXMucmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgIHJldCA9IE9LOworICAgICAgICAgICAgY2FsbGJhY2socmVhZFN0YXR1cyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBwcm9jZXNzUmV0dXJuKGNtZE5hbWUsIHJlYWRTdGF0dXMucmV0dmFsKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FSU5UUikgeworICAgICAgICAvLyBTcHVyaW91cyB3YWtldXAuIFRoaXMgbm9ybWFsbHkgcmV0cmllcyBubyBtb3JlIHRoYW4gb25jZS4KKyAgICAgICAgZ290byByZXRyeTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpwcmVwYXJlRm9yUmVhZGluZyhzaXplX3QgYnVmZmVyU2l6ZSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IHRlbXBDb21tYW5kTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gdGVtcERhdGFNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IHRlbXBTdGF0dXNNUTsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIHBpZF90IGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5wcmVwYXJlRm9yUmVhZGluZygKKyAgICAgICAgICAgIDEsIGJ1ZmZlclNpemUsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbW1hbmRNUTo6RGVzY3JpcHRvciYgY29tbWFuZE1RLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTVE6OkRlc2NyaXB0b3ImIGRhdGFNUSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdHVzTVE6OkRlc2NyaXB0b3ImIHN0YXR1c01RLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJlYWRJbmZvJiBoYWxUaHJlYWRJbmZvKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcENvbW1hbmRNUS5yZXNldChuZXcgQ29tbWFuZE1RKGNvbW1hbmRNUSkpOworICAgICAgICAgICAgICAgICAgICB0ZW1wRGF0YU1RLnJlc2V0KG5ldyBEYXRhTVEoZGF0YU1RKSk7CisgICAgICAgICAgICAgICAgICAgIHRlbXBTdGF0dXNNUS5yZXNldChuZXcgU3RhdHVzTVEoc3RhdHVzTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBEYXRhTVEtPmlzVmFsaWQoKSAmJiB0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50RmxhZzo6Y3JlYXRlRXZlbnRGbGFnKHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSwgJm1FZkdyb3VwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRQaWQgPSBoYWxUaHJlYWRJbmZvLnBpZDsKKyAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkVGlkID0gaGFsVGhyZWFkSW5mby50aWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCFyZXQuaXNPaygpIHx8IHJldHZhbCAhPSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwcmVwYXJlRm9yUmVhZGluZyIsIHJldCwgcmV0dmFsKTsKKyAgICB9CisgICAgaWYgKCF0ZW1wQ29tbWFuZE1RIHx8ICF0ZW1wQ29tbWFuZE1RLT5pc1ZhbGlkKCkgfHwKKyAgICAgICAgICAgICF0ZW1wRGF0YU1RIHx8ICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgfHwKKyAgICAgICAgICAgICF0ZW1wU3RhdHVzTVEgfHwgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpIHx8CisgICAgICAgICAgICAhbUVmR3JvdXApIHsKKyAgICAgICAgQUxPR0VfSUYoIXRlbXBDb21tYW5kTVEsICJGYWlsZWQgdG8gb2J0YWluIGNvbW1hbmQgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOworICAgICAgICBBTE9HRV9JRih0ZW1wQ29tbWFuZE1RICYmICF0ZW1wQ29tbWFuZE1RLT5pc1ZhbGlkKCksCisgICAgICAgICAgICAgICAgIkNvbW1hbmQgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wRGF0YU1RLCAiRmFpbGVkIHRvIG9idGFpbiBkYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHJlYWRpbmciKTsKKyAgICAgICAgQUxPR0VfSUYodGVtcERhdGFNUSAmJiAhdGVtcERhdGFNUS0+aXNWYWxpZCgpLCAiRGF0YSBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0VfSUYoIXRlbXBTdGF0dXNNUSwgIkZhaWxlZCB0byBvYnRhaW4gc3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIHJlYWRpbmciKTsKKyAgICAgICAgQUxPR0VfSUYodGVtcFN0YXR1c01RICYmICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSwKKyAgICAgICAgICAgICAgICAiU3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIHJlYWRpbmcgaXMgaW52YWxpZCIpOworICAgICAgICBBTE9HRV9JRighbUVmR3JvdXAsICJFdmVudCBmbGFnIGNyZWF0aW9uIGZvciByZWFkaW5nIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkKTsKKworICAgIG1Db21tYW5kTVEgPSBzdGQ6Om1vdmUodGVtcENvbW1hbmRNUSk7CisgICAgbURhdGFNUSA9IHN0ZDo6bW92ZSh0ZW1wRGF0YU1RKTsKKyAgICBtU3RhdHVzTVEgPSBzdGQ6Om1vdmUodGVtcFN0YXR1c01RKTsKKyAgICBtUmVhZGVyQ2xpZW50ID0gZ2V0dGlkKCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRJbnB1dEZyYW1lc0xvc3QiLCBtU3RyZWFtLT5nZXRJbnB1dEZyYW1lc0xvc3QoKSwgZnJhbWVzTG9zdCk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIGlmIChtUmVhZGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKKyAgICAgICAgUmVhZFBhcmFtZXRlcnMgcGFyYW1zOworICAgICAgICBwYXJhbXMuY29tbWFuZCA9IFJlYWRDb21tYW5kOjpHRVRfQ0FQVFVSRV9QT1NJVElPTjsKKyAgICAgICAgcmV0dXJuIGNhbGxSZWFkZXJUaHJlYWQocGFyYW1zLCAiZ2V0Q2FwdHVyZVBvc2l0aW9uIiwKKyAgICAgICAgICAgICAgICBbJl0oY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gcmVhZFN0YXR1cy5yZXBseS5jYXB0dXJlUG9zaXRpb24uZnJhbWVzOworICAgICAgICAgICAgICAgICAgICAqdGltZSA9IHJlYWRTdGF0dXMucmVwbHkuY2FwdHVyZVBvc2l0aW9uLnRpbWU7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUmVzdWx0IHJldHZhbDsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldENhcHR1cmVQb3NpdGlvbigKKyAgICAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGhpZGxGcmFtZXMsIHVpbnQ2NF90IGhpZGxUaW1lKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IGhpZGxGcmFtZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAqdGltZSA9IGhpZGxUaW1lOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRDYXB0dXJlUG9zaXRpb24iLCByZXQsIHJldHZhbCk7CisgICAgfQorfQorCisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzSW5mbykgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QWN0aXZlTWljcm9waG9uZXMoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGhpZGxfdmVjPE1pY3JvcGhvbmVJbmZvPiBtaWNBcnJheUhhbCkgeworICAgICAgICByZXR2YWwgPSByOworICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IG1pY0FycmF5SGFsLnNpemUoKTsgaysrKSB7CisgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgZHN0OworICAgICAgICAgICAgLy8gY29udmVydAorICAgICAgICAgICAgbWljcm9waG9uZUluZm9Ub0hhbChtaWNBcnJheUhhbFtrXSwgJmRzdCk7CisgICAgICAgICAgICBtZWRpYTo6TWljcm9waG9uZUluZm8gbWljcm9waG9uZSA9IG1lZGlhOjpNaWNyb3Bob25lSW5mbyhkc3QpOworICAgICAgICAgICAgbWljcm9waG9uZXNJbmZvLT5wdXNoX2JhY2sobWljcm9waG9uZSk7CisgICAgICAgIH0KKyAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QWN0aXZlTWljcm9waG9uZXMiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6dXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSB7CisgICAgaGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpTaW5rTWV0YWRhdGEgaGFsTWV0YWRhdGEgPSB7CisgICAgICAgIC50cmFja3MgPSB0cmFuc2Zvcm1Ub0hpZGxWZWMoc2lua01ldGFkYXRhLnRyYWNrcywKKyAgICAgICAgICAgICAgW10oY29uc3QgcmVjb3JkX3RyYWNrX21ldGFkYXRhJiBtZXRhZGF0YSkgLT4gUmVjb3JkVHJhY2tNZXRhZGF0YSB7CisgICAgICAgICAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgICAgICAgICAuc291cmNlPXN0YXRpY19jYXN0PEF1ZGlvU291cmNlPihtZXRhZGF0YS5zb3VyY2UpLAorICAgICAgICAgICAgICAgICAgICAuZ2Fpbj1tZXRhZGF0YS5nYWluLAorICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgfSl9OworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJ1cGRhdGVTaW5rTWV0YWRhdGEiLCBtU3RyZWFtLT51cGRhdGVTaW5rTWV0YWRhdGEoaGFsTWV0YWRhdGEpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgVjRfMAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkYTBmOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxIaWRsLmgKQEAgLTAsMCArMSwyNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMXzRfMF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMXzRfMF9ICisKKyNpbmNsdWRlIDxhdG9taWM+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JU3RyZWFtLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSVN0cmVhbUluLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSVN0cmVhbU91dC5oPgorI2luY2x1ZGUgPGZtcS9FdmVudEZsYWcuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorI2luY2x1ZGUgIlN0cmVhbVBvd2VyTG9nLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJU3RyZWFtOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklTdHJlYW1JbjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJU3RyZWFtT3V0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6RXZlbnRGbGFnOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgUmVhZFBhcmFtZXRlcnMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbUluOjpSZWFkUGFyYW1ldGVyczsKK3VzaW5nIFJlYWRTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbUluOjpSZWFkU3RhdHVzOwordXNpbmcgV3JpdGVDb21tYW5kID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklTdHJlYW1PdXQ6OldyaXRlQ29tbWFuZDsKK3VzaW5nIFdyaXRlU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklTdHJlYW1PdXQ6OldyaXRlU3RhdHVzOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgVjRfMCB7CisKK2NsYXNzIERldmljZUhhbEhpZGw7CisKK2NsYXNzIFN0cmVhbUhhbEhpZGwgOiBwdWJsaWMgdmlydHVhbCBTdHJlYW1IYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAoreworICBwdWJsaWM6CisgICAgLy8gUmV0dXJuIHRoZSBzYW1wbGluZyByYXRlIGluIEh6IC0gZWcuIDQ0MTAwLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSk7CisKKyAgICAvLyBSZXR1cm4gc2l6ZSBvZiBpbnB1dC9vdXRwdXQgYnVmZmVyIGluIGJ5dGVzIGZvciB0aGlzIHN0cmVhbSAtIGVnLiA0ODAwLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgLy8gUmV0dXJuIHRoZSBjaGFubmVsIG1hc2suCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzayk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGZvcm1hdCAtIGUuZy4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7CisKKyAgICAvLyBDb252ZW5pZW5jZSBtZXRob2QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1Byb3BlcnRpZXMoCisgICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOworCisgICAgLy8gU2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKKworICAgIC8vIEdldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKKworICAgIC8vIEFkZCBvciByZW1vdmUgdGhlIGVmZmVjdCBvbiB0aGUgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7CisKKyAgICAvLyBQdXQgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0L291dHB1dCBpbnRvIHN0YW5kYnkgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YW5kYnkoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworCisgICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CisKKyAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisKKyAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKKworICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKKworICAgIC8vIFNldCB0aGUgcHJpb3JpdHkgb2YgdGhlIHRocmVhZCB0aGF0IGludGVyYWN0cyB3aXRoIHRoZSBIQUwKKyAgICAvLyAobXVzdCBtYXRjaCB0aGUgcHJpb3JpdHkgb2YgdGhlIGF1ZGlvZmxpbmdlcidzIHRocmVhZCB0aGF0IGNhbGxzICdyZWFkJyAvICd3cml0ZScpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQgcHJpb3JpdHkpOworCisgIHByb3RlY3RlZDoKKyAgICAvLyBTdWJjbGFzc2VzIGNhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBleHBsaWNpdCBTdHJlYW1IYWxIaWRsKElTdHJlYW0gKnN0cmVhbSk7CisKKyAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgc3RyZWFtLgorICAgIHZpcnR1YWwgflN0cmVhbUhhbEhpZGwoKTsKKworICAgIHN0YXR1c190IGdldENhY2hlZEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIGJvb2wgcmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KHBpZF90IHRocmVhZFBpZCwgcGlkX3QgdGhyZWFkSWQpOworCisgICAgLy8gbVN0cmVhbVBvd2VyTG9nIGlzIHVzZWQgZm9yIGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgorICAgIFN0cmVhbVBvd2VyTG9nIG1TdHJlYW1Qb3dlckxvZzsKKworICBwcml2YXRlOgorICAgIGNvbnN0IGludCBIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQgPSAtMTsKKyAgICBJU3RyZWFtICptU3RyZWFtOworICAgIGludCBtSGFsVGhyZWFkUHJpb3JpdHk7CisgICAgc2l6ZV90IG1DYWNoZWRCdWZmZXJTaXplOworfTsKKworY2xhc3MgU3RyZWFtT3V0SGFsSGlkbCA6IHB1YmxpYyBTdHJlYW1PdXRIYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxIaWRsIHsKKyAgcHVibGljOgorICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGhhcmR3YXJlIGRyaXZlciBlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KTsKKworICAgIC8vIFVzZSB0aGlzIG1ldGhvZCBpbiBzaXR1YXRpb25zIHdoZXJlIGF1ZGlvIG1peGluZyBpcyBkb25lIGluIHRoZSBoYXJkd2FyZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7CisKKyAgICAvLyBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbik7CisKKyAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgd3JpdHRlbiBieSB0aGUgYXVkaW8gZHNwIHRvIERBQyBzaW5jZQorICAgIC8vIHRoZSBvdXRwdXQgaGFzIGV4aXRlZCBzdGFuZGJ5LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcyk7CisKKyAgICAvLyBHZXQgdGhlIGxvY2FsIHRpbWUgYXQgd2hpY2ggdGhlIG5leHQgd3JpdGUgdG8gdGhlIGF1ZGlvIGRyaXZlciB3aWxsIGJlIHByZXNlbnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApOworCisgICAgLy8gU2V0IHRoZSBjYWxsYmFjayBmb3Igbm90aWZ5aW5nIGNvbXBsZXRpb24gb2Ygbm9uLWJsb2NraW5nIHdyaXRlIGFuZCBkcmFpbi4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgcGF1c2UgYW5kIHJlc3VtZSBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKTsKKworICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKworICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdW1lKCk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgZHJhaW4gb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbik7CisKKyAgICAvLyBSZXF1ZXN0cyBub3RpZmljYXRpb24gd2hlbiBkYXRhIGJ1ZmZlcmVkIGJ5IHRoZSBkcml2ZXIvaGFyZHdhcmUgaGFzIGJlZW4gcGxheWVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJhaW4oYm9vbCBlYXJseU5vdGlmeSk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIGZsdXNoIHRoZSBxdWV1ZWQgZGF0YS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7CisKKyAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcHJlc2VudGVkIHRvIGFuIGV4dGVybmFsIG9ic2VydmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApOworCisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZC4KKyAgICBzdGF0dXNfdCB1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIG92ZXJyaWRlOworCisgICAgLy8gTWV0aG9kcyB1c2VkIGJ5IFN0cmVhbU91dENhbGxiYWNrIChISURMKS4KKyAgICB2b2lkIG9uV3JpdGVSZWFkeSgpOworICAgIHZvaWQgb25EcmFpblJlYWR5KCk7CisgICAgdm9pZCBvbkVycm9yKCk7CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsSGlkbDsKKyAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxXcml0ZUNvbW1hbmQsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBDb21tYW5kTVE7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IERhdGFNUTsKKyAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxXcml0ZVN0YXR1cywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROworCisgICAgd3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IG1DYWxsYmFjazsKKyAgICBzcDxJU3RyZWFtT3V0PiBtU3RyZWFtOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IG1Db21tYW5kTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gbURhdGFNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKKyAgICBzdGQ6OmF0b21pYzxwaWRfdD4gbVdyaXRlckNsaWVudDsKKyAgICBFdmVudEZsYWcqIG1FZkdyb3VwOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIFN0cmVhbU91dEhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbU91dD4mIHN0cmVhbSk7CisKKyAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxIaWRsKCk7CisKKyAgICB1c2luZyBXcml0ZXJDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpPjsKKyAgICBzdGF0dXNfdCBjYWxsV3JpdGVyVGhyZWFkKAorICAgICAgICAgICAgV3JpdGVDb21tYW5kIGNtZCwgY29uc3QgY2hhciogY21kTmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhU2l6ZSwgV3JpdGVyQ2FsbGJhY2sgY2FsbGJhY2spOworICAgIHN0YXR1c190IHByZXBhcmVGb3JXcml0aW5nKHNpemVfdCBidWZmZXJTaXplKTsKK307CisKK2NsYXNzIFN0cmVhbUluSGFsSGlkbCA6IHB1YmxpYyBTdHJlYW1JbkhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbEhpZGwgeworICBwdWJsaWM6CisgICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIC8vIFNldCB0aGUgaW5wdXQgZ2FpbiBmb3IgdGhlIGF1ZGlvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEdhaW4oZmxvYXQgZ2Fpbik7CisKKyAgICAvLyBSZWFkIGF1ZGlvIGJ1ZmZlciBpbiBmcm9tIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGFtb3VudCBvZiBpbnB1dCBmcmFtZXMgbG9zdCBpbiB0aGUgYXVkaW8gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KTsKKworICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyByZWNlaXZlZCBhbmQKKyAgICAvLyB0aGUgY2xvY2sgdGltZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBmcmFtZSBjb3VudC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpOworCisgICAgLy8gR2V0IGFjdGl2ZSBtaWNyb3Bob25lcworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOworCisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzaW5rIGhhcyBiZWVuIGNoYW5nZWQuCisgICAgc3RhdHVzX3QgdXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSBvdmVycmlkZTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxIaWRsOworICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFJlYWRQYXJhbWV0ZXJzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gQ29tbWFuZE1ROworICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBEYXRhTVE7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8UmVhZFN0YXR1cywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROworCisgICAgc3A8SVN0cmVhbUluPiBtU3RyZWFtOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IG1Db21tYW5kTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gbURhdGFNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKKyAgICBzdGQ6OmF0b21pYzxwaWRfdD4gbVJlYWRlckNsaWVudDsKKyAgICBFdmVudEZsYWcqIG1FZkdyb3VwOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIFN0cmVhbUluSGFsSGlkbChjb25zdCBzcDxJU3RyZWFtSW4+JiBzdHJlYW0pOworCisgICAgdmlydHVhbCB+U3RyZWFtSW5IYWxIaWRsKCk7CisKKyAgICB1c2luZyBSZWFkZXJDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSZWFkU3RhdHVzJiByZWFkU3RhdHVzKT47CisgICAgc3RhdHVzX3QgY2FsbFJlYWRlclRocmVhZCgKKyAgICAgICAgICAgIGNvbnN0IFJlYWRQYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IGNoYXIqIGNtZE5hbWUsIFJlYWRlckNhbGxiYWNrIGNhbGxiYWNrKTsKKyAgICBzdGF0dXNfdCBwcmVwYXJlRm9yUmVhZGluZyhzaXplX3QgYnVmZmVyU2l6ZSk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBWNF8wCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSElETF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxMb2NhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlkOTZiZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxMb2NhbC5jcHAKQEAgLTAsMCArMSwzNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlN0cmVhbUhhbExvY2FsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCisjaW5jbHVkZSAiU3RyZWFtSGFsTG9jYWwuaCIKKyNpbmNsdWRlICJWZXJzaW9uVXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFY0XzAgeworCitTdHJlYW1IYWxMb2NhbDo6U3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKKyAgICAgICAgOiBtRGV2aWNlKGRldmljZSksCisgICAgICAgICAgbVN0cmVhbShzdHJlYW0pIHsKKyAgICAvLyBJbnN0cnVtZW50IGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgorICAgIC8vIE5vdGU6IFRoaXMgYXNzdW1lcyBjaGFubmVsIG1hc2ssIGZvcm1hdCwgYW5kIHNhbXBsZSByYXRlIGRvIG5vdCBjaGFuZ2UgYWZ0ZXIgY3JlYXRpb24uCisgICAgaWYgKG1TdHJlYW0gIT0gbnVsbHB0ciAmJiBtU3RyZWFtUG93ZXJMb2cuaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkpIHsKKyAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmluaXQobVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pLAorICAgICAgICAgICAgICAgIG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKSwKKyAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pKTsKKyAgICB9Cit9CisKK1N0cmVhbUhhbExvY2FsOjp+U3RyZWFtSGFsTG9jYWwoKSB7CisgICAgbVN0cmVhbSA9IDA7CisgICAgbURldmljZS5jbGVhcigpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSkgeworICAgICpyYXRlID0gbVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgKnNpemUgPSBtU3RyZWFtLT5nZXRfYnVmZmVyX3NpemUobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKKyAgICAqbWFzayA9IG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgeworICAgICpmb3JtYXQgPSBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7CisgICAgKnNhbXBsZVJhdGUgPSBtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSk7CisgICAgKm1hc2sgPSBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSk7CisgICAgKmZvcm1hdCA9IG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7CisgICAgcmV0dXJuIG1TdHJlYW0tPnNldF9wYXJhbWV0ZXJzKG1TdHJlYW0sIGt2UGFpcnMuc3RyaW5nKCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKKyAgICBjaGFyICpoYWxWYWx1ZXMgPSBtU3RyZWFtLT5nZXRfcGFyYW1ldGVycyhtU3RyZWFtLCBrZXlzLnN0cmluZygpKTsKKyAgICBpZiAoaGFsVmFsdWVzICE9IE5VTEwpIHsKKyAgICAgICAgdmFsdWVzLT5zZXRUbyhoYWxWYWx1ZXMpOworICAgICAgICBmcmVlKGhhbFZhbHVlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsdWVzLT5jbGVhcigpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjphZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPikgeworICAgIExPR19BTFdBWVNfRkFUQUwoIkxvY2FsIHN0cmVhbXMgY2FuIG5vdCBoYXZlIGVmZmVjdHMiKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpyZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPikgeworICAgIExPR19BTFdBWVNfRkFUQUwoIkxvY2FsIHN0cmVhbXMgY2FuIG5vdCBoYXZlIGVmZmVjdHMiKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzdGFuZGJ5KCkgeworICAgIHJldHVybiBtU3RyZWFtLT5zdGFuZGJ5KG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6ZHVtcChpbnQgZmQpIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RyZWFtLT5kdW1wKG1TdHJlYW0sIGZkKTsKKyAgICBtU3RyZWFtUG93ZXJMb2cuZHVtcChmZCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnNldEhhbFRocmVhZFByaW9yaXR5KGludCkgeworICAgIC8vIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgYXMgbG9jYWwgaGFsIGlzIGV4ZWN1dGVkIGJ5IGF1ZGlvZmxpbmdlciBkaXJlY3RseQorICAgIC8vIG9uIHRoZSBzYW1lIHRocmVhZC4KKyAgICByZXR1cm4gT0s7Cit9CisKK1N0cmVhbU91dEhhbExvY2FsOjpTdHJlYW1PdXRIYWxMb2NhbChhdWRpb19zdHJlYW1fb3V0X3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKKyAgICAgICAgOiBTdHJlYW1IYWxMb2NhbCgmc3RyZWFtLT5jb21tb24sIGRldmljZSksIG1TdHJlYW0oc3RyZWFtKSB7Cit9CisKK1N0cmVhbU91dEhhbExvY2FsOjp+U3RyZWFtT3V0SGFsTG9jYWwoKSB7CisgICAgbUNhbGxiYWNrLmNsZWFyKCk7CisgICAgbURldmljZS0+Y2xvc2VPdXRwdXRTdHJlYW0obVN0cmVhbSk7CisgICAgbVN0cmVhbSA9IDA7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgKnNpemUgPSBhdWRpb19zdHJlYW1fb3V0X2ZyYW1lX3NpemUobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSkgeworICAgICpsYXRlbmN5ID0gbVN0cmVhbS0+Z2V0X2xhdGVuY3kobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7CisgICAgaWYgKG1TdHJlYW0tPnNldF92b2x1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zZXRfdm9sdW1lKG1TdHJlYW0sIGxlZnQsIHJpZ2h0KTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OndyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pIHsKKyAgICBzc2l6ZV90IHdyaXRlUmVzdWx0ID0gbVN0cmVhbS0+d3JpdGUobVN0cmVhbSwgYnVmZmVyLCBieXRlcyk7CisgICAgaWYgKHdyaXRlUmVzdWx0ID4gMCkgeworICAgICAgICAqd3JpdHRlbiA9IHdyaXRlUmVzdWx0OworICAgICAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKndyaXR0ZW4pOworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKndyaXR0ZW4gPSAwOworICAgICAgICByZXR1cm4gd3JpdGVSZXN1bHQ7CisgICAgfQorfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcykgeworICAgIHJldHVybiBtU3RyZWFtLT5nZXRfcmVuZGVyX3Bvc2l0aW9uKG1TdHJlYW0sIGRzcEZyYW1lcyk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKSB7CisgICAgaWYgKG1TdHJlYW0tPmdldF9uZXh0X3dyaXRlX3RpbWVzdGFtcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmdldF9uZXh0X3dyaXRlX3RpbWVzdGFtcChtU3RyZWFtLCB0aW1lc3RhbXApOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKSB7CisgICAgaWYgKG1TdHJlYW0tPnNldF9jYWxsYmFjayA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gbVN0cmVhbS0+c2V0X2NhbGxiYWNrKG1TdHJlYW0sIFN0cmVhbU91dEhhbExvY2FsOjphc3luY0NhbGxiYWNrLCB0aGlzKTsKKyAgICBpZiAocmVzdWx0ID09IE9LKSB7CisgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBzdGF0aWMKK2ludCBTdHJlYW1PdXRIYWxMb2NhbDo6YXN5bmNDYWxsYmFjayhzdHJlYW1fY2FsbGJhY2tfZXZlbnRfdCBldmVudCwgdm9pZCosIHZvaWQgKmNvb2tpZSkgeworICAgIC8vIFdlIGFjdCBhcyBpZiB3ZSBnYXZlIGEgd3A8U3RyZWFtT3V0SGFsTG9jYWw+IHRvIEhBTC4gVGhpcyB3YXkgd2Ugc2hvdWxkIGhhbmRsZQorICAgIC8vIGNvcnJlY3RseSB0aGUgY2FzZSB3aGVuIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkIHdoaWxlIFN0cmVhbU91dEhhbExvY2FsJ3MgZGVzdHJ1Y3RvciBpcworICAgIC8vIGFscmVhZHkgcnVubmluZywgYmVjYXVzZSB0aGUgZGVzdHJ1Y3RvciBpcyBpbnZva2VkIGFmdGVyIHRoZSByZWZjb3VudCBoYXMgYmVlbiBhdG9taWNhbGx5CisgICAgLy8gZGVjcmVtZW50ZWQuCisgICAgd3A8U3RyZWFtT3V0SGFsTG9jYWw+IHdlYWtTZWxmKHN0YXRpY19jYXN0PFN0cmVhbU91dEhhbExvY2FsKj4oY29va2llKSk7CisgICAgc3A8U3RyZWFtT3V0SGFsTG9jYWw+IHNlbGYgPSB3ZWFrU2VsZi5wcm9tb3RlKCk7CisgICAgaWYgKHNlbGYgPT0gMCkgcmV0dXJuIDA7CisgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gc2VsZi0+bUNhbGxiYWNrLnByb21vdGUoKTsKKyAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuIDA7CisgICAgQUxPR1YoImFzeW5jQ2FsbGJhY2soKSBldmVudCAlZCIsIGV2ZW50KTsKKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9XUklURV9SRUFEWToKKyAgICAgICAgICAgIGNhbGxiYWNrLT5vbldyaXRlUmVhZHkoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfRFJBSU5fUkVBRFk6CisgICAgICAgICAgICBjYWxsYmFjay0+b25EcmFpblJlYWR5KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX0VSUk9SOgorICAgICAgICAgICAgY2FsbGJhY2stPm9uRXJyb3IoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1coImFzeW5jQ2FsbGJhY2soKSB1bmtub3duIGV2ZW50ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSkgeworICAgICpzdXBwb3J0c1BhdXNlID0gbVN0cmVhbS0+cGF1c2UgIT0gTlVMTDsKKyAgICAqc3VwcG9ydHNSZXN1bWUgPSBtU3RyZWFtLT5yZXN1bWUgIT0gTlVMTDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpwYXVzZSgpIHsKKyAgICBpZiAobVN0cmVhbS0+cGF1c2UgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5wYXVzZShtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnJlc3VtZSgpIHsKKyAgICBpZiAobVN0cmVhbS0+cmVzdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+cmVzdW1lKG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKSB7CisgICAgKnN1cHBvcnRzRHJhaW4gPSBtU3RyZWFtLT5kcmFpbiAhPSBOVUxMOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmRyYWluKGJvb2wgZWFybHlOb3RpZnkpIHsKKyAgICBpZiAobVN0cmVhbS0+ZHJhaW4gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5kcmFpbihtU3RyZWFtLCBlYXJseU5vdGlmeSA/IEFVRElPX0RSQUlOX0VBUkxZX05PVElGWSA6IEFVRElPX0RSQUlOX0FMTCk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpmbHVzaCgpIHsKKyAgICBpZiAobVN0cmVhbS0+Zmx1c2ggPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5mbHVzaChtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKSB7CisgICAgaWYgKG1TdHJlYW0tPmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uKG1TdHJlYW0sIGZyYW1lcywgdGltZXN0YW1wKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgeworICAgIGlmIChtU3RyZWFtLT51cGRhdGVfc291cmNlX21ldGFkYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBjb25zdCBzb3VyY2VfbWV0YWRhdGFfdCBtZXRhZGF0YSB7CisgICAgICAgIC50cmFja19jb3VudCA9IHNvdXJjZU1ldGFkYXRhLnRyYWNrcy5zaXplKCksCisgICAgICAgIC8vIGNvbnN0IGNhc3QgaXMgZmluZSBhcyBpdCBpcyBpbiBhIGNvbnN0IHN0cnVjdHVyZQorICAgICAgICAudHJhY2tzID0gY29uc3RfY2FzdDxwbGF5YmFja190cmFja19tZXRhZGF0YSo+KHNvdXJjZU1ldGFkYXRhLnRyYWNrcy5kYXRhKCkpLAorICAgIH07CisgICAgbVN0cmVhbS0+dXBkYXRlX3NvdXJjZV9tZXRhZGF0YShtU3RyZWFtLCAmbWV0YWRhdGEpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN0YXJ0KCkgeworICAgIGlmIChtU3RyZWFtLT5zdGFydCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnN0YXJ0KG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3RvcCgpIHsKKyAgICBpZiAobVN0cmVhbS0+c3RvcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnN0b3AobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgeworICAgIGlmIChtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIobVN0cmVhbSwgbWluU2l6ZUZyYW1lcywgaW5mbyk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7CisgICAgaWYgKG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24obVN0cmVhbSwgcG9zaXRpb24pOworfQorCitTdHJlYW1JbkhhbExvY2FsOjpTdHJlYW1JbkhhbExvY2FsKGF1ZGlvX3N0cmVhbV9pbl90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCisgICAgICAgIDogU3RyZWFtSGFsTG9jYWwoJnN0cmVhbS0+Y29tbW9uLCBkZXZpY2UpLCBtU3RyZWFtKHN0cmVhbSkgeworfQorCitTdHJlYW1JbkhhbExvY2FsOjp+U3RyZWFtSW5IYWxMb2NhbCgpIHsKKyAgICBtRGV2aWNlLT5jbG9zZUlucHV0U3RyZWFtKG1TdHJlYW0pOworICAgIG1TdHJlYW0gPSAwOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgKnNpemUgPSBhdWRpb19zdHJlYW1faW5fZnJhbWVfc2l6ZShtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnNldEdhaW4oZmxvYXQgZ2FpbikgeworICAgIHJldHVybiBtU3RyZWFtLT5zZXRfZ2FpbihtU3RyZWFtLCBnYWluKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6cmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKSB7CisgICAgc3NpemVfdCByZWFkUmVzdWx0ID0gbVN0cmVhbS0+cmVhZChtU3RyZWFtLCBidWZmZXIsIGJ5dGVzKTsKKyAgICBpZiAocmVhZFJlc3VsdCA+IDApIHsKKyAgICAgICAgKnJlYWQgPSByZWFkUmVzdWx0OworICAgICAgICBtU3RyZWFtUG93ZXJMb2cubG9nKCBidWZmZXIsICpyZWFkKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSB7CisgICAgICAgICpyZWFkID0gMDsKKyAgICAgICAgcmV0dXJuIHJlYWRSZXN1bHQ7CisgICAgfQorfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpIHsKKyAgICAqZnJhbWVzTG9zdCA9IG1TdHJlYW0tPmdldF9pbnB1dF9mcmFtZXNfbG9zdChtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpIHsKKyAgICBpZiAobVN0cmVhbS0+Z2V0X2NhcHR1cmVfcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5nZXRfY2FwdHVyZV9wb3NpdGlvbihtU3RyZWFtLCBmcmFtZXMsIHRpbWUpOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjp1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIHsKKyAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NpbmtfbWV0YWRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGNvbnN0IHNpbmtfbWV0YWRhdGFfdCBtZXRhZGF0YSB7CisgICAgICAgIC50cmFja19jb3VudCA9IHNpbmtNZXRhZGF0YS50cmFja3Muc2l6ZSgpLAorICAgICAgICAvLyBjb25zdCBjYXN0IGlzIGZpbmUgYXMgaXQgaXMgaW4gYSBjb25zdCBzdHJ1Y3R1cmUKKyAgICAgICAgLnRyYWNrcyA9IGNvbnN0X2Nhc3Q8cmVjb3JkX3RyYWNrX21ldGFkYXRhKj4oc2lua01ldGFkYXRhLnRyYWNrcy5kYXRhKCkpLAorICAgIH07CisgICAgbVN0cmVhbS0+dXBkYXRlX3NpbmtfbWV0YWRhdGEobVN0cmVhbSwgJm1ldGFkYXRhKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnN0YXJ0KCkgeworICAgIGlmIChtU3RyZWFtLT5zdGFydCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnN0YXJ0KG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzdG9wKCkgeworICAgIGlmIChtU3RyZWFtLT5zdG9wID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+c3RvcChtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKKyAgICBpZiAobVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyKG1TdHJlYW0sIG1pblNpemVGcmFtZXMsIGluZm8pOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7CisgICAgaWYgKG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24obVN0cmVhbSwgcG9zaXRpb24pOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykgeworICAgIGlmIChtU3RyZWFtLT5nZXRfYWN0aXZlX21pY3JvcGhvbmVzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBzaXplX3QgYWN0dWFsX21pY3MgPSBBVURJT19NSUNST1BIT05FX01BWF9DT1VOVDsKKyAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgbWljX2FycmF5W0FVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UXTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RyZWFtLT5nZXRfYWN0aXZlX21pY3JvcGhvbmVzKG1TdHJlYW0sICZtaWNfYXJyYXlbMF0sICZhY3R1YWxfbWljcyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3R1YWxfbWljczsgaSsrKSB7CisgICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lSW5mbyA9IG1lZGlhOjpNaWNyb3Bob25lSW5mbyhtaWNfYXJyYXlbaV0pOworICAgICAgICBtaWNyb3Bob25lcy0+cHVzaF9iYWNrKG1pY3JvcGhvbmVJbmZvKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworfSAvLyBuYW1lc3BhY2UgVjRfMAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsTG9jYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjM3NTA5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbExvY2FsLmgKQEAgLTAsMCArMSwyMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF80XzBfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfNF8wX0gKKworI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgIlN0cmVhbVBvd2VyTG9nLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBWNF8wIHsKKworY2xhc3MgRGV2aWNlSGFsTG9jYWw7CisKK2NsYXNzIFN0cmVhbUhhbExvY2FsIDogcHVibGljIHZpcnR1YWwgU3RyZWFtSGFsSW50ZXJmYWNlCit7CisgIHB1YmxpYzoKKyAgICAvLyBSZXR1cm4gdGhlIHNhbXBsaW5nIHJhdGUgaW4gSHogLSBlZy4gNDQxMDAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKTsKKworICAgIC8vIFJldHVybiBzaXplIG9mIGlucHV0L291dHB1dCBidWZmZXIgaW4gYnl0ZXMgZm9yIHRoaXMgc3RyZWFtIC0gZWcuIDQ4MDAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGNoYW5uZWwgbWFzay4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKTsKKworICAgIC8vIFJldHVybiB0aGUgYXVkaW8gZm9ybWF0IC0gZS5nLiBBVURJT19GT1JNQVRfUENNXzE2X0JJVC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKKworICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7CisKKyAgICAvLyBTZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOworCisgICAgLy8gR2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOworCisgICAgLy8gQWRkIG9yIHJlbW92ZSB0aGUgZWZmZWN0IG9uIHRoZSBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKKworICAgIC8vIFB1dCB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQvb3V0cHV0IGludG8gc3RhbmRieSBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhbmRieSgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CisKKyAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgPSAwOworCisgICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgPSAwOworCisgICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pID0gMDsKKworICAgIC8vIFNldCB0aGUgcHJpb3JpdHkgb2YgdGhlIHRocmVhZCB0aGF0IGludGVyYWN0cyB3aXRoIHRoZSBIQUwKKyAgICAvLyAobXVzdCBtYXRjaCB0aGUgcHJpb3JpdHkgb2YgdGhlIGF1ZGlvZmxpbmdlcidzIHRocmVhZCB0aGF0IGNhbGxzICdyZWFkJyAvICd3cml0ZScpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQgcHJpb3JpdHkpOworCisgIHByb3RlY3RlZDoKKyAgICAvLyBTdWJjbGFzc2VzIGNhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBTdHJlYW1IYWxMb2NhbChhdWRpb19zdHJlYW1fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKKworICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBzdHJlYW0uCisgICAgdmlydHVhbCB+U3RyZWFtSGFsTG9jYWwoKTsKKworICAgIHNwPERldmljZUhhbExvY2FsPiBtRGV2aWNlOworCisgICAgLy8gbVN0cmVhbVBvd2VyTG9nIGlzIHVzZWQgZm9yIGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgorICAgIFN0cmVhbVBvd2VyTG9nIG1TdHJlYW1Qb3dlckxvZzsKKworICBwcml2YXRlOgorICAgIGF1ZGlvX3N0cmVhbV90ICptU3RyZWFtOworfTsKKworY2xhc3MgU3RyZWFtT3V0SGFsTG9jYWwgOiBwdWJsaWMgU3RyZWFtT3V0SGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsTG9jYWwgeworICBwdWJsaWM6CisgICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIC8vIFJldHVybiB0aGUgYXVkaW8gaGFyZHdhcmUgZHJpdmVyIGVzdGltYXRlZCBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpOworCisgICAgLy8gVXNlIHRoaXMgbWV0aG9kIGluIHNpdHVhdGlvbnMgd2hlcmUgYXVkaW8gbWl4aW5nIGlzIGRvbmUgaW4gdGhlIGhhcmR3YXJlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKKworICAgIC8vIFdyaXRlIGF1ZGlvIGJ1ZmZlciB0byBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKTsKKworICAgIC8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyB3cml0dGVuIGJ5IHRoZSBhdWRpbyBkc3AgdG8gREFDIHNpbmNlCisgICAgLy8gdGhlIG91dHB1dCBoYXMgZXhpdGVkIHN0YW5kYnkuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKTsKKworICAgIC8vIEdldCB0aGUgbG9jYWwgdGltZSBhdCB3aGljaCB0aGUgbmV4dCB3cml0ZSB0byB0aGUgYXVkaW8gZHJpdmVyIHdpbGwgYmUgcHJlc2VudGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCk7CisKKyAgICAvLyBTZXQgdGhlIGNhbGxiYWNrIGZvciBub3RpZnlpbmcgY29tcGxldGlvbiBvZiBub24tYmxvY2tpbmcgd3JpdGUgYW5kIGRyYWluLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKTsKKworICAgIC8vIFJldHVybnMgd2hldGhlciBwYXVzZSBhbmQgcmVzdW1lIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpOworCisgICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCisgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOworCisgICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCisgICAgdmlydHVhbCBzdGF0dXNfdCByZXN1bWUoKTsKKworICAgIC8vIFJldHVybnMgd2hldGhlciBkcmFpbiBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKTsKKworICAgIC8vIFJlcXVlc3RzIG5vdGlmaWNhdGlvbiB3aGVuIGRhdGEgYnVmZmVyZWQgYnkgdGhlIGRyaXZlci9oYXJkd2FyZSBoYXMgYmVlbiBwbGF5ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBkcmFpbihib29sIGVhcmx5Tm90aWZ5KTsKKworICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gZmx1c2ggdGhlIHF1ZXVlZCBkYXRhLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKTsKKworICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyBwcmVzZW50ZWQgdG8gYW4gZXh0ZXJuYWwgb2JzZXJ2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCk7CisKKyAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKKworICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOworCisgICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOworCisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZC4KKyAgICBzdGF0dXNfdCB1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIG92ZXJyaWRlOworCisgIHByaXZhdGU6CisgICAgYXVkaW9fc3RyZWFtX291dF90ICptU3RyZWFtOworICAgIHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBtQ2FsbGJhY2s7CisKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsTG9jYWw7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgU3RyZWFtT3V0SGFsTG9jYWwoYXVkaW9fc3RyZWFtX291dF90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpOworCisgICAgdmlydHVhbCB+U3RyZWFtT3V0SGFsTG9jYWwoKTsKKworICAgIHN0YXRpYyBpbnQgYXN5bmNDYWxsYmFjayhzdHJlYW1fY2FsbGJhY2tfZXZlbnRfdCBldmVudCwgdm9pZCAqcGFyYW0sIHZvaWQgKmNvb2tpZSk7Cit9OworCitjbGFzcyBTdHJlYW1JbkhhbExvY2FsIDogcHVibGljIFN0cmVhbUluSGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsTG9jYWwgeworICBwdWJsaWM6CisgICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIC8vIFNldCB0aGUgaW5wdXQgZ2FpbiBmb3IgdGhlIGF1ZGlvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEdhaW4oZmxvYXQgZ2Fpbik7CisKKyAgICAvLyBSZWFkIGF1ZGlvIGJ1ZmZlciBpbiBmcm9tIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGFtb3VudCBvZiBpbnB1dCBmcmFtZXMgbG9zdCBpbiB0aGUgYXVkaW8gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KTsKKworICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyByZWNlaXZlZCBhbmQKKyAgICAvLyB0aGUgY2xvY2sgdGltZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBmcmFtZSBjb3VudC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpOworCisgICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CisKKyAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisKKyAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKKworICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKKworICAgIC8vIEdldCBhY3RpdmUgbWljcm9waG9uZXMKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKKworICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc2luayBoYXMgYmVlbiBjaGFuZ2VkLgorICAgIHN0YXR1c190IHVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZToKKyAgICBhdWRpb19zdHJlYW1faW5fdCAqbVN0cmVhbTsKKworICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxMb2NhbDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBTdHJlYW1JbkhhbExvY2FsKGF1ZGlvX3N0cmVhbV9pbl90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpOworCisgICAgdmlydHVhbCB+U3RyZWFtSW5IYWxMb2NhbCgpOworfTsKKworfSAvLyBuYW1lc3BhY2UgVjRfMAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0xPQ0FMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtUG93ZXJMb2cuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1Qb3dlckxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YjcyMDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtUG93ZXJMb2cuaApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HXzRfMF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR180XzBfSAorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9Qb3dlckxvZy5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBWNF8wIHsKKworY2xhc3MgU3RyZWFtUG93ZXJMb2cgeworcHVibGljOgorICAgIFN0cmVhbVBvd2VyTG9nKCkgOgorICAgICAgICBtSXNVc2VyRGVidWdPckVuZ0J1aWxkKGlzX3VzZXJkZWJ1Z19vcl9lbmdfYnVpbGQoKSksCisgICAgICAgIG1Qb3dlckxvZyhudWxscHRyKSwKKyAgICAgICAgbUZyYW1lU2l6ZSgwKSB7CisgICAgICAgIC8vIHVzZSBpbml0KCkgdG8gc2V0IHVwIHRoZSBwb3dlciBsb2cuCisgICAgfQorCisgICAgflN0cmVhbVBvd2VyTG9nKCkgeworICAgICAgICBwb3dlcl9sb2dfZGVzdHJveShtUG93ZXJMb2cpOyAvLyBPSyBmb3IgbnVsbCBtUG93ZXJMb2cKKyAgICAgICAgbVBvd2VyTG9nID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICAvLyBBIG9uZS10aW1lIGluaXRpYWxpemF0aW9uIChkbyBub3QgY2FsbCB0d2ljZSkgYmVmb3JlIHVzaW5nIFN0cmVhbVBvd2VyTG9nLgorICAgIHZvaWQgaW5pdCh1aW50MzJfdCBzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CisgICAgICAgIGlmIChtUG93ZXJMb2cgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gTm90ZTogQSB3YXkgdG8gZ2V0IGNoYW5uZWwgY291bnQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCBjaGFubmVsIG1hc2tzCisgICAgICAgICAgICAvLyBidXQgZG9lcyBub3QgY2hlY2sgdmFsaWRpdHkgb2YgdGhlIGNoYW5uZWwgbWFzay4KKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhjaGFubmVsTWFzaykpOworICAgICAgICAgICAgbUZyYW1lU2l6ZSA9IGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KTsKKyAgICAgICAgICAgIGlmIChtRnJhbWVTaXplID4gMCkgeworICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dGcmFtZXNQZXJFbnRyeSA9CisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXNhbXBsZVJhdGUgKiBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMgLyAxMDAwOworICAgICAgICAgICAgICAgIG1Qb3dlckxvZyA9IHBvd2VyX2xvZ19jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAga1Bvd2VyTG9nRW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGtQb3dlckxvZ0ZyYW1lc1BlckVudHJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBtUG93ZXJMb2cgbWF5IGJlIE5VTEwgKG5vdCB0aGUgcmlnaHQgYnVpbGQsIGZvcm1hdCBub3QgYWNjZXB0ZWQsIGV0Yy4pLgorICAgIH0KKworICAgIC8vIER1bXAgdGhlIHBvd2VyIGxvZyB0byBmZC4KKyAgICB2b2lkIGR1bXAoaW50IGZkKSBjb25zdCB7CisgICAgICAgIC8vIE9LIGZvciBudWxsIG1Qb3dlckxvZworICAgICAgICAodm9pZClwb3dlcl9sb2dfZHVtcCgKKyAgICAgICAgICAgICAgICBtUG93ZXJMb2csIGZkLCAiICAgICAgIiAvKiBwcmVmaXggKi8sIGtQb3dlckxvZ0xpbmVzLCAwIC8qIGxpbWl0X25zICovKTsKKyAgICB9CisKKyAgICAvLyBMb2cgdGhlIGF1ZGlvIGRhdGEgY29udGFpbmVkIGluIGJ1ZmZlci4KKyAgICB2b2lkIGxvZyhjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplSW5CeXRlcykgY29uc3QgeworICAgICAgICBpZiAobVBvd2VyTG9nICE9IG51bGxwdHIpIHsgLy8gbUZyYW1lU2l6ZSBpcyBhbHdheXMgbm9uemVybyBpZiBtUG93ZXJMb2cgZXhpc3RzLgorICAgICAgICAgICAgcG93ZXJfbG9nX2xvZygKKyAgICAgICAgICAgICAgICAgICAgbVBvd2VyTG9nLCBidWZmZXIsIHNpemVJbkJ5dGVzIC8gbUZyYW1lU2l6ZSwgYXVkaW9fdXRpbHNfZ2V0X3JlYWxfdGltZV9ucygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUlzVXNlckRlYnVnT3JFbmdCdWlsZDsKKyAgICB9CisKK3ByaXZhdGU6CisKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgaXNfdXNlcmRlYnVnX29yX2VuZ19idWlsZCgpIHsKKyAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgICAgICAodm9pZClwcm9wZXJ0eV9nZXQoInJvLmJ1aWxkLnR5cGUiLCB2YWx1ZSwgInVua25vd24iKTsgLy8gaWdub3JlIGFjdHVhbCBsZW5ndGgKKyAgICAgICAgcmV0dXJuIHN0cmNtcCh2YWx1ZSwgInVzZXJkZWJ1ZyIpID09IDAgfHwgc3RyY21wKHZhbHVlLCAiZW5nIikgPT0gMDsKKyAgICB9CisKKyAgICAvLyBBdWRpbyBzaWduYWwgcG93ZXIgbG9nIGNvbmZpZ3VyYXRpb24uCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dMaW5lcyA9IDQwOworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zID0gNTA7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dFbnRyaWVzID0gKDEgLyogbWludXRlcyAqLyAqIDYwIC8qIHNlY29uZHMgKi8gKiAxMDAwIC8qIG1zZWMgKi8KKyAgICAgICAgICAgIC8ga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zKTsKKworICAgIGNvbnN0IGJvb2wgbUlzVXNlckRlYnVnT3JFbmdCdWlsZDsKKyAgICBwb3dlcl9sb2dfdCAqbVBvd2VyTG9nOworICAgIHNpemVfdCBtRnJhbWVTaXplOworfTsKKworfSAvLyBuYW1lc3BhY2UgVjRfMAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvVmVyc2lvblV0aWxzLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvVmVyc2lvblV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI0NmMyZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9WZXJzaW9uVXRpbHMuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1ZFUlNJT05fVVRJTFNfNF8wX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9WRVJTSU9OX1VUSUxTXzRfMF9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC90eXBlcy5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlBhcmFtZXRlclZhbHVlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBWNF8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBDYWxsYmFjaz4KK1JldHVybjx2b2lkPiBnZXRQYXJhbWV0ZXJzKFQmIG9iamVjdCwgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4ga2V5cywgQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICByZXR1cm4gb2JqZWN0LT5nZXRQYXJhbWV0ZXJzKGNvbnRleHQsIGtleXMsIGNhbGxiYWNrKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitSZXR1cm48UmVzdWx0PiBzZXRQYXJhbWV0ZXJzKFQmIG9iamVjdCwgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBrZXlzKSB7CisgICAgcmV0dXJuIG9iamVjdC0+c2V0UGFyYW1ldGVycyhjb250ZXh0LCBrZXlzKTsKK30KKworfSAvLyBuYW1lc3BhY2UgdXRpbHMKK30gLy8gbmFtZXNwYWNlIFY0XzAKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfVkVSU0lPTl9VVElMU180XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL2luY2x1ZGUvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvaW5jbHVkZS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmY2ZGUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL2luY2x1ZGUvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF80XzBfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSFlCUklEXzRfMF9ICisKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIFY0XzAgeworCitjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCA6IHB1YmxpYyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZQoreworICBwdWJsaWM6CisgICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCisgICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOworCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIERldmljZXNGYWN0b3J5SGFsSHlicmlkKCk7CisKKyAgICB2aXJ0dWFsIH5EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpOworCisgICAgc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IG1Mb2NhbEZhY3Rvcnk7CisgICAgc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IG1IaWRsRmFjdG9yeTsKK307CisKK30gLy8gbmFtZXNwYWNlIFY0XzAKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9pbmNsdWRlL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9pbmNsdWRlL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODBiN2ExCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL2luY2x1ZGUvbGliYXVkaW9oYWwvNC4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMXzRfMF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMXzRfMF9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC80LjAvSUVmZmVjdHNGYWN0b3J5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvNC4wL3R5cGVzLmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBWNF8wIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6RWZmZWN0RGVzY3JpcHRvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OklFZmZlY3RzRmFjdG9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOworCitjbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAoreworICBwdWJsaWM6CisgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRpZmZlcmVudCBlZmZlY3RzIGluIGFsbCBsb2FkZWQgbGlicmFyaWVzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpwTnVtRWZmZWN0cyk7CisKKyAgICAvLyBSZXR1cm5zIGEgZGVzY3JpcHRvciBvZiB0aGUgbmV4dCBhdmFpbGFibGUgZWZmZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGVzY3JpcHRvcih1aW50MzJfdCBpbmRleCwKKyAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwKKyAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKKworICAgIC8vIENyZWF0ZXMgYW4gZWZmZWN0IGVuZ2luZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCisgICAgLy8gVG8gcmVsZWFzZSB0aGUgZWZmZWN0IGVuZ2luZSwgaXQgaXMgbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcworICAgIC8vIHRvIHRoZSByZXR1cm5lZCBlZmZlY3Qgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLAorICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCwKKyAgICAgICAgICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gKmVmZmVjdCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBFZmZlY3RzKGludCBmZCk7CisKKyAgICBzdGF0dXNfdCBhbGxvY2F0ZUJ1ZmZlcihzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBtaXJyb3JCdWZmZXIodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIG92ZXJyaWRlOworCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOworCisgICAgc3A8SUVmZmVjdHNGYWN0b3J5PiBtRWZmZWN0c0ZhY3Rvcnk7CisgICAgaGlkbF92ZWM8RWZmZWN0RGVzY3JpcHRvcj4gbUxhc3REZXNjcmlwdG9yczsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKTsKKyAgICB2aXJ0dWFsIH5FZmZlY3RzRmFjdG9yeUhhbEhpZGwoKTsKKworICAgIHN0YXR1c190IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKK307CisKK30gLy8gbmFtZXNwYWNlIFY0XzAKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTVkZjI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5icApAQCAtMCwwICsxLDU2IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmF1ZGlvaGFsIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcCIsCisgICAgICAgICJFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0QDQuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvQDQuMCIsCisgICAgICAgICJsaWJhdWRpb2hhbEAyLjAiLAorICAgICAgICAibGliYXVkaW9oYWxANC4wIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvaGFsX2hlYWRlcnMiCisgICAgXQorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmF1ZGlvaGFsX2RlYXRoaGFuZGxlciIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJIYWxEZWF0aEhhbmRsZXJIaWRsLmNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9oYWxfaGVhZGVycyIKKyAgICBdCit9CisKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYmF1ZGlvaGFsX2hlYWRlcnMiLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI3OTA4ZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliYXVkaW91dGlscyBcCi0gICAgbGliY3V0aWxzICAgXAotICAgIGxpYmxvZyAgICAgIFwKLSAgICBsaWJ1dGlscyAgICBcCi0gICAgbGliaGFyZHdhcmUKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAgICBEZXZpY2VIYWxMb2NhbC5jcHAgICAgICAgICAgXAotICAgIERldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcCBcCi0gICAgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAgIFwKLSAgICBTdHJlYW1IYWxMb2NhbC5jcHAKLQotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKLQotaWZlcSAoJChVU0VfTEVHQUNZX0xPQ0FMX0FVRElPX0hBTCksIHRydWUpCi0KLSMgVXNlIGF1ZGlvaGFsIGRpcmVjdGx5IHcvbyBod2JpbmRlciBtaWRkbGV3YXJlLgotIyBUaGlzIGlzIGZvciBwZXJmb3JtYW5jZSBjb21wYXJpc29uIGFuZCBkZWJ1Z2dpbmcgb25seS4KLQotTE9DQUxfU1JDX0ZJTEVTICs9IFwKLSAgICBFZmZlY3RCdWZmZXJIYWxMb2NhbC5jcHAgICAgXAotICAgIEVmZmVjdHNGYWN0b3J5SGFsTG9jYWwuY3BwICBcCi0gICAgRWZmZWN0SGFsTG9jYWwuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gXAotICAgIGxpYmVmZmVjdHMKLQotTE9DQUxfQ0ZMQUdTICs9IC1EVVNFX0xFR0FDWV9MT0NBTF9BVURJT19IQUwKLQotZWxzZSAgIyBpZiAhVVNFX0xFR0FDWV9MT0NBTF9BVURJT19IQUwKLQotTE9DQUxfU1JDX0ZJTEVTICs9IFwKLSAgICBDb252ZXJzaW9uSGVscGVySGlkbC5jcHAgICBcCi0gICAgSGFsRGVhdGhIYW5kbGVySGlkbC5jcHAgICAgXAotICAgIERldmljZUhhbEhpZGwuY3BwICAgICAgICAgIFwKLSAgICBEZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwICBcCi0gICAgRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAgICAgXAotICAgIEVmZmVjdEhhbEhpZGwuY3BwICAgICAgICAgIFwKLSAgICBFZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwICBcCi0gICAgU3RyZWFtSGFsSGlkbC5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBcCi0gICAgbGliYmFzZSAgICAgICAgICBcCi0gICAgbGliZm1xICAgICAgICAgICBcCi0gICAgbGliaHdiaW5kZXIgICAgICBcCi0gICAgbGliaGlkbGJhc2UgICAgICBcCi0gICAgbGliaGlkbG1lbW9yeSAgICBcCi0gICAgbGliaGlkbHRyYW5zcG9ydCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0AyLjAgICAgICAgICAgICAgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDIuMCAgICAgIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAtdXRpbCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RAMi4wICAgICAgXAotICAgIGFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wICAgICAgICAgICAgIFwKLSAgICBhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCAgICAgICAgICAgICAgICBcCi0gICAgbGlibWVkaWFfaGVscGVyICBcCi0gICAgbGlibWVkaWF1dGlscwotCi1lbmRpZiAgIyBVU0VfTEVHQUNZX0xPQ0FMX0FVRElPX0hBTAotCi1MT0NBTF9DX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvaW5jbHVkZQotCi1MT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gJChMT0NBTF9QQVRIKS9pbmNsdWRlCi0KLUxPQ0FMX01PRFVMRSA6PSBsaWJhdWRpb2hhbAotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZUhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWVmOTkxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZUhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVByaW1hcnlEZXZpY2UuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgotI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0jaW5jbHVkZSAiSGlkbFV0aWxzLmgiCi0jaW5jbHVkZSAiU3RyZWFtSGFsSGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0NvbmZpZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvRGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9JbnB1dEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb091dHB1dEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb1BhdGNoSGFuZGxlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Qb3J0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Qb3J0Q29uZmlnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Nb2RlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Tb3VyY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6RGV2aWNlQWRkcmVzczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJUHJpbWFyeURldmljZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpQYXJhbWV0ZXJWYWx1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLW5hbWVzcGFjZSB7Ci0KLXN0YXR1c190IGRldmljZUFkZHJlc3NGcm9tSGFsKAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBjb25zdCBjaGFyKiBoYWxBZGRyZXNzLCBEZXZpY2VBZGRyZXNzKiBhZGRyZXNzKSB7Ci0gICAgYWRkcmVzcy0+ZGV2aWNlID0gQXVkaW9EZXZpY2UoZGV2aWNlKTsKLQotICAgIGlmIChhZGRyZXNzID09IG51bGxwdHIgfHwgc3RybmxlbihoYWxBZGRyZXNzLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgY29uc3QgYm9vbCBpc0lucHV0ID0gKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDA7Ci0gICAgaWYgKGlzSW5wdXQpIGRldmljZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKLSAgICBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSAhPSAwKQotICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCkgIT0gMCkpIHsKLSAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAotICAgICAgICAgICAgICAgICIlaGhYOiVoaFg6JWhoWDolaGhYOiVoaFg6JWhoWCIsCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzBdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMV0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1syXSwKLSAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbM10sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1s0XSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzVdKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSA2ID8gT0sgOiBCQURfVkFMVUU7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfSVApICE9IDApCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0lQKSAhPSAwKSkgewotICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCi0gICAgICAgICAgICAgICAgIiVoaHUuJWhodS4laGh1LiVoaHUiLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMF0sICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMV0sCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFsyXSwgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFszXSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXMgPT0gNCA/IE9LIDogQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9VU0IpKSAhPSAwCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0FMTF9VU0IpKSAhPSAwKSB7Ci0gICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKLSAgICAgICAgICAgICAgICAiY2FyZD0lZDtkZXZpY2U9JWQiLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmFsc2EuY2FyZCwgJmFkZHJlc3MtPmFkZHJlc3MuYWxzYS5kZXZpY2UpOwotICAgICAgICByZXR1cm4gc3RhdHVzID09IDIgPyBPSyA6IEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9CVVMpICE9IDApCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JVUykgIT0gMCkpIHsKLSAgICAgICAgaWYgKGhhbEFkZHJlc3MgIT0gTlVMTCkgewotICAgICAgICAgICAgYWRkcmVzcy0+YnVzQWRkcmVzcyA9IGhhbEFkZHJlc3M7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSkgIT0gMAotICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSAhPSAwKSkgewotICAgICAgICBpZiAoaGFsQWRkcmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBhZGRyZXNzLT5yU3VibWl4QWRkcmVzcyA9IGhhbEFkZHJlc3M7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotRGV2aWNlSGFsSGlkbDo6RGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKQotICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJEZXZpY2UiKSwgbURldmljZShkZXZpY2UpLAotICAgICAgICAgIG1QcmltYXJ5RGV2aWNlKElQcmltYXJ5RGV2aWNlOjpjYXN0RnJvbShkZXZpY2UpKSB7Ci19Ci0KLURldmljZUhhbEhpZGw6On5EZXZpY2VIYWxIaWRsKCkgewotICAgIGlmIChtRGV2aWNlICE9IDApIHsKLSAgICAgICAgbURldmljZS5jbGVhcigpOwotICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCopIHsKLSAgICAvLyBPYnNvbGV0ZS4KLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmluaXRDaGVjaygpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiaW5pdENoZWNrIiwgbURldmljZS0+aW5pdENoZWNrKCkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2ljZVZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1hc3RlclZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRNYXN0ZXJWb2x1bWUodm9sdW1lKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtUHJpbWFyeURldmljZS0+Z2V0TWFzdGVyVm9sdW1lKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBmbG9hdCB2KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnZvbHVtZSA9IHY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3RlclZvbHVtZSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1vZGUiLCBtUHJpbWFyeURldmljZS0+c2V0TW9kZShBdWRpb01vZGUobW9kZSkpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1pY011dGUiLCBtRGV2aWNlLT5zZXRNaWNNdXRlKHN0YXRlKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1pY011dGUoYm9vbCAqc3RhdGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNaWNNdXRlKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBib29sIG11dGUpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqc3RhdGUgPSBtdXRlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNaWNNdXRlIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyTXV0ZSIsIG1EZXZpY2UtPnNldE1hc3Rlck11dGUoc3RhdGUpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1hc3Rlck11dGUoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGJvb2wgbXV0ZSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpzdGF0ZSA9IG11dGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3Rlck11dGUiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBoaWRsUGFyYW1zOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtZXRlcnNGcm9tSGFsKGt2UGFpcnMsICZoaWRsUGFyYW1zKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRQYXJhbWV0ZXJzIiwgbURldmljZS0+c2V0UGFyYW1ldGVycyhoaWRsUGFyYW1zKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgdmFsdWVzLT5jbGVhcigpOwotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBoaWRsS2V5czsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBrZXlzRnJvbUhhbChrZXlzLCAmaGlkbEtleXMpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0UGFyYW1ldGVycygKLSAgICAgICAgICAgIGhpZGxLZXlzLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzVG9IYWwocGFyYW1ldGVycywgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UGFyYW1ldGVycyIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldElucHV0QnVmZmVyU2l6ZSgKLSAgICAgICAgICAgIGhpZGxDb25maWcsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGJ1ZmZlclNpemUpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oYnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldElucHV0QnVmZmVyU2l6ZSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZXMsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgIGhhbmRsZSwKLSAgICAgICAgICAgIGhpZGxEZXZpY2UsCi0gICAgICAgICAgICBoaWRsQ29uZmlnLAotICAgICAgICAgICAgQXVkaW9PdXRwdXRGbGFnKGZsYWdzKSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVN0cmVhbU91dD4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpvdXRTdHJlYW0gPSBuZXcgU3RyZWFtT3V0SGFsSGlkbChyZXN1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnVG9IYWwoc3VnZ2VzdGVkQ29uZmlnLCBjb25maWcpOwotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oIm9wZW5PdXRwdXRTdHJlYW0iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6Om9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBEZXZpY2VBZGRyZXNzIGhpZGxEZXZpY2U7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlQWRkcmVzc0Zyb21IYWwoZGV2aWNlcywgYWRkcmVzcywgJmhpZGxEZXZpY2UpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5vcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICBoYW5kbGUsCi0gICAgICAgICAgICBoaWRsRGV2aWNlLAotICAgICAgICAgICAgaGlkbENvbmZpZywKLSAgICAgICAgICAgIEF1ZGlvSW5wdXRGbGFnKGZsYWdzKSwKLSAgICAgICAgICAgIEF1ZGlvU291cmNlKHNvdXJjZSksCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElTdHJlYW1Jbj4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICppblN0cmVhbSA9IG5ldyBTdHJlYW1JbkhhbEhpZGwocmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ1RvSGFsKHN1Z2dlc3RlZENvbmZpZywgY29uZmlnKTsKLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJvcGVuSW5wdXRTdHJlYW0iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcykgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c0F1ZGlvUGF0Y2hlcyIsIG1EZXZpY2UtPnN1cHBvcnRzQXVkaW9QYXRjaGVzKCksIHN1cHBvcnRzUGF0Y2hlcyk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxBdWRpb1BvcnRDb25maWc+IGhpZGxTb3VyY2VzLCBoaWRsU2lua3M7Ci0gICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdzRnJvbUhhbChudW1fc291cmNlcywgc291cmNlcywgJmhpZGxTb3VyY2VzKTsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ3NGcm9tSGFsKG51bV9zaW5rcywgc2lua3MsICZoaWRsU2lua3MpOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgICAgICBoaWRsU291cmNlcywgaGlkbFNpbmtzLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBBdWRpb1BhdGNoSGFuZGxlIGhpZGxQYXRjaCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpwYXRjaCA9IHN0YXRpY19jYXN0PGF1ZGlvX3BhdGNoX2hhbmRsZV90PihoaWRsUGF0Y2gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJjcmVhdGVBdWRpb1BhdGNoIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJyZWxlYXNlQXVkaW9QYXRjaCIsIG1EZXZpY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIEF1ZGlvUG9ydCBoaWRsUG9ydDsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydEZyb21IYWwoKnBvcnQsICZoaWRsUG9ydCk7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0QXVkaW9Qb3J0KAotICAgICAgICAgICAgaGlkbFBvcnQsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEF1ZGlvUG9ydCYgcCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0VG9IYWwocCwgcG9ydCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEF1ZGlvUG9ydCIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgQXVkaW9Qb3J0Q29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0QXVkaW9Qb3J0Q29uZmlnIiwgbURldmljZS0+c2V0QXVkaW9Qb3J0Q29uZmlnKGhpZGxDb25maWcpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6ZHVtcChpbnQgZmQpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKLSAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmRlYnVnRHVtcChoaWRsSGFuZGxlKTsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZHVtcCIsIHJldCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZUhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY1MWI1MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JRGV2aWNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVByaW1hcnlEZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJRGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklQcmltYXJ5RGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERldmljZUhhbEhpZGwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKLXsKLSAgcHVibGljOgotICAgIC8vIFNldHMgdGhlIHZhbHVlIG9mICdkZXZpY2VzJyB0byBhIGJpdG1hc2sgb2YgMSBvciBtb3JlIHZhbHVlcyBvZiBhdWRpb19kZXZpY2VzX3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKTsKLQotICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7Ci0KLSAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBvZiBhIHZvaWNlIGNhbGwuIFJhbmdlIGlzIGJldHdlZW4gMC4wIGFuZCAxLjAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgZm9yIGFsbCBhdWRpbyBhY3Rpdml0aWVzIG90aGVyIHRoYW4gdm9pY2UgY2FsbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gR2V0IHRoZSBjdXJyZW50IG1hc3RlciB2b2x1bWUgdmFsdWUgZm9yIHRoZSBIQUwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYXVkaW8gbW9kZSBjaGFuZ2VzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSk7Ci0KLSAgICAvLyBNdXRpbmcgY29udHJvbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKTsKLQotICAgIC8vIFNldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7Ci0KLSAgICAvLyBHZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7Ci0KLSAgICAvLyBSZXR1cm5zIGF1ZGlvIGlucHV0IGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIHBhc3NlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBzaXplX3QgKnNpemUpOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKLSAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBjcmVhdGVBdWRpb1BhdGNoIGFuZCByZWxlYXNlQXVkaW9QYXRjaCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpOwotCi0gICAgLy8gQ3JlYXRlcyBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKTsKLQotICAgIC8vIFJlbGVhc2VzIGFuIGF1ZGlvIHBhdGNoLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpOwotCi0gICAgLy8gRmlsbHMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7Ci0KLSAgICAvLyBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSGlkbDsKLSAgICBzcDxJRGV2aWNlPiBtRGV2aWNlOwotICAgIHNwPElQcmltYXJ5RGV2aWNlPiBtUHJpbWFyeURldmljZTsgIC8vIE51bGwgaWYgaXQncyBub3QgYSBwcmltYXJ5IGRldmljZS4KLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPElEZXZpY2U+JiBkZXZpY2UpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIGRldmljZS4KLSAgICB2aXJ0dWFsIH5EZXZpY2VIYWxIaWRsKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VIYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VIYWxMb2NhbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMDk4ZjUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlSGFsTG9jYWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZUhhbExvY2FsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotRGV2aWNlSGFsTG9jYWw6OkRldmljZUhhbExvY2FsKGF1ZGlvX2h3X2RldmljZV90ICpkZXYpCi0gICAgICAgIDogbURldihkZXYpIHsKLX0KLQotRGV2aWNlSGFsTG9jYWw6On5EZXZpY2VIYWxMb2NhbCgpIHsKLSAgICBpbnQgc3RhdHVzID0gYXVkaW9faHdfZGV2aWNlX2Nsb3NlKG1EZXYpOwotICAgIEFMT0dXX0lGKHN0YXR1cywgIkVycm9yIGNsb3NpbmcgYXVkaW8gaHcgZGV2aWNlICVwOiAlcyIsIG1EZXYsIHN0cmVycm9yKC1zdGF0dXMpKTsKLSAgICBtRGV2ID0gMDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpIHsKLSAgICBpZiAobURldi0+Z2V0X3N1cHBvcnRlZF9kZXZpY2VzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAqZGV2aWNlcyA9IG1EZXYtPmdldF9zdXBwb3J0ZWRfZGV2aWNlcyhtRGV2KTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjppbml0Q2hlY2soKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmluaXRfY2hlY2sobURldik7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICByZXR1cm4gbURldi0+c2V0X3ZvaWNlX3ZvbHVtZShtRGV2LCB2b2x1bWUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIGlmIChtRGV2LT5zZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSkgewotICAgIGlmIChtRGV2LT5nZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9tb2RlKG1EZXYsIG1vZGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKLSAgICBpZiAobURldi0+c2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbURldi0+c2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpIHsKLSAgICBpZiAobURldi0+Z2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbURldi0+Z2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIHJldHVybiBtRGV2LT5zZXRfcGFyYW1ldGVycyhtRGV2LCBrdlBhaXJzLnN0cmluZygpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgY2hhciAqaGFsVmFsdWVzID0gbURldi0+Z2V0X3BhcmFtZXRlcnMobURldiwga2V5cy5zdHJpbmcoKSk7Ci0gICAgaWYgKGhhbFZhbHVlcyAhPSBOVUxMKSB7Ci0gICAgICAgIHZhbHVlcy0+c2V0VG8oaGFsVmFsdWVzKTsKLSAgICAgICAgZnJlZShoYWxWYWx1ZXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gbURldi0+Z2V0X2lucHV0X2J1ZmZlcl9zaXplKG1EZXYsIGNvbmZpZyk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7Ci0gICAgYXVkaW9fc3RyZWFtX291dF90ICpoYWxTdHJlYW07Ci0gICAgQUxPR1YoIm9wZW5fb3V0cHV0X3N0cmVhbSBoYW5kbGU6ICVkIGRldmljZXM6ICV4IGZsYWdzOiAlI3giCi0gICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyIsCi0gICAgICAgICAgICBoYW5kbGUsIGRldmljZXMsIGZsYWdzLAotICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgYWRkcmVzcyk7Ci0gICAgaW50IG9wZW5SZXN1dCA9IG1EZXYtPm9wZW5fb3V0cHV0X3N0cmVhbSgKLSAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsIGNvbmZpZywgJmhhbFN0cmVhbSwgYWRkcmVzcyk7Ci0gICAgaWYgKG9wZW5SZXN1dCA9PSBPSykgewotICAgICAgICAqb3V0U3RyZWFtID0gbmV3IFN0cmVhbU91dEhhbExvY2FsKGhhbFN0cmVhbSwgdGhpcyk7Ci0gICAgfQotICAgIEFMT0dWKCJvcGVuX291dHB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1dCwgaGFsU3RyZWFtKTsKLSAgICByZXR1cm4gb3BlblJlc3V0OwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3BlbklucHV0U3RyZWFtKAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSkgewotICAgIGF1ZGlvX3N0cmVhbV9pbl90ICpoYWxTdHJlYW07Ci0gICAgQUxPR1YoIm9wZW5faW5wdXRfc3RyZWFtIGhhbmRsZTogJWQgZGV2aWNlczogJXggZmxhZ3M6ICUjeCAiCi0gICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyBzb3VyY2UgJWQiLAotICAgICAgICAgICAgaGFuZGxlLCBkZXZpY2VzLCBmbGFncywKLSAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywKLSAgICAgICAgICAgIGFkZHJlc3MsIHNvdXJjZSk7Ci0gICAgaW50IG9wZW5SZXN1bHQgPSBtRGV2LT5vcGVuX2lucHV0X3N0cmVhbSgKLSAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgY29uZmlnLCAmaGFsU3RyZWFtLCBmbGFncywgYWRkcmVzcywgc291cmNlKTsKLSAgICBpZiAob3BlblJlc3VsdCA9PSBPSykgewotICAgICAgICAqaW5TdHJlYW0gPSBuZXcgU3RyZWFtSW5IYWxMb2NhbChoYWxTdHJlYW0sIHRoaXMpOwotICAgIH0KLSAgICBBTE9HVigib3Blbl9pbnB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1bHQsIGluU3RyZWFtKTsKLSAgICByZXR1cm4gb3BlblJlc3VsdDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcykgewotICAgICpzdXBwb3J0c1BhdGNoZXMgPSB2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpjcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKSB7Ci0gICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7Ci0gICAgICAgIHJldHVybiBtRGV2LT5jcmVhdGVfYXVkaW9fcGF0Y2goCi0gICAgICAgICAgICAgICAgbURldiwgbnVtX3NvdXJjZXMsIHNvdXJjZXMsIG51bV9zaW5rcywgc2lua3MsIHBhdGNoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpIHsKLSAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKLSAgICAgICAgcmV0dXJuIG1EZXYtPnJlbGVhc2VfYXVkaW9fcGF0Y2gobURldiwgcGF0Y2gpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIHsKLSAgICByZXR1cm4gbURldi0+Z2V0X2F1ZGlvX3BvcnQobURldiwgcG9ydCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKLSAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApCi0gICAgICAgIHJldHVybiBtRGV2LT5zZXRfYXVkaW9fcG9ydF9jb25maWcobURldiwgY29uZmlnKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7Ci0gICAgcmV0dXJuIG1EZXYtPmR1bXAobURldiwgZmQpOwotfQotCi12b2lkIERldmljZUhhbExvY2FsOjpjbG9zZU91dHB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtX291dCkgewotICAgIG1EZXYtPmNsb3NlX291dHB1dF9zdHJlYW0obURldiwgc3RyZWFtX291dCk7Ci19Ci0KLXZvaWQgRGV2aWNlSGFsTG9jYWw6OmNsb3NlSW5wdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqc3RyZWFtX2luKSB7Ci0gICAgbURldi0+Y2xvc2VfaW5wdXRfc3RyZWFtKG1EZXYsIHN0cmVhbV9pbik7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VIYWxMb2NhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjVmMjk2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZUhhbExvY2FsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMX0gKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGV2aWNlSGFsTG9jYWwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBTZXRzIHRoZSB2YWx1ZSBvZiAnZGV2aWNlcycgdG8gYSBiaXRtYXNrIG9mIDEgb3IgbW9yZSB2YWx1ZXMgb2YgYXVkaW9fZGV2aWNlc190LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCAqZGV2aWNlcyk7Ci0KLSAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgb2YgYSB2b2ljZSBjYWxsLiBSYW5nZSBpcyBiZXR3ZWVuIDAuMCBhbmQgMS4wLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIGZvciBhbGwgYXVkaW8gYWN0aXZpdGllcyBvdGhlciB0aGFuIHZvaWNlIGNhbGwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIEdldCB0aGUgY3VycmVudCBtYXN0ZXIgdm9sdW1lIHZhbHVlIGZvciB0aGUgSEFMLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGF1ZGlvIG1vZGUgY2hhbmdlcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpOwotCi0gICAgLy8gTXV0aW5nIGNvbnRyb2wuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljTXV0ZShib29sICpzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSk7Ci0KLSAgICAvLyBTZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOwotCi0gICAgLy8gR2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgLy8gUmV0dXJucyBhdWRpbyBpbnB1dCBidWZmZXIgc2l6ZSBhY2NvcmRpbmcgdG8gcGFyYW1ldGVycyBwYXNzZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclNpemUoY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAotICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKTsKLQotICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgY3JlYXRlQXVkaW9QYXRjaCBhbmQgcmVsZWFzZUF1ZGlvUGF0Y2ggb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKTsKLQotICAgIC8vIENyZWF0ZXMgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCk7Ci0KLSAgICAvLyBSZWxlYXNlcyBhbiBhdWRpbyBwYXRjaC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKTsKLQotICAgIC8vIEZpbGxzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOwotCi0gICAgLy8gU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKLQotICAgIHZvaWQgY2xvc2VPdXRwdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbV9vdXQpOwotICAgIHZvaWQgY2xvc2VJbnB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luICpzdHJlYW1faW4pOwotCi0gIHByaXZhdGU6Ci0gICAgYXVkaW9faHdfZGV2aWNlX3QgKm1EZXY7Ci0KLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBEZXZpY2VIYWxMb2NhbChhdWRpb19od19kZXZpY2VfdCAqZGV2KTsKLQotICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBkZXZpY2UuCi0gICAgdmlydHVhbCB+RGV2aWNlSGFsTG9jYWwoKTsKLQotICAgIHVpbnQzMl90IHZlcnNpb24oKSBjb25zdCB7IHJldHVybiBtRGV2LT5jb21tb24udmVyc2lvbjsgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWRhMjYzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lEZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9oaWRsL0hhbERlYXRoSGFuZGxlci5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJRGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1EZXZpY2VzRmFjdG9yeUhhbEhpZGw6OkRldmljZXNGYWN0b3J5SGFsSGlkbCgpIHsKLSAgICBtRGV2aWNlc0ZhY3RvcnkgPSBJRGV2aWNlc0ZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKLSAgICBpZiAobURldmljZXNGYWN0b3J5ICE9IDApIHsKLSAgICAgICAgLy8gSXQgaXMgYXNzdW1lZCB0aGF0IERldmljZXNGYWN0b3J5IGlzIG93bmVkIGJ5IEF1ZGlvRmxpbmdlcgotICAgICAgICAvLyBhbmQgdGh1cyBoYXZlIHRoZSBzYW1lIGxpZmVzcGFuLgotICAgICAgICBtRGV2aWNlc0ZhY3RvcnktPmxpbmtUb0RlYXRoKEhhbERlYXRoSGFuZGxlcjo6Z2V0SW5zdGFuY2UoKSwgMCAvKmNvb2tpZSovKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9idGFpbiBJRGV2aWNlc0ZhY3Rvcnkgc2VydmljZSwgdGVybWluYXRpbmcgcHJvY2Vzcy4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci19Ci0KLURldmljZXNGYWN0b3J5SGFsSGlkbDo6fkRldmljZXNGYWN0b3J5SGFsSGlkbCgpIHsKLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEhpZGw6Om5hbWVGcm9tSGFsKGNvbnN0IGNoYXIgKm5hbWUsIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlICpkZXZpY2UpIHsKLSAgICBpZiAoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZKSA9PSAwKSB7Ci0gICAgICAgICpkZXZpY2UgPSBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6UFJJTUFSWTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSBpZihzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0EyRFApID09IDApIHsKLSAgICAgICAgKmRldmljZSA9IElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpBMkRQOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIGlmKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfVVNCKSA9PSAwKSB7Ci0gICAgICAgICpkZXZpY2UgPSBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6VVNCOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIGlmKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUkVNT1RFX1NVQk1JWCkgPT0gMCkgewotICAgICAgICAqZGV2aWNlID0gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OlJfU1VCTUlYOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIGlmKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfU1RVQikgPT0gMCkgewotICAgICAgICAqZGV2aWNlID0gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OlNUVUI7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgQUxPR0UoIkludmFsaWQgZGV2aWNlIG5hbWUgJXMiLCBuYW1lKTsKLSAgICByZXR1cm4gQkFEX1ZBTFVFOwotfQotCi1zdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEhpZGw6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7Ci0gICAgaWYgKG1EZXZpY2VzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZSBoaWRsRGV2aWNlOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG5hbWVGcm9tSGFsKG5hbWUsICZoaWRsRGV2aWNlKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZXNGYWN0b3J5LT5vcGVuRGV2aWNlKAotICAgICAgICAgICAgaGlkbERldmljZSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SURldmljZT4mIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpkZXZpY2UgPSBuZXcgRGV2aWNlSGFsSGlkbChyZXN1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgcmV0dXJuIE9LOwotICAgICAgICBlbHNlIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUykgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgZWxzZSByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJmMWFkMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9ISURMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSURldmljZXNGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJRGV2aWNlc0ZhY3Rvcnk7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBPcGVucyBhIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gVG8gY2xvc2UgdGhlIGRldmljZSwgaXQgaXMKLSAgICAvLyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ7Ci0KLSAgICBzcDxJRGV2aWNlc0ZhY3Rvcnk+IG1EZXZpY2VzRmFjdG9yeTsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBuYW1lRnJvbUhhbChjb25zdCBjaGFyICpuYW1lLCBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZSAqZGV2aWNlKTsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKTsKLQotICAgIHZpcnR1YWwgfkRldmljZXNGYWN0b3J5SGFsSGlkbCgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTRiMDNiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsSHlicmlkIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaCIKLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgiCi0jaWZuZGVmIFVTRV9MRUdBQ1lfTE9DQUxfQVVESU9fSEFMCi0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgiCi0jZW5kaWYKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBzdGF0aWMKLXNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZTo6Y3JlYXRlKCkgewotICAgIHJldHVybiBuZXcgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKTsKLX0KLQotRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6OkRldmljZXNGYWN0b3J5SGFsSHlicmlkKCkKLSAgICAgICAgOiBtTG9jYWxGYWN0b3J5KG5ldyBEZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkpLAotICAgICAgICAgIG1IaWRsRmFjdG9yeSgKLSNpZmRlZiBVU0VfTEVHQUNZX0xPQ0FMX0FVRElPX0hBTAotICAgICAgICAgICAgICAgICAgbnVsbHB0cgotI2Vsc2UKLSAgICAgICAgICAgICAgICAgIG5ldyBEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICkgewotfQotCi1EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6fkRldmljZXNGYWN0b3J5SGFsSHlicmlkKCkgewotfQotCi1zdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKLSAgICBpZiAobUhpZGxGYWN0b3J5ICE9IDAgJiYgc3RyY21wKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9BMkRQLCBuYW1lKSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtSGlkbEZhY3RvcnktPm9wZW5EZXZpY2UobmFtZSwgZGV2aWNlKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1Mb2NhbEZhY3RvcnktPm9wZW5EZXZpY2UobmFtZSwgZGV2aWNlKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjOGVhZjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JRGV2aWNlc0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JRGV2aWNlc0ZhY3RvcnkuaD4KKworI2luY2x1ZGUgPERldmljZXNGYWN0b3J5SGFsSHlicmlkLmg+CisjaW5jbHVkZSA8bGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gc3RhdGljCitzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U6OmNyZWF0ZSgpIHsKKyAgICBpZiAoaGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJRGV2aWNlc0ZhY3Rvcnk6OmdldFNlcnZpY2UoKSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBuZXcgVjRfMDo6RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKTsKKyAgICB9CisgICAgaWYgKGhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKCkgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbmV3IERldmljZXNGYWN0b3J5SGFsSHlicmlkKCk7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjUyMDFiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YXRvbWljPgotCi0jZGVmaW5lIExPR19UQUcgIkVmZmVjdEJ1ZmZlckhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvYWxsb2NhdG9yLzEuMC9JQWxsb2NhdG9yLmg+Ci0jaW5jbHVkZSA8aGlkbG1lbW9yeS9tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoaWRsOjphbGxvY2F0b3I6OlYxXzA6OklBbGxvY2F0b3I7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gc3RhdGljCi11aW50NjRfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjptYWtlVW5pcXVlSWQoKSB7Ci0gICAgc3RhdGljIHN0ZDo6YXRvbWljPHVpbnQ2NF90PiBjb3VudGVyezF9OwotICAgIHJldHVybiBjb3VudGVyKys7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHJldHVybiBtaXJyb3IobnVsbHB0ciwgc2l6ZSwgYnVmZmVyKTsKLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U6Om1pcnJvcigKLSAgICAgICAgdm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKLSAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IHRlbXBCdWZmZXIgPSBuZXcgRWZmZWN0QnVmZmVySGFsSGlkbChzaXplKTsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxFZmZlY3RCdWZmZXJIYWxIaWRsKj4odGVtcEJ1ZmZlci5nZXQoKSktPmluaXQoKTsKLSAgICBpZiAocmVzdWx0ID09IE9LKSB7Ci0gICAgICAgIHRlbXBCdWZmZXItPnNldEV4dGVybmFsRGF0YShleHRlcm5hbCk7Ci0gICAgICAgICpidWZmZXIgPSB0ZW1wQnVmZmVyOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1FZmZlY3RCdWZmZXJIYWxIaWRsOjpFZmZlY3RCdWZmZXJIYWxIaWRsKHNpemVfdCBzaXplKQotICAgICAgICA6IG1CdWZmZXJTaXplKHNpemUpLCBtRnJhbWVDb3VudENoYW5nZWQoZmFsc2UpLAotICAgICAgICAgIG1FeHRlcm5hbERhdGEobnVsbHB0ciksIG1BdWRpb0J1ZmZlcnswLCB7bnVsbHB0cn19IHsKLSAgICBtSGlkbEJ1ZmZlci5pZCA9IG1ha2VVbmlxdWVJZCgpOwotICAgIG1IaWRsQnVmZmVyLmZyYW1lQ291bnQgPSAwOwotfQotCi1FZmZlY3RCdWZmZXJIYWxIaWRsOjp+RWZmZWN0QnVmZmVySGFsSGlkbCgpIHsKLX0KLQotc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6aW5pdCgpIHsKLSAgICBzcDxJQWxsb2NhdG9yPiBhc2htZW0gPSBJQWxsb2NhdG9yOjpnZXRTZXJ2aWNlKCJhc2htZW0iKTsKLSAgICBpZiAoYXNobWVtID09IDApIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZXRyaWV2ZSBhc2htZW0gYWxsb2NhdG9yIHNlcnZpY2UiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHN0YXR1c190IHJldHZhbCA9IE5PX01FTU9SWTsKLSAgICBSZXR1cm48dm9pZD4gcmVzdWx0ID0gYXNobWVtLT5hbGxvY2F0ZSgKLSAgICAgICAgICAgIG1CdWZmZXJTaXplLAotICAgICAgICAgICAgWyZdKGJvb2wgc3VjY2VzcywgY29uc3QgaGlkbF9tZW1vcnkmIG1lbW9yeSkgewotICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1IaWRsQnVmZmVyLmRhdGEgPSBtZW1vcnk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IE9LOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmIChyZXN1bHQuaXNPaygpICYmIHJldHZhbCA9PSBPSykgewotICAgICAgICBtTWVtb3J5ID0gaGFyZHdhcmU6Om1hcE1lbW9yeShtSGlkbEJ1ZmZlci5kYXRhKTsKLSAgICAgICAgaWYgKG1NZW1vcnkgIT0gMCkgewotICAgICAgICAgICAgbU1lbW9yeS0+dXBkYXRlKCk7Ci0gICAgICAgICAgICBtQXVkaW9CdWZmZXIucmF3ID0gc3RhdGljX2Nhc3Q8dm9pZCo+KG1NZW1vcnktPmdldFBvaW50ZXIoKSk7Ci0gICAgICAgICAgICBtZW1zZXQobUF1ZGlvQnVmZmVyLnJhdywgMCwgbU1lbW9yeS0+Z2V0U2l6ZSgpKTsKLSAgICAgICAgICAgIG1NZW1vcnktPmNvbW1pdCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBtYXAgYWxsb2NhdGVkIGFzaG1lbSIpOwotICAgICAgICAgICAgcmV0dmFsID0gTk9fTUVNT1JZOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcyBmcm9tIGFzaG1lbSIsIChpbnQpbUJ1ZmZlclNpemUpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0LmlzT2soKSA/IHJldHZhbCA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotYXVkaW9fYnVmZmVyX3QqIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmF1ZGlvQnVmZmVyKCkgewotICAgIHJldHVybiAmbUF1ZGlvQnVmZmVyOwotfQotCi12b2lkKiBFZmZlY3RCdWZmZXJIYWxIaWRsOjpleHRlcm5hbERhdGEoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1FeHRlcm5hbERhdGE7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6c2V0RnJhbWVDb3VudChzaXplX3QgZnJhbWVDb3VudCkgewotICAgIG1IaWRsQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwotICAgIG1BdWRpb0J1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKLSAgICBtRnJhbWVDb3VudENoYW5nZWQgPSB0cnVlOwotfQotCi1ib29sIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNoZWNrRnJhbWVDb3VudENoYW5nZSgpIHsKLSAgICBib29sIHJlc3VsdCA9IG1GcmFtZUNvdW50Q2hhbmdlZDsKLSAgICBtRnJhbWVDb3VudENoYW5nZWQgPSBmYWxzZTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnNldEV4dGVybmFsRGF0YSh2b2lkKiBleHRlcm5hbCkgewotICAgIG1FeHRlcm5hbERhdGEgPSBleHRlcm5hbDsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjp1cGRhdGUoKSB7Ci0gICAgdXBkYXRlKG1CdWZmZXJTaXplKTsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpjb21taXQoKSB7Ci0gICAgY29tbWl0KG1CdWZmZXJTaXplKTsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjp1cGRhdGUoc2l6ZV90IHNpemUpIHsKLSAgICBpZiAobUV4dGVybmFsRGF0YSA9PSBudWxscHRyKSByZXR1cm47Ci0gICAgbU1lbW9yeS0+dXBkYXRlKCk7Ci0gICAgaWYgKHNpemUgPiBtQnVmZmVyU2l6ZSkgc2l6ZSA9IG1CdWZmZXJTaXplOwotICAgIG1lbWNweShtQXVkaW9CdWZmZXIucmF3LCBtRXh0ZXJuYWxEYXRhLCBzaXplKTsKLSAgICBtTWVtb3J5LT5jb21taXQoKTsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpjb21taXQoc2l6ZV90IHNpemUpIHsKLSAgICBpZiAobUV4dGVybmFsRGF0YSA9PSBudWxscHRyKSByZXR1cm47Ci0gICAgaWYgKHNpemUgPiBtQnVmZmVyU2l6ZSkgc2l6ZSA9IG1CdWZmZXJTaXplOwotICAgIG1lbWNweShtRXh0ZXJuYWxEYXRhLCBtQXVkaW9CdWZmZXIucmF3LCBzaXplKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0QnVmZmVySGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0QnVmZmVySGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmE4MWMyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfSElETF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfSElETF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC8yLjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KLQotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkF1ZGlvQnVmZmVyOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwotdXNpbmcgYW5kcm9pZDo6aGlkbDo6bWVtb3J5OjpWMV8wOjpJTWVtb3J5OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEVmZmVjdEJ1ZmZlckhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICB2aXJ0dWFsIGF1ZGlvX2J1ZmZlcl90KiBhdWRpb0J1ZmZlcigpOwotICAgIHZpcnR1YWwgdm9pZCogZXh0ZXJuYWxEYXRhKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0RXh0ZXJuYWxEYXRhKHZvaWQqIGV4dGVybmFsKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0RnJhbWVDb3VudChzaXplX3QgZnJhbWVDb3VudCk7Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRnJhbWVDb3VudENoYW5nZSgpOwotCi0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZSgpOwotICAgIHZpcnR1YWwgdm9pZCBjb21taXQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlKHNpemVfdCBzaXplKTsKLSAgICB2aXJ0dWFsIHZvaWQgY29tbWl0KHNpemVfdCBzaXplKTsKLQotICAgIGNvbnN0IEF1ZGlvQnVmZmVyJiBoaWRsQnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbUhpZGxCdWZmZXI7IH0KLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U7Ci0KLSAgICBzdGF0aWMgdWludDY0X3QgbWFrZVVuaXF1ZUlkKCk7Ci0KLSAgICBjb25zdCBzaXplX3QgbUJ1ZmZlclNpemU7Ci0gICAgYm9vbCBtRnJhbWVDb3VudENoYW5nZWQ7Ci0gICAgdm9pZCogbUV4dGVybmFsRGF0YTsKLSAgICBBdWRpb0J1ZmZlciBtSGlkbEJ1ZmZlcjsKLSAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OwotICAgIGF1ZGlvX2J1ZmZlcl90IG1BdWRpb0J1ZmZlcjsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBFZmZlY3RCdWZmZXJIYWxIaWRsKHNpemVfdCBzaXplKTsKLQotICAgIHZpcnR1YWwgfkVmZmVjdEJ1ZmZlckhhbEhpZGwoKTsKLQotICAgIHN0YXR1c190IGluaXQoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxMb2NhbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NTFjOGUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0QnVmZmVySGFsTG9jYWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0QnVmZmVySGFsTG9jYWwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gc3RhdGljCi1zdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U6OmFsbG9jYXRlKAotICAgICAgICBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7Ci0gICAgKmJ1ZmZlciA9IG5ldyBFZmZlY3RCdWZmZXJIYWxMb2NhbChzaXplKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlOjptaXJyb3IoCi0gICAgICAgIHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7Ci0gICAgKmJ1ZmZlciA9IG5ldyBFZmZlY3RCdWZmZXJIYWxMb2NhbChleHRlcm5hbCwgc2l6ZSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1FZmZlY3RCdWZmZXJIYWxMb2NhbDo6RWZmZWN0QnVmZmVySGFsTG9jYWwoc2l6ZV90IHNpemUpCi0gICAgICAgIDogbU93bkJ1ZmZlcihuZXcgdWludDhfdFtzaXplXSksCi0gICAgICAgICAgbUJ1ZmZlclNpemUoc2l6ZSksIG1GcmFtZUNvdW50Q2hhbmdlZChmYWxzZSksCi0gICAgICAgICAgbUF1ZGlvQnVmZmVyezAsIHttT3duQnVmZmVyLmdldCgpfX0gewotfQotCi1FZmZlY3RCdWZmZXJIYWxMb2NhbDo6RWZmZWN0QnVmZmVySGFsTG9jYWwodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplKQotICAgICAgICA6IG1Pd25CdWZmZXIobnVsbHB0ciksCi0gICAgICAgICAgbUJ1ZmZlclNpemUoc2l6ZSksIG1GcmFtZUNvdW50Q2hhbmdlZChmYWxzZSksCi0gICAgICAgICAgbUF1ZGlvQnVmZmVyezAsIHtleHRlcm5hbH19IHsKLX0KLQotRWZmZWN0QnVmZmVySGFsTG9jYWw6On5FZmZlY3RCdWZmZXJIYWxMb2NhbCgpIHsKLX0KLQotYXVkaW9fYnVmZmVyX3QqIEVmZmVjdEJ1ZmZlckhhbExvY2FsOjphdWRpb0J1ZmZlcigpIHsKLSAgICByZXR1cm4gJm1BdWRpb0J1ZmZlcjsKLX0KLQotdm9pZCogRWZmZWN0QnVmZmVySGFsTG9jYWw6OmV4dGVybmFsRGF0YSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUF1ZGlvQnVmZmVyLnJhdzsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxMb2NhbDo6c2V0RnJhbWVDb3VudChzaXplX3QgZnJhbWVDb3VudCkgewotICAgIG1BdWRpb0J1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKLSAgICBtRnJhbWVDb3VudENoYW5nZWQgPSB0cnVlOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbExvY2FsOjpzZXRFeHRlcm5hbERhdGEodm9pZCogZXh0ZXJuYWwpIHsKLSAgICBBTE9HRV9JRihtT3duQnVmZmVyICE9IG51bGxwdHIsICJBdHRlbXB0IHRvIHNldCBleHRlcm5hbCBkYXRhIGZvciBhbGxvY2F0ZWQgYnVmZmVyIik7Ci0gICAgbUF1ZGlvQnVmZmVyLnJhdyA9IGV4dGVybmFsOwotfQotCi1ib29sIEVmZmVjdEJ1ZmZlckhhbExvY2FsOjpjaGVja0ZyYW1lQ291bnRDaGFuZ2UoKSB7Ci0gICAgYm9vbCByZXN1bHQgPSBtRnJhbWVDb3VudENoYW5nZWQ7Ci0gICAgbUZyYW1lQ291bnRDaGFuZ2VkID0gZmFsc2U7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxMb2NhbDo6dXBkYXRlKCkgewotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbExvY2FsOjpjb21taXQoKSB7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsTG9jYWw6OnVwZGF0ZShzaXplX3QpIHsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxMb2NhbDo6Y29tbWl0KHNpemVfdCkgewotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0QnVmZmVySGFsTG9jYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJiNjI0Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxMb2NhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9MT0NBTF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfTE9DQUxfSAotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEVmZmVjdEJ1ZmZlckhhbExvY2FsIDogcHVibGljIEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgdmlydHVhbCBhdWRpb19idWZmZXJfdCogYXVkaW9CdWZmZXIoKTsKLSAgICB2aXJ0dWFsIHZvaWQqIGV4dGVybmFsRGF0YSgpIGNvbnN0OwotCi0gICAgdmlydHVhbCB2b2lkIHNldEV4dGVybmFsRGF0YSh2b2lkKiBleHRlcm5hbCk7Ci0gICAgdmlydHVhbCB2b2lkIHNldEZyYW1lQ291bnQoc2l6ZV90IGZyYW1lQ291bnQpOwotICAgIHZpcnR1YWwgYm9vbCBjaGVja0ZyYW1lQ291bnRDaGFuZ2UoKTsKLQotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgY29tbWl0KCk7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZShzaXplX3Qgc2l6ZSk7Ci0gICAgdmlydHVhbCB2b2lkIGNvbW1pdChzaXplX3Qgc2l6ZSk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlOwotCi0gICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gbU93bkJ1ZmZlcjsKLSAgICBjb25zdCBzaXplX3QgbUJ1ZmZlclNpemU7Ci0gICAgYm9vbCBtRnJhbWVDb3VudENoYW5nZWQ7Ci0gICAgYXVkaW9fYnVmZmVyX3QgbUF1ZGlvQnVmZmVyOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIGV4cGxpY2l0IEVmZmVjdEJ1ZmZlckhhbExvY2FsKHNpemVfdCBzaXplKTsKLSAgICBFZmZlY3RCdWZmZXJIYWxMb2NhbCh2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUpOwotCi0gICAgdmlydHVhbCB+RWZmZWN0QnVmZmVySGFsTG9jYWwoKTsKLQotICAgIHN0YXR1c190IGluaXQoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfTE9DQUxfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RIYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFmYjZiYWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0SGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0SGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKLSNpbmNsdWRlICJIaWRsVXRpbHMuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6QXVkaW9CdWZmZXI7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpFZmZlY3RCdWZmZXJBY2Nlc3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpFZmZlY3RDb25maWdQYXJhbWV0ZXJzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6TWVzc2FnZVF1ZXVlRmxhZ0JpdHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0NoYW5uZWxNYXNrOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Gb3JtYXQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotRWZmZWN0SGFsSGlkbDo6RWZmZWN0SGFsSGlkbChjb25zdCBzcDxJRWZmZWN0PiYgZWZmZWN0LCB1aW50NjRfdCBlZmZlY3RJZCkKLSAgICAgICAgOiBtRWZmZWN0KGVmZmVjdCksIG1FZmZlY3RJZChlZmZlY3RJZCksIG1CdWZmZXJzQ2hhbmdlZCh0cnVlKSwgbUVmR3JvdXAobnVsbHB0cikgewotfQotCi1FZmZlY3RIYWxIaWRsOjp+RWZmZWN0SGFsSGlkbCgpIHsKLSAgICBpZiAobUVmZmVjdCAhPSAwKSB7Ci0gICAgICAgIGNsb3NlKCk7Ci0gICAgICAgIG1FZmZlY3QuY2xlYXIoKTsKLSAgICAgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLSAgICB9Ci0gICAgaWYgKG1FZkdyb3VwKSB7Ci0gICAgICAgIEV2ZW50RmxhZzo6ZGVsZXRlRXZlbnRGbGFnKCZtRWZHcm91cCk7Ci0gICAgfQotfQotCi0vLyBzdGF0aWMKLXZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0RGVzY3JpcHRvclRvSGFsKAotICAgICAgICBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiBkZXNjcmlwdG9yLCBlZmZlY3RfZGVzY3JpcHRvcl90KiBoYWxEZXNjcmlwdG9yKSB7Ci0gICAgSGlkbFV0aWxzOjp1dWlkVG9IYWwoZGVzY3JpcHRvci50eXBlLCAmaGFsRGVzY3JpcHRvci0+dHlwZSk7Ci0gICAgSGlkbFV0aWxzOjp1dWlkVG9IYWwoZGVzY3JpcHRvci51dWlkLCAmaGFsRGVzY3JpcHRvci0+dXVpZCk7Ci0gICAgaGFsRGVzY3JpcHRvci0+ZmxhZ3MgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZGVzY3JpcHRvci5mbGFncyk7Ci0gICAgaGFsRGVzY3JpcHRvci0+Y3B1TG9hZCA9IGRlc2NyaXB0b3IuY3B1TG9hZDsKLSAgICBoYWxEZXNjcmlwdG9yLT5tZW1vcnlVc2FnZSA9IGRlc2NyaXB0b3IubWVtb3J5VXNhZ2U7Ci0gICAgbWVtY3B5KGhhbERlc2NyaXB0b3ItPm5hbWUsIGRlc2NyaXB0b3IubmFtZS5kYXRhKCksIGRlc2NyaXB0b3IubmFtZS5zaXplKCkpOwotICAgIG1lbWNweShoYWxEZXNjcmlwdG9yLT5pbXBsZW1lbnRvciwKLSAgICAgICAgICAgIGRlc2NyaXB0b3IuaW1wbGVtZW50b3IuZGF0YSgpLCBkZXNjcmlwdG9yLmltcGxlbWVudG9yLnNpemUoKSk7Ci19Ci0KLS8vIFRPRE8obW5hZ2Fub3YpOiBUaGVzZSBidWZmZXIgY29udmVyc2lvbiBmdW5jdGlvbnMgc2hvdWxkIGJlIHNoYXJlZCB3aXRoIEVmZmVjdCB3cmFwcGVyCi0vLyB2aWEgSGlkbFV0aWxzLiBNb3ZlIHRoZW0gdGhlcmUgd2hlbiBoYXJkd2FyZS9pbnRlcmZhY2VzIHdpbGwgZ2V0IHVuLWZyb3plbiBhZ2Fpbi4KLQotLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoCi0gICAgICAgIGNvbnN0IGJ1ZmZlcl9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RCdWZmZXJDb25maWcqIGNvbmZpZykgewotICAgIGNvbmZpZy0+c2FtcGxpbmdSYXRlSHogPSBoYWxDb25maWcuc2FtcGxpbmdSYXRlOwotICAgIGNvbmZpZy0+Y2hhbm5lbHMgPSBBdWRpb0NoYW5uZWxNYXNrKGhhbENvbmZpZy5jaGFubmVscyk7Ci0gICAgY29uZmlnLT5mb3JtYXQgPSBBdWRpb0Zvcm1hdChoYWxDb25maWcuZm9ybWF0KTsKLSAgICBjb25maWctPmFjY2Vzc01vZGUgPSBFZmZlY3RCdWZmZXJBY2Nlc3MoaGFsQ29uZmlnLmFjY2Vzc01vZGUpOwotICAgIGNvbmZpZy0+bWFzayA9IEVmZmVjdENvbmZpZ1BhcmFtZXRlcnMoaGFsQ29uZmlnLm1hc2spOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoCi0gICAgICAgIGNvbnN0IEVmZmVjdEJ1ZmZlckNvbmZpZyYgY29uZmlnLCBidWZmZXJfY29uZmlnX3QqIGhhbENvbmZpZykgewotICAgIGhhbENvbmZpZy0+YnVmZmVyLmZyYW1lQ291bnQgPSAwOwotICAgIGhhbENvbmZpZy0+YnVmZmVyLnJhdyA9IE5VTEw7Ci0gICAgaGFsQ29uZmlnLT5zYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxpbmdSYXRlSHo7Ci0gICAgaGFsQ29uZmlnLT5jaGFubmVscyA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb25maWcuY2hhbm5lbHMpOwotICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKLSAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKLSAgICBoYWxDb25maWctPmZvcm1hdCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5mb3JtYXQpOwotICAgIGhhbENvbmZpZy0+YWNjZXNzTW9kZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5hY2Nlc3NNb2RlKTsKLSAgICBoYWxDb25maWctPm1hc2sgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb25maWcubWFzayk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RDb25maWdGcm9tSGFsKGNvbnN0IGVmZmVjdF9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RDb25maWcqIGNvbmZpZykgewotICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoaGFsQ29uZmlnLmlucHV0Q2ZnLCAmY29uZmlnLT5pbnB1dENmZyk7Ci0gICAgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbChoYWxDb25maWcub3V0cHV0Q2ZnLCAmY29uZmlnLT5vdXRwdXRDZmcpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0Q29uZmlnVG9IYWwoY29uc3QgRWZmZWN0Q29uZmlnJiBjb25maWcsIGVmZmVjdF9jb25maWdfdCogaGFsQ29uZmlnKSB7Ci0gICAgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoY29uZmlnLmlucHV0Q2ZnLCAmaGFsQ29uZmlnLT5pbnB1dENmZyk7Ci0gICAgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoY29uZmlnLm91dHB1dENmZywgJmhhbENvbmZpZy0+b3V0cHV0Q2ZnKTsKLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjphbmFseXplUmVzdWx0KGNvbnN0IFJlc3VsdCYgcmVzdWx0KSB7Ci0gICAgc3dpdGNoIChyZXN1bHQpIHsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok9LOiByZXR1cm4gT0s7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUzogcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfU1RBVEU6IHJldHVybiBOT1RfRU5PVUdIX0RBVEE7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ6IHJldHVybiBOT19JTklUOwotICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX1NVUFBPUlRFRDogcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICBjYXNlIFJlc3VsdDo6UkVTVUxUX1RPT19CSUc6IHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgIGRlZmF1bHQ6IHJldHVybiBOT19JTklUOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0SW5CdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKSB7Ci0gICAgaWYgKG1JbkJ1ZmZlciA9PSAwIHx8IGJ1ZmZlci0+YXVkaW9CdWZmZXIoKSAhPSBtSW5CdWZmZXItPmF1ZGlvQnVmZmVyKCkpIHsKLSAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gdHJ1ZTsKLSAgICB9Ci0gICAgbUluQnVmZmVyID0gYnVmZmVyOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0T3V0QnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcikgewotICAgIGlmIChtT3V0QnVmZmVyID09IDAgfHwgYnVmZmVyLT5hdWRpb0J1ZmZlcigpICE9IG1PdXRCdWZmZXItPmF1ZGlvQnVmZmVyKCkpIHsKLSAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gdHJ1ZTsKLSAgICB9Ci0gICAgbU91dEJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByb2Nlc3MoKSB7Ci0gICAgcmV0dXJuIHByb2Nlc3NJbXBsKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6UkVRVUVTVF9QUk9DRVNTKSk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByb2Nlc3NSZXZlcnNlKCkgewotICAgIHJldHVybiBwcm9jZXNzSW1wbChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OlJFUVVFU1RfUFJPQ0VTU19SRVZFUlNFKSk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByZXBhcmVGb3JQcm9jZXNzaW5nKCkgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gdGVtcFN0YXR1c01ROwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3QtPnByZXBhcmVGb3JQcm9jZXNzaW5nKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBNUURlc2NyaXB0b3JTeW5jPFJlc3VsdD4mIHN0YXR1c01RKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcFN0YXR1c01RLnJlc2V0KG5ldyBTdGF0dXNNUShzdGF0dXNNUSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAodGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgJiYgdGVtcFN0YXR1c01RLT5nZXRFdmVudEZsYWdXb3JkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50RmxhZzo6Y3JlYXRlRXZlbnRGbGFnKHRlbXBTdGF0dXNNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKCFyZXQuaXNPaygpIHx8IHJldHZhbCAhPSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXR2YWwpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIH0KLSAgICBpZiAoIXRlbXBTdGF0dXNNUSB8fCAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgfHwgIW1FZkdyb3VwKSB7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciBlZmZlY3RzIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCi0gICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciBlZmZlY3RzIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3IgZWZmZWN0cyBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIG1TdGF0dXNNUSA9IHN0ZDo6bW92ZSh0ZW1wU3RhdHVzTVEpOwotICAgIHJldHVybiBPSzsKLX0KLQotYm9vbCBFZmZlY3RIYWxIaWRsOjpuZWVkVG9SZXNldEJ1ZmZlcnMoKSB7Ci0gICAgaWYgKG1CdWZmZXJzQ2hhbmdlZCkgcmV0dXJuIHRydWU7Ci0gICAgYm9vbCBpbkJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkID0gbUluQnVmZmVyLT5jaGVja0ZyYW1lQ291bnRDaGFuZ2UoKTsKLSAgICBib29sIG91dEJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkID0gbU91dEJ1ZmZlci0+Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7Ci0gICAgcmV0dXJuIGluQnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQgfHwgb3V0QnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQ7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByb2Nlc3NJbXBsKHVpbnQzMl90IG1xRmxhZykgewotICAgIGlmIChtRWZmZWN0ID09IDAgfHwgbUluQnVmZmVyID09IDAgfHwgbU91dEJ1ZmZlciA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgaWYgKCFtU3RhdHVzTVEgJiYgKHN0YXR1cyA9IHByZXBhcmVGb3JQcm9jZXNzaW5nKCkpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIGlmIChuZWVkVG9SZXNldEJ1ZmZlcnMoKSAmJiAoc3RhdHVzID0gc2V0UHJvY2Vzc0J1ZmZlcnMoKSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgLy8gVGhlIGRhdGEgaXMgYWxyZWFkeSBpbiB0aGUgYnVmZmVycywganVzdCBuZWVkIHRvIGZsdXNoIGl0IGFuZCB3YWtlIHVwIHRoZSBzZXJ2ZXIgc2lkZS4KLSAgICBzdGQ6OmF0b21pY190aHJlYWRfZmVuY2Uoc3RkOjptZW1vcnlfb3JkZXJfcmVsZWFzZSk7Ci0gICAgbUVmR3JvdXAtPndha2UobXFGbGFnKTsKLSAgICB1aW50MzJfdCBlZlN0YXRlID0gMDsKLXJldHJ5OgotICAgIHN0YXR1c190IHJldCA9IG1FZkdyb3VwLT53YWl0KAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpET05FX1BST0NFU1NJTkcpLCAmZWZTdGF0ZSk7Ci0gICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OkRPTkVfUFJPQ0VTU0lORykpIHsKLSAgICAgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgICAgICBtU3RhdHVzTVEtPnJlYWQoJnJldHZhbCk7Ci0gICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSyB8fCByZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX1NUQVRFKSB7Ci0gICAgICAgICAgICAvLyBTeW5jIGJhY2sgdGhlIGNoYW5nZWQgY29udGVudHMgb2YgdGhlIGJ1ZmZlci4KLSAgICAgICAgICAgIHN0ZDo6YXRvbWljX3RocmVhZF9mZW5jZShzdGQ6Om1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5hbHl6ZVJlc3VsdChyZXR2YWwpOwotICAgIH0KLSAgICBpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FSU5UUikgewotICAgICAgICAvLyBTcHVyaW91cyB3YWtldXAuIFRoaXMgbm9ybWFsbHkgcmV0cmllcyBubyBtb3JlIHRoYW4gb25jZS4KLSAgICAgICAgZ290byByZXRyeTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0UHJvY2Vzc0J1ZmZlcnMoKSB7Ci0gICAgUmV0dXJuPFJlc3VsdD4gcmV0ID0gbUVmZmVjdC0+c2V0UHJvY2Vzc0J1ZmZlcnMoCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RCdWZmZXJIYWxIaWRsKj4obUluQnVmZmVyLmdldCgpKS0+aGlkbEJ1ZmZlcigpLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KG1PdXRCdWZmZXIuZ2V0KCkpLT5oaWRsQnVmZmVyKCkpOwotICAgIGlmIChyZXQuaXNPaygpICYmIHJldCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGZhbHNlOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAotICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7Ci0gICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0KLSAgICAvLyBTcGVjaWFsIGNhc2VzLgotICAgIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX0NPTkZJRyB8fCBjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX0NPTkZJR19SRVZFUlNFKSB7Ci0gICAgICAgIHJldHVybiBzZXRDb25maWdJbXBsKGNtZENvZGUsIGNtZFNpemUsIHBDbWREYXRhLCByZXBseVNpemUsIHBSZXBseURhdGEpOwotICAgIH0gZWxzZSBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0dFVF9DT05GSUcgfHwgY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0dFVF9DT05GSUdfUkVWRVJTRSkgewotICAgICAgICByZXR1cm4gZ2V0Q29uZmlnSW1wbChjbWRDb2RlLCByZXBseVNpemUsIHBSZXBseURhdGEpOwotICAgIH0KLQotICAgIC8vIENvbW1vbiBjYXNlLgotICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IGhpZGxEYXRhOwotICAgIGlmIChwQ21kRGF0YSAhPSBudWxscHRyICYmIGNtZFNpemUgPiAwKSB7Ci0gICAgICAgIGhpZGxEYXRhLnNldFRvRXh0ZXJuYWwocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4ocENtZERhdGEpLCBjbWRTaXplKTsKLSAgICB9Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIHVpbnQzMl90IHJlcGx5U2l6ZVN0dWIgPSAwOwotICAgIGlmIChyZXBseVNpemUgPT0gbnVsbHB0ciB8fCBwUmVwbHlEYXRhID09IG51bGxwdHIpIHJlcGx5U2l6ZSA9ICZyZXBseVNpemVTdHViOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5jb21tYW5kKGNtZENvZGUsIGhpZGxEYXRhLCAqcmVwbHlTaXplLAotICAgICAgICAgICAgWyZdKGludDMyX3QgcywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgqcmVwbHlTaXplID4gcmVzdWx0LnNpemUoKSkgKnJlcGx5U2l6ZSA9IHJlc3VsdC5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhICE9IG51bGxwdHIgJiYgKnJlcGx5U2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShwUmVwbHlEYXRhLCAmcmVzdWx0WzBdLCAqcmVwbHlTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiByZXQuaXNPaygpID8gc3RhdHVzIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpnZXREZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7Ci0gICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5nZXREZXNjcmlwdG9yKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBlZmZlY3REZXNjcmlwdG9yVG9IYWwocmVzdWx0LCBwRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldHZhbCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmNsb3NlKCkgewotICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IG1FZmZlY3QtPmNsb3NlKCk7Ci0gICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmdldENvbmZpZ0ltcGwoCi0gICAgICAgIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKLSAgICBpZiAocmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSB8fCBwUmVwbHlEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIFJldHVybjx2b2lkPiByZXQ7Ci0gICAgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHKSB7Ci0gICAgICAgIHJldCA9IG1FZmZlY3QtPmdldENvbmZpZyhbJl0gKFJlc3VsdCByLCBjb25zdCBFZmZlY3RDb25maWcgJmhpZGxDb25maWcpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGFuYWx5emVSZXN1bHQocik7Ci0gICAgICAgICAgICBpZiAociA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgZWZmZWN0Q29uZmlnVG9IYWwoaGlkbENvbmZpZywgc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocFJlcGx5RGF0YSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXQgPSBtRWZmZWN0LT5nZXRDb25maWdSZXZlcnNlKFsmXSAoUmVzdWx0IHIsIGNvbnN0IEVmZmVjdENvbmZpZyAmaGlkbENvbmZpZykgewotICAgICAgICAgICAgcmVzdWx0ID0gYW5hbHl6ZVJlc3VsdChyKTsKLSAgICAgICAgICAgIGlmIChyID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICBlZmZlY3RDb25maWdUb0hhbChoaWRsQ29uZmlnLCBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwUmVwbHlEYXRhKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLSAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgcmVzdWx0ID0gRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRDb25maWdJbXBsKAotICAgICAgICB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgewotICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgfHwKLSAgICAgICAgICAgIHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludDMyX3QpIHx8IHBSZXBseURhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBjb25zdCBlZmZlY3RfY29uZmlnX3QgKmhhbENvbmZpZyA9IHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBDbWREYXRhKTsKLSAgICBpZiAoaGFsQ29uZmlnLT5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgIT0gTlVMTCB8fAotICAgICAgICAgICAgaGFsQ29uZmlnLT5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyICE9IE5VTEwgfHwKLSAgICAgICAgICAgIGhhbENvbmZpZy0+b3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciAhPSBOVUxMIHx8Ci0gICAgICAgICAgICBoYWxDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkJ1ZmZlciBwcm92aWRlciBjYWxsYmFja3MgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICB9Ci0gICAgRWZmZWN0Q29uZmlnIGhpZGxDb25maWc7Ci0gICAgZWZmZWN0Q29uZmlnRnJvbUhhbCgqaGFsQ29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgUmV0dXJuPFJlc3VsdD4gcmV0ID0gY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgPwotICAgICAgICAgICAgbUVmZmVjdC0+c2V0Q29uZmlnKGhpZGxDb25maWcsIG51bGxwdHIsIG51bGxwdHIpIDoKLSAgICAgICAgICAgIG1FZmZlY3QtPnNldENvbmZpZ1JldmVyc2UoaGlkbENvbmZpZywgbnVsbHB0ciwgbnVsbHB0cik7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgIHJlc3VsdCA9IGFuYWx5emVSZXN1bHQocmV0KTsKLSAgICAgICAgKnN0YXRpY19jYXN0PGludDMyX3QqPihwUmVwbHlEYXRhKSA9IHJlc3VsdDsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0SGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0SGFsTG9jYWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDQ2NWMzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdEhhbExvY2FsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkVmZmVjdEhhbExvY2FsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkVmZmVjdEhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotRWZmZWN0SGFsTG9jYWw6OkVmZmVjdEhhbExvY2FsKGVmZmVjdF9oYW5kbGVfdCBoYW5kbGUpCi0gICAgICAgIDogbUhhbmRsZShoYW5kbGUpIHsKLX0KLQotRWZmZWN0SGFsTG9jYWw6On5FZmZlY3RIYWxMb2NhbCgpIHsKLSAgICBpbnQgc3RhdHVzID0gRWZmZWN0UmVsZWFzZShtSGFuZGxlKTsKLSAgICBBTE9HV19JRihzdGF0dXMsICJFcnJvciByZWxlYXNpbmcgZWZmZWN0ICVwOiAlcyIsIG1IYW5kbGUsIHN0cmVycm9yKC1zdGF0dXMpKTsKLSAgICBtSGFuZGxlID0gMDsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsTG9jYWw6OnNldEluQnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcikgewotICAgIG1JbkJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbExvY2FsOjpzZXRPdXRCdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKSB7Ci0gICAgbU91dEJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbExvY2FsOjpwcm9jZXNzKCkgewotICAgIGlmIChtSW5CdWZmZXIgPT0gbnVsbHB0ciB8fCBtT3V0QnVmZmVyID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0VfSUYobUluQnVmZmVyID09IG51bGxwdHIsICJJbnB1dCBidWZmZXIgbm90IHNldCIpOwotICAgICAgICBBTE9HRV9JRihtT3V0QnVmZmVyID09IG51bGxwdHIsICJPdXRwdXQgYnVmZmVyIG5vdCBzZXQiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiAoKm1IYW5kbGUpLT5wcm9jZXNzKG1IYW5kbGUsIG1JbkJ1ZmZlci0+YXVkaW9CdWZmZXIoKSwgbU91dEJ1ZmZlci0+YXVkaW9CdWZmZXIoKSk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbExvY2FsOjpwcm9jZXNzUmV2ZXJzZSgpIHsKLSAgICBpZiAoKCptSGFuZGxlKS0+cHJvY2Vzc19yZXZlcnNlICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKG1JbkJ1ZmZlciA9PSBudWxscHRyIHx8IG1PdXRCdWZmZXIgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0VfSUYobUluQnVmZmVyID09IG51bGxwdHIsICJJbnB1dCBidWZmZXIgbm90IHNldCIpOwotICAgICAgICAgICAgQUxPR0VfSUYobU91dEJ1ZmZlciA9PSBudWxscHRyLCAiT3V0cHV0IGJ1ZmZlciBub3Qgc2V0Iik7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKCptSGFuZGxlKS0+cHJvY2Vzc19yZXZlcnNlKAotICAgICAgICAgICAgICAgIG1IYW5kbGUsIG1JbkJ1ZmZlci0+YXVkaW9CdWZmZXIoKSwgbU91dEJ1ZmZlci0+YXVkaW9CdWZmZXIoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsTG9jYWw6OmNvbW1hbmQodWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsCi0gICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKLSAgICByZXR1cm4gKCptSGFuZGxlKS0+Y29tbWFuZChtSGFuZGxlLCBjbWRDb2RlLCBjbWRTaXplLCBwQ21kRGF0YSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsTG9jYWw6OmdldERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKLSAgICByZXR1cm4gKCptSGFuZGxlKS0+Z2V0X2Rlc2NyaXB0b3IobUhhbmRsZSwgcERlc2NyaXB0b3IpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxMb2NhbDo6Y2xvc2UoKSB7Ci0gICAgcmV0dXJuIE9LOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0SGFsTG9jYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkzZmI1MC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RIYWxMb2NhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0xPQ0FMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0xPQ0FMX0gKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEVmZmVjdEhhbExvY2FsIDogcHVibGljIEVmZmVjdEhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gU2V0IHRoZSBpbnB1dCBidWZmZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpOwotCi0gICAgLy8gU2V0IHRoZSBvdXRwdXQgYnVmZmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0QnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcik7Ci0KLSAgICAvLyBFZmZlY3QgcHJvY2VzcyBmdW5jdGlvbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3MoKTsKLQotICAgIC8vIFByb2Nlc3MgcmV2ZXJzZSBzdHJlYW0gZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwYXNzCi0gICAgLy8gYSByZWZlcmVuY2Ugc3RyZWFtIHRvIHRoZSBlZmZlY3QgZW5naW5lLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2Vzc1JldmVyc2UoKTsKLQotICAgIC8vIFNlbmQgYSBjb21tYW5kIGFuZCByZWNlaXZlIGEgcmVzcG9uc2UgdG8vZnJvbSBlZmZlY3QgZW5naW5lLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpOwotCi0gICAgLy8gUmV0dXJucyB0aGUgZWZmZWN0IGRlc2NyaXB0b3IuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKLQotICAgIC8vIEZyZWUgcmVzb3VyY2VzIG9uIHRoZSByZW1vdGUgc2lkZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCk7Ci0KLSAgICAvLyBXaGV0aGVyIGl0J3MgYSBsb2NhbCBpbXBsZW1lbnRhdGlvbi4KLSAgICB2aXJ0dWFsIGJvb2wgaXNMb2NhbCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAgIGVmZmVjdF9oYW5kbGVfdCBoYW5kbGUoKSBjb25zdCB7IHJldHVybiBtSGFuZGxlOyB9Ci0KLSAgcHJpdmF0ZToKLSAgICBlZmZlY3RfaGFuZGxlX3QgbUhhbmRsZTsKLSAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IG1JbkJ1ZmZlcjsKLSAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IG1PdXRCdWZmZXI7Ci0KLSAgICBmcmllbmQgY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxMb2NhbDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBFZmZlY3RIYWxMb2NhbChlZmZlY3RfaGFuZGxlX3QgaGFuZGxlKTsKLQotICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgcmVsZWFzZXMgdGhlIGVmZmVjdC4KLSAgICB2aXJ0dWFsIH5FZmZlY3RIYWxMb2NhbCgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0xPQ0FMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODA4MWI3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbC5oIgotI2luY2x1ZGUgIkhpZGxVdGlscy5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpVdWlkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6SUVmZmVjdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBzdGF0aWMKLXNwPEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlPiBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTo6Y3JlYXRlKCkgewotICAgIHJldHVybiBuZXcgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCk7Ci19Ci0KLS8vIHN0YXRpYwotYm9vbCBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTo6aXNOdWxsVXVpZChjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCkgewotICAgIHJldHVybiBtZW1jbXAocEVmZmVjdFV1aWQsIEVGRkVDVF9VVUlEX05VTEwsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMDsKLX0KLQotRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKSA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJFZmZlY3RzRmFjdG9yeSIpIHsKLSAgICBtRWZmZWN0c0ZhY3RvcnkgPSBJRWZmZWN0c0ZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvYnRhaW4gSUVmZmVjdHNGYWN0b3J5IHNlcnZpY2UsIHRlcm1pbmF0aW5nIHByb2Nlc3MuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotfQotCi1FZmZlY3RzRmFjdG9yeUhhbEhpZGw6On5FZmZlY3RzRmFjdG9yeUhhbEhpZGwoKSB7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6cXVlcnlBbGxEZXNjcmlwdG9ycygpIHsKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5nZXRBbGxEZXNjcmlwdG9ycygKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8RWZmZWN0RGVzY3JpcHRvcj4mIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0RGVzY3JpcHRvcnMgPSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgcmV0dXJuIHJldHZhbCA9PSBSZXN1bHQ6Ok9LID8gT0sgOiBOT19JTklUOwotICAgIH0KLSAgICBtTGFzdERlc2NyaXB0b3JzLnJlc2l6ZSgwKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6cXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpwTnVtRWZmZWN0cykgewotICAgIHN0YXR1c190IHF1ZXJ5UmVzdWx0ID0gcXVlcnlBbGxEZXNjcmlwdG9ycygpOwotICAgIGlmIChxdWVyeVJlc3VsdCA9PSBPSykgewotICAgICAgICAqcE51bUVmZmVjdHMgPSBtTGFzdERlc2NyaXB0b3JzLnNpemUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHF1ZXJ5UmVzdWx0OwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmdldERlc2NyaXB0b3IoCi0gICAgICAgIHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgewotICAgIC8vIFRPRE86IFdlIG5lZWQgc29tZWhvdyB0byB0cmFjayB0aGUgY2hhbmdlcyBvbiB0aGUgc2VydmVyIHNpZGUKLSAgICAvLyBvciBmaWd1cmUgb3V0IGhvdyB0byBjb252ZXJ0IGV2ZXJ5Ym9keSB0byBxdWVyeSBhbGwgdGhlIGRlc2NyaXB0b3JzIGF0IG9uY2UuCi0gICAgLy8gVE9ETzogY2hlY2sgZm9yIG51bGxwdHIKLSAgICBpZiAobUxhc3REZXNjcmlwdG9ycy5zaXplKCkgPT0gMCkgewotICAgICAgICBzdGF0dXNfdCBxdWVyeVJlc3VsdCA9IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKLSAgICAgICAgaWYgKHF1ZXJ5UmVzdWx0ICE9IE9LKSByZXR1cm4gcXVlcnlSZXN1bHQ7Ci0gICAgfQotICAgIGlmIChpbmRleCA+PSBtTGFzdERlc2NyaXB0b3JzLnNpemUoKSkgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotICAgIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbChtTGFzdERlc2NyaXB0b3JzW2luZGV4XSwgcERlc2NyaXB0b3IpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpnZXREZXNjcmlwdG9yKAotICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKLSAgICAvLyBUT0RPOiBjaGVjayBmb3IgbnVsbHB0cgotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgVXVpZCBoaWRsVXVpZDsKLSAgICBIaWRsVXRpbHM6OnV1aWRGcm9tSGFsKCpwRWZmZWN0VXVpZCwgJmhpZGxVdWlkKTsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Z2V0RGVzY3JpcHRvcihoaWRsVXVpZCwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0RGVzY3JpcHRvclRvSGFsKHJlc3VsdCwgcERlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgcmV0dXJuIE9LOwotICAgICAgICBlbHNlIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUykgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotICAgICAgICBlbHNlIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Y3JlYXRlRWZmZWN0KAotICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCwKLSAgICAgICAgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiAqZWZmZWN0KSB7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBVdWlkIGhpZGxVdWlkOwotICAgIEhpZGxVdGlsczo6dXVpZEZyb21IYWwoKnBFZmZlY3RVdWlkLCAmaGlkbFV1aWQpOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5jcmVhdGVFZmZlY3QoCi0gICAgICAgICAgICBoaWRsVXVpZCwgc2Vzc2lvbklkLCBpb0lkLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJRWZmZWN0PiYgcmVzdWx0LCB1aW50NjRfdCBlZmZlY3RJZCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICplZmZlY3QgPSBuZXcgRWZmZWN0SGFsSGlkbChyZXN1bHQsIGVmZmVjdElkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHJldHVybiBPSzsKLSAgICAgICAgZWxzZSBpZiAocmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFMpIHJldHVybiBOQU1FX05PVF9GT1VORDsKLSAgICAgICAgZWxzZSByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmR1bXBFZmZlY3RzKGludCBmZCkgewotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7Ci0gICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmRlYnVnRHVtcChoaWRsSGFuZGxlKTsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4OWYwNDIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzIuMC9JRWZmZWN0c0ZhY3RvcnkuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC8yLjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkVmZmVjdERlc2NyaXB0b3I7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpJRWZmZWN0c0ZhY3Rvcnk7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLQotY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsIDogcHVibGljIEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKLXsKLSAgcHVibGljOgotICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgZWZmZWN0cyBpbiBhbGwgbG9hZGVkIGxpYnJhcmllcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpOwotCi0gICAgLy8gUmV0dXJucyBhIGRlc2NyaXB0b3Igb2YgdGhlIG5leHQgYXZhaWxhYmxlIGVmZmVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IodWludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCi0gICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7Ci0KLSAgICAvLyBDcmVhdGVzIGFuIGVmZmVjdCBlbmdpbmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotICAgIC8vIFRvIHJlbGVhc2UgdGhlIGVmZmVjdCBlbmdpbmUsIGl0IGlzIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMKLSAgICAvLyB0byB0aGUgcmV0dXJuZWQgZWZmZWN0IG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwKLSAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsCi0gICAgICAgICAgICBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+ICplZmZlY3QpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wRWZmZWN0cyhpbnQgZmQpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOwotCi0gICAgc3A8SUVmZmVjdHNGYWN0b3J5PiBtRWZmZWN0c0ZhY3Rvcnk7Ci0gICAgaGlkbF92ZWM8RWZmZWN0RGVzY3JpcHRvcj4gbUxhc3REZXNjcmlwdG9yczsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKTsKLSAgICB2aXJ0dWFsIH5FZmZlY3RzRmFjdG9yeUhhbEhpZGwoKTsKLQotICAgIHN0YXR1c190IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWQxZmEyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvMi4wL0lFZmZlY3RzRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzQuMC9JRWZmZWN0c0ZhY3RvcnkuaD4KKworI2luY2x1ZGUgPEVmZmVjdHNGYWN0b3J5SGFsSGlkbC5oPgorI2luY2x1ZGUgPGxpYmF1ZGlvaGFsLzQuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0YXRpYworc3A8RWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U+IEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOjpjcmVhdGUoKSB7CisgICAgaWYgKGhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpJRWZmZWN0c0ZhY3Rvcnk6OmdldFNlcnZpY2UoKSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBuZXcgVjRfMDo6RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCk7CisgICAgfQorICAgIGlmIChoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6SUVmZmVjdHNGYWN0b3J5OjpnZXRTZXJ2aWNlKCkgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbmV3IEVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworLy8gc3RhdGljCitib29sIEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOjppc051bGxVdWlkKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkKSB7CisgICAgcmV0dXJuIG1lbWNtcChwRWZmZWN0VXVpZCwgRUZGRUNUX1VVSURfTlVMTCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsTG9jYWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmRlZjVkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsTG9jYWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgotCi0jaW5jbHVkZSAiRWZmZWN0SGFsTG9jYWwuaCIKLSNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gc3RhdGljCi1zcDxFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZT4gRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U6OmNyZWF0ZSgpIHsKLSAgICByZXR1cm4gbmV3IEVmZmVjdHNGYWN0b3J5SGFsTG9jYWwoKTsKLX0KLQotLy8gc3RhdGljCi1ib29sIEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOjppc051bGxVdWlkKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkKSB7Ci0gICAgcmV0dXJuIEVmZmVjdElzTnVsbFV1aWQocEVmZmVjdFV1aWQpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbExvY2FsOjpxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKSB7Ci0gICAgcmV0dXJuIEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cyhwTnVtRWZmZWN0cyk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsTG9jYWw6OmdldERlc2NyaXB0b3IoCi0gICAgICAgIHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgewotICAgIHJldHVybiBFZmZlY3RRdWVyeUVmZmVjdChpbmRleCwgcERlc2NyaXB0b3IpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbExvY2FsOjpnZXREZXNjcmlwdG9yKAotICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKLSAgICByZXR1cm4gRWZmZWN0R2V0RGVzY3JpcHRvcihwRWZmZWN0VXVpZCwgcERlc2NyaXB0b3IpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbExvY2FsOjpjcmVhdGVFZmZlY3QoCi0gICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLAotICAgICAgICBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+ICplZmZlY3QpIHsKLSAgICBlZmZlY3RfaGFuZGxlX3QgaGFuZGxlOwotICAgIGludCByZXN1bHQgPSBFZmZlY3RDcmVhdGUocEVmZmVjdFV1aWQsIHNlc3Npb25JZCwgaW9JZCwgJmhhbmRsZSk7Ci0gICAgaWYgKHJlc3VsdCA9PSAwKSB7Ci0gICAgICAgICplZmZlY3QgPSBuZXcgRWZmZWN0SGFsTG9jYWwoaGFuZGxlKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxMb2NhbDo6ZHVtcEVmZmVjdHMoaW50IGZkKSB7Ci0gICAgcmV0dXJuIEVmZmVjdER1bXBFZmZlY3RzKGZkKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxMb2NhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWI4MWJlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsTG9jYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9MT0NBTF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9MT0NBTF9ICi0KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEVmZmVjdHNGYWN0b3J5SGFsTG9jYWwgOiBwdWJsaWMgRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgZWZmZWN0cyBpbiBhbGwgbG9hZGVkIGxpYnJhcmllcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpOwotCi0gICAgLy8gUmV0dXJucyBhIGRlc2NyaXB0b3Igb2YgdGhlIG5leHQgYXZhaWxhYmxlIGVmZmVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IodWludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCi0gICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7Ci0KLSAgICAvLyBDcmVhdGVzIGFuIGVmZmVjdCBlbmdpbmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotICAgIC8vIFRvIHJlbGVhc2UgdGhlIGVmZmVjdCBlbmdpbmUsIGl0IGlzIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMKLSAgICAvLyB0byB0aGUgcmV0dXJuZWQgZWZmZWN0IG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwKLSAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsCi0gICAgICAgICAgICBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+ICplZmZlY3QpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wRWZmZWN0cyhpbnQgZmQpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIEVmZmVjdHNGYWN0b3J5SGFsTG9jYWwoKSB7fQotCi0gICAgdmlydHVhbCB+RWZmZWN0c0ZhY3RvcnlIYWxMb2NhbCgpIHt9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfTE9DQUxfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvSGFsRGVhdGhIYW5kbGVySGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9IYWxEZWF0aEhhbmRsZXJIaWRsLmNwcAppbmRleCBhNzQyNjcxLi4xZTNhYjU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9IYWxEZWF0aEhhbmRsZXJIaWRsLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9IYWxEZWF0aEhhbmRsZXJIaWRsLmNwcApAQCAtNDgsMTIgKzQ4LDEzIEBACiAKIHZvaWQgSGFsRGVhdGhIYW5kbGVyOjpzZXJ2aWNlRGllZCh1aW50NjRfdCAvKmNvb2tpZSovLCBjb25zdCB3cDxJQmFzZT4mIC8qd2hvKi8pIHsKICAgICAvLyBObyBtYXR0ZXIgd2hpY2ggb2YgdGhlIHNlcnZpY2Ugb2JqZWN0cyBoYXMgZGllZCwKLSAgICAvLyB3ZSBuZWVkIHRvIHJ1biBhbGwgdGhlIHJlZ2lzdGVyZWQgaGFuZGxlcnMgYW5kIGNyYXNoIG91ciBwcm9jZXNzLgorICAgIC8vIHdlIG5lZWQgdG8gcnVuIGFsbCB0aGUgcmVnaXN0ZXJlZCBoYW5kbGVycyBhbmQgZXhpdC4KICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gZ3VhcmQobUhhbmRsZXJzTG9jayk7CiAgICAgZm9yIChjb25zdCBhdXRvJiBoYW5kbGVyIDogbUhhbmRsZXJzKSB7CiAgICAgICAgIGhhbmRsZXIuc2Vjb25kKCk7CiAgICAgfQotICAgIExPR19BTFdBWVNfRkFUQUwoIkhBTCBzZXJ2ZXIgY3Jhc2hlZCwgbmVlZCB0byByZXN0YXJ0Iik7CisgICAgQUxPR0UoIkhBTCBzZXJ2ZXIgY3Jhc2hlZCwgYXVkaW8gc2VydmVyIGlzIHJlc3RhcnRpbmciKTsKKyAgICBleGl0KDEpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2FmYTM2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlN0cmVhbUhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JU3RyZWFtT3V0Q2FsbGJhY2suaD4KLSNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCi0jaW5jbHVkZSAiU3RyZWFtSGFsSGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0NoYW5uZWxNYXNrOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Gb3JtYXQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpUaHJlYWRJbmZvOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OkF1ZGlvRHJhaW47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbU91dENhbGxiYWNrOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6Ok1lc3NhZ2VRdWV1ZUZsYWdCaXRzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6Ok1tYXBCdWZmZXJJbmZvOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6Ok1tYXBQb3NpdGlvbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpQYXJhbWV0ZXJWYWx1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6VGltZVNwZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKLXVzaW5nIFJlYWRDb21tYW5kID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1Jbjo6UmVhZENvbW1hbmQ7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotU3RyZWFtSGFsSGlkbDo6U3RyZWFtSGFsSGlkbChJU3RyZWFtICpzdHJlYW0pCi0gICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIlN0cmVhbSIpLAotICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSwKLSAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHkoSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUKSwKLSAgICAgICAgICBtQ2FjaGVkQnVmZmVyU2l6ZSgwKXsKLQotICAgIC8vIEluc3RydW1lbnQgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCi0gICAgLy8gTm90ZTogVGhpcyBhc3N1bWVzIGNoYW5uZWwgbWFzaywgZm9ybWF0LCBhbmQgc2FtcGxlIHJhdGUgZG8gbm90IGNoYW5nZSBhZnRlciBjcmVhdGlvbi4KLSAgICBpZiAobVN0cmVhbSAhPSBudWxscHRyICYmIG1TdHJlYW1Qb3dlckxvZy5pc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSkgewotICAgICAgICAvLyBPYnRhaW4gYXVkaW8gcHJvcGVydGllcyAoc2VlIFN0cmVhbUhhbEhpZGw6OmdldEF1ZGlvUHJvcGVydGllcygpIGJlbG93KS4KLSAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICBbJl0odWludDMyX3Qgc3IsIEF1ZGlvQ2hhbm5lbE1hc2sgbSwgQXVkaW9Gb3JtYXQgZikgewotICAgICAgICAgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KHNyLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpKTsKLSAgICAgICAgICAgIH0pOwotICAgIH0KLX0KLQotU3RyZWFtSGFsSGlkbDo6flN0cmVhbUhhbEhpZGwoKSB7Ci0gICAgbVN0cmVhbSA9IG51bGxwdHI7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRTYW1wbGVSYXRlIiwgbVN0cmVhbS0+Z2V0U2FtcGxlUmF0ZSgpLCByYXRlKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oImdldEJ1ZmZlclNpemUiLCBtU3RyZWFtLT5nZXRCdWZmZXJTaXplKCksIHNpemUpOwotICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgbUNhY2hlZEJ1ZmZlclNpemUgPSAqc2l6ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRDaGFubmVsTWFzayIsIG1TdHJlYW0tPmdldENoYW5uZWxNYXNrKCksIG1hc2spOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZvcm1hdCIsIG1TdHJlYW0tPmdldEZvcm1hdCgpLCBmb3JtYXQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgIFsmXSh1aW50MzJfdCBzciwgQXVkaW9DaGFubmVsTWFzayBtLCBBdWRpb0Zvcm1hdCBmKSB7Ci0gICAgICAgICAgICAgICAgKnNhbXBsZVJhdGUgPSBzcjsKLSAgICAgICAgICAgICAgICAqbWFzayA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihtKTsKLSAgICAgICAgICAgICAgICAqZm9ybWF0ID0gc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpOwotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEF1ZGlvUHJvcGVydGllcyIsIHJldCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGhpZGxQYXJhbXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyYW1ldGVyc0Zyb21IYWwoa3ZQYWlycywgJmhpZGxQYXJhbXMpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFBhcmFtZXRlcnMiLCBtU3RyZWFtLT5zZXRQYXJhbWV0ZXJzKGhpZGxQYXJhbXMpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKLSAgICB2YWx1ZXMtPmNsZWFyKCk7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gaGlkbEtleXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0ga2V5c0Zyb21IYWwoa2V5cywgJmhpZGxLZXlzKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFBhcmFtZXRlcnMoCi0gICAgICAgICAgICBoaWRsS2V5cywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1RvSGFsKHBhcmFtZXRlcnMsIHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFBhcmFtZXRlcnMiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImFkZEVmZmVjdCIsIG1TdHJlYW0tPmFkZEVmZmVjdCgKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0SGFsSGlkbCo+KGVmZmVjdC5nZXQoKSktPmVmZmVjdElkKCkpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6cmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicmVtb3ZlRWZmZWN0IiwgbVN0cmVhbS0+cmVtb3ZlRWZmZWN0KAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxIaWRsKj4oZWZmZWN0LmdldCgpKS0+ZWZmZWN0SWQoKSkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzdGFuZGJ5KCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0YW5kYnkiLCBtU3RyZWFtLT5zdGFuZGJ5KCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpkdW1wKGludCBmZCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7Ci0gICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5kZWJ1Z0R1bXAoaGlkbEhhbmRsZSk7Ci0gICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7Ci0gICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJkdW1wIiwgcmV0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RhcnQoKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RhcnQiLCBtU3RyZWFtLT5zdGFydCgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RvcCgpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdG9wIiwgbVN0cmVhbS0+c3RvcCgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5jcmVhdGVNbWFwQnVmZmVyKAotICAgICAgICAgICAgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTW1hcEJ1ZmZlckluZm8mIGhpZGxJbmZvKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZSAqaGFuZGxlID0gaGlkbEluZm8uc2hhcmVkTWVtb3J5LmhhbmRsZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlLT5udW1GZHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zaGFyZWRfbWVtb3J5X2ZkID0gaGFuZGxlLT5kYXRhWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVmZmVyX3NpemVfZnJhbWVzID0gaGlkbEluZm8uYnVmZmVyU2l6ZUZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1cnN0X3NpemVfZnJhbWVzID0gaGlkbEluZm8uYnVyc3RTaXplRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5mby0+c2hhcmVkX21lbW9yeV9hZGRyZXNzIGlzIG5vdCBuZWVkZWQgaW4gSElETCBjb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zaGFyZWRfbWVtb3J5X2FkZHJlc3MgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiY3JlYXRlTW1hcEJ1ZmZlciIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgewotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldE1tYXBQb3NpdGlvbigKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTW1hcFBvc2l0aW9uJiBoaWRsUG9zaXRpb24pIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi0+dGltZV9uYW5vc2Vjb25kcyA9IGhpZGxQb3NpdGlvbi50aW1lTmFub3NlY29uZHM7Ci0gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLT5wb3NpdGlvbl9mcmFtZXMgPSBoaWRsUG9zaXRpb24ucG9zaXRpb25GcmFtZXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1tYXBQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KSB7Ci0gICAgbUhhbFRocmVhZFByaW9yaXR5ID0gcHJpb3JpdHk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRDYWNoZWRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgewotICAgIGlmIChtQ2FjaGVkQnVmZmVyU2l6ZSAhPSAwKSB7Ci0gICAgICAgICpzaXplID0gbUNhY2hlZEJ1ZmZlclNpemU7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgcmV0dXJuIGdldEJ1ZmZlclNpemUoc2l6ZSk7Ci19Ci0KLWJvb2wgU3RyZWFtSGFsSGlkbDo6cmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KHBpZF90IHRocmVhZFBpZCwgcGlkX3QgdGhyZWFkSWQpIHsKLSAgICBpZiAobUhhbFRocmVhZFByaW9yaXR5ID09IEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaW50IGVyciA9IHJlcXVlc3RQcmlvcml0eSgKLSAgICAgICAgICAgIHRocmVhZFBpZCwgdGhyZWFkSWQsCi0gICAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHksIGZhbHNlIC8qaXNGb3JBcHAqLywgdHJ1ZSAvKmFzeW5jaHJvbm91cyovKTsKLSAgICBBTE9HRV9JRihlcnIsICJmYWlsZWQgdG8gc2V0IHByaW9yaXR5ICVkIGZvciBwaWQgJWQgdGlkICVkOyBlcnJvciAlZCIsCi0gICAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHksIHRocmVhZFBpZCwgdGhyZWFkSWQsIGVycik7Ci0gICAgLy8gQXVkaW8gd2lsbCBzdGlsbCB3b3JrLCBidXQgbGF0ZW5jeSB3aWxsIGJlIGhpZ2hlciBhbmQgc29tZXRpbWVzIHVuYWNjZXB0YWJsZS4KLSAgICByZXR1cm4gZXJyID09IDA7Ci19Ci0KLW5hbWVzcGFjZSB7Ci0KLS8qIE5vdGVzIG9uIGNhbGxiYWNrIG93bmVyc2hpcC4KLQotVGhpcyBpcyBob3cgKEh3KUJpbmRlciBvd25lcnNoaXAgbW9kZWwgbG9va3MgbGlrZS4gVGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgotaXMgb3duZWQgYnkgQmluZGVyIGZyYW1ld29yayAodmlhIHNwPD4pLiBQcm94aWVzIGFyZSBvd25lZCBieSBjbGllbnRzLgotV2hlbiB0aGUgbGFzdCBwcm94eSBkaXNhcHBlYXJzLCBCaW5kZXIgZnJhbWV3b3JrIHJlbGVhc2VzIHRoZSBzZXJ2ZXIgaW1wbC4KLQotVGh1cywgaXQgaXMgbm90IG5lZWRlZCB0byBrZWVwIGFueSByZWZlcmVuY2VzIHRvIFN0cmVhbU91dENhbGxiYWNrICh0aGlzIGlzCi10aGUgc2VydmVyIGltcGwpIC0tIGl0IHdpbGwgbGl2ZSBhcyBsb25nIGFzIEhBTCBzZXJ2ZXIgaG9sZHMgYSBzdHJvbmcgcmVmIHRvCi1JU3RyZWFtT3V0Q2FsbGJhY2sgcHJveHkuIFdlIGNsZWFyIHRoYXQgcmVmZXJlbmNlIGJ5IGNhbGxpbmcgJ2NsZWFyQ2FsbGJhY2snCi1mcm9tIHRoZSBkZXN0cnVjdG9yIG9mIFN0cmVhbU91dEhhbEhpZGwuCi0KLVRoZSBjYWxsYmFjayBvbmx5IGtlZXBzIGEgd2VhayByZWZlcmVuY2UgdG8gdGhlIHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBvd25lZAotYnkgQXVkaW9GbGluZ2VyLgotCi0qLwotCi1zdHJ1Y3QgU3RyZWFtT3V0Q2FsbGJhY2sgOiBwdWJsaWMgSVN0cmVhbU91dENhbGxiYWNrIHsKLSAgICBTdHJlYW1PdXRDYWxsYmFjayhjb25zdCB3cDxTdHJlYW1PdXRIYWxIaWRsPiYgc3RyZWFtKSA6IG1TdHJlYW0oc3RyZWFtKSB7fQotCi0gICAgLy8gSVN0cmVhbU91dENhbGxiYWNrIGltcGxlbWVudGF0aW9uCi0gICAgUmV0dXJuPHZvaWQ+IG9uV3JpdGVSZWFkeSgpICBvdmVycmlkZSB7Ci0gICAgICAgIHNwPFN0cmVhbU91dEhhbEhpZGw+IHN0cmVhbSA9IG1TdHJlYW0ucHJvbW90ZSgpOwotICAgICAgICBpZiAoc3RyZWFtICE9IDApIHsKLSAgICAgICAgICAgIHN0cmVhbS0+b25Xcml0ZVJlYWR5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48dm9pZD4gb25EcmFpblJlYWR5KCkgIG92ZXJyaWRlIHsKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChzdHJlYW0gIT0gMCkgewotICAgICAgICAgICAgc3RyZWFtLT5vbkRyYWluUmVhZHkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLQotICAgIFJldHVybjx2b2lkPiBvbkVycm9yKCkgIG92ZXJyaWRlIHsKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChzdHJlYW0gIT0gMCkgewotICAgICAgICAgICAgc3RyZWFtLT5vbkVycm9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICB3cDxTdHJlYW1PdXRIYWxIaWRsPiBtU3RyZWFtOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLVN0cmVhbU91dEhhbEhpZGw6OlN0cmVhbU91dEhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbU91dD4mIHN0cmVhbSkKLSAgICAgICAgOiBTdHJlYW1IYWxIaWRsKHN0cmVhbS5nZXQoKSksIG1TdHJlYW0oc3RyZWFtKSwgbVdyaXRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgewotfQotCi1TdHJlYW1PdXRIYWxIaWRsOjp+U3RyZWFtT3V0SGFsSGlkbCgpIHsKLSAgICBpZiAobVN0cmVhbSAhPSAwKSB7Ci0gICAgICAgIGlmIChtQ2FsbGJhY2sudW5zYWZlX2dldCgpKSB7Ci0gICAgICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbGVhckNhbGxiYWNrIiwgbVN0cmVhbS0+Y2xlYXJDYWxsYmFjaygpKTsKLSAgICAgICAgfQotICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbG9zZSIsIG1TdHJlYW0tPmNsb3NlKCkpOwotICAgICAgICBtU3RyZWFtLmNsZWFyKCk7Ci0gICAgfQotICAgIG1DYWxsYmFjay5jbGVhcigpOwotICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgaWYgKG1FZkdyb3VwKSB7Ci0gICAgICAgIEV2ZW50RmxhZzo6ZGVsZXRlRXZlbnRGbGFnKCZtRWZHcm91cCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZyYW1lU2l6ZSIsIG1TdHJlYW0tPmdldEZyYW1lU2l6ZSgpLCBzaXplKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtV3JpdGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKLSAgICAgICAgcmV0dXJuIGNhbGxXcml0ZXJUaHJlYWQoCi0gICAgICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpHRVRfTEFURU5DWSwgImdldExhdGVuY3kiLCBudWxscHRyLCAwLAotICAgICAgICAgICAgICAgIFsmXShjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgKmxhdGVuY3kgPSB3cml0ZVN0YXR1cy5yZXBseS5sYXRlbmN5TXM7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldExhdGVuY3kiLCBtU3RyZWFtLT5nZXRMYXRlbmN5KCksIGxhdGVuY3kpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFZvbHVtZSIsIG1TdHJlYW0tPnNldFZvbHVtZShsZWZ0LCByaWdodCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgKndyaXR0ZW4gPSAwOwotCi0gICAgaWYgKGJ5dGVzID09IDAgJiYgIW1EYXRhTVEpIHsKLSAgICAgICAgLy8gQ2FuJ3QgZGV0ZXJtaW5lIHRoZSBzaXplIGZvciB0aGUgTVEgYnVmZmVyLiBXYWl0IGZvciBhIG5vbi1lbXB0eSB3cml0ZSByZXF1ZXN0LgotICAgICAgICBBTE9HV19JRihtQ2FsbGJhY2sudW5zYWZlX2dldCgpLCAiRmlyc3QgY2FsbCB0byBhc3luYyB3cml0ZSB3aXRoIDAgYnl0ZXMiKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAoIW1EYXRhTVEpIHsKLSAgICAgICAgLy8gSW4gY2FzZSBpZiBwbGF5YmFjayBzdGFydHMgY2xvc2UgdG8gdGhlIGVuZCBvZiBhIGNvbXByZXNzZWQgdHJhY2ssIHRoZSBieXRlcwotICAgICAgICAvLyB0aGF0IG5lZWQgdG8gYmUgd3JpdHRlbiBpcyBsZXNzIHRoYW4gdGhlIGFjdHVhbCBidWZmZXIgc2l6ZS4gTmVlZCB0byB1c2UKLSAgICAgICAgLy8gZnVsbCBidWZmZXIgc2l6ZSBmb3IgdGhlIE1RIHNpbmNlIG90aGVyd2lzZSBhZnRlciBzZWVraW5nIGJhY2sgdG8gdGhlIG1pZGRsZQotICAgICAgICAvLyBkYXRhIHdpbGwgYmUgdHJ1bmNhdGVkLgotICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZTsKLSAgICAgICAgaWYgKChzdGF0dXMgPSBnZXRDYWNoZWRCdWZmZXJTaXplKCZidWZmZXJTaXplKSkgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ5dGVzID4gYnVmZmVyU2l6ZSkgYnVmZmVyU2l6ZSA9IGJ5dGVzOwotICAgICAgICBpZiAoKHN0YXR1cyA9IHByZXBhcmVGb3JXcml0aW5nKGJ1ZmZlclNpemUpKSAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXR1cyA9IGNhbGxXcml0ZXJUaHJlYWQoCi0gICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OldSSVRFLCAid3JpdGUiLCBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90Kj4oYnVmZmVyKSwgYnl0ZXMsCi0gICAgICAgICAgICBbJl0gKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgewotICAgICAgICAgICAgICAgICp3cml0dGVuID0gd3JpdGVTdGF0dXMucmVwbHkud3JpdHRlbjsKLSAgICAgICAgICAgICAgICAvLyBEaWFnbm9zdGljcyBvZiB0aGUgY2F1c2Ugb2YgYi8zNTgxMzExMy4KLSAgICAgICAgICAgICAgICBBTE9HRV9JRigqd3JpdHRlbiA+IGJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgImhhbCByZXBvcnRzIG1vcmUgYnl0ZXMgd3JpdHRlbiB0aGFuIGFza2VkIGZvcjogJWxsZCA+ICVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykqd3JpdHRlbiwgKGxvbmcgbG9uZylieXRlcyk7Ci0gICAgICAgICAgICB9KTsKLSAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKndyaXR0ZW4pOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmNhbGxXcml0ZXJUaHJlYWQoCi0gICAgICAgIFdyaXRlQ29tbWFuZCBjbWQsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhU2l6ZSwgU3RyZWFtT3V0SGFsSGlkbDo6V3JpdGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICBpZiAoIW1Db21tYW5kTVEtPndyaXRlKCZjbWQpKSB7Ci0gICAgICAgIEFMT0dFKCJjb21tYW5kIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKLSAgICAgICAgcmV0dXJuIC1FQUdBSU47Ci0gICAgfQotICAgIGlmIChkYXRhICE9IG51bGxwdHIpIHsKLSAgICAgICAgc2l6ZV90IGF2YWlsYWJsZVRvV3JpdGUgPSBtRGF0YU1RLT5hdmFpbGFibGVUb1dyaXRlKCk7Ci0gICAgICAgIGlmIChkYXRhU2l6ZSA+IGF2YWlsYWJsZVRvV3JpdGUpIHsKLSAgICAgICAgICAgIEFMT0dXKCJ0cnVuY2F0aW5nIHdyaXRlIGRhdGEgZnJvbSAlbGxkIHRvICVsbGQgZHVlIHRvIGluc3VmZmljaWVudCBkYXRhIHF1ZXVlIHNwYWNlIiwKLSAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylkYXRhU2l6ZSwgKGxvbmcgbG9uZylhdmFpbGFibGVUb1dyaXRlKTsKLSAgICAgICAgICAgIGRhdGFTaXplID0gYXZhaWxhYmxlVG9Xcml0ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1EYXRhTVEtPndyaXRlKGRhdGEsIGRhdGFTaXplKSkgewotICAgICAgICAgICAgQUxPR0UoImRhdGEgbWVzc2FnZSBxdWV1ZSB3cml0ZSBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1FZkdyb3VwLT53YWtlKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0VNUFRZKSk7Ci0KLSAgICAvLyBUT0RPOiBSZW1vdmUgbWFudWFsIGV2ZW50IGZsYWcgaGFuZGxpbmcgb25jZSBibG9ja2luZyBNUSBpcyBpbXBsZW1lbnRlZC4gYi8zMzgxNTQyMgotICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOwotcmV0cnk6Ci0gICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRlVMTCksICZlZlN0YXRlKTsKLSAgICBpZiAoZWZTdGF0ZSAmIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0ZVTEwpKSB7Ci0gICAgICAgIFdyaXRlU3RhdHVzIHdyaXRlU3RhdHVzOwotICAgICAgICB3cml0ZVN0YXR1cy5yZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgaWYgKCFtU3RhdHVzTVEtPnJlYWQoJndyaXRlU3RhdHVzKSkgewotICAgICAgICAgICAgQUxPR0UoInN0YXR1cyBtZXNzYWdlIHJlYWQgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKLSAgICAgICAgfQotICAgICAgICBpZiAod3JpdGVTdGF0dXMucmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgIHJldCA9IE9LOwotICAgICAgICAgICAgY2FsbGJhY2sod3JpdGVTdGF0dXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc1JldHVybihjbWROYW1lLCB3cml0ZVN0YXR1cy5yZXR2YWwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIGlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gLUVJTlRSKSB7Ci0gICAgICAgIC8vIFNwdXJpb3VzIHdha2V1cC4gVGhpcyBub3JtYWxseSByZXRyaWVzIG5vIG1vcmUgdGhhbiBvbmNlLgotICAgICAgICBnb3RvIHJldHJ5OwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpwcmVwYXJlRm9yV3JpdGluZyhzaXplX3QgYnVmZmVyU2l6ZSkgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IHRlbXBDb21tYW5kTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gdGVtcERhdGFNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IHRlbXBTdGF0dXNNUTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIHBpZF90IGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5wcmVwYXJlRm9yV3JpdGluZygKLSAgICAgICAgICAgIDEsIGJ1ZmZlclNpemUsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbW1hbmRNUTo6RGVzY3JpcHRvciYgY29tbWFuZE1RLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTVE6OkRlc2NyaXB0b3ImIGRhdGFNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdHVzTVE6OkRlc2NyaXB0b3ImIHN0YXR1c01RLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJlYWRJbmZvJiBoYWxUaHJlYWRJbmZvKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcENvbW1hbmRNUS5yZXNldChuZXcgQ29tbWFuZE1RKGNvbW1hbmRNUSkpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wRGF0YU1RLnJlc2V0KG5ldyBEYXRhTVEoZGF0YU1RKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBTdGF0dXNNUS5yZXNldChuZXcgU3RhdHVzTVEoc3RhdHVzTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBEYXRhTVEtPmlzVmFsaWQoKSAmJiB0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50RmxhZzo6Y3JlYXRlRXZlbnRGbGFnKHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSwgJm1FZkdyb3VwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRQaWQgPSBoYWxUaHJlYWRJbmZvLnBpZDsKLSAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkVGlkID0gaGFsVGhyZWFkSW5mby50aWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKCFyZXQuaXNPaygpIHx8IHJldHZhbCAhPSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwcmVwYXJlRm9yV3JpdGluZyIsIHJldCwgcmV0dmFsKTsKLSAgICB9Ci0gICAgaWYgKCF0ZW1wQ29tbWFuZE1RIHx8ICF0ZW1wQ29tbWFuZE1RLT5pc1ZhbGlkKCkgfHwKLSAgICAgICAgICAgICF0ZW1wRGF0YU1RIHx8ICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgfHwKLSAgICAgICAgICAgICF0ZW1wU3RhdHVzTVEgfHwgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhbUVmR3JvdXApIHsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBDb21tYW5kTVEsICJGYWlsZWQgdG8gb2J0YWluIGNvbW1hbmQgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wQ29tbWFuZE1RICYmICF0ZW1wQ29tbWFuZE1RLT5pc1ZhbGlkKCksCi0gICAgICAgICAgICAgICAgIkNvbW1hbmQgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wRGF0YU1RLCAiRmFpbGVkIHRvIG9idGFpbiBkYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcERhdGFNUSAmJiAhdGVtcERhdGFNUS0+aXNWYWxpZCgpLCAiRGF0YSBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBTdGF0dXNNUSwgIkZhaWxlZCB0byBvYnRhaW4gc3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcFN0YXR1c01RICYmICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSwKLSAgICAgICAgICAgICAgICAiU3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighbUVmR3JvdXAsICJFdmVudCBmbGFnIGNyZWF0aW9uIGZvciB3cml0aW5nIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkKTsKLQotICAgIG1Db21tYW5kTVEgPSBzdGQ6Om1vdmUodGVtcENvbW1hbmRNUSk7Ci0gICAgbURhdGFNUSA9IHN0ZDo6bW92ZSh0ZW1wRGF0YU1RKTsKLSAgICBtU3RhdHVzTVEgPSBzdGQ6Om1vdmUodGVtcFN0YXR1c01RKTsKLSAgICBtV3JpdGVyQ2xpZW50ID0gZ2V0dGlkKCk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0UmVuZGVyUG9zaXRpb24oCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQzMl90IGQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqZHNwRnJhbWVzID0gZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UmVuZGVyUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXROZXh0V3JpdGVUaW1lc3RhbXAoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGludDY0X3QgdCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICp0aW1lc3RhbXAgPSB0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRSZW5kZXJQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcHJvY2Vzc1JldHVybigKLSAgICAgICAgICAgICJzZXRDYWxsYmFjayIsIG1TdHJlYW0tPnNldENhbGxiYWNrKG5ldyBTdHJlYW1PdXRDYWxsYmFjayh0aGlzKSkpOwotICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+c3VwcG9ydHNQYXVzZUFuZFJlc3VtZSgKLSAgICAgICAgICAgIFsmXShib29sIHAsIGJvb2wgcikgewotICAgICAgICAgICAgICAgICpzdXBwb3J0c1BhdXNlID0gcDsKLSAgICAgICAgICAgICAgICAqc3VwcG9ydHNSZXN1bWUgPSByOwotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzUGF1c2VBbmRSZXN1bWUiLCByZXQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpwYXVzZSgpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5wYXVzZSgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cmVzdW1lKCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPnJlc3VtZSgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzRHJhaW4iLCBtU3RyZWFtLT5zdXBwb3J0c0RyYWluKCksIHN1cHBvcnRzRHJhaW4pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpkcmFpbihib29sIGVhcmx5Tm90aWZ5KSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oCi0gICAgICAgICAgICAiZHJhaW4iLCBtU3RyZWFtLT5kcmFpbihlYXJseU5vdGlmeSA/IEF1ZGlvRHJhaW46OkVBUkxZX05PVElGWSA6IEF1ZGlvRHJhaW46OkFMTCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpmbHVzaCgpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5mbHVzaCgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVdyaXRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7Ci0gICAgICAgIHJldHVybiBjYWxsV3JpdGVyVGhyZWFkKAotICAgICAgICAgICAgICAgIFdyaXRlQ29tbWFuZDo6R0VUX1BSRVNFTlRBVElPTl9QT1NJVElPTiwgImdldFByZXNlbnRhdGlvblBvc2l0aW9uIiwgbnVsbHB0ciwgMCwKLSAgICAgICAgICAgICAgICBbJl0oY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSB3cml0ZVN0YXR1cy5yZXBseS5wcmVzZW50YXRpb25Qb3NpdGlvbi5mcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfc2VjID0gd3JpdGVTdGF0dXMucmVwbHkucHJlc2VudGF0aW9uUG9zaXRpb24udGltZVN0YW1wLnR2U2VjOwotICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X25zZWMgPSB3cml0ZVN0YXR1cy5yZXBseS5wcmVzZW50YXRpb25Qb3NpdGlvbi50aW1lU3RhbXAudHZOU2VjOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRQcmVzZW50YXRpb25Qb3NpdGlvbigKLSAgICAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGhpZGxGcmFtZXMsIGNvbnN0IFRpbWVTcGVjJiBoaWRsVGltZVN0YW1wKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IGhpZGxGcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X3NlYyA9IGhpZGxUaW1lU3RhbXAudHZTZWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X25zZWMgPSBoaWRsVGltZVN0YW1wLnR2TlNlYzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Ci0gICAgfQotfQotCi12b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uV3JpdGVSZWFkeSgpIHsKLSAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwotICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47Ci0gICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25Xcml0ZVJlYWR5Iik7Ci0gICAgY2FsbGJhY2stPm9uV3JpdGVSZWFkeSgpOwotfQotCi12b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRHJhaW5SZWFkeSgpIHsKLSAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwotICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47Ci0gICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25EcmFpblJlYWR5Iik7Ci0gICAgY2FsbGJhY2stPm9uRHJhaW5SZWFkeSgpOwotfQotCi12b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRXJyb3IoKSB7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uRXJyb3IiKTsKLSAgICBjYWxsYmFjay0+b25FcnJvcigpOwotfQotCi0KLVN0cmVhbUluSGFsSGlkbDo6U3RyZWFtSW5IYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1Jbj4mIHN0cmVhbSkKLSAgICAgICAgOiBTdHJlYW1IYWxIaWRsKHN0cmVhbS5nZXQoKSksIG1TdHJlYW0oc3RyZWFtKSwgbVJlYWRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgewotfQotCi1TdHJlYW1JbkhhbEhpZGw6On5TdHJlYW1JbkhhbEhpZGwoKSB7Ci0gICAgaWYgKG1TdHJlYW0gIT0gMCkgewotICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbG9zZSIsIG1TdHJlYW0tPmNsb3NlKCkpOwotICAgICAgICBtU3RyZWFtLmNsZWFyKCk7Ci0gICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgfQotICAgIGlmIChtRWZHcm91cCkgewotICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZyYW1lU2l6ZSIsIG1TdHJlYW0tPmdldEZyYW1lU2l6ZSgpLCBzaXplKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpzZXRHYWluKGZsb2F0IGdhaW4pIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0R2FpbiIsIG1TdHJlYW0tPnNldEdhaW4oZ2FpbikpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgICpyZWFkID0gMDsKLQotICAgIGlmIChieXRlcyA9PSAwICYmICFtRGF0YU1RKSB7Ci0gICAgICAgIC8vIENhbid0IGRldGVybWluZSB0aGUgc2l6ZSBmb3IgdGhlIE1RIGJ1ZmZlci4gV2FpdCBmb3IgYSBub24tZW1wdHkgcmVhZCByZXF1ZXN0LgotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmICghbURhdGFNUSAmJiAoc3RhdHVzID0gcHJlcGFyZUZvclJlYWRpbmcoYnl0ZXMpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKLSAgICBwYXJhbXMuY29tbWFuZCA9IFJlYWRDb21tYW5kOjpSRUFEOwotICAgIHBhcmFtcy5wYXJhbXMucmVhZCA9IGJ5dGVzOwotICAgIHN0YXR1cyA9IGNhbGxSZWFkZXJUaHJlYWQocGFyYW1zLCAicmVhZCIsCi0gICAgICAgICAgICBbJl0oY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cykgewotICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhdmFpbFRvUmVhZCA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvUmVhZCgpOwotICAgICAgICAgICAgICAgIGlmICghbURhdGFNUS0+cmVhZChzdGF0aWNfY2FzdDx1aW50OF90Kj4oYnVmZmVyKSwgc3RkOjptaW4oYnl0ZXMsIGF2YWlsVG9SZWFkKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImRhdGEgbWVzc2FnZSBxdWV1ZSByZWFkIGZhaWxlZCBmb3IgXCJyZWFkXCIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR1dfSUYoYXZhaWxUb1JlYWQgIT0gcmVhZFN0YXR1cy5yZXBseS5yZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgIkhBTCByZWFkIHJlcG9ydCBpbmNvbnNpc3RlbnQ6IG1xID0gJWQsIHN0YXR1cyA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KWF2YWlsVG9SZWFkLCAoaW50MzJfdClyZWFkU3RhdHVzLnJlcGx5LnJlYWQpOwotICAgICAgICAgICAgICAgICpyZWFkID0gcmVhZFN0YXR1cy5yZXBseS5yZWFkOwotICAgICAgICAgICAgfSk7Ci0gICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICpyZWFkKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmNhbGxSZWFkZXJUaHJlYWQoCi0gICAgICAgIGNvbnN0IFJlYWRQYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCi0gICAgICAgIFN0cmVhbUluSGFsSGlkbDo6UmVhZGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICBpZiAoIW1Db21tYW5kTVEtPndyaXRlKCZwYXJhbXMpKSB7Ci0gICAgICAgIEFMT0dXKCJjb21tYW5kIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiAtRUFHQUlOOwotICAgIH0KLSAgICBtRWZHcm91cC0+d2FrZShzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSk7Ci0KLSAgICAvLyBUT0RPOiBSZW1vdmUgbWFudWFsIGV2ZW50IGZsYWcgaGFuZGxpbmcgb25jZSBibG9ja2luZyBNUSBpcyBpbXBsZW1lbnRlZC4gYi8zMzgxNTQyMgotICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOwotcmV0cnk6Ci0gICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpLCAmZWZTdGF0ZSk7Ci0gICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSkpIHsKLSAgICAgICAgUmVhZFN0YXR1cyByZWFkU3RhdHVzOwotICAgICAgICByZWFkU3RhdHVzLnJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgICAgICBpZiAoIW1TdGF0dXNNUS0+cmVhZCgmcmVhZFN0YXR1cykpIHsKLSAgICAgICAgICAgIEFMT0dFKCJzdGF0dXMgbWVzc2FnZSByZWFkIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgIGlmIChyZWFkU3RhdHVzLnJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICByZXQgPSBPSzsKLSAgICAgICAgICAgIGNhbGxiYWNrKHJlYWRTdGF0dXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc1JldHVybihjbWROYW1lLCByZWFkU3RhdHVzLnJldHZhbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKLSAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCi0gICAgICAgIGdvdG8gcmV0cnk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6cHJlcGFyZUZvclJlYWRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiB0ZW1wQ29tbWFuZE1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IHRlbXBEYXRhTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBwaWRfdCBoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+cHJlcGFyZUZvclJlYWRpbmcoCi0gICAgICAgICAgICAxLCBidWZmZXJTaXplLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kTVE6OkRlc2NyaXB0b3ImIGNvbW1hbmRNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YU1ROjpEZXNjcmlwdG9yJiBkYXRhTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXR1c01ROjpEZXNjcmlwdG9yJiBzdGF0dXNNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkSW5mbyYgaGFsVGhyZWFkSW5mbykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBDb21tYW5kTVEucmVzZXQobmV3IENvbW1hbmRNUShjb21tYW5kTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcERhdGFNUS5yZXNldChuZXcgRGF0YU1RKGRhdGFNUSkpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgJiYgdGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkUGlkID0gaGFsVGhyZWFkSW5mby5waWQ7Ci0gICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFRpZCA9IGhhbFRocmVhZEluZm8udGlkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgewotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicHJlcGFyZUZvclJlYWRpbmciLCByZXQsIHJldHZhbCk7Ci0gICAgfQotICAgIGlmICghdGVtcENvbW1hbmRNUSB8fCAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhdGVtcERhdGFNUSB8fCAhdGVtcERhdGFNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIW1FZkdyb3VwKSB7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wQ29tbWFuZE1RLCAiRmFpbGVkIHRvIG9idGFpbiBjb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcENvbW1hbmRNUSAmJiAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJDb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighdGVtcERhdGFNUSwgIkZhaWxlZCB0byBvYnRhaW4gZGF0YSBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBEYXRhTVEgJiYgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSwgIkRhdGEgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCi0gICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3IgcmVhZGluZyBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZCk7Ci0KLSAgICBtQ29tbWFuZE1RID0gc3RkOjptb3ZlKHRlbXBDb21tYW5kTVEpOwotICAgIG1EYXRhTVEgPSBzdGQ6Om1vdmUodGVtcERhdGFNUSk7Ci0gICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7Ci0gICAgbVJlYWRlckNsaWVudCA9IGdldHRpZCgpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0SW5wdXRGcmFtZXNMb3N0IiwgbVN0cmVhbS0+Z2V0SW5wdXRGcmFtZXNMb3N0KCksIGZyYW1lc0xvc3QpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVJlYWRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7Ci0gICAgICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKLSAgICAgICAgcGFyYW1zLmNvbW1hbmQgPSBSZWFkQ29tbWFuZDo6R0VUX0NBUFRVUkVfUE9TSVRJT047Ci0gICAgICAgIHJldHVybiBjYWxsUmVhZGVyVGhyZWFkKHBhcmFtcywgImdldENhcHR1cmVQb3NpdGlvbiIsCi0gICAgICAgICAgICAgICAgWyZdKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IHJlYWRTdGF0dXMucmVwbHkuY2FwdHVyZVBvc2l0aW9uLmZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSByZWFkU3RhdHVzLnJlcGx5LmNhcHR1cmVQb3NpdGlvbi50aW1lOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRDYXB0dXJlUG9zaXRpb24oCi0gICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBoaWRsRnJhbWVzLCB1aW50NjRfdCBoaWRsVGltZSkgewotICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSBoaWRsRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSBoaWRsVGltZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Q2FwdHVyZVBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotICAgIH0KLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGFiOTQzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbEhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSElETF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMX0gKLQotI2luY2x1ZGUgPGF0b21pYz4KLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lTdHJlYW0uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JU3RyZWFtSW4uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JU3RyZWFtT3V0Lmg+Ci0jaW5jbHVkZSA8Zm1xL0V2ZW50RmxhZy5oPgotI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW07Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbUluOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1PdXQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpFdmVudEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyBSZWFkUGFyYW1ldGVycyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtSW46OlJlYWRQYXJhbWV0ZXJzOwotdXNpbmcgUmVhZFN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtSW46OlJlYWRTdGF0dXM7Ci11c2luZyBXcml0ZUNvbW1hbmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbU91dDo6V3JpdGVDb21tYW5kOwotdXNpbmcgV3JpdGVTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbU91dDo6V3JpdGVTdGF0dXM7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGV2aWNlSGFsSGlkbDsKLQotY2xhc3MgU3RyZWFtSGFsSGlkbCA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIHNhbXBsaW5nIHJhdGUgaW4gSHogLSBlZy4gNDQxMDAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKTsKLQotICAgIC8vIFJldHVybiBzaXplIG9mIGlucHV0L291dHB1dCBidWZmZXIgaW4gYnl0ZXMgZm9yIHRoaXMgc3RyZWFtIC0gZWcuIDQ4MDAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGNoYW5uZWwgbWFzay4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKTsKLQotICAgIC8vIFJldHVybiB0aGUgYXVkaW8gZm9ybWF0IC0gZS5nLiBBVURJT19GT1JNQVRfUENNXzE2X0JJVC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKLQotICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7Ci0KLSAgICAvLyBTZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOwotCi0gICAgLy8gR2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgLy8gQWRkIG9yIHJlbW92ZSB0aGUgZWZmZWN0IG9uIHRoZSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKLQotICAgIC8vIFB1dCB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQvb3V0cHV0IGludG8gc3RhbmRieSBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhbmRieSgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7Ci0KLSAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKLQotICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLQotICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOwotCi0gICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOwotCi0gICAgLy8gU2V0IHRoZSBwcmlvcml0eSBvZiB0aGUgdGhyZWFkIHRoYXQgaW50ZXJhY3RzIHdpdGggdGhlIEhBTAotICAgIC8vIChtdXN0IG1hdGNoIHRoZSBwcmlvcml0eSBvZiB0aGUgYXVkaW9mbGluZ2VyJ3MgdGhyZWFkIHRoYXQgY2FsbHMgJ3JlYWQnIC8gJ3dyaXRlJykKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSk7Ci0KLSAgcHJvdGVjdGVkOgotICAgIC8vIFN1YmNsYXNzZXMgY2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIGV4cGxpY2l0IFN0cmVhbUhhbEhpZGwoSVN0cmVhbSAqc3RyZWFtKTsKLQotICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBzdHJlYW0uCi0gICAgdmlydHVhbCB+U3RyZWFtSGFsSGlkbCgpOwotCi0gICAgc3RhdHVzX3QgZ2V0Q2FjaGVkQnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgYm9vbCByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkocGlkX3QgdGhyZWFkUGlkLCBwaWRfdCB0aHJlYWRJZCk7Ci0KLSAgICAvLyBtU3RyZWFtUG93ZXJMb2cgaXMgdXNlZCBmb3IgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCi0gICAgU3RyZWFtUG93ZXJMb2cgbVN0cmVhbVBvd2VyTG9nOwotCi0gIHByaXZhdGU6Ci0gICAgY29uc3QgaW50IEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCA9IC0xOwotICAgIElTdHJlYW0gKm1TdHJlYW07Ci0gICAgaW50IG1IYWxUaHJlYWRQcmlvcml0eTsKLSAgICBzaXplX3QgbUNhY2hlZEJ1ZmZlclNpemU7Ci19OwotCi1jbGFzcyBTdHJlYW1PdXRIYWxIaWRsIDogcHVibGljIFN0cmVhbU91dEhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbEhpZGwgewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFJldHVybiB0aGUgYXVkaW8gaGFyZHdhcmUgZHJpdmVyIGVzdGltYXRlZCBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpOwotCi0gICAgLy8gVXNlIHRoaXMgbWV0aG9kIGluIHNpdHVhdGlvbnMgd2hlcmUgYXVkaW8gbWl4aW5nIGlzIGRvbmUgaW4gdGhlIGhhcmR3YXJlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKLQotICAgIC8vIFdyaXRlIGF1ZGlvIGJ1ZmZlciB0byBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKTsKLQotICAgIC8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyB3cml0dGVuIGJ5IHRoZSBhdWRpbyBkc3AgdG8gREFDIHNpbmNlCi0gICAgLy8gdGhlIG91dHB1dCBoYXMgZXhpdGVkIHN0YW5kYnkuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKTsKLQotICAgIC8vIEdldCB0aGUgbG9jYWwgdGltZSBhdCB3aGljaCB0aGUgbmV4dCB3cml0ZSB0byB0aGUgYXVkaW8gZHJpdmVyIHdpbGwgYmUgcHJlc2VudGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCk7Ci0KLSAgICAvLyBTZXQgdGhlIGNhbGxiYWNrIGZvciBub3RpZnlpbmcgY29tcGxldGlvbiBvZiBub24tYmxvY2tpbmcgd3JpdGUgYW5kIGRyYWluLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBwYXVzZSBhbmQgcmVzdW1lIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZXN1bWUoKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBkcmFpbiBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKTsKLQotICAgIC8vIFJlcXVlc3RzIG5vdGlmaWNhdGlvbiB3aGVuIGRhdGEgYnVmZmVyZWQgYnkgdGhlIGRyaXZlci9oYXJkd2FyZSBoYXMgYmVlbiBwbGF5ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkcmFpbihib29sIGVhcmx5Tm90aWZ5KTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gZmx1c2ggdGhlIHF1ZXVlZCBkYXRhLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKTsKLQotICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyBwcmVzZW50ZWQgdG8gYW4gZXh0ZXJuYWwgb2JzZXJ2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCk7Ci0KLSAgICAvLyBNZXRob2RzIHVzZWQgYnkgU3RyZWFtT3V0Q2FsbGJhY2sgKEhJREwpLgotICAgIHZvaWQgb25Xcml0ZVJlYWR5KCk7Ci0gICAgdm9pZCBvbkRyYWluUmVhZHkoKTsKLSAgICB2b2lkIG9uRXJyb3IoKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxIaWRsOwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFdyaXRlQ29tbWFuZCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IENvbW1hbmRNUTsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gRGF0YU1ROwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFdyaXRlU3RhdHVzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7Ci0KLSAgICB3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gbUNhbGxiYWNrOwotICAgIHNwPElTdHJlYW1PdXQ+IG1TdHJlYW07Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gbUNvbW1hbmRNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiBtRGF0YU1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROwotICAgIHN0ZDo6YXRvbWljPHBpZF90PiBtV3JpdGVyQ2xpZW50OwotICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtT3V0SGFsSGlkbChjb25zdCBzcDxJU3RyZWFtT3V0PiYgc3RyZWFtKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbU91dEhhbEhpZGwoKTsKLQotICAgIHVzaW5nIFdyaXRlckNhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cyk+OwotICAgIHN0YXR1c190IGNhbGxXcml0ZXJUaHJlYWQoCi0gICAgICAgICAgICBXcml0ZUNvbW1hbmQgY21kLCBjb25zdCBjaGFyKiBjbWROYW1lLAotICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFTaXplLCBXcml0ZXJDYWxsYmFjayBjYWxsYmFjayk7Ci0gICAgc3RhdHVzX3QgcHJlcGFyZUZvcldyaXRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpOwotfTsKLQotY2xhc3MgU3RyZWFtSW5IYWxIaWRsIDogcHVibGljIFN0cmVhbUluSGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsSGlkbCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gU2V0IHRoZSBpbnB1dCBnYWluIGZvciB0aGUgYXVkaW8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0R2FpbihmbG9hdCBnYWluKTsKLQotICAgIC8vIFJlYWQgYXVkaW8gYnVmZmVyIGluIGZyb20gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKTsKLQotICAgIC8vIFJldHVybiB0aGUgYW1vdW50IG9mIGlucHV0IGZyYW1lcyBsb3N0IGluIHRoZSBhdWRpbyBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpOwotCi0gICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHJlY2VpdmVkIGFuZAotICAgIC8vIHRoZSBjbG9jayB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGZyYW1lIGNvdW50LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsSGlkbDsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxSZWFkUGFyYW1ldGVycywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IENvbW1hbmRNUTsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gRGF0YU1ROwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFJlYWRTdGF0dXMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKLQotICAgIHNwPElTdHJlYW1Jbj4gbVN0cmVhbTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiBtQ29tbWFuZE1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IG1EYXRhTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7Ci0gICAgc3RkOjphdG9taWM8cGlkX3Q+IG1SZWFkZXJDbGllbnQ7Ci0gICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBTdHJlYW1JbkhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbUluPiYgc3RyZWFtKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbUluSGFsSGlkbCgpOwotCi0gICAgdXNpbmcgUmVhZGVyQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cyk+OwotICAgIHN0YXR1c190IGNhbGxSZWFkZXJUaHJlYWQoCi0gICAgICAgICAgICBjb25zdCBSZWFkUGFyYW1ldGVycyYgcGFyYW1zLCBjb25zdCBjaGFyKiBjbWROYW1lLCBSZWFkZXJDYWxsYmFjayBjYWxsYmFjayk7Ci0gICAgc3RhdHVzX3QgcHJlcGFyZUZvclJlYWRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvU3RyZWFtSGFsTG9jYWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzE3ZjVjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbExvY2FsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJTdHJlYW1IYWxMb2NhbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotI2luY2x1ZGUgIkVmZmVjdEhhbExvY2FsLmgiCi0jaW5jbHVkZSAiU3RyZWFtSGFsTG9jYWwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1TdHJlYW1IYWxMb2NhbDo6U3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKLSAgICAgICAgOiBtRGV2aWNlKGRldmljZSksCi0gICAgICAgICAgbVN0cmVhbShzdHJlYW0pIHsKLSAgICAvLyBJbnN0cnVtZW50IGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgotICAgIC8vIE5vdGU6IFRoaXMgYXNzdW1lcyBjaGFubmVsIG1hc2ssIGZvcm1hdCwgYW5kIHNhbXBsZSByYXRlIGRvIG5vdCBjaGFuZ2UgYWZ0ZXIgY3JlYXRpb24uCi0gICAgaWYgKG1TdHJlYW0gIT0gbnVsbHB0ciAmJiBtU3RyZWFtUG93ZXJMb2cuaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkpIHsKLSAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmluaXQobVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pLAotICAgICAgICAgICAgICAgIG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKSwKLSAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pKTsKLSAgICB9Ci19Ci0KLVN0cmVhbUhhbExvY2FsOjp+U3RyZWFtSGFsTG9jYWwoKSB7Ci0gICAgbVN0cmVhbSA9IDA7Ci0gICAgbURldmljZS5jbGVhcigpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSkgewotICAgICpyYXRlID0gbVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgKnNpemUgPSBtU3RyZWFtLT5nZXRfYnVmZmVyX3NpemUobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKLSAgICAqbWFzayA9IG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgICpmb3JtYXQgPSBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7Ci0gICAgKnNhbXBsZVJhdGUgPSBtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSk7Ci0gICAgKm1hc2sgPSBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSk7Ci0gICAgKmZvcm1hdCA9IG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnNldF9wYXJhbWV0ZXJzKG1TdHJlYW0sIGt2UGFpcnMuc3RyaW5nKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKLSAgICBjaGFyICpoYWxWYWx1ZXMgPSBtU3RyZWFtLT5nZXRfcGFyYW1ldGVycyhtU3RyZWFtLCBrZXlzLnN0cmluZygpKTsKLSAgICBpZiAoaGFsVmFsdWVzICE9IE5VTEwpIHsKLSAgICAgICAgdmFsdWVzLT5zZXRUbyhoYWxWYWx1ZXMpOwotICAgICAgICBmcmVlKGhhbFZhbHVlcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdmFsdWVzLT5jbGVhcigpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjphZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFlZmZlY3QtPmlzTG9jYWwoKSwgIk9ubHkgbG9jYWwgZWZmZWN0cyBjYW4gYmUgYWRkZWQgZm9yIGEgbG9jYWwgc3RyZWFtIik7Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmFkZF9hdWRpb19lZmZlY3QobVN0cmVhbSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEhhbExvY2FsKj4oZWZmZWN0LmdldCgpKS0+aGFuZGxlKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6cmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRighZWZmZWN0LT5pc0xvY2FsKCksICJPbmx5IGxvY2FsIGVmZmVjdHMgY2FuIGJlIHJlbW92ZWQgZm9yIGEgbG9jYWwgc3RyZWFtIik7Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnJlbW92ZV9hdWRpb19lZmZlY3QobVN0cmVhbSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEhhbExvY2FsKj4oZWZmZWN0LmdldCgpKS0+aGFuZGxlKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c3RhbmRieSgpIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RhbmRieShtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0cmVhbS0+ZHVtcChtU3RyZWFtLCBmZCk7Ci0gICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQpIHsKLSAgICAvLyBEb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGFzIGxvY2FsIGhhbCBpcyBleGVjdXRlZCBieSBhdWRpb2ZsaW5nZXIgZGlyZWN0bHkKLSAgICAvLyBvbiB0aGUgc2FtZSB0aHJlYWQuCi0gICAgcmV0dXJuIE9LOwotfQotCi1TdHJlYW1PdXRIYWxMb2NhbDo6U3RyZWFtT3V0SGFsTG9jYWwoYXVkaW9fc3RyZWFtX291dF90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCi0gICAgICAgIDogU3RyZWFtSGFsTG9jYWwoJnN0cmVhbS0+Y29tbW9uLCBkZXZpY2UpLCBtU3RyZWFtKHN0cmVhbSkgewotfQotCi1TdHJlYW1PdXRIYWxMb2NhbDo6flN0cmVhbU91dEhhbExvY2FsKCkgewotICAgIG1DYWxsYmFjay5jbGVhcigpOwotICAgIG1EZXZpY2UtPmNsb3NlT3V0cHV0U3RyZWFtKG1TdHJlYW0pOwotICAgIG1TdHJlYW0gPSAwOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gYXVkaW9fc3RyZWFtX291dF9mcmFtZV9zaXplKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpIHsKLSAgICAqbGF0ZW5jeSA9IG1TdHJlYW0tPmdldF9sYXRlbmN5KG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgewotICAgIGlmIChtU3RyZWFtLT5zZXRfdm9sdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c2V0X3ZvbHVtZShtU3RyZWFtLCBsZWZ0LCByaWdodCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKSB7Ci0gICAgc3NpemVfdCB3cml0ZVJlc3VsdCA9IG1TdHJlYW0tPndyaXRlKG1TdHJlYW0sIGJ1ZmZlciwgYnl0ZXMpOwotICAgIGlmICh3cml0ZVJlc3VsdCA+IDApIHsKLSAgICAgICAgKndyaXR0ZW4gPSB3cml0ZVJlc3VsdDsKLSAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICp3cml0dGVuKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICp3cml0dGVuID0gMDsKLSAgICAgICAgcmV0dXJuIHdyaXRlUmVzdWx0OwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3JlbmRlcl9wb3NpdGlvbihtU3RyZWFtLCBkc3BGcmFtZXMpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCkgewotICAgIGlmIChtU3RyZWFtLT5nZXRfbmV4dF93cml0ZV90aW1lc3RhbXAgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbmV4dF93cml0ZV90aW1lc3RhbXAobVN0cmVhbSwgdGltZXN0YW1wKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjaykgewotICAgIGlmIChtU3RyZWFtLT5zZXRfY2FsbGJhY2sgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHN0YXR1c190IHJlc3VsdCA9IG1TdHJlYW0tPnNldF9jYWxsYmFjayhtU3RyZWFtLCBTdHJlYW1PdXRIYWxMb2NhbDo6YXN5bmNDYWxsYmFjaywgdGhpcyk7Ci0gICAgaWYgKHJlc3VsdCA9PSBPSykgewotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gc3RhdGljCi1pbnQgU3RyZWFtT3V0SGFsTG9jYWw6OmFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsIHZvaWQqLCB2b2lkICpjb29raWUpIHsKLSAgICAvLyBXZSBhY3QgYXMgaWYgd2UgZ2F2ZSBhIHdwPFN0cmVhbU91dEhhbExvY2FsPiB0byBIQUwuIFRoaXMgd2F5IHdlIHNob3VsZCBoYW5kbGUKLSAgICAvLyBjb3JyZWN0bHkgdGhlIGNhc2Ugd2hlbiB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGlsZSBTdHJlYW1PdXRIYWxMb2NhbCdzIGRlc3RydWN0b3IgaXMKLSAgICAvLyBhbHJlYWR5IHJ1bm5pbmcsIGJlY2F1c2UgdGhlIGRlc3RydWN0b3IgaXMgaW52b2tlZCBhZnRlciB0aGUgcmVmY291bnQgaGFzIGJlZW4gYXRvbWljYWxseQotICAgIC8vIGRlY3JlbWVudGVkLgotICAgIHdwPFN0cmVhbU91dEhhbExvY2FsPiB3ZWFrU2VsZihzdGF0aWNfY2FzdDxTdHJlYW1PdXRIYWxMb2NhbCo+KGNvb2tpZSkpOwotICAgIHNwPFN0cmVhbU91dEhhbExvY2FsPiBzZWxmID0gd2Vha1NlbGYucHJvbW90ZSgpOwotICAgIGlmIChzZWxmID09IDApIHJldHVybiAwOwotICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IHNlbGYtPm1DYWxsYmFjay5wcm9tb3RlKCk7Ci0gICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybiAwOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrKCkgZXZlbnQgJWQiLCBldmVudCk7Ci0gICAgc3dpdGNoIChldmVudCkgewotICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfV1JJVEVfUkVBRFk6Ci0gICAgICAgICAgICBjYWxsYmFjay0+b25Xcml0ZVJlYWR5KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX0RSQUlOX1JFQURZOgotICAgICAgICAgICAgY2FsbGJhY2stPm9uRHJhaW5SZWFkeSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9FUlJPUjoKLSAgICAgICAgICAgIGNhbGxiYWNrLT5vbkVycm9yKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dXKCJhc3luY0NhbGxiYWNrKCkgdW5rbm93biBldmVudCAlZCIsIGV2ZW50KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpIHsKLSAgICAqc3VwcG9ydHNQYXVzZSA9IG1TdHJlYW0tPnBhdXNlICE9IE5VTEw7Ci0gICAgKnN1cHBvcnRzUmVzdW1lID0gbVN0cmVhbS0+cmVzdW1lICE9IE5VTEw7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6cGF1c2UoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnBhdXNlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+cGF1c2UobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpyZXN1bWUoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnJlc3VtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnJlc3VtZShtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbikgewotICAgICpzdXBwb3J0c0RyYWluID0gbVN0cmVhbS0+ZHJhaW4gIT0gTlVMTDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpkcmFpbihib29sIGVhcmx5Tm90aWZ5KSB7Ci0gICAgaWYgKG1TdHJlYW0tPmRyYWluID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+ZHJhaW4obVN0cmVhbSwgZWFybHlOb3RpZnkgPyBBVURJT19EUkFJTl9FQVJMWV9OT1RJRlkgOiBBVURJT19EUkFJTl9BTEwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Zmx1c2goKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmZsdXNoID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Zmx1c2gobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCkgewotICAgIGlmIChtU3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbihtU3RyZWFtLCBmcmFtZXMsIHRpbWVzdGFtcCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdGFydCgpIHsKLSAgICBpZiAobVN0cmVhbS0+c3RhcnQgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zdGFydChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN0b3AoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnN0b3AgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zdG9wKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKLSAgICBpZiAobVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyKG1TdHJlYW0sIG1pblNpemVGcmFtZXMsIGluZm8pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgewotICAgIGlmIChtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uKG1TdHJlYW0sIHBvc2l0aW9uKTsKLX0KLQotU3RyZWFtSW5IYWxMb2NhbDo6U3RyZWFtSW5IYWxMb2NhbChhdWRpb19zdHJlYW1faW5fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQotICAgICAgICA6IFN0cmVhbUhhbExvY2FsKCZzdHJlYW0tPmNvbW1vbiwgZGV2aWNlKSwgbVN0cmVhbShzdHJlYW0pIHsKLX0KLQotU3RyZWFtSW5IYWxMb2NhbDo6flN0cmVhbUluSGFsTG9jYWwoKSB7Ci0gICAgbURldmljZS0+Y2xvc2VJbnB1dFN0cmVhbShtU3RyZWFtKTsKLSAgICBtU3RyZWFtID0gMDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gYXVkaW9fc3RyZWFtX2luX2ZyYW1lX3NpemUobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzZXRHYWluKGZsb2F0IGdhaW4pIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+c2V0X2dhaW4obVN0cmVhbSwgZ2Fpbik7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgewotICAgIHNzaXplX3QgcmVhZFJlc3VsdCA9IG1TdHJlYW0tPnJlYWQobVN0cmVhbSwgYnVmZmVyLCBieXRlcyk7Ci0gICAgaWYgKHJlYWRSZXN1bHQgPiAwKSB7Ci0gICAgICAgICpyZWFkID0gcmVhZFJlc3VsdDsKLSAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyggYnVmZmVyLCAqcmVhZCk7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgewotICAgICAgICAqcmVhZCA9IDA7Ci0gICAgICAgIHJldHVybiByZWFkUmVzdWx0OwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KSB7Ci0gICAgKmZyYW1lc0xvc3QgPSBtU3RyZWFtLT5nZXRfaW5wdXRfZnJhbWVzX2xvc3QobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9jYXB0dXJlX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X2NhcHR1cmVfcG9zaXRpb24obVN0cmVhbSwgZnJhbWVzLCB0aW1lKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c3RhcnQoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnN0YXJ0ID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RhcnQobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnN0b3AoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnN0b3AgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zdG9wKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgewotICAgIGlmIChtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIobVN0cmVhbSwgbWluU2l6ZUZyYW1lcywgaW5mbyk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbihtU3RyZWFtLCBwb3NpdGlvbik7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9TdHJlYW1IYWxMb2NhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzEzNmRmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL1N0cmVhbUhhbExvY2FsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0xPQ0FMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0xPQ0FMX0gKLQotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgIlN0cmVhbVBvd2VyTG9nLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGV2aWNlSGFsTG9jYWw7Ci0KLWNsYXNzIFN0cmVhbUhhbExvY2FsIDogcHVibGljIHZpcnR1YWwgU3RyZWFtSGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIHNhbXBsaW5nIHJhdGUgaW4gSHogLSBlZy4gNDQxMDAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKTsKLQotICAgIC8vIFJldHVybiBzaXplIG9mIGlucHV0L291dHB1dCBidWZmZXIgaW4gYnl0ZXMgZm9yIHRoaXMgc3RyZWFtIC0gZWcuIDQ4MDAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGNoYW5uZWwgbWFzay4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKTsKLQotICAgIC8vIFJldHVybiB0aGUgYXVkaW8gZm9ybWF0IC0gZS5nLiBBVURJT19GT1JNQVRfUENNXzE2X0JJVC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKLQotICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7Ci0KLSAgICAvLyBTZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOwotCi0gICAgLy8gR2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgLy8gQWRkIG9yIHJlbW92ZSB0aGUgZWZmZWN0IG9uIHRoZSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKLQotICAgIC8vIFB1dCB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQvb3V0cHV0IGludG8gc3RhbmRieSBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhbmRieSgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7Ci0KLSAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSA9IDA7Ci0KLSAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgPSAwOwotCi0gICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgPSAwOwotCi0gICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pID0gMDsKLQotICAgIC8vIFNldCB0aGUgcHJpb3JpdHkgb2YgdGhlIHRocmVhZCB0aGF0IGludGVyYWN0cyB3aXRoIHRoZSBIQUwKLSAgICAvLyAobXVzdCBtYXRjaCB0aGUgcHJpb3JpdHkgb2YgdGhlIGF1ZGlvZmxpbmdlcidzIHRocmVhZCB0aGF0IGNhbGxzICdyZWFkJyAvICd3cml0ZScpCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQgcHJpb3JpdHkpOwotCi0gIHByb3RlY3RlZDoKLSAgICAvLyBTdWJjbGFzc2VzIGNhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBTdHJlYW1IYWxMb2NhbChhdWRpb19zdHJlYW1fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKLQotICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBzdHJlYW0uCi0gICAgdmlydHVhbCB+U3RyZWFtSGFsTG9jYWwoKTsKLQotICAgIHNwPERldmljZUhhbExvY2FsPiBtRGV2aWNlOwotCi0gICAgLy8gbVN0cmVhbVBvd2VyTG9nIGlzIHVzZWQgZm9yIGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgotICAgIFN0cmVhbVBvd2VyTG9nIG1TdHJlYW1Qb3dlckxvZzsKLQotICBwcml2YXRlOgotICAgIGF1ZGlvX3N0cmVhbV90ICptU3RyZWFtOwotfTsKLQotY2xhc3MgU3RyZWFtT3V0SGFsTG9jYWwgOiBwdWJsaWMgU3RyZWFtT3V0SGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsTG9jYWwgewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFJldHVybiB0aGUgYXVkaW8gaGFyZHdhcmUgZHJpdmVyIGVzdGltYXRlZCBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpOwotCi0gICAgLy8gVXNlIHRoaXMgbWV0aG9kIGluIHNpdHVhdGlvbnMgd2hlcmUgYXVkaW8gbWl4aW5nIGlzIGRvbmUgaW4gdGhlIGhhcmR3YXJlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKLQotICAgIC8vIFdyaXRlIGF1ZGlvIGJ1ZmZlciB0byBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKTsKLQotICAgIC8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyB3cml0dGVuIGJ5IHRoZSBhdWRpbyBkc3AgdG8gREFDIHNpbmNlCi0gICAgLy8gdGhlIG91dHB1dCBoYXMgZXhpdGVkIHN0YW5kYnkuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKTsKLQotICAgIC8vIEdldCB0aGUgbG9jYWwgdGltZSBhdCB3aGljaCB0aGUgbmV4dCB3cml0ZSB0byB0aGUgYXVkaW8gZHJpdmVyIHdpbGwgYmUgcHJlc2VudGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCk7Ci0KLSAgICAvLyBTZXQgdGhlIGNhbGxiYWNrIGZvciBub3RpZnlpbmcgY29tcGxldGlvbiBvZiBub24tYmxvY2tpbmcgd3JpdGUgYW5kIGRyYWluLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBwYXVzZSBhbmQgcmVzdW1lIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZXN1bWUoKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBkcmFpbiBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKTsKLQotICAgIC8vIFJlcXVlc3RzIG5vdGlmaWNhdGlvbiB3aGVuIGRhdGEgYnVmZmVyZWQgYnkgdGhlIGRyaXZlci9oYXJkd2FyZSBoYXMgYmVlbiBwbGF5ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkcmFpbihib29sIGVhcmx5Tm90aWZ5KTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gZmx1c2ggdGhlIHF1ZXVlZCBkYXRhLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKTsKLQotICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyBwcmVzZW50ZWQgdG8gYW4gZXh0ZXJuYWwgb2JzZXJ2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCk7Ci0KLSAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKLQotICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLQotICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOwotCi0gICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOwotCi0gIHByaXZhdGU6Ci0gICAgYXVkaW9fc3RyZWFtX291dF90ICptU3RyZWFtOwotICAgIHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBtQ2FsbGJhY2s7Ci0KLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsTG9jYWw7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtT3V0SGFsTG9jYWwoYXVkaW9fc3RyZWFtX291dF90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpOwotCi0gICAgdmlydHVhbCB+U3RyZWFtT3V0SGFsTG9jYWwoKTsKLQotICAgIHN0YXRpYyBpbnQgYXN5bmNDYWxsYmFjayhzdHJlYW1fY2FsbGJhY2tfZXZlbnRfdCBldmVudCwgdm9pZCAqcGFyYW0sIHZvaWQgKmNvb2tpZSk7Ci19OwotCi1jbGFzcyBTdHJlYW1JbkhhbExvY2FsIDogcHVibGljIFN0cmVhbUluSGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsTG9jYWwgewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFNldCB0aGUgaW5wdXQgZ2FpbiBmb3IgdGhlIGF1ZGlvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEdhaW4oZmxvYXQgZ2Fpbik7Ci0KLSAgICAvLyBSZWFkIGF1ZGlvIGJ1ZmZlciBpbiBmcm9tIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGFtb3VudCBvZiBpbnB1dCBmcmFtZXMgbG9zdCBpbiB0aGUgYXVkaW8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KTsKLQotICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyByZWNlaXZlZCBhbmQKLSAgICAvLyB0aGUgY2xvY2sgdGltZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBmcmFtZSBjb3VudC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpOwotCi0gICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7Ci0KLSAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0KLSAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKLQotICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKLQotICBwcml2YXRlOgotICAgIGF1ZGlvX3N0cmVhbV9pbl90ICptU3RyZWFtOwotCi0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbExvY2FsOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbUluSGFsTG9jYWwoYXVkaW9fc3RyZWFtX2luX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7Ci0KLSAgICB2aXJ0dWFsIH5TdHJlYW1JbkhhbExvY2FsKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmgKaW5kZXggY2FmMDFiZS4uN2RlOGViMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oCkBAIC0xNyw2ICsxNyw3IEBACiAjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9JTlRFUkZBQ0VfSAogI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSU5URVJGQUNFX0gKIAorI2luY2x1ZGUgPG1lZGlhL01pY3JvcGhvbmVJbmZvLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgpAQCAtMTA1LDYgKzEwNiw5IEBACiAgICAgLy8gU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgPSAwOwogCisgICAgLy8gTGlzdCBtaWNyb3Bob25lcworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpID0gMDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpID0gMDsKIAogICBwcm90ZWN0ZWQ6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbEludGVyZmFjZS5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UuaAppbmRleCBlODYyZjZlLi5kMDYwM2NkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbEludGVyZmFjZS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlLmgKQEAgLTI2LDYgKzI2LDcgQEAKIC8vIEFic3RyYWN0aW9uIGZvciBhbiBhdWRpbyBidWZmZXIuIEl0IG1heSBiZSBhICJtaXJyb3IiIGZvcgogLy8gYSBidWZmZXIgdGhhdCB0aGUgZWZmZWN0IGNoYWluIGRvZXNuJ3Qgb3duLCBvciBhIGJ1ZmZlciBvd25lZCBieQogLy8gdGhlIGVmZmVjdCBjaGFpbi4KKy8vIEJ1ZmZlcnMgYXJlIGNyZWF0ZWQgZnJvbSBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZQogY2xhc3MgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlIDogcHVibGljIFJlZkJhc2UKIHsKICAgcHVibGljOgpAQCAtMzcsNiArMzgsOCBAQAogICAgICAgICByZXR1cm4gZXh0ZXJuYWxEYXRhKCkgIT0gbnVsbHB0ciA/IGV4dGVybmFsRGF0YSgpIDogYXVkaW9CdWZmZXIoKS0+cmF3OwogICAgIH0KIAorICAgIHZpcnR1YWwgc2l6ZV90IGdldFNpemUoKSBjb25zdCA9IDA7CisKICAgICB2aXJ0dWFsIHZvaWQgc2V0RXh0ZXJuYWxEYXRhKHZvaWQqIGV4dGVybmFsKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIHNldEZyYW1lQ291bnQoc2l6ZV90IGZyYW1lQ291bnQpID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgY2hlY2tGcmFtZUNvdW50Q2hhbmdlKCkgPSAwOyAgLy8gcmV0dXJucyB3aGV0aGVyIGZyYW1lIGNvdW50IGhhcyBiZWVuIHVwZGF0ZWQKQEAgLTQ3LDkgKzUwLDYgQEAKICAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlKHNpemVfdCBzaXplKSA9IDA7ICAvLyBjb3BpZXMgcGFydGlhbCBkYXRhIGZyb20gZXh0ZXJuYWwgYnVmZmVyCiAgICAgdmlydHVhbCB2b2lkIGNvbW1pdChzaXplX3Qgc2l6ZSkgPSAwOyAgLy8gY29waWVzIHBhcnRpYWwgZGF0YSB0byBleHRlcm5hbCBidWZmZXIKIAotICAgIHN0YXRpYyBzdGF0dXNfdCBhbGxvY2F0ZShzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKTsKLSAgICBzdGF0aWMgc3RhdHVzX3QgbWlycm9yKHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKTsKLQogICBwcm90ZWN0ZWQ6CiAgICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCiAgICAgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlKCkge30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaAppbmRleCBhNjE2ZTg2Li4zMTZhNDZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oCkBAIC00OCw2ICs0OCwxMCBAQAogCiAgICAgc3RhdGljIHNwPEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlPiBjcmVhdGUoKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXIoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgbWlycm9yQnVmZmVyKHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpID0gMDsKKwogICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjb21wYXJlIGVmZmVjdCB1dWlkIHRvIEVGRkVDVF9VVUlEX05VTEwuCiAgICAgc3RhdGljIGJvb2wgaXNOdWxsVXVpZChjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oCmluZGV4IDc0MTljMzQuLmM5NjllMjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaApAQCAtMTcsNyArMTcsMTAgQEAKICNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0lOVEVSRkFDRV9ICiAjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9JTlRFUkZBQ0VfSAogCisjaW5jbHVkZSA8dmVjdG9yPgorCiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWljcm9waG9uZUluZm8uaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CkBAIC0xNDIsNiArMTQ1LDE1IEBACiAgICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHByZXNlbnRlZCB0byBhbiBleHRlcm5hbCBvYnNlcnZlci4KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKSA9IDA7CiAKKyAgICBzdHJ1Y3QgU291cmNlTWV0YWRhdGEgeworICAgICAgICBzdGQ6OnZlY3RvcjxwbGF5YmFja190cmFja19tZXRhZGF0YV90PiB0cmFja3M7CisgICAgfTsKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkLgorICAgICAqIEBwYXJhbSBzb3VyY2VNZXRhZGF0YSBEZXNjcmlwdGlvbiBvZiB0aGUgYXVkaW8gdGhhdCBpcyBwbGF5ZWQgYnkgdGhlIGNsaWVudHMuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCB1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpID0gMDsKKwogICBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+U3RyZWFtT3V0SGFsSW50ZXJmYWNlKCkge30KIH07CkBAIC0xNjEsNiArMTczLDE4IEBACiAgICAgLy8gdGhlIGNsb2NrIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZnJhbWUgY291bnQuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKSA9IDA7CiAKKyAgICAvLyBHZXQgYWN0aXZlIG1pY3JvcGhvbmVzCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykgPSAwOworCisgICAgc3RydWN0IFNpbmtNZXRhZGF0YSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHJlY29yZF90cmFja19tZXRhZGF0YV90PiB0cmFja3M7CisgICAgfTsKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNpbmsgaGFzIGJlZW4gY2hhbmdlZC4KKyAgICAgKiBAcGFyYW0gc2lua01ldGFkYXRhIERlc2NyaXB0aW9uIG9mIHRoZSBhdWRpbyB0aGF0IGlzIHN1Z2dlc3RlZCBieSB0aGUgY2xpZW50cy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgPSAwOworCiAgIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5TdHJlYW1JbkhhbEludGVyZmFjZSgpIHt9CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0FuZHJvaWQubWsgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQW5kcm9pZC5tawppbmRleCBjODUwOTg0Li5kYTFlY2MyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQW5kcm9pZC5tawpAQCAtMjQsNiArMjQsNyBAQAogICAgIGxpYmN1dGlscyBcCiAgICAgbGlibG9nIFwKICAgICBsaWJuYmFpbyBcCisgICAgbGlibmJsb2cgXAogICAgIGxpYnNvbmljIFwKICAgICBsaWJ1dGlscyBcCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb01peGVyLmNwcCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb01peGVyLmNwcAppbmRleCAyMzg5MjVkLi5hYTM5NDQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlci5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXIuY3BwCkBAIC02MiwyMSArNjIsMjIgQEAKICNkZWZpbmUgQVJSQVlfU0laRSh4KSAoc2l6ZW9mKHgpL3NpemVvZigoeClbMF0pKQogI2VuZGlmCiAKLS8vIFRPRE86IE1vdmUgdGhlc2UgbWFjcm8vaW5saW5lcyB0byBhIGhlYWRlciBmaWxlLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdGF0aWMgaW5saW5lCi1UIG1heChjb25zdCBUJiB4LCBjb25zdCBUJiB5KSB7Ci0gICAgcmV0dXJuIHggPiB5ID8geCA6IHk7Ci19Ci0KIC8vIFNldCBrVXNlTmV3TWl4ZXIgdG8gdHJ1ZSB0byB1c2UgdGhlIG5ldyBtaXhlciBlbmdpbmUgYWx3YXlzLiBPdGhlcndpc2UgdGhlCiAvLyBvcmlnaW5hbCBjb2RlIHdpbGwgYmUgdXNlZCBmb3Igc3RlcmVvIHNpbmtzLCB0aGUgbmV3IG1peGVyIGZvciBtdWx0aWNoYW5uZWwuCi1zdGF0aWMgY29uc3QgYm9vbCBrVXNlTmV3TWl4ZXIgPSB0cnVlOworc3RhdGljIGNvbnN0ZXhwciBib29sIGtVc2VOZXdNaXhlciA9IHRydWU7CiAKIC8vIFNldCBrVXNlRmxvYXQgdG8gdHJ1ZSB0byBhbGxvdyBmbG9hdGluZyBpbnB1dCBpbnRvIHRoZSBtaXhlciBlbmdpbmUuCiAvLyBJZiBrVXNlTmV3TWl4ZXIgaXMgZmFsc2UsIHRoaXMgaXMgaWdub3JlZCBvciBtYXkgYmUgb3ZlcnJpZGRlbiBpbnRlcm5hbGx5CiAvLyBiZWNhdXNlIG9mIGRvd25taXgvdXBtaXggc3VwcG9ydC4KLXN0YXRpYyBjb25zdCBib29sIGtVc2VGbG9hdCA9IHRydWU7CitzdGF0aWMgY29uc3RleHByIGJvb2wga1VzZUZsb2F0ID0gdHJ1ZTsKKworI2lmZGVmIEZMT0FUX0FVWAordXNpbmcgVFlQRV9BVVggPSBmbG9hdDsKK3N0YXRpY19hc3NlcnQoa1VzZU5ld01peGVyICYmIGtVc2VGbG9hdCwKKyAgICAgICAgImtVc2VOZXdNaXhlciBhbmQga1VzZUZsb2F0IG11c3QgYmUgdHJ1ZSBmb3IgRkxPQVRfQVVYIG9wdGlvbiIpOworI2Vsc2UKK3VzaW5nIFRZUEVfQVVYID0gaW50MzJfdDsgLy8gcTQuMjcKKyNlbmRpZgogCiAvLyBTZXQgdG8gZGVmYXVsdCBjb3B5IGJ1ZmZlciBzaXplIGluIGZyYW1lcyBmb3IgaW5wdXQgcHJvY2Vzc2luZy4KIHN0YXRpYyBjb25zdCBzaXplX3Qga0NvcHlCdWZmZXJGcmFtZUNvdW50ID0gMjU2OwpAQCAtODUsODggKzg2LDI4IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1UIG1pbihjb25zdCBUJiBhLCBjb25zdCBUJiBiKQotewotICAgIHJldHVybiBhIDwgYiA/IGEgOiBiOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEVuc3VyZSBtQ29uZmlndXJlZE5hbWVzIGJpdG1hc2sgaXMgaW5pdGlhbGl6ZWQgcHJvcGVybHkgb24gYWxsIGFyY2hpdGVjdHVyZXMuCi0vLyBUaGUgdmFsdWUgb2YgMSA8PCB4IGlzIHVuZGVmaW5lZCBpbiBDIHdoZW4geCA+PSAzMi4KLQotQXVkaW9NaXhlcjo6QXVkaW9NaXhlcihzaXplX3QgZnJhbWVDb3VudCwgdWludDMyX3Qgc2FtcGxlUmF0ZSwgdWludDMyX3QgbWF4TnVtVHJhY2tzKQotICAgIDogICBtVHJhY2tOYW1lcygwKSwgbUNvbmZpZ3VyZWROYW1lcygobWF4TnVtVHJhY2tzID49IDMyID8gMCA6IDEgPDwgbWF4TnVtVHJhY2tzKSAtIDEpLAotICAgICAgICBtU2FtcGxlUmF0ZShzYW1wbGVSYXRlKQotewotICAgIEFMT0dfQVNTRVJUKG1heE51bVRyYWNrcyA8PSBNQVhfTlVNX1RSQUNLUywgIm1heE51bVRyYWNrcyAldSA+IE1BWF9OVU1fVFJBQ0tTICV1IiwKLSAgICAgICAgICAgIG1heE51bVRyYWNrcywgTUFYX05VTV9UUkFDS1MpOwotCi0gICAgLy8gQXVkaW9NaXhlciBpcyBub3QgeWV0IGNhcGFibGUgb2YgbW9yZSB0aGFuIDMyIGFjdGl2ZSB0cmFjayBpbnB1dHMKLSAgICBBTE9HX0FTU0VSVCgzMiA+PSBNQVhfTlVNX1RSQUNLUywgImJhZCBNQVhfTlVNX1RSQUNLUyAlZCIsIE1BWF9OVU1fVFJBQ0tTKTsKLQotICAgIHB0aHJlYWRfb25jZSgmc09uY2VDb250cm9sLCAmc0luaXRSb3V0aW5lKTsKLQotICAgIG1TdGF0ZS5lbmFibGVkVHJhY2tzPSAwOwotICAgIG1TdGF0ZS5uZWVkc0NoYW5nZWQgPSAwOwotICAgIG1TdGF0ZS5mcmFtZUNvdW50ICAgPSBmcmFtZUNvdW50OwotICAgIG1TdGF0ZS5ob29rICAgICAgICAgPSBwcm9jZXNzX19ub3A7Ci0gICAgbVN0YXRlLm91dHB1dFRlbXAgICA9IE5VTEw7Ci0gICAgbVN0YXRlLnJlc2FtcGxlVGVtcCA9IE5VTEw7Ci0gICAgbVN0YXRlLm1OQkxvZ1dyaXRlciA9ICZtRHVtbXlMb2dXcml0ZXI7Ci0gICAgLy8gbVN0YXRlLnJlc2VydmVkCi0KLSAgICAvLyBGSVhNRSBNb3N0IG9mIHRoZSBmb2xsb3dpbmcgaW5pdGlhbGl6YXRpb24gaXMgcHJvYmFibHkgcmVkdW5kYW50IHNpbmNlCi0gICAgLy8gdHJhY2tzW2ldIHNob3VsZCBvbmx5IGJlIHJlZmVyZW5jZWQgaWYgKG1UcmFja05hbWVzICYgKDEgPDwgaSkpICE9IDAKLSAgICAvLyBhbmQgbVRyYWNrTmFtZXMgaXMgaW5pdGlhbGx5IDAuICBIb3dldmVyLCBsZWF2ZSBpdCBoZXJlIHVudGlsIHRoYXQncyB2ZXJpZmllZC4KLSAgICB0cmFja190KiB0ID0gbVN0YXRlLnRyYWNrczsKLSAgICBmb3IgKHVuc2lnbmVkIGk9MCA7IGkgPCBNQVhfTlVNX1RSQUNLUyA7IGkrKykgewotICAgICAgICB0LT5yZXNhbXBsZXIgPSBOVUxMOwotICAgICAgICB0LT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlciA9IE5VTEw7Ci0gICAgICAgIHQtPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKLSAgICAgICAgdC0+bVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIgPSBOVUxMOwotICAgICAgICB0Kys7Ci0gICAgfQotCi19Ci0KLUF1ZGlvTWl4ZXI6On5BdWRpb01peGVyKCkKLXsKLSAgICB0cmFja190KiB0ID0gbVN0YXRlLnRyYWNrczsKLSAgICBmb3IgKHVuc2lnbmVkIGk9MCA7IGkgPCBNQVhfTlVNX1RSQUNLUyA7IGkrKykgewotICAgICAgICBkZWxldGUgdC0+cmVzYW1wbGVyOwotICAgICAgICBkZWxldGUgdC0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXI7Ci0gICAgICAgIGRlbGV0ZSB0LT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlcjsKLSAgICAgICAgZGVsZXRlIHQtPm1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyOwotICAgICAgICB0Kys7Ci0gICAgfQotICAgIGRlbGV0ZSBbXSBtU3RhdGUub3V0cHV0VGVtcDsKLSAgICBkZWxldGUgW10gbVN0YXRlLnJlc2FtcGxlVGVtcDsKLX0KLQotdm9pZCBBdWRpb01peGVyOjpzZXROQkxvZ1dyaXRlcihOQkxvZzo6V3JpdGVyICpsb2dXcml0ZXIpCi17Ci0gICAgbVN0YXRlLm1OQkxvZ1dyaXRlciA9IGxvZ1dyaXRlcjsKLX0KLQogc3RhdGljIGlubGluZSBhdWRpb19mb3JtYXRfdCBzZWxlY3RNaXhlckluRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGlucHV0Rm9ybWF0IF9fdW51c2VkKSB7CiAgICAgcmV0dXJuIGtVc2VGbG9hdCAmJiBrVXNlTmV3TWl4ZXIgPyBBVURJT19GT1JNQVRfUENNX0ZMT0FUIDogQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiB9CiAKLWludCBBdWRpb01peGVyOjpnZXRUcmFja05hbWUoYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IHNlc3Npb25JZCkKK3N0YXR1c190IEF1ZGlvTWl4ZXI6OmNyZWF0ZSgKKyAgICAgICAgaW50IG5hbWUsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBzZXNzaW9uSWQpCiB7Ci0gICAgaWYgKCFpc1ZhbGlkUGNtVHJhY2tGb3JtYXQoZm9ybWF0KSkgewotICAgICAgICBBTE9HRSgiQXVkaW9NaXhlcjo6Z2V0VHJhY2tOYW1lIGludmFsaWQgZm9ybWF0ICglI3gpIiwgZm9ybWF0KTsKLSAgICAgICAgcmV0dXJuIC0xOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZXhpc3RzKG5hbWUpLCAibmFtZSAlZCBhbHJlYWR5IGV4aXN0cyIsIG5hbWUpOworCisgICAgaWYgKCFpc1ZhbGlkQ2hhbm5lbE1hc2soY2hhbm5lbE1hc2spKSB7CisgICAgICAgIEFMT0dFKCIlcyBpbnZhbGlkIGNoYW5uZWxNYXNrOiAlI3giLCBfX2Z1bmNfXywgY2hhbm5lbE1hc2spOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICB1aW50MzJfdCBuYW1lcyA9ICh+bVRyYWNrTmFtZXMpICYgbUNvbmZpZ3VyZWROYW1lczsKLSAgICBpZiAobmFtZXMgIT0gMCkgewotICAgICAgICBpbnQgbiA9IF9fYnVpbHRpbl9jdHoobmFtZXMpOwotICAgICAgICBBTE9HVigiYWRkIHRyYWNrICglZCkiLCBuKTsKKyAgICBpZiAoIWlzVmFsaWRGb3JtYXQoZm9ybWF0KSkgeworICAgICAgICBBTE9HRSgiJXMgaW52YWxpZCBmb3JtYXQ6ICUjeCIsIF9fZnVuY19fLCBmb3JtYXQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGF1dG8gdCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VHJhY2s+KCk7CisgICAgeworICAgICAgICAvLyBUT0RPOiBtb3ZlIGluaXRpYWxpemF0aW9uIHRvIHRoZSBUcmFjayBjb25zdHJ1Y3Rvci4KICAgICAgICAgLy8gYXNzdW1lIGRlZmF1bHQgcGFyYW1ldGVycyBmb3IgdGhlIHRyYWNrLCBleGNlcHQgd2hlcmUgbm90ZWQgYmVsb3cKLSAgICAgICAgdHJhY2tfdCogdCA9ICZtU3RhdGUudHJhY2tzW25dOwogICAgICAgICB0LT5uZWVkcyA9IDA7CiAKICAgICAgICAgLy8gSW50ZWdlciB2b2x1bWUuCkBAIC0yMDcsMTcgKzE0OCwxMiBAQAogICAgICAgICAvLyBubyBpbml0aWFsaXphdGlvbiBuZWVkZWQKICAgICAgICAgLy8gdC0+YnVmZmVyLmZyYW1lQ291bnQKICAgICAgICAgdC0+aG9vayA9IE5VTEw7Ci0gICAgICAgIHQtPmluID0gTlVMTDsKLSAgICAgICAgdC0+cmVzYW1wbGVyID0gTlVMTDsKKyAgICAgICAgdC0+bUluID0gTlVMTDsKICAgICAgICAgdC0+c2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOwogICAgICAgICAvLyBzZXRQYXJhbWV0ZXIobmFtZSwgVFJBQ0ssIE1BSU5fQlVGRkVSLCBtaXhCdWZmZXIpIGlzIHJlcXVpcmVkIGJlZm9yZSBlbmFibGUobmFtZSkKICAgICAgICAgdC0+bWFpbkJ1ZmZlciA9IE5VTEw7CiAgICAgICAgIHQtPmF1eEJ1ZmZlciA9IE5VTEw7CiAgICAgICAgIHQtPm1JbnB1dEJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKLSAgICAgICAgdC0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgPSBOVUxMOwotICAgICAgICB0LT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlciA9IE5VTEw7Ci0gICAgICAgIHQtPm1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgPSBOVUxMOwotICAgICAgICB0LT5tVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlciA9IE5VTEw7CiAgICAgICAgIHQtPm1NaXhlckZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgICAgICB0LT5tRm9ybWF0ID0gZm9ybWF0OwogICAgICAgICB0LT5tTWl4ZXJJbkZvcm1hdCA9IHNlbGVjdE1peGVySW5Gb3JtYXQoZm9ybWF0KTsKQEAgLTIzMCw5NiArMTY2LDg0IEBACiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHQtPnByZXBhcmVGb3JEb3dubWl4KCk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCJBdWRpb01peGVyOjpnZXRUcmFja05hbWUgaW52YWxpZCBjaGFubmVsTWFzayAoJSN4KSIsIGNoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICAgICAgLy8gcHJlcGFyZUZvckRvd25taXgoKSBtYXkgY2hhbmdlIG1Eb3dubWl4UmVxdWlyZXNGb3JtYXQKICAgICAgICAgQUxPR1ZWKCJtTWl4ZXJGb3JtYXQ6JSN4ICBtTWl4ZXJJbkZvcm1hdDolI3hcbiIsIHQtPm1NaXhlckZvcm1hdCwgdC0+bU1peGVySW5Gb3JtYXQpOwogICAgICAgICB0LT5wcmVwYXJlRm9yUmVmb3JtYXQoKTsKLSAgICAgICAgbVRyYWNrTmFtZXMgfD0gMSA8PCBuOwotICAgICAgICByZXR1cm4gVFJBQ0swICsgbjsKLSAgICB9Ci0gICAgQUxPR0UoIkF1ZGlvTWl4ZXI6OmdldFRyYWNrTmFtZSBvdXQgb2YgYXZhaWxhYmxlIHRyYWNrcyIpOwotICAgIHJldHVybiAtMTsKLX0KIAotdm9pZCBBdWRpb01peGVyOjppbnZhbGlkYXRlU3RhdGUodWludDMyX3QgbWFzaykKLXsKLSAgICBpZiAobWFzayAhPSAwKSB7Ci0gICAgICAgIG1TdGF0ZS5uZWVkc0NoYW5nZWQgfD0gbWFzazsKLSAgICAgICAgbVN0YXRlLmhvb2sgPSBwcm9jZXNzX192YWxpZGF0ZTsKKyAgICAgICAgbVRyYWNrc1tuYW1lXSA9IHQ7CisgICAgICAgIHJldHVybiBPSzsKICAgICB9Ci0gfQorfQogCiAvLyBDYWxsZWQgd2hlbiBjaGFubmVsIG1hc2tzIGhhdmUgY2hhbmdlZCBmb3IgYSB0cmFjayBuYW1lCiAvLyBUT0RPOiBGaXggRG93bm1peGVyQnVmZmVyUHJvdmlkZXIgbm90IHRvIChwb3NzaWJseSkgY2hhbmdlIG1peGVyIGlucHV0IGZvcm1hdCwKIC8vIHdoaWNoIHdpbGwgc2ltcGxpZnkgdGhpcyBsb2dpYy4KIGJvb2wgQXVkaW9NaXhlcjo6c2V0Q2hhbm5lbE1hc2tzKGludCBuYW1lLAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCB0cmFja0NoYW5uZWxNYXNrLCBhdWRpb19jaGFubmVsX21hc2tfdCBtaXhlckNoYW5uZWxNYXNrKSB7Ci0gICAgdHJhY2tfdCAmdHJhY2sgPSBtU3RhdGUudHJhY2tzW25hbWVdOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIWV4aXN0cyhuYW1lKSwgImludmFsaWQgbmFtZTogJWQiLCBuYW1lKTsKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2s+ICZ0cmFjayA9IG1UcmFja3NbbmFtZV07CiAKLSAgICBpZiAodHJhY2tDaGFubmVsTWFzayA9PSB0cmFjay5jaGFubmVsTWFzawotICAgICAgICAgICAgJiYgbWl4ZXJDaGFubmVsTWFzayA9PSB0cmFjay5tTWl4ZXJDaGFubmVsTWFzaykgeworICAgIGlmICh0cmFja0NoYW5uZWxNYXNrID09IHRyYWNrLT5jaGFubmVsTWFzaworICAgICAgICAgICAgJiYgbWl4ZXJDaGFubmVsTWFzayA9PSB0cmFjay0+bU1peGVyQ2hhbm5lbE1hc2spIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gbm8gbmVlZCB0byBjaGFuZ2UKICAgICB9CiAgICAgLy8gYWx3YXlzIHJlY29tcHV0ZSBmb3IgYm90aCBjaGFubmVsIG1hc2tzIGV2ZW4gaWYgb25seSBvbmUgaGFzIGNoYW5nZWQuCiAgICAgY29uc3QgdWludDMyX3QgdHJhY2tDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sodHJhY2tDaGFubmVsTWFzayk7CiAgICAgY29uc3QgdWludDMyX3QgbWl4ZXJDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobWl4ZXJDaGFubmVsTWFzayk7Ci0gICAgY29uc3QgYm9vbCBtaXhlckNoYW5uZWxDb3VudENoYW5nZWQgPSB0cmFjay5tTWl4ZXJDaGFubmVsQ291bnQgIT0gbWl4ZXJDaGFubmVsQ291bnQ7CisgICAgY29uc3QgYm9vbCBtaXhlckNoYW5uZWxDb3VudENoYW5nZWQgPSB0cmFjay0+bU1peGVyQ2hhbm5lbENvdW50ICE9IG1peGVyQ2hhbm5lbENvdW50OwogCiAgICAgQUxPR19BU1NFUlQoKHRyYWNrQ2hhbm5lbENvdW50IDw9IE1BWF9OVU1fQ0hBTk5FTFNfVE9fRE9XTk1JWCkKICAgICAgICAgICAgICYmIHRyYWNrQ2hhbm5lbENvdW50CiAgICAgICAgICAgICAmJiBtaXhlckNoYW5uZWxDb3VudCk7Ci0gICAgdHJhY2suY2hhbm5lbE1hc2sgPSB0cmFja0NoYW5uZWxNYXNrOwotICAgIHRyYWNrLmNoYW5uZWxDb3VudCA9IHRyYWNrQ2hhbm5lbENvdW50OwotICAgIHRyYWNrLm1NaXhlckNoYW5uZWxNYXNrID0gbWl4ZXJDaGFubmVsTWFzazsKLSAgICB0cmFjay5tTWl4ZXJDaGFubmVsQ291bnQgPSBtaXhlckNoYW5uZWxDb3VudDsKKyAgICB0cmFjay0+Y2hhbm5lbE1hc2sgPSB0cmFja0NoYW5uZWxNYXNrOworICAgIHRyYWNrLT5jaGFubmVsQ291bnQgPSB0cmFja0NoYW5uZWxDb3VudDsKKyAgICB0cmFjay0+bU1peGVyQ2hhbm5lbE1hc2sgPSBtaXhlckNoYW5uZWxNYXNrOworICAgIHRyYWNrLT5tTWl4ZXJDaGFubmVsQ291bnQgPSBtaXhlckNoYW5uZWxDb3VudDsKIAogICAgIC8vIGNoYW5uZWwgbWFza3MgaGF2ZSBjaGFuZ2VkLCBkb2VzIHRoaXMgdHJhY2sgbmVlZCBhIGRvd25taXhlcj8KICAgICAvLyB1cGRhdGUgdG8gdHJ5IHVzaW5nIG91ciBkZXNpcmVkIGZvcm1hdCAoaWYgd2UgYXJlbid0IGFscmVhZHkgdXNpbmcgaXQpCi0gICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgcHJldkRvd25taXhlckZvcm1hdCA9IHRyYWNrLm1Eb3dubWl4UmVxdWlyZXNGb3JtYXQ7Ci0gICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0gbVN0YXRlLnRyYWNrc1tuYW1lXS5wcmVwYXJlRm9yRG93bm1peCgpOworICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IHRyYWNrLT5wcmVwYXJlRm9yRG93bm1peCgpOwogICAgIEFMT0dFX0lGKHN0YXR1cyAhPSBPSywKICAgICAgICAgICAgICJwcmVwYXJlRm9yRG93bm1peCBlcnJvciAlZCwgdHJhY2sgY2hhbm5lbCBtYXNrICUjeCwgbWl4ZXIgY2hhbm5lbCBtYXNrICUjeCIsCi0gICAgICAgICAgICBzdGF0dXMsIHRyYWNrLmNoYW5uZWxNYXNrLCB0cmFjay5tTWl4ZXJDaGFubmVsTWFzayk7CisgICAgICAgICAgICBzdGF0dXMsIHRyYWNrLT5jaGFubmVsTWFzaywgdHJhY2stPm1NaXhlckNoYW5uZWxNYXNrKTsKIAotICAgIGlmIChwcmV2RG93bm1peGVyRm9ybWF0ICE9IHRyYWNrLm1Eb3dubWl4UmVxdWlyZXNGb3JtYXQpIHsKLSAgICAgICAgdHJhY2sucHJlcGFyZUZvclJlZm9ybWF0KCk7IC8vIGJlY2F1c2Ugb2YgZG93bm1peGVyLCB0cmFjayBmb3JtYXQgbWF5IGNoYW5nZSEKLSAgICB9CisgICAgLy8gYWx3YXlzIGRvIHJlZm9ybWF0IHNpbmNlIGNoYW5uZWwgbWFzayBjaGFuZ2VkLAorICAgIC8vIGRvIGl0IGFmdGVyIGRvd25taXggc2luY2UgdHJhY2sgZm9ybWF0IG1heSBjaGFuZ2UhCisgICAgdHJhY2stPnByZXBhcmVGb3JSZWZvcm1hdCgpOwogCi0gICAgaWYgKHRyYWNrLnJlc2FtcGxlciAmJiBtaXhlckNoYW5uZWxDb3VudENoYW5nZWQpIHsKKyAgICBpZiAodHJhY2stPm1SZXNhbXBsZXIuZ2V0KCkgIT0gbnVsbHB0ciAmJiBtaXhlckNoYW5uZWxDb3VudENoYW5nZWQpIHsKICAgICAgICAgLy8gcmVzYW1wbGVyIGNoYW5uZWxzIG1heSBoYXZlIGNoYW5nZWQuCi0gICAgICAgIGNvbnN0IHVpbnQzMl90IHJlc2V0VG9TYW1wbGVSYXRlID0gdHJhY2suc2FtcGxlUmF0ZTsKLSAgICAgICAgZGVsZXRlIHRyYWNrLnJlc2FtcGxlcjsKLSAgICAgICAgdHJhY2sucmVzYW1wbGVyID0gTlVMTDsKLSAgICAgICAgdHJhY2suc2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOyAvLyB3aXRob3V0IHJlc2FtcGxlciwgdHJhY2sgcmF0ZSBpcyBkZXZpY2Ugc2FtcGxlIHJhdGUuCisgICAgICAgIGNvbnN0IHVpbnQzMl90IHJlc2V0VG9TYW1wbGVSYXRlID0gdHJhY2stPnNhbXBsZVJhdGU7CisgICAgICAgIHRyYWNrLT5tUmVzYW1wbGVyLnJlc2V0KG51bGxwdHIpOworICAgICAgICB0cmFjay0+c2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOyAvLyB3aXRob3V0IHJlc2FtcGxlciwgdHJhY2sgcmF0ZSBpcyBkZXZpY2Ugc2FtcGxlIHJhdGUuCiAgICAgICAgIC8vIHJlY3JlYXRlIHRoZSByZXNhbXBsZXIgd2l0aCB1cGRhdGVkIGZvcm1hdCwgY2hhbm5lbHMsIHNhdmVkIHNhbXBsZVJhdGUuCi0gICAgICAgIHRyYWNrLnNldFJlc2FtcGxlcihyZXNldFRvU2FtcGxlUmF0ZSAvKnRyYWNrU2FtcGxlUmF0ZSovLCBtU2FtcGxlUmF0ZSAvKmRldlNhbXBsZVJhdGUqLyk7CisgICAgICAgIHRyYWNrLT5zZXRSZXNhbXBsZXIocmVzZXRUb1NhbXBsZVJhdGUgLyp0cmFja1NhbXBsZVJhdGUqLywgbVNhbXBsZVJhdGUgLypkZXZTYW1wbGVSYXRlKi8pOwogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBBdWRpb01peGVyOjp0cmFja190Ojp1bnByZXBhcmVGb3JEb3dubWl4KCkgewordm9pZCBBdWRpb01peGVyOjpUcmFjazo6dW5wcmVwYXJlRm9yRG93bm1peCgpIHsKICAgICBBTE9HVigiQXVkaW9NaXhlcjo6dW5wcmVwYXJlRm9yRG93bm1peCglcCkiLCB0aGlzKTsKIAotICAgIGlmIChtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyICE9IG51bGxwdHIpIHsKKyAgICBpZiAobVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgIC8vIHJlbGVhc2UgYW55IGJ1ZmZlcnMgaGVsZCBieSB0aGUgbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlcgotICAgICAgICAvLyBiZWZvcmUgZGVhbGxvY2F0aW5nIHRoZSBkb3dubWl4ZXJCdWZmZXJQcm92aWRlci4KKyAgICAgICAgLy8gYmVmb3JlIGRlYWxsb2NhdGluZyB0aGUgbURvd25taXhlckJ1ZmZlclByb3ZpZGVyLgogICAgICAgICBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOwogICAgIH0KIAogICAgIG1Eb3dubWl4UmVxdWlyZXNGb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKLSAgICBpZiAoZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgIT0gTlVMTCkgeworICAgIGlmIChtRG93bm1peGVyQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICAvLyB0aGlzIHRyYWNrIGhhZCBwcmV2aW91c2x5IGJlZW4gY29uZmlndXJlZCB3aXRoIGEgZG93bm1peGVyLCBkZWxldGUgaXQKLSAgICAgICAgQUxPR1YoIiBkZWxldGluZyBvbGQgZG93bm1peGVyIik7Ci0gICAgICAgIGRlbGV0ZSBkb3dubWl4ZXJCdWZmZXJQcm92aWRlcjsKLSAgICAgICAgZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgPSBOVUxMOworICAgICAgICBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXIucmVzZXQobnVsbHB0cik7CiAgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1YoIiBub3RoaW5nIHRvIGRvLCBubyBkb3dubWl4ZXIgdG8gZGVsZXRlIik7CiAgICAgfQogfQogCi1zdGF0dXNfdCBBdWRpb01peGVyOjp0cmFja190OjpwcmVwYXJlRm9yRG93bm1peCgpCitzdGF0dXNfdCBBdWRpb01peGVyOjpUcmFjazo6cHJlcGFyZUZvckRvd25taXgoKQogewogICAgIEFMT0dWKCJBdWRpb01peGVyOjpwcmVwYXJlRm9yRG93bm1peCglcCkgd2l0aCBtYXNrIDB4JXgiLAogICAgICAgICAgICAgdGhpcywgY2hhbm5lbE1hc2spOwpAQCAtMzM3LDQwICsyNjEsMzUgQEAKICAgICBpZiAoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9yZXByZXNlbnRhdGlvbihjaGFubmVsTWFzaykKICAgICAgICAgICAgICAgICA9PSBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX1BPU0lUSU9OCiAgICAgICAgICAgICAmJiBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6aXNNdWx0aWNoYW5uZWxDYXBhYmxlKCkpIHsKLSAgICAgICAgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIqIHBEYnAgPSBuZXcgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoY2hhbm5lbE1hc2ssCisgICAgICAgIG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci5yZXNldChuZXcgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgbU1peGVyQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgLyogVE9ETzogdXNlIG1NaXhlckluRm9ybWF0LCBub3cgb25seSBQQ00gMTYgKi8sCi0gICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgc2Vzc2lvbklkLCBrQ29weUJ1ZmZlckZyYW1lQ291bnQpOwotCi0gICAgICAgIGlmIChwRGJwLT5pc1ZhbGlkKCkpIHsgLy8gaWYgY29uc3RydWN0b3IgY29tcGxldGVkIHByb3Blcmx5CisgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgc2Vzc2lvbklkLCBrQ29weUJ1ZmZlckZyYW1lQ291bnQpKTsKKyAgICAgICAgaWYgKHN0YXRpY19jYXN0PERvd25taXhlckJ1ZmZlclByb3ZpZGVyICo+KG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci5nZXQoKSktPmlzVmFsaWQoKSkgewogICAgICAgICAgICAgbURvd25taXhSZXF1aXJlc0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOyAvLyBQQ00gMTYgYml0IHJlcXVpcmVkIGZvciBkb3dubWl4Ci0gICAgICAgICAgICBkb3dubWl4ZXJCdWZmZXJQcm92aWRlciA9IHBEYnA7CiAgICAgICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9Ci0gICAgICAgIGRlbGV0ZSBwRGJwOworICAgICAgICAvLyBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXIgcmVzZXQgYmVsb3cuCiAgICAgfQogCiAgICAgLy8gRWZmZWN0IGRvd25taXhlciBkb2VzIG5vdCBhY2NlcHQgdGhlIGNoYW5uZWwgY29udmVyc2lvbi4gIExldCdzIHVzZSBvdXIgcmVtaXhlci4KLSAgICBSZW1peEJ1ZmZlclByb3ZpZGVyKiBwUmJwID0gbmV3IFJlbWl4QnVmZmVyUHJvdmlkZXIoY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICBtTWl4ZXJDaGFubmVsTWFzaywgbU1peGVySW5Gb3JtYXQsIGtDb3B5QnVmZmVyRnJhbWVDb3VudCk7CisgICAgbURvd25taXhlckJ1ZmZlclByb3ZpZGVyLnJlc2V0KG5ldyBSZW1peEJ1ZmZlclByb3ZpZGVyKGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgbU1peGVyQ2hhbm5lbE1hc2ssIG1NaXhlckluRm9ybWF0LCBrQ29weUJ1ZmZlckZyYW1lQ291bnQpKTsKICAgICAvLyBSZW1peCBhbHdheXMgZmluZHMgYSBjb252ZXJzaW9uIHdoZXJlYXMgRG93bm1peGVyIGVmZmVjdCBhYm92ZSBtYXkgZmFpbC4KLSAgICBkb3dubWl4ZXJCdWZmZXJQcm92aWRlciA9IHBSYnA7CiAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfdDo6dW5wcmVwYXJlRm9yUmVmb3JtYXQoKSB7Cit2b2lkIEF1ZGlvTWl4ZXI6OlRyYWNrOjp1bnByZXBhcmVGb3JSZWZvcm1hdCgpIHsKICAgICBBTE9HVigiQXVkaW9NaXhlcjo6dW5wcmVwYXJlRm9yUmVmb3JtYXQoJXApIiwgdGhpcyk7CiAgICAgYm9vbCByZXF1aXJlc1JlY29uZmlndXJlID0gZmFsc2U7Ci0gICAgaWYgKG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOwotICAgICAgICBtUmVmb3JtYXRCdWZmZXJQcm92aWRlciA9IE5VTEw7CisgICAgaWYgKG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIucmVzZXQobnVsbHB0cik7CiAgICAgICAgIHJlcXVpcmVzUmVjb25maWd1cmUgPSB0cnVlOwogICAgIH0KLSAgICBpZiAobVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlciAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOwotICAgICAgICBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKKyAgICBpZiAobVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIG1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIucmVzZXQobnVsbHB0cik7CiAgICAgICAgIHJlcXVpcmVzUmVjb25maWd1cmUgPSB0cnVlOwogICAgIH0KICAgICBpZiAocmVxdWlyZXNSZWNvbmZpZ3VyZSkgewpAQCAtMzc4LDcgKzI5Nyw3IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBBdWRpb01peGVyOjp0cmFja190OjpwcmVwYXJlRm9yUmVmb3JtYXQoKQorc3RhdHVzX3QgQXVkaW9NaXhlcjo6VHJhY2s6OnByZXBhcmVGb3JSZWZvcm1hdCgpCiB7CiAgICAgQUxPR1YoIkF1ZGlvTWl4ZXI6OnByZXBhcmVGb3JSZWZvcm1hdCglcCkgd2l0aCBmb3JtYXQgJSN4IiwgdGhpcywgbUZvcm1hdCk7CiAgICAgLy8gZGlzY2FyZCBwcmV2aW91cyByZWZvcm1hdHRlcnMKQEAgLTM4OCwxOSArMzA3LDI3IEBACiAgICAgICAgICAgICA/IG1Eb3dubWl4UmVxdWlyZXNGb3JtYXQgOiBtTWl4ZXJJbkZvcm1hdDsKICAgICBib29sIHJlcXVpcmVzUmVjb25maWd1cmUgPSBmYWxzZTsKICAgICBpZiAobUZvcm1hdCAhPSB0YXJnZXRGb3JtYXQpIHsKLSAgICAgICAgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgPSBuZXcgUmVmb3JtYXRCdWZmZXJQcm92aWRlcigKKyAgICAgICAgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIucmVzZXQobmV3IFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIoCiAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKSwKICAgICAgICAgICAgICAgICBtRm9ybWF0LAogICAgICAgICAgICAgICAgIHRhcmdldEZvcm1hdCwKLSAgICAgICAgICAgICAgICBrQ29weUJ1ZmZlckZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgIGtDb3B5QnVmZmVyRnJhbWVDb3VudCkpOworICAgICAgICByZXF1aXJlc1JlY29uZmlndXJlID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKG1Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICAvLyBJbnB1dCBhbmQgb3V0cHV0IGFyZSBmbG9hdHMsIG1ha2Ugc3VyZSBhcHBsaWNhdGlvbiBkaWQgbm90IHByb3ZpZGUgPiAzZGIgc2FtcGxlcworICAgICAgICAvLyB0aGF0IHdvdWxkIGJyZWFrIHZvbHVtZSBhcHBsaWNhdGlvbiAoYi82ODA5OTA3MikKKyAgICAgICAgLy8gVE9ETzogYWRkIGEgdHJ1c3RlZCBzb3VyY2UgZmxhZyB0byBhdm9pZCB0aGUgb3ZlcmhlYWQKKyAgICAgICAgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIucmVzZXQobmV3IENsYW1wRmxvYXRCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spLAorICAgICAgICAgICAgICAgIGtDb3B5QnVmZmVyRnJhbWVDb3VudCkpOwogICAgICAgICByZXF1aXJlc1JlY29uZmlndXJlID0gdHJ1ZTsKICAgICB9CiAgICAgaWYgKHRhcmdldEZvcm1hdCAhPSBtTWl4ZXJJbkZvcm1hdCkgewotICAgICAgICBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyID0gbmV3IFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIoCisgICAgICAgIG1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIucmVzZXQobmV3IFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIoCiAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1NaXhlckNoYW5uZWxNYXNrKSwKICAgICAgICAgICAgICAgICB0YXJnZXRGb3JtYXQsCiAgICAgICAgICAgICAgICAgbU1peGVySW5Gb3JtYXQsCi0gICAgICAgICAgICAgICAga0NvcHlCdWZmZXJGcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICBrQ29weUJ1ZmZlckZyYW1lQ291bnQpKTsKICAgICAgICAgcmVxdWlyZXNSZWNvbmZpZ3VyZSA9IHRydWU7CiAgICAgfQogICAgIGlmIChyZXF1aXJlc1JlY29uZmlndXJlKSB7CkBAIC00MDksNzQgKzMzNiw1OSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotdm9pZCBBdWRpb01peGVyOjp0cmFja190OjpyZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpCit2b2lkIEF1ZGlvTWl4ZXI6OlRyYWNrOjpyZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpCiB7CiAgICAgYnVmZmVyUHJvdmlkZXIgPSBtSW5wdXRCdWZmZXJQcm92aWRlcjsKLSAgICBpZiAobVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIpIHsKKyAgICBpZiAobVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICBtUmVmb3JtYXRCdWZmZXJQcm92aWRlci0+c2V0QnVmZmVyUHJvdmlkZXIoYnVmZmVyUHJvdmlkZXIpOwotICAgICAgICBidWZmZXJQcm92aWRlciA9IG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOworICAgICAgICBidWZmZXJQcm92aWRlciA9IG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLmdldCgpOwogICAgIH0KLSAgICBpZiAoZG93bm1peGVyQnVmZmVyUHJvdmlkZXIpIHsKLSAgICAgICAgZG93bm1peGVyQnVmZmVyUHJvdmlkZXItPnNldEJ1ZmZlclByb3ZpZGVyKGJ1ZmZlclByb3ZpZGVyKTsKLSAgICAgICAgYnVmZmVyUHJvdmlkZXIgPSBkb3dubWl4ZXJCdWZmZXJQcm92aWRlcjsKKyAgICBpZiAobURvd25taXhlckJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgbURvd25taXhlckJ1ZmZlclByb3ZpZGVyLT5zZXRCdWZmZXJQcm92aWRlcihidWZmZXJQcm92aWRlcik7CisgICAgICAgIGJ1ZmZlclByb3ZpZGVyID0gbURvd25taXhlckJ1ZmZlclByb3ZpZGVyLmdldCgpOwogICAgIH0KLSAgICBpZiAobVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlcikgeworICAgIGlmIChtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlci0+c2V0QnVmZmVyUHJvdmlkZXIoYnVmZmVyUHJvdmlkZXIpOwotICAgICAgICBidWZmZXJQcm92aWRlciA9IG1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7CisgICAgICAgIGJ1ZmZlclByb3ZpZGVyID0gbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlci5nZXQoKTsKICAgICB9Ci0gICAgaWYgKG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyKSB7CisgICAgaWYgKG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgbVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXItPnNldEJ1ZmZlclByb3ZpZGVyKGJ1ZmZlclByb3ZpZGVyKTsKLSAgICAgICAgYnVmZmVyUHJvdmlkZXIgPSBtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjsKKyAgICAgICAgYnVmZmVyUHJvdmlkZXIgPSBtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlci5nZXQoKTsKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9NaXhlcjo6ZGVsZXRlVHJhY2tOYW1lKGludCBuYW1lKQordm9pZCBBdWRpb01peGVyOjpkZXN0cm95KGludCBuYW1lKQogewotICAgIEFMT0dWKCJBdWRpb01peGVyOjpkZWxldGVUcmFja05hbWUoJWQpIiwgbmFtZSk7Ci0gICAgbmFtZSAtPSBUUkFDSzA7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihuYW1lIDwgMCB8fCBuYW1lID49IChpbnQpTUFYX05VTV9UUkFDS1MsICJiYWQgdHJhY2sgbmFtZSAlZCIsIG5hbWUpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIWV4aXN0cyhuYW1lKSwgImludmFsaWQgbmFtZTogJWQiLCBuYW1lKTsKICAgICBBTE9HVigiZGVsZXRlVHJhY2tOYW1lKCVkKSIsIG5hbWUpOwotICAgIHRyYWNrX3QmIHRyYWNrKG1TdGF0ZS50cmFja3NbIG5hbWUgXSk7Ci0gICAgaWYgKHRyYWNrLmVuYWJsZWQpIHsKLSAgICAgICAgdHJhY2suZW5hYmxlZCA9IGZhbHNlOwotICAgICAgICBpbnZhbGlkYXRlU3RhdGUoMTw8bmFtZSk7CisKKyAgICBpZiAobVRyYWNrc1tuYW1lXS0+ZW5hYmxlZCkgeworICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgfQotICAgIC8vIGRlbGV0ZSB0aGUgcmVzYW1wbGVyCi0gICAgZGVsZXRlIHRyYWNrLnJlc2FtcGxlcjsKLSAgICB0cmFjay5yZXNhbXBsZXIgPSBOVUxMOwotICAgIC8vIGRlbGV0ZSB0aGUgZG93bm1peGVyCi0gICAgbVN0YXRlLnRyYWNrc1tuYW1lXS51bnByZXBhcmVGb3JEb3dubWl4KCk7Ci0gICAgLy8gZGVsZXRlIHRoZSByZWZvcm1hdHRlcgotICAgIG1TdGF0ZS50cmFja3NbbmFtZV0udW5wcmVwYXJlRm9yUmVmb3JtYXQoKTsKLSAgICAvLyBkZWxldGUgdGhlIHRpbWVzdHJldGNoIHByb3ZpZGVyCi0gICAgZGVsZXRlIHRyYWNrLm1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyOwotICAgIHRyYWNrLm1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKLSAgICBtVHJhY2tOYW1lcyAmPSB+KDE8PG5hbWUpOworICAgIG1UcmFja3MuZXJhc2UobmFtZSk7IC8vIGRlYWxsb2NhdGUgdHJhY2sKIH0KIAogdm9pZCBBdWRpb01peGVyOjplbmFibGUoaW50IG5hbWUpCiB7Ci0gICAgbmFtZSAtPSBUUkFDSzA7Ci0gICAgQUxPR19BU1NFUlQodWludDMyX3QobmFtZSkgPCBNQVhfTlVNX1RSQUNLUywgImJhZCB0cmFjayBuYW1lICVkIiwgbmFtZSk7Ci0gICAgdHJhY2tfdCYgdHJhY2sgPSBtU3RhdGUudHJhY2tzW25hbWVdOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIWV4aXN0cyhuYW1lKSwgImludmFsaWQgbmFtZTogJWQiLCBuYW1lKTsKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2s+ICZ0cmFjayA9IG1UcmFja3NbbmFtZV07CiAKLSAgICBpZiAoIXRyYWNrLmVuYWJsZWQpIHsKLSAgICAgICAgdHJhY2suZW5hYmxlZCA9IHRydWU7CisgICAgaWYgKCF0cmFjay0+ZW5hYmxlZCkgeworICAgICAgICB0cmFjay0+ZW5hYmxlZCA9IHRydWU7CiAgICAgICAgIEFMT0dWKCJlbmFibGUoJWQpIiwgbmFtZSk7Ci0gICAgICAgIGludmFsaWRhdGVTdGF0ZSgxIDw8IG5hbWUpOworICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgfQogfQogCiB2b2lkIEF1ZGlvTWl4ZXI6OmRpc2FibGUoaW50IG5hbWUpCiB7Ci0gICAgbmFtZSAtPSBUUkFDSzA7Ci0gICAgQUxPR19BU1NFUlQodWludDMyX3QobmFtZSkgPCBNQVhfTlVNX1RSQUNLUywgImJhZCB0cmFjayBuYW1lICVkIiwgbmFtZSk7Ci0gICAgdHJhY2tfdCYgdHJhY2sgPSBtU3RhdGUudHJhY2tzW25hbWVdOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIWV4aXN0cyhuYW1lKSwgImludmFsaWQgbmFtZTogJWQiLCBuYW1lKTsKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2s+ICZ0cmFjayA9IG1UcmFja3NbbmFtZV07CiAKLSAgICBpZiAodHJhY2suZW5hYmxlZCkgewotICAgICAgICB0cmFjay5lbmFibGVkID0gZmFsc2U7CisgICAgaWYgKHRyYWNrLT5lbmFibGVkKSB7CisgICAgICAgIHRyYWNrLT5lbmFibGVkID0gZmFsc2U7CiAgICAgICAgIEFMT0dWKCJkaXNhYmxlKCVkKSIsIG5hbWUpOwotICAgICAgICBpbnZhbGlkYXRlU3RhdGUoMSA8PCBuYW1lKTsKKyAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgIH0KIH0KIApAQCAtNTU0LDcgKzQ2Niw4IEBACiAgICAgICAgIEFMT0dEX0lGKCpwUHJldlZvbHVtZSAhPSAqcFNldFZvbHVtZSwgInByZXZpb3VzIGZsb2F0IHJhbXAgaGFzbid0IGZpbmlzaGVkLCIKICAgICAgICAgICAgICAgICAiIHByZXY6JWYgIHNldF90bzolZiIsICpwUHJldlZvbHVtZSwgKnBTZXRWb2x1bWUpOwogICAgICAgICBjb25zdCBmbG9hdCBpbmMgPSAobmV3Vm9sdW1lIC0gKnBQcmV2Vm9sdW1lKSAvIHJhbXA7IC8vIGNvdWxkIGJlIGluZiwgbmFuLCBzdWJub3JtYWwKLSAgICAgICAgY29uc3QgZmxvYXQgbWF4diA9IG1heChuZXdWb2x1bWUsICpwUHJldlZvbHVtZSk7IC8vIGNvdWxkIGJlIGluZiwgY2Fubm90IGJlIG5hbiwgc3Vibm9ybWFsCisgICAgICAgIC8vIGNvdWxkIGJlIGluZiwgY2Fubm90IGJlIG5hbiwgc3Vibm9ybWFsCisgICAgICAgIGNvbnN0IGZsb2F0IG1heHYgPSBzdGQ6Om1heChuZXdWb2x1bWUsICpwUHJldlZvbHVtZSk7CiAKICAgICAgICAgaWYgKGlzbm9ybWFsKGluYykgLy8gaW5jIG11c3QgYmUgYSBub3JtYWwgbnVtYmVyIChubyBzdWJub3JtYWxzLCBpbmZpbml0ZSwgbmFuKQogICAgICAgICAgICAgICAgICYmIG1heHYgKyBpbmMgIT0gbWF4dikgeyAvLyBpbmMgbXVzdCBtYWtlIGZvcndhcmQgcHJvZ3Jlc3MKQEAgLTYwNyw5ICs1MjAsOCBAQAogCiB2b2lkIEF1ZGlvTWl4ZXI6OnNldFBhcmFtZXRlcihpbnQgbmFtZSwgaW50IHRhcmdldCwgaW50IHBhcmFtLCB2b2lkICp2YWx1ZSkKIHsKLSAgICBuYW1lIC09IFRSQUNLMDsKLSAgICBBTE9HX0FTU0VSVCh1aW50MzJfdChuYW1lKSA8IE1BWF9OVU1fVFJBQ0tTLCAiYmFkIHRyYWNrIG5hbWUgJWQiLCBuYW1lKTsKLSAgICB0cmFja190JiB0cmFjayA9IG1TdGF0ZS50cmFja3NbbmFtZV07CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRighZXhpc3RzKG5hbWUpLCAiaW52YWxpZCBuYW1lOiAlZCIsIG5hbWUpOworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFjaz4gJnRyYWNrID0gbVRyYWNrc1tuYW1lXTsKIAogICAgIGludCB2YWx1ZUludCA9IHN0YXRpY19jYXN0PGludD4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHZhbHVlKSk7CiAgICAgaW50MzJfdCAqdmFsdWVCdWYgPSByZWludGVycHJldF9jYXN0PGludDMyX3QqPih2YWx1ZSk7CkBAIC02MjEsMzMgKzUzMywzMyBAQAogICAgICAgICBjYXNlIENIQU5ORUxfTUFTSzogewogICAgICAgICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgdHJhY2tDaGFubmVsTWFzayA9CiAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KHZhbHVlSW50KTsKLSAgICAgICAgICAgIGlmIChzZXRDaGFubmVsTWFza3MobmFtZSwgdHJhY2tDaGFubmVsTWFzaywgdHJhY2subU1peGVyQ2hhbm5lbE1hc2spKSB7CisgICAgICAgICAgICBpZiAoc2V0Q2hhbm5lbE1hc2tzKG5hbWUsIHRyYWNrQ2hhbm5lbE1hc2ssIHRyYWNrLT5tTWl4ZXJDaGFubmVsTWFzaykpIHsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBDSEFOTkVMX01BU0ssICV4KSIsIHRyYWNrQ2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgIGludmFsaWRhdGVTdGF0ZSgxIDw8IG5hbWUpOworICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgTUFJTl9CVUZGRVI6Ci0gICAgICAgICAgICBpZiAodHJhY2subWFpbkJ1ZmZlciAhPSB2YWx1ZUJ1ZikgewotICAgICAgICAgICAgICAgIHRyYWNrLm1haW5CdWZmZXIgPSB2YWx1ZUJ1ZjsKKyAgICAgICAgICAgIGlmICh0cmFjay0+bWFpbkJ1ZmZlciAhPSB2YWx1ZUJ1ZikgeworICAgICAgICAgICAgICAgIHRyYWNrLT5tYWluQnVmZmVyID0gdmFsdWVCdWY7CiAgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihUUkFDSywgTUFJTl9CVUZGRVIsICVwKSIsIHZhbHVlQnVmKTsKLSAgICAgICAgICAgICAgICBpbnZhbGlkYXRlU3RhdGUoMSA8PCBuYW1lKTsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVVhfQlVGRkVSOgotICAgICAgICAgICAgaWYgKHRyYWNrLmF1eEJ1ZmZlciAhPSB2YWx1ZUJ1ZikgewotICAgICAgICAgICAgICAgIHRyYWNrLmF1eEJ1ZmZlciA9IHZhbHVlQnVmOworICAgICAgICAgICAgaWYgKHRyYWNrLT5hdXhCdWZmZXIgIT0gdmFsdWVCdWYpIHsKKyAgICAgICAgICAgICAgICB0cmFjay0+YXV4QnVmZmVyID0gdmFsdWVCdWY7CiAgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihUUkFDSywgQVVYX0JVRkZFUiwgJXApIiwgdmFsdWVCdWYpOwotICAgICAgICAgICAgICAgIGludmFsaWRhdGVTdGF0ZSgxIDw8IG5hbWUpOworICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEZPUk1BVDogewogICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KHZhbHVlSW50KTsKLSAgICAgICAgICAgIGlmICh0cmFjay5tRm9ybWF0ICE9IGZvcm1hdCkgeworICAgICAgICAgICAgaWYgKHRyYWNrLT5tRm9ybWF0ICE9IGZvcm1hdCkgewogICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSwgIkludmFsaWQgZm9ybWF0ICUjeCIsIGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgdHJhY2subUZvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgICAgICAgICB0cmFjay0+bUZvcm1hdCA9IGZvcm1hdDsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBGT1JNQVQsICUjeCkiLCBmb3JtYXQpOwotICAgICAgICAgICAgICAgIHRyYWNrLnByZXBhcmVGb3JSZWZvcm1hdCgpOwotICAgICAgICAgICAgICAgIGludmFsaWRhdGVTdGF0ZSgxIDw8IG5hbWUpOworICAgICAgICAgICAgICAgIHRyYWNrLT5wcmVwYXJlRm9yUmVmb3JtYXQoKTsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAvLyBGSVhNRSBkbyB3ZSB3YW50IHRvIHN1cHBvcnQgc2V0dGluZyB0aGUgZG93bm1peCB0eXBlIGZyb20gQXVkaW9GbGluZ2VyPwpAQCAtNjU2LDE3ICs1NjgsMTcgQEAKICAgICAgICAgICAgIGJyZWFrICAgICAgICAgICovCiAgICAgICAgIGNhc2UgTUlYRVJfRk9STUFUOiB7CiAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4odmFsdWVJbnQpOwotICAgICAgICAgICAgaWYgKHRyYWNrLm1NaXhlckZvcm1hdCAhPSBmb3JtYXQpIHsKLSAgICAgICAgICAgICAgICB0cmFjay5tTWl4ZXJGb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgICAgICBpZiAodHJhY2stPm1NaXhlckZvcm1hdCAhPSBmb3JtYXQpIHsKKyAgICAgICAgICAgICAgICB0cmFjay0+bU1peGVyRm9ybWF0ID0gZm9ybWF0OwogICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIE1JWEVSX0ZPUk1BVCwgJSN4KSIsIGZvcm1hdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIE1JWEVSX0NIQU5ORUxfTUFTSzogewogICAgICAgICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWl4ZXJDaGFubmVsTWFzayA9CiAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190Pih2YWx1ZUludCk7Ci0gICAgICAgICAgICBpZiAoc2V0Q2hhbm5lbE1hc2tzKG5hbWUsIHRyYWNrLmNoYW5uZWxNYXNrLCBtaXhlckNoYW5uZWxNYXNrKSkgeworICAgICAgICAgICAgaWYgKHNldENoYW5uZWxNYXNrcyhuYW1lLCB0cmFjay0+Y2hhbm5lbE1hc2ssIG1peGVyQ2hhbm5lbE1hc2spKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihUUkFDSywgTUlYRVJfQ0hBTk5FTF9NQVNLLCAlI3gpIiwgbWl4ZXJDaGFubmVsTWFzayk7Ci0gICAgICAgICAgICAgICAgaW52YWxpZGF0ZVN0YXRlKDEgPDwgbmFtZSk7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKQEAgLTY3OCwyMSArNTkwLDIwIEBACiAgICAgICAgIHN3aXRjaCAocGFyYW0pIHsKICAgICAgICAgY2FzZSBTQU1QTEVfUkFURToKICAgICAgICAgICAgIEFMT0dfQVNTRVJUKHZhbHVlSW50ID4gMCwgImJhZCBzYW1wbGUgcmF0ZSAlZCIsIHZhbHVlSW50KTsKLSAgICAgICAgICAgIGlmICh0cmFjay5zZXRSZXNhbXBsZXIodWludDMyX3QodmFsdWVJbnQpLCBtU2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgICAgIGlmICh0cmFjay0+c2V0UmVzYW1wbGVyKHVpbnQzMl90KHZhbHVlSW50KSwgbVNhbXBsZVJhdGUpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihSRVNBTVBMRSwgU0FNUExFX1JBVEUsICV1KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCh2YWx1ZUludCkpOwotICAgICAgICAgICAgICAgIGludmFsaWRhdGVTdGF0ZSgxIDw8IG5hbWUpOworICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFU0VUOgotICAgICAgICAgICAgdHJhY2sucmVzZXRSZXNhbXBsZXIoKTsKLSAgICAgICAgICAgIGludmFsaWRhdGVTdGF0ZSgxIDw8IG5hbWUpOworICAgICAgICAgICAgdHJhY2stPnJlc2V0UmVzYW1wbGVyKCk7CisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRU1PVkU6Ci0gICAgICAgICAgICBkZWxldGUgdHJhY2sucmVzYW1wbGVyOwotICAgICAgICAgICAgdHJhY2sucmVzYW1wbGVyID0gTlVMTDsKLSAgICAgICAgICAgIHRyYWNrLnNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKLSAgICAgICAgICAgIGludmFsaWRhdGVTdGF0ZSgxIDw8IG5hbWUpOworICAgICAgICAgICAgdHJhY2stPm1SZXNhbXBsZXIucmVzZXQobnVsbHB0cik7CisgICAgICAgICAgICB0cmFjay0+c2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJzZXRQYXJhbWV0ZXIgcmVzYW1wbGU6IGJhZCBwYXJhbSAlZCIsIHBhcmFtKTsKQEAgLTcwNCwyNiArNjE1LDI4IEBACiAgICAgICAgIHN3aXRjaCAocGFyYW0pIHsKICAgICAgICAgY2FzZSBBVVhMRVZFTDoKICAgICAgICAgICAgIGlmIChzZXRWb2x1bWVSYW1wVmFyaWFibGVzKCpyZWludGVycHJldF9jYXN0PGZsb2F0Kj4odmFsdWUpLAotICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPT0gUkFNUF9WT0xVTUUgPyBtU3RhdGUuZnJhbWVDb3VudCA6IDAsCi0gICAgICAgICAgICAgICAgICAgICZ0cmFjay5hdXhMZXZlbCwgJnRyYWNrLnByZXZBdXhMZXZlbCwgJnRyYWNrLmF1eEluYywKLSAgICAgICAgICAgICAgICAgICAgJnRyYWNrLm1BdXhMZXZlbCwgJnRyYWNrLm1QcmV2QXV4TGV2ZWwsICZ0cmFjay5tQXV4SW5jKSkgeworICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPT0gUkFNUF9WT0xVTUUgPyBtRnJhbWVDb3VudCA6IDAsCisgICAgICAgICAgICAgICAgICAgICZ0cmFjay0+YXV4TGV2ZWwsICZ0cmFjay0+cHJldkF1eExldmVsLCAmdHJhY2stPmF1eEluYywKKyAgICAgICAgICAgICAgICAgICAgJnRyYWNrLT5tQXV4TGV2ZWwsICZ0cmFjay0+bVByZXZBdXhMZXZlbCwgJnRyYWNrLT5tQXV4SW5jKSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoJXMsIEFVWExFVkVMOiAlMDR4KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPT0gVk9MVU1FID8gIlZPTFVNRSIgOiAiUkFNUF9WT0xVTUUiLCB0cmFjay5hdXhMZXZlbCk7Ci0gICAgICAgICAgICAgICAgaW52YWxpZGF0ZVN0YXRlKDEgPDwgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPT0gVk9MVU1FID8gIlZPTFVNRSIgOiAiUkFNUF9WT0xVTUUiLCB0cmFjay0+YXV4TGV2ZWwpOworICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgaWYgKCh1bnNpZ25lZClwYXJhbSA+PSBWT0xVTUUwICYmICh1bnNpZ25lZClwYXJhbSA8IFZPTFVNRTAgKyBNQVhfTlVNX1ZPTFVNRVMpIHsKICAgICAgICAgICAgICAgICBpZiAoc2V0Vm9sdW1lUmFtcFZhcmlhYmxlcygqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KHZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9PSBSQU1QX1ZPTFVNRSA/IG1TdGF0ZS5mcmFtZUNvdW50IDogMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFjay52b2x1bWVbcGFyYW0gLSBWT0xVTUUwXSwgJnRyYWNrLnByZXZWb2x1bWVbcGFyYW0gLSBWT0xVTUUwXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFjay52b2x1bWVJbmNbcGFyYW0gLSBWT0xVTUUwXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFjay5tVm9sdW1lW3BhcmFtIC0gVk9MVU1FMF0sICZ0cmFjay5tUHJldlZvbHVtZVtwYXJhbSAtIFZPTFVNRTBdLAotICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrLm1Wb2x1bWVJbmNbcGFyYW0gLSBWT0xVTUUwXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9PSBSQU1QX1ZPTFVNRSA/IG1GcmFtZUNvdW50IDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFjay0+dm9sdW1lW3BhcmFtIC0gVk9MVU1FMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2stPnByZXZWb2x1bWVbcGFyYW0gLSBWT0xVTUUwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFjay0+dm9sdW1lSW5jW3BhcmFtIC0gVk9MVU1FMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2stPm1Wb2x1bWVbcGFyYW0gLSBWT0xVTUUwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFjay0+bVByZXZWb2x1bWVbcGFyYW0gLSBWT0xVTUUwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFjay0+bVZvbHVtZUluY1twYXJhbSAtIFZPTFVNRTBdKSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKCVzLCBWT0xVTUUlZDogJTA0eCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9PSBWT0xVTUUgPyAiVk9MVU1FIiA6ICJSQU1QX1ZPTFVNRSIsIHBhcmFtIC0gVk9MVU1FMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLnZvbHVtZVtwYXJhbSAtIFZPTFVNRTBdKTsKLSAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVN0YXRlKDEgPDwgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+dm9sdW1lW3BhcmFtIC0gVk9MVU1FMF0pOworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJzZXRQYXJhbWV0ZXIgdm9sdW1lOiBiYWQgcGFyYW0gJWQiLCBwYXJhbSk7CkBAIC03MzYsMTYgKzY0OSwxNiBAQAogICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICpwbGF5YmFja1JhdGUgPQogICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxBdWRpb1BsYXliYWNrUmF0ZSo+KHZhbHVlKTsKICAgICAgICAgICAgICAgICBBTE9HV19JRighaXNBdWRpb1BsYXliYWNrUmF0ZVZhbGlkKCpwbGF5YmFja1JhdGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgImJhZCBwYXJhbWV0ZXJzIHNwZWVkICVmLCBwaXRjaCAlZiIscGxheWJhY2tSYXRlLT5tU3BlZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUtPm1QaXRjaCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYWNrLnNldFBsYXliYWNrUmF0ZSgqcGxheWJhY2tSYXRlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgImJhZCBwYXJhbWV0ZXJzIHNwZWVkICVmLCBwaXRjaCAlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUtPm1TcGVlZCwgcGxheWJhY2tSYXRlLT5tUGl0Y2gpOworICAgICAgICAgICAgICAgIGlmICh0cmFjay0+c2V0UGxheWJhY2tSYXRlKCpwbGF5YmFja1JhdGUpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVElNRVNUUkVUQ0gsIFBMQVlCQUNLX1JBVEUsIFNUUkVUQ0hfTU9ERSwgRkFMTEJBQ0tfTU9ERSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVmICVmICVkICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUtPm1TcGVlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUtPm1QaXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUtPm1TdHJldGNoTW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUtPm1GYWxsYmFja01vZGUpOwotICAgICAgICAgICAgICAgICAgICAvLyBpbnZhbGlkYXRlU3RhdGUoMSA8PCBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gaW52YWxpZGF0ZSgpOyAgKHNob3VsZCBub3QgcmVxdWlyZSByZWNvbmZpZ3VyZSkKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKQEAgLTc1OCwxMiArNjcxLDEyIEBACiAgICAgfQogfQogCi1ib29sIEF1ZGlvTWl4ZXI6OnRyYWNrX3Q6OnNldFJlc2FtcGxlcih1aW50MzJfdCB0cmFja1NhbXBsZVJhdGUsIHVpbnQzMl90IGRldlNhbXBsZVJhdGUpCitib29sIEF1ZGlvTWl4ZXI6OlRyYWNrOjpzZXRSZXNhbXBsZXIodWludDMyX3QgdHJhY2tTYW1wbGVSYXRlLCB1aW50MzJfdCBkZXZTYW1wbGVSYXRlKQogewotICAgIGlmICh0cmFja1NhbXBsZVJhdGUgIT0gZGV2U2FtcGxlUmF0ZSB8fCByZXNhbXBsZXIgIT0gTlVMTCkgeworICAgIGlmICh0cmFja1NhbXBsZVJhdGUgIT0gZGV2U2FtcGxlUmF0ZSB8fCBtUmVzYW1wbGVyLmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgaWYgKHNhbXBsZVJhdGUgIT0gdHJhY2tTYW1wbGVSYXRlKSB7CiAgICAgICAgICAgICBzYW1wbGVSYXRlID0gdHJhY2tTYW1wbGVSYXRlOwotICAgICAgICAgICAgaWYgKHJlc2FtcGxlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAobVJlc2FtcGxlci5nZXQoKSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIkNyZWF0aW5nIHJlc2FtcGxlciBmcm9tIHRyYWNrICVkIEh6IHRvIGRldmljZSAlZCBIeiIsCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja1NhbXBsZVJhdGUsIGRldlNhbXBsZVJhdGUpOwogICAgICAgICAgICAgICAgIEF1ZGlvUmVzYW1wbGVyOjpzcmNfcXVhbGl0eSBxdWFsaXR5OwpAQCAtNzc5LDE1ICs2OTIsMTUgQEAKIAogICAgICAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSBNT05PX0hBQ0suIFJlc2FtcGxlciBzZWVzICNjaGFubmVscyBhZnRlciB0aGUgZG93bm1peGVyCiAgICAgICAgICAgICAgICAgLy8gYnV0IGlmIG5vbmUgZXhpc3RzLCBpdCBpcyB0aGUgY2hhbm5lbCBjb3VudCAoMSBmb3IgbW9ubykuCi0gICAgICAgICAgICAgICAgY29uc3QgaW50IHJlc2FtcGxlckNoYW5uZWxDb3VudCA9IGRvd25taXhlckJ1ZmZlclByb3ZpZGVyICE9IE5VTEwKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgcmVzYW1wbGVyQ2hhbm5lbENvdW50ID0gbURvd25taXhlckJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIKICAgICAgICAgICAgICAgICAgICAgICAgID8gbU1peGVyQ2hhbm5lbENvdW50IDogY2hhbm5lbENvdW50OwogICAgICAgICAgICAgICAgIEFMT0dWVigiQ3JlYXRpbmcgcmVzYW1wbGVyOiIKICAgICAgICAgICAgICAgICAgICAgICAgICIgZm9ybWF0KCUjeCkgY2hhbm5lbHMoJWQpIGRldlNhbXBsZVJhdGUoJXUpIHF1YWxpdHkoJWQpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgbU1peGVySW5Gb3JtYXQsIHJlc2FtcGxlckNoYW5uZWxDb3VudCwgZGV2U2FtcGxlUmF0ZSwgcXVhbGl0eSk7Ci0gICAgICAgICAgICAgICAgcmVzYW1wbGVyID0gQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZSgKKyAgICAgICAgICAgICAgICBtUmVzYW1wbGVyLnJlc2V0KEF1ZGlvUmVzYW1wbGVyOjpjcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICBtTWl4ZXJJbkZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2FtcGxlckNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldlNhbXBsZVJhdGUsIHF1YWxpdHkpOworICAgICAgICAgICAgICAgICAgICAgICAgZGV2U2FtcGxlUmF0ZSwgcXVhbGl0eSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KQEAgLTc5NSwyNSArNzA4LDI1IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIEF1ZGlvTWl4ZXI6OnRyYWNrX3Q6OnNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKQorYm9vbCBBdWRpb01peGVyOjpUcmFjazo6c2V0UGxheWJhY2tSYXRlKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwbGF5YmFja1JhdGUpCiB7Ci0gICAgaWYgKChtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlciA9PSBOVUxMICYmCisgICAgaWYgKChtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlci5nZXQoKSA9PSBudWxscHRyICYmCiAgICAgICAgICAgICBmYWJzKHBsYXliYWNrUmF0ZS5tU3BlZWQgLSBtUGxheWJhY2tSYXRlLm1TcGVlZCkgPCBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NSU5fREVMVEEgJiYKICAgICAgICAgICAgIGZhYnMocGxheWJhY2tSYXRlLm1QaXRjaCAtIG1QbGF5YmFja1JhdGUubVBpdGNoKSA8IEFVRElPX1RJTUVTVFJFVENIX1BJVENIX01JTl9ERUxUQSkgfHwKICAgICAgICAgICAgIGlzQXVkaW9QbGF5YmFja1JhdGVFcXVhbChwbGF5YmFja1JhdGUsIG1QbGF5YmFja1JhdGUpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgbVBsYXliYWNrUmF0ZSA9IHBsYXliYWNrUmF0ZTsKLSAgICBpZiAobVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIgPT0gTlVMTCkgeworICAgIGlmIChtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlci5nZXQoKSA9PSBudWxscHRyKSB7CiAgICAgICAgIC8vIFRPRE86IFJlbW92ZSBNT05PX0hBQ0suIFJlc2FtcGxlciBzZWVzICNjaGFubmVscyBhZnRlciB0aGUgZG93bm1peGVyCiAgICAgICAgIC8vIGJ1dCBpZiBub25lIGV4aXN0cywgaXQgaXMgdGhlIGNoYW5uZWwgY291bnQgKDEgZm9yIG1vbm8pLgotICAgICAgICBjb25zdCBpbnQgdGltZXN0cmV0Y2hDaGFubmVsQ291bnQgPSBkb3dubWl4ZXJCdWZmZXJQcm92aWRlciAhPSBOVUxMCisgICAgICAgIGNvbnN0IGludCB0aW1lc3RyZXRjaENoYW5uZWxDb3VudCA9IG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyCiAgICAgICAgICAgICAgICAgPyBtTWl4ZXJDaGFubmVsQ291bnQgOiBjaGFubmVsQ291bnQ7Ci0gICAgICAgIG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyID0gbmV3IFRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIodGltZXN0cmV0Y2hDaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgbU1peGVySW5Gb3JtYXQsIHNhbXBsZVJhdGUsIHBsYXliYWNrUmF0ZSk7CisgICAgICAgIG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyLnJlc2V0KG5ldyBUaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyKHRpbWVzdHJldGNoQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgIG1NaXhlckluRm9ybWF0LCBzYW1wbGVSYXRlLCBwbGF5YmFja1JhdGUpKTsKICAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKICAgICB9IGVsc2UgewotICAgICAgICByZWludGVycHJldF9jYXN0PFRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIqPihtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcikKKyAgICAgICAgc3RhdGljX2Nhc3Q8VGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcio+KG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyLmdldCgpKQogICAgICAgICAgICAgICAgIC0+c2V0UGxheWJhY2tSYXRlKHBsYXliYWNrUmF0ZSk7CiAgICAgfQogICAgIHJldHVybiB0cnVlOwpAQCAtODMyLDcgKzc0NSw3IEBACiAgKgogICogVGhlcmUgaXMgYSBiaXQgb2YgZHVwbGljYXRlZCBjb2RlIGhlcmUsIGJ1dCBpdCBrZWVwcyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgogICovCi1pbmxpbmUgdm9pZCBBdWRpb01peGVyOjp0cmFja190OjphZGp1c3RWb2x1bWVSYW1wKGJvb2wgYXV4LCBib29sIHVzZUZsb2F0KQoraW5saW5lIHZvaWQgQXVkaW9NaXhlcjo6VHJhY2s6OmFkanVzdFZvbHVtZVJhbXAoYm9vbCBhdXgsIGJvb2wgdXNlRmxvYXQpCiB7CiAgICAgaWYgKHVzZUZsb2F0KSB7CiAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBNQVhfTlVNX1ZPTFVNRVM7IGkrKykgewpAQCAtODYxLDExMyArNzc0LDk4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgLyogVE9ETzogYXV4IGlzIGFsd2F5cyBpbnRlZ2VyIHJlZ2FyZGxlc3Mgb2Ygb3V0cHV0IGJ1ZmZlciB0eXBlICovCisKICAgICBpZiAoYXV4KSB7Ci0gICAgICAgIGlmICgoKGF1eEluYz4wKSAmJiAoKChwcmV2QXV4TGV2ZWwrYXV4SW5jKT4+MTYpID49IGF1eExldmVsKSkgfHwKLSAgICAgICAgICAgICAgICAoKGF1eEluYzwwKSAmJiAoKChwcmV2QXV4TGV2ZWwrYXV4SW5jKT4+MTYpIDw9IGF1eExldmVsKSkpIHsKKyNpZmRlZiBGTE9BVF9BVVgKKyAgICAgICAgaWYgKHVzZUZsb2F0KSB7CisgICAgICAgICAgICBpZiAoKG1BdXhJbmMgPiAwLmYgJiYgbVByZXZBdXhMZXZlbCArIG1BdXhJbmMgPj0gbUF1eExldmVsKSB8fAorICAgICAgICAgICAgICAgICAgICAobUF1eEluYyA8IDAuZiAmJiBtUHJldkF1eExldmVsICsgbUF1eEluYyA8PSBtQXV4TGV2ZWwpKSB7CisgICAgICAgICAgICAgICAgYXV4SW5jID0gMDsKKyAgICAgICAgICAgICAgICBwcmV2QXV4TGV2ZWwgPSBhdXhMZXZlbCA8PCAxNjsKKyAgICAgICAgICAgICAgICBtQXV4SW5jID0gMC5mOworICAgICAgICAgICAgICAgIG1QcmV2QXV4TGV2ZWwgPSBtQXV4TGV2ZWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgIGlmICgoYXV4SW5jID4gMCAmJiAoKHByZXZBdXhMZXZlbCArIGF1eEluYykgPj4gMTYpID49IGF1eExldmVsKSB8fAorICAgICAgICAgICAgICAgIChhdXhJbmMgPCAwICYmICgocHJldkF1eExldmVsICsgYXV4SW5jKSA+PiAxNikgPD0gYXV4TGV2ZWwpKSB7CiAgICAgICAgICAgICBhdXhJbmMgPSAwOwogICAgICAgICAgICAgcHJldkF1eExldmVsID0gYXV4TGV2ZWwgPDwgMTY7Ci0gICAgICAgICAgICBtQXV4SW5jID0gMC47CisgICAgICAgICAgICBtQXV4SW5jID0gMC5mOwogICAgICAgICAgICAgbVByZXZBdXhMZXZlbCA9IG1BdXhMZXZlbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vQUxPR1YoImF1eCByYW1wOiAlZCAlZCAlZCIsIGF1eExldmVsIDw8IDE2LCBwcmV2QXV4TGV2ZWwsIGF1eEluYyk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKIHNpemVfdCBBdWRpb01peGVyOjpnZXRVbnJlbGVhc2VkRnJhbWVzKGludCBuYW1lKSBjb25zdAogewotICAgIG5hbWUgLT0gVFJBQ0swOwotICAgIGlmICh1aW50MzJfdChuYW1lKSA8IE1BWF9OVU1fVFJBQ0tTKSB7Ci0gICAgICAgIHJldHVybiBtU3RhdGUudHJhY2tzW25hbWVdLmdldFVucmVsZWFzZWRGcmFtZXMoKTsKKyAgICBjb25zdCBhdXRvIGl0ID0gbVRyYWNrcy5maW5kKG5hbWUpOworICAgIGlmIChpdCAhPSBtVHJhY2tzLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kLT5nZXRVbnJlbGVhc2VkRnJhbWVzKCk7CiAgICAgfQogICAgIHJldHVybiAwOwogfQogCiB2b2lkIEF1ZGlvTWl4ZXI6OnNldEJ1ZmZlclByb3ZpZGVyKGludCBuYW1lLCBBdWRpb0J1ZmZlclByb3ZpZGVyKiBidWZmZXJQcm92aWRlcikKIHsKLSAgICBuYW1lIC09IFRSQUNLMDsKLSAgICBBTE9HX0FTU0VSVCh1aW50MzJfdChuYW1lKSA8IE1BWF9OVU1fVFJBQ0tTLCAiYmFkIHRyYWNrIG5hbWUgJWQiLCBuYW1lKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFleGlzdHMobmFtZSksICJpbnZhbGlkIG5hbWU6ICVkIiwgbmFtZSk7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdHJhY2sgPSBtVHJhY2tzW25hbWVdOwogCi0gICAgaWYgKG1TdGF0ZS50cmFja3NbbmFtZV0ubUlucHV0QnVmZmVyUHJvdmlkZXIgPT0gYnVmZmVyUHJvdmlkZXIpIHsKKyAgICBpZiAodHJhY2stPm1JbnB1dEJ1ZmZlclByb3ZpZGVyID09IGJ1ZmZlclByb3ZpZGVyKSB7CiAgICAgICAgIHJldHVybjsgLy8gZG9uJ3QgcmVzZXQgYW55IGJ1ZmZlciBwcm92aWRlcnMgaWYgaWRlbnRpY2FsLgogICAgIH0KLSAgICBpZiAobVN0YXRlLnRyYWNrc1tuYW1lXS5tUmVmb3JtYXRCdWZmZXJQcm92aWRlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1TdGF0ZS50cmFja3NbbmFtZV0ubVJlZm9ybWF0QnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7Ci0gICAgfSBlbHNlIGlmIChtU3RhdGUudHJhY2tzW25hbWVdLmRvd25taXhlckJ1ZmZlclByb3ZpZGVyICE9IE5VTEwpIHsKLSAgICAgICAgbVN0YXRlLnRyYWNrc1tuYW1lXS5kb3dubWl4ZXJCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKLSAgICB9IGVsc2UgaWYgKG1TdGF0ZS50cmFja3NbbmFtZV0ubVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1TdGF0ZS50cmFja3NbbmFtZV0ubVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKLSAgICB9IGVsc2UgaWYgKG1TdGF0ZS50cmFja3NbbmFtZV0ubVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIgIT0gTlVMTCkgewotICAgICAgICBtU3RhdGUudHJhY2tzW25hbWVdLm1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOworICAgIGlmICh0cmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICB0cmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7CisgICAgfSBlbHNlIGlmICh0cmFjay0+bURvd25taXhlckJ1ZmZlclByb3ZpZGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgdHJhY2stPm1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKKyAgICB9IGVsc2UgaWYgKHRyYWNrLT5tUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgdHJhY2stPm1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7CisgICAgfSBlbHNlIGlmICh0cmFjay0+bVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICB0cmFjay0+bVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7CiAgICAgfQogCi0gICAgbVN0YXRlLnRyYWNrc1tuYW1lXS5tSW5wdXRCdWZmZXJQcm92aWRlciA9IGJ1ZmZlclByb3ZpZGVyOwotICAgIG1TdGF0ZS50cmFja3NbbmFtZV0ucmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKKyAgICB0cmFjay0+bUlucHV0QnVmZmVyUHJvdmlkZXIgPSBidWZmZXJQcm92aWRlcjsKKyAgICB0cmFjay0+cmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKIH0KIAotCi12b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3MoKQordm9pZCBBdWRpb01peGVyOjpwcm9jZXNzX192YWxpZGF0ZSgpCiB7Ci0gICAgbVN0YXRlLmhvb2soJm1TdGF0ZSk7Ci19Ci0KLQotdm9pZCBBdWRpb01peGVyOjpwcm9jZXNzX192YWxpZGF0ZShzdGF0ZV90KiBzdGF0ZSkKLXsKLSAgICBBTE9HV19JRighc3RhdGUtPm5lZWRzQ2hhbmdlZCwKLSAgICAgICAgImluIHByb2Nlc3NfX3ZhbGlkYXRlKCkgYnV0IG5vdGhpbmcncyBpbnZhbGlkIik7Ci0KLSAgICB1aW50MzJfdCBjaGFuZ2VkID0gc3RhdGUtPm5lZWRzQ2hhbmdlZDsKLSAgICBzdGF0ZS0+bmVlZHNDaGFuZ2VkID0gMDsgLy8gY2xlYXIgdGhlIHZhbGlkYXRpb24gZmxhZwotCi0gICAgLy8gcmVjb21wdXRlIHdoaWNoIHRyYWNrcyBhcmUgZW5hYmxlZCAvIGRpc2FibGVkCi0gICAgdWludDMyX3QgZW5hYmxlZCA9IDA7Ci0gICAgdWludDMyX3QgZGlzYWJsZWQgPSAwOwotICAgIHdoaWxlIChjaGFuZ2VkKSB7Ci0gICAgICAgIGNvbnN0IGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGNoYW5nZWQpOwotICAgICAgICBjb25zdCB1aW50MzJfdCBtYXNrID0gMTw8aTsKLSAgICAgICAgY2hhbmdlZCAmPSB+bWFzazsKLSAgICAgICAgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07Ci0gICAgICAgICh0LmVuYWJsZWQgPyBlbmFibGVkIDogZGlzYWJsZWQpIHw9IG1hc2s7Ci0gICAgfQotICAgIHN0YXRlLT5lbmFibGVkVHJhY2tzICY9IH5kaXNhYmxlZDsKLSAgICBzdGF0ZS0+ZW5hYmxlZFRyYWNrcyB8PSAgZW5hYmxlZDsKLQotICAgIC8vIGNvbXB1dGUgZXZlcnl0aGluZyB3ZSBuZWVkLi4uCi0gICAgaW50IGNvdW50QWN0aXZlVHJhY2tzID0gMDsKICAgICAvLyBUT0RPOiBmaXggYWxsMTZCaXRzU3RlcmVOb1Jlc2FtcGxlIGxvZ2ljIHRvCiAgICAgLy8gZWl0aGVyIHByb3Blcmx5IGhhbmRsZSBtdXRlZCB0cmFja3MgKGl0IHNob3VsZCBpZ25vcmUgdGhlbSkKICAgICAvLyBvciByZW1vdmUgYWx0b2dldGhlciBhcyBhbiBvYnNvbGV0ZSBvcHRpbWl6YXRpb24uCiAgICAgYm9vbCBhbGwxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxlID0gdHJ1ZTsKICAgICBib29sIHJlc2FtcGxpbmcgPSBmYWxzZTsKICAgICBib29sIHZvbHVtZVJhbXAgPSBmYWxzZTsKLSAgICB1aW50MzJfdCBlbiA9IHN0YXRlLT5lbmFibGVkVHJhY2tzOwotICAgIHdoaWxlIChlbikgewotICAgICAgICBjb25zdCBpbnQgaSA9IDMxIC0gX19idWlsdGluX2Nseihlbik7Ci0gICAgICAgIGVuICY9IH4oMTw8aSk7CiAKLSAgICAgICAgY291bnRBY3RpdmVUcmFja3MrKzsKLSAgICAgICAgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07CisgICAgbUVuYWJsZWQuY2xlYXIoKTsKKyAgICBtR3JvdXBzLmNsZWFyKCk7CisgICAgZm9yIChjb25zdCBhdXRvICZwYWlyIDogbVRyYWNrcykgeworICAgICAgICBjb25zdCBpbnQgbmFtZSA9IHBhaXIuZmlyc3Q7CisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFjaz4gJnQgPSBwYWlyLnNlY29uZDsKKyAgICAgICAgaWYgKCF0LT5lbmFibGVkKSBjb250aW51ZTsKKworICAgICAgICBtRW5hYmxlZC5lbXBsYWNlX2JhY2sobmFtZSk7ICAvLyB3ZSBhZGQgdG8gbUVuYWJsZWQgaW4gb3JkZXIgb2YgbmFtZS4KKyAgICAgICAgbUdyb3Vwc1t0LT5tYWluQnVmZmVyXS5lbXBsYWNlX2JhY2sobmFtZSk7IC8vIG1Hcm91cHMgYWxzbyBpbiBvcmRlciBvZiBuYW1lLgorCiAgICAgICAgIHVpbnQzMl90IG4gPSAwOwogICAgICAgICAvLyBGSVhNRSBjYW4gb3ZlcmZsb3cgKG1hc2sgaXMgb25seSAzIGJpdHMpCi0gICAgICAgIG4gfD0gTkVFRFNfQ0hBTk5FTF8xICsgdC5jaGFubmVsQ291bnQgLSAxOwotICAgICAgICBpZiAodC5kb2VzUmVzYW1wbGUoKSkgeworICAgICAgICBuIHw9IE5FRURTX0NIQU5ORUxfMSArIHQtPmNoYW5uZWxDb3VudCAtIDE7CisgICAgICAgIGlmICh0LT5kb2VzUmVzYW1wbGUoKSkgewogICAgICAgICAgICAgbiB8PSBORUVEU19SRVNBTVBMRTsKICAgICAgICAgfQotICAgICAgICBpZiAodC5hdXhMZXZlbCAhPSAwICYmIHQuYXV4QnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHQtPmF1eExldmVsICE9IDAgJiYgdC0+YXV4QnVmZmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgIG4gfD0gTkVFRFNfQVVYOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHQudm9sdW1lSW5jWzBdfHQudm9sdW1lSW5jWzFdKSB7CisgICAgICAgIGlmICh0LT52b2x1bWVJbmNbMF18dC0+dm9sdW1lSW5jWzFdKSB7CiAgICAgICAgICAgICB2b2x1bWVSYW1wID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmICghdC5kb2VzUmVzYW1wbGUoKSAmJiB0LnZvbHVtZVJMID09IDApIHsKKyAgICAgICAgfSBlbHNlIGlmICghdC0+ZG9lc1Jlc2FtcGxlKCkgJiYgdC0+dm9sdW1lUkwgPT0gMCkgewogICAgICAgICAgICAgbiB8PSBORUVEU19NVVRFOwogICAgICAgICB9Ci0gICAgICAgIHQubmVlZHMgPSBuOworICAgICAgICB0LT5uZWVkcyA9IG47CiAKICAgICAgICAgaWYgKG4gJiBORUVEU19NVVRFKSB7Ci0gICAgICAgICAgICB0Lmhvb2sgPSB0cmFja19fbm9wOworICAgICAgICAgICAgdC0+aG9vayA9ICZUcmFjazo6dHJhY2tfX25vcDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChuICYgTkVFRFNfQVVYKSB7CiAgICAgICAgICAgICAgICAgYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSA9IGZhbHNlOwpAQCAtOTc1LDIzICs4NzMsMjMgQEAKICAgICAgICAgICAgIGlmIChuICYgTkVFRFNfUkVTQU1QTEUpIHsKICAgICAgICAgICAgICAgICBhbGwxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgcmVzYW1wbGluZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdC5ob29rID0gZ2V0VHJhY2tIb29rKFRSQUNLVFlQRV9SRVNBTVBMRSwgdC5tTWl4ZXJDaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICB0Lm1NaXhlckluRm9ybWF0LCB0Lm1NaXhlckZvcm1hdCk7CisgICAgICAgICAgICAgICAgdC0+aG9vayA9IFRyYWNrOjpnZXRUcmFja0hvb2soVFJBQ0tUWVBFX1JFU0FNUExFLCB0LT5tTWl4ZXJDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICB0LT5tTWl4ZXJJbkZvcm1hdCwgdC0+bU1peGVyRm9ybWF0KTsKICAgICAgICAgICAgICAgICBBTE9HVl9JRigobiAmIE5FRURTX0NIQU5ORUxfQ09VTlRfX01BU0spID4gTkVFRFNfQ0hBTk5FTF8yLAogICAgICAgICAgICAgICAgICAgICAgICAgIlRyYWNrICVkIG5lZWRzIGRvd25taXggKyByZXNhbXBsZSIsIGkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoKG4gJiBORUVEU19DSEFOTkVMX0NPVU5UX19NQVNLKSA9PSBORUVEU19DSEFOTkVMXzEpewotICAgICAgICAgICAgICAgICAgICB0Lmhvb2sgPSBnZXRUcmFja0hvb2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQubU1peGVyQ2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPICAvLyBUT0RPOiBNT05PX0hBQ0sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHQuY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTykKKyAgICAgICAgICAgICAgICAgICAgdC0+aG9vayA9IFRyYWNrOjpnZXRUcmFja0hvb2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQtPm1NaXhlckNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyAgLy8gVE9ETzogTU9OT19IQUNLCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0LT5jaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9NT05PKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFRSQUNLVFlQRV9OT1JFU0FNUExFTU9OTyA6IFRSQUNLVFlQRV9OT1JFU0FNUExFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubU1peGVyQ2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubU1peGVySW5Gb3JtYXQsIHQubU1peGVyRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT5tTWl4ZXJDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+bU1peGVySW5Gb3JtYXQsIHQtPm1NaXhlckZvcm1hdCk7CiAgICAgICAgICAgICAgICAgICAgIGFsbDE2Qml0c1N0ZXJlb05vUmVzYW1wbGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKChuICYgTkVFRFNfQ0hBTk5FTF9DT1VOVF9fTUFTSykgPj0gTkVFRFNfQ0hBTk5FTF8yKXsKLSAgICAgICAgICAgICAgICAgICAgdC5ob29rID0gZ2V0VHJhY2tIb29rKFRSQUNLVFlQRV9OT1JFU0FNUExFLCB0Lm1NaXhlckNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lm1NaXhlckluRm9ybWF0LCB0Lm1NaXhlckZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIHQtPmhvb2sgPSBUcmFjazo6Z2V0VHJhY2tIb29rKFRSQUNLVFlQRV9OT1JFU0FNUExFLCB0LT5tTWl4ZXJDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+bU1peGVySW5Gb3JtYXQsIHQtPm1NaXhlckZvcm1hdCk7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWX0lGKChuICYgTkVFRFNfQ0hBTk5FTF9DT1VOVF9fTUFTSykgPiBORUVEU19DSEFOTkVMXzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyYWNrICVkIG5lZWRzIGRvd25taXgiLCBpKTsKICAgICAgICAgICAgICAgICB9CkBAIC0xMDAwLDEzNyArODk4LDEyNSBAQAogICAgIH0KIAogICAgIC8vIHNlbGVjdCB0aGUgcHJvY2Vzc2luZyBob29rcwotICAgIHN0YXRlLT5ob29rID0gcHJvY2Vzc19fbm9wOwotICAgIGlmIChjb3VudEFjdGl2ZVRyYWNrcyA+IDApIHsKKyAgICBtSG9vayA9ICZBdWRpb01peGVyOjpwcm9jZXNzX19ub3A7CisgICAgaWYgKG1FbmFibGVkLnNpemUoKSA+IDApIHsKICAgICAgICAgaWYgKHJlc2FtcGxpbmcpIHsKLSAgICAgICAgICAgIGlmICghc3RhdGUtPm91dHB1dFRlbXApIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+b3V0cHV0VGVtcCA9IG5ldyBpbnQzMl90W01BWF9OVU1fQ0hBTk5FTFMgKiBzdGF0ZS0+ZnJhbWVDb3VudF07CisgICAgICAgICAgICBpZiAobU91dHB1dFRlbXAuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1PdXRwdXRUZW1wLnJlc2V0KG5ldyBpbnQzMl90W01BWF9OVU1fQ0hBTk5FTFMgKiBtRnJhbWVDb3VudF0pOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFzdGF0ZS0+cmVzYW1wbGVUZW1wKSB7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPnJlc2FtcGxlVGVtcCA9IG5ldyBpbnQzMl90W01BWF9OVU1fQ0hBTk5FTFMgKiBzdGF0ZS0+ZnJhbWVDb3VudF07CisgICAgICAgICAgICBpZiAobVJlc2FtcGxlVGVtcC5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgbVJlc2FtcGxlVGVtcC5yZXNldChuZXcgaW50MzJfdFtNQVhfTlVNX0NIQU5ORUxTICogbUZyYW1lQ291bnRdKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXRlLT5ob29rID0gcHJvY2Vzc19fZ2VuZXJpY1Jlc2FtcGxpbmc7CisgICAgICAgICAgICBtSG9vayA9ICZBdWRpb01peGVyOjpwcm9jZXNzX19nZW5lcmljUmVzYW1wbGluZzsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChzdGF0ZS0+b3V0cHV0VGVtcCkgewotICAgICAgICAgICAgICAgIGRlbGV0ZSBbXSBzdGF0ZS0+b3V0cHV0VGVtcDsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+b3V0cHV0VGVtcCA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPnJlc2FtcGxlVGVtcCkgewotICAgICAgICAgICAgICAgIGRlbGV0ZSBbXSBzdGF0ZS0+cmVzYW1wbGVUZW1wOwotICAgICAgICAgICAgICAgIHN0YXRlLT5yZXNhbXBsZVRlbXAgPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdGUtPmhvb2sgPSBwcm9jZXNzX19nZW5lcmljTm9SZXNhbXBsaW5nOworICAgICAgICAgICAgLy8gd2Uga2VlcCB0ZW1wIGFycmF5cyBhcm91bmQuCisgICAgICAgICAgICBtSG9vayA9ICZBdWRpb01peGVyOjpwcm9jZXNzX19nZW5lcmljTm9SZXNhbXBsaW5nOwogICAgICAgICAgICAgaWYgKGFsbDE2Qml0c1N0ZXJlb05vUmVzYW1wbGUgJiYgIXZvbHVtZVJhbXApIHsKLSAgICAgICAgICAgICAgICBpZiAoY291bnRBY3RpdmVUcmFja3MgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaSA9IDMxIC0gX19idWlsdGluX2NseihzdGF0ZS0+ZW5hYmxlZFRyYWNrcyk7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrX3QmIHQgPSBzdGF0ZS0+dHJhY2tzW2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHQubmVlZHMgJiBORUVEU19NVVRFKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG1FbmFibGVkLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFjaz4gJnQgPSBtVHJhY2tzW21FbmFibGVkWzBdXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh0LT5uZWVkcyAmIE5FRURTX01VVEUpID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjaGVjayBwcmV2ZW50cyBhIG11dGVkIHRyYWNrIGZyb20gYWNxdWlyaW5nIGEgcHJvY2VzcyBob29rLgogICAgICAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgZGFuZ2Vyb3VzIGlmIHRoZSB0cmFjayBpcyBNT05PIGFzIHRoYXQgcmVxdWlyZXMKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBoYW5kbGluZyBkdWUgdG8gaW1wbGljaXQgY2hhbm5lbCBkdXBsaWNhdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXJlbyBvciBNdWx0aWNoYW5uZWwgc2hvdWxkIGFjdHVhbGx5IGJlIGZpbmUgaGVyZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5ob29rID0gZ2V0UHJvY2Vzc0hvb2soUFJPQ0VTU1RZUEVfTk9SRVNBTVBMRU9ORVRSQUNLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lm1NaXhlckNoYW5uZWxDb3VudCwgdC5tTWl4ZXJJbkZvcm1hdCwgdC5tTWl4ZXJGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgbUhvb2sgPSBnZXRQcm9jZXNzSG9vayhQUk9DRVNTVFlQRV9OT1JFU0FNUExFT05FVFJBQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPm1NaXhlckNoYW5uZWxDb3VudCwgdC0+bU1peGVySW5Gb3JtYXQsIHQtPm1NaXhlckZvcm1hdCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBBTE9HVigibWl4ZXIgY29uZmlndXJhdGlvbiBjaGFuZ2U6ICVkIGFjdGl2ZVRyYWNrcyAoJTA4eCkgIgorICAgIEFMT0dWKCJtaXhlciBjb25maWd1cmF0aW9uIGNoYW5nZTogJXp1ICIKICAgICAgICAgImFsbDE2Qml0c1N0ZXJlb05vUmVzYW1wbGU9JWQsIHJlc2FtcGxpbmc9JWQsIHZvbHVtZVJhbXA9JWQiLAotICAgICAgICBjb3VudEFjdGl2ZVRyYWNrcywgc3RhdGUtPmVuYWJsZWRUcmFja3MsCi0gICAgICAgIGFsbDE2Qml0c1N0ZXJlb05vUmVzYW1wbGUsIHJlc2FtcGxpbmcsIHZvbHVtZVJhbXApOworICAgICAgICBtRW5hYmxlZC5zaXplKCksIGFsbDE2Qml0c1N0ZXJlb05vUmVzYW1wbGUsIHJlc2FtcGxpbmcsIHZvbHVtZVJhbXApOwogCi0gICBzdGF0ZS0+aG9vayhzdGF0ZSk7CisgICBwcm9jZXNzKCk7CiAKICAgICAvLyBOb3cgdGhhdCB0aGUgdm9sdW1lIHJhbXAgaGFzIGJlZW4gZG9uZSwgc2V0IG9wdGltYWwgc3RhdGUgYW5kCiAgICAgLy8gdHJhY2sgaG9va3MgZm9yIHN1YnNlcXVlbnQgbWl4ZXIgcHJvY2VzcwotICAgIGlmIChjb3VudEFjdGl2ZVRyYWNrcyA+IDApIHsKKyAgICBpZiAobUVuYWJsZWQuc2l6ZSgpID4gMCkgewogICAgICAgICBib29sIGFsbE11dGVkID0gdHJ1ZTsKLSAgICAgICAgdWludDMyX3QgZW4gPSBzdGF0ZS0+ZW5hYmxlZFRyYWNrczsKLSAgICAgICAgd2hpbGUgKGVuKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQgaSA9IDMxIC0gX19idWlsdGluX2Nseihlbik7Ci0gICAgICAgICAgICBlbiAmPSB+KDE8PGkpOwotICAgICAgICAgICAgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07Ci0gICAgICAgICAgICBpZiAoIXQuZG9lc1Jlc2FtcGxlKCkgJiYgdC52b2x1bWVSTCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdC5uZWVkcyB8PSBORUVEU19NVVRFOwotICAgICAgICAgICAgICAgIHQuaG9vayA9IHRyYWNrX19ub3A7CisKKyAgICAgICAgZm9yIChjb25zdCBpbnQgbmFtZSA6IG1FbmFibGVkKSB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2s+ICZ0ID0gbVRyYWNrc1tuYW1lXTsKKyAgICAgICAgICAgIGlmICghdC0+ZG9lc1Jlc2FtcGxlKCkgJiYgdC0+dm9sdW1lUkwgPT0gMCkgeworICAgICAgICAgICAgICAgIHQtPm5lZWRzIHw9IE5FRURTX01VVEU7CisgICAgICAgICAgICAgICAgdC0+aG9vayA9ICZUcmFjazo6dHJhY2tfX25vcDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgYWxsTXV0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoYWxsTXV0ZWQpIHsKLSAgICAgICAgICAgIHN0YXRlLT5ob29rID0gcHJvY2Vzc19fbm9wOworICAgICAgICAgICAgbUhvb2sgPSAmQXVkaW9NaXhlcjo6cHJvY2Vzc19fbm9wOwogICAgICAgICB9IGVsc2UgaWYgKGFsbDE2Qml0c1N0ZXJlb05vUmVzYW1wbGUpIHsKLSAgICAgICAgICAgIGlmIChjb3VudEFjdGl2ZVRyYWNrcyA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50IGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooc3RhdGUtPmVuYWJsZWRUcmFja3MpOwotICAgICAgICAgICAgICAgIHRyYWNrX3QmIHQgPSBzdGF0ZS0+dHJhY2tzW2ldOworICAgICAgICAgICAgaWYgKG1FbmFibGVkLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgLy9jb25zdCBpbnQgaSA9IDMxIC0gX19idWlsdGluX2NseihlbmFibGVkVHJhY2tzKTsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2s+ICZ0ID0gbVRyYWNrc1ttRW5hYmxlZFswXV07CiAgICAgICAgICAgICAgICAgLy8gTXV0ZWQgc2luZ2xlIHRyYWNrcyBoYW5kbGVkIGJ5IGFsbE11dGVkIGFib3ZlLgotICAgICAgICAgICAgICAgIHN0YXRlLT5ob29rID0gZ2V0UHJvY2Vzc0hvb2soUFJPQ0VTU1RZUEVfTk9SRVNBTVBMRU9ORVRSQUNLLAotICAgICAgICAgICAgICAgICAgICAgICAgdC5tTWl4ZXJDaGFubmVsQ291bnQsIHQubU1peGVySW5Gb3JtYXQsIHQubU1peGVyRm9ybWF0KTsKKyAgICAgICAgICAgICAgICBtSG9vayA9IGdldFByb2Nlc3NIb29rKFBST0NFU1NUWVBFX05PUkVTQU1QTEVPTkVUUkFDSywKKyAgICAgICAgICAgICAgICAgICAgICAgIHQtPm1NaXhlckNoYW5uZWxDb3VudCwgdC0+bU1peGVySW5Gb3JtYXQsIHQtPm1NaXhlckZvcm1hdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKLQotdm9pZCBBdWRpb01peGVyOjp0cmFja19fZ2VuZXJpY1Jlc2FtcGxlKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCi0gICAgICAgIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCkKK3ZvaWQgQXVkaW9NaXhlcjo6VHJhY2s6OnRyYWNrX19nZW5lcmljUmVzYW1wbGUoCisgICAgICAgIGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCkKIHsKICAgICBBTE9HVlYoInRyYWNrX19nZW5lcmljUmVzYW1wbGVcbiIpOwotICAgIHQtPnJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZSh0LT5zYW1wbGVSYXRlKTsKKyAgICBtUmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKHNhbXBsZVJhdGUpOwogCiAgICAgLy8gcmFtcCBnYWluIC0gcmVzYW1wbGUgdG8gdGVtcCBidWZmZXIgYW5kIHNjYWxlL21peCBpbiAybmQgc3RlcAogICAgIGlmIChhdXggIT0gTlVMTCkgewogICAgICAgICAvLyBhbHdheXMgcmVzYW1wbGUgd2l0aCB1bml0eSBnYWluIHdoZW4gc2VuZGluZyB0byBhdXhpbGlhcnkgYnVmZmVyIHRvIGJlIGFibGUKICAgICAgICAgLy8gdG8gYXBwbHkgc2VuZCBsZXZlbCBhZnRlciByZXNhbXBsaW5nCi0gICAgICAgIHQtPnJlc2FtcGxlci0+c2V0Vm9sdW1lKFVOSVRZX0dBSU5fRkxPQVQsIFVOSVRZX0dBSU5fRkxPQVQpOwotICAgICAgICBtZW1zZXQodGVtcCwgMCwgb3V0RnJhbWVDb3VudCAqIHQtPm1NaXhlckNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQzMl90KSk7Ci0gICAgICAgIHQtPnJlc2FtcGxlci0+cmVzYW1wbGUodGVtcCwgb3V0RnJhbWVDb3VudCwgdC0+YnVmZmVyUHJvdmlkZXIpOwotICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodC0+dm9sdW1lSW5jWzBdfHQtPnZvbHVtZUluY1sxXXx0LT5hdXhJbmMpKSB7Ci0gICAgICAgICAgICB2b2x1bWVSYW1wU3RlcmVvKHQsIG91dCwgb3V0RnJhbWVDb3VudCwgdGVtcCwgYXV4KTsKKyAgICAgICAgbVJlc2FtcGxlci0+c2V0Vm9sdW1lKFVOSVRZX0dBSU5fRkxPQVQsIFVOSVRZX0dBSU5fRkxPQVQpOworICAgICAgICBtZW1zZXQodGVtcCwgMCwgb3V0RnJhbWVDb3VudCAqIG1NaXhlckNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQzMl90KSk7CisgICAgICAgIG1SZXNhbXBsZXItPnJlc2FtcGxlKHRlbXAsIG91dEZyYW1lQ291bnQsIGJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgaWYgKENDX1VOTElLRUxZKHZvbHVtZUluY1swXXx2b2x1bWVJbmNbMV18YXV4SW5jKSkgeworICAgICAgICAgICAgdm9sdW1lUmFtcFN0ZXJlbyhvdXQsIG91dEZyYW1lQ291bnQsIHRlbXAsIGF1eCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2b2x1bWVTdGVyZW8odCwgb3V0LCBvdXRGcmFtZUNvdW50LCB0ZW1wLCBhdXgpOworICAgICAgICAgICAgdm9sdW1lU3RlcmVvKG91dCwgb3V0RnJhbWVDb3VudCwgdGVtcCwgYXV4KTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChDQ19VTkxJS0VMWSh0LT52b2x1bWVJbmNbMF18dC0+dm9sdW1lSW5jWzFdKSkgewotICAgICAgICAgICAgdC0+cmVzYW1wbGVyLT5zZXRWb2x1bWUoVU5JVFlfR0FJTl9GTE9BVCwgVU5JVFlfR0FJTl9GTE9BVCk7CisgICAgICAgIGlmIChDQ19VTkxJS0VMWSh2b2x1bWVJbmNbMF18dm9sdW1lSW5jWzFdKSkgeworICAgICAgICAgICAgbVJlc2FtcGxlci0+c2V0Vm9sdW1lKFVOSVRZX0dBSU5fRkxPQVQsIFVOSVRZX0dBSU5fRkxPQVQpOwogICAgICAgICAgICAgbWVtc2V0KHRlbXAsIDAsIG91dEZyYW1lQ291bnQgKiBNQVhfTlVNX0NIQU5ORUxTICogc2l6ZW9mKGludDMyX3QpKTsKLSAgICAgICAgICAgIHQtPnJlc2FtcGxlci0+cmVzYW1wbGUodGVtcCwgb3V0RnJhbWVDb3VudCwgdC0+YnVmZmVyUHJvdmlkZXIpOwotICAgICAgICAgICAgdm9sdW1lUmFtcFN0ZXJlbyh0LCBvdXQsIG91dEZyYW1lQ291bnQsIHRlbXAsIGF1eCk7CisgICAgICAgICAgICBtUmVzYW1wbGVyLT5yZXNhbXBsZSh0ZW1wLCBvdXRGcmFtZUNvdW50LCBidWZmZXJQcm92aWRlcik7CisgICAgICAgICAgICB2b2x1bWVSYW1wU3RlcmVvKG91dCwgb3V0RnJhbWVDb3VudCwgdGVtcCwgYXV4KTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGNvbnN0YW50IGdhaW4KICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0LT5yZXNhbXBsZXItPnNldFZvbHVtZSh0LT5tVm9sdW1lWzBdLCB0LT5tVm9sdW1lWzFdKTsKLSAgICAgICAgICAgIHQtPnJlc2FtcGxlci0+cmVzYW1wbGUob3V0LCBvdXRGcmFtZUNvdW50LCB0LT5idWZmZXJQcm92aWRlcik7CisgICAgICAgICAgICBtUmVzYW1wbGVyLT5zZXRWb2x1bWUobVZvbHVtZVswXSwgbVZvbHVtZVsxXSk7CisgICAgICAgICAgICBtUmVzYW1wbGVyLT5yZXNhbXBsZShvdXQsIG91dEZyYW1lQ291bnQsIGJ1ZmZlclByb3ZpZGVyKTsKICAgICAgICAgfQogICAgIH0KIH0KIAotdm9pZCBBdWRpb01peGVyOjp0cmFja19fbm9wKHRyYWNrX3QqIHQgX191bnVzZWQsIGludDMyX3QqIG91dCBfX3VudXNlZCwKK3ZvaWQgQXVkaW9NaXhlcjo6VHJhY2s6OnRyYWNrX19ub3AoaW50MzJfdCogb3V0IF9fdW51c2VkLAogICAgICAgICBzaXplX3Qgb3V0RnJhbWVDb3VudCBfX3VudXNlZCwgaW50MzJfdCogdGVtcCBfX3VudXNlZCwgaW50MzJfdCogYXV4IF9fdW51c2VkKQogewogfQogCi12b2lkIEF1ZGlvTWl4ZXI6OnZvbHVtZVJhbXBTdGVyZW8odHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwgaW50MzJfdCogdGVtcCwKLSAgICAgICAgaW50MzJfdCogYXV4KQordm9pZCBBdWRpb01peGVyOjpUcmFjazo6dm9sdW1lUmFtcFN0ZXJlbygKKyAgICAgICAgaW50MzJfdCogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwgaW50MzJfdCogdGVtcCwgaW50MzJfdCogYXV4KQogewotICAgIGludDMyX3QgdmwgPSB0LT5wcmV2Vm9sdW1lWzBdOwotICAgIGludDMyX3QgdnIgPSB0LT5wcmV2Vm9sdW1lWzFdOwotICAgIGNvbnN0IGludDMyX3QgdmxJbmMgPSB0LT52b2x1bWVJbmNbMF07Ci0gICAgY29uc3QgaW50MzJfdCB2ckluYyA9IHQtPnZvbHVtZUluY1sxXTsKKyAgICBpbnQzMl90IHZsID0gcHJldlZvbHVtZVswXTsKKyAgICBpbnQzMl90IHZyID0gcHJldlZvbHVtZVsxXTsKKyAgICBjb25zdCBpbnQzMl90IHZsSW5jID0gdm9sdW1lSW5jWzBdOworICAgIGNvbnN0IGludDMyX3QgdnJJbmMgPSB2b2x1bWVJbmNbMV07CiAKICAgICAvL0FMT0dEKCJbMF0gJXA6IGluYz0lZiwgdjA9JWYsIHYxPSVkLCBmaW5hbD0lZiwgY291bnQ9JWQiLAotICAgIC8vICAgICAgICB0LCB2bEluYy82NTUzNi4wZiwgdmwvNjU1MzYuMGYsIHQtPnZvbHVtZVswXSwKKyAgICAvLyAgICAgICAgdCwgdmxJbmMvNjU1MzYuMGYsIHZsLzY1NTM2LjBmLCB2b2x1bWVbMF0sCiAgICAgLy8gICAgICAgKHZsICsgdmxJbmMqZnJhbWVDb3VudCkvNjU1MzYuMGYsIGZyYW1lQ291bnQpOwogCiAgICAgLy8gcmFtcCB2b2x1bWUKICAgICBpZiAoQ0NfVU5MSUtFTFkoYXV4ICE9IE5VTEwpKSB7Ci0gICAgICAgIGludDMyX3QgdmEgPSB0LT5wcmV2QXV4TGV2ZWw7Ci0gICAgICAgIGNvbnN0IGludDMyX3QgdmFJbmMgPSB0LT5hdXhJbmM7CisgICAgICAgIGludDMyX3QgdmEgPSBwcmV2QXV4TGV2ZWw7CisgICAgICAgIGNvbnN0IGludDMyX3QgdmFJbmMgPSBhdXhJbmM7CiAgICAgICAgIGludDMyX3QgbDsKICAgICAgICAgaW50MzJfdCByOwogCkBAIC0xMTQ0LDcgKzEwMzAsNyBAQAogICAgICAgICAgICAgdnIgKz0gdnJJbmM7CiAgICAgICAgICAgICB2YSArPSB2YUluYzsKICAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKLSAgICAgICAgdC0+cHJldkF1eExldmVsID0gdmE7CisgICAgICAgIHByZXZBdXhMZXZlbCA9IHZhOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGRvIHsKICAgICAgICAgICAgICpvdXQrKyArPSAodmwgPj4gMTYpICogKCp0ZW1wKysgPj4gMTIpOwpAQCAtMTE1MywxOSArMTAzOSwxOSBAQAogICAgICAgICAgICAgdnIgKz0gdnJJbmM7CiAgICAgICAgIH0gd2hpbGUgKC0tZnJhbWVDb3VudCk7CiAgICAgfQotICAgIHQtPnByZXZWb2x1bWVbMF0gPSB2bDsKLSAgICB0LT5wcmV2Vm9sdW1lWzFdID0gdnI7Ci0gICAgdC0+YWRqdXN0Vm9sdW1lUmFtcChhdXggIT0gTlVMTCk7CisgICAgcHJldlZvbHVtZVswXSA9IHZsOworICAgIHByZXZWb2x1bWVbMV0gPSB2cjsKKyAgICBhZGp1c3RWb2x1bWVSYW1wKGF1eCAhPSBOVUxMKTsKIH0KIAotdm9pZCBBdWRpb01peGVyOjp2b2x1bWVTdGVyZW8odHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwgaW50MzJfdCogdGVtcCwKLSAgICAgICAgaW50MzJfdCogYXV4KQordm9pZCBBdWRpb01peGVyOjpUcmFjazo6dm9sdW1lU3RlcmVvKAorICAgICAgICBpbnQzMl90KiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LCBpbnQzMl90KiB0ZW1wLCBpbnQzMl90KiBhdXgpCiB7Ci0gICAgY29uc3QgaW50MTZfdCB2bCA9IHQtPnZvbHVtZVswXTsKLSAgICBjb25zdCBpbnQxNl90IHZyID0gdC0+dm9sdW1lWzFdOworICAgIGNvbnN0IGludDE2X3QgdmwgPSB2b2x1bWVbMF07CisgICAgY29uc3QgaW50MTZfdCB2ciA9IHZvbHVtZVsxXTsKIAogICAgIGlmIChDQ19VTkxJS0VMWShhdXggIT0gTlVMTCkpIHsKLSAgICAgICAgY29uc3QgaW50MTZfdCB2YSA9IHQtPmF1eExldmVsOworICAgICAgICBjb25zdCBpbnQxNl90IHZhID0gYXV4TGV2ZWw7CiAgICAgICAgIGRvIHsKICAgICAgICAgICAgIGludDE2X3QgbCA9IChpbnQxNl90KSgqdGVtcCsrID4+IDEyKTsKICAgICAgICAgICAgIGludDE2X3QgciA9IChpbnQxNl90KSgqdGVtcCsrID4+IDEyKTsKQEAgLTExODcsMjUgKzEwNzMsMjUgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfXzE2Qml0c1N0ZXJlbyh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LAotICAgICAgICBpbnQzMl90KiB0ZW1wIF9fdW51c2VkLCBpbnQzMl90KiBhdXgpCit2b2lkIEF1ZGlvTWl4ZXI6OlRyYWNrOjp0cmFja19fMTZCaXRzU3RlcmVvKAorICAgICAgICBpbnQzMl90KiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LCBpbnQzMl90KiB0ZW1wIF9fdW51c2VkLCBpbnQzMl90KiBhdXgpCiB7CiAgICAgQUxPR1ZWKCJ0cmFja19fMTZCaXRzU3RlcmVvXG4iKTsKLSAgICBjb25zdCBpbnQxNl90ICppbiA9IHN0YXRpY19jYXN0PGNvbnN0IGludDE2X3QgKj4odC0+aW4pOworICAgIGNvbnN0IGludDE2X3QgKmluID0gc3RhdGljX2Nhc3Q8Y29uc3QgaW50MTZfdCAqPihtSW4pOwogCiAgICAgaWYgKENDX1VOTElLRUxZKGF1eCAhPSBOVUxMKSkgewogICAgICAgICBpbnQzMl90IGw7CiAgICAgICAgIGludDMyX3QgcjsKICAgICAgICAgLy8gcmFtcCBnYWluCi0gICAgICAgIGlmIChDQ19VTkxJS0VMWSh0LT52b2x1bWVJbmNbMF18dC0+dm9sdW1lSW5jWzFdfHQtPmF1eEluYykpIHsKLSAgICAgICAgICAgIGludDMyX3QgdmwgPSB0LT5wcmV2Vm9sdW1lWzBdOwotICAgICAgICAgICAgaW50MzJfdCB2ciA9IHQtPnByZXZWb2x1bWVbMV07Ci0gICAgICAgICAgICBpbnQzMl90IHZhID0gdC0+cHJldkF1eExldmVsOwotICAgICAgICAgICAgY29uc3QgaW50MzJfdCB2bEluYyA9IHQtPnZvbHVtZUluY1swXTsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdnJJbmMgPSB0LT52b2x1bWVJbmNbMV07Ci0gICAgICAgICAgICBjb25zdCBpbnQzMl90IHZhSW5jID0gdC0+YXV4SW5jOworICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodm9sdW1lSW5jWzBdfHZvbHVtZUluY1sxXXxhdXhJbmMpKSB7CisgICAgICAgICAgICBpbnQzMl90IHZsID0gcHJldlZvbHVtZVswXTsKKyAgICAgICAgICAgIGludDMyX3QgdnIgPSBwcmV2Vm9sdW1lWzFdOworICAgICAgICAgICAgaW50MzJfdCB2YSA9IHByZXZBdXhMZXZlbDsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdmxJbmMgPSB2b2x1bWVJbmNbMF07CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IHZySW5jID0gdm9sdW1lSW5jWzFdOworICAgICAgICAgICAgY29uc3QgaW50MzJfdCB2YUluYyA9IGF1eEluYzsKICAgICAgICAgICAgIC8vIEFMT0dEKCJbMV0gJXA6IGluYz0lZiwgdjA9JWYsIHYxPSVkLCBmaW5hbD0lZiwgY291bnQ9JWQiLAotICAgICAgICAgICAgLy8gICAgICAgIHQsIHZsSW5jLzY1NTM2LjBmLCB2bC82NTUzNi4wZiwgdC0+dm9sdW1lWzBdLAorICAgICAgICAgICAgLy8gICAgICAgIHQsIHZsSW5jLzY1NTM2LjBmLCB2bC82NTUzNi4wZiwgdm9sdW1lWzBdLAogICAgICAgICAgICAgLy8gICAgICAgICh2bCArIHZsSW5jKmZyYW1lQ291bnQpLzY1NTM2LjBmLCBmcmFtZUNvdW50KTsKIAogICAgICAgICAgICAgZG8gewpAQCAtMTIxOSwxNiArMTEwNSwxNiBAQAogICAgICAgICAgICAgICAgIHZhICs9IHZhSW5jOwogICAgICAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKIAotICAgICAgICAgICAgdC0+cHJldlZvbHVtZVswXSA9IHZsOwotICAgICAgICAgICAgdC0+cHJldlZvbHVtZVsxXSA9IHZyOwotICAgICAgICAgICAgdC0+cHJldkF1eExldmVsID0gdmE7Ci0gICAgICAgICAgICB0LT5hZGp1c3RWb2x1bWVSYW1wKHRydWUpOworICAgICAgICAgICAgcHJldlZvbHVtZVswXSA9IHZsOworICAgICAgICAgICAgcHJldlZvbHVtZVsxXSA9IHZyOworICAgICAgICAgICAgcHJldkF1eExldmVsID0gdmE7CisgICAgICAgICAgICBhZGp1c3RWb2x1bWVSYW1wKHRydWUpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gY29uc3RhbnQgZ2FpbgogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHZybCA9IHQtPnZvbHVtZVJMOwotICAgICAgICAgICAgY29uc3QgaW50MTZfdCB2YSA9IChpbnQxNl90KXQtPmF1eExldmVsOworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgdnJsID0gdm9sdW1lUkw7CisgICAgICAgICAgICBjb25zdCBpbnQxNl90IHZhID0gKGludDE2X3QpYXV4TGV2ZWw7CiAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgdWludDMyX3QgcmwgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCAqPihpbik7CiAgICAgICAgICAgICAgICAgaW50MTZfdCBhID0gKGludDE2X3QpKCgoaW50MzJfdClpblswXSArIGluWzFdKSA+PiAxKTsKQEAgLTEyNDIsMTQgKzExMjgsMTQgQEAKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIHJhbXAgZ2FpbgotICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodC0+dm9sdW1lSW5jWzBdfHQtPnZvbHVtZUluY1sxXSkpIHsKLSAgICAgICAgICAgIGludDMyX3QgdmwgPSB0LT5wcmV2Vm9sdW1lWzBdOwotICAgICAgICAgICAgaW50MzJfdCB2ciA9IHQtPnByZXZWb2x1bWVbMV07Ci0gICAgICAgICAgICBjb25zdCBpbnQzMl90IHZsSW5jID0gdC0+dm9sdW1lSW5jWzBdOwotICAgICAgICAgICAgY29uc3QgaW50MzJfdCB2ckluYyA9IHQtPnZvbHVtZUluY1sxXTsKKyAgICAgICAgaWYgKENDX1VOTElLRUxZKHZvbHVtZUluY1swXXx2b2x1bWVJbmNbMV0pKSB7CisgICAgICAgICAgICBpbnQzMl90IHZsID0gcHJldlZvbHVtZVswXTsKKyAgICAgICAgICAgIGludDMyX3QgdnIgPSBwcmV2Vm9sdW1lWzFdOworICAgICAgICAgICAgY29uc3QgaW50MzJfdCB2bEluYyA9IHZvbHVtZUluY1swXTsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdnJJbmMgPSB2b2x1bWVJbmNbMV07CiAKICAgICAgICAgICAgIC8vIEFMT0dEKCJbMV0gJXA6IGluYz0lZiwgdjA9JWYsIHYxPSVkLCBmaW5hbD0lZiwgY291bnQ9JWQiLAotICAgICAgICAgICAgLy8gICAgICAgIHQsIHZsSW5jLzY1NTM2LjBmLCB2bC82NTUzNi4wZiwgdC0+dm9sdW1lWzBdLAorICAgICAgICAgICAgLy8gICAgICAgIHQsIHZsSW5jLzY1NTM2LjBmLCB2bC82NTUzNi4wZiwgdm9sdW1lWzBdLAogICAgICAgICAgICAgLy8gICAgICAgICh2bCArIHZsSW5jKmZyYW1lQ291bnQpLzY1NTM2LjBmLCBmcmFtZUNvdW50KTsKIAogICAgICAgICAgICAgZG8gewpAQCAtMTI1OSwxNCArMTE0NSwxNCBAQAogICAgICAgICAgICAgICAgIHZyICs9IHZySW5jOwogICAgICAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKIAotICAgICAgICAgICAgdC0+cHJldlZvbHVtZVswXSA9IHZsOwotICAgICAgICAgICAgdC0+cHJldlZvbHVtZVsxXSA9IHZyOwotICAgICAgICAgICAgdC0+YWRqdXN0Vm9sdW1lUmFtcChmYWxzZSk7CisgICAgICAgICAgICBwcmV2Vm9sdW1lWzBdID0gdmw7CisgICAgICAgICAgICBwcmV2Vm9sdW1lWzFdID0gdnI7CisgICAgICAgICAgICBhZGp1c3RWb2x1bWVSYW1wKGZhbHNlKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGNvbnN0YW50IGdhaW4KICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjb25zdCB1aW50MzJfdCB2cmwgPSB0LT52b2x1bWVSTDsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHZybCA9IHZvbHVtZVJMOwogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIHVpbnQzMl90IHJsID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4oaW4pOwogICAgICAgICAgICAgICAgIGluICs9IDI7CkBAIC0xMjc2LDI3ICsxMTYyLDI3IEBACiAgICAgICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOwogICAgICAgICB9CiAgICAgfQotICAgIHQtPmluID0gaW47CisgICAgbUluID0gaW47CiB9CiAKLXZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfXzE2Qml0c01vbm8odHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwKLSAgICAgICAgaW50MzJfdCogdGVtcCBfX3VudXNlZCwgaW50MzJfdCogYXV4KQordm9pZCBBdWRpb01peGVyOjpUcmFjazo6dHJhY2tfXzE2Qml0c01vbm8oCisgICAgICAgIGludDMyX3QqIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsIGludDMyX3QqIHRlbXAgX191bnVzZWQsIGludDMyX3QqIGF1eCkKIHsKICAgICBBTE9HVlYoInRyYWNrX18xNkJpdHNNb25vXG4iKTsKLSAgICBjb25zdCBpbnQxNl90ICppbiA9IHN0YXRpY19jYXN0PGludDE2X3QgY29uc3QgKj4odC0+aW4pOworICAgIGNvbnN0IGludDE2X3QgKmluID0gc3RhdGljX2Nhc3Q8aW50MTZfdCBjb25zdCAqPihtSW4pOwogCiAgICAgaWYgKENDX1VOTElLRUxZKGF1eCAhPSBOVUxMKSkgewogICAgICAgICAvLyByYW1wIGdhaW4KLSAgICAgICAgaWYgKENDX1VOTElLRUxZKHQtPnZvbHVtZUluY1swXXx0LT52b2x1bWVJbmNbMV18dC0+YXV4SW5jKSkgewotICAgICAgICAgICAgaW50MzJfdCB2bCA9IHQtPnByZXZWb2x1bWVbMF07Ci0gICAgICAgICAgICBpbnQzMl90IHZyID0gdC0+cHJldlZvbHVtZVsxXTsKLSAgICAgICAgICAgIGludDMyX3QgdmEgPSB0LT5wcmV2QXV4TGV2ZWw7Ci0gICAgICAgICAgICBjb25zdCBpbnQzMl90IHZsSW5jID0gdC0+dm9sdW1lSW5jWzBdOwotICAgICAgICAgICAgY29uc3QgaW50MzJfdCB2ckluYyA9IHQtPnZvbHVtZUluY1sxXTsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdmFJbmMgPSB0LT5hdXhJbmM7CisgICAgICAgIGlmIChDQ19VTkxJS0VMWSh2b2x1bWVJbmNbMF18dm9sdW1lSW5jWzFdfGF1eEluYykpIHsKKyAgICAgICAgICAgIGludDMyX3QgdmwgPSBwcmV2Vm9sdW1lWzBdOworICAgICAgICAgICAgaW50MzJfdCB2ciA9IHByZXZWb2x1bWVbMV07CisgICAgICAgICAgICBpbnQzMl90IHZhID0gcHJldkF1eExldmVsOworICAgICAgICAgICAgY29uc3QgaW50MzJfdCB2bEluYyA9IHZvbHVtZUluY1swXTsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdnJJbmMgPSB2b2x1bWVJbmNbMV07CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IHZhSW5jID0gYXV4SW5jOwogCiAgICAgICAgICAgICAvLyBBTE9HRCgiWzJdICVwOiBpbmM9JWYsIHYwPSVmLCB2MT0lZCwgZmluYWw9JWYsIGNvdW50PSVkIiwKLSAgICAgICAgICAgIC8vICAgICAgICAgdCwgdmxJbmMvNjU1MzYuMGYsIHZsLzY1NTM2LjBmLCB0LT52b2x1bWVbMF0sCisgICAgICAgICAgICAvLyAgICAgICAgIHQsIHZsSW5jLzY1NTM2LjBmLCB2bC82NTUzNi4wZiwgdm9sdW1lWzBdLAogICAgICAgICAgICAgLy8gICAgICAgICAodmwgKyB2bEluYypmcmFtZUNvdW50KS82NTUzNi4wZiwgZnJhbWVDb3VudCk7CiAKICAgICAgICAgICAgIGRvIHsKQEAgLTEzMDksMTYgKzExOTUsMTYgQEAKICAgICAgICAgICAgICAgICB2YSArPSB2YUluYzsKICAgICAgICAgICAgIH0gd2hpbGUgKC0tZnJhbWVDb3VudCk7CiAKLSAgICAgICAgICAgIHQtPnByZXZWb2x1bWVbMF0gPSB2bDsKLSAgICAgICAgICAgIHQtPnByZXZWb2x1bWVbMV0gPSB2cjsKLSAgICAgICAgICAgIHQtPnByZXZBdXhMZXZlbCA9IHZhOwotICAgICAgICAgICAgdC0+YWRqdXN0Vm9sdW1lUmFtcCh0cnVlKTsKKyAgICAgICAgICAgIHByZXZWb2x1bWVbMF0gPSB2bDsKKyAgICAgICAgICAgIHByZXZWb2x1bWVbMV0gPSB2cjsKKyAgICAgICAgICAgIHByZXZBdXhMZXZlbCA9IHZhOworICAgICAgICAgICAgYWRqdXN0Vm9sdW1lUmFtcCh0cnVlKTsKICAgICAgICAgfQogICAgICAgICAvLyBjb25zdGFudCBnYWluCiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgY29uc3QgaW50MTZfdCB2bCA9IHQtPnZvbHVtZVswXTsKLSAgICAgICAgICAgIGNvbnN0IGludDE2X3QgdnIgPSB0LT52b2x1bWVbMV07Ci0gICAgICAgICAgICBjb25zdCBpbnQxNl90IHZhID0gKGludDE2X3QpdC0+YXV4TGV2ZWw7CisgICAgICAgICAgICBjb25zdCBpbnQxNl90IHZsID0gdm9sdW1lWzBdOworICAgICAgICAgICAgY29uc3QgaW50MTZfdCB2ciA9IHZvbHVtZVsxXTsKKyAgICAgICAgICAgIGNvbnN0IGludDE2X3QgdmEgPSAoaW50MTZfdClhdXhMZXZlbDsKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICBpbnQxNl90IGwgPSAqaW4rKzsKICAgICAgICAgICAgICAgICBvdXRbMF0gPSBtdWxBZGQobCwgdmwsIG91dFswXSk7CkBAIC0xMzMwLDE0ICsxMjE2LDE0IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICAvLyByYW1wIGdhaW4KLSAgICAgICAgaWYgKENDX1VOTElLRUxZKHQtPnZvbHVtZUluY1swXXx0LT52b2x1bWVJbmNbMV0pKSB7Ci0gICAgICAgICAgICBpbnQzMl90IHZsID0gdC0+cHJldlZvbHVtZVswXTsKLSAgICAgICAgICAgIGludDMyX3QgdnIgPSB0LT5wcmV2Vm9sdW1lWzFdOwotICAgICAgICAgICAgY29uc3QgaW50MzJfdCB2bEluYyA9IHQtPnZvbHVtZUluY1swXTsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdnJJbmMgPSB0LT52b2x1bWVJbmNbMV07CisgICAgICAgIGlmIChDQ19VTkxJS0VMWSh2b2x1bWVJbmNbMF18dm9sdW1lSW5jWzFdKSkgeworICAgICAgICAgICAgaW50MzJfdCB2bCA9IHByZXZWb2x1bWVbMF07CisgICAgICAgICAgICBpbnQzMl90IHZyID0gcHJldlZvbHVtZVsxXTsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdmxJbmMgPSB2b2x1bWVJbmNbMF07CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IHZySW5jID0gdm9sdW1lSW5jWzFdOwogCiAgICAgICAgICAgICAvLyBBTE9HRCgiWzJdICVwOiBpbmM9JWYsIHYwPSVmLCB2MT0lZCwgZmluYWw9JWYsIGNvdW50PSVkIiwKLSAgICAgICAgICAgIC8vICAgICAgICAgdCwgdmxJbmMvNjU1MzYuMGYsIHZsLzY1NTM2LjBmLCB0LT52b2x1bWVbMF0sCisgICAgICAgICAgICAvLyAgICAgICAgIHQsIHZsSW5jLzY1NTM2LjBmLCB2bC82NTUzNi4wZiwgdm9sdW1lWzBdLAogICAgICAgICAgICAgLy8gICAgICAgICAodmwgKyB2bEluYypmcmFtZUNvdW50KS82NTUzNi4wZiwgZnJhbWVDb3VudCk7CiAKICAgICAgICAgICAgIGRvIHsKQEAgLTEzNDgsMTQgKzEyMzQsMTQgQEAKICAgICAgICAgICAgICAgICB2ciArPSB2ckluYzsKICAgICAgICAgICAgIH0gd2hpbGUgKC0tZnJhbWVDb3VudCk7CiAKLSAgICAgICAgICAgIHQtPnByZXZWb2x1bWVbMF0gPSB2bDsKLSAgICAgICAgICAgIHQtPnByZXZWb2x1bWVbMV0gPSB2cjsKLSAgICAgICAgICAgIHQtPmFkanVzdFZvbHVtZVJhbXAoZmFsc2UpOworICAgICAgICAgICAgcHJldlZvbHVtZVswXSA9IHZsOworICAgICAgICAgICAgcHJldlZvbHVtZVsxXSA9IHZyOworICAgICAgICAgICAgYWRqdXN0Vm9sdW1lUmFtcChmYWxzZSk7CiAgICAgICAgIH0KICAgICAgICAgLy8gY29uc3RhbnQgZ2FpbgogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGNvbnN0IGludDE2X3QgdmwgPSB0LT52b2x1bWVbMF07Ci0gICAgICAgICAgICBjb25zdCBpbnQxNl90IHZyID0gdC0+dm9sdW1lWzFdOworICAgICAgICAgICAgY29uc3QgaW50MTZfdCB2bCA9IHZvbHVtZVswXTsKKyAgICAgICAgICAgIGNvbnN0IGludDE2X3QgdnIgPSB2b2x1bWVbMV07CiAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgaW50MTZfdCBsID0gKmluKys7CiAgICAgICAgICAgICAgICAgb3V0WzBdID0gbXVsQWRkKGwsIHZsLCBvdXRbMF0pOwpAQCAtMTM2NCwyNzMgKzEyNTAsMjEzIEBACiAgICAgICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOwogICAgICAgICB9CiAgICAgfQotICAgIHQtPmluID0gaW47CisgICAgbUluID0gaW47CiB9CiAKIC8vIG5vLW9wIGNhc2UKLXZvaWQgQXVkaW9NaXhlcjo6cHJvY2Vzc19fbm9wKHN0YXRlX3QqIHN0YXRlKQordm9pZCBBdWRpb01peGVyOjpwcm9jZXNzX19ub3AoKQogewogICAgIEFMT0dWVigicHJvY2Vzc19fbm9wXG4iKTsKLSAgICB1aW50MzJfdCBlMCA9IHN0YXRlLT5lbmFibGVkVHJhY2tzOwotICAgIHdoaWxlIChlMCkgeworCisgICAgZm9yIChjb25zdCBhdXRvICZwYWlyIDogbUdyb3VwcykgewogICAgICAgICAvLyBwcm9jZXNzIGJ5IGdyb3VwIG9mIHRyYWNrcyB3aXRoIHNhbWUgb3V0cHV0IGJ1ZmZlciB0bwogICAgICAgICAvLyBhdm9pZCBtdWx0aXBsZSBtZW1zZXQoKSBvbiBzYW1lIGJ1ZmZlcgotICAgICAgICB1aW50MzJfdCBlMSA9IGUwLCBlMiA9IGUwOwotICAgICAgICBpbnQgaSA9IDMxIC0gX19idWlsdGluX2NseihlMSk7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHRyYWNrX3QmIHQxID0gc3RhdGUtPnRyYWNrc1tpXTsKLSAgICAgICAgICAgIGUyICY9IH4oMTw8aSk7Ci0gICAgICAgICAgICB3aGlsZSAoZTIpIHsKLSAgICAgICAgICAgICAgICBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGUyKTsKLSAgICAgICAgICAgICAgICBlMiAmPSB+KDE8PGkpOwotICAgICAgICAgICAgICAgIHRyYWNrX3QmIHQyID0gc3RhdGUtPnRyYWNrc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodDIubWFpbkJ1ZmZlciAhPSB0MS5tYWluQnVmZmVyKSkgewotICAgICAgICAgICAgICAgICAgICBlMSAmPSB+KDE8PGkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGUwICY9IH4oZTEpOworICAgICAgICBjb25zdCBhdXRvICZncm91cCA9IHBhaXIuc2Vjb25kOwogCi0gICAgICAgICAgICBtZW1zZXQodDEubWFpbkJ1ZmZlciwgMCwgc3RhdGUtPmZyYW1lQ291bnQgKiB0MS5tTWl4ZXJDaGFubmVsQ291bnQKLSAgICAgICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKHQxLm1NaXhlckZvcm1hdCkpOwotICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFjaz4gJnQgPSBtVHJhY2tzW2dyb3VwWzBdXTsKKyAgICAgICAgbWVtc2V0KHQtPm1haW5CdWZmZXIsIDAsCisgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQgKiB0LT5tTWl4ZXJDaGFubmVsQ291bnQKKyAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUodC0+bU1peGVyRm9ybWF0KSk7CiAKLSAgICAgICAgd2hpbGUgKGUxKSB7Ci0gICAgICAgICAgICBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGUxKTsKLSAgICAgICAgICAgIGUxICY9IH4oMTw8aSk7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJhY2tfdCYgdDMgPSBzdGF0ZS0+dHJhY2tzW2ldOwotICAgICAgICAgICAgICAgIHNpemVfdCBvdXRGcmFtZXMgPSBzdGF0ZS0+ZnJhbWVDb3VudDsKLSAgICAgICAgICAgICAgICB3aGlsZSAob3V0RnJhbWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHQzLmJ1ZmZlci5mcmFtZUNvdW50ID0gb3V0RnJhbWVzOwotICAgICAgICAgICAgICAgICAgICB0My5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmdDMuYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHQzLmJ1ZmZlci5yYXcgPT0gTlVMTCkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIG91dEZyYW1lcyAtPSB0My5idWZmZXIuZnJhbWVDb3VudDsKLSAgICAgICAgICAgICAgICAgICAgdDMuYnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJnQzLmJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAvLyBub3cgY29uc3VtZSBkYXRhCisgICAgICAgIGZvciAoY29uc3QgaW50IG5hbWUgOiBncm91cCkgeworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdCA9IG1UcmFja3NbbmFtZV07CisgICAgICAgICAgICBzaXplX3Qgb3V0RnJhbWVzID0gbUZyYW1lQ291bnQ7CisgICAgICAgICAgICB3aGlsZSAob3V0RnJhbWVzKSB7CisgICAgICAgICAgICAgICAgdC0+YnVmZmVyLmZyYW1lQ291bnQgPSBvdXRGcmFtZXM7CisgICAgICAgICAgICAgICAgdC0+YnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJnQtPmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgaWYgKHQtPmJ1ZmZlci5yYXcgPT0gTlVMTCkgYnJlYWs7CisgICAgICAgICAgICAgICAgb3V0RnJhbWVzIC09IHQtPmJ1ZmZlci5mcmFtZUNvdW50OworICAgICAgICAgICAgICAgIHQtPmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZ0LT5idWZmZXIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQogCiAvLyBnZW5lcmljIGNvZGUgd2l0aG91dCByZXNhbXBsaW5nCi12b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NfX2dlbmVyaWNOb1Jlc2FtcGxpbmcoc3RhdGVfdCogc3RhdGUpCit2b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NfX2dlbmVyaWNOb1Jlc2FtcGxpbmcoKQogewogICAgIEFMT0dWVigicHJvY2Vzc19fZ2VuZXJpY05vUmVzYW1wbGluZ1xuIik7CiAgICAgaW50MzJfdCBvdXRUZW1wW0JMT0NLU0laRSAqIE1BWF9OVU1fQ0hBTk5FTFNdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7CiAKLSAgICAvLyBhY3F1aXJlIGVhY2ggdHJhY2sncyBidWZmZXIKLSAgICB1aW50MzJfdCBlbmFibGVkVHJhY2tzID0gc3RhdGUtPmVuYWJsZWRUcmFja3M7Ci0gICAgdWludDMyX3QgZTAgPSBlbmFibGVkVHJhY2tzOwotICAgIHdoaWxlIChlMCkgewotICAgICAgICBjb25zdCBpbnQgaSA9IDMxIC0gX19idWlsdGluX2NseihlMCk7Ci0gICAgICAgIGUwICY9IH4oMTw8aSk7Ci0gICAgICAgIHRyYWNrX3QmIHQgPSBzdGF0ZS0+dHJhY2tzW2ldOwotICAgICAgICB0LmJ1ZmZlci5mcmFtZUNvdW50ID0gc3RhdGUtPmZyYW1lQ291bnQ7Ci0gICAgICAgIHQuYnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJnQuYnVmZmVyKTsKLSAgICAgICAgdC5mcmFtZUNvdW50ID0gdC5idWZmZXIuZnJhbWVDb3VudDsKLSAgICAgICAgdC5pbiA9IHQuYnVmZmVyLnJhdzsKLSAgICB9CisgICAgZm9yIChjb25zdCBhdXRvICZwYWlyIDogbUdyb3VwcykgeworICAgICAgICAvLyBwcm9jZXNzIGJ5IGdyb3VwIG9mIHRyYWNrcyB3aXRoIHNhbWUgb3V0cHV0IG1haW4gYnVmZmVyIHRvCisgICAgICAgIC8vIGF2b2lkIG11bHRpcGxlIG1lbXNldCgpIG9uIHNhbWUgYnVmZmVyCisgICAgICAgIGNvbnN0IGF1dG8gJmdyb3VwID0gcGFpci5zZWNvbmQ7CiAKLSAgICBlMCA9IGVuYWJsZWRUcmFja3M7Ci0gICAgd2hpbGUgKGUwKSB7Ci0gICAgICAgIC8vIHByb2Nlc3MgYnkgZ3JvdXAgb2YgdHJhY2tzIHdpdGggc2FtZSBvdXRwdXQgYnVmZmVyIHRvCi0gICAgICAgIC8vIG9wdGltaXplIGNhY2hlIHVzZQotICAgICAgICB1aW50MzJfdCBlMSA9IGUwLCBlMiA9IGUwOwotICAgICAgICBpbnQgaiA9IDMxIC0gX19idWlsdGluX2NseihlMSk7Ci0gICAgICAgIHRyYWNrX3QmIHQxID0gc3RhdGUtPnRyYWNrc1tqXTsKLSAgICAgICAgZTIgJj0gfigxPDxqKTsKLSAgICAgICAgd2hpbGUgKGUyKSB7Ci0gICAgICAgICAgICBqID0gMzEgLSBfX2J1aWx0aW5fY2x6KGUyKTsKLSAgICAgICAgICAgIGUyICY9IH4oMTw8aik7Ci0gICAgICAgICAgICB0cmFja190JiB0MiA9IHN0YXRlLT50cmFja3Nbal07Ci0gICAgICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodDIubWFpbkJ1ZmZlciAhPSB0MS5tYWluQnVmZmVyKSkgewotICAgICAgICAgICAgICAgIGUxICY9IH4oMTw8aik7Ci0gICAgICAgICAgICB9CisgICAgICAgIC8vIGFjcXVpcmUgYnVmZmVyCisgICAgICAgIGZvciAoY29uc3QgaW50IG5hbWUgOiBncm91cCkgeworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdCA9IG1UcmFja3NbbmFtZV07CisgICAgICAgICAgICB0LT5idWZmZXIuZnJhbWVDb3VudCA9IG1GcmFtZUNvdW50OworICAgICAgICAgICAgdC0+YnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJnQtPmJ1ZmZlcik7CisgICAgICAgICAgICB0LT5mcmFtZUNvdW50ID0gdC0+YnVmZmVyLmZyYW1lQ291bnQ7CisgICAgICAgICAgICB0LT5tSW4gPSB0LT5idWZmZXIucmF3OwogICAgICAgICB9Ci0gICAgICAgIGUwICY9IH4oZTEpOwotICAgICAgICAvLyB0aGlzIGFzc3VtZXMgb3V0cHV0IDE2IGJpdHMgc3RlcmVvLCBubyByZXNhbXBsaW5nCi0gICAgICAgIGludDMyX3QgKm91dCA9IHQxLm1haW5CdWZmZXI7CisKKyAgICAgICAgaW50MzJfdCAqb3V0ID0gKGludCAqKXBhaXIuZmlyc3Q7CiAgICAgICAgIHNpemVfdCBudW1GcmFtZXMgPSAwOwogICAgICAgICBkbyB7CisgICAgICAgICAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IHN0ZDo6bWluKChzaXplX3QpQkxPQ0tTSVpFLCBtRnJhbWVDb3VudCAtIG51bUZyYW1lcyk7CiAgICAgICAgICAgICBtZW1zZXQob3V0VGVtcCwgMCwgc2l6ZW9mKG91dFRlbXApKTsKLSAgICAgICAgICAgIGUyID0gZTE7Ci0gICAgICAgICAgICB3aGlsZSAoZTIpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQgaSA9IDMxIC0gX19idWlsdGluX2NseihlMik7Ci0gICAgICAgICAgICAgICAgZTIgJj0gfigxPDxpKTsKLSAgICAgICAgICAgICAgICB0cmFja190JiB0ID0gc3RhdGUtPnRyYWNrc1tpXTsKLSAgICAgICAgICAgICAgICBzaXplX3Qgb3V0RnJhbWVzID0gQkxPQ0tTSVpFOworICAgICAgICAgICAgZm9yIChjb25zdCBpbnQgbmFtZSA6IGdyb3VwKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdCA9IG1UcmFja3NbbmFtZV07CiAgICAgICAgICAgICAgICAgaW50MzJfdCAqYXV4ID0gTlVMTDsKLSAgICAgICAgICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodC5uZWVkcyAmIE5FRURTX0FVWCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXV4ID0gdC5hdXhCdWZmZXIgKyBudW1GcmFtZXM7CisgICAgICAgICAgICAgICAgaWYgKENDX1VOTElLRUxZKHQtPm5lZWRzICYgTkVFRFNfQVVYKSkgeworICAgICAgICAgICAgICAgICAgICBhdXggPSB0LT5hdXhCdWZmZXIgKyBudW1GcmFtZXM7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdoaWxlIChvdXRGcmFtZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdC5pbiA9PSBOVUxMIGNhbiBoYXBwZW4gaWYgdGhlIHRyYWNrIHdhcyBmbHVzaGVkIGp1c3QgYWZ0ZXIgaGF2aW5nCisgICAgICAgICAgICAgICAgZm9yIChpbnQgb3V0RnJhbWVzID0gZnJhbWVDb3VudDsgb3V0RnJhbWVzID4gMDsgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHQtPmluID09IG51bGxwdHIgY2FuIGhhcHBlbiBpZiB0aGUgdHJhY2sgd2FzIGZsdXNoZWQganVzdCBhZnRlciBoYXZpbmcKICAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiBlbmFibGVkIGZvciBtaXhpbmcuCi0gICAgICAgICAgICAgICAgICAgaWYgKHQuaW4gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZFRyYWNrcyAmPSB+KDE8PGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZTEgJj0gfigxPDxpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHQtPm1JbiA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5GcmFtZXMgPSAodC5mcmFtZUNvdW50ID4gb3V0RnJhbWVzKT9vdXRGcmFtZXM6dC5mcmFtZUNvdW50OworICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5GcmFtZXMgPSAodC0+ZnJhbWVDb3VudCA+IG91dEZyYW1lcyk/b3V0RnJhbWVzOnQtPmZyYW1lQ291bnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpbkZyYW1lcyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHQuaG9vaygmdCwgb3V0VGVtcCArIChCTE9DS1NJWkUgLSBvdXRGcmFtZXMpICogdC5tTWl4ZXJDaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRnJhbWVzLCBzdGF0ZS0+cmVzYW1wbGVUZW1wLCBhdXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgdC5mcmFtZUNvdW50IC09IGluRnJhbWVzOworICAgICAgICAgICAgICAgICAgICAgICAgKHQuZ2V0KCktPip0LT5ob29rKSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0VGVtcCArIChmcmFtZUNvdW50IC0gb3V0RnJhbWVzKSAqIHQtPm1NaXhlckNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GcmFtZXMsIG1SZXNhbXBsZVRlbXAuZ2V0KCkgLyogbmFrZWQgcHRyICovLCBhdXgpOworICAgICAgICAgICAgICAgICAgICAgICAgdC0+ZnJhbWVDb3VudCAtPSBpbkZyYW1lczsKICAgICAgICAgICAgICAgICAgICAgICAgIG91dEZyYW1lcyAtPSBpbkZyYW1lczsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDQ19VTkxJS0VMWShhdXggIT0gTlVMTCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXggKz0gaW5GcmFtZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHQuZnJhbWVDb3VudCA9PSAwICYmIG91dEZyYW1lcykgewotICAgICAgICAgICAgICAgICAgICAgICAgdC5idWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmdC5idWZmZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgdC5idWZmZXIuZnJhbWVDb3VudCA9IChzdGF0ZS0+ZnJhbWVDb3VudCAtIG51bUZyYW1lcykgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQkxPQ0tTSVpFIC0gb3V0RnJhbWVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHQuYnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJnQuYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHQuaW4gPSB0LmJ1ZmZlci5yYXc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5pbiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZFRyYWNrcyAmPSB+KDE8PGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUxICY9IH4oMTw8aSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0LT5mcmFtZUNvdW50ID09IDAgJiYgb3V0RnJhbWVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0LT5idWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmdC0+YnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHQtPmJ1ZmZlci5mcmFtZUNvdW50ID0gKG1GcmFtZUNvdW50IC0gbnVtRnJhbWVzKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmcmFtZUNvdW50IC0gb3V0RnJhbWVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHQtPmJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZ0LT5idWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgdC0+bUluID0gdC0+YnVmZmVyLnJhdzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LT5tSW4gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgdC5mcmFtZUNvdW50ID0gdC5idWZmZXIuZnJhbWVDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHQtPmZyYW1lQ291bnQgPSB0LT5idWZmZXIuZnJhbWVDb3VudDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY29udmVydE1peGVyRm9ybWF0KG91dCwgdDEubU1peGVyRm9ybWF0LCBvdXRUZW1wLCB0MS5tTWl4ZXJJbkZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgQkxPQ0tTSVpFICogdDEubU1peGVyQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFjaz4gJnQxID0gbVRyYWNrc1tncm91cFswXV07CisgICAgICAgICAgICBjb252ZXJ0TWl4ZXJGb3JtYXQob3V0LCB0MS0+bU1peGVyRm9ybWF0LCBvdXRUZW1wLCB0MS0+bU1peGVySW5Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQgKiB0MS0+bU1peGVyQ2hhbm5lbENvdW50KTsKICAgICAgICAgICAgIC8vIFRPRE86IGZpeCB1Z2x5IGNhc3RpbmcgZHVlIHRvIGNob2ljZSBvZiBvdXQgcG9pbnRlciB0eXBlCiAgICAgICAgICAgICBvdXQgPSByZWludGVycHJldF9jYXN0PGludDMyX3QqPigodWludDhfdCopb3V0Ci0gICAgICAgICAgICAgICAgICAgICsgQkxPQ0tTSVpFICogdDEubU1peGVyQ2hhbm5lbENvdW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUodDEubU1peGVyRm9ybWF0KSk7Ci0gICAgICAgICAgICBudW1GcmFtZXMgKz0gQkxPQ0tTSVpFOwotICAgICAgICB9IHdoaWxlIChudW1GcmFtZXMgPCBzdGF0ZS0+ZnJhbWVDb3VudCk7Ci0gICAgfQorICAgICAgICAgICAgICAgICAgICArIGZyYW1lQ291bnQgKiB0MS0+bU1peGVyQ2hhbm5lbENvdW50CisgICAgICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZSh0MS0+bU1peGVyRm9ybWF0KSk7CisgICAgICAgICAgICBudW1GcmFtZXMgKz0gZnJhbWVDb3VudDsKKyAgICAgICAgfSB3aGlsZSAobnVtRnJhbWVzIDwgbUZyYW1lQ291bnQpOwogCi0gICAgLy8gcmVsZWFzZSBlYWNoIHRyYWNrJ3MgYnVmZmVyCi0gICAgZTAgPSBlbmFibGVkVHJhY2tzOwotICAgIHdoaWxlIChlMCkgewotICAgICAgICBjb25zdCBpbnQgaSA9IDMxIC0gX19idWlsdGluX2NseihlMCk7Ci0gICAgICAgIGUwICY9IH4oMTw8aSk7Ci0gICAgICAgIHRyYWNrX3QmIHQgPSBzdGF0ZS0+dHJhY2tzW2ldOwotICAgICAgICB0LmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZ0LmJ1ZmZlcik7CisgICAgICAgIC8vIHJlbGVhc2UgZWFjaCB0cmFjaydzIGJ1ZmZlcgorICAgICAgICBmb3IgKGNvbnN0IGludCBuYW1lIDogZ3JvdXApIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFjaz4gJnQgPSBtVHJhY2tzW25hbWVdOworICAgICAgICAgICAgdC0+YnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJnQtPmJ1ZmZlcik7CisgICAgICAgIH0KICAgICB9CiB9CiAKLQogLy8gZ2VuZXJpYyBjb2RlIHdpdGggcmVzYW1wbGluZwotdm9pZCBBdWRpb01peGVyOjpwcm9jZXNzX19nZW5lcmljUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSkKK3ZvaWQgQXVkaW9NaXhlcjo6cHJvY2Vzc19fZ2VuZXJpY1Jlc2FtcGxpbmcoKQogewogICAgIEFMT0dWVigicHJvY2Vzc19fZ2VuZXJpY1Jlc2FtcGxpbmdcbiIpOwotICAgIC8vIHRoaXMgY29uc3QganVzdCBtZWFucyB0aGF0IGxvY2FsIHZhcmlhYmxlIG91dFRlbXAgZG9lc24ndCBjaGFuZ2UKLSAgICBpbnQzMl90KiBjb25zdCBvdXRUZW1wID0gc3RhdGUtPm91dHB1dFRlbXA7Ci0gICAgc2l6ZV90IG51bUZyYW1lcyA9IHN0YXRlLT5mcmFtZUNvdW50OworICAgIGludDMyX3QgKiBjb25zdCBvdXRUZW1wID0gbU91dHB1dFRlbXAuZ2V0KCk7IC8vIG5ha2VkIHB0cgorICAgIHNpemVfdCBudW1GcmFtZXMgPSBtRnJhbWVDb3VudDsKIAotICAgIHVpbnQzMl90IGUwID0gc3RhdGUtPmVuYWJsZWRUcmFja3M7Ci0gICAgd2hpbGUgKGUwKSB7Ci0gICAgICAgIC8vIHByb2Nlc3MgYnkgZ3JvdXAgb2YgdHJhY2tzIHdpdGggc2FtZSBvdXRwdXQgYnVmZmVyCi0gICAgICAgIC8vIHRvIG9wdGltaXplIGNhY2hlIHVzZQotICAgICAgICB1aW50MzJfdCBlMSA9IGUwLCBlMiA9IGUwOwotICAgICAgICBpbnQgaiA9IDMxIC0gX19idWlsdGluX2NseihlMSk7Ci0gICAgICAgIHRyYWNrX3QmIHQxID0gc3RhdGUtPnRyYWNrc1tqXTsKLSAgICAgICAgZTIgJj0gfigxPDxqKTsKLSAgICAgICAgd2hpbGUgKGUyKSB7Ci0gICAgICAgICAgICBqID0gMzEgLSBfX2J1aWx0aW5fY2x6KGUyKTsKLSAgICAgICAgICAgIGUyICY9IH4oMTw8aik7Ci0gICAgICAgICAgICB0cmFja190JiB0MiA9IHN0YXRlLT50cmFja3Nbal07Ci0gICAgICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodDIubWFpbkJ1ZmZlciAhPSB0MS5tYWluQnVmZmVyKSkgewotICAgICAgICAgICAgICAgIGUxICY9IH4oMTw8aik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZTAgJj0gfihlMSk7Ci0gICAgICAgIGludDMyX3QgKm91dCA9IHQxLm1haW5CdWZmZXI7Ci0gICAgICAgIG1lbXNldChvdXRUZW1wLCAwLCBzaXplb2YoKm91dFRlbXApICogdDEubU1peGVyQ2hhbm5lbENvdW50ICogc3RhdGUtPmZyYW1lQ291bnQpOwotICAgICAgICB3aGlsZSAoZTEpIHsKLSAgICAgICAgICAgIGNvbnN0IGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGUxKTsKLSAgICAgICAgICAgIGUxICY9IH4oMTw8aSk7Ci0gICAgICAgICAgICB0cmFja190JiB0ID0gc3RhdGUtPnRyYWNrc1tpXTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnBhaXIgOiBtR3JvdXBzKSB7CisgICAgICAgIGNvbnN0IGF1dG8gJmdyb3VwID0gcGFpci5zZWNvbmQ7CisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFjaz4gJnQxID0gbVRyYWNrc1tncm91cFswXV07CisKKyAgICAgICAgLy8gY2xlYXIgdGVtcCBidWZmZXIKKyAgICAgICAgbWVtc2V0KG91dFRlbXAsIDAsIHNpemVvZigqb3V0VGVtcCkgKiB0MS0+bU1peGVyQ2hhbm5lbENvdW50ICogbUZyYW1lQ291bnQpOworICAgICAgICBmb3IgKGNvbnN0IGludCBuYW1lIDogZ3JvdXApIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFjaz4gJnQgPSBtVHJhY2tzW25hbWVdOwogICAgICAgICAgICAgaW50MzJfdCAqYXV4ID0gTlVMTDsKLSAgICAgICAgICAgIGlmIChDQ19VTkxJS0VMWSh0Lm5lZWRzICYgTkVFRFNfQVVYKSkgewotICAgICAgICAgICAgICAgIGF1eCA9IHQuYXV4QnVmZmVyOworICAgICAgICAgICAgaWYgKENDX1VOTElLRUxZKHQtPm5lZWRzICYgTkVFRFNfQVVYKSkgeworICAgICAgICAgICAgICAgIGF1eCA9IHQtPmF1eEJ1ZmZlcjsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gdGhpcyBpcyBhIGxpdHRsZSBnb29meSwgb24gdGhlIHJlc2FtcGxpbmcgY2FzZSB3ZSBkb24ndAogICAgICAgICAgICAgLy8gYWNxdWlyZS9yZWxlYXNlIHRoZSBidWZmZXJzIGJlY2F1c2UgaXQncyBkb25lIGJ5CiAgICAgICAgICAgICAvLyB0aGUgcmVzYW1wbGVyLgotICAgICAgICAgICAgaWYgKHQubmVlZHMgJiBORUVEU19SRVNBTVBMRSkgewotICAgICAgICAgICAgICAgIHQuaG9vaygmdCwgb3V0VGVtcCwgbnVtRnJhbWVzLCBzdGF0ZS0+cmVzYW1wbGVUZW1wLCBhdXgpOworICAgICAgICAgICAgaWYgKHQtPm5lZWRzICYgTkVFRFNfUkVTQU1QTEUpIHsKKyAgICAgICAgICAgICAgICAodC5nZXQoKS0+KnQtPmhvb2spKG91dFRlbXAsIG51bUZyYW1lcywgbVJlc2FtcGxlVGVtcC5nZXQoKSAvKiBuYWtlZCBwdHIgKi8sIGF1eCk7CiAgICAgICAgICAgICB9IGVsc2UgewogCiAgICAgICAgICAgICAgICAgc2l6ZV90IG91dEZyYW1lcyA9IDA7CiAKICAgICAgICAgICAgICAgICB3aGlsZSAob3V0RnJhbWVzIDwgbnVtRnJhbWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHQuYnVmZmVyLmZyYW1lQ291bnQgPSBudW1GcmFtZXMgLSBvdXRGcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgIHQuYnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJnQuYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgdC5pbiA9IHQuYnVmZmVyLnJhdzsKLSAgICAgICAgICAgICAgICAgICAgLy8gdC5pbiA9PSBOVUxMIGNhbiBoYXBwZW4gaWYgdGhlIHRyYWNrIHdhcyBmbHVzaGVkIGp1c3QgYWZ0ZXIgaGF2aW5nCisgICAgICAgICAgICAgICAgICAgIHQtPmJ1ZmZlci5mcmFtZUNvdW50ID0gbnVtRnJhbWVzIC0gb3V0RnJhbWVzOworICAgICAgICAgICAgICAgICAgICB0LT5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmdC0+YnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgdC0+bUluID0gdC0+YnVmZmVyLnJhdzsKKyAgICAgICAgICAgICAgICAgICAgLy8gdC0+bUluID09IG51bGxwdHIgY2FuIGhhcHBlbiBpZiB0aGUgdHJhY2sgd2FzIGZsdXNoZWQganVzdCBhZnRlciBoYXZpbmcKICAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiBlbmFibGVkIGZvciBtaXhpbmcuCi0gICAgICAgICAgICAgICAgICAgIGlmICh0LmluID09IE5VTEwpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpZiAodC0+bUluID09IG51bGxwdHIpIGJyZWFrOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChDQ19VTkxJS0VMWShhdXggIT0gTlVMTCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1eCArPSBvdXRGcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdC5ob29rKCZ0LCBvdXRUZW1wICsgb3V0RnJhbWVzICogdC5tTWl4ZXJDaGFubmVsQ291bnQsIHQuYnVmZmVyLmZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPnJlc2FtcGxlVGVtcCwgYXV4KTsKLSAgICAgICAgICAgICAgICAgICAgb3V0RnJhbWVzICs9IHQuYnVmZmVyLmZyYW1lQ291bnQ7Ci0gICAgICAgICAgICAgICAgICAgIHQuYnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJnQuYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgKHQuZ2V0KCktPip0LT5ob29rKSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRUZW1wICsgb3V0RnJhbWVzICogdC0+bU1peGVyQ2hhbm5lbENvdW50LCB0LT5idWZmZXIuZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzYW1wbGVUZW1wLmdldCgpIC8qIG5ha2VkIHB0ciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXggIT0gbnVsbHB0ciA/IGF1eCArIG91dEZyYW1lcyA6IG51bGxwdHIpOworICAgICAgICAgICAgICAgICAgICBvdXRGcmFtZXMgKz0gdC0+YnVmZmVyLmZyYW1lQ291bnQ7CisKKyAgICAgICAgICAgICAgICAgICAgdC0+YnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJnQtPmJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGNvbnZlcnRNaXhlckZvcm1hdChvdXQsIHQxLm1NaXhlckZvcm1hdCwKLSAgICAgICAgICAgICAgICBvdXRUZW1wLCB0MS5tTWl4ZXJJbkZvcm1hdCwgbnVtRnJhbWVzICogdDEubU1peGVyQ2hhbm5lbENvdW50KTsKKyAgICAgICAgY29udmVydE1peGVyRm9ybWF0KHQxLT5tYWluQnVmZmVyLCB0MS0+bU1peGVyRm9ybWF0LAorICAgICAgICAgICAgICAgIG91dFRlbXAsIHQxLT5tTWl4ZXJJbkZvcm1hdCwgbnVtRnJhbWVzICogdDEtPm1NaXhlckNoYW5uZWxDb3VudCk7CiAgICAgfQogfQogCiAvLyBvbmUgdHJhY2ssIDE2IGJpdHMgc3RlcmVvIHdpdGhvdXQgcmVzYW1wbGluZyBpcyB0aGUgbW9zdCBjb21tb24gY2FzZQotdm9pZCBBdWRpb01peGVyOjpwcm9jZXNzX19PbmVUcmFjazE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSkKK3ZvaWQgQXVkaW9NaXhlcjo6cHJvY2Vzc19fb25lVHJhY2sxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmcoKQogewotICAgIEFMT0dWVigicHJvY2Vzc19fT25lVHJhY2sxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmdcbiIpOwotICAgIC8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgY2FsbGVkIHdoZW4gc3RhdGUtPmVuYWJsZWRUcmFja3MgaGFzIGV4YWN0bHkKLSAgICAvLyBvbmUgYml0IHNldC4gIFRoZSBhc3NlcnRzIGJlbG93IHdvdWxkIHZlcmlmeSB0aGlzLCBidXQgYXJlIGNvbW1lbnRlZCBvdXQKLSAgICAvLyBzaW5jZSB0aGUgd2hvbGUgcG9pbnQgb2YgdGhpcyBtZXRob2QgaXMgdG8gb3B0aW1pemUgcGVyZm9ybWFuY2UuCi0gICAgLy9BTE9HX0FTU0VSVCgwICE9IHN0YXRlLT5lbmFibGVkVHJhY2tzLCAibm8gdHJhY2tzIGVuYWJsZWQiKTsKLSAgICBjb25zdCBpbnQgaSA9IDMxIC0gX19idWlsdGluX2NseihzdGF0ZS0+ZW5hYmxlZFRyYWNrcyk7Ci0gICAgLy9BTE9HX0FTU0VSVCgoMSA8PCBpKSA9PSBzdGF0ZS0+ZW5hYmxlZFRyYWNrcywgIm1vcmUgdGhhbiAxIHRyYWNrIGVuYWJsZWQiKTsKLSAgICBjb25zdCB0cmFja190JiB0ID0gc3RhdGUtPnRyYWNrc1tpXTsKKyAgICBBTE9HVlYoInByb2Nlc3NfX29uZVRyYWNrMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nXG4iKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1FbmFibGVkLnNpemUoKSAhPSAwLAorICAgICAgICAgICAgIiV6dSAhPSAxIHRyYWNrcyBlbmFibGVkIiwgbUVuYWJsZWQuc2l6ZSgpKTsKKyAgICBjb25zdCBpbnQgbmFtZSA9IG1FbmFibGVkWzBdOworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFjaz4gJnQgPSBtVHJhY2tzW25hbWVdOwogCi0gICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyJiBiKHQuYnVmZmVyKTsKKyAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXImIGIodC0+YnVmZmVyKTsKIAotICAgIGludDMyX3QqIG91dCA9IHQubWFpbkJ1ZmZlcjsKKyAgICBpbnQzMl90KiBvdXQgPSB0LT5tYWluQnVmZmVyOwogICAgIGZsb2F0ICpmb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KG91dCk7Ci0gICAgc2l6ZV90IG51bUZyYW1lcyA9IHN0YXRlLT5mcmFtZUNvdW50OworICAgIHNpemVfdCBudW1GcmFtZXMgPSBtRnJhbWVDb3VudDsKIAotICAgIGNvbnN0IGludDE2X3QgdmwgPSB0LnZvbHVtZVswXTsKLSAgICBjb25zdCBpbnQxNl90IHZyID0gdC52b2x1bWVbMV07Ci0gICAgY29uc3QgdWludDMyX3QgdnJsID0gdC52b2x1bWVSTDsKKyAgICBjb25zdCBpbnQxNl90IHZsID0gdC0+dm9sdW1lWzBdOworICAgIGNvbnN0IGludDE2X3QgdnIgPSB0LT52b2x1bWVbMV07CisgICAgY29uc3QgdWludDMyX3QgdnJsID0gdC0+dm9sdW1lUkw7CiAgICAgd2hpbGUgKG51bUZyYW1lcykgewogICAgICAgICBiLmZyYW1lQ291bnQgPSBudW1GcmFtZXM7Ci0gICAgICAgIHQuYnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJmIpOworICAgICAgICB0LT5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmYik7CiAgICAgICAgIGNvbnN0IGludDE2X3QgKmluID0gYi5pMTY7CiAKICAgICAgICAgLy8gaW4gPT0gTlVMTCBjYW4gaGFwcGVuIGlmIHRoZSB0cmFjayB3YXMgZmx1c2hlZCBqdXN0IGFmdGVyIGhhdmluZwogICAgICAgICAvLyBiZWVuIGVuYWJsZWQgZm9yIG1peGluZy4KICAgICAgICAgaWYgKGluID09IE5VTEwgfHwgKCgodWludHB0cl90KWluKSAmIDMpKSB7Ci0gICAgICAgICAgICBpZiAoIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQgPT0gdC5tTWl4ZXJGb3JtYXQgKSB7CisgICAgICAgICAgICBpZiAoIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQgPT0gdC0+bU1peGVyRm9ybWF0ICkgewogICAgICAgICAgICAgICAgICBtZW1zZXQoKGNoYXIqKWZvdXQsIDAsIG51bUZyYW1lcwotICAgICAgICAgICAgICAgICAgICAgICAgICogdC5tTWl4ZXJDaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKHQubU1peGVyRm9ybWF0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgKiB0LT5tTWl4ZXJDaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKHQtPm1NaXhlckZvcm1hdCkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgbWVtc2V0KChjaGFyKilvdXQsIDAsIG51bUZyYW1lcwotICAgICAgICAgICAgICAgICAgICAgICAgICogdC5tTWl4ZXJDaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKHQubU1peGVyRm9ybWF0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgKiB0LT5tTWl4ZXJDaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKHQtPm1NaXhlckZvcm1hdCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR0VfSUYoKCgodWludHB0cl90KWluKSAmIDMpLAotICAgICAgICAgICAgICAgICAgICAicHJvY2Vzc19fT25lVHJhY2sxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmc6IG1pc2FsaWduZWQgYnVmZmVyIgorICAgICAgICAgICAgICAgICAgICAicHJvY2Vzc19fb25lVHJhY2sxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmc6IG1pc2FsaWduZWQgYnVmZmVyIgogICAgICAgICAgICAgICAgICAgICAiICVwIHRyYWNrICVkLCBjaGFubmVscyAlZCwgbmVlZHMgJTA4eCwgdm9sdW1lICUwOHggdmZsICVmIHZmciAlZiIsCi0gICAgICAgICAgICAgICAgICAgIGluLCBpLCB0LmNoYW5uZWxDb3VudCwgdC5uZWVkcywgdnJsLCB0Lm1Wb2x1bWVbMF0sIHQubVZvbHVtZVsxXSk7CisgICAgICAgICAgICAgICAgICAgIGluLCBuYW1lLCB0LT5jaGFubmVsQ291bnQsIHQtPm5lZWRzLCB2cmwsIHQtPm1Wb2x1bWVbMF0sIHQtPm1Wb2x1bWVbMV0pOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIHNpemVfdCBvdXRGcmFtZXMgPSBiLmZyYW1lQ291bnQ7CiAKLSAgICAgICAgc3dpdGNoICh0Lm1NaXhlckZvcm1hdCkgeworICAgICAgICBzd2l0Y2ggKHQtPm1NaXhlckZvcm1hdCkgewogICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CiAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgdWludDMyX3QgcmwgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCAqPihpbik7CkBAIC0xNjY4LDEwICsxNDk0LDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtaXhlciBmb3JtYXQ6ICVkIiwgdC5tTWl4ZXJGb3JtYXQpOworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1peGVyIGZvcm1hdDogJWQiLCB0LT5tTWl4ZXJGb3JtYXQpOwogICAgICAgICB9CiAgICAgICAgIG51bUZyYW1lcyAtPSBiLmZyYW1lQ291bnQ7Ci0gICAgICAgIHQuYnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJmIpOworICAgICAgICB0LT5idWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmYik7CiAgICAgfQogfQogCkBAIC0xNjk0LDcgKzE1MjAsNyBAQAogLyogTUlYVFlQRSAgICAgKHNlZSBBdWRpb01peGVyT3BzLmggTUlYVFlQRV8qIGVudW1lcmF0aW9uKQogICogVE86IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAogICogVEk6IGludDMyX3QgKFE0LjI3KSBvciBpbnQxNl90IChRMC4xNSkgb3IgZmxvYXQKLSAqIFRBOiBpbnQzMl90IChRNC4yNykKKyAqIFRBOiBpbnQzMl90IChRNC4yNykgb3IgZmxvYXQKICAqLwogdGVtcGxhdGUgPGludCBNSVhUWVBFLAogICAgICAgICB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRWLCB0eXBlbmFtZSBUQSwgdHlwZW5hbWUgVEFWPgpAQCAtMTczOCw3ICsxNTY0LDcgQEAKIC8qIE1JWFRZUEUgICAgIChzZWUgQXVkaW9NaXhlck9wcy5oIE1JWFRZUEVfKiBlbnVtZXJhdGlvbikKICAqIFRPOiBpbnQzMl90IChRNC4yNykgb3IgZmxvYXQKICAqIFRJOiBpbnQzMl90IChRNC4yNykgb3IgaW50MTZfdCAoUTAuMTUpIG9yIGZsb2F0Ci0gKiBUQTogaW50MzJfdCAoUTQuMjcpCisgKiBUQTogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CiAgKi8KIHRlbXBsYXRlIDxpbnQgTUlYVFlQRSwKICAgICAgICAgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUViwgdHlwZW5hbWUgVEEsIHR5cGVuYW1lIFRBVj4KQEAgLTE3NzgsMzQgKzE2MDQsNDYgQEAKICAqIEFESlVTVFZPTCAgIChzZXQgdG8gdHJ1ZSBpZiB2b2x1bWUgcmFtcCBwYXJhbWV0ZXJzIG5lZWRzIGFkanVzdG1lbnQgYWZ0ZXJ3YXJkcykKICAqIFRPOiBpbnQzMl90IChRNC4yNykgb3IgZmxvYXQKICAqIFRJOiBpbnQzMl90IChRNC4yNykgb3IgaW50MTZfdCAoUTAuMTUpIG9yIGZsb2F0Ci0gKiBUQTogaW50MzJfdCAoUTQuMjcpCisgKiBUQTogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CiAgKi8KIHRlbXBsYXRlIDxpbnQgTUlYVFlQRSwgYm9vbCBVU0VGTE9BVFZPTCwgYm9vbCBBREpVU1RWT0wsCiAgICAgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUQT4KLXZvaWQgQXVkaW9NaXhlcjo6dm9sdW1lTWl4KFRPICpvdXQsIHNpemVfdCBvdXRGcmFtZXMsCi0gICAgICAgIGNvbnN0IFRJICppbiwgVEEgKmF1eCwgYm9vbCByYW1wLCBBdWRpb01peGVyOjp0cmFja190ICp0KQordm9pZCBBdWRpb01peGVyOjpUcmFjazo6dm9sdW1lTWl4KFRPICpvdXQsIHNpemVfdCBvdXRGcmFtZXMsCisgICAgICAgIGNvbnN0IFRJICppbiwgVEEgKmF1eCwgYm9vbCByYW1wKQogewogICAgIGlmIChVU0VGTE9BVFZPTCkgewogICAgICAgICBpZiAocmFtcCkgewotICAgICAgICAgICAgdm9sdW1lUmFtcE11bHRpPE1JWFRZUEU+KHQtPm1NaXhlckNoYW5uZWxDb3VudCwgb3V0LCBvdXRGcmFtZXMsIGluLCBhdXgsCi0gICAgICAgICAgICAgICAgICAgIHQtPm1QcmV2Vm9sdW1lLCB0LT5tVm9sdW1lSW5jLCAmdC0+cHJldkF1eExldmVsLCB0LT5hdXhJbmMpOworICAgICAgICAgICAgdm9sdW1lUmFtcE11bHRpPE1JWFRZUEU+KG1NaXhlckNoYW5uZWxDb3VudCwgb3V0LCBvdXRGcmFtZXMsIGluLCBhdXgsCisgICAgICAgICAgICAgICAgICAgIG1QcmV2Vm9sdW1lLCBtVm9sdW1lSW5jLAorI2lmZGVmIEZMT0FUX0FVWAorICAgICAgICAgICAgICAgICAgICAmbVByZXZBdXhMZXZlbCwgbUF1eEluYworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgJnByZXZBdXhMZXZlbCwgYXV4SW5jCisjZW5kaWYKKyAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgaWYgKEFESlVTVFZPTCkgewotICAgICAgICAgICAgICAgIHQtPmFkanVzdFZvbHVtZVJhbXAoYXV4ICE9IE5VTEwsIHRydWUpOworICAgICAgICAgICAgICAgIGFkanVzdFZvbHVtZVJhbXAoYXV4ICE9IE5VTEwsIHRydWUpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRT4odC0+bU1peGVyQ2hhbm5lbENvdW50LCBvdXQsIG91dEZyYW1lcywgaW4sIGF1eCwKLSAgICAgICAgICAgICAgICAgICAgdC0+bVZvbHVtZSwgdC0+YXV4TGV2ZWwpOworICAgICAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRT4obU1peGVyQ2hhbm5lbENvdW50LCBvdXQsIG91dEZyYW1lcywgaW4sIGF1eCwKKyAgICAgICAgICAgICAgICAgICAgbVZvbHVtZSwKKyNpZmRlZiBGTE9BVF9BVVgKKyAgICAgICAgICAgICAgICAgICAgbUF1eExldmVsCisjZWxzZQorICAgICAgICAgICAgICAgICAgICBhdXhMZXZlbAorI2VuZGlmCisgICAgICAgICAgICApOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKHJhbXApIHsKLSAgICAgICAgICAgIHZvbHVtZVJhbXBNdWx0aTxNSVhUWVBFPih0LT5tTWl4ZXJDaGFubmVsQ291bnQsIG91dCwgb3V0RnJhbWVzLCBpbiwgYXV4LAotICAgICAgICAgICAgICAgICAgICB0LT5wcmV2Vm9sdW1lLCB0LT52b2x1bWVJbmMsICZ0LT5wcmV2QXV4TGV2ZWwsIHQtPmF1eEluYyk7CisgICAgICAgICAgICB2b2x1bWVSYW1wTXVsdGk8TUlYVFlQRT4obU1peGVyQ2hhbm5lbENvdW50LCBvdXQsIG91dEZyYW1lcywgaW4sIGF1eCwKKyAgICAgICAgICAgICAgICAgICAgcHJldlZvbHVtZSwgdm9sdW1lSW5jLCAmcHJldkF1eExldmVsLCBhdXhJbmMpOwogICAgICAgICAgICAgaWYgKEFESlVTVFZPTCkgewotICAgICAgICAgICAgICAgIHQtPmFkanVzdFZvbHVtZVJhbXAoYXV4ICE9IE5VTEwpOworICAgICAgICAgICAgICAgIGFkanVzdFZvbHVtZVJhbXAoYXV4ICE9IE5VTEwpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRT4odC0+bU1peGVyQ2hhbm5lbENvdW50LCBvdXQsIG91dEZyYW1lcywgaW4sIGF1eCwKLSAgICAgICAgICAgICAgICAgICAgdC0+dm9sdW1lLCB0LT5hdXhMZXZlbCk7CisgICAgICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFPihtTWl4ZXJDaGFubmVsQ291bnQsIG91dCwgb3V0RnJhbWVzLCBpbiwgYXV4LAorICAgICAgICAgICAgICAgICAgICB2b2x1bWUsIGF1eExldmVsKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTE4MjAsMTkgKzE2NTgsMTggQEAKICAqIFRBOiBpbnQzMl90IChRNC4yNykKICAqLwogdGVtcGxhdGUgPGludCBNSVhUWVBFLCB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRBPgotdm9pZCBBdWRpb01peGVyOjpwcm9jZXNzX05vUmVzYW1wbGVPbmVUcmFjayhzdGF0ZV90KiBzdGF0ZSkKK3ZvaWQgQXVkaW9NaXhlcjo6cHJvY2Vzc19fbm9SZXNhbXBsZU9uZVRyYWNrKCkKIHsKLSAgICBBTE9HVlYoInByb2Nlc3NfTm9SZXNhbXBsZU9uZVRyYWNrXG4iKTsKLSAgICAvLyBDTFogaXMgZmFzdGVyIHRoYW4gQ1RaIG9uIEFSTSwgdGhvdWdoIHJlYWxseSBub3Qgc3VyZSBpZiB0cnVlIGFmdGVyIDMxIC0gY2x6LgotICAgIGNvbnN0IGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KHN0YXRlLT5lbmFibGVkVHJhY2tzKTsKLSAgICBBTE9HX0FTU0VSVCgoMSA8PCBpKSA9PSBzdGF0ZS0+ZW5hYmxlZFRyYWNrcywgIm1vcmUgdGhhbiAxIHRyYWNrIGVuYWJsZWQiKTsKLSAgICB0cmFja190ICp0ID0gJnN0YXRlLT50cmFja3NbaV07CisgICAgQUxPR1ZWKCJwcm9jZXNzX19ub1Jlc2FtcGxlT25lVHJhY2tcbiIpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUVuYWJsZWQuc2l6ZSgpICE9IDEsCisgICAgICAgICAgICAiJXp1ICE9IDEgdHJhY2tzIGVuYWJsZWQiLCBtRW5hYmxlZC5zaXplKCkpOworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFjaz4gJnQgPSBtVHJhY2tzW21FbmFibGVkWzBdXTsKICAgICBjb25zdCB1aW50MzJfdCBjaGFubmVscyA9IHQtPm1NaXhlckNoYW5uZWxDb3VudDsKICAgICBUTyogb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxUTyo+KHQtPm1haW5CdWZmZXIpOwogICAgIFRBKiBhdXggPSByZWludGVycHJldF9jYXN0PFRBKj4odC0+YXV4QnVmZmVyKTsKICAgICBjb25zdCBib29sIHJhbXAgPSB0LT5uZWVkc1JhbXAoKTsKIAotICAgIGZvciAoc2l6ZV90IG51bUZyYW1lcyA9IHN0YXRlLT5mcmFtZUNvdW50OyBudW1GcmFtZXM7ICkgeworICAgIGZvciAoc2l6ZV90IG51bUZyYW1lcyA9IG1GcmFtZUNvdW50OyBudW1GcmFtZXMgPiAwOyApIHsKICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyJiBiKHQtPmJ1ZmZlcik7CiAgICAgICAgIC8vIGdldCBpbnB1dCBidWZmZXIKICAgICAgICAgYi5mcmFtZUNvdW50ID0gbnVtRnJhbWVzOwpAQCAtMTg0NCwxOSArMTY4MSwxOSBAQAogICAgICAgICBpZiAoaW4gPT0gTlVMTCB8fCAoKCh1aW50cHRyX3QpaW4pICYgMykpIHsKICAgICAgICAgICAgIG1lbXNldChvdXQsIDAsIG51bUZyYW1lcwogICAgICAgICAgICAgICAgICAgICAqIGNoYW5uZWxzICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZSh0LT5tTWl4ZXJGb3JtYXQpKTsKLSAgICAgICAgICAgIEFMT0dFX0lGKCgoKHVpbnRwdHJfdClpbikgJiAzKSwgInByb2Nlc3NfTm9SZXNhbXBsZU9uZVRyYWNrOiBidXMgZXJyb3I6ICIKKyAgICAgICAgICAgIEFMT0dFX0lGKCgoKHVpbnRwdHJfdClpbikgJiAzKSwgInByb2Nlc3NfX25vUmVzYW1wbGVPbmVUcmFjazogYnVzIGVycm9yOiAiCiAgICAgICAgICAgICAgICAgICAgICJidWZmZXIgJXAgdHJhY2sgJXAsIGNoYW5uZWxzICVkLCBuZWVkcyAlI3giLAotICAgICAgICAgICAgICAgICAgICBpbiwgdCwgdC0+Y2hhbm5lbENvdW50LCB0LT5uZWVkcyk7CisgICAgICAgICAgICAgICAgICAgIGluLCAmdCwgdC0+Y2hhbm5lbENvdW50LCB0LT5uZWVkcyk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAogICAgICAgICBjb25zdCBzaXplX3Qgb3V0RnJhbWVzID0gYi5mcmFtZUNvdW50OwotICAgICAgICB2b2x1bWVNaXg8TUlYVFlQRSwgaXNfc2FtZTxUSSwgZmxvYXQ+Ojp2YWx1ZSwgZmFsc2U+ICgKLSAgICAgICAgICAgICAgICBvdXQsIG91dEZyYW1lcywgaW4sIGF1eCwgcmFtcCwgdCk7CisgICAgICAgIHQtPnZvbHVtZU1peDxNSVhUWVBFLCBpc19zYW1lPFRJLCBmbG9hdD46OnZhbHVlIC8qIFVTRUZMT0FUVk9MICovLCBmYWxzZSAvKiBBREpVU1RWT0wgKi8+ICgKKyAgICAgICAgICAgICAgICBvdXQsIG91dEZyYW1lcywgaW4sIGF1eCwgcmFtcCk7CiAKICAgICAgICAgb3V0ICs9IG91dEZyYW1lcyAqIGNoYW5uZWxzOwogICAgICAgICBpZiAoYXV4ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGF1eCArPSBjaGFubmVsczsKKyAgICAgICAgICAgIGF1eCArPSBvdXRGcmFtZXM7CiAgICAgICAgIH0KICAgICAgICAgbnVtRnJhbWVzIC09IGIuZnJhbWVDb3VudDsKIApAQCAtMTg3NCw1OSArMTcxMSw1OSBAQAogICogTUlYVFlQRSAgICAgKHNlZSBBdWRpb01peGVyT3BzLmggTUlYVFlQRV8qIGVudW1lcmF0aW9uKQogICogVE86IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAogICogVEk6IGludDMyX3QgKFE0LjI3KSBvciBpbnQxNl90IChRMC4xNSkgb3IgZmxvYXQKLSAqIFRBOiBpbnQzMl90IChRNC4yNykKKyAqIFRBOiBpbnQzMl90IChRNC4yNykgb3IgZmxvYXQKICAqLwogdGVtcGxhdGUgPGludCBNSVhUWVBFLCB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRBPgotdm9pZCBBdWRpb01peGVyOjp0cmFja19fUmVzYW1wbGUodHJhY2tfdCogdCwgVE8qIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsIFRPKiB0ZW1wLCBUQSogYXV4KQordm9pZCBBdWRpb01peGVyOjpUcmFjazo6dHJhY2tfX1Jlc2FtcGxlKFRPKiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LCBUTyogdGVtcCwgVEEqIGF1eCkKIHsKICAgICBBTE9HVlYoInRyYWNrX19SZXNhbXBsZVxuIik7Ci0gICAgdC0+cmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKHQtPnNhbXBsZVJhdGUpOwotICAgIGNvbnN0IGJvb2wgcmFtcCA9IHQtPm5lZWRzUmFtcCgpOworICAgIG1SZXNhbXBsZXItPnNldFNhbXBsZVJhdGUoc2FtcGxlUmF0ZSk7CisgICAgY29uc3QgYm9vbCByYW1wID0gbmVlZHNSYW1wKCk7CiAgICAgaWYgKHJhbXAgfHwgYXV4ICE9IE5VTEwpIHsKICAgICAgICAgLy8gaWYgcmFtcDogICAgICAgIHJlc2FtcGxlIHdpdGggdW5pdHkgZ2FpbiB0byB0ZW1wIGJ1ZmZlciBhbmQgc2NhbGUvbWl4IGluIDJuZCBzdGVwLgogICAgICAgICAvLyBpZiBhdXggIT0gTlVMTDogcmVzYW1wbGUgd2l0aCB1bml0eSBnYWluIHRvIHRlbXAgYnVmZmVyIHRoZW4gYXBwbHkgc2VuZCBsZXZlbC4KIAotICAgICAgICB0LT5yZXNhbXBsZXItPnNldFZvbHVtZShVTklUWV9HQUlOX0ZMT0FULCBVTklUWV9HQUlOX0ZMT0FUKTsKLSAgICAgICAgbWVtc2V0KHRlbXAsIDAsIG91dEZyYW1lQ291bnQgKiB0LT5tTWl4ZXJDaGFubmVsQ291bnQgKiBzaXplb2YoVE8pKTsKLSAgICAgICAgdC0+cmVzYW1wbGVyLT5yZXNhbXBsZSgoaW50MzJfdCopdGVtcCwgb3V0RnJhbWVDb3VudCwgdC0+YnVmZmVyUHJvdmlkZXIpOworICAgICAgICBtUmVzYW1wbGVyLT5zZXRWb2x1bWUoVU5JVFlfR0FJTl9GTE9BVCwgVU5JVFlfR0FJTl9GTE9BVCk7CisgICAgICAgIG1lbXNldCh0ZW1wLCAwLCBvdXRGcmFtZUNvdW50ICogbU1peGVyQ2hhbm5lbENvdW50ICogc2l6ZW9mKFRPKSk7CisgICAgICAgIG1SZXNhbXBsZXItPnJlc2FtcGxlKChpbnQzMl90Kil0ZW1wLCBvdXRGcmFtZUNvdW50LCBidWZmZXJQcm92aWRlcik7CiAKLSAgICAgICAgdm9sdW1lTWl4PE1JWFRZUEUsIGlzX3NhbWU8VEksIGZsb2F0Pjo6dmFsdWUsIHRydWU+KAotICAgICAgICAgICAgICAgIG91dCwgb3V0RnJhbWVDb3VudCwgdGVtcCwgYXV4LCByYW1wLCB0KTsKKyAgICAgICAgdm9sdW1lTWl4PE1JWFRZUEUsIGlzX3NhbWU8VEksIGZsb2F0Pjo6dmFsdWUgLyogVVNFRkxPQVRWT0wgKi8sIHRydWUgLyogQURKVVNUVk9MICovPigKKyAgICAgICAgICAgICAgICBvdXQsIG91dEZyYW1lQ291bnQsIHRlbXAsIGF1eCwgcmFtcCk7CiAKICAgICB9IGVsc2UgeyAvLyBjb25zdGFudCB2b2x1bWUgZ2FpbgotICAgICAgICB0LT5yZXNhbXBsZXItPnNldFZvbHVtZSh0LT5tVm9sdW1lWzBdLCB0LT5tVm9sdW1lWzFdKTsKLSAgICAgICAgdC0+cmVzYW1wbGVyLT5yZXNhbXBsZSgoaW50MzJfdCopb3V0LCBvdXRGcmFtZUNvdW50LCB0LT5idWZmZXJQcm92aWRlcik7CisgICAgICAgIG1SZXNhbXBsZXItPnNldFZvbHVtZShtVm9sdW1lWzBdLCBtVm9sdW1lWzFdKTsKKyAgICAgICAgbVJlc2FtcGxlci0+cmVzYW1wbGUoKGludDMyX3QqKW91dCwgb3V0RnJhbWVDb3VudCwgYnVmZmVyUHJvdmlkZXIpOwogICAgIH0KIH0KIAogLyogVGhpcyB0cmFjayBob29rIGlzIGNhbGxlZCB0byBtaXggYSB0cmFjaywgd2hlbiBubyByZXNhbXBsaW5nIGlzIHJlcXVpcmVkLgotICogVGhlIGlucHV0IGJ1ZmZlciBzaG91bGQgYmUgcHJlc2VudCBpbiB0LT5pbi4KKyAqIFRoZSBpbnB1dCBidWZmZXIgc2hvdWxkIGJlIHByZXNlbnQgaW4gaW4uCiAgKgogICogTUlYVFlQRSAgICAgKHNlZSBBdWRpb01peGVyT3BzLmggTUlYVFlQRV8qIGVudW1lcmF0aW9uKQogICogVE86IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAogICogVEk6IGludDMyX3QgKFE0LjI3KSBvciBpbnQxNl90IChRMC4xNSkgb3IgZmxvYXQKLSAqIFRBOiBpbnQzMl90IChRNC4yNykKKyAqIFRBOiBpbnQzMl90IChRNC4yNykgb3IgZmxvYXQKICAqLwogdGVtcGxhdGUgPGludCBNSVhUWVBFLCB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRBPgotdm9pZCBBdWRpb01peGVyOjp0cmFja19fTm9SZXNhbXBsZSh0cmFja190KiB0LCBUTyogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwKLSAgICAgICAgVE8qIHRlbXAgX191bnVzZWQsIFRBKiBhdXgpCit2b2lkIEF1ZGlvTWl4ZXI6OlRyYWNrOjp0cmFja19fTm9SZXNhbXBsZShUTyogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwgVE8qIHRlbXAgX191bnVzZWQsIFRBKiBhdXgpCiB7CiAgICAgQUxPR1ZWKCJ0cmFja19fTm9SZXNhbXBsZVxuIik7Ci0gICAgY29uc3QgVEkgKmluID0gc3RhdGljX2Nhc3Q8Y29uc3QgVEkgKj4odC0+aW4pOworICAgIGNvbnN0IFRJICppbiA9IHN0YXRpY19jYXN0PGNvbnN0IFRJICo+KG1Jbik7CiAKLSAgICB2b2x1bWVNaXg8TUlYVFlQRSwgaXNfc2FtZTxUSSwgZmxvYXQ+Ojp2YWx1ZSwgdHJ1ZT4oCi0gICAgICAgICAgICBvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHQtPm5lZWRzUmFtcCgpLCB0KTsKKyAgICB2b2x1bWVNaXg8TUlYVFlQRSwgaXNfc2FtZTxUSSwgZmxvYXQ+Ojp2YWx1ZSAvKiBVU0VGTE9BVFZPTCAqLywgdHJ1ZSAvKiBBREpVU1RWT0wgKi8+KAorICAgICAgICAgICAgb3V0LCBmcmFtZUNvdW50LCBpbiwgYXV4LCBuZWVkc1JhbXAoKSk7CiAKICAgICAvLyBNSVhUWVBFX01PTk9FWFBBTkQgcmVhZHMgYSBzaW5nbGUgaW5wdXQgY2hhbm5lbCBhbmQgZXhwYW5kcyB0byBOQ0hBTiBvdXRwdXQgY2hhbm5lbHMuCiAgICAgLy8gTUlYVFlQRV9NVUxUSSByZWFkcyBOQ0hBTiBpbnB1dCBjaGFubmVscyBhbmQgcGxhY2VzIHRvIE5DSEFOIG91dHB1dCBjaGFubmVscy4KLSAgICBpbiArPSAoTUlYVFlQRSA9PSBNSVhUWVBFX01PTk9FWFBBTkQpID8gZnJhbWVDb3VudCA6IGZyYW1lQ291bnQgKiB0LT5tTWl4ZXJDaGFubmVsQ291bnQ7Ci0gICAgdC0+aW4gPSBpbjsKKyAgICBpbiArPSAoTUlYVFlQRSA9PSBNSVhUWVBFX01PTk9FWFBBTkQpID8gZnJhbWVDb3VudCA6IGZyYW1lQ291bnQgKiBtTWl4ZXJDaGFubmVsQ291bnQ7CisgICAgbUluID0gaW47CiB9CiAKIC8qIFRoZSBNaXhlciBlbmdpbmUgZ2VuZXJhdGVzIGVpdGhlciBpbnQzMl90IChRNF8yNykgb3IgZmxvYXQgZGF0YS4KICAqIFdlIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGNvbnZlcnQgdGhlIGVuZ2luZSBidWZmZXJzCiAgKiB0byB0aGUgZGVzaXJlZCBtaXhlciBvdXRwdXQgZm9ybWF0LCBlaXRoZXIgaW50MTZfdCAoUS4xNSkgb3IgZmxvYXQuCiAgKi8KKy8qIHN0YXRpYyAqLwogdm9pZCBBdWRpb01peGVyOjpjb252ZXJ0TWl4ZXJGb3JtYXQodm9pZCAqb3V0LCBhdWRpb19mb3JtYXRfdCBtaXhlck91dEZvcm1hdCwKICAgICAgICAgdm9pZCAqaW4sIGF1ZGlvX2Zvcm1hdF90IG1peGVySW5Gb3JtYXQsIHNpemVfdCBzYW1wbGVDb3VudCkKIHsKQEAgLTE5NDcsMTEgKzE3ODQsMTAgQEAKICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgogICAgICAgICBzd2l0Y2ggKG1peGVyT3V0Rm9ybWF0KSB7CiAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKLSAgICAgICAgICAgIG1lbWNweV90b19mbG9hdF9mcm9tX3E0XzI3KChmbG9hdCopb3V0LCAoaW50MzJfdCopaW4sIHNhbXBsZUNvdW50KTsKKyAgICAgICAgICAgIG1lbWNweV90b19mbG9hdF9mcm9tX3E0XzI3KChmbG9hdCopb3V0LCAoY29uc3QgaW50MzJfdCopaW4sIHNhbXBsZUNvdW50KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgotICAgICAgICAgICAgLy8gdHdvIGludDE2X3QgYXJlIHByb2R1Y2VkIHBlciBpdGVyYXRpb24KLSAgICAgICAgICAgIGRpdGhlckFuZENsYW1wKChpbnQzMl90KilvdXQsIChpbnQzMl90Kilpbiwgc2FtcGxlQ291bnQgPj4gMSk7CisgICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fcTRfMjcoKGludDE2X3QqKW91dCwgKGNvbnN0IGludDMyX3QqKWluLCBzYW1wbGVDb3VudCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtaXhlck91dEZvcm1hdDogJSN4IiwgbWl4ZXJPdXRGb3JtYXQpOwpAQCAtMTk2NiwxOSArMTgwMiwyMCBAQAogCiAvKiBSZXR1cm5zIHRoZSBwcm9wZXIgdHJhY2sgaG9vayB0byB1c2UgZm9yIG1peGluZyB0aGUgdHJhY2sgaW50byB0aGUgb3V0cHV0IGJ1ZmZlci4KICAqLwotQXVkaW9NaXhlcjo6aG9va190IEF1ZGlvTWl4ZXI6OmdldFRyYWNrSG9vayhpbnQgdHJhY2tUeXBlLCB1aW50MzJfdCBjaGFubmVsQ291bnQsCisvKiBzdGF0aWMgKi8KK0F1ZGlvTWl4ZXI6Omhvb2tfdCBBdWRpb01peGVyOjpUcmFjazo6Z2V0VHJhY2tIb29rKGludCB0cmFja1R5cGUsIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgbWl4ZXJJbkZvcm1hdCwgYXVkaW9fZm9ybWF0X3QgbWl4ZXJPdXRGb3JtYXQgX191bnVzZWQpCiB7CiAgICAgaWYgKCFrVXNlTmV3TWl4ZXIgJiYgY2hhbm5lbENvdW50ID09IEZDQ18yICYmIG1peGVySW5Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKICAgICAgICAgc3dpdGNoICh0cmFja1R5cGUpIHsKICAgICAgICAgY2FzZSBUUkFDS1RZUEVfTk9QOgotICAgICAgICAgICAgcmV0dXJuIHRyYWNrX19ub3A7CisgICAgICAgICAgICByZXR1cm4gJlRyYWNrOjp0cmFja19fbm9wOwogICAgICAgICBjYXNlIFRSQUNLVFlQRV9SRVNBTVBMRToKLSAgICAgICAgICAgIHJldHVybiB0cmFja19fZ2VuZXJpY1Jlc2FtcGxlOworICAgICAgICAgICAgcmV0dXJuICZUcmFjazo6dHJhY2tfX2dlbmVyaWNSZXNhbXBsZTsKICAgICAgICAgY2FzZSBUUkFDS1RZUEVfTk9SRVNBTVBMRU1PTk86Ci0gICAgICAgICAgICByZXR1cm4gdHJhY2tfXzE2Qml0c01vbm87CisgICAgICAgICAgICByZXR1cm4gJlRyYWNrOjp0cmFja19fMTZCaXRzTW9ubzsKICAgICAgICAgY2FzZSBUUkFDS1RZUEVfTk9SRVNBTVBMRToKLSAgICAgICAgICAgIHJldHVybiB0cmFja19fMTZCaXRzU3RlcmVvOworICAgICAgICAgICAgcmV0dXJuICZUcmFjazo6dHJhY2tfXzE2Qml0c1N0ZXJlbzsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCB0cmFja1R5cGU6ICVkIiwgdHJhY2tUeXBlKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTk4NywxNSArMTgyNCwxNSBAQAogICAgIExPR19BTFdBWVNfRkFUQUxfSUYoY2hhbm5lbENvdW50ID4gTUFYX05VTV9DSEFOTkVMUyk7CiAgICAgc3dpdGNoICh0cmFja1R5cGUpIHsKICAgICBjYXNlIFRSQUNLVFlQRV9OT1A6Ci0gICAgICAgIHJldHVybiB0cmFja19fbm9wOworICAgICAgICByZXR1cm4gJlRyYWNrOjp0cmFja19fbm9wOwogICAgIGNhc2UgVFJBQ0tUWVBFX1JFU0FNUExFOgogICAgICAgICBzd2l0Y2ggKG1peGVySW5Gb3JtYXQpIHsKICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgotICAgICAgICAgICAgcmV0dXJuIChBdWRpb01peGVyOjpob29rX3QpCi0gICAgICAgICAgICAgICAgICAgIHRyYWNrX19SZXNhbXBsZTxNSVhUWVBFX01VTFRJLCBmbG9hdCAvKlRPKi8sIGZsb2F0IC8qVEkqLywgaW50MzJfdCAvKlRBKi8+OworICAgICAgICAgICAgcmV0dXJuIChBdWRpb01peGVyOjpob29rX3QpICZUcmFjazo6dHJhY2tfX1Jlc2FtcGxlPAorICAgICAgICAgICAgICAgICAgICBNSVhUWVBFX01VTFRJLCBmbG9hdCAvKlRPKi8sIGZsb2F0IC8qVEkqLywgVFlQRV9BVVg+OwogICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgotICAgICAgICAgICAgcmV0dXJuIChBdWRpb01peGVyOjpob29rX3QpXAotICAgICAgICAgICAgICAgICAgICB0cmFja19fUmVzYW1wbGU8TUlYVFlQRV9NVUxUSSwgaW50MzJfdCwgaW50MTZfdCwgaW50MzJfdD47CisgICAgICAgICAgICByZXR1cm4gKEF1ZGlvTWl4ZXI6Omhvb2tfdCkgJlRyYWNrOjp0cmFja19fUmVzYW1wbGU8CisgICAgICAgICAgICAgICAgICAgIE1JWFRZUEVfTVVMVEksIGludDMyX3QgLypUTyovLCBpbnQxNl90IC8qVEkqLywgVFlQRV9BVVg+OwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1peGVySW5Gb3JtYXQ6ICUjeCIsIG1peGVySW5Gb3JtYXQpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0yMDA0LDExICsxODQxLDExIEBACiAgICAgY2FzZSBUUkFDS1RZUEVfTk9SRVNBTVBMRU1PTk86CiAgICAgICAgIHN3aXRjaCAobWl4ZXJJbkZvcm1hdCkgewogICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6Ci0gICAgICAgICAgICByZXR1cm4gKEF1ZGlvTWl4ZXI6Omhvb2tfdCkKLSAgICAgICAgICAgICAgICAgICAgdHJhY2tfX05vUmVzYW1wbGU8TUlYVFlQRV9NT05PRVhQQU5ELCBmbG9hdCwgZmxvYXQsIGludDMyX3Q+OworICAgICAgICAgICAgcmV0dXJuIChBdWRpb01peGVyOjpob29rX3QpICZUcmFjazo6dHJhY2tfX05vUmVzYW1wbGU8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlYVFlQRV9NT05PRVhQQU5ELCBmbG9hdCAvKlRPKi8sIGZsb2F0IC8qVEkqLywgVFlQRV9BVVg+OwogICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgotICAgICAgICAgICAgcmV0dXJuIChBdWRpb01peGVyOjpob29rX3QpCi0gICAgICAgICAgICAgICAgICAgIHRyYWNrX19Ob1Jlc2FtcGxlPE1JWFRZUEVfTU9OT0VYUEFORCwgaW50MzJfdCwgaW50MTZfdCwgaW50MzJfdD47CisgICAgICAgICAgICByZXR1cm4gKEF1ZGlvTWl4ZXI6Omhvb2tfdCkgJlRyYWNrOjp0cmFja19fTm9SZXNhbXBsZTwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSVhUWVBFX01PTk9FWFBBTkQsIGludDMyX3QgLypUTyovLCBpbnQxNl90IC8qVEkqLywgVFlQRV9BVVg+OwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1peGVySW5Gb3JtYXQ6ICUjeCIsIG1peGVySW5Gb3JtYXQpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0yMDE3LDExICsxODU0LDExIEBACiAgICAgY2FzZSBUUkFDS1RZUEVfTk9SRVNBTVBMRToKICAgICAgICAgc3dpdGNoIChtaXhlckluRm9ybWF0KSB7CiAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKLSAgICAgICAgICAgIHJldHVybiAoQXVkaW9NaXhlcjo6aG9va190KQotICAgICAgICAgICAgICAgICAgICB0cmFja19fTm9SZXNhbXBsZTxNSVhUWVBFX01VTFRJLCBmbG9hdCwgZmxvYXQsIGludDMyX3Q+OworICAgICAgICAgICAgcmV0dXJuIChBdWRpb01peGVyOjpob29rX3QpICZUcmFjazo6dHJhY2tfX05vUmVzYW1wbGU8CisgICAgICAgICAgICAgICAgICAgIE1JWFRZUEVfTVVMVEksIGZsb2F0IC8qVE8qLywgZmxvYXQgLypUSSovLCBUWVBFX0FVWD47CiAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6Ci0gICAgICAgICAgICByZXR1cm4gKEF1ZGlvTWl4ZXI6Omhvb2tfdCkKLSAgICAgICAgICAgICAgICAgICAgdHJhY2tfX05vUmVzYW1wbGU8TUlYVFlQRV9NVUxUSSwgaW50MzJfdCwgaW50MTZfdCwgaW50MzJfdD47CisgICAgICAgICAgICByZXR1cm4gKEF1ZGlvTWl4ZXI6Omhvb2tfdCkgJlRyYWNrOjp0cmFja19fTm9SZXNhbXBsZTwKKyAgICAgICAgICAgICAgICAgICAgTUlYVFlQRV9NVUxUSSwgaW50MzJfdCAvKlRPKi8sIGludDE2X3QgLypUSSovLCBUWVBFX0FVWD47CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbWl4ZXJJbkZvcm1hdDogJSN4IiwgbWl4ZXJJbkZvcm1hdCk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTIwNDEsNyArMTg3OCw5IEBACiAgKiBhIHN0ZXJlbyBvdXRwdXQgdHJhY2ssIHRoZSBpbnB1dCB0cmFjayBjYW5ub3QgYmUgTU9OTy4gIFRoaXMgc2hvdWxkIGJlCiAgKiBwcmV2ZW50ZWQgYnkgdGhlIGNhbGxlci4KICAqLwotQXVkaW9NaXhlcjo6cHJvY2Vzc19ob29rX3QgQXVkaW9NaXhlcjo6Z2V0UHJvY2Vzc0hvb2soaW50IHByb2Nlc3NUeXBlLCB1aW50MzJfdCBjaGFubmVsQ291bnQsCisvKiBzdGF0aWMgKi8KK0F1ZGlvTWl4ZXI6OnByb2Nlc3NfaG9va190IEF1ZGlvTWl4ZXI6OmdldFByb2Nlc3NIb29rKAorICAgICAgICBpbnQgcHJvY2Vzc1R5cGUsIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgbWl4ZXJJbkZvcm1hdCwgYXVkaW9fZm9ybWF0X3QgbWl4ZXJPdXRGb3JtYXQpCiB7CiAgICAgaWYgKHByb2Nlc3NUeXBlICE9IFBST0NFU1NUWVBFX05PUkVTQU1QTEVPTkVUUkFDSykgeyAvLyBPbmx5IE5PUkVTQU1QTEVPTkVUUkFDSwpAQCAtMjA0OSwxOCArMTg4OCwxOCBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgaWYgKCFrVXNlTmV3TWl4ZXIgJiYgY2hhbm5lbENvdW50ID09IEZDQ18yICYmIG1peGVySW5Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NfX09uZVRyYWNrMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nOworICAgICAgICByZXR1cm4gJkF1ZGlvTWl4ZXI6OnByb2Nlc3NfX29uZVRyYWNrMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nOwogICAgIH0KICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGNoYW5uZWxDb3VudCA+IE1BWF9OVU1fQ0hBTk5FTFMpOwogICAgIHN3aXRjaCAobWl4ZXJJbkZvcm1hdCkgewogICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKICAgICAgICAgc3dpdGNoIChtaXhlck91dEZvcm1hdCkgewogICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6Ci0gICAgICAgICAgICByZXR1cm4gcHJvY2Vzc19Ob1Jlc2FtcGxlT25lVHJhY2s8TUlYVFlQRV9NVUxUSV9TQVZFT05MWSwKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgLypUTyovLCBmbG9hdCAvKlRJKi8sIGludDMyX3QgLypUQSovPjsKKyAgICAgICAgICAgIHJldHVybiAmQXVkaW9NaXhlcjo6cHJvY2Vzc19fbm9SZXNhbXBsZU9uZVRyYWNrPAorICAgICAgICAgICAgICAgICAgICBNSVhUWVBFX01VTFRJX1NBVkVPTkxZLCBmbG9hdCAvKlRPKi8sIGZsb2F0IC8qVEkqLywgVFlQRV9BVVg+OwogICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgotICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NfTm9SZXNhbXBsZU9uZVRyYWNrPE1JWFRZUEVfTVVMVElfU0FWRU9OTFksCi0gICAgICAgICAgICAgICAgICAgIGludDE2X3QsIGZsb2F0LCBpbnQzMl90PjsKKyAgICAgICAgICAgIHJldHVybiAmQXVkaW9NaXhlcjo6cHJvY2Vzc19fbm9SZXNhbXBsZU9uZVRyYWNrPAorICAgICAgICAgICAgICAgICAgICBNSVhUWVBFX01VTFRJX1NBVkVPTkxZLCBpbnQxNl90IC8qVE8qLywgZmxvYXQgLypUSSovLCBUWVBFX0FVWD47CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbWl4ZXJPdXRGb3JtYXQ6ICUjeCIsIG1peGVyT3V0Rm9ybWF0KTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjA2OSwxMSArMTkwOCwxMSBAQAogICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CiAgICAgICAgIHN3aXRjaCAobWl4ZXJPdXRGb3JtYXQpIHsKICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgotICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NfTm9SZXNhbXBsZU9uZVRyYWNrPE1JWFRZUEVfTVVMVElfU0FWRU9OTFksCi0gICAgICAgICAgICAgICAgICAgIGZsb2F0LCBpbnQxNl90LCBpbnQzMl90PjsKKyAgICAgICAgICAgIHJldHVybiAmQXVkaW9NaXhlcjo6cHJvY2Vzc19fbm9SZXNhbXBsZU9uZVRyYWNrPAorICAgICAgICAgICAgICAgICAgICBNSVhUWVBFX01VTFRJX1NBVkVPTkxZLCBmbG9hdCAvKlRPKi8sIGludDE2X3QgLypUSSovLCBUWVBFX0FVWD47CiAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6Ci0gICAgICAgICAgICByZXR1cm4gcHJvY2Vzc19Ob1Jlc2FtcGxlT25lVHJhY2s8TUlYVFlQRV9NVUxUSV9TQVZFT05MWSwKLSAgICAgICAgICAgICAgICAgICAgaW50MTZfdCwgaW50MTZfdCwgaW50MzJfdD47CisgICAgICAgICAgICByZXR1cm4gJkF1ZGlvTWl4ZXI6OnByb2Nlc3NfX25vUmVzYW1wbGVPbmVUcmFjazwKKyAgICAgICAgICAgICAgICAgICAgTUlYVFlQRV9NVUxUSV9TQVZFT05MWSwgaW50MTZfdCAvKlRPKi8sIGludDE2X3QgLypUSSovLCBUWVBFX0FVWD47CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbWl4ZXJPdXRGb3JtYXQ6ICUjeCIsIG1peGVyT3V0Rm9ybWF0KTsKICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXJPcHMuaCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb01peGVyT3BzLmgKaW5kZXggOGQ3NDAyNC4uZjMzZTM2MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXJPcHMuaAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlck9wcy5oCkBAIC0xODgsMTMgKzE4OCwxMyBAQAogCiB0ZW1wbGF0ZTw+CiBpbmxpbmUgdm9pZCBNaXhBY2N1bTxmbG9hdCwgaW50MTZfdD4oZmxvYXQgKmF1eGFjY3VtLCBpbnQxNl90IHZhbHVlKSB7Ci0gICAgc3RhdGljIGNvbnN0IGZsb2F0IG5vcm0gPSAxLiAvICgxIDw8IDE1KTsKKyAgICBzdGF0aWMgY29uc3RleHByIGZsb2F0IG5vcm0gPSAxLiAvICgxIDw8IDE1KTsKICAgICAqYXV4YWNjdW0gKz0gbm9ybSAqIHZhbHVlOwogfQogCiB0ZW1wbGF0ZTw+CiBpbmxpbmUgdm9pZCBNaXhBY2N1bTxmbG9hdCwgaW50MzJfdD4oZmxvYXQgKmF1eGFjY3VtLCBpbnQzMl90IHZhbHVlKSB7Ci0gICAgc3RhdGljIGNvbnN0IGZsb2F0IG5vcm0gPSAxLiAvICgxIDw8IDI3KTsKKyAgICBzdGF0aWMgY29uc3RleHByIGZsb2F0IG5vcm0gPSAxLiAvICgxIDw8IDI3KTsKICAgICAqYXV4YWNjdW0gKz0gbm9ybSAqIHZhbHVlOwogfQogCkBAIC0yMzgsNiArMjM4LDcgQEAKICAqICAgTkNIQU4gcmVwcmVzZW50cyBudW1iZXIgb2YgaW5wdXQgYW5kIG91dHB1dCBjaGFubmVscy4KICAqICAgVE86IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAogICogICBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAorICogICBUQTogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CiAgKiAgIFRWOiBpbnQzMl90IChVNC4yOCkgb3IgaW50MTZfdCAoVTQuMTIpIG9yIGZsb2F0CiAgKiAgIHZvbDogcmVwcmVzZW50cyBhIHZvbHVtZSBhcnJheS4KICAqCkBAIC0yNDcsNyArMjQ4LDggQEAKICAqICAgU2luZ2xlIGlucHV0IGNoYW5uZWwuIE5DSEFOIHJlcHJlc2VudHMgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscy4KICAqICAgVE86IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAogICogICBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAotICogICBUVjogaW50MzJfdCAoVTQuMjgpIG9yIGludDE2X3QgKFU0LjEyKSBvciBmbG9hdAorICogICBUQTogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CisgKiAgIFRWL1RBVjogaW50MzJfdCAoVTQuMjgpIG9yIGludDE2X3QgKFU0LjEyKSBvciBmbG9hdAogICogICBJbnB1dCBjaGFubmVsIGNvdW50IGlzIDEuCiAgKiAgIHZvbDogcmVwcmVzZW50cyB2b2x1bWUgYXJyYXkuCiAgKgpAQCAtMjU3LDcgKzI1OSw4IEBACiAgKiAgIE5DSEFOIHJlcHJlc2VudHMgbnVtYmVyIG9mIGlucHV0IGFuZCBvdXRwdXQgY2hhbm5lbHMuCiAgKiAgIFRPOiBpbnQxNl90IChRLjE1KSBvciBmbG9hdAogICogICBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAotICogICBUVjogaW50MzJfdCAoVTQuMjgpIG9yIGludDE2X3QgKFU0LjEyKSBvciBmbG9hdAorICogICBUQTogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CisgKiAgIFRWL1RBVjogaW50MzJfdCAoVTQuMjgpIG9yIGludDE2X3QgKFU0LjEyKSBvciBmbG9hdAogICogICB2b2w6IHJlcHJlc2VudHMgYSB2b2x1bWUgYXJyYXkuCiAgKgogICogICBNSVhUWVBFX01VTFRJX1NBVkVPTkxZIGRvZXMgbm90IGFjY3VtdWxhdGUgaW50byB0aGUgb3V0IHBvaW50ZXIuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmNwcAppbmRleCA4ZjdiOTgyLi5lZWVlY2NlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckR5bi5jcHAKQEAgLTM4LDYgKzM4LDkgQEAKIAogLy8jZGVmaW5lIERFQlVHX1JFU0FNUExFUgogCisvLyB1c2UgdGhpcyBmb3Igb3VyIGJ1ZmZlciBhbGlnbm1lbnQuICBTaG91bGQgYmUgYXQgbGVhc3QgMzIgYnl0ZXMuCitjb25zdGV4cHIgc2l6ZV90IENBQ0hFX0xJTkVfU0laRSA9IDY0OworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8qCkBAIC05NCw3ICs5NywxMCBAQAogCiAgICAgLy8gY3JlYXRlIG5ldyBidWZmZXIKICAgICBUSSogc3RhdGUgPSBOVUxMOwotICAgICh2b2lkKXBvc2l4X21lbWFsaWduKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCoqPigmc3RhdGUpLCAzMiwgc3RhdGVDb3VudCpzaXplb2YoKnN0YXRlKSk7CisgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQgKio+KCZzdGF0ZSksCisgICAgICAgICAgICBDQUNIRV9MSU5FX1NJWkUgLyogYWxpZ25tZW50ICovLAorICAgICAgICAgICAgc3RhdGVDb3VudCAqIHNpemVvZigqc3RhdGUpKTsKICAgICBtZW1zZXQoc3RhdGUsIDAsIHN0YXRlQ291bnQqc2l6ZW9mKCpzdGF0ZSkpOwogCiAgICAgLy8gYXR0ZW1wdCB0byBwcmVzZXJ2ZSBzdGF0ZQpAQCAtMTg1LDYgKzE5MSwxNiBAQAogICAgIC8vIHNldFNhbXBsZVJhdGUoKSBmb3IgMToxLiAoTWF5IGJlIHJlbW92ZWQgaWYgcHJlY2FsY3VsYXRlZCBmaWx0ZXJzIGFyZSB1c2VkLikKICAgICBtSW5TYW1wbGVSYXRlID0gMDsKICAgICBtQ29uc3RhbnRzLnNldCgxMjgsIDgsIG1TYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSk7IC8vIFRPRE86IHNldCBiZXR0ZXIKKworICAgIC8vIGZldGNoIHByb3BlcnR5IGJhc2VkIHJlc2FtcGxpbmcgcGFyYW1ldGVycworICAgIG1Qcm9wZXJ0eUVuYWJsZUF0U2FtcGxlUmF0ZSA9IHByb3BlcnR5X2dldF9pbnQzMigKKyAgICAgICAgICAgICJyby5hdWRpby5yZXNhbXBsZXIucHNkLmVuYWJsZV9hdF9zYW1wbGVyYXRlIiwgbVByb3BlcnR5RW5hYmxlQXRTYW1wbGVSYXRlKTsKKyAgICBtUHJvcGVydHlIYWxmRmlsdGVyTGVuZ3RoID0gcHJvcGVydHlfZ2V0X2ludDMyKAorICAgICAgICAgICAgInJvLmF1ZGlvLnJlc2FtcGxlci5wc2QuaGFsZmxlbmd0aCIsIG1Qcm9wZXJ0eUhhbGZGaWx0ZXJMZW5ndGgpOworICAgIG1Qcm9wZXJ0eVN0b3BiYW5kQXR0ZW51YXRpb24gPSBwcm9wZXJ0eV9nZXRfaW50MzIoCisgICAgICAgICAgICAicm8uYXVkaW8ucmVzYW1wbGVyLnBzZC5zdG9wYmFuZCIsIG1Qcm9wZXJ0eVN0b3BiYW5kQXR0ZW51YXRpb24pOworICAgIG1Qcm9wZXJ0eUN1dG9mZlBlcmNlbnQgPSBwcm9wZXJ0eV9nZXRfaW50MzIoCisgICAgICAgICAgICAicm8uYXVkaW8ucmVzYW1wbGVyLnBzZC5jdXRvZmZfcGVyY2VudCIsIG1Qcm9wZXJ0eUN1dG9mZlBlcmNlbnQpOwogfQogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgpAQCAtMjE1LDYgKzIzMSw4IEBACiAgICAgfQogfQogCisvLyBUT0RPOiB1cGRhdGUgdG8gQysrMTEKKwogdGVtcGxhdGU8dHlwZW5hbWUgVD4gVCBtYXgoVCBhLCBUIGIpIHtyZXR1cm4gYSA+IGIgPyBhIDogYjt9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFQgYWJzZGlmZihUIGEsIFQgYikge3JldHVybiBhID4gYiA/IGEgLSBiIDogYiAtIGE7fQpAQCAtMjIzLDM3ICsyNDEsNzQgQEAKIHZvaWQgQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OmNyZWF0ZUthaXNlckZpcihDb25zdGFudHMgJmMsCiAgICAgICAgIGRvdWJsZSBzdG9wQmFuZEF0dGVuLCBpbnQgaW5TYW1wbGVSYXRlLCBpbnQgb3V0U2FtcGxlUmF0ZSwgZG91YmxlIHRid0NoZWF0KQogewotICAgIFRDKiBidWYgPSBOVUxMOwotICAgIHN0YXRpYyBjb25zdCBkb3VibGUgYXR0ZW4gPSAwLjk5OTg7ICAgLy8gdG8gYXZvaWQgcmlwcGxlIG92ZXJmbG93Ci0gICAgZG91YmxlIGZjcjsKLSAgICBkb3VibGUgdGJ3ID0gZmlyS2Fpc2VyVGJ3KGMubUhhbGZOdW1Db2Vmcywgc3RvcEJhbmRBdHRlbik7CisgICAgLy8gY29tcHV0ZSB0aGUgbm9ybWFsaXplZCB0cmFuc2l0aW9uIGJhbmR3aWR0aAorICAgIGNvbnN0IGRvdWJsZSB0YncgPSBmaXJLYWlzZXJUYncoYy5tSGFsZk51bUNvZWZzLCBzdG9wQmFuZEF0dGVuKTsKKyAgICBjb25zdCBkb3VibGUgaGFsZmJ3ID0gdGJ3IC8gMi47CiAKLSAgICAodm9pZClwb3NpeF9tZW1hbGlnbihyZWludGVycHJldF9jYXN0PHZvaWQqKj4oJmJ1ZiksIDMyLCAoYy5tTCsxKSpjLm1IYWxmTnVtQ29lZnMqc2l6ZW9mKFRDKSk7CisgICAgZG91YmxlIGZjcjsgLy8gY29tcHV0ZSBmY3IsIHRoZSAzIGRCIGFtcGxpdHVkZSBjdXQtb2ZmLgogICAgIGlmIChpblNhbXBsZVJhdGUgPCBvdXRTYW1wbGVSYXRlKSB7IC8vIHVwc2FtcGxlCi0gICAgICAgIGZjciA9IG1heCgwLjUqdGJ3Q2hlYXQgLSB0YncvMiwgdGJ3LzIpOworICAgICAgICBmY3IgPSBtYXgoMC41ICogdGJ3Q2hlYXQgLSBoYWxmYncsIGhhbGZidyk7CiAgICAgfSBlbHNlIHsgLy8gZG93bnNhbXBsZQotICAgICAgICBmY3IgPSBtYXgoMC41KnRid0NoZWF0Km91dFNhbXBsZVJhdGUvaW5TYW1wbGVSYXRlIC0gdGJ3LzIsIHRidy8yKTsKKyAgICAgICAgZmNyID0gbWF4KDAuNSAqIHRid0NoZWF0ICogb3V0U2FtcGxlUmF0ZSAvIGluU2FtcGxlUmF0ZSAtIGhhbGZidywgaGFsZmJ3KTsKICAgICB9Ci0gICAgLy8gY3JlYXRlIGFuZCBzZXQgZmlsdGVyCi0gICAgZmlyS2Fpc2VyR2VuKGJ1ZiwgYy5tTCwgYy5tSGFsZk51bUNvZWZzLCBzdG9wQmFuZEF0dGVuLCBmY3IsIGF0dGVuKTsKLSAgICBjLm1GaXJDb2VmcyA9IGJ1ZjsKLSAgICBpZiAobUNvZWZCdWZmZXIpIHsKLSAgICAgICAgZnJlZShtQ29lZkJ1ZmZlcik7Ci0gICAgfQotICAgIG1Db2VmQnVmZmVyID0gYnVmOwotI2lmZGVmIERFQlVHX1JFU0FNUExFUgorICAgIGNyZWF0ZUthaXNlckZpcihjLCBzdG9wQmFuZEF0dGVuLCBmY3IpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgordm9pZCBBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6Y3JlYXRlS2Fpc2VyRmlyKENvbnN0YW50cyAmYywKKyAgICAgICAgZG91YmxlIHN0b3BCYW5kQXR0ZW4sIGRvdWJsZSBmY3IpIHsKKyAgICAvLyBjb21wdXRlIHRoZSBub3JtYWxpemVkIHRyYW5zaXRpb24gYmFuZHdpZHRoCisgICAgY29uc3QgZG91YmxlIHRidyA9IGZpckthaXNlclRidyhjLm1IYWxmTnVtQ29lZnMsIHN0b3BCYW5kQXR0ZW4pOworICAgIGNvbnN0IGludCBwaGFzZXMgPSBjLm1MOworICAgIGNvbnN0IGludCBoYWxmTGVuZ3RoID0gYy5tSGFsZk51bUNvZWZzOworCisgICAgLy8gY3JlYXRlIGJ1ZmZlcgorICAgIFRDICpjb2VmcyA9IG51bGxwdHI7CisgICAgaW50IHJldCA9IHBvc2l4X21lbWFsaWduKAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkICoqPigmY29lZnMpLAorICAgICAgICAgICAgQ0FDSEVfTElORV9TSVpFIC8qIGFsaWdubWVudCAqLywKKyAgICAgICAgICAgIChwaGFzZXMgKyAxKSAqIGhhbGZMZW5ndGggKiBzaXplb2YoVEMpKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHJldCAhPSAwLCAiQ2Fubm90IGFsbG9jYXRlIGJ1ZmZlciBtZW1vcnksIHJldCAlZCIsIHJldCk7CisgICAgYy5tRmlyQ29lZnMgPSBjb2VmczsKKyAgICBmcmVlKG1Db2VmQnVmZmVyKTsKKyAgICBtQ29lZkJ1ZmZlciA9IGNvZWZzOworCisgICAgLy8gc3F1YXJlIHRoZSBjb21wdXRlZCBtaW5pbXVtIHBhc3NiYW5kIHZhbHVlIChleHRyYSBzYWZldHkpLgorICAgIGRvdWJsZSBhdHRlbnVhdGlvbiA9CisgICAgICAgICAgICBjb21wdXRlV2luZG93ZWRTaW5jTWluaW11bVBhc3NiYW5kVmFsdWUoc3RvcEJhbmRBdHRlbik7CisgICAgYXR0ZW51YXRpb24gKj0gYXR0ZW51YXRpb247CisKKyAgICAvLyBkZXNpZ24gZmlsdGVyCisgICAgZmlyS2Fpc2VyR2VuKGNvZWZzLCBwaGFzZXMsIGhhbGZMZW5ndGgsIHN0b3BCYW5kQXR0ZW4sIGZjciwgYXR0ZW51YXRpb24pOworCisgICAgLy8gdXBkYXRlIHRoZSBkZXNpZ24gY3JpdGVyaWEKKyAgICBtTm9ybWFsaXplZEN1dG9mZkZyZXF1ZW5jeSA9IGZjcjsKKyAgICBtTm9ybWFsaXplZFRyYW5zaXRpb25CYW5kd2lkdGggPSB0Ync7CisgICAgbUZpbHRlckF0dGVudWF0aW9uID0gYXR0ZW51YXRpb247CisgICAgbVN0b3BiYW5kQXR0ZW51YXRpb25EYiA9IHN0b3BCYW5kQXR0ZW47CisgICAgbVBhc3NiYW5kUmlwcGxlRGIgPSBjb21wdXRlV2luZG93ZWRTaW5jUGFzc2JhbmRSaXBwbGVEYihzdG9wQmFuZEF0dGVuKTsKKworI2lmIDAKKyAgICAvLyBLZWVwIHRoaXMgZGVidWcgY29kZSBpbiBjYXNlIGFuIGFwcCBjYXVzZXMgcmVzYW1wbGVyIGRlc2lnbiBpc3N1ZXMuCisgICAgY29uc3QgZG91YmxlIGhhbGZidyA9IHRidyAvIDIuOwogICAgIC8vIHByaW50IGJhc2ljIGZpbHRlciBzdGF0cwotICAgIHByaW50ZigiTDolZCAgaG5jOiVkICBzdG9wQmFuZEF0dGVuOiVsZiAgZmNyOiVsZiAgYXR0ZW46JWxmICB0Ync6JWxmXG4iLAotICAgICAgICAgICAgYy5tTCwgYy5tSGFsZk51bUNvZWZzLCBzdG9wQmFuZEF0dGVuLCBmY3IsIGF0dGVuLCB0YncpOwotICAgIC8vIHRlc3QgdGhlIGZpbHRlciBhbmQgcmVwb3J0IHJlc3VsdHMKLSAgICBkb3VibGUgZnAgPSAoZmNyIC0gdGJ3LzIpL2MubUw7Ci0gICAgZG91YmxlIGZzID0gKGZjciArIHRidy8yKS9jLm1MOworICAgIEFMT0dEKCJMOiVkICBobmM6JWQgIHN0b3BCYW5kQXR0ZW46JWxmICBmY3I6JWxmICBhdHRlbjolbGYgIHRidzolbGZcbiIsCisgICAgICAgICAgICBjLm1MLCBjLm1IYWxmTnVtQ29lZnMsIHN0b3BCYW5kQXR0ZW4sIGZjciwgYXR0ZW51YXRpb24sIHRidyk7CisKKyAgICAvLyB0ZXN0IHRoZSBmaWx0ZXIgYW5kIHJlcG9ydCByZXN1bHRzLgorICAgIC8vIFNpbmNlIHRoaXMgaXMgYSBwb2x5cGhhc2UgZmlsdGVyLCBub3JtYWxpemVkIGZwIGFuZCBmcyBtdXN0IGJlIHNjYWxlZC4KKyAgICBjb25zdCBkb3VibGUgZnAgPSAoZmNyIC0gaGFsZmJ3KSAvIHBoYXNlczsKKyAgICBjb25zdCBkb3VibGUgZnMgPSAoZmNyICsgaGFsZmJ3KSAvIHBoYXNlczsKKwogICAgIGRvdWJsZSBwYXNzTWluLCBwYXNzTWF4LCBwYXNzUmlwcGxlOwogICAgIGRvdWJsZSBzdG9wTWF4LCBzdG9wUmlwcGxlOwotICAgIHRlc3RGaXIoYnVmLCBjLm1MLCBjLm1IYWxmTnVtQ29lZnMsIGZwLCBmcywgLypwYXNzU3RlcHMqLyAxMDAwLCAvKnN0b3BTdGVwcyovIDEwMDAwMCwKKworICAgIGNvbnN0IGludDMyX3QgcGFzc1N0ZXBzID0gMTAwMDsKKworICAgIHRlc3RGaXIoY29lZnMsIGMubUwsIGMubUhhbGZOdW1Db2VmcywgZnAsIGZzLCBwYXNzU3RlcHMsIHBhc3NTdGVwcyAqIGMuTUwgLypzdG9wU3RlcHMqLywKICAgICAgICAgICAgIHBhc3NNaW4sIHBhc3NNYXgsIHBhc3NSaXBwbGUsIHN0b3BNYXgsIHN0b3BSaXBwbGUpOwotICAgIHByaW50ZigicGFzc2JhbmQoJWxmLCAlbGYpOiAlLjhsZiAlLjhsZiAlLjhsZlxuIiwgMC4sIGZwLCBwYXNzTWluLCBwYXNzTWF4LCBwYXNzUmlwcGxlKTsKLSAgICBwcmludGYoInN0b3BiYW5kKCVsZiwgJWxmKTogJS44bGYgJS4zbGZcbiIsIGZzLCAwLjUsIHN0b3BNYXgsIHN0b3BSaXBwbGUpOworICAgIEFMT0dEKCJwYXNzYmFuZCglbGYsICVsZik6ICUuOGxmICUuOGxmICUuOGxmXG4iLCAwLiwgZnAsIHBhc3NNaW4sIHBhc3NNYXgsIHBhc3NSaXBwbGUpOworICAgIEFMT0dEKCJzdG9wYmFuZCglbGYsICVsZik6ICUuOGxmICUuM2xmXG4iLCBmcywgMC41LCBzdG9wTWF4LCBzdG9wUmlwcGxlKTsKICNlbmRpZgogfQogCkBAIC0zMDQsNiArMzU5LDExIEBACiAgICAgICAgIG1GaWx0ZXJTYW1wbGVSYXRlID0gaW5TYW1wbGVSYXRlOwogICAgICAgICBtRmlsdGVyUXVhbGl0eSA9IGdldFF1YWxpdHkoKTsKIAorICAgICAgICBkb3VibGUgc3RvcEJhbmRBdHRlbjsKKyAgICAgICAgZG91YmxlIHRid0NoZWF0ID0gMS47IC8vIGhvdyBtdWNoIHdlICJjaGVhdCIgaW50byBhbGlhc2luZworICAgICAgICBpbnQgaGFsZkxlbmd0aDsKKyAgICAgICAgZG91YmxlIGZjciA9IDAuOworCiAgICAgICAgIC8vIEJlZ2luIEthaXNlciBGaWx0ZXIgY29tcHV0YXRpb24KICAgICAgICAgLy8KICAgICAgICAgLy8gVGhlIHF1YW50aXphdGlvbiBmbG9vciBmb3IgUzE2IGlzIGFib3V0IDk2ZGIgLSAxMCpsb2dfMTAoI2xlbmd0aCkgKyAzZEIuCkBAIC0zMTMsNTIgKzM3Myw2MCBAQAogICAgICAgICAvLyA5Ni05OGRCCiAgICAgICAgIC8vCiAKLSAgICAgICAgZG91YmxlIHN0b3BCYW5kQXR0ZW47Ci0gICAgICAgIGRvdWJsZSB0YndDaGVhdCA9IDEuOyAvLyBob3cgbXVjaCB3ZSAiY2hlYXQiIGludG8gYWxpYXNpbmcKLSAgICAgICAgaW50IGhhbGZMZW5ndGg7Ci0gICAgICAgIGlmIChtRmlsdGVyUXVhbGl0eSA9PSBEWU5fSElHSF9RVUFMSVRZKSB7Ci0gICAgICAgICAgICAvLyAzMmIgY29lZmZpY2llbnRzLCA2NCBsZW5ndGgKKyAgICAgICAgaWYgKG1Qcm9wZXJ0eUVuYWJsZUF0U2FtcGxlUmF0ZSA+PSAwICYmIG1TYW1wbGVSYXRlID49IG1Qcm9wZXJ0eUVuYWJsZUF0U2FtcGxlUmF0ZSkgeworICAgICAgICAgICAgLy8gQW4gYWx0ZXJuYXRpdmUgbWV0aG9kIHdoaWNoIGFsbG93cyBhbGxvd3MgYSBncmVhdGVyIGZjcgorICAgICAgICAgICAgLy8gYXQgdGhlIGV4cGVuc2Ugb2YgcG90ZW50aWFsIGFsaWFzaW5nLgorICAgICAgICAgICAgaGFsZkxlbmd0aCA9IG1Qcm9wZXJ0eUhhbGZGaWx0ZXJMZW5ndGg7CisgICAgICAgICAgICBzdG9wQmFuZEF0dGVuID0gbVByb3BlcnR5U3RvcGJhbmRBdHRlbnVhdGlvbjsKICAgICAgICAgICAgIHVzZVMzMiA9IHRydWU7Ci0gICAgICAgICAgICBzdG9wQmFuZEF0dGVuID0gOTguOwotICAgICAgICAgICAgaWYgKGluU2FtcGxlUmF0ZSA+PSBtU2FtcGxlUmF0ZSAqIDQpIHsKLSAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gNDg7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGluU2FtcGxlUmF0ZSA+PSBtU2FtcGxlUmF0ZSAqIDIpIHsKLSAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gNDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSAzMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtRmlsdGVyUXVhbGl0eSA9PSBEWU5fTE9XX1FVQUxJVFkpIHsKLSAgICAgICAgICAgIC8vIDE2YiBjb2VmZmljaWVudHMsIDE2LTMyIGxlbmd0aAotICAgICAgICAgICAgdXNlUzMyID0gZmFsc2U7Ci0gICAgICAgICAgICBzdG9wQmFuZEF0dGVuID0gODAuOwotICAgICAgICAgICAgaWYgKGluU2FtcGxlUmF0ZSA+PSBtU2FtcGxlUmF0ZSAqIDQpIHsKLSAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gMjQ7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGluU2FtcGxlUmF0ZSA+PSBtU2FtcGxlUmF0ZSAqIDIpIHsKLSAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gMTY7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSA4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGluU2FtcGxlUmF0ZSA8PSBtU2FtcGxlUmF0ZSkgewotICAgICAgICAgICAgICAgIHRid0NoZWF0ID0gMS4wNTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGJ3Q2hlYXQgPSAxLjAzOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeyAvLyBEWU5fTUVEX1FVQUxJVFkKLSAgICAgICAgICAgIC8vIDE2YiBjb2VmZmljaWVudHMsIDMyLTY0IGxlbmd0aAotICAgICAgICAgICAgLy8gbm90ZTogPiA2NCBsZW5ndGggZmlsdGVycyB3aXRoIDE2YiBjb2VmcyBjYW4gaGF2ZSBxdWFudGl6YXRpb24gbm9pc2UgcHJvYmxlbXMKLSAgICAgICAgICAgIHVzZVMzMiA9IGZhbHNlOwotICAgICAgICAgICAgc3RvcEJhbmRBdHRlbiA9IDg0LjsKLSAgICAgICAgICAgIGlmIChpblNhbXBsZVJhdGUgPj0gbVNhbXBsZVJhdGUgKiA0KSB7Ci0gICAgICAgICAgICAgICAgaGFsZkxlbmd0aCA9IDMyOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpblNhbXBsZVJhdGUgPj0gbVNhbXBsZVJhdGUgKiAyKSB7Ci0gICAgICAgICAgICAgICAgaGFsZkxlbmd0aCA9IDI0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gMTY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaW5TYW1wbGVSYXRlIDw9IG1TYW1wbGVSYXRlKSB7Ci0gICAgICAgICAgICAgICAgdGJ3Q2hlYXQgPSAxLjAzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0YndDaGVhdCA9IDEuMDE7CisgICAgICAgICAgICBmY3IgPSBtSW5TYW1wbGVSYXRlIDw9IG1TYW1wbGVSYXRlCisgICAgICAgICAgICAgICAgICAgID8gMC41IDogMC41ICogbVNhbXBsZVJhdGUgLyBtSW5TYW1wbGVSYXRlOworICAgICAgICAgICAgZmNyICo9IG1Qcm9wZXJ0eUN1dG9mZlBlcmNlbnQgLyAxMDAuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1GaWx0ZXJRdWFsaXR5ID09IERZTl9ISUdIX1FVQUxJVFkpIHsKKyAgICAgICAgICAgICAgICAvLyAzMmIgY29lZmZpY2llbnRzLCA2NCBsZW5ndGgKKyAgICAgICAgICAgICAgICB1c2VTMzIgPSB0cnVlOworICAgICAgICAgICAgICAgIHN0b3BCYW5kQXR0ZW4gPSA5OC47CisgICAgICAgICAgICAgICAgaWYgKGluU2FtcGxlUmF0ZSA+PSBtU2FtcGxlUmF0ZSAqIDQpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFsZkxlbmd0aCA9IDQ4OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5TYW1wbGVSYXRlID49IG1TYW1wbGVSYXRlICogMikgeworICAgICAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gNDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaGFsZkxlbmd0aCA9IDMyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUZpbHRlclF1YWxpdHkgPT0gRFlOX0xPV19RVUFMSVRZKSB7CisgICAgICAgICAgICAgICAgLy8gMTZiIGNvZWZmaWNpZW50cywgMTYtMzIgbGVuZ3RoCisgICAgICAgICAgICAgICAgdXNlUzMyID0gZmFsc2U7CisgICAgICAgICAgICAgICAgc3RvcEJhbmRBdHRlbiA9IDgwLjsKKyAgICAgICAgICAgICAgICBpZiAoaW5TYW1wbGVSYXRlID49IG1TYW1wbGVSYXRlICogNCkgeworICAgICAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gMjQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpblNhbXBsZVJhdGUgPj0gbVNhbXBsZVJhdGUgKiAyKSB7CisgICAgICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSAxNjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGluU2FtcGxlUmF0ZSA8PSBtU2FtcGxlUmF0ZSkgeworICAgICAgICAgICAgICAgICAgICB0YndDaGVhdCA9IDEuMDU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGJ3Q2hlYXQgPSAxLjAzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7IC8vIERZTl9NRURfUVVBTElUWQorICAgICAgICAgICAgICAgIC8vIDE2YiBjb2VmZmljaWVudHMsIDMyLTY0IGxlbmd0aAorICAgICAgICAgICAgICAgIC8vIG5vdGU6ID4gNjQgbGVuZ3RoIGZpbHRlcnMgd2l0aCAxNmIgY29lZnMgY2FuIGhhdmUgcXVhbnRpemF0aW9uIG5vaXNlIHByb2JsZW1zCisgICAgICAgICAgICAgICAgdXNlUzMyID0gZmFsc2U7CisgICAgICAgICAgICAgICAgc3RvcEJhbmRBdHRlbiA9IDg0LjsKKyAgICAgICAgICAgICAgICBpZiAoaW5TYW1wbGVSYXRlID49IG1TYW1wbGVSYXRlICogNCkgeworICAgICAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gMzI7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpblNhbXBsZVJhdGUgPj0gbVNhbXBsZVJhdGUgKiAyKSB7CisgICAgICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSAyNDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gMTY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpblNhbXBsZVJhdGUgPD0gbVNhbXBsZVJhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGJ3Q2hlYXQgPSAxLjAzOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRid0NoZWF0ID0gMS4wMTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMzkwLDggKzQ1OCwxMiBAQAogCiAgICAgICAgIC8vIGNyZWF0ZSB0aGUgZmlsdGVyCiAgICAgICAgIG1Db25zdGFudHMuc2V0KHBoYXNlcywgaGFsZkxlbmd0aCwgaW5TYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSk7Ci0gICAgICAgIGNyZWF0ZUthaXNlckZpcihtQ29uc3RhbnRzLCBzdG9wQmFuZEF0dGVuLAotICAgICAgICAgICAgICAgIGluU2FtcGxlUmF0ZSwgbVNhbXBsZVJhdGUsIHRid0NoZWF0KTsKKyAgICAgICAgaWYgKGZjciA+IDAuKSB7CisgICAgICAgICAgICBjcmVhdGVLYWlzZXJGaXIobUNvbnN0YW50cywgc3RvcEJhbmRBdHRlbiwgZmNyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNyZWF0ZUthaXNlckZpcihtQ29uc3RhbnRzLCBzdG9wQmFuZEF0dGVuLAorICAgICAgICAgICAgICAgICAgICBpblNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlLCB0YndDaGVhdCk7CisgICAgICAgIH0KICAgICB9IC8vIEVuZCBLYWlzZXIgZmlsdGVyCiAKICAgICAvLyB1cGRhdGUgcGhhc2UgYW5kIHN0YXRlIGJhc2VkIG9uIHRoZSBuZXcgZmlsdGVyLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmggYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uaAppbmRleCAxODQwZmM3Li45MjE0NGQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uaAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uaApAQCAtNTUsNiArNTUsMzkgQEAKICAgICB2aXJ0dWFsIHNpemVfdCByZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpOwogCisgICAgLy8gTWFrZSBhdmFpbGFibGUga2V5IGRlc2lnbiBjcml0ZXJpYSBmb3IgdGVzdGluZworICAgIGludCBnZXRIYWxmTGVuZ3RoKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNvbnN0YW50cy5tSGFsZk51bUNvZWZzOworICAgIH0KKworICAgIGNvbnN0IFRDICpnZXRGaWx0ZXJDb2VmcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Db25zdGFudHMubUZpckNvZWZzOworICAgIH0KKworICAgIGludCBnZXRQaGFzZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ29uc3RhbnRzLm1MOworICAgIH0KKworICAgIGRvdWJsZSBnZXRTdG9wYmFuZEF0dGVudWF0aW9uRGIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU3RvcGJhbmRBdHRlbnVhdGlvbkRiOworICAgIH0KKworICAgIGRvdWJsZSBnZXRQYXNzYmFuZFJpcHBsZURiKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVBhc3NiYW5kUmlwcGxlRGI7CisgICAgfQorCisgICAgZG91YmxlIGdldE5vcm1hbGl6ZWRUcmFuc2l0aW9uQmFuZHdpZHRoKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU5vcm1hbGl6ZWRUcmFuc2l0aW9uQmFuZHdpZHRoOworICAgIH0KKworICAgIGRvdWJsZSBnZXRGaWx0ZXJBdHRlbnVhdGlvbigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1GaWx0ZXJBdHRlbnVhdGlvbjsKKyAgICB9CisKKyAgICBkb3VibGUgZ2V0Tm9ybWFsaXplZEN1dG9mZkZyZXF1ZW5jeSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Ob3JtYWxpemVkQ3V0b2ZmRnJlcXVlbmN5OworICAgIH0KKwogcHJpdmF0ZToKIAogICAgIGNsYXNzIENvbnN0YW50cyB7IC8vIHN0b3JlcyB0aGUgZmlsdGVyIGNvbnN0YW50cy4KQEAgLTExMiw2ICsxNDUsOCBAQAogICAgIHZvaWQgY3JlYXRlS2Fpc2VyRmlyKENvbnN0YW50cyAmYywgZG91YmxlIHN0b3BCYW5kQXR0ZW4sCiAgICAgICAgICAgICBpbnQgaW5TYW1wbGVSYXRlLCBpbnQgb3V0U2FtcGxlUmF0ZSwgZG91YmxlIHRid0NoZWF0KTsKIAorICAgIHZvaWQgY3JlYXRlS2Fpc2VyRmlyKENvbnN0YW50cyAmYywgZG91YmxlIHN0b3BCYW5kQXR0ZW4sIGRvdWJsZSBmY3IpOworCiAgICAgdGVtcGxhdGU8aW50IENIQU5ORUxTLCBib29sIExPQ0tFRCwgaW50IFNUUklERT4KICAgICBzaXplX3QgcmVzYW1wbGUoVE8qIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKTsKIApAQCAtMTI3LDYgKzE2MiwzOCBAQAogICAgICAgICAgICAgaW50MzJfdCBtRmlsdGVyU2FtcGxlUmF0ZTsgLy8gZGVzaWduZWQgZmlsdGVyIHNhbXBsZSByYXRlLgogICAgICAgICBzcmNfcXVhbGl0eSBtRmlsdGVyUXVhbGl0eTsgICAgLy8gZGVzaWduZWQgZmlsdGVyIHF1YWxpdHkuCiAgICAgICAgICAgICAgIHZvaWQqIG1Db2VmQnVmZmVyOyAgICAgICAvLyBpZiBhIGZpbHRlciBpcyBjcmVhdGVkLCB0aGlzIGlzIG5vdCBudWxsCisKKyAgICAvLyBQcm9wZXJ0eSBzZWxlY3RlZCBkZXNpZ24gcGFyYW1ldGVycy4KKyAgICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGVuYWJsZSBmaXhlZCBoaWdoIHF1YWxpdHkgcmVzYW1wbGluZy4KKworICAgICAgICAgICAgICAvLyAzMiBjaGFyIFBST1BfTkFNRV9NQVggbGltaXQgZW5mb3JjZWQgYmVmb3JlIEFuZHJvaWQgTworCisgICAgICAgICAgICAgIC8vIFVzZSBmb3Igc2FtcGxlIHJhdGVzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGlzIHZhbHVlLgorICAgICAgICAgICAgICAvLyBTZXQgdG8gbm9uLW5lZ2F0aXZlIHRvIGVuYWJsZSwgbmVnYXRpdmUgdG8gZGlzYWJsZS4KKyAgICAgICAgICAgICAgaW50MzJfdCBtUHJvcGVydHlFbmFibGVBdFNhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAvLyAicm8uYXVkaW8ucmVzYW1wbGVyLnBzZC5lbmFibGVfYXRfc2FtcGxlcmF0ZSIKKworICAgICAgICAgICAgICAvLyBTcGVjaWZ5IEhBTEYgdGhlIHJlc2FtcGxpbmcgZmlsdGVyIGxlbmd0aC4KKyAgICAgICAgICAgICAgLy8gU2V0IHRvIGEgdmFsdWUgd2hpY2ggaXMgYSBtdWx0aXBsZSBvZiA0LgorICAgICAgICAgICAgICBpbnQzMl90IG1Qcm9wZXJ0eUhhbGZGaWx0ZXJMZW5ndGggPSAzMjsKKyAgICAgICAgICAgICAgICAgICAgICAvLyAicm8uYXVkaW8ucmVzYW1wbGVyLnBzZC5oYWxmbGVuZ3RoIgorCisgICAgICAgICAgICAgIC8vIFNwZWNpZnkgdGhlIHN0b3BiYW5kIGF0dGVudWF0aW9uIGluIHBvc2l0aXZlIGRCLgorICAgICAgICAgICAgICAvLyBTZXQgdG8gYSB2YWx1ZSBncmVhdGVyIG9yIGVxdWFsIHRvIDIwLgorICAgICAgICAgICAgICBpbnQzMl90IG1Qcm9wZXJ0eVN0b3BiYW5kQXR0ZW51YXRpb24gPSA5MDsKKyAgICAgICAgICAgICAgICAgICAgICAvLyAicm8uYXVkaW8ucmVzYW1wbGVyLnBzZC5zdG9wYmFuZCIKKworICAgICAgICAgICAgICAvLyBTcGVjaWZ5IHRoZSBjdXRvZmYgZnJlcXVlbmN5IGFzIGEgcGVyY2VudGFnZSBvZiBOeXF1aXN0LgorICAgICAgICAgICAgICAvLyBTZXQgdG8gYSB2YWx1ZSBiZXR3ZWVuIDUwIGFuZCAxMDAuCisgICAgICAgICAgICAgIGludDMyX3QgbVByb3BlcnR5Q3V0b2ZmUGVyY2VudCA9IDEwMDsKKyAgICAgICAgICAgICAgICAgICAgICAvLyAicm8uYXVkaW8ucmVzYW1wbGVyLnBzZC5jdXRvZmZfcGVyY2VudCIKKworICAgIC8vIEZpbHRlciBjcmVhdGlvbiBkZXNpZ24gcGFyYW1ldGVycywgc2VlIHNldFNhbXBsZVJhdGUoKQorICAgICAgICAgICAgIGRvdWJsZSBtU3RvcGJhbmRBdHRlbnVhdGlvbkRiID0gMC47CisgICAgICAgICAgICAgZG91YmxlIG1QYXNzYmFuZFJpcHBsZURiID0gMC47CisgICAgICAgICAgICAgZG91YmxlIG1Ob3JtYWxpemVkVHJhbnNpdGlvbkJhbmR3aWR0aCA9IDAuOworICAgICAgICAgICAgIGRvdWJsZSBtRmlsdGVyQXR0ZW51YXRpb24gPSAwLjsKKyAgICAgICAgICAgICBkb3VibGUgbU5vcm1hbGl6ZWRDdXRvZmZGcmVxdWVuY3kgPSAwLjsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckZpckdlbi5oIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRmlyR2VuLmgKaW5kZXggYWQxODk2NS4uMzljYWZlYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRmlyR2VuLmgKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRmlyR2VuLmgKQEAgLTU0Niw4ICs1NDYsOSBAQAogICAgICAgICB9CiAgICAgICAgIHdzdGFydCArPSB3c3RlcDsKICAgICB9Ci0gICAgLy8gcmVub3JtYWxpemUgLSB0aGlzIGlzIG9ubHkgbmVlZGVkIGZvciBpbnRlZ2VyIGZpbHRlciB0eXBlcwotICAgIGRvdWJsZSBub3JtID0gMS4vKCgxVUxMPDwoc2l6ZW9mKFQpKjgtMSkpKkwpOworICAgIC8vIHJlbm9ybWFsaXplIC0gdGhpcyBpcyBuZWVkZWQgZm9yIGludGVnZXIgZmlsdGVyIHR5cGVzLCB1c2UgMSBmb3IgZmxvYXQgb3IgZG91YmxlLgorICAgIGNvbnN0ZXhwciBpbnQ2NF90IGludGVncmFsU2hpZnQgPSBzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSA/IChzaXplb2YoVCkgKiA4IC0gMSkgOiAwOworICAgIGNvbnN0IGRvdWJsZSBub3JtID0gMS4gLyAoTCA8PCBpbnRlZ3JhbFNoaWZ0KTsKIAogICAgIGZpck1pbiA9IGZtaW4gKiBub3JtOwogICAgIGZpck1heCA9IGZtYXggKiBub3JtOwpAQCAtNTU3LDkgKzU1OCwxMiBAQAogICogZXZhbHVhdGVzIHRoZSB8SChmKXwgbG93cGFzcyBiYW5kIGNoYXJhY3RlcmlzdGljcy4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHRlc3RzIHRoZSBsb3dwYXNzIGNoYXJhY3RlcmlzdGljcyBmb3IgdGhlIG92ZXJhbGwgcG9seXBoYXNlIGZpbHRlciwKLSAqIGFuZCBpcyB1c2VkIHRvIHZlcmlmeSB0aGUgZGVzaWduLiAgRm9yIHRoaXMgY2FzZSwgZnAgc2hvdWxkIGJlIHNldCB0byB0aGUKKyAqIGFuZCBpcyB1c2VkIHRvIHZlcmlmeSB0aGUgZGVzaWduLgorICoKKyAqIEZvciBhIHBvbHlwaGFzZSBmaWx0ZXIgKEwgPiAxKSwgdHlwaWNhbGx5IGZwIHNob3VsZCBiZSBzZXQgdG8gdGhlCiAgKiBwYXNzYmFuZCBub3JtYWxpemVkIGZyZXF1ZW5jeSBmcm9tIDAgdG8gMC41IGZvciB0aGUgb3ZlcmFsbCBmaWx0ZXIgKHRodXMgaXQKICAqIGlzIHRoZSBkZXNpZ25lZCBwb2x5cGhhc2UgYmFuayB2YWx1ZSAvIEwpLiAgTGlrZXdpc2UgZm9yIGZzLgorICogU2ltaWxhcmx5IHRoZSBzdG9wU3RlcHMgc2hvdWxkIGJlIEwgKiBwYXNzU3RlcHMgZm9yIGVxdWl2YWxlbnQgYWNjdXJhY3kuCiAgKgogICogQHBhcmFtIGNvZWYgaXMgdGhlIGRlc2lnbmVkIHBvbHlwaGFzZSBmaWx0ZXIgYmFua3MKICAqCkBAIC02MTAsNiArNjE0LDc0IEBACiB9CiAKIC8qCisgKiBFc3RpbWF0ZSB0aGUgd2luZG93ZWQgc2luYyBtaW5pbXVtIHBhc3NiYW5kIHZhbHVlLgorICoKKyAqIFRoaXMgaXMgdGhlIG1pbmltdW0gdmFsdWUgZm9yIGEgd2luZG93ZWQgc2luYyBmaWx0ZXIgaW4gaXRzIHBhc3NiYW5kLAorICogd2hpY2ggaXMgaWRlbnRpY2FsIHRvIHRoZSBzY2FsaW5nIHJlcXVpcmVkIG5vdCB0byBjYXVzZSBvdmVyZmxvdyBvZiBhIDBkQkZTIHNpZ25hbC4KKyAqIFRoZSBhY3R1YWwgdmFsdWUgdXNlZCB0byBhdHRlbnVhdGUgdGhlIGZpbHRlciBhbXBsaXR1ZGUgc2hvdWxkIGJlIHNsaWdodGx5CisgKiBzbWFsbGVyIHRoYW4gdGhpcyAoc3VnZ2VzdCBzcXVhcmluZykgYXMgdGhpcyBpcyBqdXN0IGFuIGVzdGltYXRlLgorICoKKyAqIEFzIGEgd2luZG93ZWQgc2luYyBoYXMgYSBwYXNzYmFuZCByaXBwbGUgY29tbWVuc3VyYXRlIHRvIHRoZSBzdG9wYmFuZCBhdHRlbnVhdGlvbgorICogZHVlIHRvIEdpYmIncyBwaGVub21lbm9uIGZyb20gdHJ1bmNhdGluZyB0aGUgc2luYywgd2UgZGVyaXZlIHRoaXMgdmFsdWUgZnJvbQorICogdGhlIGRlc2lnbiBzdG9wYmFuZEF0dGVudWF0aW9uRGIgKGEgcG9zaXRpdmUgdmFsdWUpLgorICovCitzdGF0aWMgaW5saW5lIGRvdWJsZSBjb21wdXRlV2luZG93ZWRTaW5jTWluaW11bVBhc3NiYW5kVmFsdWUoCisgICAgICAgIGRvdWJsZSBzdG9wQmFuZEF0dGVudWF0aW9uRGIpIHsKKyAgICByZXR1cm4gMS4gLSBwb3coMTAuIC8qIGJhc2UgKi8sIHN0b3BCYW5kQXR0ZW51YXRpb25EYiAqICgtMS4gLyAyMC4pKTsKK30KKworLyoKKyAqIENvbXB1dGUgdGhlIHdpbmRvd2VkIHNpbmMgcGFzc2JhbmQgcmlwcGxlIGZyb20gc3RvcGJhbmQgYXR0ZW51YXRpb24uCisgKgorICogQXMgYSB3aW5kb3dlZCBzaW5jIGhhcyBhbiBwYXNzYmFuZCByaXBwbGUgY29tbWVuc3VyYXRlIHRvIHRoZSBzdG9wYmFuZCBhdHRlbnVhdGlvbgorICogZHVlIHRvIEdpYmIncyBwaGVub21lbm9uIGZyb20gdHJ1bmNhdGluZyB0aGUgc2luYywgd2UgZGVyaXZlIHRoaXMgdmFsdWUgZnJvbQorICogdGhlIGRlc2lnbiBzdG9wYmFuZEF0dGVudWF0aW9uRGIgKGEgcG9zaXRpdmUgdmFsdWUpLgorICovCitzdGF0aWMgaW5saW5lIGRvdWJsZSBjb21wdXRlV2luZG93ZWRTaW5jUGFzc2JhbmRSaXBwbGVEYigKKyAgICAgICAgZG91YmxlIHN0b3BCYW5kQXR0ZW51YXRpb25EYikgeworICAgIHJldHVybiAtMjAuICogbG9nMTAoY29tcHV0ZVdpbmRvd2VkU2luY01pbmltdW1QYXNzYmFuZFZhbHVlKHN0b3BCYW5kQXR0ZW51YXRpb25EYikpOworfQorCisvKgorICogS2Fpc2VyIHdpbmRvdyBCZXRhIHZhbHVlCisgKgorICogRm9ybXVsYSAzLjIuNSwgMy4yLjcsIFZhaWR5YW5hdGhhbiwgX011bHRpcmF0ZSBTeXN0ZW1zIGFuZCBGaWx0ZXIgQmFua3NfLCBwLiA0OAorICogRm9ybXVsYSA3Ljc1LCBPcHBlbmhlaW0gYW5kIFNjaGFmZXIsIF9EaXNjcmV0ZS10aW1lIFNpZ25hbCBQcm9jZXNzaW5nLCAzZV8sIHAuIDU0MgorICoKKyAqIFNlZSBhbHNvOiBodHRwOi8vbWVsb2RpLmVlLndhc2hpbmd0b24uZWR1L2NvdXJzZXMvZWU1MTgvbm90ZXMvbGVjMTcucGRmCisgKgorICogS2Fpc2VyIHdpbmRvdyBhbmQgYmV0YSBwYXJhbWV0ZXIKKyAqCisgKiAgICAgICAgIHwgMC4xMTAyKihBIC0gOC43KSAgICAgICAgICAgICAgICAgICAgICAgICBBID4gNTAKKyAqICBCZXRhID0gfCAwLjU4NDIqKEEgLSAyMSleMC40ICsgMC4wNzg4NiooQSAtIDIxKSAgIDIxIDwgQSA8PSA1MAorICogICAgICAgICB8IDAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSA8PSAyMQorICoKKyAqIHdpdGggQSBpcyB0aGUgZGVzaXJlZCBzdG9wLWJhbmQgYXR0ZW51YXRpb24gaW4gcG9zaXRpdmUgZEJGUworICoKKyAqICAgIDMwIGRCICAgIDIuMjEwCisgKiAgICA0MCBkQiAgICAzLjM4NAorICogICAgNTAgZEIgICAgNC41MzgKKyAqICAgIDYwIGRCICAgIDUuNjU4CisgKiAgICA3MCBkQiAgICA2Ljc2NAorICogICAgODAgZEIgICAgNy44NjUKKyAqICAgIDkwIGRCICAgIDguOTYwCisgKiAgIDEwMCBkQiAgIDEwLjA1NgorICoKKyAqIEZvciBzb21lIHZhbHVlcyBvZiBzdG9wQmFuZEF0dGVudWF0aW9uRGIgdGhlIGZ1bmN0aW9uIG1heSBiZSBjb21wdXRlZAorICogYXQgY29tcGlsZSB0aW1lLgorICovCitzdGF0aWMgaW5saW5lIGNvbnN0ZXhwciBkb3VibGUgY29tcHV0ZUJldGEoZG91YmxlIHN0b3BCYW5kQXR0ZW51YXRpb25EYikgeworICAgIGlmIChzdG9wQmFuZEF0dGVudWF0aW9uRGIgPiA1MC4pIHsKKyAgICAgICAgcmV0dXJuIDAuMTEwMiAqIChzdG9wQmFuZEF0dGVudWF0aW9uRGIgLSA4LjcpOworICAgIH0KKyAgICBjb25zdCBkb3VibGUgb2Zmc2V0ID0gc3RvcEJhbmRBdHRlbnVhdGlvbkRiIC0gMjEuOworICAgIGlmIChvZmZzZXQgPiAwLikgeworICAgICAgICByZXR1cm4gMC41ODQyICogcG93KG9mZnNldCwgMC40KSArIDAuMDc4ODYgKiBvZmZzZXQ7CisgICAgfQorICAgIHJldHVybiAwLjsKK30KKworLyoKICAqIENhbGN1bGF0ZXMgdGhlIG92ZXJhbGwgcG9seXBoYXNlIGZpbHRlciBiYXNlZCBvbiBhIHdpbmRvd2VkIHNpbmMgZnVuY3Rpb24uCiAgKgogICogVGhlIHdpbmRvd2VkIHNpbmMgaXMgYW4gb2RkIGxlbmd0aCBzeW1tZXRyaWMgZmlsdGVyIG9mIGV4YWN0bHkgTCpoYWxmTnVtQ29lZioyKzEKQEAgLTY0MiwzMSArNzE0LDggQEAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogc3RhdGljIGlubGluZSB2b2lkIGZpckthaXNlckdlbihUKiBjb2VmLCBpbnQgTCwgaW50IGhhbGZOdW1Db2VmLAogICAgICAgICBkb3VibGUgc3RvcEJhbmRBdHRlbiwgZG91YmxlIGZjciwgZG91YmxlIGF0dGVuKSB7Ci0gICAgLy8KLSAgICAvLyBGb3JtdWxhIDMuMi41LCAzLjIuNywgVmFpZHlhbmF0aGFuLCBfTXVsdGlyYXRlIFN5c3RlbXMgYW5kIEZpbHRlciBCYW5rc18sIHAuIDQ4Ci0gICAgLy8gRm9ybXVsYSA3Ljc1LCBPcHBlbmhlaW0gYW5kIFNjaGFmZXIsIF9EaXNjcmV0ZS10aW1lIFNpZ25hbCBQcm9jZXNzaW5nLCAzZV8sIHAuIDU0MgotICAgIC8vCi0gICAgLy8gU2VlIGFsc286IGh0dHA6Ly9tZWxvZGkuZWUud2FzaGluZ3Rvbi5lZHUvY291cnNlcy9lZTUxOC9ub3Rlcy9sZWMxNy5wZGYKLSAgICAvLwotICAgIC8vIEthaXNlciB3aW5kb3cgYW5kIGJldGEgcGFyYW1ldGVyCi0gICAgLy8KLSAgICAvLyAgICAgICAgIHwgMC4xMTAyKihBIC0gOC43KSAgICAgICAgICAgICAgICAgICAgICAgICBBID4gNTAKLSAgICAvLyAgYmV0YSA9IHwgMC41ODQyKihBIC0gMjEpXjAuNCArIDAuMDc4ODYqKEEgLSAyMSkgICAyMSA8PSBBIDw9IDUwCi0gICAgLy8gICAgICAgICB8IDAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSA8IDIxCi0gICAgLy8KLSAgICAvLyB3aXRoIEEgaXMgdGhlIGRlc2lyZWQgc3RvcC1iYW5kIGF0dGVudWF0aW9uIGluIGRCRlMKLSAgICAvLwotICAgIC8vICAgIDMwIGRCICAgIDIuMjEwCi0gICAgLy8gICAgNDAgZEIgICAgMy4zODQKLSAgICAvLyAgICA1MCBkQiAgICA0LjUzOAotICAgIC8vICAgIDYwIGRCICAgIDUuNjU4Ci0gICAgLy8gICAgNzAgZEIgICAgNi43NjQKLSAgICAvLyAgICA4MCBkQiAgICA3Ljg2NQotICAgIC8vICAgIDkwIGRCICAgIDguOTYwCi0gICAgLy8gICAxMDAgZEIgICAxMC4wNTYKLQogICAgIGNvbnN0IGludCBOID0gTCAqIGhhbGZOdW1Db2VmOyAvLyBub24tbmVnYXRpdmUgaGFsZgotICAgIGNvbnN0IGRvdWJsZSBiZXRhID0gMC4xMTAyICogKHN0b3BCYW5kQXR0ZW4gLSA4LjcpOyAvLyA+PSA1MGRCIGFsd2F5cworICAgIGNvbnN0IGRvdWJsZSBiZXRhID0gY29tcHV0ZUJldGEoc3RvcEJhbmRBdHRlbik7CiAgICAgY29uc3QgZG91YmxlIHhzdGVwID0gKDIuICogTV9QSSkgKiBmY3IgLyBMOwogICAgIGNvbnN0IGRvdWJsZSB4ZnJhYyA9IDEuIC8gTjsKICAgICBjb25zdCBkb3VibGUgeXNjYWxlID0gYXR0ZW4gKiBMIC8gKEkwKGJldGEpICogTV9QSSk7CkBAIC02OTYsOSArNzQ1LDkgQEAKICAgICAgICAgICAgICAgICBzZy5hZHZhbmNlKCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChpc19zYW1lPFQsIGludDE2X3Q+Ojp2YWx1ZSkgeyAvLyBpbnQxNl90IG5lZWRzIG5vaXNlIHNoYXBpbmcKKyAgICAgICAgICAgIGlmIChzdGQ6OmlzX3NhbWU8VCwgaW50MTZfdD46OnZhbHVlKSB7IC8vIGludDE2X3QgbmVlZHMgbm9pc2Ugc2hhcGluZwogICAgICAgICAgICAgICAgICpjb2VmKysgPSBzdGF0aWNfY2FzdDxUPih0b2ludCh5LCAxVUxMPDwoc2l6ZW9mKFQpKjgtMSksIGVycikpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpc19zYW1lPFQsIGludDMyX3Q+Ojp2YWx1ZSkgeworICAgICAgICAgICAgfSBlbHNlIGlmIChzdGQ6OmlzX3NhbWU8VCwgaW50MzJfdD46OnZhbHVlKSB7CiAgICAgICAgICAgICAgICAgKmNvZWYrKyA9IHN0YXRpY19jYXN0PFQ+KHRvaW50KHksIDFVTEw8PChzaXplb2YoVCkqOC0xKSkpOwogICAgICAgICAgICAgfSBlbHNlIHsgLy8gYXNzdW1lZCBmbG9hdCBvciBkb3VibGUKICAgICAgICAgICAgICAgICAqY29lZisrID0gc3RhdGljX2Nhc3Q8VD4oeSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQnVmZmVyUHJvdmlkZXJzLmNwcCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9CdWZmZXJQcm92aWRlcnMuY3BwCmluZGV4IDg2MmZlZjYuLjJkOWUxY2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9CdWZmZXJQcm92aWRlcnMuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9CdWZmZXJQcm92aWRlcnMuY3BwCkBAIC0xODMsNyArMTgzLDcgQEAKICAgICAgbU91dEZyYW1lU2l6ZSA9CiAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpICogYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG91dHB1dENoYW5uZWxNYXNrKTsKICAgICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgICBzdGF0dXMgPSBFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U6Om1pcnJvcigKKyAgICAgc3RhdHVzID0gbUVmZmVjdHNGYWN0b3J5LT5taXJyb3JCdWZmZXIoCiAgICAgICAgICAgICAgbnVsbHB0ciwgbUluRnJhbWVTaXplICogYnVmZmVyRnJhbWVDb3VudCwgJm1JbkJ1ZmZlcik7CiAgICAgIGlmIChzdGF0dXMgIT0gMCkgewogICAgICAgICAgQUxPR0UoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCkgZXJyb3IgJWQgd2hpbGUgY3JlYXRpbmcgaW5wdXQgYnVmZmVyIiwgc3RhdHVzKTsKQEAgLTE5MSw3ICsxOTEsNyBAQAogICAgICAgICAgbUVmZmVjdHNGYWN0b3J5LmNsZWFyKCk7CiAgICAgICAgICByZXR1cm47CiAgICAgIH0KLSAgICAgc3RhdHVzID0gRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlOjptaXJyb3IoCisgICAgIHN0YXR1cyA9IG1FZmZlY3RzRmFjdG9yeS0+bWlycm9yQnVmZmVyKAogICAgICAgICAgICAgIG51bGxwdHIsIG1PdXRGcmFtZVNpemUgKiBidWZmZXJGcmFtZUNvdW50LCAmbU91dEJ1ZmZlcik7CiAgICAgIGlmIChzdGF0dXMgIT0gMCkgewogICAgICAgICAgQUxPR0UoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCkgZXJyb3IgJWQgd2hpbGUgY3JlYXRpbmcgb3V0cHV0IGJ1ZmZlciIsIHN0YXR1cyk7CkBAIC0zNzYsNiArMzc2LDIzIEBACiAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChkc3QsIG1PdXRwdXRGb3JtYXQsIHNyYywgbUlucHV0Rm9ybWF0LCBmcmFtZXMgKiBtQ2hhbm5lbENvdW50KTsKIH0KIAorQ2xhbXBGbG9hdEJ1ZmZlclByb3ZpZGVyOjpDbGFtcEZsb2F0QnVmZmVyUHJvdmlkZXIoaW50MzJfdCBjaGFubmVsQ291bnQsIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KSA6CisgICAgICAgIENvcHlCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpLAorICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoQVVESU9fRk9STUFUX1BDTV9GTE9BVCksCisgICAgICAgICAgICAgICAgYnVmZmVyRnJhbWVDb3VudCksCisgICAgICAgIG1DaGFubmVsQ291bnQoY2hhbm5lbENvdW50KQoreworICAgIEFMT0dWKCJDbGFtcEZsb2F0QnVmZmVyUHJvdmlkZXIoJXApKCV1KSIsIHRoaXMsIGNoYW5uZWxDb3VudCk7Cit9CisKK3ZvaWQgQ2xhbXBGbG9hdEJ1ZmZlclByb3ZpZGVyOjpjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKQoreworICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2Zsb2F0X3dpdGhfY2xhbXBpbmcoKGZsb2F0Kilkc3QsIChjb25zdCBmbG9hdCopc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzICogbUNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMT0FUX05PTUlOQUxfUkFOR0VfSEVBRFJPT00pOworfQorCiBUaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyOjpUaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyKGludDMyX3QgY2hhbm5lbENvdW50LAogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIHVpbnQzMl90IHNhbXBsZVJhdGUsIGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwbGF5YmFja1JhdGUpIDoKICAgICAgICAgbUNoYW5uZWxDb3VudChjaGFubmVsQ291bnQpLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL09XTkVSUyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZkMGVhMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9PV05FUlMKQEAgLTAsMCArMSwzIEBACitna2FzdGVuQGdvb2dsZS5jb20KK2h1bmdhQGdvb2dsZS5jb20KK3JhZ29AZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2ggYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaAppbmRleCA3MDRkMDk1Li5lZmVmNDE3IDEwMDc1NQotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaApAQCAtMTQsOCArMTQsOCBAQAogCiBlY2hvICJ3YWl0aW5nIGZvciBkZXZpY2UiCiBhZGIgcm9vdCAmJiBhZGIgd2FpdC1mb3ItZGV2aWNlIHJlbW91bnQKLWFkYiBwdXNoICRPVVQvc3lzdGVtL2xpYi9saWJhdWRpb3Jlc2FtcGxlci5zbyAvc3lzdGVtL2xpYgotYWRiIHB1c2ggJE9VVC9zeXN0ZW0vbGliNjQvbGliYXVkaW9yZXNhbXBsZXIuc28gL3N5c3RlbS9saWI2NAorYWRiIHB1c2ggJE9VVC9zeXN0ZW0vbGliL2xpYmF1ZGlvcHJvY2Vzc2luZy5zbyAvc3lzdGVtL2xpYgorYWRiIHB1c2ggJE9VVC9zeXN0ZW0vbGliNjQvbGliYXVkaW9wcm9jZXNzaW5nLnNvIC9zeXN0ZW0vbGliNjQKIGFkYiBwdXNoICRPVVQvZGF0YS9uYXRpdmV0ZXN0L3Jlc2FtcGxlcl90ZXN0cy9yZXNhbXBsZXJfdGVzdHMgL2RhdGEvbmF0aXZldGVzdC9yZXNhbXBsZXJfdGVzdHMvcmVzYW1wbGVyX3Rlc3RzCiBhZGIgcHVzaCAkT1VUL2RhdGEvbmF0aXZldGVzdDY0L3Jlc2FtcGxlcl90ZXN0cy9yZXNhbXBsZXJfdGVzdHMgL2RhdGEvbmF0aXZldGVzdDY0L3Jlc2FtcGxlcl90ZXN0cy9yZXNhbXBsZXJfdGVzdHMKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL3Jlc2FtcGxlcl90ZXN0cy5jcHAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvcmVzYW1wbGVyX3Rlc3RzLmNwcAppbmRleCBhMjNjMDAwLi5lMTYyM2Y3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvcmVzYW1wbGVyX3Rlc3RzLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvcmVzYW1wbGVyX3Rlc3RzLmNwcApAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8dmVjdG9yPgogCkBAIC0zNyw2ICszOCw4IEBACiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXIuaD4KKyNpbmNsdWRlICIuLi9BdWRpb1Jlc2FtcGxlckR5bi5oIgorI2luY2x1ZGUgIi4uL0F1ZGlvUmVzYW1wbGVyRmlyR2VuLmgiCiAjaW5jbHVkZSAidGVzdF91dGlscy5oIgogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KQEAgLTI0Miw2ICsyNDUsNjAgQEAKICAgICBkZWxldGUgcmVzYW1wbGVyOwogfQogCit2b2lkIHRlc3RGaWx0ZXJSZXNwb25zZSgKKyAgICAgICAgc2l6ZV90IGNoYW5uZWxzLCB1bnNpZ25lZCBpbnB1dEZyZXEsIHVuc2lnbmVkIG91dHB1dEZyZXEpCit7CisgICAgLy8gY3JlYXRlIHJlc2FtcGxlcgorICAgIHVzaW5nIFJlc2FtcGxlclR5cGUgPSBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlckR5bjxmbG9hdCwgZmxvYXQsIGZsb2F0PjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8UmVzYW1wbGVyVHlwZT4gcmR5bigKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlc2FtcGxlclR5cGUgKj4oCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpjcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV9GTE9BVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRGcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fSElHSF9RVUFMSVRZKSkpOworICAgIHJkeW4tPnNldFNhbXBsZVJhdGUoaW5wdXRGcmVxKTsKKworICAgIC8vIGdldCBkZXNpZ24gcGFyYW1ldGVycworICAgIGNvbnN0IGludCBwaGFzZXMgPSByZHluLT5nZXRQaGFzZXMoKTsKKyAgICBjb25zdCBpbnQgaGFsZkxlbmd0aCA9IHJkeW4tPmdldEhhbGZMZW5ndGgoKTsKKyAgICBjb25zdCBmbG9hdCAqY29lZnMgPSByZHluLT5nZXRGaWx0ZXJDb2VmcygpOworICAgIGNvbnN0IGRvdWJsZSBmY3IgPSByZHluLT5nZXROb3JtYWxpemVkQ3V0b2ZmRnJlcXVlbmN5KCk7CisgICAgY29uc3QgZG91YmxlIHRidyA9IHJkeW4tPmdldE5vcm1hbGl6ZWRUcmFuc2l0aW9uQmFuZHdpZHRoKCk7CisgICAgY29uc3QgZG91YmxlIGF0dGVudWF0aW9uID0gcmR5bi0+Z2V0RmlsdGVyQXR0ZW51YXRpb24oKTsKKyAgICBjb25zdCBkb3VibGUgc3RvcGJhbmREYiA9IHJkeW4tPmdldFN0b3BiYW5kQXR0ZW51YXRpb25EYigpOworICAgIGNvbnN0IGRvdWJsZSBwYXNzYmFuZERiID0gcmR5bi0+Z2V0UGFzc2JhbmRSaXBwbGVEYigpOworICAgIGNvbnN0IGRvdWJsZSBmcCA9IGZjciAtIHRidyAvIDI7CisgICAgY29uc3QgZG91YmxlIGZzID0gZmNyICsgdGJ3IC8gMjsKKworICAgIHByaW50ZigiaW5wdXRGcmVxOiVkIG91dHB1dEZyZXE6JWQgZGVzaWduIgorICAgICAgICAgICAgIiBwaGFzZXM6JWQgaGFsZkxlbmd0aDolZCIKKyAgICAgICAgICAgICIgZmNyOiVsZiBmcDolbGYgZnM6JWxmIHRidzolbGYiCisgICAgICAgICAgICAiIGF0dGVudWF0aW9uOiVsZiBzdG9wUmlwcGxlOiUubGYgcGFzc1JpcHBsZTolbGYiCisgICAgICAgICAgICAiXG4iLAorICAgICAgICAgICAgaW5wdXRGcmVxLCBvdXRwdXRGcmVxLAorICAgICAgICAgICAgcGhhc2VzLCBoYWxmTGVuZ3RoLAorICAgICAgICAgICAgZmNyLCBmcCwgZnMsIHRidywKKyAgICAgICAgICAgIGF0dGVudWF0aW9uLCBzdG9wYmFuZERiLCBwYXNzYmFuZERiKTsKKworICAgIC8vIHZlcmlmeSBkZXNpZ24gcGFyYW1ldGVycworICAgIGNvbnN0ZXhwciBpbnQzMl90IHBhc3NTdGVwcyA9IDEwMDA7CisgICAgZG91YmxlIHBhc3NNaW4sIHBhc3NNYXgsIHBhc3NSaXBwbGUsIHN0b3BNYXgsIHN0b3BSaXBwbGU7CisgICAgYW5kcm9pZDo6dGVzdEZpcihjb2VmcywgcGhhc2VzLCBoYWxmTGVuZ3RoLCBmcCAvIHBoYXNlcywgZnMgLyBwaGFzZXMsCisgICAgICAgICAgICBwYXNzU3RlcHMsIHBoYXNlcyAqIHBhc3NTdGVwcyAvKiBzdG9wU3RlcHMgKi8sCisgICAgICAgICAgICBwYXNzTWluLCBwYXNzTWF4LCBwYXNzUmlwcGxlLAorICAgICAgICAgICAgc3RvcE1heCwgc3RvcFJpcHBsZSk7CisgICAgcHJpbnRmKCJpbnB1dEZyZXE6JWQgb3V0cHV0RnJlcTolZCB2ZXJpZnkiCisgICAgICAgICAgICAiIHBhc3NNaW46JWxmIHBhc3NNYXg6JWxmIHBhc3NSaXBwbGU6JWxmIHN0b3BNYXg6JWxmIHN0b3BSaXBwbGU6JWxmIgorICAgICAgICAgICAgIlxuIiwKKyAgICAgICAgICAgIGlucHV0RnJlcSwgb3V0cHV0RnJlcSwKKyAgICAgICAgICAgIHBhc3NNaW4sIHBhc3NNYXgsIHBhc3NSaXBwbGUsIHN0b3BNYXgsIHN0b3BSaXBwbGUpOworCisgICAgQVNTRVJUX0dUKHN0b3BSaXBwbGUsIDYwLik7ICAvLyBlbm91Z2ggc3RvcGJhbmQgYXR0ZW51YXRpb24KKyAgICBBU1NFUlRfTFQocGFzc1JpcHBsZSwgMC4yKTsgIC8vIHNtYWxsIHBhc3NiYW5kIHJpcHBsZQorICAgIEFTU0VSVF9HVChwYXNzTWluLCAwLjk5KTsgICAgLy8gd2UgZG8gbm90IGF0dGVudWF0ZSB0aGUgc2lnbmFsIChpZGVhbGx5IDEuKQorfQorCiAvKiBCdWZmZXIgaW5jcmVtZW50IHRlc3QKICAqCiAgKiBXZSBjb21wYXJlIGEgcmVmZXJlbmNlIG91dHB1dCwgd2hlcmUgd2UgY29uc3VtZSBhbmQgcHJvY2VzcyB0aGUgZW50aXJlCkBAIC00ODQsMyArNTQxLDMwIEBACiAgICAgfQogfQogCitURVNUKGF1ZGlvZmxpbmdlcl9yZXNhbXBsZXIsIGZpbHRlcnJlc3BvbnNlKSB7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBpblNhbXBsZVJhdGVzeworICAgICAgICA4MDAwLAorICAgICAgICAxMTAyNSwKKyAgICAgICAgMTIwMDAsCisgICAgICAgIDE2MDAwLAorICAgICAgICAyMjA1MCwKKyAgICAgICAgMjQwMDAsCisgICAgICAgIDMyMDAwLAorICAgICAgICA0NDEwMCwKKyAgICAgICAgNDgwMDAsCisgICAgICAgIDg4MjAwLAorICAgICAgICA5NjAwMCwKKyAgICAgICAgMTc2NDAwLAorICAgICAgICAxOTIwMDAsCisgICAgfTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IG91dFNhbXBsZVJhdGVzeworICAgICAgICA0ODAwMCwKKyAgICAgICAgOTYwMDAsCisgICAgfTsKKworICAgIGZvciAoaW50IG91dFNhbXBsZVJhdGUgOiBvdXRTYW1wbGVSYXRlcykgeworICAgICAgICBmb3IgKGludCBpblNhbXBsZVJhdGUgOiBpblNhbXBsZVJhdGVzKSB7CisgICAgICAgICAgICB0ZXN0RmlsdGVyUmVzcG9uc2UoMiAvKiBjaGFubmVscyAqLywgaW5TYW1wbGVSYXRlLCBvdXRTYW1wbGVSYXRlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy90ZXN0LW1peGVyLmNwcCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy90ZXN0LW1peGVyLmNwcAppbmRleCA3NWRiZjkxLi5iYzlkMmE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvdGVzdC1taXhlci5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL3Rlc3QtbWl4ZXIuY3BwCkBAIC0xNDMsMTAgKzE0Myw2IEBACiAgICAgICAgIHVzYWdlKHByb2duYW1lKTsKICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKICAgICB9Ci0gICAgaWYgKCh1bnNpZ25lZClhcmdjID4gQXVkaW9NaXhlcjo6TUFYX05VTV9UUkFDS1MpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJ0b28gbWFueSB0cmFja3M6ICVkID4gJXUiLCBhcmdjLCBBdWRpb01peGVyOjpNQVhfTlVNX1RSQUNLUyk7Ci0gICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Ci0gICAgfQogCiAgICAgc2l6ZV90IG91dHB1dEZyYW1lcyA9IDA7CiAKQEAgLTI0Niw5ICsyNDIsMTAgQEAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHByb3ZpZGVycy5zaXplKCk7ICsraSkgewogICAgICAgICAvL3ByaW50ZigidHJhY2sgJWQgb3V0IG9mICVkXG4iLCBpLCBwcm92aWRlcnMuc2l6ZSgpKTsKICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQocHJvdmlkZXJzW2ldLmdldE51bUNoYW5uZWxzKCkpOwotICAgICAgICBpbnQzMl90IG5hbWUgPSBtaXhlci0+Z2V0VHJhY2tOYW1lKGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgIGZvcm1hdHNbaV0sIEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCk7Ci0gICAgICAgIEFMT0dfQVNTRVJUKG5hbWUgPj0gMCk7CisgICAgICAgIGNvbnN0IGludCBuYW1lID0gaTsKKyAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0gbWl4ZXItPmNyZWF0ZSgKKyAgICAgICAgICAgICAgICBuYW1lLCBjaGFubmVsTWFzaywgZm9ybWF0c1tpXSwgQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdGF0dXMgIT0gT0spOwogICAgICAgICBuYW1lc1tpXSA9IG5hbWU7CiAgICAgICAgIG1peGVyLT5zZXRCdWZmZXJQcm92aWRlcihuYW1lLCAmcHJvdmlkZXJzW2ldKTsKICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsCkBAIC0zMTUsOSArMzEyLDEwIEBACiAgICAgd3JpdGVGaWxlKG91dHB1dEZpbGVuYW1lLCBvdXRwdXRBZGRyLAogICAgICAgICAgICAgb3V0cHV0U2FtcGxlUmF0ZSwgb3V0cHV0Q2hhbm5lbHMsIG91dHB1dEZyYW1lcywgdXNlTWl4ZXJGbG9hdCk7CiAgICAgaWYgKGF1eEZpbGVuYW1lKSB7Ci0gICAgICAgIC8vIEF1eCBidWZmZXIgaXMgYWx3YXlzIGluIHE0XzI3IGZvcm1hdCBmb3Igbm93LgotICAgICAgICAvLyBtZW1jcHlfdG9faTE2X2Zyb21fcTRfMjcoKSwgYnV0IHdpdGggc3RlcmVvIGZyYW1lIGNvdW50IChub3Qgc2FtcGxlIGNvdW50KQotICAgICAgICBkaXRoZXJBbmRDbGFtcCgoaW50MzJfdCopYXV4QWRkciwgKGludDMyX3QqKWF1eEFkZHIsIG91dHB1dEZyYW1lcyA+PiAxKTsKKyAgICAgICAgLy8gQXV4IGJ1ZmZlciBpcyBhbHdheXMgaW4gcTRfMjcgZm9ybWF0IGZvciBPIGFuZCBlYXJsaWVyLgorICAgICAgICAvLyBtZW1jcHlfdG9faTE2X2Zyb21fcTRfMjcoKGludDE2X3QqKWF1eEFkZHIsIChjb25zdCBpbnQzMl90KilhdXhBZGRyLCBvdXRwdXRGcmFtZXMpOworICAgICAgICAvLyBBdXggYnVmZmVyIGlzIGFsd2F5cyBpbiBmbG9hdCBmb3JtYXQgZm9yIFAuCisgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdCgoaW50MTZfdCopYXV4QWRkciwgKGNvbnN0IGZsb2F0KilhdXhBZGRyLCBvdXRwdXRGcmFtZXMpOwogICAgICAgICB3cml0ZUZpbGUoYXV4RmlsZW5hbWUsIGF1eEFkZHIsIG91dHB1dFNhbXBsZVJhdGUsIDEsIG91dHB1dEZyYW1lcywgZmFsc2UpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliY3B1c3RhdHMvT1dORVJTIGIvbWVkaWEvbGliY3B1c3RhdHMvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Y2I1NjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJjcHVzdGF0cy9PV05FUlMKQEAgLTAsMCArMSBAQAorZ2thc3RlbkBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL09XTkVSUyBiL21lZGlhL2xpYmVmZmVjdHMvT1dORVJTCmluZGV4IDdlM2RlMTMuLjdmOWFlODEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvT1dORVJTCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvT1dORVJTCkBAIC0xLDMgKzEsNCBAQAoraHVuZ2FAZ29vZ2xlLmNvbQoga3JvY2FyZEBnb29nbGUuY29tCiBtbmFnYW5vdkBnb29nbGUuY29tCiByYWdvQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9BbmRyb2lkLmJwCmluZGV4IDQzOThhOTEuLjNlODhjN2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvQW5kcm9pZC5icApAQCAtNSw2ICs1LDExIEBACiAKICAgICBzcmNzOiBbInNyYy9FZmZlY3RzQ29uZmlnLmNwcCJdLAogCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJ0aW55eG1sMiIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9pbmNsdWRlL21lZGlhL0VmZmVjdHNDb25maWcuaCBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL2luY2x1ZGUvbWVkaWEvRWZmZWN0c0NvbmZpZy5oCmluZGV4IDgxMTczMGMuLjU1Yjk0NmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL2luY2x1ZGUvbWVkaWEvRWZmZWN0c0NvbmZpZy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL2luY2x1ZGUvbWVkaWEvRWZmZWN0c0NvbmZpZy5oCkBAIC0zMiw4ICszMiwxMyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGVmZmVjdHNDb25maWcgewogCi0vKiogRGVmYXVsdCBwYXRoIG9mIGVmZmVjdCBjb25maWd1cmF0aW9uIGZpbGUuICovCi1jb25zdGV4cHIgY2hhciBERUZBVUxUX1BBVEhbXSA9ICIvdmVuZG9yL2V0Yy9hdWRpb19lZmZlY3RzLnhtbCI7CisvKiogRGVmYXVsdCBwYXRoIG9mIGVmZmVjdCBjb25maWd1cmF0aW9uIGZpbGUuIFJlbGF0aXZlIHRvIERFRkFVTFRfTE9DQVRJT05TLiAqLworY29uc3RleHByIGNvbnN0IGNoYXIqIERFRkFVTFRfTkFNRSA9ICJhdWRpb19lZmZlY3RzLnhtbCI7CisKKy8qKiBEZWZhdWx0IHBhdGggb2YgZWZmZWN0IGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAqIFRoZSAvdmVuZG9yIHBhcnRpdGlvbiBpcyB0aGUgcmVjb21tZW5kZWQgb25lLCB0aGUgb3RoZXJzIGFyZSBkZXByZWNhdGVkLgorICovCitjb25zdGV4cHIgY29uc3QgY2hhciogREVGQVVMVF9MT0NBVElPTlNbXSA9IHsiL29kbS9ldGMiLCAiL3ZlbmRvci9ldGMiLCAiL3N5c3RlbS9ldGMifTsKIAogLyoqIERpcmVjdG9yaWVzIHdoZXJlIHRoZSBlZmZlY3QgbGlicmFyaWVzIHdpbGwgYmUgc2VhcmNoIGZvci4gKi8KIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBMRF9FRkZFQ1RfTElCUkFSWV9QQVRIW10gPQpAQCAtOTEsMTMgKzk2LDE2IEBACiAgICAgLyoqIFBhcnNlZCBjb25maWcsIG51bGxwdHIgaWYgdGhlIHhtbCBsaWIgY291bGQgbm90IGxvYWQgdGhlIGZpbGUgKi8KICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlnPiBwYXJzZWRDb25maWc7CiAgICAgc2l6ZV90IG5iU2tpcHBlZEVsZW1lbnQ7IC8vPCBOdW1iZXIgb2Ygc2tpcHBlZCBpbnZhbGlkIGxpYnJhcnksIGVmZmVjdCBvciBwcm9jZXNzaW5nIGNoYWluCisgICAgY29uc3QgY2hhciogY29uZmlnUGF0aDsgLy88IFBhdGggdG8gdGhlIGxvYWRlZCBjb25maWd1cmF0aW9uCiB9OwogCiAvKiogUGFyc2VzIHRoZSBwcm92aWRlZCBlZmZlY3QgY29uZmlndXJhdGlvbi4KICAqIFBhcnNpbmcgZG8gbm90IHN0b3Agb2YgZmlyc3QgaW52YWxpZCBlbGVtZW50LCBidXQgY29udGludWVzIHRvIHRoZSBuZXh0LgorICogQHBhcmFtW2luXSBwYXRoIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgZG8gbG9hZAorICogICAgICAgICAgICAgICAgIGlmIG51bGxwdHIsIGxvb2sgZm9yIERFRkFVTFRfTkFNRSBpbiBERUZBVUxUX0xPQ0FUSU9OUy4KICAqIEBzZWUgUGFyc2luZ1Jlc3VsdDo6bmJTa2lwcGVkRWxlbWVudAogICovCi1QYXJzaW5nUmVzdWx0IHBhcnNlKGNvbnN0IGNoYXIqIHBhdGggPSBERUZBVUxUX1BBVEgpOworUGFyc2luZ1Jlc3VsdCBwYXJzZShjb25zdCBjaGFyKiBwYXRoID0gbnVsbHB0cik7CiAKIH0gLy8gbmFtZXNwYWNlIGVmZmVjdHNDb25maWcKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL3NyYy9FZmZlY3RzQ29uZmlnLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL3NyYy9FZmZlY3RzQ29uZmlnLmNwcAppbmRleCA5NzQ2MmY4Li5kNzk1MDFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9zcmMvRWZmZWN0c0NvbmZpZy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvc3JjL0VmZmVjdHNDb25maWcuY3BwCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8Y3N0ZGludD4KICNpbmNsdWRlIDxmdW5jdGlvbmFsPgogI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPHRpbnl4bWwyLmg+CiAjaW5jbHVkZSA8bG9nL2xvZy5oPgpAQCAtODUsNyArODYsNyBAQAogY29uc3RleHByIHN0ZDo6ZW5hYmxlX2lmPGZhbHNlLCBFbnVtPiBTVFJFQU1fTkFNRV9NQVA7CiAKIC8qKiBBbGwgb3V0cHV0IHN0cmVhbSB0eXBlcyB3aGljaCBzdXBwb3J0IGVmZmVjdHMuCi0gKiBUaGlzIG5lZWQgdG8gYmUga2VwdCBpbiBzaW5rIHdpdGggdGhlIHhzZCBzdHJlYW1PdXRwdXRUeXBlLgorICogVGhpcyBuZWVkIHRvIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSB4c2Qgc3RyZWFtT3V0cHV0VHlwZS4KICAqLwogdGVtcGxhdGUgPD4KIGNvbnN0ZXhwciBzdGQ6OnBhaXI8YXVkaW9fc3RyZWFtX3R5cGVfdCwgY29uc3QgY2hhcio+IFNUUkVBTV9OQU1FX01BUDxhdWRpb19zdHJlYW1fdHlwZV90PltdID0gewpAQCAtMTAyLDcgKzEwMyw3IEBACiB9OwogCiAvKiogQWxsIGlucHV0IHN0cmVhbSB0eXBlcyB3aGljaCBzdXBwb3J0IGVmZmVjdHMuCi0gKiBUaGlzIG5lZWQgdG8gYmUga2VwdCBpbiBzaW5rIHdpdGggdGhlIHhzZCBzdHJlYW1PdXRwdXRUeXBlLgorICogVGhpcyBuZWVkIHRvIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSB4c2Qgc3RyZWFtT3V0cHV0VHlwZS4KICAqLwogdGVtcGxhdGUgPD4KIGNvbnN0ZXhwciBzdGQ6OnBhaXI8YXVkaW9fc291cmNlX3QsIGNvbnN0IGNoYXIqPiBTVFJFQU1fTkFNRV9NQVA8YXVkaW9fc291cmNlX3Q+W10gPSB7CkBAIC0xNDIsNyArMTQzLDcgQEAKIH0KIAogLyoqIEZpbmQgYW4gZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24gYnkgaXRzIG5hbWUuCi0gKiBAcmV0dXJuIG51bGxwdHIgaWYgbm90IGZvdW5kLCB0aGUgZWxsZW1lbnRzIGFkZHJlc3MgaWYgZm91bmQuCisgKiBAcmV0dXJuIG51bGxwdHIgaWYgbm90IGZvdW5kLCB0aGUgZWxlbWVudCBhZGRyZXNzIGlmIGZvdW5kLgogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgVD4KIFQqIGZpbmRCeU5hbWUoY29uc3QgY2hhciogbmFtZSwgc3RkOjp2ZWN0b3I8VD4mIGNvbGxlY3Rpb24pIHsKQEAgLTIwMiw3ICsyMDMsNyBAQAogICAgICAgICBhdXRvIHBhcnNlUHJveHkgPSBbJnhtbEVmZmVjdCwgJnBhcnNlSW1wbF0oY29uc3QgY2hhciogdGFnLCBFZmZlY3RJbXBsJiBwcm94eUxpYikgewogICAgICAgICAgICAgYXV0byogeG1sUHJveHlMaWIgPSB4bWxFZmZlY3QuRmlyc3RDaGlsZEVsZW1lbnQodGFnKTsKICAgICAgICAgICAgIGlmICh4bWxQcm94eUxpYiA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImVmZmVjdFByb3h5IG11c3QgY29udGFpbiBhIDwlcz46ICVzIiwgdGFnLCBkdW1wKCp4bWxQcm94eUxpYikpOworICAgICAgICAgICAgICAgIEFMT0dFKCJlZmZlY3RQcm94eSBtdXN0IGNvbnRhaW4gYSA8JXM+OiAlcyIsIHRhZywgZHVtcCh4bWxFZmZlY3QpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbXBsKCp4bWxQcm94eUxpYiwgcHJveHlMaWIpOwpAQCAtMjQ5LDE1ICsyNTAsMTQgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotfTsgLy8gbmFtZXNwYWNlCi0KLVBhcnNpbmdSZXN1bHQgcGFyc2UoY29uc3QgY2hhciogcGF0aCkgeworLyoqIEludGVybmFsIHZlcnNpb24gb2YgdGhlIHB1YmxpYyBwYXJzZShjb25zdCBjaGFyKiBwYXRoKSB3aXRoIHByZWNvbmRpdGlvbiBgcGF0aCAhPSBudWxscHRyYC4gKi8KK1BhcnNpbmdSZXN1bHQgcGFyc2VXaXRoUGF0aChjb25zdCBjaGFyKiBwYXRoKSB7CiAgICAgWE1MRG9jdW1lbnQgZG9jOwogICAgIGRvYy5Mb2FkRmlsZShwYXRoKTsKICAgICBpZiAoZG9jLkVycm9yKCkpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBwYXJzZSAlczogVGlueXhtbDIgZXJyb3IgKCVkKTogJXMgJXMiLCBwYXRoLAotICAgICAgICAgICAgICBkb2MuRXJyb3JJRCgpLCBkb2MuR2V0RXJyb3JTdHIxKCksIGRvYy5HZXRFcnJvclN0cjIoKSk7Ci0gICAgICAgIHJldHVybiB7bnVsbHB0ciwgMH07CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcGFyc2UgJXM6IFRpbnl4bWwyIGVycm9yICglZCk6ICVzIiwgcGF0aCwKKyAgICAgICAgICAgICAgZG9jLkVycm9ySUQoKSwgZG9jLkVycm9yU3RyKCkpOworICAgICAgICByZXR1cm4ge251bGxwdHIsIDAsIHBhdGh9OwogICAgIH0KIAogICAgIGF1dG8gY29uZmlnID0gc3RkOjptYWtlX3VuaXF1ZTxDb25maWc+KCk7CkBAIC0yOTUsNyArMjk1LDI5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHtzdGQ6Om1vdmUoY29uZmlnKSwgbmJTa2lwcGVkRWxlbWVudHN9OworICAgIHJldHVybiB7c3RkOjptb3ZlKGNvbmZpZyksIG5iU2tpcHBlZEVsZW1lbnRzLCBwYXRofTsKK30KKworfTsgLy8gbmFtZXNwYWNlCisKK1BhcnNpbmdSZXN1bHQgcGFyc2UoY29uc3QgY2hhciogcGF0aCkgeworICAgIGlmIChwYXRoICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlV2l0aFBhdGgocGF0aCk7CisgICAgfQorCisgICAgZm9yIChzdGQ6OnN0cmluZyBsb2NhdGlvbiA6IERFRkFVTFRfTE9DQVRJT05TKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGRlZmF1bHRQYXRoID0gbG9jYXRpb24gKyAnLycgKyBERUZBVUxUX05BTUU7CisgICAgICAgIGlmIChhY2Nlc3MoZGVmYXVsdFBhdGguY19zdHIoKSwgUl9PSykgIT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgYXV0byByZXN1bHQgPSBwYXJzZVdpdGhQYXRoKGRlZmF1bHRQYXRoLmNfc3RyKCkpOworICAgICAgICBpZiAocmVzdWx0LnBhcnNlZENvbmZpZyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR0UoIkNvdWxkIG5vdCBwYXJzZSBlZmZlY3QgY29uZmlndXJhdGlvbiBpbiBhbnkgb2YgdGhlIGRlZmF1bHQgbG9jYXRpb25zLiIpOworICAgIHJldHVybiB7bnVsbHB0ciwgMCwgbnVsbHB0cn07CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGVmZmVjdHNDb25maWcKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZGF0YS9hdWRpb19lZmZlY3RzLmNvbmYgYi9tZWRpYS9saWJlZmZlY3RzL2RhdGEvYXVkaW9fZWZmZWN0cy5jb25mCmluZGV4IDE0YTE3MWIuLmRkNzI5YzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZGF0YS9hdWRpb19lZmZlY3RzLmNvbmYKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kYXRhL2F1ZGlvX2VmZmVjdHMuY29uZgpAQCAtMzgsNiArMzgsOSBAQAogICBsb3VkbmVzc19lbmhhbmNlciB7CiAgICAgcGF0aCAvdmVuZG9yL2xpYi9zb3VuZGZ4L2xpYmxkbmhuY3Iuc28KICAgfQorICBkeW5hbWljc19wcm9jZXNzaW5nIHsKKyAgICBwYXRoIC92ZW5kb3IvbGliL3NvdW5kZngvbGliZHlucHJvYy5zbworICB9CiB9CiAKICMgRGVmYXVsdCBwcmUtcHJvY2Vzc2luZyBsaWJyYXJ5LiBBZGQgdG8gYXVkaW9fZWZmZWN0LmNvbmYgImxpYnJhcmllcyIgc2VjdGlvbiBpZgpAQCAtMTI5LDYgKzEzMiwxMCBAQAogICAgIGxpYnJhcnkgbG91ZG5lc3NfZW5oYW5jZXIKICAgICB1dWlkIGZhNDE1MzI5LTIwMzQtNGJlYS1iNWRjLTViMzgxYzhkMWUyYwogICB9CisgIGR5bmFtaWNzX3Byb2Nlc3NpbmcgeworICAgIGxpYnJhcnkgZHluYW1pY3NfcHJvY2Vzc2luZworICAgIHV1aWQgZTBlNjUzOWItMTc4MS03MjYxLTY3NmYtNmQ3NTczNjk2MzQwCisgIH0KIH0KIAogIyBEZWZhdWx0IHByZS1wcm9jZXNzaW5nIGVmZmVjdHMuIEFkZCB0byBhdWRpb19lZmZlY3QuY29uZiAiZWZmZWN0cyIgc2VjdGlvbiBpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9keW5hbWljc3Byb2MvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvZHluYW1pY3Nwcm9jL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JlMGM0OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZHluYW1pY3Nwcm9jL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0MyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKKyMgRHluYW1pY3NQcm9jZXNzaW5nIGxpYnJhcnkKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKKworRUlHRU5fUEFUSCA6PSBleHRlcm5hbC9laWdlbgorTE9DQUxfQ19JTkNMVURFUyArPSAkKEVJR0VOX1BBVEgpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKyAgICBFZmZlY3REeW5hbWljc1Byb2Nlc3NpbmcuY3BwIFwKKyAgICBkc3AvRFBCYXNlLmNwcCBcCisgICAgZHNwL0RQRnJlcXVlbmN5LmNwcAorCitMT0NBTF9DRkxBR1MrPSAtTzIgLWZ2aXNpYmlsaXR5PWhpZGRlbgorTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGliY3V0aWxzIFwKKyAgICBsaWJsb2cgXAorCitMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBzb3VuZGZ4CitMT0NBTF9NT0RVTEU6PSBsaWJkeW5wcm9jCisKK0xPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmF1ZGlvZWZmZWN0cworCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9FZmZlY3REeW5hbWljc1Byb2Nlc3NpbmcuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9keW5hbWljc3Byb2MvRWZmZWN0RHluYW1pY3NQcm9jZXNzaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTM4M2ViCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9keW5hbWljc3Byb2MvRWZmZWN0RHluYW1pY3NQcm9jZXNzaW5nLmNwcApAQCAtMCwwICsxLDEyNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkVmZmVjdERQIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxuZXc+CisKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9keW5hbWljc3Byb2Nlc3NpbmcuaD4KKyNpbmNsdWRlIDxkc3AvRFBCYXNlLmg+CisjaW5jbHVkZSA8ZHNwL0RQRnJlcXVlbmN5Lmg+CisKKy8vI2RlZmluZSBWRVJZX1ZFUllfVkVSQk9TRV9MT0dHSU5HCisjaWZkZWYgVkVSWV9WRVJZX1ZFUkJPU0VfTE9HR0lORworI2RlZmluZSBBTE9HVlYgQUxPR1YKKyNlbHNlCisjZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUgKGZhbHNlKQorI2VuZGlmCisKKy8vIHVuaW9uIHRvIGhvbGQgY29tbWFuZCB2YWx1ZXMKK3VzaW5nIHZhbHVlX3QgPSB1bmlvbiB7CisgICAgaW50MzJfdCBpOworICAgIGZsb2F0IGY7Cit9OworCisvLyBlZmZlY3RfaGFuZGxlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBEUCBlZmZlY3QKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIGdEUEludGVyZmFjZTsKKworLy8gQU9TUCBEeW5hbWljcyBQcm9jZXNzaW5nIFVVSUQ6IGUwZTY1MzliLTE3ODEtNzI2MS02NzZmLTZkNzU3MzY5NjM0MAorY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBnRFBEZXNjcmlwdG9yID0geworICAgICAgICB7MHg3MjYxNjc2ZiwgMHg2ZDc1LCAweDczNjksIDB4NjM2NCwgezB4MjgsIDB4ZTIsIDB4ZmQsIDB4M2EsIDB4YzMsIDB4OWV9fSwgLy8gdHlwZQorICAgICAgICB7MHhlMGU2NTM5YiwgMHgxNzgxLCAweDcyNjEsIDB4Njc2ZiwgezB4NmQsIDB4NzUsIDB4NzMsIDB4NjksIDB4NjMsIDB4NDB9fSwgLy8gdXVpZAorICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKKyAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUIHwgRUZGRUNUX0ZMQUdfSU5TRVJUX0ZJUlNUKSwKKyAgICAgICAgMCwgLy8gVE9ETworICAgICAgICAxLAorICAgICAgICAiRHluYW1pY3MgUHJvY2Vzc2luZyIsCisgICAgICAgICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IiwKK307CisKK2VudW0gZHBfc3RhdGVfZSB7CisgICAgRFlOQU1JQ1NfUFJPQ0VTU0lOR19TVEFURV9VTklOSVRJQUxJWkVELAorICAgIERZTkFNSUNTX1BST0NFU1NJTkdfU1RBVEVfSU5JVElBTElaRUQsCisgICAgRFlOQU1JQ1NfUFJPQ0VTU0lOR19TVEFURV9BQ1RJVkUsCit9OworCitzdHJ1Y3QgRHluYW1pY3NQcm9jZXNzaW5nQ29udGV4dCB7CisgICAgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyAqbUl0ZmU7CisgICAgZWZmZWN0X2NvbmZpZ190IG1Db25maWc7CisgICAgdWludDhfdCBtU3RhdGU7CisKKyAgICBkcF9meDo6RFBCYXNlICogbVBEeW5hbWljczsgLy90aGUgZWZmZWN0IChvciBjdXJyZW50IGVmZmVjdCkKKyAgICBpbnQzMl90IG1DdXJyZW50VmFyaWFudDsKKyAgICBmbG9hdCBtUHJlZmVycmVkRnJhbWVEdXJhdGlvbjsKK307CisKKy8vIFRoZSB2YWx1ZSBvZmZzZXQgb2YgYW4gZWZmZWN0IHBhcmFtZXRlciBpcyBjb21wdXRlZCBieSByb3VuZGluZyB1cAorLy8gdGhlIHBhcmFtZXRlciBzaXplIHRvIHRoZSBuZXh0IDMyIGJpdCBhbGlnbm1lbnQuCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGNvbXB1dGVQYXJhbVZPZmZzZXQoY29uc3QgZWZmZWN0X3BhcmFtX3QgKnApIHsKKyAgICByZXR1cm4gKChwLT5wc2l6ZSArIHNpemVvZihpbnQzMl90KSAtIDEpIC8gc2l6ZW9mKGludDMyX3QpKSAqCisgICAgICAgICAgICBzaXplb2YoaW50MzJfdCk7Cit9CisKKy8vLS0tIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKK2ludCBEUF9zZXRQYXJhbWV0ZXIoRHluYW1pY3NQcm9jZXNzaW5nQ29udGV4dCAqcENvbnRleHQsCisgICAgICAgIHVpbnQzMl90IHBhcmFtU2l6ZSwKKyAgICAgICAgdm9pZCAqcFBhcmFtLAorICAgICAgICB1aW50MzJfdCB2YWx1ZVNpemUsCisgICAgICAgIHZvaWQgKnBWYWx1ZSk7CitpbnQgRFBfZ2V0UGFyYW1ldGVyKER5bmFtaWNzUHJvY2Vzc2luZ0NvbnRleHQgKnBDb250ZXh0LAorICAgICAgICB1aW50MzJfdCBwYXJhbVNpemUsCisgICAgICAgIHZvaWQgKnBQYXJhbSwKKyAgICAgICAgdWludDMyX3QgKnBWYWx1ZVNpemUsCisgICAgICAgIHZvaWQgKnBWYWx1ZSk7CitpbnQgRFBfZ2V0UGFyYW1ldGVyQ21kU2l6ZSh1aW50MzJfdCBwYXJhbVNpemUsCisgICAgICAgIHZvaWQgKnBQYXJhbSk7Cit2b2lkIERQX2V4cGVjdGVkUGFyYW1WYWx1ZVNpemVzKHVpbnQzMl90IHBhcmFtU2l6ZSwKKyAgICAgICAgdm9pZCAqcFBhcmFtLAorICAgICAgICBib29sIGlzU2V0LAorICAgICAgICB1aW50MzJfdCAqcENtZFNpemUsCisgICAgICAgIHVpbnQzMl90ICpwVmFsdWVTaXplKTsKKy8vCisvLy0tLSBMb2NhbCBmdW5jdGlvbnMgKG5vdCBkaXJlY3RseSB1c2VkIGJ5IGVmZmVjdCBpbnRlcmZhY2UpCisvLworCit2b2lkIERQX3Jlc2V0KER5bmFtaWNzUHJvY2Vzc2luZ0NvbnRleHQgKnBDb250ZXh0KQoreworICAgIEFMT0dWKCI+IERQX3Jlc2V0KCVwKSIsIHBDb250ZXh0KTsKKyAgICBpZiAocENvbnRleHQtPm1QRHluYW1pY3MgIT0gTlVMTCkgeworICAgICAgICBwQ29udGV4dC0+bVBEeW5hbWljcy0+cmVzZXQoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRFBfcmVzZXQoJXApOiBudWxsIER5bmFtaWNzUHJvY2Vzc2luZyIsIHBDb250ZXh0KTsKKyAgICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRFBfc2V0Q29uZmlnKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZTogU2V0IGlucHV0IGFuZCBvdXRwdXQgYXVkaW8gY29uZmlndXJhdGlvbi4KKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLyAgcENvbmZpZzogICAgcG9pbnRlciB0byBlZmZlY3RfY29uZmlnX3Qgc3RydWN0dXJlIGhvbGRpbmcgaW5wdXQgYW5kIG91dHB1dAorLy8gICAgICBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgRFBfc2V0Q29uZmlnKER5bmFtaWNzUHJvY2Vzc2luZ0NvbnRleHQgKnBDb250ZXh0LCBlZmZlY3RfY29uZmlnX3QgKnBDb25maWcpCit7CisgICAgQUxPR1YoIkRQX3NldENvbmZpZyglcCkiLCBwQ29udGV4dCk7CisKKyAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlICE9IHBDb25maWctPm91dHB1dENmZy5zYW1wbGluZ1JhdGUpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyAhPSBwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0gcENvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCkgcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlICE9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFICYmCisgICAgICAgICAgICBwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSAhPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHJldHVybiAtRUlOVkFMOworCisgICAgcENvbnRleHQtPm1Db25maWcgPSAqcENvbmZpZzsKKworICAgIERQX3Jlc2V0KHBDb250ZXh0KTsKKworICAgIHJldHVybiAwOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERQX2dldENvbmZpZygpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6IEdldCBpbnB1dCBhbmQgb3V0cHV0IGF1ZGlvIGNvbmZpZ3VyYXRpb24uCisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8gIHBDb25maWc6ICAgIHBvaW50ZXIgdG8gZWZmZWN0X2NvbmZpZ190IHN0cnVjdHVyZSBob2xkaW5nIGlucHV0IGFuZCBvdXRwdXQKKy8vICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisvLworLy8gT3V0cHV0czoKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBEUF9nZXRDb25maWcoRHluYW1pY3NQcm9jZXNzaW5nQ29udGV4dCAqcENvbnRleHQsIGVmZmVjdF9jb25maWdfdCAqcENvbmZpZykKK3sKKyAgICAqcENvbmZpZyA9IHBDb250ZXh0LT5tQ29uZmlnOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERQX2luaXQoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOiBJbml0aWFsaXplIGVuZ2luZSB3aXRoIGRlZmF1bHQgY29uZmlndXJhdGlvbi4KKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLworLy8gT3V0cHV0czoKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IERQX2luaXQoRHluYW1pY3NQcm9jZXNzaW5nQ29udGV4dCAqcENvbnRleHQpCit7CisgICAgQUxPR1YoIkRQX2luaXQoJXApIiwgcENvbnRleHQpOworCisgICAgcENvbnRleHQtPm1JdGZlID0gJmdEUEludGVyZmFjZTsKKyAgICBwQ29udGV4dC0+bVBEeW5hbWljcyA9IE5VTEw7CisgICAgcENvbnRleHQtPm1TdGF0ZSA9IERZTkFNSUNTX1BST0NFU1NJTkdfU1RBVEVfVU5JTklUSUFMSVpFRDsKKworICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOworICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gNDgwMDA7CisgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOworICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEU7CisgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSA0ODAwMDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CisgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IE5VTEw7CisgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKworICAgIHBDb250ZXh0LT5tQ3VycmVudFZhcmlhbnQgPSAtMTsgLy9ub25lCisgICAgcENvbnRleHQtPm1QcmVmZXJyZWRGcmFtZUR1cmF0aW9uID0gMDsgLy9ub25lCisKKyAgICBEUF9zZXRDb25maWcocENvbnRleHQsICZwQ29udGV4dC0+bUNvbmZpZyk7CisgICAgcENvbnRleHQtPm1TdGF0ZSA9IERZTkFNSUNTX1BST0NFU1NJTkdfU1RBVEVfSU5JVElBTElaRUQ7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgRFBfY2hhbmdlVmFyaWFudChEeW5hbWljc1Byb2Nlc3NpbmdDb250ZXh0ICpwQ29udGV4dCwgaW50IG5ld1ZhcmlhbnQpIHsKKyAgICBBTE9HVigiRFBfY2hhbmdlVmFyaWFudCBmcm9tICVkIHRvICVkIiwgcENvbnRleHQtPm1DdXJyZW50VmFyaWFudCwgbmV3VmFyaWFudCk7CisgICAgc3dpdGNoKG5ld1ZhcmlhbnQpIHsKKyAgICBjYXNlIFZBUklBTlRfRkFWT1JfRlJFUVVFTkNZX1JFU09MVVRJT046IHsKKyAgICAgICAgcENvbnRleHQtPm1DdXJyZW50VmFyaWFudCA9IFZBUklBTlRfRkFWT1JfRlJFUVVFTkNZX1JFU09MVVRJT047CisgICAgICAgIGRlbGV0ZSBwQ29udGV4dC0+bVBEeW5hbWljczsKKyAgICAgICAgcENvbnRleHQtPm1QRHluYW1pY3MgPSBuZXcgZHBfZng6OkRQRnJlcXVlbmN5KCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICAgIEFMT0dXKCJEeW5hbWljc1Byb2Nlc3NpbmcgdmFyaWFudCAlZCBub3QgYXZhaWxhYmxlIGZvciBjcmVhdGlvbiIsIG5ld1ZhcmlhbnQpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgfSAvL3N3aXRjaAorfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNQb3dlck9mMih1bnNpZ25lZCBsb25nIG4pIHsKKyAgICByZXR1cm4gKG4gJiAobiAtIDEpKSA9PSAwOworfQorCit2b2lkIERQX2NvbmZpZ3VyZVZhcmlhbnQoRHluYW1pY3NQcm9jZXNzaW5nQ29udGV4dCAqcENvbnRleHQsIGludCBuZXdWYXJpYW50KSB7CisgICAgQUxPR1YoIkRQX2NvbmZpZ3VyZVZhcmlhbnQgJWQiLCBuZXdWYXJpYW50KTsKKyAgICBzd2l0Y2gobmV3VmFyaWFudCkgeworICAgIGNhc2UgVkFSSUFOVF9GQVZPUl9GUkVRVUVOQ1lfUkVTT0xVVElPTjogeworICAgICAgICBpbnQzMl90IG1pbkJsb2NrU2l6ZSA9IChpbnQzMl90KWRwX2Z4OjpEUEZyZXF1ZW5jeTo6Z2V0TWluQm9ja1NpemUoKTsKKyAgICAgICAgaW50MzJfdCBkZXNpcmVkQmxvY2sgPSBwQ29udGV4dC0+bVByZWZlcnJlZEZyYW1lRHVyYXRpb24gKgorICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSAvIDEwMDAuMGY7CisgICAgICAgIGludDMyX3QgY3VycmVudEJsb2NrID0gZGVzaXJlZEJsb2NrOworICAgICAgICBBTE9HVigiIHNhbXBsaW5nIHJhdGU6ICVkLCBkZXNpcmVkQmxvY2sgc2l6ZSAlMC4yZiAoJWQpIHNhbXBsZXMiLAorICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSwgcENvbnRleHQtPm1QcmVmZXJyZWRGcmFtZUR1cmF0aW9uLAorICAgICAgICAgICAgICAgIGRlc2lyZWRCbG9jayk7CisgICAgICAgIGlmIChkZXNpcmVkQmxvY2sgPCBtaW5CbG9ja1NpemUpIHsKKyAgICAgICAgICAgIGN1cnJlbnRCbG9jayA9IG1pbkJsb2NrU2l6ZTsKKyAgICAgICAgfSBlbHNlIGlmICghaXNQb3dlck9mMihkZXNpcmVkQmxvY2spKSB7CisgICAgICAgICAgICAvL2ZpbmQgbmV4dCBoaWdoZXN0IHBvd2VyIG9mIDIuCisgICAgICAgICAgICBjdXJyZW50QmxvY2sgPSAxIDw8ICgzMiAtIF9fYnVpbHRpbl9jbHooZGVzaXJlZEJsb2NrKSk7CisgICAgICAgIH0KKyAgICAgICAgKChkcF9meDo6RFBGcmVxdWVuY3kqKXBDb250ZXh0LT5tUER5bmFtaWNzKS0+Y29uZmlndXJlKGN1cnJlbnRCbG9jaywKKyAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2svMiwKKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgICBBTE9HRSgiRHluYW1pY3NQcm9jZXNzaW5nIHZhcmlhbnQgJWQgbm90IGF2YWlsYWJsZSB0byBjb25maWd1cmUiLCBuZXdWYXJpYW50KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIH0KK30KKworLy8KKy8vLS0tIEVmZmVjdCBMaWJyYXJ5IEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbgorLy8KKworaW50IERQTGliX1JlbGVhc2UoZWZmZWN0X2hhbmRsZV90IGhhbmRsZSkgeworICAgIER5bmFtaWNzUHJvY2Vzc2luZ0NvbnRleHQgKiBwQ29udGV4dCA9IChEeW5hbWljc1Byb2Nlc3NpbmdDb250ZXh0ICopaGFuZGxlOworCisgICAgQUxPR1YoIkRQTGliX1JlbGVhc2UgJXAiLCBoYW5kbGUpOworICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBkZWxldGUgcENvbnRleHQtPm1QRHluYW1pY3M7CisgICAgZGVsZXRlIHBDb250ZXh0OworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBEUExpYl9DcmVhdGUoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JZCBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlvSWQgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2hhbmRsZV90ICpwSGFuZGxlKSB7CisgICAgQUxPR1YoIkRQTGliX0NyZWF0ZSgpIik7CisKKyAgICBpZiAocEhhbmRsZSA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAobWVtY21wKHV1aWQsICZnRFBEZXNjcmlwdG9yLnV1aWQsIHNpemVvZigqdXVpZCkpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgRHluYW1pY3NQcm9jZXNzaW5nQ29udGV4dCAqcENvbnRleHQgPSBuZXcgRHluYW1pY3NQcm9jZXNzaW5nQ29udGV4dDsKKyAgICAqcEhhbmRsZSA9IChlZmZlY3RfaGFuZGxlX3QpcENvbnRleHQ7CisgICAgaW50IHJldCA9IERQX2luaXQocENvbnRleHQpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIEFMT0dXKCJEUExpYl9DcmVhdGUoKSBpbml0IGZhaWxlZCIpOworICAgICAgICBEUExpYl9SZWxlYXNlKCpwSGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBBTE9HVigiRFBMaWJfQ3JlYXRlIGNvbnRleHQgaXMgJXAiLCBwQ29udGV4dCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBEUExpYl9HZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CisKKyAgICBpZiAocERlc2NyaXB0b3IgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpeworICAgICAgICBBTE9HRSgiRFBMaWJfR2V0RGVzY3JpcHRvcigpIGNhbGxlZCB3aXRoIE5VTEwgcG9pbnRlciIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAobWVtY21wKHV1aWQsICZnRFBEZXNjcmlwdG9yLnV1aWQsIHNpemVvZigqdXVpZCkpID09IDApIHsKKyAgICAgICAgKnBEZXNjcmlwdG9yID0gZ0RQRGVzY3JpcHRvcjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIC1FSU5WQUw7Cit9IC8qIGVuZCBEUExpYl9HZXREZXNjcmlwdG9yICovCisKKy8vCisvLy0tLSBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb24KKy8vCitpbnQgRFBfcHJvY2VzcyhlZmZlY3RfaGFuZGxlX3Qgc2VsZiwgYXVkaW9fYnVmZmVyX3QgKmluQnVmZmVyLAorICAgICAgICBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKSB7CisgICAgRHluYW1pY3NQcm9jZXNzaW5nQ29udGV4dCAqIHBDb250ZXh0ID0gKER5bmFtaWNzUHJvY2Vzc2luZ0NvbnRleHQgKilzZWxmOworCisgICAgaWYgKHBDb250ZXh0ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkRQX3Byb2Nlc3MoKSBjYWxsZWQgd2l0aCBOVUxMIGNvbnRleHQiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKGluQnVmZmVyID09IE5VTEwgfHwgaW5CdWZmZXItPnJhdyA9PSBOVUxMIHx8CisgICAgICAgIG91dEJ1ZmZlciA9PSBOVUxMIHx8IG91dEJ1ZmZlci0+cmF3ID09IE5VTEwgfHwKKyAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQgIT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50IHx8CisgICAgICAgIGluQnVmZmVyLT5mcmFtZUNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR0UoImluQnVmZmVyIG9yIG91dEJ1ZmZlciBhcmUgTlVMTCBvciBoYXZlIHByb2JsZW1zIHdpdGggZnJhbWUgY291bnQiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGlmIChwQ29udGV4dC0+bVN0YXRlICE9IERZTkFNSUNTX1BST0NFU1NJTkdfU1RBVEVfQUNUSVZFKSB7CisgICAgICAgIEFMT0dFKCJtU3RhdGUgaXMgbm90IERZTkFNSUNTX1BST0NFU1NJTkdfU1RBVEVfQUNUSVZFLiBDdXJyZW50IG1TdGF0ZSAlZCIsCisgICAgICAgICAgICAgICAgcENvbnRleHQtPm1TdGF0ZSk7CisgICAgICAgIHJldHVybiAtRU5PREFUQTsKKyAgICB9CisgICAgLy9pZiBkeW5hbWljcyBleGlzdC4uLgorICAgIGlmIChwQ29udGV4dC0+bVBEeW5hbWljcyAhPSBOVUxMKSB7CisgICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gKGludDMyX3QpYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKAorICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMpOworICAgICAgICBwQ29udGV4dC0+bVBEeW5hbWljcy0+cHJvY2Vzc1NhbXBsZXMoaW5CdWZmZXItPmYzMiwgaW5CdWZmZXItPmYzMiwKKyAgICAgICAgICAgICAgICBpbkJ1ZmZlci0+ZnJhbWVDb3VudCAqIGNoYW5uZWxDb3VudCk7CisKKyAgICAgICAgaWYgKGluQnVmZmVyLT5yYXcgIT0gb3V0QnVmZmVyLT5yYXcpIHsKKyAgICAgICAgICAgIGlmIChwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiBjaGFubmVsQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmYzMltpXSArPSBpbkJ1ZmZlci0+ZjMyW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KG91dEJ1ZmZlci0+cmF3LCBpbkJ1ZmZlci0+cmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogY2hhbm5lbENvdW50ICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvL2RvIG5vdGhpbmcuIG5vIGVmZmVjdCBjcmVhdGVkIHlldC4gd2FybmluZy4KKyAgICAgICAgQUxPR1coIldhcm5pbmc6IG5vIER5bmFtaWNzUHJvY2Vzc2luZyBlbmdpbmUgYXZhaWxhYmxlIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IERQX2NvbW1hbmQoZWZmZWN0X2hhbmRsZV90IHNlbGYsIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsCisgICAgICAgIHZvaWQgKnBDbWREYXRhLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7CisKKyAgICBEeW5hbWljc1Byb2Nlc3NpbmdDb250ZXh0ICogcENvbnRleHQgPSAoRHluYW1pY3NQcm9jZXNzaW5nQ29udGV4dCAqKXNlbGY7CisKKyAgICBpZiAocENvbnRleHQgPT0gTlVMTCB8fCBwQ29udGV4dC0+bVN0YXRlID09IERZTkFNSUNTX1BST0NFU1NJTkdfU1RBVEVfVU5JTklUSUFMSVpFRCkgeworICAgICAgICBBTE9HRSgiRFBfY29tbWFuZCgpIGNhbGxlZCB3aXRoIE5VTEwgY29udGV4dCBvciB1bmluaXRpYWxpemVkIHN0YXRlLiIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBBTE9HVigiRFBfY29tbWFuZCBjb21tYW5kICVkIGNtZFNpemUgJWQiLGNtZENvZGUsIGNtZFNpemUpOworICAgIHN3aXRjaCAoY21kQ29kZSkgeworICAgIGNhc2UgRUZGRUNUX0NNRF9JTklUOgorICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFRkZFQ1RfQ01EX0lOSVQgd3JvbmcgcmVwbHlEYXRhIG9yIHJlcHlTaXplIik7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICAqKGludCAqKSBwUmVwbHlEYXRhID0gRFBfaW5pdChwQ29udGV4dCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfQ09ORklHOgorICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpCisgICAgICAgICAgICAgICAgfHwgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFRkZFQ1RfQ01EX1NFVF9DT05GSUcgZXJyb3Igd2l0aCBwQ21kRGF0YSwgY21kU2l6ZSwgcFJlcGx5RGF0YSBvciByZXBseVNpemUiKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgICooaW50ICopIHBSZXBseURhdGEgPSBEUF9zZXRDb25maWcocENvbnRleHQsCisgICAgICAgICAgICAgICAgKGVmZmVjdF9jb25maWdfdCAqKSBwQ21kRGF0YSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0NNRF9HRVRfQ09ORklHOgorICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8CisgICAgICAgICAgICAqcmVwbHlTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpKSB7CisgICAgICAgICAgICBBTE9HRSgiRUZGRUNUX0NNRF9HRVRfQ09ORklHIHdyb25nIHJlcGx5RGF0YSBvciByZXB5U2l6ZSIpOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgRFBfZ2V0Q29uZmlnKHBDb250ZXh0LCAoZWZmZWN0X2NvbmZpZ190ICopcFJlcGx5RGF0YSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0NNRF9SRVNFVDoKKyAgICAgICAgRFBfcmVzZXQocENvbnRleHQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9DTURfRU5BQkxFOgorICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFRkZFQ1RfQ01EX0VOQUJMRSB3cm9uZyByZXBseURhdGEgb3IgcmVweVNpemUiKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIGlmIChwQ29udGV4dC0+bVN0YXRlICE9IERZTkFNSUNTX1BST0NFU1NJTkdfU1RBVEVfSU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFRkZFQ1RfQ01EX0VOQUJMRSBzdGF0ZSBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IC1FTk9TWVM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwQ29udGV4dC0+bVN0YXRlID0gRFlOQU1JQ1NfUFJPQ0VTU0lOR19TVEFURV9BQ1RJVkU7CisgICAgICAgICAgICBBTE9HVigiRUZGRUNUX0NNRF9FTkFCTEUoKSBPSyIpOworICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9DTURfRElTQUJMRToKKyAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7CisgICAgICAgICAgICBBTE9HRSgiRUZGRUNUX0NNRF9ESVNBQkxFIHdyb25nIHJlcGx5RGF0YSBvciByZXB5U2l6ZSIpOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBDb250ZXh0LT5tU3RhdGUgIT0gRFlOQU1JQ1NfUFJPQ0VTU0lOR19TVEFURV9BQ1RJVkUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFRkZFQ1RfQ01EX0RJU0FCTEUgc3RhdGUgbm90IGFjdGl2ZSIpOworICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gLUVOT1NZUzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBDb250ZXh0LT5tU3RhdGUgPSBEWU5BTUlDU19QUk9DRVNTSU5HX1NUQVRFX0lOSVRJQUxJWkVEOworICAgICAgICAgICAgQUxPR1YoIkVGRkVDVF9DTURfRElTQUJMRSgpIE9LIik7CisgICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSAwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0NNRF9HRVRfUEFSQU06IHsKKyAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgibnVsbCBwQ21kRGF0YSBvciBwUmVwbHlEYXRhIG9yIHJlcGx5U2l6ZSIpOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnBFZmZlY3RQYXJhbSA9IChlZmZlY3RfcGFyYW1fdCAqKSBwQ21kRGF0YTsKKyAgICAgICAgdWludDMyX3QgZXhwZWN0ZWRDbWRTaXplID0gRFBfZ2V0UGFyYW1ldGVyQ21kU2l6ZShwRWZmZWN0UGFyYW0tPnBzaXplLAorICAgICAgICAgICAgICAgIHBFZmZlY3RQYXJhbS0+ZGF0YSk7CisgICAgICAgIGlmIChjbWRTaXplICE9IGV4cGVjdGVkQ21kU2l6ZSB8fCAqcmVwbHlTaXplIDwgZXhwZWN0ZWRDbWRTaXplKSB7CisgICAgICAgICAgICBBTE9HRSgiZXJyb3IgY21kU2l6ZTogJWQsIGV4cGV0ZWRDbWRTaXplOiAlZCwgcmVwbHlTaXplOiAlZCIsCisgICAgICAgICAgICAgICAgICAgIGNtZFNpemUsIGV4cGVjdGVkQ21kU2l6ZSwgKnJlcGx5U2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWVigiRFBfY29tbWFuZCBleHBlY3RlZENtZFNpemU6ICVkIiwgZXhwZWN0ZWRDbWRTaXplKTsKKyAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsIHBDbWREYXRhLCBleHBlY3RlZENtZFNpemUpOworICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcCA9IChlZmZlY3RfcGFyYW1fdCAqKXBSZXBseURhdGE7CisKKyAgICAgICAgdWludDMyX3Qgdm9mZnNldCA9IGNvbXB1dGVQYXJhbVZPZmZzZXQocCk7CisKKyAgICAgICAgcC0+c3RhdHVzID0gRFBfZ2V0UGFyYW1ldGVyKHBDb250ZXh0LAorICAgICAgICAgICAgICAgIHAtPnBzaXplLAorICAgICAgICAgICAgICAgIHAtPmRhdGEsCisgICAgICAgICAgICAgICAgJnAtPnZzaXplLAorICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKKyAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyB2b2Zmc2V0ICsgcC0+dnNpemU7CisKKyAgICAgICAgQUxPR1ZWKCJEUF9jb21tYW5kIHJlcGx5c2l6ZSAldSwgc3RhdHVzICVkIiAsICpyZXBseVNpemUsIHAtPnN0YXR1cyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1BBUkFNOiB7CisgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgY21kU2l6ZSA8IChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpICsgc2l6ZW9mKGludDMyX3QpKSB8fAorICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgQUxPR0UoIlx0TFZNX0VSUk9SIDogRHluYW1pY3NQcm9jZXNzaW5nIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU06IEVSUk9SIik7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIGVmZmVjdF9wYXJhbV90ICogY29uc3QgcCA9IChlZmZlY3RfcGFyYW1fdCAqKSBwQ21kRGF0YTsKKyAgICAgICAgY29uc3QgdWludDMyX3Qgdm9mZnNldCA9IGNvbXB1dGVQYXJhbVZPZmZzZXQocCk7CisKKyAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gRFBfc2V0UGFyYW1ldGVyKHBDb250ZXh0LAorICAgICAgICAgICAgICAgIHAtPnBzaXplLAorICAgICAgICAgICAgICAgICh2b2lkICopcC0+ZGF0YSwKKyAgICAgICAgICAgICAgICBwLT52c2l6ZSwKKyAgICAgICAgICAgICAgICBwLT5kYXRhICsgdm9mZnNldCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0RFVklDRToKKyAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1ZPTFVNRToKKyAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0FVRElPX01PREU6CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR1coIkRQX2NvbW1hbmQgaW52YWxpZCBjb21tYW5kICVkIixjbWRDb2RlKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8vcmVnaXN0ZXIgZXhwZWN0ZWQgY21kIHNpemUKK2ludCBEUF9nZXRQYXJhbWV0ZXJDbWRTaXplKHVpbnQzMl90IHBhcmFtU2l6ZSwKKyAgICAgICAgdm9pZCAqcFBhcmFtKSB7CisgICAgaWYgKHBhcmFtU2l6ZSA8IHNpemVvZihpbnQzMl90KSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50MzJfdCBwYXJhbSA9ICooaW50MzJfdCopcFBhcmFtOworICAgIHN3aXRjaChwYXJhbSkgeworICAgIGNhc2UgRFBfUEFSQU1fR0VUX0NIQU5ORUxfQ09VTlQ6IC8vcGFyYW1jbWQKKyAgICBjYXNlIERQX1BBUkFNX0VOR0lORV9BUkNISVRFQ1RVUkU6CisgICAgICAgIC8vZWZmZWN0ICsgcGFyYW0KKyAgICAgICAgcmV0dXJuIChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YodWludDMyX3QpKTsKKyAgICBjYXNlIERQX1BBUkFNX0lOUFVUX0dBSU46IC8vcGFyYW1jbWQgKyBwYXJhbQorICAgIGNhc2UgRFBfUEFSQU1fTElNSVRFUjoKKyAgICBjYXNlIERQX1BBUkFNX1BSRV9FUToKKyAgICBjYXNlIERQX1BBUkFNX1BPU1RfRVE6CisgICAgY2FzZSBEUF9QQVJBTV9NQkM6CisgICAgICAgIC8vZWZmZWN0ICsgcGFyYW0KKyAgICAgICAgcmV0dXJuIChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyAyICogc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgY2FzZSBEUF9QQVJBTV9QUkVfRVFfQkFORDoKKyAgICBjYXNlIERQX1BBUkFNX1BPU1RfRVFfQkFORDoKKyAgICBjYXNlIERQX1BBUkFNX01CQ19CQU5EOgorICAgICAgICByZXR1cm4gKGludCkoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIDMgKiBzaXplb2YodWludDMyX3QpKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8vaGVscGVyIGZ1bmN0aW9uCitib29sIERQX2NoZWNrU2l6ZXNJbnQodWludDMyX3QgcGFyYW1TaXplLCB1aW50MzJfdCB2YWx1ZVNpemUsIHVpbnQzMl90IGV4cGVjdGVkUGFyYW1zLAorICAgICAgICB1aW50MzJfdCBleHBlY3RlZFZhbHVlcykgeworICAgIGlmIChwYXJhbVNpemUgPCBleHBlY3RlZFBhcmFtcyAqIHNpemVvZihpbnQzMl90KSkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCBwYXJhbVNpemU6ICV1IGV4cGVjdGVkICV1IiwgcGFyYW1TaXplLAorICAgICAgICAgICAgICAgICh1aW50MzJfdCkgKGV4cGVjdGVkUGFyYW1zICogc2l6ZW9mKGludDMyX3QpKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHZhbHVlU2l6ZSA8IGV4cGVjdGVkVmFsdWVzICogc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIHZhbHVlU2l6ZSAldSBleHBlY3RlZCAldSIsIHZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAodWludDMyX3QpKGV4cGVjdGVkVmFsdWVzICogc2l6ZW9mKGludDMyX3QpKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBkcF9meDo6RFBDaGFubmVsKiBEUF9nZXRDaGFubmVsKER5bmFtaWNzUHJvY2Vzc2luZ0NvbnRleHQgKnBDb250ZXh0LAorICAgICAgICBpbnQzMl90IGNoYW5uZWwpIHsKKyAgICBpZiAocENvbnRleHQtPm1QRHluYW1pY3MgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZHBfZng6OkRQQ2hhbm5lbCAqcENoYW5uZWwgPSBwQ29udGV4dC0+bVBEeW5hbWljcy0+Z2V0Q2hhbm5lbChjaGFubmVsKTsKKyAgICBBTE9HRV9JRihwQ2hhbm5lbCA9PSBOVUxMLCAiRFBDaGFubmVsIE5VTEwuIGludmFsaWQgY2hhbm5lbCAlZCIsIGNoYW5uZWwpOworICAgIHJldHVybiBwQ2hhbm5lbDsKK30KKworc3RhdGljIGRwX2Z4OjpEUEVxKiBEUF9nZXRFcShEeW5hbWljc1Byb2Nlc3NpbmdDb250ZXh0ICpwQ29udGV4dCwgaW50MzJfdCBjaGFubmVsLAorICAgICAgICBpbnQzMl90IGVxVHlwZSkgeworICAgIGRwX2Z4OjpEUENoYW5uZWwgKiBwQ2hhbm5lbCA9IERQX2dldENoYW5uZWwocENvbnRleHQsIGNoYW5uZWwpOworICAgIGlmIChwQ2hhbm5lbCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBkcF9meDo6RFBFcSAqcEVxID0gKGVxVHlwZSA9PSBEUF9QQVJBTV9QUkVfRVEgPyBwQ2hhbm5lbC0+Z2V0UHJlRXEoKSA6CisgICAgICAgICAgICAoZXFUeXBlID09IERQX1BBUkFNX1BPU1RfRVEgPyBwQ2hhbm5lbC0+Z2V0UG9zdEVxKCkgOiBOVUxMKSk7CisgICAgQUxPR0VfSUYocEVxID09IE5VTEwsIkRQRXEgTlVMTCBpbnZhbGlkIGVxIik7CisgICAgcmV0dXJuIHBFcTsKK30KKworc3RhdGljIGRwX2Z4OjpEUEVxQmFuZCogRFBfZ2V0RXFCYW5kKER5bmFtaWNzUHJvY2Vzc2luZ0NvbnRleHQgKnBDb250ZXh0LCBpbnQzMl90IGNoYW5uZWwsCisgICAgICAgIGludDMyX3QgZXFUeXBlLCBpbnQzMl90IGJhbmQpIHsKKyAgICBkcF9meDo6RFBFcSAqcEVxID0gRFBfZ2V0RXEocENvbnRleHQsIGNoYW5uZWwsIGVxVHlwZSk7CisgICAgaWYgKHBFcSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBkcF9meDo6RFBFcUJhbmQgKnBFcUJhbmQgPSBwRXEtPmdldEJhbmQoYmFuZCk7CisgICAgQUxPR0VfSUYocEVxQmFuZCA9PSBOVUxMLCAiRFBFcUJhbmQgTlVMTC4gaW52YWxpZCBiYW5kICVkIiwgYmFuZCk7CisgICAgcmV0dXJuIHBFcUJhbmQ7Cit9CisKK3N0YXRpYyBkcF9meDo6RFBNYmMqIERQX2dldE1iYyhEeW5hbWljc1Byb2Nlc3NpbmdDb250ZXh0ICpwQ29udGV4dCwgaW50MzJfdCBjaGFubmVsKSB7CisgICAgZHBfZng6OkRQQ2hhbm5lbCAqIHBDaGFubmVsID0gRFBfZ2V0Q2hhbm5lbChwQ29udGV4dCwgY2hhbm5lbCk7CisgICAgaWYgKHBDaGFubmVsID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGRwX2Z4OjpEUE1iYyAqcE1iYyA9IHBDaGFubmVsLT5nZXRNYmMoKTsKKyAgICBBTE9HRV9JRihwTWJjID09IE5VTEwsICJEUE1iYyBOVUxMIGludmFsaWQgTUJDIik7CisgICAgcmV0dXJuIHBNYmM7Cit9CisKK3N0YXRpYyBkcF9meDo6RFBNYmNCYW5kKiBEUF9nZXRNYmNCYW5kKER5bmFtaWNzUHJvY2Vzc2luZ0NvbnRleHQgKnBDb250ZXh0LCBpbnQzMl90IGNoYW5uZWwsCisgICAgICAgIGludDMyX3QgYmFuZCkgeworICAgIGRwX2Z4OjpEUE1iYyAqcE1iYyA9IERQX2dldE1iYyhwQ29udGV4dCwgY2hhbm5lbCk7CisgICAgaWYgKHBNYmMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZHBfZng6OkRQTWJjQmFuZCAqcE1iY0JhbmQgPSBwTWJjLT5nZXRCYW5kKGJhbmQpOworICAgIEFMT0dFX0lGKHBNYmNCYW5kID09IE5VTEwsICJwTWJjQmFuZCBOVUxMLiBpbnZhbGlkIGJhbmQgJWQiLCBiYW5kKTsKKyAgICByZXR1cm4gcE1iY0JhbmQ7Cit9CisKK2ludCBEUF9nZXRQYXJhbWV0ZXIoRHluYW1pY3NQcm9jZXNzaW5nQ29udGV4dCAqcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwYXJhbVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBWYWx1ZSkgeworICAgIGludCBzdGF0dXMgPSAwOworICAgIGludDMyX3QgKnBhcmFtcyA9IChpbnQzMl90ICopcFBhcmFtOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGZsb2F0KSA9PSBzaXplb2YoaW50MzJfdCkgJiYgc2l6ZW9mKGZsb2F0KSA9PSBzaXplb2YodmFsdWVfdCkgJiYKKyAgICAgICAgICAgIGFsaWdub2YoZmxvYXQpID09IGFsaWdub2YoaW50MzJfdCkgJiYgYWxpZ25vZihmbG9hdCkgPT0gYWxpZ25vZih2YWx1ZV90KSwKKyAgICAgICAgICAgICJTaXplL2FsaWdubWVudCBtaXNtYXRjaCBmb3IgZmxvYXQvaW50MzJfdC92YWx1ZV90Iik7CisgICAgdmFsdWVfdCAqdmFsdWVzID0gcmVpbnRlcnByZXRfY2FzdDx2YWx1ZV90Kj4ocFZhbHVlKTsKKworICAgIEFMT0dWVigiJXMgc3RhcnQiLCBfX2Z1bmNfXyk7CisjaWZkZWYgVkVSWV9WRVJZX1ZFUkJPU0VfTE9HR0lORworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFyYW1TaXplL3NpemVvZihpbnQzMl90KTsgaSsrKSB7CisgICAgICAgIEFMT0dWVigiUGFyYW1bJXp1XSAlZCIsIGksIHBhcmFtc1tpXSk7CisgICAgfQorI2VuZGlmCisgICAgaWYgKHBhcmFtU2l6ZSA8IHNpemVvZihpbnQzMl90KSkgeworICAgICAgICBBTE9HRSgiJXMgaW52YWxpZCBwYXJhbVNpemU6ICV1IiwgX19mdW5jX18sIHBhcmFtU2l6ZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBjb25zdCBpbnQzMl90IGNvbW1hbmQgPSBwYXJhbXNbMF07CisgICAgc3dpdGNoIChjb21tYW5kKSB7CisgICAgY2FzZSBEUF9QQVJBTV9HRVRfQ0hBTk5FTF9DT1VOVDogeworICAgICAgICBpZiAoIURQX2NoZWNrU2l6ZXNJbnQocGFyYW1TaXplLCpwVmFsdWVTaXplLCAxIC8qcGFyYW1zKi8sIDEgLyp2YWx1ZXMqLykpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBEUF9QQVJBTV9HRVRfQ0hBTk5FTF9DT1VOVCAoY21kICVkKSBpbnZhbGlkIHNpemVzLiIsIF9fZnVuY19fLCBjb21tYW5kKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CisgICAgICAgICoodWludDMyX3QgKilwVmFsdWUgPSAodWludDMyX3QpYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKAorICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICAgICAgQUxPR1ZWKCIlcyBEUF9QQVJBTV9HRVRfQ0hBTk5FTF9DT1VOVCBjaGFubmVscyAlZCIsIF9fZnVuY19fLCAqKGludDMyX3QgKilwVmFsdWUpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEUF9QQVJBTV9FTkdJTkVfQVJDSElURUNUVVJFOiB7CisgICAgICAgIEFMT0dWVigiZW5naW5lIGFyY2hpdGVjdHVyZSBwYXJhbXNpemU6ICVkIHZhbHVlc2l6ZSAlZCIscGFyYW1TaXplLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgIGlmICghRFBfY2hlY2tTaXplc0ludChwYXJhbVNpemUsICpwVmFsdWVTaXplLCAxIC8qcGFyYW1zKi8sIDkgLyp2YWx1ZXMqLykpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBEUF9QQVJBTV9FTkdJTkVfQVJDSElURUNUVVJFIChjbWQgJWQpIGludmFsaWQgc2l6ZXMuIiwgX19mdW5jX18sIGNvbW1hbmQpOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisvLyAgICAgICAgTnVtYmVyW10gcGFyYW1zID0geyBQQVJBTV9FTkdJTkVfQVJDSElURUNUVVJFIH07CisvLyAgICAgICAgTnVtYmVyW10gdmFsdWVzID0geyAwIC8qMCB2YXJpYW50ICovLAorLy8gICAgICAgICAgICAgICAgMC4wZiAvKiAxIHByZWZlcnJlZEZyYW1lRHVyYXRpb24gKi8sCisvLyAgICAgICAgICAgICAgICAwIC8qMiBwcmVFcUluVXNlICovLAorLy8gICAgICAgICAgICAgICAgMCAvKjMgcHJlRXFCYW5kQ291bnQgKi8sCisvLyAgICAgICAgICAgICAgICAwIC8qNCBtYmNJblVzZSAqLywKKy8vICAgICAgICAgICAgICAgIDAgLyo1IG1iY0JhbmRDb3VudCovLAorLy8gICAgICAgICAgICAgICAgMCAvKjYgcG9zdEVxSW5Vc2UgKi8sCisvLyAgICAgICAgICAgICAgICAwIC8qNyBwb3N0RXFCYW5kQ291bnQgKi8sCisvLyAgICAgICAgICAgICAgICAwIC8qOCBsaW1pdGVySW5Vc2UgKi99OworICAgICAgICBpZiAocENvbnRleHQtPm1QRHluYW1pY3MgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIiVzIERQX1BBUkFNX0VOR0lORV9BUkNISVRFQ1RVUkUgZXJyb3IgbVBEeW5hbWljcyBpcyBOVUxMIiwgX19mdW5jX18pOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHZhbHVlc1swXS5pID0gcENvbnRleHQtPm1DdXJyZW50VmFyaWFudDsKKyAgICAgICAgdmFsdWVzWzFdLmYgPSBwQ29udGV4dC0+bVByZWZlcnJlZEZyYW1lRHVyYXRpb247CisgICAgICAgIHZhbHVlc1syXS5pID0gcENvbnRleHQtPm1QRHluYW1pY3MtPmlzUHJlRVFJblVzZSgpOworICAgICAgICB2YWx1ZXNbM10uaSA9IHBDb250ZXh0LT5tUER5bmFtaWNzLT5nZXRQcmVFcUJhbmRDb3VudCgpOworICAgICAgICB2YWx1ZXNbNF0uaSA9IHBDb250ZXh0LT5tUER5bmFtaWNzLT5pc01iY0luVXNlKCk7CisgICAgICAgIHZhbHVlc1s1XS5pID0gcENvbnRleHQtPm1QRHluYW1pY3MtPmdldE1iY0JhbmRDb3VudCgpOworICAgICAgICB2YWx1ZXNbNl0uaSA9IHBDb250ZXh0LT5tUER5bmFtaWNzLT5pc1Bvc3RFcUluVXNlKCk7CisgICAgICAgIHZhbHVlc1s3XS5pID0gcENvbnRleHQtPm1QRHluYW1pY3MtPmdldFBvc3RFcUJhbmRDb3VudCgpOworICAgICAgICB2YWx1ZXNbOF0uaSA9IHBDb250ZXh0LT5tUER5bmFtaWNzLT5pc0xpbWl0ZXJJblVzZSgpOworCisgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKHZhbHVlX3QpICogOTsKKworICAgICAgICBBTE9HVlYoIiB2YXJpYW50ICVkLCBwcmVmZXJyZWRGcmFtZUR1cmF0aW9uOiAlZiwgcHJlRXFJbnVzZSAlZCwgYmFuZHMgJWQsIG1iY2ludXNlICVkLCIKKyAgICAgICAgICAgICAgICAibWJjYmFuZHMgJWQsIHBvc3RlcUluVXNlICVkLCBiYW5kcyAlZCwgbGltaXRlcmludXNlICVkIiwKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMF0uaSwgdmFsdWVzWzFdLmYsIHZhbHVlc1syXS5pLCB2YWx1ZXNbM10uaSwgdmFsdWVzWzRdLmksIHZhbHVlc1s1XS5pLAorICAgICAgICAgICAgICAgIHZhbHVlc1s2XS5pLCB2YWx1ZXNbN10uaSwgdmFsdWVzWzhdLmkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEUF9QQVJBTV9JTlBVVF9HQUlOOiB7CisgICAgICAgIEFMT0dWVigiZW5naW5lIGdldCBQQVJBTV9JTlBVVF9HQUlOIHBhcmFtc2l6ZTogJWQgdmFsdWVzaXplICVkIixwYXJhbVNpemUsICpwVmFsdWVTaXplKTsKKyAgICAgICAgaWYgKCFEUF9jaGVja1NpemVzSW50KHBhcmFtU2l6ZSwgKnBWYWx1ZVNpemUsIDIgLypwYXJhbXMqLywgMSAvKnZhbHVlcyovKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzIGdldCBQQVJBTV9JTlBVVF9HQUlOIGludmFsaWQgc2l6ZXMuIiwgX19mdW5jX18pOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgaW50MzJfdCBjaGFubmVsID0gcGFyYW1zWzFdOworICAgICAgICBkcF9meDo6RFBDaGFubmVsICogcENoYW5uZWwgPSBEUF9nZXRDaGFubmVsKHBDb250ZXh0LCBjaGFubmVsKTsKKyAgICAgICAgaWYgKHBDaGFubmVsID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBnZXQgUEFSQU1fSU5QVVRfR0FJTiBpbnZhbGlkIGNoYW5uZWwgJWQiLCBfX2Z1bmNfXywgY2hhbm5lbCk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdmFsdWVzWzBdLmYgPSBwQ2hhbm5lbC0+Z2V0SW5wdXRHYWluKCk7CisgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKHZhbHVlX3QpICogMTsKKworICAgICAgICBBTE9HVlYoIiBjaGFubmVsOiAlZCwgaW5wdXQgZ2FpbiAlZlxuIiwgY2hhbm5lbCwgdmFsdWVzWzBdLmYpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEUF9QQVJBTV9QUkVfRVE6CisgICAgY2FzZSBEUF9QQVJBTV9QT1NUX0VROiB7CisgICAgICAgIEFMT0dWVigiZW5naW5lIGdldCBQQVJBTV8qX0VRIHBhcmFtc2l6ZTogJWQgdmFsdWVzaXplICVkIixwYXJhbVNpemUsICpwVmFsdWVTaXplKTsKKyAgICAgICAgaWYgKCFEUF9jaGVja1NpemVzSW50KHBhcmFtU2l6ZSwgKnBWYWx1ZVNpemUsIDIgLypwYXJhbXMqLywgMyAvKnZhbHVlcyovKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzIGdldCBQQVJBTV8qX0VRIChjbWQgJWQpIGludmFsaWQgc2l6ZXMuIiwgX19mdW5jX18sIGNvbW1hbmQpOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisvLyAgICAgICAgTnVtYmVyW10gcGFyYW1zID0ge3BhcmFtU2V0ID09IFBBUkFNX1BSRV9FUSA/IFBBUkFNX1BSRV9FUSA6IFBBUkFNX1BPU1RfRVEsCisvLyAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEluZGV4fTsKKy8vICAgICAgICAgICAgICAgTnVtYmVyW10gdmFsdWVzID0gezAgLyowIGluIHVzZSAqLywKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qMSBlbmFibGVkKi8sCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKjIgYmFuZCBjb3VudCAqL307CisgICAgICAgIGNvbnN0IGludDMyX3QgY2hhbm5lbCA9IHBhcmFtc1sxXTsKKworICAgICAgICBkcF9meDo6RFBFcSAqcEVxID0gRFBfZ2V0RXEocENvbnRleHQsIGNoYW5uZWwsIGNvbW1hbmQpOworICAgICAgICBpZiAocEVxID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBnZXQgUEFSQU1fKl9FUSBpbnZhbGlkIGVxIiwgX19mdW5jX18pOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHZhbHVlc1swXS5pID0gcEVxLT5pc0luVXNlKCk7CisgICAgICAgIHZhbHVlc1sxXS5pID0gcEVxLT5pc0VuYWJsZWQoKTsKKyAgICAgICAgdmFsdWVzWzJdLmkgPSBwRXEtPmdldEJhbmRDb3VudCgpOworICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZih2YWx1ZV90KSAqIDM7CisKKyAgICAgICAgQUxPR1ZWKCIgJXMgY2hhbm5lbDogJWQsIGluVXNlOjolZCwgZW5hYmxlZDolZCwgYmFuZENvdW50OiVkXG4iLAorICAgICAgICAgICAgICAgIChjb21tYW5kID09IERQX1BBUkFNX1BSRV9FUSA/ICJwcmVFcSIgOiAicG9zdEVxIiksIGNoYW5uZWwsCisgICAgICAgICAgICAgICAgdmFsdWVzWzBdLmksIHZhbHVlc1sxXS5pLCB2YWx1ZXNbMl0uaSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERQX1BBUkFNX1BSRV9FUV9CQU5EOgorICAgIGNhc2UgRFBfUEFSQU1fUE9TVF9FUV9CQU5EOiB7CisgICAgICAgIEFMT0dWVigiZW5naW5lIGdldCBQQVJBTV8qX0VRX0JBTkQgcGFyYW1zaXplOiAlZCB2YWx1ZXNpemUgJWQiLHBhcmFtU2l6ZSwgKnBWYWx1ZVNpemUpOworICAgICAgICBpZiAoIURQX2NoZWNrU2l6ZXNJbnQocGFyYW1TaXplLCAqcFZhbHVlU2l6ZSwgMyAvKnBhcmFtcyovLCAzIC8qdmFsdWVzKi8pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgZ2V0IFBBUkFNXypfRVFfQkFORCAoY21kICVkKSBpbnZhbGlkIHNpemVzLiIsIF9fZnVuY19fLCBjb21tYW5kKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorLy8gICAgICAgIE51bWJlcltdIHBhcmFtcyA9IHtwYXJhbVNldCwKKy8vICAgICAgICAgICAgICAgIGNoYW5uZWxJbmRleCwKKy8vICAgICAgICAgICAgICAgIGJhbmRJbmRleH07CisvLyAgICAgICAgTnVtYmVyW10gdmFsdWVzID0geyhlcUJhbmQuaXNFbmFibGVkKCkgPyAxIDogMCksCisvLyAgICAgICAgICAgICAgZXFCYW5kLmdldEN1dG9mZkZyZXF1ZW5jeSgpLAorLy8gICAgICAgICAgICAgIGVxQmFuZC5nZXRHYWluKCl9OworICAgICAgICBjb25zdCBpbnQzMl90IGNoYW5uZWwgPSBwYXJhbXNbMV07CisgICAgICAgIGNvbnN0IGludDMyX3QgYmFuZCA9IHBhcmFtc1syXTsKKyAgICAgICAgaW50IGVxQ29tbWFuZCA9IChjb21tYW5kID09IERQX1BBUkFNX1BSRV9FUV9CQU5EID8gRFBfUEFSQU1fUFJFX0VRIDoKKyAgICAgICAgICAgICAgICAoY29tbWFuZCA9PSBEUF9QQVJBTV9QT1NUX0VRX0JBTkQgPyBEUF9QQVJBTV9QT1NUX0VRIDogLTEpKTsKKworICAgICAgICBkcF9meDo6RFBFcUJhbmQgKnBFcUJhbmQgPSBEUF9nZXRFcUJhbmQocENvbnRleHQsIGNoYW5uZWwsIGVxQ29tbWFuZCwgYmFuZCk7CisgICAgICAgIGlmIChwRXFCYW5kID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBnZXQgUEFSQU1fKl9FUV9CQU5EIGludmFsaWQgY2hhbm5lbCAlZCBvciBiYW5kICVkIiwgX19mdW5jX18sIGNoYW5uZWwsIGJhbmQpOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgdmFsdWVzWzBdLmkgPSBwRXFCYW5kLT5pc0VuYWJsZWQoKTsKKyAgICAgICAgdmFsdWVzWzFdLmYgPSBwRXFCYW5kLT5nZXRDdXRvZmZGcmVxdWVuY3koKTsKKyAgICAgICAgdmFsdWVzWzJdLmYgPSBwRXFCYW5kLT5nZXRHYWluKCk7CisgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKHZhbHVlX3QpICogMzsKKworICAgICAgICBBTE9HVlYoIiVzIGNoYW5uZWw6ICVkLCBiYW5kOjolZCwgZW5hYmxlZDolZCwgY3V0b2ZmRnJlcXVlbmN5OiVmLCBnYWluJWZcbiIsCisgICAgICAgICAgICAgICAgKGNvbW1hbmQgPT0gRFBfUEFSQU1fUFJFX0VRX0JBTkQgPyAicHJlRXFCYW5kIiA6ICJwb3N0RXFCYW5kIiksIGNoYW5uZWwsIGJhbmQsCisgICAgICAgICAgICAgICAgdmFsdWVzWzBdLmksIHZhbHVlc1sxXS5mLCB2YWx1ZXNbMl0uZik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERQX1BBUkFNX01CQzogeworICAgICAgICBBTE9HVlYoImVuZ2luZSBnZXQgUERQX1BBUkFNX01CQyBwYXJhbXNpemU6ICVkIHZhbHVlc2l6ZSAlZCIscGFyYW1TaXplLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgIGlmICghRFBfY2hlY2tTaXplc0ludChwYXJhbVNpemUsICpwVmFsdWVTaXplLCAyIC8qcGFyYW1zKi8sIDMgLyp2YWx1ZXMqLykpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBnZXQgUERQX1BBUkFNX01CQyAoY21kICVkKSBpbnZhbGlkIHNpemVzLiIsIF9fZnVuY19fLCBjb21tYW5kKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisvLyAgICAgICAgICAgTnVtYmVyW10gcGFyYW1zID0ge1BBUkFNX01CQywKKy8vICAgICAgICAgICAgICAgICAgICBjaGFubmVsSW5kZXh9OworLy8gICAgICAgICAgICBOdW1iZXJbXSB2YWx1ZXMgPSB7MCAvKjAgaW4gdXNlICovLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyoxIGVuYWJsZWQqLywKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qMiBiYW5kIGNvdW50ICovfTsKKworICAgICAgICBjb25zdCBpbnQzMl90IGNoYW5uZWwgPSBwYXJhbXNbMV07CisKKyAgICAgICAgZHBfZng6OkRQTWJjICpwTWJjID0gRFBfZ2V0TWJjKHBDb250ZXh0LCBjaGFubmVsKTsKKyAgICAgICAgaWYgKHBNYmMgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIiVzIGdldCBQRFBfUEFSQU1fTUJDIGludmFsaWQgTUJDIiwgX19mdW5jX18pOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgdmFsdWVzWzBdLmkgPSBwTWJjLT5pc0luVXNlKCk7CisgICAgICAgIHZhbHVlc1sxXS5pID0gcE1iYy0+aXNFbmFibGVkKCk7CisgICAgICAgIHZhbHVlc1syXS5pID0gcE1iYy0+Z2V0QmFuZENvdW50KCk7CisgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKHZhbHVlX3QpICogMzsKKworICAgICAgICBBTE9HVlYoIkRQX1BBUkFNX01CQyBjaGFubmVsOiAlZCwgaW5Vc2U6OiVkLCBlbmFibGVkOiVkLCBiYW5kQ291bnQ6JWRcbiIsIGNoYW5uZWwsCisgICAgICAgICAgICAgICAgdmFsdWVzWzBdLmksIHZhbHVlc1sxXS5pLCB2YWx1ZXNbMl0uaSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERQX1BBUkFNX01CQ19CQU5EOiB7CisgICAgICAgIEFMT0dWVigiZW5naW5lIGdldCBEUF9QQVJBTV9NQkNfQkFORCBwYXJhbXNpemU6ICVkIHZhbHVlc2l6ZSAlZCIscGFyYW1TaXplLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgIGlmICghRFBfY2hlY2tTaXplc0ludChwYXJhbVNpemUsICpwVmFsdWVTaXplLCAzIC8qcGFyYW1zKi8sIDExIC8qdmFsdWVzKi8pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgZ2V0IERQX1BBUkFNX01CQ19CQU5EIChjbWQgJWQpIGludmFsaWQgc2l6ZXMuIiwgX19mdW5jX18sIGNvbW1hbmQpOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisvLyAgICAgICAgTnVtYmVyW10gcGFyYW1zID0ge1BBUkFNX01CQ19CQU5ELAorLy8gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsSW5kZXgsCisvLyAgICAgICAgICAgICAgICAgICAgICAgIGJhbmRJbmRleH07CisvLyAgICAgICAgICAgICAgICBOdW1iZXJbXSB2YWx1ZXMgPSB7MCAvKjAgZW5hYmxlZCAqLywKKy8vICAgICAgICAgICAgICAgICAgICAgICAgMC4wZiAvKjEgY3V0b2ZmRnJlcXVlbmN5ICovLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAwLjBmIC8qMiBBdHRhY2tUaW1lICovLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAwLjBmIC8qMyBSZWxlYXNlVGltZSAqLywKKy8vICAgICAgICAgICAgICAgICAgICAgICAgMC4wZiAvKjQgUmF0aW8gKi8sCisvLyAgICAgICAgICAgICAgICAgICAgICAgIDAuMGYgLyo1IFRocmVzaG9sZCAqLywKKy8vICAgICAgICAgICAgICAgICAgICAgICAgMC4wZiAvKjYgS25lZVdpZHRoICovLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAwLjBmIC8qNyBOb2lzZUdhdGVUaHJlc2hvbGQgKi8sCisvLyAgICAgICAgICAgICAgICAgICAgICAgIDAuMGYgLyo4IEV4cGFuZGVyUmF0aW8gKi8sCisvLyAgICAgICAgICAgICAgICAgICAgICAgIDAuMGYgLyo5IFByZUdhaW4gKi8sCisvLyAgICAgICAgICAgICAgICAgICAgICAgIDAuMGYgLyoxMCBQb3N0R2FpbiovfTsKKworICAgICAgICBjb25zdCBpbnQzMl90IGNoYW5uZWwgPSBwYXJhbXNbMV07CisgICAgICAgIGNvbnN0IGludDMyX3QgYmFuZCA9IHBhcmFtc1syXTsKKworICAgICAgICBkcF9meDo6RFBNYmNCYW5kICpwTWJjQmFuZCA9IERQX2dldE1iY0JhbmQocENvbnRleHQsIGNoYW5uZWwsIGJhbmQpOworICAgICAgICBpZiAocE1iY0JhbmQgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIiVzIGdldCBQQVJBTV9NQkNfQkFORCBpbnZhbGlkIGNoYW5uZWwgJWQgb3IgYmFuZCAlZCIsIF9fZnVuY19fLCBjaGFubmVsLCBiYW5kKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlc1swXS5pID0gcE1iY0JhbmQtPmlzRW5hYmxlZCgpOworICAgICAgICB2YWx1ZXNbMV0uZiA9IHBNYmNCYW5kLT5nZXRDdXRvZmZGcmVxdWVuY3koKTsKKyAgICAgICAgdmFsdWVzWzJdLmYgPSBwTWJjQmFuZC0+Z2V0QXR0YWNrVGltZSgpOworICAgICAgICB2YWx1ZXNbM10uZiA9IHBNYmNCYW5kLT5nZXRSZWxlYXNlVGltZSgpOworICAgICAgICB2YWx1ZXNbNF0uZiA9IHBNYmNCYW5kLT5nZXRSYXRpbygpOworICAgICAgICB2YWx1ZXNbNV0uZiA9IHBNYmNCYW5kLT5nZXRUaHJlc2hvbGQoKTsKKyAgICAgICAgdmFsdWVzWzZdLmYgPSBwTWJjQmFuZC0+Z2V0S25lZVdpZHRoKCk7CisgICAgICAgIHZhbHVlc1s3XS5mID0gcE1iY0JhbmQtPmdldE5vaXNlR2F0ZVRocmVzaG9sZCgpOworICAgICAgICB2YWx1ZXNbOF0uZiA9IHBNYmNCYW5kLT5nZXRFeHBhbmRlclJhdGlvKCk7CisgICAgICAgIHZhbHVlc1s5XS5mID0gcE1iY0JhbmQtPmdldFByZUdhaW4oKTsKKyAgICAgICAgdmFsdWVzWzEwXS5mID0gcE1iY0JhbmQtPmdldFBvc3RHYWluKCk7CisKKyAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YodmFsdWVfdCkgKiAxMTsKKyAgICAgICAgQUxPR1ZWKCIgbWJjQmFuZCBjaGFubmVsOiAlZCwgYmFuZDo6JWQsIGVuYWJsZWQ6JWQsIGN1dG9mZkZyZXF1ZW5jeTolZiwgYXR0YWNrVGltZTolZiwiCisgICAgICAgICAgICAgICAgInJlbGVhc2VUaW1lOiVmLCByYXRpbzolZiwgdGhyZXNob2xkOiVmLCBrbmVlV2lkdGg6JWYsIG5vaXNlR2F0ZVRocmVzaG9sZDolZiwiCisgICAgICAgICAgICAgICAgImV4cGFuZGVyUmF0aW86JWYsIHByZUdhaW46JWYsIHBvc3RHYWluOiVmXG4iLCBjaGFubmVsLCBiYW5kLCB2YWx1ZXNbMF0uaSwKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMV0uZiwgdmFsdWVzWzJdLmYsIHZhbHVlc1szXS5mLCB2YWx1ZXNbNF0uZiwgdmFsdWVzWzVdLmYsIHZhbHVlc1s2XS5mLAorICAgICAgICAgICAgICAgIHZhbHVlc1s3XS5mLCB2YWx1ZXNbOF0uZiwgdmFsdWVzWzldLmYsIHZhbHVlc1sxMF0uZik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERQX1BBUkFNX0xJTUlURVI6IHsKKyAgICAgICAgQUxPR1ZWKCJlbmdpbmUgZ2V0IERQX1BBUkFNX0xJTUlURVIgcGFyYW1zaXplOiAlZCB2YWx1ZXNpemUgJWQiLHBhcmFtU2l6ZSwgKnBWYWx1ZVNpemUpOworICAgICAgICBpZiAoIURQX2NoZWNrU2l6ZXNJbnQocGFyYW1TaXplLCAqcFZhbHVlU2l6ZSwgMiAvKnBhcmFtcyovLCA4IC8qdmFsdWVzKi8pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgRFBfUEFSQU1fTElNSVRFUiAoY21kICVkKSBpbnZhbGlkIHNpemVzLiIsIF9fZnVuY19fLCBjb21tYW5kKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgY2hhbm5lbCA9IHBhcmFtc1sxXTsKKy8vICAgICAgTnVtYmVyW10gdmFsdWVzID0gezAgLyowIGluIHVzZSAoaW50KSovLAorLy8gICAgICAgICAgICAgIDAgLyoxIGVuYWJsZWQgKGludCkqLywKKy8vICAgICAgICAgICAgICAwIC8qMiBsaW5rIGdyb3VwIChpbnQpKi8sCisvLyAgICAgICAgICAgICAgMC4wZiAvKjMgYXR0YWNrIHRpbWUgKGZsb2F0KSovLAorLy8gICAgICAgICAgICAgIDAuMGYgLyo0IHJlbGVhc2UgdGltZSAoZmxvYXQpKi8sCisvLyAgICAgICAgICAgICAgMC4wZiAvKjUgcmF0aW8gKGZsb2F0KSovLAorLy8gICAgICAgICAgICAgIDAuMGYgLyo2IHRocmVzaG9sZCAoZmxvYXQpKi8sCisvLyAgICAgICAgICAgICAgMC4wZiAvKjcgcG9zdCBnYWluKGZsb2F0KSovfTsKKyAgICAgICAgZHBfZng6OkRQQ2hhbm5lbCAqIHBDaGFubmVsID0gRFBfZ2V0Q2hhbm5lbChwQ29udGV4dCwgY2hhbm5lbCk7CisgICAgICAgIGlmIChwQ2hhbm5lbCA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgRFBfUEFSQU1fTElNSVRFUiBpbnZhbGlkIGNoYW5uZWwgJWQiLCBfX2Z1bmNfXywgY2hhbm5lbCk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZHBfZng6OkRQTGltaXRlciAqcExpbWl0ZXIgPSBwQ2hhbm5lbC0+Z2V0TGltaXRlcigpOworICAgICAgICBpZiAocExpbWl0ZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIiVzIERQX1BBUkFNX0xJTUlURVIgbnVsbCBMSU1JVEVSIiwgX19mdW5jX18pOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHZhbHVlc1swXS5pID0gcExpbWl0ZXItPmlzSW5Vc2UoKTsKKyAgICAgICAgdmFsdWVzWzFdLmkgPSBwTGltaXRlci0+aXNFbmFibGVkKCk7CisgICAgICAgIHZhbHVlc1syXS5pID0gcExpbWl0ZXItPmdldExpbmtHcm91cCgpOworICAgICAgICB2YWx1ZXNbM10uZiA9IHBMaW1pdGVyLT5nZXRBdHRhY2tUaW1lKCk7CisgICAgICAgIHZhbHVlc1s0XS5mID0gcExpbWl0ZXItPmdldFJlbGVhc2VUaW1lKCk7CisgICAgICAgIHZhbHVlc1s1XS5mID0gcExpbWl0ZXItPmdldFJhdGlvKCk7CisgICAgICAgIHZhbHVlc1s2XS5mID0gcExpbWl0ZXItPmdldFRocmVzaG9sZCgpOworICAgICAgICB2YWx1ZXNbN10uZiA9IHBMaW1pdGVyLT5nZXRQb3N0R2FpbigpOworCisgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKHZhbHVlX3QpICogODsKKworICAgICAgICBBTE9HVlYoIiBMaW1pdGVyIGNoYW5uZWw6ICVkLCBpblVzZTo6JWQsIGVuYWJsZWQ6JWQsIGxpbmtncm91cDolZCBhdHRhY2tUaW1lOiVmLCIKKyAgICAgICAgICAgICAgICAicmVsZWFzZVRpbWU6JWYsIHJhdGlvOiVmLCB0aHJlc2hvbGQ6JWYsIHBvc3RHYWluOiVmXG4iLAorICAgICAgICAgICAgICAgIGNoYW5uZWwsIHZhbHVlc1swXS5pLyppblVzZSovLCB2YWx1ZXNbMV0uaS8qZW5hYmxlZCovLCB2YWx1ZXNbMl0uaS8qbGlua0dyb3VwKi8sCisgICAgICAgICAgICAgICAgdmFsdWVzWzNdLmYvKmF0dGFja1RpbWUqLywgdmFsdWVzWzRdLmYvKnJlbGVhc2VUaW1lKi8sCisgICAgICAgICAgICAgICAgdmFsdWVzWzVdLmYvKnJhdGlvKi8sIHZhbHVlc1s2XS5mLyp0aHJlc2hvbGQqLywKKyAgICAgICAgICAgICAgICB2YWx1ZXNbN10uZi8qcG9zdEdhaW4qLyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiJXMgaW52YWxpZCBwYXJhbSAlZCIsIF9fZnVuY19fLCBwYXJhbXNbMF0pOworICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBBTE9HVlYoIiVzIGVuZCBwYXJhbTogJWQsIHN0YXR1czogJWQiLCBfX2Z1bmNfXywgcGFyYW1zWzBdLCBzdGF0dXMpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIGVuZCBEUF9nZXRQYXJhbWV0ZXIgKi8KKworaW50IERQX3NldFBhcmFtZXRlcihEeW5hbWljc1Byb2Nlc3NpbmdDb250ZXh0ICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhcmFtU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBWYWx1ZSkgeworICAgIGludCBzdGF0dXMgPSAwOworICAgIGludDMyX3QgKnBhcmFtcyA9IChpbnQzMl90ICopcFBhcmFtOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGZsb2F0KSA9PSBzaXplb2YoaW50MzJfdCkgJiYgc2l6ZW9mKGZsb2F0KSA9PSBzaXplb2YodmFsdWVfdCkgJiYKKyAgICAgICAgICAgIGFsaWdub2YoZmxvYXQpID09IGFsaWdub2YoaW50MzJfdCkgJiYgYWxpZ25vZihmbG9hdCkgPT0gYWxpZ25vZih2YWx1ZV90KSwKKyAgICAgICAgICAgICJTaXplL2FsaWdubWVudCBtaXNtYXRjaCBmb3IgZmxvYXQvaW50MzJfdC92YWx1ZV90Iik7CisgICAgdmFsdWVfdCAqdmFsdWVzID0gcmVpbnRlcnByZXRfY2FzdDx2YWx1ZV90Kj4ocFZhbHVlKTsKKworICAgIEFMT0dWVigiJXMgc3RhcnQiLCBfX2Z1bmNfXyk7CisgICAgaWYgKHBhcmFtU2l6ZSA8IHNpemVvZihpbnQzMl90KSkgeworICAgICAgICBBTE9HRSgiJXMgaW52YWxpZCBwYXJhbVNpemU6ICV1IiwgX19mdW5jX18sIHBhcmFtU2l6ZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBjb25zdCBpbnQzMl90IGNvbW1hbmQgPSBwYXJhbXNbMF07CisgICAgc3dpdGNoIChjb21tYW5kKSB7CisgICAgY2FzZSBEUF9QQVJBTV9FTkdJTkVfQVJDSElURUNUVVJFOiB7CisgICAgICAgIEFMT0dWVigiZW5naW5lIGFyY2hpdGVjdHVyZSBwYXJhbXNpemU6ICVkIHZhbHVlc2l6ZSAlZCIscGFyYW1TaXplLCB2YWx1ZVNpemUpOworICAgICAgICBpZiAoIURQX2NoZWNrU2l6ZXNJbnQocGFyYW1TaXplLCB2YWx1ZVNpemUsIDEgLypwYXJhbXMqLywgOSAvKnZhbHVlcyovKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzIERQX1BBUkFNX0VOR0lORV9BUkNISVRFQ1RVUkUgKGNtZCAlZCkgaW52YWxpZCBzaXplcy4iLCBfX2Z1bmNfXywgY29tbWFuZCk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKy8vICAgICAgICBOdW1iZXJbXSBwYXJhbXMgPSB7IFBBUkFNX0VOR0lORV9BUkNISVRFQ1RVUkUgfTsKKy8vICAgICAgICBOdW1iZXJbXSB2YWx1ZXMgPSB7IHZhcmlhbnQgLyogdmFyaWFudCAqLywKKy8vICAgICAgICAgICAgICAgIHByZWZlcnJlZEZyYW1lRHVyYXRpb24sCisvLyAgICAgICAgICAgICAgICAocHJlRXFJblVzZSA/IDEgOiAwKSwKKy8vICAgICAgICAgICAgICAgIHByZUVxQmFuZENvdW50LAorLy8gICAgICAgICAgICAgICAgKG1iY0luVXNlID8gMSA6IDApLAorLy8gICAgICAgICAgICAgICAgbWJjQmFuZENvdW50LAorLy8gICAgICAgICAgICAgICAgKHBvc3RFcUluVXNlID8gMSA6IDApLAorLy8gICAgICAgICAgICAgICAgcG9zdEVxQmFuZENvdW50LAorLy8gICAgICAgICAgICAgICAgKGxpbWl0ZXJJblVzZSA/IDEgOiAwKX07CisgICAgICAgIGNvbnN0IGludDMyX3QgdmFyaWFudCA9IHZhbHVlc1swXS5pOworICAgICAgICBjb25zdCBmbG9hdCBwcmVmZXJyZWRGcmFtZUR1cmF0aW9uID0gdmFsdWVzWzFdLmY7CisgICAgICAgIGNvbnN0IGludDMyX3QgcHJlRXFJblVzZSA9IHZhbHVlc1syXS5pOworICAgICAgICBjb25zdCBpbnQzMl90IHByZUVxQmFuZENvdW50ID0gdmFsdWVzWzNdLmk7CisgICAgICAgIGNvbnN0IGludDMyX3QgbWJjSW5Vc2UgPSB2YWx1ZXNbNF0uaTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBtYmNCYW5kQ291bnQgPSB2YWx1ZXNbNV0uaTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBwb3N0RXFJblVzZSA9IHZhbHVlc1s2XS5pOworICAgICAgICBjb25zdCBpbnQzMl90IHBvc3RFcUJhbmRDb3VudCA9IHZhbHVlc1s3XS5pOworICAgICAgICBjb25zdCBpbnQzMl90IGxpbWl0ZXJJblVzZSA9IHZhbHVlc1s4XS5pOworICAgICAgICBBTE9HVlYoInZhcmlhbnQgJWQsIHByZUVxSW51c2UgJWQsIGJhbmRzICVkLCBtYmNpbnVzZSAlZCwgbWJjYmFuZHMgJWQsIHBvc3RlcUluVXNlICVkLCIKKyAgICAgICAgICAgICAgICAiYmFuZHMgJWQsIGxpbWl0ZXJpbnVzZSAlZCIsIHZhcmlhbnQsIHByZUVxSW5Vc2UsIHByZUVxQmFuZENvdW50LCBtYmNJblVzZSwKKyAgICAgICAgICAgICAgICBtYmNCYW5kQ291bnQsIHBvc3RFcUluVXNlLCBwb3N0RXFCYW5kQ291bnQsIGxpbWl0ZXJJblVzZSk7CisKKyAgICAgICAgLy9zZXQgdmFyaWFudCAoaW5zdGFudGlhdGUgZWZmZWN0KQorICAgICAgICAvL2luaXRBcmNoaXRlY3R1cmUgZm9yIGVmZmVjdAorICAgICAgICBEUF9jaGFuZ2VWYXJpYW50KHBDb250ZXh0LCB2YXJpYW50KTsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5tUER5bmFtaWNzID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBEUF9QQVJBTV9FTkdJTkVfQVJDSElURUNUVVJFIGVycm9yIHNldHRpbmcgdmFyaWFudCAlZCIsIF9fZnVuY19fLCB2YXJpYW50KTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwQ29udGV4dC0+bVByZWZlcnJlZEZyYW1lRHVyYXRpb24gPSBwcmVmZXJyZWRGcmFtZUR1cmF0aW9uOworICAgICAgICBwQ29udGV4dC0+bVBEeW5hbWljcy0+aW5pdCgodWludDMyX3QpYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKAorICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzKSwKKyAgICAgICAgICAgICAgICBwcmVFcUluVXNlICE9IDAsICh1aW50MzJfdClwcmVFcUJhbmRDb3VudCwKKyAgICAgICAgICAgICAgICBtYmNJblVzZSAhPSAwLCAodWludDMyX3QpbWJjQmFuZENvdW50LAorICAgICAgICAgICAgICAgIHBvc3RFcUluVXNlICE9IDAsICh1aW50MzJfdClwb3N0RXFCYW5kQ291bnQsCisgICAgICAgICAgICAgICAgbGltaXRlckluVXNlICE9IDApOworCisgICAgICAgIERQX2NvbmZpZ3VyZVZhcmlhbnQocENvbnRleHQsIHZhcmlhbnQpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBEUF9QQVJBTV9JTlBVVF9HQUlOOiB7CisgICAgICAgIEFMT0dWVigiZW5naW5lIERQX1BBUkFNX0lOUFVUX0dBSU4gcGFyYW1zaXplOiAlZCB2YWx1ZXNpemUgJWQiLHBhcmFtU2l6ZSwgdmFsdWVTaXplKTsKKyAgICAgICAgaWYgKCFEUF9jaGVja1NpemVzSW50KHBhcmFtU2l6ZSwgdmFsdWVTaXplLCAyIC8qcGFyYW1zKi8sIDEgLyp2YWx1ZXMqLykpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBEUF9QQVJBTV9JTlBVVF9HQUlOIGludmFsaWQgc2l6ZXMuIiwgX19mdW5jX18pOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgaW50MzJfdCBjaGFubmVsID0gcGFyYW1zWzFdOworICAgICAgICBkcF9meDo6RFBDaGFubmVsICogcENoYW5uZWwgPSBEUF9nZXRDaGFubmVsKHBDb250ZXh0LCBjaGFubmVsKTsKKyAgICAgICAgaWYgKHBDaGFubmVsID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBEUF9QQVJBTV9JTlBVVF9HQUlOIGludmFsaWQgY2hhbm5lbCAlZCIsIF9fZnVuY19fLCBjaGFubmVsKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBmbG9hdCBnYWluID0gdmFsdWVzWzBdLmY7CisgICAgICAgIEFMT0dWVigiJXMgRFBfUEFSQU1fSU5QVVRfR0FJTiBjaGFubmVsICVkLCBsZXZlbCAlZiIsIF9fZnVuY19fLCBjaGFubmVsLCBnYWluKTsKKyAgICAgICAgcENoYW5uZWwtPnNldElucHV0R2FpbihnYWluKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRFBfUEFSQU1fUFJFX0VROgorICAgIGNhc2UgRFBfUEFSQU1fUE9TVF9FUTogeworICAgICAgICBBTE9HVlYoImVuZ2luZSBEUF9QQVJBTV8qX0VRIHBhcmFtc2l6ZTogJWQgdmFsdWVzaXplICVkIixwYXJhbVNpemUsIHZhbHVlU2l6ZSk7CisgICAgICAgIGlmICghRFBfY2hlY2tTaXplc0ludChwYXJhbVNpemUsIHZhbHVlU2l6ZSwgMiAvKnBhcmFtcyovLCAzIC8qdmFsdWVzKi8pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgRFBfUEFSQU1fKl9FUSAoY21kICVkKSBpbnZhbGlkIHNpemVzLiIsIF9fZnVuY19fLCBjb21tYW5kKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorLy8gICAgICAgIE51bWJlcltdIHBhcmFtcyA9IHtwYXJhbVNldCwKKy8vICAgICAgICAgICAgICAgIGNoYW5uZWxJbmRleH07CisvLyAgICAgICAgTnVtYmVyW10gdmFsdWVzID0geyAoZXEuaXNJblVzZSgpID8gMSA6IDApLAorLy8gICAgICAgICAgICAgICAgKGVxLmlzRW5hYmxlZCgpID8gMSA6IDApLAorLy8gICAgICAgICAgICAgICAgYmFuZENvdW50fTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBjaGFubmVsID0gcGFyYW1zWzFdOworCisgICAgICAgIGNvbnN0IGludDMyX3QgZW5hYmxlZCA9IHZhbHVlc1sxXS5pOworICAgICAgICBjb25zdCBpbnQzMl90IGJhbmRDb3VudCA9IHZhbHVlc1syXS5pOworICAgICAgICBBTE9HVlYoIiAlcyBjaGFubmVsOiAlZCwgaW5Vc2U6OiVkLCBlbmFibGVkOiVkLCBiYW5kQ291bnQ6JWRcbiIsCisgICAgICAgICAgICAgICAgKGNvbW1hbmQgPT0gRFBfUEFSQU1fUFJFX0VRID8gInByZUVxIiA6ICJwb3N0RXEiKSwgY2hhbm5lbCwgdmFsdWVzWzBdLmksCisgICAgICAgICAgICAgICAgdmFsdWVzWzJdLmksIGJhbmRDb3VudCk7CisKKyAgICAgICAgZHBfZng6OkRQRXEgKnBFcSA9IERQX2dldEVxKHBDb250ZXh0LCBjaGFubmVsLCBjb21tYW5kKTsKKyAgICAgICAgaWYgKHBFcSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgc2V0IFBBUkFNXypfRVEgaW52YWxpZCBjaGFubmVsICVkIG9yIGNvbW1hbmQgJWQiLCBfX2Z1bmNfXywgY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZCk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBwRXEtPnNldEVuYWJsZWQoZW5hYmxlZCAhPSAwKTsKKyAgICAgICAgLy9mYWlsIGlmIGJhbmRjb3VudGlzIGRpZmZlcmVudD8gbWF5YmUuCisgICAgICAgIGlmICgoaW50MzJfdClwRXEtPmdldEJhbmRDb3VudCgpICE9IGJhbmRDb3VudCkgeworICAgICAgICAgICAgQUxPR1coIiVzIHdhcm5pbmcsIHRyeWluZyB0byBzZXQgZGlmZmVyZW50IGJhbmRjb3VudCBmcm9tICVkIHRvICVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgIHBFcS0+Z2V0QmFuZENvdW50KCksIGJhbmRDb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRFBfUEFSQU1fUFJFX0VRX0JBTkQ6CisgICAgY2FzZSBEUF9QQVJBTV9QT1NUX0VRX0JBTkQ6IHsKKyAgICAgICAgQUxPR1ZWKCJlbmdpbmUgc2V0IFBBUkFNXypfRVFfQkFORCBwYXJhbXNpemU6ICVkIHZhbHVlc2l6ZSAlZCIscGFyYW1TaXplLCB2YWx1ZVNpemUpOworICAgICAgICBpZiAoIURQX2NoZWNrU2l6ZXNJbnQocGFyYW1TaXplLCB2YWx1ZVNpemUsIDMgLypwYXJhbXMqLywgMyAvKnZhbHVlcyovKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzIFBBUkFNXypfRVFfQkFORCAoY21kICVkKSBpbnZhbGlkIHNpemVzLiIsIF9fZnVuY19fLCBjb21tYW5kKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorLy8gICAgICAgIE51bWJlcltdIHZhbHVlcyA9IHsgY2hhbm5lbEluZGV4LAorLy8gICAgICAgICAgICAgICAgYmFuZEluZGV4LAorLy8gICAgICAgICAgICAgICAgKGVxQmFuZC5pc0VuYWJsZWQoKSA/IDEgOiAwKSwKKy8vICAgICAgICAgICAgICAgIGVxQmFuZC5nZXRDdXRvZmZGcmVxdWVuY3koKSwKKy8vICAgICAgICAgICAgICAgIGVxQmFuZC5nZXRHYWluKCl9OworCisvLyAgICAgICAgTnVtYmVyW10gcGFyYW1zID0ge3BhcmFtU2V0LAorLy8gICAgICAgICAgICAgICAgY2hhbm5lbEluZGV4LAorLy8gICAgICAgICAgICAgICAgYmFuZEluZGV4fTsKKy8vICAgICAgICBOdW1iZXJbXSB2YWx1ZXMgPSB7KGVxQmFuZC5pc0VuYWJsZWQoKSA/IDEgOiAwKSwKKy8vICAgICAgICAgICAgICBlcUJhbmQuZ2V0Q3V0b2ZmRnJlcXVlbmN5KCksCisvLyAgICAgICAgICAgICAgZXFCYW5kLmdldEdhaW4oKX07CisKKyAgICAgICAgY29uc3QgaW50MzJfdCBjaGFubmVsID0gcGFyYW1zWzFdOworICAgICAgICBjb25zdCBpbnQzMl90IGJhbmQgPSBwYXJhbXNbMl07CisKKyAgICAgICAgY29uc3QgaW50MzJfdCBlbmFibGVkID0gdmFsdWVzWzBdLmk7CisgICAgICAgIGNvbnN0IGZsb2F0IGN1dG9mZkZyZXF1ZW5jeSA9IHZhbHVlc1sxXS5mOworICAgICAgICBjb25zdCBmbG9hdCBnYWluID0gdmFsdWVzWzJdLmY7CisKKworICAgICAgICBBTE9HVlYoIiAlcyBjaGFubmVsOiAlZCwgYmFuZDo6JWQsIGVuYWJsZWQ6JWQsIGN1dG9mZkZyZXF1ZW5jeTolZiwgZ2FpbiVmXG4iLAorICAgICAgICAgICAgICAgIChjb21tYW5kID09IERQX1BBUkFNX1BSRV9FUV9CQU5EID8gInByZUVxQmFuZCIgOiAicG9zdEVxQmFuZCIpLCBjaGFubmVsLCBiYW5kLAorICAgICAgICAgICAgICAgIGVuYWJsZWQsIGN1dG9mZkZyZXF1ZW5jeSwgZ2Fpbik7CisKKyAgICAgICAgaW50IGVxQ29tbWFuZCA9IChjb21tYW5kID09IERQX1BBUkFNX1BSRV9FUV9CQU5EID8gRFBfUEFSQU1fUFJFX0VRIDoKKyAgICAgICAgICAgICAgICAoY29tbWFuZCA9PSBEUF9QQVJBTV9QT1NUX0VRX0JBTkQgPyBEUF9QQVJBTV9QT1NUX0VRIDogLTEpKTsKKyAgICAgICAgZHBfZng6OkRQRXEgKnBFcSA9IERQX2dldEVxKHBDb250ZXh0LCBjaGFubmVsLCBlcUNvbW1hbmQpOworICAgICAgICBpZiAocEVxID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBzZXQgUEFSQU1fKl9FUV9CQU5EIGludmFsaWQgY2hhbm5lbCAlZCBvciBjb21tYW5kICVkIiwgX19mdW5jX18sIGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQpOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZHBfZng6OkRQRXFCYW5kIGVxQmFuZDsKKyAgICAgICAgZXFCYW5kLmluaXQoZW5hYmxlZCAhPSAwLCBjdXRvZmZGcmVxdWVuY3ksIGdhaW4pOworICAgICAgICBwRXEtPnNldEJhbmQoYmFuZCwgZXFCYW5kKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRFBfUEFSQU1fTUJDOiB7CisgICAgICAgIEFMT0dWVigiZW5naW5lIERQX1BBUkFNX01CQyBwYXJhbXNpemU6ICVkIHZhbHVlc2l6ZSAlZCIscGFyYW1TaXplLCB2YWx1ZVNpemUpOworICAgICAgICBpZiAoIURQX2NoZWNrU2l6ZXNJbnQocGFyYW1TaXplLCB2YWx1ZVNpemUsIDIgLypwYXJhbXMqLywgMyAvKnZhbHVlcyovKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzIERQX1BBUkFNX01CQyAoY21kICVkKSBpbnZhbGlkIHNpemVzLiIsIF9fZnVuY19fLCBjb21tYW5kKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorLy8gICAgICAgICAgICBOdW1iZXJbXSBwYXJhbXMgPSB7IFBBUkFNX01CQywKKy8vICAgICAgICAgICAgICAgICAgICBjaGFubmVsSW5kZXh9OworLy8gICAgICAgICAgICBOdW1iZXJbXSB2YWx1ZXMgPSB7KG1iYy5pc0luVXNlKCkgPyAxIDogMCksCisvLyAgICAgICAgICAgICAgICAgICAgKG1iYy5pc0VuYWJsZWQoKSA/IDEgOiAwKSwKKy8vICAgICAgICAgICAgICAgICAgICBiYW5kQ291bnR9OworICAgICAgICBjb25zdCBpbnQzMl90IGNoYW5uZWwgPSBwYXJhbXNbMV07CisKKyAgICAgICAgY29uc3QgaW50MzJfdCBlbmFibGVkID0gdmFsdWVzWzFdLmk7CisgICAgICAgIGNvbnN0IGludDMyX3QgYmFuZENvdW50ID0gdmFsdWVzWzJdLmk7CisgICAgICAgIEFMT0dWVigiTUJDIGNoYW5uZWw6ICVkLCBpblVzZTo6JWQsIGVuYWJsZWQ6JWQsIGJhbmRDb3VudDolZFxuIiwgY2hhbm5lbCwgdmFsdWVzWzBdLmksCisgICAgICAgICAgICAgICAgZW5hYmxlZCwgYmFuZENvdW50KTsKKworICAgICAgICBkcF9meDo6RFBNYmMgKnBNYmMgPSBEUF9nZXRNYmMocENvbnRleHQsIGNoYW5uZWwpOworICAgICAgICBpZiAocE1iYyA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgc2V0IERQX1BBUkFNX01CQyBpbnZhbGlkIGNoYW5uZWwgJWQgIiwgX19mdW5jX18sIGNoYW5uZWwpOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcE1iYy0+c2V0RW5hYmxlZChlbmFibGVkICE9IDApOworICAgICAgICAvL2ZhaWwgaWYgYmFuZGNvdW50aXMgZGlmZmVyZW50PyBtYXliZS4KKyAgICAgICAgaWYgKChpbnQzMl90KXBNYmMtPmdldEJhbmRDb3VudCgpICE9IGJhbmRDb3VudCkgeworICAgICAgICAgICAgQUxPR1coIiVzIHdhcm5pbmcsIHRyeWluZyB0byBzZXQgZGlmZmVyZW50IGJhbmRjb3VudCBmcm9tICVkIHRvICVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgIHBNYmMtPmdldEJhbmRDb3VudCgpLCBiYW5kQ291bnQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERQX1BBUkFNX01CQ19CQU5EOiB7CisgICAgICAgIEFMT0dWVigiZW5naW5lIHNldCBEUF9QQVJBTV9NQkNfQkFORCBwYXJhbXNpemU6ICVkIHZhbHVlc2l6ZSAlZCAiLHBhcmFtU2l6ZSwgdmFsdWVTaXplKTsKKyAgICAgICAgaWYgKCFEUF9jaGVja1NpemVzSW50KHBhcmFtU2l6ZSwgdmFsdWVTaXplLCAzIC8qcGFyYW1zKi8sIDExIC8qdmFsdWVzKi8pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgRFBfUEFSQU1fTUJDX0JBTkQ6IChjbWQgJWQpIGludmFsaWQgc2l6ZXMuIiwgX19mdW5jX18sIGNvbW1hbmQpOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisvLyAgICAgICAgTnVtYmVyW10gcGFyYW1zID0geyBQQVJBTV9NQkNfQkFORCwKKy8vICAgICAgICAgICAgICAgIGNoYW5uZWxJbmRleCwKKy8vICAgICAgICAgICAgICAgIGJhbmRJbmRleH07CisvLyAgICAgICAgTnVtYmVyW10gdmFsdWVzID0geyhtYmNCYW5kLmlzRW5hYmxlZCgpID8gMSA6IDApLAorLy8gICAgICAgICAgICAgICAgbWJjQmFuZC5nZXRDdXRvZmZGcmVxdWVuY3koKSwKKy8vICAgICAgICAgICAgICAgIG1iY0JhbmQuZ2V0QXR0YWNrVGltZSgpLAorLy8gICAgICAgICAgICAgICAgbWJjQmFuZC5nZXRSZWxlYXNlVGltZSgpLAorLy8gICAgICAgICAgICAgICAgbWJjQmFuZC5nZXRSYXRpbygpLAorLy8gICAgICAgICAgICAgICAgbWJjQmFuZC5nZXRUaHJlc2hvbGQoKSwKKy8vICAgICAgICAgICAgICAgIG1iY0JhbmQuZ2V0S25lZVdpZHRoKCksCisvLyAgICAgICAgICAgICAgICBtYmNCYW5kLmdldE5vaXNlR2F0ZVRocmVzaG9sZCgpLAorLy8gICAgICAgICAgICAgICAgbWJjQmFuZC5nZXRFeHBhbmRlclJhdGlvKCksCisvLyAgICAgICAgICAgICAgICBtYmNCYW5kLmdldFByZUdhaW4oKSwKKy8vICAgICAgICAgICAgICAgIG1iY0JhbmQuZ2V0UG9zdEdhaW4oKX07CisKKyAgICAgICAgY29uc3QgaW50MzJfdCBjaGFubmVsID0gcGFyYW1zWzFdOworICAgICAgICBjb25zdCBpbnQzMl90IGJhbmQgPSBwYXJhbXNbMl07CisKKyAgICAgICAgY29uc3QgaW50MzJfdCBlbmFibGVkID0gdmFsdWVzWzBdLmk7CisgICAgICAgIGNvbnN0IGZsb2F0IGN1dG9mZkZyZXF1ZW5jeSA9IHZhbHVlc1sxXS5mOworICAgICAgICBjb25zdCBmbG9hdCBhdHRhY2tUaW1lID0gdmFsdWVzWzJdLmY7CisgICAgICAgIGNvbnN0IGZsb2F0IHJlbGVhc2VUaW1lID0gdmFsdWVzWzNdLmY7CisgICAgICAgIGNvbnN0IGZsb2F0IHJhdGlvID0gdmFsdWVzWzRdLmY7CisgICAgICAgIGNvbnN0IGZsb2F0IHRocmVzaG9sZCA9IHZhbHVlc1s1XS5mOworICAgICAgICBjb25zdCBmbG9hdCBrbmVlV2lkdGggPSB2YWx1ZXNbNl0uZjsKKyAgICAgICAgY29uc3QgZmxvYXQgbm9pc2VHYXRlVGhyZXNob2xkID0gdmFsdWVzWzddLmY7CisgICAgICAgIGNvbnN0IGZsb2F0IGV4cGFuZGVyUmF0aW8gPSB2YWx1ZXNbOF0uZjsKKyAgICAgICAgY29uc3QgZmxvYXQgcHJlR2FpbiA9IHZhbHVlc1s5XS5mOworICAgICAgICBjb25zdCBmbG9hdCBwb3N0R2FpbiA9IHZhbHVlc1sxMF0uZjsKKworICAgICAgICBBTE9HVlYoIiBtYmNCYW5kIGNoYW5uZWw6ICVkLCBiYW5kOjolZCwgZW5hYmxlZDolZCwgY3V0b2ZmRnJlcXVlbmN5OiVmLCBhdHRhY2tUaW1lOiVmLCIKKyAgICAgICAgICAgICAgICAicmVsZWFzZVRpbWU6JWYsIHJhdGlvOiVmLCB0aHJlc2hvbGQ6JWYsIGtuZWVXaWR0aDolZiwgbm9pc2VHYXRlVGhyZXNob2xkOiVmLCIKKyAgICAgICAgICAgICAgICAiZXhwYW5kZXJSYXRpbzolZiwgcHJlR2FpbjolZiwgcG9zdEdhaW46JWZcbiIsCisgICAgICAgICAgICAgICAgY2hhbm5lbCwgYmFuZCwgZW5hYmxlZCwgY3V0b2ZmRnJlcXVlbmN5LCBhdHRhY2tUaW1lLCByZWxlYXNlVGltZSwgcmF0aW8sCisgICAgICAgICAgICAgICAgdGhyZXNob2xkLCBrbmVlV2lkdGgsIG5vaXNlR2F0ZVRocmVzaG9sZCwgZXhwYW5kZXJSYXRpbywgcHJlR2FpbiwgcG9zdEdhaW4pOworCisgICAgICAgIGRwX2Z4OjpEUE1iYyAqcE1iYyA9IERQX2dldE1iYyhwQ29udGV4dCwgY2hhbm5lbCk7CisgICAgICAgIGlmIChwTWJjID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBzZXQgRFBfUEFSQU1fTUJDX0JBTkQgaW52YWxpZCBjaGFubmVsICVkIiwgX19mdW5jX18sIGNoYW5uZWwpOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZHBfZng6OkRQTWJjQmFuZCBtYmNCYW5kOworICAgICAgICBtYmNCYW5kLmluaXQoZW5hYmxlZCAhPSAwLCBjdXRvZmZGcmVxdWVuY3ksIGF0dGFja1RpbWUsIHJlbGVhc2VUaW1lLCByYXRpbywgdGhyZXNob2xkLAorICAgICAgICAgICAgICAgIGtuZWVXaWR0aCwgbm9pc2VHYXRlVGhyZXNob2xkLCBleHBhbmRlclJhdGlvLCBwcmVHYWluLCBwb3N0R2Fpbik7CisgICAgICAgIHBNYmMtPnNldEJhbmQoYmFuZCwgbWJjQmFuZCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIERQX1BBUkFNX0xJTUlURVI6IHsKKyAgICAgICAgQUxPR1ZWKCJlbmdpbmUgRFBfUEFSQU1fTElNSVRFUiBwYXJhbXNpemU6ICVkIHZhbHVlc2l6ZSAlZCIscGFyYW1TaXplLCB2YWx1ZVNpemUpOworICAgICAgICBpZiAoIURQX2NoZWNrU2l6ZXNJbnQocGFyYW1TaXplLCB2YWx1ZVNpemUsIDIgLypwYXJhbXMqLywgOCAvKnZhbHVlcyovKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzIERQX1BBUkFNX0xJTUlURVIgKGNtZCAlZCkgaW52YWxpZCBzaXplcy4iLCBfX2Z1bmNfXywgY29tbWFuZCk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKy8vICAgICAgICAgICAgTnVtYmVyW10gcGFyYW1zID0geyBQQVJBTV9MSU1JVEVSLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxJbmRleH07CisvLyAgICAgICAgICAgICAgICAgICAgIE51bWJlcltdIHZhbHVlcyA9IHsobGltaXRlci5pc0luVXNlKCkgPyAxIDogMCksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpbWl0ZXIuaXNFbmFibGVkKCkgPyAxIDogMCksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRlci5nZXRMaW5rR3JvdXAoKSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdGVyLmdldEF0dGFja1RpbWUoKSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdGVyLmdldFJlbGVhc2VUaW1lKCksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRlci5nZXRSYXRpbygpLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ZXIuZ2V0VGhyZXNob2xkKCksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRlci5nZXRQb3N0R2FpbigpfTsKKworICAgICAgICBjb25zdCBpbnQzMl90IGNoYW5uZWwgPSBwYXJhbXNbMV07CisKKyAgICAgICAgY29uc3QgaW50MzJfdCBpblVzZSA9IHZhbHVlc1swXS5pOworICAgICAgICBjb25zdCBpbnQzMl90IGVuYWJsZWQgPSB2YWx1ZXNbMV0uaTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBsaW5rR3JvdXAgPSB2YWx1ZXNbMl0uaTsKKyAgICAgICAgY29uc3QgZmxvYXQgYXR0YWNrVGltZSA9IHZhbHVlc1szXS5mOworICAgICAgICBjb25zdCBmbG9hdCByZWxlYXNlVGltZSA9IHZhbHVlc1s0XS5mOworICAgICAgICBjb25zdCBmbG9hdCByYXRpbyA9IHZhbHVlc1s1XS5mOworICAgICAgICBjb25zdCBmbG9hdCB0aHJlc2hvbGQgPSB2YWx1ZXNbNl0uZjsKKyAgICAgICAgY29uc3QgZmxvYXQgcG9zdEdhaW4gPSB2YWx1ZXNbN10uZjsKKworICAgICAgICBBTE9HVlYoIiBMaW1pdGVyIGNoYW5uZWw6ICVkLCBpblVzZTo6JWQsIGVuYWJsZWQ6JWQsIGxpbmtncm91cDolZCBhdHRhY2tUaW1lOiVmLCIKKyAgICAgICAgICAgICAgICAicmVsZWFzZVRpbWU6JWYsIHJhdGlvOiVmLCB0aHJlc2hvbGQ6JWYsIHBvc3RHYWluOiVmXG4iLCBjaGFubmVsLCBpblVzZSwKKyAgICAgICAgICAgICAgICBlbmFibGVkLCBsaW5rR3JvdXAsIGF0dGFja1RpbWUsIHJlbGVhc2VUaW1lLCByYXRpbywgdGhyZXNob2xkLCBwb3N0R2Fpbik7CisKKyAgICAgICAgZHBfZng6OkRQQ2hhbm5lbCAqIHBDaGFubmVsID0gRFBfZ2V0Q2hhbm5lbChwQ29udGV4dCwgY2hhbm5lbCk7CisgICAgICAgIGlmIChwQ2hhbm5lbCA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgRFBfUEFSQU1fTElNSVRFUiBpbnZhbGlkIGNoYW5uZWwgJWQiLCBfX2Z1bmNfXywgY2hhbm5lbCk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZHBfZng6OkRQTGltaXRlciBsaW1pdGVyOworICAgICAgICBsaW1pdGVyLmluaXQoaW5Vc2UgIT0gMCwgZW5hYmxlZCAhPSAwLCBsaW5rR3JvdXAsIGF0dGFja1RpbWUsIHJlbGVhc2VUaW1lLCByYXRpbywKKyAgICAgICAgICAgICAgICB0aHJlc2hvbGQsIHBvc3RHYWluKTsKKyAgICAgICAgcENoYW5uZWwtPnNldExpbWl0ZXIobGltaXRlcik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiJXMgaW52YWxpZCBwYXJhbSAlZCIsIF9fZnVuY19fLCBwYXJhbXNbMF0pOworICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBBTE9HVlYoIiVzIGVuZCBwYXJhbTogJWQsIHN0YXR1czogJWQiLCBfX2Z1bmNfXywgcGFyYW1zWzBdLCBzdGF0dXMpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIGVuZCBEUF9zZXRQYXJhbWV0ZXIgKi8KKworLyogRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uOiBnZXRfZGVzY3JpcHRvciAqLworaW50IERQX2dldERlc2NyaXB0b3IoZWZmZWN0X2hhbmRsZV90IHNlbGYsCisgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKQoreworICAgIER5bmFtaWNzUHJvY2Vzc2luZ0NvbnRleHQgKiBwQ29udGV4dCA9IChEeW5hbWljc1Byb2Nlc3NpbmdDb250ZXh0ICopIHNlbGY7CisKKyAgICBpZiAocENvbnRleHQgPT0gTlVMTCB8fCBwRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJEUF9nZXREZXNjcmlwdG9yKCkgaW52YWxpZCBwYXJhbSIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICAqcERlc2NyaXB0b3IgPSBnRFBEZXNjcmlwdG9yOworCisgICAgcmV0dXJuIDA7Cit9IC8qIGVuZCBEUF9nZXREZXNjcmlwdG9yICovCisKKworLy8gZWZmZWN0X2hhbmRsZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgRHluYW1pY3MgUHJvY2Vzc2luZyBlZmZlY3QKK2NvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgZ0RQSW50ZXJmYWNlID0geworICAgICAgICBEUF9wcm9jZXNzLAorICAgICAgICBEUF9jb21tYW5kLAorICAgICAgICBEUF9nZXREZXNjcmlwdG9yLAorICAgICAgICBOVUxMLAorfTsKKworZXh0ZXJuICJDIiB7CisvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCitfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCithdWRpb19lZmZlY3RfbGlicmFyeV90IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNID0geworICAgIC50YWcgPSBBVURJT19FRkZFQ1RfTElCUkFSWV9UQUcsCisgICAgLnZlcnNpb24gPSBFRkZFQ1RfTElCUkFSWV9BUElfVkVSU0lPTiwKKyAgICAubmFtZSA9ICJEeW5hbWljcyBQcm9jZXNzaW5nIExpYnJhcnkiLAorICAgIC5pbXBsZW1lbnRvciA9ICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IiwKKyAgICAuY3JlYXRlX2VmZmVjdCA9IERQTGliX0NyZWF0ZSwKKyAgICAucmVsZWFzZV9lZmZlY3QgPSBEUExpYl9SZWxlYXNlLAorICAgIC5nZXRfZGVzY3JpcHRvciA9IERQTGliX0dldERlc2NyaXB0b3IsCit9OworCit9OyAvLyBleHRlcm4gIkMiCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnJlbmFtZSB0byBtZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9OT1RJQ0UgYi9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFjYzZlOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZHluYW1pY3Nwcm9jL05PVElDRQpAQCAtMCwwICsxLDE5MCBAQAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZHluYW1pY3Nwcm9jL2RzcC9EUEJhc2UuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9keW5hbWljc3Byb2MvZHNwL0RQQmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI3OTk5MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZHluYW1pY3Nwcm9jL2RzcC9EUEJhc2UuY3BwCkBAIC0wLDAgKzEsMjY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJEUEJhc2UiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSAiRFBCYXNlLmgiCisjaW5jbHVkZSAiRFBGcmVxdWVuY3kuaCIKKworbmFtZXNwYWNlIGRwX2Z4IHsKKworRFBTdGFnZTo6RFBTdGFnZSgpIDogbUluVXNlKERQX0RFRkFVTFRfU1RBR0VfSU5VU0UpLAorICAgICAgICBtRW5hYmxlZChEUF9ERUZBVUxUX1NUQUdFX0VOQUJMRUQpIHsKK30KKwordm9pZCBEUFN0YWdlOjppbml0KGJvb2wgaW5Vc2UsIGJvb2wgZW5hYmxlZCkgeworICAgIG1JblVzZSA9IGluVXNlOworICAgIG1FbmFibGVkID0gZW5hYmxlZDsKK30KKworLy8tLS0tCitEUEJhbmRTdGFnZTo6RFBCYW5kU3RhZ2UoKSA6IG1CYW5kQ291bnQoMCkgeworfQorCit2b2lkIERQQmFuZFN0YWdlOjppbml0KGJvb2wgaW5Vc2UsIGJvb2wgZW5hYmxlZCwgaW50IGJhbmRDb3VudCkgeworICAgIERQU3RhZ2U6OmluaXQoaW5Vc2UsIGVuYWJsZWQpOworICAgIG1CYW5kQ291bnQgPSBpblVzZSA/IGJhbmRDb3VudCA6IDA7Cit9CisKKy8vLS0tCitEUEJhbmRCYXNlOjpEUEJhbmRCYXNlKCkgeworICAgIGluaXQoRFBfREVGQVVMVF9CQU5EX0VOQUJMRUQsCisgICAgICAgICAgICBEUF9ERUZBVUxUX0JBTkRfQ1VUT0ZGX0ZSRVFVRU5DWV9IWik7Cit9CisKK3ZvaWQgRFBCYW5kQmFzZTo6aW5pdChib29sIGVuYWJsZWQsIGZsb2F0IGN1dG9mZkZyZXF1ZW5jeSl7CisgICAgbUVuYWJsZWQgPSBlbmFibGVkOworICAgIG1DdXRvb2ZGcmVxdWVuY3lIeiA9IGN1dG9mZkZyZXF1ZW5jeTsKK30KKworLy8tLS0tLQorRFBFcUJhbmQ6OkRQRXFCYW5kKCkgeworICAgIGluaXQoRFBfREVGQVVMVF9CQU5EX0VOQUJMRUQsCisgICAgICAgICAgICBEUF9ERUZBVUxUX0JBTkRfQ1VUT0ZGX0ZSRVFVRU5DWV9IWiwKKyAgICAgICAgICAgIERQX0RFRkFVTFRfR0FJTl9EQik7Cit9CisKK3ZvaWQgRFBFcUJhbmQ6OmluaXQoYm9vbCBlbmFibGVkLCBmbG9hdCBjdXRvZmZGcmVxdWVuY3ksIGZsb2F0IGdhaW4pIHsKKyAgICBEUEJhbmRCYXNlOjppbml0KGVuYWJsZWQsIGN1dG9mZkZyZXF1ZW5jeSk7CisgICAgc2V0R2FpbihnYWluKTsKK30KKworZmxvYXQgRFBFcUJhbmQ6OmdldEdhaW4oKSBjb25zdHsKKyAgICByZXR1cm4gbUdhaW5EYjsKK30KKwordm9pZCBEUEVxQmFuZDo6c2V0R2FpbihmbG9hdCBnYWluKSB7CisgICAgbUdhaW5EYiA9IGdhaW47Cit9CisKKy8vLS0tLS0tCitEUE1iY0JhbmQ6OkRQTWJjQmFuZCgpIHsKKyAgICBpbml0KERQX0RFRkFVTFRfQkFORF9FTkFCTEVELAorICAgICAgICAgICAgRFBfREVGQVVMVF9CQU5EX0NVVE9GRl9GUkVRVUVOQ1lfSFosCisgICAgICAgICAgICBEUF9ERUZBVUxUX0FUVEFDS19USU1FX01TLAorICAgICAgICAgICAgRFBfREVGQVVMVF9SRUxFQVNFX1RJTUVfTVMsCisgICAgICAgICAgICBEUF9ERUZBVUxUX1JBVElPLAorICAgICAgICAgICAgRFBfREVGQVVMVF9USFJFU0hPTERfREIsCisgICAgICAgICAgICBEUF9ERUZBVUxUX0tORUVfV0lEVEhfREIsCisgICAgICAgICAgICBEUF9ERUZBVUxUX05PSVNFX0dBVEVfVEhSRVNIT0xEX0RCLAorICAgICAgICAgICAgRFBfREVGQVVMVF9FWFBBTkRFUl9SQVRJTywKKyAgICAgICAgICAgIERQX0RFRkFVTFRfR0FJTl9EQiwKKyAgICAgICAgICAgIERQX0RFRkFVTFRfR0FJTl9EQik7Cit9CisKK3ZvaWQgRFBNYmNCYW5kOjppbml0KGJvb2wgZW5hYmxlZCwgZmxvYXQgY3V0b2ZmRnJlcXVlbmN5LCBmbG9hdCBhdHRhY2tUaW1lLCBmbG9hdCByZWxlYXNlVGltZSwKKyAgICAgICAgZmxvYXQgcmF0aW8sIGZsb2F0IHRocmVzaG9sZCwgZmxvYXQga25lZVdpZHRoLCBmbG9hdCBub2lzZUdhdGVUaHJlc2hvbGQsCisgICAgICAgIGZsb2F0IGV4cGFuZGVyUmF0aW8sIGZsb2F0IHByZUdhaW4sIGZsb2F0IHBvc3RHYWluKSB7CisgICAgRFBCYW5kQmFzZTo6aW5pdChlbmFibGVkLCBjdXRvZmZGcmVxdWVuY3kpOworICAgIHNldEF0dGFja1RpbWUoYXR0YWNrVGltZSk7CisgICAgc2V0UmVsZWFzZVRpbWUocmVsZWFzZVRpbWUpOworICAgIHNldFJhdGlvKHJhdGlvKTsKKyAgICBzZXRUaHJlc2hvbGQodGhyZXNob2xkKTsKKyAgICBzZXRLbmVlV2lkdGgoa25lZVdpZHRoKTsKKyAgICBzZXROb2lzZUdhdGVUaHJlc2hvbGQobm9pc2VHYXRlVGhyZXNob2xkKTsKKyAgICBzZXRFeHBhbmRlclJhdGlvKGV4cGFuZGVyUmF0aW8pOworICAgIHNldFByZUdhaW4ocHJlR2Fpbik7CisgICAgc2V0UG9zdEdhaW4ocG9zdEdhaW4pOworfQorCisvLy0tLS0tLQorRFBFcTo6RFBFcSgpIHsKK30KKwordm9pZCBEUEVxOjppbml0KGJvb2wgaW5Vc2UsIGJvb2wgZW5hYmxlZCwgdWludDMyX3QgYmFuZENvdW50KSB7CisgICAgRFBCYW5kU3RhZ2U6OmluaXQoaW5Vc2UsIGVuYWJsZWQsIGJhbmRDb3VudCk7CisgICAgbUJhbmRzLnJlc2l6ZShnZXRCYW5kQ291bnQoKSk7Cit9CisKK0RQRXFCYW5kICogRFBFcTo6Z2V0QmFuZCh1aW50MzJfdCBiYW5kKSB7CisgICAgaWYgKGJhbmQgPCBnZXRCYW5kQ291bnQoKSkgeworICAgICAgICByZXR1cm4gJm1CYW5kc1tiYW5kXTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgRFBFcTo6c2V0QmFuZCh1aW50MzJfdCBiYW5kLCBEUEVxQmFuZCAmc3JjKSB7CisgICAgaWYgKGJhbmQgPCBnZXRCYW5kQ291bnQoKSkgeworICAgICAgICBtQmFuZHNbYmFuZF0gPSBzcmM7CisgICAgfQorfQorCisvLy0tLS0tLQorRFBNYmM6OkRQTWJjKCkgeworfQorCit2b2lkIERQTWJjOjppbml0KGJvb2wgaW5Vc2UsIGJvb2wgZW5hYmxlZCwgdWludDMyX3QgYmFuZENvdW50KSB7CisgICAgRFBCYW5kU3RhZ2U6OmluaXQoaW5Vc2UsIGVuYWJsZWQsIGJhbmRDb3VudCk7CisgICAgaWYgKGlzSW5Vc2UoKSkgeworICAgICAgICBtQmFuZHMucmVzaXplKGJhbmRDb3VudCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUJhbmRzLnJlc2l6ZSgwKTsKKyAgICB9Cit9CisKK0RQTWJjQmFuZCAqIERQTWJjOjpnZXRCYW5kKHVpbnQzMl90IGJhbmQpIHsKKyAgICBpZiAoYmFuZCA8IGdldEJhbmRDb3VudCgpKSB7CisgICAgICAgIHJldHVybiAmbUJhbmRzW2JhbmRdOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBEUE1iYzo6c2V0QmFuZCh1aW50MzJfdCBiYW5kLCBEUE1iY0JhbmQgJnNyYykgeworICAgIGlmIChiYW5kIDwgZ2V0QmFuZENvdW50KCkpIHsKKyAgICAgICAgbUJhbmRzW2JhbmRdID0gc3JjOworICAgIH0KK30KKworLy8tLS0tLS0KK0RQTGltaXRlcjo6RFBMaW1pdGVyKCkgeworICAgIGluaXQoRFBfREVGQVVMVF9TVEFHRV9JTlVTRSwKKyAgICAgICAgICAgIERQX0RFRkFVTFRfU1RBR0VfRU5BQkxFRCwKKyAgICAgICAgICAgIERQX0RFRkFVTFRfTElOS19HUk9VUCwKKyAgICAgICAgICAgIERQX0RFRkFVTFRfQVRUQUNLX1RJTUVfTVMsCisgICAgICAgICAgICBEUF9ERUZBVUxUX1JFTEVBU0VfVElNRV9NUywKKyAgICAgICAgICAgIERQX0RFRkFVTFRfUkFUSU8sCisgICAgICAgICAgICBEUF9ERUZBVUxUX1RIUkVTSE9MRF9EQiwKKyAgICAgICAgICAgIERQX0RFRkFVTFRfR0FJTl9EQik7Cit9CisKK3ZvaWQgRFBMaW1pdGVyOjppbml0KGJvb2wgaW5Vc2UsIGJvb2wgZW5hYmxlZCwgdWludDMyX3QgbGlua0dyb3VwLCBmbG9hdCBhdHRhY2tUaW1lLCBmbG9hdCByZWxlYXNlVGltZSwKKyAgICAgICAgZmxvYXQgcmF0aW8sIGZsb2F0IHRocmVzaG9sZCwgZmxvYXQgcG9zdEdhaW4pIHsKKyAgICBEUFN0YWdlOjppbml0KGluVXNlLCBlbmFibGVkKTsKKyAgICBzZXRMaW5rR3JvdXAobGlua0dyb3VwKTsKKyAgICBzZXRBdHRhY2tUaW1lKGF0dGFja1RpbWUpOworICAgIHNldFJlbGVhc2VUaW1lKHJlbGVhc2VUaW1lKTsKKyAgICBzZXRSYXRpbyhyYXRpbyk7CisgICAgc2V0VGhyZXNob2xkKHRocmVzaG9sZCk7CisgICAgc2V0UG9zdEdhaW4ocG9zdEdhaW4pOworfQorCisvLy0tLS0KK0RQQ2hhbm5lbDo6RFBDaGFubmVsKCkgOiBtSW5pdGlhbGl6ZWQoZmFsc2UpLCBtSW5wdXRHYWluRGIoMCksIG1QcmVFcUluVXNlKGZhbHNlKSwgbU1iY0luVXNlKGZhbHNlKSwKKyAgICAgICAgbVBvc3RFcUluVXNlKGZhbHNlKSwgbUxpbWl0ZXJJblVzZShmYWxzZSkgeworfQorCit2b2lkIERQQ2hhbm5lbDo6aW5pdChmbG9hdCBpbnB1dEdhaW4sIGJvb2wgcHJlRXFJblVzZSwgdWludDMyX3QgcHJlRXFCYW5kQ291bnQsCisgICAgICAgIGJvb2wgbWJjSW5Vc2UsIHVpbnQzMl90IG1iY0JhbmRDb3VudCwgYm9vbCBwb3N0RXFJblVzZSwgdWludDMyX3QgcG9zdEVxQmFuZENvdW50LAorICAgICAgICBib29sIGxpbWl0ZXJJblVzZSkgeworICAgIHNldElucHV0R2FpbihpbnB1dEdhaW4pOworICAgIG1QcmVFcUluVXNlID0gcHJlRXFJblVzZTsKKyAgICBtTWJjSW5Vc2UgPSBtYmNJblVzZTsKKyAgICBtUG9zdEVxSW5Vc2UgPSBwb3N0RXFJblVzZTsKKyAgICBtTGltaXRlckluVXNlID0gbGltaXRlckluVXNlOworCisgICAgbVByZUVxLmluaXQobVByZUVxSW5Vc2UsIGZhbHNlLCBwcmVFcUJhbmRDb3VudCk7CisgICAgbU1iYy5pbml0KG1NYmNJblVzZSwgZmFsc2UsIG1iY0JhbmRDb3VudCk7CisgICAgbVBvc3RFcS5pbml0KG1Qb3N0RXFJblVzZSwgZmFsc2UsIHBvc3RFcUJhbmRDb3VudCk7CisgICAgbUxpbWl0ZXIuaW5pdChtTGltaXRlckluVXNlLCBmYWxzZSwgMCwgNTAsIDEyMCwgMiwgLTMwLCAwKTsKKyAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworfQorCitEUEVxKiBEUENoYW5uZWw6OmdldFByZUVxKCkgeworICAgIGlmICghbUluaXRpYWxpemVkKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gJm1QcmVFcTsKK30KKworRFBNYmMqIERQQ2hhbm5lbDo6Z2V0TWJjKCkgeworICAgIGlmICghbUluaXRpYWxpemVkKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gJm1NYmM7Cit9CisKK0RQRXEqIERQQ2hhbm5lbDo6Z2V0UG9zdEVxKCkgeworICAgIGlmICghbUluaXRpYWxpemVkKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gJm1Qb3N0RXE7Cit9CisKK0RQTGltaXRlciogRFBDaGFubmVsOjpnZXRMaW1pdGVyKCkgeworICAgIGlmICghbUluaXRpYWxpemVkKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gJm1MaW1pdGVyOworfQorCit2b2lkIERQQ2hhbm5lbDo6c2V0TGltaXRlcihEUExpbWl0ZXIgJmxpbWl0ZXIpIHsKKyAgICBpZiAoIW1Jbml0aWFsaXplZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1MaW1pdGVyID0gbGltaXRlcjsKK30KKworLy8tLS0tCitEUEJhc2U6OkRQQmFzZSgpIDogbUluaXRpYWxpemVkKGZhbHNlKSwgbUNoYW5uZWxDb3VudCgwKSwgbVByZUVxSW5Vc2UoZmFsc2UpLCBtUHJlRXFCYW5kQ291bnQoMCksCisgICAgICAgIG1NYmNJblVzZShmYWxzZSksIG1NYmNCYW5kQ291bnQoMCksIG1Qb3N0RXFJblVzZShmYWxzZSksIG1Qb3N0RXFCYW5kQ291bnQoMCksCisgICAgICAgIG1MaW1pdGVySW5Vc2UoZmFsc2UpIHsKK30KKwordm9pZCBEUEJhc2U6OmluaXQodWludDMyX3QgY2hhbm5lbENvdW50LCBib29sIHByZUVxSW5Vc2UsIHVpbnQzMl90IHByZUVxQmFuZENvdW50LAorICAgICAgICBib29sIG1iY0luVXNlLCB1aW50MzJfdCBtYmNCYW5kQ291bnQsIGJvb2wgcG9zdEVxSW5Vc2UsIHVpbnQzMl90IHBvc3RFcUJhbmRDb3VudCwKKyAgICAgICAgYm9vbCBsaW1pdGVySW5Vc2UpIHsKKyAgICBBTE9HVigiRFBCYXNlOjppbml0Iik7CisgICAgbUNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDsKKyAgICBtUHJlRXFJblVzZSA9IHByZUVxSW5Vc2U7CisgICAgbVByZUVxQmFuZENvdW50ID0gcHJlRXFCYW5kQ291bnQ7CisgICAgbU1iY0luVXNlID0gbWJjSW5Vc2U7CisgICAgbU1iY0JhbmRDb3VudCA9IG1iY0JhbmRDb3VudDsKKyAgICBtUG9zdEVxSW5Vc2UgPSBwb3N0RXFJblVzZTsKKyAgICBtUG9zdEVxQmFuZENvdW50ID0gcG9zdEVxQmFuZENvdW50OworICAgIG1MaW1pdGVySW5Vc2UgPSBsaW1pdGVySW5Vc2U7CisgICAgbUNoYW5uZWwucmVzaXplKG1DaGFubmVsQ291bnQpOworICAgIGZvciAoc2l6ZV90IGNoID0gMDsgY2ggPCBtQ2hhbm5lbENvdW50OyBjaCsrKSB7CisgICAgICAgIG1DaGFubmVsW2NoXS5pbml0KDAsIHByZUVxSW5Vc2UsIHByZUVxQmFuZENvdW50LCBtYmNJblVzZSwgbWJjQmFuZENvdW50LAorICAgICAgICAgICAgICAgIHBvc3RFcUluVXNlLCBwb3N0RXFCYW5kQ291bnQsIGxpbWl0ZXJJblVzZSk7CisgICAgfQorICAgIG1Jbml0aWFsaXplZCA9IHRydWU7Cit9CisKK0RQQ2hhbm5lbCogRFBCYXNlOjpnZXRDaGFubmVsKHVpbnQzMl90IGNoYW5uZWxJbmRleCkgeworICAgIGlmICghbUluaXRpYWxpemVkIHx8IGNoYW5uZWxJbmRleCA8IDAgfHwgY2hhbm5lbEluZGV4ID49IG1DaGFubmVsLnNpemUoKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuICYgbUNoYW5uZWxbY2hhbm5lbEluZGV4XTsKK30KKworfSAvL25hbWVzcGFjZSBkcF9meApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9keW5hbWljc3Byb2MvZHNwL0RQQmFzZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9keW5hbWljc3Byb2MvZHNwL0RQQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NWY2NGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9kc3AvRFBCYXNlLmgKQEAgLTAsMCArMSwzNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIERQQkFTRV9IXworI2RlZmluZSBEUEJBU0VfSF8KKworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisKK25hbWVzcGFjZSBkcF9meCB7CisKKyNkZWZpbmUgRFBfREVGQVVMVF9CQU5EX0VOQUJMRUQgZmFsc2UKKyNkZWZpbmUgRFBfREVGQVVMVF9CQU5EX0NVVE9GRl9GUkVRVUVOQ1lfSFogMTAwMAorI2RlZmluZSBEUF9ERUZBVUxUX0FUVEFDS19USU1FX01TIDUwCisjZGVmaW5lIERQX0RFRkFVTFRfUkVMRUFTRV9USU1FX01TIDEyMAorI2RlZmluZSBEUF9ERUZBVUxUX1JBVElPIDIKKyNkZWZpbmUgRFBfREVGQVVMVF9USFJFU0hPTERfREIgLTMwCisjZGVmaW5lIERQX0RFRkFVTFRfS05FRV9XSURUSF9EQiAwCisjZGVmaW5lIERQX0RFRkFVTFRfTk9JU0VfR0FURV9USFJFU0hPTERfREIgLTkwCisjZGVmaW5lIERQX0RFRkFVTFRfRVhQQU5ERVJfUkFUSU8gMQorI2RlZmluZSBEUF9ERUZBVUxUX0dBSU5fREIgMAorI2RlZmluZSBEUF9ERUZBVUxUX1NUQUdFX0lOVVNFIGZhbHNlCisjZGVmaW5lIERQX0RFRkFVTFRfU1RBR0VfRU5BQkxFRCBmYWxzZQorI2RlZmluZSBEUF9ERUZBVUxUX0xJTktfR1JPVVAgMAorCisKKworY2xhc3MgRFBTdGFnZSB7CitwdWJsaWM6CisgICAgRFBTdGFnZSgpOworICAgIH5EUFN0YWdlKCkgPSBkZWZhdWx0OworICAgIHZvaWQgaW5pdChib29sIGluVXNlLCBib29sIGVuYWJsZWQpOworICAgIGJvb2wgaXNJblVzZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1JblVzZTsKKyAgICB9CisgICAgYm9vbCBpc0VuYWJsZWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRW5hYmxlZDsKKyAgICB9CisgICAgdm9pZCBzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkgeworICAgICAgICBtRW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgfQorcHJpdmF0ZToKKyAgICBib29sIG1JblVzZTsKKyAgICBib29sIG1FbmFibGVkOworfTsKKworY2xhc3MgRFBCYW5kU3RhZ2UgOiBwdWJsaWMgRFBTdGFnZSB7CitwdWJsaWM6CisgICAgRFBCYW5kU3RhZ2UoKTsKKyAgICB+RFBCYW5kU3RhZ2UoKSA9IGRlZmF1bHQ7CisgICAgdm9pZCBpbml0KGJvb2wgaW5Vc2UsIGJvb2wgZW5hYmxlZCwgaW50IGJhbmRDb3VudCk7CisgICAgdWludDMyX3QgZ2V0QmFuZENvdW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUJhbmRDb3VudDsKKyAgICB9CisgICAgdm9pZCBzZXRCYW5kQ291bnQodWludDMyX3QgYmFuZENvdW50KSB7CisgICAgICAgIG1CYW5kQ291bnQgPSBiYW5kQ291bnQ7CisgICAgfQorcHJpdmF0ZToKKyAgICB1aW50MzJfdCBtQmFuZENvdW50OworfTsKKworY2xhc3MgRFBCYW5kQmFzZSB7CitwdWJsaWM6CisgICAgRFBCYW5kQmFzZSgpOworICAgIH5EUEJhbmRCYXNlKCkgPSBkZWZhdWx0OworICAgIHZvaWQgaW5pdChib29sIGVuYWJsZWQsIGZsb2F0IGN1dG9mZkZyZXF1ZW5jeSk7CisgICAgYm9vbCBpc0VuYWJsZWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRW5hYmxlZDsKKyAgICB9CisgICAgdm9pZCBzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkgeworICAgICAgICBtRW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgfQorICAgIGZsb2F0IGdldEN1dG9mZkZyZXF1ZW5jeSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DdXRvb2ZGcmVxdWVuY3lIejsKKyAgICB9CisgICAgdm9pZCBzZXRDdXRvZmZGcmVxdWVuY3koZmxvYXQgY3V0b2ZmRnJlcXVlbmN5KSB7CisgICAgICAgIG1DdXRvb2ZGcmVxdWVuY3lIeiA9IGN1dG9mZkZyZXF1ZW5jeTsKKyAgICB9Citwcml2YXRlOgorICAgIGJvb2wgbUVuYWJsZWQ7CisgICAgZmxvYXQgbUN1dG9vZkZyZXF1ZW5jeUh6OworfTsKKworY2xhc3MgRFBFcUJhbmQgOiBwdWJsaWMgRFBCYW5kQmFzZSB7CitwdWJsaWM6CisgICAgRFBFcUJhbmQoKTsKKyAgICB+RFBFcUJhbmQoKSA9IGRlZmF1bHQ7CisgICAgdm9pZCBpbml0KGJvb2wgZW5hYmxlZCwgZmxvYXQgY3V0b2ZmRnJlcXVlbmN5LCBmbG9hdCBnYWluKTsKKyAgICBmbG9hdCBnZXRHYWluKCkgY29uc3Q7CisgICAgdm9pZCBzZXRHYWluKGZsb2F0IGdhaW4pOworcHJpdmF0ZToKKyAgICBmbG9hdCBtR2FpbkRiOworfTsKKworY2xhc3MgRFBNYmNCYW5kIDogcHVibGljIERQQmFuZEJhc2UgeworcHVibGljOgorICAgIERQTWJjQmFuZCgpOworICAgIH5EUE1iY0JhbmQoKSA9IGRlZmF1bHQ7CisgICAgdm9pZCBpbml0KGJvb2wgZW5hYmxlZCwgZmxvYXQgY3V0b2ZmRnJlcXVlbmN5LCBmbG9hdCBhdHRhY2tUaW1lLCBmbG9hdCByZWxlYXNlVGltZSwKKyAgICAgICAgICAgIGZsb2F0IHJhdGlvLCBmbG9hdCB0aHJlc2hvbGQsIGZsb2F0IGtuZWVXaWR0aCwgZmxvYXQgbm9pc2VHYXRlVGhyZXNob2xkLAorICAgICAgICAgICAgZmxvYXQgZXhwYW5kZXJSYXRpbywgZmxvYXQgcHJlR2FpbiwgZmxvYXQgcG9zdEdhaW4pOworICAgIGZsb2F0IGdldEF0dGFja1RpbWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQXR0YWNrVGltZU1zOworICAgIH0KKyAgICB2b2lkIHNldEF0dGFja1RpbWUoZmxvYXQgYXR0YWNrVGltZSkgeworICAgICAgICBtQXR0YWNrVGltZU1zID0gYXR0YWNrVGltZTsKKyAgICB9CisgICAgZmxvYXQgZ2V0UmVsZWFzZVRpbWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUmVsZWFzZVRpbWVNczsKKyAgICB9CisgICAgdm9pZCBzZXRSZWxlYXNlVGltZShmbG9hdCByZWxlYXNlVGltZSkgeworICAgICAgICBtUmVsZWFzZVRpbWVNcyA9IHJlbGVhc2VUaW1lOworICAgIH0KKyAgICBmbG9hdCBnZXRSYXRpbygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1SYXRpbzsKKyAgICB9CisgICAgdm9pZCBzZXRSYXRpbyhmbG9hdCByYXRpbykgeworICAgICAgICBtUmF0aW8gPSByYXRpbzsKKyAgICB9CisgICAgZmxvYXQgZ2V0VGhyZXNob2xkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRocmVzaG9sZERiOworICAgIH0KKyAgICB2b2lkIHNldFRocmVzaG9sZChmbG9hdCB0aHJlc2hvbGQpIHsKKyAgICAgICAgbVRocmVzaG9sZERiID0gdGhyZXNob2xkOworICAgIH0KKyAgICBmbG9hdCBnZXRLbmVlV2lkdGgoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtS25lZVdpZHRoRGI7CisgICAgfQorICAgIHZvaWQgc2V0S25lZVdpZHRoKGZsb2F0IGtuZWVXaWR0aCkgeworICAgICAgICBtS25lZVdpZHRoRGIgPSBrbmVlV2lkdGg7CisgICAgfQorICAgIGZsb2F0IGdldE5vaXNlR2F0ZVRocmVzaG9sZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Ob2lzZUdhdGVUaHJlc2hvbGREYjsKKyAgICB9CisgICAgdm9pZCBzZXROb2lzZUdhdGVUaHJlc2hvbGQoZmxvYXQgbm9pc2VHYXRlVGhyZXNob2xkKSB7CisgICAgICAgIG1Ob2lzZUdhdGVUaHJlc2hvbGREYiA9IG5vaXNlR2F0ZVRocmVzaG9sZDsKKyAgICB9CisgICAgZmxvYXQgZ2V0RXhwYW5kZXJSYXRpbygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1FeHBhbmRlclJhdGlvOworICAgIH0KKyAgICB2b2lkIHNldEV4cGFuZGVyUmF0aW8oZmxvYXQgZXhwYW5kZXJSYXRpbykgeworICAgICAgICBtRXhwYW5kZXJSYXRpbyA9IGV4cGFuZGVyUmF0aW87CisgICAgfQorICAgIGZsb2F0IGdldFByZUdhaW4oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUHJlR2FpbkRiOworICAgIH0KKyAgICB2b2lkIHNldFByZUdhaW4oZmxvYXQgcHJlR2FpbikgeworICAgICAgICBtUHJlR2FpbkRiID0gcHJlR2FpbjsKKyAgICB9CisgICAgZmxvYXQgZ2V0UG9zdEdhaW4oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUG9zdEdhaW5EYjsKKyAgICB9CisgICAgdm9pZCBzZXRQb3N0R2FpbihmbG9hdCBwb3N0R2FpbikgeworICAgICAgICBtUG9zdEdhaW5EYiA9IHBvc3RHYWluOworICAgIH0KK3ByaXZhdGU6CisgICAgZmxvYXQgbUF0dGFja1RpbWVNczsKKyAgICBmbG9hdCBtUmVsZWFzZVRpbWVNczsKKyAgICBmbG9hdCBtUmF0aW87CisgICAgZmxvYXQgbVRocmVzaG9sZERiOworICAgIGZsb2F0IG1LbmVlV2lkdGhEYjsKKyAgICBmbG9hdCBtTm9pc2VHYXRlVGhyZXNob2xkRGI7CisgICAgZmxvYXQgbUV4cGFuZGVyUmF0aW87CisgICAgZmxvYXQgbVByZUdhaW5EYjsKKyAgICBmbG9hdCBtUG9zdEdhaW5EYjsKK307CisKK2NsYXNzIERQRXEgOiBwdWJsaWMgRFBCYW5kU3RhZ2UgeworcHVibGljOgorICAgIERQRXEoKTsKKyAgICB+RFBFcSgpID0gZGVmYXVsdDsKKyAgICB2b2lkIGluaXQoYm9vbCBpblVzZSwgYm9vbCBlbmFibGVkLCB1aW50MzJfdCBiYW5kQ291bnQpOworICAgIERQRXFCYW5kICogZ2V0QmFuZCh1aW50MzJfdCBiYW5kKTsKKyAgICB2b2lkIHNldEJhbmQodWludDMyX3QgYmFuZCwgRFBFcUJhbmQgJnNyYyk7Citwcml2YXRlOgorICAgIHN0ZDo6dmVjdG9yPERQRXFCYW5kPiBtQmFuZHM7Cit9OworCitjbGFzcyBEUE1iYyA6IHB1YmxpYyBEUEJhbmRTdGFnZSB7CitwdWJsaWM6CisgICAgRFBNYmMoKTsKKyAgICB+RFBNYmMoKSA9IGRlZmF1bHQ7CisgICAgdm9pZCBpbml0KGJvb2wgaW5Vc2UsIGJvb2wgZW5hYmxlZCwgdWludDMyX3QgYmFuZENvdW50KTsKKyAgICBEUE1iY0JhbmQgKiBnZXRCYW5kKHVpbnQzMl90IGJhbmQpOworICAgIHZvaWQgc2V0QmFuZCh1aW50MzJfdCBiYW5kLCBEUE1iY0JhbmQgJnNyYyk7Citwcml2YXRlOgorICAgIHN0ZDo6dmVjdG9yPERQTWJjQmFuZD4gbUJhbmRzOworfTsKKworY2xhc3MgRFBMaW1pdGVyIDogcHVibGljIERQU3RhZ2UgeworcHVibGljOgorICAgIERQTGltaXRlcigpOworICAgIH5EUExpbWl0ZXIoKSA9IGRlZmF1bHQ7CisgICAgdm9pZCBpbml0KGJvb2wgaW5Vc2UsIGJvb2wgZW5hYmxlZCwgdWludDMyX3QgbGlua0dyb3VwLCBmbG9hdCBhdHRhY2tUaW1lLCBmbG9hdCByZWxlYXNlVGltZSwKKyAgICAgICAgICAgIGZsb2F0IHJhdGlvLCBmbG9hdCB0aHJlc2hvbGQsIGZsb2F0IHBvc3RHYWluKTsKKyAgICB1aW50MzJfdCBnZXRMaW5rR3JvdXAoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTGlua0dyb3VwOworICAgIH0KKyAgICB2b2lkIHNldExpbmtHcm91cCh1aW50MzJfdCBsaW5rR3JvdXApIHsKKyAgICAgICAgbUxpbmtHcm91cCA9IGxpbmtHcm91cDsKKyAgICB9CisgICAgZmxvYXQgZ2V0QXR0YWNrVGltZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BdHRhY2tUaW1lTXM7CisgICAgfQorICAgIHZvaWQgc2V0QXR0YWNrVGltZShmbG9hdCBhdHRhY2tUaW1lKSB7CisgICAgICAgIG1BdHRhY2tUaW1lTXMgPSBhdHRhY2tUaW1lOworICAgIH0KKyAgICBmbG9hdCBnZXRSZWxlYXNlVGltZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1SZWxlYXNlVGltZU1zOworICAgIH0KKyAgICB2b2lkIHNldFJlbGVhc2VUaW1lKGZsb2F0IHJlbGVhc2VUaW1lKSB7CisgICAgICAgIG1SZWxlYXNlVGltZU1zID0gcmVsZWFzZVRpbWU7CisgICAgfQorICAgIGZsb2F0IGdldFJhdGlvKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVJhdGlvOworICAgIH0KKyAgICB2b2lkIHNldFJhdGlvKGZsb2F0IHJhdGlvKSB7CisgICAgICAgIG1SYXRpbyA9IHJhdGlvOworICAgIH0KKyAgICBmbG9hdCBnZXRUaHJlc2hvbGQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVGhyZXNob2xkRGI7CisgICAgfQorICAgIHZvaWQgc2V0VGhyZXNob2xkKGZsb2F0IHRocmVzaG9sZCkgeworICAgICAgICBtVGhyZXNob2xkRGIgPSB0aHJlc2hvbGQ7CisgICAgfQorICAgIGZsb2F0IGdldFBvc3RHYWluKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVBvc3RHYWluRGI7CisgICAgfQorICAgIHZvaWQgc2V0UG9zdEdhaW4oZmxvYXQgcG9zdEdhaW4pIHsKKyAgICAgICAgbVBvc3RHYWluRGIgPSBwb3N0R2FpbjsKKyAgICB9Citwcml2YXRlOgorICAgIHVpbnQzMl90IG1MaW5rR3JvdXA7CisgICAgZmxvYXQgbUF0dGFja1RpbWVNczsKKyAgICBmbG9hdCBtUmVsZWFzZVRpbWVNczsKKyAgICBmbG9hdCBtUmF0aW87CisgICAgZmxvYXQgbVRocmVzaG9sZERiOworICAgIGZsb2F0IG1Qb3N0R2FpbkRiOworfTsKKworY2xhc3MgRFBDaGFubmVsIHsKK3B1YmxpYzoKKyAgICBEUENoYW5uZWwoKTsKKyAgICB+RFBDaGFubmVsKCkgPSBkZWZhdWx0OworICAgIHZvaWQgaW5pdChmbG9hdCBpbnB1dEdhaW4sIGJvb2wgcHJlRXFJblVzZSwgdWludDMyX3QgcHJlRXFCYW5kQ291bnQsCisgICAgICAgICAgICBib29sIG1iY0luVXNlLCB1aW50MzJfdCBtYmNCYW5kQ291bnQsIGJvb2wgcG9zdEVxSW5Vc2UsIHVpbnQzMl90IHBvc3RFcUJhbmRDb3VudCwKKyAgICAgICAgICAgIGJvb2wgbGltaXRlckluVXNlKTsKKworICAgIGZsb2F0IGdldElucHV0R2FpbigpIGNvbnN0IHsKKyAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtSW5wdXRHYWluRGI7CisgICAgfQorICAgIHZvaWQgc2V0SW5wdXRHYWluKGZsb2F0IGdhaW4pIHsKKyAgICAgICAgbUlucHV0R2FpbkRiID0gZ2FpbjsKKyAgICB9CisKKyAgICBEUEVxKiBnZXRQcmVFcSgpOworICAgIERQTWJjKiBnZXRNYmMoKTsKKyAgICBEUEVxKiBnZXRQb3N0RXEoKTsKKyAgICBEUExpbWl0ZXIgKmdldExpbWl0ZXIoKTsKKyAgICB2b2lkIHNldExpbWl0ZXIoRFBMaW1pdGVyICZsaW1pdGVyKTsKKworcHJpdmF0ZToKKyAgICBib29sIG1Jbml0aWFsaXplZDsKKyAgICBmbG9hdCBtSW5wdXRHYWluRGI7CisKKyAgICBEUEVxIG1QcmVFcTsKKyAgICBEUE1iYyBtTWJjOworICAgIERQRXEgbVBvc3RFcTsKKyAgICBEUExpbWl0ZXIgbUxpbWl0ZXI7CisKKyAgICBib29sIG1QcmVFcUluVXNlOworICAgIGJvb2wgbU1iY0luVXNlOworICAgIGJvb2wgbVBvc3RFcUluVXNlOworICAgIGJvb2wgbUxpbWl0ZXJJblVzZTsKK307CisKK2NsYXNzIERQQmFzZSB7CitwdWJsaWM6CisgICAgRFBCYXNlKCk7CisgICAgdmlydHVhbCB+RFBCYXNlKCkgPSBkZWZhdWx0OworCisgICAgdm9pZCBpbml0KHVpbnQzMl90IGNoYW5uZWxDb3VudCwgYm9vbCBwcmVFcUluVXNlLCB1aW50MzJfdCBwcmVFcUJhbmRDb3VudCwKKyAgICAgICAgICAgIGJvb2wgbWJjSW5Vc2UsIHVpbnQzMl90IG1iY0JhbmRDb3VudCwgYm9vbCBwb3N0RXFJblVzZSwgdWludDMyX3QgcG9zdEVxQmFuZENvdW50LAorICAgICAgICAgICAgYm9vbCBsaW1pdGVySW5Vc2UpOworICAgIHZpcnR1YWwgc2l6ZV90IHByb2Nlc3NTYW1wbGVzKGNvbnN0IGZsb2F0ICppbiwgZmxvYXQgKm91dCwgc2l6ZV90IHNhbXBsZXMpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKSA9IDA7CisKKyAgICBEUENoYW5uZWwqIGdldENoYW5uZWwodWludDMyX3QgY2hhbm5lbEluZGV4KTsKKyAgICB1aW50MzJfdCBnZXRDaGFubmVsQ291bnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ2hhbm5lbENvdW50OworICAgIH0KKyAgICB1aW50MzJfdCBnZXRQcmVFcUJhbmRDb3VudCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1QcmVFcUJhbmRDb3VudDsKKyAgICB9CisgICAgdWludDMyX3QgZ2V0TWJjQmFuZENvdW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU1iY0JhbmRDb3VudDsKKyAgICB9CisgICAgdWludDMyX3QgZ2V0UG9zdEVxQmFuZENvdW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVBvc3RFcUJhbmRDb3VudDsKKyAgICB9CisgICAgYm9vbCBpc1ByZUVRSW5Vc2UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUHJlRXFJblVzZTsKKyAgICB9CisgICAgYm9vbCBpc01iY0luVXNlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU1iY0luVXNlOworICAgIH0KKyAgICBib29sIGlzUG9zdEVxSW5Vc2UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUG9zdEVxSW5Vc2U7CisgICAgfQorICAgIGJvb2wgaXNMaW1pdGVySW5Vc2UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTGltaXRlckluVXNlOworICAgIH0KKworcHJpdmF0ZToKKyAgICBib29sIG1Jbml0aWFsaXplZDsKKyAgICAvL2dlbmVyYWwKKyAgICB1aW50MzJfdCBtQ2hhbm5lbENvdW50OworICAgIGJvb2wgbVByZUVxSW5Vc2U7CisgICAgdWludDMyX3QgbVByZUVxQmFuZENvdW50OworICAgIGJvb2wgbU1iY0luVXNlOworICAgIHVpbnQzMl90IG1NYmNCYW5kQ291bnQ7CisgICAgYm9vbCBtUG9zdEVxSW5Vc2U7CisgICAgdWludDMyX3QgbVBvc3RFcUJhbmRDb3VudDsKKyAgICBib29sIG1MaW1pdGVySW5Vc2U7CisKKyAgICBzdGQ6OnZlY3RvcjxEUENoYW5uZWw+IG1DaGFubmVsOworfTsKKworfSAvL25hbWVzcGFjZSBkcF9meAorCisKKyNlbmRpZiAgLy8gRFBCQVNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9kc3AvRFBGcmVxdWVuY3kuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9keW5hbWljc3Byb2MvZHNwL0RQRnJlcXVlbmN5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTE5NWZjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9keW5hbWljc3Byb2MvZHNwL0RQRnJlcXVlbmN5LmNwcApAQCAtMCwwICsxLDUxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRFBGcmVxdWVuY3kiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSAiRFBGcmVxdWVuY3kuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK25hbWVzcGFjZSBkcF9meCB7CisKK3VzaW5nIEVpZ2VuOjpNYXRyaXhYZDsKKyNkZWZpbmUgTUFYX0JMT0NLU0laRSAxNjM4NCAvL0ZvciB0aGlzIGltcGxlbWVudGF0aW9uCisjZGVmaW5lIE1JTl9CTE9DS1NJWkUgOAorCisjZGVmaW5lIENJUkNVTEFSX0JVRkZFUl9VUFNBTVBMRSA0ICAvLzQgdGltZXMgYnVmZmVyIHNpemUKKworc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBNSU5fRU5WRUxPUEUgPSAwLjAwMDAwMWY7CisvL2hlbHBlciBmdW5jdGlvblMKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1Bvd2VyT2YyKHVuc2lnbmVkIGxvbmcgbikgeworICAgIHJldHVybiAobiAmIChuIC0gMSkpID09IDA7Cit9CitzdGF0aWMgY29uc3RleHByIGZsb2F0IEVQU0lMT04gPSAwLjAwMDAwMDFmOworCitzdGF0aWMgaW5saW5lIGJvb2wgaXNaZXJvKGZsb2F0IGYpIHsKKyAgICByZXR1cm4gZmFicyhmKSA8PSBFUFNJTE9OOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2Jvb2wgY29tcGFyZUVxdWFsaXR5KFQgYSwgVCBiKSB7CisgICAgcmV0dXJuIChhID09IGIpOworfQorCit0ZW1wbGF0ZSA8PiBib29sIGNvbXBhcmVFcXVhbGl0eTxmbG9hdD4oZmxvYXQgYSwgZmxvYXQgYikgeworICAgIHJldHVybiBpc1plcm8oYSAtIGIpOworfQorCisvL1RPRE86IGF2b2lkIHVzaW5nIG1hY3JvIGZvciBlc3RpbWF0aW5nIGNoYW5nZSBhbmQgYXNzaWdubWVudC4KKyNkZWZpbmUgSVNfQ0hBTkdFRChjLCBhLCBiKSB7IGMgfD0gIWNvbXBhcmVFcXVhbGl0eShhLGIpOyBcCisgICAgKGEpID0gKGIpOyB9CisKK2Zsb2F0IGRCdG9MaW5lYXIoZmxvYXQgdmFsdWVEYikgeworICAgIHJldHVybiAgcG93ICgxMCwgdmFsdWVEYiAvIDIwLjApOworfQorCitmbG9hdCBsaW5lYXJUb0RiKGZsb2F0IHZhbHVlKSB7CisgICAgcmV0dXJuIDIwICogbG9nMTAodmFsdWUpOworfQorCisvL0NoYW5uZWxCdWZmZXJzIGhlbHBlcgordm9pZCBDaGFubmVsQnVmZmVyOjppbml0QnVmZmVycyh1bnNpZ25lZCBpbnQgYmxvY2tTaXplLCB1bnNpZ25lZCBpbnQgb3ZlcmxhcFNpemUsCisgICAgICAgIHVuc2lnbmVkIGludCBoYWxmRmZ0U2l6ZSwgdW5zaWduZWQgaW50IHNhbXBsaW5nUmF0ZSwgRFBCYXNlICZkcEJhc2UpIHsKKyAgICBBTE9HVigiQ2hhbm5lbEJ1ZmZlcjo6aW5pdEJ1ZmZlcnMgYmxvY2tTaXplICVkLCBvdmVybGFwICVkLCBoYWxmRmZ0ICVkIiwKKyAgICAgICAgICAgIGJsb2NrU2l6ZSwgb3ZlcmxhcFNpemUsIGhhbGZGZnRTaXplKTsKKworICAgIG1TYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7CisgICAgbUJsb2NrU2l6ZSA9IGJsb2NrU2l6ZTsKKworICAgIGNCSW5wdXQucmVzaXplKG1CbG9ja1NpemUgKiBDSVJDVUxBUl9CVUZGRVJfVVBTQU1QTEUpOworICAgIGNCT3V0cHV0LnJlc2l6ZShtQmxvY2tTaXplICogQ0lSQ1VMQVJfQlVGRkVSX1VQU0FNUExFKTsKKworICAgIC8vZmlsbCBpbnB1dCB3aXRoIGhhbGYgYmxvY2sgc2l6ZS4uLgorICAgIGZvciAodW5zaWduZWQgaW50IGsgPSAwOyAgayA8IG1CbG9ja1NpemUvMjsgaysrKSB7CisgICAgICAgIGNCSW5wdXQud3JpdGUoMCk7CisgICAgfQorCisgICAgLy90ZW1wIHZlY3RvcnMKKyAgICBpbnB1dC5yZXNpemUobUJsb2NrU2l6ZSk7CisgICAgb3V0cHV0LnJlc2l6ZShtQmxvY2tTaXplKTsKKyAgICBvdXRUYWlsLnJlc2l6ZShvdmVybGFwU2l6ZSk7CisKKyAgICAvL21vZHVsZSB2ZWN0b3JzCisgICAgbVByZUVxRmFjdG9yVmVjdG9yLnJlc2l6ZShoYWxmRmZ0U2l6ZSwgMS4wKTsKKyAgICBtUG9zdEVxRmFjdG9yVmVjdG9yLnJlc2l6ZShoYWxmRmZ0U2l6ZSwgMS4wKTsKKworICAgIG1QcmVFcUJhbmRzLnJlc2l6ZShkcEJhc2UuZ2V0UHJlRXFCYW5kQ291bnQoKSk7CisgICAgbU1iY0JhbmRzLnJlc2l6ZShkcEJhc2UuZ2V0TWJjQmFuZENvdW50KCkpOworICAgIG1Qb3N0RXFCYW5kcy5yZXNpemUoZHBCYXNlLmdldFBvc3RFcUJhbmRDb3VudCgpKTsKKyAgICBBTE9HVigibVByZUVxQmFuZHMgJXp1LCBtTWJjQmFuZHMgJXp1LCBtUG9zdEVxQmFuZHMgJXp1IixtUHJlRXFCYW5kcy5zaXplKCksCisgICAgICAgICAgICBtTWJjQmFuZHMuc2l6ZSgpLCBtUG9zdEVxQmFuZHMuc2l6ZSgpKTsKKworICAgIERQQ2hhbm5lbCAqcENoYW5uZWwgPSBkcEJhc2UuZ2V0Q2hhbm5lbCgwKTsKKyAgICBpZiAocENoYW5uZWwgIT0gTlVMTCkgeworICAgICAgICBtUHJlRXFJblVzZSA9IHBDaGFubmVsLT5nZXRQcmVFcSgpLT5pc0luVXNlKCk7CisgICAgICAgIG1NYmNJblVzZSA9IHBDaGFubmVsLT5nZXRNYmMoKS0+aXNJblVzZSgpOworICAgICAgICBtUG9zdEVxSW5Vc2UgPSBwQ2hhbm5lbC0+Z2V0UG9zdEVxKCktPmlzSW5Vc2UoKTsKKyAgICAgICAgbUxpbWl0ZXJJblVzZSA9IHBDaGFubmVsLT5nZXRMaW1pdGVyKCktPmlzSW5Vc2UoKTsKKyAgICB9Cit9CisKK3ZvaWQgQ2hhbm5lbEJ1ZmZlcjo6Y29tcHV0ZUJpblN0YXJ0U3RvcChCYW5kUGFyYW1zICZicCwgc2l6ZV90IGJpblN0YXJ0KSB7CisKKyAgICBicC5iaW5TdGFydCA9IGJpblN0YXJ0OworICAgIGJwLmJpblN0b3AgPSAoaW50KSgwLjUgKyBicC5mcmVxQ3V0b2ZmSHogKiBtQmxvY2tTaXplIC8gbVNhbXBsaW5nUmF0ZSk7Cit9CisKKy8vPT0gRFBGcmVxdWVuY3kKKwordm9pZCBEUEZyZXF1ZW5jeTo6cmVzZXQoKSB7Cit9CisKK3NpemVfdCBEUEZyZXF1ZW5jeTo6Z2V0TWluQm9ja1NpemUoKSB7CisgICAgcmV0dXJuIE1JTl9CTE9DS1NJWkU7Cit9CisKK3NpemVfdCBEUEZyZXF1ZW5jeTo6Z2V0TWF4Qm9ja1NpemUoKSB7CisgICAgcmV0dXJuIE1BWF9CTE9DS1NJWkU7Cit9CisKK3ZvaWQgRFBGcmVxdWVuY3k6OmNvbmZpZ3VyZShzaXplX3QgYmxvY2tTaXplLCBzaXplX3Qgb3ZlcmxhcFNpemUsCisgICAgICAgIHNpemVfdCBzYW1wbGluZ1JhdGUpIHsKKyAgICBBTE9HVigiY29uZmlndXJlIik7CisgICAgbUJsb2NrU2l6ZSA9IGJsb2NrU2l6ZTsKKyAgICBpZiAobUJsb2NrU2l6ZSA+IE1BWF9CTE9DS1NJWkUpIHsKKyAgICAgICAgbUJsb2NrU2l6ZSA9IE1BWF9CTE9DS1NJWkU7CisgICAgfSBlbHNlIGlmIChtQmxvY2tTaXplIDwgTUlOX0JMT0NLU0laRSkgeworICAgICAgICBtQmxvY2tTaXplID0gTUlOX0JMT0NLU0laRTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIWlzUG93ZXJPZjIoYmxvY2tTaXplKSkgeworICAgICAgICAgICAgLy9maW5kIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyLgorICAgICAgICAgICAgbUJsb2NrU2l6ZSA9IDEgPDwgKDMyIC0gX19idWlsdGluX2NseihibG9ja1NpemUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1IYWxmRkZUU2l6ZSA9IDEgKyBtQmxvY2tTaXplIC8gMjsgLy9pbmNsdWRpbmcgTnlxdWlzdCBiaW4KKyAgICBtT3ZlcmxhcFNpemUgPSBzdGQ6Om1pbihvdmVybGFwU2l6ZSwgbUJsb2NrU2l6ZS8yKTsKKworICAgIGludCBjaGFubmVsY291bnQgPSBnZXRDaGFubmVsQ291bnQoKTsKKyAgICBtU2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlOworICAgIG1DaGFubmVsQnVmZmVycy5yZXNpemUoY2hhbm5lbGNvdW50KTsKKyAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgY2hhbm5lbGNvdW50OyBjaCsrKSB7CisgICAgICAgIG1DaGFubmVsQnVmZmVyc1tjaF0uaW5pdEJ1ZmZlcnMobUJsb2NrU2l6ZSwgbU92ZXJsYXBTaXplLCBtSGFsZkZGVFNpemUsCisgICAgICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZSwgKnRoaXMpOworICAgIH0KKworICAgIC8vZHNwCisgICAgZmlsbF93aW5kb3cobVZXaW5kb3csIFJEU1BfV0lORE9XX0hBTk5JTkdfRkxBVF9UT1AsIG1CbG9ja1NpemUsIG1PdmVybGFwU2l6ZSk7Cit9CisKK3ZvaWQgRFBGcmVxdWVuY3k6OnVwZGF0ZVBhcmFtZXRlcnMoQ2hhbm5lbEJ1ZmZlciAmY2IsIGludCBjaGFubmVsSW5kZXgpIHsKKyAgICBEUENoYW5uZWwgKnBDaGFubmVsID0gZ2V0Q2hhbm5lbChjaGFubmVsSW5kZXgpOworCisgICAgaWYgKHBDaGFubmVsID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yOiB1cGRhdGVQYXJhbWV0ZXJzIG51bGwgRFBDaGFubmVsICVkIiwgY2hhbm5lbEluZGV4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vPT09SW5wdXQgR2FpbiBhbmQgcHJlRXEKKyAgICB7CisgICAgICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgICAgICBJU19DSEFOR0VEKGNoYW5nZWQsIGNiLmlucHV0R2FpbkRiLCBwQ2hhbm5lbC0+Z2V0SW5wdXRHYWluKCkpOworICAgICAgICAvLz09PUVxUHJlCisgICAgICAgIGlmIChjYi5tUHJlRXFJblVzZSkgeworICAgICAgICAgICAgRFBFcSAqcFByZUVxID0gcENoYW5uZWwtPmdldFByZUVxKCk7CisgICAgICAgICAgICBpZiAocFByZUVxID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRXJyb3I6IHVwZGF0ZVBhcmFtZXRlcnMgbnVsbCBQcmVFcSBmb3IgY2hhbm5lbDogJWQiLCBjaGFubmVsSW5kZXgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIElTX0NIQU5HRUQoY2hhbmdlZCwgY2IubVByZUVxRW5hYmxlZCwgcFByZUVxLT5pc0VuYWJsZWQoKSk7CisgICAgICAgICAgICBpZiAoY2IubVByZUVxRW5hYmxlZCkgeworICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGIgPSAwOyBiIDwgZ2V0UHJlRXFCYW5kQ291bnQoKTsgYisrKSB7CisgICAgICAgICAgICAgICAgICAgIERQRXFCYW5kICpwRXFCYW5kID0gcFByZUVxLT5nZXRCYW5kKGIpOworICAgICAgICAgICAgICAgICAgICBpZiAocEVxQmFuZCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRXJyb3I6IHVwZGF0ZVBhcmFtZXRlcnMgbnVsbCBQcmVFcUJhbmQgZm9yIGJhbmQgJWQiLCBiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy9mYWlsZWQuCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbEJ1ZmZlcjo6RXFCYW5kUGFyYW1zICpwRXFCYW5kUGFyYW1zID0gJmNiLm1QcmVFcUJhbmRzW2JdOworICAgICAgICAgICAgICAgICAgICBJU19DSEFOR0VEKGNoYW5nZWQsIHBFcUJhbmRQYXJhbXMtPmVuYWJsZWQsIHBFcUJhbmQtPmlzRW5hYmxlZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgSVNfQ0hBTkdFRChjaGFuZ2VkLCBwRXFCYW5kUGFyYW1zLT5mcmVxQ3V0b2ZmSHosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVxQmFuZC0+Z2V0Q3V0b2ZmRnJlcXVlbmN5KCkpOworICAgICAgICAgICAgICAgICAgICBJU19DSEFOR0VEKGNoYW5nZWQsIHBFcUJhbmRQYXJhbXMtPmdhaW5EYiwgcEVxQmFuZC0+Z2V0R2FpbigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2hhbmdlZCkgeworICAgICAgICAgICAgZmxvYXQgaW5wdXRHYWluRmFjdG9yID0gZEJ0b0xpbmVhcihjYi5pbnB1dEdhaW5EYik7CisgICAgICAgICAgICBpZiAoY2IubVByZUVxSW5Vc2UgJiYgY2IubVByZUVxRW5hYmxlZCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJwcmVFcSBjaGFuZ2VkLCByZWNvbXB1dGluZyEgY2hhbm5lbCAlZCIsIGNoYW5uZWxJbmRleCk7CisgICAgICAgICAgICAgICAgc2l6ZV90IGJpbk5leHQgPSAwOworICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGIgPSAwOyBiIDwgZ2V0UHJlRXFCYW5kQ291bnQoKTsgYisrKSB7CisgICAgICAgICAgICAgICAgICAgIENoYW5uZWxCdWZmZXI6OkVxQmFuZFBhcmFtcyAqcEVxQmFuZFBhcmFtcyA9ICZjYi5tUHJlRXFCYW5kc1tiXTsKKworICAgICAgICAgICAgICAgICAgICAvL2ZyZXF1ZW5jeSB0cmFuc2xhdGlvbgorICAgICAgICAgICAgICAgICAgICBjYi5jb21wdXRlQmluU3RhcnRTdG9wKCpwRXFCYW5kUGFyYW1zLCBiaW5OZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgYmluTmV4dCA9IHBFcUJhbmRQYXJhbXMtPmJpblN0b3AgKyAxOworICAgICAgICAgICAgICAgICAgICBmbG9hdCBmYWN0b3IgPSBkQnRvTGluZWFyKHBFcUJhbmRQYXJhbXMtPmdhaW5EYik7CisgICAgICAgICAgICAgICAgICAgIGlmICghcEVxQmFuZFBhcmFtcy0+ZW5hYmxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yID0gaW5wdXRHYWluRmFjdG9yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSBwRXFCYW5kUGFyYW1zLT5iaW5TdGFydDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrIDw9IHBFcUJhbmRQYXJhbXMtPmJpblN0b3AgJiYgayA8IG1IYWxmRkZUU2l6ZTsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYi5tUHJlRXFGYWN0b3JWZWN0b3Jba10gPSBmYWN0b3IgKiBpbnB1dEdhaW5GYWN0b3I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dWKCJvbmx5IGlucHV0IGdhaW4gY2hhbmdlZCwgcmVjb21wdXRpbmchIik7CisgICAgICAgICAgICAgICAgLy9wb3B1bGF0ZSBQcmVFcSBmYWN0b3Igd2l0aCBpbnB1dCBnYWluIGZhY3Rvci4KKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IG1IYWxmRkZUU2l6ZTsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGNiLm1QcmVFcUZhY3RvclZlY3RvcltrXSA9IGlucHV0R2FpbkZhY3RvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IC8vaW5wdXRHYWluIGFuZCBwcmVFcQorCisgICAgLy89PT1FcVBvc3QKKyAgICBpZiAoY2IubVBvc3RFcUluVXNlKSB7CisgICAgICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworCisgICAgICAgIERQRXEgKnBQb3N0RXEgPSBwQ2hhbm5lbC0+Z2V0UG9zdEVxKCk7CisgICAgICAgIGlmIChwUG9zdEVxID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFcnJvcjogdXBkYXRlUGFyYW1ldGVycyBudWxsIHBvc3RFcSBmb3IgY2hhbm5lbDogJWQiLCBjaGFubmVsSW5kZXgpOworICAgICAgICAgICAgcmV0dXJuOyAvL2ZhaWxlZC4KKyAgICAgICAgfQorICAgICAgICBJU19DSEFOR0VEKGNoYW5nZWQsIGNiLm1Qb3N0RXFFbmFibGVkLCBwUG9zdEVxLT5pc0VuYWJsZWQoKSk7CisgICAgICAgIGlmIChjYi5tUG9zdEVxRW5hYmxlZCkgeworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgYiA9IDA7IGIgPCBnZXRQb3N0RXFCYW5kQ291bnQoKTsgYisrKSB7CisgICAgICAgICAgICAgICAgRFBFcUJhbmQgKnBFcUJhbmQgPSBwUG9zdEVxLT5nZXRCYW5kKGIpOworICAgICAgICAgICAgICAgIGlmIChwRXFCYW5kID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkVycm9yOiB1cGRhdGVQYXJhbWV0ZXJzIFBvc3RFcUJhbmQgTlVMTCBmb3IgYmFuZCAlZCIsIGIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vZmFpbGVkLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDaGFubmVsQnVmZmVyOjpFcUJhbmRQYXJhbXMgKnBFcUJhbmRQYXJhbXMgPSAmY2IubVBvc3RFcUJhbmRzW2JdOworICAgICAgICAgICAgICAgIElTX0NIQU5HRUQoY2hhbmdlZCwgcEVxQmFuZFBhcmFtcy0+ZW5hYmxlZCwgcEVxQmFuZC0+aXNFbmFibGVkKCkpOworICAgICAgICAgICAgICAgIElTX0NIQU5HRUQoY2hhbmdlZCwgcEVxQmFuZFBhcmFtcy0+ZnJlcUN1dG9mZkh6LAorICAgICAgICAgICAgICAgICAgICAgICAgcEVxQmFuZC0+Z2V0Q3V0b2ZmRnJlcXVlbmN5KCkpOworICAgICAgICAgICAgICAgIElTX0NIQU5HRUQoY2hhbmdlZCwgcEVxQmFuZFBhcmFtcy0+Z2FpbkRiLCBwRXFCYW5kLT5nZXRHYWluKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigicG9zdEVxIGNoYW5nZWQsIHJlY29tcHV0aW5nISBjaGFubmVsICVkIiwgY2hhbm5lbEluZGV4KTsKKyAgICAgICAgICAgICAgICBzaXplX3QgYmluTmV4dCA9IDA7CisgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgYiA9IDA7IGIgPCBnZXRQb3N0RXFCYW5kQ291bnQoKTsgYisrKSB7CisgICAgICAgICAgICAgICAgICAgIENoYW5uZWxCdWZmZXI6OkVxQmFuZFBhcmFtcyAqcEVxQmFuZFBhcmFtcyA9ICZjYi5tUG9zdEVxQmFuZHNbYl07CisKKyAgICAgICAgICAgICAgICAgICAgLy9mcmVxdWVuY3kgdHJhbnNsYXRpb24KKyAgICAgICAgICAgICAgICAgICAgY2IuY29tcHV0ZUJpblN0YXJ0U3RvcCgqcEVxQmFuZFBhcmFtcywgYmluTmV4dCk7CisgICAgICAgICAgICAgICAgICAgIGJpbk5leHQgPSBwRXFCYW5kUGFyYW1zLT5iaW5TdG9wICsgMTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgZmFjdG9yID0gZEJ0b0xpbmVhcihwRXFCYW5kUGFyYW1zLT5nYWluRGIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXBFcUJhbmRQYXJhbXMtPmVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvciA9IDEuMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gcEVxQmFuZFBhcmFtcy0+YmluU3RhcnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgayA8PSBwRXFCYW5kUGFyYW1zLT5iaW5TdG9wICYmIGsgPCBtSGFsZkZGVFNpemU7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2IubVBvc3RFcUZhY3RvclZlY3RvcltrXSA9IGZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvL2VuYWJsZWQKKyAgICB9CisKKyAgICAvLz09PU1CQworICAgIGlmIChjYi5tTWJjSW5Vc2UpIHsKKyAgICAgICAgRFBNYmMgKnBNYmMgPSBwQ2hhbm5lbC0+Z2V0TWJjKCk7CisgICAgICAgIGlmIChwTWJjID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFcnJvcjogdXBkYXRlUGFyYW1ldGVycyBNYmMgTlVMTCBmb3IgY2hhbm5lbDogJWQiLCBjaGFubmVsSW5kZXgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNiLm1NYmNFbmFibGVkID0gcE1iYy0+aXNFbmFibGVkKCk7CisgICAgICAgIGlmIChjYi5tTWJjRW5hYmxlZCkgeworICAgICAgICAgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBiID0gMDsgYiA8IGdldE1iY0JhbmRDb3VudCgpOyBiKyspIHsKKyAgICAgICAgICAgICAgICBEUE1iY0JhbmQgKnBNYmNCYW5kID0gcE1iYy0+Z2V0QmFuZChiKTsKKyAgICAgICAgICAgICAgICBpZiAocE1iY0JhbmQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRXJyb3I6IHVwZGF0ZVBhcmFtZXRlcnMgTWJjQmFuZCBOVUxMIGZvciBiYW5kICVkIiwgYik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy9mYWlsZWQuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENoYW5uZWxCdWZmZXI6Ok1iY0JhbmRQYXJhbXMgKnBNYmNCYW5kUGFyYW1zID0gJmNiLm1NYmNCYW5kc1tiXTsKKyAgICAgICAgICAgICAgICBwTWJjQmFuZFBhcmFtcy0+ZW5hYmxlZCA9IHBNYmNCYW5kLT5pc0VuYWJsZWQoKTsKKyAgICAgICAgICAgICAgICBJU19DSEFOR0VEKGNoYW5nZWQsIHBNYmNCYW5kUGFyYW1zLT5mcmVxQ3V0b2ZmSHosCisgICAgICAgICAgICAgICAgICAgICAgICBwTWJjQmFuZC0+Z2V0Q3V0b2ZmRnJlcXVlbmN5KCkpOworCisgICAgICAgICAgICAgICAgcE1iY0JhbmRQYXJhbXMtPmdhaW5QcmVEYiA9IHBNYmNCYW5kLT5nZXRQcmVHYWluKCk7CisgICAgICAgICAgICAgICAgcE1iY0JhbmRQYXJhbXMtPmdhaW5Qb3N0RGIgPSBwTWJjQmFuZC0+Z2V0UG9zdEdhaW4oKTsKKyAgICAgICAgICAgICAgICBwTWJjQmFuZFBhcmFtcy0+YXR0YWNrVGltZU1zID0gcE1iY0JhbmQtPmdldEF0dGFja1RpbWUoKTsKKyAgICAgICAgICAgICAgICBwTWJjQmFuZFBhcmFtcy0+cmVsZWFzZVRpbWVNcyA9IHBNYmNCYW5kLT5nZXRSZWxlYXNlVGltZSgpOworICAgICAgICAgICAgICAgIHBNYmNCYW5kUGFyYW1zLT5yYXRpbyA9IHBNYmNCYW5kLT5nZXRSYXRpbygpOworICAgICAgICAgICAgICAgIHBNYmNCYW5kUGFyYW1zLT50aHJlc2hvbGREYiA9IHBNYmNCYW5kLT5nZXRUaHJlc2hvbGQoKTsKKyAgICAgICAgICAgICAgICBwTWJjQmFuZFBhcmFtcy0+a25lZVdpZHRoRGIgPSBwTWJjQmFuZC0+Z2V0S25lZVdpZHRoKCk7CisgICAgICAgICAgICAgICAgcE1iY0JhbmRQYXJhbXMtPm5vaXNlR2F0ZVRocmVzaG9sZERiID0gcE1iY0JhbmQtPmdldE5vaXNlR2F0ZVRocmVzaG9sZCgpOworICAgICAgICAgICAgICAgIHBNYmNCYW5kUGFyYW1zLT5leHBhbmRlclJhdGlvID0gcE1iY0JhbmQtPmdldEV4cGFuZGVyUmF0aW8oKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2hhbmdlZCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJtYmMgY2hhbmdlZCwgcmVjb21wdXRpbmchIGNoYW5uZWwgJWQiLCBjaGFubmVsSW5kZXgpOworICAgICAgICAgICAgICAgIHNpemVfdCBiaW5OZXh0PSAwOworICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGIgPSAwOyBiIDwgZ2V0TWJjQmFuZENvdW50KCk7IGIrKykgeworICAgICAgICAgICAgICAgICAgICBDaGFubmVsQnVmZmVyOjpNYmNCYW5kUGFyYW1zICpwTWJjQmFuZFBhcmFtcyA9ICZjYi5tTWJjQmFuZHNbYl07CisKKyAgICAgICAgICAgICAgICAgICAgcE1iY0JhbmRQYXJhbXMtPnByZXZpb3VzRW52ZWxvcGUgPSAwOworCisgICAgICAgICAgICAgICAgICAgIC8vZnJlcXVlbmN5IHRyYW5zbGF0aW9uCisgICAgICAgICAgICAgICAgICAgIGNiLmNvbXB1dGVCaW5TdGFydFN0b3AoKnBNYmNCYW5kUGFyYW1zLCBiaW5OZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgYmluTmV4dCA9IHBNYmNCYW5kUGFyYW1zLT5iaW5TdG9wICsgMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorfQorCitzaXplX3QgRFBGcmVxdWVuY3k6OnByb2Nlc3NTYW1wbGVzKGNvbnN0IGZsb2F0ICppbiwgZmxvYXQgKm91dCwgc2l6ZV90IHNhbXBsZXMpIHsKKyAgICAgICBjb25zdCBmbG9hdCAqcEluID0gaW47CisgICAgICAgZmxvYXQgKnBPdXQgPSBvdXQ7CisKKyAgICAgICBpbnQgY2hhbm5lbENvdW50ID0gbUNoYW5uZWxCdWZmZXJzLnNpemUoKTsKKyAgICAgICBpZiAoY2hhbm5lbENvdW50IDwgMSkgeworICAgICAgICAgICBBTE9HVygid2FybmluZzogbm8gQ2hhbm5lbHMgcmVhZHkgZm9yIHByb2Nlc3NpbmciKTsKKyAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgfQorCisgICAgICAgLy8qKkNoZWNrIGlmIHBhcmFtZXRlcnMgaGF2ZSBjaGFuZ2VkIGFuZCB1cGRhdGUKKyAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgY2hhbm5lbENvdW50OyBjaCsrKSB7CisgICAgICAgICAgIHVwZGF0ZVBhcmFtZXRlcnMobUNoYW5uZWxCdWZmZXJzW2NoXSwgY2gpOworICAgICAgIH0KKworICAgICAgIC8vKipzZXBhcmF0ZSBpbnRvIGNoYW5uZWxzCisgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBzYW1wbGVzOyBrICs9IGNoYW5uZWxDb3VudCkgeworICAgICAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgY2hhbm5lbENvdW50OyBjaCsrKSB7CisgICAgICAgICAgICAgICBtQ2hhbm5lbEJ1ZmZlcnNbY2hdLmNCSW5wdXQud3JpdGUoKnBJbisrKTsKKyAgICAgICAgICAgfQorICAgICAgIH0KKworICAgICAgIC8vVE9ETzogbG9va2FoZWFkIGxpbWl0ZXJzCisgICAgICAgLy9UT0RPOiBhcHBseSBsaW5rZWQgbGltaXRlcnMgdG8gYWxsIGNoYW5uZWxzLgorICAgICAgIC8vKipQcm9jZXNzIGVhY2ggQ2hhbm5lbAorICAgICAgIGZvciAoaW50IGNoID0gMDsgY2ggPCBjaGFubmVsQ291bnQ7IGNoKyspIHsKKyAgICAgICAgICAgcHJvY2Vzc01vbm8obUNoYW5uZWxCdWZmZXJzW2NoXSk7CisgICAgICAgfQorCisgICAgICAgLy8qKiBlc3RpbWF0ZSBob3cgbXVjaCBkYXRhIGlzIGF2YWlsYWJsZSBpbiBBTEwgY2hhbm5lbHMKKyAgICAgICBzaXplX3QgYXZhaWxhYmxlID0gbUNoYW5uZWxCdWZmZXJzWzBdLmNCT3V0cHV0LmF2YWlsYWJsZVRvUmVhZCgpOworICAgICAgIGZvciAoaW50IGNoID0gMTsgY2ggPCBjaGFubmVsQ291bnQ7IGNoKyspIHsKKyAgICAgICAgICAgYXZhaWxhYmxlID0gc3RkOjptaW4oYXZhaWxhYmxlLCBtQ2hhbm5lbEJ1ZmZlcnNbY2hdLmNCT3V0cHV0LmF2YWlsYWJsZVRvUmVhZCgpKTsKKyAgICAgICB9CisKKyAgICAgICAvLyoqIG1ha2Ugc3VyZSB0byBvdXRwdXQganVzdCB3aGF0IHRoZSBidWZmZXIgY2FuIGhhbmRsZQorICAgICAgIGlmIChhdmFpbGFibGUgPiBzYW1wbGVzL2NoYW5uZWxDb3VudCkgeworICAgICAgICAgICBhdmFpbGFibGUgPSBzYW1wbGVzL2NoYW5uZWxDb3VudDsKKyAgICAgICB9CisKKyAgICAgICAvLyoqUHJlcGVuZCB6ZXJvZXMgaWYgbmVjZXNzYXJ5CisgICAgICAgc2l6ZV90IGZpbGwgPSBzYW1wbGVzIC0gKGNoYW5uZWxDb3VudCAqIGF2YWlsYWJsZSk7CisgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBmaWxsOyBrKyspIHsKKyAgICAgICAgICAgKnBPdXQrKyA9IDA7CisgICAgICAgfQorCisgICAgICAgLy8qKmludGVybGVhdmUgY2hhbm5lbHMKKyAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IGF2YWlsYWJsZTsgaysrKSB7CisgICAgICAgICAgIGZvciAoaW50IGNoID0gMDsgY2ggPCBjaGFubmVsQ291bnQ7IGNoKyspIHsKKyAgICAgICAgICAgICAgICpwT3V0KysgPSBtQ2hhbm5lbEJ1ZmZlcnNbY2hdLmNCT3V0cHV0LnJlYWQoKTsKKyAgICAgICAgICAgfQorICAgICAgIH0KKworICAgICAgIHJldHVybiBzYW1wbGVzOworfQorCitzaXplX3QgRFBGcmVxdWVuY3k6OnByb2Nlc3NNb25vKENoYW5uZWxCdWZmZXIgJmNiKSB7CisKKyAgICBzaXplX3QgcHJvY2Vzc2VkU2FtcGxlcyA9IDA7CisKKyAgICBzaXplX3QgYXZhaWxhYmxlID0gY2IuY0JJbnB1dC5hdmFpbGFibGVUb1JlYWQoKTsKKyAgICB3aGlsZSAoYXZhaWxhYmxlID49IG1CbG9ja1NpemUgLSBtT3ZlcmxhcFNpemUpIHsKKworICAgICAgICAvL21vdmUgdGFpbCBvZiBwcmV2aW91cworICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBrID0gMDsgayA8IG1PdmVybGFwU2l6ZTsgKytrKSB7CisgICAgICAgICAgICBjYi5pbnB1dFtrXSA9IGNiLmlucHV0W21CbG9ja1NpemUgLSBtT3ZlcmxhcFNpemUgKyBrXTsKKyAgICAgICAgfQorCisgICAgICAgIC8vcmVhZCBuZXcgYXZhaWxhYmxlIGRhdGEKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgayA9IDA7IGsgPCBtQmxvY2tTaXplIC0gbU92ZXJsYXBTaXplOyBrKyspIHsKKyAgICAgICAgICAgIGNiLmlucHV0W21PdmVybGFwU2l6ZSArIGtdID0gY2IuY0JJbnB1dC5yZWFkKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyMjIEFjdHVhbCBwcm9jZXNzCisgICAgICAgIHByb2Nlc3NPbmVWZWN0b3IoY2Iub3V0cHV0LCBjYi5pbnB1dCwgY2IpOworICAgICAgICAvLyMjRW5kIG9mIFByb2Nlc3MKKworICAgICAgICAvL21peCB0YWlsIChhbmQgY2FwdHVyZSBuZXcgdGFpbAorICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBrID0gMDsgayA8IG1PdmVybGFwU2l6ZTsgaysrKSB7CisgICAgICAgICAgICBjYi5vdXRwdXRba10gKz0gY2Iub3V0VGFpbFtrXTsKKyAgICAgICAgICAgIGNiLm91dFRhaWxba10gPSBjYi5vdXRwdXRbbUJsb2NrU2l6ZSAtIG1PdmVybGFwU2l6ZSArIGtdOyAvL25ldyB0YWlsCisgICAgICAgIH0KKworICAgICAgICAvL291dHB1dCBkYXRhCisgICAgICAgIGZvciAodW5zaWduZWQgaW50IGsgPSAwOyBrIDwgbUJsb2NrU2l6ZSAtIG1PdmVybGFwU2l6ZTsgaysrKSB7CisgICAgICAgICAgICBjYi5jQk91dHB1dC53cml0ZShjYi5vdXRwdXRba10pOworICAgICAgICB9CisKKyAgICAgICAgYXZhaWxhYmxlID0gY2IuY0JJbnB1dC5hdmFpbGFibGVUb1JlYWQoKTsKKyAgICB9CisKKyAgICByZXR1cm4gcHJvY2Vzc2VkU2FtcGxlczsKK30KKworc2l6ZV90IERQRnJlcXVlbmN5Ojpwcm9jZXNzT25lVmVjdG9yKEZsb2F0VmVjICYgb3V0cHV0LCBGbG9hdFZlYyAmIGlucHV0LAorICAgICAgICBDaGFubmVsQnVmZmVyICZjYikgeworCisgICAgLy8jI2FwcGx5IHdpbmRvdworICAgIEVpZ2VuOjpNYXA8RWlnZW46OlZlY3RvclhmPiBlV2luZG93KCZtVldpbmRvd1swXSwgbVZXaW5kb3cuc2l6ZSgpKTsKKyAgICBFaWdlbjo6TWFwPEVpZ2VuOjpWZWN0b3JYZj4gZUlucHV0KCZpbnB1dFswXSwgaW5wdXQuc2l6ZSgpKTsKKworICAgIEVpZ2VuOjpWZWN0b3JYZiBlV2luID0gZUlucHV0LmN3aXNlUHJvZHVjdChlV2luZG93KTsgLy9hcHBseSB3aW5kb3cKKworICAgIC8vIyNmZnQgLy9UT0RPOiByZWZhY3RvciBmcmVxdWVuY3kgdHJhbnNmb3JtYXRpb25zIGF3YXkgZnJvbSBvdGhlciBzdGFnZXMuCisgICAgbUZmdFNlcnZlci5md2QobUNvbXBsZXhUZW1wLCBlV2luKTsKKworICAgIHNpemVfdCBjU2l6ZSA9IG1Db21wbGV4VGVtcC5zaXplKCk7CisgICAgc2l6ZV90IG1heEJpbiA9IHN0ZDo6bWluKGNTaXplLzIsIG1IYWxmRkZUU2l6ZSk7CisKKyAgICAvLz09IEVxUHJlIChhbHdheXMgcnVucykKKyAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IG1heEJpbjsgaysrKSB7CisgICAgICAgIG1Db21wbGV4VGVtcFtrXSAqPSBjYi5tUHJlRXFGYWN0b3JWZWN0b3Jba107CisgICAgfQorCisgICAgLy89PSBNQkMKKyAgICBpZiAoY2IubU1iY0luVXNlICYmIGNiLm1NYmNFbmFibGVkKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGJhbmQgPSAwOyBiYW5kIDwgY2IubU1iY0JhbmRzLnNpemUoKTsgYmFuZCsrKSB7CisgICAgICAgICAgICBDaGFubmVsQnVmZmVyOjpNYmNCYW5kUGFyYW1zICpwTWJjQmFuZFBhcmFtcyA9ICZjYi5tTWJjQmFuZHNbYmFuZF07CisgICAgICAgICAgICBmbG9hdCBmRW5lcmd5U3VtID0gMDsKKworICAgICAgICAgICAgLy9hcHBseSBwcmUgZ2Fpbi4KKyAgICAgICAgICAgIGZsb2F0IHByZUdhaW5GYWN0b3IgPSBkQnRvTGluZWFyKHBNYmNCYW5kUGFyYW1zLT5nYWluUHJlRGIpOworICAgICAgICAgICAgZmxvYXQgcHJlR2FpblNxdWFyZWQgPSBwcmVHYWluRmFjdG9yICogcHJlR2FpbkZhY3RvcjsKKworICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IHBNYmNCYW5kUGFyYW1zLT5iaW5TdGFydDsgayA8PSBwTWJjQmFuZFBhcmFtcy0+YmluU3RvcDsgaysrKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgZlJlYWwgPSBtQ29tcGxleFRlbXBba10ucmVhbCgpOworICAgICAgICAgICAgICAgIGZsb2F0IGZJbWFnID0gbUNvbXBsZXhUZW1wW2tdLmltYWcoKTsKKyAgICAgICAgICAgICAgICBmbG9hdCBmU3F1YXJlID0gKGZSZWFsICogZlJlYWwgKyBmSW1hZyAqIGZJbWFnKSAqIHByZUdhaW5TcXVhcmVkOworCisgICAgICAgICAgICAgICAgZkVuZXJneVN1bSArPSBmU3F1YXJlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmRW5lcmd5U3VtID0gc3FydChmRW5lcmd5U3VtIC8yLjApOworICAgICAgICAgICAgZmxvYXQgZlRoZXRhID0gMC4wOworICAgICAgICAgICAgZmxvYXQgZkZBdHQgPSBwTWJjQmFuZFBhcmFtcy0+YXR0YWNrVGltZU1zOworICAgICAgICAgICAgZmxvYXQgZkZSZWwgPSBwTWJjQmFuZFBhcmFtcy0+cmVsZWFzZVRpbWVNczsKKworICAgICAgICAgICAgZmxvYXQgZlVwZGF0ZXNQZXJTZWNvbmQgPSAxMDsgLy9UT0RPOiBjb21wdXRlIGZyb20gZnJhbWVyYXRlCisKKworICAgICAgICAgICAgaWYgKGZFbmVyZ3lTdW0gPiBwTWJjQmFuZFBhcmFtcy0+cHJldmlvdXNFbnZlbG9wZSkgeworICAgICAgICAgICAgICAgIGZUaGV0YSA9IGV4cCgtMS4wIC8gKGZGQXR0ICogZlVwZGF0ZXNQZXJTZWNvbmQpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZlRoZXRhID0gZXhwKC0xLjAgLyAoZkZSZWwgKiBmVXBkYXRlc1BlclNlY29uZCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmbG9hdCBmRW52ID0gKDEuMCAtIGZUaGV0YSkgKiBmRW5lcmd5U3VtICsgZlRoZXRhICogcE1iY0JhbmRQYXJhbXMtPnByZXZpb3VzRW52ZWxvcGU7CisKKyAgICAgICAgICAgIC8vcHJlc2VydmUgZm9yIG5leHQgaXRlcmF0aW9uCisgICAgICAgICAgICBwTWJjQmFuZFBhcmFtcy0+cHJldmlvdXNFbnZlbG9wZSA9IGZFbnY7CisKKyAgICAgICAgICAgIGZsb2F0IGZUaHJlc2hvbGQgPSBkQnRvTGluZWFyKHBNYmNCYW5kUGFyYW1zLT50aHJlc2hvbGREYik7CisgICAgICAgICAgICBmbG9hdCBmTm9pc2VHYXRlVGhyZXNob2xkID0gZEJ0b0xpbmVhcihwTWJjQmFuZFBhcmFtcy0+bm9pc2VHYXRlVGhyZXNob2xkRGIpOworCisgICAgICAgICAgICBmbG9hdCBmTmV3RmFjdG9yID0gMS4wOworCisgICAgICAgICAgICBpZiAoZkVudiA+IGZUaHJlc2hvbGQpIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBmRGJBYm92ZSA9IGxpbmVhclRvRGIoZlRocmVzaG9sZCAvIGZFbnYpOworICAgICAgICAgICAgICAgIGZsb2F0IGZEYlRhcmdldCA9IGZEYkFib3ZlIC8gcE1iY0JhbmRQYXJhbXMtPnJhdGlvOworICAgICAgICAgICAgICAgIGZsb2F0IGZEYkNoYW5nZSA9IGZEYkFib3ZlIC0gZkRiVGFyZ2V0OworICAgICAgICAgICAgICAgIGZOZXdGYWN0b3IgPSBkQnRvTGluZWFyKGZEYkNoYW5nZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZFbnYgPCBmTm9pc2VHYXRlVGhyZXNob2xkKSB7CisgICAgICAgICAgICAgICAgaWYgKGZFbnYgPCBNSU5fRU5WRUxPUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgZkVudiA9IE1JTl9FTlZFTE9QRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmxvYXQgZkRiQmVsb3cgPSBsaW5lYXJUb0RiKGZOb2lzZUdhdGVUaHJlc2hvbGQgLyBmRW52KTsKKyAgICAgICAgICAgICAgICBmbG9hdCBmRGJUYXJnZXQgPSBmRGJCZWxvdyAvIHBNYmNCYW5kUGFyYW1zLT5leHBhbmRlclJhdGlvOworICAgICAgICAgICAgICAgIGZsb2F0IGZEYkNoYW5nZSA9IGZEYkJlbG93IC0gZkRiVGFyZ2V0OworICAgICAgICAgICAgICAgIGZOZXdGYWN0b3IgPSBkQnRvTGluZWFyKGZEYkNoYW5nZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vYXBwbHkgcG9zdCBnYWluLgorICAgICAgICAgICAgZk5ld0ZhY3RvciAqPSBkQnRvTGluZWFyKHBNYmNCYW5kUGFyYW1zLT5nYWluUG9zdERiKTsKKworICAgICAgICAgICAgaWYgKGZOZXdGYWN0b3IgPCAwKSB7CisgICAgICAgICAgICAgICAgZk5ld0ZhY3RvciA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vYXBwbHkgdG8gdGhpcyBiYW5kCisgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gcE1iY0JhbmRQYXJhbXMtPmJpblN0YXJ0OyBrIDw9IHBNYmNCYW5kUGFyYW1zLT5iaW5TdG9wOyBrKyspIHsKKyAgICAgICAgICAgICAgICBtQ29tcGxleFRlbXBba10gKj0gZk5ld0ZhY3RvcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IC8vZW5kIHBlciBiYW5kIHByb2Nlc3MKKworICAgIH0gLy9lbmQgTUJDCisKKyAgICAvLz09IEVxUG9zdAorICAgIGlmIChjYi5tUG9zdEVxSW5Vc2UgJiYgY2IubVBvc3RFcUVuYWJsZWQpIHsKKyAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBtYXhCaW47IGsrKykgeworICAgICAgICAgICAgbUNvbXBsZXhUZW1wW2tdICo9IGNiLm1Qb3N0RXFGYWN0b3JWZWN0b3Jba107CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyMjaWZmdCBkaXJlY3RseSB0byBvdXRwdXQuCisgICAgRWlnZW46Ok1hcDxFaWdlbjo6VmVjdG9yWGY+IGVPdXRwdXQoJm91dHB1dFswXSwgb3V0cHV0LnNpemUoKSk7CisgICAgbUZmdFNlcnZlci5pbnYoZU91dHB1dCwgbUNvbXBsZXhUZW1wKTsKKworICAgIHJldHVybiBtQmxvY2tTaXplOworfQorCit9IC8vbmFtZXNwYWNlIGRwX2Z4CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9kc3AvRFBGcmVxdWVuY3kuaCBiL21lZGlhL2xpYmVmZmVjdHMvZHluYW1pY3Nwcm9jL2RzcC9EUEZyZXF1ZW5jeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MTkxNDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9kc3AvRFBGcmVxdWVuY3kuaApAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2lmbmRlZiBEUEZSRVFVRU5DWV9IXworI2RlZmluZSBEUEZSRVFVRU5DWV9IXworCisjaW5jbHVkZSA8RWlnZW4vRGVuc2U+CisjaW5jbHVkZSA8dW5zdXBwb3J0ZWQvRWlnZW4vRkZUPgorCisjaW5jbHVkZSAiUkRzcC5oIgorI2luY2x1ZGUgIlNIQ2lyY3VsYXJCdWZmZXIuaCIKKworI2luY2x1ZGUgIkRQQmFzZS5oIgorCisKK25hbWVzcGFjZSBkcF9meCB7CisKK3VzaW5nIEZYQnVmZmVyID0gU0hDaXJjdWxhckJ1ZmZlcjxmbG9hdD47CisKK2NsYXNzIENoYW5uZWxCdWZmZXIgeworcHVibGljOgorICAgIEZYQnVmZmVyIGNCSW5wdXQ7ICAgLy8gQ2lyY3VsYXIgQnVmZmVyIGlucHV0CisgICAgRlhCdWZmZXIgY0JPdXRwdXQ7ICAvLyBDaXJjdWxhciBCdWZmZXIgb3V0cHV0CisgICAgRmxvYXRWZWMgaW5wdXQ7ICAgICAvLyB0aW1lIGRvbWFpbiB0ZW1wIHZlY3RvciBmb3IgaW5wdXQKKyAgICBGbG9hdFZlYyBvdXRwdXQ7ICAgIC8vIHRpbWUgZG9tYWluIHRlbXAgdmVjdG9yIGZvciBvdXRwdXQKKyAgICBGbG9hdFZlYyBvdXRUYWlsOyAgIC8vIHRpbWUgZG9tYWluIHRlbXAgdmVjdG9yIGZvciBvdXRwdXQgdGFpbCAoZm9yIG92ZXJsYXAtYWRkIG1ldGhvZCkKKworICAgIC8vQ3VycmVudCBwYXJhbWV0ZXJzCisgICAgZmxvYXQgaW5wdXRHYWluRGI7CisgICAgc3RydWN0IEJhbmRQYXJhbXMgeworICAgICAgICBib29sIGVuYWJsZWQ7CisgICAgICAgIGZsb2F0IGZyZXFDdXRvZmZIejsKKyAgICAgICAgc2l6ZV90IGJpblN0YXJ0OworICAgICAgICBzaXplX3QgYmluU3RvcDsKKyAgICB9OworICAgIHN0cnVjdCBFcUJhbmRQYXJhbXMgOiBwdWJsaWMgQmFuZFBhcmFtcyB7CisgICAgICAgIGZsb2F0IGdhaW5EYjsKKyAgICB9OworICAgIHN0cnVjdCBNYmNCYW5kUGFyYW1zIDogcHVibGljIEJhbmRQYXJhbXMgeworICAgICAgICBmbG9hdCBnYWluUHJlRGI7CisgICAgICAgIGZsb2F0IGdhaW5Qb3N0RGI7CisgICAgICAgIGZsb2F0IGF0dGFja1RpbWVNczsKKyAgICAgICAgZmxvYXQgcmVsZWFzZVRpbWVNczsKKyAgICAgICAgZmxvYXQgcmF0aW87CisgICAgICAgIGZsb2F0IHRocmVzaG9sZERiOworICAgICAgICBmbG9hdCBrbmVlV2lkdGhEYjsKKyAgICAgICAgZmxvYXQgbm9pc2VHYXRlVGhyZXNob2xkRGI7CisgICAgICAgIGZsb2F0IGV4cGFuZGVyUmF0aW87CisKKyAgICAgICAgLy9IaXN0b3JpYyB2YWx1ZXMKKyAgICAgICAgZmxvYXQgcHJldmlvdXNFbnZlbG9wZTsKKyAgICB9OworCisgICAgYm9vbCBtUHJlRXFJblVzZTsKKyAgICBib29sIG1QcmVFcUVuYWJsZWQ7CisgICAgc3RkOjp2ZWN0b3I8RXFCYW5kUGFyYW1zPiBtUHJlRXFCYW5kczsKKworICAgIGJvb2wgbU1iY0luVXNlOworICAgIGJvb2wgbU1iY0VuYWJsZWQ7CisgICAgc3RkOjp2ZWN0b3I8TWJjQmFuZFBhcmFtcz4gbU1iY0JhbmRzOworCisgICAgYm9vbCBtUG9zdEVxSW5Vc2U7CisgICAgYm9vbCBtUG9zdEVxRW5hYmxlZDsKKyAgICBzdGQ6OnZlY3RvcjxFcUJhbmRQYXJhbXM+IG1Qb3N0RXFCYW5kczsKKworICAgIGJvb2wgbUxpbWl0ZXJJblVzZTsKKyAgICBib29sIG1MaW1pdGVyRW5hYmxlZDsKKyAgICBGbG9hdFZlYyBtUHJlRXFGYWN0b3JWZWN0b3I7IC8vIHRlbXAgcHJlLWNvbXB1dGVkIHZlY3RvciB0byBzaGFwZSBzcGVjdHJ1bSBhdCBwcmVFUSBzdGFnZQorICAgIEZsb2F0VmVjIG1Qb3N0RXFGYWN0b3JWZWN0b3I7IC8vIHRlbXAgcHJlLWNvbXB1dGVkIHZlY3RvciB0byBzaGFwZSBzcGVjdHJ1bSBhdCBwb3N0RVEgc3RhZ2UKKworICAgIHZvaWQgaW5pdEJ1ZmZlcnModW5zaWduZWQgaW50IGJsb2NrU2l6ZSwgdW5zaWduZWQgaW50IG92ZXJsYXBTaXplLCB1bnNpZ25lZCBpbnQgaGFsZkZmdFNpemUsCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2FtcGxpbmdSYXRlLCBEUEJhc2UgJmRwQmFzZSk7CisgICAgdm9pZCBjb21wdXRlQmluU3RhcnRTdG9wKEJhbmRQYXJhbXMgJmJwLCBzaXplX3QgYmluU3RhcnQpOworcHJpdmF0ZToKKyAgICB1bnNpZ25lZCBpbnQgbVNhbXBsaW5nUmF0ZTsKKyAgICB1bnNpZ25lZCBpbnQgbUJsb2NrU2l6ZTsKKworfTsKKworY2xhc3MgRFBGcmVxdWVuY3kgOiBwdWJsaWMgRFBCYXNlIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHNpemVfdCBwcm9jZXNzU2FtcGxlcyhjb25zdCBmbG9hdCAqaW4sIGZsb2F0ICpvdXQsIHNpemVfdCBzYW1wbGVzKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKKyAgICB2b2lkIGNvbmZpZ3VyZShzaXplX3QgYmxvY2tTaXplLCBzaXplX3Qgb3ZlcmxhcFNpemUsIHNpemVfdCBzYW1wbGluZ1JhdGUpOworICAgIHN0YXRpYyBzaXplX3QgZ2V0TWluQm9ja1NpemUoKTsKKyAgICBzdGF0aWMgc2l6ZV90IGdldE1heEJvY2tTaXplKCk7CisKK3ByaXZhdGU6CisgICAgdm9pZCB1cGRhdGVQYXJhbWV0ZXJzKENoYW5uZWxCdWZmZXIgJmNiLCBpbnQgY2hhbm5lbEluZGV4KTsKKyAgICBzaXplX3QgcHJvY2Vzc01vbm8oQ2hhbm5lbEJ1ZmZlciAmY2IpOworICAgIHNpemVfdCBwcm9jZXNzT25lVmVjdG9yKEZsb2F0VmVjICZvdXRwdXQsIEZsb2F0VmVjICZpbnB1dCwgQ2hhbm5lbEJ1ZmZlciAmY2IpOworCisgICAgc2l6ZV90IG1CbG9ja1NpemU7CisgICAgc2l6ZV90IG1IYWxmRkZUU2l6ZTsKKyAgICBzaXplX3QgbU92ZXJsYXBTaXplOworICAgIHNpemVfdCBtU2FtcGxpbmdSYXRlOworCisgICAgc3RkOjp2ZWN0b3I8Q2hhbm5lbEJ1ZmZlcj4gbUNoYW5uZWxCdWZmZXJzOworCisgICAgLy9kc3AKKyAgICBGbG9hdFZlYyBtVldpbmRvdzsgIC8vd2luZG93IGNsYXNzLgorICAgIEVpZ2VuOjpWZWN0b3JYY2YgbUNvbXBsZXhUZW1wOworICAgIEVpZ2VuOjpGRlQ8ZmxvYXQ+IG1GZnRTZXJ2ZXI7Cit9OworCit9IC8vbmFtZXNwYWNlIGRwX2Z4CisKKyNlbmRpZiAgLy8gRFBGUkVRVUVOQ1lfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZHluYW1pY3Nwcm9jL2RzcC9SRHNwLmggYi9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9kc3AvUkRzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNDg0NDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9kc3AvUkRzcC5oCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBSRFNQX0gKKyNkZWZpbmUgUkRTUF9ICisKKyNpbmNsdWRlIDxjb21wbGV4PgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+Cit1c2luZyBGbG9hdFZlYyA9IHN0ZDo6dmVjdG9yPGZsb2F0PjsKK3VzaW5nIENvbXBsZXhWZWMgID0gc3RkOjp2ZWN0b3I8c3RkOjpjb21wbGV4PGZsb2F0Pj47CisKKy8vID09PT09PT0KKy8vIERTUCB3aW5kb3cgY3JlYXRpb24KKy8vID09PT09PT0KKworI2RlZmluZSBUV09QSSAoTV9QSSAqIDIpCisKK2VudW0gcmRzcF93aW5kb3dfdHlwZSB7CisgICAgUkRTUF9XSU5ET1dfUkVDVEFOR1VMQVIsCisgICAgUkRTUF9XSU5ET1dfVFJJQU5HVUxBUiwKKyAgICBSRFNQX1dJTkRPV19UUklBTkdVTEFSX0ZMQVRfVE9QLAorICAgIFJEU1BfV0lORE9XX0hBTU1JTkcsCisgICAgUkRTUF9XSU5ET1dfSEFNTUlOR19GTEFUX1RPUCwKKyAgICBSRFNQX1dJTkRPV19IQU5OSU5HLAorICAgIFJEU1BfV0lORE9XX0hBTk5JTkdfRkxBVF9UT1AsCit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyB2b2lkIGZpbGxSZWN0YW5ndWxhcihUICZ2KSB7CisgICAgY29uc3Qgc2l6ZV90IHNpemUgPSB2LnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICB2W2ldID0gMS4wOworICAgIH0KK30gLy9yZWN0YW5ndWxhcgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyB2b2lkIGZpbGxUcmlhbmd1bGFyKFQgJnYsIHNpemVfdCBvdmVybGFwKSB7CisgICAgY29uc3Qgc2l6ZV90IHNpemUgPSB2LnNpemUoKTsKKyAgICAvL3JhbXAgdXAKKyAgICBzaXplX3QgaSA9IDA7CisgICAgaWYgKG92ZXJsYXAgPiAwKSB7CisgICAgICAgIGZvciAoOyBpIDwgb3ZlcmxhcDsgaSsrKSB7CisgICAgICAgICAgICB2W2ldID0gKDIuMCAqIGkgKyAxKSAvICgyICogb3ZlcmxhcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvL2ZsYXQgdG9wCisgICAgZm9yICg7IGkgPCBzaXplIC0gb3ZlcmxhcDsgaSsrKSB7CisgICAgICAgIHZbaV0gPSAxLjA7CisgICAgfQorCisgICAgLy9yYW1wIGRvd24KKyAgICBpZiAob3ZlcmxhcCA+IDApIHsKKyAgICAgICAgZm9yICg7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIHZbaV0gPSAoMi4wICogKHNpemUgLSBpKSAtIDEpIC8gKDIgKiBvdmVybGFwKTsKKyAgICAgICAgfQorICAgIH0KK30gLy90cmlhbmd1bGFyCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIHZvaWQgZmlsbEhhbW1pbmcoVCAmdiwgc2l6ZV90IG92ZXJsYXApIHsKKyAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IHYuc2l6ZSgpOworICAgIGNvbnN0IHNpemVfdCB0d29PdmVybGFwID0gMiAqIG92ZXJsYXA7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGlmIChvdmVybGFwID4gMCkgeworICAgICAgICBmb3IgKDsgaSA8IG92ZXJsYXA7IGkrKykgeworICAgICAgICAgICAgdltpXSA9IDAuNTQgLSAwLjQ2ICogY29zKFRXT1BJICogaSAvKHR3b092ZXJsYXAgLSAxKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvL2ZsYXQgdG9wCisgICAgZm9yICg7IGkgPCBzaXplIC0gb3ZlcmxhcDsgaSsrKSB7CisgICAgICAgIHZbaV0gPSAxLjA7CisgICAgfQorCisgICAgLy9yYW1wIGRvd24KKyAgICBpZiAob3ZlcmxhcCA+IDApIHsKKyAgICAgICAgZm9yICg7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIGludCBrID0gaSAtICgoaW50KXNpemUgLSAyICogb3ZlcmxhcCk7CisgICAgICAgICAgICB2W2ldID0gMC41NCAtIDAuNDYgKiBjb3MoVFdPUEkgKiBrIC8gKHR3b092ZXJsYXAgLSAxKSk7CisgICAgICAgIH0KKyAgICB9Cit9IC8vaGFtbWluZworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyB2b2lkIGZpbGxIYW5uaW5nKFQgJnYsIHNpemVfdCBvdmVybGFwKSB7CisgICAgY29uc3Qgc2l6ZV90IHNpemUgPSB2LnNpemUoKTsKKyAgICBjb25zdCBzaXplX3QgdHdvT3ZlcmxhcCA9IDIgKiBvdmVybGFwOworICAgIC8vcmFtcCB1cAorICAgIHNpemVfdCBpID0gMDsKKyAgICBpZiAob3ZlcmxhcCA+IDApIHsKKyAgICAgICAgZm9yICg7IGkgPCBvdmVybGFwOyBpKyspIHsKKyAgICAgICAgICAgIHZbaV0gPSAwLjUgKiAoMS4wIC0gY29zKFRXT1BJICogaSAvICh0d29PdmVybGFwIC0gMSkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vZmxhdCB0b3AKKyAgICBmb3IgKDsgaSA8IHNpemUgLSBvdmVybGFwOyBpKyspIHsKKyAgICAgICAgdltpXSA9IDEuMDsKKyAgICB9CisKKyAgICAvL3JhbXAgZG93bgorICAgIGlmIChvdmVybGFwID4gMCkgeworICAgICAgICBmb3IgKDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgaW50IGsgPSBpIC0gKChpbnQpc2l6ZSAtIDIgKiBvdmVybGFwKTsKKyAgICAgICAgICAgIHZbaV0gPSAwLjUgKiAoMS4wIC0gY29zKFRXT1BJICogayAvICh0d29PdmVybGFwIC0gMSkpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgdm9pZCBmaWxsX3dpbmRvdyhUICZ2LCBpbnQgdHlwZSwgc2l6ZV90IHNpemUsIHNpemVfdCBvdmVybGFwKSB7CisgICAgaWYgKG92ZXJsYXAgPiBzaXplIC8gMikgeworICAgICAgICBvdmVybGFwID0gc2l6ZSAvIDI7CisgICAgfQorICAgIHYucmVzaXplKHNpemUpOworCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBSRFNQX1dJTkRPV19SRUNUQU5HVUxBUjoKKyAgICAgICAgZmlsbFJlY3Rhbmd1bGFyKHYpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJEU1BfV0lORE9XX1RSSUFOR1VMQVI6CisgICAgICAgIGZpbGxUcmlhbmd1bGFyKHYsIHNpemUgLyAyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSRFNQX1dJTkRPV19UUklBTkdVTEFSX0ZMQVRfVE9QOgorICAgICAgICBmaWxsVHJpYW5ndWxhcih2LCBvdmVybGFwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSRFNQX1dJTkRPV19IQU1NSU5HOgorICAgICAgICBmaWxsSGFtbWluZyh2LCBzaXplIC8gMik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUkRTUF9XSU5ET1dfSEFNTUlOR19GTEFUX1RPUDoKKyAgICAgICAgZmlsbEhhbW1pbmcodiwgb3ZlcmxhcCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUkRTUF9XSU5ET1dfSEFOTklORzoKKyAgICAgICAgZmlsbEhhbm5pbmcodiwgc2l6ZSAvIDIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJEU1BfV0lORE9XX0hBTk5JTkdfRkxBVF9UT1A6CisgICAgICAgIGZpbGxIYW5uaW5nKHYsIG92ZXJsYXApOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiRXJyb3I6IHVua25vd24gd2luZG93IHR5cGUgJWQiLCB0eXBlKTsKKyAgICB9Cit9CisKKy8vfTsKKyNlbmRpZiAvL1JEU1BfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9keW5hbWljc3Byb2MvZHNwL1NIQ2lyY3VsYXJCdWZmZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvZHluYW1pY3Nwcm9jL2RzcC9TSENpcmN1bGFyQnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEzOWNkOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZHluYW1pY3Nwcm9jL2RzcC9TSENpcmN1bGFyQnVmZmVyLmgKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU0hDSVJDVUxBUkJVRkZFUl9ICisjZGVmaW5lIFNIQ0lSQ1VMQVJCVUZGRVJfSAorCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitjbGFzcyBTSENpcmN1bGFyQnVmZmVyIHsKKworcHVibGljOgorICAgIFNIQ2lyY3VsYXJCdWZmZXIoKSA6IG1SZWFkSW5kZXgoMCksIG1Xcml0ZUluZGV4KDApLCBtUmVhZEF2YWlsYWJsZSgwKSB7CisgICAgfQorCisgICAgZXhwbGljaXQgU0hDaXJjdWxhckJ1ZmZlcihzaXplX3QgbWF4U2l6ZSkgeworICAgICAgICByZXNpemUobWF4U2l6ZSk7CisgICAgfQorICAgIHZvaWQgcmVzaXplKHNpemVfdCBtYXhTaXplKSB7CisgICAgICAgIG1CdWZmZXIucmVzaXplKG1heFNpemUpOworICAgICAgICBtUmVhZEluZGV4ID0gMDsKKyAgICAgICAgbVdyaXRlSW5kZXggPSAwOworICAgICAgICBtUmVhZEF2YWlsYWJsZSA9IDA7CisgICAgfQorICAgIGlubGluZSB2b2lkIHdyaXRlKFQgdmFsdWUpIHsKKyAgICAgICAgaWYgKGF2YWlsYWJsZVRvV3JpdGUoKSkgeworICAgICAgICAgICAgbUJ1ZmZlclttV3JpdGVJbmRleCsrXSA9IHZhbHVlOworICAgICAgICAgICAgaWYgKG1Xcml0ZUluZGV4ID49IGdldFNpemUoKSkgeworICAgICAgICAgICAgICAgIG1Xcml0ZUluZGV4ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SZWFkQXZhaWxhYmxlKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiRXJyb3I6IFNIQ2lyY3VsYXJCdWZmZXIgbm8gc3BhY2UgdG8gd3JpdGUuIGFsbG9jYXRlZCBzaXplICV6dSAiLCBnZXRTaXplKCkpOworICAgICAgICB9CisgICAgfQorICAgIGlubGluZSBUIHJlYWQoKSB7CisgICAgICAgIFQgdmFsdWUgPSBUKCk7CisgICAgICAgIGlmIChhdmFpbGFibGVUb1JlYWQoKSkgeworICAgICAgICAgICAgdmFsdWUgPSBtQnVmZmVyW21SZWFkSW5kZXgrK107CisgICAgICAgICAgICBpZiAobVJlYWRJbmRleCA+PSBnZXRTaXplKCkpIHsKKyAgICAgICAgICAgICAgICBtUmVhZEluZGV4ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SZWFkQXZhaWxhYmxlLS07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiV2FybmluZzogU0hDaXJjdWxhckJ1ZmZlciBubyBkYXRhIGF2YWlsYWJsZSB0byByZWFkLiBEZWZhdWx0IHZhbHVlIHJldHVybmVkIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgICBpbmxpbmUgc2l6ZV90IGF2YWlsYWJsZVRvUmVhZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1SZWFkQXZhaWxhYmxlOworICAgIH0KKyAgICBpbmxpbmUgc2l6ZV90IGF2YWlsYWJsZVRvV3JpdGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBnZXRTaXplKCkgLSBtUmVhZEF2YWlsYWJsZTsKKyAgICB9CisgICAgaW5saW5lIHNpemVfdCBnZXRTaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUJ1ZmZlci5zaXplKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6dmVjdG9yPFQ+IG1CdWZmZXI7CisgICAgc2l6ZV90IG1SZWFkSW5kZXg7CisgICAgc2l6ZV90IG1Xcml0ZUluZGV4OworICAgIHNpemVfdCBtUmVhZEF2YWlsYWJsZTsKK307CisKKworI2VuZGlmIC8vU0hDSVJDVUxBUkJVRkZFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuYyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5jCmluZGV4IGNkMGU3NjUuLmMxY2U1MTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5jCkBAIC0yNjEsNyArMjYxLDYgQEAKICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkID0gTlVMTDsKICAgICBlZmZlY3RfaGFuZGxlX3QgaXRmZTsKICAgICBlZmZlY3RfZW50cnlfdCAqZng7Ci0gICAgaW50IGZvdW5kID0gMDsKICAgICBpbnQgcmV0OwogCiAgICAgaWYgKHV1aWQgPT0gTlVMTCB8fCBwSGFuZGxlID09IE5VTEwpIHsKQEAgLTQyOCw4ICs0MjcsNiBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBpbnQgaW5pdCgpIHsKLSAgICBpbnQgaGRsOwotCiAgICAgaWYgKGdJbml0RG9uZSkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC01NTIsNyArNTQ5LDYgQEAKICAgICBsaXN0X2VsZW1fdCAqZSA9IGdMaWJyYXJ5TGlzdDsKICAgICBsaWJfZW50cnlfdCAqbCA9IE5VTEw7CiAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZCA9IE5VTEw7Ci0gICAgaW50IGZvdW5kID0gMDsKICAgICBpbnQgcmV0ID0gMDsKIAogICAgIGRwcmludGYoZmQsICJMaWJyYXJpZXMgbG9hZGVkOlxuIik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c1htbENvbmZpZ0xvYWRlci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c1htbENvbmZpZ0xvYWRlci5jcHAKaW5kZXggNDM4Yjc4Ny4uN2E3ZDQzMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNYbWxDb25maWdMb2FkZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzWG1sQ29uZmlnTG9hZGVyLmNwcApAQCAtMzI3LDcgKzMyNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdTa2lwcGVkRWZmZWN0cywgJmdTdWJFZmZlY3RMaXN0KTsKIAogICAgIEFMT0dFX0lGKHJlc3VsdC5uYlNraXBwZWRFbGVtZW50ICE9IDAsICIlenUgZXJyb3JzIGR1cmluZyBsb2FkaW5nIG9mIGNvbmZpZ3VyYXRpb246ICVzIiwKLSAgICAgICAgICAgICByZXN1bHQubmJTa2lwcGVkRWxlbWVudCwgcGF0aCA/OiBlZmZlY3RzQ29uZmlnOjpERUZBVUxUX1BBVEgpOworICAgICAgICAgICAgIHJlc3VsdC5uYlNraXBwZWRFbGVtZW50LCByZXN1bHQuY29uZmlnUGF0aCA/OiAiTm8gY29uZmlnIGZpbGUgZm91bmQiKTsKIAogICAgIHJldHVybiByZXN1bHQubmJTa2lwcGVkRWxlbWVudDsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db2VmZnMuaAppbmRleCBmMzJlZDMwLi40ZWNhZjE0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvZWZmcy5oCkBAIC01MzQsMjQ2ICs1MzQsMjQ2IEBACiAKICAvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgNTVIeiAqLwogI2RlZmluZSBIUEZfRnM4MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAwLjk1ODg0OWYKLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAgLTEuOTE3Njk4ZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTE3Njk4ZikKICNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAgMC45NTg4NDlmCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0xLjkzOTAwMWYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjkzOTAwMWYpCiAjZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTQwODA3ZgogI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk2NjkwOWYKLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTMzODE4ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTMzODE4ZikKICNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjY5MDlmCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk1NTczMmYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk1NTczMmYpCiAjZGVmaW5lIEhQRl9GczExMDI1X0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTU2NjkwZgogI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk2ODY1MGYKLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTM3MzAwZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTM3MzAwZikKICNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45Njg2NTBmCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk1OTMyN2YKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk1OTMyN2YpCiAjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTYwMTM4ZgogI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3MzU4OGYKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTQ3MTc2ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTQ3MTc2ZikKICNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzM1ODhmCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2OTQ5NGYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2OTQ5NGYpCiAjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTY5OTUyZgogI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3NzY3MWYKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTU1MzQzZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTU1MzQzZikKICNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45Nzc2NzFmCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk3Nzg2M2YKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3Nzg2M2YpCiAjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc4MTA1ZgogI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3ODU1MWYKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTU3MTAyZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTU3MTAyZikKICNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45Nzg1NTFmCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk3OTY2MmYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3OTY2MmYpCiAjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc5ODY2ZgogI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4MTA0MmYKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTYyMDg0ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTYyMDg0ZikKICNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODEwNDJmCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk4NDc0NmYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk4NDc0NmYpCiAjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0ODYxZgogI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4MzA5N2YKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTY2MTk0ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY2MTk0ZikKICNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODMwOTdmCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk4ODkzMWYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk4ODkzMWYpCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg4OTkyZgogI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4MzUzOWYKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTY3MDc5ZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY3MDc5ZikKICNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODM1MzlmCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk4OTgzMWYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk4OTgzMWYpCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg5ODgyZgogCiAjaWZkZWYgSElHSEVSX0ZTCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg2MDQwZgotI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NzIwODBmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NzIwODBmKQogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NjA0MGYKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTk0OTE1ZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk0OTE1ZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTQ5MjhmCiAKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODcyOTRmCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjk3NDU4OGYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3NDU4OGYpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg3Mjk0ZgotI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTc0NThmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTc0NThmKQogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NzQ2MWYKICNlbmRpZgogCiAKICAvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgNjZIeiAqLwogI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAwLjk1MzAxNmYKLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAgLTEuOTA2MDMyZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTA2MDMyZikKICNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgMC45NTMwMTZmCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0xLjkyNjgxMGYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjkyNjgxMGYpCiAjZGVmaW5lIEhQRl9GczgwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTI5Mzk2ZgogI2RlZmluZSBIUEZfRnMxMTAyNV9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk2MjYzOGYKLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTI1Mjc1ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTI1Mjc1ZikKICNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjI2MzhmCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk0Njg4MWYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk0Njg4MWYpCiAjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTQ4MjU2ZgogI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk2NDcxOGYKLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTI5NDM1ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTI5NDM1ZikKICNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjQ3MThmCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk1MTE5NmYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk1MTE5NmYpCiAjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTUyMzU5ZgogI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3MDYyMmYKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTQxMjQ0ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTQxMjQ0ZikKICNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzA2MjJmCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2MzM5NGYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2MzM5NGYpCiAjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTY0MDUyZgogI2RlZmluZSBIUEZfRnMyMjA1MF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3NTUwOWYKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTUxMDE5ZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTUxMDE5ZikKICNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzU1MDlmCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk3MzQzNmYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MzQzNmYpCiAjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTczNzg0ZgogI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3NjU2M2YKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTUzMTI1ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTUzMTI1ZikKICNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzY1NjNmCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk3NTU5NGYKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3NTU5NGYpCiAjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc1ODg5ZgogI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3OTU0N2YKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTU5MDkzZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTU5MDkzZikKICNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45Nzk1NDdmCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk4MTY5NWYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk4MTY5NWYpCiAjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgxODYxZgogI2RlZmluZSBIUEZfRnM0NDEwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4MjAxMGYKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTY0MDE5ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY0MDE5ZikKICNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODIwMTBmCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk4NjcxOGYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk4NjcxOGYpCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg2ODA1ZgogI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4MjU0MGYKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTY1MDc5ZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY1MDc5ZikKICNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODI1NDBmCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk4Nzc5N2YKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk4Nzc5N2YpCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg3ODcxZgogCiAjaWZkZWYgSElHSEVSX0ZTCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1NTM5ZgotI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45NzEwNzdmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NzEwNzdmKQogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTUzOWYKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTkzODk4ZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkzODk4ZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTM5MTdmCiAKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODcwNDNmCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjk3NDA4NmYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3NDA4NmYpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg3MDQzZgotI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTY5NDlmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTY5NDlmKQogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5Njk1NGYKICNlbmRpZgogCiAvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgNzhIeiAqLwogI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgICAwLjk0NjY5M2YKLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAgLTEuODkzMzg3ZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICAoLTEuODkzMzg3ZikKICNkZWZpbmUgSFBGX0ZzODAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAgMC45NDY2OTNmCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0xLjkxMzUxN2YKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjkxMzUxN2YpCiAjZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTE3MTA1ZgogI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk1Nzk5OWYKLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTE1OTk4ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTE1OTk4ZikKICNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NTc5OTlmCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjkzNzIyOWYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjkzNzIyOWYpCiAjZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTM5MTQwZgogI2RlZmluZSBIUEZfRnMxMjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk2MDQ0NmYKLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTIwODkyZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTIwODkyZikKICNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjA0NDZmCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk0MjMyNmYKKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk0MjMyNmYpCiAjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTQzOTQ0ZgogI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk2NzM5N2YKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTM0Nzk0ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTM0Nzk0ZikKICNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjczOTdmCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk1Njc0MGYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk1Njc0MGYpCiAjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTU3NjU2ZgogI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3MzE1NmYKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTQ2MzEzZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTQ2MzEzZikKICNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzMxNTZmCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk2ODYwN2YKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2ODYwN2YpCiAjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTY5MDkyZgogI2RlZmluZSBIUEZfRnMyNDAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3NDM5OGYKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTQ4Nzk3ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTQ4Nzk3ZikKICNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzQzOThmCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk3MTE1N2YKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MTE1N2YpCiAjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTcxNTY4ZgogI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3NzkxOGYKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTU1ODM2ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTU1ODM2ZikKICNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45Nzc5MThmCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk3ODM2N2YKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3ODM2N2YpCiAjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc4NTk5ZgogI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4MDgyNGYKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTYxNjQ5ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTYxNjQ5ZikKICNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODA4MjRmCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk4NDMwM2YKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk4NDMwM2YpCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0NDI1ZgogI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4MTQ1MGYKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTYyOTAwZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTYyOTAwZikKICNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODE0NTBmCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xLjk4NTU3OGYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk4NTU3OGYpCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1NjgxZgogCiAjaWZkZWYgSElHSEVSX0ZTCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0OTkyZgotI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45Njk5ODRmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45Njk5ODRmKQogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDk5MmYKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTkyNzg5ZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkyNzg5ZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTI4MTVmCiAKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODY3NjlmCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjk3MzUzOWYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MzUzOWYpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NzY5ZgotI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTYzOTRmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTYzOTRmKQogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NjQwMWYKICNlbmRpZgogCiAvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgOTBIeiAqLwogI2RlZmluZSBIUEZfRnM4MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTQwNDEyZgotI2RlZmluZSBIUEZfRnM4MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgIC0xLjg4MDgyNWYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuODgwODI1ZikKICNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk0MDQxMmYKLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45MDAyMzFmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjkwMDIzMWYpCiAjZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45MDQ5NzdmCiAjZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45NTMzODNmCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTA2NzY2ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45MDY3NjZmKQogI2RlZmluZSBIUEZfRnMxMTAyNV9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTUzMzgzZgotI2RlZmluZSBIUEZfRnMxMTAyNV9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjkyNzU3OWYKKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTI3NTc5ZikKICNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjkzMDExMWYKICNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk1NjE5M2YKLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45MTIzODdmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjkxMjM4N2YpCiAjZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45NTYxOTNmCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTMzNDU5ZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45MzM0NTlmKQogI2RlZmluZSBIUEZfRnMxMjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTM1NjAzZgogI2RlZmluZSBIUEZfRnMxNjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTY0MTgzZgotI2RlZmluZSBIUEZfRnMxNjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjkyODM2NWYKKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTI4MzY1ZikKICNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk2NDE4M2YKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45NTAwODdmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk1MDA4N2YpCiAjZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NTEzMDNmCiAjZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45NzA4MDlmCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTQxNjE4ZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NDE2MThmKQogI2RlZmluZSBIUEZfRnMyMjA1MF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTcwODA5ZgotI2RlZmluZSBIUEZfRnMyMjA1MF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk2Mzc3OGYKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTYzNzc4ZikKICNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk2NDQyM2YKICNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk3MjIzOWYKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45NDQ0NzdmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk0NDQ3N2YpCiAjZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45NzIyMzlmCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTY2NzIxZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45NjY3MjFmKQogI2RlZmluZSBIUEZfRnMyNDAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTY3MjY2ZgogI2RlZmluZSBIUEZfRnMzMjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTc2MjkyZgotI2RlZmluZSBIUEZfRnMzMjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjk1MjU4NGYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTUyNTg0ZikKICNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk3NjI5MmYKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45NzUwNDBmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3NTA0MGYpCiAjZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NzUzNDdmCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45Nzk2NDFmCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgLTEuOTU5MjgyZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NTkyODJmKQogI2RlZmluZSBIUEZfRnM0NDEwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTc5NjQxZgotI2RlZmluZSBIUEZfRnM0NDEwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk4MTg4OGYKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTgxODg4ZikKICNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk4MjA1MGYKICNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4MDM2MmYKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAtMS45NjA3MjRmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2MDcyNGYpCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODAzNjJmCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTgzMzU5ZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45ODMzNTlmKQogI2RlZmluZSBIUEZfRnM0ODAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTgzNDk3ZgogCiAjaWZkZWYgSElHSEVSX0ZTCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0NDQ2ZgotI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAtMS45Njg4OTJmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45Njg4OTJmKQogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDQ0NmYKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTkxNjgwZgorI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkxNjgwZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTE3MTRmCiAKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODY0OTZmCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIC0xLjk3Mjk5MmYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3Mjk5MmYpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NDk2ZgotI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTU4NDBmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTU4NDBmKQogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NTg0OGYKICNlbmRpZgogCkBAIC03ODYsMjQ0ICs3ODYsMjQ0IEBACiAvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgNTVIeiAqLwogI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA5MTk3ZgogI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwOTE5N2YKLSNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAtMS45Nzk1NDVmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwOTE5N2YpCisjZGVmaW5lIEJQRl9GczgwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3OTU0NWYpCiAjZGVmaW5lIEJQRl9GczgwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODEzOTNmCiAjZGVmaW5lIEJQRl9GczExMDI1X0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDY2OTFmCiAjZGVmaW5lIEJQRl9GczExMDI1X0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDA2NjkxZgotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk4NTQ4OGYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDA2NjkxZikKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTg1NDg4ZikKICNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NjQ2NGYKICNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwNjE1MGYKICNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDYxNTBmCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTg2NzMzZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDYxNTBmKQorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45ODY3MzNmKQogI2RlZmluZSBCUEZfRnMxMjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTg3NTU3ZgogI2RlZmluZSBCUEZfRnMxNjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDA0NjIwZgogI2RlZmluZSBCUEZfRnMxNjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwNDYyMGYKLSNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTAxODlmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwNDYyMGYpCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MDE4OWYpCiAjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTA2NTNmCiAjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDMzNTdmCiAjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDAzMzU3ZgotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5Mjk2NGYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAzMzU3ZikKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkyOTY0ZikKICNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5MzIwOWYKICNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMzA4NWYKICNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDMwODVmCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTkzNTUyZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDMwODVmKQorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTM1NTJmKQogI2RlZmluZSBCUEZfRnMyNDAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTkzNzU5ZgogI2RlZmluZSBCUEZfRnMzMjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAyMzE1ZgogI2RlZmluZSBCUEZfRnMzMjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMjMxNWYKLSNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTUxOTlmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMjMxNWYpCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NTE5OWYpCiAjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTUzMTZmCiAjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDE2ODFmCiAjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDAxNjgxZgotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5NjUzN2YKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAxNjgxZikKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk2NTM3ZikKICNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NjU5OWYKICNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMTU0NWYKICNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDE1NDVmCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTk2ODIzZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDE1NDVmKQorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTY4MjNmKQogI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2ODc1ZgogCiAjaWZkZWYgSElHSEVSX0ZTCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDA3NjJmCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwNzYyZgotI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5ODQ2MWYKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwNzYyZikKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk4NDYxZikKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5ODQ3N2YKIAogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAwMzgxZgogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDM4MWYKLSNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAtMS45OTkyMzRmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDM4MWYpCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5OTIzNGYpCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTkyMzhmCiAjZW5kaWYKIAogLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDY2SHogKi8KICNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDEyNjQ4ZgogI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczgwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMTI2NDhmCi0jZGVmaW5lIEJQRl9GczgwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45NzE3NjBmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDEyNjQ4ZikKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45NzE3NjBmKQogI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NzQ0MTJmCiAjZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwOTIwOWYKICNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDA5MjA5ZgotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTc5OTY2ZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwOTIwOWYpCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTc5OTY2ZikKICNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTgxMzY4ZgogI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDg0NjhmCiAjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwODQ2OGYKLSNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk4MTY4NWYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDg0NjhmKQorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk4MTY4NWYpCiAjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk4Mjg2OWYKICNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA2MzY0ZgogI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDYzNjRmCi0jZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAtMS45ODY0NTdmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDA2MzY0ZikKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45ODY0NTdmKQogI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45ODcxMjRmCiAjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwNDYyNmYKICNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDA0NjI2ZgotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTkwMjg4ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwNDYyNmYpCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTkwMjg4ZikKICNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTkwNjQxZgogI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDQyNTJmCiAjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwNDI1MmYKLSNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5MTEwMGYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDQyNTJmKQorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MTEwMGYpCiAjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5MTM5OGYKICNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAzMTkyZgogI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDMxOTJmCi0jZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAtMS45OTMzNzRmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAzMTkyZikKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTMzNzRmKQogI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTM1NDFmCiAjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMjMxOGYKICNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDAyMzE4ZgotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTk1MjIxZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMjMxOGYpCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTk1MjIxZikKICNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk1MzA5ZgogI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDIxMzFmCiAjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwMjEzMWYKLSNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5NTYxNWYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDIxMzFmKQorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NTYxNWYpCiAjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5NTY5MGYKIAogI2lmZGVmIEhJR0hFUl9GUwogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDEwNTVmCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwMTA1NWYKLSNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5Nzg2OGYKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDEwNTVmKQorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5Nzg2OGYpCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5Nzg5MWYKIAogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgMC4wMDA1MjhmCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgLTAuMDAwNTI4ZgotI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAtMS45OTg5MzlmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICgtMC4wMDA1MjhmKQorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAoLTEuOTk4OTM5ZikKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgIDAuOTk4OTQ1ZgogI2VuZGlmCiAKIC8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA3OEh6ICovCiAjZGVmaW5lIEJQRl9GczgwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAxODU3MmYKICNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM4MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDE4NTcyZgotI2RlZmluZSBCUEZfRnM4MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTU4NzQ1ZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAxODU3MmYpCisjZGVmaW5lIEJQRl9GczgwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTU4NzQ1ZikKICNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTYyNDI3ZgogI2RlZmluZSBCUEZfRnMxMTAyNV9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMTM1NDVmCiAjZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAxMzU0NWYKLSNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk3MDY0N2YKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMTM1NDVmKQorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MDY0N2YpCiAjZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk3MjU5NmYKICNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDEyNDU4ZgogI2RlZmluZSBCUEZfRnMxMjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMTI0NThmCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAtMS45NzMxNDhmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDEyNDU4ZikKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45NzMxNDhmKQogI2RlZmluZSBCUEZfRnMxMjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45NzQ3OTVmCiAjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwOTM3M2YKICNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDA5MzczZgotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTgwMTA4ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwOTM3M2YpCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTgwMTA4ZikKICNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTgxMDM3ZgogI2RlZmluZSBCUEZfRnMyMjA1MF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDY4MTlmCiAjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwNjgxOWYKLSNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk4NTcxNGYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDY4MTlmKQorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk4NTcxNGYpCiAjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk4NjIwNGYKICNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA2MjY4ZgogI2RlZmluZSBCUEZfRnMyNDAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDYyNjhmCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAtMS45ODY5MDRmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDA2MjY4ZikKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45ODY5MDRmKQogI2RlZmluZSBCUEZfRnMyNDAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45ODczMThmCiAjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwNDcwOWYKICNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDA0NzA5ZgotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTkwMjQwZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwNDcwOWYpCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTkwMjQwZikKICNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTkwNDczZgogI2RlZmluZSBCUEZfRnM0NDEwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDM0MjFmCiAjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgIC0wLjAwMzQyMWYKLSNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgIC0xLjk5Mjk1NWYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDM0MjFmKQorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5Mjk1NWYpCiAjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5MzA3OGYKICNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAzMTQ0ZgogI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAtMC4wMDMxNDRmCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAtMS45OTM1MzVmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAzMTQ0ZikKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTM1MzVmKQogI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTM2MzlmCiAKICNpZmRlZiBISUdIRVJfRlMKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAxNTU1ZgogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgIC0wLjAwMTU1NTVmCi0jZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgIC0xLjk5Njg2MGYKKyNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAwMTU1NTVmKQorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAoLTEuOTk2ODYwZikKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk2ODkxZgogCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAwLjAwMDc3OGYKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAtMC4wMDA3NzhmCi0jZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgIC0xLjk5ODQzN2YKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgKC0wLjAwMDc3OGYpCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICgtMS45OTg0MzdmKQogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgMC45OTg0NDRmCiAjZW5kaWYKIAogLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDkwSHogKi8KICNkZWZpbmUgQlBGX0ZzODAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjAyMjc2MGYKICNkZWZpbmUgQlBGX0ZzODAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzODAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAtMC4wMjI3NjBmCi0jZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTEuOTQ5MDczZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICgtMC4wMjI3NjBmKQorI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NDkwNzNmKQogI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTUzOTUzZgogI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDE2NjE5ZgogI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAxNjYxOWYKLSNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45NjM3OTFmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAxNjYxOWYpCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2Mzc5MWYpCiAjZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NjYzNzdmCiAjZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMTUyODlmCiAjZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDE1Mjg5ZgotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk2Njg4MmYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDE1Mjg5ZikKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY2ODgyZikKICNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk2OTA2N2YKICNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAxMTUxMWYKICNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMTE1MTFmCi0jZGVmaW5lIEJQRl9GczE2MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTc1NDc3ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMTE1MTFmKQorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45NzU0NzdmKQogI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTc2NzExZgogI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDA4Mzc5ZgogI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwODM3OWYKLSNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45ODIzOTVmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwODM3OWYpCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk4MjM5NWYpCiAjZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45ODMwNDdmCiAjZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDc3MDRmCiAjZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDA3NzA0ZgotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk4Mzg2M2YKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDA3NzA0ZikKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTgzODYzZikKICNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NDQxNGYKICNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwNTc4OWYKICNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wMDU3ODlmCi0jZGVmaW5lIEJQRl9GczMyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuOTg3OTc3ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDU3ODlmKQorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45ODc5NzdmKQogI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTg4Mjg4ZgogI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDA0MjA3ZgogI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAwNDIwN2YKLSNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS45OTEzMjRmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwNDIwN2YpCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MTMyNGYpCiAjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTE0ODhmCiAjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDM4NjdmCiAjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMDAzODY3ZgotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjk5MjAzOGYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAzODY3ZikKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkyMDM4ZikKICNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5MjE3N2YKIAogI2lmZGVmIEhJR0hFUl9GUwogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAxOTEzZgogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDAxOTEzZgotI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgLTEuOTk2MTM0ZgorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMTkxM2YpCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTk2MTM0ZikKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NjE3NGYKIAogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAwOTU4ZgogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgLTAuMDAwOTU4ZgotI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgLTEuOTk4MDc1ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDk1OGYpCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAoLTEuOTk4MDc1ZikKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5ODA4NWYKICNlbmRpZgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmgKaW5kZXggMzUzNTYwYy4uOGMwNDg0NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db2VmZnMuaApAQCAtNjksNTUgKzY5LDU1IEBACiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zOTAxNzcKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDIwMTQ0CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4wMjAxNDQpCiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40NzYyMTkKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTA2MTg3CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4xMDYxODcpCiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS41NzI3NjEKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjAyNzI4CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMDI3MjgpCiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjgxMDgyCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjMxMTA0OQorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMzExMDQ5KQogI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMwogI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjgwMjYyMAotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC40MzI1ODgKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjQzMjU4OCkKICNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKICNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS45Mzg5ODkKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTY4OTU2CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41Njg5NTYpCiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDkxOTk3Ci0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjcyMTk2NAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzIxOTY0KQogI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMwogI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjI2MzY3NAotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC44OTM2NDEKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjg5MzY0MSkKICNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKICNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi40NTYzMDAKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMDg2MjY3CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4wODYyNjcpCiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCkBAIC0xNDgsMzQyICsxNDgsMzQyIEBACiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yODQ4NzAKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDE2OTIxCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4wMTY5MjEpCiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNi4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjM2NDI5MQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjA5NjM0MgorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4wOTYzNDIpCiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40NTM0MDMKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTg1NDU0CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4xODU0NTQpCiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS41NTMzODkKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjg1NDQwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yODU0NDApCiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS42NjU1NzQKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMzk3NjI1CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4zOTc2MjUpCiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNzkxNDQ5Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjUyMzQ5OQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTIzNDk5KQogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjkzMjY4MgotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42NjQ3MzMKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjY2NDczMykKICNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKICNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wOTExNDgKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuODIzMTk5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC44MjMxOTkpCiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMjY4OTUwCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjAwMTAwMQorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMDAxMDAxKQogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjQ2ODQ0NwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4yMDA0OTgKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjIwMDQ5OCkKICNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKICNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi42OTIyODcKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuNDI0MzM4CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS40MjQzMzgpCiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5CiAjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDMyMDAwSHogKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA2MTAwOQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wNjEwMDkKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjA2MTAwOSkKICNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDAwMDApCiAjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTI5NDYzCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4xMjk0NjMKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4xMjk0NjMpCiAjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQogI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMDYyNjcKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIwNjI2NworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIwNjI2NykKICNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDAwMDApCiAjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjkyNDQ3Ci0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI5MjQ0NworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjkyNDQ3KQogI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDAwMCkKICNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjM4OTE0MAotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4zODkxNDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjM4OTE0MCkKICNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDAwMDApCiAjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNi4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDk3NjMxCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC40OTc2MzEKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC40OTc2MzEpCiAjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQogI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS42MTkzNjEKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjYxOTM2MQorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjYxOTM2MSkKICNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDAwMDApCiAjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc1NTk0MwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzU1OTQzCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzU1OTQzKQogI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDAwMCkKICNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTA5MTkxCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC45MDkxOTEKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC45MDkxOTEpCiAjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQogI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDgxMTM5Ci0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4wODExMzkKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4wODExMzkpCiAjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQogI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4yNzQwNjcKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMjc0MDY3CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4yNzQwNjcpCiAjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQogI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNDkwNTM2Ci0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuNDkwNTM2CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjQ5MDUzNikKICNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDAwMDApCiAjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMy4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi43MzM0MTgKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuNzMzNDE4CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS43MzM0MTgpCiAjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQogI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjAwNTkzNgotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMi4wMDU5MzYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjAwNTkzNikKICNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDAwMDApCiAjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy4zMTE3MDcKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMi4zMTE3MDcKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuMzExNzA3KQogI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDAwMCkKICNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA0NDEwMEh6ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wNzQzNjQKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjkzMjU3CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yOTMyNTcpCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjE4ODk0KQogI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTU3ODAxCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjM3NjY5NQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMzc2Njk1KQogI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxODg5NCkKICNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjUxNDIwCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNDcwMzEzCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjQ3MDMxMykKICNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMTg4OTQpCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA0LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjM1NjQ2MQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzUzNTUKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU3NTM1NSkKICNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMTg4OTQpCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40NzQzMjAKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNjkzMjEzCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC42OTMyMTMpCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjE4ODk0KQogI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS42MDY1NTkKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC44MjU0NTMKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuODI1NDUzKQogI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxODg5NCkKICNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS43NTQ5MzUKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC45NzM4MjgKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuOTczODI4KQogI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxODg5NCkKICNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTIxNDE0Ci0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjE0MDMwOAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMTQwMzA4KQogI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxODg5NCkKICNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjEwODIwOAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4zMjcxMDEKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjMyNzEwMSkKICNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMTg4OTQpCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi4zMTc3OTMKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMS41MzY2ODcKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNTM2Njg3KQogI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxODg5NCkKICNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNTUyOTUyCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuNzcxODQ2CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjc3MTg0NikKICNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxODg5NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMTg4OTQpCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjgxNjgwNQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjAzNTY5OAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4wMzU2OTgpCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjE4ODk0KQogI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMTEyODUyCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjMzMTc0NgorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuMzMxNzQ2KQogI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxODg5NCkKICNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjQ0NTAyMwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjY2MzkxNgorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi42NjM5MTYpCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMTg4OTQKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjE4ODk0KQogI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy44MTc3MjQKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMy4wMzY2MTgKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTMuMDM2NjE4KQogI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjE4ODk0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxODg5NCkKICNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA0ODAwMEh6ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDc3MzU3Ci0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4zNDUzMDYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4zNDUzMDYpCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjY3OTQ5KQogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xNjQxNTIKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjQzMjEwMQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjQzMjEwMSkKICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yNjc5NDkpCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjI2MTUzOAotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTI5NDg4CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTI5NDg4KQogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI2Nzk0OSkKICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjM3MDgwNwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjYzODc1NworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC42Mzg3NTcpCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjY3OTQ5KQogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQ5MzQwOQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2MTM1OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjEzNTkpCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjY3OTQ5KQogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNi4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS42MzA5NzEKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuODk4OTIwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC44OTg5MjApCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjY3OTQ5KQogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNzg1MzE4Ci0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjA1MzI2NworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMDUzMjY3KQogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI2Nzk0OSkKICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTU4NDk4Ci0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMjI2NDQ3CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjIyNjQ0NykKICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yNjc5NDkpCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi4xNTI4MDkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjQyMDc1OAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjQyMDc1OCkKICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yNjc5NDkpCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgMi4zNzA4MjkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjYzODc3OAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjYzODc3OCkKICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yNjc5NDkpCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNjE1NDUyCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuODgzNDAxCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjg4MzQwMSkKICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yNjc5NDkpCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjg4OTkyNAotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjE1Nzg3MworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4xNTc4NzMpCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjY3OTQ5KQogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMTk3ODg2Ci0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjQ2NTgzNQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuNDY1ODM1KQogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI2Nzk0OSkKICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjU0MzQyNQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0yLjgxMTM3NAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi44MTEzNzQpCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjY3OTQ5KQogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAzLjkzMTEyNwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgLTMuMTk5MDc2CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTMuMTk5MDc2KQogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2Nzk0OQorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI2Nzk0OSkKICNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAKICNpZmRlZiBISUdIRVJfRlMKQEAgLTQ5MSwxODUgKzQ5MSwxODUgQEAKIC8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgOTYwMDBIeiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA5NjIzMwotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNjczNTgzCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNjczNTgzKQogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NzM1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU3NzM1MCkKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjA0MjA4Ci0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43ODE1NTgKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43ODE1NTgpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTc3MzUwKQogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zMjUzNTgKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjkwMjcwOAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjkwMjcwOCkKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40NjEyOTEKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4wMzg2NDEKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMDM4NjQxKQogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU3NzM1MCkKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS42MTM4MTAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4xOTExNjAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMTkxMTYwKQogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU3NzM1MCkKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNzg0OTM5Ci0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjM2MjI4OQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMzYyMjg5KQogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU3NzM1MCkKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTc2OTQ5Ci0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjU1NDI5OQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNTU0Mjk5KQogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU3NzM1MCkKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMTkyMzg3Ci0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuNzY5NzM4CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjc2OTczOCkKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NzM1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjQzNDExMwotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuMDExNDY0CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuMDExNDY0KQogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NzM1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU3NzM1MCkKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAyLjcwNTMzNQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMi4yODI2ODUKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjI4MjY4NSkKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMDA5NjUwCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuNTg3MDAwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjU4NzAwMCkKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NzM1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy4zNTEwOTcKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMi45Mjg0NDcKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuOTI4NDQ3KQogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTc3MzUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU3NzM1MCkKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNzM0MjA3Ci0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zLjMxMTU1OAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTMuMzExNTU4KQogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU3NzM1MCkKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgIDQuMTY0MDY0Ci0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAtMy43NDE0MTQKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICgtMy43NDE0MTQpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC41NzczNTAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTc3MzUwKQogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICA0LjY0NjM3MQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgLTQuMjIzNzIxCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTQuMjIzNzIxKQogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjU3NzM1MAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU3NzM1MCkKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAKIC8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgMTkyMDAwSHogKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjEwNzgyMwotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjg3NTE1MAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC44NzUxNTApCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzY3MzI3KQogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMjg4MDMKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC45OTYxMzAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuOTk2MTMwKQogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc2NzMyNykKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4yX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMy4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4zX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjM2NDU0NAotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjEzMTg3MQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4xMzE4NzEpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzY3MzI3KQogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA0LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNTE2ODQ5Ci0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuMjg0MTc2CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjI4NDE3NikKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjY4NzczNwotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS40NTUwNjQKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjQ1NTA2NCkKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS44Nzk0NzcKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjY0NjgwNAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjY0NjgwNCkKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjA5NDYxMwotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEuODYxOTQwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuODYxOTQwKQogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc2NzMyNykKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjMzNTk5OQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMi4xMDMzMjYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjEwMzMyNikKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW44X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNjA2ODM5Ci0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTIuMzc0MTY2CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjM3NDE2NikKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDIuOTEwNzI2Ci0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMi42NzgwNTMKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICgtMi42NzgwNTMpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC43NjczMjcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzY3MzI3KQogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjI1MTY5MwotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMy4wMTkwMjAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0zLjAxOTAyMCkKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjYzNDI2NAotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMy40MDE1OTEKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0zLjQwMTU5MSkKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMy4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuMDYzNTE2Ci0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMy44MzA4NDMKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMy44MzA4NDMpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzY3MzI3KQogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICA0LjU0NTE0NQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtNC4zMTI0NzIKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC00LjMxMjQ3MikKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzY3MzI3CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgIDUuMDg1NTQyCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgLTQuODUyODY4CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgKC00Ljg1Mjg2OCkKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UeXBlcy5oCmluZGV4IGNiMTViNjAuLmVhMTYwNzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UeXBlcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UeXBlcy5oCkBAIC00NCw5ICs0NCw2IEBACiAKICNkZWZpbmUgTFZNX01BWElOVF84ICAgICAgICAgICAgMTI3ICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIHBvc2l0aXZlIGludGVnZXIgc2l6ZSAqLwogI2RlZmluZSBMVk1fTUFYSU5UXzE2ICAgICAgICAgICAzMjc2NwotI2lmZGVmIEJVSUxEX0ZMT0FUCi0jZGVmaW5lIExWTV9NQVhGTE9BVCAgICAgICAgICAgIDEuMGYKLSNlbmRpZgogI2RlZmluZSBMVk1fTUFYSU5UXzMyICAgICAgICAgICAyMTQ3NDgzNjQ3CiAjZGVmaW5lIExWTV9NQVhFTlVNICAgICAgICAgICAgIDIxNDc0ODM2NDcKIApAQCAtOTksOCArOTYsMzIgQEAKIHR5cGVkZWYgICAgIHVpbnQzMl90ICAgICAgICAgICAgTFZNX1VJTlQzMjsgICAgICAgICAvKiBVbnNpZ25lZCAzMi1iaXQgd29yZCAqLwogCiAjaWZkZWYgQlVJTERfRkxPQVQKLXR5cGVkZWYgICAgIGZsb2F0ICAgICAgICAgICAgICAgTFZNX0ZMT0FUOyAgICAgICAgICAvKiBzaW5nbGUgcHJlY2lzc2lvbiBmbG9hdGluZyBwb2ludCovCi0jZW5kaWYKKworI2RlZmluZSBMVk1fTUFYRkxPQVQgICAgICAgICAgICAxLmYKKwordHlwZWRlZiAgICAgZmxvYXQgICAgICAgICAgICAgICBMVk1fRkxPQVQ7ICAgICAgICAgIC8qIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgKi8KKworLy8gSWYgTkFUSVZFX0ZMT0FUX0JVRkZFUiBpcyBkZWZpbmVkLCB3ZSBleHBvc2UgZWZmZWN0cyBhcyBmbG9hdGluZyBwb2ludCBmb3JtYXQ7CisvLyBvdGhlcndpc2Ugd2UgZXhwb3NlIGFzIGludGVnZXIgMTYgYml0IGFuZCB0cmFuc2xhdGUgdG8gZmxvYXQgZm9yIHRoZSBlZmZlY3QgbGlicmFyaWVzLgorLy8gSGVuY2UsIE5BVElWRV9GTE9BVF9CVUZGRVIgc2hvdWxkIG9ubHkgYmUgZW5hYmxlZCB1bmRlciBCVUlMRF9GTE9BVCBjb21waWxhdGlvbi4KKworI2RlZmluZSBOQVRJVkVfRkxPQVRfQlVGRkVSCisKKyNlbmRpZiAvLyBCVUlMRF9GTE9BVAorCisvLyBTZWxlY3Qgd2hldGhlciB3ZSBleHBvc2UgaW50MTZfdCBvciBmbG9hdCBidWZmZXJzLgorI2lmZGVmIE5BVElWRV9GTE9BVF9CVUZGRVIKKworI2RlZmluZSAgICBFRkZFQ1RfQlVGRkVSX0ZPUk1BVCBBVURJT19GT1JNQVRfUENNX0ZMT0FUCit0eXBlZGVmICAgICBmbG9hdCAgICAgICAgICAgICAgIGVmZmVjdF9idWZmZXJfdDsKKworI2Vsc2UgLy8gTkFUSVZFX0ZMT0FUX0JVRkZFUgorCisjZGVmaW5lICAgIEVGRkVDVF9CVUZGRVJfRk9STUFUIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCit0eXBlZGVmICAgICBpbnQxNl90ICAgICAgICAgICAgIGVmZmVjdF9idWZmZXJfdDsKKworI2VuZGlmIC8vIE5BVElWRV9GTE9BVF9CVUZGRVIKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBTdGFuZGFyZCBFbnVtZXJhdGVkIHR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaAppbmRleCBmMGRlYjZjLi40MmVhNDZmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaApAQCAtMjYsMjEgKzI2LDIxIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZmRlZiBCVUlMRF9GTE9BVAotI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuODIyMTcyZgotI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuODAwNDc0ZgotI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxM19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzc2MTI4ZgotI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxMl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzQ4ODExZgotI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxMV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNzE4MTYyZgotI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxMF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNjgzNzcyZgotI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc5X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNjQ1MTg3ZgotI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc4X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNjAxODkzZgotI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc3X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNTUzMzE2ZgotI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc2X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNDk4ODEzZgotI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNDM3NjU5ZgotI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMzY5MDQzZgotI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWczX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjkyMDU0ZgotI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjA1NjcyZgotI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTA4NzQ5ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjgyMjE3MmYpCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzE0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuODAwNDc0ZikKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NzYxMjhmKQorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxMl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0ODgxMWYpCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzExX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzE4MTYyZikKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTBfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC42ODM3NzJmKQorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc5X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjY0NTE4N2YpCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzhfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNjAxODkzZikKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnN19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NTMzMTZmKQorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc2X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjQ5ODgxM2YpCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNDM3NjU5ZikKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4zNjkwNDNmKQorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWczX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI5MjA1NGYpCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzJfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjA1NjcyZikKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4xMDg3NDlmKQogI2RlZmluZSBMVkVRTkJfR2Fpbl8wX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgogI2RlZmluZSBMVkVRTkJfR2Fpbl8xX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTIyMDE4ZgogI2RlZmluZSBMVkVRTkJfR2Fpbl8yX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjU4OTI1ZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29udHJvbC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29udHJvbC5jCmluZGV4IGMyOTBhZWMuLjdiMGYzNDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvbnRyb2wuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db250cm9sLmMKQEAgLTQzMCw3ICs0MzAsMTUgQEAKICAgICB9CiAKIAotICAgIGlmKGJDaGFuZ2UpeworICAgIC8vIER1cmluZyBvcGVyYXRpbmcgbW9kZSB0cmFuc2l0aW9uLCB0aGVyZSBpcyBhIHJhY2UgY29uZGl0aW9uIHdoZXJlIHRoZSBtb2RlCisgICAgLy8gaXMgc3RpbGwgTFZFUU5CX09OLCBidXQgdGhlIGVmZmVjdCBpcyBjb25zaWRlcmVkIGRpc2FibGVkIGluIHRoZSB1cHBlciBsYXllcnMuCisgICAgLy8gbW9kZUNoYW5nZSBoYW5kbGVzIHRoaXMgc3BlY2lhbCByYWNlIGNvbmRpdGlvbi4KKyAgICBjb25zdCBpbnQgLyogYm9vbCAqLyBtb2RlQ2hhbmdlID0gcFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBPcGVyYXRpbmdNb2RlU2F2ZQorICAgICAgICAgICAgfHwgKE9wZXJhdGluZ01vZGVTYXZlID09IExWRVFOQl9PTgorICAgICAgICAgICAgICAgICAgICAmJiBwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uCisgICAgICAgICAgICAgICAgICAgICYmIExWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pID09IDApOworCisgICAgaWYgKGJDaGFuZ2UgfHwgbW9kZUNoYW5nZSkgewogCiAgICAgICAgIC8qCiAgICAgICAgICAqIElmIHRoZSBzYW1wbGUgcmF0ZSBoYXMgY2hhbmdlZCBjbGVhciB0aGUgaGlzdG9yeQpAQCAtNDYyLDggKzQ3MCw3IEBACiAgICAgICAgICAgICBMVkVRTkJfU2V0Q29lZmZpY2llbnRzKHBJbnN0YW5jZSk7ICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLwogICAgICAgICB9CiAKLSAgICAgICAgaWYocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBPcGVyYXRpbmdNb2RlU2F2ZSkKLSAgICAgICAgeworICAgICAgICBpZiAobW9kZUNoYW5nZSkgewogICAgICAgICAgICAgaWYocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSA9PSBMVkVRTkJfT04pCiAgICAgICAgICAgICB7CiAjaWZkZWYgQlVJTERfRkxPQVQKQEAgLTQ3OSw2ICs0ODYsOCBAQAogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8qIFN0YXkgb24gdGhlIE9OIG9wZXJhdGluZyBtb2RlIHVudGlsIHRoZSB0cmFuc2l0aW9uIGlzIGRvbmUgKi8KKyAgICAgICAgICAgICAgICAvLyBUaGlzIG1heSBpbnRyb2R1Y2UgYSBzdGF0ZSByYWNlIGNvbmRpdGlvbiBpZiB0aGUgZWZmZWN0IGlzIGVuYWJsZWQgYWdhaW4KKyAgICAgICAgICAgICAgICAvLyB3aGlsZSBpbiB0cmFuc2l0aW9uLiAgVGhpcyBpcyBmaXhlZCBpbiB0aGUgbW9kZUNoYW5nZSBsb2dpYy4KICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZFUU5CX09OOwogI2lmZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwgMC4wZik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSGVhZHBob25lX0NvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaAppbmRleCA0ZjUyMjFhLi4wYzJmZTUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSGVhZHBob25lX0NvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgKQEAgLTI3LDEyNyArMjcsMTI3IEBACiAjaWZkZWYgQlVJTERfRkxPQVQKIC8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDgwMDAgSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYxMjU4ICovCiAjZGVmaW5lIENTX01JRERMRV84MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMjc3MjAKLSNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjIxNTEyNQorI2RlZmluZSBDU19NSURETEVfODAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxNTEyNSkKICNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuOTIxODk5CisjZGVmaW5lIENTX01JRERMRV84MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuOTIxODk5KQogI2RlZmluZSBDU19NSURETEVfODAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIENTX01JRERMRV84MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKICNkZWZpbmUgQ1NfU0lERV84MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjYxMTQ0MQotI2RlZmluZSBDU19TSURFXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMzgwMzQ0Ci0jZGVmaW5lIENTX1NJREVfODAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yMzEwOTcKLSNkZWZpbmUgQ1NfU0lERV84MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjYyMjQ3MAotI2RlZmluZSBDU19TSURFXzgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTMwNzU5CisjZGVmaW5lIENTX1NJREVfODAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMzgwMzQ0KQorI2RlZmluZSBDU19TSURFXzgwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIzMTA5NykKKyNkZWZpbmUgQ1NfU0lERV84MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC42MjI0NzApCisjZGVmaW5lIENTX1NJREVfODAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMTMwNzU5KQogI2RlZmluZSBDU19TSURFXzgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgMTUKIAogLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMTEwMjVIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjI5NDMgKi8KICNkZWZpbmUgQ1NfTUlERExFXzExMDI1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjIzMDgzOAotI2RlZmluZSBDU19NSURETEVfMTEwMjVfQTEgICAgICAgICAgICAgICAgICAgICAgLTAuMjIxNTU5CisjZGVmaW5lIENTX01JRERMRV8xMTAyNV9BMSAgICAgICAgICAgICAgICAgICAgICAoLTAuMjIxNTU5KQogI2RlZmluZSBDU19NSURETEVfMTEwMjVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX01JRERMRV8xMTAyNV9CMSAgICAgICAgICAgICAgICAgICAgICAtMC45NDMwNTYKKyNkZWZpbmUgQ1NfTUlERExFXzExMDI1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMC45NDMwNTYpCiAjZGVmaW5lIENTX01JRERMRV8xMTAyNV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICNkZWZpbmUgQ1NfTUlERExFXzExMDI1X1NDQUxFICAgICAgICAgICAgICAgICAgICAxNQogI2RlZmluZSBDU19TSURFXzExMDI1X0EwICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTU3MzcyCi0jZGVmaW5lIENTX1NJREVfMTEwMjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMC4zOTE0OTAKLSNkZWZpbmUgQ1NfU0lERV8xMTAyNV9BMiAgICAgICAgICAgICAgICAgICAgICAgIC0wLjE2NTg4MQotI2RlZmluZSBDU19TSURFXzExMDI1X0IxICAgICAgICAgICAgICAgICAgICAgICAgLTAuODgwNjA4CisjZGVmaW5lIENTX1NJREVfMTEwMjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMzkxNDkwKQorI2RlZmluZSBDU19TSURFXzExMDI1X0EyICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjE2NTg4MSkKKyNkZWZpbmUgQ1NfU0lERV8xMTAyNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICgtMC44ODA2MDgpCiAjZGVmaW5lIENTX1NJREVfMTEwMjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMzIzOTcKICNkZWZpbmUgQ1NfU0lERV8xMTAyNV9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAxNQogCiAvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAxMjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MjE5MSAqLwogI2RlZmluZSBDU19NSURETEVfMTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAwLjIyOTkzMgotI2RlZmluZSBDU19NSURETEVfMTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgIC0wLjIyMTQzNgorI2RlZmluZSBDU19NSURETEVfMTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMjE0MzYpCiAjZGVmaW5lIENTX01JRERMRV8xMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX01JRERMRV8xMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTAuOTQ3NjE2CisjZGVmaW5lIENTX01JRERMRV8xMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0wLjk0NzYxNikKICNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKICNkZWZpbmUgQ1NfU0lERV8xMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAwLjU1ODM5OAotI2RlZmluZSBDU19TSURFXzEyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgLTAuMzkyMjExCi0jZGVmaW5lIENTX1NJREVfMTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAtMC4xNjYxODcKLSNkZWZpbmUgQ1NfU0lERV8xMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0wLjg5MjU1MAorI2RlZmluZSBDU19TSURFXzEyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjM5MjIxMSkKKyNkZWZpbmUgQ1NfU0lERV8xMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICgtMC4xNjYxODcpCisjZGVmaW5lIENTX1NJREVfMTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAoLTAuODkyNTUwKQogI2RlZmluZSBDU19TSURFXzEyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDMyODU2CiAjZGVmaW5lIENTX1NJREVfMTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE1CiAKIC8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDE2MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYyMzcxICovCiAjZGVmaW5lIENTX01JRERMRV8xNjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4yMzA2MzgKLSNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgIC0wLjIyNDIzMgorI2RlZmluZSBDU19NSURETEVfMTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgKC0wLjIyNDIzMikKICNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfMTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgLTAuOTYwNTUwCisjZGVmaW5lIENTX01JRERMRV8xNjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTAuOTYwNTUwKQogI2RlZmluZSBDU19NSURETEVfMTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIENTX01JRERMRV8xNjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CiAjZGVmaW5lIENTX1NJREVfMTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgMC40OTk2OTUKLSNkZWZpbmUgQ1NfU0lERV8xNjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgIC0wLjM1NTU0MwotI2RlZmluZSBDU19TSURFXzE2MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTQ0MTUyCi0jZGVmaW5lIENTX1NJREVfMTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAtMS4wNTA3ODgKKyNkZWZpbmUgQ1NfU0lERV8xNjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICgtMC4zNTU1NDMpCisjZGVmaW5lIENTX1NJREVfMTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMTQ0MTUyKQorI2RlZmluZSBDU19TSURFXzE2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjA1MDc4OCkKICNkZWZpbmUgQ1NfU0lERV8xNjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjE0NDEwNAogI2RlZmluZSBDU19TSURFXzE2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNAogCiAvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAyMjA1MEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MDc4MSAqLwogI2RlZmluZSBDU19NSURETEVfMjIwNTBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMjI4NzQ5Ci0jZGVmaW5lIENTX01JRERMRV8yMjA1MF9BMSAgICAgICAgICAgICAgICAgICAgICAtMC4yMjQxMjgKKyNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX0ExICAgICAgICAgICAgICAgICAgICAgICgtMC4yMjQxMjgpCiAjZGVmaW5lIENTX01JRERMRV8yMjA1MF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX0IxICAgICAgICAgICAgICAgICAgICAgIC0wLjk3MTI2MgorI2RlZmluZSBDU19NSURETEVfMjIwNTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0wLjk3MTI2MikKICNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogI2RlZmluZSBDU19NSURETEVfMjIwNTBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQogI2RlZmluZSBDU19TSURFXzIyMDUwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAwLjQ0MDExMgotI2RlZmluZSBDU19TSURFXzIyMDUwX0ExICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI2MTA5NgotI2RlZmluZSBDU19TSURFXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjE3OTAxNgotI2RlZmluZSBDU19TSURFXzIyMDUwX0IxICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjExNjc4NgorI2RlZmluZSBDU19TSURFXzIyMDUwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yNjEwOTYpCisjZGVmaW5lIENTX1NJREVfMjIwNTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjE3OTAxNikKKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMTE2Nzg2KQogI2RlZmluZSBDU19TSURFXzIyMDUwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE4MjUwNwogI2RlZmluZSBDU19TSURFXzIyMDUwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNAogCiAvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAyNDAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MTg4MiAqLwogI2RlZmluZSBDU19NSURETEVfMjQwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMzAzOTUKLSNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjI2MTE3CisjZGVmaW5lIENTX01JRERMRV8yNDAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMjYxMTcpCiAjZGVmaW5lIENTX01JRERMRV8yNDAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfMjQwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAtMC45NzM1NzMKKyNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjk3MzU3MykKICNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIENTX01JRERMRV8yNDAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CiAjZGVmaW5lIENTX1NJREVfMjQwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjQxNDc3MAotI2RlZmluZSBDU19TSURFXzI0MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yODcxODIKLSNkZWZpbmUgQ1NfU0lERV8yNDAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTI3NTg4Ci0jZGVmaW5lIENTX1NJREVfMjQwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjIyOTY0OAorI2RlZmluZSBDU19TSURFXzI0MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjg3MTgyKQorI2RlZmluZSBDU19TSURFXzI0MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMTI3NTg4KQorI2RlZmluZSBDU19TSURFXzI0MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMjI5NjQ4KQogI2RlZmluZSBDU19TSURFXzI0MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yODIxNzcKICNkZWZpbmUgQ1NfU0lERV8yNDAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKIAogLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMzIwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjAzMjIgKi8KICNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAwLjIyODQwMAotI2RlZmluZSBDU19NSURETEVfMzIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjI1MjE0CisjZGVmaW5lIENTX01JRERMRV8zMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjI1MjE0KQogI2RlZmluZSBDU19NSURETEVfMzIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX01JRERMRV8zMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC45ODAxMjYKKyNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICgtMC45ODAxMjYpCiAjZGVmaW5lIENTX01JRERMRV8zMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKICNkZWZpbmUgQ1NfU0lERV8zMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM2NDU3OQotI2RlZmluZSBDU19TSURFXzMyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjA3MzU1Ci0jZGVmaW5lIENTX1NJREVfMzIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4xNTcyMjQKLSNkZWZpbmUgQ1NfU0lERV8zMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjI3NDIzMQorI2RlZmluZSBDU19TSURFXzMyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIwNzM1NSkKKyNkZWZpbmUgQ1NfU0lERV8zMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4xNTcyMjQpCisjZGVmaW5lIENTX1NJREVfMzIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMjc0MjMxKQogI2RlZmluZSBDU19TSURFXzMyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzEyNDk1CiAjZGVmaW5lIENTX1NJREVfMzIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CiAKIC8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDQ0MTAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYzODM0ICovCiAjZGVmaW5lIENTX01JRERMRV80NDEwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjMzNTkzCi0jZGVmaW5lIENTX01JRERMRV80NDEwMF9BMSAgICAgICAgICAgICAgICAgICAgLTAuMjMxMjI1CisjZGVmaW5lIENTX01JRERMRV80NDEwMF9BMSAgICAgICAgICAgICAgICAgICAgKC0wLjIzMTIyNSkKICNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0IxICAgICAgICAgICAgICAgICAgICAtMC45ODU1NDUKKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0IxICAgICAgICAgICAgICAgICAgICAoLTAuOTg1NTQ1KQogI2RlZmluZSBDU19NSURETEVfNDQxMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogI2RlZmluZSBDU19NSURETEVfNDQxMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQogI2RlZmluZSBDU19TSURFXzQ0MTAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjI4NDU3MwotI2RlZmluZSBDU19TSURFXzQ0MTAwX0ExICAgICAgICAgICAgICAgICAgICAgIC0wLjI1ODkxMAotI2RlZmluZSBDU19TSURFXzQ0MTAwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjAyNTY2MgotI2RlZmluZSBDU19TSURFXzQ0MTAwX0IxICAgICAgICAgICAgICAgICAgICAgIC0xLjU3MjI0OAorI2RlZmluZSBDU19TSURFXzQ0MTAwX0ExICAgICAgICAgICAgICAgICAgICAgICgtMC4yNTg5MTApCisjZGVmaW5lIENTX1NJREVfNDQxMDBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAyNTY2MikKKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuNTcyMjQ4KQogI2RlZmluZSBDU19TSURFXzQ0MTAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjU4ODM5OQogI2RlZmluZSBDU19TSURFXzQ0MTAwX1NDQUxFICAgICAgICAgICAgICAgICAgMTQKIAogLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgNDgwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjQ0MDIgKi8KICNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yMzQ0NDUKLSNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAgICAtMC4yMzIyNjEKKyNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAgICAoLTAuMjMyMjYxKQogI2RlZmluZSBDU19NSURETEVfNDgwMDBfQTIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfNDgwMDBfQjEgICAgICAgICAgICAgICAgICAgIC0wLjk4NjcxMworI2RlZmluZSBDU19NSURETEVfNDgwMDBfQjEgICAgICAgICAgICAgICAgICAgICgtMC45ODY3MTMpCiAjZGVmaW5lIENTX01JRERMRV80ODAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIENTX01JRERMRV80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CiAjZGVmaW5lIENTX1NJREVfNDgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjI3MjYwNgotI2RlZmluZSBDU19TSURFXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAgICAtMC4yNjY5NTIKLSNkZWZpbmUgQ1NfU0lERV80ODAwMF9BMiAgICAgICAgICAgICAgICAgICAgLTAuMDA1NjU0Ci0jZGVmaW5lIENTX1NJREVfNDgwMDBfQjEgICAgICAgICAgICAgICAgICAgIC0xLjYxNzE0MQorI2RlZmluZSBDU19TSURFXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAgICAoLTAuMjY2OTUyKQorI2RlZmluZSBDU19TSURFXzQ4MDAwX0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDA1NjU0KQorI2RlZmluZSBDU19TSURFXzQ4MDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTEuNjE3MTQxKQogI2RlZmluZSBDU19TSURFXzQ4MDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC42MzA0MDUKICNkZWZpbmUgQ1NfU0lERV80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKIApAQCAtMTU1LDMxICsxNTUsMzEgQEAKIC8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDk2MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoICAwLjE2NSovCiAvKiBoaWdoIHBhc3MgZmlsdGVyIHdpdGggY3V0b2ZmIGZyZXF1ZW5jeSAxMDIuMTggSHoqLwogI2RlZmluZSBDU19NSURETEVfOTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjIzNTUzMgotI2RlZmluZSBDU19NSURETEVfOTYwMDBfQTEgICAgICAgICAgICAgICAgICAgIC0wLjIzNDQzMgorI2RlZmluZSBDU19NSURETEVfOTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICgtMC4yMzQ0MzIpCiAjZGVmaW5lIENTX01JRERMRV85NjAwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX01JRERMRV85NjAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTAuOTkzMzM0CisjZGVmaW5lIENTX01JRERMRV85NjAwMF9CMSAgICAgICAgICAgICAgICAgICAgKC0wLjk5MzMzNCkKICNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKIC8qIGJhbmRwYXNzIGZpbHRlciB3aXRoIGZjMSAyNzAgYW5kIGZjMiAzNzAzLCBkZXNpZ25lZCB1c2luZyAybmQgb3JkZXIgYnV0dGVyd29ydGggKi8KICNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDE2NzI3CiAjZGVmaW5lIENTX1NJREVfOTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19TSURFXzk2MDAwX0EyICAgICAgICAgICAgICAgICAgICAtMC4wMTY3MjcKLSNkZWZpbmUgQ1NfU0lERV85NjAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTEuNzkzMzcyCisjZGVmaW5lIENTX1NJREVfOTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICgtMC4wMTY3MjcpCisjZGVmaW5lIENTX1NJREVfOTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICgtMS43OTMzNzIpCiAjZGVmaW5lIENTX1NJREVfOTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjc5NzIzNgogI2RlZmluZSBDU19TSURFXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKIAogLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMTkyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoICAwLjE2ODkqLwogI2RlZmluZSBDU19NSURETEVfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yNDEyMTkKLSNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTAuMjQwNjU2CisjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICgtMC4yNDA2NTYpCiAjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAgICAtMC45OTY2NjEKKyNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9CMSAgICAgICAgICAgICAgICAgICAgKC0wLjk5NjY2MSkKICNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQogLyogYmFuZHBhc3MgZmlsdGVyIHdpdGggZmMxIDI3MCBhbmQgZmMyIDM3MDMsIGRlc2lnbmVkIHVzaW5nIDJuZCBvcmRlciBidXR0ZXJ3b3J0aCAqLwogI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA4OTkxCi0jZGVmaW5lIENTX1NJREVfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMDAKLSNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTIgICAgICAgICAgICAgICAgICAgIC0wLjAwODk5MQotI2RlZmluZSBDU19TSURFXzE5MjAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTEuODkyNTA5CisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQorI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAwODk5MSkKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICgtMS44OTI1MDkpCiAjZGVmaW5lIENTX1NJREVfMTkyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC44OTM1MjQKICNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgIDE0CiAjZW5kaWYKQEAgLTIwMyw3NCArMjAzLDc0IEBACiAKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDgwMDAgSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCiAjZGVmaW5lIENTX1JFVkVSQl84MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAwLjY2NzI3MQotI2RlZmluZSBDU19SRVZFUkJfODAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAtMC42NjcyNzEKKyNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjY2NzI3MSkKICNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX1JFVkVSQl84MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjY2ODE3OQorI2RlZmluZSBDU19SRVZFUkJfODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNjY4MTc5KQogI2RlZmluZSBDU19SRVZFUkJfODAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgMTUKIAogLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMTEwMjVIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KICNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0EwICAgICAgICAgICAgICAgICAgICAgMC42OTk2MzgKLSNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0ExICAgICAgICAgICAgICAgICAgICAtMC42OTk2MzgKKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0ExICAgICAgICAgICAgICAgICAgICAoLTAuNjk5NjM4KQogI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfQTIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfQjEgICAgICAgICAgICAgICAgICAgIC0wLjc0OTA5NgorI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfQjEgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTYpCiAjZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9TQ0FMRSAgICAgICAgICAgICAgICAgIDE1CiAKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDEyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCiAjZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9BMCAgICAgICAgICAgICAgICAgICAwLjcwNjkzMQotI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfQTEgICAgICAgICAgICAgICAgICAtMC43MDY5MzEKKyNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0ExICAgICAgICAgICAgICAgICAgKC0wLjcwNjkzMSkKICNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0EyICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9CMSAgICAgICAgICAgICAgICAgIC0wLjc2NzMyNworI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfQjEgICAgICAgICAgICAgICAgICAoLTAuNzY3MzI3KQogI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfQjIgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX1NDQUxFICAgICAgICAgICAgICAgIDE1CiAKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDE2MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCiAjZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjcyODI3MgotI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICAtMC43MjgyNzIKKyNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgKC0wLjcyODI3MikKICNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9CMSAgICAgICAgICAgICAgICAgICAgIC0wLjgyMDY3OQorI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICAoLTAuODIwNjc5KQogI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKICNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKIAogLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMjIwNTBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KICNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0EwICAgICAgICAgICAgICAgICAgICAgMC41MTYzOTYKICNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgICAtMC41MTYzOTYKLSNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0IxICAgICAgICAgICAgICAgICAgICAtMC41MTg1MTIKLSNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0IyICAgICAgICAgICAgICAgICAgICAtMC4yOTA5OTAKKyNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgICAoLTAuNTE2Mzk2KQorI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQjEgICAgICAgICAgICAgICAgICAgICgtMC41MTg1MTIpCisjZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9CMiAgICAgICAgICAgICAgICAgICAgKC0wLjI5MDk5MCkKICNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKIAogCiAvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAyNDAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLwogI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuNDc5NTY1CiAjZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0EyICAgICAgICAgICAgICAgICAgICAgIC0wLjQ3OTU2NQotI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgLTAuNjM3NzQ1Ci0jZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAtMC4xOTg5MTIKKyNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC40Nzk1NjUpCisjZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTAuNjM3NzQ1KQorI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgKC0wLjE5ODkxMikKICNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKIAogLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMzIwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KICNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMzgwMzQ5CiAjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAtMC4zODAzNDkKLSNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgLTAuOTUwODczCisjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4zODAzNDkpCisjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICgtMC45NTA4NzMpCiAjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjA0OTEyNwogI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQogCiAvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciA0NDEwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLwogI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yOTczODkKICNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX1JFVkVSQl80NDEwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI5NzM4OQotI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAtMS4yMDA0MjMKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI5NzM4OSkKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjIwMDQyMykKICNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjU2NTI5CiAjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE0CiAKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDQ4MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCiAjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4yNzg2NjEKICNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMjc4NjYxCi0jZGVmaW5lIENTX1JFVkVSQl80ODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAtMS4yNTQ5OTMKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4yNzg2NjEpCisjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuMjU0OTkzKQogI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuMzAzMzQ3CiAjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE0CiAKQEAgLTI3OSw4ICsyNzksOCBAQAogLyogQmFuZCBwYXNzIGZpbHRlciB3aXRoIGZjMT01MDAgYW5kIGZjMj04MDAwKi8KICNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjE2MDI0ODgKICNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgLTAuMTYwMjQ4OAotI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuNTg1NDEzCisjZGVmaW5lIENTX1JFVkVSQl85NjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMTYwMjQ4OCkKKyNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS41ODU0MTMpCiAjZGVmaW5lIENTX1JFVkVSQl85NjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC41OTkzNzcKICNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKIApAQCAtMjg4LDggKzI4OCw4IEBACiAvKiBCYW5kIHBhc3MgZmlsdGVyIHdpdGggZmMxPTUwMCBhbmQgZmMyPTgwMDAqLwogI2RlZmluZSBDU19SRVZFUkJfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjA4NzgzNjkKICNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAtMC4wODc4MzY5Ci0jZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgLTEuNzc2NTc2NAorI2RlZmluZSBDU19SRVZFUkJfMTkyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wODc4MzY5KQorI2RlZmluZSBDU19SRVZFUkJfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS43NzY1NzY0KQogI2RlZmluZSBDU19SRVZFUkJfMTkyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjc4MDQwNzYKICNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE0CiAKQEAgLTMxMiwxNjMgKzMxMiwxNjMgQEAKIC8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDgwMDAgSHogc2FtcGxlIHJhdGUsIFwKICAgIENTIHNjYWxlZCB3aXRoIDEuMDM4NDk3IGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzc1NDgwICovCiAjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMS4yNjMzMTIKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgIC0wLjYwMTc0OAotI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9BMiAgICAgICAgICAgICAgICAgICAgLTAuMjgwNjgxCi0jZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0IxICAgICAgICAgICAgICAgICAgICAtMC40NzU4NjUKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfQjIgICAgICAgICAgICAgICAgICAgIC0wLjQwODE1NAorI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9BMSAgICAgICAgICAgICAgICAgICAgKC0wLjYwMTc0OCkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfQTIgICAgICAgICAgICAgICAgICAgICgtMC4yODA2ODEpCisjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTAuNDc1ODY1KQorI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9CMiAgICAgICAgICAgICAgICAgICAgKC0wLjQwODE1NCkKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgMTQKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgMC45NDMzNTcKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9BMSAgICAgICAgICAgICAgICAgICAtMC40NDkzNDUKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9BMiAgICAgICAgICAgICAgICAgICAtMC4yMDk1OTQKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9CMSAgICAgICAgICAgICAgICAgICAtMC40NzU4NjUKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9CMiAgICAgICAgICAgICAgICAgICAtMC40MDgxNTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9BMSAgICAgICAgICAgICAgICAgICAoLTAuNDQ5MzQ1KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84MDAwX0EyICAgICAgICAgICAgICAgICAgICgtMC4yMDk1OTQpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQjEgICAgICAgICAgICAgICAgICAgKC0wLjQ3NTg2NSkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9CMiAgICAgICAgICAgICAgICAgICAoLTAuNDA4MTU0KQogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAxNQogCiAvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAxMTAyNUh6IHNhbXBsZSByYXRlLCBcCiAgICBDUyBzY2FsZWQgd2l0aCAxLjAyNzc2MSBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc2NzQ2MyAqLwogI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQTAgICAgICAgICAgICAgICAgICAgIDEuMTAxMTQ1CiAjZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9BMSAgICAgICAgICAgICAgICAgICAgMC4xMzkwMjAKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0EyICAgICAgICAgICAgICAgICAgIC0wLjg2NDQyMworI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQTIgICAgICAgICAgICAgICAgICAgKC0wLjg2NDQyMykKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0IxICAgICAgICAgICAgICAgICAgICAwLjAyNDU0MQotI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQjIgICAgICAgICAgICAgICAgICAgLTAuOTA4OTMwCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9CMiAgICAgICAgICAgICAgICAgICAoLTAuOTA4OTMwKQogI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMCAgICAgICAgICAgICAgICAgICAgMC45NzYwNTgKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQTEgICAgICAgICAgICAgICAgICAgLTAuNjk1MzI2Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X0EyICAgICAgICAgICAgICAgICAgIC0wLjA5MDgwOQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9CMSAgICAgICAgICAgICAgICAgICAtMC42MTA1OTQKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQjIgICAgICAgICAgICAgICAgICAgLTAuMzExMTQ5CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X0ExICAgICAgICAgICAgICAgICAgICgtMC42OTUzMjYpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X0EyICAgICAgICAgICAgICAgICAgICgtMC4wOTA4MDkpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X0IxICAgICAgICAgICAgICAgICAgICgtMC42MTA1OTQpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X0IyICAgICAgICAgICAgICAgICAgICgtMC4zMTExNDkpCiAjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X1NDQUxFICAgICAgICAgICAgICAgICAgIDE1CiAKIC8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDEyMDAwSHogc2FtcGxlIHJhdGUsIFwKICAgIENTIHNjYWxlZCB3aXRoIDEuMDMyNTIxIGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzcxMDE3ICovCiAjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAxLjI3NjY2MQotI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAtMS4wMTc1MTkKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgLTAuMDQ0MTI4Ci0jZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgIC0wLjcyOTYxNgotI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAtMC4yMDQ1MzIKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgKC0xLjAxNzUxOSkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjA0NDEyOCkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgKC0wLjcyOTYxNikKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgKC0wLjIwNDUzMikKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTQKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQTAgICAgICAgICAgICAgICAgIDEuMDA3MDk1Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX0ExICAgICAgICAgICAgICAgIC0wLjg3MTkxMgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9BMSAgICAgICAgICAgICAgICAoLTAuODcxOTEyKQogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9BMiAgICAgICAgICAgICAgICAgMC4wMjMyMzIKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQjEgICAgICAgICAgICAgICAgLTAuNzQ1ODU3Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX0IyICAgICAgICAgICAgICAgIC0wLjE4OTE3MQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9CMSAgICAgICAgICAgICAgICAoLTAuNzQ1ODU3KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9CMiAgICAgICAgICAgICAgICAoLTAuMTg5MTcxKQogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxNAogCiAvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAxNjAwMEh6IHNhbXBsZSByYXRlLCBcCiAgICBDUyBzY2FsZWQgd2l0aCAxLjAzMTM3OCBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc3MDE2NCAqLwogI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAxLjI4MTYyOQotI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQTEgICAgICAgICAgICAgICAgICAgIC0xLjA3NTg3MgotI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQTIgICAgICAgICAgICAgICAgICAgIC0wLjA0MTM2NQotI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQjEgICAgICAgICAgICAgICAgICAgIC0wLjcyNTIzOQotI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQjIgICAgICAgICAgICAgICAgICAgIC0wLjIyNDM1OAorI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICgtMS4wNzU4NzIpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjA0MTM2NSkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE2MDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTAuNzI1MjM5KQorI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICgtMC4yMjQzNTgpCiAjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0CiAjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0EwICAgICAgICAgICAgICAgICAgMS4wODEwOTEKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQTEgICAgICAgICAgICAgICAgIC0wLjg2NzE4MwotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9BMiAgICAgICAgICAgICAgICAgLTAuMDcwMjQ3Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0IxICAgICAgICAgICAgICAgICAtMC41MTUxMjEKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQjIgICAgICAgICAgICAgICAgIC0wLjQyNTg5MworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9BMSAgICAgICAgICAgICAgICAgKC0wLjg2NzE4MykKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQTIgICAgICAgICAgICAgICAgICgtMC4wNzAyNDcpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0IxICAgICAgICAgICAgICAgICAoLTAuNTE1MTIxKQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9CMiAgICAgICAgICAgICAgICAgKC0wLjQyNTg5MykKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTQKIAogLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMjIwNTBIeiBzYW1wbGUgcmF0ZSwgXAogICAgQ1Mgc2NhbGVkIHdpdGggMS4wNDE1NzYgYW5kIENTRVggc2NhbGVkIHdpdGggMC43Nzc3NzkgKi8KICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0EwICAgICAgICAgICAgICAgICAgIDEuMzg4NjA1Ci0jZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9BMSAgICAgICAgICAgICAgICAgIC0xLjMwNTc5OQorI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQTEgICAgICAgICAgICAgICAgICAoLTEuMzA1Nzk5KQogI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQTIgICAgICAgICAgICAgICAgICAgMC4wMzk5MjIKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0IxICAgICAgICAgICAgICAgICAgLTAuNzE5NDk0Ci0jZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9CMiAgICAgICAgICAgICAgICAgIC0wLjI0MzI0NQorI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQjEgICAgICAgICAgICAgICAgICAoLTAuNzE5NDk0KQorI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQjIgICAgICAgICAgICAgICAgICAoLTAuMjQzMjQ1KQogI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9BMCAgICAgICAgICAgICAgICAgICAxLjI3MjkxMAotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9BMSAgICAgICAgICAgICAgICAgIC0xLjM0MTAxNAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9BMSAgICAgICAgICAgICAgICAgICgtMS4zNDEwMTQpCiAjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgIDAuMTY3NDYyCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0IxICAgICAgICAgICAgICAgICAgLTAuNjE0MjE5Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0IyICAgICAgICAgICAgICAgICAgLTAuMzQ1Mzg0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0IxICAgICAgICAgICAgICAgICAgKC0wLjYxNDIxOSkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQjIgICAgICAgICAgICAgICAgICAoLTAuMzQ1Mzg0KQogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxNAogCiAvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAyNDAwMEh6IHNhbXBsZSByYXRlLCBcCiAgICBDUyBzY2FsZWQgd2l0aCAxLjAzNDQ5NSBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc3MjQ5MSAqLwogI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQTAgICAgICAgICAgICAgICAgICAgIDEuNDA5ODMyCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9BMSAgICAgICAgICAgICAgICAgICAtMS40NTY1MDYKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0ExICAgICAgICAgICAgICAgICAgICgtMS40NTY1MDYpCiAjZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9BMiAgICAgICAgICAgICAgICAgICAgMC4xNTE0MTAKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0IxICAgICAgICAgICAgICAgICAgIC0wLjgwNDIwMQotI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQjIgICAgICAgICAgICAgICAgICAgLTAuMTYzNzgzCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9CMSAgICAgICAgICAgICAgICAgICAoLTAuODA0MjAxKQorI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQjIgICAgICAgICAgICAgICAgICAgKC0wLjE2Mzc4MykKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTQKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQTAgICAgICAgICAgICAgICAgICAxLjI5OTE5OAotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMSAgICAgICAgICAgICAgICAgLTEuNDUyNDQ3CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0ExICAgICAgICAgICAgICAgICAoLTEuNDUyNDQ3KQogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMiAgICAgICAgICAgICAgICAgIDAuMjQwNDg5Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0IxICAgICAgICAgICAgICAgICAtMC42NjkzMDMKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQjIgICAgICAgICAgICAgICAgIC0wLjI5NDk4NAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9CMSAgICAgICAgICAgICAgICAgKC0wLjY2OTMwMykKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQjIgICAgICAgICAgICAgICAgICgtMC4yOTQ5ODQpCiAjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDE0CiAKIC8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDMyMDAwSHogc2FtcGxlIHJhdGUsIFwKICAgIENTIHNjYWxlZCB3aXRoIDEuMDQ0NTU5IGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzgwMDA2ICovCiAjZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDEuNTYwOTg4Ci0jZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTEuODc3NzI0CisjZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgKC0xLjg3NzcyNCkKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4zODk3NDEKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0IxICAgICAgICAgICAgICAgICAgICAtMC45MDc0MTAKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0IyICAgICAgICAgICAgICAgICAgICAtMC4wNzA0ODkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTAuOTA3NDEwKQorI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfQjIgICAgICAgICAgICAgICAgICAgICgtMC4wNzA0ODkpCiAjZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0CiAjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0EwICAgICAgICAgICAgICAgICAgMS43ODUwNDkKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQTEgICAgICAgICAgICAgICAgIC0yLjIzMzQ5NworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMSAgICAgICAgICAgICAgICAgKC0yLjIzMzQ5NykKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQTIgICAgICAgICAgICAgICAgICAwLjUyNjQzMQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9CMSAgICAgICAgICAgICAgICAgLTAuNDQ1OTM5Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0IyICAgICAgICAgICAgICAgICAtMC41MjI0NDYKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQjEgICAgICAgICAgICAgICAgICgtMC40NDU5MzkpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0IyICAgICAgICAgICAgICAgICAoLTAuNTIyNDQ2KQogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxMwogCiAvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciA0NDEwMEh6IHNhbXBsZSByYXRlLCBcCiAgICBDUyBzY2FsZWQgd2l0aCAxLjAyMjE3MCBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc2MzI4OCAqLwogI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQTAgICAgICAgICAgICAgICAgICAxLjYyMzk5MwotI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQTEgICAgICAgICAgICAgICAgIC0yLjI3MDc0MworI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQTEgICAgICAgICAgICAgICAgICgtMi4yNzA3NDMpCiAjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9BMiAgICAgICAgICAgICAgICAgIDAuNjg4ODI5Ci0jZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9CMSAgICAgICAgICAgICAgICAgLTEuMTE3MTkwCisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9CMSAgICAgICAgICAgICAgICAgKC0xLjExNzE5MCkKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX0IyICAgICAgICAgICAgICAgICAgMC4xMzAyMDgKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTMKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQTAgICAgICAgICAgICAgICAgICAgMi4wMjgzMTUKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQTEgICAgICAgICAgICAgICAgICAtMi44ODI0NTkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQTEgICAgICAgICAgICAgICAgICAoLTIuODgyNDU5KQogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9BMiAgICAgICAgICAgICAgICAgICAwLjkwNDUzNQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9CMSAgICAgICAgICAgICAgICAgIC0wLjU5MzMwOAotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9CMiAgICAgICAgICAgICAgICAgIC0wLjM4NTgxNgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9CMSAgICAgICAgICAgICAgICAgICgtMC41OTMzMDgpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0IyICAgICAgICAgICAgICAgICAgKC0wLjM4NTgxNikKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTMKIAogLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgNDgwMDBIeiBzYW1wbGUgcmF0ZSwgXAogICAgQ1Mgc2NhbGVkIHdpdGggMS4wMTg2MzUgYW5kIENTRVggc2NhbGVkIHdpdGggMC43NjA2NDggKi8KICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0EwICAgICAgICAgICAgICAgICAgICAxLjY0MTE3NwotI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfQTEgICAgICAgICAgICAgICAgICAgLTIuMzY0Njg3CisjZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9BMSAgICAgICAgICAgICAgICAgICAoLTIuMzY0Njg3KQogI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfQTIgICAgICAgICAgICAgICAgICAgIDAuNzU5OTEwCi0jZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9CMSAgICAgICAgICAgICAgICAgICAtMS4xNjY3NzQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0IxICAgICAgICAgICAgICAgICAgICgtMS4xNjY3NzQpCiAjZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9CMiAgICAgICAgICAgICAgICAgICAgMC4xNzgwNzQKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTMKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQTAgICAgICAgICAgICAgICAgICAyLjA5OTY1NQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9BMSAgICAgICAgICAgICAgICAgLTMuMDY1MjIwCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAoLTMuMDY1MjIwKQogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9BMiAgICAgICAgICAgICAgICAgIDEuMDEwNDE3Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0IxICAgICAgICAgICAgICAgICAtMC42MzQwMjEKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQjIgICAgICAgICAgICAgICAgIC0wLjM0NzMzMgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9CMSAgICAgICAgICAgICAgICAgKC0wLjYzNDAyMSkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQjIgICAgICAgICAgICAgICAgICgtMC4zNDczMzIpCiAjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCiAKIAogI2lmZGVmIEhJR0hFUl9GUwogI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfQTAgICAgICAgICAgICAgICAgICAgIDEuNzg0NDk3Ci0jZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9BMSAgICAgICAgICAgICAgICAgICAtMy4wMDE0MzUKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0ExICAgICAgICAgICAgICAgICAgICgtMy4wMDE0MzUpCiAjZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9BMiAgICAgICAgICAgICAgICAgICAgMS4yMjg0MjIKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0IxICAgICAgICAgICAgICAgICAgIC0xLjQ3NzgwNAorI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfQjEgICAgICAgICAgICAgICAgICAgKC0xLjQ3NzgwNCkKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0IyICAgICAgICAgICAgICAgICAgICAwLjQ4MTM2OQogI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxMwogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMCAgICAgICAgICAgICAgICAgIDIuNzU3MwotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMSAgICAgICAgICAgICAgICAgLTQuNjcyMQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMSAgICAgICAgICAgICAgICAgKC00LjY3MjEpCiAjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX0EyICAgICAgICAgICAgICAgICAgMS45MzE3Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX0IxICAgICAgICAgICAgICAgICAtMC45NzE3MTgKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjIgICAgICAgICAgICAgICAgIC0wLjAyMTIxNgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMSAgICAgICAgICAgICAgICAgKC0wLjk3MTcxOCkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjIgICAgICAgICAgICAgICAgICgtMC4wMjEyMTYpCiAjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCiAKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgICAgMS44ODk1ODIKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMSAgICAgICAgICAgICAgICAgICAtMy40NTYxNDAKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMSAgICAgICAgICAgICAgICAgICAoLTMuNDU2MTQwKQogI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0EyICAgICAgICAgICAgICAgICAgICAxLjU2OTg2NAotI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAgIC0xLjcwMDc5OAorI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAgICgtMS43MDA3OTgpCiAjZGVmaW5lIENTX0VRVUFMSVNFUl8xOTIwMDBfQjIgICAgICAgICAgICAgICAgICAgIDAuNzAxODI0CiAjZGVmaW5lIENTX0VRVUFMSVNFUl8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxMwogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAzLjQyNzMKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAtNi4yOTM2CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMSAgICAgICAgICAgICAgICAgKC02LjI5MzYpCiAjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMiAgICAgICAgICAgICAgICAgIDIuODcyMAotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQjEgICAgICAgICAgICAgICAgIC0xLjMxMDc0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9CMSAgICAgICAgICAgICAgICAgKC0xLjMxMDc0KQogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQjIgICAgICAgICAgICAgICAgIDAuMzEzMTIKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCiAjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5tawppbmRleCBmMTA2YWFlLi4zNDFkYmMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLm1rCkBAIC0xLDUgKzEsOCBAQAogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiAKKyMgVGhlIHdyYXBwZXIgLURCVUlMRF9GTE9BVCBuZWVkcyB0byBtYXRjaAorIyB0aGUgbHZtIGxpYnJhcnkgLURCVUlMRF9GTE9BVC4KKwogIyBtdXNpYyBidW5kbGUgd3JhcHBlcgogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKQEAgLTIwLDE1ICsyMywxNyBAQAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBsaWJtdXNpY2J1bmRsZQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICAgbGlibG9nIFwKKyAgICAgbGliYXVkaW91dGlscyBcCiAgICAgIGxpYmN1dGlscyBcCi0gICAgIGxpYmRsCisgICAgIGxpYmRsIFwKKyAgICAgbGlibG9nIFwKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAJJChMT0NBTF9QQVRIKS9CdW5kbGUgXAogCSQoTE9DQUxfUEFUSCkvLi4vbGliL0NvbW1vbi9saWIvIFwKIAkkKExPQ0FMX1BBVEgpLy4uL2xpYi9CdW5kbGUvbGliLyBcCi0JJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpCisJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKKwkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKIAogTE9DQUxfSEVBREVSX0xJQlJBUklFUyArPSBsaWJoYXJkd2FyZV9oZWFkZXJzCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCkBAIC01MywxNSArNTgsMjAgQEAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gbGlicmV2ZXJiCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgICBsaWJsb2cgXAorICAgICBsaWJhdWRpb3V0aWxzIFwKICAgICAgbGliY3V0aWxzIFwKLSAgICAgbGliZGwKKyAgICAgbGliZGwgXAorICAgICBsaWJsb2cgXAogCiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKICAgICAkKExPQ0FMX1BBVEgpL1JldmVyYiBcCiAgICAgJChMT0NBTF9QQVRIKS8uLi9saWIvQ29tbW9uL2xpYi8gXAogICAgICQoTE9DQUxfUEFUSCkvLi4vbGliL1JldmVyYi9saWIvIFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykKKyAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykgXAorICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAogCiBMT0NBTF9IRUFERVJfTElCUkFSSUVTICs9IGxpYmhhcmR3YXJlX2hlYWRlcnMKKworTE9DQUxfU0FOSVRJWkUgOj0gaW50ZWdlcl9vdmVyZmxvdworCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcAppbmRleCBhYWU4MGI2Li4wNGMyNjkyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KICNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKICNpbmNsdWRlICJFZmZlY3RCdW5kbGUuaCIKQEAgLTYzLDE2ICs2NCw2IEBACiAgICAgICAgIH1cCiAgICAgfQogCi0KLXN0YXRpYyBpbmxpbmUgaW50MTZfdCBjbGFtcDE2KGludDMyX3Qgc2FtcGxlKQotewotICAgIC8vIGNoZWNrIG92ZXJmbG93IGZvciBib3RoIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSB2YWx1ZXM6Ci0gICAgLy8gYWxsIGJpdHMgYWJvdmUgc2hvcnQgcmFuZ2UgbXVzdCBtZSBlcXVhbCB0byBzaWduIGJpdAotICAgIGlmICgoc2FtcGxlPj4xNSkgXiAoc2FtcGxlPj4zMSkpCi0gICAgICAgIHNhbXBsZSA9IDB4N0ZGRiBeIChzYW1wbGU+PjMxKTsKLSAgICByZXR1cm4gc2FtcGxlOwotfQotCiAvLyBOYW1lc3BhY2VzCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgewpAQCAtMTk4LDcgKzE4OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBpb0lkIF9fdW51c2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9oYW5kbGVfdCAgKnBIYW5kbGUpewogICAgIGludCByZXQgPSAwOwotICAgIGludCBzZXNzaW9uTm87CisgICAgaW50IHNlc3Npb25ObyA9IC0xOwogICAgIGludCBpOwogICAgIEVmZmVjdENvbnRleHQgKnBDb250ZXh0ID0gTlVMTDsKICAgICBib29sIG5ld0J1bmRsZSA9IGZhbHNlOwpAQCAtMjE4LDIyICsyMDksMjcgQEAKICAgICAgICAgTHZtR2xvYmFsQnVuZGxlX2luaXQoKTsKICAgICB9CiAKLSAgICAvLyBGaW5kIG5leHQgYXZhaWxhYmxlIHNlc3Npb25ObworICAgIC8vIEZpbmQgc2Vzc2lvbk5vOiBpZiBvbmUgYWxyZWFkeSBleGlzdHMgZm9yIHRoZSBzZXNzaW9uSWQgdXNlIGl0LAorICAgIC8vIG90aGVyd2lzZSBjaG9vc2UgdGhlIGZpcnN0IGF2YWlsYWJsZSBlbXB0eSBzbG90LgogICAgIGZvcihpPTA7IGk8TFZNX01BWF9TRVNTSU9OUzsgaSsrKXsKLSAgICAgICAgaWYoKFNlc3Npb25JbmRleFtpXSA9PSBMVk1fVU5VU0VEX1NFU1NJT04pfHwoU2Vzc2lvbkluZGV4W2ldID09IHNlc3Npb25JZCkpewotICAgICAgICAgICAgc2Vzc2lvbk5vICAgICAgID0gaTsKLSAgICAgICAgICAgIFNlc3Npb25JbmRleFtpXSA9IHNlc3Npb25JZDsKLSAgICAgICAgICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZTogQWxsb2NhdGluZyBTZXNzaW9uTm8gJWQgZm9yIFNlc3Npb25JZCAlZFxuIiwgc2Vzc2lvbk5vLHNlc3Npb25JZCk7CisgICAgICAgIGlmIChTZXNzaW9uSW5kZXhbaV0gPT0gc2Vzc2lvbklkKSB7CisgICAgICAgICAgICBzZXNzaW9uTm8gPSBpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKHNlc3Npb25ObyA8IDAgJiYgU2Vzc2lvbkluZGV4W2ldID09IExWTV9VTlVTRURfU0VTU0lPTikgeworICAgICAgICAgICAgc2Vzc2lvbk5vID0gaTsKKyAgICAgICAgICAgIC8vIGRvIG5vdCBicmVhazsgYWxsb3cgbG9vcCB0byBjb250aW51ZSB0byBzZWFyY2ggZm9yIGEgc2Vzc2lvbklkIG1hdGNoLgorICAgICAgICB9CiAgICAgfQotCi0gICAgaWYoaT09TFZNX01BWF9TRVNTSU9OUyl7CisgICAgaWYgKHNlc3Npb25ObyA8IDApIHsKICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogQ2Fubm90IGZpbmQgbWVtb3J5IHRvIGFsbG9jYXRlIGZvciBjdXJyZW50IHNlc3Npb24iKTsKICAgICAgICAgcmV0ID0gLUVJTlZBTDsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KIAorICAgIFNlc3Npb25JbmRleFtzZXNzaW9uTm9dID0gc2Vzc2lvbklkOworICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZTogQWxsb2NhdGluZyBzZXNzaW9uTm8gJWQgZm9yIHNlc3Npb25JZCAlZFxuIiwgc2Vzc2lvbk5vLCBzZXNzaW9uSWQpOworCiAgICAgcENvbnRleHQgPSBuZXcgRWZmZWN0Q29udGV4dDsKIAogICAgIC8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IGNyZWF0ZSBpbiB0aGlzIHNlc3Npb24KQEAgLTI5OSw3ICsyOTUsNyBAQAogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0ICAgPSAwOwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiAgICAgPSAwOwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSAgICAgPSAwOwotI2lmZGVmIEJVSUxEX0ZMT0FUCisjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgIWRlZmluZWQoTkFUSVZFX0ZMT0FUX0JVRkZFUikKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyICAgICAgICAgICAgID0gTlVMTDsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlciAgICAgICAgICAgID0gTlVMTDsKICNlbmRpZgpAQCAtNDcwLDEzICs0NjYsOSBAQAogICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIpOwogICAgICAgICB9Ci0jaWZkZWYgQlVJTERfRkxPQVQKLSAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyKTsKLSAgICAgICAgfQorI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmICFkZWZpbmVkKE5BVElWRV9GTE9BVF9CVUZGRVIpCisgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyKTsKKyAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyKTsKICNlbmRpZgogICAgICAgICBkZWxldGUgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dDsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCA9IExWTV9OVUxMOwpAQCAtNTQ5LDcgKzU0MSw3IEBACiAKICAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgICAgICAgICAgICAgICAgICAgID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKICAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgID0gRUZGRUNUX0JVRkZFUl9GT1JNQVQ7CiAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgICAgICAgICAgICAgICAgICA9IDQ0MTAwOwogICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICAgICAgPSBOVUxMOwogICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAgPSBOVUxMOwpAQCAtNTU3LDcgKzU0OSw3IEBACiAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5tYXNrICAgICAgICAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9DT05GSUdfQUxMOwogICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOwogICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVDsKICAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgICAgICAgICAgICAgICAgID0gNDQxMDA7CiAgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICAgICA9IE5VTEw7CiAgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC03MzQsNDcgKzcyNiw2IEBACiAgICAgcmV0dXJuIDA7CiB9ICAgLyogZW5kIEx2bUJ1bmRsZV9pbml0ICovCiAKLSNpZmRlZiBCVUlMRF9GTE9BVAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIEZVTkNUSU9OIElOVDE2TFRPRkxPQVQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy8gVG9kbzogbmVlZCB0byB3cml0ZSBmdW5jdGlvbiBkZXNjcmlwdG9yCi1zdGF0aWMgdm9pZCBJbnQxNlRvRmxvYXQoY29uc3QgTFZNX0lOVDE2ICpzcmMsIExWTV9GTE9BVCAqZHN0LCBzaXplX3QgbikgewotICAgIHNpemVfdCBpaTsKLSAgICBzcmMgKz0gbi0xOwotICAgIGRzdCArPSBuLTE7Ci0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pIHsKLSAgICAgICAgKmRzdCA9ICgoTFZNX0ZMT0FUKSgoTFZNX0lOVDE2KSpzcmMpKSAvIDMyNzY4LjBmOwotICAgICAgICBzcmMtLTsKLSAgICAgICAgZHN0LS07Ci0gICAgfQotICAgIHJldHVybjsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiBGTE9BVFRPSU5UMTZfU0FUCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vIFRvZG8gOiBOZWVkIHRvIHdyaXRlIGZ1bmN0aW9uIGRlc2NyaXB0b3IKLXN0YXRpYyB2b2lkIEZsb2F0VG9JbnQxNl9TQVQoY29uc3QgTFZNX0ZMT0FUICpzcmMsIExWTV9JTlQxNiAqZHN0LCBzaXplX3QgbikgewotICAgIHNpemVfdCBpaTsKLSAgICBMVk1fSU5UMzIgdGVtcDsKLQotICAgIHNyYyArPSBuLTE7Ci0gICAgZHN0ICs9IG4tMTsKLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgewotICAgICAgICB0ZW1wID0gKExWTV9JTlQzMikoKCpzcmMpICogMzI3NjguMGYpOwotICAgICAgICBpZiAodGVtcCA+PSAzMjc2NykgewotICAgICAgICAgICAgKmRzdCA9IDMyNzY3OwotICAgICAgICB9IGVsc2UgaWYgKHRlbXAgPD0gLTMyNzY4KSB7Ci0gICAgICAgICAgICAqZHN0ID0gLTMyNzY4OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKmRzdCA9IChMVk1fSU5UMTYpdGVtcDsKLSAgICAgICAgfQotICAgICAgICBzcmMtLTsKLSAgICAgICAgZHN0LS07Ci0gICAgfQotICAgIHJldHVybjsKLX0KLSNlbmRpZgogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBMdm1CdW5kbGVfcHJvY2VzcygpCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTc4Miw4ICs3MzMsOCBAQAogLy8gQXBwbHkgTFZNIEJ1bmRsZSBlZmZlY3RzCiAvLwogLy8gSW5wdXRzOgotLy8gIHBJbjogICAgICAgIHBvaW50ZXIgdG8gc3RlcmVvIDE2IGJpdCBpbnB1dCBkYXRhCi0vLyAgcE91dDogICAgICAgcG9pbnRlciB0byBzdGVyZW8gMTYgYml0IG91dHB1dCBkYXRhCisvLyAgcEluOiAgICAgICAgcG9pbnRlciB0byBzdGVyZW8gZmxvYXQgb3IgMTYgYml0IGlucHV0IGRhdGEKKy8vICBwT3V0OiAgICAgICBwb2ludGVyIHRvIHN0ZXJlbyBmbG9hdCBvciAxNiBiaXQgb3V0cHV0IGRhdGEKIC8vICBmcmFtZUNvdW50OiBGcmFtZXMgdG8gcHJvY2VzcwogLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAogLy8gIHN0cmVuZ3RoICAgIHN0cmVuZ3RoIHRvIGJlIGFwcGxpZWQKQEAgLTc5Myw0NCArNzQ0LDM3IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjaWZkZWYgQlVJTERfRkxPQVQKLWludCBMdm1CdW5kbGVfcHJvY2VzcyhMVk1fSU5UMTYgICAgICAgICpwSW4sCi0gICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqcE91dCwKK2ludCBMdm1CdW5kbGVfcHJvY2VzcyhlZmZlY3RfYnVmZmVyX3QgICpwSW4sCisgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2J1ZmZlcl90ICAqcE91dCwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0Q29udGV4dCAgICAqcENvbnRleHQpewogCi0KLSAgICAvL0xWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLwogICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwT3V0VG1wOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwSW5wdXRCdWZmOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwT3V0cHV0QnVmZjsKLQotICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgPT0gTlVMTCB8fAorICAgIGVmZmVjdF9idWZmZXJfdCAgICAgICAgICpwT3V0VG1wOworI2lmbmRlZiBOQVRJVkVfRkxPQVRfQlVGRkVSCisgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlciA9PSBudWxscHRyIHx8CiAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5mcmFtZUNvdW50IDwgZnJhbWVDb3VudCkgewotICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyKTsKLSAgICAgICAgfQotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgPSAoTFZNX0ZMT0FUICopbWFsbG9jKGZyYW1lQ291bnQgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkgKiBGQ0NfMik7CisgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyKTsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyID0KKyAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopY2FsbG9jKGZyYW1lQ291bnQsIHNpemVvZihMVk1fRkxPQVQpICogRkNDXzIpOwogICAgIH0KIAotICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyID09IE5VTEwgfHwKKyAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlciA9PSBudWxscHRyIHx8CiAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5mcmFtZUNvdW50IDwgZnJhbWVDb3VudCkgewotICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIpOwotICAgICAgICB9Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIgPSAoTFZNX0ZMT0FUICopbWFsbG9jKGZyYW1lQ291bnQgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpICogRkNDXzIpOworICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIpOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyID0KKyAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopY2FsbG9jKGZyYW1lQ291bnQsIHNpemVvZihMVk1fRkxPQVQpICogRkNDXzIpOwogICAgIH0KIAotICAgIGlmICgocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyID09IE5VTEwpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlciA9PSBOVUxMKSkgewotICAgICAgICBBTE9HVigiTFZNX0VSUk9SIDogTHZtQnVuZGxlX3Byb2Nlc3MgbWVtb3J5IGFsbG9jYXRpb24gZm9yIGZsb2F0IGJ1ZmZlcidzIGZhaWxlZCIpOworICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgPT0gbnVsbHB0ciB8fAorICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJMVk1fRVJST1IgOiBMdm1CdW5kbGVfcHJvY2VzcyBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgZmxvYXQgYnVmZmVyJ3MgZmFpbGVkIik7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIHBJbnB1dEJ1ZmYgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXI7Ci0gICAgcE91dHB1dEJ1ZmYgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyOworICAgIExWTV9GTE9BVCAqIGNvbnN0IHBJbnB1dEJ1ZmYgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXI7CisgICAgTFZNX0ZMT0FUICogY29uc3QgcE91dHB1dEJ1ZmYgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyOworI2VuZGlmCiAKICAgICBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSl7CiAgICAgICAgIHBPdXRUbXAgPSBwT3V0OwpAQCAtODQwLDcgKzc4NCw3IEBACiAgICAgICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgPQotICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopY2FsbG9jKGZyYW1lQ291bnQsIHNpemVvZihMVk1fSU5UMTYpICogRkNDXzIpOworICAgICAgICAgICAgICAgICAgICAoZWZmZWN0X2J1ZmZlcl90ICopY2FsbG9jKGZyYW1lQ291bnQsIHNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogRkNDXzIpOwogICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwogICAgICAgICAgICAgfQpAQCAtODUyLDQzICs3OTYsNjEgQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0gICAgI2lmZGVmIExWTV9QQ00KLSAgICBmd3JpdGUocEluLCBmcmFtZUNvdW50KnNpemVvZihMVk1fSU5UMTYpICogRkNDXzIsIDEsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyKTsKKyNpZmRlZiBMVk1fUENNCisgICAgZndyaXRlKHBJbiwKKyAgICAgICAgICAgIGZyYW1lQ291bnQqc2l6ZW9mKGVmZmVjdF9idWZmZXJfdCkgKiBGQ0NfMiwgMSwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIpOwogICAgIGZmbHVzaChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21JblB0cik7Ci0gICAgI2VuZGlmCisjZW5kaWYKIAorI2lmbmRlZiBOQVRJVkVfRkxPQVRfQlVGRkVSCiAgICAgLyogQ29udmVydGluZyBpbnB1dCBkYXRhIGZyb20gZml4ZWQgcG9pbnQgdG8gZmxvYXQgcG9pbnQgKi8KLSAgICBJbnQxNlRvRmxvYXQocEluLCBwSW5wdXRCdWZmLCBmcmFtZUNvdW50ICogMik7CisgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KHBJbnB1dEJ1ZmYsIHBJbiwgZnJhbWVDb3VudCAqIEZDQ18yKTsKIAogICAgIC8qIFByb2Nlc3MgdGhlIHNhbXBsZXMgKi8KICAgICBMdm1TdGF0dXMgPSBMVk1fUHJvY2VzcyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsIC8qIEluc3RhbmNlIGhhbmRsZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnB1dEJ1ZmYsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5wdXQgYnVmZmVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dEJ1ZmYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgYnVmZmVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpZnJhbWVDb3VudCwgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byByZWFkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdWRvIFRpbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEF1ZGlvIFRpbWUgKi8KIAorICAgIC8qIENvbnZlcnRpbmcgb3V0cHV0IGRhdGEgZnJvbSBmbG9hdCBwb2ludCB0byBmaXhlZCBwb2ludCAqLworICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdChwT3V0VG1wLCBwT3V0cHV0QnVmZiwgZnJhbWVDb3VudCAqIEZDQ18yKTsKKworI2Vsc2UKKyAgICAvKiBQcm9jZXNzIHRoZSBzYW1wbGVzICovCisgICAgTHZtU3RhdHVzID0gTFZNX1Byb2Nlc3MocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElucHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRUbXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KWZyYW1lQ291bnQsICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcmVhZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXVkaW8gVGltZSAqLworI2VuZGlmCiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9Qcm9jZXNzIiwgIkx2bUJ1bmRsZV9wcm9jZXNzIikKICAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwogCi0gICAgLyogQ29udmVydGluZyBvdXRwdXQgZGF0YSBmcm9tIGZsb2F0IHBvaW50IHRvIGZpeGVkIHBvaW50ICovCi0gICAgRmxvYXRUb0ludDE2X1NBVChwT3V0cHV0QnVmZiwgcE91dFRtcCwgKExWTV9VSU5UMTYpZnJhbWVDb3VudCAqIDIpOwotICAgICNpZmRlZiBMVk1fUENNCi0gICAgZndyaXRlKHBPdXRUbXAsIGZyYW1lQ291bnQqc2l6ZW9mKExWTV9JTlQxNikgKiBGQ0NfMiwgMSwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyKTsKKyNpZmRlZiBMVk1fUENNCisgICAgZndyaXRlKHBPdXRUbXAsCisgICAgICAgICAgICBmcmFtZUNvdW50KnNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogRkNDXzIsIDEsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbU91dFB0cik7CiAgICAgZmZsdXNoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbU91dFB0cik7Ci0gICAgI2VuZGlmCisjZW5kaWYKIAogICAgIGlmIChwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQgKiAyOyBpKyspeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQgKiBGQ0NfMjsgaSsrKSB7CisjaWZuZGVmIE5BVElWRV9GTE9BVF9CVUZGRVIKICAgICAgICAgICAgIHBPdXRbaV0gPSBjbGFtcDE2KChMVk1fSU5UMzIpcE91dFtpXSArIChMVk1fSU5UMzIpcE91dFRtcFtpXSk7CisjZWxzZQorICAgICAgICAgICAgcE91dFtpXSA9IHBPdXRbaV0gKyBwT3V0VG1wW2ldOworI2VuZGlmCiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIDA7CiB9ICAgIC8qIGVuZCBMdm1CdW5kbGVfcHJvY2VzcyAqLwotI2Vsc2UKKworI2Vsc2UgLy8gQlVJTERfRkxPQVQKKwogaW50IEx2bUJ1bmRsZV9wcm9jZXNzKExWTV9JTlQxNiAgICAgICAgKnBJbiwKICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICpwT3V0LAogICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RDb250ZXh0ICAgICpwQ29udGV4dCl7CisgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0Q29udGV4dCAgICAqcENvbnRleHQpIHsKIAogICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwT3V0VG1wOwpAQCAtOTAxLDcgKzg2Myw3IEBACiAgICAgICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgPQotICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopY2FsbG9jKGZyYW1lQ291bnQsIHNpemVvZihMVk1fSU5UMTYpICogMik7CisgICAgICAgICAgICAgICAgICAgIChlZmZlY3RfYnVmZmVyX3QgKiljYWxsb2MoZnJhbWVDb3VudCwgc2l6ZW9mKGVmZmVjdF9idWZmZXJfdCkgKiBGQ0NfMik7CiAgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CiAgICAgICAgICAgICB9CkBAIC05MTMsMTAgKzg3NSwxMSBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICAjaWZkZWYgTFZNX1BDTQotICAgIGZ3cml0ZShwSW4sIGZyYW1lQ291bnQqc2l6ZW9mKExWTV9JTlQxNikqMiwgMSwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIpOworI2lmZGVmIExWTV9QQ00KKyAgICBmd3JpdGUocEluLCBmcmFtZUNvdW50ICogc2l6ZW9mKCpwSW4pICogRkNDXzIsCisgICAgICAgICAgICAxIC8qIG5tZW1iICovLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21JblB0cik7CiAgICAgZmZsdXNoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyKTsKLSAgICAjZW5kaWYKKyNlbmRpZgogCiAgICAgLy9BTE9HVigiQ2FsbGluZyBMVk1fUHJvY2VzcyIpOwogCkBAIC05MjUsMTUgKzg4OCwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5wdXQgYnVmZmVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dFRtcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgYnVmZmVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpZnJhbWVDb3VudCwgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byByZWFkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdWRvIFRpbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEF1ZGlvIFRpbWUgKi8KIAogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fUHJvY2VzcyIsICJMdm1CdW5kbGVfcHJvY2VzcyIpCiAgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKIAotICAgICNpZmRlZiBMVk1fUENNCi0gICAgZndyaXRlKHBPdXRUbXAsIGZyYW1lQ291bnQqc2l6ZW9mKExWTV9JTlQxNikqMiwgMSwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyKTsKKyNpZmRlZiBMVk1fUENNCisgICAgZndyaXRlKHBPdXRUbXAsIGZyYW1lQ291bnQgKiBzaXplb2YoKnBPdXRUbXApICogRkNDXzIsCisgICAgICAgICAgICAxIC8qIG5tZW1iICovLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21PdXRQdHIpOwogICAgIGZmbHVzaChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21PdXRQdHIpOwotICAgICNlbmRpZgorI2VuZGlmCiAKICAgICBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKXsKICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGZyYW1lQ291bnQqMjsgaSsrKXsKQEAgLTk0Miw3ICs5MDYsOCBAQAogICAgIH0KICAgICByZXR1cm4gMDsKIH0gICAgLyogZW5kIEx2bUJ1bmRsZV9wcm9jZXNzICovCi0jZW5kaWYKKworI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gRXF1YWxpemVyVXBkYXRlQWN0aXZlUGFyYW1zKCkKQEAgLTEyNzYsOCArMTI0MSw3IEBACiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyk7CiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFCiAgICAgICAgICAgICAgIHx8IHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpOwotICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpOwotCisgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9PSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVCk7CiAgICAgcENvbnRleHQtPmNvbmZpZyA9ICpwQ29uZmlnOwogCiAgICAgc3dpdGNoIChwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUpIHsKQEAgLTMzNDksMTAgKzMzMTMsMTcgQEAKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCA9IDA7CiAgICAgICAgIC8qIFByb2Nlc3MgYWxsIHRoZSBhdmFpbGFibGUgZnJhbWVzLCBibG9jayBwcm9jZXNzaW5nIGlzCiAgICAgICAgICAgIGhhbmRsZWQgaW50ZXJuYWxMWSBieSB0aGUgTFZNIGJ1bmRsZSAqLwotICAgICAgICBwcm9jZXNzU3RhdHVzID0gYW5kcm9pZDo6THZtQnVuZGxlX3Byb2Nlc3MoICAgIChMVk1fSU5UMTYgKilpbkJ1ZmZlci0+cmF3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKW91dEJ1ZmZlci0+cmF3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQpOworI2lmZGVmIE5BVElWRV9GTE9BVF9CVUZGRVIKKyAgICAgICAgcHJvY2Vzc1N0YXR1cyA9IGFuZHJvaWQ6Okx2bUJ1bmRsZV9wcm9jZXNzKGluQnVmZmVyLT5mMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmYzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0KTsKKyNlbHNlCisgICAgICAgIHByb2Nlc3NTdGF0dXMgPSBhbmRyb2lkOjpMdm1CdW5kbGVfcHJvY2VzcyhpbkJ1ZmZlci0+czE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5zMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dCk7CisjZW5kaWYKICAgICAgICAgaWYgKHByb2Nlc3NTdGF0dXMgIT0gMCl7CiAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBMdm1CdW5kbGVfcHJvY2VzcyByZXR1cm5lZCBlcnJvciAlZCIsIHByb2Nlc3NTdGF0dXMpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAwKSB7CkBAIC0zMzY0LDE0ICszMzM1LDE5IEBACiAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3MgTm90IENhbGxpbmcgcHJvY2VzcyB3aXRoICVkIGVmZmVjdHMgZW5hYmxlZCwgJWQgY2FsbGVkOiBFZmZlY3QgJWQiLAogICAgICAgICAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkLAogICAgICAgICAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQsIHBDb250ZXh0LT5FZmZlY3RUeXBlKTsKLSAgICAgICAgLy8gMiBpcyBmb3Igc3RlcmVvIGlucHV0CisKICAgICAgICAgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgb3V0QnVmZmVyLT5mcmFtZUNvdW50KjI7IGkrKyl7Ci0gICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5zMTZbaV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgY2xhbXAxNigoTFZNX0lOVDMyKW91dEJ1ZmZlci0+czE2W2ldICsgKExWTV9JTlQzMilpbkJ1ZmZlci0+czE2W2ldKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogRkNDXzI7ICsraSl7CisjaWZkZWYgTkFUSVZFX0ZMT0FUX0JVRkZFUgorICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZjMyW2ldICs9IGluQnVmZmVyLT5mMzJbaV07CisjZWxzZQorICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+czE2W2ldID0gY2xhbXAxNigoTFZNX0lOVDMyKW91dEJ1ZmZlci0+czE2W2ldICsgaW5CdWZmZXItPnMxNltpXSk7CisjZW5kaWYKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChvdXRCdWZmZXItPnJhdyAhPSBpbkJ1ZmZlci0+cmF3KSB7Ci0gICAgICAgICAgICBtZW1jcHkob3V0QnVmZmVyLT5yYXcsIGluQnVmZmVyLT5yYXcsIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCpzaXplb2YoTFZNX0lOVDE2KSoyKTsKKyAgICAgICAgICAgIG1lbWNweShvdXRCdWZmZXItPnJhdywKKyAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXItPnJhdywKKyAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogc2l6ZW9mKGVmZmVjdF9idWZmZXJfdCkgKiBGQ0NfMik7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKaW5kZXggMjkxMzgzYS4uNmJmMDQ1ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKQEAgLTk1LDcgKzk1LDcgQEAKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZXNUb0V4aXRDb3VudEVxOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlc1RvRXhpdENvdW50QmI7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVzVG9FeGl0Q291bnRWaXJ0OwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgKndvcmtCdWZmZXI7CisgICAgZWZmZWN0X2J1ZmZlcl90ICAgICAgICAgICAgICAgICAqd29ya0J1ZmZlcjsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQ7CiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kR2FpbmRCW0ZJVkVCQU5EX05VTUJBTkRTXTsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZTsKQEAgLTEwMywxMCArMTAzLDEwIEBACiAgICAgRklMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqUGNtSW5QdHI7CiAgICAgRklMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqUGNtT3V0UHRyOwogICAgICNlbmRpZgotICAgICNpZmRlZiBCVUlMRF9GTE9BVAorI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmICFkZWZpbmVkKE5BVElWRV9GTE9BVF9CVUZGRVIpCiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAqcElucHV0QnVmZmVyOwogICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgKnBPdXRwdXRCdWZmZXI7Ci0gICAgI2VuZGlmCisjZW5kaWYKIH07CiAKIC8qIFNlc3Npb25Db250ZXh0IDogT25lIHNlc3Npb24gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCmluZGV4IDNkOGU5ODIuLmUxYzAzZjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcApAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogI2luY2x1ZGUgPGxvZy9sb2cuaD4KIAogI2luY2x1ZGUgIkVmZmVjdFJldmVyYi5oIgpAQCAtMTM1LDYgKzEzNiwxMiBAQAogICAgICAgICAmZ0luc2VydFByZXNldFJldmVyYkRlc2NyaXB0b3IKIH07CiAKKyNpZmRlZiBCVUlMRF9GTE9BVAordHlwZWRlZiAgICAgZmxvYXQgICAgICAgICAgICAgICBwcm9jZXNzX2J1ZmZlcl90OyAvLyBwcm9jZXNzIGluIGZsb2F0CisjZWxzZQordHlwZWRlZiAgICAgaW50MzJfdCAgICAgICAgICAgICBwcm9jZXNzX2J1ZmZlcl90OyAvLyBwcm9jZXNzIGluIFE0XzI3CisjZW5kaWYgLy8gQlVJTERfRkxPQVQKKwogc3RydWN0IFJldmVyYkNvbnRleHR7CiAgICAgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyAqaXRmZTsKICAgICBlZmZlY3RfY29uZmlnX3QgICAgICAgICAgICAgICAgIGNvbmZpZzsKQEAgLTE1Miw4ICsxNTksOCBAQAogICAgIEZJTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlBjbU91dFB0cjsKICAgICAjZW5kaWYKICAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZVJhdGU7Ci0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAgICAqSW5GcmFtZXMzMjsKLSAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICpPdXRGcmFtZXMzMjsKKyAgICBwcm9jZXNzX2J1ZmZlcl90ICAgICAgICAgICAgICAgICpJbkZyYW1lczsKKyAgICBwcm9jZXNzX2J1ZmZlcl90ICAgICAgICAgICAgICAgICpPdXRGcmFtZXM7CiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplSW47CiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplT3V0OwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV4aWxpYXJ5OwpAQCAtMjYyLDcgKzI2OSw3IEBACiAKICAgICAqcEhhbmRsZSA9IChlZmZlY3RfaGFuZGxlX3QpcENvbnRleHQ7CiAKLSAgICAjaWZkZWYgTFZNX1BDTQorI2lmZGVmIExWTV9QQ00KICAgICBwQ29udGV4dC0+UGNtSW5QdHIgPSBOVUxMOwogICAgIHBDb250ZXh0LT5QY21PdXRQdHIgPSBOVUxMOwogCkBAIC0yNzMsMTkgKzI4MCwxNSBAQAogICAgICAgIChwQ29udGV4dC0+UGNtT3V0UHRyID09IE5VTEwpKXsKICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9Ci0gICAgI2VuZGlmCisjZW5kaWYKIAorICAgIGludCBjaGFubmVscyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzKTsKIAogICAgIC8vIEFsbG9jYXRlIG1lbW9yeSBmb3IgcmV2ZXJiIHByb2Nlc3MgKCoyIGlzIGZvciBTVEVSRU8pCi0jaWZkZWYgQlVJTERfRkxPQVQKLSAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZUluID0gTFZSRVZfTUFYX0ZSQU1FX1NJWkUgKiBzaXplb2YoZmxvYXQpICogMjsKLSAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCA9IHBDb250ZXh0LT5idWZmZXJTaXplSW47Ci0jZWxzZQotICAgIHBDb250ZXh0LT5idWZmZXJTaXplSW4gPSBMVlJFVl9NQVhfRlJBTUVfU0laRSAqIHNpemVvZihMVk1fSU5UMzIpICogMjsKLSAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCA9IHBDb250ZXh0LT5idWZmZXJTaXplSW47Ci0jZW5kaWYKLSAgICBwQ29udGV4dC0+SW5GcmFtZXMzMiAgPSAoTFZNX0lOVDMyICopbWFsbG9jKHBDb250ZXh0LT5idWZmZXJTaXplSW4pOwotICAgIHBDb250ZXh0LT5PdXRGcmFtZXMzMiA9IChMVk1fSU5UMzIgKiltYWxsb2MocENvbnRleHQtPmJ1ZmZlclNpemVPdXQpOworICAgIHBDb250ZXh0LT5idWZmZXJTaXplSW4gPSBMVlJFVl9NQVhfRlJBTUVfU0laRSAqIHNpemVvZihwcm9jZXNzX2J1ZmZlcl90KSAqIGNoYW5uZWxzOworICAgIHBDb250ZXh0LT5idWZmZXJTaXplT3V0ID0gTFZSRVZfTUFYX0ZSQU1FX1NJWkUgKiBzaXplb2YocHJvY2Vzc19idWZmZXJfdCkgKiBGQ0NfMjsKKyAgICBwQ29udGV4dC0+SW5GcmFtZXMgID0gKHByb2Nlc3NfYnVmZmVyX3QgKiljYWxsb2MocENvbnRleHQtPmJ1ZmZlclNpemVJbiwgMSAvKiBzaXplICovKTsKKyAgICBwQ29udGV4dC0+T3V0RnJhbWVzID0gKHByb2Nlc3NfYnVmZmVyX3QgKiljYWxsb2MocENvbnRleHQtPmJ1ZmZlclNpemVPdXQsIDEgLyogc2l6ZSAqLyk7CiAKICAgICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgJXAsIHNpemUgJXp1IiwgcENvbnRleHQsIHNpemVvZihSZXZlcmJDb250ZXh0KSk7CiAgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlIGVuZFxuIik7CkBAIC0zMDUsOCArMzA4LDggQEAKICAgICBmY2xvc2UocENvbnRleHQtPlBjbUluUHRyKTsKICAgICBmY2xvc2UocENvbnRleHQtPlBjbU91dFB0cik7CiAgICAgI2VuZGlmCi0gICAgZnJlZShwQ29udGV4dC0+SW5GcmFtZXMzMik7Ci0gICAgZnJlZShwQ29udGV4dC0+T3V0RnJhbWVzMzIpOworICAgIGZyZWUocENvbnRleHQtPkluRnJhbWVzKTsKKyAgICBmcmVlKHBDb250ZXh0LT5PdXRGcmFtZXMpOwogICAgIHBDb250ZXh0LT5idWZmZXJTaXplSW4gPSAwOwogICAgIHBDb250ZXh0LT5idWZmZXJTaXplT3V0ID0gMDsKICAgICBSZXZlcmJfZnJlZShwQ29udGV4dCk7CkBAIC0zNDQsMTE0ICszNDcsNiBAQAogICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0KIAotI2lmIDAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTW9ub1RvMklfMzIoKQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQdXJwb3NlOgotLy8gIENvbnZlcnQgTU9OTyB0byBTVEVSRU8KLS8vCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBNb25vVG8ySV8zMiggY29uc3QgTFZNX0lOVDMyICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCi17Ci0gICBMVk1fSU5UMTYgaWk7Ci0gICBzcmMgKz0gKG4tMSk7Ci0gICBkc3QgKz0gKChuKjIpLTEpOwotCi0gICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgIHsKLSAgICAgICAqZHN0ID0gKnNyYzsKLSAgICAgICBkc3QtLTsKLQotICAgICAgICpkc3QgPSAqc3JjOwotICAgICAgIGRzdC0tOwotICAgICAgIHNyYy0tOwotICAgfQotCi0gICByZXR1cm47Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRnJvbTJpVG9Nb25vXzMyKCkKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUHVycG9zZToKLS8vICBDb252ZXJ0IFNURVJFTyB0byBNT05PCi0vLwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgRnJvbTJpVG9Nb25vXzMyKCBjb25zdCBMVk1fSU5UMzIgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKLXsKLSAgIExWTV9JTlQxNiBpaTsKLSAgIExWTV9JTlQzMiBUZW1wOwotCi0gICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgIHsKLSAgICAgICBUZW1wID0gKCpzcmM+PjEpOwotICAgICAgIHNyYysrOwotCi0gICAgICAgVGVtcCArPSgqc3JjPj4xKTsKLSAgICAgICBzcmMrKzsKLQotICAgICAgICpkc3QgPSBUZW1wOwotICAgICAgIGRzdCsrOwotICAgfQotCi0gICByZXR1cm47Ci19Ci0jZW5kaWYKLQotI2lmZGVmIEJVSUxEX0ZMT0FUCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gSU5UMTZMVE9GTE9BVAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vLyBUb2RvOiBuZWVkIHRvIHdyaXRlIGZ1bmN0aW9uIGRlc2NyaXB0b3IKLXN0YXRpYyB2b2lkIEludDE2VG9GbG9hdChjb25zdCBMVk1fSU5UMTYgKnNyYywgTFZNX0ZMT0FUICpkc3QsIHNpemVfdCBuKSB7Ci0gICAgc2l6ZV90IGlpOwotICAgIHNyYyArPSBuLTE7Ci0gICAgZHN0ICs9IG4tMTsKLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgewotICAgICAgICAqZHN0ID0gKChMVk1fRkxPQVQpKChMVk1fSU5UMTYpKnNyYykpIC8gMzI3NjguMGY7Ci0gICAgICAgIHNyYy0tOwotICAgICAgICBkc3QtLTsKLSAgICB9Ci0gICAgcmV0dXJuOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIEZVTkNUSU9OIEZMT0FUVE9JTlQxNl9TQVQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy8gVG9kbyA6IE5lZWQgdG8gd3JpdGUgZnVuY3Rpb24gZGVzY3JpcHRvcgotc3RhdGljIHZvaWQgRmxvYXRUb0ludDE2X1NBVChjb25zdCBMVk1fRkxPQVQgKnNyYywgTFZNX0lOVDE2ICpkc3QsIHNpemVfdCBuKSB7Ci0gICAgc2l6ZV90IGlpOwotICAgIExWTV9JTlQzMiB0ZW1wOwotCi0gICAgZm9yIChpaSA9IDA7IGlpIDwgbjsgaWkrKykgewotICAgICAgICB0ZW1wID0gKExWTV9JTlQzMikoKCpzcmMpICogMzI3NjguMGYpOwotICAgICAgICBpZiAodGVtcCA+PSAzMjc2NykgewotICAgICAgICAgICAgKmRzdCA9IDMyNzY3OwotICAgICAgICB9IGVsc2UgaWYgKHRlbXAgPD0gLTMyNzY4KSB7Ci0gICAgICAgICAgICAqZHN0ID0gLTMyNzY4OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKmRzdCA9IChMVk1fSU5UMTYpdGVtcDsKLSAgICAgICAgfQotICAgICAgICBzcmMrKzsKLSAgICAgICAgZHN0Kys7Ci0gICAgfQotICAgIHJldHVybjsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIGludDE2X3QgY2xhbXAxNihpbnQzMl90IHNhbXBsZSkKLXsKLSAgICBpZiAoKHNhbXBsZT4+MTUpIF4gKHNhbXBsZT4+MzEpKQotICAgICAgICBzYW1wbGUgPSAweDdGRkYgXiAoc2FtcGxlPj4zMSk7Ci0gICAgcmV0dXJuIHNhbXBsZTsKLX0KLQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBwcm9jZXNzKCkKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDU5LDggKzM1NCw4IEBACiAvLyBBcHBseSB0aGUgUmV2ZXJiCiAvLwogLy8gSW5wdXRzOgotLy8gIHBJbjogICAgICAgIHBvaW50ZXIgdG8gc3RlcmVvL21vbm8gMTYgYml0IGlucHV0IGRhdGEKLS8vICBwT3V0OiAgICAgICBwb2ludGVyIHRvIHN0ZXJlbyAxNiBiaXQgb3V0cHV0IGRhdGEKKy8vICBwSW46ICAgICAgICBwb2ludGVyIHRvIHN0ZXJlby9tb25vIGZsb2F0IG9yIDE2IGJpdCBpbnB1dCBkYXRhCisvLyAgcE91dDogICAgICAgcG9pbnRlciB0byBzdGVyZW8gZmxvYXQgb3IgMTYgYml0IG91dHB1dCBkYXRhCiAvLyAgZnJhbWVDb3VudDogRnJhbWVzIHRvIHByb2Nlc3MKIC8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKIC8vICBzdHJlbmd0aCAgICBzdHJlbmd0aCB0byBiZSBhcHBsaWVkCkBAIC00NjksMTE2ICszNjQsMTA3IEBACiAvLyAgcE91dDogICAgICAgcG9pbnRlciB0byB1cGRhdGVkIHN0ZXJlbyAxNiBiaXQgb3V0cHV0IGRhdGEKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW50IHByb2Nlc3MoIExWTV9JTlQxNiAgICAgKnBJbiwKLSAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICpwT3V0LAoraW50IHByb2Nlc3MoIGVmZmVjdF9idWZmZXJfdCAgICpwSW4sCisgICAgICAgICAgICAgZWZmZWN0X2J1ZmZlcl90ICAgKnBPdXQsCiAgICAgICAgICAgICAgaW50ICAgICAgICAgICBmcmFtZUNvdW50LAogICAgICAgICAgICAgIFJldmVyYkNvbnRleHQgKnBDb250ZXh0KXsKIAotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDE7CisgICAgaW50IGNoYW5uZWxzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMpOwogICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgIEx2bVN0YXR1cyA9IExWUkVWX1NVQ0NFU1M7ICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwotICAgIExWTV9JTlQxNiAqT3V0RnJhbWVzMTY7Ci0jaWZkZWYgQlVJTERfRkxPQVQKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcElucHV0QnVmZjsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcE91dHB1dEJ1ZmY7Ci0jZW5kaWYKIAotI2lmZGVmIEJVSUxEX0ZMT0FUCi0gICAgaWYgKHBDb250ZXh0LT5JbkZyYW1lczMyID09IE5VTEwgfHwKLSAgICAgICAgICAgIHBDb250ZXh0LT5idWZmZXJTaXplSW4gPCBmcmFtZUNvdW50ICogc2l6ZW9mKGZsb2F0KSAqIDIpIHsKLSAgICAgICAgaWYgKHBDb250ZXh0LT5JbkZyYW1lczMyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGZyZWUocENvbnRleHQtPkluRnJhbWVzMzIpOwotICAgICAgICB9Ci0gICAgICAgIHBDb250ZXh0LT5idWZmZXJTaXplSW4gPSBmcmFtZUNvdW50ICogc2l6ZW9mKGZsb2F0KSAqIDI7Ci0gICAgICAgIHBDb250ZXh0LT5JbkZyYW1lczMyID0gKExWTV9JTlQzMiAqKW1hbGxvYyhwQ29udGV4dC0+YnVmZmVyU2l6ZUluKTsKLSAgICB9Ci0gICAgaWYgKHBDb250ZXh0LT5PdXRGcmFtZXMzMiA9PSBOVUxMIHx8Ci0gICAgICAgICAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCA8IGZyYW1lQ291bnQgKiBzaXplb2YoZmxvYXQpICogMikgewotICAgICAgICBpZiAocENvbnRleHQtPk91dEZyYW1lczMyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGZyZWUocENvbnRleHQtPk91dEZyYW1lczMyKTsKLSAgICAgICAgfQotICAgICAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCA9IGZyYW1lQ291bnQgKiBzaXplb2YoZmxvYXQpICogMjsKLSAgICAgICAgcENvbnRleHQtPk91dEZyYW1lczMyID0gKExWTV9JTlQzMiAqKW1hbGxvYyhwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCk7Ci0gICAgfQotICAgIHBJbnB1dEJ1ZmYgPSAoZmxvYXQgKilwQ29udGV4dC0+SW5GcmFtZXMzMjsKLSAgICBwT3V0cHV0QnVmZiA9IChmbG9hdCAqKXBDb250ZXh0LT5PdXRGcmFtZXMzMjsKLSNlbmRpZgogICAgIC8vIENoZWNrIHRoYXQgdGhlIGlucHV0IGlzIGVpdGhlciBtb25vIG9yIHN0ZXJlbwotICAgIGlmIChwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykgewotICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSAyOwotICAgIH0gZWxzZSBpZiAocENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyAhPSBBVURJT19DSEFOTkVMX09VVF9NT05PKSB7Ci0gICAgICAgIEFMT0dWKCJcdExWUkVWX0VSUk9SIDogcHJvY2VzcyBpbnZhbGlkIFBDTSBmb3JtYXQiKTsKKyAgICBpZiAoIShjaGFubmVscyA9PSAxIHx8IGNoYW5uZWxzID09IEZDQ18yKSApIHsKKyAgICAgICAgQUxPR0UoIlx0TFZSRVZfRVJST1IgOiBwcm9jZXNzIGludmFsaWQgUENNIGZvcm1hdCIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICBPdXRGcmFtZXMxNiA9IChMVk1fSU5UMTYgKilwQ29udGV4dC0+T3V0RnJhbWVzMzI7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBzaXplX3QgaW5TaXplID0gZnJhbWVDb3VudCAqIHNpemVvZihwcm9jZXNzX2J1ZmZlcl90KSAqIGNoYW5uZWxzOworICAgIHNpemVfdCBvdXRTaXplID0gZnJhbWVDb3VudCAqIHNpemVvZihwcm9jZXNzX2J1ZmZlcl90KSAqIEZDQ18yOworICAgIGlmIChwQ29udGV4dC0+SW5GcmFtZXMgPT0gTlVMTCB8fAorICAgICAgICAgICAgcENvbnRleHQtPmJ1ZmZlclNpemVJbiA8IGluU2l6ZSkgeworICAgICAgICBmcmVlKHBDb250ZXh0LT5JbkZyYW1lcyk7CisgICAgICAgIHBDb250ZXh0LT5idWZmZXJTaXplSW4gPSBpblNpemU7CisgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lcyA9IChwcm9jZXNzX2J1ZmZlcl90ICopY2FsbG9jKDEsIHBDb250ZXh0LT5idWZmZXJTaXplSW4pOworICAgIH0KKyAgICBpZiAocENvbnRleHQtPk91dEZyYW1lcyA9PSBOVUxMIHx8CisgICAgICAgICAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCA8IG91dFNpemUpIHsKKyAgICAgICAgZnJlZShwQ29udGV4dC0+T3V0RnJhbWVzKTsKKyAgICAgICAgcENvbnRleHQtPmJ1ZmZlclNpemVPdXQgPSBvdXRTaXplOworICAgICAgICBwQ29udGV4dC0+T3V0RnJhbWVzID0gKHByb2Nlc3NfYnVmZmVyX3QgKiljYWxsb2MoMSwgcENvbnRleHQtPmJ1ZmZlclNpemVPdXQpOworICAgIH0KKworI2lmbmRlZiBOQVRJVkVfRkxPQVRfQlVGRkVSCisgICAgZWZmZWN0X2J1ZmZlcl90ICogY29uc3QgT3V0RnJhbWVzMTYgPSAoZWZmZWN0X2J1ZmZlcl90ICopcENvbnRleHQtPk91dEZyYW1lczsKKyNlbmRpZgorI2VuZGlmCiAKICAgICAvLyBDaGVjayBmb3IgTlVMTCBwb2ludGVycwotICAgIGlmKChwQ29udGV4dC0+SW5GcmFtZXMzMiA9PSBOVUxMKXx8KHBDb250ZXh0LT5PdXRGcmFtZXMzMiA9PSBOVUxMKSl7Ci0gICAgICAgIEFMT0dWKCJcdExWUkVWX0VSUk9SIDogcHJvY2VzcyBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0ZW1wb3JhcnkgYnVmZmVycyAiKTsKKyAgICBpZiAoKHBDb250ZXh0LT5JbkZyYW1lcyA9PSBOVUxMKSB8fCAocENvbnRleHQtPk91dEZyYW1lcyA9PSBOVUxMKSkgeworICAgICAgICBBTE9HRSgiXHRMVlJFVl9FUlJPUiA6IHByb2Nlc3MgZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGVtcG9yYXJ5IGJ1ZmZlcnMgIik7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgICNpZmRlZiBMVk1fUENNCi0gICAgZndyaXRlKHBJbiwgZnJhbWVDb3VudCpzaXplb2YoTFZNX0lOVDE2KSpzYW1wbGVzUGVyRnJhbWUsIDEsIHBDb250ZXh0LT5QY21JblB0cik7CisjaWZkZWYgTFZNX1BDTQorICAgIGZ3cml0ZShwSW4sIGZyYW1lQ291bnQgKiBzaXplb2YoKnBJbikgKiBjaGFubmVscywgMSAvKiBubWVtYiAqLywgcENvbnRleHQtPlBjbUluUHRyKTsKICAgICBmZmx1c2gocENvbnRleHQtPlBjbUluUHRyKTsKLSAgICAjZW5kaWYKKyNlbmRpZgogCiAgICAgaWYgKHBDb250ZXh0LT5wcmVzZXQgJiYgcENvbnRleHQtPm5leHRQcmVzZXQgIT0gcENvbnRleHQtPmN1clByZXNldCkgewogICAgICAgICBSZXZlcmJfTG9hZFByZXNldChwQ29udGV4dCk7CiAgICAgfQogCi0gICAgLy8gQ29udmVydCB0byBJbnB1dCAzMiBiaXRzCiAgICAgaWYgKHBDb250ZXh0LT5hdXhpbGlhcnkpIHsKICNpZmRlZiBCVUlMRF9GTE9BVAotICAgICAgICBJbnQxNlRvRmxvYXQocEluLCBwSW5wdXRCdWZmLCBmcmFtZUNvdW50ICogc2FtcGxlc1BlckZyYW1lKTsKKyNpZmRlZiBOQVRJVkVfRkxPQVRfQlVGRkVSCisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKCpwSW4pLCBkZWNsdHlwZSgqcENvbnRleHQtPkluRnJhbWVzKT46OnZhbHVlLAorICAgICAgICAgICAgICAgICJwSW4gYW5kIEluRnJhbWVzIG11c3QgYmUgc2FtZSB0eXBlIik7CisgICAgICAgIG1lbWNweShwQ29udGV4dC0+SW5GcmFtZXMsIHBJbiwgZnJhbWVDb3VudCAqIGNoYW5uZWxzICogc2l6ZW9mKCpwSW4pKTsKICNlbHNlCi0gICAgICAgIGZvcihpbnQgaT0wOyBpPGZyYW1lQ291bnQqc2FtcGxlc1BlckZyYW1lOyBpKyspewotICAgICAgICAgICAgcENvbnRleHQtPkluRnJhbWVzMzJbaV0gPSAoTFZNX0lOVDMyKXBJbltpXTw8ODsKKyAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KAorICAgICAgICAgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lcywgcEluLCBmcmFtZUNvdW50ICogY2hhbm5lbHMpOworI2VuZGlmCisjZWxzZSAvL25vIEJVSUxEX0ZMT0FUCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudCAqIGNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lc1tpXSA9IChwcm9jZXNzX2J1ZmZlcl90KXBJbltpXTw8ODsKICAgICAgICAgfQogI2VuZGlmCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIGluc2VydCByZXZlcmIgaW5wdXQgaXMgYWx3YXlzIHN0ZXJlbwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQ7IGkrKykgewotI2lmbmRlZiBCVUlMRF9GTE9BVAotICAgICAgICAgICAgcENvbnRleHQtPkluRnJhbWVzMzJbMippXSA9IChwSW5bMippXSAqIFJFVkVSQl9TRU5EX0xFVkVMKSA+PiA0OyAvLyA8PDggKyA+PjEyCi0gICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXMzMlsyKmkrMV0gPSAocEluWzIqaSsxXSAqIFJFVkVSQl9TRU5EX0xFVkVMKSA+PiA0OyAvLyA8PDggKyA+PjEyCisjaWZkZWYgQlVJTERfRkxPQVQKKyNpZmRlZiBOQVRJVkVfRkxPQVRfQlVGRkVSCisgICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXNbMiAqIGldID0gKHByb2Nlc3NfYnVmZmVyX3QpcEluWzIgKiBpXSAqIFJFVkVSQl9TRU5EX0xFVkVMOworICAgICAgICAgICAgcENvbnRleHQtPkluRnJhbWVzWzIgKiBpICsgMV0gPSAocHJvY2Vzc19idWZmZXJfdClwSW5bMiAqIGkgKyAxXSAqIFJFVkVSQl9TRU5EX0xFVkVMOwogI2Vsc2UKLSAgICAgICAgICAgIHBJbnB1dEJ1ZmZbMiAqIGldID0gKExWTV9GTE9BVClwSW5bMiAqIGldICogUkVWRVJCX1NFTkRfTEVWRUwgLyAzMjc2OC4wZjsKLSAgICAgICAgICAgIHBJbnB1dEJ1ZmZbMiAqIGkgKyAxXSA9IChMVk1fRkxPQVQpcEluWzIgKiBpICsgMV0gKiBSRVZFUkJfU0VORF9MRVZFTCAvIDMyNzY4LjBmOworICAgICAgICAgICAgcENvbnRleHQtPkluRnJhbWVzWzIgKiBpXSA9CisgICAgICAgICAgICAgICAgICAgIChwcm9jZXNzX2J1ZmZlcl90KXBJblsyICogaV0gKiBSRVZFUkJfU0VORF9MRVZFTCAvIDMyNzY4LjBmOworICAgICAgICAgICAgcENvbnRleHQtPkluRnJhbWVzWzIgKiBpICsgMV0gPQorICAgICAgICAgICAgICAgICAgICAocHJvY2Vzc19idWZmZXJfdClwSW5bMiAqIGkgKyAxXSAqIFJFVkVSQl9TRU5EX0xFVkVMIC8gMzI3NjguMGY7CisjZW5kaWYKKyNlbHNlCisgICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXNbMippXSA9IChwSW5bMippXSAqIFJFVkVSQl9TRU5EX0xFVkVMKSA+PiA0OyAvLyA8PDggKyA+PjEyCisgICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXNbMippKzFdID0gKHBJblsyKmkrMV0gKiBSRVZFUkJfU0VORF9MRVZFTCkgPj4gNDsgLy8gPDw4ICsgPj4xMgogI2VuZGlmCiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAocENvbnRleHQtPnByZXNldCAmJiBwQ29udGV4dC0+Y3VyUHJlc2V0ID09IFJFVkVSQl9QUkVTRVRfTk9ORSkgewotI2lmZGVmIEJVSUxEX0ZMT0FUCi0gICAgICAgIG1lbXNldChwT3V0cHV0QnVmZiwgMCwgZnJhbWVDb3VudCAqIHNpemVvZihMVk1fRkxPQVQpICogMik7IC8vYWx3YXlzIHN0ZXJlbyBoZXJlCi0jZWxzZQotICAgICAgICBtZW1zZXQocENvbnRleHQtPk91dEZyYW1lczMyLCAwLCBmcmFtZUNvdW50ICogc2l6ZW9mKExWTV9JTlQzMikgKiAyKTsgLy9hbHdheXMgc3RlcmVvIGhlcmUKLSNlbmRpZgorICAgICAgICBtZW1zZXQocENvbnRleHQtPk91dEZyYW1lcywgMCwKKyAgICAgICAgICAgICAgICBmcmFtZUNvdW50ICogc2l6ZW9mKCpwQ29udGV4dC0+T3V0RnJhbWVzKSAqIEZDQ18yKTsgLy9hbHdheXMgc3RlcmVvIGhlcmUKICAgICB9IGVsc2UgewogICAgICAgICBpZihwQ29udGV4dC0+YkVuYWJsZWQgPT0gTFZNX0ZBTFNFICYmIHBDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnQgPiAwKSB7Ci0jaWZkZWYgQlVJTERfRkxPQVQKLSAgICAgICAgICAgIG1lbXNldChwSW5wdXRCdWZmLCAwLCBmcmFtZUNvdW50ICogc2l6ZW9mKExWTV9GTE9BVCkgKiBzYW1wbGVzUGVyRnJhbWUpOwotI2Vsc2UKLSAgICAgICAgICAgIG1lbXNldChwQ29udGV4dC0+SW5GcmFtZXMzMiwwLGZyYW1lQ291bnQgKiBzaXplb2YoTFZNX0lOVDMyKSAqIHNhbXBsZXNQZXJGcmFtZSk7Ci0jZW5kaWYKLSAgICAgICAgICAgIEFMT0dWKCJcdFplcm9pbmcgJWQgc2FtcGxlcyBwZXIgZnJhbWUgYXQgdGhlIGVuZCBvZiBjYWxsIiwgc2FtcGxlc1BlckZyYW1lKTsKKyAgICAgICAgICAgIG1lbXNldChwQ29udGV4dC0+SW5GcmFtZXMsIDAsCisgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQgKiBzaXplb2YoKnBDb250ZXh0LT5PdXRGcmFtZXMpICogY2hhbm5lbHMpOworICAgICAgICAgICAgQUxPR1YoIlx0WmVyb2luZyAlZCBzYW1wbGVzIHBlciBmcmFtZSBhdCB0aGUgZW5kIG9mIGNhbGwiLCBjaGFubmVscyk7CiAgICAgICAgIH0KIAogICAgICAgICAvKiBQcm9jZXNzIHRoZSBzYW1wbGVzLCBwcm9kdWNpbmcgYSBzdGVyZW8gb3V0cHV0ICovCi0jaWZkZWYgQlVJTERfRkxPQVQKICAgICAgICAgTHZtU3RhdHVzID0gTFZSRVZfUHJvY2VzcyhwQ29udGV4dC0+aEluc3RhbmNlLCAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnB1dEJ1ZmYsICAgICAvKiBJbnB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0QnVmZiwgICAgLyogT3V0cHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lcywgICAgIC8qIElucHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5PdXRGcmFtZXMsICAgIC8qIE91dHB1dCBidWZmZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50KTsgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHJlYWQgKi8KLSNlbHNlCi0gICAgICAgIEx2bVN0YXR1cyA9IExWUkVWX1Byb2Nlc3MocENvbnRleHQtPmhJbnN0YW5jZSwgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXMzMiwgICAgIC8qIElucHV0IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5PdXRGcmFtZXMzMiwgICAgLyogT3V0cHV0IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQpOyAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcmVhZCAqLwotI2VuZGlmCi0gICAgICAgIH0KKyAgICB9CiAKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfUHJvY2VzcyIsICJwcm9jZXNzIikKICAgICBpZihMdm1TdGF0dXMgIT0gTFZSRVZfU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CkBAIC01ODYsNTUgKzQ3Miw4NyBAQAogICAgIC8vIENvbnZlcnQgdG8gMTYgYml0cwogICAgIGlmIChwQ29udGV4dC0+YXV4aWxpYXJ5KSB7CiAjaWZkZWYgQlVJTERfRkxPQVQKLSAgICAgICAgRmxvYXRUb0ludDE2X1NBVChwT3V0cHV0QnVmZiwgT3V0RnJhbWVzMTYsIChzaXplX3QpZnJhbWVDb3VudCAqIDIpOwotI2Vsc2UKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgZnJhbWVDb3VudCoyOyBpKyspIHsgLy9hbHdheXMgc3RlcmVvIGhlcmUKLSAgICAgICAgICAgIE91dEZyYW1lczE2W2ldID0gY2xhbXAxNihwQ29udGV4dC0+T3V0RnJhbWVzMzJbaV0+PjgpOwotICAgICAgICB9CisgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZQorI2lmbmRlZiBOQVRJVkVfRkxPQVRfQlVGRkVSCisgICAgICAgIC8vIHBDb250ZXh0LT5PdXRGcmFtZXMgYW5kIE91dEZyYW1lczE2IHBvaW50IHRvIHRoZSBzYW1lIGJ1ZmZlcgorICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGZsb2F0IHRvIGludCBjb252ZXJzaW9uIGhhcHBlbnMgaW4gdGhlIHJpZ2h0IG9yZGVyLgorICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQoT3V0RnJhbWVzMTYsIHBDb250ZXh0LT5PdXRGcmFtZXMsCisgICAgICAgICAgICAgICAgKHNpemVfdClmcmFtZUNvdW50ICogRkNDXzIpOwogI2VuZGlmCi0gICAgICAgIH0gZWxzZSB7Ci0jaWZkZWYgQlVJTERfRkxPQVQKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudCAqIDI7IGkrKykgey8vYWx3YXlzIHN0ZXJlbyBoZXJlCi0gICAgICAgICAgICAgICAgLy9wT3V0cHV0QnVmZiBhbmQgT3V0RnJhbWVzMTYgcG9pbnQgdG8gdGhlIHNhbWUgYnVmZmVyLCBzbyBiZXR0ZXIgdG8KLSAgICAgICAgICAgICAgICAvL2FjY3VtdWxhdGUgaW4gcElucHV0QnVmZiwgd2hpY2ggaXMgYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgcElucHV0QnVmZltpXSA9IHBPdXRwdXRCdWZmW2ldICsgKExWTV9GTE9BVClwSW5baV0gLyAzMjc2OC4wZjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRmxvYXRUb0ludDE2X1NBVChwSW5wdXRCdWZmLCBPdXRGcmFtZXMxNiwgKHNpemVfdClmcmFtZUNvdW50ICogMik7CiAjZWxzZQotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgZnJhbWVDb3VudCoyOyBpKyspIHsgLy9hbHdheXMgc3RlcmVvIGhlcmUKLSAgICAgICAgICAgICAgICBPdXRGcmFtZXMxNltpXSA9IGNsYW1wMTYoKHBDb250ZXh0LT5PdXRGcmFtZXMzMltpXT4+OCkgKyAoTFZNX0lOVDMyKXBJbltpXSk7Ci0gICAgICAgICAgICB9CisgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9xNF8yNyhPdXRGcmFtZXMxNiwgcENvbnRleHQtPk91dEZyYW1lcywgKHNpemVfdClmcmFtZUNvdW50ICogRkNDXzIpOworI2VuZGlmCisgICAgfSBlbHNlIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorI2lmZGVmIE5BVElWRV9GTE9BVF9CVUZGRVIKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50ICogRkNDXzI7IGkrKykgeyAvLyBhbHdheXMgc3RlcmVvIGhlcmUKKyAgICAgICAgICAgIC8vIE1peCB3aXRoIGRyeSBpbnB1dAorICAgICAgICAgICAgcENvbnRleHQtPk91dEZyYW1lc1tpXSArPSBwSW5baV07CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudCAqIEZDQ18yOyBpKyspIHsgLy8gYWx3YXlzIHN0ZXJlbyBoZXJlCisgICAgICAgICAgICAvLyBwT3V0cHV0QnVmZiBhbmQgT3V0RnJhbWVzMTYgcG9pbnQgdG8gdGhlIHNhbWUgYnVmZmVyCisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGZsb2F0IHRvIGludCBjb252ZXJzaW9uIGhhcHBlbnMgaW4gdGhlIHJpZ2h0IG9yZGVyLgorICAgICAgICAgICAgcENvbnRleHQtPk91dEZyYW1lc1tpXSArPSAocHJvY2Vzc19idWZmZXJfdClwSW5baV0gLyAzMjc2OC4wZjsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQoT3V0RnJhbWVzMTYsIHBDb250ZXh0LT5PdXRGcmFtZXMsCisgICAgICAgICAgICAgICAgKHNpemVfdClmcmFtZUNvdW50ICogRkNDXzIpOworI2VuZGlmCisjZWxzZQorICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBmcmFtZUNvdW50ICogRkNDXzI7IGkrKykgeyAvLyBhbHdheXMgc3RlcmVvIGhlcmUKKyAgICAgICAgICAgIE91dEZyYW1lczE2W2ldID0gY2xhbXAxNigocENvbnRleHQtPk91dEZyYW1lc1tpXT4+OCkgKyAocHJvY2Vzc19idWZmZXJfdClwSW5baV0pOworICAgICAgICB9CiAjZW5kaWYKICAgICAgICAgLy8gYXBwbHkgdm9sdW1lIHdpdGggcmFtcCBpZiBuZWVkZWQKICAgICAgICAgaWYgKChwQ29udGV4dC0+bGVmdFZvbHVtZSAhPSBwQ29udGV4dC0+cHJldkxlZnRWb2x1bWUgfHwKICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cmlnaHRWb2x1bWUgIT0gcENvbnRleHQtPnByZXZSaWdodFZvbHVtZSkgJiYKICAgICAgICAgICAgICAgICBwQ29udGV4dC0+dm9sdW1lTW9kZSA9PSBSRVZFUkJfVk9MVU1FX1JBTVApIHsKKyNpZiBkZWZpbmVkIChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZCAoTkFUSVZFX0ZMT0FUX0JVRkZFUikKKyAgICAgICAgICAgIC8vIEZJWE1FOiBzdGlsbCB1c2luZyBpbnQxNiB2b2x1bWVzLgorICAgICAgICAgICAgLy8gRm9yIHJlZmVyZW5jZTogUkVWRVJCX1VOSVRfVk9MVU1FICAoMHgxMDAwKSAvLyAxLjAgaW4gNC4xMiBmb3JtYXQKKyAgICAgICAgICAgIGZsb2F0IHZsID0gKGZsb2F0KXBDb250ZXh0LT5wcmV2TGVmdFZvbHVtZSAvIDQwOTY7CisgICAgICAgICAgICBmbG9hdCBpbmNsID0gKCgoZmxvYXQpcENvbnRleHQtPmxlZnRWb2x1bWUgLyA0MDk2KSAtIHZsKSAvIGZyYW1lQ291bnQ7CisgICAgICAgICAgICBmbG9hdCB2ciA9IChmbG9hdClwQ29udGV4dC0+cHJldlJpZ2h0Vm9sdW1lIC8gNDA5NjsKKyAgICAgICAgICAgIGZsb2F0IGluY3IgPSAoKChmbG9hdClwQ29udGV4dC0+cmlnaHRWb2x1bWUgLyA0MDk2KSAtIHZyKSAvIGZyYW1lQ291bnQ7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcENvbnRleHQtPk91dEZyYW1lc1tGQ0NfMiAqIGldICo9IHZsOworICAgICAgICAgICAgICAgIHBDb250ZXh0LT5PdXRGcmFtZXNbRkNDXzIgKiBpICsgMV0gKj0gdnI7CisKKyAgICAgICAgICAgICAgICB2bCArPSBpbmNsOworICAgICAgICAgICAgICAgIHZyICs9IGluY3I7CisgICAgICAgICAgICB9CisjZWxzZQogICAgICAgICAgICAgTFZNX0lOVDMyIHZsID0gKExWTV9JTlQzMilwQ29udGV4dC0+cHJldkxlZnRWb2x1bWUgPDwgMTY7CiAgICAgICAgICAgICBMVk1fSU5UMzIgaW5jbCA9ICgoKExWTV9JTlQzMilwQ29udGV4dC0+bGVmdFZvbHVtZSA8PCAxNikgLSB2bCkgLyBmcmFtZUNvdW50OwogICAgICAgICAgICAgTFZNX0lOVDMyIHZyID0gKExWTV9JTlQzMilwQ29udGV4dC0+cHJldlJpZ2h0Vm9sdW1lIDw8IDE2OwogICAgICAgICAgICAgTFZNX0lOVDMyIGluY3IgPSAoKChMVk1fSU5UMzIpcENvbnRleHQtPnJpZ2h0Vm9sdW1lIDw8IDE2KSAtIHZyKSAvIGZyYW1lQ291bnQ7CiAKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgT3V0RnJhbWVzMTZbMippXSA9CisgICAgICAgICAgICAgICAgT3V0RnJhbWVzMTZbRkNDXzIgKiBpXSA9CiAgICAgICAgICAgICAgICAgICAgICAgICBjbGFtcDE2KChMVk1fSU5UMzIpKCh2bCA+PiAxNikgKiBPdXRGcmFtZXMxNlsyKmldKSA+PiAxMik7Ci0gICAgICAgICAgICAgICAgT3V0RnJhbWVzMTZbMippKzFdID0KKyAgICAgICAgICAgICAgICBPdXRGcmFtZXMxNltGQ0NfMiAqIGkgKyAxXSA9CiAgICAgICAgICAgICAgICAgICAgICAgICBjbGFtcDE2KChMVk1fSU5UMzIpKCh2ciA+PiAxNikgKiBPdXRGcmFtZXMxNlsyKmkrMV0pID4+IDEyKTsKIAogICAgICAgICAgICAgICAgIHZsICs9IGluY2w7CiAgICAgICAgICAgICAgICAgdnIgKz0gaW5jcjsKICAgICAgICAgICAgIH0KLQorI2VuZGlmCiAgICAgICAgICAgICBwQ29udGV4dC0+cHJldkxlZnRWb2x1bWUgPSBwQ29udGV4dC0+bGVmdFZvbHVtZTsKICAgICAgICAgICAgIHBDb250ZXh0LT5wcmV2UmlnaHRWb2x1bWUgPSBwQ29udGV4dC0+cmlnaHRWb2x1bWU7CiAgICAgICAgIH0gZWxzZSBpZiAocENvbnRleHQtPnZvbHVtZU1vZGUgIT0gUkVWRVJCX1ZPTFVNRV9PRkYpIHsKICAgICAgICAgICAgIGlmIChwQ29udGV4dC0+bGVmdFZvbHVtZSAhPSBSRVZFUkJfVU5JVF9WT0xVTUUgfHwKICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cmlnaHRWb2x1bWUgIT0gUkVWRVJCX1VOSVRfVk9MVU1FKSB7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgT3V0RnJhbWVzMTZbMippXSA9CisjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChOQVRJVkVfRkxPQVRfQlVGRkVSKQorICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+T3V0RnJhbWVzW0ZDQ18yICogaV0gKj0gKChmbG9hdClwQ29udGV4dC0+bGVmdFZvbHVtZSAvIDQwOTYpOworICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+T3V0RnJhbWVzW0ZDQ18yICogaSArIDFdICo9ICgoZmxvYXQpcENvbnRleHQtPnJpZ2h0Vm9sdW1lIC8gNDA5Nik7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICBPdXRGcmFtZXMxNltGQ0NfMiAqIGldID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFtcDE2KChMVk1fSU5UMzIpKHBDb250ZXh0LT5sZWZ0Vm9sdW1lICogT3V0RnJhbWVzMTZbMippXSkgPj4gMTIpOwotICAgICAgICAgICAgICAgICAgICBPdXRGcmFtZXMxNlsyKmkrMV0gPQorICAgICAgICAgICAgICAgICAgICBPdXRGcmFtZXMxNltGQ0NfMiAqIGkgKyAxXSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhbXAxNigoTFZNX0lOVDMyKShwQ29udGV4dC0+cmlnaHRWb2x1bWUgKiBPdXRGcmFtZXMxNlsyKmkrMV0pID4+IDEyKTsKKyNlbmRpZgogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBDb250ZXh0LT5wcmV2TGVmdFZvbHVtZSA9IHBDb250ZXh0LT5sZWZ0Vm9sdW1lOwpAQCAtNjQzLDIwICs1NjEsMjUgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgICNpZmRlZiBMVk1fUENNCi0gICAgZndyaXRlKE91dEZyYW1lczE2LCBmcmFtZUNvdW50KnNpemVvZihMVk1fSU5UMTYpKjIsIDEsIHBDb250ZXh0LT5QY21PdXRQdHIpOworI2lmZGVmIExWTV9QQ00KKyAgICBmd3JpdGUocENvbnRleHQtPk91dEZyYW1lcywgZnJhbWVDb3VudCAqIHNpemVvZigqcENvbnRleHQtPk91dEZyYW1lcykgKiBGQ0NfMiwKKyAgICAgICAgICAgIDEgLyogbm1lbWIgKi8sIHBDb250ZXh0LT5QY21PdXRQdHIpOwogICAgIGZmbHVzaChwQ29udGV4dC0+UGNtT3V0UHRyKTsKLSAgICAjZW5kaWYKKyNlbmRpZgogCiAgICAgLy8gQWNjdW11bGF0ZSBpZiByZXF1aXJlZAogICAgIGlmIChwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpewogICAgICAgICAvL0FMT0dWKCJcdEJ1ZmZlciBhY2Nlc3MgaXMgQUNDVU1VTEFURSIpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8ZnJhbWVDb3VudCoyOyBpKyspeyAvL2Fsd2F5cyBzdGVyZW8gaGVyZQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQgKiBGQ0NfMjsgaSsrKSB7IC8vIGFsd2F5cyBzdGVyZW8gaGVyZQorI2lmbmRlZiBOQVRJVkVfRkxPQVRfQlVGRkVSCiAgICAgICAgICAgICBwT3V0W2ldID0gY2xhbXAxNigoaW50MzJfdClwT3V0W2ldICsgKGludDMyX3QpT3V0RnJhbWVzMTZbaV0pOworI2Vsc2UKKyAgICAgICAgICAgIHBPdXRbaV0gKz0gcENvbnRleHQtPk91dEZyYW1lc1tpXTsKKyNlbmRpZgogICAgICAgICB9CiAgICAgfWVsc2V7CiAgICAgICAgIC8vQUxPR1YoIlx0QnVmZmVyIGFjY2VzcyBpcyBXUklURSIpOwotICAgICAgICBtZW1jcHkocE91dCwgT3V0RnJhbWVzMTYsIGZyYW1lQ291bnQqc2l6ZW9mKExWTV9JTlQxNikqMik7CisgICAgICAgIG1lbWNweShwT3V0LCBwQ29udGV4dC0+T3V0RnJhbWVzLCBmcmFtZUNvdW50ICogc2l6ZW9mKCpwT3V0KSAqIEZDQ18yKTsKICAgICB9CiAKICAgICByZXR1cm4gMDsKQEAgLTczMyw4ICs2NTYsNyBAQAogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKTsKICAgICBDSEVDS19BUkcocENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUKICAgICAgICAgICAgICAgfHwgcENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSk7Ci0gICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCk7Ci0KKyAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID09IEVGRkVDVF9CVUZGRVJfRk9STUFUKTsKICAgICAvL0FMT0dWKCJcdFJldmVyYl9zZXRDb25maWcgY2FsbGluZyBtZW1jcHkiKTsKICAgICBwQ29udGV4dC0+Y29uZmlnID0gKnBDb25maWc7CiAKQEAgLTg0Nyw4ICs3NjksNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgICAgICAgICAgICAgICAgICA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKICAgICB9Ci0KLSAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5mb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9CVUZGRVJfRk9STUFUOwogICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlICAgICAgICAgICAgICAgICAgPSA0NDEwMDsKICAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciAgICAgID0gTlVMTDsKICAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgID0gTlVMTDsKQEAgLTg1Niw3ICs3NzcsNyBAQAogICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcubWFzayAgICAgICAgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQ09ORklHX0FMTDsKICAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlICAgICAgICAgICAgICAgICAgID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURTsKICAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyAgICAgICAgICAgICAgICAgICAgID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5mb3JtYXQgICAgICAgICAgICAgICAgICAgICAgID0gRUZGRUNUX0JVRkZFUl9GT1JNQVQ7CiAgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlICAgICAgICAgICAgICAgICA9IDQ0MTAwOwogICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciAgICAgPSBOVUxMOwogICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwpAQCAtMjAzMSwxNCArMTk1MiwyMiBAQAogICAgIH0KICAgICAvL0FMT0dWKCJcdFJldmVyYl9wcm9jZXNzKCkgQ2FsbGluZyBwcm9jZXNzIHdpdGggJWQgZnJhbWVzIiwgb3V0QnVmZmVyLT5mcmFtZUNvdW50KTsKICAgICAvKiBQcm9jZXNzIGFsbCB0aGUgYXZhaWxhYmxlIGZyYW1lcywgYmxvY2sgcHJvY2Vzc2luZyBpcyBoYW5kbGVkIGludGVybmFsTFkgYnkgdGhlIExWTSBidW5kbGUgKi8KLSAgICBzdGF0dXMgPSBwcm9jZXNzKCAgICAoTFZNX0lOVDE2ICopaW5CdWZmZXItPnJhdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopb3V0QnVmZmVyLT5yYXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQpOworI2lmIGRlZmluZWQgKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkIChOQVRJVkVfRkxPQVRfQlVGRkVSKQorICAgIHN0YXR1cyA9IHByb2Nlc3MoICAgIGluQnVmZmVyLT5mMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0KTsKKyNlbHNlCisgICAgc3RhdHVzID0gcHJvY2VzcyggICAgaW5CdWZmZXItPnMxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPnMxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQpOworI2VuZGlmCiAKICAgICBpZiAocENvbnRleHQtPmJFbmFibGVkID09IExWTV9GQUxTRSkgewogICAgICAgICBpZiAocENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudCA+IDApIHsKLSAgICAgICAgICAgIHBDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnQgLT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50OworICAgICAgICAgICAgLy8gc2lnbmVkIC0gdW5zaWduZWQgd2lsbCB0cmlnZ2VyIGludGVnZXIgb3ZlcmZsb3cgaWYgcmVzdWx0IGJlY29tZXMgbmVnYXRpdmUuCisgICAgICAgICAgICBwQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50IC09IChzc2l6ZV90KW91dEJ1ZmZlci0+ZnJhbWVDb3VudDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHN0YXR1cyA9IC1FTk9EQVRBOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAKaW5kZXggMGU4MjMzOS4uODA3ZjI0ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcApAQCAtNTk0LDcgKzU5NCw5IEBACiAgICAgICAgICAgICAgICAgICAgIGRlbHRhU21wbCA9IENBUFRVUkVfQlVGX1NJWkU7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaW50MzJfdCBjYXB0dXJlUG9pbnQgPSBwQ29udGV4dC0+bUNhcHR1cmVJZHggLSBkZWx0YVNtcGw7CisgICAgICAgICAgICAgICAgaW50MzJfdCBjYXB0dXJlUG9pbnQ7CisgICAgICAgICAgICAgICAgLy9jYXB0dXJlUG9pbnQgPSAoaW50MzJfdClwQ29udGV4dC0+bUNhcHR1cmVJZHggLSBkZWx0YVNtcGw7CisgICAgICAgICAgICAgICAgX19idWlsdGluX3N1Yl9vdmVyZmxvdygoaW50MzJfdClwQ29udGV4dC0+bUNhcHR1cmVJZHgsIGRlbHRhU21wbCwgJmNhcHR1cmVQb2ludCk7CiAgICAgICAgICAgICAgICAgLy8gYSBuZWdhdGl2ZSBjYXB0dXJlUG9pbnQgbWVhbnMgd2Ugd3JhcCB0aGUgYnVmZmVyLgogICAgICAgICAgICAgICAgIGlmIChjYXB0dXJlUG9pbnQgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUgPSAtY2FwdHVyZVBvaW50OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVpZi9IZWlmRGVjb2RlckltcGwuY3BwIGIvbWVkaWEvbGliaGVpZi9IZWlmRGVjb2RlckltcGwuY3BwCmluZGV4IDU3MjA5ZTIuLjAxZjAxNGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmNwcAorKysgYi9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5jcHAKQEAgLTIyLDExICsyMiwxMiBAQAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KICNpbmNsdWRlIDxkcm0vZHJtX2ZyYW1ld29ya19jb21tb24uaD4KICNpbmNsdWRlIDxtZWRpYS9JRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL1ZpZGVvRnJhbWUuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CkBAIC0yNzAsMTkgKzI3MSw0OSBAQAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKK3N0cnVjdCBIZWlmRGVjb2RlckltcGw6OkRlY29kZVRocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworICAgIGV4cGxpY2l0IERlY29kZVRocmVhZChIZWlmRGVjb2RlckltcGwgKmRlY29kZXIpIDogbURlY29kZXIoZGVjb2Rlcikge30KKworcHJpdmF0ZToKKyAgICBIZWlmRGVjb2RlckltcGwqIG1EZWNvZGVyOworCisgICAgYm9vbCB0aHJlYWRMb29wKCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEZWNvZGVUaHJlYWQpOworfTsKKworYm9vbCBIZWlmRGVjb2RlckltcGw6OkRlY29kZVRocmVhZDo6dGhyZWFkTG9vcCgpIHsKKyAgICByZXR1cm4gbURlY29kZXItPmRlY29kZUFzeW5jKCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwogSGVpZkRlY29kZXJJbXBsOjpIZWlmRGVjb2RlckltcGwoKSA6CiAgICAgLy8gb3V0cHV0IGNvbG9yIGZvcm1hdCBzaG91bGQgYWx3YXlzIGJlIHNldCB2aWEgc2V0T3V0cHV0Q29sb3IoKSwgaW4gY2FzZQogICAgIC8vIGl0J3Mgbm90LCBkZWZhdWx0IHRvIEhBTF9QSVhFTF9GT1JNQVRfUkdCXzU2NS4KICAgICBtT3V0cHV0Q29sb3IoSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1KSwKICAgICBtQ3VyU2NhbmxpbmUoMCksCi0gICAgbUZyYW1lRGVjb2RlZChmYWxzZSkgeworICAgIG1XaWR0aCgwKSwKKyAgICBtSGVpZ2h0KDApLAorICAgIG1GcmFtZURlY29kZWQoZmFsc2UpLAorICAgIG1IYXNJbWFnZShmYWxzZSksCisgICAgbUhhc1ZpZGVvKGZhbHNlKSwKKyAgICBtQXZhaWxhYmxlTGluZXMoMCksCisgICAgbU51bVNsaWNlcygxKSwKKyAgICBtU2xpY2VIZWlnaHQoMCksCisgICAgbUFzeW5jRGVjb2RlRG9uZShmYWxzZSkgewogfQogCiBIZWlmRGVjb2RlckltcGw6On5IZWlmRGVjb2RlckltcGwoKSB7CisgICAgaWYgKG1UaHJlYWQgIT0gbnVsbHB0cikgeworICAgICAgICBtVGhyZWFkLT5qb2luKCk7CisgICAgfQogfQogCiBib29sIEhlaWZEZWNvZGVySW1wbDo6aW5pdChIZWlmU3RyZWFtKiBzdHJlYW0sIEhlaWZGcmFtZUluZm8qIGZyYW1lSW5mbykgewogICAgIG1GcmFtZURlY29kZWQgPSBmYWxzZTsKKyAgICBtRnJhbWVNZW1vcnkuY2xlYXIoKTsKKwogICAgIHNwPEhlaWZEYXRhU291cmNlPiBkYXRhU291cmNlID0gbmV3IEhlaWZEYXRhU291cmNlKHN0cmVhbSk7CiAgICAgaWYgKCFkYXRhU291cmNlLT5pbml0KCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjkwLDcgKzMyMSw3IEBACiAgICAgbURhdGFTb3VyY2UgPSBkYXRhU291cmNlOwogCiAgICAgbVJldHJpZXZlciA9IG5ldyBNZWRpYU1ldGFkYXRhUmV0cmlldmVyKCk7Ci0gICAgc3RhdHVzX3QgZXJyID0gbVJldHJpZXZlci0+c2V0RGF0YVNvdXJjZShtRGF0YVNvdXJjZSwgInZpZGVvL21wNCIpOworICAgIHN0YXR1c190IGVyciA9IG1SZXRyaWV2ZXItPnNldERhdGFTb3VyY2UobURhdGFTb3VyY2UsICJpbWFnZS9oZWlmIik7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHNldCBkYXRhIHNvdXJjZSEiKTsKIApAQCAtMzAwLDIxICszMzEsMjggQEAKICAgICB9CiAgICAgQUxPR1YoInN1Y2Nlc3NmdWxseSBzZXQgZGF0YSBzb3VyY2UuIik7CiAKKyAgICBjb25zdCBjaGFyKiBoYXNJbWFnZSA9IG1SZXRyaWV2ZXItPmV4dHJhY3RNZXRhZGF0YShNRVRBREFUQV9LRVlfSEFTX0lNQUdFKTsKICAgICBjb25zdCBjaGFyKiBoYXNWaWRlbyA9IG1SZXRyaWV2ZXItPmV4dHJhY3RNZXRhZGF0YShNRVRBREFUQV9LRVlfSEFTX1ZJREVPKTsKLSAgICBpZiAoIWhhc1ZpZGVvIHx8IHN0cmNhc2VjbXAoaGFzVmlkZW8sICJ5ZXMiKSkgewotICAgICAgICBBTE9HRSgibm8gdmlkZW86ICVzIiwgaGFzVmlkZW8gPyBoYXNWaWRlbyA6ICJudWxsIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIG1IYXNJbWFnZSA9IGhhc0ltYWdlICYmICFzdHJjYXNlY21wKGhhc0ltYWdlLCAieWVzIik7CisgICAgbUhhc1ZpZGVvID0gaGFzVmlkZW8gJiYgIXN0cmNhc2VjbXAoaGFzVmlkZW8sICJ5ZXMiKTsKKyAgICBzcDxJTWVtb3J5PiBzaGFyZWRNZW07CisgICAgaWYgKG1IYXNJbWFnZSkgeworICAgICAgICAvLyBpbWFnZSBpbmRleCA8IDAgdG8gcmV0cmlldmUgcHJpbWFyeSBpbWFnZQorICAgICAgICBzaGFyZWRNZW0gPSBtUmV0cmlldmVyLT5nZXRJbWFnZUF0SW5kZXgoCisgICAgICAgICAgICAgICAgLTEsIG1PdXRwdXRDb2xvciwgdHJ1ZSAvKm1ldGFPbmx5Ki8pOworICAgIH0gZWxzZSBpZiAobUhhc1ZpZGVvKSB7CisgICAgICAgIHNoYXJlZE1lbSA9IG1SZXRyaWV2ZXItPmdldEZyYW1lQXRUaW1lKDAsCisgICAgICAgICAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMsCisgICAgICAgICAgICAgICAgbU91dHB1dENvbG9yLCB0cnVlIC8qbWV0YU9ubHkqLyk7CiAgICAgfQogCi0gICAgbUZyYW1lTWVtb3J5ID0gbVJldHJpZXZlci0+Z2V0RnJhbWVBdFRpbWUoMCwKLSAgICAgICAgICAgIElNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQywKLSAgICAgICAgICAgIG1PdXRwdXRDb2xvciwgdHJ1ZSAvKm1ldGFPbmx5Ki8pOwotICAgIGlmIChtRnJhbWVNZW1vcnkgPT0gbnVsbHB0ciB8fCBtRnJhbWVNZW1vcnktPnBvaW50ZXIoKSA9PSBudWxscHRyKSB7CisgICAgaWYgKHNoYXJlZE1lbSA9PSBudWxscHRyIHx8IHNoYXJlZE1lbS0+cG9pbnRlcigpID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoImdldEZyYW1lQXRUaW1lOiB2aWRlb0ZyYW1lIGlzIGEgbnVsbHB0ciIpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgVmlkZW9GcmFtZSogdmlkZW9GcmFtZSA9IHN0YXRpY19jYXN0PFZpZGVvRnJhbWUqPihtRnJhbWVNZW1vcnktPnBvaW50ZXIoKSk7CisgICAgVmlkZW9GcmFtZSogdmlkZW9GcmFtZSA9IHN0YXRpY19jYXN0PFZpZGVvRnJhbWUqPihzaGFyZWRNZW0tPnBvaW50ZXIoKSk7CiAKICAgICBBTE9HVigiTWV0YSBkaW1lbnNpb24gJWR4JWQsIGRpc3BsYXkgJWR4JWQsIGFuZ2xlICVkLCBpY2NTaXplICVkIiwKICAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1XaWR0aCwKQEAgLTMzMyw2ICszNzEsMTQgQEAKICAgICAgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tSWNjU2l6ZSwKICAgICAgICAgICAgICAgICB2aWRlb0ZyYW1lLT5nZXRGbGF0dGVuZWRJY2NEYXRhKCkpOwogICAgIH0KKyAgICBtV2lkdGggPSB2aWRlb0ZyYW1lLT5tV2lkdGg7CisgICAgbUhlaWdodCA9IHZpZGVvRnJhbWUtPm1IZWlnaHQ7CisgICAgaWYgKG1IYXNJbWFnZSAmJiB2aWRlb0ZyYW1lLT5tVGlsZUhlaWdodCA+PSA1MTIgJiYgbVdpZHRoID49IDMwMDAgJiYgbUhlaWdodCA+PSAyMDAwICkgeworICAgICAgICAvLyBUcnkgZGVjb2RpbmcgaW4gc2xpY2VzIG9ubHkgaWYgdGhlIGltYWdlIGhhcyB0aWxlcyBhbmQgaXMgYmlnIGVub3VnaC4KKyAgICAgICAgbVNsaWNlSGVpZ2h0ID0gdmlkZW9GcmFtZS0+bVRpbGVIZWlnaHQ7CisgICAgICAgIG1OdW1TbGljZXMgPSAodmlkZW9GcmFtZS0+bUhlaWdodCArIG1TbGljZUhlaWdodCAtIDEpIC8gbVNsaWNlSGVpZ2h0OworICAgICAgICBBTE9HVigibVNsaWNlSGVpZ2h0ICV1LCBtTnVtU2xpY2VzICV6dSIsIG1TbGljZUhlaWdodCwgbU51bVNsaWNlcyk7CisgICAgfQogICAgIHJldHVybiB0cnVlOwogfQogCkBAIC0zNjUsNiArNDExLDM2IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCitib29sIEhlaWZEZWNvZGVySW1wbDo6ZGVjb2RlQXN5bmMoKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBtTnVtU2xpY2VzOyBpKyspIHsKKyAgICAgICAgQUxPR1YoImRlY29kZUFzeW5jKCk6IGRlY29kaW5nIHNsaWNlICV6dSIsIGkpOworICAgICAgICBzaXplX3QgdG9wID0gaSAqIG1TbGljZUhlaWdodDsKKyAgICAgICAgc2l6ZV90IGJvdHRvbSA9IChpICsgMSkgKiBtU2xpY2VIZWlnaHQ7CisgICAgICAgIGlmIChib3R0b20gPiBtSGVpZ2h0KSB7CisgICAgICAgICAgICBib3R0b20gPSBtSGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHNwPElNZW1vcnk+IGZyYW1lTWVtb3J5ID0gbVJldHJpZXZlci0+Z2V0SW1hZ2VSZWN0QXRJbmRleCgKKyAgICAgICAgICAgICAgICAtMSwgbU91dHB1dENvbG9yLCAwLCB0b3AsIG1XaWR0aCwgYm90dG9tKTsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKKworICAgICAgICAgICAgaWYgKGZyYW1lTWVtb3J5ID09IG51bGxwdHIgfHwgZnJhbWVNZW1vcnktPnBvaW50ZXIoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgbUFzeW5jRGVjb2RlRG9uZSA9IHRydWU7CisgICAgICAgICAgICAgICAgbVNjYW5saW5lUmVhZHkuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRnJhbWVNZW1vcnkgPSBmcmFtZU1lbW9yeTsKKyAgICAgICAgICAgIG1BdmFpbGFibGVMaW5lcyA9IGJvdHRvbTsKKyAgICAgICAgICAgIEFMT0dWKCJkZWNvZGVBc3luYygpOiBhdmFpbGFibGUgbGluZXMgJXp1IiwgbUF2YWlsYWJsZUxpbmVzKTsKKyAgICAgICAgICAgIG1TY2FubGluZVJlYWR5LnNpZ25hbCgpOworICAgICAgICB9CisgICAgfQorICAgIC8vIEFnZ3Jlc3NpdmUgY2xlYXIgdG8gYXZvaWQgaG9sZGluZyBvbiB0byByZXNvdXJjZXMKKyAgICBtUmV0cmlldmVyLmNsZWFyKCk7CisgICAgbURhdGFTb3VyY2UuY2xlYXIoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIGJvb2wgSGVpZkRlY29kZXJJbXBsOjpkZWNvZGUoSGVpZkZyYW1lSW5mbyogZnJhbWVJbmZvKSB7CiAgICAgLy8gcmVzZXQgc2NhbmxpbmUgcG9pbnRlcgogICAgIG1DdXJTY2FubGluZSA9IDA7CkBAIC0zNzMsMTcgKzQ0OSw2NCBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBtRnJhbWVNZW1vcnkgPSBtUmV0cmlldmVyLT5nZXRGcmFtZUF0VGltZSgwLAotICAgICAgICAgICAgSU1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DLCBtT3V0cHV0Q29sb3IpOworICAgIC8vIFNlZSBpZiB3ZSB3YW50IHRvIGRlY29kZSBpbiBzbGljZXMgdG8gYWxsb3cgY2xpZW50IHRvIHN0YXJ0CisgICAgLy8gc2NhbmxpbmUgcHJvY2Vzc2luZyBpbiBwYXJhbGxlbCB3aXRoIGRlY29kZS4gSWYgdGhpcyBmYWlscworICAgIC8vIHdlIGZhbGxiYWNrIHRvIGRlY29kaW5nIHRoZSBmdWxsIGZyYW1lLgorICAgIGlmIChtSGFzSW1hZ2UgJiYgbU51bVNsaWNlcyA+IDEpIHsKKyAgICAgICAgLy8gZ2V0IGZpcnN0IHNsaWNlIGFuZCBtZXRhZGF0YQorICAgICAgICBzcDxJTWVtb3J5PiBmcmFtZU1lbW9yeSA9IG1SZXRyaWV2ZXItPmdldEltYWdlUmVjdEF0SW5kZXgoCisgICAgICAgICAgICAgICAgLTEsIG1PdXRwdXRDb2xvciwgMCwgMCwgbVdpZHRoLCBtU2xpY2VIZWlnaHQpOworCisgICAgICAgIGlmIChmcmFtZU1lbW9yeSA9PSBudWxscHRyIHx8IGZyYW1lTWVtb3J5LT5wb2ludGVyKCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoImRlY29kZTogbWV0YWRhdGEgaXMgYSBudWxscHRyIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBWaWRlb0ZyYW1lKiB2aWRlb0ZyYW1lID0gc3RhdGljX2Nhc3Q8VmlkZW9GcmFtZSo+KGZyYW1lTWVtb3J5LT5wb2ludGVyKCkpOworCisgICAgICAgIGlmIChmcmFtZUluZm8gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZnJhbWVJbmZvLT5zZXQoCisgICAgICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgdmlkZW9GcmFtZS0+bUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgdmlkZW9GcmFtZS0+bVJvdGF0aW9uQW5nbGUsCisgICAgICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPm1CeXRlc1BlclBpeGVsLAorICAgICAgICAgICAgICAgICAgICB2aWRlb0ZyYW1lLT5tSWNjU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgdmlkZW9GcmFtZS0+Z2V0RmxhdHRlbmVkSWNjRGF0YSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIG1GcmFtZU1lbW9yeSA9IGZyYW1lTWVtb3J5OworICAgICAgICBtQXZhaWxhYmxlTGluZXMgPSBtU2xpY2VIZWlnaHQ7CisgICAgICAgIG1UaHJlYWQgPSBuZXcgRGVjb2RlVGhyZWFkKHRoaXMpOworICAgICAgICBpZiAobVRocmVhZC0+cnVuKCJIZWlmRGVjb2RlIiwgQU5EUk9JRF9QUklPUklUWV9GT1JFR1JPVU5EKSA9PSBPSykgeworICAgICAgICAgICAgbUZyYW1lRGVjb2RlZCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZhbGxiYWNrIHRvIGRlY29kZSB3aXRob3V0IHNsaWNpbmcKKyAgICAgICAgbVRocmVhZC5jbGVhcigpOworICAgICAgICBtTnVtU2xpY2VzID0gMTsKKyAgICAgICAgbVNsaWNlSGVpZ2h0ID0gMDsKKyAgICAgICAgbUF2YWlsYWJsZUxpbmVzID0gMDsKKyAgICAgICAgbUZyYW1lTWVtb3J5LmNsZWFyKCk7CisgICAgfQorCisgICAgaWYgKG1IYXNJbWFnZSkgeworICAgICAgICAvLyBpbWFnZSBpbmRleCA8IDAgdG8gcmV0cmlldmUgcHJpbWFyeSBpbWFnZQorICAgICAgICBtRnJhbWVNZW1vcnkgPSBtUmV0cmlldmVyLT5nZXRJbWFnZUF0SW5kZXgoLTEsIG1PdXRwdXRDb2xvcik7CisgICAgfSBlbHNlIGlmIChtSGFzVmlkZW8pIHsKKyAgICAgICAgbUZyYW1lTWVtb3J5ID0gbVJldHJpZXZlci0+Z2V0RnJhbWVBdFRpbWUoMCwKKyAgICAgICAgICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQywgbU91dHB1dENvbG9yKTsKKyAgICB9CisKICAgICBpZiAobUZyYW1lTWVtb3J5ID09IG51bGxwdHIgfHwgbUZyYW1lTWVtb3J5LT5wb2ludGVyKCkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiZ2V0RnJhbWVBdFRpbWU6IHZpZGVvRnJhbWUgaXMgYSBudWxscHRyIik7CisgICAgICAgIEFMT0dFKCJkZWNvZGU6IHZpZGVvRnJhbWUgaXMgYSBudWxscHRyIik7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBWaWRlb0ZyYW1lKiB2aWRlb0ZyYW1lID0gc3RhdGljX2Nhc3Q8VmlkZW9GcmFtZSo+KG1GcmFtZU1lbW9yeS0+cG9pbnRlcigpKTsKICAgICBpZiAodmlkZW9GcmFtZS0+bVNpemUgPT0gMCB8fAogICAgICAgICAgICAgbUZyYW1lTWVtb3J5LT5zaXplKCkgPCB2aWRlb0ZyYW1lLT5nZXRGbGF0dGVuZWRTaXplKCkpIHsKLSAgICAgICAgQUxPR0UoImdldEZyYW1lQXRUaW1lOiB2aWRlb0ZyYW1lIHNpemUgaXMgaW52YWxpZCIpOworICAgICAgICBBTE9HRSgiZGVjb2RlOiB2aWRlb0ZyYW1lIHNpemUgaXMgaW52YWxpZCIpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC00MDcsMzYgKzUzMCw0NSBAQAogICAgIH0KICAgICBtRnJhbWVEZWNvZGVkID0gdHJ1ZTsKIAotICAgIC8vIEFnZ3Jlc3NpdmUgY2xlYXIgdG8gYXZvaWQgaG9sZGluZyBvbiB0byByZXNvdXJjZXMKKyAgICAvLyBBZ2dyZXNzaXZlbHkgY2xlYXIgdG8gYXZvaWQgaG9sZGluZyBvbiB0byByZXNvdXJjZXMKICAgICBtUmV0cmlldmVyLmNsZWFyKCk7CiAgICAgbURhdGFTb3VyY2UuY2xlYXIoKTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBIZWlmRGVjb2RlckltcGw6OmdldFNjYW5saW5lKHVpbnQ4X3QqIGRzdCkgeworYm9vbCBIZWlmRGVjb2RlckltcGw6OmdldFNjYW5saW5lSW5uZXIodWludDhfdCogZHN0KSB7CiAgICAgaWYgKG1GcmFtZU1lbW9yeSA9PSBudWxscHRyIHx8IG1GcmFtZU1lbW9yeS0+cG9pbnRlcigpID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBWaWRlb0ZyYW1lKiB2aWRlb0ZyYW1lID0gc3RhdGljX2Nhc3Q8VmlkZW9GcmFtZSo+KG1GcmFtZU1lbW9yeS0+cG9pbnRlcigpKTsKLSAgICBpZiAobUN1clNjYW5saW5lID49IHZpZGVvRnJhbWUtPm1IZWlnaHQpIHsKLSAgICAgICAgQUxPR0UoIm5vIG1vcmUgc2NhbmxpbmUgYXZhaWxhYmxlIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9CiAgICAgdWludDhfdCogc3JjID0gdmlkZW9GcmFtZS0+Z2V0RmxhdHRlbmVkRGF0YSgpICsgdmlkZW9GcmFtZS0+bVJvd0J5dGVzICogbUN1clNjYW5saW5lKys7CiAgICAgbWVtY3B5KGRzdCwgc3JjLCB2aWRlb0ZyYW1lLT5tQnl0ZXNQZXJQaXhlbCAqIHZpZGVvRnJhbWUtPm1XaWR0aCk7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXNpemVfdCBIZWlmRGVjb2RlckltcGw6OnNraXBTY2FubGluZXMoc2l6ZV90IGNvdW50KSB7Ci0gICAgaWYgKG1GcmFtZU1lbW9yeSA9PSBudWxscHRyIHx8IG1GcmFtZU1lbW9yeS0+cG9pbnRlcigpID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIDA7Citib29sIEhlaWZEZWNvZGVySW1wbDo6Z2V0U2NhbmxpbmUodWludDhfdCogZHN0KSB7CisgICAgaWYgKG1DdXJTY2FubGluZSA+PSBtSGVpZ2h0KSB7CisgICAgICAgIEFMT0dFKCJubyBtb3JlIHNjYW5saW5lIGF2YWlsYWJsZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIFZpZGVvRnJhbWUqIHZpZGVvRnJhbWUgPSBzdGF0aWNfY2FzdDxWaWRlb0ZyYW1lKj4obUZyYW1lTWVtb3J5LT5wb2ludGVyKCkpOwogCisgICAgaWYgKG1OdW1TbGljZXMgPiAxKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CisKKyAgICAgICAgd2hpbGUgKCFtQXN5bmNEZWNvZGVEb25lICYmIG1DdXJTY2FubGluZSA+PSBtQXZhaWxhYmxlTGluZXMpIHsKKyAgICAgICAgICAgIG1TY2FubGluZVJlYWR5LndhaXQobUxvY2spOworICAgICAgICB9CisgICAgICAgIHJldHVybiAobUN1clNjYW5saW5lIDwgbUF2YWlsYWJsZUxpbmVzKSA/IGdldFNjYW5saW5lSW5uZXIoZHN0KSA6IGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBnZXRTY2FubGluZUlubmVyKGRzdCk7Cit9CisKK3NpemVfdCBIZWlmRGVjb2RlckltcGw6OnNraXBTY2FubGluZXMoc2l6ZV90IGNvdW50KSB7CiAgICAgdWludDMyX3Qgb2xkU2NhbmxpbmUgPSBtQ3VyU2NhbmxpbmU7CiAgICAgbUN1clNjYW5saW5lICs9IGNvdW50OwotICAgIGlmIChtQ3VyU2NhbmxpbmUgPiB2aWRlb0ZyYW1lLT5tSGVpZ2h0KSB7Ci0gICAgICAgIG1DdXJTY2FubGluZSA9IHZpZGVvRnJhbWUtPm1IZWlnaHQ7CisgICAgaWYgKG1DdXJTY2FubGluZSA+IG1IZWlnaHQpIHsKKyAgICAgICAgbUN1clNjYW5saW5lID0gbUhlaWdodDsKICAgICB9CiAgICAgcmV0dXJuIChtQ3VyU2NhbmxpbmUgPiBvbGRTY2FubGluZSkgPyAobUN1clNjYW5saW5lIC0gb2xkU2NhbmxpbmUpIDogMDsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmggYi9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5oCmluZGV4IGMyZTRmZjMuLjUyOGVlM2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmgKKysrIGIvbWVkaWEvbGliaGVpZi9IZWlmRGVjb2RlckltcGwuaApAQCAtMTksNiArMTksOCBAQAogCiAjaW5jbHVkZSAiaW5jbHVkZS9IZWlmRGVjb2RlckFQSS5oIgogI2luY2x1ZGUgPHN5c3RlbS9ncmFwaGljcy5oPgorI2luY2x1ZGUgPHV0aWxzL0NvbmRpdGlvbi5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC00OSwxMiArNTEsMzAgQEAKICAgICBzaXplX3Qgc2tpcFNjYW5saW5lcyhzaXplX3QgY291bnQpIG92ZXJyaWRlOwogCiBwcml2YXRlOgorICAgIHN0cnVjdCBEZWNvZGVUaHJlYWQ7CisKICAgICBzcDxJRGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CiAgICAgc3A8TWVkaWFNZXRhZGF0YVJldHJpZXZlcj4gbVJldHJpZXZlcjsKICAgICBzcDxJTWVtb3J5PiBtRnJhbWVNZW1vcnk7CiAgICAgYW5kcm9pZF9waXhlbF9mb3JtYXRfdCBtT3V0cHV0Q29sb3I7CiAgICAgc2l6ZV90IG1DdXJTY2FubGluZTsKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKICAgICBib29sIG1GcmFtZURlY29kZWQ7CisgICAgYm9vbCBtSGFzSW1hZ2U7CisgICAgYm9vbCBtSGFzVmlkZW87CisKKyAgICAvLyBTbGljZSBkZWNvZGluZyBvbmx5CisgICAgTXV0ZXggbUxvY2s7CisgICAgQ29uZGl0aW9uIG1TY2FubGluZVJlYWR5OworICAgIHNwPERlY29kZVRocmVhZD4gbVRocmVhZDsKKyAgICBzaXplX3QgbUF2YWlsYWJsZUxpbmVzOworICAgIHNpemVfdCBtTnVtU2xpY2VzOworICAgIHVpbnQzMl90IG1TbGljZUhlaWdodDsKKyAgICBib29sIG1Bc3luY0RlY29kZURvbmU7CisKKyAgICBib29sIGRlY29kZUFzeW5jKCk7CisgICAgYm9vbCBnZXRTY2FubGluZUlubmVyKHVpbnQ4X3QqIGRzdCk7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icAppbmRleCBhNDYyZjNhLi45ZDlhYzhjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAKQEAgLTMsMTAgKzMsMTIgQEAKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogICAgIGhlYWRlcl9saWJzOlsKKyAgICAgICAgImxpYmd1aV9oZWFkZXJzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAogICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAogICAgIF0sCiAgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibGliZ3VpX2hlYWRlcnMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCiAgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCiAgICAgXSwKQEAgLTE4LDEzICsyMCwxMyBAQAogICAgIHZuZGs6IHsKICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICB9LAotICAgIHNyY3M6IFsiQXVkaW9QYXJhbWV0ZXIuY3BwIiwgIlR5cGVDb252ZXJ0ZXIuY3BwIl0sCisgICAgc3JjczogWyJBdWRpb1BhcmFtZXRlci5jcHAiLCAiVHlwZUNvbnZlcnRlci5jcHAiLCAiVGltZUNoZWNrLmNwcCJdLAogICAgIGNmbGFnczogWwogICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIiwKICAgICAgICAgIi1XYWxsIiwKICAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbImxpYnV0aWxzIiwgImxpYmxvZyIsICJsaWJndWkiXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJ1dGlscyIsICJsaWJsb2ciXSwKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCiAgICAgICAgICJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIiwKQEAgLTMzLDIyICszNSwyMSBAQAogICAgIGNsYW5nOiB0cnVlLAogfQogCi0vLyBUT0RPKGIvMzU0NDkwODcpOiBtZXJnZSBiYWNrIHdpdGggbGlibWVkaWEgd2hlbiBPTVggaW1wbGVtZW50YXRvaW5zCi0vLyBubyBsb25nZXIgdXNlIGFpZGwgd3JhcHBlcnMgKG9yIHJlbW92ZSBPTVggY29tcG9uZW50IGZvcm0gbGlibWVkaWEpCi1jY19kZWZhdWx0cyB7Ci0gICAgbmFtZTogImxpYm1lZGlhX29teF9kZWZhdWx0cyIsCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYm1lZGlhX29teCIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgImFpZGwvYW5kcm9pZC9JR3JhcGhpY0J1ZmZlclNvdXJjZS5haWRsIiwKICAgICAgICAgImFpZGwvYW5kcm9pZC9JT01YQnVmZmVyU291cmNlLmFpZGwiLAogCiAgICAgICAgICJJTWVkaWFDb2RlY0xpc3QuY3BwIiwKLSAgICAgICAgIklNZWRpYUNvZGVjU2VydmljZS5jcHAiLAogICAgICAgICAiSU9NWC5jcHAiLAotICAgICAgICAiSU9NWFN0b3JlLmNwcCIsCiAgICAgICAgICJNZWRpYUNvZGVjQnVmZmVyLmNwcCIsCiAgICAgICAgICJNZWRpYUNvZGVjSW5mby5jcHAiLAotICAgICAgICAiTWVkaWFEZWZzLmNwcCIsCiAgICAgICAgICJPTVhCdWZmZXIuY3BwIiwKICAgICAgICAgIm9teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIiwKICAgICAgICAgIm9teC8xLjAvV09teC5jcHAiLApAQCAtNjMsMTggKzY0LDEzIEBACiAgICAgfSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhQDEuMCIsCi0gICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGliZ3VpIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKLSAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCi0gICAgICAgICJsaWJod2JpbmRlciIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1aSIsCkBAIC04MiwxMSArNzgsOCBAQAogICAgIF0sCiAKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCi0gICAgICAgICJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhQDEuMCIsCi0gICAgICAgICJsaWJoaWRsbWVtb3J5IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidWkiLAogICAgIF0sCkBAIC0xMjEsMjMgKzExNCw0NiBAQAogICAgIH0sCiB9CiAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKLSAgICBuYW1lOiAibGlibWVkaWFfb214IiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAorY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJtZWRpYV9taWRpaW93cmFwcGVyIiwKIAotICAgIGRlZmF1bHRzOiBbImxpYm1lZGlhX29teF9kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsiTWlkaUlvV3JhcHBlci5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzb25pdm94IiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBkaWFnOiB7CisgICAgICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKIH0KIAotY2NfbGlicmFyeV9zaGFyZWQgeworZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAibWVkaWF1cGRhdGVzZXJ2aWNlX2FpZGwiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmFpZGwiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJtZWRpYSIsCi0gICAgZGVmYXVsdHM6IFsibGlibWVkaWFfb214X2RlZmF1bHRzIl0sCiAKICAgICBzcmNzOiBbCisgICAgICAgICI6bWVkaWF1cGRhdGVzZXJ2aWNlX2FpZGwiLAogICAgICAgICAiSURhdGFTb3VyY2UuY3BwIiwKLSAgICAgICAgIklIRENQLmNwcCIsCiAgICAgICAgICJCdWZmZXJpbmdTZXR0aW5ncy5jcHAiLAogICAgICAgICAibWVkaWFwbGF5ZXIuY3BwIiwKICAgICAgICAgIklNZWRpYUhUVFBDb25uZWN0aW9uLmNwcCIsCkBAIC0xNjEsNyArMTc3LDYgQEAKICAgICAgICAgIklNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcCIsCiAgICAgICAgICJtZWRpYW1ldGFkYXRhcmV0cmlldmVyLmNwcCIsCiAgICAgICAgICJNaWRpRGV2aWNlSW5mby5jcHAiLAotICAgICAgICAiTWlkaUlvV3JhcHBlci5jcHAiLAogICAgICAgICAiSmV0UGxheWVyLmNwcCIsCiAgICAgICAgICJNZWRpYVNjYW5uZXIuY3BwIiwKICAgICAgICAgIk1lZGlhU2Nhbm5lckNsaWVudC5jcHAiLApAQCAtMTc0LDggKzE4OSwyMCBAQAogICAgICAgICAiU3RyaW5nQXJyYXkuY3BwIiwKICAgICBdLAogCisgICAgYWlkbDogeworICAgICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsiYWlkbCJdLAorICAgICAgICBleHBvcnRfYWlkbF9oZWFkZXJzOiB0cnVlLAorICAgIH0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgXSwKKworICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgIF0sCisKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlidWkiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJ1dGlscyIsCkBAIC0xODYsMzYgKzIxMyw5MiBAQAogICAgICAgICAibGliZXhwYXQiLAogICAgICAgICAibGliY2FtZXJhX2NsaWVudCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKICAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJkbCIsCiAgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKICAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKLSAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCi0gICAgICAgICJsaWJtZWRpYWRybSIsCi0gICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAotICAgICAgICAibGliYmFzZSIsCi0gICAgICAgICJsaWJoaWRsYmFzZSIsCi0gICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKLSAgICAgICAgImxpYmh3YmluZGVyIiwKLSAgICAgICAgImxpYmhpZGxtZW1vcnkiLAotICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5jb21tb25AMS4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJpY3V1YyIsCiAgICAgICAgICJsaWJpY3VpMThuIiwKICAgICAgICAgImxpYnNvbml2b3giLAotICAgICAgICAibGlibWVkaWFkcm0iLAotICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKLSAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgXSwKIAotICAgIC8vIGZvciBtZW1vcnkgaGVhcCBhbmFseXNpcwogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJjX21hbGxvY19kZWJ1Z19iYWNrdHJhY2UiLAorICAgICAgICAibGliY19tYWxsb2NfZGVidWdfYmFja3RyYWNlIiwgIC8vIGZvciBtZW1vcnkgaGVhcCBhbmFseXNpcworICAgICAgICAibGlibWVkaWFfbWlkaWlvd3JhcHBlciIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgZGlhZzogeworICAgICAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCit9CisKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJtZWRpYV9wbGF5ZXIyX3V0aWwiLAorCisgICAgc3JjczogWworICAgICAgICAiQnVmZmVyaW5nU2V0dGluZ3MuY3BwIiwKKyAgICAgICAgIkRhdGFTb3VyY2VEZXNjLmNwcCIsCisgICAgICAgICJJRGF0YVNvdXJjZS5jcHAiLAorICAgICAgICAiSU1lZGlhRXh0cmFjdG9yLmNwcCIsCisgICAgICAgICJJTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcCIsCisgICAgICAgICJJTWVkaWFTb3VyY2UuY3BwIiwKKyAgICAgICAgIk1lZGlhQ29kZWNCdWZmZXIuY3BwIiwKKyAgICAgICAgIk1lZGlhVXRpbHMuY3BwIiwKKyAgICAgICAgIk1ldGFkYXRhLmNwcCIsCisgICAgICAgICJOZGtXcmFwcGVyLmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9ydHNwIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dCIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvUGFyYW1ldGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvUGFyYW1ldGVyLmNwcAppbmRleCA2NWZjNzBiLi5jYjBlOTI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb1BhcmFtZXRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9QYXJhbWV0ZXIuY3BwCkBAIC0zNCw2ICszNCw4IEBACiBjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleVNjcmVlblN0YXRlID0gQVVESU9fUEFSQU1FVEVSX0tFWV9TQ1JFRU5fU1RBVEU7CiBjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleUJ0TnJlYyA9IEFVRElPX1BBUkFNRVRFUl9LRVlfQlRfTlJFQzsKIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5SHdBdlN5bmMgPSBBVURJT19QQVJBTUVURVJfSFdfQVZfU1lOQzsKK2NvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5UHJlc2VudGF0aW9uSWQgPSBBVURJT19QQVJBTUVURVJfU1RSRUFNX1BSRVNFTlRBVElPTl9JRDsKK2NvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5UHJvZ3JhbUlkID0gQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9QUk9HUkFNX0lEOwogY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlNb25vT3V0cHV0ID0gQVVESU9fUEFSQU1FVEVSX01PTk9fT1VUUFVUOwogY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1Id0F2U3luYyA9IEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fSFdfQVZfU1lOQzsKIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtQ29ubmVjdCA9IEFVRElPX1BBUkFNRVRFUl9ERVZJQ0VfQ09OTkVDVDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmNwcCBiL21lZGlhL2xpYm1lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmNwcAppbmRleCBhNjk0OTdlLi4yNzFhMjM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuY3BwCkBAIC0yMyw0MyArMjMsMTYgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0vLyBzdGF0aWMKLWJvb2wgQnVmZmVyaW5nU2V0dGluZ3M6OklzVmFsaWRCdWZmZXJpbmdNb2RlKGludCBtb2RlKSB7Ci0gICAgcmV0dXJuIChtb2RlID49IEJVRkZFUklOR19NT0RFX05PTkUgJiYgbW9kZSA8IEJVRkZFUklOR19NT0RFX0NPVU5UKTsKLX0KLQotLy8gc3RhdGljCi1ib29sIEJ1ZmZlcmluZ1NldHRpbmdzOjpJc1RpbWVCYXNlZEJ1ZmZlcmluZ01vZGUoaW50IG1vZGUpIHsKLSAgICByZXR1cm4gKG1vZGUgPT0gQlVGRkVSSU5HX01PREVfVElNRV9PTkxZIHx8IG1vZGUgPT0gQlVGRkVSSU5HX01PREVfVElNRV9USEVOX1NJWkUpOwotfQotCi0vLyBzdGF0aWMKLWJvb2wgQnVmZmVyaW5nU2V0dGluZ3M6OklzU2l6ZUJhc2VkQnVmZmVyaW5nTW9kZShpbnQgbW9kZSkgewotICAgIHJldHVybiAobW9kZSA9PSBCVUZGRVJJTkdfTU9ERV9TSVpFX09OTFkgfHwgbW9kZSA9PSBCVUZGRVJJTkdfTU9ERV9USU1FX1RIRU5fU0laRSk7Ci19Ci0KIEJ1ZmZlcmluZ1NldHRpbmdzOjpCdWZmZXJpbmdTZXR0aW5ncygpCi0gICAgICAgIDogbUluaXRpYWxCdWZmZXJpbmdNb2RlKEJVRkZFUklOR19NT0RFX05PTkUpLAotICAgICAgICAgIG1SZWJ1ZmZlcmluZ01vZGUoQlVGRkVSSU5HX01PREVfTk9ORSksCi0gICAgICAgICAgbUluaXRpYWxXYXRlcm1hcmtNcyhrTm9XYXRlcm1hcmspLAotICAgICAgICAgIG1Jbml0aWFsV2F0ZXJtYXJrS0Ioa05vV2F0ZXJtYXJrKSwKLSAgICAgICAgICBtUmVidWZmZXJpbmdXYXRlcm1hcmtMb3dNcyhrTm9XYXRlcm1hcmspLAotICAgICAgICAgIG1SZWJ1ZmZlcmluZ1dhdGVybWFya0hpZ2hNcyhrTm9XYXRlcm1hcmspLAotICAgICAgICAgIG1SZWJ1ZmZlcmluZ1dhdGVybWFya0xvd0tCKGtOb1dhdGVybWFyayksCi0gICAgICAgICAgbVJlYnVmZmVyaW5nV2F0ZXJtYXJrSGlnaEtCKGtOb1dhdGVybWFyaykgeyB9CisgICAgICAgIDogbUluaXRpYWxNYXJrTXMoa05vTWFyayksCisgICAgICAgICAgbVJlc3VtZVBsYXliYWNrTWFya01zKGtOb01hcmspIHsgfQogCiBzdGF0dXNfdCBCdWZmZXJpbmdTZXR0aW5nczo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIHsKICAgICBpZiAocGFyY2VsID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgbUluaXRpYWxCdWZmZXJpbmdNb2RlID0gKEJ1ZmZlcmluZ01vZGUpcGFyY2VsLT5yZWFkSW50MzIoKTsKLSAgICBtUmVidWZmZXJpbmdNb2RlID0gKEJ1ZmZlcmluZ01vZGUpcGFyY2VsLT5yZWFkSW50MzIoKTsKLSAgICBtSW5pdGlhbFdhdGVybWFya01zID0gcGFyY2VsLT5yZWFkSW50MzIoKTsKLSAgICBtSW5pdGlhbFdhdGVybWFya0tCID0gcGFyY2VsLT5yZWFkSW50MzIoKTsKLSAgICBtUmVidWZmZXJpbmdXYXRlcm1hcmtMb3dNcyA9IHBhcmNlbC0+cmVhZEludDMyKCk7Ci0gICAgbVJlYnVmZmVyaW5nV2F0ZXJtYXJrSGlnaE1zID0gcGFyY2VsLT5yZWFkSW50MzIoKTsKLSAgICBtUmVidWZmZXJpbmdXYXRlcm1hcmtMb3dLQiA9IHBhcmNlbC0+cmVhZEludDMyKCk7Ci0gICAgbVJlYnVmZmVyaW5nV2F0ZXJtYXJrSGlnaEtCID0gcGFyY2VsLT5yZWFkSW50MzIoKTsKKyAgICBtSW5pdGlhbE1hcmtNcyA9IHBhcmNlbC0+cmVhZEludDMyKCk7CisgICAgbVJlc3VtZVBsYXliYWNrTWFya01zID0gcGFyY2VsLT5yZWFkSW50MzIoKTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTY4LDI2ICs0MSwxNyBAQAogICAgIGlmIChwYXJjZWwgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBwYXJjZWwtPndyaXRlSW50MzIobUluaXRpYWxCdWZmZXJpbmdNb2RlKTsKLSAgICBwYXJjZWwtPndyaXRlSW50MzIobVJlYnVmZmVyaW5nTW9kZSk7Ci0gICAgcGFyY2VsLT53cml0ZUludDMyKG1Jbml0aWFsV2F0ZXJtYXJrTXMpOwotICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtSW5pdGlhbFdhdGVybWFya0tCKTsKLSAgICBwYXJjZWwtPndyaXRlSW50MzIobVJlYnVmZmVyaW5nV2F0ZXJtYXJrTG93TXMpOwotICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtUmVidWZmZXJpbmdXYXRlcm1hcmtIaWdoTXMpOwotICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtUmVidWZmZXJpbmdXYXRlcm1hcmtMb3dLQik7Ci0gICAgcGFyY2VsLT53cml0ZUludDMyKG1SZWJ1ZmZlcmluZ1dhdGVybWFya0hpZ2hLQik7CisgICAgcGFyY2VsLT53cml0ZUludDMyKG1Jbml0aWFsTWFya01zKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIobVJlc3VtZVBsYXliYWNrTWFya01zKTsKIAogICAgIHJldHVybiBPSzsKIH0KIAogU3RyaW5nOCBCdWZmZXJpbmdTZXR0aW5nczo6dG9TdHJpbmcoKSBjb25zdCB7CiAgICAgU3RyaW5nOCBzOwotICAgIHMuYXBwZW5kRm9ybWF0KCJpbml0aWFsTW9kZSglZCksIHJlYnVmZmVyaW5nTW9kZSglZCksICIKLSAgICAgICAgICAgICJpbml0aWFsTWFya3MoJWQgbXMsICVkIEtCKSwgcmVidWZmZXJpbmdNYXJrcyglZCwgJWQpbXMsICglZCwgJWQpS0IiLAotICAgICAgICAgICAgbUluaXRpYWxCdWZmZXJpbmdNb2RlLCBtUmVidWZmZXJpbmdNb2RlLAotICAgICAgICAgICAgbUluaXRpYWxXYXRlcm1hcmtNcywgbUluaXRpYWxXYXRlcm1hcmtLQiwKLSAgICAgICAgICAgIG1SZWJ1ZmZlcmluZ1dhdGVybWFya0xvd01zLCBtUmVidWZmZXJpbmdXYXRlcm1hcmtIaWdoTXMsCi0gICAgICAgICAgICBtUmVidWZmZXJpbmdXYXRlcm1hcmtMb3dLQiwgbVJlYnVmZmVyaW5nV2F0ZXJtYXJrSGlnaEtCKTsKKyAgICBzLmFwcGVuZEZvcm1hdCgKKyAgICAgICAgICAgICJpbml0aWFsTWFya3MoJWQgbXMpLCByZXN1bWVQbGF5YmFja01hcmtzKCVkIG1zKSIsCisgICAgICAgICAgICBtSW5pdGlhbE1hcmtNcywgbVJlc3VtZVBsYXliYWNrTWFya01zKTsKICAgICByZXR1cm4gczsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvRGF0YVNvdXJjZURlc2MuY3BwIGIvbWVkaWEvbGlibWVkaWEvRGF0YVNvdXJjZURlc2MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3Y2NiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9EYXRhU291cmNlRGVzYy5jcHAKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJEYXRhU291cmNlRGVzYyIKKworI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlRGVzYy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3QgaW50NjRfdCBrTG9uZ01heCA9IDB4N2ZmZmZmZmZmZmZmZmZmTDsKKworRGF0YVNvdXJjZURlc2M6OkRhdGFTb3VyY2VEZXNjKCkKKyAgICA6IG1UeXBlKFRZUEVfTk9ORSksCisgICAgICBtRkRPZmZzZXQoMCksCisgICAgICBtRkRMZW5ndGgoa0xvbmdNYXgpLAorICAgICAgbUlkKDApLAorICAgICAgbVN0YXJ0UG9zaXRpb25NcygwKSwKKyAgICAgIG1FbmRQb3NpdGlvbk1zKDApIHsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lIRENQLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lIRENQLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ2MDE3Zi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYS9JSERDUC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiSUhEQ1AiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUhEQ1AuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotZW51bSB7Ci0gICAgT0JTRVJWRVJfTk9USUZZID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKLSAgICBIRENQX1NFVF9PQlNFUlZFUiwKLSAgICBIRENQX0lOSVRfQVNZTkMsCi0gICAgSERDUF9TSFVURE9XTl9BU1lOQywKLSAgICBIRENQX0dFVF9DQVBTLAotICAgIEhEQ1BfRU5DUllQVCwKLSAgICBIRENQX0VOQ1JZUFRfTkFUSVZFLAotICAgIEhEQ1BfREVDUllQVCwKLX07Ci0KLXN0cnVjdCBCcEhEQ1BPYnNlcnZlciA6IHB1YmxpYyBCcEludGVyZmFjZTxJSERDUE9ic2VydmVyPiB7Ci0gICAgZXhwbGljaXQgQnBIRENQT2JzZXJ2ZXIoY29uc3Qgc3A8SUJpbmRlcj4gJmltcGwpCi0gICAgICAgIDogQnBJbnRlcmZhY2U8SUhEQ1BPYnNlcnZlcj4oaW1wbCkgewotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoCi0gICAgICAgICAgICBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElIRENQT2JzZXJ2ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihtc2cpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoZXh0MSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihleHQyKTsKLSAgICAgICAgaWYgKG9iaiAmJiBvYmotPmRhdGFTaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBkYXRhLmFwcGVuZEZyb20oY29uc3RfY2FzdDxQYXJjZWwgKj4ob2JqKSwgMCwgb2JqLT5kYXRhU2l6ZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoT0JTRVJWRVJfTk9USUZZLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKLSAgICB9Ci19OwotCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoSERDUE9ic2VydmVyLCAiYW5kcm9pZC5oYXJkd2FyZS5JSERDUE9ic2VydmVyIik7Ci0KLXN0cnVjdCBCcEhEQ1AgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SUhEQ1A+IHsKLSAgICBleHBsaWNpdCBCcEhEQ1AoY29uc3Qgc3A8SUJpbmRlcj4gJmltcGwpCi0gICAgICAgIDogQnBJbnRlcmZhY2U8SUhEQ1A+KGltcGwpIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE9ic2VydmVyKGNvbnN0IHNwPElIRENQT2JzZXJ2ZXI+ICZvYnNlcnZlcikgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJSERDUDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihvYnNlcnZlcikpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoSERDUF9TRVRfT0JTRVJWRVIsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRBc3luYyhjb25zdCBjaGFyICpob3N0LCB1bnNpZ25lZCBwb3J0KSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElIRENQOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhob3N0KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnQpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoSERDUF9JTklUX0FTWU5DLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzaHV0ZG93bkFzeW5jKCkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJSERDUDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEhEQ1BfU0hVVERPV05fQVNZTkMsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHVpbnQzMl90IGdldENhcHMoKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElIRENQOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoSERDUF9HRVRfQ0FQUywgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5jcnlwdCgKLSAgICAgICAgICAgIGNvbnN0IHZvaWQgKmluRGF0YSwgc2l6ZV90IHNpemUsIHVpbnQzMl90IHN0cmVhbUNUUiwKLSAgICAgICAgICAgIHVpbnQ2NF90ICpvdXRJbnB1dENUUiwgdm9pZCAqb3V0RGF0YSkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJSERDUDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNpemUpOwotICAgICAgICBkYXRhLndyaXRlKGluRGF0YSwgc2l6ZSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdHJlYW1DVFIpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoSERDUF9FTkNSWVBULCBkYXRhLCAmcmVwbHkpOwotCi0gICAgICAgIHN0YXR1c190IGVyciA9IHJlcGx5LnJlYWRJbnQzMigpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICpvdXRJbnB1dENUUiA9IDA7Ci0KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAqb3V0SW5wdXRDVFIgPSByZXBseS5yZWFkSW50NjQoKTsKLSAgICAgICAgcmVwbHkucmVhZChvdXREYXRhLCBzaXplKTsKLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5jcnlwdE5hdGl2ZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+ICZncmFwaGljQnVmZmVyLAotICAgICAgICAgICAgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUsIHVpbnQzMl90IHN0cmVhbUNUUiwKLSAgICAgICAgICAgIHVpbnQ2NF90ICpvdXRJbnB1dENUUiwgdm9pZCAqb3V0RGF0YSkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJSERDUDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZSgqZ3JhcGhpY0J1ZmZlcik7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihvZmZzZXQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2l6ZSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdHJlYW1DVFIpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoSERDUF9FTkNSWVBUX05BVElWRSwgZGF0YSwgJnJlcGx5KTsKLQotICAgICAgICBzdGF0dXNfdCBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAqb3V0SW5wdXRDVFIgPSAwOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgICpvdXRJbnB1dENUUiA9IHJlcGx5LnJlYWRJbnQ2NCgpOwotICAgICAgICByZXBseS5yZWFkKG91dERhdGEsIHNpemUpOwotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkZWNyeXB0KAotICAgICAgICAgICAgY29uc3Qgdm9pZCAqaW5EYXRhLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbUNUUiwgdWludDY0X3QgaW5wdXRDVFIsCi0gICAgICAgICAgICB2b2lkICpvdXREYXRhKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElIRENQOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2l6ZSk7Ci0gICAgICAgIGRhdGEud3JpdGUoaW5EYXRhLCBzaXplKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHN0cmVhbUNUUik7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQ2NChpbnB1dENUUik7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChIRENQX0RFQ1JZUFQsIGRhdGEsICZyZXBseSk7Ci0KLSAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVwbHkucmVhZEludDMyKCk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIHJlcGx5LnJlYWQob3V0RGF0YSwgc2l6ZSk7Ci0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci19OwotCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoSERDUCwgImFuZHJvaWQuaGFyZHdhcmUuSUhEQ1AiKTsKLQotc3RhdHVzX3QgQm5IRENQT2JzZXJ2ZXI6Om9uVHJhbnNhY3QoCi0gICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCAmZGF0YSwgUGFyY2VsICpyZXBseSwgdWludDMyX3QgZmxhZ3MpIHsKLSAgICBzd2l0Y2ggKGNvZGUpIHsKLSAgICAgICAgY2FzZSBPQlNFUlZFUl9OT1RJRlk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJSERDUE9ic2VydmVyLCBkYXRhLCByZXBseSk7Ci0KLSAgICAgICAgICAgIGludCBtc2cgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaW50IGV4dDEgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaW50IGV4dDIgPSBkYXRhLnJlYWRJbnQzMigpOwotCi0gICAgICAgICAgICBQYXJjZWwgb2JqOwotICAgICAgICAgICAgaWYgKGRhdGEuZGF0YUF2YWlsKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgb2JqLmFwcGVuZEZyb20oCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PFBhcmNlbCAqPigmZGF0YSksCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmRhdGFQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5kYXRhQXZhaWwoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG5vdGlmeShtc2csIGV4dDEsIGV4dDIsICZvYmopOwotCi0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEJuSERDUDo6b25UcmFuc2FjdCgKLSAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsICZkYXRhLCBQYXJjZWwgKnJlcGx5LCB1aW50MzJfdCBmbGFncykgewotICAgIHN3aXRjaCAoY29kZSkgewotICAgICAgICBjYXNlIEhEQ1BfU0VUX09CU0VSVkVSOgotICAgICAgICB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUhEQ1AsIGRhdGEsIHJlcGx5KTsKLQotICAgICAgICAgICAgc3A8SUhEQ1BPYnNlcnZlcj4gb2JzZXJ2ZXIgPQotICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElIRENQT2JzZXJ2ZXI+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKLQotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0T2JzZXJ2ZXIob2JzZXJ2ZXIpKTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgSERDUF9JTklUX0FTWU5DOgotICAgICAgICB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUhEQ1AsIGRhdGEsIHJlcGx5KTsKLQotICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCA9IGRhdGEucmVhZENTdHJpbmcoKTsKLSAgICAgICAgICAgIHVuc2lnbmVkIHBvcnQgPSBkYXRhLnJlYWRJbnQzMigpOwotCi0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpbml0QXN5bmMoaG9zdCwgcG9ydCkpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBIRENQX1NIVVRET1dOX0FTWU5DOgotICAgICAgICB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUhEQ1AsIGRhdGEsIHJlcGx5KTsKLQotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2h1dGRvd25Bc3luYygpKTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgSERDUF9HRVRfQ0FQUzoKLSAgICAgICAgewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElIRENQLCBkYXRhLCByZXBseSk7Ci0KLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGdldENhcHMoKSk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEhEQ1BfRU5DUllQVDoKLSAgICAgICAgewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElIRENQLCBkYXRhLCByZXBseSk7Ci0KLSAgICAgICAgICAgIHNpemVfdCBzaXplID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHZvaWQgKmluRGF0YSA9IE5VTEw7Ci0gICAgICAgICAgICAvLyB3YXRjaCBvdXQgZm9yIG92ZXJmbG93Ci0gICAgICAgICAgICBpZiAoc2l6ZSA8PSBTSVpFX01BWCAvIDIpIHsKLSAgICAgICAgICAgICAgICBpbkRhdGEgPSBtYWxsb2MoMiAqIHNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGluRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoRVJST1JfT1VUX09GX1JBTkdFKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHZvaWQgKm91dERhdGEgPSAodWludDhfdCAqKWluRGF0YSArIHNpemU7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGRhdGEucmVhZChpbkRhdGEsIHNpemUpOwotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIGZyZWUoaW5EYXRhKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtQ1RSID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHVpbnQ2NF90IGlucHV0Q1RSOwotICAgICAgICAgICAgZXJyID0gZW5jcnlwdChpbkRhdGEsIHNpemUsIHN0cmVhbUNUUiwgJmlucHV0Q1RSLCBvdXREYXRhKTsKLQotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyKTsKLQotICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KGlucHV0Q1RSKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUob3V0RGF0YSwgc2l6ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZyZWUoaW5EYXRhKTsKLSAgICAgICAgICAgIGluRGF0YSA9IG91dERhdGEgPSBOVUxMOwotCi0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEhEQ1BfRU5DUllQVF9OQVRJVkU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJSERDUCwgZGF0YSwgcmVwbHkpOwotCi0gICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBncmFwaGljQnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKLSAgICAgICAgICAgIGRhdGEucmVhZCgqZ3JhcGhpY0J1ZmZlcik7Ci0gICAgICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHNpemVfdCBzaXplID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbUNUUiA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB2b2lkICpvdXREYXRhID0gTlVMTDsKLSAgICAgICAgICAgIHVpbnQ2NF90IGlucHV0Q1RSOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBFUlJPUl9PVVRfT0ZfUkFOR0U7Ci0KLSAgICAgICAgICAgIG91dERhdGEgPSBtYWxsb2Moc2l6ZSk7Ci0KLSAgICAgICAgICAgIGlmIChvdXREYXRhICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBlbmNyeXB0TmF0aXZlKGdyYXBoaWNCdWZmZXIsIG9mZnNldCwgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUNUUiwgJmlucHV0Q1RSLCBvdXREYXRhKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyKTsKLQotICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KGlucHV0Q1RSKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUob3V0RGF0YSwgc2l6ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZyZWUob3V0RGF0YSk7Ci0gICAgICAgICAgICBvdXREYXRhID0gTlVMTDsKLQotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBIRENQX0RFQ1JZUFQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJSERDUCwgZGF0YSwgcmVwbHkpOwotCi0gICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzaXplX3QgYnVmU2l6ZSA9IDIgKiBzaXplOwotCi0gICAgICAgICAgICAvLyB3YXRjaCBvdXQgZm9yIG92ZXJmbG93Ci0gICAgICAgICAgICB2b2lkICppbkRhdGEgPSBOVUxMOwotICAgICAgICAgICAgaWYgKGJ1ZlNpemUgPiBzaXplKSB7Ci0gICAgICAgICAgICAgICAgaW5EYXRhID0gbWFsbG9jKGJ1ZlNpemUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaW5EYXRhID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihFUlJPUl9PVVRfT0ZfUkFOR0UpOwotICAgICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdm9pZCAqb3V0RGF0YSA9ICh1aW50OF90ICopaW5EYXRhICsgc2l6ZTsKLQotICAgICAgICAgICAgZGF0YS5yZWFkKGluRGF0YSwgc2l6ZSk7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbUNUUiA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB1aW50NjRfdCBpbnB1dENUUiA9IGRhdGEucmVhZEludDY0KCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBkZWNyeXB0KGluRGF0YSwgc2l6ZSwgc3RyZWFtQ1RSLCBpbnB1dENUUiwgb3V0RGF0YSk7Ci0KLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycik7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUob3V0RGF0YSwgc2l6ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZyZWUoaW5EYXRhKTsKLSAgICAgICAgICAgIGluRGF0YSA9IG91dERhdGEgPSBOVUxMOwotCi0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLSAgICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFDb2RlY1NlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhQ29kZWNTZXJ2aWNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRmYTkzZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFDb2RlY1NlcnZpY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoKLSoqCi0qKiBDb3B5cmlnaHQgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2RlZmluZSBMT0dfVEFHICJJTWVkaWFDb2RlY1NlcnZpY2UiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhQ29kZWNTZXJ2aWNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotZW51bSB7Ci0gICAgR0VUX09NWCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCi0gICAgR0VUX09NWF9TVE9SRQotfTsKLQotY2xhc3MgQnBNZWRpYUNvZGVjU2VydmljZSA6IHB1YmxpYyBCcEludGVyZmFjZTxJTWVkaWFDb2RlY1NlcnZpY2U+Ci17Ci1wdWJsaWM6Ci0gICAgZXhwbGljaXQgQnBNZWRpYUNvZGVjU2VydmljZShjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJTWVkaWFDb2RlY1NlcnZpY2U+KGltcGwpCi0gICAgewotICAgIH0KLQotICAgIHZpcnR1YWwgc3A8SU9NWD4gZ2V0T01YKCkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFDb2RlY1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfT01YLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SU9NWD4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHNwPElPTVhTdG9yZT4gZ2V0T01YU3RvcmUoKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYUNvZGVjU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9PTVhfU1RPUkUsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJT01YU3RvcmU+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgfQotCi19OwotCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoTWVkaWFDb2RlY1NlcnZpY2UsICJhbmRyb2lkLm1lZGlhLklNZWRpYUNvZGVjU2VydmljZSIpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXR1c190IEJuTWVkaWFDb2RlY1NlcnZpY2U6Om9uVHJhbnNhY3QoCi0gICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKLXsKLSAgICBzd2l0Y2ggKGNvZGUpIHsKLQotICAgICAgICBjYXNlIEdFVF9PTVg6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFDb2RlY1NlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHNwPElPTVg+IG9teCA9IGdldE9NWCgpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKG9teCkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgR0VUX09NWF9TVE9SRTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYUNvZGVjU2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3A8SU9NWFN0b3JlPiBvbXhTdG9yZSA9IGdldE9NWFN0b3JlKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIob214U3RvcmUpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLSAgICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3Rvci5jcHAKaW5kZXggM2M0M2E3Mi4uZTlhNjIzMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25DYWNoZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAKQEAgLTM0LDEyICszNSw5IEBACiAgICAgR0VUVFJBQ0tNRVRBREFUQSwKICAgICBHRVRNRVRBREFUQSwKICAgICBGTEFHUywKLSAgICBHRVREUk1UUkFDS0lORk8sCiAgICAgU0VUTUVESUFDQVMsCi0gICAgU0VUVUlELAogICAgIE5BTUUsCi0gICAgR0VUTUVUUklDUywKLSAgICBSRUxFQVNFLAorICAgIEdFVE1FVFJJQ1MKIH07CiAKIGNsYXNzIEJwTWVkaWFFeHRyYWN0b3IgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SU1lZGlhRXh0cmFjdG9yPiB7CkBAIC0xMTIsMTEgKzExMCw2IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIHZpcnR1YWwgY2hhciogZ2V0RHJtVHJhY2tJbmZvKHNpemVfdCB0cmFja0lEIF9fdW51c2VkLCBpbnQgKmxlbiBfX3VudXNlZCkgewotICAgICAgICBBTE9HVigiZ2V0RHJtVHJhY2tJbmZvIE5PVCBJTVBMRU1FTlRFRCIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IEhJbnRlcmZhY2VUb2tlbiAmY2FzVG9rZW4pIHsKICAgICAgICAgQUxPR1YoInNldE1lZGlhQ2FzIik7CiAKQEAgLTEzMSwyMSArMTI0LDEwIEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgc2V0VUlEKHVpZF90IHVpZCBfX3VudXNlZCkgewotICAgICAgICBBTE9HVigic2V0VUlEIE5PVCBJTVBMRU1FTlRFRCIpOwotICAgIH0KLQogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7CiAgICAgICAgIEFMT0dWKCJuYW1lIE5PVCBJTVBMRU1FTlRFRCIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpIHsKLSAgICAgICAgQUxPR1YoInJlbGVhc2UiKTsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oQnBNZWRpYUV4dHJhY3Rvcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFTEVBU0UsIGRhdGEsICZyZXBseSk7Ci0gICAgfQogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKE1lZGlhRXh0cmFjdG9yLCAiYW5kcm9pZC5tZWRpYS5JTWVkaWFFeHRyYWN0b3IiKTsKQEAgLTIyMywxMiArMjA1LDYgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldE1lZGlhQ2FzKGNhc1Rva2VuKSk7CiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KLSAgICAgICAgY2FzZSBSRUxFQVNFOiB7Ci0gICAgICAgICAgICBBTE9HVigicmVsZWFzZSIpOwotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYUV4dHJhY3RvciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVsZWFzZSgpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KQEAgLTMyMywxMyArMjk5LDIxIEBACiAKIHN0YXR1c190IGR1bXBFeHRyYWN0b3JzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYpIHsKICAgICBTdHJpbmc4IG91dDsKLSAgICBvdXQuYXBwZW5kKCJSZWNlbnQgZXh0cmFjdG9ycywgbW9zdCByZWNlbnQgZmlyc3Q6XG4iKTsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKHNFeHRyYWN0b3JzTG9jayk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc0V4dHJhY3RvcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGNvbnN0IEV4dHJhY3Rvckluc3RhbmNlICZpbnN0YW5jZSA9IHNFeHRyYWN0b3JzLml0ZW1BdChpKTsKLSAgICAgICAgICAgIG91dC5hcHBlbmQoIiAgIik7Ci0gICAgICAgICAgICBvdXQuYXBwZW5kKGluc3RhbmNlLnRvU3RyaW5nKCkpOworICAgIGNvbnN0IElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOworICAgIGNvbnN0IGludCBwaWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKKyAgICBjb25zdCBpbnQgdWlkID0gaXBjLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKSwgcGlkLCB1aWQpKSB7CisgICAgICAgIG91dC5hcHBlbmRGb3JtYXQoIlBlcm1pc3Npb24gRGVuaWFsOiAiCisgICAgICAgICAgICAgICAgImNhbid0IGR1bXAgTWVkaWFFeHRyYWN0b3IgZnJvbSBwaWQ9JWQsIHVpZD0lZFxuIiwgcGlkLCB1aWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG91dC5hcHBlbmQoIlJlY2VudCBleHRyYWN0b3JzLCBtb3N0IHJlY2VudCBmaXJzdDpcbiIpOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhzRXh0cmFjdG9yc0xvY2spOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzRXh0cmFjdG9ycy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGNvbnN0IEV4dHJhY3Rvckluc3RhbmNlICZpbnN0YW5jZSA9IHNFeHRyYWN0b3JzLml0ZW1BdChpKTsKKyAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCIgICIpOworICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoaW5zdGFuY2UudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgd3JpdGUoZmQsIG91dC5zdHJpbmcoKSwgb3V0LnNpemUoKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCmluZGV4IDdjMGQwOGQuLmQ3NTMzY2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuY3BwCmluZGV4IDA2MmEwN2EuLjc0ZDhlZTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5jcHAKQEAgLTM0LDcgKzM0LDcgQEAKICAgICAgICAgOiBCcEludGVyZmFjZTxJTWVkaWFIVFRQU2VydmljZT4oaW1wbCkgewogICAgIH0KIAotICAgIHZpcnR1YWwgc3A8SU1lZGlhSFRUUENvbm5lY3Rpb24+IG1ha2VIVFRQQ29ubmVjdGlvbigpIHsKKyAgICB2aXJ0dWFsIHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+IG1ha2VIVFRQQ29ubmVjdGlvbigpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oCiAgICAgICAgICAgICAgICAgSU1lZGlhSFRUUFNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAKaW5kZXggNWVhMmU4Yi4uNTkwYmExYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcApAQCAtNjgsNiArNjgsOSBAQAogICAgIFNFVF9EQVRBX1NPVVJDRV9GRCwKICAgICBTRVRfREFUQV9TT1VSQ0VfQ0FMTEJBQ0ssCiAgICAgR0VUX0ZSQU1FX0FUX1RJTUUsCisgICAgR0VUX0lNQUdFX0FUX0lOREVYLAorICAgIEdFVF9JTUFHRV9SRUNUX0FUX0lOREVYLAorICAgIEdFVF9GUkFNRV9BVF9JTkRFWCwKICAgICBFWFRSQUNUX0FMQlVNX0FSVCwKICAgICBFWFRSQUNUX01FVEFEQVRBLAogfTsKQEAgLTE2NCw2ICsxNjcsODAgQEAKICAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgfQogCisgICAgc3A8SU1lbW9yeT4gZ2V0SW1hZ2VBdEluZGV4KGludCBpbmRleCwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5LCBib29sIHRodW1ibmFpbCkKKyAgICB7CisgICAgICAgIEFMT0dWKCJnZXRJbWFnZUF0SW5kZXg6IGluZGV4ICVkLCBjb2xvckZvcm1hdCglZCkgbWV0YU9ubHkoJWQpIHRodW1ibmFpbCglZCkiLAorICAgICAgICAgICAgICAgIGluZGV4LCBjb2xvckZvcm1hdCwgbWV0YU9ubHksIHRodW1ibmFpbCk7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaW5kZXgpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoY29sb3JGb3JtYXQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIobWV0YU9ubHkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIodGh1bWJuYWlsKTsKKyNpZm5kZWYgRElTQUJMRV9HUk9VUF9TQ0hFRFVMRV9IQUNLCisgICAgICAgIHNlbmRTY2hlZFBvbGljeShkYXRhKTsKKyNlbmRpZgorICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0lNQUdFX0FUX0lOREVYLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBzdGF0dXNfdCByZXQgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgfQorCisgICAgc3A8SU1lbW9yeT4gZ2V0SW1hZ2VSZWN0QXRJbmRleCgKKyAgICAgICAgICAgIGludCBpbmRleCwgaW50IGNvbG9yRm9ybWF0LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKQorICAgIHsKKyAgICAgICAgQUxPR1YoImdldEltYWdlUmVjdEF0SW5kZXg6IGluZGV4ICVkLCBjb2xvckZvcm1hdCglZCkgcmVjdCB7JWQsICVkLCAlZCwgJWR9IiwKKyAgICAgICAgICAgICAgICBpbmRleCwgY29sb3JGb3JtYXQsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaW5kZXgpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoY29sb3JGb3JtYXQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIobGVmdCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMih0b3ApOworICAgICAgICBkYXRhLndyaXRlSW50MzIocmlnaHQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoYm90dG9tKTsKKyNpZm5kZWYgRElTQUJMRV9HUk9VUF9TQ0hFRFVMRV9IQUNLCisgICAgICAgIHNlbmRTY2hlZFBvbGljeShkYXRhKTsKKyNlbmRpZgorICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0lNQUdFX1JFQ1RfQVRfSU5ERVgsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1c190IHJldCA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBnZXRGcmFtZUF0SW5kZXgoc3RkOjp2ZWN0b3I8c3A8SU1lbW9yeT4gPiAqZnJhbWVzLAorICAgICAgICAgICAgaW50IGZyYW1lSW5kZXgsIGludCBudW1GcmFtZXMsIGludCBjb2xvckZvcm1hdCwgYm9vbCBtZXRhT25seSkKKyAgICB7CisgICAgICAgIEFMT0dWKCJnZXRGcmFtZUF0SW5kZXg6IGZyYW1lSW5kZXgoJWQpLCBudW1GcmFtZXMoJWQpLCBjb2xvckZvcm1hdCglZCkgbWV0YU9ubHkoJWQpIiwKKyAgICAgICAgICAgICAgICBmcmFtZUluZGV4LCBudW1GcmFtZXMsIGNvbG9yRm9ybWF0LCBtZXRhT25seSk7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoZnJhbWVJbmRleCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihudW1GcmFtZXMpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoY29sb3JGb3JtYXQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIobWV0YU9ubHkpOworI2lmbmRlZiBESVNBQkxFX0dST1VQX1NDSEVEVUxFX0hBQ0sKKyAgICAgICAgc2VuZFNjaGVkUG9saWN5KGRhdGEpOworI2VuZGlmCisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfRlJBTUVfQVRfSU5ERVgsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1c190IHJldCA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGludCByZXROdW1GcmFtZXMgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKHJldE51bUZyYW1lcyA8IG51bUZyYW1lcykgeworICAgICAgICAgICAgbnVtRnJhbWVzID0gcmV0TnVtRnJhbWVzOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRnJhbWVzOyBpKyspIHsKKyAgICAgICAgICAgIGZyYW1lcy0+cHVzaF9iYWNrKGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKICAgICBzcDxJTWVtb3J5PiBleHRyYWN0QWxidW1BcnQoKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtMzAwLDYgKzM3Nyw4MyBAQAogI2VuZGlmCiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgR0VUX0lNQUdFX0FUX0lOREVYOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGludCBpbmRleCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBpbnQgY29sb3JGb3JtYXQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYm9vbCBtZXRhT25seSA9IChkYXRhLnJlYWRJbnQzMigpICE9IDApOworICAgICAgICAgICAgYm9vbCB0aHVtYm5haWwgPSAoZGF0YS5yZWFkSW50MzIoKSAhPSAwKTsKKyAgICAgICAgICAgIEFMT0dWKCJnZXRJbWFnZUF0SW5kZXg6IGluZGV4KCVkKSwgY29sb3JGb3JtYXQoJWQpLCBtZXRhT25seSglZCksIHRodW1ibmFpbCglZCkiLAorICAgICAgICAgICAgICAgICAgICBpbmRleCwgY29sb3JGb3JtYXQsIG1ldGFPbmx5LCB0aHVtYm5haWwpOworI2lmbmRlZiBESVNBQkxFX0dST1VQX1NDSEVEVUxFX0hBQ0sKKyAgICAgICAgICAgIHNldFNjaGVkUG9saWN5KGRhdGEpOworI2VuZGlmCisgICAgICAgICAgICBzcDxJTWVtb3J5PiBiaXRtYXAgPSBnZXRJbWFnZUF0SW5kZXgoaW5kZXgsIGNvbG9yRm9ybWF0LCBtZXRhT25seSwgdGh1bWJuYWlsKTsKKyAgICAgICAgICAgIGlmIChiaXRtYXAgIT0gMCkgeyAgLy8gRG9uJ3Qgc2VuZCBOVUxMIGFjcm9zcyB0aGUgYmluZGVyIGludGVyZmFjZQorICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE5PX0VSUk9SKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoYml0bWFwKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKFVOS05PV05fRVJST1IpOworICAgICAgICAgICAgfQorI2lmbmRlZiBESVNBQkxFX0dST1VQX1NDSEVEVUxFX0hBQ0sKKyAgICAgICAgICAgIHJlc3RvcmVTY2hlZFBvbGljeSgpOworI2VuZGlmCisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBHRVRfSU1BR0VfUkVDVF9BVF9JTkRFWDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYU1ldGFkYXRhUmV0cmlldmVyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW50IGNvbG9yRm9ybWF0ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludCBsZWZ0ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludCB0b3AgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW50IHJpZ2h0ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludCBib3R0b20gPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgQUxPR1YoImdldEltYWdlUmVjdEF0SW5kZXg6IGluZGV4KCVkKSwgY29sb3JGb3JtYXQoJWQpLCByZWN0IHslZCwgJWQsICVkLCAlZH0iLAorICAgICAgICAgICAgICAgICAgICBpbmRleCwgY29sb3JGb3JtYXQsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisjaWZuZGVmIERJU0FCTEVfR1JPVVBfU0NIRURVTEVfSEFDSworICAgICAgICAgICAgc2V0U2NoZWRQb2xpY3koZGF0YSk7CisjZW5kaWYKKyAgICAgICAgICAgIHNwPElNZW1vcnk+IGJpdG1hcCA9IGdldEltYWdlUmVjdEF0SW5kZXgoCisgICAgICAgICAgICAgICAgICAgIGluZGV4LCBjb2xvckZvcm1hdCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICAgICAgICAgIGlmIChiaXRtYXAgIT0gMCkgeyAgLy8gRG9uJ3Qgc2VuZCBOVUxMIGFjcm9zcyB0aGUgYmluZGVyIGludGVyZmFjZQorICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE5PX0VSUk9SKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoYml0bWFwKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKFVOS05PV05fRVJST1IpOworICAgICAgICAgICAgfQorI2lmbmRlZiBESVNBQkxFX0dST1VQX1NDSEVEVUxFX0hBQ0sKKyAgICAgICAgICAgIHJlc3RvcmVTY2hlZFBvbGljeSgpOworI2VuZGlmCisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBHRVRfRlJBTUVfQVRfSU5ERVg6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFNZXRhZGF0YVJldHJpZXZlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgaW50IGZyYW1lSW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW50IG51bUZyYW1lcyA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBpbnQgY29sb3JGb3JtYXQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYm9vbCBtZXRhT25seSA9IChkYXRhLnJlYWRJbnQzMigpICE9IDApOworICAgICAgICAgICAgQUxPR1YoImdldEZyYW1lQXRJbmRleDogZnJhbWVJbmRleCglZCksIG51bUZyYW1lcyglZCksIGNvbG9yRm9ybWF0KCVkKSwgbWV0YU9ubHkoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVJbmRleCwgbnVtRnJhbWVzLCBjb2xvckZvcm1hdCwgbWV0YU9ubHkpOworI2lmbmRlZiBESVNBQkxFX0dST1VQX1NDSEVEVUxFX0hBQ0sKKyAgICAgICAgICAgIHNldFNjaGVkUG9saWN5KGRhdGEpOworI2VuZGlmCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzcDxJTWVtb3J5PiA+IGZyYW1lczsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGdldEZyYW1lQXRJbmRleCgKKyAgICAgICAgICAgICAgICAgICAgJmZyYW1lcywgZnJhbWVJbmRleCwgbnVtRnJhbWVzLCBjb2xvckZvcm1hdCwgbWV0YU9ubHkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyKTsKKyAgICAgICAgICAgIGlmIChPSyA9PSBlcnIpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihmcmFtZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZyYW1lcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoZnJhbWVzW2ldKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2lmbmRlZiBESVNBQkxFX0dST1VQX1NDSEVEVUxFX0hBQ0sKKyAgICAgICAgICAgIHJlc3RvcmVTY2hlZFBvbGljeSgpOworI2VuZGlmCisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgRVhUUkFDVF9BTEJVTV9BUlQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFNZXRhZGF0YVJldHJpZXZlciwgZGF0YSwgcmVwbHkpOwogI2lmbmRlZiBESVNBQkxFX0dST1VQX1NDSEVEVUxFX0hBQ0sKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCmluZGV4IDM5OTYyMjcuLmUyZWNjZGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcApAQCAtMzUsNiArMzUsOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3VzaW5nIG1lZGlhOjpWb2x1bWVTaGFwZXI7CisKIGVudW0gewogICAgIERJU0NPTk5FQ1QgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAogICAgIFNFVF9EQVRBX1NPVVJDRV9VUkwsCkBAIC00Miw3ICs0NCw3IEBACiAgICAgU0VUX0RBVEFfU09VUkNFX1NUUkVBTSwKICAgICBTRVRfREFUQV9TT1VSQ0VfQ0FMTEJBQ0ssCiAgICAgU0VUX0JVRkZFUklOR19TRVRUSU5HUywKLSAgICBHRVRfREVGQVVMVF9CVUZGRVJJTkdfU0VUVElOR1MsCisgICAgR0VUX0JVRkZFUklOR19TRVRUSU5HUywKICAgICBQUkVQQVJFX0FTWU5DLAogICAgIFNUQVJULAogICAgIFNUT1AsCkBAIC01Niw2ICs1OCw3IEBACiAgICAgR0VUX0NVUlJFTlRfUE9TSVRJT04sCiAgICAgR0VUX0RVUkFUSU9OLAogICAgIFJFU0VULAorICAgIE5PVElGWV9BVCwKICAgICBTRVRfQVVESU9fU1RSRUFNX1RZUEUsCiAgICAgU0VUX0xPT1BJTkcsCiAgICAgU0VUX1ZPTFVNRSwKQEAgLTc1LDYgKzc4LDEwIEBACiAgICAgLy8gTW9kdWxhciBEUk0KICAgICBQUkVQQVJFX0RSTSwKICAgICBSRUxFQVNFX0RSTSwKKyAgICAvLyBBdWRpb1JvdXRpbmcKKyAgICBTRVRfT1VUUFVUX0RFVklDRSwKKyAgICBHRVRfUk9VVEVEX0RFVklDRV9JRCwKKyAgICBFTkFCTEVfQVVESU9fREVWSUNFX0NBTExCQUNLLAogfTsKIAogLy8gTW9kRHJtIGhlbHBlcnMKQEAgLTE3NywxNCArMTg0LDE0IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBnZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MoQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKQorICAgIHN0YXR1c190IGdldEJ1ZmZlcmluZ1NldHRpbmdzKEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykKICAgICB7CiAgICAgICAgIGlmIChidWZmZXJpbmcgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfREVGQVVMVF9CVUZGRVJJTkdfU0VUVElOR1MsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQlVGRkVSSU5HX1NFVFRJTkdTLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgZXJyID0gYnVmZmVyaW5nLT5yZWFkRnJvbVBhcmNlbCgmcmVwbHkpOwpAQCAtMzI2LDYgKzMzMywxNSBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCisgICAgc3RhdHVzX3Qgbm90aWZ5QXQoaW50NjRfdCBtZWRpYVRpbWVVcykKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDY0KG1lZGlhVGltZVVzKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE5PVElGWV9BVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKwogICAgIHN0YXR1c190IHNldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTUwOSw3ICs1MjUsNyBAQAogICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgICAgIH0KICAgICAgICAgc3A8Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gc3RhdGUgPSBuZXcgVm9sdW1lU2hhcGVyOjpTdGF0ZSgpOwotICAgICAgICBzdGF0dXMgPSBzdGF0ZS0+cmVhZEZyb21QYXJjZWwocmVwbHkpOworICAgICAgICBzdGF0dXMgPSBzdGF0ZS0+cmVhZEZyb21QYXJjZWwoJnJlcGx5KTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgICAgIH0KQEAgLTU0Nyw2ICs1NjMsNTkgQEAKIAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQorCisgICAgc3RhdHVzX3Qgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGRldmljZUlkKTsKKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX09VVFBVVF9ERVZJQ0UsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJzZXRPdXRwdXREZXZpY2U6IGJpbmRlciBjYWxsIGZhaWxlZDogJWQiLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1JPVVRFRF9ERVZJQ0VfSUQsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJnZXRSb3V0ZWREZXZpY2VpZDogYmluZGVyIGNhbGwgZmFpbGVkOiAlZCIsIHN0YXR1cyk7CisgICAgICAgICAgICAqZGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAqZGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmRldmljZUlkID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICBkYXRhLndyaXRlQm9vbChlbmFibGVkKTsKKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoRU5BQkxFX0FVRElPX0RFVklDRV9DQUxMQkFDSywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoImVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2s6IGJpbmRlciBjYWxsIGZhaWxlZDogJWQsICVkIiwgZW5hYmxlZCwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKE1lZGlhUGxheWVyLCAiYW5kcm9pZC5tZWRpYS5JTWVkaWFQbGF5ZXIiKTsKQEAgLTYzMSwxMCArNzAwLDEwIEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRCdWZmZXJpbmdTZXR0aW5ncyhidWZmZXJpbmcpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBHRVRfREVGQVVMVF9CVUZGRVJJTkdfU0VUVElOR1M6IHsKKyAgICAgICAgY2FzZSBHRVRfQlVGRkVSSU5HX1NFVFRJTkdTOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyBidWZmZXJpbmc7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBnZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MoJmJ1ZmZlcmluZyk7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBnZXRCdWZmZXJpbmdTZXR0aW5ncygmYnVmZmVyaW5nKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycik7CiAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgICAgICAgICAgYnVmZmVyaW5nLndyaXRlVG9QYXJjZWwocmVwbHkpOwpAQCAtNzQ0LDYgKzgxMywxMSBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzZXQoKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgTk9USUZZX0FUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihub3RpZnlBdChkYXRhLnJlYWRJbnQ2NCgpKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgU0VUX0FVRElPX1NUUkVBTV9UWVBFOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRBdWRpb1N0cmVhbVR5cGUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpIGRhdGEucmVhZEludDMyKCkpKTsKQEAgLTg1MSwxNCArOTI1LDE0IEBACiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigmcHJlc2VudCk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIHByZXNlbnQgIT0gMCkgewogICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gPSBuZXcgVm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gY29uZmlndXJhdGlvbi0+cmVhZEZyb21QYXJjZWwoZGF0YSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gY29uZmlndXJhdGlvbi0+cmVhZEZyb21QYXJjZWwoJmRhdGEpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIHN0YXR1cyA9IGRhdGEucmVhZEludDMyKCZwcmVzZW50KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgcHJlc2VudCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gbmV3IFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gb3BlcmF0aW9uLT5yZWFkRnJvbVBhcmNlbChkYXRhKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBvcGVyYXRpb24tPnJlYWRGcm9tUGFyY2VsKCZkYXRhKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpYXBwbHlWb2x1bWVTaGFwZXIoY29uZmlndXJhdGlvbiwgb3BlcmF0aW9uKTsKQEAgLTg5OSw2ICs5NzMsNDEgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7CiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KKworICAgICAgICAvLyBBdWRpb1JvdXRpbmcKKyAgICAgICAgY2FzZSBTRVRfT1VUUFVUX0RFVklDRTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgaW50IGRldmljZUlkOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoJmRldmljZUlkKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRPdXRwdXREZXZpY2UoZGV2aWNlSWQpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoQkFEX1ZBTFVFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEdFVF9ST1VURURfREVWSUNFX0lEOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkOworICAgICAgICAgICAgc3RhdHVzX3QgcmV0ID0gZ2V0Um91dGVkRGV2aWNlSWQoJmRldmljZUlkKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJldCk7CisgICAgICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZGV2aWNlSWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVOQUJMRV9BVURJT19ERVZJQ0VfQ0FMTEJBQ0s6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGJvb2wgZW5hYmxlZDsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZEJvb2woJmVuYWJsZWQpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soZW5hYmxlZCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihCQURfVkFMVUUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAKaW5kZXggYTAxODUyYy4uYWNhN2FkOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAKQEAgLTIwLDcgKzIwLDYgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPG1lZGlhL0lIRENQLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQ29kZWNMaXN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CkBAIC0zOSw4ICszOCw2IEBACiAgICAgQ1JFQVRFID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKICAgICBDUkVBVEVfTUVESUFfUkVDT1JERVIsCiAgICAgQ1JFQVRFX01FVEFEQVRBX1JFVFJJRVZFUiwKLSAgICBHRVRfT01YLAotICAgIE1BS0VfSERDUCwKICAgICBBRERfQkFUVEVSWV9EQVRBLAogICAgIFBVTExfQkFUVEVSWV9EQVRBLAogICAgIExJU1RFTl9GT1JfUkVNT1RFX0RJU1BMQVksCkBAIC04MywyMSArODAsNiBAQAogICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhUmVjb3JkZXI+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzcDxJT01YPiBnZXRPTVgoKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfT01YLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SU9NWD4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHNwPElIRENQPiBtYWtlSERDUChib29sIGNyZWF0ZUVuY3J5cHRpb25Nb2R1bGUpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGNyZWF0ZUVuY3J5cHRpb25Nb2R1bGUpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoTUFLRV9IRENQLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SUhEQ1A+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgfQotCiAgICAgdmlydHVhbCB2b2lkIGFkZEJhdHRlcnlEYXRhKHVpbnQzMl90IHBhcmFtcykgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwpAQCAtMTYxLDE5ICsxNDMsNiBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKHJldHJpZXZlcikpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIEdFVF9PTVg6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzcDxJT01YPiBvbXggPSBnZXRPTVgoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihvbXgpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBNQUtFX0hEQ1A6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBib29sIGNyZWF0ZUVuY3J5cHRpb25Nb2R1bGUgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc3A8SUhEQ1A+IGhkY3AgPSBtYWtlSERDUChjcmVhdGVFbmNyeXB0aW9uTW9kdWxlKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihoZGNwKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgQUREX0JBVFRFUllfREFUQTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHVpbnQzMl90IHBhcmFtcyA9IGRhdGEucmVhZEludDMyKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKaW5kZXggNTI4MjM1Mi4uYjJjOTFjNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcApAQCAtNjEsNiArNjEsMTAgQEAKICAgICBQQVVTRSwKICAgICBSRVNVTUUsCiAgICAgR0VUX01FVFJJQ1MsCisgICAgU0VUX0lOUFVUX0RFVklDRSwKKyAgICBHRVRfUk9VVEVEX0RFVklDRV9JRCwKKyAgICBFTkFCTEVfQVVESU9fREVWSUNFX0NBTExCQUNLLAorICAgIEdFVF9BQ1RJVkVfTUlDUk9QSE9ORVMsCiAKIH07CiAKQEAgLTMzNyw2ICszNDEsNzIgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFTEVBU0UsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CisKKyAgICBzdGF0dXNfdCBzZXRJbnB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKQorICAgIHsKKyAgICAgICAgQUxPR1YoInNldElucHV0RGV2aWNlIik7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVJlY29yZGVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoZGV2aWNlSWQpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfSU5QVVRfREVWSUNFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgic2V0SW5wdXREZXZpY2UgYmluZGVyIGNhbGwgZmFpbGVkOiAlZCIsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTs7CisgICAgfQorCisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90ICpkZXZpY2VJZCkKKyAgICB7CisgICAgICAgIEFMT0dWKCJnZXRSb3V0ZWREZXZpY2VJZCIpOworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFSZWNvcmRlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1JPVVRFRF9ERVZJQ0VfSUQsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJnZXRSb3V0ZWREZXZpY2VpZCBiaW5kZXIgY2FsbCBmYWlsZWQ6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICpkZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICpkZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZGV2aWNlSWQgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHN0YXR1c190IGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKQorICAgIHsKKyAgICAgICAgQUxPR1YoImVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2siKTsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUmVjb3JkZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVCb29sKGVuYWJsZWQpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoRU5BQkxFX0FVRElPX0RFVklDRV9DQUxMQkFDSywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoImVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2sgYmluZGVyIGNhbGwgZmFpbGVkOiAlZCwgJWQiLCBlbmFibGVkLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCisgICAgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpCisgICAgeworICAgICAgICBBTE9HVigiZ2V0QWN0aXZlTWljcm9waG9uZXMiKTsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUmVjb3JkZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQUNUSVZFX01JQ1JPUEhPTkVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LCisgICAgICAgICAgICAgICAgfHwgKHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZFBhcmNlbGFibGVWZWN0b3IoYWN0aXZlTWljcm9waG9uZXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKwogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKE1lZGlhUmVjb3JkZXIsICJhbmRyb2lkLm1lZGlhLklNZWRpYVJlY29yZGVyIik7CkBAIC01NDMsNiArNjEzLDU0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgU0VUX0lOUFVUX0RFVklDRTogeworICAgICAgICAgICAgQUxPR1YoIlNFVF9JTlBVVF9ERVZJQ0UiKTsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFSZWNvcmRlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZDsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZEludDMyKCZkZXZpY2VJZCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0SW5wdXREZXZpY2UoZGV2aWNlSWQpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoQkFEX1ZBTFVFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBHRVRfUk9VVEVEX0RFVklDRV9JRDogeworICAgICAgICAgICAgQUxPR1YoIkdFVF9ST1VURURfREVWSUNFX0lEIik7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUmVjb3JkZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQ7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRSb3V0ZWREZXZpY2VJZCgmZGV2aWNlSWQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihkZXZpY2VJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRU5BQkxFX0FVRElPX0RFVklDRV9DQUxMQkFDSzogeworICAgICAgICAgICAgQUxPR1YoIkVOQUJMRV9BVURJT19ERVZJQ0VfQ0FMTEJBQ0siKTsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFSZWNvcmRlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYm9vbCBlbmFibGVkOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkQm9vbCgmZW5hYmxlZCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhlbmFibGVkKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKEJBRF9WQUxVRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgR0VUX0FDVElWRV9NSUNST1BIT05FUzogeworICAgICAgICAgICAgQUxPR1YoIkdFVF9BQ1RJVkVfTUlDUk9QSE9ORVMiKTsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFSZWNvcmRlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiBhY3RpdmVNaWNyb3Bob25lczsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEFjdGl2ZU1pY3JvcGhvbmVzKCZhY3RpdmVNaWNyb3Bob25lcyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVBhcmNlbGFibGVWZWN0b3IoYWN0aXZlTWljcm9waG9uZXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworCisgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVNvdXJjZS5jcHAKaW5kZXggNzI0YjNhMC4uZjE4NWZkNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFTb3VyY2UuY3BwCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTExMyw4ICsxMTMsOSBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7Ci0gICAgICAgIFZlY3RvcjxNZWRpYUJ1ZmZlciAqPiBidWZmZXJzOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsCisgICAgICAgICAgICBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICAgICAgVmVjdG9yPE1lZGlhQnVmZmVyQmFzZSAqPiBidWZmZXJzOwogICAgICAgICBzdGF0dXNfdCByZXQgPSByZWFkTXVsdGlwbGUoJmJ1ZmZlcnMsIDEgLyogbWF4TnVtQnVmZmVycyAqLywgb3B0aW9ucyk7CiAgICAgICAgICpidWZmZXIgPSBidWZmZXJzLnNpemUoKSA9PSAwID8gbnVsbHB0ciA6IGJ1ZmZlcnNbMF07CiAgICAgICAgIEFMT0dWKCJyZWFkIHN0YXR1cyAlZCwgYnVmZmVyQ291bnQgJXUsIHNpbmNlU3RvcCAldSIsCkBAIC0xMjMsNyArMTI0LDggQEAKICAgICB9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWRNdWx0aXBsZSgKLSAgICAgICAgICAgIFZlY3RvcjxNZWRpYUJ1ZmZlciAqPiAqYnVmZmVycywgdWludDMyX3QgbWF4TnVtQnVmZmVycywgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICAgICAgICAgIFZlY3RvcjxNZWRpYUJ1ZmZlckJhc2UgKj4gKmJ1ZmZlcnMsIHVpbnQzMl90IG1heE51bUJ1ZmZlcnMsCisgICAgICAgICAgICBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICAgICAgQUxPR1YoInJlYWRNdWx0aXBsZSIpOwogICAgICAgICBpZiAoYnVmZmVycyA9PSBOVUxMIHx8ICFidWZmZXJzLT5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC0xNjksMTMgKzE3MSwxMyBAQAogICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGggPSByZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgICAgICBidWYgPSBuZXcgUmVtb3RlTWVkaWFCdWZmZXJXcmFwcGVyKG1lbSk7CiAgICAgICAgICAgICAgICAgYnVmLT5zZXRfcmFuZ2Uob2Zmc2V0LCBsZW5ndGgpOwotICAgICAgICAgICAgICAgIGJ1Zi0+bWV0YV9kYXRhKCktPnVwZGF0ZUZyb21QYXJjZWwocmVwbHkpOworICAgICAgICAgICAgICAgIGJ1Zi0+bWV0YV9kYXRhKCkudXBkYXRlRnJvbVBhcmNlbChyZXBseSk7CiAgICAgICAgICAgICB9IGVsc2UgeyAvLyBJTkxJTkVfQlVGRkVSCiAgICAgICAgICAgICAgICAgaW50MzJfdCBsZW4gPSByZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgICAgICBBTE9HVigiSU5MSU5FX0JVRkZFUiBzdGF0dXMgJWQgYW5kIGxlbiAlZCIsIHJldCwgbGVuKTsKICAgICAgICAgICAgICAgICBidWYgPSBuZXcgTWVkaWFCdWZmZXIobGVuKTsKICAgICAgICAgICAgICAgICByZXBseS5yZWFkKGJ1Zi0+ZGF0YSgpLCBsZW4pOwotICAgICAgICAgICAgICAgIGJ1Zi0+bWV0YV9kYXRhKCktPnVwZGF0ZUZyb21QYXJjZWwocmVwbHkpOworICAgICAgICAgICAgICAgIGJ1Zi0+bWV0YV9kYXRhKCkudXBkYXRlRnJvbVBhcmNlbChyZXBseSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBidWZmZXJzLT5wdXNoX2JhY2soYnVmKTsKICAgICAgICAgICAgICsrYnVmZmVyQ291bnQ7CkBAIC0yMTAsMTEgKzIxMiw2IEBACiAgICAgICAgIHJldHVybiByZW1vdGUoKS0+dHJhbnNhY3QoUEFVU0UsIGRhdGEsICZyZXBseSk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJzKGNvbnN0IFZlY3RvcjxNZWRpYUJ1ZmZlciAqPiAmIGJ1ZmZlcnMgX191bnVzZWQpIHsKLSAgICAgICAgQUxPR1YoInNldEJ1ZmZlcnMgTk9UIElNUExFTUVOVEVEIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsgLy8gZGVmYXVsdAotICAgIH0KLQogcHJpdmF0ZToKIAogICAgIHVpbnQzMl90IG1CdWZmZXJzU2luY2VTdG9wOyAvLyBCdWZmZXIgdHJhY2tpbmcgdmFyaWFibGUKQEAgLTMzMCw3ICszMjcsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBHZXQgcmVhZCBvcHRpb25zLCBpZiBhbnkuCi0gICAgICAgICAgICBSZWFkT3B0aW9ucyBvcHRzOworICAgICAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdHM7CiAgICAgICAgICAgICB1aW50MzJfdCBsZW47CiAgICAgICAgICAgICBjb25zdCBib29sIHVzZU9wdGlvbnMgPQogICAgICAgICAgICAgICAgICAgICBkYXRhLnJlYWRVaW50MzIoJmxlbikgPT0gTk9fRVJST1IKQEAgLTM0NCw3ICszNDEsNyBAQAogICAgICAgICAgICAgdWludDMyX3QgYnVmZmVyQ291bnQgPSAwOwogICAgICAgICAgICAgZm9yICg7IGJ1ZmZlckNvdW50IDwgbWF4TnVtQnVmZmVyczsgKytidWZmZXJDb3VudCwgKyttQnVmZmVyc1NpbmNlU3RvcCkgewogICAgICAgICAgICAgICAgIE1lZGlhQnVmZmVyICpidWYgPSBudWxscHRyOwotICAgICAgICAgICAgICAgIHJldCA9IHJlYWQoJmJ1ZiwgdXNlT3B0aW9ucyA/ICZvcHRzIDogbnVsbHB0cik7CisgICAgICAgICAgICAgICAgcmV0ID0gcmVhZCgoTWVkaWFCdWZmZXJCYXNlICoqKSZidWYsIHVzZU9wdGlvbnMgPyAmb3B0cyA6IG51bGxwdHIpOwogICAgICAgICAgICAgICAgIG9wdHMuY2xlYXJOb25QZXJzaXN0ZW50KCk7IC8vIFJlbW92ZSBvcHRpb25zIHRoYXQgb25seSBhcHBseSB0byBmaXJzdCBidWZmZXIuCiAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUiB8fCBidWYgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTM2Nyw3ICszNjQsNyBAQAogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkxhcmdlIGJ1ZmZlciAlenUgd2l0aG91dCBJTWVtb3J5ISIsIGxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNmZXJCdWYsIGZhbHNlIC8qIG5vbkJsb2NraW5nICovLCBsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWVkaWFCdWZmZXJCYXNlICoqKSZ0cmFuc2ZlckJ1ZiwgZmFsc2UgLyogbm9uQmxvY2tpbmcgKi8sIGxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IE9LCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHRyYW5zZmVyQnVmID09IG51bGxwdHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHJhbnNmZXJCdWYtPm1NZW1vcnkgPT0gbnVsbHB0cikgewpAQCAtNDExLDcgKzQwOCw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIob2Zmc2V0KTsKICAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmLT5tZXRhX2RhdGEoKS0+d3JpdGVUb1BhcmNlbCgqcmVwbHkpOworICAgICAgICAgICAgICAgICAgICBidWYtPm1ldGFfZGF0YSgpLndyaXRlVG9QYXJjZWwoKnJlcGx5KTsKICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJCdWYtPmFkZFJlbW90ZVJlZmNvdW50KDEpOwogICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmZXJCdWYgIT0gYnVmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlckJ1Zi0+cmVsZWFzZSgpOyAvLyByZWxlYXNlIGxvY2FsIHJlZgpAQCAtNDI0LDcgKzQyMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBidWYtPm1NZW1vcnktPnNpemUoKSwgbGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoSU5MSU5FX0JVRkZFUik7CiAgICAgICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUJ5dGVBcnJheShsZW5ndGgsICh1aW50OF90KilidWYtPmRhdGEoKSArIG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi0+bWV0YV9kYXRhKCktPndyaXRlVG9QYXJjZWwoKnJlcGx5KTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLT5tZXRhX2RhdGEoKS53cml0ZVRvUGFyY2VsKCpyZXBseSk7CiAgICAgICAgICAgICAgICAgICAgIGlubGluZVRyYW5zZmVyU2l6ZSArPSBsZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpbmxpbmVUcmFuc2ZlclNpemUgPiBrSW5saW5lTWF4VHJhbnNmZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1heE51bUJ1ZmZlcnMgPSAwOyAvLyBzdG9wIHJlYWRNdWx0aXBsZSBpZiBpbmxpbmUgdHJhbnNmZXIgaXMgdG9vIGxhcmdlLgpAQCAtNDQ5LDU4ICs0NDYsNSBAQAogICAgIH0KIH0KIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotSU1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6UmVhZE9wdGlvbnMoKSB7Ci0gICAgcmVzZXQoKTsKLX0KLQotdm9pZCBJTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpyZXNldCgpIHsKLSAgICBtT3B0aW9ucyA9IDA7Ci0gICAgbVNlZWtUaW1lVXMgPSAwOwotICAgIG1MYXRlbmVzc1VzID0gMDsKLSAgICBtTm9uQmxvY2tpbmcgPSBmYWxzZTsKLX0KLQotdm9pZCBJTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpzZXROb25CbG9ja2luZygpIHsKLSAgICBtTm9uQmxvY2tpbmcgPSB0cnVlOwotfQotCi12b2lkIElNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OmNsZWFyTm9uQmxvY2tpbmcoKSB7Ci0gICAgbU5vbkJsb2NraW5nID0gZmFsc2U7Ci19Ci0KLWJvb2wgSU1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6Z2V0Tm9uQmxvY2tpbmcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Ob25CbG9ja2luZzsKLX0KLQotdm9pZCBJTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpzZXRTZWVrVG8oaW50NjRfdCB0aW1lX3VzLCBTZWVrTW9kZSBtb2RlKSB7Ci0gICAgbU9wdGlvbnMgfD0ga1NlZWtUb19PcHRpb247Ci0gICAgbVNlZWtUaW1lVXMgPSB0aW1lX3VzOwotICAgIG1TZWVrTW9kZSA9IG1vZGU7Ci19Ci0KLXZvaWQgSU1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6Y2xlYXJTZWVrVG8oKSB7Ci0gICAgbU9wdGlvbnMgJj0gfmtTZWVrVG9fT3B0aW9uOwotICAgIG1TZWVrVGltZVVzID0gMDsKLSAgICBtU2Vla01vZGUgPSBTRUVLX0NMT1NFU1RfU1lOQzsKLX0KLQotYm9vbCBJTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpnZXRTZWVrVG8oCi0gICAgICAgIGludDY0X3QgKnRpbWVfdXMsIFNlZWtNb2RlICptb2RlKSBjb25zdCB7Ci0gICAgKnRpbWVfdXMgPSBtU2Vla1RpbWVVczsKLSAgICAqbW9kZSA9IG1TZWVrTW9kZTsKLSAgICByZXR1cm4gKG1PcHRpb25zICYga1NlZWtUb19PcHRpb24pICE9IDA7Ci19Ci0KLXZvaWQgSU1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6c2V0TGF0ZUJ5KGludDY0X3QgbGF0ZW5lc3NfdXMpIHsKLSAgICBtTGF0ZW5lc3NVcyA9IGxhdGVuZXNzX3VzOwotfQotCi1pbnQ2NF90IElNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OmdldExhdGVCeSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUxhdGVuZXNzVXM7Ci19Ci0KLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU9NWFN0b3JlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lPTVhTdG9yZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NDhmMWEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU9NWFN0b3JlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIklPTVhTdG9yZSIKLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgotI2luY2x1ZGUgPG1lZGlhL0lPTVhTdG9yZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214U3RvcmUuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lCaW5kZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWVudW0gewotICAgIENPTk5FQ1QgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAotICAgIExJU1RfU0VSVklDRV9BVFRSSUJVVEVTLAotICAgIEdFVF9OT0RFX1BSRUZJWCwKLSAgICBMSVNUX1JPTEVTLAotICAgIEdFVF9PTVgsCi19OwotCi0vLyBGb3J3YXJkIGRlY2xhcmF0aW9ucyBvZiBzdGQ6OnZlY3RvcjxUPiA8LT4gUGFyY2VsIGNvbnZlcnNpb24gZnVuY2l0b25zIHRoYXQKLS8vIGRlcGVuZCBvbiB3cml0ZVRvUGFyY2VsKCkgYW5kIHJlYWRUb1BhcmNlbCgpIGZvciBUIDwtPiBQYXJjZWwuCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChjb25zdCBzdGQ6OnZlY3RvcjxUPiYgdiwgUGFyY2VsKiBwKTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChzdGQ6OnZlY3RvcjxUPiogdiwgY29uc3QgUGFyY2VsJiBwKTsKLQotLy8gc3RkOjpzdHJpbmcgPC0+IFBhcmNlbAotCi1zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKGNvbnN0IHN0ZDo6c3RyaW5nJiBzLCBQYXJjZWwqIHApIHsKLSAgICBpZiAocy5zaXplKCkgPiBJTlQzMl9NQVgpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgcmV0dXJuIHAtPndyaXRlQnl0ZUFycmF5KAotICAgICAgICAgICAgcy5zaXplKCksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHMuY19zdHIoKSkpOwotfQotCi1zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChzdGQ6OnN0cmluZyogcywgY29uc3QgUGFyY2VsJiBwKSB7Ci0gICAgaW50MzJfdCBsZW47Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcC5yZWFkSW50MzIoJmxlbik7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0gZWxzZSBpZiAoKGxlbiA8IDApIHx8IChzdGF0aWNfY2FzdDx1aW50NjRfdD4obGVuKSA+IFNJWkVfTUFYKSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzLT5yZXNpemUobGVuKTsKLSAgICBpZiAobGVuID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICByZXR1cm4gcC5yZWFkKHN0YXRpY19jYXN0PHZvaWQqPigmcy0+ZnJvbnQoKSksIHN0YXRpY19jYXN0PHNpemVfdD4obGVuKSk7Ci19Ci0KLS8vIElPTVhTdG9yZTo6QXR0cmlidXRlIDwtPiBQYXJjZWwKLQotc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChjb25zdCBJT01YU3RvcmU6OkF0dHJpYnV0ZSYgYSwgUGFyY2VsKiBwKSB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gd3JpdGVUb1BhcmNlbChhLmtleSwgcCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICByZXR1cm4gd3JpdGVUb1BhcmNlbChhLnZhbHVlLCBwKTsKLX0KLQotc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoSU9NWFN0b3JlOjpBdHRyaWJ1dGUqIGEsIGNvbnN0IFBhcmNlbCYgcCkgewotICAgIHN0YXR1c190IHN0YXR1cyA9IHJlYWRGcm9tUGFyY2VsKCYoYS0+a2V5KSwgcCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICByZXR1cm4gcmVhZEZyb21QYXJjZWwoJihhLT52YWx1ZSksIHApOwotfQotCi0vLyBJT01YU3RvcmU6Ok5vZGVJbmZvIDwtPiBQYXJjZWwKLQotc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChjb25zdCBJT01YU3RvcmU6Ok5vZGVJbmZvJiBuLCBQYXJjZWwqIHApIHsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSB3cml0ZVRvUGFyY2VsKG4ubmFtZSwgcCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBzdGF0dXMgPSB3cml0ZVRvUGFyY2VsKG4ub3duZXIsIHApOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgcmV0dXJuIHdyaXRlVG9QYXJjZWwobi5hdHRyaWJ1dGVzLCBwKTsKLX0KLQotc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoSU9NWFN0b3JlOjpOb2RlSW5mbyogbiwgY29uc3QgUGFyY2VsJiBwKSB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVhZEZyb21QYXJjZWwoJihuLT5uYW1lKSwgcCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBzdGF0dXMgPSByZWFkRnJvbVBhcmNlbCgmKG4tPm93bmVyKSwgcCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICByZXR1cm4gcmVhZEZyb21QYXJjZWwoJihuLT5hdHRyaWJ1dGVzKSwgcCk7Ci19Ci0KLS8vIElPTVhTdG9yZTo6Um9sZUluZm8gPC0+IFBhcmNlbAotCi1zdGF0dXNfdCB3cml0ZVRvUGFyY2VsKGNvbnN0IElPTVhTdG9yZTo6Um9sZUluZm8mIHIsIFBhcmNlbCogcCkgewotICAgIHN0YXR1c190IHN0YXR1cyA9IHdyaXRlVG9QYXJjZWwoci5yb2xlLCBwKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHN0YXR1cyA9IHdyaXRlVG9QYXJjZWwoci50eXBlLCBwKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHN0YXR1cyA9IHAtPndyaXRlQm9vbChyLmlzRW5jb2Rlcik7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBzdGF0dXMgPSBwLT53cml0ZUJvb2woci5wcmVmZXJQbGF0Zm9ybU5vZGVzKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHJldHVybiB3cml0ZVRvUGFyY2VsKHIubm9kZXMsIHApOwotfQotCi1zdGF0dXNfdCByZWFkRnJvbVBhcmNlbChJT01YU3RvcmU6OlJvbGVJbmZvKiByLCBjb25zdCBQYXJjZWwmIHApIHsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSByZWFkRnJvbVBhcmNlbCgmKHItPnJvbGUpLCBwKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHN0YXR1cyA9IHJlYWRGcm9tUGFyY2VsKCYoci0+dHlwZSksIHApOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgc3RhdHVzID0gcC5yZWFkQm9vbCgmKHItPmlzRW5jb2RlcikpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgc3RhdHVzID0gcC5yZWFkQm9vbCgmKHItPnByZWZlclBsYXRmb3JtTm9kZXMpKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHJldHVybiByZWFkRnJvbVBhcmNlbCgmKHItPm5vZGVzKSwgcCk7Ci19Ci0KLS8vIHN0ZDo6dmVjdG9yPE5vZGVJbmZvPiA8LT4gUGFyY2VsCi0vLyBzdGQ6OnZlY3RvcjxSb2xlSW5mbz4gPC0+IFBhcmNlbAotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0YXR1c190IHdyaXRlVG9QYXJjZWwoY29uc3Qgc3RkOjp2ZWN0b3I8VD4mIHYsIFBhcmNlbCogcCkgewotICAgIHN0YXR1c190IHN0YXR1cyA9IHAtPndyaXRlVmVjdG9yU2l6ZSh2KTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIGZvciAoY29uc3QgVCYgeCA6IHYpIHsKLSAgICAgICAgc3RhdHVzID0gd3JpdGVUb1BhcmNlbCh4LCBwKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoc3RkOjp2ZWN0b3I8VD4qIHYsIGNvbnN0IFBhcmNlbCYgcCkgewotICAgIHN0YXR1c190IHN0YXR1cyA9IHAucmVzaXplT3V0VmVjdG9yKHYpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgZm9yIChUJiB4IDogKnYpIHsKLSAgICAgICAgc3RhdHVzID0gcmVhZEZyb21QYXJjZWwoJngsIHApOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1jbGFzcyBCcE9NWFN0b3JlIDogcHVibGljIEJwSW50ZXJmYWNlPElPTVhTdG9yZT4gewotcHVibGljOgotICAgIGV4cGxpY2l0IEJwT01YU3RvcmUoY29uc3Qgc3A8SUJpbmRlcj4gJmltcGwpCi0gICAgICAgIDogQnBJbnRlcmZhY2U8SU9NWFN0b3JlPihpbXBsKSB7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgbGlzdFNlcnZpY2VBdHRyaWJ1dGVzKAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QXR0cmlidXRlPiogYXR0cmlidXRlcykgb3ZlcnJpZGUgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1czsKLSAgICAgICAgc3RhdHVzID0gZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVhTdG9yZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTElTVF9TRVJWSUNFX0FUVFJJQlVURVMsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlYWRGcm9tUGFyY2VsKGF0dHJpYnV0ZXMsIHJlcGx5KTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBnZXROb2RlUHJlZml4KHN0ZDo6c3RyaW5nKiBwcmVmaXgpIG92ZXJyaWRlIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgICAgIHN0YXR1cyA9IGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YU3RvcmU6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9OT0RFX1BSRUZJWCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVhZEZyb21QYXJjZWwocHJlZml4LCByZXBseSk7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgbGlzdFJvbGVzKHN0ZDo6dmVjdG9yPFJvbGVJbmZvPiogcm9sZUxpc3QpIG92ZXJyaWRlIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgICAgIHN0YXR1cyA9IGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YU3RvcmU6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KExJU1RfUk9MRVMsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlYWRGcm9tUGFyY2VsKHJvbGVMaXN0LCByZXBseSk7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZ2V0T214KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBzcDxJT01YPiogb214KSBvdmVycmlkZSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgICAgICBzdGF0dXMgPSBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWFN0b3JlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1cyA9IHdyaXRlVG9QYXJjZWwobmFtZSwgJmRhdGEpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfT01YLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkU3Ryb25nQmluZGVyKG9teCk7Ci0gICAgfQotCi19OwotCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoT01YU3RvcmUsICJhbmRyb2lkLmhhcmR3YXJlLklPTVhTdG9yZSIpOwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0jZGVmaW5lIENIRUNLX09NWF9JTlRFUkZBQ0UoaW50ZXJmYWNlLCBkYXRhLCByZXBseSkgXAotICAgICAgICBkbyB7IGlmICghKGRhdGEpLmVuZm9yY2VJbnRlcmZhY2UoaW50ZXJmYWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpKSB7IFwKLSAgICAgICAgICAgIEFMT0dXKCJDYWxsIGluY29ycmVjdGx5IHJvdXRlZCB0byAiICNpbnRlcmZhY2UpOyBcCi0gICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7IFwKLSAgICAgICAgfSB9IHdoaWxlICgwKQotCi1zdGF0dXNfdCBCbk9NWFN0b3JlOjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCAmZGF0YSwgUGFyY2VsICpyZXBseSwgdWludDMyX3QgZmxhZ3MpIHsKLSAgICBzd2l0Y2ggKGNvZGUpIHsKLSAgICAgICAgY2FzZSBMSVNUX1NFUlZJQ0VfQVRUUklCVVRFUzogewotICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YU3RvcmUsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1czsKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEF0dHJpYnV0ZT4gYXR0cmlidXRlczsKLQotICAgICAgICAgICAgc3RhdHVzID0gbGlzdFNlcnZpY2VBdHRyaWJ1dGVzKCZhdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgibGlzdFNlcnZpY2VBdHRyaWJ1dGVzKCkgZmFpbHMgd2l0aCBzdGF0dXMgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXMgPSB3cml0ZVRvUGFyY2VsKGF0dHJpYnV0ZXMsIHJlcGx5KTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgibGlzdFNlcnZpY2VBdHRyaWJ1dGVzKCkgZmFpbHMgdG8gc2VuZCByZXBseSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEdFVF9OT0RFX1BSRUZJWDogewotICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YU3RvcmUsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1czsKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeDsKLQotICAgICAgICAgICAgc3RhdHVzID0gZ2V0Tm9kZVByZWZpeCgmcHJlZml4KTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0Tm9kZVByZWZpeCgpIGZhaWxzIHdpdGggc3RhdHVzICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzID0gd3JpdGVUb1BhcmNlbChwcmVmaXgsIHJlcGx5KTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0Tm9kZVByZWZpeCgpIGZhaWxzIHRvIHNlbmQgcmVwbHkiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBMSVNUX1JPTEVTOiB7Ci0gICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVhTdG9yZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Um9sZUluZm8+IHJvbGVMaXN0OwotCi0gICAgICAgICAgICBzdGF0dXMgPSBsaXN0Um9sZXMoJnJvbGVMaXN0KTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgibGlzdFJvbGVzKCkgZmFpbHMgd2l0aCBzdGF0dXMgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXMgPSB3cml0ZVRvUGFyY2VsKHJvbGVMaXN0LCByZXBseSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImxpc3RSb2xlcygpIGZhaWxzIHRvIHNlbmQgcmVwbHkiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBHRVRfT01YOiB7Ci0gICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVhTdG9yZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKLSAgICAgICAgICAgIHNwPElPTVg+IG9teDsKLQotICAgICAgICAgICAgc3RhdHVzID0gcmVhZEZyb21QYXJjZWwoJm5hbWUsIGRhdGEpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRPbXgoKSBmYWlscyB0byByZXRyaWV2ZSBuYW1lIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzID0gZ2V0T214KG5hbWUsICZvbXgpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRPbXgoKSBmYWlscyB3aXRoIHN0YXR1cyAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOwotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihvbXgpKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0T214KCkgZmFpbHMgdG8gc2VuZCByZXBseSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLSAgICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JU3RyZWFtU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lTdHJlYW1Tb3VyY2UuY3BwCmluZGV4IGJhMGEyNzIuLmUxMWJjNzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lTdHJlYW1Tb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lTdHJlYW1Tb3VyY2UuY3BwCkBAIC0yMCwyNCArMjAsMTMgQEAKIAogI2luY2x1ZGUgPG1lZGlhL0lTdHJlYW1Tb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUtleXMuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLS8vIHN0YXRpYwotY29uc3QgY2hhciAqY29uc3QgSVN0cmVhbUxpc3RlbmVyOjprS2V5UmVzdW1lQXRQVFMgPSAicmVzdW1lLWF0LVBUUyI7Ci0KLS8vIHN0YXRpYwotY29uc3QgY2hhciAqY29uc3QgSVN0cmVhbUxpc3RlbmVyOjprS2V5RGlzY29udGludWl0eU1hc2sgPSAiZGlzY29udGludWl0eS1tYXNrIjsKLQotLy8gc3RhdGljCi1jb25zdCBjaGFyICpjb25zdCBJU3RyZWFtTGlzdGVuZXI6OmtLZXlNZWRpYVRpbWVVcyA9ICJtZWRpYS10aW1lLXVzIjsKLQotLy8gc3RhdGljCi1jb25zdCBjaGFyICpjb25zdCBJU3RyZWFtTGlzdGVuZXI6OmtLZXlSZWNlbnRNZWRpYVRpbWVVcyA9ICJyZWNlbnQtbWVkaWEtdGltZS11cyI7Ci0KIGVudW0gewogICAgIC8vIElTdHJlYW1Tb3VyY2UKICAgICBTRVRfTElTVEVORVIgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSmV0UGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0pldFBsYXllci5jcHAKaW5kZXggMzRkZWI1OS4uMGQzYzFiYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSmV0UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9KZXRQbGF5ZXIuY3BwCkBAIC0zNiw2ICszNiw3IEBACiAgICAgICAgIG1QYXVzZWQoZmFsc2UpLAogICAgICAgICBtTWF4VHJhY2tzKG1heFRyYWNrcyksCiAgICAgICAgIG1FYXNEYXRhKE5VTEwpLAorICAgICAgICBtSW9XcmFwcGVyKE5VTEwpLAogICAgICAgICBtVHJhY2tCdWZmZXJTaXplKHRyYWNrQnVmZmVyU2l6ZSkKIHsKICAgICBBTE9HVigiSmV0UGxheWVyIGNvbnN0cnVjdG9yIik7CkBAIC01MCw3ICs1MSw2IEBACiB7CiAgICAgQUxPR1YoIn5KZXRQbGF5ZXIiKTsKICAgICByZWxlYXNlKCk7Ci0KIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMzgsNyArMTM4LDggQEAKICAgICAgICAgSkVUX1NodXRkb3duKG1FYXNEYXRhKTsKICAgICAgICAgRUFTX1NodXRkb3duKG1FYXNEYXRhKTsKICAgICB9Ci0gICAgbUlvV3JhcHBlci5jbGVhcigpOworICAgIGRlbGV0ZSBtSW9XcmFwcGVyOworICAgIG1Jb1dyYXBwZXIgPSBOVUxMOwogICAgIGlmIChtQXVkaW9UcmFjayAhPSAwKSB7CiAgICAgICAgIG1BdWRpb1RyYWNrLT5zdG9wKCk7CiAgICAgICAgIG1BdWRpb1RyYWNrLT5mbHVzaCgpOwpAQCAtMzI5LDYgKzMzMCw3IEBACiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwogCisgICAgZGVsZXRlIG1Jb1dyYXBwZXI7CiAgICAgbUlvV3JhcHBlciA9IG5ldyBNaWRpSW9XcmFwcGVyKHBhdGgpOwogCiAgICAgRUFTX1JFU1VMVCByZXN1bHQgPSBKRVRfT3BlbkZpbGUobUVhc0RhdGEsIG1Jb1dyYXBwZXItPmdldExvY2F0b3IoKSk7CkBAIC0zNDcsNiArMzQ5LDcgQEAKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CiAKKyAgICBkZWxldGUgbUlvV3JhcHBlcjsKICAgICBtSW9XcmFwcGVyID0gbmV3IE1pZGlJb1dyYXBwZXIoZmQsIG9mZnNldCwgbGVuZ3RoKTsKIAogICAgIEVBU19SRVNVTFQgcmVzdWx0ID0gSkVUX09wZW5GaWxlKG1FYXNEYXRhLCBtSW9XcmFwcGVyLT5nZXRMb2NhdG9yKCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmNwcAppbmRleCA1OWQ2MTY0Li42OGFlM2VhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmNwcApAQCAtMjEsMTUgKzIxLDEzIEBACiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhQnVmZmVyQmFzZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIE1lZGlhQ29kZWNCdWZmZXI6Ok1lZGlhQ29kZWNCdWZmZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpCiAgICAgOiBtTWV0YShuZXcgQU1lc3NhZ2UpLAogICAgICAgbUZvcm1hdChmb3JtYXQpLAotICAgICAgbUJ1ZmZlcihidWZmZXIpLAotICAgICAgbU1lZGlhQnVmZmVyQmFzZShudWxscHRyKSB7CisgICAgICBtQnVmZmVyKGJ1ZmZlcikgewogfQogCiAvLyBBQnVmZmVyLWxpa2UgaW50ZXJmYWNlCkBAIC01OCwyMCArNTYsNiBAQAogICAgIHJldHVybiBPSzsKIH0KIAotTWVkaWFCdWZmZXJCYXNlICpNZWRpYUNvZGVjQnVmZmVyOjpnZXRNZWRpYUJ1ZmZlckJhc2UoKSB7Ci0gICAgaWYgKG1NZWRpYUJ1ZmZlckJhc2UgIT0gTlVMTCkgewotICAgICAgICBtTWVkaWFCdWZmZXJCYXNlLT5hZGRfcmVmKCk7Ci0gICAgfQotICAgIHJldHVybiBtTWVkaWFCdWZmZXJCYXNlOwotfQotCi12b2lkIE1lZGlhQ29kZWNCdWZmZXI6OnNldE1lZGlhQnVmZmVyQmFzZShNZWRpYUJ1ZmZlckJhc2UgKm1lZGlhQnVmZmVyKSB7Ci0gICAgaWYgKG1NZWRpYUJ1ZmZlckJhc2UgIT0gTlVMTCkgewotICAgICAgICBtTWVkaWFCdWZmZXJCYXNlLT5yZWxlYXNlKCk7Ci0gICAgfQotICAgIG1NZWRpYUJ1ZmZlckJhc2UgPSBtZWRpYUJ1ZmZlcjsKLX0KLQogc3A8QU1lc3NhZ2U+IE1lZGlhQ29kZWNCdWZmZXI6Om1ldGEoKSB7CiAgICAgcmV0dXJuIG1NZXRhOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFDb2RlY0luZm8uY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFDb2RlY0luZm8uY3BwCmluZGV4IGE1NzBmZmUuLjUzMDhlMWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhQ29kZWNJbmZvLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjSW5mby5jcHAKQEAgLTE0MSw2ICsxNDEsMTAgQEAKICAgICByZXR1cm4gbUlzRW5jb2RlcjsKIH0KIAordWludDMyX3QgTWVkaWFDb2RlY0luZm86OnJhbmsoKSBjb25zdCB7CisgICAgcmV0dXJuIG1SYW5rOworfQorCiB2b2lkIE1lZGlhQ29kZWNJbmZvOjpnZXRTdXBwb3J0ZWRNaW1lcyhWZWN0b3I8QVN0cmluZz4gKm1pbWVzKSBjb25zdCB7CiAgICAgbWltZXMtPmNsZWFyKCk7CiAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IG1DYXBzLnNpemUoKTsgaXgrKykgewpAQCAtMTcwLDEwICsxNzQsMTIgQEAKICAgICBBU3RyaW5nIG5hbWUgPSBBU3RyaW5nOjpGcm9tUGFyY2VsKHBhcmNlbCk7CiAgICAgQVN0cmluZyBvd25lciA9IEFTdHJpbmc6OkZyb21QYXJjZWwocGFyY2VsKTsKICAgICBib29sIGlzRW5jb2RlciA9IHN0YXRpY19jYXN0PGJvb2w+KHBhcmNlbC5yZWFkSW50MzIoKSk7CisgICAgdWludDMyX3QgcmFuayA9IHBhcmNlbC5yZWFkVWludDMyKCk7CiAgICAgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSBuZXcgTWVkaWFDb2RlY0luZm87CiAgICAgaW5mby0+bU5hbWUgPSBuYW1lOwogICAgIGluZm8tPm1Pd25lciA9IG93bmVyOwogICAgIGluZm8tPm1Jc0VuY29kZXIgPSBpc0VuY29kZXI7CisgICAgaW5mby0+bVJhbmsgPSByYW5rOwogICAgIHNpemVfdCBzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihwYXJjZWwucmVhZEludDMyKCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgIEFTdHJpbmcgbWltZSA9IEFTdHJpbmc6OkZyb21QYXJjZWwocGFyY2VsKTsKQEAgLTE5MSw2ICsxOTcsNyBAQAogICAgIG1OYW1lLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKICAgICBtT3duZXIud3JpdGVUb1BhcmNlbChwYXJjZWwpOwogICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtSXNFbmNvZGVyKTsKKyAgICBwYXJjZWwtPndyaXRlVWludDMyKG1SYW5rKTsKICAgICBwYXJjZWwtPndyaXRlSW50MzIobUNhcHMuc2l6ZSgpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DYXBzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIG1DYXBzLmtleUF0KGkpLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKQEAgLTIxMCw3ICsyMTcsNyBAQAogICAgIHJldHVybiAtMTsKIH0KIAotTWVkaWFDb2RlY0luZm86Ok1lZGlhQ29kZWNJbmZvKCkgeworTWVkaWFDb2RlY0luZm86Ok1lZGlhQ29kZWNJbmZvKCkgOiBtUmFuaygweDEwMCkgewogfQogCiB2b2lkIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjpzZXROYW1lKGNvbnN0IGNoYXIqIG5hbWUpIHsKQEAgLTIyNSw2ICsyMzIsMTAgQEAKICAgICBtSW5mby0+bUlzRW5jb2RlciA9IGlzRW5jb2RlcjsKIH0KIAordm9pZCBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6c2V0UmFuayh1aW50MzJfdCByYW5rKSB7CisgICAgbUluZm8tPm1SYW5rID0gcmFuazsKK30KKwogc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+CiAgICAgICAgIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjphZGRNaW1lKGNvbnN0IGNoYXIgKm1pbWUpIHsKICAgICBzc2l6ZV90IGl4ID0gbUluZm8tPmdldENhcGFiaWxpdHlJbmRleChtaW1lKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhRGVmcy5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYURlZnMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDRhNmFlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhRGVmcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPG1lZGlhL01lZGlhRGVmcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0lNQUdFX0pQRUcgPSAiaW1hZ2UvanBlZyI7Ci0KLWNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCA9ICJ2aWRlby94LXZuZC5vbjIudnA4IjsKLWNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSA9ICJ2aWRlby94LXZuZC5vbjIudnA5IjsKLWNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyA9ICJ2aWRlby9hdmMiOwotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQyA9ICJ2aWRlby9oZXZjIjsKLWNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0ID0gInZpZGVvL21wNHYtZXMiOwotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MyA9ICJ2aWRlby8zZ3BwIjsKLWNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyID0gInZpZGVvL21wZWcyIjsKLWNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1JBVyA9ICJ2aWRlby9yYXciOwotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OID0gInZpZGVvL2RvbGJ5LXZpc2lvbiI7Ci1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19TQ1JBTUJMRUQgPSAidmlkZW8vc2NyYW1ibGVkIjsKLQotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CID0gImF1ZGlvLzNncHAiOwotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCID0gImF1ZGlvL2Ftci13YiI7Ci1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHID0gImF1ZGlvL21wZWciOwotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JID0gImF1ZGlvL21wZWctTDEiOwotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JSSA9ICJhdWRpby9tcGVnLUwyIjsKLWNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01JREkgPSAiYXVkaW8vbWlkaSI7Ci1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUMgPSAiYXVkaW8vbXA0YS1sYXRtIjsKLWNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1FDRUxQID0gImF1ZGlvL3FjZWxwIjsKLWNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUyA9ICJhdWRpby92b3JiaXMiOwotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUyA9ICJhdWRpby9vcHVzIjsKLWNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVyA9ICJhdWRpby9nNzExLWFsYXciOwotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXID0gImF1ZGlvL2c3MTEtbWxhdyI7Ci1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19SQVcgPSAiYXVkaW8vcmF3IjsKLWNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMgPSAiYXVkaW8vZmxhYyI7Ci1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUUyA9ICJhdWRpby9hYWMtYWR0cyI7Ci1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NU0dTTSA9ICJhdWRpby9nc20iOwotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUMzID0gImF1ZGlvL2FjMyI7Ci1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzID0gImF1ZGlvL2VhYzMiOwotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fU0NSQU1CTEVEID0gImF1ZGlvL3NjcmFtYmxlZCI7Ci0KLWNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNCA9ICJ2aWRlby9tcDQiOwotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dBViA9ICJhdWRpby94LXdhdiI7Ci1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfT0dHID0gImFwcGxpY2F0aW9uL29nZyI7Ci1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTUFUUk9TS0EgPSAidmlkZW8veC1tYXRyb3NrYSI7Ci1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJUUyA9ICJ2aWRlby9tcDJ0cyI7Ci1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfQVZJID0gInZpZGVvL2F2aSI7Ci1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJQUyA9ICJ2aWRlby9tcDJwIjsKLQotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQID0gInRleHQvM2dwcC10dCI7Ci1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUX1NVQlJJUCA9ICJhcHBsaWNhdGlvbi94LXN1YnJpcCI7Ci1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUX1ZUVCA9ICJ0ZXh0L3Z0dCI7Ci1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUX0NFQV82MDggPSAidGV4dC9jZWEtNjA4IjsKLWNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1RFWFRfQ0VBXzcwOCA9ICJ0ZXh0L2NlYS03MDgiOwotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfREFUQV9USU1FRF9JRDMgPSAiYXBwbGljYXRpb24veC1pZDN2NCI7Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NaWRpSW9XcmFwcGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwCmluZGV4IDRlNWQ2N2YuLjVjYTNiNDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwCkBAIC0zOCw2ICszOCw3IEBACiAgICAgbUZkID0gb3BlbihwYXRoLCBPX1JET05MWSB8IE9fTEFSR0VGSUxFKTsKICAgICBtQmFzZSA9IDA7CiAgICAgbUxlbmd0aCA9IGxzZWVrKG1GZCwgMCwgU0VFS19FTkQpOworICAgIG1EYXRhU291cmNlID0gbnVsbHB0cjsKIH0KIAogTWlkaUlvV3JhcHBlcjo6TWlkaUlvV3JhcHBlcihpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBpbnQ2NF90IHNpemUpIHsKQEAgLTQ1LDkgKzQ2LDEwIEBACiAgICAgbUZkID0gZmQgPCAwID8gLTEgOiBkdXAoZmQpOwogICAgIG1CYXNlID0gb2Zmc2V0OwogICAgIG1MZW5ndGggPSBzaXplOworICAgIG1EYXRhU291cmNlID0gbnVsbHB0cjsKIH0KIAotTWlkaUlvV3JhcHBlcjo6TWlkaUlvV3JhcHBlcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKSB7CitNaWRpSW9XcmFwcGVyOjpNaWRpSW9XcmFwcGVyKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIHsKICAgICBBTE9HVigiTWlkaUlvV3JhcHBlcihEYXRhU291cmNlKSIpOwogICAgIG1GZCA9IC0xOwogICAgIG1EYXRhU291cmNlID0gc291cmNlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTmRrV3JhcHBlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9OZGtXcmFwcGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzJiYzMwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvTmRrV3JhcHBlci5jcHAKQEAgLTAsMCArMSwxMzA2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk5ka1dyYXBwZXIiCisKKyNpbmNsdWRlIDxtZWRpYS9OZGtXcmFwcGVyLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhQ3J5cHRvLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFEcm0uaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKy8vIFRPRE86IHJlbW92ZSBmb3J3YXJkIGRlY2xhcmF0aW9uIHdoZW4gQU1lZGlhRXh0cmFjdG9yX2Rpc2Nvbm5lY3QgaXMgb2ZmY2lhbGx5IGFkZGVkIHRvIE5ESworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9kaXNjb25uZWN0KEFNZWRpYUV4dHJhY3RvciAqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBzaXplX3Qga0FFU0Jsb2NrU2l6ZSA9IDE2OyAgLy8gQUVTX0JMT0NLX1NJWkUKKworc3RhdGljIGNvbnN0IGNoYXIgKkFNZWRpYUZvcm1hdEtleUdyb3VwSW50MzJbXSA9IHsKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FBQ19EUkNfQVRURU5VQVRJT05fRkFDVE9SLAorICAgIEFNRURJQUZPUk1BVF9LRVlfQUFDX0RSQ19CT09TVF9GQUNUT1IsCisgICAgQU1FRElBRk9STUFUX0tFWV9BQUNfRFJDX0hFQVZZX0NPTVBSRVNTSU9OLAorICAgIEFNRURJQUZPUk1BVF9LRVlfQUFDX0RSQ19UQVJHRVRfUkVGRVJFTkNFX0xFVkVMLAorICAgIEFNRURJQUZPUk1BVF9LRVlfQUFDX0VOQ09ERURfVEFSR0VUX0xFVkVMLAorICAgIEFNRURJQUZPUk1BVF9LRVlfQUFDX01BWF9PVVRQVVRfQ0hBTk5FTF9DT1VOVCwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FBQ19QUk9GSUxFLAorICAgIEFNRURJQUZPUk1BVF9LRVlfQUFDX1NCUl9NT0RFLAorICAgIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fU0VTU0lPTl9JRCwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0JJVFJBVEVfTU9ERSwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFLAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ0FQVFVSRV9SQVRFLAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfTUFTSywKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX0ZPUk1BVCwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1JBTkdFLAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfU1RBTkRBUkQsCisgICAgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9UUkFOU0ZFUiwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NPTVBMRVhJVFksCisgICAgQU1FRElBRk9STUFUX0tFWV9GTEFDX0NPTVBSRVNTSU9OX0xFVkVMLAorICAgIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9DT0xVTU5TLAorICAgIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9ST1dTLAorICAgIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULAorICAgIEFNRURJQUZPUk1BVF9LRVlfSU5UUkFfUkVGUkVTSF9QRVJJT0QsCisgICAgQU1FRElBRk9STUFUX0tFWV9JU19BRFRTLAorICAgIEFNRURJQUZPUk1BVF9LRVlfSVNfQVVUT1NFTEVDVCwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0lTX0RFRkFVTFQsCisgICAgQU1FRElBRk9STUFUX0tFWV9JU19GT1JDRURfU1VCVElUTEUsCisgICAgQU1FRElBRk9STUFUX0tFWV9MQVRFTkNZLAorICAgIEFNRURJQUZPUk1BVF9LRVlfTEVWRUwsCisgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSEVJR0hULAorICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsCisgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfV0lEVEgsCisgICAgQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkcsCisgICAgQU1FRElBRk9STUFUX0tFWV9QUklPUklUWSwKKyAgICBBTUVESUFGT1JNQVRfS0VZX1BST0ZJTEUsCisgICAgQU1FRElBRk9STUFUX0tFWV9QVVNIX0JMQU5LX0JVRkZFUlNfT05fU1RPUCwKKyAgICBBTUVESUFGT1JNQVRfS0VZX1JPVEFUSU9OLAorICAgIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsCisgICAgQU1FRElBRk9STUFUX0tFWV9TTElDRV9IRUlHSFQsCisgICAgQU1FRElBRk9STUFUX0tFWV9TVFJJREUsCisgICAgQU1FRElBRk9STUFUX0tFWV9UUkFDS19JRCwKKyAgICBBTUVESUFGT1JNQVRfS0VZX1dJRFRILAorICAgIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9IRUlHSFQsCisgICAgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX1dJRFRILAorICAgIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfSUQsCisgICAgQU1FRElBRk9STUFUX0tFWV9USUxFX0hFSUdIVCwKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RJTEVfV0lEVEgsCisgICAgQU1FRElBRk9STUFUX0tFWV9UUkFDS19JTkRFWCwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpBTWVkaWFGb3JtYXRLZXlHcm91cEludDY0W10gPSB7CisgICAgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwKKyAgICBBTUVESUFGT1JNQVRfS0VZX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9BRlRFUiwKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqQU1lZGlhRm9ybWF0S2V5R3JvdXBTdHJpbmdbXSA9IHsKKyAgICBBTUVESUFGT1JNQVRfS0VZX0xBTkdVQUdFLAorICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSSU5HLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKkFNZWRpYUZvcm1hdEtleUdyb3VwQnVmZmVyW10gPSB7CisgICAgQU1FRElBRk9STUFUX0tFWV9IRFJfU1RBVElDX0lORk8sCisgICAgQU1FRElBRk9STUFUX0tFWV9TRUksCisgICAgQU1FRElBRk9STUFUX0tFWV9NUEVHX1VTRVJfREFUQSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpBTWVkaWFGb3JtYXRLZXlHcm91cENzZFtdID0geworICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsCisgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMSwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8yLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKkFNZWRpYUZvcm1hdEtleUdyb3VwUmVjdFtdID0geworICAgIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9DUk9QLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKkFNZWRpYUZvcm1hdEtleUdyb3VwRmxvYXRJbnQzMltdID0geworICAgIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURSwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0lfRlJBTUVfSU5URVJWQUwsCisgICAgQU1FRElBRk9STUFUX0tFWV9PUEVSQVRJTkdfUkFURSwKK307CisKK3N0YXRpYyBzdGF0dXNfdCB0cmFuc2xhdGVFcnJvckNvZGUobWVkaWFfc3RhdHVzX3QgZXJyKSB7CisgICAgaWYgKGVyciA9PSBBTUVESUFfT0spIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSBpZiAoZXJyID09IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0gZWxzZSBpZiAoZXJyID09IEFNRURJQV9FUlJPUl9JTykgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfSBlbHNlIGlmIChlcnIgPT0gQU1FRElBQ09ERUNfSU5GT19UUllfQUdBSU5fTEFURVIpIHsKKyAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgfQorCisgICAgQUxPR0UoIm5kayBlcnJvciBjb2RlOiAlZCIsIGVycik7CisgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Cit9CisKK3N0YXRpYyBpbnQzMl90IHRyYW5zbGF0ZUFjdGlvbkNvZGUoaW50MzJfdCBhY3Rpb25Db2RlKSB7CisgICAgaWYgKEFNZWRpYUNvZGVjQWN0aW9uQ29kZV9pc1RyYW5zaWVudChhY3Rpb25Db2RlKSkgeworICAgICAgICByZXR1cm4gQUNUSU9OX0NPREVfVFJBTlNJRU5UOworICAgIH0gZWxzZSBpZiAoQU1lZGlhQ29kZWNBY3Rpb25Db2RlX2lzUmVjb3ZlcmFibGUoYWN0aW9uQ29kZSkpIHsKKyAgICAgICAgcmV0dXJuIEFDVElPTl9DT0RFX1JFQ09WRVJBQkxFOworICAgIH0KKyAgICByZXR1cm4gQUNUSU9OX0NPREVfRkFUQUw7Cit9CisKK3N0YXRpYyBDcnlwdG9QbHVnaW46Ok1vZGUgdHJhbnNsYXRlVG9DcnlwdG9QbHVnaW5Nb2RlKGNyeXB0b2luZm9fbW9kZV90IG1vZGUpIHsKKyAgICBDcnlwdG9QbHVnaW46Ok1vZGUgcmV0ID0gQ3J5cHRvUGx1Z2luOjprTW9kZV9VbmVuY3J5cHRlZDsKKyAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgY2FzZSBBTUVESUFDT0RFQ1JZUFRPSU5GT19NT0RFX0FFU19DVFI6IHsKKyAgICAgICAgICAgIHJldCA9IENyeXB0b1BsdWdpbjo6a01vZGVfQUVTX0NUUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBBTUVESUFDT0RFQ1JZUFRPSU5GT19NT0RFX0FFU19XVjogeworICAgICAgICAgICAgcmV0ID0gQ3J5cHRvUGx1Z2luOjprTW9kZV9BRVNfV1Y7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQU1FRElBQ09ERUNSWVBUT0lORk9fTU9ERV9BRVNfQ0JDOiB7CisgICAgICAgICAgICByZXQgPSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19DQkM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgY3J5cHRvaW5mb19tb2RlX3QgdHJhbnNsYXRlVG9DcnlwdG9JbmZvTW9kZShDcnlwdG9QbHVnaW46Ok1vZGUgbW9kZSkgeworICAgIGNyeXB0b2luZm9fbW9kZV90IHJldCA9IEFNRURJQUNPREVDUllQVE9JTkZPX01PREVfQ0xFQVI7CisgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgIGNhc2UgQ3J5cHRvUGx1Z2luOjprTW9kZV9BRVNfQ1RSOiB7CisgICAgICAgICAgICByZXQgPSBBTUVESUFDT0RFQ1JZUFRPSU5GT19NT0RFX0FFU19DVFI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQ3J5cHRvUGx1Z2luOjprTW9kZV9BRVNfV1Y6IHsKKyAgICAgICAgICAgIHJldCA9IEFNRURJQUNPREVDUllQVE9JTkZPX01PREVfQUVTX1dWOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIENyeXB0b1BsdWdpbjo6a01vZGVfQUVTX0NCQzogeworICAgICAgICAgICAgcmV0ID0gQU1FRElBQ09ERUNSWVBUT0lORk9fTU9ERV9BRVNfQ0JDOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworLy8vLy8vLy8vLy8vIEFNZWRpYUZvcm1hdFdyYXBwZXIKKy8vIHN0YXRpYworc3A8QU1lZGlhRm9ybWF0V3JhcHBlcj4gQU1lZGlhRm9ybWF0V3JhcHBlcjo6Q3JlYXRlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbWVzc2FnZSkgeworICAgIHNwPEFNZWRpYUZvcm1hdFdyYXBwZXI+IGFNZWRpYUZvcm1hdCA9IG5ldyBBTWVkaWFGb3JtYXRXcmFwcGVyKCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1lc3NhZ2UtPmNvdW50RW50cmllcygpOyArK2kpIHsKKyAgICAgICAgQU1lc3NhZ2U6OlR5cGUgdmFsdWVUeXBlOworICAgICAgICBjb25zdCBjaGFyICprZXkgPSBtZXNzYWdlLT5nZXRFbnRyeU5hbWVBdChpLCAmdmFsdWVUeXBlKTsKKworICAgICAgICBzd2l0Y2ggKHZhbHVlVHlwZSkgeworICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVJbnQzMjogeworICAgICAgICAgICAgICAgIGludDMyX3QgdmFsOworICAgICAgICAgICAgICAgIGlmICghbWVzc2FnZS0+ZmluZEludDMyKGtleSwgJnZhbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkFNZWRpYUZvcm1hdFdyYXBwZXI6OkNyZWF0ZTogZXJyb3IgYXQgaXRlbSAlenUiLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFNZWRpYUZvcm1hdC0+c2V0SW50MzIoa2V5LCB2YWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUludDY0OiB7CisgICAgICAgICAgICAgICAgaW50NjRfdCB2YWw7CisgICAgICAgICAgICAgICAgaWYgKCFtZXNzYWdlLT5maW5kSW50NjQoa2V5LCAmdmFsKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQU1lZGlhRm9ybWF0V3JhcHBlcjo6Q3JlYXRlOiBlcnJvciBhdCBpdGVtICV6dSIsIGkpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYU1lZGlhRm9ybWF0LT5zZXRJbnQ2NChrZXksIHZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlRmxvYXQ6IHsKKyAgICAgICAgICAgICAgICBmbG9hdCB2YWw7CisgICAgICAgICAgICAgICAgaWYgKCFtZXNzYWdlLT5maW5kRmxvYXQoa2V5LCAmdmFsKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQU1lZGlhRm9ybWF0V3JhcHBlcjo6Q3JlYXRlOiBlcnJvciBhdCBpdGVtICV6dSIsIGkpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYU1lZGlhRm9ybWF0LT5zZXRGbG9hdChrZXksIHZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlRG91YmxlOiB7CisgICAgICAgICAgICAgICAgZG91YmxlIHZhbDsKKyAgICAgICAgICAgICAgICBpZiAoIW1lc3NhZ2UtPmZpbmREb3VibGUoa2V5LCAmdmFsKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQU1lZGlhRm9ybWF0V3JhcHBlcjo6Q3JlYXRlOiBlcnJvciBhdCBpdGVtICV6dSIsIGkpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYU1lZGlhRm9ybWF0LT5zZXREb3VibGUoa2V5LCB2YWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZVNpemU6IHsKKyAgICAgICAgICAgICAgICBzaXplX3QgdmFsOworICAgICAgICAgICAgICAgIGlmICghbWVzc2FnZS0+ZmluZFNpemUoa2V5LCAmdmFsKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQU1lZGlhRm9ybWF0V3JhcHBlcjo6Q3JlYXRlOiBlcnJvciBhdCBpdGVtICV6dSIsIGkpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYU1lZGlhRm9ybWF0LT5zZXRTaXplKGtleSwgdmFsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVSZWN0OiB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b207CisgICAgICAgICAgICAgICAgaWYgKCFtZXNzYWdlLT5maW5kUmVjdChrZXksICZsZWZ0LCAmdG9wLCAmcmlnaHQsICZib3R0b20pKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJBTWVkaWFGb3JtYXRXcmFwcGVyOjpDcmVhdGU6IGVycm9yIGF0IGl0ZW0gJXp1IiwgaSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhTWVkaWFGb3JtYXQtPnNldFJlY3Qoa2V5LCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZVN0cmluZzogeworICAgICAgICAgICAgICAgIEFTdHJpbmcgdmFsOworICAgICAgICAgICAgICAgIGlmICghbWVzc2FnZS0+ZmluZFN0cmluZyhrZXksICZ2YWwpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJBTWVkaWFGb3JtYXRXcmFwcGVyOjpDcmVhdGU6IGVycm9yIGF0IGl0ZW0gJXp1IiwgaSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhTWVkaWFGb3JtYXQtPnNldFN0cmluZyhrZXksIHZhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlQnVmZmVyOiB7CisgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gdmFsOworICAgICAgICAgICAgICAgIGlmICghbWVzc2FnZS0+ZmluZEJ1ZmZlcihrZXksICZ2YWwpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJBTWVkaWFGb3JtYXRXcmFwcGVyOjpDcmVhdGU6IGVycm9yIGF0IGl0ZW0gJXp1IiwgaSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhTWVkaWFGb3JtYXQtPnNldEJ1ZmZlcihrZXksIHZhbC0+ZGF0YSgpLCB2YWwtPnNpemUoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBhTWVkaWFGb3JtYXQ7Cit9CisKK0FNZWRpYUZvcm1hdFdyYXBwZXI6OkFNZWRpYUZvcm1hdFdyYXBwZXIoKSB7CisgICAgbUFNZWRpYUZvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKK30KKworQU1lZGlhRm9ybWF0V3JhcHBlcjo6QU1lZGlhRm9ybWF0V3JhcHBlcihBTWVkaWFGb3JtYXQgKmFNZWRpYUZvcm1hdCkKKyAgICA6IG1BTWVkaWFGb3JtYXQoYU1lZGlhRm9ybWF0KSB7Cit9CisKK0FNZWRpYUZvcm1hdFdyYXBwZXI6On5BTWVkaWFGb3JtYXRXcmFwcGVyKCkgeworICAgIHJlbGVhc2UoKTsKK30KKworc3RhdHVzX3QgQU1lZGlhRm9ybWF0V3JhcHBlcjo6cmVsZWFzZSgpIHsKKyAgICBpZiAobUFNZWRpYUZvcm1hdCAhPSBOVUxMKSB7CisgICAgICAgIG1lZGlhX3N0YXR1c190IGVyciA9IEFNZWRpYUZvcm1hdF9kZWxldGUobUFNZWRpYUZvcm1hdCk7CisgICAgICAgIG1BTWVkaWFGb3JtYXQgPSBOVUxMOworICAgICAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKGVycik7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworQU1lZGlhRm9ybWF0ICpBTWVkaWFGb3JtYXRXcmFwcGVyOjpnZXRBTWVkaWFGb3JtYXQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1BTWVkaWFGb3JtYXQ7Cit9CisKK3NwPEFNZXNzYWdlPiBBTWVkaWFGb3JtYXRXcmFwcGVyOjp0b0FNZXNzYWdlKCkgY29uc3QgeworICBzcDxBTWVzc2FnZT4gbXNnOworICB3cml0ZVRvQU1lc3NhZ2UobXNnKTsKKyAgcmV0dXJuIG1zZzsKK30KKwordm9pZCBBTWVkaWFGb3JtYXRXcmFwcGVyOjp3cml0ZVRvQU1lc3NhZ2Uoc3A8QU1lc3NhZ2U+ICZtc2cpIGNvbnN0IHsKKyAgICBpZiAobUFNZWRpYUZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIG1zZyA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKG1zZyA9PSBOVUxMKSB7CisgICAgICAgIG1zZyA9IG5ldyBBTWVzc2FnZTsKKyAgICB9CisgICAgZm9yIChhdXRvJiBrZXkgOiBBTWVkaWFGb3JtYXRLZXlHcm91cEludDMyKSB7CisgICAgICAgIGludDMyX3QgdmFsOworICAgICAgICBpZiAoZ2V0SW50MzIoa2V5LCAmdmFsKSkgeworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMihrZXksIHZhbCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChhdXRvJiBrZXkgOiBBTWVkaWFGb3JtYXRLZXlHcm91cEludDY0KSB7CisgICAgICAgIGludDY0X3QgdmFsOworICAgICAgICBpZiAoZ2V0SW50NjQoa2V5LCAmdmFsKSkgeworICAgICAgICAgICAgbXNnLT5zZXRJbnQ2NChrZXksIHZhbCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChhdXRvJiBrZXkgOiBBTWVkaWFGb3JtYXRLZXlHcm91cFN0cmluZykgeworICAgICAgICBBU3RyaW5nIHZhbDsKKyAgICAgICAgaWYgKGdldFN0cmluZyhrZXksICZ2YWwpKSB7CisgICAgICAgICAgICBtc2ctPnNldFN0cmluZyhrZXksIHZhbCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChhdXRvJiBrZXkgOiBBTWVkaWFGb3JtYXRLZXlHcm91cEJ1ZmZlcikgeworICAgICAgICB2b2lkICpkYXRhOworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgaWYgKGdldEJ1ZmZlcihrZXksICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weShkYXRhLCBzaXplKTsKKyAgICAgICAgICAgIG1zZy0+c2V0QnVmZmVyKGtleSwgYnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGF1dG8mIGtleSA6IEFNZWRpYUZvcm1hdEtleUdyb3VwQ3NkKSB7CisgICAgICAgIHZvaWQgKmRhdGE7CisgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICBpZiAoZ2V0QnVmZmVyKGtleSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KGRhdGEsIHNpemUpOworICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKEFNRURJQUZPUk1BVF9LRVlfQ1NELCAxKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NChBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIDApOworICAgICAgICAgICAgbXNnLT5zZXRCdWZmZXIoa2V5LCBidWZmZXIpOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoYXV0byYga2V5IDogQU1lZGlhRm9ybWF0S2V5R3JvdXBSZWN0KSB7CisgICAgICAgIGludDMyX3QgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tOworICAgICAgICBpZiAoZ2V0UmVjdChrZXksICZsZWZ0LCAmdG9wLCAmcmlnaHQsICZib3R0b20pKSB7CisgICAgICAgICAgICBtc2ctPnNldFJlY3Qoa2V5LCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoYXV0byYga2V5IDogQU1lZGlhRm9ybWF0S2V5R3JvdXBGbG9hdEludDMyKSB7CisgICAgICAgIGZsb2F0IHZhbEZsb2F0OworICAgICAgICBpZiAoZ2V0RmxvYXQoa2V5LCAmdmFsRmxvYXQpKSB7CisgICAgICAgICAgICBtc2ctPnNldEZsb2F0KGtleSwgdmFsRmxvYXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50MzJfdCB2YWxJbnQzMjsKKyAgICAgICAgICAgIGlmIChnZXRJbnQzMihrZXksICZ2YWxJbnQzMikpIHsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEZsb2F0KGtleSwgKGZsb2F0KXZhbEludDMyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworY29uc3QgY2hhciogQU1lZGlhRm9ybWF0V3JhcHBlcjo6dG9TdHJpbmcoKSBjb25zdCB7CisgICAgaWYgKG1BTWVkaWFGb3JtYXQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF90b1N0cmluZyhtQU1lZGlhRm9ybWF0KTsKK30KKworYm9vbCBBTWVkaWFGb3JtYXRXcmFwcGVyOjpnZXRJbnQzMihjb25zdCBjaGFyICpuYW1lLCBpbnQzMl90ICpvdXQpIGNvbnN0IHsKKyAgICBpZiAobUFNZWRpYUZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtQU1lZGlhRm9ybWF0LCBuYW1lLCBvdXQpOworfQorCitib29sIEFNZWRpYUZvcm1hdFdyYXBwZXI6OmdldEludDY0KGNvbnN0IGNoYXIgKm5hbWUsIGludDY0X3QgKm91dCkgY29uc3QgeworICAgIGlmIChtQU1lZGlhRm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2dldEludDY0KG1BTWVkaWFGb3JtYXQsIG5hbWUsIG91dCk7Cit9CisKK2Jvb2wgQU1lZGlhRm9ybWF0V3JhcHBlcjo6Z2V0RmxvYXQoY29uc3QgY2hhciAqbmFtZSwgZmxvYXQgKm91dCkgY29uc3QgeworICAgIGlmIChtQU1lZGlhRm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2dldEZsb2F0KG1BTWVkaWFGb3JtYXQsIG5hbWUsIG91dCk7Cit9CisKK2Jvb2wgQU1lZGlhRm9ybWF0V3JhcHBlcjo6Z2V0RG91YmxlKGNvbnN0IGNoYXIgKm5hbWUsIGRvdWJsZSAqb3V0KSBjb25zdCB7CisgICAgaWYgKG1BTWVkaWFGb3JtYXQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBBTWVkaWFGb3JtYXRfZ2V0RG91YmxlKG1BTWVkaWFGb3JtYXQsIG5hbWUsIG91dCk7Cit9CisKK2Jvb2wgQU1lZGlhRm9ybWF0V3JhcHBlcjo6Z2V0U2l6ZShjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgKm91dCkgY29uc3QgeworICAgIGlmIChtQU1lZGlhRm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2dldFNpemUobUFNZWRpYUZvcm1hdCwgbmFtZSwgb3V0KTsKK30KKworYm9vbCBBTWVkaWFGb3JtYXRXcmFwcGVyOjpnZXRSZWN0KAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQzMl90ICpsZWZ0LCBpbnQzMl90ICp0b3AsIGludDMyX3QgKnJpZ2h0LCBpbnQzMl90ICpib3R0b20pIGNvbnN0IHsKKyAgICBpZiAobUFNZWRpYUZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9nZXRSZWN0KG1BTWVkaWFGb3JtYXQsIG5hbWUsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7Cit9CisKK2Jvb2wgQU1lZGlhRm9ybWF0V3JhcHBlcjo6Z2V0QnVmZmVyKGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQqKiBkYXRhLCBzaXplX3QgKm91dFNpemUpIGNvbnN0IHsKKyAgICBpZiAobUFNZWRpYUZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9nZXRCdWZmZXIobUFNZWRpYUZvcm1hdCwgbmFtZSwgZGF0YSwgb3V0U2l6ZSk7Cit9CisKK2Jvb2wgQU1lZGlhRm9ybWF0V3JhcHBlcjo6Z2V0U3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIEFTdHJpbmcgKm91dCkgY29uc3QgeworICAgIGlmIChtQU1lZGlhRm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjb25zdCBjaGFyICpvdXRDaGFyID0gTlVMTDsKKyAgICBib29sIHJldCA9IEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobUFNZWRpYUZvcm1hdCwgbmFtZSwgJm91dENoYXIpOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgKm91dCA9IEFTdHJpbmcob3V0Q2hhcik7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgQU1lZGlhRm9ybWF0V3JhcHBlcjo6c2V0SW50MzIoY29uc3QgY2hhciogbmFtZSwgaW50MzJfdCB2YWx1ZSkgeworICAgIGlmIChtQU1lZGlhRm9ybWF0ICE9IE5VTEwpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1BTWVkaWFGb3JtYXQsIG5hbWUsIHZhbHVlKTsKKyAgICB9Cit9CisKK3ZvaWQgQU1lZGlhRm9ybWF0V3JhcHBlcjo6c2V0SW50NjQoY29uc3QgY2hhciogbmFtZSwgaW50NjRfdCB2YWx1ZSkgeworICAgIGlmIChtQU1lZGlhRm9ybWF0ICE9IE5VTEwpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1BTWVkaWFGb3JtYXQsIG5hbWUsIHZhbHVlKTsKKyAgICB9Cit9CisKK3ZvaWQgQU1lZGlhRm9ybWF0V3JhcHBlcjo6c2V0RmxvYXQoY29uc3QgY2hhciogbmFtZSwgZmxvYXQgdmFsdWUpIHsKKyAgICBpZiAobUFNZWRpYUZvcm1hdCAhPSBOVUxMKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRGbG9hdChtQU1lZGlhRm9ybWF0LCBuYW1lLCB2YWx1ZSk7CisgICAgfQorfQorCit2b2lkIEFNZWRpYUZvcm1hdFdyYXBwZXI6OnNldERvdWJsZShjb25zdCBjaGFyKiBuYW1lLCBkb3VibGUgdmFsdWUpIHsKKyAgICBpZiAobUFNZWRpYUZvcm1hdCAhPSBOVUxMKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXREb3VibGUobUFNZWRpYUZvcm1hdCwgbmFtZSwgdmFsdWUpOworICAgIH0KK30KKwordm9pZCBBTWVkaWFGb3JtYXRXcmFwcGVyOjpzZXRTaXplKGNvbnN0IGNoYXIqIG5hbWUsIHNpemVfdCB2YWx1ZSkgeworICAgIGlmIChtQU1lZGlhRm9ybWF0ICE9IE5VTEwpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldFNpemUobUFNZWRpYUZvcm1hdCwgbmFtZSwgdmFsdWUpOworICAgIH0KK30KKwordm9pZCBBTWVkaWFGb3JtYXRXcmFwcGVyOjpzZXRSZWN0KAorICAgICAgICBjb25zdCBjaGFyKiBuYW1lLCBpbnQzMl90IGxlZnQsIGludDMyX3QgdG9wLCBpbnQzMl90IHJpZ2h0LCBpbnQzMl90IGJvdHRvbSkgeworICAgIGlmIChtQU1lZGlhRm9ybWF0ICE9IE5VTEwpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldFJlY3QobUFNZWRpYUZvcm1hdCwgbmFtZSwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICB9Cit9CisKK3ZvaWQgQU1lZGlhRm9ybWF0V3JhcHBlcjo6c2V0U3RyaW5nKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IEFTdHJpbmcgJnZhbHVlKSB7CisgICAgaWYgKG1BTWVkaWFGb3JtYXQgIT0gTlVMTCkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1BTWVkaWFGb3JtYXQsIG5hbWUsIHZhbHVlLmNfc3RyKCkpOworICAgIH0KK30KKwordm9pZCBBTWVkaWFGb3JtYXRXcmFwcGVyOjpzZXRCdWZmZXIoY29uc3QgY2hhciogbmFtZSwgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAobUFNZWRpYUZvcm1hdCAhPSBOVUxMKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUFNZWRpYUZvcm1hdCwgbmFtZSwgZGF0YSwgc2l6ZSk7CisgICAgfQorfQorCisKKy8vLy8vLy8vLy8vLyBBTmF0aXZlV2luZG93V3JhcHBlcgorQU5hdGl2ZVdpbmRvd1dyYXBwZXI6OkFOYXRpdmVXaW5kb3dXcmFwcGVyKEFOYXRpdmVXaW5kb3cgKmFOYXRpdmVXaW5kb3cpCisgICAgOiBtQU5hdGl2ZVdpbmRvdyhhTmF0aXZlV2luZG93KSB7CisgICAgaWYgKGFOYXRpdmVXaW5kb3cgIT0gTlVMTCkgeworICAgICAgICBBTmF0aXZlV2luZG93X2FjcXVpcmUoYU5hdGl2ZVdpbmRvdyk7CisgICAgfQorfQorCitBTmF0aXZlV2luZG93V3JhcHBlcjo6fkFOYXRpdmVXaW5kb3dXcmFwcGVyKCkgeworICAgIHJlbGVhc2UoKTsKK30KKworc3RhdHVzX3QgQU5hdGl2ZVdpbmRvd1dyYXBwZXI6OnJlbGVhc2UoKSB7CisgICAgaWYgKG1BTmF0aXZlV2luZG93ICE9IE5VTEwpIHsKKyAgICAgICAgQU5hdGl2ZVdpbmRvd19yZWxlYXNlKG1BTmF0aXZlV2luZG93KTsKKyAgICAgICAgbUFOYXRpdmVXaW5kb3cgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK0FOYXRpdmVXaW5kb3cgKkFOYXRpdmVXaW5kb3dXcmFwcGVyOjpnZXRBTmF0aXZlV2luZG93KCkgY29uc3QgeworICAgIHJldHVybiBtQU5hdGl2ZVdpbmRvdzsKK30KKworCisvLy8vLy8vLy8vLy8gQU1lZGlhRHJtV3JhcHBlcgorQU1lZGlhRHJtV3JhcHBlcjo6QU1lZGlhRHJtV3JhcHBlcihjb25zdCB1aW50OF90IHV1aWRbMTZdKSB7CisgICAgbUFNZWRpYURybSA9IEFNZWRpYURybV9jcmVhdGVCeVVVSUQodXVpZCk7Cit9CisKK0FNZWRpYURybVdyYXBwZXI6OkFNZWRpYURybVdyYXBwZXIoQU1lZGlhRHJtICphTWVkaWFEcm0pCisgICAgOiBtQU1lZGlhRHJtKGFNZWRpYURybSkgeworfQorCitBTWVkaWFEcm1XcmFwcGVyOjp+QU1lZGlhRHJtV3JhcHBlcigpIHsKKyAgICByZWxlYXNlKCk7Cit9CisKK3N0YXR1c190IEFNZWRpYURybVdyYXBwZXI6OnJlbGVhc2UoKSB7CisgICAgaWYgKG1BTWVkaWFEcm0gIT0gTlVMTCkgeworICAgICAgICBBTWVkaWFEcm1fcmVsZWFzZShtQU1lZGlhRHJtKTsKKyAgICAgICAgbUFNZWRpYURybSA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworQU1lZGlhRHJtICpBTWVkaWFEcm1XcmFwcGVyOjpnZXRBTWVkaWFEcm0oKSBjb25zdCB7CisgICAgcmV0dXJuIG1BTWVkaWFEcm07Cit9CisKKy8vIHN0YXRpYworYm9vbCBBTWVkaWFEcm1XcmFwcGVyOjppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCgKKyAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgY29uc3QgY2hhciAqbWltZVR5cGUpIHsKKyAgICByZXR1cm4gQU1lZGlhRHJtX2lzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQsIG1pbWVUeXBlKTsKK30KKworCisvLy8vLy8vLy8vLy8gQU1lZGlhQ3J5cHRvV3JhcHBlcgorQU1lZGlhQ3J5cHRvV3JhcHBlcjo6QU1lZGlhQ3J5cHRvV3JhcHBlcigKKyAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3Qgdm9pZCAqaW5pdERhdGEsIHNpemVfdCBpbml0RGF0YVNpemUpIHsKKyAgICBtQU1lZGlhQ3J5cHRvID0gQU1lZGlhQ3J5cHRvX25ldyh1dWlkLCBpbml0RGF0YSwgaW5pdERhdGFTaXplKTsKK30KKworQU1lZGlhQ3J5cHRvV3JhcHBlcjo6QU1lZGlhQ3J5cHRvV3JhcHBlcihBTWVkaWFDcnlwdG8gKmFNZWRpYUNyeXB0bykKKyAgICA6IG1BTWVkaWFDcnlwdG8oYU1lZGlhQ3J5cHRvKSB7Cit9CisKK0FNZWRpYUNyeXB0b1dyYXBwZXI6On5BTWVkaWFDcnlwdG9XcmFwcGVyKCkgeworICAgIHJlbGVhc2UoKTsKK30KKworc3RhdHVzX3QgQU1lZGlhQ3J5cHRvV3JhcHBlcjo6cmVsZWFzZSgpIHsKKyAgICBpZiAobUFNZWRpYUNyeXB0byAhPSBOVUxMKSB7CisgICAgICAgIEFNZWRpYUNyeXB0b19kZWxldGUobUFNZWRpYUNyeXB0byk7CisgICAgICAgIG1BTWVkaWFDcnlwdG8gPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK0FNZWRpYUNyeXB0byAqQU1lZGlhQ3J5cHRvV3JhcHBlcjo6Z2V0QU1lZGlhQ3J5cHRvKCkgY29uc3QgeworICAgIHJldHVybiBtQU1lZGlhQ3J5cHRvOworfQorCitib29sIEFNZWRpYUNyeXB0b1dyYXBwZXI6OmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pIHsKKyAgICBpZiAobUFNZWRpYUNyeXB0byA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIEFNZWRpYUNyeXB0b19pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKTsKK30KKworYm9vbCBBTWVkaWFDcnlwdG9XcmFwcGVyOjpyZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoY29uc3QgY2hhciAqbWltZSkgeworICAgIGlmIChtQU1lZGlhQ3J5cHRvID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gQU1lZGlhQ3J5cHRvX3JlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChtaW1lKTsKK30KKworCisvLy8vLy8vLy8vLy8gQU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcgorLy8gc3RhdGljCitzcDxBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyPiBBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyOjpDcmVhdGUoTWV0YURhdGFCYXNlICZtZXRhKSB7CisKKyAgICB1aW50MzJfdCB0eXBlOworICAgIGNvbnN0IHZvaWQgKmNyeXB0ZWRkYXRhOworICAgIHNpemVfdCBjcnlwdGVkc2l6ZTsKKworICAgIGlmICghbWV0YS5maW5kRGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsICZ0eXBlLCAmY3J5cHRlZGRhdGEsICZjcnlwdGVkc2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaW50IG51bVN1YlNhbXBsZXMgPSBjcnlwdGVkc2l6ZSAvIHNpemVvZihzaXplX3QpOworCisgICAgaWYgKG51bVN1YlNhbXBsZXMgPD0gMCkgeworICAgICAgICBBTE9HRSgiQ3JlYXRlOiBJTlZBTElEIG51bVN1YlNhbXBsZXM6ICVkIiwgbnVtU3ViU2FtcGxlcyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGNvbnN0IHZvaWQgKmNsZWFyZGF0YTsKKyAgICBzaXplX3QgY2xlYXJzaXplOworICAgIGlmIChtZXRhLmZpbmREYXRhKGtLZXlQbGFpblNpemVzLCAmdHlwZSwgJmNsZWFyZGF0YSwgJmNsZWFyc2l6ZSkpIHsKKyAgICAgICAgaWYgKGNsZWFyc2l6ZSAhPSBjcnlwdGVkc2l6ZSkgeworICAgICAgICAgICAgLy8gVGhlIHR3byBtdXN0IGJlIG9mIHRoZSBzYW1lIGxlbmd0aC4KKyAgICAgICAgICAgIEFMT0dFKCJDcmVhdGU6IG1pc21hdGNoIGNyeXB0ZWRzaXplOiAlenUgIT0gY2xlYXJzaXplOiAlenUiLCBjcnlwdGVkc2l6ZSwgY2xlYXJzaXplKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgY29uc3Qgdm9pZCAqa2V5OworICAgIHNpemVfdCBrZXlzaXplOworICAgIGlmIChtZXRhLmZpbmREYXRhKGtLZXlDcnlwdG9LZXksICZ0eXBlLCAma2V5LCAma2V5c2l6ZSkpIHsKKyAgICAgICAgaWYgKGtleXNpemUgIT0ga0FFU0Jsb2NrU2l6ZSkgeworICAgICAgICAgICAgLy8gS2V5cyBtdXN0IGJlIDE2IGJ5dGVzIGluIGxlbmd0aC4KKyAgICAgICAgICAgIEFMT0dFKCJDcmVhdGU6IEtleXMgbXVzdCBiZSAlenUgYnl0ZXMgaW4gbGVuZ3RoOiAlenUiLCBrQUVTQmxvY2tTaXplLCBrZXlzaXplKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgY29uc3Qgdm9pZCAqaXY7CisgICAgc2l6ZV90IGl2c2l6ZTsKKyAgICBpZiAobWV0YS5maW5kRGF0YShrS2V5Q3J5cHRvSVYsICZ0eXBlLCAmaXYsICZpdnNpemUpKSB7CisgICAgICAgIGlmIChpdnNpemUgIT0ga0FFU0Jsb2NrU2l6ZSkgeworICAgICAgICAgICAgLy8gSVZzIG11c3QgYmUgMTYgYnl0ZXMgaW4gbGVuZ3RoLgorICAgICAgICAgICAgQUxPR0UoIkNyZWF0ZTogSVYgbXVzdCBiZSAlenUgYnl0ZXMgaW4gbGVuZ3RoOiAlenUiLCBrQUVTQmxvY2tTaXplLCBpdnNpemUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQzMl90IG1vZGU7CisgICAgaWYgKCFtZXRhLmZpbmRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgJm1vZGUpKSB7CisgICAgICAgIG1vZGUgPSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19DVFI7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyKAorICAgICAgICAgICAgbnVtU3ViU2FtcGxlcywKKyAgICAgICAgICAgICh1aW50OF90Kikga2V5LAorICAgICAgICAgICAgKHVpbnQ4X3QqKSBpdiwKKyAgICAgICAgICAgIChDcnlwdG9QbHVnaW46Ok1vZGUpbW9kZSwKKyAgICAgICAgICAgIChzaXplX3QqKSBjbGVhcmRhdGEsCisgICAgICAgICAgICAoc2l6ZV90KikgY3J5cHRlZGRhdGEpOworfQorCitBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyOjpBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyKAorICAgICAgICBpbnQgbnVtc3Vic2FtcGxlcywKKyAgICAgICAgdWludDhfdCBrZXlbMTZdLAorICAgICAgICB1aW50OF90IGl2WzE2XSwKKyAgICAgICAgQ3J5cHRvUGx1Z2luOjpNb2RlIG1vZGUsCisgICAgICAgIHNpemVfdCAqY2xlYXJieXRlcywKKyAgICAgICAgc2l6ZV90ICplbmNyeXB0ZWRieXRlcykgeworICAgIG1BTWVkaWFDb2RlY0NyeXB0b0luZm8gPQorICAgICAgICBBTWVkaWFDb2RlY0NyeXB0b0luZm9fbmV3KG51bXN1YnNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVRvQ3J5cHRvSW5mb01vZGUobW9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWRieXRlcyk7Cit9CisKK0FNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI6OkFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXIoCisgICAgICAgIEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyAqYU1lZGlhQ29kZWNDcnlwdG9JbmZvKQorICAgIDogbUFNZWRpYUNvZGVjQ3J5cHRvSW5mbyhhTWVkaWFDb2RlY0NyeXB0b0luZm8pIHsKK30KKworQU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcjo6fkFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXIoKSB7CisgICAgcmVsZWFzZSgpOworfQorCitzdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyOjpyZWxlYXNlKCkgeworICAgIGlmIChtQU1lZGlhQ29kZWNDcnlwdG9JbmZvICE9IE5VTEwpIHsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2RlbGV0ZShtQU1lZGlhQ29kZWNDcnlwdG9JbmZvKTsKKyAgICAgICAgbUFNZWRpYUNvZGVjQ3J5cHRvSW5mbyA9IE5VTEw7CisgICAgICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoZXJyKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitBTWVkaWFDb2RlY0NyeXB0b0luZm8gKkFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI6OmdldEFNZWRpYUNvZGVjQ3J5cHRvSW5mbygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUFNZWRpYUNvZGVjQ3J5cHRvSW5mbzsKK30KKwordm9pZCBBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyOjpzZXRQYXR0ZXJuKENyeXB0b1BsdWdpbjo6UGF0dGVybiAqcGF0dGVybikgeworICAgIGlmIChtQU1lZGlhQ29kZWNDcnlwdG9JbmZvID09IE5VTEwgfHwgcGF0dGVybiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY3J5cHRvaW5mb19wYXR0ZXJuX3QgbmRrUGF0dGVybiA9IHsoaW50MzJfdClwYXR0ZXJuLT5tRW5jcnlwdEJsb2NrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KXBhdHRlcm4tPm1Ta2lwQmxvY2tzIH07CisgICAgcmV0dXJuIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19zZXRQYXR0ZXJuKG1BTWVkaWFDb2RlY0NyeXB0b0luZm8sICZuZGtQYXR0ZXJuKTsKK30KKworc2l6ZV90IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI6OmdldE51bVN1YlNhbXBsZXMoKSB7CisgICAgaWYgKG1BTWVkaWFDb2RlY0NyeXB0b0luZm8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXROdW1TdWJTYW1wbGVzKG1BTWVkaWFDb2RlY0NyeXB0b0luZm8pOworfQorCitzdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyOjpnZXRLZXkodWludDhfdCAqZHN0KSB7CisgICAgaWYgKG1BTWVkaWFDb2RlY0NyeXB0b0luZm8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmIChkc3QgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKAorICAgICAgICBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0S2V5KG1BTWVkaWFDb2RlY0NyeXB0b0luZm8sIGRzdCkpOworfQorCitzdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyOjpnZXRJVih1aW50OF90ICpkc3QpIHsKKyAgICBpZiAobUFNZWRpYUNvZGVjQ3J5cHRvSW5mbyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKGRzdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoCisgICAgICAgIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRJVihtQU1lZGlhQ29kZWNDcnlwdG9JbmZvLCBkc3QpKTsKK30KKworQ3J5cHRvUGx1Z2luOjpNb2RlIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI6OmdldE1vZGUoKSB7CisgICAgaWYgKG1BTWVkaWFDb2RlY0NyeXB0b0luZm8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQ3J5cHRvUGx1Z2luOjprTW9kZV9VbmVuY3J5cHRlZDsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZVRvQ3J5cHRvUGx1Z2luTW9kZSgKKyAgICAgICAgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldE1vZGUobUFNZWRpYUNvZGVjQ3J5cHRvSW5mbykpOworfQorCitzdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyOjpnZXRDbGVhckJ5dGVzKHNpemVfdCAqZHN0KSB7CisgICAgaWYgKG1BTWVkaWFDb2RlY0NyeXB0b0luZm8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmIChkc3QgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKAorICAgICAgICBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0Q2xlYXJCeXRlcyhtQU1lZGlhQ29kZWNDcnlwdG9JbmZvLCBkc3QpKTsKK30KKworc3RhdHVzX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcjo6Z2V0RW5jcnlwdGVkQnl0ZXMoc2l6ZV90ICpkc3QpIHsKKyAgICBpZiAobUFNZWRpYUNvZGVjQ3J5cHRvSW5mbyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKGRzdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoCisgICAgICAgIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRFbmNyeXB0ZWRCeXRlcyhtQU1lZGlhQ29kZWNDcnlwdG9JbmZvLCBkc3QpKTsKK30KKworCisvLy8vLy8vLy8vLy8gQU1lZGlhQ29kZWNXcmFwcGVyCisvLyBzdGF0aWMKK3NwPEFNZWRpYUNvZGVjV3JhcHBlcj4gQU1lZGlhQ29kZWNXcmFwcGVyOjpDcmVhdGVDb2RlY0J5TmFtZShjb25zdCBBU3RyaW5nICZuYW1lKSB7CisgICAgQU1lZGlhQ29kZWMgKmFNZWRpYUNvZGVjID0gQU1lZGlhQ29kZWNfY3JlYXRlQ29kZWNCeU5hbWUobmFtZS5jX3N0cigpKTsKKyAgICByZXR1cm4gbmV3IEFNZWRpYUNvZGVjV3JhcHBlcihhTWVkaWFDb2RlYyk7Cit9CisKKy8vIHN0YXRpYworc3A8QU1lZGlhQ29kZWNXcmFwcGVyPiBBTWVkaWFDb2RlY1dyYXBwZXI6OkNyZWF0ZURlY29kZXJCeVR5cGUoY29uc3QgQVN0cmluZyAmbWltZVR5cGUpIHsKKyAgICBBTWVkaWFDb2RlYyAqYU1lZGlhQ29kZWMgPSBBTWVkaWFDb2RlY19jcmVhdGVEZWNvZGVyQnlUeXBlKG1pbWVUeXBlLmNfc3RyKCkpOworICAgIHJldHVybiBuZXcgQU1lZGlhQ29kZWNXcmFwcGVyKGFNZWRpYUNvZGVjKTsKK30KKworLy8gc3RhdGljCit2b2lkIEFNZWRpYUNvZGVjV3JhcHBlcjo6T25JbnB1dEF2YWlsYWJsZUNCKAorICAgICAgICBBTWVkaWFDb2RlYyAqIC8qIGFNZWRpYUNvZGVjICovLAorICAgICAgICB2b2lkICp1c2VyZGF0YSwKKyAgICAgICAgaW50MzJfdCBpbmRleCkgeworICAgIEFMT0dWKCJPbklucHV0QXZhaWxhYmxlQ0I6IGluZGV4KCVkKSIsIGluZGV4KTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gc3A8QU1lc3NhZ2U+KChBTWVzc2FnZSAqKXVzZXJkYXRhKS0+ZHVwKCk7CisgICAgbXNnLT5zZXRJbnQzMigiY2FsbGJhY2tJRCIsIENCX0lOUFVUX0FWQUlMQUJMRSk7CisgICAgbXNnLT5zZXRJbnQzMigiaW5kZXgiLCBpbmRleCk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBBTWVkaWFDb2RlY1dyYXBwZXI6Ok9uT3V0cHV0QXZhaWxhYmxlQ0IoCisgICAgICAgIEFNZWRpYUNvZGVjICogLyogYU1lZGlhQ29kZWMgKi8sCisgICAgICAgIHZvaWQgKnVzZXJkYXRhLAorICAgICAgICBpbnQzMl90IGluZGV4LAorICAgICAgICBBTWVkaWFDb2RlY0J1ZmZlckluZm8gKmJ1ZmZlckluZm8pIHsKKyAgICBBTE9HVigiT25PdXRwdXRBdmFpbGFibGVDQjogaW5kZXgoJWQpLCAoJWQsICVkLCAlbGxkLCAweCV4KSIsCisgICAgICAgICAgaW5kZXgsIGJ1ZmZlckluZm8tPm9mZnNldCwgYnVmZmVySW5mby0+c2l6ZSwKKyAgICAgICAgICAobG9uZyBsb25nKWJ1ZmZlckluZm8tPnByZXNlbnRhdGlvblRpbWVVcywgYnVmZmVySW5mby0+ZmxhZ3MpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBzcDxBTWVzc2FnZT4oKEFNZXNzYWdlICopdXNlcmRhdGEpLT5kdXAoKTsKKyAgICBtc2ctPnNldEludDMyKCJjYWxsYmFja0lEIiwgQ0JfT1VUUFVUX0FWQUlMQUJMRSk7CisgICAgbXNnLT5zZXRJbnQzMigiaW5kZXgiLCBpbmRleCk7CisgICAgbXNnLT5zZXRTaXplKCJvZmZzZXQiLCAoc2l6ZV90KShidWZmZXJJbmZvLT5vZmZzZXQpKTsKKyAgICBtc2ctPnNldFNpemUoInNpemUiLCAoc2l6ZV90KShidWZmZXJJbmZvLT5zaXplKSk7CisgICAgbXNnLT5zZXRJbnQ2NCgidGltZVVzIiwgYnVmZmVySW5mby0+cHJlc2VudGF0aW9uVGltZVVzKTsKKyAgICBtc2ctPnNldEludDMyKCJmbGFncyIsIChpbnQzMl90KShidWZmZXJJbmZvLT5mbGFncykpOworICAgIG1zZy0+cG9zdCgpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQU1lZGlhQ29kZWNXcmFwcGVyOjpPbkZvcm1hdENoYW5nZWRDQigKKyAgICAgICAgQU1lZGlhQ29kZWMgKiAvKiBhTWVkaWFDb2RlYyAqLywKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqZm9ybWF0KSB7CisgICAgc3A8QU1lZGlhRm9ybWF0V3JhcHBlcj4gZm9ybWF0V3JhcHBlciA9IG5ldyBBTWVkaWFGb3JtYXRXcmFwcGVyKGZvcm1hdCk7CisgICAgc3A8QU1lc3NhZ2U+IG91dHB1dEZvcm1hdCA9IGZvcm1hdFdyYXBwZXItPnRvQU1lc3NhZ2UoKTsKKyAgICBBTE9HVigiT25Gb3JtYXRDaGFuZ2VkQ0I6IGZvcm1hdCglcykiLCBvdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gc3A8QU1lc3NhZ2U+KChBTWVzc2FnZSAqKXVzZXJkYXRhKS0+ZHVwKCk7CisgICAgbXNnLT5zZXRJbnQzMigiY2FsbGJhY2tJRCIsIENCX09VVFBVVF9GT1JNQVRfQ0hBTkdFRCk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBvdXRwdXRGb3JtYXQpOworICAgIG1zZy0+cG9zdCgpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQU1lZGlhQ29kZWNXcmFwcGVyOjpPbkVycm9yQ0IoCisgICAgICAgIEFNZWRpYUNvZGVjICogLyogYU1lZGlhQ29kZWMgKi8sCisgICAgICAgIHZvaWQgKnVzZXJkYXRhLAorICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIsCisgICAgICAgIGludDMyX3QgYWN0aW9uQ29kZSwKKyAgICAgICAgY29uc3QgY2hhciAqZGV0YWlsKSB7CisgICAgQUxPR1YoIk9uRXJyb3JDQjogZXJyKCVkKSwgYWN0aW9uQ29kZSglZCksIGRldGFpbCglcykiLCBlcnIsIGFjdGlvbkNvZGUsIGRldGFpbCk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IHNwPEFNZXNzYWdlPigoQU1lc3NhZ2UgKil1c2VyZGF0YSktPmR1cCgpOworICAgIG1zZy0+c2V0SW50MzIoImNhbGxiYWNrSUQiLCBDQl9FUlJPUik7CisgICAgbXNnLT5zZXRJbnQzMigiZXJyIiwgdHJhbnNsYXRlRXJyb3JDb2RlKGVycikpOworICAgIG1zZy0+c2V0SW50MzIoImFjdGlvbkNvZGUiLCB0cmFuc2xhdGVBY3Rpb25Db2RlKGFjdGlvbkNvZGUpKTsKKyAgICBtc2ctPnNldFN0cmluZygiZGV0YWlsIiwgZGV0YWlsKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKworQU1lZGlhQ29kZWNXcmFwcGVyOjpBTWVkaWFDb2RlY1dyYXBwZXIoQU1lZGlhQ29kZWMgKmFNZWRpYUNvZGVjKQorICAgIDogbUFNZWRpYUNvZGVjKGFNZWRpYUNvZGVjKSB7Cit9CisKK0FNZWRpYUNvZGVjV3JhcHBlcjo6fkFNZWRpYUNvZGVjV3JhcHBlcigpIHsKKyAgICByZWxlYXNlKCk7Cit9CisKK3N0YXR1c190IEFNZWRpYUNvZGVjV3JhcHBlcjo6cmVsZWFzZSgpIHsKKyAgICBpZiAobUFNZWRpYUNvZGVjICE9IE5VTEwpIHsKKyAgICAgICAgQU1lZGlhQ29kZWNPbkFzeW5jTm90aWZ5Q2FsbGJhY2sgYUNCID0ge307CisgICAgICAgIEFNZWRpYUNvZGVjX3NldEFzeW5jTm90aWZ5Q2FsbGJhY2sobUFNZWRpYUNvZGVjLCBhQ0IsIE5VTEwpOworICAgICAgICBtQ2FsbGJhY2sgPSBOVUxMOworCisgICAgICAgIG1lZGlhX3N0YXR1c190IGVyciA9IEFNZWRpYUNvZGVjX2RlbGV0ZShtQU1lZGlhQ29kZWMpOworICAgICAgICBtQU1lZGlhQ29kZWMgPSBOVUxMOworICAgICAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKGVycik7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworQU1lZGlhQ29kZWMgKkFNZWRpYUNvZGVjV3JhcHBlcjo6Z2V0QU1lZGlhQ29kZWMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1BTWVkaWFDb2RlYzsKK30KKworc3RhdHVzX3QgQU1lZGlhQ29kZWNXcmFwcGVyOjpnZXROYW1lKEFTdHJpbmcgKm91dENvbXBvbmVudE5hbWUpIGNvbnN0IHsKKyAgICBpZiAobUFNZWRpYUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBjaGFyICpuYW1lID0gTlVMTDsKKyAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSBBTWVkaWFDb2RlY19nZXROYW1lKG1BTWVkaWFDb2RlYywgJm5hbWUpOworICAgIGlmIChlcnIgIT0gQU1FRElBX09LKSB7CisgICAgICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoZXJyKTsKKyAgICB9CisKKyAgICAqb3V0Q29tcG9uZW50TmFtZSA9IEFTdHJpbmcobmFtZSk7CisgICAgQU1lZGlhQ29kZWNfcmVsZWFzZU5hbWUobUFNZWRpYUNvZGVjLCBuYW1lKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFNZWRpYUNvZGVjV3JhcHBlcjo6Y29uZmlndXJlKAorICAgIGNvbnN0IHNwPEFNZWRpYUZvcm1hdFdyYXBwZXI+ICZmb3JtYXQsCisgICAgY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZud3csCisgICAgY29uc3Qgc3A8QU1lZGlhQ3J5cHRvV3JhcHBlcj4gJmNyeXB0bywKKyAgICB1aW50MzJfdCBmbGFncykgeworICAgIGlmIChtQU1lZGlhQ29kZWMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gQU1lZGlhQ29kZWNfY29uZmlndXJlKAorICAgICAgICAgICAgbUFNZWRpYUNvZGVjLAorICAgICAgICAgICAgZm9ybWF0LT5nZXRBTWVkaWFGb3JtYXQoKSwKKyAgICAgICAgICAgIChud3cgPT0gTlVMTCA/IE5VTEwgOiBud3ctPmdldEFOYXRpdmVXaW5kb3coKSksCisgICAgICAgICAgICBjcnlwdG8gPT0gTlVMTCA/IE5VTEwgOiBjcnlwdG8tPmdldEFNZWRpYUNyeXB0bygpLAorICAgICAgICAgICAgZmxhZ3MpOworCisgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZShlcnIpOworfQorCitzdGF0dXNfdCBBTWVkaWFDb2RlY1dyYXBwZXI6OnNldENhbGxiYWNrKGNvbnN0IHNwPEFNZXNzYWdlPiAmY2FsbGJhY2spIHsKKyAgICBpZiAobUFNZWRpYUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKworICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworCisgICAgQU1lZGlhQ29kZWNPbkFzeW5jTm90aWZ5Q2FsbGJhY2sgYUNCID0geworICAgICAgICBPbklucHV0QXZhaWxhYmxlQ0IsCisgICAgICAgIE9uT3V0cHV0QXZhaWxhYmxlQ0IsCisgICAgICAgIE9uRm9ybWF0Q2hhbmdlZENCLAorICAgICAgICBPbkVycm9yQ0IKKyAgICB9OworCisgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZSgKKyAgICAgICAgICAgIEFNZWRpYUNvZGVjX3NldEFzeW5jTm90aWZ5Q2FsbGJhY2sobUFNZWRpYUNvZGVjLCBhQ0IsIGNhbGxiYWNrLmdldCgpKSk7Cit9CisKK3N0YXR1c190IEFNZWRpYUNvZGVjV3JhcHBlcjo6cmVsZWFzZUNyeXB0bygpIHsKKyAgICBpZiAobUFNZWRpYUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKEFNZWRpYUNvZGVjX3JlbGVhc2VDcnlwdG8obUFNZWRpYUNvZGVjKSk7Cit9CisKK3N0YXR1c190IEFNZWRpYUNvZGVjV3JhcHBlcjo6c3RhcnQoKSB7CisgICAgaWYgKG1BTWVkaWFDb2RlYyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZShBTWVkaWFDb2RlY19zdGFydChtQU1lZGlhQ29kZWMpKTsKK30KKworc3RhdHVzX3QgQU1lZGlhQ29kZWNXcmFwcGVyOjpzdG9wKCkgeworICAgIGlmIChtQU1lZGlhQ29kZWMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoQU1lZGlhQ29kZWNfc3RvcChtQU1lZGlhQ29kZWMpKTsKK30KKworc3RhdHVzX3QgQU1lZGlhQ29kZWNXcmFwcGVyOjpmbHVzaCgpIHsKKyAgICBpZiAobUFNZWRpYUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKEFNZWRpYUNvZGVjX2ZsdXNoKG1BTWVkaWFDb2RlYykpOworfQorCit1aW50OF90KiBBTWVkaWFDb2RlY1dyYXBwZXI6OmdldElucHV0QnVmZmVyKHNpemVfdCBpZHgsIHNpemVfdCAqb3V0X3NpemUpIHsKKyAgICBpZiAobUFNZWRpYUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBBTWVkaWFDb2RlY19nZXRJbnB1dEJ1ZmZlcihtQU1lZGlhQ29kZWMsIGlkeCwgb3V0X3NpemUpOworfQorCit1aW50OF90KiBBTWVkaWFDb2RlY1dyYXBwZXI6OmdldE91dHB1dEJ1ZmZlcihzaXplX3QgaWR4LCBzaXplX3QgKm91dF9zaXplKSB7CisgICAgaWYgKG1BTWVkaWFDb2RlYyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gQU1lZGlhQ29kZWNfZ2V0T3V0cHV0QnVmZmVyKG1BTWVkaWFDb2RlYywgaWR4LCBvdXRfc2l6ZSk7Cit9CisKK3N0YXR1c190IEFNZWRpYUNvZGVjV3JhcHBlcjo6cXVldWVJbnB1dEJ1ZmZlcigKKyAgICAgICAgc2l6ZV90IGlkeCwKKyAgICAgICAgc2l6ZV90IG9mZnNldCwKKyAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgIHVpbnQ2NF90IHRpbWUsCisgICAgICAgIHVpbnQzMl90IGZsYWdzKSB7CisgICAgaWYgKG1BTWVkaWFDb2RlYyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZSgKKyAgICAgICAgQU1lZGlhQ29kZWNfcXVldWVJbnB1dEJ1ZmZlcihtQU1lZGlhQ29kZWMsIGlkeCwgb2Zmc2V0LCBzaXplLCB0aW1lLCBmbGFncykpOworfQorCitzdGF0dXNfdCBBTWVkaWFDb2RlY1dyYXBwZXI6OnF1ZXVlU2VjdXJlSW5wdXRCdWZmZXIoCisgICAgICAgIHNpemVfdCBpZHgsCisgICAgICAgIHNpemVfdCBvZmZzZXQsCisgICAgICAgIHNwPEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI+ICZjb2RlY0NyeXB0b0luZm8sCisgICAgICAgIHVpbnQ2NF90IHRpbWUsCisgICAgICAgIHVpbnQzMl90IGZsYWdzKSB7CisgICAgaWYgKG1BTWVkaWFDb2RlYyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZSgKKyAgICAgICAgQU1lZGlhQ29kZWNfcXVldWVTZWN1cmVJbnB1dEJ1ZmZlcigKKyAgICAgICAgICAgIG1BTWVkaWFDb2RlYywKKyAgICAgICAgICAgIGlkeCwKKyAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgIGNvZGVjQ3J5cHRvSW5mby0+Z2V0QU1lZGlhQ29kZWNDcnlwdG9JbmZvKCksCisgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgZmxhZ3MpKTsKK30KKworc3A8QU1lZGlhRm9ybWF0V3JhcHBlcj4gQU1lZGlhQ29kZWNXcmFwcGVyOjpnZXRPdXRwdXRGb3JtYXQoKSB7CisgICAgaWYgKG1BTWVkaWFDb2RlYyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gbmV3IEFNZWRpYUZvcm1hdFdyYXBwZXIoQU1lZGlhQ29kZWNfZ2V0T3V0cHV0Rm9ybWF0KG1BTWVkaWFDb2RlYykpOworfQorCitzcDxBTWVkaWFGb3JtYXRXcmFwcGVyPiBBTWVkaWFDb2RlY1dyYXBwZXI6OmdldElucHV0Rm9ybWF0KCkgeworICAgIGlmIChtQU1lZGlhQ29kZWMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBBTWVkaWFGb3JtYXRXcmFwcGVyKEFNZWRpYUNvZGVjX2dldElucHV0Rm9ybWF0KG1BTWVkaWFDb2RlYykpOworfQorCitzdGF0dXNfdCBBTWVkaWFDb2RlY1dyYXBwZXI6OnJlbGVhc2VPdXRwdXRCdWZmZXIoc2l6ZV90IGlkeCwgYm9vbCByZW5kZXIpIHsKKyAgICBpZiAobUFNZWRpYUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKAorICAgICAgICBBTWVkaWFDb2RlY19yZWxlYXNlT3V0cHV0QnVmZmVyKG1BTWVkaWFDb2RlYywgaWR4LCByZW5kZXIpKTsKK30KKworc3RhdHVzX3QgQU1lZGlhQ29kZWNXcmFwcGVyOjpzZXRPdXRwdXRTdXJmYWNlKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiAmbnd3KSB7CisgICAgaWYgKG1BTWVkaWFDb2RlYyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZSgKKyAgICAgICAgQU1lZGlhQ29kZWNfc2V0T3V0cHV0U3VyZmFjZShtQU1lZGlhQ29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG53dyA9PSBOVUxMID8gTlVMTCA6IG53dy0+Z2V0QU5hdGl2ZVdpbmRvdygpKSkpOworfQorCitzdGF0dXNfdCBBTWVkaWFDb2RlY1dyYXBwZXI6OnJlbGVhc2VPdXRwdXRCdWZmZXJBdFRpbWUoc2l6ZV90IGlkeCwgaW50NjRfdCB0aW1lc3RhbXBOcykgeworICAgIGlmIChtQU1lZGlhQ29kZWMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoCisgICAgICAgIEFNZWRpYUNvZGVjX3JlbGVhc2VPdXRwdXRCdWZmZXJBdFRpbWUobUFNZWRpYUNvZGVjLCBpZHgsIHRpbWVzdGFtcE5zKSk7Cit9CisKK3N0YXR1c190IEFNZWRpYUNvZGVjV3JhcHBlcjo6c2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVkaWFGb3JtYXRXcmFwcGVyPiAmcGFyYW1zKSB7CisgICAgaWYgKG1BTWVkaWFDb2RlYyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZSgKKyAgICAgICAgQU1lZGlhQ29kZWNfc2V0UGFyYW1ldGVycyhtQU1lZGlhQ29kZWMsIHBhcmFtcy0+Z2V0QU1lZGlhRm9ybWF0KCkpKTsKK30KKworLy8vLy8vLy8vLy8vIEFNZWRpYUV4dHJhY3RvcldyYXBwZXIKKworQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6QU1lZGlhRXh0cmFjdG9yV3JhcHBlcihBTWVkaWFFeHRyYWN0b3IgKmFNZWRpYUV4dHJhY3RvcikKKyAgICA6IG1BTWVkaWFFeHRyYWN0b3IoYU1lZGlhRXh0cmFjdG9yKSB7Cit9CisKK0FNZWRpYUV4dHJhY3RvcldyYXBwZXI6On5BTWVkaWFFeHRyYWN0b3JXcmFwcGVyKCkgeworICAgIHJlbGVhc2UoKTsKK30KKworc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6cmVsZWFzZSgpIHsKKyAgICBpZiAobUFNZWRpYUV4dHJhY3RvciAhPSBOVUxMKSB7CisgICAgICAgIG1lZGlhX3N0YXR1c190IGVyciA9IEFNZWRpYUV4dHJhY3Rvcl9kZWxldGUobUFNZWRpYUV4dHJhY3Rvcik7CisgICAgICAgIG1BTWVkaWFFeHRyYWN0b3IgPSBOVUxMOworICAgICAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKGVycik7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6ZGlzY29ubmVjdCgpIHsKKyAgICBpZiAobUFNZWRpYUV4dHJhY3RvciAhPSBOVUxMKSB7CisgICAgICAgIG1lZGlhX3N0YXR1c190IGVyciA9IEFNZWRpYUV4dHJhY3Rvcl9kaXNjb25uZWN0KG1BTWVkaWFFeHRyYWN0b3IpOworICAgICAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKGVycik7CisgICAgfQorICAgIHJldHVybiBERUFEX09CSkVDVDsKK30KKworQU1lZGlhRXh0cmFjdG9yICpBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpnZXRBTWVkaWFFeHRyYWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIG1BTWVkaWFFeHRyYWN0b3I7Cit9CisKK3N0YXR1c190IEFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OnNldERhdGFTb3VyY2UoaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgpIHsKKyAgICBpZiAobUFNZWRpYUV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZShBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUZkKAorICAgICAgICAgICAgbUFNZWRpYUV4dHJhY3RvciwgZmQsIG9mZnNldCwgbGVuZ3RoKSk7Cit9CisKK3N0YXR1c190IEFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OnNldERhdGFTb3VyY2UoY29uc3QgY2hhciAqbG9jYXRpb24pIHsKKyAgICBpZiAobUFNZWRpYUV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZShBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZShtQU1lZGlhRXh0cmFjdG9yLCBsb2NhdGlvbikpOworfQorCitzdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpzZXREYXRhU291cmNlKEFNZWRpYURhdGFTb3VyY2UgKnNvdXJjZSkgeworICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlQ3VzdG9tKG1BTWVkaWFFeHRyYWN0b3IsIHNvdXJjZSkpOworfQorCitzaXplX3QgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6Z2V0VHJhY2tDb3VudCgpIHsKKyAgICBpZiAobUFNZWRpYUV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrQ291bnQobUFNZWRpYUV4dHJhY3Rvcik7Cit9CisKK3NwPEFNZWRpYUZvcm1hdFdyYXBwZXI+IEFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OmdldEZvcm1hdCgpIHsKKyAgICBpZiAobUFNZWRpYUV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gbmV3IEFNZWRpYUZvcm1hdFdyYXBwZXIoQU1lZGlhRXh0cmFjdG9yX2dldEZpbGVGb3JtYXQobUFNZWRpYUV4dHJhY3RvcikpOworfQorCitzcDxBTWVkaWFGb3JtYXRXcmFwcGVyPiBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpnZXRUcmFja0Zvcm1hdChzaXplX3QgaWR4KSB7CisgICAgaWYgKG1BTWVkaWFFeHRyYWN0b3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBBTWVkaWFGb3JtYXRXcmFwcGVyKEFNZWRpYUV4dHJhY3Rvcl9nZXRUcmFja0Zvcm1hdChtQU1lZGlhRXh0cmFjdG9yLCBpZHgpKTsKK30KKworc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6c2VsZWN0VHJhY2soc2l6ZV90IGlkeCkgeworICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKEFNZWRpYUV4dHJhY3Rvcl9zZWxlY3RUcmFjayhtQU1lZGlhRXh0cmFjdG9yLCBpZHgpKTsKK30KKworc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6dW5zZWxlY3RUcmFjayhzaXplX3QgaWR4KSB7CisgICAgaWYgKG1BTWVkaWFFeHRyYWN0b3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoQU1lZGlhRXh0cmFjdG9yX3Vuc2VsZWN0VHJhY2sobUFNZWRpYUV4dHJhY3RvciwgaWR4KSk7Cit9CisKK3N0YXR1c190IEFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OnNlbGVjdFNpbmdsZVRyYWNrKHNpemVfdCBpZHgpIHsKKyAgICBpZiAobUFNZWRpYUV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tDb3VudChtQU1lZGlhRXh0cmFjdG9yKTsgKytpKSB7CisgICAgICAgIGlmIChpID09IGlkeCkgeworICAgICAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gQU1lZGlhRXh0cmFjdG9yX3NlbGVjdFRyYWNrKG1BTWVkaWFFeHRyYWN0b3IsIGkpOworICAgICAgICAgICAgaWYgKGVyciAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKGVycik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSBBTWVkaWFFeHRyYWN0b3JfdW5zZWxlY3RUcmFjayhtQU1lZGlhRXh0cmFjdG9yLCBpKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZShlcnIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3NpemVfdCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpyZWFkU2FtcGxlRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgaWYgKG1BTWVkaWFFeHRyYWN0b3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBBTWVkaWFFeHRyYWN0b3JfcmVhZFNhbXBsZURhdGEobUFNZWRpYUV4dHJhY3RvciwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+Y2FwYWNpdHkoKSk7Cit9CisKK3NzaXplX3QgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6Z2V0U2FtcGxlU2l6ZSgpIHsKKyAgICBpZiAobUFNZWRpYUV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVNpemUobUFNZWRpYUV4dHJhY3Rvcik7Cit9CisKK3VpbnQzMl90IEFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OmdldFNhbXBsZUZsYWdzKCkgeworICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlRmxhZ3MobUFNZWRpYUV4dHJhY3Rvcik7Cit9CisKK2ludCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpnZXRTYW1wbGVUcmFja0luZGV4KCkgeworICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVRyYWNrSW5kZXgobUFNZWRpYUV4dHJhY3Rvcik7Cit9CisKK2ludDY0X3QgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6Z2V0U2FtcGxlVGltZSgpIHsKKyAgICBpZiAobUFNZWRpYUV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVUaW1lKG1BTWVkaWFFeHRyYWN0b3IpOworfQorCitzdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpnZXRTYW1wbGVGb3JtYXQoc3A8QU1lZGlhRm9ybWF0V3JhcHBlcj4gJmZvcm1hdFdyYXBwZXIpIHsKKyAgICBpZiAobUFNZWRpYUV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgQU1lZGlhRm9ybWF0ICpmb3JtYXQgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgZm9ybWF0V3JhcHBlciA9IG5ldyBBTWVkaWFGb3JtYXRXcmFwcGVyKGZvcm1hdCk7CisgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZShBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlRm9ybWF0KG1BTWVkaWFFeHRyYWN0b3IsIGZvcm1hdCkpOworfQorCitpbnQ2NF90IEFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OmdldENhY2hlZER1cmF0aW9uKCkgeworICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gQU1lZGlhRXh0cmFjdG9yX2dldENhY2hlZER1cmF0aW9uKG1BTWVkaWFFeHRyYWN0b3IpOworfQorCitib29sIEFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OmFkdmFuY2UoKSB7CisgICAgaWYgKG1BTWVkaWFFeHRyYWN0b3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBBTWVkaWFFeHRyYWN0b3JfYWR2YW5jZShtQU1lZGlhRXh0cmFjdG9yKTsKK30KKworc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6c2Vla1RvKGludDY0X3Qgc2Vla1Bvc1VzLCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGUpIHsKKyAgICBpZiAobUFNZWRpYUV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICBTZWVrTW9kZSBhTW9kZTsKKyAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgY2FzZSBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQzogeworICAgICAgICAgICAgYU1vZGUgPSBBTUVESUFFWFRSQUNUT1JfU0VFS19QUkVWSU9VU19TWU5DOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfTkVYVF9TWU5DOiB7CisgICAgICAgICAgICBhTW9kZSA9IEFNRURJQUVYVFJBQ1RPUl9TRUVLX05FWFRfU1lOQzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIGFNb2RlID0gQU1FRElBRVhUUkFDVE9SX1NFRUtfQ0xPU0VTVF9TWU5DOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEFNZWRpYUV4dHJhY3Rvcl9zZWVrVG8obUFNZWRpYUV4dHJhY3Rvciwgc2Vla1Bvc1VzLCBhTW9kZSk7Cit9CisKK1Bzc2hJbmZvKiBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpnZXRQc3NoSW5mbygpIHsKKyAgICBpZiAobUFNZWRpYUV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gQU1lZGlhRXh0cmFjdG9yX2dldFBzc2hJbmZvKG1BTWVkaWFFeHRyYWN0b3IpOworfQorCitzcDxBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyPiBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpnZXRTYW1wbGVDcnlwdG9JbmZvKCkgeworICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBuZXcgQU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcihBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlQ3J5cHRvSW5mbyhtQU1lZGlhRXh0cmFjdG9yKSk7Cit9CisKK3NzaXplX3QgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI6OkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX2dldFNpemUodm9pZCAqdXNlcmRhdGEpIHsKKyAgICBEYXRhU291cmNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEYXRhU291cmNlICo+KHVzZXJkYXRhKTsKKyAgICBvZmY2NF90IHNpemUgPSAtMTsKKyAgICBzb3VyY2UtPmdldFNpemUoJnNpemUpOworICAgIHJldHVybiBzaXplOworfQorCitzc2l6ZV90IEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyOjpBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9yZWFkQXQodm9pZCAqdXNlcmRhdGEsIG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICogYnVmLCBzaXplX3Qgc2l6ZSkgeworICAgIERhdGFTb3VyY2UgKnNvdXJjZSA9IHN0YXRpY19jYXN0PERhdGFTb3VyY2UgKj4odXNlcmRhdGEpOworICAgIHJldHVybiBzb3VyY2UtPnJlYWRBdChvZmZzZXQsIGJ1Ziwgc2l6ZSk7Cit9CisKK3ZvaWQgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI6OkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX2Nsb3NlKHZvaWQgKnVzZXJkYXRhKSB7CisgICAgRGF0YVNvdXJjZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGF0YVNvdXJjZSAqPih1c2VyZGF0YSk7CisgICAgc291cmNlLT5jbG9zZSgpOworfQorCitBTWVkaWFEYXRhU291cmNlV3JhcHBlcjo6QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UpCisgICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKKyAgICAgIG1BTWVkaWFEYXRhU291cmNlKEFNZWRpYURhdGFTb3VyY2VfbmV3KCkpIHsKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZSAoc291cmNlOiAlcCkiLCBkYXRhU291cmNlLmdldCgpKTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldFVzZXJkYXRhKG1BTWVkaWFEYXRhU291cmNlLCBkYXRhU291cmNlLmdldCgpKTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldFJlYWRBdChtQU1lZGlhRGF0YVNvdXJjZSwgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfcmVhZEF0KTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldFNpemUobUFNZWRpYURhdGFTb3VyY2UsIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX2dldFNpemUpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0Q2xvc2UobUFNZWRpYURhdGFTb3VyY2UsIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX2Nsb3NlKTsKK30KKworQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI6On5BTWVkaWFEYXRhU291cmNlV3JhcHBlcigpIHsKKyAgICBpZiAobUFNZWRpYURhdGFTb3VyY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFNZWRpYURhdGFTb3VyY2VfZGVsZXRlKG1BTWVkaWFEYXRhU291cmNlKTsKKyAgICBtQU1lZGlhRGF0YVNvdXJjZSA9IE5VTEw7Cit9CisKK0FNZWRpYURhdGFTb3VyY2UqIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyOjpnZXRBTWVkaWFEYXRhU291cmNlKCkgeworICAgIHJldHVybiBtQU1lZGlhRGF0YVNvdXJjZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL1RpbWVDaGVjay5jcHAgYi9tZWRpYS9saWJtZWRpYS9UaW1lQ2hlY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYjVkNGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9UaW1lQ2hlY2suY3BwCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpbmNsdWRlIDxtZWRpYS9UaW1lQ2hlY2suaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKiBzdGF0aWMgKi8KK3NwPFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkPiBUaW1lQ2hlY2s6OmdldFRpbWVDaGVja1RocmVhZCgpCit7CisgICAgc3RhdGljIHNwPFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkPiBzVGltZUNoZWNrVGhyZWFkID0gbmV3IFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkKCk7CisgICAgcmV0dXJuIHNUaW1lQ2hlY2tUaHJlYWQ7Cit9CisKK1RpbWVDaGVjazo6VGltZUNoZWNrKGNvbnN0IGNoYXIgKnRhZywgdWludDMyX3QgdGltZW91dE1zKQorICAgIDogbUVuZFRpbWVOcyhnZXRUaW1lQ2hlY2tUaHJlYWQoKS0+c3RhcnRNb25pdG9yaW5nKHRhZywgdGltZW91dE1zKSkKK3sKK30KKworVGltZUNoZWNrOjp+VGltZUNoZWNrKCkgeworICAgIGdldFRpbWVDaGVja1RocmVhZCgpLT5zdG9wTW9uaXRvcmluZyhtRW5kVGltZU5zKTsKK30KKworVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6On5UaW1lQ2hlY2tUaHJlYWQoKQoreworICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOworICAgIHJlcXVlc3RFeGl0KCk7CisgICAgbU1vbml0b3JSZXF1ZXN0cy5jbGVhcigpOworICAgIG1Db25kLnNpZ25hbCgpOworfQorCituc2Vjc190IFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkOjpzdGFydE1vbml0b3JpbmcoY29uc3QgY2hhciAqdGFnLCB1aW50MzJfdCB0aW1lb3V0TXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobU11dGV4KTsKKyAgICBuc2Vjc190IGVuZFRpbWVOcyA9IHN5c3RlbVRpbWUoKSArIG1pbGxpc2Vjb25kcyh0aW1lb3V0TXMpOworICAgIGZvciAoOyBtTW9uaXRvclJlcXVlc3RzLmluZGV4T2ZLZXkoZW5kVGltZU5zKSA+PSAwOyArK2VuZFRpbWVOcyk7CisgICAgbU1vbml0b3JSZXF1ZXN0cy5hZGQoZW5kVGltZU5zLCB0YWcpOworICAgIG1Db25kLnNpZ25hbCgpOworICAgIHJldHVybiBlbmRUaW1lTnM7Cit9CisKK3ZvaWQgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6OnN0b3BNb25pdG9yaW5nKG5zZWNzX3QgZW5kVGltZU5zKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1NdXRleCk7CisgICAgbU1vbml0b3JSZXF1ZXN0cy5yZW1vdmVJdGVtKGVuZFRpbWVOcyk7CisgICAgbUNvbmQuc2lnbmFsKCk7Cit9CisKK2Jvb2wgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6OnRocmVhZExvb3AoKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IFRJTUVEX09VVDsKKyAgICBjb25zdCBjaGFyICp0YWc7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKKworICAgICAgICBpZiAoZXhpdFBlbmRpbmcoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgbnNlY3NfdCBlbmRUaW1lTnMgPSBJTlQ2NF9NQVg7CisgICAgICAgIC8vIEtleWVkVmVjdG9yIG1Nb25pdG9yUmVxdWVzdHMgaXMgb3JkZXJlZCBzbyB0YWtlIGZpcnN0IGVudHJ5IGFzIG5leHQgdGltZW91dAorICAgICAgICBpZiAobU1vbml0b3JSZXF1ZXN0cy5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgZW5kVGltZU5zID0gbU1vbml0b3JSZXF1ZXN0cy5rZXlBdCgwKTsKKyAgICAgICAgICAgIHRhZyA9IG1Nb25pdG9yUmVxdWVzdHMudmFsdWVBdCgwKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IG5zZWNzX3Qgd2FpdFRpbWVOcyA9IGVuZFRpbWVOcyAtIHN5c3RlbVRpbWUoKTsKKyAgICAgICAgaWYgKHdhaXRUaW1lTnMgPiAwKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBtQ29uZC53YWl0UmVsYXRpdmUobU11dGV4LCB3YWl0VGltZU5zKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgIlRpbWVDaGVjayB0aW1lb3V0IGZvciAlcyIsIHRhZyk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9UeXBlQ29udmVydGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL1R5cGVDb252ZXJ0ZXIuY3BwCmluZGV4IGU2YzhmOWMuLmEzZGI3NTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL1R5cGVDb252ZXJ0ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL1R5cGVDb252ZXJ0ZXIuY3BwCkBAIC01NSw2ICs1NSw4IEBACiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfQlVTKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9QUk9YWSksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfVVNCX0hFQURTRVQpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9FQ0hPX0NBTkNFTExFUiksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCksCiAgICAgLy8gU1RVQiBtdXN0IGJlIGFmdGVyIERFRkFVTFQsIHNvIHRoZSBsYXR0ZXIgaXMgcGlja2VkIHVwIGJ5IHRvU3RyaW5nIGZpcnN0LgogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX1NUVUIpLApAQCAtMTE1LDYgKzExNyw3IEBACiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVF9QQ00pLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19PVVRQVVRfRkxBR19NTUFQX05PSVJRKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfVk9JUF9SWCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX09VVFBVVF9GTEFHX0lOQ0FMTF9NVVNJQyksCiAgICAgVEVSTUlOQVRPUgogfTsKIApAQCAtMTI4LDYgKzEzMSw3IEBACiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfU1lOQyksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfTU1BUF9OT0lSUSksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfVk9JUF9UWCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfSFdfQVZfU1lOQyksCiAgICAgVEVSTUlOQVRPUgogfTsKIApAQCAtMTU0LDYgKzE1OCw3IEBACiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTEQpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0hFX1YyKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19FTEQpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX1hIRSksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfQURUU19NQUlOKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19BRFRTX0xDKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19BRFRTX1NTUiksCkBAIC0xNjQsNiArMTY5LDcgQEAKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19BRFRTX0xEKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19BRFRTX0hFX1YyKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19BRFRTX0VMRCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfQURUU19YSEUpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfVk9SQklTKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0hFX0FBQ19WMSksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9IRV9BQUNfVjIpLApAQCAtMTk0LDYgKzIwMCwxMSBAQAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQVBUWF9IRCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQzQpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfTERBQyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9NQVQpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfRV9BQzNfSk9DKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX01BVF8xXzApLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfTUFUXzJfMCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9NQVRfMl8xKSwKICAgICBURVJNSU5BVE9SCiB9OwogCkBAIC0yMDMsMTIgKzIxNCwyNCBAQAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9NT05PKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDBQT0lOVDIpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxUE9JTlQyKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMFBPSU5UMiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDFQT0lOVDIpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9RVUFEKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9CQUNLKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9TSURFKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfU1VSUk9VTkQpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9QRU5UQSksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX0JBQ0spLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX1NJREUpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF81UE9JTlQxUE9JTlQyKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMVBPSU5UNCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzZQT0lOVDEpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF83UE9JTlQxKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMVBPSU5UMiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDFQT0lOVDQpLAogICAgIFRFUk1JTkFUT1IKIH07CiAKQEAgLTIxOSw2ICsyNDIsMTEgQEAKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8pLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX0lOX0ZST05UX0JBQ0spLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX0lOXzYpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX0lOXzJQT0lOVDBQT0lOVDIpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX0lOXzJQT0lOVDFQT0lOVDIpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX0lOXzNQT0lOVDBQT0lOVDIpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX0lOXzNQT0lOVDFQT0lOVDIpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX0lOXzVQT0lOVDEpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX0lOX1ZPSUNFX1VQTElOS19NT05PKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9ETkxJTktfTU9OTyksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfQ0FMTF9NT05PKSwKQEAgLTI3Nyw2ICszMDUsMTYgQEAKICAgICBURVJNSU5BVE9SCiB9OwogCit0ZW1wbGF0ZTw+Citjb25zdCBBdWRpb0NvbnRlbnRUeXBlQ29udmVydGVyOjpUYWJsZSBBdWRpb0NvbnRlbnRUeXBlQ29udmVydGVyOjptVGFibGVbXSA9IHsKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04pLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DT05URU5UX1RZUEVfU1BFRUNIKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ09OVEVOVF9UWVBFX01PVklFKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTiksCisgICAgVEVSTUlOQVRPUgorfTsKKwogdGVtcGxhdGUgPD4KIGNvbnN0IFVzYWdlVHlwZUNvbnZlcnRlcjo6VGFibGUgVXNhZ2VUeXBlQ29udmVydGVyOjptVGFibGVbXSA9IHsKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfVU5LTk9XTiksCkBAIC0yOTUsOCArMzMzLDcgQEAKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04pLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9HQU1FKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0UpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9DTlQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9NQVgpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9BU1NJU1RBTlQpLAogICAgIFRFUk1JTkFUT1IKIH07CiAKQEAgLTMxMiw4ICszNDksNiBAQAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX1VOUFJPQ0VTU0VEKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX0NOVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9NQVgpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfRk1fVFVORVIpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfSE9UV09SRCksCiAgICAgVEVSTUlOQVRPUgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuYWlkbCBiL21lZGlhL2xpYm1lZGlhL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdiMWJjOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmFpZGwKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIFNlcnZpY2UgdG8gcmVsb2FkIGV4dHJhY3RvciBwbHVnaW5zIHdoZW4gdXBkYXRlIHBhY2thZ2UgaXMgaW5zdGFsbGVkL3VuaW5zdGFsbGVkLgorICogQGhpZGUKKyAqLworaW50ZXJmYWNlIElNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UgeworICAgIHZvaWQgbG9hZFBsdWdpbnMoQHV0ZjhJbkNwcCBTdHJpbmcgYXBrUGF0aCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9leHBvcnRzLmxkcyBiL21lZGlhL2xpYm1lZGlhL2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOWZiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9leHBvcnRzLmxkcwpAQCAtMCwwICsxLDcgQEAKK3sKKyAgICBnbG9iYWw6CisgICAgICAgICo7CisgICAgbG9jYWw6CisgICAgICAgIF9aTjdhbmRyb2lkMTNNaWRpSW9XcmFwcGVyKjsKKyAgICAgICAgX1pUVk43YW5kcm9pZDEzTWlkaUlvV3JhcHBlckU7Cit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9CdWZmZXJQcm92aWRlcnMuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQnVmZmVyUHJvdmlkZXJzLmgKaW5kZXggOWQwMjZmNi4uZDZhOWNmYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9CdWZmZXJQcm92aWRlcnMuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0J1ZmZlclByb3ZpZGVycy5oCkBAIC0xNjEsNiArMTYxLDE3IEBACiAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgbU91dHB1dEZvcm1hdDsKIH07CiAKKy8vIENsYW1wRmxvYXRCdWZmZXJQcm92aWRlciBkZXJpdmVzIGZyb20gQ29weUJ1ZmZlclByb3ZpZGVyIHRvIGNsYW1wIGZsb2F0cyBpbnNpZGUgLTNkYgorY2xhc3MgQ2xhbXBGbG9hdEJ1ZmZlclByb3ZpZGVyIDogcHVibGljIENvcHlCdWZmZXJQcm92aWRlciB7CitwdWJsaWM6CisgICAgQ2xhbXBGbG9hdEJ1ZmZlclByb3ZpZGVyKGludDMyX3QgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpOworICAgIHZpcnR1YWwgdm9pZCBjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKTsKKworcHJvdGVjdGVkOgorICAgIGNvbnN0IHVpbnQzMl90ICAgICAgIG1DaGFubmVsQ291bnQ7Cit9OworCiAvLyBUaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyIGRlcml2ZXMgZnJvbSBQYXNzdGhydUJ1ZmZlclByb3ZpZGVyIGZvciB0aW1lIHN0cmV0Y2hpbmcKIGNsYXNzIFRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgUGFzc3RocnVCdWZmZXJQcm92aWRlciB7CiBwdWJsaWM6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmgKaW5kZXggZTgxMmQyYS4uZDJhM2U0MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuaApAQCAtMjEsNDUgKzIxLDE0IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotZW51bSBCdWZmZXJpbmdNb2RlIDogaW50IHsKLSAgICAvLyBEbyBub3Qgc3VwcG9ydCBidWZmZXJpbmcuCi0gICAgQlVGRkVSSU5HX01PREVfTk9ORSAgICAgICAgICAgICA9IDAsCi0gICAgLy8gU3VwcG9ydCBvbmx5IHRpbWUgYmFzZWQgYnVmZmVyaW5nLgotICAgIEJVRkZFUklOR19NT0RFX1RJTUVfT05MWSAgICAgICAgPSAxLAotICAgIC8vIFN1cHBvcnQgb25seSBzaXplIGJhc2VkIGJ1ZmZlcmluZy4KLSAgICBCVUZGRVJJTkdfTU9ERV9TSVpFX09OTFkgICAgICAgID0gMiwKLSAgICAvLyBTdXBwb3J0IGJvdGggdGltZSBhbmQgc2l6ZSBiYXNlZCBidWZmZXJpbmcsIHRpbWUgYmFzZWQgY2FsY3VsYXRpb24gcHJlY2VkZXMgc2l6ZSBiYXNlZC4KLSAgICAvLyBTaXplIGJhc2VkIGNhbGN1bGF0aW9uIHdpbGwgYmUgdXNlZCBvbmx5IHdoZW4gdGltZSBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIGZvcgotICAgIC8vIHRoZSBzdHJlYW0uCi0gICAgQlVGRkVSSU5HX01PREVfVElNRV9USEVOX1NJWkUgICA9IDMsCi0gICAgLy8gTnVtYmVyIG9mIG1vZGVzLgotICAgIEJVRkZFUklOR19NT0RFX0NPVU5UICAgICAgICAgICAgPSA0LAotfTsKLQogc3RydWN0IEJ1ZmZlcmluZ1NldHRpbmdzIDogcHVibGljIFBhcmNlbGFibGUgewotICAgIHN0YXRpYyBjb25zdCBpbnQga05vV2F0ZXJtYXJrID0gLTE7CisgICAgc3RhdGljIGNvbnN0IGludCBrTm9NYXJrID0gLTE7CiAKLSAgICBzdGF0aWMgYm9vbCBJc1ZhbGlkQnVmZmVyaW5nTW9kZShpbnQgbW9kZSk7Ci0gICAgc3RhdGljIGJvb2wgSXNUaW1lQmFzZWRCdWZmZXJpbmdNb2RlKGludCBtb2RlKTsKLSAgICBzdGF0aWMgYm9vbCBJc1NpemVCYXNlZEJ1ZmZlcmluZ01vZGUoaW50IG1vZGUpOworICAgIGludCBtSW5pdGlhbE1hcmtNczsKIAotICAgIEJ1ZmZlcmluZ01vZGUgbUluaXRpYWxCdWZmZXJpbmdNb2RlOyAgLy8gZm9yIHByZXBhcmUKLSAgICBCdWZmZXJpbmdNb2RlIG1SZWJ1ZmZlcmluZ01vZGU7ICAvLyBmb3IgcGxheWJhY2sKLQotICAgIGludCBtSW5pdGlhbFdhdGVybWFya01zOyAgLy8gdGltZSBiYXNlZAotICAgIGludCBtSW5pdGlhbFdhdGVybWFya0tCOyAgLy8gc2l6ZSBiYXNlZAotCi0gICAgLy8gV2hlbiBjYWNoZWQgZGF0YSBpcyBiZWxvdyB0aGlzIG1hcmssIHBsYXliYWNrIHdpbGwgYmUgcGF1c2VkIGZvciBidWZmZXJpbmcKLSAgICAvLyB0aWxsIGRhdGEgcmVhY2ggfG1SZWJ1ZmZlcmluZ1dhdGVybWFya0hpZ2hNc3wgb3IgZW5kIG9mIHN0cmVhbS4KLSAgICBpbnQgbVJlYnVmZmVyaW5nV2F0ZXJtYXJrTG93TXM7Ci0gICAgLy8gV2hlbiBjYWNoZWQgZGF0YSBpcyBhYm92ZSB0aGlzIG1hcmssIGJ1ZmZlcmluZyB3aWxsIGJlIHBhdXNlZC4KLSAgICBpbnQgbVJlYnVmZmVyaW5nV2F0ZXJtYXJrSGlnaE1zOwotCi0gICAgLy8gV2hlbiBjYWNoZWQgZGF0YSBpcyBiZWxvdyB0aGlzIG1hcmssIHBsYXliYWNrIHdpbGwgYmUgcGF1c2VkIGZvciBidWZmZXJpbmcKLSAgICAvLyB0aWxsIGRhdGEgcmVhY2ggfG1SZWJ1ZmZlcmluZ1dhdGVybWFya0hpZ2hLQnwgb3IgZW5kIG9mIHN0cmVhbS4KLSAgICBpbnQgbVJlYnVmZmVyaW5nV2F0ZXJtYXJrTG93S0I7Ci0gICAgLy8gV2hlbiBjYWNoZWQgZGF0YSBpcyBhYm92ZSB0aGlzIG1hcmssIGJ1ZmZlcmluZyB3aWxsIGJlIHBhdXNlZC4KLSAgICBpbnQgbVJlYnVmZmVyaW5nV2F0ZXJtYXJrSGlnaEtCOworICAgIC8vIFdoZW4gY2FjaGVkIGRhdGEgaXMgYWJvdmUgdGhpcyBtYXJrLCBwbGF5YmFjayB3aWxsIGJlIHJlc3VtZWQgaWYgaXQgaGFzIGJlZW4gcGF1c2VkCisgICAgLy8gZHVlIHRvIGxvdyBjYWNoZWQgZGF0YS4KKyAgICBpbnQgbVJlc3VtZVBsYXliYWNrTWFya01zOwogCiAgICAgQnVmZmVyaW5nU2V0dGluZ3MoKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Db2RlY1NlcnZpY2VSZWdpc3RyYW50LmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0NvZGVjU2VydmljZVJlZ2lzdHJhbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGFmNzgxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Db2RlY1NlcnZpY2VSZWdpc3RyYW50LmgKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUNfU0VSVklDRV9SRUdJU1RSQU5UX0hfCisKKyNkZWZpbmUgQ09ERUNfU0VSVklDRV9SRUdJU1RSQU5UX0hfCisKK3R5cGVkZWYgdm9pZCAoKlJlZ2lzdGVyQ29kZWNTZXJ2aWNlc0Z1bmMpKCk7CisKKyNlbmRpZiAgLy8gQ09ERUNfU0VSVklDRV9SRUdJU1RSQU5UX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0NvdW50ZXJNZXRyaWMuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQ291bnRlck1ldHJpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MzQ3MGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0NvdW50ZXJNZXRyaWMuaApAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgQU5EUk9JRF9DT1VOVEVSX01FVFJJQ19IXworI2RlZmluZSBBTkRST0lEX0NPVU5URVJfTUVUUklDX0hfCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisKKy8vIFRoZSBDb3VudGVyTWV0cmljIGNsYXNzIGlzIHVzZWQgdG8gaG9sZCBjb3VudHMgb2Ygb3BlcmF0aW9ucyBvciBldmVudHMuCisvLyBBIENvdW50ZXJNZXRyaWMgY2FuIGJyZWFrIGRvd24gY291bnRzIGJ5IGEgZGltZW5zaW9uIHNwZWNpZmllZCBieSB0aGUKKy8vIGFwcGxpY2F0aW9uLiBFLmcuIGFuIGFwcGxpY2F0aW9uIG1heSB3YW50IHRvIHRyYWNrIGNvdW50cyBicm9rZW4gb3V0IGJ5CisvLyBlcnJvciBjb2RlIG9yIHRoZSBzaXplIG9mIHNvbWUgcGFyYW1ldGVyLgorLy8KKy8vIEV4YW1wbGU6CisvLworLy8gICBDb3VudGVyTWV0cmljPHN0YXR1c190PiB3b3JrQ291bnRlcjsKKy8vICAgd29ya0NvdW50ZXIoIndvcmtDb3VudGVyTmFtZSIsICJyZXN1bHRfc3RhdHVzIik7CisvLworLy8gICBzdGF0dXNfdCBlcnIgPSBEb1dvcmsoKTsKKy8vCisvLyAgIC8vIEluY3JlbWVudHMgdGhlIG51bWJlciBvZiB0aW1lcyBjYWxsZWQgd2l0aCB0aGUgZ2l2ZW4gZXJyb3IgY29kZS4KKy8vICAgd29ya0NvdW50ZXIuSW5jcmVtZW50KGVycik7CisvLworLy8gICBzdGQ6Om1hcDxpbnQsIGludDY0X3Q+IHZhbHVlczsKKy8vICAgIG1ldHJpYy5FeHBvcnRWYWx1ZXMoCisvLyAgICAgICAgWyZdIChpbnQgYXR0cmlidXRlX3ZhbHVlLCBpbnQ2NF90IHZhbHVlKSB7CisvLyAgICAgICAgICAgICB2YWx1ZXNbYXR0cmlidXRlX3ZhbHVlXSA9IHZhbHVlOworLy8gICAgICAgIH0pOworLy8KKy8vICAgLy8gRG8gc29tZXRoaW5nIHdpdGggdGhlIGV4cG9ydGVkIHN0YXQuCisvLwordGVtcGxhdGU8dHlwZW5hbWUgQXR0cmlidXRlVHlwZT4KK2NsYXNzIENvdW50ZXJNZXRyaWMgeworIHB1YmxpYzoKKyAgLy8gSW5zdGFudGlhdGUgdGhlIGNvdW50ZXIgd2l0aCB0aGUgZ2l2ZW4gbWV0cmljIG5hbWUgYW5kCisgIC8vIGF0dHJpYnV0ZSBuYW1lcy4gfGF0dHJpYnV0ZV9uYW1lc3wgbXVzdCBub3QgYmUgbnVsbC4KKyAgQ291bnRlck1ldHJpYygKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXRyaWNfbmFtZSwKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhdHRyaWJ1dGVfbmFtZSkKKyAgICAgICAgICA6IG1ldHJpY19uYW1lXyhtZXRyaWNfbmFtZSksCisgICAgICAgICAgICBhdHRyaWJ1dGVfbmFtZV8oYXR0cmlidXRlX25hbWUpIHt9CisKKyAgLy8gSW5jcmVtZW50IHRoZSBjb3VudCBvZiB0aW1lcyB0aGUgb3BlcmF0aW9uIG9jY3VycmVkIHdpdGggdGhpcworICAvLyBjb21iaW5hdGlvbiBvZiBhdHRyaWJ1dGVzLgorICB2b2lkIEluY3JlbWVudChBdHRyaWJ1dGVUeXBlIGF0dHJpYnV0ZSkgeworICAgIGlmICh2YWx1ZXNfLmZpbmQoYXR0cmlidXRlKSA9PSB2YWx1ZXNfLmVuZCgpKSB7CisgICAgICB2YWx1ZXNfW2F0dHJpYnV0ZV0gPSAxOworICAgIH0gZWxzZSB7CisgICAgICB2YWx1ZXNfW2F0dHJpYnV0ZV0gPSB2YWx1ZXNfW2F0dHJpYnV0ZV0gKyAxOworICAgIH0KKyAgfTsKKworICAvLyBFeHBvcnQgdGhlIG1ldHJpY3MgdG8gdGhlIHByb3ZpZGVkIHxmdW5jdGlvbnwuIEVhY2ggdmFsdWUgZm9yIEF0dHJpYnV0ZQorICAvLyBoYXMgYSBzZXBhcmF0ZSBjb3VudC4gQXMgc3VjaCwgfGZ1bmN0aW9ufCB3aWxsIGJlIGNhbGxlZCBvbmNlIHBlciB2YWx1ZQorICAvLyBvZiBBdHRyaWJ1dGUuCisgIHZvaWQgRXhwb3J0VmFsdWVzKAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkIChjb25zdCBBdHRyaWJ1dGVUeXBlJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBjb3VudCk+IGZ1bmN0aW9uKSBjb25zdCB7CisgICAgZm9yIChhdXRvIGl0ID0gdmFsdWVzXy5iZWdpbigpOyBpdCAhPSB2YWx1ZXNfLmVuZCgpOyBpdCsrKSB7CisgICAgICBmdW5jdGlvbihpdC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICAgIH0KKyAgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXRyaWNfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1ldHJpY19uYW1lXzsgfTsKKworIHByaXZhdGU6CisgIGNvbnN0IHN0ZDo6c3RyaW5nIG1ldHJpY19uYW1lXzsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgYXR0cmlidXRlX25hbWVfOworICBzdGQ6Om1hcDxBdHRyaWJ1dGVUeXBlLCBpbnQ2NF90PiB2YWx1ZXNfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0NPVU5URVJfTUVUUklDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0NyeXB0b0hhbC5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9DcnlwdG9IYWwuaAppbmRleCA4MGUxODFlLi5mZjg3ODlkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0NyeXB0b0hhbC5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQ3J5cHRvSGFsLmgKQEAgLTIwLDE0ICsyMCwxNiBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lDcnlwdG9GYWN0b3J5Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lDcnlwdG9QbHVnaW4uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSUNyeXB0b0ZhY3RvcnkuaD4KIAotI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JQ3J5cHRvLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6SUNyeXB0b0ZhY3Rvcnk7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OklDcnlwdG9QbHVnaW47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlNoYXJlZEJ1ZmZlcjsKK25hbWVzcGFjZSBkcm0gPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm07Cit1c2luZyBkcm06OlYxXzA6OklDcnlwdG9GYWN0b3J5OwordXNpbmcgZHJtOjpWMV8wOjpJQ3J5cHRvUGx1Z2luOwordXNpbmcgZHJtOjpWMV8wOjpTaGFyZWRCdWZmZXI7CiAKIGNsYXNzIElNZW1vcnlIZWFwOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VEZXNjLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VEZXNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE5MDI2MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZURlc2MuaApAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfREFUQVNPVVJDRURFU0NfSAorI2RlZmluZSBBTkRST0lEX0RBVEFTT1VSQ0VERVNDX0gKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRGF0YVNvdXJjZTsKK3N0cnVjdCBNZWRpYUhUVFBTZXJ2aWNlOworCisvLyBBIGJpbmRlciBpbnRlcmZhY2UgZm9yIGltcGxlbWVudGluZyBhIHN0YWdlZnJpZ2h0IERhdGFTb3VyY2UgcmVtb3RlbHkuCitzdHJ1Y3QgRGF0YVNvdXJjZURlc2MgOiBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisgICAgZW51bSB7CisgICAgICAgIC8qIE5vIGRhdGEgc291cmNlIGhhcyBiZWVuIHNldCB5ZXQgKi8KKyAgICAgICAgVFlQRV9OT05FICAgICA9IDAsCisgICAgICAgIC8qIGRhdGEgc291cmNlIGlzIHR5cGUgb2YgTWVkaWFEYXRhU291cmNlICovCisgICAgICAgIFRZUEVfQ0FMTEJBQ0sgPSAxLAorICAgICAgICAvKiBkYXRhIHNvdXJjZSBpcyB0eXBlIG9mIEZpbGVEZXNjcmlwdG9yICovCisgICAgICAgIFRZUEVfRkQgICAgICAgPSAyLAorICAgICAgICAvKiBkYXRhIHNvdXJjZSBpcyB0eXBlIG9mIFVybCAqLworICAgICAgICBUWVBFX1VSTCAgICAgID0gMywKKyAgICB9OworCisgICAgRGF0YVNvdXJjZURlc2MoKTsKKworICAgIGludCBtVHlwZTsKKworICAgIHNwPE1lZGlhSFRUUFNlcnZpY2U+IG1IdHRwU2VydmljZTsKKyAgICBTdHJpbmc4IG1Vcmw7CisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUhlYWRlcnM7CisKKyAgICBpbnQgbUZEOworICAgIGludDY0X3QgbUZET2Zmc2V0OworICAgIGludDY0X3QgbUZETGVuZ3RoOworCisgICAgc3A8RGF0YVNvdXJjZT4gbUNhbGxiYWNrU291cmNlOworCisgICAgaW50NjRfdCBtSWQ7CisgICAgaW50NjRfdCBtU3RhcnRQb3NpdGlvbk1zOworICAgIGludDY0X3QgbUVuZFBvc2l0aW9uTXM7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRGF0YVNvdXJjZURlc2MpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfREFUQVNPVVJDRURFU0NfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm1IYWwuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtSGFsLmgKaW5kZXggNWQyNWU0ZC4uZjI2N2Y3NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm1IYWwuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybUhhbC5oCkBAIC0xOCwxOSArMTgsMjQgQEAKIAogI2RlZmluZSBEUk1fSEFMX0hfCiAKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSURybUZhY3RvcnkuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSURybVBsdWdpbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JRHJtUGx1Z2luTGlzdGVuZXIuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSURybUZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybUZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybVBsdWdpbi5oPgogCi0jaW5jbHVkZSA8bWVkaWEvSURybS5oPgotI2luY2x1ZGUgPG1lZGlhL0lEcm1DbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9Ecm1NZXRyaWNzLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vSURybS5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0lEcm1DbGllbnQuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6RXZlbnRUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpJRHJtRmFjdG9yeTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6SURybVBsdWdpbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6SURybVBsdWdpbkxpc3RlbmVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlTdGF0dXM7CituYW1lc3BhY2UgZHJtID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOwordXNpbmcgZHJtOjpWMV8wOjpFdmVudFR5cGU7Cit1c2luZyBkcm06OlYxXzA6OklEcm1GYWN0b3J5OwordXNpbmcgZHJtOjpWMV8wOjpJRHJtUGx1Z2luOwordXNpbmcgZHJtOjpWMV8wOjpJRHJtUGx1Z2luTGlzdGVuZXI7Cit1c2luZyBkcm06OlYxXzA6OktleVN0YXR1czsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKQEAgLTU5LDcgKzY0LDggQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVzdHJveVBsdWdpbigpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuU2Vzc2lvbihWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuU2Vzc2lvbihEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwsCisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlU2Vzc2lvbihWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCk7CiAKQEAgLTkzLDEwICs5OSwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmd3JhcHBlZEtleSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAmc2VjdXJlU3RvcHMpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcElkcyhMaXN0PFZlY3Rvcjx1aW50OF90Pj4gJnNlY3VyZVN0b3BJZHMpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzaWQsIFZlY3Rvcjx1aW50OF90PiAmc2VjdXJlU3RvcCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VTZWN1cmVTdG9wcyhWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzUmVsZWFzZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQWxsU2VjdXJlU3RvcHMoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVNlY3VyZVN0b3AoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzc2lkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUFsbFNlY3VyZVN0b3BzKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEhkY3BMZXZlbHMoRHJtUGx1Z2luOjpIZGNwTGV2ZWwgKmNvbm5lY3RlZExldmVsLAorICAgICAgICAgICAgRHJtUGx1Z2luOjpIZGNwTGV2ZWwgKm1heExldmVsKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE51bWJlck9mU2Vzc2lvbnModWludDMyX3QgKmN1cnJlbnRTZXNzaW9ucywKKyAgICAgICAgICAgIHVpbnQzMl90ICptYXhTZXNzaW9ucykgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cml0eUxldmVsKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsICpsZXZlbCkgY29uc3Q7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggJnZhbHVlICkgY29uc3Q7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0ICZuYW1lLApAQCAtMTA0LDYgKzExOSw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4IGNvbnN0ICZ2YWx1ZSApIGNvbnN0OwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCAmbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmdmFsdWUgKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldHJpY3Mob3M6OlBlcnNpc3RhYmxlQnVuZGxlICptZXRyaWNzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2lwaGVyQWxnb3JpdGhtKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJmFsZ29yaXRobSk7CkBAIC0xNjUsOSArMTgxLDE1IEBACiAKICAgICBjb25zdCBWZWN0b3I8c3A8SURybUZhY3Rvcnk+PiBtRmFjdG9yaWVzOwogICAgIHNwPElEcm1QbHVnaW4+IG1QbHVnaW47CisgICAgc3A8ZHJtOjpWMV8xOjpJRHJtUGx1Z2luPiBtUGx1Z2luVjFfMTsKKyAgICBTdHJpbmc4IG1BcHBQYWNrYWdlTmFtZTsKKworICAgIC8vIE11dGFibGUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIHdpdGhpbiBHZXRQcm9wZXJ0eUJ5dGVBcnJheS4KKyAgICBtdXRhYmxlIE1lZGlhRHJtTWV0cmljcyBtTWV0cmljczsKIAogICAgIFZlY3RvcjxWZWN0b3I8dWludDhfdD4+IG1PcGVuU2Vzc2lvbnM7CiAgICAgdm9pZCBjbG9zZU9wZW5TZXNzaW9ucygpOworICAgIHZvaWQgY2xlYW51cCgpOwogCiAgICAgLyoqCiAgICAgICogbUluaXRDaGVjayBpczoKQEAgLTE4Myw3ICsyMDUsOCBAQAogCiAgICAgdm9pZCB3cml0ZUJ5dGVBcnJheShQYXJjZWwgJm9iaiwgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGFycmF5KTsKIAotICAgIHZvaWQgcmVwb3J0TWV0cmljcygpIGNvbnN0OworICAgIHZvaWQgcmVwb3J0UGx1Z2luTWV0cmljcygpIGNvbnN0OworICAgIHZvaWQgcmVwb3J0RnJhbWV3b3JrTWV0cmljcygpIGNvbnN0OwogICAgIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUpIGNvbnN0OwogICAgIHN0YXR1c190IGdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwoU3RyaW5nOCBjb25zdCAmbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmdmFsdWUpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm1NZXRyaWNzLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybU1ldHJpY3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjE5OThmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm1NZXRyaWNzLmgKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIERSTV9NRVRSSUNTX0hfCisjZGVmaW5lIERSTV9NRVRSSUNTX0hfCisKKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvdHlwZXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGVyc2lzdGFibGVCdW5kbGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9Db3VudGVyTWV0cmljLmg+CisjaW5jbHVkZSA8bWVkaWEvRXZlbnRNZXRyaWMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFRoaXMgY2xhc3MgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgbWV0cmljcyBjYXB0dXJlZCB3aXRoaW4gTWVkaWFEcm0uCisgKiBJdCBhbHNvIGNvbnRhaW5zIGEgbWV0aG9kIGZvciBleHBvcnRpbmcgYWxsIG9mIHRoZSBtZXRyaWNzIHRvIGEKKyAqIFBlcnNpc3RhYmxlQnVuZGxlLgorICovCitjbGFzcyBNZWRpYURybU1ldHJpY3MgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgTWVkaWFEcm1NZXRyaWNzKCk7CisgIHZpcnR1YWwgfk1lZGlhRHJtTWV0cmljcygpIHt9OworICAvLyBDb3VudCBvZiBvcGVuU2Vzc2lvbiBjYWxscy4KKyAgQ291bnRlck1ldHJpYzxzdGF0dXNfdD4gbU9wZW5TZXNzaW9uQ291bnRlcjsKKyAgLy8gQ291bnQgb2YgY2xvc2VTZXNzaW9uIGNhbGxzLgorICBDb3VudGVyTWV0cmljPHN0YXR1c190PiBtQ2xvc2VTZXNzaW9uQ291bnRlcjsKKyAgLy8gQ291bnQgYW5kIHRpbWluZyBvZiBnZXRLZXlSZXF1ZXN0IGNhbGxzLgorICBFdmVudE1ldHJpYzxzdGF0dXNfdD4gbUdldEtleVJlcXVlc3RUaW1lVXM7CisgIC8vIENvdW50IGFuZCB0aW1pbmcgb2YgcHJvdmlkZUtleVJlc3BvbnNlIGNhbGxzLgorICBFdmVudE1ldHJpYzxzdGF0dXNfdD4gbVByb3ZpZGVLZXlSZXNwb25zZVRpbWVVczsKKyAgLy8gQ291bnQgb2YgZ2V0UHJvdmlzaW9uUmVxdWVzdCBjYWxscy4KKyAgQ291bnRlck1ldHJpYzxzdGF0dXNfdD4gbUdldFByb3Zpc2lvblJlcXVlc3RDb3VudGVyOworICAvLyBDb3VudCBvZiBwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UgY2FsbHMuCisgIENvdW50ZXJNZXRyaWM8c3RhdHVzX3Q+IG1Qcm92aWRlUHJvdmlzaW9uUmVzcG9uc2VDb3VudGVyOworCisgIC8vIENvdW50IG9mIGtleSBzdGF0dXMgZXZlbnRzIGJyb2tlbiBvdXQgYnkgc3RhdHVzIHR5cGUuCisgIENvdW50ZXJNZXRyaWM8OjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlTdGF0dXNUeXBlPgorICAgICAgbUtleVN0YXR1c0NoYW5nZUNvdW50ZXI7CisgIC8vIENvdW50IG9mIGV2ZW50cyBicm9rZW4gb3V0IGJ5IGV2ZW50IHR5cGUKKyAgQ291bnRlck1ldHJpYzw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OkV2ZW50VHlwZT4gbUV2ZW50Q291bnRlcjsKKworICAvLyBDb3VudCBnZXRQcm9wZXJ0eUJ5dGVBcnJheSBjYWxscyB0byByZXRyaWV2ZSB0aGUgZGV2aWNlIHVuaXF1ZSBpZC4KKyAgQ291bnRlck1ldHJpYzxzdGF0dXNfdD4gbUdldERldmljZVVuaXF1ZUlkQ291bnRlcjsKKworICAvLyBBZGRzIGEgc2Vzc2lvbiBzdGFydCB0aW1lIHJlY29yZC4KKyAgdm9pZCBTZXRTZXNzaW9uU3RhcnQoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOworCisgIC8vIEFkZHMgYSBzZXNzaW9uIGVuZCB0aW1lIHJlY29yZC4KKyAgdm9pZCBTZXRTZXNzaW9uRW5kKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKTsKKworICAvLyBUaGUgYXBwIHBhY2thZ2UgbmFtZSBpcyB0aGUgYXBwbGljYXRpb24gcGFja2FnZSBuYW1lIHRoYXQgaXMgdXNpbmcgdGhlCisgIC8vIGluc3RhbmNlLiBUaGUgYXBwIHBhY2thZ2UgbmFtZSBpcyBoZWxkIGhlcmUgZm9yIGNvbnZlbmllbmNlLiBJdCBpcyBub3QKKyAgLy8gc2VyaWFsaXplZCBvciBleHBvcnRlZCB3aXRoIHRoZSBtZXRyaWNzLgorICB2b2lkIFNldEFwcFBhY2thZ2VOYW1lKGNvbnN0IFN0cmluZzgmIGFwcFBhY2thZ2VOYW1lKSB7IG1BcHBQYWNrYWdlTmFtZSA9IGFwcFBhY2thZ2VOYW1lOyB9CisgIGNvbnN0IFN0cmluZzgmIEdldEFwcFBhY2thZ2VOYW1lKCkgeyByZXR1cm4gbUFwcFBhY2thZ2VOYW1lOyB9CisKKyAgLy8gRXhwb3J0IHRoZSBtZXRyaWNzIHRvIGEgUGVyc2lzdGFibGVCdW5kbGUuCisgIHZvaWQgRXhwb3J0KG9zOjpQZXJzaXN0YWJsZUJ1bmRsZSogbWV0cmljc0J1bmRsZSk7CisKKyAgLy8gR2V0IHRoZSBzZXJpYWxpemVkIG1ldHJpY3MuIE1ldHJpY3MgYXJlIGZvcm1hdHRlZCBhcyBhIHNlcmlhbGl6ZWQKKyAgLy8gRHJtRnJhbWV3b3JrTWV0cmljcyBwcm90by4gSWYgdGhlcmUgaXMgYSBmYWlsdXJlIHNlcmlhbGl6aW5nIHRoZSBtZXRyaWNzLAorICAvLyB0aGlzIHJldHVybnMgYW4gZXJyb3IuIFRoZSBwYXJhbWV0ZXIgfHNlcmxpYWxpemVkTWV0cmljc3wgaXMgb3duZWQgYnkgdGhlCisgIC8vIGNhbGxlciBhbmQgbXVzdCBub3QgYmUgbnVsbC4KKyAgc3RhdHVzX3QgR2V0U2VyaWFsaXplZE1ldHJpY3Moc3RkOjpzdHJpbmcqIHNlcmlhbGl6ZWRNZXRyaWNzKTsKKworICAvLyBDb252ZXJ0cyB0aGUgRFJNIHBsdWdpbiBtZXRyaWNzIHRvIGEgUGVyc2lzdGFibGVCdW5kbGUuIEFsbCBvZiB0aGUgbWV0cmljcworICAvLyBmb3VuZCBpbiB8cGx1Z2luTWV0cmljc3wgYXJlIGFkZGVkIHRvIHRoZSB8bWV0cmljc0J1bmRsZXwgcGFyYW1ldGVyLgorICAvLyB8cGx1Z2luQnVuZGxlfCBpcyBvd25lZCBieSB0aGUgY2FsbGVyIGFuZCBtdXN0IG5vdCBiZSBudWxsLgorICAvLworICAvLyBFYWNoIGl0ZW0gaW4gdGhlIHBsdWdpbk1ldHJpY3MgdmVjdG9yIGlzIGFkZGVkIGFzIGEgbmV3IFBlcnNpc3RhYmxlQnVuZGxlLiBFLmcuCisgIC8vIERybU1ldHJpY0dyb3VwIHsKKyAgLy8gICBtZXRyaWNzWzBdIHsKKyAgLy8gICAgIG5hbWU6ICJidWZfY29weSIKKyAgLy8gICAgIGF0dHJpYnV0ZXNbMF0geworICAvLyAgICAgICBuYW1lOiAic2l6ZSIKKyAgLy8gICAgICAgdHlwZTogSU5UNjRfVFlQRQorICAvLyAgICAgICBpbnQ2NFZhbHVlOiAxMDI0CisgIC8vICAgICB9CisgIC8vICAgICB2YWx1ZXNbMF0geworICAvLyAgICAgICBjb21wb25lbnROYW1lOiAib3BlcmF0aW9uX2NvdW50IgorICAvLyAgICAgICB0eXBlOiBJTlQ2NF9UWVBFCisgIC8vICAgICAgIGludDY0VmFsdWU6IDc1CisgIC8vICAgICB9CisgIC8vICAgICB2YWx1ZXNbMV0geworICAvLyAgICAgICBjb21wb25lbnRfbmFtZTogImF2ZXJhZ2VfdGltZV9zZWNvbmRzIgorICAvLyAgICAgICB0eXBlOiBET1VCTEVfVFlQRQorICAvLyAgICAgICBkb3VibGVWYWx1ZTogMC4wMDAwMDA0MgorICAvLyAgICAgfQorICAvLyAgIH0KKyAgLy8gfQorICAvLworICAvLyBiZWNvbWVzCisgIC8vCisgIC8vIG1ldHJpY3NCdW5kbGUgeworICAvLyAgICIwIjogKFBlcnNpc3RhYmxlQnVuZGxlKSB7CisgIC8vICAgICAiYXR0cmlidXRlcyIgOiAoUGVyc2lzdGFibGVCdW5kbGUpIHsKKyAgLy8gICAgICAgInNpemUiIDogKGludDY0KSAxMDI0CisgIC8vICAgICB9CisgIC8vICAgICAib3BlcmF0aW9uX2NvdW50IiA6IChpbnQ2NCkgNzUKKyAgLy8gICAgICJhdmVyYWdlX3RpbWVfc2Vjb25kcyIgOiAoZG91YmxlKSAwLjAwMDAwMDQyCisgIC8vICAgfQorICAvLworICBzdGF0aWMgc3RhdHVzX3QgSGlkbE1ldHJpY3NUb0J1bmRsZSgKKyAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA+JiBwbHVnaW5NZXRyaWNzLAorICAgICAgICAgIG9zOjpQZXJzaXN0YWJsZUJ1bmRsZSogbWV0cmljc0J1bmRsZSk7CisKKyBwcm90ZWN0ZWQ6CisgIC8vIFRoaXMgaXMgdmlzaWJsZSBmb3IgdGVzdGluZyBvbmx5LgorICB2aXJ0dWFsIGludDY0X3QgR2V0Q3VycmVudFRpbWVNcygpOworCisgcHJpdmF0ZToKKyAgLy8gU2Vzc2lvbiBsaWZldGltZXMuIEEgcGFpciBvZiB2YWx1ZXMgcmVwcmVzZW50aW5nIHRoZSBtaWxsaXNlY29uZHMgc2luY2UKKyAgLy8gZXBvY2gsIFVUQy4gVGhlIGZpcnN0IHZhbHVlIGlzIHRoZSBzdGFydCB0aW1lLCB0aGUgc2Vjb25kIGlzIHRoZSBlbmQgdGltZS4KKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6cGFpcjxpbnQ2NF90LCBpbnQ2NF90Pj4gbVNlc3Npb25MaWZlc3BhbnM7CisKKyAgU3RyaW5nOCBtQXBwUGFja2FnZU5hbWU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIERSTV9NRVRSSUNTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0V2ZW50TWV0cmljLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0V2ZW50TWV0cmljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJiNzM2YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRXZlbnRNZXRyaWMuaApAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIEFORFJPSURfRVZFTlRfTUVUUklDX0hfCisjZGVmaW5lIEFORFJPSURfRVZFTlRfTUVUUklDX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBUaGlzIGlzIGEgc2ltcGxlIGhvbGRlciBmb3IgdGhlIHN0YXRpc3RpY3MgcmVjb3JkZWQgaW4gRXZlbnRNZXRyaWMuCitzdHJ1Y3QgRXZlbnRTdGF0aXN0aWNzIHsKKyAgLy8gVGhlIGNvdW50IG9mIHRpbWVzIHRoZSBldmVudCBvY2N1cnJlZC4KKyAgaW50NjRfdCBjb3VudDsKKworICAvLyBUaGUgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgcmVjb3JkZWQgaW4gdGhlIFJlY29yZCBtZXRob2QuCisgIGRvdWJsZSBtaW47CisgIGRvdWJsZSBtYXg7CisKKyAgLy8gVGhlIGF2ZXJhZ2UgKG1lYW4pIG9mIGFsbCB2YWx1ZXMgcmVjb3JkZWQuCisgIGRvdWJsZSBtZWFuOworICAvLyBUaGUgc3VtIG9mIHNxdWFyZWQgZGV2YXRpb24uIFZhcmlhbmNlIGNhbiBiZSBjYWxjdWxhdGVkIGZyb20KKyAgLy8gdGhpcyB2YWx1ZS4KKyAgLy8gICAgdmFyID0gc3VtX3NxdWFyZWRfZGV2aWF0aW9uIC8gY291bnQ7CisgIGRvdWJsZSBzdW1fc3F1YXJlZF9kZXZpYXRpb247Cit9OworCisvLyBUaGUgRXZlbnRNZXRyaWMgY2xhc3MgaXMgdXNlZCB0byBhY2N1bXVsYXRlIHN0YXRzIGFib3V0IGFuIGV2ZW50IG92ZXIgdGltZS4KKy8vIEEgY29tbW9uIHVzZSBjYXNlIGlzIHRvIHRyYWNrIGNsb2NrIHRpbWluZ3MgZm9yIGEgbWV0aG9kIGNhbGwgb3Igb3BlcmF0aW9uLgorLy8gQW4gRXZlbnRNZXRyaWMgY2FuIGJyZWFrIGRvd24gc3RhdHMgYnkgYSBkaW1lbnNpb24gc3BlY2lmaWVkIGJ5IHRoZQorLy8gYXBwbGljYXRpb24uIEUuZy4gYW4gYXBwbGljYXRpb24gbWF5IHdhbnQgdG8gdHJhY2sgY291bnRzIGJyb2tlbiBvdXQgYnkKKy8vIGVycm9yIGNvZGUgb3IgdGhlIHNpemUgb2Ygc29tZSBwYXJhbWV0ZXIuCisvLworLy8gRXhhbXBsZToKKy8vCisvLyAgIHN0cnVjdCBDIHsKKy8vICAgICBzdGF0dXNfdCBEb1dvcmsoKSB7CisvLyAgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0X3RpbWUgPSBub3coKTsKKy8vICAgICAgIHN0YXR1c190IHJlc3VsdDsKKy8vCisvLyAgICAgICAvLyBETyBXT1JLIGFuZCBkZXRlcm1pbmUgcmVzdWx0OworLy8KKy8vICAgICAgIHdvcmtfZXZlbnRfLlJlY29yZChub3coKSAtIHN0YXJ0X3RpbWUsIHJlc3VsdCk7CisvLworLy8gICAgICAgcmV0dXJuIHJlc3VsdDsKKy8vICAgICB9CisvLyAgICAgRXZlbnRNZXRyaWM8c3RhdHVzX3Q+IHdvcmtfZXZlbnRfOworLy8gICB9OworLy8KKy8vICAgQyBjOworLy8gICBjLkRvV29yaygpOworLy8KKy8vICAgc3RkOjptYXA8aW50LCBpbnQ2NF90PiB2YWx1ZXM7CisvLyAgIG1ldHJpYy5FeHBvcnRWYWx1ZXMoCisvLyAgICAgICBbJl0gKGludCBhdHRyaWJ1dGVfdmFsdWUsIGludDY0X3QgdmFsdWUpIHsKKy8vICAgICAgICAgICAgdmFsdWVzW2F0dHJpYnV0ZV92YWx1ZV0gPSB2YWx1ZTsKKy8vICAgICAgIH0pOworLy8gICAvLyBEbyBzb21ldGhpbmcgd2l0aCB0aGUgZXhwb3J0ZWQgc3RhdC4KKy8vCit0ZW1wbGF0ZTx0eXBlbmFtZSBBdHRyaWJ1dGVUeXBlPgorY2xhc3MgRXZlbnRNZXRyaWMgeworIHB1YmxpYzoKKyAgLy8gSW5zdGFudGlhdGUgdGhlIGNvdW50ZXIgd2l0aCB0aGUgZ2l2ZW4gbWV0cmljIG5hbWUgYW5kCisgIC8vIGF0dHJpYnV0ZSBuYW1lcy4gfGF0dHJpYnV0ZV9uYW1lc3wgbXVzdCBub3QgYmUgbnVsbC4KKyAgRXZlbnRNZXRyaWMoCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWV0cmljX25hbWUsCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXR0cmlidXRlX25hbWUpCisgICAgICAgICAgOiBtZXRyaWNfbmFtZV8obWV0cmljX25hbWUpLAorICAgICAgICAgICAgYXR0cmlidXRlX25hbWVfKGF0dHJpYnV0ZV9uYW1lKSB7fQorCisgIC8vIEluY3JlbWVudCB0aGUgY291bnQgb2YgdGltZXMgdGhlIG9wZXJhdGlvbiBvY2N1cnJlZCB3aXRoIHRoaXMKKyAgLy8gY29tYmluYXRpb24gb2YgYXR0cmlidXRlcy4KKyAgdm9pZCBSZWNvcmQoZG91YmxlIHZhbHVlLCBBdHRyaWJ1dGVUeXBlIGF0dHJpYnV0ZSkgeworICAgIGlmICh2YWx1ZXNfLmZpbmQoYXR0cmlidXRlKSAhPSB2YWx1ZXNfLmVuZCgpKSB7CisgICAgICBFdmVudFN0YXRpc3RpY3MqIHN0YXRzID0gdmFsdWVzX1thdHRyaWJ1dGVdLmdldCgpOworICAgICAgLy8gVXNpbmcgbWV0aG9kIG9mIHByb3Zpc2lvbmFsIG1lYW5zLgorICAgICAgZG91YmxlIGRldmlhdGlvbiA9IHZhbHVlIC0gc3RhdHMtPm1lYW47CisgICAgICBzdGF0cy0+bWVhbiA9IHN0YXRzLT5tZWFuICsgKGRldmlhdGlvbiAvIHN0YXRzLT5jb3VudCk7CisgICAgICBzdGF0cy0+c3VtX3NxdWFyZWRfZGV2aWF0aW9uID0KKyAgICAgICAgICBzdGF0cy0+c3VtX3NxdWFyZWRfZGV2aWF0aW9uICsgKGRldmlhdGlvbiAqICh2YWx1ZSAtIHN0YXRzLT5tZWFuKSk7CisgICAgICBzdGF0cy0+Y291bnQrKzsKKworICAgICAgc3RhdHMtPm1pbiA9IHN0YXRzLT5taW4gPCB2YWx1ZSA/IHN0YXRzLT5taW4gOiB2YWx1ZTsKKyAgICAgIHN0YXRzLT5tYXggPSBzdGF0cy0+bWF4ID4gdmFsdWUgPyBzdGF0cy0+bWF4IDogdmFsdWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxFdmVudFN0YXRpc3RpY3M+IHN0YXRzID0KKyAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEV2ZW50U3RhdGlzdGljcz4oKTsKKyAgICAgIHN0YXRzLT5jb3VudCA9IDE7CisgICAgICBzdGF0cy0+bWluID0gdmFsdWU7CisgICAgICBzdGF0cy0+bWF4ID0gdmFsdWU7CisgICAgICBzdGF0cy0+bWVhbiA9IHZhbHVlOworICAgICAgc3RhdHMtPnN1bV9zcXVhcmVkX2RldmlhdGlvbiA9IDA7CisgICAgICB2YWx1ZXNfW2F0dHJpYnV0ZV0gPSBzdGQ6Om1vdmUoc3RhdHMpOworICAgIH0KKyAgfTsKKworICAvLyBFeHBvcnQgdGhlIG1ldHJpY3MgdG8gdGhlIHByb3ZpZGVkIHxmdW5jdGlvbnwuIEVhY2ggdmFsdWUgZm9yIEF0dHJpYnV0ZQorICAvLyBoYXMgYSBzZXBhcmF0ZSBzZXQgb2Ygc3RhdHMuIEFzIHN1Y2gsIHxmdW5jdGlvbnwgd2lsbCBiZSBjYWxsZWQgb25jZSBwZXIKKyAgLy8gdmFsdWUgb2YgQXR0cmlidXRlLgorICB2b2lkIEV4cG9ydFZhbHVlcygKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCAoY29uc3QgQXR0cmlidXRlVHlwZSYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV2ZW50U3RhdGlzdGljcyYpPiBmdW5jdGlvbikgY29uc3QgeworICAgIGZvciAoYXV0byBpdCA9IHZhbHVlc18uYmVnaW4oKTsgaXQgIT0gdmFsdWVzXy5lbmQoKTsgaXQrKykgeworICAgICAgZnVuY3Rpb24oaXQtPmZpcnN0LCAqKGl0LT5zZWNvbmQpKTsKKyAgICB9CisgIH0KKworICBjb25zdCBzdGQ6OnN0cmluZyYgbWV0cmljX25hbWUoKSBjb25zdCB7IHJldHVybiBtZXRyaWNfbmFtZV87IH07CisKKyBwcml2YXRlOgorICBjb25zdCBzdGQ6OnN0cmluZyBtZXRyaWNfbmFtZV87CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGF0dHJpYnV0ZV9uYW1lXzsKKyAgc3RkOjptYXA8QXR0cmlidXRlVHlwZSwgc3RkOjp1bmlxdWVfcHRyPHN0cnVjdCBFdmVudFN0YXRpc3RpY3M+PiB2YWx1ZXNfOworfTsKKworLy8gVGhlIEV2ZW50VGltZXIgaXMgYSBzdXBwb3J0aW5nIGNsYXNzIGZvciBFdmVudE1ldHJpYyBpbnN0YW5jZXMgdGhhdCBhcmUgdXNlZAorLy8gdG8gdGltZSBtZXRob2RzLiBUaGUgRXZlbnRUaW1lciBzdGFydHMgYSB0aW1lciB3aGVuIGZpcnN0IGluIHNjb3BlLCBhbmQKKy8vIHJlY29yZHMgdGhlIHRpbWluZyB3aGVuIGV4aXRpbmcgc2NvcGUuCisvLworLy8gRXhhbXBsZToKKy8vCisvLyBFdmVudE1ldHJpYzxpbnQ+IG15X21ldHJpYzsKKy8vCisvLyB7CisvLyAgIEV2ZW50VGltZXI8aW50PiBteV90aW1lcigmbXlfbWV0cmljKTsKKy8vICAgLy8gU2V0IHRoZSBhdHRyaWJ1dGUgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyB0aW1pbmcuCisvLyAgIG15X3RpbWVyLlNldEF0dHJpYnR1ZSg0Mik7CisvLworLy8gICAvLyBEbyBzb21lIHdvcmsgdGhhdCB5b3Ugd2FudCB0byB0aW1lLgorLy8KKy8vIH0gIC8vIFRoZSBFdmVudFRpbWVyIGRlc3RydWN0b3Igd2lsbCByZWNvcmQgdGhlIHRoZSB0aW1pbmcgaW4gbXlfbWV0cmljOworLy8KK3RlbXBsYXRlPHR5cGVuYW1lIEF0dHJpYnV0ZVR5cGU+CitjbGFzcyBFdmVudFRpbWVyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEV2ZW50VGltZXIoRXZlbnRNZXRyaWM8QXR0cmlidXRlVHlwZT4qIG1ldHJpYykKKyAgICAgIDpzdGFydF90aW1lXyhzeXN0ZW1UaW1lKCkpLCBtZXRyaWNfKG1ldHJpYykgeworICB9CisKKyAgdmlydHVhbCB+RXZlbnRUaW1lcigpIHsKKyAgICBpZiAobWV0cmljXykgeworICAgICAgbWV0cmljXy0+UmVjb3JkKG5zMnVzKHN5c3RlbVRpbWUoKSAtIHN0YXJ0X3RpbWVfKSwgYXR0cmlidXRlXyk7CisgICAgfQorICB9CisKKyAgLy8gU2V0IHRoZSBhdHRyaWJ1dGUgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyB0aW1pbmcuIEUuZy4gdGhpcyBjYW4gYmUgdXNlZCB0bworICAvLyByZWNvcmQgdGhlIHJldHVybiBjb2RlIGZyb20gdGhlIHdvcmsgdGhhdCB3YXMgdGltZWQuCisgIHZvaWQgU2V0QXR0cmlidXRlKGNvbnN0IEF0dHJpYnV0ZVR5cGUmIGF0dHJpYnV0ZSkgeworICAgIGF0dHJpYnV0ZV8gPSBhdHRyaWJ1dGU7CisgIH0KKworIHByb3RlY3RlZDoKKyAgLy8gVmlzaWJsZSBmb3IgdGVzdGluZyBvbmx5LgorICBuc2Vjc190IHN0YXJ0X3RpbWVfOworCisgcHJpdmF0ZToKKyAgRXZlbnRNZXRyaWM8QXR0cmlidXRlVHlwZT4qIG1ldHJpY187CisgIEF0dHJpYnV0ZVR5cGUgYXR0cmlidXRlXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9FVkVOVF9NRVRSSUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSURybS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JRHJtLmgKaW5kZXggYTU3ZTM3Mi4uOGU5ZWIzYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JRHJtLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JRHJtLmgKQEAgLTE1LDkgKzE1LDExIEBACiAgKi8KIAogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BlcnNpc3RhYmxlQnVuZGxlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL2RybS9Ecm1BUEkuaD4KLSNpbmNsdWRlIDxtZWRpYS9JRHJtQ2xpZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vSURybUNsaWVudC5oPgogCiAjaWZuZGVmIEFORFJPSURfSURSTV9IXwogCkBAIC0zOSw3ICs0MSw4IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGRlc3Ryb3lQbHVnaW4oKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5TZXNzaW9uKFZlY3Rvcjx1aW50OF90PiAmc2Vzc2lvbklkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuU2Vzc2lvbihEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlMZXZlbCwKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmc2Vzc2lvbklkKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlU2Vzc2lvbihWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCkgPSAwOwogCkBAIC03MywxMCArNzYsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJndyYXBwZWRLZXkpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4gPiAmc2VjdXJlU3RvcHMpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4gPiAmc2VjdXJlU3RvcElkcykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzaWQsIFZlY3Rvcjx1aW50OF90PiAmc2VjdXJlU3RvcCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlU2VjdXJlU3RvcHMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzc1JlbGVhc2UpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBbGxTZWN1cmVTdG9wcygpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVNlY3VyZVN0b3AoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzc2lkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVBbGxTZWN1cmVTdG9wcygpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SGRjcExldmVscyhEcm1QbHVnaW46OkhkY3BMZXZlbCAqY29ubmVjdGVkTGV2ZWwsCisgICAgICAgICAgICBEcm1QbHVnaW46OkhkY3BMZXZlbCAqbWF4TGV2ZWwpCisgICAgICAgICAgICBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROdW1iZXJPZlNlc3Npb25zKHVpbnQzMl90ICpjdXJyZW50U2Vzc2lvbnMsCisgICAgICAgICAgICB1aW50MzJfdCAqbWF4U2Vzc2lvbnMpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyaXR5TGV2ZWwoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCisgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgKmxldmVsKSBjb25zdCA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggJnZhbHVlKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0ICZuYW1lLApAQCAtODYsNiArOTksOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCAmbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmdmFsdWUpIGNvbnN0ID0gMDsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0cmljcyhvczo6UGVyc2lzdGFibGVCdW5kbGUgKm1ldHJpY3MpID0gMDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2lwaGVyQWxnb3JpdGhtKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJmFsZ29yaXRobSkgPSAwOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lIRENQLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lIRENQLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MjU2MWUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JSERDUC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IRENQQVBJLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgSUhEQ1BPYnNlcnZlciA6IHB1YmxpYyBJSW50ZXJmYWNlIHsKLSAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKEhEQ1BPYnNlcnZlcik7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KAotICAgICAgICAgICAgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikgPSAwOwotCi1wcml2YXRlOgotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKElIRENQT2JzZXJ2ZXIpOwotfTsKLQotc3RydWN0IElIRENQIDogcHVibGljIElJbnRlcmZhY2UgewotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoSERDUCk7Ci0KLSAgICAvLyBDYWxsZWQgdG8gc3BlY2lmeSB0aGUgb2JzZXJ2ZXIgdGhhdCByZWNlaXZlcyBhc3luY2hyb25vdXMgbm90aWZpY2F0aW9ucwotICAgIC8vIGZyb20gdGhlIEhEQ1AgaW1wbGVtZW50YXRpb24gdG8gc2lnbmFsIGNvbXBsZXRpb24vZmFpbHVyZSBvZiBhc3luY2hyb25vdXMKLSAgICAvLyBvcGVyYXRpb25zIChzdWNoIGFzIGluaXRpYWxpemF0aW9uKSBvciBvdXQgb2YgYmFuZCBldmVudHMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPYnNlcnZlcihjb25zdCBzcDxJSERDUE9ic2VydmVyPiAmb2JzZXJ2ZXIpID0gMDsKLQotICAgIC8vIFJlcXVlc3QgdG8gc2V0dXAgYW4gSERDUCBzZXNzaW9uIHdpdGggdGhlIHNwZWNpZmllZCBob3N0IGxpc3RlbmluZwotICAgIC8vIG9uIHRoZSBzcGVjaWZpZWQgcG9ydC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRBc3luYyhjb25zdCBjaGFyICpob3N0LCB1bnNpZ25lZCBwb3J0KSA9IDA7Ci0KLSAgICAvLyBSZXF1ZXN0IHRvIHNodXRkb3duIHRoZSBhY3RpdmUgSERDUCBzZXNzaW9uLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2h1dGRvd25Bc3luYygpID0gMDsKLQotICAgIC8vIFJldHVybnMgdGhlIGNhcGFiaWxpdHkgYml0bWFzayBvZiB0aGlzIEhEQ1Agc2Vzc2lvbi4KLSAgICAvLyBQb3NzaWJsZSByZXR1cm4gdmFsdWVzIChwbGVhc2UgcmVmZXIgdG8gSERDQVBBUEkuaCk6Ci0gICAgLy8gICBIRENQX0NBUFNfRU5DUllQVDogbWFuZGF0b3J5LCBtZWFuaW5nIHRoZSBIRENQIG1vZHVsZSBjYW4gZW5jcnlwdAotICAgIC8vICAgZnJvbSBhbiBpbnB1dCBieXRlLWFycmF5IGJ1ZmZlciB0byBhbiBvdXRwdXQgYnl0ZS1hcnJheSBidWZmZXIKLSAgICAvLyAgIEhEQ1BfQ0FQU19FTkNSWVBUX05BVElWRTogdGhlIEhEQ1AgbW9kdWxlIHN1cHBvcnRzIGVuY3J5cHRpb24gZnJvbQotICAgIC8vICAgYSBuYXRpdmUgYnVmZmVyIHRvIGFuIG91dHB1dCBieXRlLWFycmF5IGJ1ZmZlci4gVGhlIGZvcm1hdCBvZiB0aGUKLSAgICAvLyAgIGlucHV0IG5hdGl2ZSBidWZmZXIgaXMgc3BlY2lmaWMgdG8gdmVuZG9yJ3MgZW5jb2RlciBpbXBsZW1lbnRhdGlvbi4KLSAgICAvLyAgIEl0IGlzIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGF0IHVzZWQgYnkgdGhlIGVuY29kZXIgd2hlbgotICAgIC8vICAgInN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMiIGV4dGVuc2lvbiBpcyBlbmFibGVkIG9uIGl0cyBvdXRwdXQgcG9ydC4KLSAgICB2aXJ0dWFsIHVpbnQzMl90IGdldENhcHMoKSA9IDA7Ci0KLSAgICAvLyBFTkNSWVBUSU9OIG9ubHk6Ci0gICAgLy8gRW5jcnlwdCBkYXRhIGFjY29yZGluZyB0byB0aGUgSERDUCBzcGVjLiAic2l6ZSIgYnl0ZXMgb2YgZGF0YSBhcmUKLSAgICAvLyBhdmFpbGFibGUgYXQgImluRGF0YSIgKHZpcnR1YWwgYWRkcmVzcyksICJzaXplIiBtYXkgbm90IGJlIGEgbXVsdGlwbGUKLSAgICAvLyBvZiAxMjggYml0cyAoMTYgYnl0ZXMpLiBBbiBlcXVhbCBudW1iZXIgb2YgZW5jcnlwdGVkIGJ5dGVzIHNob3VsZCBiZQotICAgIC8vIHdyaXR0ZW4gdG8gdGhlIGJ1ZmZlciBhdCAib3V0RGF0YSIgKHZpcnR1YWwgYWRkcmVzcykuCi0gICAgLy8gVGhpcyBvcGVyYXRpb24gaXMgdG8gYmUgc3luY2hyb25vdXMsIGkuZS4gdGhpcyBjYWxsIGRvZXMgbm90IHJldHVybgotICAgIC8vIHVudGlsIG91dERhdGEgY29udGFpbnMgc2l6ZSBieXRlcyBvZiBlbmNyeXB0ZWQgZGF0YS4KLSAgICAvLyBzdHJlYW1DVFIgd2lsbCBiZSBhc3NpZ25lZCBieSB0aGUgY2FsbGVyICh0byAwIGZvciB0aGUgZmlyc3QgUEVTIHN0cmVhbSwKLSAgICAvLyAxIGZvciB0aGUgc2Vjb25kIGFuZCBzbyBvbikKLSAgICAvLyBpbnB1dENUUiBfd2lsbF9iZV9tYWludGFpbmVkX2J5X3RoZV9jYWxsZWVfIGZvciBlYWNoIFBFUyBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBlbmNyeXB0KAotICAgICAgICAgICAgY29uc3Qgdm9pZCAqaW5EYXRhLCBzaXplX3Qgc2l6ZSwgdWludDMyX3Qgc3RyZWFtQ1RSLAotICAgICAgICAgICAgdWludDY0X3QgKm91dElucHV0Q1RSLCB2b2lkICpvdXREYXRhKSA9IDA7Ci0KLSAgICAvLyBFbmNyeXB0IGRhdGEgYWNjb3JkaW5nIHRvIHRoZSBIRENQIHNwZWMuICJzaXplIiBieXRlcyBvZiBkYXRhIHN0YXJ0aW5nCi0gICAgLy8gYXQgbG9jYXRpb24gIm9mZnNldCIgYXJlIGF2YWlsYWJsZSBpbiAiYnVmZmVyIiAoYnVmZmVyIGhhbmRsZSkuICJzaXplIgotICAgIC8vIG1heSBub3QgYmUgYSBtdWx0aXBsZSBvZiAxMjggYml0cyAoMTYgYnl0ZXMpLiBBbiBlcXVhbCBudW1iZXIgb2YKLSAgICAvLyBlbmNyeXB0ZWQgYnl0ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gdGhlIGJ1ZmZlciBhdCAib3V0RGF0YSIgKHZpcnR1YWwKLSAgICAvLyBhZGRyZXNzKS4gVGhpcyBvcGVyYXRpb24gaXMgdG8gYmUgc3luY2hyb25vdXMsIGkuZS4gdGhpcyBjYWxsIGRvZXMgbm90Ci0gICAgLy8gcmV0dXJuIHVudGlsIG91dERhdGEgY29udGFpbnMgc2l6ZSBieXRlcyBvZiBlbmNyeXB0ZWQgZGF0YS4KLSAgICAvLyBzdHJlYW1DVFIgd2lsbCBiZSBhc3NpZ25lZCBieSB0aGUgY2FsbGVyICh0byAwIGZvciB0aGUgZmlyc3QgUEVTIHN0cmVhbSwKLSAgICAvLyAxIGZvciB0aGUgc2Vjb25kIGFuZCBzbyBvbikKLSAgICAvLyBpbnB1dENUUiBfd2lsbF9iZV9tYWludGFpbmVkX2J5X3RoZV9jYWxsZWVfIGZvciBlYWNoIFBFUyBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBlbmNyeXB0TmF0aXZlKAotICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmdyYXBoaWNCdWZmZXIsCi0gICAgICAgICAgICBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgdWludDMyX3Qgc3RyZWFtQ1RSLAotICAgICAgICAgICAgdWludDY0X3QgKm91dElucHV0Q1RSLCB2b2lkICpvdXREYXRhKSA9IDA7Ci0KLSAgICAvLyBERUNSWVBUSU9OIG9ubHk6Ci0gICAgLy8gRGVjcnlwdCBkYXRhIGFjY29yZGluZyB0byB0aGUgSERDUCBzcGVjLgotICAgIC8vICJzaXplIiBieXRlcyBvZiBlbmNyeXB0ZWQgZGF0YSBhcmUgYXZhaWxhYmxlIGF0ICJpbkRhdGEiCi0gICAgLy8gKHZpcnR1YWwgYWRkcmVzcyksICJzaXplIiBtYXkgbm90IGJlIGEgbXVsdGlwbGUgb2YgMTI4IGJpdHMgKDE2IGJ5dGVzKS4KLSAgICAvLyBBbiBlcXVhbCBudW1iZXIgb2YgZGVjcnlwdGVkIGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIHRvIHRoZSBidWZmZXIKLSAgICAvLyBhdCAib3V0RGF0YSIgKHZpcnR1YWwgYWRkcmVzcykuCi0gICAgLy8gVGhpcyBvcGVyYXRpb24gaXMgdG8gYmUgc3luY2hyb25vdXMsIGkuZS4gdGhpcyBjYWxsIGRvZXMgbm90IHJldHVybgotICAgIC8vIHVudGlsIG91dERhdGEgY29udGFpbnMgc2l6ZSBieXRlcyBvZiBkZWNyeXB0ZWQgZGF0YS4KLSAgICAvLyBCb3RoIHN0cmVhbUNUUiBhbmQgaW5wdXRDVFIgd2lsbCBiZSBwcm92aWRlZCBieSB0aGUgY2FsbGVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdCgKLSAgICAgICAgICAgIGNvbnN0IHZvaWQgKmluRGF0YSwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICB1aW50MzJfdCBzdHJlYW1DVFIsIHVpbnQ2NF90IGlucHV0Q1RSLAotICAgICAgICAgICAgdm9pZCAqb3V0RGF0YSkgPSAwOwotCi1wcml2YXRlOgotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKElIRENQKTsKLX07Ci0KLXN0cnVjdCBCbkhEQ1BPYnNlcnZlciA6IHB1YmxpYyBCbkludGVyZmFjZTxJSERDUE9ic2VydmVyPiB7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KAotICAgICAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsICZkYXRhLCBQYXJjZWwgKnJlcGx5LAotICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLX07Ci0KLXN0cnVjdCBCbkhEQ1AgOiBwdWJsaWMgQm5JbnRlcmZhY2U8SUhEQ1A+IHsKLSAgICB2aXJ0dWFsIHN0YXR1c190IG9uVHJhbnNhY3QoCi0gICAgICAgICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwgJmRhdGEsIFBhcmNlbCAqcmVwbHksCi0gICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUNvZGVjU2VydmljZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFDb2RlY1NlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlmYjFjMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUNvZGVjU2VydmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9JTUVESUFDT0RFQ1NFUlZJQ0VfSAotI2RlZmluZSBBTkRST0lEX0lNRURJQUNPREVDU0VSVklDRV9ICi0KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPG1lZGlhL0lEYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgotI2luY2x1ZGUgPG1lZGlhL0lPTVhTdG9yZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIElNZWRpYUNvZGVjU2VydmljZTogcHVibGljIElJbnRlcmZhY2UKLXsKLXB1YmxpYzoKLSAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKE1lZGlhQ29kZWNTZXJ2aWNlKTsKLQotICAgIHZpcnR1YWwgc3A8SU9NWD4gZ2V0T01YKCkgPSAwOwotICAgIHZpcnR1YWwgc3A8SU9NWFN0b3JlPiBnZXRPTVhTdG9yZSgpID0gMDsKLX07Ci0KLWNsYXNzIEJuTWVkaWFDb2RlY1NlcnZpY2U6IHB1YmxpYyBCbkludGVyZmFjZTxJTWVkaWFDb2RlY1NlcnZpY2U+Ci17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLX07Ci0KLX0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFORFJPSURfSU1FRElBQ09ERUNTRVJWSUNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUV4dHJhY3Rvci5oCmluZGV4IDBhYzc2NzMuLjc1ZTRlZTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFFeHRyYWN0b3IuaApAQCAtMTgsOCArMTgsOCBAQAogCiAjZGVmaW5lIElNRURJQV9FWFRSQUNUT1JfQkFTRV9IXwogCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTYwLDE2ICs2MCw5IEBACiAgICAgLy8gQ0FOX1NFRUtfQkFDS1dBUkQgfCBDQU5fU0VFS19GT1JXQVJEIHwgQ0FOX1NFRUsgfCBDQU5fUEFVU0UKICAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3QgPSAwOwogCi0gICAgLy8gZm9yIERSTQotICAgIHZpcnR1YWwgY2hhciogZ2V0RHJtVHJhY2tJbmZvKHNpemVfdCB0cmFja0lELCBpbnQgKmxlbikgID0gMDsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgSEludGVyZmFjZVRva2VuICZjYXNUb2tlbikgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkIHNldFVJRCh1aWRfdCB1aWQpICA9IDA7Ci0KICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSA9IDA7CiB9OwogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaAppbmRleCAyYTYzZWI3Li4wZmI2YmIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUhUVFBDb25uZWN0aW9uLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5oCkBAIC0xOSwxNiArMTksMTUgQEAKICNkZWZpbmUgSV9NRURJQV9IVFRQX0NPTk5FQ1RJT05fSF8KIAogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBJTWVkaWFIVFRQQ29ubmVjdGlvbjsKLQogLyoqIE1VU1Qgc3RheSBpbiBzeW5jIHdpdGggSU1lZGlhSFRUUENvbm5lY3Rpb24uYWlkbCAqLwogCi1zdHJ1Y3QgSU1lZGlhSFRUUENvbm5lY3Rpb24gOiBwdWJsaWMgSUludGVyZmFjZSB7CitzdHJ1Y3QgSU1lZGlhSFRUUENvbm5lY3Rpb24gOiBwdWJsaWMgTWVkaWFIVFRQQ29ubmVjdGlvbiwgcHVibGljIElJbnRlcmZhY2UgewogICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoTWVkaWFIVFRQQ29ubmVjdGlvbik7CiAKICAgICB2aXJ0dWFsIGJvb2wgY29ubmVjdCgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaAppbmRleCBmNjZkNmM4Li5lOTQ4Yjc4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oCkBAIC0xOSwxOCArMTksMTkgQEAKICNkZWZpbmUgSV9NRURJQV9IVFRQX1NFUlZJQ0VfSF8KIAogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgSU1lZGlhSFRUUENvbm5lY3Rpb247CitzdHJ1Y3QgTWVkaWFIVFRQQ29ubmVjdGlvbjsKIAogLyoqIE1VU1Qgc3RheSBpbiBzeW5jIHdpdGggSU1lZGlhSFRUUFNlcnZpY2UuYWlkbCAqLwogCi1zdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2UgOiBwdWJsaWMgSUludGVyZmFjZSB7CitzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2UgOiBwdWJsaWMgTWVkaWFIVFRQU2VydmljZSwgcHVibGljIElJbnRlcmZhY2UgewogICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoTWVkaWFIVFRQU2VydmljZSk7CiAKLSAgICB2aXJ0dWFsIHNwPElNZWRpYUhUVFBDb25uZWN0aW9uPiBtYWtlSFRUUENvbm5lY3Rpb24oKSA9IDA7CisgICAgdmlydHVhbCBzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiBtYWtlSFRUUENvbm5lY3Rpb24oKSA9IDA7CiAKIHByaXZhdGU6CiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSU1lZGlhSFRUUFNlcnZpY2UpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oCmluZGV4IGVhOTUxNjEuLmM2ZjQyMmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmgKQEAgLTQ0LDYgKzQ0LDEzIEBACiAgICAgICAgICAgICBjb25zdCBzcDxJRGF0YVNvdXJjZT4mIGRhdGFTb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpID0gMDsKICAgICB2aXJ0dWFsIHNwPElNZW1vcnk+ICAgICBnZXRGcmFtZUF0VGltZSgKICAgICAgICAgICAgIGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uLCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHkpID0gMDsKKyAgICB2aXJ0dWFsIHNwPElNZW1vcnk+ICAgICBnZXRJbWFnZUF0SW5kZXgoCisgICAgICAgICAgICBpbnQgaW5kZXgsIGludCBjb2xvckZvcm1hdCwgYm9vbCBtZXRhT25seSwgYm9vbCB0aHVtYm5haWwpID0gMDsKKyAgICB2aXJ0dWFsIHNwPElNZW1vcnk+ICAgICBnZXRJbWFnZVJlY3RBdEluZGV4KAorICAgICAgICAgICAgaW50IGluZGV4LCBpbnQgY29sb3JGb3JtYXQsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRGcmFtZUF0SW5kZXgoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzcDxJTWVtb3J5PiA+ICpmcmFtZXMsCisgICAgICAgICAgICBpbnQgZnJhbWVJbmRleCwgaW50IG51bUZyYW1lcywgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5KSA9IDA7CiAgICAgdmlydHVhbCBzcDxJTWVtb3J5PiAgICAgZXh0cmFjdEFsYnVtQXJ0KCkgPSAwOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciogICAgIGV4dHJhY3RNZXRhZGF0YShpbnQga2V5Q29kZSkgPSAwOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oCmluZGV4IGU1YTk4ZGQuLjk3YTk5OGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaApAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL1ZvbHVtZVNoYXBlci5oPgogCiAvLyBGd2QgZGVjbCB0byBtYWtlIHN1cmUgZXZlcnlvbmUgYWdyZWVzIHRoYXQgdGhlIHNjb3BlIG9mIHN0cnVjdCBzb2NrYWRkcl9pbiBpcwpAQCAtNDIsNyArNDIsNyBAQAogc3RydWN0IEFWU3luY1NldHRpbmdzOwogc3RydWN0IEJ1ZmZlcmluZ1NldHRpbmdzOwogCi10eXBlZGVmIElNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlIE1lZGlhUGxheWVyU2Vla01vZGU7Cit0eXBlZGVmIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgTWVkaWFQbGF5ZXJTZWVrTW9kZTsKIAogY2xhc3MgSU1lZGlhUGxheWVyOiBwdWJsaWMgSUludGVyZmFjZQogewpAQCAtNjEsNyArNjEsNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SURhdGFTb3VyY2U+JiBzb3VyY2UpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJ1ZmZlclByb2R1Y2VyKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0RGVmYXVsdEJ1ZmZlcmluZ1NldHRpbmdzKAorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldEJ1ZmZlcmluZ1NldHRpbmdzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHByZXBhcmVBc3luYygpID0gMDsKQEAgLTc5LDYgKzc5LDcgQEAKICAgICAgICAgICAgIE1lZGlhUGxheWVyU2Vla01vZGUgbW9kZSA9IE1lZGlhUGxheWVyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldEN1cnJlbnRQb3NpdGlvbihpbnQqIG1zZWMpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXREdXJhdGlvbihpbnQqIG1zZWMpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBub3RpZnlBdChpbnQ2NF90IG1lZGlhVGltZVVzKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgcmVzZXQoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3QgdHlwZSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldExvb3BpbmcoaW50IGxvb3ApID0gMDsKQEAgLTkxLDEwICs5MiwxMCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldFJldHJhbnNtaXRFbmRwb2ludChzdHJ1Y3Qgc29ja2FkZHJfaW4qIGVuZHBvaW50KSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0TmV4dFBsYXllcihjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiBuZXh0KSA9IDA7CiAKLSAgICB2aXJ0dWFsIFZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKSA9IDA7Ci0gICAgdmlydHVhbCBzcDxWb2x1bWVTaGFwZXI6OlN0YXRlPiBnZXRWb2x1bWVTaGFwZXJTdGF0ZShpbnQgaWQpID0gMDsKKyAgICB2aXJ0dWFsIG1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXR1cyBhcHBseVZvbHVtZVNoYXBlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKSA9IDA7CisgICAgdmlydHVhbCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gZ2V0Vm9sdW1lU2hhcGVyU3RhdGUoaW50IGlkKSA9IDA7CiAKICAgICAvLyBNb2R1bGFyIERSTQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHByZXBhcmVEcm0oY29uc3QgdWludDhfdCB1dWlkWzE2XSwKQEAgLTEzMCw2ICsxMzEsMTEgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRNZXRhZGF0YShib29sIHVwZGF0ZV9vbmx5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXBwbHlfZmlsdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCAqbWV0YWRhdGEpID0gMDsKKworICAgIC8vIEF1ZGlvUm91dGluZworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqZGV2aWNlSWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCkgPSAwOwogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaAppbmRleCBmMjFiYjNhLi4yMTdkZTE0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaApAQCAtMzEsNyArMzEsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBJSERDUDsKIGNsYXNzIElNZWRpYUNvZGVjTGlzdDsKIHN0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIGNsYXNzIElNZWRpYVJlY29yZGVyOwpAQCAtNDksOCArNDgsNiBAQAogICAgIHZpcnR1YWwgc3A8SU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI+IGNyZWF0ZU1ldGFkYXRhUmV0cmlldmVyKCkgPSAwOwogICAgIHZpcnR1YWwgc3A8SU1lZGlhUGxheWVyPiBjcmVhdGUoY29uc3Qgc3A8SU1lZGlhUGxheWVyQ2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSkgPSAwOwotICAgIHZpcnR1YWwgc3A8SU9NWD4gICAgICAgICAgICBnZXRPTVgoKSA9IDA7Ci0gICAgdmlydHVhbCBzcDxJSERDUD4gICAgICAgICAgIG1ha2VIRENQKGJvb2wgY3JlYXRlRW5jcnlwdGlvbk1vZHVsZSkgPSAwOwogICAgIHZpcnR1YWwgc3A8SU1lZGlhQ29kZWNMaXN0PiBnZXRDb2RlY0xpc3QoKSBjb25zdCA9IDA7CiAKICAgICAvLyBDb25uZWN0cyB0byBhIHJlbW90ZSBkaXNwbGF5LgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oCmluZGV4IDlkMDM0MWEuLjM3OTAwMGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyLmgKQEAgLTE5LDYgKzE5LDkgQEAKICNkZWZpbmUgQU5EUk9JRF9JTUVESUFSRUNPUkRFUl9ICiAKICNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01pY3JvcGhvbmVJbmZvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTY0LDYgKzY3LDEzIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlKCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SW5wdXRTdXJmYWNlKGNvbnN0IHNwPFBlcnNpc3RlbnRTdXJmYWNlPiYgc3VyZmFjZSkgPSAwOwogICAgIHZpcnR1YWwgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcXVlcnlTdXJmYWNlTWVkaWFTb3VyY2UoKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldElucHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJvdXRlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmRldmljZUlkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcykgPSAwOworCiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFTb3VyY2UuaAppbmRleCAyYmRlNzgyLi43YTRiMWI5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhU291cmNlLmgKQEAgLTIyLDEzICsyMiwxMiBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBNZWRpYVNvdXJjZTsKLWNsYXNzIE1ldGFEYXRhOwogY2xhc3MgTWVkaWFCdWZmZXJHcm91cDsKIAogY2xhc3MgSU1lZGlhU291cmNlIDogcHVibGljIElJbnRlcmZhY2UgewpAQCAtNTUsNTEgKzU0LDYgQEAKICAgICAvLyBSZXR1cm5zIHRoZSBmb3JtYXQgb2YgdGhlIGRhdGEgb3V0cHV0IGJ5IHRoaXMgbWVkaWEgc291cmNlLgogICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpID0gMDsKIAotICAgIC8vIE9wdGlvbnMgdGhhdCBtb2RpZnkgcmVhZCgpIGJlaGF2aW91ci4gVGhlIGRlZmF1bHQgaXMgdG8KLSAgICAvLyBhKSBub3QgcmVxdWVzdCBhIHNlZWsKLSAgICAvLyBiKSBub3QgYmUgbGF0ZSwgaS5lLiBsYXRlbmVzc191cyA9IDAKLSAgICBzdHJ1Y3QgUmVhZE9wdGlvbnMgewotICAgICAgICBlbnVtIFNlZWtNb2RlIDogaW50MzJfdCB7Ci0gICAgICAgICAgICBTRUVLX1BSRVZJT1VTX1NZTkMsCi0gICAgICAgICAgICBTRUVLX05FWFRfU1lOQywKLSAgICAgICAgICAgIFNFRUtfQ0xPU0VTVF9TWU5DLAotICAgICAgICAgICAgU0VFS19DTE9TRVNULAotICAgICAgICB9OwotCi0gICAgICAgIFJlYWRPcHRpb25zKCk7Ci0KLSAgICAgICAgLy8gUmVzZXQgZXZlcnl0aGluZyBiYWNrIHRvIGRlZmF1bHRzLgotICAgICAgICB2b2lkIHJlc2V0KCk7Ci0KLSAgICAgICAgdm9pZCBzZXRTZWVrVG8oaW50NjRfdCB0aW1lX3VzLCBTZWVrTW9kZSBtb2RlID0gU0VFS19DTE9TRVNUX1NZTkMpOwotICAgICAgICB2b2lkIGNsZWFyU2Vla1RvKCk7Ci0gICAgICAgIGJvb2wgZ2V0U2Vla1RvKGludDY0X3QgKnRpbWVfdXMsIFNlZWtNb2RlICptb2RlKSBjb25zdDsKLQotICAgICAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBpZiB1bnVzZWQuCi0gICAgICAgIHZvaWQgc2V0TGF0ZUJ5KGludDY0X3QgbGF0ZW5lc3NfdXMpOwotICAgICAgICBpbnQ2NF90IGdldExhdGVCeSgpIGNvbnN0OwotCi0gICAgICAgIHZvaWQgc2V0Tm9uQmxvY2tpbmcoKTsKLSAgICAgICAgdm9pZCBjbGVhck5vbkJsb2NraW5nKCk7Ci0gICAgICAgIGJvb2wgZ2V0Tm9uQmxvY2tpbmcoKSBjb25zdDsKLQotICAgICAgICAvLyBVc2VkIHRvIGNsZWFyIGFsbCBub24tcGVyc2lzdGVudCBvcHRpb25zIGZvciBtdWx0aXBsZSBidWZmZXIgcmVhZHMuCi0gICAgICAgIHZvaWQgY2xlYXJOb25QZXJzaXN0ZW50KCkgewotICAgICAgICAgICAgY2xlYXJTZWVrVG8oKTsKLSAgICAgICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgZW51bSBPcHRpb25zIHsKLSAgICAgICAgICAgIGtTZWVrVG9fT3B0aW9uICAgICAgPSAxLAotICAgICAgICB9OwotCi0gICAgICAgIHVpbnQzMl90IG1PcHRpb25zOwotICAgICAgICBpbnQ2NF90IG1TZWVrVGltZVVzOwotICAgICAgICBTZWVrTW9kZSBtU2Vla01vZGU7Ci0gICAgICAgIGludDY0X3QgbUxhdGVuZXNzVXM7Ci0gICAgICAgIGJvb2wgbU5vbkJsb2NraW5nOwotICAgIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7IC8vIHNlbnQgdGhyb3VnaCBCaW5kZXIKLQogICAgIC8vIFJldHVybnMgYSBuZXcgYnVmZmVyIG9mIGRhdGEuIENhbGwgYmxvY2tzIHVudGlsIGEKICAgICAvLyBidWZmZXIgaXMgYXZhaWxhYmxlLCBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZCBvciB0aGUgZW5kIG9mIHRoZSBzdHJlYW0KICAgICAvLyBpcyByZWFjaGVkLgpAQCAtMTEwLDcgKzY0LDggQEAKICAgICAvLwogICAgIC8vIFRPRE86IGNvbnNpZGVyIHJlbW92aW5nIHJlYWQoKSBpbiBmYXZvciBvZiByZWFkTXVsdGlwbGUoKS4KICAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKSA9IDA7CisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsCisgICAgICAgICAgICBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKSA9IDA7CiAKICAgICAvLyBSZXR1cm5zIGEgdmVjdG9yIG9mIG5ldyBidWZmZXJzIG9mIGRhdGEsIHdoZXJlIHRoZSBuZXcgYnVmZmVycyBhcmUgYWRkZWQKICAgICAvLyB0byB0aGUgZW5kIG9mIHRoZSB2ZWN0b3IuCkBAIC0xMjUsOCArODAsOCBAQAogICAgIC8vIFJlYWRPcHRpb25zIG1heSBiZSBzcGVjaWZpZWQuIFBlcnNpc3RlbnQgb3B0aW9ucyBhcHBseSB0byBhbGwgcmVhZHM7CiAgICAgLy8gbm9uLXBlcnNpc3RlbnQgb3B0aW9ucyAoZS5nLiBzZWVrKSBhcHBseSBvbmx5IHRvIHRoZSBmaXJzdCByZWFkLgogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZE11bHRpcGxlKAotICAgICAgICAgICAgVmVjdG9yPE1lZGlhQnVmZmVyICo+ICpidWZmZXJzLCB1aW50MzJfdCBtYXhOdW1CdWZmZXJzID0gMSwKLSAgICAgICAgICAgIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gbnVsbHB0cikgPSAwOworICAgICAgICAgICAgVmVjdG9yPE1lZGlhQnVmZmVyQmFzZSAqPiAqYnVmZmVycywgdWludDMyX3QgbWF4TnVtQnVmZmVycyA9IDEsCisgICAgICAgICAgICBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBudWxscHRyKSA9IDA7CiAKICAgICAvLyBSZXR1cm5zIHRydWUgaWYgfHJlYWRNdWx0aXBsZXwgaXMgc3VwcG9ydGVkLCBvdGhlcndpc2UgZmFsc2UuCiAgICAgdmlydHVhbCBib29sIHN1cHBvcnRSZWFkTXVsdGlwbGUoKSA9IDA7CkBAIC0xMzksMTQgKzk0LDYgQEAKICAgICAvLyB1bnRpbCBhIHN1YnNlcXVlbnQgcmVhZC13aXRoLXNlZWsuIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCBieQogICAgIC8vIE9NWENvZGVjLgogICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKSAgPSAwOwotCi0gICAgLy8gVGhlIGNvbnN1bWVyIG9mIHRoaXMgbWVkaWEgc291cmNlIHJlcXVlc3RzIHRoYXQgdGhlIGdpdmVuIGJ1ZmZlcnMKLSAgICAvLyBhcmUgdG8gYmUgcmV0dXJuZWQgZXhjbHVzaXZlbHkgaW4gcmVzcG9uc2UgdG8gcmVhZCBjYWxscy4KLSAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBzdGFydCgpIGFuZCBiZWZvcmUgdGhlCi0gICAgLy8gZmlyc3QgcmVhZCgpIGNhbGwuCi0gICAgLy8gQ2FsbGVlIGFzc3VtZXMgb3duZXJzaGlwIG9mIHRoZSBidWZmZXJzIGlmIG5vIGVycm9yIGlzIHJldHVybmVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVycyhjb25zdCBWZWN0b3I8TWVkaWFCdWZmZXIgKj4gJiAvKiBidWZmZXJzICovKSA9IDA7Ci0KIH07CiAKIGNsYXNzIEJuTWVkaWFTb3VyY2U6IHB1YmxpYyBCbkludGVyZmFjZTxJTWVkaWFTb3VyY2U+CkBAIC0xNjEsMTQgKzEwOCwxMCBAQAogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJzKGNvbnN0IFZlY3RvcjxNZWRpYUJ1ZmZlciAqPiAmIC8qIGJ1ZmZlcnMgKi8pIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQogICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIGZvciBsb2NhbCBtZWRpYSBzb3VyY2VzLgogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZE11bHRpcGxlKAotICAgICAgICAgICAgVmVjdG9yPE1lZGlhQnVmZmVyICo+ICogLyogYnVmZmVycyAqLywgdWludDMyX3QgLyogbWF4TnVtQnVmZmVycyA9IDEgKi8sCi0gICAgICAgICAgICBjb25zdCBSZWFkT3B0aW9ucyAqIC8qIG9wdGlvbnMgPSBudWxscHRyICovKSB7CisgICAgICAgICAgICBWZWN0b3I8TWVkaWFCdWZmZXJCYXNlICo+ICogLyogYnVmZmVycyAqLywgdWludDMyX3QgLyogbWF4TnVtQnVmZmVycyA9IDEgKi8sCisgICAgICAgICAgICBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKiAvKiBvcHRpb25zID0gbnVsbHB0ciAqLykgewogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lPTVhTdG9yZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JT01YU3RvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI4ZGI3MC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lPTVhTdG9yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9JT01YU1RPUkVfSF8KLQotI2RlZmluZSBBTkRST0lEX0lPTVhTVE9SRV9IXwotCi0jaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214U3RvcmUuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lCaW5kZXIuaD4KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdXNpbmcgaGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA6OklPbXhTdG9yZTsKLQotY2xhc3MgSU9NWFN0b3JlIDogcHVibGljIElJbnRlcmZhY2UgewotcHVibGljOgotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoT01YU3RvcmUpOwotCi0gICAgc3RydWN0IEF0dHJpYnV0ZSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGtleTsKLSAgICAgICAgc3RkOjpzdHJpbmcgdmFsdWU7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBOb2RlSW5mbyB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIG93bmVyOwotICAgICAgICBzdGQ6OnZlY3RvcjxBdHRyaWJ1dGU+IGF0dHJpYnV0ZXM7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBSb2xlSW5mbyB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHJvbGU7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHR5cGU7Ci0gICAgICAgIGJvb2wgaXNFbmNvZGVyOwotICAgICAgICBib29sIHByZWZlclBsYXRmb3JtTm9kZXM7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPE5vZGVJbmZvPiBub2RlczsKLSAgICB9OwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0U2VydmljZUF0dHJpYnV0ZXMoCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxBdHRyaWJ1dGU+KiBhdHRyaWJ1dGVzKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5vZGVQcmVmaXgoc3RkOjpzdHJpbmcqIHByZWZpeCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0Um9sZXMoc3RkOjp2ZWN0b3I8Um9sZUluZm8+KiByb2xlTGlzdCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPbXgoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHNwPElPTVg+KiBvbXgpID0gMDsKLX07Ci0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotY2xhc3MgQm5PTVhTdG9yZSA6IHB1YmxpYyBCbkludGVyZmFjZTxJT01YU3RvcmU+IHsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHN0YXR1c190IG9uVHJhbnNhY3QoCi0gICAgICAgICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwgJmRhdGEsIFBhcmNlbCAqcmVwbHksCi0gICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBBTkRST0lEX0lPTVhfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSVN0cmVhbVNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JU3RyZWFtU291cmNlLmgKaW5kZXggNGE2YWFmZC4uYzA4YzNlOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JU3RyZWFtU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JU3RyZWFtU291cmNlLmgKQEAgLTU0LDQwICs1NCw2IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgcXVldWVCdWZmZXIoc2l6ZV90IGluZGV4LCBzaXplX3Qgc2l6ZSkgPSAwOwogCi0gICAgLy8gV2hlbiBzaWduYWxsaW5nIGEgZGlzY29udGludWl0eSB5b3UgY2FuIG9wdGlvbmFsbHkKLSAgICAvLyBzcGVjaWZ5IGFuIGludDY0X3QgUFRTIHRpbWVzdGFtcCBpbiAibXNnIi4KLSAgICAvLyBJZiBwcmVzZW50LCByZW5kZXJpbmcgb2YgZGF0YSBmb2xsb3dpbmcgdGhlIGRpc2NvbnRpbnVpdHkKLSAgICAvLyB3aWxsIGJlIHN1cHByZXNzZWQgdW50aWwgbWVkaWEgdGltZSByZWFjaGVzIHRoaXMgdGltZXN0YW1wLgotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBrS2V5UmVzdW1lQXRQVFM7Ci0KLSAgICAvLyBXaGVuIHNpZ25hbGxpbmcgYSBkaXNjb250aW51aXR5IHlvdSBjYW4gb3B0aW9uYWxseQotICAgIC8vIHNwZWNpZnkgdGhlIHR5cGUocykgb2YgZGlzY29udGludWl0eSwgaS5lLiBpZiB0aGUKLSAgICAvLyBhdWRpbyBmb3JtYXQgaGFzIGNoYW5nZWQsIHRoZSB2aWRlbyBmb3JtYXQgaGFzIGNoYW5nZWQsCi0gICAgLy8gdGltZSBoYXMganVtcGVkIG9yIGFueSBjb21iaW5hdGlvbiB0aGVyZW9mLgotICAgIC8vIFRvIGRvIHNvLCBpbmNsdWRlIGEgbm9uLXplcm8gaW50MzJfdCB2YWx1ZQotICAgIC8vIHVuZGVyIHRoZSBrZXkgImtLZXlEaXNjb250aW51aXR5TWFzayIgd2hlbiBpc3N1aW5nIHRoZSBESVNDT05USU5VSVRZCi0gICAgLy8gY29tbWFuZC4KLSAgICAvLyBJZiB0aGVyZSBpcyBhIGNoYW5nZSBpbiBhdWRpby92aWRlbyBmb3JtYXQsIFRoZSBuZXcgbG9naWNhbCBzdHJlYW0KLSAgICAvLyBtdXN0IHN0YXJ0IHdpdGggcHJvcGVyIGNvZGVjIGluaXRpYWxpemF0aW9uCi0gICAgLy8gaW5mb3JtYXRpb24gZm9yIHBsYXliYWNrIHRvIGNvbnRpbnVlLCBpLmUuIFNQUyBhbmQgUFBTIGluIHRoZSBjYXNlCi0gICAgLy8gb2YgQVZDIHZpZGVvIGV0Yy4KLSAgICAvLyBJZiB0aGlzIGtleSBpcyBub3QgcHJlc2VudCwgb25seSBhIHRpbWUgZGlzY29udGludWl0eSBpcyBhc3N1bWVkLgotICAgIC8vIFRoZSB2YWx1ZSBzaG91bGQgYmUgYSBiaXRtYXNrIG9mIHZhbHVlcyBmcm9tCi0gICAgLy8gQVRTUGFyc2VyOjpEaXNjb250aW51aXR5VHlwZS4KLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qga0tleURpc2NvbnRpbnVpdHlNYXNrOwotCi0gICAgLy8gT3B0aW9uYWxseSBzaWduYWxsZWQgYXMgcGFydCBvZiBhIGRpc2NvbnRpbnVpdHkgdGhhdCBpbmNsdWRlcwotICAgIC8vIERJU0NPTlRJTlVJVFlfVElNRS4gSXQgaW5kaWNhdGVzIHRoZSBtZWRpYSB0aW1lIChpbiB1cykgdG8gYmUgYXNzb2NpYXRlZAotICAgIC8vIHdpdGggdGhlIG5leHQgUFRTIG9jY3VyaW5nIGluIHRoZSBzdHJlYW0uIFRoZSB2YWx1ZSBpcyBvZiB0eXBlIGludDY0X3QuCi0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGtLZXlNZWRpYVRpbWVVczsKLQotICAgIC8vIE9wdGlvbmFsbHkgc2lnbmFsbGVkIGFzIHBhcnQgb2YgYSBkaXNjb250aW51aXR5IHRoYXQgaW5jbHVkZXMKLSAgICAvLyBESVNDT05USU5VSVRZX1RJTUUuIEl0IGluZGljYXRlcyB0aGUgbWVkaWEgdGltZSAoaW4gdXMpIG9mIGEgcmVjZW50Ci0gICAgLy8gc2FtcGxlIGZyb20gdGhlIHNhbWUgY29udGVudCwgYW5kIGlzIHVzZWQgYXMgYSBoaW50IGZvciB0aGUgcGFyc2VyIHRvCi0gICAgLy8gaGFuZGxlIFBUUyB3cmFwYXJvdW5kLiBUaGlzIGlzIHJlcXVpcmVkIHdoZW4gYSBuZXcgcGFyc2VyIGlzIGNyZWF0ZWQKLSAgICAvLyB0byBjb250aW51ZSBwYXJzaW5nIGNvbnRlbnQgZnJvbSB0aGUgc2FtZSB0aW1lbGluZS4KLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qga0tleVJlY2VudE1lZGlhVGltZVVzOwotCiAgICAgdmlydHVhbCB2b2lkIGlzc3VlQ29tbWFuZCgKICAgICAgICAgICAgIENvbW1hbmQgY21kLCBib29sIHN5bmNocm9ub3VzLCBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyA9IE5VTEwpID0gMDsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0pBdWRpb0F0dHJpYnV0ZXMuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSkF1ZGlvQXR0cmlidXRlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMTE0MzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0pBdWRpb0F0dHJpYnV0ZXMuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSkFVRElPQVRUUklCVVRFU19ICisjZGVmaW5lIEFORFJPSURfSkFVRElPQVRUUklCVVRFU19ICisKKyNpbmNsdWRlIDxqbmkuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBKQXVkaW9BdHRyaWJ1dGVzIHsKK3B1YmxpYzoKKyAgICAvKiBDcmVhdGVzIGEgSmF2YSBBdWRpb0F0dHJpYnV0ZXMgb2JqZWN0LiAqLworICAgIHN0YXRpYyBqb2JqZWN0IGNyZWF0ZUF1ZGlvQXR0cmlidXRlc09iaihKTklFbnYgKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKSB7CisKKyAgICAgICAgamNsYXNzIGpCdWlsZGVyQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzJEJ1aWxkZXIiKTsKKyAgICAgICAgam1ldGhvZElEIGpCdWlsZGVyQ3RvciA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICI8aW5pdD4iLCAiKClWIik7CisgICAgICAgIGpvYmplY3QgakJ1aWxkZXJPYmogPSBlbnYtPk5ld09iamVjdChqQnVpbGRlckNscywgakJ1aWxkZXJDdG9yKTsKKworICAgICAgICBpZiAocEF0dHJpYnV0ZXMgIT0gTlVMTCkgeworICAgICAgICAgICAgLy8gSWYgcEF0dHJpYnV0ZXMgaXMgbm90IG51bGwsIHN0cmVhbVR5cGUgaXMgaWdub3JlZC4KKyAgICAgICAgICAgIGptZXRob2RJRCBqU2V0VXNhZ2UgPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgICAgICAgICBqQnVpbGRlckNscywgInNldFVzYWdlIiwgIihJKUxhbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlcyRCdWlsZGVyOyIpOworICAgICAgICAgICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJPYmosIGpTZXRVc2FnZSwgcEF0dHJpYnV0ZXMtPnVzYWdlKTsKKworICAgICAgICAgICAgam1ldGhvZElEIGpTZXRDb250ZW50VHlwZSA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJzZXRDb250ZW50VHlwZSIsCisgICAgICAgICAgICAgICAgICAgICIoSSlMYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMkQnVpbGRlcjsiKTsKKyAgICAgICAgICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLCBqU2V0Q29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgIHBBdHRyaWJ1dGVzLT5jb250ZW50X3R5cGUpOworCisgICAgICAgICAgICAvLyBUT0RPOiBKYXZhIEF1ZGlvQXR0cmlidXRlcy5CdWlsZGVyLnNldENhcHR1cmVQcmVzZXQoKSBpcyBzeXN0ZW1BcGkgYW5kIGhpZGRlbi4KKyAgICAgICAgICAgIC8vIENhbiB3ZSB1c2UgdGhpcyBtZXRob2Q/CisvLyAgICAgICAgICAgIGptZXRob2RJRCBqU2V0Q2FwdHVyZVByZXNldCA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJzZXRDYXB0dXJlUHJlc2V0IiwKKy8vICAgICAgICAgICAgICAgICAgICAiKEkpTGFuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzJEJ1aWxkZXI7Iik7CisvLyAgICAgICAgICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLCBqU2V0Q2FwdHVyZVByZXNldCwKKy8vICAgICAgICAgICAgICAgICAgICBwQXR0cmlidXRlcy0+c291cmNlKTsKKworICAgICAgICAgICAgam1ldGhvZElEIGpTZXRGbGFncyA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJzZXRGbGFncyIsCisgICAgICAgICAgICAgICAgICAgICIoSSlMYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMkQnVpbGRlcjsiKTsKKyAgICAgICAgICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLCBqU2V0RmxhZ3MsIHBBdHRyaWJ1dGVzLT5mbGFncyk7CisKKyAgICAgICAgICAgIC8vIFRPRE86IEhhbmRsZSB0aGUgJ3RhZ3MnIChjaGFyW10gdG8gSGFzaFNldDxTdHJpbmc+KS4KKyAgICAgICAgICAgIC8vIEhvdyB0byBwYXJzZSB0aGUgY2hhcltdPyBJcyB0aGVyZSBhbnkgZXhhbXBsZSBvZiBpdD8KKyAgICAgICAgICAgIC8vIEFsc28sIHRoZSBhZGRUYWdzKCkgbWV0aG9kIGlzIGhpZGRlbi4KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIENhbGwgQXVkaW9BdHRyaWJ1dGVzLkJ1aWxkZXIuc2V0TGVnYWN5U3RyZWFtVHlwZSgpLmJ1aWxkKCkKKyAgICAgICAgICAgIGptZXRob2RJRCBqU2V0TGVnYWN5U3RyZWFtVHlwZSA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJzZXRMZWdhY3lTdHJlYW1UeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgIihJKUxhbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlcyRCdWlsZGVyOyIpOworICAgICAgICAgICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJPYmosIGpTZXRMZWdhY3lTdHJlYW1UeXBlLCBzdHJlYW1UeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIGptZXRob2RJRCBqQnVpbGQgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAiYnVpbGQiLAorICAgICAgICAgICAgICAgICIoKUxhbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlczsiKTsKKyAgICAgICAgcmV0dXJuIGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwgakJ1aWxkKTsKKyAgICB9CisKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSkFVRElPQVRUUklCVVRFU19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0pBdWRpb0Zvcm1hdC5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9KQXVkaW9Gb3JtYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGFiZGZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9KQXVkaW9Gb3JtYXQuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSkFVRElPRk9STUFUX0gKKyNkZWZpbmUgQU5EUk9JRF9KQVVESU9GT1JNQVRfSAorCisjaW5jbHVkZSA8YW5kcm9pZF9tZWRpYV9BdWRpb0Zvcm1hdC5oPgorI2luY2x1ZGUgPGpuaS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEpBdWRpb0Zvcm1hdCB7CitwdWJsaWM6CisgICAgLyogQ3JlYXRlcyBhIEphdmEgQXVkaW9Gb3JtYXQgb2JqZWN0LiAqLworICAgIHN0YXRpYyBqb2JqZWN0IGNyZWF0ZUF1ZGlvRm9ybWF0T2JqKEpOSUVudiAqZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSB7CisKKyAgICAgICAgamNsYXNzIGpCdWlsZGVyQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvQXVkaW9Gb3JtYXQkQnVpbGRlciIpOworICAgICAgICBqbWV0aG9kSUQgakJ1aWxkZXJDdG9yID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgIjxpbml0PiIsICIoKVYiKTsKKyAgICAgICAgam9iamVjdCBqQnVpbGRlck9iaiA9IGVudi0+TmV3T2JqZWN0KGpCdWlsZGVyQ2xzLCBqQnVpbGRlckN0b3IpOworCisgICAgICAgIGlmIChzYW1wbGVSYXRlID09IDApIHsKKyAgICAgICAgICAgIGpjbGFzcyBqQXVkaW9Gb3JtYXRDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9BdWRpb0Zvcm1hdCIpOworICAgICAgICAgICAgamZpZWxkSUQgalNhbXBsZVJhdGVVbnNwZWNpZmllZCA9CisgICAgICAgICAgICAgICAgICAgIGVudi0+R2V0U3RhdGljRmllbGRJRChqQXVkaW9Gb3JtYXRDbHMsICJTQU1QTEVfUkFURV9VTlNQRUNJRklFRCIsICJJIik7CisgICAgICAgICAgICBzYW1wbGVSYXRlID0gZW52LT5HZXRTdGF0aWNJbnRGaWVsZChqQXVkaW9Gb3JtYXRDbHMsIGpTYW1wbGVSYXRlVW5zcGVjaWZpZWQpOworICAgICAgICB9CisKKyAgICAgICAgam1ldGhvZElEIGpTZXRFbmNvZGluZyA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJzZXRFbmNvZGluZyIsCisgICAgICAgICAgICAgICAgIihJKUxhbmRyb2lkL21lZGlhL0F1ZGlvRm9ybWF0JEJ1aWxkZXI7Iik7CisgICAgICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLCBqU2V0RW5jb2RpbmcsCisgICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXRGcm9tTmF0aXZlKGZvcm1hdCkpOworCisgICAgICAgIGptZXRob2RJRCBqU2V0U2FtcGxlUmF0ZSA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJzZXRTYW1wbGVSYXRlIiwKKyAgICAgICAgICAgICAgICAiKEkpTGFuZHJvaWQvbWVkaWEvQXVkaW9Gb3JtYXQkQnVpbGRlcjsiKTsKKyAgICAgICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJPYmosIGpTZXRTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKKworICAgICAgICBqbWV0aG9kSUQgalNldENoYW5uZWxNYXNrID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgInNldENoYW5uZWxNYXNrIiwKKyAgICAgICAgICAgICAgICAiKEkpTGFuZHJvaWQvbWVkaWEvQXVkaW9Gb3JtYXQkQnVpbGRlcjsiKTsKKyAgICAgICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJPYmosIGpTZXRDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICBvdXRDaGFubmVsTWFza0Zyb21OYXRpdmUoY2hhbm5lbE1hc2spKTsKKworICAgICAgICBqbWV0aG9kSUQgakJ1aWxkID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgImJ1aWxkIiwgIigpTGFuZHJvaWQvbWVkaWEvQXVkaW9Gb3JtYXQ7Iik7CisgICAgICAgIHJldHVybiBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJPYmosIGpCdWlsZCk7CisgICAgfQorCit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0pBVURJT0ZPUk1BVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0pldFBsYXllci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9KZXRQbGF5ZXIuaAppbmRleCA2M2QxOTgwLi5iYjU2OWJjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0pldFBsYXllci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSmV0UGxheWVyLmgKQEAgLTg3LDcgKzg3LDcgQEAKIAogICAgIGludCAgICAgICAgICAgICAgICAgbU1heFRyYWNrczsgLy8gbWF4IG51bWJlciBvZiBNSURJIHRyYWNrcywgdXN1YWxseSAzMgogICAgIEVBU19EQVRBX0hBTkRMRSAgICAgbUVhc0RhdGE7Ci0gICAgc3A8TWlkaUlvV3JhcHBlcj4gICBtSW9XcmFwcGVyOworICAgIE1pZGlJb1dyYXBwZXIqICAgICAgbUlvV3JhcHBlcjsKICAgICBFQVNfUENNKiAgICAgICAgICAgIG1BdWRpb0J1ZmZlcjsvLyBFQVMgcmVuZGVycyB0aGUgTUlESSBkYXRhIGludG8gdGhpcyBidWZmZXIsCiAgICAgc3A8QXVkaW9UcmFjaz4gICAgICBtQXVkaW9UcmFjazsgLy8gYW5kIHdlIHBsYXkgaXQgaW4gdGhpcyBhdWRpbyB0cmFjawogICAgIGludCAgICAgICAgICAgICAgICAgbVRyYWNrQnVmZmVyU2l6ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFCdWZmZXJIb2xkZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFCdWZmZXJIb2xkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWRmZGY1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUJ1ZmZlckhvbGRlci5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfQlVGRkVSX0hPTERFUl9IXworCisjZGVmaW5lIE1FRElBX0JVRkZFUl9IT0xERVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBNZWRpYUJ1ZmZlckhvbGRlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBNZWRpYUJ1ZmZlckhvbGRlcihNZWRpYUJ1ZmZlckJhc2UqIGJ1ZmZlcikKKyAgICAgICAgOiBtTWVkaWFCdWZmZXIoYnVmZmVyKSB7CisgICAgICAgIGlmIChtTWVkaWFCdWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbU1lZGlhQnVmZmVyLT5hZGRfcmVmKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIH5NZWRpYUJ1ZmZlckhvbGRlcigpIHsKKyAgICAgICAgaWYgKG1NZWRpYUJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtTWVkaWFCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIE1lZGlhQnVmZmVyQmFzZSogbWVkaWFCdWZmZXIoKSB7IHJldHVybiBtTWVkaWFCdWZmZXI7IH0KKworcHJpdmF0ZToKKyAgICBNZWRpYUJ1ZmZlckJhc2UqIGNvbnN0IG1NZWRpYUJ1ZmZlcjsKK307CisKK30gIC8vIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9CVUZGRVJfSE9MREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhQ29kZWNCdWZmZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oCmluZGV4IDUwMWMwMGIuLjJjMTZmYmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oCkBAIC01MCw5ICs1MCw2IEBACiAgICAgc2l6ZV90IG9mZnNldCgpIGNvbnN0OwogICAgIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gY2FsbHMgQUJ1ZmZlcjo6c2V0UmFuZ2UoKSBhbmQgcmV0dXJucyBPSy4KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFJhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKLSAgICAvLyBUT0RPOiBUaGVzZSBjYW4gYmUgcmVtb3ZlZCBpZiB3ZSBmaW5pc2ggcmVwbGFjaW5nIGFsbCBNZWRpYUJ1ZmZlcidzLgotICAgIE1lZGlhQnVmZmVyQmFzZSAqZ2V0TWVkaWFCdWZmZXJCYXNlKCk7Ci0gICAgdm9pZCBzZXRNZWRpYUJ1ZmZlckJhc2UoTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1ZmZlcik7CiAKICAgICAvLyBUT0RPOiBTcGVjaWZ5IGVhY2ggZmllbGQgZm9yIG1ldGEvZm9ybWF0LgogICAgIHNwPEFNZXNzYWdlPiBtZXRhKCk7CkBAIC02Niw3ICs2Myw2IEBACiAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+IG1NZXRhOwogICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0OwogICAgIGNvbnN0IHNwPEFCdWZmZXI+IG1CdWZmZXI7Ci0gICAgTWVkaWFCdWZmZXJCYXNlICptTWVkaWFCdWZmZXJCYXNlOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0luZm8uaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0luZm8uaAppbmRleCBhYjJjZDI0Li5iMzc3N2QzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhQ29kZWNJbmZvLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjSW5mby5oCkBAIC0xNzAsNiArMTcwLDcgQEAKICAgICAgKiBDdXJyZW50bHksIHRoaXMgaXMgdGhlICJpbnN0YW5jZSBuYW1lIiBvZiB0aGUgSU9teCBzZXJ2aWNlLgogICAgICAqLwogICAgIGNvbnN0IGNoYXIgKmdldE93bmVyTmFtZSgpIGNvbnN0OworICAgIHVpbnQzMl90IHJhbmsoKSBjb25zdDsKIAogICAgIC8qKgogICAgICAqIFNlcmlhbGl6YXRpb24gb3ZlciBCaW5kZXIKQEAgLTE4Miw2ICsxODMsNyBAQAogICAgIEFTdHJpbmcgbU93bmVyOwogICAgIGJvb2wgbUlzRW5jb2RlcjsKICAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBzcDxDYXBhYmlsaXRpZXM+ID4gbUNhcHM7CisgICAgdWludDMyX3QgbVJhbms7CiAKICAgICBzc2l6ZV90IGdldENhcGFiaWxpdHlJbmRleChjb25zdCBjaGFyICptaW1lKSBjb25zdDsKIApAQCAtMjUyLDYgKzI1NCwxMyBAQAogICAgICAqIEByZXR1cm4gYHRydWVgIGlmIGBtaW1lYCBpcyByZW1vdmVkOyBgZmFsc2VgIGlmIGBtaW1lYCBpcyBub3QgZm91bmQuCiAgICAgICovCiAgICAgYm9vbCByZW1vdmVNaW1lKGNvbnN0IGNoYXIqIG1pbWUpOworICAgIC8qKgorICAgICAqIFNldCByYW5rIG9mIHRoZSBjb2RlYy4gTWVkaWFDb2RlY0xpc3Qgd2lsbCBzdGFibGUtc29ydCB0aGUgbGlzdCBhY2NvcmRpbmcKKyAgICAgKiB0byByYW5rIGluIG5vbi1kZXNjZW5kaW5nIG9yZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHJhbmsgVGhlIHJhbmsgb2YgdGhlIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICB2b2lkIHNldFJhbmsodWludDMyX3QgcmFuayk7CiBwcml2YXRlOgogICAgIC8qKgogICAgICAqIFRoZSBhc3NvY2lhdGVkIGBNZWRpYUNvZGVjSW5mb2AuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhRGVmcy5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYURlZnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YxNzAxMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhRGVmcy5oCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfREVGU19IXwotCi0jZGVmaW5lIE1FRElBX0RFRlNfSF8KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfSU1BR0VfSlBFRzsKLQotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1ZQODsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19WUDk7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fQVZDOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkM7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQ7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MzsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMjsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19SQVc7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1NDUkFNQkxFRDsKLQotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQjsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0I7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRzsgICAgICAgICAgIC8vIGxheWVyIElJSQotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01QRUdfTEFZRVJfSTsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0lJOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01JREk7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1FDRUxQOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUzsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVzsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVc7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUM7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFM7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVNHU007Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUMzOwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0VBQzM7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fU0NSQU1CTEVEOwotCi1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUc0OwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9XQVY7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX09HRzsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTUFUUk9TS0E7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyVFM7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX0FWSTsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJQUzsKLQotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1RFWFRfM0dQUDsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUX1NVQlJJUDsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUX1ZUVDsKLWV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUX0NFQV82MDg7Ci1leHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF9DRUFfNzA4OwotZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0RBVEFfVElNRURfSUQzOwotCi0vLyBUaGVzZSBhcmUgdmFsdWVzIGV4cG9ydGVkIHRvIEpBVkEgQVBJIHRoYXQgbmVlZCB0byBiZSBpbiBzeW5jIHdpdGgKLS8vIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9Gb3JtYXQuamF2YS4gVW5mb3J0dW5hdGVseSwKLS8vIHRoZXkgYXJlIG5vdCBkZWZpbmVkIGluIGZyYW1ld29ya3MvYXYsIHNvIGRlZmluaW5nIHRoZW0gaGVyZS4KLWVudW0gQXVkaW9FbmNvZGluZyB7Ci0gICAga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCA9IDIsCi0gICAga0F1ZGlvRW5jb2RpbmdQY204Yml0ID0gMywKLSAgICBrQXVkaW9FbmNvZGluZ1BjbUZsb2F0ID0gNCwKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTUVESUFfREVGU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUhUVFBDb25uZWN0aW9uLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhSFRUUENvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzgxM2EyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUhUVFBDb25uZWN0aW9uLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9IVFRQX0NPTk5FQ1RJT05fSF8KKworI2RlZmluZSBNRURJQV9IVFRQX0NPTk5FQ1RJT05fSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE1lZGlhSFRUUENvbm5lY3Rpb24gOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKKyAgICBNZWRpYUhUVFBDb25uZWN0aW9uKCkge30KKworICAgIHZpcnR1YWwgYm9vbCBjb25uZWN0KAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgPSAwOworCisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKSA9IDA7CisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpID0gMDsKKyAgICB2aXJ0dWFsIG9mZjY0X3QgZ2V0U2l6ZSgpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1JTUVUeXBlKFN0cmluZzggKm1pbWVUeXBlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRVcmkoU3RyaW5nOCAqdXJpKSA9IDA7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVkaWFIVFRQQ29ubmVjdGlvbik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX0hUVFBfQ09OTkVDVElPTl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUhUVFBTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhSFRUUFNlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTlmMTI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUhUVFBTZXJ2aWNlLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9IVFRQX1NFUlZJQ0VfSF8KKworI2RlZmluZSBNRURJQV9IVFRQX1NFUlZJQ0VfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTWVkaWFIVFRQQ29ubmVjdGlvbjsKKworc3RydWN0IE1lZGlhSFRUUFNlcnZpY2UgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKKyAgICBNZWRpYUhUVFBTZXJ2aWNlKCkge30KKworICAgIHZpcnR1YWwgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gbWFrZUhUVFBDb25uZWN0aW9uKCkgPSAwOworCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lZGlhSFRUUFNlcnZpY2UpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9IVFRQX1NFUlZJQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmgKaW5kZXggMjU3MDAyZC4uOThkMzAwZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmgKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFzY2FubmVyLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9WaWRlb0ZyYW1lLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00MSwyNyArNDIsMjAgQEAKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+JiBzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpID0gMDsKLSAgICB2aXJ0dWFsIFZpZGVvRnJhbWUqIGdldEZyYW1lQXRUaW1lKAorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlPiYgc291cmNlLCBjb25zdCBjaGFyICptaW1lKSA9IDA7CisgICAgdmlydHVhbCBzcDxJTWVtb3J5PiBnZXRGcmFtZUF0VGltZSgKICAgICAgICAgICAgIGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uLCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHkpID0gMDsKKyAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGdldEltYWdlQXRJbmRleCgKKyAgICAgICAgICAgIGludCBpbmRleCwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5LCBib29sIHRodW1ibmFpbCkgPSAwOworICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gZ2V0SW1hZ2VSZWN0QXRJbmRleCgKKyAgICAgICAgICAgIGludCBpbmRleCwgaW50IGNvbG9yRm9ybWF0LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZUF0SW5kZXgoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzcDxJTWVtb3J5PiA+KiBmcmFtZXMsCisgICAgICAgICAgICBpbnQgZnJhbWVJbmRleCwgaW50IG51bUZyYW1lcywgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5KSA9IDA7CiAgICAgdmlydHVhbCBNZWRpYUFsYnVtQXJ0KiBleHRyYWN0QWxidW1BcnQoKSA9IDA7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyKiBleHRyYWN0TWV0YWRhdGEoaW50IGtleUNvZGUpID0gMDsKIH07CiAKLS8vIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UKLWNsYXNzIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UgOiBwdWJsaWMgTWVkaWFNZXRhZGF0YVJldHJpZXZlckJhc2UKLXsKLXB1YmxpYzoKLSAgICBNZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlKCkge30KLQotICAgIHZpcnR1YWwgICAgICAgICAgICAgfk1lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UoKSB7fQotICAgIHZpcnR1YWwgVmlkZW9GcmFtZSogZ2V0RnJhbWVBdFRpbWUoCi0gICAgICAgICAgICBpbnQ2NF90IC8qdGltZVVzKi8sIGludCAvKm9wdGlvbiovLCBpbnQgLypjb2xvckZvcm1hdCovLCBib29sIC8qbWV0YU9ubHkqLykKLSAgICB7IHJldHVybiBOVUxMOyB9Ci0gICAgdmlydHVhbCBNZWRpYUFsYnVtQXJ0KiBleHRyYWN0QWxidW1BcnQoKSB7IHJldHVybiBOVUxMOyB9Ci0gICAgdmlydHVhbCBjb25zdCBjaGFyKiBleHRyYWN0TWV0YWRhdGEoaW50IC8qa2V5Q29kZSovKSB7IHJldHVybiBOVUxMOyB9Ci19OwotCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLy8gQU5EUk9JRF9NRURJQU1FVEFEQVRBUkVUUklFVkVSSU5URVJGQUNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaAppbmRleCA0MGRkOWY5Li41MzQwZGRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oCkBAIC0xOCwxMCArMTgsMTQgQEAKIAogI2RlZmluZSBNRURJQV9SRUNPUkRFUl9CQVNFX0hfCiAKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgorI2luY2x1ZGUgPG1lZGlhL01pY3JvcGhvbmVJbmZvLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgogCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKKyNpbmNsdWRlIDx2ZWN0b3I+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgSUNhbWVyYVJlY29yZGluZ1Byb3h5OwpAQCAtNjIsNiArNjYsMTMgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3A8UGVyc2lzdGVudFN1cmZhY2U+JiBzdXJmYWNlKSA9IDA7CiAgICAgdmlydHVhbCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBxdWVyeVN1cmZhY2VNZWRpYVNvdXJjZSgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldElucHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJvdXRlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QqIGRldmljZUlkKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHNldEF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpID0gMDsKKwogCiAKIHByb3RlY3RlZDoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZXNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlc291cmNlLmgKaW5kZXggMTk1N2E0NS4uZTFmZGI5YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlc291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlc291cmNlLmgKQEAgLTI5LDcgKzI5LDggQEAKICAgICAgICAga1Vuc3BlY2lmaWVkID0gMCwKICAgICAgICAga1NlY3VyZUNvZGVjLAogICAgICAgICBrTm9uU2VjdXJlQ29kZWMsCi0gICAgICAgIGtHcmFwaGljTWVtb3J5CisgICAgICAgIGtHcmFwaGljTWVtb3J5LAorICAgICAgICBrQ3B1Qm9vc3QsCiAgICAgfTsKIAogICAgIGVudW0gU3ViVHlwZSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01pZGlJb1dyYXBwZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWlkaUlvV3JhcHBlci5oCmluZGV4IGU2ZjhjZjcuLmI1ZTU2NWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWlkaUlvV3JhcHBlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWlkaUlvV3JhcHBlci5oCkBAIC0xOSwxNSArMTksMTUgQEAKIAogI2luY2x1ZGUgPGxpYnNvbml2b3gvZWFzX3R5cGVzLmg+CiAKLSNpbmNsdWRlICJtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgiCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBNaWRpSW9XcmFwcGVyIDogcHVibGljIFJlZkJhc2UgeworY2xhc3MgTWlkaUlvV3JhcHBlciB7CiBwdWJsaWM6Ci0gICAgTWlkaUlvV3JhcHBlcihjb25zdCBjaGFyICpwYXRoKTsKLSAgICBNaWRpSW9XcmFwcGVyKGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIGludDY0X3Qgc2l6ZSk7Ci0gICAgTWlkaUlvV3JhcHBlcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKTsKKyAgICBleHBsaWNpdCBNaWRpSW9XcmFwcGVyKGNvbnN0IGNoYXIgKnBhdGgpOworICAgIGV4cGxpY2l0IE1pZGlJb1dyYXBwZXIoaW50IGZkLCBvZmY2NF90IG9mZnNldCwgaW50NjRfdCBzaXplKTsKKyAgICBleHBsaWNpdCBNaWRpSW9XcmFwcGVyKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOwogCiAgICAgfk1pZGlJb1dyYXBwZXIoKTsKIApAQCAtNDAsNyArNDAsNyBAQAogICAgIGludCBtRmQ7CiAgICAgb2ZmNjRfdCBtQmFzZTsKICAgICBpbnQ2NF90ICBtTGVuZ3RoOwotICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKICAgICBFQVNfRklMRSBtRWFzRmlsZTsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTmRrV3JhcHBlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9OZGtXcmFwcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk3ZDE3MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTmRrV3JhcHBlci5oCkBAIC0wLDAgKzEsMzY5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE5ES19XUkFQUEVSX0hfCisKKyNkZWZpbmUgTkRLX1dSQVBQRVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0NyeXB0b0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK3N0cnVjdCBBTWVkaWFDb2RlYzsKK3N0cnVjdCBBTWVkaWFDb2RlY0J1ZmZlckluZm87CitzdHJ1Y3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvOworc3RydWN0IEFNZWRpYUNyeXB0bzsKK3N0cnVjdCBBTWVkaWFEcm07CitzdHJ1Y3QgQU1lZGlhRm9ybWF0Oworc3RydWN0IEFNZWRpYUV4dHJhY3RvcjsKK3N0cnVjdCBBTmF0aXZlV2luZG93Oworc3RydWN0IFBzc2hJbmZvOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBTWVzc2FnZTsKK2NsYXNzIE1ldGFEYXRhOworCitzdHJ1Y3QgQU1lZGlhRm9ybWF0V3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKKworICAgIHN0YXRpYyBzcDxBTWVkaWFGb3JtYXRXcmFwcGVyPiBDcmVhdGUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtZXNzYWdlKTsKKworICAgIEFNZWRpYUZvcm1hdFdyYXBwZXIoKTsKKyAgICBBTWVkaWFGb3JtYXRXcmFwcGVyKEFNZWRpYUZvcm1hdCAqYU1lZGlhRm9ybWF0KTsKKworICAgIC8vIHRoZSByZXR1cm5lZCBBTWVkaWFGb3JtYXQgaXMgc3RpbGwgb3duZWQgYnkgdGhpcyB3cmFwcGVyLgorICAgIEFNZWRpYUZvcm1hdCAqZ2V0QU1lZGlhRm9ybWF0KCkgY29uc3Q7CisKKyAgICBzcDxBTWVzc2FnZT4gdG9BTWVzc2FnZSgpIGNvbnN0IDsKKyAgICB2b2lkIHdyaXRlVG9BTWVzc2FnZShzcDxBTWVzc2FnZT4mKSBjb25zdCA7CisgICAgY29uc3QgY2hhciogdG9TdHJpbmcoKSBjb25zdCA7CisKKyAgICBzdGF0dXNfdCByZWxlYXNlKCk7CisKKyAgICBib29sIGdldEludDMyKGNvbnN0IGNoYXIgKm5hbWUsIGludDMyX3QgKm91dCkgY29uc3Q7CisgICAgYm9vbCBnZXRJbnQ2NChjb25zdCBjaGFyICpuYW1lLCBpbnQ2NF90ICpvdXQpIGNvbnN0OworICAgIGJvb2wgZ2V0RmxvYXQoY29uc3QgY2hhciAqbmFtZSwgZmxvYXQgKm91dCkgY29uc3Q7CisgICAgYm9vbCBnZXREb3VibGUoY29uc3QgY2hhciAqbmFtZSwgZG91YmxlICpvdXQpIGNvbnN0OworICAgIGJvb2wgZ2V0U2l6ZShjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgKm91dCkgY29uc3Q7CisgICAgYm9vbCBnZXRSZWN0KGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgIGludDMyX3QgKmxlZnQsIGludDMyX3QgKnRvcCwgaW50MzJfdCAqcmlnaHQsIGludDMyX3QgKmJvdHRvbSkgY29uc3Q7CisgICAgYm9vbCBnZXRCdWZmZXIoY29uc3QgY2hhciAqbmFtZSwgdm9pZCoqIGRhdGEsIHNpemVfdCAqb3V0c2l6ZSkgY29uc3Q7CisgICAgYm9vbCBnZXRTdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgQVN0cmluZyAqb3V0KSBjb25zdDsKKworICAgIHZvaWQgc2V0SW50MzIoY29uc3QgY2hhciogbmFtZSwgaW50MzJfdCB2YWx1ZSk7CisgICAgdm9pZCBzZXRJbnQ2NChjb25zdCBjaGFyKiBuYW1lLCBpbnQ2NF90IHZhbHVlKTsKKyAgICB2b2lkIHNldEZsb2F0KGNvbnN0IGNoYXIqIG5hbWUsIGZsb2F0IHZhbHVlKTsKKyAgICB2b2lkIHNldERvdWJsZShjb25zdCBjaGFyICpuYW1lLCBkb3VibGUgdmFsdWUpOworICAgIHZvaWQgc2V0U2l6ZShjb25zdCBjaGFyKiBuYW1lLCBzaXplX3QgdmFsdWUpOworICAgIHZvaWQgc2V0UmVjdChjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICBpbnQzMl90IGxlZnQsIGludDMyX3QgdG9wLCBpbnQzMl90IHJpZ2h0LCBpbnQzMl90IGJvdHRvbSk7CisgICAgdm9pZCBzZXRTdHJpbmcoY29uc3QgY2hhciogbmFtZSwgY29uc3QgQVN0cmluZyAmdmFsdWUpOworICAgIHZvaWQgc2V0QnVmZmVyKGNvbnN0IGNoYXIqIG5hbWUsIHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkFNZWRpYUZvcm1hdFdyYXBwZXIoKTsKKworcHJpdmF0ZToKKyAgICBBTWVkaWFGb3JtYXQgKm1BTWVkaWFGb3JtYXQ7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBTWVkaWFGb3JtYXRXcmFwcGVyKTsKK307CisKK3N0cnVjdCBBTmF0aXZlV2luZG93V3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBBTmF0aXZlV2luZG93V3JhcHBlcihBTmF0aXZlV2luZG93ICphTmF0aXZlV2luZG93KTsKKworICAgIC8vIHRoZSByZXR1cm5lZCBBTmF0aXZlV2luZG93IGlzIHN0aWxsIG93bmVkIGJ5IHRoaXMgd3JhcHBlci4KKyAgICBBTmF0aXZlV2luZG93ICpnZXRBTmF0aXZlV2luZG93KCkgY29uc3Q7CisKKyAgICBzdGF0dXNfdCByZWxlYXNlKCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BTmF0aXZlV2luZG93V3JhcHBlcigpOworCitwcml2YXRlOgorICAgIEFOYXRpdmVXaW5kb3cgKm1BTmF0aXZlV2luZG93OworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU5hdGl2ZVdpbmRvd1dyYXBwZXIpOworfTsKKworc3RydWN0IEFNZWRpYURybVdyYXBwZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgQU1lZGlhRHJtV3JhcHBlcihjb25zdCB1aW50OF90IHV1aWRbMTZdKTsKKyAgICBBTWVkaWFEcm1XcmFwcGVyKEFNZWRpYURybSAqYU1lZGlhRHJtKTsKKworICAgIC8vIHRoZSByZXR1cm5lZCBBTWVkaWFEcm0gaXMgc3RpbGwgb3duZWQgYnkgdGhpcyB3cmFwcGVyLgorICAgIEFNZWRpYURybSAqZ2V0QU1lZGlhRHJtKCkgY29uc3Q7CisKKyAgICBzdGF0dXNfdCByZWxlYXNlKCk7CisKKyAgICBzdGF0aWMgYm9vbCBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBjaGFyICptaW1lVHlwZSk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BTWVkaWFEcm1XcmFwcGVyKCk7CisKK3ByaXZhdGU6CisgICAgQU1lZGlhRHJtICptQU1lZGlhRHJtOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU1lZGlhRHJtV3JhcHBlcik7Cit9OworCitzdHJ1Y3QgQU1lZGlhQ3J5cHRvV3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBBTWVkaWFDcnlwdG9XcmFwcGVyKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICppbml0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbml0RGF0YVNpemUpOworICAgIEFNZWRpYUNyeXB0b1dyYXBwZXIoQU1lZGlhQ3J5cHRvICphTWVkaWFDcnlwdG8pOworCisgICAgLy8gdGhlIHJldHVybmVkIEFNZWRpYUNyeXB0byBpcyBzdGlsbCBvd25lZCBieSB0aGlzIHdyYXBwZXIuCisgICAgQU1lZGlhQ3J5cHRvICpnZXRBTWVkaWFDcnlwdG8oKSBjb25zdDsKKworICAgIHN0YXR1c190IHJlbGVhc2UoKTsKKworICAgIGJvb2wgaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSk7CisKKyAgICBib29sIHJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChjb25zdCBjaGFyICptaW1lKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkFNZWRpYUNyeXB0b1dyYXBwZXIoKTsKKworcHJpdmF0ZToKKyAgICBBTWVkaWFDcnlwdG8gKm1BTWVkaWFDcnlwdG87CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBTWVkaWFDcnlwdG9XcmFwcGVyKTsKK307CisKK3N0cnVjdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyIDogcHVibGljIFJlZkJhc2UgeworICAgIHN0YXRpYyBzcDxBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyPiBDcmVhdGUoTWV0YURhdGFCYXNlICZtZXRhKTsKKworICAgIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXIoaW50IG51bXN1YnNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGtleVsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGl2WzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpjbGVhcmJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICplbmNyeXB0ZWRieXRlcyk7CisgICAgQU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcihBTWVkaWFDb2RlY0NyeXB0b0luZm8gKmFNZWRpYUNvZGVjQ3J5cHRvSW5mbyk7CisKKyAgICAvLyB0aGUgcmV0dXJuZWQgQU1lZGlhQ3J5cHRvSW5mbyBpcyBzdGlsbCBvd25lZCBieSB0aGlzIHdyYXBwZXIuCisgICAgQU1lZGlhQ29kZWNDcnlwdG9JbmZvICpnZXRBTWVkaWFDb2RlY0NyeXB0b0luZm8oKSBjb25zdDsKKworICAgIHN0YXR1c190IHJlbGVhc2UoKTsKKworICAgIHZvaWQgc2V0UGF0dGVybihDcnlwdG9QbHVnaW46OlBhdHRlcm4gKnBhdHRlcm4pOworCisgICAgc2l6ZV90IGdldE51bVN1YlNhbXBsZXMoKTsKKworICAgIHN0YXR1c190IGdldEtleSh1aW50OF90ICpkc3QpOworCisgICAgc3RhdHVzX3QgZ2V0SVYodWludDhfdCAqZHN0KTsKKworICAgIENyeXB0b1BsdWdpbjo6TW9kZSBnZXRNb2RlKCk7CisKKyAgICBzdGF0dXNfdCBnZXRDbGVhckJ5dGVzKHNpemVfdCAqZHN0KTsKKworICAgIHN0YXR1c190IGdldEVuY3J5cHRlZEJ5dGVzKHNpemVfdCAqZHN0KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXIoKTsKKworcHJpdmF0ZToKKyAgICBBTWVkaWFDb2RlY0NyeXB0b0luZm8gKm1BTWVkaWFDb2RlY0NyeXB0b0luZm87CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyKTsKK307CisKK3N0cnVjdCBBTWVkaWFDb2RlY1dyYXBwZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgZW51bSB7CisgICAgICAgIENCX0lOUFVUX0FWQUlMQUJMRSA9IDEsCisgICAgICAgIENCX09VVFBVVF9BVkFJTEFCTEUgPSAyLAorICAgICAgICBDQl9FUlJPUiA9IDMsCisgICAgICAgIENCX09VVFBVVF9GT1JNQVRfQ0hBTkdFRCA9IDQsCisgICAgfTsKKworICAgIHN0YXRpYyBzcDxBTWVkaWFDb2RlY1dyYXBwZXI+IENyZWF0ZUNvZGVjQnlOYW1lKGNvbnN0IEFTdHJpbmcgJm5hbWUpOworICAgIHN0YXRpYyBzcDxBTWVkaWFDb2RlY1dyYXBwZXI+IENyZWF0ZURlY29kZXJCeVR5cGUoY29uc3QgQVN0cmluZyAmbWltZVR5cGUpOworCisgICAgc3RhdGljIHZvaWQgT25JbnB1dEF2YWlsYWJsZUNCKEFNZWRpYUNvZGVjICpjb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXgpOworICAgIHN0YXRpYyB2b2lkIE9uT3V0cHV0QXZhaWxhYmxlQ0IoQU1lZGlhQ29kZWMgKmNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhQ29kZWNCdWZmZXJJbmZvICpidWZmZXJJbmZvKTsKKyAgICBzdGF0aWMgdm9pZCBPbkZvcm1hdENoYW5nZWRDQihBTWVkaWFDb2RlYyAqY29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICpmb3JtYXQpOworICAgIHN0YXRpYyB2b2lkIE9uRXJyb3JDQihBTWVkaWFDb2RlYyAqY29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYWN0aW9uQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV0YWlsKTsKKworICAgIEFNZWRpYUNvZGVjV3JhcHBlcihBTWVkaWFDb2RlYyAqYU1lZGlhQ29kZWMpOworCisgICAgLy8gdGhlIHJldHVybmVkIEFNZWRpYUNvZGVjIGlzIHN0aWxsIG93bmVkIGJ5IHRoaXMgd3JhcHBlci4KKyAgICBBTWVkaWFDb2RlYyAqZ2V0QU1lZGlhQ29kZWMoKSBjb25zdDsKKworICAgIHN0YXR1c190IHJlbGVhc2UoKTsKKworICAgIHN0YXR1c190IGdldE5hbWUoQVN0cmluZyogb3V0Q29tcG9uZW50TmFtZSkgY29uc3Q7CisKKyAgICBzdGF0dXNfdCBjb25maWd1cmUoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVkaWFGb3JtYXRXcmFwcGVyPiAmZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZud3csCisgICAgICAgICAgICBjb25zdCBzcDxBTWVkaWFDcnlwdG9XcmFwcGVyPiAmY3J5cHRvLAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpOworCisgICAgc3RhdHVzX3Qgc2V0Q2FsbGJhY2soY29uc3Qgc3A8QU1lc3NhZ2U+ICZjYWxsYmFjayk7CisKKyAgICBzdGF0dXNfdCByZWxlYXNlQ3J5cHRvKCk7CisKKyAgICBzdGF0dXNfdCBzdGFydCgpOworICAgIHN0YXR1c190IHN0b3AoKTsKKyAgICBzdGF0dXNfdCBmbHVzaCgpOworCisgICAgdWludDhfdCogZ2V0SW5wdXRCdWZmZXIoc2l6ZV90IGlkeCwgc2l6ZV90ICpvdXRfc2l6ZSk7CisgICAgdWludDhfdCogZ2V0T3V0cHV0QnVmZmVyKHNpemVfdCBpZHgsIHNpemVfdCAqb3V0X3NpemUpOworCisgICAgc3RhdHVzX3QgcXVldWVJbnB1dEJ1ZmZlcigKKyAgICAgICAgICAgIHNpemVfdCBpZHgsCisgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0LAorICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICB1aW50NjRfdCB0aW1lLAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpOworCisgICAgc3RhdHVzX3QgcXVldWVTZWN1cmVJbnB1dEJ1ZmZlcigKKyAgICAgICAgICAgIHNpemVfdCBpZHgsCisgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0LAorICAgICAgICAgICAgc3A8QU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcj4gJmNvZGVjQ3J5cHRvSW5mbywKKyAgICAgICAgICAgIHVpbnQ2NF90IHRpbWUsCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncyk7CisKKyAgICBzcDxBTWVkaWFGb3JtYXRXcmFwcGVyPiBnZXRPdXRwdXRGb3JtYXQoKTsKKyAgICBzcDxBTWVkaWFGb3JtYXRXcmFwcGVyPiBnZXRJbnB1dEZvcm1hdCgpOworCisgICAgc3RhdHVzX3QgcmVsZWFzZU91dHB1dEJ1ZmZlcihzaXplX3QgaWR4LCBib29sIHJlbmRlcik7CisKKyAgICBzdGF0dXNfdCBzZXRPdXRwdXRTdXJmYWNlKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiAmbnd3KTsKKworICAgIHN0YXR1c190IHJlbGVhc2VPdXRwdXRCdWZmZXJBdFRpbWUoc2l6ZV90IGlkeCwgaW50NjRfdCB0aW1lc3RhbXBOcyk7CisKKyAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZWRpYUZvcm1hdFdyYXBwZXI+ICZwYXJhbXMpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QU1lZGlhQ29kZWNXcmFwcGVyKCk7CisKK3ByaXZhdGU6CisgICAgQU1lZGlhQ29kZWMgKm1BTWVkaWFDb2RlYzsKKworICAgIHNwPEFNZXNzYWdlPiBtQ2FsbGJhY2s7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBTWVkaWFDb2RlY1dyYXBwZXIpOworfTsKKworc3RydWN0IEFNZWRpYUV4dHJhY3RvcldyYXBwZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisKKyAgICBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyKEFNZWRpYUV4dHJhY3RvciAqYU1lZGlhRXh0cmFjdG9yKTsKKworICAgIC8vIHRoZSByZXR1cm5lZCBBTWVkaWFFeHRyYWN0b3IgaXMgc3RpbGwgb3duZWQgYnkgdGhpcyB3cmFwcGVyLgorICAgIEFNZWRpYUV4dHJhY3RvciAqZ2V0QU1lZGlhRXh0cmFjdG9yKCkgY29uc3Q7CisKKyAgICBzdGF0dXNfdCByZWxlYXNlKCk7CisKKyAgICBzdGF0dXNfdCBkaXNjb25uZWN0KCk7CisKKyAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoKTsKKworICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3QgY2hhciAqbG9jYXRpb24pOworCisgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShBTWVkaWFEYXRhU291cmNlICopOworCisgICAgc2l6ZV90IGdldFRyYWNrQ291bnQoKTsKKworICAgIHNwPEFNZWRpYUZvcm1hdFdyYXBwZXI+IGdldEZvcm1hdCgpOworCisgICAgc3A8QU1lZGlhRm9ybWF0V3JhcHBlcj4gZ2V0VHJhY2tGb3JtYXQoc2l6ZV90IGlkeCk7CisKKyAgICBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgaWR4KTsKKworICAgIHN0YXR1c190IHVuc2VsZWN0VHJhY2soc2l6ZV90IGlkeCk7CisKKyAgICBzdGF0dXNfdCBzZWxlY3RTaW5nbGVUcmFjayhzaXplX3QgaWR4KTsKKworICAgIHNzaXplX3QgcmVhZFNhbXBsZURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisKKyAgICBzc2l6ZV90IGdldFNhbXBsZVNpemUoKTsKKworICAgIHVpbnQzMl90IGdldFNhbXBsZUZsYWdzKCk7CisKKyAgICBpbnQgZ2V0U2FtcGxlVHJhY2tJbmRleCgpOworCisgICAgaW50NjRfdCBnZXRTYW1wbGVUaW1lKCk7CisKKyAgICBzdGF0dXNfdCBnZXRTYW1wbGVGb3JtYXQoc3A8QU1lZGlhRm9ybWF0V3JhcHBlcj4gJmZvcm1hdFdyYXBwZXIpOworCisgICAgaW50NjRfdCBnZXRDYWNoZWREdXJhdGlvbigpOworCisgICAgYm9vbCBhZHZhbmNlKCk7CisKKyAgICBzdGF0dXNfdCBzZWVrVG8oaW50NjRfdCBzZWVrUG9zVXMsIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZSk7CisKKyAgICAvLyB0aGUgcmV0dXJuZWQgUHNzaEluZm8gaXMgc3RpbGwgb3duZWQgYnkgdGhpcyB3cmFwcGVyLgorICAgIFBzc2hJbmZvKiBnZXRQc3NoSW5mbygpOworCisgICAgc3A8QU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcj4gZ2V0U2FtcGxlQ3J5cHRvSW5mbygpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QU1lZGlhRXh0cmFjdG9yV3JhcHBlcigpOworCitwcml2YXRlOgorICAgIEFNZWRpYUV4dHJhY3RvciAqbUFNZWRpYUV4dHJhY3RvcjsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFNZWRpYUV4dHJhY3RvcldyYXBwZXIpOworfTsKKworc3RydWN0IEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyIDogcHVibGljIFJlZkJhc2UgeworCisgICAgc3RhdGljIHN0YXR1c190IHRyYW5zbGF0ZV9lcnJvcihtZWRpYV9zdGF0dXNfdCBlcnIpOworCisgICAgc3RhdGljIHNzaXplX3QgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfZ2V0U2l6ZSh2b2lkICp1c2VyZGF0YSk7CisKKyAgICBzdGF0aWMgc3NpemVfdCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9yZWFkQXQodm9pZCAqdXNlcmRhdGEsIG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICogYnVmLCBzaXplX3Qgc2l6ZSk7CisKKyAgICBzdGF0aWMgdm9pZCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9jbG9zZSh2b2lkICp1c2VyZGF0YSk7CisKKyAgICBBTWVkaWFEYXRhU291cmNlV3JhcHBlcihjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YVNvdXJjZSk7CisKKyAgICBBTWVkaWFEYXRhU291cmNlICpnZXRBTWVkaWFEYXRhU291cmNlKCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BTWVkaWFEYXRhU291cmNlV3JhcHBlcigpOworCitwcml2YXRlOgorICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOworCisgICAgQU1lZGlhRGF0YVNvdXJjZSAqbUFNZWRpYURhdGFTb3VyY2U7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBTWVkaWFEYXRhU291cmNlV3JhcHBlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE5ES19XUkFQUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL09NWEJ1ZmZlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9PTVhCdWZmZXIuaAppbmRleCAzZTg0ODU4Li45YzlmNWU3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL09NWEJ1ZmZlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvT01YQnVmZmVyLmgKQEAgLTkxLDYgKzkxLDcgQEAKIAogcHJpdmF0ZToKICAgICBmcmllbmQgc3RydWN0IE9NWE5vZGVJbnN0YW5jZTsKKyAgICBmcmllbmQgc3RydWN0IEMyT01YTm9kZTsKIAogICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRlbXBvcmFyaWx5IGZvciBPTVggSElETCB0cmFuc2l0aW9uLgogICAgIGZyaWVuZCBpbmxpbmUgYm9vbCAoOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6aW1wbGVtZW50YXRpb246OgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9QbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuaAppbmRleCA0YTVhMzYzLi5lMDBiZDQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuaApAQCAtMjAsMTMgKzIwLDEzIEBACiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RhdHVzX3QgcmVwb3J0RHJtUGx1Z2luTWV0cmljcyhjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlcmlhbGl6ZWRNZXRyaWNzLAorc3RhdHVzX3QgcmVwb3J0RHJtUGx1Z2luTWV0cmljcyhjb25zdCBzdGQ6OnN0cmluZyYgYjY0RW5jb2RlZE1ldHJpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHZlbmRvck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGRlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFwcFBhY2thZ2VOYW1lKTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9UaW1lQ2hlY2suaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVGltZUNoZWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM1ZjY1NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVGltZUNoZWNrLmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2lmbmRlZiBBTkRST0lEX1RJTUVfQ0hFQ0tfSAorI2RlZmluZSBBTkRST0lEX1RJTUVfQ0hFQ0tfSAorCisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEEgY2xhc3MgbW9uaXRvcmluZyBleGVjdXRpb24gdGltZSBmb3IgYSBjb2RlIGJsb2NrIChzY29wZWQgdmFyaWFibGUpIGFuZCBjYXVzaW5nIGFuIGFzc2VydAorLy8gaWYgaXQgZXhjZWVkcyBhIGNlcnRhaW4gdGltZQorCitjbGFzcyBUaW1lQ2hlY2sgeworcHVibGljOgorCisgICAgLy8gVGhlIGRlZmF1bHQgdGltZW91dCBpcyBjaG9zZW4gdG8gYmUgbGVzcyB0aGFuIHN5c3RlbSBzZXJ2ZXIgd2F0Y2hkb2cgdGltZW91dAorICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga0RlZmF1bHRUaW1lT3V0TXMgPSA1MDAwOworCisgICAgICAgICAgICBUaW1lQ2hlY2soY29uc3QgY2hhciAqdGFnLCB1aW50MzJfdCB0aW1lb3V0TXMgPSBrRGVmYXVsdFRpbWVPdXRNcyk7CisgICAgICAgICAgICB+VGltZUNoZWNrKCk7CisKK3ByaXZhdGU6CisKKyAgICBjbGFzcyBUaW1lQ2hlY2tUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lQ2hlY2tUaHJlYWQoKSB7fQorICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5UaW1lQ2hlY2tUaHJlYWQoKSBvdmVycmlkZTsKKworICAgICAgICAgICAgICAgIG5zZWNzX3QgICAgIHN0YXJ0TW9uaXRvcmluZyhjb25zdCBjaGFyICp0YWcsIHVpbnQzMl90IHRpbWVvdXRNcyk7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc3RvcE1vbml0b3JpbmcobnNlY3NfdCBlbmRUaW1lTnMpOworCisgICAgcHJpdmF0ZToKKworICAgICAgICAgICAgICAgIC8vIFJlZkJhc2UKKyAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICBvbkZpcnN0UmVmKCkgb3ZlcnJpZGUgeyBydW4oIlRpbWVDaGVja1RocmVhZCIsIFBSSU9SSVRZX1VSR0VOVF9BVURJTyk7IH0KKworICAgICAgICAgICAgICAgIC8vIFRocmVhZAorICAgICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIHRocmVhZExvb3AoKSBvdmVycmlkZTsKKworICAgICAgICAgICAgICAgIENvbmRpdGlvbiAgICAgICAgICAgbUNvbmQ7CisgICAgICAgICAgICAgICAgTXV0ZXggICAgICAgICAgICAgICBtTXV0ZXg7CisgICAgICAgICAgICAgICAgLy8gdXNpbmcgdGhlIGVuZCB0aW1lIGluIG5zIGFzIGtleSBpcyBPSyBnaXZlbiB0aGUgcmlzayBpcyBsb3cgdGhhdCB0d28gZW50cmllcworICAgICAgICAgICAgICAgIC8vIGFyZSBhZGRlZCBpbiBzdWNoIGEgd2F5IHRoYXQgPGFkZCB0aW1lPiArIDx0aW1lb3V0PiBhcmUgdGhlIHNhbWUgZm9yIGJvdGguCisgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8IG5zZWNzX3QsIGNvbnN0IGNoYXIqPiAgbU1vbml0b3JSZXF1ZXN0czsKKyAgICB9OworCisgICAgc3RhdGljIHNwPFRpbWVDaGVja1RocmVhZD4gZ2V0VGltZUNoZWNrVGhyZWFkKCk7CisKKyAgICBjb25zdCAgICAgICAgICAgbnNlY3NfdCBtRW5kVGltZU5zOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX1RJTUVfQ0hFQ0tfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9UeXBlQ29udmVydGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1R5cGVDb252ZXJ0ZXIuaAppbmRleCA4NGUyMmIxLi44NmYwZDRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1R5cGVDb252ZXJ0ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1R5cGVDb252ZXJ0ZXIuaApAQCAtODAsNiArODAsMTEgQEAKICAgICB0eXBlZGVmIGF1ZGlvX21vZGVfdCBUeXBlOwogICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247CiB9Oworc3RydWN0IEF1ZGlvQ29udGVudFRyYWl0cworeworICAgIHR5cGVkZWYgYXVkaW9fY29udGVudF90eXBlX3QgVHlwZTsKKyAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOworfTsKIHN0cnVjdCBVc2FnZVRyYWl0cwogewogICAgIHR5cGVkZWYgYXVkaW9fdXNhZ2VfdCBUeXBlOwpAQCAtMjI2LDYgKzIzMSw3IEBACiB0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8R2Fpbk1vZGVUcmFpdHM+IEdhaW5Nb2RlQ29udmVydGVyOwogdHlwZWRlZiBUeXBlQ29udmVydGVyPFN0cmVhbVRyYWl0cz4gU3RyZWFtVHlwZUNvbnZlcnRlcjsKIHR5cGVkZWYgVHlwZUNvbnZlcnRlcjxBdWRpb01vZGVUcmFpdHM+IEF1ZGlvTW9kZUNvbnZlcnRlcjsKK3R5cGVkZWYgVHlwZUNvbnZlcnRlcjxBdWRpb0NvbnRlbnRUcmFpdHM+IEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI7CiB0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8VXNhZ2VUcmFpdHM+IFVzYWdlVHlwZUNvbnZlcnRlcjsKIHR5cGVkZWYgVHlwZUNvbnZlcnRlcjxTb3VyY2VUcmFpdHM+IFNvdXJjZVR5cGVDb252ZXJ0ZXI7CiAKQEAgLTI0MCw2ICsyNDYsNyBAQAogdGVtcGxhdGU8PiBjb25zdCBHYWluTW9kZUNvbnZlcnRlcjo6VGFibGUgR2Fpbk1vZGVDb252ZXJ0ZXI6Om1UYWJsZVtdOwogdGVtcGxhdGU8PiBjb25zdCBTdHJlYW1UeXBlQ29udmVydGVyOjpUYWJsZSBTdHJlYW1UeXBlQ29udmVydGVyOjptVGFibGVbXTsKIHRlbXBsYXRlPD4gY29uc3QgQXVkaW9Nb2RlQ29udmVydGVyOjpUYWJsZSBBdWRpb01vZGVDb252ZXJ0ZXI6Om1UYWJsZVtdOwordGVtcGxhdGU8PiBjb25zdCBBdWRpb0NvbnRlbnRUeXBlQ29udmVydGVyOjpUYWJsZSBBdWRpb0NvbnRlbnRUeXBlQ29udmVydGVyOjptVGFibGVbXTsKIHRlbXBsYXRlPD4gY29uc3QgVXNhZ2VUeXBlQ29udmVydGVyOjpUYWJsZSBVc2FnZVR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdOwogdGVtcGxhdGU8PiBjb25zdCBTb3VyY2VUeXBlQ29udmVydGVyOjpUYWJsZSBTb3VyY2VUeXBlQ29udmVydGVyOjptVGFibGVbXTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaAppbmRleCA2NWMyNjZiLi5jZGVmNjM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaApAQCAtNTksNiArNTksMTUgQEAKICAgICBNRVRBREFUQV9LRVlfTE9DQVRJT04gICAgICAgID0gMjMsCiAgICAgTUVUQURBVEFfS0VZX1ZJREVPX1JPVEFUSU9OICA9IDI0LAogICAgIE1FVEFEQVRBX0tFWV9DQVBUVVJFX0ZSQU1FUkFURSA9IDI1LAorICAgIE1FVEFEQVRBX0tFWV9IQVNfSU1BR0UgICAgICAgPSAyNiwKKyAgICBNRVRBREFUQV9LRVlfSU1BR0VfQ09VTlQgICAgID0gMjcsCisgICAgTUVUQURBVEFfS0VZX0lNQUdFX1BSSU1BUlkgICA9IDI4LAorICAgIE1FVEFEQVRBX0tFWV9JTUFHRV9XSURUSCAgICAgPSAyOSwKKyAgICBNRVRBREFUQV9LRVlfSU1BR0VfSEVJR0hUICAgID0gMzAsCisgICAgTUVUQURBVEFfS0VZX0lNQUdFX1JPVEFUSU9OICA9IDMxLAorICAgIE1FVEFEQVRBX0tFWV9WSURFT19GUkFNRV9DT1VOVCAgPSAzMiwKKyAgICBNRVRBREFUQV9LRVlfRVhJRl9PRkZTRVQgICAgID0gMzMsCisgICAgTUVUQURBVEFfS0VZX0VYSUZfTEVOR1RIICAgICA9IDM0LAogCiAgICAgLy8gQWRkIG1vcmUgaGVyZS4uLgogfTsKQEAgLTgwLDYgKzg5LDEzIEBACiAgICAgICAgICAgICBjb25zdCBzcDxJRGF0YVNvdXJjZT4mIGRhdGFTb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUgPSBOVUxMKTsKICAgICBzcDxJTWVtb3J5PiBnZXRGcmFtZUF0VGltZShpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbiwKICAgICAgICAgICAgIGludCBjb2xvckZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCXzU2NSwgYm9vbCBtZXRhT25seSA9IGZhbHNlKTsKKyAgICBzcDxJTWVtb3J5PiBnZXRJbWFnZUF0SW5kZXgoaW50IGluZGV4LAorICAgICAgICAgICAgaW50IGNvbG9yRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1LCBib29sIG1ldGFPbmx5ID0gZmFsc2UsIGJvb2wgdGh1bWJuYWlsID0gZmFsc2UpOworICAgIHNwPElNZW1vcnk+IGdldEltYWdlUmVjdEF0SW5kZXgoCisgICAgICAgICAgICBpbnQgaW5kZXgsIGludCBjb2xvckZvcm1hdCwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSk7CisgICAgc3RhdHVzX3QgZ2V0RnJhbWVBdEluZGV4KAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3A8SU1lbW9yeT4gPiAqZnJhbWVzLCBpbnQgZnJhbWVJbmRleCwgaW50IG51bUZyYW1lcyA9IDEsCisgICAgICAgICAgICBpbnQgY29sb3JGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1JHQl81NjUsIGJvb2wgbWV0YU9ubHkgPSBmYWxzZSk7CiAgICAgc3A8SU1lbW9yeT4gZXh0cmFjdEFsYnVtQXJ0KCk7CiAgICAgY29uc3QgY2hhciogZXh0cmFjdE1ldGFkYXRhKGludCBrZXlDb2RlKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oCmluZGV4IDYyM2MzNzQuLjIzMzVjNWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmgKQEAgLTE3LDYgKzE3LDggQEAKICNpZm5kZWYgQU5EUk9JRF9NRURJQVBMQVlFUl9ICiAjZGVmaW5lIEFORFJPSURfTUVESUFQTEFZRVJfSAogCisjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXJfY29tbW9uLmg+CisKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CkBAIC01MCwxMiArNTIsMTUgQEAKICAgICBNRURJQV9QQVVTRUQgICAgICAgICAgICA9IDcsCiAgICAgTUVESUFfU1RPUFBFRCAgICAgICAgICAgPSA4LAogICAgIE1FRElBX1NLSVBQRUQgICAgICAgICAgID0gOSwKKyAgICBNRURJQV9OT1RJRllfVElNRSAgICAgICA9IDk4LAogICAgIE1FRElBX1RJTUVEX1RFWFQgICAgICAgID0gOTksCiAgICAgTUVESUFfRVJST1IgICAgICAgICAgICAgPSAxMDAsCiAgICAgTUVESUFfSU5GTyAgICAgICAgICAgICAgPSAyMDAsCiAgICAgTUVESUFfU1VCVElUTEVfREFUQSAgICAgPSAyMDEsCiAgICAgTUVESUFfTUVUQV9EQVRBICAgICAgICAgPSAyMDIsCiAgICAgTUVESUFfRFJNX0lORk8gICAgICAgICAgPSAyMTAsCisgICAgTUVESUFfVElNRV9ESVNDT05USU5VSVRZID0gMjExLAorICAgIE1FRElBX0FVRElPX1JPVVRJTkdfQ0hBTkdFRCA9IDEwMDAwLAogfTsKIAogLy8gR2VuZXJpYyBlcnJvciBjb2RlcyBmb3IgdGhlIG1lZGlhIHBsYXllciBmcmFtZXdvcmsuICBFcnJvcnMgYXJlIGZhdGFsLCB0aGUKQEAgLTE4NiwxNiArMTkxLDYgQEAKICAgICBJTlZPS0VfSURfR0VUX1NFTEVDVEVEX1RSQUNLID0gNwogfTsKIAotLy8gS2VlcCBNRURJQV9UUkFDS19UWVBFXyogaW4gc3luYyB3aXRoIE1lZGlhUGxheWVyLmphdmEuCi1lbnVtIG1lZGlhX3RyYWNrX3R5cGUgewotICAgIE1FRElBX1RSQUNLX1RZUEVfVU5LTk9XTiA9IDAsCi0gICAgTUVESUFfVFJBQ0tfVFlQRV9WSURFTyA9IDEsCi0gICAgTUVESUFfVFJBQ0tfVFlQRV9BVURJTyA9IDIsCi0gICAgTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQgPSAzLAotICAgIE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUgPSA0LAotICAgIE1FRElBX1RSQUNLX1RZUEVfTUVUQURBVEEgPSA1LAotfTsKLQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gcmVmLWNvdW50ZWQgb2JqZWN0IGZvciBjYWxsYmFja3MKIGNsYXNzIE1lZGlhUGxheWVyTGlzdGVuZXI6IHZpcnR1YWwgcHVibGljIFJlZkJhc2UKQEAgLTIyNSw3ICsyMjAsNiBAQAogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvU3VyZmFjZVRleHR1cmUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgYnVmZmVyUHJvZHVjZXIpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldExpc3RlbmVyKGNvbnN0IHNwPE1lZGlhUGxheWVyTGlzdGVuZXI+JiBsaXN0ZW5lcik7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0RGVmYXVsdEJ1ZmZlcmluZ1NldHRpbmdzKEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLyk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0QnVmZmVyaW5nU2V0dGluZ3MoQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBwcmVwYXJlKCk7CkBAIC0yNDUsNiArMjM5LDcgQEAKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZWVrVG8oCiAgICAgICAgICAgICAgICAgICAgIGludCBtc2VjLAogICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllclNlZWtNb2RlIG1vZGUgPSBNZWRpYVBsYXllclNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIG5vdGlmeUF0KGludDY0X3QgbWVkaWFUaW1lVXMpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldEN1cnJlbnRQb3NpdGlvbihpbnQgKm1zZWMpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldER1cmF0aW9uKGludCAqbXNlYyk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcmVzZXQoKTsKQEAgLTI2NiwxMyArMjYxLDE3IEBACiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0UmV0cmFuc21pdEVuZHBvaW50KGNvbnN0IGNoYXIqIGFkZHJTdHJpbmcsIHVpbnQxNl90IHBvcnQpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldE5leHRNZWRpYVBsYXllcihjb25zdCBzcDxNZWRpYVBsYXllcj4mIHBsYXllcik7CiAKLSAgICAgICAgICAgIFZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKTsKLSAgICAgICAgICAgIHNwPFZvbHVtZVNoYXBlcjo6U3RhdGU+IGdldFZvbHVtZVNoYXBlclN0YXRlKGludCBpZCk7CisgICAgICAgICAgICBtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0dXMgYXBwbHlWb2x1bWVTaGFwZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbik7CisgICAgICAgICAgICBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gZ2V0Vm9sdW1lU2hhcGVyU3RhdGUoaW50IGlkKTsKICAgICAgICAgICAgIC8vIE1vZHVsYXIgRFJNCiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcHJlcGFyZURybShjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4mIGRybVNlc3Npb25JZCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcmVsZWFzZURybSgpOworICAgICAgICAgICAgLy8gQXVkaW9Sb3V0aW5nCisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpOworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRSb3V0ZWREZXZpY2VJZCgpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKIAogcHJpdmF0ZToKICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBjbGVhcl9sKCk7CkBAIC0zMDksNyArMzA4LDYgQEAKICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgbVNlbmRMZXZlbDsKICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gICAgICAgICAgbVJldHJhbnNtaXRFbmRwb2ludDsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbVJldHJhbnNtaXRFbmRwb2ludFZhbGlkOwotICAgIEJ1ZmZlcmluZ1NldHRpbmdzICAgICAgICAgICBtQ3VycmVudEJ1ZmZlcmluZ1NldHRpbmdzOwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXJfY29tbW9uLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YTAxMzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyX2NvbW1vbi5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQVBMQVlFUl9DT01NT05fSAorI2RlZmluZSBBTkRST0lEX01FRElBUExBWUVSX0NPTU1PTl9ICisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gS2VlcCBNRURJQV9UUkFDS19UWVBFXyogaW4gc3luYyB3aXRoIE1lZGlhUGxheWVyLmphdmEuCitlbnVtIG1lZGlhX3RyYWNrX3R5cGUgeworICAgIE1FRElBX1RSQUNLX1RZUEVfVU5LTk9XTiA9IDAsCisgICAgTUVESUFfVFJBQ0tfVFlQRV9WSURFTyA9IDEsCisgICAgTUVESUFfVFJBQ0tfVFlQRV9BVURJTyA9IDIsCisgICAgTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQgPSAzLAorICAgIE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUgPSA0LAorICAgIE1FRElBX1RSQUNLX1RZUEVfTUVUQURBVEEgPSA1LAorfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfTUVESUFQTEFZRVJfQ09NTU9OX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmgKaW5kZXggMDcxZTdhMS4uZDhiMGZlNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmgKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFSZWNvcmRlckNsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYURlYXRoTm90aWZpZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9NaWNyb3Bob25lSW5mby5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTc3LDYgKzc4LDkgQEAKICAgICAvKiBWUDgvVk9SQklTIGRhdGEgaW4gYSBXRUJNIGNvbnRhaW5lciAqLwogICAgIE9VVFBVVF9GT1JNQVRfV0VCTSA9IDksCiAKKyAgICAvKiBIRUlDIGRhdGEgaW4gYSBIRUlGIGNvbnRhaW5lciAqLworICAgIE9VVFBVVF9GT1JNQVRfSEVJRiA9IDEwLAorCiAgICAgT1VUUFVUX0ZPUk1BVF9MSVNUX0VORCAvLyBtdXN0IGJlIGxhc3QgLSB1c2VkIHRvIHZhbGlkYXRlIGZvcm1hdCB0eXBlCiB9OwogCkBAIC0xMzgsNiArMTQyLDggQEAKICAgICBNRURJQV9SRUNPUkRFUl9UUkFDS19FVkVOVF9FUlJPUiAgICAgICAgICAgICAgPSAxMDAsCiAgICAgTUVESUFfUkVDT1JERVJfVFJBQ0tfRVZFTlRfSU5GTyAgICAgICAgICAgICAgID0gMTAxLAogICAgIE1FRElBX1JFQ09SREVSX1RSQUNLX0VWRU5UX0xJU1RfRU5EICAgICAgICAgICA9IDEwMDAsCisKKyAgICBNRURJQV9SRUNPUkRFUl9BVURJT19ST1VUSU5HX0NIQU5HRUQgICAgICAgICAgPSAxMDAwMCwKIH07CiAKIC8qCkBAIC0yNTAsNiArMjU2LDEwIEBACiAgICAgc3RhdHVzX3QgICAgc2V0SW5wdXRTdXJmYWNlKGNvbnN0IHNwPFBlcnNpc3RlbnRTdXJmYWNlPiYgc3VyZmFjZSk7CiAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gICAgIHF1ZXJ5U3VyZmFjZU1lZGlhU291cmNlRnJvbU1lZGlhU2VydmVyKCk7CiAgICAgc3RhdHVzX3QgICAgZ2V0TWV0cmljcyhQYXJjZWwgKnJlcGx5KTsKKyAgICBzdGF0dXNfdCAgICBzZXRJbnB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKKyAgICBzdGF0dXNfdCAgICBnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90ICpkZXZpY2VJZCk7CisgICAgc3RhdHVzX3QgICAgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpOworICAgIHN0YXR1c190ICAgIGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKTsKIAogcHJpdmF0ZToKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBkb0NsZWFuVXAoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9Db252ZXJzaW9uLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvQ29udmVyc2lvbi5oCmluZGV4IDk4MTZmZTEuLjM3MDBhMjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9Db252ZXJzaW9uLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL0NvbnZlcnNpb24uaApAQCAtMjAsMTEgKzIwLDExIEBACiAjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPGxpc3Q+CiAKKyNpbmNsdWRlIDxjaW50dHlwZXM+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+Ci0jaW5jbHVkZSA8aGlkbG1lbW9yeS9tYXBwaW5nLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvQmluZGVyLmg+CiAjaW5jbHVkZSA8YmluZGVyL1N0YXR1cy5oPgpAQCAtMzUsOCArMzUsOSBAQAogI2luY2x1ZGUgPG1lZGlhL09NWEZlbmNlUGFyY2VsYWJsZS5oPgogI2luY2x1ZGUgPG1lZGlhL09NWEJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgogCi0jaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21lbW9yeS8xLjAvSU1lbW9yeS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC90eXBlcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXhOb2RlLmg+CkBAIC0xOTksMjYgKzIwMCw2IEBACiB9CiAKIC8qKgotICogXGJyaWVmIENvbnZlcnQgYFJldHVybjxTdGF0dXM+YCB0byBgc3RhdHVzX3RgLiBUaGlzIGlzIGZvciBsZWdhY3kgYmluZGVyCi0gKiBjYWxscy4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgUmV0dXJuPFN0YXR1cz5gLgotICogXHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBgc3RhdHVzX3RgLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gZmlyc3QgY2hlY2sgaWYgXHAgdCBoYXMgYSB0cmFuc3BvcnQgZXJyb3IuIElmIGl0IGRvZXMsIHRoZW4gdGhlCi0gKiByZXR1cm4gdmFsdWUgaXMgdGhlIHRyYW5zcG9ydCBlcnJvciBjb2RlLiBPdGhlcndpc2UsIHRoZSByZXR1cm4gdmFsdWUgaXMKLSAqIGNvbnZlcnRlZCBmcm9tIGBTdGF0dXNgIGNvbnRhaW5lZCBpbnNpZGUgXHAgdC4KLSAqCi0gKiBOb3RlOgotICogLSBUaGlzIGBTdGF0dXNgIGlzIG9teC1zcGVjaWZpYy4gSXQgaXMgZGVmaW5lZCBpbiBgdHlwZXMuaGFsYC4KLSAqIC0gVGhlIG5hbWUgb2YgdGhpcyBmdW5jdGlvbiBpcyBub3QgYGNvbnZlcnRgLgotICovCi0vLyBjb252ZXJ0OiBTdGF0dXMgLT4gc3RhdHVzX3QKLWlubGluZSBzdGF0dXNfdCB0b1N0YXR1c1QoUmV0dXJuPFN0YXR1cz4gY29uc3QmIHQpIHsKLSAgICByZXR1cm4gdC5pc09rKCkgPyBzdGF0aWNfY2FzdDxzdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0KSkgOiBVTktOT1dOX0VSUk9SOwotfQotCi0vKioKICAqIFxicmllZiBDb252ZXJ0IGBSZXR1cm48dm9pZD5gIHRvIGBzdGF0dXNfdGAuIFRoaXMgaXMgZm9yIGxlZ2FjeSBiaW5kZXIgY2FsbHMuCiAgKgogICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYFJldHVybjx2b2lkPmAuCkBAIC0yMzcsNyArMjE4LDQ3IEBACiAgKi8KIC8vIGNvbnZlcnQ6IFN0YXR1cyAtPiBzdGF0dXNfdAogaW5saW5lIHN0YXR1c190IHRvU3RhdHVzVChTdGF0dXMgY29uc3QmIHQpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHQpOworICAgIHN3aXRjaCAodCkgeworICAgIGNhc2UgU3RhdHVzOjpOT19FUlJPUjoKKyAgICBjYXNlIFN0YXR1czo6TkFNRV9OT1RfRk9VTkQ6CisgICAgY2FzZSBTdGF0dXM6OldPVUxEX0JMT0NLOgorICAgIGNhc2UgU3RhdHVzOjpOT19NRU1PUlk6CisgICAgY2FzZSBTdGF0dXM6OkFMUkVBRFlfRVhJU1RTOgorICAgIGNhc2UgU3RhdHVzOjpOT19JTklUOgorICAgIGNhc2UgU3RhdHVzOjpCQURfVkFMVUU6CisgICAgY2FzZSBTdGF0dXM6OkRFQURfT0JKRUNUOgorICAgIGNhc2UgU3RhdHVzOjpJTlZBTElEX09QRVJBVElPTjoKKyAgICBjYXNlIFN0YXR1czo6VElNRURfT1VUOgorICAgIGNhc2UgU3RhdHVzOjpFUlJPUl9VTlNVUFBPUlRFRDoKKyAgICBjYXNlIFN0YXR1czo6VU5LTk9XTl9FUlJPUjoKKyAgICBjYXNlIFN0YXR1czo6UkVMRUFTRV9BTExfQlVGRkVSUzoKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHN0YXR1c190Pih0KTsKKyAgICBjYXNlIFN0YXR1czo6QlVGRkVSX05FRURTX1JFQUxMT0NBVElPTjoKKyAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HVygiVW5yZWNvZ25pemVkIHN0YXR1cyB2YWx1ZTogJSIgUFJJZDMyLCBzdGF0aWNfY2FzdDxpbnQzMl90Pih0KSk7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzdGF0dXNfdD4odCk7CisgICAgfQorfQorCisvKioKKyAqIFxicmllZiBDb252ZXJ0IGBSZXR1cm48U3RhdHVzPmAgdG8gYHN0YXR1c190YC4gVGhpcyBpcyBmb3IgbGVnYWN5IGJpbmRlcgorICogY2FsbHMuCisgKgorICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYFJldHVybjxTdGF0dXM+YC4KKyAqIFxyZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgYHN0YXR1c190YC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGZpcnN0IGNoZWNrIGlmIFxwIHQgaGFzIGEgdHJhbnNwb3J0IGVycm9yLiBJZiBpdCBkb2VzLCB0aGVuIHRoZQorICogcmV0dXJuIHZhbHVlIGlzIHRoZSB0cmFuc3BvcnQgZXJyb3IgY29kZS4gT3RoZXJ3aXNlLCB0aGUgcmV0dXJuIHZhbHVlIGlzCisgKiBjb252ZXJ0ZWQgZnJvbSBgU3RhdHVzYCBjb250YWluZWQgaW5zaWRlIFxwIHQuCisgKgorICogTm90ZToKKyAqIC0gVGhpcyBgU3RhdHVzYCBpcyBvbXgtc3BlY2lmaWMuIEl0IGlzIGRlZmluZWQgaW4gYHR5cGVzLmhhbGAuCisgKiAtIFRoZSBuYW1lIG9mIHRoaXMgZnVuY3Rpb24gaXMgbm90IGBjb252ZXJ0YC4KKyAqLworLy8gY29udmVydDogU3RhdHVzIC0+IHN0YXR1c190CitpbmxpbmUgc3RhdHVzX3QgdG9TdGF0dXNUKFJldHVybjxTdGF0dXM+IGNvbnN0JiB0KSB7CisgICAgcmV0dXJuIHQuaXNPaygpID8gdG9TdGF0dXNUKHN0YXRpY19jYXN0PFN0YXR1cz4odCkpIDogVU5LTk9XTl9FUlJPUjsKIH0KIAogLyoqCkBAIC0yNDgsNyArMjY5LDI4IEBACiAgKi8KIC8vIGNvbnZlcnQ6IHN0YXR1c190IC0+IFN0YXR1cwogaW5saW5lIFN0YXR1cyB0b1N0YXR1cyhzdGF0dXNfdCBsKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0YXR1cz4obCk7CisgICAgc3dpdGNoIChsKSB7CisgICAgY2FzZSBOT19FUlJPUjoKKyAgICBjYXNlIE5BTUVfTk9UX0ZPVU5EOgorICAgIGNhc2UgV09VTERfQkxPQ0s6CisgICAgY2FzZSBOT19NRU1PUlk6CisgICAgY2FzZSBBTFJFQURZX0VYSVNUUzoKKyAgICBjYXNlIE5PX0lOSVQ6CisgICAgY2FzZSBCQURfVkFMVUU6CisgICAgY2FzZSBERUFEX09CSkVDVDoKKyAgICBjYXNlIElOVkFMSURfT1BFUkFUSU9OOgorICAgIGNhc2UgVElNRURfT1VUOgorICAgIGNhc2UgRVJST1JfVU5TVVBQT1JURUQ6CisgICAgY2FzZSBVTktOT1dOX0VSUk9SOgorICAgIGNhc2UgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UkVMRUFTRV9BTExfQlVGRkVSUzoKKyAgICBjYXNlIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkJVRkZFUl9ORUVEU19SRUFMTE9DQVRJT046CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdGF0dXM+KGwpOworICAgIGNhc2UgTk9UX0VOT1VHSF9EQVRBOgorICAgICAgICByZXR1cm4gU3RhdHVzOjpCVUZGRVJfTkVFRFNfUkVBTExPQ0FUSU9OOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dXKCJVbnJlY29nbml6ZWQgc3RhdHVzIHZhbHVlOiAlIiBQUklkMzIsIHN0YXRpY19jYXN0PGludDMyX3Q+KGwpKTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0YXR1cz4obCk7CisgICAgfQogfQogCiAvKioKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5jcHAKaW5kZXggN2QyN2Q1Ny4uZTYxYjA0ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5jcHAKQEAgLTE1NCw2ICsxNTQsNDUgQEAKICAgICByZXR1cm4gbVJldHJpZXZlci0+Z2V0RnJhbWVBdFRpbWUodGltZVVzLCBvcHRpb24sIGNvbG9yRm9ybWF0LCBtZXRhT25seSk7CiB9CiAKK3NwPElNZW1vcnk+IE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI6OmdldEltYWdlQXRJbmRleCgKKyAgICAgICAgaW50IGluZGV4LCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHksIGJvb2wgdGh1bWJuYWlsKSB7CisgICAgQUxPR1YoImdldEltYWdlQXRJbmRleDogaW5kZXgoJWQpIGNvbG9yRm9ybWF0KCVkKSBtZXRhT25seSglZCkgdGh1bWJuYWlsKCVkKSIsCisgICAgICAgICAgICBpbmRleCwgY29sb3JGb3JtYXQsIG1ldGFPbmx5LCB0aHVtYm5haWwpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1SZXRyaWV2ZXIgPT0gMCkgeworICAgICAgICBBTE9HRSgicmV0cmlldmVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIG1SZXRyaWV2ZXItPmdldEltYWdlQXRJbmRleChpbmRleCwgY29sb3JGb3JtYXQsIG1ldGFPbmx5LCB0aHVtYm5haWwpOworfQorCitzcDxJTWVtb3J5PiBNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpnZXRJbWFnZVJlY3RBdEluZGV4KAorICAgICAgICBpbnQgaW5kZXgsIGludCBjb2xvckZvcm1hdCwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkgeworICAgIEFMT0dWKCJnZXRJbWFnZVJlY3RBdEluZGV4OiBpbmRleCglZCkgY29sb3JGb3JtYXQoJWQpIHJlY3QgeyVkLCAlZCwgJWQsICVkfSIsCisgICAgICAgICAgICBpbmRleCwgY29sb3JGb3JtYXQsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVJldHJpZXZlciA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJyZXRyaWV2ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gbVJldHJpZXZlci0+Z2V0SW1hZ2VSZWN0QXRJbmRleCgKKyAgICAgICAgICAgIGluZGV4LCBjb2xvckZvcm1hdCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKK30KKworc3RhdHVzX3QgTWVkaWFNZXRhZGF0YVJldHJpZXZlcjo6Z2V0RnJhbWVBdEluZGV4KAorICAgICAgICBzdGQ6OnZlY3RvcjxzcDxJTWVtb3J5PiA+ICpmcmFtZXMsCisgICAgICAgIGludCBmcmFtZUluZGV4LCBpbnQgbnVtRnJhbWVzLCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHkpIHsKKyAgICBBTE9HVigiZ2V0RnJhbWVBdEluZGV4OiBmcmFtZUluZGV4KCVkKSwgbnVtRnJhbWVzKCVkKSwgY29sb3JGb3JtYXQoJWQpIG1ldGFPbmx5KCVkKSIsCisgICAgICAgICAgICBmcmFtZUluZGV4LCBudW1GcmFtZXMsIGNvbG9yRm9ybWF0LCBtZXRhT25seSk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVJldHJpZXZlciA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJyZXRyaWV2ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgcmV0dXJuIG1SZXRyaWV2ZXItPmdldEZyYW1lQXRJbmRleCgKKyAgICAgICAgICAgIGZyYW1lcywgZnJhbWVJbmRleCwgbnVtRnJhbWVzLCBjb2xvckZvcm1hdCwgbWV0YU9ubHkpOworfQorCiBjb25zdCBjaGFyKiBNZWRpYU1ldGFkYXRhUmV0cmlldmVyOjpleHRyYWN0TWV0YWRhdGEoaW50IGtleUNvZGUpCiB7CiAgICAgQUxPR1YoImV4dHJhY3RNZXRhZGF0YSglZCkiLCBrZXlDb2RlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcAppbmRleCBiOTc2NzIxLi4yNjkwOGU1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCkBAIC00OCw2ICs0OCw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgbWVkaWE6OlZvbHVtZVNoYXBlcjsKKwogTWVkaWFQbGF5ZXI6Ok1lZGlhUGxheWVyKCkKIHsKICAgICBBTE9HVigiY29uc3RydWN0b3IiKTsKQEAgLTEzNywxMCArMTM5LDggQEAKICAgICAgICAgbVBsYXllciA9IHBsYXllcjsKICAgICAgICAgaWYgKHBsYXllciAhPSAwKSB7CiAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSX0lOSVRJQUxJWkVEOwotICAgICAgICAgICAgcGxheWVyLT5nZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MoJm1DdXJyZW50QnVmZmVyaW5nU2V0dGluZ3MpOwogICAgICAgICAgICAgZXJyID0gTk9fRVJST1I7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ3VycmVudEJ1ZmZlcmluZ1NldHRpbmdzID0gQnVmZmVyaW5nU2V0dGluZ3MoKTsKICAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gY3JlYXRlIG1lZGlhIHBsYXllciIpOwogICAgICAgICB9CiAgICAgfQpAQCAtMjQ3LDE3ICsyNDcsNiBAQAogICAgIHJldHVybiBtUGxheWVyLT5zZXRWaWRlb1N1cmZhY2VUZXh0dXJlKGJ1ZmZlclByb2R1Y2VyKTsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OmdldERlZmF1bHRCdWZmZXJpbmdTZXR0aW5ncyhCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pCi17Ci0gICAgQUxPR1YoImdldERlZmF1bHRCdWZmZXJpbmdTZXR0aW5ncyIpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobVBsYXllciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbVBsYXllci0+Z2V0RGVmYXVsdEJ1ZmZlcmluZ1NldHRpbmdzKGJ1ZmZlcmluZyk7Ci19Ci0KIHN0YXR1c190IE1lZGlhUGxheWVyOjpnZXRCdWZmZXJpbmdTZXR0aW5ncyhCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pCiB7CiAgICAgQUxPR1YoImdldEJ1ZmZlcmluZ1NldHRpbmdzIik7CkBAIC0yNjYsOCArMjU1LDcgQEAKICAgICBpZiAobVBsYXllciA9PSAwKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICAqYnVmZmVyaW5nID0gbUN1cnJlbnRCdWZmZXJpbmdTZXR0aW5nczsKLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgcmV0dXJuIG1QbGF5ZXItPmdldEJ1ZmZlcmluZ1NldHRpbmdzKGJ1ZmZlcmluZyk7CiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyOjpzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKQpAQCAtMjc4LDExICsyNjYsNyBAQAogICAgIGlmIChtUGxheWVyID09IDApIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHN0YXR1c190IGVyciA9ICBtUGxheWVyLT5zZXRCdWZmZXJpbmdTZXR0aW5ncyhidWZmZXJpbmcpOwotICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgbUN1cnJlbnRCdWZmZXJpbmdTZXR0aW5ncyA9IGJ1ZmZlcmluZzsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKKyAgICByZXR1cm4gbVBsYXllci0+c2V0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nKTsKIH0KIAogLy8gbXVzdCBjYWxsIHdpdGggbG9jayBoZWxkCkBAIC02MDgsNiArNTkyLDE1IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorc3RhdHVzX3QgTWVkaWFQbGF5ZXI6Om5vdGlmeUF0KGludDY0X3QgbWVkaWFUaW1lVXMpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBsYXllciAhPSAwKSB7CisgICAgICAgIHJldHVybiBtUGxheWVyLT5ub3RpZnlBdChtZWRpYVRpbWVVcyk7CisgICAgfQorICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKwogc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OnJlc2V0X2woKQogewogICAgIG1Mb29wID0gZmFsc2U7CkBAIC02MjUsNyArNjE4LDYgQEAKICAgICAgICAgLy8gc2V0RGF0YVNvdXJjZSBoYXMgdG8gYmUgY2FsbGVkIGFnYWluIHRvIGNyZWF0ZSBhCiAgICAgICAgIC8vIG5ldyBtZWRpYXBsYXllci4KICAgICAgICAgbVBsYXllciA9IDA7Ci0gICAgICAgIG1DdXJyZW50QnVmZmVyaW5nU2V0dGluZ3MgPSBCdWZmZXJpbmdTZXR0aW5ncygpOwogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KICAgICBjbGVhcl9sKCk7CkBAIC02NDksOCArNjQxLDEyIEBACiBzdGF0dXNfdCBNZWRpYVBsYXllcjo6cmVzZXQoKQogewogICAgIEFMT0dWKCJyZXNldCIpOworICAgIG1Mb2NrVGhyZWFkSWQgPSBnZXRUaHJlYWRJZCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIHJlc2V0X2woKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSByZXNldF9sKCk7CisgICAgbUxvY2tUaHJlYWRJZCA9IDA7CisKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllcjo6c2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3QgdHlwZSkKQEAgLTg2MCw3ICs4NTYsNyBAQAogICAgIC8vIHRoaXMgd2lsbCBkZWFkbG9jay4KICAgICAvLwogICAgIC8vIFRoZSB0aHJlYWRJZCBoYWNrIGJlbG93IHdvcmtzIGFyb3VuZCB0aGlzIGZvciB0aGUgY2FyZSBvZiBwcmVwYXJlLAotICAgIC8vIHNlZWtUbyBhbmQgc3RhcnQgd2l0aGluIHRoZSBzYW1lIHByb2Nlc3MuCisgICAgLy8gc2Vla1RvLCBzdGFydCwgYW5kIHJlc2V0IHdpdGhpbiB0aGUgc2FtZSBwcm9jZXNzLgogICAgIC8vIEZJWE1FOiBSZW1lbWJlciwgdGhpcyBpcyBhIGhhY2ssIGl0J3Mgbm90IGV2ZW4gYSBoYWNrIHRoYXQgaXMgYXBwbGllZAogICAgIC8vIGNvbnNpc3RlbnRseSBmb3IgYWxsIHVzZS1jYXNlcywgdGhpcyBuZWVkcyB0byBiZSByZXZpc2l0ZWQuCiAgICAgaWYgKG1Mb2NrVGhyZWFkSWQgIT0gZ2V0VGhyZWFkSWQoKSkgewpAQCAtOTQ0LDYgKzk0MCw5IEBACiAgICAgICAgIG1WaWRlb1dpZHRoID0gZXh0MTsKICAgICAgICAgbVZpZGVvSGVpZ2h0ID0gZXh0MjsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRURJQV9OT1RJRllfVElNRToKKyAgICAgICAgQUxPR1YoIlJlY2VpdmVkIG5vdGlmeSB0aW1lIG1lc3NhZ2UiKTsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBNRURJQV9USU1FRF9URVhUOgogICAgICAgICBBTE9HVigiUmVjZWl2ZWQgdGltZWQgdGV4dCBtZXNzYWdlIik7CiAgICAgICAgIGJyZWFrOwpAQCAtMTA3Niw0ICsxMDc1LDM5IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAorc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OnNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QbGF5ZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlOiBwbGF5ZXIgbm90IGluaXQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtUGxheWVyLT5zZXRPdXRwdXREZXZpY2UoZGV2aWNlSWQpOworfQorCithdWRpb19wb3J0X2hhbmRsZV90IE1lZGlhUGxheWVyOjpnZXRSb3V0ZWREZXZpY2VJZCgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBsYXllciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJnZXRSb3V0ZWREZXZpY2VJZDogcGxheWVyIG5vdCBpbml0Iik7CisgICAgICAgIHJldHVybiBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIH0KKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1QbGF5ZXItPmdldFJvdXRlZERldmljZUlkKCZkZXZpY2VJZCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICB9CisgICAgcmV0dXJuIGRldmljZUlkOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjo6ZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBsYXllciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJhZGRBdWRpb0RldmljZUNhbGxiYWNrOiBwbGF5ZXIgbm90IGluaXQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtUGxheWVyLT5lbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGVuYWJsZWQpOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwCmluZGV4IDQ0MDU5MzAuLjcyMWEwNDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwCkBAIC03OTIsNCArNzkyLDUyIEBACiAgICAgbm90aWZ5KE1FRElBX1JFQ09SREVSX0VWRU5UX0VSUk9SLCBNRURJQV9FUlJPUl9TRVJWRVJfRElFRCwgMCk7CiB9CiAKK3N0YXR1c190IE1lZGlhUmVjb3JkZXI6OnNldElucHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpCit7CisgICAgQUxPR1YoInNldElucHV0RGV2aWNlIik7CisKKyAgICBpZiAobU1lZGlhUmVjb3JkZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgibWVkaWEgcmVjb3JkZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHJldHVybiBtTWVkaWFSZWNvcmRlci0+c2V0SW5wdXREZXZpY2UoZGV2aWNlSWQpOworfQorCitzdGF0dXNfdCBNZWRpYVJlY29yZGVyOjpnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCkKK3sKKyAgICBBTE9HVigiZ2V0Um91dGVkRGV2aWNlSWQiKTsKKworICAgIGlmIChtTWVkaWFSZWNvcmRlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJtZWRpYSByZWNvcmRlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0Iik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU1lZGlhUmVjb3JkZXItPmdldFJvdXRlZERldmljZUlkKGRldmljZUlkKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICpkZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IE1lZGlhUmVjb3JkZXI6OmVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKQoreworICAgIEFMT0dWKCJlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrIik7CisKKyAgICBpZiAobU1lZGlhUmVjb3JkZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgibWVkaWEgcmVjb3JkZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHJldHVybiBtTWVkaWFSZWNvcmRlci0+ZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhlbmFibGVkKTsKK30KKworc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6Z2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpCit7CisgICAgQUxPR1YoImdldEFjdGl2ZU1pY3JvcGhvbmVzIik7CisKKyAgICBpZiAobU1lZGlhUmVjb3JkZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgibWVkaWEgcmVjb3JkZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHJldHVybiBtTWVkaWFSZWNvcmRlci0+Z2V0QWN0aXZlTWljcm9waG9uZXMoYWN0aXZlTWljcm9waG9uZXMpOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWI0N2NkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvQW5kcm9pZC5icApAQCAtMCwwICsxLDUwIEBACitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGlibWVkaWFleHRyYWN0b3IiLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1Xbm8tbXVsdGljaGFyIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkRhdGFTb3VyY2VCYXNlLmNwcCIsCisgICAgICAgICJNZWRpYUJ1ZmZlci5jcHAiLAorICAgICAgICAiTWVkaWFCdWZmZXJCYXNlLmNwcCIsCisgICAgICAgICJNZWRpYUJ1ZmZlckdyb3VwLmNwcCIsCisgICAgICAgICJNZWRpYVNvdXJjZS5jcHAiLAorICAgICAgICAiTWVkaWFUcmFjay5jcHAiLAorICAgICAgICAiTWVkaWFFeHRyYWN0b3IuY3BwIiwKKyAgICAgICAgIk1ldGFEYXRhLmNwcCIsCisgICAgICAgICJNZXRhRGF0YUJhc2UuY3BwIiwKKyAgICAgICAgIlZvcmJpc0NvbW1lbnQuY3BwIiwKKyAgICBdLAorCisgICAgY2xhbmc6IHRydWUsCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBkaWFnOiB7CisgICAgICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL0RhdGFTb3VyY2VCYXNlLmNwcCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL0RhdGFTb3VyY2VCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjQ3ZWU1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvRGF0YVNvdXJjZUJhc2UuY3BwCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRGF0YVNvdXJjZUJhc2UiCisKKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworYm9vbCBEYXRhU291cmNlQmFzZTo6Z2V0VUludDE2KG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCkgeworICAgICp4ID0gMDsKKworICAgIHVpbnQ4X3QgYnl0ZVsyXTsKKyAgICBpZiAocmVhZEF0KG9mZnNldCwgYnl0ZSwgMikgIT0gMikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKnggPSAoYnl0ZVswXSA8PCA4KSB8IGJ5dGVbMV07CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEYXRhU291cmNlQmFzZTo6Z2V0VUludDI0KG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCkgeworICAgICp4ID0gMDsKKworICAgIHVpbnQ4X3QgYnl0ZVszXTsKKyAgICBpZiAocmVhZEF0KG9mZnNldCwgYnl0ZSwgMykgIT0gMykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKnggPSAoYnl0ZVswXSA8PCAxNikgfCAoYnl0ZVsxXSA8PCA4KSB8IGJ5dGVbMl07CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEYXRhU291cmNlQmFzZTo6Z2V0VUludDMyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCkgeworICAgICp4ID0gMDsKKworICAgIHVpbnQzMl90IHRtcDsKKyAgICBpZiAocmVhZEF0KG9mZnNldCwgJnRtcCwgNCkgIT0gNCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKnggPSBudG9obCh0bXApOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRGF0YVNvdXJjZUJhc2U6OmdldFVJbnQ2NChvZmY2NF90IG9mZnNldCwgdWludDY0X3QgKngpIHsKKyAgICAqeCA9IDA7CisKKyAgICB1aW50NjRfdCB0bXA7CisgICAgaWYgKHJlYWRBdChvZmZzZXQsICZ0bXAsIDgpICE9IDgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgICp4ID0gbnRvaDY0KHRtcCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEYXRhU291cmNlQmFzZTo6Z2V0VUludDE2VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoc2l6ZSA9PSAyKSB7CisgICAgICAgIHJldHVybiBnZXRVSW50MTYob2Zmc2V0LCB4KTsKKyAgICB9CisgICAgaWYgKHNpemUgPT0gMSkgeworICAgICAgICB1aW50OF90IHRtcDsKKyAgICAgICAgaWYgKHJlYWRBdChvZmZzZXQsICZ0bXAsIDEpID09IDEpIHsKKyAgICAgICAgICAgICp4ID0gdG1wOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIERhdGFTb3VyY2VCYXNlOjpnZXRVSW50MzJWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4LCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChzaXplID09IDQpIHsKKyAgICAgICAgcmV0dXJuIGdldFVJbnQzMihvZmZzZXQsIHgpOworICAgIH0KKyAgICBpZiAoc2l6ZSA9PSAyKSB7CisgICAgICAgIHVpbnQxNl90IHRtcDsKKyAgICAgICAgaWYgKGdldFVJbnQxNihvZmZzZXQsICZ0bXApKSB7CisgICAgICAgICAgICAqeCA9IHRtcDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBEYXRhU291cmNlQmFzZTo6Z2V0VUludDY0VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoc2l6ZSA9PSA4KSB7CisgICAgICAgIHJldHVybiBnZXRVSW50NjQob2Zmc2V0LCB4KTsKKyAgICB9CisgICAgaWYgKHNpemUgPT0gNCkgeworICAgICAgICB1aW50MzJfdCB0bXA7CisgICAgICAgIGlmIChnZXRVSW50MzIob2Zmc2V0LCAmdG1wKSkgeworICAgICAgICAgICAgKnggPSB0bXA7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IERhdGFTb3VyY2VCYXNlOjpnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKKyAgICAqc2l6ZSA9IDA7CisKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK2Jvb2wgRGF0YVNvdXJjZUJhc2U6OmdldFVyaShjaGFyICp1cmlTdHJpbmcgX191bnVzZWQsIHNpemVfdCBidWZmZXJTaXplIF9fdW51c2VkKSB7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFCdWZmZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFCdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZjhkNmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlci5jcHAKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk1lZGlhQnVmZmVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKiBzdGF0aWMgKi8KK3N0ZDo6YXRvbWljX2ludF9sZWFzdDMyX3QgTWVkaWFCdWZmZXI6Om1Vc2VTaGFyZWRNZW1vcnkoMCk7CisKK01lZGlhQnVmZmVyOjpNZWRpYUJ1ZmZlcih2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkKKyAgICA6IG1PYnNlcnZlcihOVUxMKSwKKyAgICAgIG1SZWZDb3VudCgwKSwKKyAgICAgIG1EYXRhKGRhdGEpLAorICAgICAgbVNpemUoc2l6ZSksCisgICAgICBtUmFuZ2VPZmZzZXQoMCksCisgICAgICBtUmFuZ2VMZW5ndGgoc2l6ZSksCisgICAgICBtT3duc0RhdGEoZmFsc2UpLAorICAgICAgbU1ldGFEYXRhKG5ldyBNZXRhRGF0YSksCisgICAgICBtT3JpZ2luYWwoTlVMTCkgeworfQorCitNZWRpYUJ1ZmZlcjo6TWVkaWFCdWZmZXIoc2l6ZV90IHNpemUpCisgICAgOiBtT2JzZXJ2ZXIoTlVMTCksCisgICAgICBtUmVmQ291bnQoMCksCisgICAgICBtRGF0YShOVUxMKSwKKyAgICAgIG1TaXplKHNpemUpLAorICAgICAgbVJhbmdlT2Zmc2V0KDApLAorICAgICAgbVJhbmdlTGVuZ3RoKHNpemUpLAorICAgICAgbU93bnNEYXRhKHRydWUpLAorICAgICAgbU1ldGFEYXRhKG5ldyBNZXRhRGF0YSksCisgICAgICBtT3JpZ2luYWwoTlVMTCkgeworICAgIGlmIChzaXplIDwga1NoYXJlZE1lbVRocmVzaG9sZAorICAgICAgICAgICAgfHwgc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCgmbVVzZVNoYXJlZE1lbW9yeSwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCkgPT0gMCkgeworICAgICAgICBtRGF0YSA9IG1hbGxvYyhzaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiY3JlYXRpbmcgbWVtb3J5RGVhbGVyIik7CisgICAgICAgIHNwPE1lbW9yeURlYWxlcj4gbWVtb3J5RGVhbGVyID0KKyAgICAgICAgICAgICAgICBuZXcgTWVtb3J5RGVhbGVyKHNpemUgKyBzaXplb2YoU2hhcmVkQ29udHJvbCksICJNZWRpYUJ1ZmZlciIpOworICAgICAgICBtTWVtb3J5ID0gbWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShzaXplICsgc2l6ZW9mKFNoYXJlZENvbnRyb2wpKTsKKyAgICAgICAgaWYgKG1NZW1vcnkgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBhbGxvY2F0ZSBzaGFyZWQgbWVtb3J5LCB0cnlpbmcgcmVndWxhciBhbGxvY2F0aW9uISIpOworICAgICAgICAgICAgbURhdGEgPSBtYWxsb2Moc2l6ZSk7CisgICAgICAgICAgICBpZiAobURhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJPdXQgb2YgbWVtb3J5Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZXRTaGFyZWRDb250cm9sKCktPmNsZWFyKCk7CisgICAgICAgICAgICBtRGF0YSA9ICh1aW50OF90ICopbU1lbW9yeS0+cG9pbnRlcigpICsgc2l6ZW9mKFNoYXJlZENvbnRyb2wpOworICAgICAgICAgICAgQUxPR1YoIkFsbG9jYXRlZCBzaGFyZWQgbWVtIGJ1ZmZlciBvZiBzaXplICV6dSBAICVwIiwgc2l6ZSwgbURhdGEpOworICAgICAgICB9CisgICAgfQorfQorCitNZWRpYUJ1ZmZlcjo6TWVkaWFCdWZmZXIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikKKyAgICA6IG1PYnNlcnZlcihOVUxMKSwKKyAgICAgIG1SZWZDb3VudCgwKSwKKyAgICAgIG1EYXRhKGJ1ZmZlci0+ZGF0YSgpKSwKKyAgICAgIG1TaXplKGJ1ZmZlci0+c2l6ZSgpKSwKKyAgICAgIG1SYW5nZU9mZnNldCgwKSwKKyAgICAgIG1SYW5nZUxlbmd0aChtU2l6ZSksCisgICAgICBtQnVmZmVyKGJ1ZmZlciksCisgICAgICBtT3duc0RhdGEoZmFsc2UpLAorICAgICAgbU1ldGFEYXRhKG5ldyBNZXRhRGF0YSksCisgICAgICBtT3JpZ2luYWwoTlVMTCkgeworfQorCit2b2lkIE1lZGlhQnVmZmVyOjpyZWxlYXNlKCkgeworICAgIGlmIChtT2JzZXJ2ZXIgPT0gTlVMTCkgeworICAgICAgICAvLyBMZWdhY3kgY29udHJhY3QgZm9yIE1lZGlhQnVmZmVyIHdpdGhvdXQgYSBNZWRpYUJ1ZmZlckdyb3VwLgorICAgICAgICBDSEVDS19FUShtUmVmQ291bnQsIDApOworICAgICAgICBkZWxldGUgdGhpczsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCBwcmV2Q291bnQgPSBfX3N5bmNfZmV0Y2hfYW5kX3N1YigmbVJlZkNvdW50LCAxKTsKKyAgICBpZiAocHJldkNvdW50ID09IDEpIHsKKyAgICAgICAgaWYgKG1PYnNlcnZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBkZWxldGUgdGhpczsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1PYnNlcnZlci0+c2lnbmFsQnVmZmVyUmV0dXJuZWQodGhpcyk7CisgICAgfQorICAgIENIRUNLKHByZXZDb3VudCA+IDApOworfQorCit2b2lkIE1lZGlhQnVmZmVyOjpjbGFpbSgpIHsKKyAgICBDSEVDSyhtT2JzZXJ2ZXIgIT0gTlVMTCk7CisgICAgQ0hFQ0tfRVEobVJlZkNvdW50LCAxKTsKKworICAgIG1SZWZDb3VudCA9IDA7Cit9CisKK3ZvaWQgTWVkaWFCdWZmZXI6OmFkZF9yZWYoKSB7CisgICAgKHZvaWQpIF9fc3luY19mZXRjaF9hbmRfYWRkKCZtUmVmQ291bnQsIDEpOworfQorCit2b2lkICpNZWRpYUJ1ZmZlcjo6ZGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbURhdGE7Cit9CisKK3NpemVfdCBNZWRpYUJ1ZmZlcjo6c2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVNpemU7Cit9CisKK3NpemVfdCBNZWRpYUJ1ZmZlcjo6cmFuZ2Vfb2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBtUmFuZ2VPZmZzZXQ7Cit9CisKK3NpemVfdCBNZWRpYUJ1ZmZlcjo6cmFuZ2VfbGVuZ3RoKCkgY29uc3QgeworICAgIHJldHVybiBtUmFuZ2VMZW5ndGg7Cit9CisKK3ZvaWQgTWVkaWFCdWZmZXI6OnNldF9yYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKSB7CisgICAgaWYgKG9mZnNldCArIGxlbmd0aCA+IG1TaXplKSB7CisgICAgICAgIEFMT0dFKCJvZmZzZXQgPSAlenUsIGxlbmd0aCA9ICV6dSwgbVNpemUgPSAlenUiLCBvZmZzZXQsIGxlbmd0aCwgbVNpemUpOworICAgIH0KKyAgICBDSEVDSyhvZmZzZXQgKyBsZW5ndGggPD0gbVNpemUpOworCisgICAgbVJhbmdlT2Zmc2V0ID0gb2Zmc2V0OworICAgIG1SYW5nZUxlbmd0aCA9IGxlbmd0aDsKK30KKworTWV0YURhdGFCYXNlJiBNZWRpYUJ1ZmZlcjo6bWV0YV9kYXRhKCkgeworICAgIHJldHVybiAqbU1ldGFEYXRhOworfQorCit2b2lkIE1lZGlhQnVmZmVyOjpyZXNldCgpIHsKKyAgICBtTWV0YURhdGEtPmNsZWFyKCk7CisgICAgc2V0X3JhbmdlKDAsIG1TaXplKTsKK30KKworTWVkaWFCdWZmZXI6On5NZWRpYUJ1ZmZlcigpIHsKKyAgICBDSEVDSyhtT2JzZXJ2ZXIgPT0gTlVMTCk7CisKKyAgICBpZiAobU93bnNEYXRhICYmIG1EYXRhICE9IE5VTEwgJiYgbU1lbW9yeSA9PSBOVUxMKSB7CisgICAgICAgIGZyZWUobURhdGEpOworICAgICAgICBtRGF0YSA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKG1PcmlnaW5hbCAhPSBOVUxMKSB7CisgICAgICAgIG1PcmlnaW5hbC0+cmVsZWFzZSgpOworICAgICAgICBtT3JpZ2luYWwgPSBOVUxMOworICAgIH0KKworICAgaWYgKG1NZW1vcnkuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgIGdldFNoYXJlZENvbnRyb2woKS0+c2V0RGVhZE9iamVjdCgpOworICAgfQorICAgZGVsZXRlIG1NZXRhRGF0YTsKK30KKwordm9pZCBNZWRpYUJ1ZmZlcjo6c2V0T2JzZXJ2ZXIoTWVkaWFCdWZmZXJPYnNlcnZlciAqb2JzZXJ2ZXIpIHsKKyAgICBDSEVDSyhvYnNlcnZlciA9PSBOVUxMIHx8IG1PYnNlcnZlciA9PSBOVUxMKTsKKyAgICBtT2JzZXJ2ZXIgPSBvYnNlcnZlcjsKK30KKworTWVkaWFCdWZmZXJCYXNlICpNZWRpYUJ1ZmZlcjo6Y2xvbmUoKSB7CisgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihtRGF0YSwgbVNpemUpOworICAgIGJ1ZmZlci0+c2V0X3JhbmdlKG1SYW5nZU9mZnNldCwgbVJhbmdlTGVuZ3RoKTsKKyAgICBidWZmZXItPm1NZXRhRGF0YSA9IG5ldyBNZXRhRGF0YUJhc2UoKm1NZXRhRGF0YSk7CisKKyAgICBhZGRfcmVmKCk7CisgICAgYnVmZmVyLT5tT3JpZ2luYWwgPSB0aGlzOworCisgICAgcmV0dXJuIGJ1ZmZlcjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhQnVmZmVyQmFzZS5jcHAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlckJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NTMyODkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlckJhc2UuY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFCdWZmZXJCYXNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvL3N0YXRpYworTWVkaWFCdWZmZXJCYXNlICpNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShzaXplX3Qgc2l6ZSkgeworICAgIHJldHVybiBuZXcgKHN0ZDo6bm90aHJvdykgTWVkaWFCdWZmZXIoc2l6ZSk7Cit9CisKK30gIC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhQnVmZmVyR3JvdXAuY3BwIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFCdWZmZXJHcm91cC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE4ZGQ0MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhQnVmZmVyR3JvdXAuY3BwCkBAIC0wLDAgKzEsMjI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNZWRpYUJ1ZmZlckdyb3VwIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bGlzdD4KKworI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzdGQ6Om1pbiBpcyBub3QgY29uc3RleHByIGluIEMrKzExCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY29uc3RleHByIFQgTUlOKGNvbnN0IFQgJmEsIGNvbnN0IFQgJmIpIHsgcmV0dXJuIGEgPD0gYiA/IGEgOiBiOyB9CisKKy8vIE1lZGlhQnVmZmVyR3JvdXAgbWF5IGNyZWF0ZSBzaGFyZWQgbWVtb3J5IGJ1ZmZlcnMgYXQgYQorLy8gc21hbGxlciB0aHJlc2hvbGQgdGhhbiBhbiBpc29sYXRlZCBuZXcgTWVkaWFCdWZmZXIuCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtTaGFyZWRNZW1vcnlUaHJlc2hvbGQgPSBNSU4oCisgICAgICAgIChzaXplX3QpTWVkaWFCdWZmZXI6OmtTaGFyZWRNZW1UaHJlc2hvbGQsIChzaXplX3QpKDQgKiAxMDI0KSk7CisKK3N0cnVjdCBNZWRpYUJ1ZmZlckdyb3VwOjpJbnRlcm5hbERhdGEgeworICAgIE11dGV4IG1Mb2NrOworICAgIENvbmRpdGlvbiBtQ29uZGl0aW9uOworICAgIHNpemVfdCBtR3Jvd3RoTGltaXQ7ICAvLyBEbyBub3QgYXV0b21hdGljYWxseSBncm93IGdyb3VwIGxhcmdlciB0aGFuIHRoaXMuCisgICAgc3RkOjpsaXN0PE1lZGlhQnVmZmVyQmFzZSAqPiBtQnVmZmVyczsKK307CisKK01lZGlhQnVmZmVyR3JvdXA6Ok1lZGlhQnVmZmVyR3JvdXAoc2l6ZV90IGdyb3d0aExpbWl0KQorICAgIDogbUludGVybmFsKG5ldyBJbnRlcm5hbERhdGEoKSkgeworICAgIG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0ID0gZ3Jvd3RoTGltaXQ7Cit9CisKK01lZGlhQnVmZmVyR3JvdXA6Ok1lZGlhQnVmZmVyR3JvdXAoc2l6ZV90IGJ1ZmZlcnMsIHNpemVfdCBidWZmZXJfc2l6ZSwgc2l6ZV90IGdyb3d0aExpbWl0KQorICAgIDogbUludGVybmFsKG5ldyBJbnRlcm5hbERhdGEoKSkgeworICAgIG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0ID0gZ3Jvd3RoTGltaXQ7CisKKyAgICBpZiAobUludGVybmFsLT5tR3Jvd3RoTGltaXQgPiAwICYmIGJ1ZmZlcnMgPiBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCkgeworICAgICAgICBBTE9HVygiUHJlYWxsb2NhdGVkIGJ1ZmZlcnMgJXp1ID4gZ3Jvd3RoTGltaXQgJXp1LCBpbmNyZWFzaW5nIGdyb3d0aExpbWl0IiwKKyAgICAgICAgICAgICAgICBidWZmZXJzLCBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCk7CisgICAgICAgIG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0ID0gYnVmZmVyczsKKyAgICB9CisKKyAgICBpZiAoYnVmZmVyX3NpemUgPj0ga1NoYXJlZE1lbW9yeVRocmVzaG9sZCkgeworICAgICAgICBBTE9HRCgiY3JlYXRpbmcgTWVtb3J5RGVhbGVyIik7CisgICAgICAgIC8vIFVzaW5nIGEgc2luZ2xlIE1lbW9yeURlYWxlciBpcyBlZmZpY2llbnQgZm9yIGEgZ3JvdXAgb2Ygc2hhcmVkIG1lbW9yeSBvYmplY3RzLgorICAgICAgICAvLyBUaGlzIGxvb3AgZ3VhcmFudGVlcyB0aGF0IHdlIHVzZSBzaGFyZWQgbWVtb3J5IChubyBmYWxsYmFjayB0byBtYWxsb2MpLgorCisgICAgICAgIHNpemVfdCBhbGlnbm1lbnQgPSBNZW1vcnlEZWFsZXI6OmdldEFsbG9jYXRpb25BbGlnbm1lbnQoKTsKKyAgICAgICAgc2l6ZV90IGF1Z21lbnRlZF9zaXplID0gYnVmZmVyX3NpemUgKyBzaXplb2YoTWVkaWFCdWZmZXI6OlNoYXJlZENvbnRyb2wpOworICAgICAgICBzaXplX3QgdG90YWwgPSAoYXVnbWVudGVkX3NpemUgKyBhbGlnbm1lbnQgLSAxKSAvIGFsaWdubWVudCAqIGFsaWdubWVudCAqIGJ1ZmZlcnM7CisgICAgICAgIHNwPE1lbW9yeURlYWxlcj4gbWVtb3J5RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcih0b3RhbCwgIk1lZGlhQnVmZmVyR3JvdXAiKTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ1ZmZlcnM7ICsraSkgeworICAgICAgICAgICAgc3A8SU1lbW9yeT4gbWVtID0gbWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShhdWdtZW50ZWRfc2l6ZSk7CisgICAgICAgICAgICBpZiAobWVtLmdldCgpID09IG51bGxwdHIgfHwgbWVtLT5wb2ludGVyKCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dXKCJPbmx5IGFsbG9jYXRlZCAlenUgc2hhcmVkIGJ1ZmZlcnMgb2Ygc2l6ZSAlenUiLCBpLCBidWZmZXJfc2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKG1lbSk7CisgICAgICAgICAgICBidWZmZXItPmdldFNoYXJlZENvbnRyb2woKS0+Y2xlYXIoKTsKKyAgICAgICAgICAgIGFkZF9idWZmZXIoYnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gTm9uLXNoYXJlZCBtZW1vcnkgYWxsb2NhdGlvbi4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ1ZmZlcnM7ICsraSkgeworICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKGJ1ZmZlcl9zaXplKTsKKyAgICAgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBidWZmZXI7IC8vIGRvbid0IGNhbGwgcmVsZWFzZSwgaXQncyBub3QgcHJvcGVybHkgZm9ybWVkCisgICAgICAgICAgICBBTE9HVygiT25seSBhbGxvY2F0ZWQgJXp1IG1hbGxvYyBidWZmZXJzIG9mIHNpemUgJXp1IiwgaSwgYnVmZmVyX3NpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYWRkX2J1ZmZlcihidWZmZXIpOworICAgIH0KK30KKworTWVkaWFCdWZmZXJHcm91cDo6fk1lZGlhQnVmZmVyR3JvdXAoKSB7CisgICAgZm9yIChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciA6IG1JbnRlcm5hbC0+bUJ1ZmZlcnMpIHsKKyAgICAgICAgaWYgKGJ1ZmZlci0+cmVmY291bnQoKSAhPSAwKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgbG9jYWxSZWZjb3VudCA9IGJ1ZmZlci0+bG9jYWxSZWZjb3VudCgpOworICAgICAgICAgICAgY29uc3QgaW50IHJlbW90ZVJlZmNvdW50ID0gYnVmZmVyLT5yZW1vdGVSZWZjb3VudCgpOworCisgICAgICAgICAgICAvLyBGYXRhbCBpZiB3ZSBoYXZlIGEgbG9jYWwgcmVmY291bnQuCisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGxvY2FsUmVmY291bnQgIT0gMCwKKyAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciglcCkgbG9jYWxSZWZjb3VudCAlZCAhPSAwLCByZW1vdGVSZWZjb3VudCAlZCIsCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgbG9jYWxSZWZjb3VudCwgcmVtb3RlUmVmY291bnQpOworCisgICAgICAgICAgICAvLyBMb2cgYW4gZXJyb3IgaWYgd2UgaGF2ZSBhIHJlbWFpbmluZyByZW1vdGUgcmVmY291bnQsCisgICAgICAgICAgICAvLyBhcyB0aGUgcmVtb3RlIHByb2Nlc3MgbWF5IGhhdmUgZGllZCBvciBtYXkgaGF2ZSBpbmFwcHJvcHJpYXRlIGJlaGF2aW9yLgorICAgICAgICAgICAgLy8gVGhlIHNoYXJlZCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBNZWRpYUJ1ZmZlciB3aWxsCisgICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGJlIHJlY2xhaW1lZCB3aGVuIHRoZXJlIGFyZSBubyByZW1haW5pbmcgZmRzCisgICAgICAgICAgICAvLyBhc3NvY2lhdGVkIHdpdGggaXQuCisgICAgICAgICAgICBBTE9HRSgiYnVmZmVyKCVwKSBoYXMgcmVzaWR1YWwgcmVtb3RlUmVmY291bnQgJWQiLAorICAgICAgICAgICAgICAgICAgICBidWZmZXIsIHJlbW90ZVJlZmNvdW50KTsKKyAgICAgICAgfQorICAgICAgICAvLyBncmFjZWZ1bGx5IGRlbGV0ZS4KKyAgICAgICAgYnVmZmVyLT5zZXRPYnNlcnZlcihudWxscHRyKTsKKyAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgfQorICAgIGRlbGV0ZSBtSW50ZXJuYWw7Cit9CisKK3ZvaWQgTWVkaWFCdWZmZXJHcm91cDo6YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtSW50ZXJuYWwtPm1Mb2NrKTsKKworICAgIC8vIGlmIHdlJ3JlIGFib3ZlIG91ciBncm93dGggbGltaXQsIHJlbGVhc2UgYnVmZmVycyBpZiB3ZSBjYW4KKyAgICBmb3IgKGF1dG8gaXQgPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmJlZ2luKCk7CisgICAgICAgICAgICBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCA+IDAKKyAgICAgICAgICAgICYmIG1JbnRlcm5hbC0+bUJ1ZmZlcnMuc2l6ZSgpID49IG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0CisgICAgICAgICAgICAmJiBpdCAhPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmVuZCgpOykgeworICAgICAgICBpZiAoKCppdCktPnJlZmNvdW50KCkgPT0gMCkgeworICAgICAgICAgICAgKCppdCktPnNldE9ic2VydmVyKG51bGxwdHIpOworICAgICAgICAgICAgKCppdCktPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGl0ID0gbUludGVybmFsLT5tQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICArK2l0OworICAgICAgICB9CisgICAgfQorCisgICAgYnVmZmVyLT5zZXRPYnNlcnZlcih0aGlzKTsKKyAgICBtSW50ZXJuYWwtPm1CdWZmZXJzLmVtcGxhY2VfYmFjayhidWZmZXIpOworfQorCitib29sIE1lZGlhQnVmZmVyR3JvdXA6Omhhc19idWZmZXJzKCkgeworICAgIGlmIChtSW50ZXJuYWwtPm1CdWZmZXJzLnNpemUoKSA8IG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0KSB7CisgICAgICAgIHJldHVybiB0cnVlOyAvLyBXZSBjYW4gYWRkIG1vcmUgYnVmZmVycyBpbnRlcm5hbGx5LgorICAgIH0KKyAgICBmb3IgKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyIDogbUludGVybmFsLT5tQnVmZmVycykgeworICAgICAgICBpZiAoYnVmZmVyLT5yZWZjb3VudCgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdHVzX3QgTWVkaWFCdWZmZXJHcm91cDo6YWNxdWlyZV9idWZmZXIoCisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgYm9vbCBub25CbG9ja2luZywgc2l6ZV90IHJlcXVlc3RlZFNpemUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUludGVybmFsLT5tTG9jayk7CisgICAgZm9yICg7OykgeworICAgICAgICBzaXplX3Qgc21hbGxlc3QgPSByZXF1ZXN0ZWRTaXplOworICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIGF1dG8gZnJlZSA9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW5kKCk7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuYmVnaW4oKTsgaXQgIT0gbUludGVybmFsLT5tQnVmZmVycy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgaWYgKCgqaXQpLT5yZWZjb3VudCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSA9ICgqaXQpLT5zaXplKCk7CisgICAgICAgICAgICAgICAgaWYgKHNpemUgPj0gcmVxdWVzdGVkU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSAqaXQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IHNtYWxsZXN0KSB7CisgICAgICAgICAgICAgICAgICAgIHNtYWxsZXN0ID0gc2l6ZTsgLy8gYWx3YXlzIGZyZWUgdGhlIHNtYWxsZXN0IGJ1ZgorICAgICAgICAgICAgICAgICAgICBmcmVlID0gaXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cgorICAgICAgICAgICAgICAgICYmIChmcmVlICE9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW5kKCkKKyAgICAgICAgICAgICAgICAgICAgfHwgbUludGVybmFsLT5tQnVmZmVycy5zaXplKCkgPCBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCkpIHsKKyAgICAgICAgICAgIC8vIFdlIGFsbG9jIGJlZm9yZSB3ZSBmcmVlIHNvIGZhaWx1cmUgbGVhdmVzIGdyb3VwIHVuY2hhbmdlZC4KKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhbGxvY2F0ZVNpemUgPSByZXF1ZXN0ZWRTaXplIDwgU0laRV9NQVggLyAzICogMiAvKiBOQjogb3JkZXJpbmcgKi8gPworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRTaXplICogMyAvIDIgOiByZXF1ZXN0ZWRTaXplOworICAgICAgICAgICAgYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKGFsbG9jYXRlU2l6ZSk7CisgICAgICAgICAgICBpZiAoYnVmZmVyLT5kYXRhKCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUgZm9yIHNpemUgJXp1IiwgYWxsb2NhdGVTaXplKTsKKyAgICAgICAgICAgICAgICBkZWxldGUgYnVmZmVyOyAvLyBJbnZhbGlkIGFsbG9jLCBwcmVmZXIgbm90IHRvIGNhbGwgcmVsZWFzZS4KKyAgICAgICAgICAgICAgICBidWZmZXIgPSBudWxscHRyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWZmZXItPnNldE9ic2VydmVyKHRoaXMpOworICAgICAgICAgICAgICAgIGlmIChmcmVlICE9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoInJlYWxsb2NhdGUgYnVmZmVyLCByZXF1ZXN0ZWQgc2l6ZSAlenUgdnMgYXZhaWxhYmxlICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkU2l6ZSwgKCpmcmVlKS0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgKCpmcmVlKS0+c2V0T2JzZXJ2ZXIobnVsbHB0cik7CisgICAgICAgICAgICAgICAgICAgICgqZnJlZSktPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgKmZyZWUgPSBidWZmZXI7IC8vIGluLXBsYWNlIHJlcGxhY2UKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiYWxsb2NhdGUgYnVmZmVyLCByZXF1ZXN0ZWQgc2l6ZSAlenUiLCByZXF1ZXN0ZWRTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbUludGVybmFsLT5tQnVmZmVycy5lbXBsYWNlX2JhY2soYnVmZmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBidWZmZXItPmFkZF9yZWYoKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVzZXQoKTsKKyAgICAgICAgICAgICpvdXQgPSBidWZmZXI7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vbkJsb2NraW5nKSB7CisgICAgICAgICAgICAqb3V0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICAgICAgfQorICAgICAgICAvLyBBbGwgYnVmZmVycyBhcmUgaW4gdXNlLCBibG9jayB1bnRpbCBvbmUgb2YgdGhlbSBpcyByZXR1cm5lZC4KKyAgICAgICAgbUludGVybmFsLT5tQ29uZGl0aW9uLndhaXQobUludGVybmFsLT5tTG9jayk7CisgICAgfQorICAgIC8vIE5ldmVyIGdldHMgaGVyZS4KK30KKworc2l6ZV90IE1lZGlhQnVmZmVyR3JvdXA6OmJ1ZmZlcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbnRlcm5hbC0+bUJ1ZmZlcnMuc2l6ZSgpOworfQorCit2b2lkIE1lZGlhQnVmZmVyR3JvdXA6OnNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyQmFzZSAqKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1JbnRlcm5hbC0+bUxvY2spOworICAgIG1JbnRlcm5hbC0+bUNvbmRpdGlvbi5zaWduYWwoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmIzZGM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1lZGlhRXh0cmFjdG9yIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHB3ZC5oPgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTWVkaWFFeHRyYWN0b3I6Ok1lZGlhRXh0cmFjdG9yKCkgeworICAgIGlmICghTE9HX05ERUJVRykgeworICAgICAgICB1aWRfdCB1aWQgPSBnZXR1aWQoKTsKKyAgICAgICAgc3RydWN0IHBhc3N3ZCAqcHcgPSBnZXRwd3VpZCh1aWQpOworICAgICAgICBBTE9HVigiZXh0cmFjdG9yIGNyZWF0ZWQgaW4gdWlkOiAlZCAoJXMpIiwgZ2V0dWlkKCksIHB3LT5wd19uYW1lKTsKKyAgICB9Cit9CisKK01lZGlhRXh0cmFjdG9yOjp+TWVkaWFFeHRyYWN0b3IoKSB7fQorCit1aW50MzJfdCBNZWRpYUV4dHJhY3Rvcjo6ZmxhZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9QQVVTRSB8IENBTl9TRUVLOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFTb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYmQzZDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYVNvdXJjZS5jcHAKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVNvdXJjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK01lZGlhU291cmNlOjpNZWRpYVNvdXJjZSgpIHt9CisKK01lZGlhU291cmNlOjp+TWVkaWFTb3VyY2UoKSB7fQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFUcmFjay5jcHAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYVRyYWNrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTYzZjU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFUcmFjay5jcHAKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTWVkaWFUcmFjazo6TWVkaWFUcmFjaygpIHt9CisKK01lZGlhVHJhY2s6On5NZWRpYVRyYWNrKCkge30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OlJlYWRPcHRpb25zKCkgeworICAgIHJlc2V0KCk7Cit9CisKK3ZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OnJlc2V0KCkgeworICAgIG1PcHRpb25zID0gMDsKKyAgICBtU2Vla1RpbWVVcyA9IDA7CisgICAgbU5vbkJsb2NraW5nID0gZmFsc2U7Cit9CisKK3ZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OnNldE5vbkJsb2NraW5nKCkgeworICAgIG1Ob25CbG9ja2luZyA9IHRydWU7Cit9CisKK3ZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OmNsZWFyTm9uQmxvY2tpbmcoKSB7CisgICAgbU5vbkJsb2NraW5nID0gZmFsc2U7Cit9CisKK2Jvb2wgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OmdldE5vbkJsb2NraW5nKCkgY29uc3QgeworICAgIHJldHVybiBtTm9uQmxvY2tpbmc7Cit9CisKK3ZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OnNldFNlZWtUbyhpbnQ2NF90IHRpbWVfdXMsIFNlZWtNb2RlIG1vZGUpIHsKKyAgICBtT3B0aW9ucyB8PSBrU2Vla1RvX09wdGlvbjsKKyAgICBtU2Vla1RpbWVVcyA9IHRpbWVfdXM7CisgICAgbVNlZWtNb2RlID0gbW9kZTsKK30KKwordm9pZCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6Y2xlYXJTZWVrVG8oKSB7CisgICAgbU9wdGlvbnMgJj0gfmtTZWVrVG9fT3B0aW9uOworICAgIG1TZWVrVGltZVVzID0gMDsKKyAgICBtU2Vla01vZGUgPSBTRUVLX0NMT1NFU1RfU1lOQzsKK30KKworYm9vbCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6Z2V0U2Vla1RvKAorICAgICAgICBpbnQ2NF90ICp0aW1lX3VzLCBTZWVrTW9kZSAqbW9kZSkgY29uc3QgeworICAgICp0aW1lX3VzID0gbVNlZWtUaW1lVXM7CisgICAgKm1vZGUgPSBtU2Vla01vZGU7CisgICAgcmV0dXJuIChtT3B0aW9ucyAmIGtTZWVrVG9fT3B0aW9uKSAhPSAwOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWV0YURhdGEuY3BwIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWV0YURhdGEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMGE2MDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZXRhRGF0YS5jcHAKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWV0YURhdGEiCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKworTWV0YURhdGE6Ok1ldGFEYXRhKCkgeworfQorCitNZXRhRGF0YTo6TWV0YURhdGEoY29uc3QgTWV0YURhdGEgJmZyb20pCisgICAgOiBNZXRhRGF0YUJhc2UoZnJvbSkgeworfQorTWV0YURhdGE6Ok1ldGFEYXRhKGNvbnN0IE1ldGFEYXRhQmFzZSAmZnJvbSkKKyAgICA6IE1ldGFEYXRhQmFzZShmcm9tKSB7Cit9CisKK01ldGFEYXRhOjp+TWV0YURhdGEoKSB7Cit9CisKKy8qIHN0YXRpYyAqLworc3A8TWV0YURhdGE+IE1ldGFEYXRhOjpjcmVhdGVGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKSB7CisKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YSgpOworICAgIG1ldGEtPnVwZGF0ZUZyb21QYXJjZWwocGFyY2VsKTsKKyAgICByZXR1cm4gbWV0YTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWV0YURhdGFCYXNlLmNwcCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01ldGFEYXRhQmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZlYTZmMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01ldGFEYXRhQmFzZS5jcHAKQEAgLTAsMCArMSw1MzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1ldGFEYXRhQmFzZSIKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBNZXRhRGF0YUJhc2U6OnR5cGVkX2RhdGEgeworICAgIHR5cGVkX2RhdGEoKTsKKyAgICB+dHlwZWRfZGF0YSgpOworCisgICAgdHlwZWRfZGF0YShjb25zdCBNZXRhRGF0YUJhc2U6OnR5cGVkX2RhdGEgJik7CisgICAgdHlwZWRfZGF0YSAmb3BlcmF0b3I9KGNvbnN0IE1ldGFEYXRhQmFzZTo6dHlwZWRfZGF0YSAmKTsKKworICAgIHZvaWQgY2xlYXIoKTsKKyAgICB2b2lkIHNldERhdGEodWludDMyX3QgdHlwZSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZvaWQgZ2V0RGF0YSh1aW50MzJfdCAqdHlwZSwgY29uc3Qgdm9pZCAqKmRhdGEsIHNpemVfdCAqc2l6ZSkgY29uc3Q7CisgICAgLy8gbWF5IGluY2x1ZGUgaGV4ZHVtcCBvZiBiaW5hcnkgZGF0YSBpZiB2ZXJib3NlPXRydWUKKyAgICBTdHJpbmc4IGFzU3RyaW5nKGJvb2wgdmVyYm9zZSkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgdWludDMyX3QgbVR5cGU7CisgICAgc2l6ZV90IG1TaXplOworCisgICAgdW5pb24geworICAgICAgICB2b2lkICpleHRfZGF0YTsKKyAgICAgICAgZmxvYXQgcmVzZXJ2b2lyOworICAgIH0gdTsKKworICAgIGJvb2wgdXNlc1Jlc2Vydm9pcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TaXplIDw9IHNpemVvZih1LnJlc2Vydm9pcik7CisgICAgfQorCisgICAgdm9pZCAqYWxsb2NhdGVTdG9yYWdlKHNpemVfdCBzaXplKTsKKyAgICB2b2lkIGZyZWVTdG9yYWdlKCk7CisKKyAgICB2b2lkICpzdG9yYWdlKCkgeworICAgICAgICByZXR1cm4gdXNlc1Jlc2Vydm9pcigpID8gJnUucmVzZXJ2b2lyIDogdS5leHRfZGF0YTsKKyAgICB9CisKKyAgICBjb25zdCB2b2lkICpzdG9yYWdlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gdXNlc1Jlc2Vydm9pcigpID8gJnUucmVzZXJ2b2lyIDogdS5leHRfZGF0YTsKKyAgICB9Cit9OworCitzdHJ1Y3QgTWV0YURhdGFCYXNlOjpSZWN0IHsKKyAgICBpbnQzMl90IG1MZWZ0LCBtVG9wLCBtUmlnaHQsIG1Cb3R0b207Cit9OworCisKK3N0cnVjdCBNZXRhRGF0YUJhc2U6Ok1ldGFEYXRhSW50ZXJuYWwgeworICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBNZXRhRGF0YUJhc2U6OnR5cGVkX2RhdGE+IG1JdGVtczsKK307CisKKworTWV0YURhdGFCYXNlOjpNZXRhRGF0YUJhc2UoKQorICAgIDogbUludGVybmFsRGF0YShuZXcgTWV0YURhdGFJbnRlcm5hbCgpKSB7Cit9CisKK01ldGFEYXRhQmFzZTo6TWV0YURhdGFCYXNlKGNvbnN0IE1ldGFEYXRhQmFzZSAmZnJvbSkKKyAgICA6IG1JbnRlcm5hbERhdGEobmV3IE1ldGFEYXRhSW50ZXJuYWwoKSkgeworICAgIG1JbnRlcm5hbERhdGEtPm1JdGVtcyA9IGZyb20ubUludGVybmFsRGF0YS0+bUl0ZW1zOworfQorCitNZXRhRGF0YUJhc2UmIE1ldGFEYXRhQmFzZTo6b3BlcmF0b3IgPSAoY29uc3QgTWV0YURhdGFCYXNlICZyaHMpIHsKKyAgICB0aGlzLT5tSW50ZXJuYWxEYXRhLT5tSXRlbXMgPSByaHMubUludGVybmFsRGF0YS0+bUl0ZW1zOworICAgIHJldHVybiAqdGhpczsKK30KKworTWV0YURhdGFCYXNlOjp+TWV0YURhdGFCYXNlKCkgeworICAgIGNsZWFyKCk7CisgICAgZGVsZXRlIG1JbnRlcm5hbERhdGE7Cit9CisKK3ZvaWQgTWV0YURhdGFCYXNlOjpjbGVhcigpIHsKKyAgICBtSW50ZXJuYWxEYXRhLT5tSXRlbXMuY2xlYXIoKTsKK30KKworYm9vbCBNZXRhRGF0YUJhc2U6OnJlbW92ZSh1aW50MzJfdCBrZXkpIHsKKyAgICBzc2l6ZV90IGkgPSBtSW50ZXJuYWxEYXRhLT5tSXRlbXMuaW5kZXhPZktleShrZXkpOworCisgICAgaWYgKGkgPCAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtSW50ZXJuYWxEYXRhLT5tSXRlbXMucmVtb3ZlSXRlbXNBdChpKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE1ldGFEYXRhQmFzZTo6c2V0Q1N0cmluZyh1aW50MzJfdCBrZXksIGNvbnN0IGNoYXIgKnZhbHVlKSB7CisgICAgcmV0dXJuIHNldERhdGEoa2V5LCBUWVBFX0NfU1RSSU5HLCB2YWx1ZSwgc3RybGVuKHZhbHVlKSArIDEpOworfQorCitib29sIE1ldGFEYXRhQmFzZTo6c2V0SW50MzIodWludDMyX3Qga2V5LCBpbnQzMl90IHZhbHVlKSB7CisgICAgcmV0dXJuIHNldERhdGEoa2V5LCBUWVBFX0lOVDMyLCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOworfQorCitib29sIE1ldGFEYXRhQmFzZTo6c2V0SW50NjQodWludDMyX3Qga2V5LCBpbnQ2NF90IHZhbHVlKSB7CisgICAgcmV0dXJuIHNldERhdGEoa2V5LCBUWVBFX0lOVDY0LCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOworfQorCitib29sIE1ldGFEYXRhQmFzZTo6c2V0RmxvYXQodWludDMyX3Qga2V5LCBmbG9hdCB2YWx1ZSkgeworICAgIHJldHVybiBzZXREYXRhKGtleSwgVFlQRV9GTE9BVCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKK30KKworYm9vbCBNZXRhRGF0YUJhc2U6OnNldFBvaW50ZXIodWludDMyX3Qga2V5LCB2b2lkICp2YWx1ZSkgeworICAgIHJldHVybiBzZXREYXRhKGtleSwgVFlQRV9QT0lOVEVSLCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOworfQorCitib29sIE1ldGFEYXRhQmFzZTo6c2V0UmVjdCgKKyAgICAgICAgdWludDMyX3Qga2V5LAorICAgICAgICBpbnQzMl90IGxlZnQsIGludDMyX3QgdG9wLAorICAgICAgICBpbnQzMl90IHJpZ2h0LCBpbnQzMl90IGJvdHRvbSkgeworICAgIFJlY3QgcjsKKyAgICByLm1MZWZ0ID0gbGVmdDsKKyAgICByLm1Ub3AgPSB0b3A7CisgICAgci5tUmlnaHQgPSByaWdodDsKKyAgICByLm1Cb3R0b20gPSBib3R0b207CisKKyAgICByZXR1cm4gc2V0RGF0YShrZXksIFRZUEVfUkVDVCwgJnIsIHNpemVvZihyKSk7Cit9CisKKy8qKgorICogTm90ZSB0aGF0IHRoZSByZXR1cm5lZCBwb2ludGVyIGJlY29tZXMgaW52YWxpZCB3aGVuIGFkZGl0aW9uYWwgbWV0YWRhdGEgaXMgc2V0LgorICovCitib29sIE1ldGFEYXRhQmFzZTo6ZmluZENTdHJpbmcodWludDMyX3Qga2V5LCBjb25zdCBjaGFyICoqdmFsdWUpIGNvbnN0IHsKKyAgICB1aW50MzJfdCB0eXBlOworICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgc2l6ZV90IHNpemU7CisgICAgaWYgKCFmaW5kRGF0YShrZXksICZ0eXBlLCAmZGF0YSwgJnNpemUpIHx8IHR5cGUgIT0gVFlQRV9DX1NUUklORykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKnZhbHVlID0gKGNvbnN0IGNoYXIgKilkYXRhOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTWV0YURhdGFCYXNlOjpmaW5kSW50MzIodWludDMyX3Qga2V5LCBpbnQzMl90ICp2YWx1ZSkgY29uc3QgeworICAgIHVpbnQzMl90IHR5cGUgPSAwOworICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgc2l6ZV90IHNpemU7CisgICAgaWYgKCFmaW5kRGF0YShrZXksICZ0eXBlLCAmZGF0YSwgJnNpemUpIHx8IHR5cGUgIT0gVFlQRV9JTlQzMikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQ0hFQ0tfRVEoc2l6ZSwgc2l6ZW9mKCp2YWx1ZSkpOworCisgICAgKnZhbHVlID0gKihpbnQzMl90ICopZGF0YTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE1ldGFEYXRhQmFzZTo6ZmluZEludDY0KHVpbnQzMl90IGtleSwgaW50NjRfdCAqdmFsdWUpIGNvbnN0IHsKKyAgICB1aW50MzJfdCB0eXBlID0gMDsKKyAgICBjb25zdCB2b2lkICpkYXRhOworICAgIHNpemVfdCBzaXplOworICAgIGlmICghZmluZERhdGEoa2V5LCAmdHlwZSwgJmRhdGEsICZzaXplKSB8fCB0eXBlICE9IFRZUEVfSU5UNjQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIENIRUNLX0VRKHNpemUsIHNpemVvZigqdmFsdWUpKTsKKworICAgICp2YWx1ZSA9ICooaW50NjRfdCAqKWRhdGE7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNZXRhRGF0YUJhc2U6OmZpbmRGbG9hdCh1aW50MzJfdCBrZXksIGZsb2F0ICp2YWx1ZSkgY29uc3QgeworICAgIHVpbnQzMl90IHR5cGUgPSAwOworICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgc2l6ZV90IHNpemU7CisgICAgaWYgKCFmaW5kRGF0YShrZXksICZ0eXBlLCAmZGF0YSwgJnNpemUpIHx8IHR5cGUgIT0gVFlQRV9GTE9BVCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQ0hFQ0tfRVEoc2l6ZSwgc2l6ZW9mKCp2YWx1ZSkpOworCisgICAgKnZhbHVlID0gKihmbG9hdCAqKWRhdGE7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNZXRhRGF0YUJhc2U6OmZpbmRQb2ludGVyKHVpbnQzMl90IGtleSwgdm9pZCAqKnZhbHVlKSBjb25zdCB7CisgICAgdWludDMyX3QgdHlwZSA9IDA7CisgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBpZiAoIWZpbmREYXRhKGtleSwgJnR5cGUsICZkYXRhLCAmc2l6ZSkgfHwgdHlwZSAhPSBUWVBFX1BPSU5URVIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIENIRUNLX0VRKHNpemUsIHNpemVvZigqdmFsdWUpKTsKKworICAgICp2YWx1ZSA9ICoodm9pZCAqKilkYXRhOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTWV0YURhdGFCYXNlOjpmaW5kUmVjdCgKKyAgICAgICAgdWludDMyX3Qga2V5LAorICAgICAgICBpbnQzMl90ICpsZWZ0LCBpbnQzMl90ICp0b3AsCisgICAgICAgIGludDMyX3QgKnJpZ2h0LCBpbnQzMl90ICpib3R0b20pIGNvbnN0IHsKKyAgICB1aW50MzJfdCB0eXBlID0gMDsKKyAgICBjb25zdCB2b2lkICpkYXRhOworICAgIHNpemVfdCBzaXplOworICAgIGlmICghZmluZERhdGEoa2V5LCAmdHlwZSwgJmRhdGEsICZzaXplKSB8fCB0eXBlICE9IFRZUEVfUkVDVCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQ0hFQ0tfRVEoc2l6ZSwgc2l6ZW9mKFJlY3QpKTsKKworICAgIGNvbnN0IFJlY3QgKnIgPSAoY29uc3QgUmVjdCAqKWRhdGE7CisgICAgKmxlZnQgPSByLT5tTGVmdDsKKyAgICAqdG9wID0gci0+bVRvcDsKKyAgICAqcmlnaHQgPSByLT5tUmlnaHQ7CisgICAgKmJvdHRvbSA9IHItPm1Cb3R0b207CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNZXRhRGF0YUJhc2U6OnNldERhdGEoCisgICAgICAgIHVpbnQzMl90IGtleSwgdWludDMyX3QgdHlwZSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBib29sIG92ZXJ3cm90ZV9leGlzdGluZyA9IHRydWU7CisKKyAgICBzc2l6ZV90IGkgPSBtSW50ZXJuYWxEYXRhLT5tSXRlbXMuaW5kZXhPZktleShrZXkpOworICAgIGlmIChpIDwgMCkgeworICAgICAgICB0eXBlZF9kYXRhIGl0ZW07CisgICAgICAgIGkgPSBtSW50ZXJuYWxEYXRhLT5tSXRlbXMuYWRkKGtleSwgaXRlbSk7CisKKyAgICAgICAgb3Zlcndyb3RlX2V4aXN0aW5nID0gZmFsc2U7CisgICAgfQorCisgICAgdHlwZWRfZGF0YSAmaXRlbSA9IG1JbnRlcm5hbERhdGEtPm1JdGVtcy5lZGl0VmFsdWVBdChpKTsKKworICAgIGl0ZW0uc2V0RGF0YSh0eXBlLCBkYXRhLCBzaXplKTsKKworICAgIHJldHVybiBvdmVyd3JvdGVfZXhpc3Rpbmc7Cit9CisKK2Jvb2wgTWV0YURhdGFCYXNlOjpmaW5kRGF0YSh1aW50MzJfdCBrZXksIHVpbnQzMl90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqKmRhdGEsIHNpemVfdCAqc2l6ZSkgY29uc3QgeworICAgIHNzaXplX3QgaSA9IG1JbnRlcm5hbERhdGEtPm1JdGVtcy5pbmRleE9mS2V5KGtleSk7CisKKyAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IHR5cGVkX2RhdGEgJml0ZW0gPSBtSW50ZXJuYWxEYXRhLT5tSXRlbXMudmFsdWVBdChpKTsKKworICAgIGl0ZW0uZ2V0RGF0YSh0eXBlLCBkYXRhLCBzaXplKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE1ldGFEYXRhQmFzZTo6aGFzRGF0YSh1aW50MzJfdCBrZXkpIGNvbnN0IHsKKyAgICBzc2l6ZV90IGkgPSBtSW50ZXJuYWxEYXRhLT5tSXRlbXMuaW5kZXhPZktleShrZXkpOworCisgICAgaWYgKGkgPCAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworTWV0YURhdGFCYXNlOjp0eXBlZF9kYXRhOjp0eXBlZF9kYXRhKCkKKyAgICA6IG1UeXBlKDApLAorICAgICAgbVNpemUoMCkgeworfQorCitNZXRhRGF0YUJhc2U6OnR5cGVkX2RhdGE6On50eXBlZF9kYXRhKCkgeworICAgIGNsZWFyKCk7Cit9CisKK01ldGFEYXRhQmFzZTo6dHlwZWRfZGF0YTo6dHlwZWRfZGF0YShjb25zdCB0eXBlZF9kYXRhICZmcm9tKQorICAgIDogbVR5cGUoZnJvbS5tVHlwZSksCisgICAgICBtU2l6ZSgwKSB7CisKKyAgICB2b2lkICpkc3QgPSBhbGxvY2F0ZVN0b3JhZ2UoZnJvbS5tU2l6ZSk7CisgICAgaWYgKGRzdCkgeworICAgICAgICBtZW1jcHkoZHN0LCBmcm9tLnN0b3JhZ2UoKSwgbVNpemUpOworICAgIH0KK30KKworTWV0YURhdGFCYXNlOjp0eXBlZF9kYXRhICZNZXRhRGF0YUJhc2U6OnR5cGVkX2RhdGE6Om9wZXJhdG9yPSgKKyAgICAgICAgY29uc3QgTWV0YURhdGFCYXNlOjp0eXBlZF9kYXRhICZmcm9tKSB7CisgICAgaWYgKHRoaXMgIT0gJmZyb20pIHsKKyAgICAgICAgY2xlYXIoKTsKKyAgICAgICAgbVR5cGUgPSBmcm9tLm1UeXBlOworICAgICAgICB2b2lkICpkc3QgPSBhbGxvY2F0ZVN0b3JhZ2UoZnJvbS5tU2l6ZSk7CisgICAgICAgIGlmIChkc3QpIHsKKyAgICAgICAgICAgIG1lbWNweShkc3QsIGZyb20uc3RvcmFnZSgpLCBtU2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3ZvaWQgTWV0YURhdGFCYXNlOjp0eXBlZF9kYXRhOjpjbGVhcigpIHsKKyAgICBmcmVlU3RvcmFnZSgpOworCisgICAgbVR5cGUgPSAwOworfQorCit2b2lkIE1ldGFEYXRhQmFzZTo6dHlwZWRfZGF0YTo6c2V0RGF0YSgKKyAgICAgICAgdWludDMyX3QgdHlwZSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBjbGVhcigpOworCisgICAgbVR5cGUgPSB0eXBlOworCisgICAgdm9pZCAqZHN0ID0gYWxsb2NhdGVTdG9yYWdlKHNpemUpOworICAgIGlmIChkc3QpIHsKKyAgICAgICAgbWVtY3B5KGRzdCwgZGF0YSwgc2l6ZSk7CisgICAgfQorfQorCit2b2lkIE1ldGFEYXRhQmFzZTo6dHlwZWRfZGF0YTo6Z2V0RGF0YSgKKyAgICAgICAgdWludDMyX3QgKnR5cGUsIGNvbnN0IHZvaWQgKipkYXRhLCBzaXplX3QgKnNpemUpIGNvbnN0IHsKKyAgICAqdHlwZSA9IG1UeXBlOworICAgICpzaXplID0gbVNpemU7CisgICAgKmRhdGEgPSBzdG9yYWdlKCk7Cit9CisKK3ZvaWQgKk1ldGFEYXRhQmFzZTo6dHlwZWRfZGF0YTo6YWxsb2NhdGVTdG9yYWdlKHNpemVfdCBzaXplKSB7CisgICAgbVNpemUgPSBzaXplOworCisgICAgaWYgKHVzZXNSZXNlcnZvaXIoKSkgeworICAgICAgICByZXR1cm4gJnUucmVzZXJ2b2lyOworICAgIH0KKworICAgIHUuZXh0X2RhdGEgPSBtYWxsb2MobVNpemUpOworICAgIGlmICh1LmV4dF9kYXRhID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkNvdWxkbid0IGFsbG9jYXRlICV6dSBieXRlcyBmb3IgaXRlbSIsIHNpemUpOworICAgICAgICBtU2l6ZSA9IDA7CisgICAgfQorICAgIHJldHVybiB1LmV4dF9kYXRhOworfQorCit2b2lkIE1ldGFEYXRhQmFzZTo6dHlwZWRfZGF0YTo6ZnJlZVN0b3JhZ2UoKSB7CisgICAgaWYgKCF1c2VzUmVzZXJ2b2lyKCkpIHsKKyAgICAgICAgaWYgKHUuZXh0X2RhdGEpIHsKKyAgICAgICAgICAgIGZyZWUodS5leHRfZGF0YSk7CisgICAgICAgICAgICB1LmV4dF9kYXRhID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1TaXplID0gMDsKK30KKworU3RyaW5nOCBNZXRhRGF0YUJhc2U6OnR5cGVkX2RhdGE6OmFzU3RyaW5nKGJvb2wgdmVyYm9zZSkgY29uc3QgeworICAgIFN0cmluZzggb3V0OworICAgIGNvbnN0IHZvaWQgKmRhdGEgPSBzdG9yYWdlKCk7CisgICAgc3dpdGNoKG1UeXBlKSB7CisgICAgICAgIGNhc2UgVFlQRV9OT05FOgorICAgICAgICAgICAgb3V0ID0gU3RyaW5nODo6Zm9ybWF0KCJubyB0eXBlLCBzaXplICV6dSkiLCBtU2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUWVBFX0NfU1RSSU5HOgorICAgICAgICAgICAgb3V0ID0gU3RyaW5nODo6Zm9ybWF0KCIoY2hhciopICVzIiwgKGNvbnN0IGNoYXIgKilkYXRhKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRZUEVfSU5UMzI6CisgICAgICAgICAgICBvdXQgPSBTdHJpbmc4Ojpmb3JtYXQoIihpbnQzMl90KSAlZCIsICooaW50MzJfdCAqKWRhdGEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVFlQRV9JTlQ2NDoKKyAgICAgICAgICAgIG91dCA9IFN0cmluZzg6OmZvcm1hdCgiKGludDY0X3QpICUiIFBSSWQ2NCwgKihpbnQ2NF90ICopZGF0YSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUWVBFX0ZMT0FUOgorICAgICAgICAgICAgb3V0ID0gU3RyaW5nODo6Zm9ybWF0KCIoZmxvYXQpICVmIiwgKihmbG9hdCAqKWRhdGEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVFlQRV9QT0lOVEVSOgorICAgICAgICAgICAgb3V0ID0gU3RyaW5nODo6Zm9ybWF0KCIodm9pZCopICVwIiwgKih2b2lkICoqKWRhdGEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVFlQRV9SRUNUOgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBSZWN0ICpyID0gKGNvbnN0IFJlY3QgKilkYXRhOworICAgICAgICAgICAgb3V0ID0gU3RyaW5nODo6Zm9ybWF0KCJSZWN0KCVkLCAlZCwgJWQsICVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+bUxlZnQsIHItPm1Ub3AsIHItPm1SaWdodCwgci0+bUJvdHRvbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBvdXQgPSBTdHJpbmc4Ojpmb3JtYXQoIih1bmtub3duIHR5cGUgJWQsIHNpemUgJXp1KSIsIG1UeXBlLCBtU2l6ZSk7CisgICAgICAgICAgICBpZiAodmVyYm9zZSAmJiBtU2l6ZSA8PSA0OCkgeyAvLyBpZiBpdCdzIGxlc3MgdGhhbiB0aHJlZSBsaW5lcyBvZiBoZXggZGF0YSwgZHVtcCBpdAorICAgICAgICAgICAgICAgIEFTdHJpbmcgZm9vOworICAgICAgICAgICAgICAgIGhleGR1bXAoZGF0YSwgbVNpemUsIDAsICZmb28pOworICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChmb28uY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIG91dDsKK30KKworc3RhdGljIHZvaWQgTWFrZUZvdXJDQ1N0cmluZyh1aW50MzJfdCB4LCBjaGFyICpzKSB7CisgICAgc1swXSA9IHggPj4gMjQ7CisgICAgc1sxXSA9ICh4ID4+IDE2KSAmIDB4ZmY7CisgICAgc1syXSA9ICh4ID4+IDgpICYgMHhmZjsKKyAgICBzWzNdID0geCAmIDB4ZmY7CisgICAgc1s0XSA9ICdcMCc7Cit9CisKK1N0cmluZzggTWV0YURhdGFCYXNlOjp0b1N0cmluZygpIGNvbnN0IHsKKyAgICBTdHJpbmc4IHM7CisgICAgZm9yIChpbnQgaSA9IG1JbnRlcm5hbERhdGEtPm1JdGVtcy5zaXplKCk7IC0taSA+PSAwOykgeworICAgICAgICBpbnQzMl90IGtleSA9IG1JbnRlcm5hbERhdGEtPm1JdGVtcy5rZXlBdChpKTsKKyAgICAgICAgY2hhciBjY1s1XTsKKyAgICAgICAgTWFrZUZvdXJDQ1N0cmluZyhrZXksIGNjKTsKKyAgICAgICAgY29uc3QgdHlwZWRfZGF0YSAmaXRlbSA9IG1JbnRlcm5hbERhdGEtPm1JdGVtcy52YWx1ZUF0KGkpOworICAgICAgICBzLmFwcGVuZEZvcm1hdCgiJXM6ICVzIiwgY2MsIGl0ZW0uYXNTdHJpbmcoZmFsc2UpLnN0cmluZygpKTsKKyAgICAgICAgaWYgKGkgIT0gMCkgeworICAgICAgICAgICAgcy5hcHBlbmQoIiwgIik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHM7Cit9CisKK3ZvaWQgTWV0YURhdGFCYXNlOjpkdW1wVG9Mb2coKSBjb25zdCB7CisgICAgZm9yIChpbnQgaSA9IG1JbnRlcm5hbERhdGEtPm1JdGVtcy5zaXplKCk7IC0taSA+PSAwOykgeworICAgICAgICBpbnQzMl90IGtleSA9IG1JbnRlcm5hbERhdGEtPm1JdGVtcy5rZXlBdChpKTsKKyAgICAgICAgY2hhciBjY1s1XTsKKyAgICAgICAgTWFrZUZvdXJDQ1N0cmluZyhrZXksIGNjKTsKKyAgICAgICAgY29uc3QgdHlwZWRfZGF0YSAmaXRlbSA9IG1JbnRlcm5hbERhdGEtPm1JdGVtcy52YWx1ZUF0KGkpOworICAgICAgICBBTE9HSSgiJXM6ICVzIiwgY2MsIGl0ZW0uYXNTdHJpbmcodHJ1ZSAvKiB2ZXJib3NlICovKS5zdHJpbmcoKSk7CisgICAgfQorfQorCitzdGF0dXNfdCBNZXRhRGF0YUJhc2U6OndyaXRlVG9QYXJjZWwoUGFyY2VsICZwYXJjZWwpIHsKKyAgICBzdGF0dXNfdCByZXQ7CisgICAgc2l6ZV90IG51bUl0ZW1zID0gbUludGVybmFsRGF0YS0+bUl0ZW1zLnNpemUoKTsKKyAgICByZXQgPSBwYXJjZWwud3JpdGVVaW50MzIodWludDMyX3QobnVtSXRlbXMpKTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtSXRlbXM7IGkrKykgeworICAgICAgICBpbnQzMl90IGtleSA9IG1JbnRlcm5hbERhdGEtPm1JdGVtcy5rZXlBdChpKTsKKyAgICAgICAgY29uc3QgdHlwZWRfZGF0YSAmaXRlbSA9IG1JbnRlcm5hbERhdGEtPm1JdGVtcy52YWx1ZUF0KGkpOworICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICBjb25zdCB2b2lkICpkYXRhOworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgaXRlbS5nZXREYXRhKCZ0eXBlLCAmZGF0YSwgJnNpemUpOworICAgICAgICByZXQgPSBwYXJjZWwud3JpdGVJbnQzMihrZXkpOworICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHJldCA9IHBhcmNlbC53cml0ZVVpbnQzMih0eXBlKTsKKyAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZSA9PSBUWVBFX05PTkUpIHsKKyAgICAgICAgICAgIGFuZHJvaWQ6OlBhcmNlbDo6V3JpdGFibGVCbG9iIGJsb2I7CisgICAgICAgICAgICByZXQgPSBwYXJjZWwud3JpdGVVaW50MzIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNpemUpKTsKKyAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0ID0gcGFyY2VsLndyaXRlQmxvYihzaXplLCBmYWxzZSwgJmJsb2IpOworICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkoYmxvYi5kYXRhKCksIGRhdGEsIHNpemUpOworICAgICAgICAgICAgYmxvYi5yZWxlYXNlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBwYXJjZWwud3JpdGVCeXRlQXJyYXkoc2l6ZSwgKHVpbnQ4X3QqKWRhdGEpOworICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNZXRhRGF0YUJhc2U6OnVwZGF0ZUZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpIHsKKyAgICB1aW50MzJfdCBudW1JdGVtczsKKyAgICBpZiAocGFyY2VsLnJlYWRVaW50MzIoJm51bUl0ZW1zKSA9PSBPSykgeworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtSXRlbXM7IGkrKykgeworICAgICAgICAgICAgaW50MzJfdCBrZXk7CisgICAgICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICAgICAgdWludDMyX3Qgc2l6ZTsKKyAgICAgICAgICAgIHN0YXR1c190IHJldCA9IHBhcmNlbC5yZWFkSW50MzIoJmtleSk7CisgICAgICAgICAgICByZXQgfD0gcGFyY2VsLnJlYWRVaW50MzIoJnR5cGUpOworICAgICAgICAgICAgcmV0IHw9IHBhcmNlbC5yZWFkVWludDMyKCZzaXplKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGNvcHkgZGF0YSBmcm9tIEJsb2IsIHdoaWNoIG1heSBiZSBpbmxpbmUgaW4gUGFyY2VsIHN0b3JhZ2UsCisgICAgICAgICAgICAvLyB0aGVuIGFkdmFuY2UgcG9zaXRpb24KKyAgICAgICAgICAgIGlmICh0eXBlID09IFRZUEVfTk9ORSkgeworICAgICAgICAgICAgICAgIGFuZHJvaWQ6OlBhcmNlbDo6UmVhZGFibGVCbG9iIGJsb2I7CisgICAgICAgICAgICAgICAgcmV0ID0gcGFyY2VsLnJlYWRCbG9iKHNpemUsICZibG9iKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXREYXRhKGtleSwgdHlwZSwgYmxvYi5kYXRhKCksIHNpemUpOworICAgICAgICAgICAgICAgIGJsb2IucmVsZWFzZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBjb3B5IGRhdGEgZGlyZWN0bHkgZnJvbSBQYXJjZWwgc3RvcmFnZSwgdGhlbiBhZHZhbmNlIHBvc2l0aW9uCisgICAgICAgICAgICAgICAgc2V0RGF0YShrZXksIHR5cGUsIHBhcmNlbC5yZWFkSW5wbGFjZShzaXplKSwgc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBBTE9HVygibm8gbWV0YWRhdGEgaW4gcGFyY2VsIik7CisgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL1ZvcmJpc0NvbW1lbnQuY3BwIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvVm9yYmlzQ29tbWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFiYWY1MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL1ZvcmJpc0NvbW1lbnQuY3BwCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJWb3JiaXNDb21tZW50IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAibWVkaWEvVm9yYmlzQ29tbWVudC5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyB2b2lkIGV4dHJhY3RBbGJ1bUFydCgKKyAgICAgICAgTWV0YURhdGFCYXNlICpmaWxlTWV0YSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiZXh0cmFjdEFsYnVtQXJ0IGZyb20gJyVzJyIsIChjb25zdCBjaGFyICopZGF0YSk7CisKKyAgICBzcDxBQnVmZmVyPiBmbGFjQnVmZmVyID0gZGVjb2RlQmFzZTY0KEFTdHJpbmcoKGNvbnN0IGNoYXIgKilkYXRhLCBzaXplKSk7CisgICAgaWYgKGZsYWNCdWZmZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgibWFsZm9ybWVkIGJhc2U2NCBlbmNvZGVkIGRhdGEuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzaXplX3QgZmxhY1NpemUgPSBmbGFjQnVmZmVyLT5zaXplKCk7CisgICAgdWludDhfdCAqZmxhYyA9IGZsYWNCdWZmZXItPmRhdGEoKTsKKyAgICBBTE9HVigiZ290IGZsYWMgb2Ygc2l6ZSAlenUiLCBmbGFjU2l6ZSk7CisKKyAgICB1aW50MzJfdCBwaWNUeXBlOworICAgIHVpbnQzMl90IHR5cGVMZW47CisgICAgdWludDMyX3QgZGVzY0xlbjsKKyAgICB1aW50MzJfdCBkYXRhTGVuOworICAgIGNoYXIgdHlwZVsxMjhdOworCisgICAgaWYgKGZsYWNTaXplIDwgOCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcGljVHlwZSA9IFUzMl9BVChmbGFjKTsKKworICAgIGlmIChwaWNUeXBlICE9IDMpIHsKKyAgICAgICAgLy8gVGhpcyBpcyBub3QgYSBmcm9udCBjb3Zlci4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHR5cGVMZW4gPSBVMzJfQVQoJmZsYWNbNF0pOworICAgIGlmICh0eXBlTGVuID4gc2l6ZW9mKHR5cGUpIC0gMSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gd2UndmUgYWxyZWFkeSBjaGVja2VkIGFib3ZlIHRoYXQgZmxhY1NpemUgPj0gOAorICAgIGlmIChmbGFjU2l6ZSAtIDggPCB0eXBlTGVuKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtZW1jcHkodHlwZSwgJmZsYWNbOF0sIHR5cGVMZW4pOworICAgIHR5cGVbdHlwZUxlbl0gPSAnXDAnOworCisgICAgQUxPR1YoInBpY1R5cGUgPSAlZCwgdHlwZSA9ICclcyciLCBwaWNUeXBlLCB0eXBlKTsKKworICAgIGlmICghc3RyY21wKHR5cGUsICItLT4iKSkgeworICAgICAgICAvLyBUaGlzIGlzIG5vdCBpbmxpbmUgY292ZXIgYXJ0LCBidXQgYW4gZXh0ZXJuYWwgdXJsIGluc3RlYWQuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZmxhY1NpemUgPCAzMiB8fCBmbGFjU2l6ZSAtIDMyIDwgdHlwZUxlbikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZGVzY0xlbiA9IFUzMl9BVCgmZmxhY1s4ICsgdHlwZUxlbl0pOworICAgIGlmIChmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiA8IGRlc2NMZW4pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGRhdGFMZW4gPSBVMzJfQVQoJmZsYWNbOCArIHR5cGVMZW4gKyA0ICsgZGVzY0xlbiArIDE2XSk7CisKKyAgICAvLyB3ZSd2ZSBhbHJlYWR5IGNoZWNrZWQgYWJvdmUgdGhhdCAoZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gLSBkZXNjTGVuKSA+PSAwCisgICAgaWYgKGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIC0gZGVzY0xlbiA8IGRhdGFMZW4pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dWKCJnb3QgaW1hZ2UgZGF0YSwgJXp1IHRyYWlsaW5nIGJ5dGVzIiwKKyAgICAgICAgIGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIC0gZGVzY0xlbiAtIGRhdGFMZW4pOworCisgICAgZmlsZU1ldGEtPnNldERhdGEoCisgICAgICAgICAgICBrS2V5QWxidW1BcnQsIDAsICZmbGFjWzggKyB0eXBlTGVuICsgNCArIGRlc2NMZW4gKyAyMF0sIGRhdGFMZW4pOworCisgICAgZmlsZU1ldGEtPnNldENTdHJpbmcoa0tleUFsYnVtQXJ0TUlNRSwgdHlwZSk7Cit9CisKK3ZvaWQgcGFyc2VWb3JiaXNDb21tZW50KAorICAgICAgICBNZXRhRGF0YUJhc2UgKmZpbGVNZXRhLCBjb25zdCBjaGFyICpjb21tZW50LCBzaXplX3QgY29tbWVudExlbmd0aCkKK3sKKyAgICBzdHJ1Y3QgeworICAgICAgICBjb25zdCBjaGFyICpjb25zdCBtVGFnOworICAgICAgICB1aW50MzJfdCBtS2V5OworICAgIH0ga01hcFtdID0geworICAgICAgICB7ICJUSVRMRSIsIGtLZXlUaXRsZSB9LAorICAgICAgICB7ICJBUlRJU1QiLCBrS2V5QXJ0aXN0IH0sCisgICAgICAgIHsgIkFMQlVNQVJUSVNUIiwga0tleUFsYnVtQXJ0aXN0IH0sCisgICAgICAgIHsgIkFMQlVNIEFSVElTVCIsIGtLZXlBbGJ1bUFydGlzdCB9LAorICAgICAgICB7ICJDT01QSUxBVElPTiIsIGtLZXlDb21waWxhdGlvbiB9LAorICAgICAgICB7ICJBTEJVTSIsIGtLZXlBbGJ1bSB9LAorICAgICAgICB7ICJDT01QT1NFUiIsIGtLZXlDb21wb3NlciB9LAorICAgICAgICB7ICJHRU5SRSIsIGtLZXlHZW5yZSB9LAorICAgICAgICB7ICJBVVRIT1IiLCBrS2V5QXV0aG9yIH0sCisgICAgICAgIHsgIlRSQUNLTlVNQkVSIiwga0tleUNEVHJhY2tOdW1iZXIgfSwKKyAgICAgICAgeyAiRElTQ05VTUJFUiIsIGtLZXlEaXNjTnVtYmVyIH0sCisgICAgICAgIHsgIkRBVEUiLCBrS2V5RGF0ZSB9LAorICAgICAgICB7ICJZRUFSIiwga0tleVllYXIgfSwKKyAgICAgICAgeyAiTFlSSUNJU1QiLCBrS2V5V3JpdGVyIH0sCisgICAgICAgIHsgIk1FVEFEQVRBX0JMT0NLX1BJQ1RVUkUiLCBrS2V5QWxidW1BcnQgfSwKKyAgICAgICAgeyAiQU5EUk9JRF9MT09QIiwga0tleUF1dG9Mb29wIH0sCisgICAgfTsKKworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHNpemVvZihrTWFwKSAvIHNpemVvZihrTWFwWzBdKTsgKytqKSB7CisgICAgICAgICAgICBzaXplX3QgdGFnTGVuID0gc3RybGVuKGtNYXBbal0ubVRhZyk7CisgICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKGtNYXBbal0ubVRhZywgY29tbWVudCwgdGFnTGVuKQorICAgICAgICAgICAgICAgICAgICAmJiBjb21tZW50W3RhZ0xlbl0gPT0gJz0nKSB7CisgICAgICAgICAgICAgICAgaWYgKGtNYXBbal0ubUtleSA9PSBrS2V5QWxidW1BcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEFsYnVtQXJ0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVNZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21tZW50W3RhZ0xlbiArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRMZW5ndGggLSB0YWdMZW4gLSAxKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtNYXBbal0ubUtleSA9PSBrS2V5QXV0b0xvb3ApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKCZjb21tZW50W3RhZ0xlbiArIDFdLCAidHJ1ZSIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTWV0YS0+c2V0SW50MzIoa0tleUF1dG9Mb29wLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZpbGVNZXRhLT5zZXRDU3RyaW5nKGtNYXBbal0ubUtleSwgJmNvbW1lbnRbdGFnTGVuICsgMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNTlmMzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2UuaApAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBEQVRBX1NPVVJDRV9IXworCisjZGVmaW5lIERBVEFfU09VUkNFX0hfCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvSURhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGRybS9Ecm1NYW5hZ2VyQ2xpZW50Lmg+CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBTdHJpbmc4OworCitjbGFzcyBEYXRhU291cmNlIDogcHVibGljIERhdGFTb3VyY2VCYXNlLCBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICBEYXRhU291cmNlKCkge30KKworICAgIC8vIHJldHVybnMgYSBwb2ludGVyIHRvIElEYXRhU291cmNlIGlmIGl0IGlzIHdyYXBwZWQuCisgICAgdmlydHVhbCBzcDxJRGF0YVNvdXJjZT4gZ2V0SURhdGFTb3VyY2UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHZpcnR1YWwgU3RyaW5nOCB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoIjx1bnNwZWNpZmllZD4iKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlY29ubmVjdEF0T2Zmc2V0KG9mZjY0X3QgLypvZmZzZXQqLykgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgLy8gZm9yIERSTQorICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gRHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciAqIC8qbWltZSovID0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFN0cmluZzggZ2V0VXJpKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBnZXRVcmkoY2hhciAqdXJpU3RyaW5nLCBzaXplX3QgYnVmZmVyU2l6ZSkgZmluYWwgeworICAgICAgICBpbnQgcmV0ID0gc25wcmludGYodXJpU3RyaW5nLCBidWZmZXJTaXplLCAiJXMiLCBnZXRVcmkoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHJldCA+PSAwICYmIHN0YXRpY19jYXN0PHNpemVfdD4ocmV0KSA8IGJ1ZmZlclNpemU7CisgICAgfQorCisgICAgdmlydHVhbCBTdHJpbmc4IGdldE1JTUVUeXBlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+RGF0YVNvdXJjZSgpIHt9CisKK3ByaXZhdGU6CisgICAgRGF0YVNvdXJjZShjb25zdCBEYXRhU291cmNlICYpOworICAgIERhdGFTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBEYXRhU291cmNlICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBEQVRBX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlQmFzZS5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxOTkzZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VCYXNlLmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgREFUQV9TT1VSQ0VfQkFTRV9IXworCisjZGVmaW5lIERBVEFfU09VUkNFX0JBU0VfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFN0cmluZzg7CisKK2NsYXNzIERhdGFTb3VyY2VCYXNlIHsKK3B1YmxpYzoKKyAgICBlbnVtIEZsYWdzIHsKKyAgICAgICAga1dhbnRzUHJlZmV0Y2hpbmcgICAgICA9IDEsCisgICAgICAgIGtTdHJlYW1lZEZyb21Mb2NhbEhvc3QgPSAyLAorICAgICAgICBrSXNDYWNoaW5nRGF0YVNvdXJjZSAgID0gNCwKKyAgICAgICAga0lzSFRUUEJhc2VkU291cmNlICAgICA9IDgsCisgICAgICAgIGtJc0xvY2FsRmlsZVNvdXJjZSAgICAgPSAxNiwKKyAgICB9OworCisgICAgRGF0YVNvdXJjZUJhc2UoKSB7fQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdCA9IDA7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgLTEgb24gZmFpbHVyZS4gSXQncyBub3QgYW4gZXJyb3IgaWYKKyAgICAvLyB0aGlzIHJldHVybnMgemVybzsgaXQganVzdCBtZWFucyB0aGUgZ2l2ZW4gb2Zmc2V0IGlzIGVxdWFsIHRvLCBvcgorICAgIC8vIGJleW9uZCwgdGhlIGVuZCBvZiB0aGUgc291cmNlLgorICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSA9IDA7CisKKyAgICAvLyBDb252ZW5pZW5jZSBtZXRob2RzOgorICAgIGJvb2wgZ2V0VUludDE2KG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCk7CisgICAgYm9vbCBnZXRVSW50MjQob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KTsgLy8gMyBieXRlIGludCwgcmV0dXJuZWQgYXMgYSAzMi1iaXQgaW50CisgICAgYm9vbCBnZXRVSW50MzIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KTsKKyAgICBib29sIGdldFVJbnQ2NChvZmY2NF90IG9mZnNldCwgdWludDY0X3QgKngpOworCisgICAgLy8gcmVhZCBlaXRoZXIgaW50PE4+IG9yIGludDwyTj4gaW50byBhIHVpbnQ8Mk4+X3QsIHNpemUgaXMgdGhlIGludCBzaXplIGluIGJ5dGVzLgorICAgIGJvb2wgZ2V0VUludDE2VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCwgc2l6ZV90IHNpemUpOworICAgIGJvb2wgZ2V0VUludDMyVmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCwgc2l6ZV90IHNpemUpOworICAgIGJvb2wgZ2V0VUludDY0VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCwgc2l6ZV90IHNpemUpOworCisgICAgLy8gTWF5IHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7CisKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0VXJpKGNoYXIgKnVyaVN0cmluZywgc2l6ZV90IGJ1ZmZlclNpemUpOworCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGNsb3NlKCkge307CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5EYXRhU291cmNlQmFzZSgpIHt9CisKK3ByaXZhdGU6CisgICAgRGF0YVNvdXJjZUJhc2UoY29uc3QgRGF0YVNvdXJjZUJhc2UgJik7CisgICAgRGF0YVNvdXJjZUJhc2UgJm9wZXJhdG9yPShjb25zdCBEYXRhU291cmNlQmFzZSAmKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gREFUQV9TT1VSQ0VfQkFTRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9FeHRyYWN0b3JVdGlscy5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9FeHRyYWN0b3JVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZjkzNDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0V4dHJhY3RvclV0aWxzLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRVhUUkFDVE9SX1VUSUxTX0hfCisKKyNkZWZpbmUgRVhUUkFDVE9SX1VUSUxTX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordGVtcGxhdGUgPGNsYXNzIFQ+CitzdGQ6OnVuaXF1ZV9wdHI8VFtdPiBoZWFwYnVmZmVyKHNpemVfdCBzaXplKSB7CisgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxUW10+KG5ldyAoc3RkOjpub3Rocm93KSBUW3NpemVdKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBVVElMU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYTk4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yLmgKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0VYVFJBQ1RPUl9IXworCisjZGVmaW5lIE1FRElBX0VYVFJBQ1RPUl9IXworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitjbGFzcyBNZXRhRGF0YUJhc2U7CitzdHJ1Y3QgTWVkaWFUcmFjazsKKworCitjbGFzcyBFeHRyYWN0b3JBbGxvY1RyYWNrZXIgeworcHVibGljOgorICAgIEV4dHJhY3RvckFsbG9jVHJhY2tlcigpIHsKKyAgICAgICAgQUxPR0QoImV4dHJhY3RvciBhbGxvY2F0ZWQ6ICVwIiwgdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgfkV4dHJhY3RvckFsbG9jVHJhY2tlcigpIHsKKyAgICAgICAgQUxPR0QoImV4dHJhY3RvciBmcmVlZDogJXAiLCB0aGlzKTsKKyAgICB9Cit9OworCisKK2NsYXNzIE1lZGlhRXh0cmFjdG9yCisvLyA6IHB1YmxpYyBFeHRyYWN0b3JBbGxvY1RyYWNrZXIKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5NZWRpYUV4dHJhY3RvcigpOworICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCkgPSAwOworICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KSA9IDA7CisKKyAgICBlbnVtIEdldFRyYWNrTWV0YURhdGFGbGFncyB7CisgICAgICAgIGtJbmNsdWRlRXh0ZW5zaXZlTWV0YURhdGEgPSAxCisgICAgfTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoCisgICAgICAgICAgICBNZXRhRGF0YUJhc2UmIG1ldGEsCisgICAgICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzID0gMCkgPSAwOworCisgICAgLy8gUmV0dXJuIGNvbnRhaW5lciBzcGVjaWZpYyBtZXRhLWRhdGEuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisgICAgLy8gcmV0dXJucyBhbiBlbXB0eSBtZXRhZGF0YSBvYmplY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpID0gMDsKKworICAgIGVudW0gRmxhZ3MgeworICAgICAgICBDQU5fU0VFS19CQUNLV0FSRCAgPSAxLCAgLy8gdGhlICJzZWVrIDEwc2VjcyBiYWNrIGJ1dHRvbiIKKyAgICAgICAgQ0FOX1NFRUtfRk9SV0FSRCAgID0gMiwgIC8vIHRoZSAic2VlayAxMHNlY3MgZm9yd2FyZCBidXR0b24iCisgICAgICAgIENBTl9QQVVTRSAgICAgICAgICA9IDQsCisgICAgICAgIENBTl9TRUVLICAgICAgICAgICA9IDgsICAvLyB0aGUgInNlZWsgYmFyIgorICAgIH07CisKKyAgICAvLyBJZiBzdWJjbGFzc2VzIGRvIF9ub3RfIG92ZXJyaWRlIHRoaXMsIHRoZSBkZWZhdWx0IGlzCisgICAgLy8gQ0FOX1NFRUtfQkFDS1dBUkQgfCBDQU5fU0VFS19GT1JXQVJEIHwgQ0FOX1NFRUsgfCBDQU5fUEFVU0UKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHVpbnQ4X3QqIC8qY2FzVG9rZW4qLywgc2l6ZV90IC8qc2l6ZSovKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIjx1bnNwZWNpZmllZD4iOyB9CisKKyAgICB0eXBlZGVmIE1lZGlhRXh0cmFjdG9yKiAoKkNyZWF0b3JGdW5jKSgKKyAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIHZvaWQgKm1ldGEpOworICAgIHR5cGVkZWYgdm9pZCAoKkZyZWVNZXRhRnVuYykodm9pZCAqbWV0YSk7CisKKyAgICAvLyBUaGUgc25pZmZlciBjYW4gb3B0aW9uYWxseSBmaWxsIGluIGFuIG9wYXF1ZSBvYmplY3QsICJtZXRhIiwgdGhhdCBoZWxwcworICAgIC8vIHRoZSBjb3JyZXNwb25kaW5nIGV4dHJhY3RvciBpbml0aWFsaXplIGl0cyBzdGF0ZSB3aXRob3V0IGR1cGxpY2F0aW5nCisgICAgLy8gZWZmb3J0IGFscmVhZHkgZXhlcnRlZCBieSB0aGUgc25pZmZlci4gSWYgImZyZWVNZXRhIiBpcyBnaXZlbiwgaXQgd2lsbCBiZQorICAgIC8vIGNhbGxlZCBhZ2FpbnN0IHRoZSBvcGFxdWUgb2JqZWN0IHdoZW4gaXQgaXMgbm8gbG9uZ2VyIHVzZWQuCisgICAgdHlwZWRlZiBDcmVhdG9yRnVuYyAoKlNuaWZmZXJGdW5jKSgKKyAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICAgICAgdm9pZCAqKm1ldGEsIEZyZWVNZXRhRnVuYyAqZnJlZU1ldGEpOworCisgICAgdHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBjb25zdCB1aW50OF90IGJbMTZdOworICAgIH0gdXVpZF90OworCisgICAgdHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICAvLyB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIHN0cnVjdHVyZQorICAgICAgICBjb25zdCB1aW50MzJfdCBkZWZfdmVyc2lvbjsKKworICAgICAgICAvLyBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dHJhY3Rvci4KKyAgICAgICAgLy8gU2VlIGJlbG93IGZvciBhIGNvbnZlbmllbmNlIG1hY3JvIHRvIGNyZWF0ZSB0aGlzIGZyb20gYSBzdHJpbmcuCisgICAgICAgIHV1aWRfdCBleHRyYWN0b3JfdXVpZDsKKworICAgICAgICAvLyBWZXJzaW9uIG51bWJlciBvZiB0aGlzIGV4dHJhY3Rvci4gV2hlbiB0d28gZXh0cmFjdG9ycyB3aXRoIHRoZSBzYW1lCisgICAgICAgIC8vIHV1aWQgYXJlIGVuY291bnRlcmVkLCB0aGUgb25lIHdpdGggdGhlIGxhcmdlc3QgdmVyc2lvbiBudW1iZXIgd2lsbAorICAgICAgICAvLyBiZSB1c2VkLgorICAgICAgICBjb25zdCB1aW50MzJfdCBleHRyYWN0b3JfdmVyc2lvbjsKKworICAgICAgICAvLyBhIGh1bWFuIHJlYWRhYmxlIG5hbWUKKyAgICAgICAgY29uc3QgY2hhciAqZXh0cmFjdG9yX25hbWU7CisKKyAgICAgICAgLy8gdGhlIHNuaWZmZXIgZnVuY3Rpb24KKyAgICAgICAgY29uc3QgU25pZmZlckZ1bmMgc25pZmY7CisgICAgfSBFeHRyYWN0b3JEZWY7CisKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgRVhUUkFDVE9SREVGX1ZFUlNJT04gPSAxOworCisgICAgdHlwZWRlZiBFeHRyYWN0b3JEZWYgKCpHZXRFeHRyYWN0b3JEZWYpKCk7CisKK3Byb3RlY3RlZDoKKyAgICBNZWRpYUV4dHJhY3RvcigpOworCitwcml2YXRlOgorICAgIE1lZGlhRXh0cmFjdG9yKGNvbnN0IE1lZGlhRXh0cmFjdG9yICYpOworICAgIE1lZGlhRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgTWVkaWFFeHRyYWN0b3IgJik7Cit9OworCisvLyBwdXJwb3NlbHkgbm90IGRlZmluZWQgYW55d2hlcmUgc28gdGhhdCB0aGlzIHdpbGwgZmFpbCB0byBsaW5rIGlmCisvLyBleHByZXNzaW9ucyBiZWxvdyBhcmUgbm90IGV2YWx1YXRlZCBhdCBjb21waWxlIHRpbWUKK2ludCBpbnZhbGlkX3V1aWRfc3RyaW5nKGNvbnN0IGNoYXIgKik7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KK2NvbnN0ZXhwciB1aW50OF90IF9kaWdpdEF0Xyhjb25zdCBUICgmcylbTl0sIGNvbnN0IHNpemVfdCBuKSB7CisgICAgcmV0dXJuIHNbbl0gPj0gJzAnICYmIHNbbl0gPD0gJzknID8gc1tuXSAtICcwJworICAgICAgICAgICAgOiBzW25dID49ICdhJyAmJiBzW25dIDw9ICdmJyA/IHNbbl0gLSAnYScgKyAxMAorICAgICAgICAgICAgICAgICAgICA6IHNbbl0gPj0gJ0EnICYmIHNbbl0gPD0gJ0YnID8gc1tuXSAtICdBJyArIDEwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpbnZhbGlkX3V1aWRfc3RyaW5nKCJ1dWlkOiBiYWQgZGlnaXRzIik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KK2NvbnN0ZXhwciB1aW50OF90IF9oZXhCeXRlQXRfKGNvbnN0IFQgKCZzKVtOXSwgc2l6ZV90IG4pIHsKKyAgICByZXR1cm4gKF9kaWdpdEF0XyhzLCBuKSA8PCA0KSArIF9kaWdpdEF0XyhzLCBuICsgMSk7Cit9CisKK2NvbnN0ZXhwciBib29sIF9hc3NlcnRJc0Rhc2hfKGNoYXIgYykgeworICAgIHJldHVybiBjID09ICctJyA/IHRydWUgOiBpbnZhbGlkX3V1aWRfc3RyaW5nKCJXcm9uZyBmb3JtYXQiKTsKK30KKwordGVtcGxhdGUgPHNpemVfdCBOPgorY29uc3RleHByIE1lZGlhRXh0cmFjdG9yOjp1dWlkX3QgY29uc3RVVUlEKGNvbnN0IGNoYXIgKCZzKSBbTl0pIHsKKyAgICBzdGF0aWNfYXNzZXJ0KE4gPT0gMzcsICJ1dWlkOiB3cm9uZyBsZW5ndGgiKTsKKyAgICByZXR1cm4KKyAgICAgICAgICAgIF9hc3NlcnRJc0Rhc2hfKHNbOF0pLAorICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1sxM10pLAorICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1sxOF0pLAorICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1syM10pLAorICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OnV1aWRfdCB7eworICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDApLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDIpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDQpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDYpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDkpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDExKSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAxNCksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMTYpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDE5KSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAyMSksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMjQpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDI2KSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAyOCksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMzApLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDMyKSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAzNCksCisgICAgICAgICAgICB9fTsKK30KKy8vIENvbnZlbmllbmNlIG1hY3JvIHRvIGNyZWF0ZSBhIHV1aWRfdCBmcm9tIGEgc3RyaW5nIGxpdGVyYWwsIHdoaWNoIHNob3VsZAorLy8gYmUgZm9ybWF0dGVkIGFzICIxMjM0NTY3OC0xMjM0LTEyMzQtMTIzNC0xMjM0NTY3ODlhYmMiLCBhcyBnZW5lcmF0ZWQgYnkKKy8vIGUuZy4gaHR0cHM6Ly93d3cudXVpZGdlbmVyYXRvci5uZXQvIG9yIHRoZSAndXVpZGdlbicgbGludXggY29tbWFuZC4KKy8vIEhleCBkaWdpdHMgbWF5IGJlIHVwcGVyIG9yIGxvd2VyIGNhc2UuCisvLworLy8gVGhlIG1hY3JvIGNhbGwgaXMgb3RoZXJ3aXNlIGVxdWl2YWxlbnQgdG8gc3BlY2lmeWluZyB0aGUgc3RydWN0dXJlIGRpcmVjdGx5CisvLyAoZS5nLiBVVUlEKCI3ZDYxMzg1OC01ODM3LTRhMzgtODRjNS0zMzJkMWNkZGVlMjciKSBpcyB0aGUgc2FtZSBhcworLy8gICAgICAge3sweDdkLCAweDYxLCAweDM4LCAweDU4LCAweDU4LCAweDM3LCAweDRhLCAweDM4LAorLy8gICAgICAgICAweDg0LCAweGM1LCAweDMzLCAweDJkLCAweDFjLCAweGRkLCAweGVlLCAweDI3fX0pCisKKyNkZWZpbmUgVVVJRChzdHIpIFtdeyBjb25zdGV4cHIgTWVkaWFFeHRyYWN0b3I6OnV1aWRfdCB1dWlkID0gY29uc3RVVUlEKHN0cik7IHJldHVybiB1dWlkOyB9KCkKKworCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfRVhUUkFDVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhU291cmNlLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNjNDcwMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFTb3VyY2UuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKworICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9TT1VSQ0VfSF8KKworI2RlZmluZSBNRURJQV9TT1VSQ0VfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZWRpYUJ1ZmZlcjsKKworc3RydWN0IE1lZGlhU291cmNlIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSB7CisgICAgTWVkaWFTb3VyY2UoKTsKKworICAgIC8vIFRvIGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIG1ldGhvZHMgb24gdGhpcyBvYmplY3QsIGV4Y2VwdAorICAgIC8vIGdldEZvcm1hdCgpLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpID0gMDsKKworICAgIC8vIEFueSBibG9ja2luZyByZWFkIGNhbGwgcmV0dXJucyBpbW1lZGlhdGVseSB3aXRoIGEgcmVzdWx0IG9mIE5PX0lOSVQuCisgICAgLy8gSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCBhbnkgbWV0aG9kcyBvdGhlciB0aGFuIHN0YXJ0IGFmdGVyIHRoaXMgY2FsbAorICAgIC8vIHJldHVybnMuIEFueSBidWZmZXJzIHRoZSBvYmplY3QgbWF5IGJlIGhvbGRpbmcgb250byBhdCB0aGUgdGltZSBvZgorICAgIC8vIHRoZSBzdG9wKCkgY2FsbCBhcmUgcmVsZWFzZWQuCisgICAgLy8gQWxzbywgaXQgaXMgaW1wZXJhdGl2ZSB0aGF0IGFueSBidWZmZXJzIG91dHB1dCBieSB0aGlzIG9iamVjdCBhbmQKKyAgICAvLyBoZWxkIG9udG8gYnkgY2FsbGVycyBiZSByZWxlYXNlZCBiZWZvcmUgYSBjYWxsIHRvIHN0b3AoKSAhISEKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBmb3JtYXQgb2YgdGhlIGRhdGEgb3V0cHV0IGJ5IHRoaXMgbWVkaWEgc291cmNlLgorICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpID0gMDsKKworICAgIC8vIE9wdGlvbnMgdGhhdCBtb2RpZnkgcmVhZCgpIGJlaGF2aW91ci4gVGhlIGRlZmF1bHQgaXMgdG8KKyAgICAvLyBhKSBub3QgcmVxdWVzdCBhIHNlZWsKKyAgICAvLyBiKSBub3QgYmUgbGF0ZSwgaS5lLiBsYXRlbmVzc191cyA9IDAKKyAgICB0eXBlZGVmIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zIFJlYWRPcHRpb25zOworCisgICAgLy8gUmV0dXJucyBhIG5ldyBidWZmZXIgb2YgZGF0YS4gQ2FsbCBibG9ja3MgdW50aWwgYQorICAgIC8vIGJ1ZmZlciBpcyBhdmFpbGFibGUsIGFuIGVycm9yIGlzIGVuY291bnRlcmVkIG9mIHRoZSBlbmQgb2YgdGhlIHN0cmVhbQorICAgIC8vIGlzIHJlYWNoZWQuCisgICAgLy8gRW5kIG9mIHN0cmVhbSBpcyBzaWduYWxsZWQgYnkgYSByZXN1bHQgb2YgRVJST1JfRU5EX09GX1NUUkVBTS4KKyAgICAvLyBBIHJlc3VsdCBvZiBJTkZPX0ZPUk1BVF9DSEFOR0VEIGluZGljYXRlcyB0aGF0IHRoZSBmb3JtYXQgb2YgdGhpcworICAgIC8vIE1lZGlhU291cmNlIGhhcyBjaGFuZ2VkIG1pZC1zdHJlYW0sIHRoZSBjbGllbnQgY2FuIGNvbnRpbnVlIHJlYWRpbmcKKyAgICAvLyBidXQgc2hvdWxkIGJlIHByZXBhcmVkIGZvciBidWZmZXJzIG9mIHRoZSBuZXcgY29uZmlndXJhdGlvbi4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCkgPSAwOworCisgICAgLy8gQ2F1c2VzIHRoaXMgc291cmNlIHRvIHN1c3BlbmQgcHVsbGluZyBkYXRhIGZyb20gaXRzIHVwc3RyZWFtIHNvdXJjZQorICAgIC8vIHVudGlsIGEgc3Vic2VxdWVudCByZWFkLXdpdGgtc2Vlay4gVGhpcyBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZAorICAgIC8vIGFzIHN1Y2ggYnkgYW55IHNvdXJjZS4gRS5nLiBNZWRpYUNvZGVjU291cmNlIGRvZXMgbm90IHN1c3BlbmQgaXRzCisgICAgLy8gdXBzdHJlYW0gc291cmNlLCBhbmQgaW5zdGVhZCBkaXNjYXJkIHVwc3RyZWFtIGRhdGEgd2hpbGUgcGF1c2VkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICAvLyBUaGUgY29uc3VtZXIgb2YgdGhpcyBtZWRpYSBzb3VyY2UgcmVxdWVzdHMgdGhlIHNvdXJjZSBzdG9wcyBzZW5kaW5nCisgICAgLy8gYnVmZmVycyB3aXRoIHRpbWVzdGFtcCBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byBzdG9wVGltZVVzLiBzdG9wVGltZVVzCisgICAgLy8gbXVzdCBiZSBpbiB0aGUgc2FtZSB0aW1lIGJhc2UgYXMgdGhlIHN0YXJ0VGltZSBwYXNzZWQgaW4gc3RhcnQoKS4gSWYKKyAgICAvLyBzb3VyY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIHJlcXVlc3QsIEVSUk9SX1VOU1VQUE9SVEVEIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgLy8gSWYgc3RvcFRpbWVVcyBpcyBpbnZhbGlkLCBCQURfVkFMVUUgd2lsbCBiZSByZXR1cm5lZC4gVGhpcyBjb3VsZCBiZQorICAgIC8vIGNhbGxlZCBhdCBhbnkgdGltZSBldmVuIGJlZm9yZSBzb3VyY2Ugc3RhcnRzIGFuZCBpdCBjb3VsZCBiZSBjYWxsZWQKKyAgICAvLyBtdWx0aXBsZSB0aW1lcy4gU2V0dGluZyBzdG9wVGltZVVzIHRvIGJlIC0xIHdpbGwgZWZmZWN0aXZlbHkgY2FuY2VsIHRoZSBzdG9wVGltZVVzCisgICAgLy8gc2V0IHByZXZpb3VzbHkuIElmIHN0b3BUaW1lVXMgaXMgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gbGFzdCBidWZmZXIncyB0aW1lc3RhbXAsCisgICAgLy8gc291cmNlIHdpbGwgc3RhcnQgdG8gZHJvcCBidWZmZXIgd2hlbiBpdCBnZXRzIGEgYnVmZmVyIHdpdGggdGltZXN0YW1wIGxhcmdlcgorICAgIC8vIHRoYW4gb3IgZXF1YWwgdG8gc3RvcFRpbWVVcy4gSWYgc3RvcFRpbWVVcyBpcyBzbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG8gbGFzdAorICAgIC8vIGJ1ZmZlcidzIHRpbWVzdGFtcCwgc291cmNlIHdpbGwgZHJvcCBhbGwgdGhlIGluY29taW5nIGJ1ZmZlcnMgaW1tZWRpYXRlbHkuCisgICAgLy8gQWZ0ZXIgc2V0dGluZyBzdG9wVGltZVVzLCBzb3VyY2UgbWF5IHN0aWxsIHN0b3Agc2VuZGluZyBidWZmZXJzIHdpdGggdGltZXN0YW1wCisgICAgLy8gbGVzcyB0aGFuIHN0b3BUaW1lVXMgaWYgaXQgaXMgc3RvcHBlZCBieSB0aGUgY29uc3VtZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdG9wVGltZVVzKGludDY0X3QgLyogc3RvcFRpbWVVcyAqLykgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TWVkaWFTb3VyY2UoKTsKKworcHJpdmF0ZToKKyAgICBNZWRpYVNvdXJjZShjb25zdCBNZWRpYVNvdXJjZSAmKTsKKyAgICBNZWRpYVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhU291cmNlICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9TT1VSQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRlYTYxYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9TT1VSQ0VfQkFTRV9IXworCisjZGVmaW5lIE1FRElBX1NPVVJDRV9CQVNFX0hfCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTWVkaWFCdWZmZXJCYXNlOworCitjbGFzcyBTb3VyY2VCYXNlQWxsb2NUcmFja2VyIHsKK3B1YmxpYzoKKyAgICBTb3VyY2VCYXNlQWxsb2NUcmFja2VyKCkgeworICAgICAgICBBTE9HRCgic291cmNlYmFzZSBhbGxvY2F0ZWQ6ICVwIiwgdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgflNvdXJjZUJhc2VBbGxvY1RyYWNrZXIoKSB7CisgICAgICAgIEFMT0dEKCJzb3VyY2ViYXNlIGZyZWVkOiAlcCIsIHRoaXMpOworICAgIH0KK307CisKK3N0cnVjdCBNZWRpYVRyYWNrCisvLyAgICA6IHB1YmxpYyBTb3VyY2VCYXNlQWxsb2NUcmFja2VyCit7CisgICAgTWVkaWFUcmFjaygpOworCisgICAgLy8gVG8gYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgbWV0aG9kcyBvbiB0aGlzIG9iamVjdCwgZXhjZXB0CisgICAgLy8gZ2V0Rm9ybWF0KCkuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyA9IE5VTEwpID0gMDsKKworICAgIC8vIEFueSBibG9ja2luZyByZWFkIGNhbGwgcmV0dXJucyBpbW1lZGlhdGVseSB3aXRoIGEgcmVzdWx0IG9mIE5PX0lOSVQuCisgICAgLy8gSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCBhbnkgbWV0aG9kcyBvdGhlciB0aGFuIHN0YXJ0IGFmdGVyIHRoaXMgY2FsbAorICAgIC8vIHJldHVybnMuIEFueSBidWZmZXJzIHRoZSBvYmplY3QgbWF5IGJlIGhvbGRpbmcgb250byBhdCB0aGUgdGltZSBvZgorICAgIC8vIHRoZSBzdG9wKCkgY2FsbCBhcmUgcmVsZWFzZWQuCisgICAgLy8gQWxzbywgaXQgaXMgaW1wZXJhdGl2ZSB0aGF0IGFueSBidWZmZXJzIG91dHB1dCBieSB0aGlzIG9iamVjdCBhbmQKKyAgICAvLyBoZWxkIG9udG8gYnkgY2FsbGVycyBiZSByZWxlYXNlZCBiZWZvcmUgYSBjYWxsIHRvIHN0b3AoKSAhISEKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBmb3JtYXQgb2YgdGhlIGRhdGEgb3V0cHV0IGJ5IHRoaXMgbWVkaWEgdHJhY2suCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlJiBmb3JtYXQpID0gMDsKKworICAgIC8vIE9wdGlvbnMgdGhhdCBtb2RpZnkgcmVhZCgpIGJlaGF2aW91ci4gVGhlIGRlZmF1bHQgaXMgdG8KKyAgICAvLyBhKSBub3QgcmVxdWVzdCBhIHNlZWsKKyAgICAvLyBiKSBub3QgYmUgbGF0ZSwgaS5lLiBsYXRlbmVzc191cyA9IDAKKyAgICBzdHJ1Y3QgUmVhZE9wdGlvbnMgeworICAgICAgICBlbnVtIFNlZWtNb2RlIDogaW50MzJfdCB7CisgICAgICAgICAgICBTRUVLX1BSRVZJT1VTX1NZTkMsCisgICAgICAgICAgICBTRUVLX05FWFRfU1lOQywKKyAgICAgICAgICAgIFNFRUtfQ0xPU0VTVF9TWU5DLAorICAgICAgICAgICAgU0VFS19DTE9TRVNULAorICAgICAgICAgICAgU0VFS19GUkFNRV9JTkRFWCwKKyAgICAgICAgfTsKKworICAgICAgICBSZWFkT3B0aW9ucygpOworCisgICAgICAgIC8vIFJlc2V0IGV2ZXJ5dGhpbmcgYmFjayB0byBkZWZhdWx0cy4KKyAgICAgICAgdm9pZCByZXNldCgpOworCisgICAgICAgIHZvaWQgc2V0U2Vla1RvKGludDY0X3QgdGltZV91cywgU2Vla01vZGUgbW9kZSA9IFNFRUtfQ0xPU0VTVF9TWU5DKTsKKyAgICAgICAgdm9pZCBjbGVhclNlZWtUbygpOworICAgICAgICBib29sIGdldFNlZWtUbyhpbnQ2NF90ICp0aW1lX3VzLCBTZWVrTW9kZSAqbW9kZSkgY29uc3Q7CisKKyAgICAgICAgdm9pZCBzZXROb25CbG9ja2luZygpOworICAgICAgICB2b2lkIGNsZWFyTm9uQmxvY2tpbmcoKTsKKyAgICAgICAgYm9vbCBnZXROb25CbG9ja2luZygpIGNvbnN0OworCisgICAgICAgIC8vIFVzZWQgdG8gY2xlYXIgYWxsIG5vbi1wZXJzaXN0ZW50IG9wdGlvbnMgZm9yIG11bHRpcGxlIGJ1ZmZlciByZWFkcy4KKyAgICAgICAgdm9pZCBjbGVhck5vblBlcnNpc3RlbnQoKSB7CisgICAgICAgICAgICBjbGVhclNlZWtUbygpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBlbnVtIE9wdGlvbnMgeworICAgICAgICAgICAga1NlZWtUb19PcHRpb24gICAgICA9IDEsCisgICAgICAgIH07CisKKyAgICAgICAgdWludDMyX3QgbU9wdGlvbnM7CisgICAgICAgIGludDY0X3QgbVNlZWtUaW1lVXM7CisgICAgICAgIFNlZWtNb2RlIG1TZWVrTW9kZTsKKyAgICAgICAgYm9vbCBtTm9uQmxvY2tpbmc7CisgICAgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsgLy8gc2VudCB0aHJvdWdoIEJpbmRlcgorCisgICAgLy8gUmV0dXJucyBhIG5ldyBidWZmZXIgb2YgZGF0YS4gQ2FsbCBibG9ja3MgdW50aWwgYQorICAgIC8vIGJ1ZmZlciBpcyBhdmFpbGFibGUsIGFuIGVycm9yIGlzIGVuY291bnRlcmVkIG9mIHRoZSBlbmQgb2YgdGhlIHN0cmVhbQorICAgIC8vIGlzIHJlYWNoZWQuCisgICAgLy8gRW5kIG9mIHN0cmVhbSBpcyBzaWduYWxsZWQgYnkgYSByZXN1bHQgb2YgRVJST1JfRU5EX09GX1NUUkVBTS4KKyAgICAvLyBBIHJlc3VsdCBvZiBJTkZPX0ZPUk1BVF9DSEFOR0VEIGluZGljYXRlcyB0aGF0IHRoZSBmb3JtYXQgb2YgdGhpcworICAgIC8vIE1lZGlhU291cmNlIGhhcyBjaGFuZ2VkIG1pZC1zdHJlYW0sIHRoZSBjbGllbnQgY2FuIGNvbnRpbnVlIHJlYWRpbmcKKyAgICAvLyBidXQgc2hvdWxkIGJlIHByZXBhcmVkIGZvciBidWZmZXJzIG9mIHRoZSBuZXcgY29uZmlndXJhdGlvbi4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCkgPSAwOworCisgICAgdmlydHVhbCB+TWVkaWFUcmFjaygpOworCitwcml2YXRlOgorICAgIE1lZGlhVHJhY2soY29uc3QgTWVkaWFUcmFjayAmKTsKKyAgICBNZWRpYVRyYWNrICZvcGVyYXRvcj0oY29uc3QgTWVkaWFUcmFjayAmKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfU09VUkNFX0JBU0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9Wb3JiaXNDb21tZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJhMzI5NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpZm5kZWYgVk9SQklTX0NPTU1FTlRfSF8KKyNkZWZpbmUgVk9SQklTX0NPTU1FTlRfSF8KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZXRhRGF0YUJhc2U7CisKK3ZvaWQgcGFyc2VWb3JiaXNDb21tZW50KAorICAgICAgICBNZXRhRGF0YUJhc2UgKmZpbGVNZXRhLCBjb25zdCBjaGFyICpjb21tZW50LCBzaXplX3QgY29tbWVudExlbmd0aCk7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBWT1JCSVNfQ09NTUVOVF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NDRkNTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmgKQEAgLTAsMCArMSwyMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0JVRkZFUl9IXworCisjZGVmaW5lIE1FRElBX0JVRkZFUl9IXworCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGxpc3Q+CisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBQnVmZmVyOworY2xhc3MgTWVkaWFCdWZmZXI7CitjbGFzcyBNZWRpYUJ1ZmZlck9ic2VydmVyOworY2xhc3MgTWV0YURhdGFCYXNlOworCitjbGFzcyBNZWRpYUJ1ZmZlciA6IHB1YmxpYyBNZWRpYUJ1ZmZlckJhc2UgeworcHVibGljOgorICAgIC8vIGFsbG9jYXRpb25zIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIHRoaXMgd2lsbCB1c2Ugc2hhcmVkIG1lbW9yeS4KKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtTaGFyZWRNZW1UaHJlc2hvbGQgPSA2NCAqIDEwMjQ7CisKKyAgICAvLyBUaGUgdW5kZXJseWluZyBkYXRhIHJlbWFpbnMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIhCisgICAgTWVkaWFCdWZmZXIodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgZXhwbGljaXQgTWVkaWFCdWZmZXIoc2l6ZV90IHNpemUpOworCisgICAgZXhwbGljaXQgTWVkaWFCdWZmZXIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisKKyAgICBNZWRpYUJ1ZmZlcihjb25zdCBzcDxJTWVtb3J5PiAmbWVtKSA6CisgICAgICAgIE1lZGlhQnVmZmVyKCh1aW50OF90ICopbWVtLT5wb2ludGVyKCkgKyBzaXplb2YoU2hhcmVkQ29udHJvbCksIG1lbS0+c2l6ZSgpKSB7CisgICAgICAgIC8vIGRlbGVnYXRlIGFuZCBvdmVycmlkZSBtTWVtb3J5CisgICAgICAgIG1NZW1vcnkgPSBtZW07CisgICAgfQorCisgICAgLy8gSWYgTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQsIGRlY3JlbWVudCB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50OworICAgIC8vIGlmIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gMCwgcmV0dXJuIHRoZSBidWZmZXIgdG8gdGhlCisgICAgLy8gYXNzb2NpYXRlZCBNZWRpYUJ1ZmZlckdyb3VwLgorICAgIC8vCisgICAgLy8gSWYgbm8gTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQsIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQgbXVzdCBiZSB6ZXJvCisgICAgLy8gd2hlbiBjYWxsZWQsIHdoZXJldXBvbiB0aGUgTWVkaWFCdWZmZXIgaXMgZGVsZXRlZC4KKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpOworCisgICAgLy8gSW5jcmVtZW50cyB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50LgorICAgIC8vIFVzZSBvbmx5IHdoZW4gTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQuCisgICAgdmlydHVhbCB2b2lkIGFkZF9yZWYoKTsKKworICAgIHZpcnR1YWwgdm9pZCAqZGF0YSgpIGNvbnN0OworICAgIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdDsKKworICAgIHZpcnR1YWwgc2l6ZV90IHJhbmdlX29mZnNldCgpIGNvbnN0OworICAgIHZpcnR1YWwgc2l6ZV90IHJhbmdlX2xlbmd0aCgpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIHNldF9yYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKTsKKworICAgIE1ldGFEYXRhQmFzZSYgbWV0YV9kYXRhKCk7CisKKyAgICAvLyBDbGVhcnMgbWV0YSBkYXRhIGFuZCByZXNldHMgdGhlIHJhbmdlIHRvIHRoZSBmdWxsIGV4dGVudC4KKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRPYnNlcnZlcihNZWRpYUJ1ZmZlck9ic2VydmVyICpncm91cCk7CisKKyAgICAvLyBSZXR1cm5zIGEgY2xvbmUgb2YgdGhpcyBNZWRpYUJ1ZmZlciBpbmNyZWFzaW5nIGl0cyByZWZlcmVuY2UgY291bnQuCisgICAgLy8gVGhlIGNsb25lIHJlZmVyZW5jZXMgdGhlIHNhbWUgZGF0YSBidXQgaGFzIGl0cyBvd24gcmFuZ2UgYW5kCisgICAgLy8gTWV0YURhdGEuCisgICAgdmlydHVhbCBNZWRpYUJ1ZmZlckJhc2UgKmNsb25lKCk7CisKKyAgICAvLyBzdW0gb2YgbG9jYWxSZWZjb3VudCgpIGFuZCByZW1vdGVSZWZjb3VudCgpCisgICAgdmlydHVhbCBpbnQgcmVmY291bnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsb2NhbFJlZmNvdW50KCkgKyByZW1vdGVSZWZjb3VudCgpOworICAgIH0KKworICAgIHZpcnR1YWwgaW50IGxvY2FsUmVmY291bnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUmVmQ291bnQ7CisgICAgfQorCisgICAgdmlydHVhbCBpbnQgcmVtb3RlUmVmY291bnQoKSBjb25zdCB7CisgICAgICAgIGlmIChtTWVtb3J5LmdldCgpID09IG51bGxwdHIgfHwgbU1lbW9yeS0+cG9pbnRlcigpID09IG51bGxwdHIpIHJldHVybiAwOworICAgICAgICBpbnQzMl90IHJlbW90ZVJlZmNvdW50ID0KKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFNoYXJlZENvbnRyb2wgKj4obU1lbW9yeS0+cG9pbnRlcigpKS0+Z2V0UmVtb3RlUmVmY291bnQoKTsKKyAgICAgICAgLy8gU2FuaXR5IGNoZWNrIHNvIHRoYXQgcmVtb3RlUmVmQ291bnQoKSBpcyBub24tbmVnYXRpdmUuCisgICAgICAgIHJldHVybiByZW1vdGVSZWZjb3VudCA+PSAwID8gcmVtb3RlUmVmY291bnQgOiAwOyAvLyBkbyBub3QgYWxsb3cgY29ycnVwdGVkIGRhdGEuCisgICAgfQorCisgICAgLy8gcmV0dXJucyBvbGQgdmFsdWUKKyAgICBpbnQgYWRkUmVtb3RlUmVmY291bnQoaW50MzJfdCB2YWx1ZSkgeworICAgICAgICBpZiAobU1lbW9yeS5nZXQoKSA9PSBudWxscHRyIHx8IG1NZW1vcnktPnBvaW50ZXIoKSA9PSBudWxscHRyKSByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U2hhcmVkQ29udHJvbCAqPihtTWVtb3J5LT5wb2ludGVyKCkpLT5hZGRSZW1vdGVSZWZjb3VudCh2YWx1ZSk7CisgICAgfQorCisgICAgYm9vbCBpc0RlYWRPYmplY3QoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBpc0RlYWRPYmplY3QobU1lbW9yeSk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgaXNEZWFkT2JqZWN0KGNvbnN0IHNwPElNZW1vcnk+ICZtZW1vcnkpIHsKKyAgICAgICAgaWYgKG1lbW9yeS5nZXQoKSA9PSBudWxscHRyIHx8IG1lbW9yeS0+cG9pbnRlcigpID09IG51bGxwdHIpIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U2hhcmVkQ29udHJvbCAqPihtZW1vcnktPnBvaW50ZXIoKSktPmlzRGVhZE9iamVjdCgpOworICAgIH0KKworICAgIC8vIFN0aWNreSBvbiBlbmFibGluZyBvZiBzaGFyZWQgbWVtb3J5IE1lZGlhQnVmZmVycy4gQnkgZGVmYXVsdCB3ZSBkb24ndCB1c2UKKyAgICAvLyBzaGFyZWQgbWVtb3J5IGZvciBNZWRpYUJ1ZmZlcnMsIGJ1dCB3ZSBlbmFibGUgdGhpcyBmb3IgdGhvc2UgcHJvY2Vzc2VzCisgICAgLy8gdGhhdCBleHBvcnQgTWVkaWFCdWZmZXJzLgorICAgIHN0YXRpYyB2b2lkIHVzZVNoYXJlZE1lbW9yeSgpIHsKKyAgICAgICAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoCisgICAgICAgICAgICAgICAgJm1Vc2VTaGFyZWRNZW1vcnksIChpbnRfbGVhc3QzMl90KTEsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIC8vIHRydWUgaWYgTWVkaWFCdWZmZXIgaXMgb2JzZXJ2ZWQgKHBhcnQgb2YgYSBNZWRpYUJ1ZmZlckdyb3VwKS4KKyAgICBpbmxpbmUgYm9vbCBpc09ic2VydmVkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU9ic2VydmVyICE9IG51bGxwdHI7CisgICAgfQorCisgICAgdmlydHVhbCB+TWVkaWFCdWZmZXIoKTsKKworICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIE1lZGlhQnVmZmVyR3JvdXA7CisgICAgZnJpZW5kIGNsYXNzIE9NWERlY29kZXI7CisgICAgZnJpZW5kIGNsYXNzIEJuTWVkaWFTb3VyY2U7CisgICAgZnJpZW5kIGNsYXNzIEJwTWVkaWFTb3VyY2U7CisKKyAgICAvLyBGb3IgdXNlIGJ5IE9NWERlY29kZXIsIHJlZmVyZW5jZSBjb3VudCBtdXN0IGJlIDEsIGRyb3AgcmVmZXJlbmNlCisgICAgLy8gY291bnQgdG8gMCB3aXRob3V0IHNpZ25hbGxpbmcgdGhlIG9ic2VydmVyLgorICAgIHZvaWQgY2xhaW0oKTsKKworICAgIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgKm1PYnNlcnZlcjsKKyAgICBpbnQgbVJlZkNvdW50OworCisgICAgdm9pZCAqbURhdGE7CisgICAgc2l6ZV90IG1TaXplLCBtUmFuZ2VPZmZzZXQsIG1SYW5nZUxlbmd0aDsKKyAgICBzcDxBQnVmZmVyPiBtQnVmZmVyOworCisgICAgYm9vbCBtT3duc0RhdGE7CisKKyAgICBNZXRhRGF0YUJhc2UqIG1NZXRhRGF0YTsKKworICAgIE1lZGlhQnVmZmVyICptT3JpZ2luYWw7CisKKyAgICBzdGF0aWMgc3RkOjphdG9taWNfaW50X2xlYXN0MzJfdCBtVXNlU2hhcmVkTWVtb3J5OworCisgICAgTWVkaWFCdWZmZXIoY29uc3QgTWVkaWFCdWZmZXIgJik7CisgICAgTWVkaWFCdWZmZXIgJm9wZXJhdG9yPShjb25zdCBNZWRpYUJ1ZmZlciAmKTsKKworICAgIC8vIFNoYXJlZENvbnRyb2wgYmxvY2sgYXQgdGhlIHN0YXJ0IG9mIElNZW1vcnkuCisgICAgc3RydWN0IFNoYXJlZENvbnRyb2wgeworICAgICAgICBlbnVtIHsKKyAgICAgICAgICAgIEZMQUdfREVBRF9PQkpFQ1QgPSAoMSA8PCAwKSwKKyAgICAgICAgfTsKKworICAgICAgICAvLyByZXR1cm5zIG9sZCB2YWx1ZQorICAgICAgICBpbmxpbmUgaW50MzJfdCBhZGRSZW1vdGVSZWZjb3VudChpbnQzMl90IHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gc3RkOjphdG9taWNfZmV0Y2hfYWRkX2V4cGxpY2l0KAorICAgICAgICAgICAgICAgICAgICAmbVJlbW90ZVJlZmNvdW50LCAoaW50X2xlYXN0MzJfdCl2YWx1ZSwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgaW50MzJfdCBnZXRSZW1vdGVSZWZjb3VudCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KCZtUmVtb3RlUmVmY291bnQsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIHZvaWQgc2V0UmVtb3RlUmVmY291bnQoaW50MzJfdCB2YWx1ZSkgeworICAgICAgICAgICAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoCisgICAgICAgICAgICAgICAgICAgICZtUmVtb3RlUmVmY291bnQsIChpbnRfbGVhc3QzMl90KXZhbHVlLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSBib29sIGlzRGVhZE9iamVjdCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAoc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCgKKyAgICAgICAgICAgICAgICAgICAgJm1GbGFncywgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCkgJiBGTEFHX0RFQURfT0JKRUNUKSAhPSAwOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIHZvaWQgc2V0RGVhZE9iamVjdCgpIHsKKyAgICAgICAgICAgICh2b2lkKXN0ZDo6YXRvbWljX2ZldGNoX29yX2V4cGxpY2l0KAorICAgICAgICAgICAgICAgICAgICAmbUZsYWdzLCAoaW50X2xlYXN0MzJfdClGTEFHX0RFQURfT0JKRUNULCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSB2b2lkIGNsZWFyKCkgeworICAgICAgICAgICAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoCisgICAgICAgICAgICAgICAgICAgICZtRmxhZ3MsIChpbnRfbGVhc3QzMl90KTAsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOworICAgICAgICAgICAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoCisgICAgICAgICAgICAgICAgICAgICZtUmVtb3RlUmVmY291bnQsIChpbnRfbGVhc3QzMl90KTAsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICAvLyBDYXV0aW9uOiBhdG9taWNfaW50X2Zhc3QzMl90IGlzIDY0IGJpdHMgb24gTFA2NC4KKyAgICAgICAgc3RkOjphdG9taWNfaW50X2xlYXN0MzJfdCBtRmxhZ3M7CisgICAgICAgIHN0ZDo6YXRvbWljX2ludF9sZWFzdDMyX3QgbVJlbW90ZVJlZmNvdW50OworICAgICAgICBpbnQzMl90IHVudXNlZFs2XSBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSk7IC8vIGFkZGl0aW9uYWwgYnVmZmVyIHNwYWNlCisgICAgfTsKKworICAgIGlubGluZSBTaGFyZWRDb250cm9sICpnZXRTaGFyZWRDb250cm9sKCkgY29uc3QgeworICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U2hhcmVkQ29udHJvbCAqPihtTWVtb3J5LT5wb2ludGVyKCkpOworICAgICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX0JVRkZFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM4ZDk0YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmgKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfQlVGRkVSX0JBU0VfSF8KKworI2RlZmluZSBNRURJQV9CVUZGRVJfQkFTRV9IXworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lZGlhQnVmZmVyQmFzZTsKK2NsYXNzIE1ldGFEYXRhQmFzZTsKKworY2xhc3MgTWVkaWFCdWZmZXJPYnNlcnZlciB7CitwdWJsaWM6CisgICAgTWVkaWFCdWZmZXJPYnNlcnZlcigpIHt9CisgICAgdmlydHVhbCB+TWVkaWFCdWZmZXJPYnNlcnZlcigpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpID0gMDsKKworcHJpdmF0ZToKKyAgICBNZWRpYUJ1ZmZlck9ic2VydmVyKGNvbnN0IE1lZGlhQnVmZmVyT2JzZXJ2ZXIgJik7CisgICAgTWVkaWFCdWZmZXJPYnNlcnZlciAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhQnVmZmVyT2JzZXJ2ZXIgJik7Cit9OworCitjbGFzcyBNZWRpYUJ1ZmZlckJhc2UgeworcHVibGljOgorICAgIHN0YXRpYyBNZWRpYUJ1ZmZlckJhc2UgKkNyZWF0ZShzaXplX3Qgc2l6ZSk7CisKKyAgICAvLyBJZiBNZWRpYUJ1ZmZlckdyb3VwIGlzIHNldCwgZGVjcmVtZW50IHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQ7CisgICAgLy8gaWYgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0byAwLCByZXR1cm4gdGhlIGJ1ZmZlciB0byB0aGUKKyAgICAvLyBhc3NvY2lhdGVkIE1lZGlhQnVmZmVyR3JvdXAuCisgICAgLy8KKyAgICAvLyBJZiBubyBNZWRpYUJ1ZmZlckdyb3VwIGlzIHNldCwgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudCBtdXN0IGJlIHplcm8KKyAgICAvLyB3aGVuIGNhbGxlZCwgd2hlcmV1cG9uIHRoZSBNZWRpYUJ1ZmZlciBpcyBkZWxldGVkLgorICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCkgPSAwOworCisgICAgLy8gSW5jcmVtZW50cyB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50LgorICAgIC8vIFVzZSBvbmx5IHdoZW4gTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQuCisgICAgdmlydHVhbCB2b2lkIGFkZF9yZWYoKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgKmRhdGEoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgc2l6ZV90IHJhbmdlX29mZnNldCgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHNpemVfdCByYW5nZV9sZW5ndGgoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0X3JhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpID0gMDsKKworICAgIHZpcnR1YWwgTWV0YURhdGFCYXNlJiBtZXRhX2RhdGEoKSA9IDA7CisKKyAgICAvLyBDbGVhcnMgbWV0YSBkYXRhIGFuZCByZXNldHMgdGhlIHJhbmdlIHRvIHRoZSBmdWxsIGV4dGVudC4KKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0T2JzZXJ2ZXIoTWVkaWFCdWZmZXJPYnNlcnZlciAqZ3JvdXApID0gMDsKKworICAgIC8vIFJldHVybnMgYSBjbG9uZSBvZiB0aGlzIE1lZGlhQnVmZmVyQmFzZSBpbmNyZWFzaW5nIGl0cyByZWZlcmVuY2UKKyAgICAvLyBjb3VudC4gVGhlIGNsb25lIHJlZmVyZW5jZXMgdGhlIHNhbWUgZGF0YSBidXQgaGFzIGl0cyBvd24gcmFuZ2UgYW5kCisgICAgLy8gTWV0YURhdGEuCisgICAgdmlydHVhbCBNZWRpYUJ1ZmZlckJhc2UgKmNsb25lKCkgPSAwOworCisgICAgdmlydHVhbCBpbnQgcmVmY291bnQoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIGludCBsb2NhbFJlZmNvdW50KCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgaW50IHJlbW90ZVJlZmNvdW50KCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCB+TWVkaWFCdWZmZXJCYXNlKCkge307Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX0JVRkZFUl9CQVNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZDVkZjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaApAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9CVUZGRVJfR1JPVVBfSF8KKworI2RlZmluZSBNRURJQV9CVUZGRVJfR1JPVVBfSF8KKworI2luY2x1ZGUgPGxpc3Q+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTWVkaWFCdWZmZXJCYXNlOworCitjbGFzcyBNZWRpYUJ1ZmZlckdyb3VwIDogcHVibGljIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgeworcHVibGljOgorICAgIE1lZGlhQnVmZmVyR3JvdXAoc2l6ZV90IGdyb3d0aExpbWl0ID0gMCk7CisKKyAgICAvLyBjcmVhdGUgYSBtZWRpYSBidWZmZXIgZ3JvdXAgd2l0aCBwcmVhbGxvY2F0ZWQgYnVmZmVycworICAgIE1lZGlhQnVmZmVyR3JvdXAoc2l6ZV90IGJ1ZmZlcnMsIHNpemVfdCBidWZmZXJfc2l6ZSwgc2l6ZV90IGdyb3d0aExpbWl0ID0gMCk7CisKKyAgICB+TWVkaWFCdWZmZXJHcm91cCgpOworCisgICAgdm9pZCBhZGRfYnVmZmVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKTsKKworICAgIGJvb2wgaGFzX2J1ZmZlcnMoKTsKKworICAgIC8vIElmIG5vbkJsb2NraW5nIGlzIGZhbHNlLCBpdCBibG9ja3MgdW50aWwgYSBidWZmZXIgaXMgYXZhaWxhYmxlIGFuZAorICAgIC8vIHBhc3NlcyBpdCB0byB0aGUgY2FsbGVyIGluICpidWZmZXIsIHdoaWxlIHJldHVybmluZyBPSy4KKyAgICAvLyBUaGUgcmV0dXJuZWQgYnVmZmVyIHdpbGwgaGF2ZSBhIHJlZmVyZW5jZSBjb3VudCBvZiAxLgorICAgIC8vIElmIG5vbkJsb2NraW5nIGlzIHRydWUgYW5kIGEgYnVmZmVyIGlzIG5vdCBpbW1lZGlhdGVseSBhdmFpbGFibGUsCisgICAgLy8gYnVmZmVyIGlzIHNldCB0byBOVUxMIGFuZCBpdCByZXR1cm5zIFdPVUxEX0JMT0NLLgorICAgIC8vIElmIHJlcXVlc3RlZFNpemUgaXMgMCwgYW55IGZyZWUgTWVkaWFCdWZmZXIgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAvLyBJZiByZXF1ZXN0ZWRTaXplIGlzID4gMCwgdGhlIHJldHVybmVkIE1lZGlhQnVmZmVyIHNob3VsZCBoYXZlIGJ1ZmZlcgorICAgIC8vIHNpemUgb2YgYXQgbGVhc3QgcmVxdXN0ZWRTaXplLgorICAgIHN0YXR1c190IGFjcXVpcmVfYnVmZmVyKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBib29sIG5vbkJsb2NraW5nID0gZmFsc2UsIHNpemVfdCByZXF1ZXN0ZWRTaXplID0gMCk7CisKKyAgICBzaXplX3QgYnVmZmVycygpIGNvbnN0OworCisgICAgLy8gSWYgYnVmZmVyIGlzIG51bGxwdHIsIGhhdmUgYWNxdWlyZV9idWZmZXIoKSBjaGVjayBmb3IgcmVtb3RlIHJlbGVhc2UuCisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKTsKKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgSW50ZXJuYWxEYXRhOworICAgIEludGVybmFsRGF0YSAqbUludGVybmFsOworCisgICAgTWVkaWFCdWZmZXJHcm91cChjb25zdCBNZWRpYUJ1ZmZlckdyb3VwICYpOworICAgIE1lZGlhQnVmZmVyR3JvdXAgJm9wZXJhdG9yPShjb25zdCBNZWRpYUJ1ZmZlckdyb3VwICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9CVUZGRVJfR1JPVVBfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjI1MzU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FVEFfREFUQV9IXworCisjZGVmaW5lIE1FVEFfREFUQV9IXworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTWV0YURhdGEgZmluYWwgOiBwdWJsaWMgTWV0YURhdGFCYXNlLCBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisgICAgTWV0YURhdGEoKTsKKyAgICBNZXRhRGF0YShjb25zdCBNZXRhRGF0YSAmZnJvbSk7CisgICAgTWV0YURhdGEoY29uc3QgTWV0YURhdGFCYXNlICZmcm9tKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk1ldGFEYXRhKCk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEJuTWVkaWFTb3VyY2U7CisgICAgZnJpZW5kIGNsYXNzIEJwTWVkaWFTb3VyY2U7CisgICAgZnJpZW5kIGNsYXNzIEJwTWVkaWFFeHRyYWN0b3I7CisgICAgc3RhdGljIHNwPE1ldGFEYXRhPiBjcmVhdGVGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVUQV9EQVRBX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWI3ODA2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaApAQCAtMCwwICsxLDMwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVUQV9EQVRBX0JBU0VfSF8KKworI2RlZmluZSBNRVRBX0RBVEFfQkFTRV9IXworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gVGhlIGZvbGxvd2luZyBrZXlzIG1hcCB0byBpbnQzMl90IGRhdGEgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCitlbnVtIHsKKyAgICBrS2V5TUlNRVR5cGUgICAgICAgICAgPSAnbWltZScsICAvLyBjc3RyaW5nCisgICAga0tleVdpZHRoICAgICAgICAgICAgID0gJ3dpZHQnLCAgLy8gaW50MzJfdCwgaW1hZ2UgcGl4ZWwKKyAgICBrS2V5SGVpZ2h0ICAgICAgICAgICAgPSAnaGVpZycsICAvLyBpbnQzMl90LCBpbWFnZSBwaXhlbAorICAgIGtLZXlEaXNwbGF5V2lkdGggICAgICA9ICdkV2lkJywgIC8vIGludDMyX3QsIGRpc3BsYXkvcHJlc2VudGF0aW9uCisgICAga0tleURpc3BsYXlIZWlnaHQgICAgID0gJ2RIZ3QnLCAgLy8gaW50MzJfdCwgZGlzcGxheS9wcmVzZW50YXRpb24KKyAgICBrS2V5U0FSV2lkdGggICAgICAgICAgPSAnc2FyVycsICAvLyBpbnQzMl90LCBzYW1wbGVBc3BlY3RSYXRpbyB3aWR0aAorICAgIGtLZXlTQVJIZWlnaHQgICAgICAgICA9ICdzYXJIJywgIC8vIGludDMyX3QsIHNhbXBsZUFzcGVjdFJhdGlvIGhlaWdodAorICAgIGtLZXlUaHVtYm5haWxXaWR0aCAgICA9ICd0aGJXJywgIC8vIGludDMyX3QsIHRodW1ibmFpbCB3aWR0aAorICAgIGtLZXlUaHVtYm5haWxIZWlnaHQgICA9ICd0aGJIJywgIC8vIGludDMyX3QsIHRodW1ibmFpbCBoZWlnaHQKKworICAgIC8vIGEgcmVjdGFuZ2xlLCBpZiBhYnNlbnQgYXNzdW1lZCB0byBiZSAoMCwgMCwgd2lkdGggLSAxLCBoZWlnaHQgLSAxKQorICAgIGtLZXlDcm9wUmVjdCAgICAgICAgICA9ICdjcm9wJywKKworICAgIGtLZXlSb3RhdGlvbiAgICAgICAgICA9ICdyb3RBJywgIC8vIGludDMyX3QgKGFuZ2xlIGluIGRlZ3JlZXMpCisgICAga0tleUlGcmFtZXNJbnRlcnZhbCAgID0gJ2lmaXYnLCAgLy8gaW50MzJfdAorICAgIGtLZXlTdHJpZGUgICAgICAgICAgICA9ICdzdHJkJywgIC8vIGludDMyX3QKKyAgICBrS2V5U2xpY2VIZWlnaHQgICAgICAgPSAnc2xodCcsICAvLyBpbnQzMl90CisgICAga0tleUNoYW5uZWxDb3VudCAgICAgID0gJyNjaG4nLCAgLy8gaW50MzJfdAorICAgIGtLZXlDaGFubmVsTWFzayAgICAgICA9ICdjaG5tJywgIC8vIGludDMyX3QKKyAgICBrS2V5U2FtcGxlUmF0ZSAgICAgICAgPSAnc3J0ZScsICAvLyBpbnQzMl90IChhdWRpbyBzYW1wbGluZyByYXRlIEh6KQorICAgIGtLZXlQY21FbmNvZGluZyAgICAgICA9ICdQQ01lJywgIC8vIGludDMyX3QgKGF1ZGlvIGVuY29kaW5nIGVudW0pCisgICAga0tleUZyYW1lUmF0ZSAgICAgICAgID0gJ2ZybVInLCAgLy8gaW50MzJfdCAodmlkZW8gZnJhbWUgcmF0ZSBmcHMpCisgICAga0tleUJpdFJhdGUgICAgICAgICAgID0gJ2JydGUnLCAgLy8gaW50MzJfdCAoYnBzKQorICAgIGtLZXlNYXhCaXRSYXRlICAgICAgICA9ICdteEJyJywgIC8vIGludDMyX3QgKGJwcykKKyAgICBrS2V5U3RyZWFtSGVhZGVyICAgICAgPSAnc3RIZCcsICAvLyByYXcgZGF0YQorICAgIGtLZXlFU0RTICAgICAgICAgICAgICA9ICdlc2RzJywgIC8vIHJhdyBkYXRhCisgICAga0tleUFBQ1Byb2ZpbGUgICAgICAgID0gJ2FhY3AnLCAgLy8gaW50MzJfdAorICAgIGtLZXlBVkNDICAgICAgICAgICAgICA9ICdhdmNjJywgIC8vIHJhdyBkYXRhCisgICAga0tleUhWQ0MgICAgICAgICAgICAgID0gJ2h2Y2MnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5VGh1bWJuYWlsSFZDQyAgICAgPSAndGh2YycsICAvLyByYXcgZGF0YQorICAgIGtLZXlEMjYzICAgICAgICAgICAgICA9ICdkMjYzJywgIC8vIHJhdyBkYXRhCisgICAga0tleVZvcmJpc0luZm8gICAgICAgID0gJ3ZpbmYnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5Vm9yYmlzQm9va3MgICAgICAgPSAndmJvbycsICAvLyByYXcgZGF0YQorICAgIGtLZXlPcHVzSGVhZGVyICAgICAgICA9ICdvaGRyJywgIC8vIHJhdyBkYXRhCisgICAga0tleU9wdXNDb2RlY0RlbGF5ICAgID0gJ29jb2QnLCAgLy8gdWludDY0X3QgKGNvZGVjIGRlbGF5IGluIG5zKQorICAgIGtLZXlPcHVzU2Vla1ByZVJvbGwgICA9ICdvc3ByJywgIC8vIHVpbnQ2NF90IChzZWVrIHByZXJvbGwgaW4gbnMpCisgICAga0tleUZsYWNNZXRhZGF0YSAgICAgID0gJ2ZsTWQnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5VnA5Q29kZWNQcml2YXRlICAgPSAndnA5cCcsICAvLyByYXcgZGF0YSAodnA5IGNzZCBpbmZvcm1hdGlvbikKKyAgICBrS2V5V2FudHNOQUxGcmFnbWVudHMgPSAnTkFMZicsCisgICAga0tleUlzU3luY0ZyYW1lICAgICAgID0gJ3N5bmMnLCAgLy8gaW50MzJfdCAoYm9vbCkKKyAgICBrS2V5SXNDb2RlY0NvbmZpZyAgICAgPSAnY29uZicsICAvLyBpbnQzMl90IChib29sKQorICAgIGtLZXlUaW1lICAgICAgICAgICAgICA9ICd0aW1lJywgIC8vIGludDY0X3QgKHVzZWNzKQorICAgIGtLZXlEZWNvZGluZ1RpbWUgICAgICA9ICdkZWNUJywgIC8vIGludDY0X3QgKGRlY29kaW5nIHRpbWVzdGFtcCBpbiB1c2VjcykKKyAgICBrS2V5TlRQVGltZSAgICAgICAgICAgPSAnbnRwVCcsICAvLyB1aW50NjRfdCAobnRwLXRpbWVzdGFtcCkKKyAgICBrS2V5VGFyZ2V0VGltZSAgICAgICAgPSAndGFyVCcsICAvLyBpbnQ2NF90ICh1c2VjcykKKyAgICBrS2V5RHJpZnRUaW1lICAgICAgICAgPSAnZGZ0VCcsICAvLyBpbnQ2NF90ICh1c2VjcykKKyAgICBrS2V5QW5jaG9yVGltZSAgICAgICAgPSAnYW5jVCcsICAvLyBpbnQ2NF90ICh1c2VjcykKKyAgICBrS2V5RHVyYXRpb24gICAgICAgICAgPSAnZHVyYScsICAvLyBpbnQ2NF90ICh1c2VjcykKKyAgICBrS2V5UGl4ZWxGb3JtYXQgICAgICAgPSAncGl4ZicsICAvLyBpbnQzMl90CisgICAga0tleUNvbG9yRm9ybWF0ICAgICAgID0gJ2NvbGYnLCAgLy8gaW50MzJfdAorICAgIGtLZXlDb2xvclNwYWNlICAgICAgICA9ICdjb2xzJywgIC8vIGludDMyX3QKKyAgICBrS2V5UGxhdGZvcm1Qcml2YXRlICAgPSAncHJpdicsICAvLyBwb2ludGVyCisgICAga0tleURlY29kZXJDb21wb25lbnQgID0gJ2RlY0MnLCAgLy8gY3N0cmluZworICAgIGtLZXlCdWZmZXJJRCAgICAgICAgICA9ICdiZklEJywKKyAgICBrS2V5TWF4SW5wdXRTaXplICAgICAgPSAnaW5wUycsCisgICAga0tleU1heFdpZHRoICAgICAgICAgID0gJ21heFcnLAorICAgIGtLZXlNYXhIZWlnaHQgICAgICAgICA9ICdtYXhIJywKKyAgICBrS2V5VGh1bWJuYWlsVGltZSAgICAgPSAndGhiVCcsICAvLyBpbnQ2NF90ICh1c2VjcykKKyAgICBrS2V5VHJhY2tJRCAgICAgICAgICAgPSAndHJJRCcsCisgICAga0tleUlzRFJNICAgICAgICAgICAgID0gJ2lkcm0nLCAgLy8gaW50MzJfdCAoYm9vbCkKKyAgICBrS2V5RW5jb2RlckRlbGF5ICAgICAgPSAnZW5jZCcsICAvLyBpbnQzMl90IChmcmFtZXMpCisgICAga0tleUVuY29kZXJQYWRkaW5nICAgID0gJ2VuY3AnLCAgLy8gaW50MzJfdCAoZnJhbWVzKQorCisgICAga0tleUFsYnVtICAgICAgICAgICAgID0gJ2FsYnUnLCAgLy8gY3N0cmluZworICAgIGtLZXlBcnRpc3QgICAgICAgICAgICA9ICdhcnRpJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5QWxidW1BcnRpc3QgICAgICAgPSAnYWFydCcsICAvLyBjc3RyaW5nCisgICAga0tleUNvbXBvc2VyICAgICAgICAgID0gJ2NvbXAnLCAgLy8gY3N0cmluZworICAgIGtLZXlHZW5yZSAgICAgICAgICAgICA9ICdnZW5yJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5VGl0bGUgICAgICAgICAgICAgPSAndGl0bCcsICAvLyBjc3RyaW5nCisgICAga0tleVllYXIgICAgICAgICAgICAgID0gJ3llYXInLCAgLy8gY3N0cmluZworICAgIGtLZXlBbGJ1bUFydCAgICAgICAgICA9ICdhbGJBJywgIC8vIGNvbXByZXNzZWQgaW1hZ2UgZGF0YQorICAgIGtLZXlBbGJ1bUFydE1JTUUgICAgICA9ICdhbEFNJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5QXV0aG9yICAgICAgICAgICAgPSAnYXV0aCcsICAvLyBjc3RyaW5nCisgICAga0tleUNEVHJhY2tOdW1iZXIgICAgID0gJ2NkdHInLCAgLy8gY3N0cmluZworICAgIGtLZXlEaXNjTnVtYmVyICAgICAgICA9ICdkbnVtJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5RGF0ZSAgICAgICAgICAgICAgPSAnZGF0ZScsICAvLyBjc3RyaW5nCisgICAga0tleVdyaXRlciAgICAgICAgICAgID0gJ3dyaXQnLCAgLy8gY3N0cmluZworICAgIGtLZXlDb21waWxhdGlvbiAgICAgICA9ICdjcGlsJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5TG9jYXRpb24gICAgICAgICAgPSAnbG9jICcsICAvLyBjc3RyaW5nCisgICAga0tleVRpbWVTY2FsZSAgICAgICAgID0gJ3Rtc2wnLCAgLy8gaW50MzJfdAorICAgIGtLZXlDYXB0dXJlRnJhbWVyYXRlICA9ICdjYXBGJywgIC8vIGZsb2F0IChjYXB0dXJlIGZwcykKKworICAgIC8vIHZpZGVvIHByb2ZpbGUgYW5kIGxldmVsCisgICAga0tleVZpZGVvUHJvZmlsZSAgICAgID0gJ3ZwcmYnLCAgLy8gaW50MzJfdAorICAgIGtLZXlWaWRlb0xldmVsICAgICAgICA9ICd2bGV2JywgIC8vIGludDMyX3QKKworICAgIC8vIFNldCB0aGlzIGtleSB0byBlbmFibGUgYXV0aG9yaW5nIGZpbGVzIGluIDY0LWJpdCBvZmZzZXQKKyAgICBrS2V5NjRCaXRGaWxlT2Zmc2V0ICAgPSAnZm9idCcsICAvLyBpbnQzMl90IChib29sKQorICAgIGtLZXkyQnl0ZU5hbExlbmd0aCAgICA9ICcyTkFMJywgIC8vIGludDMyX3QgKGJvb2wpCisKKyAgICAvLyBJZGVudGlmeSB0aGUgZmlsZSBvdXRwdXQgZm9ybWF0IGZvciBhdXRob3JpbmcKKyAgICAvLyBQbGVhc2Ugc2VlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+IGZvciB0aGUgc3VwcG9ydGVkCisgICAgLy8gZmlsZSBvdXRwdXQgZm9ybWF0cy4KKyAgICBrS2V5RmlsZVR5cGUgICAgICAgICAgPSAnZnR5cCcsICAvLyBpbnQzMl90CisKKyAgICAvLyBUcmFjayBhdXRob3JpbmcgcHJvZ3Jlc3Mgc3RhdHVzCisgICAgLy8ga0tleVRyYWNrVGltZVN0YXR1cyBpcyB1c2VkIHRvIHRyYWNrIHByb2dyZXNzIGluIGVsYXBzZWQgdGltZQorICAgIGtLZXlUcmFja1RpbWVTdGF0dXMgICA9ICd0a3RtJywgIC8vIGludDY0X3QKKworICAgIGtLZXlSZWFsVGltZVJlY29yZGluZyA9ICdydHJjJywgIC8vIGJvb2wgKGludDMyX3QpCisgICAga0tleU51bUJ1ZmZlcnMgICAgICAgID0gJ25iYmYnLCAgLy8gaW50MzJfdAorCisgICAgLy8gT2dnIGZpbGVzIGNhbiBiZSB0YWdnZWQgdG8gYmUgYXV0b21hdGljYWxseSBsb29waW5nLi4uCisgICAga0tleUF1dG9Mb29wICAgICAgICAgID0gJ2F1dEwnLCAgLy8gYm9vbCAoaW50MzJfdCkKKworICAgIGtLZXlWYWxpZFNhbXBsZXMgICAgICA9ICd2YWxEJywgIC8vIGludDMyX3QKKworICAgIGtLZXlJc1VucmVhZGFibGUgICAgICA9ICd1bnJlJywgIC8vIGJvb2wgKGludDMyX3QpCisKKyAgICAvLyBBbiBpbmRpY2F0aW9uIHRoYXQgYSB2aWRlbyBidWZmZXIgaGFzIGJlZW4gcmVuZGVyZWQuCisgICAga0tleVJlbmRlcmVkICAgICAgICAgID0gJ3JlbmQnLCAgLy8gYm9vbCAoaW50MzJfdCkKKworICAgIC8vIFRoZSBsYW5ndWFnZSBjb2RlIGZvciB0aGlzIG1lZGlhCisgICAga0tleU1lZGlhTGFuZ3VhZ2UgICAgID0gJ2xhbmcnLCAgLy8gY3N0cmluZworCisgICAgLy8gVG8gc3RvcmUgdGhlIHRpbWVkIHRleHQgZm9ybWF0IGRhdGEKKyAgICBrS2V5VGV4dEZvcm1hdERhdGEgICAgPSAndGV4dCcsICAvLyByYXcgZGF0YQorCisgICAga0tleVJlcXVpcmVzU2VjdXJlQnVmZmVycyA9ICdzZWN1JywgIC8vIGJvb2wgKGludDMyX3QpCisKKyAgICBrS2V5SXNBRFRTICAgICAgICAgICAgPSAnYWR0cycsICAvLyBib29sIChpbnQzMl90KQorICAgIGtLZXlBQUNBT1QgICAgICAgICAgICA9ICdhYW90JywgIC8vIGludDMyX3QKKworICAgIC8vIElmIGEgTWVkaWFCdWZmZXIncyBkYXRhIHJlcHJlc2VudHMgKGF0IGxlYXN0IHBhcnRpYWxseSkgZW5jcnlwdGVkCisgICAgLy8gZGF0YSwgdGhlIGZvbGxvd2luZyBmaWVsZHMgYWlkIGluIGRlY3J5cHRpb24uCisgICAgLy8gVGhlIGRhdGEgY2FuIGJlIHRob3VnaHQgb2YgYXMgcGFpcnMgb2YgcGxhaW4gYW5kIGVuY3J5cHRlZCBkYXRhCisgICAgLy8gZnJhZ21lbnRzLCBpLmUuIHBsYWluIGFuZCBlbmNyeXB0ZWQgZGF0YSBhbHRlcm5hdGUuCisgICAgLy8gVGhlIGZpcnN0IGZyYWdtZW50IGlzIGJ5IGNvbnZlbnRpb24gcGxhaW4gZGF0YSAoaWYgdGhhdCdzIG5vdCB0aGUKKyAgICAvLyBjYXNlLCBzaW1wbHkgc3BlY2lmeSBwbGFpbiBmcmFnbWVudCBzaXplIG9mIDApLgorICAgIC8vIGtLZXlFbmNyeXB0ZWRTaXplcyBhbmQga0tleVBsYWluU2l6ZXMgZWFjaCBtYXAgdG8gYW4gYXJyYXkgb2YKKyAgICAvLyBzaXplX3QgdmFsdWVzLiBUaGUgc3VtIHRvdGFsIG9mIGFsbCBzaXplX3QgdmFsdWVzIG9mIGJvdGggYXJyYXlzCisgICAgLy8gbXVzdCBlcXVhbCB0aGUgYW1vdW50IG9mIGRhdGEgKGkuZS4gTWVkaWFCdWZmZXIncyByYW5nZV9sZW5ndGgoKSkuCisgICAgLy8gSWYgYm90aCBhcnJheXMgYXJlIHByZXNlbnQsIHRoZXkgbXVzdCBiZSBvZiB0aGUgc2FtZSBzaXplLgorICAgIC8vIElmIG9ubHkgZW5jcnlwdGVkIHNpemVzIGFyZSBwcmVzZW50IGl0IGlzIGFzc3VtZWQgdGhhdCBhbGwKKyAgICAvLyBwbGFpbiBzaXplcyBhcmUgMCwgaS5lLiBhbGwgZnJhZ21lbnRzIGFyZSBlbmNyeXB0ZWQuCisgICAgLy8gVG8gcHJvZ3JhbW1hdGljYWxseSBzZXQgdGhlc2UgYXJyYXksIHVzZSB0aGUgTWV0YURhdGFCYXNlOjpzZXREYXRhIEFQSSwgaS5lLgorICAgIC8vIGNvbnN0IHNpemVfdCBlbmNTaXplc1tdOworICAgIC8vIG1ldGEtPnNldERhdGEoCisgICAgLy8gIGtLZXlFbmNyeXB0ZWRTaXplcywgMCAvKiB0eXBlICovLCBlbmNTaXplcywgc2l6ZW9mKGVuY1NpemVzKSk7CisgICAgLy8gQSBwbGFpbiBzaXplcyBhcnJheSBieSBpdHNlbGYgbWFrZXMgbm8gc2Vuc2UuCisgICAga0tleUVuY3J5cHRlZFNpemVzICAgID0gJ2VuY3InLCAgLy8gc2l6ZV90W10KKyAgICBrS2V5UGxhaW5TaXplcyAgICAgICAgPSAncGxhaScsICAvLyBzaXplX3RbXQorICAgIGtLZXlDcnlwdG9LZXkgICAgICAgICA9ICdjcnlLJywgIC8vIHVpbnQ4X3RbMTZdCisgICAga0tleUNyeXB0b0lWICAgICAgICAgID0gJ2NyeUknLCAgLy8gdWludDhfdFsxNl0KKyAgICBrS2V5Q3J5cHRvTW9kZSAgICAgICAgPSAnY3J5TScsICAvLyBpbnQzMl90CisKKyAgICBrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSA9ICdjcnlTJywgIC8vIGludDMyX3QKKworICAgIGtLZXlQc3NoICAgICAgICAgICAgICA9ICdwc3NoJywgIC8vIHJhdyBkYXRhCisgICAga0tleUNBU3lzdGVtSUQgICAgICAgID0gJ2NhaWQnLCAgLy8gaW50MzJfdAorICAgIGtLZXlDQVNlc3Npb25JRCAgICAgICA9ICdzZWlkJywgIC8vIHJhdyBkYXRhCisKKyAgICAvLyBQbGVhc2Ugc2VlIE1lZGlhRm9ybWF0LktFWV9JU19BVVRPU0VMRUNULgorICAgIGtLZXlUcmFja0lzQXV0b3NlbGVjdCA9ICdhdXRvJywgLy8gYm9vbCAoaW50MzJfdCkKKyAgICAvLyBQbGVhc2Ugc2VlIE1lZGlhRm9ybWF0LktFWV9JU19ERUZBVUxULgorICAgIGtLZXlUcmFja0lzRGVmYXVsdCAgICA9ICdkZmx0JywgLy8gYm9vbCAoaW50MzJfdCkKKyAgICAvLyBTaW1pbGFyIHRvIE1lZGlhRm9ybWF0LktFWV9JU19GT1JDRURfU1VCVElUTEUgYnV0IHBlcnRhaW5zIHRvIGF2IHRyYWNrcyBhcyB3ZWxsLgorICAgIGtLZXlUcmFja0lzRm9yY2VkICAgICA9ICdmcmNkJywgLy8gYm9vbCAoaW50MzJfdCkKKworICAgIC8vIEgyNjQgc3VwcGxlbWVudGFsIGVuaGFuY2VtZW50IGluZm9ybWF0aW9uIG9mZnNldHMvc2l6ZXMKKyAgICBrS2V5U0VJICAgICAgICAgICAgICAgPSAnc2VpICcsIC8vIHJhdyBkYXRhCisKKyAgICAvLyBNUEVHIHVzZXIgZGF0YSBvZmZzZXRzCisgICAga0tleU1wZWdVc2VyRGF0YSAgICAgID0gJ21wdWQnLCAvLyBzaXplX3RbXQorCisgICAgLy8gU2l6ZSBvZiBOQUxVIGxlbmd0aCBpbiBta3YvbXA0CisgICAga0tleU5hbExlbmd0aFNpemUgICAgID0gJ25hbHMnLCAvLyBpbnQzMl90CisKKyAgICAvLyBIRFIgcmVsYXRlZAorICAgIGtLZXlIZHJTdGF0aWNJbmZvICAgID0gJ2hkclMnLCAvLyBIRFJTdGF0aWNJbmZvCisKKyAgICAvLyBjb2xvciBhc3BlY3RzCisgICAga0tleUNvbG9yUmFuZ2UgICAgICAgPSAnY1JuZycsIC8vIGludDMyX3QsIGNvbG9yIHJhbmdlLCB2YWx1ZSBkZWZpbmVkIGJ5IENvbG9yQXNwZWN0cy5SYW5nZQorICAgIGtLZXlDb2xvclByaW1hcmllcyAgID0gJ2NQcm0nLCAvLyBpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xvciBQcmltYXJpZXMsIHZhbHVlIGRlZmluZWQgYnkgQ29sb3JBc3BlY3RzLlByaW1hcmllcworICAgIGtLZXlUcmFuc2ZlckZ1bmN0aW9uID0gJ3RGdW4nLCAvLyBpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmFuc2ZlciBGdW5jdGlvbiwgdmFsdWUgZGVmaW5lZCBieSBDb2xvckFzcGVjdHMuVHJhbnNmZXIuCisgICAga0tleUNvbG9yTWF0cml4ICAgICAgPSAnY010eCcsIC8vIGludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbG9yIE1hdHJpeCwgdmFsdWUgZGVmaW5lZCBieSBDb2xvckFzcGVjdHMuTWF0cml4Q29lZmZzLgorICAgIGtLZXlUZW1wb3JhbExheWVySWQgID0gJ2lMeXInLCAvLyBpbnQzMl90LCB0ZW1wb3JhbCBsYXllci1pZC4gMC1iYXNlZCAoMCA9PiBiYXNlIGxheWVyKQorICAgIGtLZXlUZW1wb3JhbExheWVyQ291bnQgPSAnY0x5cicsIC8vIGludDMyX3QsIG51bWJlciBvZiB0ZW1wb3JhbCBsYXllcnMgZW5jb2RlZAorCisgICAga0tleVRpbGVXaWR0aCAgICAgICAgPSAndGlsVycsIC8vIGludDMyX3QsIEhFSUYgdGlsZSB3aWR0aAorICAgIGtLZXlUaWxlSGVpZ2h0ICAgICAgID0gJ3RpbEgnLCAvLyBpbnQzMl90LCBIRUlGIHRpbGUgaGVpZ2h0CisgICAga0tleUdyaWRSb3dzICAgICAgICAgPSAnZ3JkUicsIC8vIGludDMyX3QsIEhFSUYgZ3JpZCByb3dzCisgICAga0tleUdyaWRDb2xzICAgICAgICAgPSAnZ3JkQycsIC8vIGludDMyX3QsIEhFSUYgZ3JpZCBjb2x1bW5zCisgICAga0tleUljY1Byb2ZpbGUgICAgICAgPSAncHJvZicsIC8vIHJhdyBkYXRhLCBJQ0MgcHJvZmlsZSBkYXRhCisgICAga0tleUlzUHJpbWFyeUltYWdlICAgPSAncHJpbScsIC8vIGJvb2wgKGludDMyX3QpLCBpbWFnZSB0cmFjayBpcyB0aGUgcHJpbWFyeSBpbWFnZQorICAgIGtLZXlGcmFtZUNvdW50ICAgICAgID0gJ25mcm0nLCAvLyBpbnQzMl90LCB0b3RhbCBudW1iZXIgb2YgZnJhbWUgaW4gdmlkZW8gdHJhY2sKKyAgICBrS2V5RXhpZk9mZnNldCAgICAgICA9ICdleG9mJywgLy8gaW50NjRfdCwgRXhpZiBkYXRhIG9mZnNldAorICAgIGtLZXlFeGlmU2l6ZSAgICAgICAgID0gJ2V4c3onLCAvLyBpbnQ2NF90LCBFeGlmIGRhdGEgc2l6ZQorfTsKKworZW51bSB7CisgICAga1R5cGVFU0RTICAgICAgICA9ICdlc2RzJywKKyAgICBrVHlwZUFWQ0MgICAgICAgID0gJ2F2Y2MnLAorICAgIGtUeXBlSFZDQyAgICAgICAgPSAnaHZjYycsCisgICAga1R5cGVEMjYzICAgICAgICA9ICdkMjYzJywKK307CisKK2NsYXNzIFBhcmNlbDsKKworY2xhc3MgTWV0YURhdGFCYXNlIHsKK3B1YmxpYzoKKyAgICBNZXRhRGF0YUJhc2UoKTsKKyAgICBNZXRhRGF0YUJhc2UoY29uc3QgTWV0YURhdGFCYXNlICZmcm9tKTsKKyAgICBNZXRhRGF0YUJhc2UmIG9wZXJhdG9yID0gKGNvbnN0IE1ldGFEYXRhQmFzZSAmKTsKKworICAgIHZpcnR1YWwgfk1ldGFEYXRhQmFzZSgpOworCisgICAgZW51bSBUeXBlIHsKKyAgICAgICAgVFlQRV9OT05FICAgICA9ICdub25lJywKKyAgICAgICAgVFlQRV9DX1NUUklORyA9ICdjc3RyJywKKyAgICAgICAgVFlQRV9JTlQzMiAgICA9ICdpbjMyJywKKyAgICAgICAgVFlQRV9JTlQ2NCAgICA9ICdpbjY0JywKKyAgICAgICAgVFlQRV9GTE9BVCAgICA9ICdmbG9hJywKKyAgICAgICAgVFlQRV9QT0lOVEVSICA9ICdwdHIgJywKKyAgICAgICAgVFlQRV9SRUNUICAgICA9ICdyZWN0JywKKyAgICB9OworCisgICAgdm9pZCBjbGVhcigpOworICAgIGJvb2wgcmVtb3ZlKHVpbnQzMl90IGtleSk7CisKKyAgICBib29sIHNldENTdHJpbmcodWludDMyX3Qga2V5LCBjb25zdCBjaGFyICp2YWx1ZSk7CisgICAgYm9vbCBzZXRJbnQzMih1aW50MzJfdCBrZXksIGludDMyX3QgdmFsdWUpOworICAgIGJvb2wgc2V0SW50NjQodWludDMyX3Qga2V5LCBpbnQ2NF90IHZhbHVlKTsKKyAgICBib29sIHNldEZsb2F0KHVpbnQzMl90IGtleSwgZmxvYXQgdmFsdWUpOworICAgIGJvb2wgc2V0UG9pbnRlcih1aW50MzJfdCBrZXksIHZvaWQgKnZhbHVlKTsKKworICAgIGJvb2wgc2V0UmVjdCgKKyAgICAgICAgICAgIHVpbnQzMl90IGtleSwKKyAgICAgICAgICAgIGludDMyX3QgbGVmdCwgaW50MzJfdCB0b3AsCisgICAgICAgICAgICBpbnQzMl90IHJpZ2h0LCBpbnQzMl90IGJvdHRvbSk7CisKKyAgICBib29sIGZpbmRDU3RyaW5nKHVpbnQzMl90IGtleSwgY29uc3QgY2hhciAqKnZhbHVlKSBjb25zdDsKKyAgICBib29sIGZpbmRJbnQzMih1aW50MzJfdCBrZXksIGludDMyX3QgKnZhbHVlKSBjb25zdDsKKyAgICBib29sIGZpbmRJbnQ2NCh1aW50MzJfdCBrZXksIGludDY0X3QgKnZhbHVlKSBjb25zdDsKKyAgICBib29sIGZpbmRGbG9hdCh1aW50MzJfdCBrZXksIGZsb2F0ICp2YWx1ZSkgY29uc3Q7CisgICAgYm9vbCBmaW5kUG9pbnRlcih1aW50MzJfdCBrZXksIHZvaWQgKip2YWx1ZSkgY29uc3Q7CisKKyAgICBib29sIGZpbmRSZWN0KAorICAgICAgICAgICAgdWludDMyX3Qga2V5LAorICAgICAgICAgICAgaW50MzJfdCAqbGVmdCwgaW50MzJfdCAqdG9wLAorICAgICAgICAgICAgaW50MzJfdCAqcmlnaHQsIGludDMyX3QgKmJvdHRvbSkgY29uc3Q7CisKKyAgICBib29sIHNldERhdGEodWludDMyX3Qga2V5LCB1aW50MzJfdCB0eXBlLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICBib29sIGZpbmREYXRhKHVpbnQzMl90IGtleSwgdWludDMyX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICoqZGF0YSwgc2l6ZV90ICpzaXplKSBjb25zdDsKKworICAgIGJvb2wgaGFzRGF0YSh1aW50MzJfdCBrZXkpIGNvbnN0OworCisgICAgU3RyaW5nOCB0b1N0cmluZygpIGNvbnN0OworICAgIHZvaWQgZHVtcFRvTG9nKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEJwTWVkaWFTb3VyY2U7CisgICAgZnJpZW5kIGNsYXNzIEJuTWVkaWFTb3VyY2U7CisgICAgZnJpZW5kIGNsYXNzIEJuTWVkaWFFeHRyYWN0b3I7CisgICAgZnJpZW5kIGNsYXNzIE1ldGFEYXRhOworCisgICAgc3RydWN0IHR5cGVkX2RhdGE7CisgICAgc3RydWN0IFJlY3Q7CisgICAgc3RydWN0IE1ldGFEYXRhSW50ZXJuYWw7CisgICAgTWV0YURhdGFJbnRlcm5hbCAqbUludGVybmFsRGF0YTsKKyAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAmcGFyY2VsKTsKKyAgICBzdGF0dXNfdCB1cGRhdGVGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVUQV9EQVRBX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9BbmRyb2lkLmJwCmluZGV4IDE1ZGFjNTkuLjA3ZTEyNGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9BbmRyb2lkLmJwCkBAIC0xLDQgKzEsNiBAQAotY2NfbGlicmFyeV9zaGFyZWQgeworLy8gVE9ETzogY2hhbmdlIGl0IGJhY2sgdG8gY2NfbGlicmFyeV9zaGFyZWQgd2hlbiB0aGVyZSBpcyBhIHdheSB0bworLy8gZXhwb3NlIG1lZGlhIG1ldHJpY3MgYXMgc3RhYmxlIEFQSS4KK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJtZWRpYW1ldHJpY3MiLAogCiAgICAgc3JjczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhQW5hbHl0aWNzSXRlbS5jcHAgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFBbmFseXRpY3NJdGVtLmNwcAppbmRleCBmOTY4YzA5Li4xMzVjOWI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFBbmFseXRpY3NJdGVtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFBbmFseXRpY3NJdGVtLmNwcApAQCAtMjksOCArMjksNiBAQAogI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIAotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgotCiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUFuYWx5dGljc1NlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KQEAgLTYyLDcgKzYwLDcgQEAKICAgICAgIG1Qa2dWZXJzaW9uQ29kZSgwKSwKICAgICAgIG1TZXNzaW9uSUQoTWVkaWFBbmFseXRpY3NJdGVtOjpTZXNzaW9uSUROb25lKSwKICAgICAgIG1UaW1lc3RhbXAoMCksCi0gICAgICBtRmluYWxpemVkKDApLAorICAgICAgbUZpbmFsaXplZCgxKSwKICAgICAgIG1Qcm9wQ291bnQoMCksIG1Qcm9wU2l6ZSgwKSwgbVByb3BzKE5VTEwpCiB7CiAgICAgbUtleSA9IE1lZGlhQW5hbHl0aWNzSXRlbTo6a0tleU5vbmU7CkBAIC03NCw3ICs3Miw3IEBACiAgICAgICBtUGtnVmVyc2lvbkNvZGUoMCksCiAgICAgICBtU2Vzc2lvbklEKE1lZGlhQW5hbHl0aWNzSXRlbTo6U2Vzc2lvbklETm9uZSksCiAgICAgICBtVGltZXN0YW1wKDApLAotICAgICAgbUZpbmFsaXplZCgwKSwKKyAgICAgIG1GaW5hbGl6ZWQoMSksCiAgICAgICBtUHJvcENvdW50KDApLCBtUHJvcFNpemUoMCksIG1Qcm9wcyhOVUxMKQogewogICAgIGlmIChERUJVR19BTExPQ0FUSU9OUykgewpAQCAtMTM5LDE2ICsxMzcsNiBAQAogICAgIHJldHVybiBkc3Q7CiB9CiAKLS8vIHNvIGNsaWVudHMgY2FuIHNlbmQgaW50ZXJtZWRpYXRlIHZhbHVlcyB0byBiZSBvdmVybGFpZCBsYXRlcgotTWVkaWFBbmFseXRpY3NJdGVtICZNZWRpYUFuYWx5dGljc0l0ZW06OnNldEZpbmFsaXplZChib29sIHZhbHVlKSB7Ci0gICAgbUZpbmFsaXplZCA9IHZhbHVlOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotYm9vbCBNZWRpYUFuYWx5dGljc0l0ZW06OmdldEZpbmFsaXplZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUZpbmFsaXplZDsKLX0KLQogTWVkaWFBbmFseXRpY3NJdGVtICZNZWRpYUFuYWx5dGljc0l0ZW06OnNldFNlc3Npb25JRChNZWRpYUFuYWx5dGljc0l0ZW06OlNlc3Npb25JRF90IGlkKSB7CiAgICAgbVNlc3Npb25JRCA9IGlkOwogICAgIHJldHVybiAqdGhpczsKQEAgLTIwNSwyMSArMTkzLDE3IEBACiAgICAgcmV0dXJuIG1VaWQ7CiB9CiAKLU1lZGlhQW5hbHl0aWNzSXRlbSAmTWVkaWFBbmFseXRpY3NJdGVtOjpzZXRQa2dOYW1lKEFTdHJpbmcgcGtnTmFtZSkgeworTWVkaWFBbmFseXRpY3NJdGVtICZNZWRpYUFuYWx5dGljc0l0ZW06OnNldFBrZ05hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJnBrZ05hbWUpIHsKICAgICBtUGtnTmFtZSA9IHBrZ05hbWU7CiAgICAgcmV0dXJuICp0aGlzOwogfQogCi1BU3RyaW5nIE1lZGlhQW5hbHl0aWNzSXRlbTo6Z2V0UGtnTmFtZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVBrZ05hbWU7Ci19Ci0KLU1lZGlhQW5hbHl0aWNzSXRlbSAmTWVkaWFBbmFseXRpY3NJdGVtOjpzZXRQa2dWZXJzaW9uQ29kZShpbnQzMl90IHBrZ1ZlcnNpb25Db2RlKSB7CitNZWRpYUFuYWx5dGljc0l0ZW0gJk1lZGlhQW5hbHl0aWNzSXRlbTo6c2V0UGtnVmVyc2lvbkNvZGUoaW50NjRfdCBwa2dWZXJzaW9uQ29kZSkgewogICAgIG1Qa2dWZXJzaW9uQ29kZSA9IHBrZ1ZlcnNpb25Db2RlOwogICAgIHJldHVybiAqdGhpczsKIH0KIAotaW50MzJfdCBNZWRpYUFuYWx5dGljc0l0ZW06OmdldFBrZ1ZlcnNpb25Db2RlKCkgY29uc3QgeworaW50NjRfdCBNZWRpYUFuYWx5dGljc0l0ZW06OmdldFBrZ1ZlcnNpb25Db2RlKCkgY29uc3QgewogICAgIHJldHVybiBtUGtnVmVyc2lvbkNvZGU7CiB9CiAKQEAgLTI2NCwxMiArMjQ4LDE3IEBACiB9CiAKIHZvaWQgTWVkaWFBbmFseXRpY3NJdGVtOjpQcm9wOjpzZXROYW1lKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pIHsKLSAgICBtTmFtZUxlbiA9IGxlbjsKKyAgICBmcmVlKCh2b2lkICopbU5hbWUpOwogICAgIG1OYW1lID0gKGNvbnN0IGNoYXIgKikgbWFsbG9jKGxlbisxKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1OYW1lID09IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIG1hbGxvYygpIGZvciBwcm9wZXJ0eSAnJXMnIChsZW4gJXp1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBsZW4pOwogICAgIG1lbWNweSAoKHZvaWQgKiltTmFtZSwgbmFtZSwgbGVuKzEpOworICAgIG1OYW1lTGVuID0gbGVuOwogfQogCi0vLyB1c2VkIG9ubHkgYXMgcGFydCBvZiBhIHN0b3Jpbmcgb3BlcmF0aW9uCisvLyBjb25zaWRlciB0aGlzICJmaW5kLW9yLWFsbG9jYXRlIi4KKy8vIGNhbGxlciB2YWxpZGF0ZXMgdHlwZSBhbmQgdXNlcyBjbGVhclByb3BWYWx1ZSgpIGFjY29yZGluZ2x5CiBNZWRpYUFuYWx5dGljc0l0ZW06OlByb3AgKk1lZGlhQW5hbHl0aWNzSXRlbTo6YWxsb2NhdGVQcm9wKGNvbnN0IGNoYXIgKm5hbWUpIHsKICAgICBzaXplX3QgbGVuID0gc3RybGVuKG5hbWUpOwogICAgIHNpemVfdCBpID0gZmluZFByb3BJbmRleChuYW1lLCBsZW4pOwpAQCAtMjc5LDEzICsyNjgsMTQgQEAKICAgICAgICAgcHJvcCA9ICZtUHJvcHNbaV07CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKGkgPT0gbVByb3BTaXplKSB7Ci0gICAgICAgICAgICBncm93UHJvcHMoKTsKLSAgICAgICAgICAgIC8vIFhYWDogdmVyaWZ5IHN1Y2Nlc3MKKyAgICAgICAgICAgIGlmIChncm93UHJvcHMoKSA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgYWxsb2NhdGlvbiBmb3IgbmV3IHByb3BzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaSA9IG1Qcm9wQ291bnQrKzsKICAgICAgICAgcHJvcCA9ICZtUHJvcHNbaV07CiAgICAgICAgIHByb3AtPnNldE5hbWUobmFtZSwgbGVuKTsKLSAgICAgICAgcHJvcC0+bVR5cGUgPSBrVHlwZU5vbmU7ICAgICAgICAvLyBtYWtlIGNhbGxlciBzZXQgdHlwZSBpbmZvCiAgICAgfQogCiAgICAgcmV0dXJuIHByb3A7CkBAIC0zMTIsNDEgKzMwMiw1OSBAQAogLy8gc2V0IHRoZSB2YWx1ZXMKIHZvaWQgTWVkaWFBbmFseXRpY3NJdGVtOjpzZXRJbnQzMihNZWRpYUFuYWx5dGljc0l0ZW06OkF0dHIgbmFtZSwgaW50MzJfdCB2YWx1ZSkgewogICAgIFByb3AgKnByb3AgPSBhbGxvY2F0ZVByb3AobmFtZSk7Ci0gICAgcHJvcC0+bVR5cGUgPSBrVHlwZUludDMyOwotICAgIHByb3AtPnUuaW50MzJWYWx1ZSA9IHZhbHVlOworICAgIGlmIChwcm9wICE9IE5VTEwpIHsKKyAgICAgICAgY2xlYXJQcm9wVmFsdWUocHJvcCk7CisgICAgICAgIHByb3AtPm1UeXBlID0ga1R5cGVJbnQzMjsKKyAgICAgICAgcHJvcC0+dS5pbnQzMlZhbHVlID0gdmFsdWU7CisgICAgfQogfQogCiB2b2lkIE1lZGlhQW5hbHl0aWNzSXRlbTo6c2V0SW50NjQoTWVkaWFBbmFseXRpY3NJdGVtOjpBdHRyIG5hbWUsIGludDY0X3QgdmFsdWUpIHsKICAgICBQcm9wICpwcm9wID0gYWxsb2NhdGVQcm9wKG5hbWUpOwotICAgIHByb3AtPm1UeXBlID0ga1R5cGVJbnQ2NDsKLSAgICBwcm9wLT51LmludDY0VmFsdWUgPSB2YWx1ZTsKKyAgICBpZiAocHJvcCAhPSBOVUxMKSB7CisgICAgICAgIGNsZWFyUHJvcFZhbHVlKHByb3ApOworICAgICAgICBwcm9wLT5tVHlwZSA9IGtUeXBlSW50NjQ7CisgICAgICAgIHByb3AtPnUuaW50NjRWYWx1ZSA9IHZhbHVlOworICAgIH0KIH0KIAogdm9pZCBNZWRpYUFuYWx5dGljc0l0ZW06OnNldERvdWJsZShNZWRpYUFuYWx5dGljc0l0ZW06OkF0dHIgbmFtZSwgZG91YmxlIHZhbHVlKSB7CiAgICAgUHJvcCAqcHJvcCA9IGFsbG9jYXRlUHJvcChuYW1lKTsKLSAgICBwcm9wLT5tVHlwZSA9IGtUeXBlRG91YmxlOwotICAgIHByb3AtPnUuZG91YmxlVmFsdWUgPSB2YWx1ZTsKKyAgICBpZiAocHJvcCAhPSBOVUxMKSB7CisgICAgICAgIGNsZWFyUHJvcFZhbHVlKHByb3ApOworICAgICAgICBwcm9wLT5tVHlwZSA9IGtUeXBlRG91YmxlOworICAgICAgICBwcm9wLT51LmRvdWJsZVZhbHVlID0gdmFsdWU7CisgICAgfQogfQogCiB2b2lkIE1lZGlhQW5hbHl0aWNzSXRlbTo6c2V0Q1N0cmluZyhNZWRpYUFuYWx5dGljc0l0ZW06OkF0dHIgbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpIHsKIAogICAgIFByb3AgKnByb3AgPSBhbGxvY2F0ZVByb3AobmFtZSk7CiAgICAgLy8gYW55IG9sZCB2YWx1ZSB3aWxsIGJlIGdvbmUKLSAgICBwcm9wLT5tVHlwZSA9IGtUeXBlQ1N0cmluZzsKLSAgICBwcm9wLT51LkNTdHJpbmdWYWx1ZSA9IHN0cmR1cCh2YWx1ZSk7CisgICAgaWYgKHByb3AgIT0gTlVMTCkgeworICAgICAgICBjbGVhclByb3BWYWx1ZShwcm9wKTsKKyAgICAgICAgcHJvcC0+bVR5cGUgPSBrVHlwZUNTdHJpbmc7CisgICAgICAgIHByb3AtPnUuQ1N0cmluZ1ZhbHVlID0gc3RyZHVwKHZhbHVlKTsKKyAgICB9CiB9CiAKIHZvaWQgTWVkaWFBbmFseXRpY3NJdGVtOjpzZXRSYXRlKE1lZGlhQW5hbHl0aWNzSXRlbTo6QXR0ciBuYW1lLCBpbnQ2NF90IGNvdW50LCBpbnQ2NF90IGR1cmF0aW9uKSB7CiAgICAgUHJvcCAqcHJvcCA9IGFsbG9jYXRlUHJvcChuYW1lKTsKLSAgICBwcm9wLT5tVHlwZSA9IGtUeXBlUmF0ZTsKLSAgICBwcm9wLT51LnJhdGUuY291bnQgPSBjb3VudDsKLSAgICBwcm9wLT51LnJhdGUuZHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICBpZiAocHJvcCAhPSBOVUxMKSB7CisgICAgICAgIGNsZWFyUHJvcFZhbHVlKHByb3ApOworICAgICAgICBwcm9wLT5tVHlwZSA9IGtUeXBlUmF0ZTsKKyAgICAgICAgcHJvcC0+dS5yYXRlLmNvdW50ID0gY291bnQ7CisgICAgICAgIHByb3AtPnUucmF0ZS5kdXJhdGlvbiA9IGR1cmF0aW9uOworICAgIH0KIH0KIAogCiAvLyBmaW5kL2FkZC9zZXQgZnVzZWQgaW50byBhIHNpbmdsZSBvcGVyYXRpb24KIHZvaWQgTWVkaWFBbmFseXRpY3NJdGVtOjphZGRJbnQzMihNZWRpYUFuYWx5dGljc0l0ZW06OkF0dHIgbmFtZSwgaW50MzJfdCB2YWx1ZSkgewogICAgIFByb3AgKnByb3AgPSBhbGxvY2F0ZVByb3AobmFtZSk7CisgICAgaWYgKHByb3AgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQogICAgIHN3aXRjaCAocHJvcC0+bVR5cGUpIHsKICAgICAgICAgY2FzZSBrVHlwZUludDMyOgogICAgICAgICAgICAgcHJvcC0+dS5pbnQzMlZhbHVlICs9IHZhbHVlOwpAQCAtMzYxLDYgKzM2OSw5IEBACiAKIHZvaWQgTWVkaWFBbmFseXRpY3NJdGVtOjphZGRJbnQ2NChNZWRpYUFuYWx5dGljc0l0ZW06OkF0dHIgbmFtZSwgaW50NjRfdCB2YWx1ZSkgewogICAgIFByb3AgKnByb3AgPSBhbGxvY2F0ZVByb3AobmFtZSk7CisgICAgaWYgKHByb3AgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQogICAgIHN3aXRjaCAocHJvcC0+bVR5cGUpIHsKICAgICAgICAgY2FzZSBrVHlwZUludDY0OgogICAgICAgICAgICAgcHJvcC0+dS5pbnQ2NFZhbHVlICs9IHZhbHVlOwpAQCAtMzc1LDYgKzM4Niw5IEBACiAKIHZvaWQgTWVkaWFBbmFseXRpY3NJdGVtOjphZGRSYXRlKE1lZGlhQW5hbHl0aWNzSXRlbTo6QXR0ciBuYW1lLCBpbnQ2NF90IGNvdW50LCBpbnQ2NF90IGR1cmF0aW9uKSB7CiAgICAgUHJvcCAqcHJvcCA9IGFsbG9jYXRlUHJvcChuYW1lKTsKKyAgICBpZiAocHJvcCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgc3dpdGNoIChwcm9wLT5tVHlwZSkgewogICAgICAgICBjYXNlIGtUeXBlUmF0ZToKICAgICAgICAgICAgIHByb3AtPnUucmF0ZS5jb3VudCArPSBjb3VudDsKQEAgLTM5MSw2ICs0MDUsOSBAQAogCiB2b2lkIE1lZGlhQW5hbHl0aWNzSXRlbTo6YWRkRG91YmxlKE1lZGlhQW5hbHl0aWNzSXRlbTo6QXR0ciBuYW1lLCBkb3VibGUgdmFsdWUpIHsKICAgICBQcm9wICpwcm9wID0gYWxsb2NhdGVQcm9wKG5hbWUpOworICAgIGlmIChwcm9wID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBzd2l0Y2ggKHByb3AtPm1UeXBlKSB7CiAgICAgICAgIGNhc2Uga1R5cGVEb3VibGU6CiAgICAgICAgICAgICBwcm9wLT51LmRvdWJsZVZhbHVlICs9IHZhbHVlOwpAQCAtNTc3LDYgKzU5NCw5IEBACiAgICAgLy8gZml4IGFueSBwb2ludGVycyB0aGF0IHdlIGJsaW5kbHkgY29waWVkLCBzbyB3ZSBoYXZlIG91ciBvd24gY29waWVzCiAgICAgaWYgKGRzdC0+bU5hbWUpIHsKICAgICAgICAgdm9pZCAqcCA9ICBtYWxsb2MoZHN0LT5tTmFtZUxlbiArIDEpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHAgPT0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIG1hbGxvYygpIGR1cGluZyBwcm9wZXJ0eSAnJXMnIChsZW4gJXp1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LT5tTmFtZSwgZHN0LT5tTmFtZUxlbik7CiAgICAgICAgIG1lbWNweSAocCwgc3JjLT5tTmFtZSwgZHN0LT5tTmFtZUxlbiArIDEpOwogICAgICAgICBkc3QtPm1OYW1lID0gKGNvbnN0IGNoYXIgKikgcDsKICAgICB9CkBAIC01ODUsNyArNjA1LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgTWVkaWFBbmFseXRpY3NJdGVtOjpncm93UHJvcHMoaW50IGluY3JlbWVudCkKK2Jvb2wgTWVkaWFBbmFseXRpY3NJdGVtOjpncm93UHJvcHMoaW50IGluY3JlbWVudCkKIHsKICAgICBpZiAoaW5jcmVtZW50IDw9IDApIHsKICAgICAgICAgaW5jcmVtZW50ID0ga0dyb3dQcm9wczsKQEAgLTU5OSw2ICs2MTksMTAgQEAKICAgICAgICAgfQogICAgICAgICBtUHJvcHMgPSBuaTsKICAgICAgICAgbVByb3BTaXplID0gbnNpemU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCJNZWRpYUFuYWx5dGljc0l0ZW06Omdyb3dQcm9wcyBmYWlscyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogfQogCkBAIC02MTIsOSArNjM2LDEyIEBACiAgICAgbVBpZCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgbVVpZCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgbVBrZ05hbWUgPSBkYXRhLnJlYWRDU3RyaW5nKCk7Ci0gICAgbVBrZ1ZlcnNpb25Db2RlID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICBtUGtnVmVyc2lvbkNvZGUgPSBkYXRhLnJlYWRJbnQ2NCgpOwogICAgIG1TZXNzaW9uSUQgPSBkYXRhLnJlYWRJbnQ2NCgpOworICAgIC8vIFdlIG5vIGxvbmdlciBwYXkgYXR0ZW50aW9uIHRvIHVzZXIgc2V0dGluZyBvZiBmaW5hbGl6ZWQsIEJVVCBpdCdzCisgICAgLy8gc3RpbGwgcGFydCBvZiB0aGUgd2lyZSBwYWNrZXQgLS0gc28gcmVhZCAmIGRpc2NhcmQuCiAgICAgbUZpbmFsaXplZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgbUZpbmFsaXplZCA9IDE7CiAgICAgbVRpbWVzdGFtcCA9IGRhdGEucmVhZEludDY0KCk7CiAKICAgICBpbnQgY291bnQgPSBkYXRhLnJlYWRJbnQzMigpOwpAQCAtNjU5LDcgKzY4Niw3IEBACiAgICAgZGF0YS0+d3JpdGVJbnQzMihtUGlkKTsKICAgICBkYXRhLT53cml0ZUludDMyKG1VaWQpOwogICAgIGRhdGEtPndyaXRlQ1N0cmluZyhtUGtnTmFtZS5jX3N0cigpKTsKLSAgICBkYXRhLT53cml0ZUludDMyKG1Qa2dWZXJzaW9uQ29kZSk7CisgICAgZGF0YS0+d3JpdGVJbnQ2NChtUGtnVmVyc2lvbkNvZGUpOwogICAgIGRhdGEtPndyaXRlSW50NjQobVNlc3Npb25JRCk7CiAgICAgZGF0YS0+d3JpdGVJbnQzMihtRmluYWxpemVkKTsKICAgICBkYXRhLT53cml0ZUludDY0KG1UaW1lc3RhbXApOwpAQCAtNjk5LDExICs3MjYsMTEgQEAKIH0KIAogCi1BU3RyaW5nIE1lZGlhQW5hbHl0aWNzSXRlbTo6dG9TdHJpbmcoKSB7Ci0gICByZXR1cm4gdG9TdHJpbmcoLTEpOworc3RkOjpzdHJpbmcgTWVkaWFBbmFseXRpY3NJdGVtOjp0b1N0cmluZygpIHsKKyAgIHJldHVybiB0b1N0cmluZyhQUk9UT19MQVNUKTsKIH0KIAotQVN0cmluZyBNZWRpYUFuYWx5dGljc0l0ZW06OnRvU3RyaW5nKGludCB2ZXJzaW9uKSB7CitzdGQ6OnN0cmluZyBNZWRpYUFuYWx5dGljc0l0ZW06OnRvU3RyaW5nKGludCB2ZXJzaW9uKSB7CiAKICAgICAvLyB2MCA6IHJlbGVhc2VkIHdpdGggJ28nCiAgICAgLy8gdjEgOiBidWcgZml4IChtaXNzaW5nIHBpZC9maW5hbGl6ZWQgc2VwYXJhdG9yKSwKQEAgLTcxNiw3ICs3NDMsNyBAQAogICAgICAgICB2ZXJzaW9uID0gUFJPVE9fTEFTVDsKICAgICB9CiAKLSAgICBBU3RyaW5nIHJlc3VsdDsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CiAgICAgY2hhciBidWZmZXJbNTEyXTsKIAogICAgIGlmICh2ZXJzaW9uID09IFBST1RPX1YwKSB7CkBAIC03MzgsNyArNzY1LDcgQEAKIAogICAgIGlmICh2ZXJzaW9uID49IFBST1RPX1YxKSB7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQobVBrZ05hbWUpOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiOiVkOiIsIG1Qa2dWZXJzaW9uQ29kZSk7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICI6JSIgIFBSSWQ2NCAiOiIsIG1Qa2dWZXJzaW9uQ29kZSk7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICB9CiAKQEAgLTgxMyw3ICs4NDAsNyBAQAogYm9vbCBNZWRpYUFuYWx5dGljc0l0ZW06OnNlbGZyZWNvcmQoYm9vbCBmb3JjZW5ldykgewogCiAgICAgaWYgKERFQlVHX0FQSSkgewotICAgICAgICBBU3RyaW5nIHAgPSB0aGlzLT50b1N0cmluZygpOworICAgICAgICBzdGQ6OnN0cmluZyBwID0gdGhpcy0+dG9TdHJpbmcoKTsKICAgICAgICAgQUxPR0QoInNlbGZyZWNvcmQgb2Y6ICVzIFtmb3JjZW5ldz0lZF0iLCBwLmNfc3RyKCksIGZvcmNlbmV3KTsKICAgICB9CiAKQEAgLTgyMiwxMyArODQ5LDEzIEBACiAgICAgaWYgKHN2YyAhPSBOVUxMKSB7CiAgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbTo6U2Vzc2lvbklEX3QgbmV3aWQgPSBzdmMtPnN1Ym1pdCh0aGlzLCBmb3JjZW5ldyk7CiAgICAgICAgIGlmIChuZXdpZCA9PSBTZXNzaW9uSURJbnZhbGlkKSB7Ci0gICAgICAgICAgICBBU3RyaW5nIHAgPSB0aGlzLT50b1N0cmluZygpOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgcCA9IHRoaXMtPnRvU3RyaW5nKCk7CiAgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIHJlY29yZDogJXMgW2ZvcmNlbmV3PSVkXSIsIHAuY19zdHIoKSwgZm9yY2VuZXcpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFTdHJpbmcgcCA9IHRoaXMtPnRvU3RyaW5nKCk7CisgICAgICAgIHN0ZDo6c3RyaW5nIHAgPSB0aGlzLT50b1N0cmluZygpOwogICAgICAgICBBTE9HVygiVW5hYmxlIHRvIHJlY29yZDogJXMgW2ZvcmNlbmV3PSVkXSIsIHAuY19zdHIoKSwgZm9yY2VuZXcpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtOTU2LDM5ICs5ODMsMzAgQEAKICAgICAgICAgbVNlc3Npb25JRCA9IGluY29taW5nLT5tU2Vzc2lvbklEOwogICAgIH0KIAotICAgIC8vIHdlIGFsd2F5cyB0YWtlIHRoZSBtb3JlIHJlY2VudCAnZmluYWxpemVkJyB2YWx1ZQotICAgIHNldEZpbmFsaXplZChpbmNvbWluZy0+Z2V0RmluYWxpemVkKCkpOwotCiAgICAgLy8gZm9yIGVhY2ggYXR0cmlidXRlIGZyb20gJ2luY29taW5nJywgcmVzb2x2ZSBhcHByb3ByaWF0ZWx5CiAgICAgaW50IG5hdHRyID0gaW5jb21pbmctPm1Qcm9wQ291bnQ7CiAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgbmF0dHI7IGkrKyApIHsKICAgICAgICAgUHJvcCAqaXByb3AgPSAmaW5jb21pbmctPm1Qcm9wc1tpXTsKLSAgICAgICAgUHJvcCAqb3Byb3AgPSBmaW5kUHJvcChpcHJvcC0+bU5hbWUpOwogICAgICAgICBjb25zdCBjaGFyICpwID0gaXByb3AtPm1OYW1lOwogICAgICAgICBzaXplX3QgbGVuID0gc3RybGVuKHApOwotICAgICAgICBjaGFyIHNlbWFudGljID0gcFtsZW4tMV07CisKKyAgICAgICAgLy8gc2hvdWxkIGlnbm9yZSBhIHplcm8gbGVuZ3RoIG5hbWUuLi4KKyAgICAgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIFByb3AgKm9wcm9wID0gZmluZFByb3AoaXByb3AtPm1OYW1lKTsKIAogICAgICAgICBpZiAob3Byb3AgPT0gTlVMTCkgewogICAgICAgICAgICAgLy8gbm8gb3Byb3AsIHNvIHdlIGluc2VydCB0aGUgbmV3IG9uZQogICAgICAgICAgICAgb3Byb3AgPSBhbGxvY2F0ZVByb3AocCk7Ci0gICAgICAgICAgICBjb3B5UHJvcChvcHJvcCwgaXByb3ApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbWVyZ2UgaXByb3AgaW50byBvcHJvcAotICAgICAgICAgICAgc3dpdGNoIChzZW1hbnRpYykgewotICAgICAgICAgICAgICAgIGNhc2UgJzwnOiAgICAgICAvLyBmaXJzdCAgYWthIGtlZXAgb2xkKQotICAgICAgICAgICAgICAgICAgICAvKiBub3AgKi8KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgLy8gZGVmYXVsdCBpcyAnbGFzdCcKLSAgICAgICAgICAgICAgICBjYXNlICc+JzogICAgICAgLy8gbGFzdCAoYWthIGtlZXAgbmV3KQotICAgICAgICAgICAgICAgICAgICBjb3B5UHJvcChvcHJvcCwgaXByb3ApOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgJysnOiAgICAgICAvKiBzdW0gKi8KLSAgICAgICAgICAgICAgICAgICAgLy8gWFhYIHZhbGlkYXRlIG51bWVyaWMgdHlwZXMsIHN1bSBpbiBwbGFjZQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQorICAgICAgICAgICAgaWYgKG9wcm9wICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBjb3B5UHJvcChvcHJvcCwgaXByb3ApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiZHJvcHBlZCBwcm9wZXJ0eSAnJXMnIiwgaXByb3AtPm1OYW1lKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvcHlQcm9wKG9wcm9wLCBpcHJvcCk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhQW5hbHl0aWNzSXRlbS5oIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFBbmFseXRpY3NJdGVtLmgKaW5kZXggZGQ3NDUyZi4uMjYzY2RlNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFBbmFseXRpY3NJdGVtLmgKKysrIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFBbmFseXRpY3NJdGVtLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9NRURJQV9NRURJQUFOQUxZVElDU0lURU1fSAogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KQEAgLTI1LDEzICsyNiwxMCBAQAogI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KIAotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLQotCiBjbGFzcyBJTWVkaWFBbmFseXRpY3NTZXJ2aWNlOworY2xhc3MgUGFyY2VsOwogCiAvLyB0aGUgY2xhc3MgaW50ZXJmYWNlCiAvLwpAQCAtNjYsNyArNjQsNyBAQAogICAgICAgICAvLyB2YWx1ZXMgY2FuIGJlICJjb21wb25lbnQvY29tcG9uZW50IgogICAgICAgICAvLyBiYXNpYyB2YWx1ZXM6ICJ2aWRlbyIsICJhdWRpbyIsICJkcm0iCiAgICAgICAgIC8vIFhYWDogbmVlZCB0byBiZXR0ZXIgZGVmaW5lIHRoZSBmb3JtYXQKLSAgICAgICAgdHlwZWRlZiBBU3RyaW5nIEtleTsKKyAgICAgICAgdHlwZWRlZiBzdGQ6OnN0cmluZyBLZXk7CiAgICAgICAgIHN0YXRpYyBjb25zdCBLZXkga0tleU5vbmU7ICAgICAgICAgICAgICAvLyAiIgogICAgICAgICBzdGF0aWMgY29uc3QgS2V5IGtLZXlBbnk7ICAgICAgICAgICAgICAgLy8gIioiCiAKQEAgLTkxLDEwICs4OSw2IEBACiAgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbShLZXkpOwogICAgICAgICB+TWVkaWFBbmFseXRpY3NJdGVtKCk7CiAKLSAgICAgICAgLy8gc28gY2xpZW50cyBjYW4gc2VuZCBpbnRlcm1lZGlhdGUgdmFsdWVzIHRvIGJlIG92ZXJsYWlkIGxhdGVyCi0gICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAmc2V0RmluYWxpemVkKGJvb2wpOwotICAgICAgICBib29sIGdldEZpbmFsaXplZCgpIGNvbnN0OwotCiAgICAgICAgIC8vIFNlc3Npb25JRCB0aWVzIG11bHRpcGxlIHN1Ym1pc3Npb25zIGZvciBzYW1lIGtleSB0b2dldGhlcgogICAgICAgICAvLyBzbyB0aGF0IGlmIHZpZGVvICJoZWlnaHQiIGFuZCAid2lkdGgiIGFyZSBrbm93biBhdCBvbmUgcG9pbnQKICAgICAgICAgLy8gYW5kICJmcmFtZXJhdGUiIGlzIG9ubHkga25vd24gbGF0ZXIsIHRoZXkgY2FuIGJlIGJlIGJyb3VnaHQKQEAgLTE3MCwxOCArMTY0LDE4IEBACiAgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAmc2V0VWlkKHVpZF90KTsKICAgICAgICAgdWlkX3QgZ2V0VWlkKCkgY29uc3Q7CiAKLSAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICZzZXRQa2dOYW1lKEFTdHJpbmcpOwotICAgICAgICBBU3RyaW5nIGdldFBrZ05hbWUoKSBjb25zdDsKKyAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICZzZXRQa2dOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZwa2dOYW1lKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgZ2V0UGtnTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1Qa2dOYW1lOyB9CiAKLSAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICZzZXRQa2dWZXJzaW9uQ29kZShpbnQzMl90KTsKLSAgICAgICAgaW50MzJfdCBnZXRQa2dWZXJzaW9uQ29kZSgpIGNvbnN0OworICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gJnNldFBrZ1ZlcnNpb25Db2RlKGludDY0X3QpOworICAgICAgICBpbnQ2NF90IGdldFBrZ1ZlcnNpb25Db2RlKCkgY29uc3Q7CiAKICAgICAgICAgLy8gb3VyIHNlcmlhbGl6YXRpb24gY29kZSBmb3IgYmluZGVyIGNhbGxzCiAgICAgICAgIGludDMyX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKik7CiAgICAgICAgIGludDMyX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsJik7CiAKLSAgICAgICAgQVN0cmluZyB0b1N0cmluZygpOwotICAgICAgICBBU3RyaW5nIHRvU3RyaW5nKGludCB2ZXJzaW9uKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoaW50IHZlcnNpb24pOwogCiAgICAgICAgIC8vIGFyZSB3ZSBjb2xsZWN0aW5nIGFuYWx5dGljcyBkYXRhCiAgICAgICAgIHN0YXRpYyBib29sIGlzRW5hYmxlZCgpOwpAQCAtMjA0LDggKzE5OCw4IEBACiAgICAgICAgIC8vIHRvIGhlbHAgdmFsaWRhdGUgdGhhdCBBIGRvZXNuJ3QgbWVzcyB3aXRoIEIncyByZWNvcmRzCiAgICAgICAgIHBpZF90ICAgICBtUGlkOwogICAgICAgICB1aWRfdCAgICAgbVVpZDsKLSAgICAgICAgQVN0cmluZyAgIG1Qa2dOYW1lOwotICAgICAgICBpbnQzMl90ICAgbVBrZ1ZlcnNpb25Db2RlOworICAgICAgICBzdGQ6OnN0cmluZyAgIG1Qa2dOYW1lOworICAgICAgICBpbnQ2NF90ICAgbVBrZ1ZlcnNpb25Db2RlOwogCiAgICAgICAgIC8vIGxldCdzIHJldXNlIGEgYmluZGVyIGNvbm5lY3Rpb24KICAgICAgICAgc3RhdGljIHNwPElNZWRpYUFuYWx5dGljc1NlcnZpY2U+IHNBbmFseXRpY3NTZXJ2aWNlOwpAQCAtMjQzLDcgKzIzNyw3IEBACiAgICAgICAgIGVudW0gewogICAgICAgICAgICAga0dyb3dQcm9wcyA9IDEwCiAgICAgICAgIH07Ci0gICAgICAgIHZvaWQgZ3Jvd1Byb3BzKGludCBpbmNyZW1lbnQgPSBrR3Jvd1Byb3BzKTsKKyAgICAgICAgYm9vbCBncm93UHJvcHMoaW50IGluY3JlbWVudCA9IGtHcm93UHJvcHMpOwogICAgICAgICBzaXplX3QgZmluZFByb3BJbmRleChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbGVuKTsKICAgICAgICAgUHJvcCAqZmluZFByb3AoY29uc3QgY2hhciAqbmFtZSk7CiAgICAgICAgIFByb3AgKmFsbG9jYXRlUHJvcChjb25zdCBjaGFyICpuYW1lKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZhODc4OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNzkgQEAKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYm1lZGlhcGxheWVyMl9oZWFkZXJzIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorfQorCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGlibWVkaWFwbGF5ZXIyIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkpBdWRpb1RyYWNrLmNwcCIsCisgICAgICAgICJNZWRpYVBsYXllcjJBdWRpb091dHB1dC5jcHAiLAorICAgICAgICAibWVkaWFwbGF5ZXIyLmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhbmRyb2lkX3J1bnRpbWUiLAorICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgICAgICJsaWJtZWRpYV9wbGF5ZXIyX3V0aWwiLAorICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJ1dGlscyIsCisKKyAgICAgICAgImxpYmNyeXB0byIsCisgICAgICAgICJsaWJtZWRpYWRybSIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAorICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJtZW11bnJlYWNoYWJsZSIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAorICAgICAgICAibGlicG93ZXJtYW5hZ2VyIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3BsYXllcjIiLAorICAgIF0sCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9udXBsYXllcjIiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfcnRzcCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF90aW1lZHRleHQiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBkaWFnOiB7CisgICAgICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KQXVkaW9UcmFjay5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMGNjNTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suY3BwCkBAIC0wLDAgKzEsNjg4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkpBdWRpb1RyYWNrIgorCisjaW5jbHVkZSAibWVkaWEvSkF1ZGlvQXR0cmlidXRlcy5oIgorI2luY2x1ZGUgIm1lZGlhL0pBdWRpb0Zvcm1hdC5oIgorI2luY2x1ZGUgIm1lZGlhcGxheWVyMi9KQXVkaW9UcmFjay5oIgorCisjaW5jbHVkZSA8YW5kcm9pZF9tZWRpYV9BdWRpb0Vycm9ycy5oPgorI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIFRPRE86IFN0b3JlIEphdmEgY2xhc3MvbWV0aG9kSUQgYXMgYSBtZW1iZXIgdmFyaWFibGUgaW4gdGhlIGNsYXNzLgorLy8gVE9ETzogQWRkIE5VTEwgJiYgRXhjZXB0aW9uIGNoZWNrcyBhZnRlciBldmVyeSBKTkkgY2FsbC4KK0pBdWRpb1RyYWNrOjpKQXVkaW9UcmFjayggICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDwgVXNhZ2VzIG9mIHRoZSBhcmd1bWVudHMgYXJlIGJlbG93ID4KKyAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLCAgICAgICAgICAgICAgIC8vIEF1ZGlvQXVkaW9BdHRyaWJ1dGVzCisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb0Zvcm1hdCAmJiBidWZmZXJTaXplSW5CeXRlcworICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW9Gb3JtYXQgJiYgYnVmZmVyU2l6ZUluQnl0ZXMKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssICAgICAgICAgICAgIC8vIEF1ZGlvRm9ybWF0ICYmIGJ1ZmZlclNpemVJbkJ5dGVzCisgICAgICAgIGNhbGxiYWNrX3QgY2JmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPZmZsb2FkCisgICAgICAgIHZvaWQqIHVzZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPZmZsb2FkCisgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXJTaXplSW5CeXRlcworICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLCAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW9UcmFjaworICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzLCAgICAgICAgLy8gQXVkaW9BdHRyaWJ1dGVzCisgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQpIHsgICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXJTaXplSW5CeXRlcworCisgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgamNsYXNzIGpBdWRpb1RyYWNrQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvQXVkaW9UcmFjayIpOworICAgIG1BdWRpb1RyYWNrQ2xzID0gKGpjbGFzcykgZW52LT5OZXdHbG9iYWxSZWYoakF1ZGlvVHJhY2tDbHMpOworCisgICAgbWF4UmVxdWlyZWRTcGVlZCA9IHN0ZDo6bWluKHN0ZDo6bWF4KG1heFJlcXVpcmVkU3BlZWQsIDEuMGYpLCBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NQVgpOworCisgICAgaW50IGJ1ZmZlclNpemVJbkJ5dGVzID0gMDsKKyAgICBpZiAoc2FtcGxlUmF0ZSA9PSAwIHx8IGZyYW1lQ291bnQgPiAwKSB7CisgICAgICAgIC8vIE1hbnVhbGx5IGNhbGN1bGF0ZSBidWZmZXIgc2l6ZS4KKyAgICAgICAgYnVmZmVyU2l6ZUluQnl0ZXMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spCisgICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkgKiAoZnJhbWVDb3VudCA+IDAgPyBmcmFtZUNvdW50IDogMSk7CisgICAgfSBlbHNlIGlmIChzYW1wbGVSYXRlID4gMCkgeworICAgICAgICAvLyBDYWxsIEphdmEgQXVkaW9UcmFjazo6Z2V0TWluQnVmZmVyU2l6ZSgpLgorICAgICAgICBqbWV0aG9kSUQgakdldE1pbkJ1ZmZlclNpemUgPQorICAgICAgICAgICAgICAgIGVudi0+R2V0U3RhdGljTWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJnZXRNaW5CdWZmZXJTaXplIiwgIihJSUkpSSIpOworICAgICAgICBidWZmZXJTaXplSW5CeXRlcyA9IGVudi0+Q2FsbFN0YXRpY0ludE1ldGhvZChtQXVkaW9UcmFja0NscywgakdldE1pbkJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgb3V0Q2hhbm5lbE1hc2tGcm9tTmF0aXZlKGNoYW5uZWxNYXNrKSwgYXVkaW9Gb3JtYXRGcm9tTmF0aXZlKGZvcm1hdCkpOworICAgIH0KKyAgICBidWZmZXJTaXplSW5CeXRlcyA9IChpbnQpIChidWZmZXJTaXplSW5CeXRlcyAqIG1heFJlcXVpcmVkU3BlZWQpOworCisgICAgLy8gQ3JlYXRlIGEgSmF2YSBBdWRpb1RyYWNrIG9iamVjdCB0aHJvdWdoIGl0cyBCdWlsZGVyLgorICAgIGpjbGFzcyBqQnVpbGRlckNscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2skQnVpbGRlciIpOworICAgIGptZXRob2RJRCBqQnVpbGRlckN0b3IgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAiPGluaXQ+IiwgIigpViIpOworICAgIGpvYmplY3QgakJ1aWxkZXJPYmogPSBlbnYtPk5ld09iamVjdChqQnVpbGRlckNscywgakJ1aWxkZXJDdG9yKTsKKworICAgIGptZXRob2RJRCBqU2V0QXVkaW9BdHRyaWJ1dGVzID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgInNldEF1ZGlvQXR0cmlidXRlcyIsCisgICAgICAgICAgICAiKExhbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlczspTGFuZHJvaWQvbWVkaWEvQXVkaW9UcmFjayRCdWlsZGVyOyIpOworICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLCBqU2V0QXVkaW9BdHRyaWJ1dGVzLAorICAgICAgICAgICAgSkF1ZGlvQXR0cmlidXRlczo6Y3JlYXRlQXVkaW9BdHRyaWJ1dGVzT2JqKGVudiwgcEF0dHJpYnV0ZXMsIHN0cmVhbVR5cGUpKTsKKworICAgIGptZXRob2RJRCBqU2V0QXVkaW9Gb3JtYXQgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAic2V0QXVkaW9Gb3JtYXQiLAorICAgICAgICAgICAgIihMYW5kcm9pZC9tZWRpYS9BdWRpb0Zvcm1hdDspTGFuZHJvaWQvbWVkaWEvQXVkaW9UcmFjayRCdWlsZGVyOyIpOworICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLCBqU2V0QXVkaW9Gb3JtYXQsCisgICAgICAgICAgICBKQXVkaW9Gb3JtYXQ6OmNyZWF0ZUF1ZGlvRm9ybWF0T2JqKGVudiwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaykpOworCisgICAgam1ldGhvZElEIGpTZXRCdWZmZXJTaXplSW5CeXRlcyA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJzZXRCdWZmZXJTaXplSW5CeXRlcyIsCisgICAgICAgICAgICAiKEkpTGFuZHJvaWQvbWVkaWEvQXVkaW9UcmFjayRCdWlsZGVyOyIpOworICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLCBqU2V0QnVmZmVyU2l6ZUluQnl0ZXMsIGJ1ZmZlclNpemVJbkJ5dGVzKTsKKworICAgIC8vIFdlIG9ubHkgdXNlIHN0cmVhbWluZyBtb2RlIG9mIEphdmEgQXVkaW9UcmFjay4KKyAgICBqZmllbGRJRCBqTW9kZVN0cmVhbSA9IGVudi0+R2V0U3RhdGljRmllbGRJRChtQXVkaW9UcmFja0NscywgIk1PREVfU1RSRUFNIiwgIkkiKTsKKyAgICBqaW50IHRyYW5zZmVyTW9kZSA9IGVudi0+R2V0U3RhdGljSW50RmllbGQobUF1ZGlvVHJhY2tDbHMsIGpNb2RlU3RyZWFtKTsKKyAgICBqbWV0aG9kSUQgalNldFRyYW5zZmVyTW9kZSA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJzZXRUcmFuc2Zlck1vZGUiLAorICAgICAgICAgICAgIihJKUxhbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2skQnVpbGRlcjsiKTsKKyAgICBqQnVpbGRlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwgalNldFRyYW5zZmVyTW9kZSwKKyAgICAgICAgICAgIHRyYW5zZmVyTW9kZSAvKiBKYXZhIEF1ZGlvVHJhY2s6Ok1PREVfU1RSRUFNICovKTsKKworICAgIGlmIChzZXNzaW9uSWQgIT0gMCkgeworICAgICAgICBqbWV0aG9kSUQgalNldFNlc3Npb25JZCA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJzZXRTZXNzaW9uSWQiLAorICAgICAgICAgICAgICAgICIoSSlMYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrJEJ1aWxkZXI7Iik7CisgICAgICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLCBqU2V0U2Vzc2lvbklkLCBzZXNzaW9uSWQpOworICAgIH0KKworICAgIGlmIChjYmYgIT0gTlVMTCkgeworICAgICAgICBqbWV0aG9kSUQgalNldE9mZmxvYWRlZFBsYXliYWNrID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgInNldE9mZmxvYWRlZFBsYXliYWNrIiwKKyAgICAgICAgICAgICAgICAiKFopTGFuZHJvaWQvbWVkaWEvQXVkaW9UcmFjayRCdWlsZGVyOyIpOworICAgICAgICBqQnVpbGRlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwgalNldE9mZmxvYWRlZFBsYXliYWNrLCB0cnVlKTsKKyAgICAgICAgbUZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRDsKKyAgICB9CisKKyAgICBqbWV0aG9kSUQgakJ1aWxkID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgImJ1aWxkIiwgIigpTGFuZHJvaWQvbWVkaWEvQXVkaW9UcmFjazsiKTsKKyAgICBtQXVkaW9UcmFja09iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwgakJ1aWxkKTsKKworICAgIGlmIChjYmYgIT0gTlVMTCkgeworICAgICAgICAvLyBTZXQgb2ZmbG9hZCBtb2RlIGNhbGxiYWNrCisgICAgICAgIGpvYmplY3QgalN0cmVhbUV2ZW50Q2FsbGJhY2tPYmogPSBjcmVhdGVTdHJlYW1FdmVudENhbGxiYWNrKGNiZiwgdXNlcik7CisgICAgICAgIGpvYmplY3QgakV4ZWN1dG9yT2JqID0gY3JlYXRlQ2FsbGJhY2tFeGVjdXRvcigpOworICAgICAgICBqbWV0aG9kSUQgalNldFN0cmVhbUV2ZW50Q2FsbGJhY2sgPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgICAgIGpBdWRpb1RyYWNrQ2xzLAorICAgICAgICAgICAgICAgICJzZXRTdHJlYW1FdmVudENhbGxiYWNrIiwKKyAgICAgICAgICAgICAgICAiKExqYXZhL3V0aWwvY29uY3VycmVudC9FeGVjdXRvcjtMYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrJFN0cmVhbUV2ZW50Q2FsbGJhY2s7KVYiKTsKKyAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZCgKKyAgICAgICAgICAgICAgICBtQXVkaW9UcmFja09iaiwgalNldFN0cmVhbUV2ZW50Q2FsbGJhY2ssIGpFeGVjdXRvck9iaiwgalN0cmVhbUV2ZW50Q2FsbGJhY2tPYmopOworICAgIH0KK30KKworSkF1ZGlvVHJhY2s6On5KQXVkaW9UcmFjaygpIHsKKyAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtQXVkaW9UcmFja0Nscyk7Cit9CisKK3NpemVfdCBKQXVkaW9UcmFjazo6ZnJhbWVDb3VudCgpIHsKKyAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqbWV0aG9kSUQgakdldEJ1ZmZlclNpemVJbkZyYW1lcyA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBtQXVkaW9UcmFja0NscywgImdldEJ1ZmZlclNpemVJbkZyYW1lcyIsICIoKUkiKTsKKyAgICByZXR1cm4gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0QnVmZmVyU2l6ZUluRnJhbWVzKTsKK30KKworc2l6ZV90IEpBdWRpb1RyYWNrOjpjaGFubmVsQ291bnQoKSB7CisgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgam1ldGhvZElEIGpHZXRDaGFubmVsQ291bnQgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiZ2V0Q2hhbm5lbENvdW50IiwgIigpSSIpOworICAgIHJldHVybiBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRDaGFubmVsQ291bnQpOworfQorCit1aW50MzJfdCBKQXVkaW9UcmFjazo6bGF0ZW5jeSgpIHsKKyAgICAvLyBUT0RPOiBDdXJyZW50bHkgaGFyZC1jb2RlZCBhcyByZXR1cm5pbmcgemVyby4KKyAgICByZXR1cm4gMDsKK30KKworc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OmdldFBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbikgeworICAgIGlmIChwb3NpdGlvbiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgam1ldGhvZElEIGpHZXRQbGF5YmFja0hlYWRQb3NpdGlvbiA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBtQXVkaW9UcmFja0NscywgImdldFBsYXliYWNrSGVhZFBvc2l0aW9uIiwgIigpSSIpOworICAgICpwb3NpdGlvbiA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldFBsYXliYWNrSGVhZFBvc2l0aW9uKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYm9vbCBKQXVkaW9UcmFjazo6Z2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApIHsKKyAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKworICAgIGpjbGFzcyBqQXVkaW9UaW1lU3RhbXBDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9BdWRpb1RpbWVzdGFtcCIpOworICAgIGpvYmplY3QgakF1ZGlvVGltZVN0YW1wT2JqID0gZW52LT5BbGxvY09iamVjdChqQXVkaW9UaW1lU3RhbXBDbHMpOworCisgICAgamZpZWxkSUQgakZyYW1lUG9zaXRpb24gPSBlbnYtPkdldEZpZWxkSUQoakF1ZGlvVGltZVN0YW1wQ2xzLCAiZnJhbWVQb3NpdGlvbiIsICJMIik7CisgICAgamZpZWxkSUQgak5hbm9UaW1lID0gZW52LT5HZXRGaWVsZElEKGpBdWRpb1RpbWVTdGFtcENscywgIm5hbm9UaW1lIiwgIkwiKTsKKworICAgIGptZXRob2RJRCBqR2V0VGltZXN0YW1wID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywKKyAgICAgICAgICAgICJnZXRUaW1lc3RhbXAiLCAiKExhbmRyb2lkL21lZGlhL0F1ZGlvVGltZXN0YW1wKUIiKTsKKyAgICBib29sIHN1Y2Nlc3MgPSBlbnYtPkNhbGxCb29sZWFuTWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0VGltZXN0YW1wLCBqQXVkaW9UaW1lU3RhbXBPYmopOworCisgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBsb25nIGxvbmcgZnJhbWVQb3NpdGlvbiA9IGVudi0+R2V0TG9uZ0ZpZWxkKGpBdWRpb1RpbWVTdGFtcE9iaiwgakZyYW1lUG9zaXRpb24pOworICAgIGxvbmcgbG9uZyBuYW5vVGltZSA9IGVudi0+R2V0TG9uZ0ZpZWxkKGpBdWRpb1RpbWVTdGFtcE9iaiwgak5hbm9UaW1lKTsKKworICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKKyAgICBjb25zdCBsb25nIGxvbmcgc2Vjb25kVG9OYW5vID0gMTAwMDAwMDAwMExMOyAvLyAxRTkKKyAgICB0cy50dl9zZWMgPSBuYW5vVGltZSAvIHNlY29uZFRvTmFubzsKKyAgICB0cy50dl9uc2VjID0gbmFub1RpbWUgJSBzZWNvbmRUb05hbm87CisgICAgdGltZXN0YW1wLm1UaW1lID0gdHM7CisgICAgdGltZXN0YW1wLm1Qb3NpdGlvbiA9ICh1aW50MzJfdCkgZnJhbWVQb3NpdGlvbjsKKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0dXNfdCBKQXVkaW9UcmFjazo6Z2V0VGltZXN0YW1wKEV4dGVuZGVkVGltZXN0YW1wICp0aW1lc3RhbXAgX191bnVzZWQpIHsKKyAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcyBhZnRlciBhcHByb3ByaWF0ZSBKYXZhIEF1ZGlvVHJhY2sgbWV0aG9kIGlzIGF2YWlsYWJsZS4KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEpBdWRpb1RyYWNrOjpzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnBsYXliYWNrUmF0ZSkgeworICAgIC8vIFRPRE86IGV4aXN0aW5nIG5hdGl2ZSBBdWRpb1RyYWNrIHJldHVybnMgSU5WQUxJRF9PUEVSQVRJT04gb24gb2ZmbG9hZC9kaXJlY3QvZmFzdCB0cmFja3MuCisgICAgLy8gU2hvdWxkIHdlIGRvIHRoZSBzYW1lIHRoaW5nPworICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworCisgICAgamNsYXNzIGpQbGF5YmFja1BhcmFtc0NscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL1BsYXliYWNrUGFyYW1zIik7CisgICAgam1ldGhvZElEIGpQbGF5YmFja1BhcmFtc0N0b3IgPSBlbnYtPkdldE1ldGhvZElEKGpQbGF5YmFja1BhcmFtc0NscywgIjxpbml0PiIsICIoKVYiKTsKKyAgICBqb2JqZWN0IGpQbGF5YmFja1BhcmFtc09iaiA9IGVudi0+TmV3T2JqZWN0KGpQbGF5YmFja1BhcmFtc0NscywgalBsYXliYWNrUGFyYW1zQ3Rvcik7CisKKyAgICBqbWV0aG9kSUQgalNldEF1ZGlvRmFsbGJhY2tNb2RlID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIGpQbGF5YmFja1BhcmFtc0NscywgInNldEF1ZGlvRmFsbGJhY2tNb2RlIiwgIihJKUxhbmRyb2lkL21lZGlhL1BsYXliYWNrUGFyYW1zOyIpOworICAgIGpQbGF5YmFja1BhcmFtc09iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZCgKKyAgICAgICAgICAgIGpQbGF5YmFja1BhcmFtc09iaiwgalNldEF1ZGlvRmFsbGJhY2tNb2RlLCBwbGF5YmFja1JhdGUubUZhbGxiYWNrTW9kZSk7CisKKyAgICBqbWV0aG9kSUQgalNldEF1ZGlvU3RyZXRjaE1vZGUgPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgICAgIGpQbGF5YmFja1BhcmFtc0NscywgInNldEF1ZGlvU3RyZXRjaE1vZGUiLCAiKEkpTGFuZHJvaWQvbWVkaWEvUGxheWJhY2tQYXJhbXM7Iik7CisgICAgalBsYXliYWNrUGFyYW1zT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKAorICAgICAgICAgICAgalBsYXliYWNrUGFyYW1zT2JqLCBqU2V0QXVkaW9TdHJldGNoTW9kZSwgcGxheWJhY2tSYXRlLm1TdHJldGNoTW9kZSk7CisKKyAgICBqbWV0aG9kSUQgalNldFBpdGNoID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIGpQbGF5YmFja1BhcmFtc0NscywgInNldFBpdGNoIiwgIihGKUxhbmRyb2lkL21lZGlhL1BsYXliYWNrUGFyYW1zOyIpOworICAgIGpQbGF5YmFja1BhcmFtc09iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqUGxheWJhY2tQYXJhbXNPYmosIGpTZXRQaXRjaCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CisKKyAgICBqbWV0aG9kSUQgalNldFNwZWVkID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIGpQbGF5YmFja1BhcmFtc0NscywgInNldFNwZWVkIiwgIihGKUxhbmRyb2lkL21lZGlhL1BsYXliYWNrUGFyYW1zOyIpOworICAgIGpQbGF5YmFja1BhcmFtc09iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqUGxheWJhY2tQYXJhbXNPYmosIGpTZXRTcGVlZCwgcGxheWJhY2tSYXRlLm1TcGVlZCk7CisKKworICAgIC8vIFNldCB0aGlzIEphdmEgUGxheWJhY2tQYXJhbXMgb2JqZWN0IGludG8gSmF2YSBBdWRpb1RyYWNrLgorICAgIGptZXRob2RJRCBqU2V0UGxheWJhY2tQYXJhbXMgPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgbUF1ZGlvVHJhY2tDbHMsICJzZXRQbGF5YmFja1BhcmFtcyIsICIoTGFuZHJvaWQvbWVkaWEvUGxheWJhY2tQYXJhbXM7KVYiKTsKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqU2V0UGxheWJhY2tQYXJhbXMsIGpQbGF5YmFja1BhcmFtc09iaik7CisgICAgLy8gVE9ETzogU2hvdWxkIHdlIGNhdGNoIHRoZSBKYXZhIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbj8KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgSkF1ZGlvVHJhY2s6OmdldFBsYXliYWNrUmF0ZSgpIHsKKyAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKworICAgIGptZXRob2RJRCBqR2V0UGxheWJhY2tQYXJhbXMgPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgbUF1ZGlvVHJhY2tDbHMsICJnZXRQbGF5YmFja1BhcmFtcyIsICIoKUxhbmRyb2lkL21lZGlhL1BsYXliYWNrUGFyYW1zOyIpOworICAgIGpvYmplY3QgalBsYXliYWNrUGFyYW1zT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0UGxheWJhY2tQYXJhbXMpOworCisgICAgQXVkaW9QbGF5YmFja1JhdGUgcGxheWJhY2tSYXRlOworICAgIGpjbGFzcyBqUGxheWJhY2tQYXJhbXNDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9QbGF5YmFja1BhcmFtcyIpOworCisgICAgam1ldGhvZElEIGpHZXRBdWRpb0ZhbGxiYWNrTW9kZSA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBqUGxheWJhY2tQYXJhbXNDbHMsICJnZXRBdWRpb0ZhbGxiYWNrTW9kZSIsICIoKUkiKTsKKyAgICAvLyBUT0RPOiBTaG91bGQgd2UgZW5hYmxlIHBhc3NpbmcgQVVESU9fVElNRVNUUkVUQ0hfRkFMTEJBQ0tfQ1VUX1JFUEVBVD8KKyAgICAvLyAgICAgICBUaGUgZW51bSBpcyBpbnRlcm5hbCBvbmx5LCBzbyBpdCBpcyBub3QgZGVmaW5lZCBpbiBQbGF5YmFja1Bhcm1hcy5qYXZhLgorICAgIC8vIFRPRE86IElzIHRoaXMgcmlnaHQgd2F5IHRvIGNvbnZlcnQgYW4gaW50IHRvIGFuIGVudW0/CisgICAgcGxheWJhY2tSYXRlLm1GYWxsYmFja01vZGUgPSBzdGF0aWNfY2FzdDxBdWRpb1RpbWVzdHJldGNoRmFsbGJhY2tNb2RlPigKKyAgICAgICAgICAgIGVudi0+Q2FsbEludE1ldGhvZChqUGxheWJhY2tQYXJhbXNPYmosIGpHZXRBdWRpb0ZhbGxiYWNrTW9kZSkpOworCisgICAgam1ldGhvZElEIGpHZXRBdWRpb1N0cmV0Y2hNb2RlID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIGpQbGF5YmFja1BhcmFtc0NscywgImdldEF1ZGlvU3RyZXRjaE1vZGUiLCAiKClJIik7CisgICAgcGxheWJhY2tSYXRlLm1TdHJldGNoTW9kZSA9IHN0YXRpY19jYXN0PEF1ZGlvVGltZXN0cmV0Y2hTdHJldGNoTW9kZT4oCisgICAgICAgICAgICBlbnYtPkNhbGxJbnRNZXRob2QoalBsYXliYWNrUGFyYW1zT2JqLCBqR2V0QXVkaW9TdHJldGNoTW9kZSkpOworCisgICAgam1ldGhvZElEIGpHZXRQaXRjaCA9IGVudi0+R2V0TWV0aG9kSUQoalBsYXliYWNrUGFyYW1zQ2xzLCAiZ2V0UGl0Y2giLCAiKClGIik7CisgICAgcGxheWJhY2tSYXRlLm1QaXRjaCA9IGVudi0+Q2FsbEZsb2F0TWV0aG9kKGpQbGF5YmFja1BhcmFtc09iaiwgakdldFBpdGNoKTsKKworICAgIGptZXRob2RJRCBqR2V0U3BlZWQgPSBlbnYtPkdldE1ldGhvZElEKGpQbGF5YmFja1BhcmFtc0NscywgImdldFNwZWVkIiwgIigpRiIpOworICAgIHBsYXliYWNrUmF0ZS5tU3BlZWQgPSBlbnYtPkNhbGxGbG9hdE1ldGhvZChqUGxheWJhY2tQYXJhbXNPYmosIGpHZXRTcGVlZCk7CisKKyAgICByZXR1cm4gcGxheWJhY2tSYXRlOworfQorCittZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0dXMgSkF1ZGlvVHJhY2s6OmFwcGx5Vm9sdW1lU2hhcGVyKAorICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKKyAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKSB7CisKKyAgICBqb2JqZWN0IGpDb25maWd1cmF0aW9uT2JqID0gY3JlYXRlVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvbk9iaihjb25maWd1cmF0aW9uKTsKKyAgICBqb2JqZWN0IGpPcGVyYXRpb25PYmogPSBjcmVhdGVWb2x1bWVTaGFwZXJPcGVyYXRpb25PYmoob3BlcmF0aW9uKTsKKworICAgIGlmIChqQ29uZmlndXJhdGlvbk9iaiA9PSBOVUxMIHx8IGpPcGVyYXRpb25PYmogPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gbWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzKEJBRF9WQUxVRSk7CisgICAgfQorCisgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisKKyAgICBqbWV0aG9kSUQgakNyZWF0ZVZvbHVtZVNoYXBlciA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJjcmVhdGVWb2x1bWVTaGFwZXIiLAorICAgICAgICAgICAgIihMYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIkQ29uZmlndXJhdGlvbjspTGFuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyOyIpOworICAgIGpvYmplY3QgalZvbHVtZVNoYXBlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZCgKKyAgICAgICAgICAgIG1BdWRpb1RyYWNrT2JqLCBqQ3JlYXRlVm9sdW1lU2hhcGVyLCBqQ29uZmlndXJhdGlvbk9iaik7CisKKyAgICBqY2xhc3MgalZvbHVtZVNoYXBlckNscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlciIpOworICAgIGptZXRob2RJRCBqQXBwbHkgPSBlbnYtPkdldE1ldGhvZElEKGpWb2x1bWVTaGFwZXJDbHMsICJhcHBseSIsCisgICAgICAgICAgICAiKExhbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlciRPcGVyYXRpb247KVYiKTsKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKGpWb2x1bWVTaGFwZXJPYmosIGpBcHBseSwgak9wZXJhdGlvbk9iaik7CisKKyAgICByZXR1cm4gbWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzKE5PX0VSUk9SKTsKK30KKworc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCkgeworICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGptZXRob2RJRCBqU2V0QXV4RWZmZWN0U2VuZExldmVsID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIG1BdWRpb1RyYWNrQ2xzLCAic2V0QXV4RWZmZWN0U2VuZExldmVsIiwgIihGKUkiKTsKKyAgICBpbnQgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqU2V0QXV4RWZmZWN0U2VuZExldmVsLCBsZXZlbCk7CisgICAgcmV0dXJuIGphdmFUb05hdGl2ZVN0YXR1cyhyZXN1bHQpOworfQorCitzdGF0dXNfdCBKQXVkaW9UcmFjazo6YXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCkgeworICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGptZXRob2RJRCBqQXR0YWNoQXV4RWZmZWN0ID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImF0dGFjaEF1eEVmZmVjdCIsICIoSSlJIik7CisgICAgaW50IHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakF0dGFjaEF1eEVmZmVjdCwgZWZmZWN0SWQpOworICAgIHJldHVybiBqYXZhVG9OYXRpdmVTdGF0dXMocmVzdWx0KTsKK30KKworc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgeworICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIC8vIFRPRE86IEphdmEgc2V0U3RlcmVvVm9sdW1lIGlzIGRlcHJlY2F0ZWQuIERvIHdlIHJlYWxseSBuZWVkIHRoaXMgbWV0aG9kPworICAgIGptZXRob2RJRCBqU2V0U3RlcmVvVm9sdW1lID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgInNldFN0ZXJlb1ZvbHVtZSIsICIoRkYpSSIpOworICAgIGludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpTZXRTdGVyZW9Wb2x1bWUsIGxlZnQsIHJpZ2h0KTsKKyAgICByZXR1cm4gamF2YVRvTmF0aXZlU3RhdHVzKHJlc3VsdCk7Cit9CisKK3N0YXR1c190IEpBdWRpb1RyYWNrOjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CisgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgam1ldGhvZElEIGpTZXRWb2x1bWUgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAic2V0Vm9sdW1lIiwgIihGKUkiKTsKKyAgICBpbnQgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqU2V0Vm9sdW1lLCB2b2x1bWUpOworICAgIHJldHVybiBqYXZhVG9OYXRpdmVTdGF0dXMocmVzdWx0KTsKK30KKworc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnN0YXJ0KCkgeworICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGptZXRob2RJRCBqUGxheSA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJwbGF5IiwgIigpViIpOworICAgIC8vIFRPRE86IFNob3VsZCB3ZSBjYXRjaCB0aGUgSmF2YSBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZnJvbSBwbGF5KCk/CisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtQXVkaW9UcmFja09iaiwgalBsYXkpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3NpemVfdCBKQXVkaW9UcmFjazo6d3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBibG9ja2luZykgeworICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGpieXRlQXJyYXkgakF1ZGlvRGF0YSA9IGVudi0+TmV3Qnl0ZUFycmF5KHNpemUpOworICAgIGVudi0+U2V0Qnl0ZUFycmF5UmVnaW9uKGpBdWRpb0RhdGEsIDAsIHNpemUsIChqYnl0ZSAqKSBidWZmZXIpOworCisgICAgamNsYXNzIGpCeXRlQnVmZmVyQ2xzID0gZW52LT5GaW5kQ2xhc3MoImphdmEvbmlvL0J5dGVCdWZmZXIiKTsKKyAgICBqbWV0aG9kSUQgaldyYXAgPSBlbnYtPkdldFN0YXRpY01ldGhvZElEKGpCeXRlQnVmZmVyQ2xzLCAid3JhcCIsICIoW0IpTGphdmEvbmlvL0J5dGVCdWZmZXI7Iik7CisgICAgam9iamVjdCBqQnl0ZUJ1ZmZlck9iaiA9IGVudi0+Q2FsbFN0YXRpY09iamVjdE1ldGhvZChqQnl0ZUJ1ZmZlckNscywgaldyYXAsIGpBdWRpb0RhdGEpOworCisgICAgaW50IHdyaXRlTW9kZSA9IDA7CisgICAgaWYgKGJsb2NraW5nKSB7CisgICAgICAgIGpmaWVsZElEIGpXcml0ZUJsb2NraW5nID0gZW52LT5HZXRTdGF0aWNGaWVsZElEKG1BdWRpb1RyYWNrQ2xzLCAiV1JJVEVfQkxPQ0tJTkciLCAiSSIpOworICAgICAgICB3cml0ZU1vZGUgPSBlbnYtPkdldFN0YXRpY0ludEZpZWxkKG1BdWRpb1RyYWNrQ2xzLCBqV3JpdGVCbG9ja2luZyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgamZpZWxkSUQgaldyaXRlTm9uQmxvY2tpbmcgPSBlbnYtPkdldFN0YXRpY0ZpZWxkSUQoCisgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tDbHMsICJXUklURV9OT05fQkxPQ0tJTkciLCAiSSIpOworICAgICAgICB3cml0ZU1vZGUgPSBlbnYtPkdldFN0YXRpY0ludEZpZWxkKG1BdWRpb1RyYWNrQ2xzLCBqV3JpdGVOb25CbG9ja2luZyk7CisgICAgfQorCisgICAgam1ldGhvZElEIGpXcml0ZSA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJ3cml0ZSIsICIoTGphdmEvbmlvL0J5dGVCdWZmZXI7SUkpSSIpOworICAgIGludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpXcml0ZSwgakJ5dGVCdWZmZXJPYmosIHNpemUsIHdyaXRlTW9kZSk7CisKKyAgICBpZiAocmVzdWx0ID49IDApIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gamF2YVRvTmF0aXZlU3RhdHVzKHJlc3VsdCk7CisgICAgfQorfQorCit2b2lkIEpBdWRpb1RyYWNrOjpzdG9wKCkgeworICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGptZXRob2RJRCBqU3RvcCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJzdG9wIiwgIigpViIpOworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpTdG9wKTsKKyAgICAvLyBUT0RPOiBTaG91bGQgd2UgY2F0Y2ggSWxsZWdhbFN0YXRlRXhjZXB0aW9uPworfQorCisvLyBUT0RPOiBJcyB0aGUgcmlnaHQgaW1wbGVtZW50YXRpb24/Citib29sIEpBdWRpb1RyYWNrOjpzdG9wcGVkKCkgY29uc3QgeworICAgIHJldHVybiAhaXNQbGF5aW5nKCk7Cit9CisKK3ZvaWQgSkF1ZGlvVHJhY2s6OmZsdXNoKCkgeworICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGptZXRob2RJRCBqRmx1c2ggPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiZmx1c2giLCAiKClWIik7CisgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtQXVkaW9UcmFja09iaiwgakZsdXNoKTsKK30KKwordm9pZCBKQXVkaW9UcmFjazo6cGF1c2UoKSB7CisgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgam1ldGhvZElEIGpQYXVzZSA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJwYXVzZSIsICIoKVYiKTsKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqUGF1c2UpOworICAgIC8vIFRPRE86IFNob3VsZCB3ZSBjYXRjaCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24/Cit9CisKK2Jvb2wgSkF1ZGlvVHJhY2s6OmlzUGxheWluZygpIGNvbnN0IHsKKyAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqbWV0aG9kSUQgakdldFBsYXlTdGF0ZSA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJnZXRQbGF5U3RhdGUiLCAiKClJIik7CisgICAgaW50IGN1cnJlbnRQbGF5U3RhdGUgPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRQbGF5U3RhdGUpOworCisgICAgLy8gVE9ETzogSW4gSmF2YSBBdWRpb1RyYWNrLCB0aGVyZSBpcyBubyBTVE9QUElORyBzdGF0ZS4KKyAgICAvLyBUaGlzIG1lYW5zIHdoaWxlIHN0b3BwaW5nLCBpc1BsYXlpbmcoKSB3aWxsIHJldHVybiBkaWZmZXJlbnQgdmFsdWUgaW4gdHdvIGNsYXNzLgorICAgIC8vICAtIGluIGV4aXN0aW5nIG5hdGl2ZSBBdWRpb1RyYWNrOiB0cnVlCisgICAgLy8gIC0gaW4gSkF1ZGlvVHJhY2s6IGZhbHNlCisgICAgLy8gSWYgbm90IG9rYXksIGFsc28gbW9kaWZ5IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBzdG9wcGVkKCkuCisgICAgamZpZWxkSUQgalBsYXlTdGF0ZVBsYXlpbmcgPSBlbnYtPkdldFN0YXRpY0ZpZWxkSUQobUF1ZGlvVHJhY2tDbHMsICJQTEFZU1RBVEVfUExBWUlORyIsICJJIik7CisgICAgaW50IHN0YXRlUGxheWluZyA9IGVudi0+R2V0U3RhdGljSW50RmllbGQobUF1ZGlvVHJhY2tDbHMsIGpQbGF5U3RhdGVQbGF5aW5nKTsKKyAgICByZXR1cm4gY3VycmVudFBsYXlTdGF0ZSA9PSBzdGF0ZVBsYXlpbmc7Cit9CisKK3VpbnQzMl90IEpBdWRpb1RyYWNrOjpnZXRTYW1wbGVSYXRlKCkgeworICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGptZXRob2RJRCBqR2V0U2FtcGxlUmF0ZSA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJnZXRTYW1wbGVSYXRlIiwgIigpSSIpOworICAgIHJldHVybiBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRTYW1wbGVSYXRlKTsKK30KKworc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OmdldEJ1ZmZlckR1cmF0aW9uSW5VcyhpbnQ2NF90ICpkdXJhdGlvbikgeworICAgIGlmIChkdXJhdGlvbiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgam1ldGhvZElEIGpHZXRCdWZmZXJTaXplSW5GcmFtZXMgPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgbUF1ZGlvVHJhY2tDbHMsICJnZXRCdWZmZXJTaXplSW5GcmFtZXMiLCAiKClJIik7CisgICAgaW50IGJ1ZmZlclNpemVJbkZyYW1lcyA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldEJ1ZmZlclNpemVJbkZyYW1lcyk7CisKKyAgICBjb25zdCBkb3VibGUgc2Vjb25kVG9NaWNybyA9IDEwMDAwMDBMTDsgLy8gMUU2CisgICAgaW50IHNhbXBsZVJhdGUgPSBKQXVkaW9UcmFjazo6Z2V0U2FtcGxlUmF0ZSgpOworICAgIGZsb2F0IHNwZWVkID0gSkF1ZGlvVHJhY2s6OmdldFBsYXliYWNrUmF0ZSgpLm1TcGVlZDsKKworICAgICpkdXJhdGlvbiA9IChpbnQ2NF90KSAoYnVmZmVyU2l6ZUluRnJhbWVzICogc2Vjb25kVG9NaWNybyAvIChzYW1wbGVSYXRlICogc3BlZWQpKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2F1ZGlvX2Zvcm1hdF90IEpBdWRpb1RyYWNrOjpmb3JtYXQoKSB7CisgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgam1ldGhvZElEIGpHZXRBdWRpb0Zvcm1hdCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJnZXRBdWRpb0Zvcm1hdCIsICIoKUkiKTsKKyAgICBpbnQgamF2YUZvcm1hdCA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldEF1ZGlvRm9ybWF0KTsKKyAgICByZXR1cm4gYXVkaW9Gb3JtYXRUb05hdGl2ZShqYXZhRm9ybWF0KTsKK30KKworc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKSBjb25zdAoreworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgcmVzdWx0LmFwcGVuZCgiIEpBdWRpb1RyYWNrOjpkdW1wXG4iKTsKKworICAgIC8vIFRPRE86IFJlbW92ZSBsb2dzIHRoYXQgaW5jbHVkZXMgdW5hdmFpbGFibGUgaW5mb3JtYXRpb24gZnJvbSBiZWxvdy4KKy8vICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgc3RhdHVzKCVkKSwgc3RhdGUoJWQpLCBzZXNzaW9uIElkKCVkKSwgZmxhZ3MoJSN4KVxuIiwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1cywgbVN0YXRlLCBtU2Vzc2lvbklkLCBtRmxhZ3MpOworLy8gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBzdHJlYW0gdHlwZSglZCksIGxlZnQgLSByaWdodCB2b2x1bWUoJWYsICVmKVxuIiwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgKG1TdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9ERUZBVUxUKSA/CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZSgmbUF0dHJpYnV0ZXMpIDogbVN0cmVhbVR5cGUsCisvLyAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVbQVVESU9fSU5URVJMRUFWRV9MRUZUXSwgbVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX1JJR0hUXSk7CisvLyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIGZvcm1hdCglI3gpLCBjaGFubmVsIG1hc2soJSN4KSwgY2hhbm5lbCBjb3VudCgldSlcbiIsCisvLyAgICAgICAgICAgICAgICAgIGZvcm1hdCgpLCBtQ2hhbm5lbE1hc2ssIGNoYW5uZWxDb3VudCgpKTsKKy8vICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgc2FtcGxlIHJhdGUoJXUpLCBvcmlnaW5hbCBzYW1wbGUgcmF0ZSgldSksIHNwZWVkKCVmKVxuIiwKKy8vICAgICAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpLCBtT3JpZ2luYWxTYW1wbGVSYXRlLCBtUGxheWJhY2tSYXRlLm1TcGVlZCk7CisvLyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIGZyYW1lIGNvdW50KCV6dSksIHJlcS4gZnJhbWUgY291bnQoJXp1KVxuIiwKKy8vICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCgpLCBtUmVxRnJhbWVDb3VudCk7CisvLyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIG5vdGlmLiBmcmFtZSBjb3VudCgldSksIHJlcS4gbm90aWYuIGZyYW1lIGNvdW50KCV1KSwiCisvLyAgICAgICAgICAgICIgcmVxLiBub3RpZi4gcGVyIGJ1ZmYoJXUpXG4iLAorLy8gICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCwgbU5vdGlmaWNhdGlvbkZyYW1lc1JlcSwgbU5vdGlmaWNhdGlvbnNQZXJCdWZmZXJSZXEpOworLy8gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBsYXRlbmN5ICglZCksIHNlbGVjdGVkIGRldmljZSBJZCglZCksIHJvdXRlZCBkZXZpY2UgSWQoJWQpXG4iLAorLy8gICAgICAgICAgICAgICAgICAgICAgICBsYXRlbmN5KCksIG1TZWxlY3RlZERldmljZUlkLCBnZXRSb3V0ZWREZXZpY2VJZCgpKTsKKy8vICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgb3V0cHV0KCVkKSBBRiBsYXRlbmN5ICgldSkgQUYgZnJhbWUgY291bnQoJXp1KSBBRiBTYW1wbGVSYXRlKCV1KVxuIiwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dCwgbUFmTGF0ZW5jeSwgbUFmRnJhbWVDb3VudCwgbUFmU2FtcGxlUmF0ZSk7CisgICAgOjp3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2F1ZGlvX3BvcnRfaGFuZGxlX3QgSkF1ZGlvVHJhY2s6OmdldFJvdXRlZERldmljZUlkKCkgeworICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGptZXRob2RJRCBqR2V0Um91dGVkRGV2aWNlID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImdldFJvdXRlZERldmljZSIsCisgICAgICAgICAgICAiKClMYW5kcm9pZC9tZWRpYS9BdWRpb0RldmljZUluZm87Iik7CisgICAgam9iamVjdCBqQXVkaW9EZXZpY2VJbmZvT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0Um91dGVkRGV2aWNlKTsKKyAgICBpZiAoZW52LT5Jc1NhbWVPYmplY3QoakF1ZGlvRGV2aWNlSW5mb09iaiwgTlVMTCkpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgfQorCisgICAgamNsYXNzIGpBdWRpb0RldmljZUluZm9DbHMgPSBlbnYtPkZpbmRDbGFzcygiTGFuZHJvaWQvbWVkaWEvQXVkaW9EZXZpY2VJbmZvIik7CisgICAgam1ldGhvZElEIGpHZXRJZCA9IGVudi0+R2V0TWV0aG9kSUQoakF1ZGlvRGV2aWNlSW5mb0NscywgImdldElkIiwgIigpSSIpOworICAgIGppbnQgcm91dGVkRGV2aWNlSWQgPSBlbnYtPkNhbGxJbnRNZXRob2QoakF1ZGlvRGV2aWNlSW5mb09iaiwgakdldElkKTsKKyAgICByZXR1cm4gcm91dGVkRGV2aWNlSWQ7Cit9CisKK2F1ZGlvX3Nlc3Npb25fdCBKQXVkaW9UcmFjazo6Z2V0QXVkaW9TZXNzaW9uSWQoKSB7CisgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgam1ldGhvZElEIGpHZXRBdWRpb1Nlc3Npb25JZCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJnZXRBdWRpb1Nlc3Npb25JZCIsICIoKUkiKTsKKyAgICBqaW50IHNlc3Npb25JZCA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldEF1ZGlvU2Vzc2lvbklkKTsKKyAgICByZXR1cm4gKGF1ZGlvX3Nlc3Npb25fdCkgc2Vzc2lvbklkOworfQorCitzdGF0dXNfdCBKQXVkaW9UcmFjazo6c2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIHsKKyAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqY2xhc3Mgak1QMkltcGxDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXllcjJJbXBsIik7CisgICAgam1ldGhvZElEIGpTZXRBdWRpb091dHB1dERldmljZUJ5SWQgPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgak1QMkltcGxDbHMsICJzZXRBdWRpb091dHB1dERldmljZUJ5SWQiLCAiKExhbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2s7SSlaIik7CisgICAgamJvb2xlYW4gcmVzdWx0ID0gZW52LT5DYWxsU3RhdGljQm9vbGVhbk1ldGhvZCgKKyAgICAgICAgICAgIGpNUDJJbXBsQ2xzLCBqU2V0QXVkaW9PdXRwdXREZXZpY2VCeUlkLCBtQXVkaW9UcmFja09iaiwgZGV2aWNlSWQpOworICAgIHJldHVybiByZXN1bHQgPT0gdHJ1ZSA/IE5PX0VSUk9SIDogQkFEX1ZBTFVFOworfQorCitzdGF0dXNfdCBKQXVkaW9UcmFjazo6cGVuZGluZ0R1cmF0aW9uKGludDMyX3QgKm1zZWMpIHsKKyAgICBpZiAobXNlYyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgYm9vbCBpc1B1cmVQY21EYXRhID0gYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQoKSkgJiYgKGdldEZsYWdzKCkgJiBBVURJT19GTEFHX0hXX0FWX1NZTkMpID09IDA7CisgICAgaWYgKCFpc1B1cmVQY21EYXRhKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICAvLyBUT0RPOiBOZWVkIHRvIGtub3cgdGhlIGRpZmZlcmVuY2UgYnR3LiBjbGllbnQgYW5kIHNlcnZlciB0aW1lLgorICAgIC8vIElmIGdldFRpbWVzdGFtcChFeHRlbmRlZFRpbWVzdGFtcCkgaXMgcmVhZHksIGFuZCB1bi1jb21tZW50IGJlbG93IGFuZCBtb2RpZnkgYXBwcm9wcmlhdGVseS4KKyAgICAvLyAoY29waWVkIGZyb20gQXVkaW9UcmFjay5jcHApCisKKy8vICAgIEV4dGVuZGVkVGltZXN0YW1wIGV0czsKKy8vICAgIEV4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTiBsb2NhdGlvbiA9IEV4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVI7CisvLyAgICBpZiAoZ2V0VGltZXN0YW1wX2woJmV0cykgPT0gT0sgJiYgZXRzLm1UaW1lTnNbbG9jYXRpb25dID4gMCkgeworLy8gICAgICAgIGludDY0X3QgZGlmZiA9IGV0cy5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0NMSUVOVF0KKy8vICAgICAgICAgICAgICAgIC0gZXRzLm1Qb3NpdGlvbltsb2NhdGlvbl07CisvLyAgICAgICAgaWYgKGRpZmYgPCAwKSB7CisvLyAgICAgICAgICAgICptc2VjID0gMDsKKy8vICAgICAgICB9IGVsc2UgeworLy8gICAgICAgICAgICAvLyBtcyBpcyB0aGUgcGxheWJhY2sgdGltZSBieSBmcmFtZXMKKy8vICAgICAgICAgICAgaW50NjRfdCBtcyA9IChpbnQ2NF90KSgoZG91YmxlKWRpZmYgKiAxMDAwIC8KKy8vICAgICAgICAgICAgICAgICAgICAoKGRvdWJsZSltU2FtcGxlUmF0ZSAqIG1QbGF5YmFja1JhdGUubVNwZWVkKSk7CisvLyAgICAgICAgICAgIC8vIGNsb2NrZGlmZiBpcyB0aGUgdGltZXN0YW1wIGFnZSAobmVnYXRpdmUpCisvLyAgICAgICAgICAgIGludDY0X3QgY2xvY2tkaWZmID0gKG1TdGF0ZSAhPSBTVEFURV9BQ1RJVkUpID8gMCA6CisvLyAgICAgICAgICAgICAgICAgICAgZXRzLm1UaW1lTnNbbG9jYXRpb25dCisvLyAgICAgICAgICAgICAgICAgICAgKyBldHMubVRpbWViYXNlT2Zmc2V0W0V4dGVuZGVkVGltZXN0YW1wOjpUSU1FQkFTRV9NT05PVE9OSUNdCisvLyAgICAgICAgICAgICAgICAgICAgLSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7CisvLworLy8gICAgICAgICAgICAvL0FMT0dWKCJtczogJWxsZCAgY2xvY2tkaWZmOiAlbGxkIiwgKGxvbmcgbG9uZyltcywgKGxvbmcgbG9uZyljbG9ja2RpZmYpOworLy8gICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IE5BTk9TX1BFUl9NSUxMSVMgPSAxMDAwMDAwOworLy8gICAgICAgICAgICAqbXNlYyA9IChpbnQzMl90KShtcyArIGNsb2NrZGlmZiAvIE5BTk9TX1BFUl9NSUxMSVMpOworLy8gICAgICAgIH0KKy8vICAgICAgICByZXR1cm4gTk9fRVJST1I7CisvLyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEpBdWRpb1RyYWNrOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKAorICAgICAgICBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrIF9fdW51c2VkKSB7CisgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMgYWZ0ZXIgYXBwcm9wcmlhdGUgSmF2YSBBdWRpb1RyYWNrIG1ldGhvZCBpcyBhdmFpbGFibGUuCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBKQXVkaW9UcmFjazo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjaygKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjayBfX3VudXNlZCkgeworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIGFmdGVyIGFwcHJvcHJpYXRlIEphdmEgQXVkaW9UcmFjayBtZXRob2QgaXMgYXZhaWxhYmxlLgorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vICAgICAgICAgICAgICAgIFByaXZhdGUgbWV0aG9kIGJlZ2lucyAgICAgICAgICAgICAgICAgIC8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitqb2JqZWN0IEpBdWRpb1RyYWNrOjpjcmVhdGVWb2x1bWVTaGFwZXJDb25maWd1cmF0aW9uT2JqKAorICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlnKSB7CisKKyAgICAvLyBUT0RPOiBKYXZhIFZvbHVtZVNoYXBlcidzIHNldElkKCkgLyBzZXRPcHRpb25GbGFncygpIGFyZSBoaWRkZW4uCisgICAgaWYgKGNvbmZpZyA9PSBOVUxMIHx8IGNvbmZpZy0+Z2V0VHlwZSgpID09IG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb246OlRZUEVfSUQpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisKKyAgICAvLyBSZWZlcmVuY2VkICJhbmRyb2lkX21lZGlhX1ZvbHVtZVNoYXBlci5oIi4KKyAgICBqZmxvYXRBcnJheSB4YXJyYXkgPSBudWxscHRyOworICAgIGpmbG9hdEFycmF5IHlhcnJheSA9IG51bGxwdHI7CisgICAgaWYgKGNvbmZpZy0+Z2V0VHlwZSgpID09IG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb246OlRZUEVfU0NBTEUpIHsKKyAgICAgICAgLy8gY29udmVydCBjdXJ2ZSBhcnJheXMKKyAgICAgICAgeGFycmF5ID0gZW52LT5OZXdGbG9hdEFycmF5KGNvbmZpZy0+c2l6ZSgpKTsKKyAgICAgICAgeWFycmF5ID0gZW52LT5OZXdGbG9hdEFycmF5KGNvbmZpZy0+c2l6ZSgpKTsKKyAgICAgICAgZmxvYXQgKiBjb25zdCB4ID0gZW52LT5HZXRGbG9hdEFycmF5RWxlbWVudHMoeGFycmF5LCBudWxscHRyIC8qIGlzQ29weSAqLyk7CisgICAgICAgIGZsb2F0ICogY29uc3QgeSA9IGVudi0+R2V0RmxvYXRBcnJheUVsZW1lbnRzKHlhcnJheSwgbnVsbHB0ciAvKiBpc0NvcHkgKi8pOworICAgICAgICBmbG9hdCAqeHB0ciA9IHgsICp5cHRyID0geTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwdCA6ICpjb25maWcuZ2V0KCkpIHsKKyAgICAgICAgICAgICp4cHRyKysgPSBwdC5maXJzdDsKKyAgICAgICAgICAgICp5cHRyKysgPSBwdC5zZWNvbmQ7CisgICAgICAgIH0KKyAgICAgICAgZW52LT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKHhhcnJheSwgeCwgMCAvKiBtb2RlICovKTsKKyAgICAgICAgZW52LT5SZWxlYXNlRmxvYXRBcnJheUVsZW1lbnRzKHlhcnJheSwgeSwgMCAvKiBtb2RlICovKTsKKyAgICB9CisKKyAgICBqY2xhc3MgakJ1aWxkZXJDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIkQ29uZmlndXJhdGlvbiRCdWlsZGVyIik7CisgICAgam1ldGhvZElEIGpCdWlsZGVyQ3RvciA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICI8aW5pdD4iLCAiKClWIik7CisgICAgam9iamVjdCBqQnVpbGRlck9iaiA9IGVudi0+TmV3T2JqZWN0KGpCdWlsZGVyQ2xzLCBqQnVpbGRlckN0b3IpOworCisgICAgam1ldGhvZElEIGpTZXREdXJhdGlvbiA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJzZXREdXJhdGlvbiIsCisgICAgICAgICAgICAiKEwpTGFuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyJENvbmZpZ3VyYXRpb24kQnVpbGRlcjsiKTsKKyAgICBqQnVpbGRlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlckNscywgalNldER1cmF0aW9uLCAoamxvbmcpIGNvbmZpZy0+Z2V0RHVyYXRpb25NcygpKTsKKworICAgIGptZXRob2RJRCBqU2V0SW50ZXJwb2xhdG9yVHlwZSA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJzZXRJbnRlcnBvbGF0b3JUeXBlIiwKKyAgICAgICAgICAgICIoSSlMYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIkQ29uZmlndXJhdGlvbiRCdWlsZGVyOyIpOworICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyQ2xzLCBqU2V0SW50ZXJwb2xhdG9yVHlwZSwKKyAgICAgICAgICAgIGNvbmZpZy0+Z2V0SW50ZXJwb2xhdG9yVHlwZSgpKTsKKworICAgIGptZXRob2RJRCBqU2V0Q3VydmUgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAic2V0Q3VydmUiLAorICAgICAgICAgICAgIihbRltGKUxhbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlciRDb25maWd1cmF0aW9uJEJ1aWxkZXI7Iik7CisgICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJDbHMsIGpTZXRDdXJ2ZSwgeGFycmF5LCB5YXJyYXkpOworCisgICAgam1ldGhvZElEIGpCdWlsZCA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJidWlsZCIsCisgICAgICAgICAgICAiKClMYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIkQ29uZmlndXJhdGlvbjsiKTsKKyAgICByZXR1cm4gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLCBqQnVpbGQpOworfQorCitqb2JqZWN0IEpBdWRpb1RyYWNrOjpjcmVhdGVWb2x1bWVTaGFwZXJPcGVyYXRpb25PYmooCisgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbikgeworCisgICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisKKyAgICBqY2xhc3MgakJ1aWxkZXJDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIkT3BlcmF0aW9uJEJ1aWxkZXIiKTsKKyAgICBqbWV0aG9kSUQgakJ1aWxkZXJDdG9yID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgIjxpbml0PiIsICIoKVYiKTsKKyAgICBqb2JqZWN0IGpCdWlsZGVyT2JqID0gZW52LT5OZXdPYmplY3QoakJ1aWxkZXJDbHMsIGpCdWlsZGVyQ3Rvcik7CisKKyAgICAvLyBTZXQgWE9mZnNldAorICAgIGptZXRob2RJRCBqU2V0WE9mZnNldCA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJzZXRYT2Zmc2V0IiwKKyAgICAgICAgICAgICIoRilMYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIkT3BlcmF0aW9uJEJ1aWxkZXI7Iik7CisgICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJDbHMsIGpTZXRYT2Zmc2V0LCBvcGVyYXRpb24tPmdldFhPZmZzZXQoKSk7CisKKyAgICBpbnQzMl90IGZsYWdzID0gb3BlcmF0aW9uLT5nZXRGbGFncygpOworCisgICAgaWYgKG9wZXJhdGlvbi0+Z2V0UmVwbGFjZUlkKCkgPj0gMCkgeworICAgICAgICBqbWV0aG9kSUQgalJlcGxhY2UgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAicmVwbGFjZSIsCisgICAgICAgICAgICAgICAgIihJQilMYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIkT3BlcmF0aW9uJEJ1aWxkZXI7Iik7CisgICAgICAgIGJvb2wgam9pbiA9IChmbGFncyB8IG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbjo6RkxBR19KT0lOKSAhPSAwOworICAgICAgICBqQnVpbGRlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlckNscywgalJlcGxhY2UsIG9wZXJhdGlvbi0+Z2V0UmVwbGFjZUlkKCksIGpvaW4pOworICAgIH0KKworICAgIGlmIChmbGFncyB8IG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbjo6RkxBR19SRVZFUlNFKSB7CisgICAgICAgIGptZXRob2RJRCBqUmV2ZXJzZSA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJyZXZlcnNlIiwKKyAgICAgICAgICAgICAgICAiKClMYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIkT3BlcmF0aW9uJEJ1aWxkZXI7Iik7CisgICAgICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyQ2xzLCBqUmV2ZXJzZSk7CisgICAgfQorCisgICAgLy8gVE9ETzogVm9sdW1lU2hhcGVyIEphdmFkb2Mgc2F5cyAiRG8gbm90IGNhbGwgdGVybWluYXRlKCkgZGlyZWN0bHkiLiBDYW4gd2UgY2FsbCB0aGlzPworICAgIGlmIChmbGFncyB8IG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbjo6RkxBR19URVJNSU5BVEUpIHsKKyAgICAgICAgam1ldGhvZElEIGpUZXJtaW5hdGUgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAidGVybWluYXRlIiwKKyAgICAgICAgICAgICAgICAiKClMYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIkT3BlcmF0aW9uJEJ1aWxkZXI7Iik7CisgICAgICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyQ2xzLCBqVGVybWluYXRlKTsKKyAgICB9CisKKyAgICBpZiAoZmxhZ3MgfCBtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb246OkZMQUdfREVMQVkpIHsKKyAgICAgICAgam1ldGhvZElEIGpEZWZlciA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJkZWZlciIsCisgICAgICAgICAgICAgICAgIigpTGFuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyJE9wZXJhdGlvbiRCdWlsZGVyOyIpOworICAgICAgICBqQnVpbGRlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlckNscywgakRlZmVyKTsKKyAgICB9CisKKyAgICBpZiAoZmxhZ3MgfCBtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb246OkZMQUdfQ1JFQVRFX0lGX05FQ0VTU0FSWSkgeworICAgICAgICBqbWV0aG9kSUQgakNyZWF0ZUlmTmVlZGVkID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgImNyZWF0ZUlmTmVlZGVkIiwKKyAgICAgICAgICAgICAgICAiKClMYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIkT3BlcmF0aW9uJEJ1aWxkZXI7Iik7CisgICAgICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyQ2xzLCBqQ3JlYXRlSWZOZWVkZWQpOworICAgIH0KKworICAgIC8vIFRPRE86IEhhbmRsZSBlcnJvciBjYXNlIChjYW4gaXQgYmUgTlVMTD8pCisgICAgam1ldGhvZElEIGpCdWlsZCA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJidWlsZCIsCisgICAgICAgICAgICAiKClMYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIkT3BlcmF0aW9uOyIpOworICAgIHJldHVybiBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJPYmosIGpCdWlsZCk7Cit9CisKK2pvYmplY3QgSkF1ZGlvVHJhY2s6OmNyZWF0ZVN0cmVhbUV2ZW50Q2FsbGJhY2soY2FsbGJhY2tfdCBjYmYsIHZvaWQqIHVzZXIpIHsKKyAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqY2xhc3MgakNhbGxiYWNrQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTWVkaWFQbGF5ZXIySW1wbCRTdHJlYW1FdmVudENhbGxiYWNrIik7CisgICAgam1ldGhvZElEIGpDYWxsYmFja0N0b3IgPSBlbnYtPkdldE1ldGhvZElEKGpDYWxsYmFja0NscywgIjxpbml0PiIsICIoSkpKKVYiKTsKKyAgICBqb2JqZWN0IGpDYWxsYmFja09iaiA9IGVudi0+TmV3T2JqZWN0KGpDYWxsYmFja0NscywgakNhbGxiYWNrQ3RvciwgdGhpcywgY2JmLCB1c2VyKTsKKyAgICByZXR1cm4gakNhbGxiYWNrT2JqOworfQorCitqb2JqZWN0IEpBdWRpb1RyYWNrOjpjcmVhdGVDYWxsYmFja0V4ZWN1dG9yKCkgeworICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIGpjbGFzcyBqRXhlY3V0b3JzQ2xzID0gZW52LT5GaW5kQ2xhc3MoImphdmEvdXRpbC9jb25jdXJyZW50L0V4ZWN1dG9ycyIpOworICAgIGptZXRob2RJRCBqTmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IgPSBlbnYtPkdldFN0YXRpY01ldGhvZElEKGpFeGVjdXRvcnNDbHMsCisgICAgICAgICAgICAibmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IiLCAiKClMamF2YS91dGlsL2NvbmN1cnJlbnQvRXhlY3V0b3JTZXJ2aWNlOyIpOworICAgIGpvYmplY3QgalNpbmdsZVRocmVhZEV4ZWN1dG9yT2JqID0KKyAgICAgICAgICAgIGVudi0+Q2FsbFN0YXRpY09iamVjdE1ldGhvZChqRXhlY3V0b3JzQ2xzLCBqTmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IpOworICAgIHJldHVybiBqU2luZ2xlVGhyZWFkRXhlY3V0b3JPYmo7Cit9CisKK3N0YXR1c190IEpBdWRpb1RyYWNrOjpqYXZhVG9OYXRpdmVTdGF0dXMoaW50IGphdmFTdGF0dXMpIHsKKyAgICBzd2l0Y2ggKGphdmFTdGF0dXMpIHsKKyAgICBjYXNlIEFVRElPX0pBVkFfU1VDQ0VTUzoKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIGNhc2UgQVVESU9fSkFWQV9CQURfVkFMVUU6CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgY2FzZSBBVURJT19KQVZBX0lOVkFMSURfT1BFUkFUSU9OOgorICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgY2FzZSBBVURJT19KQVZBX1BFUk1JU1NJT05fREVOSUVEOgorICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgY2FzZSBBVURJT19KQVZBX05PX0lOSVQ6CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIGNhc2UgQVVESU9fSkFWQV9XT1VMRF9CTE9DSzoKKyAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOworICAgIGNhc2UgQVVESU9fSkFWQV9ERUFEX09CSkVDVDoKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkF1ZGlvT3V0cHV0LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThlMWQxZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5jcHAKQEAgLTAsMCArMSw3MjcgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQiCisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkF1ZGlvT3V0cHV0Lmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPiAvLyBmb3IgcHJvcGVydHlfZ2V0CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorCituYW1lc3BhY2UgeworCitjb25zdCBmbG9hdCBrTWF4UmVxdWlyZWRTcGVlZCA9IDguMGY7IC8vIGZvciBQQ00gdHJhY2tzIGFsbG93IHVwIHRvIDh4IHNwZWVkdXAuCisKK30gLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIFRPRE86IEZpbmQgcmVhbCBjYXVzZSBvZiBBdWRpby9WaWRlbyBkZWxheSBpbiBQViBmcmFtZXdvcmsgYW5kIHJlbW92ZSB0aGlzIHdvcmthcm91bmQKKy8qIHN0YXRpYyAqLyBpbnQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6Om1NaW5CdWZmZXJDb3VudCA9IDQ7CisvKiBzdGF0aWMgKi8gYm9vbCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6bUlzT25FbXVsYXRvciA9IGZhbHNlOworCitzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0IHsKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHJlc3VsdC5hcHBlbmQoIiBNZWRpYVBsYXllcjJBdWRpb091dHB1dFxuIik7CisgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIHN0cmVhbSB0eXBlKCVkKSwgbGVmdCAtIHJpZ2h0IHZvbHVtZSglZiwgJWYpXG4iLAorICAgICAgICAgICAgbVN0cmVhbVR5cGUsIG1MZWZ0Vm9sdW1lLCBtUmlnaHRWb2x1bWUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgbXNlYyBwZXIgZnJhbWUoJWYpLCBsYXRlbmN5ICglZClcbiIsCisgICAgICAgICAgICBtTXNlY3NQZXJGcmFtZSwgKG1UcmFjayAhPSAwKSA/IG1UcmFjay0+bGF0ZW5jeSgpIDogLTEpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgYXV4IGVmZmVjdCBpZCglZCksIHNlbmQgbGV2ZWwgKCVmKVxuIiwKKyAgICAgICAgICAgIG1BdXhFZmZlY3RJZCwgbVNlbmRMZXZlbCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgOjp3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICBpZiAobVRyYWNrICE9IDApIHsKKyAgICAgICAgbVRyYWNrLT5kdW1wKGZkLCBhcmdzKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6TWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwgdWlkX3QgdWlkLCBpbnQgcGlkLAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIGF0dHIsIGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgZGV2aWNlQ2FsbGJhY2spCisgICAgOiBtQ2FsbGJhY2soTlVMTCksCisgICAgICBtQ2FsbGJhY2tDb29raWUoTlVMTCksCisgICAgICBtQ2FsbGJhY2tEYXRhKE5VTEwpLAorICAgICAgbVN0cmVhbVR5cGUoQVVESU9fU1RSRUFNX01VU0lDKSwKKyAgICAgIG1MZWZ0Vm9sdW1lKDEuMCksCisgICAgICBtUmlnaHRWb2x1bWUoMS4wKSwKKyAgICAgIG1QbGF5YmFja1JhdGUoQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUKSwKKyAgICAgIG1TYW1wbGVSYXRlSHooMCksCisgICAgICBtTXNlY3NQZXJGcmFtZSgwKSwKKyAgICAgIG1GcmFtZVNpemUoMCksCisgICAgICBtU2Vzc2lvbklkKHNlc3Npb25JZCksCisgICAgICBtVWlkKHVpZCksCisgICAgICBtUGlkKHBpZCksCisgICAgICBtU2VuZExldmVsKDAuMCksCisgICAgICBtQXV4RWZmZWN0SWQoMCksCisgICAgICBtRmxhZ3MoQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSksCisgICAgICBtU2VsZWN0ZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwKKyAgICAgIG1Sb3V0ZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwKKyAgICAgIG1EZXZpY2VDYWxsYmFja0VuYWJsZWQoZmFsc2UpLAorICAgICAgbURldmljZUNhbGxiYWNrKGRldmljZUNhbGxiYWNrKSB7CisgICAgQUxPR1YoIk1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KCVkKSIsIHNlc3Npb25JZCk7CisgICAgaWYgKGF0dHIgIT0gTlVMTCkgeworICAgICAgICBtQXR0cmlidXRlcyA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgaWYgKG1BdHRyaWJ1dGVzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1lbWNweShtQXR0cmlidXRlcywgYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICAgICAgbVN0cmVhbVR5cGUgPSBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKGF0dHIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUF0dHJpYnV0ZXMgPSBOVUxMOworICAgIH0KKworICAgIHNldE1pbkJ1ZmZlckNvdW50KCk7Cit9CisKK01lZGlhUGxheWVyMkF1ZGlvT3V0cHV0Ojp+TWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQoKSB7CisgICAgY2xvc2UoKTsKKyAgICBmcmVlKG1BdHRyaWJ1dGVzKTsKKyAgICBkZWxldGUgbUNhbGxiYWNrRGF0YTsKK30KKworLy9zdGF0aWMKK3ZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnNldE1pbkJ1ZmZlckNvdW50KCkgeworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KCJyby5rZXJuZWwucWVtdSIsIHZhbHVlLCAwKSkgeworICAgICAgICBtSXNPbkVtdWxhdG9yID0gdHJ1ZTsKKyAgICAgICAgbU1pbkJ1ZmZlckNvdW50ID0gMTI7ICAvLyB0byBwcmV2ZW50IHN5c3RlbWF0aWMgYnVmZmVyIHVuZGVycnVuIGZvciBlbXVsYXRvcgorICAgIH0KK30KKworLy8gc3RhdGljCitib29sIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0Ojppc09uRW11bGF0b3IoKSB7CisgICAgc2V0TWluQnVmZmVyQ291bnQoKTsgIC8vIGJlbmlnbiByYWNlIHdydCBvdGhlciB0aHJlYWRzCisgICAgcmV0dXJuIG1Jc09uRW11bGF0b3I7Cit9CisKKy8vIHN0YXRpYworaW50IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRNaW5CdWZmZXJDb3VudCgpIHsKKyAgICBzZXRNaW5CdWZmZXJDb3VudCgpOyAgLy8gYmVuaWduIHJhY2Ugd3J0IG90aGVyIHRocmVhZHMKKyAgICByZXR1cm4gbU1pbkJ1ZmZlckNvdW50OworfQorCitzc2l6ZV90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpidWZmZXJTaXplKCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtVHJhY2stPmZyYW1lQ291bnQoKSAqIG1GcmFtZVNpemU7Cit9CisKK3NzaXplX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmZyYW1lQ291bnQoKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1UcmFjay0+ZnJhbWVDb3VudCgpOworfQorCitzc2l6ZV90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpjaGFubmVsQ291bnQoKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1UcmFjay0+Y2hhbm5lbENvdW50KCk7Cit9CisKK3NzaXplX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmZyYW1lU2l6ZSgpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUZyYW1lU2l6ZTsKK30KKwordWludDMyX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmxhdGVuY3kgKCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBtVHJhY2stPmxhdGVuY3koKTsKK30KKworZmxvYXQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6Om1zZWNzUGVyRnJhbWUoKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIHJldHVybiBtTXNlY3NQZXJGcmFtZTsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbikgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtVHJhY2stPmdldFBvc2l0aW9uKHBvc2l0aW9uKTsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCAmdHMpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbVRyYWNrLT5nZXRUaW1lc3RhbXAodHMpOworfQorCisvLyBUT0RPOiBSZW1vdmUgdW5uZWNlc3NhcnkgY2FsbHMgdG8gZ2V0UGxheWVkT3V0RHVyYXRpb25VcygpCisvLyBhcyBpdCBhY3F1aXJlcyBsb2NrcyBhbmQgbWF5IHF1ZXJ5IHRoZSBhdWRpbyBkcml2ZXIuCisvLworLy8gU29tZSBjYWxscyBjb3VsZCBjb25jZWl2YWJseSByZXRyaWV2ZSBleHRyYXBvbGF0ZWQgZGF0YSBpbnN0ZWFkIG9mCisvLyBhY2Nlc3NpbmcgZ2V0VGltZXN0YW1wKCkgb3IgZ2V0UG9zaXRpb24oKSBldmVyeSB0aW1lIGEgZGF0YSBidWZmZXIgd2l0aAorLy8gYSBtZWRpYSB0aW1lIGlzIHJlY2VpdmVkLgorLy8KKy8vIENhbGN1bGF0ZSBkdXJhdGlvbiBvZiBwbGF5ZWQgc2FtcGxlcyBpZiBwbGF5ZWQgYXQgbm9ybWFsIHJhdGUgKGkuZS4sIDEuMCkuCitpbnQ2NF90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRQbGF5ZWRPdXREdXJhdGlvblVzKGludDY0X3Qgbm93VXMpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1UcmFjayA9PSAwIHx8IG1TYW1wbGVSYXRlSHogPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBudW1GcmFtZXNQbGF5ZWQ7CisgICAgaW50NjRfdCBudW1GcmFtZXNQbGF5ZWRBdFVzOworICAgIEF1ZGlvVGltZXN0YW1wIHRzOworCisgICAgc3RhdHVzX3QgcmVzID0gbVRyYWNrLT5nZXRUaW1lc3RhbXAodHMpOworICAgIGlmIChyZXMgPT0gT0spIHsgICAgICAgICAgICAgICAgIC8vIGNhc2UgMTogbWl4aW5nIGF1ZGlvIHRyYWNrcyBhbmQgb2ZmbG9hZGVkIHRyYWNrcy4KKyAgICAgICAgbnVtRnJhbWVzUGxheWVkID0gdHMubVBvc2l0aW9uOworICAgICAgICBudW1GcmFtZXNQbGF5ZWRBdFVzID0gdHMubVRpbWUudHZfc2VjICogMTAwMDAwMExMICsgdHMubVRpbWUudHZfbnNlYyAvIDEwMDA7CisgICAgICAgIC8vQUxPR0QoImdldFRpbWVzdGFtcDogT0sgJWQgJWxsZCIsIG51bUZyYW1lc1BsYXllZCwgKGxvbmcgbG9uZyludW1GcmFtZXNQbGF5ZWRBdFVzKTsKKyAgICB9IGVsc2UgaWYgKHJlcyA9PSBXT1VMRF9CTE9DSykgeyAvLyBjYXNlIDI6IHRyYW5zaXRvcnkgc3RhdGUgb24gc3RhcnQgb2YgYSBuZXcgdHJhY2sKKyAgICAgICAgbnVtRnJhbWVzUGxheWVkID0gMDsKKyAgICAgICAgbnVtRnJhbWVzUGxheWVkQXRVcyA9IG5vd1VzOworICAgICAgICAvL0FMT0dEKCJnZXRUaW1lc3RhbXA6IFdPVUxEX0JMT0NLICVkICVsbGQiLAorICAgICAgICAvLyAgICAgICAgbnVtRnJhbWVzUGxheWVkLCAobG9uZyBsb25nKW51bUZyYW1lc1BsYXllZEF0VXMpOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhc2UgMzogdHJhbnNpdG9yeSBhdCBuZXcgdHJhY2sgb3IgYXVkaW8gZmFzdCB0cmFja3MuCisgICAgICAgIHJlcyA9IG1UcmFjay0+Z2V0UG9zaXRpb24oJm51bUZyYW1lc1BsYXllZCk7CisgICAgICAgIENIRUNLX0VRKHJlcywgKHN0YXR1c190KU9LKTsKKyAgICAgICAgbnVtRnJhbWVzUGxheWVkQXRVcyA9IG5vd1VzOworICAgICAgICBudW1GcmFtZXNQbGF5ZWRBdFVzICs9IDEwMDBMTCAqIG1UcmFjay0+bGF0ZW5jeSgpIC8gMjsgLyogWFhYICovCisgICAgICAgIC8vQUxPR0QoImdldFBvc2l0aW9uOiAldSAlbGxkIiwgbnVtRnJhbWVzUGxheWVkLCAobG9uZyBsb25nKW51bUZyYW1lc1BsYXllZEF0VXMpOworICAgIH0KKworICAgIC8vIENIRUNLX0VRKG51bUZyYW1lc1BsYXllZCAmICgxIDw8IDMxKSwgMCk7ICAvLyBjYW4ndCBiZSBuZWdhdGl2ZSB1bnRpbCAxMi40IGhycywgdGVzdAorICAgIC8vIFRPRE86IHJlbW92ZSB0aGUgKGludDMyX3QpIGNhc3RpbmcgYmVsb3cgYXMgaXQgbWF5IG92ZXJmbG93IGF0IDEyLjQgaG91cnMuCisgICAgaW50NjRfdCBkdXJhdGlvblVzID0gKGludDY0X3QpKChpbnQzMl90KW51bUZyYW1lc1BsYXllZCAqIDEwMDAwMDBMTCAvIG1TYW1wbGVSYXRlSHopCisgICAgICAgICAgICArIG5vd1VzIC0gbnVtRnJhbWVzUGxheWVkQXRVczsKKyAgICBpZiAoZHVyYXRpb25VcyA8IDApIHsKKyAgICAgICAgLy8gT2NjdXJzIHdoZW4gbnVtRnJhbWVzUGxheWVkIHBvc2l0aW9uIGlzIHZlcnkgc21hbGwgYW5kIHRoZSBmb2xsb3dpbmc6CisgICAgICAgIC8vICgxKSBJbiBjYXNlIDEsIHRoZSB0aW1lIG5vd1VzIGlzIGNvbXB1dGVkIGJlZm9yZSBnZXRUaW1lc3RhbXAoKSBpcyBjYWxsZWQgYW5kCisgICAgICAgIC8vICAgICBudW1GcmFtZXNQbGF5ZWRBdFVzIGlzIGdyZWF0ZXIgdGhhbiBub3dVcyBieSB0aW1lIG1vcmUgdGhhbiBudW1GcmFtZXNQbGF5ZWQuCisgICAgICAgIC8vICgyKSBJbiBjYXNlIDMsIHVzaW5nIGdldFBvc2l0aW9uIGFuZCBhZGRpbmcgbUF1ZGlvU2luay0+bGF0ZW5jeSgpIHRvCisgICAgICAgIC8vICAgICBudW1GcmFtZXNQbGF5ZWRBdFVzLCBieSBhIHRpbWUgYW1vdW50IGdyZWF0ZXIgdGhhbiBudW1GcmFtZXNQbGF5ZWQuCisgICAgICAgIC8vCisgICAgICAgIC8vIEJvdGggb2YgdGhlc2UgYXJlIHRyYW5zaXRvcnkgY29uZGl0aW9ucy4KKyAgICAgICAgQUxPR1YoImdldFBsYXllZE91dER1cmF0aW9uVXM6IG5lZ2F0aXZlIGR1cmF0aW9uICVsbGQgc2V0IHRvIHplcm8iLCAobG9uZyBsb25nKWR1cmF0aW9uVXMpOworICAgICAgICBkdXJhdGlvblVzID0gMDsKKyAgICB9CisgICAgQUxPR1YoImdldFBsYXllZE91dER1cmF0aW9uVXMoJWxsZCkgbm93VXMoJWxsZCkgZnJhbWVzKCV1KSBmcmFtZXNBdCglbGxkKSIsCisgICAgICAgICAgICAobG9uZyBsb25nKWR1cmF0aW9uVXMsIChsb25nIGxvbmcpbm93VXMsCisgICAgICAgICAgICBudW1GcmFtZXNQbGF5ZWQsIChsb25nIGxvbmcpbnVtRnJhbWVzUGxheWVkQXRVcyk7CisgICAgcmV0dXJuIGR1cmF0aW9uVXM7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRGcmFtZXNXcml0dGVuKHVpbnQzMl90ICpmcmFtZXN3cml0dGVuKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgRXh0ZW5kZWRUaW1lc3RhbXAgZXRzOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1UcmFjay0+Z2V0VGltZXN0YW1wKCZldHMpOworICAgIGlmIChzdGF0dXMgPT0gT0sgfHwgc3RhdHVzID09IFdPVUxEX0JMT0NLKSB7CisgICAgICAgICpmcmFtZXN3cml0dGVuID0gKHVpbnQzMl90KWV0cy5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0NMSUVOVF07CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbVRyYWNrLT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpOworfQorCitTdHJpbmc4ICBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgICAgICByZXR1cm4gU3RyaW5nODo6ZW1wdHkoKTsKKyAgICB9CisgICAgcmV0dXJuIG1UcmFjay0+Z2V0UGFyYW1ldGVycyhrZXlzKTsKK30KKwordm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0QXVkaW9BdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqIGF0dHJpYnV0ZXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKGF0dHJpYnV0ZXMgPT0gTlVMTCkgeworICAgICAgICBmcmVlKG1BdHRyaWJ1dGVzKTsKKyAgICAgICAgbUF0dHJpYnV0ZXMgPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtQXR0cmlidXRlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICBtQXR0cmlidXRlcyA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkobUF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgbVN0cmVhbVR5cGUgPSBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKGF0dHJpYnV0ZXMpOworICAgIH0KK30KKwordm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICAvLyBkbyBub3QgYWxsb3cgZGlyZWN0IHN0cmVhbSB0eXBlIG1vZGlmaWNhdGlvbiBpZiBhdHRyaWJ1dGVzIGhhdmUgYmVlbiBzZXQKKyAgICBpZiAobUF0dHJpYnV0ZXMgPT0gTlVMTCkgeworICAgICAgICBtU3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7CisgICAgfQorfQorCit2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpjbG9zZV9sKCkgeworICAgIG1UcmFjay5jbGVhcigpOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6b3BlbigKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGNoYW5uZWxDb3VudCwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IGJ1ZmZlckNvdW50LAorICAgICAgICBBdWRpb0NhbGxiYWNrIGNiLCB2b2lkICpjb29raWUsCisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8sCisgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QsCisgICAgICAgIHVpbnQzMl90IHN1Z2dlc3RlZEZyYW1lQ291bnQpIHsKKyAgICBBTE9HVigib3BlbigldSwgJWQsIDB4JXgsIDB4JXgsICVkLCAlZCAweCV4KSIsIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCwgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgZm9ybWF0LCBidWZmZXJDb3VudCwgbVNlc3Npb25JZCwgZmxhZ3MpOworCisgICAgLy8gb2ZmbG9hZGluZyBpcyBvbmx5IHN1cHBvcnRlZCBpbiBjYWxsYmFjayBtb2RlIGZvciBub3cuCisgICAgLy8gb2ZmbG9hZEluZm8gbXVzdCBiZSBwcmVzZW50IGlmIG9mZmxvYWQgZmxhZyBpcyBzZXQKKyAgICBpZiAoKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApICYmCisgICAgICAgICAgICAoKGNiID09IE5VTEwpIHx8IChvZmZsb2FkSW5mbyA9PSBOVUxMKSkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBjb21wdXRlIGZyYW1lIGNvdW50IGZvciB0aGUgQXVkaW9UcmFjayBpbnRlcm5hbCBidWZmZXIKKyAgICBzaXplX3QgZnJhbWVDb3VudDsKKyAgICBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMCkgeworICAgICAgICBmcmFtZUNvdW50ID0gMDsgLy8gQXVkaW9UcmFjayB3aWxsIGdldCBmcmFtZSBjb3VudCBmcm9tIEF1ZGlvRmxpbmdlcgorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHRyeSB0byBlc3RpbWF0ZSB0aGUgYnVmZmVyIHByb2Nlc3NpbmcgZmV0Y2ggc2l6ZSBmcm9tIEF1ZGlvRmxpbmdlci4KKyAgICAgICAgLy8gZnJhbWVzUGVyQnVmZmVyIGlzIGFwcHJveGltYXRlIGFuZCBnZW5lcmFsbHkgY29ycmVjdCwgZXhjZXB0IHdoZW4gaXQncyBub3QgOi0pLgorICAgICAgICB1aW50MzJfdCBhZlNhbXBsZVJhdGU7CisgICAgICAgIHNpemVfdCBhZkZyYW1lQ291bnQ7CisgICAgICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0RnJhbWVDb3VudCgmYWZGcmFtZUNvdW50LCBtU3RyZWFtVHlwZSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisgICAgICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0U2FtcGxpbmdSYXRlKCZhZlNhbXBsZVJhdGUsIG1TdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc2l6ZV90IGZyYW1lc1BlckJ1ZmZlciA9CisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzYW1wbGVSYXRlICogYWZGcmFtZUNvdW50IC8gYWZTYW1wbGVSYXRlOworCisgICAgICAgIGlmIChidWZmZXJDb3VudCA9PSAwKSB7CisgICAgICAgICAgICAvLyB1c2Ugc3VnZ2VzdGVkRnJhbWVDb3VudAorICAgICAgICAgICAgYnVmZmVyQ291bnQgPSAoc3VnZ2VzdGVkRnJhbWVDb3VudCArIGZyYW1lc1BlckJ1ZmZlciAtIDEpIC8gZnJhbWVzUGVyQnVmZmVyOworICAgICAgICB9CisgICAgICAgIC8vIENoZWNrIGFyZ3VtZW50IGJ1ZmZlckNvdW50IGFnYWluc3QgdGhlIG1pbmludW0gYnVmZmVyIGNvdW50CisgICAgICAgIGlmIChidWZmZXJDb3VudCAhPSAwICYmIGJ1ZmZlckNvdW50IDwgbU1pbkJ1ZmZlckNvdW50KSB7CisgICAgICAgICAgICBBTE9HVigiYnVmZmVyQ291bnQgKCVkKSBpbmNyZWFzZWQgdG8gJWQiLCBidWZmZXJDb3VudCwgbU1pbkJ1ZmZlckNvdW50KTsKKyAgICAgICAgICAgIGJ1ZmZlckNvdW50ID0gbU1pbkJ1ZmZlckNvdW50OworICAgICAgICB9CisgICAgICAgIC8vIGlmIGZyYW1lQ291bnQgaXMgMCwgdGhlbiBBdWRpb1RyYWNrIHdpbGwgZ2V0IGZyYW1lIGNvdW50IGZyb20gQXVkaW9GbGluZ2VyCisgICAgICAgIC8vIHdoaWNoIHdpbGwgYmUgdGhlIG1pbmltdW0gc2l6ZSBwZXJtaXR0ZWQuCisgICAgICAgIGZyYW1lQ291bnQgPSBidWZmZXJDb3VudCAqIGZyYW1lc1BlckJ1ZmZlcjsKKyAgICB9CisKKyAgICBpZiAoY2hhbm5lbE1hc2sgPT0gQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSKSB7CisgICAgICAgIGNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KGNoYW5uZWxDb3VudCk7CisgICAgICAgIGlmICgwID09IGNoYW5uZWxNYXNrKSB7CisgICAgICAgICAgICBBTE9HRSgib3BlbigpIGVycm9yLCBjYW5cJ3QgZGVyaXZlIG1hc2sgZm9yICVkIGF1ZGlvIGNoYW5uZWxzIiwgY2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIG1DYWxsYmFjayA9IGNiOworICAgIG1DYWxsYmFja0Nvb2tpZSA9IGNvb2tpZTsKKworICAgIHNwPEF1ZGlvVHJhY2s+IHQ7CisgICAgQ2FsbGJhY2tEYXRhICpuZXdjYmQgPSBOVUxMOworCisgICAgQUxPR1YoImNyZWF0aW5nIG5ldyBBdWRpb1RyYWNrIik7CisKKyAgICBpZiAobUNhbGxiYWNrICE9IE5VTEwpIHsKKyAgICAgICAgbmV3Y2JkID0gbmV3IENhbGxiYWNrRGF0YSh0aGlzKTsKKyAgICAgICAgdCA9IG5ldyBBdWRpb1RyYWNrKAorICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgQ2FsbGJhY2tXcmFwcGVyLAorICAgICAgICAgICAgICAgIG5ld2NiZCwKKyAgICAgICAgICAgICAgICAwLCAgLy8gbm90aWZpY2F0aW9uIGZyYW1lcworICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgQXVkaW9UcmFjazo6VFJBTlNGRVJfQ0FMTEJBQ0ssCisgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8sCisgICAgICAgICAgICAgICAgbVVpZCwKKyAgICAgICAgICAgICAgICBtUGlkLAorICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgIGRvTm90UmVjb25uZWN0LAorICAgICAgICAgICAgICAgIDEuMGYsICAvLyBkZWZhdWx0IHZhbHVlIGZvciBtYXhSZXF1aXJlZFNwZWVkCisgICAgICAgICAgICAgICAgbVNlbGVjdGVkRGV2aWNlSWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRPRE86IER1ZSB0byBidWZmZXIgbWVtb3J5IGNvbmNlcm5zLCB3ZSB1c2UgYSBtYXggdGFyZ2V0IHBsYXliYWNrIHNwZWVkCisgICAgICAgIC8vIGJhc2VkIG9uIG1QbGF5YmFja1JhdGUgYXQgdGhlIHRpbWUgb2Ygb3BlbiAoaW5zdGVhZCBvZiBrTWF4UmVxdWlyZWRTcGVlZCksCisgICAgICAgIC8vIGFsc28gY2xhbXBpbmcgdGhlIHRhcmdldCBzcGVlZCB0byAxLjAgPD0gdGFyZ2V0U3BlZWQgPD0ga01heFJlcXVpcmVkU3BlZWQuCisgICAgICAgIGNvbnN0IGZsb2F0IHRhcmdldFNwZWVkID0KKyAgICAgICAgICAgICAgICBzdGQ6Om1pbihzdGQ6Om1heChtUGxheWJhY2tSYXRlLm1TcGVlZCwgMS4wZiksIGtNYXhSZXF1aXJlZFNwZWVkKTsKKyAgICAgICAgQUxPR1dfSUYodGFyZ2V0U3BlZWQgIT0gbVBsYXliYWNrUmF0ZS5tU3BlZWQsCisgICAgICAgICAgICAgICAgInRyYWNrIHRhcmdldCBzcGVlZDolZiBjbGFtcGVkIGZyb20gcGxheWJhY2sgc3BlZWQ6JWYiLAorICAgICAgICAgICAgICAgIHRhcmdldFNwZWVkLCBtUGxheWJhY2tSYXRlLm1TcGVlZCk7CisgICAgICAgIHQgPSBuZXcgQXVkaW9UcmFjaygKKyAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgIE5VTEwsIC8vIGNhbGxiYWNrCisgICAgICAgICAgICAgICAgTlVMTCwgLy8gdXNlciBkYXRhCisgICAgICAgICAgICAgICAgMCwgLy8gbm90aWZpY2F0aW9uIGZyYW1lcworICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgQXVkaW9UcmFjazo6VFJBTlNGRVJfREVGQVVMVCwKKyAgICAgICAgICAgICAgICBOVUxMLCAvLyBvZmZsb2FkIGluZm8KKyAgICAgICAgICAgICAgICBtVWlkLAorICAgICAgICAgICAgICAgIG1QaWQsCisgICAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgZG9Ob3RSZWNvbm5lY3QsCisgICAgICAgICAgICAgICAgdGFyZ2V0U3BlZWQsCisgICAgICAgICAgICAgICAgbVNlbGVjdGVkRGV2aWNlSWQpOworICAgIH0KKworICAgIGlmICgodCA9PSAwKSB8fCAodC0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gY3JlYXRlIGF1ZGlvIHRyYWNrIik7CisgICAgICAgIGRlbGV0ZSBuZXdjYmQ7CisgICAgICAgIC8vIHQgZ29lcyBvdXQgb2Ygc2NvcGUsIHNvIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0byB6ZXJvCisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHN1Y2Nlc3NmdWwgQXVkaW9UcmFjayBpbml0aWFsaXphdGlvbiBpbXBsaWVzIGEgbGVnYWN5IHN0cmVhbSB0eXBlIHdhcyBnZW5lcmF0ZWQKKyAgICAgICAgLy8gZnJvbSB0aGUgYXVkaW8gYXR0cmlidXRlcworICAgICAgICBtU3RyZWFtVHlwZSA9IHQtPnN0cmVhbVR5cGUoKTsKKyAgICB9CisKKyAgICBDSEVDSygodCAhPSBOVUxMKSAmJiAoKG1DYWxsYmFjayA9PSBOVUxMKSB8fCAobmV3Y2JkICE9IE5VTEwpKSk7CisKKyAgICBtQ2FsbGJhY2tEYXRhID0gbmV3Y2JkOworICAgIEFMT0dWKCJzZXRWb2x1bWUiKTsKKyAgICB0LT5zZXRWb2x1bWUobUxlZnRWb2x1bWUsIG1SaWdodFZvbHVtZSk7CisKKyAgICBtU2FtcGxlUmF0ZUh6ID0gc2FtcGxlUmF0ZTsKKyAgICBtRmxhZ3MgPSBmbGFnczsKKyAgICBtTXNlY3NQZXJGcmFtZSA9IDFFM2YgLyAobVBsYXliYWNrUmF0ZS5tU3BlZWQgKiBzYW1wbGVSYXRlKTsKKyAgICBtRnJhbWVTaXplID0gdC0+ZnJhbWVTaXplKCk7CisgICAgbVRyYWNrID0gdDsKKworICAgIHJldHVybiB1cGRhdGVUcmFja19sKCk7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0Ojp1cGRhdGVUcmFja19sKCkgeworICAgIGlmIChtVHJhY2sgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgc3RhdHVzX3QgcmVzID0gTk9fRVJST1I7CisgICAgLy8gTm90ZSBzb21lIG91dHB1dCBkZXZpY2VzIG1heSBnaXZlIHVzIGEgZGlyZWN0IHRyYWNrIGV2ZW4gdGhvdWdoIHdlIGRvbid0IHNwZWNpZnkgaXQuCisgICAgLy8gRXhhbXBsZTogTGluZSBhcHBsaWNhdGlvbiBiLzE3NDU5OTgyLgorICAgIGlmICgobVRyYWNrLT5nZXRGbGFncygpCisgICAgICAgICAgICAmIChBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSkgPT0gMCkgeworICAgICAgICByZXMgPSBtVHJhY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tSYXRlKTsKKyAgICAgICAgaWYgKHJlcyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgbVRyYWNrLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobVNlbmRMZXZlbCk7CisgICAgICAgICAgICByZXMgPSBtVHJhY2stPmF0dGFjaEF1eEVmZmVjdChtQXV4RWZmZWN0SWQpOworICAgICAgICB9CisgICAgfQorICAgIG1UcmFjay0+c2V0T3V0cHV0RGV2aWNlKG1TZWxlY3RlZERldmljZUlkKTsKKyAgICBpZiAobURldmljZUNhbGxiYWNrRW5hYmxlZCkgeworICAgICAgICBtVHJhY2stPmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrLnByb21vdGUoKSk7CisgICAgfQorICAgIEFMT0dWKCJ1cGRhdGVUcmFja19sKCkgRE9ORSBzdGF0dXMgJWQiLCByZXMpOworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzdGFydCgpIHsKKyAgICBBTE9HVigic3RhcnQiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1DYWxsYmFja0RhdGEgIT0gTlVMTCkgeworICAgICAgICBtQ2FsbGJhY2tEYXRhLT5lbmRUcmFja1N3aXRjaCgpOworICAgIH0KKyAgICBpZiAobVRyYWNrICE9IDApIHsKKyAgICAgICAgbVRyYWNrLT5zZXRWb2x1bWUobUxlZnRWb2x1bWUsIG1SaWdodFZvbHVtZSk7CisgICAgICAgIG1UcmFjay0+c2V0QXV4RWZmZWN0U2VuZExldmVsKG1TZW5kTGV2ZWwpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtVHJhY2stPnN0YXJ0KCk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCitzc2l6ZV90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0Ojp3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGJsb2NraW5nKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUNhbGxiYWNrICE9IE5VTEwsICJEb24ndCBjYWxsIHdyaXRlIGlmIHN1cHBseWluZyBhIGNhbGxiYWNrLiIpOworCisgICAgLy9BTE9HVigid3JpdGUoJXAsICV1KSIsIGJ1ZmZlciwgc2l6ZSk7CisgICAgaWYgKG1UcmFjayAhPSAwKSB7CisgICAgICAgIHJldHVybiBtVHJhY2stPndyaXRlKGJ1ZmZlciwgc2l6ZSwgYmxvY2tpbmcpOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKwordm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c3RvcCgpIHsKKyAgICBBTE9HVigic3RvcCIpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVRyYWNrICE9IDApIHsKKyAgICAgICAgbVRyYWNrLT5zdG9wKCk7CisgICAgfQorfQorCit2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpmbHVzaCgpIHsKKyAgICBBTE9HVigiZmx1c2giKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1UcmFjayAhPSAwKSB7CisgICAgICAgIG1UcmFjay0+Zmx1c2goKTsKKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnBhdXNlKCkgeworICAgIEFMT0dWKCJwYXVzZSIpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVRyYWNrICE9IDApIHsKKyAgICAgICAgbVRyYWNrLT5wYXVzZSgpOworICAgIH0KK30KKwordm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Y2xvc2UoKSB7CisgICAgQUxPR1YoImNsb3NlIik7CisgICAgc3A8QXVkaW9UcmFjaz4gdHJhY2s7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgICAgIHRyYWNrID0gbVRyYWNrOworICAgICAgICBjbG9zZV9sKCk7IC8vIGNsZWFycyBtVHJhY2sKKyAgICB9CisgICAgLy8gZGVzdHJ1Y3Rpb24gb2YgdGhlIHRyYWNrIG9jY3VycyBvdXRzaWRlIG9mIG11dGV4LgorfQorCit2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKKyAgICBBTE9HVigic2V0Vm9sdW1lKCVmLCAlZikiLCBsZWZ0LCByaWdodCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIG1MZWZ0Vm9sdW1lID0gbGVmdDsKKyAgICBtUmlnaHRWb2x1bWUgPSByaWdodDsKKyAgICBpZiAobVRyYWNrICE9IDApIHsKKyAgICAgICAgbVRyYWNrLT5zZXRWb2x1bWUobGVmdCwgcmlnaHQpOworICAgIH0KK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSkgeworICAgIEFMT0dWKCJzZXRQbGF5YmFja1JhdGUoJWYgJWYgJWQgJWQpIiwKKyAgICAgICAgICAgICAgICByYXRlLm1TcGVlZCwgcmF0ZS5tUGl0Y2gsIHJhdGUubUZhbGxiYWNrTW9kZSwgcmF0ZS5tU3RyZXRjaE1vZGUpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICAgICAgLy8gcmVtZW1iZXIgcmF0ZSBzbyB0aGF0IHdlIGNhbiBzZXQgaXQgd2hlbiB0aGUgdHJhY2sgaXMgb3BlbmVkCisgICAgICAgIG1QbGF5YmFja1JhdGUgPSByYXRlOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHN0YXR1c190IHJlcyA9IG1UcmFjay0+c2V0UGxheWJhY2tSYXRlKHJhdGUpOworICAgIGlmIChyZXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgLy8gcmF0ZS5tU3BlZWQgaXMgYWx3YXlzIGdyZWF0ZXIgdGhhbiAwIGlmIHNldFBsYXliYWNrUmF0ZSBzdWNjZWVkZWQKKyAgICBDSEVDS19HVChyYXRlLm1TcGVlZCwgMC5mKTsKKyAgICBtUGxheWJhY2tSYXRlID0gcmF0ZTsKKyAgICBpZiAobVNhbXBsZVJhdGVIeiAhPSAwKSB7CisgICAgICAgIG1Nc2Vjc1BlckZyYW1lID0gMUUzZiAvIChyYXRlLm1TcGVlZCAqIG1TYW1wbGVSYXRlSHopOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0UGxheWJhY2tSYXRlKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlKSB7CisgICAgQUxPR1YoInNldFBsYXliYWNrUmF0ZSIpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgICpyYXRlID0gbVRyYWNrLT5nZXRQbGF5YmFja1JhdGUoKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoZmxvYXQgbGV2ZWwpIHsKKyAgICBBTE9HVigic2V0QXV4RWZmZWN0U2VuZExldmVsKCVmKSIsIGxldmVsKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgbVNlbmRMZXZlbCA9IGxldmVsOworICAgIGlmIChtVHJhY2sgIT0gMCkgeworICAgICAgICByZXR1cm4gbVRyYWNrLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobGV2ZWwpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjphdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKSB7CisgICAgQUxPR1YoImF0dGFjaEF1eEVmZmVjdCglZCkiLCBlZmZlY3RJZCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIG1BdXhFZmZlY3RJZCA9IGVmZmVjdElkOworICAgIGlmIChtVHJhY2sgIT0gMCkgeworICAgICAgICByZXR1cm4gbVRyYWNrLT5hdHRhY2hBdXhFZmZlY3QoZWZmZWN0SWQpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgeworICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoJWQpIiwgZGV2aWNlSWQpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBtU2VsZWN0ZWREZXZpY2VJZCA9IGRldmljZUlkOworICAgIGlmIChtVHJhY2sgIT0gMCkgeworICAgICAgICByZXR1cm4gbVRyYWNrLT5zZXRPdXRwdXREZXZpY2UoZGV2aWNlSWQpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCkgeworICAgIEFMT0dWKCJnZXRSb3V0ZWREZXZpY2VJZCIpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVRyYWNrICE9IDApIHsKKyAgICAgICAgbVJvdXRlZERldmljZUlkID0gbVRyYWNrLT5nZXRSb3V0ZWREZXZpY2VJZCgpOworICAgIH0KKyAgICAqZGV2aWNlSWQgPSBtUm91dGVkRGV2aWNlSWQ7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6ZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpIHsKKyAgICBBTE9HVigiZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjaywgJWQiLCBlbmFibGVkKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgbURldmljZUNhbGxiYWNrRW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgaWYgKG1UcmFjayAhPSAwKSB7CisgICAgICAgIHN0YXR1c190IHN0YXR1czsKKyAgICAgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1UcmFjay0+YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2sucHJvbW90ZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1UcmFjay0+cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2sucHJvbW90ZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8vIHN0YXRpYwordm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Q2FsbGJhY2tXcmFwcGVyKAorICAgICAgICBpbnQgZXZlbnQsIHZvaWQgKmNvb2tpZSwgdm9pZCAqaW5mbykgeworICAgIC8vQUxPR1YoImNhbGxiYWNrd3JhcHBlciIpOworICAgIENhbGxiYWNrRGF0YSAqZGF0YSA9IChDYWxsYmFja0RhdGEqKWNvb2tpZTsKKyAgICAvLyBsb2NrIHRvIGVuc3VyZSB3ZSBhcmVuJ3QgY2F1Z2h0IGluIHRoZSBtaWRkbGUgb2YgYSB0cmFjayBzd2l0Y2guCisgICAgZGF0YS0+bG9jaygpOworICAgIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0ICptZSA9IGRhdGEtPmdldE91dHB1dCgpOworICAgIEF1ZGlvVHJhY2s6OkJ1ZmZlciAqYnVmZmVyID0gKEF1ZGlvVHJhY2s6OkJ1ZmZlciAqKWluZm87CisgICAgaWYgKG1lID09IE5VTEwpIHsKKyAgICAgICAgLy8gbm8gb3V0cHV0IHNldCwgbGlrZWx5IGJlY2F1c2UgdGhlIHRyYWNrIHdhcyBzY2hlZHVsZWQgdG8gYmUgcmV1c2VkCisgICAgICAgIC8vIGJ5IGFub3RoZXIgcGxheWVyLCBidXQgdGhlIGZvcm1hdCB0dXJuZWQgb3V0IHRvIGJlIGluY29tcGF0aWJsZS4KKyAgICAgICAgZGF0YS0+dW5sb2NrKCk7CisgICAgICAgIGlmIChidWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgYnVmZmVyLT5zaXplID0gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoKGV2ZW50KSB7CisgICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9NT1JFX0RBVEE6IHsKKyAgICAgICAgc2l6ZV90IGFjdHVhbFNpemUgPSAoKm1lLT5tQ2FsbGJhY2spKAorICAgICAgICAgICAgICAgIG1lLCBidWZmZXItPnJhdywgYnVmZmVyLT5zaXplLCBtZS0+bUNhbGxiYWNrQ29va2llLAorICAgICAgICAgICAgICAgIENCX0VWRU5UX0ZJTExfQlVGRkVSKTsKKworICAgICAgICAvLyBMb2cgd2hlbiBubyBkYXRhIGlzIHJldHVybmVkIGZyb20gdGhlIGNhbGxiYWNrLgorICAgICAgICAvLyAoMSkgV2UgbWF5IGhhdmUgbm8gZGF0YSAoZXNwZWNpYWxseSB3aXRoIG5ldHdvcmsgc3RyZWFtaW5nIHNvdXJjZXMpLgorICAgICAgICAvLyAoMikgV2UgbWF5IGhhdmUgcmVhY2hlZCB0aGUgRU9TIGFuZCB0aGUgYXVkaW8gdHJhY2sgaXMgbm90IHN0b3BwZWQgeWV0LgorICAgICAgICAvLyBOb3RlIHRoYXQgQXdlc29tZVBsYXllci9BdWRpb1BsYXllciB3aWxsIG9ubHkgcmV0dXJuIHplcm8gc2l6ZSB3aGVuIGl0IHJlYWNoZXMgdGhlIEVPUy4KKyAgICAgICAgLy8gTnVQbGF5ZXIyUmVuZGVyZXIgd2lsbCByZXR1cm4gemVybyB3aGVuIGl0IGRvZXNuJ3QgaGF2ZSBkYXRhIChpdCBkb2Vzbid0IGJsb2NrIHRvIGZpbGwpLgorICAgICAgICAvLworICAgICAgICAvLyBUaGlzIGlzIGEgYmVuaWduIGJ1c3ktd2FpdCwgd2l0aCB0aGUgbmV4dCBkYXRhIHJlcXVlc3QgZ2VuZXJhdGVkIDEwIG1zIG9yIG1vcmUgbGF0ZXI7CisgICAgICAgIC8vIG5ldmVydGhlbGVzcyBmb3IgcG93ZXIgcmVhc29ucywgd2UgZG9uJ3Qgd2FudCB0byBzZWUgdG9vIG1hbnkgb2YgdGhlc2UuCisKKyAgICAgICAgQUxPR1ZfSUYoYWN0dWFsU2l6ZSA9PSAwICYmIGJ1ZmZlci0+c2l6ZSA+IDAsICJjYWxsYmFja3dyYXBwZXI6IGVtcHR5IGJ1ZmZlciByZXR1cm5lZCIpOworCisgICAgICAgIGJ1ZmZlci0+c2l6ZSA9IGFjdHVhbFNpemU7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICBjYXNlIEF1ZGlvVHJhY2s6OkVWRU5UX1NUUkVBTV9FTkQ6CisgICAgICAgIC8vIGN1cnJlbnRseSBvbmx5IG9jY3VycyBmb3Igb2ZmbG9hZGVkIGNhbGxiYWNrcworICAgICAgICBBTE9HVigiY2FsbGJhY2t3cmFwcGVyOiBkZWxpdmVyIEVWRU5UX1NUUkVBTV9FTkQiKTsKKyAgICAgICAgKCptZS0+bUNhbGxiYWNrKShtZSwgTlVMTCAvKiBidWZmZXIgKi8sIDAgLyogc2l6ZSAqLywKKyAgICAgICAgICAgICAgICBtZS0+bUNhbGxiYWNrQ29va2llLCBDQl9FVkVOVF9TVFJFQU1fRU5EKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEF1ZGlvVHJhY2s6OkVWRU5UX05FV19JQVVESU9UUkFDSyA6CisgICAgICAgIEFMT0dWKCJjYWxsYmFja3dyYXBwZXI6IGRlbGl2ZXIgRVZFTlRfVEVBUl9ET1dOIik7CisgICAgICAgICgqbWUtPm1DYWxsYmFjaykobWUsICBOVUxMIC8qIGJ1ZmZlciAqLywgMCAvKiBzaXplICovLAorICAgICAgICAgICAgICAgIG1lLT5tQ2FsbGJhY2tDb29raWUsIENCX0VWRU5UX1RFQVJfRE9XTik7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9VTkRFUlJVTjoKKyAgICAgICAgLy8gVGhpcyBvY2N1cnMgd2hlbiB0aGVyZSBpcyBubyBkYXRhIGF2YWlsYWJsZSwgdHlwaWNhbGx5CisgICAgICAgIC8vIHdoZW4gdGhlcmUgaXMgYSBmYWlsdXJlIHRvIHN1cHBseSBkYXRhIHRvIHRoZSBBdWRpb1RyYWNrLiAgSXQgY2FuIGFsc28KKyAgICAgICAgLy8gb2NjdXIgaW4gbm9uLW9mZmxvYWRlZCBtb2RlIHdoZW4gdGhlIGF1ZGlvIGRldmljZSBjb21lcyBvdXQgb2Ygc3RhbmRieS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gSWYgYW4gQXVkaW9UcmFjayB1bmRlcnJ1bnMgaXQgb3V0cHV0cyBzaWxlbmNlLiBTaW5jZSB0aGlzIGhhcHBlbnMgc3VkZGVubHkKKyAgICAgICAgLy8gaXQgbWF5IHNvdW5kIGxpa2UgYW4gYXVkaWJsZSBwb3Agb3IgZ2xpdGNoLgorICAgICAgICAvLworICAgICAgICAvLyBUaGUgdW5kZXJydW4gZXZlbnQgaXMgc2VudCBvbmNlIHBlciB0cmFjayB1bmRlcnJ1bjsgdGhlIGNvbmRpdGlvbiBpcyByZXNldAorICAgICAgICAvLyB3aGVuIG1vcmUgZGF0YSBpcyBzZW50IHRvIHRoZSBBdWRpb1RyYWNrLgorICAgICAgICBBTE9HRCgiY2FsbGJhY2t3cmFwcGVyOiBFVkVOVF9VTkRFUlJVTiAoZGlzY2FyZGVkKSIpOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dFKCJyZWNlaXZlZCB1bmtub3duIGV2ZW50IHR5cGU6ICVkIGluc2lkZSBDYWxsYmFja1dyYXBwZXIgISIsIGV2ZW50KTsKKyAgICB9CisKKyAgICBkYXRhLT51bmxvY2soKTsKK30KKworYXVkaW9fc2Vzc2lvbl90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRTZXNzaW9uSWQoKSBjb25zdAoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbVNlc3Npb25JZDsKK30KKwordWludDMyX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFNhbXBsZVJhdGUoKSBjb25zdAoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBtVHJhY2stPmdldFNhbXBsZVJhdGUoKTsKK30KKworaW50NjRfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0QnVmZmVyRHVyYXRpb25JblVzKCkgY29uc3QKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpbnQ2NF90IGR1cmF0aW9uOworICAgIGlmIChtVHJhY2stPmdldEJ1ZmZlckR1cmF0aW9uSW5VcygmZHVyYXRpb24pICE9IE9LKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gZHVyYXRpb247Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KQXVkaW9UcmFjay5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAxODI1YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KQXVkaW9UcmFjay5oCkBAIC0wLDAgKzEsNDE5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSkFVRElPVFJBQ0tfSAorI2RlZmluZSBBTkRST0lEX0pBVURJT1RSQUNLX0gKKworI2luY2x1ZGUgPGpuaS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9Wb2x1bWVTaGFwZXIuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVGltZXN0YW1wLmg+ICAgLy8gSXQgaGFzIGRlcGVuZGVuY3kgb24gYXVkaW8uaC9FcnJvcnMuaCwgYnV0IGRvZXNuJ3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGUgdGhlbSBpbiBpdC4gVGhlcmVmb3JlIGl0IGlzIGluY2x1ZGVkIGhlcmUgYXQgbGFzdC4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBKQXVkaW9UcmFjayB7CitwdWJsaWM6CisKKyAgICAvKiBFdmVudHMgdXNlZCBieSBBdWRpb1RyYWNrIGNhbGxiYWNrIGZ1bmN0aW9uIChjYWxsYmFja190KS4KKyAgICAgKiBLZWVwIGluIHN5bmMgd2l0aCBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2suamF2YSBOQVRJVkVfRVZFTlRfKi4KKyAgICAgKi8KKyAgICBlbnVtIGV2ZW50X3R5cGUgeworICAgICAgICBFVkVOVF9NT1JFX0RBVEEgPSAwLCAgICAgICAgLy8gUmVxdWVzdCB0byB3cml0ZSBtb3JlIGRhdGEgdG8gYnVmZmVyLgorICAgICAgICBFVkVOVF9ORVdfSUFVRElPVFJBQ0sgPSA2LCAgLy8gSUF1ZGlvVHJhY2sgd2FzIHJlLWNyZWF0ZWQsIGVpdGhlciBkdWUgdG8gcmUtcm91dGluZyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZvbHVudGFyeSBpbnZhbGlkYXRpb24gYnkgbWVkaWFzZXJ2ZXIsIG9yIG1lZGlhc2VydmVyIGNyYXNoLgorICAgICAgICBFVkVOVF9TVFJFQU1fRU5EID0gNywgICAgICAgLy8gU2VudCBhZnRlciBhbGwgdGhlIGJ1ZmZlcnMgcXVldWVkIGluIEFGIGFuZCBIVyBhcmUgcGxheWVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrIChhZnRlciBzdG9wIGlzIGNhbGxlZCkgZm9yIGFuIG9mZmxvYWRlZCB0cmFjay4KKyAgICB9OworCisgICAgY2xhc3MgQnVmZmVyCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgc2l6ZV90ICAgICAgbVNpemU7ICAgICAgICAvLyBpbnB1dC9vdXRwdXQgaW4gYnl0ZXMuCisgICAgICAgIHZvaWQqICAgICAgIG1EYXRhOyAgICAgICAgLy8gcG9pbnRlciB0byB0aGUgYXVkaW8gZGF0YS4KKyAgICB9OworCisgICAgLyogQXMgYSBjb252ZW5pZW5jZSwgaWYgYSBjYWxsYmFjayBpcyBzdXBwbGllZCwgYSBoYW5kbGVyIHRocmVhZAorICAgICAqIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBwcmlvcml0eS4gVGhpcyB0aHJlYWQKKyAgICAgKiBpbnZva2VzIHRoZSBjYWxsYmFjayB3aGVuIGEgbmV3IGJ1ZmZlciBiZWNvbWVzIGF2YWlsYWJsZSBvciB2YXJpb3VzIGNvbmRpdGlvbnMgb2NjdXIuCisgICAgICoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqCisgICAgICogZXZlbnQ6ICAgdHlwZSBvZiBldmVudCBub3RpZmllZCAoc2VlIGVudW0gQXVkaW9UcmFjazo6ZXZlbnRfdHlwZSkuCisgICAgICogdXNlcjogICAgUG9pbnRlciB0byBjb250ZXh0IGZvciB1c2UgYnkgdGhlIGNhbGxiYWNrIHJlY2VpdmVyLgorICAgICAqIGluZm86ICAgIFBvaW50ZXIgdG8gb3B0aW9uYWwgcGFyYW1ldGVyIGFjY29yZGluZyB0byBldmVudCB0eXBlOgorICAgICAqICAgICAgICAgIC0gRVZFTlRfTU9SRV9EQVRBOiBwb2ludGVyIHRvIEpBdWRpb1RyYWNrOjpCdWZmZXIgc3RydWN0LiBUaGUgY2FsbGJhY2sgbXVzdCBub3QKKyAgICAgKiAgICAgICAgICAgIHdyaXRlIG1vcmUgYnl0ZXMgdGhhbiBpbmRpY2F0ZWQgYnkgJ3NpemUnIGZpZWxkIGFuZCB1cGRhdGUgJ3NpemUnIGlmIGZld2VyIGJ5dGVzCisgICAgICogICAgICAgICAgICBhcmUgd3JpdHRlbi4KKyAgICAgKiAgICAgICAgICAtIEVWRU5UX05FV19JQVVESU9UUkFDSzogdW51c2VkLgorICAgICAqICAgICAgICAgIC0gRVZFTlRfU1RSRUFNX0VORDogdW51c2VkLgorICAgICAqLworCisgICAgdHlwZWRlZiB2b2lkICgqY2FsbGJhY2tfdCkoaW50IGV2ZW50LCB2b2lkKiB1c2VyLCB2b2lkICppbmZvKTsKKworICAgIC8qIENyZWF0ZXMgYW4gSkF1ZGlvVHJhY2sgb2JqZWN0IGZvciBub24tb2ZmbG9hZCBtb2RlLgorICAgICAqIE9uY2UgY3JlYXRlZCwgdGhlIHRyYWNrIG5lZWRzIHRvIGJlIHN0YXJ0ZWQgYmVmb3JlIGl0IGNhbiBiZSB1c2VkLgorICAgICAqIFVuc3BlY2lmaWVkIHZhbHVlcyBhcmUgc2V0IHRvIGFwcHJvcHJpYXRlIGRlZmF1bHQgdmFsdWVzLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKgorICAgICAqIHN0cmVhbVR5cGU6ICAgICAgICAgU2VsZWN0IHRoZSB0eXBlIG9mIGF1ZGlvIHN0cmVhbSB0aGlzIHRyYWNrIGlzIGF0dGFjaGVkIHRvCisgICAgICogICAgICAgICAgICAgICAgICAgICAoZS5nLiBBVURJT19TVFJFQU1fTVVTSUMpLgorICAgICAqIHNhbXBsZVJhdGU6ICAgICAgICAgRGF0YSBzb3VyY2Ugc2FtcGxpbmcgcmF0ZSBpbiBIei4gIFplcm8gbWVhbnMgdG8gdXNlIHRoZSBzaW5rIHNhbXBsZSByYXRlLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgQSBub24temVybyB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZCBpZiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QgaXMgc2V0LgorICAgICAqICAgICAgICAgICAgICAgICAgICAgMCB3aWxsIG5vdCB3b3JrIHdpdGggY3VycmVudCBwb2xpY3kgaW1wbGVtZW50YXRpb24gZm9yIGRpcmVjdCBvdXRwdXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbiB3aGVyZSBhbiBleGFjdCBtYXRjaCBpcyBuZWVkZWQgZm9yIHNhbXBsaW5nIHJhdGUuCisgICAgICogICAgICAgICAgICAgICAgICAgICAoVE9ETzogQ2hlY2sgZGlyZWN0IG91dHB1dCBhZnRlciBmbGFncyBjYW4gYmUgdXNlZCBpbiBKYXZhIEF1ZGlvVHJhY2suKQorICAgICAqIGZvcm1hdDogICAgICAgICAgICAgQXVkaW8gZm9ybWF0LiBGb3IgbWl4ZWQgdHJhY2tzLCBhbnkgUENNIGZvcm1hdCBzdXBwb3J0ZWQgYnkgc2VydmVyIGlzIE9LLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgRm9yIGRpcmVjdCBhbmQgb2ZmbG9hZGVkIHRyYWNrcywgdGhlIHBvc3NpYmxlIGZvcm1hdChzKSBkZXBlbmRzIG9uIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHNpbmsuCisgICAgICogICAgICAgICAgICAgICAgICAgICAoVE9ETzogSG93IGNhbiB3ZSBjaGVjayB3aGV0aGVyIGEgZm9ybWF0IGlzIHN1cHBvcnRlZD8pCisgICAgICogY2hhbm5lbE1hc2s6ICAgICAgICBDaGFubmVsIG1hc2ssIHN1Y2ggdGhhdCBhdWRpb19pc19vdXRwdXRfY2hhbm5lbChjaGFubmVsTWFzaykgaXMgdHJ1ZS4KKyAgICAgKiBjYmY6ICAgICAgICAgICAgICAgIENhbGxiYWNrIGZ1bmN0aW9uLiBJZiBub3QgbnVsbCwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgcGVyaW9kaWNhbGx5CisgICAgICogICAgICAgICAgICAgICAgICAgICB0byBwcm92aWRlIG5ldyBkYXRhIGFuZCBpbmZvcm0gb2YgbWFya2VyLCBwb3NpdGlvbiB1cGRhdGVzLCBldGMuCisgICAgICogdXNlcjogICAgICAgICAgICAgICBDb250ZXh0IGZvciB1c2UgYnkgdGhlIGNhbGxiYWNrIHJlY2VpdmVyLgorICAgICAqIGZyYW1lQ291bnQ6ICAgICAgICAgTWluaW11bSBzaXplIG9mIHRyYWNrIFBDTSBidWZmZXIgaW4gZnJhbWVzLiBUaGlzIGRlZmluZXMgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbidzIGNvbnRyaWJ1dGlvbiB0byB0aGUgbGF0ZW5jeSBvZiB0aGUgdHJhY2suCisgICAgICogICAgICAgICAgICAgICAgICAgICBUaGUgYWN0dWFsIHNpemUgc2VsZWN0ZWQgYnkgdGhlIEpBdWRpb1RyYWNrIGNvdWxkIGJlIGxhcmdlciBpZiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZCBzaXplIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggY3VycmVudCBhdWRpbyBIQUwgY29uZmlndXJhdGlvbi4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIFplcm8gbWVhbnMgdG8gdXNlIGEgZGVmYXVsdCB2YWx1ZS4KKyAgICAgKiBzZXNzaW9uSWQ6ICAgICAgICAgIFNwZWNpZmljIHNlc3Npb24gSUQsIG9yIHplcm8gdG8gdXNlIGRlZmF1bHQuCisgICAgICogcEF0dHJpYnV0ZXM6ICAgICAgICBJZiBub3QgTlVMTCwgc3VwZXJzZWRlcyBzdHJlYW1UeXBlIGZvciB1c2UgY2FzZSBzZWxlY3Rpb24uCisgICAgICogbWF4UmVxdWlyZWRTcGVlZDogICBGb3IgUENNIHRyYWNrcywgdGhpcyBjcmVhdGVzIGFuIGFwcHJvcHJpYXRlIGJ1ZmZlciBzaXplIHRoYXQgd2lsbCBhbGxvdworICAgICAqICAgICAgICAgICAgICAgICAgICAgbWF4UmVxdWlyZWRTcGVlZCBwbGF5YmFjay4gVmFsdWVzIGxlc3MgdGhhbiAxLjBmIGFuZCBncmVhdGVyIHRoYW4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01BWCB3aWxsIGJlIGNsYW1wZWQuICBGb3Igbm9uLVBDTSB0cmFja3MKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIGFuZCBkaXJlY3Qgb3Igb2ZmbG9hZGVkIHRyYWNrcywgdGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIChUT0RPOiBIYW5kbGUgdGhpcyBhZnRlciBvZmZsb2FkIC8gZGlyZWN0IHRyYWNrIGlzIHN1cHBvcnRlZC4pCisgICAgICoKKyAgICAgKiBUT0RPOiBSZXZpdmUgcmVtb3ZlZCBhcmd1bWVudHMgYWZ0ZXIgb2ZmbG9hZCBtb2RlIGlzIHN1cHBvcnRlZC4KKyAgICAgKi8KKyAgICBKQXVkaW9UcmFjayhhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCisgICAgICAgICAgICAgICAgdm9pZCogdXNlciwKKyAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCA9IDAsCisgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCAgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAorICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMLAorICAgICAgICAgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQgPSAxLjBmKTsKKworICAgIC8qCisgICAgICAgLy8gUS4gTWF5IGJlIHVzZWQgaW4gQXVkaW9UcmFjay5zZXRQcmVmZXJyZWREZXZpY2UoQXVkaW9EZXZpY2VJbmZvKT8KKyAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQsCisKKyAgICAgICAvLyBUT0RPOiBObyBwbGFjZSB0byB1c2UgdGhlc2UgdmFsdWVzLgorICAgICAgIGludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbywKKyAgICAqLworCisgICAgdmlydHVhbCB+SkF1ZGlvVHJhY2soKTsKKworICAgIHNpemVfdCBmcmFtZUNvdW50KCk7CisgICAgc2l6ZV90IGNoYW5uZWxDb3VudCgpOworCisgICAgLyogUmV0dXJucyB0aGlzIHRyYWNrJ3MgZXN0aW1hdGVkIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqIFRoaXMgaW5jbHVkZXMgdGhlIGxhdGVuY3kgZHVlIHRvIEF1ZGlvVHJhY2sgYnVmZmVyIHNpemUsIEF1ZGlvTWl4ZXIgKGlmIGFueSkKKyAgICAgKiBhbmQgYXVkaW8gaGFyZHdhcmUgZHJpdmVyLgorICAgICAqLworICAgIHVpbnQzMl90IGxhdGVuY3koKTsKKworICAgIC8qIFJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGZyYW1lcyBwbGF5ZWQgc2luY2UgcGxheWJhY2sgc3RhcnQuCisgICAgICogVGhlIGNvdW50ZXIgd2lsbCB3cmFwIChvdmVyZmxvdykgcGVyaW9kaWNhbGx5LCBlLmcuIGV2ZXJ5IH4yNyBob3VycyBhdCA0NC4xIGtIei4KKyAgICAgKiBJdCBpcyByZXNldCB0byB6ZXJvIGJ5IGZsdXNoKCksIHJlbG9hZCgpLCBhbmQgc3RvcCgpLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKgorICAgICAqIHBvc2l0aW9uOiBBZGRyZXNzIHdoZXJlIHRvIHJldHVybiBwbGF5IGhlYWQgcG9zaXRpb24uCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgLSBOT19FUlJPUjogc3VjY2Vzc2Z1bCBvcGVyYXRpb24KKyAgICAgKiAgLSBCQURfVkFMVUU6IHBvc2l0aW9uIGlzIE5VTEwKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBnZXRQb3NpdGlvbih1aW50MzJfdCAqcG9zaXRpb24pOworCisgICAgLy8gVE9ETzogRG9lcyB0aGlzIGNvbW1lbnQgYXBwbHkgc2FtZSB0byBKYXZhIEF1ZGlvVHJhY2s6OmdldFRpbWVzdGFtcD8KKyAgICAvLyBDaGFuZ2VkIHRoZSByZXR1cm4gdHlwZSBmcm9tIHN0YXR1c190IHRvIGJvb2wsIHNpbmNlIEphdmEgQXVkaW9UcmFjazo6Z2V0VGltZXN0YW1wIHJldHVybnMKKyAgICAvLyBib29sZWFuLiBXaWxsIEphdmEgZ2V0VGltZXN0YW1wV2l0aFN0YXR1cygpIGJlIHB1YmxpYz8KKyAgICAvKiBQb2xsIGZvciBhIHRpbWVzdGFtcCBvbiBkZW1hbmQuCisgICAgICogVXNlIGlmIEVWRU5UX05FV19USU1FU1RBTVAgaXMgbm90IGRlbGl2ZXJlZCBvZnRlbiBlbm91Z2ggZm9yIHlvdXIgbmVlZHMsCisgICAgICogb3IgaWYgeW91IG5lZWQgdG8gZ2V0IHRoZSBtb3N0IHJlY2VudCB0aW1lc3RhbXAgb3V0c2lkZSBvZiB0aGUgZXZlbnQgY2FsbGJhY2sgaGFuZGxlci4KKyAgICAgKiBDYXV0aW9uOiBjYWxsaW5nIHRoaXMgbWV0aG9kIHRvbyBvZnRlbiBtYXkgYmUgaW5lZmZpY2llbnQ7CisgICAgICogaWYgeW91IG5lZWQgYSBoaWdoIHJlc29sdXRpb24gbWFwcGluZyBiZXR3ZWVuIGZyYW1lIHBvc2l0aW9uIGFuZCBwcmVzZW50YXRpb24gdGltZSwKKyAgICAgKiBjb25zaWRlciBpbXBsZW1lbnRpbmcgdGhhdCBhdCBhcHBsaWNhdGlvbiBsZXZlbCwgYmFzZWQgb24gdGhlIGxvdyByZXNvbHV0aW9uIHRpbWVzdGFtcHMuCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRpbWVzdGFtcCBpcyB2YWxpZC4KKyAgICAgKiBUaGUgdGltZXN0YW1wIHBhcmFtZXRlciBpcyB1bmRlZmluZWQgb24gcmV0dXJuLCBpZiBmYWxzZSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBib29sIGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKTsKKworICAgIC8vIFRPRE86IFRoaXMgZG9jIGlzIGp1c3QgY29waWVkIGZyb20gQXVkaW9UcmFjay5oLiBSZXZpc2UgaXQgYWZ0ZXIgaW1wbGVtZW5hdGlvbi4KKyAgICAvKiBSZXR1cm4gdGhlIGV4dGVuZGVkIHRpbWVzdGFtcCwgd2l0aCBhZGRpdGlvbmFsIHRpbWViYXNlIGluZm8gYW5kIGltcHJvdmVkIGRyYWluIGJlaGF2aW9yLgorICAgICAqCisgICAgICogVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBBdWRpb1RyYWNrLmphdmEgQVBJOgorICAgICAqIGdldFRpbWVzdGFtcChATm9uTnVsbCBBdWRpb1RpbWVzdGFtcCB0aW1lc3RhbXAsIEBBdWRpb1RpbWVzdGFtcC5UaW1lYmFzZSBpbnQgdGltZWJhc2UpCisgICAgICoKKyAgICAgKiBTb21lIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhpcyBtZXRob2QgYW5kIHRoZSBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkgbWV0aG9kCisgICAgICoKKyAgICAgKiAgIDEuIHN0b3AoKSBieSBpdHNlbGYgZG9lcyBub3QgcmVzZXQgdGhlIGZyYW1lIHBvc2l0aW9uLgorICAgICAqICAgICAgQSBmb2xsb3dpbmcgc3RhcnQoKSByZXNldHMgdGhlIGZyYW1lIHBvc2l0aW9uIHRvIDAuCisgICAgICogICAyLiBmbHVzaCgpIGJ5IGl0c2VsZiBkb2VzIG5vdCByZXNldCB0aGUgZnJhbWUgcG9zaXRpb24uCisgICAgICogICAgICBUaGUgZnJhbWUgcG9zaXRpb24gYWR2YW5jZXMgYnkgdGhlIG51bWJlciBvZiBmcmFtZXMgZmx1c2hlZCwKKyAgICAgKiAgICAgIHdoZW4gdGhlIGZpcnN0IGZyYW1lIGFmdGVyIGZsdXNoIHJlYWNoZXMgdGhlIGF1ZGlvIHNpbmsuCisgICAgICogICAzLiBCT09UVElNRSBjbG9jayBvZmZzZXRzIGFyZSBwcm92aWRlZCB0byBoZWxwIHN5bmNocm9uaXplIHdpdGgKKyAgICAgKiAgICAgIG5vbi1hdWRpbyBzdHJlYW1zLCBlLmcuIHNlbnNvciBkYXRhLgorICAgICAqICAgNC4gUG9zaXRpb24gaXMgcmV0dXJuZWQgd2l0aCA2NCBiaXRzIG9mIHJlc29sdXRpb24uCisgICAgICoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqICB0aW1lc3RhbXA6IEEgcG9pbnRlciB0byB0aGUgY2FsbGVyIGFsbG9jYXRlZCBFeHRlbmRlZFRpbWVzdGFtcC4KKyAgICAgKgorICAgICAqIFJldHVybnMgTk9fRVJST1IgICAgb24gc3VjY2VzczsgdGltZXN0YW1wIGlzIGZpbGxlZCB3aXRoIHZhbGlkIGRhdGEuCisgICAgICogICAgICAgICBCQURfVkFMVUUgICBpZiB0aW1lc3RhbXAgaXMgTlVMTC4KKyAgICAgKiAgICAgICAgIFdPVUxEX0JMT0NLIGlmIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBzdGFydCgpIHdoZW4gdGhlIG51bWJlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgb2YgZnJhbWVzIGNvbnN1bWVkIGlzIGxlc3MgdGhhbiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIG92ZXJhbGwgaGFyZHdhcmUgbGF0ZW5jeSB0byBwaHlzaWNhbCBvdXRwdXQuIEluIFdPVUxEX0JMT0NLIGNhc2VzLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgb25lIG1pZ2h0IHBvbGwgYWdhaW4sIG9yIHVzZSBnZXRQb3NpdGlvbigpLCBvciB1c2UgMCBwb3NpdGlvbiBhbmQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgdGltZSBmb3IgdGhlIHRpbWVzdGFtcC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIElmIFdPVUxEX0JMT0NLIGlzIHJldHVybmVkLCB0aGUgdGltZXN0YW1wIGlzIHN0aWxsCisgICAgICogICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCB3aXRoIHRoZSBMT0NBVElPTl9DTElFTlQgcG9ydGlvbiBmaWxsZWQuCisgICAgICogICAgICAgICBERUFEX09CSkVDVCBpZiBBdWRpb0ZsaW5nZXIgZGllcyBvciB0aGUgb3V0cHV0IGRldmljZSBjaGFuZ2VzIGFuZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgdGhlIHRyYWNrIGNhbm5vdCBiZSBhdXRvbWF0aWNhbGx5IHJlc3RvcmVkLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIG5lZWRzIHRvIHJlY3JlYXRlIHRoZSBBdWRpb1RyYWNrCisgICAgICogICAgICAgICAgICAgICAgICAgICBiZWNhdXNlIHRoZSBhdWRpbyBkZXZpY2UgY2hhbmdlZCBvciBBdWRpb0ZsaW5nZXIgZGllZC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIFRoaXMgdHlwaWNhbGx5IG9jY3VycyBmb3IgZGlyZWN0IG9yIG9mZmxvYWRlZCB0cmFja3MKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIG9yIGlmIG1Eb05vdFJlY29ubmVjdCBpcyB0cnVlLgorICAgICAqICAgICAgICAgSU5WQUxJRF9PUEVSQVRJT04gIGlmIGNhbGxlZCBvbiBhIG9mZmxvYWRlZCBvciBkaXJlY3QgdHJhY2suCisgICAgICogICAgICAgICAgICAgICAgICAgICBVc2UgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApIGluc3RlYWQuCisgICAgICovCisgICAgc3RhdHVzX3QgZ2V0VGltZXN0YW1wKEV4dGVuZGVkVGltZXN0YW1wICp0aW1lc3RhbXApOworCisgICAgLyogU2V0IHNvdXJjZSBwbGF5YmFjayByYXRlIGZvciB0aW1lc3RyZXRjaAorICAgICAqIDEuMCBpcyBub3JtYWwgc3BlZWQ6IDwgMS4wIGlzIHNsb3dlciwgPiAxLjAgaXMgZmFzdGVyCisgICAgICogMS4wIGlzIG5vcm1hbCBwaXRjaDogPCAxLjAgaXMgbG93ZXIgcGl0Y2gsID4gMS4wIGlzIGhpZ2hlciBwaXRjaAorICAgICAqCisgICAgICogQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUlOIDw9IHNwZWVkIDw9IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01BWAorICAgICAqIEFVRElPX1RJTUVTVFJFVENIX1BJVENIX01JTiA8PSBwaXRjaCA8PSBBVURJT19USU1FU1RSRVRDSF9QSVRDSF9NQVgKKyAgICAgKgorICAgICAqIFNwZWVkIGluY3JlYXNlcyB0aGUgcGxheWJhY2sgcmF0ZSBvZiBtZWRpYSwgYnV0IGRvZXMgbm90IGFsdGVyIHBpdGNoLgorICAgICAqIFBpdGNoIGluY3JlYXNlcyB0aGUgInRvbmFsIGZyZXF1ZW5jeSIgb2YgbWVkaWEsIGJ1dCBkb2VzIG5vdCBhZmZlY3QgdGhlIHBsYXliYWNrIHJhdGUuCisgICAgICovCisgICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tSYXRlKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwbGF5YmFja1JhdGUpOworCisgICAgLyogUmV0dXJuIGN1cnJlbnQgcGxheWJhY2sgcmF0ZSAqLworICAgIGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlIGdldFBsYXliYWNrUmF0ZSgpOworCisgICAgLyogU2V0cyB0aGUgdm9sdW1lIHNoYXBlciBvYmplY3QgKi8KKyAgICBtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0dXMgYXBwbHlWb2x1bWVTaGFwZXIoCisgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbik7CisKKyAgICAvKiBTZXQgdGhlIHNlbmQgbGV2ZWwgZm9yIHRoaXMgdHJhY2suIEFuIGF1eGlsaWFyeSBlZmZlY3Qgc2hvdWxkIGJlIGF0dGFjaGVkCisgICAgICogdG8gdGhlIHRyYWNrIHdpdGggYXR0YWNoRWZmZWN0KCkuIExldmVsIG11c3QgYmUgPj0gMC4wIGFuZCA8PSAxLjAuCisgICAgICovCisgICAgc3RhdHVzX3Qgc2V0QXV4RWZmZWN0U2VuZExldmVsKGZsb2F0IGxldmVsKTsKKworICAgIC8qIEF0dGFjaCB0cmFjayBhdXhpbGlhcnkgb3V0cHV0IHRvIHNwZWNpZmllZCBlZmZlY3QuIFVzZSBlZmZlY3RJZCA9IDAKKyAgICAgKiB0byBkZXRhY2ggdHJhY2sgZnJvbSBlZmZlY3QuCisgICAgICoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqCisgICAgICogZWZmZWN0SWQ6IGVmZmVjdElkIG9idGFpbmVkIGZyb20gQXVkaW9FZmZlY3Q6OmlkKCkuCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgLSBOT19FUlJPUjogc3VjY2Vzc2Z1bCBvcGVyYXRpb24KKyAgICAgKiAgLSBJTlZBTElEX09QRVJBVElPTjogVGhlIGVmZmVjdCBpcyBub3QgYW4gYXV4aWxpYXJ5IGVmZmVjdC4KKyAgICAgKiAgLSBCQURfVkFMVUU6IFRoZSBzcGVjaWZpZWQgZWZmZWN0IElEIGlzIGludmFsaWQuCisgICAgICovCisgICAgc3RhdHVzX3QgYXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCk7CisKKyAgICAvKiBTZXQgdm9sdW1lIGZvciB0aGlzIHRyYWNrLCBtb3N0bHkgdXNlZCBmb3IgZ2FtZXMnIHNvdW5kIGVmZmVjdHMKKyAgICAgKiBsZWZ0IGFuZCByaWdodCB2b2x1bWVzLiBMZXZlbHMgbXVzdCBiZSA+PSAwLjAgYW5kIDw9IDEuMC4KKyAgICAgKiBUaGlzIGlzIHRoZSBvbGRlciBBUEkuICBOZXcgYXBwbGljYXRpb25zIHNob3VsZCB1c2Ugc2V0Vm9sdW1lKGZsb2F0KSB3aGVuIHBvc3NpYmxlLgorICAgICAqLworICAgIHN0YXR1c190IHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7CisKKyAgICAvKiBTZXQgdm9sdW1lIGZvciBhbGwgY2hhbm5lbHMuIFRoaXMgaXMgdGhlIHByZWZlcnJlZCBBUEkgZm9yIG5ldyBhcHBsaWNhdGlvbnMsCisgICAgICogZXNwZWNpYWxseSBmb3IgbXVsdGktY2hhbm5lbCBjb250ZW50LgorICAgICAqLworICAgIHN0YXR1c190IHNldFZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgLy8gVE9ETzogRG9lcyB0aGlzIGNvbW1lbnQgZXF1YWxseSBhcHBseSB0byB0aGUgSmF2YSBBdWRpb1RyYWNrOjpwbGF5KCk/CisgICAgLyogQWZ0ZXIgaXQncyBjcmVhdGVkIHRoZSB0cmFjayBpcyBub3QgYWN0aXZlLiBDYWxsIHN0YXJ0KCkgdG8KKyAgICAgKiBtYWtlIGl0IGFjdGl2ZS4gSWYgc2V0LCB0aGUgY2FsbGJhY2sgd2lsbCBzdGFydCBiZWluZyBjYWxsZWQuCisgICAgICogSWYgdGhlIHRyYWNrIHdhcyBwcmV2aW91c2x5IHBhdXNlZCwgdm9sdW1lIGlzIHJhbXBlZCB1cCBvdmVyIHRoZSBmaXJzdCBtaXggYnVmZmVyLgorICAgICAqLworICAgIHN0YXR1c190IHN0YXJ0KCk7CisKKyAgICAvLyBUT0RPOiBEb2VzIHRoaXMgY29tbWVudCBzdGlsbCBhcHBsaWVzPyBJdCBzZWVtcyBub3QuIChvYnRhaW5CdWZmZXIsIEF1ZGlvRmxpbmdlciwgLi4uKQorICAgIC8qIEFzIGEgY29udmVuaWVuY2Ugd2UgcHJvdmlkZSBhIHdyaXRlKCkgaW50ZXJmYWNlIHRvIHRoZSBhdWRpbyBidWZmZXIuCisgICAgICogSW5wdXQgcGFyYW1ldGVyICdzaXplJyBpcyBpbiBieXRlIHVuaXRzLgorICAgICAqIFRoaXMgaXMgaW1wbGVtZW50ZWQgb24gdG9wIG9mIG9idGFpbkJ1ZmZlci9yZWxlYXNlQnVmZmVyLiBGb3IgYmVzdAorICAgICAqIHBlcmZvcm1hbmNlIHVzZSBjYWxsYmFja3MuIFJldHVybnMgYWN0dWFsIG51bWJlciBvZiBieXRlcyB3cml0dGVuID49IDAsCisgICAgICogb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcgbmVnYXRpdmUgc3RhdHVzIGNvZGVzOgorICAgICAqICAgICAgSU5WQUxJRF9PUEVSQVRJT04gICBBdWRpb1RyYWNrIGlzIGNvbmZpZ3VyZWQgZm9yIHN0YXRpYyBidWZmZXIgb3Igc3RyZWFtaW5nIG1vZGUKKyAgICAgKiAgICAgIEJBRF9WQUxVRSAgICAgICAgICAgc2l6ZSBpcyBpbnZhbGlkCisgICAgICogICAgICBXT1VMRF9CTE9DSyAgICAgICAgIHdoZW4gb2J0YWluQnVmZmVyKCkgcmV0dXJucyBzYW1lLCBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrIHdhcyBzdG9wcGVkIGR1cmluZyB0aGUgd3JpdGUKKyAgICAgKiAgICAgIERFQURfT0JKRUNUICAgICAgICAgd2hlbiBBdWRpb0ZsaW5nZXIgZGllcyBvciB0aGUgb3V0cHV0IGRldmljZSBjaGFuZ2VzIGFuZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdHJhY2sgY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgcmVzdG9yZWQuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBuZWVkcyB0byByZWNyZWF0ZSB0aGUgQXVkaW9UcmFjaworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBiZWNhdXNlIHRoZSBhdWRpbyBkZXZpY2UgY2hhbmdlZCBvciBBdWRpb0ZsaW5nZXIgZGllZC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB0eXBpY2FsbHkgb2NjdXJzIGZvciBkaXJlY3Qgb3Igb2ZmbG9hZCB0cmFja3MKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgbURvTm90UmVjb25uZWN0IGlzIHRydWUuCisgICAgICogICAgICBvciBhbnkgb3RoZXIgZXJyb3IgY29kZSByZXR1cm5lZCBieSBJQXVkaW9UcmFjazo6c3RhcnQoKSBvciByZXN0b3JlVHJhY2tfbCgpLgorICAgICAqIERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gb25seSByZXR1cm4gd2hlbiBhbGwgZGF0YSBoYXMgYmVlbiB0cmFuc2ZlcnJlZC4gU2V0ICdibG9ja2luZycgdG8KKyAgICAgKiBmYWxzZSBmb3IgdGhlIG1ldGhvZCB0byByZXR1cm4gaW1tZWRpYXRlbHkgd2l0aG91dCB3YWl0aW5nIHRvIHRyeSBtdWx0aXBsZSB0aW1lcyB0byB3cml0ZQorICAgICAqIHRoZSBmdWxsIGNvbnRlbnQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBzc2l6ZV90IHdyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYmxvY2tpbmcgPSB0cnVlKTsKKworICAgIC8vIFRPRE86IERvZXMgdGhpcyBjb21tZW50IGVxdWFsbHkgYXBwbHkgdG8gdGhlIEphdmEgQXVkaW9UcmFjazo6c3RvcCgpPworICAgIC8qIFN0b3AgYSB0cmFjay4KKyAgICAgKiBJbiBzdGF0aWMgYnVmZmVyIG1vZGUsIHRoZSB0cmFjayBpcyBzdG9wcGVkIGltbWVkaWF0ZWx5LgorICAgICAqIEluIHN0cmVhbWluZyBtb2RlLCB0aGUgY2FsbGJhY2sgd2lsbCBjZWFzZSBiZWluZyBjYWxsZWQuICBOb3RlIHRoYXQgb2J0YWluQnVmZmVyKCkgc3RpbGwKKyAgICAgKiB3b3JrcyBhbmQgd2lsbCBmaWxsIHVwIGJ1ZmZlcnMgdW50aWwgdGhlIHBvb2wgaXMgZXhoYXVzdGVkLCBhbmQgdGhlbiB3aWxsIHJldHVybiBXT1VMRF9CTE9DSy4KKyAgICAgKiBJbiBzdHJlYW1pbmcgbW9kZSB0aGUgc3RvcCBkb2VzIG5vdCBvY2N1ciBpbW1lZGlhdGVseTogYW55IGRhdGEgcmVtYWluaW5nIGluIHRoZSBidWZmZXIKKyAgICAgKiBpcyBmaXJzdCBkcmFpbmVkLCBtaXhlZCwgYW5kIG91dHB1dCwgYW5kIG9ubHkgdGhlbiBpcyB0aGUgdHJhY2sgbWFya2VkIGFzIHN0b3BwZWQuCisgICAgICovCisgICAgdm9pZCBzdG9wKCk7CisgICAgYm9vbCBzdG9wcGVkKCkgY29uc3Q7CisKKyAgICAvLyBUT0RPOiBEb2VzIHRoaXMgY29tbWVudCBlcXVhbGx5IGFwcGx5IHRvIHRoZSBKYXZhIEF1ZGlvVHJhY2s6OmZsdXNoKCk/CisgICAgLyogRmx1c2ggYSBzdG9wcGVkIG9yIHBhdXNlZCB0cmFjay4gQWxsIHByZXZpb3VzbHkgYnVmZmVyZWQgZGF0YSBpcyBkaXNjYXJkZWQgaW1tZWRpYXRlbHkuCisgICAgICogVGhpcyBoYXMgdGhlIGVmZmVjdCBvZiBkcmFpbmluZyB0aGUgYnVmZmVycyB3aXRob3V0IG1peGluZyBvciBvdXRwdXQuCisgICAgICogRmx1c2ggaXMgaW50ZW5kZWQgZm9yIHN0cmVhbWluZyBtb2RlLCBmb3IgZXhhbXBsZSBiZWZvcmUgc3dpdGNoaW5nIHRvIG5vbi1jb250aWd1b3VzIGNvbnRlbnQuCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyBhIG5vLW9wIGlmIHRoZSB0cmFjayBpcyBub3Qgc3RvcHBlZCBvciBwYXVzZWQsIG9yIHVzZXMgYSBzdGF0aWMgYnVmZmVyLgorICAgICAqLworICAgIHZvaWQgZmx1c2goKTsKKworICAgIC8vIFRPRE86IERvZXMgdGhpcyBjb21tZW50IGVxdWFsbHkgYXBwbHkgdG8gdGhlIEphdmEgQXVkaW9UcmFjazo6cGF1c2UoKT8KKyAgICAvLyBBdCBsZWFzdCB3ZSBhcmUgbm90IHVzaW5nIG9idGFpbkJ1ZmZlci4KKyAgICAvKiBQYXVzZSBhIHRyYWNrLiBBZnRlciBwYXVzZSwgdGhlIGNhbGxiYWNrIHdpbGwgY2Vhc2UgYmVpbmcgY2FsbGVkIGFuZAorICAgICAqIG9idGFpbkJ1ZmZlciByZXR1cm5zIFdPVUxEX0JMT0NLLiBOb3RlIHRoYXQgb2J0YWluQnVmZmVyKCkgc3RpbGwgd29ya3MKKyAgICAgKiBhbmQgd2lsbCBmaWxsIHVwIGJ1ZmZlcnMgdW50aWwgdGhlIHBvb2wgaXMgZXhoYXVzdGVkLgorICAgICAqIFZvbHVtZSBpcyByYW1wZWQgZG93biBvdmVyIHRoZSBuZXh0IG1peCBidWZmZXIgZm9sbG93aW5nIHRoZSBwYXVzZSByZXF1ZXN0LAorICAgICAqIGFuZCB0aGVuIHRoZSB0cmFjayBpcyBtYXJrZWQgYXMgcGF1c2VkLiBJdCBjYW4gYmUgcmVzdW1lZCB3aXRoIHJhbXAgdXAgYnkgc3RhcnQoKS4KKyAgICAgKi8KKyAgICB2b2lkIHBhdXNlKCk7CisKKyAgICBib29sIGlzUGxheWluZygpIGNvbnN0OworCisgICAgLyogUmV0dXJuIGN1cnJlbnQgc291cmNlIHNhbXBsZSByYXRlIGluIEh6LgorICAgICAqIElmIHNwZWNpZmllZCBhcyB6ZXJvIGluIGNvbnN0cnVjdG9yLCB0aGlzIHdpbGwgYmUgdGhlIHNpbmsgc2FtcGxlIHJhdGUuCisgICAgICovCisgICAgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpOworCisgICAgLyogUmV0dXJucyB0aGUgYnVmZmVyIGR1cmF0aW9uIGluIG1pY3Jvc2Vjb25kcyBhdCBjdXJyZW50IHBsYXliYWNrIHJhdGUuICovCisgICAgc3RhdHVzX3QgZ2V0QnVmZmVyRHVyYXRpb25JblVzKGludDY0X3QgKmR1cmF0aW9uKTsKKworICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCgpOworCisgICAgLyoKKyAgICAgKiBEdW1wcyB0aGUgc3RhdGUgb2YgYW4gYXVkaW8gdHJhY2suCisgICAgICogTm90IGEgZ2VuZXJhbC1wdXJwb3NlIEFQSTsgaW50ZW5kZWQgb25seSBmb3IgdXNlIGJ5IG1lZGlhIHBsYXllciBzZXJ2aWNlIHRvIGR1bXAgaXRzIHRyYWNrcy4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CisKKyAgICAvKiBSZXR1cm5zIHRoZSBJRCBvZiB0aGUgYXVkaW8gZGV2aWNlIGFjdHVhbGx5IHVzZWQgYnkgdGhlIG91dHB1dCB0byB3aGljaCB0aGlzIEF1ZGlvVHJhY2sgaXMKKyAgICAgKiBhdHRhY2hlZC4gV2hlbiB0aGUgQXVkaW9UcmFjayBpcyBpbmFjdGl2ZSwgaXQgd2lsbCByZXR1cm4gQVVESU9fUE9SVF9IQU5ETEVfTk9ORS4KKyAgICAgKi8KKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldFJvdXRlZERldmljZUlkKCk7CisKKyAgICAvKiBSZXR1cm5zIHRoZSBJRCBvZiB0aGUgYXVkaW8gc2Vzc2lvbiB0aGlzIEF1ZGlvVHJhY2sgYmVsb25ncyB0by4gKi8KKyAgICBhdWRpb19zZXNzaW9uX3QgZ2V0QXVkaW9TZXNzaW9uSWQoKTsKKworICAgIC8qIFNlbGVjdHMgdGhlIGF1ZGlvIGRldmljZSB0byB1c2UgZm9yIG91dHB1dCBvZiB0aGlzIEF1ZGlvVHJhY2suIEEgdmFsdWUgb2YKKyAgICAgKiBBVURJT19QT1JUX0hBTkRMRV9OT05FIGluZGljYXRlcyBkZWZhdWx0IHJvdXRpbmcuCisgICAgICoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqICBUaGUgZGV2aWNlIElEIG9mIHRoZSBzZWxlY3RlZCBkZXZpY2UgKGFzIHJldHVybmVkIGJ5IHRoZSBBdWRpb0RldmljZXNNYW5hZ2VyIEFQSSkuCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCB2YWx1ZToKKyAgICAgKiAgLSBOT19FUlJPUjogc3VjY2Vzc2Z1bCBvcGVyYXRpb24KKyAgICAgKiAgLSBCQURfVkFMVUU6IGZhaWxlZCB0byBmaW5kIHRoZSB2YWxpZCBvdXRwdXQgZGV2aWNlIHdpdGggZ2l2ZW4gZGV2aWNlIElkLgorICAgICAqLworICAgIHN0YXR1c190IHNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKKworICAgIC8vIFRPRE86IEFkZCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1Qgd2hlbiBpdCBpcyBwb3NzaWJsZSB0byBjaGVjay4KKyAgICAvLyBUT0RPOiBBZGQgQVVESU9fRkxBR19IV19BVl9TWU5DIHdoZW4gaXQgaXMgcG9zc2libGUgdG8gY2hlY2suCisgICAgLyogUmV0dXJucyB0aGUgZmxhZ3MgKi8KKyAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIG1GbGFnczsgfQorCisgICAgLyogT2J0YWluIHRoZSBwZW5kaW5nIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyBmb3IgcGxheWJhY2sgb2YgcHVyZSBQQ00gZGF0YSByZW1haW5pbmcgaW4KKyAgICAgKiBBdWRpb1RyYWNrLgorICAgICAqCisgICAgICogUmV0dXJucyBOT19FUlJPUiBpZiBzdWNjZXNzZnVsLgorICAgICAqICAgICAgICAgSU5WQUxJRF9PUEVSQVRJT04gaWYgdGhlIEF1ZGlvVHJhY2sgZG9lcyBub3QgY29udGFpbiBwdXJlIFBDTSBkYXRhLgorICAgICAqICAgICAgICAgQkFEX1ZBTFVFIGlmIG1zZWMgaXMgbnVsbHB0ci4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBwZW5kaW5nRHVyYXRpb24oaW50MzJfdCAqbXNlYyk7CisKKyAgICAvKiBBZGRzIGFuIEF1ZGlvRGV2aWNlQ2FsbGJhY2suIFRoZSBjYWxsZXIgd2lsbCBiZSBub3RpZmllZCB3aGVuIHRoZSBhdWRpbyBkZXZpY2UgdG8gd2hpY2ggdGhpcworICAgICAqIEF1ZGlvVHJhY2sgaXMgcm91dGVkIGlzIHVwZGF0ZWQuCisgICAgICogUmVwbGFjZXMgYW55IHByZXZpb3VzbHkgaW5zdGFsbGVkIGNhbGxiYWNrLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKgorICAgICAqIGNhbGxiYWNrOiBUaGUgY2FsbGJhY2sgaW50ZXJmYWNlCisgICAgICoKKyAgICAgKiBSZXR1cm5zIE5PX0VSUk9SIGlmIHN1Y2Nlc3NmdWwuCisgICAgICogICAgICAgICBJTlZBTElEX09QRVJBVElPTiBpZiB0aGUgc2FtZSBjYWxsYmFjayBpcyBhbHJlYWR5IGluc3RhbGxlZC4KKyAgICAgKiAgICAgICAgIE5PX0lOSVQgb3IgUFJFTUlTU0lPTl9ERU5JRUQgaWYgQXVkaW9GbGluZ2VyIHNlcnZpY2UgaXMgbm90IHJlYWNoYWJsZQorICAgICAqICAgICAgICAgQkFEX1ZBTFVFIGlmIHRoZSBjYWxsYmFjayBpcyBOVUxMCisgICAgICovCisgICAgc3RhdHVzX3QgYWRkQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKTsKKworICAgIC8qIFJlbW92ZXMgYW4gQXVkaW9EZXZpY2VDYWxsYmFjay4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICoKKyAgICAgKiBjYWxsYmFjazogVGhlIGNhbGxiYWNrIGludGVyZmFjZQorICAgICAqCisgICAgICogUmV0dXJucyBOT19FUlJPUiBpZiBzdWNjZXNzZnVsLgorICAgICAqICAgICAgICAgSU5WQUxJRF9PUEVSQVRJT04gaWYgdGhlIGNhbGxiYWNrIGlzIG5vdCBpbnN0YWxsZWQKKyAgICAgKiAgICAgICAgIEJBRF9WQUxVRSBpZiB0aGUgY2FsbGJhY2sgaXMgTlVMTAorICAgICAqLworICAgIHN0YXR1c190IHJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjayk7CisKK3ByaXZhdGU6CisgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbUZsYWdzOworCisgICAgamNsYXNzIG1BdWRpb1RyYWNrQ2xzOworICAgIGpvYmplY3QgbUF1ZGlvVHJhY2tPYmo7CisKKyAgICAvKiBDcmVhdGVzIGEgSmF2YSBWb2x1bWVTaGFwZXIuQ29uZmlndXJhdGlvbiBvYmplY3QgZnJvbSBWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24gKi8KKyAgICBqb2JqZWN0IGNyZWF0ZVZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb25PYmooCisgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlnKTsKKworICAgIC8qIENyZWF0ZXMgYSBKYXZhIFZvbHVtZVNoYXBlci5PcGVyYXRpb24gb2JqZWN0IGZyb20gVm9sdW1lU2hhcGVyOjpPcGVyYXRpb24gKi8KKyAgICBqb2JqZWN0IGNyZWF0ZVZvbHVtZVNoYXBlck9wZXJhdGlvbk9iaigKKyAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbik7CisKKyAgICAvKiBDcmVhdGVzIGEgSmF2YSBTdHJlYW1FdmVudENhbGxiYWNrIG9iamVjdCAqLworICAgIGpvYmplY3QgY3JlYXRlU3RyZWFtRXZlbnRDYWxsYmFjayhjYWxsYmFja190IGNiZiwgdm9pZCogdXNlcik7CisKKyAgICAvKiBDcmVhdGVzIGEgSmF2YSBFeGVjdXRvciBvYmplY3QgZm9yIHJ1bm5pbmcgYSBjYWxsYmFjayAqLworICAgIGpvYmplY3QgY3JlYXRlQ2FsbGJhY2tFeGVjdXRvcigpOworCisgICAgc3RhdHVzX3QgamF2YVRvTmF0aXZlU3RhdHVzKGludCBqYXZhU3RhdHVzKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0pBVURJT1RSQUNLX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkF1ZGlvT3V0cHV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ1YjhlNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5oCkBAIC0wLDAgKzEsMTkxIEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFQTEFZRVIyQVVESU9PVVRQVVRfSAorI2RlZmluZSBBTkRST0lEX01FRElBUExBWUVSMkFVRElPT1VUUFVUX0gKKworI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQXVkaW9UcmFjazsKKworY2xhc3MgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQgOiBwdWJsaWMgTWVkaWFQbGF5ZXIySW50ZXJmYWNlOjpBdWRpb1NpbmsKK3sKKyAgICBjbGFzcyBDYWxsYmFja0RhdGE7CisKK3B1YmxpYzoKKyAgICBNZWRpYVBsYXllcjJBdWRpb091dHB1dChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqIGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBkZXZpY2VDYWxsYmFjayk7CisgICAgdmlydHVhbCB+TWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQoKTsKKworICAgIHZpcnR1YWwgYm9vbCByZWFkeSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UcmFjayAhPSAwOworICAgIH0KKyAgICB2aXJ0dWFsIHNzaXplX3QgYnVmZmVyU2l6ZSgpIGNvbnN0OworICAgIHZpcnR1YWwgc3NpemVfdCBmcmFtZUNvdW50KCkgY29uc3Q7CisgICAgdmlydHVhbCBzc2l6ZV90IGNoYW5uZWxDb3VudCgpIGNvbnN0OworICAgIHZpcnR1YWwgc3NpemVfdCBmcmFtZVNpemUoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGxhdGVuY3koKSBjb25zdDsKKyAgICB2aXJ0dWFsIGZsb2F0IG1zZWNzUGVyRnJhbWUoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbikgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAgJnRzKSBjb25zdDsKKyAgICB2aXJ0dWFsIGludDY0X3QgZ2V0UGxheWVkT3V0RHVyYXRpb25VcyhpbnQ2NF90IG5vd1VzKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKmZyYW1lc3dyaXR0ZW4pIGNvbnN0OworICAgIHZpcnR1YWwgYXVkaW9fc2Vzc2lvbl90IGdldFNlc3Npb25JZCgpIGNvbnN0OworICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0OworICAgIHZpcnR1YWwgaW50NjRfdCBnZXRCdWZmZXJEdXJhdGlvbkluVXMoKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbigKKyAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludCBjaGFubmVsQ291bnQsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgYnVmZmVyQ291bnQsCisgICAgICAgICAgICBBdWRpb0NhbGxiYWNrIGNiLCB2b2lkICpjb29raWUsCisgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMLAorICAgICAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCA9IGZhbHNlLAorICAgICAgICAgICAgdWludDMyX3Qgc3VnZ2VzdGVkRnJhbWVDb3VudCA9IDApOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgc3NpemVfdCB3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGJsb2NraW5nID0gdHJ1ZSk7CisgICAgdmlydHVhbCB2b2lkIHN0b3AoKTsKKyAgICB2aXJ0dWFsIHZvaWQgZmx1c2goKTsKKyAgICB2aXJ0dWFsIHZvaWQgcGF1c2UoKTsKKyAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKTsKKyAgICB2b2lkIHNldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpOworICAgIHZpcnR1YWwgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRBdWRpb1N0cmVhbVR5cGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU3RyZWFtVHlwZTsKKyAgICB9CisgICAgdm9pZCBzZXRBdWRpb0F0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICogYXR0cmlidXRlcyk7CisKKyAgICB2b2lkIHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUmIHJhdGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGxheWJhY2tSYXRlKEF1ZGlvUGxheWJhY2tSYXRlKiByYXRlIC8qIG5vbm51bGwgKi8pOworCisgICAgc3RhdHVzX3Qgc2V0QXV4RWZmZWN0U2VuZExldmVsKGZsb2F0IGxldmVsKTsKKyAgICBzdGF0dXNfdCBhdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdDsKKworICAgIHN0YXRpYyBib29sIGlzT25FbXVsYXRvcigpOworICAgIHN0YXRpYyBpbnQgZ2V0TWluQnVmZmVyQ291bnQoKTsKKyAgICB2aXJ0dWFsIGJvb2wgbmVlZHNUcmFpbGluZ1BhZGRpbmcoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAvLyBUT0RPOiByZXR1cm4gY29ycmVjdCB2YWx1ZS4KKyAgICAgICAgLy9yZXR1cm4gbU5leHRPdXRwdXQgPT0gTlVMTDsKKyAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOworICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpOworCisgICAgLy8gQXVkaW9Sb3V0aW5nCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCk7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIHZvaWQgc2V0TWluQnVmZmVyQ291bnQoKTsKKyAgICBzdGF0aWMgdm9pZCBDYWxsYmFja1dyYXBwZXIoaW50IGV2ZW50LCB2b2lkICptZSwgdm9pZCAqaW5mbyk7CisgICAgdm9pZCBkZWxldGVSZWN5Y2xlZFRyYWNrX2woKTsKKyAgICB2b2lkIGNsb3NlX2woKTsKKyAgICBzdGF0dXNfdCB1cGRhdGVUcmFja19sKCk7CisKKyAgICBzcDxBdWRpb1RyYWNrPiAgICAgICAgICBtVHJhY2s7CisgICAgQXVkaW9DYWxsYmFjayAgICAgICAgICAgbUNhbGxiYWNrOworICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0Nvb2tpZTsKKyAgICBDYWxsYmFja0RhdGEgKiAgICAgICAgICBtQ2FsbGJhY2tEYXRhOworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgICAgIG1TdHJlYW1UeXBlOworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAqICAgIG1BdHRyaWJ1dGVzOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1MZWZ0Vm9sdW1lOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1SaWdodFZvbHVtZTsKKyAgICBBdWRpb1BsYXliYWNrUmF0ZSAgICAgICBtUGxheWJhY2tSYXRlOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlSHo7IC8vIHNhbXBsZSByYXRlIG9mIHRoZSBjb250ZW50LCBhcyBzZXQgaW4gb3BlbigpCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbU1zZWNzUGVyRnJhbWU7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZTsKKyAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICBtU2Vzc2lvbklkOworICAgIHVpZF90ICAgICAgICAgICAgICAgICAgIG1VaWQ7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbVBpZDsKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtU2VuZExldmVsOworICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1BdXhFZmZlY3RJZDsKKyAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAgICBtRmxhZ3M7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbVNlbGVjdGVkRGV2aWNlSWQ7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbVJvdXRlZERldmljZUlkOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VDYWxsYmFja0VuYWJsZWQ7CisgICAgd3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+ICAgICAgICBtRGV2aWNlQ2FsbGJhY2s7CisgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgbUxvY2s7CisKKyAgICAvLyBzdGF0aWMgdmFyaWFibGVzIGJlbG93IG5vdCBwcm90ZWN0ZWQgYnkgbXV0ZXgKKyAgICBzdGF0aWMgYm9vbCAgICAgICAgICAgICBtSXNPbkVtdWxhdG9yOworICAgIHN0YXRpYyBpbnQgICAgICAgICAgICAgIG1NaW5CdWZmZXJDb3VudDsgIC8vIDEyIGZvciBlbXVsYXRvcjsgb3RoZXJ3aXNlIDQKKworICAgIC8vIENhbGxiYWNrRGF0YSBpcyB3aGF0IGlzIHBhc3NlZCB0byB0aGUgQXVkaW9UcmFjayBhcyB0aGUgInVzZXIiIGRhdGEuCisgICAgLy8gV2UgbmVlZCB0byBiZSBhYmxlIHRvIHRhcmdldCB0aGlzIHRvIGEgZGlmZmVyZW50IE91dHB1dCBvbiB0aGUgZmx5LAorICAgIC8vIHNvIHdlIGNhbid0IHVzZSB0aGUgT3V0cHV0IGl0c2VsZiBmb3IgdGhpcy4KKyAgICBjbGFzcyBDYWxsYmFja0RhdGEgeworICAgICAgICBmcmllbmQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBDYWxsYmFja0RhdGEoTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQgKmNvb2tpZSkgeworICAgICAgICAgICAgbURhdGEgPSBjb29raWU7CisgICAgICAgICAgICBtU3dpdGNoaW5nID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQgKmdldE91dHB1dCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtRGF0YTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHNldE91dHB1dChNZWRpYVBsYXllcjJBdWRpb091dHB1dCogbmV3Y29va2llKSB7CisgICAgICAgICAgICBtRGF0YSA9IG5ld2Nvb2tpZTsKKyAgICAgICAgfQorICAgICAgICAvLyBsb2NrL3VubG9jayBhcmUgdXNlZCBieSB0aGUgY2FsbGJhY2sgYmVmb3JlIGFjY2Vzc2luZyB0aGUgcGF5bG9hZCBvZiB0aGlzIG9iamVjdAorICAgICAgICB2b2lkIGxvY2soKSBjb25zdCB7CisgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCB1bmxvY2soKSBjb25zdCB7CisgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRyeUJlZ2luVHJhY2tTd2l0Y2gvZW5kVHJhY2tTd2l0Y2ggYXJlIHVzZWQgd2hlbiB0aGUgQ2FsbGJhY2tEYXRhIGlzIGhhbmRlZCBvdmVyCisgICAgICAgIC8vIHRvIHRoZSBuZXh0IHNpbmsuCisKKyAgICAgICAgLy8gdHJ5QmVnaW5UcmFja1N3aXRjaCgpIHJldHVybnMgdHJ1ZSBvbmx5IGlmIGl0IG9idGFpbnMgdGhlIGxvY2suCisgICAgICAgIGJvb2wgdHJ5QmVnaW5UcmFja1N3aXRjaCgpIHsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVN3aXRjaGluZywgInRyeUJlZ2luVHJhY2tTd2l0Y2goKSBhbHJlYWR5IGNhbGxlZCIpOworICAgICAgICAgICAgaWYgKG1Mb2NrLnRyeUxvY2soKSAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Td2l0Y2hpbmcgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBlbmRUcmFja1N3aXRjaCgpIHsKKyAgICAgICAgICAgIGlmIChtU3dpdGNoaW5nKSB7CisgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3dpdGNoaW5nID0gZmFsc2U7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0ICptRGF0YTsKKyAgICAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsgLy8gYSByZWN1cnNpdmUgbXV0ZXggbWlnaHQgbWFrZSB0aGlzIHVubmVjZXNzYXJ5LgorICAgICAgICBib29sIG1Td2l0Y2hpbmc7CisgICAgICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENhbGxiYWNrRGF0YSk7CisgICAgfTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX01FRElBUExBWUVSMkFVRElPT1VUUFVUX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmJmODkxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkludGVyZmFjZS5oCkBAIC0wLDAgKzEsMjgwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFQTEFZRVIySU5URVJGQUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQVBMQVlFUjJJTlRFUkZBQ0VfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9BVlN5bmNTZXR0aW5ncy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1RpbWVzdGFtcC5oPgorI2luY2x1ZGUgPG1lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmg+CisjaW5jbHVkZSA8bWVkaWEvTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMlR5cGVzLmg+CisKKy8vIEZ3ZCBkZWNsIHRvIG1ha2Ugc3VyZSBldmVyeW9uZSBhZ3JlZXMgdGhhdCB0aGUgc2NvcGUgb2Ygc3RydWN0IHNvY2thZGRyX2luIGlzCisvLyBnbG9iYWwsIGFuZCBub3QgaW4gYW5kcm9pZDo6CitzdHJ1Y3Qgc29ja2FkZHJfaW47CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IERhdGFTb3VyY2VEZXNjOworY2xhc3MgUGFyY2VsOworc3RydWN0IEFOYXRpdmVXaW5kb3dXcmFwcGVyOworCisjZGVmaW5lIERFRkFVTFRfQVVESU9TSU5LX0JVRkZFUkNPVU5UIDQKKyNkZWZpbmUgREVGQVVMVF9BVURJT1NJTktfQlVGRkVSU0laRSAxMjAwCisjZGVmaW5lIERFRkFVTFRfQVVESU9TSU5LX1NBTVBMRVJBVEUgNDQxMDAKKworLy8gd2hlbiB0aGUgY2hhbm5lbCBtYXNrIGlzbid0IGtub3duLCB1c2UgdGhlIGNoYW5uZWwgY291bnQgdG8gZGVyaXZlIGEgbWFzayBpbiBBdWRpb1Npbms6Om9wZW4oKQorI2RlZmluZSBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVIgMAorCisvLyBkdXJhdGlvbiBiZWxvdyB3aGljaCB3ZSBkbyBub3QgYWxsb3cgZGVlcCBhdWRpbyBidWZmZXJpbmcKKyNkZWZpbmUgQVVESU9fU0lOS19NSU5fREVFUF9CVUZGRVJfRFVSQVRJT05fVVMgNTAwMDAwMAorCitjbGFzcyBNZWRpYVBsYXllcjJJbnRlcmZhY2VMaXN0ZW5lcjogcHVibGljIFJlZkJhc2UKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopID0gMDsKK307CisKK2NsYXNzIE1lZGlhUGxheWVyMkludGVyZmFjZSA6IHB1YmxpYyBBSGFuZGxlciB7CitwdWJsaWM6CisgICAgLy8gQXVkaW9TaW5rOiBhYnN0cmFjdGlvbiBsYXllciBmb3IgYXVkaW8gb3V0cHV0CisgICAgY2xhc3MgQXVkaW9TaW5rIDogcHVibGljIFJlZkJhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgZW51bSBjYl9ldmVudF90IHsKKyAgICAgICAgICAgIENCX0VWRU5UX0ZJTExfQlVGRkVSLCAgIC8vIFJlcXVlc3QgdG8gd3JpdGUgbW9yZSBkYXRhIHRvIGJ1ZmZlci4KKyAgICAgICAgICAgIENCX0VWRU5UX1NUUkVBTV9FTkQsICAgIC8vIFNlbnQgYWZ0ZXIgYWxsIHRoZSBidWZmZXJzIHF1ZXVlZCBpbiBBRiBhbmQgSFcgYXJlIHBsYXllZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFjayAoYWZ0ZXIgc3RvcCBpcyBjYWxsZWQpCisgICAgICAgICAgICBDQl9FVkVOVF9URUFSX0RPV04gICAgICAvLyBUaGUgQXVkaW9UcmFjayB3YXMgaW52YWxpZGF0ZWQgZHVlIHRvIHVzZSBjYXNlIGNoYW5nZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gcmUtZXZhbHVhdGUgb2ZmbG9hZGluZyBvcHRpb25zCisgICAgICAgIH07CisKKyAgICAgICAgLy8gQ2FsbGJhY2sgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4gdG8gdGhlIGJ1ZmZlci4KKyAgICAgICAgdHlwZWRlZiBzaXplX3QgKCpBdWRpb0NhbGxiYWNrKSgKKyAgICAgICAgICAgICAgICBBdWRpb1NpbmsgKmF1ZGlvU2luaywgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgdm9pZCAqY29va2llLCBjYl9ldmVudF90IGV2ZW50KTsKKworICAgICAgICB2aXJ0dWFsIH5BdWRpb1NpbmsoKSB7fQorICAgICAgICB2aXJ0dWFsIGJvb2wgcmVhZHkoKSBjb25zdCA9IDA7IC8vIGF1ZGlvIG91dHB1dCBpcyBvcGVuIGFuZCByZWFkeQorICAgICAgICB2aXJ0dWFsIHNzaXplX3QgYnVmZmVyU2l6ZSgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBzc2l6ZV90IGZyYW1lQ291bnQoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3NpemVfdCBjaGFubmVsQ291bnQoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3NpemVfdCBmcmFtZVNpemUoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgbGF0ZW5jeSgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBmbG9hdCBtc2Vjc1BlckZyYW1lKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbikgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCAmdHMpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBpbnQ2NF90IGdldFBsYXllZE91dER1cmF0aW9uVXMoaW50NjRfdCBub3dVcykgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKmZyYW1lc3dyaXR0ZW4pIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBhdWRpb19zZXNzaW9uX3QgZ2V0U2Vzc2lvbklkKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0QXVkaW9TdHJlYW1UeXBlKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgaW50NjRfdCBnZXRCdWZmZXJEdXJhdGlvbkluVXMoKSBjb25zdCA9IDA7CisKKyAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgaXMgc3BlY2lmaWVkLCB1c2UgdGhlICJ3cml0ZSIgQVBJIGJlbG93IHRvIHN1Ym1pdAorICAgICAgICAvLyBhdWRpbyBkYXRhLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW4oCisgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGNoYW5uZWxDb3VudCwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0PUFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAorICAgICAgICAgICAgICAgIGludCBidWZmZXJDb3VudD1ERUZBVUxUX0FVRElPU0lOS19CVUZGRVJDT1VOVCwKKyAgICAgICAgICAgICAgICBBdWRpb0NhbGxiYWNrIGNiID0gTlVMTCwKKyAgICAgICAgICAgICAgICB2b2lkICpjb29raWUgPSBOVUxMLAorICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMLAorICAgICAgICAgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzdWdnZXN0ZWRGcmFtZUNvdW50ID0gMCkgPSAwOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CisKKyAgICAgICAgLyogSW5wdXQgcGFyYW1ldGVyIHxzaXplfCBpcyBpbiBieXRlIHVuaXRzIHN0b3JlZCBpbiB8YnVmZmVyfC4KKyAgICAgICAgICogRGF0YSBpcyBjb3BpZWQgb3ZlciBhbmQgYWN0dWFsIG51bWJlciBvZiBieXRlcyB3cml0dGVuICg+PSAwKQorICAgICAgICAgKiBpcyByZXR1cm5lZCwgb3Igbm8gZGF0YSBpcyBjb3BpZWQgYW5kIGEgbmVnYXRpdmUgc3RhdHVzIGNvZGUKKyAgICAgICAgICogaXMgcmV0dXJuZWQgKGV2ZW4gd2hlbiB8YmxvY2tpbmd8IGlzIHRydWUpLgorICAgICAgICAgKiBXaGVuIHxibG9ja2luZ3wgaXMgZmFsc2UsIEF1ZGlvU2luayB3aWxsIGltbWVkaWF0ZWx5IHJldHVybiBhZnRlcgorICAgICAgICAgKiBwYXJ0IG9mIG9yIGZ1bGwgfGJ1ZmZlcnwgaXMgY29waWVkIG92ZXIuCisgICAgICAgICAqIFdoZW4gfGJsb2NraW5nfCBpcyB0cnVlLCBBdWRpb1Npbmsgd2lsbCB3YWl0IHRvIGNvcHkgdGhlIGVudGlyZQorICAgICAgICAgKiBidWZmZXIsIHVubGVzcyBhbiBlcnJvciBvY2N1cnMgb3IgdGhlIGNvcHkgb3BlcmF0aW9uIGlzCisgICAgICAgICAqIHByZW1hdHVyZWx5IHN0b3BwZWQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHNzaXplX3Qgd3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBibG9ja2luZyA9IHRydWUpID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgc3RvcCgpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIGZsdXNoKCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgcGF1c2UoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpID0gMDsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSYgcmF0ZSkgPSAwOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBsYXliYWNrUmF0ZShBdWRpb1BsYXliYWNrUmF0ZSogcmF0ZSAvKiBub25udWxsICovKSA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCBuZWVkc1RyYWlsaW5nUGFkZGluZygpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIC8qIGtleVZhbHVlUGFpcnMgKi8pIHsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIFN0cmluZzggZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiAvKiBrZXlzICovKSB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nODo6ZW1wdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEF1ZGlvUm91dGluZworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpOworICAgIH07CisKKyAgICBNZWRpYVBsYXllcjJJbnRlcmZhY2UoKSA6IG1MaXN0ZW5lcihOVUxMKSB7IH0KKyAgICB2aXJ0dWFsIH5NZWRpYVBsYXllcjJJbnRlcmZhY2UoKSB7IH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRBdWRpb1NpbmsoY29uc3Qgc3A8QXVkaW9TaW5rPiYgYXVkaW9TaW5rKSB7CisgICAgICAgIG1BdWRpb1NpbmsgPSBhdWRpb1Npbms7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2VEZXNjPiAmZHNkKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVOZXh0RGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlRGVzYz4gJmRzZCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBwbGF5TmV4dERhdGFTb3VyY2UoaW50NjRfdCBzcmNJZCkgPSAwOworCisgICAgLy8gcGFzcyB0aGUgYnVmZmVyZWQgbmF0aXZlIHdpbmRvdyB0byB0aGUgbWVkaWEgcGxheWVyIHNlcnZpY2UKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU3VyZmFjZVRleHR1cmUoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+JiBud3cpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyaW5nU2V0dGluZ3MoQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSB7CisgICAgICAgICpidWZmZXJpbmcgPSBCdWZmZXJpbmdTZXR0aW5ncygpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIC8qIGJ1ZmZlcmluZyAqLykgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlQXN5bmMoKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNQbGF5aW5nKCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSYgcmF0ZSkgeworICAgICAgICAvLyBieSBkZWZhdWx0LCBwbGF5ZXJzIG9ubHkgc3VwcG9ydCBzZXR0aW5nIHJhdGUgdG8gdGhlIGRlZmF1bHQKKyAgICAgICAgaWYgKCFpc0F1ZGlvUGxheWJhY2tSYXRlRXF1YWwocmF0ZSwgQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUKSkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSogcmF0ZSAvKiBub25udWxsICovKSB7CisgICAgICAgICpyYXRlID0gQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzJiBzeW5jLCBmbG9hdCAvKiB2aWRlb0ZwcyAqLykgeworICAgICAgICAvLyBCeSBkZWZhdWx0LCBwbGF5ZXJzIG9ubHkgc3VwcG9ydCBzZXR0aW5nIHN5bmMgc291cmNlIHRvIGRlZmF1bHQ7IGFsbCBvdGhlciBzeW5jCisgICAgICAgIC8vIHNldHRpbmdzIGFyZSBpZ25vcmVkLiBUaGVyZSBpcyBubyByZXF1aXJlbWVudCBmb3IgZ2V0dGVycyB0byByZXR1cm4gc2V0IHZhbHVlcy4KKyAgICAgICAgaWYgKHN5bmMubVNvdXJjZSAhPSBBVlNZTkNfU09VUkNFX0RFRkFVTFQpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN5bmNTZXR0aW5ncygKKyAgICAgICAgICAgIEFWU3luY1NldHRpbmdzKiBzeW5jIC8qIG5vbm51bGwgKi8sIGZsb2F0KiB2aWRlb0ZwcyAvKiBub25udWxsICovKSB7CisgICAgICAgICpzeW5jID0gQVZTeW5jU2V0dGluZ3MoKTsKKyAgICAgICAgKnZpZGVvRnBzID0gLTEuZjsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlZWtUbygKKyAgICAgICAgICAgIGludDY0X3QgbXNlYywgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEN1cnJlbnRQb3NpdGlvbihpbnQ2NF90ICptc2VjKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREdXJhdGlvbihpbnQ2NF90ICptc2VjKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZXNldCgpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IG5vdGlmeUF0KGludDY0X3QgLyogbWVkaWFUaW1lVXMgKi8pIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldExvb3BpbmcoaW50IGxvb3ApID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KSA9IDA7CisKKyAgICAvLyBJbnZva2UgYSBnZW5lcmljIG1ldGhvZCBvbiB0aGUgcGxheWVyIGJ5IHVzaW5nIG9wYXF1ZSBwYXJjZWxzCisgICAgLy8gZm9yIHRoZSByZXF1ZXN0IGFuZCByZXBseS4KKyAgICAvLworICAgIC8vIEBwYXJhbSByZXF1ZXN0IFBhcmNlbCB0aGF0IGlzIHBvc2l0aW9uZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZQorICAgIC8vICAgICAgICAgICAgICAgIGRhdGEgc2VudCBieSB0aGUgamF2YSBsYXllci4KKyAgICAvLyBAcGFyYW1bb3V0XSByZXBseSBQYXJjZWwgdG8gaG9sZCB0aGUgcmVwbHkgZGF0YS4gQ2Fubm90IGJlIG51bGwuCisgICAgLy8gQHJldHVybiBPSyBpZiB0aGUgY2FsbCB3YXMgc3VjY2Vzc2Z1bC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGludm9rZShjb25zdCBQYXJjZWwmIHJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpID0gMDsKKworICAgIC8vIFRoZSBDbGllbnQgaW4gdGhlIE1ldGFkYXRhUGxheWVyU2VydmljZSBjYWxscyB0aGlzIG1ldGhvZCBvbgorICAgIC8vIHRoZSBuYXRpdmUgcGxheWVyIHRvIHJldHJpZXZlIGFsbCBvciBhIHN1YnNldCBvZiBtZXRhZGF0YS4KKyAgICAvLworICAgIC8vIEBwYXJhbSBpZHMgU29ydGVkTGlzdCBvZiBtZXRhZGF0YSBJRCB0byBiZSBmZXRjaC4gSWYgZW1wdHksIGFsbAorICAgIC8vICAgICAgICAgICAgdGhlIGtub3duIG1ldGFkYXRhIHNob3VsZCBiZSByZXR1cm5lZC4KKyAgICAvLyBAcGFyYW1baW5vdXRdIHJlY29yZHMgUGFyY2VsIHdoZXJlIHRoZSBwbGF5ZXIgYXBwZW5kcyBpdHMgbWV0YWRhdGEuCisgICAgLy8gQHJldHVybiBPSyBpZiB0aGUgY2FsbCB3YXMgc3VjY2Vzc2Z1bC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFkYXRhKGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiAvKiBpZHMgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIC8qIHJlY29yZHMgKi8pIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH07CisKKyAgICB2b2lkIHNldExpc3RlbmVyKGNvbnN0IHNwPE1lZGlhUGxheWVyMkludGVyZmFjZUxpc3RlbmVyPiAmbGlzdGVuZXIpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1MaXN0ZW5lckxvY2spOworICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICB2b2lkIHNlbmRFdmVudChpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MT0wLCBpbnQgZXh0Mj0wLCBjb25zdCBQYXJjZWwgKm9iaj1OVUxMKSB7CisgICAgICAgIHNwPE1lZGlhUGxheWVyMkludGVyZmFjZUxpc3RlbmVyPiBsaXN0ZW5lcjsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1MaXN0ZW5lckxvY2spOworICAgICAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXI7CisgICAgICAgIH0KKworICAgICAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5ub3RpZnkoc3JjSWQsIG1zZywgZXh0MSwgZXh0Miwgb2JqKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgLyogZmQgKi8sIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIC8qIGFyZ3MgKi8pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJiAvKiBtc2cgKi8pIG92ZXJyaWRlIHsgfQorCisgICAgLy8gTW9kdWxhciBEUk0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVEcm0oY29uc3QgdWludDhfdCAvKiB1dWlkICovWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiAvKiBkcm1TZXNzaW9uSWQgKi8pIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VEcm0oKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBzcDxBdWRpb1Npbms+IG1BdWRpb1Npbms7CisKK3ByaXZhdGU6CisgICAgTXV0ZXggbUxpc3RlbmVyTG9jazsKKyAgICBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2VMaXN0ZW5lcj4gbUxpc3RlbmVyOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKworI2VuZGlmIC8vIEFORFJPSURfTUVESUFQTEFZRVIySU5URVJGQUNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJUeXBlcy5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMlR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkwNWI1NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJUeXBlcy5oCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFQTEFZRVIyX1RZUEVTX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQVBMQVlFUjJfVFlQRVNfSAorCisjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXJfY29tbW9uLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3R5cGVkZWYgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBNZWRpYVBsYXllcjJTZWVrTW9kZTsKKworZW51bSBtZWRpYTJfZXZlbnRfdHlwZSB7CisgICAgTUVESUEyX05PUCAgICAgICAgICAgICAgID0gMCwgLy8gaW50ZXJmYWNlIHRlc3QgbWVzc2FnZQorICAgIE1FRElBMl9QUkVQQVJFRCAgICAgICAgICA9IDEsCisgICAgTUVESUEyX1BMQVlCQUNLX0NPTVBMRVRFID0gMiwKKyAgICBNRURJQTJfQlVGRkVSSU5HX1VQREFURSAgPSAzLAorICAgIE1FRElBMl9TRUVLX0NPTVBMRVRFICAgICA9IDQsCisgICAgTUVESUEyX1NFVF9WSURFT19TSVpFICAgID0gNSwKKyAgICBNRURJQTJfU1RBUlRFRCAgICAgICAgICAgPSA2LAorICAgIE1FRElBMl9QQVVTRUQgICAgICAgICAgICA9IDcsCisgICAgTUVESUEyX1NUT1BQRUQgICAgICAgICAgID0gOCwKKyAgICBNRURJQTJfU0tJUFBFRCAgICAgICAgICAgPSA5LAorICAgIE1FRElBMl9OT1RJRllfVElNRSAgICAgICA9IDk4LAorICAgIE1FRElBMl9USU1FRF9URVhUICAgICAgICA9IDk5LAorICAgIE1FRElBMl9FUlJPUiAgICAgICAgICAgICA9IDEwMCwKKyAgICBNRURJQTJfSU5GTyAgICAgICAgICAgICAgPSAyMDAsCisgICAgTUVESUEyX1NVQlRJVExFX0RBVEEgICAgID0gMjAxLAorICAgIE1FRElBMl9NRVRBX0RBVEEgICAgICAgICA9IDIwMiwKKyAgICBNRURJQTJfRFJNX0lORk8gICAgICAgICAgPSAyMTAsCisgICAgTUVESUEyX0FVRElPX1JPVVRJTkdfQ0hBTkdFRCA9IDEwMDAwLAorfTsKKworLy8gR2VuZXJpYyBlcnJvciBjb2RlcyBmb3IgdGhlIG1lZGlhIHBsYXllciBmcmFtZXdvcmsuICBFcnJvcnMgYXJlIGZhdGFsLCB0aGUKKy8vIHBsYXliYWNrIG11c3QgYWJvcnQuCisvLworLy8gRXJyb3JzIGFyZSBjb21tdW5pY2F0ZWQgYmFjayB0byB0aGUgY2xpZW50IHVzaW5nIHRoZQorLy8gTWVkaWFQbGF5ZXIyTGlzdGVuZXI6Om5vdGlmeSBtZXRob2QgZGVmaW5lZCBiZWxvdy4KKy8vIEluIHRoaXMgc2l0dWF0aW9uLCAnbm90aWZ5JyBpcyBpbnZva2VkIHdpdGggdGhlIGZvbGxvd2luZzoKKy8vICAgJ21zZycgaXMgc2V0IHRvIE1FRElBX0VSUk9SLgorLy8gICAnZXh0MScgc2hvdWxkIGJlIGEgdmFsdWUgZnJvbSB0aGUgZW51bSBtZWRpYTJfZXJyb3JfdHlwZS4KKy8vICAgJ2V4dDInIGNvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIGRlcGVuZGFudCBlcnJvciBjb2RlIHRvIHByb3ZpZGUKKy8vICAgICAgICAgIG1vcmUgZGV0YWlscy4gU2hvdWxkIGRlZmF1bHQgdG8gMCB3aGVuIG5vdCB1c2VkLgorLy8KKy8vIFRoZSBjb2RlcyBhcmUgZGlzdHJpYnV0ZWQgYXMgZm9sbG93OgorLy8gICAweHg6IFJlc2VydmVkCisvLyAgIDF4eDogQW5kcm9pZCBQbGF5ZXIgZXJyb3JzLiBTb21ldGhpbmcgd2VudCB3cm9uZyBpbnNpZGUgdGhlIE1lZGlhUGxheWVyMi4KKy8vICAgMnh4OiBNZWRpYSBlcnJvcnMgKGUuZyBDb2RlYyBub3Qgc3VwcG9ydGVkKS4gVGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhlCisvLyAgICAgICAgbWVkaWEgaXRzZWxmLgorLy8gICAzeHg6IFJ1bnRpbWUgZXJyb3JzLiBTb21lIGV4dHJhb3JkaW5hcnkgY29uZGl0aW9uIGFyb3NlIG1ha2luZyB0aGUgcGxheWJhY2sKKy8vICAgICAgICBpbXBvc3NpYmxlLgorLy8KK2VudW0gbWVkaWEyX2Vycm9yX3R5cGUgeworICAgIC8vIDB4eAorICAgIE1FRElBMl9FUlJPUl9VTktOT1dOID0gMSwKKyAgICAvLyAxeHgKKyAgICAvLyBNRURJQTJfRVJST1JfU0VSVkVSX0RJRUQgPSAxMDAsCisgICAgLy8gMnh4CisgICAgTUVESUEyX0VSUk9SX05PVF9WQUxJRF9GT1JfUFJPR1JFU1NJVkVfUExBWUJBQ0sgPSAyMDAsCisgICAgLy8gM3h4CisgICAgTUVESUEyX0VSUk9SX0ZBSUxFRF9UT19TRVRfREFUQV9TT1VSQ0UgPSAzMDAsCit9OworCisKKy8vIEluZm8gYW5kIHdhcm5pbmcgY29kZXMgZm9yIHRoZSBtZWRpYSBwbGF5ZXIgZnJhbWV3b3JrLiAgVGhlc2UgYXJlIG5vbiBmYXRhbCwKKy8vIHRoZSBwbGF5YmFjayBpcyBnb2luZyBvbiBidXQgdGhlcmUgbWlnaHQgYmUgc29tZSB1c2VyIHZpc2libGUgaXNzdWVzLgorLy8KKy8vIEluZm8gYW5kIHdhcm5pbmcgbWVzc2FnZXMgYXJlIGNvbW11bmljYXRlZCBiYWNrIHRvIHRoZSBjbGllbnQgdXNpbmcgdGhlCisvLyBNZWRpYVBsYXllcjJMaXN0ZW5lcjo6bm90aWZ5IG1ldGhvZCBkZWZpbmVkIGJlbG93LiAgSW4gdGhpcyBzaXR1YXRpb24sCisvLyAnbm90aWZ5JyBpcyBpbnZva2VkIHdpdGggdGhlIGZvbGxvd2luZzoKKy8vICAgJ21zZycgaXMgc2V0IHRvIE1FRElBX0lORk8uCisvLyAgICdleHQxJyBzaG91bGQgYmUgYSB2YWx1ZSBmcm9tIHRoZSBlbnVtIG1lZGlhMl9pbmZvX3R5cGUuCisvLyAgICdleHQyJyBjb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBkZXBlbmRhbnQgaW5mbyBjb2RlIHRvIHByb3ZpZGUKKy8vICAgICAgICAgIG1vcmUgZGV0YWlscy4gU2hvdWxkIGRlZmF1bHQgdG8gMCB3aGVuIG5vdCB1c2VkLgorLy8KKy8vIFRoZSBjb2RlcyBhcmUgZGlzdHJpYnV0ZWQgYXMgZm9sbG93OgorLy8gICAweHg6IFJlc2VydmVkCisvLyAgIDd4eDogQW5kcm9pZCBQbGF5ZXIgaW5mby93YXJuaW5nIChlLmcgcGxheWVyIGxhZ2dpbmcgYmVoaW5kLikKKy8vICAgOHh4OiBNZWRpYSBpbmZvL3dhcm5pbmcgKGUuZyBtZWRpYSBiYWRseSBpbnRlcmxlYXZlZC4pCisvLworZW51bSBtZWRpYTJfaW5mb190eXBlIHsKKyAgICAvLyAweHgKKyAgICBNRURJQTJfSU5GT19VTktOT1dOID0gMSwKKyAgICAvLyBUaGUgcGxheWVyIHdhcyBzdGFydGVkIGJlY2F1c2UgaXQgd2FzIHVzZWQgYXMgdGhlIG5leHQgcGxheWVyIGZvciBhbm90aGVyCisgICAgLy8gcGxheWVyLCB3aGljaCBqdXN0IGNvbXBsZXRlZCBwbGF5YmFjaworICAgIE1FRElBMl9JTkZPX1NUQVJURURfQVNfTkVYVCA9IDIsCisgICAgLy8gVGhlIHBsYXllciBqdXN0IHB1c2hlZCB0aGUgdmVyeSBmaXJzdCB2aWRlbyBmcmFtZSBmb3IgcmVuZGVyaW5nCisgICAgTUVESUEyX0lORk9fVklERU9fUkVOREVSSU5HX1NUQVJUID0gMywKKyAgICAvLyBUaGUgcGxheWVyIGp1c3QgcHVzaGVkIHRoZSB2ZXJ5IGZpcnN0IGF1ZGlvIGZyYW1lIGZvciByZW5kZXJpbmcKKyAgICBNRURJQTJfSU5GT19BVURJT19SRU5ERVJJTkdfU1RBUlQgPSA0LAorICAgIC8vIFRoZSBwbGF5ZXIganVzdCBjb21wbGV0ZWQgdGhlIHBsYXliYWNrIG9mIHRoaXMgZGF0YSBzb3VyY2UKKyAgICBNRURJQTJfSU5GT19QTEFZQkFDS19DT01QTEVURSA9IDUsCisgICAgLy8gVGhlIHBsYXllciBqdXN0IGNvbXBsZXRlZCB0aGUgcGxheWJhY2sgb2YgdGhlIGZ1bGwgcGxheSBsaXN0CisgICAgTUVESUEyX0lORk9fUExBWUxJU1RfRU5EID0gNiwKKworICAgIC8vMXh4CisgICAgLy8gVGhlIHBsYXllciBqdXN0IHByZXBhcmVkIGEgZGF0YSBzb3VyY2UuCisgICAgTUVESUEyX0lORk9fUFJFUEFSRUQgPSAxMDAsCisgICAgLy8gVGhlIHBsYXllciBqdXN0IGNvbXBsZXRlZCBhIGNhbGwgcGxheSgpLgorICAgIE1FRElBMl9JTkZPX0NPTVBMRVRFX0NBTExfUExBWSA9IDEwMSwKKyAgICAvLyBUaGUgcGxheWVyIGp1c3QgY29tcGxldGVkIGEgY2FsbCBwYXVzZSgpLgorICAgIE1FRElBMl9JTkZPX0NPTVBMRVRFX0NBTExfUEFVU0UgPSAxMDIsCisgICAgLy8gVGhlIHBsYXllciBqdXN0IGNvbXBsZXRlZCBhIGNhbGwgc2Vla1RvLgorICAgIE1FRElBMl9JTkZPX0NPTVBMRVRFX0NBTExfU0VFSyA9IDEwMywKKworICAgIC8vIDd4eAorICAgIC8vIFRoZSB2aWRlbyBpcyB0b28gY29tcGxleCBmb3IgdGhlIGRlY29kZXI6IGl0IGNhbid0IGRlY29kZSBmcmFtZXMgZmFzdAorICAgIC8vIGVub3VnaC4gUG9zc2libHkgb25seSB0aGUgYXVkaW8gcGxheXMgZmluZSBhdCB0aGlzIHN0YWdlLgorICAgIE1FRElBMl9JTkZPX1ZJREVPX1RSQUNLX0xBR0dJTkcgPSA3MDAsCisgICAgLy8gTWVkaWFQbGF5ZXIyIGlzIHRlbXBvcmFyaWx5IHBhdXNpbmcgcGxheWJhY2sgaW50ZXJuYWxseSBpbiBvcmRlciB0bworICAgIC8vIGJ1ZmZlciBtb3JlIGRhdGEuCisgICAgTUVESUEyX0lORk9fQlVGRkVSSU5HX1NUQVJUID0gNzAxLAorICAgIC8vIE1lZGlhUGxheWVyMiBpcyByZXN1bWluZyBwbGF5YmFjayBhZnRlciBmaWxsaW5nIGJ1ZmZlcnMuCisgICAgTUVESUEyX0lORk9fQlVGRkVSSU5HX0VORCA9IDcwMiwKKyAgICAvLyBCYW5kd2lkdGggaW4gcmVjZW50IHBhc3QKKyAgICBNRURJQTJfSU5GT19ORVRXT1JLX0JBTkRXSURUSCA9IDcwMywKKworICAgIC8vIDh4eAorICAgIC8vIEJhZCBpbnRlcmxlYXZpbmcgbWVhbnMgdGhhdCBhIG1lZGlhIGhhcyBiZWVuIGltcHJvcGVybHkgaW50ZXJsZWF2ZWQgb3Igbm90CisgICAgLy8gaW50ZXJsZWF2ZWQgYXQgYWxsLCBlLmcgaGFzIGFsbCB0aGUgdmlkZW8gc2FtcGxlcyBmaXJzdCB0aGVuIGFsbCB0aGUgYXVkaW8KKyAgICAvLyBvbmVzLiBWaWRlbyBpcyBwbGF5aW5nIGJ1dCBhIGxvdCBvZiBkaXNrIHNlZWsgbWF5IGJlIGhhcHBlbmluZy4KKyAgICBNRURJQTJfSU5GT19CQURfSU5URVJMRUFWSU5HID0gODAwLAorICAgIC8vIFRoZSBtZWRpYSBpcyBub3Qgc2Vla2FibGUgKGUuZyBsaXZlIHN0cmVhbSkuCisgICAgTUVESUEyX0lORk9fTk9UX1NFRUtBQkxFID0gODAxLAorICAgIC8vIE5ldyBtZWRpYSBtZXRhZGF0YSBpcyBhdmFpbGFibGUuCisgICAgTUVESUEyX0lORk9fTUVUQURBVEFfVVBEQVRFID0gODAyLAorICAgIC8vIEF1ZGlvIGNhbiBub3QgYmUgcGxheWVkLgorICAgIE1FRElBMl9JTkZPX1BMQVlfQVVESU9fRVJST1IgPSA4MDQsCisgICAgLy8gVmlkZW8gY2FuIG5vdCBiZSBwbGF5ZWQuCisgICAgTUVESUEyX0lORk9fUExBWV9WSURFT19FUlJPUiA9IDgwNSwKKworICAgIC8vOXh4CisgICAgTUVESUEyX0lORk9fVElNRURfVEVYVF9FUlJPUiA9IDkwMCwKK307CisKKy8vIERvIG5vdCBjaGFuZ2UgdGhlc2UgdmFsdWVzIHdpdGhvdXQgdXBkYXRpbmcgdGhlaXIgY291bnRlcnBhcnRzIGluIE1lZGlhUGxheWVyMi5qYXZhCitlbnVtIG1lZGlhcGxheWVyMl9zdGF0ZXMgeworICAgIE1FRElBUExBWUVSMl9TVEFURV9JRExFICAgICAgICAgPSAxLAorICAgIE1FRElBUExBWUVSMl9TVEFURV9QUkVQQVJFRCAgICAgPSAyLAorICAgIE1FRElBUExBWUVSMl9TVEFURV9QTEFZSU5HICAgICAgPSAzLAorICAgIE1FRElBUExBWUVSMl9TVEFURV9QQVVTRUQgICAgICAgPSA0LAorICAgIE1FRElBUExBWUVSMl9TVEFURV9FUlJPUiAgICAgICAgPSA1LAorfTsKKworZW51bSBtZWRpYV9wbGF5ZXIyX2ludGVybmFsX3N0YXRlcyB7CisgICAgTUVESUFfUExBWUVSMl9TVEFURV9FUlJPUiAgICAgICAgPSAwLAorICAgIE1FRElBX1BMQVlFUjJfSURMRSAgICAgICAgICAgICAgID0gMSA8PCAwLAorICAgIE1FRElBX1BMQVlFUjJfSU5JVElBTElaRUQgICAgICAgID0gMSA8PCAxLAorICAgIE1FRElBX1BMQVlFUjJfUFJFUEFSSU5HICAgICAgICAgID0gMSA8PCAyLAorICAgIE1FRElBX1BMQVlFUjJfUFJFUEFSRUQgICAgICAgICAgID0gMSA8PCAzLAorICAgIE1FRElBX1BMQVlFUjJfU1RBUlRFRCAgICAgICAgICAgID0gMSA8PCA0LAorICAgIE1FRElBX1BMQVlFUjJfUEFVU0VEICAgICAgICAgICAgID0gMSA8PCA1LAorICAgIE1FRElBX1BMQVlFUjJfU1RPUFBFRCAgICAgICAgICAgID0gMSA8PCA2LAorICAgIE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUgID0gMSA8PCA3Cit9OworCisvLyBLZWVwIEtFWV9QQVJBTUVURVJfKiBpbiBzeW5jIHdpdGggTWVkaWFQbGF5ZXIyLmphdmEuCisvLyBUaGUgc2FtZSBlbnVtIHNwYWNlIGlzIHVzZWQgZm9yIGJvdGggc2V0IGFuZCBnZXQsIGluIGNhc2UgdGhlcmUgYXJlIGZ1dHVyZSBrZXlzIHRoYXQKKy8vIGNhbiBiZSBib3RoIHNldCBhbmQgZ2V0LiAgQnV0IGFzIG9mIG5vdywgYWxsIHBhcmFtZXRlcnMgYXJlIGVpdGhlciBzZXQgb25seSBvciBnZXQgb25seS4KK2VudW0gbWVkaWEyX3BhcmFtZXRlcl9rZXlzIHsKKyAgICAvLyBTdHJlYW1pbmcvYnVmZmVyaW5nIHBhcmFtZXRlcnMKKyAgICBNRURJQTJfS0VZX1BBUkFNRVRFUl9DQUNIRV9TVEFUX0NPTExFQ1RfRlJFUV9NUyA9IDExMDAsICAgICAgICAgICAgLy8gc2V0IG9ubHkKKworICAgIC8vIFJldHVybiBhIFBhcmNlbCBjb250YWluaW5nIGEgc2luZ2xlIGludCwgd2hpY2ggaXMgdGhlIGNoYW5uZWwgY291bnQgb2YgdGhlCisgICAgLy8gYXVkaW8gdHJhY2ssIG9yIHplcm8gZm9yIGVycm9yIChlLmcuIG5vIGF1ZGlvIHRyYWNrKSBvciB1bmtub3duLgorICAgIE1FRElBMl9LRVlfUEFSQU1FVEVSX0FVRElPX0NIQU5ORUxfQ09VTlQgPSAxMjAwLCAgICAgICAgICAgICAgICAgICAvLyBnZXQgb25seQorCisgICAgLy8gUGxheWJhY2sgcmF0ZSBleHByZXNzZWQgaW4gcGVybWlsbGUgKDEwMDAgaXMgbm9ybWFsIHNwZWVkKSwgc2F2ZWQgYXMgaW50MzJfdCwgd2l0aCBuZWdhdGl2ZQorICAgIC8vIHZhbHVlcyB1c2VkIGZvciByZXdpbmRpbmcgb3IgcmV2ZXJzZSBwbGF5YmFjay4KKyAgICBNRURJQTJfS0VZX1BBUkFNRVRFUl9QTEFZQkFDS19SQVRFX1BFUk1JTExFID0gMTMwMCwgICAgICAgICAgICAgICAgLy8gc2V0IG9ubHkKKworICAgIC8vIFNldCBhIFBhcmNlbCBjb250YWluaW5nIHRoZSB2YWx1ZSBvZiBhIHBhcmNlbGxlZCBKYXZhIEF1ZGlvQXR0cmlidXRlIGluc3RhbmNlCisgICAgTUVESUEyX0tFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUyA9IDE0MDAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBvbmx5Cit9OworCisvLyBLZWVwIElOVk9LRV9JRF8qIGluIHN5bmMgd2l0aCBNZWRpYVBsYXllcjIuamF2YS4KK2VudW0gbWVkaWFfcGxheWVyMl9pbnZva2VfaWRzIHsKKyAgICBNRURJQV9QTEFZRVIyX0lOVk9LRV9JRF9HRVRfVFJBQ0tfSU5GTyA9IDEsCisgICAgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfQUREX0VYVEVSTkFMX1NPVVJDRSA9IDIsCisgICAgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfQUREX0VYVEVSTkFMX1NPVVJDRV9GRCA9IDMsCisgICAgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfU0VMRUNUX1RSQUNLID0gNCwKKyAgICBNRURJQV9QTEFZRVIyX0lOVk9LRV9JRF9VTlNFTEVDVF9UUkFDSyA9IDUsCisgICAgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfU0VUX1ZJREVPX1NDQUxJTkdfTU9ERSA9IDYsCisgICAgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfR0VUX1NFTEVDVEVEX1RSQUNLID0gNworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfTUVESUFQTEFZRVIyX1RZUEVTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTg2MTkyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5oCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFQTEFZRVIyX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQVBMQVlFUjJfSAorCisjaW5jbHVkZSA8bWVkaWEvQVZTeW5jU2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgorI2luY2x1ZGUgPG1lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmg+CisjaW5jbHVkZSA8bWVkaWEvTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllcl9jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMlR5cGVzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby1iYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFOYXRpdmVXaW5kb3dXcmFwcGVyOworc3RydWN0IERhdGFTb3VyY2VEZXNjOworY2xhc3MgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ7CisKKy8vIHJlZi1jb3VudGVkIG9iamVjdCBmb3IgY2FsbGJhY2tzCitjbGFzcyBNZWRpYVBsYXllcjJMaXN0ZW5lcjogdmlydHVhbCBwdWJsaWMgUmVmQmFzZQoreworcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikgPSAwOworfTsKKworY2xhc3MgTWVkaWFQbGF5ZXIyIDogcHVibGljIE1lZGlhUGxheWVyMkludGVyZmFjZUxpc3RlbmVyCit7CitwdWJsaWM6CisgICAgfk1lZGlhUGxheWVyMigpOworCisgICAgc3RhdGljIHNwPE1lZGlhUGxheWVyMj4gQ3JlYXRlKCk7CisgICAgc3RhdGljIHN0YXR1c190IER1bXBBbGwoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKworICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKKworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldFNyY0lkKGludDY0X3QgKnNyY0lkKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2VEZXNjPiAmZHNkKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBwcmVwYXJlTmV4dERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZURlc2M+ICZkc2QpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHBsYXlOZXh0RGF0YVNvdXJjZShpbnQ2NF90IHNyY0lkKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiYgbnd3KTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRMaXN0ZW5lcihjb25zdCBzcDxNZWRpYVBsYXllcjJMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRCdWZmZXJpbmdTZXR0aW5ncyhCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHByZXBhcmVBc3luYygpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHN0YXJ0KCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc3RvcCgpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHBhdXNlKCk7CisgICAgICAgICAgICBib29sICAgICAgICAgICAgaXNQbGF5aW5nKCk7CisgICAgICAgICAgICBtZWRpYXBsYXllcjJfc3RhdGVzIGdldE1lZGlhUGxheWVyMlN0YXRlKCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSYgcmF0ZSk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSogcmF0ZSAvKiBub25udWxsICovKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRTeW5jU2V0dGluZ3MoY29uc3QgQVZTeW5jU2V0dGluZ3MmIHN5bmMsIGZsb2F0IHZpZGVvRnBzSGludCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0U3luY1NldHRpbmdzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTeW5jU2V0dGluZ3MqIHN5bmMgLyogbm9ubnVsbCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB2aWRlb0ZwcyAvKiBub25udWxsICovKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRWaWRlb1dpZHRoKGludCAqdyk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0VmlkZW9IZWlnaHQoaW50ICpoKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZWVrVG8oCisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbXNlYywKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIG5vdGlmeUF0KGludDY0X3QgbWVkaWFUaW1lVXMpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldEN1cnJlbnRQb3NpdGlvbihpbnQ2NF90ICptc2VjKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXREdXJhdGlvbihpbnQ2NF90ICptc2VjKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICByZXNldCgpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHR5cGUpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90ICp0eXBlKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRMb29waW5nKGludCBsb29wKTsKKyAgICAgICAgICAgIGJvb2wgICAgICAgICAgICBpc0xvb3BpbmcoKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdFZvbHVtZSwgZmxvYXQgcmlnaHRWb2x1bWUpOworICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIG5vdGlmeShpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCAqb2JqID0gTlVMTCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgaW52b2tlKGNvbnN0IFBhcmNlbCYgcmVxdWVzdCwgUGFyY2VsICpyZXBseSk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0TWV0YWRhdGFGaWx0ZXIoY29uc3QgUGFyY2VsJiBmaWx0ZXIpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldE1ldGFkYXRhKGJvb2wgdXBkYXRlX29ubHksIGJvb2wgYXBwbHlfZmlsdGVyLCBQYXJjZWwgKm1ldGFkYXRhKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRBdWRpb1Nlc3Npb25JZChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBnZXRBdWRpb1Nlc3Npb25JZCgpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgYXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCYgcmVxdWVzdCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCogcmVwbHkpOworCisgICAgICAgICAgICAvLyBNb2R1bGFyIERSTQorICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHByZXBhcmVEcm0oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBkcm1TZXNzaW9uSWQpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHJlbGVhc2VEcm0oKTsKKyAgICAgICAgICAgIC8vIEF1ZGlvUm91dGluZworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0Um91dGVkRGV2aWNlSWQoKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCk7CisKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisKK3ByaXZhdGU6CisgICAgTWVkaWFQbGF5ZXIyKCk7CisgICAgYm9vbCBpbml0KCk7CisKKyAgICAvLyBAcGFyYW0gdHlwZSBPZiB0aGUgbWV0YWRhdGEgdG8gYmUgdGVzdGVkLgorICAgIC8vIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWV0YWRhdGEgc2hvdWxkIGJlIGRyb3BwZWQgYWNjb3JkaW5nIHRvCisgICAgLy8gICAgICAgICAgICAgIHRoZSBmaWx0ZXJzLgorICAgIGJvb2wgc2hvdWxkRHJvcE1ldGFkYXRhKG1lZGlhOjpNZXRhZGF0YTo6VHlwZSB0eXBlKSBjb25zdDsKKworICAgIC8vIEFkZCBhIG5ldyBlbGVtZW50IHRvIHRoZSBzZXQgb2YgbWV0YWRhdGEgdXBkYXRlZC4gTm9vcCBpZgorICAgIC8vIHRoZSBlbGVtZW50IGV4aXN0cyBhbHJlYWR5LgorICAgIC8vIEBwYXJhbSB0eXBlIE9mIHRoZSBtZXRhZGF0YSB0byBiZSByZWNvcmRlZC4KKyAgICB2b2lkIGFkZE5ld01ldGFkYXRhVXBkYXRlKG1lZGlhOjpNZXRhZGF0YTo6VHlwZSB0eXBlKTsKKworICAgIC8vIERpc2Nvbm5lY3QgZnJvbSB0aGUgY3VycmVudGx5IGNvbm5lY3RlZCBBTmF0aXZlV2luZG93LgorICAgIHZvaWQgZGlzY29ubmVjdE5hdGl2ZVdpbmRvd19sKCk7CisKKyAgICBzdGF0dXNfdCBzZXRBdWRpb0F0dHJpYnV0ZXNfbChjb25zdCBQYXJjZWwgJnJlcXVlc3QpOworCisgICAgdm9pZCBjbGVhcl9sKCk7CisgICAgc3RhdHVzX3Qgc2Vla1RvX2woaW50NjRfdCBtc2VjLCBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlKTsKKyAgICBzdGF0dXNfdCBwcmVwYXJlQXN5bmNfbCgpOworICAgIHN0YXR1c190IGdldER1cmF0aW9uX2woaW50NjRfdCAqbXNlYyk7CisgICAgc3RhdHVzX3QgcmVzZXRfbCgpOworICAgIHN0YXR1c190IGNoZWNrU3RhdGVGb3JLZXlTZXRfbChpbnQga2V5KTsKKworICAgIHBpZF90ICAgICAgICAgICAgICAgICAgICAgICBtUGlkOworICAgIHVpZF90ICAgICAgICAgICAgICAgICAgICAgICBtVWlkOworICAgIHNwPE1lZGlhUGxheWVyMkludGVyZmFjZT4gICBtUGxheWVyOworICAgIHNwPE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0PiBtQXVkaW9PdXRwdXQ7CisgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgIG1TcmNJZDsKKyAgICB0aHJlYWRfaWRfdCAgICAgICAgICAgICAgICAgbUxvY2tUaHJlYWRJZDsKKyAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICAgICAgbUxvY2s7CisgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgIG1Ob3RpZnlMb2NrOworICAgIHNwPE1lZGlhUGxheWVyMkxpc3RlbmVyPiAgICBtTGlzdGVuZXI7CisgICAgbWVkaWFfcGxheWVyMl9pbnRlcm5hbF9zdGF0ZXMgbUN1cnJlbnRTdGF0ZTsKKyAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRQb3NpdGlvbjsKKyAgICBNZWRpYVBsYXllcjJTZWVrTW9kZSAgICAgICAgbUN1cnJlbnRTZWVrTW9kZTsKKyAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgbVNlZWtQb3NpdGlvbjsKKyAgICBNZWRpYVBsYXllcjJTZWVrTW9kZSAgICAgICAgbVNlZWtNb2RlOworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgICAgICAgICBtU3RyZWFtVHlwZTsKKyAgICBQYXJjZWwqICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbDsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUxvb3A7CisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgIG1MZWZ0Vm9sdW1lOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICBtUmlnaHRWb2x1bWU7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb1dpZHRoOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9IZWlnaHQ7CisgICAgYXVkaW9fc2Vzc2lvbl90ICAgICAgICAgICAgIG1BdWRpb1Nlc3Npb25JZDsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgKiAgICAgICAgbUF1ZGlvQXR0cmlidXRlczsKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgbVNlbmRMZXZlbDsKKworICAgIHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiAgICBtQ29ubmVjdGVkV2luZG93OworCisgICAgLy8gTWV0YWRhdGEgZmlsdGVycy4KKyAgICBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciBtTWV0YWRhdGFBbGxvdzsgIC8vIHByb3RlY3RlZCBieSBtTG9jaworICAgIG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyIG1NZXRhZGF0YURyb3A7ICAvLyBwcm90ZWN0ZWQgYnkgbUxvY2sKKworICAgIC8vIE1ldGFkYXRhIHVwZGF0ZWQuIEZvciBlYWNoIE1FRElBX0lORk9fTUVUQURBVEFfVVBEQVRFCisgICAgLy8gbm90aWZpY2F0aW9uIHdlIHRyeSB0byB1cGRhdGUgbU1ldGFkYXRhVXBkYXRlZCB3aGljaCBpcyBhCisgICAgLy8gc2V0OiBubyBkdXBsaWNhdGUuCisgICAgLy8gZ2V0TWV0YWRhdGEgY2xlYXJzIHRoaXMgc2V0LgorICAgIG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyIG1NZXRhZGF0YVVwZGF0ZWQ7ICAvLyBwcm90ZWN0ZWQgYnkgbUxvY2sKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX01FRElBUExBWUVSMl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbWVkaWFwbGF5ZXIyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NTY3ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbWVkaWFwbGF5ZXIyLmNwcApAQCAtMCwwICsxLDE1NTIgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFQbGF5ZXIyTmF0aXZlIgorCisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlRGVzYy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgorI2luY2x1ZGUgPG1lZGlhL01lbW9yeUxlYWtUcmFja1V0aWwuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZXRhZGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka1dyYXBwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KKworI2luY2x1ZGUgPG51cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuaD4KKworI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZXh0ZXJuIEFMb29wZXJSb3N0ZXIgZ0xvb3BlclJvc3RlcjsKKworbmFtZXNwYWNlIHsKKworY29uc3QgaW50IGtEdW1wTG9ja1JldHJpZXMgPSA1MDsKK2NvbnN0IGludCBrRHVtcExvY2tTbGVlcFVzID0gMjAwMDA7CisKKy8vIE1heCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgZmlsdGVyLgorY29uc3QgaW50IGtNYXhGaWx0ZXJTaXplID0gNjQ7ICAvLyBJIHB1bGxlZCB0aGF0IG91dCBvZiB0aGluIGFpci4KKworLy8gRklYTUU6IE1vdmUgYWxsIHRoZSBtZXRhZGF0YSByZWxhdGVkIGZ1bmN0aW9uIGluIHRoZSBNZXRhZGF0YS5jcHAKKworLy8gVW5tYXJzaGFsbCBhIGZpbHRlciBmcm9tIGEgUGFyY2VsLgorLy8gRmlsdGVyIGZvcm1hdCBpbiBhIHBhcmNlbDoKKy8vCisvLyAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworLy8gfCAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIGVudHJpZXMgKG4pICAgICAgICAgICAgICAgICAgIHwKKy8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisvLyB8ICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSB0eXBlIDEgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKy8vIHwgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhIHR5cGUgMiAgICAgICAgICAgICAgICAgICAgICAgICB8CisvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworLy8gIC4uLi4KKy8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisvLyB8ICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSB0eXBlIG4gICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKy8vCisvLyBAcGFyYW0gcCBQYXJjZWwgdGhhdCBzaG91bGQgc3RhcnQgd2l0aCBhIGZpbHRlci4KKy8vIEBwYXJhbVtvdXRdIGZpbHRlciBPbiBleGl0IGNvbnRhaW5zIHRoZSBsaXN0IG9mIG1ldGFkYXRhIHR5cGUgdG8gYmUKKy8vICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZC4KKy8vIEBwYXJhbVtvdXRdIHN0YXR1cyBPbiBleGl0IGNvbnRhaW5zIHRoZSBzdGF0dXMgY29kZSB0byBiZSByZXR1cm5lZC4KKy8vIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGFyY2VsIHN0YXJ0cyB3aXRoIGEgdmFsaWQgZmlsdGVyLgorYm9vbCB1bm1hcnNoYWxsRmlsdGVyKGNvbnN0IFBhcmNlbCYgcCwKKyAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciAqZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpIHsKKyAgICBpbnQzMl90IHZhbDsKKyAgICBpZiAocC5yZWFkSW50MzIoJnZhbCkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWFkIGZpbHRlcidzIGxlbmd0aCIpOworICAgICAgICAqc3RhdHVzID0gTk9UX0VOT1VHSF9EQVRBOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHZhbCA+IGtNYXhGaWx0ZXJTaXplIHx8IHZhbCA8IDApIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgZmlsdGVyIGxlbiAlZCIsIHZhbCk7CisgICAgICAgICpzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBzaXplX3QgbnVtID0gdmFsOworCisgICAgZmlsdGVyLT5jbGVhcigpOworICAgIGZpbHRlci0+c2V0Q2FwYWNpdHkobnVtKTsKKworICAgIHNpemVfdCBzaXplID0gbnVtICogc2l6ZW9mKG1lZGlhOjpNZXRhZGF0YTo6VHlwZSk7CisKKworICAgIGlmIChwLmRhdGFBdmFpbCgpIDwgc2l6ZSkgeworICAgICAgICBBTE9HRSgiRmlsdGVyIHRvbyBzaG9ydCBleHBlY3RlZCAlenUgYnV0IGdvdCAlenUiLCBzaXplLCBwLmRhdGFBdmFpbCgpKTsKKyAgICAgICAgKnN0YXR1cyA9IE5PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6VHlwZSAqZGF0YSA9CisgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6VHlwZSo+KHAucmVhZElucGxhY2Uoc2l6ZSkpOworCisgICAgaWYgKE5VTEwgPT0gZGF0YSkgeworICAgICAgICBBTE9HRSgiRmlsdGVyIGhhZCBubyBkYXRhIik7CisgICAgICAgICpzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBUT0RPOiBUaGUgc3RsIGltcGwgb2YgdmVjdG9yIHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50IGhlcmUKKyAgICAvLyBiZWNhdXNlIGl0IGRlZ2VuZXJhdGVzIGludG8gYSBtZW1jcHkgb24gcG9kIHR5cGVzLiBUcnkgdG8KKyAgICAvLyByZXBsYWNlIGxhdGVyIG9yIHVzZSBzdGw6OnNldC4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bTsgKytpKSB7CisgICAgICAgIGZpbHRlci0+YWRkKCpkYXRhKTsKKyAgICAgICAgKytkYXRhOworICAgIH0KKyAgICAqc3RhdHVzID0gT0s7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEBwYXJhbSBmaWx0ZXIgT2YgbWV0YWRhdGEgdHlwZS4KKy8vIEBwYXJhbSB2YWwgVG8gYmUgc2VhcmNoZWQuCisvLyBAcmV0dXJuIHRydWUgaWYgYSBtYXRjaCB3YXMgZm91bmQuCitib29sIGZpbmRNZXRhZGF0YShjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgZmlsdGVyLCBjb25zdCBpbnQzMl90IHZhbCkgeworICAgIC8vIERlYWwgd2l0aCBlbXB0eSBhbmQgQU5ZIHJpZ2h0IGF3YXkKKyAgICBpZiAoZmlsdGVyLmlzRW1wdHkoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChmaWx0ZXJbMF0gPT0gbWVkaWE6Ok1ldGFkYXRhOjprQW55KSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmaWx0ZXIuaW5kZXhPZih2YWwpID49IDA7Cit9CisKKy8vIG1hcnNoYWxsaW5nIHRhZyBpbmRpY2F0aW5nIGZsYXR0ZW5lZCB1dGYxNiB0YWdzCisvLyBrZWVwIGluIHN5bmMgd2l0aCBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlcy5qYXZhCitjb25zdCBpbnQzMl90IGtBdWRpb0F0dHJpYnV0ZXNNYXJzaGFsbFRhZ0ZsYXR0ZW5UYWdzID0gMTsKKworLy8gQXVkaW8gYXR0cmlidXRlcyBmb3JtYXQgaW4gYSBwYXJjZWw6CisvLworLy8gIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKy8vIHwgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworLy8gfCAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisvLyB8ICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKy8vIHwgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworLy8gfCAgICAgICAgICAgICAgICAgICAgICAga0F1ZGlvQXR0cmlidXRlc01hcnNoYWxsVGFnRmxhdHRlblRhZ3MgIHwgLy8gaWdub3JlIHRhZ3MgaWYgbm90IGZvdW5kCisvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworLy8gfCAgICAgICAgICAgICAgICAgICAgICAgZmxhdHRlbmVkIHRhZ3MgaW4gVVRGMTYgICAgICAgICAgICAgICAgIHwKKy8vIHwgICAgICAgICAgICAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisvLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworLy8KKy8vIEBwYXJhbSBwIFBhcmNlbCB0aGF0IGNvbnRhaW5zIGF1ZGlvIGF0dHJpYnV0ZXMuCisvLyBAcGFyYW1bb3V0XSBhdHRyaWJ1dGVzIE9uIGV4aXQgcG9pbnRzIHRvIGFuIGluaXRpYWxpemVkIGF1ZGlvX2F0dHJpYnV0ZXNfdCBzdHJ1Y3R1cmUKKy8vIEBwYXJhbVtvdXRdIHN0YXR1cyBPbiBleGl0IGNvbnRhaW5zIHRoZSBzdGF0dXMgY29kZSB0byBiZSByZXR1cm5lZC4KK3ZvaWQgdW5tYXJzaGFsbEF1ZGlvQXR0cmlidXRlcyhjb25zdCBQYXJjZWwmIHBhcmNlbCwgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzKSB7CisgICAgYXR0cmlidXRlcy0+dXNhZ2UgPSAoYXVkaW9fdXNhZ2VfdCkgcGFyY2VsLnJlYWRJbnQzMigpOworICAgIGF0dHJpYnV0ZXMtPmNvbnRlbnRfdHlwZSA9IChhdWRpb19jb250ZW50X3R5cGVfdCkgcGFyY2VsLnJlYWRJbnQzMigpOworICAgIGF0dHJpYnV0ZXMtPnNvdXJjZSA9IChhdWRpb19zb3VyY2VfdCkgcGFyY2VsLnJlYWRJbnQzMigpOworICAgIGF0dHJpYnV0ZXMtPmZsYWdzID0gKGF1ZGlvX2ZsYWdzX21hc2tfdCkgcGFyY2VsLnJlYWRJbnQzMigpOworICAgIGNvbnN0IGJvb2wgaGFzRmxhdHRlbmVkVGFnID0gKHBhcmNlbC5yZWFkSW50MzIoKSA9PSBrQXVkaW9BdHRyaWJ1dGVzTWFyc2hhbGxUYWdGbGF0dGVuVGFncyk7CisgICAgaWYgKGhhc0ZsYXR0ZW5lZFRhZykgeworICAgICAgICAvLyB0aGUgdGFncyBhcmUgVVRGMTYsIGNvbnZlcnQgdG8gVVRGOAorICAgICAgICBTdHJpbmcxNiB0YWdzID0gcGFyY2VsLnJlYWRTdHJpbmcxNigpOworICAgICAgICBzc2l6ZV90IHJlYWxUYWdTaXplID0gdXRmMTZfdG9fdXRmOF9sZW5ndGgodGFncy5zdHJpbmcoKSwgdGFncy5zaXplKCkpOworICAgICAgICBpZiAocmVhbFRhZ1NpemUgPD0gMCkgeworICAgICAgICAgICAgc3RyY3B5KGF0dHJpYnV0ZXMtPnRhZ3MsICIiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGNvcHkgdGhlIGZsYXR0ZW5lZCBzdHJpbmcgaW50byB0aGUgYXR0cmlidXRlcyBhcyB0aGUgZGVzdGluYXRpb24gZm9yIHRoZSBjb252ZXJzaW9uOgorICAgICAgICAgICAgLy8gY29weWluZyBhcnJheSBzaXplIC0xLCBhcnJheSBmb3IgdGFncyB3YXMgY2FsbG9jJ2QsIG5vIG5lZWQgdG8gTlVMTC10ZXJtaW5hdGUgaXQKKyAgICAgICAgICAgIHNpemVfdCB0YWdTaXplID0gcmVhbFRhZ1NpemUgPiBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSAxID8KKyAgICAgICAgICAgICAgICAgICAgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gMSA6IHJlYWxUYWdTaXplOworICAgICAgICAgICAgdXRmMTZfdG9fdXRmOCh0YWdzLnN0cmluZygpLCB0YWdTaXplLCBhdHRyaWJ1dGVzLT50YWdzLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXR0cmlidXRlcy0+dGFncykgLyBzaXplb2YoYXR0cmlidXRlcy0+dGFnc1swXSkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoInVubWFyc2hhbGxBdWRpb0F0dHJpYnV0ZXMoKSByZWNlaXZlZCB1bmZsYXR0ZW5lZCB0YWdzLCBpZ25vcmluZyB0YWcgdmFsdWVzIik7CisgICAgICAgIHN0cmNweShhdHRyaWJ1dGVzLT50YWdzLCAiIik7CisgICAgfQorfQorCitjbGFzcyBBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcjogcHVibGljIEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrIHsKK3B1YmxpYzoKKyAgICBBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcihjb25zdCBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U+JiBsaXN0ZW5lcikKKyAgICAgICAgOiBtTGlzdGVuZXIobGlzdGVuZXIpIHsgfQorCisgICAgfkF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyKCkgeyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb0RldmljZVVwZGF0ZShhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7CisgICAgICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgICAgICBsaXN0ZW5lci0+c2VuZEV2ZW50KDAsIE1FRElBMl9BVURJT19ST1VUSU5HX0NIQU5HRUQsIGF1ZGlvSW8sIGRldmljZUlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCJsaXN0ZW5lciBmb3IgcHJvY2VzcyAlZCBkZWF0aCBpcyBnb25lIiwgTUVESUEyX0FVRElPX1JPVVRJTkdfQ0hBTkdFRCk7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgd3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiBtTGlzdGVuZXI7Cit9OworCitjbGFzcyBwcm94eUxpc3RlbmVyIDogcHVibGljIE1lZGlhUGxheWVyMkludGVyZmFjZUxpc3RlbmVyIHsKK3B1YmxpYzoKKyAgICBwcm94eUxpc3RlbmVyKGNvbnN0IHdwPE1lZGlhUGxheWVyMj4gJnBsYXllcikKKyAgICAgICAgOiBtUGxheWVyKHBsYXllcikgeyB9CisKKyAgICB+cHJveHlMaXN0ZW5lcigpIHsgfTsKKworICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikgb3ZlcnJpZGUgeworICAgICAgICBzcDxNZWRpYVBsYXllcjI+IHBsYXllciA9IG1QbGF5ZXIucHJvbW90ZSgpOworICAgICAgICBpZiAocGxheWVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHBsYXllci0+bm90aWZ5KHNyY0lkLCBtc2csIGV4dDEsIGV4dDIsIG9iaik7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgd3A8TWVkaWFQbGF5ZXIyPiBtUGxheWVyOworfTsKKworTXV0ZXggc1JlY29yZExvY2s7CitTb3J0ZWRWZWN0b3I8d3A8TWVkaWFQbGF5ZXIyPiA+ICpzUGxheWVyczsKKwordm9pZCBlbnN1cmVJbml0X2woKSB7CisgICAgaWYgKHNQbGF5ZXJzID09IE5VTEwpIHsKKyAgICAgICAgc1BsYXllcnMgPSBuZXcgU29ydGVkVmVjdG9yPHdwPE1lZGlhUGxheWVyMj4gPigpOworICAgIH0KK30KKwordm9pZCBhZGRQbGF5ZXIoY29uc3Qgd3A8TWVkaWFQbGF5ZXIyPiYgcGxheWVyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soc1JlY29yZExvY2spOworICAgIGVuc3VyZUluaXRfbCgpOworICAgIHNQbGF5ZXJzLT5hZGQocGxheWVyKTsKK30KKwordm9pZCByZW1vdmVQbGF5ZXIoY29uc3Qgd3A8TWVkaWFQbGF5ZXIyPiYgcGxheWVyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soc1JlY29yZExvY2spOworICAgIGVuc3VyZUluaXRfbCgpOworICAgIHNQbGF5ZXJzLT5yZW1vdmUocGxheWVyKTsKK30KKworLyoqCisgKiBUaGUgb25seSBhcmd1bWVudHMgdGhpcyB1bmRlcnN0YW5kcyByaWdodCBub3cgYXJlIC1jLCAtdm9uIGFuZCAtdm9mZiwKKyAqIHdoaWNoIGFyZSBwYXJzZWQgYnkgQUxvb3BlclJvc3Rlcjo6ZHVtcCgpCisgKi8KK3N0YXR1c190IGR1bXBQbGF5ZXJzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgeworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworICAgIFNvcnRlZFZlY3Rvcjwgc3A8TWVkaWFQbGF5ZXIyPiA+IHBsYXllcnM7IC8vdG8gc2VyaWFsaXNlIHRoZSBtdXRleCB1bmxvY2sgJiBjbGllbnQgZGVzdHJ1Y3Rpb24uCisKKyAgICBpZiAoY2hlY2tDYWxsaW5nUGVybWlzc2lvbihTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKSkgPT0gZmFsc2UpIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUGVybWlzc2lvbiBEZW5pYWw6IGNhbid0IGR1bXAgTWVkaWFQbGF5ZXIyXG4iKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKHNSZWNvcmRMb2NrKTsKKyAgICAgICAgICAgIGVuc3VyZUluaXRfbCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIG4gPSBzUGxheWVycy0+c2l6ZSgpOyBpIDwgbjsgKytpKSB7CisgICAgICAgICAgICAgICAgc3A8TWVkaWFQbGF5ZXIyPiBwID0gKCpzUGxheWVycylbaV0ucHJvbW90ZSgpOworICAgICAgICAgICAgICAgIGlmIChwICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcC0+ZHVtcChmZCwgYXJncyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBsYXllcnMuYWRkKHApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiIEZpbGVzIG9wZW5lZCBhbmQvb3IgbWFwcGVkOlxuIik7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi9wcm9jLyVkL21hcHMiLCBnZXRwaWQoKSk7CisgICAgICAgIEZJTEUgKmYgPSBmb3BlbihidWZmZXIsICJyIik7CisgICAgICAgIGlmIChmKSB7CisgICAgICAgICAgICB3aGlsZSAoIWZlb2YoZikpIHsKKyAgICAgICAgICAgICAgICBmZ2V0cyhidWZmZXIsIFNJWkUsIGYpOworICAgICAgICAgICAgICAgIGlmIChzdHJzdHIoYnVmZmVyLCAiIC9zdG9yYWdlLyIpIHx8CisgICAgICAgICAgICAgICAgICAgIHN0cnN0cihidWZmZXIsICIgL3N5c3RlbS9zb3VuZHMvIikgfHwKKyAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGJ1ZmZlciwgIiAvZGF0YS8iKSB8fAorICAgICAgICAgICAgICAgICAgICBzdHJzdHIoYnVmZmVyLCAiIC9zeXN0ZW0vbWVkaWEvIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAiKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZjbG9zZShmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoImNvdWxkbid0IG9wZW4gIik7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgICAgICB9CisKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvZmQiLCBnZXRwaWQoKSk7CisgICAgICAgIERJUiAqZCA9IG9wZW5kaXIoYnVmZmVyKTsKKyAgICAgICAgaWYgKGQpIHsKKyAgICAgICAgICAgIHN0cnVjdCBkaXJlbnQgKmVudDsKKyAgICAgICAgICAgIHdoaWxlKChlbnQgPSByZWFkZGlyKGQpKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChlbnQtPmRfbmFtZSwiLiIpICYmIHN0cmNtcChlbnQtPmRfbmFtZSwiLi4iKSkgeworICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9mZC8lcyIsIGdldHBpZCgpLCBlbnQtPmRfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzdGF0IHM7CisgICAgICAgICAgICAgICAgICAgIGlmIChsc3RhdChidWZmZXIsICZzKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHMuc3RfbW9kZSAmIFNfSUZNVCkgPT0gU19JRkxOSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgbGlua3RvWzI1Nl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IHJlYWRsaW5rKGJ1ZmZlciwgbGlua3RvLCBzaXplb2YobGlua3RvKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobGVuID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsZW4gPiAyNTUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0b1syNTJdID0gJy4nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3RvWzI1M10gPSAnLic7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rdG9bMjU0XSA9ICcuJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0b1syNTVdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0b1tsZW5dID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3Ryc3RyKGxpbmt0bywgIi9zdG9yYWdlLyIpID09IGxpbmt0byB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGxpbmt0bywgIi9zeXN0ZW0vc291bmRzLyIpID09IGxpbmt0byB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGxpbmt0bywgIi9kYXRhLyIpID09IGxpbmt0byB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGxpbmt0bywgIi9zeXN0ZW0vbWVkaWEvIikgPT0gbGlua3RvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiIC0+ICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChsaW5rdG8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICB1bmV4cGVjdGVkIHR5cGUgZm9yICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xvc2VkaXIoZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJjb3VsZG4ndCBvcGVuICIpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGdMb29wZXJSb3N0ZXIuZHVtcChmZCwgYXJncyk7CisKKyAgICAgICAgYm9vbCBkdW1wTWVtID0gZmFsc2U7CisgICAgICAgIGJvb2wgdW5yZWFjaGFibGVNZW1vcnkgPSBmYWxzZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcmdzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXJnc1tpXSA9PSBTdHJpbmcxNigiLW0iKSkgeworICAgICAgICAgICAgICAgIGR1bXBNZW0gPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldID09IFN0cmluZzE2KCItLXVucmVhY2hhYmxlIikpIHsKKyAgICAgICAgICAgICAgICB1bnJlYWNoYWJsZU1lbW9yeSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGR1bXBNZW0pIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuRHVtcGluZyBtZW1vcnk6XG4iKTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHMgPSBkdW1wTWVtb3J5QWRkcmVzc2VzKDEwMCAvKiBsaW1pdCAqLyk7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHMuY19zdHIoKSwgcy5zaXplKCkpOworICAgICAgICB9CisgICAgICAgIGlmICh1bnJlYWNoYWJsZU1lbW9yeSkgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG5EdW1waW5nIHVucmVhY2hhYmxlIG1lbW9yeTpcbiIpOworICAgICAgICAgICAgLy8gVE9ETyAtIHNob3VsZCBsaW1pdCBiZSBhbiBhcmd1bWVudCBwYXJhbWV0ZXI/CisgICAgICAgICAgICAvLyBUT0RPOiBlbmFibGUgR2V0VW5yZWFjaGFibGVNZW1vcnlTdHJpbmcgaWYgaXQncyBwYXJ0IG9mIHN0YWJsZSBBUEkKKyAgICAgICAgICAgIC8vc3RkOjpzdHJpbmcgcyA9IEdldFVucmVhY2hhYmxlTWVtb3J5U3RyaW5nKHRydWUgLyogY29udGVudHMgKi8sIDEwMDAwIC8qIGxpbWl0ICovKTsKKyAgICAgICAgICAgIC8vcmVzdWx0LmFwcGVuZChzLmNfc3RyKCksIHMuc2l6ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworLy9zdGF0aWMKK3NwPE1lZGlhUGxheWVyMj4gTWVkaWFQbGF5ZXIyOjpDcmVhdGUoKSB7CisgICAgc3A8TWVkaWFQbGF5ZXIyPiBwbGF5ZXIgPSBuZXcgTWVkaWFQbGF5ZXIyKCk7CisKKyAgICBpZiAoIXBsYXllci0+aW5pdCgpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIEFMT0dWKCJDcmVhdGUgbmV3IHBsYXllciglcCkiLCBwbGF5ZXIuZ2V0KCkpOworCisgICAgYWRkUGxheWVyKHBsYXllcik7CisgICAgcmV0dXJuIHBsYXllcjsKK30KKworLy8gc3RhdGljCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OkR1bXBBbGwoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CisgICAgcmV0dXJuIGR1bXBQbGF5ZXJzKGZkLCBhcmdzKTsKK30KKworTWVkaWFQbGF5ZXIyOjpNZWRpYVBsYXllcjIoKSB7CisgICAgQUxPR1YoImNvbnN0cnVjdG9yIik7CisgICAgbVNyY0lkID0gMDsKKyAgICBtTG9ja1RocmVhZElkID0gMDsKKyAgICBtTGlzdGVuZXIgPSBOVUxMOworICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX01VU0lDOworICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgPSBOVUxMOworICAgIG1DdXJyZW50UG9zaXRpb24gPSAtMTsKKyAgICBtQ3VycmVudFNlZWtNb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQzsKKyAgICBtU2Vla1Bvc2l0aW9uID0gLTE7CisgICAgbVNlZWtNb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQzsKKyAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9JRExFOworICAgIG1Mb29wID0gZmFsc2U7CisgICAgbUxlZnRWb2x1bWUgPSBtUmlnaHRWb2x1bWUgPSAxLjA7CisgICAgbVZpZGVvV2lkdGggPSBtVmlkZW9IZWlnaHQgPSAwOworICAgIG1BdWRpb1Nlc3Npb25JZCA9IChhdWRpb19zZXNzaW9uX3QpIEF1ZGlvU3lzdGVtOjpuZXdBdWRpb1VuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfU0VTU0lPTik7CisgICAgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChtQXVkaW9TZXNzaW9uSWQsIC0xKTsKKyAgICBtU2VuZExldmVsID0gMDsKKworICAgIC8vIFRPRE86IGdldCBwaWQgYW5kIHVpZCBmcm9tIEpBVkEKKyAgICBtUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIG1VaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisKKyAgICBtQXVkaW9BdHRyaWJ1dGVzID0gTlVMTDsKK30KKworTWVkaWFQbGF5ZXIyOjp+TWVkaWFQbGF5ZXIyKCkgeworICAgIEFMT0dWKCJkZXN0cnVjdG9yIik7CisgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbDsKKyAgICAgICAgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbCA9IE5VTEw7CisgICAgfQorICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobUF1ZGlvU2Vzc2lvbklkLCAtMSk7CisgICAgZGlzY29ubmVjdCgpOworICAgIHJlbW92ZVBsYXllcih0aGlzKTsKKyAgICBpZiAobUF1ZGlvQXR0cmlidXRlcyAhPSBOVUxMKSB7CisgICAgICAgIGZyZWUobUF1ZGlvQXR0cmlidXRlcyk7CisgICAgfQorfQorCitib29sIE1lZGlhUGxheWVyMjo6aW5pdCgpIHsKKyAgICAvLyBUT0RPOiBhZnRlciBtZXJnZSB3aXRoIE51UGxheWVyMkRyaXZlciwgTWVkaWFQbGF5ZXIyIHdpbGwgaGF2ZSBpdHMgb3duCisgICAgLy8gbG9vcGVyIGZvciBub3RpZmljYXRpb24uCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTWVkaWFQbGF5ZXIyOjpkaXNjb25uZWN0KCkgeworICAgIEFMT0dWKCJkaXNjb25uZWN0Iik7CisgICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiBwOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgcCA9IG1QbGF5ZXI7CisgICAgICAgIG1QbGF5ZXIuY2xlYXIoKTsKKyAgICB9CisKKyAgICBpZiAocCAhPSAwKSB7CisgICAgICAgIHAtPnNldExpc3RlbmVyKE5VTEwpOworICAgICAgICBwLT5yZXNldCgpOworICAgIH0KKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgZGlzY29ubmVjdE5hdGl2ZVdpbmRvd19sKCk7CisgICAgfQorfQorCit2b2lkIE1lZGlhUGxheWVyMjo6Y2xlYXJfbCgpIHsKKyAgICBtQ3VycmVudFBvc2l0aW9uID0gLTE7CisgICAgbUN1cnJlbnRTZWVrTW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkM7CisgICAgbVNlZWtQb3NpdGlvbiA9IC0xOworICAgIG1TZWVrTW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkM7CisgICAgbVZpZGVvV2lkdGggPSBtVmlkZW9IZWlnaHQgPSAwOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldExpc3RlbmVyKGNvbnN0IHNwPE1lZGlhUGxheWVyMkxpc3RlbmVyPiYgbGlzdGVuZXIpIHsKKyAgICBBTE9HVigic2V0TGlzdGVuZXIiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXRTcmNJZChpbnQ2NF90ICpzcmNJZCkgeworICAgIGlmIChzcmNJZCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAqc3JjSWQgPSBtU3JjSWQ7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZURlc2M+ICZkc2QpIHsKKyAgICBpZiAoZHNkID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoInNldERhdGFTb3VyY2UgdHlwZSglZCksIHNyY0lkKCVsbGQpIiwgZHNkLT5tVHlwZSwgKGxvbmcgbG9uZylkc2QtPm1JZCk7CisKKyAgICBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U+IG9sZFBsYXllcjsKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgeworICAgICAgICBpZiAoISgobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfSURMRSkKKyAgICAgICAgICAgICAgfHwgbUN1cnJlbnRTdGF0ZSA9PSBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SKSkgeworICAgICAgICAgICAgQUxPR0UoInNldERhdGFTb3VyY2UgY2FsbGVkIGluIHdyb25nIHN0YXRlICVkIiwgbUN1cnJlbnRTdGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKworICAgICAgICBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U+IHBsYXllciA9IG5ldyBOdVBsYXllcjJEcml2ZXIobVBpZCwgbVVpZCk7CisgICAgICAgIHN0YXR1c190IGVyciA9IHBsYXllci0+aW5pdENoZWNrKCk7CisgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIHBsYXllciBvYmplY3QsIGluaXRDaGVjayBmYWlsZWQoJWQpIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICBjbGVhcl9sKCk7CisKKyAgICAgICAgcGxheWVyLT5zZXRMaXN0ZW5lcihuZXcgcHJveHlMaXN0ZW5lcih0aGlzKSk7CisgICAgICAgIG1BdWRpb091dHB1dCA9IG5ldyBNZWRpYVBsYXllcjJBdWRpb091dHB1dChtQXVkaW9TZXNzaW9uSWQsIG1VaWQsCisgICAgICAgICAgICAgICAgbVBpZCwgbUF1ZGlvQXR0cmlidXRlcywgbmV3IEF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyKHBsYXllcikpOworICAgICAgICBwbGF5ZXItPnNldEF1ZGlvU2luayhtQXVkaW9PdXRwdXQpOworCisgICAgICAgIGVyciA9IHBsYXllci0+c2V0RGF0YVNvdXJjZShkc2QpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgic2V0RGF0YVNvdXJjZSBlcnJvcjogJWQiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIHNwPE1lZGlhUGxheWVyMkludGVyZmFjZT4gb2xkUGxheWVyID0gbVBsYXllcjsKKyAgICAgICAgbVBsYXllciA9IHBsYXllcjsKKyAgICAgICAgbVNyY0lkID0gZHNkLT5tSWQ7CisgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX0lOSVRJQUxJWkVEOworICAgIH0KKworICAgIGlmIChvbGRQbGF5ZXIgIT0gTlVMTCkgeworICAgICAgICBvbGRQbGF5ZXItPnNldExpc3RlbmVyKE5VTEwpOworICAgICAgICBvbGRQbGF5ZXItPnJlc2V0KCk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnByZXBhcmVOZXh0RGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlRGVzYz4gJmRzZCkgeworICAgIGlmIChkc2QgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigicHJlcGFyZU5leHREYXRhU291cmNlIHR5cGUoJWQpLCBzcmNJZCglbGxkKSIsIGRzZC0+bVR5cGUsIChsb25nIGxvbmcpZHNkLT5tSWQpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBsYXllciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJwcmVwYXJlTmV4dERhdGFTb3VyY2UgZmFpbGVkOiBzdGF0ZSAlWCwgbVBsYXllciglcCkiLCBtQ3VycmVudFN0YXRlLCBtUGxheWVyLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICByZXR1cm4gbVBsYXllci0+cHJlcGFyZU5leHREYXRhU291cmNlKGRzZCk7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6cGxheU5leHREYXRhU291cmNlKGludDY0X3Qgc3JjSWQpIHsKKyAgICBBTE9HVigicGxheU5leHREYXRhU291cmNlIHNyY0lkKCVsbGQpIiwgKGxvbmcgbG9uZylzcmNJZCk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoInBsYXlOZXh0RGF0YVNvdXJjZSBmYWlsZWQ6IHN0YXRlICVYLCBtUGxheWVyKCVwKSIsIG1DdXJyZW50U3RhdGUsIG1QbGF5ZXIuZ2V0KCkpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIG1TcmNJZCA9IHNyY0lkOworICAgIHJldHVybiBtUGxheWVyLT5wbGF5TmV4dERhdGFTb3VyY2Uoc3JjSWQpOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6Omludm9rZShjb25zdCBQYXJjZWwmIHJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGNvbnN0IGJvb2wgaGFzQmVlbkluaXRpYWxpemVkID0KKyAgICAgICAgICAgIChtQ3VycmVudFN0YXRlICE9IE1FRElBX1BMQVlFUjJfU1RBVEVfRVJST1IpICYmCisgICAgICAgICAgICAoKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX0lETEUpICE9IE1FRElBX1BMQVlFUjJfSURMRSk7CisgICAgaWYgKChtUGxheWVyID09IE5VTEwpIHx8ICFoYXNCZWVuSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgQUxPR0UoImludm9rZSBmYWlsZWQ6IHdyb25nIHN0YXRlICVYLCBtUGxheWVyKCVwKSIsIG1DdXJyZW50U3RhdGUsIG1QbGF5ZXIuZ2V0KCkpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIEFMT0dWKCJpbnZva2UgJXp1IiwgcmVxdWVzdC5kYXRhU2l6ZSgpKTsKKyAgICByZXR1cm4gbVBsYXllci0+aW52b2tlKHJlcXVlc3QsIHJlcGx5KTsKK30KKworLy8gVGhpcyBjYWxsIGRvZXNuJ3QgbmVlZCB0byBhY2Nlc3MgdGhlIG5hdGl2ZSBwbGF5ZXIuCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldE1ldGFkYXRhRmlsdGVyKGNvbnN0IFBhcmNlbCYgZmlsdGVyKSB7CisgICAgQUxPR0QoInNldE1ldGFkYXRhRmlsdGVyIik7CisKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXIgYWxsb3csIGRyb3A7CisKKyAgICBpZiAodW5tYXJzaGFsbEZpbHRlcihmaWx0ZXIsICZhbGxvdywgJnN0YXR1cykgJiYKKyAgICAgICAgdW5tYXJzaGFsbEZpbHRlcihmaWx0ZXIsICZkcm9wLCAmc3RhdHVzKSkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisKKyAgICAgICAgbU1ldGFkYXRhQWxsb3cgPSBhbGxvdzsKKyAgICAgICAgbU1ldGFkYXRhRHJvcCA9IGRyb3A7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6Z2V0TWV0YWRhdGEoYm9vbCB1cGRhdGVfb25seSwgYm9vbCAvKiBhcHBseV9maWx0ZXIgKi8sIFBhcmNlbCAqcmVwbHkpIHsKKyAgICBBTE9HRCgiZ2V0TWV0YWRhdGEiKTsKKyAgICBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U+IHBsYXllcjsKKyAgICBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciBpZHM7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIHsKKyAgICAgICAgaWYgKG1QbGF5ZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0KKworICAgICAgICBwbGF5ZXIgPSBtUGxheWVyOworICAgICAgICAvLyBQbGFjZWhvbGRlciBmb3IgdGhlIHJldHVybiBjb2RlLCB1cGRhdGVkIGJ5IHRoZSBjYWxsZXIuCisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKC0xKTsKKworICAgICAgICAvLyBXZSBkb24ndCBibG9jayBub3RpZmljYXRpb25zIHdoaWxlIHdlIGZldGNoIHRoZSBkYXRhLiBXZSBjbGVhcgorICAgICAgICAvLyBtTWV0YWRhdGFVcGRhdGVkIGZpcnN0IHNvIHdlIGRvbid0IGxvc2Ugbm90aWZpY2F0aW9ucyBoYXBwZW5pbmcKKyAgICAgICAgLy8gZHVyaW5nIHRoZSByZXN0IG9mIHRoaXMgY2FsbC4KKyAgICAgICAgaWYgKHVwZGF0ZV9vbmx5KSB7CisgICAgICAgICAgICBpZHMgPSBtTWV0YWRhdGFVcGRhdGVkOworICAgICAgICB9CisgICAgICAgIG1NZXRhZGF0YVVwZGF0ZWQuY2xlYXIoKTsKKyAgICB9CisKKyAgICBtZWRpYTo6TWV0YWRhdGEgbWV0YWRhdGEocmVwbHkpOworCisgICAgbWV0YWRhdGEuYXBwZW5kSGVhZGVyKCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcGxheWVyLT5nZXRNZXRhZGF0YShpZHMsIHJlcGx5KTsKKworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgbWV0YWRhdGEucmVzZXRQYXJjZWwoKTsKKyAgICAgICAgQUxPR0UoImdldE1ldGFkYXRhIGZhaWxlZCAlZCIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgLy8gRklYTUU6IGVtZW50IGZpbHRlcmluZyBvbiB0aGUgcmVzdWx0LiBOb3QgY3JpdGljYWwgc2luY2UKKyAgICAvLyBmaWx0ZXJpbmcgdGFrZXMgcGxhY2Ugb24gdGhlIHVwZGF0ZSBub3RpZmljYXRpb25zIGFscmVhZHkuIFRoaXMKKyAgICAvLyB3b3VsZCBiZSB3aGVuIGFsbCB0aGUgbWV0YWRhdGEgYXJlIGZldGNoIGFuZCBhIGZpbHRlciBpcyBzZXQuCisKKyAgICAvLyBFdmVyeXRoaW5nIGlzIGZpbmUsIHVwZGF0ZSB0aGUgbWV0YWRhdGEgbGVuZ3RoLgorICAgIG1ldGFkYXRhLnVwZGF0ZUxlbmd0aCgpOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBNZWRpYVBsYXllcjI6OmRpc2Nvbm5lY3ROYXRpdmVXaW5kb3dfbCgpIHsKKyAgICBpZiAobUNvbm5lY3RlZFdpbmRvdyAhPSBOVUxMICYmIG1Db25uZWN0ZWRXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSAhPSBOVUxMKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IG5hdGl2ZV93aW5kb3dfYXBpX2Rpc2Nvbm5lY3QoCisgICAgICAgICAgICAgICAgbUNvbm5lY3RlZFdpbmRvdy0+Z2V0QU5hdGl2ZVdpbmRvdygpLCBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coIm5hdGl2ZVdpbmRvd0Rpc2Nvbm5lY3QgcmV0dXJuZWQgYW4gZXJyb3I6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgIH0KKyAgICB9CisgICAgbUNvbm5lY3RlZFdpbmRvdy5jbGVhcigpOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldFZpZGVvU3VyZmFjZVRleHR1cmUoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+JiBud3cpIHsKKyAgICBBTmF0aXZlV2luZG93ICphbncgPSAobnd3ID09IE5VTEwgPyBOVUxMIDogbnd3LT5nZXRBTmF0aXZlV2luZG93KCkpOworICAgIEFMT0dWKCJzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKCVwKSIsIGFudyk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBsYXllciA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGlmIChhbncgIT0gTlVMTCkgeworICAgICAgICBpZiAobUNvbm5lY3RlZFdpbmRvdyAhPSBOVUxMCisgICAgICAgICAgICAmJiBtQ29ubmVjdGVkV2luZG93LT5nZXRBTmF0aXZlV2luZG93KCkgPT0gYW53KSB7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbmF0aXZlX3dpbmRvd19hcGlfY29ubmVjdChhbncsIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgic2V0VmlkZW9TdXJmYWNlVGV4dHVyZSBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBtdXN0IGRvIHRoZSByZXNldCBiZWZvcmUgZGlzY29ubmVjdGluZyBmcm9tIHRoZSBBTlcuCisgICAgICAgICAgICAvLyBPdGhlcndpc2UgcXVldWUvZGVxdWV1ZSBjYWxscyBjb3VsZCBiZSBtYWRlIG9uIHRoZSBkaXNjb25uZWN0ZWQKKyAgICAgICAgICAgIC8vIEFOVywgd2hpY2ggbWF5IHJlc3VsdCBpbiBlcnJvcnMuCisgICAgICAgICAgICBtUGxheWVyLT5yZXNldCgpOworICAgICAgICAgICAgZGlzY29ubmVjdE5hdGl2ZVdpbmRvd19sKCk7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTm90ZSB0aGF0IHdlIG11c3Qgc2V0IHRoZSBwbGF5ZXIncyBuZXcgR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGJlZm9yZQorICAgIC8vIGRpc2Nvbm5lY3RpbmcgdGhlIG9sZCBvbmUuICBPdGhlcndpc2UgcXVldWUvZGVxdWV1ZSBjYWxscyBjb3VsZCBiZSBtYWRlCisgICAgLy8gb24gdGhlIGRpc2Nvbm5lY3RlZCBBTlcsIHdoaWNoIG1heSByZXN1bHQgaW4gZXJyb3JzLgorICAgIHN0YXR1c190IGVyciA9IG1QbGF5ZXItPnNldFZpZGVvU3VyZmFjZVRleHR1cmUobnd3KTsKKworICAgIGRpc2Nvbm5lY3ROYXRpdmVXaW5kb3dfbCgpOworCisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBtQ29ubmVjdGVkV2luZG93ID0gbnd3OworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICB9IGVsc2UgaWYgKGFudyAhPSBOVUxMKSB7CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KGFudywgTkFUSVZFX1dJTkRPV19BUElfTUVESUEpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dXKCJuYXRpdmVXaW5kb3dEaXNjb25uZWN0IHJldHVybmVkIGFuIGVycm9yOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXRCdWZmZXJpbmdTZXR0aW5ncyhCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pIHsKKyAgICBBTE9HVigiZ2V0QnVmZmVyaW5nU2V0dGluZ3MiKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QbGF5ZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5nZXRCdWZmZXJpbmdTZXR0aW5ncyhidWZmZXJpbmcpOworICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1YoImdldEJ1ZmZlcmluZ1NldHRpbmdzeyVzfSIsIGJ1ZmZlcmluZy0+dG9TdHJpbmcoKS5zdHJpbmcoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoImdldEJ1ZmZlcmluZ1NldHRpbmdzIHJldHVybmVkICVkIiwgcmV0KTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSB7CisgICAgQUxPR1YoInNldEJ1ZmZlcmluZ1NldHRpbmdzeyVzfSIsIGJ1ZmZlcmluZy50b1N0cmluZygpLnN0cmluZygpKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QbGF5ZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1QbGF5ZXItPnNldEJ1ZmZlcmluZ1NldHRpbmdzKGJ1ZmZlcmluZyk7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0QXVkaW9BdHRyaWJ1dGVzX2woY29uc3QgUGFyY2VsICZwYXJjZWwpIHsKKyAgICBpZiAobUF1ZGlvQXR0cmlidXRlcyAhPSBOVUxMKSB7CisgICAgICAgIGZyZWUobUF1ZGlvQXR0cmlidXRlcyk7CisgICAgfQorICAgIG1BdWRpb0F0dHJpYnV0ZXMgPSAoYXVkaW9fYXR0cmlidXRlc190ICopIGNhbGxvYygxLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKyAgICB1bm1hcnNoYWxsQXVkaW9BdHRyaWJ1dGVzKHBhcmNlbCwgbUF1ZGlvQXR0cmlidXRlcyk7CisKKyAgICBBTE9HVigic2V0QXVkaW9BdHRyaWJ1dGVzX2woKSB1c2FnZT0lZCBjb250ZW50PSVkIGZsYWdzPTB4JXggdGFncz0lcyIsCisgICAgICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzLT51c2FnZSwgbUF1ZGlvQXR0cmlidXRlcy0+Y29udGVudF90eXBlLCBtQXVkaW9BdHRyaWJ1dGVzLT5mbGFncywKKyAgICAgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMtPnRhZ3MpOworCisgICAgaWYgKG1BdWRpb091dHB1dCAhPSAwKSB7CisgICAgICAgIG1BdWRpb091dHB1dC0+c2V0QXVkaW9BdHRyaWJ1dGVzKG1BdWRpb0F0dHJpYnV0ZXMpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6cHJlcGFyZUFzeW5jKCkgeworICAgIEFMT0dWKCJwcmVwYXJlQXN5bmMiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmICgobVBsYXllciAhPSAwKSAmJiAobUN1cnJlbnRTdGF0ZSAmIChNRURJQV9QTEFZRVIyX0lOSVRJQUxJWkVEIHwgTUVESUFfUExBWUVSMl9TVE9QUEVEKSkpIHsKKyAgICAgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgIT0gTlVMTCkgeworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0QXVkaW9BdHRyaWJ1dGVzX2woKm1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobUF1ZGlvT3V0cHV0ICE9IDApIHsKKyAgICAgICAgICAgIG1BdWRpb091dHB1dC0+c2V0QXVkaW9TdHJlYW1UeXBlKG1TdHJlYW1UeXBlKTsKKyAgICAgICAgfQorICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9QUkVQQVJJTkc7CisgICAgICAgIHJldHVybiBtUGxheWVyLT5wcmVwYXJlQXN5bmMoKTsKKyAgICB9CisgICAgQUxPR0UoInByZXBhcmVBc3luYyBjYWxsZWQgaW4gc3RhdGUgJWQsIG1QbGF5ZXIoJXApIiwgbUN1cnJlbnRTdGF0ZSwgbVBsYXllci5nZXQoKSk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnN0YXJ0KCkgeworICAgIEFMT0dWKCJzdGFydCIpOworCisgICAgc3RhdHVzX3QgcmV0ID0gTk9fRVJST1I7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIG1Mb2NrVGhyZWFkSWQgPSBnZXRUaHJlYWRJZCgpOworCisgICAgaWYgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX1NUQVJURUQpIHsKKyAgICAgICAgcmV0ID0gTk9fRVJST1I7CisgICAgfSBlbHNlIGlmICggKG1QbGF5ZXIgIT0gMCkgJiYgKCBtQ3VycmVudFN0YXRlICYgKCBNRURJQV9QTEFZRVIyX1BSRVBBUkVEIHwKKyAgICAgICAgICAgICAgICAgICAgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSB8IE1FRElBX1BMQVlFUjJfUEFVU0VEICkgKSApIHsKKyAgICAgICAgbVBsYXllci0+c2V0TG9vcGluZyhtTG9vcCk7CisKKyAgICAgICAgaWYgKG1BdWRpb091dHB1dCAhPSAwKSB7CisgICAgICAgICAgICBtQXVkaW9PdXRwdXQtPnNldFZvbHVtZShtTGVmdFZvbHVtZSwgbVJpZ2h0Vm9sdW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gMCkgeworICAgICAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobVNlbmRMZXZlbCk7CisgICAgICAgIH0KKyAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfU1RBUlRFRDsKKyAgICAgICAgcmV0ID0gbVBsYXllci0+c3RhcnQoKTsKKyAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfU1RBVEVfRVJST1I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobUN1cnJlbnRTdGF0ZSA9PSBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInBsYXliYWNrIGNvbXBsZXRlZCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgc3RhcnQoKSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoInN0YXJ0IGNhbGxlZCBpbiBzdGF0ZSAlZCwgbVBsYXllciglcCkiLCBtQ3VycmVudFN0YXRlLCBtUGxheWVyLmdldCgpKTsKKyAgICAgICAgcmV0ID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgbUxvY2tUaHJlYWRJZCA9IDA7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnN0b3AoKSB7CisgICAgQUxPR1YoInN0b3AiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9TVE9QUEVEKSByZXR1cm4gTk9fRVJST1I7CisgICAgaWYgKCAobVBsYXllciAhPSAwKSAmJiAoIG1DdXJyZW50U3RhdGUgJiAoIE1FRElBX1BMQVlFUjJfU1RBUlRFRCB8IE1FRElBX1BMQVlFUjJfUFJFUEFSRUQgfAorICAgICAgICAgICAgICAgICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUgKSApICkgeworICAgICAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5zdG9wKCk7CisgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfU1RPUFBFRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBBTE9HRSgic3RvcCBjYWxsZWQgaW4gc3RhdGUgJWQsIG1QbGF5ZXIoJXApIiwgbUN1cnJlbnRTdGF0ZSwgbVBsYXllci5nZXQoKSk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnBhdXNlKCkgeworICAgIEFMT0dWKCJwYXVzZSIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1DdXJyZW50U3RhdGUgJiAoTUVESUFfUExBWUVSMl9QQVVTRUR8TUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkpCisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICBpZiAoKG1QbGF5ZXIgIT0gMCkgJiYgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX1NUQVJURUQpKSB7CisgICAgICAgIHN0YXR1c190IHJldCA9IG1QbGF5ZXItPnBhdXNlKCk7CisgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfUEFVU0VEOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIEFMT0dFKCJwYXVzZSBjYWxsZWQgaW4gc3RhdGUgJWQsIG1QbGF5ZXIoJXApIiwgbUN1cnJlbnRTdGF0ZSwgbVBsYXllci5nZXQoKSk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitib29sIE1lZGlhUGxheWVyMjo6aXNQbGF5aW5nKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QbGF5ZXIgIT0gMCkgeworICAgICAgICBib29sIHRlbXAgPSBtUGxheWVyLT5pc1BsYXlpbmcoKTsKKyAgICAgICAgQUxPR1YoImlzUGxheWluZzogJWQiLCB0ZW1wKTsKKyAgICAgICAgaWYgKChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9TVEFSVEVEKSAmJiAhIHRlbXApIHsKKyAgICAgICAgICAgIEFMT0dFKCJpbnRlcm5hbC9leHRlcm5hbCBzdGF0ZSBtaXNtYXRjaCBjb3JyZWN0ZWQiKTsKKyAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1BBVVNFRDsKKyAgICAgICAgfSBlbHNlIGlmICgobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfUEFVU0VEKSAmJiB0ZW1wKSB7CisgICAgICAgICAgICBBTE9HRSgiaW50ZXJuYWwvZXh0ZXJuYWwgc3RhdGUgbWlzbWF0Y2ggY29ycmVjdGVkIik7CisgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9TVEFSVEVEOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0ZW1wOworICAgIH0KKyAgICBBTE9HVigiaXNQbGF5aW5nOiBubyBhY3RpdmUgcGxheWVyIik7CisgICAgcmV0dXJuIGZhbHNlOworfQorCittZWRpYXBsYXllcjJfc3RhdGVzIE1lZGlhUGxheWVyMjo6Z2V0TWVkaWFQbGF5ZXIyU3RhdGUoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfU1RBVEVfRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIE1FRElBUExBWUVSMl9TVEFURV9FUlJPUjsKKyAgICB9CisgICAgaWYgKG1QbGF5ZXIgPT0gMAorICAgICAgICB8fCAobUN1cnJlbnRTdGF0ZSAmCisgICAgICAgICAgICAoTUVESUFfUExBWUVSMl9JRExFIHwgTUVESUFfUExBWUVSMl9JTklUSUFMSVpFRCB8IE1FRElBX1BMQVlFUjJfUFJFUEFSSU5HKSkpIHsKKyAgICAgICAgcmV0dXJuIE1FRElBUExBWUVSMl9TVEFURV9JRExFOworICAgIH0KKyAgICBpZiAobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfU1RBUlRFRCkgeworICAgICAgICByZXR1cm4gTUVESUFQTEFZRVIyX1NUQVRFX1BMQVlJTkc7CisgICAgfQorICAgIGlmIChtQ3VycmVudFN0YXRlCisgICAgICAgICYgKE1FRElBX1BMQVlFUjJfUEFVU0VEIHwgTUVESUFfUExBWUVSMl9TVE9QUEVEIHwgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkpIHsKKyAgICAgICAgcmV0dXJuIE1FRElBUExBWUVSMl9TVEFURV9QQVVTRUQ7CisgICAgfQorICAgIC8vIG5vdyBvbmx5IG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX1BSRVBBUkVEIGlzIHRydWUKKyAgICByZXR1cm4gTUVESUFQTEFZRVIyX1NUQVRFX1BSRVBBUkVEOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUmIHJhdGUpIHsKKyAgICBBTE9HVigic2V0UGxheWJhY2tTZXR0aW5nczogJWYgJWYgJWQgJWQiLAorICAgICAgICAgICAgcmF0ZS5tU3BlZWQsIHJhdGUubVBpdGNoLCByYXRlLm1GYWxsYmFja01vZGUsIHJhdGUubVN0cmV0Y2hNb2RlKTsKKyAgICAvLyBOZWdhdGl2ZSBzcGVlZCBhbmQgcGl0Y2ggZG9lcyBub3QgbWFrZSBzZW5zZS4gRnVydGhlciB2YWxpZGF0aW9uIHdpbGwKKyAgICAvLyBiZSBkb25lIGJ5IHRoZSByZXNwZWN0aXZlIG1lZGlhcGxheWVycy4KKyAgICBpZiAocmF0ZS5tU3BlZWQgPD0gMC5mIHx8IHJhdGUubVBpdGNoIDwgMC5mKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QbGF5ZXIgPT0gMCB8fCAobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfU1RPUFBFRCkpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IG1QbGF5ZXItPnNldFBsYXliYWNrU2V0dGluZ3MocmF0ZSk7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlKiByYXRlIC8qIG5vbm51bGwgKi8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyID09IDApIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5nZXRQbGF5YmFja1NldHRpbmdzKHJhdGUpOworICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1YoImdldFBsYXliYWNrU2V0dGluZ3MoJWYsICVmLCAlZCwgJWQpIiwKKyAgICAgICAgICAgICAgICByYXRlLT5tU3BlZWQsIHJhdGUtPm1QaXRjaCwgcmF0ZS0+bUZhbGxiYWNrTW9kZSwgcmF0ZS0+bVN0cmV0Y2hNb2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiZ2V0UGxheWJhY2tTZXR0aW5ncyByZXR1cm5lZCAlZCIsIHJldCk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzJiBzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpIHsKKyAgICBBTE9HVigic2V0U3luY1NldHRpbmdzOiAldSAldSAlZiAlZiIsCisgICAgICAgICAgICBzeW5jLm1Tb3VyY2UsIHN5bmMubUF1ZGlvQWRqdXN0TW9kZSwgc3luYy5tVG9sZXJhbmNlLCB2aWRlb0Zwc0hpbnQpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QbGF5ZXIgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtUGxheWVyLT5zZXRTeW5jU2V0dGluZ3Moc3luYywgdmlkZW9GcHNIaW50KTsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXRTeW5jU2V0dGluZ3MoCisgICAgICAgIEFWU3luY1NldHRpbmdzKiBzeW5jIC8qIG5vbm51bGwgKi8sIGZsb2F0KiB2aWRlb0ZwcyAvKiBub25udWxsICovKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBsYXllciA9PSAwKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+Z2V0U3luY1NldHRpbmdzKHN5bmMsIHZpZGVvRnBzKTsKKyAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dWKCJnZXRTeW5jU2V0dGluZ3MoJXUsICV1LCAlZiwgJWYpIiwKKyAgICAgICAgICAgICAgICBzeW5jLT5tU291cmNlLCBzeW5jLT5tQXVkaW9BZGp1c3RNb2RlLCBzeW5jLT5tVG9sZXJhbmNlLCAqdmlkZW9GcHMpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJnZXRTeW5jU2V0dGluZ3MgcmV0dXJuZWQgJWQiLCByZXQpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworCit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6Z2V0VmlkZW9XaWR0aChpbnQgKncpIHsKKyAgICBBTE9HVigiZ2V0VmlkZW9XaWR0aCIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QbGF5ZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgICp3ID0gbVZpZGVvV2lkdGg7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OmdldFZpZGVvSGVpZ2h0KGludCAqaCkgeworICAgIEFMT0dWKCJnZXRWaWRlb0hlaWdodCIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QbGF5ZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgICpoID0gbVZpZGVvSGVpZ2h0OworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbXNlYykgeworICAgIEFMT0dWKCJnZXRDdXJyZW50UG9zaXRpb24iKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyID09IDApIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBpZiAobUN1cnJlbnRQb3NpdGlvbiA+PSAwKSB7CisgICAgICAgIEFMT0dWKCJVc2luZyBjYWNoZWQgc2VlayBwb3NpdGlvbjogJWxsZCIsIChsb25nIGxvbmcpbUN1cnJlbnRQb3NpdGlvbik7CisgICAgICAgICptc2VjID0gbUN1cnJlbnRQb3NpdGlvbjsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5nZXRDdXJyZW50UG9zaXRpb24obXNlYyk7CisgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICBBTE9HVigiZ2V0Q3VycmVudFBvc2l0aW9uID0gJWxsZCIsIChsb25nIGxvbmcpKm1zZWMpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJnZXRDdXJyZW50UG9zaXRpb24gcmV0dXJuZWQgJWQiLCByZXQpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OmdldER1cmF0aW9uKGludDY0X3QgKm1zZWMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEFMT0dWKCJnZXREdXJhdGlvbl9sIik7CisgICAgYm9vbCBpc1ZhbGlkU3RhdGUgPSAobUN1cnJlbnRTdGF0ZSAmIChNRURJQV9QTEFZRVIyX1BSRVBBUkVEIHwgTUVESUFfUExBWUVSMl9TVEFSVEVEIHwKKyAgICAgICAgICAgIE1FRElBX1BMQVlFUjJfUEFVU0VEIHwgTUVESUFfUExBWUVSMl9TVE9QUEVEIHwgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkpOworICAgIGlmIChtUGxheWVyID09IDAgfHwgIWlzVmFsaWRTdGF0ZSkgeworICAgICAgICBBTE9HRSgiQXR0ZW1wdCB0byBjYWxsIGdldER1cmF0aW9uIGluIHdyb25nIHN0YXRlOiBtUGxheWVyPSVwLCBtQ3VycmVudFN0YXRlPSV1IiwKKyAgICAgICAgICAgICAgICBtUGxheWVyLmdldCgpLCBtQ3VycmVudFN0YXRlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBpbnQ2NF90IGR1cmF0aW9uTXM7CisgICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uTXMpOworCisgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICBBTE9HVigiZ2V0RHVyYXRpb24gPSAlbGxkIiwgKGxvbmcgbG9uZylkdXJhdGlvbk1zKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiZ2V0RHVyYXRpb24gcmV0dXJuZWQgJWQiLCByZXQpOworICAgICAgICAvLyBEbyBub3QgZW50ZXIgZXJyb3Igc3RhdGUganVzdCBiZWNhdXNlIG5vIGR1cmF0aW9uIHdhcyBhdmFpbGFibGUuCisgICAgICAgIGR1cmF0aW9uTXMgPSAtMTsKKyAgICB9CisKKyAgICBpZiAobXNlYykgeworICAgICAgICAqbXNlYyA9IGR1cmF0aW9uTXM7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZWVrVG9fbChpbnQ2NF90IG1zZWMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUpIHsKKyAgICBBTE9HVigic2Vla1RvICglbGxkLCAlZCkiLCAobG9uZyBsb25nKW1zZWMsIG1vZGUpOworICAgIGlmICgobVBsYXllciA9PSAwKSB8fCAhKG1DdXJyZW50U3RhdGUgJiAoTUVESUFfUExBWUVSMl9TVEFSVEVEIHwgTUVESUFfUExBWUVSMl9QUkVQQVJFRCB8CisgICAgICAgICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUpKSkgeworICAgICAgICBBTE9HRSgiQXR0ZW1wdCB0byBwZXJmb3JtIHNlZWtUbyBpbiB3cm9uZyBzdGF0ZTogbVBsYXllcj0lcCwgbUN1cnJlbnRTdGF0ZT0ldSIsCisgICAgICAgICAgICAgIG1QbGF5ZXIuZ2V0KCksIG1DdXJyZW50U3RhdGUpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGlmIChtc2VjIDwgMCkgeworICAgICAgICBBTE9HVygiQXR0ZW1wdCB0byBzZWVrIHRvIGludmFsaWQgcG9zaXRpb246ICVsbGQiLCAobG9uZyBsb25nKW1zZWMpOworICAgICAgICBtc2VjID0gMDsKKyAgICB9CisKKyAgICBpbnQ2NF90IGR1cmF0aW9uTXM7CisgICAgc3RhdHVzX3QgZXJyID0gbVBsYXllci0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uTXMpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HVygiU3RyZWFtIGhhcyBubyBkdXJhdGlvbiBhbmQgaXMgdGhlcmVmb3JlIG5vdCBzZWVrYWJsZS4iKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAobXNlYyA+IGR1cmF0aW9uTXMpIHsKKyAgICAgICAgQUxPR1coIkF0dGVtcHQgdG8gc2VlayB0byBwYXN0IGVuZCBvZiBmaWxlOiByZXF1ZXN0ID0gJWxsZCwgZHVyYXRpb25NcyA9ICVsbGQiLAorICAgICAgICAgICAgICAobG9uZyBsb25nKW1zZWMsIChsb25nIGxvbmcpZHVyYXRpb25Ncyk7CisKKyAgICAgICAgbXNlYyA9IGR1cmF0aW9uTXM7CisgICAgfQorCisgICAgLy8gY2FjaGUgZHVyYXRpb24KKyAgICBtQ3VycmVudFBvc2l0aW9uID0gbXNlYzsKKyAgICBtQ3VycmVudFNlZWtNb2RlID0gbW9kZTsKKyAgICBpZiAobVNlZWtQb3NpdGlvbiA8IDApIHsKKyAgICAgICAgbVNlZWtQb3NpdGlvbiA9IG1zZWM7CisgICAgICAgIG1TZWVrTW9kZSA9IG1vZGU7CisgICAgICAgIHJldHVybiBtUGxheWVyLT5zZWVrVG8obXNlYywgbW9kZSk7CisgICAgfQorICAgIEFMT0dWKCJTZWVrIGluIHByb2dyZXNzIC0gcXVldWUgdXAgc2Vla1RvWyVsbGQsICVkXSIsIChsb25nIGxvbmcpbXNlYywgbW9kZSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNlZWtUbyhpbnQ2NF90IG1zZWMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUpIHsKKyAgICBtTG9ja1RocmVhZElkID0gZ2V0VGhyZWFkSWQoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHN0YXR1c190IHJlc3VsdCA9IHNlZWtUb19sKG1zZWMsIG1vZGUpOworICAgIG1Mb2NrVGhyZWFkSWQgPSAwOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpub3RpZnlBdChpbnQ2NF90IG1lZGlhVGltZVVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBsYXllciAhPSAwKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICByZXR1cm4gbVBsYXllci0+bm90aWZ5QXQobWVkaWFUaW1lVXMpOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnJlc2V0X2woKSB7CisgICAgbUxvb3AgPSBmYWxzZTsKKyAgICBpZiAobUN1cnJlbnRTdGF0ZSA9PSBNRURJQV9QTEFZRVIyX0lETEUpIHsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICBpZiAobVBsYXllciAhPSAwKSB7CisgICAgICAgIHN0YXR1c190IHJldCA9IG1QbGF5ZXItPnJlc2V0KCk7CisgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZXNldCgpIGZhaWxlZCB3aXRoIHJldHVybiBjb2RlICglZCkiLCByZXQpOworICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfU1RBVEVfRVJST1I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUGxheWVyLT5zZXRMaXN0ZW5lcihOVUxMKTsKKyAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX0lETEU7CisgICAgICAgIH0KKyAgICAgICAgLy8gc2V0RGF0YVNvdXJjZSBoYXMgdG8gYmUgY2FsbGVkIGFnYWluIHRvIGNyZWF0ZSBhCisgICAgICAgIC8vIG5ldyBtZWRpYXBsYXllci4KKyAgICAgICAgbVBsYXllciA9IDA7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGNsZWFyX2woKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6cmVzZXQoKSB7CisgICAgQUxPR1YoInJlc2V0Iik7CisgICAgbUxvY2tUaHJlYWRJZCA9IGdldFRocmVhZElkKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSByZXNldF9sKCk7CisgICAgbUxvY2tUaHJlYWRJZCA9IDA7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHR5cGUpIHsKKyAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRBdWRpb1N0cmVhbVR5cGUiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtU3RyZWFtVHlwZSA9PSB0eXBlKSByZXR1cm4gTk9fRVJST1I7CisgICAgaWYgKG1DdXJyZW50U3RhdGUgJiAoIE1FRElBX1BMQVlFUjJfUFJFUEFSRUQgfCBNRURJQV9QTEFZRVIyX1NUQVJURUQgfAorICAgICAgICAgICAgICAgIE1FRElBX1BMQVlFUjJfUEFVU0VEIHwgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSApICkgeworICAgICAgICAvLyBDYW4ndCBjaGFuZ2UgdGhlIHN0cmVhbSB0eXBlIGFmdGVyIHByZXBhcmUKKyAgICAgICAgQUxPR0UoInNldEF1ZGlvU3RyZWFtIGNhbGxlZCBpbiBzdGF0ZSAlZCIsIG1DdXJyZW50U3RhdGUpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIC8vIGNhY2hlCisgICAgbVN0cmVhbVR5cGUgPSB0eXBlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCAqdHlwZSkgeworICAgIEFMT0dWKCJnZXRBdWRpb1N0cmVhbVR5cGUiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICp0eXBlID0gbVN0cmVhbVR5cGU7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldExvb3BpbmcoaW50IGxvb3ApIHsKKyAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRMb29waW5nIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtTG9vcCA9IChsb29wICE9IDApOworICAgIGlmIChtUGxheWVyICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnNldExvb3BpbmcobG9vcCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworYm9vbCBNZWRpYVBsYXllcjI6OmlzTG9vcGluZygpIHsKKyAgICBBTE9HVigiaXNMb29waW5nIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBsYXllciAhPSAwKSB7CisgICAgICAgIHJldHVybiBtTG9vcDsKKyAgICB9CisgICAgQUxPR1YoImlzTG9vcGluZzogbm8gYWN0aXZlIHBsYXllciIpOworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRWb2x1bWUoZmxvYXQgbGVmdFZvbHVtZSwgZmxvYXQgcmlnaHRWb2x1bWUpIHsKKyAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRWb2x1bWUoJWYsICVmKSIsIGxlZnRWb2x1bWUsIHJpZ2h0Vm9sdW1lKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1MZWZ0Vm9sdW1lID0gbGVmdFZvbHVtZTsKKyAgICBtUmlnaHRWb2x1bWUgPSByaWdodFZvbHVtZTsKKyAgICBpZiAobUF1ZGlvT3V0cHV0ICE9IDApIHsKKyAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRWb2x1bWUobGVmdFZvbHVtZSwgcmlnaHRWb2x1bWUpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0QXVkaW9TZXNzaW9uSWQoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgeworICAgIEFMT0dWKCJNZWRpYVBsYXllcjI6OnNldEF1ZGlvU2Vzc2lvbklkKCVkKSIsIHNlc3Npb25JZCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAoIShtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9JRExFKSkgeworICAgICAgICBBTE9HRSgic2V0QXVkaW9TZXNzaW9uSWQgY2FsbGVkIGluIHN0YXRlICVkIiwgbUN1cnJlbnRTdGF0ZSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaWYgKHNlc3Npb25JZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKHNlc3Npb25JZCAhPSBtQXVkaW9TZXNzaW9uSWQpIHsKKyAgICAgICAgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChzZXNzaW9uSWQsIC0xKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtQXVkaW9TZXNzaW9uSWQsIC0xKTsKKyAgICAgICAgbUF1ZGlvU2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2F1ZGlvX3Nlc3Npb25fdCBNZWRpYVBsYXllcjI6OmdldEF1ZGlvU2Vzc2lvbklkKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1Nlc3Npb25JZDsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoZmxvYXQgbGV2ZWwpIHsKKyAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoJWYpIiwgbGV2ZWwpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbVNlbmRMZXZlbCA9IGxldmVsOworICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gMCkgeworICAgICAgICByZXR1cm4gbUF1ZGlvT3V0cHV0LT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobGV2ZWwpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6YXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCkgeworICAgIEFMT0dWKCJNZWRpYVBsYXllcjI6OmF0dGFjaEF1eEVmZmVjdCglZCkiLCBlZmZlY3RJZCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUF1ZGlvT3V0cHV0ID09IDAgfHwKKyAgICAgICAgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX0lETEUpIHx8CisgICAgICAgIChtQ3VycmVudFN0YXRlID09IE1FRElBX1BMQVlFUjJfU1RBVEVfRVJST1IgKSkgeworICAgICAgICBBTE9HRSgiYXR0YWNoQXV4RWZmZWN0IGNhbGxlZCBpbiBzdGF0ZSAlZCwgbVBsYXllciglcCkiLCBtQ3VycmVudFN0YXRlLCBtUGxheWVyLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPmF0dGFjaEF1eEVmZmVjdChlZmZlY3RJZCk7Cit9CisKKy8vIGFsd2F5cyBjYWxsIHdpdGggbG9jayBoZWxkCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OmNoZWNrU3RhdGVGb3JLZXlTZXRfbChpbnQga2V5KSB7CisgICAgc3dpdGNoKGtleSkgeworICAgIGNhc2UgTUVESUEyX0tFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUzoKKyAgICAgICAgaWYgKG1DdXJyZW50U3RhdGUgJiAoIE1FRElBX1BMQVlFUjJfUFJFUEFSRUQgfCBNRURJQV9QTEFZRVIyX1NUQVJURUQgfAorICAgICAgICAgICAgICAgIE1FRElBX1BMQVlFUjJfUEFVU0VEIHwgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkgKSB7CisgICAgICAgICAgICAvLyBDYW4ndCBjaGFuZ2UgdGhlIGF1ZGlvIGF0dHJpYnV0ZXMgYWZ0ZXIgcHJlcGFyZQorICAgICAgICAgICAgQUxPR0UoInRyeWluZyB0byBzZXQgYXVkaW8gYXR0cmlidXRlcyBjYWxsZWQgaW4gc3RhdGUgJWQiLCBtQ3VycmVudFN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICAvLyBwYXJhbWV0ZXIgZG9lc24ndCByZXF1aXJlIHBsYXllciBzdGF0ZSBjaGVjaworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwmIHJlcXVlc3QpIHsKKyAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRQYXJhbWV0ZXIoJWQpIiwga2V5KTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChjaGVja1N0YXRlRm9yS2V5U2V0X2woa2V5KSAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBzd2l0Y2ggKGtleSkgeworICAgIGNhc2UgTUVESUEyX0tFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUzoKKyAgICAgICAgLy8gc2F2ZSB0aGUgbWFyc2hhbGxlZCBhdWRpbyBhdHRyaWJ1dGVzCisgICAgICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsOworICAgICAgICB9CisgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgPSBuZXcgUGFyY2VsKCk7CisgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwtPmFwcGVuZEZyb20oJnJlcXVlc3QsIDAsIHJlcXVlc3QuZGF0YVNpemUoKSk7CisgICAgICAgIHN0YXR1cyA9IHNldEF1ZGlvQXR0cmlidXRlc19sKHJlcXVlc3QpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dWX0lGKG1QbGF5ZXIgPT0gTlVMTCwgInNldFBhcmFtZXRlcjogbm8gYWN0aXZlIHBsYXllciIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAobVBsYXllciAhPSBOVUxMKSB7CisgICAgICAgIHN0YXR1cyA9IG1QbGF5ZXItPnNldFBhcmFtZXRlcihrZXksIHJlcXVlc3QpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OmdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KSB7CisgICAgQUxPR1YoIk1lZGlhUGxheWVyMjo6Z2V0UGFyYW1ldGVyKCVkKSIsIGtleSk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAoa2V5ID09IE1FRElBMl9LRVlfUEFSQU1FVEVSX0FVRElPX0FUVFJJQlVURVMpIHsKKyAgICAgICAgaWYgKHJlcGx5ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgIT0gTlVMTCkgeworICAgICAgICAgICAgcmVwbHktPmFwcGVuZEZyb20obUF1ZGlvQXR0cmlidXRlc1BhcmNlbCwgMCwgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbC0+ZGF0YVNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlmIChtUGxheWVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoImdldFBhcmFtZXRlcjogbm8gYWN0aXZlIHBsYXllciIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gIG1QbGF5ZXItPmdldFBhcmFtZXRlcihrZXksIHJlcGx5KTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIEFMT0dEKCJnZXRQYXJhbWV0ZXIgcmV0dXJucyAlZCIsIHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2Jvb2wgTWVkaWFQbGF5ZXIyOjpzaG91bGREcm9wTWV0YWRhdGEobWVkaWE6Ok1ldGFkYXRhOjpUeXBlIGNvZGUpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisKKyAgICBpZiAoZmluZE1ldGFkYXRhKG1NZXRhZGF0YURyb3AsIGNvZGUpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChtTWV0YWRhdGFBbGxvdy5pc0VtcHR5KCkgfHwgZmluZE1ldGFkYXRhKG1NZXRhZGF0YUFsbG93LCBjb2RlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQorCisKK3ZvaWQgTWVkaWFQbGF5ZXIyOjphZGROZXdNZXRhZGF0YVVwZGF0ZShtZWRpYTo6TWV0YWRhdGE6OlR5cGUgbWV0YWRhdGFfdHlwZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobU1ldGFkYXRhVXBkYXRlZC5pbmRleE9mKG1ldGFkYXRhX3R5cGUpIDwgMCkgeworICAgICAgICBtTWV0YWRhdGFVcGRhdGVkLmFkZChtZXRhZGF0YV90eXBlKTsKKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFQbGF5ZXIyOjpub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikgeworICAgIEFMT0dWKCJtZXNzYWdlIHJlY2VpdmVkIHNyY0lkPSVsbGQsIG1zZz0lZCwgZXh0MT0lZCwgZXh0Mj0lZCIsCisgICAgICAgICAgKGxvbmcgbG9uZylzcmNJZCwgbXNnLCBleHQxLCBleHQyKTsKKworICAgIGlmIChNRURJQTJfSU5GTyA9PSBtc2cgJiYgTUVESUEyX0lORk9fTUVUQURBVEFfVVBEQVRFID09IGV4dDEpIHsKKyAgICAgICAgY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpUeXBlIG1ldGFkYXRhX3R5cGUgPSBleHQyOworCisgICAgICAgIGlmKHNob3VsZERyb3BNZXRhZGF0YShtZXRhZGF0YV90eXBlKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gVXBkYXRlIHRoZSBsaXN0IG9mIG1ldGFkYXRhIHRoYXQgaGF2ZSBjaGFuZ2VkLiBnZXRNZXRhZGF0YQorICAgICAgICAvLyBhbHNvIGFjY2VzcyBtTWV0YWRhdGFVcGRhdGVkIGFuZCBjbGVhcnMgaXQuCisgICAgICAgIGFkZE5ld01ldGFkYXRhVXBkYXRlKG1ldGFkYXRhX3R5cGUpOworICAgIH0KKworICAgIGJvb2wgc2VuZCA9IHRydWU7CisgICAgYm9vbCBsb2NrZWQgPSBmYWxzZTsKKworICAgIC8vIFRPRE86IEluIHRoZSBmdXR1cmUsIHdlIG1pZ2h0IGJlIG9uIHRoZSBzYW1lIHRocmVhZCBpZiB0aGUgYXBwIGlzCisgICAgLy8gcnVubmluZyBpbiB0aGUgc2FtZSBwcm9jZXNzIGFzIHRoZSBtZWRpYSBzZXJ2ZXIuIEluIHRoYXQgY2FzZSwKKyAgICAvLyB0aGlzIHdpbGwgZGVhZGxvY2suCisgICAgLy8KKyAgICAvLyBUaGUgdGhyZWFkSWQgaGFjayBiZWxvdyB3b3JrcyBhcm91bmQgdGhpcyBmb3IgdGhlIGNhcmUgb2YgcHJlcGFyZSwKKyAgICAvLyBzZWVrVG8sIHN0YXJ0LCBhbmQgcmVzZXQgd2l0aGluIHRoZSBzYW1lIHByb2Nlc3MuCisgICAgLy8gRklYTUU6IFJlbWVtYmVyLCB0aGlzIGlzIGEgaGFjaywgaXQncyBub3QgZXZlbiBhIGhhY2sgdGhhdCBpcyBhcHBsaWVkCisgICAgLy8gY29uc2lzdGVudGx5IGZvciBhbGwgdXNlLWNhc2VzLCB0aGlzIG5lZWRzIHRvIGJlIHJldmlzaXRlZC4KKyAgICBpZiAobUxvY2tUaHJlYWRJZCAhPSBnZXRUaHJlYWRJZCgpKSB7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgbG9ja2VkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBBbGxvd3MgY2FsbHMgZnJvbSBKTkkgaW4gaWRsZSBzdGF0ZSB0byBub3RpZnkgZXJyb3JzCisgICAgaWYgKCEobXNnID09IE1FRElBMl9FUlJPUiAmJiBtQ3VycmVudFN0YXRlID09IE1FRElBX1BMQVlFUjJfSURMRSkgJiYgbVBsYXllciA9PSAwKSB7CisgICAgICAgIEFMT0dWKCJub3RpZnkoJWxsZCwgJWQsICVkLCAlZCkgY2FsbGJhY2sgb24gZGlzY29ubmVjdGVkIG1lZGlhcGxheWVyIiwKKyAgICAgICAgICAgICAgKGxvbmcgbG9uZylzcmNJZCwgbXNnLCBleHQxLCBleHQyKTsKKyAgICAgICAgaWYgKGxvY2tlZCkgbUxvY2sudW5sb2NrKCk7ICAgLy8gcmVsZWFzZSB0aGUgbG9jayB3aGVuIGRvbmUuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1zZykgeworICAgIGNhc2UgTUVESUEyX05PUDogLy8gaW50ZXJmYWNlIHRlc3QgbWVzc2FnZQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBMl9QUkVQQVJFRDoKKyAgICAgICAgQUxPR1YoIk1lZGlhUGxheWVyMjo6bm90aWZ5KCkgcHJlcGFyZWQiKTsKKyAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfUFJFUEFSRUQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVESUEyX0RSTV9JTkZPOgorICAgICAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpub3RpZnkoKSBNRURJQTJfRFJNX0lORk8oJWxsZCwgJWQsICVkLCAlZCwgJXApIiwKKyAgICAgICAgICAgICAgKGxvbmcgbG9uZylzcmNJZCwgbXNnLCBleHQxLCBleHQyLCBvYmopOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBMl9QTEFZQkFDS19DT01QTEVURToKKyAgICAgICAgQUxPR1YoInBsYXliYWNrIGNvbXBsZXRlIik7CisgICAgICAgIGlmIChtQ3VycmVudFN0YXRlID09IE1FRElBX1BMQVlFUjJfSURMRSkgeworICAgICAgICAgICAgQUxPR0UoInBsYXliYWNrIGNvbXBsZXRlIGluIGlkbGUgc3RhdGUiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1Mb29wKSB7CisgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBMl9FUlJPUjoKKyAgICAgICAgLy8gQWx3YXlzIGxvZyBlcnJvcnMuCisgICAgICAgIC8vIGV4dDE6IE1lZGlhIGZyYW1ld29yayBlcnJvciBjb2RlLgorICAgICAgICAvLyBleHQyOiBJbXBsZW1lbnRhdGlvbiBkZXBlbmRhbnQgZXJyb3IgY29kZS4KKyAgICAgICAgQUxPR0UoImVycm9yICglZCwgJWQpIiwgZXh0MSwgZXh0Mik7CisgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBMl9JTkZPOgorICAgICAgICAvLyBleHQxOiBNZWRpYSBmcmFtZXdvcmsgZXJyb3IgY29kZS4KKyAgICAgICAgLy8gZXh0MjogSW1wbGVtZW50YXRpb24gZGVwZW5kYW50IGVycm9yIGNvZGUuCisgICAgICAgIGlmIChleHQxICE9IE1FRElBMl9JTkZPX1ZJREVPX1RSQUNLX0xBR0dJTkcpIHsKKyAgICAgICAgICAgIEFMT0dXKCJpbmZvL3dhcm5pbmcgKCVkLCAlZCkiLCBleHQxLCBleHQyKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBMl9TRUVLX0NPTVBMRVRFOgorICAgICAgICBBTE9HVigiUmVjZWl2ZWQgc2VlayBjb21wbGV0ZSIpOworICAgICAgICBpZiAobVNlZWtQb3NpdGlvbiAhPSBtQ3VycmVudFBvc2l0aW9uIHx8IChtU2Vla01vZGUgIT0gbUN1cnJlbnRTZWVrTW9kZSkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJFeGVjdXRpbmcgcXVldWVkIHNlZWtUbyglbGxkLCAlZCkiLAorICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ3VycmVudFBvc2l0aW9uLCBtQ3VycmVudFNlZWtNb2RlKTsKKyAgICAgICAgICAgIG1TZWVrUG9zaXRpb24gPSAtMTsKKyAgICAgICAgICAgIG1TZWVrTW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkM7CisgICAgICAgICAgICBzZWVrVG9fbChtQ3VycmVudFBvc2l0aW9uLCBtQ3VycmVudFNlZWtNb2RlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJBbGwgc2Vla3MgY29tcGxldGUgLSByZXR1cm4gdG8gcmVndWxhcmx5IHNjaGVkdWxlZCBwcm9ncmFtIik7CisgICAgICAgICAgICBtQ3VycmVudFBvc2l0aW9uID0gbVNlZWtQb3NpdGlvbiA9IC0xOworICAgICAgICAgICAgbUN1cnJlbnRTZWVrTW9kZSA9IG1TZWVrTW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRURJQTJfQlVGRkVSSU5HX1VQREFURToKKyAgICAgICAgQUxPR1YoImJ1ZmZlcmluZyAlZCIsIGV4dDEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBMl9TRVRfVklERU9fU0laRToKKyAgICAgICAgQUxPR1YoIk5ldyB2aWRlbyBzaXplICVkIHggJWQiLCBleHQxLCBleHQyKTsKKyAgICAgICAgbVZpZGVvV2lkdGggPSBleHQxOworICAgICAgICBtVmlkZW9IZWlnaHQgPSBleHQyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBMl9OT1RJRllfVElNRToKKyAgICAgICAgQUxPR1YoIlJlY2VpdmVkIG5vdGlmeSB0aW1lIG1lc3NhZ2UiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRURJQTJfVElNRURfVEVYVDoKKyAgICAgICAgQUxPR1YoIlJlY2VpdmVkIHRpbWVkIHRleHQgbWVzc2FnZSIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBMl9TVUJUSVRMRV9EQVRBOgorICAgICAgICBBTE9HVigiUmVjZWl2ZWQgc3VidGl0bGUgZGF0YSBtZXNzYWdlIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVESUEyX01FVEFfREFUQToKKyAgICAgICAgQUxPR1YoIlJlY2VpdmVkIHRpbWVkIG1ldGFkYXRhIG1lc3NhZ2UiKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR1YoInVucmVjb2duaXplZCBtZXNzYWdlOiAoJWQsICVkLCAlZCkiLCBtc2csIGV4dDEsIGV4dDIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzcDxNZWRpYVBsYXllcjJMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtTGlzdGVuZXI7CisgICAgaWYgKGxvY2tlZCkgbUxvY2sudW5sb2NrKCk7CisKKyAgICAvLyB0aGlzIHByZXZlbnRzIHJlLWVudHJhbnQgY2FsbHMgaW50byBjbGllbnQgY29kZQorICAgIGlmICgobGlzdGVuZXIgIT0gMCkgJiYgc2VuZCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobU5vdGlmeUxvY2spOworICAgICAgICBBTE9HVigiY2FsbGJhY2sgYXBwbGljYXRpb24iKTsKKyAgICAgICAgbGlzdGVuZXItPm5vdGlmeShzcmNJZCwgbXNnLCBleHQxLCBleHQyLCBvYmopOworICAgICAgICBBTE9HVigiYmFjayBmcm9tIGNhbGxiYWNrIik7CisgICAgfQorfQorCisvLyBNb2R1bGFyIERSTQorc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgZHJtU2Vzc2lvbklkKSB7CisgICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKKyAgICBBTE9HRCgicHJlcGFyZURybTogdXVpZDogJXAgIGRybVNlc3Npb25JZDogJXAoJXp1KSIsIHV1aWQsCisgICAgICAgICAgICBkcm1TZXNzaW9uSWQuYXJyYXkoKSwgZHJtU2Vzc2lvbklkLnNpemUoKSk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBsYXllciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIC8vIE9ubHkgYWxsb3dlZCBpdCBpbiBwbGF5ZXIncyBwcmVwYXJpbmcvcHJlcGFyZWQgc3RhdGUuCisgICAgLy8gV2UgZ2V0IGhlcmUgb25seSBpZiBNRURJQV9EUk1fSU5GTyBoYXMgYWxyZWFkeSBhcnJpdmVkIChlLmcuLCBwcmVwYXJlIGlzIGhhbGYtd2F5IHRocm91Z2ggb3IKKyAgICAvLyBjb21wbGV0ZWQpIHNvIHRoZSBzdGF0ZSBjaGFuZ2UgdG8gInByZXBhcmVkIiBtaWdodCBub3QgaGF2ZSBoYXBwZW5lZCB5ZXQgKGUuZy4sIGJ1ZmZlcmluZykuCisgICAgLy8gU3RpbGwsIHdlIGNhbiBhbGxvdyBwcmVwYXJlRHJtIGZvciB0aGUgdXNlIGNhc2Ugb2YgYmVpbmcgY2FsbGVkIGluIE9uRHJtSW5mb0xpc3RlbmVyLgorICAgIGlmICghKG1DdXJyZW50U3RhdGUgJiAoTUVESUFfUExBWUVSMl9QUkVQQVJJTkcgfCBNRURJQV9QTEFZRVIyX1BSRVBBUkVEKSkpIHsKKyAgICAgICAgQUxPR0UoInByZXBhcmVEcm0gaXMgY2FsbGVkIGluIHRoZSB3cm9uZyBzdGF0ZSAoJWQpLiIsIG1DdXJyZW50U3RhdGUpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKGRybVNlc3Npb25JZC5pc0VtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoInByZXBhcmVEcm06IFVuZXhwZWN0ZWQuIENhbid0IHByb2NlZWQgd2l0aCBjcnlwdG8uIEVtcHR5IGRybVNlc3Npb25JZC4iKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIC8vIFBhc3NpbmcgZG93biB0byBtZWRpYXNlcnZlciBtYWlubHkgZm9yIGNyZWF0aW5nIHRoZSBjcnlwdG8KKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUGxheWVyLT5wcmVwYXJlRHJtKHV1aWQsIGRybVNlc3Npb25JZCk7CisgICAgQUxPR0VfSUYoc3RhdHVzICE9IE9LLCAicHJlcGFyZURybTogRmFpbGVkIGF0IG1lZGlhc2VydmVyIHdpdGggcmV0OiAlZCIsIHN0YXR1cyk7CisKKyAgICAvLyBUT0RPIGNoYW5nZSB0byBBTE9HVgorICAgIEFMT0dEKCJwcmVwYXJlRHJtOiBtZWRpYXNlcnZlcjo6cHJlcGFyZURybSByZXQ9JWQiLCBzdGF0dXMpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpyZWxlYXNlRHJtKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QbGF5ZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICAvLyBOb3QgYWxsb3dpbmcgcmVsZWFzZURybSBpbiBhbiBhY3RpdmUvcmVzdW1hYmxlIHN0YXRlCisgICAgaWYgKG1DdXJyZW50U3RhdGUgJiAoTUVESUFfUExBWUVSMl9TVEFSVEVEIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfUExBWUVSMl9TVEFURV9FUlJPUikpIHsKKyAgICAgICAgQUxPR0UoInJlbGVhc2VEcm0gVW5leHBlY3RlZCBzdGF0ZSAlZC4gQ2FuIG9ubHkgYmUgY2FsbGVkIGluIHN0b3BwZWQvaWRsZS4iLCBtQ3VycmVudFN0YXRlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1cyA9IG1QbGF5ZXItPnJlbGVhc2VEcm0oKTsKKyAgICAvLyBUT0RPIGNoYW5nZSB0byBBTE9HVgorICAgIEFMT0dEKCJyZWxlYXNlRHJtOiBtZWRpYXNlcnZlcjo6cmVsZWFzZURybSByZXQ6ICVkIiwgc3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJyZWxlYXNlRHJtOiBGYWlsZWQgYXQgbWVkaWFzZXJ2ZXIgd2l0aCByZXQ6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgLy8gT3ZlcnJpZGluZyB0byBPSyBzbyB0aGUgY2xpZW50IHByb2NlZWQgd2l0aCBpdHMgb3duIGNsZWFudXAKKyAgICAgICAgLy8gQ2xpZW50IGNhbid0IGRvIG1vcmUgY2xlYW51cC4gbWVkaWFzZXJ2ZXIgcmVsZWFzZSBpdHMgY3J5cHRvIGF0IGVuZCBvZiBzZXNzaW9uIGFueXdheS4KKyAgICAgICAgc3RhdHVzID0gT0s7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1BdWRpb091dHB1dCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2U6IGF1ZGlvIHNpbmsgbm90IGluaXQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPnNldE91dHB1dERldmljZShkZXZpY2VJZCk7Cit9CisKK2F1ZGlvX3BvcnRfaGFuZGxlX3QgTWVkaWFQbGF5ZXIyOjpnZXRSb3V0ZWREZXZpY2VJZCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtQXVkaW9PdXRwdXQgPT0gTlVMTCkgeworICAgICAgICBBTE9HVigiZ2V0Um91dGVkRGV2aWNlSWQ6IGF1ZGlvIHNpbmsgbm90IGluaXQiKTsKKyAgICAgICAgcmV0dXJuIEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgfQorICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvT3V0cHV0LT5nZXRSb3V0ZWREZXZpY2VJZCgmZGV2aWNlSWQpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgfQorICAgIHJldHVybiBkZXZpY2VJZDsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjplbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1BdWRpb091dHB1dCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJhZGRBdWRpb0RldmljZUNhbGxiYWNrOiBwbGF5ZXIgbm90IGluaXQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPmVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soZW5hYmxlZCk7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICByZXN1bHQuYXBwZW5kKCIgTWVkaWFQbGF5ZXIyXG4iKTsKKyAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgcGlkKCVkKSwgbG9vcGluZyglcylcbiIsIG1QaWQsIG1Mb29wPyJ0cnVlIjogImZhbHNlIik7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiBwbGF5ZXI7CisgICAgc3A8TWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ+IGF1ZGlvT3V0cHV0OworICAgIGJvb2wgbG9ja2VkID0gZmFsc2U7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrRHVtcExvY2tSZXRyaWVzOyArK2kpIHsKKyAgICAgICAgaWYgKG1Mb2NrLnRyeUxvY2soKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgbG9ja2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHVzbGVlcChrRHVtcExvY2tTbGVlcFVzKTsKKyAgICB9CisKKyAgICBpZiAobG9ja2VkKSB7CisgICAgICAgIHBsYXllciA9IG1QbGF5ZXI7CisgICAgICAgIGF1ZGlvT3V0cHV0ID0gbUF1ZGlvT3V0cHV0OworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQuYXBwZW5kKCIgIGxvY2sgaXMgdGFrZW4sIG5vIGR1bXAgZnJvbSBwbGF5ZXIgYW5kIGF1ZGlvIG91dHB1dFxuIik7CisgICAgfQorICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworCisgICAgaWYgKHBsYXllciAhPSBOVUxMKSB7CisgICAgICAgIHBsYXllci0+ZHVtcChmZCwgYXJncyk7CisgICAgfQorICAgIGlmIChhdWRpb091dHB1dCAhPSAwKSB7CisgICAgICAgIGF1ZGlvT3V0cHV0LT5kdW1wKGZkLCBhcmdzKTsKKyAgICB9CisgICAgd3JpdGUoZmQsICJcbiIsIDEpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MGIzNjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw3MCBAQAorY2NfbGlicmFyeV9zdGF0aWMgeworCisgICAgc3JjczogWworICAgICAgICAiSldha2VMb2NrLmNwcCIsCisgICAgICAgICJHZW5lcmljU291cmNlMi5jcHAiLAorICAgICAgICAiSFRUUExpdmVTb3VyY2UyLmNwcCIsCisgICAgICAgICJOdVBsYXllcjIuY3BwIiwKKyAgICAgICAgIk51UGxheWVyMkNDRGVjb2Rlci5jcHAiLAorICAgICAgICAiTnVQbGF5ZXIyRGVjb2Rlci5jcHAiLAorICAgICAgICAiTnVQbGF5ZXIyRGVjb2RlckJhc2UuY3BwIiwKKyAgICAgICAgIk51UGxheWVyMkRlY29kZXJQYXNzVGhyb3VnaC5jcHAiLAorICAgICAgICAiTnVQbGF5ZXIyRHJpdmVyLmNwcCIsCisgICAgICAgICJOdVBsYXllcjJEcm0uY3BwIiwKKyAgICAgICAgIk51UGxheWVyMlJlbmRlcmVyLmNwcCIsCisgICAgICAgICJSVFNQU291cmNlMi5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFwbGF5ZXIyX2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZSIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcCIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHByb2R1Y3RfdmFyaWFibGVzOiB7CisgICAgICAgIGRlYnVnZ2FibGU6IHsKKyAgICAgICAgICAgIGNmbGFnczogWworICAgICAgICAgICAgICAgICItREVOQUJMRV9TVEFHRUZSSUdIVF9FWFBFUklNRU5UUyIsCisgICAgICAgICAgICBdLAorICAgICAgICB9CisgICAgfSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhZHJtIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICAgICAgImxpYnBvd2VybWFuYWdlciIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAorICAgIF0sCisKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbnVwbGF5ZXIyIiwKKworICAgIHRhZ3M6IFsiZW5nIl0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0dlbmVyaWNTb3VyY2UyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvR2VuZXJpY1NvdXJjZTIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NmIxMDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0dlbmVyaWNTb3VyY2UyLmNwcApAQCAtMCwwICsxLDE2MTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiR2VuZXJpY1NvdXJjZTIiCisKKyNpbmNsdWRlICJHZW5lcmljU291cmNlMi5oIgorI2luY2x1ZGUgIk51UGxheWVyMkRybS5oIgorCisjaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUJ1ZmZlckhvbGRlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka1dyYXBwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNsb2NrLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9OZGtVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSAiLi4vLi4vbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCIKKyNpbmNsdWRlICIuLi8uLi9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IGludCBrSW5pdGlhbE1hcmtNcyAgICAgICAgPSA1MDAwOyAgLy8gNXNlY3MKKworLy9zdGF0aWMgY29uc3QgaW50IGtQYXVzZVBsYXliYWNrTWFya01zICA9IDIwMDA7ICAvLyAyc2Vjcworc3RhdGljIGNvbnN0IGludCBrUmVzdW1lUGxheWJhY2tNYXJrTXMgPSAxNTAwMDsgIC8vIDE1c2VjcworCitOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpHZW5lcmljU291cmNlMigKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2spCisgICAgOiBTb3VyY2Uobm90aWZ5KSwKKyAgICAgIG1BdWRpb1RpbWVVcygwKSwKKyAgICAgIG1BdWRpb0xhc3REZXF1ZXVlVGltZVVzKDApLAorICAgICAgbVZpZGVvVGltZVVzKDApLAorICAgICAgbVZpZGVvTGFzdERlcXVldWVUaW1lVXMoMCksCisgICAgICBtUHJldkJ1ZmZlclBlcmNlbnRhZ2UoLTEpLAorICAgICAgbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uKDApLAorICAgICAgbVNlbnRQYXVzZU9uQnVmZmVyaW5nKGZhbHNlKSwKKyAgICAgIG1BdWRpb0RhdGFHZW5lcmF0aW9uKDApLAorICAgICAgbVZpZGVvRGF0YUdlbmVyYXRpb24oMCksCisgICAgICBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uKDApLAorICAgICAgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24oMCksCisgICAgICBtRHVyYXRpb25VcygtMWxsKSwKKyAgICAgIG1BdWRpb0lzVm9yYmlzKGZhbHNlKSwKKyAgICAgIG1Jc1NlY3VyZShmYWxzZSksCisgICAgICBtSXNTdHJlYW1pbmcoZmFsc2UpLAorICAgICAgbVVJRCh1aWQpLAorICAgICAgbU1lZGlhQ2xvY2sobWVkaWFDbG9jayksCisgICAgICBtRmQoLTEpLAorICAgICAgbUJpdHJhdGUoLTFsbCksCisgICAgICBtUGVuZGluZ1JlYWRCdWZmZXJUeXBlcygwKSB7CisgICAgQUxPR1YoIkdlbmVyaWNTb3VyY2UyIik7CisgICAgQ0hFQ0sobWVkaWFDbG9jayAhPSBOVUxMKTsKKworICAgIG1CdWZmZXJpbmdTZXR0aW5ncy5tSW5pdGlhbE1hcmtNcyA9IGtJbml0aWFsTWFya01zOworICAgIG1CdWZmZXJpbmdTZXR0aW5ncy5tUmVzdW1lUGxheWJhY2tNYXJrTXMgPSBrUmVzdW1lUGxheWJhY2tNYXJrTXM7CisgICAgcmVzZXREYXRhU291cmNlKCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6cmVzZXREYXRhU291cmNlKCkgeworICAgIEFMT0dWKCJyZXNldERhdGFTb3VyY2UiKTsKKworICAgIG1IVFRQU2VydmljZS5jbGVhcigpOworICAgIG1IdHRwU291cmNlLmNsZWFyKCk7CisgICAgbURpc2Nvbm5lY3RlZCA9IGZhbHNlOworICAgIG1VcmkuY2xlYXIoKTsKKyAgICBtVXJpSGVhZGVycy5jbGVhcigpOworICAgIGlmIChtRmQgPj0gMCkgeworICAgICAgICBjbG9zZShtRmQpOworICAgICAgICBtRmQgPSAtMTsKKyAgICB9CisgICAgbU9mZnNldCA9IDA7CisgICAgbUxlbmd0aCA9IDA7CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBtUHJlcGFyaW5nID0gZmFsc2U7CisKKyAgICBtSXNEcm1Qcm90ZWN0ZWQgPSBmYWxzZTsKKyAgICBtSXNEcm1SZWxlYXNlZCA9IGZhbHNlOworICAgIG1Jc1NlY3VyZSA9IGZhbHNlOworICAgIG1NaW1lcy5jbGVhcigpOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpzZXREYXRhU291cmNlKAorICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEFMT0dWKCJzZXREYXRhU291cmNlIHVybDogJXMiLCB1cmwpOworCisgICAgcmVzZXREYXRhU291cmNlKCk7CisKKyAgICBtSFRUUFNlcnZpY2UgPSBodHRwU2VydmljZTsKKyAgICBtVXJpID0gdXJsOworCisgICAgaWYgKGhlYWRlcnMpIHsKKyAgICAgICAgbVVyaUhlYWRlcnMgPSAqaGVhZGVyczsKKyAgICB9CisKKyAgICAvLyBkZWxheSBkYXRhIHNvdXJjZSBjcmVhdGlvbiB0byBwcmVwYXJlQXN5bmMoKSB0byBhdm9pZCBibG9ja2luZworICAgIC8vIHRoZSBjYWxsaW5nIHRocmVhZCBpbiBzZXREYXRhU291cmNlIGZvciBhbnkgc2lnbmlmaWNhbnQgdGltZS4KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnNldERhdGFTb3VyY2UoCisgICAgICAgIGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZSAlZC8lbGxkLyVsbGQiLCBmZCwgKGxvbmcgbG9uZylvZmZzZXQsIChsb25nIGxvbmcpbGVuZ3RoKTsKKworICAgIHJlc2V0RGF0YVNvdXJjZSgpOworCisgICAgbUZkID0gZHVwKGZkKTsKKyAgICBtT2Zmc2V0ID0gb2Zmc2V0OworICAgIG1MZW5ndGggPSBsZW5ndGg7CisKKyAgICAvLyBkZWxheSBkYXRhIHNvdXJjZSBjcmVhdGlvbiB0byBwcmVwYXJlQXN5bmMoKSB0byBhdm9pZCBibG9ja2luZworICAgIC8vIHRoZSBjYWxsaW5nIHRocmVhZCBpbiBzZXREYXRhU291cmNlIGZvciBhbnkgc2lnbmlmaWNhbnQgdGltZS4KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnNldERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4mIHNvdXJjZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQUxPR1YoInNldERhdGFTb3VyY2UgKHNvdXJjZTogJXApIiwgc291cmNlLmdldCgpKTsKKworICAgIHJlc2V0RGF0YVNvdXJjZSgpOworICAgIG1EYXRhU291cmNlID0gc291cmNlOworICAgIHJldHVybiBPSzsKK30KKworc3A8TWV0YURhdGE+IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OmdldEZpbGVGb3JtYXRNZXRhKCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1GaWxlTWV0YTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6aW5pdEZyb21EYXRhU291cmNlKCkgeworICAgIG1FeHRyYWN0b3IgPSBuZXcgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcihBTWVkaWFFeHRyYWN0b3JfbmV3KCkpOworICAgIENIRUNLKG1EYXRhU291cmNlICE9IE5VTEwgfHwgbUZkICE9IC0xKTsKKyAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gbURhdGFTb3VyY2U7CisgICAgY29uc3QgaW50IGZkID0gbUZkOworICAgIGNvbnN0IGludDY0X3Qgb2Zmc2V0ID0gbU9mZnNldDsKKyAgICBjb25zdCBpbnQ2NF90IGxlbmd0aCA9IG1MZW5ndGg7CisKKyAgICBtTG9jay51bmxvY2soKTsKKyAgICAvLyBUaGlzIG1pZ2h0IHRha2UgbG9uZyB0aW1lIGlmIGRhdGEgc291cmNlIGlzIG5vdCByZWxpYWJsZS4KKyAgICBzdGF0dXNfdCBlcnI7CisgICAgaWYgKGRhdGFTb3VyY2UgIT0gbnVsbHB0cikgeworICAgICAgICBtRGF0YVNvdXJjZVdyYXBwZXIgPSBuZXcgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoZGF0YVNvdXJjZSk7CisgICAgICAgIGVyciA9IG1FeHRyYWN0b3ItPnNldERhdGFTb3VyY2UobURhdGFTb3VyY2VXcmFwcGVyLT5nZXRBTWVkaWFEYXRhU291cmNlKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGVyciA9IG1FeHRyYWN0b3ItPnNldERhdGFTb3VyY2UoZmQsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJpbml0RnJvbURhdGFTb3VyY2UsIGZhaWxlZCB0byBjcmVhdGUgZGF0YSBzb3VyY2UhIik7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgc2l6ZV90IG51bXRyYWNrcyA9IG1FeHRyYWN0b3ItPmdldFRyYWNrQ291bnQoKTsKKyAgICBpZiAobnVtdHJhY2tzID09IDApIHsKKyAgICAgICAgQUxPR0UoImluaXRGcm9tRGF0YVNvdXJjZSwgc291cmNlIGhhcyBubyB0cmFjayEiKTsKKyAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBtTG9jay5sb2NrKCk7CisgICAgbUZkID0gLTE7CisgICAgbURhdGFTb3VyY2UgPSBkYXRhU291cmNlOworICAgIG1GaWxlTWV0YSA9IGNvbnZlcnRNZWRpYUZvcm1hdFdyYXBwZXJUb01ldGFEYXRhKG1FeHRyYWN0b3ItPmdldEZvcm1hdCgpKTsKKyAgICBpZiAobUZpbGVNZXRhICE9IE5VTEwpIHsKKyAgICAgICAgaW50NjRfdCBkdXJhdGlvbjsKKyAgICAgICAgaWYgKG1GaWxlTWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uKSkgeworICAgICAgICAgICAgbUR1cmF0aW9uVXMgPSBkdXJhdGlvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludDMyX3QgdG90YWxCaXRyYXRlID0gMDsKKworICAgIG1NaW1lcy5jbGVhcigpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW10cmFja3M7ICsraSkgeworCisgICAgICAgIHNwPEFNZWRpYUZvcm1hdFdyYXBwZXI+IHRyYWNrRm9ybWF0ID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2tGb3JtYXQoaSk7CisgICAgICAgIGlmICh0cmFja0Zvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgibm8gbWV0YWRhdGEgZm9yIHRyYWNrICV6dSIsIGkpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBzcDxBTWVkaWFFeHRyYWN0b3JXcmFwcGVyPiB0cmFja0V4dHJhY3RvciA9IG5ldyBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyKEFNZWRpYUV4dHJhY3Rvcl9uZXcoKSk7CisgICAgICAgIGlmIChtRGF0YVNvdXJjZVdyYXBwZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZXJyID0gdHJhY2tFeHRyYWN0b3ItPnNldERhdGFTb3VyY2UobURhdGFTb3VyY2VXcmFwcGVyLT5nZXRBTWVkaWFEYXRhU291cmNlKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXJyID0gdHJhY2tFeHRyYWN0b3ItPnNldERhdGFTb3VyY2UoZmQsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gY29udmVydE1lZGlhRm9ybWF0V3JhcHBlclRvTWV0YURhdGEodHJhY2tGb3JtYXQpOworICAgICAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisKKyAgICAgICAgQUxPR1YoImluaXRGcm9tRGF0YVNvdXJjZSB0cmFja1slenVdOiAlcyIsIGksIG1pbWUpOworCisgICAgICAgIC8vIERvIHRoZSBzdHJpbmcgY29tcGFyZSBpbW1lZGlhdGVseSB3aXRoICJtaW1lIiwKKyAgICAgICAgLy8gd2UgY2FuJ3QgYXNzdW1lICJtaW1lIiB3b3VsZCBzdGF5IHZhbGlkIGFmdGVyIGFub3RoZXIKKyAgICAgICAgLy8gZXh0cmFjdG9yIG9wZXJhdGlvbiwgc29tZSBleHRyYWN0b3JzIG1pZ2h0IG1vZGlmeSBtZXRhCisgICAgICAgIC8vIGR1cmluZyBnZXRUcmFjaygpIGFuZCBtYWtlIGl0IGludmFsaWQuCisgICAgICAgIGlmICghc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpKSB7CisgICAgICAgICAgICBpZiAobUF1ZGlvVHJhY2subUV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2subUluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBtQXVkaW9UcmFjay5tRXh0cmFjdG9yID0gdHJhY2tFeHRyYWN0b3I7CisgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2subUV4dHJhY3Rvci0+c2VsZWN0VHJhY2soaSk7CisgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2subVBhY2tldHMgPSBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShtZXRhKTsKKworICAgICAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpKSB7CisgICAgICAgICAgICAgICAgICAgIG1BdWRpb0lzVm9yYmlzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtQXVkaW9Jc1ZvcmJpcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1NaW1lcy5hZGQoU3RyaW5nOChtaW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby8iLCA2KSkgeworICAgICAgICAgICAgaWYgKG1WaWRlb1RyYWNrLm1FeHRyYWN0b3IgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1WaWRlb1RyYWNrLm1JbmRleCA9IGk7CisgICAgICAgICAgICAgICAgbVZpZGVvVHJhY2subUV4dHJhY3RvciA9IHRyYWNrRXh0cmFjdG9yOworICAgICAgICAgICAgICAgIG1WaWRlb1RyYWNrLm1FeHRyYWN0b3ItPnNlbGVjdFRyYWNrKGkpOworICAgICAgICAgICAgICAgIG1WaWRlb1RyYWNrLm1QYWNrZXRzID0gbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UobWV0YSk7CisKKyAgICAgICAgICAgICAgICAvLyB2aWRlbyBhbHdheXMgYXQgdGhlIGJlZ2lubmluZworICAgICAgICAgICAgICAgIG1NaW1lcy5pbnNlcnRBdChTdHJpbmc4KG1pbWUpLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1FeHRyYWN0b3JzLnB1c2godHJhY2tFeHRyYWN0b3IpOworICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgICAgIGlmIChtZXRhLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKKyAgICAgICAgICAgIGlmIChkdXJhdGlvblVzID4gbUR1cmF0aW9uVXMpIHsKKyAgICAgICAgICAgICAgICBtRHVyYXRpb25VcyA9IGR1cmF0aW9uVXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGJpdHJhdGU7CisgICAgICAgIGlmICh0b3RhbEJpdHJhdGUgPj0gMCAmJiBtZXRhLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZiaXRyYXRlKSkgeworICAgICAgICAgICAgdG90YWxCaXRyYXRlICs9IGJpdHJhdGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0b3RhbEJpdHJhdGUgPSAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJpbml0RnJvbURhdGFTb3VyY2UgbUV4dHJhY3RvcnMuc2l6ZSgpOiAlenUgIG1Jc1NlY3VyZTogJWQgIG1pbWVbMF06ICVzIiwgbUV4dHJhY3RvcnMuc2l6ZSgpLAorICAgICAgICAgICAgbUlzU2VjdXJlLCAobU1pbWVzLmlzRW1wdHkoKSA/ICJOT05FIiA6IG1NaW1lc1swXS5zdHJpbmcoKSkpOworCisgICAgaWYgKG1FeHRyYWN0b3JzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJiLzIzNzA1Njk1Iik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIC8vIE1vZHVsYXIgRFJNOiBUaGUgcmV0dXJuIHZhbHVlIGRvZXNuJ3QgYWZmZWN0IHNvdXJjZSBpbml0aWFsaXphdGlvbi4KKyAgICAodm9pZCljaGVja0RybUluZm8oKTsKKworICAgIG1CaXRyYXRlID0gdG90YWxCaXRyYXRlOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpnZXRCdWZmZXJpbmdTZXR0aW5ncygKKyAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSB7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICAqYnVmZmVyaW5nID0gbUJ1ZmZlcmluZ1NldHRpbmdzOworICAgIH0KKworICAgIEFMT0dWKCJnZXRCdWZmZXJpbmdTZXR0aW5nc3slc30iLCBidWZmZXJpbmctPnRvU3RyaW5nKCkuc3RyaW5nKCkpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6c2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgeworICAgIEFMT0dWKCJzZXRCdWZmZXJpbmdTZXR0aW5nc3slc30iLCBidWZmZXJpbmcudG9TdHJpbmcoKS5zdHJpbmcoKSk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1CdWZmZXJpbmdTZXR0aW5ncyA9IGJ1ZmZlcmluZzsKKyAgICByZXR1cm4gT0s7Cit9CisKK2ludDY0X3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6Z2V0TGFzdFJlYWRQb3NpdGlvbigpIHsKKyAgICBpZiAobUF1ZGlvVHJhY2subUV4dHJhY3RvciAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBtQXVkaW9UaW1lVXM7CisgICAgfSBlbHNlIGlmIChtVmlkZW9UcmFjay5tRXh0cmFjdG9yICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIG1WaWRlb1RpbWVVczsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK2Jvb2wgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6aXNTdHJlYW1pbmcoKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUlzU3RyZWFtaW5nOworfQorCitOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjp+R2VuZXJpY1NvdXJjZTIoKSB7CisgICAgQUxPR1YoIn5HZW5lcmljU291cmNlMiIpOworICAgIGlmIChtTG9vcGVyICE9IE5VTEwpIHsKKyAgICAgICAgbUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIoaWQoKSk7CisgICAgICAgIG1Mb29wZXItPnN0b3AoKTsKKyAgICB9CisgICAgaWYgKG1EYXRhU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgbURhdGFTb3VyY2UtPmNsb3NlKCk7CisgICAgfQorICAgIHJlc2V0RGF0YVNvdXJjZSgpOworfQorCit2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnByZXBhcmVBc3luYygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEFMT0dWKCJwcmVwYXJlQXN5bmM6IChsb29wZXI6ICVkKSIsIChtTG9vcGVyICE9IE5VTEwpKTsKKworICAgIGlmIChtTG9vcGVyID09IE5VTEwpIHsKKyAgICAgICAgbUxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgICAgICBtTG9vcGVyLT5zZXROYW1lKCJnZW5lcmljIik7CisgICAgICAgIG1Mb29wZXItPnN0YXJ0KGZhbHNlLCAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgIC8qIGNhbkNhbGxKYXZhICovCisgICAgICAgICAgICAgICAgICAgICAgIFBSSU9SSVRZX0RFRkFVTFQpOworCisgICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UHJlcGFyZUFzeW5jLCB0aGlzKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpvblByZXBhcmVBc3luYygpIHsKKyAgICBBTE9HVigib25QcmVwYXJlQXN5bmM6IG1EYXRhU291cmNlOiAlZCIsIChtRGF0YVNvdXJjZSAhPSBOVUxMKSk7CisKKyAgICAvLyBkZWxheWVkIGRhdGEgc291cmNlIGNyZWF0aW9uCisgICAgaWYgKG1EYXRhU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgLy8gc2V0IHRvIGZhbHNlIGZpcnN0LCBpZiB0aGUgZXh0cmFjdG9yCisgICAgICAgIC8vIGNvbWVzIGJhY2sgYXMgc2VjdXJlLCBzZXQgaXQgdG8gdHJ1ZSB0aGVuLgorICAgICAgICBtSXNTZWN1cmUgPSBmYWxzZTsKKworICAgICAgICBpZiAoIW1VcmkuZW1wdHkoKSkgeworICAgICAgICAgICAgY29uc3QgY2hhciogdXJpID0gbVVyaS5jX3N0cigpOworICAgICAgICAgICAgU3RyaW5nOCBjb250ZW50VHlwZTsKKworICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgiaHR0cDovLyIsIHVyaSwgNykgfHwgIXN0cm5jYXNlY21wKCJodHRwczovLyIsIHVyaSwgOCkpIHsKKyAgICAgICAgICAgICAgICBtSHR0cFNvdXJjZSA9IERhdGFTb3VyY2VGYWN0b3J5OjpDcmVhdGVNZWRpYUhUVFAobUhUVFBTZXJ2aWNlKTsKKyAgICAgICAgICAgICAgICBpZiAobUh0dHBTb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBodHRwIHNvdXJjZSEiKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKFVOS05PV05fRVJST1IpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIC8vIFRoaXMgbWlnaHQgdGFrZSBsb25nIHRpbWUgaWYgY29ubmVjdGlvbiBoYXMgc29tZSBpc3N1ZS4KKyAgICAgICAgICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPSBEYXRhU291cmNlRmFjdG9yeTo6Q3JlYXRlRnJvbVVSSSgKKyAgICAgICAgICAgICAgICAgICBtSFRUUFNlcnZpY2UsIHVyaSwgJm1VcmlIZWFkZXJzLCAmY29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRUUEJhc2UgKj4obUh0dHBTb3VyY2UuZ2V0KCkpKTsKKyAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgICAgIGlmICghbURpc2Nvbm5lY3RlZCkgeworICAgICAgICAgICAgICAgIG1EYXRhU291cmNlID0gZGF0YVNvdXJjZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRmQgPT0gLTEgJiYgbURhdGFTb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgZGF0YSBzb3VyY2UhIik7CisgICAgICAgICAgICBub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoVU5LTk9XTl9FUlJPUik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobURhdGFTb3VyY2UgIT0gbnVsbHB0ciAmJiBtRGF0YVNvdXJjZS0+ZmxhZ3MoKSAmIERhdGFTb3VyY2U6OmtJc0NhY2hpbmdEYXRhU291cmNlKSB7CisgICAgICAgIG1DYWNoZWRTb3VyY2UgPSBzdGF0aWNfY2FzdDxOdUNhY2hlZFNvdXJjZTIgKj4obURhdGFTb3VyY2UuZ2V0KCkpOworICAgIH0KKworICAgIC8vIEZvciBjYWNoZWQgc3RyZWFtaW5nIGNhc2VzLCB3ZSBuZWVkIHRvIHdhaXQgZm9yIGVub3VnaAorICAgIC8vIGJ1ZmZlcmluZyBiZWZvcmUgcmVwb3J0aW5nIHByZXBhcmVkLgorICAgIG1Jc1N0cmVhbWluZyA9IChtQ2FjaGVkU291cmNlICE9IE5VTEwpOworCisgICAgLy8gaW5pdCBleHRyYWN0b3IgZnJvbSBkYXRhIHNvdXJjZQorICAgIHN0YXR1c190IGVyciA9IGluaXRGcm9tRGF0YVNvdXJjZSgpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXQgZnJvbSBkYXRhIHNvdXJjZSEiKTsKKyAgICAgICAgbm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobVZpZGVvVHJhY2subUV4dHJhY3RvciAhPSBOVUxMKSB7CisgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gZ2V0Rm9ybWF0TWV0YV9sKGZhbHNlIC8qIGF1ZGlvICovKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgZXJyID0gY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKG1ldGEsICZtc2cpOworICAgICAgICBpZihlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChlcnIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQobXNnKTsKKyAgICB9CisKKyAgICBub3RpZnlGbGFnc0NoYW5nZWQoCisgICAgICAgICAgICAvLyBGTEFHX1NFQ1VSRSB3aWxsIGJlIGtub3duIGlmL3doZW4gcHJlcGFyZURybSBpcyBjYWxsZWQgYnkgdGhlIGFwcAorICAgICAgICAgICAgLy8gRkxBR19QUk9URUNURUQgd2lsbCBiZSBrbm93biBpZi93aGVuIHByZXBhcmVEcm0gaXMgY2FsbGVkIGJ5IHRoZSBhcHAKKyAgICAgICAgICAgIEZMQUdfQ0FOX1BBVVNFIHwKKyAgICAgICAgICAgIEZMQUdfQ0FOX1NFRUtfQkFDS1dBUkQgfAorICAgICAgICAgICAgRkxBR19DQU5fU0VFS19GT1JXQVJEIHwKKyAgICAgICAgICAgIEZMQUdfQ0FOX1NFRUspOworCisgICAgZmluaXNoUHJlcGFyZUFzeW5jKCk7CisKKyAgICBBTE9HVigib25QcmVwYXJlQXN5bmM6IERvbmUiKTsKK30KKwordm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpmaW5pc2hQcmVwYXJlQXN5bmMoKSB7CisgICAgQUxPR1YoImZpbmlzaFByZXBhcmVBc3luYyIpOworCisgICAgaWYgKG1Jc1N0cmVhbWluZykgeworICAgICAgICBtQ2FjaGVkU291cmNlLT5yZXN1bWVGZXRjaGluZ0lmTmVjZXNzYXJ5KCk7CisgICAgICAgIG1QcmVwYXJpbmcgPSB0cnVlOworICAgICAgICBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBub3RpZnlQcmVwYXJlZCgpOworICAgIH0KKworICAgIGlmIChtQXVkaW9UcmFjay5tRXh0cmFjdG9yICE9IE5VTEwpIHsKKyAgICAgICAgcG9zdFJlYWRCdWZmZXIoTUVESUFfVFJBQ0tfVFlQRV9BVURJTyk7CisgICAgfQorCisgICAgaWYgKG1WaWRlb1RyYWNrLm1FeHRyYWN0b3IgIT0gTlVMTCkgeworICAgICAgICBwb3N0UmVhZEJ1ZmZlcihNRURJQV9UUkFDS19UWVBFX1ZJREVPKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6bm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKHN0YXR1c190IGVycikgeworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgbURhdGFTb3VyY2UuY2xlYXIoKTsKKyAgICAgICAgbUNhY2hlZFNvdXJjZS5jbGVhcigpOworICAgICAgICBtSHR0cFNvdXJjZS5jbGVhcigpOworCisgICAgICAgIG1CaXRyYXRlID0gLTE7CisgICAgICAgIG1QcmV2QnVmZmVyUGVyY2VudGFnZSA9IC0xOworICAgICAgICArK21Qb2xsQnVmZmVyaW5nR2VuZXJhdGlvbjsKKyAgICB9CisgICAgbm90aWZ5UHJlcGFyZWQoZXJyKTsKK30KKwordm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpzdGFydCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEFMT0dJKCJzdGFydCIpOworCisgICAgaWYgKG1BdWRpb1RyYWNrLm1FeHRyYWN0b3IgIT0gTlVMTCkgeworICAgICAgICBwb3N0UmVhZEJ1ZmZlcihNRURJQV9UUkFDS19UWVBFX0FVRElPKTsKKyAgICB9CisKKyAgICBpZiAobVZpZGVvVHJhY2subUV4dHJhY3RvciAhPSBOVUxMKSB7CisgICAgICAgIHBvc3RSZWFkQnVmZmVyKE1FRElBX1RSQUNLX1RZUEVfVklERU8pOworICAgIH0KKworICAgIG1TdGFydGVkID0gdHJ1ZTsKK30KKwordm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpzdG9wKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKK30KKwordm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpwYXVzZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1TdGFydGVkID0gZmFsc2U7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6cmVzdW1lKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbVN0YXJ0ZWQgPSB0cnVlOworfQorCit2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OmRpc2Nvbm5lY3QoKSB7CisgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSwgaHR0cFNvdXJjZTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGRhdGFTb3VyY2UgPSBtRGF0YVNvdXJjZTsKKyAgICAgICAgaHR0cFNvdXJjZSA9IG1IdHRwU291cmNlOworICAgICAgICBtRGlzY29ubmVjdGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoZGF0YVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIC8vIGRpc2Nvbm5lY3QgZGF0YSBzb3VyY2UKKyAgICAgICAgaWYgKGRhdGFTb3VyY2UtPmZsYWdzKCkgJiBEYXRhU291cmNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSkgeworICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TnVDYWNoZWRTb3VyY2UyICo+KGRhdGFTb3VyY2UuZ2V0KCkpLT5kaXNjb25uZWN0KCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGh0dHBTb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBzdGF0aWNfY2FzdDxIVFRQQmFzZSAqPihodHRwU291cmNlLmdldCgpKS0+ZGlzY29ubmVjdCgpOworICAgIH0KKworICAgIG1EYXRhU291cmNlV3JhcHBlciA9IE5VTEw7CisKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6ZmVlZE1vcmVUU0RhdGEoKSB7CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnNlbmRDYWNoZVN0YXRzKCkgeworICAgIGludDMyX3Qga2JwcyA9IDA7CisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKworICAgIGlmIChtQ2FjaGVkU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgZXJyID0gbUNhY2hlZFNvdXJjZS0+Z2V0RXN0aW1hdGVkQmFuZHdpZHRoS2Jwcygma2Jwcyk7CisgICAgfQorCisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdENhY2hlU3RhdHMpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJiYW5kd2lkdGgiLCBrYnBzKTsKKyAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICBjYXNlIGtXaGF0UHJlcGFyZUFzeW5jOgorICAgICAgeworICAgICAgICAgIG9uUHJlcGFyZUFzeW5jKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGE6CisgICAgICB7CisgICAgICAgICAgZmV0Y2hUZXh0RGF0YShrV2hhdFNlbmRTdWJ0aXRsZURhdGEsIE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUsCisgICAgICAgICAgICAgICAgICBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uLCBtU3VidGl0bGVUcmFjay5tUGFja2V0cywgbXNnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBrV2hhdEZldGNoVGltZWRUZXh0RGF0YToKKyAgICAgIHsKKyAgICAgICAgICBmZXRjaFRleHREYXRhKGtXaGF0U2VuZFRpbWVkVGV4dERhdGEsIE1FRElBX1RSQUNLX1RZUEVfVElNRURURVhULAorICAgICAgICAgICAgICAgICAgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24sIG1UaW1lZFRleHRUcmFjay5tUGFja2V0cywgbXNnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBrV2hhdFNlbmRTdWJ0aXRsZURhdGE6CisgICAgICB7CisgICAgICAgICAgc2VuZFRleHREYXRhKGtXaGF0U3VidGl0bGVEYXRhLCBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFLAorICAgICAgICAgICAgICAgICAgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbiwgbVN1YnRpdGxlVHJhY2subVBhY2tldHMsIG1zZyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2Uga1doYXRTZW5kR2xvYmFsVGltZWRUZXh0RGF0YToKKyAgICAgIHsKKyAgICAgICAgICBzZW5kR2xvYmFsVGV4dERhdGEoa1doYXRUaW1lZFRleHREYXRhLCBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbiwgbXNnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2Uga1doYXRTZW5kVGltZWRUZXh0RGF0YToKKyAgICAgIHsKKyAgICAgICAgICBzZW5kVGV4dERhdGEoa1doYXRUaW1lZFRleHREYXRhLCBNRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVCwKKyAgICAgICAgICAgICAgICAgIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uLCBtVGltZWRUZXh0VHJhY2subVBhY2tldHMsIG1zZyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2Uga1doYXRDaGFuZ2VBVlNvdXJjZToKKyAgICAgIHsKKyAgICAgICAgICBpbnQzMl90IHRyYWNrSW5kZXg7CisgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInRyYWNrSW5kZXgiLCAmdHJhY2tJbmRleCkpOworICAgICAgICAgIGNvbnN0IHNwPEFNZWRpYUV4dHJhY3RvcldyYXBwZXI+IGV4dHJhY3RvciA9IG1FeHRyYWN0b3JzLml0ZW1BdCh0cmFja0luZGV4KTsKKworICAgICAgICAgIFRyYWNrKiB0cmFjazsKKyAgICAgICAgICBBU3RyaW5nIG1pbWU7CisgICAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUsIGNvdW50ZXJwYXJ0VHlwZTsKKyAgICAgICAgICBzcDxBTWVkaWFGb3JtYXRXcmFwcGVyPiBmb3JtYXQgPSBleHRyYWN0b3ItPmdldFRyYWNrRm9ybWF0KHRyYWNrSW5kZXgpOworICAgICAgICAgIGZvcm1hdC0+Z2V0U3RyaW5nKEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpOworICAgICAgICAgIGlmICghc3RybmNhc2VjbXAobWltZS5jX3N0cigpLCAiYXVkaW8vIiwgNikpIHsKKyAgICAgICAgICAgICAgdHJhY2sgPSAmbUF1ZGlvVHJhY2s7CisgICAgICAgICAgICAgIHRyYWNrVHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfQVVESU87CisgICAgICAgICAgICAgIGNvdW50ZXJwYXJ0VHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfVklERU87OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIENIRUNLKCFzdHJuY2FzZWNtcChtaW1lLmNfc3RyKCksICJ2aWRlby8iLCA2KSk7CisgICAgICAgICAgICAgIHRyYWNrID0gJm1WaWRlb1RyYWNrOworICAgICAgICAgICAgICB0cmFja1R5cGUgPSBNRURJQV9UUkFDS19UWVBFX1ZJREVPOworICAgICAgICAgICAgICBjb3VudGVycGFydFR5cGUgPSBNRURJQV9UUkFDS19UWVBFX0FVRElPOzsKKyAgICAgICAgICB9CisKKworICAgICAgICAgIHRyYWNrLT5tRXh0cmFjdG9yID0gZXh0cmFjdG9yOworICAgICAgICAgIHRyYWNrLT5tRXh0cmFjdG9yLT5zZWxlY3RTaW5nbGVUcmFjayh0cmFja0luZGV4KTsKKyAgICAgICAgICB0cmFjay0+bUluZGV4ID0gdHJhY2tJbmRleDsKKyAgICAgICAgICArK21BdWRpb0RhdGFHZW5lcmF0aW9uOworICAgICAgICAgICsrbVZpZGVvRGF0YUdlbmVyYXRpb247CisKKyAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgYWN0dWFsVGltZVVzOworICAgICAgICAgIGNvbnN0IGJvb2wgZm9ybWF0Q2hhbmdlID0gdHJ1ZTsKKyAgICAgICAgICBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgICAgdGltZVVzID0gbUF1ZGlvTGFzdERlcXVldWVUaW1lVXM7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgdGltZVVzID0gbVZpZGVvTGFzdERlcXVldWVUaW1lVXM7CisgICAgICAgICAgfQorICAgICAgICAgIHJlYWRCdWZmZXIodHJhY2tUeXBlLCB0aW1lVXMsIE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMgLyogbW9kZSAqLywKKyAgICAgICAgICAgICAgICAgICZhY3R1YWxUaW1lVXMsIGZvcm1hdENoYW5nZSk7CisgICAgICAgICAgcmVhZEJ1ZmZlcihjb3VudGVycGFydFR5cGUsIC0xLCBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DIC8qIG1vZGUgKi8sCisgICAgICAgICAgICAgICAgICBOVUxMLCAhZm9ybWF0Q2hhbmdlKTsKKyAgICAgICAgICBBTE9HVigidGltZVVzICVsbGQgYWN0dWFsVGltZVVzICVsbGQiLCAobG9uZyBsb25nKXRpbWVVcywgKGxvbmcgbG9uZylhY3R1YWxUaW1lVXMpOworCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGNhc2Uga1doYXRTZWVrOgorICAgICAgeworICAgICAgICAgIG9uU2Vlayhtc2cpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBjYXNlIGtXaGF0UmVhZEJ1ZmZlcjoKKyAgICAgIHsKKyAgICAgICAgICBvblJlYWRCdWZmZXIobXNnKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBrV2hhdFBvbGxCdWZmZXJpbmc6CisgICAgICB7CisgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiA9PSBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgb25Qb2xsQnVmZmVyaW5nKCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBkZWZhdWx0OgorICAgICAgICAgIFNvdXJjZTo6b25NZXNzYWdlUmVjZWl2ZWQobXNnKTsKKyAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6ZmV0Y2hUZXh0RGF0YSgKKyAgICAgICAgdWludDMyX3Qgc2VuZFdoYXQsCisgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSwKKyAgICAgICAgaW50MzJfdCBjdXJHZW4sCisgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+JiBwYWNrZXRzLAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4mIG1zZykgeworICAgIGludDMyX3QgbXNnR2VuZXJhdGlvbjsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZtc2dHZW5lcmF0aW9uKSk7CisgICAgaWYgKG1zZ0dlbmVyYXRpb24gIT0gY3VyR2VuKSB7CisgICAgICAgIC8vIHN0YWxlCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQzMl90IGF2YWlsOworICAgIGlmIChwYWNrZXRzLT5oYXNCdWZmZXJBdmFpbGFibGUoJmF2YWlsKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKworICAgIGludDY0X3Qgc3ViVGltZVVzID0gMDsKKyAgICByZWFkQnVmZmVyKHR5cGUsIHRpbWVVcywgTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQyAvKiBtb2RlICovLCAmc3ViVGltZVVzKTsKKworICAgIHN0YXR1c190IGVvc1Jlc3VsdDsKKyAgICBpZiAoIXBhY2tldHMtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZW9zUmVzdWx0KSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1zZy0+d2hhdCgpID09IGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGEpIHsKKyAgICAgICAgc3ViVGltZVVzIC09IDEwMDAwMDBsbDsgIC8vIHNlbmQgc3VidGlsZSBkYXRhIG9uZSBzZWNvbmQgZWFybGllcgorICAgIH0KKyAgICBzcDxBTWVzc2FnZT4gbXNnMiA9IG5ldyBBTWVzc2FnZShzZW5kV2hhdCwgdGhpcyk7CisgICAgbXNnMi0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtc2dHZW5lcmF0aW9uKTsKKyAgICBtTWVkaWFDbG9jay0+YWRkVGltZXIobXNnMiwgc3ViVGltZVVzKTsKK30KKwordm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpzZW5kVGV4dERhdGEoCisgICAgICAgIHVpbnQzMl90IHdoYXQsCisgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSwKKyAgICAgICAgaW50MzJfdCBjdXJHZW4sCisgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+JiBwYWNrZXRzLAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4mIG1zZykgeworICAgIGludDMyX3QgbXNnR2VuZXJhdGlvbjsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZtc2dHZW5lcmF0aW9uKSk7CisgICAgaWYgKG1zZ0dlbmVyYXRpb24gIT0gY3VyR2VuKSB7CisgICAgICAgIC8vIHN0YWxlCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQ2NF90IHN1YlRpbWVVczsKKyAgICBpZiAocGFja2V0cy0+bmV4dEJ1ZmZlclRpbWUoJnN1YlRpbWVVcykgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDY0X3QgbmV4dFN1YlRpbWVVczsKKyAgICByZWFkQnVmZmVyKHR5cGUsIC0xLCBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DIC8qIG1vZGUgKi8sICZuZXh0U3ViVGltZVVzKTsKKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICBzdGF0dXNfdCBkZXF1ZXVlU3RhdHVzID0gcGFja2V0cy0+ZGVxdWV1ZUFjY2Vzc1VuaXQoJmJ1ZmZlcik7CisgICAgaWYgKGRlcXVldWVTdGF0dXMgPT0gT0spIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwgd2hhdCk7CisgICAgICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJidWZmZXIiLCBidWZmZXIpOworICAgICAgICBub3RpZnktPnBvc3QoKTsKKworICAgICAgICBpZiAobXNnLT53aGF0KCkgPT0ga1doYXRTZW5kU3VidGl0bGVEYXRhKSB7CisgICAgICAgICAgICBuZXh0U3ViVGltZVVzIC09IDEwMDAwMDBsbDsgIC8vIHNlbmQgc3VidGlsZSBkYXRhIG9uZSBzZWNvbmQgZWFybGllcgorICAgICAgICB9CisgICAgICAgIG1NZWRpYUNsb2NrLT5hZGRUaW1lcihtc2csIG5leHRTdWJUaW1lVXMpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpzZW5kR2xvYmFsVGV4dERhdGEoCisgICAgICAgIHVpbnQzMl90IHdoYXQsCisgICAgICAgIGludDMyX3QgY3VyR2VuLAorICAgICAgICBzcDxBTWVzc2FnZT4gbXNnKSB7CisgICAgaW50MzJfdCBtc2dHZW5lcmF0aW9uOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJm1zZ0dlbmVyYXRpb24pKTsKKyAgICBpZiAobXNnR2VuZXJhdGlvbiAhPSBjdXJHZW4pIHsKKyAgICAgICAgLy8gc3RhbGUKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZvaWQgKmRhdGEgPSBOVUxMOworICAgIHNpemVfdCBzaXplID0gMDsKKyAgICBpZiAobVRpbWVkVGV4dFRyYWNrLm1FeHRyYWN0b3ItPmdldFRyYWNrRm9ybWF0KG1UaW1lZFRleHRUcmFjay5tSW5kZXgpLT5nZXRCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiwgJmRhdGEsICZzaXplKSkgeworICAgICAgICBtR2xvYmFsVGltZWRUZXh0ID0gbmV3IEFCdWZmZXIoc2l6ZSk7CisgICAgICAgIGlmIChtR2xvYmFsVGltZWRUZXh0LT5kYXRhKCkpIHsKKyAgICAgICAgICAgIG1lbWNweShtR2xvYmFsVGltZWRUZXh0LT5kYXRhKCksIGRhdGEsIHNpemUpOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGdsb2JhbE1ldGEgPSBtR2xvYmFsVGltZWRUZXh0LT5tZXRhKCk7CisgICAgICAgICAgICBnbG9iYWxNZXRhLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7CisgICAgICAgICAgICBnbG9iYWxNZXRhLT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApOworICAgICAgICAgICAgZ2xvYmFsTWV0YS0+c2V0SW50MzIoImdsb2JhbCIsIDEpOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIHdoYXQpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIG1HbG9iYWxUaW1lZFRleHQpOworICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NwPEFNZXNzYWdlPiBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpnZXRGb3JtYXQoYm9vbCBhdWRpbykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIGdldEZvcm1hdF9sKGF1ZGlvKTsKK30KKworc3A8TWV0YURhdGE+IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OmdldEZvcm1hdE1ldGEoYm9vbCBhdWRpbykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIGdldEZvcm1hdE1ldGFfbChhdWRpbyk7Cit9CisKK3NwPEFNZXNzYWdlPiBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpnZXRGb3JtYXRfbChib29sIGF1ZGlvKSB7CisgICAgc3A8QU1lZGlhRXh0cmFjdG9yV3JhcHBlcj4gZXh0cmFjdG9yID0gYXVkaW8gPyBtQXVkaW9UcmFjay5tRXh0cmFjdG9yIDogbVZpZGVvVHJhY2subUV4dHJhY3RvcjsKKyAgICBzaXplX3QgdHJhY2tJbmRleCA9IGF1ZGlvID8gbUF1ZGlvVHJhY2subUluZGV4IDogbVZpZGVvVHJhY2subUluZGV4OworCisgICAgaWYgKGV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBleHRyYWN0b3ItPmdldFRyYWNrRm9ybWF0KHRyYWNrSW5kZXgpLT50b0FNZXNzYWdlKCk7Cit9CisKK3NwPE1ldGFEYXRhPiBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpnZXRGb3JtYXRNZXRhX2woYm9vbCBhdWRpbykgeworICAgIHNwPEFNZWRpYUV4dHJhY3RvcldyYXBwZXI+IGV4dHJhY3RvciA9IGF1ZGlvID8gbUF1ZGlvVHJhY2subUV4dHJhY3RvciA6IG1WaWRlb1RyYWNrLm1FeHRyYWN0b3I7CisgICAgc2l6ZV90IHRyYWNrSW5kZXggPSBhdWRpbyA/IG1BdWRpb1RyYWNrLm1JbmRleCA6IG1WaWRlb1RyYWNrLm1JbmRleDsKKworICAgIGlmIChleHRyYWN0b3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gY29udmVydE1lZGlhRm9ybWF0V3JhcHBlclRvTWV0YURhdGEoZXh0cmFjdG9yLT5nZXRUcmFja0Zvcm1hdCh0cmFja0luZGV4KSk7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OmRlcXVldWVBY2Nlc3NVbml0KAorICAgICAgICBib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgLy8gSWYgaGFzIGdvbmUgdGhyb3VnaCBzdG9wL3JlbGVhc2VEcm0gc2VxdWVuY2UsIHdlIG5vIGxvbmdlciBzZW5kIGRvd24gYW55IGJ1ZmZlciBiL2MKKyAgICAvLyB0aGUgY29kZWMncyBjcnlwdG8gb2JqZWN0IGhhcyBnb25lIGF3YXkgKGIvMzc5NjAwOTYpLgorICAgIC8vIE5vdGU6IFRoaXMgd2lsbCBiZSB1bm5lY2Vzc2FyeSB3aGVuIHN0b3AoKSBjaGFuZ2VzIGJlaGF2aW9yIGFuZCByZWxlYXNlcyBjb2RlYyAoYi8zNTI0ODI4MykuCisgICAgaWYgKCFtU3RhcnRlZCAmJiBtSXNEcm1SZWxlYXNlZCkgeworICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOworICAgIH0KKworICAgIFRyYWNrICp0cmFjayA9IGF1ZGlvID8gJm1BdWRpb1RyYWNrIDogJm1WaWRlb1RyYWNrOworCisgICAgaWYgKHRyYWNrLT5tRXh0cmFjdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FV09VTERCTE9DSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKKyAgICBpZiAoIXRyYWNrLT5tUGFja2V0cy0+aGFzQnVmZmVyQXZhaWxhYmxlKCZmaW5hbFJlc3VsdCkpIHsKKyAgICAgICAgaWYgKGZpbmFsUmVzdWx0ID09IE9LKSB7CisgICAgICAgICAgICBwb3N0UmVhZEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgYXVkaW8gPyBNRURJQV9UUkFDS19UWVBFX0FVRElPIDogTUVESUFfVFJBQ0tfVFlQRV9WSURFTyk7CisgICAgICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaW5hbFJlc3VsdDsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZXN1bHQgPSB0cmFjay0+bVBhY2tldHMtPmRlcXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOworCisgICAgLy8gc3RhcnQgcHVsbGluZyBpbiBtb3JlIGJ1ZmZlcnMgaWYgY2FjaGUgaXMgcnVubmluZyBsb3cKKyAgICAvLyBzbyB0aGF0IGRlY29kZXIgaGFzIGxlc3MgY2hhbmNlIG9mIGJlaW5nIHN0YXJ2ZWQKKyAgICBpZiAoIW1Jc1N0cmVhbWluZykgeworICAgICAgICBpZiAodHJhY2stPm1QYWNrZXRzLT5nZXRBdmFpbGFibGVCdWZmZXJDb3VudCgmZmluYWxSZXN1bHQpIDwgMikgeworICAgICAgICAgICAgcG9zdFJlYWRCdWZmZXIoYXVkaW8/IE1FRElBX1RSQUNLX1RZUEVfQVVESU8gOiBNRURJQV9UUkFDS19UWVBFX1ZJREVPKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludDY0X3QgZHVyYXRpb25VcyA9IHRyYWNrLT5tUGFja2V0cy0+Z2V0QnVmZmVyZWREdXJhdGlvblVzKCZmaW5hbFJlc3VsdCk7CisgICAgICAgIC8vIFRPRE86IG1heFJlYnVmZmVyaW5nTWFya01zIGNvdWxkIGJlIGxhcmdlciB0aGFuCisgICAgICAgIC8vIG1CdWZmZXJpbmdTZXR0aW5ncy5tUmVzdW1lUGxheWJhY2tNYXJrTXMKKyAgICAgICAgaW50NjRfdCByZXN0YXJ0QnVmZmVyaW5nTWFya1VzID0KKyAgICAgICAgICAgICBtQnVmZmVyaW5nU2V0dGluZ3MubVJlc3VtZVBsYXliYWNrTWFya01zICogMTAwMGxsIC8gMjsKKyAgICAgICAgaWYgKGZpbmFsUmVzdWx0ID09IE9LKSB7CisgICAgICAgICAgICBpZiAoZHVyYXRpb25VcyA8IHJlc3RhcnRCdWZmZXJpbmdNYXJrVXMpIHsKKyAgICAgICAgICAgICAgICBwb3N0UmVhZEJ1ZmZlcihhdWRpbz8gTUVESUFfVFJBQ0tfVFlQRV9BVURJTyA6IE1FRElBX1RSQUNLX1RZUEVfVklERU8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRyYWNrLT5tUGFja2V0cy0+Z2V0QXZhaWxhYmxlQnVmZmVyQ291bnQoJmZpbmFsUmVzdWx0KSA8IDIKKyAgICAgICAgICAgICAgICAmJiAhbVNlbnRQYXVzZU9uQnVmZmVyaW5nICYmICFtUHJlcGFyaW5nKSB7CisgICAgICAgICAgICAgICAgbUNhY2hlZFNvdXJjZS0+cmVzdW1lRmV0Y2hpbmdJZk5lY2Vzc2FyeSgpOworICAgICAgICAgICAgICAgIHNlbmRDYWNoZVN0YXRzKCk7CisgICAgICAgICAgICAgICAgbVNlbnRQYXVzZU9uQnVmZmVyaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UGF1c2VPbkJ1ZmZlcmluZ1N0YXJ0KTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyZXN1bHQgIT0gT0spIHsKKyAgICAgICAgaWYgKG1TdWJ0aXRsZVRyYWNrLm1FeHRyYWN0b3IgIT0gTlVMTCkgeworICAgICAgICAgICAgbVN1YnRpdGxlVHJhY2subVBhY2tldHMtPmNsZWFyKCk7CisgICAgICAgICAgICBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1UaW1lZFRleHRUcmFjay5tRXh0cmFjdG9yICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1UaW1lZFRleHRUcmFjay5tUGFja2V0cy0+Y2xlYXIoKTsKKyAgICAgICAgICAgIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uKys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBzdGF0dXNfdCBlb3NSZXN1bHQ7IC8vIGlnbm9yZWQKKyAgICBDSEVDSygoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworICAgIGlmIChhdWRpbykgeworICAgICAgICBtQXVkaW9MYXN0RGVxdWV1ZVRpbWVVcyA9IHRpbWVVczsKKyAgICB9IGVsc2UgeworICAgICAgICBtVmlkZW9MYXN0RGVxdWV1ZVRpbWVVcyA9IHRpbWVVczsKKyAgICB9CisKKyAgICBpZiAobVN1YnRpdGxlVHJhY2subUV4dHJhY3RvciAhPSBOVUxMCisgICAgICAgICAgICAmJiAhbVN1YnRpdGxlVHJhY2subVBhY2tldHMtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZW9zUmVzdWx0KSkgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGEsIHRoaXMpOworICAgICAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbik7CisgICAgICAgIG1zZy0+cG9zdCgpOworICAgIH0KKworICAgIGlmIChtVGltZWRUZXh0VHJhY2subUV4dHJhY3RvciAhPSBOVUxMCisgICAgICAgICAgICAmJiAhbVRpbWVkVGV4dFRyYWNrLm1QYWNrZXRzLT5oYXNCdWZmZXJBdmFpbGFibGUoJmVvc1Jlc3VsdCkpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEZldGNoVGltZWRUZXh0RGF0YSwgdGhpcyk7CisgICAgICAgIG1zZy0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbik7CisgICAgICAgIG1zZy0+cG9zdCgpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OmdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICpkdXJhdGlvblVzID0gbUR1cmF0aW9uVXM7CisgICAgcmV0dXJuIE9LOworfQorCitzaXplX3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6Z2V0VHJhY2tDb3VudCgpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtRXh0cmFjdG9ycy5zaXplKCk7Cit9CisKK3NwPEFNZXNzYWdlPiBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpnZXRUcmFja0luZm8oc2l6ZV90IHRyYWNrSW5kZXgpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNpemVfdCB0cmFja0NvdW50ID0gbUV4dHJhY3RvcnMuc2l6ZSgpOworICAgIGlmICh0cmFja0luZGV4ID49IHRyYWNrQ291bnQpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG1FeHRyYWN0b3JzLml0ZW1BdCh0cmFja0luZGV4KS0+Z2V0VHJhY2tGb3JtYXQodHJhY2tJbmRleCktPnRvQU1lc3NhZ2UoKTsKKyAgICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIm5vIG1ldGFkYXRhIGZvciB0cmFjayAlenUiLCB0cmFja0luZGV4KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgQVN0cmluZyBtaW1lOworICAgIENIRUNLKGZvcm1hdC0+ZmluZFN0cmluZyhBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSk7CisKKyAgICBpbnQzMl90IHRyYWNrVHlwZTsKKyAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWUuY19zdHIoKSwgInZpZGVvLyIsIDYpKSB7CisgICAgICAgIHRyYWNrVHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfVklERU87CisgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAobWltZS5jX3N0cigpLCAiYXVkaW8vIiwgNikpIHsKKyAgICAgICAgdHJhY2tUeXBlID0gTUVESUFfVFJBQ0tfVFlQRV9BVURJTzsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUuY19zdHIoKSwgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQKSkgeworICAgICAgICB0cmFja1R5cGUgPSBNRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVDsKKyAgICB9IGVsc2UgeworICAgICAgICB0cmFja1R5cGUgPSBNRURJQV9UUkFDS19UWVBFX1VOS05PV047CisgICAgfQorICAgIGZvcm1hdC0+c2V0SW50MzIoInR5cGUiLCB0cmFja1R5cGUpOworCisgICAgQVN0cmluZyBsYW5nOworICAgIGlmICghZm9ybWF0LT5maW5kU3RyaW5nKCJsYW5ndWFnZSIsICZsYW5nKSkgeworICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibGFuZ3VhZ2UiLCAidW5kIik7CisgICAgfQorCisgICAgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFKSB7CisgICAgICAgIGludDMyX3QgaXNBdXRvc2VsZWN0ID0gMSwgaXNEZWZhdWx0ID0gMCwgaXNGb3JjZWQgPSAwOworICAgICAgICBmb3JtYXQtPmZpbmRJbnQzMihBTUVESUFGT1JNQVRfS0VZX0lTX0FVVE9TRUxFQ1QsICZpc0F1dG9zZWxlY3QpOworICAgICAgICBmb3JtYXQtPmZpbmRJbnQzMihBTUVESUFGT1JNQVRfS0VZX0lTX0RFRkFVTFQsICZpc0RlZmF1bHQpOworICAgICAgICBmb3JtYXQtPmZpbmRJbnQzMihBTUVESUFGT1JNQVRfS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRSwgJmlzRm9yY2VkKTsKKworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJhdXRvIiwgISFpc0F1dG9zZWxlY3QpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJkZWZhdWx0IiwgISFpc0RlZmF1bHQpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJmb3JjZWQiLCAhIWlzRm9yY2VkKTsKKyAgICB9CisKKyAgICByZXR1cm4gZm9ybWF0OworfQorCitzc2l6ZV90IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OmdldFNlbGVjdGVkVHJhY2sobWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBjb25zdCBUcmFjayAqdHJhY2sgPSBOVUxMOworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9WSURFTzoKKyAgICAgICAgdHJhY2sgPSAmbVZpZGVvVHJhY2s7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9BVURJTzoKKyAgICAgICAgdHJhY2sgPSAmbUF1ZGlvVHJhY2s7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQ6CisgICAgICAgIHRyYWNrID0gJm1UaW1lZFRleHRUcmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFOgorICAgICAgICB0cmFjayA9ICZtU3VidGl0bGVUcmFjazsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHRyYWNrICE9IE5VTEwgJiYgdHJhY2stPm1FeHRyYWN0b3IgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gdHJhY2stPm1JbmRleDsKKyAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnNlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCwgaW50NjRfdCB0aW1lVXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEFMT0dWKCIlcyB0cmFjazogJXp1Iiwgc2VsZWN0ID8gInNlbGVjdCIgOiAiZGVzZWxlY3QiLCB0cmFja0luZGV4KTsKKworICAgIGlmICh0cmFja0luZGV4ID49IG1FeHRyYWN0b3JzLnNpemUoKSkgeworICAgICAgICByZXR1cm4gQkFEX0lOREVYOworICAgIH0KKworICAgIGlmICghc2VsZWN0KSB7CisgICAgICAgIFRyYWNrKiB0cmFjayA9IE5VTEw7CisgICAgICAgIGlmIChtU3VidGl0bGVUcmFjay5tRXh0cmFjdG9yICE9IE5VTEwgJiYgdHJhY2tJbmRleCA9PSBtU3VidGl0bGVUcmFjay5tSW5kZXgpIHsKKyAgICAgICAgICAgIHRyYWNrID0gJm1TdWJ0aXRsZVRyYWNrOworICAgICAgICAgICAgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbisrOworICAgICAgICB9IGVsc2UgaWYgKG1UaW1lZFRleHRUcmFjay5tRXh0cmFjdG9yICE9IE5VTEwgJiYgdHJhY2tJbmRleCA9PSBtVGltZWRUZXh0VHJhY2subUluZGV4KSB7CisgICAgICAgICAgICB0cmFjayA9ICZtVGltZWRUZXh0VHJhY2s7CisgICAgICAgICAgICBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbisrOworICAgICAgICB9CisgICAgICAgIGlmICh0cmFjayA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgdHJhY2stPm1FeHRyYWN0b3IgPSBOVUxMOworICAgICAgICB0cmFjay0+bVBhY2tldHMtPmNsZWFyKCk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBjb25zdCBzcDxBTWVkaWFFeHRyYWN0b3JXcmFwcGVyPiBleHRyYWN0b3IgPSBtRXh0cmFjdG9ycy5pdGVtQXQodHJhY2tJbmRleCk7CisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBjb252ZXJ0TWVkaWFGb3JtYXRXcmFwcGVyVG9NZXRhRGF0YShleHRyYWN0b3ItPmdldFRyYWNrRm9ybWF0KHRyYWNrSW5kZXgpKTsKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWUsICJ0ZXh0LyIsIDUpKSB7CisgICAgICAgIGJvb2wgaXNTdWJ0aXRsZSA9IHN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQKTsKKyAgICAgICAgVHJhY2sgKnRyYWNrID0gaXNTdWJ0aXRsZSA/ICZtU3VidGl0bGVUcmFjayA6ICZtVGltZWRUZXh0VHJhY2s7CisgICAgICAgIGlmICh0cmFjay0+bUV4dHJhY3RvciAhPSBOVUxMICYmIHRyYWNrLT5tSW5kZXggPT0gdHJhY2tJbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIHRyYWNrLT5tSW5kZXggPSB0cmFja0luZGV4OworICAgICAgICB0cmFjay0+bUV4dHJhY3RvciA9IG1FeHRyYWN0b3JzLml0ZW1BdCh0cmFja0luZGV4KTsKKyAgICAgICAgdHJhY2stPm1FeHRyYWN0b3ItPnNlbGVjdFNpbmdsZVRyYWNrKHRyYWNrSW5kZXgpOworICAgICAgICBpZiAodHJhY2stPm1QYWNrZXRzID09IE5VTEwpIHsKKyAgICAgICAgICAgIHRyYWNrLT5tUGFja2V0cyA9IG5ldyBBbm90aGVyUGFja2V0U291cmNlKG1ldGEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJhY2stPm1QYWNrZXRzLT5jbGVhcigpOworICAgICAgICAgICAgdHJhY2stPm1QYWNrZXRzLT5zZXRGb3JtYXQobWV0YSk7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc1N1YnRpdGxlKSB7CisgICAgICAgICAgICBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbisrOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3QgZW9zUmVzdWx0OyAvLyBpZ25vcmVkCisgICAgICAgIGlmIChtU3VidGl0bGVUcmFjay5tRXh0cmFjdG9yICE9IE5VTEwKKyAgICAgICAgICAgICAgICAmJiAhbVN1YnRpdGxlVHJhY2subVBhY2tldHMtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZW9zUmVzdWx0KSkgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEZldGNoU3VidGl0bGVEYXRhLCB0aGlzKTsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbik7CisgICAgICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cyID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZEdsb2JhbFRpbWVkVGV4dERhdGEsIHRoaXMpOworICAgICAgICBtc2cyLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uKTsKKyAgICAgICAgbXNnMi0+cG9zdCgpOworCisgICAgICAgIGlmIChtVGltZWRUZXh0VHJhY2subUV4dHJhY3RvciAhPSBOVUxMCisgICAgICAgICAgICAgICAgJiYgIW1UaW1lZFRleHRUcmFjay5tUGFja2V0cy0+aGFzQnVmZmVyQXZhaWxhYmxlKCZlb3NSZXN1bHQpKSB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RmV0Y2hUaW1lZFRleHREYXRhLCB0aGlzKTsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24pOworICAgICAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpIHx8ICFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKKyAgICAgICAgYm9vbCBhdWRpbyA9ICFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNik7CisgICAgICAgIFRyYWNrICp0cmFjayA9IGF1ZGlvID8gJm1BdWRpb1RyYWNrIDogJm1WaWRlb1RyYWNrOworICAgICAgICBpZiAodHJhY2stPm1FeHRyYWN0b3IgIT0gTlVMTCAmJiB0cmFjay0+bUluZGV4ID09IHRyYWNrSW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDaGFuZ2VBVlNvdXJjZSwgdGhpcyk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoInRyYWNrSW5kZXgiLCB0cmFja0luZGV4KTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnNlZWtUbyhpbnQ2NF90IHNlZWtUaW1lVXMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUpIHsKKyAgICBBTE9HVigic2Vla1RvOiAlbGxkLCAlZCIsIChsb25nIGxvbmcpc2Vla1RpbWVVcywgbW9kZSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlZWssIHRoaXMpOworICAgIG1zZy0+c2V0SW50NjQoInNlZWtUaW1lVXMiLCBzZWVrVGltZVVzKTsKKyAgICBtc2ctPnNldEludDMyKCJtb2RlIiwgbW9kZSk7CisKKyAgICAvLyBOZWVkIHRvIGNhbGwgcmVhZEJ1ZmZlciBvbiB8bUxvb3BlcnwgdG8gZW5zdXJlIHRoZSBjYWxscyB0bworICAgIC8vIElNZWRpYVNvdXJjZTo6cmVhZCogYXJlIHNlcmlhbGl6ZWQuIE5vdGUgdGhhdCBJTWVkaWFTb3VyY2U6OnJlYWQqCisgICAgLy8gaXMgY2FsbGVkIHdpdGhvdXQgfG1Mb2NrfCBhY3F1aXJlZCBhbmQgTWVkaWFTb3VyY2UgaXMgbm90IHRocmVhZCBzYWZlLgorICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCit2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6Om9uU2Vlayhjb25zdCBzcDxBTWVzc2FnZT4mIG1zZykgeworICAgIGludDY0X3Qgc2Vla1RpbWVVczsKKyAgICBpbnQzMl90IG1vZGU7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInNlZWtUaW1lVXMiLCAmc2Vla1RpbWVVcykpOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJtb2RlIiwgJm1vZGUpKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBkb1NlZWsoc2Vla1RpbWVVcywgKE1lZGlhUGxheWVyMlNlZWtNb2RlKW1vZGUpOworICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKworICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKyAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpkb1NlZWsoaW50NjRfdCBzZWVrVGltZVVzLCBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlKSB7CisgICAgaWYgKG1WaWRlb1RyYWNrLm1FeHRyYWN0b3IgIT0gTlVMTCkgeworICAgICAgICArK21WaWRlb0RhdGFHZW5lcmF0aW9uOworCisgICAgICAgIGludDY0X3QgYWN0dWFsVGltZVVzOworICAgICAgICByZWFkQnVmZmVyKE1FRElBX1RSQUNLX1RZUEVfVklERU8sIHNlZWtUaW1lVXMsIG1vZGUsICZhY3R1YWxUaW1lVXMpOworCisgICAgICAgIGlmIChtb2RlICE9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX0NMT1NFU1QpIHsKKyAgICAgICAgICAgIHNlZWtUaW1lVXMgPSBhY3R1YWxUaW1lVXM7CisgICAgICAgIH0KKyAgICAgICAgbVZpZGVvTGFzdERlcXVldWVUaW1lVXMgPSBhY3R1YWxUaW1lVXM7CisgICAgfQorCisgICAgaWYgKG1BdWRpb1RyYWNrLm1FeHRyYWN0b3IgIT0gTlVMTCkgeworICAgICAgICArK21BdWRpb0RhdGFHZW5lcmF0aW9uOworICAgICAgICByZWFkQnVmZmVyKE1FRElBX1RSQUNLX1RZUEVfQVVESU8sIHNlZWtUaW1lVXMsIE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX0NMT1NFU1QpOworICAgICAgICBtQXVkaW9MYXN0RGVxdWV1ZVRpbWVVcyA9IHNlZWtUaW1lVXM7CisgICAgfQorCisgICAgaWYgKG1TdWJ0aXRsZVRyYWNrLm1FeHRyYWN0b3IgIT0gTlVMTCkgeworICAgICAgICBtU3VidGl0bGVUcmFjay5tUGFja2V0cy0+Y2xlYXIoKTsKKyAgICAgICAgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbisrOworICAgIH0KKworICAgIGlmIChtVGltZWRUZXh0VHJhY2subUV4dHJhY3RvciAhPSBOVUxMKSB7CisgICAgICAgIG1UaW1lZFRleHRUcmFjay5tUGFja2V0cy0+Y2xlYXIoKTsKKyAgICAgICAgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24rKzsKKyAgICB9CisKKyAgICArK21Qb2xsQnVmZmVyaW5nR2VuZXJhdGlvbjsKKyAgICBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3NwPEFCdWZmZXI+IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6Om1lZGlhQnVmZmVyVG9BQnVmZmVyKAorICAgICAgICBNZWRpYUJ1ZmZlckJhc2UqIG1iLAorICAgICAgICBtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSkgeworICAgIGJvb2wgYXVkaW8gPSB0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9BVURJTzsKKyAgICBzaXplX3Qgb3V0TGVuZ3RoID0gbWItPnJhbmdlX2xlbmd0aCgpOworCisgICAgaWYgKGF1ZGlvICYmIG1BdWRpb0lzVm9yYmlzKSB7CisgICAgICAgIG91dExlbmd0aCArPSBzaXplb2YoaW50MzJfdCk7CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gYWI7CisKKyAgICBpZiAobUlzRHJtUHJvdGVjdGVkKSAgIHsKKyAgICAgICAgLy8gTW9kdWxhciBEUk0KKyAgICAgICAgLy8gRW5hYmxlZCBmb3IgYm90aCB2aWRlby9hdWRpbyBzbyAxKSBtZWRpYSBidWZmZXIgaXMgcmV1c2VkIHdpdGhvdXQgZXh0cmEgY29weWluZworICAgICAgICAvLyAyKSBtZXRhIGRhdGEgY2FuIGJlIHJldHJpZXZlZCBpbiBvbklucHV0QnVmZmVyRmV0Y2hlZCBmb3IgY2FsbGluZyBxdWV1ZVNlY3VyZUlucHV0QnVmZmVyLgorCisgICAgICAgIC8vIGRhdGEgaXMgYWxyZWFkeSBwcm92aWRlZCBpbiB0aGUgYnVmZmVyCisgICAgICAgIGFiID0gbmV3IEFCdWZmZXIoTlVMTCwgbWItPnJhbmdlX2xlbmd0aCgpKTsKKyAgICAgICAgYWItPm1ldGEoKS0+c2V0T2JqZWN0KCJtZWRpYUJ1ZmZlckhvbGRlciIsIG5ldyBNZWRpYUJ1ZmZlckhvbGRlcihtYikpOworCisgICAgICAgIC8vIE1vZHVsYXIgRFJNOiBSZXF1aXJlZCBiL2Mgb2YgdGhlIGFib3ZlIGFkZF9yZWYuCisgICAgICAgIC8vIElmIHJlZj4wLCB0aGVyZSBtdXN0IGJlIGFuIG9ic2VydmVyLCBvciBpdCdsbCBjcmFzaCBhdCByZWxlYXNlKCkuCisgICAgICAgIC8vIFRPRE86IE1lZGlhQnVmZmVyIG1pZ2h0IG5lZWQgdG8gYmUgcmV2aXNlZCB0byBlYXNlIHN1Y2ggbmVlZC4KKyAgICAgICAgbWItPnNldE9ic2VydmVyKHRoaXMpOworICAgICAgICAvLyBzZXRNZWRpYUJ1ZmZlckJhc2UoKSBpbnRlcmVzdGluZ2x5IGRvZXNuJ3QgaW5jcmVtZW50IHRoZSByZWYgY291bnQgb24gaXRzIG93bi4KKyAgICAgICAgLy8gRXh0cmEgaW5jcmVtZW50IChzaW5jZSB3ZSB3YW50IHRvIGtlZXAgbWIgYWxpdmUgYW5kIGF0dGFjaGVkIHRvIGFiIGJleW9uZCB0aGlzIGZ1bmN0aW9uCisgICAgICAgIC8vIGNhbGwuIFRoaXMgaXMgdG8gY291bnRlciB0aGUgZWZmZWN0IG9mIG1iLT5yZWxlYXNlKCkgdG93YXJkcyB0aGUgZW5kLgorICAgICAgICBtYi0+YWRkX3JlZigpOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgYWIgPSBuZXcgQUJ1ZmZlcihvdXRMZW5ndGgpOworICAgICAgICBtZW1jcHkoYWItPmRhdGEoKSwKKyAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbWItPmRhdGEoKSArIG1iLT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgICAgICAgIG1iLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgfQorCisgICAgaWYgKGF1ZGlvICYmIG1BdWRpb0lzVm9yYmlzKSB7CisgICAgICAgIGludDMyX3QgbnVtUGFnZVNhbXBsZXM7CisgICAgICAgIGlmICghbWItPm1ldGFfZGF0YSgpLmZpbmRJbnQzMihrS2V5VmFsaWRTYW1wbGVzLCAmbnVtUGFnZVNhbXBsZXMpKSB7CisgICAgICAgICAgICBudW1QYWdlU2FtcGxlcyA9IC0xOworICAgICAgICB9CisKKyAgICAgICAgdWludDhfdCogYWJFbmQgPSBhYi0+ZGF0YSgpICsgbWItPnJhbmdlX2xlbmd0aCgpOworICAgICAgICBtZW1jcHkoYWJFbmQsICZudW1QYWdlU2FtcGxlcywgc2l6ZW9mKG51bVBhZ2VTYW1wbGVzKSk7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IG1ldGEgPSBhYi0+bWV0YSgpOworCisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgQ0hFQ0sobWItPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOworICAgIG1ldGEtPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworCisgICAgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1ZJREVPKSB7CisgICAgICAgIGludDMyX3QgbGF5ZXJJZDsKKyAgICAgICAgaWYgKG1iLT5tZXRhX2RhdGEoKS5maW5kSW50MzIoa0tleVRlbXBvcmFsTGF5ZXJJZCwgJmxheWVySWQpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMigidGVtcG9yYWwtbGF5ZXItaWQiLCBsYXllcklkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQpIHsKKyAgICAgICAgQVN0cmluZyBtaW1lOworICAgICAgICBzcDxBTWVkaWFFeHRyYWN0b3JXcmFwcGVyPiBleHRyYWN0b3IgPSBtVGltZWRUZXh0VHJhY2subUV4dHJhY3RvcjsKKyAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXggPSBtVGltZWRUZXh0VHJhY2subUluZGV4OworICAgICAgICBDSEVDSyhleHRyYWN0b3IgIT0gTlVMTAorICAgICAgICAgICAgICAgICYmIGV4dHJhY3Rvci0+Z2V0VHJhY2tGb3JtYXQodHJhY2tJbmRleCktPmdldFN0cmluZyhBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSk7CisgICAgICAgIG1ldGEtPnNldFN0cmluZygibWltZSIsIG1pbWUuY19zdHIoKSk7CisgICAgfQorCisgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgIGlmIChtYi0+bWV0YV9kYXRhKCkuZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7CisgICAgICAgIG1ldGEtPnNldEludDY0KCJkdXJhdGlvblVzIiwgZHVyYXRpb25Vcyk7CisgICAgfQorCisgICAgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFKSB7CisgICAgICAgIG1ldGEtPnNldEludDMyKEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSU5ERVgsIG1TdWJ0aXRsZVRyYWNrLm1JbmRleCk7CisgICAgfQorCisgICAgdWludDMyX3QgZGF0YVR5cGU7IC8vIHVudXNlZAorICAgIGNvbnN0IHZvaWQgKnNlaURhdGE7CisgICAgc2l6ZV90IHNlaUxlbmd0aDsKKyAgICBpZiAobWItPm1ldGFfZGF0YSgpLmZpbmREYXRhKGtLZXlTRUksICZkYXRhVHlwZSwgJnNlaURhdGEsICZzZWlMZW5ndGgpKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IHNlaSA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weShzZWlEYXRhLCBzZWlMZW5ndGgpOzsKKyAgICAgICAgbWV0YS0+c2V0QnVmZmVyKCJzZWkiLCBzZWkpOworICAgIH0KKworICAgIGNvbnN0IHZvaWQgKm1wZWdVc2VyRGF0YVBvaW50ZXI7CisgICAgc2l6ZV90IG1wZWdVc2VyRGF0YUxlbmd0aDsKKyAgICBpZiAobWItPm1ldGFfZGF0YSgpLmZpbmREYXRhKAorICAgICAgICAgICAga0tleU1wZWdVc2VyRGF0YSwgJmRhdGFUeXBlLCAmbXBlZ1VzZXJEYXRhUG9pbnRlciwgJm1wZWdVc2VyRGF0YUxlbmd0aCkpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gbXBlZ1VzZXJEYXRhID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KG1wZWdVc2VyRGF0YVBvaW50ZXIsIG1wZWdVc2VyRGF0YUxlbmd0aCk7CisgICAgICAgIG1ldGEtPnNldEJ1ZmZlcihBTUVESUFGT1JNQVRfS0VZX01QRUdfVVNFUl9EQVRBLCBtcGVnVXNlckRhdGEpOworICAgIH0KKworICAgIG1iLT5yZWxlYXNlKCk7CisgICAgbWIgPSBOVUxMOworCisgICAgcmV0dXJuIGFiOworfQorCitpbnQzMl90IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OmdldERhdGFHZW5lcmF0aW9uKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3QgeworICAgIGludDMyX3QgZ2VuZXJhdGlvbiA9IC0xOworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9WSURFTzoKKyAgICAgICAgZ2VuZXJhdGlvbiA9IG1WaWRlb0RhdGFHZW5lcmF0aW9uOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfQVVESU86CisgICAgICAgIGdlbmVyYXRpb24gPSBtQXVkaW9EYXRhR2VuZXJhdGlvbjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVDoKKyAgICAgICAgZ2VuZXJhdGlvbiA9IG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEU6CisgICAgICAgIGdlbmVyYXRpb24gPSBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gZ2VuZXJhdGlvbjsKK30KKwordm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpwb3N0UmVhZEJ1ZmZlcihtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSkgeworICAgIGlmICgobVBlbmRpbmdSZWFkQnVmZmVyVHlwZXMgJiAoMSA8PCB0cmFja1R5cGUpKSA9PSAwKSB7CisgICAgICAgIG1QZW5kaW5nUmVhZEJ1ZmZlclR5cGVzIHw9ICgxIDw8IHRyYWNrVHlwZSk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWFkQnVmZmVyLCB0aGlzKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigidHJhY2tUeXBlIiwgdHJhY2tUeXBlKTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6Om9uUmVhZEJ1ZmZlcihjb25zdCBzcDxBTWVzc2FnZT4mIG1zZykgeworICAgIGludDMyX3QgdG1wVHlwZTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigidHJhY2tUeXBlIiwgJnRtcFR5cGUpKTsKKyAgICBtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSA9IChtZWRpYV90cmFja190eXBlKXRtcFR5cGU7CisgICAgbVBlbmRpbmdSZWFkQnVmZmVyVHlwZXMgJj0gfigxIDw8IHRyYWNrVHlwZSk7CisgICAgcmVhZEJ1ZmZlcih0cmFja1R5cGUpOworfQorCit2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnJlYWRCdWZmZXIoCisgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlLCBpbnQ2NF90IHNlZWtUaW1lVXMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUsCisgICAgICAgIGludDY0X3QgKmFjdHVhbFRpbWVVcywgYm9vbCBmb3JtYXRDaGFuZ2UpIHsKKyAgICBUcmFjayAqdHJhY2s7CisgICAgc2l6ZV90IG1heEJ1ZmZlcnMgPSAxOworICAgIHN3aXRjaCAodHJhY2tUeXBlKSB7CisgICAgICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9WSURFTzoKKyAgICAgICAgICAgIHRyYWNrID0gJm1WaWRlb1RyYWNrOworICAgICAgICAgICAgbWF4QnVmZmVycyA9IDg7ICAvLyB0b28gbGFyZ2Ugb2YgYSBudW1iZXIgbWF5IGluZmx1ZW5jZSBzZWVrcworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9BVURJTzoKKyAgICAgICAgICAgIHRyYWNrID0gJm1BdWRpb1RyYWNrOworICAgICAgICAgICAgbWF4QnVmZmVycyA9IDY0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRToKKyAgICAgICAgICAgIHRyYWNrID0gJm1TdWJ0aXRsZVRyYWNrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQ6CisgICAgICAgICAgICB0cmFjayA9ICZtVGltZWRUZXh0VHJhY2s7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgfQorCisgICAgaWYgKHRyYWNrLT5tRXh0cmFjdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChhY3R1YWxUaW1lVXMpIHsKKyAgICAgICAgKmFjdHVhbFRpbWVVcyA9IHNlZWtUaW1lVXM7CisgICAgfQorCisKKyAgICBib29sIHNlZWtpbmcgPSBmYWxzZTsKKyAgICBzcDxBTWVkaWFFeHRyYWN0b3JXcmFwcGVyPiBleHRyYWN0b3IgPSB0cmFjay0+bUV4dHJhY3RvcjsKKyAgICBpZiAoc2Vla1RpbWVVcyA+PSAwKSB7CisgICAgICAgIGV4dHJhY3Rvci0+c2Vla1RvKHNlZWtUaW1lVXMsIG1vZGUpOworICAgICAgICBzZWVraW5nID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpbnQzMl90IGdlbmVyYXRpb24gPSBnZXREYXRhR2VuZXJhdGlvbih0cmFja1R5cGUpOworICAgIGZvciAoc2l6ZV90IG51bUJ1ZmZlcnMgPSAwOyBudW1CdWZmZXJzIDwgbWF4QnVmZmVyczsgKSB7CisgICAgICAgIFZlY3RvcjxzcDxBQnVmZmVyPiA+IGFCdWZmZXJzOworCisgICAgICAgIG1Mb2NrLnVubG9jaygpOworCisgICAgICAgIHNwPEFNZWRpYUZvcm1hdFdyYXBwZXI+IGZvcm1hdDsKKyAgICAgICAgc3NpemVfdCBzYW1wbGVTaXplID0gLTE7CisgICAgICAgIHN0YXR1c190IGVyciA9IGV4dHJhY3Rvci0+Z2V0U2FtcGxlRm9ybWF0KGZvcm1hdCk7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIHNhbXBsZVNpemUgPSBleHRyYWN0b3ItPmdldFNhbXBsZVNpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlcnIgIT0gT0sgfHwgc2FtcGxlU2l6ZSA8IDApIHsKKyAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgICAgIHRyYWNrLT5tUGFja2V0cy0+c2lnbmFsRU9TKGVyciAhPSBPSyA/IGVyciA6IEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzcDxBQnVmZmVyPiBhYnVmID0gbmV3IEFCdWZmZXIoc2FtcGxlU2l6ZSk7CisgICAgICAgIHNhbXBsZVNpemUgPSBleHRyYWN0b3ItPnJlYWRTYW1wbGVEYXRhKGFidWYpOworICAgICAgICBtTG9jay5sb2NrKCk7CisKKyAgICAgICAgLy8gaW4gY2FzZSB0cmFjayBoYXMgYmVlbiBjaGFuZ2VkIHNpbmNlIHdlIGRvbid0IGhhdmUgbG9jayBmb3Igc29tZSB0aW1lLgorICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBnZXREYXRhR2VuZXJhdGlvbih0cmFja1R5cGUpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGludDY0X3QgdGltZVVzID0gZXh0cmFjdG9yLT5nZXRTYW1wbGVUaW1lKCk7CisgICAgICAgIGlmICh0aW1lVXMgPCAwKSB7CisgICAgICAgICAgICB0cmFjay0+bVBhY2tldHMtPnNpZ25hbEVPUyhFUlJPUl9NQUxGT1JNRUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzcDxBTWVzc2FnZT4gbWV0YSA9IGFidWYtPm1ldGEoKTsKKyAgICAgICAgZm9ybWF0LT53cml0ZVRvQU1lc3NhZ2UobWV0YSk7CisgICAgICAgIG1ldGEtPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworICAgICAgICBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgIG1BdWRpb1RpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgfSBlbHNlIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9WSURFTykgeworICAgICAgICAgICAgbVZpZGVvVGltZVVzID0gdGltZVVzOworICAgICAgICB9CisKKyAgICAgICAgcXVldWVEaXNjb250aW51aXR5SWZOZWVkZWQoc2Vla2luZywgZm9ybWF0Q2hhbmdlLCB0cmFja1R5cGUsIHRyYWNrKTsKKworICAgICAgICBpZiAobnVtQnVmZmVycyA9PSAwICYmIGFjdHVhbFRpbWVVcyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAqYWN0dWFsVGltZVVzID0gdGltZVVzOworICAgICAgICB9CisgICAgICAgIGlmIChzZWVraW5nKSB7CisgICAgICAgICAgICBpZiAobWV0YSAhPSBudWxscHRyICYmIG1vZGUgPT0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfQ0xPU0VTVAorICAgICAgICAgICAgICAgICAgICAmJiBzZWVrVGltZVVzID4gdGltZVVzKSB7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGV4dHJhID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgICAgIGV4dHJhLT5zZXRJbnQ2NCgicmVzdW1lLWF0LW1lZGlhVGltZVVzIiwgc2Vla1RpbWVVcyk7CisgICAgICAgICAgICAgICAgbWV0YS0+c2V0TWVzc2FnZSgiZXh0cmEiLCBleHRyYSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0cmFjay0+bVBhY2tldHMtPnF1ZXVlQWNjZXNzVW5pdChhYnVmKTsKKyAgICAgICAgZm9ybWF0Q2hhbmdlID0gZmFsc2U7CisgICAgICAgIHNlZWtpbmcgPSBmYWxzZTsKKyAgICAgICAgKytudW1CdWZmZXJzOworICAgICAgICBleHRyYWN0b3ItPmFkdmFuY2UoKTsKKworICAgIH0KKworICAgIGlmIChtSXNTdHJlYW1pbmcKKyAgICAgICAgJiYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1ZJREVPIHx8IHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX0FVRElPKSkgeworICAgICAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKKyAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzID0gdHJhY2stPm1QYWNrZXRzLT5nZXRCdWZmZXJlZER1cmF0aW9uVXMoJmZpbmFsUmVzdWx0KTsKKworICAgICAgICAvLyBUT0RPOiBtYXhSZWJ1ZmZlcmluZ01hcmtNcyBjb3VsZCBiZSBsYXJnZXIgdGhhbgorICAgICAgICAvLyBtQnVmZmVyaW5nU2V0dGluZ3MubVJlc3VtZVBsYXliYWNrTWFya01zCisgICAgICAgIGludDY0X3QgbWFya1VzID0gKG1QcmVwYXJpbmcgPyBtQnVmZmVyaW5nU2V0dGluZ3MubUluaXRpYWxNYXJrTXMKKyAgICAgICAgICAgIDogbUJ1ZmZlcmluZ1NldHRpbmdzLm1SZXN1bWVQbGF5YmFja01hcmtNcykgKiAxMDAwbGw7CisgICAgICAgIGlmIChmaW5hbFJlc3VsdCA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNIHx8IGR1cmF0aW9uVXMgPj0gbWFya1VzKSB7CisgICAgICAgICAgICBpZiAobVByZXBhcmluZyB8fCBtU2VudFBhdXNlT25CdWZmZXJpbmcpIHsKKyAgICAgICAgICAgICAgICBUcmFjayAqY291bnRlclRyYWNrID0KKyAgICAgICAgICAgICAgICAgICAgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1ZJREVPID8gJm1BdWRpb1RyYWNrIDogJm1WaWRlb1RyYWNrKTsKKyAgICAgICAgICAgICAgICBpZiAoY291bnRlclRyYWNrLT5tRXh0cmFjdG9yICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25VcyA9IGNvdW50ZXJUcmFjay0+bVBhY2tldHMtPmdldEJ1ZmZlcmVkRHVyYXRpb25VcygmZmluYWxSZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmluYWxSZXN1bHQgPT0gRVJST1JfRU5EX09GX1NUUkVBTSB8fCBkdXJhdGlvblVzID49IG1hcmtVcykgeworICAgICAgICAgICAgICAgICAgICBpZiAobVByZXBhcmluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QcmVwYXJpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRDYWNoZVN0YXRzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2VudFBhdXNlT25CdWZmZXJpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFJlc3VtZU9uQnVmZmVyaW5nRW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgcG9zdFJlYWRCdWZmZXIodHJhY2tUeXBlKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6cXVldWVEaXNjb250aW51aXR5SWZOZWVkZWQoCisgICAgICAgIGJvb2wgc2Vla2luZywgYm9vbCBmb3JtYXRDaGFuZ2UsIG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlLCBUcmFjayAqdHJhY2spIHsKKyAgICAvLyBmb3JtYXRDaGFuZ2UgJiYgc2Vla2luZzogdHJhY2sgd2hvc2Ugc291cmNlIGlzIGNoYW5nZWQgZHVyaW5nIHNlbGVjdGlvbgorICAgIC8vIGZvcm1hdENoYW5nZSAmJiAhc2Vla2luZzogdHJhY2sgd2hvc2Ugc291cmNlIGlzIG5vdCBjaGFuZ2VkIGR1cmluZyBzZWxlY3Rpb24KKyAgICAvLyAhZm9ybWF0Q2hhbmdlOiBub3JtYWwgc2VlaworICAgIGlmICgoc2Vla2luZyB8fCBmb3JtYXRDaGFuZ2UpCisgICAgICAgICAgICAmJiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfQVVESU8KKyAgICAgICAgICAgIHx8IHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1ZJREVPKSkgeworICAgICAgICBBVFNQYXJzZXI6OkRpc2NvbnRpbnVpdHlUeXBlIHR5cGUgPSAoZm9ybWF0Q2hhbmdlICYmIHNlZWtpbmcpCisgICAgICAgICAgICAgICAgPyBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfRk9STUFUQ0hBTkdFCisgICAgICAgICAgICAgICAgOiBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfTk9ORTsKKyAgICAgICAgdHJhY2stPm1QYWNrZXRzLT5xdWV1ZURpc2NvbnRpbnVpdHkodHlwZSwgTlVMTCAvKiBleHRyYSAqLywgdHJ1ZSAvKiBkaXNjYXJkICovKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6bm90aWZ5QnVmZmVyaW5nVXBkYXRlKGludDMyX3QgcGVyY2VudGFnZSkgeworICAgIC8vIEJ1ZmZlcmluZyBwZXJjZW50IGNvdWxkIGdvIGJhY2t3YXJkIGFzIGl0J3MgZXN0aW1hdGVkIGZyb20gcmVtYWluaW5nCisgICAgLy8gZGF0YSBhbmQgbGFzdCBhY2Nlc3MgdGltZS4gVGhpcyBjb3VsZCBjYXVzZSB0aGUgYnVmZmVyaW5nIHBvc2l0aW9uCisgICAgLy8gZHJhd24gb24gbWVkaWEgY29udHJvbCB0byBqaXR0ZXIgc2xpZ2h0bHkuIFJlbWVtYmVyIHByZXZpb3VzbHkgcmVwb3J0ZWQKKyAgICAvLyBwZXJjZW50YWdlIGFuZCBkb24ndCBhbGxvdyBpdCB0byBnbyBiYWNrd2FyZC4KKyAgICBpZiAocGVyY2VudGFnZSA8IG1QcmV2QnVmZmVyUGVyY2VudGFnZSkgeworICAgICAgICBwZXJjZW50YWdlID0gbVByZXZCdWZmZXJQZXJjZW50YWdlOworICAgIH0gZWxzZSBpZiAocGVyY2VudGFnZSA+IDEwMCkgeworICAgICAgICBwZXJjZW50YWdlID0gMTAwOworICAgIH0KKworICAgIG1QcmV2QnVmZmVyUGVyY2VudGFnZSA9IHBlcmNlbnRhZ2U7CisKKyAgICBBTE9HVigibm90aWZ5QnVmZmVyaW5nVXBkYXRlOiBidWZmZXJpbmcgJWQlJSIsIHBlcmNlbnRhZ2UpOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEJ1ZmZlcmluZ1VwZGF0ZSk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigicGVyY2VudGFnZSIsIHBlcmNlbnRhZ2UpOworICAgIG5vdGlmeS0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UG9sbEJ1ZmZlcmluZywgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1Qb2xsQnVmZmVyaW5nR2VuZXJhdGlvbik7CisgICAgLy8gRW5xdWlyZXMgYnVmZmVyaW5nIHN0YXR1cyBldmVyeSBzZWNvbmQuCisgICAgbXNnLT5wb3N0KDEwMDAwMDBsbCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6b25Qb2xsQnVmZmVyaW5nKCkgeworICAgIHN0YXR1c190IGZpbmFsU3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKKyAgICBpbnQ2NF90IGNhY2hlZER1cmF0aW9uVXMgPSAtMWxsOworICAgIHNzaXplX3QgY2FjaGVkRGF0YVJlbWFpbmluZyA9IC0xOworCisgICAgaWYgKG1DYWNoZWRTb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBjYWNoZWREYXRhUmVtYWluaW5nID0gbUNhY2hlZFNvdXJjZS0+YXBwcm94RGF0YVJlbWFpbmluZygmZmluYWxTdGF0dXMpOworCisgICAgICAgIGlmIChmaW5hbFN0YXR1cyA9PSBPSykgeworICAgICAgICAgICAgb2ZmNjRfdCBzaXplOworICAgICAgICAgICAgaW50NjRfdCBiaXRyYXRlID0gMGxsOworICAgICAgICAgICAgaWYgKG1EdXJhdGlvblVzID4gMCAmJiBtQ2FjaGVkU291cmNlLT5nZXRTaXplKCZzaXplKSA9PSBPSykgeworICAgICAgICAgICAgICAgIC8vIHxiaXRyYXRlfCB1c2VzIGJpdHMvc2Vjb25kIHVuaXQsIHdoaWxlIHNpemUgaXMgbnVtYmVyIG9mIGJ5dGVzLgorICAgICAgICAgICAgICAgIGJpdHJhdGUgPSBzaXplICogODAwMDAwMGxsIC8gbUR1cmF0aW9uVXM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1CaXRyYXRlID4gMCkgeworICAgICAgICAgICAgICAgIGJpdHJhdGUgPSBtQml0cmF0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChiaXRyYXRlID4gMCkgeworICAgICAgICAgICAgICAgIGNhY2hlZER1cmF0aW9uVXMgPSBjYWNoZWREYXRhUmVtYWluaW5nICogODAwMDAwMGxsIC8gYml0cmF0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmaW5hbFN0YXR1cyAhPSBPSykgeworICAgICAgICBBTE9HVigib25Qb2xsQnVmZmVyaW5nOiBFT1MgKGZpbmFsU3RhdHVzID0gJWQpIiwgZmluYWxTdGF0dXMpOworCisgICAgICAgIGlmIChmaW5hbFN0YXR1cyA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICBub3RpZnlCdWZmZXJpbmdVcGRhdGUoMTAwKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoY2FjaGVkRHVyYXRpb25VcyA+PSAwbGwpIHsKKyAgICAgICAgaWYgKG1EdXJhdGlvblVzID4gMGxsKSB7CisgICAgICAgICAgICBpbnQ2NF90IGNhY2hlZFBvc1VzID0gZ2V0TGFzdFJlYWRQb3NpdGlvbigpICsgY2FjaGVkRHVyYXRpb25VczsKKyAgICAgICAgICAgIGludCBwZXJjZW50YWdlID0gMTAwLjAgKiBjYWNoZWRQb3NVcyAvIG1EdXJhdGlvblVzOworICAgICAgICAgICAgaWYgKHBlcmNlbnRhZ2UgPiAxMDApIHsKKyAgICAgICAgICAgICAgICBwZXJjZW50YWdlID0gMTAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBub3RpZnlCdWZmZXJpbmdVcGRhdGUocGVyY2VudGFnZSk7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigib25Qb2xsQnVmZmVyaW5nOiBjYWNoZWREdXJhdGlvblVzICUuMWYgc2VjIiwgY2FjaGVkRHVyYXRpb25VcyAvIDEwMDAwMDAuMGYpOworICAgIH0KKworICAgIHNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpOworfQorCisvLyBNb2R1bGFyIERSTQorc3RhdHVzX3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6cHJlcGFyZURybSgKKyAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZkcm1TZXNzaW9uSWQsCisgICAgICAgIHNwPEFNZWRpYUNyeXB0b1dyYXBwZXI+ICpvdXRDcnlwdG8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEFMT0dWKCJwcmVwYXJlRHJtIik7CisKKyAgICBtSXNEcm1Qcm90ZWN0ZWQgPSBmYWxzZTsKKyAgICBtSXNEcm1SZWxlYXNlZCA9IGZhbHNlOworICAgIG1Jc1NlY3VyZSA9IGZhbHNlOworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gT0s7CisgICAgc3A8QU1lZGlhQ3J5cHRvV3JhcHBlcj4gY3J5cHRvID0KKyAgICAgICAgbmV3IEFNZWRpYUNyeXB0b1dyYXBwZXIodXVpZCwgZHJtU2Vzc2lvbklkLmFycmF5KCksIGRybVNlc3Npb25JZC5zaXplKCkpOworICAgIGlmIChjcnlwdG8gPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgicHJlcGFyZURybTogZmFpbGVkIHRvIGNyZWF0ZSBjcnlwdG8uIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBBTE9HVigicHJlcGFyZURybTogY3J5cHRvIGNyZWF0ZWQgZm9yIHV1aWQ6ICVzIiwKKyAgICAgICAgICAgIERybVVVSUQ6OnRvSGV4U3RyaW5nKHV1aWQpLnN0cmluZygpKTsKKworICAgICpvdXRDcnlwdG8gPSBjcnlwdG87CisgICAgLy8gYXMgbG9uZyBhIHRoZXJlIGlzIGFuIGFjdGl2ZSBjcnlwdG8KKyAgICBtSXNEcm1Qcm90ZWN0ZWQgPSB0cnVlOworCisgICAgaWYgKG1NaW1lcy5zaXplKCkgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICBBTE9HRSgicHJlcGFyZURybTogVW5leHBlY3RlZC4gTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSB0cmFjay4gc3RhdHVzOiAlZCIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgLy8gZmlyc3QgbWltZSBpbiB0aGlzIGxpc3QgaXMgZWl0aGVyIHRoZSB2aWRlbyB0cmFjaywgb3IgdGhlIGZpcnN0IGF1ZGlvIHRyYWNrCisgICAgY29uc3QgY2hhciAqbWltZSA9IG1NaW1lc1swXS5zdHJpbmcoKTsKKyAgICBtSXNTZWN1cmUgPSBjcnlwdG8tPnJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChtaW1lKTsKKyAgICBBTE9HVigicHJlcGFyZURybTogcmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50IG1pbWU6ICVzICBpc1NlY3VyZTogJWQiLAorICAgICAgICAgICAgbWltZSwgbUlzU2VjdXJlKTsKKworICAgIC8vIENoZWNraW5nIHRoZSBtZW1iZXIgZmxhZ3Mgd2hpbGUgaW4gdGhlIGxvb3BlciB0byBzZW5kIG91dCB0aGUgbm90aWZpY2F0aW9uLgorICAgIC8vIFRoZSBsZWdhY3kgbURlY3J5cHRIYW5kbGUhPU5VTEwgY2hlY2sgKGZvciBGTEFHX1BST1RFQ1RFRCkgaXMgZXF1aXZhbGVudCB0byBtSXNEcm1Qcm90ZWN0ZWQuCisgICAgbm90aWZ5RmxhZ3NDaGFuZ2VkKAorICAgICAgICAgICAgKG1Jc1NlY3VyZSA/IEZMQUdfU0VDVVJFIDogMCkgfAorICAgICAgICAgICAgLy8gU2V0dGluZyAicHJvdGVjdGVkIHNjcmVlbiIgb25seSBmb3IgTDE6IGIvMzgzOTA4MzYKKyAgICAgICAgICAgIChtSXNTZWN1cmUgPyBGTEFHX1BST1RFQ1RFRCA6IDApIHwKKyAgICAgICAgICAgIEZMQUdfQ0FOX1BBVVNFIHwKKyAgICAgICAgICAgIEZMQUdfQ0FOX1NFRUtfQkFDS1dBUkQgfAorICAgICAgICAgICAgRkxBR19DQU5fU0VFS19GT1JXQVJEIHwKKyAgICAgICAgICAgIEZMQUdfQ0FOX1NFRUspOworCisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICBBTE9HVigicHJlcGFyZURybTogbUNyeXB0bzogJXAiLCBvdXRDcnlwdG8tPmdldCgpKTsKKyAgICAgICAgQUxPR0QoInByZXBhcmVEcm0gcmV0OiAlZCAiLCBzdGF0dXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJwcmVwYXJlRHJtIGVycjogJWQiLCBzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpyZWxlYXNlRHJtKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQUxPR1YoInJlbGVhc2VEcm0iKTsKKworICAgIGlmIChtSXNEcm1Qcm90ZWN0ZWQpIHsKKyAgICAgICAgbUlzRHJtUHJvdGVjdGVkID0gZmFsc2U7CisgICAgICAgIC8vIHRvIHByZXZlbnQgcmV0dXJuaW5nIGFueSBtb3JlIGJ1ZmZlciBhZnRlciBzdG9wL3JlbGVhc2VEcm0gKGIvMzc5NjAwOTYpCisgICAgICAgIG1Jc0RybVJlbGVhc2VkID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInJlbGVhc2VEcm06IG1Jc0RybVByb3RlY3RlZCBpcyByZXNldC4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgicmVsZWFzZURybTogbUlzRHJtUHJvdGVjdGVkIGlzIGFscmVhZHkgZmFsc2UuIik7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpjaGVja0RybUluZm8oKQoreworICAgIC8vIGNsZWFyaW5nIHRoZSBmbGFnIGF0IHByZXBhcmUgaW4gY2FzZSB0aGUgcGxheWVyIGlzIHJldXNlZCBhZnRlciBzdG9wL3JlbGVhc2VEcm0gd2l0aCB0aGUKKyAgICAvLyBzYW1lIHNvdXJjZSB3aXRob3V0IGJlaW5nIHJlc2V0IChjYWxsZWQgYnkgcHJlcGFyZUFzeW5jL2luaXRGcm9tRGF0YVNvdXJjZSkKKyAgICBtSXNEcm1SZWxlYXNlZCA9IGZhbHNlOworCisgICAgaWYgKG1FeHRyYWN0b3IgPT0gTlVMTCkgeworICAgICAgICBBTE9HVigiY2hlY2tEcm1JbmZvOiBObyBleHRyYWN0b3IiKTsKKyAgICAgICAgcmV0dXJuIE9LOyAvLyBsZXR0aW5nIHRoZSBjYWxsZXIgcmVzcG9uZHMgYWNjb3JkaW5nbHkKKyAgICB9CisKKyAgICBQc3NoSW5mbyAqcHNzaEluZm8gPSBtRXh0cmFjdG9yLT5nZXRQc3NoSW5mbygpOworICAgIGlmIChwc3NoSW5mbyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJjaGVja0RybUluZm86IE5vIFBTU0giKTsKKyAgICAgICAgcmV0dXJuIE9LOyAvLyBzb3VyY2Ugd2l0aG91dCBEUk0gaW5mbworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGRybUluZm9CdWZmZXIgPSBOdVBsYXllcjJEcm06OnJldHJpZXZlRHJtSW5mbyhwc3NoSW5mbyk7CisgICAgQUxPR1YoImNoZWNrRHJtSW5mbzogTUVESUFfRFJNX0lORk8gUFNTSCBkcm0gaW5mbyBzaXplOiAlZCIsIChpbnQpZHJtSW5mb0J1ZmZlci0+c2l6ZSgpKTsKKworICAgIGlmIChkcm1JbmZvQnVmZmVyLT5zaXplKCkgPT0gMCkgeworICAgICAgICBBTE9HRSgiY2hlY2tEcm1JbmZvOiBVbmV4cGVjdGVkIHBhcmNlbCBzaXplOiAwIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG5vdGlmeURybUluZm8oZHJtSW5mb0J1ZmZlcik7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpCit7CisgICAgLy9BTE9HVigic2lnbmFsQnVmZmVyUmV0dXJuZWQgJXAgIHJlZkNvdW50OiAlZCIsIGJ1ZmZlciwgYnVmZmVyLT5sb2NhbFJlZmNvdW50KCkpOworCisgICAgYnVmZmVyLT5zZXRPYnNlcnZlcihOVUxMKTsKKyAgICBidWZmZXItPnJlbGVhc2UoKTsgLy8gdGhpcyBsZWFkcyB0byBkZWxldGUgc2luY2UgdGhhdCB0aGVyZSBpcyBubyBvYnNlcnZvcgorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9HZW5lcmljU291cmNlMi5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9HZW5lcmljU291cmNlMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYzUxODIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0dlbmVyaWNTb3VyY2UyLmgKQEAgLTAsMCArMSwyNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgR0VORVJJQ19TT1VSQ0UyX0hfCisKKyNkZWZpbmUgR0VORVJJQ19TT1VSQ0UyX0hfCisKKyNpbmNsdWRlICJOdVBsYXllcjIuaCIKKyNpbmNsdWRlICJOdVBsYXllcjJTb3VyY2UuaCIKKworI2luY2x1ZGUgIkFUU1BhcnNlci5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvbWVkaWFwbGF5ZXIyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFEYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtXcmFwcGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRGVjcnlwdEhhbmRsZTsKK3N0cnVjdCBBbm90aGVyUGFja2V0U291cmNlOworc3RydWN0IEFSVFNQQ29udHJvbGxlcjsKK2NsYXNzIERhdGFTb3VyY2U7CitjbGFzcyBJRGF0YVNvdXJjZTsKK2NsYXNzIElNZWRpYVNvdXJjZTsKK3N0cnVjdCBNZWRpYUhUVFBTZXJ2aWNlOworc3RydWN0IE1lZGlhU291cmNlOworY2xhc3MgTWVkaWFCdWZmZXI7CitzdHJ1Y3QgTWVkaWFDbG9jazsKK3N0cnVjdCBOdUNhY2hlZFNvdXJjZTI7CisKK3N0cnVjdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyIDogcHVibGljIE51UGxheWVyMjo6U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgTWVkaWFCdWZmZXJPYnNlcnZlciAvLyBNb2R1bGFyIERSTQoreworICAgIEdlbmVyaWNTb3VyY2UyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2spOworCisgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKKworICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOworCisgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlPiYgZGF0YVNvdXJjZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlcmluZ1NldHRpbmdzKAorICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYygpOworCisgICAgdmlydHVhbCB2b2lkIHN0YXJ0KCk7CisgICAgdmlydHVhbCB2b2lkIHN0b3AoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcGF1c2UoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVzdW1lKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBmZWVkTW9yZVRTRGF0YSgpOworCisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0RmlsZUZvcm1hdE1ldGEoKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVxdWV1ZUFjY2Vzc1VuaXQoYm9vbCBhdWRpbywgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKTsKKyAgICB2aXJ0dWFsIHNpemVfdCBnZXRUcmFja0NvdW50KCkgY29uc3Q7CisgICAgdmlydHVhbCBzcDxBTWVzc2FnZT4gZ2V0VHJhY2tJbmZvKHNpemVfdCB0cmFja0luZGV4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIHR5cGUpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0LCBpbnQ2NF90IHRpbWVVcyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZWVrVG8oCisgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVcywKKyAgICAgICAgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBib29sIGlzU3RyZWFtaW5nKCkgY29uc3Q7CisKKyAgICAvLyBNb2R1bGFyIERSTQorICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVEcm0oCisgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZkcm1TZXNzaW9uSWQsCisgICAgICAgICAgICBzcDxBTWVkaWFDcnlwdG9XcmFwcGVyPiAqb3V0Q3J5cHRvKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZURybSgpOworCisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5HZW5lcmljU291cmNlMigpOworCisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIHZpcnR1YWwgc3A8QU1lc3NhZ2U+IGdldEZvcm1hdChib29sIGF1ZGlvKTsKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXRNZXRhKGJvb2wgYXVkaW8pOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrV2hhdFByZXBhcmVBc3luYywKKyAgICAgICAga1doYXRGZXRjaFN1YnRpdGxlRGF0YSwKKyAgICAgICAga1doYXRGZXRjaFRpbWVkVGV4dERhdGEsCisgICAgICAgIGtXaGF0U2VuZFN1YnRpdGxlRGF0YSwKKyAgICAgICAga1doYXRTZW5kR2xvYmFsVGltZWRUZXh0RGF0YSwKKyAgICAgICAga1doYXRTZW5kVGltZWRUZXh0RGF0YSwKKyAgICAgICAga1doYXRDaGFuZ2VBVlNvdXJjZSwKKyAgICAgICAga1doYXRQb2xsQnVmZmVyaW5nLAorICAgICAgICBrV2hhdFNlZWssCisgICAgICAgIGtXaGF0UmVhZEJ1ZmZlciwKKyAgICAgICAga1doYXRTdGFydCwKKyAgICAgICAga1doYXRSZXN1bWUsCisgICAgICAgIGtXaGF0U2VjdXJlRGVjb2RlcnNJbnN0YW50aWF0ZWQsCisgICAgfTsKKworICAgIHN0cnVjdCBUcmFjayB7CisgICAgICAgIHNpemVfdCBtSW5kZXg7CisgICAgICAgIHNwPEFNZWRpYUV4dHJhY3RvcldyYXBwZXI+IG1FeHRyYWN0b3I7CisgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IG1QYWNrZXRzOworICAgIH07CisKKyAgICBpbnQ2NF90IG1BdWRpb1RpbWVVczsKKyAgICBpbnQ2NF90IG1BdWRpb0xhc3REZXF1ZXVlVGltZVVzOworICAgIGludDY0X3QgbVZpZGVvVGltZVVzOworICAgIGludDY0X3QgbVZpZGVvTGFzdERlcXVldWVUaW1lVXM7CisKKyAgICBCdWZmZXJpbmdTZXR0aW5ncyBtQnVmZmVyaW5nU2V0dGluZ3M7CisgICAgaW50MzJfdCBtUHJldkJ1ZmZlclBlcmNlbnRhZ2U7CisgICAgaW50MzJfdCBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb247CisgICAgYm9vbCBtU2VudFBhdXNlT25CdWZmZXJpbmc7CisKKyAgICBpbnQzMl90IG1BdWRpb0RhdGFHZW5lcmF0aW9uOworICAgIGludDMyX3QgbVZpZGVvRGF0YUdlbmVyYXRpb247CisgICAgaW50MzJfdCBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uOworICAgIGludDMyX3QgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb247CisgICAgaW50NjRfdCBtRHVyYXRpb25VczsKKyAgICBib29sIG1BdWRpb0lzVm9yYmlzOworICAgIC8vIFNlY3VyZSBjb2RlYyBpcyByZXF1aXJlZC4KKyAgICBib29sIG1Jc1NlY3VyZTsKKyAgICBib29sIG1Jc1N0cmVhbWluZzsKKyAgICB1aWRfdCBtVUlEOworICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+IG1NZWRpYUNsb2NrOworICAgIHNwPE1lZGlhSFRUUFNlcnZpY2U+IG1IVFRQU2VydmljZTsKKyAgICBBU3RyaW5nIG1Vcmk7CisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbVVyaUhlYWRlcnM7CisgICAgaW50IG1GZDsKKyAgICBpbnQ2NF90IG1PZmZzZXQ7CisgICAgaW50NjRfdCBtTGVuZ3RoOworCisgICAgYm9vbCBtRGlzY29ubmVjdGVkOworICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOworICAgIHNwPE51Q2FjaGVkU291cmNlMj4gbUNhY2hlZFNvdXJjZTsKKyAgICBzcDxEYXRhU291cmNlPiBtSHR0cFNvdXJjZTsKKyAgICBzcDxNZXRhRGF0YT4gbUZpbGVNZXRhOworICAgIHNwPEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyPiBtRGF0YVNvdXJjZVdyYXBwZXI7CisgICAgc3A8QU1lZGlhRXh0cmFjdG9yV3JhcHBlcj4gbUV4dHJhY3RvcjsKKyAgICBWZWN0b3I8c3A8QU1lZGlhRXh0cmFjdG9yV3JhcHBlcj4gPiBtRXh0cmFjdG9yczsKKyAgICBib29sIG1TdGFydGVkOworICAgIGJvb2wgbVByZXBhcmluZzsKKyAgICBpbnQ2NF90IG1CaXRyYXRlOworICAgIHVpbnQzMl90IG1QZW5kaW5nUmVhZEJ1ZmZlclR5cGVzOworICAgIHNwPEFCdWZmZXI+IG1HbG9iYWxUaW1lZFRleHQ7CisKKyAgICBUcmFjayBtVmlkZW9UcmFjazsKKyAgICBUcmFjayBtQXVkaW9UcmFjazsKKyAgICBUcmFjayBtU3VidGl0bGVUcmFjazsKKyAgICBUcmFjayBtVGltZWRUZXh0VHJhY2s7CisKKyAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOworCisgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKKworICAgIHZvaWQgcmVzZXREYXRhU291cmNlKCk7CisKKyAgICBzdGF0dXNfdCBpbml0RnJvbURhdGFTb3VyY2UoKTsKKyAgICBpbnQ2NF90IGdldExhc3RSZWFkUG9zaXRpb24oKTsKKworICAgIHZvaWQgbm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKHN0YXR1c190IGVycik7CisgICAgdm9pZCBvblNlY3VyZURlY29kZXJzSW5zdGFudGlhdGVkKHN0YXR1c190IGVycik7CisgICAgdm9pZCBmaW5pc2hQcmVwYXJlQXN5bmMoKTsKKyAgICBzdGF0dXNfdCBzdGFydFNvdXJjZXMoKTsKKworICAgIHZvaWQgb25TZWVrKGNvbnN0IHNwPEFNZXNzYWdlPiYgbXNnKTsKKyAgICBzdGF0dXNfdCBkb1NlZWsoaW50NjRfdCBzZWVrVGltZVVzLCBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlKTsKKworICAgIHZvaWQgb25QcmVwYXJlQXN5bmMoKTsKKworICAgIHZvaWQgZmV0Y2hUZXh0RGF0YSgKKyAgICAgICAgICAgIHVpbnQzMl90IHdoYXQsIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSwKKyAgICAgICAgICAgIGludDMyX3QgY3VyR2VuLCBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiYgcGFja2V0cywgY29uc3Qgc3A8QU1lc3NhZ2U+JiBtc2cpOworCisgICAgdm9pZCBzZW5kR2xvYmFsVGV4dERhdGEoCisgICAgICAgICAgICB1aW50MzJfdCB3aGF0LAorICAgICAgICAgICAgaW50MzJfdCBjdXJHZW4sIHNwPEFNZXNzYWdlPiBtc2cpOworCisgICAgdm9pZCBzZW5kVGV4dERhdGEoCisgICAgICAgICAgICB1aW50MzJfdCB3aGF0LCBtZWRpYV90cmFja190eXBlIHR5cGUsCisgICAgICAgICAgICBpbnQzMl90IGN1ckdlbiwgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4mIHBhY2tldHMsIGNvbnN0IHNwPEFNZXNzYWdlPiYgbXNnKTsKKworICAgIHNwPEFCdWZmZXI+IG1lZGlhQnVmZmVyVG9BQnVmZmVyKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICptYnVmLAorICAgICAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUpOworCisgICAgdm9pZCBwb3N0UmVhZEJ1ZmZlcihtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSk7CisgICAgdm9pZCBvblJlYWRCdWZmZXIoY29uc3Qgc3A8QU1lc3NhZ2U+JiBtc2cpOworICAgIC8vIFdoZW4gfG1vZGV8IGlzIE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX0NMT1NFU1QsIHRoZSBidWZmZXIgcmVhZCBzaGFsbAorICAgIC8vIGluY2x1ZGUgYW4gaXRlbSBpbmRpY2F0aW5nIHNraXBwaW5nIHJlbmRlcmluZyBhbGwgYnVmZmVycyB3aXRoIHRpbWVzdGFtcAorICAgIC8vIGVhcmxpZXIgdGhhbiB8c2Vla1RpbWVVc3wuCisgICAgLy8gRm9yIG90aGVyIG1vZGVzLCB0aGUgYnVmZmVyIHJlYWQgd2lsbCBub3QgaW5jbHVkZSB0aGUgaXRlbSBhcyBhYm92ZSBpbiBvcmRlcgorICAgIC8vIHRvIGZhY2lsaXRhdGUgZmFzdCBzZWVrIG9wZXJhdGlvbi4KKyAgICB2b2lkIHJlYWRCdWZmZXIoCisgICAgICAgICAgICBtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSwKKyAgICAgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVcyA9IC0xbGwsCisgICAgICAgICAgICBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQywKKyAgICAgICAgICAgIGludDY0X3QgKmFjdHVhbFRpbWVVcyA9IE5VTEwsIGJvb2wgZm9ybWF0Q2hhbmdlID0gZmFsc2UpOworCisgICAgdm9pZCBxdWV1ZURpc2NvbnRpbnVpdHlJZk5lZWRlZCgKKyAgICAgICAgICAgIGJvb2wgc2Vla2luZywgYm9vbCBmb3JtYXRDaGFuZ2UsIG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlLCBUcmFjayAqdHJhY2spOworCisgICAgdm9pZCBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKKyAgICB2b2lkIG9uUG9sbEJ1ZmZlcmluZygpOworICAgIHZvaWQgbm90aWZ5QnVmZmVyaW5nVXBkYXRlKGludDMyX3QgcGVyY2VudGFnZSk7CisKKyAgICB2b2lkIHNlbmRDYWNoZVN0YXRzKCk7CisKKyAgICBzcDxBTWVzc2FnZT4gZ2V0Rm9ybWF0X2woYm9vbCBhdWRpbyk7CisgICAgc3A8TWV0YURhdGE+IGdldEZvcm1hdE1ldGFfbChib29sIGF1ZGlvKTsKKyAgICBpbnQzMl90IGdldERhdGFHZW5lcmF0aW9uKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3Q7CisKKyAgICAvLyBNb2R1bGFyIERSTQorICAgIC8vIFRoZSBzb3VyY2UgaXMgRFJNIHByb3RlY3RlZCBhbmQgaXMgcHJlcGFyZWQgZm9yIERSTS4KKyAgICBib29sIG1Jc0RybVByb3RlY3RlZDsKKyAgICAvLyByZWxlYXNlRHJtIGhhcyBiZWVuIHByb2Nlc3NlZC4KKyAgICBib29sIG1Jc0RybVJlbGVhc2VkOworICAgIFZlY3RvcjxTdHJpbmc4PiBtTWltZXM7CisKKyAgICBzdGF0dXNfdCBjaGVja0RybUluZm8oKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEdlbmVyaWNTb3VyY2UyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gR0VORVJJQ19TT1VSQ0UyX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0hUVFBMaXZlU291cmNlMi5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0hUVFBMaXZlU291cmNlMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYxY2FjZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSFRUUExpdmVTb3VyY2UyLmNwcApAQCAtMCwwICsxLDQ0OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJIVFRQTGl2ZVNvdXJjZTIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJIVFRQTGl2ZVNvdXJjZTIuaCIKKworI2luY2x1ZGUgIkFub3RoZXJQYWNrZXRTb3VyY2UuaCIKKyNpbmNsdWRlICJMaXZlRGF0YVNvdXJjZS5oIgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorCisvLyBkZWZhdWx0IGJ1ZmZlciBwcmVwYXJlL3JlYWR5L3VuZGVyZmxvdyBtYXJrcworc3RhdGljIGNvbnN0IGludCBrUmVhZHlNYXJrTXMgICAgID0gNTAwMDsgIC8vIDUgc2Vjb25kcworc3RhdGljIGNvbnN0IGludCBrUHJlcGFyZU1hcmtNcyAgID0gMTUwMDsgIC8vIDEuNSBzZWNvbmRzCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTnVQbGF5ZXIyOjpIVFRQTGl2ZVNvdXJjZTI6OkhUVFBMaXZlU291cmNlMigKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykKKyAgICA6IFNvdXJjZShub3RpZnkpLAorICAgICAgbUhUVFBTZXJ2aWNlKGh0dHBTZXJ2aWNlKSwKKyAgICAgIG1VUkwodXJsKSwKKyAgICAgIG1GbGFncygwKSwKKyAgICAgIG1GaW5hbFJlc3VsdChPSyksCisgICAgICBtT2Zmc2V0KDApLAorICAgICAgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbigwKSwKKyAgICAgIG1GZXRjaE1ldGFEYXRhR2VuZXJhdGlvbigwKSwKKyAgICAgIG1IYXNNZXRhZGF0YShmYWxzZSksCisgICAgICBtTWV0YWRhdGFTZWxlY3RlZChmYWxzZSkgeworICAgIG1CdWZmZXJpbmdTZXR0aW5ncy5tSW5pdGlhbE1hcmtNcyA9IGtQcmVwYXJlTWFya01zOworICAgIG1CdWZmZXJpbmdTZXR0aW5ncy5tUmVzdW1lUGxheWJhY2tNYXJrTXMgPSBrUmVhZHlNYXJrTXM7CisgICAgaWYgKGhlYWRlcnMpIHsKKyAgICAgICAgbUV4dHJhSGVhZGVycyA9ICpoZWFkZXJzOworCisgICAgICAgIHNzaXplX3QgaW5kZXggPQorICAgICAgICAgICAgbUV4dHJhSGVhZGVycy5pbmRleE9mS2V5KFN0cmluZzgoIngtaGlkZS11cmxzLWZyb20tbG9nIikpOworCisgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdJbmNvZ25pdG87CisKKyAgICAgICAgICAgIG1FeHRyYUhlYWRlcnMucmVtb3ZlSXRlbXNBdChpbmRleCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK051UGxheWVyMjo6SFRUUExpdmVTb3VyY2UyOjp+SFRUUExpdmVTb3VyY2UyKCkgeworICAgIGlmIChtTGl2ZVNlc3Npb24gIT0gTlVMTCkgeworICAgICAgICBtTGl2ZVNlc3Npb24tPmRpc2Nvbm5lY3QoKTsKKworICAgICAgICBtTGl2ZUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobUxpdmVTZXNzaW9uLT5pZCgpKTsKKyAgICAgICAgbUxpdmVMb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKGlkKCkpOworICAgICAgICBtTGl2ZUxvb3Blci0+c3RvcCgpOworCisgICAgICAgIG1MaXZlU2Vzc2lvbi5jbGVhcigpOworICAgICAgICBtTGl2ZUxvb3Blci5jbGVhcigpOworICAgIH0KK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpIVFRQTGl2ZVNvdXJjZTI6OmdldEJ1ZmZlcmluZ1NldHRpbmdzKAorICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSB7CisgICAgKmJ1ZmZlcmluZyA9IG1CdWZmZXJpbmdTZXR0aW5nczsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpIVFRQTGl2ZVNvdXJjZTI6OnNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpIHsKKyAgICBtQnVmZmVyaW5nU2V0dGluZ3MgPSBidWZmZXJpbmc7CisKKyAgICBpZiAobUxpdmVTZXNzaW9uICE9IE5VTEwpIHsKKyAgICAgICAgbUxpdmVTZXNzaW9uLT5zZXRCdWZmZXJpbmdTZXR0aW5ncyhtQnVmZmVyaW5nU2V0dGluZ3MpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlMjo6cHJlcGFyZUFzeW5jKCkgeworICAgIGlmIChtTGl2ZUxvb3BlciA9PSBOVUxMKSB7CisgICAgICAgIG1MaXZlTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgICAgIG1MaXZlTG9vcGVyLT5zZXROYW1lKCJodHRwIGxpdmUiKTsKKyAgICAgICAgbUxpdmVMb29wZXItPnN0YXJ0KGZhbHNlLCAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogY2FuQ2FsbEphdmEgKi8pOworCisgICAgICAgIG1MaXZlTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIodGhpcyk7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFNlc3Npb25Ob3RpZnksIHRoaXMpOworCisgICAgbUxpdmVTZXNzaW9uID0gbmV3IExpdmVTZXNzaW9uKAorICAgICAgICAgICAgbm90aWZ5LAorICAgICAgICAgICAgKG1GbGFncyAmIGtGbGFnSW5jb2duaXRvKSA/IExpdmVTZXNzaW9uOjprRmxhZ0luY29nbml0byA6IDAsCisgICAgICAgICAgICBtSFRUUFNlcnZpY2UpOworCisgICAgbUxpdmVMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtTGl2ZVNlc3Npb24pOworCisgICAgbUxpdmVTZXNzaW9uLT5zZXRCdWZmZXJpbmdTZXR0aW5ncyhtQnVmZmVyaW5nU2V0dGluZ3MpOworICAgIG1MaXZlU2Vzc2lvbi0+Y29ubmVjdEFzeW5jKAorICAgICAgICAgICAgbVVSTC5jX3N0cigpLCBtRXh0cmFIZWFkZXJzLmlzRW1wdHkoKSA/IE5VTEwgOiAmbUV4dHJhSGVhZGVycyk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpIVFRQTGl2ZVNvdXJjZTI6OnN0YXJ0KCkgeworfQorCitzcDxNZXRhRGF0YT4gTnVQbGF5ZXIyOjpIVFRQTGl2ZVNvdXJjZTI6OmdldEZvcm1hdE1ldGEoYm9vbCBhdWRpbykgeworICAgIHNwPE1ldGFEYXRhPiBtZXRhOworICAgIGlmIChtTGl2ZVNlc3Npb24gIT0gTlVMTCkgeworICAgICAgICBtTGl2ZVNlc3Npb24tPmdldFN0cmVhbUZvcm1hdE1ldGEoCisgICAgICAgICAgICAgICAgYXVkaW8gPyBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9BVURJTworICAgICAgICAgICAgICAgICAgICAgIDogTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfVklERU8sCisgICAgICAgICAgICAgICAgJm1ldGEpOworICAgIH0KKworICAgIHJldHVybiBtZXRhOworfQorCitzcDxBTWVzc2FnZT4gTnVQbGF5ZXIyOjpIVFRQTGl2ZVNvdXJjZTI6OmdldEZvcm1hdChib29sIGF1ZGlvKSB7CisgICAgc3A8TWV0YURhdGE+IG1ldGE7CisgICAgc3RhdHVzX3QgZXJyID0gLUVXT1VMREJMT0NLOworICAgIGlmIChtTGl2ZVNlc3Npb24gIT0gTlVMTCkgeworICAgICAgICBlcnIgPSBtTGl2ZVNlc3Npb24tPmdldFN0cmVhbUZvcm1hdE1ldGEoCisgICAgICAgICAgICAgICAgYXVkaW8gPyBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9BVURJTworICAgICAgICAgICAgICAgICAgICAgIDogTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfVklERU8sCisgICAgICAgICAgICAgICAgJm1ldGEpOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgaWYgKGVyciA9PSAtRVdPVUxEQkxPQ0spIHsKKyAgICAgICAgZm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgIHJldHVybiBmb3JtYXQ7CisgICAgfQorCisgICAgaWYgKGVyciAhPSBPSyB8fCBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UobWV0YSwgJmZvcm1hdCkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBmb3JtYXQ7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6SFRUUExpdmVTb3VyY2UyOjpmZWVkTW9yZVRTRGF0YSgpIHsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6SFRUUExpdmVTb3VyY2UyOjpkZXF1ZXVlQWNjZXNzVW5pdCgKKyAgICAgICAgYm9vbCBhdWRpbywgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpIHsKKyAgICByZXR1cm4gbUxpdmVTZXNzaW9uLT5kZXF1ZXVlQWNjZXNzVW5pdCgKKyAgICAgICAgICAgIGF1ZGlvID8gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfQVVESU8KKyAgICAgICAgICAgICAgICAgIDogTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfVklERU8sCisgICAgICAgICAgICBhY2Nlc3NVbml0KTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpIVFRQTGl2ZVNvdXJjZTI6OmdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpIHsKKyAgICByZXR1cm4gbUxpdmVTZXNzaW9uLT5nZXREdXJhdGlvbihkdXJhdGlvblVzKTsKK30KKworc2l6ZV90IE51UGxheWVyMjo6SFRUUExpdmVTb3VyY2UyOjpnZXRUcmFja0NvdW50KCkgY29uc3QgeworICAgIHJldHVybiBtTGl2ZVNlc3Npb24tPmdldFRyYWNrQ291bnQoKTsKK30KKworc3A8QU1lc3NhZ2U+IE51UGxheWVyMjo6SFRUUExpdmVTb3VyY2UyOjpnZXRUcmFja0luZm8oc2l6ZV90IHRyYWNrSW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUxpdmVTZXNzaW9uLT5nZXRUcmFja0luZm8odHJhY2tJbmRleCk7Cit9CisKK3NzaXplX3QgTnVQbGF5ZXIyOjpIVFRQTGl2ZVNvdXJjZTI6OmdldFNlbGVjdGVkVHJhY2sobWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdCB7CisgICAgaWYgKG1MaXZlU2Vzc2lvbiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9NRVRBREFUQSkgeworICAgICAgICAvLyBNRURJQV9UUkFDS19UWVBFX01FVEFEQVRBIGlzIGFsd2F5cyBsYXN0IHRyYWNrCisgICAgICAgIC8vIG1NZXRhZGF0YVNlbGVjdGVkIGNhbiBvbmx5IGJlIHRydWUgd2hlbiBtSGFzTWV0YWRhdGEgaXMgdHJ1ZQorICAgICAgICByZXR1cm4gbU1ldGFkYXRhU2VsZWN0ZWQgPyAobUxpdmVTZXNzaW9uLT5nZXRUcmFja0NvdW50KCkgLSAxKSA6IC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtTGl2ZVNlc3Npb24tPmdldFNlbGVjdGVkVHJhY2sodHlwZSk7CisgICAgfQorfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlMjo6c2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0LCBpbnQ2NF90IC8qdGltZVVzKi8pIHsKKyAgICBpZiAobUxpdmVTZXNzaW9uID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IElOVkFMSURfT1BFUkFUSU9OOworICAgIGJvb2wgcG9zdEZldGNoTXNnID0gZmFsc2UsIGlzU3ViID0gZmFsc2U7CisgICAgaWYgKCFtSGFzTWV0YWRhdGEgfHwgdHJhY2tJbmRleCAhPSBtTGl2ZVNlc3Npb24tPmdldFRyYWNrQ291bnQoKSAtIDEpIHsKKyAgICAgICAgZXJyID0gbUxpdmVTZXNzaW9uLT5zZWxlY3RUcmFjayh0cmFja0luZGV4LCBzZWxlY3QpOworICAgICAgICBwb3N0RmV0Y2hNc2cgPSBzZWxlY3Q7CisgICAgICAgIGlzU3ViID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBtZXRhZGF0YSB0cmFjazsgaS5lLiAobUhhc01ldGFkYXRhICYmIHRyYWNrSW5kZXggPT0gbUxpdmVTZXNzaW9uLT5nZXRUcmFja0NvdW50KCkgLSAxKQorICAgICAgICBpZiAobU1ldGFkYXRhU2VsZWN0ZWQgJiYgIXNlbGVjdCkgeworICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgIH0gZWxzZSBpZiAoIW1NZXRhZGF0YVNlbGVjdGVkICYmIHNlbGVjdCkgeworICAgICAgICAgICAgcG9zdEZldGNoTXNnID0gdHJ1ZTsKKyAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXJyID0gQkFEX1ZBTFVFOyAvLyBiZWhhdmUgYXMgTGl2ZVNlc3Npb246OnNlbGVjdFRyYWNrCisgICAgICAgIH0KKworICAgICAgICBtTWV0YWRhdGFTZWxlY3RlZCA9IHNlbGVjdDsKKyAgICB9CisKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIGludDMyX3QgJmdlbmVyYXRpb24gPSBpc1N1YiA/IG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24gOiBtRmV0Y2hNZXRhRGF0YUdlbmVyYXRpb247CisgICAgICAgIGdlbmVyYXRpb24rKzsKKyAgICAgICAgaWYgKHBvc3RGZXRjaE1zZykgeworICAgICAgICAgICAgaW50MzJfdCB3aGF0ID0gaXNTdWIgPyBrV2hhdEZldGNoU3VidGl0bGVEYXRhIDoga1doYXRGZXRjaE1ldGFEYXRhOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSh3aGF0LCB0aGlzKTsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBnZW5lcmF0aW9uKTsKKyAgICAgICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTGl2ZVNlc3Npb246OnNlbGVjdFRyYWNrIHJldHVybnMgQkFEX1ZBTFVFIHdoZW4gc2VsZWN0aW5nIHRoZSBjdXJyZW50bHkKKyAgICAvLyBzZWxlY3RlZCB0cmFjaywgb3IgdW5zZWxlY3RpbmcgYSBub24tc2VsZWN0ZWQgdHJhY2suIEluIHRoaXMgY2FzZSBpdCdzIGFuCisgICAgLy8gbm8tb3Agc28gd2UgcmV0dXJuIE9LLgorICAgIHJldHVybiAoZXJyID09IE9LIHx8IGVyciA9PSBCQURfVkFMVUUpID8gKHN0YXR1c190KU9LIDogZXJyOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlMjo6c2Vla1RvKGludDY0X3Qgc2Vla1RpbWVVcywgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSkgeworICAgIGlmIChtTGl2ZVNlc3Npb24tPmlzU2Vla2FibGUoKSkgeworICAgICAgICByZXR1cm4gbUxpdmVTZXNzaW9uLT5zZWVrVG8oc2Vla1RpbWVVcywgbW9kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlMjo6cG9sbEZvclJhd0RhdGEoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBpbnQzMl90IGN1cnJlbnRHZW5lcmF0aW9uLAorICAgICAgICBMaXZlU2Vzc2lvbjo6U3RyZWFtVHlwZSBmZXRjaFR5cGUsIGludDMyX3QgcHVzaFdoYXQpIHsKKworICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisKKyAgICBpZiAoZ2VuZXJhdGlvbiAhPSBjdXJyZW50R2VuZXJhdGlvbikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgIHdoaWxlIChtTGl2ZVNlc3Npb24tPmRlcXVldWVBY2Nlc3NVbml0KGZldGNoVHlwZSwgJmJ1ZmZlcikgPT0gT0spIHsKKworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBwdXNoV2hhdCk7CisgICAgICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJidWZmZXIiLCBidWZmZXIpOworCisgICAgICAgIGludDY0X3QgdGltZVVzLCBiYXNlVXMsIGRlbGF5VXM7CisgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoImJhc2VVcyIsICZiYXNlVXMpKTsKKyAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworICAgICAgICBkZWxheVVzID0gYmFzZVVzICsgdGltZVVzIC0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKworICAgICAgICBpZiAoZmV0Y2hUeXBlID09IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1NVQlRJVExFUykgeworICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICBtc2ctPnBvc3QoZGVsYXlVcyA+IDBsbCA/IGRlbGF5VXMgOiAwbGwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKGZldGNoVHlwZSA9PSBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9NRVRBREFUQSkgeworICAgICAgICAgICAgaWYgKGRlbGF5VXMgPCAtMTAwMDAwMGxsKSB7IC8vIDEgc2Vjb25kCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgIC8vIHB1c2ggYWxsIGN1cnJlbnRseSBhdmFpbGFibGUgbWV0YWRhdGEgYnVmZmVycyBpbiBlYWNoIGludm9jYXRpb24gb2YgcG9sbEZvclJhd0RhdGEKKyAgICAgICAgICAgIC8vIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHRyeSBhZ2FpbiBpbiAxIHNlY29uZAorICAgIG1zZy0+cG9zdCgxMDAwMDAwbGwpOworfQorCit2b2lkIE51UGxheWVyMjo6SFRUUExpdmVTb3VyY2UyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdFNlc3Npb25Ob3RpZnk6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uU2Vzc2lvbk5vdGlmeShtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGE6CisgICAgICAgIHsKKyAgICAgICAgICAgIHBvbGxGb3JSYXdEYXRhKAorICAgICAgICAgICAgICAgICAgICBtc2csIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgIC8qIGZldGNoICovIExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1NVQlRJVExFUywKKyAgICAgICAgICAgICAgICAgICAgLyogcHVzaCAqLyBrV2hhdFN1YnRpdGxlRGF0YSk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEZldGNoTWV0YURhdGE6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghbU1ldGFkYXRhU2VsZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcG9sbEZvclJhd0RhdGEoCisgICAgICAgICAgICAgICAgICAgIG1zZywgbUZldGNoTWV0YURhdGFHZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAvKiBmZXRjaCAqLyBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9NRVRBREFUQSwKKyAgICAgICAgICAgICAgICAgICAgLyogcHVzaCAqLyBrV2hhdFRpbWVkTWV0YURhdGEpOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBTb3VyY2U6Om9uTWVzc2FnZVJlY2VpdmVkKG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpIVFRQTGl2ZVNvdXJjZTI6Om9uU2Vzc2lvbk5vdGlmeShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGludDMyX3Qgd2hhdDsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigid2hhdCIsICZ3aGF0KSk7CisKKyAgICBzd2l0Y2ggKHdoYXQpIHsKKyAgICAgICAgY2FzZSBMaXZlU2Vzc2lvbjo6a1doYXRQcmVwYXJlZDoKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm90aWZ5IHRoZSBjdXJyZW50IHNpemUgaGVyZSBpZiB3ZSBoYXZlIGl0LCBvdGhlcndpc2UgcmVwb3J0IGFuIGluaXRpYWwgc2l6ZSBvZiAoMCwwKQorICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IGdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLyk7CisgICAgICAgICAgICBpbnQzMl90IHdpZHRoOworICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQ7CisgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSAmJiBmb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICBub3RpZnlWaWRlb1NpemVDaGFuZ2VkKGZvcm1hdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICAgICAgaWYgKG1MaXZlU2Vzc2lvbi0+aXNTZWVrYWJsZSgpKSB7CisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19DQU5fUEFVU0U7CisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19DQU5fU0VFSzsKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX0NBTl9TRUVLX0JBQ0tXQVJEOworICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfQ0FOX1NFRUtfRk9SV0FSRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1MaXZlU2Vzc2lvbi0+aGFzRHluYW1pY0R1cmF0aW9uKCkpIHsKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX0RZTkFNSUNfRFVSQVRJT047CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5vdGlmeUZsYWdzQ2hhbmdlZChmbGFncyk7CisKKyAgICAgICAgICAgIG5vdGlmeVByZXBhcmVkKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTGl2ZVNlc3Npb246OmtXaGF0UHJlcGFyYXRpb25GYWlsZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisKKyAgICAgICAgICAgIG5vdGlmeVByZXBhcmVkKGVycik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTGl2ZVNlc3Npb246OmtXaGF0U3RyZWFtc0NoYW5nZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGNoYW5nZWRNYXNrOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoCisgICAgICAgICAgICAgICAgICAgICAgICAiY2hhbmdlZE1hc2siLCAoaW50MzJfdCAqKSZjaGFuZ2VkTWFzaykpOworCisgICAgICAgICAgICBib29sIGF1ZGlvID0gY2hhbmdlZE1hc2sgJiBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9BVURJTzsKKyAgICAgICAgICAgIGJvb2wgdmlkZW8gPSBjaGFuZ2VkTWFzayAmIExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1ZJREVPOworCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJyZXBseSIsICZyZXBseSkpOworCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRRdWV1ZURlY29kZXJTaHV0ZG93bik7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJhdWRpbyIsIGF1ZGlvKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInZpZGVvIiwgdmlkZW8pOworICAgICAgICAgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJyZXBseSIsIHJlcGx5KTsKKyAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIExpdmVTZXNzaW9uOjprV2hhdEJ1ZmZlcmluZ1N0YXJ0OgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRQYXVzZU9uQnVmZmVyaW5nU3RhcnQpOworICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTGl2ZVNlc3Npb246OmtXaGF0QnVmZmVyaW5nRW5kOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRSZXN1bWVPbkJ1ZmZlcmluZ0VuZCk7CisgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKworICAgICAgICBjYXNlIExpdmVTZXNzaW9uOjprV2hhdEJ1ZmZlcmluZ1VwZGF0ZToKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgICAgICAgICAgaW50MzJfdCBwZXJjZW50YWdlOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInBlcmNlbnRhZ2UiLCAmcGVyY2VudGFnZSkpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0QnVmZmVyaW5nVXBkYXRlKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInBlcmNlbnRhZ2UiLCBwZXJjZW50YWdlKTsKKyAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIExpdmVTZXNzaW9uOjprV2hhdE1ldGFkYXRhRGV0ZWN0ZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghbUhhc01ldGFkYXRhKSB7CisgICAgICAgICAgICAgICAgbUhhc01ldGFkYXRhID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICAgICAgICAgICAgICAvLyBub3RpZmljYXRpb24gd2l0aG91dCBidWZmZXIgdHJpZ2dlcnMgTUVESUEyX0lORk9fTUVUQURBVEFfVVBEQVRFCisgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0VGltZWRNZXRhRGF0YSk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTGl2ZVNlc3Npb246OmtXaGF0RXJyb3I6CisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0hUVFBMaXZlU291cmNlMi5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZTIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2QzNjUzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZTIuaApAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEhUVFBfTElWRV9TT1VSQ0UyX0hfCisKKyNkZWZpbmUgSFRUUF9MSVZFX1NPVVJDRTJfSF8KKworI2luY2x1ZGUgIk51UGxheWVyMi5oIgorI2luY2x1ZGUgIk51UGxheWVyMlNvdXJjZS5oIgorCisjaW5jbHVkZSAiTGl2ZVNlc3Npb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTGl2ZVNlc3Npb247CisKK3N0cnVjdCBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlMiA6IHB1YmxpYyBOdVBsYXllcjI6OlNvdXJjZSB7CisgICAgSFRUUExpdmVTb3VyY2UyKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlcmluZ1NldHRpbmdzKAorICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYygpOworICAgIHZpcnR1YWwgdm9pZCBzdGFydCgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkZXF1ZXVlQWNjZXNzVW5pdChib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCk7CisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0TWV0YShib29sIGF1ZGlvKTsKKyAgICB2aXJ0dWFsIHNwPEFNZXNzYWdlPiBnZXRGb3JtYXQoYm9vbCBhdWRpbyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGZlZWRNb3JlVFNEYXRhKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKTsKKyAgICB2aXJ0dWFsIHNpemVfdCBnZXRUcmFja0NvdW50KCkgY29uc3Q7CisgICAgdmlydHVhbCBzcDxBTWVzc2FnZT4gZ2V0VHJhY2tJbmZvKHNpemVfdCB0cmFja0luZGV4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIC8qIHR5cGUgKi8pIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0LCBpbnQ2NF90IHRpbWVVcyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZWVrVG8oCisgICAgICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXMsCisgICAgICAgICAgICBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQykgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5IVFRQTGl2ZVNvdXJjZTIoKTsKKworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKK3ByaXZhdGU6CisgICAgZW51bSBGbGFncyB7CisgICAgICAgIC8vIERvbid0IGxvZyBhbnkgVVJMcy4KKyAgICAgICAga0ZsYWdJbmNvZ25pdG8gPSAxLAorICAgIH07CisKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRTZXNzaW9uTm90aWZ5LAorICAgICAgICBrV2hhdEZldGNoU3VidGl0bGVEYXRhLAorICAgICAgICBrV2hhdEZldGNoTWV0YURhdGEsCisgICAgfTsKKworICAgIHNwPE1lZGlhSFRUUFNlcnZpY2U+IG1IVFRQU2VydmljZTsKKyAgICBBU3RyaW5nIG1VUkw7CisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUV4dHJhSGVhZGVyczsKKyAgICB1aW50MzJfdCBtRmxhZ3M7CisgICAgc3RhdHVzX3QgbUZpbmFsUmVzdWx0OworICAgIG9mZjY0X3QgbU9mZnNldDsKKyAgICBzcDxBTG9vcGVyPiBtTGl2ZUxvb3BlcjsKKyAgICBzcDxMaXZlU2Vzc2lvbj4gbUxpdmVTZXNzaW9uOworICAgIGludDMyX3QgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbjsKKyAgICBpbnQzMl90IG1GZXRjaE1ldGFEYXRhR2VuZXJhdGlvbjsKKyAgICBib29sIG1IYXNNZXRhZGF0YTsKKyAgICBib29sIG1NZXRhZGF0YVNlbGVjdGVkOworICAgIEJ1ZmZlcmluZ1NldHRpbmdzIG1CdWZmZXJpbmdTZXR0aW5nczsKKworICAgIHZvaWQgb25TZXNzaW9uTm90aWZ5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIHBvbGxGb3JSYXdEYXRhKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIGludDMyX3QgY3VycmVudEdlbmVyYXRpb24sCisgICAgICAgICAgICBMaXZlU2Vzc2lvbjo6U3RyZWFtVHlwZSBmZXRjaFR5cGUsIGludDMyX3QgcHVzaFdoYXQpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSFRUUExpdmVTb3VyY2UyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gSFRUUF9MSVZFX1NPVVJDRTJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSldha2VMb2NrLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSldha2VMb2NrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWExMDcxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KV2FrZUxvY2suY3BwCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkpXYWtlTG9jayIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkpXYWtlTG9jay5oIgorCisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8cG93ZXJtYW5hZ2VyL1Bvd2VyTWFuYWdlci5oPgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy9UT0RPOiB1c2UgSkFWQSBQb3dlck1hbmFnZXIsIGluc3RlYWQgb2YgYmluZGVyCitKV2FrZUxvY2s6OkpXYWtlTG9jaygpIDoKKyAgICBtUG93ZXJNYW5hZ2VyKE5VTEwpLAorICAgIG1XYWtlTG9ja1Rva2VuKE5VTEwpLAorICAgIG1XYWtlTG9ja0NvdW50KDApLAorICAgIG1EZWF0aFJlY2lwaWVudChuZXcgUE1EZWF0aFJlY2lwaWVudCh0aGlzKSkge30KKworSldha2VMb2NrOjp+Sldha2VMb2NrKCkgeworICAgIGlmIChtUG93ZXJNYW5hZ2VyICE9IE5VTEwpIHsKKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gSUludGVyZmFjZTo6YXNCaW5kZXIobVBvd2VyTWFuYWdlcik7CisgICAgICAgIGJpbmRlci0+dW5saW5rVG9EZWF0aChtRGVhdGhSZWNpcGllbnQpOworICAgIH0KKyAgICBjbGVhclBvd2VyTWFuYWdlcigpOworfQorCitib29sIEpXYWtlTG9jazo6YWNxdWlyZSgpIHsKKyAgICBpZiAobVdha2VMb2NrQ291bnQgPT0gMCkgeworICAgICAgICBDSEVDSyhtV2FrZUxvY2tUb2tlbiA9PSBOVUxMKTsKKyAgICAgICAgaWYgKG1Qb3dlck1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgLy8gdXNlIGNoZWNrU2VydmljZSgpIHRvIGF2b2lkIGJsb2NraW5nIGlmIHBvd2VyIHNlcnZpY2UgaXMgbm90IHVwIHlldAorICAgICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0KKyAgICAgICAgICAgICAgICBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Y2hlY2tTZXJ2aWNlKFN0cmluZzE2KCJwb3dlciIpKTsKKyAgICAgICAgICAgIGlmIChiaW5kZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJjb3VsZCBub3QgZ2V0IHRoZSBwb3dlciBtYW5hZ2VyIHNlcnZpY2UiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVBvd2VyTWFuYWdlciA9IGludGVyZmFjZV9jYXN0PElQb3dlck1hbmFnZXI+KGJpbmRlcik7CisgICAgICAgICAgICAgICAgYmluZGVyLT5saW5rVG9EZWF0aChtRGVhdGhSZWNpcGllbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtUG93ZXJNYW5hZ2VyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IG5ldyBCQmluZGVyKCk7CisgICAgICAgICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1Qb3dlck1hbmFnZXItPmFjcXVpcmVXYWtlTG9jaygKKyAgICAgICAgICAgICAgICAgICAgUE9XRVJNQU5BR0VSX1BBUlRJQUxfV0FLRV9MT0NLLAorICAgICAgICAgICAgICAgICAgICBiaW5kZXIsIFN0cmluZzE2KCJKV2FrZUxvY2siKSwgU3RyaW5nMTYoIm1lZGlhIikpOworICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgbVdha2VMb2NrVG9rZW4gPSBiaW5kZXI7CisgICAgICAgICAgICAgICAgbVdha2VMb2NrQ291bnQrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1XYWtlTG9ja0NvdW50Kys7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgSldha2VMb2NrOjpyZWxlYXNlKGJvb2wgZm9yY2UpIHsKKyAgICBpZiAobVdha2VMb2NrQ291bnQgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChmb3JjZSkgeworICAgICAgICAvLyBGb3JjZSB3YWtlbG9jayByZWxlYXNlIGJlbG93IGJ5IHNldHRpbmcgcmVmZXJlbmNlIGNvdW50IHRvIDEuCisgICAgICAgIG1XYWtlTG9ja0NvdW50ID0gMTsKKyAgICB9CisgICAgaWYgKC0tbVdha2VMb2NrQ291bnQgPT0gMCkgeworICAgICAgICBDSEVDSyhtV2FrZUxvY2tUb2tlbiAhPSBOVUxMKTsKKyAgICAgICAgaWYgKG1Qb3dlck1hbmFnZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLT5yZWxlYXNlV2FrZUxvY2sobVdha2VMb2NrVG9rZW4sIDAgLyogZmxhZ3MgKi8pOworICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisgICAgICAgIH0KKyAgICAgICAgbVdha2VMb2NrVG9rZW4uY2xlYXIoKTsKKyAgICB9Cit9CisKK3ZvaWQgSldha2VMb2NrOjpjbGVhclBvd2VyTWFuYWdlcigpIHsKKyAgICByZWxlYXNlKHRydWUpOworICAgIG1Qb3dlck1hbmFnZXIuY2xlYXIoKTsKK30KKwordm9pZCBKV2FrZUxvY2s6OlBNRGVhdGhSZWNpcGllbnQ6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkgeworICAgIGlmIChtV2FrZUxvY2sgIT0gTlVMTCkgeworICAgICAgICBtV2FrZUxvY2stPmNsZWFyUG93ZXJNYW5hZ2VyKCk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KV2FrZUxvY2suaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSldha2VMb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFjZTg3ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSldha2VMb2NrLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBKX1dBS0VMT0NLX0hfCisjZGVmaW5lIEpfV0FLRUxPQ0tfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxwb3dlcm1hbmFnZXIvSVBvd2VyTWFuYWdlci5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBKV2FrZUxvY2sgOiBwdWJsaWMgUmVmQmFzZSB7CisKK3B1YmxpYzoKKyAgICBKV2FrZUxvY2soKTsKKworICAgIC8vIE5PVEU6IGFjcXVpcmUgYW5kIHJlbGVhc2UgYXJlIG5vdCB0aHJlYWQgc2FmZQorCisgICAgLy8gcmV0dXJucyB0cnVlIGlmIHdha2Vsb2NrIHdhcyBhY3F1aXJlZAorICAgIGJvb2wgYWNxdWlyZSgpOworICAgIHZvaWQgcmVsZWFzZShib29sIGZvcmNlID0gZmFsc2UpOworCisgICAgdmlydHVhbCB+Sldha2VMb2NrKCk7CisKK3ByaXZhdGU6CisgICAgc3A8SVBvd2VyTWFuYWdlcj4gbVBvd2VyTWFuYWdlcjsKKyAgICBzcDxJQmluZGVyPiAgICAgICBtV2FrZUxvY2tUb2tlbjsKKyAgICB1aW50MzJfdCAgICAgICAgICBtV2FrZUxvY2tDb3VudDsKKworICAgIGNsYXNzIFBNRGVhdGhSZWNpcGllbnQgOiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgUE1EZWF0aFJlY2lwaWVudChKV2FrZUxvY2sgKndha2VMb2NrKSA6IG1XYWtlTG9jayh3YWtlTG9jaykge30KKyAgICAgICAgdmlydHVhbCB+UE1EZWF0aFJlY2lwaWVudCgpIHt9CisKKyAgICAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKKyAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJndobyk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBQTURlYXRoUmVjaXBpZW50KGNvbnN0IFBNRGVhdGhSZWNpcGllbnQmKTsKKyAgICAgICAgUE1EZWF0aFJlY2lwaWVudCYgb3BlcmF0b3I9IChjb25zdCBQTURlYXRoUmVjaXBpZW50Jik7CisKKyAgICAgICAgSldha2VMb2NrICptV2FrZUxvY2s7CisgICAgfTsKKworICAgIGNvbnN0IHNwPFBNRGVhdGhSZWNpcGllbnQ+IG1EZWF0aFJlY2lwaWVudDsKKworICAgIHZvaWQgY2xlYXJQb3dlck1hbmFnZXIoKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEpXYWtlTG9jayk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEpfV0FLRUxPQ0tfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmNvcHkgdG8gbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9OT1RJQ0UgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTk9USUNFCnJlbmFtZSB0byBtZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL05PVElDRQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MGI2OTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMi5jcHAKQEAgLTAsMCArMSwzMTE0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk51UGxheWVyMiIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIk51UGxheWVyMi5oIgorCisjaW5jbHVkZSAiSFRUUExpdmVTb3VyY2UyLmgiCisjaW5jbHVkZSAiTnVQbGF5ZXIyQ0NEZWNvZGVyLmgiCisjaW5jbHVkZSAiTnVQbGF5ZXIyRGVjb2Rlci5oIgorI2luY2x1ZGUgIk51UGxheWVyMkRlY29kZXJCYXNlLmgiCisjaW5jbHVkZSAiTnVQbGF5ZXIyRGVjb2RlclBhc3NUaHJvdWdoLmgiCisjaW5jbHVkZSAiTnVQbGF5ZXIyRHJpdmVyLmgiCisjaW5jbHVkZSAiTnVQbGF5ZXIyUmVuZGVyZXIuaCIKKyNpbmNsdWRlICJOdVBsYXllcjJTb3VyY2UuaCIKKyNpbmNsdWRlICJSVFNQU291cmNlMi5oIgorI2luY2x1ZGUgIkdlbmVyaWNTb3VyY2UyLmgiCisjaW5jbHVkZSAiVGV4dERlc2NyaXB0aW9ucy5oIgorCisjaW5jbHVkZSAiQVRTUGFyc2VyLmgiCisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgorI2luY2x1ZGUgPG1lZGlhL0FWU3luY1NldHRpbmdzLmg+CisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZURlc2MuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrV3JhcHBlci5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ2xvY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisKKyNpbmNsdWRlICJFU0RTLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKworI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgc3RhdHVzX3Qgc2VuZE1ldGFEYXRhVG9IYWwoc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlOjpBdWRpb1Npbms+JiBzaW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSkgeworICAgIGludDMyX3Qgc2FtcGxlUmF0ZSA9IDA7CisgICAgaW50MzJfdCBiaXRSYXRlID0gMDsKKyAgICBpbnQzMl90IGNoYW5uZWxNYXNrID0gMDsKKyAgICBpbnQzMl90IGRlbGF5U2FtcGxlcyA9IDA7CisgICAgaW50MzJfdCBwYWRkaW5nU2FtcGxlcyA9IDA7CisKKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7CisKKyAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQVVESU9fT0ZGTE9BRF9DT0RFQ19TQU1QTEVfUkFURSksIHNhbXBsZVJhdGUpOworICAgIH0KKyAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsTWFzaywgJmNoYW5uZWxNYXNrKSkgeworICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19PRkZMT0FEX0NPREVDX05VTV9DSEFOTkVMKSwgY2hhbm5lbE1hc2spOworICAgIH0KKyAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmYml0UmF0ZSkpIHsKKyAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQVVESU9fT0ZGTE9BRF9DT0RFQ19BVkdfQklUX1JBVEUpLCBiaXRSYXRlKTsKKyAgICB9CisgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5RW5jb2RlckRlbGF5LCAmZGVsYXlTYW1wbGVzKSkgeworICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19PRkZMT0FEX0NPREVDX0RFTEFZX1NBTVBMRVMpLCBkZWxheVNhbXBsZXMpOworICAgIH0KKyAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlFbmNvZGVyUGFkZGluZywgJnBhZGRpbmdTYW1wbGVzKSkgeworICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19PRkZMT0FEX0NPREVDX1BBRERJTkdfU0FNUExFUyksIHBhZGRpbmdTYW1wbGVzKTsKKyAgICB9CisKKyAgICBBTE9HVigic2VuZE1ldGFEYXRhVG9IYWw6IGJpdFJhdGUgJWQsIHNhbXBsZVJhdGUgJWQsIGNoYW5NYXNrICVkLCIKKyAgICAgICAgICAiZGVsYXlTYW1wbGUgJWQsIHBhZGRpbmdTYW1wbGUgJWQiLCBiaXRSYXRlLCBzYW1wbGVSYXRlLAorICAgICAgICAgIGNoYW5uZWxNYXNrLCBkZWxheVNhbXBsZXMsIHBhZGRpbmdTYW1wbGVzKTsKKworICAgIHNpbmstPnNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7CisgICAgcmV0dXJuIE9LOworfQorCisKK3N0cnVjdCBOdVBsYXllcjI6OkFjdGlvbiA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBBY3Rpb24oKSB7fQorCisgICAgdmlydHVhbCB2b2lkIGV4ZWN1dGUoTnVQbGF5ZXIyICpwbGF5ZXIpID0gMDsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBY3Rpb24pOworfTsKKworc3RydWN0IE51UGxheWVyMjo6U2Vla0FjdGlvbiA6IHB1YmxpYyBBY3Rpb24geworICAgIGV4cGxpY2l0IFNlZWtBY3Rpb24oaW50NjRfdCBzZWVrVGltZVVzLCBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlKQorICAgICAgICA6IG1TZWVrVGltZVVzKHNlZWtUaW1lVXMpLAorICAgICAgICAgIG1Nb2RlKG1vZGUpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZXhlY3V0ZShOdVBsYXllcjIgKnBsYXllcikgeworICAgICAgICBwbGF5ZXItPnBlcmZvcm1TZWVrKG1TZWVrVGltZVVzLCBtTW9kZSk7CisgICAgfQorCitwcml2YXRlOgorICAgIGludDY0X3QgbVNlZWtUaW1lVXM7CisgICAgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbU1vZGU7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTZWVrQWN0aW9uKTsKK307CisKK3N0cnVjdCBOdVBsYXllcjI6OlJlc3VtZURlY29kZXJBY3Rpb24gOiBwdWJsaWMgQWN0aW9uIHsKKyAgICBleHBsaWNpdCBSZXN1bWVEZWNvZGVyQWN0aW9uKGJvb2wgbmVlZE5vdGlmeSkKKyAgICAgICAgOiBtTmVlZE5vdGlmeShuZWVkTm90aWZ5KSB7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGV4ZWN1dGUoTnVQbGF5ZXIyICpwbGF5ZXIpIHsKKyAgICAgICAgcGxheWVyLT5wZXJmb3JtUmVzdW1lRGVjb2RlcnMobU5lZWROb3RpZnkpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBib29sIG1OZWVkTm90aWZ5OworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmVzdW1lRGVjb2RlckFjdGlvbik7Cit9OworCitzdHJ1Y3QgTnVQbGF5ZXIyOjpTZXRTdXJmYWNlQWN0aW9uIDogcHVibGljIEFjdGlvbiB7CisgICAgZXhwbGljaXQgU2V0U3VyZmFjZUFjdGlvbihjb25zdCBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gJm53dykKKyAgICAgICAgOiBtTmF0aXZlV2luZG93KG53dykgeworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBleGVjdXRlKE51UGxheWVyMiAqcGxheWVyKSB7CisgICAgICAgIHBsYXllci0+cGVyZm9ybVNldFN1cmZhY2UobU5hdGl2ZVdpbmRvdyk7CisgICAgfQorCitwcml2YXRlOgorICAgIHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiBtTmF0aXZlV2luZG93OworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2V0U3VyZmFjZUFjdGlvbik7Cit9OworCitzdHJ1Y3QgTnVQbGF5ZXIyOjpGbHVzaERlY29kZXJBY3Rpb24gOiBwdWJsaWMgQWN0aW9uIHsKKyAgICBGbHVzaERlY29kZXJBY3Rpb24oRmx1c2hDb21tYW5kIGF1ZGlvLCBGbHVzaENvbW1hbmQgdmlkZW8pCisgICAgICAgIDogbUF1ZGlvKGF1ZGlvKSwKKyAgICAgICAgICBtVmlkZW8odmlkZW8pIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZXhlY3V0ZShOdVBsYXllcjIgKnBsYXllcikgeworICAgICAgICBwbGF5ZXItPnBlcmZvcm1EZWNvZGVyRmx1c2gobUF1ZGlvLCBtVmlkZW8pOworICAgIH0KKworcHJpdmF0ZToKKyAgICBGbHVzaENvbW1hbmQgbUF1ZGlvOworICAgIEZsdXNoQ29tbWFuZCBtVmlkZW87CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhGbHVzaERlY29kZXJBY3Rpb24pOworfTsKKworc3RydWN0IE51UGxheWVyMjo6UG9zdE1lc3NhZ2VBY3Rpb24gOiBwdWJsaWMgQWN0aW9uIHsKKyAgICBleHBsaWNpdCBQb3N0TWVzc2FnZUFjdGlvbihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykKKyAgICAgICAgOiBtTWVzc2FnZShtc2cpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZXhlY3V0ZShOdVBsYXllcjIgKikgeworICAgICAgICBtTWVzc2FnZS0+cG9zdCgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzcDxBTWVzc2FnZT4gbU1lc3NhZ2U7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQb3N0TWVzc2FnZUFjdGlvbik7Cit9OworCisvLyBVc2UgdGhpcyBpZiB0aGVyZSdzIG5vIHN0YXRlIG5lY2Vzc2FyeSB0byBzYXZlIGluIG9yZGVyIHRvIGV4ZWN1dGUKKy8vIHRoZSBhY3Rpb24uCitzdHJ1Y3QgTnVQbGF5ZXIyOjpTaW1wbGVBY3Rpb24gOiBwdWJsaWMgQWN0aW9uIHsKKyAgICB0eXBlZGVmIHZvaWQgKE51UGxheWVyMjo6KkFjdGlvbkZ1bmMpKCk7CisKKyAgICBleHBsaWNpdCBTaW1wbGVBY3Rpb24oQWN0aW9uRnVuYyBmdW5jKQorICAgICAgICA6IG1GdW5jKGZ1bmMpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZXhlY3V0ZShOdVBsYXllcjIgKnBsYXllcikgeworICAgICAgICAocGxheWVyLT4qbUZ1bmMpKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIEFjdGlvbkZ1bmMgbUZ1bmM7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTaW1wbGVBY3Rpb24pOworfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworTnVQbGF5ZXIyOjpOdVBsYXllcjIocGlkX3QgcGlkLCB1aWRfdCB1aWQsIGNvbnN0IHNwPE1lZGlhQ2xvY2s+ICZtZWRpYUNsb2NrKQorICAgIDogbVBJRChwaWQpLAorICAgICAgbVVJRCh1aWQpLAorICAgICAgbU1lZGlhQ2xvY2sobWVkaWFDbG9jayksCisgICAgICBtU291cmNlRmxhZ3MoMCksCisgICAgICBtT2ZmbG9hZEF1ZGlvKGZhbHNlKSwKKyAgICAgIG1BdWRpb0RlY29kZXJHZW5lcmF0aW9uKDApLAorICAgICAgbVZpZGVvRGVjb2RlckdlbmVyYXRpb24oMCksCisgICAgICBtUmVuZGVyZXJHZW5lcmF0aW9uKDApLAorICAgICAgbUxhc3RTdGFydGVkUGxheWluZ1RpbWVOcygwKSwKKyAgICAgIG1QcmV2aW91c1NlZWtUaW1lVXMoMCksCisgICAgICBtQXVkaW9FT1MoZmFsc2UpLAorICAgICAgbVZpZGVvRU9TKGZhbHNlKSwKKyAgICAgIG1TY2FuU291cmNlc1BlbmRpbmcoZmFsc2UpLAorICAgICAgbVNjYW5Tb3VyY2VzR2VuZXJhdGlvbigwKSwKKyAgICAgIG1Qb2xsRHVyYXRpb25HZW5lcmF0aW9uKDApLAorICAgICAgbVRpbWVkVGV4dEdlbmVyYXRpb24oMCksCisgICAgICBtRmx1c2hpbmdBdWRpbyhOT05FKSwKKyAgICAgIG1GbHVzaGluZ1ZpZGVvKE5PTkUpLAorICAgICAgbVJlc3VtZVBlbmRpbmcoZmFsc2UpLAorICAgICAgbVZpZGVvU2NhbGluZ01vZGUoTkFUSVZFX1dJTkRPV19TQ0FMSU5HX01PREVfU0NBTEVfVE9fV0lORE9XKSwKKyAgICAgIG1QbGF5YmFja1NldHRpbmdzKEFVRElPX1BMQVlCQUNLX1JBVEVfREVGQVVMVCksCisgICAgICBtVmlkZW9GcHNIaW50KC0xLmYpLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbVByZXBhcmVkKGZhbHNlKSwKKyAgICAgIG1SZXNldHRpbmcoZmFsc2UpLAorICAgICAgbVNvdXJjZVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbUF1ZGlvRGVjb2RlckVycm9yKGZhbHNlKSwKKyAgICAgIG1WaWRlb0RlY29kZXJFcnJvcihmYWxzZSksCisgICAgICBtUGF1c2VkKGZhbHNlKSwKKyAgICAgIG1QYXVzZWRCeUNsaWVudCh0cnVlKSwKKyAgICAgIG1QYXVzZWRGb3JCdWZmZXJpbmcoZmFsc2UpLAorICAgICAgbUlzRHJtUHJvdGVjdGVkKGZhbHNlKSwKKyAgICAgIG1EYXRhU291cmNlVHlwZShEQVRBX1NPVVJDRV9UWVBFX05PTkUpIHsKKyAgICBDSEVDSyhtZWRpYUNsb2NrICE9IE5VTEwpOworICAgIGNsZWFyRmx1c2hDb21wbGV0ZSgpOworfQorCitOdVBsYXllcjI6On5OdVBsYXllcjIoKSB7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpzZXREcml2ZXIoY29uc3Qgd3A8TnVQbGF5ZXIyRHJpdmVyPiAmZHJpdmVyKSB7CisgICAgbURyaXZlciA9IGRyaXZlcjsKK30KKworc3RhdGljIGJvb2wgSXNIVFRQTGl2ZVVSTChjb25zdCBjaGFyICp1cmwpIHsKKyAgICBpZiAoIXN0cm5jYXNlY21wKCJodHRwOi8vIiwgdXJsLCA3KQorICAgICAgICAgICAgfHwgIXN0cm5jYXNlY21wKCJodHRwczovLyIsIHVybCwgOCkKKyAgICAgICAgICAgIHx8ICFzdHJuY2FzZWNtcCgiZmlsZTovLyIsIHVybCwgNykpIHsKKyAgICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbih1cmwpOworICAgICAgICBpZiAobGVuID49IDUgJiYgIXN0cmNhc2VjbXAoIi5tM3U4IiwgJnVybFtsZW4gLSA1XSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0cnN0cih1cmwsIm0zdTgiKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6Y3JlYXRlTnVQbGF5ZXIyU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2VEZXNjPiAmZHNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8U291cmNlPiAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFUQV9TT1VSQ0VfVFlQRSAqZGF0YVNvdXJjZVR5cGUpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBOT19FUlJPUjsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0U291cmNlTm90aWZ5LCB0aGlzKTsKKyAgICBub3RpZnktPnNldEludDY0KCJzcmNJZCIsIGRzZC0+bUlkKTsKKworICAgIHN3aXRjaCAoZHNkLT5tVHlwZSkgeworICAgICAgICBjYXNlIERhdGFTb3VyY2VEZXNjOjpUWVBFX1VSTDoKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsID0gZHNkLT5tVXJsLmNfc3RyKCk7CisgICAgICAgICAgICBzaXplX3QgbGVuID0gc3RybGVuKHVybCk7CisKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSA9IGRzZC0+bUh0dHBTZXJ2aWNlOworICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSAmKGRzZC0+bUhlYWRlcnMpOworCisgICAgICAgICAgICBpZiAoSXNIVFRQTGl2ZVVSTCh1cmwpKSB7CisgICAgICAgICAgICAgICAgKnNvdXJjZSA9IG5ldyBIVFRQTGl2ZVNvdXJjZTIobm90aWZ5LCBodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlTnVQbGF5ZXIyU291cmNlIEhUVFBMaXZlU291cmNlMiAlcyIsIHVybCk7CisgICAgICAgICAgICAgICAgKmRhdGFTb3VyY2VUeXBlID0gREFUQV9TT1VSQ0VfVFlQRV9IVFRQX0xJVkU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcCh1cmwsICJydHNwOi8vIiwgNykpIHsKKyAgICAgICAgICAgICAgICAqc291cmNlID0gbmV3IFJUU1BTb3VyY2UyKAorICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LCBodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzLCBtVUlEKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlTnVQbGF5ZXIyU291cmNlIFJUU1BTb3VyY2UyICVzIiwgdXJsKTsKKyAgICAgICAgICAgICAgICAqZGF0YVNvdXJjZVR5cGUgPSBEQVRBX1NPVVJDRV9UWVBFX1JUU1A7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCghc3RybmNhc2VjbXAodXJsLCAiaHR0cDovLyIsIDcpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAhc3RybmNhc2VjbXAodXJsLCAiaHR0cHM6Ly8iLCA4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKGxlbiA+PSA0ICYmICFzdHJjYXNlY21wKCIuc2RwIiwgJnVybFtsZW4gLSA0XSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3Ryc3RyKHVybCwgIi5zZHA/IikpKSB7CisgICAgICAgICAgICAgICAgKnNvdXJjZSA9IG5ldyBSVFNQU291cmNlMigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeSwgaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycywgbVVJRCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZU51UGxheWVyMlNvdXJjZSBSVFNQU291cmNlMiBodHRwL2h0dHBzLy5zZHAgJXMiLCB1cmwpOworICAgICAgICAgICAgICAgICpkYXRhU291cmNlVHlwZSA9IERBVEFfU09VUkNFX1RZUEVfUlRTUDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZU51UGxheWVyMlNvdXJjZSBHZW5lcmljU291cmNlMiAlcyIsIHVybCk7CisKKyAgICAgICAgICAgICAgICBzcDxHZW5lcmljU291cmNlMj4gZ2VuZXJpY1NvdXJjZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgR2VuZXJpY1NvdXJjZTIobm90aWZ5LCBtVUlELCBtTWVkaWFDbG9jayk7CisKKyAgICAgICAgICAgICAgICBlcnIgPSBnZW5lcmljU291cmNlLT5zZXREYXRhU291cmNlKGh0dHBTZXJ2aWNlLCB1cmwsIGhlYWRlcnMpOworCisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAqc291cmNlID0gZ2VuZXJpY1NvdXJjZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAqc291cmNlID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgTnVQbGF5ZXIyU291cmNlISIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHJlZ2FyZGxlc3Mgb2Ygc3VjY2Vzcy9mYWlsdXJlCisgICAgICAgICAgICAgICAgKmRhdGFTb3VyY2VUeXBlID0gREFUQV9TT1VSQ0VfVFlQRV9HRU5FUklDX1VSTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBEYXRhU291cmNlRGVzYzo6VFlQRV9GRDoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8R2VuZXJpY1NvdXJjZTI+IGdlbmVyaWNTb3VyY2UgPQorICAgICAgICAgICAgICAgICAgICBuZXcgR2VuZXJpY1NvdXJjZTIobm90aWZ5LCBtVUlELCBtTWVkaWFDbG9jayk7CisKKyAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVOdVBsYXllcjJTb3VyY2UgZmQgJWQvJWxsZC8lbGxkIHNvdXJjZTogJXAiLAorICAgICAgICAgICAgICAgICAgZHNkLT5tRkQsIChsb25nIGxvbmcpZHNkLT5tRkRPZmZzZXQsIChsb25nIGxvbmcpZHNkLT5tRkRMZW5ndGgsCisgICAgICAgICAgICAgICAgICBnZW5lcmljU291cmNlLmdldCgpKTsKKworICAgICAgICAgICAgZXJyID0gZ2VuZXJpY1NvdXJjZS0+c2V0RGF0YVNvdXJjZShkc2QtPm1GRCwgZHNkLT5tRkRPZmZzZXQsIGRzZC0+bUZETGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIE51UGxheWVyMlNvdXJjZSEiKTsKKyAgICAgICAgICAgICAgICAqc291cmNlID0gTlVMTDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKnNvdXJjZSA9IGdlbmVyaWNTb3VyY2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICpkYXRhU291cmNlVHlwZSA9IERBVEFfU09VUkNFX1RZUEVfR0VORVJJQ19GRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBEYXRhU291cmNlRGVzYzo6VFlQRV9DQUxMQkFDSzoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8R2VuZXJpY1NvdXJjZTI+IGdlbmVyaWNTb3VyY2UgPQorICAgICAgICAgICAgICAgICAgICBuZXcgR2VuZXJpY1NvdXJjZTIobm90aWZ5LCBtVUlELCBtTWVkaWFDbG9jayk7CisgICAgICAgICAgICBlcnIgPSBnZW5lcmljU291cmNlLT5zZXREYXRhU291cmNlKGRzZC0+bUNhbGxiYWNrU291cmNlKTsKKworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIE51UGxheWVyMlNvdXJjZSEiKTsKKyAgICAgICAgICAgICAgICAqc291cmNlID0gTlVMTDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKnNvdXJjZSA9IGdlbmVyaWNTb3VyY2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICpkYXRhU291cmNlVHlwZSA9IERBVEFfU09VUkNFX1RZUEVfTUVESUE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBlcnIgPSBCQURfVFlQRTsKKyAgICAgICAgICAgICpzb3VyY2UgPSBOVUxMOworICAgICAgICAgICAgKmRhdGFTb3VyY2VUeXBlID0gREFUQV9TT1VSQ0VfVFlQRV9OT05FOworICAgICAgICAgICAgQUxPR0UoImludmFsaWQgZGF0YSBzb3VyY2UgdHlwZSEiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpzZXREYXRhU291cmNlQXN5bmMoY29uc3Qgc3A8RGF0YVNvdXJjZURlc2M+ICZkc2QpIHsKKyAgICBEQVRBX1NPVVJDRV9UWVBFIGRhdGFTb3VyY2VUeXBlOworICAgIHNwPFNvdXJjZT4gc291cmNlOworICAgIGNyZWF0ZU51UGxheWVyMlNvdXJjZShkc2QsICZzb3VyY2UsICZkYXRhU291cmNlVHlwZSk7CisKKyAgICAvLyBUT0RPOiBjdXJyZW50bHkgTnVQbGF5ZXIyRHJpdmVyIG1ha2VzIGJsb2NraW5nIGNhbGwgdG8gc2V0RGF0YVNvdXJjZUFzeW5jCisgICAgLy8gYW5kIGV4cGVjdHMgbm90aWZ5U2V0RGF0YVNvdXJjZUNvbXBsZXRlZCByZWdhcmRsZXNzIG9mIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4KKyAgICAvLyBUaGlzIHdpbGwgYmUgY2hhbmdlZCBzaW5jZSBzZXREYXRhU291cmNlIHNob3VsZCBiZSBhc3luY2hyb25vdXMgYXQgSkFWQSBsZXZlbC4KKyAgICAvLyBXaGVuIGl0IHN1Y2NlZWRzLCBhcHAgd2lsbCBnZXQgb25JbmZvIG5vdGlmaWNhdGlvbi4gT3RoZXJ3aXNlLCBvbkVycm9yCisgICAgLy8gd2lsbCBiZSBjYWxsZWQuCisgICAgLyoKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIG5vdGlmeUxpc3RlbmVyKGRzZC0+bUlkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9GQUlMRURfVE9fU0VUX0RBVEFfU09VUkNFLCBlcnIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gTm93LCBzb3VyY2UgIT0gTlVMTC4KKyAgICAqLworCisgICAgbURhdGFTb3VyY2VUeXBlID0gZGF0YVNvdXJjZVR5cGU7CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0RGF0YVNvdXJjZSwgdGhpcyk7CisgICAgbXNnLT5zZXRPYmplY3QoInNvdXJjZSIsIHNvdXJjZSk7CisgICAgbXNnLT5zZXRJbnQ2NCgic3JjSWQiLCBkc2QtPm1JZCk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpwcmVwYXJlTmV4dERhdGFTb3VyY2VBc3luYyhjb25zdCBzcDxEYXRhU291cmNlRGVzYz4gJmRzZCkgeworICAgIERBVEFfU09VUkNFX1RZUEUgZGF0YVNvdXJjZVR5cGU7CisgICAgc3A8U291cmNlPiBzb3VyY2U7CisgICAgY3JlYXRlTnVQbGF5ZXIyU291cmNlKGRzZCwgJnNvdXJjZSwgJmRhdGFTb3VyY2VUeXBlKTsKKworICAgIC8qCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBub3RpZnlMaXN0ZW5lcihkc2QtPm1JZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfRkFJTEVEX1RPX1NFVF9EQVRBX1NPVVJDRSwgZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE5vdywgc291cmNlICE9IE5VTEwuCisgICAgKi8KKworICAgIG1OZXh0RGF0YVNvdXJjZVR5cGUgPSBkYXRhU291cmNlVHlwZTsKKworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQcmVwYXJlTmV4dERhdGFTb3VyY2UsIHRoaXMpOworICAgIG1zZy0+c2V0T2JqZWN0KCJzb3VyY2UiLCBzb3VyY2UpOworICAgIG1zZy0+c2V0SW50NjQoInNyY0lkIiwgZHNkLT5tSWQpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6cGxheU5leHREYXRhU291cmNlKGludDY0X3Qgc3JjSWQpIHsKKyAgICBkaXNjb25uZWN0U291cmNlKCk7CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UGxheU5leHREYXRhU291cmNlLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDY0KCJzcmNJZCIsIHNyY0lkKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpnZXRCdWZmZXJpbmdTZXR0aW5ncygKKyAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MgKmJ1ZmZlcmluZyAvKiBub25udWxsICovKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldEJ1ZmZlcmluZ1NldHRpbmdzLCB0aGlzKTsKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIHJlYWRGcm9tQU1lc3NhZ2UocmVzcG9uc2UsIGJ1ZmZlcmluZyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldEJ1ZmZlcmluZ1NldHRpbmdzLCB0aGlzKTsKKyAgICB3cml0ZVRvQU1lc3NhZ2UobXNnLCBidWZmZXJpbmcpOworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKwordm9pZCBOdVBsYXllcjI6OnByZXBhcmVBc3luYygpIHsKKyAgICBBTE9HVigicHJlcGFyZUFzeW5jIik7CisKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UHJlcGFyZSwgdGhpcykpLT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpzZXRWaWRlb1N1cmZhY2VUZXh0dXJlQXN5bmMoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZud3cpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0VmlkZW9TdXJmYWNlLCB0aGlzKTsKKworICAgIGlmIChud3cgPT0gTlVMTCB8fCBud3ctPmdldEFOYXRpdmVXaW5kb3coKSA9PSBOVUxMKSB7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KCJzdXJmYWNlIiwgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbXNnLT5zZXRPYmplY3QoInN1cmZhY2UiLCBud3cpOworICAgIH0KKworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6c2V0QXVkaW9TaW5rKGNvbnN0IHNwPE1lZGlhUGxheWVyMkludGVyZmFjZTo6QXVkaW9TaW5rPiAmc2luaykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRBdWRpb1NpbmssIHRoaXMpOworICAgIG1zZy0+c2V0T2JqZWN0KCJzaW5rIiwgc2luayk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpzdGFydCgpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIHRoaXMpKS0+cG9zdCgpOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OnNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUpIHsKKyAgICAvLyBkbyBzb21lIGN1cnNvcnkgdmFsaWRhdGlvbiBvZiB0aGUgc2V0dGluZ3MgaGVyZS4gYXVkaW8gbW9kZXMgYXJlCisgICAgLy8gb25seSB2YWxpZGF0ZWQgd2hlbiBzZXQgb24gdGhlIGF1ZGlvc2luay4KKyAgICAgaWYgKChyYXRlLm1TcGVlZCAhPSAwLmYgJiYgcmF0ZS5tU3BlZWQgPCBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NSU4pCisgICAgICAgICAgICB8fCByYXRlLm1TcGVlZCA+IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01BWAorICAgICAgICAgICAgfHwgcmF0ZS5tUGl0Y2ggPCBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NSU4KKyAgICAgICAgICAgIHx8IHJhdGUubVBpdGNoID4gQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUFYKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb25maWdQbGF5YmFjaywgdGhpcyk7CisgICAgd3JpdGVUb0FNZXNzYWdlKG1zZywgcmF0ZSk7CisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKyAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OmdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUgLyogbm9ubnVsbCAqLykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRQbGF5YmFja1NldHRpbmdzLCB0aGlzKTsKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIHJlYWRGcm9tQU1lc3NhZ2UocmVzcG9uc2UsIHJhdGUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6c2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q29uZmlnU3luYywgdGhpcyk7CisgICAgd3JpdGVUb0FNZXNzYWdlKG1zZywgc3luYywgdmlkZW9GcHNIaW50KTsKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6Z2V0U3luY1NldHRpbmdzKAorICAgICAgICBBVlN5bmNTZXR0aW5ncyAqc3luYyAvKiBub25udWxsICovLCBmbG9hdCAqdmlkZW9GcHMgLyogbm9ubnVsbCAqLykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRTeW5jU2V0dGluZ3MsIHRoaXMpOworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgcmVhZEZyb21BTWVzc2FnZShyZXNwb25zZSwgc3luYywgdmlkZW9GcHMpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpwYXVzZSgpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UGF1c2UsIHRoaXMpKS0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6cmVzZXRBc3luYygpIHsKKyAgICBkaXNjb25uZWN0U291cmNlKCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlc2V0LCB0aGlzKSktPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OmRpc2Nvbm5lY3RTb3VyY2UoKSB7CisgICAgc3A8U291cmNlPiBzb3VyY2U7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVNvdXJjZUxvY2spOworICAgICAgICBzb3VyY2UgPSBtU291cmNlOworICAgIH0KKworICAgIGlmIChzb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAvLyBEdXJpbmcgYSByZXNldCwgdGhlIGRhdGEgc291cmNlIG1pZ2h0IGJlIHVucmVzcG9uc2l2ZSBhbHJlYWR5LCB3ZSBuZWVkIHRvCisgICAgICAgIC8vIGRpc2Nvbm5lY3QgZXhwbGljaXRseSBzbyB0aGF0IHJlYWRzIGV4aXQgcHJvbXB0bHkuCisgICAgICAgIC8vIFdlIGNhbid0IHF1ZXVlIHRoZSBkaXNjb25uZWN0IHJlcXVlc3QgdG8gdGhlIGxvb3BlciwgYXMgaXQgbWlnaHQgYmUKKyAgICAgICAgLy8gcXVldWVkIGJlaGluZCBhIHN0dWNrIHJlYWQgYW5kIG5ldmVyIGdldHMgcHJvY2Vzc2VkLgorICAgICAgICAvLyBEb2luZyBhIGRpc2Nvbm5lY3Qgb3V0c2lkZSB0aGUgbG9vcGVyIHRvIGFsbG93cyB0aGUgcGVuZGluZyByZWFkcyB0byBleGl0CisgICAgICAgIC8vIChlaXRoZXIgc3VjY2Vzc2Z1bGx5IG9yIHdpdGggZXJyb3IpLgorICAgICAgICBzb3VyY2UtPmRpc2Nvbm5lY3QoKTsKKyAgICB9CisKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpub3RpZnlBdChpbnQ2NF90IG1lZGlhVGltZVVzKSB7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdE5vdGlmeVRpbWUsIHRoaXMpOworICAgIG5vdGlmeS0+c2V0SW50NjQoInRpbWVyVXMiLCBtZWRpYVRpbWVVcyk7CisgICAgbU1lZGlhQ2xvY2stPmFkZFRpbWVyKG5vdGlmeSwgbWVkaWFUaW1lVXMpOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBOdVBsYXllcjI6OnNlZWtUb0FzeW5jKGludDY0X3Qgc2Vla1RpbWVVcywgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSwgYm9vbCBuZWVkTm90aWZ5KSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlZWssIHRoaXMpOworICAgIG1zZy0+c2V0SW50NjQoInNlZWtUaW1lVXMiLCBzZWVrVGltZVVzKTsKKyAgICBtc2ctPnNldEludDMyKCJtb2RlIiwgbW9kZSk7CisgICAgbXNnLT5zZXRJbnQzMigibmVlZE5vdGlmeSIsIG5lZWROb3RpZnkpOworICAgIG1zZy0+cG9zdCgpOworfQorCisKK3ZvaWQgTnVQbGF5ZXIyOjp3cml0ZVRyYWNrSW5mbygKKyAgICAgICAgUGFyY2VsKiByZXBseSwgY29uc3Qgc3A8QU1lc3NhZ2U+JiBmb3JtYXQpIGNvbnN0IHsKKyAgICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIk5VTEwgZm9ybWF0Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50MzJfdCB0cmFja1R5cGU7CisgICAgaWYgKCFmb3JtYXQtPmZpbmRJbnQzMigidHlwZSIsICZ0cmFja1R5cGUpKSB7CisgICAgICAgIEFMT0dFKCJubyB0cmFjayB0eXBlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBU3RyaW5nIG1pbWU7CisgICAgaWYgKCFmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpIHsKKyAgICAgICAgLy8gSmF2YSBNZWRpYVBsYXllciBvbmx5IHVzZXMgbWltZXR5cGUgZm9yIHN1YnRpdGxlIGFuZCB0aW1lZHRleHQgdHJhY2tzLgorICAgICAgICAvLyBJZiB3ZSBjYW4ndCBmaW5kIHRoZSBtaW1ldHlwZSBoZXJlIGl0IG1lYW5zIHRoYXQgd2Ugd291bGRuJ3QgYmUgbmVlZGluZworICAgICAgICAvLyB0aGUgbWltZXR5cGUgb24gdGhlIEphdmEgZW5kLiBXZSBzdGlsbCB3cml0ZSBhIHBsYWNlaG9sZGVyIG1pbWUgdG8ga2VlcCB0aGUKKyAgICAgICAgLy8gKGRlKXNlcmlhbGl6YXRpb24gbG9naWMgc2ltcGxlLgorICAgICAgICBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgIG1pbWUgPSAiYXVkaW8vIjsKKyAgICAgICAgfSBlbHNlIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9WSURFTykgeworICAgICAgICAgICAgbWltZSA9ICJ2aWRlby8iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoInVua25vd24gdHJhY2sgdHlwZTogJWQiLCB0cmFja1R5cGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgQVN0cmluZyBsYW5nOworICAgIGlmICghZm9ybWF0LT5maW5kU3RyaW5nKCJsYW5ndWFnZSIsICZsYW5nKSkgeworICAgICAgICBBTE9HRSgibm8gbGFuZ3VhZ2UiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHJlcGx5LT53cml0ZUludDMyKDIpOyAvLyB3cml0ZSBzb21ldGhpbmcgbm9uLXplcm8KKyAgICByZXBseS0+d3JpdGVJbnQzMih0cmFja1R5cGUpOworICAgIHJlcGx5LT53cml0ZVN0cmluZzE2KFN0cmluZzE2KG1pbWUuY19zdHIoKSkpOworICAgIHJlcGx5LT53cml0ZVN0cmluZzE2KFN0cmluZzE2KGxhbmcuY19zdHIoKSkpOworCisgICAgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFKSB7CisgICAgICAgIGludDMyX3QgaXNBdXRvLCBpc0RlZmF1bHQsIGlzRm9yY2VkOworICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigiYXV0byIsICZpc0F1dG8pKTsKKyAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoImRlZmF1bHQiLCAmaXNEZWZhdWx0KSk7CisgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJmb3JjZWQiLCAmaXNGb3JjZWQpKTsKKworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpc0F1dG8pOworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpc0RlZmF1bHQpOworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpc0ZvcmNlZCk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRTZXREYXRhU291cmNlOgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HVigia1doYXRTZXREYXRhU291cmNlIik7CisKKyAgICAgICAgICAgIENIRUNLKG1Tb3VyY2UgPT0gTlVMTCk7CisKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJzb3VyY2UiLCAmb2JqKSk7CisgICAgICAgICAgICBpZiAob2JqICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVNvdXJjZUxvY2spOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzcmNJZCIsICZtU3JjSWQpKTsKKyAgICAgICAgICAgICAgICBtU291cmNlID0gc3RhdGljX2Nhc3Q8U291cmNlICo+KG9iai5nZXQoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVyciA9IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgQUxPR0UoImtXaGF0U2V0RGF0YVNvdXJjZSwgc291cmNlIHNob3VsZCBub3QgYmUgTlVMTCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDSyhtRHJpdmVyICE9IE5VTEwpOworICAgICAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5U2V0RGF0YVNvdXJjZUNvbXBsZXRlZChtU3JjSWQsIGVycik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRQcmVwYXJlTmV4dERhdGFTb3VyY2U6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dWKCJrV2hhdFByZXBhcmVOZXh0RGF0YVNvdXJjZSIpOworCisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgic291cmNlIiwgJm9iaikpOworICAgICAgICAgICAgaWYgKG9iaiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Tb3VyY2VMb2NrKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3JjSWQiLCAmbU5leHRTcmNJZCkpOworICAgICAgICAgICAgICAgIG1OZXh0U291cmNlID0gc3RhdGljX2Nhc3Q8U291cmNlICo+KG9iai5nZXQoKSk7CisgICAgICAgICAgICAgICAgbU5leHRTb3VyY2UtPnByZXBhcmVBc3luYygpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRQbGF5TmV4dERhdGFTb3VyY2U6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dWKCJrV2hhdFBsYXlOZXh0RGF0YVNvdXJjZSIpOworICAgICAgICAgICAgaW50NjRfdCBzcmNJZDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzcmNJZCIsICZzcmNJZCkpOworICAgICAgICAgICAgaWYgKHNyY0lkICE9IG1OZXh0U3JjSWQpIHsKKyAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihzcmNJZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtUmVzZXR0aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIHN0b3BQbGF5YmFja1RpbWVyKCJrV2hhdFBsYXlOZXh0RGF0YVNvdXJjZSIpOworICAgICAgICAgICAgc3RvcFJlYnVmZmVyaW5nVGltZXIodHJ1ZSk7CisKKyAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBuZXcgRmx1c2hEZWNvZGVyQWN0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgRkxVU0hfQ01EX1NIVVRET1dOIC8qIGF1ZGlvICovLAorICAgICAgICAgICAgICAgICAgICAgICAgRkxVU0hfQ01EX1NIVVRET1dOIC8qIHZpZGVvICovKSk7CisKKyAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBuZXcgU2ltcGxlQWN0aW9uKCZOdVBsYXllcjI6OnBlcmZvcm1QbGF5TmV4dERhdGFTb3VyY2UpKTsKKworICAgICAgICAgICAgcHJvY2Vzc0RlZmVycmVkQWN0aW9ucygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0R2V0QnVmZmVyaW5nU2V0dGluZ3M6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworCisgICAgICAgICAgICBBTE9HVigia1doYXRHZXRCdWZmZXJpbmdTZXR0aW5ncyIpOworICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MgYnVmZmVyaW5nOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZXJyID0gbVNvdXJjZS0+Z2V0QnVmZmVyaW5nU2V0dGluZ3MoJmJ1ZmZlcmluZyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVyciA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIHdyaXRlVG9BTWVzc2FnZShyZXNwb25zZSwgYnVmZmVyaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRTZXRCdWZmZXJpbmdTZXR0aW5nczoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisKKyAgICAgICAgICAgIEFMT0dWKCJrV2hhdFNldEJ1ZmZlcmluZ1NldHRpbmdzIik7CisgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyBidWZmZXJpbmc7CisgICAgICAgICAgICByZWFkRnJvbUFNZXNzYWdlKG1zZywgJmJ1ZmZlcmluZyk7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICAgICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtU291cmNlLT5zZXRCdWZmZXJpbmdTZXR0aW5ncyhidWZmZXJpbmcpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRQcmVwYXJlOgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HVigib25NZXNzYWdlUmVjZWl2ZWQga1doYXRQcmVwYXJlIik7CisKKyAgICAgICAgICAgIG1Tb3VyY2UtPnByZXBhcmVBc3luYygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0R2V0VHJhY2tJbmZvOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKworICAgICAgICAgICAgUGFyY2VsKiByZXBseTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoInJlcGx5IiwgKHZvaWQqKikmcmVwbHkpKTsKKworICAgICAgICAgICAgc2l6ZV90IGluYmFuZFRyYWNrcyA9IDA7CisgICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaXplX3QgY2NUcmFja3MgPSAwOworICAgICAgICAgICAgaWYgKG1DQ0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGNjVHJhY2tzID0gbUNDRGVjb2Rlci0+Z2V0VHJhY2tDb3VudCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB0b3RhbCB0cmFjayBjb3VudAorICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaW5iYW5kVHJhY2tzICsgY2NUcmFja3MpOworCisgICAgICAgICAgICAvLyB3cml0ZSBpbmJhbmQgdHJhY2tzCisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluYmFuZFRyYWNrczsgKytpKSB7CisgICAgICAgICAgICAgICAgd3JpdGVUcmFja0luZm8ocmVwbHksIG1Tb3VyY2UtPmdldFRyYWNrSW5mbyhpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHdyaXRlIENDIHRyYWNrCisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNjVHJhY2tzOyArK2kpIHsKKyAgICAgICAgICAgICAgICB3cml0ZVRyYWNrSW5mbyhyZXBseSwgbUNDRGVjb2Rlci0+Z2V0VHJhY2tJbmZvKGkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEdldFNlbGVjdGVkVHJhY2s6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGVyciA9IE9LOworCisgICAgICAgICAgICAgICAgaW50MzJfdCB0eXBlMzI7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInR5cGUiLCAoaW50MzJfdCopJnR5cGUzMikpOworICAgICAgICAgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSA9IChtZWRpYV90cmFja190eXBlKXR5cGUzMjsKKyAgICAgICAgICAgICAgICBzc2l6ZV90IHNlbGVjdGVkVHJhY2sgPSBtU291cmNlLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUpOworCisgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJyZXBseSIsICh2b2lkKiopJnJlcGx5KSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2VsZWN0ZWRUcmFjayk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0U2VsZWN0VHJhY2s6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworCisgICAgICAgICAgICBzaXplX3QgdHJhY2tJbmRleDsKKyAgICAgICAgICAgIGludDMyX3Qgc2VsZWN0OworICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJ0cmFja0luZGV4IiwgJnRyYWNrSW5kZXgpKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzZWxlY3QiLCAmc2VsZWN0KSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworCisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKKworICAgICAgICAgICAgc2l6ZV90IGluYmFuZFRyYWNrcyA9IDA7CisgICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2l6ZV90IGNjVHJhY2tzID0gMDsKKyAgICAgICAgICAgIGlmIChtQ0NEZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBjY1RyYWNrcyA9IG1DQ0RlY29kZXItPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRyYWNrSW5kZXggPCBpbmJhbmRUcmFja3MpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtU291cmNlLT5zZWxlY3RUcmFjayh0cmFja0luZGV4LCBzZWxlY3QsIHRpbWVVcyk7CisKKyAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdCAmJiBlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0eXBlOworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gaW5mbyA9IG1Tb3VyY2UtPmdldFRyYWNrSW5mbyh0cmFja0luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8gIT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGluZm8tPmZpbmRJbnQzMigidHlwZSIsICZ0eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHR5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrbVRpbWVkVGV4dEdlbmVyYXRpb247CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRyYWNrSW5kZXggLT0gaW5iYW5kVHJhY2tzOworCisgICAgICAgICAgICAgICAgaWYgKHRyYWNrSW5kZXggPCBjY1RyYWNrcykgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBtQ0NEZWNvZGVyLT5zZWxlY3RUcmFjayh0cmFja0luZGV4LCBzZWxlY3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOworCisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UG9sbER1cmF0aW9uOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisKKyAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IG1Qb2xsRHVyYXRpb25HZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgLy8gc3RhbGUKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgICAgICAgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCAmJiBtU291cmNlLT5nZXREdXJhdGlvbigmZHVyYXRpb25VcykgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOworICAgICAgICAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUR1cmF0aW9uKG1TcmNJZCwgZHVyYXRpb25Vcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtc2ctPnBvc3QoMTAwMDAwMGxsKTsgIC8vIHBvbGwgYWdhaW4gaW4gYSBzZWNvbmQuCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRTZXRWaWRlb1N1cmZhY2U6CisgICAgICAgIHsKKworICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJzdXJmYWNlIiwgJm9iaikpOworICAgICAgICAgICAgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+IG53dyA9IHN0YXRpY19jYXN0PEFOYXRpdmVXaW5kb3dXcmFwcGVyICo+KG9iai5nZXQoKSk7CisKKyAgICAgICAgICAgIEFMT0dEKCJvblNldFZpZGVvU3VyZmFjZSglcCwgJXMgdmlkZW8gZGVjb2RlcikiLAorICAgICAgICAgICAgICAgICAgICAobnd3ID09IE5VTEwgPyBOVUxMIDogbnd3LT5nZXRBTmF0aXZlV2luZG93KCkpLAorICAgICAgICAgICAgICAgICAgICAobVNvdXJjZSAhPSBOVUxMICYmIG1TdGFydGVkICYmIG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgIT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1WaWRlb0RlY29kZXIgIT0gTlVMTCkgPyAiaGF2ZSIgOiAibm8iKTsKKworICAgICAgICAgICAgLy8gTmVlZCB0byBjaGVjayBtU3RhcnRlZCBiZWZvcmUgY2FsbGluZyBtU291cmNlLT5nZXRGb3JtYXQgYmVjYXVzZSBOdVBsYXllcjIgbWlnaHQKKyAgICAgICAgICAgIC8vIGJlIGluIHByZXBhcmluZyBzdGF0ZSBhbmQgaXQgY291bGQgdGFrZSBsb25nIHRpbWUuCisgICAgICAgICAgICAvLyBXaGVuIG1TdGFydGVkIGlzIHRydWUsIG1Tb3VyY2UgbXVzdCBoYXZlIGJlZW4gc2V0LgorICAgICAgICAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCB8fCAhbVN0YXJ0ZWQgfHwgbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSA9PSBOVUxMCisgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IG1WaWRlb0RlY29kZXIncyBtTmF0aXZlV2luZG93IGlzIGFsd2F5cyBub24tbnVsbAorICAgICAgICAgICAgICAgICAgICB8fCAobVZpZGVvRGVjb2RlciAhPSBOVUxMICYmIG1WaWRlb0RlY29kZXItPnNldFZpZGVvU3VyZmFjZShud3cpID09IE9LKSkgeworICAgICAgICAgICAgICAgIHBlcmZvcm1TZXRTdXJmYWNlKG53dyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBuZXcgRmx1c2hEZWNvZGVyQWN0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvYmogIT0gTlVMTCA/IEZMVVNIX0NNRF9GTFVTSCA6IEZMVVNIX0NNRF9OT05FKSAvKiBhdWRpbyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTFVTSF9DTURfU0hVVERPV04gLyogdmlkZW8gKi8pKTsKKworICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2sobmV3IFNldFN1cmZhY2VBY3Rpb24obnd3KSk7CisKKyAgICAgICAgICAgIGlmIChvYmogIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBJc3N1ZSBhIHNlZWsgdG8gcmVmcmVzaCB0aGUgdmlkZW8gc2NyZWVuIG9ubHkgaWYgc3RhcnRlZCBvdGhlcndpc2UKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGV4dHJhY3RvciBtYXkgbm90IHlldCBiZSBzdGFydGVkIGFuZCB3aWxsIGFzc2VydC4KKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHZpZGVvIGRlY29kZXIgaXMgbm90IHNldCAocGVyaGFwcyBhdWRpbyBvbmx5IGluIHRoaXMgY2FzZSkKKyAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90IHBlcmZvcm0gYSBzZWVrIGFzIGl0IGlzIG5vdCBuZWVkZWQuCisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY3VycmVudFBvc2l0aW9uVXMgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0Q3VycmVudFBvc2l0aW9uKCZjdXJyZW50UG9zaXRpb25VcykgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2Vla0FjdGlvbihjdXJyZW50UG9zaXRpb25VcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DIC8qIG1vZGUgKi8pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgbmV3IHN1cmZhY2UgdGV4dHVyZSwgaW5zdGFudGlhdGUgZGVjb2RlcnMKKyAgICAgICAgICAgICAgICAvLyBhZ2FpbiBpZiBwb3NzaWJsZS4KKyAgICAgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVBY3Rpb24oJk51UGxheWVyMjo6cGVyZm9ybVNjYW5Tb3VyY2VzKSk7CisKKyAgICAgICAgICAgICAgICAvLyBBZnRlciBhIGZsdXNoIHdpdGhvdXQgc2h1dGRvd24sIGRlY29kZXIgaXMgcGF1c2VkLgorICAgICAgICAgICAgICAgIC8vIERvbid0IHJlc3VtZSBpdCB1bnRpbCBzb3VyY2Ugc2VlayBpcyBkb25lLCBvdGhlcndpc2UgaXQgY291bGQKKyAgICAgICAgICAgICAgICAvLyBzdGFydCBwdWxsaW5nIHN0YWxlIGRhdGEgdG9vIHNvb24uCisgICAgICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVzdW1lRGVjb2RlckFjdGlvbihmYWxzZSAvKiBuZWVkTm90aWZ5ICovKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFNldEF1ZGlvU2luazoKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR1YoImtXaGF0U2V0QXVkaW9TaW5rIik7CisKKyAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgic2luayIsICZvYmopKTsKKworICAgICAgICAgICAgbUF1ZGlvU2luayA9IHN0YXRpY19jYXN0PE1lZGlhUGxheWVyMkludGVyZmFjZTo6QXVkaW9TaW5rICo+KG9iai5nZXQoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRTdGFydDoKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR1YoImtXaGF0U3RhcnQiKTsKKyAgICAgICAgICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICAgICAgICAgIC8vIGRvIG5vdCByZXN1bWUgeWV0IGlmIHRoZSBzb3VyY2UgaXMgc3RpbGwgYnVmZmVyaW5nCisgICAgICAgICAgICAgICAgaWYgKCFtUGF1c2VkRm9yQnVmZmVyaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIG9uUmVzdW1lKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvblN0YXJ0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUGF1c2VkQnlDbGllbnQgPSBmYWxzZTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1NUQVJURUQsIDAsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0Q29uZmlnUGxheWJhY2s6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworICAgICAgICAgICAgQXVkaW9QbGF5YmFja1JhdGUgcmF0ZSAvKiBzYW5pdGl6ZWQgKi87CisgICAgICAgICAgICByZWFkRnJvbUFNZXNzYWdlKG1zZywgJnJhdGUpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgICAgICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvLyBBdWRpb1NpbmsgYWxsb3dzIG9ubHkgMS5mIGFuZCAwLmYgZm9yIG9mZmxvYWQgbW9kZS4KKyAgICAgICAgICAgICAgICAvLyBGb3Igb3RoZXIgc3BlZWQsIHN3aXRjaCB0byBub24tb2ZmbG9hZCBtb2RlLgorICAgICAgICAgICAgICAgIGlmIChtT2ZmbG9hZEF1ZGlvICYmICgocmF0ZS5tU3BlZWQgIT0gMC5mICYmIHJhdGUubVNwZWVkICE9IDEuZikKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHJhdGUubVBpdGNoICE9IDEuZikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjdXJyZW50UG9zaXRpb25VczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldEN1cnJlbnRQb3NpdGlvbigmY3VycmVudFBvc2l0aW9uVXMpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UG9zaXRpb25VcyA9IG1QcmV2aW91c1NlZWtUaW1lVXM7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBTZXQgbVBsYXliYWNrU2V0dGluZ3Mgc28gdGhhdCB0aGUgbmV3IGF1ZGlvIGRlY29kZXIgY2FuCisgICAgICAgICAgICAgICAgICAgIC8vIGJlIGNyZWF0ZWQgY29ycmVjdGx5LgorICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2tTZXR0aW5ncyA9IHJhdGU7CisgICAgICAgICAgICAgICAgICAgIGlmICghbVBhdXNlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVJlbmRlcmVyLT5wYXVzZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlc3RhcnRBdWRpbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UG9zaXRpb25VcywgdHJ1ZSAvKiBmb3JjZU5vbk9mZmxvYWQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBuZWVkc1RvQ3JlYXRlQXVkaW9EZWNvZGVyICovKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtUGF1c2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUmVuZGVyZXItPnJlc3VtZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZXJyID0gbVJlbmRlcmVyLT5zZXRQbGF5YmFja1NldHRpbmdzKHJhdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIGlmIChyYXRlLm1TcGVlZCA9PSAwLmYpIHsKKyAgICAgICAgICAgICAgICAgICAgb25QYXVzZSgpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9QQVVTRUQsIDAsIDApOworICAgICAgICAgICAgICAgICAgICBtUGF1c2VkQnlDbGllbnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIGFsbCBvdGhlciBzZXR0aW5ncyAodXNpbmcgbm9uLXBhdXNlZCBzcGVlZCkKKyAgICAgICAgICAgICAgICAgICAgLy8gc28gd2UgY2FuIHJlc3RvcmUgdGhlbSBvbiBzdGFydAorICAgICAgICAgICAgICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSBuZXdSYXRlID0gcmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgbmV3UmF0ZS5tU3BlZWQgPSBtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQ7CisgICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja1NldHRpbmdzID0gbmV3UmF0ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvKiByYXRlLm1TcGVlZCAhPSAwLmYgKi8KKyAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSByYXRlOworICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCByZXN1bWUgeWV0IGlmIHRoZSBzb3VyY2UgaXMgc3RpbGwgYnVmZmVyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1QYXVzZWRGb3JCdWZmZXJpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblJlc3VtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1QcmVwYXJlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb25TdGFydCgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbVBhdXNlZEJ5Q2xpZW50ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobVZpZGVvRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHBhcmFtcyA9IG5ldyBBTWVzc2FnZSgpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInBsYXliYWNrLXNwZWVkIiwgbVBsYXliYWNrU2V0dGluZ3MubVNwZWVkKTsKKyAgICAgICAgICAgICAgICBtVmlkZW9EZWNvZGVyLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRHZXRQbGF5YmFja1NldHRpbmdzOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKyAgICAgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlIHJhdGUgPSBtUGxheWJhY2tTZXR0aW5nczsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworICAgICAgICAgICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZXJyID0gbVJlbmRlcmVyLT5nZXRQbGF5YmFja1NldHRpbmdzKCZyYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAvLyBnZXQgcGxheWJhY2sgc2V0dGluZ3MgdXNlZCBieSByZW5kZXJlciwgYXMgaXQgbWF5IGJlCisgICAgICAgICAgICAgICAgLy8gc2xpZ2h0bHkgb2ZmIGR1ZSB0byBhdWRpb3Npbmsgbm90IHRha2luZyBzbWFsbCBjaGFuZ2VzLgorICAgICAgICAgICAgICAgIG1QbGF5YmFja1NldHRpbmdzID0gcmF0ZTsKKyAgICAgICAgICAgICAgICBpZiAobVBhdXNlZCkgeworICAgICAgICAgICAgICAgICAgICByYXRlLm1TcGVlZCA9IDAuZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgd3JpdGVUb0FNZXNzYWdlKHJlc3BvbnNlLCByYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRDb25maWdTeW5jOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKworICAgICAgICAgICAgQUxPR1YoImtXaGF0Q29uZmlnU3luYyIpOworICAgICAgICAgICAgQVZTeW5jU2V0dGluZ3Mgc3luYzsKKyAgICAgICAgICAgIGZsb2F0IHZpZGVvRnBzSGludDsKKyAgICAgICAgICAgIHJlYWRGcm9tQU1lc3NhZ2UobXNnLCAmc3luYywgJnZpZGVvRnBzSGludCk7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICAgICAgICAgIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGVyciA9IG1SZW5kZXJlci0+c2V0U3luY1NldHRpbmdzKHN5bmMsIHZpZGVvRnBzSGludCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgbVN5bmNTZXR0aW5ncyA9IHN5bmM7CisgICAgICAgICAgICAgICAgbVZpZGVvRnBzSGludCA9IHZpZGVvRnBzSGludDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRHZXRTeW5jU2V0dGluZ3M6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworICAgICAgICAgICAgQVZTeW5jU2V0dGluZ3Mgc3luYyA9IG1TeW5jU2V0dGluZ3M7CisgICAgICAgICAgICBmbG9hdCB2aWRlb0ZwcyA9IG1WaWRlb0Zwc0hpbnQ7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICAgICAgICAgIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGVyciA9IG1SZW5kZXJlci0+Z2V0U3luY1NldHRpbmdzKCZzeW5jLCAmdmlkZW9GcHMpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgbVN5bmNTZXR0aW5ncyA9IHN5bmM7CisgICAgICAgICAgICAgICAgICAgIG1WaWRlb0Zwc0hpbnQgPSB2aWRlb0ZwczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgd3JpdGVUb0FNZXNzYWdlKHJlc3BvbnNlLCBzeW5jLCB2aWRlb0Zwcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0U2NhblNvdXJjZXM6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IG1TY2FuU291cmNlc0dlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICAvLyBEcm9wIG9ic29sZXRlIG1zZy4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVNjYW5Tb3VyY2VzUGVuZGluZyA9IGZhbHNlOworCisgICAgICAgICAgICBBTE9HVigic2Nhbm5pbmcgc291cmNlcyBoYXZlQXVkaW89JWQsIGhhdmVWaWRlbz0lZCIsCisgICAgICAgICAgICAgICAgIG1BdWRpb0RlY29kZXIgIT0gTlVMTCwgbVZpZGVvRGVjb2RlciAhPSBOVUxMKTsKKworICAgICAgICAgICAgYm9vbCBtSGFkQW55U291cmNlc0JlZm9yZSA9CisgICAgICAgICAgICAgICAgKG1BdWRpb0RlY29kZXIgIT0gTlVMTCkgfHwgKG1WaWRlb0RlY29kZXIgIT0gTlVMTCk7CisgICAgICAgICAgICBib29sIHJlc2NhbiA9IGZhbHNlOworCisgICAgICAgICAgICAvLyBpbml0aWFsaXplIHZpZGVvIGJlZm9yZSBhdWRpbyBiZWNhdXNlIHN1Y2Nlc3NmdWwgaW5pdGlhbGl6YXRpb24gb2YKKyAgICAgICAgICAgIC8vIHZpZGVvIG1heSBjaGFuZ2UgZGVlcCBidWZmZXIgbW9kZSBvZiBhdWRpby4KKyAgICAgICAgICAgIGlmIChtTmF0aXZlV2luZG93ICE9IE5VTEwgJiYgbU5hdGl2ZVdpbmRvdy0+Z2V0QU5hdGl2ZVdpbmRvdygpICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5zdGFudGlhdGVEZWNvZGVyKGZhbHNlLCAmbVZpZGVvRGVjb2RlcikgPT0gLUVXT1VMREJMT0NLKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc2NhbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBEb24ndCB0cnkgdG8gcmUtb3BlbiBhdWRpbyBzaW5rIGlmIHRoZXJlJ3MgYW4gZXhpc3RpbmcgZGVjb2Rlci4KKyAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwgJiYgbUF1ZGlvRGVjb2RlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKGluc3RhbnRpYXRlRGVjb2Rlcih0cnVlLCAmbUF1ZGlvRGVjb2RlcikgPT0gLUVXT1VMREJMT0NLKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc2NhbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIW1IYWRBbnlTb3VyY2VzQmVmb3JlCisgICAgICAgICAgICAgICAgICAgICYmIChtQXVkaW9EZWNvZGVyICE9IE5VTEwgfHwgbVZpZGVvRGVjb2RlciAhPSBOVUxMKSkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UndmUgZm91bmQgYW55dGhpbmcgcGxheWFibGUuCisKKyAgICAgICAgICAgICAgICBpZiAobVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX0RZTkFNSUNfRFVSQVRJT04pIHsKKyAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVQb2xsRHVyYXRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgICAgIGlmICgoZXJyID0gbVNvdXJjZS0+ZmVlZE1vcmVUU0RhdGEoKSkgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBpZiAobUF1ZGlvRGVjb2RlciA9PSBOVUxMICYmIG1WaWRlb0RlY29kZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgY3VycmVudGx5IGRlY29kaW5nIGFueXRoaW5nIChubyBhdWRpbyBvcgorICAgICAgICAgICAgICAgICAgICAvLyB2aWRlbyB0cmFja3MgZm91bmQpIGFuZCB3ZSBqdXN0IHJhbiBvdXQgb2YgaW5wdXQgZGF0YS4KKworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1BMQVlCQUNLX0NPTVBMRVRFLCAwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHJlc2NhbikgeworICAgICAgICAgICAgICAgIG1zZy0+cG9zdCgxMDAwMDBsbCk7CisgICAgICAgICAgICAgICAgbVNjYW5Tb3VyY2VzUGVuZGluZyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRWaWRlb05vdGlmeToKKyAgICAgICAgY2FzZSBrV2hhdEF1ZGlvTm90aWZ5OgorICAgICAgICB7CisgICAgICAgICAgICBib29sIGF1ZGlvID0gbXNnLT53aGF0KCkgPT0ga1doYXRBdWRpb05vdGlmeTsKKworICAgICAgICAgICAgaW50MzJfdCBjdXJyZW50RGVjb2RlckdlbmVyYXRpb24gPQorICAgICAgICAgICAgICAgIChhdWRpbz8gbUF1ZGlvRGVjb2RlckdlbmVyYXRpb24gOiBtVmlkZW9EZWNvZGVyR2VuZXJhdGlvbik7CisgICAgICAgICAgICBpbnQzMl90IHJlcXVlc3RlckdlbmVyYXRpb24gPSBjdXJyZW50RGVjb2RlckdlbmVyYXRpb24gLSAxOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmcmVxdWVzdGVyR2VuZXJhdGlvbikpOworCisgICAgICAgICAgICBpZiAocmVxdWVzdGVyR2VuZXJhdGlvbiAhPSBjdXJyZW50RGVjb2RlckdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiZ290IG1lc3NhZ2UgZnJvbSBvbGQgJXMgZGVjb2RlciwgZ2VuZXJhdGlvbiglZDolZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIiwgcmVxdWVzdGVyR2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnREZWNvZGVyR2VuZXJhdGlvbik7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5OworICAgICAgICAgICAgICAgIGlmICghKG1zZy0+ZmluZE1lc3NhZ2UoInJlcGx5IiwgJnJlcGx5KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigiZXJyIiwgSU5GT19ESVNDT05USU5VSVRZKTsKKyAgICAgICAgICAgICAgICByZXBseS0+cG9zdCgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50MzJfdCB3aGF0OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIndoYXQiLCAmd2hhdCkpOworCisgICAgICAgICAgICBpZiAod2hhdCA9PSBEZWNvZGVyQmFzZTo6a1doYXRJbnB1dERpc2NvbnRpbnVpdHkpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGZvcm1hdENoYW5nZTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZm9ybWF0Q2hhbmdlIiwgJmZvcm1hdENoYW5nZSkpOworCisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIGRpc2NvbnRpbnVpdHk6IGZvcm1hdENoYW5nZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iLCBmb3JtYXRDaGFuZ2UpOworCisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdENoYW5nZSkgeworICAgICAgICAgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmx1c2hEZWNvZGVyQWN0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyA/IEZMVVNIX0NNRF9TSFVURE9XTiA6IEZMVVNIX0NNRF9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyA/IEZMVVNIX0NNRF9OT05FIDogRkxVU0hfQ01EX1NIVVRET1dOKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2ltcGxlQWN0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTnVQbGF5ZXIyOjpwZXJmb3JtU2NhblNvdXJjZXMpKTsKKworICAgICAgICAgICAgICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBEZWNvZGVyQmFzZTo6a1doYXRFT1MpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGVycjsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworCisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJnb3QgJXMgZGVjb2RlciBFT1MiLCBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiZ290ICVzIGRlY29kZXIgRU9TIHcvIGVycm9yICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbVJlbmRlcmVyLT5xdWV1ZUVPUyhhdWRpbywgZXJyKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBEZWNvZGVyQmFzZTo6a1doYXRGbHVzaENvbXBsZXRlZCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJkZWNvZGVyICVzIGZsdXNoIGNvbXBsZXRlZCIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworCisgICAgICAgICAgICAgICAgaGFuZGxlRmx1c2hDb21wbGV0ZShhdWRpbywgdHJ1ZSAvKiBpc0RlY29kZXIgKi8pOworICAgICAgICAgICAgICAgIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IERlY29kZXJCYXNlOjprV2hhdFZpZGVvU2l6ZUNoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKTsKKworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBpbnB1dEZvcm1hdCA9CisgICAgICAgICAgICAgICAgICAgICAgICBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pOworCisgICAgICAgICAgICAgICAgc2V0VmlkZW9TY2FsaW5nTW9kZShtVmlkZW9TY2FsaW5nTW9kZSk7CisgICAgICAgICAgICAgICAgdXBkYXRlVmlkZW9TaXplKG1TcmNJZCwgaW5wdXRGb3JtYXQsIGZvcm1hdCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gRGVjb2RlckJhc2U6OmtXaGF0U2h1dGRvd25Db21wbGV0ZWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgc2h1dGRvd24gY29tcGxldGVkIiwgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CisgICAgICAgICAgICAgICAgaWYgKGF1ZGlvKSB7CisgICAgICAgICAgICAgICAgICAgIG1BdWRpb0RlY29kZXIuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRGVjb2RlckVycm9yID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICsrbUF1ZGlvRGVjb2RlckdlbmVyYXRpb247CisKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKGludCltRmx1c2hpbmdBdWRpbywgKGludClTSFVUVElOR19ET1dOX0RFQ09ERVIpOworICAgICAgICAgICAgICAgICAgICBtRmx1c2hpbmdBdWRpbyA9IFNIVVRfRE9XTjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtVmlkZW9EZWNvZGVyLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIG1WaWRlb0RlY29kZXJFcnJvciA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICArK21WaWRlb0RlY29kZXJHZW5lcmF0aW9uOworCisgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKChpbnQpbUZsdXNoaW5nVmlkZW8sIChpbnQpU0hVVFRJTkdfRE9XTl9ERUNPREVSKTsKKyAgICAgICAgICAgICAgICAgICAgbUZsdXNoaW5nVmlkZW8gPSBTSFVUX0RPV047CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZmluaXNoRmx1c2hJZlBvc3NpYmxlKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gRGVjb2RlckJhc2U6OmtXaGF0UmVzdW1lQ29tcGxldGVkKSB7CisgICAgICAgICAgICAgICAgZmluaXNoUmVzdW1lKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gRGVjb2RlckJhc2U6OmtXaGF0RXJyb3IpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikgfHwgZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gRGVjb2RlciBlcnJvcnMgY2FuIGJlIGR1ZSB0byBTb3VyY2UgKGUuZy4gZnJvbSBzdHJlYW1pbmcpLAorICAgICAgICAgICAgICAgIC8vIG9yIGZyb20gZGVjb2RpbmcgY29ycnVwdGVkIGJpdHN0cmVhbXMsIG9yIGZyb20gb3RoZXIgZGVjb2RlcgorICAgICAgICAgICAgICAgIC8vIE1lZGlhQ29kZWMgb3BlcmF0aW9ucyAoZS5nLiBmcm9tIGFuIG9uZ29pbmcgcmVzZXQgb3Igc2VlaykuCisgICAgICAgICAgICAgICAgLy8gVGhleSBtYXkgYWxzbyBiZSBkdWUgdG8gb3BlbkF1ZGlvU2luayBmYWlsdXJlIGF0CisgICAgICAgICAgICAgICAgLy8gZGVjb2RlciBzdGFydCBvciBhZnRlciBhIGZvcm1hdCBjaGFuZ2UuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBXZSB0cnkgdG8gZ3JhY2VmdWxseSBzaHV0IGRvd24gdGhlIGFmZmVjdGVkIGRlY29kZXIgaWYgcG9zc2libGUsCisgICAgICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4gdHJ5aW5nIHRvIGZvcmNlIHRoZSBzaHV0ZG93biB3aXRoIHNvbWV0aGluZworICAgICAgICAgICAgICAgIC8vIHNpbWlsYXIgdG8gcGVyZm9ybVJlc2V0KCkuIFRoaXMgbWV0aG9kIGNhbiBsZWFkIHRvIGEgaGFuZworICAgICAgICAgICAgICAgIC8vIGlmIE1lZGlhQ29kZWMgZnVuY3Rpb25zIGJsb2NrIGFmdGVyIGFuIGVycm9yLCBidXQgdGhleSBzaG91bGQKKyAgICAgICAgICAgICAgICAvLyB0eXBpY2FsbHkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OIGluc3RlYWQgb2YgYmxvY2tpbmcuCisKKyAgICAgICAgICAgICAgICBGbHVzaFN0YXR1cyAqZmx1c2hpbmcgPSBhdWRpbyA/ICZtRmx1c2hpbmdBdWRpbyA6ICZtRmx1c2hpbmdWaWRlbzsKKyAgICAgICAgICAgICAgICBBTE9HRSgicmVjZWl2ZWQgZXJyb3IoJSN4KSBmcm9tICVzIGRlY29kZXIsIGZsdXNoaW5nKCVkKSwgbm93IHNodXR0aW5nIGRvd24iLAorICAgICAgICAgICAgICAgICAgICAgICAgZXJyLCBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iLCAqZmx1c2hpbmcpOworCisgICAgICAgICAgICAgICAgc3dpdGNoICgqZmx1c2hpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBOT05FOgorICAgICAgICAgICAgICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGbHVzaERlY29kZXJBY3Rpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyA/IEZMVVNIX0NNRF9TSFVURE9XTiA6IEZMVVNIX0NNRF9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gPyBGTFVTSF9DTURfTk9ORSA6IEZMVVNIX0NNRF9TSFVURE9XTikpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0RlZmVycmVkQWN0aW9ucygpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRkxVU0hJTkdfREVDT0RFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICpmbHVzaGluZyA9IEZMVVNISU5HX0RFQ09ERVJfU0hVVERPV047IC8vIGluaXRpYXRlIHNodXRkb3duIGFmdGVyIGZsdXNoLgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIFdhaXQgZm9yIGZsdXNoIHRvIGNvbXBsZXRlLgorICAgICAgICAgICAgICAgICAgICBjYXNlIEZMVVNISU5HX0RFQ09ERVJfU0hVVERPV046CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gV2FpdCBmb3IgZmx1c2ggdG8gY29tcGxldGUuCisgICAgICAgICAgICAgICAgICAgIGNhc2UgU0hVVFRJTkdfRE9XTl9ERUNPREVSOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIFdhaXQgZm9yIHNodXRkb3duIHRvIGNvbXBsZXRlLgorICAgICAgICAgICAgICAgICAgICBjYXNlIEZMVVNIRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBnZXREZWNvZGVyKGF1ZGlvKS0+aW5pdGlhdGVTaHV0ZG93bigpOyAvLyBJbiB0aGUgbWlkZGxlIG9mIGEgc2Vlay4KKyAgICAgICAgICAgICAgICAgICAgICAgICpmbHVzaGluZyA9IFNIVVRUSU5HX0RPV05fREVDT0RFUjsgICAgIC8vIFNodXQgZG93bi4KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNIVVRfRE9XTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOyAgLy8gU2hvdWxkIG5vdCBvY2N1ci4KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgLy8gRmluaXNoIGFueXdheXMuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtU291cmNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVZpZGVvRGVjb2RlckVycm9yIHx8IG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgPT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtTmF0aXZlV2luZG93ID09IE5VTEwgfHwgbU5hdGl2ZVdpbmRvdy0+Z2V0QU5hdGl2ZVdpbmRvdygpID09IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbVZpZGVvRGVjb2RlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBib3RoIGF1ZGlvIGFuZCB2aWRlbyBoYXZlIGVycm9yLCBvciB0aGlzIHN0cmVhbSBoYXMgb25seSBhdWRpbworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGhhcyBlcnJvciwgbm90aWZ5IGNsaWVudCBvZiBlcnJvci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgYXVkaW8gdHJhY2sgaGFzIGVycm9yLiBWaWRlbyB0cmFjayBjb3VsZCBiZSBzdGlsbCBnb29kIHRvIHBsYXkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fUExBWV9BVURJT19FUlJPUiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0RlY29kZXJFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvRGVjb2RlckVycm9yIHx8IG1Tb3VyY2UtPmdldEZvcm1hdCh0cnVlIC8qIGF1ZGlvICovKSA9PSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1BdWRpb1NpbmsgPT0gTlVMTCB8fCBtQXVkaW9EZWNvZGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIGJvdGggYXVkaW8gYW5kIHZpZGVvIGhhdmUgZXJyb3IsIG9yIHRoaXMgc3RyZWFtIGhhcyBvbmx5IHZpZGVvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggaGFzIGVycm9yLCBub3RpZnkgY2xpZW50IG9mIGVycm9yLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSB2aWRlbyB0cmFjayBoYXMgZXJyb3IuIEF1ZGlvIHRyYWNrIGNvdWxkIGJlIHN0aWxsIGdvb2QgdG8gcGxheS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19QTEFZX1ZJREVPX0VSUk9SLCBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvRGVjb2RlckVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlVuaGFuZGxlZCBkZWNvZGVyIG5vdGlmaWNhdGlvbiAlZCAnJWMlYyVjJWMnLiIsCisgICAgICAgICAgICAgICAgICAgICAgd2hhdCwKKyAgICAgICAgICAgICAgICAgICAgICB3aGF0ID4+IDI0LAorICAgICAgICAgICAgICAgICAgICAgICh3aGF0ID4+IDE2KSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgICAgKHdoYXQgPj4gOCkgJiAweGZmLAorICAgICAgICAgICAgICAgICAgICAgIHdoYXQgJiAweGZmKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UmVuZGVyZXJOb3RpZnk6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgcmVxdWVzdGVyR2VuZXJhdGlvbiA9IG1SZW5kZXJlckdlbmVyYXRpb24gLSAxOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmcmVxdWVzdGVyR2VuZXJhdGlvbikpOworICAgICAgICAgICAgaWYgKHJlcXVlc3RlckdlbmVyYXRpb24gIT0gbVJlbmRlcmVyR2VuZXJhdGlvbikgeworICAgICAgICAgICAgICAgIEFMT0dWKCJnb3QgbWVzc2FnZSBmcm9tIG9sZCByZW5kZXJlciwgZ2VuZXJhdGlvbiglZDolZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVyR2VuZXJhdGlvbiwgbVJlbmRlcmVyR2VuZXJhdGlvbik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQzMl90IHdoYXQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigid2hhdCIsICZ3aGF0KSk7CisKKyAgICAgICAgICAgIGlmICh3aGF0ID09IFJlbmRlcmVyOjprV2hhdEVPUykgeworICAgICAgICAgICAgICAgIGludDMyX3QgYXVkaW87CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImF1ZGlvIiwgJmF1ZGlvKSk7CisKKyAgICAgICAgICAgICAgICBpbnQzMl90IGZpbmFsUmVzdWx0OworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJmaW5hbFJlc3VsdCIsICZmaW5hbFJlc3VsdCkpOworCisgICAgICAgICAgICAgICAgaWYgKGF1ZGlvKSB7CisgICAgICAgICAgICAgICAgICAgIG1BdWRpb0VPUyA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbVZpZGVvRU9TID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZmluYWxSZXN1bHQgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigicmVhY2hlZCAlcyBFT1MiLCBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXMgdHJhY2sgZW5jb3VudGVyZWQgYW4gZXJyb3IgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIiwgZmluYWxSZXN1bHQpOworCisgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TcmNJZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgZmluYWxSZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgobUF1ZGlvRU9TIHx8IG1BdWRpb0RlY29kZXIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChtVmlkZW9FT1MgfHwgbVZpZGVvRGVjb2RlciA9PSBOVUxMKSkgeworICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9QTEFZQkFDS19DT01QTEVURSwgMCwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IFJlbmRlcmVyOjprV2hhdEZsdXNoQ29tcGxldGUpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGF1ZGlvOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhdWRpbyIsICZhdWRpbykpOworCisgICAgICAgICAgICAgICAgaWYgKGF1ZGlvKSB7CisgICAgICAgICAgICAgICAgICAgIG1BdWRpb0VPUyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1WaWRlb0VPUyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEFMT0dWKCJyZW5kZXJlciAlcyBmbHVzaCBjb21wbGV0ZWQuIiwgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CisgICAgICAgICAgICAgICAgaWYgKGF1ZGlvICYmIChtRmx1c2hpbmdBdWRpbyA9PSBOT05FIHx8IG1GbHVzaGluZ0F1ZGlvID09IEZMVVNIRUQKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1GbHVzaGluZ0F1ZGlvID09IFNIVVRfRE9XTikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRmx1c2ggaGFzIGJlZW4gaGFuZGxlZCBieSB0ZWFyIGRvd24uCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBoYW5kbGVGbHVzaENvbXBsZXRlKGF1ZGlvLCBmYWxzZSAvKiBpc0RlY29kZXIgKi8pOworICAgICAgICAgICAgICAgIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IFJlbmRlcmVyOjprV2hhdFZpZGVvUmVuZGVyaW5nU3RhcnQpIHsKKyAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19WSURFT19SRU5ERVJJTkdfU1RBUlQsIDApOworICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IFJlbmRlcmVyOjprV2hhdE1lZGlhUmVuZGVyaW5nU3RhcnQpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigibWVkaWEgcmVuZGVyaW5nIHN0YXJ0ZWQiKTsKKyAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9TVEFSVEVELCAwLCAwKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRBdWRpb1RlYXJEb3duKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCByZWFzb247CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlYXNvbiIsICZyZWFzb24pKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiVGVhciBkb3duIGF1ZGlvIHdpdGggcmVhc29uICVkLiIsIHJlYXNvbik7CisgICAgICAgICAgICAgICAgaWYgKHJlYXNvbiA9PSBSZW5kZXJlcjo6a0R1ZVRvVGltZW91dCAmJiAhKG1QYXVzZWQgJiYgbU9mZmxvYWRBdWRpbykpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGltZW91dFdoZW5QYXVzZWQgaXMgb25seSBmb3Igb2ZmbG9hZCBtb2RlLgorICAgICAgICAgICAgICAgICAgICBBTE9HVygiUmVjZWl2ZSBhIHN0YWxlIG1lc3NhZ2UgZm9yIHRlYXJkb3duLiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50NjRfdCBwb3NpdGlvblVzOworICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50NjQoInBvc2l0aW9uVXMiLCAmcG9zaXRpb25VcykpIHsKKyAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25VcyA9IG1QcmV2aW91c1NlZWtUaW1lVXM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmVzdGFydEF1ZGlvKAorICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25VcywgcmVhc29uID09IFJlbmRlcmVyOjprRm9yY2VOb25PZmZsb2FkIC8qIGZvcmNlTm9uT2ZmbG9hZCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbiAhPSBSZW5kZXJlcjo6a0R1ZVRvVGltZW91dCAvKiBuZWVkc1RvQ3JlYXRlQXVkaW9EZWNvZGVyICovKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdE1vcmVEYXRhUXVldWVkOgorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRSZXNldDoKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR1YoImtXaGF0UmVzZXQiKTsKKworICAgICAgICAgICAgbVJlc2V0dGluZyA9IHRydWU7CisgICAgICAgICAgICBzdG9wUGxheWJhY2tUaW1lcigia1doYXRSZXNldCIpOworICAgICAgICAgICAgc3RvcFJlYnVmZmVyaW5nVGltZXIodHJ1ZSk7CisKKyAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBuZXcgRmx1c2hEZWNvZGVyQWN0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgRkxVU0hfQ01EX1NIVVRET1dOIC8qIGF1ZGlvICovLAorICAgICAgICAgICAgICAgICAgICAgICAgRkxVU0hfQ01EX1NIVVRET1dOIC8qIHZpZGVvICovKSk7CisKKyAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBuZXcgU2ltcGxlQWN0aW9uKCZOdVBsYXllcjI6OnBlcmZvcm1SZXNldCkpOworCisgICAgICAgICAgICBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXROb3RpZnlUaW1lOgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HVigia1doYXROb3RpZnlUaW1lIik7CisgICAgICAgICAgICBpbnQ2NF90IHRpbWVyVXM7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZXJVcyIsICZ0aW1lclVzKSk7CisKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX05PVElGWV9USU1FLCB0aW1lclVzLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFNlZWs6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVczsKKyAgICAgICAgICAgIGludDMyX3QgbW9kZTsKKyAgICAgICAgICAgIGludDMyX3QgbmVlZE5vdGlmeTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzZWVrVGltZVVzIiwgJnNlZWtUaW1lVXMpKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJtb2RlIiwgJm1vZGUpKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJuZWVkTm90aWZ5IiwgJm5lZWROb3RpZnkpKTsKKworICAgICAgICAgICAgQUxPR1YoImtXaGF0U2VlayBzZWVrVGltZVVzPSVsbGQgdXMsIG1vZGU9JWQsIG5lZWROb3RpZnk9JWQiLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXNlZWtUaW1lVXMsIG1vZGUsIG5lZWROb3RpZnkpOworCisgICAgICAgICAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtU291cmNlU3RhcnRlZCkgeworICAgICAgICAgICAgICAgICAgICBtU291cmNlU3RhcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzZWVrVGltZVVzID4gMCkgeworICAgICAgICAgICAgICAgICAgICBwZXJmb3JtU2VlayhzZWVrVGltZVVzLCAoTWVkaWFQbGF5ZXIyU2Vla01vZGUpbW9kZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG5lZWROb3RpZnkpIHsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5RHJpdmVyU2Vla0NvbXBsZXRlKG1TcmNJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzZWVrcyBjYW4gdGFrZSBhIHdoaWxlLCBzbyB3ZSBlc3NlbnRpYWxseSBwYXVzZWQKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1BBVVNFRCwgMCwgMCk7CisKKyAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBuZXcgRmx1c2hEZWNvZGVyQWN0aW9uKEZMVVNIX0NNRF9GTFVTSCAvKiBhdWRpbyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTFVTSF9DTURfRkxVU0ggLyogdmlkZW8gKi8pKTsKKworICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgIG5ldyBTZWVrQWN0aW9uKHNlZWtUaW1lVXMsIChNZWRpYVBsYXllcjJTZWVrTW9kZSltb2RlKSk7CisKKyAgICAgICAgICAgIC8vIEFmdGVyIGEgZmx1c2ggd2l0aG91dCBzaHV0ZG93biwgZGVjb2RlciBpcyBwYXVzZWQuCisgICAgICAgICAgICAvLyBEb24ndCByZXN1bWUgaXQgdW50aWwgc291cmNlIHNlZWsgaXMgZG9uZSwgb3RoZXJ3aXNlIGl0IGNvdWxkCisgICAgICAgICAgICAvLyBzdGFydCBwdWxsaW5nIHN0YWxlIGRhdGEgdG9vIHNvb24uCisgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgbmV3IFJlc3VtZURlY29kZXJBY3Rpb24obmVlZE5vdGlmeSkpOworCisgICAgICAgICAgICBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRQYXVzZToKKyAgICAgICAgeworICAgICAgICAgICAgb25QYXVzZSgpOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfUEFVU0VELCAwLCAwKTsKKyAgICAgICAgICAgIG1QYXVzZWRCeUNsaWVudCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRTb3VyY2VOb3RpZnk6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uU291cmNlTm90aWZ5KG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRDbG9zZWRDYXB0aW9uTm90aWZ5OgorICAgICAgICB7CisgICAgICAgICAgICBvbkNsb3NlZENhcHRpb25Ob3RpZnkobXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFByZXBhcmVEcm06CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG9uUHJlcGFyZURybShtc2cpOworCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoInN0YXR1cyIsIHN0YXR1cyk7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRSZWxlYXNlRHJtOgorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvblJlbGVhc2VEcm0oKTsKKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJzdGF0dXMiLCBzdGF0dXMpOworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6Om9uUmVzdW1lKCkgeworICAgIGlmICghbVBhdXNlZCB8fCBtUmVzZXR0aW5nKSB7CisgICAgICAgIEFMT0dEX0lGKG1SZXNldHRpbmcsICJyZXNldHRpbmcsIG9uUmVzdW1lIGRpc2NhcmRlZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1QYXVzZWQgPSBmYWxzZTsKKyAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIG1Tb3VyY2UtPnJlc3VtZSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCJyZXN1bWUgY2FsbGVkIHdoZW4gc291cmNlIGlzIGdvbmUgb3Igbm90IHNldCIpOworICAgIH0KKyAgICAvLyB8bUF1ZGlvRGVjb2RlcnwgbWF5IGhhdmUgYmVlbiByZWxlYXNlZCBkdWUgdG8gdGhlIHBhdXNlIHRpbWVvdXQsIHNvIHJlLWNyZWF0ZSBpdCBpZgorICAgIC8vIG5lZWRlZC4KKyAgICBpZiAoYXVkaW9EZWNvZGVyU3RpbGxOZWVkZWQoKSAmJiBtQXVkaW9EZWNvZGVyID09IE5VTEwpIHsKKyAgICAgICAgaW5zdGFudGlhdGVEZWNvZGVyKHRydWUgLyogYXVkaW8gKi8sICZtQXVkaW9EZWNvZGVyKTsKKyAgICB9CisgICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7CisgICAgICAgIG1SZW5kZXJlci0+cmVzdW1lKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coInJlc3VtZSBjYWxsZWQgd2hlbiByZW5kZXJlciBpcyBnb25lIG9yIG5vdCBzZXQiKTsKKyAgICB9CisKKyAgICBzdGFydFBsYXliYWNrVGltZXIoIm9ucmVzdW1lIik7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpvblN0YXJ0KCkgeworICAgIEFMT0dWKCJvblN0YXJ0OiBtQ3J5cHRvOiAlcCIsIG1DcnlwdG8uZ2V0KCkpOworCisgICAgaWYgKCFtU291cmNlU3RhcnRlZCkgeworICAgICAgICBtU291cmNlU3RhcnRlZCA9IHRydWU7CisgICAgICAgIG1Tb3VyY2UtPnN0YXJ0KCk7CisgICAgfQorCisgICAgbU9mZmxvYWRBdWRpbyA9IGZhbHNlOworICAgIG1BdWRpb0VPUyA9IGZhbHNlOworICAgIG1WaWRlb0VPUyA9IGZhbHNlOworICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICBtUGF1c2VkID0gZmFsc2U7CisKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisKKyAgICBpZiAobVNvdXJjZS0+aXNSZWFsVGltZSgpKSB7CisgICAgICAgIGZsYWdzIHw9IFJlbmRlcmVyOjpGTEFHX1JFQUxfVElNRTsKKyAgICB9CisKKyAgICBib29sIGhhc0F1ZGlvID0gKG1Tb3VyY2UtPmdldEZvcm1hdCh0cnVlIC8qIGF1ZGlvICovKSAhPSBOVUxMKTsKKyAgICBib29sIGhhc1ZpZGVvID0gKG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgIT0gTlVMTCk7CisgICAgaWYgKCFoYXNBdWRpbyAmJiAhaGFzVmlkZW8pIHsKKyAgICAgICAgQUxPR0UoIm5vIG1ldGFkYXRhIGZvciBlaXRoZXIgYXVkaW8gb3IgdmlkZW8gc291cmNlIik7CisgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgbVNvdXJjZVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBFUlJPUl9NQUxGT1JNRUQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWX0lGKCFoYXNBdWRpbywgIm5vIG1ldGFkYXRhIGZvciBhdWRpbyBzb3VyY2UiKTsgIC8vIHZpZGVvIG9ubHkgc3RyZWFtCisKKyAgICBzcDxNZXRhRGF0YT4gYXVkaW9NZXRhID0gbVNvdXJjZS0+Z2V0Rm9ybWF0TWV0YSh0cnVlIC8qIGF1ZGlvICovKTsKKworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9NVVNJQzsKKyAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMKSB7CisgICAgICAgIHN0cmVhbVR5cGUgPSBtQXVkaW9TaW5rLT5nZXRBdWRpb1N0cmVhbVR5cGUoKTsKKyAgICB9CisKKyAgICBtT2ZmbG9hZEF1ZGlvID0KKyAgICAgICAgY2FuT2ZmbG9hZFN0cmVhbShhdWRpb01ldGEsIGhhc1ZpZGVvLCBtU291cmNlLT5pc1N0cmVhbWluZygpLCBzdHJlYW1UeXBlKQorICAgICAgICAgICAgICAgICYmIChtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQgPT0gMS5mICYmIG1QbGF5YmFja1NldHRpbmdzLm1QaXRjaCA9PSAxLmYpOworCisgICAgLy8gTW9kdWxhciBEUk06IERpc2FibGluZyBhdWRpbyBvZmZsb2FkIGlmIHRoZSBzb3VyY2UgaXMgcHJvdGVjdGVkCisgICAgaWYgKG1PZmZsb2FkQXVkaW8gJiYgbUlzRHJtUHJvdGVjdGVkKSB7CisgICAgICAgIG1PZmZsb2FkQXVkaW8gPSBmYWxzZTsKKyAgICAgICAgQUxPR1YoIm9uU3RhcnQ6IERpc2FibGluZyBtT2ZmbG9hZEF1ZGlvIG5vdyB0aGF0IHRoZSBzb3VyY2UgaXMgcHJvdGVjdGVkLiIpOworICAgIH0KKworICAgIGlmIChtT2ZmbG9hZEF1ZGlvKSB7CisgICAgICAgIGZsYWdzIHw9IFJlbmRlcmVyOjpGTEFHX09GRkxPQURfQVVESU87CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFJlbmRlcmVyTm90aWZ5LCB0aGlzKTsKKyAgICArK21SZW5kZXJlckdlbmVyYXRpb247CisgICAgbm90aWZ5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1SZW5kZXJlckdlbmVyYXRpb24pOworICAgIG1SZW5kZXJlciA9IG5ldyBSZW5kZXJlcihtQXVkaW9TaW5rLCBtTWVkaWFDbG9jaywgbm90aWZ5LCBmbGFncyk7CisgICAgbVJlbmRlcmVyTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgbVJlbmRlcmVyTG9vcGVyLT5zZXROYW1lKCJOdVBsYXllclJlbmRlcmVyIik7CisgICAgbVJlbmRlcmVyTG9vcGVyLT5zdGFydChmYWxzZSwgZmFsc2UsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOworICAgIG1SZW5kZXJlckxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1SZW5kZXJlcik7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtUmVuZGVyZXItPnNldFBsYXliYWNrU2V0dGluZ3MobVBsYXliYWNrU2V0dGluZ3MpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgbVNvdXJjZS0+c3RvcCgpOworICAgICAgICBtU291cmNlU3RhcnRlZCA9IGZhbHNlOworICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmbG9hdCByYXRlID0gZ2V0RnJhbWVSYXRlKCk7CisgICAgaWYgKHJhdGUgPiAwKSB7CisgICAgICAgIG1SZW5kZXJlci0+c2V0VmlkZW9GcmFtZVJhdGUocmF0ZSk7CisgICAgfQorCisgICAgaWYgKG1WaWRlb0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICBtVmlkZW9EZWNvZGVyLT5zZXRSZW5kZXJlcihtUmVuZGVyZXIpOworICAgIH0KKyAgICBpZiAobUF1ZGlvRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgIG1BdWRpb0RlY29kZXItPnNldFJlbmRlcmVyKG1SZW5kZXJlcik7CisgICAgfQorCisgICAgc3RhcnRQbGF5YmFja1RpbWVyKCJvbnN0YXJ0Iik7CisKKyAgICBwb3N0U2NhblNvdXJjZXMoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OnN0YXJ0UGxheWJhY2tUaW1lcihjb25zdCBjaGFyICp3aGVyZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtUGxheWluZ1RpbWVMb2NrKTsKKyAgICBpZiAobUxhc3RTdGFydGVkUGxheWluZ1RpbWVOcyA9PSAwKSB7CisgICAgICAgIG1MYXN0U3RhcnRlZFBsYXlpbmdUaW1lTnMgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIEFMT0dWKCJzdGFydFBsYXliYWNrVGltZXIoKSB0aW1lICUyMCIgUFJJZDY0ICIgKCVzKSIsICBtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zLCB3aGVyZSk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6c3RvcFBsYXliYWNrVGltZXIoY29uc3QgY2hhciAqd2hlcmUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVBsYXlpbmdUaW1lTG9jayk7CisKKyAgICBBTE9HVigic3RvcFBsYXliYWNrVGltZXIoKSAgdGltZSAlMjAiIFBSSWQ2NCAiICglcykiLCBtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zLCB3aGVyZSk7CisKKyAgICBpZiAobUxhc3RTdGFydGVkUGxheWluZ1RpbWVOcyAhPSAwKSB7CisgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CisgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgaW50NjRfdCBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICAgICBpbnQ2NF90IHBsYXllZCA9IG5vdyAtIG1MYXN0U3RhcnRlZFBsYXlpbmdUaW1lTnM7CisgICAgICAgICAgICBBTE9HVigic3RvcFBsYXliYWNrVGltZXIoKSAgbG9nICAlMjAiIFBSSWQ2NCAiIiwgcGxheWVkKTsKKworICAgICAgICAgICAgaWYgKHBsYXllZCA+IDApIHsKKyAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeU1vcmVQbGF5aW5nVGltZVVzKG1TcmNJZCwgKHBsYXllZCs1MDApLzEwMDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1MYXN0U3RhcnRlZFBsYXlpbmdUaW1lTnMgPSAwOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OnN0YXJ0UmVidWZmZXJpbmdUaW1lcigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVBsYXlpbmdUaW1lTG9jayk7CisgICAgaWYgKG1MYXN0U3RhcnRlZFJlYnVmZmVyaW5nVGltZU5zID09IDApIHsKKyAgICAgICAgbUxhc3RTdGFydGVkUmVidWZmZXJpbmdUaW1lTnMgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIEFMT0dWKCJzdGFydFJlYnVmZmVyaW5nVGltZXIoKSB0aW1lICUyMCIgUFJJZDY0ICIiLCAgbUxhc3RTdGFydGVkUmVidWZmZXJpbmdUaW1lTnMpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OnN0b3BSZWJ1ZmZlcmluZ1RpbWVyKGJvb2wgZXhpdGluZ1BsYXliYWNrKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1QbGF5aW5nVGltZUxvY2spOworCisgICAgQUxPR1YoInN0b3BSZWJ1ZmZlclRpbWVyKCkgIHRpbWUgJTIwIiBQUklkNjQgIiAoZXhpdGluZyAlZCkiLCBtTGFzdFN0YXJ0ZWRSZWJ1ZmZlcmluZ1RpbWVOcywgZXhpdGluZ1BsYXliYWNrKTsKKworICAgIGlmIChtTGFzdFN0YXJ0ZWRSZWJ1ZmZlcmluZ1RpbWVOcyAhPSAwKSB7CisgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CisgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgaW50NjRfdCBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICAgICBpbnQ2NF90IHJlYnVmZmVyZWQgPSBub3cgLSBtTGFzdFN0YXJ0ZWRSZWJ1ZmZlcmluZ1RpbWVOczsKKyAgICAgICAgICAgIEFMT0dWKCJzdG9wUmVidWZmZXJpbmdUaW1lcigpICBsb2cgICUyMCIgUFJJZDY0ICIiLCByZWJ1ZmZlcmVkKTsKKworICAgICAgICAgICAgaWYgKHJlYnVmZmVyZWQgPiAwKSB7CisgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlNb3JlUmVidWZmZXJpbmdUaW1lVXMobVNyY0lkLCAocmVidWZmZXJlZCs1MDApLzEwMDApOworICAgICAgICAgICAgICAgIGlmIChleGl0aW5nUGxheWJhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlSZWJ1ZmZlcmluZ1doZW5FeGl0KG1TcmNJZCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1MYXN0U3RhcnRlZFJlYnVmZmVyaW5nVGltZU5zID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpvblBhdXNlKCkgeworCisgICAgc3RvcFBsYXliYWNrVGltZXIoIm9uUGF1c2UiKTsKKworICAgIGlmIChtUGF1c2VkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVBhdXNlZCA9IHRydWU7CisgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBtU291cmNlLT5wYXVzZSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCJwYXVzZSBjYWxsZWQgd2hlbiBzb3VyY2UgaXMgZ29uZSBvciBub3Qgc2V0Iik7CisgICAgfQorICAgIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgeworICAgICAgICBtUmVuZGVyZXItPnBhdXNlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coInBhdXNlIGNhbGxlZCB3aGVuIHJlbmRlcmVyIGlzIGdvbmUgb3Igbm90IHNldCIpOworICAgIH0KKworfQorCitib29sIE51UGxheWVyMjo6YXVkaW9EZWNvZGVyU3RpbGxOZWVkZWQoKSB7CisgICAgLy8gQXVkaW8gZGVjb2RlciBpcyBubyBsb25nZXIgbmVlZGVkIGlmIGl0J3MgaW4gc2h1dC9zaHV0dGluZyBkb3duIHN0YXR1cy4KKyAgICByZXR1cm4gKChtRmx1c2hpbmdBdWRpbyAhPSBTSFVUX0RPV04pICYmIChtRmx1c2hpbmdBdWRpbyAhPSBTSFVUVElOR19ET1dOX0RFQ09ERVIpKTsKK30KKwordm9pZCBOdVBsYXllcjI6OmhhbmRsZUZsdXNoQ29tcGxldGUoYm9vbCBhdWRpbywgYm9vbCBpc0RlY29kZXIpIHsKKyAgICAvLyBXZSB3YWl0IGZvciBib3RoIHRoZSBkZWNvZGVyIGZsdXNoIGFuZCB0aGUgcmVuZGVyZXIgZmx1c2ggdG8gY29tcGxldGUKKyAgICAvLyBiZWZvcmUgZW50ZXJpbmcgZWl0aGVyIHRoZSBGTFVTSEVEIG9yIHRoZSBTSFVUVElOR19ET1dOX0RFQ09ERVIgc3RhdGUuCisKKyAgICBtRmx1c2hDb21wbGV0ZVthdWRpb11baXNEZWNvZGVyXSA9IHRydWU7CisgICAgaWYgKCFtRmx1c2hDb21wbGV0ZVthdWRpb11bIWlzRGVjb2Rlcl0pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEZsdXNoU3RhdHVzICpzdGF0ZSA9IGF1ZGlvID8gJm1GbHVzaGluZ0F1ZGlvIDogJm1GbHVzaGluZ1ZpZGVvOworICAgIHN3aXRjaCAoKnN0YXRlKSB7CisgICAgICAgIGNhc2UgRkxVU0hJTkdfREVDT0RFUjoKKyAgICAgICAgeworICAgICAgICAgICAgKnN0YXRlID0gRkxVU0hFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGTFVTSElOR19ERUNPREVSX1NIVVRET1dOOgorICAgICAgICB7CisgICAgICAgICAgICAqc3RhdGUgPSBTSFVUVElOR19ET1dOX0RFQ09ERVI7CisKKyAgICAgICAgICAgIEFMT0dWKCJpbml0aWF0aW5nICVzIGRlY29kZXIgc2h1dGRvd24iLCBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKKyAgICAgICAgICAgIGdldERlY29kZXIoYXVkaW8pLT5pbml0aWF0ZVNodXRkb3duKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBkZWNvZGVyIGZsdXNoIGNvbXBsZXRlcyBvbmx5IG9jY3VyIGluIGEgZmx1c2hpbmcgc3RhdGUuCisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGlzRGVjb2RlciwgImRlY29kZXIgZmx1c2ggaW4gaW52YWxpZCBzdGF0ZSAlZCIsICpzdGF0ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpmaW5pc2hGbHVzaElmUG9zc2libGUoKSB7CisgICAgaWYgKG1GbHVzaGluZ0F1ZGlvICE9IE5PTkUgJiYgbUZsdXNoaW5nQXVkaW8gIT0gRkxVU0hFRAorICAgICAgICAgICAgJiYgbUZsdXNoaW5nQXVkaW8gIT0gU0hVVF9ET1dOKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUZsdXNoaW5nVmlkZW8gIT0gTk9ORSAmJiBtRmx1c2hpbmdWaWRlbyAhPSBGTFVTSEVECisgICAgICAgICAgICAmJiBtRmx1c2hpbmdWaWRlbyAhPSBTSFVUX0RPV04pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dWKCJib3RoIGF1ZGlvIGFuZCB2aWRlbyBhcmUgZmx1c2hlZCBub3cuIik7CisKKyAgICBtRmx1c2hpbmdBdWRpbyA9IE5PTkU7CisgICAgbUZsdXNoaW5nVmlkZW8gPSBOT05FOworCisgICAgY2xlYXJGbHVzaENvbXBsZXRlKCk7CisKKyAgICBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpwb3N0U2NhblNvdXJjZXMoKSB7CisgICAgaWYgKG1TY2FuU291cmNlc1BlbmRpbmcpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTY2FuU291cmNlcywgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1TY2FuU291cmNlc0dlbmVyYXRpb24pOworICAgIG1zZy0+cG9zdCgpOworCisgICAgbVNjYW5Tb3VyY2VzUGVuZGluZyA9IHRydWU7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjp0cnlPcGVuQXVkaW9TaW5rRm9yT2ZmbG9hZCgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGNvbnN0IHNwPE1ldGFEYXRhPiAmYXVkaW9NZXRhLCBib29sIGhhc1ZpZGVvKSB7CisgICAgLy8gTm90ZTogVGhpcyBpcyBjYWxsZWQgZWFybHkgaW4gTnVQbGF5ZXIyIHRvIGRldGVybWluZSB3aGV0aGVyIG9mZmxvYWRpbmcKKyAgICAvLyBpcyBwb3NzaWJsZTsgb3RoZXJ3aXNlIHRoZSBkZWNvZGVycyBjYWxsIHRoZSByZW5kZXJlciBvcGVuQXVkaW9TaW5rIGRpcmVjdGx5LgorCisgICAgc3RhdHVzX3QgZXJyID0gbVJlbmRlcmVyLT5vcGVuQXVkaW9TaW5rKAorICAgICAgICAgICAgZm9ybWF0LCB0cnVlIC8qIG9mZmxvYWRPbmx5ICovLCBoYXNWaWRlbywKKyAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUsICZtT2ZmbG9hZEF1ZGlvLCBtU291cmNlLT5pc1N0cmVhbWluZygpKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIC8vIEFueSBmYWlsdXJlIHdlIHR1cm4gb2ZmIG1PZmZsb2FkQXVkaW8uCisgICAgICAgIG1PZmZsb2FkQXVkaW8gPSBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKG1PZmZsb2FkQXVkaW8pIHsKKyAgICAgICAgc2VuZE1ldGFEYXRhVG9IYWwobUF1ZGlvU2luaywgYXVkaW9NZXRhKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpjbG9zZUF1ZGlvU2luaygpIHsKKyAgICBtUmVuZGVyZXItPmNsb3NlQXVkaW9TaW5rKCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpyZXN0YXJ0QXVkaW8oCisgICAgICAgIGludDY0X3QgY3VycmVudFBvc2l0aW9uVXMsIGJvb2wgZm9yY2VOb25PZmZsb2FkLCBib29sIG5lZWRzVG9DcmVhdGVBdWRpb0RlY29kZXIpIHsKKyAgICBpZiAobUF1ZGlvRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgIG1BdWRpb0RlY29kZXItPnBhdXNlKCk7CisgICAgICAgIG1BdWRpb0RlY29kZXIuY2xlYXIoKTsKKyAgICAgICAgbUF1ZGlvRGVjb2RlckVycm9yID0gZmFsc2U7CisgICAgICAgICsrbUF1ZGlvRGVjb2RlckdlbmVyYXRpb247CisgICAgfQorICAgIGlmIChtRmx1c2hpbmdBdWRpbyA9PSBGTFVTSElOR19ERUNPREVSKSB7CisgICAgICAgIG1GbHVzaENvbXBsZXRlWzEgLyogYXVkaW8gKi9dWzEgLyogaXNEZWNvZGVyICovXSA9IHRydWU7CisgICAgICAgIG1GbHVzaGluZ0F1ZGlvID0gRkxVU0hFRDsKKyAgICAgICAgZmluaXNoRmx1c2hJZlBvc3NpYmxlKCk7CisgICAgfSBlbHNlIGlmIChtRmx1c2hpbmdBdWRpbyA9PSBGTFVTSElOR19ERUNPREVSX1NIVVRET1dOCisgICAgICAgICAgICB8fCBtRmx1c2hpbmdBdWRpbyA9PSBTSFVUVElOR19ET1dOX0RFQ09ERVIpIHsKKyAgICAgICAgbUZsdXNoQ29tcGxldGVbMSAvKiBhdWRpbyAqL11bMSAvKiBpc0RlY29kZXIgKi9dID0gdHJ1ZTsKKyAgICAgICAgbUZsdXNoaW5nQXVkaW8gPSBTSFVUX0RPV047CisgICAgICAgIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOworICAgICAgICBuZWVkc1RvQ3JlYXRlQXVkaW9EZWNvZGVyID0gZmFsc2U7CisgICAgfQorICAgIGlmIChtUmVuZGVyZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNsb3NlQXVkaW9TaW5rKCk7CisgICAgbVJlbmRlcmVyLT5mbHVzaCh0cnVlIC8qIGF1ZGlvICovLCBmYWxzZSAvKiBub3RpZnlDb21wbGV0ZSAqLyk7CisgICAgaWYgKG1WaWRlb0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICBtUmVuZGVyZXItPmZsdXNoKGZhbHNlIC8qIGF1ZGlvICovLCBmYWxzZSAvKiBub3RpZnlDb21wbGV0ZSAqLyk7CisgICAgfQorCisgICAgcGVyZm9ybVNlZWsoY3VycmVudFBvc2l0aW9uVXMsIE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMgLyogbW9kZSAqLyk7CisKKyAgICBpZiAoZm9yY2VOb25PZmZsb2FkKSB7CisgICAgICAgIG1SZW5kZXJlci0+c2lnbmFsRGlzYWJsZU9mZmxvYWRBdWRpbygpOworICAgICAgICBtT2ZmbG9hZEF1ZGlvID0gZmFsc2U7CisgICAgfQorICAgIGlmIChuZWVkc1RvQ3JlYXRlQXVkaW9EZWNvZGVyKSB7CisgICAgICAgIGluc3RhbnRpYXRlRGVjb2Rlcih0cnVlIC8qIGF1ZGlvICovLCAmbUF1ZGlvRGVjb2RlciwgIWZvcmNlTm9uT2ZmbG9hZCk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6ZGV0ZXJtaW5lQXVkaW9Nb2RlQ2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmYXVkaW9Gb3JtYXQpIHsKKyAgICBpZiAobVNvdXJjZSA9PSBOVUxMIHx8IG1BdWRpb1NpbmsgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1SZW5kZXJlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJObyByZW5kZXJlciBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgYXVkaW8gbW9kZS4gVXNlIG5vbi1vZmZsb2FkIGZvciBzYWZldHkuIik7CisgICAgICAgIG1PZmZsb2FkQXVkaW8gPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPE1ldGFEYXRhPiBhdWRpb01ldGEgPSBtU291cmNlLT5nZXRGb3JtYXRNZXRhKHRydWUgLyogYXVkaW8gKi8pOworICAgIHNwPEFNZXNzYWdlPiB2aWRlb0Zvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLyk7CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlID0gbUF1ZGlvU2luay0+Z2V0QXVkaW9TdHJlYW1UeXBlKCk7CisgICAgY29uc3QgYm9vbCBoYXNWaWRlbyA9ICh2aWRlb0Zvcm1hdCAhPSBOVUxMKTsKKyAgICBib29sIGNhbk9mZmxvYWQgPSBjYW5PZmZsb2FkU3RyZWFtKAorICAgICAgICAgICAgYXVkaW9NZXRhLCBoYXNWaWRlbywgbVNvdXJjZS0+aXNTdHJlYW1pbmcoKSwgc3RyZWFtVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgJiYgKG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCA9PSAxLmYgJiYgbVBsYXliYWNrU2V0dGluZ3MubVBpdGNoID09IDEuZik7CisKKyAgICAvLyBNb2R1bGFyIERSTTogRGlzYWJsaW5nIGF1ZGlvIG9mZmxvYWQgaWYgdGhlIHNvdXJjZSBpcyBwcm90ZWN0ZWQKKyAgICBpZiAoY2FuT2ZmbG9hZCAmJiBtSXNEcm1Qcm90ZWN0ZWQpIHsKKyAgICAgICAgY2FuT2ZmbG9hZCA9IGZhbHNlOworICAgICAgICBBTE9HVigiZGV0ZXJtaW5lQXVkaW9Nb2RlQ2hhbmdlOiBEaXNhYmxpbmcgbU9mZmxvYWRBdWRpbyBiL2MgdGhlIHNvdXJjZSBpcyBwcm90ZWN0ZWQuIik7CisgICAgfQorCisgICAgaWYgKGNhbk9mZmxvYWQpIHsKKyAgICAgICAgaWYgKCFtT2ZmbG9hZEF1ZGlvKSB7CisgICAgICAgICAgICBtUmVuZGVyZXItPnNpZ25hbEVuYWJsZU9mZmxvYWRBdWRpbygpOworICAgICAgICB9CisgICAgICAgIC8vIG9wZW4gYXVkaW8gc2luayBlYXJseSB1bmRlciBvZmZsb2FkIG1vZGUuCisgICAgICAgIHRyeU9wZW5BdWRpb1NpbmtGb3JPZmZsb2FkKGF1ZGlvRm9ybWF0LCBhdWRpb01ldGEsIGhhc1ZpZGVvKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobU9mZmxvYWRBdWRpbykgeworICAgICAgICAgICAgbVJlbmRlcmVyLT5zaWduYWxEaXNhYmxlT2ZmbG9hZEF1ZGlvKCk7CisgICAgICAgICAgICBtT2ZmbG9hZEF1ZGlvID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6aW5zdGFudGlhdGVEZWNvZGVyKAorICAgICAgICBib29sIGF1ZGlvLCBzcDxEZWNvZGVyQmFzZT4gKmRlY29kZXIsIGJvb2wgY2hlY2tBdWRpb01vZGVDaGFuZ2UpIHsKKyAgICAvLyBUaGUgYXVkaW8gZGVjb2RlciBjb3VsZCBiZSBjbGVhcmVkIGJ5IHRlYXIgZG93bi4gSWYgc3RpbGwgaW4gc2h1dCBkb3duCisgICAgLy8gcHJvY2Vzcywgbm8gbmVlZCB0byBjcmVhdGUgYSBuZXcgYXVkaW8gZGVjb2Rlci4KKyAgICBpZiAoKmRlY29kZXIgIT0gTlVMTCB8fCAoYXVkaW8gJiYgbUZsdXNoaW5nQXVkaW8gPT0gU0hVVF9ET1dOKSkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdChhdWRpbyk7CisKKyAgICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoImVyciIsICZlcnIpICYmIGVycikgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvcm1hdC0+c2V0SW50MzIoInByaW9yaXR5IiwgMCAvKiByZWFsdGltZSAqLyk7CisKKyAgICBpZiAoIWF1ZGlvKSB7CisgICAgICAgIEFTdHJpbmcgbWltZTsKKyAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKKworICAgICAgICBzcDxBTWVzc2FnZT4gY2NOb3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDbG9zZWRDYXB0aW9uTm90aWZ5LCB0aGlzKTsKKyAgICAgICAgaWYgKG1DQ0RlY29kZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgbUNDRGVjb2RlciA9IG5ldyBDQ0RlY29kZXIoY2NOb3RpZnkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19TRUNVUkUpIHsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInNlY3VyZSIsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19QUk9URUNURUQpIHsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInByb3RlY3RlZCIsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgcmF0ZSA9IGdldEZyYW1lUmF0ZSgpOworICAgICAgICBpZiAocmF0ZSA+IDApIHsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0RmxvYXQoIm9wZXJhdGluZy1yYXRlIiwgcmF0ZSAqIG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdEF1ZGlvTm90aWZ5LCB0aGlzKTsKKyAgICAgICAgKyttQXVkaW9EZWNvZGVyR2VuZXJhdGlvbjsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1BdWRpb0RlY29kZXJHZW5lcmF0aW9uKTsKKworICAgICAgICBpZiAoY2hlY2tBdWRpb01vZGVDaGFuZ2UpIHsKKyAgICAgICAgICAgIGRldGVybWluZUF1ZGlvTW9kZUNoYW5nZShmb3JtYXQpOworICAgICAgICB9CisgICAgICAgIGlmIChtT2ZmbG9hZEF1ZGlvKSB7CisgICAgICAgICAgICBtU291cmNlLT5zZXRPZmZsb2FkQXVkaW8odHJ1ZSAvKiBvZmZsb2FkICovKTsKKworICAgICAgICAgICAgY29uc3QgYm9vbCBoYXNWaWRlbyA9IChtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyphdWRpbyAqLykgIT0gTlVMTCk7CisgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJoYXMtdmlkZW8iLCBoYXNWaWRlbyk7CisgICAgICAgICAgICAqZGVjb2RlciA9IG5ldyBEZWNvZGVyUGFzc1Rocm91Z2gobm90aWZ5LCBtU291cmNlLCBtUmVuZGVyZXIpOworICAgICAgICAgICAgQUxPR1YoImluc3RhbnRpYXRlRGVjb2RlciBhdWRpbyBEZWNvZGVyUGFzc1Rocm91Z2ggIGhhc1ZpZGVvOiAlZCIsIGhhc1ZpZGVvKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Tb3VyY2UtPnNldE9mZmxvYWRBdWRpbyhmYWxzZSAvKiBvZmZsb2FkICovKTsKKworICAgICAgICAgICAgKmRlY29kZXIgPSBuZXcgRGVjb2Rlcihub3RpZnksIG1Tb3VyY2UsIG1QSUQsIG1VSUQsIG1SZW5kZXJlcik7CisgICAgICAgICAgICBBTE9HVigiaW5zdGFudGlhdGVEZWNvZGVyIGF1ZGlvIERlY29kZXIiKTsKKyAgICAgICAgfQorICAgICAgICBtQXVkaW9EZWNvZGVyRXJyb3IgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0VmlkZW9Ob3RpZnksIHRoaXMpOworICAgICAgICArK21WaWRlb0RlY29kZXJHZW5lcmF0aW9uOworICAgICAgICBub3RpZnktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVZpZGVvRGVjb2RlckdlbmVyYXRpb24pOworCisgICAgICAgICpkZWNvZGVyID0gbmV3IERlY29kZXIoCisgICAgICAgICAgICAgICAgbm90aWZ5LCBtU291cmNlLCBtUElELCBtVUlELCBtUmVuZGVyZXIsIG1OYXRpdmVXaW5kb3csIG1DQ0RlY29kZXIpOworICAgICAgICBtVmlkZW9EZWNvZGVyRXJyb3IgPSBmYWxzZTsKKworICAgICAgICAvLyBlbmFibGUgRlJDIGlmIGhpZ2gtcXVhbGl0eSBBViBzeW5jIGlzIHJlcXVlc3RlZCwgZXZlbiBpZiBub3QKKyAgICAgICAgLy8gZGlyZWN0bHkgcXVldWluZyB0byBkaXNwbGF5LCBhcyB0aGlzIHdpbGwgZXZlbiBpbXByb3ZlIHRleHR1cmV2aWV3CisgICAgICAgIC8vIHBsYXliYWNrLgorICAgICAgICB7CisgICAgICAgICAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3Quc3lzLm1lZGlhLmF2c3luYyIsIGZhbHNlKSkgeworICAgICAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImF1dG8tZnJjIiwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgKCpkZWNvZGVyKS0+aW5pdCgpOworCisgICAgLy8gTW9kdWxhciBEUk0KKyAgICBpZiAobUlzRHJtUHJvdGVjdGVkKSB7CisgICAgICAgIGZvcm1hdC0+c2V0T2JqZWN0KCJjcnlwdG8iLCBtQ3J5cHRvKTsKKyAgICAgICAgQUxPR1YoImluc3RhbnRpYXRlRGVjb2RlcjogbUNyeXB0bzogJXAgaXNTZWN1cmU6ICVkIiwgbUNyeXB0by5nZXQoKSwKKyAgICAgICAgICAgICAgICAobVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1NFQ1VSRSkgIT0gMCk7CisgICAgfQorCisgICAgKCpkZWNvZGVyKS0+Y29uZmlndXJlKGZvcm1hdCk7CisKKyAgICBpZiAoIWF1ZGlvKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBwYXJhbXMgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICAgICAgZmxvYXQgcmF0ZSA9IGdldEZyYW1lUmF0ZSgpOworICAgICAgICBpZiAocmF0ZSA+IDApIHsKKyAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoImZyYW1lLXJhdGUtdG90YWwiLCByYXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPE1ldGFEYXRhPiBmaWxlTWV0YSA9IGdldEZpbGVNZXRhKCk7CisgICAgICAgIGlmIChmaWxlTWV0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpbnQzMl90IHZpZGVvVGVtcG9yYWxMYXllckNvdW50OworICAgICAgICAgICAgaWYgKGZpbGVNZXRhLT5maW5kSW50MzIoa0tleVRlbXBvcmFsTGF5ZXJDb3VudCwgJnZpZGVvVGVtcG9yYWxMYXllckNvdW50KQorICAgICAgICAgICAgICAgICAgICAmJiB2aWRlb1RlbXBvcmFsTGF5ZXJDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEludDMyKCJ0ZW1wb3JhbC1sYXllci1jb3VudCIsIHZpZGVvVGVtcG9yYWxMYXllckNvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYXJhbXMtPmNvdW50RW50cmllcygpID4gMCkgeworICAgICAgICAgICAgKCpkZWNvZGVyKS0+c2V0UGFyYW1ldGVycyhwYXJhbXMpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordm9pZCBOdVBsYXllcjI6OnVwZGF0ZVZpZGVvU2l6ZSgKKyAgICAgICAgaW50NjRfdCBzcmNJZCwKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZpbnB1dEZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQpIHsKKyAgICBpZiAoaW5wdXRGb3JtYXQgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiVW5rbm93biB2aWRlbyBzaXplLCByZXBvcnRpbmcgMHgwISIpOworICAgICAgICBub3RpZnlMaXN0ZW5lcihzcmNJZCwgTUVESUEyX1NFVF9WSURFT19TSVpFLCAwLCAwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQzMl90IGVyciA9IE9LOworICAgIGlucHV0Rm9ybWF0LT5maW5kSW50MzIoImVyciIsICZlcnIpOworICAgIGlmIChlcnIgPT0gLUVXT1VMREJMT0NLKSB7CisgICAgICAgIEFMT0dXKCJWaWRlbyBtZXRhIGlzIG5vdCBhdmFpbGFibGUgeWV0ISIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR1coIlNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIHZpZGVvIG1ldGEhIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQzMl90IGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodDsKKyAgICBpZiAob3V0cHV0Rm9ybWF0ICE9IE5VTEwpIHsKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgICAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpKTsKKyAgICAgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKTsKKworICAgICAgICBpbnQzMl90IGNyb3BMZWZ0LCBjcm9wVG9wLCBjcm9wUmlnaHQsIGNyb3BCb3R0b207CisgICAgICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZFJlY3QoCisgICAgICAgICAgICAgICAgICAgICJjcm9wIiwKKyAgICAgICAgICAgICAgICAgICAgJmNyb3BMZWZ0LCAmY3JvcFRvcCwgJmNyb3BSaWdodCwgJmNyb3BCb3R0b20pKTsKKworICAgICAgICBkaXNwbGF5V2lkdGggPSBjcm9wUmlnaHQgLSBjcm9wTGVmdCArIDE7CisgICAgICAgIGRpc3BsYXlIZWlnaHQgPSBjcm9wQm90dG9tIC0gY3JvcFRvcCArIDE7CisKKyAgICAgICAgQUxPR1YoIlZpZGVvIG91dHB1dCBmb3JtYXQgY2hhbmdlZCB0byAlZCB4ICVkICIKKyAgICAgICAgICAgICAiKGNyb3A6ICVkIHggJWQgQCAoJWQsICVkKSkiLAorICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgZGlzcGxheVdpZHRoLAorICAgICAgICAgICAgIGRpc3BsYXlIZWlnaHQsCisgICAgICAgICAgICAgY3JvcExlZnQsIGNyb3BUb3ApOworICAgIH0gZWxzZSB7CisgICAgICAgIENIRUNLKGlucHV0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJmRpc3BsYXlXaWR0aCkpOworICAgICAgICBDSEVDSyhpbnB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmZGlzcGxheUhlaWdodCkpOworCisgICAgICAgIEFMT0dWKCJWaWRlbyBpbnB1dCBmb3JtYXQgJWQgeCAlZCIsIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCk7CisgICAgfQorCisgICAgLy8gVGFrZSBpbnRvIGFjY291bnQgc2FtcGxlIGFzcGVjdCByYXRpbyBpZiBuZWNlc3Nhcnk6CisgICAgaW50MzJfdCBzYXJXaWR0aCwgc2FySGVpZ2h0OworICAgIGlmIChpbnB1dEZvcm1hdC0+ZmluZEludDMyKCJzYXItd2lkdGgiLCAmc2FyV2lkdGgpCisgICAgICAgICAgICAmJiBpbnB1dEZvcm1hdC0+ZmluZEludDMyKCJzYXItaGVpZ2h0IiwgJnNhckhlaWdodCkKKyAgICAgICAgICAgICYmIHNhcldpZHRoID4gMCAmJiBzYXJIZWlnaHQgPiAwKSB7CisgICAgICAgIEFMT0dWKCJTYW1wbGUgYXNwZWN0IHJhdGlvICVkIDogJWQiLCBzYXJXaWR0aCwgc2FySGVpZ2h0KTsKKworICAgICAgICBkaXNwbGF5V2lkdGggPSAoZGlzcGxheVdpZHRoICogc2FyV2lkdGgpIC8gc2FySGVpZ2h0OworCisgICAgICAgIEFMT0dWKCJkaXNwbGF5IGRpbWVuc2lvbnMgJWQgeCAlZCIsIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgICAgICBpZiAoaW5wdXRGb3JtYXQtPmZpbmRJbnQzMigiZGlzcGxheS13aWR0aCIsICZ3aWR0aCkKKyAgICAgICAgICAgICAgICAmJiBpbnB1dEZvcm1hdC0+ZmluZEludDMyKCJkaXNwbGF5LWhlaWdodCIsICZoZWlnaHQpCisgICAgICAgICAgICAgICAgJiYgd2lkdGggPiAwICYmIGhlaWdodCA+IDAKKyAgICAgICAgICAgICAgICAmJiBkaXNwbGF5V2lkdGggPiAwICYmIGRpc3BsYXlIZWlnaHQgPiAwKSB7CisgICAgICAgICAgICBpZiAoZGlzcGxheUhlaWdodCAqIChpbnQ2NF90KXdpZHRoIC8gaGVpZ2h0ID4gKGludDY0X3QpZGlzcGxheVdpZHRoKSB7CisgICAgICAgICAgICAgICAgZGlzcGxheUhlaWdodCA9IChpbnQzMl90KShkaXNwbGF5V2lkdGggKiAoaW50NjRfdCloZWlnaHQgLyB3aWR0aCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRpc3BsYXlXaWR0aCA9IChpbnQzMl90KShkaXNwbGF5SGVpZ2h0ICogKGludDY0X3Qpd2lkdGggLyBoZWlnaHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIlZpZGVvIGRpc3BsYXkgd2lkdGggYW5kIGhlaWdodCBhcmUgb3ZlcnJpZGRlbiB0byAlZCB4ICVkIiwKKyAgICAgICAgICAgICAgICAgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzOworICAgIGlmICghaW5wdXRGb3JtYXQtPmZpbmRJbnQzMigicm90YXRpb24tZGVncmVlcyIsICZyb3RhdGlvbkRlZ3JlZXMpKSB7CisgICAgICAgIHJvdGF0aW9uRGVncmVlcyA9IDA7CisgICAgfQorCisgICAgaWYgKHJvdGF0aW9uRGVncmVlcyA9PSA5MCB8fCByb3RhdGlvbkRlZ3JlZXMgPT0gMjcwKSB7CisgICAgICAgIGludDMyX3QgdG1wID0gZGlzcGxheVdpZHRoOworICAgICAgICBkaXNwbGF5V2lkdGggPSBkaXNwbGF5SGVpZ2h0OworICAgICAgICBkaXNwbGF5SGVpZ2h0ID0gdG1wOworICAgIH0KKworICAgIG5vdGlmeUxpc3RlbmVyKAorICAgICAgICAgICAgc3JjSWQsCisgICAgICAgICAgICBNRURJQTJfU0VUX1ZJREVPX1NJWkUsCisgICAgICAgICAgICBkaXNwbGF5V2lkdGgsCisgICAgICAgICAgICBkaXNwbGF5SGVpZ2h0KTsKK30KKwordm9pZCBOdVBsYXllcjI6Om5vdGlmeUxpc3RlbmVyKGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICppbikgeworICAgIGlmIChtRHJpdmVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CisKKyAgICBpZiAoZHJpdmVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGRyaXZlci0+bm90aWZ5TGlzdGVuZXIoc3JjSWQsIG1zZywgZXh0MSwgZXh0MiwgaW4pOworfQorCit2b2lkIE51UGxheWVyMjo6Zmx1c2hEZWNvZGVyKGJvb2wgYXVkaW8sIGJvb2wgbmVlZFNodXRkb3duKSB7CisgICAgQUxPR1YoIlslc10gZmx1c2hEZWNvZGVyIG5lZWRTaHV0ZG93bj0lZCIsCisgICAgICAgICAgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIiwgbmVlZFNodXRkb3duKTsKKworICAgIGNvbnN0IHNwPERlY29kZXJCYXNlPiAmZGVjb2RlciA9IGdldERlY29kZXIoYXVkaW8pOworICAgIGlmIChkZWNvZGVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0koImZsdXNoRGVjb2RlciAlcyB3aXRob3V0IGRlY29kZXIgcHJlc2VudCIsCisgICAgICAgICAgICAgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgY29udGludWUgdG8gc2NhbiBzb3VyY2VzIHVudGlsIHdlIGZpbmlzaCBmbHVzaGluZy4KKyAgICArK21TY2FuU291cmNlc0dlbmVyYXRpb247CisgICAgaWYgKG1TY2FuU291cmNlc1BlbmRpbmcpIHsKKyAgICAgICAgaWYgKCFuZWVkU2h1dGRvd24pIHsKKyAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBuZXcgU2ltcGxlQWN0aW9uKCZOdVBsYXllcjI6OnBlcmZvcm1TY2FuU291cmNlcykpOworICAgICAgICB9CisgICAgICAgIG1TY2FuU291cmNlc1BlbmRpbmcgPSBmYWxzZTsKKyAgICB9CisKKyAgICBkZWNvZGVyLT5zaWduYWxGbHVzaCgpOworCisgICAgRmx1c2hTdGF0dXMgbmV3U3RhdHVzID0KKyAgICAgICAgbmVlZFNodXRkb3duID8gRkxVU0hJTkdfREVDT0RFUl9TSFVURE9XTiA6IEZMVVNISU5HX0RFQ09ERVI7CisKKyAgICBtRmx1c2hDb21wbGV0ZVthdWRpb11bZmFsc2UgLyogaXNEZWNvZGVyICovXSA9IChtUmVuZGVyZXIgPT0gTlVMTCk7CisgICAgbUZsdXNoQ29tcGxldGVbYXVkaW9dW3RydWUgLyogaXNEZWNvZGVyICovXSA9IGZhbHNlOworICAgIGlmIChhdWRpbykgeworICAgICAgICBBTE9HRV9JRihtRmx1c2hpbmdBdWRpbyAhPSBOT05FLAorICAgICAgICAgICAgICAgICJhdWRpbyBmbHVzaERlY29kZXIoKSBpcyBjYWxsZWQgaW4gc3RhdGUgJWQiLCBtRmx1c2hpbmdBdWRpbyk7CisgICAgICAgIG1GbHVzaGluZ0F1ZGlvID0gbmV3U3RhdHVzOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFX0lGKG1GbHVzaGluZ1ZpZGVvICE9IE5PTkUsCisgICAgICAgICAgICAgICAgInZpZGVvIGZsdXNoRGVjb2RlcigpIGlzIGNhbGxlZCBpbiBzdGF0ZSAlZCIsIG1GbHVzaGluZ1ZpZGVvKTsKKyAgICAgICAgbUZsdXNoaW5nVmlkZW8gPSBuZXdTdGF0dXM7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6cXVldWVEZWNvZGVyU2h1dGRvd24oCisgICAgICAgIGJvb2wgYXVkaW8sIGJvb2wgdmlkZW8sIGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVwbHkpIHsKKyAgICBBTE9HSSgicXVldWVEZWNvZGVyU2h1dGRvd24gYXVkaW89JWQsIHZpZGVvPSVkIiwgYXVkaW8sIHZpZGVvKTsKKworICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgbmV3IEZsdXNoRGVjb2RlckFjdGlvbigKKyAgICAgICAgICAgICAgICBhdWRpbyA/IEZMVVNIX0NNRF9TSFVURE9XTiA6IEZMVVNIX0NNRF9OT05FLAorICAgICAgICAgICAgICAgIHZpZGVvID8gRkxVU0hfQ01EX1NIVVRET1dOIDogRkxVU0hfQ01EX05PTkUpKTsKKworICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgbmV3IFNpbXBsZUFjdGlvbigmTnVQbGF5ZXIyOjpwZXJmb3JtU2NhblNvdXJjZXMpKTsKKworICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKG5ldyBQb3N0TWVzc2FnZUFjdGlvbihyZXBseSkpOworCisgICAgcHJvY2Vzc0RlZmVycmVkQWN0aW9ucygpOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OnNldFZpZGVvU2NhbGluZ01vZGUoaW50MzJfdCBtb2RlKSB7CisgICAgbVZpZGVvU2NhbGluZ01vZGUgPSBtb2RlOworICAgIGlmIChtTmF0aXZlV2luZG93ICE9IE5VTEwgJiYgbU5hdGl2ZVdpbmRvdy0+Z2V0QU5hdGl2ZVdpbmRvdygpICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzX3QgcmV0ID0gbmF0aXZlX3dpbmRvd19zZXRfc2NhbGluZ19tb2RlKAorICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSwgbVZpZGVvU2NhbGluZ01vZGUpOworICAgICAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBzY2FsaW5nIG1vZGUgKCVkKTogJXMiLAorICAgICAgICAgICAgICAgIC1yZXQsIHN0cmVycm9yKC1yZXQpKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OmdldFRyYWNrSW5mbyhQYXJjZWwqIHJlcGx5KSBjb25zdCB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldFRyYWNrSW5mbywgdGhpcyk7CisgICAgbXNnLT5zZXRQb2ludGVyKCJyZXBseSIsIHJlcGx5KTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpnZXRTZWxlY3RlZFRyYWNrKGludDMyX3QgdHlwZSwgUGFyY2VsKiByZXBseSkgY29uc3QgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRTZWxlY3RlZFRyYWNrLCB0aGlzKTsKKyAgICBtc2ctPnNldFBvaW50ZXIoInJlcGx5IiwgcmVwbHkpOworICAgIG1zZy0+c2V0SW50MzIoInR5cGUiLCB0eXBlKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpzZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QsIGludDY0X3QgdGltZVVzKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbGVjdFRyYWNrLCB0aGlzKTsKKyAgICBtc2ctPnNldFNpemUoInRyYWNrSW5kZXgiLCB0cmFja0luZGV4KTsKKyAgICBtc2ctPnNldEludDMyKCJzZWxlY3QiLCBzZWxlY3QpOworICAgIG1zZy0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICghcmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpIHsKKyAgICAgICAgZXJyID0gT0s7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbWVkaWFVcykgeworICAgIHNwPFJlbmRlcmVyPiByZW5kZXJlciA9IG1SZW5kZXJlcjsKKyAgICBpZiAocmVuZGVyZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVuZGVyZXItPmdldEN1cnJlbnRQb3NpdGlvbihtZWRpYVVzKTsKK30KKwordm9pZCBOdVBsYXllcjI6OmdldFN0YXRzKFZlY3RvcjxzcDxBTWVzc2FnZT4gPiAqbVRyYWNrU3RhdHMpIHsKKyAgICBDSEVDSyhtVHJhY2tTdGF0cyAhPSBOVUxMKTsKKworICAgIG1UcmFja1N0YXRzLT5jbGVhcigpOworICAgIGlmIChtVmlkZW9EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgbVRyYWNrU3RhdHMtPnB1c2hfYmFjayhtVmlkZW9EZWNvZGVyLT5nZXRTdGF0cygpKTsKKyAgICB9CisgICAgaWYgKG1BdWRpb0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICBtVHJhY2tTdGF0cy0+cHVzaF9iYWNrKG1BdWRpb0RlY29kZXItPmdldFN0YXRzKCkpOworICAgIH0KK30KKworc3A8TWV0YURhdGE+IE51UGxheWVyMjo6Z2V0RmlsZU1ldGEoKSB7CisgICAgcmV0dXJuIG1Tb3VyY2UtPmdldEZpbGVGb3JtYXRNZXRhKCk7Cit9CisKK2Zsb2F0IE51UGxheWVyMjo6Z2V0RnJhbWVSYXRlKCkgeworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVNvdXJjZS0+Z2V0Rm9ybWF0TWV0YShmYWxzZSAvKiBhdWRpbyAqLyk7CisgICAgaWYgKG1ldGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50MzJfdCByYXRlOworICAgIGlmICghbWV0YS0+ZmluZEludDMyKGtLZXlGcmFtZVJhdGUsICZyYXRlKSkgeworICAgICAgICAvLyBmYWxsIGJhY2sgdG8gdHJ5IGZpbGUgbWV0YQorICAgICAgICBzcDxNZXRhRGF0YT4gZmlsZU1ldGEgPSBnZXRGaWxlTWV0YSgpOworICAgICAgICBpZiAoZmlsZU1ldGEgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR1coInNvdXJjZSBoYXMgdmlkZW8gbWV0YSBidXQgbm90IGZpbGUgbWV0YSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGludDMyX3QgZmlsZU1ldGFSYXRlOworICAgICAgICBpZiAoIWZpbGVNZXRhLT5maW5kSW50MzIoa0tleUZyYW1lUmF0ZSwgJmZpbGVNZXRhUmF0ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmlsZU1ldGFSYXRlOworICAgIH0KKyAgICByZXR1cm4gcmF0ZTsKK30KKwordm9pZCBOdVBsYXllcjI6OnNjaGVkdWxlUG9sbER1cmF0aW9uKCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQb2xsRHVyYXRpb24sIHRoaXMpOworICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtUG9sbER1cmF0aW9uR2VuZXJhdGlvbik7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpjYW5jZWxQb2xsRHVyYXRpb24oKSB7CisgICAgKyttUG9sbER1cmF0aW9uR2VuZXJhdGlvbjsKK30KKwordm9pZCBOdVBsYXllcjI6OnByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKSB7CisgICAgd2hpbGUgKCFtRGVmZXJyZWRBY3Rpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gV2Ugd29uJ3QgZXhlY3V0ZSBhbnkgZGVmZXJyZWQgYWN0aW9ucyB1bnRpbCB3ZSdyZSBubyBsb25nZXIgaW4KKyAgICAgICAgLy8gYW4gaW50ZXJtZWRpYXRlIHN0YXRlLCBpLmUuIG9uZSBtb3JlIG1vcmUgZGVjb2RlcnMgYXJlIGN1cnJlbnRseQorICAgICAgICAvLyBmbHVzaGluZyBvciBzaHV0dGluZyBkb3duLgorCisgICAgICAgIGlmIChtRmx1c2hpbmdBdWRpbyAhPSBOT05FIHx8IG1GbHVzaGluZ1ZpZGVvICE9IE5PTkUpIHsKKyAgICAgICAgICAgIC8vIFdlJ3JlIGN1cnJlbnRseSBmbHVzaGluZywgcG9zdHBvbmUgdGhlIHJlc2V0IHVudGlsIHRoYXQncworICAgICAgICAgICAgLy8gY29tcGxldGVkLgorCisgICAgICAgICAgICBBTE9HVigicG9zdHBvbmluZyBhY3Rpb24gbUZsdXNoaW5nQXVkaW89JWQsIG1GbHVzaGluZ1ZpZGVvPSVkIiwKKyAgICAgICAgICAgICAgICAgIG1GbHVzaGluZ0F1ZGlvLCBtRmx1c2hpbmdWaWRlbyk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3A8QWN0aW9uPiBhY3Rpb24gPSAqbURlZmVycmVkQWN0aW9ucy5iZWdpbigpOworICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLmVyYXNlKG1EZWZlcnJlZEFjdGlvbnMuYmVnaW4oKSk7CisKKyAgICAgICAgYWN0aW9uLT5leGVjdXRlKHRoaXMpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OnBlcmZvcm1TZWVrKGludDY0X3Qgc2Vla1RpbWVVcywgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSkgeworICAgIEFMT0dWKCJwZXJmb3JtU2VlayBzZWVrVGltZVVzPSVsbGQgdXMgKCUuMmYgc2VjcyksIG1vZGU9JWQiLAorICAgICAgICAgIChsb25nIGxvbmcpc2Vla1RpbWVVcywgc2Vla1RpbWVVcyAvIDFFNiwgbW9kZSk7CisKKyAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIC8vIFRoaXMgaGFwcGVucyB3aGVuIHJlc2V0IG9jY3VycyByaWdodCBiZWZvcmUgdGhlIGxvb3AgbW9kZQorICAgICAgICAvLyBhc3luY2hyb25vdXNseSBzZWVrcyB0byB0aGUgc3RhcnQgb2YgdGhlIHN0cmVhbS4KKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQXVkaW9EZWNvZGVyICE9IE5VTEwgfHwgbVZpZGVvRGVjb2RlciAhPSBOVUxMLAorICAgICAgICAgICAgICAgICJtU291cmNlIGlzIE5VTEwgYW5kIGRlY29kZXJzIG5vdCBOVUxMIGF1ZGlvKCVwKSB2aWRlbyglcCkiLAorICAgICAgICAgICAgICAgIG1BdWRpb0RlY29kZXIuZ2V0KCksIG1WaWRlb0RlY29kZXIuZ2V0KCkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1QcmV2aW91c1NlZWtUaW1lVXMgPSBzZWVrVGltZVVzOworICAgIG1Tb3VyY2UtPnNlZWtUbyhzZWVrVGltZVVzLCBtb2RlKTsKKyAgICArK21UaW1lZFRleHRHZW5lcmF0aW9uOworCisgICAgLy8gZXZlcnl0aGluZydzIGZsdXNoZWQsIGNvbnRpbnVlIHBsYXliYWNrLgorfQorCit2b2lkIE51UGxheWVyMjo6cGVyZm9ybURlY29kZXJGbHVzaChGbHVzaENvbW1hbmQgYXVkaW8sIEZsdXNoQ29tbWFuZCB2aWRlbykgeworICAgIEFMT0dWKCJwZXJmb3JtRGVjb2RlckZsdXNoIGF1ZGlvPSVkLCB2aWRlbz0lZCIsIGF1ZGlvLCB2aWRlbyk7CisKKyAgICBpZiAoKGF1ZGlvID09IEZMVVNIX0NNRF9OT05FIHx8IG1BdWRpb0RlY29kZXIgPT0gTlVMTCkKKyAgICAgICAgICAgICYmICh2aWRlbyA9PSBGTFVTSF9DTURfTk9ORSB8fCBtVmlkZW9EZWNvZGVyID09IE5VTEwpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoYXVkaW8gIT0gRkxVU0hfQ01EX05PTkUgJiYgbUF1ZGlvRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgIGZsdXNoRGVjb2Rlcih0cnVlIC8qIGF1ZGlvICovLCAoYXVkaW8gPT0gRkxVU0hfQ01EX1NIVVRET1dOKSk7CisgICAgfQorCisgICAgaWYgKHZpZGVvICE9IEZMVVNIX0NNRF9OT05FICYmIG1WaWRlb0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICBmbHVzaERlY29kZXIoZmFsc2UgLyogYXVkaW8gKi8sICh2aWRlbyA9PSBGTFVTSF9DTURfU0hVVERPV04pKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpwZXJmb3JtUmVzZXQoKSB7CisgICAgQUxPR1YoInBlcmZvcm1SZXNldCIpOworCisgICAgQ0hFQ0sobUF1ZGlvRGVjb2RlciA9PSBOVUxMKTsKKyAgICBDSEVDSyhtVmlkZW9EZWNvZGVyID09IE5VTEwpOworCisgICAgc3RvcFBsYXliYWNrVGltZXIoInBlcmZvcm1SZXNldCIpOworICAgIHN0b3BSZWJ1ZmZlcmluZ1RpbWVyKHRydWUpOworCisgICAgY2FuY2VsUG9sbER1cmF0aW9uKCk7CisKKyAgICArK21TY2FuU291cmNlc0dlbmVyYXRpb247CisgICAgbVNjYW5Tb3VyY2VzUGVuZGluZyA9IGZhbHNlOworCisgICAgaWYgKG1SZW5kZXJlckxvb3BlciAhPSBOVUxMKSB7CisgICAgICAgIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgbVJlbmRlcmVyTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtUmVuZGVyZXItPmlkKCkpOworICAgICAgICB9CisgICAgICAgIG1SZW5kZXJlckxvb3Blci0+c3RvcCgpOworICAgICAgICBtUmVuZGVyZXJMb29wZXIuY2xlYXIoKTsKKyAgICB9CisgICAgbVJlbmRlcmVyLmNsZWFyKCk7CisgICAgKyttUmVuZGVyZXJHZW5lcmF0aW9uOworCisgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBtU291cmNlLT5zdG9wKCk7CisKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Tb3VyY2VMb2NrKTsKKyAgICAgICAgbVNvdXJjZS5jbGVhcigpOworICAgIH0KKworICAgIGlmIChtRHJpdmVyICE9IE5VTEwpIHsKKyAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVJlc2V0Q29tcGxldGUobVNyY0lkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgbVByZXBhcmVkID0gZmFsc2U7CisgICAgbVJlc2V0dGluZyA9IGZhbHNlOworICAgIG1Tb3VyY2VTdGFydGVkID0gZmFsc2U7CisKKyAgICAvLyBNb2R1bGFyIERSTQorICAgIGlmIChtQ3J5cHRvICE9IE5VTEwpIHsKKyAgICAgICAgLy8gZGVjb2RlcnMgd2lsbCBiZSBmbHVzaGVkIGJlZm9yZSB0aGlzIHNvIHRoZWlyIG1DcnlwdG8gd291bGQgZ28gYXdheSBvbiB0aGVpciBvd24KKyAgICAgICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKKyAgICAgICAgQUxPR0QoInBlcmZvcm1SZXNldCBtQ3J5cHRvOiAlcCIsIG1DcnlwdG8uZ2V0KCkpOworICAgICAgICBtQ3J5cHRvLmNsZWFyKCk7CisgICAgfQorICAgIG1Jc0RybVByb3RlY3RlZCA9IGZhbHNlOworfQorCit2b2lkIE51UGxheWVyMjo6cGVyZm9ybVBsYXlOZXh0RGF0YVNvdXJjZSgpIHsKKyAgICBBTE9HVigicGVyZm9ybVBsYXlOZXh0RGF0YVNvdXJjZSIpOworCisgICAgQ0hFQ0sobUF1ZGlvRGVjb2RlciA9PSBOVUxMKTsKKyAgICBDSEVDSyhtVmlkZW9EZWNvZGVyID09IE5VTEwpOworCisgICAgc3RvcFBsYXliYWNrVGltZXIoInBlcmZvcm1QbGF5TmV4dERhdGFTb3VyY2UiKTsKKyAgICBzdG9wUmVidWZmZXJpbmdUaW1lcih0cnVlKTsKKworICAgIGNhbmNlbFBvbGxEdXJhdGlvbigpOworCisgICAgKyttU2NhblNvdXJjZXNHZW5lcmF0aW9uOworICAgIG1TY2FuU291cmNlc1BlbmRpbmcgPSBmYWxzZTsKKworICAgICsrbVJlbmRlcmVyR2VuZXJhdGlvbjsKKworICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgbVNvdXJjZS0+c3RvcCgpOworICAgIH0KKworICAgIGxvbmcgcHJldmlvdXNTcmNJZDsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU291cmNlTG9jayk7CisgICAgICAgIG1Tb3VyY2UgPSBtTmV4dFNvdXJjZTsKKyAgICAgICAgbU5leHRTb3VyY2UgPSBOVUxMOworICAgICAgICBwcmV2aW91c1NyY0lkID0gbVNyY0lkOworICAgICAgICBtU3JjSWQgPSBtTmV4dFNyY0lkOworICAgICAgICArK21OZXh0U3JjSWQ7ICAvLyB0byBkaXN0aW5ndWlzaCB0aGUgdHdvIHNvdXJjZXMuCisgICAgfQorCisgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCkgeworICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOworICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKHByZXZpb3VzU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19QTEFZQkFDS19DT01QTEVURSwgMCk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19TVEFSVEVEX0FTX05FWFQsIDApOworICAgICAgICB9CisgICAgfQorCisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBtUHJlcGFyZWQgPSB0cnVlOyAgLy8gVE9ETzogd2hhdCBpZiBpdCdzIG5vdCBwcmVwYXJlZAorICAgIG1SZXNldHRpbmcgPSBmYWxzZTsKKyAgICBtU291cmNlU3RhcnRlZCA9IGZhbHNlOworCisgICAgLy8gTW9kdWxhciBEUk0KKyAgICBpZiAobUNyeXB0byAhPSBOVUxMKSB7CisgICAgICAgIC8vIGRlY29kZXJzIHdpbGwgYmUgZmx1c2hlZCBiZWZvcmUgdGhpcyBzbyB0aGVpciBtQ3J5cHRvIHdvdWxkIGdvIGF3YXkgb24gdGhlaXIgb3duCisgICAgICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCisgICAgICAgIEFMT0dEKCJwZXJmb3JtUmVzZXQgbUNyeXB0bzogJXAiLCBtQ3J5cHRvLmdldCgpKTsKKyAgICAgICAgbUNyeXB0by5jbGVhcigpOworICAgIH0KKyAgICBtSXNEcm1Qcm90ZWN0ZWQgPSBmYWxzZTsKKworICAgIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgeworICAgICAgICBtUmVuZGVyZXItPnJlc3VtZSgpOworICAgIH0KKworICAgIG9uU3RhcnQoKTsKKyAgICBtUGF1c2VkQnlDbGllbnQgPSBmYWxzZTsKKyAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9TVEFSVEVELCAwLCAwKTsKK30KKwordm9pZCBOdVBsYXllcjI6OnBlcmZvcm1TY2FuU291cmNlcygpIHsKKyAgICBBTE9HVigicGVyZm9ybVNjYW5Tb3VyY2VzIik7CisKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUF1ZGlvRGVjb2RlciA9PSBOVUxMIHx8IG1WaWRlb0RlY29kZXIgPT0gTlVMTCkgeworICAgICAgICBwb3N0U2NhblNvdXJjZXMoKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpwZXJmb3JtU2V0U3VyZmFjZShjb25zdCBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gJm53dykgeworICAgIEFMT0dWKCJwZXJmb3JtU2V0U3VyZmFjZSIpOworCisgICAgbU5hdGl2ZVdpbmRvdyA9IG53dzsKKworICAgIC8vIFhYWCAtIGlnbm9yZSBlcnJvciBmcm9tIHNldFZpZGVvU2NhbGluZ01vZGUgZm9yIG5vdworICAgIHNldFZpZGVvU2NhbGluZ01vZGUobVZpZGVvU2NhbGluZ01vZGUpOworCisgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCkgeworICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOworICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5U2V0U3VyZmFjZUNvbXBsZXRlKG1TcmNJZCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpwZXJmb3JtUmVzdW1lRGVjb2RlcnMoYm9vbCBuZWVkTm90aWZ5KSB7CisgICAgaWYgKG5lZWROb3RpZnkpIHsKKyAgICAgICAgbVJlc3VtZVBlbmRpbmcgPSB0cnVlOworICAgICAgICBpZiAobVZpZGVvRGVjb2RlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAvLyBpZiBhdWRpby1vbmx5LCB3ZSBjYW4gbm90aWZ5IHNlZWsgY29tcGxldGUgbm93LAorICAgICAgICAgICAgLy8gYXMgdGhlIHJlc3VtZSBvcGVyYXRpb24gd2lsbCBiZSByZWxhdGl2ZWx5IGZhc3QuCisgICAgICAgICAgICBmaW5pc2hSZXN1bWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtVmlkZW9EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgLy8gV2hlbiB0aGVyZSBpcyBjb250aW51b3VzIHNlZWssIE1lZGlhUGxheWVyIHdpbGwgY2FjaGUgdGhlIHNlZWsKKyAgICAgICAgLy8gcG9zaXRpb24sIGFuZCBzZW5kIGRvd24gbmV3IHNlZWsgcmVxdWVzdCB3aGVuIHByZXZpb3VzIHNlZWsgaXMKKyAgICAgICAgLy8gY29tcGxldGUuIExldCdzIHdhaXQgZm9yIGF0IGxlYXN0IG9uZSB2aWRlbyBvdXRwdXQgZnJhbWUgYmVmb3JlCisgICAgICAgIC8vIG5vdGlmeWluZyBzZWVrIGNvbXBsZXRlLCBzbyB0aGF0IHRoZSB2aWRlbyB0aHVtYm5haWwgZ2V0cyB1cGRhdGVkCisgICAgICAgIC8vIHdoZW4gc2Vla2JhciBpcyBkcmFnZ2VkLgorICAgICAgICBtVmlkZW9EZWNvZGVyLT5zaWduYWxSZXN1bWUobmVlZE5vdGlmeSk7CisgICAgfQorCisgICAgaWYgKG1BdWRpb0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICBtQXVkaW9EZWNvZGVyLT5zaWduYWxSZXN1bWUoZmFsc2UgLyogbmVlZE5vdGlmeSAqLyk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6ZmluaXNoUmVzdW1lKCkgeworICAgIGlmIChtUmVzdW1lUGVuZGluZykgeworICAgICAgICBtUmVzdW1lUGVuZGluZyA9IGZhbHNlOworICAgICAgICBub3RpZnlEcml2ZXJTZWVrQ29tcGxldGUobVNyY0lkKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpub3RpZnlEcml2ZXJTZWVrQ29tcGxldGUoaW50NjRfdCBzcmNJZCkgeworICAgIGlmIChtRHJpdmVyICE9IE5VTEwpIHsKKyAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVNlZWtDb21wbGV0ZShzcmNJZCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpvblNvdXJjZU5vdGlmeShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGludDMyX3Qgd2hhdDsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigid2hhdCIsICZ3aGF0KSk7CisKKyAgICBpbnQ2NF90IHNyY0lkOworICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzcmNJZCIsICZzcmNJZCkpOworICAgIHN3aXRjaCAod2hhdCkgeworICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXRQcmVwYXJlZDoKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR1YoIk51UGxheWVyMjo6b25Tb3VyY2VOb3RpZnkgU291cmNlOjprV2hhdFByZXBhcmVkIHNvdXJjZTogJXAiLCBtU291cmNlLmdldCgpKTsKKyAgICAgICAgICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgc3RhbGUgbm90aWZpY2F0aW9uIGZyb20gYSBzb3VyY2UgdGhhdCB3YXMKKyAgICAgICAgICAgICAgICAvLyBhc3luY2hyb25vdXNseSBwcmVwYXJpbmcgd2hlbiB0aGUgY2xpZW50IGNhbGxlZCByZXNldCgpLgorICAgICAgICAgICAgICAgIC8vIFdlIGhhbmRsZWQgdGhlIHJlc2V0LCB0aGUgc291cmNlIGlzIGdvbmUuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludDMyX3QgZXJyOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIC8vIHNodXQgZG93biBwb3RlbnRpYWwgc2VjdXJlIGNvZGVjcyBpbiBjYXNlIGNsaWVudCBuZXZlciBjYWxscyByZXNldAorICAgICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZsdXNoRGVjb2RlckFjdGlvbihGTFVTSF9DTURfU0hVVERPV04gLyogYXVkaW8gKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMVVNIX0NNRF9TSFVURE9XTiAvKiB2aWRlbyAqLykpOworICAgICAgICAgICAgICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVByZXBhcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIC8vIG5vdGlmeSBkdXJhdGlvbiBmaXJzdCwgc28gdGhhdCBpdCdzIGRlZmluaXRlbHkgc2V0IHdoZW4KKyAgICAgICAgICAgICAgICAvLyB0aGUgYXBwIHJlY2VpdmVkIHRoZSAicHJlcGFyZSBjb21wbGV0ZSIgY2FsbGJhY2suCisgICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgICAgICAgICAgICAgIGlmIChtU291cmNlLT5nZXREdXJhdGlvbigmZHVyYXRpb25VcykgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlEdXJhdGlvbihzcmNJZCwgZHVyYXRpb25Vcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5UHJlcGFyZUNvbXBsZXRlZChzcmNJZCwgZXJyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBNb2R1bGFyIERSTQorICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXREcm1JbmZvOgorICAgICAgICB7CisgICAgICAgICAgICBQYXJjZWwgcGFyY2VsOworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gZHJtSW5mbzsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEJ1ZmZlcigiZHJtSW5mbyIsICZkcm1JbmZvKSk7CisgICAgICAgICAgICBwYXJjZWwuc2V0RGF0YShkcm1JbmZvLT5kYXRhKCksIGRybUluZm8tPnNpemUoKSk7CisKKyAgICAgICAgICAgIEFMT0dWKCJvblNvdXJjZU5vdGlmeSgpIGtXaGF0RHJtSW5mbyBNRURJQTJfRFJNX0lORk8gZHJtSW5mbzogJXAgIHBhcmNlbCBzaXplOiAlenUiLAorICAgICAgICAgICAgICAgICAgICBkcm1JbmZvLmdldCgpLCBwYXJjZWwuZGF0YVNpemUoKSk7CisKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKHNyY0lkLCBNRURJQTJfRFJNX0lORk8sIDAgLyogZXh0MSAqLywgMCAvKiBleHQyICovLCAmcGFyY2VsKTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXRGbGFnc0NoYW5nZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImZsYWdzIiwgKGludDMyX3QgKikmZmxhZ3MpKTsKKworICAgICAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgeworCisgICAgICAgICAgICAgICAgQUxPR1YoIm9uU291cmNlTm90aWZ5KCkga1doYXRGbGFnc0NoYW5nZWQgIEZMQUdfQ0FOX1BBVVNFOiAlZCAgIgorICAgICAgICAgICAgICAgICAgICAgICAgIkZMQUdfQ0FOX1NFRUtfQkFDS1dBUkQ6ICVkIFxuXHRcdFx0XHQgRkxBR19DQU5fU0VFS19GT1JXQVJEOiAlZCAgIgorICAgICAgICAgICAgICAgICAgICAgICAgIkZMQUdfQ0FOX1NFRUs6ICVkICBGTEFHX0RZTkFNSUNfRFVSQVRJT046ICVkIFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIlx0XHRcdFx0IEZMQUdfU0VDVVJFOiAlZCAgRkxBR19QUk9URUNURUQ6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIFNvdXJjZTo6RkxBR19DQU5fUEFVU0UpICE9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBTb3VyY2U6OkZMQUdfQ0FOX1NFRUtfQkFDS1dBUkQpICE9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBTb3VyY2U6OkZMQUdfQ0FOX1NFRUtfRk9SV0FSRCkgIT0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIFNvdXJjZTo6RkxBR19DQU5fU0VFSykgIT0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKSAhPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgU291cmNlOjpGTEFHX1NFQ1VSRSkgIT0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIFNvdXJjZTo6RkxBR19QUk9URUNURUQpICE9IDApOworCisgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmIE51UGxheWVyMjo6U291cmNlOjpGTEFHX0NBTl9TRUVLKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5TGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19OT1RfU0VFS0FCTEUsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUZsYWdzQ2hhbmdlZChzcmNJZCwgZmxhZ3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKQorICAgICAgICAgICAgICAgICAgICAmJiAoIShmbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKSkpIHsKKyAgICAgICAgICAgICAgICBjYW5jZWxQb2xsRHVyYXRpb24oKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIShtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikKKyAgICAgICAgICAgICAgICAgICAgJiYgKGZsYWdzICYgU291cmNlOjpGTEFHX0RZTkFNSUNfRFVSQVRJT04pCisgICAgICAgICAgICAgICAgICAgICYmIChtQXVkaW9EZWNvZGVyICE9IE5VTEwgfHwgbVZpZGVvRGVjb2RlciAhPSBOVUxMKSkgeworICAgICAgICAgICAgICAgIHNjaGVkdWxlUG9sbER1cmF0aW9uKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1Tb3VyY2VGbGFncyA9IGZsYWdzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXRWaWRlb1NpemVDaGFuZ2VkOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpOworCisgICAgICAgICAgICB1cGRhdGVWaWRlb1NpemUoc3JjSWQsIGZvcm1hdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU291cmNlOjprV2hhdEJ1ZmZlcmluZ1VwZGF0ZToKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBwZXJjZW50YWdlOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInBlcmNlbnRhZ2UiLCAmcGVyY2VudGFnZSkpOworCisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihzcmNJZCwgTUVESUEyX0JVRkZFUklOR19VUERBVEUsIHBlcmNlbnRhZ2UsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXRQYXVzZU9uQnVmZmVyaW5nU3RhcnQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZSBpZiBub3QgcGxheWluZworICAgICAgICAgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgICAgICAgICAgQUxPR0koImJ1ZmZlciBsb3csIHBhdXNpbmcuLi4iKTsKKworICAgICAgICAgICAgICAgIHN0YXJ0UmVidWZmZXJpbmdUaW1lcigpOworICAgICAgICAgICAgICAgIG1QYXVzZWRGb3JCdWZmZXJpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIG9uUGF1c2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKHNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fQlVGRkVSSU5HX1NUQVJULCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0UmVzdW1lT25CdWZmZXJpbmdFbmQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZSBpZiBub3QgcGxheWluZworICAgICAgICAgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgICAgICAgICAgQUxPR0koImJ1ZmZlciByZWFkeSwgcmVzdW1pbmcuLi4iKTsKKworICAgICAgICAgICAgICAgIHN0b3BSZWJ1ZmZlcmluZ1RpbWVyKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtUGF1c2VkRm9yQnVmZmVyaW5nID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAvLyBkbyBub3QgcmVzdW1lIHlldCBpZiBjbGllbnQgZGlkbid0IHVucGF1c2UKKyAgICAgICAgICAgICAgICBpZiAoIW1QYXVzZWRCeUNsaWVudCkgeworICAgICAgICAgICAgICAgICAgICBvblJlc3VtZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKHNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fQlVGRkVSSU5HX0VORCwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU291cmNlOjprV2hhdENhY2hlU3RhdHM6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3Qga2JwczsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJiYW5kd2lkdGgiLCAma2JwcykpOworCisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihzcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX05FVFdPUktfQkFORFdJRFRILCBrYnBzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0U3VidGl0bGVEYXRhOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRCdWZmZXIoImJ1ZmZlciIsICZidWZmZXIpKTsKKworICAgICAgICAgICAgc2VuZFN1YnRpdGxlRGF0YShidWZmZXIsIDAgLyogYmFzZUluZGV4ICovKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0VGltZWRNZXRhRGF0YToKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRCdWZmZXIoImJ1ZmZlciIsICZidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoc3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19NRVRBREFUQV9VUERBVEUsIDApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZW5kVGltZWRNZXRhRGF0YShidWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXRUaW1lZFRleHREYXRhOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgJiYgZ2VuZXJhdGlvbiAhPSBtVGltZWRUZXh0R2VuZXJhdGlvbikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRCdWZmZXIoImJ1ZmZlciIsICZidWZmZXIpKTsKKworICAgICAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChkcml2ZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQ2NF90IHBvc01zOworICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMsIHBvc1VzOworICAgICAgICAgICAgZHJpdmVyLT5nZXRDdXJyZW50UG9zaXRpb24oJnBvc01zKTsKKyAgICAgICAgICAgIHBvc1VzID0gcG9zTXMgKiAxMDAwbGw7CisgICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisKKyAgICAgICAgICAgIGlmIChwb3NVcyA8IHRpbWVVcykgeworICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1UaW1lZFRleHRHZW5lcmF0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbXNnLT5wb3N0KHRpbWVVcyAtIHBvc1VzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2VuZFRpbWVkVGV4dERhdGEoYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0UXVldWVEZWNvZGVyU2h1dGRvd246CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgYXVkaW8sIHZpZGVvOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImF1ZGlvIiwgJmF1ZGlvKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigidmlkZW8iLCAmdmlkZW8pKTsKKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgicmVwbHkiLCAmcmVwbHkpKTsKKworICAgICAgICAgICAgcXVldWVEZWNvZGVyU2h1dGRvd24oYXVkaW8sIHZpZGVvLCByZXBseSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU291cmNlOjprV2hhdERybU5vTGljZW5zZToKKyAgICAgICAgeworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoc3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIEVSUk9SX0RSTV9OT19MSUNFTlNFKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6b25DbG9zZWRDYXB0aW9uTm90aWZ5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgaW50MzJfdCB3aGF0OworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aGF0IiwgJndoYXQpKTsKKworICAgIHN3aXRjaCAod2hhdCkgeworICAgICAgICBjYXNlIE51UGxheWVyMjo6Q0NEZWNvZGVyOjprV2hhdENsb3NlZENhcHRpb25EYXRhOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRCdWZmZXIoImJ1ZmZlciIsICZidWZmZXIpKTsKKworICAgICAgICAgICAgc2l6ZV90IGluYmFuZFRyYWNrcyA9IDA7CisgICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZW5kU3VidGl0bGVEYXRhKGJ1ZmZlciwgaW5iYW5kVHJhY2tzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6a1doYXRUcmFja0FkZGVkOgorICAgICAgICB7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19NRVRBREFUQV9VUERBVEUsIDApOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgIH0KKworCit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpzZW5kU3VidGl0bGVEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsIGludDMyX3QgYmFzZUluZGV4KSB7CisgICAgaW50MzJfdCB0cmFja0luZGV4OworICAgIGludDY0X3QgdGltZVVzLCBkdXJhdGlvblVzOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoQU1FRElBRk9STUFUX0tFWV9UUkFDS19JTkRFWCwgJnRyYWNrSW5kZXgpKTsKKyAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgiZHVyYXRpb25VcyIsICZkdXJhdGlvblVzKSk7CisKKyAgICBQYXJjZWwgaW47CisgICAgaW4ud3JpdGVJbnQzMih0cmFja0luZGV4ICsgYmFzZUluZGV4KTsKKyAgICBpbi53cml0ZUludDY0KHRpbWVVcyk7CisgICAgaW4ud3JpdGVJbnQ2NChkdXJhdGlvblVzKTsKKyAgICBpbi53cml0ZUludDMyKGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBpbi53cml0ZUludDMyKGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBpbi53cml0ZShidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworCisgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfU1VCVElUTEVfREFUQSwgMCwgMCwgJmluKTsKK30KKwordm9pZCBOdVBsYXllcjI6OnNlbmRUaW1lZE1ldGFEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisKKyAgICBQYXJjZWwgaW47CisgICAgaW4ud3JpdGVJbnQ2NCh0aW1lVXMpOworICAgIGluLndyaXRlSW50MzIoYnVmZmVyLT5zaXplKCkpOworICAgIGluLndyaXRlSW50MzIoYnVmZmVyLT5zaXplKCkpOworICAgIGluLndyaXRlKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisKKyAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9NRVRBX0RBVEEsIDAsIDAsICZpbik7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpzZW5kVGltZWRUZXh0RGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICBzaXplX3Qgc2l6ZSA9IDA7CisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgaW50MzJfdCBmbGFnID0gVGV4dERlc2NyaXB0aW9uczo6SU5fQkFORF9URVhUXzNHUFA7CisKKyAgICBBU3RyaW5nIG1pbWU7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOworICAgIENIRUNLKHN0cmNhc2VjbXAobWltZS5jX3N0cigpLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApID09IDApOworCisgICAgZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworICAgIHNpemUgPSBidWZmZXItPnNpemUoKTsKKworICAgIFBhcmNlbCBwYXJjZWw7CisgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKyAgICAgICAgaW50MzJfdCBnbG9iYWwgPSAwOworICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZ2xvYmFsIiwgJmdsb2JhbCkgJiYgZ2xvYmFsKSB7CisgICAgICAgICAgICBmbGFnIHw9IFRleHREZXNjcmlwdGlvbnM6OkdMT0JBTF9ERVNDUklQVElPTlM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmbGFnIHw9IFRleHREZXNjcmlwdGlvbnM6OkxPQ0FMX0RFU0NSSVBUSU9OUzsKKyAgICAgICAgfQorICAgICAgICBUZXh0RGVzY3JpcHRpb25zOjpnZXRQYXJjZWxPZkRlc2NyaXB0aW9ucygKKyAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWRhdGEsIHNpemUsIGZsYWcsIHRpbWVVcyAvIDEwMDAsICZwYXJjZWwpOworICAgIH0KKworICAgIGlmICgocGFyY2VsLmRhdGFTaXplKCkgPiAwKSkgeworICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9USU1FRF9URVhULCAwLCAwLCAmcGFyY2VsKTsKKyAgICB9IGVsc2UgeyAgLy8gc2VuZCBhbiBlbXB0eSB0aW1lZCB0ZXh0CisgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1RJTUVEX1RFWFQsIDAsIDApOworICAgIH0KK30KKworY29uc3QgY2hhciAqTnVQbGF5ZXIyOjpnZXREYXRhU291cmNlVHlwZSgpIHsKKyAgICBzd2l0Y2ggKG1EYXRhU291cmNlVHlwZSkgeworICAgICAgICBjYXNlIERBVEFfU09VUkNFX1RZUEVfSFRUUF9MSVZFOgorICAgICAgICAgICAgcmV0dXJuICJIVFRQTGl2ZSI7CisKKyAgICAgICAgY2FzZSBEQVRBX1NPVVJDRV9UWVBFX1JUU1A6CisgICAgICAgICAgICByZXR1cm4gIlJUU1AiOworCisgICAgICAgIGNhc2UgREFUQV9TT1VSQ0VfVFlQRV9HRU5FUklDX1VSTDoKKyAgICAgICAgICAgIHJldHVybiAiR2VuVVJMIjsKKworICAgICAgICBjYXNlIERBVEFfU09VUkNFX1RZUEVfR0VORVJJQ19GRDoKKyAgICAgICAgICAgIHJldHVybiAiR2VuRkQiOworCisgICAgICAgIGNhc2UgREFUQV9TT1VSQ0VfVFlQRV9NRURJQToKKyAgICAgICAgICAgIHJldHVybiAiTWVkaWEiOworCisgICAgICAgIGNhc2UgREFUQV9TT1VSQ0VfVFlQRV9OT05FOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJOb25lIjsKKyAgICB9CisgfQorCisvLyBNb2R1bGFyIERSTSBiZWdpbgorc3RhdHVzX3QgTnVQbGF5ZXIyOjpwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkKQoreworICAgIEFMT0dWKCJwcmVwYXJlRHJtICIpOworCisgICAgLy8gUGFzc2luZyB0byB0aGUgbG9vcGVyIGFueXdheTsgY2FsbGVkIGluIGEgcHJlLWNvbmZpZyBwcmVwYXJlZCBzdGF0ZSBzbyBubyByYWNlIG9uIG1DcnlwdG8KKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UHJlcGFyZURybSwgdGhpcyk7CisgICAgLy8gc3luY2hyb25vdXMgY2FsbCBzbyBqdXN0IHBhc3NpbmcgdGhlIGFkZHJlc3MgYnV0IHdpdGggbG9jYWwgY29waWVzIG9mICJjb25zdCIgYXJncworICAgIHVpbnQ4X3QgVVVJRFsxNl07CisgICAgbWVtY3B5KFVVSUQsIHV1aWQsIHNpemVvZihVVUlEKSk7CisgICAgVmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZCA9IGRybVNlc3Npb25JZDsKKyAgICBtc2ctPnNldFBvaW50ZXIoInV1aWQiLCAodm9pZCopVVVJRCk7CisgICAgbXNnLT5zZXRQb2ludGVyKCJkcm1TZXNzaW9uSWQiLCAodm9pZCopJnNlc3Npb25JZCk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworCisgICAgaWYgKHN0YXR1cyA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoInN0YXR1cyIsICZzdGF0dXMpKTsKKyAgICAgICAgQUxPR1YoInByZXBhcmVEcm0gcmV0OiAlZCAiLCBzdGF0dXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJwcmVwYXJlRHJtIGVycjogJWQiLCBzdGF0dXMpOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6cmVsZWFzZURybSgpCit7CisgICAgQUxPR1YoInJlbGVhc2VEcm0gIik7CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVsZWFzZURybSwgdGhpcyk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworCisgICAgaWYgKHN0YXR1cyA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoInN0YXR1cyIsICZzdGF0dXMpKTsKKyAgICAgICAgQUxPR1YoInJlbGVhc2VEcm0gcmV0OiAlZCAiLCBzdGF0dXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJyZWxlYXNlRHJtIGVycjogJWQiLCBzdGF0dXMpOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6b25QcmVwYXJlRHJtKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKQoreworICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCisgICAgQUxPR0QoIm9uUHJlcGFyZURybSAiKTsKKworICAgIHN0YXR1c190IHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIm9uUHJlcGFyZURybTogTm8gc291cmNlLiBvblByZXBhcmVEcm0gZmFpbGVkIHdpdGggJWQuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB1aW50OF90ICp1dWlkOworICAgIFZlY3Rvcjx1aW50OF90PiAqZHJtU2Vzc2lvbklkOworICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoInV1aWQiLCAodm9pZCoqKSZ1dWlkKSk7CisgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigiZHJtU2Vzc2lvbklkIiwgKHZvaWQqKikmZHJtU2Vzc2lvbklkKSk7CisKKyAgICBzdGF0dXMgPSBPSzsKKyAgICBzcDxBTWVkaWFDcnlwdG9XcmFwcGVyPiBjcnlwdG8gPSBOVUxMOworCisgICAgc3RhdHVzID0gbVNvdXJjZS0+cHJlcGFyZURybSh1dWlkLCAqZHJtU2Vzc2lvbklkLCAmY3J5cHRvKTsKKyAgICBpZiAoY3J5cHRvID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIm9uUHJlcGFyZURybTogbVNvdXJjZS0+cHJlcGFyZURybSBmYWlsZWQuIHN0YXR1czogJWQiLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBBTE9HVigib25QcmVwYXJlRHJtOiBtU291cmNlLT5wcmVwYXJlRHJtIHN1Y2NlZWRlZCIpOworCisgICAgaWYgKG1DcnlwdG8gIT0gTlVMTCkgeworICAgICAgICBBTE9HRSgib25QcmVwYXJlRHJtOiBVbmV4cGVjdGVkLiBBbHJlYWR5IGhhdmluZyBtQ3J5cHRvOiAlcCIsIG1DcnlwdG8uZ2V0KCkpOworICAgICAgICBtQ3J5cHRvLmNsZWFyKCk7CisgICAgfQorCisgICAgbUNyeXB0byA9IGNyeXB0bzsKKyAgICBtSXNEcm1Qcm90ZWN0ZWQgPSB0cnVlOworICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCisgICAgQUxPR0QoIm9uUHJlcGFyZURybTogbUNyeXB0bzogJXAiLCBtQ3J5cHRvLmdldCgpKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6b25SZWxlYXNlRHJtKCkKK3sKKyAgICAvLyBUT0RPIGNoYW5nZSB0byBBTE9HVgorICAgIEFMT0dEKCJvblJlbGVhc2VEcm0gIik7CisKKyAgICBpZiAoIW1Jc0RybVByb3RlY3RlZCkgeworICAgICAgICBBTE9HVygib25SZWxlYXNlRHJtOiBVbmV4cGVjdGVkLiBtSXNEcm1Qcm90ZWN0ZWQgaXMgYWxyZWFkeSBmYWxzZS4iKTsKKyAgICB9CisKKyAgICBtSXNEcm1Qcm90ZWN0ZWQgPSBmYWxzZTsKKworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAobUNyeXB0byAhPSBOVUxMKSB7CisgICAgICAgIC8vIG5vdGlmeWluZyB0aGUgc291cmNlIGZpcnN0IGJlZm9yZSByZW1vdmluZyBjcnlwdG8gZnJvbSBjb2RlYworICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtU291cmNlLT5yZWxlYXNlRHJtKCk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXM9T0s7CisgICAgICAgIC8vIGZpcnN0IG1ha2luZyBzdXJlIHRoZSBjb2RlY3MgaGF2ZSByZWxlYXNlZCB0aGVpciBjcnlwdG8gcmVmZXJlbmNlCisgICAgICAgIGNvbnN0IHNwPERlY29kZXJCYXNlPiAmdmlkZW9EZWNvZGVyID0gZ2V0RGVjb2RlcihmYWxzZS8qYXVkaW8qLyk7CisgICAgICAgIGlmICh2aWRlb0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgc3RhdHVzID0gdmlkZW9EZWNvZGVyLT5yZWxlYXNlQ3J5cHRvKCk7CisgICAgICAgICAgICBBTE9HVigib25SZWxlYXNlRHJtOiB2aWRlbyBkZWNvZGVyIHJldDogJWQiLCBzdGF0dXMpOworICAgICAgICB9CisKKyAgICAgICAgY29uc3Qgc3A8RGVjb2RlckJhc2U+ICZhdWRpb0RlY29kZXIgPSBnZXREZWNvZGVyKHRydWUvKmF1ZGlvKi8pOworICAgICAgICBpZiAoYXVkaW9EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1c19hdWRpbyA9IGF1ZGlvRGVjb2Rlci0+cmVsZWFzZUNyeXB0bygpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgeyAgIC8vIG90aGVyd2lzZSwgcmV0dXJuaW5nIHRoZSBmaXJzdCBlcnJvcgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXR1c19hdWRpbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJvblJlbGVhc2VEcm06IGF1ZGlvIGRlY29kZXIgcmV0OiAlZCIsIHN0YXR1c19hdWRpbyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPIGNoYW5nZSB0byBBTE9HVgorICAgICAgICBBTE9HRCgib25SZWxlYXNlRHJtOiBtQ3J5cHRvOiAlcCIsIG1DcnlwdG8uZ2V0KCkpOworICAgICAgICBtQ3J5cHRvLmNsZWFyKCk7CisgICAgfSBlbHNlIHsgICAvLyBtQ3J5cHRvID09IE5VTEwKKyAgICAgICAgQUxPR0UoIm9uUmVsZWFzZURybTogVW5leHBlY3RlZC4gVGhlcmUgaXMgbm8gY3J5cHRvLiIpOworICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorLy8gTW9kdWxhciBEUk0gZW5kCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzcDxBTWVzc2FnZT4gTnVQbGF5ZXIyOjpTb3VyY2U6OmdldEZvcm1hdChib29sIGF1ZGlvKSB7CisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBnZXRGb3JtYXRNZXRhKGF1ZGlvKTsKKworICAgIGlmIChtZXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZTsKKworICAgIGlmKGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShtZXRhLCAmbXNnKSA9PSBPSykgeworICAgICAgICByZXR1cm4gbXNnOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBOdVBsYXllcjI6OlNvdXJjZTo6bm90aWZ5RmxhZ3NDaGFuZ2VkKHVpbnQzMl90IGZsYWdzKSB7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEZsYWdzQ2hhbmdlZCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigiZmxhZ3MiLCBmbGFncyk7CisgICAgbm90aWZ5LT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpTb3VyY2U6Om5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0VmlkZW9TaXplQ2hhbmdlZCk7CisgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOworICAgIG5vdGlmeS0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6U291cmNlOjpub3RpZnlQcmVwYXJlZChzdGF0dXNfdCBlcnIpIHsKKyAgICBBTE9HVigiU291cmNlOjpub3RpZnlQcmVwYXJlZCAlZCIsIGVycik7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFByZXBhcmVkKTsKKyAgICBub3RpZnktPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgIG5vdGlmeS0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6U291cmNlOjpub3RpZnlEcm1JbmZvKGNvbnN0IHNwPEFCdWZmZXI+ICZkcm1JbmZvQnVmZmVyKQoreworICAgIEFMT0dWKCJTb3VyY2U6Om5vdGlmeURybUluZm8iKTsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXREcm1JbmZvKTsKKyAgICBub3RpZnktPnNldEJ1ZmZlcigiZHJtSW5mbyIsIGRybUluZm9CdWZmZXIpOworCisgICAgbm90aWZ5LT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpTb3VyY2U6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmIC8qIG1zZyAqLykgeworICAgIFRSRVNQQVNTKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMi5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmY4NWY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjIuaApAQCAtMCwwICsxLDM0NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBOVV9QTEFZRVIyX0hfCisKKyNkZWZpbmUgTlVfUExBWUVSMl9IXworCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CisKKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFCdWZmZXI7CitzdHJ1Y3QgQU1lZGlhQ3J5cHRvV3JhcHBlcjsKK3N0cnVjdCBBTWVzc2FnZTsKK3N0cnVjdCBBTmF0aXZlV2luZG93V3JhcHBlcjsKK3N0cnVjdCBBdWRpb1BsYXliYWNrUmF0ZTsKK3N0cnVjdCBBVlN5bmNTZXR0aW5nczsKK3N0cnVjdCBEYXRhU291cmNlRGVzYzsKK3N0cnVjdCBNZWRpYUNsb2NrOworc3RydWN0IE1lZGlhSFRUUFNlcnZpY2U7CitjbGFzcyBNZXRhRGF0YTsKK3N0cnVjdCBOdVBsYXllcjJEcml2ZXI7CisKK3N0cnVjdCBOdVBsYXllcjIgOiBwdWJsaWMgQUhhbmRsZXIgeworICAgIGV4cGxpY2l0IE51UGxheWVyMihwaWRfdCBwaWQsIHVpZF90IHVpZCwgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2spOworCisgICAgdm9pZCBzZXREcml2ZXIoY29uc3Qgd3A8TnVQbGF5ZXIyRHJpdmVyPiAmZHJpdmVyKTsKKworICAgIHZvaWQgc2V0RGF0YVNvdXJjZUFzeW5jKGNvbnN0IHNwPERhdGFTb3VyY2VEZXNjPiAmZHNkKTsKKyAgICB2b2lkIHByZXBhcmVOZXh0RGF0YVNvdXJjZUFzeW5jKGNvbnN0IHNwPERhdGFTb3VyY2VEZXNjPiAmZHNkKTsKKyAgICB2b2lkIHBsYXlOZXh0RGF0YVNvdXJjZShpbnQ2NF90IHNyY0lkKTsKKworICAgIHN0YXR1c190IGdldEJ1ZmZlcmluZ1NldHRpbmdzKEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLyk7CisgICAgc3RhdHVzX3Qgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZyk7CisKKyAgICB2b2lkIHByZXBhcmVBc3luYygpOworCisgICAgdm9pZCBzZXRWaWRlb1N1cmZhY2VUZXh0dXJlQXN5bmMoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZud3cpOworCisgICAgdm9pZCBzZXRBdWRpb1NpbmsoY29uc3Qgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlOjpBdWRpb1Npbms+ICZzaW5rKTsKKyAgICBzdGF0dXNfdCBzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlKTsKKyAgICBzdGF0dXNfdCBnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlIC8qIG5vbm51bGwgKi8pOworICAgIHN0YXR1c190IHNldFN5bmNTZXR0aW5ncyhjb25zdCBBVlN5bmNTZXR0aW5ncyAmc3luYywgZmxvYXQgdmlkZW9GcHNIaW50KTsKKyAgICBzdGF0dXNfdCBnZXRTeW5jU2V0dGluZ3MoQVZTeW5jU2V0dGluZ3MgKnN5bmMgLyogbm9ubnVsbCAqLywgZmxvYXQgKnZpZGVvRnBzIC8qIG5vbm51bGwgKi8pOworCisgICAgdm9pZCBzdGFydCgpOworCisgICAgdm9pZCBwYXVzZSgpOworCisgICAgLy8gV2lsbCBub3RpZnkgdGhlIGRyaXZlciB0aHJvdWdoICJub3RpZnlSZXNldENvbXBsZXRlIiBvbmNlIGZpbmlzaGVkLgorICAgIHZvaWQgcmVzZXRBc3luYygpOworCisgICAgLy8gUmVxdWVzdCBhIG5vdGlmaWNhdGlvbiB3aGVuIHNwZWNpZmllZCBtZWRpYSB0aW1lIGlzIHJlYWNoZWQuCisgICAgc3RhdHVzX3Qgbm90aWZ5QXQoaW50NjRfdCBtZWRpYVRpbWVVcyk7CisKKyAgICAvLyBXaWxsIG5vdGlmeSB0aGUgZHJpdmVyIHRocm91Z2ggIm5vdGlmeVNlZWtDb21wbGV0ZSIgb25jZSBmaW5pc2hlZAorICAgIC8vIGFuZCBuZWVkTm90aWZ5IGlzIHRydWUuCisgICAgdm9pZCBzZWVrVG9Bc3luYygKKyAgICAgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVcywKKyAgICAgICAgICAgIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DLAorICAgICAgICAgICAgYm9vbCBuZWVkTm90aWZ5ID0gZmFsc2UpOworCisgICAgc3RhdHVzX3Qgc2V0VmlkZW9TY2FsaW5nTW9kZShpbnQzMl90IG1vZGUpOworICAgIHN0YXR1c190IGdldFRyYWNrSW5mbyhQYXJjZWwqIHJlcGx5KSBjb25zdDsKKyAgICBzdGF0dXNfdCBnZXRTZWxlY3RlZFRyYWNrKGludDMyX3QgdHlwZSwgUGFyY2VsKiByZXBseSkgY29uc3Q7CisgICAgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0LCBpbnQ2NF90IHRpbWVVcyk7CisgICAgc3RhdHVzX3QgZ2V0Q3VycmVudFBvc2l0aW9uKGludDY0X3QgKm1lZGlhVXMpOworICAgIHZvaWQgZ2V0U3RhdHMoVmVjdG9yPHNwPEFNZXNzYWdlPiA+ICptVHJhY2tTdGF0cyk7CisKKyAgICBzcDxNZXRhRGF0YT4gZ2V0RmlsZU1ldGEoKTsKKyAgICBmbG9hdCBnZXRGcmFtZVJhdGUoKTsKKworICAgIC8vIE1vZHVsYXIgRFJNCisgICAgc3RhdHVzX3QgcHJlcGFyZURybShjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJmRybVNlc3Npb25JZCk7CisgICAgc3RhdHVzX3QgcmVsZWFzZURybSgpOworCisgICAgY29uc3QgY2hhciAqZ2V0RGF0YVNvdXJjZVR5cGUoKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk51UGxheWVyMigpOworCisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworcHVibGljOgorICAgIHN0cnVjdCBTdHJlYW1MaXN0ZW5lcjsKKyAgICBzdHJ1Y3QgU291cmNlOworCitwcml2YXRlOgorICAgIHN0cnVjdCBEZWNvZGVyOworICAgIHN0cnVjdCBEZWNvZGVyQmFzZTsKKyAgICBzdHJ1Y3QgRGVjb2RlclBhc3NUaHJvdWdoOworICAgIHN0cnVjdCBDQ0RlY29kZXI7CisgICAgc3RydWN0IEdlbmVyaWNTb3VyY2UyOworICAgIHN0cnVjdCBIVFRQTGl2ZVNvdXJjZTI7CisgICAgc3RydWN0IFJlbmRlcmVyOworICAgIHN0cnVjdCBSVFNQU291cmNlMjsKKyAgICBzdHJ1Y3QgQWN0aW9uOworICAgIHN0cnVjdCBTZWVrQWN0aW9uOworICAgIHN0cnVjdCBTZXRTdXJmYWNlQWN0aW9uOworICAgIHN0cnVjdCBSZXN1bWVEZWNvZGVyQWN0aW9uOworICAgIHN0cnVjdCBGbHVzaERlY29kZXJBY3Rpb247CisgICAgc3RydWN0IFBvc3RNZXNzYWdlQWN0aW9uOworICAgIHN0cnVjdCBTaW1wbGVBY3Rpb247CisKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRTZXREYXRhU291cmNlICAgICAgICAgICAgICA9ICc9RGFTJywKKyAgICAgICAga1doYXRQcmVwYXJlICAgICAgICAgICAgICAgICAgICA9ICdwcmVwJywKKyAgICAgICAga1doYXRQcmVwYXJlTmV4dERhdGFTb3VyY2UgICAgICA9ICdwTkRTJywKKyAgICAgICAga1doYXRQbGF5TmV4dERhdGFTb3VyY2UgICAgICAgICA9ICdwbE5TJywKKyAgICAgICAga1doYXRTZXRWaWRlb1N1cmZhY2UgICAgICAgICAgICA9ICc9VlN1JywKKyAgICAgICAga1doYXRTZXRBdWRpb1NpbmsgICAgICAgICAgICAgICA9ICc9QXVTJywKKyAgICAgICAga1doYXRNb3JlRGF0YVF1ZXVlZCAgICAgICAgICAgICA9ICdtb3JlJywKKyAgICAgICAga1doYXRDb25maWdQbGF5YmFjayAgICAgICAgICAgICA9ICdjZlBCJywKKyAgICAgICAga1doYXRDb25maWdTeW5jICAgICAgICAgICAgICAgICA9ICdjZlN5JywKKyAgICAgICAga1doYXRHZXRQbGF5YmFja1NldHRpbmdzICAgICAgICA9ICdnUGJTJywKKyAgICAgICAga1doYXRHZXRTeW5jU2V0dGluZ3MgICAgICAgICAgICA9ICdnU3lTJywKKyAgICAgICAga1doYXRTdGFydCAgICAgICAgICAgICAgICAgICAgICA9ICdzdHJ0JywKKyAgICAgICAga1doYXRTY2FuU291cmNlcyAgICAgICAgICAgICAgICA9ICdzY2FuJywKKyAgICAgICAga1doYXRWaWRlb05vdGlmeSAgICAgICAgICAgICAgICA9ICd2aWROJywKKyAgICAgICAga1doYXRBdWRpb05vdGlmeSAgICAgICAgICAgICAgICA9ICdhdWROJywKKyAgICAgICAga1doYXRDbG9zZWRDYXB0aW9uTm90aWZ5ICAgICAgICA9ICdjYXBOJywKKyAgICAgICAga1doYXRSZW5kZXJlck5vdGlmeSAgICAgICAgICAgICA9ICdyZW5OJywKKyAgICAgICAga1doYXRSZXNldCAgICAgICAgICAgICAgICAgICAgICA9ICdyc2V0JywKKyAgICAgICAga1doYXROb3RpZnlUaW1lICAgICAgICAgICAgICAgICA9ICduZnlUJywKKyAgICAgICAga1doYXRTZWVrICAgICAgICAgICAgICAgICAgICAgICA9ICdzZWVrJywKKyAgICAgICAga1doYXRQYXVzZSAgICAgICAgICAgICAgICAgICAgICA9ICdwYXVzJywKKyAgICAgICAga1doYXRSZXN1bWUgICAgICAgICAgICAgICAgICAgICA9ICdyc21lJywKKyAgICAgICAga1doYXRQb2xsRHVyYXRpb24gICAgICAgICAgICAgICA9ICdwb2xEJywKKyAgICAgICAga1doYXRTb3VyY2VOb3RpZnkgICAgICAgICAgICAgICA9ICdzcmNOJywKKyAgICAgICAga1doYXRHZXRUcmFja0luZm8gICAgICAgICAgICAgICA9ICdnVHJJJywKKyAgICAgICAga1doYXRHZXRTZWxlY3RlZFRyYWNrICAgICAgICAgICA9ICdnU2VsJywKKyAgICAgICAga1doYXRTZWxlY3RUcmFjayAgICAgICAgICAgICAgICA9ICdzZWxUJywKKyAgICAgICAga1doYXRHZXRCdWZmZXJpbmdTZXR0aW5ncyAgICAgICA9ICdnQnVzJywKKyAgICAgICAga1doYXRTZXRCdWZmZXJpbmdTZXR0aW5ncyAgICAgICA9ICdzQnVTJywKKyAgICAgICAga1doYXRQcmVwYXJlRHJtICAgICAgICAgICAgICAgICA9ICdwRHJtJywKKyAgICAgICAga1doYXRSZWxlYXNlRHJtICAgICAgICAgICAgICAgICA9ICdyRHJtJywKKyAgICB9OworCisgICAgd3A8TnVQbGF5ZXIyRHJpdmVyPiBtRHJpdmVyOworICAgIHBpZF90IG1QSUQ7CisgICAgdWlkX3QgbVVJRDsKKyAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiBtTWVkaWFDbG9jazsKKyAgICBNdXRleCBtU291cmNlTG9jazsgIC8vIGd1YXJkIHxtU291cmNlfC4KKyAgICBzcDxTb3VyY2U+IG1Tb3VyY2U7CisgICAgaW50NjRfdCBtU3JjSWQ7CisgICAgdWludDMyX3QgbVNvdXJjZUZsYWdzOworICAgIHNwPFNvdXJjZT4gbU5leHRTb3VyY2U7CisgICAgaW50NjRfdCBtTmV4dFNyY0lkOworICAgIHVpbnQzMl90IG1OZXh0U291cmNlRmxhZ3M7CisgICAgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+IG1OYXRpdmVXaW5kb3c7CisgICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlOjpBdWRpb1Npbms+IG1BdWRpb1Npbms7CisgICAgc3A8RGVjb2RlckJhc2U+IG1WaWRlb0RlY29kZXI7CisgICAgYm9vbCBtT2ZmbG9hZEF1ZGlvOworICAgIHNwPERlY29kZXJCYXNlPiBtQXVkaW9EZWNvZGVyOworICAgIHNwPENDRGVjb2Rlcj4gbUNDRGVjb2RlcjsKKyAgICBzcDxSZW5kZXJlcj4gbVJlbmRlcmVyOworICAgIHNwPEFMb29wZXI+IG1SZW5kZXJlckxvb3BlcjsKKyAgICBpbnQzMl90IG1BdWRpb0RlY29kZXJHZW5lcmF0aW9uOworICAgIGludDMyX3QgbVZpZGVvRGVjb2RlckdlbmVyYXRpb247CisgICAgaW50MzJfdCBtUmVuZGVyZXJHZW5lcmF0aW9uOworCisgICAgTXV0ZXggbVBsYXlpbmdUaW1lTG9jazsKKyAgICBpbnQ2NF90IG1MYXN0U3RhcnRlZFBsYXlpbmdUaW1lTnM7CisgICAgdm9pZCBzdG9wUGxheWJhY2tUaW1lcihjb25zdCBjaGFyICp3aGVyZSk7CisgICAgdm9pZCBzdGFydFBsYXliYWNrVGltZXIoY29uc3QgY2hhciAqd2hlcmUpOworCisgICAgaW50NjRfdCBtTGFzdFN0YXJ0ZWRSZWJ1ZmZlcmluZ1RpbWVOczsKKyAgICB2b2lkIHN0YXJ0UmVidWZmZXJpbmdUaW1lcigpOworICAgIHZvaWQgc3RvcFJlYnVmZmVyaW5nVGltZXIoYm9vbCBleGl0aW5nUGxheWJhY2spOworCisgICAgaW50NjRfdCBtUHJldmlvdXNTZWVrVGltZVVzOworCisgICAgTGlzdDxzcDxBY3Rpb24+ID4gbURlZmVycmVkQWN0aW9uczsKKworICAgIGJvb2wgbUF1ZGlvRU9TOworICAgIGJvb2wgbVZpZGVvRU9TOworCisgICAgYm9vbCBtU2NhblNvdXJjZXNQZW5kaW5nOworICAgIGludDMyX3QgbVNjYW5Tb3VyY2VzR2VuZXJhdGlvbjsKKworICAgIGludDMyX3QgbVBvbGxEdXJhdGlvbkdlbmVyYXRpb247CisgICAgaW50MzJfdCBtVGltZWRUZXh0R2VuZXJhdGlvbjsKKworICAgIGVudW0gRmx1c2hTdGF0dXMgeworICAgICAgICBOT05FLAorICAgICAgICBGTFVTSElOR19ERUNPREVSLAorICAgICAgICBGTFVTSElOR19ERUNPREVSX1NIVVRET1dOLAorICAgICAgICBTSFVUVElOR19ET1dOX0RFQ09ERVIsCisgICAgICAgIEZMVVNIRUQsCisgICAgICAgIFNIVVRfRE9XTiwKKyAgICB9OworCisgICAgZW51bSBGbHVzaENvbW1hbmQgeworICAgICAgICBGTFVTSF9DTURfTk9ORSwKKyAgICAgICAgRkxVU0hfQ01EX0ZMVVNILAorICAgICAgICBGTFVTSF9DTURfU0hVVERPV04sCisgICAgfTsKKworICAgIC8vIFN0YXR1cyBvZiBmbHVzaCByZXNwb25zZXMgZnJvbSB0aGUgZGVjb2RlciBhbmQgcmVuZGVyZXIuCisgICAgYm9vbCBtRmx1c2hDb21wbGV0ZVsyXVsyXTsKKworICAgIEZsdXNoU3RhdHVzIG1GbHVzaGluZ0F1ZGlvOworICAgIEZsdXNoU3RhdHVzIG1GbHVzaGluZ1ZpZGVvOworCisgICAgLy8gU3RhdHVzIG9mIGZsdXNoIHJlc3BvbnNlcyBmcm9tIHRoZSBkZWNvZGVyIGFuZCByZW5kZXJlci4KKyAgICBib29sIG1SZXN1bWVQZW5kaW5nOworCisgICAgaW50MzJfdCBtVmlkZW9TY2FsaW5nTW9kZTsKKworICAgIEF1ZGlvUGxheWJhY2tSYXRlIG1QbGF5YmFja1NldHRpbmdzOworICAgIEFWU3luY1NldHRpbmdzIG1TeW5jU2V0dGluZ3M7CisgICAgZmxvYXQgbVZpZGVvRnBzSGludDsKKyAgICBib29sIG1TdGFydGVkOworICAgIGJvb2wgbVByZXBhcmVkOworICAgIGJvb2wgbVJlc2V0dGluZzsKKyAgICBib29sIG1Tb3VyY2VTdGFydGVkOworICAgIGJvb2wgbUF1ZGlvRGVjb2RlckVycm9yOworICAgIGJvb2wgbVZpZGVvRGVjb2RlckVycm9yOworCisgICAgLy8gQWN0dWFsIHBhdXNlIHN0YXRlLCBlaXRoZXIgYXMgcmVxdWVzdGVkIGJ5IGNsaWVudCBvciBkdWUgdG8gYnVmZmVyaW5nLgorICAgIGJvb2wgbVBhdXNlZDsKKworICAgIC8vIFBhdXNlIHN0YXRlIGFzIHJlcXVlc3RlZCBieSBjbGllbnQuIE5vdGUgdGhhdCBpZiBtUGF1c2VkQnlDbGllbnQgaXMKKyAgICAvLyB0cnVlLCBtUGF1c2VkIGlzIGFsd2F5cyB0cnVlOyBpZiBtUGF1c2VkQnlDbGllbnQgaXMgZmFsc2UsIG1QYXVzZWQgY291bGQKKyAgICAvLyBzdGlsbCBiZWNvbWUgdHJ1ZSwgd2hlbiB3ZSBwYXVzZSBpbnRlcm5hbGx5IGR1ZSB0byBidWZmZXJpbmcuCisgICAgYm9vbCBtUGF1c2VkQnlDbGllbnQ7CisKKyAgICAvLyBQYXVzZSBzdGF0ZSBhcyByZXF1ZXN0ZWQgYnkgc291cmNlIChpbnRlcm5hbGx5KSBkdWUgdG8gYnVmZmVyaW5nCisgICAgYm9vbCBtUGF1c2VkRm9yQnVmZmVyaW5nOworCisgICAgLy8gTW9kdWxhciBEUk0KKyAgICBzcDxBTWVkaWFDcnlwdG9XcmFwcGVyPiBtQ3J5cHRvOworICAgIGJvb2wgbUlzRHJtUHJvdGVjdGVkOworCisgICAgdHlwZWRlZiBlbnVtIHsKKyAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9OT05FLAorICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX0hUVFBfTElWRSwKKyAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9SVFNQLAorICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX0dFTkVSSUNfVVJMLAorICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX0dFTkVSSUNfRkQsCisgICAgICAgIERBVEFfU09VUkNFX1RZUEVfTUVESUEsCisgICAgfSBEQVRBX1NPVVJDRV9UWVBFOworCisgICAgc3RkOjphdG9taWM8REFUQV9TT1VSQ0VfVFlQRT4gbURhdGFTb3VyY2VUeXBlOworICAgIHN0ZDo6YXRvbWljPERBVEFfU09VUkNFX1RZUEU+IG1OZXh0RGF0YVNvdXJjZVR5cGU7CisKKyAgICBpbmxpbmUgY29uc3Qgc3A8RGVjb2RlckJhc2U+ICZnZXREZWNvZGVyKGJvb2wgYXVkaW8pIHsKKyAgICAgICAgcmV0dXJuIGF1ZGlvID8gbUF1ZGlvRGVjb2RlciA6IG1WaWRlb0RlY29kZXI7CisgICAgfQorCisgICAgaW5saW5lIHZvaWQgY2xlYXJGbHVzaENvbXBsZXRlKCkgeworICAgICAgICBtRmx1c2hDb21wbGV0ZVswXVswXSA9IGZhbHNlOworICAgICAgICBtRmx1c2hDb21wbGV0ZVswXVsxXSA9IGZhbHNlOworICAgICAgICBtRmx1c2hDb21wbGV0ZVsxXVswXSA9IGZhbHNlOworICAgICAgICBtRmx1c2hDb21wbGV0ZVsxXVsxXSA9IGZhbHNlOworICAgIH0KKworICAgIHZvaWQgZGlzY29ubmVjdFNvdXJjZSgpOworCisgICAgc3RhdHVzX3QgY3JlYXRlTnVQbGF5ZXIyU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2VEZXNjPiAmZHNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxTb3VyY2U+ICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEFfU09VUkNFX1RZUEUgKmRhdGFTb3VyY2VUeXBlKTsKKworICAgIHZvaWQgdHJ5T3BlbkF1ZGlvU2lua0Zvck9mZmxvYWQoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgY29uc3Qgc3A8TWV0YURhdGE+ICZhdWRpb01ldGEsIGJvb2wgaGFzVmlkZW8pOworICAgIHZvaWQgY2xvc2VBdWRpb1NpbmsoKTsKKyAgICB2b2lkIHJlc3RhcnRBdWRpbygKKyAgICAgICAgICAgIGludDY0X3QgY3VycmVudFBvc2l0aW9uVXMsIGJvb2wgZm9yY2VOb25PZmZsb2FkLCBib29sIG5lZWRzVG9DcmVhdGVBdWRpb0RlY29kZXIpOworICAgIHZvaWQgZGV0ZXJtaW5lQXVkaW9Nb2RlQ2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmYXVkaW9Gb3JtYXQpOworCisgICAgc3RhdHVzX3QgaW5zdGFudGlhdGVEZWNvZGVyKAorICAgICAgICAgICAgYm9vbCBhdWRpbywgc3A8RGVjb2RlckJhc2U+ICpkZWNvZGVyLCBib29sIGNoZWNrQXVkaW9Nb2RlQ2hhbmdlID0gdHJ1ZSk7CisKKyAgICB2b2lkIHVwZGF0ZVZpZGVvU2l6ZSgKKyAgICAgICAgICAgIGludDY0X3Qgc3JjSWQsCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmlucHV0Rm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQgPSBOVUxMKTsKKworICAgIHZvaWQgbm90aWZ5TGlzdGVuZXIoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKmluID0gTlVMTCk7CisKKyAgICB2b2lkIGhhbmRsZUZsdXNoQ29tcGxldGUoYm9vbCBhdWRpbywgYm9vbCBpc0RlY29kZXIpOworICAgIHZvaWQgZmluaXNoRmx1c2hJZlBvc3NpYmxlKCk7CisKKyAgICB2b2lkIG9uU3RhcnQoKTsKKyAgICB2b2lkIG9uUmVzdW1lKCk7CisgICAgdm9pZCBvblBhdXNlKCk7CisKKyAgICBib29sIGF1ZGlvRGVjb2RlclN0aWxsTmVlZGVkKCk7CisKKyAgICB2b2lkIGZsdXNoRGVjb2Rlcihib29sIGF1ZGlvLCBib29sIG5lZWRTaHV0ZG93bik7CisKKyAgICB2b2lkIGZpbmlzaFJlc3VtZSgpOworICAgIHZvaWQgbm90aWZ5RHJpdmVyU2Vla0NvbXBsZXRlKGludDY0X3Qgc3JjSWQpOworCisgICAgdm9pZCBwb3N0U2NhblNvdXJjZXMoKTsKKworICAgIHZvaWQgc2NoZWR1bGVQb2xsRHVyYXRpb24oKTsKKyAgICB2b2lkIGNhbmNlbFBvbGxEdXJhdGlvbigpOworCisgICAgdm9pZCBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7CisKKyAgICB2b2lkIHBlcmZvcm1TZWVrKGludDY0X3Qgc2Vla1RpbWVVcywgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSk7CisgICAgdm9pZCBwZXJmb3JtRGVjb2RlckZsdXNoKEZsdXNoQ29tbWFuZCBhdWRpbywgRmx1c2hDb21tYW5kIHZpZGVvKTsKKyAgICB2b2lkIHBlcmZvcm1SZXNldCgpOworICAgIHZvaWQgcGVyZm9ybVBsYXlOZXh0RGF0YVNvdXJjZSgpOworICAgIHZvaWQgcGVyZm9ybVNjYW5Tb3VyY2VzKCk7CisgICAgdm9pZCBwZXJmb3JtU2V0U3VyZmFjZShjb25zdCBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gJm53KTsKKyAgICB2b2lkIHBlcmZvcm1SZXN1bWVEZWNvZGVycyhib29sIG5lZWROb3RpZnkpOworCisgICAgdm9pZCBvblNvdXJjZU5vdGlmeShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBvbkNsb3NlZENhcHRpb25Ob3RpZnkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCisgICAgdm9pZCBxdWV1ZURlY29kZXJTaHV0ZG93bigKKyAgICAgICAgICAgIGJvb2wgYXVkaW8sIGJvb2wgdmlkZW8sIGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVwbHkpOworCisgICAgdm9pZCBzZW5kU3VidGl0bGVEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsIGludDMyX3QgYmFzZUluZGV4KTsKKyAgICB2b2lkIHNlbmRUaW1lZE1ldGFEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworICAgIHZvaWQgc2VuZFRpbWVkVGV4dERhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisKKyAgICB2b2lkIHdyaXRlVHJhY2tJbmZvKFBhcmNlbCogcmVwbHksIGNvbnN0IHNwPEFNZXNzYWdlPiYgZm9ybWF0KSBjb25zdDsKKworICAgIHN0YXR1c190IG9uUHJlcGFyZURybShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgc3RhdHVzX3Qgb25SZWxlYXNlRHJtKCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhOdVBsYXllcjIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBOVV9QTEFZRVIyX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkNDRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkNDRGVjb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ4ZTM4OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyQ0NEZWNvZGVyLmNwcApAQCAtMCwwICsxLDU4MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOdVBsYXllcjJDQ0RlY29kZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgIk51UGxheWVyMkNDRGVjb2Rlci5oIgorCisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEluIENFQS03MDhCLCB0aGUgbWF4aW11bSBiYW5kd2lkdGggb2YgQ0MgaXMgc2V0IHRvIDk2MDBicHMuCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhCYW5kd2l0aFNpemVCeXRlcyA9IDk2MDAgLyA4OworCitzdHJ1Y3QgQ0NEYXRhIHsKKyAgICBDQ0RhdGEodWludDhfdCB0eXBlLCB1aW50OF90IGRhdGExLCB1aW50OF90IGRhdGEyKQorICAgICAgICA6IG1UeXBlKHR5cGUpLCBtRGF0YTEoZGF0YTEpLCBtRGF0YTIoZGF0YTIpIHsKKyAgICB9CisgICAgYm9vbCBnZXRDaGFubmVsKHNpemVfdCAqY2hhbm5lbCkgY29uc3QgeworICAgICAgICBpZiAobURhdGExID49IDB4MTAgJiYgbURhdGExIDw9IDB4MWYpIHsKKyAgICAgICAgICAgICpjaGFubmVsID0gKG1EYXRhMSA+PSAweDE4ID8gMSA6IDApICsgKG1UeXBlID8gMiA6IDApOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQ4X3QgbVR5cGU7CisgICAgdWludDhfdCBtRGF0YTE7CisgICAgdWludDhfdCBtRGF0YTI7Cit9OworCitzdGF0aWMgYm9vbCBpc051bGxQYWQoQ0NEYXRhICpjYykgeworICAgIHJldHVybiBjYy0+bURhdGExIDwgMHgxMCAmJiBjYy0+bURhdGEyIDwgMHgxMDsKK30KKworc3RhdGljIHZvaWQgZHVtcEJ5dGVQYWlyKGNvbnN0IHNwPEFCdWZmZXI+ICZjY0J1ZikgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpOworc3RhdGljIHZvaWQgZHVtcEJ5dGVQYWlyKGNvbnN0IHNwPEFCdWZmZXI+ICZjY0J1ZikgeworICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgIEFTdHJpbmcgb3V0OworCisgICAgd2hpbGUgKG9mZnNldCA8IGNjQnVmLT5zaXplKCkpIHsKKyAgICAgICAgY2hhciB0bXBbMTI4XTsKKworICAgICAgICBDQ0RhdGEgKmNjID0gKENDRGF0YSAqKSAoY2NCdWYtPmRhdGEoKSArIG9mZnNldCk7CisKKyAgICAgICAgaWYgKGlzTnVsbFBhZChjYykpIHsKKyAgICAgICAgICAgIC8vIDEgbnVsbCBwYWQgb3IgWERTIG1ldGFkYXRhLCBpZ25vcmUKKyAgICAgICAgICAgIG9mZnNldCArPSBzaXplb2YoQ0NEYXRhKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNjLT5tRGF0YTEgPj0gMHgyMCAmJiBjYy0+bURhdGExIDw9IDB4N2YpIHsKKyAgICAgICAgICAgIC8vIDIgYmFzaWMgY2hhcnMKKyAgICAgICAgICAgIHNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICJbJWRdQmFzaWM6ICVjICVjIiwgY2MtPm1UeXBlLCBjYy0+bURhdGExLCBjYy0+bURhdGEyKTsKKyAgICAgICAgfSBlbHNlIGlmICgoY2MtPm1EYXRhMSA9PSAweDExIHx8IGNjLT5tRGF0YTEgPT0gMHgxOSkKKyAgICAgICAgICAgICAgICAgJiYgY2MtPm1EYXRhMiA+PSAweDMwICYmIGNjLT5tRGF0YTIgPD0gMHgzZikgeworICAgICAgICAgICAgLy8gMSBzcGVjaWFsIGNoYXIKKyAgICAgICAgICAgIHNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICJbJWRdU3BlY2lhbDogJTAyeCAlMDJ4IiwgY2MtPm1UeXBlLCBjYy0+bURhdGExLCBjYy0+bURhdGEyKTsKKyAgICAgICAgfSBlbHNlIGlmICgoY2MtPm1EYXRhMSA9PSAweDEyIHx8IGNjLT5tRGF0YTEgPT0gMHgxQSkKKyAgICAgICAgICAgICAgICAgJiYgY2MtPm1EYXRhMiA+PSAweDIwICYmIGNjLT5tRGF0YTIgPD0gMHgzZil7CisgICAgICAgICAgICAvLyAxIFNwYW5pc2gvRnJlbmNoIGNoYXIKKyAgICAgICAgICAgIHNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICJbJWRdU3BhbmlzaDogJTAyeCAlMDJ4IiwgY2MtPm1UeXBlLCBjYy0+bURhdGExLCBjYy0+bURhdGEyKTsKKyAgICAgICAgfSBlbHNlIGlmICgoY2MtPm1EYXRhMSA9PSAweDEzIHx8IGNjLT5tRGF0YTEgPT0gMHgxQikKKyAgICAgICAgICAgICAgICAgJiYgY2MtPm1EYXRhMiA+PSAweDIwICYmIGNjLT5tRGF0YTIgPD0gMHgzZil7CisgICAgICAgICAgICAvLyAxIFBvcnR1Z3Vlc2UvR2VybWFuL0RhbmlzaCBjaGFyCisgICAgICAgICAgICBzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiWyVkXUdlcm1hbjogJTAyeCAlMDJ4IiwgY2MtPm1UeXBlLCBjYy0+bURhdGExLCBjYy0+bURhdGEyKTsKKyAgICAgICAgfSBlbHNlIGlmICgoY2MtPm1EYXRhMSA9PSAweDExIHx8IGNjLT5tRGF0YTEgPT0gMHgxOSkKKyAgICAgICAgICAgICAgICAgJiYgY2MtPm1EYXRhMiA+PSAweDIwICYmIGNjLT5tRGF0YTIgPD0gMHgyZil7CisgICAgICAgICAgICAvLyBNaWQtUm93IENvZGVzIChUYWJsZSA2OSkKKyAgICAgICAgICAgIHNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICJbJWRdTWlkLXJvdzogJTAyeCAlMDJ4IiwgY2MtPm1UeXBlLCBjYy0+bURhdGExLCBjYy0+bURhdGEyKTsKKyAgICAgICAgfSBlbHNlIGlmICgoKGNjLT5tRGF0YTEgPT0gMHgxNCB8fCBjYy0+bURhdGExID09IDB4MWMpCisgICAgICAgICAgICAgICAgICAmJiBjYy0+bURhdGEyID49IDB4MjAgJiYgY2MtPm1EYXRhMiA8PSAweDJmKQorICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgICAgICAgICAoKGNjLT5tRGF0YTEgPT0gMHgxNyB8fCBjYy0+bURhdGExID09IDB4MWYpCisgICAgICAgICAgICAgICAgICAmJiBjYy0+bURhdGEyID49IDB4MjEgJiYgY2MtPm1EYXRhMiA8PSAweDIzKSl7CisgICAgICAgICAgICAvLyBNaXNjIENvbnRyb2wgQ29kZXMgKFRhYmxlIDcwKQorICAgICAgICAgICAgc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgIlslZF1DdHJsOiAlMDJ4ICUwMngiLCBjYy0+bVR5cGUsIGNjLT5tRGF0YTEsIGNjLT5tRGF0YTIpOworICAgICAgICB9IGVsc2UgaWYgKChjYy0+bURhdGExICYgMHg3MCkgPT0gMHgxMAorICAgICAgICAgICAgICAgICYmIChjYy0+bURhdGEyICYgMHg0MCkgPT0gMHg0MAorICAgICAgICAgICAgICAgICYmICgoY2MtPm1EYXRhMSAmIDB4MDcpIHx8ICEoY2MtPm1EYXRhMiAmIDB4MjApKSApIHsKKyAgICAgICAgICAgIC8vIFByZWFtYmxlIEFkZHJlc3MgQ29kZXMgKFRhYmxlIDcxKQorICAgICAgICAgICAgc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgIlslZF1QQUM6ICUwMnggJTAyeCIsIGNjLT5tVHlwZSwgY2MtPm1EYXRhMSwgY2MtPm1EYXRhMik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiWyVkXUludmFsaWQ6ICUwMnggJTAyeCIsIGNjLT5tVHlwZSwgY2MtPm1EYXRhMSwgY2MtPm1EYXRhMik7CisgICAgICAgIH0KKworICAgICAgICBpZiAob3V0LnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIG91dC5hcHBlbmQoIiwgIik7CisgICAgICAgIH0KKworICAgICAgICBvdXQuYXBwZW5kKHRtcCk7CisKKyAgICAgICAgb2Zmc2V0ICs9IHNpemVvZihDQ0RhdGEpOworICAgIH0KKworICAgIEFMT0dJKCIlcyIsIG91dC5jX3N0cigpKTsKK30KKworTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OkNDRGVjb2Rlcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSkKKyAgICA6IG1Ob3RpZnkobm90aWZ5KSwKKyAgICAgIG1TZWxlY3RlZFRyYWNrKC0xKSwKKyAgICAgIG1EVFZDQ1BhY2tldChuZXcgQUJ1ZmZlcihrTWF4QmFuZHdpdGhTaXplQnl0ZXMpKSB7CisgICAgbURUVkNDUGFja2V0LT5zZXRSYW5nZSgwLCAwKTsKKworICAgIC8vIEluIENFQS02MDgsIHN0cmVhbXMgZnJvbSBwYWNrZXRzIHdoaWNoIGhhdmUgdGhlIHZhbHVlIDAgb2YgY2NfdHlwZSBjb250YWluIENDMSBhbmQgQ0MyLCBhbmQKKyAgICAvLyBzdHJlYW1zIGZyb20gcGFja2V0cyB3aGljaCBoYXZlIHRoZSB2YWx1ZSAxIG9mIGNjX3R5cGUgY29udGFpbiBDQzMgYW5kIENDNC4KKyAgICAvLyBUaGUgZm9sbG93aW5nIGFycmF5IGluZGljYXRlcyB0aGUgY3VycmVudCB0cmFuc21pdHRpbmcgY2hhbm5lbHMgZm9yIGVhY2ggdmFsdWUgb2YgY2NfdHlwZS4KKyAgICBtTGluZTIxQ2hhbm5lbHNbMF0gPSAwOyAvLyBDQzEKKyAgICBtTGluZTIxQ2hhbm5lbHNbMV0gPSAyOyAvLyBDQzMKK30KKworc2l6ZV90IE51UGxheWVyMjo6Q0NEZWNvZGVyOjpnZXRUcmFja0NvdW50KCkgY29uc3QgeworICAgIHJldHVybiBtVHJhY2tzLnNpemUoKTsKK30KKworc3A8QU1lc3NhZ2U+IE51UGxheWVyMjo6Q0NEZWNvZGVyOjpnZXRUcmFja0luZm8oc2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgaWYgKCFpc1RyYWNrVmFsaWQoaW5kZXgpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKKworICAgIENDVHJhY2sgdHJhY2sgPSBtVHJhY2tzW2luZGV4XTsKKworICAgIGZvcm1hdC0+c2V0SW50MzIoInR5cGUiLCBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFKTsKKyAgICBmb3JtYXQtPnNldFN0cmluZygibGFuZ3VhZ2UiLCAidW5kIik7CisKKyAgICBzd2l0Y2ggKHRyYWNrLm1UcmFja1R5cGUpIHsKKyAgICAgICAgY2FzZSBrVHJhY2tUeXBlQ0VBNjA4OgorICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9URVhUX0NFQV82MDgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga1RyYWNrVHlwZUNFQTcwODoKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfVEVYVF9DRUFfNzA4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIlVua25vd24gdHJhY2sgdHlwZTogJWQiLCB0cmFjay5tVHJhY2tUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIEZvciBDRUEtNjA4IENDMSwgZmllbGQgMCBjaGFubmVsIDAKKyAgICBib29sIGlzRGVmYXVsdEF1dG8gPSB0cmFjay5tVHJhY2tUeXBlID09IGtUcmFja1R5cGVDRUE2MDgKKyAgICAgICAgICAgICYmIHRyYWNrLm1UcmFja0NoYW5uZWwgPT0gMDsKKyAgICAvLyBGb3IgQ0VBLTcwOCwgUHJpbWFyeSBDYXB0aW9uIFNlcnZpY2UuCisgICAgYm9vbCBpc0RlZmF1bHRPbmx5ID0gdHJhY2subVRyYWNrVHlwZSA9PSBrVHJhY2tUeXBlQ0VBNzA4CisgICAgICAgICAgICAmJiB0cmFjay5tVHJhY2tDaGFubmVsID09IDE7CisgICAgZm9ybWF0LT5zZXRJbnQzMigiYXV0byIsIGlzRGVmYXVsdEF1dG8pOworICAgIGZvcm1hdC0+c2V0SW50MzIoImRlZmF1bHQiLCBpc0RlZmF1bHRBdXRvIHx8IGlzRGVmYXVsdE9ubHkpOworICAgIGZvcm1hdC0+c2V0SW50MzIoImZvcmNlZCIsIDApOworCisgICAgcmV0dXJuIGZvcm1hdDsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OnNlbGVjdFRyYWNrKHNpemVfdCBpbmRleCwgYm9vbCBzZWxlY3QpIHsKKyAgICBpZiAoIWlzVHJhY2tWYWxpZChpbmRleCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoc2VsZWN0KSB7CisgICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayA9PSAoc3NpemVfdClpbmRleCkgeworICAgICAgICAgICAgQUxPR0UoInRyYWNrICV6dSBhbHJlYWR5IHNlbGVjdGVkIiwgaW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigic2VsZWN0ZWQgdHJhY2sgJXp1IiwgaW5kZXgpOworICAgICAgICBtU2VsZWN0ZWRUcmFjayA9IGluZGV4OworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayAhPSAoc3NpemVfdClpbmRleCkgeworICAgICAgICAgICAgQUxPR0UoInRyYWNrICV6dSBpcyBub3Qgc2VsZWN0ZWQiLCBpbmRleCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJ1bnNlbGVjdGVkIHRyYWNrICV6dSIsIGluZGV4KTsKKyAgICAgICAgbVNlbGVjdGVkVHJhY2sgPSAtMTsKKyAgICB9CisKKyAgICAvLyBDbGVhciB0aGUgcHJldmlvdXMgdHJhY2sgcGF5bG9hZHMKKyAgICBtQ0NNYXAuY2xlYXIoKTsKKworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6aXNTZWxlY3RlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVNlbGVjdGVkVHJhY2sgPj0gMCAmJiBtU2VsZWN0ZWRUcmFjayA8IChpbnQzMl90KWdldFRyYWNrQ291bnQoKTsKK30KKworYm9vbCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6aXNUcmFja1ZhbGlkKHNpemVfdCBpbmRleCkgY29uc3QgeworICAgIHJldHVybiBpbmRleCA8IGdldFRyYWNrQ291bnQoKTsKK30KKworLy8gcmV0dXJucyB0cnVlIGlmIGEgbmV3IENDIHRyYWNrIGlzIGZvdW5kCitib29sIE51UGxheWVyMjo6Q0NEZWNvZGVyOjpleHRyYWN0RnJvbVNFSShjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCkgeworICAgIHNwPEFCdWZmZXI+IHNlaTsKKyAgICBpZiAoIWFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEJ1ZmZlcigic2VpIiwgJnNlaSkgfHwgc2VpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisKKyAgICBib29sIHRyYWNrQWRkZWQgPSBmYWxzZTsKKworICAgIGNvbnN0IE5BTFBvc2l0aW9uICpuYWwgPSAoTkFMUG9zaXRpb24gKilzZWktPmRhdGEoKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2VpLT5zaXplKCkgLyBzaXplb2YoTkFMUG9zaXRpb24pOyArK2ksICsrbmFsKSB7CisgICAgICAgIHRyYWNrQWRkZWQgfD0gcGFyc2VTRUlOYWxVbml0KAorICAgICAgICAgICAgICAgIHRpbWVVcywgYWNjZXNzVW5pdC0+ZGF0YSgpICsgbmFsLT5uYWxPZmZzZXQsIG5hbC0+bmFsU2l6ZSk7CisgICAgfQorCisgICAgcmV0dXJuIHRyYWNrQWRkZWQ7Cit9CisKKy8vIHJldHVybnMgdHJ1ZSBpZiBhIG5ldyBDQyB0cmFjayBpcyBmb3VuZAorYm9vbCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6cGFyc2VTRUlOYWxVbml0KGludDY0X3QgdGltZVVzLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIHVuc2lnbmVkIG5hbFR5cGUgPSBkYXRhWzBdICYgMHgxZjsKKworICAgIC8vIHRoZSBidWZmZXIgc2hvdWxkIG9ubHkgaGF2ZSBTRUkgaW4gaXQKKyAgICBpZiAobmFsVHlwZSAhPSA2KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIHRyYWNrQWRkZWQgPSBmYWxzZTsKKyAgICBOQUxCaXRSZWFkZXIgYnIoZGF0YSArIDEsIHNpemUgLSAxKTsKKworICAgIC8vIHNlaV9tZXNzYWdlKCkKKyAgICB3aGlsZSAoYnIuYXRMZWFzdE51bUJpdHNMZWZ0KDE2KSkgeyAvLyBhdCBsZWFzdCAxNi1iaXQgZm9yIHNlaV9tZXNzYWdlKCkKKyAgICAgICAgdWludDMyX3QgcGF5bG9hZF90eXBlID0gMDsKKyAgICAgICAgc2l6ZV90IHBheWxvYWRfc2l6ZSA9IDA7CisgICAgICAgIHVpbnQ4X3QgbGFzdF9ieXRlOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGxhc3RfYnl0ZSA9IGJyLmdldEJpdHMoOCk7CisgICAgICAgICAgICBwYXlsb2FkX3R5cGUgKz0gbGFzdF9ieXRlOworICAgICAgICB9IHdoaWxlIChsYXN0X2J5dGUgPT0gMHhGRik7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgbGFzdF9ieXRlID0gYnIuZ2V0Qml0cyg4KTsKKyAgICAgICAgICAgIHBheWxvYWRfc2l6ZSArPSBsYXN0X2J5dGU7CisgICAgICAgIH0gd2hpbGUgKGxhc3RfYnl0ZSA9PSAweEZGKTsKKworICAgICAgICBpZiAocGF5bG9hZF9zaXplID4gU0laRV9NQVggLyA4CisgICAgICAgICAgICAgICAgfHwgIWJyLmF0TGVhc3ROdW1CaXRzTGVmdChwYXlsb2FkX3NpemUgKiA4KSkgeworICAgICAgICAgICAgQUxPR1YoIk1hbGZvcm1lZCBTRUkgcGF5bG9hZCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBzZWlfcGF5bG9hZCgpCisgICAgICAgIGlmIChwYXlsb2FkX3R5cGUgPT0gNCkgeworICAgICAgICAgICAgYm9vbCBpc0NDID0gZmFsc2U7CisgICAgICAgICAgICBpZiAocGF5bG9hZF9zaXplID4gMSArIDIgKyA0ICsgMSkgeworICAgICAgICAgICAgICAgIC8vIHVzZXJfZGF0YV9yZWdpc3RlcmVkX2l0dV90X3QzNSgpCisKKyAgICAgICAgICAgICAgICAvLyBBVFNDIEEvNzI6IDYuNC4yCisgICAgICAgICAgICAgICAgdWludDhfdCBpdHVfdF90MzVfY291bnRyeV9jb2RlID0gYnIuZ2V0Qml0cyg4KTsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpdHVfdF90MzVfcHJvdmlkZXJfY29kZSA9IGJyLmdldEJpdHMoMTYpOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHVzZXJfaWRlbnRpZmllciA9IGJyLmdldEJpdHMoMzIpOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgdXNlcl9kYXRhX3R5cGVfY29kZSA9IGJyLmdldEJpdHMoOCk7CisKKyAgICAgICAgICAgICAgICBwYXlsb2FkX3NpemUgLT0gMSArIDIgKyA0ICsgMTsKKworICAgICAgICAgICAgICAgIGlzQ0MgPSBpdHVfdF90MzVfY291bnRyeV9jb2RlID09IDB4QjUKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGl0dV90X3QzNV9wcm92aWRlcl9jb2RlID09IDB4MDAzMQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgdXNlcl9pZGVudGlmaWVyID09ICdHQTk0JworICAgICAgICAgICAgICAgICAgICAgICAgJiYgdXNlcl9kYXRhX3R5cGVfY29kZSA9PSAweDM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpc0NDICYmIHBheWxvYWRfc2l6ZSA+IDIpIHsKKyAgICAgICAgICAgICAgICB0cmFja0FkZGVkIHw9IHBhcnNlTVBFR0NDRGF0YSh0aW1lVXMsIGJyLmRhdGEoKSwgYnIubnVtQml0c0xlZnQoKSAvIDgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiTWFsZm9ybWVkIFNFSSBwYXlsb2FkIHR5cGUgNCIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoIlVuc3VwcG9ydGVkIFNFSSBwYXlsb2FkIHR5cGUgJWQiLCBwYXlsb2FkX3R5cGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2tpcHBpbmcgcmVtYWluaW5nIGJpdHMgb2YgdGhpcyBwYXlsb2FkCisgICAgICAgIGJyLnNraXBCaXRzKHBheWxvYWRfc2l6ZSAqIDgpOworICAgIH0KKworICAgIHJldHVybiB0cmFja0FkZGVkOworfQorCisvLyByZXR1cm5zIHRydWUgaWYgYSBuZXcgQ0MgdHJhY2sgaXMgZm91bmQKK2Jvb2wgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OmV4dHJhY3RGcm9tTVBFR1VzZXJEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KSB7CisgICAgc3A8QUJ1ZmZlcj4gbXBlZ1VzZXJEYXRhOworICAgIGlmICghYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kQnVmZmVyKEFNRURJQUZPUk1BVF9LRVlfTVBFR19VU0VSX0RBVEEsICZtcGVnVXNlckRhdGEpCisgICAgICAgICAgICB8fCBtcGVnVXNlckRhdGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgQ0hFQ0soYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKworICAgIGJvb2wgdHJhY2tBZGRlZCA9IGZhbHNlOworCisgICAgY29uc3Qgc2l6ZV90ICp1c2VyRGF0YSA9IChzaXplX3QgKiltcGVnVXNlckRhdGEtPmRhdGEoKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbXBlZ1VzZXJEYXRhLT5zaXplKCkgLyBzaXplb2Yoc2l6ZV90KTsgKytpKSB7CisgICAgICAgIHRyYWNrQWRkZWQgfD0gcGFyc2VNUEVHVXNlckRhdGFVbml0KAorICAgICAgICAgICAgICAgIHRpbWVVcywgYWNjZXNzVW5pdC0+ZGF0YSgpICsgdXNlckRhdGFbaV0sIGFjY2Vzc1VuaXQtPnNpemUoKSAtIHVzZXJEYXRhW2ldKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJhY2tBZGRlZDsKK30KKworLy8gcmV0dXJucyB0cnVlIGlmIGEgbmV3IENDIHRyYWNrIGlzIGZvdW5kCitib29sIE51UGxheWVyMjo6Q0NEZWNvZGVyOjpwYXJzZU1QRUdVc2VyRGF0YVVuaXQoaW50NjRfdCB0aW1lVXMsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQUJpdFJlYWRlciBicihkYXRhICsgNCwgNSk7CisKKyAgICB1aW50MzJfdCB1c2VyX2lkZW50aWZpZXIgPSBici5nZXRCaXRzKDMyKTsKKyAgICB1aW50OF90IHVzZXJfZGF0YV90eXBlID0gYnIuZ2V0Qml0cyg4KTsKKworICAgIGlmICh1c2VyX2lkZW50aWZpZXIgPT0gJ0dBOTQnICYmIHVzZXJfZGF0YV90eXBlID09IDB4MykgeworICAgICAgICByZXR1cm4gcGFyc2VNUEVHQ0NEYXRhKHRpbWVVcywgZGF0YSArIDksIHNpemUgLSA5KTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIHJldHVybnMgdHJ1ZSBpZiBhIG5ldyBDQyB0cmFjayBpcyBmb3VuZAorYm9vbCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6cGFyc2VNUEVHQ0NEYXRhKGludDY0X3QgdGltZVVzLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGJvb2wgdHJhY2tBZGRlZCA9IGZhbHNlOworCisgICAgLy8gTVBFR19jY19kYXRhKCkKKyAgICAvLyBBVFNDIEEvNTMgUGFydCA0OiA2LjIuMy4xCisgICAgQUJpdFJlYWRlciBicihkYXRhLCBzaXplKTsKKworICAgIGlmIChici5udW1CaXRzTGVmdCgpIDw9IDE2KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBici5za2lwQml0cygxKTsKKyAgICBib29sIHByb2Nlc3NfY2NfZGF0YV9mbGFnID0gYnIuZ2V0Qml0cygxKTsKKyAgICBici5za2lwQml0cygxKTsKKyAgICBzaXplX3QgY2NfY291bnQgPSBici5nZXRCaXRzKDUpOworICAgIGJyLnNraXBCaXRzKDgpOworCisgICAgaWYgKCFwcm9jZXNzX2NjX2RhdGFfZmxhZyB8fCAzICogOCAqIGNjX2NvdW50ID49IGJyLm51bUJpdHNMZWZ0KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGxpbmUyMUNDQnVmID0gTlVMTDsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2NfY291bnQ7ICsraSkgeworICAgICAgICBici5za2lwQml0cyg1KTsKKyAgICAgICAgYm9vbCBjY192YWxpZCA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgIHVpbnQ4X3QgY2NfdHlwZSA9IGJyLmdldEJpdHMoMik7CisKKyAgICAgICAgaWYgKGNjX3ZhbGlkKSB7CisgICAgICAgICAgICBpZiAoY2NfdHlwZSA9PSAzKSB7CisgICAgICAgICAgICAgICAgaWYgKG1EVFZDQ1BhY2tldC0+c2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICB0cmFja0FkZGVkIHw9IHBhcnNlRFRWQ0NQYWNrZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVVzLCBtRFRWQ0NQYWNrZXQtPmRhdGEoKSwgbURUVkNDUGFja2V0LT5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICBtRFRWQ0NQYWNrZXQtPnNldFJhbmdlKDAsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZW1jcHkobURUVkNDUGFja2V0LT5kYXRhKCkgKyBtRFRWQ0NQYWNrZXQtPnNpemUoKSwgYnIuZGF0YSgpLCAyKTsKKyAgICAgICAgICAgICAgICBtRFRWQ0NQYWNrZXQtPnNldFJhbmdlKDAsIG1EVFZDQ1BhY2tldC0+c2l6ZSgpICsgMik7CisgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoMTYpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtRFRWQ0NQYWNrZXQtPnNpemUoKSA+IDAgJiYgY2NfdHlwZSA9PSAyKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KG1EVFZDQ1BhY2tldC0+ZGF0YSgpICsgbURUVkNDUGFja2V0LT5zaXplKCksIGJyLmRhdGEoKSwgMik7CisgICAgICAgICAgICAgICAgbURUVkNDUGFja2V0LT5zZXRSYW5nZSgwLCBtRFRWQ0NQYWNrZXQtPnNpemUoKSArIDIpOworICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDE2KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2NfdHlwZSA9PSAwIHx8IGNjX3R5cGUgPT0gMSkgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2NfZGF0YV8xID0gYnIuZ2V0Qml0cyg4KSAmIDB4N2Y7CisgICAgICAgICAgICAgICAgdWludDhfdCBjY19kYXRhXzIgPSBici5nZXRCaXRzKDgpICYgMHg3ZjsKKworICAgICAgICAgICAgICAgIENDRGF0YSBjYyhjY190eXBlLCBjY19kYXRhXzEsIGNjX2RhdGFfMik7CisKKyAgICAgICAgICAgICAgICBpZiAoaXNOdWxsUGFkKCZjYykpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc2l6ZV90IGNoYW5uZWw7CisgICAgICAgICAgICAgICAgaWYgKGNjLmdldENoYW5uZWwoJmNoYW5uZWwpKSB7CisgICAgICAgICAgICAgICAgICAgIG1MaW5lMjFDaGFubmVsc1tjY190eXBlXSA9IGNoYW5uZWw7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IHRyYWNrIGlmIGl0IGRvZXMgbm90IGV4aXN0LgorICAgICAgICAgICAgICAgICAgICBnZXRUcmFja0luZGV4KGtUcmFja1R5cGVDRUE2MDgsIGNoYW5uZWwsICZ0cmFja0FkZGVkKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaXNTZWxlY3RlZCgpICYmIG1UcmFja3NbbVNlbGVjdGVkVHJhY2tdLm1UcmFja1R5cGUgPT0ga1RyYWNrVHlwZUNFQTYwOAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVRyYWNrc1ttU2VsZWN0ZWRUcmFja10ubVRyYWNrQ2hhbm5lbCA9PSBtTGluZTIxQ2hhbm5lbHNbY2NfdHlwZV0pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmUyMUNDQnVmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyMUNDQnVmID0gbmV3IEFCdWZmZXIoKGNjX2NvdW50IC0gaSkgKiBzaXplb2YoQ0NEYXRhKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lMjFDQ0J1Zi0+c2V0UmFuZ2UoMCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGxpbmUyMUNDQnVmLT5kYXRhKCkgKyBsaW5lMjFDQ0J1Zi0+c2l6ZSgpLCAmY2MsIHNpemVvZihjYykpOworICAgICAgICAgICAgICAgICAgICBsaW5lMjFDQ0J1Zi0+c2V0UmFuZ2UoMCwgbGluZTIxQ0NCdWYtPnNpemUoKSArIHNpemVvZihDQ0RhdGEpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDE2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgoY2NfdHlwZSA9PSAzIHx8IGNjX3R5cGUgPT0gMikgJiYgbURUVkNDUGFja2V0LT5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgdHJhY2tBZGRlZCB8PSBwYXJzZURUVkNDUGFja2V0KHRpbWVVcywgbURUVkNDUGFja2V0LT5kYXRhKCksIG1EVFZDQ1BhY2tldC0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBtRFRWQ0NQYWNrZXQtPnNldFJhbmdlKDAsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnIuc2tpcEJpdHMoMTYpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGlzU2VsZWN0ZWQoKSAmJiBtVHJhY2tzW21TZWxlY3RlZFRyYWNrXS5tVHJhY2tUeXBlID09IGtUcmFja1R5cGVDRUE2MDgKKyAgICAgICAgICAgICYmIGxpbmUyMUNDQnVmICE9IE5VTEwgJiYgbGluZTIxQ0NCdWYtPnNpemUoKSA+IDApIHsKKyAgICAgICAgbUNDTWFwLmFkZCh0aW1lVXMsIGxpbmUyMUNDQnVmKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJhY2tBZGRlZDsKK30KKworLy8gcmV0dXJucyB0cnVlIGlmIGEgbmV3IENDIHRyYWNrIGlzIGZvdW5kCitib29sIE51UGxheWVyMjo6Q0NEZWNvZGVyOjpwYXJzZURUVkNDUGFja2V0KGludDY0X3QgdGltZVVzLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIC8vIENFQS03MDhCIDUgRFRWQ0MgUGFja2V0IExheWVyLgorICAgIEFCaXRSZWFkZXIgYnIoZGF0YSwgc2l6ZSk7CisgICAgYnIuc2tpcEJpdHMoMik7CisKKyAgICBzaXplX3QgcGFja2V0X3NpemUgPSBici5nZXRCaXRzKDYpOworICAgIGlmIChwYWNrZXRfc2l6ZSA9PSAwKSBwYWNrZXRfc2l6ZSA9IDY0OworICAgIHBhY2tldF9zaXplICo9IDI7CisKKyAgICBpZiAoc2l6ZSAhPSBwYWNrZXRfc2l6ZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCB0cmFja0FkZGVkID0gZmFsc2U7CisKKyAgICB3aGlsZSAoYnIubnVtQml0c0xlZnQoKSA+PSAxNikgeworICAgICAgICAvLyBDRUEtNzA4QiBGaWd1cmUgNSBhbmQgNi4KKyAgICAgICAgdWludDhfdCBzZXJ2aWNlX251bWJlciA9IGJyLmdldEJpdHMoMyk7CisgICAgICAgIHNpemVfdCBibG9ja19zaXplID0gYnIuZ2V0Qml0cyg1KTsKKworICAgICAgICBpZiAoc2VydmljZV9udW1iZXIgPT0gNjQpIHsKKyAgICAgICAgICAgIGJyLnNraXBCaXRzKDIpOworICAgICAgICAgICAgc2VydmljZV9udW1iZXIgPSBici5nZXRCaXRzKDYpOworCisgICAgICAgICAgICBpZiAoc2VydmljZV9udW1iZXIgPCA2NCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cmFja0FkZGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCBibG9ja19zaXplICogOCkgeworICAgICAgICAgICAgcmV0dXJuIHRyYWNrQWRkZWQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYmxvY2tfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIHNpemVfdCB0cmFja0luZGV4ID0gZ2V0VHJhY2tJbmRleChrVHJhY2tUeXBlQ0VBNzA4LCBzZXJ2aWNlX251bWJlciwgJnRyYWNrQWRkZWQpOworICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrID09IChzc2l6ZV90KXRyYWNrSW5kZXgpIHsKKyAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBjY1BhY2tldCA9IG5ldyBBQnVmZmVyKGJsb2NrX3NpemUpOworICAgICAgICAgICAgICAgIG1lbWNweShjY1BhY2tldC0+ZGF0YSgpLCBici5kYXRhKCksIGJsb2NrX3NpemUpOworICAgICAgICAgICAgICAgIG1DQ01hcC5hZGQodGltZVVzLCBjY1BhY2tldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnIuc2tpcEJpdHMoYmxvY2tfc2l6ZSAqIDgpOworICAgIH0KKworICAgIHJldHVybiB0cmFja0FkZGVkOworfQorCisvLyByZXR1cm4gdGhlIHRyYWNrIGluZGV4IGZvciBhIGdpdmVuIHR5cGUgYW5kIGNoYW5uZWwuCisvLyBpZiB0aGUgdHJhY2sgZG9lcyBub3QgZXhpc3QsIGNyZWF0ZXMgYSBuZXcgb25lLgorc2l6ZV90IE51UGxheWVyMjo6Q0NEZWNvZGVyOjpnZXRUcmFja0luZGV4KAorICAgICAgICBpbnQzMl90IHRyYWNrVHlwZSwgc2l6ZV90IGNoYW5uZWwsIGJvb2wgKnRyYWNrQWRkZWQpIHsKKyAgICBDQ1RyYWNrIHRyYWNrKHRyYWNrVHlwZSwgY2hhbm5lbCk7CisgICAgc3NpemVfdCBpbmRleCA9IG1UcmFja0luZGljZXMuaW5kZXhPZktleSh0cmFjayk7CisKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIC8vIEEgbmV3IHRyYWNrIGlzIGFkZGVkLgorICAgICAgICBpbmRleCA9IG1UcmFja3Muc2l6ZSgpOworICAgICAgICBtVHJhY2tJbmRpY2VzLmFkZCh0cmFjaywgaW5kZXgpOworICAgICAgICBtVHJhY2tzLmFkZCh0cmFjayk7CisgICAgICAgICp0cmFja0FkZGVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGluZGV4OworICAgIH0KKworICAgIHJldHVybiBtVHJhY2tJbmRpY2VzLnZhbHVlQXQoaW5kZXgpOworfQorCit2b2lkIE51UGxheWVyMjo6Q0NEZWNvZGVyOjpkZWNvZGUoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpIHsKKyAgICBpZiAoZXh0cmFjdEZyb21NUEVHVXNlckRhdGEoYWNjZXNzVW5pdCkgfHwgZXh0cmFjdEZyb21TRUkoYWNjZXNzVW5pdCkpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICBtc2ctPnNldEludDMyKCJ3aGF0Iiwga1doYXRUcmFja0FkZGVkKTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgfQorICAgIC8vIFRPRE86IGV4dHJhY3QgQ0MgZnJvbSBvdGhlciBzb3VyY2VzCit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OmRpc3BsYXkoaW50NjRfdCB0aW1lVXMpIHsKKyAgICBpZiAoIWlzU2VsZWN0ZWQoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3NpemVfdCBpbmRleCA9IG1DQ01hcC5pbmRleE9mS2V5KHRpbWVVcyk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVigiY2MgZm9yIHRpbWVzdGFtcCAlIiBQUklkNjQgIiBub3QgZm91bmQiLCB0aW1lVXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gY2NCdWY7CisKKyAgICBpZiAoaW5kZXggPT0gMCkgeworICAgICAgICBjY0J1ZiA9IG1DQ01hcC52YWx1ZUF0KGluZGV4KTsKKyAgICB9IGVsc2UgeworICAgICAgICBzaXplX3Qgc2l6ZSA9IDA7CisKKyAgICAgICAgZm9yIChzc2l6ZV90IGkgPSAwOyBpIDw9IGluZGV4OyArK2kpIHsKKyAgICAgICAgICAgIHNpemUgKz0gbUNDTWFwLnZhbHVlQXQoaSktPnNpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGNjQnVmID0gbmV3IEFCdWZmZXIoc2l6ZSk7CisgICAgICAgIGNjQnVmLT5zZXRSYW5nZSgwLCAwKTsKKworICAgICAgICBmb3IgKHNzaXplX3QgaSA9IDA7IGkgPD0gaW5kZXg7ICsraSkgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmID0gbUNDTWFwLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBtZW1jcHkoY2NCdWYtPmRhdGEoKSArIGNjQnVmLT5zaXplKCksIGJ1Zi0+ZGF0YSgpLCBidWYtPnNpemUoKSk7CisgICAgICAgICAgICBjY0J1Zi0+c2V0UmFuZ2UoMCwgY2NCdWYtPnNpemUoKSArIGJ1Zi0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjY0J1Zi0+c2l6ZSgpID4gMCkgeworI2lmIDAKKyAgICAgICAgZHVtcEJ5dGVQYWlyKGNjQnVmKTsKKyNlbmRpZgorCisgICAgICAgIGNjQnVmLT5tZXRhKCktPnNldEludDMyKEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSU5ERVgsIG1TZWxlY3RlZFRyYWNrKTsKKyAgICAgICAgY2NCdWYtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgICAgIGNjQnVmLT5tZXRhKCktPnNldEludDY0KCJkdXJhdGlvblVzIiwgMGxsKTsKKworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoIndoYXQiLCBrV2hhdENsb3NlZENhcHRpb25EYXRhKTsKKyAgICAgICAgbXNnLT5zZXRCdWZmZXIoImJ1ZmZlciIsIGNjQnVmKTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgfQorCisgICAgLy8gcmVtb3ZlIGFsbCBlbnRyaWVzIGJlZm9yZSB0aW1lVXMKKyAgICBtQ0NNYXAucmVtb3ZlSXRlbXNBdCgwLCBpbmRleCArIDEpOworfQorCit2b2lkIE51UGxheWVyMjo6Q0NEZWNvZGVyOjpmbHVzaCgpIHsKKyAgICBtQ0NNYXAuY2xlYXIoKTsKKyAgICBtRFRWQ0NQYWNrZXQtPnNldFJhbmdlKDAsIDApOworfQorCitpbnQzMl90IE51UGxheWVyMjo6Q0NEZWNvZGVyOjpDQ1RyYWNrOjpjb21wYXJlKGNvbnN0IE51UGxheWVyMjo6Q0NEZWNvZGVyOjpDQ1RyYWNrJiByaHMpIGNvbnN0IHsKKyAgICBpbnQzMl90IGNtcCA9IG1UcmFja1R5cGUgLSByaHMubVRyYWNrVHlwZTsKKyAgICBpZiAoY21wICE9IDApIHJldHVybiBjbXA7CisgICAgcmV0dXJuIG1UcmFja0NoYW5uZWwgLSByaHMubVRyYWNrQ2hhbm5lbDsKK30KKworYm9vbCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Q0NUcmFjazo6b3BlcmF0b3I8KGNvbnN0IE51UGxheWVyMjo6Q0NEZWNvZGVyOjpDQ1RyYWNrJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gY29tcGFyZShyaHMpIDwgMDsKK30KKworYm9vbCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Q0NUcmFjazo6b3BlcmF0b3I9PShjb25zdCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Q0NUcmFjayYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbXBhcmUocmhzKSA9PSAwOworfQorCitib29sIE51UGxheWVyMjo6Q0NEZWNvZGVyOjpDQ1RyYWNrOjpvcGVyYXRvciE9KGNvbnN0IE51UGxheWVyMjo6Q0NEZWNvZGVyOjpDQ1RyYWNrJiByaHMpIGNvbnN0IHsKKyAgICByZXR1cm4gY29tcGFyZShyaHMpICE9IDA7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyQ0NEZWNvZGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkNDRGVjb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZDVlYTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkNDRGVjb2Rlci5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTlVQTEFZRVIyX0NDREVDT0RFUl9IXworCisjZGVmaW5lIE5VUExBWUVSMl9DQ0RFQ09ERVJfSF8KKworI2luY2x1ZGUgIk51UGxheWVyMi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBOdVBsYXllcjI6OkNDRGVjb2RlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRDbG9zZWRDYXB0aW9uRGF0YSwKKyAgICAgICAga1doYXRUcmFja0FkZGVkLAorICAgIH07CisKKyAgICBlbnVtIHsKKyAgICAgICAga1RyYWNrVHlwZUNFQTYwOCwKKyAgICAgICAga1RyYWNrVHlwZUNFQTcwOCwKKyAgICB9OworCisgICAgZXhwbGljaXQgQ0NEZWNvZGVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KTsKKworICAgIHNpemVfdCBnZXRUcmFja0NvdW50KCkgY29uc3Q7CisgICAgc3A8QU1lc3NhZ2U+IGdldFRyYWNrSW5mbyhzaXplX3QgaW5kZXgpIGNvbnN0OworICAgIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCBpbmRleCwgYm9vbCBzZWxlY3QpOworICAgIGJvb2wgaXNTZWxlY3RlZCgpIGNvbnN0OworICAgIHZvaWQgZGVjb2RlKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KTsKKyAgICB2b2lkIGRpc3BsYXkoaW50NjRfdCB0aW1lVXMpOworICAgIHZvaWQgZmx1c2goKTsKKworcHJpdmF0ZToKKyAgICAvLyBDQyB0cmFjayBpZGVudGlmaWVyLgorICAgIHN0cnVjdCBDQ1RyYWNrIHsKKyAgICAgICAgQ0NUcmFjaygpIDogbVRyYWNrVHlwZSgwKSwgbVRyYWNrQ2hhbm5lbCgwKSB7IH0KKworICAgICAgICBDQ1RyYWNrKGNvbnN0IGludDMyX3QgdHJhY2tUeXBlLCBjb25zdCBzaXplX3QgdHJhY2tDaGFubmVsKQorICAgICAgICAgICAgOiBtVHJhY2tUeXBlKHRyYWNrVHlwZSksIG1UcmFja0NoYW5uZWwodHJhY2tDaGFubmVsKSB7IH0KKworICAgICAgICBpbnQzMl90IG1UcmFja1R5cGU7CisgICAgICAgIHNpemVfdCBtVHJhY2tDaGFubmVsOworCisgICAgICAgIC8vIFRoZSBvcmRlcmluZyBvZiBDQ1RyYWNrcyBpcyB0byBidWlsZCBhIG1hcCBvZiB0cmFjayB0byBpbmRleC4KKyAgICAgICAgLy8gSXQgaXMgbmVjZXNzYXJ5IHRvIGZpbmQgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIENDVHJhY2sgd2hlbiBDQyBkYXRhIGNvbWVzLgorICAgICAgICBpbnQgY29tcGFyZShjb25zdCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Q0NUcmFjayYgcmhzKSBjb25zdDsKKyAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IE51UGxheWVyMjo6Q0NEZWNvZGVyOjpDQ1RyYWNrJiByaHMpIGNvbnN0OworICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE51UGxheWVyMjo6Q0NEZWNvZGVyOjpDQ1RyYWNrJiByaHMpIGNvbnN0OworICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE51UGxheWVyMjo6Q0NEZWNvZGVyOjpDQ1RyYWNrJiByaHMpIGNvbnN0OworICAgIH07CisKKyAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKKyAgICBLZXllZFZlY3RvcjxpbnQ2NF90LCBzcDxBQnVmZmVyPiA+IG1DQ01hcDsKKyAgICBzc2l6ZV90IG1TZWxlY3RlZFRyYWNrOworICAgIEtleWVkVmVjdG9yPENDVHJhY2ssIHNpemVfdD4gbVRyYWNrSW5kaWNlczsKKyAgICBWZWN0b3I8Q0NUcmFjaz4gbVRyYWNrczsKKworICAgIC8vIENFQS02MDggY2xvc2VkIGNhcHRpb24KKyAgICBzaXplX3QgbUxpbmUyMUNoYW5uZWxzWzJdOyAvLyBUaGUgY3VycmVudCBjaGFubmVscyBvZiBOVFNDX0NDX0ZJRUxEX3sxLCAyfQorCisgICAgLy8gQ0VBLTcwOCBjbG9zZWQgY2FwdGlvbgorICAgIHNwPEFCdWZmZXI+IG1EVFZDQ1BhY2tldDsKKworICAgIGJvb2wgaXNUcmFja1ZhbGlkKHNpemVfdCBpbmRleCkgY29uc3Q7CisgICAgc2l6ZV90IGdldFRyYWNrSW5kZXgoaW50MzJfdCB0cmFja1R5cGUsIHNpemVfdCBjaGFubmVsLCBib29sICp0cmFja0FkZGVkKTsKKworICAgIC8vIEV4dHJhY3QgZnJvbSBILjI2NCBTRUlzCisgICAgYm9vbCBleHRyYWN0RnJvbVNFSShjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCk7CisgICAgYm9vbCBwYXJzZVNFSU5hbFVuaXQoaW50NjRfdCB0aW1lVXMsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIC8vIEV4dHJhY3QgZnJvbSBNUEVHIHVzZXIgZGF0YQorICAgIGJvb2wgZXh0cmFjdEZyb21NUEVHVXNlckRhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpOworICAgIGJvb2wgcGFyc2VNUEVHVXNlckRhdGFVbml0KGludDY0X3QgdGltZVVzLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICAvLyBFeHRyYWN0IENDIHRyYWNrcyBmcm9tIE1QRUdfY2NfZGF0YQorICAgIGJvb2wgcGFyc2VNUEVHQ0NEYXRhKGludDY0X3QgdGltZVVzLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgYm9vbCBwYXJzZURUVkNDUGFja2V0KGludDY0X3QgdGltZVVzLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDQ0RlY29kZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBOVVBMQVlFUjJfQ0NERUNPREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDUxMzhhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyLmNwcApAQCAtMCwwICsxLDEyOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTnVQbGF5ZXIyRGVjb2RlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiTnVQbGF5ZXIyQ0NEZWNvZGVyLmgiCisjaW5jbHVkZSAiTnVQbGF5ZXIyRGVjb2Rlci5oIgorI2luY2x1ZGUgIk51UGxheWVyMkRybS5oIgorI2luY2x1ZGUgIk51UGxheWVyMlJlbmRlcmVyLmgiCisjaW5jbHVkZSAiTnVQbGF5ZXIyU291cmNlLmgiCisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQnVmZmVySG9sZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtXcmFwcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmg+CisKKyNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+CisjaW5jbHVkZSAiQVRTUGFyc2VyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGZsb2F0IGtEaXNwbGF5UmVmcmVzaGluZ1JhdGUgPSA2MC5mOyAvLyBUT0RPOiBnZXQgdGhpcyBmcm9tIHRoZSBkaXNwbGF5CisKKy8vIFRoZSBkZWZhdWx0IHRvdGFsIHZpZGVvIGZyYW1lIHJhdGUgb2YgYSBzdHJlYW0gd2hlbiB0aGF0IGluZm8gaXMgbm90IGF2YWlsYWJsZSBmcm9tCisvLyB0aGUgc291cmNlLgorc3RhdGljIGZsb2F0IGtEZWZhdWx0VmlkZW9GcmFtZVJhdGVUb3RhbCA9IDMwLmY7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBnZXRBdWRpb0RlZXBCdWZmZXJTZXR0aW5nKCkgeworICAgIHJldHVybiBwcm9wZXJ0eV9nZXRfYm9vbCgibWVkaWEuc3RhZ2VmcmlnaHQuYXVkaW8uZGVlcCIsIGZhbHNlIC8qIGRlZmF1bHRfdmFsdWUgKi8pOworfQorCitOdVBsYXllcjI6OkRlY29kZXI6OkRlY29kZXIoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICBjb25zdCBzcDxTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgIHBpZF90IHBpZCwKKyAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICBjb25zdCBzcDxSZW5kZXJlcj4gJnJlbmRlcmVyLAorICAgICAgICBjb25zdCBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gJm53dywKKyAgICAgICAgY29uc3Qgc3A8Q0NEZWNvZGVyPiAmY2NEZWNvZGVyKQorICAgIDogRGVjb2RlckJhc2Uobm90aWZ5KSwKKyAgICAgIG1OYXRpdmVXaW5kb3cobnd3KSwKKyAgICAgIG1Tb3VyY2Uoc291cmNlKSwKKyAgICAgIG1SZW5kZXJlcihyZW5kZXJlciksCisgICAgICBtQ0NEZWNvZGVyKGNjRGVjb2RlciksCisgICAgICBtUGlkKHBpZCksCisgICAgICBtVWlkKHVpZCksCisgICAgICBtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXMoLTFsbCksCisgICAgICBtTnVtRnJhbWVzVG90YWwoMGxsKSwKKyAgICAgIG1OdW1JbnB1dEZyYW1lc0Ryb3BwZWQoMGxsKSwKKyAgICAgIG1OdW1PdXRwdXRGcmFtZXNEcm9wcGVkKDBsbCksCisgICAgICBtVmlkZW9XaWR0aCgwKSwKKyAgICAgIG1WaWRlb0hlaWdodCgwKSwKKyAgICAgIG1Jc0F1ZGlvKHRydWUpLAorICAgICAgbUlzVmlkZW9BVkMoZmFsc2UpLAorICAgICAgbUlzU2VjdXJlKGZhbHNlKSwKKyAgICAgIG1Jc0VuY3J5cHRlZChmYWxzZSksCisgICAgICBtSXNFbmNyeXB0ZWRPYnNlcnZlZEVhcmxpZXIoZmFsc2UpLAorICAgICAgbUZvcm1hdENoYW5nZVBlbmRpbmcoZmFsc2UpLAorICAgICAgbVRpbWVDaGFuZ2VQZW5kaW5nKGZhbHNlKSwKKyAgICAgIG1GcmFtZVJhdGVUb3RhbChrRGVmYXVsdFZpZGVvRnJhbWVSYXRlVG90YWwpLAorICAgICAgbVBsYXliYWNrU3BlZWQoMS4wZiksCisgICAgICBtTnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWwoMSksIC8vIGRlY29kZSBhbGwgbGF5ZXJzCisgICAgICBtTnVtVmlkZW9UZW1wb3JhbExheWVyQWxsb3dlZCgxKSwKKyAgICAgIG1DdXJyZW50TWF4VmlkZW9UZW1wb3JhbExheWVySWQoMCksCisgICAgICBtUmVzdW1lUGVuZGluZyhmYWxzZSksCisgICAgICBtQ29tcG9uZW50TmFtZSgiZGVjb2RlciIpIHsKKyAgICBtVmlkZW9UZW1wb3JhbExheWVyQWdncmVnYXRlRnBzWzBdID0gbUZyYW1lUmF0ZVRvdGFsOworfQorCitOdVBsYXllcjI6OkRlY29kZXI6On5EZWNvZGVyKCkgeworICAgIC8vIE5lZWQgdG8gc3RvcCBsb29wZXIgZmlyc3Qgc2luY2UgbUNvZGVjIGNvdWxkIGJlIGFjY2Vzc2VkIG9uIHRoZSBtRGVjb2Rlckxvb3Blci4KKyAgICBzdG9wTG9vcGVyKCk7CisgICAgaWYgKG1Db2RlYyAhPSBOVUxMKSB7CisgICAgICAgIG1Db2RlYy0+cmVsZWFzZSgpOworICAgIH0KKyAgICByZWxlYXNlQW5kUmVzZXRNZWRpYUJ1ZmZlcnMoKTsKK30KKworc3A8QU1lc3NhZ2U+IE51UGxheWVyMjo6RGVjb2Rlcjo6Z2V0U3RhdHMoKSBjb25zdCB7CisgICAgbVN0YXRzLT5zZXRJbnQ2NCgiZnJhbWVzLXRvdGFsIiwgbU51bUZyYW1lc1RvdGFsKTsKKyAgICBtU3RhdHMtPnNldEludDY0KCJmcmFtZXMtZHJvcHBlZC1pbnB1dCIsIG1OdW1JbnB1dEZyYW1lc0Ryb3BwZWQpOworICAgIG1TdGF0cy0+c2V0SW50NjQoImZyYW1lcy1kcm9wcGVkLW91dHB1dCIsIG1OdW1PdXRwdXRGcmFtZXNEcm9wcGVkKTsKKyAgICByZXR1cm4gbVN0YXRzOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OkRlY29kZXI6OnNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gJm53dykgeworICAgIGlmIChud3cgPT0gTlVMTCB8fCBud3ctPmdldEFOYXRpdmVXaW5kb3coKSA9PSBOVUxMCisgICAgICAgIHx8IEFEZWJ1Zzo6aXNFeHBlcmltZW50RW5hYmxlZCgibGVnYWN5LXNldHN1cmZhY2UiKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRWaWRlb1N1cmZhY2UsIHRoaXMpOworCisgICAgbXNnLT5zZXRPYmplY3QoInN1cmZhY2UiLCBud3cpOworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgQUxPR1YoIlslc10gb25NZXNzYWdlOiAlcyIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdENvZGVjTm90aWZ5OgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGNiSUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiY2FsbGJhY2tJRCIsICZjYklEKSk7CisKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIGtXaGF0Q29kZWNOb3RpZnk6IGNiSUQgPSAlZCwgcGF1c2VkID0gJWQiLAorICAgICAgICAgICAgICAgICAgICBtSXNBdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iLCBjYklELCBtUGF1c2VkKTsKKworICAgICAgICAgICAgaWYgKG1QYXVzZWQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChjYklEKSB7CisgICAgICAgICAgICAgICAgY2FzZSBBTWVkaWFDb2RlY1dyYXBwZXI6OkNCX0lOUFVUX0FWQUlMQUJMRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXg7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJpbmRleCIsICZpbmRleCkpOworCisgICAgICAgICAgICAgICAgICAgIGhhbmRsZUFuSW5wdXRCdWZmZXIoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEFNZWRpYUNvZGVjV3JhcHBlcjo6Q0JfT1VUUFVUX0FWQUlMQUJMRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXg7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmbGFnczsKKworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiaW5kZXgiLCAmaW5kZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgib2Zmc2V0IiwgJm9mZnNldCkpOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJzaXplIiwgJnNpemUpKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImZsYWdzIiwgJmZsYWdzKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlQW5PdXRwdXRCdWZmZXIoaW5kZXgsIG9mZnNldCwgc2l6ZSwgdGltZVVzLCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQU1lZGlhQ29kZWNXcmFwcGVyOjpDQl9PVVRQVVRfRk9STUFUX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7CisKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlT3V0cHV0Rm9ybWF0Q2hhbmdlKGZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQU1lZGlhQ29kZWNXcmFwcGVyOjpDQl9FUlJPUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkRlY29kZXIgKCVzKSByZXBvcnRlZCBlcnJvciA6IDB4JXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jc0F1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIsIGVycik7CisKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UmVuZGVyQnVmZmVyOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWlzU3RhbGVSZXBseShtc2cpKSB7CisgICAgICAgICAgICAgICAgb25SZW5kZXJCdWZmZXIobXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEF1ZGlvT3V0cHV0Rm9ybWF0Q2hhbmdlZDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFpc1N0YWxlUmVwbHkobXNnKSkgeworICAgICAgICAgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpICYmIGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiUmVuZGVyZXIgcmVwb3J0ZWQgMHgleCB3aGVuIGNoYW5naW5nIGF1ZGlvIG91dHB1dCBmb3JtYXQiLCBlcnIpOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcihlcnIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFNldFZpZGVvU3VyZmFjZToKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisKKyAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgic3VyZmFjZSIsICZvYmopKTsKKyAgICAgICAgICAgIHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiBud3cgPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFOYXRpdmVXaW5kb3dXcmFwcGVyICo+KG9iai5nZXQoKSk7IC8vIG5vbi1udWxsCisgICAgICAgICAgICBpZiAobnd3ID09IE5VTEwgfHwgbnd3LT5nZXRBTmF0aXZlV2luZG93KCkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50MzJfdCBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIC8vIE5PVEU6IGluIHByYWN0aWNlIG1OYXRpdmVXaW5kb3cgaXMgYWx3YXlzIG5vbi1udWxsLAorICAgICAgICAgICAgLy8gYnV0IGNoZWNraW5nIGhlcmUgZm9yIGNvbXBsZXRlbmVzcworICAgICAgICAgICAgaWYgKG1Db2RlYyAhPSBOVUxMCisgICAgICAgICAgICAgICAgJiYgbU5hdGl2ZVdpbmRvdyAhPSBOVUxMICYmIG1OYXRpdmVXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogb25jZSBBd2Vzb21lUGxheWVyIGlzIHJlbW92ZWQsIHJlbW92ZSB0aGlzIGF1dG9tYXRpYyBjb25uZWN0aW5nCisgICAgICAgICAgICAgICAgLy8gdG8gdGhlIHN1cmZhY2UgYnkgTWVkaWFQbGF5ZXJTZXJ2aWNlLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gYXQgdGhpcyBwb2ludCBNZWRpYVBsYXllcjJNYW5hZ2VyOjpjbGllbnQgaGFzIGFscmVhZHkgY29ubmVjdGVkIHRvIHRoZQorICAgICAgICAgICAgICAgIC8vIHN1cmZhY2UsIHdoaWNoIE1lZGlhQ29kZWMgZG9lcyBub3QgZXhwZWN0CisgICAgICAgICAgICAgICAgZXJyID0gbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdChud3ctPmdldEFOYXRpdmVXaW5kb3coKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IG1Db2RlYy0+c2V0T3V0cHV0U3VyZmFjZShud3cpOworICAgICAgICAgICAgICAgICAgICBBTE9HSV9JRihlcnIsICJjb2RlYyBzZXRPdXRwdXRTdXJmYWNlIHJldHVybmVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY29ubmVjdCB0byB0aGUgb2xkIHN1cmZhY2UgYXMgTVBTOjpDbGllbnQgd2lsbCBleHBlY3QgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlIGFibGUgdG8gZGlzY29ubmVjdCBmcm9tIGl0LgorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpbmF0aXZlX3dpbmRvd19hcGlfY29ubmVjdChtTmF0aXZlV2luZG93LT5nZXRBTmF0aXZlV2luZG93KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdyA9IG53dzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHJlY29ubmVjdCB0byB0aGUgbmV3IHN1cmZhY2Ugb24gZXJyb3IgYXMgTVBTOjpDbGllbnQgd2lsbCBleHBlY3QgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gYmUgYWJsZSB0byBkaXNjb25uZWN0IGZyb20gaXQuCisgICAgICAgICAgICAgICAgICAgICh2b2lkKW5hdGl2ZV93aW5kb3dfYXBpX2Nvbm5lY3Qobnd3LT5nZXRBTmF0aXZlV2luZG93KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19BUElfTUVESUEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdERybVJlbGVhc2VDcnlwdG86CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dWKCJrV2hhdERybVJlbGVhc2VDcnlwdG8iKTsKKyAgICAgICAgICAgIG9uUmVsZWFzZUNyeXB0byhtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgRGVjb2RlckJhc2U6Om9uTWVzc2FnZVJlY2VpdmVkKG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyOjpvbkNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgIEFMT0dWKCJbJXNdIG9uQ29uZmlndXJlIChmb3JtYXQ9JXMpIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworICAgIENIRUNLKG1Db2RlYyA9PSBOVUxMKTsKKworICAgIG1Gb3JtYXRDaGFuZ2VQZW5kaW5nID0gZmFsc2U7CisgICAgbVRpbWVDaGFuZ2VQZW5kaW5nID0gZmFsc2U7CisKKyAgICArK21CdWZmZXJHZW5lcmF0aW9uOworCisgICAgQVN0cmluZyBtaW1lOworICAgIENIRUNLKGZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CisKKyAgICBtSXNBdWRpbyA9ICFzdHJuY2FzZWNtcCgiYXVkaW8vIiwgbWltZS5jX3N0cigpLCA2KTsKKyAgICBtSXNWaWRlb0FWQyA9ICFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgbWltZS5jX3N0cigpKTsKKworICAgIG1Db21wb25lbnROYW1lID0gbWltZTsKKyAgICBtQ29tcG9uZW50TmFtZS5hcHBlbmQoIiBkZWNvZGVyIik7CisgICAgQUxPR1YoIlslc10gb25Db25maWd1cmUgKG53dz0lcCkiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLAorICAgICAgICAgIChtTmF0aXZlV2luZG93ID09IE5VTEwgPyBOVUxMIDogbU5hdGl2ZVdpbmRvdy0+Z2V0QU5hdGl2ZVdpbmRvdygpKSk7CisKKyAgICBtQ29kZWMgPSBBTWVkaWFDb2RlY1dyYXBwZXI6OkNyZWF0ZURlY29kZXJCeVR5cGUobWltZSk7CisgICAgaW50MzJfdCBzZWN1cmUgPSAwOworICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigic2VjdXJlIiwgJnNlY3VyZSkgJiYgc2VjdXJlICE9IDApIHsKKyAgICAgICAgaWYgKG1Db2RlYyAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAobUNvZGVjLT5nZXROYW1lKCZtQ29tcG9uZW50TmFtZSkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5hcHBlbmQoIi5zZWN1cmUiKTsKKyAgICAgICAgICAgICAgICBtQ29kZWMtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBBTE9HSSgiWyVzXSBjcmVhdGluZyIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIG1Db2RlYyA9IEFNZWRpYUNvZGVjV3JhcHBlcjo6Q3JlYXRlQ29kZWNCeU5hbWUobUNvbXBvbmVudE5hbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQ29kZWMgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChtQ29kZWMgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSAlcyVzIGRlY29kZXIiLAorICAgICAgICAgICAgICAgIChzZWN1cmUgPyAic2VjdXJlICIgOiAiIiksIG1pbWUuY19zdHIoKSk7CisgICAgICAgIGhhbmRsZUVycm9yKE5PX0lOSVQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1Jc1NlY3VyZSA9IHNlY3VyZTsKKworICAgIG1Db2RlYy0+Z2V0TmFtZSgmbUNvbXBvbmVudE5hbWUpOworCisgICAgc3RhdHVzX3QgZXJyOworICAgIGlmIChtTmF0aXZlV2luZG93ICE9IE5VTEwgJiYgbU5hdGl2ZVdpbmRvdy0+Z2V0QU5hdGl2ZVdpbmRvdygpICE9IE5VTEwpIHsKKyAgICAgICAgLy8gZGlzY29ubmVjdCBmcm9tIHN1cmZhY2UgYXMgTWVkaWFDb2RlYyB3aWxsIHJlY29ubmVjdAorICAgICAgICBlcnIgPSBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KG1OYXRpdmVXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7CisgICAgICAgIC8vIFdlIHRyZWF0IHRoaXMgYXMgYSB3YXJuaW5nLCBhcyB0aGlzIGlzIGEgcHJlcGFyYXRvcnkgc3RlcC4KKyAgICAgICAgLy8gQ29kZWMgd2lsbCB0cnkgdG8gY29ubmVjdCB0byB0aGUgc3VyZmFjZSwgd2hpY2ggaXMgd2hlcmUKKyAgICAgICAgLy8gYW55IGVycm9yIHNpZ25hbGluZyB3aWxsIG9jY3VyLgorICAgICAgICBBTE9HV19JRihlcnIgIT0gT0ssICJmYWlsZWQgdG8gZGlzY29ubmVjdCBmcm9tIHN1cmZhY2U6ICVkIiwgZXJyKTsKKyAgICB9CisKKyAgICAvLyBNb2R1bGFyIERSTQorICAgIHNwPFJlZkJhc2U+IG9iakNyeXB0bzsKKyAgICBmb3JtYXQtPmZpbmRPYmplY3QoImNyeXB0byIsICZvYmpDcnlwdG8pOworICAgIHNwPEFNZWRpYUNyeXB0b1dyYXBwZXI+IGNyeXB0byA9IHN0YXRpY19jYXN0PEFNZWRpYUNyeXB0b1dyYXBwZXIgKj4ob2JqQ3J5cHRvLmdldCgpKTsKKyAgICAvLyBub24tZW5jcnlwdGVkIHNvdXJjZSB3b24ndCBoYXZlIGEgY3J5cHRvCisgICAgbUlzRW5jcnlwdGVkID0gKGNyeXB0byAhPSBOVUxMKTsKKyAgICAvLyBjb25maWd1cmUgaXMgY2FsbGVkIG9uY2U7IHN0aWxsIHVzaW5nIE9SIGluIGNhc2UgdGhlIGJlaGF2aW9yIGNoYW5nZXMuCisgICAgbUlzRW5jcnlwdGVkT2JzZXJ2ZWRFYXJsaWVyID0gbUlzRW5jcnlwdGVkT2JzZXJ2ZWRFYXJsaWVyIHx8IG1Jc0VuY3J5cHRlZDsKKyAgICBBTE9HVigib25Db25maWd1cmUgbUNyeXB0bzogJXAsIG1Jc1NlY3VyZTogJWQiLCBjcnlwdG8uZ2V0KCksIG1Jc1NlY3VyZSk7CisKKyAgICBlcnIgPSBtQ29kZWMtPmNvbmZpZ3VyZSgKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdFdyYXBwZXI6OkNyZWF0ZShmb3JtYXQpLAorICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdywKKyAgICAgICAgICAgIGNyeXB0bywKKyAgICAgICAgICAgIDAgLyogZmxhZ3MgKi8pOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNvbmZpZ3VyZSBbJXNdIGRlY29kZXIgKGVycj0lZCkiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworICAgICAgICBtQ29kZWMtPnJlbGVhc2UoKTsKKyAgICAgICAgbUNvZGVjLmNsZWFyKCk7CisgICAgICAgIGhhbmRsZUVycm9yKGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcmVtZW1iZXJDb2RlY1NwZWNpZmljRGF0YShmb3JtYXQpOworCisgICAgLy8gdGhlIGZvbGxvd2luZyBzaG91bGQgd29yayBpbiBjb25maWd1cmVkIHN0YXRlCisgICAgc3A8QU1lZGlhRm9ybWF0V3JhcHBlcj4gb3V0cHV0Rm9ybWF0ID0gbUNvZGVjLT5nZXRPdXRwdXRGb3JtYXQoKTsKKyAgICBpZiAob3V0cHV0Rm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgaGFuZGxlRXJyb3IoSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1JbnB1dEZvcm1hdCA9IG1Db2RlYy0+Z2V0SW5wdXRGb3JtYXQoKTsKKyAgICBpZiAobUlucHV0Rm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgaGFuZGxlRXJyb3IoSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbVN0YXRzLT5zZXRTdHJpbmcoIm1pbWUiLCBtaW1lLmNfc3RyKCkpOworICAgIG1TdGF0cy0+c2V0U3RyaW5nKCJjb21wb25lbnQtbmFtZSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworCisgICAgaWYgKCFtSXNBdWRpbykgeworICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgICAgIGlmIChvdXRwdXRGb3JtYXQtPmdldEludDMyKCJ3aWR0aCIsICZ3aWR0aCkKKyAgICAgICAgICAgICAgICAmJiBvdXRwdXRGb3JtYXQtPmdldEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgeworICAgICAgICAgICAgbVN0YXRzLT5zZXRJbnQzMigid2lkdGgiLCB3aWR0aCk7CisgICAgICAgICAgICBtU3RhdHMtPnNldEludDMyKCJoZWlnaHQiLCBoZWlnaHQpOworICAgICAgICB9CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKGtXaGF0Q29kZWNOb3RpZnksIHRoaXMpOworICAgIG1Db2RlYy0+c2V0Q2FsbGJhY2socmVwbHkpOworCisgICAgZXJyID0gbUNvZGVjLT5zdGFydCgpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzdGFydCBbJXNdIGRlY29kZXIgKGVycj0lZCkiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworICAgICAgICBtQ29kZWMtPnJlbGVhc2UoKTsKKyAgICAgICAgbUNvZGVjLmNsZWFyKCk7CisgICAgICAgIGhhbmRsZUVycm9yKGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByZWxlYXNlQW5kUmVzZXRNZWRpYUJ1ZmZlcnMoKTsKKworICAgIG1QYXVzZWQgPSBmYWxzZTsKKyAgICBtUmVzdW1lUGVuZGluZyA9IGZhbHNlOworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2Rlcjo6b25TZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKSB7CisgICAgYm9vbCBuZWVkQWRqdXN0TGF5ZXJzID0gZmFsc2U7CisgICAgZmxvYXQgZnJhbWVSYXRlVG90YWw7CisgICAgaWYgKHBhcmFtcy0+ZmluZEZsb2F0KCJmcmFtZS1yYXRlLXRvdGFsIiwgJmZyYW1lUmF0ZVRvdGFsKQorICAgICAgICAgICAgJiYgbUZyYW1lUmF0ZVRvdGFsICE9IGZyYW1lUmF0ZVRvdGFsKSB7CisgICAgICAgIG5lZWRBZGp1c3RMYXllcnMgPSB0cnVlOworICAgICAgICBtRnJhbWVSYXRlVG90YWwgPSBmcmFtZVJhdGVUb3RhbDsKKyAgICB9CisKKyAgICBpbnQzMl90IG51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsOworICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMigidGVtcG9yYWwtbGF5ZXItY291bnQiLCAmbnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWwpCisgICAgICAgICAgICAmJiBudW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbCA+PSAwCisgICAgICAgICAgICAmJiBudW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbCA8PSBrTWF4TnVtVmlkZW9UZW1wb3JhbExheWVycworICAgICAgICAgICAgJiYgbU51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsICE9IG51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsKSB7CisgICAgICAgIG5lZWRBZGp1c3RMYXllcnMgPSB0cnVlOworICAgICAgICBtTnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWwgPSBzdGQ6Om1heChudW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbCwgMSk7CisgICAgfQorCisgICAgaWYgKG5lZWRBZGp1c3RMYXllcnMgJiYgbU51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsID4gMSkgeworICAgICAgICAvLyBUT0RPOiBGb3Igbm93LCBsYXllciBmcHMgaXMgY2FsY3VsYXRlZCBmb3Igc29tZSBzcGVjaWZpYyBhcmNoaXRlY3R1cmVzLgorICAgICAgICAvLyBCdXQgaXQgcmVhbGx5IHNob3VsZCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgc3RyZWFtLgorICAgICAgICBtVmlkZW9UZW1wb3JhbExheWVyQWdncmVnYXRlRnBzWzBdID0KKyAgICAgICAgICAgIG1GcmFtZVJhdGVUb3RhbCAvIChmbG9hdCkoMWxsIDw8IChtTnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWwgLSAxKSk7CisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbDsgKytpKSB7CisgICAgICAgICAgICBtVmlkZW9UZW1wb3JhbExheWVyQWdncmVnYXRlRnBzW2ldID0KKyAgICAgICAgICAgICAgICBtRnJhbWVSYXRlVG90YWwgLyAoZmxvYXQpKDFsbCA8PCAobU51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsIC0gaSkpCisgICAgICAgICAgICAgICAgKyBtVmlkZW9UZW1wb3JhbExheWVyQWdncmVnYXRlRnBzW2kgLSAxXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHBsYXliYWNrU3BlZWQ7CisgICAgaWYgKHBhcmFtcy0+ZmluZEZsb2F0KCJwbGF5YmFjay1zcGVlZCIsICZwbGF5YmFja1NwZWVkKQorICAgICAgICAgICAgJiYgbVBsYXliYWNrU3BlZWQgIT0gcGxheWJhY2tTcGVlZCkgeworICAgICAgICBuZWVkQWRqdXN0TGF5ZXJzID0gdHJ1ZTsKKyAgICAgICAgbVBsYXliYWNrU3BlZWQgPSBwbGF5YmFja1NwZWVkOworICAgIH0KKworICAgIGlmIChuZWVkQWRqdXN0TGF5ZXJzKSB7CisgICAgICAgIGZsb2F0IGRlY29kZUZyYW1lUmF0ZSA9IG1GcmFtZVJhdGVUb3RhbDsKKyAgICAgICAgLy8gZW5hYmxlIHRlbXBvcmFsIGxheWVyaW5nIG9wdGltaXphdGlvbiBvbmx5IGlmIHdlIGtub3cgdGhlIGxheWVyaW5nIGRlcHRoCisgICAgICAgIGlmIChtTnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWwgPiAxKSB7CisgICAgICAgICAgICBpbnQzMl90IGxheWVySWQ7CisgICAgICAgICAgICBmb3IgKGxheWVySWQgPSAwOyBsYXllcklkIDwgbU51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsIC0gMTsgKytsYXllcklkKSB7CisgICAgICAgICAgICAgICAgaWYgKG1WaWRlb1RlbXBvcmFsTGF5ZXJBZ2dyZWdhdGVGcHNbbGF5ZXJJZF0gKiBtUGxheWJhY2tTcGVlZAorICAgICAgICAgICAgICAgICAgICAgICAgPj0ga0Rpc3BsYXlSZWZyZXNoaW5nUmF0ZSAqIDAuOSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTnVtVmlkZW9UZW1wb3JhbExheWVyQWxsb3dlZCA9IGxheWVySWQgKyAxOworICAgICAgICAgICAgZGVjb2RlRnJhbWVSYXRlID0gbVZpZGVvVGVtcG9yYWxMYXllckFnZ3JlZ2F0ZUZwc1tsYXllcklkXTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigib25TZXRQYXJhbWV0ZXJzOiBhbGxvd2VkIGxheWVycz0lZCwgZGVjb2RlRnBzPSVnIiwKKyAgICAgICAgICAgICAgICBtTnVtVmlkZW9UZW1wb3JhbExheWVyQWxsb3dlZCwgZGVjb2RlRnJhbWVSYXRlKTsKKworICAgICAgICBpZiAobUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dXKCJvblNldFBhcmFtZXRlcnMgY2FsbGVkIGJlZm9yZSBjb2RlYyBpcyBjcmVhdGVkLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc3A8QU1lZGlhRm9ybWF0V3JhcHBlcj4gY29kZWNQYXJhbXMgPSBuZXcgQU1lZGlhRm9ybWF0V3JhcHBlcigpOworICAgICAgICBjb2RlY1BhcmFtcy0+c2V0RmxvYXQoIm9wZXJhdGluZy1yYXRlIiwgZGVjb2RlRnJhbWVSYXRlICogbVBsYXliYWNrU3BlZWQpOworICAgICAgICBtQ29kZWMtPnNldFBhcmFtZXRlcnMoY29kZWNQYXJhbXMpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXI6Om9uU2V0UmVuZGVyZXIoY29uc3Qgc3A8UmVuZGVyZXI+ICZyZW5kZXJlcikgeworICAgIG1SZW5kZXJlciA9IHJlbmRlcmVyOworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2Rlcjo6b25SZXN1bWUoYm9vbCBub3RpZnlDb21wbGV0ZSkgeworICAgIG1QYXVzZWQgPSBmYWxzZTsKKworICAgIGlmIChub3RpZnlDb21wbGV0ZSkgeworICAgICAgICBtUmVzdW1lUGVuZGluZyA9IHRydWU7CisgICAgfQorCisgICAgaWYgKG1Db2RlYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJbJXNdIG9uUmVzdW1lIHdpdGhvdXQgYSB2YWxpZCBjb2RlYyIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICBoYW5kbGVFcnJvcihOT19JTklUKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQ29kZWMtPnN0YXJ0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyOjpkb0ZsdXNoKGJvb2wgbm90aWZ5Q29tcGxldGUpIHsKKyAgICBpZiAobUNDRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgIG1DQ0RlY29kZXItPmZsdXNoKCk7CisgICAgfQorCisgICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7CisgICAgICAgIG1SZW5kZXJlci0+Zmx1c2gobUlzQXVkaW8sIG5vdGlmeUNvbXBsZXRlKTsKKyAgICAgICAgbVJlbmRlcmVyLT5zaWduYWxUaW1lRGlzY29udGludWl0eSgpOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIGlmIChtQ29kZWMgIT0gTlVMTCkgeworICAgICAgICBlcnIgPSBtQ29kZWMtPmZsdXNoKCk7CisgICAgICAgIG1DU0RzVG9TdWJtaXQgPSBtQ1NEc0ZvckN1cnJlbnRGb3JtYXQ7IC8vIGNvcHkgb3BlcmF0b3IKKyAgICAgICAgKyttQnVmZmVyR2VuZXJhdGlvbjsKKyAgICB9CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZmx1c2ggWyVzXSAoZXJyPSVkKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CisgICAgICAgIGhhbmRsZUVycm9yKGVycik7CisgICAgICAgIC8vIGZpbmlzaCB3aXRoIHBvc3Rpbmcga1doYXRGbHVzaENvbXBsZXRlZC4KKyAgICAgICAgLy8gd2UgYXR0ZW1wdCB0byByZWxlYXNlIHRoZSBidWZmZXJzIGV2ZW4gaWYgZmx1c2ggZmFpbHMuCisgICAgfQorICAgIHJlbGVhc2VBbmRSZXNldE1lZGlhQnVmZmVycygpOworICAgIG1QYXVzZWQgPSB0cnVlOworfQorCisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyOjpvbkZsdXNoKCkgeworICAgIGRvRmx1c2godHJ1ZSk7CisKKyAgICBpZiAoaXNEaXNjb250aW51aXR5UGVuZGluZygpKSB7CisgICAgICAgIC8vIFRoaXMgY291bGQgaGFwcGVuIGlmIHRoZSBjbGllbnQgc3RhcnRzIHNlZWtpbmcvc2h1dGRvd24KKyAgICAgICAgLy8gYWZ0ZXIgd2UgcXVldWVkIGFuIEVPUyBmb3IgZGlzY29udGludWl0aWVzLgorICAgICAgICAvLyBXZSBjYW4gY29uc2lkZXIgZGlzY29udGludWl0eSBoYW5kbGVkLgorICAgICAgICBmaW5pc2hIYW5kbGVEaXNjb250aW51aXR5KGZhbHNlIC8qIGZsdXNoT25UaW1lQ2hhbmdlICovKTsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0Rmx1c2hDb21wbGV0ZWQpOworICAgIG5vdGlmeS0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2Rlcjo6b25TaHV0ZG93bihib29sIG5vdGlmeUNvbXBsZXRlKSB7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisKKyAgICAvLyBpZiB0aGVyZSBpcyBhIHBlbmRpbmcgcmVzdW1lIHJlcXVlc3QsIG5vdGlmeSBjb21wbGV0ZSBub3cKKyAgICBub3RpZnlSZXN1bWVDb21wbGV0ZUlmTmVjZXNzYXJ5KCk7CisKKyAgICBpZiAobUNvZGVjICE9IE5VTEwpIHsKKyAgICAgICAgZXJyID0gbUNvZGVjLT5yZWxlYXNlKCk7CisgICAgICAgIG1Db2RlYyA9IE5VTEw7CisgICAgICAgICsrbUJ1ZmZlckdlbmVyYXRpb247CisKKyAgICAgICAgaWYgKG1OYXRpdmVXaW5kb3cgIT0gTlVMTCAmJiBtTmF0aXZlV2luZG93LT5nZXRBTmF0aXZlV2luZG93KCkgIT0gTlVMTCkgeworICAgICAgICAgICAgLy8gcmVjb25uZWN0IHRvIHN1cmZhY2UgYXMgTWVkaWFDb2RlYyBkaXNjb25uZWN0ZWQgZnJvbSBpdAorICAgICAgICAgICAgc3RhdHVzX3QgZXJyb3IgPSBuYXRpdmVfd2luZG93X2FwaV9jb25uZWN0KG1OYXRpdmVXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7CisgICAgICAgICAgICBBTE9HV19JRihlcnJvciAhPSBOT19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIlslc10gZmFpbGVkIHRvIGNvbm5lY3QgdG8gbmF0aXZlIHdpbmRvdywgZXJyb3I9JWQiLAorICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnJvcik7CisgICAgICAgIH0KKyAgICAgICAgbUNvbXBvbmVudE5hbWUgPSAiZGVjb2RlciI7CisgICAgfQorCisgICAgcmVsZWFzZUFuZFJlc2V0TWVkaWFCdWZmZXJzKCk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gcmVsZWFzZSBbJXNdIChlcnI9JWQpIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKKyAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKKyAgICAgICAgLy8gZmluaXNoIHdpdGggcG9zdGluZyBrV2hhdFNodXRkb3duQ29tcGxldGVkLgorICAgIH0KKworICAgIGlmIChub3RpZnlDb21wbGV0ZSkgeworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFNodXRkb3duQ29tcGxldGVkKTsKKyAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgIG1QYXVzZWQgPSB0cnVlOworICAgIH0KK30KKworLyoKKyAqIHJldHVybnMgdHJ1ZSBpZiB3ZSBzaG91bGQgcmVxdWVzdCBtb3JlIGRhdGEKKyAqLworYm9vbCBOdVBsYXllcjI6OkRlY29kZXI6OmRvUmVxdWVzdEJ1ZmZlcnMoKSB7CisgICAgaWYgKGlzRGlzY29udGludWl0eVBlbmRpbmcoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIHdoaWxlIChlcnIgPT0gT0sgJiYgIW1EZXF1ZXVlZElucHV0QnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHNpemVfdCBidWZmZXJJeCA9ICptRGVxdWV1ZWRJbnB1dEJ1ZmZlcnMuYmVnaW4oKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgpOworICAgICAgICBtc2ctPnNldFNpemUoImJ1ZmZlci1peCIsIGJ1ZmZlckl4KTsKKyAgICAgICAgZXJyID0gZmV0Y2hJbnB1dERhdGEobXNnKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSyAmJiBlcnIgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgLy8gaWYgRU9TLCBuZWVkIHRvIHF1ZXVlIEVPUyBidWZmZXIKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG1EZXF1ZXVlZElucHV0QnVmZmVycy5lcmFzZShtRGVxdWV1ZWRJbnB1dEJ1ZmZlcnMuYmVnaW4oKSk7CisKKyAgICAgICAgaWYgKCFtUGVuZGluZ0lucHV0TWVzc2FnZXMuZW1wdHkoKQorICAgICAgICAgICAgICAgIHx8ICFvbklucHV0QnVmZmVyRmV0Y2hlZChtc2cpKSB7CisgICAgICAgICAgICBtUGVuZGluZ0lucHV0TWVzc2FnZXMucHVzaF9iYWNrKG1zZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZXJyID09IC1FV09VTERCTE9DSworICAgICAgICAgICAgJiYgbVNvdXJjZS0+ZmVlZE1vcmVUU0RhdGEoKSA9PSBPSzsKK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXI6OmhhbmRsZUVycm9yKGludDMyX3QgZXJyKQoreworICAgIC8vIFdlIGNhbm5vdCBpbW1lZGlhdGVseSByZWxlYXNlIHRoZSBjb2RlYyBkdWUgdG8gYnVmZmVycyBzdGlsbCBvdXRzdGFuZGluZworICAgIC8vIGluIHRoZSByZW5kZXJlci4gIFdlIHNpZ25hbCB0byB0aGUgcGxheWVyIHRoZSBlcnJvciBzbyBpdCBjYW4gc2h1dGRvd24vcmVsZWFzZSB0aGUKKyAgICAvLyBkZWNvZGVyIGFmdGVyIGZsdXNoaW5nIGFuZCBpbmNyZW1lbnQgdGhlIGdlbmVyYXRpb24gdG8gZGlzY2FyZCB1bm5lY2Vzc2FyeSBtZXNzYWdlcy4KKworICAgICsrbUJ1ZmZlckdlbmVyYXRpb247CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RXJyb3IpOworICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgbm90aWZ5LT5wb3N0KCk7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6RGVjb2Rlcjo6cmVsZWFzZUNyeXB0bygpCit7CisgICAgQUxPR1YoInJlbGVhc2VDcnlwdG8iKTsKKworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXREcm1SZWxlYXNlQ3J5cHRvLCB0aGlzKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgaWYgKHN0YXR1cyA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoInN0YXR1cyIsICZzdGF0dXMpKTsKKyAgICAgICAgQUxPR1YoInJlbGVhc2VDcnlwdG8gcmV0OiAlZCAiLCBzdGF0dXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJyZWxlYXNlQ3J5cHRvIGVycjogJWQiLCBzdGF0dXMpOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyOjpvblJlbGVhc2VDcnlwdG8oY29uc3Qgc3A8QU1lc3NhZ2U+JiBtc2cpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgaWYgKG1Db2RlYyAhPSBOVUxMKSB7CisgICAgICAgIHN0YXR1cyA9IG1Db2RlYy0+cmVsZWFzZUNyeXB0bygpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHJldHVybmluZyBPSyBpZiB0aGUgY29kZWMgaGFzIGJlZW4gYWxyZWFkeSByZWxlYXNlZAorICAgICAgICBzdGF0dXMgPSBPSzsKKyAgICAgICAgQUxPR0UoIm9uUmVsZWFzZUNyeXB0byBObyBtQ29kZWMuIGVycjogJWQiLCBzdGF0dXMpOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICByZXNwb25zZS0+c2V0SW50MzIoInN0YXR1cyIsIHN0YXR1cyk7CisgICAgLy8gQ2xlYXJpbmcgdGhlIHN0YXRlIGFzIGl0J3MgdGllZCB0byBjcnlwdG8uIG1Jc0VuY3J5cHRlZE9ic2VydmVkRWFybGllciBpcyBzdGlja3kgdGhvdWdoCisgICAgLy8gYW5kIGxhc3RzIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhpcyBjb2RlYy4gU2VlIGl0cyB1c2UgaW4gZmV0Y2hJbnB1dERhdGEuCisgICAgbUlzRW5jcnlwdGVkID0gZmFsc2U7CisKKyAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKK30KKworYm9vbCBOdVBsYXllcjI6OkRlY29kZXI6OmhhbmRsZUFuSW5wdXRCdWZmZXIoc2l6ZV90IGluZGV4KSB7CisgICAgaWYgKGlzRGlzY29udGludWl0eVBlbmRpbmcoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1Db2RlYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJbJXNdIGhhbmRsZUFuSW5wdXRCdWZmZXIgd2l0aG91dCBhIHZhbGlkIGNvZGVjIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgIGhhbmRsZUVycm9yKE5PX0lOSVQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc2l6ZV90IGJ1ZmZlclNpemUgPSAwOworICAgIHVpbnQ4X3QgKmJ1ZmZlckJhc2UgPSBtQ29kZWMtPmdldElucHV0QnVmZmVyKGluZGV4LCAmYnVmZmVyU2l6ZSk7CisKKyAgICBpZiAoYnVmZmVyQmFzZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJbJXNdIGhhbmRsZUFuSW5wdXRCdWZmZXIsIGZhaWxlZCB0byBnZXQgaW5wdXQgYnVmZmVyIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgIGhhbmRsZUVycm9yKFVOS05PV05fRVJST1IpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyID0KKyAgICAgICAgbmV3IE1lZGlhQ29kZWNCdWZmZXIoTlVMTCAvKiBmb3JtYXQgKi8sIG5ldyBBQnVmZmVyKGJ1ZmZlckJhc2UsIGJ1ZmZlclNpemUpKTsKKworICAgIGlmIChpbmRleCA+PSBtSW5wdXRCdWZmZXJzLnNpemUoKSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gbUlucHV0QnVmZmVycy5zaXplKCk7IGkgPD0gaW5kZXg7ICsraSkgeworICAgICAgICAgICAgbUlucHV0QnVmZmVycy5hZGQoKTsKKyAgICAgICAgICAgIG1NZWRpYUJ1ZmZlcnMuYWRkKCk7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXJJc0RlcXVldWVkLmFkZCgpOworICAgICAgICAgICAgbU1lZGlhQnVmZmVycy5lZGl0SXRlbUF0KGkpID0gTlVMTDsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuZWRpdEl0ZW1BdChpKSA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIG1JbnB1dEJ1ZmZlcnMuZWRpdEl0ZW1BdChpbmRleCkgPSBidWZmZXI7CisKKyAgICAvL0NIRUNLX0xUKGJ1ZmZlckl4LCBtSW5wdXRCdWZmZXJzLnNpemUoKSk7CisKKyAgICBpZiAobU1lZGlhQnVmZmVyc1tpbmRleF0gIT0gTlVMTCkgeworICAgICAgICBtTWVkaWFCdWZmZXJzW2luZGV4XS0+cmVsZWFzZSgpOworICAgICAgICBtTWVkaWFCdWZmZXJzLmVkaXRJdGVtQXQoaW5kZXgpID0gTlVMTDsKKyAgICB9CisgICAgbUlucHV0QnVmZmVySXNEZXF1ZXVlZC5lZGl0SXRlbUF0KGluZGV4KSA9IHRydWU7CisKKyAgICBpZiAoIW1DU0RzVG9TdWJtaXQuaXNFbXB0eSgpKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICAgICAgbXNnLT5zZXRTaXplKCJidWZmZXItaXgiLCBpbmRleCk7CisKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbUNTRHNUb1N1Ym1pdC5pdGVtQXQoMCk7CisgICAgICAgIEFMT0dJKCJbJXNdIHJlc3VibWl0dGluZyBDU0QiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgbXNnLT5zZXRCdWZmZXIoImJ1ZmZlciIsIGJ1ZmZlcik7CisgICAgICAgIG1DU0RzVG9TdWJtaXQucmVtb3ZlQXQoMCk7CisgICAgICAgIGlmICghb25JbnB1dEJ1ZmZlckZldGNoZWQobXNnKSkgeworICAgICAgICAgICAgaGFuZGxlRXJyb3IoVU5LTk9XTl9FUlJPUik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgd2hpbGUgKCFtUGVuZGluZ0lucHV0TWVzc2FnZXMuZW1wdHkoKSkgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gKm1QZW5kaW5nSW5wdXRNZXNzYWdlcy5iZWdpbigpOworICAgICAgICBpZiAoIW9uSW5wdXRCdWZmZXJGZXRjaGVkKG1zZykpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG1QZW5kaW5nSW5wdXRNZXNzYWdlcy5lcmFzZShtUGVuZGluZ0lucHV0TWVzc2FnZXMuYmVnaW4oKSk7CisgICAgfQorCisgICAgaWYgKCFtSW5wdXRCdWZmZXJJc0RlcXVldWVkLmVkaXRJdGVtQXQoaW5kZXgpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIG1EZXF1ZXVlZElucHV0QnVmZmVycy5wdXNoX2JhY2soaW5kZXgpOworCisgICAgb25SZXF1ZXN0SW5wdXRCdWZmZXJzKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTnVQbGF5ZXIyOjpEZWNvZGVyOjpoYW5kbGVBbk91dHB1dEJ1ZmZlcigKKyAgICAgICAgc2l6ZV90IGluZGV4LAorICAgICAgICBzaXplX3Qgb2Zmc2V0LAorICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgaW50NjRfdCB0aW1lVXMsCisgICAgICAgIGludDMyX3QgZmxhZ3MpIHsKKyAgICBpZiAobUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIlslc10gaGFuZGxlQW5PdXRwdXRCdWZmZXIgd2l0aG91dCBhIHZhbGlkIGNvZGVjIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgIGhhbmRsZUVycm9yKE5PX0lOSVQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisvLyAgICBDSEVDS19MVChidWZmZXJJeCwgbU91dHB1dEJ1ZmZlcnMuc2l6ZSgpKTsKKworICAgIHNpemVfdCBidWZmZXJTaXplID0gMDsKKyAgICB1aW50OF90ICpidWZmZXJCYXNlID0gbUNvZGVjLT5nZXRPdXRwdXRCdWZmZXIoaW5kZXgsICZidWZmZXJTaXplKTsKKworICAgIGlmIChidWZmZXJCYXNlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIlslc10gaGFuZGxlQW5PdXRwdXRCdWZmZXIsIGZhaWxlZCB0byBnZXQgb3V0cHV0IGJ1ZmZlciIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICBoYW5kbGVFcnJvcihVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZmZlciA9CisgICAgICAgIG5ldyBNZWRpYUNvZGVjQnVmZmVyKE5VTEwgLyogZm9ybWF0ICovLCBuZXcgQUJ1ZmZlcihidWZmZXJCYXNlLCBidWZmZXJTaXplKSk7CisKKyAgICBpZiAoaW5kZXggPj0gbU91dHB1dEJ1ZmZlcnMuc2l6ZSgpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSBtT3V0cHV0QnVmZmVycy5zaXplKCk7IGkgPD0gaW5kZXg7ICsraSkgeworICAgICAgICAgICAgbU91dHB1dEJ1ZmZlcnMuYWRkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtT3V0cHV0QnVmZmVycy5lZGl0SXRlbUF0KGluZGV4KSA9IGJ1ZmZlcjsKKworICAgIGJ1ZmZlci0+c2V0UmFuZ2Uob2Zmc2V0LCBzaXplKTsKKyAgICBidWZmZXItPm1ldGEoKS0+Y2xlYXIoKTsKKyAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisKKyAgICBib29sIGVvcyA9IGZsYWdzICYgQU1FRElBQ09ERUNfQlVGRkVSX0ZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAvLyB3ZSBkbyBub3QgZXhwZWN0IENPREVDQ09ORklHIG9yIFNZTkNGUkFNRSBmb3IgZGVjb2RlcgorCisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVuZGVyQnVmZmVyLCB0aGlzKTsKKyAgICByZXBseS0+c2V0U2l6ZSgiYnVmZmVyLWl4IiwgaW5kZXgpOworICAgIHJlcGx5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1CdWZmZXJHZW5lcmF0aW9uKTsKKworICAgIGlmIChlb3MpIHsKKyAgICAgICAgQUxPR0koIlslc10gc2F3IG91dHB1dCBFT1MiLCBtSXNBdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKKworICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImVvcyIsIHRydWUpOworICAgICAgICByZXBseS0+c2V0SW50MzIoImVvcyIsIHRydWUpOworICAgIH0KKworICAgIG1OdW1GcmFtZXNUb3RhbCArPSAhbUlzQXVkaW87CisKKyAgICBpZiAobVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzID49IDApIHsKKyAgICAgICAgaWYgKHRpbWVVcyA8IG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVcykgeworICAgICAgICAgICAgQUxPR1YoIlslc10gZHJvcHBpbmcgYnVmZmVyIGF0IHRpbWUgJWxsZCBhcyByZXF1ZXN0ZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIChsb25nIGxvbmcpdGltZVVzKTsKKworICAgICAgICAgICAgcmVwbHktPnBvc3QoKTsKKyAgICAgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgICAgICBub3RpZnlSZXN1bWVDb21wbGV0ZUlmTmVjZXNzYXJ5KCk7CisgICAgICAgICAgICAgICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMICYmICFpc0Rpc2NvbnRpbnVpdHlQZW5kaW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVJlbmRlcmVyLT5xdWV1ZUVPUyhtSXNBdWRpbywgRVJST1JfRU5EX09GX1NUUkVBTSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXMgPSAtMTsKKyAgICB9CisKKyAgICAvLyB3YWl0IHVudGlsIDFzdCBmcmFtZSBjb21lcyBvdXQgdG8gc2lnbmFsIHJlc3VtZSBjb21wbGV0ZQorICAgIG5vdGlmeVJlc3VtZUNvbXBsZXRlSWZOZWNlc3NhcnkoKTsKKworICAgIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgeworICAgICAgICAvLyBzZW5kIHRoZSBidWZmZXIgdG8gcmVuZGVyZXIuCisgICAgICAgIG1SZW5kZXJlci0+cXVldWVCdWZmZXIobUlzQXVkaW8sIGJ1ZmZlciwgcmVwbHkpOworICAgICAgICBpZiAoZW9zICYmICFpc0Rpc2NvbnRpbnVpdHlQZW5kaW5nKCkpIHsKKyAgICAgICAgICAgIG1SZW5kZXJlci0+cXVldWVFT1MobUlzQXVkaW8sIEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyOjpoYW5kbGVPdXRwdXRGb3JtYXRDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKKyAgICBpZiAoIW1Jc0F1ZGlvKSB7CisgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkKKyAgICAgICAgICAgICAgICAmJiBmb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKKyAgICAgICAgICAgIG1TdGF0cy0+c2V0SW50MzIoIndpZHRoIiwgd2lkdGgpOworICAgICAgICAgICAgbVN0YXRzLT5zZXRJbnQzMigiaGVpZ2h0IiwgaGVpZ2h0KTsKKyAgICAgICAgfQorICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFZpZGVvU2l6ZUNoYW5nZWQpOworICAgICAgICBub3RpZnktPnNldE1lc3NhZ2UoImZvcm1hdCIsIGZvcm1hdCk7CisgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgIH0gZWxzZSBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKKyAgICAgICAgdWludDMyX3QgZmxhZ3M7CisgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICAgICAgYm9vbCBoYXNWaWRlbyA9IChtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pICE9IE5VTEwpOworICAgICAgICBpZiAoZ2V0QXVkaW9EZWVwQnVmZmVyU2V0dGluZygpIC8vIG92ZXJyaWRlIHJlZ2FyZGxlc3Mgb2Ygc291cmNlIGR1cmF0aW9uCisgICAgICAgICAgICAgICAgfHwgKG1Tb3VyY2UtPmdldER1cmF0aW9uKCZkdXJhdGlvblVzKSA9PSBPSworICAgICAgICAgICAgICAgICAgICAgICAgJiYgZHVyYXRpb25VcyA+IEFVRElPX1NJTktfTUlOX0RFRVBfQlVGRkVSX0RVUkFUSU9OX1VTKSkgeworICAgICAgICAgICAgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZShrV2hhdEF1ZGlvT3V0cHV0Rm9ybWF0Q2hhbmdlZCwgdGhpcyk7CisgICAgICAgIHJlcGx5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1CdWZmZXJHZW5lcmF0aW9uKTsKKyAgICAgICAgbVJlbmRlcmVyLT5jaGFuZ2VBdWRpb0Zvcm1hdCgKKyAgICAgICAgICAgICAgICBmb3JtYXQsIGZhbHNlIC8qIG9mZmxvYWRPbmx5ICovLCBoYXNWaWRlbywKKyAgICAgICAgICAgICAgICBmbGFncywgbVNvdXJjZS0+aXNTdHJlYW1pbmcoKSwgcmVwbHkpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXI6OnJlbGVhc2VBbmRSZXNldE1lZGlhQnVmZmVycygpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1NZWRpYUJ1ZmZlcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1NZWRpYUJ1ZmZlcnNbaV0gIT0gTlVMTCkgeworICAgICAgICAgICAgbU1lZGlhQnVmZmVyc1tpXS0+cmVsZWFzZSgpOworICAgICAgICAgICAgbU1lZGlhQnVmZmVycy5lZGl0SXRlbUF0KGkpID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBtTWVkaWFCdWZmZXJzLnJlc2l6ZShtSW5wdXRCdWZmZXJzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTWVkaWFCdWZmZXJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1NZWRpYUJ1ZmZlcnMuZWRpdEl0ZW1BdChpKSA9IE5VTEw7CisgICAgfQorICAgIG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuY2xlYXIoKTsKKyAgICBtSW5wdXRCdWZmZXJJc0RlcXVldWVkLnJlc2l6ZShtSW5wdXRCdWZmZXJzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRCdWZmZXJJc0RlcXVldWVkLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuZWRpdEl0ZW1BdChpKSA9IGZhbHNlOworICAgIH0KKworICAgIG1QZW5kaW5nSW5wdXRNZXNzYWdlcy5jbGVhcigpOworICAgIG1EZXF1ZXVlZElucHV0QnVmZmVycy5jbGVhcigpOworICAgIG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVcyA9IC0xOworfQorCitib29sIE51UGxheWVyMjo6RGVjb2Rlcjo6aXNTdGFsZVJlcGx5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICByZXR1cm4gZ2VuZXJhdGlvbiAhPSBtQnVmZmVyR2VuZXJhdGlvbjsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpEZWNvZGVyOjpmZXRjaElucHV0RGF0YShzcDxBTWVzc2FnZT4gJnJlcGx5KSB7CisgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdDsKKyAgICBib29sIGRyb3BBY2Nlc3NVbml0ID0gdHJ1ZTsKKyAgICBkbyB7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPmRlcXVldWVBY2Nlc3NVbml0KG1Jc0F1ZGlvLCAmYWNjZXNzVW5pdCk7CisKKyAgICAgICAgaWYgKGVyciA9PSAtRVdPVUxEQkxPQ0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBpZiAoZXJyID09IElORk9fRElTQ09OVElOVUlUWSkgeworICAgICAgICAgICAgICAgIGludDMyX3QgdHlwZTsKKyAgICAgICAgICAgICAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQzMigiZGlzY29udGludWl0eSIsICZ0eXBlKSk7CisKKyAgICAgICAgICAgICAgICBib29sIGZvcm1hdENoYW5nZSA9CisgICAgICAgICAgICAgICAgICAgIChtSXNBdWRpbyAmJgorICAgICAgICAgICAgICAgICAgICAgKHR5cGUgJiBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfQVVESU9fRk9STUFUKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKCFtSXNBdWRpbyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlICYgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX1ZJREVPX0ZPUk1BVCkpOworCisgICAgICAgICAgICAgICAgYm9vbCB0aW1lQ2hhbmdlID0gKHR5cGUgJiBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfVElNRSkgIT0gMDsKKworICAgICAgICAgICAgICAgIEFMT0dJKCIlcyBkaXNjb250aW51aXR5IChmb3JtYXQ9JWQsIHRpbWU9JWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Jc0F1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIsIGZvcm1hdENoYW5nZSwgdGltZUNoYW5nZSk7CisKKyAgICAgICAgICAgICAgICBib29sIHNlYW1sZXNzRm9ybWF0Q2hhbmdlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5ld0Zvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdChtSXNBdWRpbyk7CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdENoYW5nZSkgeworICAgICAgICAgICAgICAgICAgICBzZWFtbGVzc0Zvcm1hdENoYW5nZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0c1NlYW1sZXNzRm9ybWF0Q2hhbmdlKG5ld0Zvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIC8vIHRyZWF0IHNlYW1sZXNzIGZvcm1hdCBjaGFuZ2Ugc2VwYXJhdGVseQorICAgICAgICAgICAgICAgICAgICBmb3JtYXRDaGFuZ2UgPSAhc2VhbWxlc3NGb3JtYXRDaGFuZ2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gRm9yIGZvcm1hdCBvciB0aW1lIGNoYW5nZSwgcmV0dXJuIEVPUyB0byBxdWV1ZSBFT1MgaW5wdXQsCisgICAgICAgICAgICAgICAgLy8gdGhlbiB3YWl0IGZvciBFT1Mgb24gb3V0cHV0LgorICAgICAgICAgICAgICAgIGlmIChmb3JtYXRDaGFuZ2UgLyogbm90IHNlYW1sZXNzICovKSB7CisgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXRDaGFuZ2VQZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRpbWVDaGFuZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtZW1iZXJDb2RlY1NwZWNpZmljRGF0YShuZXdGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBtVGltZUNoYW5nZVBlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VhbWxlc3NGb3JtYXRDaGFuZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmV1c2UgZXhpc3RpbmcgZGVjb2RlciBhbmQgZG9uJ3QgZmx1c2gKKyAgICAgICAgICAgICAgICAgICAgcmVtZW1iZXJDb2RlY1NwZWNpZmljRGF0YShuZXdGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHN0cmVhbSBpcyB1bmFmZmVjdGVkIGJ5IHRoZSBkaXNjb250aW51aXR5CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRVdPVUxEQkxPQ0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyByZXBseSBzaG91bGQgb25seSBiZSByZXR1cm5lZCB3aXRob3V0IGEgYnVmZmVyIHNldAorICAgICAgICAgICAgLy8gd2hlbiB0aGVyZSBpcyBhbiBlcnJvciAoaW5jbHVkaW5nIEVPUykKKyAgICAgICAgICAgIENIRUNLKGVyciAhPSBPSyk7CisKKyAgICAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICB9CisKKyAgICAgICAgZHJvcEFjY2Vzc1VuaXQgPSBmYWxzZTsKKyAgICAgICAgaWYgKCFtSXNBdWRpbyAmJiAhbUlzRW5jcnlwdGVkKSB7CisgICAgICAgICAgICAvLyBFeHRyYSBzYWZlZ3VhcmQgaWYgaGlnaGVyLWxldmVsIGJlaGF2aW9yIGNoYW5nZXMuIE90aGVyd2lzZSwgbm90IHJlcXVpcmVkIG5vdy4KKyAgICAgICAgICAgIC8vIFByZXZlbnRpbmcgdGhlIGJ1ZmZlciBmcm9tIGJlaW5nIHByb2Nlc3NlZCAoYW5kIHNlbnQgdG8gY29kZWMpIGlmIHRoaXMgaXMgYSBsYXRlcgorICAgICAgICAgICAgLy8gcm91bmQgb2YgcGxheWJhY2sgYnV0IHRoaXMgdGltZSB3aXRob3V0IHByZXBhcmVEcm0uIE9yIGlmIHRoZXJlIGlzIGEgcmFjZSBiZXR3ZWVuCisgICAgICAgICAgICAvLyBzdG9wICh3aGljaCBpcyBub3QgYmxvY2tpbmcpIGFuZCByZWxlYXNlRHJtIGFsbG93aW5nIGJ1ZmZlcnMgYmVpbmcgcHJvY2Vzc2VkIGFmdGVyCisgICAgICAgICAgICAvLyBDcnlwdG8gaGFzIGJlZW4gcmVsZWFzZWQgKEdlbmVyaWNTb3VyY2UgY3VycmVudGx5IHByZXZlbnRzIHRoaXMgcmFjZSB0aG91Z2gpLgorICAgICAgICAgICAgLy8gUGFydGljdWxhcmx5IGRvaW5nIHRoaXMgY2hlY2sgYmVmb3JlIElzQVZDUmVmZXJlbmNlRnJhbWUgY2FsbCB0byBwcmV2ZW50IHBhcnNpbmcKKyAgICAgICAgICAgIC8vIG9mIGVuY3J5cHRlZCBkYXRhLgorICAgICAgICAgICAgaWYgKG1Jc0VuY3J5cHRlZE9ic2VydmVkRWFybGllcikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJmZXRjaElucHV0RGF0YTogbWlzbWF0Y2hlZCBtSXNFbmNyeXB0ZWQvbUlzRW5jcnlwdGVkT2JzZXJ2ZWRFYXJsaWVyICgwLzEpIik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludDMyX3QgbGF5ZXJJZCA9IDA7CisgICAgICAgICAgICBib29sIGhhdmVMYXllcklkID0gYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50MzIoInRlbXBvcmFsLWxheWVyLWlkIiwgJmxheWVySWQpOworICAgICAgICAgICAgaWYgKG1SZW5kZXJlci0+Z2V0VmlkZW9MYXRlQnlVcygpID4gMTAwMDAwbGwKKyAgICAgICAgICAgICAgICAgICAgJiYgbUlzVmlkZW9BVkMKKyAgICAgICAgICAgICAgICAgICAgJiYgIUlzQVZDUmVmZXJlbmNlRnJhbWUoYWNjZXNzVW5pdCkpIHsKKyAgICAgICAgICAgICAgICBkcm9wQWNjZXNzVW5pdCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGhhdmVMYXllcklkICYmIG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbCA+IDEpIHsKKyAgICAgICAgICAgICAgICAvLyBBZGQgb25seSBvbmUgbGF5ZXIgZWFjaCB0aW1lLgorICAgICAgICAgICAgICAgIGlmIChsYXllcklkID4gbUN1cnJlbnRNYXhWaWRlb1RlbXBvcmFsTGF5ZXJJZCArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheWVySWQgPj0gbU51bVZpZGVvVGVtcG9yYWxMYXllckFsbG93ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgZHJvcEFjY2Vzc1VuaXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiZHJvcHBpbmcgbGF5ZXIoJWQpLCBzcGVlZD0lZywgYWxsb3dlZCBsYXllciBjb3VudD0lZCwgbWF4IGxheWVySWQ9JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVySWQsIG1QbGF5YmFja1NwZWVkLCBtTnVtVmlkZW9UZW1wb3JhbExheWVyQWxsb3dlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudE1heFZpZGVvVGVtcG9yYWxMYXllcklkKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxheWVySWQgPiBtQ3VycmVudE1heFZpZGVvVGVtcG9yYWxMYXllcklkKSB7CisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50TWF4VmlkZW9UZW1wb3JhbExheWVySWQgPSBsYXllcklkOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5ZXJJZCA9PSAwICYmIG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbCA+IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIElzSURSKGFjY2Vzc1VuaXQtPmRhdGEoKSwgYWNjZXNzVW5pdC0+c2l6ZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBtQ3VycmVudE1heFZpZGVvVGVtcG9yYWxMYXllcklkID0gbU51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsIC0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZHJvcEFjY2Vzc1VuaXQpIHsKKyAgICAgICAgICAgICAgICBpZiAobGF5ZXJJZCA8PSBtQ3VycmVudE1heFZpZGVvVGVtcG9yYWxMYXllcklkICYmIGxheWVySWQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50TWF4VmlkZW9UZW1wb3JhbExheWVySWQgPSBsYXllcklkIC0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKyttTnVtSW5wdXRGcmFtZXNEcm9wcGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSB3aGlsZSAoZHJvcEFjY2Vzc1VuaXQpOworCisgICAgLy8gQUxPR1YoInJldHVybmVkIGEgdmFsaWQgYnVmZmVyIG9mICVzIGRhdGEiLCBtSXNBdWRpbyA/ICJtSXNBdWRpbyIgOiAidmlkZW8iKTsKKyNpZiAwCisgICAgaW50NjRfdCBtZWRpYVRpbWVVczsKKyAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKSk7CisgICAgQUxPR1YoIlslc10gZmVlZGluZyBpbnB1dCBidWZmZXIgYXQgbWVkaWEgdGltZSAlLjNmIiwKKyAgICAgICAgIG1Jc0F1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIsCisgICAgICAgICBtZWRpYVRpbWVVcyAvIDFFNik7CisjZW5kaWYKKworICAgIGlmIChtQ0NEZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgbUNDRGVjb2Rlci0+ZGVjb2RlKGFjY2Vzc1VuaXQpOworICAgIH0KKworICAgIHJlcGx5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIGFjY2Vzc1VuaXQpOworCisgICAgcmV0dXJuIE9LOworfQorCitib29sIE51UGxheWVyMjo6RGVjb2Rlcjo6b25JbnB1dEJ1ZmZlckZldGNoZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpZiAobUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIlslc10gb25JbnB1dEJ1ZmZlckZldGNoZWQgd2l0aG91dCBhIHZhbGlkIGNvZGVjIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgIGhhbmRsZUVycm9yKE5PX0lOSVQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc2l6ZV90IGJ1ZmZlckl4OworICAgIENIRUNLKG1zZy0+ZmluZFNpemUoImJ1ZmZlci1peCIsICZidWZmZXJJeCkpOworICAgIENIRUNLX0xUKGJ1ZmZlckl4LCBtSW5wdXRCdWZmZXJzLnNpemUoKSk7CisgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gY29kZWNCdWZmZXIgPSBtSW5wdXRCdWZmZXJzW2J1ZmZlckl4XTsKKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICBib29sIGhhc0J1ZmZlciA9IG1zZy0+ZmluZEJ1ZmZlcigiYnVmZmVyIiwgJmJ1ZmZlcik7CisgICAgYm9vbCBuZWVkc0NvcHkgPSB0cnVlOworCisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMIC8qIGluY2x1ZGVzICFoYXNCdWZmZXIgKi8pIHsKKyAgICAgICAgaW50MzJfdCBzdHJlYW1FcnIgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZXJyIiwgJnN0cmVhbUVycikgfHwgIWhhc0J1ZmZlcik7CisKKyAgICAgICAgQ0hFQ0soc3RyZWFtRXJyICE9IE9LKTsKKworICAgICAgICAvLyBhdHRlbXB0IHRvIHF1ZXVlIEVPUworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29kZWMtPnF1ZXVlSW5wdXRCdWZmZXIoCisgICAgICAgICAgICAgICAgYnVmZmVySXgsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgQU1FRElBQ09ERUNfQlVGRkVSX0ZMQUdfRU5EX09GX1NUUkVBTSk7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuZWRpdEl0ZW1BdChidWZmZXJJeCkgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJlYW1FcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgc3RyZWFtRXJyID0gZXJyOworICAgICAgICAgICAgLy8gZXJyIHdpbGwgbm90IGJlIEVSUk9SX0VORF9PRl9TVFJFQU0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdHJlYW1FcnIgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgQUxPR0UoIlN0cmVhbSBlcnJvciBmb3IgWyVzXSAoZXJyPSVkKSwgRU9TICVzIHF1ZXVlZCIsCisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbUVyciwKKyAgICAgICAgICAgICAgICAgICAgZXJyID09IE9LID8gInN1Y2Nlc3NmdWxseSIgOiAidW5zdWNjZXNzZnVsbHkiKTsKKyAgICAgICAgICAgIGhhbmRsZUVycm9yKHN0cmVhbUVycik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzcDxBTWVzc2FnZT4gZXh0cmE7CisgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZE1lc3NhZ2UoImV4dHJhIiwgJmV4dHJhKSAmJiBleHRyYSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpbnQ2NF90IHJlc3VtZUF0TWVkaWFUaW1lVXM7CisgICAgICAgICAgICBpZiAoZXh0cmEtPmZpbmRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZXN1bWUtYXQtbWVkaWFUaW1lVXMiLCAmcmVzdW1lQXRNZWRpYVRpbWVVcykpIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiWyVzXSBzdXBwcmVzc2luZyByZW5kZXJpbmcgdW50aWwgJWxsZCB1cyIsCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCAobG9uZyBsb25nKXJlc3VtZUF0TWVkaWFUaW1lVXMpOworICAgICAgICAgICAgICAgIG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVcyA9IHJlc3VtZUF0TWVkaWFUaW1lVXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnQ2NF90IHRpbWVVcyA9IDA7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworCisgICAgICAgIGludDMyX3QgZW9zLCBjc2Q7CisgICAgICAgIC8vIHdlIGRvIG5vdCBleHBlY3QgU1lOQ0ZSQU1FIGZvciBkZWNvZGVyCisgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJlb3MiLCAmZW9zKSAmJiBlb3MpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEFNRURJQUNPREVDX0JVRkZFUl9GTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0gZWxzZSBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiY3NkIiwgJmNzZCkgJiYgY3NkKSB7CisgICAgICAgICAgICBmbGFncyB8PSBBTUVESUFDT0RFQ19CVUZGRVJfRkxBR19DT0RFQ19DT05GSUc7CisgICAgICAgIH0KKworICAgICAgICAvLyBNb2R1bGFyIERSTQorICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKm1lZGlhQnVmID0gTlVMTDsKKyAgICAgICAgc3A8QU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcj4gY3J5cHRJbmZvOworCisgICAgICAgIC8vIGNvcHkgaW50byBjb2RlYyBidWZmZXIKKyAgICAgICAgaWYgKG5lZWRzQ29weSkgeworICAgICAgICAgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpID4gY29kZWNCdWZmZXItPmNhcGFjaXR5KCkpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcihFUlJPUl9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICAgICAgICAgICAgICBtRGVxdWV1ZWRJbnB1dEJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlckl4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChidWZmZXItPmRhdGEoKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPnNldFJhbmdlKDAsIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoY29kZWNCdWZmZXItPmRhdGEoKSwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IC8vIE5vIGJ1ZmZlci0+ZGF0YSgpCisgICAgICAgICAgICAgICAgLy9Nb2R1bGFyIERSTQorICAgICAgICAgICAgICAgIHNwPFJlZkJhc2U+IGhvbGRlcjsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRPYmplY3QoIm1lZGlhQnVmZmVySG9sZGVyIiwgJmhvbGRlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFCdWYgPSAoaG9sZGVyICE9IG51bGxwdHIpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PE1lZGlhQnVmZmVySG9sZGVyKj4oaG9sZGVyLmdldCgpKS0+bWVkaWFCdWZmZXIoKSA6IG51bGxwdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtZWRpYUJ1ZiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5zZXRSYW5nZSgwLCBtZWRpYUJ1Zi0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGNvZGVjQnVmZmVyLT5kYXRhKCksIG1lZGlhQnVmLT5kYXRhKCksIG1lZGlhQnVmLT5zaXplKCkpOworCisgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YV9kYXRhID0gbWVkaWFCdWYtPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgICAgICAgICBjcnlwdEluZm8gPSBBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyOjpDcmVhdGUobWV0YV9kYXRhKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBObyBtZWRpYUJ1ZgorICAgICAgICAgICAgICAgICAgICBBTE9HRSgib25JbnB1dEJ1ZmZlckZldGNoZWQ6IGJ1ZmZlci0+ZGF0YSgpL21lZGlhQnVmIGFyZSBOVUxMIGZvciAlcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoVU5LTk9XTl9FUlJPUik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IC8vIGJ1ZmZlci0+ZGF0YSgpCisgICAgICAgIH0gLy8gbmVlZHNDb3B5CisKKyAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICBpZiAoY3J5cHRJbmZvICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGVyciA9IG1Db2RlYy0+cXVldWVTZWN1cmVJbnB1dEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVySXgsCisgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5vZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgY3J5cHRJbmZvLAorICAgICAgICAgICAgICAgICAgICB0aW1lVXMsCisgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICAgICAgICAgIC8vIHN5bmNocm9ub3VzIGNhbGwgc28gZG9uZSB3aXRoIGNyeXB0SW5mbyBoZXJlCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnIgPSBtQ29kZWMtPnF1ZXVlSW5wdXRCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckl4LAorICAgICAgICAgICAgICAgICAgICBjb2RlY0J1ZmZlci0+b2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5zaXplKCksCisgICAgICAgICAgICAgICAgICAgIHRpbWVVcywKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgICAgICB9IC8vIG5vIGNyeXB0SW5mbworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJvbklucHV0QnVmZmVyRmV0Y2hlZDogcXVldWUlc0lucHV0QnVmZmVyIGZhaWxlZCBmb3IgWyVzXSAoZXJyPSVkKSIsCisgICAgICAgICAgICAgICAgICAgIChjcnlwdEluZm8gIT0gTlVMTCA/ICJTZWN1cmUiIDogIiIpLAorICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworICAgICAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuZWRpdEl0ZW1BdChidWZmZXJJeCkgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgfSAgIC8vIGJ1ZmZlciAhPSBOVUxMCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyOjpvblJlbmRlckJ1ZmZlcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN0YXR1c190IGVycjsKKyAgICBpbnQzMl90IHJlbmRlcjsKKyAgICBzaXplX3QgYnVmZmVySXg7CisgICAgaW50MzJfdCBlb3M7CisgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgiYnVmZmVyLWl4IiwgJmJ1ZmZlckl4KSk7CisKKyAgICBpZiAoIW1Jc0F1ZGlvKSB7CisgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXIgPSBtT3V0cHV0QnVmZmVyc1tidWZmZXJJeF07CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpOworCisgICAgICAgIGlmIChtQ0NEZWNvZGVyICE9IE5VTEwgJiYgbUNDRGVjb2Rlci0+aXNTZWxlY3RlZCgpKSB7CisgICAgICAgICAgICBtQ0NEZWNvZGVyLT5kaXNwbGF5KHRpbWVVcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgZXJyID0gTk9fSU5JVDsKKyAgICB9IGVsc2UgaWYgKG1zZy0+ZmluZEludDMyKCJyZW5kZXIiLCAmcmVuZGVyKSAmJiByZW5kZXIpIHsKKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBOczsKKyAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVzdGFtcE5zIiwgJnRpbWVzdGFtcE5zKSk7CisgICAgICAgIGVyciA9IG1Db2RlYy0+cmVsZWFzZU91dHB1dEJ1ZmZlckF0VGltZShidWZmZXJJeCwgdGltZXN0YW1wTnMpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1OdW1PdXRwdXRGcmFtZXNEcm9wcGVkICs9ICFtSXNBdWRpbzsKKyAgICAgICAgZXJyID0gbUNvZGVjLT5yZWxlYXNlT3V0cHV0QnVmZmVyKGJ1ZmZlckl4LCBmYWxzZSAvKiByZW5kZXIgKi8pOworICAgIH0KKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gcmVsZWFzZSBvdXRwdXQgYnVmZmVyIGZvciBbJXNdIChlcnI9JWQpIiwKKyAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworICAgICAgICBoYW5kbGVFcnJvcihlcnIpOworICAgIH0KKyAgICBpZiAobXNnLT5maW5kSW50MzIoImVvcyIsICZlb3MpICYmIGVvcworICAgICAgICAgICAgJiYgaXNEaXNjb250aW51aXR5UGVuZGluZygpKSB7CisgICAgICAgIGZpbmlzaEhhbmRsZURpc2NvbnRpbnVpdHkodHJ1ZSAvKiBmbHVzaE9uVGltZUNoYW5nZSAqLyk7CisgICAgfQorfQorCitib29sIE51UGxheWVyMjo6RGVjb2Rlcjo6aXNEaXNjb250aW51aXR5UGVuZGluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUZvcm1hdENoYW5nZVBlbmRpbmcgfHwgbVRpbWVDaGFuZ2VQZW5kaW5nOworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2Rlcjo6ZmluaXNoSGFuZGxlRGlzY29udGludWl0eShib29sIGZsdXNoT25UaW1lQ2hhbmdlKSB7CisgICAgQUxPR1YoImZpbmlzaEhhbmRsZURpc2NvbnRpbnVpdHk6IGZvcm1hdCAlZCwgdGltZSAlZCwgZmx1c2ggJWQiLAorICAgICAgICAgICAgbUZvcm1hdENoYW5nZVBlbmRpbmcsIG1UaW1lQ2hhbmdlUGVuZGluZywgZmx1c2hPblRpbWVDaGFuZ2UpOworCisgICAgLy8gSWYgd2UgaGF2ZSBmb3JtYXQgY2hhbmdlLCBwYXVzZSBhbmQgd2FpdCB0byBiZSBraWxsZWQ7CisgICAgLy8gSWYgd2UgaGF2ZSB0aW1lIGNoYW5nZSBvbmx5LCBmbHVzaCBhbmQgcmVzdGFydCBmZXRjaGluZy4KKworICAgIGlmIChtRm9ybWF0Q2hhbmdlUGVuZGluZykgeworICAgICAgICBtUGF1c2VkID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKG1UaW1lQ2hhbmdlUGVuZGluZykgeworICAgICAgICBpZiAoZmx1c2hPblRpbWVDaGFuZ2UpIHsKKyAgICAgICAgICAgIGRvRmx1c2goZmFsc2UgLyogbm90aWZ5Q29tcGxldGUgKi8pOworICAgICAgICAgICAgc2lnbmFsUmVzdW1lKGZhbHNlIC8qIG5vdGlmeUNvbXBsZXRlICovKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE5vdGlmeSBOdVBsYXllcjIgdG8gZWl0aGVyIHNodXRkb3duIGRlY29kZXIsIG9yIHJlc2NhbiBzb3VyY2VzCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOworICAgIG1zZy0+c2V0SW50MzIoIndoYXQiLCBrV2hhdElucHV0RGlzY29udGludWl0eSk7CisgICAgbXNnLT5zZXRJbnQzMigiZm9ybWF0Q2hhbmdlIiwgbUZvcm1hdENoYW5nZVBlbmRpbmcpOworICAgIG1zZy0+cG9zdCgpOworCisgICAgbUZvcm1hdENoYW5nZVBlbmRpbmcgPSBmYWxzZTsKKyAgICBtVGltZUNoYW5nZVBlbmRpbmcgPSBmYWxzZTsKK30KKworYm9vbCBOdVBsYXllcjI6OkRlY29kZXI6OnN1cHBvcnRzU2VhbWxlc3NBdWRpb0Zvcm1hdENoYW5nZSgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZ0YXJnZXRGb3JtYXQpIGNvbnN0IHsKKyAgICBpZiAodGFyZ2V0Rm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQVN0cmluZyBtaW1lOworICAgIGlmICghdGFyZ2V0Rm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIXN0cmNhc2VjbXAobWltZS5jX3N0cigpLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKSB7CisgICAgICAgIC8vIGZpZWxkLWJ5LWZpZWxkIGNvbXBhcmlzb24KKyAgICAgICAgY29uc3QgY2hhciAqIGtleXNbXSA9IHsgImNoYW5uZWwtY291bnQiLCAic2FtcGxlLXJhdGUiLCAiaXMtYWR0cyIgfTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBzaXplb2Yoa2V5cykgLyBzaXplb2Yoa2V5c1swXSk7IGkrKykgeworICAgICAgICAgICAgaW50MzJfdCBvbGRWYWwsIG5ld1ZhbDsKKyAgICAgICAgICAgIGlmICghbUlucHV0Rm9ybWF0LT5nZXRJbnQzMihrZXlzW2ldLCAmb2xkVmFsKSB8fAorICAgICAgICAgICAgICAgICAgICAhdGFyZ2V0Rm9ybWF0LT5maW5kSW50MzIoa2V5c1tpXSwgJm5ld1ZhbCkgfHwKKyAgICAgICAgICAgICAgICAgICAgb2xkVmFsICE9IG5ld1ZhbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNwPEFCdWZmZXI+IG5ld0J1ZjsKKyAgICAgICAgdWludDhfdCAqb2xkQnVmRGF0YSA9IE5VTEw7CisgICAgICAgIHNpemVfdCBvbGRCdWZTaXplID0gMDsKKyAgICAgICAgaWYgKG1JbnB1dEZvcm1hdC0+Z2V0QnVmZmVyKCJjc2QtMCIsICh2b2lkKiopJm9sZEJ1ZkRhdGEsICZvbGRCdWZTaXplKSAmJgorICAgICAgICAgICAgICAgIHRhcmdldEZvcm1hdC0+ZmluZEJ1ZmZlcigiY3NkLTAiLCAmbmV3QnVmKSkgeworICAgICAgICAgICAgaWYgKG9sZEJ1ZlNpemUgIT0gbmV3QnVmLT5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gIW1lbWNtcChvbGRCdWZEYXRhLCBuZXdCdWYtPmRhdGEoKSwgb2xkQnVmU2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIE51UGxheWVyMjo6RGVjb2Rlcjo6c3VwcG9ydHNTZWFtbGVzc0Zvcm1hdENoYW5nZShjb25zdCBzcDxBTWVzc2FnZT4gJnRhcmdldEZvcm1hdCkgY29uc3QgeworICAgIGlmIChtSW5wdXRGb3JtYXQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHRhcmdldEZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEFTdHJpbmcgb2xkTWltZSwgbmV3TWltZTsKKyAgICBpZiAoIW1JbnB1dEZvcm1hdC0+Z2V0U3RyaW5nKCJtaW1lIiwgJm9sZE1pbWUpCisgICAgICAgICAgICB8fCAhdGFyZ2V0Rm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm5ld01pbWUpCisgICAgICAgICAgICB8fCAhKG9sZE1pbWUgPT0gbmV3TWltZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgYXVkaW8gPSAhc3RybmNhc2VjbXAob2xkTWltZS5jX3N0cigpLCAiYXVkaW8vIiwgc3RybGVuKCJhdWRpby8iKSk7CisgICAgYm9vbCBzZWFtbGVzczsKKyAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgc2VhbWxlc3MgPSBzdXBwb3J0c1NlYW1sZXNzQXVkaW9Gb3JtYXRDaGFuZ2UodGFyZ2V0Rm9ybWF0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQzMl90IGlzQWRhcHRpdmU7CisgICAgICAgIHNlYW1sZXNzID0gKG1Db2RlYyAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgbUlucHV0Rm9ybWF0LT5nZXRJbnQzMigiYWRhcHRpdmUtcGxheWJhY2siLCAmaXNBZGFwdGl2ZSkgJiYKKyAgICAgICAgICAgICAgICBpc0FkYXB0aXZlKTsKKyAgICB9CisKKyAgICBBTE9HVigiJXMgc2VhbWxlc3Mgc3VwcG9ydCBmb3IgJXMiLCBzZWFtbGVzcyA/ICJ5ZXMiIDogIm5vIiwgb2xkTWltZS5jX3N0cigpKTsKKyAgICByZXR1cm4gc2VhbWxlc3M7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyOjpyZW1lbWJlckNvZGVjU3BlY2lmaWNEYXRhKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgaWYgKGZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUNTRHNGb3JDdXJyZW50Rm9ybWF0LmNsZWFyKCk7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyA7ICsraSkgeworICAgICAgICBBU3RyaW5nIHRhZyA9ICJjc2QtIjsKKyAgICAgICAgdGFnLmFwcGVuZChpKTsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgICAgICBpZiAoIWZvcm1hdC0+ZmluZEJ1ZmZlcih0YWcuY19zdHIoKSwgJmJ1ZmZlcikpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG1DU0RzRm9yQ3VycmVudEZvcm1hdC5wdXNoKGJ1ZmZlcik7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2Rlcjo6bm90aWZ5UmVzdW1lQ29tcGxldGVJZk5lY2Vzc2FyeSgpIHsKKyAgICBpZiAobVJlc3VtZVBlbmRpbmcpIHsKKyAgICAgICAgbVJlc3VtZVBlbmRpbmcgPSBmYWxzZTsKKworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFJlc3VtZUNvbXBsZXRlZCk7CisgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGZiMTBlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyLmgKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTlVQTEFZRVIyX0RFQ09ERVJfSF8KKyNkZWZpbmUgTlVQTEFZRVIyX0RFQ09ERVJfSF8KKworI2luY2x1ZGUgIk51UGxheWVyMi5oIgorCisjaW5jbHVkZSAiTnVQbGF5ZXIyRGVjb2RlckJhc2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZWRpYUNvZGVjQnVmZmVyOworCitzdHJ1Y3QgQU1lZGlhQ29kZWNXcmFwcGVyOworc3RydWN0IEFNZWRpYUZvcm1hdFdyYXBwZXI7CisKK3N0cnVjdCBOdVBsYXllcjI6OkRlY29kZXIgOiBwdWJsaWMgRGVjb2RlckJhc2UgeworICAgIERlY29kZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgICAgICBjb25zdCBzcDxTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgICAgICBwaWRfdCBwaWQsCisgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICBjb25zdCBzcDxSZW5kZXJlcj4gJnJlbmRlcmVyID0gTlVMTCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiAmbnd3ID0gTlVMTCwKKyAgICAgICAgICAgIGNvbnN0IHNwPENDRGVjb2Rlcj4gJmNjRGVjb2RlciA9IE5VTEwpOworCisgICAgdmlydHVhbCBzcDxBTWVzc2FnZT4gZ2V0U3RhdHMoKSBjb25zdDsKKworICAgIC8vIHNldHMgdGhlIG91dHB1dCBzdXJmYWNlIG9mIHZpZGVvIGRlY29kZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiAmbnd3KTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUNyeXB0bygpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+RGVjb2RlcigpOworCisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIHZpcnR1YWwgdm9pZCBvbkNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CisgICAgdmlydHVhbCB2b2lkIG9uU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcyk7CisgICAgdmlydHVhbCB2b2lkIG9uU2V0UmVuZGVyZXIoY29uc3Qgc3A8UmVuZGVyZXI+ICZyZW5kZXJlcik7CisgICAgdmlydHVhbCB2b2lkIG9uUmVzdW1lKGJvb2wgbm90aWZ5Q29tcGxldGUpOworICAgIHZpcnR1YWwgdm9pZCBvbkZsdXNoKCk7CisgICAgdmlydHVhbCB2b2lkIG9uU2h1dGRvd24oYm9vbCBub3RpZnlDb21wbGV0ZSk7CisgICAgdmlydHVhbCBib29sIGRvUmVxdWVzdEJ1ZmZlcnMoKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRDb2RlY05vdGlmeSAgICAgICAgID0gJ2NkY04nLAorICAgICAgICBrV2hhdFJlbmRlckJ1ZmZlciAgICAgICAgPSAncm5kcicsCisgICAgICAgIGtXaGF0U2V0VmlkZW9TdXJmYWNlICAgICA9ICdzU3VyJywKKyAgICAgICAga1doYXRBdWRpb091dHB1dEZvcm1hdENoYW5nZWQgPSAnYW9mYycsCisgICAgICAgIGtXaGF0RHJtUmVsZWFzZUNyeXB0byAgICA9ICdyRHJtJywKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICAgIGtNYXhOdW1WaWRlb1RlbXBvcmFsTGF5ZXJzID0gMzIsCisgICAgfTsKKworICAgIHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiBtTmF0aXZlV2luZG93OworCisgICAgc3A8U291cmNlPiBtU291cmNlOworICAgIHNwPFJlbmRlcmVyPiBtUmVuZGVyZXI7CisgICAgc3A8Q0NEZWNvZGVyPiBtQ0NEZWNvZGVyOworCisgICAgc3A8QU1lZGlhRm9ybWF0V3JhcHBlcj4gbUlucHV0Rm9ybWF0OworICAgIHNwPEFNZWRpYUNvZGVjV3JhcHBlcj4gbUNvZGVjOworCisgICAgTGlzdDxzcDxBTWVzc2FnZT4gPiBtUGVuZGluZ0lucHV0TWVzc2FnZXM7CisKKyAgICBWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4gPiBtSW5wdXRCdWZmZXJzOworICAgIFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPiA+IG1PdXRwdXRCdWZmZXJzOworICAgIFZlY3RvcjxzcDxBQnVmZmVyPiA+IG1DU0RzRm9yQ3VycmVudEZvcm1hdDsKKyAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiBtQ1NEc1RvU3VibWl0OworICAgIFZlY3Rvcjxib29sPiBtSW5wdXRCdWZmZXJJc0RlcXVldWVkOworICAgIFZlY3RvcjxNZWRpYUJ1ZmZlciAqPiBtTWVkaWFCdWZmZXJzOworICAgIFZlY3RvcjxzaXplX3Q+IG1EZXF1ZXVlZElucHV0QnVmZmVyczsKKworICAgIGNvbnN0IHBpZF90IG1QaWQ7CisgICAgY29uc3QgdWlkX3QgbVVpZDsKKyAgICBpbnQ2NF90IG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVczsKKyAgICBpbnQ2NF90IG1OdW1GcmFtZXNUb3RhbDsKKyAgICBpbnQ2NF90IG1OdW1JbnB1dEZyYW1lc0Ryb3BwZWQ7CisgICAgaW50NjRfdCBtTnVtT3V0cHV0RnJhbWVzRHJvcHBlZDsKKyAgICBpbnQzMl90IG1WaWRlb1dpZHRoOworICAgIGludDMyX3QgbVZpZGVvSGVpZ2h0OworICAgIGJvb2wgbUlzQXVkaW87CisgICAgYm9vbCBtSXNWaWRlb0FWQzsKKyAgICBib29sIG1Jc1NlY3VyZTsKKyAgICBib29sIG1Jc0VuY3J5cHRlZDsKKyAgICBib29sIG1Jc0VuY3J5cHRlZE9ic2VydmVkRWFybGllcjsKKyAgICBib29sIG1Gb3JtYXRDaGFuZ2VQZW5kaW5nOworICAgIGJvb2wgbVRpbWVDaGFuZ2VQZW5kaW5nOworICAgIGZsb2F0IG1GcmFtZVJhdGVUb3RhbDsKKyAgICBmbG9hdCBtUGxheWJhY2tTcGVlZDsKKyAgICBpbnQzMl90IG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbDsKKyAgICBpbnQzMl90IG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJBbGxvd2VkOworICAgIGludDMyX3QgbUN1cnJlbnRNYXhWaWRlb1RlbXBvcmFsTGF5ZXJJZDsKKyAgICBmbG9hdCBtVmlkZW9UZW1wb3JhbExheWVyQWdncmVnYXRlRnBzW2tNYXhOdW1WaWRlb1RlbXBvcmFsTGF5ZXJzXTsKKworICAgIGJvb2wgbVJlc3VtZVBlbmRpbmc7CisgICAgQVN0cmluZyBtQ29tcG9uZW50TmFtZTsKKworICAgIHZvaWQgaGFuZGxlRXJyb3IoaW50MzJfdCBlcnIpOworICAgIGJvb2wgaGFuZGxlQW5JbnB1dEJ1ZmZlcihzaXplX3QgaW5kZXgpOworICAgIGJvb2wgaGFuZGxlQW5PdXRwdXRCdWZmZXIoCisgICAgICAgICAgICBzaXplX3QgaW5kZXgsCisgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0LAorICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywKKyAgICAgICAgICAgIGludDMyX3QgZmxhZ3MpOworICAgIHZvaWQgaGFuZGxlT3V0cHV0Rm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKKworICAgIHZvaWQgcmVsZWFzZUFuZFJlc2V0TWVkaWFCdWZmZXJzKCk7CisgICAgYm9vbCBpc1N0YWxlUmVwbHkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCisgICAgdm9pZCBkb0ZsdXNoKGJvb2wgbm90aWZ5Q29tcGxldGUpOworICAgIHN0YXR1c190IGZldGNoSW5wdXREYXRhKHNwPEFNZXNzYWdlPiAmcmVwbHkpOworICAgIGJvb2wgb25JbnB1dEJ1ZmZlckZldGNoZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgb25SZW5kZXJCdWZmZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCisgICAgYm9vbCBzdXBwb3J0c1NlYW1sZXNzRm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmdG8pIGNvbnN0OworICAgIGJvb2wgc3VwcG9ydHNTZWFtbGVzc0F1ZGlvRm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmdGFyZ2V0Rm9ybWF0KSBjb25zdDsKKyAgICB2b2lkIHJlbWVtYmVyQ29kZWNTcGVjaWZpY0RhdGEoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOworICAgIGJvb2wgaXNEaXNjb250aW51aXR5UGVuZGluZygpIGNvbnN0OworICAgIHZvaWQgZmluaXNoSGFuZGxlRGlzY29udGludWl0eShib29sIGZsdXNoT25UaW1lQ2hhbmdlKTsKKworICAgIHZvaWQgbm90aWZ5UmVzdW1lQ29tcGxldGVJZk5lY2Vzc2FyeSgpOworCisgICAgdm9pZCBvblJlbGVhc2VDcnlwdG8oY29uc3Qgc3A8QU1lc3NhZ2U+JiBtc2cpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRGVjb2Rlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE5VUExBWUVSMl9ERUNPREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXJCYXNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2RlckJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMTk4OGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXJCYXNlLmNwcApAQCAtMCwwICsxLDIxNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOdVBsYXllcjJEZWNvZGVyQmFzZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAiTnVQbGF5ZXIyRGVjb2RlckJhc2UuaCIKKworI2luY2x1ZGUgIk51UGxheWVyMlJlbmRlcmVyLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTnVQbGF5ZXIyOjpEZWNvZGVyQmFzZTo6RGVjb2RlckJhc2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCisgICAgOiAgbU5vdGlmeShub3RpZnkpLAorICAgICAgIG1CdWZmZXJHZW5lcmF0aW9uKDApLAorICAgICAgIG1QYXVzZWQoZmFsc2UpLAorICAgICAgIG1TdGF0cyhuZXcgQU1lc3NhZ2UpLAorICAgICAgIG1SZXF1ZXN0SW5wdXRCdWZmZXJzUGVuZGluZyhmYWxzZSkgeworICAgIC8vIEV2ZXJ5IGRlY29kZXIgaGFzIGl0cyBvd24gbG9vcGVyIGJlY2F1c2UgTWVkaWFDb2RlYyBvcGVyYXRpb25zCisgICAgLy8gYXJlIGJsb2NraW5nLCBidXQgTnVQbGF5ZXIyIG5lZWRzIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zLgorICAgIG1EZWNvZGVyTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgbURlY29kZXJMb29wZXItPnNldE5hbWUoIk5QRGVjb2RlciIpOworICAgIG1EZWNvZGVyTG9vcGVyLT5zdGFydChmYWxzZSwgLyogcnVuT25DYWxsaW5nVGhyZWFkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsICAvKiBjYW5DYWxsSmF2YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKK30KKworTnVQbGF5ZXIyOjpEZWNvZGVyQmFzZTo6fkRlY29kZXJCYXNlKCkgeworICAgIHN0b3BMb29wZXIoKTsKK30KKworc3RhdGljCitzdGF0dXNfdCBQb3N0QW5kQXdhaXRSZXNwb25zZSgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIHNwPEFNZXNzYWdlPiAqcmVzcG9uc2UpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKHJlc3BvbnNlKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoISgqcmVzcG9uc2UpLT5maW5kSW50MzIoImVyciIsICZlcnIpKSB7CisgICAgICAgIGVyciA9IE9LOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyQmFzZTo6Y29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbmZpZ3VyZSwgdGhpcyk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2RlckJhc2U6OmluaXQoKSB7CisgICAgbURlY29kZXJMb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXJCYXNlOjpzdG9wTG9vcGVyKCkgeworICAgIG1EZWNvZGVyTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihpZCgpKTsKKyAgICBtRGVjb2Rlckxvb3Blci0+c3RvcCgpOworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2RlckJhc2U6OnNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZwYXJhbXMpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0UGFyYW1ldGVycywgdGhpcyk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJwYXJhbXMiLCBwYXJhbXMpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2RlckJhc2U6OnNldFJlbmRlcmVyKGNvbnN0IHNwPFJlbmRlcmVyPiAmcmVuZGVyZXIpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0UmVuZGVyZXIsIHRoaXMpOworICAgIG1zZy0+c2V0T2JqZWN0KCJyZW5kZXJlciIsIHJlbmRlcmVyKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXJCYXNlOjpwYXVzZSgpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UGF1c2UsIHRoaXMpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXJCYXNlOjpzaWduYWxGbHVzaCgpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0Rmx1c2gsIHRoaXMpKS0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2RlckJhc2U6OnNpZ25hbFJlc3VtZShib29sIG5vdGlmeUNvbXBsZXRlKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlc3VtZSwgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQzMigibm90aWZ5Q29tcGxldGUiLCBub3RpZnlDb21wbGV0ZSk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyQmFzZTo6aW5pdGlhdGVTaHV0ZG93bigpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0U2h1dGRvd24sIHRoaXMpKS0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2RlckJhc2U6Om9uUmVxdWVzdElucHV0QnVmZmVycygpIHsKKyAgICBpZiAobVJlcXVlc3RJbnB1dEJ1ZmZlcnNQZW5kaW5nKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBkb1JlcXVlc3RCdWZmZXJzKCkgcmV0dXJuIHRydWUgaWYgd2Ugc2hvdWxkIHJlcXVlc3QgbW9yZSBkYXRhCisgICAgaWYgKGRvUmVxdWVzdEJ1ZmZlcnMoKSkgeworICAgICAgICBtUmVxdWVzdElucHV0QnVmZmVyc1BlbmRpbmcgPSB0cnVlOworCisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZXF1ZXN0SW5wdXRCdWZmZXJzLCB0aGlzKTsKKyAgICAgICAgbXNnLT5wb3N0KDEwICogMTAwMGxsKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyQmFzZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdENvbmZpZ3VyZToKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKTsKKyAgICAgICAgICAgIG9uQ29uZmlndXJlKGZvcm1hdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRTZXRQYXJhbWV0ZXJzOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcGFyYW1zOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgicGFyYW1zIiwgJnBhcmFtcykpOworICAgICAgICAgICAgb25TZXRQYXJhbWV0ZXJzKHBhcmFtcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRTZXRSZW5kZXJlcjoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJyZW5kZXJlciIsICZvYmopKTsKKyAgICAgICAgICAgIG9uU2V0UmVuZGVyZXIoc3RhdGljX2Nhc3Q8UmVuZGVyZXIgKj4ob2JqLmdldCgpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRQYXVzZToKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisKKyAgICAgICAgICAgIG1QYXVzZWQgPSB0cnVlOworCisgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UmVxdWVzdElucHV0QnVmZmVyczoKKyAgICAgICAgeworICAgICAgICAgICAgbVJlcXVlc3RJbnB1dEJ1ZmZlcnNQZW5kaW5nID0gZmFsc2U7CisgICAgICAgICAgICBvblJlcXVlc3RJbnB1dEJ1ZmZlcnMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEZsdXNoOgorICAgICAgICB7CisgICAgICAgICAgICBvbkZsdXNoKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRSZXN1bWU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3Qgbm90aWZ5Q29tcGxldGU7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigibm90aWZ5Q29tcGxldGUiLCAmbm90aWZ5Q29tcGxldGUpKTsKKworICAgICAgICAgICAgb25SZXN1bWUobm90aWZ5Q29tcGxldGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0U2h1dGRvd246CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uU2h1dGRvd24odHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2RlckJhc2U6OmhhbmRsZUVycm9yKGludDMyX3QgZXJyKQoreworICAgIC8vIFdlIGNhbm5vdCBpbW1lZGlhdGVseSByZWxlYXNlIHRoZSBjb2RlYyBkdWUgdG8gYnVmZmVycyBzdGlsbCBvdXRzdGFuZGluZworICAgIC8vIGluIHRoZSByZW5kZXJlci4gIFdlIHNpZ25hbCB0byB0aGUgcGxheWVyIHRoZSBlcnJvciBzbyBpdCBjYW4gc2h1dGRvd24vcmVsZWFzZSB0aGUKKyAgICAvLyBkZWNvZGVyIGFmdGVyIGZsdXNoaW5nIGFuZCBpbmNyZW1lbnQgdGhlIGdlbmVyYXRpb24gdG8gZGlzY2FyZCB1bm5lY2Vzc2FyeSBtZXNzYWdlcy4KKworICAgICsrbUJ1ZmZlckdlbmVyYXRpb247CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RXJyb3IpOworICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgbm90aWZ5LT5wb3N0KCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2RlckJhc2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2RlckJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTU3ZjBkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyQmFzZS5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE5VUExBWUVSMl9ERUNPREVSX0JBU0VfSF8KKworI2RlZmluZSBOVVBMQVlFUjJfREVDT0RFUl9CQVNFX0hfCisKKyNpbmNsdWRlICJOdVBsYXllcjIuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUJ1ZmZlcjsKK3N0cnVjdCBBTmF0aXZlV2luZG93V3JhcHBlcjsKK3N0cnVjdCBNZWRpYUNvZGVjOworY2xhc3MgTWVkaWFCdWZmZXI7CitjbGFzcyBNZWRpYUNvZGVjQnVmZmVyOworCitzdHJ1Y3QgTnVQbGF5ZXIyOjpEZWNvZGVyQmFzZSA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgZXhwbGljaXQgRGVjb2RlckJhc2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOworCisgICAgdm9pZCBjb25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOworICAgIHZvaWQgaW5pdCgpOworICAgIHZvaWQgc2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcyk7CisKKyAgICAvLyBTeW5jaHJvbm91cyBjYWxsIHRvIGVuc3VyZSBkZWNvZGVyIHdpbGwgbm90IHJlcXVlc3Qgb3Igc2VuZCBvdXQgZGF0YS4KKyAgICB2b2lkIHBhdXNlKCk7CisKKyAgICB2b2lkIHNldFJlbmRlcmVyKGNvbnN0IHNwPFJlbmRlcmVyPiAmcmVuZGVyZXIpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiAmKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfQorCisgICAgdm9pZCBzaWduYWxGbHVzaCgpOworICAgIHZvaWQgc2lnbmFsUmVzdW1lKGJvb2wgbm90aWZ5Q29tcGxldGUpOworICAgIHZvaWQgaW5pdGlhdGVTaHV0ZG93bigpOworCisgICAgdmlydHVhbCBzcDxBTWVzc2FnZT4gZ2V0U3RhdHMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU3RhdHM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQ3J5cHRvKCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgZW51bSB7CisgICAgICAgIGtXaGF0SW5wdXREaXNjb250aW51aXR5ICA9ICdpbkRpJywKKyAgICAgICAga1doYXRWaWRlb1NpemVDaGFuZ2VkICAgID0gJ3ZpU0MnLAorICAgICAgICBrV2hhdEZsdXNoQ29tcGxldGVkICAgICAgPSAnZmxzQycsCisgICAgICAgIGtXaGF0U2h1dGRvd25Db21wbGV0ZWQgICA9ICdzaERDJywKKyAgICAgICAga1doYXRSZXN1bWVDb21wbGV0ZWQgICAgID0gJ3Jlc0MnLAorICAgICAgICBrV2hhdEVPUyAgICAgICAgICAgICAgICAgPSAnZW9zICcsCisgICAgICAgIGtXaGF0RXJyb3IgICAgICAgICAgICAgICA9ICdlcnIgJywKKyAgICB9OworCitwcm90ZWN0ZWQ6CisKKyAgICB2aXJ0dWFsIH5EZWNvZGVyQmFzZSgpOworCisgICAgdm9pZCBzdG9wTG9vcGVyKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCisgICAgdmlydHVhbCB2b2lkIG9uQ29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG9uU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcykgPSAwOworICAgIHZpcnR1YWwgdm9pZCBvblNldFJlbmRlcmVyKGNvbnN0IHNwPFJlbmRlcmVyPiAmcmVuZGVyZXIpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgb25SZXN1bWUoYm9vbCBub3RpZnlDb21wbGV0ZSkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBvbkZsdXNoKCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBvblNodXRkb3duKGJvb2wgbm90aWZ5Q29tcGxldGUpID0gMDsKKworICAgIHZvaWQgb25SZXF1ZXN0SW5wdXRCdWZmZXJzKCk7CisgICAgdmlydHVhbCBib29sIGRvUmVxdWVzdEJ1ZmZlcnMoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGhhbmRsZUVycm9yKGludDMyX3QgZXJyKTsKKworICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OworICAgIGludDMyX3QgbUJ1ZmZlckdlbmVyYXRpb247CisgICAgYm9vbCBtUGF1c2VkOworICAgIHNwPEFNZXNzYWdlPiBtU3RhdHM7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0Q29uZmlndXJlICAgICAgICAgICA9ICdjb25mJywKKyAgICAgICAga1doYXRTZXRQYXJhbWV0ZXJzICAgICAgID0gJ3NldFAnLAorICAgICAgICBrV2hhdFNldFJlbmRlcmVyICAgICAgICAgPSAnc2V0UicsCisgICAgICAgIGtXaGF0UGF1c2UgICAgICAgICAgICAgICA9ICdwYXVzJywKKyAgICAgICAga1doYXRSZXF1ZXN0SW5wdXRCdWZmZXJzID0gJ3JlcUInLAorICAgICAgICBrV2hhdEZsdXNoICAgICAgICAgICAgICAgPSAnZmx1cycsCisgICAgICAgIGtXaGF0U2h1dGRvd24gICAgICAgICAgICA9ICdzaHVEJywKKyAgICB9OworCisgICAgc3A8QUxvb3Blcj4gbURlY29kZXJMb29wZXI7CisgICAgYm9vbCBtUmVxdWVzdElucHV0QnVmZmVyc1BlbmRpbmc7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEZWNvZGVyQmFzZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE5VUExBWUVSMl9ERUNPREVSX0JBU0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2RlclBhc3NUaHJvdWdoLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2RlclBhc3NUaHJvdWdoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTBjMWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyUGFzc1Rocm91Z2guY3BwCkBAIC0wLDAgKzEsNDM0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk51UGxheWVyMkRlY29kZXJQYXNzVGhyb3VnaCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAiTnVQbGF5ZXIyRGVjb2RlclBhc3NUaHJvdWdoLmgiCisKKyNpbmNsdWRlICJOdVBsYXllcjJSZW5kZXJlci5oIgorI2luY2x1ZGUgIk51UGxheWVyMlNvdXJjZS5oIgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisKKyNpbmNsdWRlICJBVFNQYXJzZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBUT0RPIG9wdGltaXplIGJ1ZmZlciBzaXplIGZvciBwb3dlciBjb25zdW1wdGlvbgorLy8gVGhlIG9mZmxvYWQgcmVhZCBidWZmZXIgc2l6ZSBpcyAzMiBLQiBidXQgMjQgS0IgdXNlcyBsZXNzIHBvd2VyLgorc3RhdGljIGNvbnN0IHNpemVfdCBrQWdncmVnYXRlQnVmZmVyU2l6ZUJ5dGVzID0gMjQgKiAxMDI0Oworc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4Q2FjaGVkQnl0ZXMgPSAyMDAwMDA7CisKK051UGxheWVyMjo6RGVjb2RlclBhc3NUaHJvdWdoOjpEZWNvZGVyUGFzc1Rocm91Z2goCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICBjb25zdCBzcDxTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgIGNvbnN0IHNwPFJlbmRlcmVyPiAmcmVuZGVyZXIpCisgICAgOiBEZWNvZGVyQmFzZShub3RpZnkpLAorICAgICAgbVNvdXJjZShzb3VyY2UpLAorICAgICAgbVJlbmRlcmVyKHJlbmRlcmVyKSwKKyAgICAgIG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVcygtMWxsKSwKKyAgICAgIG1SZWFjaGVkRU9TKHRydWUpLAorICAgICAgbVBlbmRpbmdBdWRpb0VycihPSyksCisgICAgICBtUGVuZGluZ0J1ZmZlcnNUb0RyYWluKDApLAorICAgICAgbUNhY2hlZEJ5dGVzKDApLAorICAgICAgbUNvbXBvbmVudE5hbWUoInBhc3MgdGhyb3VnaCBkZWNvZGVyIikgeworICAgIEFMT0dXX0lGKHJlbmRlcmVyID09IE5VTEwsICJleHBlY3QgYSBub24tTlVMTCByZW5kZXJlciIpOworfQorCitOdVBsYXllcjI6OkRlY29kZXJQYXNzVGhyb3VnaDo6fkRlY29kZXJQYXNzVGhyb3VnaCgpIHsKK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXJQYXNzVGhyb3VnaDo6b25Db25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKKyAgICBBTE9HVigiWyVzXSBvbkNvbmZpZ3VyZSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgIG1DYWNoZWRCeXRlcyA9IDA7CisgICAgbVBlbmRpbmdCdWZmZXJzVG9EcmFpbiA9IDA7CisgICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKKyAgICArK21CdWZmZXJHZW5lcmF0aW9uOworCisgICAgb25SZXF1ZXN0SW5wdXRCdWZmZXJzKCk7CisKKyAgICBpbnQzMl90IGhhc1ZpZGVvID0gMDsKKyAgICBmb3JtYXQtPmZpbmRJbnQzMigiaGFzLXZpZGVvIiwgJmhhc1ZpZGVvKTsKKworICAgIC8vIFRoZSBhdWRpbyBzaW5rIGlzIGFscmVhZHkgb3BlbmVkIGJlZm9yZSB0aGUgUGFzc1Rocm91Z2ggZGVjb2RlciBpcyBjcmVhdGVkLgorICAgIC8vIE9wZW5pbmcgYWdhaW4gbWlnaHQgYmUgcmVsZXZhbnQgaWYgZGVjb2RlciBpcyBpbnN0YW50aWF0ZWQgYWZ0ZXIgc2h1dGRvd24gYW5kCisgICAgLy8gZm9ybWF0IGlzIGRpZmZlcmVudC4KKyAgICBzdGF0dXNfdCBlcnIgPSBtUmVuZGVyZXItPm9wZW5BdWRpb1NpbmsoCisgICAgICAgICAgICBmb3JtYXQsIHRydWUgLyogb2ZmbG9hZE9ubHkgKi8sIGhhc1ZpZGVvLAorICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSAvKiBmbGFncyAqLywgTlVMTCAvKiBpc09mZmxvYWRlZCAqLywgbVNvdXJjZS0+aXNTdHJlYW1pbmcoKSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBoYW5kbGVFcnJvcihlcnIpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXJQYXNzVGhyb3VnaDo6b25TZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmLypwYXJhbXMqLykgeworICAgIEFMT0dXKCJvblNldFBhcmFtZXRlcnMoKSBjYWxsZWQgdW5leHBlY3RlZGx5Iik7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyUGFzc1Rocm91Z2g6Om9uU2V0UmVuZGVyZXIoCisgICAgICAgIGNvbnN0IHNwPFJlbmRlcmVyPiAmcmVuZGVyZXIpIHsKKyAgICAvLyByZW5kZXJlciBjYW4ndCBiZSBjaGFuZ2VkIGR1cmluZyBvZmZsb2FkaW5nCisgICAgQUxPR1dfSUYocmVuZGVyZXIgIT0gbVJlbmRlcmVyLAorICAgICAgICAgICAgImlnbm9yaW5nIHJlcXVlc3QgdG8gY2hhbmdlIHJlbmRlcmVyIik7Cit9CisKK2Jvb2wgTnVQbGF5ZXIyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OmlzU3RhbGVSZXBseShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgcmV0dXJuIGdlbmVyYXRpb24gIT0gbUJ1ZmZlckdlbmVyYXRpb247Cit9CisKK2Jvb2wgTnVQbGF5ZXIyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OmlzRG9uZUZldGNoaW5nKCkgY29uc3QgeworICAgIEFMT0dWKCJbJXNdIG1DYWNoZWRCeXRlcyA9ICV6dSwgbVJlYWNoZWRFT1MgPSAlZCBtUGF1c2VkID0gJWQiLAorICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgbUNhY2hlZEJ5dGVzLCBtUmVhY2hlZEVPUywgbVBhdXNlZCk7CisKKyAgICByZXR1cm4gbUNhY2hlZEJ5dGVzID49IGtNYXhDYWNoZWRCeXRlcyB8fCBtUmVhY2hlZEVPUyB8fCBtUGF1c2VkOworfQorCisvKgorICogcmV0dXJucyB0cnVlIGlmIHdlIHNob3VsZCByZXF1ZXN0IG1vcmUgZGF0YQorICovCitib29sIE51UGxheWVyMjo6RGVjb2RlclBhc3NUaHJvdWdoOjpkb1JlcXVlc3RCdWZmZXJzKCkgeworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIHdoaWxlICghaXNEb25lRmV0Y2hpbmcoKSkgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCk7CisKKyAgICAgICAgZXJyID0gZmV0Y2hJbnB1dERhdGEobXNnKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBvbklucHV0QnVmZmVyRmV0Y2hlZChtc2cpOworICAgIH0KKworICAgIHJldHVybiBlcnIgPT0gLUVXT1VMREJMT0NLCisgICAgICAgICAgICAmJiBtU291cmNlLT5mZWVkTW9yZVRTRGF0YSgpID09IE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OkRlY29kZXJQYXNzVGhyb3VnaDo6ZGVxdWV1ZUFjY2Vzc1VuaXQoc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpIHsKKyAgICBzdGF0dXNfdCBlcnI7CisKKyAgICAvLyBEaWQgd2Ugc2F2ZSBhbiBhY2Nlc3NVbml0IGVhcmxpZXIgYmVjYXVzZSBvZiBhIGRpc2NvbnRpbnVpdHk/CisgICAgaWYgKG1QZW5kaW5nQXVkaW9BY2Nlc3NVbml0ICE9IE5VTEwpIHsKKyAgICAgICAgKmFjY2Vzc1VuaXQgPSBtUGVuZGluZ0F1ZGlvQWNjZXNzVW5pdDsKKyAgICAgICAgbVBlbmRpbmdBdWRpb0FjY2Vzc1VuaXQuY2xlYXIoKTsKKyAgICAgICAgZXJyID0gbVBlbmRpbmdBdWRpb0VycjsKKyAgICAgICAgQUxPR1YoImZlZWREZWNvZGVySW5wdXREYXRhKCkgdXNlIG1QZW5kaW5nQXVkaW9BY2Nlc3NVbml0Iik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyID0gbVNvdXJjZS0+ZGVxdWV1ZUFjY2Vzc1VuaXQodHJ1ZSAvKiBhdWRpbyAqLywgYWNjZXNzVW5pdCk7CisgICAgfQorCisgICAgaWYgKGVyciA9PSBJTkZPX0RJU0NPTlRJTlVJVFkgfHwgZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgaWYgKG1BZ2dyZWdhdGVCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgLy8gV2UgYWxyZWFkeSBoYXZlIHNvbWUgZGF0YSBzbyBzYXZlIHRoaXMgZm9yIGxhdGVyLgorICAgICAgICAgICAgbVBlbmRpbmdBdWRpb0VyciA9IGVycjsKKyAgICAgICAgICAgIG1QZW5kaW5nQXVkaW9BY2Nlc3NVbml0ID0gKmFjY2Vzc1VuaXQ7CisgICAgICAgICAgICAoKmFjY2Vzc1VuaXQpLmNsZWFyKCk7CisgICAgICAgICAgICBBTE9HRCgicmV0dXJuIGFnZ3JlZ2F0ZWQgYnVmZmVyIGFuZCBzYXZlIGVycig9JWQpIGZvciBsYXRlciIsIGVycik7CisgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3NwPEFCdWZmZXI+IE51UGxheWVyMjo6RGVjb2RlclBhc3NUaHJvdWdoOjphZ2dyZWdhdGVCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KSB7CisgICAgc3A8QUJ1ZmZlcj4gYWdncmVnYXRlOworCisgICAgaWYgKGFjY2Vzc1VuaXQgPT0gTlVMTCkgeworICAgICAgICAvLyBhY2Nlc3NVbml0IGlzIHNhdmVkIHRvIG1QZW5kaW5nQXVkaW9BY2Nlc3NVbml0CisgICAgICAgIC8vIHJldHVybiBjdXJyZW50IG1BZ2dyZWdhdGVCdWZmZXIKKyAgICAgICAgYWdncmVnYXRlID0gbUFnZ3JlZ2F0ZUJ1ZmZlcjsKKyAgICAgICAgbUFnZ3JlZ2F0ZUJ1ZmZlci5jbGVhcigpOworICAgICAgICByZXR1cm4gYWdncmVnYXRlOworICAgIH0KKworICAgIHNpemVfdCBzbWFsbFNpemUgPSBhY2Nlc3NVbml0LT5zaXplKCk7CisgICAgaWYgKChtQWdncmVnYXRlQnVmZmVyID09IE5VTEwpCisgICAgICAgICAgICAvLyBEb24ndCBib3RoZXIgaWYgb25seSByb29tIGZvciBhIGZldyBzbWFsbCBidWZmZXJzLgorICAgICAgICAgICAgJiYgKHNtYWxsU2l6ZSA8IChrQWdncmVnYXRlQnVmZmVyU2l6ZUJ5dGVzIC8gMykpKSB7CisgICAgICAgIC8vIENyZWF0ZSBhIGxhcmdlciBidWZmZXIgZm9yIGNvbWJpbmluZyBzbWFsbGVyIGJ1ZmZlcnMgZnJvbSB0aGUgZXh0cmFjdG9yLgorICAgICAgICBtQWdncmVnYXRlQnVmZmVyID0gbmV3IEFCdWZmZXIoa0FnZ3JlZ2F0ZUJ1ZmZlclNpemVCeXRlcyk7CisgICAgICAgIG1BZ2dyZWdhdGVCdWZmZXItPnNldFJhbmdlKDAsIDApOyAvLyBzdGFydCBlbXB0eQorICAgIH0KKworICAgIGlmIChtQWdncmVnYXRlQnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgIGludDY0X3QgZHVtbXk7CisgICAgICAgIGJvb2wgc21hbGxUaW1lc3RhbXBWYWxpZCA9IGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKTsKKyAgICAgICAgYm9vbCBiaWdUaW1lc3RhbXBWYWxpZCA9IG1BZ2dyZWdhdGVCdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmZHVtbXkpOworICAgICAgICAvLyBXaWxsIHRoZSBzbWFsbGVyIGJ1ZmZlciBmaXQ/CisgICAgICAgIHNpemVfdCBiaWdTaXplID0gbUFnZ3JlZ2F0ZUJ1ZmZlci0+c2l6ZSgpOworICAgICAgICBzaXplX3Qgcm9vbUxlZnQgPSBtQWdncmVnYXRlQnVmZmVyLT5jYXBhY2l0eSgpIC0gYmlnU2l6ZTsKKyAgICAgICAgLy8gU2hvdWxkIHdlIHNhdmUgdGhpcyBzbWFsbCBidWZmZXIgZm9yIHRoZSBuZXh0IGJpZyBidWZmZXI/CisgICAgICAgIC8vIElmIHRoZSBmaXJzdCBzbWFsbCBidWZmZXIgZGlkIG5vdCBoYXZlIGEgdGltZXN0YW1wIHRoZW4gc2F2ZQorICAgICAgICAvLyBhbnkgYnVmZmVyIHRoYXQgZG9lcyBoYXZlIGEgdGltZXN0YW1wIHVudGlsIHRoZSBuZXh0IGJpZyBidWZmZXIuCisgICAgICAgIGlmICgoc21hbGxTaXplID4gcm9vbUxlZnQpCisgICAgICAgICAgICB8fCAoIWJpZ1RpbWVzdGFtcFZhbGlkICYmIChiaWdTaXplID4gMCkgJiYgc21hbGxUaW1lc3RhbXBWYWxpZCkpIHsKKyAgICAgICAgICAgIG1QZW5kaW5nQXVkaW9FcnIgPSBPSzsKKyAgICAgICAgICAgIG1QZW5kaW5nQXVkaW9BY2Nlc3NVbml0ID0gYWNjZXNzVW5pdDsKKyAgICAgICAgICAgIGFnZ3JlZ2F0ZSA9IG1BZ2dyZWdhdGVCdWZmZXI7CisgICAgICAgICAgICBtQWdncmVnYXRlQnVmZmVyLmNsZWFyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBHcmFiIHRpbWUgZnJvbSBmaXJzdCBzbWFsbCBidWZmZXIgaWYgYXZhaWxhYmxlLgorICAgICAgICAgICAgaWYgKChiaWdTaXplID09IDApICYmIHNtYWxsVGltZXN0YW1wVmFsaWQpIHsKKyAgICAgICAgICAgICAgICBtQWdncmVnYXRlQnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQXBwZW5kIHNtYWxsIGJ1ZmZlciB0byB0aGUgYmlnZ2VyIGJ1ZmZlci4KKyAgICAgICAgICAgIG1lbWNweShtQWdncmVnYXRlQnVmZmVyLT5iYXNlKCkgKyBiaWdTaXplLCBhY2Nlc3NVbml0LT5kYXRhKCksIHNtYWxsU2l6ZSk7CisgICAgICAgICAgICBiaWdTaXplICs9IHNtYWxsU2l6ZTsKKyAgICAgICAgICAgIG1BZ2dyZWdhdGVCdWZmZXItPnNldFJhbmdlKDAsIGJpZ1NpemUpOworCisgICAgICAgICAgICBBTE9HVigiZmVlZERlY29kZXJJbnB1dERhdGEoKSBzbWFsbFNpemUgPSAlenUsIGJpZ1NpemUgPSAlenUsIGNhcGFjaXR5ID0gJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgc21hbGxTaXplLCBiaWdTaXplLCBtQWdncmVnYXRlQnVmZmVyLT5jYXBhY2l0eSgpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGRlY2lkZWQgbm90IHRvIGFnZ3JlZ2F0ZQorICAgICAgICBhZ2dyZWdhdGUgPSBhY2Nlc3NVbml0OworICAgIH0KKworICAgIHJldHVybiBhZ2dyZWdhdGU7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6RGVjb2RlclBhc3NUaHJvdWdoOjpmZXRjaElucHV0RGF0YShzcDxBTWVzc2FnZT4gJnJlcGx5KSB7CisgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdDsKKworICAgIGRvIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gZGVxdWV1ZUFjY2Vzc1VuaXQoJmFjY2Vzc1VuaXQpOworCisgICAgICAgIGlmIChlcnIgPT0gLUVXT1VMREJMT0NLKSB7CisgICAgICAgICAgICAvLyBGbHVzaCBvdXQgdGhlIGFnZ3JlZ2F0ZSBidWZmZXIgdG8gdHJ5IHRvIGF2b2lkIHVuZGVycnVuLgorICAgICAgICAgICAgYWNjZXNzVW5pdCA9IGFnZ3JlZ2F0ZUJ1ZmZlcihOVUxMIC8qIGFjY2Vzc1VuaXQgKi8pOworICAgICAgICAgICAgaWYgKGFjY2Vzc1VuaXQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gSU5GT19ESVNDT05USU5VSVRZKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCB0eXBlOworICAgICAgICAgICAgICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5IiwgJnR5cGUpKTsKKworICAgICAgICAgICAgICAgIGJvb2wgZm9ybWF0Q2hhbmdlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlICYgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0FVRElPX0ZPUk1BVCkgIT0gMDsKKworICAgICAgICAgICAgICAgIGJvb2wgdGltZUNoYW5nZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSAmIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9USU1FKSAhPSAwOworCisgICAgICAgICAgICAgICAgQUxPR0koImF1ZGlvIGRpc2NvbnRpbnVpdHkgKGZvcm1hdENoYW5nZT0lZCwgdGltZT0lZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0Q2hhbmdlLCB0aW1lQ2hhbmdlKTsKKworICAgICAgICAgICAgICAgIGlmIChmb3JtYXRDaGFuZ2UgfHwgdGltZUNoYW5nZSkgeworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoIndoYXQiLCBrV2hhdElucHV0RGlzY29udGludWl0eSk7CisgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgcGVyZm9ybSBzZWFtbGVzcyBmb3JtYXQgY2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IG5vdGlmeSBOdVBsYXllcjIgdG8gc2NhbiBzb3VyY2VzCisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImZvcm1hdENoYW5nZSIsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRpbWVDaGFuZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgZG9GbHVzaChmYWxzZSAvKiBub3RpZnlDb21wbGV0ZSAqLyk7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0Q2hhbmdlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGRvIHNlYW1sZXNzIGZvcm1hdCBjaGFuZ2UKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBzdHJlYW0gaXMgdW5hZmZlY3RlZCBieSB0aGUgZGlzY29udGludWl0eQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVwbHktPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgYWNjZXNzVW5pdCA9IGFnZ3JlZ2F0ZUJ1ZmZlcihhY2Nlc3NVbml0KTsKKyAgICB9IHdoaWxlIChhY2Nlc3NVbml0ID09IE5VTEwpOworCisjaWYgMAorICAgIGludDY0X3QgbWVkaWFUaW1lVXM7CisgICAgQ0hFQ0soYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZtZWRpYVRpbWVVcykpOworICAgIEFMT0dWKCJmZWVkaW5nIGF1ZGlvIGlucHV0IGJ1ZmZlciBhdCBtZWRpYSB0aW1lICUuMmYgc2VjcyIsCisgICAgICAgICBtZWRpYVRpbWVVcyAvIDFFNik7CisjZW5kaWYKKworICAgIHJlcGx5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIGFjY2Vzc1VuaXQpOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2RlclBhc3NUaHJvdWdoOjpvbklucHV0QnVmZmVyRmV0Y2hlZCgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpZiAobVJlYWNoZWRFT1MpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICBib29sIGhhc0J1ZmZlciA9IG1zZy0+ZmluZEJ1ZmZlcigiYnVmZmVyIiwgJmJ1ZmZlcik7CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIGludDMyX3Qgc3RyZWFtRXJyID0gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZzdHJlYW1FcnIpIHx8ICFoYXNCdWZmZXIpOworICAgICAgICBpZiAoc3RyZWFtRXJyID09IE9LKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RyZWFtRXJyICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIGhhbmRsZUVycm9yKHN0cmVhbUVycik7CisgICAgICAgIH0KKyAgICAgICAgbVJlYWNoZWRFT1MgPSB0cnVlOworICAgICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1SZW5kZXJlci0+cXVldWVFT1ModHJ1ZSAvKiBhdWRpbyAqLywgRVJST1JfRU5EX09GX1NUUkVBTSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBleHRyYTsKKyAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRNZXNzYWdlKCJleHRyYSIsICZleHRyYSkgJiYgZXh0cmEgIT0gTlVMTCkgeworICAgICAgICBpbnQ2NF90IHJlc3VtZUF0TWVkaWFUaW1lVXM7CisgICAgICAgIGlmIChleHRyYS0+ZmluZEludDY0KAorICAgICAgICAgICAgICAgICAgICAicmVzdW1lLWF0LW1lZGlhdGltZVVzIiwgJnJlc3VtZUF0TWVkaWFUaW1lVXMpKSB7CisgICAgICAgICAgICBBTE9HSSgiWyVzXSBzdXBwcmVzc2luZyByZW5kZXJpbmcgdW50aWwgJWxsZCB1cyIsCisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIChsb25nIGxvbmcpcmVzdW1lQXRNZWRpYVRpbWVVcyk7CisgICAgICAgICAgICBtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXMgPSByZXN1bWVBdE1lZGlhVGltZVVzOworICAgICAgICB9CisgICAgfQorCisgICAgaW50MzJfdCBidWZmZXJTaXplID0gYnVmZmVyLT5zaXplKCk7CisgICAgbUNhY2hlZEJ5dGVzICs9IGJ1ZmZlclNpemU7CisKKyAgICBpbnQ2NF90IHRpbWVVcyA9IDA7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworICAgIGlmIChtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXMgPj0gMCkgeworICAgICAgICBpZiAodGltZVVzIDwgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzKSB7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBkcm9wcGluZyBidWZmZXIgYXQgdGltZSAlbGxkIGFzIHJlcXVlc3RlZC4iLAorICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgKGxvbmcgbG9uZyl0aW1lVXMpOworCisgICAgICAgICAgICBvbkJ1ZmZlckNvbnN1bWVkKGJ1ZmZlclNpemUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzID0gLTE7CisgICAgfQorCisgICAgaWYgKG1SZW5kZXJlciA9PSBOVUxMKSB7CisgICAgICAgIG9uQnVmZmVyQ29uc3VtZWQoYnVmZmVyU2l6ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRCdWZmZXJDb25zdW1lZCwgdGhpcyk7CisgICAgcmVwbHktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUJ1ZmZlckdlbmVyYXRpb24pOworICAgIHJlcGx5LT5zZXRJbnQzMigic2l6ZSIsIGJ1ZmZlclNpemUpOworCisgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gbWNCdWZmZXIgPSBuZXcgTWVkaWFDb2RlY0J1ZmZlcihudWxscHRyLCBidWZmZXIpOworICAgIG1jQnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworCisgICAgbVJlbmRlcmVyLT5xdWV1ZUJ1ZmZlcih0cnVlIC8qIGF1ZGlvICovLCBtY0J1ZmZlciwgcmVwbHkpOworCisgICAgKyttUGVuZGluZ0J1ZmZlcnNUb0RyYWluOworICAgIEFMT0dWKCJvbklucHV0QnVmZmVyRmlsbGVkOiAjVG9EcmFpbiA9ICV6dSwgY2FjaGVkQnl0ZXMgPSAlenUiLAorICAgICAgICAgICAgbVBlbmRpbmdCdWZmZXJzVG9EcmFpbiwgbUNhY2hlZEJ5dGVzKTsKK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXJQYXNzVGhyb3VnaDo6b25CdWZmZXJDb25zdW1lZChpbnQzMl90IHNpemUpIHsKKyAgICAtLW1QZW5kaW5nQnVmZmVyc1RvRHJhaW47CisgICAgbUNhY2hlZEJ5dGVzIC09IHNpemU7CisgICAgQUxPR1YoIm9uQnVmZmVyQ29uc3VtZWQ6ICNUb0RyYWluID0gJXp1LCBjYWNoZWRCeXRlcyA9ICV6dSIsCisgICAgICAgICAgICBtUGVuZGluZ0J1ZmZlcnNUb0RyYWluLCBtQ2FjaGVkQnl0ZXMpOworICAgIG9uUmVxdWVzdElucHV0QnVmZmVycygpOworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2RlclBhc3NUaHJvdWdoOjpvblJlc3VtZShib29sIG5vdGlmeUNvbXBsZXRlKSB7CisgICAgbVBhdXNlZCA9IGZhbHNlOworCisgICAgb25SZXF1ZXN0SW5wdXRCdWZmZXJzKCk7CisKKyAgICBpZiAobm90aWZ5Q29tcGxldGUpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRSZXN1bWVDb21wbGV0ZWQpOworICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OmRvRmx1c2goYm9vbCBub3RpZnlDb21wbGV0ZSkgeworICAgICsrbUJ1ZmZlckdlbmVyYXRpb247CisgICAgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzID0gLTE7CisgICAgbVBlbmRpbmdBdWRpb0FjY2Vzc1VuaXQuY2xlYXIoKTsKKyAgICBtUGVuZGluZ0F1ZGlvRXJyID0gT0s7CisgICAgbUFnZ3JlZ2F0ZUJ1ZmZlci5jbGVhcigpOworCisgICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7CisgICAgICAgIG1SZW5kZXJlci0+Zmx1c2godHJ1ZSAvKiBhdWRpbyAqLywgbm90aWZ5Q29tcGxldGUpOworICAgICAgICBtUmVuZGVyZXItPnNpZ25hbFRpbWVEaXNjb250aW51aXR5KCk7CisgICAgfQorCisgICAgbVBlbmRpbmdCdWZmZXJzVG9EcmFpbiA9IDA7CisgICAgbUNhY2hlZEJ5dGVzID0gMDsKKyAgICBtUmVhY2hlZEVPUyA9IGZhbHNlOworfQorCit2b2lkIE51UGxheWVyMjo6RGVjb2RlclBhc3NUaHJvdWdoOjpvbkZsdXNoKCkgeworICAgIGRvRmx1c2godHJ1ZSAvKiBub3RpZnlDb21wbGV0ZSAqLyk7CisKKyAgICBtUGF1c2VkID0gdHJ1ZTsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0Rmx1c2hDb21wbGV0ZWQpOworICAgIG5vdGlmeS0+cG9zdCgpOworCit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyUGFzc1Rocm91Z2g6Om9uU2h1dGRvd24oYm9vbCBub3RpZnlDb21wbGV0ZSkgeworICAgICsrbUJ1ZmZlckdlbmVyYXRpb247CisgICAgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzID0gLTE7CisKKyAgICBpZiAobm90aWZ5Q29tcGxldGUpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRTaHV0ZG93bkNvbXBsZXRlZCk7CisgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgIH0KKworICAgIG1SZWFjaGVkRU9TID0gdHJ1ZTsKK30KKwordm9pZCBOdVBsYXllcjI6OkRlY29kZXJQYXNzVGhyb3VnaDo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBBTE9HVigiWyVzXSBvbk1lc3NhZ2U6ICVzIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdEJ1ZmZlckNvbnN1bWVkOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWlzU3RhbGVSZXBseShtc2cpKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBzaXplOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzaXplIiwgJnNpemUpKTsKKyAgICAgICAgICAgICAgICBvbkJ1ZmZlckNvbnN1bWVkKHNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgRGVjb2RlckJhc2U6Om9uTWVzc2FnZVJlY2VpdmVkKG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXJQYXNzVGhyb3VnaC5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyUGFzc1Rocm91Z2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzhjNjBhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyUGFzc1Rocm91Z2guaApAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE5VUExBWUVSMl9ERUNPREVSX1BBU1NfVEhST1VHSF9IXworCisjZGVmaW5lIE5VUExBWUVSMl9ERUNPREVSX1BBU1NfVEhST1VHSF9IXworCisjaW5jbHVkZSAiTnVQbGF5ZXIyLmgiCisKKyNpbmNsdWRlICJOdVBsYXllcjJEZWNvZGVyQmFzZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBOdVBsYXllcjI6OkRlY29kZXJQYXNzVGhyb3VnaCA6IHB1YmxpYyBEZWNvZGVyQmFzZSB7CisgICAgRGVjb2RlclBhc3NUaHJvdWdoKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFJlbmRlcmVyPiAmcmVuZGVyZXIpOworCitwcm90ZWN0ZWQ6CisKKyAgICB2aXJ0dWFsIH5EZWNvZGVyUGFzc1Rocm91Z2goKTsKKworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25Db25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOworICAgIHZpcnR1YWwgdm9pZCBvblNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZwYXJhbXMpOworICAgIHZpcnR1YWwgdm9pZCBvblNldFJlbmRlcmVyKGNvbnN0IHNwPFJlbmRlcmVyPiAmcmVuZGVyZXIpOworICAgIHZpcnR1YWwgdm9pZCBvblJlc3VtZShib29sIG5vdGlmeUNvbXBsZXRlKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25GbHVzaCgpOworICAgIHZpcnR1YWwgdm9pZCBvblNodXRkb3duKGJvb2wgbm90aWZ5Q29tcGxldGUpOworICAgIHZpcnR1YWwgYm9vbCBkb1JlcXVlc3RCdWZmZXJzKCk7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0QnVmZmVyQ29uc3VtZWQgICAgID0gJ2J1ZkMnLAorICAgIH07CisKKyAgICBzcDxTb3VyY2U+IG1Tb3VyY2U7CisgICAgc3A8UmVuZGVyZXI+IG1SZW5kZXJlcjsKKyAgICBpbnQ2NF90IG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVczsKKworICAgIGJvb2wgICAgbVJlYWNoZWRFT1M7CisKKyAgICAvLyBVc2VkIGJ5IGZlZWREZWNvZGVySW5wdXREYXRhIHRvIGFnZ3JlZ2F0ZSBzbWFsbCBidWZmZXJzIGludG8KKyAgICAvLyBvbmUgbGFyZ2UgYnVmZmVyLgorICAgIHNwPEFCdWZmZXI+IG1QZW5kaW5nQXVkaW9BY2Nlc3NVbml0OworICAgIHN0YXR1c190ICAgIG1QZW5kaW5nQXVkaW9FcnI7CisgICAgc3A8QUJ1ZmZlcj4gbUFnZ3JlZ2F0ZUJ1ZmZlcjsKKworICAgIC8vIG1QZW5kaW5nQnVmZmVyc1RvRHJhaW4gYXJlIG9ubHkgZm9yIGRlYnVnZ2luZy4gSXQgY2FuIGJlIHJlbW92ZWQKKyAgICAvLyB3aGVuIHRoZSBwb3dlciBpbnZlc3RpZ2F0aW9uIGlzIGRvbmUuCisgICAgc2l6ZV90ICBtUGVuZGluZ0J1ZmZlcnNUb0RyYWluOworICAgIHNpemVfdCAgbUNhY2hlZEJ5dGVzOworICAgIEFTdHJpbmcgbUNvbXBvbmVudE5hbWU7CisKKyAgICBib29sIGlzU3RhbGVSZXBseShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgYm9vbCBpc0RvbmVGZXRjaGluZygpIGNvbnN0OworCisgICAgc3RhdHVzX3QgZGVxdWV1ZUFjY2Vzc1VuaXQoc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpOworICAgIHNwPEFCdWZmZXI+IGFnZ3JlZ2F0ZUJ1ZmZlcihjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCk7CisgICAgc3RhdHVzX3QgZmV0Y2hJbnB1dERhdGEoc3A8QU1lc3NhZ2U+ICZyZXBseSk7CisgICAgdm9pZCBkb0ZsdXNoKGJvb2wgbm90aWZ5Q29tcGxldGUpOworCisgICAgdm9pZCBvbklucHV0QnVmZmVyRmV0Y2hlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBvbkJ1ZmZlckNvbnN1bWVkKGludDMyX3Qgc2l6ZSk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEZWNvZGVyUGFzc1Rocm91Z2gpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBOVVBMQVlFUjJfREVDT0RFUl9QQVNTX1RIUk9VR0hfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJpdmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJpdmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2QxN2E1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuY3BwCkBAIC0wLDAgKzEsMTA4OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOdVBsYXllcjJEcml2ZXIiCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisjaW5jbHVkZSAiTnVQbGF5ZXIyRHJpdmVyLmgiCisKKyNpbmNsdWRlICJOdVBsYXllcjIuaCIKKyNpbmNsdWRlICJOdVBsYXllcjJTb3VyY2UuaCIKKworI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VEZXNjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKworI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUFuYWx5dGljc1NlcnZpY2UuaD4KKworc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tSZXRyaWVzID0gNTA7CitzdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1NsZWVwVXMgPSAyMDAwMDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgUGFyY2VsV3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBzdGF0aWMgc3A8UGFyY2VsV3JhcHBlcj4gQ3JlYXRlKGNvbnN0IFBhcmNlbCAqcCkgeworICAgICAgICBpZiAocCAhPSBOVUxMKSB7CisgICAgICAgICAgICBzcDxQYXJjZWxXcmFwcGVyPiBwdyA9IG5ldyBQYXJjZWxXcmFwcGVyKCk7CisgICAgICAgICAgICBpZiAocHctPmFwcGVuZEZyb20ocCkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgY29uc3QgUGFyY2VsICpnZXRQYXJjZWwoKSB7CisgICAgICAgIHJldHVybiBtUGFyY2VsOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflBhcmNlbFdyYXBwZXIoKSB7CisgICAgICAgIGlmIChtUGFyY2VsICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBtUGFyY2VsOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIFBhcmNlbFdyYXBwZXIoKQorICAgICAgICA6IG1QYXJjZWwoTlVMTCkgeyB9CisKKyAgICBzdGF0dXNfdCBhcHBlbmRGcm9tKGNvbnN0IFBhcmNlbCAqcCkgeworICAgICAgICBpZiAobVBhcmNlbCA9PSBOVUxMKSB7CisgICAgICAgICAgICBtUGFyY2VsID0gbmV3IFBhcmNlbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVBhcmNlbC0+YXBwZW5kRnJvbShwLCAwIC8qIHN0YXJ0ICovLCBwLT5kYXRhU2l6ZSgpKTsKKyAgICB9CisKKyAgICBQYXJjZWwgKm1QYXJjZWw7Cit9OworCisvLyBrZXkgZm9yIG1lZGlhIHN0YXRpc3RpY3MKK3N0YXRpYyBjb25zdCBjaGFyICprS2V5UGxheWVyID0gIm51cGxheWVyIjsKKy8vIGF0dHJzIGZvciBtZWRpYSBzdGF0aXN0aWNzCisgICAgLy8gTkI6IHRoZXNlIGFyZSBtYXRjaGVkIHdpdGggcHVibGljIEphdmEgQVBJIGNvbnN0YW50cyBkZWZpbmVkCisgICAgLy8gaW4gZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXllcjIuamF2YQorICAgIC8vIFRoZXNlIG11c3QgYmUga2VwdCBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgY29uc3RhbnRzIHRoZXJlLgorc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJWTWltZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnZpZGVvLm1pbWUiOworc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJWQ29kZWMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci52aWRlby5jb2RlYyI7CitzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllcldpZHRoID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIud2lkdGgiOworc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJIZWlnaHQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5oZWlnaHQiOworc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJGcmFtZXMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5mcmFtZXMiOworc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJGcmFtZXNEcm9wcGVkID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHJvcHBlZCI7CitzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckFNaW1lID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuYXVkaW8ubWltZSI7CitzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckFDb2RlYyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmF1ZGlvLmNvZGVjIjsKK3N0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRHVyYXRpb24gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5kdXJhdGlvbk1zIjsKK3N0YXRpYyBjb25zdCBjaGFyICprUGxheWVyUGxheWluZyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnBsYXlpbmdNcyI7CitzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckVycm9yID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZXJyIjsKK3N0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRXJyb3JDb2RlID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZXJyY29kZSI7CisKKy8vIE5COiBUaGVzZSBhcmUgbm90IHlldCBleHBvc2VkIGFzIHB1YmxpYyBKYXZhIEFQSSBjb25zdGFudHMuCitzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckVycm9yU3RhdGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5lcnJzdGF0ZSI7CitzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckRhdGFTb3VyY2VUeXBlID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZGF0YVNvdXJjZSI7CisvLworc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJSZWJ1ZmZlcmluZyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnJlYnVmZmVyaW5nTXMiOworc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJSZWJ1ZmZlcmluZ0NvdW50ID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIucmVidWZmZXJzIjsKK3N0YXRpYyBjb25zdCBjaGFyICprUGxheWVyUmVidWZmZXJpbmdBdEV4aXQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5yZWJ1ZmZlckV4aXQiOworCisKK051UGxheWVyMkRyaXZlcjo6TnVQbGF5ZXIyRHJpdmVyKHBpZF90IHBpZCwgdWlkX3QgdWlkKQorICAgIDogbVN0YXRlKFNUQVRFX0lETEUpLAorICAgICAgbUFzeW5jUmVzdWx0KFVOS05PV05fRVJST1IpLAorICAgICAgbVNyY0lkKDApLAorICAgICAgbVNldFN1cmZhY2VJblByb2dyZXNzKGZhbHNlKSwKKyAgICAgIG1EdXJhdGlvblVzKC0xKSwKKyAgICAgIG1Qb3NpdGlvblVzKC0xKSwKKyAgICAgIG1TZWVrSW5Qcm9ncmVzcyhmYWxzZSksCisgICAgICBtUGxheWluZ1RpbWVVcygwKSwKKyAgICAgIG1SZWJ1ZmZlcmluZ1RpbWVVcygwKSwKKyAgICAgIG1SZWJ1ZmZlcmluZ0V2ZW50cygwKSwKKyAgICAgIG1SZWJ1ZmZlcmluZ0F0RXhpdChmYWxzZSksCisgICAgICBtTG9vcGVyKG5ldyBBTG9vcGVyKSwKKyAgICAgIG1OdVBsYXllcjJMb29wZXIobmV3IEFMb29wZXIpLAorICAgICAgbU1lZGlhQ2xvY2sobmV3IE1lZGlhQ2xvY2spLAorICAgICAgbVBsYXllcihuZXcgTnVQbGF5ZXIyKHBpZCwgdWlkLCBtTWVkaWFDbG9jaykpLAorICAgICAgbVBsYXllckZsYWdzKDApLAorICAgICAgbUFuYWx5dGljc0l0ZW0oTlVMTCksCisgICAgICBtQ2xpZW50VWlkKHVpZCksCisgICAgICBtQXRFT1MoZmFsc2UpLAorICAgICAgbUxvb3BpbmcoZmFsc2UpLAorICAgICAgbUF1dG9Mb29wKGZhbHNlKSB7CisgICAgQUxPR0QoIk51UGxheWVyMkRyaXZlciglcCkgY3JlYXRlZCwgY2xpZW50UGlkKCVkKSIsIHRoaXMsIHBpZCk7CisgICAgbUxvb3Blci0+c2V0TmFtZSgiTnVQbGF5ZXIyRHJpdmVyIExvb3BlciIpOworICAgIG1OdVBsYXllcjJMb29wZXItPnNldE5hbWUoIk51UGxheWVyMiBMb29wZXIiKTsKKworICAgIG1NZWRpYUNsb2NrLT5pbml0KCk7CisKKyAgICAvLyBzZXQgdXAgYW4gYW5hbHl0aWNzIHJlY29yZAorICAgIG1BbmFseXRpY3NJdGVtID0gbmV3IE1lZGlhQW5hbHl0aWNzSXRlbShrS2V5UGxheWVyKTsKKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0VWlkKG1DbGllbnRVaWQpOworCisgICAgbU51UGxheWVyMkxvb3Blci0+c3RhcnQoCisgICAgICAgICAgICBmYWxzZSwgLyogcnVuT25DYWxsaW5nVGhyZWFkICovCisgICAgICAgICAgICB0cnVlLCAgLyogY2FuQ2FsbEphdmEgKi8KKyAgICAgICAgICAgIFBSSU9SSVRZX0FVRElPKTsKKworICAgIG1OdVBsYXllcjJMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUGxheWVyKTsKKworICAgIG1QbGF5ZXItPnNldERyaXZlcih0aGlzKTsKK30KKworTnVQbGF5ZXIyRHJpdmVyOjp+TnVQbGF5ZXIyRHJpdmVyKCkgeworICAgIEFMT0dWKCJ+TnVQbGF5ZXIyRHJpdmVyKCVwKSIsIHRoaXMpOworICAgIG1OdVBsYXllcjJMb29wZXItPnN0b3AoKTsKKyAgICBtTG9vcGVyLT5zdG9wKCk7CisKKyAgICAvLyBmaW5hbGl6ZSBhbnkgcGVuZGluZyBtZXRyaWNzLCB1c3VhbGx5IGEgbm8tb3AuCisgICAgdXBkYXRlTWV0cmljcygiZGVzdHJ1Y3RvciIpOworICAgIGxvZ01ldHJpY3MoImRlc3RydWN0b3IiKTsKKworICAgIGlmIChtQW5hbHl0aWNzSXRlbSAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtQW5hbHl0aWNzSXRlbTsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBOVUxMOworICAgIH0KK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjppbml0Q2hlY2soKSB7CisgICAgbUxvb3Blci0+c3RhcnQoCisgICAgICAgICAgICBmYWxzZSwgLyogcnVuT25DYWxsaW5nVGhyZWFkICovCisgICAgICAgICAgICB0cnVlLCAgLyogY2FuQ2FsbEphdmEgKi8KKyAgICAgICAgICAgIFBSSU9SSVRZX0FVRElPKTsKKworICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6c2V0RGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlRGVzYz4gJmRzZCkgeworICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVwKSIsIHRoaXMpOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobVN0YXRlICE9IFNUQVRFX0lETEUpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIG1TcmNJZCA9IGRzZC0+bUlkOworICAgIG1TdGF0ZSA9IFNUQVRFX1NFVF9EQVRBU09VUkNFX1BFTkRJTkc7CisKKyAgICBtUGxheWVyLT5zZXREYXRhU291cmNlQXN5bmMoZHNkKTsKKworICAgIHdoaWxlIChtU3RhdGUgPT0gU1RBVEVfU0VUX0RBVEFTT1VSQ0VfUEVORElORykgeworICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOworICAgIH0KKworICAgIHJldHVybiBtQXN5bmNSZXN1bHQ7Cit9CisKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6cHJlcGFyZU5leHREYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2VEZXNjPiAmZHNkKSB7CisgICAgQUxPR1YoInByZXBhcmVOZXh0RGF0YVNvdXJjZSglcCkiLCB0aGlzKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgbVBsYXllci0+cHJlcGFyZU5leHREYXRhU291cmNlQXN5bmMoZHNkKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpwbGF5TmV4dERhdGFTb3VyY2UoaW50NjRfdCBzcmNJZCkgeworICAgIEFMT0dWKCJwbGF5TmV4dERhdGFTb3VyY2UoJXApIiwgdGhpcyk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIG1TcmNJZCA9IHNyY0lkOworICAgIG1QbGF5ZXItPnBsYXlOZXh0RGF0YVNvdXJjZShzcmNJZCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6c2V0VmlkZW9TdXJmYWNlVGV4dHVyZShjb25zdCBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gJm53dykgeworICAgIEFMT0dWKCJzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKCVwKSIsIHRoaXMpOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobVNldFN1cmZhY2VJblByb2dyZXNzKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1TdGF0ZSkgeworICAgICAgICBjYXNlIFNUQVRFX1NFVF9EQVRBU09VUkNFX1BFTkRJTkc6CisgICAgICAgIGNhc2UgU1RBVEVfUkVTRVRfSU5fUFJPR1JFU1M6CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIG1TZXRTdXJmYWNlSW5Qcm9ncmVzcyA9IHRydWU7CisKKyAgICBtUGxheWVyLT5zZXRWaWRlb1N1cmZhY2VUZXh0dXJlQXN5bmMobnd3KTsKKworICAgIHdoaWxlIChtU2V0U3VyZmFjZUluUHJvZ3Jlc3MpIHsKKyAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6Z2V0QnVmZmVyaW5nU2V0dGluZ3MoQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZykgeworICAgIEFMT0dWKCJnZXRCdWZmZXJpbmdTZXR0aW5ncyglcCkiLCB0aGlzKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfSURMRSkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1QbGF5ZXItPmdldEJ1ZmZlcmluZ1NldHRpbmdzKGJ1ZmZlcmluZyk7Cit9CisKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6c2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgeworICAgIEFMT0dWKCJzZXRCdWZmZXJpbmdTZXR0aW5ncyglcCkiLCB0aGlzKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfSURMRSkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1QbGF5ZXItPnNldEJ1ZmZlcmluZ1NldHRpbmdzKGJ1ZmZlcmluZyk7Cit9CisKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6cHJlcGFyZUFzeW5jKCkgeworICAgIEFMT0dWKCJwcmVwYXJlQXN5bmMoJXApIiwgdGhpcyk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIHN3aXRjaCAobVN0YXRlKSB7CisgICAgICAgIGNhc2UgU1RBVEVfVU5QUkVQQVJFRDoKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BSRVBBUklORzsKKyAgICAgICAgICAgIG1QbGF5ZXItPnByZXBhcmVBc3luYygpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6CisgICAgICAgICAgICAvLyB0aGlzIGlzIHJlYWxseSBqdXN0IHBhdXNlZC4gaGFuZGxlIGFzIHNlZWsgdG8gc3RhcnQKKyAgICAgICAgICAgIG1BdEVPUyA9IGZhbHNlOworICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HOworICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMoMCwgTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQyAvKiBtb2RlICovLAorICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIG5lZWROb3RpZnkgKi8pOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH07Cit9CisKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6c3RhcnQoKSB7CisgICAgQUxPR0QoInN0YXJ0KCVwKSwgc3RhdGUgaXMgJWQsIGVvcyBpcyAlZCIsIHRoaXMsIG1TdGF0ZSwgbUF0RU9TKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiBzdGFydF9sKCk7Cit9CisKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6c3RhcnRfbCgpIHsKKyAgICBzd2l0Y2ggKG1TdGF0ZSkgeworICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDoKKyAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRDoKKyAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDoKKyAgICAgICAgeworICAgICAgICAgICAgbVBsYXllci0+c3RhcnQoKTsKKworICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtQXRFT1MpIHsKKyAgICAgICAgICAgICAgICBtUGxheWVyLT5zZWVrVG9Bc3luYygwKTsKKyAgICAgICAgICAgICAgICBtQXRFT1MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtUG9zaXRpb25VcyA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIG1TdGF0ZSA9IFNUQVRFX1JVTk5JTkc7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6c3RvcCgpIHsKKyAgICBBTE9HRCgic3RvcCglcCkiLCB0aGlzKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgc3dpdGNoIChtU3RhdGUpIHsKKyAgICAgICAgY2FzZSBTVEFURV9SVU5OSU5HOgorICAgICAgICAgICAgbVBsYXllci0+cGF1c2UoKTsKKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorCisgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgorICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKKyAgICAgICAgICAgIC8vbm90aWZ5TGlzdGVuZXJfbChNRURJQTJfU1RPUFBFRCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUkVEOgorICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6CisgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HOgorICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVEOgorICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnBhdXNlKCkgeworICAgIEFMT0dEKCJwYXVzZSglcCkiLCB0aGlzKTsKKyAgICAvLyBUaGUgTnVQbGF5ZXJSZW5kZXJlciBtYXkgZ2V0IGZsdXNoZWQgaWYgcGF1c2UgZm9yIGxvbmcgZW5vdWdoLCBlLmcuIHRoZSBwYXVzZSB0aW1lb3V0IHRlYXIKKyAgICAvLyBkb3duIGZvciBhdWRpbyBvZmZsb2FkIG1vZGUuIElmIHRoYXQgaGFwcGVucywgdGhlIE51UGxheWVyUmVuZGVyZXIgd2lsbCBubyBsb25nZXIga25vdyB0aGUKKyAgICAvLyBjdXJyZW50IHBvc2l0aW9uLiBTbyBzaW1pbGFyIHRvIHNlZWtUbywgdXBkYXRlIHxtUG9zaXRpb25Vc3wgdG8gdGhlIHBhdXNlIHBvc2l0aW9uIGJ5IGNhbGxpbmcKKyAgICAvLyBnZXRDdXJyZW50UG9zaXRpb24gaGVyZS4KKyAgICBpbnQ2NF90IHVudXNlZDsKKyAgICBnZXRDdXJyZW50UG9zaXRpb24oJnVudXNlZCk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgc3dpdGNoIChtU3RhdGUpIHsKKyAgICAgICAgY2FzZSBTVEFURV9QQVVTRUQ6CisgICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSRUQ6CisgICAgICAgICAgICByZXR1cm4gT0s7CisKKyAgICAgICAgY2FzZSBTVEFURV9SVU5OSU5HOgorICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfUEFVU0VEOworICAgICAgICAgICAgbVBsYXllci0+cGF1c2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitib29sIE51UGxheWVyMkRyaXZlcjo6aXNQbGF5aW5nKCkgeworICAgIHJldHVybiBtU3RhdGUgPT0gU1RBVEVfUlVOTklORyAmJiAhbUF0RU9TOworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBtUGxheWVyLT5zZXRQbGF5YmFja1NldHRpbmdzKHJhdGUpOworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgLy8gdHJ5IHRvIHVwZGF0ZSBwb3NpdGlvbgorICAgICAgICBpbnQ2NF90IHVudXNlZDsKKyAgICAgICAgZ2V0Q3VycmVudFBvc2l0aW9uKCZ1bnVzZWQpOworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICBpZiAocmF0ZS5tU3BlZWQgPT0gMC5mICYmIG1TdGF0ZSA9PSBTVEFURV9SVU5OSU5HKSB7CisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9QQVVTRUQ7CisgICAgICAgIH0gZWxzZSBpZiAocmF0ZS5tU3BlZWQgIT0gMC5mCisgICAgICAgICAgICAgICAgJiYgKG1TdGF0ZSA9PSBTVEFURV9QQVVTRUQKKyAgICAgICAgICAgICAgICAgICAgfHwgbVN0YXRlID09IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVECisgICAgICAgICAgICAgICAgICAgIHx8IG1TdGF0ZSA9PSBTVEFURV9QUkVQQVJFRCkpIHsKKyAgICAgICAgICAgIGVyciA9IHN0YXJ0X2woKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OmdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUpIHsKKyAgICByZXR1cm4gbVBsYXllci0+Z2V0UGxheWJhY2tTZXR0aW5ncyhyYXRlKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpzZXRTeW5jU2V0dGluZ3MoY29uc3QgQVZTeW5jU2V0dGluZ3MgJnN5bmMsIGZsb2F0IHZpZGVvRnBzSGludCkgeworICAgIHJldHVybiBtUGxheWVyLT5zZXRTeW5jU2V0dGluZ3Moc3luYywgdmlkZW9GcHNIaW50KTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpnZXRTeW5jU2V0dGluZ3MoQVZTeW5jU2V0dGluZ3MgKnN5bmMsIGZsb2F0ICp2aWRlb0ZwcykgeworICAgIHJldHVybiBtUGxheWVyLT5nZXRTeW5jU2V0dGluZ3Moc3luYywgdmlkZW9GcHMpOworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnNlZWtUbyhpbnQ2NF90IG1zZWMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUpIHsKKyAgICBBTE9HRCgic2Vla1RvKCVwKSAoJWxsZCBtcywgJWQpIGF0IHN0YXRlICVkIiwgdGhpcywgKGxvbmcgbG9uZyltc2VjLCBtb2RlLCBtU3RhdGUpOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpbnQ2NF90IHNlZWtUaW1lVXMgPSBtc2VjICogMTAwMGxsOworCisgICAgc3dpdGNoIChtU3RhdGUpIHsKKyAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDoKKyAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRDoKKyAgICAgICAgY2FzZSBTVEFURV9QQVVTRUQ6CisgICAgICAgIGNhc2UgU1RBVEVfUlVOTklORzoKKyAgICAgICAgeworICAgICAgICAgICAgbUF0RU9TID0gZmFsc2U7CisgICAgICAgICAgICBtU2Vla0luUHJvZ3Jlc3MgPSB0cnVlOworICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMoc2Vla1RpbWVVcywgbW9kZSwgdHJ1ZSAvKiBuZWVkTm90aWZ5ICovKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBtUG9zaXRpb25VcyA9IHNlZWtUaW1lVXM7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OmdldEN1cnJlbnRQb3NpdGlvbihpbnQ2NF90ICptc2VjKSB7CisgICAgaW50NjRfdCB0ZW1wVXMgPSAwOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1TZWVrSW5Qcm9ncmVzcyB8fCAobVN0YXRlID09IFNUQVRFX1BBVVNFRCAmJiAhbUF0RU9TKSkgeworICAgICAgICAgICAgdGVtcFVzID0gKG1Qb3NpdGlvblVzIDw9IDApID8gMCA6IG1Qb3NpdGlvblVzOworICAgICAgICAgICAgKm1zZWMgPSBkaXZSb3VuZCh0ZW1wVXMsIChpbnQ2NF90KSgxMDAwKSk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5nZXRDdXJyZW50UG9zaXRpb24oJnRlbXBVcyk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgbVNlZWtJblByb2dyZXNzIGhlcmUgYmVjYXVzZSBtUGxheWVyLT5zZWVrVG9Bc3luYyBpcyBhbiBhc3luYyBjYWxsLCB3aGljaAorICAgIC8vIG1lYW5zIGdldEN1cnJlbnRQb3NpdGlvbiBjYW4gYmUgY2FsbGVkIGJlZm9yZSBzZWVrIGlzIGNvbXBsZXRlZC4gSW93LCByZW5kZXJlciBtYXkgcmV0dXJuIGEKKyAgICAvLyBwb3NpdGlvbiB2YWx1ZSB0aGF0J3MgZGlmZmVyZW50IHRoZSBzZWVrIHRvIHBvc2l0aW9uLgorICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgdGVtcFVzID0gKG1Qb3NpdGlvblVzIDw9IDApID8gMCA6IG1Qb3NpdGlvblVzOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Qb3NpdGlvblVzID0gdGVtcFVzOworICAgIH0KKyAgICAqbXNlYyA9IGRpdlJvdW5kKHRlbXBVcywgKGludDY0X3QpKDEwMDApKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6Z2V0RHVyYXRpb24oaW50NjRfdCAqbXNlYykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUR1cmF0aW9uVXMgPCAwKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgICptc2VjID0gKG1EdXJhdGlvblVzICsgNTAwbGwpIC8gMTAwMDsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBOdVBsYXllcjJEcml2ZXI6OnVwZGF0ZU1ldHJpY3MoY29uc3QgY2hhciAqd2hlcmUpIHsKKyAgICBpZiAod2hlcmUgPT0gTlVMTCkgeworICAgICAgICB3aGVyZSA9ICJ1bmtub3duIjsKKyAgICB9CisgICAgQUxPR1YoInVwZGF0ZU1ldHJpY3MoJXApIGZyb20gJXMgYXQgc3RhdGUgJWQiLCB0aGlzLCB3aGVyZSwgbVN0YXRlKTsKKworICAgIC8vIGdhdGhlciB0aGUgZmluYWwgc3RhdHMgZm9yIHRoaXMgcmVjb3JkCisgICAgVmVjdG9yPHNwPEFNZXNzYWdlPj4gdHJhY2tTdGF0czsKKyAgICBtUGxheWVyLT5nZXRTdGF0cygmdHJhY2tTdGF0cyk7CisKKyAgICBpZiAodHJhY2tTdGF0cy5zaXplKCkgPiAwKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdHJhY2tTdGF0cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZzdGF0cyA9IHRyYWNrU3RhdHMuaXRlbUF0KGkpOworCisgICAgICAgICAgICBBU3RyaW5nIG1pbWU7CisgICAgICAgICAgICBzdGF0cy0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKTsKKworICAgICAgICAgICAgQVN0cmluZyBuYW1lOworICAgICAgICAgICAgc3RhdHMtPmZpbmRTdHJpbmcoImNvbXBvbmVudC1uYW1lIiwgJm5hbWUpOworCisgICAgICAgICAgICBpZiAobWltZS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgeworICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrUGxheWVyVk1pbWUsIG1pbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgaWYgKCFuYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa1BsYXllclZDb2RlYywgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHMtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBzdGF0cy0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgeworICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1BsYXllcldpZHRoLCB3aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUGxheWVySGVpZ2h0LCBoZWlnaHQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludDY0X3QgbnVtRnJhbWVzVG90YWwgPSAwOworICAgICAgICAgICAgICAgIGludDY0X3QgbnVtRnJhbWVzRHJvcHBlZCA9IDA7CisgICAgICAgICAgICAgICAgc3RhdHMtPmZpbmRJbnQ2NCgiZnJhbWVzLXRvdGFsIiwgJm51bUZyYW1lc1RvdGFsKTsKKyAgICAgICAgICAgICAgICBzdGF0cy0+ZmluZEludDY0KCJmcmFtZXMtZHJvcHBlZC1vdXRwdXQiLCAmbnVtRnJhbWVzRHJvcHBlZCk7CisKKyAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa1BsYXllckZyYW1lcywgbnVtRnJhbWVzVG90YWwpOworICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyRnJhbWVzRHJvcHBlZCwgbnVtRnJhbWVzRHJvcHBlZCk7CisKKworICAgICAgICAgICAgfSBlbHNlIGlmIChtaW1lLnN0YXJ0c1dpdGgoImF1ZGlvLyIpKSB7CisgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa1BsYXllckFNaW1lLCBtaW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGlmICghbmFtZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJBQ29kZWMsIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gYWx3YXlzIHByb3ZpZGUgZHVyYXRpb24gYW5kIHBsYXlpbmcgdGltZSwgZXZlbiBpZiB0aGV5IGhhdmUgMC91bmtub3duIHZhbHVlcy4KKworICAgIC8vIGdldER1cmF0aW9uKCkgdXNlcyBtTG9jayBmb3IgbXV0ZXggLS0gY2FyZWZ1bCB3aGVyZSB3ZSB1c2UgaXQuCisgICAgaW50NjRfdCBkdXJhdGlvbl9tcyA9IC0xOworICAgIGdldER1cmF0aW9uKCZkdXJhdGlvbl9tcyk7CisgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtQbGF5ZXJEdXJhdGlvbiwgZHVyYXRpb25fbXMpOworCisgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtQbGF5ZXJQbGF5aW5nLCAobVBsYXlpbmdUaW1lVXMrNTAwKS8xMDAwICk7CisKKyAgICBpZiAobVJlYnVmZmVyaW5nRXZlbnRzICE9IDApIHsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtQbGF5ZXJSZWJ1ZmZlcmluZywgKG1SZWJ1ZmZlcmluZ1RpbWVVcys1MDApLzEwMDAgKTsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJSZWJ1ZmZlcmluZ0NvdW50LCBtUmVidWZmZXJpbmdFdmVudHMpOworICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1BsYXllclJlYnVmZmVyaW5nQXRFeGl0LCBtUmVidWZmZXJpbmdBdEV4aXQpOworICAgIH0KKworICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJEYXRhU291cmNlVHlwZSwgbVBsYXllci0+Z2V0RGF0YVNvdXJjZVR5cGUoKSk7Cit9CisKKwordm9pZCBOdVBsYXllcjJEcml2ZXI6OmxvZ01ldHJpY3MoY29uc3QgY2hhciAqd2hlcmUpIHsKKyAgICBpZiAod2hlcmUgPT0gTlVMTCkgeworICAgICAgICB3aGVyZSA9ICJ1bmtub3duIjsKKyAgICB9CisgICAgQUxPR1YoImxvZ01ldHJpY3MoJXApIGZyb20gJXMgYXQgc3RhdGUgJWQiLCB0aGlzLCB3aGVyZSwgbVN0YXRlKTsKKworICAgIGlmIChtQW5hbHl0aWNzSXRlbSA9PSBOVUxMIHx8IG1BbmFseXRpY3NJdGVtLT5pc0VuYWJsZWQoKSA9PSBmYWxzZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gbG9nIG9ubHkgbm9uLWVtcHR5IHJlY29yZHMKKyAgICAvLyB3ZSBhbHdheXMgdXBkYXRlTWV0cmljcygpIGJlZm9yZSB3ZSBnZXQgaGVyZQorICAgIC8vIGFuZCB0aGF0IGFsd2F5cyBpbmplY3RzIDMgZmllbGRzIChkdXJhdGlvbiwgcGxheWluZyB0aW1lLCBhbmQKKyAgICAvLyBkYXRhc291cmNlKSBpbnRvIHRoZSByZWNvcmQuCisgICAgLy8gU28gdGhlIGNhbm9uaWNhbCAiZW1wdHkiIHJlY29yZCBoYXMgMyBlbGVtZW50cyBpbiBpdC4KKyAgICBpZiAobUFuYWx5dGljc0l0ZW0tPmNvdW50KCkgPiAzKSB7CisKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNlbGZyZWNvcmQoKTsKKworICAgICAgICAvLyByZS1pbml0IGluIGNhc2Ugd2UgcHJlcGFyZSgpIGFuZCBzdGFydCgpIGFnYWluLgorICAgICAgICBkZWxldGUgbUFuYWx5dGljc0l0ZW0gOworICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0tleVBsYXllcik7CisgICAgICAgIGlmIChtQW5hbHl0aWNzSXRlbSkgeworICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldFVpZChtQ2xpZW50VWlkKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJkaWQgbm90IGhhdmUgYW55dGhpbmcgdG8gcmVjb3JkIik7CisgICAgfQorfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnJlc2V0KCkgeworICAgIEFMT0dEKCJyZXNldCglcCkgYXQgc3RhdGUgJWQiLCB0aGlzLCBtU3RhdGUpOworCisgICAgdXBkYXRlTWV0cmljcygicmVzZXQiKTsKKyAgICBsb2dNZXRyaWNzKCJyZXNldCIpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIHN3aXRjaCAobVN0YXRlKSB7CisgICAgICAgIGNhc2UgU1RBVEVfSURMRToKKyAgICAgICAgICAgIHJldHVybiBPSzsKKworICAgICAgICBjYXNlIFNUQVRFX1NFVF9EQVRBU09VUkNFX1BFTkRJTkc6CisgICAgICAgIGNhc2UgU1RBVEVfUkVTRVRfSU5fUFJPR1JFU1M6CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisKKyAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJJTkc6CisgICAgICAgIHsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2wobVNyY0lkLCBNRURJQTJfUFJFUEFSRUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9TVE9QUEVEKSB7CisgICAgICAgIC8vIG5vdGlmeUxpc3RlbmVyX2woTUVESUEyX1NUT1BQRUQpOworICAgIH0KKworICAgIG1TdGF0ZSA9IFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTOworICAgIG1QbGF5ZXItPnJlc2V0QXN5bmMoKTsKKworICAgIHdoaWxlIChtU3RhdGUgPT0gU1RBVEVfUkVTRVRfSU5fUFJPR1JFU1MpIHsKKyAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKKyAgICB9CisKKyAgICBtRHVyYXRpb25VcyA9IC0xOworICAgIG1Qb3NpdGlvblVzID0gLTE7CisgICAgbUxvb3BpbmcgPSBmYWxzZTsKKyAgICBtUGxheWluZ1RpbWVVcyA9IDA7CisgICAgbVJlYnVmZmVyaW5nVGltZVVzID0gMDsKKyAgICBtUmVidWZmZXJpbmdFdmVudHMgPSAwOworICAgIG1SZWJ1ZmZlcmluZ0F0RXhpdCA9IGZhbHNlOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6Om5vdGlmeUF0KGludDY0X3QgbWVkaWFUaW1lVXMpIHsKKyAgICBBTE9HVigibm90aWZ5QXQoJXApLCB0aW1lOiVsbGQiLCB0aGlzLCAobG9uZyBsb25nKW1lZGlhVGltZVVzKTsKKyAgICByZXR1cm4gbVBsYXllci0+bm90aWZ5QXQobWVkaWFUaW1lVXMpOworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnNldExvb3BpbmcoaW50IGxvb3ApIHsKKyAgICBtTG9vcGluZyA9IGxvb3AgIT0gMDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6aW52b2tlKGNvbnN0IFBhcmNlbCAmcmVxdWVzdCwgUGFyY2VsICpyZXBseSkgeworICAgIGlmIChyZXBseSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJyZXBseSBpcyBhIE5VTEwgcG9pbnRlciIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGludDMyX3QgbWV0aG9kSWQ7CisgICAgc3RhdHVzX3QgcmV0ID0gcmVxdWVzdC5yZWFkSW50MzIoJm1ldGhvZElkKTsKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmV0cmlldmUgdGhlIHJlcXVlc3RlZCBtZXRob2QgdG8gaW52b2tlLCBlcnIoJWQpIiwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1ldGhvZElkKSB7CisgICAgICAgIGNhc2UgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfU0VUX1ZJREVPX1NDQUxJTkdfTU9ERToKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG1vZGUgPSByZXF1ZXN0LnJlYWRJbnQzMigpOworICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnNldFZpZGVvU2NhbGluZ01vZGUobW9kZSk7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX0dFVF9UUkFDS19JTkZPOgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBsYXllci0+Z2V0VHJhY2tJbmZvKHJlcGx5KTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfU0VMRUNUX1RSQUNLOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdHJhY2tJbmRleCA9IHJlcXVlc3QucmVhZEludDMyKCk7CisgICAgICAgICAgICBpbnQ2NF90IG1zZWMgPSAwOworICAgICAgICAgICAgLy8gZ2V0Q3VycmVudFBvc2l0aW9uIHNob3VsZCBhbHdheXMgcmV0dXJuIE9LCisgICAgICAgICAgICBnZXRDdXJyZW50UG9zaXRpb24oJm1zZWMpOworICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnNlbGVjdFRyYWNrKHRyYWNrSW5kZXgsIHRydWUgLyogc2VsZWN0ICovLCBtc2VjICogMTAwMGxsKTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfVU5TRUxFQ1RfVFJBQ0s6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB0cmFja0luZGV4ID0gcmVxdWVzdC5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5zZWxlY3RUcmFjayh0cmFja0luZGV4LCBmYWxzZSAvKiBzZWxlY3QgKi8sIDB4ZGVhZGJlZWYgLyogbm90IHVzZWQgKi8pOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBNRURJQV9QTEFZRVIyX0lOVk9LRV9JRF9HRVRfU0VMRUNURURfVFJBQ0s6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgdHlwZSA9IHJlcXVlc3QucmVhZEludDMyKCk7CisgICAgICAgICAgICByZXR1cm4gbVBsYXllci0+Z2V0U2VsZWN0ZWRUcmFjayh0eXBlLCByZXBseSk7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpzZXRBdWRpb1NpbmsoY29uc3Qgc3A8QXVkaW9TaW5rPiAmYXVkaW9TaW5rKSB7CisgICAgbVBsYXllci0+c2V0QXVkaW9TaW5rKGF1ZGlvU2luayk7CisgICAgbUF1ZGlvU2luayA9IGF1ZGlvU2luazsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpzZXRQYXJhbWV0ZXIoCisgICAgICAgIGludCAvKiBrZXkgKi8sIGNvbnN0IFBhcmNlbCAmIC8qIHJlcXVlc3QgKi8pIHsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6Z2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpIHsKKworICAgIGlmIChrZXkgPT0gRk9VUkNDKCdtJywndCcsJ3InLCdYJykpIHsKKyAgICAgICAgLy8gbXRyWCAtLSBhIHBsYXkgb24gJ21ldHJpY3MnIChub3QgbWF0cml4KQorICAgICAgICAvLyBnYXRoZXIgY3VycmVudCBpbmZvIGFsbCB0b2dldGhlciwgcGFyY2VsIGl0LCBhbmQgc2VuZCBpdCBiYWNrCisgICAgICAgIHVwZGF0ZU1ldHJpY3MoImFwaSIpOworICAgICAgICBtQW5hbHl0aWNzSXRlbS0+d3JpdGVUb1BhcmNlbChyZXBseSk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6Z2V0TWV0YWRhdGEoCisgICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiAvKiBpZHMgKi8sIFBhcmNlbCAqcmVjb3JkcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICB1c2luZyBtZWRpYTo6TWV0YWRhdGE7CisKKyAgICBNZXRhZGF0YSBtZXRhKHJlY29yZHMpOworCisgICAgbWV0YS5hcHBlbmRCb29sKAorICAgICAgICAgICAgTWV0YWRhdGE6OmtQYXVzZUF2YWlsYWJsZSwKKyAgICAgICAgICAgIG1QbGF5ZXJGbGFncyAmIE51UGxheWVyMjo6U291cmNlOjpGTEFHX0NBTl9QQVVTRSk7CisKKyAgICBtZXRhLmFwcGVuZEJvb2woCisgICAgICAgICAgICBNZXRhZGF0YTo6a1NlZWtCYWNrd2FyZEF2YWlsYWJsZSwKKyAgICAgICAgICAgIG1QbGF5ZXJGbGFncyAmIE51UGxheWVyMjo6U291cmNlOjpGTEFHX0NBTl9TRUVLX0JBQ0tXQVJEKTsKKworICAgIG1ldGEuYXBwZW5kQm9vbCgKKyAgICAgICAgICAgIE1ldGFkYXRhOjprU2Vla0ZvcndhcmRBdmFpbGFibGUsCisgICAgICAgICAgICBtUGxheWVyRmxhZ3MgJiBOdVBsYXllcjI6OlNvdXJjZTo6RkxBR19DQU5fU0VFS19GT1JXQVJEKTsKKworICAgIG1ldGEuYXBwZW5kQm9vbCgKKyAgICAgICAgICAgIE1ldGFkYXRhOjprU2Vla0F2YWlsYWJsZSwKKyAgICAgICAgICAgIG1QbGF5ZXJGbGFncyAmIE51UGxheWVyMjo6U291cmNlOjpGTEFHX0NBTl9TRUVLKTsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBOdVBsYXllcjJEcml2ZXI6Om5vdGlmeVJlc2V0Q29tcGxldGUoaW50NjRfdCAvKiBzcmNJZCAqLykgeworICAgIEFMT0dEKCJub3RpZnlSZXNldENvbXBsZXRlKCVwKSIsIHRoaXMpOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBDSEVDS19FUShtU3RhdGUsIFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTKTsKKyAgICBtU3RhdGUgPSBTVEFURV9JRExFOworICAgIG1Db25kaXRpb24uYnJvYWRjYXN0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpub3RpZnlTZXRTdXJmYWNlQ29tcGxldGUoaW50NjRfdCAvKiBzcmNJZCAqLykgeworICAgIEFMT0dWKCJub3RpZnlTZXRTdXJmYWNlQ29tcGxldGUoJXApIiwgdGhpcyk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIENIRUNLKG1TZXRTdXJmYWNlSW5Qcm9ncmVzcyk7CisgICAgbVNldFN1cmZhY2VJblByb2dyZXNzID0gZmFsc2U7CisKKyAgICBtQ29uZGl0aW9uLmJyb2FkY2FzdCgpOworfQorCit2b2lkIE51UGxheWVyMkRyaXZlcjo6bm90aWZ5RHVyYXRpb24oaW50NjRfdCAvKiBzcmNJZCAqLywgaW50NjRfdCBkdXJhdGlvblVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBtRHVyYXRpb25VcyA9IGR1cmF0aW9uVXM7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpub3RpZnlNb3JlUGxheWluZ1RpbWVVcyhpbnQ2NF90IC8qIHNyY0lkICovLCBpbnQ2NF90IHBsYXlpbmdVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbVBsYXlpbmdUaW1lVXMgKz0gcGxheWluZ1VzOworfQorCit2b2lkIE51UGxheWVyMkRyaXZlcjo6bm90aWZ5TW9yZVJlYnVmZmVyaW5nVGltZVVzKGludDY0X3QgLyogc3JjSWQgKi8sIGludDY0X3QgcmVidWZmZXJpbmdVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbVJlYnVmZmVyaW5nVGltZVVzICs9IHJlYnVmZmVyaW5nVXM7CisgICAgbVJlYnVmZmVyaW5nRXZlbnRzKys7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpub3RpZnlSZWJ1ZmZlcmluZ1doZW5FeGl0KGludDY0X3QgLyogc3JjSWQgKi8sIGJvb2wgc3RhdHVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBtUmVidWZmZXJpbmdBdEV4aXQgPSBzdGF0dXM7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpub3RpZnlTZWVrQ29tcGxldGUoaW50NjRfdCBzcmNJZCkgeworICAgIEFMT0dWKCJub3RpZnlTZWVrQ29tcGxldGUoJXApIiwgdGhpcyk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBtU2Vla0luUHJvZ3Jlc3MgPSBmYWxzZTsKKyAgICBub3RpZnlTZWVrQ29tcGxldGVfbChzcmNJZCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpub3RpZnlTZWVrQ29tcGxldGVfbChpbnQ2NF90IHNyY0lkKSB7CisgICAgYm9vbCB3YXNTZWVraW5nID0gdHJ1ZTsKKyAgICBpZiAobVN0YXRlID09IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORykgeworICAgICAgICB3YXNTZWVraW5nID0gZmFsc2U7CisgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVEOworICAgICAgICBtQ29uZGl0aW9uLmJyb2FkY2FzdCgpOworICAgIH0gZWxzZSBpZiAobVN0YXRlID09IFNUQVRFX1NUT1BQRUQpIHsKKyAgICAgICAgLy8gbm8gbmVlZCB0byBub3RpZnkgbGlzdGVuZXIKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBub3RpZnlMaXN0ZW5lcl9sKHNyY0lkLCB3YXNTZWVraW5nID8gTUVESUEyX1NFRUtfQ09NUExFVEUgOiBNRURJQTJfUFJFUEFSRUQpOworfQorCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OmR1bXAoCisgICAgICAgIGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmIC8qIGFyZ3MgKi8pIGNvbnN0IHsKKworICAgIFZlY3RvcjxzcDxBTWVzc2FnZT4gPiB0cmFja1N0YXRzOworICAgIG1QbGF5ZXItPmdldFN0YXRzKCZ0cmFja1N0YXRzKTsKKworICAgIEFTdHJpbmcgbG9nU3RyaW5nKCIgTnVQbGF5ZXIyXG4iKTsKKyAgICBjaGFyIGJ1ZlsyNTZdID0gezB9OworCisgICAgYm9vbCBsb2NrZWQgPSBmYWxzZTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtEdW1wTG9ja1JldHJpZXM7ICsraSkgeworICAgICAgICBpZiAobUxvY2sudHJ5TG9jaygpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBsb2NrZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdXNsZWVwKGtEdW1wTG9ja1NsZWVwVXMpOworICAgIH0KKworICAgIGlmIChsb2NrZWQpIHsKKyAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiAgc3RhdGUoJWQpLCBhdEVPUyglZCksIGxvb3BpbmcoJWQpLCBhdXRvTG9vcCglZClcbiIsCisgICAgICAgICAgICAgICAgbVN0YXRlLCBtQXRFT1MsIG1Mb29waW5nLCBtQXV0b0xvb3ApOworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiICBOUEQoJXApIGxvY2sgaXMgdGFrZW5cbiIsIHRoaXMpOworICAgIH0KKyAgICBsb2dTdHJpbmcuYXBwZW5kKGJ1Zik7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRyYWNrU3RhdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZzdGF0cyA9IHRyYWNrU3RhdHMuaXRlbUF0KGkpOworCisgICAgICAgIEFTdHJpbmcgbWltZTsKKyAgICAgICAgaWYgKHN0YXRzLT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKSB7CisgICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiICBtaW1lKCVzKVxuIiwgbWltZS5jX3N0cigpKTsKKyAgICAgICAgICAgIGxvZ1N0cmluZy5hcHBlbmQoYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIEFTdHJpbmcgbmFtZTsKKyAgICAgICAgaWYgKHN0YXRzLT5maW5kU3RyaW5nKCJjb21wb25lbnQtbmFtZSIsICZuYW1lKSkgeworICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiAgICBkZWNvZGVyKCVzKVxuIiwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIGxvZ1N0cmluZy5hcHBlbmQoYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtaW1lLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7CisgICAgICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgICAgICAgICBpZiAoc3RhdHMtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpCisgICAgICAgICAgICAgICAgICAgICYmIHN0YXRzLT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiAgICByZXNvbHV0aW9uKCVkIHggJWQpXG4iLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBsb2dTdHJpbmcuYXBwZW5kKGJ1Zik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludDY0X3QgbnVtRnJhbWVzVG90YWwgPSAwOworICAgICAgICAgICAgaW50NjRfdCBudW1GcmFtZXNEcm9wcGVkID0gMDsKKworICAgICAgICAgICAgc3RhdHMtPmZpbmRJbnQ2NCgiZnJhbWVzLXRvdGFsIiwgJm51bUZyYW1lc1RvdGFsKTsKKyAgICAgICAgICAgIHN0YXRzLT5maW5kSW50NjQoImZyYW1lcy1kcm9wcGVkLW91dHB1dCIsICZudW1GcmFtZXNEcm9wcGVkKTsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIgICAgbnVtRnJhbWVzVG90YWwoJWxsZCksIG51bUZyYW1lc0Ryb3BwZWQoJWxsZCksICIKKyAgICAgICAgICAgICAgICAgICAgICJwZXJjZW50YWdlRHJvcHBlZCglLjJmJSUpXG4iLAorICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyludW1GcmFtZXNUb3RhbCwKKyAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbnVtRnJhbWVzRHJvcHBlZCwKKyAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lc1RvdGFsID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDAuMCA6IChkb3VibGUpKG51bUZyYW1lc0Ryb3BwZWQgKiAxMDApIC8gbnVtRnJhbWVzVG90YWwpOworICAgICAgICAgICAgbG9nU3RyaW5nLmFwcGVuZChidWYpOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR0koIiVzIiwgbG9nU3RyaW5nLmNfc3RyKCkpOworCisgICAgaWYgKGZkID49IDApIHsKKyAgICAgICAgRklMRSAqb3V0ID0gZmRvcGVuKGR1cChmZCksICJ3Iik7CisgICAgICAgIGZwcmludGYob3V0LCAiJXMiLCBsb2dTdHJpbmcuY19zdHIoKSk7CisgICAgICAgIGZjbG9zZShvdXQpOworICAgICAgICBvdXQgPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBOdVBsYXllcjJEcml2ZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0Tm90aWZ5TGlzdGVuZXI6IHsKKyAgICAgICAgICAgIGludDY0X3Qgc3JjSWQ7CisgICAgICAgICAgICBpbnQzMl90IG1zZ0lkOworICAgICAgICAgICAgaW50MzJfdCBleHQxID0gMDsKKyAgICAgICAgICAgIGludDMyX3QgZXh0MiA9IDA7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3JjSWQiLCAmc3JjSWQpKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJtZXNzYWdlSWQiLCAmbXNnSWQpKTsKKyAgICAgICAgICAgIG1zZy0+ZmluZEludDMyKCJleHQxIiwgJmV4dDEpOworICAgICAgICAgICAgbXNnLT5maW5kSW50MzIoImV4dDIiLCAmZXh0Mik7CisgICAgICAgICAgICBzcDxQYXJjZWxXcmFwcGVyPiBpbjsKKyAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRPYmplY3QoInBhcmNlbCIsICZvYmopICYmIG9iaiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW4gPSBzdGF0aWNfY2FzdDxQYXJjZWxXcmFwcGVyICo+KG9iai5nZXQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZW5kRXZlbnQoc3JjSWQsIG1zZ0lkLCBleHQxLCBleHQyLCAoaW4gPT0gTlVMTCA/IE5VTEwgOiBpbi0+Z2V0UGFyY2VsKCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpub3RpZnlMaXN0ZW5lcigKKyAgICAgICAgaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKmluKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBub3RpZnlMaXN0ZW5lcl9sKHNyY0lkLCBtc2csIGV4dDEsIGV4dDIsIGluKTsKK30KKwordm9pZCBOdVBsYXllcjJEcml2ZXI6Om5vdGlmeUxpc3RlbmVyX2woCisgICAgICAgIGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICppbikgeworICAgIEFMT0dEKCJub3RpZnlMaXN0ZW5lcl9sKCVwKSwgKCVsbGQsICVkLCAlZCwgJWQsICVkKSwgbG9vcCBzZXR0aW5nKCVkLCAlZCkiLAorICAgICAgICAgICAgdGhpcywgKGxvbmcgbG9uZylzcmNJZCwgbXNnLCBleHQxLCBleHQyLAorICAgICAgICAgICAgKGluID09IE5VTEwgPyAtMSA6IChpbnQpaW4tPmRhdGFTaXplKCkpLCBtQXV0b0xvb3AsIG1Mb29waW5nKTsKKyAgICBpZiAoc3JjSWQgPT0gbVNyY0lkKSB7CisgICAgICAgIHN3aXRjaCAobXNnKSB7CisgICAgICAgICAgICBjYXNlIE1FRElBMl9QTEFZQkFDS19DT01QTEVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobVN0YXRlICE9IFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQXV0b0xvb3ApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9NVVNJQzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gbUF1ZGlvU2luay0+Z2V0QXVkaW9TdHJlYW1UeXBlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImRpc2FibGluZyBhdXRvLWxvb3AgZm9yIG5vdGlmaWNhdGlvbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdXRvTG9vcCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtTG9vcGluZyB8fCBtQXV0b0xvb3ApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5ZXItPnNlZWtUb0FzeW5jKDApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSByZW5kZXJlciBoYXMgc3RvcHBlZCB0aGUgc2luayBhdCB0aGUgZW5kIGluIG9yZGVyIHRvIHBsYXkgb3V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxhc3QgbGl0dGxlIGJpdCBvZiBhdWRpby4gSW4gbG9vcGluZyBtb2RlLCB3ZSBuZWVkIHRvIHJlc3RhcnQgaXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHNlbmQgY29tcGxldGlvbiBldmVudCB3aGVuIGxvb3BpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QuZGVidWcuc2Yuc3RhdHMiLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvcjxTdHJpbmcxNj4gYXJnczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGR1bXAoLTEsIGFyZ3MpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1QbGF5ZXItPnBhdXNlKCk7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BBVVNFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgTUVESUEyX0VSUk9SOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHdoZW4gd2UgaGF2ZSBhbiBlcnJvciwgYWRkIGl0IHRvIHRoZSBhbmFseXRpY3MgZm9yIHRoaXMgcGxheWJhY2suCisgICAgICAgICAgICAgICAgLy8gZXh0MSBpcyBvdXIgcHJpbWFyeSAnZXJyb3IgdHlwZScgdmFsdWUuIE9ubHkgYWRkIGV4dDIgd2hlbiBub24temVyby4KKyAgICAgICAgICAgICAgICAvLyBbdGVzdCBhZ2FpbnN0IG1zZyBpcyBkdWUgdG8gZmFsbCB0aHJvdWdoIGZyb20gcHJldmlvdXMgc3dpdGNoIHZhbHVlXQorICAgICAgICAgICAgICAgIGlmIChtc2cgPT0gTUVESUEyX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUGxheWVyRXJyb3IsIGV4dDEpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0MiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1BsYXllckVycm9yQ29kZSwgZXh0Mik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa1BsYXllckVycm9yU3RhdGUsIHN0YXRlU3RyaW5nKG1TdGF0ZSkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1BdEVPUyA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0Tm90aWZ5TGlzdGVuZXIsIHRoaXMpOworICAgIG5vdGlmeS0+c2V0SW50NjQoInNyY0lkIiwgc3JjSWQpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIm1lc3NhZ2VJZCIsIG1zZyk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigiZXh0MSIsIGV4dDEpOworICAgIG5vdGlmeS0+c2V0SW50MzIoImV4dDIiLCBleHQyKTsKKyAgICBub3RpZnktPnNldE9iamVjdCgicGFyY2VsIiwgUGFyY2VsV3JhcHBlcjo6Q3JlYXRlKGluKSk7CisgICAgbm90aWZ5LT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpub3RpZnlTZXREYXRhU291cmNlQ29tcGxldGVkKGludDY0X3QgLyogc3JjSWQgKi8sIHN0YXR1c190IGVycikgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBDSEVDS19FUShtU3RhdGUsIFNUQVRFX1NFVF9EQVRBU09VUkNFX1BFTkRJTkcpOworCisgICAgbUFzeW5jUmVzdWx0ID0gZXJyOworICAgIG1TdGF0ZSA9IChlcnIgPT0gT0spID8gU1RBVEVfVU5QUkVQQVJFRCA6IFNUQVRFX0lETEU7CisgICAgbUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjJEcml2ZXI6Om5vdGlmeVByZXBhcmVDb21wbGV0ZWQoaW50NjRfdCBzcmNJZCwgc3RhdHVzX3QgZXJyKSB7CisgICAgQUxPR1YoIm5vdGlmeVByZXBhcmVDb21wbGV0ZWQgJWQiLCBlcnIpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChzcmNJZCAhPSBtU3JjSWQpIHsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChzcmNJZCwgTUVESUEyX1BSRVBBUkVEKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woc3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfUFJFUEFSSU5HKSB7CisgICAgICAgIC8vIFdlIHdlcmUgcHJlcGFyaW5nIGFzeW5jaHJvbm91c2x5IHdoZW4gdGhlIGNsaWVudCBjYWxsZWQKKyAgICAgICAgLy8gcmVzZXQoKSwgd2Ugc2VudCBhIHByZW1hdHVyZSAicHJlcGFyZWQiIG5vdGlmaWNhdGlvbiBhbmQKKyAgICAgICAgLy8gdGhlbiBpbml0aWF0ZWQgdGhlIHJlc2V0LiBUaGlzIG5vdGlmaWNhdGlvbiBpcyBzdGFsZS4KKyAgICAgICAgQ0hFQ0sobVN0YXRlID09IFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTIHx8IG1TdGF0ZSA9PSBTVEFURV9JRExFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENIRUNLX0VRKG1TdGF0ZSwgU1RBVEVfUFJFUEFSSU5HKTsKKworICAgIG1Bc3luY1Jlc3VsdCA9IGVycjsKKworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgLy8gdXBkYXRlIHN0YXRlIGJlZm9yZSBub3RpZnlpbmcgY2xpZW50LCBzbyB0aGF0IGlmIGNsaWVudCBjYWxscyBiYWNrIGludG8gTnVQbGF5ZXIyRHJpdmVyCisgICAgICAgIC8vIGluIHJlc3BvbnNlLCBOdVBsYXllcjJEcml2ZXIgaGFzIHRoZSByaWdodCBzdGF0ZQorICAgICAgICBtU3RhdGUgPSBTVEFURV9QUkVQQVJFRDsKKyAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChzcmNJZCwgTUVESUEyX1BSRVBBUkVEKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtU3RhdGUgPSBTVEFURV9VTlBSRVBBUkVEOworICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKHNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBlcnIpOworICAgIH0KKworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVBsYXllci0+Z2V0RmlsZU1ldGEoKTsKKyAgICBpbnQzMl90IGxvb3A7CisgICAgaWYgKG1ldGEgIT0gTlVMTAorICAgICAgICAgICAgJiYgbWV0YS0+ZmluZEludDMyKGtLZXlBdXRvTG9vcCwgJmxvb3ApICYmIGxvb3AgIT0gMCkgeworICAgICAgICBtQXV0b0xvb3AgPSB0cnVlOworICAgIH0KKworICAgIG1Db25kaXRpb24uYnJvYWRjYXN0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpub3RpZnlGbGFnc0NoYW5nZWQoaW50NjRfdCAvKiBzcmNJZCAqLywgdWludDMyX3QgZmxhZ3MpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgbVBsYXllckZsYWdzID0gZmxhZ3M7Cit9CisKKy8vIE1vZHVsYXIgRFJNCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnByZXBhcmVEcm0oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZkcm1TZXNzaW9uSWQpCit7CisgICAgQUxPR1YoInByZXBhcmVEcm0oJXApIHN0YXRlOiAlZCIsIHRoaXMsIG1TdGF0ZSk7CisKKyAgICAvLyBsZWF2aW5nIHRoZSBzdGF0ZSB2ZXJpZmljYXRpb24gZm9yIG1lZGlhcGxheWVyLmNwcAorICAgIHN0YXR1c190IHJldCA9IG1QbGF5ZXItPnByZXBhcmVEcm0odXVpZCwgZHJtU2Vzc2lvbklkKTsKKworICAgIEFMT0dWKCJwcmVwYXJlRHJtIHJldDogJWQiLCByZXQpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpyZWxlYXNlRHJtKCkKK3sKKyAgICBBTE9HVigicmVsZWFzZURybSglcCkgc3RhdGU6ICVkIiwgdGhpcywgbVN0YXRlKTsKKworICAgIC8vIGxlYXZpbmcgdGhlIHN0YXRlIHZlcmlmaWNhdGlvbiBmb3IgbWVkaWFwbGF5ZXIuY3BwCisgICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+cmVsZWFzZURybSgpOworCisgICAgQUxPR1YoInJlbGVhc2VEcm0gcmV0OiAlZCIsIHJldCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGQ6OnN0cmluZyBOdVBsYXllcjJEcml2ZXI6OnN0YXRlU3RyaW5nKFN0YXRlIHN0YXRlKSB7CisgICAgY29uc3QgY2hhciAqcnZhbCA9IE5VTEw7CisgICAgY2hhciByYXdidWZmZXJbMTZdOyAgLy8gYWxsb3dzICIlZCIKKworICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgY2FzZSBTVEFURV9JRExFOiBydmFsID0gIklETEUiOyBicmVhazsKKyAgICAgICAgY2FzZSBTVEFURV9TRVRfREFUQVNPVVJDRV9QRU5ESU5HOiBydmFsID0gIlNFVF9EQVRBU09VUkNFX1BFTkRJTkciOyBicmVhazsKKyAgICAgICAgY2FzZSBTVEFURV9VTlBSRVBBUkVEOiBydmFsID0gIlVOUFJFUEFSRUQiOyBicmVhazsKKyAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJJTkc6IHJ2YWwgPSAiUFJFUEFSSU5HIjsgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSRUQ6IHJ2YWwgPSAiUFJFUEFSRUQiOyBicmVhazsKKyAgICAgICAgY2FzZSBTVEFURV9SVU5OSU5HOiBydmFsID0gIlJVTk5JTkciOyBicmVhazsKKyAgICAgICAgY2FzZSBTVEFURV9QQVVTRUQ6IHJ2YWwgPSAiUEFVU0VEIjsgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBVEVfUkVTRVRfSU5fUFJPR1JFU1M6IHJ2YWwgPSAiUkVTRVRfSU5fUFJPR1JFU1MiOyBicmVhazsKKyAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEOiBydmFsID0gIlNUT1BQRUQiOyBicmVhazsKKyAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJJTkc6IHJ2YWwgPSAiU1RPUFBFRF9BTkRfUFJFUEFSSU5HIjsgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQ6IHJ2YWwgPSAiU1RPUFBFRF9BTkRfUFJFUEFSRUQiOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIHllcywgdGhpcyBidWZmZXIgaXMgc2hhcmVkIGFuZCB2dWxuZXJhYmxlIHRvIHJhY2VzCisgICAgICAgICAgICBzbnByaW50ZihyYXdidWZmZXIsIHNpemVvZihyYXdidWZmZXIpLCAiJWQiLCBzdGF0ZSk7CisgICAgICAgICAgICBydmFsID0gcmF3YnVmZmVyOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHJ2YWw7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRyaXZlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGEyNTY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuaApAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUxvb3BlcjsKK3N0cnVjdCBNZWRpYUNsb2NrOworc3RydWN0IE51UGxheWVyMjsKKworc3RydWN0IE51UGxheWVyMkRyaXZlciA6IHB1YmxpYyBNZWRpYVBsYXllcjJJbnRlcmZhY2UgeworICAgIGV4cGxpY2l0IE51UGxheWVyMkRyaXZlcihwaWRfdCBwaWQsIHVpZF90IHVpZCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2VEZXNjPiAmZHNkKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVOZXh0RGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlRGVzYz4gJmRzZCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBwbGF5TmV4dERhdGFTb3VyY2UoaW50NjRfdCBzcmNJZCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU3VyZmFjZVRleHR1cmUoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZud3cpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJpbmdTZXR0aW5ncygKKyAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZUFzeW5jKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKyAgICB2aXJ0dWFsIGJvb2wgaXNQbGF5aW5nKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3luY1NldHRpbmdzKEFWU3luY1NldHRpbmdzICpzeW5jLCBmbG9hdCAqdmlkZW9GcHMpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2Vla1RvKAorICAgICAgICAgICAgaW50NjRfdCBtc2VjLCBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbXNlYyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREdXJhdGlvbihpbnQ2NF90ICptc2VjKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc2V0KCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBub3RpZnlBdChpbnQ2NF90IG1lZGlhVGltZVVzKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldExvb3BpbmcoaW50IGxvb3ApOworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW52b2tlKGNvbnN0IFBhcmNlbCAmcmVxdWVzdCwgUGFyY2VsICpyZXBseSk7CisgICAgdmlydHVhbCB2b2lkIHNldEF1ZGlvU2luayhjb25zdCBzcDxBdWRpb1Npbms+ICZhdWRpb1NpbmspOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFkYXRhKAorICAgICAgICAgICAgY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXImIGlkcywgUGFyY2VsICpyZWNvcmRzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKKworICAgIHZvaWQgbm90aWZ5U2V0RGF0YVNvdXJjZUNvbXBsZXRlZChpbnQ2NF90IHNyY0lkLCBzdGF0dXNfdCBlcnIpOworICAgIHZvaWQgbm90aWZ5UHJlcGFyZUNvbXBsZXRlZChpbnQ2NF90IHNyY0lkLCBzdGF0dXNfdCBlcnIpOworICAgIHZvaWQgbm90aWZ5UmVzZXRDb21wbGV0ZShpbnQ2NF90IHNyY0lkKTsKKyAgICB2b2lkIG5vdGlmeVNldFN1cmZhY2VDb21wbGV0ZShpbnQ2NF90IHNyY0lkKTsKKyAgICB2b2lkIG5vdGlmeUR1cmF0aW9uKGludDY0X3Qgc3JjSWQsIGludDY0X3QgZHVyYXRpb25Vcyk7CisgICAgdm9pZCBub3RpZnlNb3JlUGxheWluZ1RpbWVVcyhpbnQ2NF90IHNyY0lkLCBpbnQ2NF90IHRpbWVVcyk7CisgICAgdm9pZCBub3RpZnlNb3JlUmVidWZmZXJpbmdUaW1lVXMoaW50NjRfdCBzcmNJZCwgaW50NjRfdCB0aW1lVXMpOworICAgIHZvaWQgbm90aWZ5UmVidWZmZXJpbmdXaGVuRXhpdChpbnQ2NF90IHNyY0lkLCBib29sIHN0YXR1cyk7CisgICAgdm9pZCBub3RpZnlTZWVrQ29tcGxldGUoaW50NjRfdCBzcmNJZCk7CisgICAgdm9pZCBub3RpZnlTZWVrQ29tcGxldGVfbChpbnQ2NF90IHNyY0lkKTsKKyAgICB2b2lkIG5vdGlmeUxpc3RlbmVyKGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxID0gMCwgaW50IGV4dDIgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsICppbiA9IE5VTEwpOworICAgIHZvaWQgbm90aWZ5RmxhZ3NDaGFuZ2VkKGludDY0X3Qgc3JjSWQsIHVpbnQzMl90IGZsYWdzKTsKKworICAgIC8vIE1vZHVsYXIgRFJNCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VEcm0oKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk51UGxheWVyMkRyaXZlcigpOworCitwcml2YXRlOgorICAgIGVudW0gU3RhdGUgeworICAgICAgICBTVEFURV9JRExFLAorICAgICAgICBTVEFURV9TRVRfREFUQVNPVVJDRV9QRU5ESU5HLAorICAgICAgICBTVEFURV9VTlBSRVBBUkVELAorICAgICAgICBTVEFURV9QUkVQQVJJTkcsCisgICAgICAgIFNUQVRFX1BSRVBBUkVELAorICAgICAgICBTVEFURV9SVU5OSU5HLAorICAgICAgICBTVEFURV9QQVVTRUQsCisgICAgICAgIFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTLAorICAgICAgICBTVEFURV9TVE9QUEVELCAgICAgICAgICAgICAgICAgIC8vIGVxdWl2YWxlbnQgdG8gUEFVU0VECisgICAgICAgIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORywgICAgLy8gZXF1aXZhbGVudCB0byBQQVVTRUQsIGJ1dCBzZWVraW5nCisgICAgICAgIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVELCAgICAgLy8gZXF1aXZhbGVudCB0byBQQVVTRUQsIGJ1dCBzZWVrIGNvbXBsZXRlCisgICAgfTsKKworICAgIHN0ZDo6c3RyaW5nIHN0YXRlU3RyaW5nKFN0YXRlIHN0YXRlKTsKKworICAgIGVudW0geworICAgICAgICBrV2hhdE5vdGlmeUxpc3RlbmVyLAorICAgIH07CisKKyAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOworICAgIENvbmRpdGlvbiBtQ29uZGl0aW9uOworCisgICAgU3RhdGUgbVN0YXRlOworCisgICAgc3RhdHVzX3QgbUFzeW5jUmVzdWx0OworCisgICAgLy8gVGhlIGZvbGxvd2luZyBhcmUgcHJvdGVjdGVkIHRocm91Z2ggIm1Mb2NrIgorICAgIC8vID4+PgorICAgIGludDY0X3QgbVNyY0lkOworICAgIGJvb2wgbVNldFN1cmZhY2VJblByb2dyZXNzOworICAgIGludDY0X3QgbUR1cmF0aW9uVXM7CisgICAgaW50NjRfdCBtUG9zaXRpb25VczsKKyAgICBib29sIG1TZWVrSW5Qcm9ncmVzczsKKyAgICBpbnQ2NF90IG1QbGF5aW5nVGltZVVzOworICAgIGludDY0X3QgbVJlYnVmZmVyaW5nVGltZVVzOworICAgIGludDMyX3QgbVJlYnVmZmVyaW5nRXZlbnRzOworICAgIGJvb2wgbVJlYnVmZmVyaW5nQXRFeGl0OworICAgIC8vIDw8PAorCisgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKKyAgICBzcDxBTG9vcGVyPiBtTnVQbGF5ZXIyTG9vcGVyOworICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+IG1NZWRpYUNsb2NrOworICAgIGNvbnN0IHNwPE51UGxheWVyMj4gbVBsYXllcjsKKyAgICBzcDxBdWRpb1Npbms+IG1BdWRpb1Npbms7CisgICAgdWludDMyX3QgbVBsYXllckZsYWdzOworCisgICAgTWVkaWFBbmFseXRpY3NJdGVtICptQW5hbHl0aWNzSXRlbTsKKyAgICB1aWRfdCBtQ2xpZW50VWlkOworCisgICAgYm9vbCBtQXRFT1M7CisgICAgYm9vbCBtTG9vcGluZzsKKyAgICBib29sIG1BdXRvTG9vcDsKKworICAgIHZvaWQgdXBkYXRlTWV0cmljcyhjb25zdCBjaGFyICp3aGVyZSk7CisgICAgdm9pZCBsb2dNZXRyaWNzKGNvbnN0IGNoYXIgKndoZXJlKTsKKworICAgIHN0YXR1c190IHN0YXJ0X2woKTsKKyAgICB2b2lkIG5vdGlmeUxpc3RlbmVyX2woaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEgPSAwLCBpbnQgZXh0MiA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCAqaW4gPSBOVUxMKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE51UGxheWVyMkRyaXZlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODUzYWUxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcm0uY3BwCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk51UGxheWVyMkRybSIKKworI2luY2x1ZGUgIk51UGxheWVyMkRybS5oIgorCisjaW5jbHVkZSA8bWVkaWEvTmRrV3JhcHBlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworVmVjdG9yPERybVVVSUQ+IE51UGxheWVyMkRybTo6cGFyc2VQU1NIKGNvbnN0IHZvaWQgKnBzc2gsIHNpemVfdCBwc3Noc2l6ZSkKK3sKKyAgICBWZWN0b3I8RHJtVVVJRD4gZHJtU2NoZW1lcywgZW1wdHk7CisgICAgY29uc3QgaW50IERBVEFMRU5fU0laRSA9IDQ7CisKKyAgICAvLyB0aGUgZm9ybWF0IG9mIHRoZSBidWZmZXIgaXMgMSBvciBtb3JlIG9mOgorICAgIC8vICAgIHsKKyAgICAvLyAgICAgICAgMTYgYnl0ZSB1dWlkCisgICAgLy8gICAgICAgIDQgYnl0ZSBkYXRhIGxlbmd0aCBOCisgICAgLy8gICAgICAgIE4gYnl0ZXMgb2YgZGF0YQorICAgIC8vICAgIH0KKyAgICAvLyBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBzb3VyY2UgZGF0YS4KKyAgICAvLyBTaW5jZSB3ZSBnb3QgdGhlIGRhdGEgZnJvbSBzdGFnZWZyaWdodCwgd2UgdHJ1c3QgaXQgaXMgdmFsaWQgYW5kIHByb3Blcmx5IGZvcm1hdHRlZC4KKworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSAoY29uc3QgdWludDhfdCopcHNzaDsKKyAgICBzaXplX3QgbGVuID0gcHNzaHNpemU7CisgICAgc2l6ZV90IG51bWVudHJpZXMgPSAwOworICAgIHdoaWxlIChsZW4gPiAwKSB7CisgICAgICAgIGlmIChsZW4gPCBEcm1VVUlEOjpVVUlEX1NJWkUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJQYXJzZVBTU0g6IGludmFsaWQgUFNTSCBkYXRhIik7CisgICAgICAgICAgICByZXR1cm4gZW1wdHk7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCB1aW50OF90ICp1dWlkUHRyID0gZGF0YTsKKworICAgICAgICAvLyBza2lwIHV1aWQKKyAgICAgICAgZGF0YSArPSBEcm1VVUlEOjpVVUlEX1NJWkU7CisgICAgICAgIGxlbiAtPSBEcm1VVUlEOjpVVUlEX1NJWkU7CisKKyAgICAgICAgLy8gZ2V0IGRhdGEgbGVuZ3RoCisgICAgICAgIGlmIChsZW4gPCBEQVRBTEVOX1NJWkUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJQYXJzZVBTU0g6IGludmFsaWQgUFNTSCBkYXRhIik7CisgICAgICAgICAgICByZXR1cm4gZW1wdHk7CisgICAgICAgIH0KKworICAgICAgICB1aW50MzJfdCBkYXRhbGVuID0gKigodWludDMyX3QqKWRhdGEpOworICAgICAgICBkYXRhICs9IERBVEFMRU5fU0laRTsKKyAgICAgICAgbGVuIC09IERBVEFMRU5fU0laRTsKKworICAgICAgICBpZiAobGVuIDwgZGF0YWxlbikgeworICAgICAgICAgICAgQUxPR0UoIlBhcnNlUFNTSDogaW52YWxpZCBQU1NIIGRhdGEiKTsKKyAgICAgICAgICAgIHJldHVybiBlbXB0eTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNraXAgdGhlIGRhdGEKKyAgICAgICAgZGF0YSArPSBkYXRhbGVuOworICAgICAgICBsZW4gLT0gZGF0YWxlbjsKKworICAgICAgICBEcm1VVUlEIF91dWlkKHV1aWRQdHIpOworICAgICAgICBkcm1TY2hlbWVzLmFkZChfdXVpZCk7CisKKyAgICAgICAgQUxPR1YoIlBhcnNlUFNTSFslenVdOiAlczogJXMiLCBudW1lbnRyaWVzLAorICAgICAgICAgICAgICAgIF91dWlkLnRvSGV4U3RyaW5nKCkuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgRHJtVVVJRDo6YXJyYXlUb0hleChkYXRhLCBkYXRhbGVuKS5zdHJpbmcoKQorICAgICAgICAgICAgICk7CisKKyAgICAgICAgbnVtZW50cmllcysrOworICAgIH0KKworICAgIHJldHVybiBkcm1TY2hlbWVzOworfQorCitWZWN0b3I8RHJtVVVJRD4gTnVQbGF5ZXIyRHJtOjpnZXRTdXBwb3J0ZWREcm1TY2hlbWVzKGNvbnN0IHZvaWQgKnBzc2gsIHNpemVfdCBwc3Noc2l6ZSkKK3sKKyAgICBWZWN0b3I8RHJtVVVJRD4gcHNzaERSTXMgPSBwYXJzZVBTU0gocHNzaCwgcHNzaHNpemUpOworCisgICAgVmVjdG9yPERybVVVSUQ+IHN1cHBvcnRlZERSTXM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwc3NoRFJNcy5zaXplKCk7IGkrKykgeworICAgICAgICBEcm1VVUlEIHV1aWQgPSBwc3NoRFJNc1tpXTsKKyAgICAgICAgaWYgKEFNZWRpYURybVdyYXBwZXI6OmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQucHRyKCksIE5VTEwpKSB7CisgICAgICAgICAgICBzdXBwb3J0ZWREUk1zLmFkZCh1dWlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJnZXRTdXBwb3J0ZWREcm1TY2hlbWVzOiBwc3NoRFJNczogJXp1IHN1cHBvcnRlZERSTXM6ICV6dSIsCisgICAgICAgICAgICBwc3NoRFJNcy5zaXplKCksIHN1cHBvcnRlZERSTXMuc2l6ZSgpKTsKKworICAgIHJldHVybiBzdXBwb3J0ZWREUk1zOworfQorCitzcDxBQnVmZmVyPiBOdVBsYXllcjJEcm06OnJldHJpZXZlRHJtSW5mbyhjb25zdCB2b2lkICpwc3NoLCB1aW50MzJfdCBwc3Noc2l6ZSkKK3sKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gYnVmOworCisgICAgLy8gMSkgUFNTSCBieXRlcworICAgIGJ1Zi53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4oJnBzc2hzaXplKSwgc2l6ZW9mKHBzc2hzaXplKSk7CisgICAgYnVmLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPihwc3NoKSwgcHNzaHNpemUpOworCisgICAgQUxPR1YoInJldHJpZXZlRHJtSW5mbzogTUVESUEyX0RSTV9JTkZPICBQU1NIOiBzaXplOiAldSAlcyIsIHBzc2hzaXplLAorICAgICAgICAgICAgRHJtVVVJRDo6YXJyYXlUb0hleCgodWludDhfdCopcHNzaCwgcHNzaHNpemUpLnN0cmluZygpKTsKKworICAgIC8vIDIpIHN1cHBvcnRlZERSTXMKKyAgICBWZWN0b3I8RHJtVVVJRD4gc3VwcG9ydGVkRFJNcyA9IGdldFN1cHBvcnRlZERybVNjaGVtZXMocHNzaCwgcHNzaHNpemUpOworICAgIHVpbnQzMl90IG4gPSBzdXBwb3J0ZWREUk1zLnNpemUoKTsKKyAgICBidWYud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KCZuKSwgc2l6ZW9mKG4pKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBEcm1VVUlEIHV1aWQgPSBzdXBwb3J0ZWREUk1zW2ldOworICAgICAgICBidWYud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KCZuKSwgc2l6ZW9mKG4pKTsKKyAgICAgICAgYnVmLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPih1dWlkLnB0cigpKSwgRHJtVVVJRDo6VVVJRF9TSVpFKTsKKworICAgICAgICBBTE9HVigicmV0cmlldmVEcm1JbmZvOiBNRURJQTJfRFJNX0lORk8gIHN1cHBvcnRlZFNjaGVtZVslenVdICVzIiwgaSwKKyAgICAgICAgICAgICAgICB1dWlkLnRvSGV4U3RyaW5nKCkuc3RyaW5nKCkpOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGRybUluZm9CdWZmZXIgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoYnVmLnN0cigpLmNfc3RyKCksIGJ1Zi50ZWxscCgpKTsKKyAgICByZXR1cm4gZHJtSW5mb0J1ZmZlcjsKK30KKworc3A8QUJ1ZmZlcj4gTnVQbGF5ZXIyRHJtOjpyZXRyaWV2ZURybUluZm8oUHNzaEluZm8gKnBzc2hJbmZvKQoreworCisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHBzc2gsIGRybUluZm87CisKKyAgICAvLyAwKSBHZW5lcmF0ZSBQU1NIIGJ5dGVzCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwc3NoSW5mby0+bnVtZW50cmllczsgaSsrKSB7CisgICAgICAgIFBzc2hFbnRyeSAqZW50cnkgPSAmcHNzaEluZm8tPmVudHJpZXNbaV07CisgICAgICAgIHVpbnQzMl90IGRhdGFsZW4gPSBlbnRyeS0+ZGF0YWxlbjsKKyAgICAgICAgcHNzaC53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4oJmVudHJ5LT51dWlkKSwgc2l6ZW9mKGVudHJ5LT51dWlkKSk7CisgICAgICAgIHBzc2gud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KCZkYXRhbGVuKSwgc2l6ZW9mKGRhdGFsZW4pKTsKKyAgICAgICAgcHNzaC53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4oZW50cnktPmRhdGEpLCBkYXRhbGVuKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBwc3NoU2l6ZSA9IHBzc2gudGVsbHAoKTsKKyAgICBjb25zdCB1aW50OF90KiBwc3NoUHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocHNzaC5zdHIoKS5jX3N0cigpKTsKKyAgICBjb25zdCBjaGFyICpwc3NoSGV4ID0gRHJtVVVJRDo6YXJyYXlUb0hleChwc3NoUHRyLCBwc3NoU2l6ZSkuc3RyaW5nKCk7CisgICAgQUxPR1YoInJldHJpZXZlRHJtSW5mbzogTUVESUFfRFJNX0lORk8gIFBTU0g6IHNpemU6ICV1ICVzIiwgcHNzaFNpemUsIHBzc2hIZXgpOworCisgICAgLy8gMSkgV3JpdGUgUFNTSCBieXRlcworICAgIGRybUluZm8ud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KCZwc3NoU2l6ZSksIHNpemVvZihwc3NoU2l6ZSkpOworICAgIGRybUluZm8ud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KHBzc2guc3RyKCkuY19zdHIoKSksIHBzc2hTaXplKTsKKworICAgIC8vIDIpIFdyaXRlIHN1cHBvcnRlZERSTXMKKyAgICB1aW50MzJfdCBudW1lbnRyaWVzID0gcHNzaEluZm8tPm51bWVudHJpZXM7CisgICAgZHJtSW5mby53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4oJm51bWVudHJpZXMpLCBzaXplb2YobnVtZW50cmllcykpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtZW50cmllczsgaSsrKSB7CisgICAgICAgIFBzc2hFbnRyeSAqZW50cnkgPSAmcHNzaEluZm8tPmVudHJpZXNbaV07CisgICAgICAgIGRybUluZm8ud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KCZlbnRyeS0+dXVpZCksIHNpemVvZihlbnRyeS0+dXVpZCkpOworICAgICAgICBBTE9HVigicmV0cmlldmVEcm1JbmZvOiBNRURJQV9EUk1fSU5GTyAgc3VwcG9ydGVkU2NoZW1lWyV6dV0gJXMiLCBpLAorICAgICAgICAgICAgICAgIERybVVVSUQ6OmFycmF5VG9IZXgoKGNvbnN0IHVpbnQ4X3QqKSZlbnRyeS0+dXVpZCwgc2l6ZW9mKEFNZWRpYVVVSUQpKS5zdHJpbmcoKSk7CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gZHJtSW5mb0J1ZiA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weShkcm1JbmZvLnN0cigpLmNfc3RyKCksIGRybUluZm8udGVsbHAoKSk7CisgICAgZHJtSW5mb0J1Zi0+c2V0UmFuZ2UoMCwgZHJtSW5mby50ZWxscCgpKTsKKyAgICByZXR1cm4gZHJtSW5mb0J1ZjsKK30KKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRybS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWQyNDE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcm0uaApAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE5VUExBWUVSMl9EUk1fSF8KKyNkZWZpbmUgTlVQTEFZRVIyX0RSTV9IXworCisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKworI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisgICAgc3RydWN0IERybVVVSUQgeworICAgICAgICBzdGF0aWMgY29uc3QgaW50IFVVSURfU0laRSA9IDE2OworCisgICAgICAgIERybVVVSUQoKSB7CisgICAgICAgICAgICBtZW1zZXQodGhpcy0+dXVpZCwgMCwgc2l6ZW9mKHV1aWQpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRvIGFsbG93IGRlZmluaW5nIFZlY3Rvci9LZXllZFZlY3RvciBvZiBVVUlEIHR5cGUKKyAgICAgICAgRHJtVVVJRChjb25zdCBEcm1VVUlEICZhKSB7CisgICAgICAgICAgICBtZW1jcHkodGhpcy0+dXVpZCwgYS51dWlkLCBzaXplb2YodXVpZCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdG8gYWxsb3cgZGVmaW5pbmcgVmVjdG9yL0tleWVkVmVjdG9yIG9mIFVVSUQgdHlwZQorICAgICAgICBEcm1VVUlEKGNvbnN0IHVpbnQ4X3QgdXVpZF9pbltVVUlEX1NJWkVdKSB7CisgICAgICAgICAgICBtZW1jcHkodGhpcy0+dXVpZCwgdXVpZF9pbiwgc2l6ZW9mKHV1aWQpKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0cigpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiB1dWlkOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nOCB0b0hleFN0cmluZygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBhcnJheVRvSGV4KHV1aWQsIFVVSURfU0laRSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgU3RyaW5nOCB0b0hleFN0cmluZyhjb25zdCB1aW50OF90IHV1aWRfaW5bVVVJRF9TSVpFXSkgeworICAgICAgICAgICAgcmV0dXJuIGFycmF5VG9IZXgodXVpZF9pbiwgVVVJRF9TSVpFKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBTdHJpbmc4IGFycmF5VG9IZXgoY29uc3QgdWludDhfdCAqYXJyYXksIGludCBieXRlcykgeworICAgICAgICAgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlMDJ4IiwgYXJyYXlbaV0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHVpbnQ4X3QgdXVpZFtVVUlEX1NJWkVdOworICAgIH07CisKKworICAgIHN0cnVjdCBOdVBsYXllcjJEcm0geworCisgICAgICAgIC8vIHN0YXRpYyBoZWxwZXJzIC0gaW50ZXJuYWwKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgc3RhdGljIFZlY3RvcjxEcm1VVUlEPiBwYXJzZVBTU0goY29uc3Qgdm9pZCAqcHNzaCwgc2l6ZV90IHBzc2hzaXplKTsKKyAgICAgICAgc3RhdGljIFZlY3RvcjxEcm1VVUlEPiBnZXRTdXBwb3J0ZWREcm1TY2hlbWVzKGNvbnN0IHZvaWQgKnBzc2gsIHNpemVfdCBwc3Noc2l6ZSk7CisKKyAgICAgICAgLy8gc3RhdGljIGhlbHBlcnMgLSBwdWJsaWMKKworICAgIHB1YmxpYzoKKyAgICAgICAgc3RhdGljIHNwPEFCdWZmZXI+IHJldHJpZXZlRHJtSW5mbyhjb25zdCB2b2lkICpwc3NoLCB1aW50MzJfdCBwc3Noc2l6ZSk7CisgICAgICAgIHN0YXRpYyBzcDxBQnVmZmVyPiByZXRyaWV2ZURybUluZm8oUHNzaEluZm8gKik7CisKKyAgICB9OyAgLy8gTnVQbGF5ZXIyRHJtCisKK30gICAvLyBhbmRyb2lkCisKKyNlbmRpZiAgICAgLy9OVVBMQVlFUjJfRFJNX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlJlbmRlcmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyUmVuZGVyZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYmQ5MDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlJlbmRlcmVyLmNwcApAQCAtMCwwICsxLDIwNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk51UGxheWVyMlJlbmRlcmVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiSldha2VMb2NrLmgiCisjaW5jbHVkZSAiTnVQbGF5ZXIyUmVuZGVyZXIuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ2xvY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoKKyAqIEV4YW1wbGUgb2YgY29tbW9uIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgaW4gc2hlbGwgc2NyaXB0IGZvcm0KKworICAgI1R1cm4gb2ZmbG9hZCBhdWRpbyBvZmYgKHVzZSBQQ00gZm9yIFBsYXkgTXVzaWMpIC0tIEF1ZGlvUG9saWN5TWFuYWdlcgorICAgYWRiIHNoZWxsIHNldHByb3AgYXVkaW8ub2ZmbG9hZC5kaXNhYmxlIDEKKworICAgI0FsbG93IG9mZmxvYWQgYXVkaW8gd2l0aCB2aWRlbyAocmVxdWlyZXMgb2ZmbG9hZGluZyB0byBiZSBlbmFibGVkKSAtLSBBdWRpb1BvbGljeU1hbmFnZXIKKyAgIGFkYiBzaGVsbCBzZXRwcm9wIGF1ZGlvLm9mZmxvYWQudmlkZW8gMQorCisgICAjVXNlIGF1ZGlvIGNhbGxiYWNrcyBmb3IgUENNIGRhdGEKKyAgIGFkYiBzaGVsbCBzZXRwcm9wIG1lZGlhLnN0YWdlZnJpZ2h0LmF1ZGlvLmNiayAxCisKKyAgICNVc2UgZGVlcCBidWZmZXIgZm9yIFBDTSBkYXRhIHdpdGggdmlkZW8gKGl0IGlzIGdlbmVyYWxseSBlbmFibGVkIGZvciBhdWRpby1vbmx5KQorICAgYWRiIHNoZWxsIHNldHByb3AgbWVkaWEuc3RhZ2VmcmlnaHQuYXVkaW8uZGVlcCAxCisKKyAgICNTZXQgc2l6ZSBvZiBidWZmZXJzIGZvciBwY20gYXVkaW8gc2luayBpbiBtc2VjIChleGFtcGxlOiAxMDAwIG1zZWMpCisgICBhZGIgc2hlbGwgc2V0cHJvcCBtZWRpYS5zdGFnZWZyaWdodC5hdWRpby5zaW5rIDEwMDAKKworICogVGhlc2UgY29uZmlndXJhdGlvbnMgdGFrZSBlZmZlY3QgZm9yIHRoZSBuZXh0IHRyYWNrIHBsYXllZCAobm90IHRoZSBjdXJyZW50IHRyYWNrKS4KKyAqLworCitzdGF0aWMgaW5saW5lIGJvb2wgZ2V0VXNlQXVkaW9DYWxsYmFja1NldHRpbmcoKSB7CisgICAgcmV0dXJuIHByb3BlcnR5X2dldF9ib29sKCJtZWRpYS5zdGFnZWZyaWdodC5hdWRpby5jYmsiLCBmYWxzZSAvKiBkZWZhdWx0X3ZhbHVlICovKTsKK30KKworc3RhdGljIGlubGluZSBpbnQzMl90IGdldEF1ZGlvU2lua1BjbU1zU2V0dGluZygpIHsKKyAgICByZXR1cm4gcHJvcGVydHlfZ2V0X2ludDMyKAorICAgICAgICAgICAgIm1lZGlhLnN0YWdlZnJpZ2h0LmF1ZGlvLnNpbmsiLCA1MDAgLyogZGVmYXVsdF92YWx1ZSAqLyk7Cit9CisKKy8vIE1heGltdW0gdGltZSBpbiBwYXVzZWQgc3RhdGUgd2hlbiBvZmZsb2FkaW5nIGF1ZGlvIGRlY29tcHJlc3Npb24uIFdoZW4gZWxhcHNlZCwgdGhlIEF1ZGlvU2luaworLy8gaXMgY2xvc2VkIHRvIGFsbG93IHRoZSBhdWRpbyBEU1AgdG8gcG93ZXIgZG93bi4KK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtPZmZsb2FkUGF1c2VNYXhVcyA9IDEwMDAwMDAwbGw7CisKKy8vIE1heGltdW0gYWxsb3dlZCBkZWxheSBmcm9tIEF1ZGlvU2luaywgMS41IHNlY29uZHMuCitzdGF0aWMgY29uc3QgaW50NjRfdCBrTWF4QWxsb3dlZEF1ZGlvU2lua0RlbGF5VXMgPSAxNTAwMDAwbGw7CisKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtNaW5pbXVtQXVkaW9DbG9ja1VwZGF0ZVBlcmlvZFVzID0gMjAgLyogbXNlYyAqLyAqIDEwMDA7CisKKy8vIHN0YXRpYworY29uc3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6UGNtSW5mbyBOdVBsYXllcjI6OlJlbmRlcmVyOjpBVURJT19QQ01JTkZPX0lOSVRJQUxJWkVSID0geworICAgICAgICBBVURJT19DSEFOTkVMX05PTkUsCisgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgIEFVRElPX0ZPUk1BVF9JTlZBTElELAorICAgICAgICAwLCAvLyBtTnVtQ2hhbm5lbHMKKyAgICAgICAgMCAvLyBtU2FtcGxlUmF0ZQorfTsKKworLy8gc3RhdGljCitjb25zdCBpbnQ2NF90IE51UGxheWVyMjo6UmVuZGVyZXI6OmtNaW5Qb3NpdGlvblVwZGF0ZURlbGF5VXMgPSAxMDAwMDBsbDsKKworTnVQbGF5ZXIyOjpSZW5kZXJlcjo6UmVuZGVyZXIoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhUGxheWVyMkludGVyZmFjZTo6QXVkaW9TaW5rPiAmc2luaywKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2ssCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICB1aW50MzJfdCBmbGFncykKKyAgICA6IG1BdWRpb1Npbmsoc2luayksCisgICAgICBtVXNlVmlydHVhbEF1ZGlvU2luayhmYWxzZSksCisgICAgICBtTm90aWZ5KG5vdGlmeSksCisgICAgICBtRmxhZ3MoZmxhZ3MpLAorICAgICAgbU51bUZyYW1lc1dyaXR0ZW4oMCksCisgICAgICBtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZyhmYWxzZSksCisgICAgICBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZyhmYWxzZSksCisgICAgICBtQXVkaW9RdWV1ZUdlbmVyYXRpb24oMCksCisgICAgICBtVmlkZW9RdWV1ZUdlbmVyYXRpb24oMCksCisgICAgICBtQXVkaW9EcmFpbkdlbmVyYXRpb24oMCksCisgICAgICBtVmlkZW9EcmFpbkdlbmVyYXRpb24oMCksCisgICAgICBtQXVkaW9FT1NHZW5lcmF0aW9uKDApLAorICAgICAgbU1lZGlhQ2xvY2sobWVkaWFDbG9jayksCisgICAgICBtUGxheWJhY2tTZXR0aW5ncyhBVURJT19QTEFZQkFDS19SQVRFX0RFRkFVTFQpLAorICAgICAgbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcygtMSksCisgICAgICBtQW5jaG9yVGltZU1lZGlhVXMoLTEpLAorICAgICAgbUFuY2hvck51bUZyYW1lc1dyaXR0ZW4oLTEpLAorICAgICAgbVZpZGVvTGF0ZUJ5VXMoMGxsKSwKKyAgICAgIG1OZXh0VmlkZW9UaW1lTWVkaWFVcygtMSksCisgICAgICBtSGFzQXVkaW8oZmFsc2UpLAorICAgICAgbUhhc1ZpZGVvKGZhbHNlKSwKKyAgICAgIG1Ob3RpZnlDb21wbGV0ZUF1ZGlvKGZhbHNlKSwKKyAgICAgIG1Ob3RpZnlDb21wbGV0ZVZpZGVvKGZhbHNlKSwKKyAgICAgIG1TeW5jUXVldWVzKGZhbHNlKSwKKyAgICAgIG1QYXVzZWQoZmFsc2UpLAorICAgICAgbVBhdXNlRHJhaW5BdWRpb0FsbG93ZWRVcygwKSwKKyAgICAgIG1WaWRlb1NhbXBsZVJlY2VpdmVkKGZhbHNlKSwKKyAgICAgIG1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQoZmFsc2UpLAorICAgICAgbVZpZGVvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uKDApLAorICAgICAgbUF1ZGlvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uKDApLAorICAgICAgbVJlbmRlcmluZ0RhdGFEZWxpdmVyZWQoZmFsc2UpLAorICAgICAgbU5leHRBdWRpb0Nsb2NrVXBkYXRlVGltZVVzKC0xKSwKKyAgICAgIG1MYXN0QXVkaW9NZWRpYVRpbWVVcygtMSksCisgICAgICBtQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0R2VuZXJhdGlvbigwKSwKKyAgICAgIG1BdWRpb1Rvcm5Eb3duKGZhbHNlKSwKKyAgICAgIG1DdXJyZW50T2ZmbG9hZEluZm8oQVVESU9fSU5GT19JTklUSUFMSVpFUiksCisgICAgICBtQ3VycmVudFBjbUluZm8oQVVESU9fUENNSU5GT19JTklUSUFMSVpFUiksCisgICAgICBtVG90YWxCdWZmZXJzUXVldWVkKDApLAorICAgICAgbUxhc3RBdWRpb0J1ZmZlckRyYWluZWQoMCksCisgICAgICBtVXNlQXVkaW9DYWxsYmFjayhmYWxzZSksCisgICAgICBtV2FrZUxvY2sobmV3IEpXYWtlTG9jaygpKSB7CisgICAgQ0hFQ0sobWVkaWFDbG9jayAhPSBOVUxMKTsKKyAgICBtUGxheWJhY2tSYXRlID0gbVBsYXliYWNrU2V0dGluZ3MubVNwZWVkOworICAgIG1NZWRpYUNsb2NrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrUmF0ZSk7Cit9CisKK051UGxheWVyMjo6UmVuZGVyZXI6On5SZW5kZXJlcigpIHsKKyAgICBpZiAob2ZmbG9hZGluZ0F1ZGlvKCkpIHsKKyAgICAgICAgbUF1ZGlvU2luay0+c3RvcCgpOworICAgICAgICBtQXVkaW9TaW5rLT5mbHVzaCgpOworICAgICAgICBtQXVkaW9TaW5rLT5jbG9zZSgpOworICAgIH0KKworICAgIC8vIFRyeSB0byBhdm9pZCByYWNpbmcgY29uZGl0aW9uIGluIGNhc2UgY2FsbGJhY2sgaXMgc3RpbGwgb24uCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAobVVzZUF1ZGlvQ2FsbGJhY2spIHsKKyAgICAgICAgZmx1c2hRdWV1ZSgmbUF1ZGlvUXVldWUpOworICAgICAgICBmbHVzaFF1ZXVlKCZtVmlkZW9RdWV1ZSk7CisgICAgfQorICAgIG1XYWtlTG9jay5jbGVhcigpOworICAgIG1WaWRlb1NjaGVkdWxlci5jbGVhcigpOworICAgIG1Ob3RpZnkuY2xlYXIoKTsKKyAgICBtQXVkaW9TaW5rLmNsZWFyKCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6cXVldWVCdWZmZXIoCisgICAgICAgIGJvb2wgYXVkaW8sCisgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5Q29uc3VtZWQpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UXVldWVCdWZmZXIsIHRoaXMpOworICAgIG1zZy0+c2V0SW50MzIoInF1ZXVlR2VuZXJhdGlvbiIsIGdldFF1ZXVlR2VuZXJhdGlvbihhdWRpbykpOworICAgIG1zZy0+c2V0SW50MzIoImF1ZGlvIiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oYXVkaW8pKTsKKyAgICBtc2ctPnNldE9iamVjdCgiYnVmZmVyIiwgYnVmZmVyKTsKKyAgICBtc2ctPnNldE1lc3NhZ2UoIm5vdGlmeUNvbnN1bWVkIiwgbm90aWZ5Q29uc3VtZWQpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6OnF1ZXVlRU9TKGJvb2wgYXVkaW8sIHN0YXR1c190IGZpbmFsUmVzdWx0KSB7CisgICAgQ0hFQ0tfTkUoZmluYWxSZXN1bHQsIChzdGF0dXNfdClPSyk7CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UXVldWVFT1MsIHRoaXMpOworICAgIG1zZy0+c2V0SW50MzIoInF1ZXVlR2VuZXJhdGlvbiIsIGdldFF1ZXVlR2VuZXJhdGlvbihhdWRpbykpOworICAgIG1zZy0+c2V0SW50MzIoImF1ZGlvIiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oYXVkaW8pKTsKKyAgICBtc2ctPnNldEludDMyKCJmaW5hbFJlc3VsdCIsIGZpbmFsUmVzdWx0KTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6c2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb25maWdQbGF5YmFjaywgdGhpcyk7CisgICAgd3JpdGVUb0FNZXNzYWdlKG1zZywgcmF0ZSk7CisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKyAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvbkNvbmZpZ1BsYXliYWNrKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlIC8qIHNhbml0aXplZCAqLykgeworICAgIGlmIChyYXRlLm1TcGVlZCA9PSAwLmYpIHsKKyAgICAgICAgb25QYXVzZSgpOworICAgICAgICAvLyBkb24ndCBjYWxsIGF1ZGlvc2luaydzIHNldFBsYXliYWNrUmF0ZSBpZiBwYXVzaW5nLCBhcyBwaXRjaCBkb2VzIG5vdAorICAgICAgICAvLyBoYXZlIHRvIGNvcnJlc3BvbmQgdG8gdGhlIGFueSBub24tMCBzcGVlZCAoZS5nIG9sZCBzcGVlZCkuIEtlZXAKKyAgICAgICAgLy8gc2V0dGluZ3Mgbm9uZXRoZWxlc3MsIHVzaW5nIHRoZSBvbGQgc3BlZWQsIGluIGNhc2UgYXVkaW9zaW5rIGNoYW5nZXMuCisgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlIG5ld1JhdGUgPSByYXRlOworICAgICAgICBuZXdSYXRlLm1TcGVlZCA9IG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZDsKKyAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSBuZXdSYXRlOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCAmJiBtQXVkaW9TaW5rLT5yZWFkeSgpKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1NpbmstPnNldFBsYXliYWNrUmF0ZShyYXRlKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKyAgICBtUGxheWJhY2tTZXR0aW5ncyA9IHJhdGU7CisgICAgbVBsYXliYWNrUmF0ZSA9IHJhdGUubVNwZWVkOworICAgIG1NZWRpYUNsb2NrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrUmF0ZSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OlJlbmRlcmVyOjpnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlIC8qIG5vbm51bGwgKi8pIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0UGxheWJhY2tTZXR0aW5ncywgdGhpcyk7CisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKyAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICByZWFkRnJvbUFNZXNzYWdlKHJlc3BvbnNlLCByYXRlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvbkdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUgLyogbm9ubnVsbCAqLykgeworICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwgJiYgbUF1ZGlvU2luay0+cmVhZHkoKSkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQXVkaW9TaW5rLT5nZXRQbGF5YmFja1JhdGUocmF0ZSk7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIGlmICghaXNBdWRpb1BsYXliYWNrUmF0ZUVxdWFsKCpyYXRlLCBtUGxheWJhY2tTZXR0aW5ncykpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiY29ycmVjdGluZyBtaXNtYXRjaCBpbiBpbnRlcm5hbC9leHRlcm5hbCBwbGF5YmFjayByYXRlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBnZXQgcGxheWJhY2sgc2V0dGluZ3MgdXNlZCBieSBhdWRpb3NpbmssIGFzIGl0IG1heSBiZQorICAgICAgICAgICAgLy8gc2xpZ2h0bHkgb2ZmIGR1ZSB0byBhdWRpb3Npbmsgbm90IHRha2luZyBzbWFsbCBjaGFuZ2VzLgorICAgICAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSAqcmF0ZTsKKyAgICAgICAgICAgIGlmIChtUGF1c2VkKSB7CisgICAgICAgICAgICAgICAgcmF0ZS0+bVNwZWVkID0gMC5mOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgICpyYXRlID0gbVBsYXliYWNrU2V0dGluZ3M7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OlJlbmRlcmVyOjpzZXRTeW5jU2V0dGluZ3MoY29uc3QgQVZTeW5jU2V0dGluZ3MgJnN5bmMsIGZsb2F0IHZpZGVvRnBzSGludCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb25maWdTeW5jLCB0aGlzKTsKKyAgICB3cml0ZVRvQU1lc3NhZ2UobXNnLCBzeW5jLCB2aWRlb0Zwc0hpbnQpOworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25Db25maWdTeW5jKGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQgX191bnVzZWQpIHsKKyAgICBpZiAoc3luYy5tU291cmNlICE9IEFWU1lOQ19TT1VSQ0VfREVGQVVMVCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICAvLyBUT0RPOiBzdXBwb3J0IHN5bmMgc291cmNlcworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6Z2V0U3luY1NldHRpbmdzKEFWU3luY1NldHRpbmdzICpzeW5jLCBmbG9hdCAqdmlkZW9GcHMpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0U3luY1NldHRpbmdzLCB0aGlzKTsKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIHJlYWRGcm9tQU1lc3NhZ2UocmVzcG9uc2UsIHN5bmMsIHZpZGVvRnBzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvbkdldFN5bmNTZXR0aW5ncygKKyAgICAgICAgQVZTeW5jU2V0dGluZ3MgKnN5bmMgLyogbm9ubnVsbCAqLywgZmxvYXQgKnZpZGVvRnBzIC8qIG5vbm51bGwgKi8pIHsKKyAgICAqc3luYyA9IG1TeW5jU2V0dGluZ3M7CisgICAgKnZpZGVvRnBzID0gLTEuZjsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6Zmx1c2goYm9vbCBhdWRpbywgYm9vbCBub3RpZnlDb21wbGV0ZSkgeworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKGF1ZGlvKSB7CisgICAgICAgICAgICBtTm90aWZ5Q29tcGxldGVBdWRpbyB8PSBub3RpZnlDb21wbGV0ZTsKKyAgICAgICAgICAgIGNsZWFyQXVkaW9GaXJzdEFuY2hvclRpbWVfbCgpOworICAgICAgICAgICAgKyttQXVkaW9RdWV1ZUdlbmVyYXRpb247CisgICAgICAgICAgICArK21BdWRpb0RyYWluR2VuZXJhdGlvbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Ob3RpZnlDb21wbGV0ZVZpZGVvIHw9IG5vdGlmeUNvbXBsZXRlOworICAgICAgICAgICAgKyttVmlkZW9RdWV1ZUdlbmVyYXRpb247CisgICAgICAgICAgICArK21WaWRlb0RyYWluR2VuZXJhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIG1NZWRpYUNsb2NrLT5jbGVhckFuY2hvcigpOworICAgICAgICBtVmlkZW9MYXRlQnlVcyA9IDA7CisgICAgICAgIG1OZXh0VmlkZW9UaW1lTWVkaWFVcyA9IC0xOworICAgICAgICBtU3luY1F1ZXVlcyA9IGZhbHNlOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRGbHVzaCwgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQzMigiYXVkaW8iLCBzdGF0aWNfY2FzdDxpbnQzMl90PihhdWRpbykpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6OnNpZ25hbFRpbWVEaXNjb250aW51aXR5KCkgeworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6OnNpZ25hbERpc2FibGVPZmZsb2FkQXVkaW8oKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdERpc2FibGVPZmZsb2FkQXVkaW8sIHRoaXMpKS0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6OnNpZ25hbEVuYWJsZU9mZmxvYWRBdWRpbygpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0RW5hYmxlT2ZmbG9hZEF1ZGlvLCB0aGlzKSktPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpwYXVzZSgpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UGF1c2UsIHRoaXMpKS0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6OnJlc3VtZSgpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCB0aGlzKSktPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpzZXRWaWRlb0ZyYW1lUmF0ZShmbG9hdCBmcHMpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0VmlkZW9GcmFtZVJhdGUsIHRoaXMpOworICAgIG1zZy0+c2V0RmxvYXQoImZyYW1lLXJhdGUiLCBmcHMpOworICAgIG1zZy0+cG9zdCgpOworfQorCisvLyBDYWxsZWQgb24gYW55IHRocmVhZHMgd2l0aG91dCBtTG9jayBhY3F1aXJlZC4KK3N0YXR1c190IE51UGxheWVyMjo6UmVuZGVyZXI6OmdldEN1cnJlbnRQb3NpdGlvbihpbnQ2NF90ICptZWRpYVVzKSB7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gbU1lZGlhQ2xvY2stPmdldE1lZGlhVGltZShBTG9vcGVyOjpHZXROb3dVcygpLCBtZWRpYVVzKTsKKyAgICBpZiAocmVzdWx0ID09IE9LKSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLy8gTWVkaWFDbG9jayBoYXMgbm90IHN0YXJ0ZWQgeWV0LiBUcnkgdG8gc3RhcnQgaXQgaWYgcG9zc2libGUuCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICBpZiAobUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcyA9PSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIEF1ZGlvVGltZXN0YW1wIHRzOworICAgICAgICBzdGF0dXNfdCByZXMgPSBtQXVkaW9TaW5rLT5nZXRUaW1lc3RhbXAodHMpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgLy8gQXVkaW9TaW5rIGhhcyByZW5kZXJlZCBzb21lIGZyYW1lcy4KKyAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgICAgIGludDY0X3Qgbm93TWVkaWFVcyA9IG1BdWRpb1NpbmstPmdldFBsYXllZE91dER1cmF0aW9uVXMobm93VXMpCisgICAgICAgICAgICAgICAgKyBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzOworICAgICAgICBtTWVkaWFDbG9jay0+dXBkYXRlQW5jaG9yKG5vd01lZGlhVXMsIG5vd1VzLCAtMSk7CisgICAgfQorCisgICAgcmV0dXJuIG1NZWRpYUNsb2NrLT5nZXRNZWRpYVRpbWUoQUxvb3Blcjo6R2V0Tm93VXMoKSwgbWVkaWFVcyk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6Y2xlYXJBdWRpb0ZpcnN0QW5jaG9yVGltZV9sKCkgeworICAgIG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMgPSAtMTsKKyAgICBtTWVkaWFDbG9jay0+c2V0U3RhcnRpbmdUaW1lTWVkaWEoLTEpOworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6OnNldEF1ZGlvRmlyc3RBbmNob3JUaW1lSWZOZWVkZWRfbChpbnQ2NF90IG1lZGlhVXMpIHsKKyAgICBpZiAobUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcyA9PSAtMSkgeworICAgICAgICBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzID0gbWVkaWFVczsKKyAgICAgICAgbU1lZGlhQ2xvY2stPnNldFN0YXJ0aW5nVGltZU1lZGlhKG1lZGlhVXMpOworICAgIH0KK30KKworLy8gQ2FsbGVkIG9uIHJlbmRlcmVyIGxvb3Blci4KK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6Y2xlYXJBbmNob3JUaW1lKCkgeworICAgIG1NZWRpYUNsb2NrLT5jbGVhckFuY2hvcigpOworICAgIG1BbmNob3JUaW1lTWVkaWFVcyA9IC0xOworICAgIG1BbmNob3JOdW1GcmFtZXNXcml0dGVuID0gLTE7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6c2V0VmlkZW9MYXRlQnlVcyhpbnQ2NF90IGxhdGVVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbVZpZGVvTGF0ZUJ5VXMgPSBsYXRlVXM7Cit9CisKK2ludDY0X3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6Z2V0VmlkZW9MYXRlQnlVcygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiBtVmlkZW9MYXRlQnlVczsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b3BlbkF1ZGlvU2luaygKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIGJvb2wgb2ZmbG9hZE9ubHksCisgICAgICAgIGJvb2wgaGFzVmlkZW8sCisgICAgICAgIHVpbnQzMl90IGZsYWdzLAorICAgICAgICBib29sICppc09mZmxvYWRlZCwKKyAgICAgICAgYm9vbCBpc1N0cmVhbWluZykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPcGVuQXVkaW9TaW5rLCB0aGlzKTsKKyAgICBtc2ctPnNldE1lc3NhZ2UoImZvcm1hdCIsIGZvcm1hdCk7CisgICAgbXNnLT5zZXRJbnQzMigib2ZmbG9hZC1vbmx5Iiwgb2ZmbG9hZE9ubHkpOworICAgIG1zZy0+c2V0SW50MzIoImhhcy12aWRlbyIsIGhhc1ZpZGVvKTsKKyAgICBtc2ctPnNldEludDMyKCJmbGFncyIsIGZsYWdzKTsKKyAgICBtc2ctPnNldEludDMyKCJpc1N0cmVhbWluZyIsIGlzU3RyZWFtaW5nKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBwb3N0U3RhdHVzID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworCisgICAgaW50MzJfdCBlcnI7CisgICAgaWYgKHBvc3RTdGF0dXMgIT0gT0sgfHwgcmVzcG9uc2UuZ2V0KCkgPT0gbnVsbHB0ciB8fCAhcmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpIHsKKyAgICAgICAgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfSBlbHNlIGlmIChlcnIgPT0gT0sgJiYgaXNPZmZsb2FkZWQgIT0gTlVMTCkgeworICAgICAgICBpbnQzMl90IG9mZmxvYWQ7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoIm9mZmxvYWQiLCAmb2ZmbG9hZCkpOworICAgICAgICAqaXNPZmZsb2FkZWQgPSAob2ZmbG9hZCAhPSAwKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpjbG9zZUF1ZGlvU2luaygpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2xvc2VBdWRpb1NpbmssIHRoaXMpOworCisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpjaGFuZ2VBdWRpb0Zvcm1hdCgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIGJvb2wgb2ZmbG9hZE9ubHksCisgICAgICAgIGJvb2wgaGFzVmlkZW8sCisgICAgICAgIHVpbnQzMl90IGZsYWdzLAorICAgICAgICBib29sIGlzU3RyZWFtaW5nLAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSkgeworICAgIHNwPEFNZXNzYWdlPiBtZXRhID0gbmV3IEFNZXNzYWdlOworICAgIG1ldGEtPnNldE1lc3NhZ2UoImZvcm1hdCIsIGZvcm1hdCk7CisgICAgbWV0YS0+c2V0SW50MzIoIm9mZmxvYWQtb25seSIsIG9mZmxvYWRPbmx5KTsKKyAgICBtZXRhLT5zZXRJbnQzMigiaGFzLXZpZGVvIiwgaGFzVmlkZW8pOworICAgIG1ldGEtPnNldEludDMyKCJmbGFncyIsIGZsYWdzKTsKKyAgICBtZXRhLT5zZXRJbnQzMigiaXNTdHJlYW1pbmciLCBpc1N0cmVhbWluZyk7CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2hhbmdlQXVkaW9Gb3JtYXQsIHRoaXMpOworICAgIG1zZy0+c2V0SW50MzIoInF1ZXVlR2VuZXJhdGlvbiIsIGdldFF1ZXVlR2VuZXJhdGlvbih0cnVlIC8qIGF1ZGlvICovKSk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJub3RpZnkiLCBub3RpZnkpOworICAgIG1zZy0+c2V0TWVzc2FnZSgibWV0YSIsIG1ldGEpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0T3BlbkF1ZGlvU2luazoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKTsKKworICAgICAgICAgICAgaW50MzJfdCBvZmZsb2FkT25seTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJvZmZsb2FkLW9ubHkiLCAmb2ZmbG9hZE9ubHkpKTsKKworICAgICAgICAgICAgaW50MzJfdCBoYXNWaWRlbzsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJoYXMtdmlkZW8iLCAmaGFzVmlkZW8pKTsKKworICAgICAgICAgICAgdWludDMyX3QgZmxhZ3M7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZmxhZ3MiLCAoaW50MzJfdCAqKSZmbGFncykpOworCisgICAgICAgICAgICB1aW50MzJfdCBpc1N0cmVhbWluZzsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJpc1N0cmVhbWluZyIsIChpbnQzMl90ICopJmlzU3RyZWFtaW5nKSk7CisKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG9uT3BlbkF1ZGlvU2luayhmb3JtYXQsIG9mZmxvYWRPbmx5LCBoYXNWaWRlbywgZmxhZ3MsIGlzU3RyZWFtaW5nKTsKKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJvZmZsb2FkIiwgb2ZmbG9hZGluZ0F1ZGlvKCkpOworCisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdENsb3NlQXVkaW9TaW5rOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKworICAgICAgICAgICAgb25DbG9zZUF1ZGlvU2luaygpOworCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0U3RvcEF1ZGlvU2luazoKKyAgICAgICAgeworICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RvcCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0Q2hhbmdlQXVkaW9Gb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgcXVldWVHZW5lcmF0aW9uOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInF1ZXVlR2VuZXJhdGlvbiIsICZxdWV1ZUdlbmVyYXRpb24pKTsKKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoIm5vdGlmeSIsICZub3RpZnkpKTsKKworICAgICAgICAgICAgaWYgKG9mZmxvYWRpbmdBdWRpbygpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImNoYW5nZUF1ZGlvRm9ybWF0IHNob3VsZCBOT1QgYmUgY2FsbGVkIGluIG9mZmxvYWQgbW9kZSIpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIElOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1ldGE7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJtZXRhIiwgJm1ldGEpKTsKKworICAgICAgICAgICAgaWYgKHF1ZXVlR2VuZXJhdGlvbiAhPSBnZXRRdWV1ZUdlbmVyYXRpb24odHJ1ZSAvKiBhdWRpbyAqLykKKyAgICAgICAgICAgICAgICAgICAgfHwgbUF1ZGlvUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG9uQ2hhbmdlQXVkaW9Gb3JtYXQobWV0YSwgbm90aWZ5KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUXVldWVFbnRyeSBlbnRyeTsKKyAgICAgICAgICAgIGVudHJ5Lm1Ob3RpZnlDb25zdW1lZCA9IG5vdGlmeTsKKyAgICAgICAgICAgIGVudHJ5Lm1NZXRhID0gbWV0YTsKKworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgIG1BdWRpb1F1ZXVlLnB1c2hfYmFjayhlbnRyeSk7CisgICAgICAgICAgICBwb3N0RHJhaW5BdWRpb1F1ZXVlX2woKTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0RHJhaW5BdWRpb1F1ZXVlOgorICAgICAgICB7CisgICAgICAgICAgICBtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZyA9IGZhbHNlOworCisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZHJhaW5HZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IGdldERyYWluR2VuZXJhdGlvbih0cnVlIC8qIGF1ZGlvICovKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob25EcmFpbkF1ZGlvUXVldWUoKSkgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IG51bUZyYW1lc1BsYXllZDsKKyAgICAgICAgICAgICAgICBDSEVDS19FUShtQXVkaW9TaW5rLT5nZXRQb3NpdGlvbigmbnVtRnJhbWVzUGxheWVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdHVzX3QpT0spOworCisgICAgICAgICAgICAgICAgLy8gSGFuZGxlIEF1ZGlvVHJhY2sgcmFjZSB3aGVuIHN0YXJ0IGlzIGltbWVkaWF0ZWx5IGNhbGxlZCBhZnRlciBmbHVzaC4KKyAgICAgICAgICAgICAgICB1aW50MzJfdCBudW1GcmFtZXNQZW5kaW5nUGxheW91dCA9CisgICAgICAgICAgICAgICAgICAgIChtTnVtRnJhbWVzV3JpdHRlbiA+IG51bUZyYW1lc1BsYXllZCA/CisgICAgICAgICAgICAgICAgICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbiAtIG51bUZyYW1lc1BsYXllZCA6IDApOworCisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBob3cgbG9uZyB0aGUgYXVkaW8gc2luayB3aWxsIGhhdmUgZGF0YSB0bworICAgICAgICAgICAgICAgIC8vIHBsYXkgYmFjay4KKyAgICAgICAgICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPQorICAgICAgICAgICAgICAgICAgICBtQXVkaW9TaW5rLT5tc2Vjc1BlckZyYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICogbnVtRnJhbWVzUGVuZGluZ1BsYXlvdXQgKiAxMDAwbGw7CisgICAgICAgICAgICAgICAgaWYgKG1QbGF5YmFja1JhdGUgPiAxLjBmKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGF5VXMgLz0gbVBsYXliYWNrUmF0ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBMZXQncyBnaXZlIGl0IG1vcmUgZGF0YSBhZnRlciBhYm91dCBoYWxmIHRoYXQgdGltZQorICAgICAgICAgICAgICAgIC8vIGhhcyBlbGFwc2VkLgorICAgICAgICAgICAgICAgIGRlbGF5VXMgLz0gMjsKKyAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGUgYnVmZmVyIHNpemUgdG8gZXN0aW1hdGUgbWF4aW11bSBkZWxheSBwZXJtaXR0ZWQuCisgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBtYXhEcmFpbkRlbGF5VXMgPSBzdGQ6Om1heCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1NpbmstPmdldEJ1ZmZlckR1cmF0aW9uSW5VcygpLCAoaW50NjRfdCk1MDAwMDAgLyogaGFsZiBzZWNvbmQgKi8pOworICAgICAgICAgICAgICAgIEFMT0dEX0lGKGRlbGF5VXMgPiBtYXhEcmFpbkRlbGF5VXMsICJwb3N0RHJhaW5BdWRpb1F1ZXVlIGxvbmcgZGVsYXk6ICVsbGQgPiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZGVsYXlVcywgKGxvbmcgbG9uZyltYXhEcmFpbkRlbGF5VXMpOworICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgICAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZV9sKGRlbGF5VXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0RHJhaW5WaWRlb1F1ZXVlOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZHJhaW5HZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IGdldERyYWluR2VuZXJhdGlvbihmYWxzZSAvKiBhdWRpbyAqLykpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmcgPSBmYWxzZTsKKworICAgICAgICAgICAgb25EcmFpblZpZGVvUXVldWUoKTsKKworICAgICAgICAgICAgcG9zdERyYWluVmlkZW9RdWV1ZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UG9zdERyYWluVmlkZW9RdWV1ZToKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImRyYWluR2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBnZXREcmFpbkdlbmVyYXRpb24oZmFsc2UgLyogYXVkaW8gKi8pKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nID0gZmFsc2U7CisgICAgICAgICAgICBwb3N0RHJhaW5WaWRlb1F1ZXVlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRRdWV1ZUJ1ZmZlcjoKKyAgICAgICAgeworICAgICAgICAgICAgb25RdWV1ZUJ1ZmZlcihtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UXVldWVFT1M6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uUXVldWVFT1MobXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEVPUzoKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImF1ZGlvRU9TR2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtQXVkaW9FT1NHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJmaW5hbFJlc3VsdCIsICZmaW5hbFJlc3VsdCkpOworICAgICAgICAgICAgbm90aWZ5RU9TKHRydWUgLyogYXVkaW8gKi8sIGZpbmFsUmVzdWx0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdENvbmZpZ1BsYXliYWNrOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKyAgICAgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlIHJhdGU7CisgICAgICAgICAgICByZWFkRnJvbUFNZXNzYWdlKG1zZywgJnJhdGUpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gb25Db25maWdQbGF5YmFjayhyYXRlKTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRHZXRQbGF5YmFja1NldHRpbmdzOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKyAgICAgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlIHJhdGUgPSBBVURJT19QTEFZQkFDS19SQVRFX0RFRkFVTFQ7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBvbkdldFBsYXliYWNrU2V0dGluZ3MoJnJhdGUpOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIHdyaXRlVG9BTWVzc2FnZShyZXNwb25zZSwgcmF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0Q29uZmlnU3luYzoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgICAgICAgICBBVlN5bmNTZXR0aW5ncyBzeW5jOworICAgICAgICAgICAgZmxvYXQgdmlkZW9GcHNIaW50OworICAgICAgICAgICAgcmVhZEZyb21BTWVzc2FnZShtc2csICZzeW5jLCAmdmlkZW9GcHNIaW50KTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG9uQ29uZmlnU3luYyhzeW5jLCB2aWRlb0Zwc0hpbnQpOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEdldFN5bmNTZXR0aW5nczoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisKKyAgICAgICAgICAgIEFMT0dWKCJrV2hhdEdldFN5bmNTZXR0aW5ncyIpOworICAgICAgICAgICAgQVZTeW5jU2V0dGluZ3Mgc3luYzsKKyAgICAgICAgICAgIGZsb2F0IHZpZGVvRnBzID0gLTEuZjsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG9uR2V0U3luY1NldHRpbmdzKCZzeW5jLCAmdmlkZW9GcHMpOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIHdyaXRlVG9BTWVzc2FnZShyZXNwb25zZSwgc3luYywgdmlkZW9GcHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEZsdXNoOgorICAgICAgICB7CisgICAgICAgICAgICBvbkZsdXNoKG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXREaXNhYmxlT2ZmbG9hZEF1ZGlvOgorICAgICAgICB7CisgICAgICAgICAgICBvbkRpc2FibGVPZmZsb2FkQXVkaW8oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEVuYWJsZU9mZmxvYWRBdWRpbzoKKyAgICAgICAgeworICAgICAgICAgICAgb25FbmFibGVPZmZsb2FkQXVkaW8oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFBhdXNlOgorICAgICAgICB7CisgICAgICAgICAgICBvblBhdXNlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRSZXN1bWU6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uUmVzdW1lKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRTZXRWaWRlb0ZyYW1lUmF0ZToKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgZnBzOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kRmxvYXQoImZyYW1lLXJhdGUiLCAmZnBzKSk7CisgICAgICAgICAgICBvblNldFZpZGVvRnJhbWVSYXRlKGZwcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRBdWRpb1RlYXJEb3duOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IHJlYXNvbjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZWFzb24iLCAmcmVhc29uKSk7CisKKyAgICAgICAgICAgIG9uQXVkaW9UZWFyRG93bigoQXVkaW9UZWFyRG93blJlYXNvbilyZWFzb24pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0QXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0OgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZHJhaW5HZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IG1BdWRpb09mZmxvYWRQYXVzZVRpbWVvdXRHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiQXVkaW8gT2ZmbG9hZCB0ZWFyIGRvd24gZHVlIHRvIHBhdXNlIHRpbWVvdXQuIik7CisgICAgICAgICAgICBvbkF1ZGlvVGVhckRvd24oa0R1ZVRvVGltZW91dCk7CisgICAgICAgICAgICBtV2FrZUxvY2stPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6cG9zdERyYWluQXVkaW9RdWV1ZV9sKGludDY0X3QgZGVsYXlVcykgeworICAgIGlmIChtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZyB8fCBtU3luY1F1ZXVlcyB8fCBtVXNlQXVkaW9DYWxsYmFjaykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1BdWRpb1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEZJWE1FOiBpZiBwYXVzZWQsIHdhaXQgdW50aWwgQXVkaW9UcmFjayBzdG9wKCkgaXMgY29tcGxldGUgYmVmb3JlIGRlbGl2ZXJpbmcgZGF0YS4KKyAgICBpZiAobVBhdXNlZCkgeworICAgICAgICBjb25zdCBpbnQ2NF90IGRpZmZVcyA9IG1QYXVzZURyYWluQXVkaW9BbGxvd2VkVXMgLSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgICAgICBpZiAoZGlmZlVzID4gZGVsYXlVcykgeworICAgICAgICAgICAgZGVsYXlVcyA9IGRpZmZVczsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nID0gdHJ1ZTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RHJhaW5BdWRpb1F1ZXVlLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDMyKCJkcmFpbkdlbmVyYXRpb24iLCBtQXVkaW9EcmFpbkdlbmVyYXRpb24pOworICAgIG1zZy0+cG9zdChkZWxheVVzKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydF9sKCkgeworICAgIG1BdWRpb1JlbmRlcmluZ1N0YXJ0R2VuZXJhdGlvbiA9IG1BdWRpb0RyYWluR2VuZXJhdGlvbjsKKyAgICBtVmlkZW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24gPSBtVmlkZW9EcmFpbkdlbmVyYXRpb247CisgICAgbVJlbmRlcmluZ0RhdGFEZWxpdmVyZWQgPSBmYWxzZTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpub3RpZnlJZk1lZGlhUmVuZGVyaW5nU3RhcnRlZF9sKCkgeworICAgIGlmIChtVmlkZW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24gPT0gbVZpZGVvRHJhaW5HZW5lcmF0aW9uICYmCisgICAgICAgIG1BdWRpb1JlbmRlcmluZ1N0YXJ0R2VuZXJhdGlvbiA9PSBtQXVkaW9EcmFpbkdlbmVyYXRpb24pIHsKKyAgICAgICAgbVJlbmRlcmluZ0RhdGFEZWxpdmVyZWQgPSB0cnVlOworICAgICAgICBpZiAobVBhdXNlZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1WaWRlb1JlbmRlcmluZ1N0YXJ0R2VuZXJhdGlvbiA9IC0xOworICAgICAgICBtQXVkaW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24gPSAtMTsKKworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdE1lZGlhUmVuZGVyaW5nU3RhcnQpOworICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICB9Cit9CisKKy8vIHN0YXRpYworc2l6ZV90IE51UGxheWVyMjo6UmVuZGVyZXI6OkF1ZGlvU2lua0NhbGxiYWNrKAorICAgICAgICBNZWRpYVBsYXllcjJJbnRlcmZhY2U6OkF1ZGlvU2luayAqIC8qIGF1ZGlvU2luayAqLywKKyAgICAgICAgdm9pZCAqYnVmZmVyLAorICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgdm9pZCAqY29va2llLAorICAgICAgICBNZWRpYVBsYXllcjJJbnRlcmZhY2U6OkF1ZGlvU2luazo6Y2JfZXZlbnRfdCBldmVudCkgeworICAgIE51UGxheWVyMjo6UmVuZGVyZXIgKm1lID0gKE51UGxheWVyMjo6UmVuZGVyZXIgKiljb29raWU7CisKKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgICAgIGNhc2UgTWVkaWFQbGF5ZXIySW50ZXJmYWNlOjpBdWRpb1Npbms6OkNCX0VWRU5UX0ZJTExfQlVGRkVSOgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbWUtPmZpbGxBdWRpb0J1ZmZlcihidWZmZXIsIHNpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE1lZGlhUGxheWVyMkludGVyZmFjZTo6QXVkaW9TaW5rOjpDQl9FVkVOVF9TVFJFQU1fRU5EOgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HVigiQXVkaW9TaW5rOjpDQl9FVkVOVF9TVFJFQU1fRU5EIik7CisgICAgICAgICAgICBtZS0+bm90aWZ5RU9TQ2FsbGJhY2soKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBNZWRpYVBsYXllcjJJbnRlcmZhY2U6OkF1ZGlvU2luazo6Q0JfRVZFTlRfVEVBUl9ET1dOOgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HVigiQXVkaW9TaW5rOjpDQl9FVkVOVF9URUFSX0RPV04iKTsKKyAgICAgICAgICAgIG1lLT5ub3RpZnlBdWRpb1RlYXJEb3duKGtEdWVUb0Vycm9yKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6bm90aWZ5RU9TQ2FsbGJhY2soKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmICghbVVzZUF1ZGlvQ2FsbGJhY2spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG5vdGlmeUVPU19sKHRydWUgLyogYXVkaW8gKi8sIEVSUk9SX0VORF9PRl9TVFJFQU0pOworfQorCitzaXplX3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6ZmlsbEF1ZGlvQnVmZmVyKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKCFtVXNlQXVkaW9DYWxsYmFjaykgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBib29sIGhhc0VPUyA9IGZhbHNlOworCisgICAgc2l6ZV90IHNpemVDb3BpZWQgPSAwOworICAgIGJvb2wgZmlyc3RFbnRyeSA9IHRydWU7CisgICAgUXVldWVFbnRyeSAqZW50cnk7ICAvLyB3aWxsIGJlIHZhbGlkIGFmdGVyIHdoaWxlIGxvb3AgaWYgaGFzRU9TIGlzIHNldC4KKyAgICB3aGlsZSAoc2l6ZUNvcGllZCA8IHNpemUgJiYgIW1BdWRpb1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgZW50cnkgPSAmKm1BdWRpb1F1ZXVlLmJlZ2luKCk7CisKKyAgICAgICAgaWYgKGVudHJ5LT5tQnVmZmVyID09IE5VTEwpIHsgLy8gRU9TCisgICAgICAgICAgICBoYXNFT1MgPSB0cnVlOworICAgICAgICAgICAgbUF1ZGlvUXVldWUuZXJhc2UobUF1ZGlvUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaXJzdEVudHJ5ICYmIGVudHJ5LT5tT2Zmc2V0ID09IDApIHsKKyAgICAgICAgICAgIGZpcnN0RW50cnkgPSBmYWxzZTsKKyAgICAgICAgICAgIGludDY0X3QgbWVkaWFUaW1lVXM7CisgICAgICAgICAgICBDSEVDSyhlbnRyeS0+bUJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZtZWRpYVRpbWVVcykpOworICAgICAgICAgICAgQUxPR1YoImZpbGxBdWRpb0J1ZmZlcjogcmVuZGVyaW5nIGF1ZGlvIGF0IG1lZGlhIHRpbWUgJS4yZiBzZWNzIiwgbWVkaWFUaW1lVXMgLyAxRTYpOworICAgICAgICAgICAgc2V0QXVkaW9GaXJzdEFuY2hvclRpbWVJZk5lZWRlZF9sKG1lZGlhVGltZVVzKTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBjb3B5ID0gZW50cnktPm1CdWZmZXItPnNpemUoKSAtIGVudHJ5LT5tT2Zmc2V0OworICAgICAgICBzaXplX3Qgc2l6ZVJlbWFpbmluZyA9IHNpemUgLSBzaXplQ29waWVkOworICAgICAgICBpZiAoY29weSA+IHNpemVSZW1haW5pbmcpIHsKKyAgICAgICAgICAgIGNvcHkgPSBzaXplUmVtYWluaW5nOworICAgICAgICB9CisKKyAgICAgICAgbWVtY3B5KChjaGFyICopYnVmZmVyICsgc2l6ZUNvcGllZCwKKyAgICAgICAgICAgICAgIGVudHJ5LT5tQnVmZmVyLT5kYXRhKCkgKyBlbnRyeS0+bU9mZnNldCwKKyAgICAgICAgICAgICAgIGNvcHkpOworCisgICAgICAgIGVudHJ5LT5tT2Zmc2V0ICs9IGNvcHk7CisgICAgICAgIGlmIChlbnRyeS0+bU9mZnNldCA9PSBlbnRyeS0+bUJ1ZmZlci0+c2l6ZSgpKSB7CisgICAgICAgICAgICBlbnRyeS0+bU5vdGlmeUNvbnN1bWVkLT5wb3N0KCk7CisgICAgICAgICAgICBtQXVkaW9RdWV1ZS5lcmFzZShtQXVkaW9RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIGVudHJ5ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzaXplQ29waWVkICs9IGNvcHk7CisKKyAgICAgICAgbm90aWZ5SWZNZWRpYVJlbmRlcmluZ1N0YXJ0ZWRfbCgpOworICAgIH0KKworICAgIGlmIChtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzID49IDApIHsKKyAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgICAgIGludDY0X3Qgbm93TWVkaWFVcyA9CisgICAgICAgICAgICBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzICsgbUF1ZGlvU2luay0+Z2V0UGxheWVkT3V0RHVyYXRpb25Vcyhub3dVcyk7CisgICAgICAgIC8vIHdlIGRvbid0IGtub3cgaG93IG11Y2ggZGF0YSB3ZSBhcmUgcXVldWVpbmcgZm9yIG9mZmxvYWRlZCB0cmFja3MuCisgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVBbmNob3Iobm93TWVkaWFVcywgbm93VXMsIElOVDY0X01BWCk7CisgICAgfQorCisgICAgLy8gZm9yIG5vbi1vZmZsb2FkZWQgYXVkaW8sIHdlIG5lZWQgdG8gY29tcHV0ZSB0aGUgZnJhbWVzIHdyaXR0ZW4gYmVjYXVzZQorICAgIC8vIHRoZXJlIGlzIG5vIEVWRU5UX1NUUkVBTV9FTkQgbm90aWZpY2F0aW9uLiBUaGUgZnJhbWVzIHdyaXR0ZW4gZ2l2ZXMKKyAgICAvLyBhbiBlc3RpbWF0ZSBvbiB0aGUgcGVuZGluZyBwbGF5ZWQgb3V0IGR1cmF0aW9uLgorICAgIGlmICghb2ZmbG9hZGluZ0F1ZGlvKCkpIHsKKyAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4gKz0gc2l6ZUNvcGllZCAvIG1BdWRpb1NpbmstPmZyYW1lU2l6ZSgpOworICAgIH0KKworICAgIGlmIChoYXNFT1MpIHsKKyAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0b3BBdWRpb1NpbmssIHRoaXMpKS0+cG9zdCgpOworICAgICAgICAvLyBBcyB0aGVyZSBpcyBjdXJyZW50bHkgbm8gRVZFTlRfU1RSRUFNX0VORCBjYWxsYmFjayBub3RpZmljYXRpb24gZm9yCisgICAgICAgIC8vIG5vbi1vZmZsb2FkZWQgYXVkaW8gdHJhY2tzLCB3ZSBuZWVkIHRvIHBvc3QgdGhlIEVPUyBvdXJzZWx2ZXMuCisgICAgICAgIGlmICghb2ZmbG9hZGluZ0F1ZGlvKCkpIHsKKyAgICAgICAgICAgIGludDY0X3QgcG9zdEVPU0RlbGF5VXMgPSAwOworICAgICAgICAgICAgaWYgKG1BdWRpb1NpbmstPm5lZWRzVHJhaWxpbmdQYWRkaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBwb3N0RU9TRGVsYXlVcyA9IGdldFBlbmRpbmdBdWRpb1BsYXlvdXREdXJhdGlvblVzKEFMb29wZXI6OkdldE5vd1VzKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoImZpbGxBdWRpb0J1ZmZlcjogbm90aWZ5RU9TX2wgIgorICAgICAgICAgICAgICAgICAgICAibU51bUZyYW1lc1dyaXR0ZW46JXUgIGZpbmFsUmVzdWx0OiVkICBwb3N0RU9TRGVsYXk6JWxsZCIsCisgICAgICAgICAgICAgICAgICAgIG1OdW1GcmFtZXNXcml0dGVuLCBlbnRyeS0+bUZpbmFsUmVzdWx0LCAobG9uZyBsb25nKXBvc3RFT1NEZWxheVVzKTsKKyAgICAgICAgICAgIG5vdGlmeUVPU19sKHRydWUgLyogYXVkaW8gKi8sIGVudHJ5LT5tRmluYWxSZXN1bHQsIHBvc3RFT1NEZWxheVVzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2l6ZUNvcGllZDsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpkcmFpbkF1ZGlvUXVldWVVbnRpbExhc3RFT1MoKSB7CisgICAgTGlzdDxRdWV1ZUVudHJ5Pjo6aXRlcmF0b3IgaXQgPSBtQXVkaW9RdWV1ZS5iZWdpbigpLCBpdEVPUyA9IGl0OworICAgIGJvb2wgZm91bmRFT1MgPSBmYWxzZTsKKyAgICB3aGlsZSAoaXQgIT0gbUF1ZGlvUXVldWUuZW5kKCkpIHsKKyAgICAgICAgaW50MzJfdCBlb3M7CisgICAgICAgIFF1ZXVlRW50cnkgKmVudHJ5ID0gJippdCsrOworICAgICAgICBpZiAoKGVudHJ5LT5tQnVmZmVyID09IG51bGxwdHIgJiYgZW50cnktPm1Ob3RpZnlDb25zdW1lZCA9PSBudWxscHRyKQorICAgICAgICAgICAgICAgIHx8IChlbnRyeS0+bU5vdGlmeUNvbnN1bWVkLT5maW5kSW50MzIoImVvcyIsICZlb3MpICYmIGVvcyAhPSAwKSkgeworICAgICAgICAgICAgaXRFT1MgPSBpdDsKKyAgICAgICAgICAgIGZvdW5kRU9TID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmb3VuZEVPUykgeworICAgICAgICAvLyBwb3N0IGFsbCByZXBsaWVzIGJlZm9yZSBFT1MgYW5kIGRyb3AgdGhlIHNhbXBsZXMKKyAgICAgICAgZm9yIChpdCA9IG1BdWRpb1F1ZXVlLmJlZ2luKCk7IGl0ICE9IGl0RU9TOyBpdCsrKSB7CisgICAgICAgICAgICBpZiAoaXQtPm1CdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGlmIChpdC0+bU5vdGlmeUNvbnN1bWVkID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVsYXkgZG9lc24ndCBtYXR0ZXIgYXMgd2UgZG9uJ3QgZXZlbiBoYXZlIGFuIEF1ZGlvVHJhY2sKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5RU9TKHRydWUgLyogYXVkaW8gKi8sIGl0LT5tRmluYWxSZXN1bHQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRBRyBmb3IgcmUtb3BlbmluZyBhdWRpbyBzaW5rLgorICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZUF1ZGlvRm9ybWF0KGl0LT5tTWV0YSwgaXQtPm1Ob3RpZnlDb25zdW1lZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpdC0+bU5vdGlmeUNvbnN1bWVkLT5wb3N0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUF1ZGlvUXVldWUuZXJhc2UobUF1ZGlvUXVldWUuYmVnaW4oKSwgaXRFT1MpOworICAgIH0KK30KKworYm9vbCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvbkRyYWluQXVkaW9RdWV1ZSgpIHsKKyAgICAvLyBkbyBub3QgZHJhaW4gYXVkaW8gZHVyaW5nIHRlYXJkb3duIGFzIHF1ZXVlZCBidWZmZXJzIG1heSBiZSBpbnZhbGlkLgorICAgIGlmIChtQXVkaW9Ub3JuRG93bikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIFRPRE86IFRoaXMgY2FsbCB0byBnZXRQb3NpdGlvbiBjaGVja3MgaWYgQXVkaW9UcmFjayBoYXMgYmVlbiBjcmVhdGVkCisgICAgLy8gaW4gQXVkaW9TaW5rIGJlZm9yZSBkcmFpbmluZyBhdWRpby4gSWYgQXVkaW9UcmFjayBkb2Vzbid0IGV4aXN0LCB0aGVuCisgICAgLy8gQ0hFQ0tzIG9uIGdldFBvc2l0aW9uIHdpbGwgZmFpbC4KKyAgICAvLyBXZSBzdGlsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgd2h5IEF1ZGlvVHJhY2sgaXMgbm90IGNyZWF0ZWQgd2hlbgorICAgIC8vIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiBPbmUgcG9zc2libGUgcmVhc29uIGNvdWxkIGJlIGxlZnRvdmVyCisgICAgLy8gYXVkaW8uIEFub3RoZXIgcG9zc2libGUgcGxhY2UgaXMgdG8gY2hlY2sgd2hldGhlciBkZWNvZGVyCisgICAgLy8gaGFzIHJlY2VpdmVkIElORk9fRk9STUFUX0NIQU5HRUQgYXMgdGhlIGZpcnN0IGJ1ZmZlciBzaW5jZQorICAgIC8vIEF1ZGlvU2luayBpcyBvcGVuZWQgdGhlcmUsIGFuZCBwb3NzaWJsZSBpbnRlcmFjdGlvbnMgd2l0aCBmbHVzaAorICAgIC8vIGltbWVkaWF0ZWx5IGFmdGVyIHN0YXJ0LiBJbnZlc3RpZ2F0ZSBlcnJvciBtZXNzYWdlCisgICAgLy8gInZvcmJpc19kc3Bfc3ludGhlc2lzIHJldHVybmVkIC0xMzUiLCBhbG9uZyB3aXRoIFJUU1AuCisgICAgdWludDMyX3QgbnVtRnJhbWVzUGxheWVkOworICAgIGlmIChtQXVkaW9TaW5rLT5nZXRQb3NpdGlvbigmbnVtRnJhbWVzUGxheWVkKSAhPSBPSykgeworICAgICAgICAvLyBXaGVuIGdldFBvc2l0aW9uIGZhaWxzLCByZW5kZXJlciB3aWxsIG5vdCByZXNjaGVkdWxlIHRoZSBkcmFpbmluZworICAgICAgICAvLyB1bmxlc3MgbmV3IHNhbXBsZXMgYXJlIHF1ZXVlZC4KKyAgICAgICAgLy8gSWYgd2UgaGF2ZSBwZW5kaW5nIEVPUyAob3IgImVvcyIgbWFya2VyIGZvciBkaXNjb250aW51aXRpZXMpLCB3ZSBuZWVkCisgICAgICAgIC8vIHRvIHBvc3QgdGhlc2Ugbm93IGFzIE51UGxheWVyMkRlY29kZXIgbWlnaHQgYmUgd2FpdGluZyBmb3IgaXQuCisgICAgICAgIGRyYWluQXVkaW9RdWV1ZVVudGlsTGFzdEVPUygpOworCisgICAgICAgIEFMT0dXKCJvbkRyYWluQXVkaW9RdWV1ZSgpOiBhdWRpbyBzaW5rIGlzIG5vdCByZWFkeSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisjaWYgMAorICAgIHNzaXplX3QgbnVtRnJhbWVzQXZhaWxhYmxlVG9Xcml0ZSA9CisgICAgICAgIG1BdWRpb1NpbmstPmZyYW1lQ291bnQoKSAtIChtTnVtRnJhbWVzV3JpdHRlbiAtIG51bUZyYW1lc1BsYXllZCk7CisKKyAgICBpZiAobnVtRnJhbWVzQXZhaWxhYmxlVG9Xcml0ZSA9PSBtQXVkaW9TaW5rLT5mcmFtZUNvdW50KCkpIHsKKyAgICAgICAgQUxPR0koImF1ZGlvIHNpbmsgdW5kZXJydW4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiYXVkaW8gcXVldWUgaGFzICVkIGZyYW1lcyBsZWZ0IHRvIHBsYXkiLAorICAgICAgICAgICAgIG1BdWRpb1NpbmstPmZyYW1lQ291bnQoKSAtIG51bUZyYW1lc0F2YWlsYWJsZVRvV3JpdGUpOworICAgIH0KKyNlbmRpZgorCisgICAgdWludDMyX3QgcHJldkZyYW1lc1dyaXR0ZW4gPSBtTnVtRnJhbWVzV3JpdHRlbjsKKyAgICB3aGlsZSAoIW1BdWRpb1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgUXVldWVFbnRyeSAqZW50cnkgPSAmKm1BdWRpb1F1ZXVlLmJlZ2luKCk7CisKKyAgICAgICAgaWYgKGVudHJ5LT5tQnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChlbnRyeS0+bU5vdGlmeUNvbnN1bWVkICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAvLyBUQUcgZm9yIHJlLW9wZW4gYXVkaW8gc2luay4KKyAgICAgICAgICAgICAgICBvbkNoYW5nZUF1ZGlvRm9ybWF0KGVudHJ5LT5tTWV0YSwgZW50cnktPm1Ob3RpZnlDb25zdW1lZCk7CisgICAgICAgICAgICAgICAgbUF1ZGlvUXVldWUuZXJhc2UobUF1ZGlvUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEVPUworICAgICAgICAgICAgaWYgKG1QYXVzZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBEbyBub3Qgbm90aWZ5IEVPUyB3aGVuIHBhdXNlZC4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBhdm9pZCBzd2l0Y2ggdG8gbmV4dCBjbGlwIHdoaWxlIGluIHBhdXNlLgorICAgICAgICAgICAgICAgIEFMT0dWKCJvbkRyYWluQXVkaW9RdWV1ZSgpOiBEbyBub3Qgbm90aWZ5IEVPUyB3aGVuIHBhdXNlZCIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50NjRfdCBwb3N0RU9TRGVsYXlVcyA9IDA7CisgICAgICAgICAgICBpZiAobUF1ZGlvU2luay0+bmVlZHNUcmFpbGluZ1BhZGRpbmcoKSkgeworICAgICAgICAgICAgICAgIHBvc3RFT1NEZWxheVVzID0gZ2V0UGVuZGluZ0F1ZGlvUGxheW91dER1cmF0aW9uVXMoQUxvb3Blcjo6R2V0Tm93VXMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub3RpZnlFT1ModHJ1ZSAvKiBhdWRpbyAqLywgZW50cnktPm1GaW5hbFJlc3VsdCwgcG9zdEVPU0RlbGF5VXMpOworICAgICAgICAgICAgbUxhc3RBdWRpb01lZGlhVGltZVVzID0gZ2V0RHVyYXRpb25Vc0lmUGxheWVkQXRTYW1wbGVSYXRlKG1OdW1GcmFtZXNXcml0dGVuKTsKKworICAgICAgICAgICAgbUF1ZGlvUXVldWUuZXJhc2UobUF1ZGlvUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBlbnRyeSA9IE5VTEw7CisgICAgICAgICAgICBpZiAobUF1ZGlvU2luay0+bmVlZHNUcmFpbGluZ1BhZGRpbmcoKSkgeworICAgICAgICAgICAgICAgIC8vIElmIHdlJ3JlIG5vdCBpbiBnYXBsZXNzIHBsYXliYWNrIChpLmUuIHRocm91Z2ggc2V0TmV4dFBsYXllciksIHdlCisgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBzdG9wIHRoZSB0cmFjayBoZXJlLCBiZWNhdXNlIHRoYXQgd2lsbCBwbGF5IG91dCB0aGUgbGFzdAorICAgICAgICAgICAgICAgIC8vIGxpdHRsZSBiaXQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4gT3RoZXJ3aXNlIHNob3J0IGZpbGVzIHdvbid0IHBsYXkuCisgICAgICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RvcCgpOworICAgICAgICAgICAgICAgIG1OdW1GcmFtZXNXcml0dGVuID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIG1MYXN0QXVkaW9CdWZmZXJEcmFpbmVkID0gZW50cnktPm1CdWZmZXJPcmRpbmFsOworCisgICAgICAgIC8vIGlnbm9yZSAwLXNpemVkIGJ1ZmZlciB3aGljaCBjb3VsZCBiZSBFT1MgbWFya2VyIHdpdGggbm8gZGF0YQorICAgICAgICBpZiAoZW50cnktPm1PZmZzZXQgPT0gMCAmJiBlbnRyeS0+bUJ1ZmZlci0+c2l6ZSgpID4gMCkgeworICAgICAgICAgICAgaW50NjRfdCBtZWRpYVRpbWVVczsKKyAgICAgICAgICAgIENIRUNLKGVudHJ5LT5tQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKSk7CisgICAgICAgICAgICBBTE9HVigib25EcmFpbkF1ZGlvUXVldWU6IHJlbmRlcmluZyBhdWRpbyBhdCBtZWRpYSB0aW1lICUuMmYgc2VjcyIsCisgICAgICAgICAgICAgICAgICAgIG1lZGlhVGltZVVzIC8gMUU2KTsKKyAgICAgICAgICAgIG9uTmV3QXVkaW9NZWRpYVRpbWUobWVkaWFUaW1lVXMpOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IGNvcHkgPSBlbnRyeS0+bUJ1ZmZlci0+c2l6ZSgpIC0gZW50cnktPm1PZmZzZXQ7CisKKyAgICAgICAgc3NpemVfdCB3cml0dGVuID0gbUF1ZGlvU2luay0+d3JpdGUoZW50cnktPm1CdWZmZXItPmRhdGEoKSArIGVudHJ5LT5tT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5LCBmYWxzZSAvKiBibG9ja2luZyAqLyk7CisgICAgICAgIGlmICh3cml0dGVuIDwgMCkgeworICAgICAgICAgICAgLy8gQW4gZXJyb3IgaW4gQXVkaW9TaW5rIHdyaXRlLiBQZXJoYXBzIHRoZSBBdWRpb1Npbmsgd2FzIG5vdCBwcm9wZXJseSBvcGVuZWQuCisgICAgICAgICAgICBpZiAod3JpdHRlbiA9PSBXT1VMRF9CTE9DSykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb1Npbmsgd3JpdGUgd291bGQgYmxvY2sgd2hlbiB3cml0aW5nICV6dSBieXRlcyIsIGNvcHkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQXVkaW9TaW5rIHdyaXRlIGVycm9yKCV6ZCkgd2hlbiB3cml0aW5nICV6dSBieXRlcyIsIHdyaXR0ZW4sIGNvcHkpOworICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FuIG9ubHkgaGFwcGVuIHdoZW4gQXVkaW9TaW5rIHdhcyBvcGVuZWQgd2l0aCBkb05vdFJlY29ubmVjdCBmbGFnIHNldCB0bworICAgICAgICAgICAgICAgIC8vIHRydWUsIGluIHdoaWNoIGNhc2UgdGhlIE51UGxheWVyMiB3aWxsIGhhbmRsZSB0aGUgcmVjb25uZWN0LgorICAgICAgICAgICAgICAgIG5vdGlmeUF1ZGlvVGVhckRvd24oa0R1ZVRvRXJyb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBlbnRyeS0+bU9mZnNldCArPSB3cml0dGVuOworICAgICAgICBzaXplX3QgcmVtYWluZGVyID0gZW50cnktPm1CdWZmZXItPnNpemUoKSAtIGVudHJ5LT5tT2Zmc2V0OworICAgICAgICBpZiAoKHNzaXplX3QpcmVtYWluZGVyIDwgbUF1ZGlvU2luay0+ZnJhbWVTaXplKCkpIHsKKyAgICAgICAgICAgIGlmIChyZW1haW5kZXIgPiAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIkNvcnJ1cHRlZCBhdWRpbyBidWZmZXIgaGFzIGZyYWN0aW9uYWwgZnJhbWVzLCBkaXNjYXJkaW5nICV6dSBieXRlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluZGVyKTsKKyAgICAgICAgICAgICAgICBlbnRyeS0+bU9mZnNldCArPSByZW1haW5kZXI7CisgICAgICAgICAgICAgICAgY29weSAtPSByZW1haW5kZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQtPnBvc3QoKTsKKyAgICAgICAgICAgIG1BdWRpb1F1ZXVlLmVyYXNlKG1BdWRpb1F1ZXVlLmJlZ2luKCkpOworCisgICAgICAgICAgICBlbnRyeSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgY29waWVkRnJhbWVzID0gd3JpdHRlbiAvIG1BdWRpb1NpbmstPmZyYW1lU2l6ZSgpOworICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbiArPSBjb3BpZWRGcmFtZXM7CisKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgIGludDY0X3QgbWF4VGltZU1lZGlhOworICAgICAgICAgICAgbWF4VGltZU1lZGlhID0KKyAgICAgICAgICAgICAgICBtQW5jaG9yVGltZU1lZGlhVXMgKworICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpKG1heCgobG9uZyBsb25nKW1OdW1GcmFtZXNXcml0dGVuIC0gbUFuY2hvck51bUZyYW1lc1dyaXR0ZW4sIDBMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAxMDAwTEwgKiBtQXVkaW9TaW5rLT5tc2Vjc1BlckZyYW1lKCkpOworICAgICAgICAgICAgbU1lZGlhQ2xvY2stPnVwZGF0ZU1heFRpbWVNZWRpYShtYXhUaW1lTWVkaWEpOworCisgICAgICAgICAgICBub3RpZnlJZk1lZGlhUmVuZGVyaW5nU3RhcnRlZF9sKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAod3JpdHRlbiAhPSAoc3NpemVfdCljb3B5KSB7CisgICAgICAgICAgICAvLyBBIHNob3J0IGNvdW50IHdhcyByZWNlaXZlZCBmcm9tIEF1ZGlvU2luazo6d3JpdGUoKQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEF1ZGlvU2luayB3cml0ZSBpcyBjYWxsZWQgaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICAgICAgICAgICAvLyBJdCBtYXkgcmV0dXJuIHdpdGggYSBzaG9ydCBjb3VudCB3aGVuOgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIDEpIFNpemUgdG8gYmUgY29waWVkIGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBmcmFtZSBzaXplLiBGcmFjdGlvbmFsIGZyYW1lcyBhcmUKKyAgICAgICAgICAgIC8vICAgIGRpc2NhcmRlZC4KKyAgICAgICAgICAgIC8vIDIpIFRoZSBkYXRhIHRvIGJlIGNvcGllZCBleGNlZWRzIHRoZSBhdmFpbGFibGUgYnVmZmVyIGluIEF1ZGlvU2luay4KKyAgICAgICAgICAgIC8vIDMpIEFuIGVycm9yIG9jY3VycyBhbmQgZGF0YSBoYXMgYmVlbiBwYXJ0aWFsbHkgY29waWVkIHRvIHRoZSBidWZmZXIgaW4gQXVkaW9TaW5rLgorICAgICAgICAgICAgLy8gNCkgQXVkaW9TaW5rIGlzIGFuIEF1ZGlvQ2FjaGUgZm9yIGRhdGEgcmV0cmlldmFsLCBhbmQgdGhlIEF1ZGlvQ2FjaGUgaXMgZXhjZWVkZWQuCisKKyAgICAgICAgICAgIC8vIChDYXNlIDEpCisgICAgICAgICAgICAvLyBNdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGZyYW1lIHNpemUuICBJZiBpdCBpcyBub3QgYSBtdWx0aXBsZSBvZiBhIGZyYW1lIHNpemUsIGl0CisgICAgICAgICAgICAvLyBuZWVkcyB0byBmYWlsLCBhcyB3ZSBzaG91bGQgbm90IGNhcnJ5IG92ZXIgZnJhY3Rpb25hbCBmcmFtZXMgYmV0d2VlbiBjYWxscy4KKyAgICAgICAgICAgIENIRUNLX0VRKGNvcHkgJSBtQXVkaW9TaW5rLT5mcmFtZVNpemUoKSwgMHUpOworCisgICAgICAgICAgICAvLyAoQ2FzZSAyLCAzLCA0KQorICAgICAgICAgICAgLy8gUmV0dXJuIGVhcmx5IHRvIHRoZSBjYWxsZXIuCisgICAgICAgICAgICAvLyBCZXdhcmUgb2YgY2FsbGluZyBpbW1lZGlhdGVseSBhZ2FpbiBhcyB0aGlzIG1heSBidXN5LWxvb3AgaWYgeW91IGFyZSBub3QgY2FyZWZ1bC4KKyAgICAgICAgICAgIEFMT0dWKCJBdWRpb1Npbmsgd3JpdGUgc2hvcnQgZnJhbWUgY291bnQgJXpkIDwgJXp1Iiwgd3JpdHRlbiwgY29weSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGNhbGN1bGF0ZSB3aGV0aGVyIHdlIG5lZWQgdG8gcmVzY2hlZHVsZSBhbm90aGVyIHdyaXRlLgorICAgIGJvb2wgcmVzY2hlZHVsZSA9ICFtQXVkaW9RdWV1ZS5lbXB0eSgpCisgICAgICAgICAgICAmJiAoIW1QYXVzZWQKKyAgICAgICAgICAgICAgICB8fCBwcmV2RnJhbWVzV3JpdHRlbiAhPSBtTnVtRnJhbWVzV3JpdHRlbik7IC8vIHBlcm1pdCBwYXVzZSB0byBmaWxsIGJ1ZmZlcnMKKyAgICAvL0FMT0dEKCJyZXNjaGVkdWxlOiVkICBlbXB0eTolZCAgbVBhdXNlZDolZCAgcHJldkZyYW1lc1dyaXR0ZW46JXUgIG1OdW1GcmFtZXNXcml0dGVuOiV1IiwKKyAgICAvLyAgICAgICAgcmVzY2hlZHVsZSwgbUF1ZGlvUXVldWUuZW1wdHkoKSwgbVBhdXNlZCwgcHJldkZyYW1lc1dyaXR0ZW4sIG1OdW1GcmFtZXNXcml0dGVuKTsKKyAgICByZXR1cm4gcmVzY2hlZHVsZTsKK30KKworaW50NjRfdCBOdVBsYXllcjI6OlJlbmRlcmVyOjpnZXREdXJhdGlvblVzSWZQbGF5ZWRBdFNhbXBsZVJhdGUodWludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaW50MzJfdCBzYW1wbGVSYXRlID0gb2ZmbG9hZGluZ0F1ZGlvKCkgPworICAgICAgICAgICAgbUN1cnJlbnRPZmZsb2FkSW5mby5zYW1wbGVfcmF0ZSA6IG1DdXJyZW50UGNtSW5mby5tU2FtcGxlUmF0ZTsKKyAgICBpZiAoc2FtcGxlUmF0ZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJzYW1wbGVSYXRlIGlzIDAgaW4gJXMgbW9kZSIsIG9mZmxvYWRpbmdBdWRpbygpID8gIm9mZmxvYWQiIDogIm5vbi1vZmZsb2FkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvLyBUT0RPOiByZW1vdmUgdGhlIChpbnQzMl90KSBjYXN0aW5nIGJlbG93IGFzIGl0IG1heSBvdmVyZmxvdyBhdCAxMi40IGhvdXJzLgorICAgIHJldHVybiAoaW50NjRfdCkoKGludDMyX3QpbnVtRnJhbWVzICogMTAwMDAwMExMIC8gc2FtcGxlUmF0ZSk7Cit9CisKKy8vIENhbGN1bGF0ZSBkdXJhdGlvbiBvZiBwZW5kaW5nIHNhbXBsZXMgaWYgcGxheWVkIGF0IG5vcm1hbCByYXRlIChpLmUuLCAxLjApLgoraW50NjRfdCBOdVBsYXllcjI6OlJlbmRlcmVyOjpnZXRQZW5kaW5nQXVkaW9QbGF5b3V0RHVyYXRpb25VcyhpbnQ2NF90IG5vd1VzKSB7CisgICAgaW50NjRfdCB3cml0dGVuQXVkaW9EdXJhdGlvblVzID0gZ2V0RHVyYXRpb25Vc0lmUGxheWVkQXRTYW1wbGVSYXRlKG1OdW1GcmFtZXNXcml0dGVuKTsKKyAgICBpZiAobVVzZVZpcnR1YWxBdWRpb1NpbmspIHsKKyAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgICAgIGludDY0X3QgbWVkaWFVczsKKyAgICAgICAgaWYgKG1NZWRpYUNsb2NrLT5nZXRNZWRpYVRpbWUobm93VXMsICZtZWRpYVVzKSAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIDBsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB3cml0dGVuQXVkaW9EdXJhdGlvblVzIC0gKG1lZGlhVXMgLSBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IGludDY0X3QgYXVkaW9TaW5rUGxheWVkVXMgPSBtQXVkaW9TaW5rLT5nZXRQbGF5ZWRPdXREdXJhdGlvblVzKG5vd1VzKTsKKyAgICBpbnQ2NF90IHBlbmRpbmdVcyA9IHdyaXR0ZW5BdWRpb0R1cmF0aW9uVXMgLSBhdWRpb1NpbmtQbGF5ZWRVczsKKyAgICBpZiAocGVuZGluZ1VzIDwgMCkgeworICAgICAgICAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4gdW5sZXNzIHRoZSB0aW1lc3RhbXAgaXMgc3RhbGUuCisgICAgICAgIEFMT0dXKCIlczogcGVuZGluZ1VzICVsbGQgPCAwLCBjbGFtcGluZyB0byB6ZXJvLCBwb3RlbnRpYWwgcmVzdW1lIGFmdGVyIHBhdXNlICIKKyAgICAgICAgICAgICAgICAid3JpdHRlbkF1ZGlvRHVyYXRpb25VczogJWxsZCwgYXVkaW9TaW5rUGxheWVkVXM6ICVsbGQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCAobG9uZyBsb25nKXBlbmRpbmdVcywKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKXdyaXR0ZW5BdWRpb0R1cmF0aW9uVXMsIChsb25nIGxvbmcpYXVkaW9TaW5rUGxheWVkVXMpOworICAgICAgICBwZW5kaW5nVXMgPSAwOworICAgIH0KKyAgICByZXR1cm4gcGVuZGluZ1VzOworfQorCitpbnQ2NF90IE51UGxheWVyMjo6UmVuZGVyZXI6OmdldFJlYWxUaW1lVXMoaW50NjRfdCBtZWRpYVRpbWVVcywgaW50NjRfdCBub3dVcykgeworICAgIGludDY0X3QgcmVhbFVzOworICAgIGlmIChtTWVkaWFDbG9jay0+Z2V0UmVhbFRpbWVGb3IobWVkaWFUaW1lVXMsICZyZWFsVXMpICE9IE9LKSB7CisgICAgICAgIC8vIElmIGZhaWxlZCB0byBnZXQgY3VycmVudCBwb3NpdGlvbiwgZS5nLiBkdWUgdG8gYXVkaW8gY2xvY2sgaXMKKyAgICAgICAgLy8gbm90IHJlYWR5LCB0aGVuIGp1c3QgcGxheSBvdXQgdmlkZW8gaW1tZWRpYXRlbHkgd2l0aG91dCBkZWxheS4KKyAgICAgICAgcmV0dXJuIG5vd1VzOworICAgIH0KKyAgICByZXR1cm4gcmVhbFVzOworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om9uTmV3QXVkaW9NZWRpYVRpbWUoaW50NjRfdCBtZWRpYVRpbWVVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgLy8gVFJJQ0tZOiB2b3JiaXMgZGVjb2RlciBnZW5lcmF0ZXMgbXVsdGlwbGUgZnJhbWVzIHdpdGggdGhlIHNhbWUKKyAgICAvLyB0aW1lc3RhbXAsIHNvIG9ubHkgdXBkYXRlIG9uIHRoZSBmaXJzdCBmcmFtZSB3aXRoIGEgZ2l2ZW4gdGltZXN0YW1wCisgICAgaWYgKG1lZGlhVGltZVVzID09IG1BbmNob3JUaW1lTWVkaWFVcykgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNldEF1ZGlvRmlyc3RBbmNob3JUaW1lSWZOZWVkZWRfbChtZWRpYVRpbWVVcyk7CisKKyAgICAvLyBtTmV4dEF1ZGlvQ2xvY2tVcGRhdGVUaW1lVXMgaXMgLTEgaWYgd2UncmUgd2FpdGluZyBmb3IgYXVkaW8gc2luayB0byBzdGFydAorICAgIGlmIChtTmV4dEF1ZGlvQ2xvY2tVcGRhdGVUaW1lVXMgPT0gLTEpIHsKKyAgICAgICAgQXVkaW9UaW1lc3RhbXAgdHM7CisgICAgICAgIGlmIChtQXVkaW9TaW5rLT5nZXRUaW1lc3RhbXAodHMpID09IE9LICYmIHRzLm1Qb3NpdGlvbiA+IDApIHsKKyAgICAgICAgICAgIG1OZXh0QXVkaW9DbG9ja1VwZGF0ZVRpbWVVcyA9IDA7IC8vIHN0YXJ0IG91ciBjbG9jayB1cGRhdGVzCisgICAgICAgIH0KKyAgICB9CisgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgaWYgKG1OZXh0QXVkaW9DbG9ja1VwZGF0ZVRpbWVVcyA+PSAwKSB7CisgICAgICAgIGlmIChub3dVcyA+PSBtTmV4dEF1ZGlvQ2xvY2tVcGRhdGVUaW1lVXMpIHsKKyAgICAgICAgICAgIGludDY0X3Qgbm93TWVkaWFVcyA9IG1lZGlhVGltZVVzIC0gZ2V0UGVuZGluZ0F1ZGlvUGxheW91dER1cmF0aW9uVXMobm93VXMpOworICAgICAgICAgICAgbU1lZGlhQ2xvY2stPnVwZGF0ZUFuY2hvcihub3dNZWRpYVVzLCBub3dVcywgbWVkaWFUaW1lVXMpOworICAgICAgICAgICAgbVVzZVZpcnR1YWxBdWRpb1NpbmsgPSBmYWxzZTsKKyAgICAgICAgICAgIG1OZXh0QXVkaW9DbG9ja1VwZGF0ZVRpbWVVcyA9IG5vd1VzICsga01pbmltdW1BdWRpb0Nsb2NrVXBkYXRlUGVyaW9kVXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQ2NF90IHVudXNlZDsKKyAgICAgICAgaWYgKChtTWVkaWFDbG9jay0+Z2V0TWVkaWFUaW1lKG5vd1VzLCAmdW51c2VkKSAhPSBPSykKKyAgICAgICAgICAgICAgICAmJiAoZ2V0RHVyYXRpb25Vc0lmUGxheWVkQXRTYW1wbGVSYXRlKG1OdW1GcmFtZXNXcml0dGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgPiBrTWF4QWxsb3dlZEF1ZGlvU2lua0RlbGF5VXMpKSB7CisgICAgICAgICAgICAvLyBFbm91Z2ggZGF0YSBoYXMgYmVlbiBzZW50IHRvIEF1ZGlvU2luaywgYnV0IEF1ZGlvU2luayBoYXMgbm90IHJlbmRlcmVkCisgICAgICAgICAgICAvLyBhbnkgZGF0YSB5ZXQuIFNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIEF1ZGlvU2luaywgZS5nLiwgdGhlIGRldmljZSBpcyBub3QKKyAgICAgICAgICAgIC8vIGNvbm5lY3RlZCB0byBhdWRpbyBvdXQuCisgICAgICAgICAgICAvLyBTd2l0Y2ggdG8gc3lzdGVtIGNsb2NrLiBUaGlzIGVzc2VudGlhbGx5IGNyZWF0ZXMgYSB2aXJ0dWFsIEF1ZGlvU2luayB3aXRoCisgICAgICAgICAgICAvLyBpbml0aWFsIGxhdGVudHkgb2YgZ2V0RHVyYXRpb25Vc0lmUGxheWVkQXRTYW1wbGVSYXRlKG1OdW1GcmFtZXNXcml0dGVuKS4KKyAgICAgICAgICAgIC8vIFRoaXMgdmlydHVhbCBBdWRpb1NpbmsgcmVuZGVycyBhdWRpbyBkYXRhIHN0YXJ0aW5nIGZyb20gdGhlIHZlcnkgZmlyc3Qgc2FtcGxlCisgICAgICAgICAgICAvLyBhbmQgaXQncyBwYWNlZCBieSBzeXN0ZW0gY2xvY2suCisgICAgICAgICAgICBBTE9HVygiQXVkaW9TaW5rIHN0dWNrLiBBUkUgWU9VIENPTk5FQ1RFRCBUTyBBVURJTyBPVVQ/IFN3aXRjaGluZyB0byBzeXN0ZW0gY2xvY2suIik7CisgICAgICAgICAgICBtTWVkaWFDbG9jay0+dXBkYXRlQW5jaG9yKG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMsIG5vd1VzLCBtZWRpYVRpbWVVcyk7CisgICAgICAgICAgICBtVXNlVmlydHVhbEF1ZGlvU2luayA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgbUFuY2hvck51bUZyYW1lc1dyaXR0ZW4gPSBtTnVtRnJhbWVzV3JpdHRlbjsKKyAgICBtQW5jaG9yVGltZU1lZGlhVXMgPSBtZWRpYVRpbWVVczsKK30KKworLy8gQ2FsbGVkIHdpdGhvdXQgbUxvY2sgYWNxdWlyZWQuCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6OnBvc3REcmFpblZpZGVvUXVldWUoKSB7CisgICAgaWYgKG1EcmFpblZpZGVvUXVldWVQZW5kaW5nCisgICAgICAgICAgICB8fCBnZXRTeW5jUXVldWVzKCkKKyAgICAgICAgICAgIHx8IChtUGF1c2VkICYmIG1WaWRlb1NhbXBsZVJlY2VpdmVkKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1WaWRlb1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFF1ZXVlRW50cnkgJmVudHJ5ID0gKm1WaWRlb1F1ZXVlLmJlZ2luKCk7CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RHJhaW5WaWRlb1F1ZXVlLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDMyKCJkcmFpbkdlbmVyYXRpb24iLCBnZXREcmFpbkdlbmVyYXRpb24oZmFsc2UgLyogYXVkaW8gKi8pKTsKKworICAgIGlmIChlbnRyeS5tQnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgLy8gRU9TIGRvZXNuJ3QgY2FycnkgYSB0aW1lc3RhbXAuCisgICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZyA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICBpZiAobUZsYWdzICYgRkxBR19SRUFMX1RJTUUpIHsKKyAgICAgICAgaW50NjRfdCByZWFsVGltZVVzOworICAgICAgICBDSEVDSyhlbnRyeS5tQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnJlYWxUaW1lVXMpKTsKKworICAgICAgICByZWFsVGltZVVzID0gbVZpZGVvU2NoZWR1bGVyLT5zY2hlZHVsZShyZWFsVGltZVVzICogMTAwMCkgLyAxMDAwOworCisgICAgICAgIGludDY0X3QgdHdvVnN5bmNzVXMgPSAyICogKG1WaWRlb1NjaGVkdWxlci0+Z2V0VnN5bmNQZXJpb2QoKSAvIDEwMDApOworCisgICAgICAgIGludDY0X3QgZGVsYXlVcyA9IHJlYWxUaW1lVXMgLSBub3dVczsKKworICAgICAgICBBTE9HV19JRihkZWxheVVzID4gNTAwMDAwLCAidW51c3VhbGx5IGhpZ2ggZGVsYXlVczogJWxsZCIsIChsb25nIGxvbmcpZGVsYXlVcyk7CisgICAgICAgIC8vIHBvc3QgMiBkaXNwbGF5IHJlZnJlc2hlcyBiZWZvcmUgcmVuZGVyaW5nIGlzIGR1ZQorICAgICAgICBtc2ctPnBvc3QoZGVsYXlVcyA+IHR3b1ZzeW5jc1VzID8gZGVsYXlVcyAtIHR3b1ZzeW5jc1VzIDogMCk7CisKKyAgICAgICAgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmcgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50NjRfdCBtZWRpYVRpbWVVczsKKyAgICBDSEVDSyhlbnRyeS5tQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKSk7CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgIGlmIChtQW5jaG9yVGltZU1lZGlhVXMgPCAwKSB7CisgICAgICAgICAgICBtTWVkaWFDbG9jay0+dXBkYXRlQW5jaG9yKG1lZGlhVGltZVVzLCBub3dVcywgbWVkaWFUaW1lVXMpOworICAgICAgICAgICAgbUFuY2hvclRpbWVNZWRpYVVzID0gbWVkaWFUaW1lVXM7CisgICAgICAgIH0KKyAgICB9CisgICAgbU5leHRWaWRlb1RpbWVNZWRpYVVzID0gbWVkaWFUaW1lVXMgKyAxMDAwMDA7CisgICAgaWYgKCFtSGFzQXVkaW8pIHsKKyAgICAgICAgLy8gc21vb3RoIG91dCB2aWRlb3MgPj0gMTBmcHMKKyAgICAgICAgbU1lZGlhQ2xvY2stPnVwZGF0ZU1heFRpbWVNZWRpYShtTmV4dFZpZGVvVGltZU1lZGlhVXMpOworICAgIH0KKworICAgIGlmICghbVZpZGVvU2FtcGxlUmVjZWl2ZWQgfHwgbWVkaWFUaW1lVXMgPCBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzKSB7CisgICAgICAgIG1zZy0+cG9zdCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGludDY0X3QgdHdvVnN5bmNzVXMgPSAyICogKG1WaWRlb1NjaGVkdWxlci0+Z2V0VnN5bmNQZXJpb2QoKSAvIDEwMDApOworCisgICAgICAgIC8vIHBvc3QgMiBkaXNwbGF5IHJlZnJlc2hlcyBiZWZvcmUgcmVuZGVyaW5nIGlzIGR1ZQorICAgICAgICBtTWVkaWFDbG9jay0+YWRkVGltZXIobXNnLCBtZWRpYVRpbWVVcywgLXR3b1ZzeW5jc1VzKTsKKyAgICB9CisKKyAgICBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZyA9IHRydWU7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25EcmFpblZpZGVvUXVldWUoKSB7CisgICAgaWYgKG1WaWRlb1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFF1ZXVlRW50cnkgKmVudHJ5ID0gJiptVmlkZW9RdWV1ZS5iZWdpbigpOworCisgICAgaWYgKGVudHJ5LT5tQnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgLy8gRU9TCisKKyAgICAgICAgbm90aWZ5RU9TKGZhbHNlIC8qIGF1ZGlvICovLCBlbnRyeS0+bUZpbmFsUmVzdWx0KTsKKworICAgICAgICBtVmlkZW9RdWV1ZS5lcmFzZShtVmlkZW9RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgZW50cnkgPSBOVUxMOworCisgICAgICAgIHNldFZpZGVvTGF0ZUJ5VXMoMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICBpbnQ2NF90IHJlYWxUaW1lVXM7CisgICAgaW50NjRfdCBtZWRpYVRpbWVVcyA9IC0xOworICAgIGlmIChtRmxhZ3MgJiBGTEFHX1JFQUxfVElNRSkgeworICAgICAgICBDSEVDSyhlbnRyeS0+bUJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZyZWFsVGltZVVzKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQ0hFQ0soZW50cnktPm1CdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpKTsKKworICAgICAgICByZWFsVGltZVVzID0gZ2V0UmVhbFRpbWVVcyhtZWRpYVRpbWVVcywgbm93VXMpOworICAgIH0KKyAgICByZWFsVGltZVVzID0gbVZpZGVvU2NoZWR1bGVyLT5zY2hlZHVsZShyZWFsVGltZVVzICogMTAwMCkgLyAxMDAwOworCisgICAgYm9vbCB0b29MYXRlID0gZmFsc2U7CisKKyAgICBpZiAoIW1QYXVzZWQpIHsKKyAgICAgICAgc2V0VmlkZW9MYXRlQnlVcyhub3dVcyAtIHJlYWxUaW1lVXMpOworICAgICAgICB0b29MYXRlID0gKG1WaWRlb0xhdGVCeVVzID4gNDAwMDApOworCisgICAgICAgIGlmICh0b29MYXRlKSB7CisgICAgICAgICAgICBBTE9HVigidmlkZW8gbGF0ZSBieSAlbGxkIHVzICglLjJmIHNlY3MpIiwKKyAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltVmlkZW9MYXRlQnlVcywgbVZpZGVvTGF0ZUJ5VXMgLyAxRTYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50NjRfdCBtZWRpYVVzID0gMDsKKyAgICAgICAgICAgIG1NZWRpYUNsb2NrLT5nZXRNZWRpYVRpbWUocmVhbFRpbWVVcywgJm1lZGlhVXMpOworICAgICAgICAgICAgQUxPR1YoInJlbmRlcmluZyB2aWRlbyBhdCBtZWRpYSB0aW1lICUuMmYgc2VjcyIsCisgICAgICAgICAgICAgICAgICAgIChtRmxhZ3MgJiBGTEFHX1JFQUxfVElNRSA/IHJlYWxUaW1lVXMgOgorICAgICAgICAgICAgICAgICAgICBtZWRpYVVzKSAvIDFFNik7CisKKyAgICAgICAgICAgIGlmICghKG1GbGFncyAmIEZMQUdfUkVBTF9USU1FKQorICAgICAgICAgICAgICAgICAgICAmJiBtTGFzdEF1ZGlvTWVkaWFUaW1lVXMgIT0gLTEKKyAgICAgICAgICAgICAgICAgICAgJiYgbWVkaWFUaW1lVXMgPiBtTGFzdEF1ZGlvTWVkaWFUaW1lVXMpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiBhdWRpbyBlbmRzIGJlZm9yZSB2aWRlbywgdmlkZW8gY29udGludWVzIHRvIGRyaXZlIG1lZGlhIGNsb2NrLgorICAgICAgICAgICAgICAgIC8vIEFsc28gc21vb3RoIG91dCB2aWRlb3MgPj0gMTBmcHMuCisgICAgICAgICAgICAgICAgbU1lZGlhQ2xvY2stPnVwZGF0ZU1heFRpbWVNZWRpYShtZWRpYVRpbWVVcyArIDEwMDAwMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzZXRWaWRlb0xhdGVCeVVzKDApOworICAgICAgICBpZiAoIW1WaWRlb1NhbXBsZVJlY2VpdmVkICYmICFtSGFzQXVkaW8pIHsKKyAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0aGUgZmlyc3QgZnJhbWUgYWZ0ZXIgYSBmbHVzaCB3b24ndCBiZSB1c2VkIGFzIGFuY2hvcgorICAgICAgICAgICAgLy8gd2hlbiByZW5kZXJlciBpcyBpbiBwYXVzZWQgc3RhdGUsIGJlY2F1c2UgcmVzdW1lIGNhbiBoYXBwZW4gYW55IHRpbWUgYWZ0ZXIgc2Vlay4KKyAgICAgICAgICAgIGNsZWFyQW5jaG9yVGltZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQWx3YXlzIHJlbmRlciB0aGUgZmlyc3QgdmlkZW8gZnJhbWUgd2hpbGUga2VlcGluZyBzdGF0cyBvbiBBL1Ygc3luYy4KKyAgICBpZiAoIW1WaWRlb1NhbXBsZVJlY2VpdmVkKSB7CisgICAgICAgIHJlYWxUaW1lVXMgPSBub3dVczsKKyAgICAgICAgdG9vTGF0ZSA9IGZhbHNlOworICAgIH0KKworICAgIGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQtPnNldEludDY0KCJ0aW1lc3RhbXBOcyIsIHJlYWxUaW1lVXMgKiAxMDAwbGwpOworICAgIGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQtPnNldEludDMyKCJyZW5kZXIiLCAhdG9vTGF0ZSk7CisgICAgZW50cnktPm1Ob3RpZnlDb25zdW1lZC0+cG9zdCgpOworICAgIG1WaWRlb1F1ZXVlLmVyYXNlKG1WaWRlb1F1ZXVlLmJlZ2luKCkpOworICAgIGVudHJ5ID0gTlVMTDsKKworICAgIG1WaWRlb1NhbXBsZVJlY2VpdmVkID0gdHJ1ZTsKKworICAgIGlmICghbVBhdXNlZCkgeworICAgICAgICBpZiAoIW1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQpIHsKKyAgICAgICAgICAgIG1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQgPSB0cnVlOworICAgICAgICAgICAgbm90aWZ5VmlkZW9SZW5kZXJpbmdTdGFydCgpOworICAgICAgICB9CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgIG5vdGlmeUlmTWVkaWFSZW5kZXJpbmdTdGFydGVkX2woKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6bm90aWZ5VmlkZW9SZW5kZXJpbmdTdGFydCgpIHsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0VmlkZW9SZW5kZXJpbmdTdGFydCk7CisgICAgbm90aWZ5LT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6bm90aWZ5RU9TKGJvb2wgYXVkaW8sIHN0YXR1c190IGZpbmFsUmVzdWx0LCBpbnQ2NF90IGRlbGF5VXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG5vdGlmeUVPU19sKGF1ZGlvLCBmaW5hbFJlc3VsdCwgZGVsYXlVcyk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6bm90aWZ5RU9TX2woYm9vbCBhdWRpbywgc3RhdHVzX3QgZmluYWxSZXN1bHQsIGludDY0X3QgZGVsYXlVcykgeworICAgIGlmIChhdWRpbyAmJiBkZWxheVVzID4gMCkgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RU9TLCB0aGlzKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigiYXVkaW9FT1NHZW5lcmF0aW9uIiwgbUF1ZGlvRU9TR2VuZXJhdGlvbik7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImZpbmFsUmVzdWx0IiwgZmluYWxSZXN1bHQpOworICAgICAgICBtc2ctPnBvc3QoZGVsYXlVcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEVPUyk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigiYXVkaW8iLCBzdGF0aWNfY2FzdDxpbnQzMl90PihhdWRpbykpOworICAgIG5vdGlmeS0+c2V0SW50MzIoImZpbmFsUmVzdWx0IiwgZmluYWxSZXN1bHQpOworICAgIG5vdGlmeS0+cG9zdChkZWxheVVzKTsKKworICAgIGlmIChhdWRpbykgeworICAgICAgICAvLyBWaWRlbyBtaWdodCBvdXRsaXZlIGF1ZGlvLiBDbGVhciBhbmNob3IgdG8gZW5hYmxlIHZpZGVvIG9ubHkgY2FzZS4KKyAgICAgICAgbUFuY2hvclRpbWVNZWRpYVVzID0gLTE7CisgICAgICAgIG1IYXNBdWRpbyA9IGZhbHNlOworICAgICAgICBpZiAobU5leHRWaWRlb1RpbWVNZWRpYVVzID49IDApIHsKKyAgICAgICAgICAgIGludDY0X3QgbWVkaWFVcyA9IDA7CisgICAgICAgICAgICBtTWVkaWFDbG9jay0+Z2V0TWVkaWFUaW1lKEFMb29wZXI6OkdldE5vd1VzKCksICZtZWRpYVVzKTsKKyAgICAgICAgICAgIGlmIChtTmV4dFZpZGVvVGltZU1lZGlhVXMgPiBtZWRpYVVzKSB7CisgICAgICAgICAgICAgICAgbU1lZGlhQ2xvY2stPnVwZGF0ZU1heFRpbWVNZWRpYShtTmV4dFZpZGVvVGltZU1lZGlhVXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om5vdGlmeUF1ZGlvVGVhckRvd24oQXVkaW9UZWFyRG93blJlYXNvbiByZWFzb24pIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0QXVkaW9UZWFyRG93biwgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQzMigicmVhc29uIiwgcmVhc29uKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvblF1ZXVlQnVmZmVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgaW50MzJfdCBhdWRpbzsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYXVkaW8iLCAmYXVkaW8pKTsKKworICAgIGlmIChkcm9wQnVmZmVySWZTdGFsZShhdWRpbywgbXNnKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGF1ZGlvKSB7CisgICAgICAgIG1IYXNBdWRpbyA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUhhc1ZpZGVvID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAobUhhc1ZpZGVvKSB7CisgICAgICAgIGlmIChtVmlkZW9TY2hlZHVsZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgbVZpZGVvU2NoZWR1bGVyID0gbmV3IFZpZGVvRnJhbWVTY2hlZHVsZXIoKTsKKyAgICAgICAgICAgIG1WaWRlb1NjaGVkdWxlci0+aW5pdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgc3A8UmVmQmFzZT4gb2JqOworICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgiYnVmZmVyIiwgJm9iaikpOworICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZmZlciA9IHN0YXRpY19jYXN0PE1lZGlhQ29kZWNCdWZmZXIgKj4ob2JqLmdldCgpKTsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnlDb25zdW1lZDsKKyAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJub3RpZnlDb25zdW1lZCIsICZub3RpZnlDb25zdW1lZCkpOworCisgICAgUXVldWVFbnRyeSBlbnRyeTsKKyAgICBlbnRyeS5tQnVmZmVyID0gYnVmZmVyOworICAgIGVudHJ5Lm1Ob3RpZnlDb25zdW1lZCA9IG5vdGlmeUNvbnN1bWVkOworICAgIGVudHJ5Lm1PZmZzZXQgPSAwOworICAgIGVudHJ5Lm1GaW5hbFJlc3VsdCA9IE9LOworICAgIGVudHJ5Lm1CdWZmZXJPcmRpbmFsID0gKyttVG90YWxCdWZmZXJzUXVldWVkOworCisgICAgaWYgKGF1ZGlvKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgIG1BdWRpb1F1ZXVlLnB1c2hfYmFjayhlbnRyeSk7CisgICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWVfbCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1WaWRlb1F1ZXVlLnB1c2hfYmFjayhlbnRyeSk7CisgICAgICAgIHBvc3REcmFpblZpZGVvUXVldWUoKTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmICghbVN5bmNRdWV1ZXMgfHwgbUF1ZGlvUXVldWUuZW1wdHkoKSB8fCBtVmlkZW9RdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBmaXJzdEF1ZGlvQnVmZmVyID0gKCptQXVkaW9RdWV1ZS5iZWdpbigpKS5tQnVmZmVyOworICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGZpcnN0VmlkZW9CdWZmZXIgPSAoKm1WaWRlb1F1ZXVlLmJlZ2luKCkpLm1CdWZmZXI7CisKKyAgICBpZiAoZmlyc3RBdWRpb0J1ZmZlciA9PSBOVUxMIHx8IGZpcnN0VmlkZW9CdWZmZXIgPT0gTlVMTCkgeworICAgICAgICAvLyBFT1Mgc2lnbmFsbGVkIG9uIGVpdGhlciBxdWV1ZS4KKyAgICAgICAgc3luY1F1ZXVlc0RvbmVfbCgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50NjRfdCBmaXJzdEF1ZGlvVGltZVVzOworICAgIGludDY0X3QgZmlyc3RWaWRlb1RpbWVVczsKKyAgICBDSEVDSyhmaXJzdEF1ZGlvQnVmZmVyLT5tZXRhKCkKKyAgICAgICAgICAgIC0+ZmluZEludDY0KCJ0aW1lVXMiLCAmZmlyc3RBdWRpb1RpbWVVcykpOworICAgIENIRUNLKGZpcnN0VmlkZW9CdWZmZXItPm1ldGEoKQorICAgICAgICAgICAgLT5maW5kSW50NjQoInRpbWVVcyIsICZmaXJzdFZpZGVvVGltZVVzKSk7CisKKyAgICBpbnQ2NF90IGRpZmYgPSBmaXJzdFZpZGVvVGltZVVzIC0gZmlyc3RBdWRpb1RpbWVVczsKKworICAgIEFMT0dWKCJxdWV1ZURpZmYgPSAlLjJmIHNlY3MiLCBkaWZmIC8gMUU2KTsKKworICAgIGlmIChkaWZmID4gMTAwMDAwbGwpIHsKKyAgICAgICAgLy8gQXVkaW8gZGF0YSBzdGFydHMgTW9yZSB0aGFuIDAuMSBzZWNzIGJlZm9yZSB2aWRlby4KKyAgICAgICAgLy8gRHJvcCBzb21lIGF1ZGlvLgorCisgICAgICAgICgqbUF1ZGlvUXVldWUuYmVnaW4oKSkubU5vdGlmeUNvbnN1bWVkLT5wb3N0KCk7CisgICAgICAgIG1BdWRpb1F1ZXVlLmVyYXNlKG1BdWRpb1F1ZXVlLmJlZ2luKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3luY1F1ZXVlc0RvbmVfbCgpOworfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6OnN5bmNRdWV1ZXNEb25lX2woKSB7CisgICAgaWYgKCFtU3luY1F1ZXVlcykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbVN5bmNRdWV1ZXMgPSBmYWxzZTsKKworICAgIGlmICghbUF1ZGlvUXVldWUuZW1wdHkoKSkgeworICAgICAgICBwb3N0RHJhaW5BdWRpb1F1ZXVlX2woKTsKKyAgICB9CisKKyAgICBpZiAoIW1WaWRlb1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIHBvc3REcmFpblZpZGVvUXVldWUoKTsKKyAgICAgICAgbUxvY2subG9jaygpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvblF1ZXVlRU9TKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgaW50MzJfdCBhdWRpbzsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYXVkaW8iLCAmYXVkaW8pKTsKKworICAgIGlmIChkcm9wQnVmZmVySWZTdGFsZShhdWRpbywgbXNnKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCBmaW5hbFJlc3VsdDsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZmluYWxSZXN1bHQiLCAmZmluYWxSZXN1bHQpKTsKKworICAgIFF1ZXVlRW50cnkgZW50cnk7CisgICAgZW50cnkubU9mZnNldCA9IDA7CisgICAgZW50cnkubUZpbmFsUmVzdWx0ID0gZmluYWxSZXN1bHQ7CisKKyAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1BdWRpb1F1ZXVlLmVtcHR5KCkgJiYgbVN5bmNRdWV1ZXMpIHsKKyAgICAgICAgICAgIHN5bmNRdWV1ZXNEb25lX2woKTsKKyAgICAgICAgfQorICAgICAgICBtQXVkaW9RdWV1ZS5wdXNoX2JhY2soZW50cnkpOworICAgICAgICBwb3N0RHJhaW5BdWRpb1F1ZXVlX2woKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobVZpZGVvUXVldWUuZW1wdHkoKSAmJiBnZXRTeW5jUXVldWVzKCkpIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgICAgICBzeW5jUXVldWVzRG9uZV9sKCk7CisgICAgICAgIH0KKyAgICAgICAgbVZpZGVvUXVldWUucHVzaF9iYWNrKGVudHJ5KTsKKyAgICAgICAgcG9zdERyYWluVmlkZW9RdWV1ZSgpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvbkZsdXNoKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgaW50MzJfdCBhdWRpbywgbm90aWZ5Q29tcGxldGU7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImF1ZGlvIiwgJmF1ZGlvKSk7CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgIGlmIChhdWRpbykgeworICAgICAgICAgICAgbm90aWZ5Q29tcGxldGUgPSBtTm90aWZ5Q29tcGxldGVBdWRpbzsKKyAgICAgICAgICAgIG1Ob3RpZnlDb21wbGV0ZUF1ZGlvID0gZmFsc2U7CisgICAgICAgICAgICBtTGFzdEF1ZGlvTWVkaWFUaW1lVXMgPSAtMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5vdGlmeUNvbXBsZXRlID0gbU5vdGlmeUNvbXBsZXRlVmlkZW87CisgICAgICAgICAgICBtTm90aWZ5Q29tcGxldGVWaWRlbyA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgd2UncmUgY3VycmVudGx5IHN5bmNpbmcgdGhlIHF1ZXVlcywgaS5lLiBkcm9wcGluZyBhdWRpbyB3aGlsZQorICAgICAgICAvLyBhbGlnbmluZyB0aGUgZmlyc3QgYXVkaW8vdmlkZW8gYnVmZmVyIHRpbWVzIGFuZCBvbmx5IG9uZSBvZiB0aGUKKyAgICAgICAgLy8gdHdvIHF1ZXVlcyBoYXMgZGF0YSwgd2UgbWF5IHN0YXJ2ZSB0aGF0IHF1ZXVlIGJ5IG5vdCByZXF1ZXN0aW5nCisgICAgICAgIC8vIG1vcmUgYnVmZmVycyBmcm9tIHRoZSBkZWNvZGVyLiBJZiB0aGUgb3RoZXIgc291cmNlIHRoZW4gZW5jb3VudGVycworICAgICAgICAvLyBhIGRpc2NvbnRpbnVpdHkgdGhhdCBsZWFkcyB0byBmbHVzaGluZywgd2UnbGwgbmV2ZXIgZmluZCB0aGUKKyAgICAgICAgLy8gY29ycmVzcG9uZGluZyBkaXNjb250aW51aXR5IG9uIHRoZSBvdGhlciBxdWV1ZS4KKyAgICAgICAgLy8gVGhlcmVmb3JlIHdlJ2xsIHN0b3Agc3luY2luZyB0aGUgcXVldWVzIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGVtCisgICAgICAgIC8vIGlzIGZsdXNoZWQuCisgICAgICAgIHN5bmNRdWV1ZXNEb25lX2woKTsKKyAgICB9CisgICAgY2xlYXJBbmNob3JUaW1lKCk7CisKKyAgICBBTE9HVigiZmx1c2hpbmcgJXMiLCBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKKyAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgIGZsdXNoUXVldWUoJm1BdWRpb1F1ZXVlKTsKKworICAgICAgICAgICAgKyttQXVkaW9EcmFpbkdlbmVyYXRpb247CisgICAgICAgICAgICArK21BdWRpb0VPU0dlbmVyYXRpb247CisgICAgICAgICAgICBwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydF9sKCk7CisKKyAgICAgICAgICAgIC8vIHRoZSBmcmFtZSBjb3VudCB3aWxsIGJlIHJlc2V0IGFmdGVyIGZsdXNoLgorICAgICAgICAgICAgY2xlYXJBdWRpb0ZpcnN0QW5jaG9yVGltZV9sKCk7CisgICAgICAgIH0KKworICAgICAgICBtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZyA9IGZhbHNlOworCisgICAgICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgICAgICAgICAgbUF1ZGlvU2luay0+cGF1c2UoKTsKKyAgICAgICAgICAgIG1BdWRpb1NpbmstPmZsdXNoKCk7CisgICAgICAgICAgICBpZiAoIW1QYXVzZWQpIHsKKyAgICAgICAgICAgICAgICBtQXVkaW9TaW5rLT5zdGFydCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUF1ZGlvU2luay0+cGF1c2UoKTsKKyAgICAgICAgICAgIG1BdWRpb1NpbmstPmZsdXNoKCk7CisgICAgICAgICAgICAvLyBDYWxsIHN0b3AoKSB0byBzaWduYWwgdG8gdGhlIEF1ZGlvU2luayB0byBjb21wbGV0ZWx5IGZpbGwgdGhlCisgICAgICAgICAgICAvLyBpbnRlcm5hbCBidWZmZXIgYmVmb3JlIHJlc3VtaW5nIHBsYXliYWNrLgorICAgICAgICAgICAgLy8gRklYTUU6IHRoaXMgaXMgaWdub3JlZCBhZnRlciBmbHVzaCgpLgorICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RvcCgpOworICAgICAgICAgICAgaWYgKG1QYXVzZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBSYWNlIGNvbmRpdGlvbjogaWYgcmVuZGVyZXIgaXMgcGF1c2VkIGFuZCBhdWRpbyBzaW5rIGlzIHN0b3BwZWQsCisgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYXVkaW8gdHJhY2sgYnVmZmVyIGZ1bGx5IGRyYWlucworICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBkZWxpdmVyaW5nIGRhdGEuCisgICAgICAgICAgICAgICAgLy8gRklYTUU6IHJlbW92ZSB0aGlzIGlmIHdlIGNhbiBkZXRlY3QgaWYgc3RvcCgpIGlzIGNvbXBsZXRlLgorICAgICAgICAgICAgICAgIGNvbnN0IGludCBkZWxheVVzID0gMiAqIDUwICogMTAwMDsgLy8gKDIgZnVsbCBtaXhlciB0aHJlYWQgY3ljbGVzIGF0IDUwbXMpCisgICAgICAgICAgICAgICAgbVBhdXNlRHJhaW5BdWRpb0FsbG93ZWRVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgKyBkZWxheVVzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQXVkaW9TaW5rLT5zdGFydCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4gPSAwOworICAgICAgICB9CisgICAgICAgIG1OZXh0QXVkaW9DbG9ja1VwZGF0ZVRpbWVVcyA9IC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIGZsdXNoUXVldWUoJm1WaWRlb1F1ZXVlKTsKKworICAgICAgICBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZyA9IGZhbHNlOworCisgICAgICAgIGlmIChtVmlkZW9TY2hlZHVsZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgbVZpZGVvU2NoZWR1bGVyLT5yZXN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICArK21WaWRlb0RyYWluR2VuZXJhdGlvbjsKKyAgICAgICAgcHJlcGFyZUZvck1lZGlhUmVuZGVyaW5nU3RhcnRfbCgpOworICAgIH0KKworICAgIG1WaWRlb1NhbXBsZVJlY2VpdmVkID0gZmFsc2U7CisKKyAgICBpZiAobm90aWZ5Q29tcGxldGUpIHsKKyAgICAgICAgbm90aWZ5Rmx1c2hDb21wbGV0ZShhdWRpbyk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6OmZsdXNoUXVldWUoTGlzdDxRdWV1ZUVudHJ5PiAqcXVldWUpIHsKKyAgICB3aGlsZSAoIXF1ZXVlLT5lbXB0eSgpKSB7CisgICAgICAgIFF1ZXVlRW50cnkgKmVudHJ5ID0gJipxdWV1ZS0+YmVnaW4oKTsKKworICAgICAgICBpZiAoZW50cnktPm1CdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgZW50cnktPm1Ob3RpZnlDb25zdW1lZC0+cG9zdCgpOworICAgICAgICB9IGVsc2UgaWYgKGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gSXMgaXQgbmVlZGVkIHRvIG9wZW4gYXVkaW8gc2luayBub3c/CisgICAgICAgICAgICBvbkNoYW5nZUF1ZGlvRm9ybWF0KGVudHJ5LT5tTWV0YSwgZW50cnktPm1Ob3RpZnlDb25zdW1lZCk7CisgICAgICAgIH0KKworICAgICAgICBxdWV1ZS0+ZXJhc2UocXVldWUtPmJlZ2luKCkpOworICAgICAgICBlbnRyeSA9IE5VTEw7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om5vdGlmeUZsdXNoQ29tcGxldGUoYm9vbCBhdWRpbykgeworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRGbHVzaENvbXBsZXRlKTsKKyAgICBub3RpZnktPnNldEludDMyKCJhdWRpbyIsIHN0YXRpY19jYXN0PGludDMyX3Q+KGF1ZGlvKSk7CisgICAgbm90aWZ5LT5wb3N0KCk7Cit9CisKK2Jvb2wgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6ZHJvcEJ1ZmZlcklmU3RhbGUoCisgICAgICAgIGJvb2wgYXVkaW8sIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgaW50MzJfdCBxdWV1ZUdlbmVyYXRpb247CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInF1ZXVlR2VuZXJhdGlvbiIsICZxdWV1ZUdlbmVyYXRpb24pKTsKKworICAgIGlmIChxdWV1ZUdlbmVyYXRpb24gPT0gZ2V0UXVldWVHZW5lcmF0aW9uKGF1ZGlvKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeUNvbnN1bWVkOworICAgIGlmIChtc2ctPmZpbmRNZXNzYWdlKCJub3RpZnlDb25zdW1lZCIsICZub3RpZnlDb25zdW1lZCkpIHsKKyAgICAgICAgbm90aWZ5Q29uc3VtZWQtPnBvc3QoKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvbkF1ZGlvU2lua0NoYW5nZWQoKSB7CisgICAgaWYgKG9mZmxvYWRpbmdBdWRpbygpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQ0hFQ0soIW1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nKTsKKyAgICBtTnVtRnJhbWVzV3JpdHRlbiA9IDA7CisgICAgbUFuY2hvck51bUZyYW1lc1dyaXR0ZW4gPSAtMTsKKyAgICB1aW50MzJfdCB3cml0dGVuOworICAgIGlmIChtQXVkaW9TaW5rLT5nZXRGcmFtZXNXcml0dGVuKCZ3cml0dGVuKSA9PSBPSykgeworICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbiA9IHdyaXR0ZW47CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om9uRGlzYWJsZU9mZmxvYWRBdWRpbygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG1GbGFncyAmPSB+RkxBR19PRkZMT0FEX0FVRElPOworICAgICsrbUF1ZGlvRHJhaW5HZW5lcmF0aW9uOworICAgIGlmIChtQXVkaW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24gIT0gLTEpIHsKKyAgICAgICAgcHJlcGFyZUZvck1lZGlhUmVuZGVyaW5nU3RhcnRfbCgpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvbkVuYWJsZU9mZmxvYWRBdWRpbygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG1GbGFncyB8PSBGTEFHX09GRkxPQURfQVVESU87CisgICAgKyttQXVkaW9EcmFpbkdlbmVyYXRpb247CisgICAgaWYgKG1BdWRpb1JlbmRlcmluZ1N0YXJ0R2VuZXJhdGlvbiAhPSAtMSkgeworICAgICAgICBwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydF9sKCk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om9uUGF1c2UoKSB7CisgICAgaWYgKG1QYXVzZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgLy8gd2UgZG8gbm90IGluY3JlbWVudCBhdWRpbyBkcmFpbiBnZW5lcmF0aW9uIHNvIHRoYXQgd2UgZmlsbCBhdWRpbyBidWZmZXIgZHVyaW5nIHBhdXNlLgorICAgICAgICArK21WaWRlb0RyYWluR2VuZXJhdGlvbjsKKyAgICAgICAgcHJlcGFyZUZvck1lZGlhUmVuZGVyaW5nU3RhcnRfbCgpOworICAgICAgICBtUGF1c2VkID0gdHJ1ZTsKKyAgICAgICAgbU1lZGlhQ2xvY2stPnNldFBsYXliYWNrUmF0ZSgwLjApOworICAgIH0KKworICAgIG1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nID0gZmFsc2U7CisgICAgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmcgPSBmYWxzZTsKKworICAgIC8vIE5vdGU6IGF1ZGlvIGRhdGEgbWF5IG5vdCBoYXZlIGJlZW4gZGVjb2RlZCwgYW5kIHRoZSBBdWRpb1NpbmsgbWF5IG5vdCBiZSBvcGVuZWQuCisgICAgbUF1ZGlvU2luay0+cGF1c2UoKTsKKyAgICBzdGFydEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCgpOworCisgICAgQUxPR1YoIm5vdyBwYXVzZWQgYXVkaW8gcXVldWUgaGFzICV6dSBlbnRyaWVzLCB2aWRlbyBoYXMgJXp1IGVudHJpZXMiLAorICAgICAgICAgIG1BdWRpb1F1ZXVlLnNpemUoKSwgbVZpZGVvUXVldWUuc2l6ZSgpKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvblJlc3VtZSgpIHsKKyAgICBpZiAoIW1QYXVzZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE5vdGU6IGF1ZGlvIGRhdGEgbWF5IG5vdCBoYXZlIGJlZW4gZGVjb2RlZCwgYW5kIHRoZSBBdWRpb1NpbmsgbWF5IG5vdCBiZSBvcGVuZWQuCisgICAgY2FuY2VsQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0KCk7CisgICAgaWYgKG1BdWRpb1NpbmstPnJlYWR5KCkpIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvU2luay0+c3RhcnQoKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoImNhbm5vdCBzdGFydCBBdWRpb1NpbmsgZXJyICVkIiwgZXJyKTsKKyAgICAgICAgICAgIG5vdGlmeUF1ZGlvVGVhckRvd24oa0R1ZVRvRXJyb3IpOworICAgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICBtUGF1c2VkID0gZmFsc2U7CisgICAgICAgIC8vIHJlbmRlcmluZyBzdGFydGVkIG1lc3NhZ2UgbWF5IGhhdmUgYmVlbiBkZWxheWVkIGlmIHdlIHdlcmUgcGF1c2VkLgorICAgICAgICBpZiAobVJlbmRlcmluZ0RhdGFEZWxpdmVyZWQpIHsKKyAgICAgICAgICAgIG5vdGlmeUlmTWVkaWFSZW5kZXJpbmdTdGFydGVkX2woKTsKKyAgICAgICAgfQorICAgICAgICAvLyBjb25maWd1cmUgYXVkaW9zaW5rIGFzIHdlIGRpZCBub3QgZG8gaXQgd2hlbiBwYXVzaW5nCisgICAgICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwgJiYgbUF1ZGlvU2luay0+cmVhZHkoKSkgeworICAgICAgICAgICAgbUF1ZGlvU2luay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1NldHRpbmdzKTsKKyAgICAgICAgfQorCisgICAgICAgIG1NZWRpYUNsb2NrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrUmF0ZSk7CisKKyAgICAgICAgaWYgKCFtQXVkaW9RdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICBwb3N0RHJhaW5BdWRpb1F1ZXVlX2woKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghbVZpZGVvUXVldWUuZW1wdHkoKSkgeworICAgICAgICBwb3N0RHJhaW5WaWRlb1F1ZXVlKCk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om9uU2V0VmlkZW9GcmFtZVJhdGUoZmxvYXQgZnBzKSB7CisgICAgaWYgKG1WaWRlb1NjaGVkdWxlciA9PSBOVUxMKSB7CisgICAgICAgIG1WaWRlb1NjaGVkdWxlciA9IG5ldyBWaWRlb0ZyYW1lU2NoZWR1bGVyKCk7CisgICAgfQorICAgIG1WaWRlb1NjaGVkdWxlci0+aW5pdChmcHMpOworfQorCitpbnQzMl90IE51UGxheWVyMjo6UmVuZGVyZXI6OmdldFF1ZXVlR2VuZXJhdGlvbihib29sIGF1ZGlvKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gKGF1ZGlvID8gbUF1ZGlvUXVldWVHZW5lcmF0aW9uIDogbVZpZGVvUXVldWVHZW5lcmF0aW9uKTsKK30KKworaW50MzJfdCBOdVBsYXllcjI6OlJlbmRlcmVyOjpnZXREcmFpbkdlbmVyYXRpb24oYm9vbCBhdWRpbykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIChhdWRpbyA/IG1BdWRpb0RyYWluR2VuZXJhdGlvbiA6IG1WaWRlb0RyYWluR2VuZXJhdGlvbik7Cit9CisKK2Jvb2wgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6Z2V0U3luY1F1ZXVlcygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiBtU3luY1F1ZXVlczsKK30KKwordm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvbkF1ZGlvVGVhckRvd24oQXVkaW9UZWFyRG93blJlYXNvbiByZWFzb24pIHsKKyAgICBpZiAobUF1ZGlvVG9ybkRvd24pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQXVkaW9Ub3JuRG93biA9IHRydWU7CisKKyAgICBpbnQ2NF90IGN1cnJlbnRQb3NpdGlvblVzOworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBpZiAoZ2V0Q3VycmVudFBvc2l0aW9uKCZjdXJyZW50UG9zaXRpb25VcykgPT0gT0spIHsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQ2NCgicG9zaXRpb25VcyIsIGN1cnJlbnRQb3NpdGlvblVzKTsKKyAgICB9CisKKyAgICBtQXVkaW9TaW5rLT5zdG9wKCk7CisgICAgbUF1ZGlvU2luay0+Zmx1c2goKTsKKworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEF1ZGlvVGVhckRvd24pOworICAgIG5vdGlmeS0+c2V0SW50MzIoInJlYXNvbiIsIHJlYXNvbik7CisgICAgbm90aWZ5LT5wb3N0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6c3RhcnRBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQoKSB7CisgICAgaWYgKG9mZmxvYWRpbmdBdWRpbygpKSB7CisgICAgICAgIG1XYWtlTG9jay0+YWNxdWlyZSgpOworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0QXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0LCB0aGlzKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigiZHJhaW5HZW5lcmF0aW9uIiwgbUF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dEdlbmVyYXRpb24pOworICAgICAgICBtc2ctPnBvc3Qoa09mZmxvYWRQYXVzZU1heFVzKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6Y2FuY2VsQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0KCkgeworICAgIC8vIFdlIG1heSBoYXZlIGNhbGxlZCBzdGFydEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCgpIHdpdGhvdXQKKyAgICAvLyB0aGUgQXVkaW9TaW5rIG9wZW4gYW5kIHdpdGggb2ZmbG9hZGluZ0F1ZGlvIGVuYWJsZWQuCisgICAgLy8KKyAgICAvLyBXaGVuIHdlIGNhbmNlbCwgaXQgbWF5IGJlIHRoYXQgb2ZmbG9hZGluZ0F1ZGlvIGlzIHN1YnNlcXVlbnRseSBkaXNhYmxlZCwgc28gcmVnYXJkbGVzcworICAgIC8vIHdlIGFsd2F5cyByZWxlYXNlIHRoZSB3YWtlbG9jayBhbmQgaW5jcmVtZW50IHRoZSBwYXVzZSB0aW1lb3V0IGdlbmVyYXRpb24uCisgICAgLy8KKyAgICAvLyBOb3RlOiBUaGUgYWNxdWlyZWQgd2FrZWxvY2sgcHJldmVudHMgdGhlIGRldmljZSBmcm9tIHN1c3BlbmRpbmcKKyAgICAvLyBpbW1lZGlhdGVseSBhZnRlciBvZmZsb2FkIHBhdXNlIChpbiBjYXNlIGEgcmVzdW1lIGhhcHBlbnMgc2hvcnRseSB0aGVyZWFmdGVyKS4KKyAgICBtV2FrZUxvY2stPnJlbGVhc2UodHJ1ZSk7CisgICAgKyttQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0R2VuZXJhdGlvbjsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25PcGVuQXVkaW9TaW5rKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgYm9vbCBvZmZsb2FkT25seSwKKyAgICAgICAgYm9vbCBoYXNWaWRlbywKKyAgICAgICAgdWludDMyX3QgZmxhZ3MsCisgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcpIHsKKyAgICBBTE9HVigib3BlbkF1ZGlvU2luazogb2ZmbG9hZE9ubHkoJWQpIG9mZmxvYWRpbmdBdWRpbyglZCkiLAorICAgICAgICAgICAgb2ZmbG9hZE9ubHksIG9mZmxvYWRpbmdBdWRpbygpKTsKKyAgICBib29sIGF1ZGlvU2lua0NoYW5nZWQgPSBmYWxzZTsKKworICAgIGludDMyX3QgbnVtQ2hhbm5lbHM7CisgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoImNoYW5uZWwtY291bnQiLCAmbnVtQ2hhbm5lbHMpKTsKKworICAgIGludDMyX3QgY2hhbm5lbE1hc2s7CisgICAgaWYgKCFmb3JtYXQtPmZpbmRJbnQzMigiY2hhbm5lbC1tYXNrIiwgJmNoYW5uZWxNYXNrKSkgeworICAgICAgICAvLyBzaWduYWwgdG8gdGhlIEF1ZGlvU2luayB0byBkZXJpdmUgdGhlIG1hc2sgZnJvbSBjb3VudC4KKyAgICAgICAgY2hhbm5lbE1hc2sgPSBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVI7CisgICAgfQorCisgICAgaW50MzJfdCBzYW1wbGVSYXRlOworICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJzYW1wbGUtcmF0ZSIsICZzYW1wbGVSYXRlKSk7CisKKyAgICBpZiAob2ZmbG9hZGluZ0F1ZGlvKCkpIHsKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICAgICAgQVN0cmluZyBtaW1lOworICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtYXBNaW1lVG9BdWRpb0Zvcm1hdChhdWRpb0Zvcm1hdCwgbWltZS5jX3N0cigpKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiQ291bGRuJ3QgbWFwIG1pbWUgXCIlc1wiIHRvIGEgdmFsaWQgIgorICAgICAgICAgICAgICAgICAgICAiYXVkaW9fZm9ybWF0IiwgbWltZS5jX3N0cigpKTsKKyAgICAgICAgICAgIG9uRGlzYWJsZU9mZmxvYWRBdWRpbygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoIk1pbWUgXCIlc1wiIG1hcHBlZCB0byBhdWRpb19mb3JtYXQgMHgleCIsCisgICAgICAgICAgICAgICAgICAgIG1pbWUuY19zdHIoKSwgYXVkaW9Gb3JtYXQpOworCisgICAgICAgICAgICBpbnQgYXZnQml0UmF0ZSA9IC0xOworICAgICAgICAgICAgZm9ybWF0LT5maW5kSW50MzIoImJpdHJhdGUiLCAmYXZnQml0UmF0ZSk7CisKKyAgICAgICAgICAgIGludDMyX3QgYWFjUHJvZmlsZSA9IC0xOworICAgICAgICAgICAgaWYgKGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9BQUMKKyAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0LT5maW5kSW50MzIoImFhYy1wcm9maWxlIiwgJmFhY1Byb2ZpbGUpKSB7CisgICAgICAgICAgICAgICAgLy8gUmVkZWZpbmUgQUFDIGZvcm1hdCBhcyBwZXIgYWFjIHByb2ZpbGUKKyAgICAgICAgICAgICAgICBtYXBBQUNQcm9maWxlVG9BdWRpb0Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgYWFjUHJvZmlsZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF1ZGlvX29mZmxvYWRfaW5mb190IG9mZmxvYWRJbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzID0gLTE7CisgICAgICAgICAgICBmb3JtYXQtPmZpbmRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgImR1cmF0aW9uVXMiLCAmb2ZmbG9hZEluZm8uZHVyYXRpb25fdXMpOworICAgICAgICAgICAgb2ZmbG9hZEluZm8uc2FtcGxlX3JhdGUgPSBzYW1wbGVSYXRlOworICAgICAgICAgICAgb2ZmbG9hZEluZm8uY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2s7CisgICAgICAgICAgICBvZmZsb2FkSW5mby5mb3JtYXQgPSBhdWRpb0Zvcm1hdDsKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvLnN0cmVhbV90eXBlID0gQVVESU9fU1RSRUFNX01VU0lDOworICAgICAgICAgICAgb2ZmbG9hZEluZm8uYml0X3JhdGUgPSBhdmdCaXRSYXRlOworICAgICAgICAgICAgb2ZmbG9hZEluZm8uaGFzX3ZpZGVvID0gaGFzVmlkZW87CisgICAgICAgICAgICBvZmZsb2FkSW5mby5pc19zdHJlYW1pbmcgPSBpc1N0cmVhbWluZzsKKworICAgICAgICAgICAgaWYgKG1lbWNtcCgmbUN1cnJlbnRPZmZsb2FkSW5mbywgJm9mZmxvYWRJbmZvLCBzaXplb2Yob2ZmbG9hZEluZm8pKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIm9wZW5BdWRpb1Npbms6IG5vIGNoYW5nZSBpbiBvZmZsb2FkIG1vZGUiKTsKKyAgICAgICAgICAgICAgICAvLyBubyBjaGFuZ2UgZnJvbSBwcmV2aW91cyBjb25maWd1cmF0aW9uLCBldmVyeXRoaW5nIG9rLgorICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DdXJyZW50UGNtSW5mbyA9IEFVRElPX1BDTUlORk9fSU5JVElBTElaRVI7CisKKyAgICAgICAgICAgIEFMT0dWKCJvcGVuQXVkaW9TaW5rOiB0cnkgdG8gb3BlbiBBdWRpb1NpbmsgaW4gb2ZmbG9hZCBtb2RlIik7CisgICAgICAgICAgICB1aW50MzJfdCBvZmZsb2FkRmxhZ3MgPSBmbGFnczsKKyAgICAgICAgICAgIG9mZmxvYWRGbGFncyB8PSBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEOworICAgICAgICAgICAgb2ZmbG9hZEZsYWdzICY9IH5BVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUjsKKyAgICAgICAgICAgIGF1ZGlvU2lua0NoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgbUF1ZGlvU2luay0+Y2xvc2UoKTsKKworICAgICAgICAgICAgZXJyID0gbUF1ZGlvU2luay0+b3BlbigKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCljaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIDAgLyogYnVmZmVyQ291bnQgLSB1bnVzZWQgKi8sCisgICAgICAgICAgICAgICAgICAgICZOdVBsYXllcjI6OlJlbmRlcmVyOjpBdWRpb1NpbmtDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KW9mZmxvYWRGbGFncywKKyAgICAgICAgICAgICAgICAgICAgJm9mZmxvYWRJbmZvKTsKKworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIGVyciA9IG1BdWRpb1NpbmstPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tTZXR0aW5ncyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcGxheWJhY2sgaXMgb2ZmbG9hZGVkIHRvIGgvdywgd2UgcGFzcworICAgICAgICAgICAgICAgIC8vIHRoZSBIQUwgc29tZSBtZXRhZGF0YSBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIGRvIHRoaXMgZm9yIFBDTSBiZWNhdXNlIGl0CisgICAgICAgICAgICAgICAgLy8gd2lsbCBiZSBnb2luZyB0aHJvdWdoIHRoZSBBdWRpb0ZsaW5nZXIgbWl4ZXIKKyAgICAgICAgICAgICAgICAvLyBiZWZvcmUgcmVhY2hpbmcgdGhlIGhhcmR3YXJlLgorICAgICAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICBtQ3VycmVudE9mZmxvYWRJbmZvID0gb2ZmbG9hZEluZm87CisgICAgICAgICAgICAgICAgaWYgKCFtUGF1c2VkKSB7IC8vIGZvciBwcmV2aWV3IG1vZGUsIGRvbid0IHN0YXJ0IGlmIHBhdXNlZAorICAgICAgICAgICAgICAgICAgICBlcnIgPSBtQXVkaW9TaW5rLT5zdGFydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVl9JRihlcnIgPT0gT0ssICJvcGVuQXVkaW9TaW5rOiBvZmZsb2FkIHN1Y2NlZWRlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIC8vIENsZWFuIHVwLCBmYWxsIGJhY2sgdG8gbm9uIG9mZmxvYWQgbW9kZS4KKyAgICAgICAgICAgICAgICBtQXVkaW9TaW5rLT5jbG9zZSgpOworICAgICAgICAgICAgICAgIG9uRGlzYWJsZU9mZmxvYWRBdWRpbygpOworICAgICAgICAgICAgICAgIG1DdXJyZW50T2ZmbG9hZEluZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgICAgIEFMT0dWKCJvcGVuQXVkaW9TaW5rOiBvZmZsb2FkIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIGlmIChvZmZsb2FkT25seSkgeworICAgICAgICAgICAgICAgICAgICBub3RpZnlBdWRpb1RlYXJEb3duKGtGb3JjZU5vbk9mZmxvYWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVVzZUF1ZGlvQ2FsbGJhY2sgPSB0cnVlOyAgLy8gb2ZmbG9hZCBtb2RlIHRyYW5zZmVycyBkYXRhIHRocm91Z2ggY2FsbGJhY2sKKyAgICAgICAgICAgICAgICArK21BdWRpb0RyYWluR2VuZXJhdGlvbjsgIC8vIGRpc2NhcmQgcGVuZGluZyBrV2hhdERyYWluQXVkaW9RdWV1ZSBtZXNzYWdlLgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmICghb2ZmbG9hZE9ubHkgJiYgIW9mZmxvYWRpbmdBdWRpbygpKSB7CisgICAgICAgIEFMT0dWKCJvcGVuQXVkaW9TaW5rOiBvcGVuIEF1ZGlvU2luayBpbiBOT04tb2ZmbG9hZCBtb2RlIik7CisgICAgICAgIHVpbnQzMl90IHBjbUZsYWdzID0gZmxhZ3M7CisgICAgICAgIHBjbUZsYWdzICY9IH5BVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEOworCisgICAgICAgIGNvbnN0IFBjbUluZm8gaW5mbyA9IHsKKyAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KXBjbUZsYWdzLAorICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCAvLyBUT0RPOiBjaGFuZ2UgdG8gYXVkaW9Gb3JtYXQKKyAgICAgICAgICAgICAgICBudW1DaGFubmVscywKKyAgICAgICAgICAgICAgICBzYW1wbGVSYXRlCisgICAgICAgIH07CisgICAgICAgIGlmIChtZW1jbXAoJm1DdXJyZW50UGNtSW5mbywgJmluZm8sIHNpemVvZihpbmZvKSkgPT0gMCkgeworICAgICAgICAgICAgQUxPR1YoIm9wZW5BdWRpb1Npbms6IG5vIGNoYW5nZSBpbiBwY20gbW9kZSIpOworICAgICAgICAgICAgLy8gbm8gY2hhbmdlIGZyb20gcHJldmlvdXMgY29uZmlndXJhdGlvbiwgZXZlcnl0aGluZyBvay4KKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCisgICAgICAgIGF1ZGlvU2lua0NoYW5nZWQgPSB0cnVlOworICAgICAgICBtQXVkaW9TaW5rLT5jbG9zZSgpOworICAgICAgICBtQ3VycmVudE9mZmxvYWRJbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKKyAgICAgICAgLy8gTm90ZTogSXQgaXMgcG9zc2libGUgdG8gc2V0IHVwIHRoZSBjYWxsYmFjaywgYnV0IG5vdCB1c2UgaXQgdG8gc2VuZCBhdWRpbyBkYXRhLgorICAgICAgICAvLyBUaGlzIHJlcXVpcmVzIGEgZml4IGluIEF1ZGlvU2luayB0byBleHBsaWNpdGx5IHNwZWNpZnkgdGhlIHRyYW5zZmVyIG1vZGUuCisgICAgICAgIG1Vc2VBdWRpb0NhbGxiYWNrID0gZ2V0VXNlQXVkaW9DYWxsYmFja1NldHRpbmcoKTsKKyAgICAgICAgaWYgKG1Vc2VBdWRpb0NhbGxiYWNrKSB7CisgICAgICAgICAgICArK21BdWRpb0RyYWluR2VuZXJhdGlvbjsgIC8vIGRpc2NhcmQgcGVuZGluZyBrV2hhdERyYWluQXVkaW9RdWV1ZSBtZXNzYWdlLgorICAgICAgICB9CisKKyAgICAgICAgLy8gQ29tcHV0ZSB0aGUgZGVzaXJlZCBidWZmZXIgc2l6ZS4KKyAgICAgICAgLy8gRm9yIGNhbGxiYWNrIG1vZGUsIHRoZSBhbW91bnQgb2YgdGltZSBiZWZvcmUgd2FrZXVwIGlzIGFib3V0IGhhbGYgdGhlIGJ1ZmZlciBzaXplLgorICAgICAgICBjb25zdCB1aW50MzJfdCBmcmFtZUNvdW50ID0KKyAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNhbXBsZVJhdGUgKiBnZXRBdWRpb1NpbmtQY21Nc1NldHRpbmcoKSAvIDEwMDA7CisKKyAgICAgICAgLy8gVGhlIGRvTm90UmVjb25uZWN0IG1lYW5zIEF1ZGlvU2luayB3aWxsIHNpZ25hbCBiYWNrIGFuZCBsZXQgTnVQbGF5ZXIyIHRvIHJlLWNvbnN0cnVjdAorICAgICAgICAvLyBBdWRpb1NpbmsuIFdlIGRvbid0IHdhbnQgdGhpcyB3aGVuIHRoZXJlJ3MgdmlkZW8gYmVjYXVzZSBpdCB3aWxsIGNhdXNlIGEgdmlkZW8gc2VlayB0bworICAgICAgICAvLyB0aGUgcHJldmlvdXMgSSBmcmFtZS4gQnV0IHdlIGRvIHdhbnQgdGhpcyB3aGVuIHRoZXJlJ3Mgb25seSBhdWRpbyBiZWNhdXNlIGl0IHdpbGwgZ2l2ZQorICAgICAgICAvLyBOdVBsYXllcjIgYSBjaGFuY2UgdG8gc3dpdGNoIGZyb20gbm9uLW9mZmxvYWQgbW9kZSB0byBvZmZsb2FkIG1vZGUuCisgICAgICAgIC8vIFNvIHdlIG9ubHkgc2V0IGRvTm90UmVjb25uZWN0IHdoZW4gdGhlcmUncyBubyB2aWRlby4KKyAgICAgICAgY29uc3QgYm9vbCBkb05vdFJlY29ubmVjdCA9ICFoYXNWaWRlbzsKKworICAgICAgICAvLyBXZSBzaG91bGQgYWx3YXlzIGJlIGFibGUgdG8gc2V0IG91ciBwbGF5YmFjayBzZXR0aW5ncyBpZiB0aGUgc2luayBpcyBjbG9zZWQuCisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUF1ZGlvU2luay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1NldHRpbmdzKSAhPSBPSywKKyAgICAgICAgICAgICAgICAib25PcGVuQXVkaW9TaW5rOiBjYW4ndCBzZXQgcGxheWJhY2sgcmF0ZSBvbiBjbG9zZWQgc2luayIpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQXVkaW9TaW5rLT5vcGVuKAorICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KWNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKKyAgICAgICAgICAgICAgICAgICAgMCAvKiBidWZmZXJDb3VudCAtIHVudXNlZCAqLywKKyAgICAgICAgICAgICAgICAgICAgbVVzZUF1ZGlvQ2FsbGJhY2sgPyAmTnVQbGF5ZXIyOjpSZW5kZXJlcjo6QXVkaW9TaW5rQ2FsbGJhY2sgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICBtVXNlQXVkaW9DYWxsYmFjayA/IHRoaXMgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpcGNtRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgIGRvTm90UmVjb25uZWN0LAorICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50KTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coIm9wZW5BdWRpb1Npbms6IG5vbiBvZmZsb2FkZWQgb3BlbiBmYWlsZWQgc3RhdHVzOiAlZCIsIGVycik7CisgICAgICAgICAgICBtQXVkaW9TaW5rLT5jbG9zZSgpOworICAgICAgICAgICAgbUN1cnJlbnRQY21JbmZvID0gQVVESU9fUENNSU5GT19JTklUSUFMSVpFUjsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgbUN1cnJlbnRQY21JbmZvID0gaW5mbzsKKyAgICAgICAgaWYgKCFtUGF1c2VkKSB7IC8vIGZvciBwcmV2aWV3IG1vZGUsIGRvbid0IHN0YXJ0IGlmIHBhdXNlZAorICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYXVkaW9TaW5rQ2hhbmdlZCkgeworICAgICAgICBvbkF1ZGlvU2lua0NoYW5nZWQoKTsKKyAgICB9CisgICAgbUF1ZGlvVG9ybkRvd24gPSBmYWxzZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25DbG9zZUF1ZGlvU2luaygpIHsKKyAgICBtQXVkaW9TaW5rLT5jbG9zZSgpOworICAgIG1DdXJyZW50T2ZmbG9hZEluZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOworICAgIG1DdXJyZW50UGNtSW5mbyA9IEFVRElPX1BDTUlORk9fSU5JVElBTElaRVI7Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25DaGFuZ2VBdWRpb0Zvcm1hdCgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtZXRhLCBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSkgeworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgQ0hFQ0sobWV0YS0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKTsKKworICAgIGludDMyX3Qgb2ZmbG9hZE9ubHk7CisgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKCJvZmZsb2FkLW9ubHkiLCAmb2ZmbG9hZE9ubHkpKTsKKworICAgIGludDMyX3QgaGFzVmlkZW87CisgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKCJoYXMtdmlkZW8iLCAmaGFzVmlkZW8pKTsKKworICAgIHVpbnQzMl90IGZsYWdzOworICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMigiZmxhZ3MiLCAoaW50MzJfdCAqKSZmbGFncykpOworCisgICAgdWludDMyX3QgaXNTdHJlYW1pbmc7CisgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKCJpc1N0cmVhbWluZyIsIChpbnQzMl90ICopJmlzU3RyZWFtaW5nKSk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBvbk9wZW5BdWRpb1NpbmsoZm9ybWF0LCBvZmZsb2FkT25seSwgaGFzVmlkZW8sIGZsYWdzLCBpc1N0cmVhbWluZyk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgfQorICAgIG5vdGlmeS0+cG9zdCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlJlbmRlcmVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlJlbmRlcmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJjZjBkOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyUmVuZGVyZXIuaApAQCAtMCwwICsxLDMwMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBOVVBMQVlFUjJfUkVOREVSRVJfSF8KKworI2RlZmluZSBOVVBMQVlFUjJfUkVOREVSRVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CisjaW5jbHVkZSA8bWVkaWEvQVZTeW5jU2V0dGluZ3MuaD4KKworI2luY2x1ZGUgIk51UGxheWVyMi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzICBKV2FrZUxvY2s7CitzdHJ1Y3QgTWVkaWFDbG9jazsKK2NsYXNzIE1lZGlhQ29kZWNCdWZmZXI7CitzdHJ1Y3QgVmlkZW9GcmFtZVNjaGVkdWxlcjsKKworc3RydWN0IE51UGxheWVyMjo6UmVuZGVyZXIgOiBwdWJsaWMgQUhhbmRsZXIgeworICAgIGVudW0gRmxhZ3MgeworICAgICAgICBGTEFHX1JFQUxfVElNRSA9IDEsCisgICAgICAgIEZMQUdfT0ZGTE9BRF9BVURJTyA9IDIsCisgICAgfTsKKyAgICBSZW5kZXJlcihjb25zdCBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U6OkF1ZGlvU2luaz4gJnNpbmssCisgICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2ssCisgICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKKworICAgIHN0YXRpYyBzaXplX3QgQXVkaW9TaW5rQ2FsbGJhY2soCisgICAgICAgICAgICBNZWRpYVBsYXllcjJJbnRlcmZhY2U6OkF1ZGlvU2luayAqYXVkaW9TaW5rLAorICAgICAgICAgICAgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIHZvaWQgKm1lLAorICAgICAgICAgICAgTWVkaWFQbGF5ZXIySW50ZXJmYWNlOjpBdWRpb1Npbms6OmNiX2V2ZW50X3QgZXZlbnQpOworCisgICAgdm9pZCBxdWV1ZUJ1ZmZlcigKKyAgICAgICAgICAgIGJvb2wgYXVkaW8sCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnlDb25zdW1lZCk7CisKKyAgICB2b2lkIHF1ZXVlRU9TKGJvb2wgYXVkaW8sIHN0YXR1c190IGZpbmFsUmVzdWx0KTsKKworICAgIHN0YXR1c190IHNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUgLyogc2FuaXRpemVkICovKTsKKyAgICBzdGF0dXNfdCBnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlIC8qIG5vbm51bGwgKi8pOworICAgIHN0YXR1c190IHNldFN5bmNTZXR0aW5ncyhjb25zdCBBVlN5bmNTZXR0aW5ncyAmc3luYywgZmxvYXQgdmlkZW9GcHNIaW50KTsKKyAgICBzdGF0dXNfdCBnZXRTeW5jU2V0dGluZ3MoQVZTeW5jU2V0dGluZ3MgKnN5bmMgLyogbm9ubnVsbCAqLywgZmxvYXQgKnZpZGVvRnBzIC8qIG5vbm51bGwgKi8pOworCisgICAgdm9pZCBmbHVzaChib29sIGF1ZGlvLCBib29sIG5vdGlmeUNvbXBsZXRlKTsKKworICAgIHZvaWQgc2lnbmFsVGltZURpc2NvbnRpbnVpdHkoKTsKKworICAgIHZvaWQgc2lnbmFsRGlzYWJsZU9mZmxvYWRBdWRpbygpOworICAgIHZvaWQgc2lnbmFsRW5hYmxlT2ZmbG9hZEF1ZGlvKCk7CisKKyAgICB2b2lkIHBhdXNlKCk7CisgICAgdm9pZCByZXN1bWUoKTsKKworICAgIHZvaWQgc2V0VmlkZW9GcmFtZVJhdGUoZmxvYXQgZnBzKTsKKworICAgIHN0YXR1c190IGdldEN1cnJlbnRQb3NpdGlvbihpbnQ2NF90ICptZWRpYVVzKTsKKyAgICBpbnQ2NF90IGdldFZpZGVvTGF0ZUJ5VXMoKTsKKworICAgIHN0YXR1c190IG9wZW5BdWRpb1NpbmsoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgICAgIGJvb2wgb2ZmbG9hZE9ubHksCisgICAgICAgICAgICBib29sIGhhc1ZpZGVvLAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCisgICAgICAgICAgICBib29sICppc09mZmxvYWRlZCwKKyAgICAgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcpOworICAgIHZvaWQgY2xvc2VBdWRpb1NpbmsoKTsKKworICAgIC8vIHJlLW9wZW4gYXVkaW8gc2luayBhZnRlciBhbGwgcGVuZGluZyBhdWRpbyBidWZmZXJzIHBsYXllZC4KKyAgICB2b2lkIGNoYW5nZUF1ZGlvRm9ybWF0KAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBib29sIG9mZmxvYWRPbmx5LAorICAgICAgICAgICAgYm9vbCBoYXNWaWRlbywKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAorICAgICAgICAgICAgYm9vbCBpc1N0cmVhbWluZywKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KTsKKworICAgIGVudW0geworICAgICAgICBrV2hhdEVPUyAgICAgICAgICAgICAgICAgICAgICA9ICdlb3MgJywKKyAgICAgICAga1doYXRGbHVzaENvbXBsZXRlICAgICAgICAgICAgPSAnZmx1QycsCisgICAgICAgIGtXaGF0UG9zaXRpb24gICAgICAgICAgICAgICAgID0gJ3Bvc2knLAorICAgICAgICBrV2hhdFZpZGVvUmVuZGVyaW5nU3RhcnQgICAgICA9ICd2ZHJkJywKKyAgICAgICAga1doYXRNZWRpYVJlbmRlcmluZ1N0YXJ0ICAgICAgPSAnbWRyZCcsCisgICAgICAgIGtXaGF0QXVkaW9UZWFyRG93biAgICAgICAgICAgID0gJ2FkVEQnLAorICAgICAgICBrV2hhdEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCA9ICdhT1BUJywKKyAgICB9OworCisgICAgZW51bSBBdWRpb1RlYXJEb3duUmVhc29uIHsKKyAgICAgICAga0R1ZVRvRXJyb3IgPSAwLCAgIC8vIENvdWxkIHJlc3RhcnQgd2l0aCBlaXRoZXIgb2ZmbG9hZCBvciBub24tb2ZmbG9hZC4KKyAgICAgICAga0R1ZVRvVGltZW91dCwKKyAgICAgICAga0ZvcmNlTm9uT2ZmbG9hZCwgIC8vIFJlc3RhcnQgb25seSB3aXRoIG5vbi1vZmZsb2FkLgorICAgIH07CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5SZW5kZXJlcigpOworCisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXREcmFpbkF1ZGlvUXVldWUgICAgID0gJ2RyYUEnLAorICAgICAgICBrV2hhdERyYWluVmlkZW9RdWV1ZSAgICAgPSAnZHJhVicsCisgICAgICAgIGtXaGF0UG9zdERyYWluVmlkZW9RdWV1ZSA9ICdwRFZRJywKKyAgICAgICAga1doYXRRdWV1ZUJ1ZmZlciAgICAgICAgID0gJ3F1ZUInLAorICAgICAgICBrV2hhdFF1ZXVlRU9TICAgICAgICAgICAgPSAncUVPUycsCisgICAgICAgIGtXaGF0Q29uZmlnUGxheWJhY2sgICAgICA9ICdjZlBCJywKKyAgICAgICAga1doYXRDb25maWdTeW5jICAgICAgICAgID0gJ2NmU3knLAorICAgICAgICBrV2hhdEdldFBsYXliYWNrU2V0dGluZ3MgPSAnZ1BiUycsCisgICAgICAgIGtXaGF0R2V0U3luY1NldHRpbmdzICAgICA9ICdnU3lTJywKKyAgICAgICAga1doYXRGbHVzaCAgICAgICAgICAgICAgID0gJ2ZsdXMnLAorICAgICAgICBrV2hhdFBhdXNlICAgICAgICAgICAgICAgPSAncGF1cycsCisgICAgICAgIGtXaGF0UmVzdW1lICAgICAgICAgICAgICA9ICdyZXNtJywKKyAgICAgICAga1doYXRPcGVuQXVkaW9TaW5rICAgICAgID0gJ29wbkEnLAorICAgICAgICBrV2hhdENsb3NlQXVkaW9TaW5rICAgICAgPSAnY2xzQScsCisgICAgICAgIGtXaGF0Q2hhbmdlQXVkaW9Gb3JtYXQgICA9ICdjaGdBJywKKyAgICAgICAga1doYXRTdG9wQXVkaW9TaW5rICAgICAgID0gJ3N0cEEnLAorICAgICAgICBrV2hhdERpc2FibGVPZmZsb2FkQXVkaW8gPSAnbm9PQScsCisgICAgICAgIGtXaGF0RW5hYmxlT2ZmbG9hZEF1ZGlvICA9ICdlbk9BJywKKyAgICAgICAga1doYXRTZXRWaWRlb0ZyYW1lUmF0ZSAgID0gJ3NWRlInLAorICAgIH07CisKKyAgICAvLyBpZiBtQnVmZmVyICE9IG51bGxwdHIsIGl0J3MgYSBidWZmZXIgY29udGFpbmluZyByZWFsIGRhdGEuCisgICAgLy8gZWxzZSBpZiBtTm90aWZ5Q29uc3VtZWQgPT0gbnVsbHB0ciwgaXQncyBFT1MuCisgICAgLy8gZWxzZSBpdCdzIGEgdGFnIGZvciByZS1vcGVuaW5nIGF1ZGlvIHNpbmsgaW4gZGlmZmVyZW50IGZvcm1hdC4KKyAgICBzdHJ1Y3QgUXVldWVFbnRyeSB7CisgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IG1CdWZmZXI7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtTWV0YTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnlDb25zdW1lZDsKKyAgICAgICAgc2l6ZV90IG1PZmZzZXQ7CisgICAgICAgIHN0YXR1c190IG1GaW5hbFJlc3VsdDsKKyAgICAgICAgaW50MzJfdCBtQnVmZmVyT3JkaW5hbDsKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01pblBvc2l0aW9uVXBkYXRlRGVsYXlVczsKKworICAgIHNwPE1lZGlhUGxheWVyMkludGVyZmFjZTo6QXVkaW9TaW5rPiBtQXVkaW9TaW5rOworICAgIGJvb2wgbVVzZVZpcnR1YWxBdWRpb1Npbms7CisgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CisgICAgTXV0ZXggbUxvY2s7CisgICAgdWludDMyX3QgbUZsYWdzOworICAgIExpc3Q8UXVldWVFbnRyeT4gbUF1ZGlvUXVldWU7CisgICAgTGlzdDxRdWV1ZUVudHJ5PiBtVmlkZW9RdWV1ZTsKKyAgICB1aW50MzJfdCBtTnVtRnJhbWVzV3JpdHRlbjsKKyAgICBzcDxWaWRlb0ZyYW1lU2NoZWR1bGVyPiBtVmlkZW9TY2hlZHVsZXI7CisKKyAgICBib29sIG1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nOworICAgIGJvb2wgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmc7CisgICAgaW50MzJfdCBtQXVkaW9RdWV1ZUdlbmVyYXRpb247CisgICAgaW50MzJfdCBtVmlkZW9RdWV1ZUdlbmVyYXRpb247CisgICAgaW50MzJfdCBtQXVkaW9EcmFpbkdlbmVyYXRpb247CisgICAgaW50MzJfdCBtVmlkZW9EcmFpbkdlbmVyYXRpb247CisgICAgaW50MzJfdCBtQXVkaW9FT1NHZW5lcmF0aW9uOworCisgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gbU1lZGlhQ2xvY2s7CisgICAgZmxvYXQgbVBsYXliYWNrUmF0ZTsgLy8gYXVkaW8gdHJhY2sgcmF0ZQorCisgICAgQXVkaW9QbGF5YmFja1JhdGUgbVBsYXliYWNrU2V0dGluZ3M7CisgICAgQVZTeW5jU2V0dGluZ3MgbVN5bmNTZXR0aW5nczsKKyAgICBmbG9hdCBtVmlkZW9GcHNIaW50OworCisgICAgaW50NjRfdCBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzOworICAgIGludDY0X3QgbUFuY2hvclRpbWVNZWRpYVVzOworICAgIGludDY0X3QgbUFuY2hvck51bUZyYW1lc1dyaXR0ZW47CisgICAgaW50NjRfdCBtVmlkZW9MYXRlQnlVczsKKyAgICBpbnQ2NF90IG1OZXh0VmlkZW9UaW1lTWVkaWFVczsKKyAgICBib29sIG1IYXNBdWRpbzsKKyAgICBib29sIG1IYXNWaWRlbzsKKworICAgIGJvb2wgbU5vdGlmeUNvbXBsZXRlQXVkaW87CisgICAgYm9vbCBtTm90aWZ5Q29tcGxldGVWaWRlbzsKKworICAgIGJvb2wgbVN5bmNRdWV1ZXM7CisKKyAgICAvLyBtb2RpZmllZCBvbiBvbmx5IHJlbmRlcmVyJ3MgdGhyZWFkLgorICAgIGJvb2wgbVBhdXNlZDsKKyAgICBpbnQ2NF90IG1QYXVzZURyYWluQXVkaW9BbGxvd2VkVXM7IC8vIHRpbWUgd2hlbiB3ZSBjYW4gZHJhaW4vZGVsaXZlciBhdWRpbyBpbiBwYXVzZSBtb2RlLgorCisgICAgYm9vbCBtVmlkZW9TYW1wbGVSZWNlaXZlZDsKKyAgICBib29sIG1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQ7CisgICAgaW50MzJfdCBtVmlkZW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb247CisgICAgaW50MzJfdCBtQXVkaW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb247CisgICAgYm9vbCBtUmVuZGVyaW5nRGF0YURlbGl2ZXJlZDsKKworICAgIGludDY0X3QgbU5leHRBdWRpb0Nsb2NrVXBkYXRlVGltZVVzOworICAgIC8vIHRoZSBtZWRpYSB0aW1lc3RhbXAgb2YgbGFzdCBhdWRpbyBzYW1wbGUgcmlnaHQgYmVmb3JlIEVPUy4KKyAgICBpbnQ2NF90IG1MYXN0QXVkaW9NZWRpYVRpbWVVczsKKworICAgIGludDMyX3QgbUF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dEdlbmVyYXRpb247CisgICAgYm9vbCBtQXVkaW9Ub3JuRG93bjsKKyAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBtQ3VycmVudE9mZmxvYWRJbmZvOworCisgICAgc3RydWN0IFBjbUluZm8geworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtQ2hhbm5lbE1hc2s7CisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG1GbGFnczsKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgbUZvcm1hdDsKKyAgICAgICAgaW50MzJfdCBtTnVtQ2hhbm5lbHM7CisgICAgICAgIGludDMyX3QgbVNhbXBsZVJhdGU7CisgICAgfTsKKyAgICBQY21JbmZvIG1DdXJyZW50UGNtSW5mbzsKKyAgICBzdGF0aWMgY29uc3QgUGNtSW5mbyBBVURJT19QQ01JTkZPX0lOSVRJQUxJWkVSOworCisgICAgaW50MzJfdCBtVG90YWxCdWZmZXJzUXVldWVkOworICAgIGludDMyX3QgbUxhc3RBdWRpb0J1ZmZlckRyYWluZWQ7CisgICAgYm9vbCBtVXNlQXVkaW9DYWxsYmFjazsKKworICAgIHNwPEpXYWtlTG9jaz4gbVdha2VMb2NrOworCisgICAgc3RhdHVzX3QgZ2V0Q3VycmVudFBvc2l0aW9uT25Mb29wZXIoaW50NjRfdCAqbWVkaWFVcyk7CisgICAgc3RhdHVzX3QgZ2V0Q3VycmVudFBvc2l0aW9uT25Mb29wZXIoCisgICAgICAgICAgICBpbnQ2NF90ICptZWRpYVVzLCBpbnQ2NF90IG5vd1VzLCBib29sIGFsbG93UGFzdFF1ZXVlZFZpZGVvID0gZmFsc2UpOworICAgIGJvb2wgZ2V0Q3VycmVudFBvc2l0aW9uSWZQYXVzZWRfbChpbnQ2NF90ICptZWRpYVVzKTsKKyAgICBzdGF0dXNfdCBnZXRDdXJyZW50UG9zaXRpb25Gcm9tQW5jaG9yKAorICAgICAgICAgICAgaW50NjRfdCAqbWVkaWFVcywgaW50NjRfdCBub3dVcywgYm9vbCBhbGxvd1Bhc3RRdWV1ZWRWaWRlbyA9IGZhbHNlKTsKKworICAgIHZvaWQgbm90aWZ5RU9TQ2FsbGJhY2soKTsKKyAgICBzaXplX3QgZmlsbEF1ZGlvQnVmZmVyKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOworCisgICAgYm9vbCBvbkRyYWluQXVkaW9RdWV1ZSgpOworICAgIHZvaWQgZHJhaW5BdWRpb1F1ZXVlVW50aWxMYXN0RU9TKCk7CisgICAgaW50NjRfdCBnZXRQZW5kaW5nQXVkaW9QbGF5b3V0RHVyYXRpb25VcyhpbnQ2NF90IG5vd1VzKTsKKyAgICB2b2lkIHBvc3REcmFpbkF1ZGlvUXVldWVfbChpbnQ2NF90IGRlbGF5VXMgPSAwKTsKKworICAgIHZvaWQgY2xlYXJBbmNob3JUaW1lKCk7CisgICAgdm9pZCBjbGVhckF1ZGlvRmlyc3RBbmNob3JUaW1lX2woKTsKKyAgICB2b2lkIHNldEF1ZGlvRmlyc3RBbmNob3JUaW1lSWZOZWVkZWRfbChpbnQ2NF90IG1lZGlhVXMpOworICAgIHZvaWQgc2V0VmlkZW9MYXRlQnlVcyhpbnQ2NF90IGxhdGVVcyk7CisKKyAgICB2b2lkIG9uTmV3QXVkaW9NZWRpYVRpbWUoaW50NjRfdCBtZWRpYVRpbWVVcyk7CisgICAgaW50NjRfdCBnZXRSZWFsVGltZVVzKGludDY0X3QgbWVkaWFUaW1lVXMsIGludDY0X3Qgbm93VXMpOworCisgICAgdm9pZCBvbkRyYWluVmlkZW9RdWV1ZSgpOworICAgIHZvaWQgcG9zdERyYWluVmlkZW9RdWV1ZSgpOworCisgICAgdm9pZCBwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydF9sKCk7CisgICAgdm9pZCBub3RpZnlJZk1lZGlhUmVuZGVyaW5nU3RhcnRlZF9sKCk7CisKKyAgICB2b2lkIG9uUXVldWVCdWZmZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgb25RdWV1ZUVPUyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBvbkZsdXNoKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIG9uQXVkaW9TaW5rQ2hhbmdlZCgpOworICAgIHZvaWQgb25EaXNhYmxlT2ZmbG9hZEF1ZGlvKCk7CisgICAgdm9pZCBvbkVuYWJsZU9mZmxvYWRBdWRpbygpOworICAgIHN0YXR1c190IG9uQ29uZmlnUGxheWJhY2soY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUgLyogc2FuaXRpemVkICovKTsKKyAgICBzdGF0dXNfdCBvbkdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUgLyogbm9ubnVsbCAqLyk7CisgICAgc3RhdHVzX3Qgb25Db25maWdTeW5jKGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpOworICAgIHN0YXR1c190IG9uR2V0U3luY1NldHRpbmdzKEFWU3luY1NldHRpbmdzICpzeW5jIC8qIG5vbm51bGwgKi8sIGZsb2F0ICp2aWRlb0ZwcyAvKiBub25udWxsICovKTsKKworICAgIHZvaWQgb25QYXVzZSgpOworICAgIHZvaWQgb25SZXN1bWUoKTsKKyAgICB2b2lkIG9uU2V0VmlkZW9GcmFtZVJhdGUoZmxvYXQgZnBzKTsKKyAgICBpbnQzMl90IGdldFF1ZXVlR2VuZXJhdGlvbihib29sIGF1ZGlvKTsKKyAgICBpbnQzMl90IGdldERyYWluR2VuZXJhdGlvbihib29sIGF1ZGlvKTsKKyAgICBib29sIGdldFN5bmNRdWV1ZXMoKTsKKyAgICB2b2lkIG9uQXVkaW9UZWFyRG93bihBdWRpb1RlYXJEb3duUmVhc29uIHJlYXNvbik7CisgICAgc3RhdHVzX3Qgb25PcGVuQXVkaW9TaW5rKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBib29sIG9mZmxvYWRPbmx5LAorICAgICAgICAgICAgYm9vbCBoYXNWaWRlbywKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAorICAgICAgICAgICAgYm9vbCBpc1N0cmVhbWluZyk7CisgICAgdm9pZCBvbkNsb3NlQXVkaW9TaW5rKCk7CisgICAgdm9pZCBvbkNoYW5nZUF1ZGlvRm9ybWF0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbWV0YSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOworCisgICAgdm9pZCBub3RpZnlFT1MoYm9vbCBhdWRpbywgc3RhdHVzX3QgZmluYWxSZXN1bHQsIGludDY0X3QgZGVsYXlVcyA9IDApOworICAgIHZvaWQgbm90aWZ5RU9TX2woYm9vbCBhdWRpbywgc3RhdHVzX3QgZmluYWxSZXN1bHQsIGludDY0X3QgZGVsYXlVcyA9IDApOworICAgIHZvaWQgbm90aWZ5Rmx1c2hDb21wbGV0ZShib29sIGF1ZGlvKTsKKyAgICB2b2lkIG5vdGlmeVBvc2l0aW9uKCk7CisgICAgdm9pZCBub3RpZnlWaWRlb0xhdGVCeShpbnQ2NF90IGxhdGVCeVVzKTsKKyAgICB2b2lkIG5vdGlmeVZpZGVvUmVuZGVyaW5nU3RhcnQoKTsKKyAgICB2b2lkIG5vdGlmeUF1ZGlvVGVhckRvd24oQXVkaW9UZWFyRG93blJlYXNvbiByZWFzb24pOworCisgICAgdm9pZCBmbHVzaFF1ZXVlKExpc3Q8UXVldWVFbnRyeT4gKnF1ZXVlKTsKKyAgICBib29sIGRyb3BCdWZmZXJJZlN0YWxlKGJvb2wgYXVkaW8sIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIHN5bmNRdWV1ZXNEb25lX2woKTsKKworICAgIGJvb2wgb2ZmbG9hZGluZ0F1ZGlvKCkgY29uc3QgeyByZXR1cm4gKG1GbGFncyAmIEZMQUdfT0ZGTE9BRF9BVURJTykgIT0gMDsgfQorCisgICAgdm9pZCBzdGFydEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCgpOworICAgIHZvaWQgY2FuY2VsQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0KCk7CisKKyAgICBpbnQ2NF90IGdldER1cmF0aW9uVXNJZlBsYXllZEF0U2FtcGxlUmF0ZSh1aW50MzJfdCBudW1GcmFtZXMpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmVuZGVyZXIpOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE5VUExBWUVSMl9SRU5ERVJFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYyMjM1ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyU291cmNlLmgKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTlVQTEFZRVIyX1NPVVJDRV9IXworCisjZGVmaW5lIE5VUExBWUVSMl9TT1VSQ0VfSF8KKworI2luY2x1ZGUgIk51UGxheWVyMi5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBQnVmZmVyOworc3RydWN0IEFNZWRpYUNyeXB0b1dyYXBwZXI7CitjbGFzcyBNZWRpYUJ1ZmZlcjsKKworc3RydWN0IE51UGxheWVyMjo6U291cmNlIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICBlbnVtIEZsYWdzIHsKKyAgICAgICAgRkxBR19DQU5fUEFVU0UgICAgICAgICAgPSAxLAorICAgICAgICBGTEFHX0NBTl9TRUVLX0JBQ0tXQVJEICA9IDIsICAvLyB0aGUgIjEwIHNlYyBiYWNrIGJ1dHRvbiIKKyAgICAgICAgRkxBR19DQU5fU0VFS19GT1JXQVJEICAgPSA0LCAgLy8gdGhlICIxMCBzZWMgZm9yd2FyZCBidXR0b24iCisgICAgICAgIEZMQUdfQ0FOX1NFRUsgICAgICAgICAgID0gOCwgIC8vIHRoZSAic2VlayBiYXIiCisgICAgICAgIEZMQUdfRFlOQU1JQ19EVVJBVElPTiAgID0gMTYsCisgICAgICAgIEZMQUdfU0VDVVJFICAgICAgICAgICAgID0gMzIsIC8vIFNlY3VyZSBjb2RlYyBpcyByZXF1aXJlZC4KKyAgICAgICAgRkxBR19QUk9URUNURUQgICAgICAgICAgPSA2NCwgLy8gVGhlIHNjcmVlbiBuZWVkcyB0byBiZSBwcm90ZWN0ZWQgKHNjcmVlbnNob3QgaXMgZGlzYWJsZWQpLgorICAgIH07CisKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRQcmVwYXJlZCwKKyAgICAgICAga1doYXRGbGFnc0NoYW5nZWQsCisgICAgICAgIGtXaGF0VmlkZW9TaXplQ2hhbmdlZCwKKyAgICAgICAga1doYXRCdWZmZXJpbmdVcGRhdGUsCisgICAgICAgIGtXaGF0UGF1c2VPbkJ1ZmZlcmluZ1N0YXJ0LAorICAgICAgICBrV2hhdFJlc3VtZU9uQnVmZmVyaW5nRW5kLAorICAgICAgICBrV2hhdENhY2hlU3RhdHMsCisgICAgICAgIGtXaGF0U3VidGl0bGVEYXRhLAorICAgICAgICBrV2hhdFRpbWVkVGV4dERhdGEsCisgICAgICAgIGtXaGF0VGltZWRNZXRhRGF0YSwKKyAgICAgICAga1doYXRRdWV1ZURlY29kZXJTaHV0ZG93biwKKyAgICAgICAga1doYXREcm1Ob0xpY2Vuc2UsCisgICAgICAgIC8vIE1vZHVsYXIgRFJNCisgICAgICAgIGtXaGF0RHJtSW5mbywKKyAgICB9OworCisgICAgLy8gVGhlIHByb3ZpZGVzIG1lc3NhZ2UgaXMgdXNlZCB0byBub3RpZnkgdGhlIHBsYXllciBhYm91dCB2YXJpb3VzCisgICAgLy8gZXZlbnRzLgorICAgIGV4cGxpY2l0IFNvdXJjZShjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSkKKyAgICAgICAgOiBtTm90aWZ5KG5vdGlmeSkgeworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyaW5nU2V0dGluZ3MoCisgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHN0b3AoKSB7fQorICAgIHZpcnR1YWwgdm9pZCBwYXVzZSgpIHt9CisgICAgdmlydHVhbCB2b2lkIHJlc3VtZSgpIHt9CisKKyAgICAvLyBFeHBsaWNpdGx5IGRpc2Nvbm5lY3QgdGhlIHVuZGVybGluZyBkYXRhIHNvdXJjZQorICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCkge30KKworICAgIC8vIFJldHVybnMgT0sgaWZmIG1vcmUgZGF0YSB3YXMgYXZhaWxhYmxlLAorICAgIC8vIGFuIGVycm9yIG9yIEVSUk9SX0VORF9PRl9TVFJFQU0gaWYgbm90LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZmVlZE1vcmVUU0RhdGEoKSA9IDA7CisKKyAgICAvLyBSZXR1cm5zIG5vbi1OVUxMIGZvcm1hdCB3aGVuIHRoZSBzcGVjaWZpZWQgdHJhY2sgZXhpc3RzLgorICAgIC8vIFdoZW4gdGhlIGZvcm1hdCBoYXMgImVyciIgc2V0IHRvIC1FV09VTERCTE9DSywgc291cmNlIG5lZWRzIG1vcmUgdGltZSB0byBnZXQgdmFsaWQgbWV0YSBkYXRhLgorICAgIC8vIFJldHVybnMgTlVMTCBpZiB0aGUgc3BlY2lmaWVkIHRyYWNrIGRvZXNuJ3QgZXhpc3Qgb3IgaXMgaW52YWxpZDsKKyAgICB2aXJ0dWFsIHNwPEFNZXNzYWdlPiBnZXRGb3JtYXQoYm9vbCBhdWRpbyk7CisKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXRNZXRhKGJvb2wgLyogYXVkaW8gKi8pIHsgcmV0dXJuIE5VTEw7IH0KKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGaWxlRm9ybWF0TWV0YSgpIGNvbnN0IHsgcmV0dXJuIE5VTEw7IH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVxdWV1ZUFjY2Vzc1VuaXQoCisgICAgICAgICAgICBib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREdXJhdGlvbihpbnQ2NF90ICogLyogZHVyYXRpb25VcyAqLykgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgdmlydHVhbCBzaXplX3QgZ2V0VHJhY2tDb3VudCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdmlydHVhbCBzcDxBTWVzc2FnZT4gZ2V0VHJhY2tJbmZvKHNpemVfdCAvKiB0cmFja0luZGV4ICovKSBjb25zdCB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHZpcnR1YWwgc3NpemVfdCBnZXRTZWxlY3RlZFRyYWNrKG1lZGlhX3RyYWNrX3R5cGUgLyogdHlwZSAqLykgY29uc3QgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgLyogdHJhY2tJbmRleCAqLywgYm9vbCAvKiBzZWxlY3QgKi8sIGludDY0X3QgLyogdGltZVVzKi8pIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2Vla1RvKAorICAgICAgICAgICAgaW50NjRfdCAvKiBzZWVrVGltZVVzICovLAorICAgICAgICAgICAgTWVkaWFQbGF5ZXIyU2Vla01vZGUgLyogbW9kZSAqLyA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBpc1JlYWxUaW1lKCkgY29uc3QgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGlzU3RyZWFtaW5nKCkgY29uc3QgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0T2ZmbG9hZEF1ZGlvKGJvb2wgLyogb2ZmbG9hZCAqLykge30KKworICAgIC8vIE1vZHVsYXIgRFJNCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlRHJtKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAvKiB1dWlkICovWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICYgLyogZHJtU2Vzc2lvbklkICovLAorICAgICAgICAgICAgc3A8QU1lZGlhQ3J5cHRvV3JhcHBlcj4gKiAvKiBjcnlwdG8gKi8pIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZURybSgpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflNvdXJjZSgpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCisgICAgc3A8QU1lc3NhZ2U+IGR1cE5vdGlmeSgpIGNvbnN0IHsgcmV0dXJuIG1Ob3RpZnktPmR1cCgpOyB9CisKKyAgICB2b2lkIG5vdGlmeUZsYWdzQ2hhbmdlZCh1aW50MzJfdCBmbGFncyk7CisgICAgdm9pZCBub3RpZnlWaWRlb1NpemVDaGFuZ2VkKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0ID0gTlVMTCk7CisgICAgdm9pZCBub3RpZnlQcmVwYXJlZChzdGF0dXNfdCBlcnIgPSBPSyk7CisgICAgLy8gTW9kdWxhciBEUk0KKyAgICB2b2lkIG5vdGlmeURybUluZm8oY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisKK3ByaXZhdGU6CisgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb3VyY2UpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBOVVBMQVlFUjJfU09VUkNFX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvUlRTUFNvdXJjZTIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9SVFNQU291cmNlMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRmZTM4MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvUlRTUFNvdXJjZTIuY3BwCkBAIC0wLDAgKzEsOTAyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlJUU1BTb3VyY2UyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiUlRTUFNvdXJjZTIuaCIKKworI2luY2x1ZGUgIkFub3RoZXJQYWNrZXRTb3VyY2UuaCIKKyNpbmNsdWRlICJNeUhhbmRsZXIuaCIKKyNpbmNsdWRlICJTRFBMb2FkZXIuaCIKKworI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0IGludDY0X3Qga05lYXJFT1NUaW1lb3V0VXMgPSAyMDAwMDAwbGw7IC8vIDIgc2VjcworCisvLyBEZWZhdWx0IEJ1ZmZlciBVbmRlcmZsb3cvUHJlcGFyZS9TdGFydFNlcnZlci9PdmVyZmxvdyBNYXJrcworc3RhdGljIGNvbnN0IGludCBrVW5kZXJmbG93TWFya01zICAgPSAgMTAwMDsgIC8vIDEgc2Vjb25kCitzdGF0aWMgY29uc3QgaW50IGtQcmVwYXJlTWFya01zICAgICA9ICAzMDAwOyAgLy8gMyBzZWNvbmRzCisvL3N0YXRpYyBjb25zdCBpbnQga1N0YXJ0U2VydmVyTWFya01zID0gIDUwMDA7CitzdGF0aWMgY29uc3QgaW50IGtPdmVyZmxvd01hcmtNcyAgICA9IDEwMDAwOyAgLy8gMTAgc2Vjb25kcworCitOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpSVFNQU291cmNlMigKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKKyAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICBib29sIGlzU0RQKQorICAgIDogU291cmNlKG5vdGlmeSksCisgICAgICBtSFRUUFNlcnZpY2UoaHR0cFNlcnZpY2UpLAorICAgICAgbVVSTCh1cmwpLAorICAgICAgbVVJRCh1aWQpLAorICAgICAgbUZsYWdzKDApLAorICAgICAgbUlzU0RQKGlzU0RQKSwKKyAgICAgIG1TdGF0ZShESVNDT05ORUNURUQpLAorICAgICAgbUZpbmFsUmVzdWx0KE9LKSwKKyAgICAgIG1EaXNjb25uZWN0UmVwbHlJRCgwKSwKKyAgICAgIG1CdWZmZXJpbmcoZmFsc2UpLAorICAgICAgbUluUHJlcGFyYXRpb25QaGFzZSh0cnVlKSwKKyAgICAgIG1FT1NQZW5kaW5nKGZhbHNlKSwKKyAgICAgIG1TZWVrR2VuZXJhdGlvbigwKSwKKyAgICAgIG1FT1NUaW1lb3V0QXVkaW8oMCksCisgICAgICBtRU9TVGltZW91dFZpZGVvKDApIHsKKyAgICBtQnVmZmVyaW5nU2V0dGluZ3MubUluaXRpYWxNYXJrTXMgPSBrUHJlcGFyZU1hcmtNczsKKyAgICBtQnVmZmVyaW5nU2V0dGluZ3MubVJlc3VtZVBsYXliYWNrTWFya01zID0ga092ZXJmbG93TWFya01zOworICAgIGlmIChoZWFkZXJzKSB7CisgICAgICAgIG1FeHRyYUhlYWRlcnMgPSAqaGVhZGVyczsKKworICAgICAgICBzc2l6ZV90IGluZGV4ID0KKyAgICAgICAgICAgIG1FeHRyYUhlYWRlcnMuaW5kZXhPZktleShTdHJpbmc4KCJ4LWhpZGUtdXJscy1mcm9tLWxvZyIpKTsKKworICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnSW5jb2duaXRvOworCisgICAgICAgICAgICBtRXh0cmFIZWFkZXJzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgICAgICB9CisgICAgfQorfQorCitOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjp+UlRTUFNvdXJjZTIoKSB7CisgICAgaWYgKG1Mb29wZXIgIT0gTlVMTCkgeworICAgICAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihpZCgpKTsKKyAgICAgICAgbUxvb3Blci0+c3RvcCgpOworICAgIH0KK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6Z2V0QnVmZmVyaW5nU2V0dGluZ3MoCisgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUJ1ZmZlcmluZ1NldHRpbmdzTG9jayk7CisgICAgKmJ1ZmZlcmluZyA9IG1CdWZmZXJpbmdTZXR0aW5nczsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6UlRTUFNvdXJjZTI6OnNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUJ1ZmZlcmluZ1NldHRpbmdzTG9jayk7CisgICAgbUJ1ZmZlcmluZ1NldHRpbmdzID0gYnVmZmVyaW5nOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpwcmVwYXJlQXN5bmMoKSB7CisgICAgaWYgKG1Jc1NEUCAmJiBtSFRUUFNlcnZpY2UgPT0gTlVMTCkgeworICAgICAgICBub3RpZnlQcmVwYXJlZChCQURfVkFMVUUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1Mb29wZXIgPT0gTlVMTCkgeworICAgICAgICBtTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgICAgIG1Mb29wZXItPnNldE5hbWUoInJ0c3AiKTsKKyAgICAgICAgbUxvb3Blci0+c3RhcnQoKTsKKworICAgICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIodGhpcyk7CisgICAgfQorCisgICAgQ0hFQ0sobUhhbmRsZXIgPT0gTlVMTCk7CisgICAgQ0hFQ0sobVNEUExvYWRlciA9PSBOVUxMKTsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXROb3RpZnksIHRoaXMpOworCisgICAgQ0hFQ0tfRVEobVN0YXRlLCAoaW50KURJU0NPTk5FQ1RFRCk7CisgICAgbVN0YXRlID0gQ09OTkVDVElORzsKKworICAgIGlmIChtSXNTRFApIHsKKyAgICAgICAgbVNEUExvYWRlciA9IG5ldyBTRFBMb2FkZXIobm90aWZ5LAorICAgICAgICAgICAgICAgIChtRmxhZ3MgJiBrRmxhZ0luY29nbml0bykgPyBTRFBMb2FkZXI6OmtGbGFnSW5jb2duaXRvIDogMCwKKyAgICAgICAgICAgICAgICBtSFRUUFNlcnZpY2UpOworCisgICAgICAgIG1TRFBMb2FkZXItPmxvYWQoCisgICAgICAgICAgICAgICAgbVVSTC5jX3N0cigpLCBtRXh0cmFIZWFkZXJzLmlzRW1wdHkoKSA/IE5VTEwgOiAmbUV4dHJhSGVhZGVycyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUhhbmRsZXIgPSBuZXcgTXlIYW5kbGVyKG1VUkwuY19zdHIoKSwgbm90aWZ5LCB0cnVlIC8qIHVpZFZhbGlkICovLCBtVUlEKTsKKyAgICAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyKTsKKworICAgICAgICBtSGFuZGxlci0+Y29ubmVjdCgpOworICAgIH0KKworICAgIHN0YXJ0QnVmZmVyaW5nSWZOZWNlc3NhcnkoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpzdGFydCgpIHsKK30KKwordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpzdG9wKCkgeworICAgIGlmIChtTG9vcGVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RGlzY29ubmVjdCwgdGhpcyk7CisKKyAgICBzcDxBTWVzc2FnZT4gZHVtbXk7CisgICAgbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmZHVtbXkpOworfQorCitzdGF0dXNfdCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpmZWVkTW9yZVRTRGF0YSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUJ1ZmZlcmluZ0xvY2spOworICAgIHJldHVybiBtRmluYWxSZXN1bHQ7Cit9CisKK3NwPE1ldGFEYXRhPiBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpnZXRGb3JtYXRNZXRhKGJvb2wgYXVkaW8pIHsKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2UgPSBnZXRTb3VyY2UoYXVkaW8pOworCisgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBzb3VyY2UtPmdldEZvcm1hdCgpOworfQorCitib29sIE51UGxheWVyMjo6UlRTUFNvdXJjZTI6OmhhdmVTdWZmaWNpZW50RGF0YU9uQWxsVHJhY2tzKCkgeworICAgIC8vIFdlJ3JlIGdvaW5nIHRvIGJ1ZmZlciBhdCBsZWFzdCAyIHNlY3Mgd29ydGggZGF0YSBvbiBhbGwgdHJhY2tzIGJlZm9yZQorICAgIC8vIHN0YXJ0aW5nIHBsYXliYWNrIChib3RoIGF0IHN0YXJ0dXAgYW5kIGFmdGVyIGEgc2VlaykuCisKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWluRHVyYXRpb25VcyA9IDIwMDAwMDBsbDsKKworICAgIGludDY0X3QgbWVkaWFEdXJhdGlvblVzID0gMDsKKyAgICBnZXREdXJhdGlvbigmbWVkaWFEdXJhdGlvblVzKTsKKyAgICBpZiAoKG1BdWRpb1RyYWNrICE9IE5VTEwgJiYgbUF1ZGlvVHJhY2stPmlzRmluaXNoZWQobWVkaWFEdXJhdGlvblVzKSkKKyAgICAgICAgICAgIHx8IChtVmlkZW9UcmFjayAhPSBOVUxMICYmIG1WaWRlb1RyYWNrLT5pc0ZpbmlzaGVkKG1lZGlhRHVyYXRpb25VcykpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHN0YXR1c190IGVycjsKKyAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgaWYgKG1BdWRpb1RyYWNrICE9IE5VTEwKKyAgICAgICAgICAgICYmIChkdXJhdGlvblVzID0gbUF1ZGlvVHJhY2stPmdldEJ1ZmZlcmVkRHVyYXRpb25VcygmZXJyKSkKKyAgICAgICAgICAgICAgICAgICAgPCBrTWluRHVyYXRpb25VcworICAgICAgICAgICAgJiYgZXJyID09IE9LKSB7CisgICAgICAgIEFMT0dWKCJhdWRpbyB0cmFjayBkb2Vzbid0IGhhdmUgZW5vdWdoIGRhdGEgeWV0LiAoJS4yZiBzZWNzIGJ1ZmZlcmVkKSIsCisgICAgICAgICAgICAgIGR1cmF0aW9uVXMgLyAxRTYpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1WaWRlb1RyYWNrICE9IE5VTEwKKyAgICAgICAgICAgICYmIChkdXJhdGlvblVzID0gbVZpZGVvVHJhY2stPmdldEJ1ZmZlcmVkRHVyYXRpb25VcygmZXJyKSkKKyAgICAgICAgICAgICAgICAgICAgPCBrTWluRHVyYXRpb25VcworICAgICAgICAgICAgJiYgZXJyID09IE9LKSB7CisgICAgICAgIEFMT0dWKCJ2aWRlbyB0cmFjayBkb2Vzbid0IGhhdmUgZW5vdWdoIGRhdGEgeWV0LiAoJS4yZiBzZWNzIGJ1ZmZlcmVkKSIsCisgICAgICAgICAgICAgIGR1cmF0aW9uVXMgLyAxRTYpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6UlRTUFNvdXJjZTI6OmRlcXVldWVBY2Nlc3NVbml0KAorICAgICAgICBib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCkgeworICAgIGlmICghc3RvcEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5KCkpIHsKKyAgICAgICAgcmV0dXJuIC1FV09VTERCTE9DSzsKKyAgICB9CisKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2UgPSBnZXRTb3VyY2UoYXVkaW8pOworCisgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRVdPVUxEQkxPQ0s7CisgICAgfQorCisgICAgc3RhdHVzX3QgZmluYWxSZXN1bHQ7CisgICAgaWYgKCFzb3VyY2UtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpKSB7CisgICAgICAgIGlmIChmaW5hbFJlc3VsdCA9PSBPSykgeworCisgICAgICAgICAgICAvLyBJZiBvdGhlciBzb3VyY2UgYWxyZWFkeSBzaWduYWxlZCBFT1MsIHRoaXMgc291cmNlIHNob3VsZCBhbHNvIHJldHVybiBFT1MKKyAgICAgICAgICAgIGlmIChzb3VyY2VSZWFjaGVkRU9TKCFhdWRpbykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgdGhpcyBzb3VyY2UgaGFzIGRldGVjdGVkIG5lYXIgZW5kLCBnaXZlIGl0IHNvbWUgdGltZSB0byByZXRyaWV2ZSBtb3JlCisgICAgICAgICAgICAvLyBkYXRhIGJlZm9yZSByZXR1cm5pbmcgRU9TCisgICAgICAgICAgICBpbnQ2NF90IG1lZGlhRHVyYXRpb25VcyA9IDA7CisgICAgICAgICAgICBnZXREdXJhdGlvbigmbWVkaWFEdXJhdGlvblVzKTsKKyAgICAgICAgICAgIGlmIChzb3VyY2UtPmlzRmluaXNoZWQobWVkaWFEdXJhdGlvblVzKSkgeworICAgICAgICAgICAgICAgIGludDY0X3QgZW9zVGltZW91dCA9IGF1ZGlvID8gbUVPU1RpbWVvdXRBdWRpbyA6IG1FT1NUaW1lb3V0VmlkZW87CisgICAgICAgICAgICAgICAgaWYgKGVvc1RpbWVvdXQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBzZXRFT1NUaW1lb3V0KGF1ZGlvLCBBTG9vcGVyOjpHZXROb3dVcygpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChBTG9vcGVyOjpHZXROb3dVcygpIC0gZW9zVGltZW91dCkgPiBrTmVhckVPU1RpbWVvdXRVcykgeworICAgICAgICAgICAgICAgICAgICBzZXRFT1NUaW1lb3V0KGF1ZGlvLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiAtRVdPVUxEQkxPQ0s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghc291cmNlTmVhckVPUyghYXVkaW8pKSB7CisgICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIG5vdCBlbnRlciBidWZmZXJpbmcgbW9kZQorICAgICAgICAgICAgICAgIC8vIGlmIGFueSBvZiB0aGUgc291cmNlcyBhbHJlYWR5IGhhdmUgZGV0ZWN0ZWQgRU9TLgorICAgICAgICAgICAgICAgIHN0YXJ0QnVmZmVyaW5nSWZOZWNlc3NhcnkoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIC1FV09VTERCTE9DSzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmluYWxSZXN1bHQ7CisgICAgfQorCisgICAgc2V0RU9TVGltZW91dChhdWRpbywgMCk7CisKKyAgICByZXR1cm4gc291cmNlLT5kZXF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKK30KKworc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6Z2V0U291cmNlKGJvb2wgYXVkaW8pIHsKKyAgICBpZiAobVRTUGFyc2VyICE9IE5VTEwpIHsKKyAgICAgICAgc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSA9IG1UU1BhcnNlci0+Z2V0U291cmNlKAorICAgICAgICAgICAgICAgIGF1ZGlvID8gQVRTUGFyc2VyOjpBVURJTyA6IEFUU1BhcnNlcjo6VklERU8pOworCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxBbm90aGVyUGFja2V0U291cmNlICo+KHNvdXJjZS5nZXQoKSk7CisgICAgfQorCisgICAgcmV0dXJuIGF1ZGlvID8gbUF1ZGlvVHJhY2sgOiBtVmlkZW9UcmFjazsKK30KKwordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpzZXRFT1NUaW1lb3V0KGJvb2wgYXVkaW8sIGludDY0X3QgdGltZW91dCkgeworICAgIGlmIChhdWRpbykgeworICAgICAgICBtRU9TVGltZW91dEF1ZGlvID0gdGltZW91dDsKKyAgICB9IGVsc2UgeworICAgICAgICBtRU9TVGltZW91dFZpZGVvID0gdGltZW91dDsKKyAgICB9Cit9CisKK3N0YXR1c190IE51UGxheWVyMjo6UlRTUFNvdXJjZTI6OmdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpIHsKKyAgICAqZHVyYXRpb25VcyA9IC0xbGw7CisKKyAgICBpbnQ2NF90IGF1ZGlvRHVyYXRpb25VczsKKyAgICBpZiAobUF1ZGlvVHJhY2sgIT0gTlVMTAorICAgICAgICAgICAgJiYgbUF1ZGlvVHJhY2stPmdldEZvcm1hdCgpLT5maW5kSW50NjQoCisgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAmYXVkaW9EdXJhdGlvblVzKQorICAgICAgICAgICAgJiYgYXVkaW9EdXJhdGlvblVzID4gKmR1cmF0aW9uVXMpIHsKKyAgICAgICAgKmR1cmF0aW9uVXMgPSBhdWRpb0R1cmF0aW9uVXM7CisgICAgfQorCisgICAgaW50NjRfdCB2aWRlb0R1cmF0aW9uVXM7CisgICAgaWYgKG1WaWRlb1RyYWNrICE9IE5VTEwKKyAgICAgICAgICAgICYmIG1WaWRlb1RyYWNrLT5nZXRGb3JtYXQoKS0+ZmluZEludDY0KAorICAgICAgICAgICAgICAgIGtLZXlEdXJhdGlvbiwgJnZpZGVvRHVyYXRpb25VcykKKyAgICAgICAgICAgICYmIHZpZGVvRHVyYXRpb25VcyA+ICpkdXJhdGlvblVzKSB7CisgICAgICAgICpkdXJhdGlvblVzID0gdmlkZW9EdXJhdGlvblVzOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6c2Vla1RvKGludDY0X3Qgc2Vla1RpbWVVcywgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQZXJmb3JtU2VlaywgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsICsrbVNlZWtHZW5lcmF0aW9uKTsKKyAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCBzZWVrVGltZVVzKTsKKyAgICBtc2ctPnNldEludDMyKCJtb2RlIiwgbW9kZSk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKwordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpwZXJmb3JtU2VlayhpbnQ2NF90IHNlZWtUaW1lVXMpIHsKKyAgICBpZiAobVN0YXRlICE9IENPTk5FQ1RFRCkgeworICAgICAgICBmaW5pc2hTZWVrKElOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1TdGF0ZSA9IFNFRUtJTkc7CisgICAgbUhhbmRsZXItPnNlZWsoc2Vla1RpbWVVcyk7CisgICAgbUVPU1BlbmRpbmcgPSBmYWxzZTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBvbGxCdWZmZXJpbmcsIHRoaXMpOworICAgIG1zZy0+cG9zdCgxMDAwMDAwbGwpOyAvLyAxIHNlY29uZCBpbnRlcnZhbHMKK30KKwordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpjaGVja0J1ZmZlcmluZygKKyAgICAgICAgYm9vbCAqcHJlcGFyZWQsIGJvb2wgKnVuZGVyZmxvdywgYm9vbCAqb3ZlcmZsb3csIGJvb2wgKnN0YXJ0U2VydmVyLCBib29sICpmaW5pc2hlZCkgeworICAgIHNpemVfdCBudW1UcmFja3MgPSBtVHJhY2tzLnNpemUoKTsKKyAgICBzaXplX3QgcHJlcGFyZWRDb3VudCwgdW5kZXJmbG93Q291bnQsIG92ZXJmbG93Q291bnQsIHN0YXJ0Q291bnQsIGZpbmlzaGVkQ291bnQ7CisgICAgcHJlcGFyZWRDb3VudCA9IHVuZGVyZmxvd0NvdW50ID0gb3ZlcmZsb3dDb3VudCA9IHN0YXJ0Q291bnQgPSBmaW5pc2hlZENvdW50ID0gMDsKKworICAgIHNpemVfdCBjb3VudCA9IG51bVRyYWNrczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgc3RhdHVzX3QgZmluYWxSZXN1bHQ7CisgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQoaSk7CisgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNyYyA9IGluZm8tPm1Tb3VyY2U7CisgICAgICAgIGlmIChzcmMgPT0gTlVMTCkgeworICAgICAgICAgICAgLS1udW1UcmFja3M7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpbnQ2NF90IGJ1ZmZlcmVkRHVyYXRpb25VcyA9IHNyYy0+Z2V0QnVmZmVyZWREdXJhdGlvblVzKCZmaW5hbFJlc3VsdCk7CisKKyAgICAgICAgaW50NjRfdCBpbml0aWFsTWFya1VzOworICAgICAgICBpbnQ2NF90IG1heFJlYnVmZmVyaW5nTWFya1VzOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUJ1ZmZlcmluZ1NldHRpbmdzTG9jayk7CisgICAgICAgICAgICBpbml0aWFsTWFya1VzID0gbUJ1ZmZlcmluZ1NldHRpbmdzLm1Jbml0aWFsTWFya01zICogMTAwMGxsOworICAgICAgICAgICAgLy8gVE9ETzogbWF4UmVidWZmZXJpbmdNYXJrVXMgY291bGQgYmUgbGFyZ2VyIHRoYW4KKyAgICAgICAgICAgIC8vIG1CdWZmZXJpbmdTZXR0aW5ncy5tUmVzdW1lUGxheWJhY2tNYXJrTXMgKiAxMDAwbGwuCisgICAgICAgICAgICBtYXhSZWJ1ZmZlcmluZ01hcmtVcyA9IG1CdWZmZXJpbmdTZXR0aW5ncy5tUmVzdW1lUGxheWJhY2tNYXJrTXMgKiAxMDAwbGw7CisgICAgICAgIH0KKyAgICAgICAgLy8gaXNGaW5pc2hlZCB3aGVuIGR1cmF0aW9uIGlzIDAgY2hlY2tzIGZvciBFT1MgcmVzdWx0IG9ubHkKKyAgICAgICAgaWYgKGJ1ZmZlcmVkRHVyYXRpb25VcyA+IGluaXRpYWxNYXJrVXMKKyAgICAgICAgICAgICAgICB8fCBzcmMtPmlzRmluaXNoZWQoLyogZHVyYXRpb24gKi8gMCkpIHsKKyAgICAgICAgICAgICsrcHJlcGFyZWRDb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzcmMtPmlzRmluaXNoZWQoLyogZHVyYXRpb24gKi8gMCkpIHsKKyAgICAgICAgICAgICsrb3ZlcmZsb3dDb3VudDsKKyAgICAgICAgICAgICsrZmluaXNoZWRDb3VudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHJlZGVmaW5lIGtVbmRlcmZsb3dNYXJrTXMgdG8gYSBmYWlyIHZhbHVlLAorICAgICAgICAgICAgaWYgKGJ1ZmZlcmVkRHVyYXRpb25VcyA8IGtVbmRlcmZsb3dNYXJrTXMgKiAxMDAwKSB7CisgICAgICAgICAgICAgICAgKyt1bmRlcmZsb3dDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPiBtYXhSZWJ1ZmZlcmluZ01hcmtVcykgeworICAgICAgICAgICAgICAgICsrb3ZlcmZsb3dDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDY0X3Qgc3RhcnRTZXJ2ZXJNYXJrVXMgPQorICAgICAgICAgICAgICAgICAgICAoa1VuZGVyZmxvd01hcmtNcyAqIDEwMDBsbCArIG1heFJlYnVmZmVyaW5nTWFya1VzKSAvIDI7CisgICAgICAgICAgICBpZiAoYnVmZmVyZWREdXJhdGlvblVzIDwgc3RhcnRTZXJ2ZXJNYXJrVXMpIHsKKyAgICAgICAgICAgICAgICArK3N0YXJ0Q291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqcHJlcGFyZWQgICAgPSAocHJlcGFyZWRDb3VudCA9PSBudW1UcmFja3MpOworICAgICp1bmRlcmZsb3cgICA9ICh1bmRlcmZsb3dDb3VudCA+IDApOworICAgICpvdmVyZmxvdyAgICA9IChvdmVyZmxvd0NvdW50ID09IG51bVRyYWNrcyk7CisgICAgKnN0YXJ0U2VydmVyID0gKHN0YXJ0Q291bnQgPiAwKTsKKyAgICAqZmluaXNoZWQgICAgPSAoZmluaXNoZWRDb3VudCA+IDApOworfQorCit2b2lkIE51UGxheWVyMjo6UlRTUFNvdXJjZTI6Om9uUG9sbEJ1ZmZlcmluZygpIHsKKyAgICBib29sIHByZXBhcmVkLCB1bmRlcmZsb3csIG92ZXJmbG93LCBzdGFydFNlcnZlciwgZmluaXNoZWQ7CisgICAgY2hlY2tCdWZmZXJpbmcoJnByZXBhcmVkLCAmdW5kZXJmbG93LCAmb3ZlcmZsb3csICZzdGFydFNlcnZlciwgJmZpbmlzaGVkKTsKKworICAgIGlmIChwcmVwYXJlZCAmJiBtSW5QcmVwYXJhdGlvblBoYXNlKSB7CisgICAgICAgIG1JblByZXBhcmF0aW9uUGhhc2UgPSBmYWxzZTsKKyAgICAgICAgbm90aWZ5UHJlcGFyZWQoKTsKKyAgICB9CisKKyAgICBpZiAoIW1JblByZXBhcmF0aW9uUGhhc2UgJiYgdW5kZXJmbG93KSB7CisgICAgICAgIHN0YXJ0QnVmZmVyaW5nSWZOZWNlc3NhcnkoKTsKKyAgICB9CisKKyAgICBpZiAoaGF2ZVN1ZmZpY2llbnREYXRhT25BbGxUcmFja3MoKSkgeworICAgICAgICBzdG9wQnVmZmVyaW5nSWZOZWNlc3NhcnkoKTsKKyAgICB9CisKKyAgICBpZiAob3ZlcmZsb3cgJiYgbUhhbmRsZXIgIT0gTlVMTCkgeworICAgICAgICBtSGFuZGxlci0+cGF1c2UoKTsKKyAgICB9CisKKyAgICBpZiAoc3RhcnRTZXJ2ZXIgJiYgbUhhbmRsZXIgIT0gTlVMTCkgeworICAgICAgICBtSGFuZGxlci0+cmVzdW1lKCk7CisgICAgfQorCisgICAgaWYgKGZpbmlzaGVkICYmIG1IYW5kbGVyICE9IE5VTEwpIHsKKyAgICAgICAgbUhhbmRsZXItPmNhbmNlbEFjY2Vzc1VuaXRUaW1lb3V0Q2hlY2soKTsKKyAgICB9CisKKyAgICBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpzaWduYWxTb3VyY2VFT1Moc3RhdHVzX3QgcmVzdWx0KSB7CisgICAgY29uc3QgYm9vbCBhdWRpbyA9IHRydWU7CisgICAgY29uc3QgYm9vbCB2aWRlbyA9IGZhbHNlOworCisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlID0gZ2V0U291cmNlKGF1ZGlvKTsKKyAgICBpZiAoc291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgc291cmNlLT5zaWduYWxFT1MocmVzdWx0KTsKKyAgICB9CisKKyAgICBzb3VyY2UgPSBnZXRTb3VyY2UodmlkZW8pOworICAgIGlmIChzb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBzb3VyY2UtPnNpZ25hbEVPUyhyZXN1bHQpOworICAgIH0KK30KKworYm9vbCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpzb3VyY2VSZWFjaGVkRU9TKGJvb2wgYXVkaW8pIHsKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2UgPSBnZXRTb3VyY2UoYXVkaW8pOworICAgIHN0YXR1c190IGZpbmFsUmVzdWx0OworICAgIHJldHVybiAoc291cmNlICE9IE5VTEwgJiYKKyAgICAgICAgICAgICFzb3VyY2UtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpICYmCisgICAgICAgICAgICBmaW5hbFJlc3VsdCA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKK30KKworYm9vbCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpzb3VyY2VOZWFyRU9TKGJvb2wgYXVkaW8pIHsKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2UgPSBnZXRTb3VyY2UoYXVkaW8pOworICAgIGludDY0X3QgbWVkaWFEdXJhdGlvblVzID0gMDsKKyAgICBnZXREdXJhdGlvbigmbWVkaWFEdXJhdGlvblVzKTsKKyAgICByZXR1cm4gKHNvdXJjZSAhPSBOVUxMICYmIHNvdXJjZS0+aXNGaW5pc2hlZChtZWRpYUR1cmF0aW9uVXMpKTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpvblNpZ25hbEVPUyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisKKyAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtU2Vla0dlbmVyYXRpb24pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtRU9TUGVuZGluZykgeworICAgICAgICBzaWduYWxTb3VyY2VFT1MoRVJST1JfRU5EX09GX1NUUkVBTSk7CisgICAgICAgIG1FT1NQZW5kaW5nID0gZmFsc2U7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6UlRTUFNvdXJjZTI6OnBvc3RTb3VyY2VFT1NJZk5lY2Vzc2FyeSgpIHsKKyAgICBjb25zdCBib29sIGF1ZGlvID0gdHJ1ZTsKKyAgICBjb25zdCBib29sIHZpZGVvID0gZmFsc2U7CisgICAgLy8gSWYgYSBzb3VyY2UgaGFzIGRldGVjdGVkIG5lYXIgZW5kLCBnaXZlIGl0IHNvbWUgdGltZSB0byByZXRyaWV2ZSBtb3JlCisgICAgLy8gZGF0YSBiZWZvcmUgc2lnbmFsaW5nIEVPUworICAgIGlmIChzb3VyY2VOZWFyRU9TKGF1ZGlvKSB8fCBzb3VyY2VOZWFyRU9TKHZpZGVvKSkgeworICAgICAgICBpZiAoIW1FT1NQZW5kaW5nKSB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2lnbmFsRU9TLCB0aGlzKTsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtU2Vla0dlbmVyYXRpb24pOworICAgICAgICAgICAgbXNnLT5wb3N0KGtOZWFyRU9TVGltZW91dFVzKTsKKyAgICAgICAgICAgIG1FT1NQZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGlmIChtc2ctPndoYXQoKSA9PSBrV2hhdERpc2Nvbm5lY3QpIHsKKyAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKworICAgICAgICBtRGlzY29ubmVjdFJlcGx5SUQgPSByZXBseUlEOworICAgICAgICBmaW5pc2hEaXNjb25uZWN0SWZQb3NzaWJsZSgpOworICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChtc2ctPndoYXQoKSA9PSBrV2hhdFBlcmZvcm1TZWVrKSB7CisgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZtU2Vla1JlcGx5SUQpKTsKKworICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtU2Vla0dlbmVyYXRpb24pIHsKKyAgICAgICAgICAgIC8vIG9ic29sZXRlLgorICAgICAgICAgICAgZmluaXNoU2VlayhPSyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CisgICAgICAgIGludDMyX3QgbW9kZTsKKyAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVVcyIsICZzZWVrVGltZVVzKSk7CisgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJtb2RlIiwgJm1vZGUpKTsKKworICAgICAgICAvLyBUT0RPOiBhZGQgIm1vZGUiIHRvIHBlcmZvcm1TZWVrLgorICAgICAgICBwZXJmb3JtU2VlayhzZWVrVGltZVVzLyosIChNZWRpYVBsYXllcjJTZWVrTW9kZSltb2RlICovKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAobXNnLT53aGF0KCkgPT0ga1doYXRQb2xsQnVmZmVyaW5nKSB7CisgICAgICAgIG9uUG9sbEJ1ZmZlcmluZygpOworICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChtc2ctPndoYXQoKSA9PSBrV2hhdFNpZ25hbEVPUykgeworICAgICAgICBvblNpZ25hbEVPUyhtc2cpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ0hFQ0tfRVEobXNnLT53aGF0KCksIGtXaGF0Tm90aWZ5KTsKKworICAgIGludDMyX3Qgd2hhdDsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigid2hhdCIsICZ3aGF0KSk7CisKKyAgICBzd2l0Y2ggKHdoYXQpIHsKKyAgICAgICAgY2FzZSBNeUhhbmRsZXI6OmtXaGF0Q29ubmVjdGVkOgorICAgICAgICB7CisgICAgICAgICAgICBvbkNvbm5lY3RlZCgpOworCisgICAgICAgICAgICBub3RpZnlWaWRlb1NpemVDaGFuZ2VkKCk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKworICAgICAgICAgICAgaWYgKG1IYW5kbGVyLT5pc1NlZWthYmxlKCkpIHsKKyAgICAgICAgICAgICAgICBmbGFncyA9IEZMQUdfQ0FOX1BBVVNFCisgICAgICAgICAgICAgICAgICAgICAgICB8IEZMQUdfQ0FOX1NFRUsKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgRkxBR19DQU5fU0VFS19CQUNLV0FSRAorICAgICAgICAgICAgICAgICAgICAgICAgfCBGTEFHX0NBTl9TRUVLX0ZPUldBUkQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5vdGlmeUZsYWdzQ2hhbmdlZChmbGFncyk7CisgICAgICAgICAgICBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBNeUhhbmRsZXI6OmtXaGF0RGlzY29ubmVjdGVkOgorICAgICAgICB7CisgICAgICAgICAgICBvbkRpc2Nvbm5lY3RlZChtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE15SGFuZGxlcjo6a1doYXRTZWVrRG9uZToKKyAgICAgICAgeworICAgICAgICAgICAgbVN0YXRlID0gQ09OTkVDVEVEOworICAgICAgICAgICAgLy8gVW5ibG9jayBzZWVrVG8gaGVyZSBpbiBjYXNlIHdlIGF0dGVtcHRlZCB0byBzZWVrIGluIGEgbGl2ZSBzdHJlYW0KKyAgICAgICAgICAgIGZpbmlzaFNlZWsoT0spOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE15SGFuZGxlcjo6a1doYXRTZWVrUGF1c2VkOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2UgPSBnZXRTb3VyY2UodHJ1ZSAvKiBhdWRpbyAqLyk7CisgICAgICAgICAgICBpZiAoc291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBzb3VyY2UtPnF1ZXVlRGlzY29udGludWl0eShBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4dHJhICovIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNjYXJkICovIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc291cmNlID0gZ2V0U291cmNlKGZhbHNlIC8qIHZpZGVvICovKTsKKyAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHNvdXJjZS0+cXVldWVEaXNjb250aW51aXR5KEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogZXh0cmEgKi8gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2NhcmQgKi8gdHJ1ZSk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICAgICAgICAgIG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKTsKKworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lIiwgJnRpbWVVcykpOworICAgICAgICAgICAgICAgIG1IYW5kbGVyLT5jb250aW51ZVNlZWtBZnRlclBhdXNlKHRpbWVVcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpbmlzaFNlZWsoZXJyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBNeUhhbmRsZXI6OmtXaGF0QWNjZXNzVW5pdDoKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXg7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJ0cmFja0luZGV4IiwgJnRyYWNrSW5kZXgpKTsKKworICAgICAgICAgICAgaWYgKG1UU1BhcnNlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfTFQodHJhY2tJbmRleCwgbVRyYWNrcy5zaXplKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDSEVDS19FUSh0cmFja0luZGV4LCAwdSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRCdWZmZXIoImFjY2Vzc1VuaXQiLCAmYWNjZXNzVW5pdCkpOworCisgICAgICAgICAgICBpbnQzMl90IGRhbWFnZWQ7CisgICAgICAgICAgICBpZiAoYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50MzIoImRhbWFnZWQiLCAmZGFtYWdlZCkKKyAgICAgICAgICAgICAgICAgICAgJiYgZGFtYWdlZCkgeworICAgICAgICAgICAgICAgIEFMT0dJKCJkcm9wcGluZyBkYW1hZ2VkIGFjY2VzcyB1bml0LiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobVRTUGFyc2VyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICAgICAgICAgICAgICB3aGlsZSAob2Zmc2V0ICsgMTg4IDw9IGFjY2Vzc1VuaXQtPnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBtVFNQYXJzZXItPmZlZWRUU1BhY2tldCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5kYXRhKCkgKyBvZmZzZXQsIDE4OCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE4ODsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAob2Zmc2V0IDwgYWNjZXNzVW5pdC0+c2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHNpZ25hbFNvdXJjZUVPUyhlcnIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHBvc3RTb3VyY2VFT1NJZk5lY2Vzc2FyeSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KHRyYWNrSW5kZXgpOworCisgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2UgPSBpbmZvLT5tU291cmNlOworICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcnRwVGltZTsKKyAgICAgICAgICAgICAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQzMigicnRwLXRpbWUiLCAoaW50MzJfdCAqKSZydHBUaW1lKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIWluZm8tPm1OUFRNYXBwaW5nVmFsaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGxpdmUgc3RyZWFtLCB3ZSBkaWRuJ3QgcmVjZWl2ZSBhbnkgbm9ybWFsCisgICAgICAgICAgICAgICAgICAgIC8vIHBsYXl0aW1lIG1hcHBpbmcuIFdlIHdvbid0IG1hcCB0byBucHQgdGltZS4KKyAgICAgICAgICAgICAgICAgICAgc291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludDY0X3QgbnB0VXMgPQorICAgICAgICAgICAgICAgICAgICAoKGRvdWJsZSlydHBUaW1lIC0gKGRvdWJsZSlpbmZvLT5tUlRQVGltZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8gaW5mby0+bVRpbWVTY2FsZQorICAgICAgICAgICAgICAgICAgICAgICAgKiAxMDAwMDAwbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICsgaW5mby0+bU5vcm1hbFBsYXl0aW1lVXM7CisKKyAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCBucHRVcyk7CisKKyAgICAgICAgICAgICAgICBzb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvc3RTb3VyY2VFT1NJZk5lY2Vzc2FyeSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE15SGFuZGxlcjo6a1doYXRFT1M6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZmluYWxSZXN1bHQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZmluYWxSZXN1bHQiLCAmZmluYWxSZXN1bHQpKTsKKyAgICAgICAgICAgIENIRUNLX05FKGZpbmFsUmVzdWx0LCAoc3RhdHVzX3QpT0spOworCisgICAgICAgICAgICBpZiAobVRTUGFyc2VyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBzaWduYWxTb3VyY2VFT1MoZmluYWxSZXN1bHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaXplX3QgdHJhY2tJbmRleDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFNpemUoInRyYWNrSW5kZXgiLCAmdHJhY2tJbmRleCkpOworICAgICAgICAgICAgQ0hFQ0tfTFQodHJhY2tJbmRleCwgbVRyYWNrcy5zaXplKCkpOworCisgICAgICAgICAgICBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KHRyYWNrSW5kZXgpOworICAgICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlID0gaW5mby0+bVNvdXJjZTsKKyAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHNvdXJjZS0+c2lnbmFsRU9TKGZpbmFsUmVzdWx0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE15SGFuZGxlcjo6a1doYXRTZWVrRGlzY29udGludWl0eToKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXg7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJ0cmFja0luZGV4IiwgJnRyYWNrSW5kZXgpKTsKKyAgICAgICAgICAgIENIRUNLX0xUKHRyYWNrSW5kZXgsIG1UcmFja3Muc2l6ZSgpKTsKKworICAgICAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MuZWRpdEl0ZW1BdCh0cmFja0luZGV4KTsKKyAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9IGluZm8tPm1Tb3VyY2U7CisgICAgICAgICAgICBpZiAoc291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBzb3VyY2UtPnF1ZXVlRGlzY29udGludWl0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9USU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogZGlzY2FyZCAqLyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBNeUhhbmRsZXI6OmtXaGF0Tm9ybWFsUGxheVRpbWVNYXBwaW5nOgorICAgICAgICB7CisgICAgICAgICAgICBzaXplX3QgdHJhY2tJbmRleDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFNpemUoInRyYWNrSW5kZXgiLCAmdHJhY2tJbmRleCkpOworICAgICAgICAgICAgQ0hFQ0tfTFQodHJhY2tJbmRleCwgbVRyYWNrcy5zaXplKCkpOworCisgICAgICAgICAgICB1aW50MzJfdCBydHBUaW1lOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJ0cFRpbWUiLCAoaW50MzJfdCAqKSZydHBUaW1lKSk7CisKKyAgICAgICAgICAgIGludDY0X3QgbnB0VXM7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgibnB0VXMiLCAmbnB0VXMpKTsKKworICAgICAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MuZWRpdEl0ZW1BdCh0cmFja0luZGV4KTsKKyAgICAgICAgICAgIGluZm8tPm1SVFBUaW1lID0gcnRwVGltZTsKKyAgICAgICAgICAgIGluZm8tPm1Ob3JtYWxQbGF5dGltZVVzID0gbnB0VXM7CisgICAgICAgICAgICBpbmZvLT5tTlBUTWFwcGluZ1ZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTRFBMb2FkZXI6OmtXaGF0U0RQTG9hZGVkOgorICAgICAgICB7CisgICAgICAgICAgICBvblNEUExvYWRlZChtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6b25Db25uZWN0ZWQoKSB7CisgICAgQ0hFQ0sobUF1ZGlvVHJhY2sgPT0gTlVMTCk7CisgICAgQ0hFQ0sobVZpZGVvVHJhY2sgPT0gTlVMTCk7CisKKyAgICBzaXplX3QgbnVtVHJhY2tzID0gbUhhbmRsZXItPmNvdW50VHJhY2tzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1UcmFja3M7ICsraSkgeworICAgICAgICBpbnQzMl90IHRpbWVTY2FsZTsKKyAgICAgICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IG1IYW5kbGVyLT5nZXRUcmFja0Zvcm1hdChpLCAmdGltZVNjYWxlKTsKKworICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKworICAgICAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyVFMpKSB7CisgICAgICAgICAgICAvLyBWZXJ5IHNwZWNpYWwgY2FzZSBmb3IgTVBFRzIgVHJhbnNwb3J0IFN0cmVhbXMuCisgICAgICAgICAgICBDSEVDS19FUShudW1UcmFja3MsIDF1KTsKKworICAgICAgICAgICAgbVRTUGFyc2VyID0gbmV3IEFUU1BhcnNlcjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgaXNBdWRpbyA9ICFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNik7CisgICAgICAgIGJvb2wgaXNWaWRlbyA9ICFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNik7CisKKyAgICAgICAgVHJhY2tJbmZvIGluZm87CisgICAgICAgIGluZm8ubVRpbWVTY2FsZSA9IHRpbWVTY2FsZTsKKyAgICAgICAgaW5mby5tUlRQVGltZSA9IDA7CisgICAgICAgIGluZm8ubU5vcm1hbFBsYXl0aW1lVXMgPSAwbGw7CisgICAgICAgIGluZm8ubU5QVE1hcHBpbmdWYWxpZCA9IGZhbHNlOworCisgICAgICAgIGlmICgoaXNBdWRpbyAmJiBtQXVkaW9UcmFjayA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHx8IChpc1ZpZGVvICYmIG1WaWRlb1RyYWNrID09IE5VTEwpKSB7CisgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2UgPSBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShmb3JtYXQpOworCisgICAgICAgICAgICBpZiAoaXNBdWRpbykgeworICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrID0gc291cmNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtVmlkZW9UcmFjayA9IHNvdXJjZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW5mby5tU291cmNlID0gc291cmNlOworICAgICAgICB9CisKKyAgICAgICAgbVRyYWNrcy5wdXNoKGluZm8pOworICAgIH0KKworICAgIG1TdGF0ZSA9IENPTk5FQ1RFRDsKK30KKwordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpvblNEUExvYWRlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN0YXR1c190IGVycjsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVzdWx0IiwgJmVycikpOworCisgICAgbVNEUExvYWRlci5jbGVhcigpOworCisgICAgaWYgKG1EaXNjb25uZWN0UmVwbHlJRCAhPSAwKSB7CisgICAgICAgIGVyciA9IFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBzcDxBU2Vzc2lvbkRlc2NyaXB0aW9uPiBkZXNjOworICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgiZGVzY3JpcHRpb24iLCAmb2JqKSk7CisgICAgICAgIGRlc2MgPSBzdGF0aWNfY2FzdDxBU2Vzc2lvbkRlc2NyaXB0aW9uICo+KG9iai5nZXQoKSk7CisKKyAgICAgICAgQVN0cmluZyBydHNwVXJpOworICAgICAgICBpZiAoIWRlc2MtPmZpbmRBdHRyaWJ1dGUoMCwgImE9Y29udHJvbCIsICZydHNwVXJpKSkgeworICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBmaW5kIHVybCBpbiBTRFAiKTsKKyAgICAgICAgICAgIGVyciA9IFVOS05PV05fRVJST1I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0Tm90aWZ5LCB0aGlzKTsKKworICAgICAgICAgICAgbUhhbmRsZXIgPSBuZXcgTXlIYW5kbGVyKHJ0c3BVcmkuY19zdHIoKSwgbm90aWZ5LCB0cnVlIC8qIHVpZFZhbGlkICovLCBtVUlEKTsKKyAgICAgICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlcik7CisKKyAgICAgICAgICAgIG1IYW5kbGVyLT5sb2FkU0RQKGRlc2MpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBpZiAobVN0YXRlID09IENPTk5FQ1RJTkcpIHsKKyAgICAgICAgICAgIC8vIFdlJ3JlIHN0aWxsIGluIHRoZSBwcmVwYXJhdGlvbiBwaGFzZSwgc2lnbmFsIHRoYXQgaXQKKyAgICAgICAgICAgIC8vIGZhaWxlZC4KKyAgICAgICAgICAgIG5vdGlmeVByZXBhcmVkKGVycik7CisgICAgICAgIH0KKworICAgICAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7CisgICAgICAgIHNldEVycm9yKGVycik7CisKKyAgICAgICAgaWYgKG1EaXNjb25uZWN0UmVwbHlJRCAhPSAwKSB7CisgICAgICAgICAgICBmaW5pc2hEaXNjb25uZWN0SWZQb3NzaWJsZSgpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6UlRTUFNvdXJjZTI6Om9uRGlzY29ubmVjdGVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgaWYgKG1TdGF0ZSA9PSBESVNDT05ORUNURUQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0YXR1c190IGVycjsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVzdWx0IiwgJmVycikpOworICAgIENIRUNLX05FKGVyciwgKHN0YXR1c190KU9LKTsKKworICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyLT5pZCgpKTsKKyAgICBtSGFuZGxlci5jbGVhcigpOworCisgICAgaWYgKG1TdGF0ZSA9PSBDT05ORUNUSU5HKSB7CisgICAgICAgIC8vIFdlJ3JlIHN0aWxsIGluIHRoZSBwcmVwYXJhdGlvbiBwaGFzZSwgc2lnbmFsIHRoYXQgaXQKKyAgICAgICAgLy8gZmFpbGVkLgorICAgICAgICBub3RpZnlQcmVwYXJlZChlcnIpOworICAgIH0KKworICAgIG1TdGF0ZSA9IERJU0NPTk5FQ1RFRDsKKyAgICBzZXRFcnJvcihlcnIpOworCisgICAgaWYgKG1EaXNjb25uZWN0UmVwbHlJRCAhPSAwKSB7CisgICAgICAgIGZpbmlzaERpc2Nvbm5lY3RJZlBvc3NpYmxlKCk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6UlRTUFNvdXJjZTI6OmZpbmlzaERpc2Nvbm5lY3RJZlBvc3NpYmxlKCkgeworICAgIGlmIChtU3RhdGUgIT0gRElTQ09OTkVDVEVEKSB7CisgICAgICAgIGlmIChtSGFuZGxlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBtSGFuZGxlci0+ZGlzY29ubmVjdCgpOworICAgICAgICB9IGVsc2UgaWYgKG1TRFBMb2FkZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgbVNEUExvYWRlci0+Y2FuY2VsKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIChuZXcgQU1lc3NhZ2UpLT5wb3N0UmVwbHkobURpc2Nvbm5lY3RSZXBseUlEKTsKKyAgICBtRGlzY29ubmVjdFJlcGx5SUQgPSAwOworfQorCit2b2lkIE51UGxheWVyMjo6UlRTUFNvdXJjZTI6OnNldEVycm9yKHN0YXR1c190IGVycikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtQnVmZmVyaW5nTG9jayk7CisgICAgbUZpbmFsUmVzdWx0ID0gZXJyOworfQorCit2b2lkIE51UGxheWVyMjo6UlRTUFNvdXJjZTI6OnN0YXJ0QnVmZmVyaW5nSWZOZWNlc3NhcnkoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1CdWZmZXJpbmdMb2NrKTsKKworICAgIGlmICghbUJ1ZmZlcmluZykgeworICAgICAgICBtQnVmZmVyaW5nID0gdHJ1ZTsKKworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFBhdXNlT25CdWZmZXJpbmdTdGFydCk7CisgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgIH0KK30KKworYm9vbCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpzdG9wQnVmZmVyaW5nSWZOZWNlc3NhcnkoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1CdWZmZXJpbmdMb2NrKTsKKworICAgIGlmIChtQnVmZmVyaW5nKSB7CisgICAgICAgIGlmICghaGF2ZVN1ZmZpY2llbnREYXRhT25BbGxUcmFja3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgbUJ1ZmZlcmluZyA9IGZhbHNlOworCisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UmVzdW1lT25CdWZmZXJpbmdFbmQpOworICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpmaW5pc2hTZWVrKHN0YXR1c190IGVycikgeworICAgIGlmIChtU2Vla1JlcGx5SUQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPEFNZXNzYWdlPiBzZWVrUmVwbHkgPSBuZXcgQU1lc3NhZ2U7CisgICAgc2Vla1JlcGx5LT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICBzZWVrUmVwbHktPnBvc3RSZXBseShtU2Vla1JlcGx5SUQpOworICAgIG1TZWVrUmVwbHlJRCA9IE5VTEw7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEyYzNlNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvUlRTUFNvdXJjZTIuaApAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBSVFNQX1NPVVJDRTJfSF8KKworI2RlZmluZSBSVFNQX1NPVVJDRTJfSF8KKworI2luY2x1ZGUgIk51UGxheWVyMlNvdXJjZS5oIgorCisjaW5jbHVkZSAiQVRTUGFyc2VyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFMb29wZXI7CitzdHJ1Y3QgQVJlcGx5VG9rZW47CitzdHJ1Y3QgQW5vdGhlclBhY2tldFNvdXJjZTsKK3N0cnVjdCBNeUhhbmRsZXI7CitzdHJ1Y3QgU0RQTG9hZGVyOworCitzdHJ1Y3QgTnVQbGF5ZXIyOjpSVFNQU291cmNlMiA6IHB1YmxpYyBOdVBsYXllcjI6OlNvdXJjZSB7CisgICAgUlRTUFNvdXJjZTIoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAorICAgICAgICAgICAgdWlkX3QgdWlkID0gMCwKKyAgICAgICAgICAgIGJvb2wgaXNTRFAgPSBmYWxzZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlcmluZ1NldHRpbmdzKAorICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYygpOworICAgIHZpcnR1YWwgdm9pZCBzdGFydCgpOworICAgIHZpcnR1YWwgdm9pZCBzdG9wKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGZlZWRNb3JlVFNEYXRhKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlcXVldWVBY2Nlc3NVbml0KGJvb2wgYXVkaW8sIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25Vcyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZWVrVG8oCisgICAgICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXMsCisgICAgICAgICAgICBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQykgb3ZlcnJpZGU7CisKKyAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflJUU1BTb3VyY2UyKCk7CisKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXRNZXRhKGJvb2wgYXVkaW8pOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrV2hhdE5vdGlmeSAgICAgICAgICA9ICdub3RpJywKKyAgICAgICAga1doYXREaXNjb25uZWN0ICAgICAgPSAnZGlzYycsCisgICAgICAgIGtXaGF0UGVyZm9ybVNlZWsgICAgID0gJ3NlZWsnLAorICAgICAgICBrV2hhdFBvbGxCdWZmZXJpbmcgICA9ICdwb2xsJywKKyAgICAgICAga1doYXRTaWduYWxFT1MgICAgICAgPSAnZW9zICcsCisgICAgfTsKKworICAgIGVudW0gU3RhdGUgeworICAgICAgICBESVNDT05ORUNURUQsCisgICAgICAgIENPTk5FQ1RJTkcsCisgICAgICAgIENPTk5FQ1RFRCwKKyAgICAgICAgU0VFS0lORywKKyAgICB9OworCisgICAgZW51bSBGbGFncyB7CisgICAgICAgIC8vIERvbid0IGxvZyBhbnkgVVJMcy4KKyAgICAgICAga0ZsYWdJbmNvZ25pdG8gPSAxLAorICAgIH07CisKKyAgICBzdHJ1Y3QgVHJhY2tJbmZvIHsKKyAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gbVNvdXJjZTsKKworICAgICAgICBpbnQzMl90IG1UaW1lU2NhbGU7CisgICAgICAgIHVpbnQzMl90IG1SVFBUaW1lOworICAgICAgICBpbnQ2NF90IG1Ob3JtYWxQbGF5dGltZVVzOworICAgICAgICBib29sIG1OUFRNYXBwaW5nVmFsaWQ7CisgICAgfTsKKworICAgIHNwPE1lZGlhSFRUUFNlcnZpY2U+IG1IVFRQU2VydmljZTsKKyAgICBBU3RyaW5nIG1VUkw7CisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUV4dHJhSGVhZGVyczsKKyAgICB1aWRfdCBtVUlEOworICAgIHVpbnQzMl90IG1GbGFnczsKKyAgICBib29sIG1Jc1NEUDsKKyAgICBTdGF0ZSBtU3RhdGU7CisgICAgc3RhdHVzX3QgbUZpbmFsUmVzdWx0OworICAgIHNwPEFSZXBseVRva2VuPiBtRGlzY29ubmVjdFJlcGx5SUQ7CisgICAgTXV0ZXggbUJ1ZmZlcmluZ0xvY2s7CisgICAgYm9vbCBtQnVmZmVyaW5nOworICAgIGJvb2wgbUluUHJlcGFyYXRpb25QaGFzZTsKKyAgICBib29sIG1FT1NQZW5kaW5nOworCisgICAgTXV0ZXggbUJ1ZmZlcmluZ1NldHRpbmdzTG9jazsKKyAgICBCdWZmZXJpbmdTZXR0aW5ncyBtQnVmZmVyaW5nU2V0dGluZ3M7CisKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOworICAgIHNwPE15SGFuZGxlcj4gbUhhbmRsZXI7CisgICAgc3A8U0RQTG9hZGVyPiBtU0RQTG9hZGVyOworCisgICAgVmVjdG9yPFRyYWNrSW5mbz4gbVRyYWNrczsKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBtQXVkaW9UcmFjazsKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBtVmlkZW9UcmFjazsKKworICAgIHNwPEFUU1BhcnNlcj4gbVRTUGFyc2VyOworCisgICAgaW50MzJfdCBtU2Vla0dlbmVyYXRpb247CisKKyAgICBpbnQ2NF90IG1FT1NUaW1lb3V0QXVkaW87CisgICAgaW50NjRfdCBtRU9TVGltZW91dFZpZGVvOworCisgICAgc3A8QVJlcGx5VG9rZW4+IG1TZWVrUmVwbHlJRDsKKworICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IGdldFNvdXJjZShib29sIGF1ZGlvKTsKKworICAgIHZvaWQgb25Db25uZWN0ZWQoKTsKKyAgICB2b2lkIG9uU0RQTG9hZGVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIG9uRGlzY29ubmVjdGVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIGZpbmlzaERpc2Nvbm5lY3RJZlBvc3NpYmxlKCk7CisKKyAgICB2b2lkIHBlcmZvcm1TZWVrKGludDY0X3Qgc2Vla1RpbWVVcyk7CisgICAgdm9pZCBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKKyAgICB2b2lkIGNoZWNrQnVmZmVyaW5nKAorICAgICAgICAgICAgYm9vbCAqcHJlcGFyZWQsCisgICAgICAgICAgICBib29sICp1bmRlcmZsb3csCisgICAgICAgICAgICBib29sICpvdmVyZmxvdywKKyAgICAgICAgICAgIGJvb2wgKnN0YXJ0U2VydmVyLAorICAgICAgICAgICAgYm9vbCAqZmluaXNoZWQpOworICAgIHZvaWQgb25Qb2xsQnVmZmVyaW5nKCk7CisKKyAgICBib29sIGhhdmVTdWZmaWNpZW50RGF0YU9uQWxsVHJhY2tzKCk7CisKKyAgICB2b2lkIHNldEVPU1RpbWVvdXQoYm9vbCBhdWRpbywgaW50NjRfdCB0aW1lb3V0KTsKKyAgICB2b2lkIHNldEVycm9yKHN0YXR1c190IGVycik7CisgICAgdm9pZCBzdGFydEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5KCk7CisgICAgYm9vbCBzdG9wQnVmZmVyaW5nSWZOZWNlc3NhcnkoKTsKKyAgICB2b2lkIGZpbmlzaFNlZWsoc3RhdHVzX3QgZXJyKTsKKworICAgIHZvaWQgcG9zdFNvdXJjZUVPU0lmTmVjZXNzYXJ5KCk7CisgICAgdm9pZCBzaWduYWxTb3VyY2VFT1Moc3RhdHVzX3QgcmVzdWx0KTsKKyAgICB2b2lkIG9uU2lnbmFsRU9TKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIGJvb2wgc291cmNlTmVhckVPUyhib29sIGF1ZGlvKTsKKyAgICBib29sIHNvdXJjZVJlYWNoZWRFT1MoYm9vbCBhdWRpbyk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSVFNQU291cmNlMik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFJUU1BfU09VUkNFMl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzc5NzNiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw3OCBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworCisgICAgc3JjczogWworICAgICAgICAiQWN0aXZpdHlNYW5hZ2VyLmNwcCIsCisgICAgICAgICJNZWRpYVBsYXllckZhY3RvcnkuY3BwIiwKKyAgICAgICAgIk1lZGlhUGxheWVyU2VydmljZS5jcHAiLAorICAgICAgICAiTWVkaWFSZWNvcmRlckNsaWVudC5jcHAiLAorICAgICAgICAiTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwIiwKKyAgICAgICAgIlN0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwIiwKKyAgICAgICAgIlRlc3RQbGF5ZXJTdHViLmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAorICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmNhbWVyYV9jbGllbnQiLAorICAgICAgICAibGliY3J5cHRvIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJkbCIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhZHJtIiwKKyAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYm1lbXVucmVhY2hhYmxlIiwKKyAgICAgICAgImxpYnBvd2VybWFuYWdlciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X251cGxheWVyIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3J0c3AiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0IiwKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWyJsaWJtZWRpYSJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtIiwKKyAgICBdLAorCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgbmFtZTogImxpYm1lZGlhcGxheWVyc2VydmljZSIsCisKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBkaWFnOiB7CisgICAgICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKKworfQorCitzdWJkaXJzID0gWyIqIl0KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQubWsgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZjNzRhOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jCi0jIGxpYm1lZGlhcGxheWVyc2VydmljZQotIwotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICBcCi0gICAgQWN0aXZpdHlNYW5hZ2VyLmNwcCAgICAgICAgIFwKLSAgICBIRENQLmNwcCAgICAgICAgICAgICAgICAgICAgXAotICAgIE1lZGlhUGxheWVyRmFjdG9yeS5jcHAgICAgICBcCi0gICAgTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCAgICAgIFwKLSAgICBNZWRpYVJlY29yZGVyQ2xpZW50LmNwcCAgICAgXAotICAgIE1ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcCBcCi0gICAgUmVtb3RlRGlzcGxheS5jcHAgICAgICAgICAgIFwKLSAgICBTdGFnZWZyaWdodFJlY29yZGVyLmNwcCAgICAgXAotICAgIFRlc3RQbGF5ZXJTdHViLmNwcCAgICAgICAgICBcCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gICAgICAgXAotICAgIGxpYmJpbmRlciAgICAgICAgICAgICAgICAgICBcCi0gICAgbGliY3J5cHRvICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJjdXRpbHMgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYmRybWZyYW1ld29yayAgICAgICAgICAgICBcCi0gICAgbGlibG9nICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJkbCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYmd1aSAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGliYXVkaW9jbGllbnQgICAgICAgICAgICAgIFwKLSAgICBsaWJtZWRpYSAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYm1lZGlhbWV0cmljcyAgICAgICAgICAgICBcCi0gICAgbGlibWVkaWFkcm0gICAgICAgICAgICAgICAgIFwKLSAgICBsaWJtZWRpYXV0aWxzICAgICAgICAgICAgICAgXAotICAgIGxpYm1lbXVucmVhY2hhYmxlICAgICAgICAgICBcCi0gICAgbGlic3RhZ2VmcmlnaHQgICAgICAgICAgICAgIFwKLSAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uICAgXAotICAgIGxpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlICAgICBcCi0gICAgbGlic3RhZ2VmcmlnaHRfb214ICAgICAgICAgIFwKLSAgICBsaWJzdGFnZWZyaWdodF93ZmQgICAgICAgICAgXAotICAgIGxpYnV0aWxzICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGlibmF0aXZld2luZG93ICAgICAgICAgICAgIFwKLSAgICBsaWJoaWRsYmFzZSAgICAgICAgICAgICAgICAgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCBcCi0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gICAgICAgXAotICAgIGxpYnN0YWdlZnJpZ2h0X251cGxheWVyICAgICBcCi0gICAgbGlic3RhZ2VmcmlnaHRfcnRzcCAgICAgICAgIFwKLSAgICBsaWJzdGFnZWZyaWdodF90aW1lZHRleHQgICAgXAotCi1MT0NBTF9FWFBPUlRfU0hBUkVEX0xJQlJBUllfSEVBREVSUyA6PSBsaWJtZWRpYQotCi1MT0NBTF9DX0lOQ0xVREVTIDo9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgICAgICAgICAgICAgICBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwICAgICAgICAgICAgICAgICAgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5ICAgICAgICAgIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0gICAgICAgICAgICAgICAgICBcCi0gICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlL21lZGlhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZyYW1ld29ya3MvYXYvaW5jbHVkZS9jYW1lcmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggICAgICAgICAgICAgICAgICBcCi0gICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9oYXJkd2FyZSAgICAgICAgICAgICAgICAgXAotICAgIGV4dGVybmFsL3RyZW1vbG8vVHJlbW9sbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQotTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyAtV2FsbAotCi1MT0NBTF9NT0RVTEU6PSBsaWJtZWRpYXBsYXllcnNlcnZpY2UKLQotTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQotCi1MT0NBTF9TQU5JVElaRSA6PSBjZmkKLUxPQ0FMX1NBTklUSVpFX0RJQUcgOj0gY2ZpCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0hEQ1AuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0hEQ1AuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmUzOTM2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9IRENQLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJIRENQIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiSERDUC5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLQotI2luY2x1ZGUgPGRsZmNuLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotSERDUDo6SERDUChib29sIGNyZWF0ZUVuY3J5cHRpb25Nb2R1bGUpCi0gICAgOiBtSXNFbmNyeXB0aW9uTW9kdWxlKGNyZWF0ZUVuY3J5cHRpb25Nb2R1bGUpLAotICAgICAgbUxpYkhhbmRsZShOVUxMKSwKLSAgICAgIG1IRENQTW9kdWxlKE5VTEwpIHsKLSAgICBtTGliSGFuZGxlID0gZGxvcGVuKCJsaWJzdGFnZWZyaWdodF9oZGNwLnNvIiwgUlRMRF9OT1cpOwotCi0gICAgaWYgKG1MaWJIYW5kbGUgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGxvY2F0ZSBsaWJzdGFnZWZyaWdodF9oZGNwLnNvIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB0eXBlZGVmIEhEQ1BNb2R1bGUgKigqQ3JlYXRlSERDUE1vZHVsZUZ1bmMpKAotICAgICAgICAgICAgdm9pZCAqLCBIRENQTW9kdWxlOjpPYnNlcnZlckZ1bmMpOwotCi0gICAgQ3JlYXRlSERDUE1vZHVsZUZ1bmMgY3JlYXRlSERDUE1vZHVsZSA9Ci0gICAgICAgIG1Jc0VuY3J5cHRpb25Nb2R1bGUKLSAgICAgICAgICAgID8gKENyZWF0ZUhEQ1BNb2R1bGVGdW5jKWRsc3ltKG1MaWJIYW5kbGUsICJjcmVhdGVIRENQTW9kdWxlIikKLSAgICAgICAgICAgIDogKENyZWF0ZUhEQ1BNb2R1bGVGdW5jKWRsc3ltKAotICAgICAgICAgICAgICAgICAgICBtTGliSGFuZGxlLCAiY3JlYXRlSERDUE1vZHVsZUZvckRlY3J5cHRpb24iKTsKLQotICAgIGlmIChjcmVhdGVIRENQTW9kdWxlID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBmaW5kIHN5bWJvbCAnY3JlYXRlSERDUE1vZHVsZScuIik7Ci0gICAgfSBlbHNlIGlmICgobUhEQ1BNb2R1bGUgPSBjcmVhdGVIRENQTW9kdWxlKAotICAgICAgICAgICAgICAgICAgICB0aGlzLCAmSERDUDo6T2JzZXJ2ZVdyYXBwZXIpKSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJjcmVhdGVIRENQTW9kdWxlIGZhaWxlZC4iKTsKLSAgICB9Ci19Ci0KLUhEQ1A6On5IRENQKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobUhEQ1BNb2R1bGUgIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgbUhEQ1BNb2R1bGU7Ci0gICAgICAgIG1IRENQTW9kdWxlID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAobUxpYkhhbmRsZSAhPSBOVUxMKSB7Ci0gICAgICAgIGRsY2xvc2UobUxpYkhhbmRsZSk7Ci0gICAgICAgIG1MaWJIYW5kbGUgPSBOVUxMOwotICAgIH0KLX0KLQotc3RhdHVzX3QgSERDUDo6c2V0T2JzZXJ2ZXIoY29uc3Qgc3A8SUhEQ1BPYnNlcnZlcj4gJm9ic2VydmVyKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtSERDUE1vZHVsZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgIG1PYnNlcnZlciA9IG9ic2VydmVyOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBIRENQOjppbml0QXN5bmMoY29uc3QgY2hhciAqaG9zdCwgdW5zaWduZWQgcG9ydCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobUhEQ1BNb2R1bGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbUhEQ1BNb2R1bGUtPmluaXRBc3luYyhob3N0LCBwb3J0KTsKLX0KLQotc3RhdHVzX3QgSERDUDo6c2h1dGRvd25Bc3luYygpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1IRENQTW9kdWxlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1IRENQTW9kdWxlLT5zaHV0ZG93bkFzeW5jKCk7Ci19Ci0KLXVpbnQzMl90IEhEQ1A6OmdldENhcHMoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtSERDUE1vZHVsZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgIHJldHVybiBtSERDUE1vZHVsZS0+Z2V0Q2FwcygpOwotfQotCi1zdGF0dXNfdCBIRENQOjplbmNyeXB0KAotICAgICAgICBjb25zdCB2b2lkICppbkRhdGEsIHNpemVfdCBzaXplLCB1aW50MzJfdCBzdHJlYW1DVFIsCi0gICAgICAgIHVpbnQ2NF90ICpvdXRJbnB1dENUUiwgdm9pZCAqb3V0RGF0YSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBDSEVDSyhtSXNFbmNyeXB0aW9uTW9kdWxlKTsKLQotICAgIGlmIChtSERDUE1vZHVsZSA9PSBOVUxMKSB7Ci0gICAgICAgICpvdXRJbnB1dENUUiA9IDA7Ci0KLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1IRENQTW9kdWxlLT5lbmNyeXB0KGluRGF0YSwgc2l6ZSwgc3RyZWFtQ1RSLCBvdXRJbnB1dENUUiwgb3V0RGF0YSk7Ci19Ci0KLXN0YXR1c190IEhEQ1A6OmVuY3J5cHROYXRpdmUoCi0gICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+ICZncmFwaGljQnVmZmVyLAotICAgICAgICBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgdWludDMyX3Qgc3RyZWFtQ1RSLAotICAgICAgICB1aW50NjRfdCAqb3V0SW5wdXRDVFIsIHZvaWQgKm91dERhdGEpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgQ0hFQ0sobUlzRW5jcnlwdGlvbk1vZHVsZSk7Ci0KLSAgICBpZiAobUhEQ1BNb2R1bGUgPT0gTlVMTCkgewotICAgICAgICAqb3V0SW5wdXRDVFIgPSAwOwotCi0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgIHJldHVybiBtSERDUE1vZHVsZS0+ZW5jcnlwdE5hdGl2ZShncmFwaGljQnVmZmVyLT5oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgIG9mZnNldCwgc2l6ZSwgc3RyZWFtQ1RSLCBvdXRJbnB1dENUUiwgb3V0RGF0YSk7Ci19Ci0KLXN0YXR1c190IEhEQ1A6OmRlY3J5cHQoCi0gICAgICAgIGNvbnN0IHZvaWQgKmluRGF0YSwgc2l6ZV90IHNpemUsCi0gICAgICAgIHVpbnQzMl90IHN0cmVhbUNUUiwgdWludDY0X3Qgb3V0SW5wdXRDVFIsIHZvaWQgKm91dERhdGEpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgQ0hFQ0soIW1Jc0VuY3J5cHRpb25Nb2R1bGUpOwotCi0gICAgaWYgKG1IRENQTW9kdWxlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1IRENQTW9kdWxlLT5kZWNyeXB0KGluRGF0YSwgc2l6ZSwgc3RyZWFtQ1RSLCBvdXRJbnB1dENUUiwgb3V0RGF0YSk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBIRENQOjpPYnNlcnZlV3JhcHBlcih2b2lkICptZSwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyKSB7Ci0gICAgc3RhdGljX2Nhc3Q8SERDUCAqPihtZSktPm9ic2VydmUobXNnLCBleHQxLCBleHQyKTsKLX0KLQotdm9pZCBIRENQOjpvYnNlcnZlKGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MikgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobU9ic2VydmVyICE9IE5VTEwpIHsKLSAgICAgICAgbU9ic2VydmVyLT5ub3RpZnkobXNnLCBleHQxLCBleHQyLCBOVUxMIC8qIG9iaiAqLyk7Ci0gICAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvSERDUC5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0hEQ1AuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNjNjFiNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvSERDUC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgSERDUF9IXwotCi0jZGVmaW5lIEhEQ1BfSF8KLQotI2luY2x1ZGUgPG1lZGlhL0lIRENQLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgSERDUCA6IHB1YmxpYyBCbkhEQ1AgewotICAgIGV4cGxpY2l0IEhEQ1AoYm9vbCBjcmVhdGVFbmNyeXB0aW9uTW9kdWxlKTsKLSAgICB2aXJ0dWFsIH5IRENQKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE9ic2VydmVyKGNvbnN0IHNwPElIRENQT2JzZXJ2ZXI+ICZvYnNlcnZlcik7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0QXN5bmMoY29uc3QgY2hhciAqaG9zdCwgdW5zaWduZWQgcG9ydCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzaHV0ZG93bkFzeW5jKCk7Ci0gICAgdmlydHVhbCB1aW50MzJfdCBnZXRDYXBzKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGVuY3J5cHQoCi0gICAgICAgICAgICBjb25zdCB2b2lkICppbkRhdGEsIHNpemVfdCBzaXplLCB1aW50MzJfdCBzdHJlYW1DVFIsCi0gICAgICAgICAgICB1aW50NjRfdCAqb3V0SW5wdXRDVFIsIHZvaWQgKm91dERhdGEpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBlbmNyeXB0TmF0aXZlKAotICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmdyYXBoaWNCdWZmZXIsCi0gICAgICAgICAgICBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgdWludDMyX3Qgc3RyZWFtQ1RSLAotICAgICAgICAgICAgdWludDY0X3QgKm91dElucHV0Q1RSLCB2b2lkICpvdXREYXRhKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdCgKLSAgICAgICAgICAgIGNvbnN0IHZvaWQgKmluRGF0YSwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICB1aW50MzJfdCBzdHJlYW1DVFIsIHVpbnQ2NF90IG91dElucHV0Q1RSLCB2b2lkICpvdXREYXRhKTsKLQotcHJpdmF0ZToKLSAgICBNdXRleCBtTG9jazsKLQotICAgIGJvb2wgbUlzRW5jcnlwdGlvbk1vZHVsZTsKLQotICAgIHZvaWQgKm1MaWJIYW5kbGU7Ci0gICAgSERDUE1vZHVsZSAqbUhEQ1BNb2R1bGU7Ci0gICAgc3A8SUhEQ1BPYnNlcnZlcj4gbU9ic2VydmVyOwotCi0gICAgc3RhdGljIHZvaWQgT2JzZXJ2ZVdyYXBwZXIodm9pZCAqbWUsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0Mik7Ci0gICAgdm9pZCBvYnNlcnZlKGludCBtc2csIGludCBleHQxLCBpbnQgZXh0Mik7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhIRENQKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gSERDUF9IXwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuY3BwCmluZGV4IDY4NmMwNTkuLjEzNzZjY2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuY3BwCkBAIC0yMCw4ICsyMCw4IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCmluZGV4IDM0NDU0NjkuLjliY2ZjODMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCkBAIC01NSw2ICs1NSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvTWV0YWRhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVtb3J5TGVha1RyYWNrVXRpbC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CkBAIC03NywxMSArNzgsNyBAQAogI2luY2x1ZGUgIlRlc3RQbGF5ZXJTdHViLmgiCiAjaW5jbHVkZSAibnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaCIKIAotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVguaD4KLQotI2luY2x1ZGUgIkhEQ1AuaCIKICNpbmNsdWRlICJIVFRQQmFzZS5oIgotI2luY2x1ZGUgIlJlbW90ZURpc3BsYXkuaCIKIAogc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tSZXRyaWVzID0gNTA7CiBzdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1NsZWVwVXMgPSAyMDAwMDsKQEAgLTkzLDYgKzkwLDcgQEAKIHVzaW5nIGFuZHJvaWQ6OkJBRF9WQUxVRTsKIHVzaW5nIGFuZHJvaWQ6Ok5PVF9FTk9VR0hfREFUQTsKIHVzaW5nIGFuZHJvaWQ6OlBhcmNlbDsKK3VzaW5nIGFuZHJvaWQ6Om1lZGlhOjpWb2x1bWVTaGFwZXI7CiAKIC8vIE1heCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgZmlsdGVyLgogY29uc3QgaW50IGtNYXhGaWx0ZXJTaXplID0gNjQ7ICAvLyBJIHB1bGxlZCB0aGF0IG91dCBvZiB0aGluIGFpci4KQEAgLTMzNywyOSArMzM1LDEzIEBACiAgICAgcmV0dXJuIE1lZGlhQ29kZWNMaXN0OjpnZXRMb2NhbEluc3RhbmNlKCk7CiB9CiAKLXNwPElPTVg+IE1lZGlhUGxheWVyU2VydmljZTo6Z2V0T01YKCkgewotICAgIEFMT0dJKCJNZWRpYVBsYXllclNlcnZpY2U6OmdldE9NWCIpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobU9NWC5nZXQoKSA9PSBOVUxMKSB7Ci0gICAgICAgIG1PTVggPSBuZXcgT01YOwotICAgIH0KLQotICAgIHJldHVybiBtT01YOwotfQotCi1zcDxJSERDUD4gTWVkaWFQbGF5ZXJTZXJ2aWNlOjptYWtlSERDUChib29sIGNyZWF0ZUVuY3J5cHRpb25Nb2R1bGUpIHsKLSAgICByZXR1cm4gbmV3IEhEQ1AoY3JlYXRlRW5jcnlwdGlvbk1vZHVsZSk7Ci19Ci0KIHNwPElSZW1vdGVEaXNwbGF5PiBNZWRpYVBsYXllclNlcnZpY2U6Omxpc3RlbkZvclJlbW90ZURpc3BsYXkoCi0gICAgICAgIGNvbnN0IFN0cmluZzE2ICZvcFBhY2thZ2VOYW1lLAotICAgICAgICBjb25zdCBzcDxJUmVtb3RlRGlzcGxheUNsaWVudD4mIGNsaWVudCwgY29uc3QgU3RyaW5nOCYgaWZhY2UpIHsKLSAgICBpZiAoIWNoZWNrUGVybWlzc2lvbigiYW5kcm9pZC5wZXJtaXNzaW9uLkNPTlRST0xfV0lGSV9ESVNQTEFZIikpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQorICAgICAgICBjb25zdCBTdHJpbmcxNiAmLypvcFBhY2thZ2VOYW1lKi8sCisgICAgICAgIGNvbnN0IHNwPElSZW1vdGVEaXNwbGF5Q2xpZW50PiYgLypjbGllbnQqLywKKyAgICAgICAgY29uc3QgU3RyaW5nOCYgLyppZmFjZSovKSB7CisgICAgQUxPR0UoImxpc3RlbkZvclJlbW90ZURpc3BsYXkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCEiKTsKIAotICAgIHJldHVybiBuZXcgUmVtb3RlRGlzcGxheShvcFBhY2thZ2VOYW1lLCBjbGllbnQsIGlmYWNlLnN0cmluZygpKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0CkBAIC02MDksNiArNTkxLDcgQEAKICAgICAgICAgZnJlZShtQXVkaW9BdHRyaWJ1dGVzKTsKICAgICB9CiAgICAgY2xlYXJEZWF0aE5vdGlmaWVyc19sKCk7CisgICAgbUF1ZGlvRGV2aWNlVXBkYXRlZExpc3RlbmVyLmNsZWFyKCk7CiB9CiAKIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OmRpc2Nvbm5lY3QoKQpAQCAtNzE2LDYgKzY5OSwxNyBAQAogICAgIH0KIH0KIAordm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6QXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXI6Om9uQXVkaW9EZXZpY2VVcGRhdGUoCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8sCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIHsKKyAgICBzcDxNZWRpYVBsYXllckJhc2U+IGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBsaXN0ZW5lci0+c2VuZEV2ZW50KE1FRElBX0FVRElPX1JPVVRJTkdfQ0hBTkdFRCwgYXVkaW9JbywgZGV2aWNlSWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCJsaXN0ZW5lciBmb3IgcHJvY2VzcyAlZCBkZWF0aCBpcyBnb25lIiwgTUVESUFfQVVESU9fUk9VVElOR19DSEFOR0VEKTsKKyAgICB9Cit9CisKIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OmNsZWFyRGVhdGhOb3RpZmllcnNfbCgpIHsKICAgICBpZiAobUV4dHJhY3RvckRlYXRoTGlzdGVuZXIgIT0gbnVsbHB0cikgewogICAgICAgICBtRXh0cmFjdG9yRGVhdGhMaXN0ZW5lci0+dW5saW5rVG9EZWF0aCgpOwpAQCAtNzQ4LDM2ICs3NDIsMjUgQEAKICAgICAgICAgICAgIG5ldyBTZXJ2aWNlRGVhdGhOb3RpZmllcihiaW5kZXIsIHAsIE1FRElBRVhUUkFDVE9SX1BST0NFU1NfREVBVEgpOwogICAgIGJpbmRlci0+bGlua1RvRGVhdGgoZXh0cmFjdG9yRGVhdGhMaXN0ZW5lcik7CiAKLSAgICBzcDxTZXJ2aWNlRGVhdGhOb3RpZmllcj4gY29kZWNEZWF0aExpc3RlbmVyOwotICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5tZWRpYS50cmVibGVfb214IiwgdHJ1ZSkpIHsKLSAgICAgICAgLy8gVHJlYmxlIElPbXgKLSAgICAgICAgc3A8SU9teD4gb214ID0gSU9teDo6Z2V0U2VydmljZSgpOwotICAgICAgICBpZiAob214ID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIEFMT0dFKCJUcmVibGUgSU9teCBub3QgYXZhaWxhYmxlIik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBjb2RlY0RlYXRoTGlzdGVuZXIgPSBuZXcgU2VydmljZURlYXRoTm90aWZpZXIob214LCBwLCBNRURJQUNPREVDX1BST0NFU1NfREVBVEgpOwotICAgICAgICBvbXgtPmxpbmtUb0RlYXRoKGNvZGVjRGVhdGhMaXN0ZW5lciwgMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gTGVnYWN5IElPTVgKLSAgICAgICAgYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmNvZGVjIikpOwotICAgICAgICBpZiAoYmluZGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJjb2RlYyBzZXJ2aWNlIG5vdCBhdmFpbGFibGUiKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGNvZGVjRGVhdGhMaXN0ZW5lciA9IG5ldyBTZXJ2aWNlRGVhdGhOb3RpZmllcihiaW5kZXIsIHAsIE1FRElBQ09ERUNfUFJPQ0VTU19ERUFUSCk7Ci0gICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgoY29kZWNEZWF0aExpc3RlbmVyKTsKKyAgICBzcDxJT214PiBvbXggPSBJT214OjpnZXRTZXJ2aWNlKCk7CisgICAgaWYgKG9teCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJT214IHNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CisgICAgc3A8U2VydmljZURlYXRoTm90aWZpZXI+IGNvZGVjRGVhdGhMaXN0ZW5lciA9CisgICAgICAgICAgICBuZXcgU2VydmljZURlYXRoTm90aWZpZXIob214LCBwLCBNRURJQUNPREVDX1BST0NFU1NfREVBVEgpOworICAgIG9teC0+bGlua1RvRGVhdGgoY29kZWNEZWF0aExpc3RlbmVyLCAwKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKIAogICAgIGNsZWFyRGVhdGhOb3RpZmllcnNfbCgpOwogICAgIG1FeHRyYWN0b3JEZWF0aExpc3RlbmVyID0gZXh0cmFjdG9yRGVhdGhMaXN0ZW5lcjsKICAgICBtQ29kZWNEZWF0aExpc3RlbmVyID0gY29kZWNEZWF0aExpc3RlbmVyOworICAgIG1BdWRpb0RldmljZVVwZGF0ZWRMaXN0ZW5lciA9IG5ldyBBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcihwKTsKIAogICAgIGlmICghcC0+aGFyZHdhcmVPdXRwdXQoKSkgewogICAgICAgICBtQXVkaW9PdXRwdXQgPSBuZXcgQXVkaW9PdXRwdXQobUF1ZGlvU2Vzc2lvbklkLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCksCi0gICAgICAgICAgICAgICAgbVBpZCwgbUF1ZGlvQXR0cmlidXRlcyk7CisgICAgICAgICAgICAgICAgbVBpZCwgbUF1ZGlvQXR0cmlidXRlcywgbUF1ZGlvRGV2aWNlVXBkYXRlZExpc3RlbmVyKTsKICAgICAgICAgc3RhdGljX2Nhc3Q8TWVkaWFQbGF5ZXJJbnRlcmZhY2UqPihwLmdldCgpKS0+c2V0QXVkaW9TaW5rKG1BdWRpb091dHB1dCk7CiAgICAgfQogCkBAIC05MDcsNyArODkwLDcgQEAKIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OnNldERhdGFTb3VyY2UoCiAgICAgICAgIGNvbnN0IHNwPElEYXRhU291cmNlPiAmc291cmNlKSB7Ci0gICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9IERhdGFTb3VyY2U6OkNyZWF0ZUZyb21JRGF0YVNvdXJjZShzb3VyY2UpOworICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPSBDcmVhdGVEYXRhU291cmNlRnJvbUlEYXRhU291cmNlKHNvdXJjZSk7CiAgICAgcGxheWVyX3R5cGUgcGxheWVyVHlwZSA9IE1lZGlhUGxheWVyRmFjdG9yeTo6Z2V0UGxheWVyVHlwZSh0aGlzLCBkYXRhU291cmNlKTsKICAgICBzcDxNZWRpYVBsYXllckJhc2U+IHAgPSBzZXREYXRhU291cmNlX3ByZShwbGF5ZXJUeXBlKTsKICAgICBpZiAocCA9PSBOVUxMKSB7CkBAIC0xMDY0LDE4ICsxMDQ3LDE4IEBACiAgICAgcmV0dXJuIHAtPnNldEJ1ZmZlcmluZ1NldHRpbmdzKGJ1ZmZlcmluZyk7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpnZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MoCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6Z2V0QnVmZmVyaW5nU2V0dGluZ3MoCiAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykKIHsKICAgICBzcDxNZWRpYVBsYXllckJhc2U+IHAgPSBnZXRQbGF5ZXIoKTsKICAgICAvLyBUT0RPOiBjcmVhdGUgbVBsYXllciBvbiBkZW1hbmQuCiAgICAgaWYgKHAgPT0gMCkgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgc3RhdHVzX3QgcmV0ID0gcC0+Z2V0RGVmYXVsdEJ1ZmZlcmluZ1NldHRpbmdzKGJ1ZmZlcmluZyk7CisgICAgc3RhdHVzX3QgcmV0ID0gcC0+Z2V0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nKTsKICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dWKCJbJWRdIGdldERlZmF1bHRCdWZmZXJpbmdTZXR0aW5nc3slc30iLAorICAgICAgICBBTE9HVigiWyVkXSBnZXRCdWZmZXJpbmdTZXR0aW5nc3slc30iLAogICAgICAgICAgICAgICAgIG1Db25uSWQsIGJ1ZmZlcmluZy0+dG9TdHJpbmcoKS5zdHJpbmcoKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlslZF0gZ2V0RGVmYXVsdEJ1ZmZlcmluZ1NldHRpbmdzIHJldHVybmVkICVkIiwgbUNvbm5JZCwgcmV0KTsKKyAgICAgICAgQUxPR0UoIlslZF0gZ2V0QnVmZmVyaW5nU2V0dGluZ3MgcmV0dXJuZWQgJWQiLCBtQ29ubklkLCByZXQpOwogICAgIH0KICAgICByZXR1cm4gcmV0OwogfQpAQCAtMTI4Miw2ICsxMjY1LDE0IEBACiAgICAgcmV0dXJuIHAtPnJlc2V0KCk7CiB9CiAKK3N0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50Ojpub3RpZnlBdChpbnQ2NF90IG1lZGlhVGltZVVzKQoreworICAgIEFMT0dWKCJbJWRdIG5vdGlmeUF0KCVsbGQpIiwgbUNvbm5JZCwgKGxvbmcgbG9uZyltZWRpYVRpbWVVcyk7CisgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiBwID0gZ2V0UGxheWVyKCk7CisgICAgaWYgKHAgPT0gMCkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgcmV0dXJuIHAtPm5vdGlmeUF0KG1lZGlhVGltZVVzKTsKK30KKwogc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OnNldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHR5cGUpCiB7CiAgICAgQUxPR1YoIlslZF0gc2V0QXVkaW9TdHJlYW1UeXBlKCVkKSIsIG1Db25uSWQsIHR5cGUpOwpAQCAtMTUzNCw2ICsxNTI1LDQyIEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAorc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OnNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKQoreworICAgIEFMT0dWKCJbJWRdIHNldE91dHB1dERldmljZSIsIG1Db25uSWQpOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICBpZiAobUF1ZGlvT3V0cHV0LmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPnNldE91dHB1dERldmljZShkZXZpY2VJZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCkKK3sKKyAgICBBTE9HVigiWyVkXSBnZXRSb3V0ZWREZXZpY2VJZCIsIG1Db25uSWQpOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICBpZiAobUF1ZGlvT3V0cHV0LmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPmdldFJvdXRlZERldmljZUlkKGRldmljZUlkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OmVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKQoreworICAgIEFMT0dWKCJbJWRdIGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2ssICVkIiwgbUNvbm5JZCwgZW5hYmxlZCk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgICAgIGlmIChtQXVkaW9PdXRwdXQuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIG1BdWRpb091dHB1dC0+ZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhlbmFibGVkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKwogI2lmIENBTExCQUNLX0FOVEFHT05JWkVSCiBjb25zdCBpbnQgQW50YWdvbml6ZXI6OmludGVydmFsID0gMTAwMDA7IC8vIDEwIG1zZWNzCiAKQEAgLTE1NzIsNyArMTU5OSw3IEBACiAjdW5kZWYgTE9HX1RBRwogI2RlZmluZSBMT0dfVEFHICJBdWRpb1NpbmsiCiBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpBdWRpb091dHB1dChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLCB1aWRfdCB1aWQsIGludCBwaWQsCi0gICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogYXR0cikKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBhdHRyLCBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGRldmljZUNhbGxiYWNrKQogICAgIDogbUNhbGxiYWNrKE5VTEwpLAogICAgICAgbUNhbGxiYWNrQ29va2llKE5VTEwpLAogICAgICAgbUNhbGxiYWNrRGF0YShOVUxMKSwKQEAgLTE1ODksNyArMTYxNiwxMSBAQAogICAgICAgbVNlbmRMZXZlbCgwLjApLAogICAgICAgbUF1eEVmZmVjdElkKDApLAogICAgICAgbUZsYWdzKEFVRElPX09VVFBVVF9GTEFHX05PTkUpLAotICAgICAgbVZvbHVtZUhhbmRsZXIobmV3IFZvbHVtZUhhbmRsZXIoKSkKKyAgICAgIG1Wb2x1bWVIYW5kbGVyKG5ldyBtZWRpYTo6Vm9sdW1lSGFuZGxlcigpKSwKKyAgICAgIG1TZWxlY3RlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAorICAgICAgbVJvdXRlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAorICAgICAgbURldmljZUNhbGxiYWNrRW5hYmxlZChmYWxzZSksCisgICAgICBtRGV2aWNlQ2FsbGJhY2soZGV2aWNlQ2FsbGJhY2spCiB7CiAgICAgQUxPR1YoIkF1ZGlvT3V0cHV0KCVkKSIsIHNlc3Npb25JZCk7CiAgICAgaWYgKGF0dHIgIT0gTlVMTCkgewpAQCAtMTk3NSw3ICsyMDA2LDkgQEAKICAgICAgICAgICAgICAgICAgICAgbVVpZCwKICAgICAgICAgICAgICAgICAgICAgbVBpZCwKICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgIGRvTm90UmVjb25uZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgZG9Ob3RSZWNvbm5lY3QsCisgICAgICAgICAgICAgICAgICAgIDEuMGYsICAvLyBkZWZhdWx0IHZhbHVlIGZvciBtYXhSZXF1aXJlZFNwZWVkCisgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZERldmljZUlkKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIFRPRE86IER1ZSB0byBidWZmZXIgbWVtb3J5IGNvbmNlcm5zLCB3ZSB1c2UgYSBtYXggdGFyZ2V0IHBsYXliYWNrIHNwZWVkCiAgICAgICAgICAgICAvLyBiYXNlZCBvbiBtUGxheWJhY2tSYXRlIGF0IHRoZSB0aW1lIG9mIG9wZW4gKGluc3RlYWQgb2Yga01heFJlcXVpcmVkU3BlZWQpLApAQCAtMjAwMiw3ICsyMDM1LDggQEAKICAgICAgICAgICAgICAgICAgICAgbVBpZCwKICAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICAgICAgIGRvTm90UmVjb25uZWN0LAotICAgICAgICAgICAgICAgICAgICB0YXJnZXRTcGVlZCk7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldFNwZWVkLAorICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWREZXZpY2VJZCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoKHQgPT0gMCkgfHwgKHQtPmluaXRDaGVjaygpICE9IE5PX0VSUk9SKSkgewpAQCAtMjA5Niw2ICsyMTMwLDEwIEBACiAgICAgICAgICAgICByZXMgPSBtVHJhY2stPmF0dGFjaEF1eEVmZmVjdChtQXV4RWZmZWN0SWQpOwogICAgICAgICB9CiAgICAgfQorICAgIG1UcmFjay0+c2V0T3V0cHV0RGV2aWNlKG1TZWxlY3RlZERldmljZUlkKTsKKyAgICBpZiAobURldmljZUNhbGxiYWNrRW5hYmxlZCkgeworICAgICAgICBtVHJhY2stPmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrLnByb21vdGUoKSk7CisgICAgfQogICAgIEFMT0dWKCJ1cGRhdGVUcmFjaygpIERPTkUgc3RhdHVzICVkIiwgcmVzKTsKICAgICByZXR1cm4gcmVzOwogfQpAQCAtMjMxMSw2ICsyMzQ5LDQ1IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkKK3sKKyAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCVkKSIsIGRldmljZUlkKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgbVNlbGVjdGVkRGV2aWNlSWQgPSBkZXZpY2VJZDsKKyAgICBpZiAobVRyYWNrICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1UcmFjay0+c2V0T3V0cHV0RGV2aWNlKGRldmljZUlkKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCkKK3sKKyAgICBBTE9HVigiZ2V0Um91dGVkRGV2aWNlSWQiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1UcmFjayAhPSAwKSB7CisgICAgICAgIG1Sb3V0ZWREZXZpY2VJZCA9IG1UcmFjay0+Z2V0Um91dGVkRGV2aWNlSWQoKTsKKyAgICB9CisgICAgKmRldmljZUlkID0gbVJvdXRlZERldmljZUlkOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6ZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpCit7CisgICAgQUxPR1YoImVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2ssICVkIiwgZW5hYmxlZCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIG1EZXZpY2VDYWxsYmFja0VuYWJsZWQgPSBlbmFibGVkOworICAgIGlmIChtVHJhY2sgIT0gMCkgeworICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBtVHJhY2stPmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrLnByb21vdGUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBtVHJhY2stPnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrLnByb21vdGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCiBWb2x1bWVTaGFwZXI6OlN0YXR1cyBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjphcHBseVZvbHVtZVNoYXBlcigKICAgICAgICAgICAgICAgICBjb25zdCBzcDxWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCmluZGV4IDM0ZTVlMmEuLmJmYjdjYzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKQEAgLTc3LDggKzc3LDEyIEBACiAgICAgICAgIGNsYXNzIENhbGxiYWNrRGF0YTsKIAogICAgICBwdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvT3V0cHV0KGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsIHVpZF90IHVpZCwgaW50IHBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKiBhdHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9PdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKiBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgZGV2aWNlQ2FsbGJhY2spOwogICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+QXVkaW9PdXRwdXQoKTsKIAogICAgICAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICByZWFkeSgpIGNvbnN0IHsgcmV0dXJuIG1UcmFjayAhPSAwOyB9CkBAIC0xMzEsMTAgKzEzNSwxNSBAQAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwogICAgICAgICB2aXJ0dWFsIFN0cmluZzggICAgICAgICBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpOwogCi0gICAgICAgIHZpcnR1YWwgVm9sdW1lU2hhcGVyOjpTdGF0dXMgYXBwbHlWb2x1bWVTaGFwZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbikgb3ZlcnJpZGU7Ci0gICAgICAgIHZpcnR1YWwgc3A8Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gZ2V0Vm9sdW1lU2hhcGVyU3RhdGUoaW50IGlkKSBvdmVycmlkZTsKKyAgICAgICAgdmlydHVhbCBtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0dXMgYXBwbHlWb2x1bWVTaGFwZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKSBvdmVycmlkZTsKKyAgICAgICAgdmlydHVhbCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gZ2V0Vm9sdW1lU2hhcGVyU3RhdGUoaW50IGlkKSBvdmVycmlkZTsKKworICAgICAgICAvLyBBdWRpb1JvdXRpbmcKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKIAogICAgIHByaXZhdGU6CiAgICAgICAgIHN0YXRpYyB2b2lkICAgICAgICAgICAgIHNldE1pbkJ1ZmZlckNvdW50KCk7CkBAIC0xNjQsNyArMTczLDExIEBACiAgICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1TZW5kTGV2ZWw7CiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1BdXhFZmZlY3RJZDsKICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgICAgbUZsYWdzOwotICAgICAgICBzcDxWb2x1bWVIYW5kbGVyPiAgICAgICBtVm9sdW1lSGFuZGxlcjsKKyAgICAgICAgc3A8bWVkaWE6OlZvbHVtZUhhbmRsZXI+ICAgICAgIG1Wb2x1bWVIYW5kbGVyOworICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtU2VsZWN0ZWREZXZpY2VJZDsKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbVJvdXRlZERldmljZUlkOworICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICBtRGV2aWNlQ2FsbGJhY2tFbmFibGVkOworICAgICAgICB3cDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4gICAgICAgIG1EZXZpY2VDYWxsYmFjazsKICAgICAgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgbUxvY2s7CiAKICAgICAgICAgLy8gc3RhdGljIHZhcmlhYmxlcyBiZWxvdyBub3QgcHJvdGVjdGVkIGJ5IG11dGV4CkBAIC0yMjYsOCArMjM5LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb25JZCk7CiAKICAgICB2aXJ0dWFsIHNwPElNZWRpYUNvZGVjTGlzdD4gZ2V0Q29kZWNMaXN0KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzcDxJT01YPiAgICAgICAgICAgIGdldE9NWCgpOwotICAgIHZpcnR1YWwgc3A8SUhEQ1A+ICAgICAgICAgICBtYWtlSERDUChib29sIGNyZWF0ZUVuY3J5cHRpb25Nb2R1bGUpOwogCiAgICAgdmlydHVhbCBzcDxJUmVtb3RlRGlzcGxheT4gbGlzdGVuRm9yUmVtb3RlRGlzcGxheShjb25zdCBTdHJpbmcxNiAmb3BQYWNrYWdlTmFtZSwKICAgICAgICAgICAgIGNvbnN0IHNwPElSZW1vdGVEaXNwbGF5Q2xpZW50PiYgY2xpZW50LCBjb25zdCBTdHJpbmc4JiBpZmFjZSk7CkBAIC0zMDcsNyArMzE4LDcgQEAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0VmlkZW9TdXJmYWNlVGV4dHVyZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgYnVmZmVyUHJvZHVjZXIpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSBvdmVycmlkZTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0RGVmYXVsdEJ1ZmZlcmluZ1NldHRpbmdzKAorICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRCdWZmZXJpbmdTZXR0aW5ncygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBwcmVwYXJlQXN5bmMoKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc3RhcnQoKTsKQEAgLTMyNSw2ICszMzYsNyBAQAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRDdXJyZW50UG9zaXRpb24oaW50KiBtc2VjKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0RHVyYXRpb24oaW50KiBtc2VjKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgbm90aWZ5QXQoaW50NjRfdCBtZWRpYVRpbWVVcyk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHR5cGUpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRMb29waW5nKGludCBsb29wKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0Vm9sdW1lKGZsb2F0IGxlZnRWb2x1bWUsIGZsb2F0IHJpZ2h0Vm9sdW1lKTsKQEAgLTM0MSwxMCArMzUzLDEwIEBACiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldFJldHJhbnNtaXRFbmRwb2ludChzdHJ1Y3Qgc29ja2FkZHJfaW4qIGVuZHBvaW50KTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0TmV4dFBsYXllcihjb25zdCBzcDxJTWVkaWFQbGF5ZXI+JiBwbGF5ZXIpOwogCi0gICAgICAgIHZpcnR1YWwgVm9sdW1lU2hhcGVyOjpTdGF0dXMgYXBwbHlWb2x1bWVTaGFwZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbikgb3ZlcnJpZGU7Ci0gICAgICAgIHZpcnR1YWwgc3A8Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gZ2V0Vm9sdW1lU2hhcGVyU3RhdGUoaW50IGlkKSBvdmVycmlkZTsKKyAgICAgICAgdmlydHVhbCBtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0dXMgYXBwbHlWb2x1bWVTaGFwZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKSBvdmVycmlkZTsKKyAgICAgICAgdmlydHVhbCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gZ2V0Vm9sdW1lU2hhcGVyU3RhdGUoaW50IGlkKSBvdmVycmlkZTsKIAogICAgICAgICBzcDxNZWRpYVBsYXllckJhc2U+ICAgICBjcmVhdGVQbGF5ZXIocGxheWVyX3R5cGUgcGxheWVyVHlwZSk7CiAKQEAgLTM3Miw2ICszODQsMTAgQEAKICAgICAgICAgLy8gTW9kdWxhciBEUk0KICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgZHJtU2Vzc2lvbklkKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlRHJtKCk7CisgICAgICAgIC8vIEF1ZGlvUm91dGluZworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpOwogCiAgICAgcHJpdmF0ZToKICAgICAgICAgY2xhc3MgU2VydmljZURlYXRoTm90aWZpZXI6CkBAIC00MDEsNiArNDE3LDIxIEBACiAgICAgICAgICAgICB3cDxNZWRpYVBsYXllckJhc2U+IG1MaXN0ZW5lcjsKICAgICAgICAgfTsKIAorICAgICAgICBjbGFzcyBBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcjogcHVibGljIEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrCisgICAgICAgIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgQXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlPiYgbGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH5BdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcigpIHt9CisKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvRGV2aWNlVXBkYXRlKGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgd3A8TWVkaWFQbGF5ZXJCYXNlPiBtTGlzdGVuZXI7CisgICAgICAgIH07CisKICAgICAgICAgdm9pZCBjbGVhckRlYXRoTm90aWZpZXJzX2woKTsKIAogICAgICAgICBmcmllbmQgY2xhc3MgTWVkaWFQbGF5ZXJTZXJ2aWNlOwpAQCAtNDc5LDYgKzUxMCw3IEBACiAKICAgICAgICAgc3A8U2VydmljZURlYXRoTm90aWZpZXI+IG1FeHRyYWN0b3JEZWF0aExpc3RlbmVyOwogICAgICAgICBzcDxTZXJ2aWNlRGVhdGhOb3RpZmllcj4gbUNvZGVjRGVhdGhMaXN0ZW5lcjsKKyAgICAgICAgc3A8QXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXI+IG1BdWRpb0RldmljZVVwZGF0ZWRMaXN0ZW5lcjsKICNpZiBDQUxMQkFDS19BTlRBR09OSVpFUgogICAgICAgICAgICAgICAgICAgICBBbnRhZ29uaXplciogICAgICAgICAgICAgICAgICBtQW50YWdvbml6ZXI7CiAjZW5kaWYKQEAgLTQ5Myw3ICs1MjUsNiBAQAogICAgICAgICAgICAgICAgIFNvcnRlZFZlY3Rvcjwgd3A8Q2xpZW50PiA+ICBtQ2xpZW50czsKICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8IHdwPE1lZGlhUmVjb3JkZXJDbGllbnQ+ID4gbU1lZGlhUmVjb3JkZXJDbGllbnRzOwogICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBtTmV4dENvbm5JZDsKLSAgICAgICAgICAgICAgICBzcDxJT01YPiAgICAgICAgICAgICAgICAgICAgbU9NWDsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcAppbmRleCA5YjliM2JiLi40MjA2NjQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCkBAIC00MTEsNiArNDExLDI1IEBACiAgICAgfQogfQogCitNZWRpYVJlY29yZGVyQ2xpZW50OjpBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcjo6QXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXIoCisgICAgICAgIGNvbnN0IHNwPElNZWRpYVJlY29yZGVyQ2xpZW50PiYgbGlzdGVuZXIpIHsKKyAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKK30KKworTWVkaWFSZWNvcmRlckNsaWVudDo6QXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXI6On5BdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcigpIHsKK30KKwordm9pZCBNZWRpYVJlY29yZGVyQ2xpZW50OjpBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcjo6b25BdWRpb0RldmljZVVwZGF0ZSgKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbywKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgeworICAgIHNwPElNZWRpYVJlY29yZGVyQ2xpZW50PiBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7CisgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgbGlzdGVuZXItPm5vdGlmeShNRURJQV9SRUNPUkRFUl9BVURJT19ST1VUSU5HX0NIQU5HRUQsIGF1ZGlvSW8sIGRldmljZUlkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVygibGlzdGVuZXIgZm9yIHByb2Nlc3MgJWQgZGVhdGggaXMgZ29uZSIsIE1FRElBX1JFQ09SREVSX0FVRElPX1JPVVRJTkdfQ0hBTkdFRCk7CisgICAgfQorfQorCiB2b2lkIE1lZGlhUmVjb3JkZXJDbGllbnQ6OmNsZWFyRGVhdGhOb3RpZmllcnNfbCgpIHsKICAgICBpZiAobUNhbWVyYURlYXRoTGlzdGVuZXIgIT0gbnVsbHB0cikgewogICAgICAgICBtQ2FtZXJhRGVhdGhMaXN0ZW5lci0+dW5saW5rVG9EZWF0aCgpOwpAQCAtNDUwLDI3ICs0NjksMTcgQEAKICAgICB9CiAgICAgc0NhbWVyYUNoZWNrZWQgPSB0cnVlOwogCi0gICAgaWYgKHByb3BlcnR5X2dldF9ib29sKCJwZXJzaXN0Lm1lZGlhLnRyZWJsZV9vbXgiLCB0cnVlKSkgewotICAgICAgICAvLyBUcmVibGUgSU9teAotICAgICAgICBzcDxJT214PiBvbXggPSBJT214OjpnZXRTZXJ2aWNlKCk7Ci0gICAgICAgIGlmIChvbXggPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0UoIlRyZWJsZSBJT214IG5vdCBhdmFpbGFibGUiKTsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0gICAgICAgIG1Db2RlY0RlYXRoTGlzdGVuZXIgPSBuZXcgU2VydmljZURlYXRoTm90aWZpZXIob214LCBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICBNZWRpYVBsYXllclNlcnZpY2U6Ok1FRElBQ09ERUNfUFJPQ0VTU19ERUFUSCk7Ci0gICAgICAgIG9teC0+bGlua1RvRGVhdGgobUNvZGVjRGVhdGhMaXN0ZW5lciwgMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gTGVnYWN5IElPTVgKLSAgICAgICAgYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmNvZGVjIikpOwotICAgICAgICBpZiAoYmluZGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBjb25uZWN0IHRvIG1lZGlhIGNvZGVjIHNlcnZpY2UiKTsKLSAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIH0KLSAgICAgICAgbUNvZGVjRGVhdGhMaXN0ZW5lciA9IG5ldyBTZXJ2aWNlRGVhdGhOb3RpZmllcihiaW5kZXIsIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyU2VydmljZTo6TUVESUFDT0RFQ19QUk9DRVNTX0RFQVRIKTsKLSAgICAgICAgYmluZGVyLT5saW5rVG9EZWF0aChtQ29kZWNEZWF0aExpc3RlbmVyKTsKKyAgICBzcDxJT214PiBvbXggPSBJT214OjpnZXRTZXJ2aWNlKCk7CisgICAgaWYgKG9teCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJT214IHNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZSIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CisgICAgbUNvZGVjRGVhdGhMaXN0ZW5lciA9IG5ldyBTZXJ2aWNlRGVhdGhOb3RpZmllcihvbXgsIGxpc3RlbmVyLAorICAgICAgICAgICAgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpNRURJQUNPREVDX1BST0NFU1NfREVBVEgpOworICAgIG9teC0+bGlua1RvRGVhdGgobUNvZGVjRGVhdGhMaXN0ZW5lciwgMCk7CisKKyAgICBtQXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXIgPSBuZXcgQXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXIobGlzdGVuZXIpOworICAgIG1SZWNvcmRlci0+c2V0QXVkaW9EZXZpY2VDYWxsYmFjayhtQXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXIpOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtNDkyLDQgKzUwMSw0MCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgTWVkaWFSZWNvcmRlckNsaWVudDo6c2V0SW5wdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgeworICAgIEFMT0dWKCJzZXRJbnB1dERldmljZSglZCkiLCBkZXZpY2VJZCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtUmVjb3JkZXIgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gbVJlY29yZGVyLT5zZXRJbnB1dERldmljZShkZXZpY2VJZCk7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCitzdGF0dXNfdCBNZWRpYVJlY29yZGVyQ2xpZW50OjpnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCkgeworICAgIEFMT0dWKCJnZXRSb3V0ZWREZXZpY2VJZCIpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVJlY29yZGVyICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIG1SZWNvcmRlci0+Z2V0Um91dGVkRGV2aWNlSWQoZGV2aWNlSWQpOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKworc3RhdHVzX3QgTWVkaWFSZWNvcmRlckNsaWVudDo6ZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpIHsKKyAgICBBTE9HVigiZW5hYmxlRGV2aWNlQ2FsbGJhY2s6ICVkIiwgZW5hYmxlZCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtUmVjb3JkZXIgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gbVJlY29yZGVyLT5lbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGVuYWJsZWQpOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKworc3RhdHVzX3QgTWVkaWFSZWNvcmRlckNsaWVudDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKSB7CisgICAgQUxPR1YoImdldEFjdGl2ZU1pY3JvcGhvbmVzIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtUmVjb3JkZXIgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gbVJlY29yZGVyLT5nZXRBY3RpdmVNaWNyb3Bob25lcyhhY3RpdmVNaWNyb3Bob25lcyk7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oCmluZGV4IDcxMWRiMmMuLmQyZTY4MWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuaApAQCAtMTgsNiArMTgsNyBAQAogI2lmbmRlZiBBTkRST0lEX01FRElBUkVDT1JERVJDTElFTlRfSAogI2RlZmluZSBBTkRST0lEX01FRElBUkVDT1JERVJDTElFTlRfSAogCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFSZWNvcmRlci5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXguaD4KQEAgLTU4LDYgKzU5LDE4IEBACiAgICAgICAgIHdwPElNZWRpYVJlY29yZGVyQ2xpZW50PiBtTGlzdGVuZXI7CiAgICAgfTsKIAorICAgIGNsYXNzIEF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyOiBwdWJsaWMgQXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2sKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcihjb25zdCBzcDxJTWVkaWFSZWNvcmRlckNsaWVudD4mIGxpc3RlbmVyKTsKKyAgICAgICAgdmlydHVhbCB+QXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXIoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9EZXZpY2VVcGRhdGUoCisgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbywKKyAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKKyAgICBwcml2YXRlOgorICAgICAgICB3cDxJTWVkaWFSZWNvcmRlckNsaWVudD4gbUxpc3RlbmVyOworICAgIH07CisKICAgICB2b2lkIGNsZWFyRGVhdGhOb3RpZmllcnNfbCgpOwogCiBwdWJsaWM6CkBAIC05MSw2ICsxMDQsMTEgQEAKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgIHNldElucHV0U3VyZmFjZShjb25zdCBzcDxQZXJzaXN0ZW50U3VyZmFjZT4mIHN1cmZhY2UpOwogICAgIHZpcnR1YWwgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHF1ZXJ5U3VyZmFjZU1lZGlhU291cmNlKCk7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBzZXRJbnB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgIGdldFJvdXRlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QqIGRldmljZUlkKTsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgIGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgIGdldEFjdGl2ZU1pY3JvcGhvbmVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpOwogCiBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyAgICAgICAgICAgTWVkaWFQbGF5ZXJTZXJ2aWNlOyAgLy8gZm9yIGFjY2Vzc2luZyBwcml2YXRlIGNvbnN0cnVjdG9yCkBAIC0xMDMsNiArMTIxLDcgQEAKIAogICAgIHNwPFNlcnZpY2VEZWF0aE5vdGlmaWVyPiBtQ2FtZXJhRGVhdGhMaXN0ZW5lcjsKICAgICBzcDxTZXJ2aWNlRGVhdGhOb3RpZmllcj4gbUNvZGVjRGVhdGhMaXN0ZW5lcjsKKyAgICBzcDxBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcj4gbUF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyOwogCiAgICAgcGlkX3QgICAgICAgICAgICAgICAgICBtUGlkOwogICAgIE11dGV4ICAgICAgICAgICAgICAgICAgbUxvY2s7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcAppbmRleCA1YTQ2OGYzLi40MGIxN2JmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAKQEAgLTMxLDEwICszMSwxMSBAQAogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oPgogI2luY2x1ZGUgIk1ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmgiCkBAIC00Nyw3ICs0OCw2IEBACiB7CiAgICAgQUxPR1YoIk1ldGFkYXRhUmV0cmlldmVyQ2xpZW50IGNvbnN0cnVjdG9yIHBpZCglZCkiLCBwaWQpOwogICAgIG1QaWQgPSBwaWQ7Ci0gICAgbVRodW1ibmFpbCA9IE5VTEw7CiAgICAgbUFsYnVtQXJ0ID0gTlVMTDsKICAgICBtUmV0cmlldmVyID0gTlVMTDsKIH0KQEAgLTc2LDcgKzc2LDYgQEAKICAgICBBTE9HVigiZGlzY29ubmVjdCBmcm9tIHBpZCAlZCIsIG1QaWQpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBtUmV0cmlldmVyLmNsZWFyKCk7Ci0gICAgbVRodW1ibmFpbC5jbGVhcigpOwogICAgIG1BbGJ1bUFydC5jbGVhcigpOwogICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKIH0KQEAgLTE4MCw3ICsxNzksNyBAQAogICAgIEFMT0dWKCJzZXREYXRhU291cmNlKElEYXRhU291cmNlKSIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKIAotICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPSBEYXRhU291cmNlOjpDcmVhdGVGcm9tSURhdGFTb3VyY2Uoc291cmNlKTsKKyAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gQ3JlYXRlRGF0YVNvdXJjZUZyb21JRGF0YVNvdXJjZShzb3VyY2UpOwogICAgIHBsYXllcl90eXBlIHBsYXllclR5cGUgPQogICAgICAgICBNZWRpYVBsYXllckZhY3Rvcnk6OmdldFBsYXllclR5cGUoTlVMTCAvKiBjbGllbnQgKi8sIGRhdGFTb3VyY2UpOwogICAgIEFMT0dWKCJwbGF5ZXIgdHlwZSA9ICVkIiwgcGxheWVyVHlwZSk7CkBAIC0yMDAsMzQgKzE5OSw3NCBAQAogICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lVXMsIG9wdGlvbiwgY29sb3JGb3JtYXQsIG1ldGFPbmx5KTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGdsb2NrKHNMb2NrKTsKLSAgICBtVGh1bWJuYWlsLmNsZWFyKCk7CiAgICAgaWYgKG1SZXRyaWV2ZXIgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgicmV0cmlldmVyIGlzIG5vdCBpbml0aWFsaXplZCIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgVmlkZW9GcmFtZSAqZnJhbWUgPSBtUmV0cmlldmVyLT5nZXRGcmFtZUF0VGltZSgKLSAgICAgICAgICAgIHRpbWVVcywgb3B0aW9uLCBjb2xvckZvcm1hdCwgbWV0YU9ubHkpOworICAgIHNwPElNZW1vcnk+IGZyYW1lID0gbVJldHJpZXZlci0+Z2V0RnJhbWVBdFRpbWUodGltZVVzLCBvcHRpb24sIGNvbG9yRm9ybWF0LCBtZXRhT25seSk7CiAgICAgaWYgKGZyYW1lID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBjYXB0dXJlIGEgdmlkZW8gZnJhbWUiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHNpemVfdCBzaXplID0gZnJhbWUtPmdldEZsYXR0ZW5lZFNpemUoKTsKLSAgICBzcDxNZW1vcnlIZWFwQmFzZT4gaGVhcCA9IG5ldyBNZW1vcnlIZWFwQmFzZShzaXplLCAwLCAiTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQiKTsKLSAgICBpZiAoaGVhcCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gY3JlYXRlIE1lbW9yeURlYWxlciIpOwotICAgICAgICBkZWxldGUgZnJhbWU7CisgICAgcmV0dXJuIGZyYW1lOworfQorCitzcDxJTWVtb3J5PiBNZXRhZGF0YVJldHJpZXZlckNsaWVudDo6Z2V0SW1hZ2VBdEluZGV4KAorICAgICAgICBpbnQgaW5kZXgsIGludCBjb2xvckZvcm1hdCwgYm9vbCBtZXRhT25seSwgYm9vbCB0aHVtYm5haWwpIHsKKyAgICBBTE9HVigiZ2V0SW1hZ2VBdEluZGV4OiBpbmRleCglZCkgY29sb3JGb3JtYXQoJWQpLCBtZXRhT25seSglZCkgdGh1bWJuYWlsKCVkKSIsCisgICAgICAgICAgICBpbmRleCwgY29sb3JGb3JtYXQsIG1ldGFPbmx5LCB0aHVtYm5haWwpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgZ2xvY2soc0xvY2spOworICAgIGlmIChtUmV0cmlldmVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoInJldHJpZXZlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIG1UaHVtYm5haWwgPSBuZXcgTWVtb3J5QmFzZShoZWFwLCAwLCBzaXplKTsKLSAgICBpZiAobVRodW1ibmFpbCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJub3QgZW5vdWdoIG1lbW9yeSBmb3IgVmlkZW9GcmFtZSBzaXplPSV6dSIsIHNpemUpOwotICAgICAgICBkZWxldGUgZnJhbWU7CisgICAgc3A8SU1lbW9yeT4gZnJhbWUgPSBtUmV0cmlldmVyLT5nZXRJbWFnZUF0SW5kZXgoaW5kZXgsIGNvbG9yRm9ybWF0LCBtZXRhT25seSwgdGh1bWJuYWlsKTsKKyAgICBpZiAoZnJhbWUgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGV4dHJhY3QgaW1hZ2UiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIFZpZGVvRnJhbWUgKmZyYW1lQ29weSA9IHN0YXRpY19jYXN0PFZpZGVvRnJhbWUgKj4obVRodW1ibmFpbC0+cG9pbnRlcigpKTsKLSAgICBmcmFtZUNvcHktPmNvcHlGbGF0dGVuZWQoKmZyYW1lKTsKLSAgICBkZWxldGUgZnJhbWU7ICAvLyBGaXggbWVtb3J5IGxlYWthZ2UKLSAgICByZXR1cm4gbVRodW1ibmFpbDsKKyAgICByZXR1cm4gZnJhbWU7Cit9CisKK3NwPElNZW1vcnk+IE1ldGFkYXRhUmV0cmlldmVyQ2xpZW50OjpnZXRJbWFnZVJlY3RBdEluZGV4KAorICAgICAgICBpbnQgaW5kZXgsIGludCBjb2xvckZvcm1hdCwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkgeworICAgIEFMT0dWKCJnZXRJbWFnZVJlY3RBdEluZGV4OiBpbmRleCglZCkgY29sb3JGb3JtYXQoJWQpLCByZWN0IHslZCwgJWQsICVkLCAlZH0iLAorICAgICAgICAgICAgaW5kZXgsIGNvbG9yRm9ybWF0LCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgZ2xvY2soc0xvY2spOworICAgIGlmIChtUmV0cmlldmVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoInJldHJpZXZlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHNwPElNZW1vcnk+IGZyYW1lID0gbVJldHJpZXZlci0+Z2V0SW1hZ2VSZWN0QXRJbmRleCgKKyAgICAgICAgICAgIGluZGV4LCBjb2xvckZvcm1hdCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICBpZiAoZnJhbWUgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGV4dHJhY3QgaW1hZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBmcmFtZTsKK30KKworc3RhdHVzX3QgTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQ6OmdldEZyYW1lQXRJbmRleCgKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNwPElNZW1vcnk+ID4gKmZyYW1lcywKKyAgICAgICAgICAgIGludCBmcmFtZUluZGV4LCBpbnQgbnVtRnJhbWVzLCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHkpIHsKKyAgICBBTE9HVigiZ2V0RnJhbWVBdEluZGV4OiBmcmFtZUluZGV4KCVkKSwgbnVtRnJhbWVzKCVkKSwgY29sb3JGb3JtYXQoJWQpLCBtZXRhT25seSglZCkiLAorICAgICAgICAgICAgZnJhbWVJbmRleCwgbnVtRnJhbWVzLCBjb2xvckZvcm1hdCwgbWV0YU9ubHkpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgZ2xvY2soc0xvY2spOworICAgIGlmIChtUmV0cmlldmVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoInJldHJpZXZlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IG1SZXRyaWV2ZXItPmdldEZyYW1lQXRJbmRleCgKKyAgICAgICAgICAgIGZyYW1lcywgZnJhbWVJbmRleCwgbnVtRnJhbWVzLCBjb2xvckZvcm1hdCwgbWV0YU9ubHkpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgZnJhbWVzLT5jbGVhcigpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICByZXR1cm4gT0s7CiB9CiAKIHNwPElNZW1vcnk+IE1ldGFkYXRhUmV0cmlldmVyQ2xpZW50OjpleHRyYWN0QWxidW1BcnQoKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuaAppbmRleCBjNzhjZDRiLi4yNzJkMDkzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuaApAQCAtNTIsNiArNTIsMTMgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SURhdGFTb3VyY2U+JiBzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpOwogICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gICAgICAgICAgICAgZ2V0RnJhbWVBdFRpbWUoCiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbiwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5KTsKKyAgICB2aXJ0dWFsIHNwPElNZW1vcnk+ICAgICAgICAgICAgIGdldEltYWdlQXRJbmRleCgKKyAgICAgICAgICAgIGludCBpbmRleCwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5LCBib29sIHRodW1ibmFpbCk7CisgICAgdmlydHVhbCBzcDxJTWVtb3J5PiAgICAgICAgICAgICBnZXRJbWFnZVJlY3RBdEluZGV4KAorICAgICAgICAgICAgaW50IGluZGV4LCBpbnQgY29sb3JGb3JtYXQsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVBdEluZGV4KAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNwPElNZW1vcnk+ID4gKmZyYW1lcywKKyAgICAgICAgICAgICAgICBpbnQgZnJhbWVJbmRleCwgaW50IG51bUZyYW1lcywgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5KTsKICAgICB2aXJ0dWFsIHNwPElNZW1vcnk+ICAgICAgICAgICAgIGV4dHJhY3RBbGJ1bUFydCgpOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciogICAgICAgICAgICAgZXh0cmFjdE1ldGFkYXRhKGludCBrZXlDb2RlKTsKIApAQCAtNjgsOSArNzUsOCBAQAogICAgIHNwPE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXJCYXNlPiAgICAgICAgIG1SZXRyaWV2ZXI7CiAgICAgcGlkX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBpZDsKIAotICAgIC8vIEtlZXAgdGhlIHNoYXJlZCBtZW1vcnkgY29weSBvZiBhbGJ1bSBhcnQgYW5kIGNhcHR1cmUgZnJhbWUgKGZvciB0aHVtYm5haWwpCisgICAgLy8gS2VlcCB0aGUgc2hhcmVkIG1lbW9yeSBjb3B5IG9mIGFsYnVtIGFydAogICAgIHNwPElNZW1vcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbGJ1bUFydDsKLSAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGh1bWJuYWlsOwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9SZW1vdGVEaXNwbGF5LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9SZW1vdGVEaXNwbGF5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGViNGI1ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvUmVtb3RlRGlzcGxheS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiUmVtb3RlRGlzcGxheS5oIgotCi0jaW5jbHVkZSAic291cmNlL1dpZmlEaXNwbGF5U291cmNlLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9JUmVtb3RlRGlzcGxheUNsaWVudC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotUmVtb3RlRGlzcGxheTo6UmVtb3RlRGlzcGxheSgKLSAgICAgICAgY29uc3QgU3RyaW5nMTYgJm9wUGFja2FnZU5hbWUsCi0gICAgICAgIGNvbnN0IHNwPElSZW1vdGVEaXNwbGF5Q2xpZW50PiAmY2xpZW50LAotICAgICAgICBjb25zdCBjaGFyICppZmFjZSkKLSAgICA6IG1Mb29wZXIobmV3IEFMb29wZXIpLAotICAgICAgbU5ldFNlc3Npb24obmV3IEFOZXR3b3JrU2Vzc2lvbikgewotICAgIG1Mb29wZXItPnNldE5hbWUoIndmZF9sb29wZXIiKTsKLQotICAgIG1Tb3VyY2UgPSBuZXcgV2lmaURpc3BsYXlTb3VyY2Uob3BQYWNrYWdlTmFtZSwgbU5ldFNlc3Npb24sIGNsaWVudCk7Ci0gICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1Tb3VyY2UpOwotCi0gICAgbU5ldFNlc3Npb24tPnN0YXJ0KCk7Ci0gICAgbUxvb3Blci0+c3RhcnQoKTsKLQotICAgIG1Tb3VyY2UtPnN0YXJ0KGlmYWNlKTsKLX0KLQotUmVtb3RlRGlzcGxheTo6flJlbW90ZURpc3BsYXkoKSB7Ci19Ci0KLXN0YXR1c190IFJlbW90ZURpc3BsYXk6OnBhdXNlKCkgewotICAgIHJldHVybiBtU291cmNlLT5wYXVzZSgpOwotfQotCi1zdGF0dXNfdCBSZW1vdGVEaXNwbGF5OjpyZXN1bWUoKSB7Ci0gICAgcmV0dXJuIG1Tb3VyY2UtPnJlc3VtZSgpOwotfQotCi1zdGF0dXNfdCBSZW1vdGVEaXNwbGF5OjpkaXNwb3NlKCkgewotICAgIG1Tb3VyY2UtPnN0b3AoKTsKLSAgICBtU291cmNlLmNsZWFyKCk7Ci0KLSAgICBtTG9vcGVyLT5zdG9wKCk7Ci0gICAgbU5ldFNlc3Npb24tPnN0b3AoKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9SZW1vdGVEaXNwbGF5LmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvUmVtb3RlRGlzcGxheS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDU3M2U5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9SZW1vdGVEaXNwbGF5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFJFTU9URV9ESVNQTEFZX0hfCi0KLSNkZWZpbmUgUkVNT1RFX0RJU1BMQVlfSF8KLQotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9JUmVtb3RlRGlzcGxheS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEFMb29wZXI7Ci1zdHJ1Y3QgQU5ldHdvcmtTZXNzaW9uOwotY2xhc3MgSVJlbW90ZURpc3BsYXlDbGllbnQ7Ci1zdHJ1Y3QgV2lmaURpc3BsYXlTb3VyY2U7Ci0KLXN0cnVjdCBSZW1vdGVEaXNwbGF5IDogcHVibGljIEJuUmVtb3RlRGlzcGxheSB7Ci0gICAgUmVtb3RlRGlzcGxheSgKLSAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2ICZvcFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgY29uc3Qgc3A8SVJlbW90ZURpc3BsYXlDbGllbnQ+ICZjbGllbnQsCi0gICAgICAgICAgICBjb25zdCBjaGFyICppZmFjZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZXN1bWUoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGRpc3Bvc2UoKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgflJlbW90ZURpc3BsYXkoKTsKLQotcHJpdmF0ZToKLSAgICBzcDxBTG9vcGVyPiBtTmV0TG9vcGVyOwotICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7Ci0gICAgc3A8QU5ldHdvcmtTZXNzaW9uPiBtTmV0U2Vzc2lvbjsKLSAgICBzcDxXaWZpRGlzcGxheVNvdXJjZT4gbVNvdXJjZTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlbW90ZURpc3BsYXkpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBSRU1PVEVfRElTUExBWV9IXwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKaW5kZXggODkzNTRkNi4uMzBjMGIxYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcApAQCAtNjksMjIgKzY5LDMzIEBACiAvLyBrZXkgZm9yIG1lZGlhIHN0YXRpc3RpY3MKIHN0YXRpYyBjb25zdCBjaGFyICprS2V5UmVjb3JkZXIgPSAicmVjb3JkZXIiOwogLy8gYXR0cnMgZm9yIG1lZGlhIHN0YXRpc3RpY3MKLXN0YXRpYyBjb25zdCBjaGFyICprUmVjb3JkZXJIZWlnaHQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmhlaWdodCI7Ci1zdGF0aWMgY29uc3QgY2hhciAqa1JlY29yZGVyV2lkdGggPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLndpZHRoIjsKLXN0YXRpYyBjb25zdCBjaGFyICprUmVjb3JkZXJGcmFtZVJhdGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmZyYW1lLXJhdGUiOwotc3RhdGljIGNvbnN0IGNoYXIgKmtSZWNvcmRlclZpZGVvQml0cmF0ZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIudmlkZW8tYml0cmF0ZSI7Ci1zdGF0aWMgY29uc3QgY2hhciAqa1JlY29yZGVyQXVkaW9TYW1wbGVSYXRlID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5hdWRpby1zYW1wbGVyYXRlIjsKLXN0YXRpYyBjb25zdCBjaGFyICprUmVjb3JkZXJBdWRpb0NoYW5uZWxzID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5hdWRpby1jaGFubmVscyI7CisvLyBOQjogdGhlc2UgYXJlIG1hdGNoZWQgd2l0aCBwdWJsaWMgSmF2YSBBUEkgY29uc3RhbnRzIGRlZmluZWQKKy8vIGluIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFSZWNvcmRlci5qYXZhCisvLyBUaGVzZSBtdXN0IGJlIGtlcHQgc3luY2hyb25pemVkIHdpdGggdGhlIGNvbnN0YW50cyB0aGVyZS4KIHN0YXRpYyBjb25zdCBjaGFyICprUmVjb3JkZXJBdWRpb0JpdHJhdGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmF1ZGlvLWJpdHJhdGUiOwotc3RhdGljIGNvbnN0IGNoYXIgKmtSZWNvcmRlclZpZGVvSWZyYW1lSW50ZXJ2YWwgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLnZpZGVvLWlmcmFtZS1pbnRlcnZhbCI7Ci1zdGF0aWMgY29uc3QgY2hhciAqa1JlY29yZGVyTW92aWVUaW1lc2NhbGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLm1vdmllLXRpbWVzY2FsZSI7CitzdGF0aWMgY29uc3QgY2hhciAqa1JlY29yZGVyQXVkaW9DaGFubmVscyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuYXVkaW8tY2hhbm5lbHMiOworc3RhdGljIGNvbnN0IGNoYXIgKmtSZWNvcmRlckF1ZGlvU2FtcGxlUmF0ZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuYXVkaW8tc2FtcGxlcmF0ZSI7CiBzdGF0aWMgY29uc3QgY2hhciAqa1JlY29yZGVyQXVkaW9UaW1lc2NhbGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmF1ZGlvLXRpbWVzY2FsZSI7Ci1zdGF0aWMgY29uc3QgY2hhciAqa1JlY29yZGVyVmlkZW9UaW1lc2NhbGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLnZpZGVvLXRpbWVzY2FsZSI7Ci1zdGF0aWMgY29uc3QgY2hhciAqa1JlY29yZGVyVmlkZW9Qcm9maWxlID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci52aWRlby1lbmNvZGVyLXByb2ZpbGUiOwotc3RhdGljIGNvbnN0IGNoYXIgKmtSZWNvcmRlclZpZGVvTGV2ZWwgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLnZpZGVvLWVuY29kZXItbGV2ZWwiOwotc3RhdGljIGNvbnN0IGNoYXIgKmtSZWNvcmRlckNhcHR1cmVGcHNFbmFibGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmNhcHR1cmUtZnBzZW5hYmxlIjsKIHN0YXRpYyBjb25zdCBjaGFyICprUmVjb3JkZXJDYXB0dXJlRnBzID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5jYXB0dXJlLWZwcyI7CitzdGF0aWMgY29uc3QgY2hhciAqa1JlY29yZGVyQ2FwdHVyZUZwc0VuYWJsZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuY2FwdHVyZS1mcHNlbmFibGUiOworc3RhdGljIGNvbnN0IGNoYXIgKmtSZWNvcmRlckZyYW1lUmF0ZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuZnJhbWUtcmF0ZSI7CitzdGF0aWMgY29uc3QgY2hhciAqa1JlY29yZGVySGVpZ2h0ID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5oZWlnaHQiOworc3RhdGljIGNvbnN0IGNoYXIgKmtSZWNvcmRlck1vdmllVGltZXNjYWxlID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5tb3ZpZS10aW1lc2NhbGUiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtSZWNvcmRlclJvdGF0aW9uID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5yb3RhdGlvbiI7CitzdGF0aWMgY29uc3QgY2hhciAqa1JlY29yZGVyVmlkZW9CaXRyYXRlID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci52aWRlby1iaXRyYXRlIjsKK3N0YXRpYyBjb25zdCBjaGFyICprUmVjb3JkZXJWaWRlb0lmcmFtZUludGVydmFsID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci52aWRlby1pZnJhbWUtaW50ZXJ2YWwiOworc3RhdGljIGNvbnN0IGNoYXIgKmtSZWNvcmRlclZpZGVvTGV2ZWwgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLnZpZGVvLWVuY29kZXItbGV2ZWwiOworc3RhdGljIGNvbnN0IGNoYXIgKmtSZWNvcmRlclZpZGVvUHJvZmlsZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIudmlkZW8tZW5jb2Rlci1wcm9maWxlIjsKK3N0YXRpYyBjb25zdCBjaGFyICprUmVjb3JkZXJWaWRlb1RpbWVzY2FsZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIudmlkZW8tdGltZXNjYWxlIjsKK3N0YXRpYyBjb25zdCBjaGFyICprUmVjb3JkZXJXaWR0aCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIud2lkdGgiOworCisvLyBuZXcgZmllbGRzLCBub3QgeWV0IGZyb3plbiBpbiB0aGUgcHVibGljIEphdmEgQVBJIGRlZmluaXRpb25zCitzdGF0aWMgY29uc3QgY2hhciAqa1JlY29yZGVyQXVkaW9NaW1lID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5hdWRpby5taW1lIjsKK3N0YXRpYyBjb25zdCBjaGFyICprUmVjb3JkZXJWaWRlb01pbWUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLnZpZGVvLm1pbWUiOworc3RhdGljIGNvbnN0IGNoYXIgKmtSZWNvcmRlckR1cmF0aW9uTXMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmR1cmF0aW9uTXMiOworc3RhdGljIGNvbnN0IGNoYXIgKmtSZWNvcmRlclBhdXNlZCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIucGF1c2VkTXMiOworc3RhdGljIGNvbnN0IGNoYXIgKmtSZWNvcmRlck51bVBhdXNlcyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuTlBhdXNlcyI7CisKIAogLy8gVG8gY29sbGVjdCB0aGUgZW5jb2RlciB1c2FnZSBmb3IgdGhlIGJhdHRlcnkgYXBwCiBzdGF0aWMgdm9pZCBhZGRCYXR0ZXJ5RGF0YSh1aW50MzJfdCBwYXJhbXMpIHsKQEAgLTEwMSw5ICsxMTIsMTEgQEAKICAgICA6IE1lZGlhUmVjb3JkZXJCYXNlKG9wUGFja2FnZU5hbWUpLAogICAgICAgbVdyaXRlcihOVUxMKSwKICAgICAgIG1PdXRwdXRGZCgtMSksCi0gICAgICBtQXVkaW9Tb3VyY2UoQVVESU9fU09VUkNFX0NOVCksCisgICAgICBtQXVkaW9Tb3VyY2UoKGF1ZGlvX3NvdXJjZV90KUFVRElPX1NPVVJDRV9DTlQpLCAvLyBpbml0aWFsaXplIHdpdGggaW52YWxpZCB2YWx1ZQogICAgICAgbVZpZGVvU291cmNlKFZJREVPX1NPVVJDRV9MSVNUX0VORCksCi0gICAgICBtU3RhcnRlZChmYWxzZSkgeworICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbVNlbGVjdGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksCisgICAgICBtRGV2aWNlQ2FsbGJhY2tFbmFibGVkKGZhbHNlKSB7CiAKICAgICBBTE9HVigiQ29uc3RydWN0b3IiKTsKIApAQCAtMTIwLDIyICsxMzMsMTggQEAKICAgICB9CiAKICAgICAvLyBsb2cgdGhlIGN1cnJlbnQgcmVjb3JkLCBwcm92aWRlZCBpdCBoYXMgc29tZSBpbmZvcm1hdGlvbiB3b3J0aCByZWNvcmRpbmcKLSAgICBpZiAobUFuYWx5dGljc0RpcnR5ICYmIG1BbmFseXRpY3NJdGVtICE9IE5VTEwpIHsKLSAgICAgICAgdXBkYXRlTWV0cmljcygpOwotICAgICAgICBpZiAobUFuYWx5dGljc0l0ZW0tPmNvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0RmluYWxpemVkKHRydWUpOwotICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNlbGZyZWNvcmQoKTsKLSAgICAgICAgfQotICAgICAgICBkZWxldGUgbUFuYWx5dGljc0l0ZW07Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtID0gTlVMTDsKLSAgICB9CisgICAgLy8gTkI6IHRoaXMgYWxzbyByZWNsYWltcyAmIGNsZWFycyBtQW5hbHl0aWNzSXRlbS4KKyAgICBmbHVzaEFuZFJlc2V0TWV0cmljcyhmYWxzZSk7CiB9CiAKIHZvaWQgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6dXBkYXRlTWV0cmljcygpIHsKICAgICBBTE9HVigidXBkYXRlTWV0cmljcyIpOwogCi0gICAgLy8gd2UnbGwgcG9wdWxhdGUgdGhlIHZhbHVlcyBmcm9tIHRoZSByYXcgZmllbGRzLgotICAgIC8vIChOT1QgZ29pbmcgdG8gcG9wdWxhdGUgYXMgd2UgZ28gdGhyb3VnaCB0aGUgdmFyaW91cyBzZXQqIG9wcykKKyAgICAvLyB3ZSBydW4gYXMgcGFydCBvZiB0aGUgbWVkaWEgcGxheWVyIHNlcnZpY2U7IHdoYXQgd2UgcmVhbGx5IHdhbnQgdG8KKyAgICAvLyBrbm93IGlzIHRoZSBhcHAgd2hpY2ggcmVxdWVzdGVkIHRoZSByZWNvcmRpbmcuCisgICAgbUFuYWx5dGljc0l0ZW0tPnNldFVpZChtQ2xpZW50VWlkKTsKKworICAgIC8vIHBvcHVsYXRlIHRoZSB2YWx1ZXMgZnJvbSB0aGUgcmF3IGZpZWxkcy4KIAogICAgIC8vIFRCRCBtT3V0cHV0Rm9ybWF0ICA9IE9VVFBVVF9GT1JNQVRfVEhSRUVfR1BQOwogICAgIC8vIFRCRCBtQXVkaW9FbmNvZGVyICA9IEFVRElPX0VOQ09ERVJfQU1SX05COwpAQCAtMTYzLDcgKzE3Miw2IEBACiAgICAgLy8gVEJEIG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMgPSAwOwogICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUmVjb3JkZXJDYXB0dXJlRnBzRW5hYmxlLCBtQ2FwdHVyZUZwc0VuYWJsZSk7CiAgICAgbUFuYWx5dGljc0l0ZW0tPnNldERvdWJsZShrUmVjb3JkZXJDYXB0dXJlRnBzLCBtQ2FwdHVyZUZwcyk7Ci0gICAgLy8gVEJEIG1DYXB0dXJlRnBzID0gLTEuMDsKICAgICAvLyBUQkQgbUNhbWVyYVNvdXJjZVRpbWVMYXBzZSA9IE5VTEw7CiAgICAgLy8gVEJEIG1NZXRhRGF0YVN0b3JlZEluVmlkZW9CdWZmZXJzID0ga01ldGFkYXRhQnVmZmVyVHlwZUludmFsaWQ7CiAgICAgLy8gVEJEIG1FbmNvZGVyUHJvZmlsZXMgPSBNZWRpYVByb2ZpbGVzOjpnZXRJbnN0YW5jZSgpOwpAQCAtMTcyLDI2ICsxODAsMjkgQEAKICAgICAvLyBQSUkgbUxvbmdpdHVkZXgxMDAwMCA9IC0zNjAwMDAwOwogICAgIC8vIFRCRCBtVG90YWxCaXRSYXRlID0gMDsKIAotICAgIC8vIFRCRDogc29tZSBkdXJhdGlvbiBpbmZvcm1hdGlvbiAoY2FwdHVyZSwgcGF1c2VkKQotICAgIC8vCi0KKyAgICAvLyBkdXJhdGlvbiBpbmZvcm1hdGlvbiAocmVjb3JkZWQsIHBhdXNlZCwgIyBvZiBwYXVzZXMpCisgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtSZWNvcmRlckR1cmF0aW9uTXMsIChtRHVyYXRpb25SZWNvcmRlZFVzKzUwMCkvMTAwMCApOworICAgIGlmIChtTlBhdXNlcyAhPSAwKSB7CisgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUmVjb3JkZXJQYXVzZWQsIChtRHVyYXRpb25QYXVzZWRVcys1MDApLzEwMDAgKTsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtSZWNvcmRlck51bVBhdXNlcywgbU5QYXVzZXMpOworICAgIH0KIH0KIAotdm9pZCBTdGFnZWZyaWdodFJlY29yZGVyOjpyZXNldE1ldHJpY3MoKSB7Ci0gICAgQUxPR1YoInJlc2V0TWV0cmljcyIpOwotICAgIC8vIGZsdXNoIGFueXRoaW5nIHdlIGhhdmUsIHJlc3RhcnQgdGhlIHJlY29yZAordm9pZCBTdGFnZWZyaWdodFJlY29yZGVyOjpmbHVzaEFuZFJlc2V0TWV0cmljcyhib29sIHJlaW5pdGlhbGl6ZSkgeworICAgIEFMT0dWKCJmbHVzaEFuZFJlc2V0TWV0cmljcyIpOworICAgIC8vIGZsdXNoIGFueXRoaW5nIHdlIGhhdmUsIG1heWJlIHNldHVwIGEgbmV3IHJlY29yZAogICAgIGlmIChtQW5hbHl0aWNzRGlydHkgJiYgbUFuYWx5dGljc0l0ZW0gIT0gTlVMTCkgewogICAgICAgICB1cGRhdGVNZXRyaWNzKCk7CiAgICAgICAgIGlmIChtQW5hbHl0aWNzSXRlbS0+Y291bnQoKSA+IDApIHsKLSAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRGaW5hbGl6ZWQodHJ1ZSk7CiAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2VsZnJlY29yZCgpOwogICAgICAgICB9CiAgICAgICAgIGRlbGV0ZSBtQW5hbHl0aWNzSXRlbTsKICAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBOVUxMOwogICAgIH0KLSAgICBtQW5hbHl0aWNzSXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0tleVJlY29yZGVyKTsKLSAgICAodm9pZCkgbUFuYWx5dGljc0l0ZW0tPmdlbmVyYXRlU2Vzc2lvbklEKCk7CiAgICAgbUFuYWx5dGljc0RpcnR5ID0gZmFsc2U7CisgICAgaWYgKHJlaW5pdGlhbGl6ZSkgeworICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0tleVJlY29yZGVyKTsKKyAgICB9CiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OmluaXQoKSB7CkBAIC0yMDQsNyArMjE1LDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLS8vIFRoZSBjbGllbnQgc2lkZSBvZiBtZWRpYXNlcnZlciBhc2tzIGl0IHRvIGNyZWF0IGEgU3VyZmFjZU1lZGlhU291cmNlCisvLyBUaGUgY2xpZW50IHNpZGUgb2YgbWVkaWFzZXJ2ZXIgYXNrcyBpdCB0byBjcmVhdGUgYSBTdXJmYWNlTWVkaWFTb3VyY2UKIC8vIGFuZCByZXR1cm4gYSBpbnRlcmZhY2UgcmVmZXJlbmNlLiBUaGUgY2xpZW50IHNpZGUgd2lsbCB1c2UgdGhhdAogLy8gd2hpbGUgZW5jb2RpbmcgR0wgRnJhbWVzCiBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBTdGFnZWZyaWdodFJlY29yZGVyOjpxdWVyeVN1cmZhY2VNZWRpYVNvdXJjZSgpIGNvbnN0IHsKQEAgLTEwMjcsNiArMTAzOCw4IEBACiAgICAgICAgIG1BbmFseXRpY3NEaXJ0eSA9IHRydWU7CiAgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKIAorICAgICAgICBtU3RhcnRlZFJlY29yZGluZ1VzID0gc3lzdGVtVGltZSgpIC8gMTAwMDsKKwogICAgICAgICB1aW50MzJfdCBwYXJhbXMgPSBJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFDb2RlY1N0YXJ0ZWQ7CiAgICAgICAgIGlmIChtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0NOVCkgewogICAgICAgICAgICAgcGFyYW1zIHw9IElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YVRyYWNrQXVkaW87CkBAIC0xMDY5LDcgKzEwODIsOCBAQAogICAgICAgICAgICAgICAgIG1BdWRpb0NoYW5uZWxzLAogICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgIG1DbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgbUNsaWVudFBpZCk7CisgICAgICAgICAgICAgICAgbUNsaWVudFBpZCwKKyAgICAgICAgICAgICAgICBtU2VsZWN0ZWREZXZpY2VJZCk7CiAKICAgICBzdGF0dXNfdCBlcnIgPSBhdWRpb1NvdXJjZS0+aW5pdENoZWNrKCk7CiAKQEAgLTExMDUsNiArMTExOSwxNCBAQAogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCisgICAgLy8gbG9nIGF1ZGlvIG1pbWUgdHlwZSBmb3IgbWVkaWEgbWV0cmljcworICAgIGlmIChtQW5hbHl0aWNzSXRlbSAhPSBOVUxMKSB7CisgICAgICAgIEFTdHJpbmcgYXVkaW9taW1lOworICAgICAgICBpZiAoZm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJmF1ZGlvbWltZSkpIHsKKyAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtSZWNvcmRlckF1ZGlvTWltZSwgYXVkaW9taW1lLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorCiAgICAgaW50MzJfdCBtYXhJbnB1dFNpemU7CiAgICAgQ0hFQ0soYXVkaW9Tb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50MzIoCiAgICAgICAgICAgICAgICAga0tleU1heElucHV0U2l6ZSwgJm1heElucHV0U2l6ZSkpOwpAQCAtMTEyMCw2ICsxMTQyLDEwIEBACiAKICAgICBzcDxNZWRpYUNvZGVjU291cmNlPiBhdWRpb0VuY29kZXIgPQogICAgICAgICAgICAgTWVkaWFDb2RlY1NvdXJjZTo6Q3JlYXRlKG1Mb29wZXIsIGZvcm1hdCwgYXVkaW9Tb3VyY2UpOworICAgIHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiBjYWxsYmFjayA9IG1BdWRpb0RldmljZUNhbGxiYWNrLnByb21vdGUoKTsKKyAgICBpZiAobURldmljZUNhbGxiYWNrRW5hYmxlZCAmJiBjYWxsYmFjayAhPSAwKSB7CisgICAgICAgIGF1ZGlvU291cmNlLT5hZGRBdWRpb0RldmljZUNhbGxiYWNrKGNhbGxiYWNrKTsKKyAgICB9CiAgICAgbUF1ZGlvU291cmNlTm9kZSA9IGF1ZGlvU291cmNlOwogCiAgICAgaWYgKGF1ZGlvRW5jb2RlciA9PSBOVUxMKSB7CkBAIC0xNjQ3LDYgKzE2NzMsMTQgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAorICAgIC8vIGxvZyB2aWRlbyBtaW1lIHR5cGUgZm9yIG1lZGlhIG1ldHJpY3MKKyAgICBpZiAobUFuYWx5dGljc0l0ZW0gIT0gTlVMTCkgeworICAgICAgICBBU3RyaW5nIHZpZGVvbWltZTsKKyAgICAgICAgaWYgKGZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZ2aWRlb21pbWUpKSB7CisgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrUmVjb3JkZXJWaWRlb01pbWUsIHZpZGVvbWltZS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGlmIChjYW1lcmFTb3VyY2UgIT0gTlVMTCkgewogICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IGNhbWVyYVNvdXJjZS0+Z2V0Rm9ybWF0KCk7CiAKQEAgLTE5MDksNiArMTk0MywxMyBAQAogICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwogICAgIG1ldGEtPnNldEludDY0KGtLZXlUaW1lLCBtUGF1c2VTdGFydFRpbWVVcyk7CiAKKyAgICBpZiAobVN0YXJ0ZWRSZWNvcmRpbmdVcyAhPSAwKSB7CisgICAgICAgIC8vIHNob3VsZCBhbHdheXMgYmUgdHJ1ZQorICAgICAgICBpbnQ2NF90IHJlY29yZGluZ1VzID0gbVBhdXNlU3RhcnRUaW1lVXMgLSBtU3RhcnRlZFJlY29yZGluZ1VzOworICAgICAgICBtRHVyYXRpb25SZWNvcmRlZFVzICs9IHJlY29yZGluZ1VzOworICAgICAgICBtU3RhcnRlZFJlY29yZGluZ1VzID0gMDsKKyAgICB9CisKICAgICBpZiAobUF1ZGlvRW5jb2RlclNvdXJjZSAhPSBOVUxMKSB7CiAgICAgICAgIG1BdWRpb0VuY29kZXJTb3VyY2UtPnBhdXNlKCk7CiAgICAgfQpAQCAtMTk2Nyw2ICsyMDA4LDE2IEBACiAgICAgICAgIHNvdXJjZS0+c2V0SW5wdXRCdWZmZXJUaW1lT2Zmc2V0KChpbnQ2NF90KXRpbWVPZmZzZXQpOwogICAgICAgICBzb3VyY2UtPnN0YXJ0KG1ldGEuZ2V0KCkpOwogICAgIH0KKworCisgICAgLy8gc3VtIGluZm8gb24gcGF1c2UgZHVyYXRpb24KKyAgICAvLyAoaWdub3JlIHRoZSAzMG1zZWMgb2Ygb3ZlcmxhcCBhZGp1c3RtZW50IGZhY3RvcmVkIGludG8gbVRvdGFsUGF1c2VkRHVyYXRpb25VcykKKyAgICBpbnQ2NF90IHBhdXNlZFVzID0gcmVzdW1lU3RhcnRUaW1lVXMgLSBtUGF1c2VTdGFydFRpbWVVczsKKyAgICBtRHVyYXRpb25QYXVzZWRVcyArPSBwYXVzZWRVczsKKyAgICBtTlBhdXNlcysrOworICAgIC8vIGFuZCBhIHRpbWVzdGFtcCBtYXJraW5nIHRoYXQgd2UncmUgYmFjayB0byByZWNvcmRpbmcuLi4uCisgICAgbVN0YXJ0ZWRSZWNvcmRpbmdVcyA9IHJlc3VtZVN0YXJ0VGltZVVzOworCiAgICAgbVBhdXNlU3RhcnRUaW1lVXMgPSAwOwogCiAgICAgcmV0dXJuIE9LOwpAQCAtMTk5NSwxMCArMjA0NiwyOCBAQAogICAgICAgICBtV3JpdGVyLmNsZWFyKCk7CiAgICAgfQogCi0gICAgcmVzZXRNZXRyaWNzKCk7CisgICAgLy8gYWNjb3VudCBmb3IgdGhlIGxhc3QgJ3NlZ21lbnQnIC0tIHdoZXRoZXIgcGF1c2VkIG9yIHJlY29yZGluZworICAgIGlmIChtUGF1c2VTdGFydFRpbWVVcyAhPSAwKSB7CisgICAgICAgIC8vIHdlIHdlcmUgcGF1c2VkCisgICAgICAgIGludDY0X3QgYWRkaXRpdmUgPSBzdG9wVGltZVVzIC0gbVBhdXNlU3RhcnRUaW1lVXM7CisgICAgICAgIG1EdXJhdGlvblBhdXNlZFVzICs9IGFkZGl0aXZlOworICAgICAgICBtTlBhdXNlcysrOworICAgIH0gZWxzZSBpZiAobVN0YXJ0ZWRSZWNvcmRpbmdVcyAhPSAwKSB7CisgICAgICAgIC8vIHdlIHdlcmUgcmVjb3JkaW5nCisgICAgICAgIGludDY0X3QgYWRkaXRpdmUgPSBzdG9wVGltZVVzIC0gbVN0YXJ0ZWRSZWNvcmRpbmdVczsKKyAgICAgICAgbUR1cmF0aW9uUmVjb3JkZWRVcyArPSBhZGRpdGl2ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVygic3RvcCB3aGlsZSBuZWl0aGVyIHJlY29yZGluZyBub3IgcGF1c2VkIik7CisgICAgfQogCisgICAgZmx1c2hBbmRSZXNldE1ldHJpY3ModHJ1ZSk7CisKKyAgICBtRHVyYXRpb25SZWNvcmRlZFVzID0gMDsKKyAgICBtRHVyYXRpb25QYXVzZWRVcyA9IDA7CisgICAgbU5QYXVzZXMgPSAwOwogICAgIG1Ub3RhbFBhdXNlZER1cmF0aW9uVXMgPSAwOwogICAgIG1QYXVzZVN0YXJ0VGltZVVzID0gMDsKKyAgICBtU3RhcnRlZFJlY29yZGluZ1VzID0gMDsKIAogICAgIG1HcmFwaGljQnVmZmVyUHJvZHVjZXIuY2xlYXIoKTsKICAgICBtUGVyc2lzdGVudFN1cmZhY2UuY2xlYXIoKTsKQEAgLTIwMzksNyArMjEwOCw3IEBACiAgICAgc3RvcCgpOwogCiAgICAgLy8gTm8gYXVkaW8gb3IgdmlkZW8gc291cmNlIGJ5IGRlZmF1bHQKLSAgICBtQXVkaW9Tb3VyY2UgPSBBVURJT19TT1VSQ0VfQ05UOworICAgIG1BdWRpb1NvdXJjZSA9IChhdWRpb19zb3VyY2VfdClBVURJT19TT1VSQ0VfQ05UOyAvLyByZXNldCB0byBpbnZhbGlkIHZhbHVlCiAgICAgbVZpZGVvU291cmNlID0gVklERU9fU09VUkNFX0xJU1RfRU5EOwogCiAgICAgLy8gRGVmYXVsdCBwYXJhbWV0ZXJzCkBAIC0yMDc3LDYgKzIxNDYsMTIgQEAKICAgICBtTG9uZ2l0dWRleDEwMDAwID0gLTM2MDAwMDA7CiAgICAgbVRvdGFsQml0UmF0ZSA9IDA7CiAKKyAgICAvLyB0cmFja2luZyBob3cgbG9uZyB3ZSByZWNvcmRlZC4KKyAgICBtRHVyYXRpb25SZWNvcmRlZFVzID0gMDsKKyAgICBtU3RhcnRlZFJlY29yZGluZ1VzID0gMDsKKyAgICBtRHVyYXRpb25QYXVzZWRVcyA9IDA7CisgICAgbU5QYXVzZXMgPSAwOworCiAgICAgbU91dHB1dEZkID0gLTE7CiAKICAgICByZXR1cm4gT0s7CkBAIC0yMTE2LDYgKzIxOTEsNTUgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldElucHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIHsKKyAgICBBTE9HVigic2V0SW5wdXREZXZpY2UiKTsKKworICAgIGlmIChtU2VsZWN0ZWREZXZpY2VJZCAhPSBkZXZpY2VJZCkgeworICAgICAgICBtU2VsZWN0ZWREZXZpY2VJZCA9IGRldmljZUlkOworICAgICAgICBpZiAobUF1ZGlvU291cmNlTm9kZSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbUF1ZGlvU291cmNlTm9kZS0+c2V0SW5wdXREZXZpY2UoZGV2aWNlSWQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6Z2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCogZGV2aWNlSWQpIHsKKyAgICBBTE9HVigiZ2V0Um91dGVkRGV2aWNlSWQiKTsKKworICAgIGlmIChtQXVkaW9Tb3VyY2VOb2RlICE9IDApIHsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvU291cmNlTm9kZS0+Z2V0Um91dGVkRGV2aWNlSWQoZGV2aWNlSWQpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKwordm9pZCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRBdWRpb0RldmljZUNhbGxiYWNrKAorICAgICAgICBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKSB7CisgICAgbUF1ZGlvRGV2aWNlQ2FsbGJhY2sgPSBjYWxsYmFjazsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6ZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpIHsKKyAgICBtRGV2aWNlQ2FsbGJhY2tFbmFibGVkID0gZW5hYmxlZDsKKyAgICBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQXVkaW9EZXZpY2VDYWxsYmFjay5wcm9tb3RlKCk7CisgICAgaWYgKG1BdWRpb1NvdXJjZU5vZGUgIT0gMCAmJiBjYWxsYmFjayAhPSAwKSB7CisgICAgICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgICAgICByZXR1cm4gbUF1ZGlvU291cmNlTm9kZS0+YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhjYWxsYmFjayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbUF1ZGlvU291cmNlTm9kZS0+cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhjYWxsYmFjayk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpIHsKKyAgICBpZiAobUF1ZGlvU291cmNlTm9kZSAhPSAwKSB7CisgICAgICAgIHJldHVybiBtQXVkaW9Tb3VyY2VOb2RlLT5nZXRBY3RpdmVNaWNyb3Bob25lcyhhY3RpdmVNaWNyb3Bob25lcyk7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCisKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OmR1bXAoCiAgICAgICAgIGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3QgewogICAgIEFMT0dWKCJkdW1wIik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaAppbmRleCA5YTZjNGRhLi5mYWEyZTU5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKQEAgLTI1LDcgKzI1LDcgQEAKIAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCi0jaW5jbHVkZSA8TWV0YWRhdGFCdWZmZXJUeXBlLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvTWV0YWRhdGFCdWZmZXJUeXBlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNzIsNiArNzIsMTIgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdDsKICAgICAvLyBRdWVyeWluZyBhIFN1cmZhY2VNZWRpYVNvdXJjZXIKICAgICB2aXJ0dWFsIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHF1ZXJ5U3VyZmFjZU1lZGlhU291cmNlKCkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRJbnB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJvdXRlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QqIGRldmljZUlkKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKTsKKwogCiBwcml2YXRlOgogICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CkBAIC04OSw3ICs5NSw3IEBACiAKICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKm1BbmFseXRpY3NJdGVtOwogICAgIGJvb2wgbUFuYWx5dGljc0RpcnR5OwotICAgIHZvaWQgcmVzZXRNZXRyaWNzKCk7CisgICAgdm9pZCBmbHVzaEFuZFJlc2V0TWV0cmljcyhib29sIHJlaW5pdGlhbGl6ZSk7CiAgICAgdm9pZCB1cGRhdGVNZXRyaWNzKCk7CiAKICAgICBhdWRpb19zb3VyY2VfdCBtQXVkaW9Tb3VyY2U7CkBAIC0xMjEsNiArMTI3LDExIEBACiAgICAgaW50MzJfdCBtU3RhcnRUaW1lT2Zmc2V0TXM7CiAgICAgaW50MzJfdCBtVG90YWxCaXRSYXRlOwogCisgICAgaW50NjRfdCBtRHVyYXRpb25SZWNvcmRlZFVzOworICAgIGludDY0X3QgbVN0YXJ0ZWRSZWNvcmRpbmdVczsKKyAgICBpbnQ2NF90IG1EdXJhdGlvblBhdXNlZFVzOworICAgIGludDMyX3QgbU5QYXVzZXM7CisKICAgICBib29sIG1DYXB0dXJlRnBzRW5hYmxlOwogICAgIGRvdWJsZSBtQ2FwdHVyZUZwczsKICAgICBpbnQ2NF90IG1UaW1lQmV0d2VlbkNhcHR1cmVVczsKQEAgLTE0NCw2ICsxNTUsMTAgQEAKICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwogICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CiAKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1TZWxlY3RlZERldmljZUlkOworICAgIGJvb2wgbURldmljZUNhbGxiYWNrRW5hYmxlZDsKKyAgICB3cDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4gbUF1ZGlvRGV2aWNlQ2FsbGJhY2s7CisKICAgICBzdGF0aWMgY29uc3QgaW50IGtNYXhIaWdoU3BlZWRGcHMgPSAxMDAwOwogCiAgICAgc3RhdHVzX3QgcHJlcGFyZUludGVybmFsKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvaW5jbHVkZS9NZWRpYVBsYXllckludGVyZmFjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2luY2x1ZGUvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaAppbmRleCA2ZDAyY2NlLi4zMTE5OTUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvaW5jbHVkZS9NZWRpYVBsYXllckludGVyZmFjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9pbmNsdWRlL01lZGlhUGxheWVySW50ZXJmYWNlLmgKQEAgLTE0OSwxMCArMTQ5LDE1IEBACiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiAvKiBrZXlWYWx1ZVBhaXJzICovKSB7IHJldHVybiBOT19FUlJPUjsgfQogICAgICAgICB2aXJ0dWFsIFN0cmluZzggICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgLyoga2V5cyAqLykgeyByZXR1cm4gU3RyaW5nODo6ZW1wdHkoKTsgfQogCi0gICAgICAgIHZpcnR1YWwgVm9sdW1lU2hhcGVyOjpTdGF0dXMgYXBwbHlWb2x1bWVTaGFwZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pOwotICAgICAgICB2aXJ0dWFsIHNwPFZvbHVtZVNoYXBlcjo6U3RhdGU+IGdldFZvbHVtZVNoYXBlclN0YXRlKGludCBpZCk7CisgICAgICAgIHZpcnR1YWwgbWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pOworICAgICAgICB2aXJ0dWFsIHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXRlPiBnZXRWb2x1bWVTaGFwZXJTdGF0ZShpbnQgaWQpOworCisgICAgICAgIC8vIEF1ZGlvUm91dGluZworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpOwogICAgIH07CiAKICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyQmFzZSgpIHt9CkBAIC0xODMsNyArMTg4LDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFZpZGVvU3VyZmFjZVRleHR1cmUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBidWZmZXJQcm9kdWNlcikgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MoCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRCdWZmZXJpbmdTZXR0aW5ncygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSB7CiAgICAgICAgICpidWZmZXJpbmcgPSBCdWZmZXJpbmdTZXR0aW5ncygpOwogICAgICAgICByZXR1cm4gT0s7CkBAIC0yMjgsNiArMjMzLDkgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldEN1cnJlbnRQb3NpdGlvbihpbnQgKm1zZWMpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldER1cmF0aW9uKGludCAqbXNlYykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcmVzZXQoKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBub3RpZnlBdChpbnQ2NF90IC8qIG1lZGlhVGltZVVzICovKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRMb29waW5nKGludCBsb29wKSA9IDA7CiAgICAgdmlydHVhbCBwbGF5ZXJfdHlwZSBwbGF5ZXJUeXBlKCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCkgPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FXYWtlTG9jay5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQVdha2VMb2NrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODRiYTJlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FXYWtlTG9jay5jcHAKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFXYWtlTG9jayIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkFXYWtlTG9jay5oIgorCisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8cG93ZXJtYW5hZ2VyL1Bvd2VyTWFuYWdlci5oPgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQVdha2VMb2NrOjpBV2FrZUxvY2soKSA6CisgICAgbVBvd2VyTWFuYWdlcihOVUxMKSwKKyAgICBtV2FrZUxvY2tUb2tlbihOVUxMKSwKKyAgICBtV2FrZUxvY2tDb3VudCgwKSwKKyAgICBtRGVhdGhSZWNpcGllbnQobmV3IFBNRGVhdGhSZWNpcGllbnQodGhpcykpIHt9CisKK0FXYWtlTG9jazo6fkFXYWtlTG9jaygpIHsKKyAgICBpZiAobVBvd2VyTWFuYWdlciAhPSBOVUxMKSB7CisgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKG1Qb3dlck1hbmFnZXIpOworICAgICAgICBiaW5kZXItPnVubGlua1RvRGVhdGgobURlYXRoUmVjaXBpZW50KTsKKyAgICB9CisgICAgY2xlYXJQb3dlck1hbmFnZXIoKTsKK30KKworYm9vbCBBV2FrZUxvY2s6OmFjcXVpcmUoKSB7CisgICAgaWYgKG1XYWtlTG9ja0NvdW50ID09IDApIHsKKyAgICAgICAgQ0hFQ0sobVdha2VMb2NrVG9rZW4gPT0gTlVMTCk7CisgICAgICAgIGlmIChtUG93ZXJNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIHVzZSBjaGVja1NlcnZpY2UoKSB0byBhdm9pZCBibG9ja2luZyBpZiBwb3dlciBzZXJ2aWNlIGlzIG5vdCB1cCB5ZXQKKyAgICAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9CisgICAgICAgICAgICAgICAgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmNoZWNrU2VydmljZShTdHJpbmcxNigicG93ZXIiKSk7CisgICAgICAgICAgICBpZiAoYmluZGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiY291bGQgbm90IGdldCB0aGUgcG93ZXIgbWFuYWdlciBzZXJ2aWNlIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIgPSBpbnRlcmZhY2VfY2FzdDxJUG93ZXJNYW5hZ2VyPihiaW5kZXIpOworICAgICAgICAgICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgobURlYXRoUmVjaXBpZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobVBvd2VyTWFuYWdlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBuZXcgQkJpbmRlcigpOworICAgICAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUG93ZXJNYW5hZ2VyLT5hY3F1aXJlV2FrZUxvY2soCisgICAgICAgICAgICAgICAgICAgIFBPV0VSTUFOQUdFUl9QQVJUSUFMX1dBS0VfTE9DSywKKyAgICAgICAgICAgICAgICAgICAgYmluZGVyLCBTdHJpbmcxNigiQVdha2VMb2NrIiksIFN0cmluZzE2KCJtZWRpYSIpKTsKKyAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIG1XYWtlTG9ja1Rva2VuID0gYmluZGVyOworICAgICAgICAgICAgICAgIG1XYWtlTG9ja0NvdW50Kys7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtV2FrZUxvY2tDb3VudCsrOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEFXYWtlTG9jazo6cmVsZWFzZShib29sIGZvcmNlKSB7CisgICAgaWYgKG1XYWtlTG9ja0NvdW50ID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoZm9yY2UpIHsKKyAgICAgICAgLy8gRm9yY2Ugd2FrZWxvY2sgcmVsZWFzZSBiZWxvdyBieSBzZXR0aW5nIHJlZmVyZW5jZSBjb3VudCB0byAxLgorICAgICAgICBtV2FrZUxvY2tDb3VudCA9IDE7CisgICAgfQorICAgIGlmICgtLW1XYWtlTG9ja0NvdW50ID09IDApIHsKKyAgICAgICAgQ0hFQ0sobVdha2VMb2NrVG9rZW4gIT0gTlVMTCk7CisgICAgICAgIGlmIChtUG93ZXJNYW5hZ2VyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgICAgICAgICAgbVBvd2VyTWFuYWdlci0+cmVsZWFzZVdha2VMb2NrKG1XYWtlTG9ja1Rva2VuLCAwIC8qIGZsYWdzICovKTsKKyAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgICAgICB9CisgICAgICAgIG1XYWtlTG9ja1Rva2VuLmNsZWFyKCk7CisgICAgfQorfQorCit2b2lkIEFXYWtlTG9jazo6Y2xlYXJQb3dlck1hbmFnZXIoKSB7CisgICAgcmVsZWFzZSh0cnVlKTsKKyAgICBtUG93ZXJNYW5hZ2VyLmNsZWFyKCk7Cit9CisKK3ZvaWQgQVdha2VMb2NrOjpQTURlYXRoUmVjaXBpZW50OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpIHsKKyAgICBpZiAobVdha2VMb2NrICE9IE5VTEwpIHsKKyAgICAgICAgbVdha2VMb2NrLT5jbGVhclBvd2VyTWFuYWdlcigpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FXYWtlTG9jay5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FXYWtlTG9jay5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BV2FrZUxvY2suaApyZW5hbWUgdG8gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FXYWtlTG9jay5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NWJiN2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDY2IEBACitjY19saWJyYXJ5X3N0YXRpYyB7CisKKyAgICBzcmNzOiBbCisgICAgICAgICJBV2FrZUxvY2suY3BwIiwKKyAgICAgICAgIkdlbmVyaWNTb3VyY2UuY3BwIiwKKyAgICAgICAgIkhUVFBMaXZlU291cmNlLmNwcCIsCisgICAgICAgICJOdVBsYXllci5jcHAiLAorICAgICAgICAiTnVQbGF5ZXJDQ0RlY29kZXIuY3BwIiwKKyAgICAgICAgIk51UGxheWVyRGVjb2Rlci5jcHAiLAorICAgICAgICAiTnVQbGF5ZXJEZWNvZGVyQmFzZS5jcHAiLAorICAgICAgICAiTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guY3BwIiwKKyAgICAgICAgIk51UGxheWVyRHJpdmVyLmNwcCIsCisgICAgICAgICJOdVBsYXllckRybS5jcHAiLAorICAgICAgICAiTnVQbGF5ZXJSZW5kZXJlci5jcHAiLAorICAgICAgICAiTnVQbGF5ZXJTdHJlYW1MaXN0ZW5lci5jcHAiLAorICAgICAgICAiUlRTUFNvdXJjZS5jcHAiLAorICAgICAgICAiU3RyZWFtaW5nU291cmNlLmNwcCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0IiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgcHJvZHVjdF92YXJpYWJsZXM6IHsKKyAgICAgICAgZGVidWdnYWJsZTogeworICAgICAgICAgICAgY2ZsYWdzOiBbCisgICAgICAgICAgICAgICAgIi1ERU5BQkxFX1NUQUdFRlJJR0hUX0VYUEVSSU1FTlRTIiwKKyAgICAgICAgICAgIF0sCisgICAgICAgIH0KKyAgICB9LAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFkcm0iLAorICAgICAgICAibGlicG93ZXJtYW5hZ2VyIiwKKyAgICBdLAorCisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X251cGxheWVyIiwKKworICAgIHRhZ3M6IFsiZW5nIl0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQW5kcm9pZC5tayBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTgyNjMxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgR2VuZXJpY1NvdXJjZS5jcHAgICAgICAgICAgICAgICBcCi0gICAgICAgIEhUVFBMaXZlU291cmNlLmNwcCAgICAgICAgICAgICAgXAotICAgICAgICBOdVBsYXllci5jcHAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgTnVQbGF5ZXJDQ0RlY29kZXIuY3BwICAgICAgICAgICBcCi0gICAgICAgIE51UGxheWVyRGVjb2Rlci5jcHAgICAgICAgICAgICAgXAotICAgICAgICBOdVBsYXllckRlY29kZXJCYXNlLmNwcCAgICAgICAgIFwKLSAgICAgICAgTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guY3BwICBcCi0gICAgICAgIE51UGxheWVyRHJpdmVyLmNwcCAgICAgICAgICAgICAgXAotICAgICAgICBOdVBsYXllckRybS5jcHAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgTnVQbGF5ZXJSZW5kZXJlci5jcHAgICAgICAgICAgICBcCi0gICAgICAgIE51UGxheWVyU3RyZWFtTGlzdGVuZXIuY3BwICAgICAgXAotICAgICAgICBSVFNQU291cmNlLmNwcCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgU3RyZWFtaW5nU291cmNlLmNwcCAgICAgICAgICAgICBcCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotCWZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgICAgICAgICAgICAgICAgICAgICBcCi0JZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZSAgICAgICAgICAgIFwKLQlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgICAgICAgICAgICAgXAotCWZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cyAgICAgICAgICAgICBcCi0JZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwICAgICAgICAgICAgICAgIFwKLQlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dCAgICAgICAgICAgXAotCWZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlICAgICAgICAgICAgICBcCi0JZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4Ci0KLUxPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCi0KLSMgZW5hYmxlIGV4cGVyaW1lbnRzIG9ubHkgaW4gdXNlcmRlYnVnIGFuZCBlbmcgYnVpbGRzCi1pZm5lcSAoLCQoZmlsdGVyIHVzZXJkZWJ1ZyBlbmcsJChUQVJHRVRfQlVJTERfVkFSSUFOVCkpKQotTE9DQUxfQ0ZMQUdTICs9IC1ERU5BQkxFX1NUQUdFRlJJR0hUX0VYUEVSSU1FTlRTCi1lbmRpZgotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9ICAgICAgIFwKLSAgICBsaWJiaW5kZXIgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYnVpICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGliZ3VpICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJtZWRpYSAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYm1lZGlhZHJtICAgICAgICAgICAgICAgICBcCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X251cGxheWVyCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IGVuZwotCi1MT0NBTF9TQU5JVElaRSA6PSBjZmkKLUxPQ0FMX1NBTklUSVpFX0RJQUcgOj0gY2ZpCi0KLWluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcAppbmRleCBhYTIxZmZmLi5jYmMzMDE1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuY3BwCkBAIC0yMywxNyArMjMsMjIgQEAKICNpbmNsdWRlICJBbm90aGVyUGFja2V0U291cmNlLmgiCiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQnVmZmVySG9sZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAjaW5jbHVkZSAiLi4vLi4vbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCIKQEAgLTQxLDIyICs0NiwyNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0YXRpYyBjb25zdCBpbnQga0xvd1dhdGVyTWFya01zICAgICAgICAgID0gMjAwMDsgIC8vIDJzZWNzCi1zdGF0aWMgY29uc3QgaW50IGtIaWdoV2F0ZXJNYXJrTXMgICAgICAgICA9IDUwMDA7ICAvLyA1c2Vjcwotc3RhdGljIGNvbnN0IGludCBrSGlnaFdhdGVyTWFya1JlYnVmZmVyTXMgPSAxNTAwMDsgIC8vIDE1c2Vjcworc3RhdGljIGNvbnN0IGludCBrSW5pdGlhbE1hcmtNcyAgICAgICAgPSA1MDAwOyAgLy8gNXNlY3MKIAotc3RhdGljIGNvbnN0IGludCBrTG93V2F0ZXJNYXJrS0IgID0gNDA7Ci1zdGF0aWMgY29uc3QgaW50IGtIaWdoV2F0ZXJNYXJrS0IgPSAyMDA7CisvL3N0YXRpYyBjb25zdCBpbnQga1BhdXNlUGxheWJhY2tNYXJrTXMgID0gMjAwMDsgIC8vIDJzZWNzCitzdGF0aWMgY29uc3QgaW50IGtSZXN1bWVQbGF5YmFja01hcmtNcyA9IDE1MDAwOyAgLy8gMTVzZWNzCiAKIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpHZW5lcmljU291cmNlKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKICAgICAgICAgYm9vbCB1aWRWYWxpZCwKLSAgICAgICAgdWlkX3QgdWlkKQorICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+ICZtZWRpYUNsb2NrKQogICAgIDogU291cmNlKG5vdGlmeSksCiAgICAgICBtQXVkaW9UaW1lVXMoMCksCiAgICAgICBtQXVkaW9MYXN0RGVxdWV1ZVRpbWVVcygwKSwKICAgICAgIG1WaWRlb1RpbWVVcygwKSwKICAgICAgIG1WaWRlb0xhc3REZXF1ZXVlVGltZVVzKDApLAorICAgICAgbVByZXZCdWZmZXJQZXJjZW50YWdlKC0xKSwKKyAgICAgIG1Qb2xsQnVmZmVyaW5nR2VuZXJhdGlvbigwKSwKKyAgICAgIG1TZW50UGF1c2VPbkJ1ZmZlcmluZyhmYWxzZSksCisgICAgICBtQXVkaW9EYXRhR2VuZXJhdGlvbigwKSwKKyAgICAgIG1WaWRlb0RhdGFHZW5lcmF0aW9uKDApLAogICAgICAgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbigwKSwKICAgICAgIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uKDApLAogICAgICAgbUR1cmF0aW9uVXMoLTFsbCksCkBAIC02NSwxMiArNzQsMTUgQEAKICAgICAgIG1Jc1N0cmVhbWluZyhmYWxzZSksCiAgICAgICBtVUlEVmFsaWQodWlkVmFsaWQpLAogICAgICAgbVVJRCh1aWQpLAorICAgICAgbU1lZGlhQ2xvY2sobWVkaWFDbG9jayksCiAgICAgICBtRmQoLTEpLAogICAgICAgbUJpdHJhdGUoLTFsbCksCiAgICAgICBtUGVuZGluZ1JlYWRCdWZmZXJUeXBlcygwKSB7CiAgICAgQUxPR1YoIkdlbmVyaWNTb3VyY2UiKTsKKyAgICBDSEVDSyhtZWRpYUNsb2NrICE9IE5VTEwpOwogCi0gICAgbUJ1ZmZlcmluZ01vbml0b3IgPSBuZXcgQnVmZmVyaW5nTW9uaXRvcihub3RpZnkpOworICAgIG1CdWZmZXJpbmdTZXR0aW5ncy5tSW5pdGlhbE1hcmtNcyA9IGtJbml0aWFsTWFya01zOworICAgIG1CdWZmZXJpbmdTZXR0aW5ncy5tUmVzdW1lUGxheWJhY2tNYXJrTXMgPSBrUmVzdW1lUGxheWJhY2tNYXJrTXM7CiAgICAgcmVzZXREYXRhU291cmNlKCk7CiB9CiAKQEAgLTc5LDYgKzkxLDcgQEAKIAogICAgIG1IVFRQU2VydmljZS5jbGVhcigpOwogICAgIG1IdHRwU291cmNlLmNsZWFyKCk7CisgICAgbURpc2Nvbm5lY3RlZCA9IGZhbHNlOwogICAgIG1VcmkuY2xlYXIoKTsKICAgICBtVXJpSGVhZGVycy5jbGVhcigpOwogICAgIGlmIChtRmQgPj0gMCkgewpAQCAtODgsMTQgKzEwMSw3IEBACiAgICAgbU9mZnNldCA9IDA7CiAgICAgbUxlbmd0aCA9IDA7CiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICBtU3RvcFJlYWQgPSB0cnVlOwotCi0gICAgaWYgKG1CdWZmZXJpbmdNb25pdG9yTG9vcGVyICE9IE5VTEwpIHsKLSAgICAgICAgbUJ1ZmZlcmluZ01vbml0b3JMb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1CdWZmZXJpbmdNb25pdG9yLT5pZCgpKTsKLSAgICAgICAgbUJ1ZmZlcmluZ01vbml0b3JMb29wZXItPnN0b3AoKTsKLSAgICAgICAgbUJ1ZmZlcmluZ01vbml0b3JMb29wZXIgPSBOVUxMOwotICAgIH0KLSAgICBtQnVmZmVyaW5nTW9uaXRvci0+c3RvcCgpOworICAgIG1QcmVwYXJpbmcgPSBmYWxzZTsKIAogICAgIG1Jc0RybVByb3RlY3RlZCA9IGZhbHNlOwogICAgIG1Jc0RybVJlbGVhc2VkID0gZmFsc2U7CkBAIC0xMDcsNiArMTEzLDcgQEAKICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgY29uc3QgY2hhciAqdXJsLAogICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQUxPR1YoInNldERhdGFTb3VyY2UgdXJsOiAlcyIsIHVybCk7CiAKICAgICByZXNldERhdGFTb3VyY2UoKTsKQEAgLTEyNSw2ICsxMzIsNyBAQAogCiBzdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c2V0RGF0YVNvdXJjZSgKICAgICAgICAgaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEFMT0dWKCJzZXREYXRhU291cmNlICVkLyVsbGQvJWxsZCIsIGZkLCAobG9uZyBsb25nKW9mZnNldCwgKGxvbmcgbG9uZylsZW5ndGgpOwogCiAgICAgcmVzZXREYXRhU291cmNlKCk7CkBAIC0xMzksNiArMTQ3LDcgQEAKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnNldERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4mIHNvdXJjZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQUxPR1YoInNldERhdGFTb3VyY2UgKHNvdXJjZTogJXApIiwgc291cmNlLmdldCgpKTsKIAogICAgIHJlc2V0RGF0YVNvdXJjZSgpOwpAQCAtMTQ3LDIxICsxNTYsMzQgQEAKIH0KIAogc3A8TWV0YURhdGE+IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpnZXRGaWxlRm9ybWF0TWV0YSgpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIHJldHVybiBtRmlsZU1ldGE7CiB9CiAKIHN0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjppbml0RnJvbURhdGFTb3VyY2UoKSB7CiAgICAgc3A8SU1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3I7CiAgICAgQ0hFQ0sobURhdGFTb3VyY2UgIT0gTlVMTCk7CisgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9IG1EYXRhU291cmNlOwogCi0gICAgZXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3I6OkNyZWF0ZShtRGF0YVNvdXJjZSwgTlVMTCk7CisgICAgbUxvY2sudW5sb2NrKCk7CisgICAgLy8gVGhpcyBtaWdodCB0YWtlIGxvbmcgdGltZSBpZiBkYXRhIHNvdXJjZSBpcyBub3QgcmVsaWFibGUuCisgICAgZXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpDcmVhdGUoZGF0YVNvdXJjZSwgTlVMTCk7CiAKICAgICBpZiAoZXh0cmFjdG9yID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoImluaXRGcm9tRGF0YVNvdXJjZSwgY2Fubm90IGNyZWF0ZSBleHRyYWN0b3IhIik7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAotICAgIG1GaWxlTWV0YSA9IGV4dHJhY3Rvci0+Z2V0TWV0YURhdGEoKTsKKyAgICBzcDxNZXRhRGF0YT4gZmlsZU1ldGEgPSBleHRyYWN0b3ItPmdldE1ldGFEYXRhKCk7CisKKyAgICBzaXplX3QgbnVtdHJhY2tzID0gZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOworICAgIGlmIChudW10cmFja3MgPT0gMCkgeworICAgICAgICBBTE9HRSgiaW5pdEZyb21EYXRhU291cmNlLCBzb3VyY2UgaGFzIG5vIHRyYWNrISIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBtTG9jay5sb2NrKCk7CisgICAgbUZpbGVNZXRhID0gZmlsZU1ldGE7CiAgICAgaWYgKG1GaWxlTWV0YSAhPSBOVUxMKSB7CiAgICAgICAgIGludDY0X3QgZHVyYXRpb247CiAgICAgICAgIGlmIChtRmlsZU1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvbikpIHsKQEAgLTE3MSwxMiArMTkzLDYgQEAKIAogICAgIGludDMyX3QgdG90YWxCaXRyYXRlID0gMDsKIAotICAgIHNpemVfdCBudW10cmFja3MgPSBleHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7Ci0gICAgaWYgKG51bXRyYWNrcyA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJpbml0RnJvbURhdGFTb3VyY2UsIHNvdXJjZSBoYXMgbm8gdHJhY2shIik7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQogICAgIG1NaW1lcy5jbGVhcigpOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW10cmFja3M7ICsraSkgewpAQCAtMjU5LDE0ICsyNzUsMjMgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpnZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MoCitzdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6Z2V0QnVmZmVyaW5nU2V0dGluZ3MoCiAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgewotICAgIG1CdWZmZXJpbmdNb25pdG9yLT5nZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgICpidWZmZXJpbmcgPSBtQnVmZmVyaW5nU2V0dGluZ3M7CisgICAgfQorCisgICAgQUxPR1YoImdldEJ1ZmZlcmluZ1NldHRpbmdzeyVzfSIsIGJ1ZmZlcmluZy0+dG9TdHJpbmcoKS5zdHJpbmcoKSk7CiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgewotICAgIHJldHVybiBtQnVmZmVyaW5nTW9uaXRvci0+c2V0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nKTsKKyAgICBBTE9HVigic2V0QnVmZmVyaW5nU2V0dGluZ3N7JXN9IiwgYnVmZmVyaW5nLnRvU3RyaW5nKCkuc3RyaW5nKCkpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtQnVmZmVyaW5nU2V0dGluZ3MgPSBidWZmZXJpbmc7CisgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c3RhcnRTb3VyY2VzKCkgewpAQCAtMzAwLDIyICszMjUsMTEgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpzZXRCdWZmZXJzKAotICAgICAgICBib29sIGF1ZGlvLCBWZWN0b3I8TWVkaWFCdWZmZXIgKj4gJmJ1ZmZlcnMpIHsKLSAgICBpZiAobUlzU2VjdXJlICYmICFhdWRpbyAmJiBtVmlkZW9UcmFjay5tU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIG1WaWRlb1RyYWNrLm1Tb3VyY2UtPnNldEJ1ZmZlcnMoYnVmZmVycyk7Ci0gICAgfQotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQogYm9vbCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6aXNTdHJlYW1pbmcoKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICByZXR1cm4gbUlzU3RyZWFtaW5nOwogfQogCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpzZXRPZmZsb2FkQXVkaW8oYm9vbCBvZmZsb2FkKSB7Ci0gICAgbUJ1ZmZlcmluZ01vbml0b3ItPnNldE9mZmxvYWRBdWRpbyhvZmZsb2FkKTsKLX0KLQogTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6On5HZW5lcmljU291cmNlKCkgewogICAgIEFMT0dWKCJ+R2VuZXJpY1NvdXJjZSIpOwogICAgIGlmIChtTG9vcGVyICE9IE5VTEwpIHsKQEAgLTMyNiw2ICszNDAsNyBAQAogfQogCiB2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpwcmVwYXJlQXN5bmMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBTE9HVigicHJlcGFyZUFzeW5jOiAobG9vcGVyOiAlZCkiLCAobUxvb3BlciAhPSBOVUxMKSk7CiAKICAgICBpZiAobUxvb3BlciA9PSBOVUxMKSB7CkBAIC0zNTQsNyArMzY5LDcgQEAKICAgICAgICAgICAgIFN0cmluZzggY29udGVudFR5cGU7CiAKICAgICAgICAgICAgIGlmICghc3RybmNhc2VjbXAoImh0dHA6Ly8iLCB1cmksIDcpIHx8ICFzdHJuY2FzZWNtcCgiaHR0cHM6Ly8iLCB1cmksIDgpKSB7Ci0gICAgICAgICAgICAgICAgbUh0dHBTb3VyY2UgPSBEYXRhU291cmNlOjpDcmVhdGVNZWRpYUhUVFAobUhUVFBTZXJ2aWNlKTsKKyAgICAgICAgICAgICAgICBtSHR0cFNvdXJjZSA9IERhdGFTb3VyY2VGYWN0b3J5OjpDcmVhdGVNZWRpYUhUVFAobUhUVFBTZXJ2aWNlKTsKICAgICAgICAgICAgICAgICBpZiAobUh0dHBTb3VyY2UgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBodHRwIHNvdXJjZSEiKTsKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKFVOS05PV05fRVJST1IpOwpAQCAtMzYyLDkgKzM3NywxNSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKAorICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAvLyBUaGlzIG1pZ2h0IHRha2UgbG9uZyB0aW1lIGlmIGNvbm5lY3Rpb24gaGFzIHNvbWUgaXNzdWUuCisgICAgICAgICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gRGF0YVNvdXJjZUZhY3Rvcnk6OkNyZWF0ZUZyb21VUkkoCiAgICAgICAgICAgICAgICAgICAgbUhUVFBTZXJ2aWNlLCB1cmksICZtVXJpSGVhZGVycywgJmNvbnRlbnRUeXBlLAogICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUVFBCYXNlICo+KG1IdHRwU291cmNlLmdldCgpKSk7CisgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICBpZiAoIW1EaXNjb25uZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZSA9IGRhdGFTb3VyY2U7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woIm1lZGlhLnN0YWdlZnJpZ2h0LmV4dHJhY3RyZW1vdGUiLCB0cnVlKSAmJgogICAgICAgICAgICAgICAgICAgICAhRmlsZVNvdXJjZTo6cmVxdWlyZXNEcm0obUZkLCBtT2Zmc2V0LCBtTGVuZ3RoLCBudWxscHRyIC8qIG1pbWUgKi8pKSB7CkBAIC0zNzksNyArNDAwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIklEYXRhU291cmNlKEZpbGVTb3VyY2UpOiAlcCAlZCAlbGxkICVsbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5nZXQoKSwgbUZkLCAobG9uZyBsb25nKW1PZmZzZXQsIChsb25nIGxvbmcpbUxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuZ2V0KCkgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBEYXRhU291cmNlOjpDcmVhdGVGcm9tSURhdGFTb3VyY2Uoc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EYXRhU291cmNlID0gQ3JlYXRlRGF0YVNvdXJjZUZyb21JRGF0YVNvdXJjZShzb3VyY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSB0aGUgbG9jYWwgZmlsZSBkZXNjcmlwdG9yIGFzIGl0IGlzIG5vdCBuZWVkZWQgYW55bW9yZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZShtRmQpOwpAQCAtMzk3LDcgKzQxOCw3IEBACiAgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBuZXcgRmlsZVNvdXJjZShtRmQsIG1PZmZzZXQsIG1MZW5ndGgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gVE9ETzogY2xvc2Ugc2hvdWxkIGFsd2F5cyBiZSBkb25lIG9uIG1GZCwgc2VlIHRoZSBsaW5lcyBmb2xsb3dpbmcKLSAgICAgICAgICAgIC8vIERhdGFTb3VyY2U6OkNyZWF0ZUZyb21JRGF0YVNvdXJjZSBhYm92ZSwKKyAgICAgICAgICAgIC8vIENyZWF0ZURhdGFTb3VyY2VGcm9tSURhdGFTb3VyY2UgYWJvdmUsCiAgICAgICAgICAgICAvLyBhbmQgdGhlIEZpbGVTb3VyY2UgY29uc3RydWN0b3Igc2hvdWxkIGR1cCB0aGUgbUZkIGFyZ3VtZW50IGFzIG5lZWRlZC4KICAgICAgICAgICAgIG1GZCA9IC0xOwogICAgICAgICB9CkBAIC00MjcsNyArNDQ4LDcgQEAKICAgICB9CiAKICAgICBpZiAobVZpZGVvVHJhY2subVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gZG9HZXRGb3JtYXRNZXRhKGZhbHNlIC8qIGF1ZGlvICovKTsKKyAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBnZXRGb3JtYXRNZXRhX2woZmFsc2UgLyogYXVkaW8gKi8pOwogICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlOwogICAgICAgICBlcnIgPSBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UobWV0YSwgJm1zZyk7CiAgICAgICAgIGlmKGVyciAhPSBPSykgewpAQCAtNDYxLDQ3ICs0ODIsMzkgQEAKICAgICB9CiAKICAgICBpZiAobUlzU3RyZWFtaW5nKSB7Ci0gICAgICAgIGlmIChtQnVmZmVyaW5nTW9uaXRvckxvb3BlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtQnVmZmVyaW5nTW9uaXRvci0+cHJlcGFyZShtQ2FjaGVkU291cmNlLCBtRHVyYXRpb25VcywgbUJpdHJhdGUsCi0gICAgICAgICAgICAgICAgICAgIG1Jc1N0cmVhbWluZyk7Ci0KLSAgICAgICAgICAgIG1CdWZmZXJpbmdNb25pdG9yTG9vcGVyID0gbmV3IEFMb29wZXI7Ci0gICAgICAgICAgICBtQnVmZmVyaW5nTW9uaXRvckxvb3Blci0+c2V0TmFtZSgiR1NCTW9uaXRvciIpOwotICAgICAgICAgICAgbUJ1ZmZlcmluZ01vbml0b3JMb29wZXItPnN0YXJ0KCk7Ci0gICAgICAgICAgICBtQnVmZmVyaW5nTW9uaXRvckxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1CdWZmZXJpbmdNb25pdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1CdWZmZXJpbmdNb25pdG9yLT5lbnN1cmVDYWNoZUlzRmV0Y2hpbmcoKTsKLSAgICAgICAgbUJ1ZmZlcmluZ01vbml0b3ItPnJlc3RhcnRQb2xsQnVmZmVyaW5nKCk7CisgICAgICAgIG1DYWNoZWRTb3VyY2UtPnJlc3VtZUZldGNoaW5nSWZOZWNlc3NhcnkoKTsKKyAgICAgICAgbVByZXBhcmluZyA9IHRydWU7CisgICAgICAgIHNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG5vdGlmeVByZXBhcmVkKCk7CiAgICAgfQorCisgICAgaWYgKG1BdWRpb1RyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBwb3N0UmVhZEJ1ZmZlcihNRURJQV9UUkFDS19UWVBFX0FVRElPKTsKKyAgICB9CisKKyAgICBpZiAobVZpZGVvVHJhY2subVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIHBvc3RSZWFkQnVmZmVyKE1FRElBX1RSQUNLX1RZUEVfVklERU8pOworICAgIH0KIH0KIAogdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6bm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKHN0YXR1c190IGVycikgewogICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgewotICAgICAgICAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9IG1EYXRhU291cmNlOwotICAgICAgICAgICAgc3A8TnVDYWNoZWRTb3VyY2UyPiBjYWNoZWRTb3VyY2UgPSBtQ2FjaGVkU291cmNlOwotICAgICAgICAgICAgc3A8RGF0YVNvdXJjZT4gaHR0cFNvdXJjZSA9IG1IdHRwU291cmNlOwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGlzY29ubmVjdExvY2spOwotICAgICAgICAgICAgICAgIG1EYXRhU291cmNlLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgbUNhY2hlZFNvdXJjZS5jbGVhcigpOwotICAgICAgICAgICAgICAgIG1IdHRwU291cmNlLmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbUJpdHJhdGUgPSAtMTsKKyAgICAgICAgbURhdGFTb3VyY2UuY2xlYXIoKTsKKyAgICAgICAgbUNhY2hlZFNvdXJjZS5jbGVhcigpOworICAgICAgICBtSHR0cFNvdXJjZS5jbGVhcigpOwogCi0gICAgICAgIG1CdWZmZXJpbmdNb25pdG9yLT5jYW5jZWxQb2xsQnVmZmVyaW5nKCk7CisgICAgICAgIG1CaXRyYXRlID0gLTE7CisgICAgICAgIG1QcmV2QnVmZmVyUGVyY2VudGFnZSA9IC0xOworICAgICAgICArK21Qb2xsQnVmZmVyaW5nR2VuZXJhdGlvbjsKICAgICB9CiAgICAgbm90aWZ5UHJlcGFyZWQoZXJyKTsKIH0KIAogdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c3RhcnQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBTE9HSSgic3RhcnQiKTsKIAotICAgIG1TdG9wUmVhZCA9IGZhbHNlOwogICAgIGlmIChtQXVkaW9UcmFjay5tU291cmNlICE9IE5VTEwpIHsKICAgICAgICAgcG9zdFJlYWRCdWZmZXIoTUVESUFfVFJBQ0tfVFlQRV9BVURJTyk7CiAgICAgfQpAQCAtNTExLDMwICs1MjQsMzAgQEAKICAgICB9CiAKICAgICBtU3RhcnRlZCA9IHRydWU7Ci0KLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIHRoaXMpKS0+cG9zdCgpOwogfQogCiB2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpzdG9wKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKIH0KIAogdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6cGF1c2UoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBtU3RhcnRlZCA9IGZhbHNlOwogfQogCiB2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpyZXN1bWUoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBtU3RhcnRlZCA9IHRydWU7Ci0KLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCB0aGlzKSktPnBvc3QoKTsKIH0KIAogdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6ZGlzY29ubmVjdCgpIHsKICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlLCBodHRwU291cmNlOwogICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EaXNjb25uZWN0TG9jayk7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIGRhdGFTb3VyY2UgPSBtRGF0YVNvdXJjZTsKICAgICAgICAgaHR0cFNvdXJjZSA9IG1IdHRwU291cmNlOworICAgICAgICBtRGlzY29ubmVjdGVkID0gdHJ1ZTsKICAgICB9CiAKICAgICBpZiAoZGF0YVNvdXJjZSAhPSBOVUxMKSB7CkBAIC01NTEsNyArNTY0LDI0IEBACiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpzZW5kQ2FjaGVTdGF0cygpIHsKKyAgICBpbnQzMl90IGticHMgPSAwOworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBpZiAobUNhY2hlZFNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIGVyciA9IG1DYWNoZWRTb3VyY2UtPmdldEVzdGltYXRlZEJhbmR3aWR0aEticHMoJmticHMpOworICAgIH0KKworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRDYWNoZVN0YXRzKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYmFuZHdpZHRoIiwga2Jwcyk7CisgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgIH0KK30KKwogdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKICAgICAgIGNhc2Uga1doYXRQcmVwYXJlQXN5bmM6CiAgICAgICB7CkBAIC02MjAsNiArNjUwLDggQEAKICAgICAgICAgICB0cmFjay0+bVNvdXJjZSA9IHNvdXJjZTsKICAgICAgICAgICB0cmFjay0+bVNvdXJjZS0+c3RhcnQoKTsKICAgICAgICAgICB0cmFjay0+bUluZGV4ID0gdHJhY2tJbmRleDsKKyAgICAgICAgICArK21BdWRpb0RhdGFHZW5lcmF0aW9uOworICAgICAgICAgICsrbVZpZGVvRGF0YUdlbmVyYXRpb247CiAKICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgYWN0dWFsVGltZVVzOwogICAgICAgICAgIGNvbnN0IGJvb2wgZm9ybWF0Q2hhbmdlID0gdHJ1ZTsKQEAgLTYzNywzNyArNjY5LDYgQEAKICAgICAgICAgICBicmVhazsKICAgICAgIH0KIAotICAgICAgY2FzZSBrV2hhdFN0YXJ0OgotICAgICAgY2FzZSBrV2hhdFJlc3VtZToKLSAgICAgIHsKLSAgICAgICAgICBtQnVmZmVyaW5nTW9uaXRvci0+cmVzdGFydFBvbGxCdWZmZXJpbmcoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBrV2hhdEdldEZvcm1hdDoKLSAgICAgIHsKLSAgICAgICAgICBvbkdldEZvcm1hdE1ldGEobXNnKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBrV2hhdEdldFNlbGVjdGVkVHJhY2s6Ci0gICAgICB7Ci0gICAgICAgICAgb25HZXRTZWxlY3RlZFRyYWNrKG1zZyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2Uga1doYXRHZXRUcmFja0luZm86Ci0gICAgICB7Ci0gICAgICAgICAgb25HZXRUcmFja0luZm8obXNnKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBrV2hhdFNlbGVjdFRyYWNrOgotICAgICAgewotICAgICAgICAgIG9uU2VsZWN0VHJhY2sobXNnKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQogICAgICAgY2FzZSBrV2hhdFNlZWs6CiAgICAgICB7CiAgICAgICAgICAgb25TZWVrKG1zZyk7CkBAIC02ODAsMjUgKzY4MSwxMyBAQAogICAgICAgICAgIGJyZWFrOwogICAgICAgfQogCi0gICAgICBjYXNlIGtXaGF0UHJlcGFyZURybToKKyAgICAgIGNhc2Uga1doYXRQb2xsQnVmZmVyaW5nOgogICAgICAgewotICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG9uUHJlcGFyZURybShtc2cpOwotICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoInN0YXR1cyIsIHN0YXR1cyk7Ci0gICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7Ci0gICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2Uga1doYXRSZWxlYXNlRHJtOgotICAgICAgewotICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG9uUmVsZWFzZURybSgpOwotICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoInN0YXR1cyIsIHN0YXR1cyk7Ci0gICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7Ci0gICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiA9PSBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgb25Qb2xsQnVmZmVyaW5nKCk7CisgICAgICAgICAgfQogICAgICAgICAgIGJyZWFrOwogICAgICAgfQogCkBAIC03MjksMTcgKzcxOCwyMCBAQAogICAgIGludDY0X3QgdGltZVVzOwogICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CiAKLSAgICBpbnQ2NF90IHN1YlRpbWVVczsKKyAgICBpbnQ2NF90IHN1YlRpbWVVcyA9IDA7CiAgICAgcmVhZEJ1ZmZlcih0eXBlLCB0aW1lVXMsIE1lZGlhUGxheWVyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQyAvKiBtb2RlICovLCAmc3ViVGltZVVzKTsKIAotICAgIGludDY0X3QgZGVsYXlVcyA9IHN1YlRpbWVVcyAtIHRpbWVVczsKKyAgICBzdGF0dXNfdCBlb3NSZXN1bHQ7CisgICAgaWYgKCFwYWNrZXRzLT5oYXNCdWZmZXJBdmFpbGFibGUoJmVvc1Jlc3VsdCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIGlmIChtc2ctPndoYXQoKSA9PSBrV2hhdEZldGNoU3VidGl0bGVEYXRhKSB7Ci0gICAgICAgIGNvbnN0IGludDY0X3Qgb25lU2VjVXMgPSAxMDAwMDAwbGw7Ci0gICAgICAgIGRlbGF5VXMgLT0gb25lU2VjVXM7CisgICAgICAgIHN1YlRpbWVVcyAtPSAxMDAwMDAwbGw7ICAvLyBzZW5kIHN1YnRpbGUgZGF0YSBvbmUgc2Vjb25kIGVhcmxpZXIKICAgICB9CiAgICAgc3A8QU1lc3NhZ2U+IG1zZzIgPSBuZXcgQU1lc3NhZ2Uoc2VuZFdoYXQsIHRoaXMpOwogICAgIG1zZzItPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbXNnR2VuZXJhdGlvbik7Ci0gICAgbXNnMi0+cG9zdChkZWxheVVzIDwgMCA/IDAgOiBkZWxheVVzKTsKKyAgICBtTWVkaWFDbG9jay0+YWRkVGltZXIobXNnMiwgc3ViVGltZVVzKTsKIH0KIAogdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c2VuZFRleHREYXRhKApAQCAtNzcxLDggKzc2MywxMCBAQAogICAgICAgICBub3RpZnktPnNldEJ1ZmZlcigiYnVmZmVyIiwgYnVmZmVyKTsKICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CiAKLSAgICAgICAgY29uc3QgaW50NjRfdCBkZWxheVVzID0gbmV4dFN1YlRpbWVVcyAtIHN1YlRpbWVVczsKLSAgICAgICAgbXNnLT5wb3N0KGRlbGF5VXMgPCAwID8gMCA6IGRlbGF5VXMpOworICAgICAgICBpZiAobXNnLT53aGF0KCkgPT0ga1doYXRTZW5kU3VidGl0bGVEYXRhKSB7CisgICAgICAgICAgICBuZXh0U3ViVGltZVVzIC09IDEwMDAwMDBsbDsgIC8vIHNlbmQgc3VidGlsZSBkYXRhIG9uZSBzZWNvbmQgZWFybGllcgorICAgICAgICB9CisgICAgICAgIG1NZWRpYUNsb2NrLT5hZGRUaW1lcihtc2csIG5leHRTdWJUaW1lVXMpOwogICAgIH0KIH0KIApAQCAtODA4LDM0ICs4MDIsMTEgQEAKIH0KIAogc3A8TWV0YURhdGE+IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpnZXRGb3JtYXRNZXRhKGJvb2wgYXVkaW8pIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0Rm9ybWF0LCB0aGlzKTsKLSAgICBtc2ctPnNldEludDMyKCJhdWRpbyIsIGF1ZGlvKTsKLQotICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKLSAgICBzcDxSZWZCYXNlPiBmb3JtYXQ7Ci0gICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOwotICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgewotICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZE9iamVjdCgiZm9ybWF0IiwgJmZvcm1hdCkpOwotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TWV0YURhdGEqPihmb3JtYXQuZ2V0KCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBnZXRGb3JtYXRNZXRhX2woYXVkaW8pOwogfQogCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpvbkdldEZvcm1hdE1ldGEoY29uc3Qgc3A8QU1lc3NhZ2U+JiBtc2cpIGNvbnN0IHsKLSAgICBpbnQzMl90IGF1ZGlvOwotICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhdWRpbyIsICZhdWRpbykpOwotCi0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBkb0dldEZvcm1hdE1ldGEoYXVkaW8pOwotICAgIHJlc3BvbnNlLT5zZXRPYmplY3QoImZvcm1hdCIsIGZvcm1hdCk7Ci0KLSAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKLSAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7Ci0gICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKLX0KLQotc3A8TWV0YURhdGE+IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpkb0dldEZvcm1hdE1ldGEoYm9vbCBhdWRpbykgY29uc3Qgeworc3A8TWV0YURhdGE+IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpnZXRGb3JtYXRNZXRhX2woYm9vbCBhdWRpbykgewogICAgIHNwPElNZWRpYVNvdXJjZT4gc291cmNlID0gYXVkaW8gPyBtQXVkaW9UcmFjay5tU291cmNlIDogbVZpZGVvVHJhY2subVNvdXJjZTsKIAogICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgewpAQCAtODQ3LDEwICs4MTgsNyBAQAogCiBzdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6ZGVxdWV1ZUFjY2Vzc1VuaXQoCiAgICAgICAgIGJvb2wgYXVkaW8sIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KSB7Ci0gICAgaWYgKGF1ZGlvICYmICFtU3RhcnRlZCkgewotICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOwotICAgIH0KLQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgLy8gSWYgaGFzIGdvbmUgdGhyb3VnaCBzdG9wL3JlbGVhc2VEcm0gc2VxdWVuY2UsIHdlIG5vIGxvbmdlciBzZW5kIGRvd24gYW55IGJ1ZmZlciBiL2MKICAgICAvLyB0aGUgY29kZWMncyBjcnlwdG8gb2JqZWN0IGhhcyBnb25lIGF3YXkgKGIvMzc5NjAwOTYpLgogICAgIC8vIE5vdGU6IFRoaXMgd2lsbCBiZSB1bm5lY2Vzc2FyeSB3aGVuIHN0b3AoKSBjaGFuZ2VzIGJlaGF2aW9yIGFuZCByZWxlYXNlcyBjb2RlYyAoYi8zNTI0ODI4MykuCkBAIC04NzYsMTAgKzg0NCwzMiBAQAogCiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gdHJhY2stPm1QYWNrZXRzLT5kZXF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKIAotICAgIC8vIHN0YXJ0IHB1bGxpbmcgaW4gbW9yZSBidWZmZXJzIGlmIHdlIG9ubHkgaGF2ZSBvbmUgKG9yIG5vKSBidWZmZXIgbGVmdAorICAgIC8vIHN0YXJ0IHB1bGxpbmcgaW4gbW9yZSBidWZmZXJzIGlmIGNhY2hlIGlzIHJ1bm5pbmcgbG93CiAgICAgLy8gc28gdGhhdCBkZWNvZGVyIGhhcyBsZXNzIGNoYW5jZSBvZiBiZWluZyBzdGFydmVkCi0gICAgaWYgKHRyYWNrLT5tUGFja2V0cy0+Z2V0QXZhaWxhYmxlQnVmZmVyQ291bnQoJmZpbmFsUmVzdWx0KSA8IDIpIHsKLSAgICAgICAgcG9zdFJlYWRCdWZmZXIoYXVkaW8/IE1FRElBX1RSQUNLX1RZUEVfQVVESU8gOiBNRURJQV9UUkFDS19UWVBFX1ZJREVPKTsKKyAgICBpZiAoIW1Jc1N0cmVhbWluZykgeworICAgICAgICBpZiAodHJhY2stPm1QYWNrZXRzLT5nZXRBdmFpbGFibGVCdWZmZXJDb3VudCgmZmluYWxSZXN1bHQpIDwgMikgeworICAgICAgICAgICAgcG9zdFJlYWRCdWZmZXIoYXVkaW8/IE1FRElBX1RSQUNLX1RZUEVfQVVESU8gOiBNRURJQV9UUkFDS19UWVBFX1ZJREVPKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludDY0X3QgZHVyYXRpb25VcyA9IHRyYWNrLT5tUGFja2V0cy0+Z2V0QnVmZmVyZWREdXJhdGlvblVzKCZmaW5hbFJlc3VsdCk7CisgICAgICAgIC8vIFRPRE86IG1heFJlYnVmZmVyaW5nTWFya01zIGNvdWxkIGJlIGxhcmdlciB0aGFuCisgICAgICAgIC8vIG1CdWZmZXJpbmdTZXR0aW5ncy5tUmVzdW1lUGxheWJhY2tNYXJrTXMKKyAgICAgICAgaW50NjRfdCByZXN0YXJ0QnVmZmVyaW5nTWFya1VzID0KKyAgICAgICAgICAgICBtQnVmZmVyaW5nU2V0dGluZ3MubVJlc3VtZVBsYXliYWNrTWFya01zICogMTAwMGxsIC8gMjsKKyAgICAgICAgaWYgKGZpbmFsUmVzdWx0ID09IE9LKSB7CisgICAgICAgICAgICBpZiAoZHVyYXRpb25VcyA8IHJlc3RhcnRCdWZmZXJpbmdNYXJrVXMpIHsKKyAgICAgICAgICAgICAgICBwb3N0UmVhZEJ1ZmZlcihhdWRpbz8gTUVESUFfVFJBQ0tfVFlQRV9BVURJTyA6IE1FRElBX1RSQUNLX1RZUEVfVklERU8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRyYWNrLT5tUGFja2V0cy0+Z2V0QXZhaWxhYmxlQnVmZmVyQ291bnQoJmZpbmFsUmVzdWx0KSA8IDIKKyAgICAgICAgICAgICAgICAmJiAhbVNlbnRQYXVzZU9uQnVmZmVyaW5nICYmICFtUHJlcGFyaW5nKSB7CisgICAgICAgICAgICAgICAgbUNhY2hlZFNvdXJjZS0+cmVzdW1lRmV0Y2hpbmdJZk5lY2Vzc2FyeSgpOworICAgICAgICAgICAgICAgIHNlbmRDYWNoZVN0YXRzKCk7CisgICAgICAgICAgICAgICAgbVNlbnRQYXVzZU9uQnVmZmVyaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UGF1c2VPbkJ1ZmZlcmluZ1N0YXJ0KTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChyZXN1bHQgIT0gT0spIHsKQEAgLTg5OSw3ICs4ODksNiBAQAogICAgIENIRUNLKCgqYWNjZXNzVW5pdCktPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CiAgICAgaWYgKGF1ZGlvKSB7CiAgICAgICAgIG1BdWRpb0xhc3REZXF1ZXVlVGltZVVzID0gdGltZVVzOwotICAgICAgICBtQnVmZmVyaW5nTW9uaXRvci0+dXBkYXRlRGVxdWV1ZWRCdWZmZXJUaW1lKHRpbWVVcyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbVZpZGVvTGFzdERlcXVldWVUaW1lVXMgPSB0aW1lVXM7CiAgICAgfQpAQCAtOTI0LDQzICs5MTMsMTggQEAKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICpkdXJhdGlvblVzID0gbUR1cmF0aW9uVXM7CiAgICAgcmV0dXJuIE9LOwogfQogCiBzaXplX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmdldFRyYWNrQ291bnQoKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICByZXR1cm4gbVNvdXJjZXMuc2l6ZSgpOwogfQogCiBzcDxBTWVzc2FnZT4gTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmdldFRyYWNrSW5mbyhzaXplX3QgdHJhY2tJbmRleCkgY29uc3QgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRUcmFja0luZm8sIHRoaXMpOwotICAgIG1zZy0+c2V0U2l6ZSgidHJhY2tJbmRleCIsIHRyYWNrSW5kZXgpOwotCi0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgIHNwPFJlZkJhc2U+IGZvcm1hdDsKLSAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7Ci0gICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7Ci0gICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kT2JqZWN0KCJmb3JtYXQiLCAmZm9ybWF0KSk7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxBTWVzc2FnZSo+KGZvcm1hdC5nZXQoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpvbkdldFRyYWNrSW5mbyhjb25zdCBzcDxBTWVzc2FnZT4mIG1zZykgY29uc3QgewotICAgIHNpemVfdCB0cmFja0luZGV4OwotICAgIENIRUNLKG1zZy0+ZmluZFNpemUoInRyYWNrSW5kZXgiLCAmdHJhY2tJbmRleCkpOwotCi0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBkb0dldFRyYWNrSW5mbyh0cmFja0luZGV4KTsKLSAgICByZXNwb25zZS0+c2V0T2JqZWN0KCJmb3JtYXQiLCBmb3JtYXQpOwotCi0gICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7Ci0gICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Ci19Ci0KLXNwPEFNZXNzYWdlPiBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6ZG9HZXRUcmFja0luZm8oc2l6ZV90IHRyYWNrSW5kZXgpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIHNpemVfdCB0cmFja0NvdW50ID0gbVNvdXJjZXMuc2l6ZSgpOwogICAgIGlmICh0cmFja0luZGV4ID49IHRyYWNrQ291bnQpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0xMDEwLDM1ICs5NzQsNyBAQAogfQogCiBzc2l6ZV90IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpnZXRTZWxlY3RlZFRyYWNrKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3QgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRTZWxlY3RlZFRyYWNrLCB0aGlzKTsKLSAgICBtc2ctPnNldEludDMyKCJ0eXBlIiwgdHlwZSk7Ci0KLSAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7Ci0gICAgaW50MzJfdCBpbmRleDsKLSAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7Ci0gICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7Ci0gICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImluZGV4IiwgJmluZGV4KSk7Ci0gICAgICAgIHJldHVybiBpbmRleDsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpvbkdldFNlbGVjdGVkVHJhY2soY29uc3Qgc3A8QU1lc3NhZ2U+JiBtc2cpIGNvbnN0IHsKLSAgICBpbnQzMl90IHRtcFR5cGU7Ci0gICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInR5cGUiLCAmdG1wVHlwZSkpOwotICAgIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSA9IChtZWRpYV90cmFja190eXBlKXRtcFR5cGU7Ci0KLSAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgc3NpemVfdCBpbmRleCA9IGRvR2V0U2VsZWN0ZWRUcmFjayh0eXBlKTsKLSAgICByZXNwb25zZS0+c2V0SW50MzIoImluZGV4IiwgaW5kZXgpOwotCi0gICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7Ci0gICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Ci19Ci0KLXNzaXplX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmRvR2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIHR5cGUpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGNvbnN0IFRyYWNrICp0cmFjayA9IE5VTEw7CiAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgY2FzZSBNRURJQV9UUkFDS19UWVBFX1ZJREVPOgpAQCAtMTA2NSwzOCArMTAwMSw5IEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpzZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QsIGludDY0X3QgdGltZVVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBTE9HVigiJXMgdHJhY2s6ICV6dSIsIHNlbGVjdCA/ICJzZWxlY3QiIDogImRlc2VsZWN0IiwgdHJhY2tJbmRleCk7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbGVjdFRyYWNrLCB0aGlzKTsKLSAgICBtc2ctPnNldEludDMyKCJ0cmFja0luZGV4IiwgdHJhY2tJbmRleCk7Ci0gICAgbXNnLT5zZXRJbnQzMigic2VsZWN0Iiwgc2VsZWN0KTsKLSAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwogCi0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKLSAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKLSAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om9uU2VsZWN0VHJhY2soY29uc3Qgc3A8QU1lc3NhZ2U+JiBtc2cpIHsKLSAgICBpbnQzMl90IHRyYWNrSW5kZXgsIHNlbGVjdDsKLSAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigidHJhY2tJbmRleCIsICZ0cmFja0luZGV4KSk7Ci0gICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInNlbGVjdCIsICZzZWxlY3QpKTsKLSAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwotCi0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgIHN0YXR1c190IGVyciA9IGRvU2VsZWN0VHJhY2sodHJhY2tJbmRleCwgc2VsZWN0LCB0aW1lVXMpOwotICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLQotICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwotICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKLSAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwotfQotCi1zdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6ZG9TZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QsIGludDY0X3QgdGltZVVzKSB7CiAgICAgaWYgKHRyYWNrSW5kZXggPj0gbVNvdXJjZXMuc2l6ZSgpKSB7CiAgICAgICAgIHJldHVybiBCQURfSU5ERVg7CiAgICAgfQpAQCAtMTE4OCwxMCArMTA5NSwxNCBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c2Vla1RvKGludDY0X3Qgc2Vla1RpbWVVcywgTWVkaWFQbGF5ZXJTZWVrTW9kZSBtb2RlKSB7CisgICAgQUxPR1YoInNlZWtUbzogJWxsZCwgJWQiLCAobG9uZyBsb25nKXNlZWtUaW1lVXMsIG1vZGUpOwogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWVrLCB0aGlzKTsKICAgICBtc2ctPnNldEludDY0KCJzZWVrVGltZVVzIiwgc2Vla1RpbWVVcyk7CiAgICAgbXNnLT5zZXRJbnQzMigibW9kZSIsIG1vZGUpOwogCisgICAgLy8gTmVlZCB0byBjYWxsIHJlYWRCdWZmZXIgb24gfG1Mb29wZXJ8IHRvIGVuc3VyZSB0aGUgY2FsbHMgdG8KKyAgICAvLyBJTWVkaWFTb3VyY2U6OnJlYWQqIGFyZSBzZXJpYWxpemVkLiBOb3RlIHRoYXQgSU1lZGlhU291cmNlOjpyZWFkKgorICAgIC8vIGlzIGNhbGxlZCB3aXRob3V0IHxtTG9ja3wgYWNxdWlyZWQgYW5kIE1lZGlhU291cmNlIGlzIG5vdCB0aHJlYWQgc2FmZS4KICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CiAgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOwogICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgewpAQCAtMTIxNywxNyArMTEyOCw5IEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpkb1NlZWsoaW50NjRfdCBzZWVrVGltZVVzLCBNZWRpYVBsYXllclNlZWtNb2RlIG1vZGUpIHsKLSAgICBtQnVmZmVyaW5nTW9uaXRvci0+dXBkYXRlRGVxdWV1ZWRCdWZmZXJUaW1lKC0xbGwpOwotCi0gICAgLy8gSWYgdGhlIFdpZGV2aW5lIHNvdXJjZSBpcyBzdG9wcGVkLCBkbyBub3QgYXR0ZW1wdCB0byByZWFkIGFueQotICAgIC8vIG1vcmUgYnVmZmVycy4KLSAgICAvLwotICAgIC8vIFRPRE86IHJldmlzaXQgYWZ0ZXIgd2lkZXZpbmUgaXMgcmVtb3ZlZC4gIE1heSBiZSBhYmxlIHRvCi0gICAgLy8gY29tYmluZSBtU3RvcFJlYWQgd2l0aCBtU3RhcnRlZC4KLSAgICBpZiAobVN0b3BSZWFkKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9CiAgICAgaWYgKG1WaWRlb1RyYWNrLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICArK21WaWRlb0RhdGFHZW5lcmF0aW9uOworCiAgICAgICAgIGludDY0X3QgYWN0dWFsVGltZVVzOwogICAgICAgICByZWFkQnVmZmVyKE1FRElBX1RSQUNLX1RZUEVfVklERU8sIHNlZWtUaW1lVXMsIG1vZGUsICZhY3R1YWxUaW1lVXMpOwogCkBAIC0xMjM4LDcgKzExNDEsOCBAQAogICAgIH0KIAogICAgIGlmIChtQXVkaW9UcmFjay5tU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgcmVhZEJ1ZmZlcihNRURJQV9UUkFDS19UWVBFX0FVRElPLCBzZWVrVGltZVVzKTsKKyAgICAgICAgKyttQXVkaW9EYXRhR2VuZXJhdGlvbjsKKyAgICAgICAgcmVhZEJ1ZmZlcihNRURJQV9UUkFDS19UWVBFX0FVRElPLCBzZWVrVGltZVVzLCBNZWRpYVBsYXllclNlZWtNb2RlOjpTRUVLX0NMT1NFU1QpOwogICAgICAgICBtQXVkaW9MYXN0RGVxdWV1ZVRpbWVVcyA9IHNlZWtUaW1lVXM7CiAgICAgfQogCkBAIC0xMjUyLDE3ICsxMTU2LDEzIEBACiAgICAgICAgIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uKys7CiAgICAgfQogCi0gICAgLy8gSWYgY3VycmVudGx5IGJ1ZmZlcmluZywgcG9zdCBrV2hhdEJ1ZmZlcmluZ0VuZCBmaXJzdCwgc28gdGhhdAotICAgIC8vIE51UGxheWVyIHJlc3VtZXMuIE90aGVyd2lzZSwgaWYgY2FjaGUgaGl0cyBoaWdoIHdhdGVybWFyawotICAgIC8vIGJlZm9yZSBuZXcgcG9sbGluZyBoYXBwZW5zLCBubyBvbmUgd2lsbCByZXN1bWUgdGhlIHBsYXliYWNrLgotICAgIG1CdWZmZXJpbmdNb25pdG9yLT5zdG9wQnVmZmVyaW5nSWZOZWNlc3NhcnkoKTsKLSAgICBtQnVmZmVyaW5nTW9uaXRvci0+cmVzdGFydFBvbGxCdWZmZXJpbmcoKTsKLQorICAgICsrbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uOworICAgIHNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpOwogICAgIHJldHVybiBPSzsKIH0KIAogc3A8QUJ1ZmZlcj4gTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om1lZGlhQnVmZmVyVG9BQnVmZmVyKAotICAgICAgICBNZWRpYUJ1ZmZlciogbWIsCisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSogbWIsCiAgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlKSB7CiAgICAgYm9vbCBhdWRpbyA9IHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX0FVRElPOwogICAgIHNpemVfdCBvdXRMZW5ndGggPSBtYi0+cmFuZ2VfbGVuZ3RoKCk7CkBAIC0xMjgwLDE0ICsxMTgwLDEyIEBACiAKICAgICAgICAgLy8gZGF0YSBpcyBhbHJlYWR5IHByb3ZpZGVkIGluIHRoZSBidWZmZXIKICAgICAgICAgYWIgPSBuZXcgQUJ1ZmZlcihOVUxMLCBtYi0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgICAgICBtYi0+YWRkX3JlZigpOwotICAgICAgICBhYi0+c2V0TWVkaWFCdWZmZXJCYXNlKG1iKTsKKyAgICAgICAgYWItPm1ldGEoKS0+c2V0T2JqZWN0KCJtZWRpYUJ1ZmZlckhvbGRlciIsIG5ldyBNZWRpYUJ1ZmZlckhvbGRlcihtYikpOwogCiAgICAgICAgIC8vIE1vZHVsYXIgRFJNOiBSZXF1aXJlZCBiL2Mgb2YgdGhlIGFib3ZlIGFkZF9yZWYuCiAgICAgICAgIC8vIElmIHJlZj4wLCB0aGVyZSBtdXN0IGJlIGFuIG9ic2VydmVyLCBvciBpdCdsbCBjcmFzaCBhdCByZWxlYXNlKCkuCiAgICAgICAgIC8vIFRPRE86IE1lZGlhQnVmZmVyIG1pZ2h0IG5lZWQgdG8gYmUgcmV2aXNlZCB0byBlYXNlIHN1Y2ggbmVlZC4KICAgICAgICAgbWItPnNldE9ic2VydmVyKHRoaXMpOwotICAgICAgICAvLyBzZXRNZWRpYUJ1ZmZlckJhc2UoKSBpbnRlcmVzdGluZ2x5IGRvZXNuJ3QgaW5jcmVtZW50IHRoZSByZWYgY291bnQgb24gaXRzIG93bi4KICAgICAgICAgLy8gRXh0cmEgaW5jcmVtZW50IChzaW5jZSB3ZSB3YW50IHRvIGtlZXAgbWIgYWxpdmUgYW5kIGF0dGFjaGVkIHRvIGFiIGJleW9uZCB0aGlzIGZ1bmN0aW9uCiAgICAgICAgIC8vIGNhbGwuIFRoaXMgaXMgdG8gY291bnRlciB0aGUgZWZmZWN0IG9mIG1iLT5yZWxlYXNlKCkgdG93YXJkcyB0aGUgZW5kLgogICAgICAgICBtYi0+YWRkX3JlZigpOwpAQCAtMTMwMSw3ICsxMTk5LDcgQEAKIAogICAgIGlmIChhdWRpbyAmJiBtQXVkaW9Jc1ZvcmJpcykgewogICAgICAgICBpbnQzMl90IG51bVBhZ2VTYW1wbGVzOwotICAgICAgICBpZiAoIW1iLT5tZXRhX2RhdGEoKS0+ZmluZEludDMyKGtLZXlWYWxpZFNhbXBsZXMsICZudW1QYWdlU2FtcGxlcykpIHsKKyAgICAgICAgaWYgKCFtYi0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlWYWxpZFNhbXBsZXMsICZudW1QYWdlU2FtcGxlcykpIHsKICAgICAgICAgICAgIG51bVBhZ2VTYW1wbGVzID0gLTE7CiAgICAgICAgIH0KIApAQCAtMTMxMiwxMiArMTIxMCwxMiBAQAogICAgIHNwPEFNZXNzYWdlPiBtZXRhID0gYWItPm1ldGEoKTsKIAogICAgIGludDY0X3QgdGltZVVzOwotICAgIENIRUNLKG1iLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CisgICAgQ0hFQ0sobWItPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwogICAgIG1ldGEtPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwogCiAgICAgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1ZJREVPKSB7CiAgICAgICAgIGludDMyX3QgbGF5ZXJJZDsKLSAgICAgICAgaWYgKG1iLT5tZXRhX2RhdGEoKS0+ZmluZEludDMyKGtLZXlUZW1wb3JhbExheWVySWQsICZsYXllcklkKSkgeworICAgICAgICBpZiAobWItPm1ldGFfZGF0YSgpLmZpbmRJbnQzMihrS2V5VGVtcG9yYWxMYXllcklkLCAmbGF5ZXJJZCkpIHsKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKCJ0ZW1wb3JhbC1sYXllci1pZCIsIGxheWVySWQpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTMzMCwyOCArMTIyOCwyOCBAQAogICAgIH0KIAogICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICBpZiAobWItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKKyAgICBpZiAobWItPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvblVzKSkgewogICAgICAgICBtZXRhLT5zZXRJbnQ2NCgiZHVyYXRpb25VcyIsIGR1cmF0aW9uVXMpOwogICAgIH0KIAogICAgIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSkgewotICAgICAgICBtZXRhLT5zZXRJbnQzMigidHJhY2tJbmRleCIsIG1TdWJ0aXRsZVRyYWNrLm1JbmRleCk7CisgICAgICAgIG1ldGEtPnNldEludDMyKCJ0cmFjay1pbmRleCIsIG1TdWJ0aXRsZVRyYWNrLm1JbmRleCk7CiAgICAgfQogCiAgICAgdWludDMyX3QgZGF0YVR5cGU7IC8vIHVudXNlZAogICAgIGNvbnN0IHZvaWQgKnNlaURhdGE7CiAgICAgc2l6ZV90IHNlaUxlbmd0aDsKLSAgICBpZiAobWItPm1ldGFfZGF0YSgpLT5maW5kRGF0YShrS2V5U0VJLCAmZGF0YVR5cGUsICZzZWlEYXRhLCAmc2VpTGVuZ3RoKSkgeworICAgIGlmIChtYi0+bWV0YV9kYXRhKCkuZmluZERhdGEoa0tleVNFSSwgJmRhdGFUeXBlLCAmc2VpRGF0YSwgJnNlaUxlbmd0aCkpIHsKICAgICAgICAgc3A8QUJ1ZmZlcj4gc2VpID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KHNlaURhdGEsIHNlaUxlbmd0aCk7OwogICAgICAgICBtZXRhLT5zZXRCdWZmZXIoInNlaSIsIHNlaSk7CiAgICAgfQogCiAgICAgY29uc3Qgdm9pZCAqbXBlZ1VzZXJEYXRhUG9pbnRlcjsKICAgICBzaXplX3QgbXBlZ1VzZXJEYXRhTGVuZ3RoOwotICAgIGlmIChtYi0+bWV0YV9kYXRhKCktPmZpbmREYXRhKAorICAgIGlmIChtYi0+bWV0YV9kYXRhKCkuZmluZERhdGEoCiAgICAgICAgICAgICBrS2V5TXBlZ1VzZXJEYXRhLCAmZGF0YVR5cGUsICZtcGVnVXNlckRhdGFQb2ludGVyLCAmbXBlZ1VzZXJEYXRhTGVuZ3RoKSkgewogICAgICAgICBzcDxBQnVmZmVyPiBtcGVnVXNlckRhdGEgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkobXBlZ1VzZXJEYXRhUG9pbnRlciwgbXBlZ1VzZXJEYXRhTGVuZ3RoKTsKLSAgICAgICAgbWV0YS0+c2V0QnVmZmVyKCJtcGVnVXNlckRhdGEiLCBtcGVnVXNlckRhdGEpOworICAgICAgICBtZXRhLT5zZXRCdWZmZXIoIm1wZWctdXNlci1kYXRhIiwgbXBlZ1VzZXJEYXRhKTsKICAgICB9CiAKICAgICBtYi0+cmVsZWFzZSgpOwpAQCAtMTM2MCw5ICsxMjU4LDI5IEBACiAgICAgcmV0dXJuIGFiOwogfQogCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpwb3N0UmVhZEJ1ZmZlcihtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtUmVhZEJ1ZmZlckxvY2spOworaW50MzJfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6Z2V0RGF0YUdlbmVyYXRpb24obWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdCB7CisgICAgaW50MzJfdCBnZW5lcmF0aW9uID0gLTE7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBNRURJQV9UUkFDS19UWVBFX1ZJREVPOgorICAgICAgICBnZW5lcmF0aW9uID0gbVZpZGVvRGF0YUdlbmVyYXRpb247CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9BVURJTzoKKyAgICAgICAgZ2VuZXJhdGlvbiA9IG1BdWRpb0RhdGFHZW5lcmF0aW9uOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfVElNRURURVhUOgorICAgICAgICBnZW5lcmF0aW9uID0gbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb247CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRToKKyAgICAgICAgZ2VuZXJhdGlvbiA9IG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb247CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KIAorICAgIHJldHVybiBnZW5lcmF0aW9uOworfQorCit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpwb3N0UmVhZEJ1ZmZlcihtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSkgewogICAgIGlmICgobVBlbmRpbmdSZWFkQnVmZmVyVHlwZXMgJiAoMSA8PCB0cmFja1R5cGUpKSA9PSAwKSB7CiAgICAgICAgIG1QZW5kaW5nUmVhZEJ1ZmZlclR5cGVzIHw9ICgxIDw8IHRyYWNrVHlwZSk7CiAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWFkQnVmZmVyLCB0aGlzKTsKQEAgLTEzNzUsMjUgKzEyOTMsMTMgQEAKICAgICBpbnQzMl90IHRtcFR5cGU7CiAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInRyYWNrVHlwZSIsICZ0bXBUeXBlKSk7CiAgICAgbWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUgPSAobWVkaWFfdHJhY2tfdHlwZSl0bXBUeXBlOworICAgIG1QZW5kaW5nUmVhZEJ1ZmZlclR5cGVzICY9IH4oMSA8PCB0cmFja1R5cGUpOwogICAgIHJlYWRCdWZmZXIodHJhY2tUeXBlKTsKLSAgICB7Ci0gICAgICAgIC8vIG9ubHkgcHJvdGVjdCB0aGUgdmFyaWFibGUgY2hhbmdlLCBhcyByZWFkQnVmZmVyIG1heQotICAgICAgICAvLyB0YWtlIGNvbnNpZGVyYWJsZSB0aW1lLgotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVJlYWRCdWZmZXJMb2NrKTsKLSAgICAgICAgbVBlbmRpbmdSZWFkQnVmZmVyVHlwZXMgJj0gfigxIDw8IHRyYWNrVHlwZSk7Ci0gICAgfQogfQogCiB2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpyZWFkQnVmZmVyKAogICAgICAgICBtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSwgaW50NjRfdCBzZWVrVGltZVVzLCBNZWRpYVBsYXllclNlZWtNb2RlIG1vZGUsCiAgICAgICAgIGludDY0X3QgKmFjdHVhbFRpbWVVcywgYm9vbCBmb3JtYXRDaGFuZ2UpIHsKLSAgICAvLyBEbyBub3QgcmVhZCBkYXRhIGlmIFdpZGV2aW5lIHNvdXJjZSBpcyBzdG9wcGVkCi0gICAgLy8KLSAgICAvLyBUT0RPOiByZXZpc2l0IGFmdGVyIHdpZGV2aW5lIGlzIHJlbW92ZWQuICBNYXkgYmUgYWJsZSB0bwotICAgIC8vIGNvbWJpbmUgbVN0b3BSZWFkIHdpdGggbVN0YXJ0ZWQuCi0gICAgaWYgKG1TdG9wUmVhZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQogICAgIFRyYWNrICp0cmFjazsKICAgICBzaXplX3QgbWF4QnVmZmVycyA9IDE7CiAgICAgc3dpdGNoICh0cmFja1R5cGUpIHsKQEAgLTE0MzcsMzkgKzEzNDMsNTAgQEAKICAgICAgICAgb3B0aW9ucy5zZXROb25CbG9ja2luZygpOwogICAgIH0KIAorICAgIGludDMyX3QgZ2VuZXJhdGlvbiA9IGdldERhdGFHZW5lcmF0aW9uKHRyYWNrVHlwZSk7CiAgICAgZm9yIChzaXplX3QgbnVtQnVmZmVycyA9IDA7IG51bUJ1ZmZlcnMgPCBtYXhCdWZmZXJzOyApIHsKLSAgICAgICAgVmVjdG9yPE1lZGlhQnVmZmVyICo+IG1lZGlhQnVmZmVyczsKKyAgICAgICAgVmVjdG9yPE1lZGlhQnVmZmVyQmFzZSAqPiBtZWRpYUJ1ZmZlcnM7CiAgICAgICAgIHN0YXR1c190IGVyciA9IE5PX0VSUk9SOwogCisgICAgICAgIHNwPElNZWRpYVNvdXJjZT4gc291cmNlID0gdHJhY2stPm1Tb3VyY2U7CisgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICBpZiAoY291bGRSZWFkTXVsdGlwbGUpIHsKLSAgICAgICAgICAgIGVyciA9IHRyYWNrLT5tU291cmNlLT5yZWFkTXVsdGlwbGUoCisgICAgICAgICAgICBlcnIgPSBzb3VyY2UtPnJlYWRNdWx0aXBsZSgKICAgICAgICAgICAgICAgICAgICAgJm1lZGlhQnVmZmVycywgbWF4QnVmZmVycyAtIG51bUJ1ZmZlcnMsICZvcHRpb25zKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICptYnVmID0gTlVMTDsKLSAgICAgICAgICAgIGVyciA9IHRyYWNrLT5tU291cmNlLT5yZWFkKCZtYnVmLCAmb3B0aW9ucyk7CisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKm1idWYgPSBOVUxMOworICAgICAgICAgICAgZXJyID0gc291cmNlLT5yZWFkKCZtYnVmLCAmb3B0aW9ucyk7CiAgICAgICAgICAgICBpZiAoZXJyID09IE9LICYmIG1idWYgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIG1lZGlhQnVmZmVycy5wdXNoX2JhY2sobWJ1Zik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgbUxvY2subG9jaygpOwogCiAgICAgICAgIG9wdGlvbnMuY2xlYXJOb25QZXJzaXN0ZW50KCk7CiAKICAgICAgICAgc2l6ZV90IGlkID0gMDsKICAgICAgICAgc2l6ZV90IGNvdW50ID0gbWVkaWFCdWZmZXJzLnNpemUoKTsKKworICAgICAgICAvLyBpbiBjYXNlIHRyYWNrIGhhcyBiZWVuIGNoYW5nZWQgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBsb2NrIGZvciBzb21lIHRpbWUuCisgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IGdldERhdGFHZW5lcmF0aW9uKHRyYWNrVHlwZSkpIHsKKyAgICAgICAgICAgIGZvciAoOyBpZCA8IGNvdW50OyArK2lkKSB7CisgICAgICAgICAgICAgICAgbWVkaWFCdWZmZXJzW2lkXS0+cmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBmb3IgKDsgaWQgPCBjb3VudDsgKytpZCkgewogICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqbWJ1ZiA9IG1lZGlhQnVmZmVyc1tpZF07Ci0gICAgICAgICAgICBpZiAoIW1idWYtPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKSB7Ci0gICAgICAgICAgICAgICAgbWJ1Zi0+bWV0YV9kYXRhKCktPmR1bXBUb0xvZygpOworICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICptYnVmID0gbWVkaWFCdWZmZXJzW2lkXTsKKyAgICAgICAgICAgIGlmICghbWJ1Zi0+bWV0YV9kYXRhKCkuZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSkgeworICAgICAgICAgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLmR1bXBUb0xvZygpOwogICAgICAgICAgICAgICAgIHRyYWNrLT5tUGFja2V0cy0+c2lnbmFsRU9TKEVSUk9SX01BTEZPUk1FRCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfQVVESU8pIHsKICAgICAgICAgICAgICAgICBtQXVkaW9UaW1lVXMgPSB0aW1lVXM7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlcmluZ01vbml0b3ItPnVwZGF0ZVF1ZXVlZFRpbWUodHJ1ZSAvKiBpc0F1ZGlvICovLCB0aW1lVXMpOwogICAgICAgICAgICAgfSBlbHNlIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9WSURFTykgewogICAgICAgICAgICAgICAgIG1WaWRlb1RpbWVVcyA9IHRpbWVVczsKLSAgICAgICAgICAgICAgICBtQnVmZmVyaW5nTW9uaXRvci0+dXBkYXRlUXVldWVkVGltZShmYWxzZSAvKiBpc0F1ZGlvICovLCB0aW1lVXMpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBxdWV1ZURpc2NvbnRpbnVpdHlJZk5lZWRlZChzZWVraW5nLCBmb3JtYXRDaGFuZ2UsIHRyYWNrVHlwZSwgdHJhY2spOwpAQCAtMTUxNiw2ICsxNDMzLDQxIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KKworICAgIGlmIChtSXNTdHJlYW1pbmcKKyAgICAgICAgJiYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1ZJREVPIHx8IHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX0FVRElPKSkgeworICAgICAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKKyAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzID0gdHJhY2stPm1QYWNrZXRzLT5nZXRCdWZmZXJlZER1cmF0aW9uVXMoJmZpbmFsUmVzdWx0KTsKKworICAgICAgICAvLyBUT0RPOiBtYXhSZWJ1ZmZlcmluZ01hcmtNcyBjb3VsZCBiZSBsYXJnZXIgdGhhbgorICAgICAgICAvLyBtQnVmZmVyaW5nU2V0dGluZ3MubVJlc3VtZVBsYXliYWNrTWFya01zCisgICAgICAgIGludDY0X3QgbWFya1VzID0gKG1QcmVwYXJpbmcgPyBtQnVmZmVyaW5nU2V0dGluZ3MubUluaXRpYWxNYXJrTXMKKyAgICAgICAgICAgIDogbUJ1ZmZlcmluZ1NldHRpbmdzLm1SZXN1bWVQbGF5YmFja01hcmtNcykgKiAxMDAwbGw7CisgICAgICAgIGlmIChmaW5hbFJlc3VsdCA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNIHx8IGR1cmF0aW9uVXMgPj0gbWFya1VzKSB7CisgICAgICAgICAgICBpZiAobVByZXBhcmluZyB8fCBtU2VudFBhdXNlT25CdWZmZXJpbmcpIHsKKyAgICAgICAgICAgICAgICBUcmFjayAqY291bnRlclRyYWNrID0KKyAgICAgICAgICAgICAgICAgICAgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1ZJREVPID8gJm1BdWRpb1RyYWNrIDogJm1WaWRlb1RyYWNrKTsKKyAgICAgICAgICAgICAgICBpZiAoY291bnRlclRyYWNrLT5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25VcyA9IGNvdW50ZXJUcmFjay0+bVBhY2tldHMtPmdldEJ1ZmZlcmVkRHVyYXRpb25VcygmZmluYWxSZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmluYWxSZXN1bHQgPT0gRVJST1JfRU5EX09GX1NUUkVBTSB8fCBkdXJhdGlvblVzID49IG1hcmtVcykgeworICAgICAgICAgICAgICAgICAgICBpZiAobVByZXBhcmluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QcmVwYXJpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRDYWNoZVN0YXRzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2VudFBhdXNlT25CdWZmZXJpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFJlc3VtZU9uQnVmZmVyaW5nRW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgcG9zdFJlYWRCdWZmZXIodHJhY2tUeXBlKTsKKyAgICB9CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnF1ZXVlRGlzY29udGludWl0eUlmTmVlZGVkKApAQCAtMTUzMywxNjAgKzE0ODUsNyBAQAogICAgIH0KIH0KIAotTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OkJ1ZmZlcmluZ01vbml0b3I6OkJ1ZmZlcmluZ01vbml0b3IoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCi0gICAgOiBtTm90aWZ5KG5vdGlmeSksCi0gICAgICBtRHVyYXRpb25VcygtMWxsKSwKLSAgICAgIG1CaXRyYXRlKC0xbGwpLAotICAgICAgbUlzU3RyZWFtaW5nKGZhbHNlKSwKLSAgICAgIG1BdWRpb1RpbWVVcygwKSwKLSAgICAgIG1WaWRlb1RpbWVVcygwKSwKLSAgICAgIG1Qb2xsQnVmZmVyaW5nR2VuZXJhdGlvbigwKSwKLSAgICAgIG1QcmVwYXJlQnVmZmVyaW5nKGZhbHNlKSwKLSAgICAgIG1CdWZmZXJpbmcoZmFsc2UpLAotICAgICAgbVByZXZCdWZmZXJQZXJjZW50YWdlKC0xKSwKLSAgICAgIG1PZmZsb2FkQXVkaW8oZmFsc2UpLAotICAgICAgbUZpcnN0RGVxdWV1ZWRCdWZmZXJSZWFsVXMoLTFsbCksCi0gICAgICBtRmlyc3REZXF1ZXVlZEJ1ZmZlck1lZGlhVXMoLTFsbCksCi0gICAgICBtbGFzdERlcXVldWVkQnVmZmVyTWVkaWFVcygtMWxsKSB7Ci0gICAgICBnZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MoJm1TZXR0aW5ncyk7Ci19Ci0KLU51UGxheWVyOjpHZW5lcmljU291cmNlOjpCdWZmZXJpbmdNb25pdG9yOjp+QnVmZmVyaW5nTW9uaXRvcigpIHsKLX0KLQotdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6QnVmZmVyaW5nTW9uaXRvcjo6Z2V0RGVmYXVsdEJ1ZmZlcmluZ1NldHRpbmdzKAotICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyAqYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pIHsKLSAgICBidWZmZXJpbmctPm1Jbml0aWFsQnVmZmVyaW5nTW9kZSA9IEJVRkZFUklOR19NT0RFX1RJTUVfT05MWTsKLSAgICBidWZmZXJpbmctPm1SZWJ1ZmZlcmluZ01vZGUgPSBCVUZGRVJJTkdfTU9ERV9USU1FX1RIRU5fU0laRTsKLSAgICBidWZmZXJpbmctPm1Jbml0aWFsV2F0ZXJtYXJrTXMgPSBrSGlnaFdhdGVyTWFya01zOwotICAgIGJ1ZmZlcmluZy0+bVJlYnVmZmVyaW5nV2F0ZXJtYXJrTG93TXMgPSBrTG93V2F0ZXJNYXJrTXM7Ci0gICAgYnVmZmVyaW5nLT5tUmVidWZmZXJpbmdXYXRlcm1hcmtIaWdoTXMgPSBrSGlnaFdhdGVyTWFya1JlYnVmZmVyTXM7Ci0gICAgYnVmZmVyaW5nLT5tUmVidWZmZXJpbmdXYXRlcm1hcmtMb3dLQiA9IGtMb3dXYXRlck1hcmtLQjsKLSAgICBidWZmZXJpbmctPm1SZWJ1ZmZlcmluZ1dhdGVybWFya0hpZ2hLQiA9IGtIaWdoV2F0ZXJNYXJrS0I7Ci0KLSAgICBBTE9HVigiQnVmZmVyaW5nTW9uaXRvcjo6Z2V0RGVmYXVsdEJ1ZmZlcmluZ1NldHRpbmdzeyVzfSIsCi0gICAgICAgICAgICBidWZmZXJpbmctPnRvU3RyaW5nKCkuc3RyaW5nKCkpOwotfQotCi1zdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6QnVmZmVyaW5nTW9uaXRvcjo6c2V0QnVmZmVyaW5nU2V0dGluZ3MoCi0gICAgICAgIGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzICZidWZmZXJpbmcpIHsKLSAgICBBTE9HVigiQnVmZmVyaW5nTW9uaXRvcjo6c2V0QnVmZmVyaW5nU2V0dGluZ3N7JXN9IiwKLSAgICAgICAgICAgIGJ1ZmZlcmluZy50b1N0cmluZygpLnN0cmluZygpKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKGJ1ZmZlcmluZy5Jc1NpemVCYXNlZEJ1ZmZlcmluZ01vZGUoYnVmZmVyaW5nLm1Jbml0aWFsQnVmZmVyaW5nTW9kZSkKLSAgICAgICAgICAgIHx8IChidWZmZXJpbmcuSXNUaW1lQmFzZWRCdWZmZXJpbmdNb2RlKGJ1ZmZlcmluZy5tUmVidWZmZXJpbmdNb2RlKQotICAgICAgICAgICAgICAgICYmIGJ1ZmZlcmluZy5tUmVidWZmZXJpbmdXYXRlcm1hcmtMb3dNcyA+IGJ1ZmZlcmluZy5tUmVidWZmZXJpbmdXYXRlcm1hcmtIaWdoTXMpCi0gICAgICAgICAgICB8fCAoYnVmZmVyaW5nLklzU2l6ZUJhc2VkQnVmZmVyaW5nTW9kZShidWZmZXJpbmcubVJlYnVmZmVyaW5nTW9kZSkKLSAgICAgICAgICAgICAgICAmJiBidWZmZXJpbmcubVJlYnVmZmVyaW5nV2F0ZXJtYXJrTG93S0IgPiBidWZmZXJpbmcubVJlYnVmZmVyaW5nV2F0ZXJtYXJrSGlnaEtCKSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBtU2V0dGluZ3MgPSBidWZmZXJpbmc7Ci0gICAgaWYgKG1TZXR0aW5ncy5tSW5pdGlhbEJ1ZmZlcmluZ01vZGUgPT0gQlVGRkVSSU5HX01PREVfTk9ORSkgewotICAgICAgICBtU2V0dGluZ3MubUluaXRpYWxXYXRlcm1hcmtNcyA9IEJ1ZmZlcmluZ1NldHRpbmdzOjprTm9XYXRlcm1hcms7Ci0gICAgfQotICAgIGlmICghbVNldHRpbmdzLklzVGltZUJhc2VkQnVmZmVyaW5nTW9kZShtU2V0dGluZ3MubVJlYnVmZmVyaW5nTW9kZSkpIHsKLSAgICAgICAgbVNldHRpbmdzLm1SZWJ1ZmZlcmluZ1dhdGVybWFya0xvd01zID0gQnVmZmVyaW5nU2V0dGluZ3M6OmtOb1dhdGVybWFyazsKLSAgICAgICAgbVNldHRpbmdzLm1SZWJ1ZmZlcmluZ1dhdGVybWFya0hpZ2hNcyA9IElOVDMyX01BWDsKLSAgICB9Ci0gICAgaWYgKCFtU2V0dGluZ3MuSXNTaXplQmFzZWRCdWZmZXJpbmdNb2RlKG1TZXR0aW5ncy5tUmVidWZmZXJpbmdNb2RlKSkgewotICAgICAgICBtU2V0dGluZ3MubVJlYnVmZmVyaW5nV2F0ZXJtYXJrTG93S0IgPSBCdWZmZXJpbmdTZXR0aW5nczo6a05vV2F0ZXJtYXJrOwotICAgICAgICBtU2V0dGluZ3MubVJlYnVmZmVyaW5nV2F0ZXJtYXJrSGlnaEtCID0gSU5UMzJfTUFYOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OkJ1ZmZlcmluZ01vbml0b3I6OnByZXBhcmUoCi0gICAgICAgIGNvbnN0IHNwPE51Q2FjaGVkU291cmNlMj4gJmNhY2hlZFNvdXJjZSwKLSAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzLAotICAgICAgICBpbnQ2NF90IGJpdHJhdGUsCi0gICAgICAgIGJvb2wgaXNTdHJlYW1pbmcpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHByZXBhcmVfbChjYWNoZWRTb3VyY2UsIGR1cmF0aW9uVXMsIGJpdHJhdGUsIGlzU3RyZWFtaW5nKTsKLX0KLQotdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6QnVmZmVyaW5nTW9uaXRvcjo6c3RvcCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHByZXBhcmVfbChOVUxMIC8qIGNhY2hlZFNvdXJjZSAqLywgLTEgLyogZHVyYXRpb25VcyAqLywKLSAgICAgICAgICAgIC0xIC8qIGJpdHJhdGUgKi8sIGZhbHNlIC8qIGlzU3RyZWFtaW5nICovKTsKLX0KLQotdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6QnVmZmVyaW5nTW9uaXRvcjo6Y2FuY2VsUG9sbEJ1ZmZlcmluZygpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGNhbmNlbFBvbGxCdWZmZXJpbmdfbCgpOwotfQotCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpCdWZmZXJpbmdNb25pdG9yOjpyZXN0YXJ0UG9sbEJ1ZmZlcmluZygpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtSXNTdHJlYW1pbmcpIHsKLSAgICAgICAgY2FuY2VsUG9sbEJ1ZmZlcmluZ19sKCk7Ci0gICAgICAgIG9uUG9sbEJ1ZmZlcmluZ19sKCk7Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpCdWZmZXJpbmdNb25pdG9yOjpzdG9wQnVmZmVyaW5nSWZOZWNlc3NhcnkoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBzdG9wQnVmZmVyaW5nSWZOZWNlc3NhcnlfbCgpOwotfQotCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpCdWZmZXJpbmdNb25pdG9yOjplbnN1cmVDYWNoZUlzRmV0Y2hpbmcoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBlbnN1cmVDYWNoZUlzRmV0Y2hpbmdfbCgpOwotfQotCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpCdWZmZXJpbmdNb25pdG9yOjp1cGRhdGVRdWV1ZWRUaW1lKGJvb2wgaXNBdWRpbywgaW50NjRfdCB0aW1lVXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChpc0F1ZGlvKSB7Ci0gICAgICAgIG1BdWRpb1RpbWVVcyA9IHRpbWVVczsKLSAgICB9IGVsc2UgewotICAgICAgICBtVmlkZW9UaW1lVXMgPSB0aW1lVXM7Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpCdWZmZXJpbmdNb25pdG9yOjpzZXRPZmZsb2FkQXVkaW8oYm9vbCBvZmZsb2FkKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtT2ZmbG9hZEF1ZGlvID0gb2ZmbG9hZDsKLX0KLQotdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6QnVmZmVyaW5nTW9uaXRvcjo6dXBkYXRlRGVxdWV1ZWRCdWZmZXJUaW1lKGludDY0X3QgbWVkaWFVcykgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1lZGlhVXMgPCAwKSB7Ci0gICAgICAgIG1GaXJzdERlcXVldWVkQnVmZmVyUmVhbFVzID0gLTFsbDsKLSAgICAgICAgbUZpcnN0RGVxdWV1ZWRCdWZmZXJNZWRpYVVzID0gLTFsbDsKLSAgICB9IGVsc2UgaWYgKG1GaXJzdERlcXVldWVkQnVmZmVyUmVhbFVzIDwgMCkgewotICAgICAgICBtRmlyc3REZXF1ZXVlZEJ1ZmZlclJlYWxVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgICAgIG1GaXJzdERlcXVldWVkQnVmZmVyTWVkaWFVcyA9IG1lZGlhVXM7Ci0gICAgfQotICAgIG1sYXN0RGVxdWV1ZWRCdWZmZXJNZWRpYVVzID0gbWVkaWFVczsKLX0KLQotdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6QnVmZmVyaW5nTW9uaXRvcjo6cHJlcGFyZV9sKAotICAgICAgICBjb25zdCBzcDxOdUNhY2hlZFNvdXJjZTI+ICZjYWNoZWRTb3VyY2UsCi0gICAgICAgIGludDY0X3QgZHVyYXRpb25VcywKLSAgICAgICAgaW50NjRfdCBiaXRyYXRlLAotICAgICAgICBib29sIGlzU3RyZWFtaW5nKSB7Ci0KLSAgICBtQ2FjaGVkU291cmNlID0gY2FjaGVkU291cmNlOwotICAgIG1EdXJhdGlvblVzID0gZHVyYXRpb25VczsKLSAgICBtQml0cmF0ZSA9IGJpdHJhdGU7Ci0gICAgbUlzU3RyZWFtaW5nID0gaXNTdHJlYW1pbmc7Ci0gICAgbUF1ZGlvVGltZVVzID0gMDsKLSAgICBtVmlkZW9UaW1lVXMgPSAwOwotICAgIG1QcmVwYXJlQnVmZmVyaW5nID0gKGNhY2hlZFNvdXJjZSAhPSBOVUxMKTsKLSAgICBjYW5jZWxQb2xsQnVmZmVyaW5nX2woKTsKLSAgICBtT2ZmbG9hZEF1ZGlvID0gZmFsc2U7Ci0gICAgbUZpcnN0RGVxdWV1ZWRCdWZmZXJSZWFsVXMgPSAtMWxsOwotICAgIG1GaXJzdERlcXVldWVkQnVmZmVyTWVkaWFVcyA9IC0xbGw7Ci0gICAgbWxhc3REZXF1ZXVlZEJ1ZmZlck1lZGlhVXMgPSAtMWxsOwotfQotCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpCdWZmZXJpbmdNb25pdG9yOjpjYW5jZWxQb2xsQnVmZmVyaW5nX2woKSB7Ci0gICAgbUJ1ZmZlcmluZyA9IGZhbHNlOwotICAgICsrbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uOwotICAgIG1QcmV2QnVmZmVyUGVyY2VudGFnZSA9IC0xOwotfQotCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpCdWZmZXJpbmdNb25pdG9yOjpub3RpZnlCdWZmZXJpbmdVcGRhdGVfbChpbnQzMl90IHBlcmNlbnRhZ2UpIHsKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZShpbnQzMl90IHBlcmNlbnRhZ2UpIHsKICAgICAvLyBCdWZmZXJpbmcgcGVyY2VudCBjb3VsZCBnbyBiYWNrd2FyZCBhcyBpdCdzIGVzdGltYXRlZCBmcm9tIHJlbWFpbmluZwogICAgIC8vIGRhdGEgYW5kIGxhc3QgYWNjZXNzIHRpbWUuIFRoaXMgY291bGQgY2F1c2UgdGhlIGJ1ZmZlcmluZyBwb3NpdGlvbgogICAgIC8vIGRyYXduIG9uIG1lZGlhIGNvbnRyb2wgdG8gaml0dGVyIHNsaWdodGx5LiBSZW1lbWJlciBwcmV2aW91c2x5IHJlcG9ydGVkCkBAIC0xNjk5LDEwNiArMTQ5OCwyOCBAQAogCiAgICAgbVByZXZCdWZmZXJQZXJjZW50YWdlID0gcGVyY2VudGFnZTsKIAotICAgIEFMT0dWKCJub3RpZnlCdWZmZXJpbmdVcGRhdGVfbDogYnVmZmVyaW5nICVkJSUiLCBwZXJjZW50YWdlKTsKKyAgICBBTE9HVigibm90aWZ5QnVmZmVyaW5nVXBkYXRlOiBidWZmZXJpbmcgJWQlJSIsIHBlcmNlbnRhZ2UpOwogCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG1zZy0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEJ1ZmZlcmluZ1VwZGF0ZSk7Ci0gICAgbXNnLT5zZXRJbnQzMigicGVyY2VudGFnZSIsIHBlcmNlbnRhZ2UpOwotICAgIG1zZy0+cG9zdCgpOworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRCdWZmZXJpbmdVcGRhdGUpOworICAgIG5vdGlmeS0+c2V0SW50MzIoInBlcmNlbnRhZ2UiLCBwZXJjZW50YWdlKTsKKyAgICBub3RpZnktPnBvc3QoKTsKIH0KIAotdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6QnVmZmVyaW5nTW9uaXRvcjo6c3RhcnRCdWZmZXJpbmdJZk5lY2Vzc2FyeV9sKCkgewotICAgIGlmIChtUHJlcGFyZUJ1ZmZlcmluZykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCFtQnVmZmVyaW5nKSB7Ci0gICAgICAgIEFMT0dEKCJzdGFydEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5X2wiKTsKLQotICAgICAgICBtQnVmZmVyaW5nID0gdHJ1ZTsKLQotICAgICAgICBlbnN1cmVDYWNoZUlzRmV0Y2hpbmdfbCgpOwotICAgICAgICBzZW5kQ2FjaGVTdGF0c19sKCk7Ci0KLSAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRQYXVzZU9uQnVmZmVyaW5nU3RhcnQpOwotICAgICAgICBub3RpZnktPnBvc3QoKTsKLSAgICB9Ci19Ci0KLXZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OkJ1ZmZlcmluZ01vbml0b3I6OnN0b3BCdWZmZXJpbmdJZk5lY2Vzc2FyeV9sKCkgewotICAgIGlmIChtUHJlcGFyZUJ1ZmZlcmluZykgewotICAgICAgICBBTE9HRCgic3RvcEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5X2wsIG1CdWZmZXJpbmc9JWQiLCBtQnVmZmVyaW5nKTsKLQotICAgICAgICBtUHJlcGFyZUJ1ZmZlcmluZyA9IGZhbHNlOwotCi0gICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UHJlcGFyZWQpOwotICAgICAgICBub3RpZnktPnNldEludDMyKCJlcnIiLCBPSyk7Ci0gICAgICAgIG5vdGlmeS0+cG9zdCgpOwotCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobUJ1ZmZlcmluZykgewotICAgICAgICBBTE9HRCgic3RvcEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5X2wiKTsKLSAgICAgICAgbUJ1ZmZlcmluZyA9IGZhbHNlOwotCi0gICAgICAgIHNlbmRDYWNoZVN0YXRzX2woKTsKLQotICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFJlc3VtZU9uQnVmZmVyaW5nRW5kKTsKLSAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpCdWZmZXJpbmdNb25pdG9yOjpzZW5kQ2FjaGVTdGF0c19sKCkgewotICAgIGludDMyX3Qga2JwcyA9IDA7Ci0gICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKLQotICAgIGlmIChtQ2FjaGVkU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgZXJyID0gbUNhY2hlZFNvdXJjZS0+Z2V0RXN0aW1hdGVkQmFuZHdpZHRoS2Jwcygma2Jwcyk7Ci0gICAgfQotCi0gICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdENhY2hlU3RhdHMpOwotICAgICAgICBub3RpZnktPnNldEludDMyKCJiYW5kd2lkdGgiLCBrYnBzKTsKLSAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpCdWZmZXJpbmdNb25pdG9yOjplbnN1cmVDYWNoZUlzRmV0Y2hpbmdfbCgpIHsKLSAgICBpZiAobUNhY2hlZFNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1DYWNoZWRTb3VyY2UtPnJlc3VtZUZldGNoaW5nSWZOZWNlc3NhcnkoKTsKLSAgICB9Ci19Ci0KLXZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OkJ1ZmZlcmluZ01vbml0b3I6OnNjaGVkdWxlUG9sbEJ1ZmZlcmluZ19sKCkgewordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c2NoZWR1bGVQb2xsQnVmZmVyaW5nKCkgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQb2xsQnVmZmVyaW5nLCB0aGlzKTsKICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uKTsKICAgICAvLyBFbnF1aXJlcyBidWZmZXJpbmcgc3RhdHVzIGV2ZXJ5IHNlY29uZC4KICAgICBtc2ctPnBvc3QoMTAwMDAwMGxsKTsKIH0KIAotaW50NjRfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6QnVmZmVyaW5nTW9uaXRvcjo6Z2V0TGFzdFJlYWRQb3NpdGlvbl9sKCkgewotICAgIGlmIChtQXVkaW9UaW1lVXMgPiAwKSB7Ci0gICAgICAgIHJldHVybiBtQXVkaW9UaW1lVXM7Ci0gICAgfSBlbHNlIGlmIChtVmlkZW9UaW1lVXMgPiAwKSB7Ci0gICAgICAgIHJldHVybiBtVmlkZW9UaW1lVXM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpCdWZmZXJpbmdNb25pdG9yOjpvblBvbGxCdWZmZXJpbmdfbCgpIHsKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om9uUG9sbEJ1ZmZlcmluZygpIHsKICAgICBzdGF0dXNfdCBmaW5hbFN0YXR1cyA9IFVOS05PV05fRVJST1I7CiAgICAgaW50NjRfdCBjYWNoZWREdXJhdGlvblVzID0gLTFsbDsKICAgICBzc2l6ZV90IGNhY2hlZERhdGFSZW1haW5pbmcgPSAtMTsKIAogICAgIGlmIChtQ2FjaGVkU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgY2FjaGVkRGF0YVJlbWFpbmluZyA9Ci0gICAgICAgICAgICAgICAgbUNhY2hlZFNvdXJjZS0+YXBwcm94RGF0YVJlbWFpbmluZygmZmluYWxTdGF0dXMpOworICAgICAgICBjYWNoZWREYXRhUmVtYWluaW5nID0gbUNhY2hlZFNvdXJjZS0+YXBwcm94RGF0YVJlbWFpbmluZygmZmluYWxTdGF0dXMpOwogCiAgICAgICAgIGlmIChmaW5hbFN0YXR1cyA9PSBPSykgewogICAgICAgICAgICAgb2ZmNjRfdCBzaXplOwpAQCAtMTgxNiwxNTcgKzE1MzcsNDkgQEAKICAgICB9CiAKICAgICBpZiAoZmluYWxTdGF0dXMgIT0gT0spIHsKLSAgICAgICAgQUxPR1YoIm9uUG9sbEJ1ZmZlcmluZ19sOiBFT1MgKGZpbmFsU3RhdHVzID0gJWQpIiwgZmluYWxTdGF0dXMpOworICAgICAgICBBTE9HVigib25Qb2xsQnVmZmVyaW5nOiBFT1MgKGZpbmFsU3RhdHVzID0gJWQpIiwgZmluYWxTdGF0dXMpOwogCiAgICAgICAgIGlmIChmaW5hbFN0YXR1cyA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICBub3RpZnlCdWZmZXJpbmdVcGRhdGVfbCgxMDApOworICAgICAgICAgICAgbm90aWZ5QnVmZmVyaW5nVXBkYXRlKDEwMCk7CiAgICAgICAgIH0KIAotICAgICAgICBzdG9wQnVmZmVyaW5nSWZOZWNlc3NhcnlfbCgpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgaWYgKGNhY2hlZER1cmF0aW9uVXMgPj0gMGxsKSB7CiAgICAgICAgIGlmIChtRHVyYXRpb25VcyA+IDBsbCkgewotICAgICAgICAgICAgaW50NjRfdCBjYWNoZWRQb3NVcyA9IGdldExhc3RSZWFkUG9zaXRpb25fbCgpICsgY2FjaGVkRHVyYXRpb25VczsKKyAgICAgICAgICAgIGludDY0X3QgY2FjaGVkUG9zVXMgPSBnZXRMYXN0UmVhZFBvc2l0aW9uKCkgKyBjYWNoZWREdXJhdGlvblVzOwogICAgICAgICAgICAgaW50IHBlcmNlbnRhZ2UgPSAxMDAuMCAqIGNhY2hlZFBvc1VzIC8gbUR1cmF0aW9uVXM7CiAgICAgICAgICAgICBpZiAocGVyY2VudGFnZSA+IDEwMCkgewogICAgICAgICAgICAgICAgIHBlcmNlbnRhZ2UgPSAxMDA7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZV9sKHBlcmNlbnRhZ2UpOworICAgICAgICAgICAgbm90aWZ5QnVmZmVyaW5nVXBkYXRlKHBlcmNlbnRhZ2UpOwogICAgICAgICB9CiAKLSAgICAgICAgQUxPR1YoIm9uUG9sbEJ1ZmZlcmluZ19sOiBjYWNoZWREdXJhdGlvblVzICUuMWYgc2VjIiwgY2FjaGVkRHVyYXRpb25VcyAvIDEwMDAwMDAuMGYpOwotCi0gICAgICAgIGlmIChtUHJlcGFyZUJ1ZmZlcmluZykgewotICAgICAgICAgICAgaWYgKGNhY2hlZER1cmF0aW9uVXMgPiBtU2V0dGluZ3MubUluaXRpYWxXYXRlcm1hcmtNcyAqIDEwMDApIHsKLSAgICAgICAgICAgICAgICBzdG9wQnVmZmVyaW5nSWZOZWNlc3NhcnlfbCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1TZXR0aW5ncy5Jc1RpbWVCYXNlZEJ1ZmZlcmluZ01vZGUobVNldHRpbmdzLm1SZWJ1ZmZlcmluZ01vZGUpKSB7Ci0gICAgICAgICAgICBpZiAoY2FjaGVkRHVyYXRpb25VcyA8IG1TZXR0aW5ncy5tUmVidWZmZXJpbmdXYXRlcm1hcmtMb3dNcyAqIDEwMDApIHsKLSAgICAgICAgICAgICAgICAvLyBUYWtlIGludG8gYWNjb3VudCB0aGUgZGF0YSBjYWNoZWQgaW4gZG93bnN0cmVhbSBjb21wb25lbnRzIHRvIHRyeSB0byBhdm9pZAotICAgICAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHBhdXNlLgotICAgICAgICAgICAgICAgIGlmIChtT2ZmbG9hZEF1ZGlvICYmIG1GaXJzdERlcXVldWVkQnVmZmVyUmVhbFVzID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkb3duU3RyZWFtQ2FjaGVVcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtbGFzdERlcXVldWVkQnVmZmVyTWVkaWFVcyAtIG1GaXJzdERlcXVldWVkQnVmZmVyTWVkaWFVcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKEFMb29wZXI6OkdldE5vd1VzKCkgLSBtRmlyc3REZXF1ZXVlZEJ1ZmZlclJlYWxVcyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkb3duU3RyZWFtQ2FjaGVVcyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZER1cmF0aW9uVXMgKz0gZG93blN0cmVhbUNhY2hlVXM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2FjaGVkRHVyYXRpb25VcyA8IG1TZXR0aW5ncy5tUmVidWZmZXJpbmdXYXRlcm1hcmtMb3dNcyAqIDEwMDApIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhcnRCdWZmZXJpbmdJZk5lY2Vzc2FyeV9sKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChjYWNoZWREdXJhdGlvblVzID4gbVNldHRpbmdzLm1SZWJ1ZmZlcmluZ1dhdGVybWFya0hpZ2hNcyAqIDEwMDApIHsKLSAgICAgICAgICAgICAgICBzdG9wQnVmZmVyaW5nSWZOZWNlc3NhcnlfbCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChjYWNoZWREYXRhUmVtYWluaW5nID49IDAKLSAgICAgICAgICAgICYmIG1TZXR0aW5ncy5Jc1NpemVCYXNlZEJ1ZmZlcmluZ01vZGUobVNldHRpbmdzLm1SZWJ1ZmZlcmluZ01vZGUpKSB7Ci0gICAgICAgIEFMT0dWKCJvblBvbGxCdWZmZXJpbmdfbDogY2FjaGVkRGF0YVJlbWFpbmluZyAlemQgYnl0ZXMiLAotICAgICAgICAgICAgICAgIGNhY2hlZERhdGFSZW1haW5pbmcpOwotCi0gICAgICAgIGlmIChjYWNoZWREYXRhUmVtYWluaW5nIDwgKG1TZXR0aW5ncy5tUmVidWZmZXJpbmdXYXRlcm1hcmtMb3dLQiA8PCAxMCkpIHsKLSAgICAgICAgICAgIHN0YXJ0QnVmZmVyaW5nSWZOZWNlc3NhcnlfbCgpOwotICAgICAgICB9IGVsc2UgaWYgKGNhY2hlZERhdGFSZW1haW5pbmcgPiAobVNldHRpbmdzLm1SZWJ1ZmZlcmluZ1dhdGVybWFya0hpZ2hLQiA8PCAxMCkpIHsKLSAgICAgICAgICAgIHN0b3BCdWZmZXJpbmdJZk5lY2Vzc2FyeV9sKCk7Ci0gICAgICAgIH0KKyAgICAgICAgQUxPR1YoIm9uUG9sbEJ1ZmZlcmluZzogY2FjaGVkRHVyYXRpb25VcyAlLjFmIHNlYyIsIGNhY2hlZER1cmF0aW9uVXMgLyAxMDAwMDAwLjBmKTsKICAgICB9CiAKLSAgICBzY2hlZHVsZVBvbGxCdWZmZXJpbmdfbCgpOwotfQotCi12b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpCdWZmZXJpbmdNb25pdG9yOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewotICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKLSAgICAgIGNhc2Uga1doYXRQb2xsQnVmZmVyaW5nOgotICAgICAgewotICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKLSAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7Ci0gICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiA9PSBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb24pIHsKLSAgICAgICAgICAgICAgb25Qb2xsQnVmZmVyaW5nX2woKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBkZWZhdWx0OgotICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgfQorICAgIHNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpOwogfQogCiAvLyBNb2R1bGFyIERSTQogc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnByZXBhcmVEcm0oCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkLCBzcDxJQ3J5cHRvPiAqY3J5cHRvKQoteworICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJmRybVNlc3Npb25JZCwgc3A8SUNyeXB0bz4gKm91dENyeXB0bykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQUxPR1YoInByZXBhcmVEcm0iKTsKIAotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQcmVwYXJlRHJtLCB0aGlzKTsKLSAgICAvLyBzeW5jaHJvbm91cyBjYWxsIHNvIGp1c3QgcGFzc2luZyB0aGUgYWRkcmVzcyBidXQgd2l0aCBsb2NhbCBjb3BpZXMgb2YgImNvbnN0IiBhcmdzCi0gICAgdWludDhfdCBVVUlEWzE2XTsKLSAgICBtZW1jcHkoVVVJRCwgdXVpZCwgc2l6ZW9mKFVVSUQpKTsKLSAgICBWZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkID0gZHJtU2Vzc2lvbklkOwotICAgIG1zZy0+c2V0UG9pbnRlcigidXVpZCIsICh2b2lkKilVVUlEKTsKLSAgICBtc2ctPnNldFBvaW50ZXIoImRybVNlc3Npb25JZCIsICh2b2lkKikmc2Vzc2lvbklkKTsKLSAgICBtc2ctPnNldFBvaW50ZXIoImNyeXB0byIsICh2b2lkKiljcnlwdG8pOwotCi0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKLQotICAgIGlmIChzdGF0dXMgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgewotICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJzdGF0dXMiLCAmc3RhdHVzKSk7Ci0gICAgICAgIEFMT0dWX0lGKHN0YXR1cyA9PSBPSywgInByZXBhcmVEcm06IG1DcnlwdG86ICVwICglZCkiLCBjcnlwdG8tPmdldCgpLAotICAgICAgICAgICAgICAgICgqY3J5cHRvICE9IE5VTEwgPyAoKmNyeXB0byktPmdldFN0cm9uZ0NvdW50KCkgOiAwKSk7Ci0gICAgICAgIEFMT0dEKCJwcmVwYXJlRHJtIHJldDogJWQgIiwgc3RhdHVzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgicHJlcGFyZURybSBlcnI6ICVkIiwgc3RhdHVzKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6cmVsZWFzZURybSgpCi17Ci0gICAgQUxPR1YoInJlbGVhc2VEcm0iKTsKLQotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWxlYXNlRHJtLCB0aGlzKTsKLQotICAgIC8vIHN5bmNocm9ub3VzIGNhbGwgdG8gdXBkYXRlIHRoZSBzb3VyY2Ugc3RhdGVzIGJlZm9yZSB0aGUgcGxheWVyIHByb2NlZWRlcyB3aXRoIGNyeXB0byBjbGVhbnVwCi0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKLQotICAgIGlmIChzdGF0dXMgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgewotICAgICAgICBBTE9HRCgicmVsZWFzZURybSByZXQ6IE9LICIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJyZWxlYXNlRHJtIGVycjogJWQiLCBzdGF0dXMpOwotICAgIH0KLQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpvblByZXBhcmVEcm0oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpCi17Ci0gICAgQUxPR1YoIm9uUHJlcGFyZURybSAiKTsKLQogICAgIG1Jc0RybVByb3RlY3RlZCA9IGZhbHNlOwogICAgIG1Jc0RybVJlbGVhc2VkID0gZmFsc2U7CiAgICAgbUlzU2VjdXJlID0gZmFsc2U7CiAKLSAgICB1aW50OF90ICp1dWlkOwotICAgIFZlY3Rvcjx1aW50OF90PiAqZHJtU2Vzc2lvbklkOwotICAgIHNwPElDcnlwdG8+ICpvdXRDcnlwdG87Ci0gICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigidXVpZCIsICh2b2lkKiopJnV1aWQpKTsKLSAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJkcm1TZXNzaW9uSWQiLCAodm9pZCoqKSZkcm1TZXNzaW9uSWQpKTsKLSAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJjcnlwdG8iLCAodm9pZCoqKSZvdXRDcnlwdG8pKTsKLQogICAgIHN0YXR1c190IHN0YXR1cyA9IE9LOwotICAgIHNwPElDcnlwdG8+IGNyeXB0byA9IE51UGxheWVyRHJtOjpjcmVhdGVDcnlwdG9BbmRQbHVnaW4odXVpZCwgKmRybVNlc3Npb25JZCwgc3RhdHVzKTsKKyAgICBzcDxJQ3J5cHRvPiBjcnlwdG8gPSBOdVBsYXllckRybTo6Y3JlYXRlQ3J5cHRvQW5kUGx1Z2luKHV1aWQsIGRybVNlc3Npb25JZCwgc3RhdHVzKTsKICAgICBpZiAoY3J5cHRvID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIm9uUHJlcGFyZURybTogY3JlYXRlQ3J5cHRvIGZhaWxlZC4gc3RhdHVzOiAlZCIsIHN0YXR1cyk7CisgICAgICAgIEFMT0dFKCJwcmVwYXJlRHJtOiBjcmVhdGVDcnlwdG8gZmFpbGVkLiBzdGF0dXM6ICVkIiwgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9Ci0gICAgQUxPR1YoIm9uUHJlcGFyZURybTogY3JlYXRlQ3J5cHRvQW5kUGx1Z2luIHN1Y2NlZWRlZCBmb3IgdXVpZDogJXMiLAorICAgIEFMT0dWKCJwcmVwYXJlRHJtOiBjcmVhdGVDcnlwdG9BbmRQbHVnaW4gc3VjY2VlZGVkIGZvciB1dWlkOiAlcyIsCiAgICAgICAgICAgICBEcm1VVUlEOjp0b0hleFN0cmluZyh1dWlkKS5zdHJpbmcoKSk7CiAKICAgICAqb3V0Q3J5cHRvID0gY3J5cHRvOwpAQCAtMTk3NSwxNCArMTU4OCwxNCBAQAogCiAgICAgaWYgKG1NaW1lcy5zaXplKCkgPT0gMCkgewogICAgICAgICBzdGF0dXMgPSBVTktOT1dOX0VSUk9SOwotICAgICAgICBBTE9HRSgib25QcmVwYXJlRHJtOiBVbmV4cGVjdGVkLiBNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHRyYWNrLiBzdGF0dXM6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoInByZXBhcmVEcm06IFVuZXhwZWN0ZWQuIE11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgdHJhY2suIHN0YXR1czogJWQiLCBzdGF0dXMpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAogICAgIC8vIGZpcnN0IG1pbWUgaW4gdGhpcyBsaXN0IGlzIGVpdGhlciB0aGUgdmlkZW8gdHJhY2ssIG9yIHRoZSBmaXJzdCBhdWRpbyB0cmFjawogICAgIGNvbnN0IGNoYXIgKm1pbWUgPSBtTWltZXNbMF0uc3RyaW5nKCk7CiAgICAgbUlzU2VjdXJlID0gY3J5cHRvLT5yZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQobWltZSk7Ci0gICAgQUxPR1YoIm9uUHJlcGFyZURybTogcmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50IG1pbWU6ICVzICBpc1NlY3VyZTogJWQiLAorICAgIEFMT0dWKCJwcmVwYXJlRHJtOiByZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQgbWltZTogJXMgIGlzU2VjdXJlOiAlZCIsCiAgICAgICAgICAgICBtaW1lLCBtSXNTZWN1cmUpOwogCiAgICAgLy8gQ2hlY2tpbmcgdGhlIG1lbWJlciBmbGFncyB3aGlsZSBpbiB0aGUgbG9vcGVyIHRvIHNlbmQgb3V0IHRoZSBub3RpZmljYXRpb24uCkBAIC0xOTk2LDE4ICsxNjA5LDI3IEBACiAgICAgICAgICAgICBGTEFHX0NBTl9TRUVLX0ZPUldBUkQgfAogICAgICAgICAgICAgRkxBR19DQU5fU0VFSyk7CiAKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgIEFMT0dWKCJwcmVwYXJlRHJtOiBtQ3J5cHRvOiAlcCAoJWQpIiwgb3V0Q3J5cHRvLT5nZXQoKSwKKyAgICAgICAgICAgICAgICAoKm91dENyeXB0byAhPSBOVUxMID8gKCpvdXRDcnlwdG8pLT5nZXRTdHJvbmdDb3VudCgpIDogMCkpOworICAgICAgICBBTE9HRCgicHJlcGFyZURybSByZXQ6ICVkICIsIHN0YXR1cyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoInByZXBhcmVEcm0gZXJyOiAlZCIsIHN0YXR1cyk7CisgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpvblJlbGVhc2VEcm0oKQoteworc3RhdHVzX3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnJlbGVhc2VEcm0oKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBTE9HVigicmVsZWFzZURybSIpOworCiAgICAgaWYgKG1Jc0RybVByb3RlY3RlZCkgewogICAgICAgICBtSXNEcm1Qcm90ZWN0ZWQgPSBmYWxzZTsKICAgICAgICAgLy8gdG8gcHJldmVudCByZXR1cm5pbmcgYW55IG1vcmUgYnVmZmVyIGFmdGVyIHN0b3AvcmVsZWFzZURybSAoYi8zNzk2MDA5NikKICAgICAgICAgbUlzRHJtUmVsZWFzZWQgPSB0cnVlOwotICAgICAgICBBTE9HVigib25SZWxlYXNlRHJtOiBtSXNEcm1Qcm90ZWN0ZWQgaXMgcmVzZXQuIik7CisgICAgICAgIEFMT0dWKCJyZWxlYXNlRHJtOiBtSXNEcm1Qcm90ZWN0ZWQgaXMgcmVzZXQuIik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIm9uUmVsZWFzZURybTogbUlzRHJtUHJvdGVjdGVkIGlzIGFscmVhZHkgZmFsc2UuIik7CisgICAgICAgIEFMT0dFKCJyZWxlYXNlRHJtOiBtSXNEcm1Qcm90ZWN0ZWQgaXMgYWxyZWFkeSBmYWxzZS4iKTsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CkBAIC0yMDUxLDcgKzE2NzMsNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIgKmJ1ZmZlcikKK3ZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKQogewogICAgIC8vQUxPR1YoInNpZ25hbEJ1ZmZlclJldHVybmVkICVwICByZWZDb3VudDogJWQiLCBidWZmZXIsIGJ1ZmZlci0+bG9jYWxSZWZjb3VudCgpKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmgKaW5kZXggNDA2NDEzMy4uMDY1Y2FjMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5oCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSAiQVRTUGFyc2VyLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzQsMTMgKzM1LDE2IEBACiBjbGFzcyBJRGF0YVNvdXJjZTsKIHN0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIHN0cnVjdCBNZWRpYVNvdXJjZTsKK2NsYXNzIElNZWRpYVNvdXJjZTsKIGNsYXNzIE1lZGlhQnVmZmVyOworc3RydWN0IE1lZGlhQ2xvY2s7CiBzdHJ1Y3QgTnVDYWNoZWRTb3VyY2UyOwogCiBzdHJ1Y3QgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2UgOiBwdWJsaWMgTnVQbGF5ZXI6OlNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyIC8vIE1vZHVsYXIgRFJNCiB7Ci0gICAgR2VuZXJpY1NvdXJjZShjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgYm9vbCB1aWRWYWxpZCwgdWlkX3QgdWlkKTsKKyAgICBHZW5lcmljU291cmNlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBib29sIHVpZFZhbGlkLCB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiAmbWVkaWFDbG9jayk7CiAKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKAogICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKQEAgLTUxLDcgKzU1LDcgQEAKIAogICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4mIGRhdGFTb3VyY2UpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MoCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJpbmdTZXR0aW5ncygKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSBvdmVycmlkZTsKIApAQCAtNzksMTcgKzgzLDEzIEBACiAgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVcywKICAgICAgICAgTWVkaWFQbGF5ZXJTZWVrTW9kZSBtb2RlID0gTWVkaWFQbGF5ZXJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVycyhib29sIGF1ZGlvLCBWZWN0b3I8TWVkaWFCdWZmZXIgKj4gJmJ1ZmZlcnMpOwotCiAgICAgdmlydHVhbCBib29sIGlzU3RyZWFtaW5nKCkgY29uc3Q7CiAKLSAgICB2aXJ0dWFsIHZvaWQgc2V0T2ZmbG9hZEF1ZGlvKGJvb2wgb2ZmbG9hZCk7Ci0KICAgICAvLyBNb2R1bGFyIERSTQotICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlRHJtKAotICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZkcm1TZXNzaW9uSWQsIHNwPElDcnlwdG8+ICpjcnlwdG8pOworICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZkcm1TZXNzaW9uSWQsIHNwPElDcnlwdG8+ICpvdXRDcnlwdG8pOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlRHJtKCk7CiAKQEAgLTExMSwxNyArMTExLDExIEBACiAgICAgICAgIGtXaGF0U2VuZFRpbWVkVGV4dERhdGEsCiAgICAgICAgIGtXaGF0Q2hhbmdlQVZTb3VyY2UsCiAgICAgICAgIGtXaGF0UG9sbEJ1ZmZlcmluZywKLSAgICAgICAga1doYXRHZXRGb3JtYXQsCi0gICAgICAgIGtXaGF0R2V0U2VsZWN0ZWRUcmFjaywKLSAgICAgICAga1doYXRTZWxlY3RUcmFjaywKICAgICAgICAga1doYXRTZWVrLAogICAgICAgICBrV2hhdFJlYWRCdWZmZXIsCiAgICAgICAgIGtXaGF0U3RhcnQsCiAgICAgICAgIGtXaGF0UmVzdW1lLAogICAgICAgICBrV2hhdFNlY3VyZURlY29kZXJzSW5zdGFudGlhdGVkLAotICAgICAgICAvLyBNb2R1bGFyIERSTQotICAgICAgICBrV2hhdFByZXBhcmVEcm0sCi0gICAgICAgIGtXaGF0UmVsZWFzZURybSwKICAgICB9OwogCiAgICAgc3RydWN0IFRyYWNrIHsKQEAgLTEzMCw4NCArMTI0LDYgQEAKICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gbVBhY2tldHM7CiAgICAgfTsKIAotICAgIC8vIEhlbHBlciB0byBtb25pdG9yIGJ1ZmZlcmluZyBzdGF0dXMuIFRoZSBwb2xsaW5nIGhhcHBlbnMgZXZlcnkgc2Vjb25kLgotICAgIC8vIFdoZW4gbmVjZXNzYXJ5LCBpdCB3aWxsIHNlbmQgb3V0IGJ1ZmZlcmluZyBldmVudHMgdG8gdGhlIHBsYXllci4KLSAgICBzdHJ1Y3QgQnVmZmVyaW5nTW9uaXRvciA6IHB1YmxpYyBBSGFuZGxlciB7Ci0gICAgcHVibGljOgotICAgICAgICBleHBsaWNpdCBCdWZmZXJpbmdNb25pdG9yKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KTsKLQotICAgICAgICB2b2lkIGdldERlZmF1bHRCdWZmZXJpbmdTZXR0aW5ncyhCdWZmZXJpbmdTZXR0aW5ncyAqYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pOwotICAgICAgICBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyAmYnVmZmVyaW5nKTsKLQotICAgICAgICAvLyBTZXQgdXAgc3RhdGUuCi0gICAgICAgIHZvaWQgcHJlcGFyZShjb25zdCBzcDxOdUNhY2hlZFNvdXJjZTI+ICZjYWNoZWRTb3VyY2UsCi0gICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzLAotICAgICAgICAgICAgICAgIGludDY0X3QgYml0cmF0ZSwKLSAgICAgICAgICAgICAgICBib29sIGlzU3RyZWFtaW5nKTsKLSAgICAgICAgLy8gU3RvcCBhbmQgcmVzZXQgYnVmZmVyaW5nIG1vbml0b3IuCi0gICAgICAgIHZvaWQgc3RvcCgpOwotICAgICAgICAvLyBDYW5jZWwgdGhlIGN1cnJlbnQgbW9uaXRvciB0YXNrLgotICAgICAgICB2b2lkIGNhbmNlbFBvbGxCdWZmZXJpbmcoKTsKLSAgICAgICAgLy8gUmVzdGFydCB0aGUgbW9uaXRvciB0YXNrLgotICAgICAgICB2b2lkIHJlc3RhcnRQb2xsQnVmZmVyaW5nKCk7Ci0gICAgICAgIC8vIFN0b3AgYnVmZmVyaW5nIHRhc2sgYW5kIHNlbmQgb3V0IGNvcnJlc3BvbmRpbmcgZXZlbnRzLgotICAgICAgICB2b2lkIHN0b3BCdWZmZXJpbmdJZk5lY2Vzc2FyeSgpOwotICAgICAgICAvLyBNYWtlIHN1cmUgZGF0YSBzb3VyY2UgaXMgZ2V0dGluZyBkYXRhLgotICAgICAgICB2b2lkIGVuc3VyZUNhY2hlSXNGZXRjaGluZygpOwotICAgICAgICAvLyBVcGRhdGUgbWVkaWEgdGltZSBvZiBqdXN0IGV4dHJhY3RlZCBidWZmZXIgZnJvbSBkYXRhIHNvdXJjZS4KLSAgICAgICAgdm9pZCB1cGRhdGVRdWV1ZWRUaW1lKGJvb2wgaXNBdWRpbywgaW50NjRfdCB0aW1lVXMpOwotCi0gICAgICAgIC8vIFNldCB0aGUgb2ZmbG9hZCBtb2RlLgotICAgICAgICB2b2lkIHNldE9mZmxvYWRBdWRpbyhib29sIG9mZmxvYWQpOwotICAgICAgICAvLyBVcGRhdGUgbWVkaWEgdGltZSBvZiBsYXN0IGRlcXVldWVkIGJ1ZmZlciB3aGljaCBpcyBzZW50IHRvIHRoZSBkZWNvZGVyLgotICAgICAgICB2b2lkIHVwZGF0ZURlcXVldWVkQnVmZmVyVGltZShpbnQ2NF90IG1lZGlhVXMpOwotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICB2aXJ0dWFsIH5CdWZmZXJpbmdNb25pdG9yKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBlbnVtIHsKLSAgICAgICAgICAgIGtXaGF0UG9sbEJ1ZmZlcmluZywKLSAgICAgICAgfTsKLQotICAgICAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKLQotICAgICAgICBzcDxOdUNhY2hlZFNvdXJjZTI+IG1DYWNoZWRTb3VyY2U7Ci0gICAgICAgIGludDY0X3QgbUR1cmF0aW9uVXM7Ci0gICAgICAgIGludDY0X3QgbUJpdHJhdGU7Ci0gICAgICAgIGJvb2wgbUlzU3RyZWFtaW5nOwotCi0gICAgICAgIGludDY0X3QgbUF1ZGlvVGltZVVzOwotICAgICAgICBpbnQ2NF90IG1WaWRlb1RpbWVVczsKLSAgICAgICAgaW50MzJfdCBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb247Ci0gICAgICAgIGJvb2wgbVByZXBhcmVCdWZmZXJpbmc7Ci0gICAgICAgIGJvb2wgbUJ1ZmZlcmluZzsKLSAgICAgICAgaW50MzJfdCBtUHJldkJ1ZmZlclBlcmNlbnRhZ2U7Ci0KLSAgICAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKLQotICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyBtU2V0dGluZ3M7Ci0gICAgICAgIGJvb2wgbU9mZmxvYWRBdWRpbzsKLSAgICAgICAgaW50NjRfdCBtRmlyc3REZXF1ZXVlZEJ1ZmZlclJlYWxVczsKLSAgICAgICAgaW50NjRfdCBtRmlyc3REZXF1ZXVlZEJ1ZmZlck1lZGlhVXM7Ci0gICAgICAgIGludDY0X3QgbWxhc3REZXF1ZXVlZEJ1ZmZlck1lZGlhVXM7Ci0KLSAgICAgICAgdm9pZCBwcmVwYXJlX2woY29uc3Qgc3A8TnVDYWNoZWRTb3VyY2UyPiAmY2FjaGVkU291cmNlLAotICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VcywKLSAgICAgICAgICAgICAgICBpbnQ2NF90IGJpdHJhdGUsCi0gICAgICAgICAgICAgICAgYm9vbCBpc1N0cmVhbWluZyk7Ci0gICAgICAgIHZvaWQgY2FuY2VsUG9sbEJ1ZmZlcmluZ19sKCk7Ci0gICAgICAgIHZvaWQgbm90aWZ5QnVmZmVyaW5nVXBkYXRlX2woaW50MzJfdCBwZXJjZW50YWdlKTsKLSAgICAgICAgdm9pZCBzdGFydEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5X2woKTsKLSAgICAgICAgdm9pZCBzdG9wQnVmZmVyaW5nSWZOZWNlc3NhcnlfbCgpOwotICAgICAgICB2b2lkIHNlbmRDYWNoZVN0YXRzX2woKTsKLSAgICAgICAgdm9pZCBlbnN1cmVDYWNoZUlzRmV0Y2hpbmdfbCgpOwotICAgICAgICBpbnQ2NF90IGdldExhc3RSZWFkUG9zaXRpb25fbCgpOwotICAgICAgICB2b2lkIG9uUG9sbEJ1ZmZlcmluZ19sKCk7Ci0gICAgICAgIHZvaWQgc2NoZWR1bGVQb2xsQnVmZmVyaW5nX2woKTsKLSAgICB9OwotCiAgICAgVmVjdG9yPHNwPElNZWRpYVNvdXJjZT4gPiBtU291cmNlczsKICAgICBUcmFjayBtQXVkaW9UcmFjazsKICAgICBpbnQ2NF90IG1BdWRpb1RpbWVVczsKQEAgLTIxOCw2ICsxMzQsMTMgQEAKICAgICBUcmFjayBtU3VidGl0bGVUcmFjazsKICAgICBUcmFjayBtVGltZWRUZXh0VHJhY2s7CiAKKyAgICBCdWZmZXJpbmdTZXR0aW5ncyBtQnVmZmVyaW5nU2V0dGluZ3M7CisgICAgaW50MzJfdCBtUHJldkJ1ZmZlclBlcmNlbnRhZ2U7CisgICAgaW50MzJfdCBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb247CisgICAgYm9vbCBtU2VudFBhdXNlT25CdWZmZXJpbmc7CisKKyAgICBpbnQzMl90IG1BdWRpb0RhdGFHZW5lcmF0aW9uOworICAgIGludDMyX3QgbVZpZGVvRGF0YUdlbmVyYXRpb247CiAgICAgaW50MzJfdCBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uOwogICAgIGludDMyX3QgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb247CiAgICAgaW50NjRfdCBtRHVyYXRpb25VczsKQEAgLTIyNyw2ICsxNTAsNyBAQAogICAgIGJvb2wgbUlzU3RyZWFtaW5nOwogICAgIGJvb2wgbVVJRFZhbGlkOwogICAgIHVpZF90IG1VSUQ7CisgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gbU1lZGlhQ2xvY2s7CiAgICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IG1IVFRQU2VydmljZTsKICAgICBBU3RyaW5nIG1Vcmk7CiAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbVVyaUhlYWRlcnM7CkBAIC0yMzQsMjIgKzE1OCwyMCBAQAogICAgIGludDY0X3QgbU9mZnNldDsKICAgICBpbnQ2NF90IG1MZW5ndGg7CiAKKyAgICBib29sIG1EaXNjb25uZWN0ZWQ7CiAgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CiAgICAgc3A8TnVDYWNoZWRTb3VyY2UyPiBtQ2FjaGVkU291cmNlOwogICAgIHNwPERhdGFTb3VyY2U+IG1IdHRwU291cmNlOwogICAgIHNwPE1ldGFEYXRhPiBtRmlsZU1ldGE7CiAgICAgYm9vbCBtU3RhcnRlZDsKLSAgICBib29sIG1TdG9wUmVhZDsKKyAgICBib29sIG1QcmVwYXJpbmc7CiAgICAgaW50NjRfdCBtQml0cmF0ZTsKLSAgICBzcDxCdWZmZXJpbmdNb25pdG9yPiBtQnVmZmVyaW5nTW9uaXRvcjsKICAgICB1aW50MzJfdCBtUGVuZGluZ1JlYWRCdWZmZXJUeXBlczsKICAgICBzcDxBQnVmZmVyPiBtR2xvYmFsVGltZWRUZXh0OwogCi0gICAgbXV0YWJsZSBNdXRleCBtUmVhZEJ1ZmZlckxvY2s7Ci0gICAgbXV0YWJsZSBNdXRleCBtRGlzY29ubmVjdExvY2s7CisgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKIAogICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7Ci0gICAgc3A8QUxvb3Blcj4gbUJ1ZmZlcmluZ01vbml0b3JMb29wZXI7CiAKICAgICB2b2lkIHJlc2V0RGF0YVNvdXJjZSgpOwogCkBAIC0yNjEsMTggKzE4Myw2IEBACiAgICAgdm9pZCBmaW5pc2hQcmVwYXJlQXN5bmMoKTsKICAgICBzdGF0dXNfdCBzdGFydFNvdXJjZXMoKTsKIAotICAgIHZvaWQgb25HZXRGb3JtYXRNZXRhKGNvbnN0IHNwPEFNZXNzYWdlPiYgbXNnKSBjb25zdDsKLSAgICBzcDxNZXRhRGF0YT4gZG9HZXRGb3JtYXRNZXRhKGJvb2wgYXVkaW8pIGNvbnN0OwotCi0gICAgdm9pZCBvbkdldFRyYWNrSW5mbyhjb25zdCBzcDxBTWVzc2FnZT4mIG1zZykgY29uc3Q7Ci0gICAgc3A8QU1lc3NhZ2U+IGRvR2V0VHJhY2tJbmZvKHNpemVfdCB0cmFja0luZGV4KSBjb25zdDsKLQotICAgIHZvaWQgb25HZXRTZWxlY3RlZFRyYWNrKGNvbnN0IHNwPEFNZXNzYWdlPiYgbXNnKSBjb25zdDsKLSAgICBzc2l6ZV90IGRvR2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIHR5cGUpIGNvbnN0OwotCi0gICAgdm9pZCBvblNlbGVjdFRyYWNrKGNvbnN0IHNwPEFNZXNzYWdlPiYgbXNnKTsKLSAgICBzdGF0dXNfdCBkb1NlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCwgaW50NjRfdCB0aW1lVXMpOwotCiAgICAgdm9pZCBvblNlZWsoY29uc3Qgc3A8QU1lc3NhZ2U+JiBtc2cpOwogICAgIHN0YXR1c190IGRvU2VlayhpbnQ2NF90IHNlZWtUaW1lVXMsIE1lZGlhUGxheWVyU2Vla01vZGUgbW9kZSk7CiAKQEAgLTI5MSw3ICsyMDEsNyBAQAogICAgICAgICAgICAgaW50MzJfdCBjdXJHZW4sIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+JiBwYWNrZXRzLCBjb25zdCBzcDxBTWVzc2FnZT4mIG1zZyk7CiAKICAgICBzcDxBQnVmZmVyPiBtZWRpYUJ1ZmZlclRvQUJ1ZmZlcigKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICptYnVmLAorICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICptYnVmLAogICAgICAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUpOwogCiAgICAgdm9pZCBwb3N0UmVhZEJ1ZmZlcihtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSk7CkBAIC0zMTAsNiArMjIwLDE1IEBACiAgICAgdm9pZCBxdWV1ZURpc2NvbnRpbnVpdHlJZk5lZWRlZCgKICAgICAgICAgICAgIGJvb2wgc2Vla2luZywgYm9vbCBmb3JtYXRDaGFuZ2UsIG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlLCBUcmFjayAqdHJhY2spOwogCisgICAgdm9pZCBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKKyAgICB2b2lkIG9uUG9sbEJ1ZmZlcmluZygpOworICAgIHZvaWQgbm90aWZ5QnVmZmVyaW5nVXBkYXRlKGludDMyX3QgcGVyY2VudGFnZSk7CisKKyAgICB2b2lkIHNlbmRDYWNoZVN0YXRzKCk7CisKKyAgICBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0TWV0YV9sKGJvb2wgYXVkaW8pOworICAgIGludDMyX3QgZ2V0RGF0YUdlbmVyYXRpb24obWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdDsKKwogICAgIC8vIE1vZHVsYXIgRFJNCiAgICAgLy8gVGhlIHNvdXJjZSBpcyBEUk0gcHJvdGVjdGVkIGFuZCBpcyBwcmVwYXJlZCBmb3IgRFJNLgogICAgIGJvb2wgbUlzRHJtUHJvdGVjdGVkOwpAQCAtMzE4LDggKzIzNyw2IEBACiAgICAgVmVjdG9yPFN0cmluZzg+IG1NaW1lczsKIAogICAgIHN0YXR1c190IGNoZWNrRHJtSW5mbygpOwotICAgIHN0YXR1c190IG9uUHJlcGFyZURybShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0gICAgc3RhdHVzX3Qgb25SZWxlYXNlRHJtKCk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhHZW5lcmljU291cmNlKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmNwcAppbmRleCBhZDRjMjIzLi4xMWYxYmZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5jcHAKQEAgLTM1LDcgKzM1LDYgQEAKIC8vIGRlZmF1bHQgYnVmZmVyIHByZXBhcmUvcmVhZHkvdW5kZXJmbG93IG1hcmtzCiBzdGF0aWMgY29uc3QgaW50IGtSZWFkeU1hcmtNcyAgICAgPSA1MDAwOyAgLy8gNSBzZWNvbmRzCiBzdGF0aWMgY29uc3QgaW50IGtQcmVwYXJlTWFya01zICAgPSAxNTAwOyAgLy8gMS41IHNlY29uZHMKLXN0YXRpYyBjb25zdCBpbnQga1VuZGVyZmxvd01hcmtNcyA9IDEwMDA7ICAvLyAxIHNlY29uZAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTU0LDcgKzUzLDggQEAKICAgICAgIG1GZXRjaE1ldGFEYXRhR2VuZXJhdGlvbigwKSwKICAgICAgIG1IYXNNZXRhZGF0YShmYWxzZSksCiAgICAgICBtTWV0YWRhdGFTZWxlY3RlZChmYWxzZSkgewotICAgIGdldERlZmF1bHRCdWZmZXJpbmdTZXR0aW5ncygmbUJ1ZmZlcmluZ1NldHRpbmdzKTsKKyAgICBtQnVmZmVyaW5nU2V0dGluZ3MubUluaXRpYWxNYXJrTXMgPSBrUHJlcGFyZU1hcmtNczsKKyAgICBtQnVmZmVyaW5nU2V0dGluZ3MubVJlc3VtZVBsYXliYWNrTWFya01zID0ga1JlYWR5TWFya01zOwogICAgIGlmIChoZWFkZXJzKSB7CiAgICAgICAgIG1FeHRyYUhlYWRlcnMgPSAqaGVhZGVyczsKIApAQCAtODIsMzUgKzgyLDE2IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBOdVBsYXllcjo6SFRUUExpdmVTb3VyY2U6OmdldERlZmF1bHRCdWZmZXJpbmdTZXR0aW5ncygKK3N0YXR1c190IE51UGxheWVyOjpIVFRQTGl2ZVNvdXJjZTo6Z2V0QnVmZmVyaW5nU2V0dGluZ3MoCiAgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pIHsKLSAgICBidWZmZXJpbmctPm1Jbml0aWFsQnVmZmVyaW5nTW9kZSA9IEJVRkZFUklOR19NT0RFX1RJTUVfT05MWTsKLSAgICBidWZmZXJpbmctPm1SZWJ1ZmZlcmluZ01vZGUgPSBCVUZGRVJJTkdfTU9ERV9USU1FX09OTFk7Ci0gICAgYnVmZmVyaW5nLT5tSW5pdGlhbFdhdGVybWFya01zID0ga1ByZXBhcmVNYXJrTXM7Ci0gICAgYnVmZmVyaW5nLT5tUmVidWZmZXJpbmdXYXRlcm1hcmtMb3dNcyA9IGtVbmRlcmZsb3dNYXJrTXM7Ci0gICAgYnVmZmVyaW5nLT5tUmVidWZmZXJpbmdXYXRlcm1hcmtIaWdoTXMgPSBrUmVhZHlNYXJrTXM7CisgICAgKmJ1ZmZlcmluZyA9IG1CdWZmZXJpbmdTZXR0aW5nczsKIAogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlOjpzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSB7Ci0gICAgaWYgKGJ1ZmZlcmluZy5Jc1NpemVCYXNlZEJ1ZmZlcmluZ01vZGUoYnVmZmVyaW5nLm1Jbml0aWFsQnVmZmVyaW5nTW9kZSkKLSAgICAgICAgICAgIHx8IGJ1ZmZlcmluZy5Jc1NpemVCYXNlZEJ1ZmZlcmluZ01vZGUoYnVmZmVyaW5nLm1SZWJ1ZmZlcmluZ01vZGUpCi0gICAgICAgICAgICB8fCAoYnVmZmVyaW5nLklzVGltZUJhc2VkQnVmZmVyaW5nTW9kZShidWZmZXJpbmcubVJlYnVmZmVyaW5nTW9kZSkKLSAgICAgICAgICAgICAgICAmJiBidWZmZXJpbmcubVJlYnVmZmVyaW5nV2F0ZXJtYXJrTG93TXMgPiBidWZmZXJpbmcubVJlYnVmZmVyaW5nV2F0ZXJtYXJrSGlnaE1zKSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQogICAgIG1CdWZmZXJpbmdTZXR0aW5ncyA9IGJ1ZmZlcmluZzsKIAotICAgIGlmIChtQnVmZmVyaW5nU2V0dGluZ3MubUluaXRpYWxCdWZmZXJpbmdNb2RlID09IEJVRkZFUklOR19NT0RFX05PTkUpIHsKLSAgICAgICAgbUJ1ZmZlcmluZ1NldHRpbmdzLm1Jbml0aWFsV2F0ZXJtYXJrTXMgPSBCdWZmZXJpbmdTZXR0aW5nczo6a05vV2F0ZXJtYXJrOwotICAgIH0KLSAgICBpZiAobUJ1ZmZlcmluZ1NldHRpbmdzLm1SZWJ1ZmZlcmluZ01vZGUgPT0gQlVGRkVSSU5HX01PREVfTk9ORSkgewotICAgICAgICBtQnVmZmVyaW5nU2V0dGluZ3MubVJlYnVmZmVyaW5nV2F0ZXJtYXJrTG93TXMgPSBCdWZmZXJpbmdTZXR0aW5nczo6a05vV2F0ZXJtYXJrOwotICAgICAgICBtQnVmZmVyaW5nU2V0dGluZ3MubVJlYnVmZmVyaW5nV2F0ZXJtYXJrSGlnaE1zID0gSU5UMzJfTUFYOwotICAgIH0KLQogICAgIGlmIChtTGl2ZVNlc3Npb24gIT0gTlVMTCkgewogICAgICAgICBtTGl2ZVNlc3Npb24tPnNldEJ1ZmZlcmluZ1NldHRpbmdzKG1CdWZmZXJpbmdTZXR0aW5ncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuaAppbmRleCAyODY2YTZhLi4yZDZjNjA0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuaApAQCAtMzQsNyArMzQsNyBAQAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MoCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJpbmdTZXR0aW5ncygKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSBvdmVycmlkZTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKaW5kZXggZGYzNjA0Ni4uMGExYmRmZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCkBAIC00OCw3ICs0OCw5IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ2xvY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CkBAIC01Niw3ICs1OCw2IEBACiAjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogCi0jaW5jbHVkZSAiYXZjX3V0aWxzLmgiCiAKICNpbmNsdWRlICJFU0RTLmgiCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KQEAgLTE3MiwxNCArMTczLDE3IEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLU51UGxheWVyOjpOdVBsYXllcihwaWRfdCBwaWQpCitOdVBsYXllcjo6TnVQbGF5ZXIocGlkX3QgcGlkLCBjb25zdCBzcDxNZWRpYUNsb2NrPiAmbWVkaWFDbG9jaykKICAgICA6IG1VSURWYWxpZChmYWxzZSksCiAgICAgICBtUElEKHBpZCksCisgICAgICBtTWVkaWFDbG9jayhtZWRpYUNsb2NrKSwKICAgICAgIG1Tb3VyY2VGbGFncygwKSwKICAgICAgIG1PZmZsb2FkQXVkaW8oZmFsc2UpLAogICAgICAgbUF1ZGlvRGVjb2RlckdlbmVyYXRpb24oMCksCiAgICAgICBtVmlkZW9EZWNvZGVyR2VuZXJhdGlvbigwKSwKICAgICAgIG1SZW5kZXJlckdlbmVyYXRpb24oMCksCisgICAgICBtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zKDApLAorICAgICAgbUxhc3RTdGFydGVkUmVidWZmZXJpbmdUaW1lTnMoMCksCiAgICAgICBtUHJldmlvdXNTZWVrVGltZVVzKDApLAogICAgICAgbUF1ZGlvRU9TKGZhbHNlKSwKICAgICAgIG1WaWRlb0VPUyhmYWxzZSksCkBAIC0yMDQsNiArMjA4LDcgQEAKICAgICAgIG1QYXVzZWRGb3JCdWZmZXJpbmcoZmFsc2UpLAogICAgICAgbUlzRHJtUHJvdGVjdGVkKGZhbHNlKSwKICAgICAgIG1EYXRhU291cmNlVHlwZShEQVRBX1NPVVJDRV9UWVBFX05PTkUpIHsKKyAgICBDSEVDSyhtZWRpYUNsb2NrICE9IE5VTEwpOwogICAgIGNsZWFyRmx1c2hDb21wbGV0ZSgpOwogfQogCkBAIC0yMTUsOCArMjIwLDExIEBACiAgICAgbVVJRCA9IHVpZDsKIH0KIAotdm9pZCBOdVBsYXllcjo6c2V0RHJpdmVyKGNvbnN0IHdwPE51UGxheWVyRHJpdmVyPiAmZHJpdmVyKSB7Cit2b2lkIE51UGxheWVyOjppbml0KGNvbnN0IHdwPE51UGxheWVyRHJpdmVyPiAmZHJpdmVyKSB7CiAgICAgbURyaXZlciA9IGRyaXZlcjsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRNZWRpYUNsb2NrTm90aWZ5LCB0aGlzKTsKKyAgICBtTWVkaWFDbG9jay0+c2V0Tm90aWZpY2F0aW9uTWVzc2FnZShub3RpZnkpOwogfQogCiB2b2lkIE51UGxheWVyOjpzZXREYXRhU291cmNlQXN5bmMoY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4gJnNvdXJjZSkgewpAQCAtMjc4LDcgKzI4Niw3IEBACiAgICAgICAgIEFMT0dWKCJzZXREYXRhU291cmNlQXN5bmMgR2VuZXJpY1NvdXJjZSAlcyIsIHVybCk7CiAKICAgICAgICAgc3A8R2VuZXJpY1NvdXJjZT4gZ2VuZXJpY1NvdXJjZSA9Ci0gICAgICAgICAgICAgICAgbmV3IEdlbmVyaWNTb3VyY2Uobm90aWZ5LCBtVUlEVmFsaWQsIG1VSUQpOworICAgICAgICAgICAgICAgIG5ldyBHZW5lcmljU291cmNlKG5vdGlmeSwgbVVJRFZhbGlkLCBtVUlELCBtTWVkaWFDbG9jayk7CiAKICAgICAgICAgc3RhdHVzX3QgZXJyID0gZ2VuZXJpY1NvdXJjZS0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzKTsKIApAQCAtMzAxLDcgKzMwOSw3IEBACiAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFNvdXJjZU5vdGlmeSwgdGhpcyk7CiAKICAgICBzcDxHZW5lcmljU291cmNlPiBzb3VyY2UgPQotICAgICAgICAgICAgbmV3IEdlbmVyaWNTb3VyY2Uobm90aWZ5LCBtVUlEVmFsaWQsIG1VSUQpOworICAgICAgICAgICAgbmV3IEdlbmVyaWNTb3VyY2Uobm90aWZ5LCBtVUlEVmFsaWQsIG1VSUQsIG1NZWRpYUNsb2NrKTsKIAogICAgIEFMT0dWKCJzZXREYXRhU291cmNlQXN5bmMgZmQgJWQvJWxsZC8lbGxkIHNvdXJjZTogJXAiLAogICAgICAgICAgICAgZmQsIChsb25nIGxvbmcpb2Zmc2V0LCAobG9uZyBsb25nKWxlbmd0aCwgc291cmNlLmdldCgpKTsKQEAgLTMyMiw3ICszMzAsNyBAQAogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXREYXRhU291cmNlLCB0aGlzKTsKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0U291cmNlTm90aWZ5LCB0aGlzKTsKIAotICAgIHNwPEdlbmVyaWNTb3VyY2U+IHNvdXJjZSA9IG5ldyBHZW5lcmljU291cmNlKG5vdGlmeSwgbVVJRFZhbGlkLCBtVUlEKTsKKyAgICBzcDxHZW5lcmljU291cmNlPiBzb3VyY2UgPSBuZXcgR2VuZXJpY1NvdXJjZShub3RpZnksIG1VSURWYWxpZCwgbVVJRCwgbU1lZGlhQ2xvY2spOwogICAgIHN0YXR1c190IGVyciA9IHNvdXJjZS0+c2V0RGF0YVNvdXJjZShkYXRhU291cmNlKTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTMzNSw5ICszNDMsOSBAQAogICAgIG1EYXRhU291cmNlVHlwZSA9IERBVEFfU09VUkNFX1RZUEVfTUVESUE7CiB9CiAKLXN0YXR1c190IE51UGxheWVyOjpnZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MoCitzdGF0dXNfdCBOdVBsYXllcjo6Z2V0QnVmZmVyaW5nU2V0dGluZ3MoCiAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzICpidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MsIHRoaXMpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRCdWZmZXJpbmdTZXR0aW5ncywgdGhpcyk7CiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwogICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKICAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKQEAgLTQ3MCw2ICs0NzgsMTMgQEAKICAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzZXQsIHRoaXMpKS0+cG9zdCgpOwogfQogCitzdGF0dXNfdCBOdVBsYXllcjo6bm90aWZ5QXQoaW50NjRfdCBtZWRpYVRpbWVVcykgeworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXROb3RpZnlUaW1lLCB0aGlzKTsKKyAgICBub3RpZnktPnNldEludDY0KCJ0aW1lclVzIiwgbWVkaWFUaW1lVXMpOworICAgIG1NZWRpYUNsb2NrLT5hZGRUaW1lcihub3RpZnksIG1lZGlhVGltZVVzKTsKKyAgICByZXR1cm4gT0s7Cit9CisKIHZvaWQgTnVQbGF5ZXI6OnNlZWtUb0FzeW5jKGludDY0X3Qgc2Vla1RpbWVVcywgTWVkaWFQbGF5ZXJTZWVrTW9kZSBtb2RlLCBib29sIG5lZWROb3RpZnkpIHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VlaywgdGhpcyk7CiAgICAgbXNnLT5zZXRJbnQ2NCgic2Vla1RpbWVVcyIsIHNlZWtUaW1lVXMpOwpAQCAtNTU2LDE2ICs1NzEsMTYgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBrV2hhdEdldERlZmF1bHRCdWZmZXJpbmdTZXR0aW5nczoKKyAgICAgICAgY2FzZSBrV2hhdEdldEJ1ZmZlcmluZ1NldHRpbmdzOgogICAgICAgICB7CiAgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAotICAgICAgICAgICAgQUxPR1YoImtXaGF0R2V0RGVmYXVsdEJ1ZmZlcmluZ1NldHRpbmdzIik7CisgICAgICAgICAgICBBTE9HVigia1doYXRHZXRCdWZmZXJpbmdTZXR0aW5ncyIpOwogICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MgYnVmZmVyaW5nOwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CiAgICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gbVNvdXJjZS0+Z2V0RGVmYXVsdEJ1ZmZlcmluZ1NldHRpbmdzKCZidWZmZXJpbmcpOworICAgICAgICAgICAgICAgIGVyciA9IG1Tb3VyY2UtPmdldEJ1ZmZlcmluZ1NldHRpbmdzKCZidWZmZXJpbmcpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KQEAgLTEyNzQsNyArMTI4OSw4IEBACiAgICAgICAgICAgICAgICAgQUxPR1YoIlRlYXIgZG93biBhdWRpbyB3aXRoIHJlYXNvbiAlZC4iLCByZWFzb24pOwogICAgICAgICAgICAgICAgIGlmIChyZWFzb24gPT0gUmVuZGVyZXI6OmtEdWVUb1RpbWVvdXQgJiYgIShtUGF1c2VkICYmIG1PZmZsb2FkQXVkaW8pKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFRpbWVvdXRXaGVuUGF1c2VkIGlzIG9ubHkgZm9yIG9mZmxvYWQgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgQUxPR1coIlJlY2VpdmUgYSBzdGFsZSBtZXNzYWdlIGZvciB0ZWFyZG93bi4iKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIlJlY2VpdmVkIGEgc3RhbGUgbWVzc2FnZSBmb3IgdGVhcmRvd24sIG1QYXVzZWQoJWQpLCBtT2ZmbG9hZEF1ZGlvKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXVzZWQsIG1PZmZsb2FkQXVkaW8pOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaW50NjRfdCBwb3NpdGlvblVzOwpAQCAtMTI5OSw2ICsxMzE1LDggQEAKICAgICAgICAgICAgIEFMT0dWKCJrV2hhdFJlc2V0Iik7CiAKICAgICAgICAgICAgIG1SZXNldHRpbmcgPSB0cnVlOworICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tUaW1lcih0cnVlIC8qIHN0b3BwaW5nICovLCAia1doYXRSZXNldCIpOworICAgICAgICAgICAgdXBkYXRlUmVidWZmZXJpbmdUaW1lcih0cnVlIC8qIHN0b3BwaW5nICovLCB0cnVlIC8qIGV4aXRpbmcgKi8pOwogCiAgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKICAgICAgICAgICAgICAgICAgICAgbmV3IEZsdXNoRGVjb2RlckFjdGlvbigKQEAgLTEzMTIsNiArMTMzMCwxNiBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0Tm90aWZ5VGltZToKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR1YoImtXaGF0Tm90aWZ5VGltZSIpOworICAgICAgICAgICAgaW50NjRfdCB0aW1lclVzOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVyVXMiLCAmdGltZXJVcykpOworCisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9OT1RJRllfVElNRSwgdGltZXJVcywgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2Uga1doYXRTZWVrOgogICAgICAgICB7CiAgICAgICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CkBAIC0xNDAxLDYgKzE0MjksMjQgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdE1lZGlhQ2xvY2tOb3RpZnk6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dWKCJrV2hhdE1lZGlhQ2xvY2tOb3RpZnkiKTsKKyAgICAgICAgICAgIGludDY0X3QgYW5jaG9yTWVkaWFVcywgYW5jaG9yUmVhbFVzOworICAgICAgICAgICAgZmxvYXQgcGxheWJhY2tSYXRlOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoImFuY2hvci1tZWRpYS11cyIsICZhbmNob3JNZWRpYVVzKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgiYW5jaG9yLXJlYWwtdXMiLCAmYW5jaG9yUmVhbFVzKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRGbG9hdCgicGxheWJhY2stcmF0ZSIsICZwbGF5YmFja1JhdGUpKTsKKworICAgICAgICAgICAgUGFyY2VsIGluOworICAgICAgICAgICAgaW4ud3JpdGVJbnQ2NChhbmNob3JNZWRpYVVzKTsKKyAgICAgICAgICAgIGluLndyaXRlSW50NjQoYW5jaG9yUmVhbFVzKTsKKyAgICAgICAgICAgIGluLndyaXRlRmxvYXQocGxheWJhY2tSYXRlKTsKKworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfVElNRV9ESVNDT05USU5VSVRZLCAwLCAwLCAmaW4pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgVFJFU1BBU1MoKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTQyOSw3ICsxNDc1LDcgQEAKICAgICAgICAgQUxPR1coInJlc3VtZSBjYWxsZWQgd2hlbiByZW5kZXJlciBpcyBnb25lIG9yIG5vdCBzZXQiKTsKICAgICB9CiAKLSAgICBtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zID0gc3lzdGVtVGltZSgpOworICAgIHN0YXJ0UGxheWJhY2tUaW1lcigib25yZXN1bWUiKTsKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXI6Om9uSW5zdGFudGlhdGVTZWN1cmVEZWNvZGVycygpIHsKQEAgLTE1MjMsNyArMTU2OSw3IEBACiAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFJlbmRlcmVyTm90aWZ5LCB0aGlzKTsKICAgICArK21SZW5kZXJlckdlbmVyYXRpb247CiAgICAgbm90aWZ5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1SZW5kZXJlckdlbmVyYXRpb24pOwotICAgIG1SZW5kZXJlciA9IG5ldyBSZW5kZXJlcihtQXVkaW9TaW5rLCBub3RpZnksIGZsYWdzKTsKKyAgICBtUmVuZGVyZXIgPSBuZXcgUmVuZGVyZXIobUF1ZGlvU2luaywgbU1lZGlhQ2xvY2ssIG5vdGlmeSwgZmxhZ3MpOwogICAgIG1SZW5kZXJlckxvb3BlciA9IG5ldyBBTG9vcGVyOwogICAgIG1SZW5kZXJlckxvb3Blci0+c2V0TmFtZSgiTnVQbGF5ZXJSZW5kZXJlciIpOwogICAgIG1SZW5kZXJlckxvb3Blci0+c3RhcnQoZmFsc2UsIGZhbHNlLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKQEAgLTE1NDksMTIgKzE1OTUsOTEgQEAKICAgICAgICAgbUF1ZGlvRGVjb2Rlci0+c2V0UmVuZGVyZXIobVJlbmRlcmVyKTsKICAgICB9CiAKLSAgICBtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zID0gc3lzdGVtVGltZSgpOworICAgIHN0YXJ0UGxheWJhY2tUaW1lcigib25zdGFydCIpOwogCiAgICAgcG9zdFNjYW5Tb3VyY2VzKCk7CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6OnN0YXJ0UGxheWJhY2tUaW1lcihjb25zdCBjaGFyICp3aGVyZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtUGxheWluZ1RpbWVMb2NrKTsKKyAgICBpZiAobUxhc3RTdGFydGVkUGxheWluZ1RpbWVOcyA9PSAwKSB7CisgICAgICAgIG1MYXN0U3RhcnRlZFBsYXlpbmdUaW1lTnMgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIEFMT0dWKCJzdGFydFBsYXliYWNrVGltZXIoKSB0aW1lICUyMCIgUFJJZDY0ICIgKCVzKSIsICBtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zLCB3aGVyZSk7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyOjp1cGRhdGVQbGF5YmFja1RpbWVyKGJvb2wgc3RvcHBpbmcsIGNvbnN0IGNoYXIgKndoZXJlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1QbGF5aW5nVGltZUxvY2spOworCisgICAgQUxPR1YoInVwZGF0ZVBsYXliYWNrVGltZXIoJXMpICB0aW1lICUyMCIgUFJJZDY0ICIgKCVzKSIsCisJICBzdG9wcGluZyA/ICJzdG9wIiA6ICJzbmFwIiwgbUxhc3RTdGFydGVkUGxheWluZ1RpbWVOcywgd2hlcmUpOworCisgICAgaWYgKG1MYXN0U3RhcnRlZFBsYXlpbmdUaW1lTnMgIT0gMCkgeworICAgICAgICBzcDxOdVBsYXllckRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CisgICAgICAgIGludDY0X3Qgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGludDY0X3QgcGxheWVkID0gbm93IC0gbUxhc3RTdGFydGVkUGxheWluZ1RpbWVOczsKKyAgICAgICAgICAgIEFMT0dWKCJ1cGRhdGVQbGF5YmFja1RpbWVyKCkgIGxvZyAgJTIwIiBQUklkNjQgIiIsIHBsYXllZCk7CisKKyAgICAgICAgICAgIGlmIChwbGF5ZWQgPiAwKSB7CisgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlNb3JlUGxheWluZ1RpbWVVcygocGxheWVkKzUwMCkvMTAwMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwlpZiAoc3RvcHBpbmcpIHsKKyAgICAgICAgICAgIG1MYXN0U3RhcnRlZFBsYXlpbmdUaW1lTnMgPSAwOworCX0gZWxzZSB7CisgICAgICAgICAgICBtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zID0gbm93OworCX0KKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OnN0YXJ0UmVidWZmZXJpbmdUaW1lcigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVBsYXlpbmdUaW1lTG9jayk7CisgICAgaWYgKG1MYXN0U3RhcnRlZFJlYnVmZmVyaW5nVGltZU5zID09IDApIHsKKyAgICAgICAgbUxhc3RTdGFydGVkUmVidWZmZXJpbmdUaW1lTnMgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIEFMT0dWKCJzdGFydFJlYnVmZmVyaW5nVGltZXIoKSB0aW1lICUyMCIgUFJJZDY0ICIiLCAgbUxhc3RTdGFydGVkUmVidWZmZXJpbmdUaW1lTnMpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6dXBkYXRlUmVidWZmZXJpbmdUaW1lcihib29sIHN0b3BwaW5nLCBib29sIGV4aXRpbmdQbGF5YmFjaykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtUGxheWluZ1RpbWVMb2NrKTsKKworICAgIEFMT0dWKCJ1cGRhdGVSZWJ1ZmZlcmluZ1RpbWVyKCVzKSAgdGltZSAlMjAiIFBSSWQ2NCAiIChleGl0aW5nICVkKSIsCisJICBzdG9wcGluZyA/ICJzdG9wIiA6ICJzbmFwIiwgbUxhc3RTdGFydGVkUmVidWZmZXJpbmdUaW1lTnMsIGV4aXRpbmdQbGF5YmFjayk7CisKKyAgICBpZiAobUxhc3RTdGFydGVkUmVidWZmZXJpbmdUaW1lTnMgIT0gMCkgeworICAgICAgICBzcDxOdVBsYXllckRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CisgICAgICAgIGludDY0X3Qgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGludDY0X3QgcmVidWZmZXJlZCA9IG5vdyAtIG1MYXN0U3RhcnRlZFJlYnVmZmVyaW5nVGltZU5zOworICAgICAgICAgICAgQUxPR1YoInVwZGF0ZVJlYnVmZmVyaW5nVGltZXIoKSAgbG9nICAlMjAiIFBSSWQ2NCAiIiwgcmVidWZmZXJlZCk7CisKKyAgICAgICAgICAgIGlmIChyZWJ1ZmZlcmVkID4gMCkgeworICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5TW9yZVJlYnVmZmVyaW5nVGltZVVzKChyZWJ1ZmZlcmVkKzUwMCkvMTAwMCk7CisgICAgICAgICAgICAgICAgaWYgKGV4aXRpbmdQbGF5YmFjaykgeworICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVJlYnVmZmVyaW5nV2hlbkV4aXQodHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisJaWYgKHN0b3BwaW5nKSB7CisgICAgICAgICAgICBtTGFzdFN0YXJ0ZWRSZWJ1ZmZlcmluZ1RpbWVOcyA9IDA7CisJfSBlbHNlIHsKKyAgICAgICAgICAgIG1MYXN0U3RhcnRlZFJlYnVmZmVyaW5nVGltZU5zID0gbm93OworCX0KKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OnVwZGF0ZUludGVybmFsVGltZXJzKCkgeworICAgIC8vIHVwZGF0ZSB2YWx1ZXMsIGJ1dCB0aWNraW5nIGNsb2NrcyBrZWVwIHRpY2tpbmcKKyAgICBBTE9HVigidXBkYXRlSW50ZXJuYWxUaW1lcnMoKSIpOworICAgIHVwZGF0ZVBsYXliYWNrVGltZXIoZmFsc2UgLyogc3RvcHBpbmcgKi8sICJ1cGRhdGVJbnRlcm5hbFRpbWVycyIpOworICAgIHVwZGF0ZVJlYnVmZmVyaW5nVGltZXIoZmFsc2UgLyogc3RvcHBpbmcgKi8sIGZhbHNlIC8qIGV4aXRpbmcgKi8pOworfQorCiB2b2lkIE51UGxheWVyOjpvblBhdXNlKCkgeworCisgICAgdXBkYXRlUGxheWJhY2tUaW1lcih0cnVlIC8qIHN0b3BwaW5nICovLCAib25QYXVzZSIpOworCiAgICAgaWYgKG1QYXVzZWQpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTE1NzAsMTMgKzE2OTUsNiBAQAogICAgICAgICBBTE9HVygicGF1c2UgY2FsbGVkIHdoZW4gcmVuZGVyZXIgaXMgZ29uZSBvciBub3Qgc2V0Iik7CiAgICAgfQogCi0gICAgc3A8TnVQbGF5ZXJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwotICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgewotICAgICAgICBpbnQ2NF90IG5vdyA9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgaW50NjRfdCBwbGF5ZWQgPSBub3cgLSBtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zOwotCi0gICAgICAgIGRyaXZlci0+bm90aWZ5TW9yZVBsYXlpbmdUaW1lVXMoKHBsYXllZCs1MDApLzEwMDApOwotICAgIH0KIH0KIAogYm9vbCBOdVBsYXllcjo6YXVkaW9EZWNvZGVyU3RpbGxOZWVkZWQoKSB7CkBAIC0xNjcyLDYgKzE3OTAsOCBAQAogCiB2b2lkIE51UGxheWVyOjpyZXN0YXJ0QXVkaW8oCiAgICAgICAgIGludDY0X3QgY3VycmVudFBvc2l0aW9uVXMsIGJvb2wgZm9yY2VOb25PZmZsb2FkLCBib29sIG5lZWRzVG9DcmVhdGVBdWRpb0RlY29kZXIpIHsKKyAgICBBTE9HRCgicmVzdGFydEF1ZGlvIHRpbWVVcyglbGxkKSwgZG9udE9mZmxvYWQoJWQpLCBjcmVhdGVEZWNvZGVyKCVkKSIsCisgICAgICAgICAgKGxvbmcgbG9uZyljdXJyZW50UG9zaXRpb25VcywgZm9yY2VOb25PZmZsb2FkLCBuZWVkc1RvQ3JlYXRlQXVkaW9EZWNvZGVyKTsKICAgICBpZiAobUF1ZGlvRGVjb2RlciAhPSBOVUxMKSB7CiAgICAgICAgIG1BdWRpb0RlY29kZXItPnBhdXNlKCk7CiAgICAgICAgIG1BdWRpb0RlY29kZXIuY2xlYXIoKTsKQEAgLTIyMDMsNiArMjMyMyw5IEBACiAgICAgQ0hFQ0sobUF1ZGlvRGVjb2RlciA9PSBOVUxMKTsKICAgICBDSEVDSyhtVmlkZW9EZWNvZGVyID09IE5VTEwpOwogCisgICAgdXBkYXRlUGxheWJhY2tUaW1lcih0cnVlIC8qIHN0b3BwaW5nICovLCAicGVyZm9ybVJlc2V0Iik7CisgICAgdXBkYXRlUmVidWZmZXJpbmdUaW1lcih0cnVlIC8qIHN0b3BwaW5nICovLCB0cnVlIC8qIGV4aXRpbmcgKi8pOworCiAgICAgY2FuY2VsUG9sbER1cmF0aW9uKCk7CiAKICAgICArK21TY2FuU291cmNlc0dlbmVyYXRpb247CkBAIC0yNDU1LDYgKzI1NzgsNyBAQAogICAgICAgICAgICAgaWYgKG1TdGFydGVkKSB7CiAgICAgICAgICAgICAgICAgQUxPR0koImJ1ZmZlciBsb3csIHBhdXNpbmcuLi4iKTsKIAorICAgICAgICAgICAgICAgIHN0YXJ0UmVidWZmZXJpbmdUaW1lcigpOwogICAgICAgICAgICAgICAgIG1QYXVzZWRGb3JCdWZmZXJpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgIG9uUGF1c2UoKTsKICAgICAgICAgICAgIH0KQEAgLTI0NjgsNiArMjU5Miw3IEBACiAgICAgICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKICAgICAgICAgICAgICAgICBBTE9HSSgiYnVmZmVyIHJlYWR5LCByZXN1bWluZy4uLiIpOwogCisgICAgICAgICAgICAgICAgdXBkYXRlUmVidWZmZXJpbmdUaW1lcih0cnVlIC8qIHN0b3BwaW5nICovLCBmYWxzZSAvKiBleGl0aW5nICovKTsKICAgICAgICAgICAgICAgICBtUGF1c2VkRm9yQnVmZmVyaW5nID0gZmFsc2U7CiAKICAgICAgICAgICAgICAgICAvLyBkbyBub3QgcmVzdW1lIHlldCBpZiBjbGllbnQgZGlkbid0IHVucGF1c2UKQEAgLTI2MDEsNyArMjcyNiw3IEBACiB2b2lkIE51UGxheWVyOjpzZW5kU3VidGl0bGVEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsIGludDMyX3QgYmFzZUluZGV4KSB7CiAgICAgaW50MzJfdCB0cmFja0luZGV4OwogICAgIGludDY0X3QgdGltZVVzLCBkdXJhdGlvblVzOwotICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoInRyYWNrSW5kZXgiLCAmdHJhY2tJbmRleCkpOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoInRyYWNrLWluZGV4IiwgJnRyYWNrSW5kZXgpKTsKICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CiAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgiZHVyYXRpb25VcyIsICZkdXJhdGlvblVzKSk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmgKaW5kZXggYzY5ODM1Zi4uM2E3ZWY0ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmgKQEAgLTMwLDE1ICszMCwxNiBAQAogc3RydWN0IEF1ZGlvUGxheWJhY2tSYXRlOwogc3RydWN0IEFWU3luY1NldHRpbmdzOwogY2xhc3MgSURhdGFTb3VyY2U7CitzdHJ1Y3QgTWVkaWFDbG9jazsKIGNsYXNzIE1ldGFEYXRhOwogc3RydWN0IE51UGxheWVyRHJpdmVyOwogCiBzdHJ1Y3QgTnVQbGF5ZXIgOiBwdWJsaWMgQUhhbmRsZXIgewotICAgIGV4cGxpY2l0IE51UGxheWVyKHBpZF90IHBpZCk7CisgICAgZXhwbGljaXQgTnVQbGF5ZXIocGlkX3QgcGlkLCBjb25zdCBzcDxNZWRpYUNsb2NrPiAmbWVkaWFDbG9jayk7CiAKICAgICB2b2lkIHNldFVJRCh1aWRfdCB1aWQpOwogCi0gICAgdm9pZCBzZXREcml2ZXIoY29uc3Qgd3A8TnVQbGF5ZXJEcml2ZXI+ICZkcml2ZXIpOworICAgIHZvaWQgaW5pdChjb25zdCB3cDxOdVBsYXllckRyaXZlcj4gJmRyaXZlcik7CiAKICAgICB2b2lkIHNldERhdGFTb3VyY2VBc3luYyhjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlKTsKIApAQCAtNTEsNyArNTIsNyBAQAogCiAgICAgdm9pZCBzZXREYXRhU291cmNlQXN5bmMoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSk7CiAKLSAgICBzdGF0dXNfdCBnZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MoQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKTsKKyAgICBzdGF0dXNfdCBnZXRCdWZmZXJpbmdTZXR0aW5ncyhCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pOwogICAgIHN0YXR1c190IHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpOwogCiAgICAgdm9pZCBwcmVwYXJlQXN5bmMoKTsKQEAgLTcyLDYgKzczLDkgQEAKICAgICAvLyBXaWxsIG5vdGlmeSB0aGUgZHJpdmVyIHRocm91Z2ggIm5vdGlmeVJlc2V0Q29tcGxldGUiIG9uY2UgZmluaXNoZWQuCiAgICAgdm9pZCByZXNldEFzeW5jKCk7CiAKKyAgICAvLyBSZXF1ZXN0IGEgbm90aWZpY2F0aW9uIHdoZW4gc3BlY2lmaWVkIG1lZGlhIHRpbWUgaXMgcmVhY2hlZC4KKyAgICBzdGF0dXNfdCBub3RpZnlBdChpbnQ2NF90IG1lZGlhVGltZVVzKTsKKwogICAgIC8vIFdpbGwgbm90aWZ5IHRoZSBkcml2ZXIgdGhyb3VnaCAibm90aWZ5U2Vla0NvbXBsZXRlIiBvbmNlIGZpbmlzaGVkCiAgICAgLy8gYW5kIG5lZWROb3RpZnkgaXMgdHJ1ZS4KICAgICB2b2lkIHNlZWtUb0FzeW5jKApAQCAtOTUsNiArOTksOCBAQAogCiAgICAgY29uc3QgY2hhciAqZ2V0RGF0YVNvdXJjZVR5cGUoKTsKIAorICAgIHZvaWQgdXBkYXRlSW50ZXJuYWxUaW1lcnMoKTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk51UGxheWVyKCk7CiAKQEAgLTEzOSw2ICsxNDUsNyBAQAogICAgICAgICBrV2hhdENsb3NlZENhcHRpb25Ob3RpZnkgICAgICAgID0gJ2NhcE4nLAogICAgICAgICBrV2hhdFJlbmRlcmVyTm90aWZ5ICAgICAgICAgICAgID0gJ3Jlbk4nLAogICAgICAgICBrV2hhdFJlc2V0ICAgICAgICAgICAgICAgICAgICAgID0gJ3JzZXQnLAorICAgICAgICBrV2hhdE5vdGlmeVRpbWUgICAgICAgICAgICAgICAgID0gJ25meVQnLAogICAgICAgICBrV2hhdFNlZWsgICAgICAgICAgICAgICAgICAgICAgID0gJ3NlZWsnLAogICAgICAgICBrV2hhdFBhdXNlICAgICAgICAgICAgICAgICAgICAgID0gJ3BhdXMnLAogICAgICAgICBrV2hhdFJlc3VtZSAgICAgICAgICAgICAgICAgICAgID0gJ3JzbWUnLApAQCAtMTQ3LDE2ICsxNTQsMTggQEAKICAgICAgICAga1doYXRHZXRUcmFja0luZm8gICAgICAgICAgICAgICA9ICdnVHJJJywKICAgICAgICAga1doYXRHZXRTZWxlY3RlZFRyYWNrICAgICAgICAgICA9ICdnU2VsJywKICAgICAgICAga1doYXRTZWxlY3RUcmFjayAgICAgICAgICAgICAgICA9ICdzZWxUJywKLSAgICAgICAga1doYXRHZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MgPSAnZ0RCUycsCisgICAgICAgIGtXaGF0R2V0QnVmZmVyaW5nU2V0dGluZ3MgICAgICAgPSAnZ0J1cycsCiAgICAgICAgIGtXaGF0U2V0QnVmZmVyaW5nU2V0dGluZ3MgICAgICAgPSAnc0J1UycsCiAgICAgICAgIGtXaGF0UHJlcGFyZURybSAgICAgICAgICAgICAgICAgPSAncERybScsCiAgICAgICAgIGtXaGF0UmVsZWFzZURybSAgICAgICAgICAgICAgICAgPSAnckRybScsCisgICAgICAgIGtXaGF0TWVkaWFDbG9ja05vdGlmeSAgICAgICAgICAgPSAnbWNrTicsCiAgICAgfTsKIAogICAgIHdwPE51UGxheWVyRHJpdmVyPiBtRHJpdmVyOwogICAgIGJvb2wgbVVJRFZhbGlkOwogICAgIHVpZF90IG1VSUQ7CiAgICAgcGlkX3QgbVBJRDsKKyAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiBtTWVkaWFDbG9jazsKICAgICBNdXRleCBtU291cmNlTG9jazsgIC8vIGd1YXJkIHxtU291cmNlfC4KICAgICBzcDxTb3VyY2U+IG1Tb3VyY2U7CiAgICAgdWludDMyX3QgbVNvdXJjZUZsYWdzOwpAQCAtMTcyLDcgKzE4MSwxNCBAQAogICAgIGludDMyX3QgbVZpZGVvRGVjb2RlckdlbmVyYXRpb247CiAgICAgaW50MzJfdCBtUmVuZGVyZXJHZW5lcmF0aW9uOwogCisgICAgTXV0ZXggbVBsYXlpbmdUaW1lTG9jazsKICAgICBpbnQ2NF90IG1MYXN0U3RhcnRlZFBsYXlpbmdUaW1lTnM7CisgICAgdm9pZCB1cGRhdGVQbGF5YmFja1RpbWVyKGJvb2wgc3RvcHBpbmcsIGNvbnN0IGNoYXIgKndoZXJlKTsKKyAgICB2b2lkIHN0YXJ0UGxheWJhY2tUaW1lcihjb25zdCBjaGFyICp3aGVyZSk7CisKKyAgICBpbnQ2NF90IG1MYXN0U3RhcnRlZFJlYnVmZmVyaW5nVGltZU5zOworICAgIHZvaWQgc3RhcnRSZWJ1ZmZlcmluZ1RpbWVyKCk7CisgICAgdm9pZCB1cGRhdGVSZWJ1ZmZlcmluZ1RpbWVyKGJvb2wgc3RvcHBpbmcsIGJvb2wgZXhpdGluZ1BsYXliYWNrKTsKIAogICAgIGludDY0X3QgbVByZXZpb3VzU2Vla1RpbWVVczsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5jcHAKaW5kZXggNzNiMDdiYi4uMDQwMmZjYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuY3BwCkBAIC0xOSwxMyArMTksMTMgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCi0jaW5jbHVkZSAiYXZjX3V0aWxzLmgiCiAjaW5jbHVkZSAiTnVQbGF5ZXJDQ0RlY29kZXIuaCIKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTMwMSw3ICszMDEsNyBAQAogLy8gcmV0dXJucyB0cnVlIGlmIGEgbmV3IENDIHRyYWNrIGlzIGZvdW5kCiBib29sIE51UGxheWVyOjpDQ0RlY29kZXI6OmV4dHJhY3RGcm9tTVBFR1VzZXJEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KSB7CiAgICAgc3A8QUJ1ZmZlcj4gbXBlZ1VzZXJEYXRhOwotICAgIGlmICghYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kQnVmZmVyKCJtcGVnVXNlckRhdGEiLCAmbXBlZ1VzZXJEYXRhKQorICAgIGlmICghYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kQnVmZmVyKCJtcGVnLXVzZXItZGF0YSIsICZtcGVnVXNlckRhdGEpCiAgICAgICAgICAgICB8fCBtcGVnVXNlckRhdGEgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtNTM4LDcgKzUzOCw3IEBACiAgICAgICAgIGR1bXBCeXRlUGFpcihjY0J1Zik7CiAjZW5kaWYKIAotICAgICAgICBjY0J1Zi0+bWV0YSgpLT5zZXRJbnQzMigidHJhY2tJbmRleCIsIG1TZWxlY3RlZFRyYWNrKTsKKyAgICAgICAgY2NCdWYtPm1ldGEoKS0+c2V0SW50MzIoInRyYWNrLWluZGV4IiwgbVNlbGVjdGVkVHJhY2spOwogICAgICAgICBjY0J1Zi0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKICAgICAgICAgY2NCdWYtPm1ldGEoKS0+c2V0SW50NjQoImR1cmF0aW9uVXMiLCAwbGwpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwCmluZGV4IGFjMTg3Y2MuLjJhMDhmNjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwCkBAIC0yOSwxMCArMjksMTIgQEAKIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQnVmZmVySG9sZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CkBAIC00MCw3ICs0Miw2IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KIAotI2luY2x1ZGUgImF2Y191dGlscy5oIgogI2luY2x1ZGUgIkFUU1BhcnNlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC03NTAsMjAgKzc1MSwyOCBAQAogCiAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZW9zIiwgdHJ1ZSk7CiAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigiZW9zIiwgdHJ1ZSk7Ci0gICAgfSBlbHNlIGlmIChtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXMgPj0gMCkgeworICAgIH0KKworICAgIG1OdW1GcmFtZXNUb3RhbCArPSAhbUlzQXVkaW87CisKKyAgICBpZiAobVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzID49IDApIHsKICAgICAgICAgaWYgKHRpbWVVcyA8IG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVcykgewogICAgICAgICAgICAgQUxPR1YoIlslc10gZHJvcHBpbmcgYnVmZmVyIGF0IHRpbWUgJWxsZCBhcyByZXF1ZXN0ZWQuIiwKICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIChsb25nIGxvbmcpdGltZVVzKTsKIAogICAgICAgICAgICAgcmVwbHktPnBvc3QoKTsKKyAgICAgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgICAgICBub3RpZnlSZXN1bWVDb21wbGV0ZUlmTmVjZXNzYXJ5KCk7CisgICAgICAgICAgICAgICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMICYmICFpc0Rpc2NvbnRpbnVpdHlQZW5kaW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVJlbmRlcmVyLT5xdWV1ZUVPUyhtSXNBdWRpbywgRVJST1JfRU5EX09GX1NUUkVBTSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAogICAgICAgICBtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXMgPSAtMTsKICAgICB9CiAKLSAgICBtTnVtRnJhbWVzVG90YWwgKz0gIW1Jc0F1ZGlvOwotCiAgICAgLy8gd2FpdCB1bnRpbCAxc3QgZnJhbWUgY29tZXMgb3V0IHRvIHNpZ25hbCByZXN1bWUgY29tcGxldGUKICAgICBub3RpZnlSZXN1bWVDb21wbGV0ZUlmTmVjZXNzYXJ5KCk7CiAKQEAgLTkzNyw3ICs5NDYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50TWF4VmlkZW9UZW1wb3JhbExheWVySWQpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5ZXJJZCA+IG1DdXJyZW50TWF4VmlkZW9UZW1wb3JhbExheWVySWQpIHsKICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRNYXhWaWRlb1RlbXBvcmFsTGF5ZXJJZCA9IGxheWVySWQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXllcklkID09IDAgJiYgbU51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsID4gMSAmJiBJc0lEUihhY2Nlc3NVbml0KSkgeworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5ZXJJZCA9PSAwICYmIG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbCA+IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIElzSURSKGFjY2Vzc1VuaXQtPmRhdGEoKSwgYWNjZXNzVW5pdC0+c2l6ZSgpKSkgewogICAgICAgICAgICAgICAgICAgICBtQ3VycmVudE1heFZpZGVvVGVtcG9yYWxMYXllcklkID0gbU51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsIC0gMTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xMDM2LDcgKzEwNDYsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gTW9kdWxhciBEUk0KLSAgICAgICAgTWVkaWFCdWZmZXIgKm1lZGlhQnVmID0gTlVMTDsKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1ZiA9IE5VTEw7CiAgICAgICAgIE51UGxheWVyRHJtOjpDcnlwdG9JbmZvICpjcnlwdEluZm8gPSBOVUxMOwogCiAgICAgICAgIC8vIGNvcHkgaW50byBjb2RlYyBidWZmZXIKQEAgLTEwNTIsMTYgKzEwNjIsMTcgQEAKICAgICAgICAgICAgICAgICBtZW1jcHkoY29kZWNCdWZmZXItPmRhdGEoKSwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKICAgICAgICAgICAgIH0gZWxzZSB7IC8vIE5vIGJ1ZmZlci0+ZGF0YSgpCiAgICAgICAgICAgICAgICAgLy9Nb2R1bGFyIERSTQotICAgICAgICAgICAgICAgIG1lZGlhQnVmID0gKE1lZGlhQnVmZmVyKilidWZmZXItPmdldE1lZGlhQnVmZmVyQmFzZSgpOworICAgICAgICAgICAgICAgIHNwPFJlZkJhc2U+IGhvbGRlcjsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRPYmplY3QoIm1lZGlhQnVmZmVySG9sZGVyIiwgJmhvbGRlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFCdWYgPSAoaG9sZGVyICE9IG51bGxwdHIpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PE1lZGlhQnVmZmVySG9sZGVyKj4oaG9sZGVyLmdldCgpKS0+bWVkaWFCdWZmZXIoKSA6IG51bGxwdHI7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChtZWRpYUJ1ZiAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5zZXRSYW5nZSgwLCBtZWRpYUJ1Zi0+c2l6ZSgpKTsKICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGNvZGVjQnVmZmVyLT5kYXRhKCksIG1lZGlhQnVmLT5kYXRhKCksIG1lZGlhQnVmLT5zaXplKCkpOwogCi0gICAgICAgICAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhX2RhdGEgPSBtZWRpYUJ1Zi0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YV9kYXRhID0gbWVkaWFCdWYtPm1ldGFfZGF0YSgpOwogICAgICAgICAgICAgICAgICAgICBjcnlwdEluZm8gPSBOdVBsYXllckRybTo6Z2V0U2FtcGxlQ3J5cHRvSW5mbyhtZXRhX2RhdGEpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIGdldE1lZGlhQnVmZmVyKCkgaGFzIGluY3JlbWVudGVkIHRoZSByZWZDb3VudAotICAgICAgICAgICAgICAgICAgICBtZWRpYUJ1Zi0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIE5vIG1lZGlhQnVmCiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJvbklucHV0QnVmZmVyRmV0Y2hlZDogYnVmZmVyLT5kYXRhKCkvbWVkaWFCdWYgYXJlIE5VTEwgZm9yICVwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuZ2V0KCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKaW5kZXggZGMyOTc2MS4uM2U1YmRkNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCkBAIC0yOCw2ICsyOCw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KIApAQCAtNDEsNiArNDMsOSBAQAogLy8ga2V5IGZvciBtZWRpYSBzdGF0aXN0aWNzCiBzdGF0aWMgY29uc3QgY2hhciAqa0tleVBsYXllciA9ICJudXBsYXllciI7CiAvLyBhdHRycyBmb3IgbWVkaWEgc3RhdGlzdGljcworICAgIC8vIE5COiB0aGVzZSBhcmUgbWF0Y2hlZCB3aXRoIHB1YmxpYyBKYXZhIEFQSSBjb25zdGFudHMgZGVmaW5lZAorICAgIC8vIGluIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFQbGF5ZXIuamF2YQorICAgIC8vIFRoZXNlIG11c3QgYmUga2VwdCBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgY29uc3RhbnRzIHRoZXJlLgogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJWTWltZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnZpZGVvLm1pbWUiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJWQ29kZWMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci52aWRlby5jb2RlYyI7CiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllcldpZHRoID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIud2lkdGgiOwpAQCAtNTMsNyArNTgsMTQgQEAKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyUGxheWluZyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnBsYXlpbmdNcyI7CiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckVycm9yID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZXJyIjsKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRXJyb3JDb2RlID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZXJyY29kZSI7CisKKyAgICAvLyBOQjogVGhlc2UgYXJlIG5vdCB5ZXQgZXhwb3NlZCBhcyBwdWJsaWMgSmF2YSBBUEkgY29uc3RhbnRzLgorc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJFcnJvclN0YXRlID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZXJyc3RhdGUiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJEYXRhU291cmNlVHlwZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmRhdGFTb3VyY2UiOworLy8KK3N0YXRpYyBjb25zdCBjaGFyICprUGxheWVyUmVidWZmZXJpbmcgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5yZWJ1ZmZlcmluZ01zIjsKK3N0YXRpYyBjb25zdCBjaGFyICprUGxheWVyUmVidWZmZXJpbmdDb3VudCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnJlYnVmZmVycyI7CitzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllclJlYnVmZmVyaW5nQXRFeGl0ID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIucmVidWZmZXJFeGl0IjsKIAogCiBOdVBsYXllckRyaXZlcjo6TnVQbGF5ZXJEcml2ZXIocGlkX3QgcGlkKQpAQCAtNjUsOCArNzcsMTIgQEAKICAgICAgIG1Qb3NpdGlvblVzKC0xKSwKICAgICAgIG1TZWVrSW5Qcm9ncmVzcyhmYWxzZSksCiAgICAgICBtUGxheWluZ1RpbWVVcygwKSwKKyAgICAgIG1SZWJ1ZmZlcmluZ1RpbWVVcygwKSwKKyAgICAgIG1SZWJ1ZmZlcmluZ0V2ZW50cygwKSwKKyAgICAgIG1SZWJ1ZmZlcmluZ0F0RXhpdChmYWxzZSksCiAgICAgICBtTG9vcGVyKG5ldyBBTG9vcGVyKSwKLSAgICAgIG1QbGF5ZXIobmV3IE51UGxheWVyKHBpZCkpLAorICAgICAgbU1lZGlhQ2xvY2sobmV3IE1lZGlhQ2xvY2spLAorICAgICAgbVBsYXllcihuZXcgTnVQbGF5ZXIocGlkLCBtTWVkaWFDbG9jaykpLAogICAgICAgbVBsYXllckZsYWdzKDApLAogICAgICAgbUFuYWx5dGljc0l0ZW0oTlVMTCksCiAgICAgICBtQ2xpZW50VWlkKC0xKSwKQEAgLTc2LDkgKzkyLDEwIEBACiAgICAgQUxPR0QoIk51UGxheWVyRHJpdmVyKCVwKSBjcmVhdGVkLCBjbGllbnRQaWQoJWQpIiwgdGhpcywgcGlkKTsKICAgICBtTG9vcGVyLT5zZXROYW1lKCJOdVBsYXllckRyaXZlciBMb29wZXIiKTsKIAorICAgIG1NZWRpYUNsb2NrLT5pbml0KCk7CisKICAgICAvLyBzZXQgdXAgYW4gYW5hbHl0aWNzIHJlY29yZAogICAgIG1BbmFseXRpY3NJdGVtID0gbmV3IE1lZGlhQW5hbHl0aWNzSXRlbShrS2V5UGxheWVyKTsKLSAgICBtQW5hbHl0aWNzSXRlbS0+Z2VuZXJhdGVTZXNzaW9uSUQoKTsKIAogICAgIG1Mb29wZXItPnN0YXJ0KAogICAgICAgICAgICAgZmFsc2UsIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLwpAQCAtODcsNyArMTA0LDcgQEAKIAogICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUGxheWVyKTsKIAotICAgIG1QbGF5ZXItPnNldERyaXZlcih0aGlzKTsKKyAgICBtUGxheWVyLT5pbml0KHRoaXMpOwogfQogCiBOdVBsYXllckRyaXZlcjo6fk51UGxheWVyRHJpdmVyKCkgewpAQCAtMjI2LDggKzI0Myw4IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6Z2V0RGVmYXVsdEJ1ZmZlcmluZ1NldHRpbmdzKEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcpIHsKLSAgICBBTE9HVigiZ2V0RGVmYXVsdEJ1ZmZlcmluZ1NldHRpbmdzKCVwKSIsIHRoaXMpOworc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OmdldEJ1ZmZlcmluZ1NldHRpbmdzKEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcpIHsKKyAgICBBTE9HVigiZ2V0QnVmZmVyaW5nU2V0dGluZ3MoJXApIiwgdGhpcyk7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX0lETEUpIHsKQEAgLTIzNSw3ICsyNTIsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIG1QbGF5ZXItPmdldERlZmF1bHRCdWZmZXJpbmdTZXR0aW5ncyhidWZmZXJpbmcpOworICAgIHJldHVybiBtUGxheWVyLT5nZXRCdWZmZXJpbmdTZXR0aW5ncyhidWZmZXJpbmcpOwogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgewpAQCAtNTE4LDYgKzUzNSw3IEBACiB9CiAKIHZvaWQgTnVQbGF5ZXJEcml2ZXI6OnVwZGF0ZU1ldHJpY3MoY29uc3QgY2hhciAqd2hlcmUpIHsKKwogICAgIGlmICh3aGVyZSA9PSBOVUxMKSB7CiAgICAgICAgIHdoZXJlID0gInVua25vd24iOwogICAgIH0KQEAgLTU3NSw4ICs1OTMsMTYgQEAKICAgICBnZXREdXJhdGlvbigmZHVyYXRpb25fbXMpOwogICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyRHVyYXRpb24sIGR1cmF0aW9uX21zKTsKIAorICAgIG1QbGF5ZXItPnVwZGF0ZUludGVybmFsVGltZXJzKCk7CisKICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa1BsYXllclBsYXlpbmcsIChtUGxheWluZ1RpbWVVcys1MDApLzEwMDAgKTsKIAorICAgIGlmIChtUmVidWZmZXJpbmdFdmVudHMgIT0gMCkgeworICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa1BsYXllclJlYnVmZmVyaW5nLCAobVJlYnVmZmVyaW5nVGltZVVzKzUwMCkvMTAwMCApOworICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1BsYXllclJlYnVmZmVyaW5nQ291bnQsIG1SZWJ1ZmZlcmluZ0V2ZW50cyk7CisgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUGxheWVyUmVidWZmZXJpbmdBdEV4aXQsIG1SZWJ1ZmZlcmluZ0F0RXhpdCk7CisgICAgfQorCiAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa1BsYXllckRhdGFTb3VyY2VUeXBlLCBtUGxheWVyLT5nZXREYXRhU291cmNlVHlwZSgpKTsKIH0KIApAQCAtNTk4LDE4ICs2MjQsMTYgQEAKICAgICAvLyBTbyB0aGUgY2Fub25pY2FsICJlbXB0eSIgcmVjb3JkIGhhcyAzIGVsZW1lbnRzIGluIGl0LgogICAgIGlmIChtQW5hbHl0aWNzSXRlbS0+Y291bnQoKSA+IDMpIHsKIAotICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0RmluYWxpemVkKHRydWUpOwogICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2VsZnJlY29yZCgpOwogCiAgICAgICAgIC8vIHJlLWluaXQgaW4gY2FzZSB3ZSBwcmVwYXJlKCkgYW5kIHN0YXJ0KCkgYWdhaW4uCiAgICAgICAgIGRlbGV0ZSBtQW5hbHl0aWNzSXRlbSA7CiAgICAgICAgIG1BbmFseXRpY3NJdGVtID0gbmV3IE1lZGlhQW5hbHl0aWNzSXRlbSgibnVwbGF5ZXIiKTsKICAgICAgICAgaWYgKG1BbmFseXRpY3NJdGVtKSB7Ci0gICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+Z2VuZXJhdGVTZXNzaW9uSUQoKTsKICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRVaWQobUNsaWVudFVpZCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiZGlkIG5vdCBoYXZlIGFueXRoaW5nIHRvIHJlY29yZCIpOworICAgICAgICBBTE9HVigibm90aGluZyB0byByZWNvcmQgKG9ubHkgJWQgZmllbGRzKSIsIG1BbmFseXRpY3NJdGVtLT5jb3VudCgpKTsKICAgICB9CiB9CiAKQEAgLTY0NSw2ICs2NjksMTEgQEAKICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9TVE9QUEVEKTsKICAgICB9CiAKKyAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QuZGVidWcuc2Yuc3RhdHMiLCBmYWxzZSkpIHsKKyAgICAgICAgVmVjdG9yPFN0cmluZzE2PiBhcmdzOworICAgICAgICBkdW1wKC0xLCBhcmdzKTsKKyAgICB9CisKICAgICBtU3RhdGUgPSBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUzsKICAgICBtUGxheWVyLT5yZXNldEFzeW5jKCk7CiAKQEAgLTY1NiwxMCArNjg1LDE4IEBACiAgICAgbVBvc2l0aW9uVXMgPSAtMTsKICAgICBtTG9vcGluZyA9IGZhbHNlOwogICAgIG1QbGF5aW5nVGltZVVzID0gMDsKKyAgICBtUmVidWZmZXJpbmdUaW1lVXMgPSAwOworICAgIG1SZWJ1ZmZlcmluZ0V2ZW50cyA9IDA7CisgICAgbVJlYnVmZmVyaW5nQXRFeGl0ID0gZmFsc2U7CiAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IE51UGxheWVyRHJpdmVyOjpub3RpZnlBdChpbnQ2NF90IG1lZGlhVGltZVVzKSB7CisgICAgQUxPR1YoIm5vdGlmeUF0KCVwKSwgdGltZTolbGxkIiwgdGhpcywgKGxvbmcgbG9uZyltZWRpYVRpbWVVcyk7CisgICAgcmV0dXJuIG1QbGF5ZXItPm5vdGlmeUF0KG1lZGlhVGltZVVzKTsKK30KKwogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnNldExvb3BpbmcoaW50IGxvb3ApIHsKICAgICBtTG9vcGluZyA9IGxvb3AgIT0gMDsKICAgICByZXR1cm4gT0s7CkBAIC04MDEsNiArODM4LDE3IEBACiAgICAgbVBsYXlpbmdUaW1lVXMgKz0gcGxheWluZ1VzOwogfQogCit2b2lkIE51UGxheWVyRHJpdmVyOjpub3RpZnlNb3JlUmVidWZmZXJpbmdUaW1lVXMoaW50NjRfdCByZWJ1ZmZlcmluZ1VzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBtUmVidWZmZXJpbmdUaW1lVXMgKz0gcmVidWZmZXJpbmdVczsKKyAgICBtUmVidWZmZXJpbmdFdmVudHMrKzsKK30KKwordm9pZCBOdVBsYXllckRyaXZlcjo6bm90aWZ5UmVidWZmZXJpbmdXaGVuRXhpdChib29sIHN0YXR1cykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbVJlYnVmZmVyaW5nQXRFeGl0ID0gc3RhdHVzOworfQorCiB2b2lkIE51UGxheWVyRHJpdmVyOjpub3RpZnlTZWVrQ29tcGxldGUoKSB7CiAgICAgQUxPR1YoIm5vdGlmeVNlZWtDb21wbGV0ZSglcCkiLCB0aGlzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwpAQCAtOTU2LDYgKzEwMDQsNyBAQAogICAgICAgICAgICAgICAgIGlmIChleHQyICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJFcnJvckNvZGUsIGV4dDIpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrUGxheWVyRXJyb3JTdGF0ZSwgc3RhdGVTdHJpbmcobVN0YXRlKS5jX3N0cigpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1BdEVPUyA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKQEAgLTEwNTIsNCArMTEwMSwzMCBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKK3N0ZDo6c3RyaW5nIE51UGxheWVyRHJpdmVyOjpzdGF0ZVN0cmluZyhTdGF0ZSBzdGF0ZSkgeworICAgIGNvbnN0IGNoYXIgKnJ2YWwgPSBOVUxMOworICAgIGNoYXIgcmF3YnVmZmVyWzE2XTsgIC8vIGFsbG93cyAiJWQiCisKKyAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgIGNhc2UgU1RBVEVfSURMRTogcnZhbCA9ICJJRExFIjsgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBVEVfU0VUX0RBVEFTT1VSQ0VfUEVORElORzogcnZhbCA9ICJTRVRfREFUQVNPVVJDRV9QRU5ESU5HIjsgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBVEVfVU5QUkVQQVJFRDogcnZhbCA9ICJVTlBSRVBBUkVEIjsgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSSU5HOiBydmFsID0gIlBSRVBBUklORyI7IGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUkVEOiBydmFsID0gIlBSRVBBUkVEIjsgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBVEVfUlVOTklORzogcnZhbCA9ICJSVU5OSU5HIjsgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOiBydmFsID0gIlBBVVNFRCI7IGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTOiBydmFsID0gIlJFU0VUX0lOX1BST0dSRVNTIjsgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRDogcnZhbCA9ICJTVE9QUEVEIjsgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HOiBydmFsID0gIlNUT1BQRURfQU5EX1BSRVBBUklORyI7IGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVEOiBydmFsID0gIlNUT1BQRURfQU5EX1BSRVBBUkVEIjsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyB5ZXMsIHRoaXMgYnVmZmVyIGlzIHNoYXJlZCBhbmQgdnVsbmVyYWJsZSB0byByYWNlcworICAgICAgICAgICAgc25wcmludGYocmF3YnVmZmVyLCBzaXplb2YocmF3YnVmZmVyKSwgIiVkIiwgc3RhdGUpOworICAgICAgICAgICAgcnZhbCA9IHJhd2J1ZmZlcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBydmFsOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaAppbmRleCBkMGNmMWRkLi5hZDg3OGY4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuaApAQCAtMjIsNiArMjIsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQUxvb3BlcjsKK3N0cnVjdCBNZWRpYUNsb2NrOwogc3RydWN0IE51UGxheWVyOwogCiBzdHJ1Y3QgTnVQbGF5ZXJEcml2ZXIgOiBwdWJsaWMgTWVkaWFQbGF5ZXJJbnRlcmZhY2UgewpAQCAtNDUsNyArNDYsNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9TdXJmYWNlVGV4dHVyZSgKICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZidWZmZXJQcm9kdWNlcik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlZmF1bHRCdWZmZXJpbmdTZXR0aW5ncygKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlcmluZ1NldHRpbmdzKAogICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpIG92ZXJyaWRlOwogCkBAIC02NCw2ICs2NSw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDdXJyZW50UG9zaXRpb24oaW50ICptc2VjKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldER1cmF0aW9uKGludCAqbXNlYyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXNldCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgbm90aWZ5QXQoaW50NjRfdCBtZWRpYVRpbWVVcykgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMb29waW5nKGludCBsb29wKTsKICAgICB2aXJ0dWFsIHBsYXllcl90eXBlIHBsYXllclR5cGUoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGludm9rZShjb25zdCBQYXJjZWwgJnJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpOwpAQCAtODIsNiArODQsOCBAQAogICAgIHZvaWQgbm90aWZ5U2V0U3VyZmFjZUNvbXBsZXRlKCk7CiAgICAgdm9pZCBub3RpZnlEdXJhdGlvbihpbnQ2NF90IGR1cmF0aW9uVXMpOwogICAgIHZvaWQgbm90aWZ5TW9yZVBsYXlpbmdUaW1lVXMoaW50NjRfdCB0aW1lVXMpOworICAgIHZvaWQgbm90aWZ5TW9yZVJlYnVmZmVyaW5nVGltZVVzKGludDY0X3QgdGltZVVzKTsKKyAgICB2b2lkIG5vdGlmeVJlYnVmZmVyaW5nV2hlbkV4aXQoYm9vbCBzdGF0dXMpOwogICAgIHZvaWQgbm90aWZ5U2Vla0NvbXBsZXRlKCk7CiAgICAgdm9pZCBub3RpZnlTZWVrQ29tcGxldGVfbCgpOwogICAgIHZvaWQgbm90aWZ5TGlzdGVuZXIoaW50IG1zZywgaW50IGV4dDEgPSAwLCBpbnQgZXh0MiA9IDAsIGNvbnN0IFBhcmNlbCAqaW4gPSBOVUxMKTsKQEAgLTEwOSw2ICsxMTMsOCBAQAogICAgICAgICBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRCwgICAgIC8vIGVxdWl2YWxlbnQgdG8gUEFVU0VELCBidXQgc2VlayBjb21wbGV0ZQogICAgIH07CiAKKyAgICBzdGQ6OnN0cmluZyBzdGF0ZVN0cmluZyhTdGF0ZSBzdGF0ZSk7CisKICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwogICAgIENvbmRpdGlvbiBtQ29uZGl0aW9uOwogCkBAIC0xMjQsOSArMTMwLDEzIEBACiAgICAgaW50NjRfdCBtUG9zaXRpb25VczsKICAgICBib29sIG1TZWVrSW5Qcm9ncmVzczsKICAgICBpbnQ2NF90IG1QbGF5aW5nVGltZVVzOworICAgIGludDY0X3QgbVJlYnVmZmVyaW5nVGltZVVzOworICAgIGludDMyX3QgbVJlYnVmZmVyaW5nRXZlbnRzOworICAgIGJvb2wgbVJlYnVmZmVyaW5nQXRFeGl0OwogICAgIC8vIDw8PAogCiAgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKKyAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiBtTWVkaWFDbG9jazsKICAgICBjb25zdCBzcDxOdVBsYXllcj4gbVBsYXllcjsKICAgICBzcDxBdWRpb1Npbms+IG1BdWRpb1Npbms7CiAgICAgdWludDMyX3QgbVBsYXllckZsYWdzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJtLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRybS5jcHAKaW5kZXggYjdjOWRiNy4uYmRlMDg2MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcm0uY3BwCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSAiTnVQbGF5ZXJEcm0uaCIKIAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFEcm1TZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vSU1lZGlhRHJtU2VydmljZS5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAKQEAgLTI2NSwxOCArMjY1LDEzIEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotTnVQbGF5ZXJEcm06OkNyeXB0b0luZm8gKk51UGxheWVyRHJtOjpnZXRTYW1wbGVDcnlwdG9JbmZvKHNwPE1ldGFEYXRhPiBtZXRhKQorTnVQbGF5ZXJEcm06OkNyeXB0b0luZm8gKk51UGxheWVyRHJtOjpnZXRTYW1wbGVDcnlwdG9JbmZvKE1ldGFEYXRhQmFzZSAmbWV0YSkKIHsKICAgICB1aW50MzJfdCB0eXBlOwogICAgIGNvbnN0IHZvaWQgKmNyeXB0ZWRkYXRhOwogICAgIHNpemVfdCBjcnlwdGVkc2l6ZTsKIAotICAgIGlmIChtZXRhID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoImdldFNhbXBsZUNyeXB0b0luZm86IFVuZXhwZWN0ZWQuIE5vIG1ldGEgZGF0YSBmb3Igc2FtcGxlLiIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoIW1ldGEtPmZpbmREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgJnR5cGUsICZjcnlwdGVkZGF0YSwgJmNyeXB0ZWRzaXplKSkgeworICAgIGlmICghbWV0YS5maW5kRGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsICZ0eXBlLCAmY3J5cHRlZGRhdGEsICZjcnlwdGVkc2l6ZSkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIHNpemVfdCBudW1TdWJTYW1wbGVzID0gY3J5cHRlZHNpemUgLyBzaXplb2Yoc2l6ZV90KTsKQEAgLTI4OCw3ICsyODMsNyBAQAogCiAgICAgY29uc3Qgdm9pZCAqY2xlYXJkYXRhOwogICAgIHNpemVfdCBjbGVhcnNpemU7Ci0gICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlQbGFpblNpemVzLCAmdHlwZSwgJmNsZWFyZGF0YSwgJmNsZWFyc2l6ZSkpIHsKKyAgICBpZiAobWV0YS5maW5kRGF0YShrS2V5UGxhaW5TaXplcywgJnR5cGUsICZjbGVhcmRhdGEsICZjbGVhcnNpemUpKSB7CiAgICAgICAgIGlmIChjbGVhcnNpemUgIT0gY3J5cHRlZHNpemUpIHsKICAgICAgICAgICAgIC8vIFRoZSB0d28gbXVzdCBiZSBvZiB0aGUgc2FtZSBsZW5ndGguCiAgICAgICAgICAgICBBTE9HRSgiZ2V0U2FtcGxlQ3J5cHRvSW5mbyBtaXNtYXRjaCBjcnlwdGVkc2l6ZTogJXp1ICE9IGNsZWFyc2l6ZTogJXp1IiwKQEAgLTI5OSw3ICsyOTQsNyBAQAogCiAgICAgY29uc3Qgdm9pZCAqa2V5OwogICAgIHNpemVfdCBrZXlzaXplOwotICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5Q3J5cHRvS2V5LCAmdHlwZSwgJmtleSwgJmtleXNpemUpKSB7CisgICAgaWYgKG1ldGEuZmluZERhdGEoa0tleUNyeXB0b0tleSwgJnR5cGUsICZrZXksICZrZXlzaXplKSkgewogICAgICAgICBpZiAoa2V5c2l6ZSAhPSBrQmxvY2tTaXplKSB7CiAgICAgICAgICAgICBBTE9HRSgiZ2V0U2FtcGxlQ3J5cHRvSW5mbyBLZXlzIG11c3QgYmUgJWQgYnl0ZXMgaW4gbGVuZ3RoOiAlenUiLAogICAgICAgICAgICAgICAgICAgICBrQmxvY2tTaXplLCBrZXlzaXplKTsKQEAgLTMxMCw3ICszMDUsNyBAQAogCiAgICAgY29uc3Qgdm9pZCAqaXY7CiAgICAgc2l6ZV90IGl2c2l6ZTsKLSAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUNyeXB0b0lWLCAmdHlwZSwgJml2LCAmaXZzaXplKSkgeworICAgIGlmIChtZXRhLmZpbmREYXRhKGtLZXlDcnlwdG9JViwgJnR5cGUsICZpdiwgJml2c2l6ZSkpIHsKICAgICAgICAgaWYgKGl2c2l6ZSAhPSBrQmxvY2tTaXplKSB7CiAgICAgICAgICAgICBBTE9HRSgiZ2V0U2FtcGxlQ3J5cHRvSW5mbyBJViBtdXN0IGJlICVkIGJ5dGVzIGluIGxlbmd0aDogJXp1IiwKICAgICAgICAgICAgICAgICAgICAga0Jsb2NrU2l6ZSwgaXZzaXplKTsKQEAgLTMyMCw3ICszMTUsNyBAQAogICAgIH0KIAogICAgIGludDMyX3QgbW9kZTsKLSAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgJm1vZGUpKSB7CisgICAgaWYgKCFtZXRhLmZpbmRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgJm1vZGUpKSB7CiAgICAgICAgIG1vZGUgPSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19DVFI7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcm0uaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRybS5oCmluZGV4IDZiOGEyZDkuLjUwZjY5ZmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRybS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRybS5oCkBAIC0xMDksNyArMTA5LDcgQEAKICAgICAgICAgICAgICAgICBzaXplX3QgKmNsZWFyYnl0ZXMsCiAgICAgICAgICAgICAgICAgc2l6ZV90ICplbmNyeXB0ZWRieXRlcyk7CiAKLSAgICAgICAgc3RhdGljIENyeXB0b0luZm8gKmdldFNhbXBsZUNyeXB0b0luZm8oc3A8TWV0YURhdGE+IG1ldGEpOworICAgICAgICBzdGF0aWMgQ3J5cHRvSW5mbyAqZ2V0U2FtcGxlQ3J5cHRvSW5mbyhNZXRhRGF0YUJhc2UgJm1ldGEpOwogCiAgICAgfTsgIC8vIE51UGxheWVyRHJtCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcAppbmRleCBiZDg2NmNiLi4zYTI4YmJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCkBAIC0xOCwxMyArMTgsMTMgQEAKICNkZWZpbmUgTE9HX1RBRyAiTnVQbGF5ZXJSZW5kZXJlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgIkFXYWtlTG9jay5oIgogI2luY2x1ZGUgIk51UGxheWVyUmVuZGVyZXIuaCIKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVdha2VMb2NrLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KQEAgLTg5LDYgKzg5LDcgQEAKIAogTnVQbGF5ZXI6OlJlbmRlcmVyOjpSZW5kZXJlcigKICAgICAgICAgY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+ICZzaW5rLAorICAgICAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiAmbWVkaWFDbG9jaywKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCiAgICAgICAgIHVpbnQzMl90IGZsYWdzKQogICAgIDogbUF1ZGlvU2luayhzaW5rKSwKQEAgLTEwMywxMSArMTA0LDEzIEBACiAgICAgICBtQXVkaW9EcmFpbkdlbmVyYXRpb24oMCksCiAgICAgICBtVmlkZW9EcmFpbkdlbmVyYXRpb24oMCksCiAgICAgICBtQXVkaW9FT1NHZW5lcmF0aW9uKDApLAorICAgICAgbU1lZGlhQ2xvY2sobWVkaWFDbG9jayksCiAgICAgICBtUGxheWJhY2tTZXR0aW5ncyhBVURJT19QTEFZQkFDS19SQVRFX0RFRkFVTFQpLAogICAgICAgbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcygtMSksCiAgICAgICBtQW5jaG9yVGltZU1lZGlhVXMoLTEpLAogICAgICAgbUFuY2hvck51bUZyYW1lc1dyaXR0ZW4oLTEpLAogICAgICAgbVZpZGVvTGF0ZUJ5VXMoMGxsKSwKKyAgICAgIG1OZXh0VmlkZW9UaW1lTWVkaWFVcygtMSksCiAgICAgICBtSGFzQXVkaW8oZmFsc2UpLAogICAgICAgbUhhc1ZpZGVvKGZhbHNlKSwKICAgICAgIG1Ob3RpZnlDb21wbGV0ZUF1ZGlvKGZhbHNlKSwKQEAgLTEzMCw3ICsxMzMsNyBAQAogICAgICAgbUxhc3RBdWRpb0J1ZmZlckRyYWluZWQoMCksCiAgICAgICBtVXNlQXVkaW9DYWxsYmFjayhmYWxzZSksCiAgICAgICBtV2FrZUxvY2sobmV3IEFXYWtlTG9jaygpKSB7Ci0gICAgbU1lZGlhQ2xvY2sgPSBuZXcgTWVkaWFDbG9jazsKKyAgICBDSEVDSyhtZWRpYUNsb2NrICE9IE5VTEwpOwogICAgIG1QbGF5YmFja1JhdGUgPSBtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQ7CiAgICAgbU1lZGlhQ2xvY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tSYXRlKTsKIH0KQEAgLTE0OSw3ICsxNTIsNiBAQAogICAgICAgICBmbHVzaFF1ZXVlKCZtVmlkZW9RdWV1ZSk7CiAgICAgfQogICAgIG1XYWtlTG9jay5jbGVhcigpOwotICAgIG1NZWRpYUNsb2NrLmNsZWFyKCk7CiAgICAgbVZpZGVvU2NoZWR1bGVyLmNsZWFyKCk7CiAgICAgbU5vdGlmeS5jbGVhcigpOwogICAgIG1BdWRpb1NpbmsuY2xlYXIoKTsKQEAgLTMwMCw2ICszMDIsNyBAQAogCiAgICAgICAgIG1NZWRpYUNsb2NrLT5jbGVhckFuY2hvcigpOwogICAgICAgICBtVmlkZW9MYXRlQnlVcyA9IDA7CisgICAgICAgIG1OZXh0VmlkZW9UaW1lTWVkaWFVcyA9IC0xOwogICAgICAgICBtU3luY1F1ZXVlcyA9IGZhbHNlOwogICAgIH0KIApAQCAtNTQ4LDggKzU1MSwxMCBAQAogICAgICAgICAgICAgICAgIENIRUNLX0VRKG1BdWRpb1NpbmstPmdldFBvc2l0aW9uKCZudW1GcmFtZXNQbGF5ZWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0dXNfdClPSyk7CiAKKyAgICAgICAgICAgICAgICAvLyBIYW5kbGUgQXVkaW9UcmFjayByYWNlIHdoZW4gc3RhcnQgaXMgaW1tZWRpYXRlbHkgY2FsbGVkIGFmdGVyIGZsdXNoLgogICAgICAgICAgICAgICAgIHVpbnQzMl90IG51bUZyYW1lc1BlbmRpbmdQbGF5b3V0ID0KLSAgICAgICAgICAgICAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4gLSBudW1GcmFtZXNQbGF5ZWQ7CisgICAgICAgICAgICAgICAgICAgIChtTnVtRnJhbWVzV3JpdHRlbiA+IG51bUZyYW1lc1BsYXllZCA/CisgICAgICAgICAgICAgICAgICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbiAtIG51bUZyYW1lc1BsYXllZCA6IDApOwogCiAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBob3cgbG9uZyB0aGUgYXVkaW8gc2luayB3aWxsIGhhdmUgZGF0YSB0bwogICAgICAgICAgICAgICAgIC8vIHBsYXkgYmFjay4KQEAgLTEyNDUsODIgKzEyNTAsNDkgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGJvb2wgbmVlZFJlcG9zdERyYWluVmlkZW9RdWV1ZSA9IGZhbHNlOwotICAgIGludDY0X3QgZGVsYXlVczsKICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICBpbnQ2NF90IHJlYWxUaW1lVXM7CiAgICAgaWYgKG1GbGFncyAmIEZMQUdfUkVBTF9USU1FKSB7Ci0gICAgICAgIGludDY0X3QgbWVkaWFUaW1lVXM7Ci0gICAgICAgIENIRUNLKGVudHJ5Lm1CdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpKTsKLSAgICAgICAgcmVhbFRpbWVVcyA9IG1lZGlhVGltZVVzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludDY0X3QgbWVkaWFUaW1lVXM7Ci0gICAgICAgIENIRUNLKGVudHJ5Lm1CdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpKTsKKyAgICAgICAgaW50NjRfdCByZWFsVGltZVVzOworICAgICAgICBDSEVDSyhlbnRyeS5tQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnJlYWxUaW1lVXMpKTsKIAotICAgICAgICB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICAgICAgICAgaWYgKG1BbmNob3JUaW1lTWVkaWFVcyA8IDApIHsKLSAgICAgICAgICAgICAgICBtTWVkaWFDbG9jay0+dXBkYXRlQW5jaG9yKG1lZGlhVGltZVVzLCBub3dVcywgbWVkaWFUaW1lVXMpOwotICAgICAgICAgICAgICAgIG1BbmNob3JUaW1lTWVkaWFVcyA9IG1lZGlhVGltZVVzOwotICAgICAgICAgICAgICAgIHJlYWxUaW1lVXMgPSBub3dVczsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1WaWRlb1NhbXBsZVJlY2VpdmVkKSB7Ci0gICAgICAgICAgICAgICAgLy8gQWx3YXlzIHJlbmRlciB0aGUgZmlyc3QgdmlkZW8gZnJhbWUuCi0gICAgICAgICAgICAgICAgcmVhbFRpbWVVcyA9IG5vd1VzOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzIDwgMAotICAgICAgICAgICAgICAgIHx8IG1NZWRpYUNsb2NrLT5nZXRSZWFsVGltZUZvcihtZWRpYVRpbWVVcywgJnJlYWxUaW1lVXMpID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmVhbFRpbWVVcyA9IGdldFJlYWxUaW1lVXMobWVkaWFUaW1lVXMsIG5vd1VzKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobWVkaWFUaW1lVXMgLSBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzID49IDApIHsKLSAgICAgICAgICAgICAgICBuZWVkUmVwb3N0RHJhaW5WaWRlb1F1ZXVlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZWFsVGltZVVzID0gbm93VXM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlYWxUaW1lVXMgPSBub3dVczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIW1IYXNBdWRpbykgewotICAgICAgICAgICAgLy8gc21vb3RoIG91dCB2aWRlb3MgPj0gMTBmcHMKLSAgICAgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVNYXhUaW1lTWVkaWEobWVkaWFUaW1lVXMgKyAxMDAwMDApOwotICAgICAgICB9CisgICAgICAgIHJlYWxUaW1lVXMgPSBtVmlkZW9TY2hlZHVsZXItPnNjaGVkdWxlKHJlYWxUaW1lVXMgKiAxMDAwKSAvIDEwMDA7CiAKLSAgICAgICAgLy8gSGV1cmlzdGljcyB0byBoYW5kbGUgc2l0dWF0aW9uIHdoZW4gbWVkaWEgdGltZSBjaGFuZ2VkIHdpdGhvdXQgYQotICAgICAgICAvLyBkaXNjb250aW51aXR5LiBJZiB3ZSBoYXZlIG5vdCBkcmFpbmVkIGFuIGF1ZGlvIGJ1ZmZlciB0aGF0IHdhcwotICAgICAgICAvLyByZWNlaXZlZCBhZnRlciB0aGlzIGJ1ZmZlciwgcmVwb3N0IGluIDEwIG1zZWMuIE90aGVyd2lzZSByZXBvc3QKLSAgICAgICAgLy8gaW4gNTAwIG1zZWMuCi0gICAgICAgIGRlbGF5VXMgPSByZWFsVGltZVVzIC0gbm93VXM7Ci0gICAgICAgIGludDY0X3QgcG9zdERlbGF5VXMgPSAtMTsKLSAgICAgICAgaWYgKGRlbGF5VXMgPiA1MDAwMDApIHsKLSAgICAgICAgICAgIHBvc3REZWxheVVzID0gNTAwMDAwOwotICAgICAgICAgICAgaWYgKG1IYXNBdWRpbyAmJiAobUxhc3RBdWRpb0J1ZmZlckRyYWluZWQgLSBlbnRyeS5tQnVmZmVyT3JkaW5hbCkgPD0gMCkgewotICAgICAgICAgICAgICAgIHBvc3REZWxheVVzID0gMTAwMDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobmVlZFJlcG9zdERyYWluVmlkZW9RdWV1ZSkgewotICAgICAgICAgICAgLy8gQ0hFQ0sobVBsYXliYWNrUmF0ZSA+IDApOwotICAgICAgICAgICAgLy8gQ0hFQ0sobUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcyA+PSAwKTsKLSAgICAgICAgICAgIC8vIENIRUNLKG1lZGlhVGltZVVzIC0gbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcyA+PSAwKTsKLSAgICAgICAgICAgIHBvc3REZWxheVVzID0gbWVkaWFUaW1lVXMgLSBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzOwotICAgICAgICAgICAgcG9zdERlbGF5VXMgLz0gbVBsYXliYWNrUmF0ZTsKLSAgICAgICAgfQorICAgICAgICBpbnQ2NF90IHR3b1ZzeW5jc1VzID0gMiAqIChtVmlkZW9TY2hlZHVsZXItPmdldFZzeW5jUGVyaW9kKCkgLyAxMDAwKTsKIAotICAgICAgICBpZiAocG9zdERlbGF5VXMgPj0gMCkgewotICAgICAgICAgICAgbXNnLT5zZXRXaGF0KGtXaGF0UG9zdERyYWluVmlkZW9RdWV1ZSk7Ci0gICAgICAgICAgICBtc2ctPnBvc3QocG9zdERlbGF5VXMpOwotICAgICAgICAgICAgbVZpZGVvU2NoZWR1bGVyLT5yZXN0YXJ0KCk7Ci0gICAgICAgICAgICBBTE9HSSgicG9zc2libGUgdmlkZW8gdGltZSBqdW1wIG9mICVkbXMgKCVsbGQgOiAlbGxkKSBvciB1bmluaXRpYWxpemVkIG1lZGlhIGNsb2NrLCIKLSAgICAgICAgICAgICAgICAgICAgIiByZXRyeWluZyBpbiAlZG1zIiwKLSAgICAgICAgICAgICAgICAgICAgKGludCkoZGVsYXlVcyAvIDEwMDApLCAobG9uZyBsb25nKW1lZGlhVGltZVVzLAotICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMsIChpbnQpKHBvc3REZWxheVVzIC8gMTAwMCkpOwotICAgICAgICAgICAgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmcgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CisgICAgICAgIGludDY0X3QgZGVsYXlVcyA9IHJlYWxUaW1lVXMgLSBub3dVczsKKworICAgICAgICBBTE9HV19JRihkZWxheVVzID4gNTAwMDAwLCAidW51c3VhbGx5IGhpZ2ggZGVsYXlVczogJWxsZCIsIChsb25nIGxvbmcpZGVsYXlVcyk7CisgICAgICAgIC8vIHBvc3QgMiBkaXNwbGF5IHJlZnJlc2hlcyBiZWZvcmUgcmVuZGVyaW5nIGlzIGR1ZQorICAgICAgICBtc2ctPnBvc3QoZGVsYXlVcyA+IHR3b1ZzeW5jc1VzID8gZGVsYXlVcyAtIHR3b1ZzeW5jc1VzIDogMCk7CisKKyAgICAgICAgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmcgPSB0cnVlOworICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgcmVhbFRpbWVVcyA9IG1WaWRlb1NjaGVkdWxlci0+c2NoZWR1bGUocmVhbFRpbWVVcyAqIDEwMDApIC8gMTAwMDsKLSAgICBpbnQ2NF90IHR3b1ZzeW5jc1VzID0gMiAqIChtVmlkZW9TY2hlZHVsZXItPmdldFZzeW5jUGVyaW9kKCkgLyAxMDAwKTsKKyAgICBpbnQ2NF90IG1lZGlhVGltZVVzOworICAgIENIRUNLKGVudHJ5Lm1CdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpKTsKIAotICAgIGRlbGF5VXMgPSByZWFsVGltZVVzIC0gbm93VXM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICBpZiAobUFuY2hvclRpbWVNZWRpYVVzIDwgMCkgeworICAgICAgICAgICAgbU1lZGlhQ2xvY2stPnVwZGF0ZUFuY2hvcihtZWRpYVRpbWVVcywgbm93VXMsIG1lZGlhVGltZVVzKTsKKyAgICAgICAgICAgIG1BbmNob3JUaW1lTWVkaWFVcyA9IG1lZGlhVGltZVVzOworICAgICAgICB9CisgICAgfQorICAgIG1OZXh0VmlkZW9UaW1lTWVkaWFVcyA9IG1lZGlhVGltZVVzICsgMTAwMDAwOworICAgIGlmICghbUhhc0F1ZGlvKSB7CisgICAgICAgIC8vIHNtb290aCBvdXQgdmlkZW9zID49IDEwZnBzCisgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVNYXhUaW1lTWVkaWEobU5leHRWaWRlb1RpbWVNZWRpYVVzKTsKKyAgICB9CiAKLSAgICBBTE9HV19JRihkZWxheVVzID4gNTAwMDAwLCAidW51c3VhbGx5IGhpZ2ggZGVsYXlVczogJSIgUFJJZDY0LCBkZWxheVVzKTsKLSAgICAvLyBwb3N0IDIgZGlzcGxheSByZWZyZXNoZXMgYmVmb3JlIHJlbmRlcmluZyBpcyBkdWUKLSAgICBtc2ctPnBvc3QoZGVsYXlVcyA+IHR3b1ZzeW5jc1VzID8gZGVsYXlVcyAtIHR3b1ZzeW5jc1VzIDogMCk7CisgICAgaWYgKCFtVmlkZW9TYW1wbGVSZWNlaXZlZCB8fCBtZWRpYVRpbWVVcyA8IG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMpIHsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50NjRfdCB0d29Wc3luY3NVcyA9IDIgKiAobVZpZGVvU2NoZWR1bGVyLT5nZXRWc3luY1BlcmlvZCgpIC8gMTAwMCk7CisKKyAgICAgICAgLy8gcG9zdCAyIGRpc3BsYXkgcmVmcmVzaGVzIGJlZm9yZSByZW5kZXJpbmcgaXMgZHVlCisgICAgICAgIG1NZWRpYUNsb2NrLT5hZGRUaW1lcihtc2csIG1lZGlhVGltZVVzLCAtdHdvVnN5bmNzVXMpOworICAgIH0KIAogICAgIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nID0gdHJ1ZTsKIH0KQEAgLTEzNTQsNiArMTMyNiw3IEBACiAKICAgICAgICAgcmVhbFRpbWVVcyA9IGdldFJlYWxUaW1lVXMobWVkaWFUaW1lVXMsIG5vd1VzKTsKICAgICB9CisgICAgcmVhbFRpbWVVcyA9IG1WaWRlb1NjaGVkdWxlci0+c2NoZWR1bGUocmVhbFRpbWVVcyAqIDEwMDApIC8gMTAwMDsKIAogICAgIGJvb2wgdG9vTGF0ZSA9IGZhbHNlOwogCkBAIC0xNDQwLDYgKzE0MTMsMTQgQEAKICAgICBpZiAoYXVkaW8pIHsKICAgICAgICAgLy8gVmlkZW8gbWlnaHQgb3V0bGl2ZSBhdWRpby4gQ2xlYXIgYW5jaG9yIHRvIGVuYWJsZSB2aWRlbyBvbmx5IGNhc2UuCiAgICAgICAgIG1BbmNob3JUaW1lTWVkaWFVcyA9IC0xOworICAgICAgICBtSGFzQXVkaW8gPSBmYWxzZTsKKyAgICAgICAgaWYgKG1OZXh0VmlkZW9UaW1lTWVkaWFVcyA+PSAwKSB7CisgICAgICAgICAgICBpbnQ2NF90IG1lZGlhVXMgPSAwOworICAgICAgICAgICAgbU1lZGlhQ2xvY2stPmdldE1lZGlhVGltZShBTG9vcGVyOjpHZXROb3dVcygpLCAmbWVkaWFVcyk7CisgICAgICAgICAgICBpZiAobU5leHRWaWRlb1RpbWVNZWRpYVVzID4gbWVkaWFVcykgeworICAgICAgICAgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVNYXhUaW1lTWVkaWEobU5leHRWaWRlb1RpbWVNZWRpYVVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIH0KIApAQCAtMTYzNiwxNCArMTYxNyw3IEBACiAgICAgICAgICAgICAvLyBpbnRlcm5hbCBidWZmZXIgYmVmb3JlIHJlc3VtaW5nIHBsYXliYWNrLgogICAgICAgICAgICAgLy8gRklYTUU6IHRoaXMgaXMgaWdub3JlZCBhZnRlciBmbHVzaCgpLgogICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RvcCgpOwotICAgICAgICAgICAgaWYgKG1QYXVzZWQpIHsKLSAgICAgICAgICAgICAgICAvLyBSYWNlIGNvbmRpdGlvbjogaWYgcmVuZGVyZXIgaXMgcGF1c2VkIGFuZCBhdWRpbyBzaW5rIGlzIHN0b3BwZWQsCi0gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYXVkaW8gdHJhY2sgYnVmZmVyIGZ1bGx5IGRyYWlucwotICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBkZWxpdmVyaW5nIGRhdGEuCi0gICAgICAgICAgICAgICAgLy8gRklYTUU6IHJlbW92ZSB0aGlzIGlmIHdlIGNhbiBkZXRlY3QgaWYgc3RvcCgpIGlzIGNvbXBsZXRlLgotICAgICAgICAgICAgICAgIGNvbnN0IGludCBkZWxheVVzID0gMiAqIDUwICogMTAwMDsgLy8gKDIgZnVsbCBtaXhlciB0aHJlYWQgY3ljbGVzIGF0IDUwbXMpCi0gICAgICAgICAgICAgICAgbVBhdXNlRHJhaW5BdWRpb0FsbG93ZWRVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgKyBkZWxheVVzOwotICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghbVBhdXNlZCkgewogICAgICAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbiA9IDA7CkBAIC0xNzI5LDYgKzE3MDMsOCBAQAogICAgICsrbUF1ZGlvRHJhaW5HZW5lcmF0aW9uOwogICAgIGlmIChtQXVkaW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24gIT0gLTEpIHsKICAgICAgICAgcHJlcGFyZUZvck1lZGlhUmVuZGVyaW5nU3RhcnRfbCgpOworICAgICAgICAvLyBQYXVzZVRpbWVvdXQgaXMgYXBwbGllZCB0byBvZmZsb2FkIG1vZGUgb25seS4gQ2FuY2VsIHBlbmRpbmcgdGltZXIuCisgICAgICAgIGNhbmNlbEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCgpOwogICAgIH0KIH0KIApAQCAtMTgzMSw2ICsxODA3LDEyIEBACiAgICAgaWYgKG1BdWRpb1Rvcm5Eb3duKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CisKKyAgICAvLyBUaW1lb3V0V2hlblBhdXNlZCBpcyBvbmx5IGZvciBvZmZsb2FkIG1vZGUuCisgICAgaWYgKHJlYXNvbiA9PSBrRHVlVG9UaW1lb3V0ICYmICFvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgbUF1ZGlvVG9ybkRvd24gPSB0cnVlOwogCiAgICAgaW50NjRfdCBjdXJyZW50UG9zaXRpb25VczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCmluZGV4IGY1OGI3OWMuLmEwNDc5NzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaApAQCAtMzYsNiArMzYsNyBAQAogICAgICAgICBGTEFHX09GRkxPQURfQVVESU8gPSAyLAogICAgIH07CiAgICAgUmVuZGVyZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+ICZzaW5rLAorICAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+ICZtZWRpYUNsb2NrLAogICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAogICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7CiAKQEAgLTE2NSw3ICsxNjYsNyBAQAogICAgIGludDMyX3QgbVZpZGVvRHJhaW5HZW5lcmF0aW9uOwogICAgIGludDMyX3QgbUF1ZGlvRU9TR2VuZXJhdGlvbjsKIAotICAgIHNwPE1lZGlhQ2xvY2s+IG1NZWRpYUNsb2NrOworICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+IG1NZWRpYUNsb2NrOwogICAgIGZsb2F0IG1QbGF5YmFja1JhdGU7IC8vIGF1ZGlvIHRyYWNrIHJhdGUKIAogICAgIEF1ZGlvUGxheWJhY2tSYXRlIG1QbGF5YmFja1NldHRpbmdzOwpAQCAtMTc2LDYgKzE3Nyw3IEBACiAgICAgaW50NjRfdCBtQW5jaG9yVGltZU1lZGlhVXM7CiAgICAgaW50NjRfdCBtQW5jaG9yTnVtRnJhbWVzV3JpdHRlbjsKICAgICBpbnQ2NF90IG1WaWRlb0xhdGVCeVVzOworICAgIGludDY0X3QgbU5leHRWaWRlb1RpbWVNZWRpYVVzOwogICAgIGJvb2wgbUhhc0F1ZGlvOwogICAgIGJvb2wgbUhhc1ZpZGVvOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclNvdXJjZS5oCmluZGV4IDhiYTljMGQuLjlmNWVmNzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclNvdXJjZS5oCkBAIC02Niw3ICs2Niw3IEBACiAgICAgICAgIDogbU5vdGlmeShub3RpZnkpIHsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlZmF1bHRCdWZmZXJpbmdTZXR0aW5ncygKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlcmluZ1NldHRpbmdzKAogICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSA9IDA7CiAKQEAgLTEyMSwxMCArMTIxLDYgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVycyhib29sIC8qIGF1ZGlvICovLCBWZWN0b3I8TWVkaWFCdWZmZXIgKj4gJi8qIGJ1ZmZlcnMgKi8pIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQogICAgIHZpcnR1YWwgYm9vbCBpc1JlYWxUaW1lKCkgY29uc3QgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuY3BwCmluZGV4IDhiM2QwZGMuLjg1MTIxN2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5jcHAKQEAgLTYyLDcgKzYyLDggQEAKICAgICAgIG1TZWVrR2VuZXJhdGlvbigwKSwKICAgICAgIG1FT1NUaW1lb3V0QXVkaW8oMCksCiAgICAgICBtRU9TVGltZW91dFZpZGVvKDApIHsKLSAgICBnZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MoJm1CdWZmZXJpbmdTZXR0aW5ncyk7CisgICAgbUJ1ZmZlcmluZ1NldHRpbmdzLm1Jbml0aWFsTWFya01zID0ga1ByZXBhcmVNYXJrTXM7CisgICAgbUJ1ZmZlcmluZ1NldHRpbmdzLm1SZXN1bWVQbGF5YmFja01hcmtNcyA9IGtPdmVyZmxvd01hcmtNczsKICAgICBpZiAoaGVhZGVycykgewogICAgICAgICBtRXh0cmFIZWFkZXJzID0gKmhlYWRlcnM7CiAKQEAgLTg0LDMyICs4NSwxNyBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXI6OlJUU1BTb3VyY2U6OmdldERlZmF1bHRCdWZmZXJpbmdTZXR0aW5ncygKK3N0YXR1c190IE51UGxheWVyOjpSVFNQU291cmNlOjpnZXRCdWZmZXJpbmdTZXR0aW5ncygKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgewotICAgIGJ1ZmZlcmluZy0+bUluaXRpYWxCdWZmZXJpbmdNb2RlID0gQlVGRkVSSU5HX01PREVfVElNRV9PTkxZOwotICAgIGJ1ZmZlcmluZy0+bVJlYnVmZmVyaW5nTW9kZSA9IEJVRkZFUklOR19NT0RFX1RJTUVfT05MWTsKLSAgICBidWZmZXJpbmctPm1Jbml0aWFsV2F0ZXJtYXJrTXMgPSBrUHJlcGFyZU1hcmtNczsKLSAgICBidWZmZXJpbmctPm1SZWJ1ZmZlcmluZ1dhdGVybWFya0xvd01zID0ga1VuZGVyZmxvd01hcmtNczsKLSAgICBidWZmZXJpbmctPm1SZWJ1ZmZlcmluZ1dhdGVybWFya0hpZ2hNcyA9IGtPdmVyZmxvd01hcmtNczsKLQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtQnVmZmVyaW5nU2V0dGluZ3NMb2NrKTsKKyAgICAqYnVmZmVyaW5nID0gbUJ1ZmZlcmluZ1NldHRpbmdzOwogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXI6OlJUU1BTb3VyY2U6OnNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpIHsKLSAgICBpZiAobUxvb3BlciA9PSBOVUxMKSB7Ci0gICAgICAgIG1CdWZmZXJpbmdTZXR0aW5ncyA9IGJ1ZmZlcmluZzsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRCdWZmZXJpbmdTZXR0aW5ncywgdGhpcyk7Ci0gICAgd3JpdGVUb0FNZXNzYWdlKG1zZywgYnVmZmVyaW5nKTsKLSAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7Ci0gICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOwotICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgewotICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUJ1ZmZlcmluZ1NldHRpbmdzTG9jayk7CisgICAgbUJ1ZmZlcmluZ1NldHRpbmdzID0gYnVmZmVyaW5nOworICAgIHJldHVybiBPSzsKIH0KIAogdm9pZCBOdVBsYXllcjo6UlRTUFNvdXJjZTo6cHJlcGFyZUFzeW5jKCkgewpAQCAtMzU2LDggKzM0MiwxNyBAQAogICAgICAgICB9CiAgICAgICAgIGludDY0X3QgYnVmZmVyZWREdXJhdGlvblVzID0gc3JjLT5nZXRCdWZmZXJlZER1cmF0aW9uVXMoJmZpbmFsUmVzdWx0KTsKIAorICAgICAgICBpbnQ2NF90IGluaXRpYWxNYXJrVXM7CisgICAgICAgIGludDY0X3QgbWF4UmVidWZmZXJpbmdNYXJrVXM7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtQnVmZmVyaW5nU2V0dGluZ3NMb2NrKTsKKyAgICAgICAgICAgIGluaXRpYWxNYXJrVXMgPSBtQnVmZmVyaW5nU2V0dGluZ3MubUluaXRpYWxNYXJrTXMgKiAxMDAwbGw7CisgICAgICAgICAgICAvLyBUT0RPOiBtYXhSZWJ1ZmZlcmluZ01hcmtVcyBjb3VsZCBiZSBsYXJnZXIgdGhhbgorICAgICAgICAgICAgLy8gbUJ1ZmZlcmluZ1NldHRpbmdzLm1SZXN1bWVQbGF5YmFja01hcmtNcyAqIDEwMDBsbC4KKyAgICAgICAgICAgIG1heFJlYnVmZmVyaW5nTWFya1VzID0gbUJ1ZmZlcmluZ1NldHRpbmdzLm1SZXN1bWVQbGF5YmFja01hcmtNcyAqIDEwMDBsbDsKKyAgICAgICAgfQogICAgICAgICAvLyBpc0ZpbmlzaGVkIHdoZW4gZHVyYXRpb24gaXMgMCBjaGVja3MgZm9yIEVPUyByZXN1bHQgb25seQotICAgICAgICBpZiAoYnVmZmVyZWREdXJhdGlvblVzID4gbUJ1ZmZlcmluZ1NldHRpbmdzLm1Jbml0aWFsV2F0ZXJtYXJrTXMgKiAxMDAwCisgICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPiBpbml0aWFsTWFya1VzCiAgICAgICAgICAgICAgICAgfHwgc3JjLT5pc0ZpbmlzaGVkKC8qIGR1cmF0aW9uICovIDApKSB7CiAgICAgICAgICAgICArK3ByZXBhcmVkQ291bnQ7CiAgICAgICAgIH0KQEAgLTM2NiwxNSArMzYxLDE1IEBACiAgICAgICAgICAgICArK292ZXJmbG93Q291bnQ7CiAgICAgICAgICAgICArK2ZpbmlzaGVkQ291bnQ7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoYnVmZmVyZWREdXJhdGlvblVzIDwgbUJ1ZmZlcmluZ1NldHRpbmdzLm1SZWJ1ZmZlcmluZ1dhdGVybWFya0xvd01zICogMTAwMCkgeworICAgICAgICAgICAgLy8gVE9ETzogcmVkZWZpbmUga1VuZGVyZmxvd01hcmtNcyB0byBhIGZhaXIgdmFsdWUsCisgICAgICAgICAgICBpZiAoYnVmZmVyZWREdXJhdGlvblVzIDwga1VuZGVyZmxvd01hcmtNcyAqIDEwMDApIHsKICAgICAgICAgICAgICAgICArK3VuZGVyZmxvd0NvdW50OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJ1ZmZlcmVkRHVyYXRpb25VcyA+IG1CdWZmZXJpbmdTZXR0aW5ncy5tUmVidWZmZXJpbmdXYXRlcm1hcmtIaWdoTXMgKiAxMDAwKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyZWREdXJhdGlvblVzID4gbWF4UmVidWZmZXJpbmdNYXJrVXMpIHsKICAgICAgICAgICAgICAgICArK292ZXJmbG93Q291bnQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0U2VydmVyTWFya1VzID0KLSAgICAgICAgICAgICAgICAgICAgKG1CdWZmZXJpbmdTZXR0aW5ncy5tUmVidWZmZXJpbmdXYXRlcm1hcmtMb3dNcwotICAgICAgICAgICAgICAgICAgICAgICAgKyBtQnVmZmVyaW5nU2V0dGluZ3MubVJlYnVmZmVyaW5nV2F0ZXJtYXJrSGlnaE1zKSAvIDIgKiAxMDAwbGw7CisgICAgICAgICAgICAgICAgICAgIChrVW5kZXJmbG93TWFya01zICogMTAwMGxsICsgbWF4UmVidWZmZXJpbmdNYXJrVXMpIC8gMjsKICAgICAgICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPCBzdGFydFNlcnZlck1hcmtVcykgewogICAgICAgICAgICAgICAgICsrc3RhcnRDb3VudDsKICAgICAgICAgICAgIH0KQEAgLTUxMiwzNiArNTA3LDYgQEAKICAgICB9IGVsc2UgaWYgKG1zZy0+d2hhdCgpID09IGtXaGF0U2lnbmFsRU9TKSB7CiAgICAgICAgIG9uU2lnbmFsRU9TKG1zZyk7CiAgICAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKG1zZy0+d2hhdCgpID09IGtXaGF0U2V0QnVmZmVyaW5nU2V0dGluZ3MpIHsKLSAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7Ci0gICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKLQotICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyBidWZmZXJpbmc7Ci0gICAgICAgIHJlYWRGcm9tQU1lc3NhZ2UobXNnLCAmYnVmZmVyaW5nKTsKLQotICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICAgICAgaWYgKGJ1ZmZlcmluZy5Jc1NpemVCYXNlZEJ1ZmZlcmluZ01vZGUoYnVmZmVyaW5nLm1Jbml0aWFsQnVmZmVyaW5nTW9kZSkKLSAgICAgICAgICAgICAgICB8fCBidWZmZXJpbmcuSXNTaXplQmFzZWRCdWZmZXJpbmdNb2RlKGJ1ZmZlcmluZy5tUmVidWZmZXJpbmdNb2RlKQotICAgICAgICAgICAgICAgIHx8IChidWZmZXJpbmcubVJlYnVmZmVyaW5nV2F0ZXJtYXJrTG93TXMgPiBidWZmZXJpbmcubVJlYnVmZmVyaW5nV2F0ZXJtYXJrSGlnaE1zCi0gICAgICAgICAgICAgICAgICAgICYmIGJ1ZmZlcmluZy5Jc1RpbWVCYXNlZEJ1ZmZlcmluZ01vZGUoYnVmZmVyaW5nLm1SZWJ1ZmZlcmluZ01vZGUpKSkgewotICAgICAgICAgICAgZXJyID0gQkFEX1ZBTFVFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGJ1ZmZlcmluZy5tSW5pdGlhbEJ1ZmZlcmluZ01vZGUgPT0gQlVGRkVSSU5HX01PREVfTk9ORSkgewotICAgICAgICAgICAgICAgIGJ1ZmZlcmluZy5tSW5pdGlhbFdhdGVybWFya01zID0gQnVmZmVyaW5nU2V0dGluZ3M6OmtOb1dhdGVybWFyazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChidWZmZXJpbmcubVJlYnVmZmVyaW5nTW9kZSA9PSBCVUZGRVJJTkdfTU9ERV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyaW5nLm1SZWJ1ZmZlcmluZ1dhdGVybWFya0xvd01zID0gQnVmZmVyaW5nU2V0dGluZ3M6OmtOb1dhdGVybWFyazsKLSAgICAgICAgICAgICAgICBidWZmZXJpbmcubVJlYnVmZmVyaW5nV2F0ZXJtYXJrSGlnaE1zID0gSU5UMzJfTUFYOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQnVmZmVyaW5nU2V0dGluZ3MgPSBidWZmZXJpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLSAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKLQotICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgQ0hFQ0tfRVEobXNnLT53aGF0KCksIGtXaGF0Tm90aWZ5KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5oCmluZGV4IDA4MTI5OTEuLjAzZmNlMDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuaApAQCAtNDAsNyArNDAsNyBAQAogICAgICAgICAgICAgdWlkX3QgdWlkID0gMCwKICAgICAgICAgICAgIGJvb2wgaXNTRFAgPSBmYWxzZSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlZmF1bHRCdWZmZXJpbmdTZXR0aW5ncygKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlcmluZ1NldHRpbmdzKAogICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpIG92ZXJyaWRlOwogCkBAIC03MSw3ICs3MSw2IEBACiAgICAgICAgIGtXaGF0UGVyZm9ybVNlZWsgICAgID0gJ3NlZWsnLAogICAgICAgICBrV2hhdFBvbGxCdWZmZXJpbmcgICA9ICdwb2xsJywKICAgICAgICAga1doYXRTaWduYWxFT1MgICAgICAgPSAnZW9zICcsCi0gICAgICAgIGtXaGF0U2V0QnVmZmVyaW5nU2V0dGluZ3MgPSAnc0J1UycsCiAgICAgfTsKIAogICAgIGVudW0gU3RhdGUgewpAQCAtMTA5LDYgKzEwOCw4IEBACiAgICAgYm9vbCBtQnVmZmVyaW5nOwogICAgIGJvb2wgbUluUHJlcGFyYXRpb25QaGFzZTsKICAgICBib29sIG1FT1NQZW5kaW5nOworCisgICAgTXV0ZXggbUJ1ZmZlcmluZ1NldHRpbmdzTG9jazsKICAgICBCdWZmZXJpbmdTZXR0aW5ncyBtQnVmZmVyaW5nU2V0dGluZ3M7CiAKICAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1N0cmVhbWluZ1NvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmNwcAppbmRleCBmYzA4MDNiLi5iM2RhNTNmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmNwcApAQCAtMjQsMTAgKzI0LDExIEBACiAjaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgogI2luY2x1ZGUgIk51UGxheWVyU3RyZWFtTGlzdGVuZXIuaCIKIAorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhS2V5cy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KIApAQCAtNTEsMTkgKzUyLDE0IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBOdVBsYXllcjo6U3RyZWFtaW5nU291cmNlOjpnZXREZWZhdWx0QnVmZmVyaW5nU2V0dGluZ3MoCitzdGF0dXNfdCBOdVBsYXllcjo6U3RyZWFtaW5nU291cmNlOjpnZXRCdWZmZXJpbmdTZXR0aW5ncygKICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MgKmJ1ZmZlcmluZyAvKiBub25udWxsICovKSB7CiAgICAgKmJ1ZmZlcmluZyA9IEJ1ZmZlcmluZ1NldHRpbmdzKCk7CiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBOdVBsYXllcjo6U3RyZWFtaW5nU291cmNlOjpzZXRCdWZmZXJpbmdTZXR0aW5ncygKLSAgICAgICAgY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MgJmJ1ZmZlcmluZykgewotICAgIGlmIChidWZmZXJpbmcubUluaXRpYWxCdWZmZXJpbmdNb2RlICE9IEJVRkZFUklOR19NT0RFX05PTkUKLSAgICAgICAgICAgIHx8IGJ1ZmZlcmluZy5tUmVidWZmZXJpbmdNb2RlICE9IEJVRkZFUklOR19NT0RFX05PTkUpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KKyAgICAgICAgY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MgJiAvKiBidWZmZXJpbmcgKi8pIHsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTExOSw3ICsxMTUsNyBAQAogICAgICAgICAgICAgaW50MzJfdCBtYXNrOwogICAgICAgICAgICAgaWYgKGV4dHJhICE9IE5VTEwKICAgICAgICAgICAgICAgICAgICAgJiYgZXh0cmEtPmZpbmRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgICAgIElTdHJlYW1MaXN0ZW5lcjo6a0tleURpc2NvbnRpbnVpdHlNYXNrLCAmbWFzaykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtJU3RyZWFtTGlzdGVuZXJLZXlEaXNjb250aW51aXR5TWFzaywgJm1hc2spKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1hc2sgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ2xpZW50IHNwZWNpZmllZCBhbiBpbGxlZ2FsIGRpc2NvbnRpbnVpdHkgdHlwZS4iKTsKICAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3IoRVJST1JfVU5TVVBQT1JURUQpOwpAQCAtMTQ3LDcgKzE0Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbWVkaWFUaW1lVXM7CiAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmbWVkaWFUaW1lVXMsICZidWZmZXJbMl0sIHNpemVvZihtZWRpYVRpbWVVcykpOwogCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhLT5zZXRJbnQ2NChJU3RyZWFtTGlzdGVuZXI6OmtLZXlNZWRpYVRpbWVVcywgbWVkaWFUaW1lVXMpOworICAgICAgICAgICAgICAgICAgICBleHRyYS0+c2V0SW50NjQoa0FUU1BhcnNlcktleU1lZGlhVGltZVVzLCBtZWRpYVRpbWVVcyk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgbVRTUGFyc2VyLT5zaWduYWxEaXNjb250aW51aXR5KApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1N0cmVhbWluZ1NvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1N0cmVhbWluZ1NvdXJjZS5oCmluZGV4IDJlMWQyYjMuLjc2ZDFkMGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmgKQEAgLTMyLDcgKzMyLDcgQEAKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAogICAgICAgICAgICAgY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4gJnNvdXJjZSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlZmF1bHRCdWZmZXJpbmdTZXR0aW5ncygKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlcmluZ1NldHRpbmdzKAogICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpIG92ZXJyaWRlOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MzZiZGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDI1IEBACitjY190ZXN0IHsKKworICAgIG5hbWU6ICJEcm1TZXNzaW9uTWFuYWdlcl90ZXN0IiwKKworICAgIHRhZ3M6IFsidGVzdHMiXSwKKworICAgIHNyY3M6IFsiRHJtU2Vzc2lvbk1hbmFnZXJfdGVzdC5jcHAiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWFwbGF5ZXJzZXJ2aWNlIiwKKyAgICAgICAgImxpYm1lZGlhZHJtIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEiLAorICAgIF0sCisKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5tayBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjliODVmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyBCdWlsZCB0aGUgdW5pdCB0ZXN0cy4KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBEcm1TZXNzaW9uTWFuYWdlcl90ZXN0Ci0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0JRHJtU2Vzc2lvbk1hbmFnZXJfdGVzdC5jcHAgXAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJsb2cgXAotCWxpYm1lZGlhcGxheWVyc2VydmljZSBcCi0JbGlibWVkaWFkcm0gXAotCWxpYnV0aWxzIFwKLQlhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAgXAotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLQlmcmFtZXdvcmtzL2F2L2luY2x1ZGUgXAotCWZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlIFwKLQotTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVdhbGwKLQotTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQotCi1pbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9Ecm1TZXNzaW9uTWFuYWdlcl90ZXN0LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9Ecm1TZXNzaW9uTWFuYWdlcl90ZXN0LmNwcAppbmRleCBjNTIxMmZjLi5kODFlZTA1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvRHJtU2Vzc2lvbk1hbmFnZXJfdGVzdC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL0RybVNlc3Npb25NYW5hZ2VyX3Rlc3QuY3BwCkBAIC0yMCwxMSArMjAsMTEgQEAKIAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9Ecm0uaD4KLSNpbmNsdWRlIDxtZWRpYS9Ecm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRHJtU2Vzc2lvbk1hbmFnZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtSGFsLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vQW5kcm9pZC5icCBiL21lZGlhL2xpYm5iYWlvL0FuZHJvaWQuYnAKaW5kZXggNDIyMGI3Ny4uYTRkZjM4ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJuYmFpby9BbmRyb2lkLmJwCkBAIC00MSwxMSArNDEsOCBAQAogICAgICAgICAiQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5jcHAiLAogICAgICAgICAiQXVkaW9TdHJlYW1JblNvdXJjZS5jcHAiLAogICAgICAgICAiQXVkaW9TdHJlYW1PdXRTaW5rLmNwcCIsCi0gICAgICAgICJOQkxvZy5jcHAiLAotICAgICAgICAiUGVyZm9ybWFuY2VBbmFseXNpcy5jcHAiLAogICAgICAgICAiUGlwZS5jcHAiLAogICAgICAgICAiUGlwZVJlYWRlci5jcHAiLAotICAgICAgICAiUmVwb3J0UGVyZm9ybWFuY2UuY3BwIiwKICAgICAgICAgIlNvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuY3BwIiwKICAgICBdLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9OQkxvZy5jcHAgYi9tZWRpYS9saWJuYmFpby9OQkxvZy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNjM5ZDIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibmJhaW8vTkJMb2cuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTIxNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSogRG9jdW1lbnRhdGlvbjogV29ya2Zsb3cgc3VtbWFyeSBmb3IgaGlzdG9ncmFtIGRhdGEgcHJvY2Vzc2luZzoKLSogRm9yIG1vcmUgZGV0YWlscyBvbiBGSUZPLCBwbGVhc2Ugc2VlIHN5c3RlbS9tZWRpYS9hdWRpb191dGlsczsgZG94eWdlbgotKiBUT0RPOiBhZGQgdGhpcyBkb2N1bWVudGF0aW9uIHRvIGRveHlnZW4gb25jZSBpdCBpcyBmdXJ0aGVyIGRldmVsb3BlZAotKiAxKSBXcml0aW5nIGJ1ZmZlciBwZXJpb2QgdGltZXN0YW1wIHRvIHRoZSBjaXJjdWxhciBidWZmZXIKLSogb25Xb3JrKCkKLSogICAgIENhbGxlZCBldmVyeSBwZXJpb2QgbGVuZ3RoIChlLmcuLCA0bXMpCi0qICAgICBDYWxscyBMT0dfSElTVF9UUwotKiBMT0dfSElTVF9UUwotKiAgICAgSGFzaGVzIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIsIGFuZCB3cml0ZXMgc2luZ2xlIHRpbWVzdGFtcCB0byBidWZmZXIKLSogICAgIGNhbGxzIE5CTE9HOjpXcml0ZXI6OmxvZ0V2ZW50SGlzdFRTIG9uY2UKLSogTkJMT0c6OldyaXRlcjo6bG9nRXZlbnRIaXN0VFMKLSogICAgIGNhbGxzIE5CTE9HOjpXcml0ZXI6OmxvZyBvbiBoYXNoIGFuZCBjdXJyZW50IHRpbWVzdGFtcAotKiAgICAgdGltZSBpcyBpbiBDTE9DS19NT05PVE9OSUMgY29udmVydGVkIHRvIG5zCi0qIE5CTE9HOjpXcml0ZXI6OmxvZyhFdmVudCwgY29uc3Qgdm9pZCosIHNpemVfdCkKLSogICAgIEluaXRpYWxpemVzIEVudHJ5LCBhIHN0cnVjdCBjb250YWluaW5nIG9uZSBsb2cgZW50cnkKLSogICAgIEVudHJ5IGNvbnRhaW5zIHRoZSBldmVudCB0eXBlIChtRXZlbnQpLCBkYXRhIGxlbmd0aCAobUxlbmd0aCksCi0qICAgICBhbmQgZGF0YSBwb2ludGVyIChtRGF0YSkKLSogICAgIFRPRE86IHdoeSBtTGVuZ3RoIChtYXggbGVuZ3RoIG9mIGJ1ZmZlciBkYXRhKSAgbXVzdCBiZSA8PSBrTWF4TGVuZ3RoID0gMjU1PwotKiAgICAgY2FsbHMgTkJMT0c6OldyaXRlcjo6bG9nKEVudHJ5ICosIGJvb2wpCi0qIE5CTG9nOjpXcml0ZXI6OmxvZyhFbnRyeSAqLCBib29sKQotKiAgICAgQ2FsbHMgY29weUVudHJ5RGF0YUF0IHRvIGZvcm1hdCBkYXRhIGFzIGZvbGxvd3MgaW4gdGVtcCBhcnJheToKLSogICAgIFt0eXBlXVtsZW5ndGhdW2RhdGEgLi4uIF1bbGVuZ3RoXQotKiAgICAgY2FsbHMgYXVkaW9fdXRpbHNfZmlmb193cml0ZXIud3JpdGUgb24gdGVtcAotKiBhdWRpb191dGlsc19maWZvX3dyaXRlci53cml0ZQotKiAgICAgY2FsbHMgb2J0YWluKCksIG1lbWNweSAocmVmZXJlbmNlIGluIGRveHlnZW4pCi0qICAgICByZXR1cm5zIG51bWJlciBvZiBmcmFtZXMgd3JpdHRlbgotKiBzc2l6ZV90IGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyOjpvYnRhaW4KLSogICAgIERldGVybWluZXMgcmVhZGFibGUgYnVmZmVyIHNlY3Rpb24gdmlhIHBvaW50ZXIgYXJpdGhtZXRpYyBvbiByZWFkZXIKLSogICAgIGFuZCB3cml0ZXIgcG9pbnRlcnMKLSogU2ltaWxhcmx5LCBMT0dfQVVESU9fU1RBVEUoKSBpcyBjYWxsZWQgYnkgb25TdGF0ZUNoYW5nZSB3aGVuZXZlciBhdWRpbyBpcwotKiB0dXJuZWQgb24gb3Igb2ZmLCBhbmQgd3JpdGVzIHRoaXMgbm90aWZpY2F0aW9uIHRvIHRoZSBGSUZPLgotKgotKiAyKSByZWFkaW5nIHRoZSBkYXRhIGZyb20gc2hhcmVkIG1lbW9yeQotKiBUaHJlYWQ6OnRocmVhZGxvb3AoKQotKiAgICAgVE9ETzogYWRkIGRlc2NyaXB0aW9uPwotKiBOQkxvZzo6TWVyZ2VUaHJlYWQ6OnRocmVhZExvb3AoKQotKiAgICAgY2FsbHMgTkJMb2c6Ok1lcmdlcjo6bWVyZ2UKLSogTkJMb2c6Ok1lcmdlcjo6bWVyZ2UKLSogICAgIE1lcmdlcyBzbmFwc2hvdHMgc29ydGVkIGJ5IHRpbWVzdGFtcAotKiAgICAgZm9yIGVhY2ggcmVhZGVyIGluIHZlY3RvciBvZiBjbGFzcyBOYW1lZFJlYWRlciwKLSogICAgIGNhbGxzTmFtZWRSZWFkZXI6OnJlYWRlcigpLT5nZXRTbmFwc2hvdAotKiAgICAgVE9ETzogY2hlY2sgd2hldGhlciB0aGUgcmVzdCBvZiB0aGlzIGZ1bmN0aW9uIGlzIHJlbGV2YW50Ci0qIE5CTG9nOjpSZWFkZXI6OmdldFNuYXBzaG90Ci0qICAgICBjb3BpZXMgc25hcHNob3Qgb2YgcmVhZGVyJ3MgZmlmbyBidWZmZXIgaW50byBpdHMgb3duIGJ1ZmZlcgotKiAgICAgY2FsbHMgbUZpZm9SZWFkZXItPm9idGFpbiB0byBmaW5kIHJlYWRhYmxlIGRhdGEKLSogICAgIHNldHMgc25hcHNob3QuYmVnaW4oKSBhbmQgLmVuZCgpIGl0ZXJhdG9ycyB0byBib3VuZGFyaWVzIG9mIHZhbGlkIGVudHJpZXMKLSogICAgIG1vdmVzIHRoZSBmaWZvIHJlYWRlciBpbmRleCB0byBhZnRlciB0aGUgbGFzdCBlbnRyeSByZWFkCi0qICAgICBpbiB0aGlzIGNhc2UsIHRoZSBidWZmZXIgaXMgaW4gc2hhcmVkIG1lbW9yeS4gaW4gKDQpLCB0aGUgYnVmZmVyIGlzIHByaXZhdGUKLSoKLSogMykgcmVhZGluZyB0aGUgZGF0YSBmcm9tIHByaXZhdGUgYnVmZmVyCi0qIE1lZGlhTG9nU2VydmljZTo6ZHVtcAotKiAgICAgY2FsbHMgTkJMb2c6OlJlYWRlcjo6ZHVtcChDT05TT0xFKQotKiAgICAgVGhlIHByaXZhdGUgYnVmZmVyIGNvbnRhaW5zIGFsbCBsb2dzIGZvciBhbGwgcmVhZGVycyBpbiBzaGFyZWQgbWVtb3J5Ci0qIE5CTG9nOjpSZWFkZXI6OmR1bXAoaW50KQotKiAgICAgY2FsbHMgZ2V0U25hcHNob3Qgb24gdGhlIGN1cnJlbnQgcmVhZGVyCi0qICAgICBjYWxscyBkdW1wKGludCwgc2l6ZV90LCBTbmFwc2hvdCkKLSogTkJMb2c6OlJlYWRlcjo6ZHVtcChpbnQsIHNpemUsIHNuYXBzaG90KQotKiAgICAgaXRlcmF0ZXMgdGhyb3VnaCBzbmFwc2hvdCdzIGV2ZW50cyBhbmQgc3dpdGNoZXMgYmFzZWQgb24gdGhlaXIgdHlwZQotKiAgICAgKHN0cmluZywgdGltZXN0YW1wLCBldGMuLi4pCi0qICAgICBJbiB0aGUgY2FzZSBvZiBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFMsIGFkZHMgYSBsaXN0IG9mIHRpbWVzdGFtcCBzZXF1ZW5jZXMKLSogICAgIChoaXN0b2dyYW0gZW50cnkpIHRvIE5CTG9nOjptSGlzdHMKLSogICAgIFRPRE86IGFkZCBldmVyeSBISVNUT0dSQU1fRU5UUllfVFMgdG8gdHdvCi0qICAgICBjaXJjdWxhciBidWZmZXJzOiBvbmUgc2hvcnQtdGVybSBhbmQgb25lIGxvbmctdGVybSAoY2FuIGFkZCBldmVuIGxvbmdlci10ZXJtCi0qICAgICBzdHJ1Y3R1cmVzIGluIHRoZSBmdXR1cmUpLiBXaGVuIGR1bXAgaXMgY2FsbGVkLCBwcmludCBldmVyeXRoaW5nIGN1cnJlbnRseQotKiAgICAgaW4gdGhlIGJ1ZmZlci4KLSogTkJMb2c6OmRyYXdIaXN0b2dyYW0KLSogICAgIGlucHV0OiB0aW1lc3RhbXAgYXJyYXkKLSogICAgIGJ1Y2tldHMgdGhpcyB0byBhIGhpc3RvZ3JhbSBhbmQgcHJpbnRzCi0qCi0qLwotCi0jZGVmaW5lIExPR19UQUcgIk5CTG9nIgotLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxjbGltaXRzPgotI2luY2x1ZGUgPGRlcXVlPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0vLyAjaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8bnVtZXJpYz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8bmV3PgotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3JvdW5kdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkxvZy5oPgotI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmFpby9SZXBvcnRQZXJmb3JtYW5jZS5oPgotLy8gI2luY2x1ZGUgPHV0aWxzL0NhbGxTdGFjay5oPiAvLyB1c2VkIHRvIHByaW50IGNhbGxzdGFjawotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotI2luY2x1ZGUgPHF1ZXVlPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotaW50IE5CTG9nOjpFbnRyeTo6Y29weUVudHJ5RGF0YUF0KHNpemVfdCBvZmZzZXQpIGNvbnN0Ci17Ci0gICAgLy8gRklYTUUgVGhpcyBpcyB0b28gc2xvdwotICAgIGlmIChvZmZzZXQgPT0gMCkKLSAgICAgICAgcmV0dXJuIG1FdmVudDsKLSAgICBlbHNlIGlmIChvZmZzZXQgPT0gMSkKLSAgICAgICAgcmV0dXJuIG1MZW5ndGg7Ci0gICAgZWxzZSBpZiAob2Zmc2V0IDwgKHNpemVfdCkgKG1MZW5ndGggKyAyKSkKLSAgICAgICAgcmV0dXJuICgoY2hhciAqKSBtRGF0YSlbb2Zmc2V0IC0gMl07Ci0gICAgZWxzZSBpZiAob2Zmc2V0ID09IChzaXplX3QpIChtTGVuZ3RoICsgMikpCi0gICAgICAgIHJldHVybiBtTGVuZ3RoOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vKnN0YXRpYyovCi1zdGQ6OnVuaXF1ZV9wdHI8TkJMb2c6OkFic3RyYWN0RW50cnk+IE5CTG9nOjpBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KGNvbnN0IHVpbnQ4X3QgKnB0cikgewotICAgIGNvbnN0IHVpbnQ4X3QgdHlwZSA9IEVudHJ5SXRlcmF0b3IocHRyKS0+dHlwZTsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIEVWRU5UX1NUQVJUX0ZNVDoKLSAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8Rm9ybWF0RW50cnk+KEZvcm1hdEVudHJ5KHB0cikpOwotICAgIGNhc2UgRVZFTlRfQVVESU9fU1RBVEU6Ci0gICAgY2FzZSBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFM6Ci0gICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEhpc3RvZ3JhbUVudHJ5PihIaXN0b2dyYW1FbnRyeShwdHIpKTsKLSAgICBkZWZhdWx0OgotICAgICAgICBBTE9HVygiVHJpZWQgdG8gY3JlYXRlIEFic3RyYWN0RW50cnkgb2YgdHlwZSAlZCIsIHR5cGUpOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci19Ci0KLU5CTG9nOjpBYnN0cmFjdEVudHJ5OjpBYnN0cmFjdEVudHJ5KGNvbnN0IHVpbnQ4X3QgKmVudHJ5KSA6IG1FbnRyeShlbnRyeSkgewotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3IgTkJMb2c6OkZvcm1hdEVudHJ5OjpiZWdpbigpIGNvbnN0IHsKLSAgICByZXR1cm4gRW50cnlJdGVyYXRvcihtRW50cnkpOwotfQotCi1jb25zdCBjaGFyICpOQkxvZzo6Rm9ybWF0RW50cnk6OmZvcm1hdFN0cmluZygpIGNvbnN0IHsKLSAgICByZXR1cm4gKGNvbnN0IGNoYXIqKSBtRW50cnkgKyBvZmZzZXRvZihlbnRyeSwgZGF0YSk7Ci19Ci0KLXNpemVfdCBOQkxvZzo6Rm9ybWF0RW50cnk6OmZvcm1hdFN0cmluZ0xlbmd0aCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUVudHJ5W29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXTsKLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3IgTkJMb2c6OkZvcm1hdEVudHJ5OjphcmdzKCkgY29uc3QgewotICAgIGF1dG8gaXQgPSBiZWdpbigpOwotICAgIC8vIHNraXAgc3RhcnQgZm10Ci0gICAgKytpdDsKLSAgICAvLyBza2lwIHRpbWVzdGFtcAotICAgICsraXQ7Ci0gICAgLy8gc2tpcCBoYXNoCi0gICAgKytpdDsKLSAgICAvLyBTa2lwIGF1dGhvciBpZiBwcmVzZW50Ci0gICAgaWYgKGl0LT50eXBlID09IEVWRU5UX0FVVEhPUikgewotICAgICAgICArK2l0OwotICAgIH0KLSAgICByZXR1cm4gaXQ7Ci19Ci0KLWludDY0X3QgTkJMb2c6OkZvcm1hdEVudHJ5Ojp0aW1lc3RhbXAoKSBjb25zdCB7Ci0gICAgYXV0byBpdCA9IGJlZ2luKCk7Ci0gICAgLy8gc2tpcCBzdGFydCBmbXQKLSAgICArK2l0OwotICAgIHJldHVybiBpdC5wYXlsb2FkPGludDY0X3Q+KCk7Ci19Ci0KLU5CTG9nOjpsb2dfaGFzaF90IE5CTG9nOjpGb3JtYXRFbnRyeTo6aGFzaCgpIGNvbnN0IHsKLSAgICBhdXRvIGl0ID0gYmVnaW4oKTsKLSAgICAvLyBza2lwIHN0YXJ0IGZtdAotICAgICsraXQ7Ci0gICAgLy8gc2tpcCB0aW1lc3RhbXAKLSAgICArK2l0OwotICAgIC8vIHVuYWxpZ25lZCA2NC1iaXQgcmVhZCBub3Qgc3VwcG9ydGVkCi0gICAgbG9nX2hhc2hfdCBoYXNoOwotICAgIG1lbWNweSgmaGFzaCwgaXQtPmRhdGEsIHNpemVvZihoYXNoKSk7Ci0gICAgcmV0dXJuIGhhc2g7Ci19Ci0KLWludCBOQkxvZzo6Rm9ybWF0RW50cnk6OmF1dGhvcigpIGNvbnN0IHsKLSAgICBhdXRvIGl0ID0gYmVnaW4oKTsKLSAgICAvLyBza2lwIHN0YXJ0IGZtdAotICAgICsraXQ7Ci0gICAgLy8gc2tpcCB0aW1lc3RhbXAKLSAgICArK2l0OwotICAgIC8vIHNraXAgaGFzaAotICAgICsraXQ7Ci0gICAgLy8gaWYgdGhlcmUgaXMgYW4gYXV0aG9yIGVudHJ5LCByZXR1cm4gaXQsIHJldHVybiAtMSBvdGhlcndpc2UKLSAgICBpZiAoaXQtPnR5cGUgPT0gRVZFTlRfQVVUSE9SKSB7Ci0gICAgICAgIHJldHVybiBpdC5wYXlsb2FkPGludD4oKTsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6Rm9ybWF0RW50cnk6OmNvcHlXaXRoQXV0aG9yKAotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsIGludCBhdXRob3IpIGNvbnN0IHsKLSAgICBhdXRvIGl0ID0gYmVnaW4oKTsKLSAgICAvLyBjb3B5IGZtdCBzdGFydCBlbnRyeQotICAgIGl0LmNvcHlUbyhkc3QpOwotICAgIC8vIGNvcHkgdGltZXN0YW1wCi0gICAgKCsraXQpLmNvcHlUbyhkc3QpOyAgICAvLyBjb3B5IGhhc2gKLSAgICAoKytpdCkuY29weVRvKGRzdCk7Ci0gICAgLy8gaW5zZXJ0IGF1dGhvciBlbnRyeQotICAgIHNpemVfdCBhdXRob3JFbnRyeVNpemUgPSBOQkxvZzo6RW50cnk6OmtPdmVyaGVhZCArIHNpemVvZihhdXRob3IpOwotICAgIHVpbnQ4X3QgYXV0aG9yRW50cnlbYXV0aG9yRW50cnlTaXplXTsKLSAgICBhdXRob3JFbnRyeVtvZmZzZXRvZihlbnRyeSwgdHlwZSldID0gRVZFTlRfQVVUSE9SOwotICAgIGF1dGhvckVudHJ5W29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSA9Ci0gICAgICAgIGF1dGhvckVudHJ5W2F1dGhvckVudHJ5U2l6ZSArIE5CTG9nOjpFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XSA9Ci0gICAgICAgIHNpemVvZihhdXRob3IpOwotICAgICooaW50KikgKCZhdXRob3JFbnRyeVtvZmZzZXRvZihlbnRyeSwgZGF0YSldKSA9IGF1dGhvcjsKLSAgICBkc3QtPndyaXRlKGF1dGhvckVudHJ5LCBhdXRob3JFbnRyeVNpemUpOwotICAgIC8vIGNvcHkgcmVzdCBvZiBlbnRyaWVzCi0gICAgd2hpbGUgKCgrK2l0KS0+dHlwZSAhPSBFVkVOVF9FTkRfRk1UKSB7Ci0gICAgICAgIGl0LmNvcHlUbyhkc3QpOwotICAgIH0KLSAgICBpdC5jb3B5VG8oZHN0KTsKLSAgICArK2l0OwotICAgIHJldHVybiBpdDsKLX0KLQotdm9pZCBOQkxvZzo6RW50cnlJdGVyYXRvcjo6Y29weVRvKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCkgY29uc3QgewotICAgIHNpemVfdCBsZW5ndGggPSBwdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldICsgTkJMb2c6OkVudHJ5OjprT3ZlcmhlYWQ7Ci0gICAgZHN0LT53cml0ZShwdHIsIGxlbmd0aCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkVudHJ5SXRlcmF0b3I6OmNvcHlEYXRhKHVpbnQ4X3QgKmRzdCkgY29uc3QgewotICAgIG1lbWNweSgodm9pZCopIGRzdCwgcHRyICsgb2Zmc2V0b2YoZW50cnksIGRhdGEpLCBwdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldKTsKLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3I6OkVudHJ5SXRlcmF0b3IoKQotICAgIDogcHRyKG51bGxwdHIpIHt9Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpFbnRyeUl0ZXJhdG9yKGNvbnN0IHVpbnQ4X3QgKmVudHJ5KQotICAgIDogcHRyKGVudHJ5KSB7fQotCi1OQkxvZzo6RW50cnlJdGVyYXRvcjo6RW50cnlJdGVyYXRvcihjb25zdCBOQkxvZzo6RW50cnlJdGVyYXRvciAmb3RoZXIpCi0gICAgOiBwdHIob3RoZXIucHRyKSB7fQotCi1jb25zdCBOQkxvZzo6ZW50cnkmIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvciooKSBjb25zdCB7Ci0gICAgcmV0dXJuICooZW50cnkqKSBwdHI7Ci19Ci0KLWNvbnN0IE5CTG9nOjplbnRyeSogTkJMb2c6OkVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yLT4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIChlbnRyeSopIHB0cjsKLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3ImIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvcisrKCkgewotICAgIHB0ciArPSBwdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldICsgTkJMb2c6OkVudHJ5OjprT3ZlcmhlYWQ7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciYgTkJMb2c6OkVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yLS0oKSB7Ci0gICAgcHRyIC09IHB0cltOQkxvZzo6RW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldF0gKyBOQkxvZzo6RW50cnk6OmtPdmVyaGVhZDsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpuZXh0KCkgY29uc3QgewotICAgIEVudHJ5SXRlcmF0b3IgYXV4KCp0aGlzKTsKLSAgICByZXR1cm4gKythdXg7Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpwcmV2KCkgY29uc3QgewotICAgIEVudHJ5SXRlcmF0b3IgYXV4KCp0aGlzKTsKLSAgICByZXR1cm4gLS1hdXg7Ci19Ci0KLWludCBOQkxvZzo6RW50cnlJdGVyYXRvcjo6b3BlcmF0b3ItKGNvbnN0IE5CTG9nOjpFbnRyeUl0ZXJhdG9yICZvdGhlcikgY29uc3QgewotICAgIHJldHVybiBwdHIgLSBvdGhlci5wdHI7Ci19Ci0KLWJvb2wgTkJMb2c6OkVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yIT0oY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gcHRyICE9IG90aGVyLnB0cjsKLX0KLQotYm9vbCBOQkxvZzo6RW50cnlJdGVyYXRvcjo6aGFzQ29uc2lzdGVudExlbmd0aCgpIGNvbnN0IHsKLSAgICByZXR1cm4gcHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSA9PSBwdHJbcHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSArCi0gICAgICAgIE5CTG9nOjpFbnRyeTo6a092ZXJoZWFkICsgTkJMb2c6OkVudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXRdOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW50NjRfdCBOQkxvZzo6SGlzdG9ncmFtRW50cnk6OnRpbWVzdGFtcCgpIGNvbnN0IHsKLSAgICByZXR1cm4gRW50cnlJdGVyYXRvcihtRW50cnkpLnBheWxvYWQ8SGlzdFRzRW50cnk+KCkudHM7Ci19Ci0KLU5CTG9nOjpsb2dfaGFzaF90IE5CTG9nOjpIaXN0b2dyYW1FbnRyeTo6aGFzaCgpIGNvbnN0IHsKLSAgICByZXR1cm4gRW50cnlJdGVyYXRvcihtRW50cnkpLnBheWxvYWQ8SGlzdFRzRW50cnk+KCkuaGFzaDsKLX0KLQotaW50IE5CTG9nOjpIaXN0b2dyYW1FbnRyeTo6YXV0aG9yKCkgY29uc3QgewotICAgIEVudHJ5SXRlcmF0b3IgaXQobUVudHJ5KTsKLSAgICBpZiAoaXQtPmxlbmd0aCA9PSBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKSkgewotICAgICAgICByZXR1cm4gaXQucGF5bG9hZDxIaXN0VHNFbnRyeVdpdGhBdXRob3I+KCkuYXV0aG9yOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yIE5CTG9nOjpIaXN0b2dyYW1FbnRyeTo6Y29weVdpdGhBdXRob3IoCi0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwgaW50IGF1dGhvcikgY29uc3QgewotICAgIC8vIEN1cnJlbnQgaGlzdG9ncmFtIGVudHJ5IGhhcyB7dHlwZSwgbGVuZ3RoLCBzdHJ1Y3QgSGlzdFRzRW50cnksIGxlbmd0aH0uCi0gICAgLy8gV2Ugbm93IHdhbnQge3R5cGUsIGxlbmd0aCwgc3RydWN0IEhpc3RUc0VudHJ5V2l0aEF1dGhvciwgbGVuZ3RofQotICAgIHVpbnQ4X3QgYnVmZmVyW0VudHJ5OjprT3ZlcmhlYWQgKyBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKV07Ci0gICAgLy8gQ29weSBjb250ZW50IHVudGlsIHRoZSBwb2ludCB3ZSB3YW50IHRvIGFkZCB0aGUgYXV0aG9yCi0gICAgbWVtY3B5KGJ1ZmZlciwgbUVudHJ5LCBzaXplb2YoZW50cnkpICsgc2l6ZW9mKEhpc3RUc0VudHJ5KSk7Ci0gICAgLy8gQ29weSB0aGUgYXV0aG9yCi0gICAgKihpbnQqKSAoYnVmZmVyICsgc2l6ZW9mKGVudHJ5KSArIHNpemVvZihIaXN0VHNFbnRyeSkpID0gYXV0aG9yOwotICAgIC8vIFVwZGF0ZSBsZW5ndGhzCi0gICAgYnVmZmVyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSA9IHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpOwotICAgIGJ1ZmZlcltzaXplb2YoYnVmZmVyKSArIEVudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXRdID0gc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcik7Ci0gICAgLy8gV3JpdGUgbmV3IGJ1ZmZlciBpbnRvIEZJRk8KLSAgICBkc3QtPndyaXRlKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwotICAgIHJldHVybiBFbnRyeUl0ZXJhdG9yKG1FbnRyeSkubmV4dCgpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIDAgICAvLyBGSVhNRSBzZWUgbm90ZSBpbiBOQkxvZy5oCi1OQkxvZzo6VGltZWxpbmU6OlRpbWVsaW5lKHNpemVfdCBzaXplLCB2b2lkICpzaGFyZWQpCi0gICAgOiBtU2l6ZShyb3VuZHVwKHNpemUpKSwgbU93bihzaGFyZWQgPT0gTlVMTCksCi0gICAgICBtU2hhcmVkKChTaGFyZWQgKikgKG1Pd24gPyBuZXcgY2hhcltzaGFyZWRTaXplKHNpemUpXSA6IHNoYXJlZCkpCi17Ci0gICAgbmV3IChtU2hhcmVkKSBTaGFyZWQ7Ci19Ci0KLU5CTG9nOjpUaW1lbGluZTo6flRpbWVsaW5lKCkKLXsKLSAgICBtU2hhcmVkLT5+U2hhcmVkKCk7Ci0gICAgaWYgKG1Pd24pIHsKLSAgICAgICAgZGVsZXRlW10gKGNoYXIgKikgbVNoYXJlZDsKLSAgICB9Ci19Ci0jZW5kaWYKLQotLypzdGF0aWMqLwotc2l6ZV90IE5CTG9nOjpUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplX3Qgc2l6ZSkKLXsKLSAgICAvLyBUT0RPIGZpZm8gbm93IHN1cHBvcnRzIG5vbi1wb3dlci1vZi0yIGJ1ZmZlciBzaXplcywgc28gY291bGQgcmVtb3ZlIHRoZSByb3VuZHVwCi0gICAgcmV0dXJuIHNpemVvZihTaGFyZWQpICsgcm91bmR1cChzaXplKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU5CTG9nOjpXcml0ZXI6OldyaXRlcigpCi0gICAgOiBtU2hhcmVkKE5VTEwpLCBtRmlmbyhOVUxMKSwgbUZpZm9Xcml0ZXIoTlVMTCksIG1FbmFibGVkKGZhbHNlKSwgbVBpZFRhZyhOVUxMKSwgbVBpZFRhZ1NpemUoMCkKLXsKLX0KLQotTkJMb2c6OldyaXRlcjo6V3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpCi0gICAgOiBtU2hhcmVkKChTaGFyZWQgKikgc2hhcmVkKSwKLSAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/Ci0gICAgICAgIG5ldyBhdWRpb191dGlsc19maWZvKHNpemUsIHNpemVvZih1aW50OF90KSwKLSAgICAgICAgICAgIG1TaGFyZWQtPm1CdWZmZXIsIG1TaGFyZWQtPm1SZWFyLCBOVUxMIC8qdGhyb3R0bGVzRnJvbnQqLykgOiBOVUxMKSwKLSAgICAgIG1GaWZvV3JpdGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb193cml0ZXIoKm1GaWZvKSA6IE5VTEwpLAotICAgICAgbUVuYWJsZWQobUZpZm9Xcml0ZXIgIT0gTlVMTCkKLXsKLSAgICAvLyBjYWNoaW5nIHBpZCBhbmQgcHJvY2VzcyBuYW1lCi0gICAgcGlkX3QgaWQgPSA6OmdldHBpZCgpOwotICAgIGNoYXIgcHJvY05hbWVbMTZdOwotICAgIGludCBzdGF0dXMgPSBwcmN0bChQUl9HRVRfTkFNRSwgcHJvY05hbWUpOwotICAgIGlmIChzdGF0dXMpIHsgIC8vIGVycm9yIGdldHRpbmcgcHJvY2VzcyBuYW1lCi0gICAgICAgIHByb2NOYW1lWzBdID0gJ1wwJzsKLSAgICB9Ci0gICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbihwcm9jTmFtZSk7Ci0gICAgbVBpZFRhZ1NpemUgPSBsZW5ndGggKyBzaXplb2YocGlkX3QpOwotICAgIG1QaWRUYWcgPSBuZXcgY2hhclttUGlkVGFnU2l6ZV07Ci0gICAgbWVtY3B5KG1QaWRUYWcsICZpZCwgc2l6ZW9mKHBpZF90KSk7Ci0gICAgbWVtY3B5KG1QaWRUYWcgKyBzaXplb2YocGlkX3QpLCBwcm9jTmFtZSwgbGVuZ3RoKTsKLX0KLQotTkJMb2c6OldyaXRlcjo6V3JpdGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSkKLSAgICA6IFdyaXRlcihpTWVtb3J5ICE9IDAgPyAoU2hhcmVkICopIGlNZW1vcnktPnBvaW50ZXIoKSA6IE5VTEwsIHNpemUpCi17Ci0gICAgbUlNZW1vcnkgPSBpTWVtb3J5OwotfQotCi1OQkxvZzo6V3JpdGVyOjp+V3JpdGVyKCkKLXsKLSAgICBkZWxldGUgbUZpZm9Xcml0ZXI7Ci0gICAgZGVsZXRlIG1GaWZvOwotICAgIGRlbGV0ZVtdIG1QaWRUYWc7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nKGNvbnN0IGNoYXIgKnN0cmluZykKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdHJpbmcgPT0gTlVMTCwgIkF0dGVtcHRlZCB0byBsb2cgTlVMTCBzdHJpbmciKTsKLSAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKHN0cmluZyk7Ci0gICAgaWYgKGxlbmd0aCA+IEVudHJ5OjprTWF4TGVuZ3RoKSB7Ci0gICAgICAgIGxlbmd0aCA9IEVudHJ5OjprTWF4TGVuZ3RoOwotICAgIH0KLSAgICBsb2coRVZFTlRfU1RSSU5HLCBzdHJpbmcsIGxlbmd0aCk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nZihjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgdmFfbGlzdCBhcDsKLSAgICB2YV9zdGFydChhcCwgZm10KTsKLSAgICBXcml0ZXI6OmxvZ3ZmKGZtdCwgYXApOyAgICAgLy8gdGhlIFdyaXRlcjo6IGlzIG5lZWRlZCB0byBhdm9pZCB2aXJ0dWFsIGRpc3BhdGNoIGZvciBMb2NrZWRXcml0ZXIKLSAgICB2YV9lbmQoYXApOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ3ZmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2hhciBidWZmZXJbRW50cnk6OmtNYXhMZW5ndGggKyAxIC8qTlVMKi9dOwotICAgIGludCBsZW5ndGggPSB2c25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgZm10LCBhcCk7Ci0gICAgaWYgKGxlbmd0aCA+PSAoaW50KSBzaXplb2YoYnVmZmVyKSkgewotICAgICAgICBsZW5ndGggPSBzaXplb2YoYnVmZmVyKSAtIDE7Ci0gICAgICAgIC8vIE5VTCB0ZXJtaW5hdGlvbiBpcyBub3QgcmVxdWlyZWQKLSAgICAgICAgLy8gYnVmZmVyW2xlbmd0aF0gPSAnXDAnOwotICAgIH0KLSAgICBpZiAobGVuZ3RoID49IDApIHsKLSAgICAgICAgbG9nKEVWRU5UX1NUUklORywgYnVmZmVyLCBsZW5ndGgpOwotICAgIH0KLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dUaW1lc3RhbXAoKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQ2NF90IHRzID0gZ2V0X21vbm90b25pY19ucygpOwotICAgIGlmICh0cyA+IDApIHsKLSAgICAgICAgbG9nKEVWRU5UX1RJTUVTVEFNUCwgJnRzLCBzaXplb2YodHMpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCB0aW1lc3RhbXAiKTsKLSAgICB9Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nVGltZXN0YW1wKGNvbnN0IGludDY0X3QgdHMpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGxvZyhFVkVOVF9USU1FU1RBTVAsICZ0cywgc2l6ZW9mKHRzKSk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nSW50ZWdlcihjb25zdCBpbnQgeCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbG9nKEVWRU5UX0lOVEVHRVIsICZ4LCBzaXplb2YoeCkpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0Zsb2F0KGNvbnN0IGZsb2F0IHgpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGxvZyhFVkVOVF9GTE9BVCwgJngsIHNpemVvZih4KSk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nUElEKCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbG9nKEVWRU5UX1BJRCwgbVBpZFRhZywgbVBpZFRhZ1NpemUpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ1N0YXJ0KGNvbnN0IGNoYXIgKmZtdCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbihmbXQpOwotICAgIGlmIChsZW5ndGggPiBFbnRyeTo6a01heExlbmd0aCkgewotICAgICAgICBsZW5ndGggPSBFbnRyeTo6a01heExlbmd0aDsKLSAgICB9Ci0gICAgbG9nKEVWRU5UX1NUQVJUX0ZNVCwgZm10LCBsZW5ndGgpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0VuZCgpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEVudHJ5IGVudHJ5ID0gRW50cnkoRVZFTlRfRU5EX0ZNVCwgTlVMTCwgMCk7Ci0gICAgbG9nKCZlbnRyeSwgdHJ1ZSk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nSGFzaChsb2dfaGFzaF90IGhhc2gpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGxvZyhFVkVOVF9IQVNILCAmaGFzaCwgc2l6ZW9mKGhhc2gpKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dFdmVudEhpc3RUcyhFdmVudCBldmVudCwgbG9nX2hhc2hfdCBoYXNoKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBIaXN0VHNFbnRyeSBkYXRhOwotICAgIGRhdGEuaGFzaCA9IGhhc2g7Ci0gICAgZGF0YS50cyA9IGdldF9tb25vdG9uaWNfbnMoKTsKLSAgICBpZiAoZGF0YS50cyA+IDApIHsKLSAgICAgICAgbG9nKGV2ZW50LCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCB0aW1lc3RhbXAiKTsKLSAgICB9Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nRm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgbG9nX2hhc2hfdCBoYXNoLCAuLi4pCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdmFfbGlzdCBhcDsKLSAgICB2YV9zdGFydChhcCwgaGFzaCk7Ci0gICAgV3JpdGVyOjpsb2dWRm9ybWF0KGZtdCwgaGFzaCwgYXApOwotICAgIHZhX2VuZChhcCk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nVkZvcm1hdChjb25zdCBjaGFyICpmbXQsIGxvZ19oYXNoX3QgaGFzaCwgdmFfbGlzdCBhcmdwKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBXcml0ZXI6OmxvZ1N0YXJ0KGZtdCk7Ci0gICAgaW50IGk7Ci0gICAgZG91YmxlIGY7Ci0gICAgY2hhciogczsKLSAgICBpbnQ2NF90IHQ7Ci0gICAgV3JpdGVyOjpsb2dUaW1lc3RhbXAoKTsKLSAgICBXcml0ZXI6OmxvZ0hhc2goaGFzaCk7Ci0gICAgZm9yIChjb25zdCBjaGFyICpwID0gZm10OyAqcCAhPSAnXDAnOyBwKyspIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IG1vcmUgY29tcGxleCBmb3JtYXR0aW5nIHN1Y2ggYXMgJS4zZgotICAgICAgICBpZiAoKnAgIT0gJyUnKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2goKisrcCkgewotICAgICAgICBjYXNlICdzJzogLy8gc3RyaW5nCi0gICAgICAgICAgICBzID0gdmFfYXJnKGFyZ3AsIGNoYXIgKik7Ci0gICAgICAgICAgICBXcml0ZXI6OmxvZyhzKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ3QnOiAvLyB0aW1lc3RhbXAKLSAgICAgICAgICAgIHQgPSB2YV9hcmcoYXJncCwgaW50NjRfdCk7Ci0gICAgICAgICAgICBXcml0ZXI6OmxvZ1RpbWVzdGFtcCh0KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ2QnOiAvLyBpbnRlZ2VyCi0gICAgICAgICAgICBpID0gdmFfYXJnKGFyZ3AsIGludCk7Ci0gICAgICAgICAgICBXcml0ZXI6OmxvZ0ludGVnZXIoaSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdmJzogLy8gZmxvYXQKLSAgICAgICAgICAgIGYgPSB2YV9hcmcoYXJncCwgZG91YmxlKTsgLy8gZmxvYXQgYXJndW1lbnRzIGFyZSBwcm9tb3RlZCB0byBkb3VibGUgaW4gdmFyYXJnIGxpc3RzCi0gICAgICAgICAgICBXcml0ZXI6OmxvZ0Zsb2F0KChmbG9hdClmKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ3AnOiAvLyBwaWQKLSAgICAgICAgICAgIFdyaXRlcjo6bG9nUElEKCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvLyB0aGUgIiVcMCIgY2FzZSBmaW5pc2hlcyBwYXJzaW5nCi0gICAgICAgIGNhc2UgJ1wwJzoKLSAgICAgICAgICAgIC0tcDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJyUnOgotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dXKCJOQkxvZyBXcml0ZXIgcGFyc2VkIGludmFsaWQgZm9ybWF0IHNwZWNpZmllcjogJWMiLCAqcCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBXcml0ZXI6OmxvZ0VuZCgpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZyhFdmVudCBldmVudCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKGRhdGEgPT0gTlVMTCB8fCBsZW5ndGggPiBFbnRyeTo6a01heExlbmd0aCkgewotICAgICAgICAvLyBUT0RPIFBlcmhhcHMgaXQgbWFrZXMgc2Vuc2UgdG8gZGlzcGxheSB0cnVuY2F0ZWQgZGF0YSBvciBhdCBsZWFzdCBhCi0gICAgICAgIC8vICAgICAgbWVzc2FnZSB0aGF0IHRoZSBkYXRhIGlzIHRvbyBsb25nPyAgVGhlIGN1cnJlbnQgYmVoYXZpb3IgY2FuIGNyZWF0ZQotICAgICAgICAvLyAgICAgIGEgY29uZnVzaW9uIGZvciBhIHByb2dyYW1tZXIgZGVidWdnaW5nIHRoZWlyIGNvZGUuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gSWdub3JlIGlmIGludmFsaWQgZXZlbnQKLSAgICBpZiAoZXZlbnQgPT0gRVZFTlRfUkVTRVJWRUQgfHwgZXZlbnQgPj0gRVZFTlRfVVBQRVJfQk9VTkQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBFbnRyeSBldHIoZXZlbnQsIGRhdGEsIGxlbmd0aCk7Ci0gICAgbG9nKCZldHIsIHRydWUgLyp0cnVzdGVkKi8pOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZyhjb25zdCBOQkxvZzo6RW50cnkgKmV0ciwgYm9vbCB0cnVzdGVkKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoIXRydXN0ZWQpIHsKLSAgICAgICAgbG9nKGV0ci0+bUV2ZW50LCBldHItPm1EYXRhLCBldHItPm1MZW5ndGgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHNpemVfdCBuZWVkID0gZXRyLT5tTGVuZ3RoICsgRW50cnk6OmtPdmVyaGVhZDsgICAgLy8gbUV2ZW50LCBtTGVuZ3RoLCBkYXRhW21MZW5ndGhdLCBtTGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkID0gbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gRklGTwotCi0gICAgLy8gRklYTUUgb3B0aW1pemUgdGhpcyB1c2luZyBtZW1jcHkgZm9yIHRoZSBkYXRhIHBhcnQgb2YgdGhlIEVudHJ5LgotICAgIC8vIFRoZSBFbnRyeSBjb3VsZCBoYXZlIGEgbWV0aG9kIGNvcHlUbyhwdHIsIG9mZnNldCwgc2l6ZSkgdG8gb3B0aW1pemUgdGhlIGNvcHkuCi0gICAgLy8gY2hlY2tzIHNpemUgb2YgYSBzaW5nbGUgbG9nIEVudHJ5OiB0eXBlLCBsZW5ndGgsIGRhdGEgcG9pbnRlciBhbmQgZW5kaW5nCi0gICAgdWludDhfdCB0ZW1wW0VudHJ5OjprTWF4TGVuZ3RoICsgRW50cnk6OmtPdmVyaGVhZF07Ci0gICAgLy8gd3JpdGUgdGhpcyBkYXRhIHRvIHRlbXAgYXJyYXkKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5lZWQ7IGkrKykgewotICAgICAgICB0ZW1wW2ldID0gZXRyLT5jb3B5RW50cnlEYXRhQXQoaSk7Ci0gICAgfQotICAgIC8vIHdyaXRlIHRvIGNpcmN1bGFyIGJ1ZmZlcgotICAgIG1GaWZvV3JpdGVyLT53cml0ZSh0ZW1wLCBuZWVkKTsKLX0KLQotYm9vbCBOQkxvZzo6V3JpdGVyOjppc0VuYWJsZWQoKSBjb25zdAotewotICAgIHJldHVybiBtRW5hYmxlZDsKLX0KLQotYm9vbCBOQkxvZzo6V3JpdGVyOjpzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkKLXsKLSAgICBib29sIG9sZCA9IG1FbmFibGVkOwotICAgIG1FbmFibGVkID0gZW5hYmxlZCAmJiBtU2hhcmVkICE9IE5VTEw7Ci0gICAgcmV0dXJuIG9sZDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU5CTG9nOjpMb2NrZWRXcml0ZXI6OkxvY2tlZFdyaXRlcigpCi0gICAgOiBXcml0ZXIoKQotewotfQotCi1OQkxvZzo6TG9ja2VkV3JpdGVyOjpMb2NrZWRXcml0ZXIodm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSkKLSAgICA6IFdyaXRlcihzaGFyZWQsIHNpemUpCi17Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nKGNvbnN0IGNoYXIgKnN0cmluZykKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nKHN0cmluZyk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nZihjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLSAgICAvLyBGSVhNRSBzaG91bGQgbm90IHRha2UgdGhlIGxvY2sgdW50aWwgYWZ0ZXIgZm9ybWF0dGluZyBpcyBkb25lCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICB2YV9saXN0IGFwOwotICAgIHZhX3N0YXJ0KGFwLCBmbXQpOwotICAgIFdyaXRlcjo6bG9ndmYoZm10LCBhcCk7Ci0gICAgdmFfZW5kKGFwKTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2d2Zihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCi17Ci0gICAgLy8gRklYTUUgc2hvdWxkIG5vdCB0YWtlIHRoZSBsb2NrIHVudGlsIGFmdGVyIGZvcm1hdHRpbmcgaXMgZG9uZQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2d2ZihmbXQsIGFwKTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dUaW1lc3RhbXAoKQotewotICAgIC8vIEZJWE1FIHNob3VsZCBub3QgdGFrZSB0aGUgbG9jayB1bnRpbCBhZnRlciB0aGUgY2xvY2tfZ2V0dGltZSgpIHN5c2NhbGwKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nVGltZXN0YW1wKCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nVGltZXN0YW1wKGNvbnN0IGludDY0X3QgdHMpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ1RpbWVzdGFtcCh0cyk7Ci19Ci0KLXZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nSW50ZWdlcihjb25zdCBpbnQgeCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nSW50ZWdlcih4KTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dGbG9hdChjb25zdCBmbG9hdCB4KQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2dGbG9hdCh4KTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dQSUQoKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2dQSUQoKTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dTdGFydChjb25zdCBjaGFyICpmbXQpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ1N0YXJ0KGZtdCk7Ci19Ci0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dFbmQoKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2dFbmQoKTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dIYXNoKGxvZ19oYXNoX3QgaGFzaCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nSGFzaChoYXNoKTsKLX0KLQotYm9vbCBOQkxvZzo6TG9ja2VkV3JpdGVyOjppc0VuYWJsZWQoKSBjb25zdAotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIFdyaXRlcjo6aXNFbmFibGVkKCk7Ci19Ci0KLWJvb2wgTkJMb2c6OkxvY2tlZFdyaXRlcjo6c2V0RW5hYmxlZChib29sIGVuYWJsZWQpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gV3JpdGVyOjpzZXRFbmFibGVkKGVuYWJsZWQpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY29uc3Qgc3RkOjpzZXQ8TkJMb2c6OkV2ZW50PiBOQkxvZzo6UmVhZGVyOjpzdGFydGluZ1R5cGVzIHtOQkxvZzo6RXZlbnQ6OkVWRU5UX1NUQVJUX0ZNVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJMb2c6OkV2ZW50OjpFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFN9OwotY29uc3Qgc3RkOjpzZXQ8TkJMb2c6OkV2ZW50PiBOQkxvZzo6UmVhZGVyOjplbmRpbmdUeXBlcyAgIHtOQkxvZzo6RXZlbnQ6OkVWRU5UX0VORF9GTVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CTG9nOjpFdmVudDo6RVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQkxvZzo6RXZlbnQ6OkVWRU5UX0FVRElPX1NUQVRFfTsKLQotTkJMb2c6OlJlYWRlcjo6UmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpCi0gICAgOiBtU2hhcmVkKCgvKmNvbnN0Ki8gU2hhcmVkICopIHNoYXJlZCksIC8qbUlNZW1vcnkqLwotICAgICAgbUZkKC0xKSwgbUluZGVudCgwKSwKLSAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/Ci0gICAgICAgIG5ldyBhdWRpb191dGlsc19maWZvKHNpemUsIHNpemVvZih1aW50OF90KSwKLSAgICAgICAgICAgIG1TaGFyZWQtPm1CdWZmZXIsIG1TaGFyZWQtPm1SZWFyLCBOVUxMIC8qdGhyb3R0bGVzRnJvbnQqLykgOiBOVUxMKSwKLSAgICAgIG1GaWZvUmVhZGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIoKm1GaWZvKSA6IE5VTEwpCi17Ci19Ci0KLU5CTG9nOjpSZWFkZXI6OlJlYWRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUpCi0gICAgOiBSZWFkZXIoaU1lbW9yeSAhPSAwID8gKFNoYXJlZCAqKSBpTWVtb3J5LT5wb2ludGVyKCkgOiBOVUxMLCBzaXplKQotewotICAgIG1JTWVtb3J5ID0gaU1lbW9yeTsKLX0KLQotTkJMb2c6OlJlYWRlcjo6flJlYWRlcigpCi17Ci0gICAgZGVsZXRlIG1GaWZvUmVhZGVyOwotICAgIGRlbGV0ZSBtRmlmbzsKLX0KLQotY29uc3QgdWludDhfdCAqTkJMb2c6OlJlYWRlcjo6ZmluZExhc3RFbnRyeU9mVHlwZXMoY29uc3QgdWludDhfdCAqZnJvbnQsIGNvbnN0IHVpbnQ4X3QgKmJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PEV2ZW50PiAmdHlwZXMpIHsKLSAgICB3aGlsZSAoYmFjayArIEVudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXQgPj0gZnJvbnQpIHsKLSAgICAgICAgY29uc3QgdWludDhfdCAqcHJldiA9IGJhY2sgLSBiYWNrW0VudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXRdIC0gRW50cnk6OmtPdmVyaGVhZDsKLSAgICAgICAgaWYgKHByZXYgPCBmcm9udCB8fCBwcmV2ICsgcHJldltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudHJ5OjprT3ZlcmhlYWQgIT0gYmFjaykgewotCi0gICAgICAgICAgICAvLyBwcmV2IHBvaW50cyB0byBhbiBvdXQgb2YgbGltaXRzIG9yIGluY29uc2lzdGVudCBlbnRyeQotICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHR5cGVzLmZpbmQoKGNvbnN0IEV2ZW50KSBwcmV2W29mZnNldG9mKGVudHJ5LCB0eXBlKV0pICE9IHR5cGVzLmVuZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJldjsKLSAgICAgICAgfQotICAgICAgICBiYWNrID0gcHJldjsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGxwdHI7IC8vIG5vIGVudHJ5IGZvdW5kCi19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxOQkxvZzo6UmVhZGVyOjpTbmFwc2hvdD4gTkJMb2c6OlJlYWRlcjo6Z2V0U25hcHNob3QoKQotewotICAgIGlmIChtRmlmb1JlYWRlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8TkJMb2c6OlJlYWRlcjo6U25hcHNob3Q+KG5ldyBTbmFwc2hvdCgpKTsKLSAgICB9Ci0gICAgLy8gbWFrZSBhIGNvcHkgdG8gYXZvaWQgcmFjZSBjb25kaXRpb24gd2l0aCB3cml0ZXIKLSAgICBzaXplX3QgY2FwYWNpdHkgPSBtRmlmby0+Y2FwYWNpdHkoKTsKLQotICAgIC8vIFRoaXMgZW11bGF0ZXMgdGhlIGJlaGF2aW91ciBvZiBhdWRpb191dGlsc19maWZvX3JlYWRlcjo6cmVhZCwgYnV0IHdpdGhvdXQgaW5jcmVtZW50aW5nIHRoZQotICAgIC8vIHJlYWRlciBpbmRleC4gVGhlIGluZGV4IGlzIGluY3JlbWVudGVkIGFmdGVyIGhhbmRsaW5nIGNvcnJ1cHRpb24sIHRvIGFmdGVyIHRoZSBsYXN0IGNvbXBsZXRlCi0gICAgLy8gZW50cnkgb2YgdGhlIGJ1ZmZlcgotICAgIHNpemVfdCBsb3N0OwotICAgIGF1ZGlvX3V0aWxzX2lvdmVjIGlvdmVjWzJdOwotICAgIHNzaXplX3QgYXZhaWxUb1JlYWQgPSBtRmlmb1JlYWRlci0+b2J0YWluKGlvdmVjLCBjYXBhY2l0eSwgTlVMTCAvKnRpbWVvdXQqLywgJmxvc3QpOwotICAgIGlmIChhdmFpbFRvUmVhZCA8PSAwKSB7Ci0gICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8TkJMb2c6OlJlYWRlcjo6U25hcHNob3Q+KG5ldyBTbmFwc2hvdCgpKTsKLSAgICB9Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IHNuYXBzaG90KG5ldyBTbmFwc2hvdChhdmFpbFRvUmVhZCkpOwotICAgIG1lbWNweShzbmFwc2hvdC0+bURhdGEsIChjb25zdCBjaGFyICopIG1GaWZvLT5idWZmZXIoKSArIGlvdmVjWzBdLm1PZmZzZXQsIGlvdmVjWzBdLm1MZW5ndGgpOwotICAgIGlmIChpb3ZlY1sxXS5tTGVuZ3RoID4gMCkgewotICAgICAgICBtZW1jcHkoc25hcHNob3QtPm1EYXRhICsgKGlvdmVjWzBdLm1MZW5ndGgpLAotICAgICAgICAgICAgKGNvbnN0IGNoYXIgKikgbUZpZm8tPmJ1ZmZlcigpICsgaW92ZWNbMV0ubU9mZnNldCwgaW92ZWNbMV0ubUxlbmd0aCk7Ci0gICAgfQotCi0gICAgLy8gSGFuZGxlIGNvcnJ1cHRlZCBidWZmZXIKLSAgICAvLyBQb3RlbnRpYWxseSwgYSBidWZmZXIgaGFzIGNvcnJ1cHRlZCBkYXRhIG9uIGJvdGggYmVnaW5uaW5nIChkdWUgdG8gb3ZlcmZsb3cpIGFuZCBlbmQKLSAgICAvLyAoZHVlIHRvIGluY29tcGxldGUgZm9ybWF0IGVudHJ5KS4gQnV0IGV2ZW4gaWYgdGhlIGVuZCBmb3JtYXQgZW50cnkgaXMgaW5jb21wbGV0ZSwKLSAgICAvLyBpdCBlbmRzIGluIGEgY29tcGxldGUgZW50cnkgKHdoaWNoIGlzIG5vdCBhbiBFTkRfRk1UKS4gU28gaXMgc2FmZSB0byB0cmF2ZXJzZSBiYWNrd2FyZHMuCi0gICAgLy8gVE9ETzogaGFuZGxlIGNsaWVudCBjb3JydXB0aW9uIChpbiB0aGUgbWlkZGxlIG9mIGEgYnVmZmVyKQotCi0gICAgY29uc3QgdWludDhfdCAqYmFjayA9IHNuYXBzaG90LT5tRGF0YSArIGF2YWlsVG9SZWFkOwotICAgIGNvbnN0IHVpbnQ4X3QgKmZyb250ID0gc25hcHNob3QtPm1EYXRhOwotCi0gICAgLy8gRmluZCBsYXN0IEVORF9GTVQuIDxiYWNrPiBpcyBzaXR0aW5nIG9uIGFuIGVudHJ5IHdoaWNoIG1pZ2h0IGJlIHRoZSBtaWRkbGUgb2YgYSBGb3JtYXRFbnRyeS4KLSAgICAvLyBXZSBnbyBiYWNrd2FyZHMgdW50aWwgd2UgZmluZCBhbiBFVkVOVF9FTkRfRk1ULgotICAgIGNvbnN0IHVpbnQ4X3QgKmxhc3RFbmQgPSBmaW5kTGFzdEVudHJ5T2ZUeXBlcyhmcm9udCwgYmFjaywgZW5kaW5nVHlwZXMpOwotICAgIGlmIChsYXN0RW5kID09IG51bGxwdHIpIHsKLSAgICAgICAgc25hcHNob3QtPm1FbmQgPSBzbmFwc2hvdC0+bUJlZ2luID0gRW50cnlJdGVyYXRvcihmcm9udCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gZW5kIG9mIHNuYXBzaG90IHBvaW50cyB0byBhZnRlciBsYXN0IEVORF9GTVQgZW50cnkKLSAgICAgICAgc25hcHNob3QtPm1FbmQgPSBFbnRyeUl0ZXJhdG9yKGxhc3RFbmQpLm5leHQoKTsKLSAgICAgICAgLy8gZmluZCBmaXJzdCBTVEFSVF9GTVQKLSAgICAgICAgY29uc3QgdWludDhfdCAqZmlyc3RTdGFydCA9IG51bGxwdHI7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZpcnN0U3RhcnRUbXAgPSBzbmFwc2hvdC0+bUVuZDsKLSAgICAgICAgd2hpbGUgKChmaXJzdFN0YXJ0VG1wID0gZmluZExhc3RFbnRyeU9mVHlwZXMoZnJvbnQsIGZpcnN0U3RhcnRUbXAsIHN0YXJ0aW5nVHlwZXMpKQotICAgICAgICAgICAgICAgICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGZpcnN0U3RhcnQgPSBmaXJzdFN0YXJ0VG1wOwotICAgICAgICB9Ci0gICAgICAgIC8vIGZpcnN0U3RhcnQgaXMgbnVsbCBpZiBubyBTVEFSVF9GTVQgZW50cnkgd2FzIGZvdW5kIGJlZm9yZSBsYXN0RW5kCi0gICAgICAgIGlmIChmaXJzdFN0YXJ0ID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHNuYXBzaG90LT5tQmVnaW4gPSBzbmFwc2hvdC0+bUVuZDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNuYXBzaG90LT5tQmVnaW4gPSBFbnRyeUl0ZXJhdG9yKGZpcnN0U3RhcnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gYWR2YW5jZSBmaWZvIHJlYWRlciBpbmRleCB0byBhZnRlciBsYXN0IGVudHJ5IHJlYWQuCi0gICAgbUZpZm9SZWFkZXItPnJlbGVhc2Uoc25hcHNob3QtPm1FbmQgLSBmcm9udCk7Ci0KLSAgICBzbmFwc2hvdC0+bUxvc3QgPSBsb3N0OwotICAgIHJldHVybiBzbmFwc2hvdDsKLQotfQotCi0vLyBUT0RPOiBtb3ZlIHRoaXMgdG8gUGVyZm9ybWFuY2VBbmFseXNpcwotLy8gVE9ETzogbWFrZSBjYWxsIHRvIGR1bXAgcGVyaW9kaWMgc28gdGhhdCBkYXRhIGluIHNoYXJlZCBGSUZPIGRvZXMgbm90IGdldCBvdmVyd3JpdHRlbgotdm9pZCBOQkxvZzo6UmVhZGVyOjpkdW1wKGludCBmZCwgc2l6ZV90IGluZGVudCwgTkJMb2c6OlJlYWRlcjo6U25hcHNob3QgJnNuYXBzaG90KQotewotICAgIG1GZCA9IGZkOwotICAgIG1JbmRlbnQgPSBpbmRlbnQ7Ci0gICAgU3RyaW5nOCB0aW1lc3RhbXAsIGJvZHk7Ci0gICAgLy8gRklYTUU6IHRoaXMgaXMgbm90IHRocmVhZCBzYWZlCi0gICAgLy8gVE9ETzogbmVlZCBhIHNlcGFyYXRlIGluc3RhbmNlIG9mIHBlcmZvcm1hbmNlQW5hbHlzaXMgZm9yIGVhY2ggdGhyZWFkCi0gICAgLy8gdXNlZCB0byBzdG9yZSBkYXRhIGFuZCB0byBjYWxsIGFuYWx5c2lzIGZ1bmN0aW9ucwotICAgIHN0YXRpYyBSZXBvcnRQZXJmb3JtYW5jZTo6UGVyZm9ybWFuY2VBbmFseXNpcyBwZXJmb3JtYW5jZUFuYWx5c2lzOwotICAgIHNpemVfdCBsb3N0ID0gc25hcHNob3QubG9zdCgpICsgKHNuYXBzaG90LmJlZ2luKCkgLSBFbnRyeUl0ZXJhdG9yKHNuYXBzaG90LmRhdGEoKSkpOwotICAgIGlmIChsb3N0ID4gMCkgewotICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgid2FybmluZzogbG9zdCAlenUgYnl0ZXMgd29ydGggb2YgZXZlbnRzIiwgbG9zdCk7Ci0gICAgICAgIC8vIFRPRE8gdGltZXN0YW1wIGVtcHR5IGhlcmUsIG9ubHkgb3RoZXIgY2hvaWNlIHRvIHdhaXQgZm9yIHRoZSBmaXJzdCB0aW1lc3RhbXAgZXZlbnQgaW4gdGhlCi0gICAgICAgIC8vICAgICAgbG9nIHRvIHB1c2ggaXQgb3V0LiAgQ29uc2lkZXIga2VlcGluZyB0aGUgdGltZXN0YW1wL2JvZHkgYmV0d2VlbiBjYWxscyB0byBjb3B5RW50cnlEYXRhQXQoKS4KLSAgICAgICAgZHVtcExpbmUodGltZXN0YW1wLCBib2R5KTsKLSAgICB9Ci0KLSAgICBmb3IgKGF1dG8gZW50cnkgPSBzbmFwc2hvdC5iZWdpbigpOyBlbnRyeSAhPSBzbmFwc2hvdC5lbmQoKTspIHsKLSAgICAgICAgc3dpdGNoIChlbnRyeS0+dHlwZSkgewotICAgICAgICBjYXNlIEVWRU5UX1NUQVJUX0ZNVDoKLSAgICAgICAgICAgIGVudHJ5ID0gaGFuZGxlRm9ybWF0KEZvcm1hdEVudHJ5KGVudHJ5KSwgJnRpbWVzdGFtcCwgJmJvZHkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTOiB7Ci0gICAgICAgICAgICBIaXN0VHNFbnRyeVdpdGhBdXRob3IgKmRhdGEgPSAoSGlzdFRzRW50cnlXaXRoQXV0aG9yICopIChlbnRyeS0+ZGF0YSk7Ci0gICAgICAgICAgICAvLyBUT0RPIFRoaXMgbWVtY3BpZXMgYXJlIGhlcmUgdG8gYXZvaWQgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3MgY3Jhc2guCi0gICAgICAgICAgICAvLyBUaGVyZSdzIHByb2JhYmx5IGEgbW9yZSBlZmZpY2llbnQgd2F5IHRvIGRvIGl0Ci0gICAgICAgICAgICBsb2dfaGFzaF90IGhhc2g7Ci0gICAgICAgICAgICBtZW1jcHkoJmhhc2gsICYoZGF0YS0+aGFzaCksIHNpemVvZihoYXNoKSk7Ci0gICAgICAgICAgICBpbnQ2NF90IHRzOwotICAgICAgICAgICAgbWVtY3B5KCZ0cywgJmRhdGEtPnRzLCBzaXplb2YodHMpKTsKLSAgICAgICAgICAgIHBlcmZvcm1hbmNlQW5hbHlzaXMubG9nVHNFbnRyeSh0cyk7Ci0gICAgICAgICAgICArK2VudHJ5OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBFVkVOVF9BVURJT19TVEFURTogewotICAgICAgICAgICAgcGVyZm9ybWFuY2VBbmFseXNpcy5oYW5kbGVTdGF0ZUNoYW5nZSgpOwotICAgICAgICAgICAgKytlbnRyeTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRVZFTlRfRU5EX0ZNVDoKLSAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJ3YXJuaW5nOiBnb3QgdG8gZW5kIGZvcm1hdCBldmVudCIpOwotICAgICAgICAgICAgKytlbnRyeTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVWRU5UX1JFU0VSVkVEOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIndhcm5pbmc6IHVuZXhwZWN0ZWQgZXZlbnQgJWQiLCBlbnRyeS0+dHlwZSk7Ci0gICAgICAgICAgICArK2VudHJ5OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcGVyZm9ybWFuY2VBbmFseXNpcy5yZXBvcnRQZXJmb3JtYW5jZSgmYm9keSk7Ci0gICAgaWYgKCFib2R5LmlzRW1wdHkoKSkgewotICAgICAgICBkdW1wTGluZSh0aW1lc3RhbXAsIGJvZHkpOwotICAgIH0KLX0KLQotdm9pZCBOQkxvZzo6UmVhZGVyOjpkdW1wKGludCBmZCwgc2l6ZV90IGluZGVudCkKLXsKLSAgICAvLyBnZXQgYSBzbmFwc2hvdCwgZHVtcCBpdAotICAgIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4gc25hcCA9IGdldFNuYXBzaG90KCk7Ci0gICAgZHVtcChmZCwgaW5kZW50LCAqc25hcCk7Ci19Ci0KLXZvaWQgTkJMb2c6OlJlYWRlcjo6ZHVtcExpbmUoY29uc3QgU3RyaW5nOCAmdGltZXN0YW1wLCBTdHJpbmc4ICZib2R5KQotewotICAgIGlmIChtRmQgPj0gMCkgewotICAgICAgICBkcHJpbnRmKG1GZCwgIiUuKnMlcyAlc1xuIiwgbUluZGVudCwgIiIsIHRpbWVzdGFtcC5zdHJpbmcoKSwgYm9keS5zdHJpbmcoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0koIiUuKnMlcyAlcyIsIG1JbmRlbnQsICIiLCB0aW1lc3RhbXAuc3RyaW5nKCksIGJvZHkuc3RyaW5nKCkpOwotICAgIH0KLSAgICBib2R5LmNsZWFyKCk7Ci19Ci0KLWJvb2wgTkJMb2c6OlJlYWRlcjo6aXNJTWVtb3J5KGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5KSBjb25zdAotewotICAgIHJldHVybiBpTWVtb3J5ICE9IDAgJiYgbUlNZW1vcnkgIT0gMCAmJiBpTWVtb3J5LT5wb2ludGVyKCkgPT0gbUlNZW1vcnktPnBvaW50ZXIoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgTkJMb2c6OmFwcGVuZFRpbWVzdGFtcChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKSB7Ci0gICAgaW50NjRfdCB0czsKLSAgICBtZW1jcHkoJnRzLCBkYXRhLCBzaXplb2YodHMpKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlslZC4lMDNkXSIsIChpbnQpICh0cyAvICgxMDAwICogMTAwMCAqIDEwMDApKSwKLSAgICAgICAgICAgICAgICAgICAgKGludCkgKCh0cyAvICgxMDAwICogMTAwMCkpICUgMTAwMCkpOwotfQotCi12b2lkIE5CTG9nOjphcHBlbmRJbnQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSkgewotICAgIGludCB4ID0gKigoaW50KikgZGF0YSk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCI8JWQ+IiwgeCk7Ci19Ci0KLXZvaWQgTkJMb2c6OmFwcGVuZEZsb2F0KFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpIHsKLSAgICBmbG9hdCBmOwotICAgIG1lbWNweSgmZiwgZGF0YSwgc2l6ZW9mKGZsb2F0KSk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCI8JWY+IiwgZik7Ci19Ci0KLXZvaWQgTkJMb2c6OmFwcGVuZFBJRChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3QgbGVuZ3RoKSB7Ci0gICAgcGlkX3QgaWQgPSAqKChwaWRfdCopIGRhdGEpOwotICAgIGNoYXIgKiBuYW1lID0gJigoY2hhciopIGRhdGEpW3NpemVvZihwaWRfdCldOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiPFBJRDogJWQsIG5hbWU6ICUuKnM+IiwgaWQsIChpbnQpIChsZW5ndGggLSBzaXplb2YocGlkX3QpKSwgbmFtZSk7Ci19Ci0KLVN0cmluZzggTkJMb2c6OmJ1ZmZlckR1bXAoY29uc3QgdWludDhfdCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKLXsKLSAgICBTdHJpbmc4IHN0cjsKLSAgICBzdHIuYXBwZW5kKCJbICIpOwotICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgICBzdHIuYXBwZW5kRm9ybWF0KCIlZCAiLCBidWZmZXJbaV0pOwotICAgIH0KLSAgICBzdHIuYXBwZW5kKCJdIik7Ci0gICAgcmV0dXJuIHN0cjsKLX0KLQotU3RyaW5nOCBOQkxvZzo6YnVmZmVyRHVtcChjb25zdCBFbnRyeUl0ZXJhdG9yICZpdCkKLXsKLSAgICByZXR1cm4gYnVmZmVyRHVtcChpdCwgaXQtPmxlbmd0aCArIEVudHJ5OjprT3ZlcmhlYWQpOwotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6UmVhZGVyOjpoYW5kbGVGb3JtYXQoY29uc3QgRm9ybWF0RW50cnkgJmZtdEVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCAqdGltZXN0YW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCAqYm9keSkgewotICAgIC8vIGxvZyB0aW1lc3RhbXAKLSAgICBpbnQ2NF90IHRzID0gZm10RW50cnkudGltZXN0YW1wKCk7Ci0gICAgdGltZXN0YW1wLT5jbGVhcigpOwotICAgIHRpbWVzdGFtcC0+YXBwZW5kRm9ybWF0KCJbJWQuJTAzZF0iLCAoaW50KSAodHMgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKSksCi0gICAgICAgICAgICAgICAgICAgIChpbnQpICgodHMgLyAoMTAwMCAqIDEwMDApKSAlIDEwMDApKTsKLQotICAgIC8vIGxvZyB1bmlxdWUgaGFzaAotICAgIGxvZ19oYXNoX3QgaGFzaCA9IGZtdEVudHJ5Lmhhc2goKTsKLSAgICAvLyBwcmludCBvbmx5IGxvd2VyIDE2Yml0IG9mIGhhc2ggYXMgaGV4IGFuZCBsaW5lIGFzIGludCB0byByZWR1Y2Ugc3BhbSBpbiB0aGUgbG9nCi0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLjRYLSVkICIsIChpbnQpKGhhc2ggPj4gMTYpICYgMHhGRkZGLCAoaW50KSBoYXNoICYgMHhGRkZGKTsKLQotICAgIC8vIGxvZyBhdXRob3IgKGlmIHByZXNlbnQpCi0gICAgaGFuZGxlQXV0aG9yKGZtdEVudHJ5LCBib2R5KTsKLQotICAgIC8vIGxvZyBzdHJpbmcKLSAgICBOQkxvZzo6RW50cnlJdGVyYXRvciBhcmcgPSBmbXRFbnRyeS5hcmdzKCk7Ci0KLSAgICBjb25zdCBjaGFyKiBmbXQgPSBmbXRFbnRyeS5mb3JtYXRTdHJpbmcoKTsKLSAgICBzaXplX3QgZm10X2xlbmd0aCA9IGZtdEVudHJ5LmZvcm1hdFN0cmluZ0xlbmd0aCgpOwotCi0gICAgZm9yIChzaXplX3QgZm10X29mZnNldCA9IDA7IGZtdF9vZmZzZXQgPCBmbXRfbGVuZ3RoOyArK2ZtdF9vZmZzZXQpIHsKLSAgICAgICAgaWYgKGZtdFtmbXRfb2Zmc2V0XSAhPSAnJScpIHsKLSAgICAgICAgICAgIGJvZHktPmFwcGVuZCgmZm10W2ZtdF9vZmZzZXRdLCAxKTsgLy8gVE9ETyBvcHRpbWl6ZSB0byB3cml0ZSBjb25zZWN1dGl2ZSBzdHJpbmdzIGF0IG9uY2UKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNhc2UgIiUlIiIKLSAgICAgICAgaWYgKGZtdFsrK2ZtdF9vZmZzZXRdID09ICclJykgewotICAgICAgICAgICAgYm9keS0+YXBwZW5kKCIlIik7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBjYXNlICIlXDAiCi0gICAgICAgIGlmIChmbXRfb2Zmc2V0ID09IGZtdF9sZW5ndGgpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgTkJMb2c6OkV2ZW50IGV2ZW50ID0gKE5CTG9nOjpFdmVudCkgYXJnLT50eXBlOwotICAgICAgICBzaXplX3QgbGVuZ3RoID0gYXJnLT5sZW5ndGg7Ci0KLSAgICAgICAgLy8gVE9ETyBjaGVjayBsZW5ndGggZm9yIGV2ZW50IHR5cGUgaXMgY29ycmVjdAotCi0gICAgICAgIGlmIChldmVudCA9PSBFVkVOVF9FTkRfRk1UKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCBtb3JlIGNvbXBsZXggZm9ybWF0dGluZyBzdWNoIGFzICUuM2YKLSAgICAgICAgY29uc3QgdWludDhfdCAqZGF0dW0gPSBhcmctPmRhdGE7IC8vIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZXZlbnQgYXJncwotICAgICAgICBzd2l0Y2goZm10W2ZtdF9vZmZzZXRdKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgJ3MnOiAvLyBzdHJpbmcKLSAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX1NUUklORywKLSAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3Igc3RyaW5nIHNwZWNpZmllcjogJWQiLCBldmVudCk7Ci0gICAgICAgICAgICBib2R5LT5hcHBlbmQoKGNvbnN0IGNoYXIqKSBkYXR1bSwgbGVuZ3RoKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ3QnOiAvLyB0aW1lc3RhbXAKLSAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX1RJTUVTVEFNUCwKLSAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3IgdGltZXN0YW1wIHNwZWNpZmllcjogJWQiLCBldmVudCk7Ci0gICAgICAgICAgICBhcHBlbmRUaW1lc3RhbXAoYm9keSwgZGF0dW0pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnZCc6IC8vIGludGVnZXIKLSAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX0lOVEVHRVIsCi0gICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIGludGVnZXIgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKLSAgICAgICAgICAgIGFwcGVuZEludChib2R5LCBkYXR1bSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdmJzogLy8gZmxvYXQKLSAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX0ZMT0FULAotICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciBmbG9hdCBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOwotICAgICAgICAgICAgYXBwZW5kRmxvYXQoYm9keSwgZGF0dW0pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAncCc6IC8vIHBpZAotICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfUElELAotICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciBwaWQgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKLSAgICAgICAgICAgIGFwcGVuZFBJRChib2R5LCBkYXR1bSwgbGVuZ3RoKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVygiTkJMb2cgUmVhZGVyIGVuY291bnRlcmVkIHVua25vd24gY2hhcmFjdGVyICVjIiwgZm10W2ZtdF9vZmZzZXRdKTsKLSAgICAgICAgfQotICAgICAgICArK2FyZzsKLSAgICB9Ci0gICAgQUxPR1dfSUYoYXJnLT50eXBlICE9IEVWRU5UX0VORF9GTVQsICJFeHBlY3RlZCBlbmQgb2YgZm9ybWF0LCBnb3QgJWQiLCBhcmctPnR5cGUpOwotICAgICsrYXJnOwotICAgIHJldHVybiBhcmc7Ci19Ci0KLU5CTG9nOjpNZXJnZXI6Ok1lcmdlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKToKLSAgICAgIG1TaGFyZWQoKFNoYXJlZCAqKSBzaGFyZWQpLAotICAgICAgbUZpZm8obVNoYXJlZCAhPSBOVUxMID8KLSAgICAgICAgbmV3IGF1ZGlvX3V0aWxzX2ZpZm8oc2l6ZSwgc2l6ZW9mKHVpbnQ4X3QpLAotICAgICAgICAgICAgbVNoYXJlZC0+bUJ1ZmZlciwgbVNoYXJlZC0+bVJlYXIsIE5VTEwgLyp0aHJvdHRsZXNGcm9udCovKSA6IE5VTEwpLAotICAgICAgbUZpZm9Xcml0ZXIobUZpZm8gIT0gTlVMTCA/IG5ldyBhdWRpb191dGlsc19maWZvX3dyaXRlcigqbUZpZm8pIDogTlVMTCkKLSAgICAgIHt9Ci0KLXZvaWQgTkJMb2c6Ok1lcmdlcjo6YWRkUmVhZGVyKGNvbnN0IE5CTG9nOjpOYW1lZFJlYWRlciAmcmVhZGVyKSB7Ci0gICAgLy8gRklYTUUgVGhpcyBpcyBjYWxsZWQgYnkgYmluZGVyIHRocmVhZCBpbiBNZWRpYUxvZ1NlcnZpY2U6OnJlZ2lzdGVyV3JpdGVyCi0gICAgLy8gICAgICAgYnV0IHRoZSBhY2Nlc3MgdG8gc2hhcmVkIHZhcmlhYmxlIG1OYW1lZFJlYWRlcnMgaXMgbm90IHlldCBwcm90ZWN0ZWQgYnkgYSBsb2NrLgotICAgIG1OYW1lZFJlYWRlcnMucHVzaF9iYWNrKHJlYWRlcik7Ci19Ci0KLS8vIGl0ZW1zIHBsYWNlZCBpbiBwcmlvcml0eSBxdWV1ZSBkdXJpbmcgbWVyZ2UKLS8vIGNvbXBvc2VkIGJ5IGEgdGltZXN0YW1wIGFuZCB0aGUgaW5kZXggb2YgdGhlIHNuYXBzaG90IHdoZXJlIHRoZSB0aW1lc3RhbXAgY2FtZSBmcm9tCi1zdHJ1Y3QgTWVyZ2VJdGVtCi17Ci0gICAgaW50NjRfdCB0czsKLSAgICBpbnQgaW5kZXg7Ci0gICAgTWVyZ2VJdGVtKGludDY0X3QgdHMsIGludCBpbmRleCk6IHRzKHRzKSwgaW5kZXgoaW5kZXgpIHt9Ci19OwotCi0vLyBvcGVyYXRvcnMgbmVlZGVkIGZvciBwcmlvcml0eSBxdWV1ZSBpbiBtZXJnZQotLy8gYm9vbCBvcGVyYXRvcj4oY29uc3QgaW50NjRfdCAmdDEsIGNvbnN0IGludDY0X3QgJnQyKSB7Ci0vLyAgICAgcmV0dXJuIHQxLnR2X3NlYyA+IHQyLnR2X3NlYyB8fCAodDEudHZfc2VjID09IHQyLnR2X3NlYyAmJiB0MS50dl9uc2VjID4gdDIudHZfbnNlYyk7Ci0vLyB9Ci0KLWJvb2wgb3BlcmF0b3I+KGNvbnN0IHN0cnVjdCBNZXJnZUl0ZW0gJmkxLCBjb25zdCBzdHJ1Y3QgTWVyZ2VJdGVtICZpMikgewotICAgIHJldHVybiBpMS50cyA+IGkyLnRzIHx8IChpMS50cyA9PSBpMi50cyAmJiBpMS5pbmRleCA+IGkyLmluZGV4KTsKLX0KLQotLy8gTWVyZ2UgcmVnaXN0ZXJlZCByZWFkZXJzLCBzb3J0ZWQgYnkgdGltZXN0YW1wCi12b2lkIE5CTG9nOjpNZXJnZXI6Om1lcmdlKCkgewotICAgIC8vIEZJWE1FIFRoaXMgaXMgY2FsbGVkIGJ5IG1lcmdlIHRocmVhZAotICAgIC8vICAgICAgIGJ1dCB0aGUgYWNjZXNzIHRvIHNoYXJlZCB2YXJpYWJsZSBtTmFtZWRSZWFkZXJzIGlzIG5vdCB5ZXQgcHJvdGVjdGVkIGJ5IGEgbG9jay4KLSAgICBpbnQgbkxvZ3MgPSBtTmFtZWRSZWFkZXJzLnNpemUoKTsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8TkJMb2c6OlJlYWRlcjo6U25hcHNob3Q+PiBzbmFwc2hvdHMobkxvZ3MpOwotICAgIHN0ZDo6dmVjdG9yPE5CTG9nOjpFbnRyeUl0ZXJhdG9yPiBvZmZzZXRzKG5Mb2dzKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Mb2dzOyArK2kpIHsKLSAgICAgICAgc25hcHNob3RzW2ldID0gbU5hbWVkUmVhZGVyc1tpXS5yZWFkZXIoKS0+Z2V0U25hcHNob3QoKTsKLSAgICAgICAgb2Zmc2V0c1tpXSA9IHNuYXBzaG90c1tpXS0+YmVnaW4oKTsKLSAgICB9Ci0gICAgLy8gaW5pdGlhbGl6ZSBvZmZzZXRzCi0gICAgLy8gVE9ETyBjdXN0b20gaGVhcCBpbXBsZW1lbnRhdGlvbiBjb3VsZCBhbGxvdyB0byB1cGRhdGUgdG9wLCBpbXByb3ZpbmcgcGVyZm9ybWFuY2UKLSAgICAvLyBmb3IgYnVyc3R5IGJ1ZmZlcnMKLSAgICBzdGQ6OnByaW9yaXR5X3F1ZXVlPE1lcmdlSXRlbSwgc3RkOjp2ZWN0b3I8TWVyZ2VJdGVtPiwgc3RkOjpncmVhdGVyPE1lcmdlSXRlbT4+IHRpbWVzdGFtcHM7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTG9nczsgKytpKQotICAgIHsKLSAgICAgICAgaWYgKG9mZnNldHNbaV0gIT0gc25hcHNob3RzW2ldLT5lbmQoKSkgewotICAgICAgICAgICAgaW50NjRfdCB0cyA9IEFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkob2Zmc2V0c1tpXSktPnRpbWVzdGFtcCgpOwotICAgICAgICAgICAgdGltZXN0YW1wcy5lbXBsYWNlKHRzLCBpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHdoaWxlICghdGltZXN0YW1wcy5lbXB0eSgpKSB7Ci0gICAgICAgIC8vIGZpbmQgbWluaW11bSB0aW1lc3RhbXAKLSAgICAgICAgaW50IGluZGV4ID0gdGltZXN0YW1wcy50b3AoKS5pbmRleDsKLSAgICAgICAgLy8gY29weSBpdCB0byB0aGUgbG9nLCBpbmNyZWFzaW5nIG9mZnNldAotICAgICAgICBvZmZzZXRzW2luZGV4XSA9IEFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkob2Zmc2V0c1tpbmRleF0pLT5jb3B5V2l0aEF1dGhvcihtRmlmb1dyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotICAgICAgICAvLyB1cGRhdGUgZGF0YSBzdHJ1Y3R1cmVzCi0gICAgICAgIHRpbWVzdGFtcHMucG9wKCk7Ci0gICAgICAgIGlmIChvZmZzZXRzW2luZGV4XSAhPSBzbmFwc2hvdHNbaW5kZXhdLT5lbmQoKSkgewotICAgICAgICAgICAgaW50NjRfdCB0cyA9IEFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkob2Zmc2V0c1tpbmRleF0pLT50aW1lc3RhbXAoKTsKLSAgICAgICAgICAgIHRpbWVzdGFtcHMuZW1wbGFjZSh0cywgaW5kZXgpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1jb25zdCBzdGQ6OnZlY3RvcjxOQkxvZzo6TmFtZWRSZWFkZXI+JiBOQkxvZzo6TWVyZ2VyOjpnZXROYW1lZFJlYWRlcnMoKSBjb25zdCB7Ci0gICAgLy8gRklYTUUgVGhpcyBpcyByZXR1cm5pbmcgYSByZWZlcmVuY2UgdG8gYSBzaGFyZWQgdmFyaWFibGUgdGhhdCBuZWVkcyBhIGxvY2sKLSAgICByZXR1cm4gbU5hbWVkUmVhZGVyczsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU5CTG9nOjpNZXJnZVJlYWRlcjo6TWVyZ2VSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSwgTWVyZ2VyICZtZXJnZXIpCi0gICAgOiBSZWFkZXIoc2hhcmVkLCBzaXplKSwgbU5hbWVkUmVhZGVycyhtZXJnZXIuZ2V0TmFtZWRSZWFkZXJzKCkpIHt9Ci0KLXZvaWQgTkJMb2c6Ok1lcmdlUmVhZGVyOjpoYW5kbGVBdXRob3IoY29uc3QgTkJMb2c6OkFic3RyYWN0RW50cnkgJmVudHJ5LCBTdHJpbmc4ICpib2R5KSB7Ci0gICAgaW50IGF1dGhvciA9IGVudHJ5LmF1dGhvcigpOwotICAgIC8vIEZJWE1FIE5lZWRzIGEgbG9jawotICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBtTmFtZWRSZWFkZXJzW2F1dGhvcl0ubmFtZSgpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJXM6ICIsIG5hbWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTkJMb2c6Ok1lcmdlVGhyZWFkOjpNZXJnZVRocmVhZChOQkxvZzo6TWVyZ2VyICZtZXJnZXIpCi0gICAgOiBtTWVyZ2VyKG1lcmdlciksCi0gICAgICBtVGltZW91dFVzKDApIHt9Ci0KLU5CTG9nOjpNZXJnZVRocmVhZDo6fk1lcmdlVGhyZWFkKCkgewotICAgIC8vIHNldCBleGl0IGZsYWcsIHNldCB0aW1lb3V0IHRvIDAgdG8gZm9yY2UgdGhyZWFkTG9vcCB0byBleGl0IGFuZCB3YWl0IGZvciB0aGUgdGhyZWFkIHRvIGpvaW4KLSAgICByZXF1ZXN0RXhpdCgpOwotICAgIHNldFRpbWVvdXRVcygwKTsKLSAgICBqb2luKCk7Ci19Ci0KLWJvb2wgTkJMb2c6Ok1lcmdlVGhyZWFkOjp0aHJlYWRMb29wKCkgewotICAgIGJvb2wgZG9NZXJnZTsKLSAgICB7Ci0gICAgICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOwotICAgICAgICAvLyBJZiBtVGltZW91dFVzIGlzIG5lZ2F0aXZlLCB3YWl0IG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUgdW50aWwgaXQncyBwb3NpdGl2ZS4KLSAgICAgICAgLy8gSWYgaXQncyBwb3NpdGl2ZSwgd2FpdCBrVGhyZWFkU2xlZXBQZXJpb2RVcyBhbmQgdGhlbiBtZXJnZQotICAgICAgICBuc2Vjc190IHdhaXRUaW1lID0gbVRpbWVvdXRVcyA+IDAgPyBrVGhyZWFkU2xlZXBQZXJpb2RVcyAqIDEwMDAgOiBMTE9OR19NQVg7Ci0gICAgICAgIG1Db25kLndhaXRSZWxhdGl2ZShtTXV0ZXgsIHdhaXRUaW1lKTsKLSAgICAgICAgZG9NZXJnZSA9IG1UaW1lb3V0VXMgPiAwOwotICAgICAgICBtVGltZW91dFVzIC09IGtUaHJlYWRTbGVlcFBlcmlvZFVzOwotICAgIH0KLSAgICBpZiAoZG9NZXJnZSkgewotICAgICAgICBtTWVyZ2VyLm1lcmdlKCk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIE5CTG9nOjpNZXJnZVRocmVhZDo6d2FrZXVwKCkgewotICAgIHNldFRpbWVvdXRVcyhrVGhyZWFkV2FrZXVwUGVyaW9kVXMpOwotfQotCi12b2lkIE5CTG9nOjpNZXJnZVRocmVhZDo6c2V0VGltZW91dFVzKGludCB0aW1lKSB7Ci0gICAgQXV0b011dGV4IF9sKG1NdXRleCk7Ci0gICAgbVRpbWVvdXRVcyA9IHRpbWU7Ci0gICAgbUNvbmQuc2lnbmFsKCk7Ci19Ci0KLX0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vT1dORVJTIGIvbWVkaWEvbGlibmJhaW8vT1dORVJTCmluZGV4IGY5Y2I1NjcuLmVlY2U3MWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL09XTkVSUworKysgYi9tZWRpYS9saWJuYmFpby9PV05FUlMKQEAgLTEgKzEsMiBAQAogZ2thc3RlbkBnb29nbGUuY29tCitodW5nYUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9QZXJmb3JtYW5jZUFuYWx5c2lzLmNwcCBiL21lZGlhL2xpYm5iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjNiZGRjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm5iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLSNkZWZpbmUgTE9HX1RBRyAiUGVyZm9ybWFuY2VBbmFseXNpcyIKLS8vICNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8Y2xpbWl0cz4KLSNpbmNsdWRlIDxkZXF1ZT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8bnVtZXJpYz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8bmV3PgotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3JvdW5kdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkxvZy5oPgotI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmFpby9SZXBvcnRQZXJmb3JtYW5jZS5oPgotLy8gI2luY2x1ZGUgPHV0aWxzL0NhbGxTdGFjay5oPiAvLyB1c2VkIHRvIHByaW50IGNhbGxzdGFjawotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotI2luY2x1ZGUgPHF1ZXVlPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlIHsKLQotUGVyZm9ybWFuY2VBbmFseXNpczo6UGVyZm9ybWFuY2VBbmFseXNpcygpIHsKLSAgICAvLyBUaGVzZSB2YXJpYWJsZXMgd2lsbCBiZSAoRklYTUUpIGxlYXJuZWQgZnJvbSB0aGUgZGF0YQotICAgIGtQZXJpb2RNcyA9IDQ7IC8vIHR5cGljYWwgYnVmZmVyIHBlcmlvZCAobW9kZSkKLSAgICAvLyBhdmVyYWdlIG51bWJlciBvZiBNcyBzcGVudCBwcm9jZXNzaW5nIGJ1ZmZlcgotICAgIGtQZXJpb2RNc0NQVSA9IHN0YXRpY19jYXN0PGludD4oa1BlcmlvZE1zICoga1JhdGlvKTsKLX0KLQotLy8gY29udmVydHMgYSB0aW1lIHNlcmllcyBpbnRvIGEgbWFwLiBrZXk6IGJ1ZmZlciBwZXJpb2QgbGVuZ3RoLiB2YWx1ZTogY291bnQKLXN0YXRpYyBzdGQ6Om1hcDxpbnQsIGludD4gYnVpbGRCdWNrZXRzKGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICZzYW1wbGVzKSB7Ci0gICAgLy8gVE9ETyBhbGxvdyBidWNrZXRzIG9mIHZhcmlhYmxlIHJlc29sdXRpb24KLSAgICBzdGQ6Om1hcDxpbnQsIGludD4gYnVja2V0czsKLSAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IHNhbXBsZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgKytidWNrZXRzW2RlbHRhTXMoc2FtcGxlc1tpIC0gMV0sIHNhbXBsZXNbaV0pXTsKLSAgICB9Ci0gICAgcmV0dXJuIGJ1Y2tldHM7Ci19Ci0KLXN0YXRpYyBpbnQgd2lkdGhPZihpbnQgeCkgewotICAgIGludCB3aWR0aCA9IDA7Ci0gICAgd2hpbGUgKHggPiAwKSB7Ci0gICAgICAgICsrd2lkdGg7Ci0gICAgICAgIHggLz0gMTA7Ci0gICAgfQotICAgIHJldHVybiB3aWR0aDsKLX0KLQotLy8gR2l2ZW4gYSBzZXJpZXMgb2YgYXVkaW8gcHJvY2Vzc2luZyB3YWtldXAgdGltZXN0YW1wcywKLS8vIGJ1Y2tldHMgdGhlIHRpbWUgaW50ZXJ2YWxzIGludG8gYSBoaXN0b2dyYW0sIHNlYXJjaGVzIGZvcgotLy8gb3V0bGllcnMsIGFuYWx5emVzIHRoZSBvdXRsaWVyIHNlcmllcyBmb3IgdW5leHBlY3RlZGx5Ci0vLyBzbWFsbCBvciBsYXJnZSB2YWx1ZXMgYW5kIHN0b3JlcyB0aGVzZSBhcyBwZWFrcywgYW5kIGZsdXNoZXMKLS8vIHRoZSB0aW1lc3RhbXAgc2VyaWVzIGZyb20gbWVtb3J5Lgotdm9pZCBQZXJmb3JtYW5jZUFuYWx5c2lzOjpwcm9jZXNzQW5kRmx1c2hUaW1lU3RhbXBTZXJpZXMoKSB7Ci0gICAgLy8gMSkgYW5hbHl6ZSB0aGUgc2VyaWVzIHRvIHN0b3JlIGFsbCBvdXRsaWVycyBhbmQgdGhlaXIgZXhhY3QgdGltZXN0YW1wczoKLSAgICBzdG9yZU91dGxpZXJEYXRhKG1UaW1lU3RhbXBTZXJpZXMpOwotCi0gICAgLy8gMikgZGV0ZWN0IHBlYWtzIGluIHRoZSBvdXRsaWVyIHNlcmllcwotICAgIGRldGVjdFBlYWtzKCk7Ci0KLSAgICAvLyAzKSBjb21wdXRlIGl0cyBoaXN0b2dyYW0sIGFwcGVuZCB0byBtUmVjZW50SGlzdHMgYW5kIGNsZWFyIHRoZSB0aW1lIHNlcmllcwotICAgIG1SZWNlbnRIaXN0cy5lbXBsYWNlX2JhY2soc3RhdGljX2Nhc3Q8dGltZXN0YW1wPihtVGltZVN0YW1wU2VyaWVzWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkQnVja2V0cyhtVGltZVN0YW1wU2VyaWVzKSk7Ci0gICAgLy8gZG8gbm90IGxldCBtUmVjZW50SGlzdHMgZXhjZWVkIGNhcGFjaXR5Ci0gICAgLy8gQUxPR0QoIm1SZWNlbnRIaXN0cyBzaXplOiAlZCIsIHN0YXRpY19jYXN0PGludD4obVJlY2VudEhpc3RzLnNpemUoKSkpOwotICAgIGlmIChtUmVjZW50SGlzdHMuc2l6ZSgpID49IGtSZWNlbnRIaXN0c0NhcGFjaXR5KSB7Ci0gICAgICAgIC8vICBBTE9HRCgicG9wcGVkIGJhY2sgbVJlY2VudEhpc3RzIik7Ci0gICAgICAgIG1SZWNlbnRIaXN0cy5wb3BfZnJvbnQoKTsKLSAgICB9Ci0gICAgbVRpbWVTdGFtcFNlcmllcy5jbGVhcigpOwotfQotCi0vLyBmb3JjZXMgc2hvcnQtdGVybSBoaXN0b2dyYW0gc3RvcmFnZSB0byBhdm9pZCBhZGRpbmcgaWRsZSBhdWRpbyB0aW1lIGludGVydmFsCi0vLyB0byBidWZmZXIgcGVyaW9kIGRhdGEKLXZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6aGFuZGxlU3RhdGVDaGFuZ2UoKSB7Ci0gICAgQUxPR0QoImhhbmRsZVN0YXRlQ2hhbmdlIik7Ci0gICAgcHJvY2Vzc0FuZEZsdXNoVGltZVN0YW1wU2VyaWVzKCk7Ci0gICAgcmV0dXJuOwotfQotCi0vLyBUYWtlcyBhIHNpbmdsZSBidWZmZXIgcGVyaW9kIHRpbWVzdGFtcCBlbnRyeSBpbmZvcm1hdGlvbiBhbmQgc3RvcmVzIGl0IGluIGEKLS8vIHRlbXBvcmFyeSBzZXJpZXMgb2YgdGltZXN0YW1wcy4gT25jZSB0aGUgc2VyaWVzIGlzIGZ1bGwsIHRoZSBkYXRhIGlzIGFuYWx5emVkLAotLy8gc3RvcmVkLCBhbmQgZW1wdGllZC4KLXZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6bG9nVHNFbnRyeShpbnQ2NF90IHRzKSB7Ci0gICAgLy8gVE9ETyBtaWdodCB3YW50IHRvIGZpbHRlciBleGNlc3NpdmVseSBoaWdoIG91dGxpZXJzLCB3aGljaCBhcmUgdXN1YWxseSBjYXVzZWQKLSAgICAvLyBieSB0aGUgdGhyZWFkIGJlaW5nIGluYWN0aXZlLgotICAgIC8vIFN0b3JlIHRpbWUgc2VyaWVzIGRhdGEgZm9yIGVhY2ggcmVhZGVyIGluIG9yZGVyIHRvIGJ1Y2tldCBpdCBvbmNlIHRoZXJlCi0gICAgLy8gaXMgZW5vdWdoIGRhdGEuIFRoZW4sIHdyaXRlIHRvIHJlY2VudEhpc3RzIGFzIGEgaGlzdG9ncmFtLgotICAgIG1UaW1lU3RhbXBTZXJpZXMucHVzaF9iYWNrKHRzKTsKLSAgICAvLyBpZiBsZW5ndGggb2YgdGhlIHRpbWUgc2VyaWVzIGhhcyByZWFjaGVkIGtTaG9ydEhpc3RTaXplIHNhbXBsZXMsCi0gICAgLy8gYW5hbHl6ZSB0aGUgZGF0YSBhbmQgZmx1c2ggdGhlIHRpbWVzdGFtcCBzZXJpZXMgZnJvbSBtZW1vcnkKLSAgICBpZiAobVRpbWVTdGFtcFNlcmllcy5zaXplKCkgPj0ga1Nob3J0SGlzdFNpemUpIHsKLSAgICAgICAgcHJvY2Vzc0FuZEZsdXNoVGltZVN0YW1wU2VyaWVzKCk7Ci0gICAgfQotfQotCi0vLyBXaGVuIHRoZSBzaG9ydC10ZXJtIGhpc3RvZ3JhbSBhcnJheSBtUmVjZW50SGlzdHMgaGFzIHJlYWNoZWQgY2FwYWNpdHksCi0vLyBtZXJnZSBoaXN0b2dyYW1zIGZvciBkYXRhIGNvbXByZXNzaW9uIGFuZCBzdG9yZSB0aGVtIGluIG1Mb25nVGVybUhpc3RzCi0vLyBjbGVhcnMgbVJlY2VudEhpc3RzCi0vLyBUT0RPOiBoYXZlIGxvZ1RzRW50cnkgd3JpdGUgZGlyZWN0bHkgdG8gbUxvbmdUZXJtSGlzdHMsIGRpc2NhcmQgbVJlY2VudEhpc3RzLAotLy8gc3RhcnQgYSBuZXcgaGlzdG9ncmFtIHdoZW4gYSBwZWFrIG9jY3Vycwotdm9pZCBQZXJmb3JtYW5jZUFuYWx5c2lzOjpwcm9jZXNzQW5kRmx1c2hSZWNlbnRIaXN0cygpIHsKLQotICAgIC8vIEJ1Y2tldHMgaXMgdXNlZCB0byBhZ2dyZWdhdGUgc2hvcnQtdGVybSBoaXN0b2dyYW1zLgotICAgIEhpc3RvZ3JhbSBidWNrZXRzOwotICAgIHRpbWVzdGFtcCBzdGFydGluZ1RzID0gbVJlY2VudEhpc3RzWzBdLmZpcnN0OwotCi0gICAgZm9yIChjb25zdCBhdXRvICZzaG9ydEhpc3Q6IG1SZWNlbnRIaXN0cykgewotICAgICAgICAvLyBJZiB0aGUgdGltZSBiZXR3ZWVuIHN0YXJ0aW5nIGFuZCBlbmRpbmcgdGltZXN0YW1wcyBoYXMgcmVhY2hlZCB0aGUgbWF4aW11bSwKLSAgICAgICAgLy8gYWRkIHRoZSBjdXJyZW50IGhpc3RvZ3JhbSAoYnVja2V0cykgdG8gdGhlIGxvbmctdGVybSBoaXN0b2dyYW0gYnVmZmVyLAotICAgICAgICAvLyBjbGVhciBidWNrZXRzLCBhbmQgc3RhcnQgYSBuZXcgbG9uZy10ZXJtIGhpc3RvZ3JhbSBhZ2dyZWdhdGlvbiBwcm9jZXNzLgotICAgICAgICBpZiAoZGVsdGFNcyhzdGFydGluZ1RzLCBzaG9ydEhpc3QuZmlyc3QpID49IGtNYXhIaXN0VGltZXNwYW5NcykgewotICAgICAgICAgICAgbUxvbmdUZXJtSGlzdHMuZW1wbGFjZV9iYWNrKHN0YXJ0aW5nVHMsIHN0ZDo6bW92ZShidWNrZXRzKSk7Ci0gICAgICAgICAgICBidWNrZXRzLmNsZWFyKCk7Ci0gICAgICAgICAgICBzdGFydGluZ1RzID0gc2hvcnRIaXN0LmZpcnN0OwotICAgICAgICAgICAgLy8gV2hlbiBtZW1vcnkgaXMgZnVsbCwgZGVsZXRlIG9sZGVzdCBoaXN0b2dyYW0KLSAgICAgICAgICAgIC8vIFRPRE8gdXNlIGEgY2lyY3VsYXIgYnVmZmVyCi0gICAgICAgICAgICBpZiAobUxvbmdUZXJtSGlzdHMuc2l6ZSgpID49IGtMb25nVGVybUhpc3RzQ2FwYWNpdHkpIHsKLSAgICAgICAgICAgICAgICBtTG9uZ1Rlcm1IaXN0cy5wb3BfZnJvbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFkZCBjdXJyZW50IGhpc3RvZ3JhbSB0byBidWNrZXRzCi0gICAgICAgIGZvciAoY29uc3QgYXV0byAmY291bnRQYWlyIDogc2hvcnRIaXN0LnNlY29uZCkgewotICAgICAgICAgICAgYnVja2V0c1tjb3VudFBhaXIuZmlyc3RdICs9IGNvdW50UGFpci5zZWNvbmQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbVJlY2VudEhpc3RzLmNsZWFyKCk7Ci0gICAgLy8gVE9ETzogZGVjaWRlIHdoZW4vd2hlcmUgdG8gY2FsbCB3cml0ZVRvRmlsZQotICAgIC8vIFRPRE86IGFkZCBhIHRocmVhZC1zcGVjaWZpYyBleHRlbnNpb24gdG8gdGhlIGZpbGUgbmFtZQotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrTmFtZSA9IChjb25zdCBjaGFyICopICIvZGF0YS9taXNjL2F1ZGlvc2VydmVyL3NhbXBsZV9yZXN1bHRzLnR4dCI7Ci0gICAgd3JpdGVUb0ZpbGUobU91dGxpZXJEYXRhLCBtTG9uZ1Rlcm1IaXN0cywga05hbWUsIGZhbHNlKTsKLX0KLQotLy8gR2l2ZW4gYSBzZXJpZXMgb2Ygb3V0bGllciBpbnRlcnZhbHMgKG1PdXRsaWVyIGRhdGEpLAotLy8gbG9va3MgZm9yIGNoYW5nZXMgaW4gZGlzdHJpYnV0aW9uIChwZWFrcyksIHdoaWNoIGNhbiBiZSBlaXRoZXIgcG9zaXRpdmUgb3IgbmVnYXRpdmUuCi0vLyBUaGUgZnVuY3Rpb24gc2V0cyB0aGUgbWVhbiB0byB0aGUgc3RhcnRpbmcgdmFsdWUgYW5kIHNpZ21hIHRvIDAsIGFuZCB1cGRhdGVzCi0vLyB0aGVtIGFzIGxvbmcgYXMgbm8gcGVhayBpcyBkZXRlY3RlZC4gV2hlbiBhIHZhbHVlIGlzIG1vcmUgdGhhbiAndGhyZXNob2xkJwotLy8gc3RhbmRhcmQgZGV2aWF0aW9ucyBmcm9tIHRoZSBtZWFuLCBhIHBlYWsgaXMgZGV0ZWN0ZWQgYW5kIHRoZSBtZWFuIGFuZCBzaWdtYQotLy8gYXJlIHNldCB0byB0aGUgcGVhayB2YWx1ZSBhbmQgMC4KLXZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6ZGV0ZWN0UGVha3MoKSB7Ci0gICAgaWYgKG1PdXRsaWVyRGF0YS5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBjb21wdXRlIG1lYW4gb2YgdGhlIGRpc3RyaWJ1dGlvbi4gVXNlZCB0byBjaGVjayB3aGV0aGVyIGEgdmFsdWUgaXMgbGFyZ2UKLSAgICBjb25zdCBkb3VibGUga1R5cGljYWxEaWZmID0gc3RkOjphY2N1bXVsYXRlKAotICAgICAgICBtT3V0bGllckRhdGEuYmVnaW4oKSwgbU91dGxpZXJEYXRhLmVuZCgpLCAwLAotICAgICAgICBbXShhdXRvICZhLCBhdXRvICZiKXtyZXR1cm4gYSArIGIuZmlyc3Q7fSkgLyBtT3V0bGllckRhdGEuc2l6ZSgpOwotICAgIC8vIEFMT0dEKCJ0eXBpY2FsRGlmZiAlZiIsIGtUeXBpY2FsRGlmZik7Ci0KLSAgICAvLyBpdGVyYXRvciBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgc2VxdWVuY2UsIG9yIHVwZGF0ZWQgdG8gdGhlIG1vc3QgcmVjZW50IHBlYWsKLSAgICBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjx1aW50NjRfdCwgdWludDY0X3Q+Pjo6aXRlcmF0b3Igc3RhcnQgPSBtT3V0bGllckRhdGEuYmVnaW4oKTsKLSAgICAvLyB0aGUgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIGFyZSB1cGRhdGVkIGV2ZXJ5IHRpbWUgYSBwZWFrIGlzIGRldGVjdGVkCi0gICAgLy8gaW5pdGlhbGl6ZSBmaXJzdCB0aW1lLiBUaGUgbWVhbiBmcm9tIHRoZSBwcmV2aW91cyBzZXF1ZW5jZSBpcyBzdG9yZWQKLSAgICAvLyBmb3IgdGhlIG5leHQgc2VxdWVuY2UuIEhlcmUsIHRoZXkgYXJlIGluaXRpYWxpemVkIGZvciB0aGUgZmlyc3QgdGltZS4KLSAgICBpZiAobVBlYWtEZXRlY3Rvck1lYW4gPCAwKSB7Ci0gICAgICAgIG1QZWFrRGV0ZWN0b3JNZWFuID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihzdGFydC0+Zmlyc3QpOwotICAgICAgICBtUGVha0RldGVjdG9yU2QgPSAwOwotICAgIH0KLSAgICBhdXRvIHNxciA9IFtdKGF1dG8geCl7IHJldHVybiB4ICogeDsgfTsKLSAgICBmb3IgKGF1dG8gaXQgPSBtT3V0bGllckRhdGEuYmVnaW4oKTsgaXQgIT0gbU91dGxpZXJEYXRhLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIC8vIG5vIHN1cnByaXNlIG9jY3VycmVkOgotICAgICAgICAvLyB0aGUgbmV3IGVsZW1lbnQgaXMgYSBzbWFsbCBudW1iZXIgb2Ygc3RhbmRhcmQgZGV2aWF0aW9ucyBmcm9tIHRoZSBtZWFuCi0gICAgICAgIGlmICgoZmFicyhpdC0+Zmlyc3QgLSBtUGVha0RldGVjdG9yTWVhbikgPCBrU3RkZGV2VGhyZXNob2xkICogbVBlYWtEZXRlY3RvclNkKSB8fAotICAgICAgICAgICAgIC8vIG9yOiByaWdodCBhZnRlciBwZWFrIGhhcyBiZWVuIGRldGVjdGVkLCB0aGUgZGVsdGEgaXMgc21hbGxlciB0aGFuIGF2ZXJhZ2UKLSAgICAgICAgICAgIChtUGVha0RldGVjdG9yU2QgPT0gMCAmJiBmYWJzKGl0LT5maXJzdCAtIG1QZWFrRGV0ZWN0b3JNZWFuKSA8IGtUeXBpY2FsRGlmZikpIHsKLSAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgbWVhbiBhbmQgc2Q6Ci0gICAgICAgICAgICAvLyBjb3VudCBudW1iZXIgb2YgZWxlbWVudHMgKGRpc3RhbmNlIGJldHdlZW4gc3RhcnQgaW50ZXJhdG9yIGFuZCBjdXJyZW50KQotICAgICAgICAgICAgY29uc3QgaW50IGtOID0gc3RkOjpkaXN0YW5jZShzdGFydCwgaXQpICsgMTsKLSAgICAgICAgICAgIC8vIHVzdWFsIGZvcm11bGFzIGZvciBtZWFuIGFuZCBzZAotICAgICAgICAgICAgbVBlYWtEZXRlY3Rvck1lYW4gPSBzdGQ6OmFjY3VtdWxhdGUoc3RhcnQsIGl0ICsgMSwgMC4wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShhdXRvICZhLCBhdXRvICZiKXtyZXR1cm4gYSArIGIuZmlyc3Q7fSkgLyBrTjsKLSAgICAgICAgICAgIG1QZWFrRGV0ZWN0b3JTZCA9IHNxcnQoc3RkOjphY2N1bXVsYXRlKHN0YXJ0LCBpdCArIDEsIDAuMCwKLSAgICAgICAgICAgICAgICAgICAgICBbPV0oYXV0byAmYSwgYXV0byAmYil7IHJldHVybiBhICsgc3FyKGIuZmlyc3QgLSBtUGVha0RldGVjdG9yTWVhbik7fSkpIC8KLSAgICAgICAgICAgICAgICAgICAgICAoKGtOID4gMSk/IGtOIC0gMSA6IGtOKTsgLy8ga04gLSAxOiBtZWFuIGlzIGNvcnJlbGF0ZWQgd2l0aCB2YXJpYW5jZQotICAgICAgICB9Ci0gICAgICAgIC8vIHN1cnByaXNpbmcgdmFsdWU6IHN0b3JlIHBlYWsgdGltZXN0YW1wIGFuZCByZXNldCBtZWFuLCBzZCwgYW5kIHN0YXJ0IGl0ZXJhdG9yCi0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgbVBlYWtUaW1lc3RhbXBzLmVtcGxhY2VfYmFjayhpdC0+c2Vjb25kKTsKLSAgICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSBwb3BfZnJvbnQgb25jZSBhIGNpcmN1bGFyIGJ1ZmZlciBpcyBpbiBwbGFjZQotICAgICAgICAgICAgaWYgKG1QZWFrVGltZXN0YW1wcy5zaXplKCkgPj0ga1BlYWtTZXJpZXNTaXplKSB7Ci0gICAgICAgICAgICAgICAgbVBlYWtUaW1lc3RhbXBzLnBvcF9mcm9udCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVBlYWtEZXRlY3Rvck1lYW4gPSBzdGF0aWNfY2FzdDxkb3VibGU+KGl0LT5maXJzdCk7Ci0gICAgICAgICAgICBtUGVha0RldGVjdG9yU2QgPSAwOwotICAgICAgICAgICAgc3RhcnQgPSBpdDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLS8vIENhbGxlZCBieSBMb2dUc0VudHJ5LiBUaGUgaW5wdXQgaXMgYSB2ZWN0b3Igb2YgdGltZXN0YW1wcy4KLS8vIEZpbmRzIG91dGxpZXJzIGFuZCB3cml0ZXMgdG8gbU91dGxpZXJkYXRhLgotLy8gRWFjaCB2YWx1ZSBpbiBtT3V0bGllcmRhdGEgY29uc2lzdHMgb2Y6IDxvdXRsaWVyIHRpbWVzdGFtcCwgdGltZSBlbGFwc2VkIHNpbmNlIHByZXZpb3VzIG91dGxpZXI+LgotLy8gZS5nLiB0aW1lc3RhbXBzIChtcykgMSwgNCwgNSwgMTYsIDE4LCAyOCB3aWxsIHByb2R1Y2UgcGFpcnMgKDQsIDUpLCAoMTMsIDE4KS4KLS8vIFRoaXMgZnVuY3Rpb24gaXMgYXBwbGllZCB0byB0aGUgdGltZSBzZXJpZXMgYmVmb3JlIGl0IGlzIGNvbnZlcnRlZCBpbnRvIGEgaGlzdG9ncmFtLgotdm9pZCBQZXJmb3JtYW5jZUFuYWx5c2lzOjpzdG9yZU91dGxpZXJEYXRhKGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICZ0aW1lc3RhbXBzKSB7Ci0gICAgaWYgKHRpbWVzdGFtcHMuc2l6ZSgpIDwgMSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIC8vIGZpcnN0IHBhc3M6IG5lZWQgdG8gaW5pdGlhbGl6ZQotICAgIGlmIChtRWxhcHNlZCA9PSAwKSB7Ci0gICAgICAgIG1QcmV2TnMgPSB0aW1lc3RhbXBzWzBdOwotICAgIH0KLSAgICBmb3IgKGNvbnN0IGF1dG8gJnRzOiB0aW1lc3RhbXBzKSB7Ci0gICAgICAgIGNvbnN0IHVpbnQ2NF90IGRpZmZNcyA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihkZWx0YU1zKG1QcmV2TnMsIHRzKSk7Ci0gICAgICAgIGlmIChkaWZmTXMgPj0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGtPdXRsaWVyTXMpKSB7Ci0gICAgICAgICAgICBtT3V0bGllckRhdGEuZW1wbGFjZV9iYWNrKG1FbGFwc2VkLCBzdGF0aWNfY2FzdDx1aW50NjRfdD4obVByZXZOcykpOwotICAgICAgICAgICAgLy8gUmVtb3ZlIG9sZGVzdCB2YWx1ZSBpZiB0aGUgdmVjdG9yIGlzIGZ1bGwKLSAgICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSBwb3BfZnJvbnQgb25jZSBjaXJjdWxhciBidWZmZXIgaXMgaW4gcGxhY2UKLSAgICAgICAgICAgIC8vIEZJWE1FOiBtYWtlIHN1cmUga1Nob3J0SGlzdFNpemUgaXMgbGFyZ2UgZW5vdWdoIHRoYXQgdGhhdCBkYXRhIHdpbGwgbmV2ZXIgYmUgbG9zdAotICAgICAgICAgICAgLy8gYmVmb3JlIGJlaW5nIHdyaXR0ZW4gdG8gZmlsZSBvciB0byBhIEZJRk8KLSAgICAgICAgICAgIGlmIChtT3V0bGllckRhdGEuc2l6ZSgpID49IGtPdXRsaWVyU2VyaWVzU2l6ZSkgewotICAgICAgICAgICAgICAgIG1PdXRsaWVyRGF0YS5wb3BfZnJvbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1FbGFwc2VkID0gMDsKLSAgICAgICAgfQotICAgICAgICBtRWxhcHNlZCArPSBkaWZmTXM7Ci0gICAgICAgIG1QcmV2TnMgPSB0czsKLSAgICB9Ci19Ci0KLQotLy8gRklYTUU6IGRlbGV0ZSB0aGlzIHRlbXBvcmFyeSB0ZXN0IGNvZGUsIHJlY3ljbGVkIGZvciB2YXJpb3VzIG5ldyBmdW5jdGlvbnMKLXZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6dGVzdEZ1bmN0aW9uKCkgewotICAgIC8vIHByb2R1Y2VzIHZhbHVlcyAoNDogNTAwMDAwMCksICgxMzogMTgwMDAwMDApCi0gICAgLy8gbnMgdGltZXN0YW1wcyBvZiBidWZmZXIgcGVyaW9kcwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+a1RlbXBUZXN0RGF0YSA9IHsxMDAwMDAwLCA0MDAwMDAwLCA1MDAwMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAwMDAwMCwgMTgwMDAwMDAsIDI4MDAwMDAwfTsKLSAgICBQZXJmb3JtYW5jZUFuYWx5c2lzOjpzdG9yZU91dGxpZXJEYXRhKGtUZW1wVGVzdERhdGEpOwotICAgIGZvciAoY29uc3QgYXV0byAmb3V0bGllcjogbU91dGxpZXJEYXRhKSB7Ci0gICAgICAgIEFMT0dFKCJQZXJmb3JtYW5jZUFuYWx5c2lzIHRlc3QgJWxsZDogJWxsZCIsCi0gICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4ob3V0bGllci5maXJzdCksIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4ob3V0bGllci5zZWNvbmQpKTsKLSAgICB9Ci0gICAgZGV0ZWN0UGVha3MoKTsKLX0KLQotLy8gVE9ETyBNYWtlIGl0IHJldHVybiBhIHN0ZDo6c3RyaW5nIGluc3RlYWQgb2YgbW9kaWZ5aW5nIGJvZHkgLS0+IGlzIHRoaXMgc3RpbGwgcmVsZXZhbnQ/Ci0vLyBUT0RPIGNvbnNpZGVyIGNoYW5naW5nIGFsbCBpbnRzIHRvIHVpbnQzMl90IG9yIHVpbnQ2NF90Ci0vLyBUT0RPOiBtb3ZlIHRoaXMgdG8gUmVwb3J0UGVyZm9ybWFuY2UsIHByb2JhYmx5IG1ha2UgaXQgYSBmcmllbmQgZnVuY3Rpb24gb2YgUGVyZm9ybWFuY2VBbmFseXNpcwotdm9pZCBQZXJmb3JtYW5jZUFuYWx5c2lzOjpyZXBvcnRQZXJmb3JtYW5jZShTdHJpbmc4ICpib2R5LCBpbnQgbWF4SGVpZ2h0KSB7Ci0gICAgaWYgKG1SZWNlbnRIaXN0cy5zaXplKCkgPCAxKSB7Ci0gICAgICAgIEFMT0dEKCJyZXBvcnRQZXJmb3JtYW5jZTogbVJlY2VudEhpc3RzIGlzIGVtcHR5Iik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQUxPR0QoInJlcG9ydFBlcmZvcm1hbmNlOiBoaXN0cyBzaXplICVkIiwgc3RhdGljX2Nhc3Q8aW50PihtUmVjZW50SGlzdHMuc2l6ZSgpKSk7Ci0gICAgLy8gVE9ETzogbW9yZSBlbGFib3JhdGUgZGF0YSBhbmFseXNpcwotICAgIHN0ZDo6bWFwPGludCwgaW50PiBidWNrZXRzOwotICAgIGZvciAoY29uc3QgYXV0byAmc2hvcnRIaXN0OiBtUmVjZW50SGlzdHMpIHsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvICZjb3VudFBhaXIgOiBzaG9ydEhpc3Quc2Vjb25kKSB7Ci0gICAgICAgICAgICBidWNrZXRzW2NvdW50UGFpci5maXJzdF0gKz0gY291bnRQYWlyLnNlY29uZDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIHVuZGVyc2NvcmVzIGFuZCBzcGFjZXMgbGVuZ3RoIGNvcnJlc3BvbmRzIHRvIG1heGltdW0gd2lkdGggb2YgaGlzdG9ncmFtCi0gICAgc3RhdGljIGNvbnN0IGludCBrTGVuID0gNDA7Ci0gICAgc3RkOjpzdHJpbmcgdW5kZXJzY29yZXMoa0xlbiwgJ18nKTsKLSAgICBzdGQ6OnN0cmluZyBzcGFjZXMoa0xlbiwgJyAnKTsKLQotICAgIGF1dG8gaXQgPSBidWNrZXRzLmJlZ2luKCk7Ci0gICAgaW50IG1heERlbHRhID0gaXQtPmZpcnN0OwotICAgIGludCBtYXhDb3VudCA9IGl0LT5zZWNvbmQ7Ci0gICAgLy8gQ29tcHV0ZSBtYXhpbXVtIHZhbHVlcwotICAgIHdoaWxlICgrK2l0ICE9IGJ1Y2tldHMuZW5kKCkpIHsKLSAgICAgICAgaWYgKGl0LT5maXJzdCA+IG1heERlbHRhKSB7Ci0gICAgICAgICAgICBtYXhEZWx0YSA9IGl0LT5maXJzdDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXQtPnNlY29uZCA+IG1heENvdW50KSB7Ci0gICAgICAgICAgICBtYXhDb3VudCA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaW50IGhlaWdodCA9IGxvZzIobWF4Q291bnQpICsgMTsgLy8gbWF4Q291bnQgPiAwLCBzYWZlIHRvIGNhbGwgbG9nMgotICAgIGNvbnN0IGludCBsZWZ0UGFkZGluZyA9IHdpZHRoT2YoMSA8PCBoZWlnaHQpOwotICAgIGNvbnN0IGludCBjb2xXaWR0aCA9IHN0ZDo6bWF4KHN0ZDo6bWF4KHdpZHRoT2YobWF4RGVsdGEpICsgMSwgMyksIGxlZnRQYWRkaW5nICsgMik7Ci0gICAgaW50IHNjYWxpbmdGYWN0b3IgPSAxOwotICAgIC8vIHNjYWxlIGRhdGEgaWYgaXQgZXhjZWVkcyBtYXhpbXVtIGhlaWdodAotICAgIGlmIChoZWlnaHQgPiBtYXhIZWlnaHQpIHsKLSAgICAgICAgc2NhbGluZ0ZhY3RvciA9IChoZWlnaHQgKyBtYXhIZWlnaHQpIC8gbWF4SGVpZ2h0OwotICAgICAgICBoZWlnaHQgLz0gc2NhbGluZ0ZhY3RvcjsKLSAgICB9Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiUqcyIsIGxlZnRQYWRkaW5nICsgMTEsICJPY2N1cnJlbmNlcyIpOwotICAgIC8vIHdyaXRlIGhpc3RvZ3JhbSBsYWJlbCBsaW5lIHdpdGggYnVja2V0IHZhbHVlcwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lcyIsICIgIik7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKnMiLCBsZWZ0UGFkZGluZywgIiAiKTsKLSAgICBmb3IgKGF1dG8gY29uc3QgJnggOiBidWNrZXRzKSB7Ci0gICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpkIiwgY29sV2lkdGgsIHguc2Vjb25kKTsKLSAgICB9Ci0gICAgLy8gd3JpdGUgaGlzdG9ncmFtIGFzY2lpIGFydAotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lcyIsICIgIik7Ci0gICAgZm9yIChpbnQgcm93ID0gaGVpZ2h0ICogc2NhbGluZ0ZhY3Rvcjsgcm93ID49IDA7IHJvdyAtPSBzY2FsaW5nRmFjdG9yKSB7Ci0gICAgICAgIGNvbnN0IGludCB2YWx1ZSA9IDEgPDwgcm93OwotICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuKnMiLCBsZWZ0UGFkZGluZywgc3BhY2VzLmNfc3RyKCkpOwotICAgICAgICBmb3IgKGF1dG8gY29uc3QgJnggOiBidWNrZXRzKSB7Ci0gICAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLipzJXMiLCBjb2xXaWR0aCAtIDEsIHNwYWNlcy5jX3N0cigpLCB4LnNlY29uZCA8IHZhbHVlID8gIiAiIDogInwiKTsKLSAgICAgICAgfQotICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJXMiLCAiICIpOwotICAgIH0KLSAgICAvLyBwcmludCB4LWF4aXMKLSAgICBjb25zdCBpbnQgY29sdW1ucyA9IHN0YXRpY19jYXN0PGludD4oYnVja2V0cy5zaXplKCkpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpjIiwgbGVmdFBhZGRpbmcsICcgJyk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLipzIiwgKGNvbHVtbnMgKyAxKSAqIGNvbFdpZHRoLCB1bmRlcnNjb3Jlcy5jX3N0cigpKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJXMiLCAiICIpOwotCi0gICAgLy8gd3JpdGUgZm9vdGVyIHdpdGggYnVja2V0IGxhYmVscwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpzIiwgbGVmdFBhZGRpbmcsICIgIik7Ci0gICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgewotICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqZCIsIGNvbFdpZHRoLCB4LmZpcnN0KTsKLSAgICB9Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLipzJXMiLCBjb2xXaWR0aCwgc3BhY2VzLmNfc3RyKCksICJtc1xuIik7Ci0KLSAgICAvLyBOb3cgcmVwb3J0IGdsaXRjaGVzCi0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbnRpbWUgZWxhcHNlZCBiZXR3ZWVuIGdsaXRjaGVzIGFuZCBnbGl0Y2ggdGltZXN0YW1wc1xuIik7Ci0gICAgZm9yIChjb25zdCBhdXRvICZvdXRsaWVyOiBtT3V0bGllckRhdGEpIHsKLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlbGxkOiAlbGxkXG4iLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG91dGxpZXIuZmlyc3QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihvdXRsaWVyLnNlY29uZCkpOwotICAgIH0KLQotfQotCi0KLS8vIFByb2R1Y2VzIGEgbG9nIHdhcm5pbmcgaWYgdGhlIHRpbWluZyBvZiByZWNlbnQgYnVmZmVyIHBlcmlvZHMgY2F1c2VkIGEgZ2xpdGNoCi0vLyBDb21wdXRlcyBzdW0gb2YgcnVubmluZyB3aW5kb3cgb2YgdGhyZWUgYnVmZmVyIHBlcmlvZHMKLS8vIENoZWNrcyB3aGV0aGVyIHRoZSBidWZmZXIgcGVyaW9kcyBsZWF2ZSBlbm91Z2ggQ1BVIHRpbWUgZm9yIHRoZSBuZXh0IG9uZQotLy8gZS5nLiBpZiBhIGJ1ZmZlciBwZXJpb2QgaXMgZXhwZWN0ZWQgdG8gYmUgNCBtcyBhbmQgYSBidWZmZXIgcmVxdWlyZXMgMyBtcyBvZiBDUFUgdGltZSwKLS8vIGhlcmUgYXJlIHNvbWUgZ2xpdGNoIGNhc2VzOgotLy8gNCArIDQgKyA2IDsgNSArIDQgKyA1OyAyICsgMiArIDEwCi0vLyBUT0RPOiBkZXZlbG9wIHRoaXMgY29kZSB0byB0cmFjayBjaGFuZ2VzIGluIGhpc3RvZ3JhbSBkaXN0cmlidXRpb24gaW4gYWRkaXRpb24KLS8vIHRvIC8gaW5zdGVhZCBvZiBnbGl0Y2hlcy4KLXZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6YWxlcnRJZkdsaXRjaChjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAmc2FtcGxlcykgewotICAgIHN0ZDo6ZGVxdWU8aW50PiBwZXJpb2RzKGtOdW1CdWZmLCBrUGVyaW9kTXMpOwotICAgIGZvciAoc2l6ZV90IGkgPSAyOyBpIDwgc2FtcGxlcy5zaXplKCk7ICsraSkgeyAvLyBza2lwIGZpcnN0IHRpbWUgZW50cnkKLSAgICAgICAgcGVyaW9kcy5wdXNoX2Zyb250KGRlbHRhTXMoc2FtcGxlc1tpIC0gMV0sIHNhbXBsZXNbaV0pKTsKLSAgICAgICAgcGVyaW9kcy5wb3BfYmFjaygpOwotICAgICAgICAvLyBUT0RPOiBjaGVjayB0aGF0IGFsbCBnbGl0Y2ggY2FzZXMgYXJlIGNvdmVyZWQKLSAgICAgICAgaWYgKHN0ZDo6YWNjdW11bGF0ZShwZXJpb2RzLmJlZ2luKCksIHBlcmlvZHMuZW5kKCksIDApID4ga051bUJ1ZmYgKiBrUGVyaW9kTXMgKwotICAgICAgICAgICAga1BlcmlvZE1zIC0ga1BlcmlvZE1zQ1BVKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIkEgZ2xpdGNoIG9jY3VycmVkIik7Ci0gICAgICAgICAgICAgICAgcGVyaW9kcy5hc3NpZ24oa051bUJ1ZmYsIGtQZXJpb2RNcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi19IC8vIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZQotCi19ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL1BpcGVSZWFkZXIuY3BwIGIvbWVkaWEvbGlibmJhaW8vUGlwZVJlYWRlci5jcHAKaW5kZXggMjQ4NmI3Ni4uMzVhNDNkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vUGlwZVJlYWRlci5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vUGlwZVJlYWRlci5jcHAKQEAgLTI2LDcgKzI2LDcgQEAKIAogUGlwZVJlYWRlcjo6UGlwZVJlYWRlcihQaXBlJiBwaXBlKSA6CiAgICAgICAgIE5CQUlPX1NvdXJjZShwaXBlLm1Gb3JtYXQpLAotICAgICAgICBtUGlwZShwaXBlKSwgbUZpZm9SZWFkZXIobVBpcGUubUZpZm8sIGZhbHNlIC8qdGhyb3R0bGVzV3JpdGVyKi8sIHRydWUgLypmbHVzaCovKSwKKyAgICAgICAgbVBpcGUocGlwZSksIG1GaWZvUmVhZGVyKG1QaXBlLm1GaWZvLCBmYWxzZSAvKnRocm90dGxlc1dyaXRlciovLCBmYWxzZSAvKmZsdXNoKi8pLAogICAgICAgICBtRnJhbWVzT3ZlcnJ1bigwKSwKICAgICAgICAgbU92ZXJydW5zKDApCiB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9SZXBvcnRQZXJmb3JtYW5jZS5jcHAgYi9tZWRpYS9saWJuYmFpby9SZXBvcnRQZXJmb3JtYW5jZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNTBhZGEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibmJhaW8vUmVwb3J0UGVyZm9ybWFuY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiUmVwb3J0UGVyZm9ybWFuY2UiCi0KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHF1ZXVlPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3ByY3RsLmg+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkxvZy5oPgotI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmFpby9SZXBvcnRQZXJmb3JtYW5jZS5oPgotLy8gI2luY2x1ZGUgPHV0aWxzL0NhbGxTdGFjay5oPiAvLyB1c2VkIHRvIHByaW50IGNhbGxzdGFjawotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1uYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UgewotCi0vLyBXcml0ZXMgb3V0bGllciBpbnRlcnZhbHMsIHRpbWVzdGFtcHMsIGFuZCBoaXN0b2dyYW1zIHNwYW5uaW5nIGxvbmcgdGltZSBpbnRlcnZhbHMgdG8gYSBmaWxlLgotLy8gVE9ETzogZm9ybWF0IHRoZSBkYXRhIGVmZmljaWVudGx5IGFuZCB3cml0ZSBkaWZmZXJlbnQgdHlwZXMgb2YgZGF0YSB0byBkaWZmZXJlbnQgZmlsZXMKLXZvaWQgd3JpdGVUb0ZpbGUoc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8b3V0bGllckludGVydmFsLCB0aW1lc3RhbXA+PiAmb3V0bGllckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjx0aW1lc3RhbXAsIEhpc3RvZ3JhbT4+ICZoaXN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBrTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXBwZW5kKSB7Ci0gICAgQUxPR0QoIndyaXRpbmcgcGVyZm9ybWFuY2UgZGF0YSB0byBmaWxlIik7Ci0gICAgaWYgKG91dGxpZXJEYXRhLmVtcHR5KCkgfHwgaGlzdHMuZW1wdHkoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3RkOjpvZnN0cmVhbSBvZnM7Ci0gICAgb2ZzLm9wZW4oa05hbWUsIGFwcGVuZCA/IHN0ZDo6aW9zOjphcHAgOiBzdGQ6Omlvczo6dHJ1bmMpOwotICAgIGlmICghb2ZzLmlzX29wZW4oKSkgewotICAgICAgICBBTE9HVygiY291bGRuJ3Qgb3BlbiBmaWxlICVzIiwga05hbWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG9mcyA8PCAiT3V0bGllciBkYXRhOiBpbnRlcnZhbCBhbmQgdGltZXN0YW1wXG4iOwotICAgIGZvciAoY29uc3QgYXV0byAmb3V0bGllciA6IG91dGxpZXJEYXRhKSB7Ci0gICAgICAgIG9mcyA8PCBvdXRsaWVyLmZpcnN0IDw8ICI6ICIgPDwgb3V0bGllci5zZWNvbmQgPDwgIlxuIjsKLSAgICB9Ci0gICAgb2ZzIDw8ICJIaXN0b2dyYW0gZGF0YVxuIjsKLSAgICBmb3IgKGNvbnN0IGF1dG8gJmhpc3QgOiBoaXN0cykgewotICAgICAgICBvZnMgPDwgIlx0dGltZXN0YW1wXG4iOwotICAgICAgICBvZnMgPDwgaGlzdC5maXJzdCA8PCAiXG4iOwotICAgICAgICBvZnMgPDwgIlx0YnVja2V0cyBhbmQgY291bnRzXG4iOwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmJ1Y2tldCA6IGhpc3Quc2Vjb25kKSB7Ci0gICAgICAgICAgICBvZnMgPDwgYnVja2V0LmZpcnN0IDw8ICI6ICIgPDwgYnVja2V0LnNlY29uZCA8PCAiXG4iOwotICAgICAgICB9Ci0gICAgfQotICAgIG9mcy5jbG9zZSgpOwotfQotCi19IC8vIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZQotCi19ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0OGVlMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIE5vbi1ibG9ja2luZyBldmVudCBsb2dnZXIgaW50ZW5kZWQgZm9yIHNhZmUgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHByb2Nlc3NlcyB2aWEgc2hhcmVkIG1lbW9yeQotCi0jaWZuZGVmIEFORFJPSURfTUVESUFfTkJMT0dfSAotI2RlZmluZSBBTkRST0lEX01FRElBX05CTE9HX0gKLQotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8YXVkaW9fdXRpbHMvZmlmby5oPgotI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPGRlcXVlPgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgU3RyaW5nODsKLQotY2xhc3MgTkJMb2cgewotCi1wdWJsaWM6Ci0KLXR5cGVkZWYgdWludDY0X3QgbG9nX2hhc2hfdDsKLQotLy8gRklYTUUgRXZlcnl0aGluZyBuZWVkZWQgZm9yIGNsaWVudCAod3JpdGVyIEFQSSBhbmQgcmVnaXN0cmF0aW9uKSBzaG91bGQgYmUgaXNvbGF0ZWQKLS8vICAgICAgIGZyb20gdGhlIHJlc3Qgb2YgdGhlIGltcGxlbWVudGF0aW9uLgotY2xhc3MgV3JpdGVyOwotY2xhc3MgUmVhZGVyOwotCi1lbnVtIEV2ZW50IDogdWludDhfdCB7Ci0gICAgRVZFTlRfUkVTRVJWRUQsCi0gICAgRVZFTlRfU1RSSU5HLCAgICAgICAgICAgICAgIC8vIEFTQ0lJIHN0cmluZywgbm90IE5VTC10ZXJtaW5hdGVkCi0gICAgLy8gVE9ETzogbWFrZSB0aW1lc3RhbXAgb3B0aW9uYWwKLSAgICBFVkVOVF9USU1FU1RBTVAsICAgICAgICAgICAgLy8gY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMpCi0gICAgRVZFTlRfSU5URUdFUiwgICAgICAgICAgICAgIC8vIGludGVnZXIgdmFsdWUgZW50cnkKLSAgICBFVkVOVF9GTE9BVCwgICAgICAgICAgICAgICAgLy8gZmxvYXRpbmcgcG9pbnQgdmFsdWUgZW50cnkKLSAgICBFVkVOVF9QSUQsICAgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBJRCBhbmQgcHJvY2VzcyBuYW1lCi0gICAgRVZFTlRfQVVUSE9SLCAgICAgICAgICAgICAgIC8vIGF1dGhvciBpbmRleCAocHJlc2VudCBpbiBtZXJnZWQgbG9ncykgdHJhY2tzIGVudHJ5J3Mgb3JpZ2luYWwgbG9nCi0gICAgRVZFTlRfU1RBUlRfRk1ULCAgICAgICAgICAgIC8vIGxvZ0Zvcm1hdCBzdGFydCBldmVudDogZW50cnkgaW5jbHVkZXMgZm9ybWF0IHN0cmluZywgZm9sbG93aW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVudHJpZXMgY29udGFpbiBmb3JtYXQgYXJndW1lbnRzCi0gICAgRVZFTlRfSEFTSCwgICAgICAgICAgICAgICAgIC8vIHVuaXF1ZSBIQVNIIG9mIGxvZyBvcmlnaW4sIG9yaWdpbmF0ZXMgZnJvbSBoYXNoIG9mIGZpbGUgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbGluZSBudW1iZXIKLSAgICBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFMsICAgLy8gc2luZ2xlIGRhdHVtIGZvciB0aW1lc3RhbXAgaGlzdG9ncmFtCi0gICAgRVZFTlRfQVVESU9fU1RBVEUsICAgICAgICAgIC8vIGF1ZGlvIG9uL29mZiBldmVudDogbG9nZ2VkIHVwb24gRmFzdE1peGVyOjpvblN0YXRlQ2hhbmdlKCkgY2FsbAotICAgIEVWRU5UX0VORF9GTVQsICAgICAgICAgICAgICAvLyBlbmQgb2YgbG9nRm9ybWF0IGFyZ3VtZW50IGxpc3QKLQotICAgIEVWRU5UX1VQUEVSX0JPVU5ELCAgICAgICAgICAvLyB0byBjaGVjayBmb3IgaW52YWxpZCBldmVudHMKLX07Ci0KLXByaXZhdGU6Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQVBJIGZvciBoYW5kbGluZyBmb3JtYXQgZW50cnkgb3BlcmF0aW9ucwotCi0vLyBhIGZvcm1hdHRlZCBlbnRyeSBoYXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6Ci0vLyAgICAqIFNUQVJUX0ZNVCBlbnRyeSwgY29udGFpbmluZyB0aGUgZm9ybWF0IHN0cmluZwotLy8gICAgKiBUSU1FU1RBTVAgZW50cnkKLS8vICAgICogSEFTSCBlbnRyeQotLy8gICAgKiBhdXRob3IgZW50cnkgb2YgdGhlIHRocmVhZCB0aGF0IGdlbmVyYXRlZCBpdCAob3B0aW9uYWwsIHByZXNlbnQgaW4gbWVyZ2VkIGxvZykKLS8vICAgICogZm9ybWF0IGFyZzEKLS8vICAgICogZm9ybWF0IGFyZzIKLS8vICAgICogLi4uCi0vLyAgICAqIEVORF9GTVQgZW50cnkKLQotLy8gZW50cnkgcmVwcmVzZW50YXRpb24gaW4gbWVtb3J5Ci1zdHJ1Y3QgZW50cnkgewotICAgIGNvbnN0IHVpbnQ4X3QgdHlwZTsKLSAgICBjb25zdCB1aW50OF90IGxlbmd0aDsKLSAgICBjb25zdCB1aW50OF90IGRhdGFbMF07Ci19OwotCi0vLyBlbnRyeSB0YWlsIHJlcHJlc2VudGF0aW9uIChhZnRlciBkYXRhKQotc3RydWN0IGVuZGluZyB7Ci0gICAgdWludDhfdCBsZW5ndGg7Ci0gICAgdWludDhfdCBuZXh0WzBdOwotfTsKLQotLy8gZW50cnkgaXRlcmF0b3IKLWNsYXNzIEVudHJ5SXRlcmF0b3IgewotcHVibGljOgotICAgIEVudHJ5SXRlcmF0b3IoKTsKLSAgICBleHBsaWNpdCBFbnRyeUl0ZXJhdG9yKGNvbnN0IHVpbnQ4X3QgKmVudHJ5KTsKLSAgICBFbnRyeUl0ZXJhdG9yKGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKTsKLQotICAgIC8vIGRlcmVmZXJlbmNlIHVuZGVybHlpbmcgZW50cnkKLSAgICBjb25zdCBlbnRyeSYgICAgb3BlcmF0b3IqKCkgY29uc3Q7Ci0gICAgY29uc3QgZW50cnkqICAgIG9wZXJhdG9yLT4oKSBjb25zdDsKLSAgICAvLyBhZHZhbmNlIHRvIG5leHQgZW50cnkKLSAgICBFbnRyeUl0ZXJhdG9yJiAgICAgICBvcGVyYXRvcisrKCk7IC8vICsraQotICAgIC8vIGJhY2sgdG8gcHJldmlvdXMgZW50cnkKLSAgICBFbnRyeUl0ZXJhdG9yJiAgICAgICBvcGVyYXRvci0tKCk7IC8vIC0taQotICAgIEVudHJ5SXRlcmF0b3IgICAgICAgIG5leHQoKSBjb25zdDsKLSAgICBFbnRyeUl0ZXJhdG9yICAgICAgICBwcmV2KCkgY29uc3Q7Ci0gICAgYm9vbCAgICAgICAgICAgIG9wZXJhdG9yIT0oY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0OwotICAgIGludCAgICAgICAgICAgICBvcGVyYXRvci0oY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0OwotCi0gICAgYm9vbCAgICAgICAgICAgIGhhc0NvbnNpc3RlbnRMZW5ndGgoKSBjb25zdDsKLSAgICB2b2lkICAgICAgICAgICAgY29weVRvKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCkgY29uc3Q7Ci0gICAgdm9pZCAgICAgICAgICAgIGNvcHlEYXRhKHVpbnQ4X3QgKmRzdCkgY29uc3Q7Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgIGlubGluZSBjb25zdCBUJiBwYXlsb2FkKCkgewotICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCAqPihwdHIgKyBvZmZzZXRvZihlbnRyeSwgZGF0YSkpOwotICAgIH0KLQotICAgIGlubGluZSBvcGVyYXRvciBjb25zdCB1aW50OF90KigpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIHB0cjsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgY29uc3QgdWludDhfdCAgKnB0cjsKLX07Ci0KLWNsYXNzIEFic3RyYWN0RW50cnkgewotcHVibGljOgotCi0gICAgLy8gRW50cnkgc3RhcnRpbmcgaW4gdGhlIGdpdmVuIHBvaW50ZXIKLSAgICBleHBsaWNpdCBBYnN0cmFjdEVudHJ5KGNvbnN0IHVpbnQ4X3QgKmVudHJ5KTsKLSAgICB2aXJ0dWFsIH5BYnN0cmFjdEVudHJ5KCkge30KLQotICAgIC8vIGJ1aWxkIGNvbmNyZXRlIGVudHJ5IG9mIGFwcHJvcHJpYXRlIGNsYXNzIGZyb20gcG9pbnRlcgotICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QWJzdHJhY3RFbnRyeT4gYnVpbGRFbnRyeShjb25zdCB1aW50OF90ICpwdHIpOwotCi0gICAgLy8gZ2V0IGZvcm1hdCBlbnRyeSB0aW1lc3RhbXAKLSAgICAvLyBUT0RPIGNvbnNpZGVyIGNoYW5naW5nIHRvIHVpbnQ2NF90Ci0gICAgdmlydHVhbCBpbnQ2NF90ICAgICAgdGltZXN0YW1wKCkgY29uc3QgPSAwOwotCi0gICAgLy8gZ2V0IGZvcm1hdCBlbnRyeSdzIHVuaXF1ZSBpZAotICAgIHZpcnR1YWwgbG9nX2hhc2hfdCAgIGhhc2goKSBjb25zdCA9IDA7Ci0KLSAgICAvLyBlbnRyeSdzIGF1dGhvciBpbmRleCAoLTEgaWYgbm9uZSBwcmVzZW50KQotICAgIC8vIGEgTWVyZ2VyIGhhcyBhIHZlY3RvciBvZiBSZWFkZXJzLCBhdXRob3Igc2ltcGx5IHBvaW50cyB0byB0aGUgaW5kZXggb2YgdGhlCi0gICAgLy8gUmVhZGVyIHRoYXQgb3JpZ2luYXRlZCB0aGUgZW50cnkKLSAgICAvLyBUT0RPIGNvbnNpZGVyIGNoYW5naW5nIHRvIHVpbnQzMl90Ci0gICAgdmlydHVhbCBpbnQgICAgICAgICAgYXV0aG9yKCkgY29uc3QgPSAwOwotCi0gICAgLy8gY29weSBlbnRyeSwgYWRkaW5nIGF1dGhvciBiZWZvcmUgdGltZXN0YW1wLCByZXR1cm5zIGl0ZXJhdG9yIHRvIGVuZCBvZiBlbnRyeQotICAgIHZpcnR1YWwgRW50cnlJdGVyYXRvciAgICBjb3B5V2l0aEF1dGhvcihzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXV0aG9yKSBjb25zdCA9IDA7Ci0KLXByb3RlY3RlZDoKLSAgICAvLyBjb3BpZXMgb3JkaW5hcnkgZW50cnkgZnJvbSBzcmMgdG8gZHN0LCBhbmQgcmV0dXJucyBsZW5ndGggb2YgZW50cnkKLSAgICAvLyBzaXplX3QgICAgICBjb3B5RW50cnkoYXVkaW9fdXRpbHNfZmlmb193cml0ZXIgKmRzdCwgY29uc3QgaXRlcmF0b3IgJml0KTsKLSAgICBjb25zdCB1aW50OF90ICAqbUVudHJ5OwotfTsKLQotY2xhc3MgRm9ybWF0RW50cnkgOiBwdWJsaWMgQWJzdHJhY3RFbnRyeSB7Ci1wdWJsaWM6Ci0gICAgLy8gZXhwbGljaXQgRm9ybWF0RW50cnkoY29uc3QgRW50cnlJdGVyYXRvciAmaXQpOwotICAgIGV4cGxpY2l0IEZvcm1hdEVudHJ5KGNvbnN0IHVpbnQ4X3QgKnB0cikgOiBBYnN0cmFjdEVudHJ5KHB0cikge30KLSAgICB2aXJ0dWFsIH5Gb3JtYXRFbnRyeSgpIHt9Ci0KLSAgICBFbnRyeUl0ZXJhdG9yIGJlZ2luKCkgY29uc3Q7Ci0KLSAgICAvLyBFbnRyeSdzIGZvcm1hdCBzdHJpbmcKLSAgICBjb25zdCAgIGNoYXIqIGZvcm1hdFN0cmluZygpIGNvbnN0OwotCi0gICAgLy8gRW5ydHkncyBmb3JtYXQgc3RyaW5nIGxlbmd0aAotICAgICAgICAgICAgc2l6ZV90ICAgICAgZm9ybWF0U3RyaW5nTGVuZ3RoKCkgY29uc3Q7Ci0KLSAgICAvLyBGb3JtYXQgYXJndW1lbnRzIChleGNsdWRpbmcgZm9ybWF0IHN0cmluZywgdGltZXN0YW1wIGFuZCBhdXRob3IpCi0gICAgICAgICAgICBFbnRyeUl0ZXJhdG9yICAgIGFyZ3MoKSBjb25zdDsKLQotICAgIC8vIGdldCBmb3JtYXQgZW50cnkgdGltZXN0YW1wCi0gICAgdmlydHVhbCBpbnQ2NF90ICAgICB0aW1lc3RhbXAoKSBjb25zdCBvdmVycmlkZTsKLQotICAgIC8vIGdldCBmb3JtYXQgZW50cnkncyB1bmlxdWUgaWQKLSAgICB2aXJ0dWFsIGxvZ19oYXNoX3QgIGhhc2goKSBjb25zdCBvdmVycmlkZTsKLQotICAgIC8vIGVudHJ5J3MgYXV0aG9yIGluZGV4ICgtMSBpZiBub25lIHByZXNlbnQpCi0gICAgLy8gYSBNZXJnZXIgaGFzIGEgdmVjdG9yIG9mIFJlYWRlcnMsIGF1dGhvciBzaW1wbHkgcG9pbnRzIHRvIHRoZSBpbmRleCBvZiB0aGUKLSAgICAvLyBSZWFkZXIgdGhhdCBvcmlnaW5hdGVkIHRoZSBlbnRyeQotICAgIHZpcnR1YWwgaW50ICAgICAgICAgYXV0aG9yKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICAvLyBjb3B5IGVudHJ5LCBhZGRpbmcgYXV0aG9yIGJlZm9yZSB0aW1lc3RhbXAsIHJldHVybnMgc2l6ZSBvZiBvcmlnaW5hbCBlbnRyeQotICAgIHZpcnR1YWwgRW50cnlJdGVyYXRvciAgICBjb3B5V2l0aEF1dGhvcihzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXV0aG9yKSBjb25zdCBvdmVycmlkZTsKLQotfTsKLQotY2xhc3MgSGlzdG9ncmFtRW50cnkgOiBwdWJsaWMgQWJzdHJhY3RFbnRyeSB7Ci1wdWJsaWM6Ci0gICAgZXhwbGljaXQgSGlzdG9ncmFtRW50cnkoY29uc3QgdWludDhfdCAqcHRyKSA6IEFic3RyYWN0RW50cnkocHRyKSB7Ci0gICAgfQotICAgIHZpcnR1YWwgfkhpc3RvZ3JhbUVudHJ5KCkge30KLQotICAgIHZpcnR1YWwgaW50NjRfdCAgICAgdGltZXN0YW1wKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIGxvZ19oYXNoX3QgIGhhc2goKSBjb25zdCBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgaW50ICAgICAgICAgYXV0aG9yKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIEVudHJ5SXRlcmF0b3IgICAgY29weVdpdGhBdXRob3Ioc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1dGhvcikgY29uc3Qgb3ZlcnJpZGU7Ci0KLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyByZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBsb2cgZW50cnkgaW4gcHJpdmF0ZSBtZW1vcnkKLXN0cnVjdCBFbnRyeSB7Ci0gICAgRW50cnkoRXZlbnQgZXZlbnQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpCi0gICAgICAgIDogbUV2ZW50KGV2ZW50KSwgbUxlbmd0aChsZW5ndGgpLCBtRGF0YShkYXRhKSB7IH0KLSAgICAvKnZpcnR1YWwqLyB+RW50cnkoKSB7IH0KLQotICAgIC8vIHVzZWQgZHVyaW5nIHdyaXRpbmcgdG8gZm9ybWF0IEVudHJ5IGluZm9ybWF0aW9uIGFzIGZvbGxvd3M6IFt0eXBlXVtsZW5ndGhdW2RhdGEgLi4uIF1bbGVuZ3RoXQotICAgIGludCAgICAgY29weUVudHJ5RGF0YUF0KHNpemVfdCBvZmZzZXQpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBXcml0ZXI7Ci0gICAgRXZlbnQgICAgICAgbUV2ZW50OyAgICAgLy8gZXZlbnQgdHlwZQotICAgIHVpbnQ4X3QgICAgIG1MZW5ndGg7ICAgIC8vIGxlbmd0aCBvZiBhZGRpdGlvbmFsIGRhdGEsIDAgPD0gbUxlbmd0aCA8PSBrTWF4TGVuZ3RoCi0gICAgY29uc3Qgdm9pZCAqbURhdGE7ICAgICAgLy8gZXZlbnQgdHlwZS1zcGVjaWZpYyBkYXRhCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4TGVuZ3RoID0gMjU1OwotcHVibGljOgotICAgIC8vIG1FdmVudCwgbUxlbmd0aCwgbURhdGFbLi4uXSwgZHVwbGljYXRlIG1MZW5ndGgKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtPdmVyaGVhZCA9IHNpemVvZihlbnRyeSkgKyBzaXplb2YoZW5kaW5nKTsKLSAgICAvLyBlbmRpbmQgbGVuZ3RoIG9mIHByZXZpb3VzIGVudHJ5Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUHJldmlvdXNMZW5ndGhPZmZzZXQgPSAtIHNpemVvZihlbmRpbmcpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKGVuZGluZywgbGVuZ3RoKTsKLX07Ci0KLXN0cnVjdCBIaXN0VHNFbnRyeSB7Ci0gICAgbG9nX2hhc2hfdCBoYXNoOwotICAgIGludDY0X3QgdHM7Ci19OyAvL1RPRE8gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBIaXN0VHNFbnRyeVdpdGhBdXRob3IgewotICAgIGxvZ19oYXNoX3QgaGFzaDsKLSAgICBpbnQ2NF90IHRzOwotICAgIGludCBhdXRob3I7Ci19OyAvL1RPRE8gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXVzaW5nIFN0YXRlVHNFbnRyeVdpdGhBdXRob3IgPSBIaXN0VHNFbnRyeVdpdGhBdXRob3I7Ci0KLXN0cnVjdCBIaXN0SW50RW50cnkgewotICAgIGxvZ19oYXNoX3QgaGFzaDsKLSAgICBpbnQgdmFsdWU7Ci19OyAvL1RPRE8gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8vIHJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIGxvZyBlbnRyeSBpbiBzaGFyZWQgbWVtb3J5Ci0vLyAgYnl0ZVswXSAgICAgICAgICAgICBtRXZlbnQKLS8vICBieXRlWzFdICAgICAgICAgICAgIG1MZW5ndGgKLS8vICBieXRlWzJdICAgICAgICAgICAgIG1EYXRhWzBdCi0vLyAgLi4uCi0vLyAgYnl0ZVsyK2ldICAgICAgICAgICBtRGF0YVtpXQotLy8gIC4uLgotLy8gIGJ5dGVbMittTGVuZ3RoLTFdICAgbURhdGFbbUxlbmd0aC0xXQotLy8gIGJ5dGVbMittTGVuZ3RoXSAgICAgZHVwbGljYXRlIGNvcHkgb2YgbUxlbmd0aCB0byBwZXJtaXQgcmV2ZXJzZSBzY2FuCi0vLyAgYnl0ZVszK21MZW5ndGhdICAgICBzdGFydCBvZiBuZXh0IGxvZyBlbnRyeQotCi0gICAgc3RhdGljIHZvaWQgICAgYXBwZW5kSW50KFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpOwotICAgIHN0YXRpYyB2b2lkICAgIGFwcGVuZEZsb2F0KFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpOwotICAgIHN0YXRpYyB2b2lkICAgIGFwcGVuZFBJRChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKLSAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRUaW1lc3RhbXAoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSk7Ci0gICAgc3RhdGljIHNpemVfdCAgZm10RW50cnlMZW5ndGgoY29uc3QgdWludDhfdCAqZGF0YSk7Ci0gICAgc3RhdGljIFN0cmluZzggYnVmZmVyRHVtcChjb25zdCB1aW50OF90ICpidWZmZXIsIHNpemVfdCBzaXplKTsKLSAgICBzdGF0aWMgU3RyaW5nOCBidWZmZXJEdW1wKGNvbnN0IEVudHJ5SXRlcmF0b3IgJml0KTsKLXB1YmxpYzoKLQotLy8gTG9jYXRlZCBpbiBzaGFyZWQgbWVtb3J5LCBtdXN0IGJlIFBPRC4KLS8vIEV4YWN0bHkgb25lIHByb2Nlc3MgbXVzdCBleHBsaWNpdGx5IGNhbGwgdGhlIGNvbnN0cnVjdG9yIG9yIHVzZSBwbGFjZW1lbnQgbmV3LgotLy8gU2luY2UgdGhpcyBpcyBhIFBPRCwgdGhlIGRlc3RydWN0b3IgaXMgZW1wdHkgYW5kIHVubmVjZXNzYXJ5IHRvIGNhbGwgaXQgZXhwbGljaXRseS4KLXN0cnVjdCBTaGFyZWQgewotICAgIFNoYXJlZCgpIC8qIG1SZWFyIGluaXRpYWxpemVkIHZpYSBkZWZhdWx0IGNvbnN0cnVjdG9yICovIHsgfQotICAgIC8qdmlydHVhbCovIH5TaGFyZWQoKSB7IH0KLQotICAgIGF1ZGlvX3V0aWxzX2ZpZm9faW5kZXggIG1SZWFyOyAgLy8gaW5kZXggb25lIGJ5dGUgcGFzdCB0aGUgZW5kIG9mIG1vc3QgcmVjZW50IEVudHJ5Ci0gICAgY2hhciAgICBtQnVmZmVyWzBdOyAgICAgICAgICAgICAvLyBjaXJjdWxhciBidWZmZXIgZm9yIGVudHJpZXMKLX07Ci0KLXB1YmxpYzoKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEZJWE1FIFRpbWVsaW5lIHdhcyBpbnRlbmRlZCB0byB3cmFwIFdyaXRlciBhbmQgUmVhZGVyLCBidXQgaXNuJ3QgYWN0dWFsbHkgdXNlZCB5ZXQuCi0vLyBGb3Igbm93IGl0IGlzIGp1c3QgYSBuYW1lc3BhY2UgZm9yIHNoYXJlZFNpemUoKS4KLWNsYXNzIFRpbWVsaW5lIDogcHVibGljIFJlZkJhc2UgewotcHVibGljOgotI2lmIDAKLSAgICBUaW1lbGluZShzaXplX3Qgc2l6ZSwgdm9pZCAqc2hhcmVkID0gTlVMTCk7Ci0gICAgdmlydHVhbCB+VGltZWxpbmUoKTsKLSNlbmRpZgotCi0gICAgLy8gSW5wdXQgcGFyYW1ldGVyICdzaXplJyBpcyB0aGUgZGVzaXJlZCBzaXplIG9mIHRoZSB0aW1lbGluZSBpbiBieXRlIHVuaXRzLgotICAgIC8vIFJldHVybnMgdGhlIHNpemUgcm91bmRlZCB1cCB0byBhIHBvd2VyLW9mLTIsIHBsdXMgdGhlIGNvbnN0YW50IHNpemUgb3ZlcmhlYWQgZm9yIGluZGljZXMuCi0gICAgc3RhdGljIHNpemVfdCBzaGFyZWRTaXplKHNpemVfdCBzaXplKTsKLQotI2lmIDAKLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzICAgIFdyaXRlcjsKLSAgICBmcmllbmQgY2xhc3MgICAgUmVhZGVyOwotCi0gICAgY29uc3Qgc2l6ZV90ICAgIG1TaXplOyAgICAgIC8vIGNpcmN1bGFyIGJ1ZmZlciBzaXplIGluIGJ5dGVzLCBtdXN0IGJlIGEgcG93ZXIgb2YgMgotICAgIGJvb2wgICAgICAgICAgICBtT3duOyAgICAgICAvLyB3aGV0aGVyIEkgb3duIHRoZSBtZW1vcnkgYXQgbVNoYXJlZAotICAgIFNoYXJlZCogY29uc3QgICBtU2hhcmVkOyAgICAvLyBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnkKLSNlbmRpZgotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFdyaXRlciBpcyB0aHJlYWQtc2FmZSB3aXRoIHJlc3BlY3QgdG8gUmVhZGVyLCBidXQgbm90IHdpdGggcmVzcGVjdCB0byBtdWx0aXBsZSB0aHJlYWRzCi0vLyBjYWxsaW5nIFdyaXRlciBtZXRob2RzLiAgSWYgeW91IG5lZWQgbXVsdGktdGhyZWFkIHNhZmV0eSBmb3Igd3JpdGluZywgdXNlIExvY2tlZFdyaXRlci4KLWNsYXNzIFdyaXRlciA6IHB1YmxpYyBSZWZCYXNlIHsKLXB1YmxpYzoKLSAgICBXcml0ZXIoKTsgICAgICAgICAgICAgICAgICAgLy8gZHVtbXkgbm9wIGltcGxlbWVudGF0aW9uIHdpdGhvdXQgc2hhcmVkIG1lbW9yeQotCi0gICAgLy8gSW5wdXQgcGFyYW1ldGVyICdzaXplJyBpcyB0aGUgZGVzaXJlZCBzaXplIG9mIHRoZSB0aW1lbGluZSBpbiBieXRlIHVuaXRzLgotICAgIC8vIFRoZSBzaXplIG9mIHRoZSBzaGFyZWQgbWVtb3J5IG11c3QgYmUgYXQgbGVhc3QgVGltZWxpbmU6OnNoYXJlZFNpemUoc2l6ZSkuCi0gICAgV3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOwotICAgIFdyaXRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUpOwotCi0gICAgdmlydHVhbCB+V3JpdGVyKCk7Ci0KLSAgICAvLyBGSVhNRSBuZWVkcyBjb21tZW50cywgYW5kIHNvbWUgc2hvdWxkIGJlIHByaXZhdGUKLSAgICB2aXJ0dWFsIHZvaWQgICAgbG9nKGNvbnN0IGNoYXIgKnN0cmluZyk7Ci0gICAgdmlydHVhbCB2b2lkICAgIGxvZ2YoY29uc3QgY2hhciAqZm10LCAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgbG9ndmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgbG9nVGltZXN0YW1wKCk7Ci0gICAgdmlydHVhbCB2b2lkICAgIGxvZ1RpbWVzdGFtcChjb25zdCBpbnQ2NF90IHRzKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgbG9nSW50ZWdlcihjb25zdCBpbnQgeCk7Ci0gICAgdmlydHVhbCB2b2lkICAgIGxvZ0Zsb2F0KGNvbnN0IGZsb2F0IHgpOwotICAgIHZpcnR1YWwgdm9pZCAgICBsb2dQSUQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgbG9nX2hhc2hfdCBoYXNoLCAuLi4pOwotICAgIHZpcnR1YWwgdm9pZCAgICBsb2dWRm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgbG9nX2hhc2hfdCBoYXNoLCB2YV9saXN0IGFwKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgbG9nU3RhcnQoY29uc3QgY2hhciAqZm10KTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRW5kKCk7Ci0gICAgdmlydHVhbCB2b2lkICAgIGxvZ0hhc2gobG9nX2hhc2hfdCBoYXNoKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRXZlbnRIaXN0VHMoRXZlbnQgZXZlbnQsIGxvZ19oYXNoX3QgaGFzaCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgICAgaXNFbmFibGVkKCkgY29uc3Q7Ci0KLSAgICAvLyByZXR1cm4gdmFsdWUgZm9yIGFsbCBvZiB0aGVzZSBpcyB0aGUgcHJldmlvdXMgaXNFbmFibGVkKCkKLSAgICB2aXJ0dWFsIGJvb2wgICAgc2V0RW5hYmxlZChib29sIGVuYWJsZWQpOyAgIC8vIGJ1dCB3b24ndCBlbmFibGUgaWYgbm8gc2hhcmVkIG1lbW9yeQotICAgICAgICAgICAgYm9vbCAgICBlbmFibGUoKSAgICB7IHJldHVybiBzZXRFbmFibGVkKHRydWUpOyB9Ci0gICAgICAgICAgICBib29sICAgIGRpc2FibGUoKSAgIHsgcmV0dXJuIHNldEVuYWJsZWQoZmFsc2UpOyB9Ci0KLSAgICBzcDxJTWVtb3J5PiAgICAgZ2V0SU1lbW9yeSgpIGNvbnN0ICB7IHJldHVybiBtSU1lbW9yeTsgfQotCi1wcml2YXRlOgotICAgIC8vIDAgPD0gbGVuZ3RoIDw9IGtNYXhMZW5ndGgKLSAgICAvLyB3cml0ZXMgYSBzaW5nbGUgRW50cnkgdG8gdGhlIEZJRk8KLSAgICB2b2lkICAgIGxvZyhFdmVudCBldmVudCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7Ci0gICAgLy8gY2hlY2tzIHZhbGlkaXR5IG9mIGFuIGV2ZW50IGJlZm9yZSBjYWxsaW5nIGxvZyBhYm92ZSB0aGlzIG9uZQotICAgIHZvaWQgICAgbG9nKGNvbnN0IEVudHJ5ICplbnRyeSwgYm9vbCB0cnVzdGVkID0gZmFsc2UpOwotCi0gICAgU2hhcmVkKiBjb25zdCAgIG1TaGFyZWQ7ICAgIC8vIHJhdyBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnkKLSAgICBzcDxJTWVtb3J5PiAgICAgbUlNZW1vcnk7ICAgLy8gcmVmLWNvdW50ZWQgdmVyc2lvbiwgaW5pdGlhbGl6ZWQgaW4gY29uc3RydWN0b3IgYW5kIHRoZW4gY29uc3QKLSAgICBhdWRpb191dGlsc19maWZvICogY29uc3QgbUZpZm87ICAgICAgICAgICAgICAgICAvLyBGSUZPIGl0c2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub24tTlVMTCB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKLSAgICBhdWRpb191dGlsc19maWZvX3dyaXRlciAqIGNvbnN0IG1GaWZvV3JpdGVyOyAgICAvLyB1c2VkIHRvIHdyaXRlIHRvIEZJRk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLU5VTEwgdW5sZXNzIGR1bW15IGNvbnN0cnVjdG9yIHVzZWQKLSAgICBib29sICAgICAgICAgICAgbUVuYWJsZWQ7ICAgLy8gd2hldGhlciB0byBhY3R1YWxseSBsb2cKLQotICAgIC8vIGNhY2hlZCBwaWQgYW5kIHByb2Nlc3MgbmFtZSB0byB1c2UgaW4gJXAgZm9ybWF0IHNwZWNpZmllcgotICAgIC8vIHRvdGFsIHRhZyBsZW5ndGggaXMgbVBpZFRhZ1NpemUgYW5kIHByb2Nlc3MgbmFtZSBpcyBub3QgemVybyB0ZXJtaW5hdGVkCi0gICAgY2hhciAgICptUGlkVGFnOwotICAgIHNpemVfdCAgbVBpZFRhZ1NpemU7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gU2ltaWxhciB0byBXcml0ZXIsIGJ1dCBzYWZlIGZvciBtdWx0aXBsZSB0aHJlYWRzIHRvIGNhbGwgY29uY3VycmVudGx5Ci1jbGFzcyBMb2NrZWRXcml0ZXIgOiBwdWJsaWMgV3JpdGVyIHsKLXB1YmxpYzoKLSAgICBMb2NrZWRXcml0ZXIoKTsKLSAgICBMb2NrZWRXcml0ZXIodm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgICAgbG9nKGNvbnN0IGNoYXIgKnN0cmluZyk7Ci0gICAgdmlydHVhbCB2b2lkICAgIGxvZ2YoY29uc3QgY2hhciAqZm10LCAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgbG9ndmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgbG9nVGltZXN0YW1wKCk7Ci0gICAgdmlydHVhbCB2b2lkICAgIGxvZ1RpbWVzdGFtcChjb25zdCBpbnQ2NF90IHRzKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgbG9nSW50ZWdlcihjb25zdCBpbnQgeCk7Ci0gICAgdmlydHVhbCB2b2lkICAgIGxvZ0Zsb2F0KGNvbnN0IGZsb2F0IHgpOwotICAgIHZpcnR1YWwgdm9pZCAgICBsb2dQSUQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgbG9nU3RhcnQoY29uc3QgY2hhciAqZm10KTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRW5kKCk7Ci0gICAgdmlydHVhbCB2b2lkICAgIGxvZ0hhc2gobG9nX2hhc2hfdCBoYXNoKTsKLQotICAgIHZpcnR1YWwgYm9vbCAgICBpc0VuYWJsZWQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgICAgc2V0RW5hYmxlZChib29sIGVuYWJsZWQpOwotCi1wcml2YXRlOgotICAgIG11dGFibGUgTXV0ZXggICBtTG9jazsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSZWFkZXIgOiBwdWJsaWMgUmVmQmFzZSB7Ci1wdWJsaWM6Ci0KLSAgICAvLyBBIHNuYXBzaG90IG9mIGEgcmVhZGVycyBidWZmZXIKLSAgICAvLyBUaGlzIGlzIHJhdyBkYXRhLiBObyBhbmFseXNpcyBoYXMgYmVlbiBkb25lIG9uIGl0Ci0gICAgY2xhc3MgU25hcHNob3QgewotICAgIHB1YmxpYzoKLSAgICAgICAgU25hcHNob3QoKSA6IG1EYXRhKE5VTEwpLCBtTG9zdCgwKSB7fQotCi0gICAgICAgIFNuYXBzaG90KHNpemVfdCBidWZmZXJTaXplKSA6IG1EYXRhKG5ldyB1aW50OF90W2J1ZmZlclNpemVdKSB7fQotCi0gICAgICAgIH5TbmFwc2hvdCgpIHsgZGVsZXRlW10gbURhdGE7IH0KLQotICAgICAgICAvLyBjb3B5IG9mIHRoZSBidWZmZXIKLSAgICAgICAgdWludDhfdCAqZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1EYXRhOyB9Ci0KLSAgICAgICAgLy8gYW1vdW50IG9mIGRhdGEgbG9zdCAoZ2l2ZW4gYnkgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIpCi0gICAgICAgIHNpemVfdCAgIGxvc3QoKSBjb25zdCB7IHJldHVybiBtTG9zdDsgfQotCi0gICAgICAgIC8vIGl0ZXJhdG9yIHRvIGJlZ2lubmluZyBvZiByZWFkYWJsZSBzZWdtZW50IG9mIHNuYXBzaG90Ci0gICAgICAgIC8vIGRhdGEgYmV0d2VlbiBiZWdpbiBhbmQgZW5kIGhhcyB2YWxpZCBlbnRyaWVzCi0gICAgICAgIEVudHJ5SXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBtQmVnaW47IH0KLQotICAgICAgICAvLyBpdGVyYXRvciB0byBlbmQgb2YgcmVhZGFibGUgc2VnbWVudCBvZiBzbmFwc2hvdAotICAgICAgICBFbnRyeUl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIG1FbmQ7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGZyaWVuZCBjbGFzcyBSZWFkZXI7Ci0gICAgICAgIHVpbnQ4X3QgICAgICAgICAgICAgICptRGF0YTsKLSAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgIG1Mb3N0OwotICAgICAgICBFbnRyeUl0ZXJhdG9yIG1CZWdpbjsKLSAgICAgICAgRW50cnlJdGVyYXRvciBtRW5kOwotICAgIH07Ci0KLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXIgJ3NpemUnIGlzIHRoZSBkZXNpcmVkIHNpemUgb2YgdGhlIHRpbWVsaW5lIGluIGJ5dGUgdW5pdHMuCi0gICAgLy8gVGhlIHNpemUgb2YgdGhlIHNoYXJlZCBtZW1vcnkgbXVzdCBiZSBhdCBsZWFzdCBUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplKS4KLSAgICBSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk7Ci0gICAgUmVhZGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2aXJ0dWFsIH5SZWFkZXIoKTsKLQotICAgIC8vIGdldCBzbmFwc2hvdCBvZiByZWFkZXJzIGZpZm8gYnVmZmVyLCBlZmZlY3RpdmVseSBjb25zdW1pbmcgdGhlIGJ1ZmZlcgotICAgIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4gZ2V0U25hcHNob3QoKTsKLSAgICAvLyBkdW1wIGEgcGFydGljdWxhciBzbmFwc2hvdCBvZiB0aGUgcmVhZGVyCi0gICAgLy8gVE9ETzogbW92ZSBkdW1wIHRvIFBlcmZvcm1hbmNlQW5hbHlzaXMuIE1vZGVsL3ZpZXcvY29udHJvbGxlciBkZXNpZ24KLSAgICB2b2lkICAgICBkdW1wKGludCBmZCwgc2l6ZV90IGluZGVudCwgU25hcHNob3QgJiBzbmFwKTsKLSAgICAvLyBkdW1wIHRoZSBjdXJyZW50IGNvbnRlbnQgb2YgdGhlIHJlYWRlcidzIGJ1ZmZlciAoY2FsbCBnZXRTbmFwc2hvdCgpIGFuZCBwcmV2aW91cyBkdW1wKCkpCi0gICAgdm9pZCAgICAgZHVtcChpbnQgZmQsIHNpemVfdCBpbmRlbnQgPSAwKTsKLSAgICBib29sICAgICBpc0lNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnkpIGNvbnN0OwotCi1wcml2YXRlOgotCi0gICAgc3RhdGljIGNvbnN0IHN0ZDo6c2V0PEV2ZW50PiBzdGFydGluZ1R5cGVzOwotICAgIHN0YXRpYyBjb25zdCBzdGQ6OnNldDxFdmVudD4gZW5kaW5nVHlwZXM7Ci0gICAgLypjb25zdCovIFNoYXJlZCogY29uc3QgbVNoYXJlZDsgICAgLy8gcmF3IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeSwgYWN0dWFsbHkgY29uc3QgYnV0IG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlY2xhcmVkIGFzIGNvbnN0IGJlY2F1c2UgYXVkaW9fdXRpbHNfZmlmbygpIGNvbnN0cnVjdG9yCi0gICAgc3A8SU1lbW9yeT4gbUlNZW1vcnk7ICAgICAgIC8vIHJlZi1jb3VudGVkIHZlcnNpb24sIGFzc2lnbmVkIG9ubHkgaW4gY29uc3RydWN0b3IKLSAgICBpbnQgICAgIG1GZDsgICAgICAgICAgICAgICAgLy8gZmlsZSBkZXNjcmlwdG9yCi0gICAgaW50ICAgICBtSW5kZW50OyAgICAgICAgICAgIC8vIGluZGVudGF0aW9uIGxldmVsCi0gICAgYXVkaW9fdXRpbHNfZmlmbyAqIGNvbnN0IG1GaWZvOyAgICAgICAgICAgICAgICAgLy8gRklGTyBpdHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLU5VTEwgdW5sZXNzIGNvbnN0cnVjdG9yIGZhaWxzCi0gICAgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIgKiBjb25zdCBtRmlmb1JlYWRlcjsgICAgLy8gdXNlZCB0byByZWFkIGZyb20gRklGTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub24tTlVMTCB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKLQotICAgIC8vIFRPRE86IGl0IG1pZ2h0IGJlIGNsZWFyZXIsIGluc3RlYWQgb2YgYSBkaXJlY3QgbWFwIGZyb20gc291cmNlIGxvY2F0aW9uIHRvIHZlY3RvciBvZgotICAgIC8vIHRpbWVzdGFtcHMsIGlmIHdlIGluc3RlYWQgZmlyc3QgbWFwcGVkIGZyb20gc291cmNlIGxvY2F0aW9uIHRvIGFuIG9iamVjdCB0aGF0Ci0gICAgLy8gcmVwcmVzZW50ZWQgdGhhdCBsb2NhdGlvbi4gQW5kIG9uZV9vZiBpdHMgZmllbGRzIHdvdWxkIGJlIGEgdmVjdG9yIG9mIHRpbWVzdGFtcHMuCi0gICAgLy8gVGhhdCB3b3VsZCBhbGxvdyB1cyB0byByZWNvcmQgb3RoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNvdXJjZSBsb2NhdGlvbiBiZXlvbmQgdGltZXN0YW1wcy4KLSAgICB2b2lkICAgIGR1bXBMaW5lKGNvbnN0IFN0cmluZzgmIHRpbWVzdGFtcCwgU3RyaW5nOCYgYm9keSk7Ci0KLSAgICBFbnRyeUl0ZXJhdG9yICAgaGFuZGxlRm9ybWF0KGNvbnN0IEZvcm1hdEVudHJ5ICZmbXRFbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCAqdGltZXN0YW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4ICpib2R5KTsKLSAgICAvLyBkdW1teSBtZXRob2QgZm9yIGhhbmRsaW5nIGFic2VudCBhdXRob3IgZW50cnkKLSAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlQXV0aG9yKGNvbnN0IEFic3RyYWN0RW50cnkmIC8qZm10RW50cnkqLywgU3RyaW5nOCogLypib2R5Ki8pIHt9Ci0KLSAgICAvLyBTZWFyY2hlcyBmb3IgdGhlIGxhc3QgZW50cnkgb2YgdHlwZSA8dHlwZT4gaW4gdGhlIHJhbmdlIFtmcm9udCwgYmFjaykKLSAgICAvLyBiYWNrIGhhcyB0byBiZSBlbnRyeS1hbGlnbmVkLiBSZXR1cm5zIG51bGxwdHIgaWYgbm9uZSBlbmNvbnVudGVyZWQuCi0gICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgKmZpbmRMYXN0RW50cnlPZlR5cGVzKGNvbnN0IHVpbnQ4X3QgKmZyb250LCBjb25zdCB1aW50OF90ICpiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxFdmVudD4gJnR5cGVzKTsKLQotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1NxdWFzaFRpbWVzdGFtcCA9IDU7IC8vIHNxdWFzaCB0aGlzIG1hbnkgb3IgbW9yZSBhZGphY2VudCB0aW1lc3RhbXBzCi19OwotCi0vLyBXcmFwcGVyIGZvciBhIHJlYWRlciB3aXRoIGEgbmFtZS4gQ29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSByZWFkZXIgYW5kIGEgcG9pbnRlciB0byB0aGUgbmFtZQotY2xhc3MgTmFtZWRSZWFkZXIgewotcHVibGljOgotICAgIE5hbWVkUmVhZGVyKCkgeyBtTmFtZVswXSA9ICdcMCc7IH0gLy8gZm9yIFZlY3RvcgotICAgIE5hbWVkUmVhZGVyKGNvbnN0IHNwPE5CTG9nOjpSZWFkZXI+JiByZWFkZXIsIGNvbnN0IGNoYXIgKm5hbWUpIDoKLSAgICAgICAgbVJlYWRlcihyZWFkZXIpCi0gICAgICAgIHsgc3RybGNweShtTmFtZSwgbmFtZSwgc2l6ZW9mKG1OYW1lKSk7IH0KLSAgICB+TmFtZWRSZWFkZXIoKSB7IH0KLSAgICBjb25zdCBzcDxOQkxvZzo6UmVhZGVyPiYgIHJlYWRlcigpIGNvbnN0IHsgcmV0dXJuIG1SZWFkZXI7IH0KLSAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgIG5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQotCi1wcml2YXRlOgotICAgIHNwPE5CTG9nOjpSZWFkZXI+ICAgbVJlYWRlcjsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhOYW1lID0gMzI7Ci0gICAgY2hhciAgICAgICAgICAgICAgICBtTmFtZVtrTWF4TmFtZV07Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgTWVyZ2VyIDogcHVibGljIFJlZkJhc2UgewotcHVibGljOgotICAgIE1lcmdlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKTsKLQotICAgIHZpcnR1YWwgfk1lcmdlcigpIHt9Ci0KLSAgICB2b2lkIGFkZFJlYWRlcihjb25zdCBOYW1lZFJlYWRlciAmcmVhZGVyKTsKLSAgICAvLyBUT0RPIGFkZCByZW1vdmVSZWFkZXIKLSAgICB2b2lkIG1lcmdlKCk7Ci0gICAgLy8gRklYTUUgVGhpcyBpcyByZXR1cm5pbmcgYSByZWZlcmVuY2UgdG8gYSBzaGFyZWQgdmFyaWFibGUgdGhhdCBuZWVkcyBhIGxvY2sKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxOYW1lZFJlYWRlcj4mIGdldE5hbWVkUmVhZGVycygpIGNvbnN0OwotcHJpdmF0ZToKLSAgICAvLyB2ZWN0b3Igb2YgdGhlIHJlYWRlcnMgdGhlIG1lcmdlciBpcyBzdXBwb3NlZCB0byBtZXJnZSBmcm9tLgotICAgIC8vIGV2ZXJ5IHJlYWRlciByZWFkcyBmcm9tIGEgd3JpdGVyJ3MgYnVmZmVyCi0gICAgLy8gRklYTUUgTmVlZHMgdG8gYmUgcHJvdGVjdGVkIGJ5IGEgbG9jawotICAgIHN0ZDo6dmVjdG9yPE5hbWVkUmVhZGVyPiBtTmFtZWRSZWFkZXJzOwotCi0gICAgLy8gVE9ETyBOZWVkIGNvbW1lbnRzIG9uIGFsbCBvZiB0aGVzZQotICAgIFNoYXJlZCAqIGNvbnN0IG1TaGFyZWQ7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm8+IG1GaWZvOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gbUZpZm9Xcml0ZXI7Ci19OwotCi1jbGFzcyBNZXJnZVJlYWRlciA6IHB1YmxpYyBSZWFkZXIgewotcHVibGljOgotICAgIE1lcmdlUmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUsIE1lcmdlciAmbWVyZ2VyKTsKLXByaXZhdGU6Ci0gICAgLy8gRklYTUUgTmVlZHMgdG8gYmUgcHJvdGVjdGVkIGJ5IGEgbG9jaywKLSAgICAvLyAgICAgICBiZWNhdXNlIGV2ZW4gdGhvdWdoIG91ciB1c2Ugb2YgaXQgaXMgcmVhZC1vbmx5IHRoZXJlIG1heSBiZSBhc3luY2hyb25vdXMgdXBkYXRlcwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE5hbWVkUmVhZGVyPiYgbU5hbWVkUmVhZGVyczsKLSAgICAvLyBoYW5kbGUgYXV0aG9yIGVudHJ5IGJ5IGxvb2tpbmcgdXAgdGhlIGF1dGhvcidzIG5hbWUgYW5kIGFwcGVuZGluZyBpdCB0byB0aGUgYm9keQotICAgIC8vIHJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSBmbXRFbnRyeQotICAgIHZvaWQgaGFuZGxlQXV0aG9yKGNvbnN0IEFic3RyYWN0RW50cnkgJmZtdEVudHJ5LCBTdHJpbmc4ICpib2R5KTsKLX07Ci0KLS8vIE1lcmdlVGhyZWFkIGlzIGEgdGhyZWFkIHRoYXQgY29udGFpbnMgYSBNZXJnZXIuIEl0IHdvcmtzIGFzIGEgcmV0cmlnZ2VyYWJsZSBvbmUtc2hvdDoKLS8vIHdoZW4gdHJpZ2dlcmVkLCBpdCBhd2FrZXMgZm9yIGEgbGFwc2Ugb2YgdGltZSwgZHVyaW5nIHdoaWNoIGl0IHBlcmlvZGljYWxseSBtZXJnZXM7IGlmCi0vLyByZXRyaWdnZXJlZCwgdGhlIHRpbWVvdXQgaXMgcmVzZXQuCi0vLyBUaGUgdGhyZWFkIGlzIHRyaWdnZXJlZCBvbiBBdWRpb0ZsaW5nZXIgYmluZGVyIGFjdGl2aXR5LgotY2xhc3MgTWVyZ2VUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKLXB1YmxpYzoKLSAgICBNZXJnZVRocmVhZChNZXJnZXIgJm1lcmdlcik7Ci0gICAgdmlydHVhbCB+TWVyZ2VUaHJlYWQoKSBvdmVycmlkZTsKLQotICAgIC8vIFJlc2V0IHRpbWVvdXQgYW5kIGFjdGl2YXRlIHRocmVhZCB0byBtZXJnZSBwZXJpb2RpY2FsbHkgaWYgaXQncyBpZGxlCi0gICAgdm9pZCB3YWtldXAoKTsKLQotICAgIC8vIFNldCB0aW1lb3V0IHBlcmlvZCB1bnRpbCB0aGUgbWVyZ2luZyB0aHJlYWQgZ29lcyBpZGxlIGFnYWluCi0gICAgdm9pZCBzZXRUaW1lb3V0VXMoaW50IHRpbWUpOwotCi1wcml2YXRlOgotICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCkgb3ZlcnJpZGU7Ci0KLSAgICAvLyB0aGUgbWVyZ2VyIHdobyBhY3R1YWxseSBkb2VzIHRoZSB3b3JrIG9mIG1lcmdpbmcgdGhlIGxvZ3MKLSAgICBNZXJnZXImICAgICBtTWVyZ2VyOwotCi0gICAgLy8gbXV0ZXggZm9yIHRoZSBjb25kaXRpb24gdmFyaWFibGUKLSAgICBNdXRleCAgICAgICBtTXV0ZXg7Ci0KLSAgICAvLyBjb25kaXRpb24gdmFyaWFibGUgdG8gYWN0aXZhdGUgbWVyZ2luZyBvbiB0aW1lb3V0ID49IDAKLSAgICBDb25kaXRpb24gICBtQ29uZDsKLQotICAgIC8vIHRpbWUgbGVmdCB1bnRpbCB0aGUgdGhyZWFkIGJsb2NrcyBhZ2FpbiAoaW4gbWljcm9zZWNvbmRzKQotICAgIGludCAgICAgICAgIG1UaW1lb3V0VXM7Ci0KLSAgICAvLyBtZXJnaW5nIHBlcmlvZCB3aGVuIHRoZSB0aHJlYWQgaXMgYXdha2UKLSAgICBzdGF0aWMgY29uc3QgaW50ICBrVGhyZWFkU2xlZXBQZXJpb2RVcyA9IDEwMDAwMDAgLyoxcyovOwotCi0gICAgLy8gaW5pdGlhbCB0aW1lb3V0IHZhbHVlIHdoZW4gdHJpZ2dlcmVkCi0gICAgc3RhdGljIGNvbnN0IGludCAga1RocmVhZFdha2V1cFBlcmlvZFVzID0gMzAwMDAwMCAvKjNzKi87Ci19OwotCi19OyAgLy8gY2xhc3MgTkJMb2cKLQotLy8gVE9ETyBwdXQgc29tZXdoZXJlIGVsc2UKLXN0YXRpYyBpbmxpbmUgaW50NjRfdCBnZXRfbW9ub3RvbmljX25zKCkgewotICAgIHRpbWVzcGVjIHRzOwotICAgIGlmIChjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRzKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAodWludDY0X3QpIHRzLnR2X3NlYyAqIDEwMDAgKiAxMDAwICogMTAwMCArIHRzLnR2X25zZWM7Ci0gICAgfQotICAgIHJldHVybiAwOyAvLyBzaG91bGQgbm90IGhhcHBlbi4KLX0KLQotfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9OQkxPR19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1BlcmZvcm1hbmNlQW5hbHlzaXMuaCBiL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGVyZm9ybWFuY2VBbmFseXNpcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGRjMTQ4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGVyZm9ybWFuY2VBbmFseXNpcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBOb24tYmxvY2tpbmcgZXZlbnQgbG9nZ2VyIGludGVuZGVkIGZvciBzYWZlIGNvbW11bmljYXRpb24gYmV0d2VlbiBwcm9jZXNzZXMgdmlhIHNoYXJlZCBtZW1vcnkKLQotI2lmbmRlZiBBTkRST0lEX01FRElBX1BFUkZPUk1BTkNFQU5BTFlTSVNfSAotI2RlZmluZSBBTkRST0lEX01FRElBX1BFUkZPUk1BTkNFQU5BTFlTSVNfSAotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPGRlcXVlPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlICJOQkxvZy5oIgotI2luY2x1ZGUgIlJlcG9ydFBlcmZvcm1hbmNlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlIHsKLQotY2xhc3MgUGVyZm9ybWFuY2VBbmFseXNpcyB7Ci0gICAgLy8gVGhpcyBjbGFzcyBzdG9yZXMgYW5kIGFuYWx5emVzIGF1ZGlvIHByb2Nlc3Npbmcgd2FrZXVwIHRpbWVzdGFtcHMgZnJvbSBOQkxvZwotICAgIC8vIEZJWE1FOiBjdXJyZW50bHksIGFsbCBwZXJmb3JtYW5jZSBkYXRhIGlzIHN0b3JlZCBpbiBkZXF1ZXMuIE5lZWQgdG8gYWRkIGEgbXV0ZXguCi0gICAgLy8gRklYTUU6IGNvbnRpbnVlIHRoaXMgd2F5IHVudGlsIGFuYWx5c2lzIGlzIGRvbmUgaW4gYSBzZXBhcmF0ZSB0aHJlYWQuIFRoZW4sIHVzZQotICAgIC8vIHRoZSBmaWZvIHdyaXRlciB1dGlsaXRpZXMuCi1wdWJsaWM6Ci0KLSAgICBQZXJmb3JtYW5jZUFuYWx5c2lzKCk7Ci0KLSAgICAvLyBHaXZlbiBhIHNlcmllcyBvZiBhdWRpbyBwcm9jZXNzaW5nIHdha2V1cCB0aW1lc3RhbXBzLAotICAgIC8vIGNvbXByZXNzZXMgYW5kIGFuZCBhbmFseXplcyB0aGUgZGF0YSwgYW5kIGZsdXNoZXMKLSAgICAvLyB0aGUgdGltZXN0YW1wIHNlcmllcyBmcm9tIG1lbW9yeS4KLSAgICB2b2lkIHByb2Nlc3NBbmRGbHVzaFRpbWVTdGFtcFNlcmllcygpOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gYW4gYXVkaW8gb24vb2ZmIGV2ZW50IGlzIHJlYWQgZnJvbSB0aGUgYnVmZmVyLAotICAgIC8vIGUuZy4gRVZFTlRfQVVESU9fU1RBVEUuCi0gICAgLy8gY2FsbHMgZmx1c2hUaW1lU3RhbXBTZXJpZXMgb24gdGhlIGRhdGEgdXAgdG8gdGhlIGV2ZW50LAotICAgIC8vIGVmZmVjdGl2ZWx5IGRpc2NhcmRpbmcgdGhlIGlkbGUgYXVkaW8gdGltZSBpbnRlcnZhbAotICAgIHZvaWQgaGFuZGxlU3RhdGVDaGFuZ2UoKTsKLQotICAgIC8vIFdoZW4gdGhlIHNob3J0LXRlcm0gaGlzdG9ncmFtIGFycmF5IG1SZWNlbnRIaXN0cyBoYXMgcmVhY2hlZCBjYXBhY2l0eSwKLSAgICAvLyBtZXJnZXMgaGlzdG9ncmFtcyBmb3IgZGF0YSBjb21wcmVzc2lvbiBhbmQgc3RvcmVzIHRoZW0gaW4gbUxvbmdUZXJtSGlzdHMKLSAgICB2b2lkIHByb2Nlc3NBbmRGbHVzaFJlY2VudEhpc3RzKCk7Ci0KLSAgICAvLyBXcml0ZXMgd2FrZXVwIHRpbWVzdGFtcCBlbnRyeSB0byBsb2cgYW5kIHJ1bnMgYW5hbHlzaXMKLSAgICAvLyBUT0RPOiBtYWtlIHRoaXMgdGhyZWFkIHNhZmUuIEVhY2ggdGhyZWFkIHNob3VsZCBoYXZlIGl0cyBvd24gaW5zdGFuY2UKLSAgICAvLyBvZiBQZXJmb3JtYW5jZUFuYWx5c2lzLgotICAgIHZvaWQgbG9nVHNFbnRyeSh0aW1lc3RhbXBfcmF3IHRzKTsKLQotICAgIC8vIEZJWE1FOiBtYWtlIHBlYWtkZXRlY3RvciBhbmQgc3RvcmVPdXRsaWVyRGF0YSBhIHNpbmdsZSBmdW5jdGlvbgotICAgIC8vIElucHV0OiBtT3V0bGllckRhdGEuIExvb2tzIGF0IHRpbWUgZWxhcHNlZCBiZXR3ZWVuIG91dGxpZXJzCi0gICAgLy8gZmluZHMgc2lnbmlmaWNhbnQgY2hhbmdlcyBpbiB0aGUgZGlzdHJpYnV0aW9uCi0gICAgLy8gd3JpdGVzIHRpbWVzdGFtcHMgb2Ygc2lnbmlmaWNhbnQgY2hhbmdlcyB0byBtUGVha1RpbWVzdGFtcHMKLSAgICB2b2lkIGRldGVjdFBlYWtzKCk7Ci0KLSAgICAvLyBydW5zIGFuYWx5c2lzIG9uIHRpbWVzdGFtcCBzZXJpZXMgYmVmb3JlIGl0IGlzIGNvbnZlcnRlZCB0byBhIGhpc3RvZ3JhbQotICAgIC8vIGZpbmRzIG91dGxpZXJzCi0gICAgLy8gd3JpdGVzIHRvIG1PdXRsaWVyRGF0YSA8dGltZSBlbGFwc2VkIHNpbmNlIHByZXZpb3VzIG91dGxpZXIsIG91dGxpZXIgdGltZXN0YW1wPgotICAgIHZvaWQgc3RvcmVPdXRsaWVyRGF0YShjb25zdCBzdGQ6OnZlY3Rvcjx0aW1lc3RhbXBfcmF3PiAmdGltZXN0YW1wcyk7Ci0KLSAgICAvLyBpbnB1dDogc2VyaWVzIG9mIHNob3J0IGhpc3RvZ3JhbXMuIEdlbmVyYXRlcyBhIHN0cmluZyBvZiBhbmFseXNpcyBvZiB0aGUgYnVmZmVyIHBlcmlvZHMKLSAgICAvLyBUT0RPOiBXSVAgd3JpdGUgbW9yZSBkZXRhaWxlZCBhbmFseXNpcwotICAgIC8vIEZJWE1FOiBtb3ZlIHRoaXMgZGF0YSB2aXN1YWxpemF0aW9uIHRvIGEgc2VwYXJhdGUgY2xhc3MuIE1vZGVsL3ZpZXcvY29udHJvbGxlcgotICAgIHZvaWQgcmVwb3J0UGVyZm9ybWFuY2UoU3RyaW5nOCAqYm9keSwgaW50IG1heEhlaWdodCA9IDEwKTsKLQotICAgIC8vIFRPRE86IGRlbGV0ZSB0aGlzLiB0ZW1wIGZvciB0ZXN0aW5nCi0gICAgdm9pZCB0ZXN0RnVuY3Rpb24oKTsKLQotICAgIC8vIFRoaXMgZnVuY3Rpb24gdXNlZCB0byBkZXRlY3QgZ2xpdGNoZXMgaW4gYSB0aW1lIHNlcmllcwotICAgIC8vIFRPRE8gaW5jb3Jwb3JhdGUgdGhpcyBpbnRvIHRoZSBhbmFseXNpcyAoY3VycmVudGx5IHVudXNlZCkKLSAgICB2b2lkIGFsZXJ0SWZHbGl0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8dGltZXN0YW1wX3Jhdz4gJnNhbXBsZXMpOwotCi1wcml2YXRlOgotCi0gICAgLy8gc3RvcmVzIG91dGxpZXIgYW5hbHlzaXM6IDxlbGFwc2VkIHRpbWUgYmV0d2VlbiBvdXRsaWVycyBpbiBtcywgb3V0bGllciB0aW1lc3RhbXA+Ci0gICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8b3V0bGllckludGVydmFsLCB0aW1lc3RhbXA+PiBtT3V0bGllckRhdGE7Ci0KLSAgICAvLyBzdG9yZXMgZWFjaCB0aW1lc3RhbXAgYXQgd2hpY2ggYSBwZWFrIHdhcyBkZXRlY3RlZAotICAgIC8vIGEgcGVhayBpcyBhIG1vbWVudCBhdCB3aGljaCB0aGUgYXZlcmFnZSBvdXRsaWVyIGludGVydmFsIGNoYW5nZWQgc2lnbmlmaWNhbnRseQotICAgIHN0ZDo6ZGVxdWU8dGltZXN0YW1wPiBtUGVha1RpbWVzdGFtcHM7Ci0KLSAgICAvLyBUT0RPOiB0dXJuIHRoZXNlIGludG8gY2lyY3VsYXIgYnVmZmVycyBmb3IgYmV0dGVyIGRhdGEgZmxvdwotICAgIC8vIEZJRk8gb2Ygc21hbGwgaGlzdG9ncmFtcwotICAgIC8vIHN0b3JlcyBmaXhlZC1zaXplIHNob3J0IGJ1ZmZlciBwZXJpb2QgaGlzdG9ncmFtcyB3aXRoIHRpbWVzdGFtcCBvZiBmaXJzdCBzYW1wbGUKLSAgICBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjx0aW1lc3RhbXAsIEhpc3RvZ3JhbT4+IG1SZWNlbnRIaXN0czsKLQotICAgIC8vIEZJRk8gb2Ygc21hbGwgaGlzdG9ncmFtcwotICAgIC8vIHN0b3JlcyBmaXhlZC1zaXplIGxvbmctdGVybSBidWZmZXIgcGVyaW9kIGhpc3RvZ3JhbXMgd2l0aCB0aW1lc3RhbXAgb2YgZmlyc3Qgc2FtcGxlCi0gICAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8dGltZXN0YW1wLCBIaXN0b2dyYW0+PiBtTG9uZ1Rlcm1IaXN0czsKLQotICAgIC8vIHZlY3RvciBvZiB0aW1lc3RhbXBzLCBjb2xsZWN0ZWQgZnJvbSBOQkxvZyBmb3IgYSAoVE9ETykgc3BlY2lmaWMgdGhyZWFkCi0gICAgLy8gd2hlbiBhIHZlY3RvciByZWFjaGVzIGl0cyBtYXhpbXVtIHNpemUsIHRoZSBkYXRhIGlzIHByb2Nlc3NlZCBhbmQgZmx1c2hlZAotICAgIHN0ZDo6dmVjdG9yPHRpbWVzdGFtcF9yYXc+IG1UaW1lU3RhbXBTZXJpZXM7Ci0KLSAgICBzdGF0aWMgY29uc3QgaW50IGtNc1BlclNlYyA9IDEwMDA7Ci0KLSAgICAvLyBQYXJhbWV0ZXJzIHVzZWQgd2hlbiBkZXRlY3Rpbmcgb3V0bGllcnMKLSAgICAvLyBUT0RPOiBsZWFybiBzb21lIG9mIHRoZXNlIGZyb20gdGhlIGRhdGEsIGRlbGV0ZSB1bnVzZWQgb25lcwotICAgIC8vIEZJWE1FOiBkZWNpZGUgd2hldGhlciB0byBtYWtlIGtQZXJpb2RNcyBzdGF0aWMuCi0gICAgc3RhdGljIGNvbnN0IGludCBrTnVtQnVmZiA9IDM7IC8vIG51bWJlciBvZiBidWZmZXJzIGNvbnNpZGVyZWQgaW4gbG9jYWwgaGlzdG9yeQotICAgIGludCBrUGVyaW9kTXM7IC8vIGN1cnJlbnQgcGVyaW9kIGxlbmd0aCBpcyBpZGVhbGx5IDQgbXMKLSAgICBzdGF0aWMgY29uc3QgaW50IGtPdXRsaWVyTXMgPSA3OyAvLyB2YWx1ZXMgZ3JlYXRlciBvciBlcXVhbCB0byB0aGlzIGNhdXNlIGdsaXRjaGVzCi0gICAgLy8gREFDIHByb2Nlc3NpbmcgdGltZSBmb3IgNCBtcyBidWZmZXIKLSAgICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrUmF0aW8gPSAwLjc1OyAvLyBlc3RpbWF0ZSBvZiBDUFUgdGltZSBhcyByYXRpbyBvZiBwZXJpb2QgbGVuZ3RoCi0gICAgaW50IGtQZXJpb2RNc0NQVTsgLy8gY29tcHV0ZSBiYXNlZCBvbiBrUGVyaW9kTGVuIGFuZCBrUmF0aW8KLQotICAgIC8vIFBlYWsgZGV0ZWN0aW9uOiBudW1iZXIgb2Ygc3RhbmRhcmQgZGV2aWF0aW9ucyBmcm9tIG1lYW4gY29uc2lkZXJlZCBhIHNpZ25pZmljYW50IGNoYW5nZQotICAgIHN0YXRpYyBjb25zdCBpbnQga1N0ZGRldlRocmVzaG9sZCA9IDU7Ci0KLSAgICAvLyBjYXBhY2l0eSBhbGxvY2F0ZWQgdG8gZGF0YSBzdHJ1Y3R1cmVzCi0gICAgLy8gVE9ETzogYWRqdXN0IGFsbCBvZiB0aGVzZSB2YWx1ZXMKLSAgICBzdGF0aWMgY29uc3QgaW50IGtSZWNlbnRIaXN0c0NhcGFjaXR5ID0gMTAwOyAvLyBudW1iZXIgb2Ygc2hvcnQtdGVybSBoaXN0b2dyYW1zIHN0b3JlZCBpbiBtZW1vcnkKLSAgICBzdGF0aWMgY29uc3QgaW50IGtTaG9ydEhpc3RTaXplID0gNTA7IC8vIG51bWJlciBvZiBzYW1wbGVzIGluIGEgc2hvcnQtdGVybSBoaXN0b2dyYW0KLSAgICBzdGF0aWMgY29uc3QgaW50IGtPdXRsaWVyU2VyaWVzU2l6ZSA9IDEwMDsgLy8gbnVtYmVyIG9mIHZhbHVlcyBzdG9yZWQgaW4gb3V0bGllciBhcnJheQotICAgIHN0YXRpYyBjb25zdCBpbnQga1BlYWtTZXJpZXNTaXplID0gMTAwOyAvLyBudW1iZXIgb2YgdmFsdWVzIHN0b3JlZCBpbiBwZWFrIGFycmF5Ci0gICAgc3RhdGljIGNvbnN0IGludCBrTG9uZ1Rlcm1IaXN0c0NhcGFjaXR5ID0gMjA7IC8vIG51bWJlciBvZiBsb25nLXRlcm0gaGlzdG9ncmFtIHN0b3JlZCBpbiBtZW1vcnkKLSAgICAvLyBtYXhpbXVtIGVsYXBzZWQgdGltZSBiZXR3ZWVuIGZpcnN0IGFuZCBsYXN0IHRpbWVzdGFtcCBvZiBhIGxvbmctdGVybSBoaXN0b2dyYW0KLSAgICBzdGF0aWMgY29uc3QgaW50IGtNYXhIaXN0VGltZXNwYW5NcyA9IDUgKiBrTXNQZXJTZWM7Ci0KLSAgICAvLyB0aGVzZSB2YXJpYWJsZXMgYXJlIHN0b3JlZCBpbi1jbGFzcyB0byBlbnN1cmUgY29udGludWl0eSB3aGlsZSBhbmFseXppbmcgdGhlIHRpbWVzdGFtcAotICAgIC8vIHNlcmllcyBvbmUgc2hvcnQgc2VxdWVuY2UgYXQgYSB0aW1lOiB0aGUgdmFyaWFibGVzIGFyZSBub3QgcmUtaW5pdGlhbGl6ZWQgZXZlcnkgdGltZS4KLSAgICAvLyBGSVhNRTogY3JlYXRlIGlubmVyIGNsYXNzIGZvciB0aGVzZSB2YXJpYWJsZXMgYW5kIGRlY2lkZSB3aGljaCBvdGhlciBvbmVzIHRvIGFkZCB0byBpdAotICAgIGRvdWJsZSBtUGVha0RldGVjdG9yTWVhbiA9IC0xOwotICAgIGRvdWJsZSBtUGVha0RldGVjdG9yU2QgPSAtMTsKLSAgICAvLyB2YXJpYWJsZXMgZm9yIHN0b3JlT3V0bGllckRhdGEKLSAgICB1aW50NjRfdCBtRWxhcHNlZCA9IDA7Ci0gICAgaW50NjRfdCBtUHJldk5zID0gLTE7Ci0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCi0KLX0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFORFJPSURfTUVESUFfUEVSRk9STUFOQ0VBTkFMWVNJU19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1JlcG9ydFBlcmZvcm1hbmNlLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1JlcG9ydFBlcmZvcm1hbmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZDI4MTAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9SZXBvcnRQZXJmb3JtYW5jZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9NRURJQV9SRVBPUlRQRVJGT1JNQU5DRV9ICi0jZGVmaW5lIEFORFJPSURfTUVESUFfUkVQT1JUUEVSRk9STUFOQ0VfSAotCi0jaW5jbHVkZSA8ZGVxdWU+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBUaGlzIGNsYXNzIGlzIHVzZWQgYnkgcmVwb3J0UGVyZm9ybWFuY2UgZnVuY3Rpb24KLS8vIFRPRE8gbW92ZSByZXBvcnRQZXJmb3JtYW5jZSBmdW5jdGlvbiB0byBSZXBvcnRQZXJmb3JtYW5jZS5jcHAKLWNsYXNzIFN0cmluZzg7Ci0KLW5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZSB7Ci0KLS8vIHN0b3JlcyBhIGhpc3RvZ3JhbToga2V5OiBvYnNlcnZlZCBidWZmZXIgcGVyaW9kLiB2YWx1ZTogY291bnQKLS8vIFRPRE86IHVuc2lnbmVkLCB1bnNpZ25lZAotdXNpbmcgSGlzdG9ncmFtID0gc3RkOjptYXA8aW50LCBpbnQ+OwotCi11c2luZyBvdXRsaWVySW50ZXJ2YWwgPSB1aW50NjRfdDsKLS8vIGludDY0X3QgdGltZXN0YW1wcyBhcmUgY29udmVydGVkIHRvIHVpbnQ2NF90IGluIFBlcmZvcm1hbmNlQW5hbHlzaXM6OnN0b3JlT3V0bGllckRhdGEsCi0vLyBhbmQgYWxsIGFuYWx5c2lzIGZ1bmN0aW9ucyB1c2UgdWludDY0X3QuCi11c2luZyB0aW1lc3RhbXAgPSB1aW50NjRfdDsKLXVzaW5nIHRpbWVzdGFtcF9yYXcgPSBpbnQ2NF90OwotCi0vLyBGSVhNRTogZGVjaWRlIHdoZXRoZXIgdG8gdXNlIDY0IG9yIDMyIGJpdHMKLS8vIFRPRE86IHRoZSBjb2RlIGhhcyBhIG1peCBvZiB0eXBlZGVmIGFuZCB1c2luZy4gU3RhbmRhcmRpemUgdG8gb25lIG9yIHRoZSBvdGhlci4KLXR5cGVkZWYgdWludDY0X3QgbG9nX2hhc2hfdDsKLQotc3RhdGljIGlubGluZSBpbnQgZGVsdGFNcyhpbnQ2NF90IG5zMSwgaW50NjRfdCBuczIpIHsKLSAgICByZXR1cm4gKG5zMiAtIG5zMSkgLyAoMTAwMCAqIDEwMDApOwotfQotCi1zdGF0aWMgaW5saW5lIHVpbnQzMl90IGxvZzIodWludDMyX3QgeCkgewotICAgIC8vIFRoaXMgd29ya3MgZm9yIHggPiAwCi0gICAgcmV0dXJuIDMxIC0gX19idWlsdGluX2Nseih4KTsKLX0KLQotLy8gV3JpdGVzIG91dGxpZXIgaW50ZXJ2YWxzLCB0aW1lc3RhbXBzLCBhbmQgaGlzdG9ncmFtcyBzcGFubmluZyBsb25nIHRpbWUKLS8vIGludGVydmFscyB0byBhIGZpbGUuCi12b2lkIHdyaXRlVG9GaWxlKHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPG91dGxpZXJJbnRlcnZhbCwgdGltZXN0YW1wPj4gJm91dGxpZXJEYXRhLAotICAgICAgICAgICAgICAgICBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjx0aW1lc3RhbXAsIEhpc3RvZ3JhbT4+ICZoaXN0cywKLSAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGtOYW1lLAotICAgICAgICAgICAgICAgICBib29sIGFwcGVuZCk7Ci0KLX0gLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCi0KLX0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFORFJPSURfTUVESUFfUkVQT1JUUEVSRk9STUFOQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvQW5kcm9pZC5icCBiL21lZGlhL2xpYm5ibG9nL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRhYWY3NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyOCBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworCisgICAgbmFtZTogImxpYm5ibG9nIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIk5CTG9nLmNwcCIsCisgICAgICAgICJQZXJmb3JtYW5jZUFuYWx5c2lzLmNwcCIsCisgICAgICAgICJSZXBvcnRQZXJmb3JtYW5jZS5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWyJzeXN0ZW0vbWVkaWEvYXVkaW9fdXRpbHMvaW5jbHVkZSJdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL05CTG9nLmNwcCBiL21lZGlhL2xpYm5ibG9nL05CTG9nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmZhM2UzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvTkJMb2cuY3BwCkBAIC0wLDAgKzEsMTE1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJOQkxvZyIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPG51bWVyaWM+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9yb3VuZHVwLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9DYWxsU3RhY2suaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2ludCBOQkxvZzo6RW50cnk6OmNvcHlFbnRyeURhdGFBdChzaXplX3Qgb2Zmc2V0KSBjb25zdAoreworICAgIC8vIEZJWE1FIFRoaXMgaXMgdG9vIHNsb3cKKyAgICBpZiAob2Zmc2V0ID09IDApCisgICAgICAgIHJldHVybiBtRXZlbnQ7CisgICAgZWxzZSBpZiAob2Zmc2V0ID09IDEpCisgICAgICAgIHJldHVybiBtTGVuZ3RoOworICAgIGVsc2UgaWYgKG9mZnNldCA8IChzaXplX3QpIChtTGVuZ3RoICsgMikpCisgICAgICAgIHJldHVybiAoKGNoYXIgKikgbURhdGEpW29mZnNldCAtIDJdOworICAgIGVsc2UgaWYgKG9mZnNldCA9PSAoc2l6ZV90KSAobUxlbmd0aCArIDIpKQorICAgICAgICByZXR1cm4gbUxlbmd0aDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLypzdGF0aWMqLworc3RkOjp1bmlxdWVfcHRyPE5CTG9nOjpBYnN0cmFjdEVudHJ5PiBOQkxvZzo6QWJzdHJhY3RFbnRyeTo6YnVpbGRFbnRyeShjb25zdCB1aW50OF90ICpwdHIpIHsKKyAgICBjb25zdCB1aW50OF90IHR5cGUgPSBFbnRyeUl0ZXJhdG9yKHB0ciktPnR5cGU7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBFVkVOVF9TVEFSVF9GTVQ6CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEZvcm1hdEVudHJ5PihGb3JtYXRFbnRyeShwdHIpKTsKKyAgICBjYXNlIEVWRU5UX0FVRElPX1NUQVRFOgorICAgIGNhc2UgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTOgorICAgICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxIaXN0b2dyYW1FbnRyeT4oSGlzdG9ncmFtRW50cnkocHRyKSk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR1coIlRyaWVkIHRvIGNyZWF0ZSBBYnN0cmFjdEVudHJ5IG9mIHR5cGUgJWQiLCB0eXBlKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorfQorCitOQkxvZzo6QWJzdHJhY3RFbnRyeTo6QWJzdHJhY3RFbnRyeShjb25zdCB1aW50OF90ICplbnRyeSkgOiBtRW50cnkoZW50cnkpIHsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05CTG9nOjpFbnRyeUl0ZXJhdG9yIE5CTG9nOjpGb3JtYXRFbnRyeTo6YmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KTsKK30KKworY29uc3QgY2hhciAqTkJMb2c6OkZvcm1hdEVudHJ5Ojpmb3JtYXRTdHJpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIChjb25zdCBjaGFyKikgbUVudHJ5ICsgb2Zmc2V0b2YoZW50cnksIGRhdGEpOworfQorCitzaXplX3QgTkJMb2c6OkZvcm1hdEVudHJ5Ojpmb3JtYXRTdHJpbmdMZW5ndGgoKSBjb25zdCB7CisgICAgcmV0dXJuIG1FbnRyeVtvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV07Cit9CisKK05CTG9nOjpFbnRyeUl0ZXJhdG9yIE5CTG9nOjpGb3JtYXRFbnRyeTo6YXJncygpIGNvbnN0IHsKKyAgICBhdXRvIGl0ID0gYmVnaW4oKTsKKyAgICAvLyBza2lwIHN0YXJ0IGZtdAorICAgICsraXQ7CisgICAgLy8gc2tpcCB0aW1lc3RhbXAKKyAgICArK2l0OworICAgIC8vIHNraXAgaGFzaAorICAgICsraXQ7CisgICAgLy8gU2tpcCBhdXRob3IgaWYgcHJlc2VudAorICAgIGlmIChpdC0+dHlwZSA9PSBFVkVOVF9BVVRIT1IpIHsKKyAgICAgICAgKytpdDsKKyAgICB9CisgICAgcmV0dXJuIGl0OworfQorCitpbnQ2NF90IE5CTG9nOjpGb3JtYXRFbnRyeTo6dGltZXN0YW1wKCkgY29uc3QgeworICAgIGF1dG8gaXQgPSBiZWdpbigpOworICAgIC8vIHNraXAgc3RhcnQgZm10CisgICAgKytpdDsKKyAgICByZXR1cm4gaXQucGF5bG9hZDxpbnQ2NF90PigpOworfQorCitOQkxvZzo6bG9nX2hhc2hfdCBOQkxvZzo6Rm9ybWF0RW50cnk6Omhhc2goKSBjb25zdCB7CisgICAgYXV0byBpdCA9IGJlZ2luKCk7CisgICAgLy8gc2tpcCBzdGFydCBmbXQKKyAgICArK2l0OworICAgIC8vIHNraXAgdGltZXN0YW1wCisgICAgKytpdDsKKyAgICAvLyB1bmFsaWduZWQgNjQtYml0IHJlYWQgbm90IHN1cHBvcnRlZAorICAgIGxvZ19oYXNoX3QgaGFzaDsKKyAgICBtZW1jcHkoJmhhc2gsIGl0LT5kYXRhLCBzaXplb2YoaGFzaCkpOworICAgIHJldHVybiBoYXNoOworfQorCitpbnQgTkJMb2c6OkZvcm1hdEVudHJ5OjphdXRob3IoKSBjb25zdCB7CisgICAgYXV0byBpdCA9IGJlZ2luKCk7CisgICAgLy8gc2tpcCBzdGFydCBmbXQKKyAgICArK2l0OworICAgIC8vIHNraXAgdGltZXN0YW1wCisgICAgKytpdDsKKyAgICAvLyBza2lwIGhhc2gKKyAgICArK2l0OworICAgIC8vIGlmIHRoZXJlIGlzIGFuIGF1dGhvciBlbnRyeSwgcmV0dXJuIGl0LCByZXR1cm4gLTEgb3RoZXJ3aXNlCisgICAgaWYgKGl0LT50eXBlID09IEVWRU5UX0FVVEhPUikgeworICAgICAgICByZXR1cm4gaXQucGF5bG9hZDxpbnQ+KCk7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworTkJMb2c6OkVudHJ5SXRlcmF0b3IgTkJMb2c6OkZvcm1hdEVudHJ5Ojpjb3B5V2l0aEF1dGhvcigKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LCBpbnQgYXV0aG9yKSBjb25zdCB7CisgICAgYXV0byBpdCA9IGJlZ2luKCk7CisgICAgLy8gY29weSBmbXQgc3RhcnQgZW50cnkKKyAgICBpdC5jb3B5VG8oZHN0KTsKKyAgICAvLyBjb3B5IHRpbWVzdGFtcAorICAgICgrK2l0KS5jb3B5VG8oZHN0KTsgICAgLy8gY29weSBoYXNoCisgICAgKCsraXQpLmNvcHlUbyhkc3QpOworICAgIC8vIGluc2VydCBhdXRob3IgZW50cnkKKyAgICBzaXplX3QgYXV0aG9yRW50cnlTaXplID0gTkJMb2c6OkVudHJ5OjprT3ZlcmhlYWQgKyBzaXplb2YoYXV0aG9yKTsKKyAgICB1aW50OF90IGF1dGhvckVudHJ5W2F1dGhvckVudHJ5U2l6ZV07CisgICAgYXV0aG9yRW50cnlbb2Zmc2V0b2YoZW50cnksIHR5cGUpXSA9IEVWRU5UX0FVVEhPUjsKKyAgICBhdXRob3JFbnRyeVtvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gPQorICAgICAgICBhdXRob3JFbnRyeVthdXRob3JFbnRyeVNpemUgKyBOQkxvZzo6RW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldF0gPQorICAgICAgICBzaXplb2YoYXV0aG9yKTsKKyAgICAqKGludCopICgmYXV0aG9yRW50cnlbb2Zmc2V0b2YoZW50cnksIGRhdGEpXSkgPSBhdXRob3I7CisgICAgZHN0LT53cml0ZShhdXRob3JFbnRyeSwgYXV0aG9yRW50cnlTaXplKTsKKyAgICAvLyBjb3B5IHJlc3Qgb2YgZW50cmllcworICAgIHdoaWxlICgoKytpdCktPnR5cGUgIT0gRVZFTlRfRU5EX0ZNVCkgeworICAgICAgICBpdC5jb3B5VG8oZHN0KTsKKyAgICB9CisgICAgaXQuY29weVRvKGRzdCk7CisgICAgKytpdDsKKyAgICByZXR1cm4gaXQ7Cit9CisKK3ZvaWQgTkJMb2c6OkVudHJ5SXRlcmF0b3I6OmNvcHlUbyhzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QpIGNvbnN0IHsKKyAgICBzaXplX3QgbGVuZ3RoID0gcHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSArIE5CTG9nOjpFbnRyeTo6a092ZXJoZWFkOworICAgIGRzdC0+d3JpdGUocHRyLCBsZW5ndGgpOworfQorCit2b2lkIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpjb3B5RGF0YSh1aW50OF90ICpkc3QpIGNvbnN0IHsKKyAgICBtZW1jcHkoKHZvaWQqKSBkc3QsIHB0ciArIG9mZnNldG9mKGVudHJ5LCBkYXRhKSwgcHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSk7Cit9CisKK05CTG9nOjpFbnRyeUl0ZXJhdG9yOjpFbnRyeUl0ZXJhdG9yKCkKKyAgICA6IHB0cihudWxscHRyKSB7fQorCitOQkxvZzo6RW50cnlJdGVyYXRvcjo6RW50cnlJdGVyYXRvcihjb25zdCB1aW50OF90ICplbnRyeSkKKyAgICA6IHB0cihlbnRyeSkge30KKworTkJMb2c6OkVudHJ5SXRlcmF0b3I6OkVudHJ5SXRlcmF0b3IoY29uc3QgTkJMb2c6OkVudHJ5SXRlcmF0b3IgJm90aGVyKQorICAgIDogcHRyKG90aGVyLnB0cikge30KKworY29uc3QgTkJMb2c6OmVudHJ5JiBOQkxvZzo6RW50cnlJdGVyYXRvcjo6b3BlcmF0b3IqKCkgY29uc3QgeworICAgIHJldHVybiAqKGVudHJ5KikgcHRyOworfQorCitjb25zdCBOQkxvZzo6ZW50cnkqIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvci0+KCkgY29uc3QgeworICAgIHJldHVybiAoZW50cnkqKSBwdHI7Cit9CisKK05CTG9nOjpFbnRyeUl0ZXJhdG9yJiBOQkxvZzo6RW50cnlJdGVyYXRvcjo6b3BlcmF0b3IrKygpIHsKKyAgICBwdHIgKz0gcHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSArIE5CTG9nOjpFbnRyeTo6a092ZXJoZWFkOworICAgIHJldHVybiAqdGhpczsKK30KKworTkJMb2c6OkVudHJ5SXRlcmF0b3ImIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvci0tKCkgeworICAgIHB0ciAtPSBwdHJbTkJMb2c6OkVudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXRdICsgTkJMb2c6OkVudHJ5OjprT3ZlcmhlYWQ7CisgICAgcmV0dXJuICp0aGlzOworfQorCitOQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6RW50cnlJdGVyYXRvcjo6bmV4dCgpIGNvbnN0IHsKKyAgICBFbnRyeUl0ZXJhdG9yIGF1eCgqdGhpcyk7CisgICAgcmV0dXJuICsrYXV4OworfQorCitOQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6RW50cnlJdGVyYXRvcjo6cHJldigpIGNvbnN0IHsKKyAgICBFbnRyeUl0ZXJhdG9yIGF1eCgqdGhpcyk7CisgICAgcmV0dXJuIC0tYXV4OworfQorCitpbnQgTkJMb2c6OkVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yLShjb25zdCBOQkxvZzo6RW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gcHRyIC0gb3RoZXIucHRyOworfQorCitib29sIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvciE9KGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIHB0ciAhPSBvdGhlci5wdHI7Cit9CisKK2Jvb2wgTkJMb2c6OkVudHJ5SXRlcmF0b3I6Omhhc0NvbnNpc3RlbnRMZW5ndGgoKSBjb25zdCB7CisgICAgcmV0dXJuIHB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gPT0gcHRyW3B0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gKworICAgICAgICBOQkxvZzo6RW50cnk6OmtPdmVyaGVhZCArIE5CTG9nOjpFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludDY0X3QgTkJMb2c6Okhpc3RvZ3JhbUVudHJ5Ojp0aW1lc3RhbXAoKSBjb25zdCB7CisgICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KS5wYXlsb2FkPEhpc3RUc0VudHJ5PigpLnRzOworfQorCitOQkxvZzo6bG9nX2hhc2hfdCBOQkxvZzo6SGlzdG9ncmFtRW50cnk6Omhhc2goKSBjb25zdCB7CisgICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KS5wYXlsb2FkPEhpc3RUc0VudHJ5PigpLmhhc2g7Cit9CisKK2ludCBOQkxvZzo6SGlzdG9ncmFtRW50cnk6OmF1dGhvcigpIGNvbnN0IHsKKyAgICBFbnRyeUl0ZXJhdG9yIGl0KG1FbnRyeSk7CisgICAgaWYgKGl0LT5sZW5ndGggPT0gc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcikpIHsKKyAgICAgICAgcmV0dXJuIGl0LnBheWxvYWQ8SGlzdFRzRW50cnlXaXRoQXV0aG9yPigpLmF1dGhvcjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCitOQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6SGlzdG9ncmFtRW50cnk6OmNvcHlXaXRoQXV0aG9yKAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsIGludCBhdXRob3IpIGNvbnN0IHsKKyAgICAvLyBDdXJyZW50IGhpc3RvZ3JhbSBlbnRyeSBoYXMge3R5cGUsIGxlbmd0aCwgc3RydWN0IEhpc3RUc0VudHJ5LCBsZW5ndGh9LgorICAgIC8vIFdlIG5vdyB3YW50IHt0eXBlLCBsZW5ndGgsIHN0cnVjdCBIaXN0VHNFbnRyeVdpdGhBdXRob3IsIGxlbmd0aH0KKyAgICB1aW50OF90IGJ1ZmZlcltFbnRyeTo6a092ZXJoZWFkICsgc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcildOworICAgIC8vIENvcHkgY29udGVudCB1bnRpbCB0aGUgcG9pbnQgd2Ugd2FudCB0byBhZGQgdGhlIGF1dGhvcgorICAgIG1lbWNweShidWZmZXIsIG1FbnRyeSwgc2l6ZW9mKGVudHJ5KSArIHNpemVvZihIaXN0VHNFbnRyeSkpOworICAgIC8vIENvcHkgdGhlIGF1dGhvcgorICAgICooaW50KikgKGJ1ZmZlciArIHNpemVvZihlbnRyeSkgKyBzaXplb2YoSGlzdFRzRW50cnkpKSA9IGF1dGhvcjsKKyAgICAvLyBVcGRhdGUgbGVuZ3RocworICAgIGJ1ZmZlcltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gPSBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKTsKKyAgICBidWZmZXJbb2Zmc2V0b2YoZW50cnksIGRhdGEpICsgc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcikgKyBvZmZzZXRvZihlbmRpbmcsIGxlbmd0aCldCisgICAgICAgID0gc2l6ZW9mKEhpc3RUc0VudHJ5V2l0aEF1dGhvcik7CisgICAgLy8gV3JpdGUgbmV3IGJ1ZmZlciBpbnRvIEZJRk8KKyAgICBkc3QtPndyaXRlKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICAgIHJldHVybiBFbnRyeUl0ZXJhdG9yKG1FbnRyeSkubmV4dCgpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIDAgICAvLyBGSVhNRSBzZWUgbm90ZSBpbiBOQkxvZy5oCitOQkxvZzo6VGltZWxpbmU6OlRpbWVsaW5lKHNpemVfdCBzaXplLCB2b2lkICpzaGFyZWQpCisgICAgOiBtU2l6ZShyb3VuZHVwKHNpemUpKSwgbU93bihzaGFyZWQgPT0gTlVMTCksCisgICAgICBtU2hhcmVkKChTaGFyZWQgKikgKG1Pd24gPyBuZXcgY2hhcltzaGFyZWRTaXplKHNpemUpXSA6IHNoYXJlZCkpCit7CisgICAgbmV3IChtU2hhcmVkKSBTaGFyZWQ7Cit9CisKK05CTG9nOjpUaW1lbGluZTo6flRpbWVsaW5lKCkKK3sKKyAgICBtU2hhcmVkLT5+U2hhcmVkKCk7CisgICAgaWYgKG1Pd24pIHsKKyAgICAgICAgZGVsZXRlW10gKGNoYXIgKikgbVNoYXJlZDsKKyAgICB9Cit9CisjZW5kaWYKKworLypzdGF0aWMqLworc2l6ZV90IE5CTG9nOjpUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplX3Qgc2l6ZSkKK3sKKyAgICAvLyBUT0RPIGZpZm8gbm93IHN1cHBvcnRzIG5vbi1wb3dlci1vZi0yIGJ1ZmZlciBzaXplcywgc28gY291bGQgcmVtb3ZlIHRoZSByb3VuZHVwCisgICAgcmV0dXJuIHNpemVvZihTaGFyZWQpICsgcm91bmR1cChzaXplKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05CTG9nOjpXcml0ZXI6OldyaXRlcigpCisgICAgOiBtU2hhcmVkKE5VTEwpLCBtRmlmbyhOVUxMKSwgbUZpZm9Xcml0ZXIoTlVMTCksIG1FbmFibGVkKGZhbHNlKSwgbVBpZFRhZyhOVUxMKSwgbVBpZFRhZ1NpemUoMCkKK3sKK30KKworTkJMb2c6OldyaXRlcjo6V3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpCisgICAgOiBtU2hhcmVkKChTaGFyZWQgKikgc2hhcmVkKSwKKyAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/CisgICAgICAgIG5ldyBhdWRpb191dGlsc19maWZvKHNpemUsIHNpemVvZih1aW50OF90KSwKKyAgICAgICAgICAgIG1TaGFyZWQtPm1CdWZmZXIsIG1TaGFyZWQtPm1SZWFyLCBOVUxMIC8qdGhyb3R0bGVzRnJvbnQqLykgOiBOVUxMKSwKKyAgICAgIG1GaWZvV3JpdGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb193cml0ZXIoKm1GaWZvKSA6IE5VTEwpLAorICAgICAgbUVuYWJsZWQobUZpZm9Xcml0ZXIgIT0gTlVMTCkKK3sKKyAgICAvLyBjYWNoaW5nIHBpZCBhbmQgcHJvY2VzcyBuYW1lCisgICAgcGlkX3QgaWQgPSA6OmdldHBpZCgpOworICAgIGNoYXIgcHJvY05hbWVbMTZdOworICAgIGludCBzdGF0dXMgPSBwcmN0bChQUl9HRVRfTkFNRSwgcHJvY05hbWUpOworICAgIGlmIChzdGF0dXMpIHsgIC8vIGVycm9yIGdldHRpbmcgcHJvY2VzcyBuYW1lCisgICAgICAgIHByb2NOYW1lWzBdID0gJ1wwJzsKKyAgICB9CisgICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbihwcm9jTmFtZSk7CisgICAgbVBpZFRhZ1NpemUgPSBsZW5ndGggKyBzaXplb2YocGlkX3QpOworICAgIG1QaWRUYWcgPSBuZXcgY2hhclttUGlkVGFnU2l6ZV07CisgICAgbWVtY3B5KG1QaWRUYWcsICZpZCwgc2l6ZW9mKHBpZF90KSk7CisgICAgbWVtY3B5KG1QaWRUYWcgKyBzaXplb2YocGlkX3QpLCBwcm9jTmFtZSwgbGVuZ3RoKTsKK30KKworTkJMb2c6OldyaXRlcjo6V3JpdGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSkKKyAgICA6IFdyaXRlcihpTWVtb3J5ICE9IDAgPyAoU2hhcmVkICopIGlNZW1vcnktPnBvaW50ZXIoKSA6IE5VTEwsIHNpemUpCit7CisgICAgbUlNZW1vcnkgPSBpTWVtb3J5OworfQorCitOQkxvZzo6V3JpdGVyOjp+V3JpdGVyKCkKK3sKKyAgICBkZWxldGUgbUZpZm9Xcml0ZXI7CisgICAgZGVsZXRlIG1GaWZvOworICAgIGRlbGV0ZVtdIG1QaWRUYWc7Cit9CisKK3ZvaWQgTkJMb2c6OldyaXRlcjo6bG9nKGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdHJpbmcgPT0gTlVMTCwgIkF0dGVtcHRlZCB0byBsb2cgTlVMTCBzdHJpbmciKTsKKyAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKHN0cmluZyk7CisgICAgaWYgKGxlbmd0aCA+IEVudHJ5OjprTWF4TGVuZ3RoKSB7CisgICAgICAgIGxlbmd0aCA9IEVudHJ5OjprTWF4TGVuZ3RoOworICAgIH0KKyAgICBsb2coRVZFTlRfU1RSSU5HLCBzdHJpbmcsIGxlbmd0aCk7Cit9CisKK3ZvaWQgTkJMb2c6OldyaXRlcjo6bG9nZihjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICBXcml0ZXI6OmxvZ3ZmKGZtdCwgYXApOyAgICAgLy8gdGhlIFdyaXRlcjo6IGlzIG5lZWRlZCB0byBhdm9pZCB2aXJ0dWFsIGRpc3BhdGNoIGZvciBMb2NrZWRXcml0ZXIKKyAgICB2YV9lbmQoYXApOworfQorCit2b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ3ZmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2hhciBidWZmZXJbRW50cnk6OmtNYXhMZW5ndGggKyAxIC8qTlVMKi9dOworICAgIGludCBsZW5ndGggPSB2c25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgZm10LCBhcCk7CisgICAgaWYgKGxlbmd0aCA+PSAoaW50KSBzaXplb2YoYnVmZmVyKSkgeworICAgICAgICBsZW5ndGggPSBzaXplb2YoYnVmZmVyKSAtIDE7CisgICAgICAgIC8vIE5VTCB0ZXJtaW5hdGlvbiBpcyBub3QgcmVxdWlyZWQKKyAgICAgICAgLy8gYnVmZmVyW2xlbmd0aF0gPSAnXDAnOworICAgIH0KKyAgICBpZiAobGVuZ3RoID49IDApIHsKKyAgICAgICAgbG9nKEVWRU5UX1NUUklORywgYnVmZmVyLCBsZW5ndGgpOworICAgIH0KK30KKwordm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dUaW1lc3RhbXAoKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQ2NF90IHRzID0gZ2V0X21vbm90b25pY19ucygpOworICAgIGlmICh0cyA+IDApIHsKKyAgICAgICAgbG9nKEVWRU5UX1RJTUVTVEFNUCwgJnRzLCBzaXplb2YodHMpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCB0aW1lc3RhbXAiKTsKKyAgICB9Cit9CisKK3ZvaWQgTkJMb2c6OldyaXRlcjo6bG9nVGltZXN0YW1wKGNvbnN0IGludDY0X3QgdHMpCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGxvZyhFVkVOVF9USU1FU1RBTVAsICZ0cywgc2l6ZW9mKHRzKSk7Cit9CisKK3ZvaWQgTkJMb2c6OldyaXRlcjo6bG9nSW50ZWdlcihjb25zdCBpbnQgeCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbG9nKEVWRU5UX0lOVEVHRVIsICZ4LCBzaXplb2YoeCkpOworfQorCit2b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0Zsb2F0KGNvbnN0IGZsb2F0IHgpCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGxvZyhFVkVOVF9GTE9BVCwgJngsIHNpemVvZih4KSk7Cit9CisKK3ZvaWQgTkJMb2c6OldyaXRlcjo6bG9nUElEKCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbG9nKEVWRU5UX1BJRCwgbVBpZFRhZywgbVBpZFRhZ1NpemUpOworfQorCit2b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ1N0YXJ0KGNvbnN0IGNoYXIgKmZtdCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbihmbXQpOworICAgIGlmIChsZW5ndGggPiBFbnRyeTo6a01heExlbmd0aCkgeworICAgICAgICBsZW5ndGggPSBFbnRyeTo6a01heExlbmd0aDsKKyAgICB9CisgICAgbG9nKEVWRU5UX1NUQVJUX0ZNVCwgZm10LCBsZW5ndGgpOworfQorCit2b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0VuZCgpCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEVudHJ5IGVudHJ5ID0gRW50cnkoRVZFTlRfRU5EX0ZNVCwgTlVMTCwgMCk7CisgICAgbG9nKCZlbnRyeSwgdHJ1ZSk7Cit9CisKK3ZvaWQgTkJMb2c6OldyaXRlcjo6bG9nSGFzaChsb2dfaGFzaF90IGhhc2gpCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGxvZyhFVkVOVF9IQVNILCAmaGFzaCwgc2l6ZW9mKGhhc2gpKTsKK30KKwordm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dFdmVudEhpc3RUcyhFdmVudCBldmVudCwgbG9nX2hhc2hfdCBoYXNoKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBIaXN0VHNFbnRyeSBkYXRhOworICAgIGRhdGEuaGFzaCA9IGhhc2g7CisgICAgZGF0YS50cyA9IGdldF9tb25vdG9uaWNfbnMoKTsKKyAgICBpZiAoZGF0YS50cyA+IDApIHsKKyAgICAgICAgbG9nKGV2ZW50LCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCB0aW1lc3RhbXAiKTsKKyAgICB9Cit9CisKK3ZvaWQgTkJMb2c6OldyaXRlcjo6bG9nRm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgbG9nX2hhc2hfdCBoYXNoLCAuLi4pCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydChhcCwgaGFzaCk7CisgICAgV3JpdGVyOjpsb2dWRm9ybWF0KGZtdCwgaGFzaCwgYXApOworICAgIHZhX2VuZChhcCk7Cit9CisKK3ZvaWQgTkJMb2c6OldyaXRlcjo6bG9nVkZvcm1hdChjb25zdCBjaGFyICpmbXQsIGxvZ19oYXNoX3QgaGFzaCwgdmFfbGlzdCBhcmdwKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBXcml0ZXI6OmxvZ1N0YXJ0KGZtdCk7CisgICAgaW50IGk7CisgICAgZG91YmxlIGY7CisgICAgY2hhciogczsKKyAgICBpbnQ2NF90IHQ7CisgICAgV3JpdGVyOjpsb2dUaW1lc3RhbXAoKTsKKyAgICBXcml0ZXI6OmxvZ0hhc2goaGFzaCk7CisgICAgZm9yIChjb25zdCBjaGFyICpwID0gZm10OyAqcCAhPSAnXDAnOyBwKyspIHsKKyAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IG1vcmUgY29tcGxleCBmb3JtYXR0aW5nIHN1Y2ggYXMgJS4zZgorICAgICAgICBpZiAoKnAgIT0gJyUnKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2goKisrcCkgeworICAgICAgICBjYXNlICdzJzogLy8gc3RyaW5nCisgICAgICAgICAgICBzID0gdmFfYXJnKGFyZ3AsIGNoYXIgKik7CisgICAgICAgICAgICBXcml0ZXI6OmxvZyhzKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3QnOiAvLyB0aW1lc3RhbXAKKyAgICAgICAgICAgIHQgPSB2YV9hcmcoYXJncCwgaW50NjRfdCk7CisgICAgICAgICAgICBXcml0ZXI6OmxvZ1RpbWVzdGFtcCh0KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ2QnOiAvLyBpbnRlZ2VyCisgICAgICAgICAgICBpID0gdmFfYXJnKGFyZ3AsIGludCk7CisgICAgICAgICAgICBXcml0ZXI6OmxvZ0ludGVnZXIoaSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdmJzogLy8gZmxvYXQKKyAgICAgICAgICAgIGYgPSB2YV9hcmcoYXJncCwgZG91YmxlKTsgLy8gZmxvYXQgYXJndW1lbnRzIGFyZSBwcm9tb3RlZCB0byBkb3VibGUgaW4gdmFyYXJnIGxpc3RzCisgICAgICAgICAgICBXcml0ZXI6OmxvZ0Zsb2F0KChmbG9hdClmKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3AnOiAvLyBwaWQKKyAgICAgICAgICAgIFdyaXRlcjo6bG9nUElEKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvLyB0aGUgIiVcMCIgY2FzZSBmaW5pc2hlcyBwYXJzaW5nCisgICAgICAgIGNhc2UgJ1wwJzoKKyAgICAgICAgICAgIC0tcDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJyUnOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJOQkxvZyBXcml0ZXIgcGFyc2VkIGludmFsaWQgZm9ybWF0IHNwZWNpZmllcjogJWMiLCAqcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBXcml0ZXI6OmxvZ0VuZCgpOworfQorCit2b2lkIE5CTG9nOjpXcml0ZXI6OmxvZyhFdmVudCBldmVudCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGRhdGEgPT0gTlVMTCB8fCBsZW5ndGggPiBFbnRyeTo6a01heExlbmd0aCkgeworICAgICAgICAvLyBUT0RPIFBlcmhhcHMgaXQgbWFrZXMgc2Vuc2UgdG8gZGlzcGxheSB0cnVuY2F0ZWQgZGF0YSBvciBhdCBsZWFzdCBhCisgICAgICAgIC8vICAgICAgbWVzc2FnZSB0aGF0IHRoZSBkYXRhIGlzIHRvbyBsb25nPyAgVGhlIGN1cnJlbnQgYmVoYXZpb3IgY2FuIGNyZWF0ZQorICAgICAgICAvLyAgICAgIGEgY29uZnVzaW9uIGZvciBhIHByb2dyYW1tZXIgZGVidWdnaW5nIHRoZWlyIGNvZGUuCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gSWdub3JlIGlmIGludmFsaWQgZXZlbnQKKyAgICBpZiAoZXZlbnQgPT0gRVZFTlRfUkVTRVJWRUQgfHwgZXZlbnQgPj0gRVZFTlRfVVBQRVJfQk9VTkQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBFbnRyeSBldHIoZXZlbnQsIGRhdGEsIGxlbmd0aCk7CisgICAgbG9nKCZldHIsIHRydWUgLyp0cnVzdGVkKi8pOworfQorCit2b2lkIE5CTG9nOjpXcml0ZXI6OmxvZyhjb25zdCBOQkxvZzo6RW50cnkgKmV0ciwgYm9vbCB0cnVzdGVkKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIXRydXN0ZWQpIHsKKyAgICAgICAgbG9nKGV0ci0+bUV2ZW50LCBldHItPm1EYXRhLCBldHItPm1MZW5ndGgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNpemVfdCBuZWVkID0gZXRyLT5tTGVuZ3RoICsgRW50cnk6OmtPdmVyaGVhZDsgICAgLy8gbUV2ZW50LCBtTGVuZ3RoLCBkYXRhW21MZW5ndGhdLCBtTGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkID0gbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gRklGTworCisgICAgLy8gRklYTUUgb3B0aW1pemUgdGhpcyB1c2luZyBtZW1jcHkgZm9yIHRoZSBkYXRhIHBhcnQgb2YgdGhlIEVudHJ5LgorICAgIC8vIFRoZSBFbnRyeSBjb3VsZCBoYXZlIGEgbWV0aG9kIGNvcHlUbyhwdHIsIG9mZnNldCwgc2l6ZSkgdG8gb3B0aW1pemUgdGhlIGNvcHkuCisgICAgLy8gY2hlY2tzIHNpemUgb2YgYSBzaW5nbGUgbG9nIEVudHJ5OiB0eXBlLCBsZW5ndGgsIGRhdGEgcG9pbnRlciBhbmQgZW5kaW5nCisgICAgdWludDhfdCB0ZW1wW0VudHJ5OjprTWF4TGVuZ3RoICsgRW50cnk6OmtPdmVyaGVhZF07CisgICAgLy8gd3JpdGUgdGhpcyBkYXRhIHRvIHRlbXAgYXJyYXkKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5lZWQ7IGkrKykgeworICAgICAgICB0ZW1wW2ldID0gZXRyLT5jb3B5RW50cnlEYXRhQXQoaSk7CisgICAgfQorICAgIC8vIHdyaXRlIHRvIGNpcmN1bGFyIGJ1ZmZlcgorICAgIG1GaWZvV3JpdGVyLT53cml0ZSh0ZW1wLCBuZWVkKTsKK30KKworYm9vbCBOQkxvZzo6V3JpdGVyOjppc0VuYWJsZWQoKSBjb25zdAoreworICAgIHJldHVybiBtRW5hYmxlZDsKK30KKworYm9vbCBOQkxvZzo6V3JpdGVyOjpzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBib29sIG9sZCA9IG1FbmFibGVkOworICAgIG1FbmFibGVkID0gZW5hYmxlZCAmJiBtU2hhcmVkICE9IE5VTEw7CisgICAgcmV0dXJuIG9sZDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05CTG9nOjpMb2NrZWRXcml0ZXI6OkxvY2tlZFdyaXRlcigpCisgICAgOiBXcml0ZXIoKQoreworfQorCitOQkxvZzo6TG9ja2VkV3JpdGVyOjpMb2NrZWRXcml0ZXIodm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSkKKyAgICA6IFdyaXRlcihzaGFyZWQsIHNpemUpCit7Cit9CisKK3ZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nKGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIFdyaXRlcjo6bG9nKHN0cmluZyk7Cit9CisKK3ZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nZihjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICAvLyBGSVhNRSBzaG91bGQgbm90IHRha2UgdGhlIGxvY2sgdW50aWwgYWZ0ZXIgZm9ybWF0dGluZyBpcyBkb25lCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICB2YV9saXN0IGFwOworICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgIFdyaXRlcjo6bG9ndmYoZm10LCBhcCk7CisgICAgdmFfZW5kKGFwKTsKK30KKwordm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2d2Zihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCit7CisgICAgLy8gRklYTUUgc2hvdWxkIG5vdCB0YWtlIHRoZSBsb2NrIHVudGlsIGFmdGVyIGZvcm1hdHRpbmcgaXMgZG9uZQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgV3JpdGVyOjpsb2d2ZihmbXQsIGFwKTsKK30KKwordm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dUaW1lc3RhbXAoKQoreworICAgIC8vIEZJWE1FIHNob3VsZCBub3QgdGFrZSB0aGUgbG9jayB1bnRpbCBhZnRlciB0aGUgY2xvY2tfZ2V0dGltZSgpIHN5c2NhbGwKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIFdyaXRlcjo6bG9nVGltZXN0YW1wKCk7Cit9CisKK3ZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nVGltZXN0YW1wKGNvbnN0IGludDY0X3QgdHMpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBXcml0ZXI6OmxvZ1RpbWVzdGFtcCh0cyk7Cit9CisKK3ZvaWQgTkJMb2c6OkxvY2tlZFdyaXRlcjo6bG9nSW50ZWdlcihjb25zdCBpbnQgeCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIFdyaXRlcjo6bG9nSW50ZWdlcih4KTsKK30KKwordm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dGbG9hdChjb25zdCBmbG9hdCB4KQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgV3JpdGVyOjpsb2dGbG9hdCh4KTsKK30KKwordm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dQSUQoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgV3JpdGVyOjpsb2dQSUQoKTsKK30KKwordm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dTdGFydChjb25zdCBjaGFyICpmbXQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBXcml0ZXI6OmxvZ1N0YXJ0KGZtdCk7Cit9CisKKwordm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dFbmQoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgV3JpdGVyOjpsb2dFbmQoKTsKK30KKwordm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dIYXNoKGxvZ19oYXNoX3QgaGFzaCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIFdyaXRlcjo6bG9nSGFzaChoYXNoKTsKK30KKworYm9vbCBOQkxvZzo6TG9ja2VkV3JpdGVyOjppc0VuYWJsZWQoKSBjb25zdAoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIFdyaXRlcjo6aXNFbmFibGVkKCk7Cit9CisKK2Jvb2wgTkJMb2c6OkxvY2tlZFdyaXRlcjo6c2V0RW5hYmxlZChib29sIGVuYWJsZWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gV3JpdGVyOjpzZXRFbmFibGVkKGVuYWJsZWQpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY29uc3Qgc3RkOjpzZXQ8TkJMb2c6OkV2ZW50PiBOQkxvZzo6UmVhZGVyOjpzdGFydGluZ1R5cGVzIHtOQkxvZzo6RXZlbnQ6OkVWRU5UX1NUQVJUX0ZNVCwKKyAgICAgICAgTkJMb2c6OkV2ZW50OjpFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFMsCisgICAgICAgIE5CTG9nOjpFdmVudDo6RVZFTlRfQVVESU9fU1RBVEV9OworY29uc3Qgc3RkOjpzZXQ8TkJMb2c6OkV2ZW50PiBOQkxvZzo6UmVhZGVyOjplbmRpbmdUeXBlcyAgIHtOQkxvZzo6RXZlbnQ6OkVWRU5UX0VORF9GTVQsCisgICAgICAgIE5CTG9nOjpFdmVudDo6RVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTLAorICAgICAgICBOQkxvZzo6RXZlbnQ6OkVWRU5UX0FVRElPX1NUQVRFfTsKKworTkJMb2c6OlJlYWRlcjo6UmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpCisgICAgOiBtRmQoLTEpLCBtSW5kZW50KDApLCBtTG9zdCgwKSwKKyAgICAgIG1TaGFyZWQoKC8qY29uc3QqLyBTaGFyZWQgKikgc2hhcmVkKSwgLyptSU1lbW9yeSovCisgICAgICBtRmlmbyhtU2hhcmVkICE9IE5VTEwgPworICAgICAgICBuZXcgYXVkaW9fdXRpbHNfZmlmbyhzaXplLCBzaXplb2YodWludDhfdCksCisgICAgICAgICAgICBtU2hhcmVkLT5tQnVmZmVyLCBtU2hhcmVkLT5tUmVhciwgTlVMTCAvKnRocm90dGxlc0Zyb250Ki8pIDogTlVMTCksCisgICAgICBtRmlmb1JlYWRlcihtRmlmbyAhPSBOVUxMID8gbmV3IGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyKCptRmlmbykgOiBOVUxMKQoreworfQorCitOQkxvZzo6UmVhZGVyOjpSZWFkZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplKQorICAgIDogUmVhZGVyKGlNZW1vcnkgIT0gMCA/IChTaGFyZWQgKikgaU1lbW9yeS0+cG9pbnRlcigpIDogTlVMTCwgc2l6ZSkKK3sKKyAgICBtSU1lbW9yeSA9IGlNZW1vcnk7Cit9CisKK05CTG9nOjpSZWFkZXI6On5SZWFkZXIoKQoreworICAgIGRlbGV0ZSBtRmlmb1JlYWRlcjsKKyAgICBkZWxldGUgbUZpZm87Cit9CisKK2NvbnN0IHVpbnQ4X3QgKk5CTG9nOjpSZWFkZXI6OmZpbmRMYXN0RW50cnlPZlR5cGVzKGNvbnN0IHVpbnQ4X3QgKmZyb250LCBjb25zdCB1aW50OF90ICpiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxFdmVudD4gJnR5cGVzKSB7CisgICAgd2hpbGUgKGJhY2sgKyBFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0ID49IGZyb250KSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnByZXYgPSBiYWNrIC0gYmFja1tFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XSAtIEVudHJ5OjprT3ZlcmhlYWQ7CisgICAgICAgIGlmIChwcmV2IDwgZnJvbnQgfHwgcHJldiArIHByZXZbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRyeTo6a092ZXJoZWFkICE9IGJhY2spIHsKKworICAgICAgICAgICAgLy8gcHJldiBwb2ludHMgdG8gYW4gb3V0IG9mIGxpbWl0cyBvciBpbmNvbnNpc3RlbnQgZW50cnkKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlcy5maW5kKChjb25zdCBFdmVudCkgcHJldltvZmZzZXRvZihlbnRyeSwgdHlwZSldKSAhPSB0eXBlcy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIHByZXY7CisgICAgICAgIH0KKyAgICAgICAgYmFjayA9IHByZXY7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOyAvLyBubyBlbnRyeSBmb3VuZAorfQorCisvLyBDb3BpZXMgY29udGVudCBvZiBhIFJlYWRlciBGSUZPIGludG8gaXRzIFNuYXBzaG90CisvLyBUaGUgU25hcHNob3QgaGFzIHRoZSBzYW1lIHJhdyBkYXRhLCBidXQgcmVwcmVzZW50ZWQgYXMgYSBzZXF1ZW5jZSBvZiBlbnRyaWVzCisvLyBhbmQgYW4gRW50cnlJdGVyYXRvciBtYWtpbmcgaXQgcG9zc2libGUgdG8gcHJvY2VzcyB0aGUgZGF0YS4KK3N0ZDo6dW5pcXVlX3B0cjxOQkxvZzo6UmVhZGVyOjpTbmFwc2hvdD4gTkJMb2c6OlJlYWRlcjo6Z2V0U25hcHNob3QoKQoreworICAgIGlmIChtRmlmb1JlYWRlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8TkJMb2c6OlJlYWRlcjo6U25hcHNob3Q+KG5ldyBTbmFwc2hvdCgpKTsKKyAgICB9CisgICAgLy8gbWFrZSBhIGNvcHkgdG8gYXZvaWQgcmFjZSBjb25kaXRpb24gd2l0aCB3cml0ZXIKKyAgICBzaXplX3QgY2FwYWNpdHkgPSBtRmlmby0+Y2FwYWNpdHkoKTsKKworICAgIC8vIFRoaXMgZW11bGF0ZXMgdGhlIGJlaGF2aW91ciBvZiBhdWRpb191dGlsc19maWZvX3JlYWRlcjo6cmVhZCwgYnV0IHdpdGhvdXQgaW5jcmVtZW50aW5nIHRoZQorICAgIC8vIHJlYWRlciBpbmRleC4gVGhlIGluZGV4IGlzIGluY3JlbWVudGVkIGFmdGVyIGhhbmRsaW5nIGNvcnJ1cHRpb24sIHRvIGFmdGVyIHRoZSBsYXN0IGNvbXBsZXRlCisgICAgLy8gZW50cnkgb2YgdGhlIGJ1ZmZlcgorICAgIHNpemVfdCBsb3N0OworICAgIGF1ZGlvX3V0aWxzX2lvdmVjIGlvdmVjWzJdOworICAgIHNzaXplX3QgYXZhaWxUb1JlYWQgPSBtRmlmb1JlYWRlci0+b2J0YWluKGlvdmVjLCBjYXBhY2l0eSwgTlVMTCAvKnRpbWVvdXQqLywgJmxvc3QpOworICAgIGlmIChhdmFpbFRvUmVhZCA8PSAwKSB7CisgICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8TkJMb2c6OlJlYWRlcjo6U25hcHNob3Q+KG5ldyBTbmFwc2hvdCgpKTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IHNuYXBzaG90KG5ldyBTbmFwc2hvdChhdmFpbFRvUmVhZCkpOworICAgIG1lbWNweShzbmFwc2hvdC0+bURhdGEsIChjb25zdCBjaGFyICopIG1GaWZvLT5idWZmZXIoKSArIGlvdmVjWzBdLm1PZmZzZXQsIGlvdmVjWzBdLm1MZW5ndGgpOworICAgIGlmIChpb3ZlY1sxXS5tTGVuZ3RoID4gMCkgeworICAgICAgICBtZW1jcHkoc25hcHNob3QtPm1EYXRhICsgKGlvdmVjWzBdLm1MZW5ndGgpLAorICAgICAgICAgICAgKGNvbnN0IGNoYXIgKikgbUZpZm8tPmJ1ZmZlcigpICsgaW92ZWNbMV0ubU9mZnNldCwgaW92ZWNbMV0ubUxlbmd0aCk7CisgICAgfQorCisgICAgLy8gSGFuZGxlIGNvcnJ1cHRlZCBidWZmZXIKKyAgICAvLyBQb3RlbnRpYWxseSwgYSBidWZmZXIgaGFzIGNvcnJ1cHRlZCBkYXRhIG9uIGJvdGggYmVnaW5uaW5nIChkdWUgdG8gb3ZlcmZsb3cpIGFuZCBlbmQKKyAgICAvLyAoZHVlIHRvIGluY29tcGxldGUgZm9ybWF0IGVudHJ5KS4gQnV0IGV2ZW4gaWYgdGhlIGVuZCBmb3JtYXQgZW50cnkgaXMgaW5jb21wbGV0ZSwKKyAgICAvLyBpdCBlbmRzIGluIGEgY29tcGxldGUgZW50cnkgKHdoaWNoIGlzIG5vdCBhbiBFTkRfRk1UKS4gU28gaXMgc2FmZSB0byB0cmF2ZXJzZSBiYWNrd2FyZHMuCisgICAgLy8gVE9ETzogaGFuZGxlIGNsaWVudCBjb3JydXB0aW9uIChpbiB0aGUgbWlkZGxlIG9mIGEgYnVmZmVyKQorCisgICAgY29uc3QgdWludDhfdCAqYmFjayA9IHNuYXBzaG90LT5tRGF0YSArIGF2YWlsVG9SZWFkOworICAgIGNvbnN0IHVpbnQ4X3QgKmZyb250ID0gc25hcHNob3QtPm1EYXRhOworCisgICAgLy8gRmluZCBsYXN0IEVORF9GTVQuIDxiYWNrPiBpcyBzaXR0aW5nIG9uIGFuIGVudHJ5IHdoaWNoIG1pZ2h0IGJlIHRoZSBtaWRkbGUgb2YgYSBGb3JtYXRFbnRyeS4KKyAgICAvLyBXZSBnbyBiYWNrd2FyZHMgdW50aWwgd2UgZmluZCBhbiBFVkVOVF9FTkRfRk1ULgorICAgIGNvbnN0IHVpbnQ4X3QgKmxhc3RFbmQgPSBmaW5kTGFzdEVudHJ5T2ZUeXBlcyhmcm9udCwgYmFjaywgZW5kaW5nVHlwZXMpOworICAgIGlmIChsYXN0RW5kID09IG51bGxwdHIpIHsKKyAgICAgICAgc25hcHNob3QtPm1FbmQgPSBzbmFwc2hvdC0+bUJlZ2luID0gRW50cnlJdGVyYXRvcihmcm9udCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gZW5kIG9mIHNuYXBzaG90IHBvaW50cyB0byBhZnRlciBsYXN0IEVORF9GTVQgZW50cnkKKyAgICAgICAgc25hcHNob3QtPm1FbmQgPSBFbnRyeUl0ZXJhdG9yKGxhc3RFbmQpLm5leHQoKTsKKyAgICAgICAgLy8gZmluZCBmaXJzdCBTVEFSVF9GTVQKKyAgICAgICAgY29uc3QgdWludDhfdCAqZmlyc3RTdGFydCA9IG51bGxwdHI7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZpcnN0U3RhcnRUbXAgPSBzbmFwc2hvdC0+bUVuZDsKKyAgICAgICAgd2hpbGUgKChmaXJzdFN0YXJ0VG1wID0gZmluZExhc3RFbnRyeU9mVHlwZXMoZnJvbnQsIGZpcnN0U3RhcnRUbXAsIHN0YXJ0aW5nVHlwZXMpKQorICAgICAgICAgICAgICAgICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGZpcnN0U3RhcnQgPSBmaXJzdFN0YXJ0VG1wOworICAgICAgICB9CisgICAgICAgIC8vIGZpcnN0U3RhcnQgaXMgbnVsbCBpZiBubyBTVEFSVF9GTVQgZW50cnkgd2FzIGZvdW5kIGJlZm9yZSBsYXN0RW5kCisgICAgICAgIGlmIChmaXJzdFN0YXJ0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNuYXBzaG90LT5tQmVnaW4gPSBzbmFwc2hvdC0+bUVuZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNuYXBzaG90LT5tQmVnaW4gPSBFbnRyeUl0ZXJhdG9yKGZpcnN0U3RhcnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gYWR2YW5jZSBmaWZvIHJlYWRlciBpbmRleCB0byBhZnRlciBsYXN0IGVudHJ5IHJlYWQuCisgICAgbUZpZm9SZWFkZXItPnJlbGVhc2Uoc25hcHNob3QtPm1FbmQgLSBmcm9udCk7CisKKyAgICBzbmFwc2hvdC0+bUxvc3QgPSBsb3N0OworICAgIHJldHVybiBzbmFwc2hvdDsKKworfQorCisvLyBUYWtlcyByYXcgY29udGVudCBvZiB0aGUgbG9jYWwgbWVyZ2VyIEZJRk8sIHByb2Nlc3NlcyBsb2cgZW50cmllcywgYW5kCisvLyB3cml0ZXMgdGhlIGRhdGEgdG8gYSBtYXAgb2YgY2xhc3MgUGVyZm9ybWFuY2VBbmFseXNpcywgYmFzZWQgb24gdGhlaXIgdGhyZWFkIElELgordm9pZCBOQkxvZzo6TWVyZ2VSZWFkZXI6OmdldEFuZFByb2Nlc3NTbmFwc2hvdChOQkxvZzo6UmVhZGVyOjpTbmFwc2hvdCAmc25hcHNob3QpCit7CisgICAgU3RyaW5nOCB0aW1lc3RhbXAsIGJvZHk7CisKKyAgICBmb3IgKGF1dG8gZW50cnkgPSBzbmFwc2hvdC5iZWdpbigpOyBlbnRyeSAhPSBzbmFwc2hvdC5lbmQoKTspIHsKKyAgICAgICAgc3dpdGNoIChlbnRyeS0+dHlwZSkgeworICAgICAgICBjYXNlIEVWRU5UX1NUQVJUX0ZNVDoKKyAgICAgICAgICAgIGVudHJ5ID0gaGFuZGxlRm9ybWF0KEZvcm1hdEVudHJ5KGVudHJ5KSwgJnRpbWVzdGFtcCwgJmJvZHkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTOiB7CisgICAgICAgICAgICBIaXN0VHNFbnRyeVdpdGhBdXRob3IgKmRhdGEgPSAoSGlzdFRzRW50cnlXaXRoQXV0aG9yICopIChlbnRyeS0+ZGF0YSk7CisgICAgICAgICAgICAvLyBUT0RPIFRoaXMgbWVtY3BpZXMgYXJlIGhlcmUgdG8gYXZvaWQgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3MgY3Jhc2guCisgICAgICAgICAgICAvLyBUaGVyZSdzIHByb2JhYmx5IGEgbW9yZSBlZmZpY2llbnQgd2F5IHRvIGRvIGl0CisgICAgICAgICAgICBsb2dfaGFzaF90IGhhc2g7CisgICAgICAgICAgICBtZW1jcHkoJmhhc2gsICYoZGF0YS0+aGFzaCksIHNpemVvZihoYXNoKSk7CisgICAgICAgICAgICBpbnQ2NF90IHRzOworICAgICAgICAgICAgbWVtY3B5KCZ0cywgJmRhdGEtPnRzLCBzaXplb2YodHMpKTsKKyAgICAgICAgICAgIC8vIFRPRE86IGhhc2ggZm9yIGhpc3RvZ3JhbSB0cyBhbmQgYXVkaW8gc3RhdGUgbmVlZCB0byBtYXRjaAorICAgICAgICAgICAgLy8gYW5kIGNvcnJlc3BvbmQgdG8gYXVkaW8gcHJvZHVjdGlvbiBzb3VyY2UgZmlsZSBsb2NhdGlvbgorICAgICAgICAgICAgbVRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXNbZGF0YS0+YXV0aG9yXVswIC8qaGFzaCovXS5sb2dUc0VudHJ5KHRzKTsKKyAgICAgICAgICAgICsrZW50cnk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEVWRU5UX0FVRElPX1NUQVRFOiB7CisgICAgICAgICAgICBIaXN0VHNFbnRyeVdpdGhBdXRob3IgKmRhdGEgPSAoSGlzdFRzRW50cnlXaXRoQXV0aG9yICopIChlbnRyeS0+ZGF0YSk7CisgICAgICAgICAgICAvLyBUT0RPIFRoaXMgbWVtY3BpZXMgYXJlIGhlcmUgdG8gYXZvaWQgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3MgY3Jhc2guCisgICAgICAgICAgICAvLyBUaGVyZSdzIHByb2JhYmx5IGEgbW9yZSBlZmZpY2llbnQgd2F5IHRvIGRvIGl0CisgICAgICAgICAgICBsb2dfaGFzaF90IGhhc2g7CisgICAgICAgICAgICBtZW1jcHkoJmhhc2gsICYoZGF0YS0+aGFzaCksIHNpemVvZihoYXNoKSk7CisgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgdHMgaWYgdW51c2VkCisgICAgICAgICAgICBpbnQ2NF90IHRzOworICAgICAgICAgICAgbWVtY3B5KCZ0cywgJmRhdGEtPnRzLCBzaXplb2YodHMpKTsKKyAgICAgICAgICAgIG1UaHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzW2RhdGEtPmF1dGhvcl1bMCAvKmhhc2gqL10uaGFuZGxlU3RhdGVDaGFuZ2UoKTsKKyAgICAgICAgICAgICsrZW50cnk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEVWRU5UX0VORF9GTVQ6CisgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgid2FybmluZzogZ290IHRvIGVuZCBmb3JtYXQgZXZlbnQiKTsKKyAgICAgICAgICAgICsrZW50cnk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9SRVNFUlZFRDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJ3YXJuaW5nOiB1bmV4cGVjdGVkIGV2ZW50ICVkIiwgZW50cnktPnR5cGUpOworICAgICAgICAgICAgKytlbnRyeTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIC8vIEZJWE1FOiBkZWNpZGUgd2hldGhlciB0byBwcmludCB0aGUgd2FybmluZ3MgaGVyZSBvciBlbHNld2hlcmUKKyAgICBpZiAoIWJvZHkuaXNFbXB0eSgpKSB7CisgICAgICAgIGR1bXBMaW5lKHRpbWVzdGFtcCwgYm9keSk7CisgICAgfQorfQorCit2b2lkIE5CTG9nOjpNZXJnZVJlYWRlcjo6Z2V0QW5kUHJvY2Vzc1NuYXBzaG90KCkKK3sKKyAgICAvLyBnZXQgYSBzbmFwc2hvdCwgcHJvY2VzcyBpdAorICAgIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4gc25hcCA9IGdldFNuYXBzaG90KCk7CisgICAgZ2V0QW5kUHJvY2Vzc1NuYXBzaG90KCpzbmFwKTsKK30KKwordm9pZCBOQkxvZzo6TWVyZ2VSZWFkZXI6OmR1bXAoaW50IGZkLCBpbnQgaW5kZW50KSB7CisgICAgLy8gVE9ETzogYWRkIGEgbXV0ZXggYXJvdW5kIG1lZGlhLmxvZyBkdW1wCisgICAgUmVwb3J0UGVyZm9ybWFuY2U6OmR1bXAoZmQsIGluZGVudCwgbVRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXMpOworfQorCisvLyBXcml0ZXMgYSBzdHJpbmcgdG8gdGhlIGNvbnNvbGUKK3ZvaWQgTkJMb2c6OlJlYWRlcjo6ZHVtcExpbmUoY29uc3QgU3RyaW5nOCAmdGltZXN0YW1wLCBTdHJpbmc4ICZib2R5KQoreworICAgIGlmIChtRmQgPj0gMCkgeworICAgICAgICBkcHJpbnRmKG1GZCwgIiUuKnMlcyAlc1xuIiwgbUluZGVudCwgIiIsIHRpbWVzdGFtcC5zdHJpbmcoKSwgYm9keS5zdHJpbmcoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0koIiUuKnMlcyAlcyIsIG1JbmRlbnQsICIiLCB0aW1lc3RhbXAuc3RyaW5nKCksIGJvZHkuc3RyaW5nKCkpOworICAgIH0KKyAgICBib2R5LmNsZWFyKCk7Cit9CisKK2Jvb2wgTkJMb2c6OlJlYWRlcjo6aXNJTWVtb3J5KGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5KSBjb25zdAoreworICAgIHJldHVybiBpTWVtb3J5ICE9IDAgJiYgbUlNZW1vcnkgIT0gMCAmJiBpTWVtb3J5LT5wb2ludGVyKCkgPT0gbUlNZW1vcnktPnBvaW50ZXIoKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgTkJMb2c6OmFwcGVuZFRpbWVzdGFtcChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKSB7CisgICAgaW50NjRfdCB0czsKKyAgICBtZW1jcHkoJnRzLCBkYXRhLCBzaXplb2YodHMpKTsKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlslZC4lMDNkXSIsIChpbnQpICh0cyAvICgxMDAwICogMTAwMCAqIDEwMDApKSwKKyAgICAgICAgICAgICAgICAgICAgKGludCkgKCh0cyAvICgxMDAwICogMTAwMCkpICUgMTAwMCkpOworfQorCit2b2lkIE5CTG9nOjphcHBlbmRJbnQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSkgeworICAgIGludCB4ID0gKigoaW50KikgZGF0YSk7CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCI8JWQ+IiwgeCk7Cit9CisKK3ZvaWQgTkJMb2c6OmFwcGVuZEZsb2F0KFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpIHsKKyAgICBmbG9hdCBmOworICAgIG1lbWNweSgmZiwgZGF0YSwgc2l6ZW9mKGZsb2F0KSk7CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCI8JWY+IiwgZik7Cit9CisKK3ZvaWQgTkJMb2c6OmFwcGVuZFBJRChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3QgbGVuZ3RoKSB7CisgICAgcGlkX3QgaWQgPSAqKChwaWRfdCopIGRhdGEpOworICAgIGNoYXIgKiBuYW1lID0gJigoY2hhciopIGRhdGEpW3NpemVvZihwaWRfdCldOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiPFBJRDogJWQsIG5hbWU6ICUuKnM+IiwgaWQsIChpbnQpIChsZW5ndGggLSBzaXplb2YocGlkX3QpKSwgbmFtZSk7Cit9CisKK1N0cmluZzggTkJMb2c6OmJ1ZmZlckR1bXAoY29uc3QgdWludDhfdCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBTdHJpbmc4IHN0cjsKKyAgICBzdHIuYXBwZW5kKCJbICIpOworICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgeworICAgICAgICBzdHIuYXBwZW5kRm9ybWF0KCIlZCAiLCBidWZmZXJbaV0pOworICAgIH0KKyAgICBzdHIuYXBwZW5kKCJdIik7CisgICAgcmV0dXJuIHN0cjsKK30KKworU3RyaW5nOCBOQkxvZzo6YnVmZmVyRHVtcChjb25zdCBFbnRyeUl0ZXJhdG9yICZpdCkKK3sKKyAgICByZXR1cm4gYnVmZmVyRHVtcChpdCwgaXQtPmxlbmd0aCArIEVudHJ5OjprT3ZlcmhlYWQpOworfQorCitOQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6UmVhZGVyOjpoYW5kbGVGb3JtYXQoY29uc3QgRm9ybWF0RW50cnkgJmZtdEVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCAqdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCAqYm9keSkgeworICAgIC8vIGxvZyB0aW1lc3RhbXAKKyAgICBpbnQ2NF90IHRzID0gZm10RW50cnkudGltZXN0YW1wKCk7CisgICAgdGltZXN0YW1wLT5jbGVhcigpOworICAgIHRpbWVzdGFtcC0+YXBwZW5kRm9ybWF0KCJbJWQuJTAzZF0iLCAoaW50KSAodHMgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKSksCisgICAgICAgICAgICAgICAgICAgIChpbnQpICgodHMgLyAoMTAwMCAqIDEwMDApKSAlIDEwMDApKTsKKworICAgIC8vIGxvZyB1bmlxdWUgaGFzaAorICAgIGxvZ19oYXNoX3QgaGFzaCA9IGZtdEVudHJ5Lmhhc2goKTsKKyAgICAvLyBwcmludCBvbmx5IGxvd2VyIDE2Yml0IG9mIGhhc2ggYXMgaGV4IGFuZCBsaW5lIGFzIGludCB0byByZWR1Y2Ugc3BhbSBpbiB0aGUgbG9nCisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLjRYLSVkICIsIChpbnQpKGhhc2ggPj4gMTYpICYgMHhGRkZGLCAoaW50KSBoYXNoICYgMHhGRkZGKTsKKworICAgIC8vIGxvZyBhdXRob3IgKGlmIHByZXNlbnQpCisgICAgaGFuZGxlQXV0aG9yKGZtdEVudHJ5LCBib2R5KTsKKworICAgIC8vIGxvZyBzdHJpbmcKKyAgICBOQkxvZzo6RW50cnlJdGVyYXRvciBhcmcgPSBmbXRFbnRyeS5hcmdzKCk7CisKKyAgICBjb25zdCBjaGFyKiBmbXQgPSBmbXRFbnRyeS5mb3JtYXRTdHJpbmcoKTsKKyAgICBzaXplX3QgZm10X2xlbmd0aCA9IGZtdEVudHJ5LmZvcm1hdFN0cmluZ0xlbmd0aCgpOworCisgICAgZm9yIChzaXplX3QgZm10X29mZnNldCA9IDA7IGZtdF9vZmZzZXQgPCBmbXRfbGVuZ3RoOyArK2ZtdF9vZmZzZXQpIHsKKyAgICAgICAgaWYgKGZtdFtmbXRfb2Zmc2V0XSAhPSAnJScpIHsKKyAgICAgICAgICAgIGJvZHktPmFwcGVuZCgmZm10W2ZtdF9vZmZzZXRdLCAxKTsgLy8gVE9ETyBvcHRpbWl6ZSB0byB3cml0ZSBjb25zZWN1dGl2ZSBzdHJpbmdzIGF0IG9uY2UKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIGNhc2UgIiUlIiIKKyAgICAgICAgaWYgKGZtdFsrK2ZtdF9vZmZzZXRdID09ICclJykgeworICAgICAgICAgICAgYm9keS0+YXBwZW5kKCIlIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBjYXNlICIlXDAiCisgICAgICAgIGlmIChmbXRfb2Zmc2V0ID09IGZtdF9sZW5ndGgpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgTkJMb2c6OkV2ZW50IGV2ZW50ID0gKE5CTG9nOjpFdmVudCkgYXJnLT50eXBlOworICAgICAgICBzaXplX3QgbGVuZ3RoID0gYXJnLT5sZW5ndGg7CisKKyAgICAgICAgLy8gVE9ETyBjaGVjayBsZW5ndGggZm9yIGV2ZW50IHR5cGUgaXMgY29ycmVjdAorCisgICAgICAgIGlmIChldmVudCA9PSBFVkVOVF9FTkRfRk1UKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCBtb3JlIGNvbXBsZXggZm9ybWF0dGluZyBzdWNoIGFzICUuM2YKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0dW0gPSBhcmctPmRhdGE7IC8vIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZXZlbnQgYXJncworICAgICAgICBzd2l0Y2goZm10W2ZtdF9vZmZzZXRdKQorICAgICAgICB7CisgICAgICAgIGNhc2UgJ3MnOiAvLyBzdHJpbmcKKyAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX1NUUklORywKKyAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3Igc3RyaW5nIHNwZWNpZmllcjogJWQiLCBldmVudCk7CisgICAgICAgICAgICBib2R5LT5hcHBlbmQoKGNvbnN0IGNoYXIqKSBkYXR1bSwgbGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3QnOiAvLyB0aW1lc3RhbXAKKyAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX1RJTUVTVEFNUCwKKyAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3IgdGltZXN0YW1wIHNwZWNpZmllcjogJWQiLCBldmVudCk7CisgICAgICAgICAgICBhcHBlbmRUaW1lc3RhbXAoYm9keSwgZGF0dW0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnZCc6IC8vIGludGVnZXIKKyAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX0lOVEVHRVIsCisgICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIGludGVnZXIgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGFwcGVuZEludChib2R5LCBkYXR1bSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdmJzogLy8gZmxvYXQKKyAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX0ZMT0FULAorICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciBmbG9hdCBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgYXBwZW5kRmxvYXQoYm9keSwgZGF0dW0pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAncCc6IC8vIHBpZAorICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfUElELAorICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciBwaWQgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGFwcGVuZFBJRChib2R5LCBkYXR1bSwgbGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVygiTkJMb2cgUmVhZGVyIGVuY291bnRlcmVkIHVua25vd24gY2hhcmFjdGVyICVjIiwgZm10W2ZtdF9vZmZzZXRdKTsKKyAgICAgICAgfQorICAgICAgICArK2FyZzsKKyAgICB9CisgICAgQUxPR1dfSUYoYXJnLT50eXBlICE9IEVWRU5UX0VORF9GTVQsICJFeHBlY3RlZCBlbmQgb2YgZm9ybWF0LCBnb3QgJWQiLCBhcmctPnR5cGUpOworICAgICsrYXJnOworICAgIHJldHVybiBhcmc7Cit9CisKK05CTG9nOjpNZXJnZXI6Ok1lcmdlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKToKKyAgICAgIG1TaGFyZWQoKFNoYXJlZCAqKSBzaGFyZWQpLAorICAgICAgbUZpZm8obVNoYXJlZCAhPSBOVUxMID8KKyAgICAgICAgbmV3IGF1ZGlvX3V0aWxzX2ZpZm8oc2l6ZSwgc2l6ZW9mKHVpbnQ4X3QpLAorICAgICAgICAgICAgbVNoYXJlZC0+bUJ1ZmZlciwgbVNoYXJlZC0+bVJlYXIsIE5VTEwgLyp0aHJvdHRsZXNGcm9udCovKSA6IE5VTEwpLAorICAgICAgbUZpZm9Xcml0ZXIobUZpZm8gIT0gTlVMTCA/IG5ldyBhdWRpb191dGlsc19maWZvX3dyaXRlcigqbUZpZm8pIDogTlVMTCkKKyAgICAgIHt9CisKK3ZvaWQgTkJMb2c6Ok1lcmdlcjo6YWRkUmVhZGVyKGNvbnN0IE5CTG9nOjpOYW1lZFJlYWRlciAmcmVhZGVyKSB7CisKKyAgICAvLyBGSVhNRSBUaGlzIGlzIGNhbGxlZCBieSBiaW5kZXIgdGhyZWFkIGluIE1lZGlhTG9nU2VydmljZTo6cmVnaXN0ZXJXcml0ZXIKKyAgICAvLyAgICAgICBidXQgdGhlIGFjY2VzcyB0byBzaGFyZWQgdmFyaWFibGUgbU5hbWVkUmVhZGVycyBpcyBub3QgeWV0IHByb3RlY3RlZCBieSBhIGxvY2suCisgICAgbU5hbWVkUmVhZGVycy5wdXNoX2JhY2socmVhZGVyKTsKK30KKworLy8gaXRlbXMgcGxhY2VkIGluIHByaW9yaXR5IHF1ZXVlIGR1cmluZyBtZXJnZQorLy8gY29tcG9zZWQgYnkgYSB0aW1lc3RhbXAgYW5kIHRoZSBpbmRleCBvZiB0aGUgc25hcHNob3Qgd2hlcmUgdGhlIHRpbWVzdGFtcCBjYW1lIGZyb20KK3N0cnVjdCBNZXJnZUl0ZW0KK3sKKyAgICBpbnQ2NF90IHRzOworICAgIGludCBpbmRleDsKKyAgICBNZXJnZUl0ZW0oaW50NjRfdCB0cywgaW50IGluZGV4KTogdHModHMpLCBpbmRleChpbmRleCkge30KK307CisKKy8vIG9wZXJhdG9ycyBuZWVkZWQgZm9yIHByaW9yaXR5IHF1ZXVlIGluIG1lcmdlCisvLyBib29sIG9wZXJhdG9yPihjb25zdCBpbnQ2NF90ICZ0MSwgY29uc3QgaW50NjRfdCAmdDIpIHsKKy8vICAgICByZXR1cm4gdDEudHZfc2VjID4gdDIudHZfc2VjIHx8ICh0MS50dl9zZWMgPT0gdDIudHZfc2VjICYmIHQxLnR2X25zZWMgPiB0Mi50dl9uc2VjKTsKKy8vIH0KKworYm9vbCBvcGVyYXRvcj4oY29uc3Qgc3RydWN0IE1lcmdlSXRlbSAmaTEsIGNvbnN0IHN0cnVjdCBNZXJnZUl0ZW0gJmkyKSB7CisgICAgcmV0dXJuIGkxLnRzID4gaTIudHMgfHwgKGkxLnRzID09IGkyLnRzICYmIGkxLmluZGV4ID4gaTIuaW5kZXgpOworfQorCisvLyBNZXJnZSByZWdpc3RlcmVkIHJlYWRlcnMsIHNvcnRlZCBieSB0aW1lc3RhbXAsIGFuZCB3cml0ZSBkYXRhIHRvIGEgc2luZ2xlIEZJRk8gaW4gbG9jYWwgbWVtb3J5Cit2b2lkIE5CTG9nOjpNZXJnZXI6Om1lcmdlKCkgeworICAgIC8vIEZJWE1FIFRoaXMgaXMgY2FsbGVkIGJ5IG1lcmdlIHRocmVhZAorICAgIC8vICAgICAgIGJ1dCB0aGUgYWNjZXNzIHRvIHNoYXJlZCB2YXJpYWJsZSBtTmFtZWRSZWFkZXJzIGlzIG5vdCB5ZXQgcHJvdGVjdGVkIGJ5IGEgbG9jay4KKyAgICBpbnQgbkxvZ3MgPSBtTmFtZWRSZWFkZXJzLnNpemUoKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8TkJMb2c6OlJlYWRlcjo6U25hcHNob3Q+PiBzbmFwc2hvdHMobkxvZ3MpOworICAgIHN0ZDo6dmVjdG9yPE5CTG9nOjpFbnRyeUl0ZXJhdG9yPiBvZmZzZXRzKG5Mb2dzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Mb2dzOyArK2kpIHsKKyAgICAgICAgc25hcHNob3RzW2ldID0gbU5hbWVkUmVhZGVyc1tpXS5yZWFkZXIoKS0+Z2V0U25hcHNob3QoKTsKKyAgICAgICAgb2Zmc2V0c1tpXSA9IHNuYXBzaG90c1tpXS0+YmVnaW4oKTsKKyAgICB9CisgICAgLy8gaW5pdGlhbGl6ZSBvZmZzZXRzCisgICAgLy8gVE9ETyBjdXN0b20gaGVhcCBpbXBsZW1lbnRhdGlvbiBjb3VsZCBhbGxvdyB0byB1cGRhdGUgdG9wLCBpbXByb3ZpbmcgcGVyZm9ybWFuY2UKKyAgICAvLyBmb3IgYnVyc3R5IGJ1ZmZlcnMKKyAgICBzdGQ6OnByaW9yaXR5X3F1ZXVlPE1lcmdlSXRlbSwgc3RkOjp2ZWN0b3I8TWVyZ2VJdGVtPiwgc3RkOjpncmVhdGVyPE1lcmdlSXRlbT4+IHRpbWVzdGFtcHM7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTG9nczsgKytpKQorICAgIHsKKyAgICAgICAgaWYgKG9mZnNldHNbaV0gIT0gc25hcHNob3RzW2ldLT5lbmQoKSkgeworICAgICAgICAgICAgaW50NjRfdCB0cyA9IEFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkob2Zmc2V0c1tpXSktPnRpbWVzdGFtcCgpOworICAgICAgICAgICAgdGltZXN0YW1wcy5lbXBsYWNlKHRzLCBpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHdoaWxlICghdGltZXN0YW1wcy5lbXB0eSgpKSB7CisgICAgICAgIC8vIGZpbmQgbWluaW11bSB0aW1lc3RhbXAKKyAgICAgICAgaW50IGluZGV4ID0gdGltZXN0YW1wcy50b3AoKS5pbmRleDsKKyAgICAgICAgLy8gY29weSBpdCB0byB0aGUgbG9nLCBpbmNyZWFzaW5nIG9mZnNldAorICAgICAgICBvZmZzZXRzW2luZGV4XSA9IEFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkob2Zmc2V0c1tpbmRleF0pLT5jb3B5V2l0aEF1dGhvcihtRmlmb1dyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgICAgICAvLyB1cGRhdGUgZGF0YSBzdHJ1Y3R1cmVzCisgICAgICAgIHRpbWVzdGFtcHMucG9wKCk7CisgICAgICAgIGlmIChvZmZzZXRzW2luZGV4XSAhPSBzbmFwc2hvdHNbaW5kZXhdLT5lbmQoKSkgeworICAgICAgICAgICAgaW50NjRfdCB0cyA9IEFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkob2Zmc2V0c1tpbmRleF0pLT50aW1lc3RhbXAoKTsKKyAgICAgICAgICAgIHRpbWVzdGFtcHMuZW1wbGFjZSh0cywgaW5kZXgpOworICAgICAgICB9CisgICAgfQorfQorCitjb25zdCBzdGQ6OnZlY3RvcjxOQkxvZzo6TmFtZWRSZWFkZXI+JiBOQkxvZzo6TWVyZ2VyOjpnZXROYW1lZFJlYWRlcnMoKSBjb25zdCB7CisgICAgLy8gRklYTUUgVGhpcyBpcyByZXR1cm5pbmcgYSByZWZlcmVuY2UgdG8gYSBzaGFyZWQgdmFyaWFibGUgdGhhdCBuZWVkcyBhIGxvY2sKKyAgICByZXR1cm4gbU5hbWVkUmVhZGVyczsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05CTG9nOjpNZXJnZVJlYWRlcjo6TWVyZ2VSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSwgTWVyZ2VyICZtZXJnZXIpCisgICAgOiBSZWFkZXIoc2hhcmVkLCBzaXplKSwgbU5hbWVkUmVhZGVycyhtZXJnZXIuZ2V0TmFtZWRSZWFkZXJzKCkpIHt9CisKK3ZvaWQgTkJMb2c6Ok1lcmdlUmVhZGVyOjpoYW5kbGVBdXRob3IoY29uc3QgTkJMb2c6OkFic3RyYWN0RW50cnkgJmVudHJ5LCBTdHJpbmc4ICpib2R5KSB7CisgICAgaW50IGF1dGhvciA9IGVudHJ5LmF1dGhvcigpOworICAgIC8vIEZJWE1FIE5lZWRzIGEgbG9jaworICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBtTmFtZWRSZWFkZXJzW2F1dGhvcl0ubmFtZSgpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJXM6ICIsIG5hbWUpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTkJMb2c6Ok1lcmdlVGhyZWFkOjpNZXJnZVRocmVhZChOQkxvZzo6TWVyZ2VyICZtZXJnZXIsIE5CTG9nOjpNZXJnZVJlYWRlciAmbWVyZ2VSZWFkZXIpCisgICAgOiBtTWVyZ2VyKG1lcmdlciksCisgICAgICBtTWVyZ2VSZWFkZXIobWVyZ2VSZWFkZXIpLAorICAgICAgbVRpbWVvdXRVcygwKSB7fQorCitOQkxvZzo6TWVyZ2VUaHJlYWQ6On5NZXJnZVRocmVhZCgpIHsKKyAgICAvLyBzZXQgZXhpdCBmbGFnLCBzZXQgdGltZW91dCB0byAwIHRvIGZvcmNlIHRocmVhZExvb3AgdG8gZXhpdCBhbmQgd2FpdCBmb3IgdGhlIHRocmVhZCB0byBqb2luCisgICAgcmVxdWVzdEV4aXQoKTsKKyAgICBzZXRUaW1lb3V0VXMoMCk7CisgICAgam9pbigpOworfQorCitib29sIE5CTG9nOjpNZXJnZVRocmVhZDo6dGhyZWFkTG9vcCgpIHsKKyAgICBib29sIGRvTWVyZ2U7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKKyAgICAgICAgLy8gSWYgbVRpbWVvdXRVcyBpcyBuZWdhdGl2ZSwgd2FpdCBvbiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlIHVudGlsIGl0J3MgcG9zaXRpdmUuCisgICAgICAgIC8vIElmIGl0J3MgcG9zaXRpdmUsIHdhaXQga1RocmVhZFNsZWVwUGVyaW9kVXMgYW5kIHRoZW4gbWVyZ2UKKyAgICAgICAgbnNlY3NfdCB3YWl0VGltZSA9IG1UaW1lb3V0VXMgPiAwID8ga1RocmVhZFNsZWVwUGVyaW9kVXMgKiAxMDAwIDogTExPTkdfTUFYOworICAgICAgICBtQ29uZC53YWl0UmVsYXRpdmUobU11dGV4LCB3YWl0VGltZSk7CisgICAgICAgIGRvTWVyZ2UgPSBtVGltZW91dFVzID4gMDsKKyAgICAgICAgbVRpbWVvdXRVcyAtPSBrVGhyZWFkU2xlZXBQZXJpb2RVczsKKyAgICB9CisgICAgaWYgKGRvTWVyZ2UpIHsKKyAgICAgICAgLy8gTWVyZ2UgZGF0YSBmcm9tIGFsbCB0aGUgcmVhZGVycworICAgICAgICBtTWVyZ2VyLm1lcmdlKCk7CisgICAgICAgIC8vIFByb2Nlc3MgdGhlIGRhdGEgY29sbGVjdGVkIGJ5IG1NZXJnZXIgYW5kIHdyaXRlIGl0IHRvIFBlcmZvcm1hbmNlQW5hbHlzaXMKKyAgICAgICAgLy8gRklYTUU6IGRlY2lkZSB3aGV0aGVyIHRvIGNhbGwgZ2V0QW5kUHJvY2Vzc1NuYXBzaG90IGV2ZXJ5IHRpbWUKKyAgICAgICAgLy8gb3Igd2hldGhlciB0byBoYXZlIGEgc2VwYXJhdGUgdGhyZWFkIHRoYXQgY2FsbHMgaXQgd2l0aCBhIGxvd2VyIGZyZXF1ZW5jeQorICAgICAgICBtTWVyZ2VSZWFkZXIuZ2V0QW5kUHJvY2Vzc1NuYXBzaG90KCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIE5CTG9nOjpNZXJnZVRocmVhZDo6d2FrZXVwKCkgeworICAgIHNldFRpbWVvdXRVcyhrVGhyZWFkV2FrZXVwUGVyaW9kVXMpOworfQorCit2b2lkIE5CTG9nOjpNZXJnZVRocmVhZDo6c2V0VGltZW91dFVzKGludCB0aW1lKSB7CisgICAgQXV0b011dGV4IF9sKG1NdXRleCk7CisgICAgbVRpbWVvdXRVcyA9IHRpbWU7CisgICAgbUNvbmQuc2lnbmFsKCk7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5jcHAgYi9tZWRpYS9saWJuYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDllOTNkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5jcHAKQEAgLTAsMCArMSwzNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNkZWZpbmUgTE9HX1RBRyAiUGVyZm9ybWFuY2VBbmFseXNpcyIKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8bnVtZXJpYz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3JvdW5kdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9OQkxvZy5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgPHF1ZXVlPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlIHsKKworLy8gR2l2ZW4gYW4gYXVkaW8gcHJvY2Vzc2luZyB3YWtldXAgdGltZXN0YW1wLCBidWNrZXRzIHRoZSB0aW1lIGludGVydmFsCisvLyBzaW5jZSB0aGUgcHJldmlvdXMgdGltZXN0YW1wIGludG8gYSBoaXN0b2dyYW0sIHNlYXJjaGVzIGZvcgorLy8gb3V0bGllcnMsIGFuYWx5emVzIHRoZSBvdXRsaWVyIHNlcmllcyBmb3IgdW5leHBlY3RlZGx5CisvLyBzbWFsbCBvciBsYXJnZSB2YWx1ZXMgYW5kIHN0b3JlcyB0aGVzZSBhcyBwZWFrcwordm9pZCBQZXJmb3JtYW5jZUFuYWx5c2lzOjpsb2dUc0VudHJ5KHRpbWVzdGFtcCB0cykgeworICAgIC8vIGFmdGVyIGEgc3RhdGUgY2hhbmdlLCBzdGFydCBhIG5ldyBzZXJpZXMgYW5kIGRvIG5vdAorICAgIC8vIHJlY29yZCB0aW1lIGludGVydmFscyBpbi1iZXR3ZWVuCisgICAgaWYgKG1CdWZmZXJQZXJpb2QubVByZXZUcyA9PSAwKSB7CisgICAgICAgIG1CdWZmZXJQZXJpb2QubVByZXZUcyA9IHRzOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gY2FsY3VsYXRlIHRpbWUgaW50ZXJ2YWwgYmV0d2VlbiBjdXJyZW50IGFuZCBwcmV2aW91cyB0aW1lc3RhbXAKKyAgICBjb25zdCBtc0ludGVydmFsIGRpZmZNcyA9IHN0YXRpY19jYXN0PG1zSW50ZXJ2YWw+KAorICAgICAgICBkZWx0YU1zKG1CdWZmZXJQZXJpb2QubVByZXZUcywgdHMpKTsKKworICAgIGNvbnN0IGludCBkaWZmSmlmZnkgPSBkZWx0YUppZmZ5KG1CdWZmZXJQZXJpb2QubVByZXZUcywgdHMpOworCisgICAgLy8gb2xkIHZlcnN1cyBuZXcgd2VpZ2h0IHJhdGlvIHdoZW4gdXBkYXRpbmcgdGhlIGJ1ZmZlciBwZXJpb2QgbWVhbgorICAgIHN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGV4cG9uZW50aWFsV2VpZ2h0ID0gMC45OTk7CisgICAgLy8gdXBkYXRlIGJ1ZmZlciBwZXJpb2QgbWVhbiB3aXRoIGV4cG9uZW50aWFsIHdlaWdodGluZworICAgIG1CdWZmZXJQZXJpb2QubU1lYW4gPSAobUJ1ZmZlclBlcmlvZC5tTWVhbiA8IDApID8gZGlmZk1zIDoKKyAgICAgICAgICAgIGV4cG9uZW50aWFsV2VpZ2h0ICogbUJ1ZmZlclBlcmlvZC5tTWVhbiArICgxLjAgLSBleHBvbmVudGlhbFdlaWdodCkgKiBkaWZmTXM7CisgICAgLy8gc2V0IG1PdXRsaWVyRmFjdG9yIHRvIGEgc21hbGxlciB2YWx1ZSBmb3IgdGhlIGZhc3RtaXhlciB0aHJlYWQKKyAgICBjb25zdCBpbnQga0Zhc3RNaXhlck1heCA9IDEwOworICAgIC8vIE5vcm1hbE1peGVyIHRpbWVzIHZhcnkgbXVjaCBtb3JlIHRoYW4gRmFzdE1peGVyIHRpbWVzLgorICAgIC8vIFRPRE86IG1PdXRsaWVyRmFjdG9yIHZhbHVlcyBhcmUgc2V0IGVtcGlyaWNhbGx5IGJhc2VkIG9uIHdoYXQgYXBwZWFycyB0byBiZQorICAgIC8vIGFuIG91dGxpZXIuIExlYXJuIHRoZXNlIHZhbHVlcyBmcm9tIHRoZSBkYXRhLgorICAgIG1CdWZmZXJQZXJpb2QubU91dGxpZXJGYWN0b3IgPSBtQnVmZmVyUGVyaW9kLm1NZWFuIDwga0Zhc3RNaXhlck1heCA/IDEuOCA6IDIuMDsKKyAgICAvLyBzZXQgb3V0bGllciB0aHJlc2hvbGQKKyAgICBtQnVmZmVyUGVyaW9kLm1PdXRsaWVyID0gbUJ1ZmZlclBlcmlvZC5tTWVhbiAqIG1CdWZmZXJQZXJpb2QubU91dGxpZXJGYWN0b3I7CisKKyAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSB0aW1lIGludGVydmFsIGJldHdlZW4gdGhlIGN1cnJlbnQgdGltZXN0YW1wCisgICAgLy8gYW5kIHRoZSBwcmV2aW91cyBvbmUgaXMgbG9uZyBlbm91Z2ggdG8gY291bnQgYXMgYW4gb3V0bGllcgorICAgIGNvbnN0IGJvb2wgaXNPdXRsaWVyID0gZGV0ZWN0QW5kU3RvcmVPdXRsaWVyKGRpZmZNcyk7CisgICAgLy8gSWYgYW4gb3V0bGllciB3YXMgZm91bmQsIGNoZWNrIHdoZXRoZXIgaXQgd2FzIGEgcGVhaworICAgIGlmIChpc091dGxpZXIpIHsKKyAgICAgICAgLypib29sIGlzUGVhayA9Ki8gZGV0ZWN0QW5kU3RvcmVQZWFrKAorICAgICAgICAgICAgbU91dGxpZXJEYXRhWzBdLmZpcnN0LCBtT3V0bGllckRhdGFbMF0uc2Vjb25kKTsKKyAgICAgICAgLy8gVE9ETzogZGVjaWRlIHdoZXRoZXIgdG8gaW5zZXJ0IGEgbmV3IGVtcHR5IGhpc3RvZ3JhbSBpZiBhIHBlYWsKKyAgICAgICAgLy8gVE9ETzogcmVtb3ZlIGlzUGVhayBpZiB1bnVzZWQgdG8gYXZvaWQgInVudXNlZCB2YXJpYWJsZSIgZXJyb3IKKyAgICAgICAgLy8gb2NjdXJyZWQgYXQgdGhlIGN1cnJlbnQgdGltZXN0YW1wCisgICAgfQorCisgICAgLy8gSW5zZXJ0IGEgaGlzdG9ncmFtIHRvIG1IaXN0cyBpZiBpdCBpcyBlbXB0eSwgb3IKKyAgICAvLyBjbG9zZSB0aGUgY3VycmVudCBoaXN0b2dyYW0gYW5kIGluc2VydCBhIG5ldyBlbXB0eSBvbmUgaWYKKyAgICAvLyBpZiB0aGUgY3VycmVudCBoaXN0b2dyYW0gaGFzIHNwYW5uZWQgaXRzIG1heGltdW0gdGltZSBpbnRlcnZhbC4KKyAgICBpZiAobUhpc3RzLmVtcHR5KCkgfHwKKyAgICAgICAgZGVsdGFNcyhtSGlzdHNbMF0uZmlyc3QsIHRzKSA+PSBrTWF4TGVuZ3RoLkhpc3RUaW1lc3Bhbk1zKSB7CisgICAgICAgIG1IaXN0cy5lbXBsYWNlX2Zyb250KHRzLCBzdGQ6Om1hcDxpbnQsIGludD4oKSk7CisgICAgICAgIC8vIFdoZW4gbWVtb3J5IGlzIGZ1bGwsIGRlbGV0ZSBvbGRlc3QgaGlzdG9ncmFtCisgICAgICAgIC8vIFRPRE86IHVzZSBhIGNpcmN1bGFyIGJ1ZmZlcgorICAgICAgICBpZiAobUhpc3RzLnNpemUoKSA+PSBrTWF4TGVuZ3RoLkhpc3RzKSB7CisgICAgICAgICAgICBtSGlzdHMucmVzaXplKGtNYXhMZW5ndGguSGlzdHMpOworICAgICAgICB9CisgICAgfQorICAgIC8vIGFkZCBjdXJyZW50IHRpbWUgaW50ZXJ2YWxzIHRvIGhpc3RvZ3JhbQorICAgICsrbUhpc3RzWzBdLnNlY29uZFtkaWZmSmlmZnldOworICAgIC8vIHVwZGF0ZSBwcmV2aW91cyB0aW1lc3RhbXAKKyAgICBtQnVmZmVyUGVyaW9kLm1QcmV2VHMgPSB0czsKK30KKworCisvLyBmb3JjZXMgc2hvcnQtdGVybSBoaXN0b2dyYW0gc3RvcmFnZSB0byBhdm9pZCBhZGRpbmcgaWRsZSBhdWRpbyB0aW1lIGludGVydmFsCisvLyB0byBidWZmZXIgcGVyaW9kIGRhdGEKK3ZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6aGFuZGxlU3RhdGVDaGFuZ2UoKSB7CisgICAgbUJ1ZmZlclBlcmlvZC5tUHJldlRzID0gMDsKKyAgICByZXR1cm47Cit9CisKKworLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIHRpbWUgaW50ZXJ2YWwgYmV0d2VlbiB0d28gb3V0bGllcnMgaXMgZmFyIGVub3VnaCBmcm9tCisvLyBhIHR5cGljYWwgZGVsdGEgdG8gYmUgY29uc2lkZXJlZCBhIHBlYWsuCisvLyBsb29rcyBmb3IgY2hhbmdlcyBpbiBkaXN0cmlidXRpb24gKHBlYWtzKSwgd2hpY2ggY2FuIGJlIGVpdGhlciBwb3NpdGl2ZSBvciBuZWdhdGl2ZS4KKy8vIFRoZSBmdW5jdGlvbiBzZXRzIHRoZSBtZWFuIHRvIHRoZSBzdGFydGluZyB2YWx1ZSBhbmQgc2lnbWEgdG8gMCwgYW5kIHVwZGF0ZXMKKy8vIHRoZW0gYXMgbG9uZyBhcyBubyBwZWFrIGlzIGRldGVjdGVkLiBXaGVuIGEgdmFsdWUgaXMgbW9yZSB0aGFuICd0aHJlc2hvbGQnCisvLyBzdGFuZGFyZCBkZXZpYXRpb25zIGZyb20gdGhlIG1lYW4sIGEgcGVhayBpcyBkZXRlY3RlZCBhbmQgdGhlIG1lYW4gYW5kIHNpZ21hCisvLyBhcmUgc2V0IHRvIHRoZSBwZWFrIHZhbHVlIGFuZCAwLgorYm9vbCBQZXJmb3JtYW5jZUFuYWx5c2lzOjpkZXRlY3RBbmRTdG9yZVBlYWsobXNJbnRlcnZhbCBkaWZmLCB0aW1lc3RhbXAgdHMpIHsKKyAgICBib29sIGlzUGVhayA9IGZhbHNlOworICAgIGlmIChtT3V0bGllckRhdGEuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIFVwZGF0ZSBtZWFuIG9mIHRoZSBkaXN0cmlidXRpb24KKyAgICAvLyBUeXBpY2FsRGlmZiBpcyB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgYSB2YWx1ZSBpcyB1bnVzdWFsbHkgbGFyZ2UKKyAgICAvLyB3aGVuIHdlIGNhbm5vdCB1c2Ugc3RhbmRhcmQgZGV2aWF0aW9ucyBmcm9tIHRoZSBtZWFuIGJlY2F1c2UgdGhlIHNkIGlzIHNldCB0byAwLgorICAgIG1PdXRsaWVyRGlzdHJpYnV0aW9uLm1UeXBpY2FsRGlmZiA9IChtT3V0bGllckRpc3RyaWJ1dGlvbi5tVHlwaWNhbERpZmYgKgorICAgICAgICAgICAgKG1PdXRsaWVyRGF0YS5zaXplKCkgLSAxKSArIGRpZmYpIC8gbU91dGxpZXJEYXRhLnNpemUoKTsKKworICAgIC8vIEluaXRpYWxpemUgc2hvcnQtdGVybSBtZWFuIGF0IHN0YXJ0IG9mIHByb2dyYW0KKyAgICBpZiAobU91dGxpZXJEaXN0cmlidXRpb24ubU1lYW4gPT0gMCkgeworICAgICAgICBtT3V0bGllckRpc3RyaWJ1dGlvbi5tTWVhbiA9IGRpZmY7CisgICAgfQorICAgIC8vIFVwZGF0ZSBsZW5ndGggb2YgY3VycmVudCBzZXF1ZW5jZSBvZiBvdXRsaWVycworICAgIG1PdXRsaWVyRGlzdHJpYnV0aW9uLm1OKys7CisKKyAgICAvLyBDaGVjayB3aGV0aGVyIGEgbGFyZ2UgZGV2aWF0aW9uIGZyb20gdGhlIG1lYW4gb2NjdXJyZWQuCisgICAgLy8gSWYgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBoYXMgYmVlbiByZXNldCB0byB6ZXJvLCB0aGUgY29tcGFyaXNvbiBpcworICAgIC8vIGluc3RlYWQgdG8gdGhlIG1lYW4gb2YgdGhlIGZ1bGwgbU91dGxpZXJJbnRlcnZhbCBzZXF1ZW5jZS4KKyAgICBpZiAoKGZhYnMoZGlmZiAtIG1PdXRsaWVyRGlzdHJpYnV0aW9uLm1NZWFuKSA8CisgICAgICAgICAgICBtT3V0bGllckRpc3RyaWJ1dGlvbi5rTWF4RGV2aWF0aW9uICogbU91dGxpZXJEaXN0cmlidXRpb24ubVNkKSB8fAorICAgICAgICAgICAgKG1PdXRsaWVyRGlzdHJpYnV0aW9uLm1TZCA9PSAwICYmCisgICAgICAgICAgICBmYWJzKGRpZmYgLSBtT3V0bGllckRpc3RyaWJ1dGlvbi5tTWVhbikgPAorICAgICAgICAgICAgbU91dGxpZXJEaXN0cmlidXRpb24ubVR5cGljYWxEaWZmKSkgeworICAgICAgICAvLyB1cGRhdGUgdGhlIG1lYW4gYW5kIHNkIHVzaW5nIG9ubGluZSBhbGdvcml0aG0KKyAgICAgICAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvCisgICAgICAgIC8vIEFsZ29yaXRobXNfZm9yX2NhbGN1bGF0aW5nX3ZhcmlhbmNlI09ubGluZV9hbGdvcml0aG0KKyAgICAgICAgbU91dGxpZXJEaXN0cmlidXRpb24ubU4rKzsKKyAgICAgICAgY29uc3QgZG91YmxlIGtEZWx0YSA9IGRpZmYgLSBtT3V0bGllckRpc3RyaWJ1dGlvbi5tTWVhbjsKKyAgICAgICAgbU91dGxpZXJEaXN0cmlidXRpb24ubU1lYW4gKz0ga0RlbHRhIC8gbU91dGxpZXJEaXN0cmlidXRpb24ubU47CisgICAgICAgIGNvbnN0IGRvdWJsZSBrRGVsdGEyID0gZGlmZiAtIG1PdXRsaWVyRGlzdHJpYnV0aW9uLm1NZWFuOworICAgICAgICBtT3V0bGllckRpc3RyaWJ1dGlvbi5tTTIgKz0ga0RlbHRhICoga0RlbHRhMjsKKyAgICAgICAgbU91dGxpZXJEaXN0cmlidXRpb24ubVNkID0gKG1PdXRsaWVyRGlzdHJpYnV0aW9uLm1OIDwgMikgPyAwIDoKKyAgICAgICAgICAgICAgICBzcXJ0KG1PdXRsaWVyRGlzdHJpYnV0aW9uLm1NMiAvIChtT3V0bGllckRpc3RyaWJ1dGlvbi5tTiAtIDEpKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBuZXcgdmFsdWUgaXMgZmFyIGZyb20gdGhlIG1lYW46CisgICAgICAgIC8vIHN0b3JlIHBlYWsgdGltZXN0YW1wIGFuZCByZXNldCBtZWFuLCBzZCwgYW5kIHNob3J0LXRlcm0gc2VxdWVuY2UKKyAgICAgICAgaXNQZWFrID0gdHJ1ZTsKKyAgICAgICAgbVBlYWtUaW1lc3RhbXBzLmVtcGxhY2VfZnJvbnQodHMpOworICAgICAgICAvLyBpZiBtUGVha3MgaGFzIHJlYWNoZWQgY2FwYWNpdHksIGRlbGV0ZSBvbGRlc3QgZGF0YQorICAgICAgICAvLyBOb3RlOiB0aGlzIG1lYW5zIHRoYXQgbU91dGxpZXJEaXN0cmlidXRpb24gdmFsdWVzIGRvIG5vdCBleGFjdGx5CisgICAgICAgIC8vIG1hdGNoIHRoZSBkYXRhIHdlIGhhdmUgaW4gbVBlYWtUaW1lc3RhbXBzLCBidXQgdGhpcyBpcyBub3QgYW4gaXNzdWUKKyAgICAgICAgLy8gaW4gcHJhY3RpY2UgZm9yIGVzdGltYXRpbmcgZnV0dXJlIHBlYWtzLgorICAgICAgICAvLyBUT0RPOiB0dXJuIHRoaXMgaW50byBhIGNpcmN1bGFyIGJ1ZmZlcgorICAgICAgICBpZiAobVBlYWtUaW1lc3RhbXBzLnNpemUoKSA+PSBrTWF4TGVuZ3RoLlBlYWtzKSB7CisgICAgICAgICAgICBtUGVha1RpbWVzdGFtcHMucmVzaXplKGtNYXhMZW5ndGguUGVha3MpOworICAgICAgICB9CisgICAgICAgIG1PdXRsaWVyRGlzdHJpYnV0aW9uLm1NZWFuID0gMDsKKyAgICAgICAgbU91dGxpZXJEaXN0cmlidXRpb24ubVNkID0gMDsKKyAgICAgICAgbU91dGxpZXJEaXN0cmlidXRpb24ubU4gPSAwOworICAgICAgICBtT3V0bGllckRpc3RyaWJ1dGlvbi5tTTIgPSAwOworICAgIH0KKyAgICByZXR1cm4gaXNQZWFrOworfQorCisKKy8vIERldGVybWluZXMgd2hldGhlciB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgdGltZXN0YW1wIGFuZCB0aGUgcHJldmlvdXMKKy8vIG9uZSBpcyBiZXlvbmQgYSB0aHJlc2hvbGQuIElmIHllcywgc3RvcmVzIHRoZSB0aW1lc3RhbXAgYXMgYW4gb3V0bGllcgorLy8gYW5kIHdyaXRlcyB0byBtT3V0bGllcmRhdGEgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisvLyBUaW1lIGVsYXBzZWQgc2luY2UgcHJldmlvdXMgb3V0bGllcjogVGltZXN0YW1wIG9mIHN0YXJ0IG9mIG91dGxpZXIKKy8vIGUuZy4gdGltZXN0YW1wcyAobXMpIDEsIDQsIDUsIDE2LCAxOCwgMjggd2lsbCBwcm9kdWNlIHBhaXJzICg0LCA1KSwgKDEzLCAxOCkuCisvLyBUT0RPOiBsZWFybiB3aGF0IHRpbWVzdGFtcCBzZXF1ZW5jZXMgY29ycmVsYXRlIHdpdGggZ2xpdGNoZXMgaW5zdGVhZCBvZgorLy8gbWFudWFsbHkgZGVzaWduaW5nIGEgaGV1cmlzdGljLgorYm9vbCBQZXJmb3JtYW5jZUFuYWx5c2lzOjpkZXRlY3RBbmRTdG9yZU91dGxpZXIoY29uc3QgbXNJbnRlcnZhbCBkaWZmTXMpIHsKKyAgICBib29sIGlzT3V0bGllciA9IGZhbHNlOworICAgIGlmIChkaWZmTXMgPj0gbUJ1ZmZlclBlcmlvZC5tT3V0bGllcikgeworICAgICAgICBpc091dGxpZXIgPSB0cnVlOworICAgICAgICBtT3V0bGllckRhdGEuZW1wbGFjZV9mcm9udCgKKyAgICAgICAgICAgICAgICBtT3V0bGllckRpc3RyaWJ1dGlvbi5tRWxhcHNlZCwgbUJ1ZmZlclBlcmlvZC5tUHJldlRzKTsKKyAgICAgICAgLy8gUmVtb3ZlIG9sZGVzdCB2YWx1ZSBpZiB0aGUgdmVjdG9yIGlzIGZ1bGwKKyAgICAgICAgLy8gVE9ETzogdHVybiB0aGlzIGludG8gYSBjaXJjdWxhciBidWZmZXIKKyAgICAgICAgLy8gVE9ETzogbWFrZSBzdXJlIGtTaG9ydEhpc3RTaXplIGlzIGxhcmdlIGVub3VnaCB0aGF0IHRoYXQgZGF0YSB3aWxsIG5ldmVyIGJlIGxvc3QKKyAgICAgICAgLy8gYmVmb3JlIGJlaW5nIHdyaXR0ZW4gdG8gZmlsZSBvciB0byBhIEZJRk8KKyAgICAgICAgaWYgKG1PdXRsaWVyRGF0YS5zaXplKCkgPj0ga01heExlbmd0aC5PdXRsaWVycykgeworICAgICAgICAgICAgbU91dGxpZXJEYXRhLnJlc2l6ZShrTWF4TGVuZ3RoLk91dGxpZXJzKTsKKyAgICAgICAgfQorICAgICAgICBtT3V0bGllckRpc3RyaWJ1dGlvbi5tRWxhcHNlZCA9IDA7CisgICAgfQorICAgIG1PdXRsaWVyRGlzdHJpYnV0aW9uLm1FbGFwc2VkICs9IGRpZmZNczsKKyAgICByZXR1cm4gaXNPdXRsaWVyOworfQorCitzdGF0aWMgaW50IHdpZHRoT2YoaW50IHgpIHsKKyAgICBpbnQgd2lkdGggPSAwOworICAgIGlmICh4IDwgMCkgeworICAgICAgICB3aWR0aCsrOworICAgICAgICB4ID0geCA9PSBJTlRfTUlOID8gSU5UX01BWCA6IC14OworICAgIH0KKyAgICAvLyBhc3NlcnQgKHggPj0gMCkKKyAgICBkbyB7CisgICAgICAgICsrd2lkdGg7CisgICAgICAgIHggLz0gMTA7CisgICAgfSB3aGlsZSAoeCA+IDApOworICAgIHJldHVybiB3aWR0aDsKK30KKworLy8gY29tcHV0ZXMgdGhlIGNvbHVtbiB3aWR0aCByZXF1aXJlZCBmb3IgYSBzcGVjaWZpYyBoaXN0b2dyYW0gdmFsdWUKK2lubGluZSBpbnQgbnVtYmVyV2lkdGgoZG91YmxlIG51bWJlciwgaW50IGxlZnRQYWRkaW5nKSB7CisgICAgLy8gQWRkZWQgdmFsdWVzIGFjY291bnQgZm9yIHdoaXRlc3BhY2VzIG5lZWRlZCBhcm91bmQgbnVtYmVycywgYW5kIGZvciB0aGUKKyAgICAvLyBkb3QgYW5kIGRlY2ltYWwgZGlnaXQgbm90IGFjY291bnRlZCBmb3IgYnkgd2lkdGhPZgorICAgIHJldHVybiBzdGQ6Om1heChzdGQ6Om1heCh3aWR0aE9mKHN0YXRpY19jYXN0PGludD4obnVtYmVyKSkgKyAzLCAyKSwgbGVmdFBhZGRpbmcgKyAxKTsKK30KKworLy8gcm91bmRzIHZhbHVlIHRvIHByZWNpc2lvbiBiYXNlZCBvbiBsb2ctZGlzdGFuY2UgZnJvbSBtZWFuCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCitpbmxpbmUgZG91YmxlIGxvZ1JvdW5kKGRvdWJsZSB4LCBkb3VibGUgbWVhbikgeworICAgIC8vIExhcmdlciB2YWx1ZXMgZGVjcmVhc2UgcmFuZ2Ugb2YgaGlnaCByZXNvbHV0aW9uIGFuZCBwcmV2ZW50IG92ZXJmbG93CisgICAgLy8gb2YgYSBoaXN0b2dyYW0gb24gdGhlIGNvbnNvbGUuCisgICAgLy8gVGhlIGZvbGxvd2luZyBmb3JtdWxhIGFkanVzdHMga0Jhc2UgYmFzZWQgb24gdGhlIGJ1ZmZlciBwZXJpb2QgbGVuZ3RoLgorICAgIC8vIERpZmZlcmVudCB0aHJlYWRzIGhhdmUgYnVmZmVyIHBlcmlvZHMgcmFuZ2luZyBmcm9tIDIgdG8gNDAuIFRoZQorICAgIC8vIGZvcm11bGEgYmVsb3cgbWFwcyBidWZmZXIgcGVyaW9kIDIgdG8ga0Jhc2UgPSB+MSwgNCB0byB+MiwgMjAgdG8gfjMsIDQwIHRvIH40LgorICAgIC8vIFRPRE86IHRpZ2h0ZW4gdGhpcyBmb3IgaGlnaGVyIG1lYW5zLCB0aGUgZGF0YSBzdGlsbCBvdmVyZmxvd3MKKyAgICBjb25zdCBkb3VibGUga0Jhc2UgPSBsb2cobWVhbikgLyBsb2coMi4yKTsKKyAgICBjb25zdCBkb3VibGUgcG93ZXIgPSBmbG9vcigKKyAgICAgICAgbG9nKGFicyh4IC0gbWVhbikgLyBtZWFuKSAvIGxvZyhrQmFzZSkpICsgMjsKKyAgICAvLyBkbyBub3Qgcm91bmQgdmFsdWVzIGNsb3NlIHRvIHRoZSBtZWFuCisgICAgaWYgKHBvd2VyIDwgMSkgeworICAgICAgICByZXR1cm4geDsKKyAgICB9CisgICAgY29uc3QgaW50IGZhY3RvciA9IHN0YXRpY19jYXN0PGludD4ocG93KDEwLCBwb3dlcikpOworICAgIHJldHVybiAoc3RhdGljX2Nhc3Q8aW50Pih4KSAqIGZhY3RvcikgLyBmYWN0b3I7Cit9CisKKy8vIFRPRE8gTWFrZSBpdCByZXR1cm4gYSBzdGQ6OnN0cmluZyBpbnN0ZWFkIG9mIG1vZGlmeWluZyBib2R5CisvLyBUT0RPOiBtb3ZlIHRoaXMgdG8gUmVwb3J0UGVyZm9ybWFuY2UsIHByb2JhYmx5IG1ha2UgaXQgYSBmcmllbmQgZnVuY3Rpb24KKy8vIG9mIFBlcmZvcm1hbmNlQW5hbHlzaXMKK3ZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6cmVwb3J0UGVyZm9ybWFuY2UoU3RyaW5nOCAqYm9keSwgaW50IGF1dGhvciwgbG9nX2hhc2hfdCBoYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4SGVpZ2h0KSB7CisgICAgaWYgKG1IaXN0cy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBtcyBvZiBhY3RpdmUgYXVkaW8gaW4gZGlzcGxheWVkIGhpc3RvZ3JhbQorICAgIGRvdWJsZSBlbGFwc2VkTXMgPSAwOworICAgIC8vIHN0YXJ0aW5nIHRpbWVzdGFtcCBvZiBoaXN0b2dyYW0KKyAgICB0aW1lc3RhbXAgc3RhcnRpbmdUcyA9IG1IaXN0c1swXS5maXJzdDsKKworICAgIC8vIGhpc3RvZ3JhbSB3aGljaCBzdG9yZXMgLjEgcHJlY2lzaW9uIG1zIGNvdW50cyBpbnN0ZWFkIG9mIEppZmZ5IG11bHRpcGxlIGNvdW50cworICAgIHN0ZDo6bWFwPGRvdWJsZSwgaW50PiBidWNrZXRzOworICAgIGZvciAoY29uc3QgYXV0byAmc2hvcnRIaXN0OiBtSGlzdHMpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZjb3VudFBhaXIgOiBzaG9ydEhpc3Quc2Vjb25kKSB7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbXMgPSBzdGF0aWNfY2FzdDxkb3VibGU+KGNvdW50UGFpci5maXJzdCkgLyBrSmlmZnlQZXJNczsKKyAgICAgICAgICAgIGJ1Y2tldHNbbG9nUm91bmQobXMsIG1CdWZmZXJQZXJpb2QubU1lYW4pXSArPSBjb3VudFBhaXIuc2Vjb25kOworICAgICAgICAgICAgZWxhcHNlZE1zICs9IG1zICogY291bnRQYWlyLnNlY29uZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHVuZGVyc2NvcmVzIGFuZCBzcGFjZXMgbGVuZ3RoIGNvcnJlc3BvbmRzIHRvIG1heGltdW0gd2lkdGggb2YgaGlzdG9ncmFtCisgICAgc3RhdGljIGNvbnN0IGludCBrTGVuID0gMjAwOworICAgIHN0ZDo6c3RyaW5nIHVuZGVyc2NvcmVzKGtMZW4sICdfJyk7CisgICAgc3RkOjpzdHJpbmcgc3BhY2VzKGtMZW4sICcgJyk7CisKKyAgICBhdXRvIGl0ID0gYnVja2V0cy5iZWdpbigpOworICAgIGRvdWJsZSBtYXhEZWx0YSA9IGl0LT5maXJzdDsKKyAgICBpbnQgbWF4Q291bnQgPSBpdC0+c2Vjb25kOworICAgIC8vIENvbXB1dGUgbWF4aW11bSB2YWx1ZXMKKyAgICB3aGlsZSAoKytpdCAhPSBidWNrZXRzLmVuZCgpKSB7CisgICAgICAgIGlmIChpdC0+Zmlyc3QgPiBtYXhEZWx0YSkgeworICAgICAgICAgICAgbWF4RGVsdGEgPSBpdC0+Zmlyc3Q7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGl0LT5zZWNvbmQgPiBtYXhDb3VudCkgeworICAgICAgICAgICAgbWF4Q291bnQgPSBpdC0+c2Vjb25kOworICAgICAgICB9CisgICAgfQorICAgIGludCBoZWlnaHQgPSBsb2cyKG1heENvdW50KSArIDE7IC8vIG1heENvdW50ID4gMCwgc2FmZSB0byBjYWxsIGxvZzIKKyAgICBjb25zdCBpbnQgbGVmdFBhZGRpbmcgPSB3aWR0aE9mKDEgPDwgaGVpZ2h0KTsKKyAgICBjb25zdCBpbnQgYnVja2V0V2lkdGggPSBudW1iZXJXaWR0aChtYXhEZWx0YSwgbGVmdFBhZGRpbmcpOworICAgIGludCBzY2FsaW5nRmFjdG9yID0gMTsKKyAgICAvLyBzY2FsZSBkYXRhIGlmIGl0IGV4Y2VlZHMgbWF4aW11bSBoZWlnaHQKKyAgICBpZiAoaGVpZ2h0ID4gbWF4SGVpZ2h0KSB7CisgICAgICAgIHNjYWxpbmdGYWN0b3IgPSAoaGVpZ2h0ICsgbWF4SGVpZ2h0KSAvIG1heEhlaWdodDsKKyAgICAgICAgaGVpZ2h0IC89IHNjYWxpbmdGYWN0b3I7CisgICAgfQorICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lKnMgJTMuMmYgJXMiLCBsZWZ0UGFkZGluZyArIDExLAorICAgICAgICAgICAgIk9jY3VycmVuY2VzIGluIiwgKGVsYXBzZWRNcyAvIGtNc1BlclNlYyksICJzZWNvbmRzIG9mIGF1ZGlvOiIpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lKnMlZCwgJWxsZCwgJWxsZFxuIiwgbGVmdFBhZGRpbmcgKyAxMSwKKyAgICAgICAgICAgICJUaHJlYWQsIGhhc2gsIHN0YXJ0aW5nIHRpbWVzdGFtcDogIiwgYXV0aG9yLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nIGludD4oaGFzaCksIHN0YXRpY19jYXN0PGxvbmcgbG9uZyBpbnQ+KHN0YXJ0aW5nVHMpKTsKKyAgICAvLyB3cml0ZSBoaXN0b2dyYW0gbGFiZWwgbGluZSB3aXRoIGJ1Y2tldCB2YWx1ZXMKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJXMiLCAiICIpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpzIiwgbGVmdFBhZGRpbmcsICIgIik7CisgICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgeworICAgICAgICBjb25zdCBpbnQgY29sV2lkdGggPSBudW1iZXJXaWR0aCh4LmZpcnN0LCBsZWZ0UGFkZGluZyk7CisgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpkIiwgY29sV2lkdGgsIHguc2Vjb25kKTsKKyAgICB9CisgICAgLy8gd3JpdGUgaGlzdG9ncmFtIGFzY2lpIGFydAorICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lcyIsICIgIik7CisgICAgZm9yIChpbnQgcm93ID0gaGVpZ2h0ICogc2NhbGluZ0ZhY3Rvcjsgcm93ID49IDA7IHJvdyAtPSBzY2FsaW5nRmFjdG9yKSB7CisgICAgICAgIGNvbnN0IGludCB2YWx1ZSA9IDEgPDwgcm93OworICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuKnMiLCBsZWZ0UGFkZGluZywgc3BhY2VzLmNfc3RyKCkpOworICAgICAgICBmb3IgKGF1dG8gY29uc3QgJnggOiBidWNrZXRzKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgY29sV2lkdGggPSBudW1iZXJXaWR0aCh4LmZpcnN0LCBsZWZ0UGFkZGluZyk7CisgICAgICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuKnMlcyIsIGNvbFdpZHRoIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZXMuY19zdHIoKSwgeC5zZWNvbmQgPCB2YWx1ZSA/ICIgIiA6ICJ8Iik7CisgICAgICAgIH0KKyAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKKyAgICB9CisgICAgLy8gcHJpbnQgeC1heGlzCisgICAgY29uc3QgaW50IGNvbHVtbnMgPSBzdGF0aWNfY2FzdDxpbnQ+KGJ1Y2tldHMuc2l6ZSgpKTsKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqYyIsIGxlZnRQYWRkaW5nLCAnICcpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyIsIChjb2x1bW5zICsgMSkgKiBidWNrZXRXaWR0aCwgdW5kZXJzY29yZXMuY19zdHIoKSk7CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKKworICAgIC8vIHdyaXRlIGZvb3RlciB3aXRoIGJ1Y2tldCBsYWJlbHMKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqcyIsIGxlZnRQYWRkaW5nLCAiICIpOworICAgIGZvciAoYXV0byBjb25zdCAmeCA6IGJ1Y2tldHMpIHsKKyAgICAgICAgY29uc3QgaW50IGNvbFdpZHRoID0gbnVtYmVyV2lkdGgoeC5maXJzdCwgbGVmdFBhZGRpbmcpOworICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUqLipmIiwgY29sV2lkdGgsIDEsIHguZmlyc3QpOworICAgIH0KKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuKnMlcyIsIGJ1Y2tldFdpZHRoLCBzcGFjZXMuY19zdHIoKSwgIm1zXG4iKTsKKworICAgIC8vIE5vdyByZXBvcnQgZ2xpdGNoZXMKKyAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxudGltZSBlbGFwc2VkIGJldHdlZW4gZ2xpdGNoZXMgYW5kIGdsaXRjaCB0aW1lc3RhbXBzOlxuIik7CisgICAgZm9yIChjb25zdCBhdXRvICZvdXRsaWVyOiBtT3V0bGllckRhdGEpIHsKKyAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlbGxkOiAlbGxkXG4iLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG91dGxpZXIuZmlyc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihvdXRsaWVyLnNlY29uZCkpOworICAgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gd3JpdGVzIHN1bW1hcnkgb2YgcGVyZm9ybWFuY2UgaW50byBzcGVjaWZpZWQgZmlsZSBkZXNjcmlwdG9yCit2b2lkIGR1bXAoaW50IGZkLCBpbnQgaW5kZW50LCBQZXJmb3JtYW5jZUFuYWx5c2lzTWFwICZ0aHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzKSB7CisgICAgU3RyaW5nOCBib2R5OworICAgIGNvbnN0IGNoYXIqIGNvbnN0IGtEaXJlY3RvcnkgPSAiL2RhdGEvbWlzYy9hdWRpb3NlcnZlci8iOworICAgIGZvciAoYXV0byAmIHRocmVhZCA6IHRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXMpIHsKKyAgICAgICAgZm9yIChhdXRvICYgaGFzaDogdGhyZWFkLnNlY29uZCkgeworICAgICAgICAgICAgUGVyZm9ybWFuY2VBbmFseXNpcyYgY3VyciA9IGhhc2guc2Vjb25kOworICAgICAgICAgICAgLy8gd3JpdGUgcGVyZm9ybWFuY2UgZGF0YSB0byBjb25zb2xlCisgICAgICAgICAgICBjdXJyLnJlcG9ydFBlcmZvcm1hbmNlKCZib2R5LCB0aHJlYWQuZmlyc3QsIGhhc2guZmlyc3QpOworICAgICAgICAgICAgaWYgKCFib2R5LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGR1bXBMaW5lKGZkLCBpbmRlbnQsIGJvZHkpOworICAgICAgICAgICAgICAgIGJvZHkuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHdyaXRlIHRvIGZpbGUKKyAgICAgICAgICAgIHdyaXRlVG9GaWxlKGN1cnIubUhpc3RzLCBjdXJyLm1PdXRsaWVyRGF0YSwgY3Vyci5tUGVha1RpbWVzdGFtcHMsCisgICAgICAgICAgICAgICAgICAgICAgICBrRGlyZWN0b3J5LCBmYWxzZSwgdGhyZWFkLmZpcnN0LCBoYXNoLmZpcnN0KTsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvLyBXcml0ZXMgYSBzdHJpbmcgaW50byBzcGVjaWZpZWQgZmlsZSBkZXNjcmlwdG9yCit2b2lkIGR1bXBMaW5lKGludCBmZCwgaW50IGluZGVudCwgY29uc3QgU3RyaW5nOCAmYm9keSkgeworICAgIGRwcmludGYoZmQsICIlLipzJXMgXG4iLCBpbmRlbnQsICIiLCBib2R5LnN0cmluZygpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5jcHAgYi9tZWRpYS9saWJuYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3ZTczMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmNwcApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiUmVwb3J0UGVyZm9ybWFuY2UiCisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHF1ZXVlPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlIHsKKworCisvLyBUT0RPOiB1c2UgYSBmdW5jdGlvbiBsaWtlIHRoaXMgdG8gZXh0cmFjdCBsb2dpYyBmcm9tIHdyaXRlVG9GaWxlCisvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvOTI3OTYyMAorCisvLyBXcml0ZXMgb3V0bGllciBpbnRlcnZhbHMsIHRpbWVzdGFtcHMsIGFuZCBoaXN0b2dyYW1zIHNwYW5uaW5nIGxvbmcgdGltZSBpbnRlcnZhbHMgdG8gZmlsZS4KKy8vIFRPRE86IHdyaXRlIGRhdGEgaW4gYmluYXJ5IGZvcm1hdAordm9pZCB3cml0ZVRvRmlsZShjb25zdCBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjx0aW1lc3RhbXAsIEhpc3RvZ3JhbT4+ICZoaXN0cywKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8bXNJbnRlcnZhbCwgdGltZXN0YW1wPj4gJm91dGxpZXJEYXRhLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmRlcXVlPHRpbWVzdGFtcD4gJnBlYWtUaW1lc3RhbXBzLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogZGlyZWN0b3J5LCBib29sIGFwcGVuZCwgaW50IGF1dGhvciwgbG9nX2hhc2hfdCBoYXNoKSB7CisKKyAgICAvLyBUT0RPOiByZW1vdmUgb2xkIGZpbGVzLCBpbXBsZW1lbnQgcm90YXRpbmcgZmlsZXMgYXMgaW4gQXVkaW9GbGluZ2VyLmNwcAorCisgICAgaWYgKG91dGxpZXJEYXRhLmVtcHR5KCkgJiYgaGlzdHMuZW1wdHkoKSAmJiBwZWFrVGltZXN0YW1wcy5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dXKCJObyBkYXRhLCByZXR1cm5pbmcuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBvdXRsaWVyTmFtZTsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBoaXN0b2dyYW1OYW1lOworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHBlYWtOYW1lOworCisgICAgLy8gZ2V0IGN1cnJlbnQgdGltZQorICAgIGNoYXIgY3VyclRpbWVbMTZdOyAvL1lZWVlNTURESEhNTVNTICsgJ1wwJyArIG9uZSB1bnVzZWQKKyAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKyAgICBzdHJ1Y3QgdG0gdG07CisgICAgbG9jYWx0aW1lX3IoJnR2LnR2X3NlYywgJnRtKTsKKyAgICBzdHJmdGltZShjdXJyVGltZSwgc2l6ZW9mKGN1cnJUaW1lKSwgIiVZJW0lZCVIJU0lUyIsICZ0bSk7CisKKyAgICAvLyBnZW5lcmF0ZSBmaWxlIG5hbWVzCisgICAgc3RkOjpzdHJpbmdzdHJlYW0gY29tbW9uOworICAgIGNvbW1vbiA8PCBhdXRob3IgPDwgIl8iIDw8IGhhc2ggPDwgIl8iIDw8IGN1cnJUaW1lIDw8ICIuY3N2IjsKKworICAgIGhpc3RvZ3JhbU5hbWUgPDwgZGlyZWN0b3J5IDw8ICJoaXN0b2dyYW1zXyIgPDwgY29tbW9uLnN0cigpOworICAgIG91dGxpZXJOYW1lIDw8IGRpcmVjdG9yeSA8PCAib3V0bGllcnNfIiA8PCBjb21tb24uc3RyKCk7CisgICAgcGVha05hbWUgPDwgZGlyZWN0b3J5IDw8ICJwZWFrc18iIDw8IGNvbW1vbi5zdHIoKTsKKworICAgIHN0ZDo6b2ZzdHJlYW0gaGZzOworICAgIGhmcy5vcGVuKGhpc3RvZ3JhbU5hbWUuc3RyKCksIGFwcGVuZCA/IHN0ZDo6aW9zOjphcHAgOiBzdGQ6Omlvczo6dHJ1bmMpOworICAgIGlmICghaGZzLmlzX29wZW4oKSkgeworICAgICAgICBBTE9HVygiY291bGRuJ3Qgb3BlbiBmaWxlICVzIiwgaGlzdG9ncmFtTmFtZS5zdHIoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBlYWNoIGhpc3RvZ3JhbSBpcyB3cml0dGVuIGFzIGEgbGluZSB3aGVyZSB0aGUgZmlyc3QgdmFsdWUgaXMgdGhlIHRpbWVzdGFtcCBhbmQKKyAgICAvLyBzdWJzZXF1ZW50IHZhbHVlcyBhcmUgcGFpcnMgb2YgYnVja2V0cyBhbmQgY291bnRzLiBFYWNoIHZhbHVlIGlzIHNlcGFyYXRlZAorICAgIC8vIGJ5IGEgY29tbWEsIGFuZCBlYWNoIGhpc3RvZ3JhbSBpcyBzZXBhcmF0ZWQgYnkgYSBuZXdsaW5lLgorICAgIGZvciAoYXV0byBoaXN0ID0gaGlzdHMuYmVnaW4oKTsgaGlzdCAhPSBoaXN0cy5lbmQoKTsgKytoaXN0KSB7CisgICAgICAgIGhmcyA8PCBoaXN0LT5maXJzdCA8PCAiLCAiOworICAgICAgICBmb3IgKGF1dG8gYnVja2V0ID0gaGlzdC0+c2Vjb25kLmJlZ2luKCk7IGJ1Y2tldCAhPSBoaXN0LT5zZWNvbmQuZW5kKCk7ICsrYnVja2V0KSB7CisgICAgICAgICAgICBoZnMgPDwgYnVja2V0LT5maXJzdCAvIHN0YXRpY19jYXN0PGRvdWJsZT4oa0ppZmZ5UGVyTXMpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCBidWNrZXQtPnNlY29uZDsKKyAgICAgICAgICAgIGlmIChzdGQ6Om5leHQoYnVja2V0KSAhPSBlbmQoaGlzdC0+c2Vjb25kKSkgeworICAgICAgICAgICAgICAgIGhmcyA8PCAiLCAiOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzdGQ6Om5leHQoaGlzdCkgIT0gZW5kKGhpc3RzKSkgeworICAgICAgICAgICAgaGZzIDw8ICJcbiI7CisgICAgICAgIH0KKyAgICB9CisgICAgaGZzLmNsb3NlKCk7CisKKyAgICBzdGQ6Om9mc3RyZWFtIG9mczsKKyAgICBvZnMub3BlbihvdXRsaWVyTmFtZS5zdHIoKSwgYXBwZW5kID8gc3RkOjppb3M6OmFwcCA6IHN0ZDo6aW9zOjp0cnVuYyk7CisgICAgaWYgKCFvZnMuaXNfb3BlbigpKSB7CisgICAgICAgIEFMT0dXKCJjb3VsZG4ndCBvcGVuIGZpbGUgJXMiLCBvdXRsaWVyTmFtZS5zdHIoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBvdXRsaWVycyBhcmUgd3JpdHRlbiBhcyBwYWlycyBzZXBhcmF0ZWQgYnkgbmV3bGluZXMsIHdoZXJlIGVhY2gKKyAgICAvLyBwYWlyJ3MgdmFsdWVzIGFyZSBzZXBhcmF0ZWQgYnkgYSBjb21tYQorICAgIGZvciAoY29uc3QgYXV0byAmb3V0bGllciA6IG91dGxpZXJEYXRhKSB7CisgICAgICAgIG9mcyA8PCBvdXRsaWVyLmZpcnN0IDw8ICIsICIgPDwgb3V0bGllci5zZWNvbmQgPDwgIlxuIjsKKyAgICB9CisgICAgb2ZzLmNsb3NlKCk7CisKKyAgICBzdGQ6Om9mc3RyZWFtIHBmczsKKyAgICBwZnMub3BlbihwZWFrTmFtZS5zdHIoKSwgYXBwZW5kID8gc3RkOjppb3M6OmFwcCA6IHN0ZDo6aW9zOjp0cnVuYyk7CisgICAgaWYgKCFwZnMuaXNfb3BlbigpKSB7CisgICAgICAgIEFMT0dXKCJjb3VsZG4ndCBvcGVuIGZpbGUgJXMiLCBwZWFrTmFtZS5zdHIoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBwZWFrcyBhcmUgc2ltcGx5IHRpbWVzdGFtcHMgc2VwYXJhdGVkIGJ5IGNvbW1hcworICAgIGZvciAoYXV0byBwZWFrID0gcGVha1RpbWVzdGFtcHMuYmVnaW4oKTsgcGVhayAhPSBwZWFrVGltZXN0YW1wcy5lbmQoKTsgKytwZWFrKSB7CisgICAgICAgIHBmcyA8PCAqcGVhazsKKyAgICAgICAgaWYgKHN0ZDo6bmV4dChwZWFrKSAhPSBlbmQocGVha1RpbWVzdGFtcHMpKSB7CisgICAgICAgICAgICBwZnMgPDwgIiwgIjsKKyAgICAgICAgfQorICAgIH0KKyAgICBwZnMuY2xvc2UoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL05CTG9nLmggYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL05CTG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI2ZjE3OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvTkJMb2cuaApAQCAtMCwwICsxLDYxMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIE5vbi1ibG9ja2luZyBldmVudCBsb2dnZXIgaW50ZW5kZWQgZm9yIHNhZmUgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHByb2Nlc3NlcyB2aWEgc2hhcmVkIG1lbW9yeQorCisjaWZuZGVmIEFORFJPSURfTUVESUFfTkJMT0dfSAorI2RlZmluZSBBTkRST0lEX01FRElBX05CTE9HX0gKKworI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZmlmby5oPgorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgU3RyaW5nODsKKworY2xhc3MgTkJMb2cgeworCitwdWJsaWM6CisKKyAgICB1c2luZyBsb2dfaGFzaF90ID0gUmVwb3J0UGVyZm9ybWFuY2U6OmxvZ19oYXNoX3Q7CisKKyAgICAvLyBGSVhNRSBFdmVyeXRoaW5nIG5lZWRlZCBmb3IgY2xpZW50ICh3cml0ZXIgQVBJIGFuZCByZWdpc3RyYXRpb24pIHNob3VsZCBiZSBpc29sYXRlZAorICAgIC8vICAgICAgIGZyb20gdGhlIHJlc3Qgb2YgdGhlIGltcGxlbWVudGF0aW9uLgorICAgIGNsYXNzIFdyaXRlcjsKKyAgICBjbGFzcyBSZWFkZXI7CisKKyAgICBlbnVtIEV2ZW50IDogdWludDhfdCB7CisgICAgICAgIEVWRU5UX1JFU0VSVkVELAorICAgICAgICBFVkVOVF9TVFJJTkcsICAgICAgICAgICAgICAgLy8gQVNDSUkgc3RyaW5nLCBub3QgTlVMLXRlcm1pbmF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IG1ha2UgdGltZXN0YW1wIG9wdGlvbmFsCisgICAgICAgIEVWRU5UX1RJTUVTVEFNUCwgICAgICAgICAgICAvLyBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQykKKyAgICAgICAgRVZFTlRfSU5URUdFUiwgICAgICAgICAgICAgIC8vIGludGVnZXIgdmFsdWUgZW50cnkKKyAgICAgICAgRVZFTlRfRkxPQVQsICAgICAgICAgICAgICAgIC8vIGZsb2F0aW5nIHBvaW50IHZhbHVlIGVudHJ5CisgICAgICAgIEVWRU5UX1BJRCwgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIElEIGFuZCBwcm9jZXNzIG5hbWUKKyAgICAgICAgRVZFTlRfQVVUSE9SLCAgICAgICAgICAgICAgIC8vIGF1dGhvciBpbmRleCAocHJlc2VudCBpbiBtZXJnZWQgbG9ncykgdHJhY2tzIGVudHJ5J3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yaWdpbmFsIGxvZworICAgICAgICBFVkVOVF9TVEFSVF9GTVQsICAgICAgICAgICAgLy8gbG9nRm9ybWF0IHN0YXJ0IGV2ZW50OiBlbnRyeSBpbmNsdWRlcyBmb3JtYXQgc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9sbG93aW5nIGVudHJpZXMgY29udGFpbiBmb3JtYXQgYXJndW1lbnRzCisgICAgICAgIEVWRU5UX0hBU0gsICAgICAgICAgICAgICAgICAvLyB1bmlxdWUgSEFTSCBvZiBsb2cgb3JpZ2luLCBvcmlnaW5hdGVzIGZyb20gaGFzaCBvZiBmaWxlIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBsaW5lIG51bWJlcgorICAgICAgICBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFMsICAgLy8gc2luZ2xlIGRhdHVtIGZvciB0aW1lc3RhbXAgaGlzdG9ncmFtCisgICAgICAgIEVWRU5UX0FVRElPX1NUQVRFLCAgICAgICAgICAvLyBhdWRpbyBvbi9vZmYgZXZlbnQ6IGxvZ2dlZCBvbiBGYXN0TWl4ZXI6Om9uU3RhdGVDaGFuZ2UgY2FsbAorICAgICAgICBFVkVOVF9FTkRfRk1ULCAgICAgICAgICAgICAgLy8gZW5kIG9mIGxvZ0Zvcm1hdCBhcmd1bWVudCBsaXN0CisKKyAgICAgICAgRVZFTlRfVVBQRVJfQk9VTkQsICAgICAgICAgIC8vIHRvIGNoZWNrIGZvciBpbnZhbGlkIGV2ZW50cworICAgIH07CisKK3ByaXZhdGU6CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBBUEkgZm9yIGhhbmRsaW5nIGZvcm1hdCBlbnRyeSBvcGVyYXRpb25zCisKKyAgICAvLyBhIGZvcm1hdHRlZCBlbnRyeSBoYXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CisgICAgLy8gICAgKiBTVEFSVF9GTVQgZW50cnksIGNvbnRhaW5pbmcgdGhlIGZvcm1hdCBzdHJpbmcKKyAgICAvLyAgICAqIFRJTUVTVEFNUCBlbnRyeQorICAgIC8vICAgICogSEFTSCBlbnRyeQorICAgIC8vICAgICogYXV0aG9yIGVudHJ5IG9mIHRoZSB0aHJlYWQgdGhhdCBnZW5lcmF0ZWQgaXQgKG9wdGlvbmFsLCBwcmVzZW50IGluIG1lcmdlZCBsb2cpCisgICAgLy8gICAgKiBmb3JtYXQgYXJnMQorICAgIC8vICAgICogZm9ybWF0IGFyZzIKKyAgICAvLyAgICAqIC4uLgorICAgIC8vICAgICogRU5EX0ZNVCBlbnRyeQorCisgICAgLy8gZW50cnkgcmVwcmVzZW50YXRpb24gaW4gbWVtb3J5CisgICAgc3RydWN0IGVudHJ5IHsKKyAgICAgICAgY29uc3QgdWludDhfdCB0eXBlOworICAgICAgICBjb25zdCB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgY29uc3QgdWludDhfdCBkYXRhWzBdOworICAgIH07CisKKyAgICAvLyBlbnRyeSB0YWlsIHJlcHJlc2VudGF0aW9uIChhZnRlciBkYXRhKQorICAgIHN0cnVjdCBlbmRpbmcgeworICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgdWludDhfdCBuZXh0WzBdOworICAgIH07CisKKyAgICAvLyBlbnRyeSBpdGVyYXRvcgorICAgIGNsYXNzIEVudHJ5SXRlcmF0b3IgeworICAgIHB1YmxpYzoKKyAgICAgICAgRW50cnlJdGVyYXRvcigpOworICAgICAgICBleHBsaWNpdCBFbnRyeUl0ZXJhdG9yKGNvbnN0IHVpbnQ4X3QgKmVudHJ5KTsKKyAgICAgICAgRW50cnlJdGVyYXRvcihjb25zdCBFbnRyeUl0ZXJhdG9yICZvdGhlcik7CisKKyAgICAgICAgLy8gZGVyZWZlcmVuY2UgdW5kZXJseWluZyBlbnRyeQorICAgICAgICBjb25zdCBlbnRyeSYgICAgb3BlcmF0b3IqKCkgY29uc3Q7CisgICAgICAgIGNvbnN0IGVudHJ5KiAgICBvcGVyYXRvci0+KCkgY29uc3Q7CisgICAgICAgIC8vIGFkdmFuY2UgdG8gbmV4dCBlbnRyeQorICAgICAgICBFbnRyeUl0ZXJhdG9yJiAgICAgICBvcGVyYXRvcisrKCk7IC8vICsraQorICAgICAgICAvLyBiYWNrIHRvIHByZXZpb3VzIGVudHJ5CisgICAgICAgIEVudHJ5SXRlcmF0b3ImICAgICAgIG9wZXJhdG9yLS0oKTsgLy8gLS1pCisgICAgICAgIEVudHJ5SXRlcmF0b3IgICAgICAgIG5leHQoKSBjb25zdDsKKyAgICAgICAgRW50cnlJdGVyYXRvciAgICAgICAgcHJldigpIGNvbnN0OworICAgICAgICBib29sICAgICAgICAgICAgb3BlcmF0b3IhPShjb25zdCBFbnRyeUl0ZXJhdG9yICZvdGhlcikgY29uc3Q7CisgICAgICAgIGludCAgICAgICAgICAgICBvcGVyYXRvci0oY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0OworCisgICAgICAgIGJvb2wgICAgICAgICAgICBoYXNDb25zaXN0ZW50TGVuZ3RoKCkgY29uc3Q7CisgICAgICAgIHZvaWQgICAgICAgICAgICBjb3B5VG8oc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0KSBjb25zdDsKKyAgICAgICAgdm9pZCAgICAgICAgICAgIGNvcHlEYXRhKHVpbnQ4X3QgKmRzdCkgY29uc3Q7CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgaW5saW5lIGNvbnN0IFQmIHBheWxvYWQoKSB7CisgICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCAqPihwdHIgKyBvZmZzZXRvZihlbnRyeSwgZGF0YSkpOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIG9wZXJhdG9yIGNvbnN0IHVpbnQ4X3QqKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHB0cjsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgdWludDhfdCAgKnB0cjsKKyAgICB9OworCisgICAgY2xhc3MgQWJzdHJhY3RFbnRyeSB7CisgICAgcHVibGljOgorCisgICAgICAgIC8vIEVudHJ5IHN0YXJ0aW5nIGluIHRoZSBnaXZlbiBwb2ludGVyCisgICAgICAgIGV4cGxpY2l0IEFic3RyYWN0RW50cnkoY29uc3QgdWludDhfdCAqZW50cnkpOworICAgICAgICB2aXJ0dWFsIH5BYnN0cmFjdEVudHJ5KCkge30KKworICAgICAgICAvLyBidWlsZCBjb25jcmV0ZSBlbnRyeSBvZiBhcHByb3ByaWF0ZSBjbGFzcyBmcm9tIHBvaW50ZXIKKyAgICAgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxBYnN0cmFjdEVudHJ5PiBidWlsZEVudHJ5KGNvbnN0IHVpbnQ4X3QgKnB0cik7CisKKyAgICAgICAgLy8gZ2V0IGZvcm1hdCBlbnRyeSB0aW1lc3RhbXAKKyAgICAgICAgdmlydHVhbCBpbnQ2NF90ICAgICAgdGltZXN0YW1wKCkgY29uc3QgPSAwOworCisgICAgICAgIC8vIGdldCBmb3JtYXQgZW50cnkncyB1bmlxdWUgaWQKKyAgICAgICAgdmlydHVhbCBsb2dfaGFzaF90ICAgaGFzaCgpIGNvbnN0ID0gMDsKKworICAgICAgICAvLyBlbnRyeSdzIGF1dGhvciBpbmRleCAoLTEgaWYgbm9uZSBwcmVzZW50KQorICAgICAgICAvLyBhIE1lcmdlciBoYXMgYSB2ZWN0b3Igb2YgUmVhZGVycywgYXV0aG9yIHNpbXBseSBwb2ludHMgdG8gdGhlIGluZGV4IG9mIHRoZQorICAgICAgICAvLyBSZWFkZXIgdGhhdCBvcmlnaW5hdGVkIHRoZSBlbnRyeQorICAgICAgICAvLyBUT0RPIGNvbnNpZGVyIGNoYW5naW5nIHRvIHVpbnQzMl90CisgICAgICAgIHZpcnR1YWwgaW50ICAgICAgICAgIGF1dGhvcigpIGNvbnN0ID0gMDsKKworICAgICAgICAvLyBjb3B5IGVudHJ5LCBhZGRpbmcgYXV0aG9yIGJlZm9yZSB0aW1lc3RhbXAsIHJldHVybnMgaXRlcmF0b3IgdG8gZW5kIG9mIGVudHJ5CisgICAgICAgIHZpcnR1YWwgRW50cnlJdGVyYXRvciAgICBjb3B5V2l0aEF1dGhvcihzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXV0aG9yKSBjb25zdCA9IDA7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIC8vIGNvcGllcyBvcmRpbmFyeSBlbnRyeSBmcm9tIHNyYyB0byBkc3QsIGFuZCByZXR1cm5zIGxlbmd0aCBvZiBlbnRyeQorICAgICAgICAvLyBzaXplX3QgICAgICBjb3B5RW50cnkoYXVkaW9fdXRpbHNfZmlmb193cml0ZXIgKmRzdCwgY29uc3QgaXRlcmF0b3IgJml0KTsKKyAgICAgICAgY29uc3QgdWludDhfdCAgKm1FbnRyeTsKKyAgICB9OworCisgICAgY2xhc3MgRm9ybWF0RW50cnkgOiBwdWJsaWMgQWJzdHJhY3RFbnRyeSB7CisgICAgcHVibGljOgorICAgICAgICAvLyBleHBsaWNpdCBGb3JtYXRFbnRyeShjb25zdCBFbnRyeUl0ZXJhdG9yICZpdCk7CisgICAgICAgIGV4cGxpY2l0IEZvcm1hdEVudHJ5KGNvbnN0IHVpbnQ4X3QgKnB0cikgOiBBYnN0cmFjdEVudHJ5KHB0cikge30KKyAgICAgICAgdmlydHVhbCB+Rm9ybWF0RW50cnkoKSB7fQorCisgICAgICAgIEVudHJ5SXRlcmF0b3IgYmVnaW4oKSBjb25zdDsKKworICAgICAgICAvLyBFbnRyeSdzIGZvcm1hdCBzdHJpbmcKKyAgICAgICAgY29uc3QgICBjaGFyKiBmb3JtYXRTdHJpbmcoKSBjb25zdDsKKworICAgICAgICAvLyBFbnJ0eSdzIGZvcm1hdCBzdHJpbmcgbGVuZ3RoCisgICAgICAgIHNpemVfdCAgICAgIGZvcm1hdFN0cmluZ0xlbmd0aCgpIGNvbnN0OworCisgICAgICAgIC8vIEZvcm1hdCBhcmd1bWVudHMgKGV4Y2x1ZGluZyBmb3JtYXQgc3RyaW5nLCB0aW1lc3RhbXAgYW5kIGF1dGhvcikKKyAgICAgICAgRW50cnlJdGVyYXRvciAgICBhcmdzKCkgY29uc3Q7CisKKyAgICAgICAgLy8gZ2V0IGZvcm1hdCBlbnRyeSB0aW1lc3RhbXAKKyAgICAgICAgdmlydHVhbCBpbnQ2NF90ICAgICB0aW1lc3RhbXAoKSBjb25zdCBvdmVycmlkZTsKKworICAgICAgICAvLyBnZXQgZm9ybWF0IGVudHJ5J3MgdW5pcXVlIGlkCisgICAgICAgIHZpcnR1YWwgbG9nX2hhc2hfdCAgaGFzaCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgICAgIC8vIGVudHJ5J3MgYXV0aG9yIGluZGV4ICgtMSBpZiBub25lIHByZXNlbnQpCisgICAgICAgIC8vIGEgTWVyZ2VyIGhhcyBhIHZlY3RvciBvZiBSZWFkZXJzLCBhdXRob3Igc2ltcGx5IHBvaW50cyB0byB0aGUgaW5kZXggb2YgdGhlCisgICAgICAgIC8vIFJlYWRlciB0aGF0IG9yaWdpbmF0ZWQgdGhlIGVudHJ5CisgICAgICAgIHZpcnR1YWwgaW50ICAgICAgICAgYXV0aG9yKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAgICAgLy8gY29weSBlbnRyeSwgYWRkaW5nIGF1dGhvciBiZWZvcmUgdGltZXN0YW1wLCByZXR1cm5zIHNpemUgb2Ygb3JpZ2luYWwgZW50cnkKKyAgICAgICAgdmlydHVhbCBFbnRyeUl0ZXJhdG9yICAgIGNvcHlXaXRoQXV0aG9yKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdXRob3IpIGNvbnN0IG92ZXJyaWRlOworCisgICAgfTsKKworICAgIGNsYXNzIEhpc3RvZ3JhbUVudHJ5IDogcHVibGljIEFic3RyYWN0RW50cnkgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgSGlzdG9ncmFtRW50cnkoY29uc3QgdWludDhfdCAqcHRyKSA6IEFic3RyYWN0RW50cnkocHRyKSB7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB+SGlzdG9ncmFtRW50cnkoKSB7fQorCisgICAgICAgIHZpcnR1YWwgaW50NjRfdCAgICAgdGltZXN0YW1wKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAgICAgdmlydHVhbCBsb2dfaGFzaF90ICBoYXNoKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAgICAgdmlydHVhbCBpbnQgICAgICAgICBhdXRob3IoKSBjb25zdCBvdmVycmlkZTsKKworICAgICAgICB2aXJ0dWFsIEVudHJ5SXRlcmF0b3IgICAgY29weVdpdGhBdXRob3Ioc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1dGhvcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB9OworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvLyByZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBsb2cgZW50cnkgaW4gcHJpdmF0ZSBtZW1vcnkKKyAgICBzdHJ1Y3QgRW50cnkgeworICAgICAgICBFbnRyeShFdmVudCBldmVudCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCkKKyAgICAgICAgICAgIDogbUV2ZW50KGV2ZW50KSwgbUxlbmd0aChsZW5ndGgpLCBtRGF0YShkYXRhKSB7IH0KKyAgICAgICAgLyp2aXJ0dWFsKi8gfkVudHJ5KCkgeyB9CisKKyAgICAgICAgLy8gdXNlZCBkdXJpbmcgd3JpdGluZyB0byBmb3JtYXQgRW50cnkgaW5mb3JtYXRpb24gYXMgZm9sbG93czoKKyAgICAgICAgLy8gW3R5cGVdW2xlbmd0aF1bZGF0YSAuLi4gXVtsZW5ndGhdCisgICAgICAgIGludCAgICAgY29weUVudHJ5RGF0YUF0KHNpemVfdCBvZmZzZXQpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgZnJpZW5kIGNsYXNzIFdyaXRlcjsKKyAgICAgICAgRXZlbnQgICAgICAgbUV2ZW50OyAgICAgLy8gZXZlbnQgdHlwZQorICAgICAgICB1aW50OF90ICAgICBtTGVuZ3RoOyAgICAvLyBsZW5ndGggb2YgYWRkaXRpb25hbCBkYXRhLCAwIDw9IG1MZW5ndGggPD0ga01heExlbmd0aAorICAgICAgICBjb25zdCB2b2lkICptRGF0YTsgICAgICAvLyBldmVudCB0eXBlLXNwZWNpZmljIGRhdGEKKyAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4TGVuZ3RoID0gMjU1OworICAgIHB1YmxpYzoKKyAgICAgICAgLy8gbUV2ZW50LCBtTGVuZ3RoLCBtRGF0YVsuLi5dLCBkdXBsaWNhdGUgbUxlbmd0aAorICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtPdmVyaGVhZCA9IHNpemVvZihlbnRyeSkgKyBzaXplb2YoZW5kaW5nKTsKKyAgICAgICAgLy8gZW5kaW5kIGxlbmd0aCBvZiBwcmV2aW91cyBlbnRyeQorICAgICAgICBzdGF0aWMgY29uc3Qgc3NpemVfdCBrUHJldmlvdXNMZW5ndGhPZmZzZXQgPSAtIHNpemVvZihlbmRpbmcpICsKKyAgICAgICAgICAgIG9mZnNldG9mKGVuZGluZywgbGVuZ3RoKTsKKyAgICB9OworCisgICAgc3RydWN0IEhpc3RUc0VudHJ5IHsKKyAgICAgICAgbG9nX2hhc2hfdCBoYXNoOworICAgICAgICBpbnQ2NF90IHRzOworICAgIH07IC8vVE9ETyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworICAgIHN0cnVjdCBIaXN0VHNFbnRyeVdpdGhBdXRob3IgeworICAgICAgICBsb2dfaGFzaF90IGhhc2g7CisgICAgICAgIGludDY0X3QgdHM7CisgICAgICAgIGludCBhdXRob3I7CisgICAgfTsgLy9UT0RPIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisgICAgc3RydWN0IEhpc3RJbnRFbnRyeSB7CisgICAgICAgIGxvZ19oYXNoX3QgaGFzaDsKKyAgICAgICAgaW50IHZhbHVlOworICAgIH07IC8vVE9ETyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworICAgIC8vIHJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIGxvZyBlbnRyeSBpbiBzaGFyZWQgbWVtb3J5CisgICAgLy8gIGJ5dGVbMF0gICAgICAgICAgICAgbUV2ZW50CisgICAgLy8gIGJ5dGVbMV0gICAgICAgICAgICAgbUxlbmd0aAorICAgIC8vICBieXRlWzJdICAgICAgICAgICAgIG1EYXRhWzBdCisgICAgLy8gIC4uLgorICAgIC8vICBieXRlWzIraV0gICAgICAgICAgIG1EYXRhW2ldCisgICAgLy8gIC4uLgorICAgIC8vICBieXRlWzIrbUxlbmd0aC0xXSAgIG1EYXRhW21MZW5ndGgtMV0KKyAgICAvLyAgYnl0ZVsyK21MZW5ndGhdICAgICBkdXBsaWNhdGUgY29weSBvZiBtTGVuZ3RoIHRvIHBlcm1pdCByZXZlcnNlIHNjYW4KKyAgICAvLyAgYnl0ZVszK21MZW5ndGhdICAgICBzdGFydCBvZiBuZXh0IGxvZyBlbnRyeQorCisgICAgc3RhdGljIHZvaWQgICAgYXBwZW5kSW50KFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpOworICAgIHN0YXRpYyB2b2lkICAgIGFwcGVuZEZsb2F0KFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpOworICAgIHN0YXRpYyB2b2lkICAgIGFwcGVuZFBJRChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKKyAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRUaW1lc3RhbXAoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSk7CisgICAgc3RhdGljIHNpemVfdCAgZm10RW50cnlMZW5ndGgoY29uc3QgdWludDhfdCAqZGF0YSk7CisgICAgc3RhdGljIFN0cmluZzggYnVmZmVyRHVtcChjb25zdCB1aW50OF90ICpidWZmZXIsIHNpemVfdCBzaXplKTsKKyAgICBzdGF0aWMgU3RyaW5nOCBidWZmZXJEdW1wKGNvbnN0IEVudHJ5SXRlcmF0b3IgJml0KTsKK3B1YmxpYzoKKworICAgIC8vIExvY2F0ZWQgaW4gc2hhcmVkIG1lbW9yeSwgbXVzdCBiZSBQT0QuCisgICAgLy8gRXhhY3RseSBvbmUgcHJvY2VzcyBtdXN0IGV4cGxpY2l0bHkgY2FsbCB0aGUgY29uc3RydWN0b3Igb3IgdXNlIHBsYWNlbWVudCBuZXcuCisgICAgLy8gU2luY2UgdGhpcyBpcyBhIFBPRCwgdGhlIGRlc3RydWN0b3IgaXMgZW1wdHkgYW5kIHVubmVjZXNzYXJ5IHRvIGNhbGwgaXQgZXhwbGljaXRseS4KKyAgICBzdHJ1Y3QgU2hhcmVkIHsKKyAgICAgICAgU2hhcmVkKCkgLyogbVJlYXIgaW5pdGlhbGl6ZWQgdmlhIGRlZmF1bHQgY29uc3RydWN0b3IgKi8geyB9CisgICAgICAgIC8qdmlydHVhbCovIH5TaGFyZWQoKSB7IH0KKworICAgICAgICBhdWRpb191dGlsc19maWZvX2luZGV4ICBtUmVhcjsgIC8vIGluZGV4IG9uZSBieXRlIHBhc3QgdGhlIGVuZCBvZiBtb3N0IHJlY2VudCBFbnRyeQorICAgICAgICBjaGFyICAgIG1CdWZmZXJbMF07ICAgICAgICAgICAgIC8vIGNpcmN1bGFyIGJ1ZmZlciBmb3IgZW50cmllcworICAgIH07CisKK3B1YmxpYzoKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8gRklYTUUgVGltZWxpbmUgd2FzIGludGVuZGVkIHRvIHdyYXAgV3JpdGVyIGFuZCBSZWFkZXIsIGJ1dCBpc24ndCBhY3R1YWxseSB1c2VkIHlldC4KKyAgICAvLyBGb3Igbm93IGl0IGlzIGp1c3QgYSBuYW1lc3BhY2UgZm9yIHNoYXJlZFNpemUoKS4KKyAgICBjbGFzcyBUaW1lbGluZSA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBwdWJsaWM6CisjaWYgMAorICAgICAgICBUaW1lbGluZShzaXplX3Qgc2l6ZSwgdm9pZCAqc2hhcmVkID0gTlVMTCk7CisgICAgICAgIHZpcnR1YWwgflRpbWVsaW5lKCk7CisjZW5kaWYKKworICAgICAgICAvLyBJbnB1dCBwYXJhbWV0ZXIgJ3NpemUnIGlzIHRoZSBkZXNpcmVkIHNpemUgb2YgdGhlIHRpbWVsaW5lIGluIGJ5dGUgdW5pdHMuCisgICAgICAgIC8vIFJldHVybnMgdGhlIHNpemUgcm91bmRlZCB1cCB0byBhIHBvd2VyLW9mLTIsIHBsdXMgdGhlIGNvbnN0YW50IHNpemUgb3ZlcmhlYWQgZm9yIGluZGljZXMuCisgICAgICAgIHN0YXRpYyBzaXplX3Qgc2hhcmVkU2l6ZShzaXplX3Qgc2l6ZSk7CisKKyNpZiAwCisgICAgcHJpdmF0ZToKKyAgICAgICAgZnJpZW5kIGNsYXNzICAgIFdyaXRlcjsKKyAgICAgICAgZnJpZW5kIGNsYXNzICAgIFJlYWRlcjsKKworICAgICAgICBjb25zdCBzaXplX3QgICAgbVNpemU7ICAgICAgLy8gY2lyY3VsYXIgYnVmZmVyIHNpemUgaW4gYnl0ZXMsIG11c3QgYmUgYSBwb3dlciBvZiAyCisgICAgICAgIGJvb2wgICAgICAgICAgICBtT3duOyAgICAgICAvLyB3aGV0aGVyIEkgb3duIHRoZSBtZW1vcnkgYXQgbVNoYXJlZAorICAgICAgICBTaGFyZWQqIGNvbnN0ICAgbVNoYXJlZDsgICAgLy8gcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5CisjZW5kaWYKKyAgICB9OworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvLyBXcml0ZXIgaXMgdGhyZWFkLXNhZmUgd2l0aCByZXNwZWN0IHRvIFJlYWRlciwgYnV0IG5vdCB3aXRoIHJlc3BlY3QgdG8gbXVsdGlwbGUgdGhyZWFkcworICAgIC8vIGNhbGxpbmcgV3JpdGVyIG1ldGhvZHMuICBJZiB5b3UgbmVlZCBtdWx0aS10aHJlYWQgc2FmZXR5IGZvciB3cml0aW5nLCB1c2UgTG9ja2VkV3JpdGVyLgorICAgIGNsYXNzIFdyaXRlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFdyaXRlcigpOyAgICAgICAgICAgICAgICAgICAvLyBkdW1teSBub3AgaW1wbGVtZW50YXRpb24gd2l0aG91dCBzaGFyZWQgbWVtb3J5CisKKyAgICAgICAgLy8gSW5wdXQgcGFyYW1ldGVyICdzaXplJyBpcyB0aGUgZGVzaXJlZCBzaXplIG9mIHRoZSB0aW1lbGluZSBpbiBieXRlIHVuaXRzLgorICAgICAgICAvLyBUaGUgc2l6ZSBvZiB0aGUgc2hhcmVkIG1lbW9yeSBtdXN0IGJlIGF0IGxlYXN0IFRpbWVsaW5lOjpzaGFyZWRTaXplKHNpemUpLgorICAgICAgICBXcml0ZXIodm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk7CisgICAgICAgIFdyaXRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUpOworCisgICAgICAgIHZpcnR1YWwgfldyaXRlcigpOworCisgICAgICAgIC8vIEZJWE1FIG5lZWRzIGNvbW1lbnRzLCBhbmQgc29tZSBzaG91bGQgYmUgcHJpdmF0ZQorICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nKGNvbnN0IGNoYXIgKnN0cmluZyk7CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2d2Zihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nVGltZXN0YW1wKCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dUaW1lc3RhbXAoY29uc3QgaW50NjRfdCB0cyk7CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dJbnRlZ2VyKGNvbnN0IGludCB4KTsKKyAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0Zsb2F0KGNvbnN0IGZsb2F0IHgpOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nUElEKCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIC4uLik7CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dWRm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgbG9nX2hhc2hfdCBoYXNoLCB2YV9saXN0IGFwKTsKKyAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1N0YXJ0KGNvbnN0IGNoYXIgKmZtdCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dFbmQoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0hhc2gobG9nX2hhc2hfdCBoYXNoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0V2ZW50SGlzdFRzKEV2ZW50IGV2ZW50LCBsb2dfaGFzaF90IGhhc2gpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCAgICBpc0VuYWJsZWQoKSBjb25zdDsKKworICAgICAgICAvLyByZXR1cm4gdmFsdWUgZm9yIGFsbCBvZiB0aGVzZSBpcyB0aGUgcHJldmlvdXMgaXNFbmFibGVkKCkKKyAgICAgICAgdmlydHVhbCBib29sICAgIHNldEVuYWJsZWQoYm9vbCBlbmFibGVkKTsgICAvLyBidXQgd29uJ3QgZW5hYmxlIGlmIG5vIHNoYXJlZCBtZW1vcnkKKyAgICAgICAgYm9vbCAgICBlbmFibGUoKSAgICB7IHJldHVybiBzZXRFbmFibGVkKHRydWUpOyB9CisgICAgICAgIGJvb2wgICAgZGlzYWJsZSgpICAgeyByZXR1cm4gc2V0RW5hYmxlZChmYWxzZSk7IH0KKworICAgICAgICBzcDxJTWVtb3J5PiAgICAgZ2V0SU1lbW9yeSgpIGNvbnN0ICB7IHJldHVybiBtSU1lbW9yeTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gMCA8PSBsZW5ndGggPD0ga01heExlbmd0aAorICAgICAgICAvLyB3cml0ZXMgYSBzaW5nbGUgRW50cnkgdG8gdGhlIEZJRk8KKyAgICAgICAgdm9pZCAgICBsb2coRXZlbnQgZXZlbnQsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpOworICAgICAgICAvLyBjaGVja3MgdmFsaWRpdHkgb2YgYW4gZXZlbnQgYmVmb3JlIGNhbGxpbmcgbG9nIGFib3ZlIHRoaXMgb25lCisgICAgICAgIHZvaWQgICAgbG9nKGNvbnN0IEVudHJ5ICplbnRyeSwgYm9vbCB0cnVzdGVkID0gZmFsc2UpOworCisgICAgICAgIFNoYXJlZCogY29uc3QgICBtU2hhcmVkOyAgICAvLyByYXcgcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5CisgICAgICAgIHNwPElNZW1vcnk+ICAgICBtSU1lbW9yeTsgICAvLyByZWYtY291bnRlZCB2ZXJzaW9uLCBpbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZW4gY29uc3QKKyAgICAgICAgYXVkaW9fdXRpbHNfZmlmbyAqIGNvbnN0IG1GaWZvOyAgICAgICAgICAgICAgICAgLy8gRklGTyBpdHNlbGYsIG5vbi1OVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVubGVzcyBjb25zdHJ1Y3RvciBmYWlscworICAgICAgICBhdWRpb191dGlsc19maWZvX3dyaXRlciAqIGNvbnN0IG1GaWZvV3JpdGVyOyAgICAvLyB1c2VkIHRvIHdyaXRlIHRvIEZJRk8sIG5vbi1OVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVubGVzcyBkdW1teSBjb25zdHJ1Y3RvciB1c2VkCisgICAgICAgIGJvb2wgICAgICAgICAgICBtRW5hYmxlZDsgICAvLyB3aGV0aGVyIHRvIGFjdHVhbGx5IGxvZworCisgICAgICAgIC8vIGNhY2hlZCBwaWQgYW5kIHByb2Nlc3MgbmFtZSB0byB1c2UgaW4gJXAgZm9ybWF0IHNwZWNpZmllcgorICAgICAgICAvLyB0b3RhbCB0YWcgbGVuZ3RoIGlzIG1QaWRUYWdTaXplIGFuZCBwcm9jZXNzIG5hbWUgaXMgbm90IHplcm8gdGVybWluYXRlZAorICAgICAgICBjaGFyICAgKm1QaWRUYWc7CisgICAgICAgIHNpemVfdCAgbVBpZFRhZ1NpemU7CisgICAgfTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8gU2ltaWxhciB0byBXcml0ZXIsIGJ1dCBzYWZlIGZvciBtdWx0aXBsZSB0aHJlYWRzIHRvIGNhbGwgY29uY3VycmVudGx5CisgICAgY2xhc3MgTG9ja2VkV3JpdGVyIDogcHVibGljIFdyaXRlciB7CisgICAgcHVibGljOgorICAgICAgICBMb2NrZWRXcml0ZXIoKTsKKyAgICAgICAgTG9ja2VkV3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOworCisgICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2coY29uc3QgY2hhciAqc3RyaW5nKTsKKyAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ2YoY29uc3QgY2hhciAqZm10LCAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKKyAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ3ZmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dUaW1lc3RhbXAoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1RpbWVzdGFtcChjb25zdCBpbnQ2NF90IHRzKTsKKyAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0ludGVnZXIoY29uc3QgaW50IHgpOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRmxvYXQoY29uc3QgZmxvYXQgeCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dQSUQoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1N0YXJ0KGNvbnN0IGNoYXIgKmZtdCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dFbmQoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0hhc2gobG9nX2hhc2hfdCBoYXNoKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgICAgaXNFbmFibGVkKCkgY29uc3Q7CisgICAgICAgIHZpcnR1YWwgYm9vbCAgICBzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBtdXRhYmxlIE11dGV4ICAgbUxvY2s7CisgICAgfTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgY2xhc3MgUmVhZGVyIDogcHVibGljIFJlZkJhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgLy8gQSBzbmFwc2hvdCBvZiBhIHJlYWRlcnMgYnVmZmVyCisgICAgICAgIC8vIFRoaXMgaXMgcmF3IGRhdGEuIE5vIGFuYWx5c2lzIGhhcyBiZWVuIGRvbmUgb24gaXQKKyAgICAgICAgY2xhc3MgU25hcHNob3QgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBTbmFwc2hvdCgpIDogbURhdGEoTlVMTCksIG1Mb3N0KDApIHt9CisKKyAgICAgICAgICAgIFNuYXBzaG90KHNpemVfdCBidWZmZXJTaXplKSA6IG1EYXRhKG5ldyB1aW50OF90W2J1ZmZlclNpemVdKSB7fQorCisgICAgICAgICAgICB+U25hcHNob3QoKSB7IGRlbGV0ZVtdIG1EYXRhOyB9CisKKyAgICAgICAgICAgIC8vIGNvcHkgb2YgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgdWludDhfdCAqZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1EYXRhOyB9CisKKyAgICAgICAgICAgIC8vIGFtb3VudCBvZiBkYXRhIGxvc3QgKGdpdmVuIGJ5IGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyKQorICAgICAgICAgICAgc2l6ZV90ICAgbG9zdCgpIGNvbnN0IHsgcmV0dXJuIG1Mb3N0OyB9CisKKyAgICAgICAgICAgIC8vIGl0ZXJhdG9yIHRvIGJlZ2lubmluZyBvZiByZWFkYWJsZSBzZWdtZW50IG9mIHNuYXBzaG90CisgICAgICAgICAgICAvLyBkYXRhIGJldHdlZW4gYmVnaW4gYW5kIGVuZCBoYXMgdmFsaWQgZW50cmllcworICAgICAgICAgICAgRW50cnlJdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIG1CZWdpbjsgfQorCisgICAgICAgICAgICAvLyBpdGVyYXRvciB0byBlbmQgb2YgcmVhZGFibGUgc2VnbWVudCBvZiBzbmFwc2hvdAorICAgICAgICAgICAgRW50cnlJdGVyYXRvciBlbmQoKSB7IHJldHVybiBtRW5kOyB9CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIGZyaWVuZCBjbGFzcyBNZXJnZVJlYWRlcjsKKyAgICAgICAgICAgIGZyaWVuZCBjbGFzcyBSZWFkZXI7CisgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICAgICAqbURhdGE7CisgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgbUxvc3Q7CisgICAgICAgICAgICBFbnRyeUl0ZXJhdG9yIG1CZWdpbjsKKyAgICAgICAgICAgIEVudHJ5SXRlcmF0b3IgbUVuZDsKKyAgICAgICAgfTsKKworICAgICAgICAvLyBJbnB1dCBwYXJhbWV0ZXIgJ3NpemUnIGlzIHRoZSBkZXNpcmVkIHNpemUgb2YgdGhlIHRpbWVsaW5lIGluIGJ5dGUgdW5pdHMuCisgICAgICAgIC8vIFRoZSBzaXplIG9mIHRoZSBzaGFyZWQgbWVtb3J5IG11c3QgYmUgYXQgbGVhc3QgVGltZWxpbmU6OnNoYXJlZFNpemUoc2l6ZSkuCisgICAgICAgIFJlYWRlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKTsKKyAgICAgICAgUmVhZGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSk7CisKKyAgICAgICAgdmlydHVhbCB+UmVhZGVyKCk7CisKKyAgICAgICAgLy8gZ2V0IHNuYXBzaG90IG9mIHJlYWRlcnMgZmlmbyBidWZmZXIsIGVmZmVjdGl2ZWx5IGNvbnN1bWluZyB0aGUgYnVmZmVyCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4gZ2V0U25hcHNob3QoKTsKKworICAgICAgICBib29sICAgICBpc0lNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnkpIGNvbnN0OworCisgICAgcHJvdGVjdGVkOgorICAgICAgICAvLyBwcmludCBhIHN1bW1hcnkgb2YgdGhlIHBlcmZvcm1hbmNlIHRvIHRoZSBjb25zb2xlCisgICAgICAgIHZvaWQgICAgZHVtcExpbmUoY29uc3QgU3RyaW5nOCYgdGltZXN0YW1wLCBTdHJpbmc4JiBib2R5KTsKKyAgICAgICAgRW50cnlJdGVyYXRvciAgIGhhbmRsZUZvcm1hdChjb25zdCBGb3JtYXRFbnRyeSAmZm10RW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCAqdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggKmJvZHkpOworICAgICAgICBpbnQgbUZkOyAgICAgICAgICAgICAgICAvLyBmaWxlIGRlc2NyaXB0b3IKKyAgICAgICAgaW50IG1JbmRlbnQ7ICAgICAgICAgICAgLy8gaW5kZW50YXRpb24gbGV2ZWwKKyAgICAgICAgaW50IG1Mb3N0OyAgICAgICAgICAgICAgLy8gYnl0ZXMgb2YgZGF0YSBsb3N0IGJlZm9yZSBidWZmZXIgd2FzIHJlYWQKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0YXRpYyBjb25zdCBzdGQ6OnNldDxFdmVudD4gc3RhcnRpbmdUeXBlczsKKyAgICAgICAgc3RhdGljIGNvbnN0IHN0ZDo6c2V0PEV2ZW50PiBlbmRpbmdUeXBlczsKKworICAgICAgICAvLyBkZWNsYXJlZCBhcyBjb25zdCBiZWNhdXNlIGF1ZGlvX3V0aWxzX2ZpZm8oKSBjb25zdHJ1Y3RvcgorICAgICAgICBzcDxJTWVtb3J5PiBtSU1lbW9yeTsgICAgICAgLy8gcmVmLWNvdW50ZWQgdmVyc2lvbiwgYXNzaWduZWQgb25seSBpbiBjb25zdHJ1Y3RvcgorCisgICAgICAgIC8qY29uc3QqLyBTaGFyZWQqIGNvbnN0IG1TaGFyZWQ7ICAgIC8vIHJhdyBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnksIGFjdHVhbGx5IGNvbnN0IGJ1dCBub3QKKyAgICAgICAgYXVkaW9fdXRpbHNfZmlmbyAqIGNvbnN0IG1GaWZvOyAgICAgICAgICAgICAgICAgLy8gRklGTyBpdHNlbGYsCisgICAgICAgIC8vIG5vbi1OVUxMIHVubGVzcyBjb25zdHJ1Y3RvciBmYWlscworICAgICAgICBhdWRpb191dGlsc19maWZvX3JlYWRlciAqIGNvbnN0IG1GaWZvUmVhZGVyOyAgICAvLyB1c2VkIHRvIHJlYWQgZnJvbSBGSUZPLAorICAgICAgICAvLyBub24tTlVMTCB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKKworICAgICAgICAvLyBTZWFyY2hlcyBmb3IgdGhlIGxhc3QgZW50cnkgb2YgdHlwZSA8dHlwZT4gaW4gdGhlIHJhbmdlIFtmcm9udCwgYmFjaykKKyAgICAgICAgLy8gYmFjayBoYXMgdG8gYmUgZW50cnktYWxpZ25lZC4gUmV0dXJucyBudWxscHRyIGlmIG5vbmUgZW5jb251bnRlcmVkLgorICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCAqZmluZExhc3RFbnRyeU9mVHlwZXMoY29uc3QgdWludDhfdCAqZnJvbnQsIGNvbnN0IHVpbnQ4X3QgKmJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxFdmVudD4gJnR5cGVzKTsKKworICAgICAgICAvLyBkdW1teSBtZXRob2QgZm9yIGhhbmRsaW5nIGFic2VudCBhdXRob3IgZW50cnkKKyAgICAgICAgdmlydHVhbCB2b2lkIGhhbmRsZUF1dGhvcihjb25zdCBBYnN0cmFjdEVudHJ5JiAvKmZtdEVudHJ5Ki8sIFN0cmluZzgqIC8qYm9keSovKSB7fQorICAgIH07CisKKyAgICAvLyBXcmFwcGVyIGZvciBhIHJlYWRlciB3aXRoIGEgbmFtZS4gQ29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSByZWFkZXIgYW5kIGEgcG9pbnRlciB0byB0aGUgbmFtZQorICAgIGNsYXNzIE5hbWVkUmVhZGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIE5hbWVkUmVhZGVyKCkgeyBtTmFtZVswXSA9ICdcMCc7IH0gLy8gZm9yIFZlY3RvcgorICAgICAgICBOYW1lZFJlYWRlcihjb25zdCBzcDxOQkxvZzo6UmVhZGVyPiYgcmVhZGVyLCBjb25zdCBjaGFyICpuYW1lKSA6CisgICAgICAgICAgICBtUmVhZGVyKHJlYWRlcikKKyAgICAgICAgICAgIHsgc3RybGNweShtTmFtZSwgbmFtZSwgc2l6ZW9mKG1OYW1lKSk7IH0KKyAgICAgICAgfk5hbWVkUmVhZGVyKCkgeyB9CisgICAgICAgIGNvbnN0IHNwPE5CTG9nOjpSZWFkZXI+JiAgcmVhZGVyKCkgY29uc3QgeyByZXR1cm4gbVJlYWRlcjsgfQorICAgICAgICBjb25zdCBjaGFyKiAgICAgICAgICAgICAgIG5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3A8TkJMb2c6OlJlYWRlcj4gICBtUmVhZGVyOworICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhOYW1lID0gMzI7CisgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgbU5hbWVba01heE5hbWVdOworICAgIH07CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vIFRoaXMgY2xhc3MgaXMgdXNlZCB0byByZWFkIGRhdGEgZnJvbSBlYWNoIHRocmVhZCdzIGluZGl2aWR1YWwgRklGTyBpbiBzaGFyZWQgbWVtb3J5CisgICAgLy8gYW5kIHdyaXRlIGl0IHRvIGEgc2luZ2xlIEZJRk8gaW4gbG9jYWwgbWVtb3J5LgorICAgIGNsYXNzIE1lcmdlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIE1lcmdlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKTsKKworICAgICAgICB2aXJ0dWFsIH5NZXJnZXIoKSB7fQorCisgICAgICAgIHZvaWQgYWRkUmVhZGVyKGNvbnN0IE5hbWVkUmVhZGVyICZyZWFkZXIpOworICAgICAgICAvLyBUT0RPIGFkZCByZW1vdmVSZWFkZXIKKyAgICAgICAgdm9pZCBtZXJnZSgpOworCisgICAgICAgIC8vIEZJWE1FIFRoaXMgaXMgcmV0dXJuaW5nIGEgcmVmZXJlbmNlIHRvIGEgc2hhcmVkIHZhcmlhYmxlIHRoYXQgbmVlZHMgYSBsb2NrCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE5hbWVkUmVhZGVyPiYgZ2V0TmFtZWRSZWFkZXJzKCkgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgICAvLyB2ZWN0b3Igb2YgdGhlIHJlYWRlcnMgdGhlIG1lcmdlciBpcyBzdXBwb3NlZCB0byBtZXJnZSBmcm9tLgorICAgICAgICAvLyBldmVyeSByZWFkZXIgcmVhZHMgZnJvbSBhIHdyaXRlcidzIGJ1ZmZlcgorICAgICAgICAvLyBGSVhNRSBOZWVkcyB0byBiZSBwcm90ZWN0ZWQgYnkgYSBsb2NrCisgICAgICAgIHN0ZDo6dmVjdG9yPE5hbWVkUmVhZGVyPiBtTmFtZWRSZWFkZXJzOworCisgICAgICAgIFNoYXJlZCAqIGNvbnN0IG1TaGFyZWQ7IC8vIHJhdyBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnkKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm8+IG1GaWZvOyAvLyBGSUZPIGl0c2VsZgorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+IG1GaWZvV3JpdGVyOyAvLyB1c2VkIHRvIHdyaXRlIHRvIEZJRk8KKyAgICB9OworCisgICAgLy8gVGhpcyBjbGFzcyBoYXMgYSBwb2ludGVyIHRvIHRoZSBGSUZPIGluIGxvY2FsIG1lbW9yeSB3aGljaCBzdG9yZXMgdGhlIG1lcmdlZAorICAgIC8vIGRhdGEgY29sbGVjdGVkIGJ5IE5CTG9nOjpNZXJnZXIgZnJvbSBhbGwgTmFtZWRSZWFkZXJzLiBJdCBpcyB1c2VkIHRvIHByb2Nlc3MKKyAgICAvLyB0aGlzIGRhdGEgYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8gUGVyZm9ybWFuY2VBbmFseXNpcy4KKyAgICBjbGFzcyBNZXJnZVJlYWRlciA6IHB1YmxpYyBSZWFkZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgTWVyZ2VSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSwgTWVyZ2VyICZtZXJnZXIpOworCisgICAgICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCBpbmRlbnQgPSAwKTsKKyAgICAgICAgLy8gcHJvY2VzcyBhIHBhcnRpY3VsYXIgc25hcHNob3Qgb2YgdGhlIHJlYWRlcgorICAgICAgICB2b2lkIGdldEFuZFByb2Nlc3NTbmFwc2hvdChTbmFwc2hvdCAmIHNuYXApOworICAgICAgICAvLyBjYWxsIGdldFNuYXBzaG90IG9mIHRoZSBjb250ZW50IG9mIHRoZSByZWFkZXIncyBidWZmZXIgYW5kIHByb2Nlc3MgdGhlIGRhdGEKKyAgICAgICAgdm9pZCBnZXRBbmRQcm9jZXNzU25hcHNob3QoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIC8vIEZJWE1FIE5lZWRzIHRvIGJlIHByb3RlY3RlZCBieSBhIGxvY2ssCisgICAgICAgIC8vICAgICAgIGJlY2F1c2UgZXZlbiB0aG91Z2ggb3VyIHVzZSBvZiBpdCBpcyByZWFkLW9ubHkgdGhlcmUgbWF5IGJlIGFzeW5jaHJvbm91cyB1cGRhdGVzCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE5hbWVkUmVhZGVyPiYgbU5hbWVkUmVhZGVyczsKKworICAgICAgICAvLyBhbmFseXplcywgY29tcHJlc3NlcyBhbmQgc3RvcmVzIHRoZSBtZXJnZWQgZGF0YQorICAgICAgICAvLyBjb250YWlucyBhIHNlcGFyYXRlIGluc3RhbmNlIGZvciBldmVyeSBhdXRob3IgKHRocmVhZCksIGFuZCBmb3IgZXZlcnkgc291cmNlIGZpbGUKKyAgICAgICAgLy8gbG9jYXRpb24gd2l0aGluIGVhY2ggYXV0aG9yCisgICAgICAgIFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZUFuYWx5c2lzTWFwIG1UaHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzOworCisgICAgICAgIC8vIGhhbmRsZSBhdXRob3IgZW50cnkgYnkgbG9va2luZyB1cCB0aGUgYXV0aG9yJ3MgbmFtZSBhbmQgYXBwZW5kaW5nIGl0IHRvIHRoZSBib2R5CisgICAgICAgIC8vIHJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSBmbXRFbnRyeQorICAgICAgICB2b2lkIGhhbmRsZUF1dGhvcihjb25zdCBBYnN0cmFjdEVudHJ5ICZmbXRFbnRyeSwgU3RyaW5nOCAqYm9keSk7CisgICAgfTsKKworICAgIC8vIE1lcmdlVGhyZWFkIGlzIGEgdGhyZWFkIHRoYXQgY29udGFpbnMgYSBNZXJnZXIuIEl0IHdvcmtzIGFzIGEgcmV0cmlnZ2VyYWJsZSBvbmUtc2hvdDoKKyAgICAvLyB3aGVuIHRyaWdnZXJlZCwgaXQgYXdha2VzIGZvciBhIGxhcHNlIG9mIHRpbWUsIGR1cmluZyB3aGljaCBpdCBwZXJpb2RpY2FsbHkgbWVyZ2VzOyBpZgorICAgIC8vIHJldHJpZ2dlcmVkLCB0aGUgdGltZW91dCBpcyByZXNldC4KKyAgICAvLyBUaGUgdGhyZWFkIGlzIHRyaWdnZXJlZCBvbiBBdWRpb0ZsaW5nZXIgYmluZGVyIGFjdGl2aXR5LgorICAgIGNsYXNzIE1lcmdlVGhyZWFkIDogcHVibGljIFRocmVhZCB7CisgICAgcHVibGljOgorICAgICAgICBNZXJnZVRocmVhZChNZXJnZXIgJm1lcmdlciwgTWVyZ2VSZWFkZXIgJm1lcmdlUmVhZGVyKTsKKyAgICAgICAgdmlydHVhbCB+TWVyZ2VUaHJlYWQoKSBvdmVycmlkZTsKKworICAgICAgICAvLyBSZXNldCB0aW1lb3V0IGFuZCBhY3RpdmF0ZSB0aHJlYWQgdG8gbWVyZ2UgcGVyaW9kaWNhbGx5IGlmIGl0J3MgaWRsZQorICAgICAgICB2b2lkIHdha2V1cCgpOworCisgICAgICAgIC8vIFNldCB0aW1lb3V0IHBlcmlvZCB1bnRpbCB0aGUgbWVyZ2luZyB0aHJlYWQgZ29lcyBpZGxlIGFnYWluCisgICAgICAgIHZvaWQgc2V0VGltZW91dFVzKGludCB0aW1lKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCkgb3ZlcnJpZGU7CisKKyAgICAgICAgLy8gdGhlIG1lcmdlciB3aG8gYWN0dWFsbHkgZG9lcyB0aGUgd29yayBvZiBtZXJnaW5nIHRoZSBsb2dzCisgICAgICAgIE1lcmdlciYgICAgIG1NZXJnZXI7CisKKyAgICAgICAgLy8gdGhlIG1lcmdlcmVhZGVyIHVzZWQgdG8gcHJvY2VzcyBkYXRhIG1lcmdlZCBieSBtTWVyZ2VyCisgICAgICAgIE1lcmdlUmVhZGVyJiBtTWVyZ2VSZWFkZXI7CisKKyAgICAgICAgLy8gbXV0ZXggZm9yIHRoZSBjb25kaXRpb24gdmFyaWFibGUKKyAgICAgICAgTXV0ZXggICAgICAgbU11dGV4OworCisgICAgICAgIC8vIGNvbmRpdGlvbiB2YXJpYWJsZSB0byBhY3RpdmF0ZSBtZXJnaW5nIG9uIHRpbWVvdXQgPj0gMAorICAgICAgICBDb25kaXRpb24gICBtQ29uZDsKKworICAgICAgICAvLyB0aW1lIGxlZnQgdW50aWwgdGhlIHRocmVhZCBibG9ja3MgYWdhaW4gKGluIG1pY3Jvc2Vjb25kcykKKyAgICAgICAgaW50ICAgICAgICAgbVRpbWVvdXRVczsKKworICAgICAgICAvLyBtZXJnaW5nIHBlcmlvZCB3aGVuIHRoZSB0aHJlYWQgaXMgYXdha2UKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCAga1RocmVhZFNsZWVwUGVyaW9kVXMgPSAxMDAwMDAwIC8qMXMqLzsKKworICAgICAgICAvLyBpbml0aWFsIHRpbWVvdXQgdmFsdWUgd2hlbiB0cmlnZ2VyZWQKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCAga1RocmVhZFdha2V1cFBlcmlvZFVzID0gMzAwMDAwMCAvKjNzKi87CisgICAgfTsKKworfTsgIC8vIGNsYXNzIE5CTG9nCisKKy8vIFRPRE8gcHV0IHNvbWV3aGVyZSBlbHNlCitzdGF0aWMgaW5saW5lIGludDY0X3QgZ2V0X21vbm90b25pY19ucygpIHsKKyAgICB0aW1lc3BlYyB0czsKKyAgICBpZiAoY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0cykgPT0gMCkgeworICAgICAgICByZXR1cm4gKHVpbnQ2NF90KSB0cy50dl9zZWMgKiAxMDAwICogMTAwMCAqIDEwMDAgKyB0cy50dl9uc2VjOworICAgIH0KKyAgICByZXR1cm4gMDsgLy8gc2hvdWxkIG5vdCBoYXBwZW4uCit9CisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfTkJMT0dfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmggYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGZlOWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmgKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfUEVSRk9STUFOQ0VBTkFMWVNJU19ICisjZGVmaW5lIEFORFJPSURfTUVESUFfUEVSRk9STUFOQ0VBTkFMWVNJU19ICisKKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UgeworCitjbGFzcyBQZXJmb3JtYW5jZUFuYWx5c2lzOworCisvLyBhIG1hcCBvZiBQZXJmb3JtYW5jZUFuYWx5c2lzIGluc3RhbmNlcworLy8gVGhlIG91dGVyIGtleSBpcyBmb3IgdGhlIHRocmVhZCwgdGhlIGlubmVyIGtleSBmb3IgdGhlIHNvdXJjZSBmaWxlIGxvY2F0aW9uLgordXNpbmcgUGVyZm9ybWFuY2VBbmFseXNpc01hcCA9IHN0ZDo6bWFwPGludCwgc3RkOjptYXA8bG9nX2hhc2hfdCwgUGVyZm9ybWFuY2VBbmFseXNpcz4+OworCitjbGFzcyBQZXJmb3JtYW5jZUFuYWx5c2lzIHsKKyAgICAvLyBUaGlzIGNsYXNzIHN0b3JlcyBhbmQgYW5hbHl6ZXMgYXVkaW8gcHJvY2Vzc2luZyB3YWtldXAgdGltZXN0YW1wcyBmcm9tIE5CTG9nCisgICAgLy8gRklYTUU6IGN1cnJlbnRseSwgYWxsIHBlcmZvcm1hbmNlIGRhdGEgaXMgc3RvcmVkIGluIGRlcXVlcy4gVHVybiB0aGVzZSBpbnRvIGNpcmN1bGFyCisgICAgLy8gYnVmZmVycy4KKyAgICAvLyBUT0RPOiBhZGQgYSBtdXRleC4KK3B1YmxpYzoKKworICAgIFBlcmZvcm1hbmNlQW5hbHlzaXMoKSB7fTsKKworICAgIGZyaWVuZCB2b2lkIGR1bXAoaW50IGZkLCBpbnQgaW5kZW50LAorICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybWFuY2VBbmFseXNpc01hcCAmdGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpcyk7CisKKyAgICAvLyBDYWxsZWQgaW4gdGhlIGNhc2Ugb2YgYW4gYXVkaW8gb24vb2ZmIGV2ZW50LCBlLmcuLCBFVkVOVF9BVURJT19TVEFURS4KKyAgICAvLyBVc2VkIHRvIGRpc2NhcmQgaWRsZSB0aW1lIGludGVydmFscworICAgIHZvaWQgaGFuZGxlU3RhdGVDaGFuZ2UoKTsKKworICAgIC8vIFdyaXRlcyB3YWtldXAgdGltZXN0YW1wIGVudHJ5IHRvIGxvZyBhbmQgcnVucyBhbmFseXNpcworICAgIHZvaWQgbG9nVHNFbnRyeSh0aW1lc3RhbXAgdHMpOworCisgICAgLy8gRklYTUU6IG1ha2UgcGVha2RldGVjdG9yIGFuZCBzdG9yZU91dGxpZXJEYXRhIGEgc2luZ2xlIGZ1bmN0aW9uCisgICAgLy8gSW5wdXQ6IG1PdXRsaWVyRGF0YS4gTG9va3MgYXQgdGltZSBlbGFwc2VkIGJldHdlZW4gb3V0bGllcnMKKyAgICAvLyBmaW5kcyBzaWduaWZpY2FudCBjaGFuZ2VzIGluIHRoZSBkaXN0cmlidXRpb24KKyAgICAvLyB3cml0ZXMgdGltZXN0YW1wcyBvZiBzaWduaWZpY2FudCBjaGFuZ2VzIHRvIG1QZWFrVGltZXN0YW1wcworICAgIGJvb2wgZGV0ZWN0QW5kU3RvcmVQZWFrKG1zSW50ZXJ2YWwgZGVsdGEsIHRpbWVzdGFtcCB0cyk7CisKKyAgICAvLyBzdG9yZXMgdGltZXN0YW1wcyBvZiBpbnRlcnZhbHMgYWJvdmUgYSB0aHJlc2hvbGQ6IHRoZXNlIGFyZSBhc3N1bWVkIG91dGxpZXJzLgorICAgIC8vIHdyaXRlcyB0byBtT3V0bGllckRhdGEgPHRpbWUgZWxhcHNlZCBzaW5jZSBwcmV2aW91cyBvdXRsaWVyLCBvdXRsaWVyIHRpbWVzdGFtcD4KKyAgICBib29sIGRldGVjdEFuZFN0b3JlT3V0bGllcihjb25zdCBtc0ludGVydmFsIGRpZmZNcyk7CisKKyAgICAvLyBHZW5lcmF0ZXMgYSBzdHJpbmcgb2YgYW5hbHlzaXMgb2YgdGhlIGJ1ZmZlciBwZXJpb2RzIGFuZCBwcmludHMgdG8gY29uc29sZQorICAgIC8vIEZJWE1FOiBtb3ZlIHRoaXMgZGF0YSB2aXN1YWxpemF0aW9uIHRvIGEgc2VwYXJhdGUgY2xhc3MuIE1vZGVsL3ZpZXcvY29udHJvbGxlcgorICAgIHZvaWQgcmVwb3J0UGVyZm9ybWFuY2UoU3RyaW5nOCAqYm9keSwgaW50IGF1dGhvciwgbG9nX2hhc2hfdCBoYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heEhlaWdodCA9IDEwKTsKKworcHJpdmF0ZToKKworICAgIC8vIFRPRE8gdXNlIGEgY2lyY3VsYXIgYnVmZmVyIGZvciB0aGUgZGVxdWVzIGFuZCB2ZWN0b3JzIGJlbG93CisKKyAgICAvLyBzdG9yZXMgb3V0bGllciBhbmFseXNpczoKKyAgICAvLyA8ZWxhcHNlZCB0aW1lIGJldHdlZW4gb3V0bGllcnMgaW4gbXMsIG91dGxpZXIgYmVnaW5uaW5nIHRpbWVzdGFtcD4KKyAgICBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjxtc0ludGVydmFsLCB0aW1lc3RhbXA+PiBtT3V0bGllckRhdGE7CisKKyAgICAvLyBzdG9yZXMgZWFjaCB0aW1lc3RhbXAgYXQgd2hpY2ggYSBwZWFrIHdhcyBkZXRlY3RlZAorICAgIC8vIGEgcGVhayBpcyBhIG1vbWVudCBhdCB3aGljaCB0aGUgYXZlcmFnZSBvdXRsaWVyIGludGVydmFsIGNoYW5nZWQgc2lnbmlmaWNhbnRseQorICAgIHN0ZDo6ZGVxdWU8dGltZXN0YW1wPiBtUGVha1RpbWVzdGFtcHM7CisKKyAgICAvLyBzdG9yZXMgYnVmZmVyIHBlcmlvZCBoaXN0b2dyYW1zIHdpdGggdGltZXN0YW1wIG9mIGZpcnN0IHNhbXBsZQorICAgIHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdG9ncmFtPj4gbUhpc3RzOworCisgICAgLy8gUGFyYW1ldGVycyB1c2VkIHdoZW4gZGV0ZWN0aW5nIG91dGxpZXJzCisgICAgc3RydWN0IEJ1ZmZlclBlcmlvZCB7CisgICAgICAgIGRvdWJsZSAgICBtTWVhbiA9IC0xOyAgICAgICAgICAvLyBhdmVyYWdlIHRpbWUgYmV0d2VlbiBhdWRpbyBwcm9jZXNzaW5nIHdha2V1cHMKKyAgICAgICAgZG91YmxlICAgIG1PdXRsaWVyRmFjdG9yID0gLTE7IC8vIHZhbHVlcyA+IG1NZWFuICogbU91dGxpZXJGYWN0b3IgYXJlIG91dGxpZXJzCisgICAgICAgIGRvdWJsZSAgICBtT3V0bGllciA9IC0xOyAgICAgICAvLyB0aGlzIGlzIHNldCB0byBtTWVhbiAqIG1PdXRsaWVyRmFjdG9yCisgICAgICAgIHRpbWVzdGFtcCBtUHJldlRzID0gLTE7ICAgICAgICAvLyBwcmV2aW91cyB0aW1lc3RhbXAKKyAgICB9IG1CdWZmZXJQZXJpb2Q7CisKKyAgICAvLyBjYXBhY2l0eSBhbGxvY2F0ZWQgdG8gZGF0YSBzdHJ1Y3R1cmVzCisgICAgc3RydWN0IE1heExlbmd0aCB7CisgICAgICAgIHNpemVfdCBIaXN0czsgLy8gbnVtYmVyIG9mIGhpc3RvZ3JhbXMgc3RvcmVkIGluIG1lbW9yeQorICAgICAgICBzaXplX3QgT3V0bGllcnM7IC8vIG51bWJlciBvZiB2YWx1ZXMgc3RvcmVkIGluIG91dGxpZXIgYXJyYXkKKyAgICAgICAgc2l6ZV90IFBlYWtzOyAvLyBudW1iZXIgb2YgdmFsdWVzIHN0b3JlZCBpbiBwZWFrIGFycmF5CisgICAgICAgIGludCBIaXN0VGltZXNwYW5NczsgLy8gbWF4aW11bSBoaXN0b2dyYW0gdGltZXNwYW4KKyAgICB9OworICAgIC8vIFRoZXNlIHZhbHVlcyBhbGxvdyBmb3IgMTAgaG91cnMgb2YgZGF0YSBhbGxvd2luZyBmb3IgYSBnbGl0Y2ggYW5kIGEgcGVhaworICAgIC8vIGFzIG9mdGVuIGFzIGV2ZXJ5IDMgc2Vjb25kcworICAgIHN0YXRpYyBjb25zdGV4cHIgTWF4TGVuZ3RoIGtNYXhMZW5ndGggPSB7Lkhpc3RzID0gNjAsIC5PdXRsaWVycyA9IDEyMDAwLAorICAgICAgICAgICAgLlBlYWtzID0gMTIwMDAsIC5IaXN0VGltZXNwYW5NcyA9IDEwICoga1NlY1Blck1pbiAqIGtNc1BlclNlYyB9OworCisgICAgLy8gdGhlc2UgdmFyaWFibGVzIGVuc3VyZSBjb250aW51aXR5IHdoaWxlIGFuYWx5emluZyB0aGUgdGltZXN0YW1wCisgICAgLy8gc2VyaWVzIG9uZSBzYW1wbGUgYXQgYSB0aW1lLgorICAgIC8vIFRPRE86IGNoYW5nZSB0aGlzIHRvIGEgcnVubmluZyB2YXJpYW5jZS9tZWFuIGNsYXNzCisgICAgc3RydWN0IE91dGxpZXJEaXN0cmlidXRpb24geworICAgICAgICBtc0ludGVydmFsIG1NZWFuID0gMDsgICAgICAgICAvLyBzYW1wbGUgbWVhbiBzaW5jZSBwcmV2aW91cyBwZWFrCisgICAgICAgIG1zSW50ZXJ2YWwgbVNkID0gMDsgICAgICAgICAgIC8vIHNhbXBsZSBzZCBzaW5jZSBwcmV2aW91cyBwZWFrCisgICAgICAgIG1zSW50ZXJ2YWwgbUVsYXBzZWQgPSAwOyAgICAgIC8vIHRpbWUgc2luY2UgcHJldmlvdXMgZGV0ZWN0ZWQgb3V0bGllcgorICAgICAgICBjb25zdCBpbnQgIGtNYXhEZXZpYXRpb24gPSA1OyAvLyBzdGFuZGFyZCBkZXZpYXRpb25zIGZyb20gdGhlIG1lYW4gdGhyZXNob2xkCisgICAgICAgIG1zSW50ZXJ2YWwgbVR5cGljYWxEaWZmID0gMDsgIC8vIGdsb2JhbCBtZWFuIG9mIG91dGxpZXJzCisgICAgICAgIGRvdWJsZSAgICAgbU4gPSAwOyAgICAgICAgICAgIC8vIGxlbmd0aCBvZiBzZXF1ZW5jZSBzaW5jZSB0aGUgbGFzdCBwZWFrCisgICAgICAgIGRvdWJsZSAgICAgbU0yID0gMDsgICAgICAgICAgIC8vIHVzZWQgdG8gY2FsY3VsYXRlIHNkCisgICAgfSBtT3V0bGllckRpc3RyaWJ1dGlvbjsKK307CisKK3ZvaWQgZHVtcChpbnQgZmQsIGludCBpbmRlbnQsIFBlcmZvcm1hbmNlQW5hbHlzaXNNYXAgJnRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXMpOwordm9pZCBkdW1wTGluZShpbnQgZmQsIGludCBpbmRlbnQsIGNvbnN0IFN0cmluZzggJmJvZHkpOworCit9IC8vIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1BFUkZPUk1BTkNFQU5BTFlTSVNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMDg0MmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmgKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9SRVBPUlRQRVJGT1JNQU5DRV9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfUkVQT1JUUEVSRk9STUFOQ0VfSAorCisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBUaGUgU3RyaW5nOCBjbGFzcyBpcyB1c2VkIGJ5IHJlcG9ydFBlcmZvcm1hbmNlIGZ1bmN0aW9uCitjbGFzcyBTdHJpbmc4OworCituYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UgeworCitjb25zdGV4cHIgaW50IGtNc1BlclNlYyA9IDEwMDA7Citjb25zdGV4cHIgaW50IGtTZWNQZXJNaW4gPSA2MDsKKworY29uc3RleHByIGludCBrSmlmZnlQZXJNcyA9IDEwOyAvLyB0aW1lIHVuaXQgZm9yIGhpc3RvZ3JhbSBhcyBhIG11bHRpcGxlIG9mIG1pbGxpc2Vjb25kcworCisvLyBzdG9yZXMgYSBoaXN0b2dyYW06IGtleTogb2JzZXJ2ZWQgYnVmZmVyIHBlcmlvZCAobXVsdGlwbGUgb2YgamlmZnkpLiB2YWx1ZTogY291bnQKK3VzaW5nIEhpc3RvZ3JhbSA9IHN0ZDo6bWFwPGludCwgaW50PjsKKwordXNpbmcgbXNJbnRlcnZhbCA9IGRvdWJsZTsKK3VzaW5nIGppZmZ5SW50ZXJ2YWwgPSBkb3VibGU7CisKK3VzaW5nIHRpbWVzdGFtcCA9IGludDY0X3Q7CisKK3VzaW5nIGxvZ19oYXNoX3QgPSB1aW50NjRfdDsKKworc3RhdGljIGlubGluZSBpbnQgZGVsdGFNcyhpbnQ2NF90IG5zMSwgaW50NjRfdCBuczIpIHsKKyAgICByZXR1cm4gKG5zMiAtIG5zMSkgLyAoMTAwMCAqIDEwMDApOworfQorCitzdGF0aWMgaW5saW5lIGludCBkZWx0YUppZmZ5KGludDY0X3QgbnMxLCBpbnQ2NF90IG5zMikgeworICAgIHJldHVybiAoa0ppZmZ5UGVyTXMgKiAobnMyIC0gbnMxKSkgLyAoMTAwMCAqIDEwMDApOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGxvZzIodWludDMyX3QgeCkgeworICAgIC8vIFRoaXMgd29ya3MgZm9yIHggPiAwCisgICAgcmV0dXJuIDMxIC0gX19idWlsdGluX2Nseih4KTsKK30KKworLy8gV3JpdGVzIG91dGxpZXIgaW50ZXJ2YWxzLCB0aW1lc3RhbXBzLCBwZWFrcyB0aW1lc3RhbXBzLCBhbmQgaGlzdG9ncmFtcyB0byBhIGZpbGUuCit2b2lkIHdyaXRlVG9GaWxlKGNvbnN0IHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdG9ncmFtPj4gJmhpc3RzLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjxtc0ludGVydmFsLCB0aW1lc3RhbXA+PiAmb3V0bGllckRhdGEsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6ZGVxdWU8dGltZXN0YW1wPiAmcGVha1RpbWVzdGFtcHMsCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBrRGlyZWN0b3J5LCBib29sIGFwcGVuZCwgaW50IGF1dGhvciwgbG9nX2hhc2hfdCBoYXNoKTsKKworfSAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9SRVBPUlRQRVJGT1JNQU5DRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDRXh0cmFjdG9yLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JhMTg1OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNFeHRyYWN0b3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkFBQ0V4dHJhY3RvciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgImluY2x1ZGUvQUFDRXh0cmFjdG9yLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEFBQ1NvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7Ci1wdWJsaWM6Ci0gICAgQUFDU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsCi0gICAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSwKLSAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ2NF90PiAmb2Zmc2V0X3ZlY3RvciwKLSAgICAgICAgICAgICAgaW50NjRfdCBmcmFtZV9kdXJhdGlvbl91cyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLQotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5BQUNTb3VyY2UoKTsKLQotcHJpdmF0ZToKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhGcmFtZVNpemU7Ci0gICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7Ci0gICAgc3A8TWV0YURhdGE+IG1NZXRhOwotCi0gICAgb2ZmNjRfdCBtT2Zmc2V0OwotICAgIGludDY0X3QgbUN1cnJlbnRUaW1lVXM7Ci0gICAgYm9vbCBtU3RhcnRlZDsKLSAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7Ci0KLSAgICBWZWN0b3I8dWludDY0X3Q+IG1PZmZzZXRWZWN0b3I7Ci0gICAgaW50NjRfdCBtRnJhbWVEdXJhdGlvblVzOwotCi0gICAgQUFDU291cmNlKGNvbnN0IEFBQ1NvdXJjZSAmKTsKLSAgICBBQUNTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBBQUNTb3VyY2UgJik7Ci19OwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0vLyBSZXR1cm5zIHRoZSBzYW1wbGUgcmF0ZSBiYXNlZCBvbiB0aGUgc2FtcGxpbmcgZnJlcXVlbmN5IGluZGV4Ci11aW50MzJfdCBnZXRfc2FtcGxlX3JhdGUoY29uc3QgdWludDhfdCBzZl9pbmRleCkKLXsKLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qgc2FtcGxlX3JhdGVzW10gPQotICAgIHsKLSAgICAgICAgOTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsIDQ0MTAwLCAzMjAwMCwKLSAgICAgICAgMjQwMDAsIDIyMDUwLCAxNjAwMCwgMTIwMDAsIDExMDI1LCA4MDAwCi0gICAgfTsKLQotICAgIGlmIChzZl9pbmRleCA8IHNpemVvZihzYW1wbGVfcmF0ZXMpIC8gc2l6ZW9mKHNhbXBsZV9yYXRlc1swXSkpIHsKLSAgICAgICAgcmV0dXJuIHNhbXBsZV9yYXRlc1tzZl9pbmRleF07Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8vIFJldHVybnMgdGhlIGZyYW1lIGxlbmd0aCBpbiBieXRlcyBhcyBkZXNjcmliZWQgaW4gYW4gQURUUyBoZWFkZXIgc3RhcnRpbmcgYXQgdGhlIGdpdmVuIG9mZnNldCwKLS8vICAgICBvciAwIGlmIHRoZSBzaXplIGNhbid0IGJlIHJlYWQgZHVlIHRvIGFuIGVycm9yIGluIHRoZSBoZWFkZXIgb3IgYSByZWFkIGZhaWx1cmUuCi0vLyBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgdGhlIEFBQyBmcmFtZSBzaXplIHdpdGggdGhlIEFEVFMgaGVhZGVyIGxlbmd0aCAocmVnYXJkbGVzcyBvZgotLy8gICAgIHRoZSBwcmVzZW5jZSBvZiB0aGUgQ1JDKS4KLS8vIElmIGhlYWRlclNpemUgaXMgbm9uLU5VTEwsIGl0IHdpbGwgYmUgdXNlZCB0byByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGhlYWRlciBvZiB0aGlzIEFEVFMgZnJhbWUuCi1zdGF0aWMgc2l6ZV90IGdldEFkdHNGcmFtZUxlbmd0aChjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90KiBoZWFkZXJTaXplKSB7Ci0KLSAgICBjb25zdCBzaXplX3Qga0FkdHNIZWFkZXJMZW5ndGhOb0NyYyA9IDc7Ci0gICAgY29uc3Qgc2l6ZV90IGtBZHRzSGVhZGVyTGVuZ3RoV2l0aENyYyA9IDk7Ci0KLSAgICBzaXplX3QgZnJhbWVTaXplID0gMDsKLQotICAgIHVpbnQ4X3Qgc3luY3dvcmRbMl07Ci0gICAgaWYgKHNvdXJjZS0+cmVhZEF0KG9mZnNldCwgJnN5bmN3b3JkLCAyKSAhPSAyKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoKHN5bmN3b3JkWzBdICE9IDB4ZmYpIHx8ICgoc3luY3dvcmRbMV0gJiAweGY2KSAhPSAweGYwKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICB1aW50OF90IHByb3RlY3Rpb25BYnNlbnQ7Ci0gICAgaWYgKHNvdXJjZS0+cmVhZEF0KG9mZnNldCArIDEsICZwcm90ZWN0aW9uQWJzZW50LCAxKSA8IDEpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHByb3RlY3Rpb25BYnNlbnQgJj0gMHgxOwotCi0gICAgdWludDhfdCBoZWFkZXJbM107Ci0gICAgaWYgKHNvdXJjZS0+cmVhZEF0KG9mZnNldCArIDMsICZoZWFkZXIsIDMpIDwgMykgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBmcmFtZVNpemUgPSAoaGVhZGVyWzBdICYgMHgzKSA8PCAxMSB8IGhlYWRlclsxXSA8PCAzIHwgaGVhZGVyWzJdID4+IDU7Ci0KLSAgICAvLyBwcm90ZWN0aW9uQWJzZW50IGlzIDAgaWYgdGhlcmUgaXMgQ1JDCi0gICAgc2l6ZV90IGhlYWRTaXplID0gcHJvdGVjdGlvbkFic2VudCA/IGtBZHRzSGVhZGVyTGVuZ3RoTm9DcmMgOiBrQWR0c0hlYWRlckxlbmd0aFdpdGhDcmM7Ci0gICAgaWYgKGhlYWRTaXplID4gZnJhbWVTaXplKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoaGVhZGVyU2l6ZSAhPSBOVUxMKSB7Ci0gICAgICAgICpoZWFkZXJTaXplID0gaGVhZFNpemU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZyYW1lU2l6ZTsKLX0KLQotQUFDRXh0cmFjdG9yOjpBQUNFeHRyYWN0b3IoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIGNvbnN0IHNwPEFNZXNzYWdlPiAmX21ldGEpCi0gICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAotICAgICAgbUluaXRDaGVjayhOT19JTklUKSwKLSAgICAgIG1GcmFtZUR1cmF0aW9uVXMoMCkgewotICAgIHNwPEFNZXNzYWdlPiBtZXRhID0gX21ldGE7Ci0KLSAgICBpZiAobWV0YSA9PSBOVUxMKSB7Ci0gICAgICAgIFN0cmluZzggbWltZVR5cGU7Ci0gICAgICAgIGZsb2F0IGNvbmZpZGVuY2U7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBfbWV0YTsKLQotICAgICAgICBpZiAoIVNuaWZmQUFDKG1EYXRhU291cmNlLCAmbWltZVR5cGUsICZjb25maWRlbmNlLCAmbWV0YSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludDY0X3Qgb2Zmc2V0OwotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQ2NCgib2Zmc2V0IiwgJm9mZnNldCkpOwotCi0gICAgdWludDhfdCBwcm9maWxlLCBzZl9pbmRleCwgY2hhbm5lbCwgaGVhZGVyWzJdOwotICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCArIDIsICZoZWFkZXIsIDIpIDwgMikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcHJvZmlsZSA9IChoZWFkZXJbMF0gPj4gNikgJiAweDM7Ci0gICAgc2ZfaW5kZXggPSAoaGVhZGVyWzBdID4+IDIpICYgMHhmOwotICAgIHVpbnQzMl90IHNyID0gZ2V0X3NhbXBsZV9yYXRlKHNmX2luZGV4KTsKLSAgICBpZiAoc3IgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNoYW5uZWwgPSAoaGVhZGVyWzBdICYgMHgxKSA8PCAyIHwgKGhlYWRlclsxXSA+PiA2KTsKLQotICAgIG1NZXRhID0gTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKHByb2ZpbGUsIHNmX2luZGV4LCBjaGFubmVsKTsKLQotICAgIG9mZjY0X3Qgc3RyZWFtU2l6ZSwgbnVtRnJhbWVzID0gMDsKLSAgICBzaXplX3QgZnJhbWVTaXplID0gMDsKLSAgICBpbnQ2NF90IGR1cmF0aW9uID0gMDsKLQotICAgIGlmIChtRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmc3RyZWFtU2l6ZSkgPT0gT0spIHsKLSAgICAgICAgIHdoaWxlIChvZmZzZXQgPCBzdHJlYW1TaXplKSB7Ci0gICAgICAgICAgICBpZiAoKGZyYW1lU2l6ZSA9IGdldEFkdHNGcmFtZUxlbmd0aChzb3VyY2UsIG9mZnNldCwgTlVMTCkpID09IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygicHJlbWF0dXJlZCBBQUMgc3RyZWFtICglbGxkIHZzICVsbGQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpb2Zmc2V0LCAobG9uZyBsb25nKXN0cmVhbVNpemUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtT2Zmc2V0VmVjdG9yLnB1c2gob2Zmc2V0KTsKLQotICAgICAgICAgICAgb2Zmc2V0ICs9IGZyYW1lU2l6ZTsKLSAgICAgICAgICAgIG51bUZyYW1lcyArKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJvdW5kIHVwIGFuZCBnZXQgdGhlIGR1cmF0aW9uCi0gICAgICAgIG1GcmFtZUR1cmF0aW9uVXMgPSAoMTAyNCAqIDEwMDAwMDBsbCArIChzciAtIDEpKSAvIHNyOwotICAgICAgICBkdXJhdGlvbiA9IG51bUZyYW1lcyAqIG1GcmFtZUR1cmF0aW9uVXM7Ci0gICAgICAgIG1NZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uKTsKLSAgICB9Ci0KLSAgICBtSW5pdENoZWNrID0gT0s7Ci19Ci0KLUFBQ0V4dHJhY3Rvcjo6fkFBQ0V4dHJhY3RvcigpIHsKLX0KLQotc3A8TWV0YURhdGE+IEFBQ0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoKSB7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbWV0YTsKLSAgICB9Ci0KLSAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFMpOwotCi0gICAgcmV0dXJuIG1ldGE7Ci19Ci0KLXNpemVfdCBBQUNFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewotICAgIHJldHVybiBtSW5pdENoZWNrID09IE9LID8gMSA6IDA7Ci19Ci0KLXNwPElNZWRpYVNvdXJjZT4gQUFDRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBuZXcgQUFDU291cmNlKG1EYXRhU291cmNlLCBtTWV0YSwgbU9mZnNldFZlY3RvciwgbUZyYW1lRHVyYXRpb25Vcyk7Ci19Ci0KLXNwPE1ldGFEYXRhPiBBQUNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewotICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1NZXRhOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0vLyA4MTkyID0gMl4xMywgMTNiaXQgQUFDIGZyYW1lIHNpemUgKGluIGJ5dGVzKQotY29uc3Qgc2l6ZV90IEFBQ1NvdXJjZTo6a01heEZyYW1lU2l6ZSA9IDgxOTI7Ci0KLUFBQ1NvdXJjZTo6QUFDU291cmNlKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsCi0gICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50NjRfdD4gJm9mZnNldF92ZWN0b3IsCi0gICAgICAgIGludDY0X3QgZnJhbWVfZHVyYXRpb25fdXMpCi0gICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAotICAgICAgbU1ldGEobWV0YSksCi0gICAgICBtT2Zmc2V0KDApLAotICAgICAgbUN1cnJlbnRUaW1lVXMoMCksCi0gICAgICBtU3RhcnRlZChmYWxzZSksCi0gICAgICBtR3JvdXAoTlVMTCksCi0gICAgICBtT2Zmc2V0VmVjdG9yKG9mZnNldF92ZWN0b3IpLAotICAgICAgbUZyYW1lRHVyYXRpb25VcyhmcmFtZV9kdXJhdGlvbl91cykgewotfQotCi1BQUNTb3VyY2U6On5BQUNTb3VyY2UoKSB7Ci0gICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgIHN0b3AoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEFBQ1NvdXJjZTo6c3RhcnQoTWV0YURhdGEgKiAvKiBwYXJhbXMgKi8pIHsKLSAgICBDSEVDSyghbVN0YXJ0ZWQpOwotCi0gICAgaWYgKG1PZmZzZXRWZWN0b3IuZW1wdHkoKSkgewotICAgICAgICBtT2Zmc2V0ID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBtT2Zmc2V0ID0gbU9mZnNldFZlY3Rvci5pdGVtQXQoMCk7Ci0gICAgfQotCi0gICAgbUN1cnJlbnRUaW1lVXMgPSAwOwotICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOwotICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihuZXcgTWVkaWFCdWZmZXIoa01heEZyYW1lU2l6ZSkpOwotICAgIG1TdGFydGVkID0gdHJ1ZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQUFDU291cmNlOjpzdG9wKCkgewotICAgIENIRUNLKG1TdGFydGVkKTsKLQotICAgIGRlbGV0ZSBtR3JvdXA7Ci0gICAgbUdyb3VwID0gTlVMTDsKLQotICAgIG1TdGFydGVkID0gZmFsc2U7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zcDxNZXRhRGF0YT4gQUFDU291cmNlOjpnZXRGb3JtYXQoKSB7Ci0gICAgcmV0dXJuIG1NZXRhOwotfQotCi1zdGF0dXNfdCBBQUNTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotICAgICpvdXQgPSBOVUxMOwotCi0gICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwotICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7Ci0gICAgICAgIGlmIChtRnJhbWVEdXJhdGlvblVzID4gMCkgewotICAgICAgICAgICAgaW50NjRfdCBzZWVrRnJhbWUgPSBzZWVrVGltZVVzIC8gbUZyYW1lRHVyYXRpb25VczsKLSAgICAgICAgICAgIGlmIChzZWVrRnJhbWUgPCAwIHx8IHNlZWtGcmFtZSA+PSAoaW50NjRfdCltT2Zmc2V0VmVjdG9yLnNpemUoKSkgewotICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzAyMzk1MDciKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUN1cnJlbnRUaW1lVXMgPSBzZWVrRnJhbWUgKiBtRnJhbWVEdXJhdGlvblVzOwotCi0gICAgICAgICAgICBtT2Zmc2V0ID0gbU9mZnNldFZlY3Rvci5pdGVtQXQoc2Vla0ZyYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHNpemVfdCBmcmFtZVNpemUsIGZyYW1lU2l6ZVdpdGhvdXRIZWFkZXIsIGhlYWRlclNpemU7Ci0gICAgaWYgKChmcmFtZVNpemUgPSBnZXRBZHRzRnJhbWVMZW5ndGgobURhdGFTb3VyY2UsIG1PZmZzZXQsICZoZWFkZXJTaXplKSkgPT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICB9Ci0KLSAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOwotICAgIHN0YXR1c190IGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGZyYW1lU2l6ZVdpdGhvdXRIZWFkZXIgPSBmcmFtZVNpemUgLSBoZWFkZXJTaXplOwotICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KG1PZmZzZXQgKyBoZWFkZXJTaXplLCBidWZmZXItPmRhdGEoKSwKLSAgICAgICAgICAgICAgICBmcmFtZVNpemVXaXRob3V0SGVhZGVyKSAhPSAoc3NpemVfdClmcmFtZVNpemVXaXRob3V0SGVhZGVyKSB7Ci0gICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBidWZmZXIgPSBOVUxMOwotCi0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0KLSAgICBidWZmZXItPnNldF9yYW5nZSgwLCBmcmFtZVNpemVXaXRob3V0SGVhZGVyKTsKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgbUN1cnJlbnRUaW1lVXMpOwotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7Ci0KLSAgICBtT2Zmc2V0ICs9IGZyYW1lU2l6ZTsKLSAgICBtQ3VycmVudFRpbWVVcyArPSBtRnJhbWVEdXJhdGlvblVzOwotCi0gICAgKm91dCA9IGJ1ZmZlcjsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLWJvb2wgU25pZmZBQUMoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgc3A8QU1lc3NhZ2U+ICptZXRhKSB7Ci0gICAgb2ZmNjRfdCBwb3MgPSAwOwotCi0gICAgZm9yICg7OykgewotICAgICAgICB1aW50OF90IGlkM2hlYWRlclsxMF07Ci0gICAgICAgIGlmIChzb3VyY2UtPnJlYWRBdChwb3MsIGlkM2hlYWRlciwgc2l6ZW9mKGlkM2hlYWRlcikpCi0gICAgICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YoaWQzaGVhZGVyKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1lbWNtcCgiSUQzIiwgaWQzaGVhZGVyLCAzKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTa2lwIHRoZSBJRDN2MiBoZWFkZXIuCi0KLSAgICAgICAgc2l6ZV90IGxlbiA9Ci0gICAgICAgICAgICAoKGlkM2hlYWRlcls2XSAmIDB4N2YpIDw8IDIxKQotICAgICAgICAgICAgfCAoKGlkM2hlYWRlcls3XSAmIDB4N2YpIDw8IDE0KQotICAgICAgICAgICAgfCAoKGlkM2hlYWRlcls4XSAmIDB4N2YpIDw8IDcpCi0gICAgICAgICAgICB8IChpZDNoZWFkZXJbOV0gJiAweDdmKTsKLQotICAgICAgICBsZW4gKz0gMTA7Ci0KLSAgICAgICAgcG9zICs9IGxlbjsKLQotICAgICAgICBBTE9HVigic2tpcHBlZCBJRDMgdGFnLCBuZXcgc3RhcnRpbmcgb2Zmc2V0IGlzICVsbGQgKDB4JTAxNmxseCkiLAotICAgICAgICAgICAgICAgIChsb25nIGxvbmcpcG9zLCAobG9uZyBsb25nKXBvcyk7Ci0gICAgfQotCi0gICAgdWludDhfdCBoZWFkZXJbMl07Ci0KLSAgICBpZiAoc291cmNlLT5yZWFkQXQocG9zLCAmaGVhZGVyLCAyKSAhPSAyKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBBRFRTIHN5bmN3b3JkCi0gICAgaWYgKChoZWFkZXJbMF0gPT0gMHhmZikgJiYgKChoZWFkZXJbMV0gJiAweGY2KSA9PSAweGYwKSkgewotICAgICAgICAqbWltZVR5cGUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUUzsKLSAgICAgICAgKmNvbmZpZGVuY2UgPSAwLjI7Ci0KLSAgICAgICAgKm1ldGEgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICgqbWV0YSktPnNldEludDY0KCJvZmZzZXQiLCBwb3MpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FBQ1dyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNXcml0ZXIuY3BwCmluZGV4IDhiMWUxYzMuLjJlYTVmY2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FBQ1dyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmNwcApAQCAtMzAsOCArMzAsOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTY3LDcgKzY3LDcgQEAKIH0KIAogCi1zdGF0dXNfdCBBQUNXcml0ZXI6OmFkZFNvdXJjZShjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKK3N0YXR1c190IEFBQ1dyaXRlcjo6YWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CiAgICAgfQpAQCAtMjk0LDcgKzI5NCw3IEBACiAgICAgcHJjdGwoUFJfU0VUX05BTUUsICh1bnNpZ25lZCBsb25nKSJBQUNXcml0ZXJUaHJlYWQiLCAwLCAwLCAwKTsKIAogICAgIHdoaWxlICghbURvbmUgJiYgZXJyID09IE9LKSB7Ci0gICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXI7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOwogICAgICAgICBlcnIgPSBtU291cmNlLT5yZWFkKCZidWZmZXIpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTMxNiw3ICszMTYsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaW50MzJfdCBpc0NvZGVjU3BlY2lmaWMgPSAwOwotICAgICAgICBpZiAoYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDMyKGtLZXlJc0NvZGVjQ29uZmlnLCAmaXNDb2RlY1NwZWNpZmljKSAmJiBpc0NvZGVjU3BlY2lmaWMpIHsKKyAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlJc0NvZGVjQ29uZmlnLCAmaXNDb2RlY1NwZWNpZmljKSAmJiBpc0NvZGVjU3BlY2lmaWMpIHsKICAgICAgICAgICAgIEFMT0dWKCJEcm9wIGNvZGVjIHNwZWNpZmljIGluZm8gYnVmZmVyIik7CiAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CkBAIC0zMjQsNyArMzI0LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXM7Ci0gICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVzdGFtcFVzKSk7CisgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCkuZmluZEludDY0KGtLZXlUaW1lLCAmdGltZXN0YW1wVXMpKTsKICAgICAgICAgaWYgKHRpbWVzdGFtcFVzID4gbUVzdGltYXRlZER1cmF0aW9uVXMpIHsKICAgICAgICAgICAgIG1Fc3RpbWF0ZWREdXJhdGlvblVzID0gdGltZXN0YW1wVXM7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCmluZGV4IGEyZWI5YTguLjJhYmVhOWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcApAQCAtMjgsOCArMjgsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmg+CiAKLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+Ci0KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC0zOCwxMiArMzcsMTIgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0J1ZmZlclByb2R1Y2VyV3JhcHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1BlcnNpc3RlbnRTdXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUJ1ZmZlckhvbGRlci5oPgogI2luY2x1ZGUgPG1lZGlhL09NWEJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL29teC8xLjAvV09teE5vZGUuaD4KIApAQCAtNTUsNyArNTQsNiBAQAogI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0luZGV4RXh0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfQXNTdHJpbmcuaD4KIAotI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9BQ29kZWNCdWZmZXJDaGFubmVsLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9EYXRhQ29udmVydGVyLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9TZWN1cmVCdWZmZXIuaCIKQEAgLTEyNyw2ICsxMjUsMzIgQEAKICAgICB9CiB9CiAKK3N0YXRpYyBPTVhfVklERU9fQ09OVFJPTFJBVEVUWVBFIGdldFZpZGVvQml0cmF0ZU1vZGUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpbnQzMl90IHRtcDsKKyAgICBpZiAobXNnLT5maW5kSW50MzIoImJpdHJhdGUtbW9kZSIsICZ0bXApKSB7CisgICAgICAgIC8vIGV4cGxpY2l0bHkgdHJhbnNsYXRlIGZyb20gTWVkaWFDb2RlY0luZm8uRW5jb2RlckNhcGFiaWxpdGllcy4KKyAgICAgICAgLy8gQklUUkFURV9NT0RFXyogaW50byBPTVggYml0cmF0ZSBtb2RlLgorICAgICAgICBzd2l0Y2ggKHRtcCkgeworICAgICAgICAgICAgLy9CSVRSQVRFX01PREVfQ1EKKyAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIE9NWF9WaWRlb19Db250cm9sUmF0ZUNvbnN0YW50UXVhbGl0eTsKKyAgICAgICAgICAgIC8vQklUUkFURV9NT0RFX1ZCUgorICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gT01YX1ZpZGVvX0NvbnRyb2xSYXRlVmFyaWFibGU7CisgICAgICAgICAgICAvL0JJVFJBVEVfTU9ERV9DQlIKKyAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIE9NWF9WaWRlb19Db250cm9sUmF0ZUNvbnN0YW50OworICAgICAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9NWF9WaWRlb19Db250cm9sUmF0ZVZhcmlhYmxlOworfQorCitzdGF0aWMgYm9vbCBmaW5kVmlkZW9CaXRyYXRlQ29udHJvbEluZm8oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csCisgICAgICAgIE9NWF9WSURFT19DT05UUk9MUkFURVRZUEUgKm1vZGUsIGludDMyX3QgKmJpdHJhdGUsIGludDMyX3QgKnF1YWxpdHkpIHsKKyAgICAqbW9kZSA9IGdldFZpZGVvQml0cmF0ZU1vZGUobXNnKTsKKyAgICBib29sIGlzQ1EgPSAoKm1vZGUgPT0gT01YX1ZpZGVvX0NvbnRyb2xSYXRlQ29uc3RhbnRRdWFsaXR5KTsKKyAgICByZXR1cm4gKCFpc0NRICYmIG1zZy0+ZmluZEludDMyKCJiaXRyYXRlIiwgYml0cmF0ZSkpCisgICAgICAgICB8fCAoaXNDUSAmJiBtc2ctPmZpbmRJbnQzMigicXVhbGl0eSIsIHF1YWxpdHkpKTsKK30KKwogc3RydWN0IE1lc3NhZ2VMaXN0IDogcHVibGljIFJlZkJhc2UgewogICAgIE1lc3NhZ2VMaXN0KCkgewogICAgIH0KQEAgLTUyOCw2ICs1NTIsNyBAQAogICAgICAgbU5hdGl2ZVdpbmRvd1VzYWdlQml0cygwKSwKICAgICAgIG1MYXN0TmF0aXZlV2luZG93RGF0YVNwYWNlKEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiksCiAgICAgICBtSXNWaWRlbyhmYWxzZSksCisgICAgICBtSXNJbWFnZShmYWxzZSksCiAgICAgICBtSXNFbmNvZGVyKGZhbHNlKSwKICAgICAgIG1GYXRhbEVycm9yKGZhbHNlKSwKICAgICAgIG1TaHV0ZG93bkluUHJvZ3Jlc3MoZmFsc2UpLApAQCAtNTUzLDYgKzU3OCw4IEBACiAgICAgICBtRGVzY3JpYmVIRFJTdGF0aWNJbmZvSW5kZXgoKE9NWF9JTkRFWFRZUEUpMCksCiAgICAgICBtU3RhdGVHZW5lcmF0aW9uKDApLAogICAgICAgbVZlbmRvckV4dGVuc2lvbnNTdGF0dXMoa0V4dGVuc2lvbnNVbmNoZWNrZWQpIHsKKyAgICBtZW1zZXQoJm1MYXN0SERSU3RhdGljSW5mbywgMCwgc2l6ZW9mKG1MYXN0SERSU3RhdGljSW5mbykpOworCiAgICAgbVVuaW5pdGlhbGl6ZWRTdGF0ZSA9IG5ldyBVbmluaXRpYWxpemVkU3RhdGUodGhpcyk7CiAgICAgbUxvYWRlZFN0YXRlID0gbmV3IExvYWRlZFN0YXRlKHRoaXMpOwogICAgIG1Mb2FkZWRUb0lkbGVTdGF0ZSA9IG5ldyBMb2FkZWRUb0lkbGVTdGF0ZSh0aGlzKTsKQEAgLTU3NSw4ICs2MDIsNiBAQAogICAgIG1lbXNldCgmbUxhc3ROYXRpdmVXaW5kb3dDcm9wLCAwLCBzaXplb2YobUxhc3ROYXRpdmVXaW5kb3dDcm9wKSk7CiAKICAgICBjaGFuZ2VTdGF0ZShtVW5pbml0aWFsaXplZFN0YXRlKTsKLQotICAgIG1UcmVibGVGbGFnID0gZmFsc2U7CiB9CiAKIEFDb2RlYzo6fkFDb2RlYygpIHsKQEAgLTgyOCwxMSArODUzLDcgQEAKIHN0YXR1c190IEFDb2RlYzo6YWxsb2NhdGVCdWZmZXJzT25Qb3J0KE9NWF9VMzIgcG9ydEluZGV4KSB7CiAgICAgQ0hFQ0socG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCB8fCBwb3J0SW5kZXggPT0ga1BvcnRJbmRleE91dHB1dCk7CiAKLSAgICBpZiAoZ2V0VHJlYmxlRmxhZygpKSB7Ci0gICAgICAgIENIRUNLKG1BbGxvY2F0b3JbcG9ydEluZGV4XSA9PSBOVUxMKTsKLSAgICB9IGVsc2UgewotICAgICAgICBDSEVDSyhtRGVhbGVyW3BvcnRJbmRleF0gPT0gTlVMTCk7Ci0gICAgfQorICAgIENIRUNLKG1BbGxvY2F0b3JbcG9ydEluZGV4XSA9PSBOVUxMKTsKICAgICBDSEVDSyhtQnVmZmVyc1twb3J0SW5kZXhdLmlzRW1wdHkoKSk7CiAKICAgICBzdGF0dXNfdCBlcnI7CkBAIC04NzQsNyArODk1LDEwIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzaXplX3QgYWxpZ25tZW50ID0gTWVtb3J5RGVhbGVyOjpnZXRBbGxvY2F0aW9uQWxpZ25tZW50KCk7CisgICAgICAgICAgICBzaXplX3QgYWxpZ25tZW50ID0gMzI7IC8vIFRoaXMgaXMgdGhlIHZhbHVlIGN1cnJlbnRseSByZXR1cm5lZCBieQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNZW1vcnlEZWFsZXI6OmdldEFsbG9jYXRpb25BbGlnbm1lbnQoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogRml4IHRoaXMgd2hlbiBUcmVibGUgaGFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1lbW9yeUhlYXAvTWVtb3J5RGVhbGVyLgogCiAgICAgICAgICAgICBBTE9HVigiWyVzXSBBbGxvY2F0aW5nICV1IGJ1ZmZlcnMgb2Ygc2l6ZSAlenUgKGZyb20gJXUgdXNpbmcgJXMpIG9uICVzIHBvcnQiLAogICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLApAQCAtODk2LDE4ICs5MjAsMTUgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1vZGUgIT0gSU9NWDo6a1BvcnRNb2RlUHJlc2V0U2VjdXJlQnVmZmVyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldFRyZWJsZUZsYWcoKSkgewotICAgICAgICAgICAgICAgICAgICBtQWxsb2NhdG9yW3BvcnRJbmRleF0gPSBUQWxsb2NhdG9yOjpnZXRTZXJ2aWNlKCJhc2htZW0iKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1BbGxvY2F0b3JbcG9ydEluZGV4XSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiaGlkbCBhbGxvY2F0b3Igb24gcG9ydCAlZCBpcyBudWxsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClwb3J0SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNpemVfdCB0b3RhbFNpemUgPSBkZWYubkJ1ZmZlckNvdW50QWN0dWFsICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxpZ25lZFNpemUgKyBhbGlnbmVkQ29udlNpemUpOwotICAgICAgICAgICAgICAgICAgICBtRGVhbGVyW3BvcnRJbmRleF0gPSBuZXcgTWVtb3J5RGVhbGVyKHRvdGFsU2l6ZSwgIkFDb2RlYyIpOworICAgICAgICAgICAgICAgIG1BbGxvY2F0b3JbcG9ydEluZGV4XSA9IFRBbGxvY2F0b3I6OmdldFNlcnZpY2UoImFzaG1lbSIpOworICAgICAgICAgICAgICAgIGlmIChtQWxsb2NhdG9yW3BvcnRJbmRleF0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiaGlkbCBhbGxvY2F0b3Igb24gcG9ydCAlZCBpcyBudWxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXBvcnRJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFRPRE86IFdoZW4gVHJlYmxlIGhhcyBNZW1vcnlIZWFwL01lbW9yeURlYWxlciwgd2Ugc2hvdWxkCisgICAgICAgICAgICAgICAgLy8gc3BlY2lmeSB0aGUgaGVhcCBzaXplIHRvIGJlCisgICAgICAgICAgICAgICAgLy8gZGVmLm5CdWZmZXJDb3VudEFjdHVhbCAqIChhbGlnbmVkU2l6ZSArIGFsaWduZWRDb252U2l6ZSkuCiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0ID0KQEAgLTkzNiwyMyArOTU3LDU1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgU2VjdXJlQnVmZmVyKGZvcm1hdCwgbmF0aXZlX2hhbmRsZSwgYnVmU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIGluZm8ubUNvZGVjRGF0YSA9IGluZm8ubURhdGE7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGdldFRyZWJsZUZsYWcoKSkgeworICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3M7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gdHJhbnNTdGF0dXMgPSBtQWxsb2NhdG9yW3BvcnRJbmRleF0tPmFsbG9jYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZlNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZzdWNjZXNzLCAmaGlkbE1lbVRva2VuXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfbWVtb3J5IGNvbnN0JiBtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsTWVtVG9rZW4gPSBtOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiaGlkbCdzIEFzaG1lbUFsbG9jYXRvciBmYWlsZWQgYXQgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1N0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaGlkbE1lbSA9IG1hcE1lbW9yeShoaWRsTWVtVG9rZW4pOworICAgICAgICAgICAgICAgICAgICBpZiAoaGlkbE1lbSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVyciA9IG1PTVhOb2RlLT51c2VCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydEluZGV4LCBoaWRsTWVtVG9rZW4sICZpbmZvLm1CdWZmZXJJRCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUgPT0gSU9NWDo6a1BvcnRNb2RlRHluYW1pY0FOV0J1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9OYXRpdmVNZXRhZGF0YSogbWV0YURhdGEgPSAoVmlkZW9OYXRpdmVNZXRhZGF0YSopKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopaGlkbE1lbS0+Z2V0UG9pbnRlcigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhLT5uRmVuY2VGZCA9IC0xOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaW5mby5tQ29kZWNEYXRhID0gbmV3IFNoYXJlZE1lbW9yeUJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGhpZGxNZW0pOworICAgICAgICAgICAgICAgICAgICBpbmZvLm1Db2RlY1JlZiA9IGhpZGxNZW07CisKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgcmVxdWlyZSBjb252ZXJzaW9uLCBhbGxvY2F0ZSBjb252ZXJzaW9uIGJ1ZmZlciBmb3IgY2xpZW50IHVzZTsKKyAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCByZXVzZSBjb2RlYyBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Db252ZXJ0ZXJbcG9ydEluZGV4XSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19HVChjb252ZXJzaW9uQnVmZmVyU2l6ZSwgKHNpemVfdCkwKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VzczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gdHJhbnNTdGF0dXMgPSBtQWxsb2NhdG9yW3BvcnRJbmRleF0tPmFsbG9jYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgbUFsbG9jYXRvcltwb3J0SW5kZXhdLT5hbGxvY2F0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbkJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmc3VjY2VzcywgJmhpZGxNZW1Ub2tlbl0oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfbWVtb3J5IGNvbnN0JiBtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxNZW1Ub2tlbiA9IG07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJoaWRsJ3MgQXNobWVtQWxsb2NhdG9yIGZhaWxlZCBhdCB0aGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydDogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNTdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTk2MCw2NyArMTAxMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGlkbE1lbSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IG1PTVhOb2RlLT51c2VCdWZmZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRJbmRleCwgaGlkbE1lbVRva2VuLCAmaW5mby5tQnVmZmVySUQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVtID0gbURlYWxlcltwb3J0SW5kZXhdLT5hbGxvY2F0ZShidWZTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZW0gPT0gTlVMTCB8fCBtZW0tPnBvaW50ZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gbU9NWE5vZGUtPnVzZUJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydEluZGV4LCBtZW0sICZpbmZvLm1CdWZmZXJJRCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAobW9kZSA9PSBJT01YOjprUG9ydE1vZGVEeW5hbWljQU5XQnVmZmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBWaWRlb05hdGl2ZU1ldGFkYXRhKiBtZXRhRGF0YSA9IChWaWRlb05hdGl2ZU1ldGFkYXRhKikoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRyZWJsZUZsYWcoKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiloaWRsTWVtLT5nZXRQb2ludGVyKCkgOiBtZW0tPnBvaW50ZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YS0+bkZlbmNlRmQgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChnZXRUcmVibGVGbGFnKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ubUNvZGVjRGF0YSA9IG5ldyBTaGFyZWRNZW1vcnlCdWZmZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgaGlkbE1lbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLm1Db2RlY1JlZiA9IGhpZGxNZW07Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLm1Db2RlY0RhdGEgPSBuZXcgU2hhcmVkTWVtb3J5QnVmZmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIG1lbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLm1Db2RlY1JlZiA9IG1lbTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIHJlcXVpcmUgY29udmVyc2lvbiwgYWxsb2NhdGUgY29udmVyc2lvbiBidWZmZXIgZm9yIGNsaWVudCB1c2U7Ci0gICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgcmV1c2UgY29kZWMgYnVmZmVyCi0gICAgICAgICAgICAgICAgICAgIGlmIChtQ29udmVydGVyW3BvcnRJbmRleF0gIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfR1QoY29udmVyc2lvbkJ1ZmZlclNpemUsIChzaXplX3QpMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0VHJlYmxlRmxhZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbGxvY2F0b3JbcG9ydEluZGV4XS0+YWxsb2NhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmc3VjY2VzcywgJmhpZGxNZW1Ub2tlbl0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF9tZW1vcnkgY29uc3QmIG0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsTWVtVG9rZW4gPSBtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxNZW0gPSBtYXBNZW1vcnkoaGlkbE1lbVRva2VuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGlkbE1lbSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ubURhdGEgPSBuZXcgU2hhcmVkTWVtb3J5QnVmZmVyKGZvcm1hdCwgaGlkbE1lbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5tTWVtUmVmID0gaGlkbE1lbTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtID0gbURlYWxlcltwb3J0SW5kZXhdLT5hbGxvY2F0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25CdWZmZXJTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVtID09IE5VTEx8fCBtZW0tPnBvaW50ZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ubURhdGEgPSBuZXcgU2hhcmVkTWVtb3J5QnVmZmVyKGZvcm1hdCwgbWVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLm1NZW1SZWYgPSBtZW07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLm1EYXRhID0gbmV3IFNoYXJlZE1lbW9yeUJ1ZmZlcihmb3JtYXQsIGhpZGxNZW0pOworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5tTWVtUmVmID0gaGlkbE1lbTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ubURhdGEgPSBpbmZvLm1Db2RlY0RhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLm1NZW1SZWYgPSBpbmZvLm1Db2RlY1JlZjsKQEAgLTE1ODEsMTEgKzE1NzUsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGdldFRyZWJsZUZsYWcoKSkgewotICAgICAgICBtQWxsb2NhdG9yW3BvcnRJbmRleF0uY2xlYXIoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtRGVhbGVyW3BvcnRJbmRleF0uY2xlYXIoKTsKLSAgICB9CisgICAgbUFsbG9jYXRvcltwb3J0SW5kZXhdLmNsZWFyKCk7CiAgICAgcmV0dXJuIGVycjsKIH0KIApAQCAtMTcyMiw2ICsxNzEyLDggQEAKICAgICBtQ29uZmlnRm9ybWF0ID0gbXNnOwogCiAgICAgbUlzRW5jb2RlciA9IGVuY29kZXI7CisgICAgbUlzVmlkZW8gPSAhc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpOworICAgIG1Jc0ltYWdlID0gIXN0cm5jYXNlY21wKG1pbWUsICJpbWFnZS8iLCA2KTsKIAogICAgIG1Qb3J0TW9kZVtrUG9ydEluZGV4SW5wdXRdID0gSU9NWDo6a1BvcnRNb2RlUHJlc2V0Qnl0ZUJ1ZmZlcjsKICAgICBtUG9ydE1vZGVba1BvcnRJbmRleE91dHB1dF0gPSBJT01YOjprUG9ydE1vZGVQcmVzZXRCeXRlQnVmZmVyOwpAQCAtMTczMiwxOSArMTcyNCwyNyBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIGludDMyX3QgYml0UmF0ZSA9IDA7Ci0gICAgLy8gRkxBQyBlbmNvZGVyIGRvZXNuJ3QgbmVlZCBhIGJpdHJhdGUsIG90aGVyIGVuY29kZXJzIGRvCi0gICAgaWYgKGVuY29kZXIgJiYgc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKQotICAgICAgICAgICAgJiYgIW1zZy0+ZmluZEludDMyKCJiaXRyYXRlIiwgJmJpdFJhdGUpKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBPTVhfVklERU9fQ09OVFJPTFJBVEVUWVBFIGJpdHJhdGVNb2RlOworICAgIGludDMyX3QgYml0cmF0ZSA9IDAsIHF1YWxpdHk7CisgICAgLy8gRkxBQyBlbmNvZGVyIG9yIHZpZGVvIGVuY29kZXIgaW4gY29uc3RhbnQgcXVhbGl0eSBtb2RlIGRvZXNuJ3QgbmVlZCBhCisgICAgLy8gYml0cmF0ZSwgb3RoZXIgZW5jb2RlcnMgZG8uCisgICAgaWYgKGVuY29kZXIpIHsKKyAgICAgICAgaWYgKG1Jc1ZpZGVvIHx8IG1Jc0ltYWdlKSB7CisgICAgICAgICAgICBpZiAoIWZpbmRWaWRlb0JpdHJhdGVDb250cm9sSW5mbyhtc2csICZiaXRyYXRlTW9kZSwgJmJpdHJhdGUsICZxdWFsaXR5KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpCisgICAgICAgICAgICAmJiAhbXNnLT5maW5kSW50MzIoImJpdHJhdGUiLCAmYml0cmF0ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vIHByb3BhZ2F0ZSBiaXRyYXRlIHRvIHRoZSBvdXRwdXQgc28gdGhhdCB0aGUgbXV4ZXIgaGFzIGl0Ci0gICAgaWYgKGVuY29kZXIgJiYgbXNnLT5maW5kSW50MzIoImJpdHJhdGUiLCAmYml0UmF0ZSkpIHsKKyAgICBpZiAoZW5jb2RlciAmJiBtc2ctPmZpbmRJbnQzMigiYml0cmF0ZSIsICZiaXRyYXRlKSkgewogICAgICAgICAvLyBUZWNobmljYWxseSBJU08gc3BlYyBzYXlzIHRoYXQgJ2JpdHJhdGUnIHNob3VsZCBiZSAwIGZvciBWQlIgZXZlbiB0aG91Z2ggaXQgaXMgdGhlCiAgICAgICAgIC8vIGF2ZXJhZ2UgYml0cmF0ZS4gV2UndmUgYmVlbiBzZXR0aW5nIGJvdGggYml0cmF0ZSBhbmQgbWF4LWJpdHJhdGUgdG8gdGhpcyBzYW1lIHZhbHVlLgotICAgICAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKCJiaXRyYXRlIiwgYml0UmF0ZSk7Ci0gICAgICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoIm1heC1iaXRyYXRlIiwgYml0UmF0ZSk7CisgICAgICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoImJpdHJhdGUiLCBiaXRyYXRlKTsKKyAgICAgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigibWF4LWJpdHJhdGUiLCBiaXRyYXRlKTsKICAgICB9CiAKICAgICBpbnQzMl90IHN0b3JlTWV0YTsKQEAgLTE4MDEsOSArMTgwMSw3IEBACiAgICAgLy8gT25seSBlbmFibGUgbWV0YWRhdGEgbW9kZSBvbiBlbmNvZGVyIG91dHB1dCBpZiBlbmNvZGVyIGNhbiBwcmVwZW5kCiAgICAgLy8gc3BzL3BwcyB0byBpZHIgZnJhbWVzLCBzaW5jZSBpbiBtZXRhZGF0YSBtb2RlIHRoZSBiaXRzdHJlYW0gaXMgaW4gYW4KICAgICAvLyBvcGFxdWUgaGFuZGxlLCB0byB3aGljaCB3ZSBkb24ndCBoYXZlIGFjY2Vzcy4KLSAgICBpbnQzMl90IHZpZGVvID0gIXN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby8iLCA2KTsKLSAgICBtSXNWaWRlbyA9IHZpZGVvOwotICAgIGlmIChlbmNvZGVyICYmIHZpZGVvKSB7CisgICAgaWYgKGVuY29kZXIgJiYgbUlzVmlkZW8pIHsKICAgICAgICAgT01YX0JPT0wgZW5hYmxlID0gKE9NWF9CT09MKSAocHJlcGVuZFNQU1BQUwogICAgICAgICAgICAgJiYgbXNnLT5maW5kSW50MzIoImFuZHJvaWQuX3N0b3JlLW1ldGFkYXRhLWluLWJ1ZmZlcnMtb3V0cHV0IiwgJnN0b3JlTWV0YSkKICAgICAgICAgICAgICYmIHN0b3JlTWV0YSAhPSAwKTsKQEAgLTE4NDksOSArMTg0Nyw5IEBACiAgICAgLy8gTk9URTogd2Ugb25seSB1c2UgbmF0aXZlIHdpbmRvdyBmb3IgdmlkZW8gZGVjb2RlcnMKICAgICBzcDxSZWZCYXNlPiBvYmo7CiAgICAgYm9vbCBoYXZlTmF0aXZlV2luZG93ID0gbXNnLT5maW5kT2JqZWN0KCJuYXRpdmUtd2luZG93IiwgJm9iaikKLSAgICAgICAgICAgICYmIG9iaiAhPSBOVUxMICYmIHZpZGVvICYmICFlbmNvZGVyOworICAgICAgICAgICAgJiYgb2JqICE9IE5VTEwgJiYgbUlzVmlkZW8gJiYgIWVuY29kZXI7CiAgICAgbVVzaW5nTmF0aXZlV2luZG93ID0gaGF2ZU5hdGl2ZVdpbmRvdzsKLSAgICBpZiAodmlkZW8gJiYgIWVuY29kZXIpIHsKKyAgICBpZiAobUlzVmlkZW8gJiYgIWVuY29kZXIpIHsKICAgICAgICAgaW5wdXRGb3JtYXQtPnNldEludDMyKCJhZGFwdGl2ZS1wbGF5YmFjayIsIGZhbHNlKTsKIAogICAgICAgICBpbnQzMl90IHVzYWdlUHJvdGVjdGVkOwpAQCAtMjAxNCw3ICsyMDEyLDcgQEAKICAgICAodm9pZCltc2ctPmZpbmRJbnQzMigicGNtLWVuY29kaW5nIiwgKGludDMyX3QqKSZwY21FbmNvZGluZyk7CiAgICAgLy8gaW52YWxpZCBlbmNvZGluZ3Mgd2lsbCBkZWZhdWx0IHRvIFBDTS0xNmJpdCBpbiBzZXR1cFJhd0F1ZGlvRm9ybWF0LgogCi0gICAgaWYgKHZpZGVvKSB7CisgICAgaWYgKG1Jc1ZpZGVvIHx8IG1Jc0ltYWdlKSB7CiAgICAgICAgIC8vIGRldGVybWluZSBuZWVkIGZvciBzb2Z0d2FyZSByZW5kZXJlcgogICAgICAgICBib29sIHVzaW5nU3dSZW5kZXJlciA9IGZhbHNlOwogICAgICAgICBpZiAoaGF2ZU5hdGl2ZVdpbmRvdyAmJiBtQ29tcG9uZW50TmFtZS5zdGFydHNXaXRoKCJPTVguZ29vZ2xlLiIpKSB7CkBAIC0yMTQ2LDE2ICsyMTQ0LDIwIEBACiAgICAgICAgICAgICAgICAgLy8gdmFsdWUgaXMgdW5rbm93bgogICAgICAgICAgICAgICAgIGRyYy50YXJnZXRSZWZMZXZlbCA9IC0xOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYWFjLWRyYy1lZmZlY3QtdHlwZSIsICZkcmMuZWZmZWN0VHlwZSkpIHsKKyAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpcyB1bmtub3duCisgICAgICAgICAgICAgICAgZHJjLmVmZmVjdFR5cGUgPSAtMjsgLy8gdmFsaWQgdmFsdWVzIGFyZSAtMSBhbmQgb3ZlcgorICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBlcnIgPSBzZXR1cEFBQ0NvZGVjKAotICAgICAgICAgICAgICAgICAgICBlbmNvZGVyLCBudW1DaGFubmVscywgc2FtcGxlUmF0ZSwgYml0UmF0ZSwgYWFjUHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlciwgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGUsIGJpdHJhdGUsIGFhY1Byb2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgIGlzQURUUyAhPSAwLCBzYnJNb2RlLCBtYXhPdXRwdXRDaGFubmVsQ291bnQsIGRyYywKICAgICAgICAgICAgICAgICAgICAgcGNtTGltaXRlckVuYWJsZSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQikpIHsKLSAgICAgICAgZXJyID0gc2V0dXBBTVJDb2RlYyhlbmNvZGVyLCBmYWxzZSAvKiBpc1dBTVIgKi8sIGJpdFJhdGUpOworICAgICAgICBlcnIgPSBzZXR1cEFNUkNvZGVjKGVuY29kZXIsIGZhbHNlIC8qIGlzV0FNUiAqLywgYml0cmF0ZSk7CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IpKSB7Ci0gICAgICAgIGVyciA9IHNldHVwQU1SQ29kZWMoZW5jb2RlciwgdHJ1ZSAvKiBpc1dBTVIgKi8sIGJpdFJhdGUpOworICAgICAgICBlcnIgPSBzZXR1cEFNUkNvZGVjKGVuY29kZXIsIHRydWUgLyogaXNXQU1SICovLCBiaXRyYXRlKTsKICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVykKICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVykpIHsKICAgICAgICAgLy8gVGhlc2UgYXJlIFBDTS1saWtlIGZvcm1hdHMgd2l0aCBhIGZpeGVkIHNhbXBsZSByYXRlIGJ1dApAQCAtMjI2OSw3ICsyMjcxLDcgQEAKICAgICAgICAgcmF0ZUZsb2F0ID0gKGZsb2F0KXJhdGVJbnQ7ICAvLyAxNk1IeiAoRkxJTlRNQVgpIGlzIE9LIGZvciB1cHBlciBib3VuZC4KICAgICB9CiAgICAgaWYgKHJhdGVGbG9hdCA+IDApIHsKLSAgICAgICAgZXJyID0gc2V0T3BlcmF0aW5nUmF0ZShyYXRlRmxvYXQsIHZpZGVvKTsKKyAgICAgICAgZXJyID0gc2V0T3BlcmF0aW5nUmF0ZShyYXRlRmxvYXQsIG1Jc1ZpZGVvKTsKICAgICAgICAgZXJyID0gT0s7IC8vIGlnbm9yZSBlcnJvcnMKICAgICB9CiAKQEAgLTIyOTQsNyArMjI5Niw3IEBACiAgICAgfQogCiAgICAgLy8gY3JlYXRlIGRhdGEgY29udmVydGVycyBpZiBuZWVkZWQKLSAgICBpZiAoIXZpZGVvICYmIGVyciA9PSBPSykgeworICAgIGlmICghbUlzVmlkZW8gJiYgIW1Jc0ltYWdlICYmIGVyciA9PSBPSykgewogICAgICAgICBBdWRpb0VuY29kaW5nIGNvZGVjUGNtRW5jb2RpbmcgPSBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0OwogICAgICAgICBpZiAoZW5jb2RlcikgewogICAgICAgICAgICAgKHZvaWQpbUlucHV0Rm9ybWF0LT5maW5kSW50MzIoInBjbS1lbmNvZGluZyIsIChpbnQzMl90KikmY29kZWNQY21FbmNvZGluZyk7CkBAIC0yNzgwLDcgKzI3ODIsNyBAQAogICAgICAgICAgICAgPyBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TVA0QURUUwogICAgICAgICAgICAgOiBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TVA0RkY7CiAKLSAgICBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9BQUNQUkVTRU5UQVRJT05UWVBFIHByZXNlbnRhdGlvbjsKKyAgICBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9BQUNEUkNQUkVTRU5UQVRJT05UWVBFIHByZXNlbnRhdGlvbjsKICAgICBJbml0T01YUGFyYW1zKCZwcmVzZW50YXRpb24pOwogICAgIHByZXNlbnRhdGlvbi5uTWF4T3V0cHV0Q2hhbm5lbHMgPSBtYXhPdXRwdXRDaGFubmVsQ291bnQ7CiAgICAgcHJlc2VudGF0aW9uLm5EcmNDdXQgPSBkcmMuZHJjQ3V0OwpAQCAtMjc4OSwxNCArMjc5MSwyOSBAQAogICAgIHByZXNlbnRhdGlvbi5uVGFyZ2V0UmVmZXJlbmNlTGV2ZWwgPSBkcmMudGFyZ2V0UmVmTGV2ZWw7CiAgICAgcHJlc2VudGF0aW9uLm5FbmNvZGVkVGFyZ2V0TGV2ZWwgPSBkcmMuZW5jb2RlZFRhcmdldExldmVsOwogICAgIHByZXNlbnRhdGlvbi5uUENNTGltaXRlckVuYWJsZSA9IHBjbUxpbWl0ZXJFbmFibGU7CisgICAgcHJlc2VudGF0aW9uLm5EcmNFZmZlY3RUeXBlID0gZHJjLmVmZmVjdFR5cGU7CiAKICAgICBzdGF0dXNfdCByZXMgPSBtT01YTm9kZS0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgT01YX0luZGV4UGFyYW1BdWRpb0FhYywgJnByb2ZpbGUsIHNpemVvZihwcm9maWxlKSk7CiAgICAgaWYgKHJlcyA9PSBPSykgewogICAgICAgICAvLyBvcHRpb25hbCBwYXJhbWV0ZXJzLCB3aWxsIG5vdCBjYXVzZSBjb25maWd1cmF0aW9uIGZhaWx1cmUKLSAgICAgICAgbU9NWE5vZGUtPnNldFBhcmFtZXRlcigKKyAgICAgICAgaWYgKG1PTVhOb2RlLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRBYWNEcmNQcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgJnByZXNlbnRhdGlvbiwgc2l6ZW9mKHByZXNlbnRhdGlvbikpID09IEVSUk9SX1VOU1VQUE9SVEVEKSB7CisgICAgICAgICAgICAvLyBwcmlvciB0byA5LjAgd2UgdXNlZCBhIGRpZmZlcmVudCBjb25maWcgc3RydWN0dXJlIGFuZCBpbmRleAorICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FORFJPSURfQUFDUFJFU0VOVEFUSU9OVFlQRSBwcmVzZW50YXRpb244OworICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmcHJlc2VudGF0aW9uOCk7CisgICAgICAgICAgICBwcmVzZW50YXRpb244Lm5NYXhPdXRwdXRDaGFubmVscyA9IHByZXNlbnRhdGlvbi5uTWF4T3V0cHV0Q2hhbm5lbHM7CisgICAgICAgICAgICBwcmVzZW50YXRpb244Lm5EcmNDdXQgPSBwcmVzZW50YXRpb24ubkRyY0N1dDsKKyAgICAgICAgICAgIHByZXNlbnRhdGlvbjgubkRyY0Jvb3N0ID0gcHJlc2VudGF0aW9uLm5EcmNCb29zdDsKKyAgICAgICAgICAgIHByZXNlbnRhdGlvbjgubkhlYXZ5Q29tcHJlc3Npb24gPSBwcmVzZW50YXRpb24ubkhlYXZ5Q29tcHJlc3Npb247CisgICAgICAgICAgICBwcmVzZW50YXRpb244Lm5UYXJnZXRSZWZlcmVuY2VMZXZlbCA9IHByZXNlbnRhdGlvbi5uVGFyZ2V0UmVmZXJlbmNlTGV2ZWw7CisgICAgICAgICAgICBwcmVzZW50YXRpb244Lm5FbmNvZGVkVGFyZ2V0TGV2ZWwgPSBwcmVzZW50YXRpb24ubkVuY29kZWRUYXJnZXRMZXZlbDsKKyAgICAgICAgICAgIHByZXNlbnRhdGlvbjgublBDTUxpbWl0ZXJFbmFibGUgPSBwcmVzZW50YXRpb24ublBDTUxpbWl0ZXJFbmFibGU7CisgICAgICAgICAgICAodm9pZCltT01YTm9kZS0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkQWFjUHJlc2VudGF0aW9uLAotICAgICAgICAgICAgICAgICZwcmVzZW50YXRpb24sIHNpemVvZihwcmVzZW50YXRpb24pKTsKKyAgICAgICAgICAgICAgICAmcHJlc2VudGF0aW9uOCwgc2l6ZW9mKHByZXNlbnRhdGlvbjgpKTsKKyAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dXKCJkaWQgbm90IHNldCBBdWRpb0FuZHJvaWRBYWNQcmVzZW50YXRpb24gZHVlIHRvIGVycm9yICVkIHdoZW4gc2V0dGluZyBBdWRpb0FhYyIsIHJlcyk7CiAgICAgfQpAQCAtMzIxOSw2ICszMjM2LDcgQEAKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCwgT01YX1ZJREVPX0NvZGluZ1ZQOCB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fVlA5LCBPTVhfVklERU9fQ29kaW5nVlA5IH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04sIE9NWF9WSURFT19Db2RpbmdEb2xieVZpc2lvbiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDLCBPTVhfVklERU9fQ29kaW5nSW1hZ2VIRUlDIH0sCiB9OwogCiBzdGF0aWMgc3RhdHVzX3QgR2V0VmlkZW9Db2RpbmdUeXBlRnJvbU1pbWUoCkBAIC0zMjkyLDYgKzMzMTAsMjIgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKKyAgICBpZiAoY29tcHJlc3Npb25Gb3JtYXQgPT0gT01YX1ZJREVPX0NvZGluZ0hFVkMpIHsKKyAgICAgICAgaW50MzJfdCBwcm9maWxlOworICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoInByb2ZpbGUiLCAmcHJvZmlsZSkpIHsKKyAgICAgICAgICAgIC8vIHZlcmlmeSBpZiBNYWluMTAgcHJvZmlsZSBpcyBzdXBwb3J0ZWQgYXQgYWxsLCBhbmQgZmFpbAorICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHkgaWYgaXQncyBub3Qgc3VwcG9ydGVkLgorICAgICAgICAgICAgaWYgKHByb2ZpbGUgPT0gT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbjEwIHx8CisgICAgICAgICAgICAgICAgcHJvZmlsZSA9PSBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMCkgeworICAgICAgICAgICAgICAgIGVyciA9IHZlcmlmeVN1cHBvcnRGb3JQcm9maWxlQW5kTGV2ZWwoCisgICAgICAgICAgICAgICAgICAgICAgICBrUG9ydEluZGV4SW5wdXQsIHByb2ZpbGUsIDApOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAoY29tcHJlc3Npb25Gb3JtYXQgPT0gT01YX1ZJREVPX0NvZGluZ1ZQOSkgewogICAgICAgICBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSBwYXJhbXM7CiAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7CkBAIC0zNzQ1LDEwICszNzc5LDEyIEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0LCBiaXRyYXRlOworICAgIE9NWF9WSURFT19DT05UUk9MUkFURVRZUEUgYml0cmF0ZU1vZGU7CisgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0LCBiaXRyYXRlID0gMCwgcXVhbGl0eTsKICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkKICAgICAgICAgICAgIHx8ICFtc2ctPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkKLSAgICAgICAgICAgIHx8ICFtc2ctPmZpbmRJbnQzMigiYml0cmF0ZSIsICZiaXRyYXRlKSkgeworICAgICAgICAgICAgfHwgIWZpbmRWaWRlb0JpdHJhdGVDb250cm9sSW5mbygKKyAgICAgICAgICAgICAgICAgICAgbXNnLCAmYml0cmF0ZU1vZGUsICZiaXRyYXRlLCAmcXVhbGl0eSkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIApAQCAtMzc4MSw2ICszODE3LDggQEAKICAgICB9IGVsc2UgewogICAgICAgICBtRnBzID0gKGRvdWJsZSlmcmFtZXJhdGU7CiAgICAgfQorICAgIC8vIHByb3BhZ2F0ZSBmcmFtZXJhdGUgdG8gdGhlIG91dHB1dCBzbyB0aGF0IHRoZSBtdXhlciBoYXMgaXQKKyAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKCJmcmFtZS1yYXRlIiwgKGludDMyX3QpbUZwcyk7CiAKICAgICB2aWRlb19kZWYtPnhGcmFtZXJhdGUgPSAoT01YX1UzMikobUZwcyAqIDY1NTM2KTsKICAgICB2aWRlb19kZWYtPmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7CkBAIC0zODcyLDcgKzM5MTAsOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBPTVhfVklERU9fQ29kaW5nSEVWQzoKLSAgICAgICAgICAgIGVyciA9IHNldHVwSEVWQ0VuY29kZXJQYXJhbWV0ZXJzKG1zZyk7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0NvZGluZ0ltYWdlSEVJQzoKKyAgICAgICAgICAgIGVyciA9IHNldHVwSEVWQ0VuY29kZXJQYXJhbWV0ZXJzKG1zZywgb3V0cHV0Rm9ybWF0KTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgT01YX1ZJREVPX0NvZGluZ1ZQODoKQEAgLTM5OTksMTUgKzQwMzgsNiBAQAogICAgIHJldHVybiByZXQgPiAwID8gcmV0IC0gMSA6IDA7CiB9CiAKLXN0YXRpYyBPTVhfVklERU9fQ09OVFJPTFJBVEVUWVBFIGdldEJpdHJhdGVNb2RlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgaW50MzJfdCB0bXA7Ci0gICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYml0cmF0ZS1tb2RlIiwgJnRtcCkpIHsKLSAgICAgICAgcmV0dXJuIE9NWF9WaWRlb19Db250cm9sUmF0ZVZhcmlhYmxlOwotICAgIH0KLQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxPTVhfVklERU9fQ09OVFJPTFJBVEVUWVBFPih0bXApOwotfQotCiBzdGF0dXNfdCBBQ29kZWM6OnNldHVwTVBFRzRFbmNvZGVyUGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIGludDMyX3QgYml0cmF0ZTsKICAgICBmbG9hdCBpRnJhbWVJbnRlcnZhbDsKQEAgLTQwMTYsNyArNDA0Niw3IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBPTVhfVklERU9fQ09OVFJPTFJBVEVUWVBFIGJpdHJhdGVNb2RlID0gZ2V0Qml0cmF0ZU1vZGUobXNnKTsKKyAgICBPTVhfVklERU9fQ09OVFJPTFJBVEVUWVBFIGJpdHJhdGVNb2RlID0gZ2V0VmlkZW9CaXRyYXRlTW9kZShtc2cpOwogCiAgICAgZmxvYXQgZnJhbWVSYXRlOwogICAgIGlmICghbXNnLT5maW5kRmxvYXQoImZyYW1lLXJhdGUiLCAmZnJhbWVSYXRlKSkgewpAQCAtNDA2NCw3ICs0MDk0LDcgQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogCi0gICAgICAgIGVyciA9IHZlcmlmeVN1cHBvcnRGb3JQcm9maWxlQW5kTGV2ZWwocHJvZmlsZSwgbGV2ZWwpOworICAgICAgICBlcnIgPSB2ZXJpZnlTdXBwb3J0Rm9yUHJvZmlsZUFuZExldmVsKGtQb3J0SW5kZXhPdXRwdXQsIHByb2ZpbGUsIGxldmVsKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwpAQCAtNDA4MSw3ICs0MTExLDcgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICBlcnIgPSBjb25maWd1cmVCaXRyYXRlKGJpdHJhdGUsIGJpdHJhdGVNb2RlKTsKKyAgICBlcnIgPSBjb25maWd1cmVCaXRyYXRlKGJpdHJhdGVNb2RlLCBiaXRyYXRlKTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTQwOTgsNyArNDEyOCw3IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBPTVhfVklERU9fQ09OVFJPTFJBVEVUWVBFIGJpdHJhdGVNb2RlID0gZ2V0Qml0cmF0ZU1vZGUobXNnKTsKKyAgICBPTVhfVklERU9fQ09OVFJPTFJBVEVUWVBFIGJpdHJhdGVNb2RlID0gZ2V0VmlkZW9CaXRyYXRlTW9kZShtc2cpOwogCiAgICAgZmxvYXQgZnJhbWVSYXRlOwogICAgIGlmICghbXNnLT5maW5kRmxvYXQoImZyYW1lLXJhdGUiLCAmZnJhbWVSYXRlKSkgewpAQCAtNDEzNiw3ICs0MTY2LDcgQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogCi0gICAgICAgIGVyciA9IHZlcmlmeVN1cHBvcnRGb3JQcm9maWxlQW5kTGV2ZWwocHJvZmlsZSwgbGV2ZWwpOworICAgICAgICBlcnIgPSB2ZXJpZnlTdXBwb3J0Rm9yUHJvZmlsZUFuZExldmVsKGtQb3J0SW5kZXhPdXRwdXQsIHByb2ZpbGUsIGxldmVsKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwpAQCAtNDE1OCw3ICs0MTg4LDcgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICBlcnIgPSBjb25maWd1cmVCaXRyYXRlKGJpdHJhdGUsIGJpdHJhdGVNb2RlKTsKKyAgICBlcnIgPSBjb25maWd1cmVCaXRyYXRlKGJpdHJhdGVNb2RlLCBiaXRyYXRlKTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTQyMjgsNyArNDI1OCw3IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBPTVhfVklERU9fQ09OVFJPTFJBVEVUWVBFIGJpdHJhdGVNb2RlID0gZ2V0Qml0cmF0ZU1vZGUobXNnKTsKKyAgICBPTVhfVklERU9fQ09OVFJPTFJBVEVUWVBFIGJpdHJhdGVNb2RlID0gZ2V0VmlkZW9CaXRyYXRlTW9kZShtc2cpOwogCiAgICAgZmxvYXQgZnJhbWVSYXRlOwogICAgIGlmICghbXNnLT5maW5kRmxvYXQoImZyYW1lLXJhdGUiLCAmZnJhbWVSYXRlKSkgewpAQCAtNDI3MSw3ICs0MzAxLDcgQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogCi0gICAgICAgIGVyciA9IHZlcmlmeVN1cHBvcnRGb3JQcm9maWxlQW5kTGV2ZWwocHJvZmlsZSwgbGV2ZWwpOworICAgICAgICBlcnIgPSB2ZXJpZnlTdXBwb3J0Rm9yUHJvZmlsZUFuZExldmVsKGtQb3J0SW5kZXhPdXRwdXQsIHByb2ZpbGUsIGxldmVsKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwpAQCAtNDI4NSw3ICs0MzE1LDcgQEAKICAgICAgICAgLy8gVXNlIGxhcmdlc3Qgc3VwcG9ydGVkIHByb2ZpbGUgZm9yIEFWQyByZWNvcmRpbmcgaWYgcHJvZmlsZSBpcyBub3Qgc3BlY2lmaWVkLgogICAgICAgICBmb3IgKE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSBwcm9maWxlIDogewogICAgICAgICAgICAgICAgIE9NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluIH0pIHsKLSAgICAgICAgICAgIGlmICh2ZXJpZnlTdXBwb3J0Rm9yUHJvZmlsZUFuZExldmVsKHByb2ZpbGUsIDApID09IE9LKSB7CisgICAgICAgICAgICBpZiAodmVyaWZ5U3VwcG9ydEZvclByb2ZpbGVBbmRMZXZlbChrUG9ydEluZGV4T3V0cHV0LCBwcm9maWxlLCAwKSA9PSBPSykgewogICAgICAgICAgICAgICAgIGgyNjR0eXBlLmVQcm9maWxlID0gcHJvZmlsZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTQzODQsMjYgKzQ0MTQsNjQgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBjb25maWd1cmVCaXRyYXRlKGJpdHJhdGUsIGJpdHJhdGVNb2RlKTsKKyAgICByZXR1cm4gY29uZmlndXJlQml0cmF0ZShiaXRyYXRlTW9kZSwgYml0cmF0ZSk7CiB9CiAKLXN0YXR1c190IEFDb2RlYzo6c2V0dXBIRVZDRW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBpbnQzMl90IGJpdHJhdGU7Ci0gICAgZmxvYXQgaUZyYW1lSW50ZXJ2YWw7Ci0gICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYml0cmF0ZSIsICZiaXRyYXRlKQotICAgICAgICAgICAgfHwgIW1zZy0+ZmluZEFzRmxvYXQoImktZnJhbWUtaW50ZXJ2YWwiLCAmaUZyYW1lSW50ZXJ2YWwpKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK3N0YXR1c190IEFDb2RlYzo6Y29uZmlndXJlSW1hZ2VHcmlkKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQpIHsKKyAgICBpbnQzMl90IHRpbGVXaWR0aCwgdGlsZUhlaWdodCwgZ3JpZFJvd3MsIGdyaWRDb2xzOworICAgIGlmICghbXNnLT5maW5kSW50MzIoInRpbGUtd2lkdGgiLCAmdGlsZVdpZHRoKSB8fAorICAgICAgICAhbXNnLT5maW5kSW50MzIoInRpbGUtaGVpZ2h0IiwgJnRpbGVIZWlnaHQpIHx8CisgICAgICAgICFtc2ctPmZpbmRJbnQzMigiZ3JpZC1yb3dzIiwgJmdyaWRSb3dzKSB8fAorICAgICAgICAhbXNnLT5maW5kSW50MzIoImdyaWQtY29scyIsICZncmlkQ29scykpIHsKKyAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAotICAgIE9NWF9WSURFT19DT05UUk9MUkFURVRZUEUgYml0cmF0ZU1vZGUgPSBnZXRCaXRyYXRlTW9kZShtc2cpOworICAgIE9NWF9WSURFT19QQVJBTV9BTkRST0lEX0lNQUdFR1JJRFRZUEUgZ3JpZFR5cGU7CisgICAgSW5pdE9NWFBhcmFtcygmZ3JpZFR5cGUpOworICAgIGdyaWRUeXBlLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OworICAgIGdyaWRUeXBlLmJFbmFibGVkID0gT01YX1RSVUU7CisgICAgZ3JpZFR5cGUublRpbGVXaWR0aCA9IHRpbGVXaWR0aDsKKyAgICBncmlkVHlwZS5uVGlsZUhlaWdodCA9IHRpbGVIZWlnaHQ7CisgICAgZ3JpZFR5cGUubkdyaWRSb3dzID0gZ3JpZFJvd3M7CisgICAgZ3JpZFR5cGUubkdyaWRDb2xzID0gZ3JpZENvbHM7CiAKLSAgICBmbG9hdCBmcmFtZVJhdGU7Ci0gICAgaWYgKCFtc2ctPmZpbmRGbG9hdCgiZnJhbWUtcmF0ZSIsICZmcmFtZVJhdGUpKSB7Ci0gICAgICAgIGludDMyX3QgdG1wOwotICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJmcmFtZS1yYXRlIiwgJnRtcCkpIHsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgICAgICBmcmFtZVJhdGUgPSAoZmxvYXQpdG1wOworICAgIHN0YXR1c190IGVyciA9IG1PTVhOb2RlLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbVZpZGVvQW5kcm9pZEltYWdlR3JpZCwKKyAgICAgICAgICAgICZncmlkVHlwZSwgc2l6ZW9mKGdyaWRUeXBlKSk7CisKKyAgICAvLyBmb3IgdmlkZW8gZW5jb2RlcnMsIGdyaWQgY29uZmlnIGlzIG9ubHkgYSBoaW50LgorICAgIGlmICghbUlzSW1hZ2UpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIC8vIGltYWdlIGVuY29kZXJzIG11c3Qgc3VwcG9ydCBncmlkIGNvbmZpZy4KKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgLy8gcXVlcnkgdG8gZ2V0IHRoZSBpbWFnZSBlbmNvZGVyJ3MgcmVhbCBncmlkIGNvbmZpZyBhcyBpdCBtaWdodCBiZQorICAgIC8vIGRpZmZlcmVudCBmcm9tIHRoZSByZXF1ZXN0ZWQsIGFuZCB0cmFuc2ZlciB0aGF0IHRvIHRoZSBvdXRwdXQuCisgICAgZXJyID0gbU9NWE5vZGUtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtVmlkZW9BbmRyb2lkSW1hZ2VHcmlkLAorICAgICAgICAgICAgJmdyaWRUeXBlLCBzaXplb2YoZ3JpZFR5cGUpKTsKKworICAgIGlmIChlcnIgPT0gT0sgJiYgZ3JpZFR5cGUuYkVuYWJsZWQpIHsKKyAgICAgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigidGlsZS13aWR0aCIsIGdyaWRUeXBlLm5UaWxlV2lkdGgpOworICAgICAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKCJ0aWxlLWhlaWdodCIsIGdyaWRUeXBlLm5UaWxlSGVpZ2h0KTsKKyAgICAgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigiZ3JpZC1yb3dzIiwgZ3JpZFR5cGUubkdyaWRSb3dzKTsKKyAgICAgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigiZ3JpZC1jb2xzIiwgZ3JpZFR5cGUubkdyaWRDb2xzKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBBQ29kZWM6OnNldHVwSEVWQ0VuY29kZXJQYXJhbWV0ZXJzKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQpIHsKKyAgICBPTVhfVklERU9fQ09OVFJPTFJBVEVUWVBFIGJpdHJhdGVNb2RlOworICAgIGludDMyX3QgYml0cmF0ZSwgcXVhbGl0eTsKKyAgICBpZiAoIWZpbmRWaWRlb0JpdHJhdGVDb250cm9sSW5mbyhtc2csICZiaXRyYXRlTW9kZSwgJmJpdHJhdGUsICZxdWFsaXR5KSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCiAgICAgT01YX1ZJREVPX1BBUkFNX0hFVkNUWVBFIGhldmNUeXBlOwpAQCAtNDQyNCw3ICs0NDkyLDcgQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogCi0gICAgICAgIGVyciA9IHZlcmlmeVN1cHBvcnRGb3JQcm9maWxlQW5kTGV2ZWwocHJvZmlsZSwgbGV2ZWwpOworICAgICAgICBlcnIgPSB2ZXJpZnlTdXBwb3J0Rm9yUHJvZmlsZUFuZExldmVsKGtQb3J0SW5kZXhPdXRwdXQsIHByb2ZpbGUsIGxldmVsKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQpAQCAtNDQzMyw3ICs0NTAxLDI3IEBACiAgICAgICAgIGhldmNUeXBlLmVMZXZlbCA9IHN0YXRpY19jYXN0PE9NWF9WSURFT19IRVZDTEVWRUxUWVBFPihsZXZlbCk7CiAgICAgfQogICAgIC8vIFRPRE86IGZpbmVyIGNvbnRyb2w/Ci0gICAgaGV2Y1R5cGUubktleUZyYW1lSW50ZXJ2YWwgPSBzZXRQRnJhbWVzU3BhY2luZyhpRnJhbWVJbnRlcnZhbCwgZnJhbWVSYXRlKSArIDE7CisgICAgaWYgKG1Jc0ltYWdlKSB7CisgICAgICAgIGhldmNUeXBlLm5LZXlGcmFtZUludGVydmFsID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBmbG9hdCBpRnJhbWVJbnRlcnZhbDsKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRBc0Zsb2F0KCJpLWZyYW1lLWludGVydmFsIiwgJmlGcmFtZUludGVydmFsKSkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgZnJhbWVSYXRlOworICAgICAgICBpZiAoIW1zZy0+ZmluZEZsb2F0KCJmcmFtZS1yYXRlIiwgJmZyYW1lUmF0ZSkpIHsKKyAgICAgICAgICAgIGludDMyX3QgdG1wOworICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiZnJhbWUtcmF0ZSIsICZ0bXApKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJhbWVSYXRlID0gKGZsb2F0KXRtcDsKKyAgICAgICAgfQorCisgICAgICAgIGhldmNUeXBlLm5LZXlGcmFtZUludGVydmFsID0KKyAgICAgICAgICAgICAgICBzZXRQRnJhbWVzU3BhY2luZyhpRnJhbWVJbnRlcnZhbCwgZnJhbWVSYXRlKSArIDE7CisgICAgfQorCiAKICAgICBlcnIgPSBtT01YTm9kZS0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1WaWRlb0hldmMsICZoZXZjVHlwZSwgc2l6ZW9mKGhldmNUeXBlKSk7CkBAIC00NDQxLDcgKzQ1MjksMTMgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICByZXR1cm4gY29uZmlndXJlQml0cmF0ZShiaXRyYXRlLCBiaXRyYXRlTW9kZSk7CisgICAgZXJyID0gY29uZmlndXJlSW1hZ2VHcmlkKG1zZywgb3V0cHV0Rm9ybWF0KTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICByZXR1cm4gY29uZmlndXJlQml0cmF0ZShiaXRyYXRlTW9kZSwgYml0cmF0ZSwgcXVhbGl0eSk7CiB9CiAKIHN0YXR1c190IEFDb2RlYzo6c2V0dXBWUFhFbmNvZGVyUGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQpIHsKQEAgLTQ0NjIsNyArNDU1Niw3IEBACiAgICAgfQogICAgIG1zZy0+ZmluZEFzRmxvYXQoImktZnJhbWUtaW50ZXJ2YWwiLCAmaUZyYW1lSW50ZXJ2YWwpOwogCi0gICAgT01YX1ZJREVPX0NPTlRST0xSQVRFVFlQRSBiaXRyYXRlTW9kZSA9IGdldEJpdHJhdGVNb2RlKG1zZyk7CisgICAgT01YX1ZJREVPX0NPTlRST0xSQVRFVFlQRSBiaXRyYXRlTW9kZSA9IGdldFZpZGVvQml0cmF0ZU1vZGUobXNnKTsKIAogICAgIGZsb2F0IGZyYW1lUmF0ZTsKICAgICBpZiAoIW1zZy0+ZmluZEZsb2F0KCJmcmFtZS1yYXRlIiwgJmZyYW1lUmF0ZSkpIHsKQEAgLTQ1MzksMTQgKzQ2MzMsMTQgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBjb25maWd1cmVCaXRyYXRlKGJpdHJhdGUsIGJpdHJhdGVNb2RlKTsKKyAgICByZXR1cm4gY29uZmlndXJlQml0cmF0ZShiaXRyYXRlTW9kZSwgYml0cmF0ZSk7CiB9CiAKIHN0YXR1c190IEFDb2RlYzo6dmVyaWZ5U3VwcG9ydEZvclByb2ZpbGVBbmRMZXZlbCgKLSAgICAgICAgaW50MzJfdCBwcm9maWxlLCBpbnQzMl90IGxldmVsKSB7CisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBpbnQzMl90IHByb2ZpbGUsIGludDMyX3QgbGV2ZWwpIHsKICAgICBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSBwYXJhbXM7CiAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW1zKTsKLSAgICBwYXJhbXMublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7CisgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CiAKICAgICBmb3IgKE9NWF9VMzIgaW5kZXggPSAwOyBpbmRleCA8PSBrTWF4SW5kaWNlc1RvQ2hlY2s7ICsraW5kZXgpIHsKICAgICAgICAgcGFyYW1zLm5Qcm9maWxlSW5kZXggPSBpbmRleDsKQEAgLTQ1NzUsNyArNDY2OSw3IEBACiB9CiAKIHN0YXR1c190IEFDb2RlYzo6Y29uZmlndXJlQml0cmF0ZSgKLSAgICAgICAgaW50MzJfdCBiaXRyYXRlLCBPTVhfVklERU9fQ09OVFJPTFJBVEVUWVBFIGJpdHJhdGVNb2RlKSB7CisgICAgICAgIE9NWF9WSURFT19DT05UUk9MUkFURVRZUEUgYml0cmF0ZU1vZGUsIGludDMyX3QgYml0cmF0ZSwgaW50MzJfdCBxdWFsaXR5KSB7CiAgICAgT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFIGJpdHJhdGVUeXBlOwogICAgIEluaXRPTVhQYXJhbXMoJmJpdHJhdGVUeXBlKTsKICAgICBiaXRyYXRlVHlwZS5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKQEAgLTQ1ODgsNyArNDY4MiwxMyBAQAogICAgIH0KIAogICAgIGJpdHJhdGVUeXBlLmVDb250cm9sUmF0ZSA9IGJpdHJhdGVNb2RlOwotICAgIGJpdHJhdGVUeXBlLm5UYXJnZXRCaXRyYXRlID0gYml0cmF0ZTsKKworICAgIC8vIHdyaXRlIGl0IG91dCBleHBsaWNpdGx5IGV2ZW4gaWYgaXQncyBhIHVuaW9uCisgICAgaWYgKGJpdHJhdGVNb2RlID09IE9NWF9WaWRlb19Db250cm9sUmF0ZUNvbnN0YW50UXVhbGl0eSkgeworICAgICAgICBiaXRyYXRlVHlwZS5uUXVhbGl0eUZhY3RvciA9IHF1YWxpdHk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYml0cmF0ZVR5cGUublRhcmdldEJpdHJhdGUgPSBiaXRyYXRlOworICAgIH0KIAogICAgIHJldHVybiBtT01YTm9kZS0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgT01YX0luZGV4UGFyYW1WaWRlb0JpdHJhdGUsICZiaXRyYXRlVHlwZSwgc2l6ZW9mKGJpdHJhdGVUeXBlKSk7CkBAIC00ODQxLDggKzQ5NDEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubkhlaWdodCA9IHZpZGVvRGVmLT5uRnJhbWVIZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWN0Lm5MZWZ0IDwgMCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QublRvcCA8IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWN0Lm5MZWZ0IDwgMCB8fCByZWN0Lm5Ub3AgPCAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uV2lkdGggPT0gMCB8fCByZWN0Lm5IZWlnaHQgPT0gMCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubkxlZnQgKyByZWN0Lm5XaWR0aCA+IHZpZGVvRGVmLT5uRnJhbWVXaWR0aCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QublRvcCArIHJlY3QubkhlaWdodCA+IHZpZGVvRGVmLT5uRnJhbWVIZWlnaHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiV3JvbmcgY3JvcHBlZCByZWN0ICglZCwgJWQsICV1LCAldSkgdnMuIGZyYW1lICgldSwgJXUpIiwKQEAgLTQ4NzYsNyArNDk3Niw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpZ2V0SERSU3RhdGljSW5mb0ZvclZpZGVvQ29kZWMoa1BvcnRJbmRleElucHV0LCBub3RpZnkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGF0ZW5jeSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUlzRW5jb2RlciAmJiBnZXRMYXRlbmN5KCZsYXRlbmN5KSA9PSBPSyAmJiBsYXRlbmN5ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc0VuY29kZXIgJiYgIW1Jc0ltYWdlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExhdGVuY3koJmxhdGVuY3kpID09IE9LICYmIGxhdGVuY3kgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigibGF0ZW5jeSIsIGxhdGVuY3kpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CkBAIC00OTMyLDcgKzUwMzMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBtaW1lLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGludHJhUmVmcmVzaFBlcmlvZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtSXNFbmNvZGVyICYmIGdldEludHJhUmVmcmVzaFBlcmlvZCgmaW50cmFSZWZyZXNoUGVyaW9kKSA9PSBPSworICAgICAgICAgICAgICAgICAgICBpZiAobUlzRW5jb2RlciAmJiAhbUlzSW1hZ2UgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbnRyYVJlZnJlc2hQZXJpb2QoJmludHJhUmVmcmVzaFBlcmlvZCkgPT0gT0sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbnRyYVJlZnJlc2hQZXJpb2QgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJpbnRyYS1yZWZyZXNoLXBlcmlvZCIsIGludHJhUmVmcmVzaFBlcmlvZCk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTU2NDEsNyArNTc0Myw3IEBACiAgICAgLy8gYnkgdGhpcyAiTWVkaWFCdWZmZXIiIG9iamVjdC4gTm93IHRoYXQgdGhlIE9NWCBjb21wb25lbnQgaGFzCiAgICAgLy8gdG9sZCB1cyB0aGF0IGl0J3MgZG9uZSB3aXRoIHRoZSBpbnB1dCBidWZmZXIsIHdlIGNhbiBkZWNyZW1lbnQKICAgICAvLyB0aGUgbWVkaWFCdWZmZXIncyByZWZlcmVuY2UgY291bnQuCi0gICAgaW5mby0+bURhdGEtPnNldE1lZGlhQnVmZmVyQmFzZShOVUxMKTsKKyAgICBpbmZvLT5tRGF0YS0+bWV0YSgpLT5zZXRPYmplY3QoIm1lZGlhQnVmZmVySG9sZGVyIiwgc3A8TWVkaWFCdWZmZXJIb2xkZXI+KG51bGxwdHIpKTsKIAogICAgIFBvcnRNb2RlIG1vZGUgPSBnZXRQb3J0TW9kZShrUG9ydEluZGV4SW5wdXQpOwogCkBAIC02MDUyLDcgKzYxNTQsNyBAQAogICAgICAgICAgICAgfQogI2lmIDAKICAgICAgICAgICAgIGlmIChtQ29kZWMtPm1OYXRpdmVXaW5kb3cgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmIChJc0lEUihpbmZvLT5tRGF0YSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoSXNJRFIoaW5mby0+bURhdGEtPmRhdGEoKSwgaW5mby0+bURhdGEtPnNpemUoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0koIklEUiBmcmFtZSIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTYxNDAsNiArNjI0MiwxNCBAQAogICAgICAgICAgICAgbUNvZGVjLT5tTGFzdE5hdGl2ZVdpbmRvd0RhdGFTcGFjZSA9IGRhdGFTcGFjZTsKICAgICAgICAgICAgIEFMT0dXX0lGKGVyciAhPSBOT19FUlJPUiwgImZhaWxlZCB0byBzZXQgZGF0YXNwYWNlOiAlZCIsIGVycik7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGJ1ZmZlci0+Zm9ybWF0KCktPmNvbnRhaW5zKCJoZHItc3RhdGljLWluZm8iKSkgeworICAgICAgICAgICAgSERSU3RhdGljSW5mbyBpbmZvOworICAgICAgICAgICAgaWYgKENvbG9yVXRpbHM6OmdldEhEUlN0YXRpY0luZm9Gcm9tRm9ybWF0KGJ1ZmZlci0+Zm9ybWF0KCksICZpbmZvKQorICAgICAgICAgICAgICAgICYmIG1lbWNtcCgmbUNvZGVjLT5tTGFzdEhEUlN0YXRpY0luZm8sICZpbmZvLCBzaXplb2YoaW5mbykpKSB7CisgICAgICAgICAgICAgICAgc2V0TmF0aXZlV2luZG93SGRyTWV0YWRhdGEobUNvZGVjLT5tTmF0aXZlV2luZG93LmdldCgpLCAmaW5mbyk7CisgICAgICAgICAgICAgICAgbUNvZGVjLT5tTGFzdEhEUlN0YXRpY0luZm8gPSBpbmZvOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKICAgICAgICAgLy8gc2F2ZSBidWZmZXJzIHNlbnQgdG8gdGhlIHN1cmZhY2Ugc28gd2UgY2FuIGdldCByZW5kZXIgdGltZSB3aGVuIHRoZXkgcmV0dXJuCiAgICAgICAgIGludDY0X3QgbWVkaWFUaW1lVXMgPSAtMTsKQEAgLTYyNDksMTMgKzYzNTksOCBAQAogCiAgICAgaWYgKG1EZWF0aE5vdGlmaWVyICE9IE5VTEwpIHsKICAgICAgICAgaWYgKG1Db2RlYy0+bU9NWE5vZGUgIT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKG1Db2RlYy0+Z2V0VHJlYmxlRmxhZygpKSB7Ci0gICAgICAgICAgICAgICAgYXV0byB0T214Tm9kZSA9IG1Db2RlYy0+bU9NWE5vZGUtPmdldEhhbEludGVyZmFjZSgpOwotICAgICAgICAgICAgICAgIHRPbXhOb2RlLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gSUludGVyZmFjZTo6YXNCaW5kZXIobUNvZGVjLT5tT01YTm9kZSk7Ci0gICAgICAgICAgICAgICAgYmluZGVyLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gdE9teE5vZGUgPSBtQ29kZWMtPm1PTVhOb2RlLT5nZXRIYWxJbnRlcmZhY2UoKTsKKyAgICAgICAgICAgIHRPbXhOb2RlLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyKTsKICAgICAgICAgfQogICAgICAgICBtRGVhdGhOb3RpZmllci5jbGVhcigpOwogICAgIH0KQEAgLTYzNDQsMTEyICs2NDQ5LDQ4IEBACiAKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0T01YRGllZCwgbUNvZGVjKTsKIAotICAgIFZlY3RvcjxBU3RyaW5nPiBtYXRjaGluZ0NvZGVjczsKLSAgICBWZWN0b3I8QVN0cmluZz4gb3duZXJzOwotCi0gICAgQVN0cmluZyBtaW1lOworICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoImNvZGVjSW5mbyIsICZvYmopKTsKKyAgICBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IChNZWRpYUNvZGVjSW5mbyAqKW9iai5nZXQoKTsKKyAgICBpZiAoaW5mbyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJVbmV4cGVjdGVkIG51bGxwdHIgZm9yIGNvZGVjIGluZm9ybWF0aW9uIik7CisgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBBU3RyaW5nIG93bmVyID0gKGluZm8tPmdldE93bmVyTmFtZSgpID09IG51bGxwdHIpID8gImRlZmF1bHQiIDogaW5mby0+Z2V0T3duZXJOYW1lKCk7CiAKICAgICBBU3RyaW5nIGNvbXBvbmVudE5hbWU7Ci0gICAgaW50MzJfdCBlbmNvZGVyID0gZmFsc2U7Ci0gICAgaWYgKG1zZy0+ZmluZFN0cmluZygiY29tcG9uZW50TmFtZSIsICZjb21wb25lbnROYW1lKSkgewotICAgICAgICBzcDxJTWVkaWFDb2RlY0xpc3Q+IGxpc3QgPSBNZWRpYUNvZGVjTGlzdDo6Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgaWYgKGxpc3QgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBvYnRhaW4gTWVkaWFDb2RlY0xpc3Qgd2hpbGUgIgotICAgICAgICAgICAgICAgICAgICAiYXR0ZW1wdGluZyB0byBjcmVhdGUgY29kZWMgXCIlc1wiIiwKLSAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBOT19JTklUKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBzc2l6ZV90IGluZGV4ID0gbGlzdC0+ZmluZENvZGVjQnlOYW1lKGNvbXBvbmVudE5hbWUuY19zdHIoKSk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gZmluZCBjb2RlYyBcIiVzXCIiLAotICAgICAgICAgICAgICAgICAgICBjb21wb25lbnROYW1lLmNfc3RyKCkpOwotICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50LCBOQU1FX05PVF9GT1VORCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSBsaXN0LT5nZXRDb2RlY0luZm8oaW5kZXgpOwotICAgICAgICBpZiAoaW5mbyA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVW5leHBlY3RlZCBlcnJvciAoaW5kZXggb3V0LW9mLWJvdW5kKSB3aGlsZSAiCi0gICAgICAgICAgICAgICAgICAgICJyZXRyaWV2aW5nIGluZm9ybWF0aW9uIGZvciBjb2RlYyBcIiVzXCIiLAotICAgICAgICAgICAgICAgICAgICBjb21wb25lbnROYW1lLmNfc3RyKCkpOwotICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIFVOS05PV05fRVJST1IpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG1hdGNoaW5nQ29kZWNzLmFkZChpbmZvLT5nZXRDb2RlY05hbWUoKSk7Ci0gICAgICAgIG93bmVycy5hZGQoaW5mby0+Z2V0T3duZXJOYW1lKCkgPT0gbnVsbHB0ciA/Ci0gICAgICAgICAgICAgICAgImRlZmF1bHQiIDogaW5mby0+Z2V0T3duZXJOYW1lKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7Ci0KLSAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiZW5jb2RlciIsICZlbmNvZGVyKSkgewotICAgICAgICAgICAgZW5jb2RlciA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgTWVkaWFDb2RlY0xpc3Q6OmZpbmRNYXRjaGluZ0NvZGVjcygKLSAgICAgICAgICAgICAgICBtaW1lLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgZW5jb2RlciwgLy8gY3JlYXRlRW5jb2RlcgotICAgICAgICAgICAgICAgIDAsICAgICAgIC8vIGZsYWdzCi0gICAgICAgICAgICAgICAgJm1hdGNoaW5nQ29kZWNzLAotICAgICAgICAgICAgICAgICZvd25lcnMpOwotICAgIH0KKyAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoImNvbXBvbmVudE5hbWUiLCAmY29tcG9uZW50TmFtZSkpOwogCiAgICAgc3A8Q29kZWNPYnNlcnZlcj4gb2JzZXJ2ZXIgPSBuZXcgQ29kZWNPYnNlcnZlcjsKICAgICBzcDxJT01YPiBvbXg7CiAgICAgc3A8SU9NWE5vZGU+IG9teE5vZGU7CiAKICAgICBzdGF0dXNfdCBlcnIgPSBOQU1FX05PVF9GT1VORDsKLSAgICBmb3IgKHNpemVfdCBtYXRjaEluZGV4ID0gMDsgbWF0Y2hJbmRleCA8IG1hdGNoaW5nQ29kZWNzLnNpemUoKTsKLSAgICAgICAgICAgICsrbWF0Y2hJbmRleCkgewotICAgICAgICBjb21wb25lbnROYW1lID0gbWF0Y2hpbmdDb2RlY3NbbWF0Y2hJbmRleF07Ci0KLSAgICAgICAgT01YQ2xpZW50IGNsaWVudDsKLSAgICAgICAgYm9vbCB0cmVibGVGbGFnOwotICAgICAgICBpZiAoY2xpZW50LmNvbm5lY3Qob3duZXJzW21hdGNoSW5kZXhdLmNfc3RyKCksICZ0cmVibGVGbGFnKSAhPSBPSykgewotICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIE5PX0lOSVQpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG9teCA9IGNsaWVudC5pbnRlcmZhY2UoKTsKLQotICAgICAgICBwaWRfdCB0aWQgPSBnZXR0aWQoKTsKLSAgICAgICAgaW50IHByZXZQcmlvcml0eSA9IGFuZHJvaWRHZXRUaHJlYWRQcmlvcml0eSh0aWQpOwotICAgICAgICBhbmRyb2lkU2V0VGhyZWFkUHJpb3JpdHkodGlkLCBBTkRST0lEX1BSSU9SSVRZX0ZPUkVHUk9VTkQpOwotICAgICAgICBlcnIgPSBvbXgtPmFsbG9jYXRlTm9kZShjb21wb25lbnROYW1lLmNfc3RyKCksIG9ic2VydmVyLCAmb214Tm9kZSk7Ci0gICAgICAgIGFuZHJvaWRTZXRUaHJlYWRQcmlvcml0eSh0aWQsIHByZXZQcmlvcml0eSk7Ci0KLSAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgbUNvZGVjLT5zZXRUcmVibGVGbGFnKHRyZWJsZUZsYWcpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygiQWxsb2NhdGluZyBjb21wb25lbnQgJyVzJyBmYWlsZWQsIHRyeSBuZXh0IG9uZS4iLCBjb21wb25lbnROYW1lLmNfc3RyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgb214Tm9kZSA9IE5VTEw7CisgICAgT01YQ2xpZW50IGNsaWVudDsKKyAgICBpZiAoY2xpZW50LmNvbm5lY3Qob3duZXIuY19zdHIoKSkgIT0gT0spIHsKKyAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIE5PX0lOSVQpOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQorICAgIG9teCA9IGNsaWVudC5pbnRlcmZhY2UoKTsKIAotICAgIGlmIChvbXhOb2RlID09IE5VTEwpIHsKLSAgICAgICAgaWYgKCFtaW1lLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgYSAlc2NvZGVyIGZvciB0eXBlICclcycgd2l0aCBlcnIgJSN4LiIsCi0gICAgICAgICAgICAgICAgICAgIGVuY29kZXIgPyAiZW4iIDogImRlIiwgbWltZS5jX3N0cigpLCBlcnIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBpbnN0YW50aWF0ZSBjb2RlYyAnJXMnIHdpdGggZXJyICUjeC4iLCBjb21wb25lbnROYW1lLmNfc3RyKCksIGVycik7Ci0gICAgICAgIH0KKyAgICBwaWRfdCB0aWQgPSBnZXR0aWQoKTsKKyAgICBpbnQgcHJldlByaW9yaXR5ID0gYW5kcm9pZEdldFRocmVhZFByaW9yaXR5KHRpZCk7CisgICAgYW5kcm9pZFNldFRocmVhZFByaW9yaXR5KHRpZCwgQU5EUk9JRF9QUklPUklUWV9GT1JFR1JPVU5EKTsKKyAgICBlcnIgPSBvbXgtPmFsbG9jYXRlTm9kZShjb21wb25lbnROYW1lLmNfc3RyKCksIG9ic2VydmVyLCAmb214Tm9kZSk7CisgICAgYW5kcm9pZFNldFRocmVhZFByaW9yaXR5KHRpZCwgcHJldlByaW9yaXR5KTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBpbnN0YW50aWF0ZSBjb2RlYyAnJXMnIHdpdGggZXJyICUjeC4iLCBjb21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CiAKICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcigoT01YX0VSUk9SVFlQRSllcnIsIG1ha2VOb1NpZGVFZmZlY3RTdGF0dXMoZXJyKSk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBtRGVhdGhOb3RpZmllciA9IG5ldyBEZWF0aE5vdGlmaWVyKG5vdGlmeSk7Ci0gICAgaWYgKG1Db2RlYy0+Z2V0VHJlYmxlRmxhZygpKSB7Ci0gICAgICAgIGF1dG8gdE9teE5vZGUgPSBvbXhOb2RlLT5nZXRIYWxJbnRlcmZhY2UoKTsKLSAgICAgICAgaWYgKCF0T214Tm9kZS0+bGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIDApKSB7Ci0gICAgICAgICAgICBtRGVhdGhOb3RpZmllci5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKElJbnRlcmZhY2U6OmFzQmluZGVyKG9teE5vZGUpLT5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllcikgIT0gT0spIHsKLSAgICAgICAgICAgIC8vIFRoaXMgd2FzIGEgbG9jYWwgYmluZGVyLCBpZiBpdCBkaWVzIHNvIGRvIHdlLCB3ZSB3b24ndCBjYXJlCi0gICAgICAgICAgICAvLyBhYm91dCBhbnkgbm90aWZpY2F0aW9ucyBpbiB0aGUgYWZ0ZXJsaWZlLgotICAgICAgICAgICAgbURlYXRoTm90aWZpZXIuY2xlYXIoKTsKLSAgICAgICAgfQorICAgIGF1dG8gdE9teE5vZGUgPSBvbXhOb2RlLT5nZXRIYWxJbnRlcmZhY2UoKTsKKyAgICBpZiAoIXRPbXhOb2RlLT5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgMCkpIHsKKyAgICAgICAgbURlYXRoTm90aWZpZXIuY2xlYXIoKTsKICAgICB9CiAKICAgICBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPTVhNZXNzYWdlTGlzdCwgbUNvZGVjKTsKQEAgLTY3NTUsOSArNjc5NiwxNCBAQAogCiAgICAgc3A8UmVmQmFzZT4gb2JqOwogICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgiaW5wdXQtc3VyZmFjZSIsICZvYmopKTsKKyAgICBpZiAob2JqID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIlslc10gTlVMTCBpbnB1dCBzdXJmYWNlIiwgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgbUNvZGVjLT5tQ2FsbGJhY2stPm9uSW5wdXRTdXJmYWNlRGVjbGluZWQoQkFEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIHNwPFBlcnNpc3RlbnRTdXJmYWNlPiBzdXJmYWNlID0gc3RhdGljX2Nhc3Q8UGVyc2lzdGVudFN1cmZhY2UgKj4ob2JqLmdldCgpKTsKICAgICBtQ29kZWMtPm1HcmFwaGljQnVmZmVyU291cmNlID0gc3VyZmFjZS0+Z2V0QnVmZmVyU291cmNlKCk7Ci0KICAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cElucHV0U3VyZmFjZSgpOwogCiAgICAgaWYgKGVyciA9PSBPSykgewpAQCAtNzI5NywxMiArNzM0MywxNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgZmxvYXQgcmF0ZTsKLSAgICBpZiAocGFyYW1zLT5maW5kRmxvYXQoIm9wZXJhdGluZy1yYXRlIiwgJnJhdGUpICYmIHJhdGUgPiAwKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IHNldE9wZXJhdGluZ1JhdGUocmF0ZSwgbUlzVmlkZW8pOworICAgIGludDMyX3QgcmF0ZUludCA9IC0xOworICAgIGZsb2F0IHJhdGVGbG9hdCA9IC0xOworICAgIGlmICghcGFyYW1zLT5maW5kRmxvYXQoIm9wZXJhdGluZy1yYXRlIiwgJnJhdGVGbG9hdCkpIHsKKyAgICAgICAgcGFyYW1zLT5maW5kSW50MzIoIm9wZXJhdGluZy1yYXRlIiwgJnJhdGVJbnQpOworICAgICAgICByYXRlRmxvYXQgPSAoZmxvYXQpIHJhdGVJbnQ7IC8vIDE2TUh6IChGTElOVE1BWCkgaXMgT0sgZm9yIHVwcGVyIGJvdW5kLgorICAgIH0KKyAgICBpZiAocmF0ZUZsb2F0ID4gMCkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXRPcGVyYXRpbmdSYXRlKHJhdGVGbG9hdCwgbUlzVmlkZW8pOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBwYXJhbWV0ZXIgJ29wZXJhdGluZy1yYXRlJyAoZXJyICVkKSIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgQUxPR0koIkZhaWxlZCB0byBzZXQgcGFyYW1ldGVyICdvcGVyYXRpbmctcmF0ZScgKGVyciAlZCkiLCBlcnIpOwogICAgICAgICB9CiAgICAgfQogCkBAIC03MzI3LDEwICs3Mzc3LDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHN0YXR1c190IGVyciA9IGNvbmZpZ3VyZVRlbXBvcmFsTGF5ZXJzKHBhcmFtcywgZmFsc2UgLyogaW5Db25maWd1cmUgKi8sIG1PdXRwdXRGb3JtYXQpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgZXJyID0gT0s7IC8vIGlnbm9yZSBmYWlsdXJlCi0gICAgfQorICAgIC8vIElnbm9yZSBlcnJvcnMgYXMgZmFpbHVyZSBpcyBleHBlY3RlZCBmb3IgY29kZWNzIHRoYXQgYXJlbid0IHZpZGVvIGVuY29kZXJzLgorICAgICh2b2lkKWNvbmZpZ3VyZVRlbXBvcmFsTGF5ZXJzKHBhcmFtcywgZmFsc2UgLyogaW5Db25maWd1cmUgKi8sIG1PdXRwdXRGb3JtYXQpOwogCiAgICAgcmV0dXJuIHNldFZlbmRvclBhcmFtZXRlcnMocGFyYW1zKTsKIH0KQEAgLTc1ODYsOCArNzYzNCwxMCBAQAogICAgICAgICAgICAgICAgIGNvbmZpZy0+cGFyYW1bcGFyYW1JbmRleF0uYlNldCA9CiAgICAgICAgICAgICAgICAgICAgIChPTVhfQk9PTClwYXJhbXMtPmZpbmRTdHJpbmcoZXhpc3RpbmdLZXktPnNlY29uZC5jX3N0cigpLCAmdmFsdWUpOwogICAgICAgICAgICAgICAgIGlmIChjb25maWctPnBhcmFtW3BhcmFtSW5kZXhdLmJTZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RybmNweSgoY2hhciAqKWNvbmZpZy0+cGFyYW1bcGFyYW1JbmRleF0uY1N0cmluZywgdmFsdWUuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoT01YX0NPTkZJR19BTkRST0lEX1ZFTkRPUl9QQVJBTVRZUEU6OmNTdHJpbmcpKTsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRzdFNpemUgPSBzaXplb2YoY29uZmlnLT5wYXJhbVtwYXJhbUluZGV4XS5jU3RyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgc3RybmNweSgoY2hhciAqKWNvbmZpZy0+cGFyYW1bcGFyYW1JbmRleF0uY1N0cmluZywgdmFsdWUuY19zdHIoKSwgZHN0U2l6ZSAtIDEpOworICAgICAgICAgICAgICAgICAgICAvLyBudWxsIHRlcm1pbmF0ZSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICBjb25maWctPnBhcmFtW3BhcmFtSW5kZXhdLmNTdHJpbmdbZHN0U2l6ZSAtIDFdID0gJ1wwJzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC03ODU2LDExICs3OTA2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1CdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdLnNpemUoKSk7CiAgICAgICAgICAgICAgICAgICAgIGVyciA9IEZBSUxFRF9UUkFOU0FDVElPTjsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAobUNvZGVjLT5nZXRUcmVibGVGbGFnKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUFsbG9jYXRvcltrUG9ydEluZGV4T3V0cHV0XS5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tRGVhbGVyW2tQb3J0SW5kZXhPdXRwdXRdLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQWxsb2NhdG9yW2tQb3J0SW5kZXhPdXRwdXRdLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewpAQCAtODI3Miw4ICs4MzE4LDkgQEAKICAgICB9CiAKICAgICBib29sIGlzVmlkZW8gPSBzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikgPT0gMDsKKyAgICBib29sIGlzSW1hZ2UgPSBzdHJuY2FzZWNtcChtaW1lLCAiaW1hZ2UvIiwgNikgPT0gMDsKIAotICAgIGlmIChpc1ZpZGVvKSB7CisgICAgaWYgKGlzVmlkZW8gfHwgaXNJbWFnZSkgewogICAgICAgICBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSBwYXJhbTsKICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW0pOwogICAgICAgICBwYXJhbS5uUG9ydEluZGV4ID0gaXNFbmNvZGVyID8ga1BvcnRJbmRleE91dHB1dCA6IGtQb3J0SW5kZXhJbnB1dDsKQEAgLTg0NjIsMTIgKzg1MDksNCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBBQ29kZWM6OnNldFRyZWJsZUZsYWcoYm9vbCB0cmVibGVGbGFnKSB7Ci0gICAgbVRyZWJsZUZsYWcgPSB0cmVibGVGbGFnOwotfQotCi1ib29sIEFDb2RlYzo6Z2V0VHJlYmxlRmxhZygpIGNvbnN0IHsKLSAgICByZXR1cm4gbVRyZWJsZUZsYWc7Ci19Ci0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWNCdWZmZXJDaGFubmVsLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlY0J1ZmZlckNoYW5uZWwuY3BwCmluZGV4IDNjN2FlM2UuLjcxMGFlNjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlY0J1ZmZlckNoYW5uZWwuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlY0J1ZmZlckNoYW5uZWwuY3BwCkBAIC0yMiw2ICsyMiw3IEBACiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy9uYXRpdmUvMS4wL0lEZXNjcmFtYmxlci5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKyNpbmNsdWRlIDxoaWRsbWVtb3J5L0ZyYW1ld29ya1V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfQ29yZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgpAQCAtMzQsNiArMzUsNyBAQAogI2luY2x1ZGUgImluY2x1ZGUvU2hhcmVkTWVtb3J5QnVmZmVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK3VzaW5nIGhhcmR3YXJlOjpmcm9tSGVhcDsKIHVzaW5nIGhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKIHVzaW5nIGhhcmR3YXJlOjpoaWRsX3N0cmluZzsKIHVzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKQEAgLTE2Miw3ICsxNjQsNyBAQAogICAgICAgICBzaXplX3Qgc2l6ZTsKICAgICAgICAgaXQtPm1TaGFyZWRFbmNyeXB0ZWRCdWZmZXItPmdldE1lbW9yeSgmb2Zmc2V0LCAmc2l6ZSk7CiAgICAgICAgIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDo6U2hhcmVkQnVmZmVyIHNyY0J1ZmZlciA9IHsKLSAgICAgICAgICAgICAgICAuaGVhcEJhc2UgPSBtSGlkbE1lbW9yeSwKKyAgICAgICAgICAgICAgICAuaGVhcEJhc2UgPSAqbUhpZGxNZW1vcnksCiAgICAgICAgICAgICAgICAgLm9mZnNldCA9ICh1aW50NjRfdCkgb2Zmc2V0LAogICAgICAgICAgICAgICAgIC5zaXplID0gc2l6ZQogICAgICAgICB9OwpAQCAtMzA4LDExICszMTAsOCBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtRGVzY3JhbWJsZXIgIT0gbnVsbHB0cikgewogICAgICAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IGRlYWxlci0+Z2V0TWVtb3J5SGVhcCgpOwotICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIG5hdGl2ZUhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOwotICAgICAgICBpZiAobmF0aXZlSGFuZGxlICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGludCBmZCA9IGhlYXAtPmdldEhlYXBJRCgpOwotICAgICAgICAgICAgbmF0aXZlSGFuZGxlLT5kYXRhWzBdID0gZmQ7Ci0gICAgICAgICAgICBtSGlkbE1lbW9yeSA9IGhpZGxfbWVtb3J5KCJhc2htZW0iLCBoaWRsX2hhbmRsZShuYXRpdmVIYW5kbGUpLCBoZWFwLT5nZXRTaXplKCkpOworICAgICAgICBtSGlkbE1lbW9yeSA9IGZyb21IZWFwKGhlYXApOworICAgICAgICBpZiAobUhpZGxNZW1vcnkgIT0gTlVMTCkgewogICAgICAgICAgICAgQUxPR1YoImNyZWF0ZWQgaGlkbF9tZW1vcnkgZm9yIGRlc2NyYW1ibGVyIik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGNyZWF0ZSBoaWRsX21lbW9yeSBmb3IgZGVzY3JhbWJsZXIiKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUkV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJFeHRyYWN0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODkyNTIwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUkV4dHJhY3Rvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiQU1SRXh0cmFjdG9yIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiaW5jbHVkZS9BTVJFeHRyYWN0b3IuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgQU1SU291cmNlIDogcHVibGljIE1lZGlhU291cmNlIHsKLXB1YmxpYzoKLSAgICBBTVJTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwKLSAgICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhLAotICAgICAgICAgICAgICBib29sIGlzV2lkZSwKLSAgICAgICAgICAgICAgY29uc3Qgb2ZmNjRfdCAqb2Zmc2V0X3RhYmxlLAotICAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0X3RhYmxlX2xlbmd0aCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLQotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5BTVJTb3VyY2UoKTsKLQotcHJpdmF0ZToKLSAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKLSAgICBzcDxNZXRhRGF0YT4gbU1ldGE7Ci0gICAgYm9vbCBtSXNXaWRlOwotCi0gICAgb2ZmNjRfdCBtT2Zmc2V0OwotICAgIGludDY0X3QgbUN1cnJlbnRUaW1lVXM7Ci0gICAgYm9vbCBtU3RhcnRlZDsKLSAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7Ci0KLSAgICBvZmY2NF90IG1PZmZzZXRUYWJsZVtPRkZTRVRfVEFCTEVfTEVOXTsKLSAgICBzaXplX3QgbU9mZnNldFRhYmxlTGVuZ3RoOwotCi0gICAgQU1SU291cmNlKGNvbnN0IEFNUlNvdXJjZSAmKTsKLSAgICBBTVJTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBBTVJTb3VyY2UgJik7Ci19OwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1zdGF0aWMgc2l6ZV90IGdldEZyYW1lU2l6ZShib29sIGlzV2lkZSwgdW5zaWduZWQgRlQpIHsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtGcmFtZVNpemVOQlsxNl0gPSB7Ci0gICAgICAgIDk1LCAxMDMsIDExOCwgMTM0LCAxNDgsIDE1OSwgMjA0LCAyNDQsCi0gICAgICAgIDM5LCA0MywgMzgsIDM3LCAvLyBTSUQKLSAgICAgICAgMCwgMCwgMCwgLy8gZnV0dXJlIHVzZQotICAgICAgICAwIC8vIG5vIGRhdGEKLSAgICB9OwotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0ZyYW1lU2l6ZVdCWzE2XSA9IHsKLSAgICAgICAgMTMyLCAxNzcsIDI1MywgMjg1LCAzMTcsIDM2NSwgMzk3LCA0NjEsIDQ3NywKLSAgICAgICAgNDAsIC8vIFNJRAotICAgICAgICAwLCAwLCAwLCAwLCAvLyBmdXR1cmUgdXNlCi0gICAgICAgIDAsIC8vIHNwZWVjaCBsb3N0Ci0gICAgICAgIDAgLy8gbm8gZGF0YQotICAgIH07Ci0KLSAgICBpZiAoRlQgPiAxNSB8fCAoaXNXaWRlICYmIEZUID4gOSAmJiBGVCA8IDE0KSB8fCAoIWlzV2lkZSAmJiBGVCA+IDExICYmIEZUIDwgMTUpKSB7Ci0gICAgICAgIEFMT0dFKCJpbGxlZ2FsIEFNUiBmcmFtZSB0eXBlICVkIiwgRlQpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBzaXplX3QgZnJhbWVTaXplID0gaXNXaWRlID8ga0ZyYW1lU2l6ZVdCW0ZUXSA6IGtGcmFtZVNpemVOQltGVF07Ci0KLSAgICAvLyBSb3VuZCB1cCBiaXRzIHRvIGJ5dGVzIGFuZCBhZGQgMSBmb3IgdGhlIGhlYWRlciBieXRlLgotICAgIGZyYW1lU2l6ZSA9IChmcmFtZVNpemUgKyA3KSAvIDggKyAxOwotCi0gICAgcmV0dXJuIGZyYW1lU2l6ZTsKLX0KLQotc3RhdGljIHN0YXR1c190IGdldEZyYW1lU2l6ZUJ5T2Zmc2V0KGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsCi0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCBib29sIGlzV2lkZSwgc2l6ZV90ICpmcmFtZVNpemUpIHsKLSAgICB1aW50OF90IGhlYWRlcjsKLSAgICBzc2l6ZV90IGNvdW50ID0gc291cmNlLT5yZWFkQXQob2Zmc2V0LCAmaGVhZGVyLCAxKTsKLSAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICB9IGVsc2UgaWYgKGNvdW50IDwgMCkgewotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotCi0gICAgdW5zaWduZWQgRlQgPSAoaGVhZGVyID4+IDMpICYgMHgwZjsKLQotICAgICpmcmFtZVNpemUgPSBnZXRGcmFtZVNpemUoaXNXaWRlLCBGVCk7Ci0gICAgaWYgKCpmcmFtZVNpemUgPT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLUFNUkV4dHJhY3Rvcjo6QU1SRXh0cmFjdG9yKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpCi0gICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAotICAgICAgbUluaXRDaGVjayhOT19JTklUKSwKLSAgICAgIG1PZmZzZXRUYWJsZUxlbmd0aCgwKSB7Ci0gICAgU3RyaW5nOCBtaW1lVHlwZTsKLSAgICBmbG9hdCBjb25maWRlbmNlOwotICAgIGlmICghU25pZmZBTVIobURhdGFTb3VyY2UsICZtaW1lVHlwZSwgJmNvbmZpZGVuY2UsIE5VTEwpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtSXNXaWRlID0gKG1pbWVUeXBlID09IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQik7Ci0KLSAgICBtTWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBtTWV0YS0+c2V0Q1N0cmluZygKLSAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgbUlzV2lkZSA/IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CKTsKLQotICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAxKTsKLSAgICBtTWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1Jc1dpZGUgPyAxNjAwMCA6IDgwMDApOwotCi0gICAgb2ZmNjRfdCBvZmZzZXQgPSBtSXNXaWRlID8gOSA6IDY7Ci0gICAgb2ZmNjRfdCBzdHJlYW1TaXplOwotICAgIHNpemVfdCBmcmFtZVNpemUsIG51bUZyYW1lcyA9IDA7Ci0gICAgaW50NjRfdCBkdXJhdGlvbiA9IDA7Ci0KLSAgICBpZiAobURhdGFTb3VyY2UtPmdldFNpemUoJnN0cmVhbVNpemUpID09IE9LKSB7Ci0gICAgICAgICB3aGlsZSAob2Zmc2V0IDwgc3RyZWFtU2l6ZSkgewotICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEZyYW1lU2l6ZUJ5T2Zmc2V0KHNvdXJjZSwgb2Zmc2V0LCBtSXNXaWRlLCAmZnJhbWVTaXplKTsKLSAgICAgICAgICAgICBpZiAoc3RhdHVzID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgobnVtRnJhbWVzICUgNTAgPT0gMCkgJiYgKG51bUZyYW1lcyAvIDUwIDwgT0ZGU0VUX1RBQkxFX0xFTikpIHsKLSAgICAgICAgICAgICAgICBDSEVDS19FUShtT2Zmc2V0VGFibGVMZW5ndGgsIG51bUZyYW1lcyAvIDUwKTsKLSAgICAgICAgICAgICAgICBtT2Zmc2V0VGFibGVbbU9mZnNldFRhYmxlTGVuZ3RoXSA9IG9mZnNldCAtIChtSXNXaWRlID8gOTogNik7Ci0gICAgICAgICAgICAgICAgbU9mZnNldFRhYmxlTGVuZ3RoICsrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvZmZzZXQgKz0gZnJhbWVTaXplOwotICAgICAgICAgICAgZHVyYXRpb24gKz0gMjAwMDA7ICAvLyBFYWNoIGZyYW1lIGlzIDIwbXMKLSAgICAgICAgICAgIG51bUZyYW1lcyArKzsKLSAgICAgICAgfQotCi0gICAgICAgIG1NZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uKTsKLSAgICB9Ci0KLSAgICBtSW5pdENoZWNrID0gT0s7Ci19Ci0KLUFNUkV4dHJhY3Rvcjo6fkFNUkV4dHJhY3RvcigpIHsKLX0KLQotc3A8TWV0YURhdGE+IEFNUkV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoKSB7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbWV0YTsKLSAgICB9Ci0KLSAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbUlzV2lkZSA/ICJhdWRpby9hbXItd2IiIDogImF1ZGlvL2FtciIpOwotCi0gICAgcmV0dXJuIG1ldGE7Ci19Ci0KLXNpemVfdCBBTVJFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewotICAgIHJldHVybiBtSW5pdENoZWNrID09IE9LID8gMSA6IDA7Ci19Ci0KLXNwPElNZWRpYVNvdXJjZT4gQU1SRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBuZXcgQU1SU291cmNlKG1EYXRhU291cmNlLCBtTWV0YSwgbUlzV2lkZSwKLSAgICAgICAgICAgIG1PZmZzZXRUYWJsZSwgbU9mZnNldFRhYmxlTGVuZ3RoKTsKLX0KLQotc3A8TWV0YURhdGE+IEFNUkV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YShzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbU1ldGE7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLUFNUlNvdXJjZTo6QU1SU291cmNlKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsCi0gICAgICAgIGJvb2wgaXNXaWRlLCBjb25zdCBvZmY2NF90ICpvZmZzZXRfdGFibGUsIHNpemVfdCBvZmZzZXRfdGFibGVfbGVuZ3RoKQotICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKLSAgICAgIG1NZXRhKG1ldGEpLAotICAgICAgbUlzV2lkZShpc1dpZGUpLAotICAgICAgbU9mZnNldChtSXNXaWRlID8gOSA6IDYpLAotICAgICAgbUN1cnJlbnRUaW1lVXMoMCksCi0gICAgICBtU3RhcnRlZChmYWxzZSksCi0gICAgICBtR3JvdXAoTlVMTCksCi0gICAgICBtT2Zmc2V0VGFibGVMZW5ndGgob2Zmc2V0X3RhYmxlX2xlbmd0aCkgewotICAgIGlmIChtT2Zmc2V0VGFibGVMZW5ndGggPiAwICYmIG1PZmZzZXRUYWJsZUxlbmd0aCA8PSBPRkZTRVRfVEFCTEVfTEVOKSB7Ci0gICAgICAgIG1lbWNweSAoKGNoYXIqKW1PZmZzZXRUYWJsZSwgKGNoYXIqKW9mZnNldF90YWJsZSwgc2l6ZW9mKG9mZjY0X3QpICogbU9mZnNldFRhYmxlTGVuZ3RoKTsKLSAgICB9Ci19Ci0KLUFNUlNvdXJjZTo6fkFNUlNvdXJjZSgpIHsKLSAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgc3RvcCgpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQU1SU291cmNlOjpzdGFydChNZXRhRGF0YSAqIC8qIHBhcmFtcyAqLykgewotICAgIENIRUNLKCFtU3RhcnRlZCk7Ci0KLSAgICBtT2Zmc2V0ID0gbUlzV2lkZSA/IDkgOiA2OwotICAgIG1DdXJyZW50VGltZVVzID0gMDsKLSAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKLSAgICBtR3JvdXAtPmFkZF9idWZmZXIobmV3IE1lZGlhQnVmZmVyKDEyOCkpOwotICAgIG1TdGFydGVkID0gdHJ1ZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQU1SU291cmNlOjpzdG9wKCkgewotICAgIENIRUNLKG1TdGFydGVkKTsKLQotICAgIGRlbGV0ZSBtR3JvdXA7Ci0gICAgbUdyb3VwID0gTlVMTDsKLQotICAgIG1TdGFydGVkID0gZmFsc2U7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zcDxNZXRhRGF0YT4gQU1SU291cmNlOjpnZXRGb3JtYXQoKSB7Ci0gICAgcmV0dXJuIG1NZXRhOwotfQotCi1zdGF0dXNfdCBBTVJTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotICAgICpvdXQgPSBOVUxMOwotCi0gICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwotICAgIGlmIChtT2Zmc2V0VGFibGVMZW5ndGggPiAwICYmIG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKLSAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgIGludDY0X3Qgc2Vla0ZyYW1lID0gc2Vla1RpbWVVcyAvIDIwMDAwbGw7ICAvLyAyMG1zIHBlciBmcmFtZS4KLSAgICAgICAgbUN1cnJlbnRUaW1lVXMgPSBzZWVrRnJhbWUgKiAyMDAwMGxsOwotCi0gICAgICAgIHNpemVfdCBpbmRleCA9IHNlZWtGcmFtZSA8IDAgPyAwIDogc2Vla0ZyYW1lIC8gNTA7Ci0gICAgICAgIGlmIChpbmRleCA+PSBtT2Zmc2V0VGFibGVMZW5ndGgpIHsKLSAgICAgICAgICAgIGluZGV4ID0gbU9mZnNldFRhYmxlTGVuZ3RoIC0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIG1PZmZzZXQgPSBtT2Zmc2V0VGFibGVbaW5kZXhdICsgKG1Jc1dpZGUgPyA5IDogNik7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGk8IHNlZWtGcmFtZSAtIGluZGV4ICogNTA7IGkrKykgewotICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICAgICAgaWYgKChlcnIgPSBnZXRGcmFtZVNpemVCeU9mZnNldChtRGF0YVNvdXJjZSwgbU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSXNXaWRlLCAmc2l6ZSkpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1PZmZzZXQgKz0gc2l6ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHVpbnQ4X3QgaGVhZGVyOwotICAgIHNzaXplX3QgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQobU9mZnNldCwgJmhlYWRlciwgMSk7Ci0KLSAgICBpZiAobiA8IDEpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgfQotCi0gICAgaWYgKGhlYWRlciAmIDB4ODMpIHsKLSAgICAgICAgLy8gUGFkZGluZyBiaXRzIG11c3QgYmUgMC4KLQotICAgICAgICBBTE9HRSgicGFkZGluZyBiaXRzIG11c3QgYmUgMCwgaGVhZGVyIGlzIDB4JTAyeCIsIGhlYWRlcik7Ci0KLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1bnNpZ25lZCBGVCA9IChoZWFkZXIgPj4gMykgJiAweDBmOwotCi0gICAgc2l6ZV90IGZyYW1lU2l6ZSA9IGdldEZyYW1lU2l6ZShtSXNXaWRlLCBGVCk7Ci0gICAgaWYgKGZyYW1lU2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKLSAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBuID0gbURhdGFTb3VyY2UtPnJlYWRBdChtT2Zmc2V0LCBidWZmZXItPmRhdGEoKSwgZnJhbWVTaXplKTsKLQotICAgIGlmIChuICE9IChzc2l6ZV90KWZyYW1lU2l6ZSkgewotICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgYnVmZmVyID0gTlVMTDsKLQotICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG9ubHkgcGFydGlhbCBmcmFtZSBpcyBhdmFpbGFibGUsIHRyZWF0IGl0IGFzIEVPUy4KLSAgICAgICAgICAgIG1PZmZzZXQgKz0gbjsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZnJhbWVTaXplKTsKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgbUN1cnJlbnRUaW1lVXMpOwotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7Ci0KLSAgICBtT2Zmc2V0ICs9IGZyYW1lU2l6ZTsKLSAgICBtQ3VycmVudFRpbWVVcyArPSAyMDAwMDsgIC8vIEVhY2ggZnJhbWUgaXMgMjBtcwotCi0gICAgKm91dCA9IGJ1ZmZlcjsKLQotICAgIHJldHVybiBPSzsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotYm9vbCBTbmlmZkFNUigKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICBzcDxBTWVzc2FnZT4gKikgewotICAgIGNoYXIgaGVhZGVyWzldOwotCi0gICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpICE9IHNpemVvZihoZWFkZXIpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoIW1lbWNtcChoZWFkZXIsICIjIUFNUlxuIiwgNikpIHsKLSAgICAgICAgKm1pbWVUeXBlID0gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05COwotICAgICAgICAqY29uZmlkZW5jZSA9IDAuNTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKCFtZW1jbXAoaGVhZGVyLCAiIyFBTVItV0JcbiIsIDkpKSB7Ci0gICAgICAgICptaW1lVHlwZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQjsKLSAgICAgICAgKmNvbmZpZGVuY2UgPSAwLjU7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUldyaXRlci5jcHAKaW5kZXggOTYxYjU3Zi4uNDExMDZhMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJXcml0ZXIuY3BwCkBAIC0yNSw4ICsyNSw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNTQsNyArNTQsNyBAQAogICAgIHJldHVybiBtSW5pdENoZWNrOwogfQogCi1zdGF0dXNfdCBBTVJXcml0ZXI6OmFkZFNvdXJjZShjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKK3N0YXR1c190IEFNUldyaXRlcjo6YWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CiAgICAgfQpAQCAtMTkzLDcgKzE5Myw3IEBACiAKICAgICBwcmN0bChQUl9TRVRfTkFNRSwgKHVuc2lnbmVkIGxvbmcpIkFNUldyaXRlciIsIDAsIDAsIDApOwogICAgIHdoaWxlICghbURvbmUpIHsKLSAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7CiAgICAgICAgIGVyciA9IG1Tb3VyY2UtPnJlYWQoJmJ1ZmZlcik7CiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtMjE1LDcgKzIxNSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzOwotICAgICAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lc3RhbXBVcykpOworICAgICAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVzdGFtcFVzKSk7CiAgICAgICAgIGlmICh0aW1lc3RhbXBVcyA+IG1Fc3RpbWF0ZWREdXJhdGlvblVzKSB7CiAgICAgICAgICAgICBtRXN0aW1hdGVkRHVyYXRpb25VcyA9IHRpbWVzdGFtcFVzOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BVklFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQVZJRXh0cmFjdG9yLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE2MjExZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BVklFeHRyYWN0b3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTMwNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJBVklFeHRyYWN0b3IiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgotI2luY2x1ZGUgImluY2x1ZGUvQVZJRXh0cmFjdG9yLmgiCi0KLSNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEFWSUV4dHJhY3Rvcjo6QVZJU291cmNlIDogcHVibGljIE1lZGlhU291cmNlIHsKLSAgICBBVklTb3VyY2UoY29uc3Qgc3A8QVZJRXh0cmFjdG9yPiAmZXh0cmFjdG9yLCBzaXplX3QgdHJhY2tJbmRleCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotCi0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+QVZJU291cmNlKCk7Ci0KLXByaXZhdGU6Ci0gICAgc3A8QVZJRXh0cmFjdG9yPiBtRXh0cmFjdG9yOwotICAgIHNpemVfdCBtVHJhY2tJbmRleDsKLSAgICBjb25zdCBBVklFeHRyYWN0b3I6OlRyYWNrICZtVHJhY2s7Ci0gICAgTWVkaWFCdWZmZXJHcm91cCAqbUJ1ZmZlckdyb3VwOwotICAgIHNpemVfdCBtU2FtcGxlSW5kZXg7Ci0KLSAgICBzcDxNUDNTcGxpdHRlcj4gbVNwbGl0dGVyOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQVZJU291cmNlKTsKLX07Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLXN0cnVjdCBBVklFeHRyYWN0b3I6Ok1QM1NwbGl0dGVyIDogcHVibGljIFJlZkJhc2UgewotICAgIE1QM1NwbGl0dGVyKCk7Ci0KLSAgICB2b2lkIGNsZWFyKCk7Ci0gICAgdm9pZCBhcHBlbmQoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7Ci0gICAgc3RhdHVzX3QgcmVhZChNZWRpYUJ1ZmZlciAqKmJ1ZmZlcik7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5NUDNTcGxpdHRlcigpOwotCi1wcml2YXRlOgotICAgIGJvb2wgbUZpbmRTeW5jOwotICAgIGludDY0X3QgbUJhc2VUaW1lVXM7Ci0gICAgaW50NjRfdCBtTnVtU2FtcGxlc1JlYWQ7Ci0gICAgc3A8QUJ1ZmZlcj4gbUJ1ZmZlcjsKLQotICAgIGJvb2wgcmVzeW5jKCk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNUDNTcGxpdHRlcik7Ci19OwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1BVklFeHRyYWN0b3I6OkFWSVNvdXJjZTo6QVZJU291cmNlKAotICAgICAgICBjb25zdCBzcDxBVklFeHRyYWN0b3I+ICZleHRyYWN0b3IsIHNpemVfdCB0cmFja0luZGV4KQotICAgIDogbUV4dHJhY3RvcihleHRyYWN0b3IpLAotICAgICAgbVRyYWNrSW5kZXgodHJhY2tJbmRleCksCi0gICAgICBtVHJhY2sobUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQodHJhY2tJbmRleCkpLAotICAgICAgbUJ1ZmZlckdyb3VwKE5VTEwpIHsKLX0KLQotQVZJRXh0cmFjdG9yOjpBVklTb3VyY2U6On5BVklTb3VyY2UoKSB7Ci0gICAgaWYgKG1CdWZmZXJHcm91cCkgewotICAgICAgICBzdG9wKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBVklFeHRyYWN0b3I6OkFWSVNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgewotICAgIENIRUNLKCFtQnVmZmVyR3JvdXApOwotCi0gICAgbUJ1ZmZlckdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0KLSAgICBtQnVmZmVyR3JvdXAtPmFkZF9idWZmZXIobmV3IE1lZGlhQnVmZmVyKG1UcmFjay5tTWF4U2FtcGxlU2l6ZSkpOwotICAgIG1CdWZmZXJHcm91cC0+YWRkX2J1ZmZlcihuZXcgTWVkaWFCdWZmZXIobVRyYWNrLm1NYXhTYW1wbGVTaXplKSk7Ci0gICAgbVNhbXBsZUluZGV4ID0gMDsKLQotICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgQ0hFQ0sobVRyYWNrLm1NZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7Ci0KLSAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRykpIHsKLSAgICAgICAgbVNwbGl0dGVyID0gbmV3IE1QM1NwbGl0dGVyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1TcGxpdHRlci5jbGVhcigpOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQVZJRXh0cmFjdG9yOjpBVklTb3VyY2U6OnN0b3AoKSB7Ci0gICAgQ0hFQ0sobUJ1ZmZlckdyb3VwKTsKLQotICAgIGRlbGV0ZSBtQnVmZmVyR3JvdXA7Ci0gICAgbUJ1ZmZlckdyb3VwID0gTlVMTDsKLQotICAgIG1TcGxpdHRlci5jbGVhcigpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zcDxNZXRhRGF0YT4gQVZJRXh0cmFjdG9yOjpBVklTb3VyY2U6OmdldEZvcm1hdCgpIHsKLSAgICByZXR1cm4gbVRyYWNrLm1NZXRhOwotfQotCi1zdGF0dXNfdCBBVklFeHRyYWN0b3I6OkFWSVNvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7Ci0gICAgQ0hFQ0sobUJ1ZmZlckdyb3VwKTsKLQotICAgICpidWZmZXIgPSBOVUxMOwotCi0gICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBzZWVrTW9kZTsKLSAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZzZWVrTW9kZSkpIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0KLSAgICAgICAgICAgIG1FeHRyYWN0b3ItPmdldFNhbXBsZUluZGV4QXRUaW1lKAotICAgICAgICAgICAgICAgICAgICBtVHJhY2tJbmRleCwgc2Vla1RpbWVVcywgc2Vla01vZGUsICZtU2FtcGxlSW5kZXgpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1TcGxpdHRlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtU3BsaXR0ZXItPmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGlmIChtU3BsaXR0ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNwbGl0dGVyLT5yZWFkKGJ1ZmZlcik7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyICE9IC1FQUdBSU4pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgb2ZmNjRfdCBvZmZzZXQ7Ci0gICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBib29sIGlzS2V5OwotICAgICAgICBpbnQ2NF90IHRpbWVVczsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+Z2V0U2FtcGxlSW5mbygKLSAgICAgICAgICAgICAgICBtVHJhY2tJbmRleCwgbVNhbXBsZUluZGV4LCAmb2Zmc2V0LCAmc2l6ZSwgJmlzS2V5LCAmdGltZVVzKTsKLQotICAgICAgICArK21TYW1wbGVJbmRleDsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgfQotCi0gICAgICAgIE1lZGlhQnVmZmVyICpvdXQ7Ci0gICAgICAgIENIRUNLX0VRKG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJm91dCksIChzdGF0dXNfdClPSyk7Ci0KLSAgICAgICAgc3NpemVfdCBuID0gbUV4dHJhY3Rvci0+bURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIG91dC0+ZGF0YSgpLCBzaXplKTsKLQotICAgICAgICBpZiAobiA8IChzc2l6ZV90KXNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiBuIDwgMCA/IChzdGF0dXNfdCluIDogKHN0YXR1c190KUVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIG91dC0+c2V0X3JhbmdlKDAsIHNpemUpOwotCi0gICAgICAgIG91dC0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOwotCi0gICAgICAgIGlmIChpc0tleSkgewotICAgICAgICAgICAgb3V0LT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtU3BsaXR0ZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgKmJ1ZmZlciA9IG91dDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgbVNwbGl0dGVyLT5hcHBlbmQob3V0KTsKLSAgICAgICAgb3V0LT5yZWxlYXNlKCk7Ci0gICAgICAgIG91dCA9IE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1BVklFeHRyYWN0b3I6Ok1QM1NwbGl0dGVyOjpNUDNTcGxpdHRlcigpCi0gICAgOiBtRmluZFN5bmModHJ1ZSksCi0gICAgICBtQmFzZVRpbWVVcygtMWxsKSwKLSAgICAgIG1OdW1TYW1wbGVzUmVhZCgwKSB7Ci19Ci0KLUFWSUV4dHJhY3Rvcjo6TVAzU3BsaXR0ZXI6On5NUDNTcGxpdHRlcigpIHsKLX0KLQotdm9pZCBBVklFeHRyYWN0b3I6Ok1QM1NwbGl0dGVyOjpjbGVhcigpIHsKLSAgICBtRmluZFN5bmMgPSB0cnVlOwotICAgIG1CYXNlVGltZVVzID0gLTFsbDsKLSAgICBtTnVtU2FtcGxlc1JlYWQgPSAwOwotCi0gICAgaWYgKG1CdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKLSAgICB9Ci19Ci0KLXZvaWQgQVZJRXh0cmFjdG9yOjpNUDNTcGxpdHRlcjo6YXBwZW5kKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKLSAgICBzaXplX3QgcHJldkNhcGFjaXR5ID0gKG1CdWZmZXIgIT0gTlVMTCkgPyBtQnVmZmVyLT5jYXBhY2l0eSgpIDogMDsKLQotICAgIGlmIChtQmFzZVRpbWVVcyA8IDApIHsKLSAgICAgICAgQ0hFQ0sobUJ1ZmZlciA9PSBOVUxMIHx8IG1CdWZmZXItPnNpemUoKSA9PSAwKTsKLSAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmbUJhc2VUaW1lVXMpKTsKLSAgICAgICAgbU51bVNhbXBsZXNSZWFkID0gMDsKLSAgICB9Ci0KLSAgICBpZiAobUJ1ZmZlciAhPSBOVUxMICYmIG1CdWZmZXItPm9mZnNldCgpID4gMCkgewotICAgICAgICBtZW1tb3ZlKG1CdWZmZXItPmJhc2UoKSwgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpOwotICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkpOwotICAgIH0KLQotICAgIGlmIChtQnVmZmVyID09IE5VTEwKLSAgICAgICAgICAgIHx8IG1CdWZmZXItPnNpemUoKSArIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPiBwcmV2Q2FwYWNpdHkpIHsKLSAgICAgICAgc2l6ZV90IG5ld0NhcGFjaXR5ID0KLSAgICAgICAgICAgIChwcmV2Q2FwYWNpdHkgKyBidWZmZXItPnJhbmdlX2xlbmd0aCgpICsgMTAyMykgJiB+MTAyMzsKLQotICAgICAgICBzcDxBQnVmZmVyPiBuZXdCdWZmZXIgPSBuZXcgQUJ1ZmZlcihuZXdDYXBhY2l0eSk7Ci0gICAgICAgIGlmIChtQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1lbWNweShuZXdCdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpOwotICAgICAgICAgICAgbmV3QnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmV3QnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKLSAgICAgICAgfQotICAgICAgICBtQnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIG1lbWNweShtQnVmZmVyLT5kYXRhKCkgKyBtQnVmZmVyLT5zaXplKCksCi0gICAgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAotICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLQotICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIG1CdWZmZXItPnNpemUoKSArIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotfQotCi1ib29sIEFWSUV4dHJhY3Rvcjo6TVAzU3BsaXR0ZXI6OnJlc3luYygpIHsKLSAgICBpZiAobUJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sIGZvdW5kU3luYyA9IGZhbHNlOwotICAgIGZvciAoc2l6ZV90IG9mZnNldCA9IDA7IG9mZnNldCArIDMgPCBtQnVmZmVyLT5zaXplKCk7ICsrb2Zmc2V0KSB7Ci0gICAgICAgIHVpbnQzMl90IGZpcnN0SGVhZGVyID0gVTMyX0FUKG1CdWZmZXItPmRhdGEoKSArIG9mZnNldCk7Ci0KLSAgICAgICAgc2l6ZV90IGZyYW1lU2l6ZTsKLSAgICAgICAgaWYgKCFHZXRNUEVHQXVkaW9GcmFtZVNpemUoZmlyc3RIZWFkZXIsICZmcmFtZVNpemUpKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNpemVfdCBzdWJzZXF1ZW50T2Zmc2V0ID0gb2Zmc2V0ICsgZnJhbWVTaXplOwotICAgICAgICBzaXplX3QgaSA9IDM7Ci0gICAgICAgIHdoaWxlIChpID4gMCkgewotICAgICAgICAgICAgaWYgKHN1YnNlcXVlbnRPZmZzZXQgKyAzID49IG1CdWZmZXItPnNpemUoKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga01hc2sgPSAweGZmZmUwYzAwOwotCi0gICAgICAgICAgICB1aW50MzJfdCBoZWFkZXIgPSBVMzJfQVQobUJ1ZmZlci0+ZGF0YSgpICsgc3Vic2VxdWVudE9mZnNldCk7Ci0gICAgICAgICAgICBpZiAoKGhlYWRlciAmIGtNYXNrKSAhPSAoZmlyc3RIZWFkZXIgJiBrTWFzaykpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFHZXRNUEVHQXVkaW9GcmFtZVNpemUoaGVhZGVyLCAmZnJhbWVTaXplKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdWJzZXF1ZW50T2Zmc2V0ICs9IGZyYW1lU2l6ZTsKLSAgICAgICAgICAgIC0taTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgICAgIGZvdW5kU3luYyA9IHRydWU7Ci0gICAgICAgICAgICBtZW1tb3ZlKG1CdWZmZXItPmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5zaXplKCkgLSBvZmZzZXQpOwotCi0gICAgICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkgLSBvZmZzZXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZm91bmRTeW5jOwotfQotCi1zdGF0dXNfdCBBVklFeHRyYWN0b3I6Ok1QM1NwbGl0dGVyOjpyZWFkKE1lZGlhQnVmZmVyICoqb3V0KSB7Ci0gICAgKm91dCA9IE5VTEw7Ci0KLSAgICBpZiAobUZpbmRTeW5jKSB7Ci0gICAgICAgIGlmICghcmVzeW5jKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUFHQUlOOwotICAgICAgICB9Ci0KLSAgICAgICAgbUZpbmRTeW5jID0gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKG1CdWZmZXItPnNpemUoKSA8IDQpIHsKLSAgICAgICAgcmV0dXJuIC1FQUdBSU47Ci0gICAgfQotCi0gICAgdWludDMyX3QgaGVhZGVyID0gVTMyX0FUKG1CdWZmZXItPmRhdGEoKSk7Ci0gICAgc2l6ZV90IGZyYW1lU2l6ZTsKLSAgICBpbnQgc2FtcGxlUmF0ZTsKLSAgICBpbnQgbnVtU2FtcGxlczsKLSAgICBpZiAoIUdldE1QRUdBdWRpb0ZyYW1lU2l6ZSgKLSAgICAgICAgICAgICAgICBoZWFkZXIsICZmcmFtZVNpemUsICZzYW1wbGVSYXRlLCBOVUxMLCBOVUxMLCAmbnVtU2FtcGxlcykpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpIDwgZnJhbWVTaXplKSB7Ci0gICAgICAgIHJldHVybiAtRUFHQUlOOwotICAgIH0KLQotICAgIE1lZGlhQnVmZmVyICptYnVmID0gbmV3IE1lZGlhQnVmZmVyKGZyYW1lU2l6ZSk7Ci0gICAgbWVtY3B5KG1idWYtPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpLCBmcmFtZVNpemUpOwotCi0gICAgaW50NjRfdCB0aW1lVXMgPSBtQmFzZVRpbWVVcyArIChtTnVtU2FtcGxlc1JlYWQgKiAxMDAwMDAwbGwpIC8gc2FtcGxlUmF0ZTsKLSAgICBtTnVtU2FtcGxlc1JlYWQgKz0gbnVtU2FtcGxlczsKLQotICAgIG1idWYtPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKLQotICAgIG1CdWZmZXItPnNldFJhbmdlKAotICAgICAgICAgICAgbUJ1ZmZlci0+b2Zmc2V0KCkgKyBmcmFtZVNpemUsIG1CdWZmZXItPnNpemUoKSAtIGZyYW1lU2l6ZSk7Ci0KLSAgICAqb3V0ID0gbWJ1ZjsKLQotICAgIHJldHVybiBPSzsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotQVZJRXh0cmFjdG9yOjpBVklFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UpCi0gICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSB7Ci0gICAgbUluaXRDaGVjayA9IHBhcnNlSGVhZGVycygpOwotCi0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgbVRyYWNrcy5jbGVhcigpOwotICAgIH0KLX0KLQotQVZJRXh0cmFjdG9yOjp+QVZJRXh0cmFjdG9yKCkgewotfQotCi1zaXplX3QgQVZJRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKLSAgICByZXR1cm4gbVRyYWNrcy5zaXplKCk7Ci19Ci0KLXNwPE1lZGlhU291cmNlPiBBVklFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewotICAgIHJldHVybiBpbmRleCA8IG1UcmFja3Muc2l6ZSgpID8gbmV3IEFWSVNvdXJjZSh0aGlzLCBpbmRleCkgOiBOVUxMOwotfQotCi1zcDxNZXRhRGF0YT4gQVZJRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgcmV0dXJuIGluZGV4IDwgbVRyYWNrcy5zaXplKCkgPyBtVHJhY2tzLmVkaXRJdGVtQXQoaW5kZXgpLm1NZXRhIDogTlVMTDsKLX0KLQotc3A8TWV0YURhdGE+IEFWSUV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoKSB7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0KLSAgICBpZiAobUluaXRDaGVjayA9PSBPSykgewotICAgICAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX0FWSSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1ldGE7Ci19Ci0KLXN0YXR1c190IEFWSUV4dHJhY3Rvcjo6cGFyc2VIZWFkZXJzKCkgewotICAgIG1UcmFja3MuY2xlYXIoKTsKLSAgICBtTW92aWVPZmZzZXQgPSAwOwotICAgIG1Gb3VuZEluZGV4ID0gZmFsc2U7Ci0gICAgbU9mZnNldHNBcmVBYnNvbHV0ZSA9IGZhbHNlOwotCi0gICAgc3NpemVfdCByZXMgPSBwYXJzZUNodW5rKDBsbCwgLTFsbCk7Ci0KLSAgICBpZiAocmVzIDwgMCkgewotICAgICAgICByZXR1cm4gKHN0YXR1c190KXJlczsKLSAgICB9Ci0KLSAgICBpZiAobU1vdmllT2Zmc2V0ID09IDBsbCB8fCAhbUZvdW5kSW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXNzaXplX3QgQVZJRXh0cmFjdG9yOjpwYXJzZUNodW5rKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IHNpemUsIGludCBkZXB0aCkgewotICAgIGlmIChzaXplID49IDAgJiYgc2l6ZSA8IDgpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1aW50OF90IHRtcFsxMl07Ci0gICAgc3NpemVfdCBuID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIHRtcCwgOCk7Ci0KLSAgICBpZiAobiA8IDgpIHsKLSAgICAgICAgcmV0dXJuIChuIDwgMCkgPyBuIDogKHNzaXplX3QpRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVpbnQzMl90IGZvdXJjYyA9IFUzMl9BVCh0bXApOwotICAgIHVpbnQzMl90IGNodW5rU2l6ZSA9IFUzMkxFX0FUKCZ0bXBbNF0pOwotCi0gICAgaWYgKHNpemUgPj0gMCAmJiBjaHVua1NpemUgKyA4ID4gc2l6ZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHN0YXRpYyBjb25zdCBjaGFyIGtQcmVmaXhbXSA9ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOwotICAgIGNvbnN0IGNoYXIgKnByZWZpeCA9ICZrUHJlZml4W3N0cmxlbihrUHJlZml4KSAtIDIgKiBkZXB0aF07Ci0KLSAgICBpZiAoZm91cmNjID09IEZPVVJDQygnTCcsICdJJywgJ1MnLCAnVCcpCi0gICAgICAgICAgICB8fCBmb3VyY2MgPT0gRk9VUkNDKCdSJywgJ0knLCAnRicsICdGJykpIHsKLSAgICAgICAgLy8gSXQncyBhIGxpc3Qgb2YgY2h1bmtzCi0KLSAgICAgICAgaWYgKHNpemUgPj0gMCAmJiBzaXplIDwgMTIpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBuID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQgKyA4LCAmdG1wWzhdLCA0KTsKLQotICAgICAgICBpZiAobiA8IDQpIHsKLSAgICAgICAgICAgIHJldHVybiAobiA8IDApID8gbiA6IChzc2l6ZV90KUVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIHVpbnQzMl90IHN1YkZvdXJjYyA9IFUzMl9BVCgmdG1wWzhdKTsKLQotICAgICAgICBBTE9HVigiJXMgb2Zmc2V0IDB4JTA4bGx4IExJU1Qgb2YgJyVjJWMlYyVjJywgc2l6ZSAlZCIsCi0gICAgICAgICAgICAgcHJlZml4LAotICAgICAgICAgICAgIG9mZnNldCwKLSAgICAgICAgICAgICAoY2hhcikoc3ViRm91cmNjID4+IDI0KSwKLSAgICAgICAgICAgICAoY2hhcikoKHN1YkZvdXJjYyA+PiAxNikgJiAweGZmKSwKLSAgICAgICAgICAgICAoY2hhcikoKHN1YkZvdXJjYyA+PiA4KSAmIDB4ZmYpLAotICAgICAgICAgICAgIChjaGFyKShzdWJGb3VyY2MgJiAweGZmKSwKLSAgICAgICAgICAgICBjaHVua1NpemUgLSA0KTsKLQotICAgICAgICBpZiAoc3ViRm91cmNjID09IEZPVVJDQygnbScsICdvJywgJ3YnLCAnaScpKSB7Ci0gICAgICAgICAgICAvLyBXZSdyZSBub3QgZ29pbmcgdG8gcGFyc2UgdGhpcywgYnV0IHdpbGwgdGFrZSBub3RlIG9mIHRoZQotICAgICAgICAgICAgLy8gb2Zmc2V0LgotCi0gICAgICAgICAgICBtTW92aWVPZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvZmY2NF90IHN1Yk9mZnNldCA9IG9mZnNldCArIDEyOwotICAgICAgICAgICAgb2ZmNjRfdCBzdWJPZmZzZXRMaW1pdCA9IHN1Yk9mZnNldCArIGNodW5rU2l6ZSAtIDQ7Ci0gICAgICAgICAgICB3aGlsZSAoc3ViT2Zmc2V0IDwgc3ViT2Zmc2V0TGltaXQpIHsKLSAgICAgICAgICAgICAgICBzc2l6ZV90IHJlcyA9Ci0gICAgICAgICAgICAgICAgICAgIHBhcnNlQ2h1bmsoc3ViT2Zmc2V0LCBzdWJPZmZzZXRMaW1pdCAtIHN1Yk9mZnNldCwgZGVwdGggKyAxKTsKLQotICAgICAgICAgICAgICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3ViT2Zmc2V0ICs9IHJlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCIlcyBvZmZzZXQgMHglMDhsbHggQ0hVTksgJyVjJWMlYyVjJyIsCi0gICAgICAgICAgICAgcHJlZml4LAotICAgICAgICAgICAgIG9mZnNldCwKLSAgICAgICAgICAgICAoY2hhcikoZm91cmNjID4+IDI0KSwKLSAgICAgICAgICAgICAoY2hhcikoKGZvdXJjYyA+PiAxNikgJiAweGZmKSwKLSAgICAgICAgICAgICAoY2hhcikoKGZvdXJjYyA+PiA4KSAmIDB4ZmYpLAotICAgICAgICAgICAgIChjaGFyKShmb3VyY2MgJiAweGZmKSk7Ci0KLSAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0KLSAgICAgICAgc3dpdGNoIChmb3VyY2MpIHsKLSAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAncicsICdoJyk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcGFyc2VTdHJlYW1IZWFkZXIob2Zmc2V0ICsgOCwgY2h1bmtTaXplKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAndCcsICdyJywgJ2YnKToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwYXJzZVN0cmVhbUZvcm1hdChvZmZzZXQgKyA4LCBjaHVua1NpemUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIEZPVVJDQygnaScsICdkJywgJ3gnLCAnMScpOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IHBhcnNlSW5kZXgob2Zmc2V0ICsgOCwgY2h1bmtTaXplKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoY2h1bmtTaXplICYgMSkgewotICAgICAgICArK2NodW5rU2l6ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gY2h1bmtTaXplICsgODsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKkdldE1JTUVUeXBlRm9ySGFuZGxlcih1aW50MzJfdCBoYW5kbGVyKSB7Ci0gICAgc3dpdGNoIChoYW5kbGVyKSB7Ci0gICAgICAgIC8vIFdvdy4uLiBzaGFtZWxlc3NseSBjb3BpZWQgZnJvbQotICAgICAgICAvLyBodHRwOi8vd2lraS5tdWx0aW1lZGlhLmN4L2luZGV4LnBocD90aXRsZT1JU09fTVBFRy00Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJzMnLCAnSScsICdWJywgJzInKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJzMnLCAnaScsICd2JywgJzInKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ0InLCAnTCcsICdaJywgJzAnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ0QnLCAnSScsICdHJywgJ0knKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ0QnLCAnSScsICdWJywgJzEnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2QnLCAnaScsICd2JywgJzEnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ0QnLCAnSScsICdWJywgJ1gnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2QnLCAnaScsICd2JywgJ3gnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ0QnLCAnWCcsICc1JywgJzAnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2QnLCAneCcsICc1JywgJzAnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ0QnLCAnWCcsICdHJywgJ00nKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ0UnLCAnTScsICc0JywgJ0EnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ0UnLCAnUCcsICdIJywgJ1YnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ0YnLCAnTScsICdQJywgJzQnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2YnLCAnbScsICdwJywgJzQnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ0YnLCAnVicsICdGJywgJ1cnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ0gnLCAnRCcsICdYJywgJzQnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAnZCcsICd4JywgJzQnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ00nLCAnNCcsICdDJywgJ0MnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ00nLCAnNCcsICdTJywgJzInKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnNCcsICdzJywgJzInKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ00nLCAnUCcsICc0JywgJ1MnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ3MnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ00nLCAnUCcsICc0JywgJ1YnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ3YnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ00nLCAnVicsICdYJywgJ00nKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ1InLCAnTScsICdQJywgJzQnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ1MnLCAnRScsICdEJywgJ0cnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ1MnLCAnTScsICdQJywgJzQnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ1UnLCAnTScsICdQJywgJzQnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ1cnLCAnVicsICcxJywgJ0YnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ1gnLCAnVicsICdJJywgJ0QnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ1gnLCAndicsICdpJywgJ0QnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3gnLCAndicsICdpJywgJ2QnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ1gnLCAnVicsICdJJywgJ1gnKToKLSAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNDsKLQotICAgICAgICAvLyBmcm9tIGh0dHA6Ly93aWtpLm11bHRpbWVkaWEuY3gvaW5kZXgucGhwP3RpdGxlPUgyNjQKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAndicsICdjJywgJzEnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2QnLCAnYScsICd2JywgJ2MnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3gnLCAnMicsICc2JywgJzQnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ0gnLCAnMicsICc2JywgJzQnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3YnLCAncycsICdzJywgJ2gnKToKLSAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19BVkM7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQVZJRXh0cmFjdG9yOjpwYXJzZVN0cmVhbUhlYWRlcihvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKLSAgICBpZiAoc2l6ZSAhPSA1NikgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmIChtVHJhY2tzLnNpemUoKSA+IDk5KSB7Ci0gICAgICAgIHJldHVybiAtRVJBTkdFOwotICAgIH0KLQotICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKHNpemUpOwotICAgIHNzaXplX3QgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwotCi0gICAgaWYgKG4gPCAoc3NpemVfdClzaXplKSB7Ci0gICAgICAgIHJldHVybiBuIDwgMCA/IChzdGF0dXNfdCluIDogRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKLQotICAgIHVpbnQzMl90IHR5cGUgPSBVMzJfQVQoZGF0YSk7Ci0gICAgdWludDMyX3QgaGFuZGxlciA9IFUzMl9BVCgmZGF0YVs0XSk7Ci0gICAgdWludDMyX3QgZmxhZ3MgPSBVMzJMRV9BVCgmZGF0YVs4XSk7Ci0KLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKLQotICAgIHVpbnQzMl90IHJhdGUgPSBVMzJMRV9BVCgmZGF0YVsyMF0pOwotICAgIHVpbnQzMl90IHNjYWxlID0gVTMyTEVfQVQoJmRhdGFbMjRdKTsKLQotICAgIHVpbnQzMl90IHNhbXBsZVNpemUgPSBVMzJMRV9BVCgmZGF0YVs0NF0pOwotCi0gICAgY29uc3QgY2hhciAqbWltZSA9IE5VTEw7Ci0gICAgVHJhY2s6OktpbmQga2luZCA9IFRyYWNrOjpPVEhFUjsKLQotICAgIGlmICh0eXBlID09IEZPVVJDQygndicsICdpJywgJ2QnLCAncycpKSB7Ci0gICAgICAgIG1pbWUgPSBHZXRNSU1FVHlwZUZvckhhbmRsZXIoaGFuZGxlcik7Ci0KLSAgICAgICAgaWYgKG1pbWUgJiYgc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1pbWUgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR1coIlVuc3VwcG9ydGVkIHZpZGVvIGZvcm1hdCAnJWMlYyVjJWMnIiwKLSAgICAgICAgICAgICAgICAgKGNoYXIpKGhhbmRsZXIgPj4gMjQpLAotICAgICAgICAgICAgICAgICAoY2hhcikoKGhhbmRsZXIgPj4gMTYpICYgMHhmZiksCi0gICAgICAgICAgICAgICAgIChjaGFyKSgoaGFuZGxlciA+PiA4KSAmIDB4ZmYpLAotICAgICAgICAgICAgICAgICAoY2hhcikoaGFuZGxlciAmIDB4ZmYpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGtpbmQgPSBUcmFjazo6VklERU87Ci0gICAgfSBlbHNlIGlmICh0eXBlID09IEZPVVJDQygnYScsICd1JywgJ2QnLCAncycpKSB7Ci0gICAgICAgIGlmIChtaW1lICYmIHN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIGtpbmQgPSBUcmFjazo6QVVESU87Ci0gICAgfQotCi0gICAgaWYgKCFtaW1lKSB7Ci0gICAgICAgIG1pbWUgPSAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIjsKLSAgICB9Ci0KLSAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbWltZSk7Ci0KLSAgICBtVHJhY2tzLnB1c2goKTsKLSAgICBUcmFjayAqdHJhY2sgPSAmbVRyYWNrcy5lZGl0SXRlbUF0KG1UcmFja3Muc2l6ZSgpIC0gMSk7Ci0KLSAgICB0cmFjay0+bU1ldGEgPSBtZXRhOwotICAgIHRyYWNrLT5tUmF0ZSA9IHJhdGU7Ci0gICAgdHJhY2stPm1TY2FsZSA9IHNjYWxlOwotICAgIHRyYWNrLT5tQnl0ZXNQZXJTYW1wbGUgPSBzYW1wbGVTaXplOwotICAgIHRyYWNrLT5tS2luZCA9IGtpbmQ7Ci0gICAgdHJhY2stPm1OdW1TeW5jU2FtcGxlcyA9IDA7Ci0gICAgdHJhY2stPm1UaHVtYm5haWxTYW1wbGVTaXplID0gMDsKLSAgICB0cmFjay0+bVRodW1ibmFpbFNhbXBsZUluZGV4ID0gLTE7Ci0gICAgdHJhY2stPm1NYXhTYW1wbGVTaXplID0gMDsKLSAgICB0cmFjay0+bUF2Z0NodW5rU2l6ZSA9IDEuMDsKLSAgICB0cmFjay0+bUZpcnN0Q2h1bmtTaXplID0gMDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQVZJRXh0cmFjdG9yOjpwYXJzZVN0cmVhbUZvcm1hdChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKLSAgICBpZiAobVRyYWNrcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBUcmFjayAqdHJhY2sgPSAmbVRyYWNrcy5lZGl0SXRlbUF0KG1UcmFja3Muc2l6ZSgpIC0gMSk7Ci0KLSAgICBpZiAodHJhY2stPm1LaW5kID09IFRyYWNrOjpPVEhFUikgewotICAgICAgICAvLyBXZSBkb24ndCBzdXBwb3J0IHRoaXMgY29udGVudCwgYnV0IHRoYXQncyBub3QgYSBwYXJzaW5nIGVycm9yLgotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgYm9vbCBpc1ZpZGVvID0gKHRyYWNrLT5tS2luZCA9PSBUcmFjazo6VklERU8pOwotCi0gICAgaWYgKChpc1ZpZGVvICYmIHNpemUgPCA0MCkgfHwgKCFpc1ZpZGVvICYmIHNpemUgPCAxNikpIHsKLSAgICAgICAgLy8gRXhwZWN0ZWQgYSBCSVRNQVBJTkZPIG9yIFdBVkVGT1JNQVQoRVgpIHN0cnVjdHVyZSwgcmVzcGVjdGl2ZWx5LgotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKHNpemUpOwotICAgIHNzaXplX3QgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwotCi0gICAgaWYgKG4gPCAoc3NpemVfdClzaXplKSB7Ci0gICAgICAgIHJldHVybiBuIDwgMCA/IChzdGF0dXNfdCluIDogRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKLQotICAgIGlmIChpc1ZpZGVvKSB7Ci0gICAgICAgIHVpbnQzMl90IHdpZHRoID0gVTMyTEVfQVQoJmRhdGFbNF0pOwotICAgICAgICB1aW50MzJfdCBoZWlnaHQgPSBVMzJMRV9BVCgmZGF0YVs4XSk7Ci0KLSAgICAgICAgdHJhY2stPm1NZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKLSAgICAgICAgdHJhY2stPm1NZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBoZWlnaHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHVpbnQzMl90IGZvcm1hdCA9IFUxNkxFX0FUKGRhdGEpOwotCi0gICAgICAgIGlmIChmb3JtYXQgPT0gMHg1NSkgewotICAgICAgICAgICAgdHJhY2stPm1NZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygiVW5zdXBwb3J0ZWQgYXVkaW8gZm9ybWF0ID0gMHglMDR4IiwgZm9ybWF0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHVpbnQzMl90IG51bUNoYW5uZWxzID0gVTE2TEVfQVQoJmRhdGFbMl0pOwotICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gVTMyTEVfQVQoJmRhdGFbNF0pOwotCi0gICAgICAgIHRyYWNrLT5tTWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtQ2hhbm5lbHMpOwotICAgICAgICB0cmFjay0+bU1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vIHN0YXRpYwotYm9vbCBBVklFeHRyYWN0b3I6OklzQ29ycmVjdENodW5rVHlwZSgKLSAgICAgICAgc3NpemVfdCB0cmFja0luZGV4LCBUcmFjazo6S2luZCBraW5kLCB1aW50MzJfdCBjaHVua1R5cGUpIHsKLSAgICB1aW50MzJfdCBjaHVua0Jhc2UgPSBjaHVua1R5cGUgJiAweGZmZmY7Ci0KLSAgICBzd2l0Y2ggKGtpbmQpIHsKLSAgICAgICAgY2FzZSBUcmFjazo6VklERU86Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjaHVua0Jhc2UgIT0gRk9VUkNDKDAsIDAsICdkJywgJ2MnKQotICAgICAgICAgICAgICAgICAgICAmJiBjaHVua0Jhc2UgIT0gRk9VUkNDKDAsIDAsICdkJywgJ2InKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBUcmFjazo6QVVESU86Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjaHVua0Jhc2UgIT0gRk9VUkNDKDAsIDAsICd3JywgJ2InKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmICh0cmFja0luZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICB1aW50OF90IGhpID0gY2h1bmtUeXBlID4+IDI0OwotICAgIHVpbnQ4X3QgbG8gPSAoY2h1bmtUeXBlID4+IDE2KSAmIDB4ZmY7Ci0KLSAgICBpZiAoaGkgPCAnMCcgfHwgaGkgPiAnOScgfHwgbG8gPCAnMCcgfHwgbG8gPiAnOScpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICh0cmFja0luZGV4ICE9ICgxMCAqIChoaSAtICcwJykgKyAobG8gLSAnMCcpKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXR1c190IEFWSUV4dHJhY3Rvcjo6cGFyc2VJbmRleChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKLSAgICBpZiAoKHNpemUgJSAxNikgIT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKHNpemUpOwotICAgIHNzaXplX3QgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwotCi0gICAgaWYgKG4gPCAoc3NpemVfdClzaXplKSB7Ci0gICAgICAgIHJldHVybiBuIDwgMCA/IChzdGF0dXNfdCluIDogRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKLQotICAgIHdoaWxlIChzaXplID4gMCkgewotICAgICAgICB1aW50MzJfdCBjaHVua1R5cGUgPSBVMzJfQVQoZGF0YSk7Ci0KLSAgICAgICAgdWludDhfdCBoaSA9IGNodW5rVHlwZSA+PiAyNDsKLSAgICAgICAgdWludDhfdCBsbyA9IChjaHVua1R5cGUgPj4gMTYpICYgMHhmZjsKLQotICAgICAgICBpZiAoaGkgPCAnMCcgfHwgaGkgPiAnOScgfHwgbG8gPCAnMCcgfHwgbG8gPiAnOScpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgdHJhY2tJbmRleCA9IDEwICogKGhpIC0gJzAnKSArIChsbyAtICcwJyk7Ci0KLSAgICAgICAgaWYgKHRyYWNrSW5kZXggPj0gbVRyYWNrcy5zaXplKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBUcmFjayAqdHJhY2sgPSAmbVRyYWNrcy5lZGl0SXRlbUF0KHRyYWNrSW5kZXgpOwotCi0gICAgICAgIGlmICghSXNDb3JyZWN0Q2h1bmtUeXBlKC0xLCB0cmFjay0+bUtpbmQsIGNodW5rVHlwZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodHJhY2stPm1LaW5kID09IFRyYWNrOjpPVEhFUikgewotICAgICAgICAgICAgZGF0YSArPSAxNjsKLSAgICAgICAgICAgIHNpemUgLT0gMTY7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHVpbnQzMl90IGZsYWdzID0gVTMyTEVfQVQoJmRhdGFbNF0pOwotICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSBVMzJMRV9BVCgmZGF0YVs4XSk7Ci0gICAgICAgIHVpbnQzMl90IGNodW5rU2l6ZSA9IFUzMkxFX0FUKCZkYXRhWzEyXSk7Ci0KLSAgICAgICAgaWYgKGNodW5rU2l6ZSA+IHRyYWNrLT5tTWF4U2FtcGxlU2l6ZSkgewotICAgICAgICAgICAgdHJhY2stPm1NYXhTYW1wbGVTaXplID0gY2h1bmtTaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJhY2stPm1TYW1wbGVzLnB1c2goKTsKLQotICAgICAgICBTYW1wbGVJbmZvICppbmZvID0KLSAgICAgICAgICAgICZ0cmFjay0+bVNhbXBsZXMuZWRpdEl0ZW1BdCh0cmFjay0+bVNhbXBsZXMuc2l6ZSgpIC0gMSk7Ci0KLSAgICAgICAgaW5mby0+bU9mZnNldCA9IG9mZnNldDsKLSAgICAgICAgaW5mby0+bUlzS2V5ID0gKGZsYWdzICYgMHgxMCkgIT0gMDsKLQotICAgICAgICBpZiAoaW5mby0+bUlzS2V5KSB7Ci0gICAgICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhOdW1TeW5jU2FtcGxlc1RvU2NhbiA9IDIwOwotCi0gICAgICAgICAgICBpZiAodHJhY2stPm1OdW1TeW5jU2FtcGxlcyA8IGtNYXhOdW1TeW5jU2FtcGxlc1RvU2NhbikgewotICAgICAgICAgICAgICAgIGlmIChjaHVua1NpemUgPiB0cmFjay0+bVRodW1ibmFpbFNhbXBsZVNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1UaHVtYm5haWxTYW1wbGVTaXplID0gY2h1bmtTaXplOwotCi0gICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tVGh1bWJuYWlsU2FtcGxlSW5kZXggPQotICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1TYW1wbGVzLnNpemUoKSAtIDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICArK3RyYWNrLT5tTnVtU3luY1NhbXBsZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBkYXRhICs9IDE2OwotICAgICAgICBzaXplIC09IDE2OwotICAgIH0KLQotICAgIGlmICghbVRyYWNrcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgb2ZmNjRfdCBvZmZzZXQ7Ci0gICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBib29sIGlzS2V5OwotICAgICAgICBpbnQ2NF90IHRpbWVVczsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gZ2V0U2FtcGxlSW5mbygwLCAwLCAmb2Zmc2V0LCAmc2l6ZSwgJmlzS2V5LCAmdGltZVVzKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBtT2Zmc2V0c0FyZUFic29sdXRlID0gIW1PZmZzZXRzQXJlQWJzb2x1dGU7Ci0gICAgICAgICAgICBlcnIgPSBnZXRTYW1wbGVJbmZvKDAsIDAsICZvZmZzZXQsICZzaXplLCAmaXNLZXksICZ0aW1lVXMpOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEFMT0dWKCJDaHVuayBvZmZzZXRzIGFyZSAlcyIsCi0gICAgICAgICAgICAgbU9mZnNldHNBcmVBYnNvbHV0ZSA/ICJhYnNvbHV0ZSIgOiAibW92aWUtY2h1bmsgcmVsYXRpdmUiKTsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgVHJhY2sgKnRyYWNrID0gJm1UcmFja3MuZWRpdEl0ZW1BdChpKTsKLQotICAgICAgICBpZiAodHJhY2stPm1CeXRlc1BlclNhbXBsZSA+IDApIHsKLSAgICAgICAgICAgIC8vIEFzc3VtZSBhbGwgY2h1bmtzIGFyZSByb3VnaGx5IHRoZSBzYW1lIHNpemUgZm9yIG5vdy4KLQotICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgYXZnLiBzaXplIG9mIHRoZSBmaXJzdCAxMjggY2h1bmtzIChpZiB0aGVyZSBhcmUKLSAgICAgICAgICAgIC8vIHRoYXQgbWFueSksIGJ1dCBleGNsdWRlIHRoZSBzaXplIG9mIHRoZSBmaXJzdCBvbmUsIHNpbmNlCi0gICAgICAgICAgICAvLyBpdCBtYXkgYmUgYW4gb3V0bGllci4KLSAgICAgICAgICAgIHNpemVfdCBudW1TYW1wbGVzVG9BdmVyYWdlID0gdHJhY2stPm1TYW1wbGVzLnNpemUoKTsKLSAgICAgICAgICAgIGlmIChudW1TYW1wbGVzVG9BdmVyYWdlID4gMjU2KSB7Ci0gICAgICAgICAgICAgICAgbnVtU2FtcGxlc1RvQXZlcmFnZSA9IDI1NjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZG91YmxlIGF2Z0NodW5rU2l6ZSA9IDA7Ci0gICAgICAgICAgICBzaXplX3QgajsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPD0gbnVtU2FtcGxlc1RvQXZlcmFnZTsgKytqKSB7Ci0gICAgICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgICAgICAgICAgYm9vbCBpc0tleTsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IGR1bW15OwotCi0gICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0KLSAgICAgICAgICAgICAgICAgICAgZ2V0U2FtcGxlSW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsICZzaXplLCAmaXNLZXksICZkdW1teSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGogPT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0cmFjay0+bUZpcnN0Q2h1bmtTaXplID0gc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYXZnQ2h1bmtTaXplICs9IHNpemU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGF2Z0NodW5rU2l6ZSAvPSBudW1TYW1wbGVzVG9BdmVyYWdlOwotCi0gICAgICAgICAgICB0cmFjay0+bUF2Z0NodW5rU2l6ZSA9IGF2Z0NodW5rU2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLAotICAgICAgICAgICAgICAgICBnZXRTYW1wbGVUaW1lKGksIHRyYWNrLT5tU2FtcGxlcy5zaXplKCkgLSAxLCAmZHVyYXRpb25VcykpOwotCi0gICAgICAgIEFMT0dWKCJ0cmFjayAlZCBkdXJhdGlvbiA9ICUuMmYgc2VjcyIsIGksIGR1cmF0aW9uVXMgLyAxRTYpOwotCi0gICAgICAgIHRyYWNrLT5tTWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKLSAgICAgICAgdHJhY2stPm1NZXRhLT5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCB0cmFjay0+bU1heFNhbXBsZVNpemUpOwotCi0gICAgICAgIGNvbnN0IGNoYXIgKnRtcDsKLSAgICAgICAgQ0hFQ0sodHJhY2stPm1NZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZ0bXApKTsKLQotICAgICAgICBBU3RyaW5nIG1pbWUgPSB0bXA7Ci0KLSAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZS5jX3N0cigpLCA2KSkgewotICAgICAgICAgICAgaWYgKHRyYWNrLT5tVGh1bWJuYWlsU2FtcGxlSW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIGludDY0X3QgdGh1bWJuYWlsVGltZVVzOwotICAgICAgICAgICAgICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywKLSAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTYW1wbGVUaW1lKGksIHRyYWNrLT5tVGh1bWJuYWlsU2FtcGxlSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGh1bWJuYWlsVGltZVVzKSk7Ci0KLSAgICAgICAgICAgICAgICB0cmFjay0+bU1ldGEtPnNldEludDY0KGtLZXlUaHVtYm5haWxUaW1lLCB0aHVtYm5haWxUaW1lVXMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUuY19zdHIoKSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gYWRkTVBFRzRDb2RlY1NwZWNpZmljRGF0YShpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZS5jX3N0cigpLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gYWRkSDI2NENvZGVjU3BlY2lmaWNEYXRhKGkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIG1Gb3VuZEluZGV4ID0gdHJ1ZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdGljIHNpemVfdCBHZXRTaXplV2lkdGgoc2l6ZV90IHgpIHsKLSAgICBzaXplX3QgbiA9IDE7Ci0gICAgd2hpbGUgKHggPiAxMjcpIHsKLSAgICAgICAgKytuOwotICAgICAgICB4ID4+PSA3OwotICAgIH0KLSAgICByZXR1cm4gbjsKLX0KLQotc3RhdGljIHVpbnQ4X3QgKkVuY29kZVNpemUodWludDhfdCAqZHN0LCBzaXplX3QgeCkgewotICAgIHdoaWxlICh4ID4gMTI3KSB7Ci0gICAgICAgICpkc3QrKyA9ICh4ICYgMHg3ZikgfCAweDgwOwotICAgICAgICB4ID4+PSA3OwotICAgIH0KLSAgICAqZHN0KysgPSB4OwotICAgIHJldHVybiBkc3Q7Ci19Ci0KLXNwPEFCdWZmZXI+IE1ha2VNUEVHNFZpZGVvQ29kZWNTcGVjaWZpY0RhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmNvbmZpZykgewotICAgIHNpemVfdCBsZW4xID0gY29uZmlnLT5zaXplKCkgKyBHZXRTaXplV2lkdGgoY29uZmlnLT5zaXplKCkpICsgMTsKLSAgICBzaXplX3QgbGVuMiA9IGxlbjEgKyBHZXRTaXplV2lkdGgobGVuMSkgKyAxICsgMTM7Ci0gICAgc2l6ZV90IGxlbjMgPSBsZW4yICsgR2V0U2l6ZVdpZHRoKGxlbjIpICsgMSArIDM7Ci0KLSAgICBzcDxBQnVmZmVyPiBjc2QgPSBuZXcgQUJ1ZmZlcihsZW4zKTsKLSAgICB1aW50OF90ICpkc3QgPSBjc2QtPmRhdGEoKTsKLSAgICAqZHN0KysgPSAweDAzOwotICAgIGRzdCA9IEVuY29kZVNpemUoZHN0LCBsZW4yICsgMyk7Ci0gICAgKmRzdCsrID0gMHgwMDsgIC8vIEVTX0lECi0gICAgKmRzdCsrID0gMHgwMDsKLSAgICAqZHN0KysgPSAweDAwOyAgLy8gc3RyZWFtRGVwZW5kZW5jZUZsYWcsIFVSTF9GbGFnLCBPQ1JzdHJlYW1GbGFnCi0KLSAgICAqZHN0KysgPSAweDA0OwotICAgIGRzdCA9IEVuY29kZVNpemUoZHN0LCBsZW4xICsgMTMpOwotICAgICpkc3QrKyA9IDB4MDE7ICAvLyBWaWRlbyBJU08vSUVDIDE0NDk2LTIgU2ltcGxlIFByb2ZpbGUKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDEyOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gMHgwMDsKLSAgICB9Ci0KLSAgICAqZHN0KysgPSAweDA1OwotICAgIGRzdCA9IEVuY29kZVNpemUoZHN0LCBjb25maWctPnNpemUoKSk7Ci0gICAgbWVtY3B5KGRzdCwgY29uZmlnLT5kYXRhKCksIGNvbmZpZy0+c2l6ZSgpKTsKLSAgICBkc3QgKz0gY29uZmlnLT5zaXplKCk7Ci0KLSAgICAvLyBoZXhkdW1wKGNzZC0+ZGF0YSgpLCBjc2QtPnNpemUoKSk7Ci0KLSAgICByZXR1cm4gY3NkOwotfQotCi1zdGF0dXNfdCBBVklFeHRyYWN0b3I6OmFkZE1QRUc0Q29kZWNTcGVjaWZpY0RhdGEoc2l6ZV90IHRyYWNrSW5kZXgpIHsKLSAgICBUcmFjayAqdHJhY2sgPSAmbVRyYWNrcy5lZGl0SXRlbUF0KHRyYWNrSW5kZXgpOwotCi0gICAgb2ZmNjRfdCBvZmZzZXQ7Ci0gICAgc2l6ZV90IHNpemU7Ci0gICAgYm9vbCBpc0tleTsKLSAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBzdGF0dXNfdCBlcnIgPQotICAgICAgICBnZXRTYW1wbGVJbmZvKHRyYWNrSW5kZXgsIDAsICZvZmZzZXQsICZzaXplLCAmaXNLZXksICZ0aW1lVXMpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKHNpemUpOwotICAgIHNzaXplX3QgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwotCi0gICAgaWYgKG4gPCAoc3NpemVfdClzaXplKSB7Ci0gICAgICAgIHJldHVybiBuIDwgMCA/IChzdGF0dXNfdCluIDogRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIC8vIEV4dHJhY3QgZXZlcnl0aGluZyB1cCB0byB0aGUgZmlyc3QgVk9QIHN0YXJ0IGNvZGUgZnJvbSB0aGUgZmlyc3QKLSAgICAvLyBmcmFtZSdzIGVuY29kZWQgZGF0YSBhbmQgdXNlIGl0IHRvIGNvbnN0cnVjdCBhbiBFU0RTIHdpdGggdGhlCi0gICAgLy8gY29kZWMgc3BlY2lmaWMgZGF0YS4KLQotICAgIHNpemVfdCBpID0gMDsKLSAgICBib29sIGZvdW5kID0gZmFsc2U7Ci0gICAgd2hpbGUgKGkgKyAzIDwgYnVmZmVyLT5zaXplKCkpIHsKLSAgICAgICAgaWYgKCFtZW1jbXAoIlx4MDBceDAwXHgwMVx4YjYiLCAmYnVmZmVyLT5kYXRhKClbaV0sIDQpKSB7Ci0gICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgICsraTsKLSAgICB9Ci0KLSAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgYnVmZmVyLT5zZXRSYW5nZSgwLCBpKTsKLQotICAgIHNwPEFCdWZmZXI+IGNzZCA9IE1ha2VNUEVHNFZpZGVvQ29kZWNTcGVjaWZpY0RhdGEoYnVmZmVyKTsKLSAgICB0cmFjay0+bU1ldGEtPnNldERhdGEoa0tleUVTRFMsIGtUeXBlRVNEUywgY3NkLT5kYXRhKCksIGNzZC0+c2l6ZSgpKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQVZJRXh0cmFjdG9yOjphZGRIMjY0Q29kZWNTcGVjaWZpY0RhdGEoc2l6ZV90IHRyYWNrSW5kZXgpIHsKLSAgICBUcmFjayAqdHJhY2sgPSAmbVRyYWNrcy5lZGl0SXRlbUF0KHRyYWNrSW5kZXgpOwotCi0gICAgb2ZmNjRfdCBvZmZzZXQ7Ci0gICAgc2l6ZV90IHNpemU7Ci0gICAgYm9vbCBpc0tleTsKLSAgICBpbnQ2NF90IHRpbWVVczsKLQotICAgIC8vIEV4dHJhY3QgY29kZWMgc3BlY2lmaWMgZGF0YSBmcm9tIHRoZSBmaXJzdCBub24tZW1wdHkgc2FtcGxlLgotCi0gICAgc2l6ZV90IHNhbXBsZUluZGV4ID0gMDsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9Ci0gICAgICAgICAgICBnZXRTYW1wbGVJbmZvKAotICAgICAgICAgICAgICAgICAgICB0cmFja0luZGV4LCBzYW1wbGVJbmRleCwgJm9mZnNldCwgJnNpemUsICZpc0tleSwgJnRpbWVVcyk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzaXplID4gMCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICArK3NhbXBsZUluZGV4OwotICAgIH0KLQotICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKHNpemUpOwotICAgIHNzaXplX3QgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwotCi0gICAgaWYgKG4gPCAoc3NpemVfdClzaXplKSB7Ci0gICAgICAgIHJldHVybiBuIDwgMCA/IChzdGF0dXNfdCluIDogRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKGJ1ZmZlcik7Ci0KLSAgICBpZiAobWV0YSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gZXh0cmFjdCBBVkMgY29kZWMgc3BlY2lmaWMgZGF0YSIpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmd2lkdGgpKTsKLSAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmhlaWdodCkpOwotCi0gICAgdWludDMyX3QgdHlwZTsKLSAgICBjb25zdCB2b2lkICpjc2Q7Ci0gICAgc2l6ZV90IGNzZFNpemU7Ci0gICAgQ0hFQ0sobWV0YS0+ZmluZERhdGEoa0tleUFWQ0MsICZ0eXBlLCAmY3NkLCAmY3NkU2l6ZSkpOwotCi0gICAgdHJhY2stPm1NZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKLSAgICB0cmFjay0+bU1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7Ci0gICAgdHJhY2stPm1NZXRhLT5zZXREYXRhKGtLZXlBVkNDLCB0eXBlLCBjc2QsIGNzZFNpemUpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBBVklFeHRyYWN0b3I6OmdldFNhbXBsZUluZm8oCi0gICAgICAgIHNpemVfdCB0cmFja0luZGV4LCBzaXplX3Qgc2FtcGxlSW5kZXgsCi0gICAgICAgIG9mZjY0X3QgKm9mZnNldCwgc2l6ZV90ICpzaXplLCBib29sICppc0tleSwKLSAgICAgICAgaW50NjRfdCAqc2FtcGxlVGltZVVzKSB7Ci0gICAgaWYgKHRyYWNrSW5kZXggPj0gbVRyYWNrcy5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIC1FUkFOR0U7Ci0gICAgfQotCi0gICAgY29uc3QgVHJhY2sgJnRyYWNrID0gbVRyYWNrcy5pdGVtQXQodHJhY2tJbmRleCk7Ci0KLSAgICBpZiAoc2FtcGxlSW5kZXggPj0gdHJhY2subVNhbXBsZXMuc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiAtRVJBTkdFOwotICAgIH0KLQotICAgIGNvbnN0IFNhbXBsZUluZm8gJmluZm8gPSB0cmFjay5tU2FtcGxlcy5pdGVtQXQoc2FtcGxlSW5kZXgpOwotCi0gICAgaWYgKCFtT2Zmc2V0c0FyZUFic29sdXRlKSB7Ci0gICAgICAgICpvZmZzZXQgPSBpbmZvLm1PZmZzZXQgKyBtTW92aWVPZmZzZXQgKyA4OwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpvZmZzZXQgPSBpbmZvLm1PZmZzZXQ7Ci0gICAgfQotCi0gICAgKnNpemUgPSAwOwotCi0gICAgdWludDhfdCB0bXBbOF07Ci0gICAgc3NpemVfdCBuID0gbURhdGFTb3VyY2UtPnJlYWRBdCgqb2Zmc2V0LCB0bXAsIDgpOwotCi0gICAgaWYgKG4gPCA4KSB7Ci0gICAgICAgIHJldHVybiBuIDwgMCA/IChzdGF0dXNfdCluIDogKHN0YXR1c190KUVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBjaHVua1R5cGUgPSBVMzJfQVQodG1wKTsKLQotICAgIGlmICghSXNDb3JyZWN0Q2h1bmtUeXBlKHRyYWNrSW5kZXgsIHRyYWNrLm1LaW5kLCBjaHVua1R5cGUpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgKm9mZnNldCArPSA4OwotICAgICpzaXplID0gVTMyTEVfQVQoJnRtcFs0XSk7Ci0KLSAgICAqaXNLZXkgPSBpbmZvLm1Jc0tleTsKLQotICAgIGlmICh0cmFjay5tQnl0ZXNQZXJTYW1wbGUgPiAwKSB7Ci0gICAgICAgIHNpemVfdCBzYW1wbGVTdGFydEluQnl0ZXM7Ci0gICAgICAgIGlmIChzYW1wbGVJbmRleCA9PSAwKSB7Ci0gICAgICAgICAgICBzYW1wbGVTdGFydEluQnl0ZXMgPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2FtcGxlU3RhcnRJbkJ5dGVzID0KLSAgICAgICAgICAgICAgICB0cmFjay5tRmlyc3RDaHVua1NpemUgKyB0cmFjay5tQXZnQ2h1bmtTaXplICogKHNhbXBsZUluZGV4IC0gMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzYW1wbGVJbmRleCA9IHNhbXBsZVN0YXJ0SW5CeXRlcyAvIHRyYWNrLm1CeXRlc1BlclNhbXBsZTsKLSAgICB9Ci0KLSAgICAqc2FtcGxlVGltZVVzID0gKHNhbXBsZUluZGV4ICogMTAwMDAwMGxsICogdHJhY2subVJhdGUpIC8gdHJhY2subVNjYWxlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBBVklFeHRyYWN0b3I6OmdldFNhbXBsZVRpbWUoCi0gICAgICAgIHNpemVfdCB0cmFja0luZGV4LCBzaXplX3Qgc2FtcGxlSW5kZXgsIGludDY0X3QgKnNhbXBsZVRpbWVVcykgewotICAgIG9mZjY0X3Qgb2Zmc2V0OwotICAgIHNpemVfdCBzaXplOwotICAgIGJvb2wgaXNLZXk7Ci0gICAgcmV0dXJuIGdldFNhbXBsZUluZm8oCi0gICAgICAgICAgICB0cmFja0luZGV4LCBzYW1wbGVJbmRleCwgJm9mZnNldCwgJnNpemUsICZpc0tleSwgc2FtcGxlVGltZVVzKTsKLX0KLQotc3RhdHVzX3QgQVZJRXh0cmFjdG9yOjpnZXRTYW1wbGVJbmRleEF0VGltZSgKLSAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXgsCi0gICAgICAgIGludDY0X3QgdGltZVVzLCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGUsCi0gICAgICAgIHNpemVfdCAqc2FtcGxlSW5kZXgpIGNvbnN0IHsKLSAgICBpZiAodHJhY2tJbmRleCA+PSBtVHJhY2tzLnNpemUoKSkgewotICAgICAgICByZXR1cm4gLUVSQU5HRTsKLSAgICB9Ci0KLSAgICBjb25zdCBUcmFjayAmdHJhY2sgPSBtVHJhY2tzLml0ZW1BdCh0cmFja0luZGV4KTsKLQotICAgIHNzaXplX3QgY2xvc2VzdFNhbXBsZUluZGV4OwotCi0gICAgaWYgKHRyYWNrLm1CeXRlc1BlclNhbXBsZSA+IDApIHsKLSAgICAgICAgc2l6ZV90IGNsb3Nlc3RCeXRlT2Zmc2V0ID0KLSAgICAgICAgICAgICh0aW1lVXMgKiB0cmFjay5tQnl0ZXNQZXJTYW1wbGUpCi0gICAgICAgICAgICAgICAgLyB0cmFjay5tUmF0ZSAqIHRyYWNrLm1TY2FsZSAvIDEwMDAwMDBsbDsKLQotICAgICAgICBpZiAoY2xvc2VzdEJ5dGVPZmZzZXQgPD0gdHJhY2subUZpcnN0Q2h1bmtTaXplKSB7Ci0gICAgICAgICAgICBjbG9zZXN0U2FtcGxlSW5kZXggPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2xvc2VzdFNhbXBsZUluZGV4ID0KLSAgICAgICAgICAgICAgICAoY2xvc2VzdEJ5dGVPZmZzZXQgLSB0cmFjay5tRmlyc3RDaHVua1NpemUpCi0gICAgICAgICAgICAgICAgICAgIC8gdHJhY2subUF2Z0NodW5rU2l6ZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEVhY2ggY2h1bmsgY29udGFpbnMgYSBzaW5nbGUgc2FtcGxlLgotICAgICAgICBjbG9zZXN0U2FtcGxlSW5kZXggPSB0aW1lVXMgLyB0cmFjay5tUmF0ZSAqIHRyYWNrLm1TY2FsZSAvIDEwMDAwMDBsbDsKLSAgICB9Ci0KLSAgICBzc2l6ZV90IG51bVNhbXBsZXMgPSB0cmFjay5tU2FtcGxlcy5zaXplKCk7Ci0KLSAgICBpZiAoY2xvc2VzdFNhbXBsZUluZGV4IDwgMCkgewotICAgICAgICBjbG9zZXN0U2FtcGxlSW5kZXggPSAwOwotICAgIH0gZWxzZSBpZiAoY2xvc2VzdFNhbXBsZUluZGV4ID49IG51bVNhbXBsZXMpIHsKLSAgICAgICAgY2xvc2VzdFNhbXBsZUluZGV4ID0gbnVtU2FtcGxlcyAtIDE7Ci0gICAgfQotCi0gICAgaWYgKG1vZGUgPT0gTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QpIHsKLSAgICAgICAgKnNhbXBsZUluZGV4ID0gY2xvc2VzdFNhbXBsZUluZGV4OwotCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBzc2l6ZV90IHByZXZTeW5jU2FtcGxlSW5kZXggPSBjbG9zZXN0U2FtcGxlSW5kZXg7Ci0gICAgd2hpbGUgKHByZXZTeW5jU2FtcGxlSW5kZXggPj0gMCkgewotICAgICAgICBjb25zdCBTYW1wbGVJbmZvICZpbmZvID0KLSAgICAgICAgICAgIHRyYWNrLm1TYW1wbGVzLml0ZW1BdChwcmV2U3luY1NhbXBsZUluZGV4KTsKLQotICAgICAgICBpZiAoaW5mby5tSXNLZXkpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLS1wcmV2U3luY1NhbXBsZUluZGV4OwotICAgIH0KLQotICAgIHNzaXplX3QgbmV4dFN5bmNTYW1wbGVJbmRleCA9IGNsb3Nlc3RTYW1wbGVJbmRleDsKLSAgICB3aGlsZSAobmV4dFN5bmNTYW1wbGVJbmRleCA8IG51bVNhbXBsZXMpIHsKLSAgICAgICAgY29uc3QgU2FtcGxlSW5mbyAmaW5mbyA9Ci0gICAgICAgICAgICB0cmFjay5tU2FtcGxlcy5pdGVtQXQobmV4dFN5bmNTYW1wbGVJbmRleCk7Ci0KLSAgICAgICAgaWYgKGluZm8ubUlzS2V5KSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgICsrbmV4dFN5bmNTYW1wbGVJbmRleDsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKG1vZGUpIHsKLSAgICAgICAgY2FzZSBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQzoKLSAgICAgICAgewotICAgICAgICAgICAgKnNhbXBsZUluZGV4ID0gcHJldlN5bmNTYW1wbGVJbmRleDsKLQotICAgICAgICAgICAgcmV0dXJuIHByZXZTeW5jU2FtcGxlSW5kZXggPj0gMCA/IE9LIDogVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQzoKLSAgICAgICAgewotICAgICAgICAgICAgKnNhbXBsZUluZGV4ID0gbmV4dFN5bmNTYW1wbGVJbmRleDsKLQotICAgICAgICAgICAgcmV0dXJuIG5leHRTeW5jU2FtcGxlSW5kZXggPCBudW1TYW1wbGVzID8gT0sgOiBVTktOT1dOX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocHJldlN5bmNTYW1wbGVJbmRleCA8IDAgJiYgbmV4dFN5bmNTYW1wbGVJbmRleCA+PSBudW1TYW1wbGVzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcmV2U3luY1NhbXBsZUluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICpzYW1wbGVJbmRleCA9IG5leHRTeW5jU2FtcGxlSW5kZXg7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobmV4dFN5bmNTYW1wbGVJbmRleCA+PSBudW1TYW1wbGVzKSB7Ci0gICAgICAgICAgICAgICAgKnNhbXBsZUluZGV4ID0gcHJldlN5bmNTYW1wbGVJbmRleDsKLSAgICAgICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNpemVfdCBkaXN0MSA9IGNsb3Nlc3RTYW1wbGVJbmRleCAtIHByZXZTeW5jU2FtcGxlSW5kZXg7Ci0gICAgICAgICAgICBzaXplX3QgZGlzdDIgPSBuZXh0U3luY1NhbXBsZUluZGV4IC0gY2xvc2VzdFNhbXBsZUluZGV4OwotCi0gICAgICAgICAgICAqc2FtcGxlSW5kZXggPQotICAgICAgICAgICAgICAgIChkaXN0MSA8IGRpc3QyKSA/IHByZXZTeW5jU2FtcGxlSW5kZXggOiBuZXh0U3luY1NhbXBsZUluZGV4OwotCi0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVFJFU1BBU1MoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotYm9vbCBTbmlmZkFWSSgKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICBzcDxBTWVzc2FnZT4gKikgewotICAgIGNoYXIgdG1wWzEyXTsKLSAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgdG1wLCAxMikgPCAxMikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCFtZW1jbXAodG1wLCAiUklGRiIsIDQpICYmICFtZW1jbXAoJnRtcFs4XSwgIkFWSSAiLCA0KSkgewotICAgICAgICBtaW1lVHlwZS0+c2V0VG8oTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX0FWSSk7Ci0KLSAgICAgICAgLy8gSnVzdCBhIHRhZCBvdmVyIHRoZSBtcDMgZXh0cmFjdG9yJ3MgY29uZmlkZW5jZSwgc2luY2UKLSAgICAgICAgLy8gdGhlc2UgLmF2aSBmaWxlcyBtYXkgY29udGFpbiAubXAzIGNvbnRlbnQgdGhhdCBvdGhlcndpc2Ugd291bGQKLSAgICAgICAgLy8gbWlzdGFrZW5seSBsZWFkIHRvIHVzIGlkZW50aWZ5aW5nIHRoZSBlbnRpcmUgZmlsZSBhcyBhIC5tcDMgZmlsZS4KLSAgICAgICAgKmNvbmZpZGVuY2UgPSAwLjIxOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwCmluZGV4IGM4ZDRlNGEuLjQ4ZTM1MWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icApAQCAtNCwzNyArNCwxMTQgQEAKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogfQogCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAorCisgICAgc3JjczogWyJFU0RTLmNwcCJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorCisgICAgc2hhcmVkX2xpYnM6IFsibGlibWVkaWEiXSwKK30KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKKworICAgIHNyY3M6IFsiTWV0YURhdGFVdGlscy5jcHAiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBkaWFnOiB7CisgICAgICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKKworICAgIHNoYXJlZF9saWJzOiBbImxpYm1lZGlhIl0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfY29kZWNiYXNlIiwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorCisgICAgc3JjczogWworICAgICAgICAiQ29kZWNCYXNlLmNwcCIsCisgICAgICAgICJGcmFtZVJlbmRlclRyYWNrZXIuY3BwIiwKKyAgICAgICAgIk1lZGlhQ29kZWNMaXN0V3JpdGVyLmNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzLm5hdGl2ZUAxLjAiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBkaWFnOiB7CisgICAgICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodCIsCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJBQ29kZWMuY3BwIiwKICAgICAgICAgIkFDb2RlY0J1ZmZlckNoYW5uZWwuY3BwIiwKLSAgICAgICAgIkFBQ0V4dHJhY3Rvci5jcHAiLAogICAgICAgICAiQUFDV3JpdGVyLmNwcCIsCi0gICAgICAgICJBTVJFeHRyYWN0b3IuY3BwIiwKICAgICAgICAgIkFNUldyaXRlci5jcHAiLAogICAgICAgICAiQXVkaW9QbGF5ZXIuY3BwIiwKKyAgICAgICAgIkF1ZGlvUHJlc2VudGF0aW9uSW5mby5jcHAiLAogICAgICAgICAiQXVkaW9Tb3VyY2UuY3BwIiwKICAgICAgICAgIkJ1ZmZlckltcGwuY3BwIiwKLSAgICAgICAgIkNvZGVjQmFzZS5jcHAiLAogICAgICAgICAiQ2FsbGJhY2tEYXRhU291cmNlLmNwcCIsCisgICAgICAgICJDYWxsYmFja01lZGlhU291cmNlLmNwcCIsCiAgICAgICAgICJDYW1lcmFTb3VyY2UuY3BwIiwKICAgICAgICAgIkNhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAiLAogICAgICAgICAiRGF0YUNvbnZlcnRlci5jcHAiLAotICAgICAgICAiRGF0YVNvdXJjZS5jcHAiLAorICAgICAgICAiRGF0YVNvdXJjZUZhY3RvcnkuY3BwIiwKICAgICAgICAgIkRhdGFVUklTb3VyY2UuY3BwIiwKLSAgICAgICAgIkVTRFMuY3BwIiwKICAgICAgICAgIkZpbGVTb3VyY2UuY3BwIiwKLSAgICAgICAgIkZMQUNFeHRyYWN0b3IuY3BwIiwKLSAgICAgICAgIkZyYW1lUmVuZGVyVHJhY2tlci5jcHAiLAorICAgICAgICAiRnJhbWVEZWNvZGVyLmNwcCIsCiAgICAgICAgICJIVFRQQmFzZS5jcHAiLAogICAgICAgICAiSGV2Y1V0aWxzLmNwcCIsCi0gICAgICAgICJJdGVtVGFibGUuY3BwIiwKKyAgICAgICAgIkludGVyZmFjZVV0aWxzLmNwcCIsCiAgICAgICAgICJKUEVHU291cmNlLmNwcCIsCi0gICAgICAgICJNUDNFeHRyYWN0b3IuY3BwIiwKICAgICAgICAgIk1QRUcyVFNXcml0ZXIuY3BwIiwKLSAgICAgICAgIk1QRUc0RXh0cmFjdG9yLmNwcCIsCiAgICAgICAgICJNUEVHNFdyaXRlci5jcHAiLAogICAgICAgICAiTWVkaWFBZGFwdGVyLmNwcCIsCiAgICAgICAgICJNZWRpYUNsb2NrLmNwcCIsCkBAIC00Miw4NSArMTE5LDcyIEBACiAgICAgICAgICJNZWRpYUNvZGVjTGlzdC5jcHAiLAogICAgICAgICAiTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuY3BwIiwKICAgICAgICAgIk1lZGlhQ29kZWNTb3VyY2UuY3BwIiwKLSAgICAgICAgIk1lZGlhRXh0cmFjdG9yLmNwcCIsCisgICAgICAgICJNZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwIiwKICAgICAgICAgIk1lZGlhU3luYy5jcHAiLAotICAgICAgICAiTWlkaUV4dHJhY3Rvci5jcHAiLAogICAgICAgICAiaHR0cC9NZWRpYUhUVFAuY3BwIiwKICAgICAgICAgIk1lZGlhTXV4ZXIuY3BwIiwKLSAgICAgICAgIk1lZGlhU291cmNlLmNwcCIsCiAgICAgICAgICJOdUNhY2hlZFNvdXJjZTIuY3BwIiwKICAgICAgICAgIk51TWVkaWFFeHRyYWN0b3IuY3BwIiwKICAgICAgICAgIk9NWENsaWVudC5jcHAiLAogICAgICAgICAiT214SW5mb0J1aWxkZXIuY3BwIiwKLSAgICAgICAgIk9nZ0V4dHJhY3Rvci5jcHAiLAotICAgICAgICAiU2FtcGxlSXRlcmF0b3IuY3BwIiwKLSAgICAgICAgIlNhbXBsZVRhYmxlLmNwcCIsCisgICAgICAgICJSZW1vdGVNZWRpYUV4dHJhY3Rvci5jcHAiLAorICAgICAgICAiUmVtb3RlTWVkaWFTb3VyY2UuY3BwIiwKICAgICAgICAgIlNpbXBsZURlY29kaW5nU291cmNlLmNwcCIsCiAgICAgICAgICJTa2lwQ3V0QnVmZmVyLmNwcCIsCiAgICAgICAgICJTdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAiLAogICAgICAgICAiU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAiLAotICAgICAgICAiU3VyZmFjZU1lZGlhU291cmNlLmNwcCIsCisgICAgICAgICJTdGFnZWZyaWdodFBsdWdpbkxvYWRlci5jcHAiLAogICAgICAgICAiU3VyZmFjZVV0aWxzLmNwcCIsCi0gICAgICAgICJUaHJvdHRsZWRTb3VyY2UuY3BwIiwKICAgICAgICAgIlV0aWxzLmNwcCIsCi0gICAgICAgICJWQlJJU2Vla2VyLmNwcCIsCisgICAgICAgICJUaHJvdHRsZWRTb3VyY2UuY3BwIiwKICAgICAgICAgIlZpZGVvRnJhbWVTY2hlZHVsZXIuY3BwIiwKLSAgICAgICAgIldBVkV4dHJhY3Rvci5jcHAiLAotICAgICAgICAiWElOR1NlZWtlci5jcHAiLAotICAgICAgICAiYXZjX3V0aWxzLmNwcCIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKLSAgICAgICAgImxpYmNyeXB0byIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGliZGwiLAogICAgICAgICAibGliZHJtZnJhbWV3b3JrIiwKLSAgICAgICAgImxpYmV4cGF0IiwKICAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJpb24iLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCisgICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCiAgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAogICAgICAgICAibGlibWVkaWF1dGlscyIsCiAgICAgICAgICJsaWJuZXRkX2NsaWVudCIsCi0gICAgICAgICJsaWJzb25pdm94IiwKICAgICAgICAgImxpYnVpIiwKICAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYnZvcmJpc2lkZWMiLAotICAgICAgICAibGlibWVkaWFkcm0iLAotICAgICAgICAibGlibmF0aXZld2luZG93IiwKLQogICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teF91dGlscyIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mbGFjZGVjIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2NvZGVjYmFzZSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teF91dGlscyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXIiLAotICAgICAgICAibGliZGwiLAogICAgICAgICAibGliUlNjcHAiLAorICAgICAgICAibGliaGlkbGFsbG9jYXRvcnV0aWxzIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmhpZGxtZW1vcnkiLAorICAgICAgICAibGliemlwYXJjaGl2ZSIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCi0gICAgICAgICJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCIsCi0gICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmFsbG9jYXRvckAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5tYXBwZXJAMi4wIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2NvbG9yX2NvbnZlcnNpb24iLAogICAgICAgICAibGlieXV2X3N0YXRpYyIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9hYWNlbmMiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfbWF0cm9za2EiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfbWVkaWFmaWx0ZXIiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfd2VibSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF90aW1lZHRleHQiLAogICAgICAgICAibGlidnB4IiwKICAgICAgICAgImxpYndlYm0iLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJ0cyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9lc2RzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2lkMyIsCiAgICAgICAgICJsaWJGTEFDIiwKICAgICBdLApAQCAtMTQxLDYgKzIwNSw5MiBAQAogICAgICAgICAiLVdhbGwiLAogICAgIF0sCiAKKyAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKKworICAgIHByb2R1Y3RfdmFyaWFibGVzOiB7CisgICAgICAgIGRlYnVnZ2FibGU6IHsKKyAgICAgICAgICAgIC8vIGVuYWJsZSBleHBlcmltZW50cyBvbmx5IGluIHVzZXJkZWJ1ZyBhbmQgZW5nIGJ1aWxkcworICAgICAgICAgICAgY2ZsYWdzOiBbIi1ERU5BQkxFX1NUQUdFRlJJR0hUX0VYUEVSSU1FTlRTIl0sCisgICAgICAgIH0sCisgICAgfSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfcGxheWVyMiIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDYWxsYmFja0RhdGFTb3VyY2UuY3BwIiwKKyAgICAgICAgIkNhbGxiYWNrTWVkaWFTb3VyY2UuY3BwIiwKKyAgICAgICAgIkRhdGFTb3VyY2VGYWN0b3J5LmNwcCIsCisgICAgICAgICJEYXRhVVJJU291cmNlLmNwcCIsCisgICAgICAgICJGaWxlU291cmNlLmNwcCIsCisgICAgICAgICJIVFRQQmFzZS5jcHAiLAorICAgICAgICAiSGV2Y1V0aWxzLmNwcCIsCisgICAgICAgICJJbnRlcmZhY2VVdGlscy5jcHAiLAorICAgICAgICAiTWVkaWFDbG9jay5jcHAiLAorICAgICAgICAiTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcCIsCisgICAgICAgICJOZGtVdGlscy5jcHAiLAorICAgICAgICAiTnVDYWNoZWRTb3VyY2UyLmNwcCIsCisgICAgICAgICJSZW1vdGVNZWRpYUV4dHJhY3Rvci5jcHAiLAorICAgICAgICAiUmVtb3RlTWVkaWFTb3VyY2UuY3BwIiwKKyAgICAgICAgIlV0aWxzLmNwcCIsCisgICAgICAgICJWaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcCIsCisgICAgICAgICJodHRwL01lZGlhSFRUUC5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJkcm1mcmFtZXdvcmsiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYV9wbGF5ZXIyX3V0aWwiLAorICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGlibmV0ZF9jbGllbnQiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGliemlwYXJjaGl2ZSIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9lc2RzIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6WworICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJtZWRpYV9wbGF5ZXIyX3V0aWwiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKICAgICBwcm9kdWN0X3ZhcmlhYmxlczogewogICAgICAgICBkZWJ1Z2dhYmxlOiB7CiAgICAgICAgICAgICAvLyBlbmFibGUgZXhwZXJpbWVudHMgb25seSBpbiB1c2VyZGVidWcgYW5kIGVuZyBidWlsZHMKQEAgLTE2MSw2ICszMTEsNyBAQAogfQogCiBzdWJkaXJzID0gWworICAgICJjb2RlYzIiLAogICAgICJjb2RlY3MvKiIsCiAgICAgImNvbG9yY29udmVyc2lvbiIsCiAgICAgImZpbHRlcnMiLApAQCAtMTY5LDEzICszMjAsMTEgQEAKICAgICAiaHR0cCIsCiAgICAgImh0dHBsaXZlIiwKICAgICAiaWQzIiwKLSAgICAibWF0cm9za2EiLAogICAgICJtcGVnMnRzIiwKICAgICAib214IiwKICAgICAicnRzcCIsCiAgICAgInRlc3RzIiwKICAgICAidGltZWR0ZXh0IiwKICAgICAid2VibSIsCi0gICAgIndpZmktZGlzcGxheSIsCiAgICAgInhtbHBhcnNlciIsCiBdCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAKaW5kZXggYjNmYjhkNC4uYTZmMGEwYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcApAQCAtMjMsNiArMjMsNyBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfQXVkaW8uaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb2t1cC5oPgpAQCAtMzAsNyArMzEsNiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KIApAQCAtNjcsNyArNjcsNyBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb1BsYXllcjo6c2V0U291cmNlKGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSkgewordm9pZCBBdWRpb1BsYXllcjo6c2V0U291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKSB7CiAgICAgQ0hFQ0sobVNvdXJjZSA9PSBOVUxMKTsKICAgICBtU291cmNlID0gc291cmNlOwogfQpAQCAtMzYzLDcgKzM2Myw3IEBACiAgICAgLy8gV2hlbiBvZmZsb2FkaW5nLCB0aGUgT01YIGNvbXBvbmVudCBpcyBub3QgdXNlZCBzbyB0aGlzIGhhY2sKICAgICAvLyBpcyBub3QgbmVlZGVkCiAgICAgaWYgKCF1c2VPZmZsb2FkKCkpIHsKLSAgICAgICAgd3A8SU1lZGlhU291cmNlPiB0bXAgPSBtU291cmNlOworICAgICAgICB3cDxNZWRpYVNvdXJjZT4gdG1wID0gbVNvdXJjZTsKICAgICAgICAgbVNvdXJjZS5jbGVhcigpOwogICAgICAgICB3aGlsZSAodG1wLnByb21vdGUoKSAhPSBOVUxMKSB7CiAgICAgICAgICAgICB1c2xlZXAoMTAwMCk7CkBAIC01NDMsNyArNTQzLDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYobUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobUlucHV0QnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KAorICAgICAgICAgICAgICAgIENIRUNLKG1JbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCkuZmluZEludDY0KAogICAgICAgICAgICAgICAgICAgICAgICAga0tleVRpbWUsICZtUG9zaXRpb25UaW1lTWVkaWFVcykpOwogICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1ByZXNlbnRhdGlvbkluZm8uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QcmVzZW50YXRpb25JbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmUxODU5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QcmVzZW50YXRpb25JbmZvLmNwcApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9QcmVzZW50YXRpb25JbmZvIgorCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9QcmVzZW50YXRpb25JbmZvLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQXVkaW9QcmVzZW50YXRpb25JbmZvOjpBdWRpb1ByZXNlbnRhdGlvbkluZm8oKSB7Cit9CisKK0F1ZGlvUHJlc2VudGF0aW9uSW5mbzo6fkF1ZGlvUHJlc2VudGF0aW9uSW5mbygpIHsKKyAgICBtUHJlc2VudGF0aW9ucy5jbGVhcigpOworfQorCit2b2lkIEF1ZGlvUHJlc2VudGF0aW9uSW5mbzo6YWRkUHJlc2VudGF0aW9uKHNwPEF1ZGlvUHJlc2VudGF0aW9uPiBwcmVzZW50YXRpb24pIHsKKyAgICBtUHJlc2VudGF0aW9ucy5wdXNoKHByZXNlbnRhdGlvbik7Cit9CisKK3NpemVfdCBBdWRpb1ByZXNlbnRhdGlvbkluZm86OmNvdW50UHJlc2VudGF0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gbVByZXNlbnRhdGlvbnMuc2l6ZSgpOworfQorCisvLyBSZXR1cm5zIGFuIEF1ZGlvUHJlc2VudGF0aW9uIGZvciB0aGUgZ2l2ZW4gdmFsaWQgaW5kZXgKKy8vIGluZGV4IG11c3QgYmUgPj0wIGFuZCA8IGNvdW50UHJlc2VudGF0aW9ucygpCitjb25zdCBzcDxBdWRpb1ByZXNlbnRhdGlvbj4gQXVkaW9QcmVzZW50YXRpb25JbmZvOjpnZXRQcmVzZW50YXRpb24oc2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIG1QcmVzZW50YXRpb25zW2luZGV4XTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcAppbmRleCBmMmIxZjEwLi4yYWUzMjE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwCkBAIC01Miw3ICs1Miw3IEBACiBBdWRpb1NvdXJjZTo6QXVkaW9Tb3VyY2UoCiAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLCBjb25zdCBTdHJpbmcxNiAmb3BQYWNrYWdlTmFtZSwKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgdWludDMyX3QgY2hhbm5lbENvdW50LCB1aW50MzJfdCBvdXRTYW1wbGVSYXRlLAotICAgICAgICB1aWRfdCB1aWQsIHBpZF90IHBpZCkKKyAgICAgICAgdWlkX3QgdWlkLCBwaWRfdCBwaWQsIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCkKICAgICA6IG1TdGFydGVkKGZhbHNlKSwKICAgICAgIG1TYW1wbGVSYXRlKHNhbXBsZVJhdGUpLAogICAgICAgbU91dFNhbXBsZVJhdGUob3V0U2FtcGxlUmF0ZSA+IDAgPyBvdXRTYW1wbGVSYXRlIDogc2FtcGxlUmF0ZSksCkBAIC0xMDEsNyArMTAxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgQXVkaW9SZWNvcmQ6OlRSQU5TRkVSX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgdWlkLAotICAgICAgICAgICAgICAgICAgICBwaWQpOworICAgICAgICAgICAgICAgICAgICBwaWQsCisgICAgICAgICAgICAgICAgICAgIE5VTEwgLypwQXR0cmlidXRlcyovLAorICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZERldmljZUlkKTsKICAgICAgICAgbUluaXRDaGVjayA9IG1SZWNvcmQtPmluaXRDaGVjaygpOwogICAgICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewogICAgICAgICAgICAgbVJlY29yZC5jbGVhcigpOwpAQCAtMjM4LDcgKzI0MCw3IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKiAvKiBvcHRpb25zICovKSB7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKiAvKiBvcHRpb25zICovKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICAqb3V0ID0gTlVMTDsKIApAQCAtMjYzLDcgKzI2NSw3IEBACiAKICAgICAvLyBNdXRlL3N1cHByZXNzIHRoZSByZWNvcmRpbmcgc291bmQKICAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKKyAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwogICAgIGludDY0X3QgZWxhcHNlZFRpbWVVcyA9IHRpbWVVcyAtIG1TdGFydFRpbWVVczsKICAgICBpZiAoZWxhcHNlZFRpbWVVcyA8IGtBdXRvUmFtcFN0YXJ0VXMpIHsKICAgICAgICAgbWVtc2V0KCh1aW50OF90ICopIGJ1ZmZlci0+ZGF0YSgpLCAwLCBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKQEAgLTI4Nyw3ICsyODksNyBAQAogCiAgICAgaWYgKG1TYW1wbGVSYXRlICE9IG1PdXRTYW1wbGVSYXRlKSB7CiAgICAgICAgICAgICB0aW1lVXMgKj0gKGludDY0X3QpbVNhbXBsZVJhdGUgLyAoaW50NjRfdCltT3V0U2FtcGxlUmF0ZTsKLSAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKICAgICB9CiAKICAgICAqb3V0ID0gYnVmZmVyOwpAQCAtMzA5LDcgKzMxMSw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIEF1ZGlvU291cmNlOjpzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7Cit2b2lkIEF1ZGlvU291cmNlOjpzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgewogICAgIEFMT0dWKCJzaWduYWxCdWZmZXJSZXR1cm5lZDogJXAiLCBidWZmZXItPmRhdGEoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICAtLW1OdW1DbGllbnRPd25lZEJ1ZmZlcnM7CkBAIC00MzEsMTEgKzQzMywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKG1TYW1wbGVSYXRlID4+IDEpKSAvIG1TYW1wbGVSYXRlOwogCiAgICAgaWYgKG1OdW1GcmFtZXNSZWNlaXZlZCA9PSAwKSB7Ci0gICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlBbmNob3JUaW1lLCBtU3RhcnRUaW1lVXMpOworICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlBbmNob3JUaW1lLCBtU3RhcnRUaW1lVXMpOwogICAgIH0KIAotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBtUHJldlNhbXBsZVRpbWVVcyk7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleURyaWZ0VGltZSwgdGltZVVzIC0gbUluaXRpYWxSZWFkVGltZVVzKTsKKyAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCBtUHJldlNhbXBsZVRpbWVVcyk7CisgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5RHJpZnRUaW1lLCB0aW1lVXMgLSBtSW5pdGlhbFJlYWRUaW1lVXMpOwogICAgIG1QcmV2U2FtcGxlVGltZVVzID0gdGltZXN0YW1wVXM7CiAgICAgbU51bUZyYW1lc1JlY2VpdmVkICs9IGJ1ZmZlclNpemUgLyBmcmFtZVNpemU7CiAgICAgbUJ1ZmZlcnNSZWNlaXZlZC5wdXNoX2JhY2soYnVmZmVyKTsKQEAgLTQ2NSw0ICs0NjcsNDMgQEAKICAgICByZXR1cm4gdmFsdWU7CiB9CiAKK3N0YXR1c190IEF1ZGlvU291cmNlOjpzZXRJbnB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSB7CisgICAgaWYgKG1SZWNvcmQgIT0gMCkgeworICAgICAgICByZXR1cm4gbVJlY29yZC0+c2V0SW5wdXREZXZpY2UoZGV2aWNlSWQpOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKworc3RhdHVzX3QgQXVkaW9Tb3VyY2U6OmdldFJvdXRlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QqIGRldmljZUlkKSB7CisgICAgaWYgKG1SZWNvcmQgIT0gMCkgeworICAgICAgICAqZGV2aWNlSWQgPSBtUmVjb3JkLT5nZXRSb3V0ZWREZXZpY2VJZCgpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCitzdGF0dXNfdCBBdWRpb1NvdXJjZTo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjaygKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaykgeworICAgIGlmIChtUmVjb3JkICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1SZWNvcmQtPmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soY2FsbGJhY2spOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKworc3RhdHVzX3QgQXVkaW9Tb3VyY2U6OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soCisgICAgICAgIGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spIHsKKyAgICBpZiAobVJlY29yZCAhPSAwKSB7CisgICAgICAgIHJldHVybiBtUmVjb3JkLT5yZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGNhbGxiYWNrKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKK3N0YXR1c190IEF1ZGlvU291cmNlOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpIHsKKyAgICBpZiAobVJlY29yZCAhPSAwKSB7CisgICAgICAgIHJldHVybiBtUmVjb3JkLT5nZXRBY3RpdmVNaWNyb3Bob25lcyhhY3RpdmVNaWNyb3Bob25lcyk7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQnVmZmVySW1wbC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9CdWZmZXJJbXBsLmNwcAppbmRleCBmZWUzNzM5Li5iNzYwMjczIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9CdWZmZXJJbXBsLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9CdWZmZXJJbXBsLmNwcApAQCAtMjksNiArMjksOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKKy8vIFNoYXJlZE1lbW9yeUJ1ZmZlcgorCiBTaGFyZWRNZW1vcnlCdWZmZXI6OlNoYXJlZE1lbW9yeUJ1ZmZlcihjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgY29uc3Qgc3A8SU1lbW9yeT4gJm1lbSkKICAgICA6IE1lZGlhQ29kZWNCdWZmZXIoZm9ybWF0LCBuZXcgQUJ1ZmZlcihtZW0tPnBvaW50ZXIoKSwgbWVtLT5zaXplKCkpKSwKICAgICAgIG1NZW1vcnkobWVtKSB7CkBAIC0zOSw2ICs0MSw4IEBACiAgICAgICBtVE1lbW9yeShtZW0pIHsKIH0KIAorLy8gU2VjdXJlQnVmZmVyCisKIFNlY3VyZUJ1ZmZlcjo6U2VjdXJlQnVmZmVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBjb25zdCB2b2lkICpwdHIsIHNpemVfdCBzaXplKQogICAgIDogTWVkaWFDb2RlY0J1ZmZlcihmb3JtYXQsIG5ldyBBQnVmZmVyKG51bGxwdHIsIHNpemUpKSwKICAgICAgIG1Qb2ludGVyKHB0cikgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FsbGJhY2tEYXRhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbGxiYWNrRGF0YVNvdXJjZS5jcHAKaW5kZXggNmRmZTJkZS4uOTJlNmViOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FsbGJhY2tEYXRhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYWxsYmFja0RhdGFTb3VyY2UuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSAiaW5jbHVkZS9DYWxsYmFja0RhdGFTb3VyY2UuaCIKIAogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSURhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogCkBAIC0zNCw3ICszNSwxMCBAQAogICAgICAgbUlzQ2xvc2VkKGZhbHNlKSB7CiAgICAgLy8gU2V0IHVwIHRoZSBidWZmZXIgdG8gcmVhZCBpbnRvLgogICAgIG1NZW1vcnkgPSBtSURhdGFTb3VyY2UtPmdldElNZW1vcnkoKTsKLSAgICBtTmFtZSA9IFN0cmluZzg6OmZvcm1hdCgiQ2FsbGJhY2tEYXRhU291cmNlKCVzKSIsIG1JRGF0YVNvdXJjZS0+dG9TdHJpbmcoKS5zdHJpbmcoKSk7CisgICAgbU5hbWUgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbGxiYWNrRGF0YVNvdXJjZSglZC0+JWQsICVzKSIsCisgICAgICAgICAgICBnZXRwaWQoKSwKKyAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKKyAgICAgICAgICAgIG1JRGF0YVNvdXJjZS0+dG9TdHJpbmcoKS5zdHJpbmcoKSk7CiAKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FsbGJhY2tNZWRpYVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYWxsYmFja01lZGlhU291cmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTczOTJlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FsbGJhY2tNZWRpYVNvdXJjZS5jcHAKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NhbGxiYWNrTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFTb3VyY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitDYWxsYmFja01lZGlhU291cmNlOjpDYWxsYmFja01lZGlhU291cmNlKGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSkKKyAgICA6bVNvdXJjZShzb3VyY2UpIHt9CisKK0NhbGxiYWNrTWVkaWFTb3VyY2U6On5DYWxsYmFja01lZGlhU291cmNlKCkge30KKworc3RhdHVzX3QgQ2FsbGJhY2tNZWRpYVNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworICAgIHJldHVybiBtU291cmNlLT5zdGFydChwYXJhbXMpOworfQorCitzdGF0dXNfdCBDYWxsYmFja01lZGlhU291cmNlOjpzdG9wKCkgeworICAgIHJldHVybiBtU291cmNlLT5zdG9wKCk7Cit9CisKK3NwPE1ldGFEYXRhPiBDYWxsYmFja01lZGlhU291cmNlOjpnZXRGb3JtYXQoKSB7CisgICAgcmV0dXJuIG1Tb3VyY2UtPmdldEZvcm1hdCgpOworfQorCitzdGF0dXNfdCBDYWxsYmFja01lZGlhU291cmNlOjpyZWFkKE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICByZXR1cm4gbVNvdXJjZS0+cmVhZChidWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUmVhZE9wdGlvbnMqPihvcHRpb25zKSk7Cit9CisKK3N0YXR1c190IENhbGxiYWNrTWVkaWFTb3VyY2U6OnBhdXNlKCkgeworICAgIHJldHVybiBtU291cmNlLT5wYXVzZSgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKaW5kZXggNmVkMGQwZS4uZGIzNzAyMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCkBAIC0xMDQwLDcgKzEwNDAsNyBAQAogICAgIHJlbGVhc2VSZWNvcmRpbmdGcmFtZShmcmFtZSk7CiB9CiAKLXZvaWQgQ2FtZXJhU291cmNlOjpzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7Cit2b2lkIENhbWVyYVNvdXJjZTo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIHsKICAgICBBTE9HVigic2lnbmFsQnVmZmVyUmV0dXJuZWQ6ICVwIiwgYnVmZmVyLT5kYXRhKCkpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgZm9yIChMaXN0PHNwPElNZW1vcnk+ID46Oml0ZXJhdG9yIGl0ID0gbUZyYW1lc0JlaW5nRW5jb2RlZC5iZWdpbigpOwpAQCAtMTA1OSw3ICsxMDU5LDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgIEFMT0dWKCJyZWFkIik7CiAKICAgICAqYnVmZmVyID0gTlVMTDsKQEAgLTExMDAsNyArMTEwMCw3IEBACiAgICAgICAgICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoZnJhbWUtPnBvaW50ZXIoKSwgZnJhbWUtPnNpemUoKSk7CiAgICAgICAgICgqYnVmZmVyKS0+c2V0T2JzZXJ2ZXIodGhpcyk7CiAgICAgICAgICgqYnVmZmVyKS0+YWRkX3JlZigpOwotICAgICAgICAoKmJ1ZmZlciktPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgZnJhbWVUaW1lKTsKKyAgICAgICAgKCpidWZmZXIpLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgZnJhbWVUaW1lKTsKICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAKaW5kZXggOTcwNTI2YS4uM2FkODJkOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwCkBAIC0xNjgsNyArMTY4LDcgQEAKICAgICByZXR1cm4gaXNTdWNjZXNzZnVsOwogfQogCi12b2lkIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIqIGJ1ZmZlcikgewordm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyQmFzZSogYnVmZmVyKSB7CiAgICAgQUxPR1YoInNpZ25hbEJ1ZmZlclJldHVybmVkIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1RdWlja1N0b3BMb2NrKTsKICAgICBpZiAobVF1aWNrU3RvcCAmJiAoYnVmZmVyID09IG1MYXN0UmVhZEJ1ZmZlckNvcHkpKSB7CkBAIC0xODAsOSArMTgwLDkgQEAKIH0KIAogdm9pZCBjcmVhdGVNZWRpYUJ1ZmZlckNvcHkoCi0gICAgICAgIGNvbnN0IE1lZGlhQnVmZmVyJiBzb3VyY2VCdWZmZXIsCisgICAgICAgIGNvbnN0IE1lZGlhQnVmZmVyQmFzZSYgc291cmNlQnVmZmVyLAogICAgICAgICBpbnQ2NF90IGZyYW1lVGltZSwKLSAgICAgICAgTWVkaWFCdWZmZXIgKipuZXdCdWZmZXIpIHsKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqbmV3QnVmZmVyKSB7CiAKICAgICBBTE9HVigiY3JlYXRlTWVkaWFCdWZmZXJDb3B5Iik7CiAgICAgc2l6ZV90IHNvdXJjZVNpemUgPSBzb3VyY2VCdWZmZXIuc2l6ZSgpOwpAQCAtMTkxLDIwICsxOTEsMjAgQEAKICAgICAoKm5ld0J1ZmZlcikgPSBuZXcgTWVkaWFCdWZmZXIoc291cmNlU2l6ZSk7CiAgICAgbWVtY3B5KCgqbmV3QnVmZmVyKS0+ZGF0YSgpLCBzb3VyY2VQb2ludGVyLCBzb3VyY2VTaXplKTsKIAotICAgICgqbmV3QnVmZmVyKS0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBmcmFtZVRpbWUpOworICAgICgqbmV3QnVmZmVyKS0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIGZyYW1lVGltZSk7CiB9CiAKLXZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpmaWxsTGFzdFJlYWRCdWZmZXJDb3B5KE1lZGlhQnVmZmVyJiBzb3VyY2VCdWZmZXIpIHsKK3ZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpmaWxsTGFzdFJlYWRCdWZmZXJDb3B5KE1lZGlhQnVmZmVyQmFzZSYgc291cmNlQnVmZmVyKSB7CiAgICAgQUxPR1YoImZpbGxMYXN0UmVhZEJ1ZmZlckNvcHkiKTsKICAgICBpbnQ2NF90IGZyYW1lVGltZTsKLSAgICBDSEVDSyhzb3VyY2VCdWZmZXIubWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJmZyYW1lVGltZSkpOworICAgIENIRUNLKHNvdXJjZUJ1ZmZlci5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZmcmFtZVRpbWUpKTsKICAgICBjcmVhdGVNZWRpYUJ1ZmZlckNvcHkoc291cmNlQnVmZmVyLCBmcmFtZVRpbWUsICZtTGFzdFJlYWRCdWZmZXJDb3B5KTsKICAgICBtTGFzdFJlYWRCdWZmZXJDb3B5LT5hZGRfcmVmKCk7CiAgICAgbUxhc3RSZWFkQnVmZmVyQ29weS0+c2V0T2JzZXJ2ZXIodGhpcyk7CiB9CiAKIHN0YXR1c190IENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICBBTE9HVigicmVhZCIpOwogICAgIGlmIChtTGFzdFJlYWRCdWZmZXJDb3B5ID09IE5VTEwpIHsKICAgICAgICAgbUxhc3RSZWFkU3RhdHVzID0gQ2FtZXJhU291cmNlOjpyZWFkKGJ1ZmZlciwgb3B0aW9ucyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjIwNTNlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJEYXRhU291cmNlIgotCi0jaW5jbHVkZSAiaW5jbHVkZS9DYWxsYmFja0RhdGFTb3VyY2UuaCIKLSNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCIKLQotI2luY2x1ZGUgPG1lZGlhL0lEYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhVVJJU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLQotI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWJvb2wgRGF0YVNvdXJjZTo6Z2V0VUludDE2KG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCkgewotICAgICp4ID0gMDsKLQotICAgIHVpbnQ4X3QgYnl0ZVsyXTsKLSAgICBpZiAocmVhZEF0KG9mZnNldCwgYnl0ZSwgMikgIT0gMikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgKnggPSAoYnl0ZVswXSA8PCA4KSB8IGJ5dGVbMV07Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEYXRhU291cmNlOjpnZXRVSW50MjQob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KSB7Ci0gICAgKnggPSAwOwotCi0gICAgdWludDhfdCBieXRlWzNdOwotICAgIGlmIChyZWFkQXQob2Zmc2V0LCBieXRlLCAzKSAhPSAzKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAqeCA9IChieXRlWzBdIDw8IDE2KSB8IChieXRlWzFdIDw8IDgpIHwgYnl0ZVsyXTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIERhdGFTb3VyY2U6OmdldFVJbnQzMihvZmY2NF90IG9mZnNldCwgdWludDMyX3QgKngpIHsKLSAgICAqeCA9IDA7Ci0KLSAgICB1aW50MzJfdCB0bXA7Ci0gICAgaWYgKHJlYWRBdChvZmZzZXQsICZ0bXAsIDQpICE9IDQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgICp4ID0gbnRvaGwodG1wKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIERhdGFTb3VyY2U6OmdldFVJbnQ2NChvZmY2NF90IG9mZnNldCwgdWludDY0X3QgKngpIHsKLSAgICAqeCA9IDA7Ci0KLSAgICB1aW50NjRfdCB0bXA7Ci0gICAgaWYgKHJlYWRBdChvZmZzZXQsICZ0bXAsIDgpICE9IDgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgICp4ID0gbnRvaDY0KHRtcCk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEYXRhU291cmNlOjpnZXRVSW50MTZWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90ICp4LCBzaXplX3Qgc2l6ZSkgewotICAgIGlmIChzaXplID09IDIpIHsKLSAgICAgICAgcmV0dXJuIGdldFVJbnQxNihvZmZzZXQsIHgpOwotICAgIH0KLSAgICBpZiAoc2l6ZSA9PSAxKSB7Ci0gICAgICAgIHVpbnQ4X3QgdG1wOwotICAgICAgICBpZiAocmVhZEF0KG9mZnNldCwgJnRtcCwgMSkgPT0gMSkgewotICAgICAgICAgICAgKnggPSB0bXA7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgRGF0YVNvdXJjZTo6Z2V0VUludDMyVmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCwgc2l6ZV90IHNpemUpIHsKLSAgICBpZiAoc2l6ZSA9PSA0KSB7Ci0gICAgICAgIHJldHVybiBnZXRVSW50MzIob2Zmc2V0LCB4KTsKLSAgICB9Ci0gICAgaWYgKHNpemUgPT0gMikgewotICAgICAgICB1aW50MTZfdCB0bXA7Ci0gICAgICAgIGlmIChnZXRVSW50MTYob2Zmc2V0LCAmdG1wKSkgewotICAgICAgICAgICAgKnggPSB0bXA7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgRGF0YVNvdXJjZTo6Z2V0VUludDY0VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCwgc2l6ZV90IHNpemUpIHsKLSAgICBpZiAoc2l6ZSA9PSA4KSB7Ci0gICAgICAgIHJldHVybiBnZXRVSW50NjQob2Zmc2V0LCB4KTsKLSAgICB9Ci0gICAgaWYgKHNpemUgPT0gNCkgewotICAgICAgICB1aW50MzJfdCB0bXA7Ci0gICAgICAgIGlmIChnZXRVSW50MzIob2Zmc2V0LCAmdG1wKSkgewotICAgICAgICAgICAgKnggPSB0bXA7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXR1c190IERhdGFTb3VyY2U6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgewotICAgICpzaXplID0gMDsKLQotICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLX0KLQotc3A8SURhdGFTb3VyY2U+IERhdGFTb3VyY2U6OmdldElEYXRhU291cmNlKCkgY29uc3QgewotICAgIHJldHVybiBudWxscHRyOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0vLyBzdGF0aWMKLXNwPERhdGFTb3VyY2U+IERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoCi0gICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCi0gICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKLSAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgIFN0cmluZzggKmNvbnRlbnRUeXBlLAotICAgICAgICBIVFRQQmFzZSAqaHR0cFNvdXJjZSkgewotICAgIGlmIChjb250ZW50VHlwZSAhPSBOVUxMKSB7Ci0gICAgICAgICpjb250ZW50VHlwZSA9ICIiOwotICAgIH0KLQotICAgIHNwPERhdGFTb3VyY2U+IHNvdXJjZTsKLSAgICBpZiAoIXN0cm5jYXNlY21wKCJmaWxlOi8vIiwgdXJpLCA3KSkgewotICAgICAgICBzb3VyY2UgPSBuZXcgRmlsZVNvdXJjZSh1cmkgKyA3KTsKLSAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcCgiaHR0cDovLyIsIHVyaSwgNykgfHwgIXN0cm5jYXNlY21wKCJodHRwczovLyIsIHVyaSwgOCkpIHsKLSAgICAgICAgaWYgKGh0dHBTZXJ2aWNlID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGh0dHAgc2VydmljZSEiKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGh0dHBTb3VyY2UgPT0gTlVMTCkgewotICAgICAgICAgICAgc3A8SU1lZGlhSFRUUENvbm5lY3Rpb24+IGNvbm4gPSBodHRwU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoY29ubiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBtYWtlIGh0dHAgY29ubmVjdGlvbiBmcm9tIGh0dHAgc2VydmljZSEiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGh0dHBTb3VyY2UgPSBuZXcgTWVkaWFIVFRQKGNvbm4pOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nOCBjYWNoZUNvbmZpZzsKLSAgICAgICAgYm9vbCBkaXNjb25uZWN0QXRIaWdod2F0ZXJtYXJrID0gZmFsc2U7Ci0gICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG5vbkNhY2hlU3BlY2lmaWNIZWFkZXJzOwotICAgICAgICBpZiAoaGVhZGVycyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBub25DYWNoZVNwZWNpZmljSGVhZGVycyA9ICpoZWFkZXJzOwotICAgICAgICAgICAgTnVDYWNoZWRTb3VyY2UyOjpSZW1vdmVDYWNoZVNwZWNpZmljSGVhZGVycygKLSAgICAgICAgICAgICAgICAgICAgJm5vbkNhY2hlU3BlY2lmaWNIZWFkZXJzLAotICAgICAgICAgICAgICAgICAgICAmY2FjaGVDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICZkaXNjb25uZWN0QXRIaWdod2F0ZXJtYXJrKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChodHRwU291cmNlLT5jb25uZWN0KHVyaSwgJm5vbkNhY2hlU3BlY2lmaWNIZWFkZXJzKSAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjb25uZWN0IGh0dHAgc291cmNlISIpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29udGVudFR5cGUgIT0gTlVMTCkgewotICAgICAgICAgICAgKmNvbnRlbnRUeXBlID0gaHR0cFNvdXJjZS0+Z2V0TUlNRVR5cGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNvdXJjZSA9IE51Q2FjaGVkU291cmNlMjo6Q3JlYXRlKAotICAgICAgICAgICAgICAgIGh0dHBTb3VyY2UsCi0gICAgICAgICAgICAgICAgY2FjaGVDb25maWcuaXNFbXB0eSgpID8gTlVMTCA6IGNhY2hlQ29uZmlnLnN0cmluZygpLAotICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RBdEhpZ2h3YXRlcm1hcmspOwotICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKCJkYXRhOiIsIHVyaSwgNSkpIHsKLSAgICAgICAgc291cmNlID0gRGF0YVVSSVNvdXJjZTo6Q3JlYXRlKHVyaSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gQXNzdW1lIGl0J3MgYSBmaWxlbmFtZS4KLSAgICAgICAgc291cmNlID0gbmV3IEZpbGVTb3VyY2UodXJpKTsKLSAgICB9Ci0KLSAgICBpZiAoc291cmNlID09IE5VTEwgfHwgc291cmNlLT5pbml0Q2hlY2soKSAhPSBPSykgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gc291cmNlOwotfQotCi1zcDxEYXRhU291cmNlPiBEYXRhU291cmNlOjpDcmVhdGVGcm9tRmQoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpIHsKLSAgICBzcDxGaWxlU291cmNlPiBzb3VyY2UgPSBuZXcgRmlsZVNvdXJjZShmZCwgb2Zmc2V0LCBsZW5ndGgpOwotICAgIHJldHVybiBzb3VyY2UtPmluaXRDaGVjaygpICE9IE9LID8gbnVsbHB0ciA6IHNvdXJjZTsKLX0KLQotc3A8RGF0YVNvdXJjZT4gRGF0YVNvdXJjZTo6Q3JlYXRlTWVkaWFIVFRQKGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UpIHsKLSAgICBpZiAoaHR0cFNlcnZpY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBzcDxJTWVkaWFIVFRQQ29ubmVjdGlvbj4gY29ubiA9IGh0dHBTZXJ2aWNlLT5tYWtlSFRUUENvbm5lY3Rpb24oKTsKLSAgICBpZiAoY29ubiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFIVFRQKGNvbm4pOwotICAgIH0KLX0KLQotc3A8RGF0YVNvdXJjZT4gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbUlEYXRhU291cmNlKGNvbnN0IHNwPElEYXRhU291cmNlPiAmc291cmNlKSB7Ci0gICAgcmV0dXJuIG5ldyBUaW55Q2FjaGVTb3VyY2UobmV3IENhbGxiYWNrRGF0YVNvdXJjZShzb3VyY2UpKTsKLX0KLQotU3RyaW5nOCBEYXRhU291cmNlOjpnZXRNSU1FVHlwZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7Ci19Ci0KLXNwPElEYXRhU291cmNlPiBEYXRhU291cmNlOjphc0lEYXRhU291cmNlKCkgewotICAgIHJldHVybiBSZW1vdGVEYXRhU291cmNlOjp3cmFwKHNwPERhdGFTb3VyY2U+KHRoaXMpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2VGYWN0b3J5LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2VGYWN0b3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGJmMGNjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuY3BwCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRGF0YVNvdXJjZSIKKworI2luY2x1ZGUgImluY2x1ZGUvSFRUUEJhc2UuaCIKKyNpbmNsdWRlICJpbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0YXRpYworc3A8RGF0YVNvdXJjZT4gRGF0YVNvdXJjZUZhY3Rvcnk6OkNyZWF0ZUZyb21VUkkoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKKyAgICAgICAgU3RyaW5nOCAqY29udGVudFR5cGUsCisgICAgICAgIEhUVFBCYXNlICpodHRwU291cmNlKSB7CisgICAgaWYgKGNvbnRlbnRUeXBlICE9IE5VTEwpIHsKKyAgICAgICAgKmNvbnRlbnRUeXBlID0gIiI7CisgICAgfQorCisgICAgc3A8RGF0YVNvdXJjZT4gc291cmNlOworICAgIGlmICghc3RybmNhc2VjbXAoImZpbGU6Ly8iLCB1cmksIDcpKSB7CisgICAgICAgIHNvdXJjZSA9IG5ldyBGaWxlU291cmNlKHVyaSArIDcpOworICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKCJodHRwOi8vIiwgdXJpLCA3KSB8fCAhc3RybmNhc2VjbXAoImh0dHBzOi8vIiwgdXJpLCA4KSkgeworICAgICAgICBpZiAoaHR0cFNlcnZpY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgaHR0cCBzZXJ2aWNlISIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaHR0cFNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiBjb25uID0gaHR0cFNlcnZpY2UtPm1ha2VIVFRQQ29ubmVjdGlvbigpOworICAgICAgICAgICAgaWYgKGNvbm4gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbWFrZSBodHRwIGNvbm5lY3Rpb24gZnJvbSBodHRwIHNlcnZpY2UhIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBodHRwU291cmNlID0gbmV3IE1lZGlhSFRUUChjb25uKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZzggY2FjaGVDb25maWc7CisgICAgICAgIGJvb2wgZGlzY29ubmVjdEF0SGlnaHdhdGVybWFyayA9IGZhbHNlOworICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBub25DYWNoZVNwZWNpZmljSGVhZGVyczsKKyAgICAgICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgeworICAgICAgICAgICAgbm9uQ2FjaGVTcGVjaWZpY0hlYWRlcnMgPSAqaGVhZGVyczsKKyAgICAgICAgICAgIE51Q2FjaGVkU291cmNlMjo6UmVtb3ZlQ2FjaGVTcGVjaWZpY0hlYWRlcnMoCisgICAgICAgICAgICAgICAgICAgICZub25DYWNoZVNwZWNpZmljSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgJmNhY2hlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAmZGlzY29ubmVjdEF0SGlnaHdhdGVybWFyayk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaHR0cFNvdXJjZS0+Y29ubmVjdCh1cmksICZub25DYWNoZVNwZWNpZmljSGVhZGVycykgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY29ubmVjdCBodHRwIHNvdXJjZSEiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbnRlbnRUeXBlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICpjb250ZW50VHlwZSA9IGh0dHBTb3VyY2UtPmdldE1JTUVUeXBlKCk7CisgICAgICAgIH0KKworICAgICAgICBzb3VyY2UgPSBOdUNhY2hlZFNvdXJjZTI6OkNyZWF0ZSgKKyAgICAgICAgICAgICAgICBodHRwU291cmNlLAorICAgICAgICAgICAgICAgIGNhY2hlQ29uZmlnLmlzRW1wdHkoKSA/IE5VTEwgOiBjYWNoZUNvbmZpZy5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICBkaXNjb25uZWN0QXRIaWdod2F0ZXJtYXJrKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcCgiZGF0YToiLCB1cmksIDUpKSB7CisgICAgICAgIHNvdXJjZSA9IERhdGFVUklTb3VyY2U6OkNyZWF0ZSh1cmkpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEFzc3VtZSBpdCdzIGEgZmlsZW5hbWUuCisgICAgICAgIHNvdXJjZSA9IG5ldyBGaWxlU291cmNlKHVyaSk7CisgICAgfQorCisgICAgaWYgKHNvdXJjZSA9PSBOVUxMIHx8IHNvdXJjZS0+aW5pdENoZWNrKCkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHNvdXJjZTsKK30KKworc3A8RGF0YVNvdXJjZT4gRGF0YVNvdXJjZUZhY3Rvcnk6OkNyZWF0ZUZyb21GZChpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgeworICAgIHNwPEZpbGVTb3VyY2U+IHNvdXJjZSA9IG5ldyBGaWxlU291cmNlKGZkLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgcmV0dXJuIHNvdXJjZS0+aW5pdENoZWNrKCkgIT0gT0sgPyBudWxscHRyIDogc291cmNlOworfQorCitzcDxEYXRhU291cmNlPiBEYXRhU291cmNlRmFjdG9yeTo6Q3JlYXRlTWVkaWFIVFRQKGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSkgeworICAgIGlmIChodHRwU2VydmljZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+IGNvbm4gPSBodHRwU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCk7CisgICAgaWYgKGNvbm4gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbmV3IE1lZGlhSFRUUChjb25uKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9FU0RTLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0VTRFMuY3BwCmluZGV4IGMzMTcyMGQuLmVhMDU5ZTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0VTRFMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0VTRFMuY3BwCkBAIC0xOCw3ICsxOCw3IEBACiAjZGVmaW5lIExPR19UQUcgIkVTRFMiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CiAKICNpbmNsdWRlICJpbmNsdWRlL0VTRFMuaCIKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRkxBQ0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GTEFDRXh0cmFjdG9yLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI4OGU1ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GTEFDRXh0cmFjdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJGTEFDRXh0cmFjdG9yIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiaW5jbHVkZS9GTEFDRXh0cmFjdG9yLmgiCi0vLyBWb3JiaXMgY29tbWVudHMKLSNpbmNsdWRlICJpbmNsdWRlL09nZ0V4dHJhY3Rvci5oIgotLy8gbGliRkxBQyBwYXJzZXIKLSNpbmNsdWRlICJGTEFDL3N0cmVhbV9kZWNvZGVyLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRkxBQ1BhcnNlcjsKLQotY2xhc3MgRkxBQ1NvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7Ci0KLXB1YmxpYzoKLSAgICBGTEFDU291cmNlKAotICAgICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UsCi0gICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJnRyYWNrTWV0YWRhdGEpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+RkxBQ1NvdXJjZSgpOwotCi1wcml2YXRlOgotICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwotICAgIHNwPE1ldGFEYXRhPiBtVHJhY2tNZXRhZGF0YTsKLSAgICBzcDxGTEFDUGFyc2VyPiBtUGFyc2VyOwotICAgIGJvb2wgbUluaXRDaGVjazsKLSAgICBib29sIG1TdGFydGVkOwotCi0gICAgc3RhdHVzX3QgaW5pdCgpOwotCi0gICAgLy8gbm8gY29weSBjb25zdHJ1Y3RvciBvciBhc3NpZ25tZW50Ci0gICAgRkxBQ1NvdXJjZShjb25zdCBGTEFDU291cmNlICYpOwotICAgIEZMQUNTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBGTEFDU291cmNlICYpOwotCi19OwotCi0vLyBGTEFDUGFyc2VyIHdyYXBzIGEgQyBsaWJGTEFDIHBhcnNlciBha2Egc3RyZWFtIGRlY29kZXIKLQotY2xhc3MgRkxBQ1BhcnNlciA6IHB1YmxpYyBSZWZCYXNlIHsKLQotcHVibGljOgotICAgIGVudW0gewotICAgICAgICBrTWF4Q2hhbm5lbHMgPSA4LAotICAgIH07Ci0KLSAgICBleHBsaWNpdCBGTEFDUGFyc2VyKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YVNvdXJjZSwKLSAgICAgICAgLy8gSWYgbWV0YWRhdGEgcG9pbnRlcnMgYXJlbid0IHByb3ZpZGVkLCB3ZSBkb24ndCBmaWxsIHRoZW0KLSAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZmaWxlTWV0YWRhdGEgPSAwLAotICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJnRyYWNrTWV0YWRhdGEgPSAwKTsKLQotICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci0gICAgfQotCi0gICAgLy8gc3RyZWFtIHByb3BlcnRpZXMKLSAgICB1bnNpZ25lZCBnZXRNYXhCbG9ja1NpemUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtU3RyZWFtSW5mby5tYXhfYmxvY2tzaXplOwotICAgIH0KLSAgICB1bnNpZ25lZCBnZXRTYW1wbGVSYXRlKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVN0cmVhbUluZm8uc2FtcGxlX3JhdGU7Ci0gICAgfQotICAgIHVuc2lnbmVkIGdldENoYW5uZWxzKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVN0cmVhbUluZm8uY2hhbm5lbHM7Ci0gICAgfQotICAgIHVuc2lnbmVkIGdldEJpdHNQZXJTYW1wbGUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtU3RyZWFtSW5mby5iaXRzX3Blcl9zYW1wbGU7Ci0gICAgfQotICAgIEZMQUNfX3VpbnQ2NCBnZXRUb3RhbFNhbXBsZXMoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtU3RyZWFtSW5mby50b3RhbF9zYW1wbGVzOwotICAgIH0KLQotICAgIC8vIG1lZGlhIGJ1ZmZlcnMKLSAgICB2b2lkIGFsbG9jYXRlQnVmZmVycygpOwotICAgIHZvaWQgcmVsZWFzZUJ1ZmZlcnMoKTsKLSAgICBNZWRpYUJ1ZmZlciAqcmVhZEJ1ZmZlcigpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRCdWZmZXIoZmFsc2UsIDBMTCk7Ci0gICAgfQotICAgIE1lZGlhQnVmZmVyICpyZWFkQnVmZmVyKEZMQUNfX3VpbnQ2NCBzYW1wbGUpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRCdWZmZXIodHJ1ZSwgc2FtcGxlKTsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5GTEFDUGFyc2VyKCk7Ci0KLXByaXZhdGU6Ci0gICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7Ci0gICAgc3A8TWV0YURhdGE+IG1GaWxlTWV0YWRhdGE7Ci0gICAgc3A8TWV0YURhdGE+IG1UcmFja01ldGFkYXRhOwotICAgIGJvb2wgbUluaXRDaGVjazsKLQotICAgIC8vIG1lZGlhIGJ1ZmZlcnMKLSAgICBzaXplX3QgbU1heEJ1ZmZlclNpemU7Ci0gICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOwotICAgIHZvaWQgKCptQ29weSkoc2hvcnQgKmRzdCwgY29uc3QgaW50ICogc3JjW2tNYXhDaGFubmVsc10sIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpOwotCi0gICAgLy8gaGFuZGxlIHRvIHVuZGVybHlpbmcgbGliRkxBQyBwYXJzZXIKLSAgICBGTEFDX19TdHJlYW1EZWNvZGVyICptRGVjb2RlcjsKLQotICAgIC8vIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBkYXRhIHNvdXJjZQotICAgIG9mZjY0X3QgbUN1cnJlbnRQb3M7Ci0gICAgYm9vbCBtRU9GOwotCi0gICAgLy8gY2FjaGVkIHdoZW4gdGhlIFNUUkVBTUlORk8gbWV0YWRhdGEgaXMgcGFyc2VkIGJ5IGxpYkZMQUMKLSAgICBGTEFDX19TdHJlYW1NZXRhZGF0YV9TdHJlYW1JbmZvIG1TdHJlYW1JbmZvOwotICAgIGJvb2wgbVN0cmVhbUluZm9WYWxpZDsKLQotICAgIC8vIGNhY2hlZCB3aGVuIGEgZGVjb2RlZCBQQ00gYmxvY2sgaXMgIndyaXR0ZW4iIGJ5IGxpYkZMQUMgcGFyc2VyCi0gICAgYm9vbCBtV3JpdGVSZXF1ZXN0ZWQ7Ci0gICAgYm9vbCBtV3JpdGVDb21wbGV0ZWQ7Ci0gICAgRkxBQ19fRnJhbWVIZWFkZXIgbVdyaXRlSGVhZGVyOwotICAgIEZMQUNfX2ludDMyIGNvbnN0ICogbVdyaXRlQnVmZmVyW2tNYXhDaGFubmVsc107Ci0KLSAgICAvLyBtb3N0IHJlY2VudCBlcnJvciByZXBvcnRlZCBieSBsaWJGTEFDIHBhcnNlcgotICAgIEZMQUNfX1N0cmVhbURlY29kZXJFcnJvclN0YXR1cyBtRXJyb3JTdGF0dXM7Ci0KLSAgICBzdGF0dXNfdCBpbml0KCk7Ci0gICAgTWVkaWFCdWZmZXIgKnJlYWRCdWZmZXIoYm9vbCBkb1NlZWssIEZMQUNfX3VpbnQ2NCBzYW1wbGUpOwotCi0gICAgLy8gbm8gY29weSBjb25zdHJ1Y3RvciBvciBhc3NpZ25tZW50Ci0gICAgRkxBQ1BhcnNlcihjb25zdCBGTEFDUGFyc2VyICYpOwotICAgIEZMQUNQYXJzZXIgJm9wZXJhdG9yPShjb25zdCBGTEFDUGFyc2VyICYpOwotCi0gICAgLy8gRkxBQyBwYXJzZXIgY2FsbGJhY2tzIGFzIEMrKyBpbnN0YW5jZSBtZXRob2RzCi0gICAgRkxBQ19fU3RyZWFtRGVjb2RlclJlYWRTdGF0dXMgcmVhZENhbGxiYWNrKAotICAgICAgICAgICAgRkxBQ19fYnl0ZSBidWZmZXJbXSwgc2l6ZV90ICpieXRlcyk7Ci0gICAgRkxBQ19fU3RyZWFtRGVjb2RlclNlZWtTdGF0dXMgc2Vla0NhbGxiYWNrKAotICAgICAgICAgICAgRkxBQ19fdWludDY0IGFic29sdXRlX2J5dGVfb2Zmc2V0KTsKLSAgICBGTEFDX19TdHJlYW1EZWNvZGVyVGVsbFN0YXR1cyB0ZWxsQ2FsbGJhY2soCi0gICAgICAgICAgICBGTEFDX191aW50NjQgKmFic29sdXRlX2J5dGVfb2Zmc2V0KTsKLSAgICBGTEFDX19TdHJlYW1EZWNvZGVyTGVuZ3RoU3RhdHVzIGxlbmd0aENhbGxiYWNrKAotICAgICAgICAgICAgRkxBQ19fdWludDY0ICpzdHJlYW1fbGVuZ3RoKTsKLSAgICBGTEFDX19ib29sIGVvZkNhbGxiYWNrKCk7Ci0gICAgRkxBQ19fU3RyZWFtRGVjb2RlcldyaXRlU3RhdHVzIHdyaXRlQ2FsbGJhY2soCi0gICAgICAgICAgICBjb25zdCBGTEFDX19GcmFtZSAqZnJhbWUsIGNvbnN0IEZMQUNfX2ludDMyICogY29uc3QgYnVmZmVyW10pOwotICAgIHZvaWQgbWV0YWRhdGFDYWxsYmFjayhjb25zdCBGTEFDX19TdHJlYW1NZXRhZGF0YSAqbWV0YWRhdGEpOwotICAgIHZvaWQgZXJyb3JDYWxsYmFjayhGTEFDX19TdHJlYW1EZWNvZGVyRXJyb3JTdGF0dXMgc3RhdHVzKTsKLQotICAgIC8vIEZMQUMgcGFyc2VyIGNhbGxiYWNrcyBhcyBDLWNhbGxhYmxlIGZ1bmN0aW9ucwotICAgIHN0YXRpYyBGTEFDX19TdHJlYW1EZWNvZGVyUmVhZFN0YXR1cyByZWFkX2NhbGxiYWNrKAotICAgICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqZGVjb2RlciwKLSAgICAgICAgICAgIEZMQUNfX2J5dGUgYnVmZmVyW10sIHNpemVfdCAqYnl0ZXMsCi0gICAgICAgICAgICB2b2lkICpjbGllbnRfZGF0YSk7Ci0gICAgc3RhdGljIEZMQUNfX1N0cmVhbURlY29kZXJTZWVrU3RhdHVzIHNlZWtfY2FsbGJhY2soCi0gICAgICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICpkZWNvZGVyLAotICAgICAgICAgICAgRkxBQ19fdWludDY0IGFic29sdXRlX2J5dGVfb2Zmc2V0LAotICAgICAgICAgICAgdm9pZCAqY2xpZW50X2RhdGEpOwotICAgIHN0YXRpYyBGTEFDX19TdHJlYW1EZWNvZGVyVGVsbFN0YXR1cyB0ZWxsX2NhbGxiYWNrKAotICAgICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqZGVjb2RlciwKLSAgICAgICAgICAgIEZMQUNfX3VpbnQ2NCAqYWJzb2x1dGVfYnl0ZV9vZmZzZXQsCi0gICAgICAgICAgICB2b2lkICpjbGllbnRfZGF0YSk7Ci0gICAgc3RhdGljIEZMQUNfX1N0cmVhbURlY29kZXJMZW5ndGhTdGF0dXMgbGVuZ3RoX2NhbGxiYWNrKAotICAgICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqZGVjb2RlciwKLSAgICAgICAgICAgIEZMQUNfX3VpbnQ2NCAqc3RyZWFtX2xlbmd0aCwKLSAgICAgICAgICAgIHZvaWQgKmNsaWVudF9kYXRhKTsKLSAgICBzdGF0aWMgRkxBQ19fYm9vbCBlb2ZfY2FsbGJhY2soCi0gICAgICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICpkZWNvZGVyLAotICAgICAgICAgICAgdm9pZCAqY2xpZW50X2RhdGEpOwotICAgIHN0YXRpYyBGTEFDX19TdHJlYW1EZWNvZGVyV3JpdGVTdGF0dXMgd3JpdGVfY2FsbGJhY2soCi0gICAgICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICpkZWNvZGVyLAotICAgICAgICAgICAgY29uc3QgRkxBQ19fRnJhbWUgKmZyYW1lLCBjb25zdCBGTEFDX19pbnQzMiAqIGNvbnN0IGJ1ZmZlcltdLAotICAgICAgICAgICAgdm9pZCAqY2xpZW50X2RhdGEpOwotICAgIHN0YXRpYyB2b2lkIG1ldGFkYXRhX2NhbGxiYWNrKAotICAgICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqZGVjb2RlciwKLSAgICAgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbU1ldGFkYXRhICptZXRhZGF0YSwKLSAgICAgICAgICAgIHZvaWQgKmNsaWVudF9kYXRhKTsKLSAgICBzdGF0aWMgdm9pZCBlcnJvcl9jYWxsYmFjaygKLSAgICAgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKmRlY29kZXIsCi0gICAgICAgICAgICBGTEFDX19TdHJlYW1EZWNvZGVyRXJyb3JTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgdm9pZCAqY2xpZW50X2RhdGEpOwotCi19OwotCi0vLyBUaGUgRkxBQyBwYXJzZXIgY2FsbHMgb3VyIEMrKyBzdGF0aWMgY2FsbGJhY2tzIHVzaW5nIEMgY2FsbGluZyBjb252ZW50aW9ucywKLS8vIGluc2lkZSBGTEFDX19zdHJlYW1fZGVjb2Rlcl9wcm9jZXNzX3VudGlsX2VuZF9vZl9tZXRhZGF0YQotLy8gYW5kIEZMQUNfX3N0cmVhbV9kZWNvZGVyX3Byb2Nlc3Nfc2luZ2xlLgotLy8gV2UgaW1tZWRpYXRlbHkgdGhlbiBjYWxsIG91ciBjb3JyZXNwb25kaW5nIEMrKyBpbnN0YW5jZSBtZXRob2RzCi0vLyB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlciBsaXN0LCBidXQgZGlzY2FyZCByZWR1bmRhbnQgaW5mb3JtYXRpb24uCi0KLUZMQUNfX1N0cmVhbURlY29kZXJSZWFkU3RhdHVzIEZMQUNQYXJzZXI6OnJlYWRfY2FsbGJhY2soCi0gICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKiAvKiBkZWNvZGVyICovLCBGTEFDX19ieXRlIGJ1ZmZlcltdLAotICAgICAgICBzaXplX3QgKmJ5dGVzLCB2b2lkICpjbGllbnRfZGF0YSkKLXsKLSAgICByZXR1cm4gKChGTEFDUGFyc2VyICopIGNsaWVudF9kYXRhKS0+cmVhZENhbGxiYWNrKGJ1ZmZlciwgYnl0ZXMpOwotfQotCi1GTEFDX19TdHJlYW1EZWNvZGVyU2Vla1N0YXR1cyBGTEFDUGFyc2VyOjpzZWVrX2NhbGxiYWNrKAotICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICogLyogZGVjb2RlciAqLywKLSAgICAgICAgRkxBQ19fdWludDY0IGFic29sdXRlX2J5dGVfb2Zmc2V0LCB2b2lkICpjbGllbnRfZGF0YSkKLXsKLSAgICByZXR1cm4gKChGTEFDUGFyc2VyICopIGNsaWVudF9kYXRhKS0+c2Vla0NhbGxiYWNrKGFic29sdXRlX2J5dGVfb2Zmc2V0KTsKLX0KLQotRkxBQ19fU3RyZWFtRGVjb2RlclRlbGxTdGF0dXMgRkxBQ1BhcnNlcjo6dGVsbF9jYWxsYmFjaygKLSAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqIC8qIGRlY29kZXIgKi8sCi0gICAgICAgIEZMQUNfX3VpbnQ2NCAqYWJzb2x1dGVfYnl0ZV9vZmZzZXQsIHZvaWQgKmNsaWVudF9kYXRhKQotewotICAgIHJldHVybiAoKEZMQUNQYXJzZXIgKikgY2xpZW50X2RhdGEpLT50ZWxsQ2FsbGJhY2soYWJzb2x1dGVfYnl0ZV9vZmZzZXQpOwotfQotCi1GTEFDX19TdHJlYW1EZWNvZGVyTGVuZ3RoU3RhdHVzIEZMQUNQYXJzZXI6Omxlbmd0aF9jYWxsYmFjaygKLSAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqIC8qIGRlY29kZXIgKi8sCi0gICAgICAgIEZMQUNfX3VpbnQ2NCAqc3RyZWFtX2xlbmd0aCwgdm9pZCAqY2xpZW50X2RhdGEpCi17Ci0gICAgcmV0dXJuICgoRkxBQ1BhcnNlciAqKSBjbGllbnRfZGF0YSktPmxlbmd0aENhbGxiYWNrKHN0cmVhbV9sZW5ndGgpOwotfQotCi1GTEFDX19ib29sIEZMQUNQYXJzZXI6OmVvZl9jYWxsYmFjaygKLSAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqIC8qIGRlY29kZXIgKi8sIHZvaWQgKmNsaWVudF9kYXRhKQotewotICAgIHJldHVybiAoKEZMQUNQYXJzZXIgKikgY2xpZW50X2RhdGEpLT5lb2ZDYWxsYmFjaygpOwotfQotCi1GTEFDX19TdHJlYW1EZWNvZGVyV3JpdGVTdGF0dXMgRkxBQ1BhcnNlcjo6d3JpdGVfY2FsbGJhY2soCi0gICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbURlY29kZXIgKiAvKiBkZWNvZGVyICovLCBjb25zdCBGTEFDX19GcmFtZSAqZnJhbWUsCi0gICAgICAgIGNvbnN0IEZMQUNfX2ludDMyICogY29uc3QgYnVmZmVyW10sIHZvaWQgKmNsaWVudF9kYXRhKQotewotICAgIHJldHVybiAoKEZMQUNQYXJzZXIgKikgY2xpZW50X2RhdGEpLT53cml0ZUNhbGxiYWNrKGZyYW1lLCBidWZmZXIpOwotfQotCi12b2lkIEZMQUNQYXJzZXI6Om1ldGFkYXRhX2NhbGxiYWNrKAotICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1EZWNvZGVyICogLyogZGVjb2RlciAqLywKLSAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtTWV0YWRhdGEgKm1ldGFkYXRhLCB2b2lkICpjbGllbnRfZGF0YSkKLXsKLSAgICAoKEZMQUNQYXJzZXIgKikgY2xpZW50X2RhdGEpLT5tZXRhZGF0YUNhbGxiYWNrKG1ldGFkYXRhKTsKLX0KLQotdm9pZCBGTEFDUGFyc2VyOjplcnJvcl9jYWxsYmFjaygKLSAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRGVjb2RlciAqIC8qIGRlY29kZXIgKi8sCi0gICAgICAgIEZMQUNfX1N0cmVhbURlY29kZXJFcnJvclN0YXR1cyBzdGF0dXMsIHZvaWQgKmNsaWVudF9kYXRhKQotewotICAgICgoRkxBQ1BhcnNlciAqKSBjbGllbnRfZGF0YSktPmVycm9yQ2FsbGJhY2soc3RhdHVzKTsKLX0KLQotLy8gVGhlc2UgYXJlIHRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrcyB3aXRoIEMrKyBjYWxsaW5nIGNvbnZlbnRpb25zCi0KLUZMQUNfX1N0cmVhbURlY29kZXJSZWFkU3RhdHVzIEZMQUNQYXJzZXI6OnJlYWRDYWxsYmFjaygKLSAgICAgICAgRkxBQ19fYnl0ZSBidWZmZXJbXSwgc2l6ZV90ICpieXRlcykKLXsKLSAgICBzaXplX3QgcmVxdWVzdGVkID0gKmJ5dGVzOwotICAgIHNzaXplX3QgYWN0dWFsID0gbURhdGFTb3VyY2UtPnJlYWRBdChtQ3VycmVudFBvcywgYnVmZmVyLCByZXF1ZXN0ZWQpOwotICAgIGlmICgwID4gYWN0dWFsKSB7Ci0gICAgICAgICpieXRlcyA9IDA7Ci0gICAgICAgIHJldHVybiBGTEFDX19TVFJFQU1fREVDT0RFUl9SRUFEX1NUQVRVU19BQk9SVDsKLSAgICB9IGVsc2UgaWYgKDAgPT0gYWN0dWFsKSB7Ci0gICAgICAgICpieXRlcyA9IDA7Ci0gICAgICAgIG1FT0YgPSB0cnVlOwotICAgICAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0RFQ09ERVJfUkVBRF9TVEFUVVNfRU5EX09GX1NUUkVBTTsKLSAgICB9IGVsc2UgewotICAgICAgICBhc3NlcnQoYWN0dWFsIDw9IHJlcXVlc3RlZCk7Ci0gICAgICAgICpieXRlcyA9IGFjdHVhbDsKLSAgICAgICAgbUN1cnJlbnRQb3MgKz0gYWN0dWFsOwotICAgICAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0RFQ09ERVJfUkVBRF9TVEFUVVNfQ09OVElOVUU7Ci0gICAgfQotfQotCi1GTEFDX19TdHJlYW1EZWNvZGVyU2Vla1N0YXR1cyBGTEFDUGFyc2VyOjpzZWVrQ2FsbGJhY2soCi0gICAgICAgIEZMQUNfX3VpbnQ2NCBhYnNvbHV0ZV9ieXRlX29mZnNldCkKLXsKLSAgICBtQ3VycmVudFBvcyA9IGFic29sdXRlX2J5dGVfb2Zmc2V0OwotICAgIG1FT0YgPSBmYWxzZTsKLSAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0RFQ09ERVJfU0VFS19TVEFUVVNfT0s7Ci19Ci0KLUZMQUNfX1N0cmVhbURlY29kZXJUZWxsU3RhdHVzIEZMQUNQYXJzZXI6OnRlbGxDYWxsYmFjaygKLSAgICAgICAgRkxBQ19fdWludDY0ICphYnNvbHV0ZV9ieXRlX29mZnNldCkKLXsKLSAgICAqYWJzb2x1dGVfYnl0ZV9vZmZzZXQgPSBtQ3VycmVudFBvczsKLSAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0RFQ09ERVJfVEVMTF9TVEFUVVNfT0s7Ci19Ci0KLUZMQUNfX1N0cmVhbURlY29kZXJMZW5ndGhTdGF0dXMgRkxBQ1BhcnNlcjo6bGVuZ3RoQ2FsbGJhY2soCi0gICAgICAgIEZMQUNfX3VpbnQ2NCAqc3RyZWFtX2xlbmd0aCkKLXsKLSAgICBvZmY2NF90IHNpemU7Ci0gICAgaWYgKE9LID09IG1EYXRhU291cmNlLT5nZXRTaXplKCZzaXplKSkgewotICAgICAgICAqc3RyZWFtX2xlbmd0aCA9IHNpemU7Ci0gICAgICAgIHJldHVybiBGTEFDX19TVFJFQU1fREVDT0RFUl9MRU5HVEhfU1RBVFVTX09LOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBGTEFDX19TVFJFQU1fREVDT0RFUl9MRU5HVEhfU1RBVFVTX1VOU1VQUE9SVEVEOwotICAgIH0KLX0KLQotRkxBQ19fYm9vbCBGTEFDUGFyc2VyOjplb2ZDYWxsYmFjaygpCi17Ci0gICAgcmV0dXJuIG1FT0Y7Ci19Ci0KLUZMQUNfX1N0cmVhbURlY29kZXJXcml0ZVN0YXR1cyBGTEFDUGFyc2VyOjp3cml0ZUNhbGxiYWNrKAotICAgICAgICBjb25zdCBGTEFDX19GcmFtZSAqZnJhbWUsIGNvbnN0IEZMQUNfX2ludDMyICogY29uc3QgYnVmZmVyW10pCi17Ci0gICAgaWYgKG1Xcml0ZVJlcXVlc3RlZCkgewotICAgICAgICBtV3JpdGVSZXF1ZXN0ZWQgPSBmYWxzZTsKLSAgICAgICAgLy8gRkxBQyBwYXJzZXIgZG9lc24ndCBmcmVlIG9yIHJlYWxsb2MgYnVmZmVyIHVudGlsIG5leHQgZnJhbWUgb3IgZmluaXNoCi0gICAgICAgIG1Xcml0ZUhlYWRlciA9IGZyYW1lLT5oZWFkZXI7Ci0gICAgICAgIG1lbW1vdmUobVdyaXRlQnVmZmVyLCBidWZmZXIsIHNpemVvZihjb25zdCBGTEFDX19pbnQzMiAqIGNvbnN0KSAqIGdldENoYW5uZWxzKCkpOwotICAgICAgICBtV3JpdGVDb21wbGV0ZWQgPSB0cnVlOwotICAgICAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0RFQ09ERVJfV1JJVEVfU1RBVFVTX0NPTlRJTlVFOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJGTEFDUGFyc2VyOjp3cml0ZUNhbGxiYWNrIHVuZXhwZWN0ZWQiKTsKLSAgICAgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9ERUNPREVSX1dSSVRFX1NUQVRVU19BQk9SVDsKLSAgICB9Ci19Ci0KLXZvaWQgRkxBQ1BhcnNlcjo6bWV0YWRhdGFDYWxsYmFjayhjb25zdCBGTEFDX19TdHJlYW1NZXRhZGF0YSAqbWV0YWRhdGEpCi17Ci0gICAgc3dpdGNoIChtZXRhZGF0YS0+dHlwZSkgewotICAgIGNhc2UgRkxBQ19fTUVUQURBVEFfVFlQRV9TVFJFQU1JTkZPOgotICAgICAgICBpZiAoIW1TdHJlYW1JbmZvVmFsaWQpIHsKLSAgICAgICAgICAgIG1TdHJlYW1JbmZvID0gbWV0YWRhdGEtPmRhdGEuc3RyZWFtX2luZm87Ci0gICAgICAgICAgICBtU3RyZWFtSW5mb1ZhbGlkID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJGTEFDUGFyc2VyOjptZXRhZGF0YUNhbGxiYWNrIHVuZXhwZWN0ZWQgU1RSRUFNSU5GTyIpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRkxBQ19fTUVUQURBVEFfVFlQRV9WT1JCSVNfQ09NTUVOVDoKLSAgICAgICAgewotICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1NZXRhZGF0YV9Wb3JiaXNDb21tZW50ICp2YzsKLSAgICAgICAgdmMgPSAmbWV0YWRhdGEtPmRhdGEudm9yYmlzX2NvbW1lbnQ7Ci0gICAgICAgIGZvciAoRkxBQ19fdWludDMyIGkgPSAwOyBpIDwgdmMtPm51bV9jb21tZW50czsgKytpKSB7Ci0gICAgICAgICAgICBGTEFDX19TdHJlYW1NZXRhZGF0YV9Wb3JiaXNDb21tZW50X0VudHJ5ICp2Y2U7Ci0gICAgICAgICAgICB2Y2UgPSAmdmMtPmNvbW1lbnRzW2ldOwotICAgICAgICAgICAgaWYgKG1GaWxlTWV0YWRhdGEgIT0gMCAmJiB2Y2UtPmVudHJ5ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBwYXJzZVZvcmJpc0NvbW1lbnQobUZpbGVNZXRhZGF0YSwgKGNvbnN0IGNoYXIgKikgdmNlLT5lbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZjZS0+bGVuZ3RoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRkxBQ19fTUVUQURBVEFfVFlQRV9QSUNUVVJFOgotICAgICAgICBpZiAobUZpbGVNZXRhZGF0YSAhPSAwKSB7Ci0gICAgICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1NZXRhZGF0YV9QaWN0dXJlICpwID0gJm1ldGFkYXRhLT5kYXRhLnBpY3R1cmU7Ci0gICAgICAgICAgICBtRmlsZU1ldGFkYXRhLT5zZXREYXRhKGtLZXlBbGJ1bUFydCwKLSAgICAgICAgICAgICAgICAgICAgTWV0YURhdGE6OlRZUEVfTk9ORSwgcC0+ZGF0YSwgcC0+ZGF0YV9sZW5ndGgpOwotICAgICAgICAgICAgbUZpbGVNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5QWxidW1BcnRNSU1FLCBwLT5taW1lX3R5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dXKCJGTEFDUGFyc2VyOjptZXRhZGF0YUNhbGxiYWNrIHVuZXhwZWN0ZWQgdHlwZSAldSIsIG1ldGFkYXRhLT50eXBlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi12b2lkIEZMQUNQYXJzZXI6OmVycm9yQ2FsbGJhY2soRkxBQ19fU3RyZWFtRGVjb2RlckVycm9yU3RhdHVzIHN0YXR1cykKLXsKLSAgICBBTE9HRSgiRkxBQ1BhcnNlcjo6ZXJyb3JDYWxsYmFjayBzdGF0dXM9JWQiLCBzdGF0dXMpOwotICAgIG1FcnJvclN0YXR1cyA9IHN0YXR1czsKLX0KLQotLy8gQ29weSBzYW1wbGVzIGZyb20gRkxBQyBuYXRpdmUgMzItYml0IG5vbi1pbnRlcmxlYXZlZCB0byAxNi1iaXQgaW50ZXJsZWF2ZWQuCi0vLyBUaGVzZSBhcmUgY2FuZGlkYXRlcyBmb3Igb3B0aW1pemF0aW9uIGlmIG5lZWRlZC4KLQotc3RhdGljIHZvaWQgY29weU1vbm84KAotICAgICAgICBzaG9ydCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA8PCA4OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weVN0ZXJlbzgoCi0gICAgICAgIHNob3J0ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldIDw8IDg7Ci0gICAgICAgICpkc3QrKyA9IHNyY1sxXVtpXSA8PCA4OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weU11bHRpQ2g4KHNob3J0ICpkc3QsIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKQotewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBuQ2hhbm5lbHM7ICsrYykgewotICAgICAgICAgICAgKmRzdCsrID0gc3JjW2NdW2ldIDw8IDg7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlNb25vMTYoCi0gICAgICAgIHNob3J0ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weVN0ZXJlbzE2KAotICAgICAgICBzaG9ydCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXTsKLSAgICAgICAgKmRzdCsrID0gc3JjWzFdW2ldOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weU11bHRpQ2gxNihzaG9ydCAqZHN0LCBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscykKLXsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKLSAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gMjQtYml0IHZlcnNpb25zIHNob3VsZCBkbyBkaXRoZXJpbmcgb3Igbm9pc2Utc2hhcGluZywgaGVyZSBvciBpbiBBdWRpb0ZsaW5nZXIKLQotc3RhdGljIHZvaWQgY29weU1vbm8yNCgKLSAgICAgICAgc2hvcnQgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPj4gODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlTdGVyZW8yNCgKLSAgICAgICAgc2hvcnQgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPj4gODsKLSAgICAgICAgKmRzdCsrID0gc3JjWzFdW2ldID4+IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5TXVsdGlDaDI0KHNob3J0ICpkc3QsIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKQotewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBuQ2hhbm5lbHM7ICsrYykgewotICAgICAgICAgICAgKmRzdCsrID0gc3JjW2NdW2ldID4+IDg7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlUcmVzcGFzcygKLSAgICAgICAgc2hvcnQgKiAvKiBkc3QgKi8sCi0gICAgICAgIGNvbnN0IGludCAqW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10gLyogc3JjICovLAotICAgICAgICB1bnNpZ25lZCAvKiBuU2FtcGxlcyAqLywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgVFJFU1BBU1MoKTsKLX0KLQotLy8gRkxBQ1BhcnNlcgotCi1GTEFDUGFyc2VyOjpGTEFDUGFyc2VyKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YVNvdXJjZSwKLSAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZmaWxlTWV0YWRhdGEsCi0gICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmdHJhY2tNZXRhZGF0YSkKLSAgICA6IG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAotICAgICAgbUZpbGVNZXRhZGF0YShmaWxlTWV0YWRhdGEpLAotICAgICAgbVRyYWNrTWV0YWRhdGEodHJhY2tNZXRhZGF0YSksCi0gICAgICBtSW5pdENoZWNrKGZhbHNlKSwKLSAgICAgIG1NYXhCdWZmZXJTaXplKDApLAotICAgICAgbUdyb3VwKE5VTEwpLAotICAgICAgbUNvcHkoY29weVRyZXNwYXNzKSwKLSAgICAgIG1EZWNvZGVyKE5VTEwpLAotICAgICAgbUN1cnJlbnRQb3MoMExMKSwKLSAgICAgIG1FT0YoZmFsc2UpLAotICAgICAgbVN0cmVhbUluZm9WYWxpZChmYWxzZSksCi0gICAgICBtV3JpdGVSZXF1ZXN0ZWQoZmFsc2UpLAotICAgICAgbVdyaXRlQ29tcGxldGVkKGZhbHNlKSwKLSAgICAgIG1FcnJvclN0YXR1cygoRkxBQ19fU3RyZWFtRGVjb2RlckVycm9yU3RhdHVzKSAtMSkKLXsKLSAgICBBTE9HVigiRkxBQ1BhcnNlcjo6RkxBQ1BhcnNlciIpOwotICAgIG1lbXNldCgmbVN0cmVhbUluZm8sIDAsIHNpemVvZihtU3RyZWFtSW5mbykpOwotICAgIG1lbXNldCgmbVdyaXRlSGVhZGVyLCAwLCBzaXplb2YobVdyaXRlSGVhZGVyKSk7Ci0gICAgbUluaXRDaGVjayA9IGluaXQoKTsKLX0KLQotRkxBQ1BhcnNlcjo6fkZMQUNQYXJzZXIoKQotewotICAgIEFMT0dWKCJGTEFDUGFyc2VyOjp+RkxBQ1BhcnNlciIpOwotICAgIGlmIChtRGVjb2RlciAhPSBOVUxMKSB7Ci0gICAgICAgIEZMQUNfX3N0cmVhbV9kZWNvZGVyX2RlbGV0ZShtRGVjb2Rlcik7Ci0gICAgICAgIG1EZWNvZGVyID0gTlVMTDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEZMQUNQYXJzZXI6OmluaXQoKQotewotICAgIC8vIHNldHVwIGxpYkZMQUMgcGFyc2VyCi0gICAgbURlY29kZXIgPSBGTEFDX19zdHJlYW1fZGVjb2Rlcl9uZXcoKTsKLSAgICBpZiAobURlY29kZXIgPT0gTlVMTCkgewotICAgICAgICAvLyBUaGUgbmV3IHNob3VsZCBzdWNjZWVkLCBzaW5jZSBwcm9iYWJseSBhbGwgaXQgZG9lcyBpcyBhIG1hbGxvYwotICAgICAgICAvLyB0aGF0IGFsd2F5cyBzdWNjZWVkcyBpbiBBbmRyb2lkLiAgQnV0IHRvIGF2b2lkIGRlcGVuZGVuY2Ugb24gdGhlCi0gICAgICAgIC8vIGxpYkZMQUMgaW50ZXJuYWxzLCB3ZSBjaGVjayBhbmQgbG9nIGhlcmUuCi0gICAgICAgIEFMT0dFKCJuZXcgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBGTEFDX19zdHJlYW1fZGVjb2Rlcl9zZXRfbWQ1X2NoZWNraW5nKG1EZWNvZGVyLCBmYWxzZSk7Ci0gICAgRkxBQ19fc3RyZWFtX2RlY29kZXJfc2V0X21ldGFkYXRhX2lnbm9yZV9hbGwobURlY29kZXIpOwotICAgIEZMQUNfX3N0cmVhbV9kZWNvZGVyX3NldF9tZXRhZGF0YV9yZXNwb25kKAotICAgICAgICAgICAgbURlY29kZXIsIEZMQUNfX01FVEFEQVRBX1RZUEVfU1RSRUFNSU5GTyk7Ci0gICAgRkxBQ19fc3RyZWFtX2RlY29kZXJfc2V0X21ldGFkYXRhX3Jlc3BvbmQoCi0gICAgICAgICAgICBtRGVjb2RlciwgRkxBQ19fTUVUQURBVEFfVFlQRV9QSUNUVVJFKTsKLSAgICBGTEFDX19zdHJlYW1fZGVjb2Rlcl9zZXRfbWV0YWRhdGFfcmVzcG9uZCgKLSAgICAgICAgICAgIG1EZWNvZGVyLCBGTEFDX19NRVRBREFUQV9UWVBFX1ZPUkJJU19DT01NRU5UKTsKLSAgICBGTEFDX19TdHJlYW1EZWNvZGVySW5pdFN0YXR1cyBpbml0U3RhdHVzOwotICAgIGluaXRTdGF0dXMgPSBGTEFDX19zdHJlYW1fZGVjb2Rlcl9pbml0X3N0cmVhbSgKLSAgICAgICAgICAgIG1EZWNvZGVyLAotICAgICAgICAgICAgcmVhZF9jYWxsYmFjaywgc2Vla19jYWxsYmFjaywgdGVsbF9jYWxsYmFjaywKLSAgICAgICAgICAgIGxlbmd0aF9jYWxsYmFjaywgZW9mX2NhbGxiYWNrLCB3cml0ZV9jYWxsYmFjaywKLSAgICAgICAgICAgIG1ldGFkYXRhX2NhbGxiYWNrLCBlcnJvcl9jYWxsYmFjaywgKHZvaWQgKikgdGhpcyk7Ci0gICAgaWYgKGluaXRTdGF0dXMgIT0gRkxBQ19fU1RSRUFNX0RFQ09ERVJfSU5JVF9TVEFUVVNfT0spIHsKLSAgICAgICAgLy8gQSBmYWlsdXJlIGhlcmUgcHJvYmFibHkgaW5kaWNhdGVzIGEgcHJvZ3JhbW1pbmcgZXJyb3IgYW5kIHNvIGlzCi0gICAgICAgIC8vIHVubGlrZWx5IHRvIGhhcHBlbi4gQnV0IHdlIGNoZWNrIGFuZCBsb2cgaGVyZSBzaW1pbGFybHkgdG8gYWJvdmUuCi0gICAgICAgIEFMT0dFKCJpbml0X3N0cmVhbSBmYWlsZWQgJWQiLCBpbml0U3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIC8vIHBhcnNlIGFsbCBtZXRhZGF0YQotICAgIGlmICghRkxBQ19fc3RyZWFtX2RlY29kZXJfcHJvY2Vzc191bnRpbF9lbmRfb2ZfbWV0YWRhdGEobURlY29kZXIpKSB7Ci0gICAgICAgIEFMT0dFKCJlbmRfb2ZfbWV0YWRhdGEgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBpZiAobVN0cmVhbUluZm9WYWxpZCkgewotICAgICAgICAvLyBjaGVjayBjaGFubmVsIGNvdW50Ci0gICAgICAgIGlmIChnZXRDaGFubmVscygpID09IDAgfHwgZ2V0Q2hhbm5lbHMoKSA+IGtNYXhDaGFubmVscykgewotICAgICAgICAgICAgQUxPR0UoInVuc3VwcG9ydGVkIGNoYW5uZWwgY291bnQgJXUiLCBnZXRDaGFubmVscygpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNoZWNrIGJpdCBkZXB0aAotICAgICAgICBzd2l0Y2ggKGdldEJpdHNQZXJTYW1wbGUoKSkgewotICAgICAgICBjYXNlIDg6Ci0gICAgICAgIGNhc2UgMTY6Ci0gICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJ1bnN1cHBvcnRlZCBiaXRzIHBlciBzYW1wbGUgJXUiLCBnZXRCaXRzUGVyU2FtcGxlKCkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gY2hlY2sgc2FtcGxlIHJhdGUKLSAgICAgICAgc3dpdGNoIChnZXRTYW1wbGVSYXRlKCkpIHsKLSAgICAgICAgY2FzZSAgODAwMDoKLSAgICAgICAgY2FzZSAxMTAyNToKLSAgICAgICAgY2FzZSAxMjAwMDoKLSAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgY2FzZSAyMjA1MDoKLSAgICAgICAgY2FzZSAyNDAwMDoKLSAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgY2FzZSA0NDEwMDoKLSAgICAgICAgY2FzZSA0ODAwMDoKLSAgICAgICAgY2FzZSA4ODIwMDoKLSAgICAgICAgY2FzZSA5NjAwMDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoInVuc3VwcG9ydGVkIHNhbXBsZSByYXRlICV1IiwgZ2V0U2FtcGxlUmF0ZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNvbmZpZ3VyZSB0aGUgYXBwcm9wcmlhdGUgY29weSBmdW5jdGlvbiwgZGVmYXVsdGluZyB0byB0cmVzcGFzcwotICAgICAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKLSAgICAgICAgICAgIHVuc2lnbmVkIG1DaGFubmVsczsKLSAgICAgICAgICAgIHVuc2lnbmVkIG1CaXRzUGVyU2FtcGxlOwotICAgICAgICAgICAgdm9pZCAoKm1Db3B5KShzaG9ydCAqZHN0LCBjb25zdCBpbnQgKiBzcmNba01heENoYW5uZWxzXSwgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscyk7Ci0gICAgICAgIH0gdGFibGVbXSA9IHsKLSAgICAgICAgICAgIHsgMSwgIDgsIGNvcHlNb25vOCAgICB9LAotICAgICAgICAgICAgeyAyLCAgOCwgY29weVN0ZXJlbzggIH0sCi0gICAgICAgICAgICB7IDgsICA4LCBjb3B5TXVsdGlDaDggIH0sCi0gICAgICAgICAgICB7IDEsIDE2LCBjb3B5TW9ubzE2ICAgfSwKLSAgICAgICAgICAgIHsgMiwgMTYsIGNvcHlTdGVyZW8xNiB9LAotICAgICAgICAgICAgeyA4LCAxNiwgY29weU11bHRpQ2gxNiB9LAotICAgICAgICAgICAgeyAxLCAyNCwgY29weU1vbm8yNCAgIH0sCi0gICAgICAgICAgICB7IDIsIDI0LCBjb3B5U3RlcmVvMjQgfSwKLSAgICAgICAgICAgIHsgOCwgMjQsIGNvcHlNdWx0aUNoMjQgfSwKLSAgICAgICAgfTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemVvZih0YWJsZSkvc2l6ZW9mKHRhYmxlWzBdKTsgKytpKSB7Ci0gICAgICAgICAgICBpZiAodGFibGVbaV0ubUNoYW5uZWxzID49IGdldENoYW5uZWxzKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgdGFibGVbaV0ubUJpdHNQZXJTYW1wbGUgPT0gZ2V0Qml0c1BlclNhbXBsZSgpKSB7Ci0gICAgICAgICAgICAgICAgbUNvcHkgPSB0YWJsZVtpXS5tQ29weTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBwb3B1bGF0ZSB0cmFjayBtZXRhZGF0YQotICAgICAgICBpZiAobVRyYWNrTWV0YWRhdGEgIT0gMCkgewotICAgICAgICAgICAgbVRyYWNrTWV0YWRhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOwotICAgICAgICAgICAgbVRyYWNrTWV0YWRhdGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGdldENoYW5uZWxzKCkpOwotICAgICAgICAgICAgbVRyYWNrTWV0YWRhdGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBnZXRTYW1wbGVSYXRlKCkpOwotICAgICAgICAgICAgbVRyYWNrTWV0YWRhdGEtPnNldEludDMyKGtLZXlQY21FbmNvZGluZywga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCk7Ci0gICAgICAgICAgICAvLyBzYW1wbGUgcmF0ZSBpcyBub24temVybywgc28gZGl2aXNpb24gYnkgemVybyBub3QgcG9zc2libGUKLSAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIChnZXRUb3RhbFNhbXBsZXMoKSAqIDEwMDAwMDBMTCkgLyBnZXRTYW1wbGVSYXRlKCkpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIm1pc3NpbmcgU1RSRUFNSU5GTyIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgaWYgKG1GaWxlTWV0YWRhdGEgIT0gMCkgewotICAgICAgICBtRmlsZU1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQyk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBGTEFDUGFyc2VyOjphbGxvY2F0ZUJ1ZmZlcnMoKQotewotICAgIENIRUNLKG1Hcm91cCA9PSBOVUxMKTsKLSAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKLSAgICBtTWF4QnVmZmVyU2l6ZSA9IGdldE1heEJsb2NrU2l6ZSgpICogZ2V0Q2hhbm5lbHMoKSAqIHNpemVvZihzaG9ydCk7Ci0gICAgbUdyb3VwLT5hZGRfYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcihtTWF4QnVmZmVyU2l6ZSkpOwotfQotCi12b2lkIEZMQUNQYXJzZXI6OnJlbGVhc2VCdWZmZXJzKCkKLXsKLSAgICBDSEVDSyhtR3JvdXAgIT0gTlVMTCk7Ci0gICAgZGVsZXRlIG1Hcm91cDsKLSAgICBtR3JvdXAgPSBOVUxMOwotfQotCi1NZWRpYUJ1ZmZlciAqRkxBQ1BhcnNlcjo6cmVhZEJ1ZmZlcihib29sIGRvU2VlaywgRkxBQ19fdWludDY0IHNhbXBsZSkKLXsKLSAgICBtV3JpdGVSZXF1ZXN0ZWQgPSB0cnVlOwotICAgIG1Xcml0ZUNvbXBsZXRlZCA9IGZhbHNlOwotICAgIGlmIChkb1NlZWspIHsKLSAgICAgICAgLy8gV2UgaW1wbGVtZW50IHRoZSBzZWVrIGNhbGxiYWNrLCBzbyB0aGlzIHdvcmtzIHdpdGhvdXQgZXhwbGljaXQgZmx1c2gKLSAgICAgICAgaWYgKCFGTEFDX19zdHJlYW1fZGVjb2Rlcl9zZWVrX2Fic29sdXRlKG1EZWNvZGVyLCBzYW1wbGUpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRkxBQ1BhcnNlcjo6cmVhZEJ1ZmZlciBzZWVrIHRvIHNhbXBsZSAlbGxkIGZhaWxlZCIsIChsb25nIGxvbmcpc2FtcGxlKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJGTEFDUGFyc2VyOjpyZWFkQnVmZmVyIHNlZWsgdG8gc2FtcGxlICVsbGQgc3VjY2VlZGVkIiwgKGxvbmcgbG9uZylzYW1wbGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghRkxBQ19fc3RyZWFtX2RlY29kZXJfcHJvY2Vzc19zaW5nbGUobURlY29kZXIpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRkxBQ1BhcnNlcjo6cmVhZEJ1ZmZlciBwcm9jZXNzX3NpbmdsZSBmYWlsZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghbVdyaXRlQ29tcGxldGVkKSB7Ci0gICAgICAgIEFMT0dWKCJGTEFDUGFyc2VyOjpyZWFkQnVmZmVyIHdyaXRlIGRpZCBub3QgY29tcGxldGUiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIC8vIHZlcmlmeSB0aGF0IGJsb2NrIGhlYWRlciBrZWVwcyB0aGUgcHJvbWlzZXMgbWFkZSBieSBTVFJFQU1JTkZPCi0gICAgdW5zaWduZWQgYmxvY2tzaXplID0gbVdyaXRlSGVhZGVyLmJsb2Nrc2l6ZTsKLSAgICBpZiAoYmxvY2tzaXplID09IDAgfHwgYmxvY2tzaXplID4gZ2V0TWF4QmxvY2tTaXplKCkpIHsKLSAgICAgICAgQUxPR0UoIkZMQUNQYXJzZXI6OnJlYWRCdWZmZXIgd3JpdGUgaW52YWxpZCBibG9ja3NpemUgJXUiLCBibG9ja3NpemUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKG1Xcml0ZUhlYWRlci5zYW1wbGVfcmF0ZSAhPSBnZXRTYW1wbGVSYXRlKCkgfHwKLSAgICAgICAgbVdyaXRlSGVhZGVyLmNoYW5uZWxzICE9IGdldENoYW5uZWxzKCkgfHwKLSAgICAgICAgbVdyaXRlSGVhZGVyLmJpdHNfcGVyX3NhbXBsZSAhPSBnZXRCaXRzUGVyU2FtcGxlKCkpIHsKLSAgICAgICAgQUxPR0UoIkZMQUNQYXJzZXI6OnJlYWRCdWZmZXIgd3JpdGUgY2hhbmdlZCBwYXJhbWV0ZXJzIG1pZC1zdHJlYW06ICVkLyVkLyVkIC0+ICVkLyVkLyVkIiwKLSAgICAgICAgICAgICAgICBnZXRTYW1wbGVSYXRlKCksIGdldENoYW5uZWxzKCksIGdldEJpdHNQZXJTYW1wbGUoKSwKLSAgICAgICAgICAgICAgICBtV3JpdGVIZWFkZXIuc2FtcGxlX3JhdGUsIG1Xcml0ZUhlYWRlci5jaGFubmVscywgbVdyaXRlSGVhZGVyLmJpdHNfcGVyX3NhbXBsZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICAvLyBhY3F1aXJlIGEgbWVkaWEgYnVmZmVyCi0gICAgQ0hFQ0sobUdyb3VwICE9IE5VTEwpOwotICAgIE1lZGlhQnVmZmVyICpidWZmZXI7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IGJsb2Nrc2l6ZSAqIGdldENoYW5uZWxzKCkgKiBzaXplb2Yoc2hvcnQpOwotICAgIENIRUNLKGJ1ZmZlclNpemUgPD0gbU1heEJ1ZmZlclNpemUpOwotICAgIHNob3J0ICpkYXRhID0gKHNob3J0ICopIGJ1ZmZlci0+ZGF0YSgpOwotICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIGJ1ZmZlclNpemUpOwotICAgIC8vIGNvcHkgUENNIGZyb20gRkxBQyB3cml0ZSBidWZmZXIgdG8gb3VyIG1lZGlhIGJ1ZmZlciwgd2l0aCBpbnRlcmxlYXZpbmcKLSAgICAoKm1Db3B5KShkYXRhLCBtV3JpdGVCdWZmZXIsIGJsb2Nrc2l6ZSwgZ2V0Q2hhbm5lbHMoKSk7Ci0gICAgLy8gZmlsbCBpbiBidWZmZXIgbWV0YWRhdGEKLSAgICBDSEVDSyhtV3JpdGVIZWFkZXIubnVtYmVyX3R5cGUgPT0gRkxBQ19fRlJBTUVfTlVNQkVSX1RZUEVfU0FNUExFX05VTUJFUik7Ci0gICAgRkxBQ19fdWludDY0IHNhbXBsZU51bWJlciA9IG1Xcml0ZUhlYWRlci5udW1iZXIuc2FtcGxlX251bWJlcjsKLSAgICBpbnQ2NF90IHRpbWVVcyA9ICgxMDAwMDAwTEwgKiBzYW1wbGVOdW1iZXIpIC8gZ2V0U2FtcGxlUmF0ZSgpOwotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOwotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7Ci0gICAgcmV0dXJuIGJ1ZmZlcjsKLX0KLQotLy8gRkxBQ3NvdXJjZQotCi1GTEFDU291cmNlOjpGTEFDU291cmNlKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YVNvdXJjZSwKLSAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZ0cmFja01ldGFkYXRhKQotICAgIDogbURhdGFTb3VyY2UoZGF0YVNvdXJjZSksCi0gICAgICBtVHJhY2tNZXRhZGF0YSh0cmFja01ldGFkYXRhKSwKLSAgICAgIG1QYXJzZXIoMCksCi0gICAgICBtSW5pdENoZWNrKGZhbHNlKSwKLSAgICAgIG1TdGFydGVkKGZhbHNlKQotewotICAgIEFMT0dWKCJGTEFDU291cmNlOjpGTEFDU291cmNlIik7Ci0gICAgbUluaXRDaGVjayA9IGluaXQoKTsKLX0KLQotRkxBQ1NvdXJjZTo6fkZMQUNTb3VyY2UoKQotewotICAgIEFMT0dWKCJ+RkxBQ1NvdXJjZTo6RkxBQ1NvdXJjZSIpOwotICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICBzdG9wKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBGTEFDU291cmNlOjpzdGFydChNZXRhRGF0YSAqIC8qIHBhcmFtcyAqLykKLXsKLSAgICBBTE9HVigiRkxBQ1NvdXJjZTo6c3RhcnQiKTsKLQotICAgIENIRUNLKCFtU3RhcnRlZCk7Ci0gICAgbVBhcnNlci0+YWxsb2NhdGVCdWZmZXJzKCk7Ci0gICAgbVN0YXJ0ZWQgPSB0cnVlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBGTEFDU291cmNlOjpzdG9wKCkKLXsKLSAgICBBTE9HVigiRkxBQ1NvdXJjZTo6c3RvcCIpOwotCi0gICAgQ0hFQ0sobVN0YXJ0ZWQpOwotICAgIG1QYXJzZXItPnJlbGVhc2VCdWZmZXJzKCk7Ci0gICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3A8TWV0YURhdGE+IEZMQUNTb3VyY2U6OmdldEZvcm1hdCgpCi17Ci0gICAgcmV0dXJuIG1UcmFja01ldGFkYXRhOwotfQotCi1zdGF0dXNfdCBGTEFDU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dEJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpCi17Ci0gICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKLSAgICAvLyBwcm9jZXNzIGFuIG9wdGlvbmFsIHNlZWsgcmVxdWVzdAotICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKLSAgICBpZiAoKE5VTEwgIT0gb3B0aW9ucykgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKLSAgICAgICAgRkxBQ19fdWludDY0IHNhbXBsZTsKLSAgICAgICAgaWYgKHNlZWtUaW1lVXMgPD0gMExMKSB7Ci0gICAgICAgICAgICBzYW1wbGUgPSAwTEw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBzYW1wbGUgYW5kIHRvdGFsIHNhbXBsZXMgYXJlIGJvdGggemVyby1iYXNlZCwgYW5kIHNlZWsgdG8gRU9GIG9rCi0gICAgICAgICAgICBzYW1wbGUgPSAoc2Vla1RpbWVVcyAqIG1QYXJzZXItPmdldFNhbXBsZVJhdGUoKSkgLyAxMDAwMDAwTEw7Ci0gICAgICAgICAgICBpZiAoc2FtcGxlID49IG1QYXJzZXItPmdldFRvdGFsU2FtcGxlcygpKSB7Ci0gICAgICAgICAgICAgICAgc2FtcGxlID0gbVBhcnNlci0+Z2V0VG90YWxTYW1wbGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnVmZmVyID0gbVBhcnNlci0+cmVhZEJ1ZmZlcihzYW1wbGUpOwotICAgIC8vIG90aGVyd2lzZSByZWFkIHNlcXVlbnRpYWxseQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ1ZmZlciA9IG1QYXJzZXItPnJlYWRCdWZmZXIoKTsKLSAgICB9Ci0gICAgKm91dEJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICByZXR1cm4gYnVmZmVyICE9IE5VTEwgPyAoc3RhdHVzX3QpIE9LIDogKHN0YXR1c190KSBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotfQotCi1zdGF0dXNfdCBGTEFDU291cmNlOjppbml0KCkKLXsKLSAgICBBTE9HVigiRkxBQ1NvdXJjZTo6aW5pdCIpOwotICAgIC8vIHJlLXVzZSB0aGUgc2FtZSB0cmFjayBtZXRhZGF0YSBwYXNzZWQgaW50byBjb25zdHJ1Y3RvciBmcm9tIEZMQUNFeHRyYWN0b3IKLSAgICBtUGFyc2VyID0gbmV3IEZMQUNQYXJzZXIobURhdGFTb3VyY2UpOwotICAgIHJldHVybiBtUGFyc2VyLT5pbml0Q2hlY2soKTsKLX0KLQotLy8gRkxBQ0V4dHJhY3RvcgotCi1GTEFDRXh0cmFjdG9yOjpGTEFDRXh0cmFjdG9yKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YVNvdXJjZSkKLSAgICA6IG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAotICAgICAgbUluaXRDaGVjayhmYWxzZSkKLXsKLSAgICBBTE9HVigiRkxBQ0V4dHJhY3Rvcjo6RkxBQ0V4dHJhY3RvciIpOwotICAgIG1Jbml0Q2hlY2sgPSBpbml0KCk7Ci19Ci0KLUZMQUNFeHRyYWN0b3I6On5GTEFDRXh0cmFjdG9yKCkKLXsKLSAgICBBTE9HVigifkZMQUNFeHRyYWN0b3I6OkZMQUNFeHRyYWN0b3IiKTsKLX0KLQotc2l6ZV90IEZMQUNFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkKLXsKLSAgICByZXR1cm4gbUluaXRDaGVjayA9PSBPSyA/IDEgOiAwOwotfQotCi1zcDxJTWVkaWFTb3VyY2U+IEZMQUNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkKLXsKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBuZXcgRkxBQ1NvdXJjZShtRGF0YVNvdXJjZSwgbVRyYWNrTWV0YWRhdGEpOwotfQotCi1zcDxNZXRhRGF0YT4gRkxBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewotICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ID4gMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIG1UcmFja01ldGFkYXRhOwotfQotCi1zdGF0dXNfdCBGTEFDRXh0cmFjdG9yOjppbml0KCkKLXsKLSAgICBtRmlsZU1ldGFkYXRhID0gbmV3IE1ldGFEYXRhOwotICAgIG1UcmFja01ldGFkYXRhID0gbmV3IE1ldGFEYXRhOwotICAgIC8vIEZMQUNQYXJzZXIgd2lsbCBmaWxsIGluIHRoZSBtZXRhZGF0YSBmb3IgdXMKLSAgICBtUGFyc2VyID0gbmV3IEZMQUNQYXJzZXIobURhdGFTb3VyY2UsIG1GaWxlTWV0YWRhdGEsIG1UcmFja01ldGFkYXRhKTsKLSAgICByZXR1cm4gbVBhcnNlci0+aW5pdENoZWNrKCk7Ci19Ci0KLXNwPE1ldGFEYXRhPiBGTEFDRXh0cmFjdG9yOjpnZXRNZXRhRGF0YSgpCi17Ci0gICAgcmV0dXJuIG1GaWxlTWV0YWRhdGE7Ci19Ci0KLS8vIFNuaWZmZXIKLQotYm9vbCBTbmlmZkZMQUMoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgc3A8QU1lc3NhZ2U+ICopCi17Ci0gICAgLy8gZmlyc3QgNCBpcyB0aGUgc2lnbmF0dXJlIHdvcmQKLSAgICAvLyBzZWNvbmQgNCBpcyB0aGUgc2l6ZW9mIFNUUkVBTUlORk8KLSAgICAvLyAwNDIgaXMgdGhlIG1hbmRhdG9yeSBTVFJFQU1JTkZPCi0gICAgLy8gbm8gbmVlZCB0byByZWFkIHJlc3Qgb2YgdGhlIGhlYWRlciwgYXMgYSBwcmVtYXR1cmUgRU9GIHdpbGwgYmUgY2F1Z2h0IGxhdGVyCi0gICAgdWludDhfdCBoZWFkZXJbNCs0XTsKLSAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgIT0gc2l6ZW9mKGhlYWRlcikKLSAgICAgICAgICAgIHx8IG1lbWNtcCgiZkxhQ1wwXDBcMFwwNDIiLCBoZWFkZXIsIDQrNCkpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgKm1pbWVUeXBlID0gTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQzsKLSAgICAqY29uZmlkZW5jZSA9IDAuNTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GaWxlU291cmNlLmNwcAppbmRleCA5N2Q4OTg4Li5lZWY1MzE0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GaWxlU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GaWxlU291cmNlLmNwcApAQCAtMTk0LDEyICsxOTQsNiBAQAogICAgIHJldHVybiBtRGVjcnlwdEhhbmRsZTsKIH0KIAotdm9pZCBGaWxlU291cmNlOjpnZXREcm1JbmZvKHNwPERlY3J5cHRIYW5kbGU+ICZoYW5kbGUsIERybU1hbmFnZXJDbGllbnQgKipjbGllbnQpIHsKLSAgICBoYW5kbGUgPSBtRGVjcnlwdEhhbmRsZTsKLQotICAgICpjbGllbnQgPSBtRHJtTWFuYWdlckNsaWVudDsKLX0KLQogc3NpemVfdCBGaWxlU291cmNlOjpyZWFkQXREUk0ob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgc2l6ZV90IERSTV9DQUNIRV9TSVpFID0gMTAyNDsKICAgICBpZiAobURybUJ1ZiA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZURlY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVEZWNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWEyMTlmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVEZWNvZGVyLmNwcApAQCAtMCwwICsxLDc0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRnJhbWVEZWNvZGVyIgorCisjaW5jbHVkZSAiaW5jbHVkZS9GcmFtZURlY29kZXIuaCIKKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5QmFzZS5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9WaWRlb0ZyYW1lLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IGludDY0X3Qga0J1ZmZlclRpbWVPdXRVcyA9IDEwMDAwbGw7IC8vIDEwIG1zZWMKK3N0YXRpYyBjb25zdCBzaXplX3Qga1JldHJ5Q291bnQgPSA1MDsgLy8gbXVzdCBiZSA+MAorCitzcDxJTWVtb3J5PiBhbGxvY1ZpZGVvRnJhbWUoY29uc3Qgc3A8TWV0YURhdGE+JiB0cmFja01ldGEsCisgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IHRpbGVXaWR0aCwgaW50MzJfdCB0aWxlSGVpZ2h0LAorICAgICAgICBpbnQzMl90IGRzdEJwcCwgYm9vbCBtZXRhT25seSA9IGZhbHNlKSB7CisgICAgaW50MzJfdCByb3RhdGlvbkFuZ2xlOworICAgIGlmICghdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVJvdGF0aW9uLCAmcm90YXRpb25BbmdsZSkpIHsKKyAgICAgICAgcm90YXRpb25BbmdsZSA9IDA7ICAvLyBCeSBkZWZhdWx0LCBubyByb3RhdGlvbgorICAgIH0KKyAgICB1aW50MzJfdCB0eXBlOworICAgIGNvbnN0IHZvaWQgKmljY0RhdGE7CisgICAgc2l6ZV90IGljY1NpemU7CisgICAgaWYgKCF0cmFja01ldGEtPmZpbmREYXRhKGtLZXlJY2NQcm9maWxlLCAmdHlwZSwgJmljY0RhdGEsICZpY2NTaXplKSl7CisgICAgICAgIGljY0RhdGEgPSBOVUxMOworICAgICAgICBpY2NTaXplID0gMDsKKyAgICB9CisKKyAgICBpbnQzMl90IHNhcldpZHRoLCBzYXJIZWlnaHQ7CisgICAgaW50MzJfdCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQ7CisgICAgaWYgKHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlTQVJXaWR0aCwgJnNhcldpZHRoKQorICAgICAgICAgICAgJiYgdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVNBUkhlaWdodCwgJnNhckhlaWdodCkKKyAgICAgICAgICAgICYmIHNhckhlaWdodCAhPSAwKSB7CisgICAgICAgIGRpc3BsYXlXaWR0aCA9ICh3aWR0aCAqIHNhcldpZHRoKSAvIHNhckhlaWdodDsKKyAgICAgICAgZGlzcGxheUhlaWdodCA9IGhlaWdodDsKKyAgICB9IGVsc2UgaWYgKHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlEaXNwbGF5V2lkdGgsICZkaXNwbGF5V2lkdGgpCisgICAgICAgICAgICAgICAgJiYgdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleURpc3BsYXlIZWlnaHQsICZkaXNwbGF5SGVpZ2h0KQorICAgICAgICAgICAgICAgICYmIGRpc3BsYXlXaWR0aCA+IDAgJiYgZGlzcGxheUhlaWdodCA+IDAKKyAgICAgICAgICAgICAgICAmJiB3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCkgeworICAgICAgICBBTE9HVigiZm91bmQgZGlzcGxheSBzaXplICVkeCVkIiwgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBkaXNwbGF5V2lkdGggPSB3aWR0aDsKKyAgICAgICAgZGlzcGxheUhlaWdodCA9IGhlaWdodDsKKyAgICB9CisKKyAgICBWaWRlb0ZyYW1lIGZyYW1lKHdpZHRoLCBoZWlnaHQsIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCwKKyAgICAgICAgICAgIHRpbGVXaWR0aCwgdGlsZUhlaWdodCwgcm90YXRpb25BbmdsZSwgZHN0QnBwLCAhbWV0YU9ubHksIGljY1NpemUpOworCisgICAgc2l6ZV90IHNpemUgPSBmcmFtZS5nZXRGbGF0dGVuZWRTaXplKCk7CisgICAgc3A8TWVtb3J5SGVhcEJhc2U+IGhlYXAgPSBuZXcgTWVtb3J5SGVhcEJhc2Uoc2l6ZSwgMCwgIk1ldGFkYXRhUmV0cmlldmVyQ2xpZW50Iik7CisgICAgaWYgKGhlYXAgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGNyZWF0ZSBNZW1vcnlEZWFsZXIiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHNwPElNZW1vcnk+IGZyYW1lTWVtID0gbmV3IE1lbW9yeUJhc2UoaGVhcCwgMCwgc2l6ZSk7CisgICAgaWYgKGZyYW1lTWVtID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBWaWRlb0ZyYW1lIHNpemU9JXp1Iiwgc2l6ZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBWaWRlb0ZyYW1lKiBmcmFtZUNvcHkgPSBzdGF0aWNfY2FzdDxWaWRlb0ZyYW1lKj4oZnJhbWVNZW0tPnBvaW50ZXIoKSk7CisgICAgZnJhbWVDb3B5LT5pbml0KGZyYW1lLCBpY2NEYXRhLCBpY2NTaXplKTsKKworICAgIHJldHVybiBmcmFtZU1lbTsKK30KKworYm9vbCBmaW5kVGh1bWJuYWlsSW5mbygKKyAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZ0cmFja01ldGEsIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQsCisgICAgICAgIHVpbnQzMl90ICp0eXBlID0gTlVMTCwgY29uc3Qgdm9pZCAqKmRhdGEgPSBOVUxMLCBzaXplX3QgKnNpemUgPSBOVUxMKSB7CisgICAgdWludDMyX3QgZHVtbXlUeXBlOworICAgIGNvbnN0IHZvaWQgKmR1bW15RGF0YTsKKyAgICBzaXplX3QgZHVtbXlTaXplOworICAgIHJldHVybiB0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5VGh1bWJuYWlsV2lkdGgsIHdpZHRoKQorICAgICAgICAmJiB0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5VGh1bWJuYWlsSGVpZ2h0LCBoZWlnaHQpCisgICAgICAgICYmIHRyYWNrTWV0YS0+ZmluZERhdGEoa0tleVRodW1ibmFpbEhWQ0MsCisgICAgICAgICAgICAgICAgdHlwZSA/OiAmZHVtbXlUeXBlLCBkYXRhID86ICZkdW1teURhdGEsIHNpemUgPzogJmR1bW15U2l6ZSk7Cit9CisKK2Jvb2wgZmluZEdyaWRJbmZvKGNvbnN0IHNwPE1ldGFEYXRhPiAmdHJhY2tNZXRhLAorICAgICAgICBpbnQzMl90ICp0aWxlV2lkdGgsIGludDMyX3QgKnRpbGVIZWlnaHQsIGludDMyX3QgKmdyaWRSb3dzLCBpbnQzMl90ICpncmlkQ29scykgeworICAgIHJldHVybiB0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5VGlsZVdpZHRoLCB0aWxlV2lkdGgpICYmICgqdGlsZVdpZHRoID4gMCkKKyAgICAgICAgJiYgdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVRpbGVIZWlnaHQsIHRpbGVIZWlnaHQpICYmICgqdGlsZUhlaWdodCA+IDApCisgICAgICAgICYmIHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlHcmlkUm93cywgZ3JpZFJvd3MpICYmICgqZ3JpZFJvd3MgPiAwKQorICAgICAgICAmJiB0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5R3JpZENvbHMsIGdyaWRDb2xzKSAmJiAoKmdyaWRDb2xzID4gMCk7Cit9CisKK2Jvb2wgZ2V0RHN0Q29sb3JGb3JtYXQoCisgICAgICAgIGFuZHJvaWRfcGl4ZWxfZm9ybWF0X3QgY29sb3JGb3JtYXQsCisgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFICpkc3RGb3JtYXQsCisgICAgICAgIGludDMyX3QgKmRzdEJwcCkgeworICAgIHN3aXRjaCAoY29sb3JGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQl81NjU6CisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3RGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjU7CisgICAgICAgICAgICAqZHN0QnBwID0gMjsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg6CisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3RGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0MzJCaXRSR0JBODg4ODsKKyAgICAgICAgICAgICpkc3RCcHAgPSA0OworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0JHUkFfODg4ODoKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdEZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4OworICAgICAgICAgICAgKmRzdEJwcCA9IDQ7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgY29sb3IgZm9ybWF0OiAlZCIsIGNvbG9yRm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLy9zdGF0aWMKK3NwPElNZW1vcnk+IEZyYW1lRGVjb2Rlcjo6Z2V0TWV0YWRhdGFPbmx5KAorICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJnRyYWNrTWV0YSwgaW50IGNvbG9yRm9ybWF0LCBib29sIHRodW1ibmFpbCkgeworICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGRzdEZvcm1hdDsKKyAgICBpbnQzMl90IGRzdEJwcDsKKyAgICBpZiAoIWdldERzdENvbG9yRm9ybWF0KAorICAgICAgICAgICAgKGFuZHJvaWRfcGl4ZWxfZm9ybWF0X3QpY29sb3JGb3JtYXQsICZkc3RGb3JtYXQsICZkc3RCcHApKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodCwgdGlsZVdpZHRoID0gMCwgdGlsZUhlaWdodCA9IDA7CisgICAgaWYgKHRodW1ibmFpbCkgeworICAgICAgICBpZiAoIWZpbmRUaHVtYm5haWxJbmZvKHRyYWNrTWV0YSwgJndpZHRoLCAmaGVpZ2h0KSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCkpOworICAgICAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KSk7CisKKyAgICAgICAgaW50MzJfdCBncmlkUm93cywgZ3JpZENvbHM7CisgICAgICAgIGlmICghZmluZEdyaWRJbmZvKHRyYWNrTWV0YSwgJnRpbGVXaWR0aCwgJnRpbGVIZWlnaHQsICZncmlkUm93cywgJmdyaWRDb2xzKSkgeworICAgICAgICAgICAgdGlsZVdpZHRoID0gdGlsZUhlaWdodCA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGFsbG9jVmlkZW9GcmFtZSh0cmFja01ldGEsCisgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCB0aWxlV2lkdGgsIHRpbGVIZWlnaHQsIGRzdEJwcCwgdHJ1ZSAvKm1ldGFPbmx5Ki8pOworfQorCitGcmFtZURlY29kZXI6OkZyYW1lRGVjb2RlcigKKyAgICAgICAgY29uc3QgQVN0cmluZyAmY29tcG9uZW50TmFtZSwKKyAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZ0cmFja01ldGEsCisgICAgICAgIGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSkKKyAgICA6IG1Db21wb25lbnROYW1lKGNvbXBvbmVudE5hbWUpLAorICAgICAgbVRyYWNrTWV0YSh0cmFja01ldGEpLAorICAgICAgbVNvdXJjZShzb3VyY2UpLAorICAgICAgbURzdEZvcm1hdChPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjUpLAorICAgICAgbURzdEJwcCgyKSwKKyAgICAgIG1IYXZlTW9yZUlucHV0cyh0cnVlKSwKKyAgICAgIG1GaXJzdFNhbXBsZSh0cnVlKSB7Cit9CisKK0ZyYW1lRGVjb2Rlcjo6fkZyYW1lRGVjb2RlcigpIHsKKyAgICBpZiAobURlY29kZXIgIT0gTlVMTCkgeworICAgICAgICBtRGVjb2Rlci0+cmVsZWFzZSgpOworICAgICAgICBtU291cmNlLT5zdG9wKCk7CisgICAgfQorfQorCitzdGF0dXNfdCBGcmFtZURlY29kZXI6OmluaXQoCisgICAgICAgIGludDY0X3QgZnJhbWVUaW1lVXMsIHNpemVfdCBudW1GcmFtZXMsIGludCBvcHRpb24sIGludCBjb2xvckZvcm1hdCkgeworICAgIGlmICghZ2V0RHN0Q29sb3JGb3JtYXQoCisgICAgICAgICAgICAoYW5kcm9pZF9waXhlbF9mb3JtYXRfdCljb2xvckZvcm1hdCwgJm1Ec3RGb3JtYXQsICZtRHN0QnBwKSkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IHZpZGVvRm9ybWF0ID0gb25HZXRGb3JtYXRBbmRTZWVrT3B0aW9ucygKKyAgICAgICAgICAgIGZyYW1lVGltZVVzLCBudW1GcmFtZXMsIG9wdGlvbiwgJm1SZWFkT3B0aW9ucyk7CisgICAgaWYgKHZpZGVvRm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoInZpZGVvIGZvcm1hdCBvciBzZWVrIG1vZGUgbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyOworICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIGxvb3Blci0+c3RhcnQoKTsKKyAgICBzcDxNZWRpYUNvZGVjPiBkZWNvZGVyID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKAorICAgICAgICAgICAgbG9vcGVyLCBtQ29tcG9uZW50TmFtZSwgJmVycik7CisgICAgaWYgKGRlY29kZXIuZ2V0KCkgPT0gTlVMTCB8fCBlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR1coIkZhaWxlZCB0byBpbnN0YW50aWF0ZSBkZWNvZGVyIFslc10iLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIChkZWNvZGVyLmdldCgpID09IE5VTEwpID8gTk9fTUVNT1JZIDogZXJyOworICAgIH0KKworICAgIGVyciA9IGRlY29kZXItPmNvbmZpZ3VyZSgKKyAgICAgICAgICAgIHZpZGVvRm9ybWF0LCBOVUxMIC8qIHN1cmZhY2UgKi8sIE5VTEwgLyogY3J5cHRvICovLCAwIC8qIGZsYWdzICovKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dXKCJjb25maWd1cmUgcmV0dXJuZWQgZXJyb3IgJWQgKCVzKSIsIGVyciwgYXNTdHJpbmcoZXJyKSk7CisgICAgICAgIGRlY29kZXItPnJlbGVhc2UoKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBlcnIgPSBkZWNvZGVyLT5zdGFydCgpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR1coInN0YXJ0IHJldHVybmVkIGVycm9yICVkICglcykiLCBlcnIsIGFzU3RyaW5nKGVycikpOworICAgICAgICBkZWNvZGVyLT5yZWxlYXNlKCk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgZXJyID0gbVNvdXJjZS0+c3RhcnQoKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dXKCJzb3VyY2UgZmFpbGVkIHRvIHN0YXJ0OiAlZCAoJXMpIiwgZXJyLCBhc1N0cmluZyhlcnIpKTsKKyAgICAgICAgZGVjb2Rlci0+cmVsZWFzZSgpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBtRGVjb2RlciA9IGRlY29kZXI7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3NwPElNZW1vcnk+IEZyYW1lRGVjb2Rlcjo6ZXh0cmFjdEZyYW1lKEZyYW1lUmVjdCAqcmVjdCkgeworICAgIHN0YXR1c190IGVyciA9IG9uRXh0cmFjdFJlY3QocmVjdCk7CisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBlcnIgPSBleHRyYWN0SW50ZXJuYWwoKTsKKyAgICB9CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbUZyYW1lcy5zaXplKCkgPiAwID8gbUZyYW1lc1swXSA6IE5VTEw7Cit9CisKK3N0YXR1c190IEZyYW1lRGVjb2Rlcjo6ZXh0cmFjdEZyYW1lcyhzdGQ6OnZlY3RvcjxzcDxJTWVtb3J5PiA+KiBmcmFtZXMpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBleHRyYWN0SW50ZXJuYWwoKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRnJhbWVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGZyYW1lcy0+cHVzaF9iYWNrKG1GcmFtZXNbaV0pOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEZyYW1lRGVjb2Rlcjo6ZXh0cmFjdEludGVybmFsKCkgeworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIGJvb2wgZG9uZSA9IGZhbHNlOworICAgIHNpemVfdCByZXRyaWVzTGVmdCA9IGtSZXRyeUNvdW50OworICAgIGRvIHsKKyAgICAgICAgc2l6ZV90IGluZGV4OworICAgICAgICBpbnQ2NF90IHB0c1VzID0gMGxsOworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisKKyAgICAgICAgLy8gUXVldWUgYXMgbWFueSBpbnB1dHMgYXMgd2UgcG9zc2libHkgY2FuLCB0aGVuIGJsb2NrIG9uIGRlcXVldWluZworICAgICAgICAvLyBvdXRwdXRzLiBBZnRlciBnZXR0aW5nIGVhY2ggb3V0cHV0LCBjb21lIGJhY2sgYW5kIHF1ZXVlIHRoZSBpbnB1dHMKKyAgICAgICAgLy8gYWdhaW4gdG8ga2VlcCB0aGUgZGVjb2RlciBidXN5LgorICAgICAgICB3aGlsZSAobUhhdmVNb3JlSW5wdXRzKSB7CisgICAgICAgICAgICBlcnIgPSBtRGVjb2Rlci0+ZGVxdWV1ZUlucHV0QnVmZmVyKCZpbmRleCwgMCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlRpbWVkIG91dCB3YWl0aW5nIGZvciBpbnB1dCIpOworICAgICAgICAgICAgICAgIGlmIChyZXRyaWVzTGVmdCkgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBjb2RlY0J1ZmZlcjsKKyAgICAgICAgICAgIGVyciA9IG1EZWNvZGVyLT5nZXRJbnB1dEJ1ZmZlcihpbmRleCwgJmNvZGVjQnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGdldCBpbnB1dCBidWZmZXIgJXp1IiwgaW5kZXgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKm1lZGlhQnVmZmVyID0gTlVMTDsKKworICAgICAgICAgICAgZXJyID0gbVNvdXJjZS0+cmVhZCgmbWVkaWFCdWZmZXIsICZtUmVhZE9wdGlvbnMpOworICAgICAgICAgICAgbVJlYWRPcHRpb25zLmNsZWFyU2Vla1RvKCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIklucHV0IEVycm9yIG9yIEVPUyIpOworICAgICAgICAgICAgICAgIG1IYXZlTW9yZUlucHV0cyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmICghbUZpcnN0U2FtcGxlICYmIGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1lZGlhQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA+IGNvZGVjQnVmZmVyLT5jYXBhY2l0eSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImJ1ZmZlciBzaXplICglenUpIHRvbyBsYXJnZSBmb3IgY29kZWMgaW5wdXQgc2l6ZSAoJXp1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCksIGNvZGVjQnVmZmVyLT5jYXBhY2l0eSgpKTsKKyAgICAgICAgICAgICAgICBtSGF2ZU1vcmVJbnB1dHMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBlcnIgPSBCQURfVkFMVUU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5zZXRSYW5nZSgwLCBtZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworCisgICAgICAgICAgICAgICAgQ0hFQ0sobWVkaWFCdWZmZXItPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJnB0c1VzKSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KGNvZGVjQnVmZmVyLT5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCopbWVkaWFCdWZmZXItPmRhdGEoKSArIG1lZGlhQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisKKyAgICAgICAgICAgICAgICBvbklucHV0UmVjZWl2ZWQoY29kZWNCdWZmZXIsIG1lZGlhQnVmZmVyLT5tZXRhX2RhdGEoKSwgbUZpcnN0U2FtcGxlLCAmZmxhZ3MpOworICAgICAgICAgICAgICAgIG1GaXJzdFNhbXBsZSA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZWRpYUJ1ZmZlci0+cmVsZWFzZSgpOworCisgICAgICAgICAgICBpZiAobUhhdmVNb3JlSW5wdXRzKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlF1ZXVlSW5wdXQ6IHNpemU9JXp1IHRzPSUiIFBSSWQ2NCAiIHVzIGZsYWdzPSV4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5zaXplKCksIHB0c1VzLCBmbGFncyk7CisKKyAgICAgICAgICAgICAgICBlcnIgPSBtRGVjb2Rlci0+cXVldWVJbnB1dEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPm9mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0c1VzLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworCisgICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TKSB7CisgICAgICAgICAgICAgICAgICAgIG1IYXZlTW9yZUlucHV0cyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIHNpemVfdCBvZmZzZXQsIHNpemU7CisgICAgICAgICAgICAvLyB3YWl0IGZvciBhIGRlY29kZWQgYnVmZmVyCisgICAgICAgICAgICBlcnIgPSBtRGVjb2Rlci0+ZGVxdWV1ZU91dHB1dEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgJnB0c1VzLAorICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIGtCdWZmZXJUaW1lT3V0VXMpOworCisgICAgICAgICAgICBpZiAoZXJyID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiUmVjZWl2ZWQgZm9ybWF0IGNoYW5nZSIpOworICAgICAgICAgICAgICAgIGVyciA9IG1EZWNvZGVyLT5nZXRPdXRwdXRGb3JtYXQoJm1PdXRwdXRGb3JtYXQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIk91dHB1dCBidWZmZXJzIGNoYW5nZWQiKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSAtRUFHQUlOIC8qIElORk9fVFJZX0FHQUlOX0xBVEVSICovICYmIC0tcmV0cmllc0xlZnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUaW1lZC1vdXQgd2FpdGluZyBmb3Igb3V0cHV0Li4gcmV0cmllcyBsZWZ0ID0gJXp1IiwgcmV0cmllc0xlZnQpOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBzZWVraW5nIHdpdGggQ0xPU0VTVCBvcHRpb24gYW5kIG9idGFpbmVkIGEgdmFsaWQgdGFyZ2V0VGltZVVzCisgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIGV4dHJhY3RvciwgZGVjb2RlIHRvIHRoZSBzcGVjaWZpZWQgZnJhbWUuIE90aGVyd2lzZSB3ZSdyZSBkb25lLgorICAgICAgICAgICAgICAgICAgICBBTE9HVigiUmVjZWl2ZWQgYW4gb3V0cHV0IGJ1ZmZlciwgdGltZVVzPSVsbGQiLCAobG9uZyBsb25nKXB0c1VzKTsKKyAgICAgICAgICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gdmlkZW9GcmFtZUJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbURlY29kZXItPmdldE91dHB1dEJ1ZmZlcihpbmRleCwgJnZpZGVvRnJhbWVCdWZmZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGdldCBvdXRwdXQgYnVmZmVyICV6dSIsIGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVyciA9IG9uT3V0cHV0UmVjZWl2ZWQodmlkZW9GcmFtZUJ1ZmZlciwgbU91dHB1dEZvcm1hdCwgcHRzVXMsICZkb25lKTsKKyAgICAgICAgICAgICAgICAgICAgbURlY29kZXItPnJlbGVhc2VPdXRwdXRCdWZmZXIoaW5kZXgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJSZWNlaXZlZCBlcnJvciAlZCAoJXMpIGluc3RlYWQgb2Ygb3V0cHV0IiwgZXJyLCBhc1N0cmluZyhlcnIpKTsKKyAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSB3aGlsZSAoZXJyID09IE9LICYmICFkb25lKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBnZXQgdmlkZW8gZnJhbWUgKGVyciAlZCkiLCBlcnIpOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworVmlkZW9GcmFtZURlY29kZXI6OlZpZGVvRnJhbWVEZWNvZGVyKAorICAgICAgICBjb25zdCBBU3RyaW5nICZjb21wb25lbnROYW1lLAorICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJnRyYWNrTWV0YSwKKyAgICAgICAgY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlKQorICAgIDogRnJhbWVEZWNvZGVyKGNvbXBvbmVudE5hbWUsIHRyYWNrTWV0YSwgc291cmNlKSwKKyAgICAgIG1Jc0F2Y09ySGV2YyhmYWxzZSksCisgICAgICBtU2Vla01vZGUoTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMpLAorICAgICAgbVRhcmdldFRpbWVVcygtMWxsKSwKKyAgICAgIG1OdW1GcmFtZXMoMCksCisgICAgICBtTnVtRnJhbWVzRGVjb2RlZCgwKSB7Cit9CisKK3NwPEFNZXNzYWdlPiBWaWRlb0ZyYW1lRGVjb2Rlcjo6b25HZXRGb3JtYXRBbmRTZWVrT3B0aW9ucygKKyAgICAgICAgaW50NjRfdCBmcmFtZVRpbWVVcywgc2l6ZV90IG51bUZyYW1lcywgaW50IHNlZWtNb2RlLCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICBtU2Vla01vZGUgPSBzdGF0aWNfY2FzdDxNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlPihzZWVrTW9kZSk7CisgICAgaWYgKG1TZWVrTW9kZSA8IE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DIHx8CisgICAgICAgICAgICBtU2Vla01vZGUgPiBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfRlJBTUVfSU5ERVgpIHsKKyAgICAgICAgQUxPR0UoIlVua25vd24gc2VlayBtb2RlOiAlZCIsIG1TZWVrTW9kZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtTnVtRnJhbWVzID0gbnVtRnJhbWVzOworCisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBpZiAoIXRyYWNrTWV0YSgpLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSkgeworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGZpbmQgbWltZSB0eXBlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG1Jc0F2Y09ySGV2YyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykKKyAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpOworCisgICAgaWYgKGZyYW1lVGltZVVzIDwgMCkgeworICAgICAgICBpbnQ2NF90IHRodW1iTmFpbFRpbWU7CisgICAgICAgIGlmICghdHJhY2tNZXRhKCktPmZpbmRJbnQ2NChrS2V5VGh1bWJuYWlsVGltZSwgJnRodW1iTmFpbFRpbWUpCisgICAgICAgICAgICAgICAgfHwgdGh1bWJOYWlsVGltZSA8IDApIHsKKyAgICAgICAgICAgIHRodW1iTmFpbFRpbWUgPSAwOworICAgICAgICB9CisgICAgICAgIG9wdGlvbnMtPnNldFNlZWtUbyh0aHVtYk5haWxUaW1lLCBtU2Vla01vZGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIG9wdGlvbnMtPnNldFNlZWtUbyhmcmFtZVRpbWVVcywgbVNlZWtNb2RlKTsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gdmlkZW9Gb3JtYXQ7CisgICAgaWYgKGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZSh0cmFja01ldGEoKSwgJnZpZGVvRm9ybWF0KSAhPSBPSykgeworICAgICAgICBBTE9HRSgiYi8yMzY4MDc4MCIpOworICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGNvbnZlcnQgbWV0YSBkYXRhIHRvIG1lc3NhZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLy8gVE9ETzogVXNlIEZsZXhpYmxlIGNvbG9yIGluc3RlYWQKKyAgICB2aWRlb0Zvcm1hdC0+c2V0SW50MzIoImNvbG9yLWZvcm1hdCIsIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpOworCisgICAgLy8gRm9yIHRoZSB0aHVtYm5haWwgZXh0cmFjdGlvbiBjYXNlLCB0cnkgdG8gYWxsb2NhdGUgc2luZ2xlIGJ1ZmZlciBpbiBib3RoCisgICAgLy8gaW5wdXQgYW5kIG91dHB1dCBwb3J0cywgaWYgc2Vla2luZyB0byBhIHN5bmMgZnJhbWUuIE5PVEU6IFRoaXMgcmVxdWVzdCBtYXkKKyAgICAvLyBmYWlsIGlmIGNvbXBvbmVudCByZXF1aXJlcyBtb3JlIHRoYW4gdGhhdCBmb3IgZGVjb2RpbmcuCisgICAgYm9vbCBpc1NlZWtpbmdDbG9zZXN0ID0gKG1TZWVrTW9kZSA9PSBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVCkKKyAgICAgICAgICAgIHx8IChtU2Vla01vZGUgPT0gTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX0ZSQU1FX0lOREVYKTsKKyAgICBpZiAoIWlzU2Vla2luZ0Nsb3Nlc3QpIHsKKyAgICAgICAgdmlkZW9Gb3JtYXQtPnNldEludDMyKCJhbmRyb2lkLl9udW0taW5wdXQtYnVmZmVycyIsIDEpOworICAgICAgICB2aWRlb0Zvcm1hdC0+c2V0SW50MzIoImFuZHJvaWQuX251bS1vdXRwdXQtYnVmZmVycyIsIDEpOworICAgIH0KKyAgICByZXR1cm4gdmlkZW9Gb3JtYXQ7Cit9CisKK3N0YXR1c190IFZpZGVvRnJhbWVEZWNvZGVyOjpvbklucHV0UmVjZWl2ZWQoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZjb2RlY0J1ZmZlciwKKyAgICAgICAgTWV0YURhdGFCYXNlICZzYW1wbGVNZXRhLCBib29sIGZpcnN0U2FtcGxlLCB1aW50MzJfdCAqZmxhZ3MpIHsKKyAgICBib29sIGlzU2Vla2luZ0Nsb3Nlc3QgPSAobVNlZWtNb2RlID09IE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUKQorICAgICAgICAgICAgfHwgKG1TZWVrTW9kZSA9PSBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfRlJBTUVfSU5ERVgpOworCisgICAgaWYgKGZpcnN0U2FtcGxlICYmIGlzU2Vla2luZ0Nsb3Nlc3QpIHsKKyAgICAgICAgc2FtcGxlTWV0YS5maW5kSW50NjQoa0tleVRhcmdldFRpbWUsICZtVGFyZ2V0VGltZVVzKTsKKyAgICAgICAgQUxPR1YoIlNlZWtpbmcgY2xvc2VzdDogdGFyZ2V0VGltZVVzPSVsbGQiLCAobG9uZyBsb25nKW1UYXJnZXRUaW1lVXMpOworICAgIH0KKworICAgIGlmIChtSXNBdmNPckhldmMgJiYgIWlzU2Vla2luZ0Nsb3Nlc3QKKyAgICAgICAgICAgICYmIElzSURSKGNvZGVjQnVmZmVyLT5kYXRhKCksIGNvZGVjQnVmZmVyLT5zaXplKCkpKSB7CisgICAgICAgIC8vIE9ubHkgbmVlZCB0byBkZWNvZGUgb25lIElEUiBmcmFtZSwgdW5sZXNzIHdlJ3JlIHNlZWtpbmcgd2l0aCBDTE9TRVNUCisgICAgICAgIC8vIG9wdGlvbiwgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkIHRvIGFjdHVhbGx5IGRlY29kZSB0byB0YXJnZXRUaW1lVXMuCisgICAgICAgICpmbGFncyB8PSBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1M7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgVmlkZW9GcmFtZURlY29kZXI6Om9uT3V0cHV0UmVjZWl2ZWQoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZ2aWRlb0ZyYW1lQnVmZmVyLAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCwKKyAgICAgICAgaW50NjRfdCB0aW1lVXMsIGJvb2wgKmRvbmUpIHsKKyAgICBib29sIHNob3VsZE91dHB1dCA9IChtVGFyZ2V0VGltZVVzIDwgMGxsKSB8fCAodGltZVVzID49IG1UYXJnZXRUaW1lVXMpOworCisgICAgLy8gSWYgdGhpcyBpcyBub3QgdGhlIHRhcmdldCBmcmFtZSwgc2tpcCBjb2xvciBjb252ZXJ0LgorICAgIGlmICghc2hvdWxkT3V0cHV0KSB7CisgICAgICAgICpkb25lID0gZmFsc2U7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICAqZG9uZSA9ICgrK21OdW1GcmFtZXNEZWNvZGVkID49IG1OdW1GcmFtZXMpOworCisgICAgaWYgKG91dHB1dEZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkpOworICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSk7CisKKyAgICBpbnQzMl90IGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3BfcmlnaHQsIGNyb3BfYm90dG9tOworICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kUmVjdCgiY3JvcCIsICZjcm9wX2xlZnQsICZjcm9wX3RvcCwgJmNyb3BfcmlnaHQsICZjcm9wX2JvdHRvbSkpIHsKKyAgICAgICAgY3JvcF9sZWZ0ID0gY3JvcF90b3AgPSAwOworICAgICAgICBjcm9wX3JpZ2h0ID0gd2lkdGggLSAxOworICAgICAgICBjcm9wX2JvdHRvbSA9IGhlaWdodCAtIDE7CisgICAgfQorCisgICAgc3A8SU1lbW9yeT4gZnJhbWVNZW0gPSBhbGxvY1ZpZGVvRnJhbWUoCisgICAgICAgICAgICB0cmFja01ldGEoKSwKKyAgICAgICAgICAgIChjcm9wX3JpZ2h0IC0gY3JvcF9sZWZ0ICsgMSksCisgICAgICAgICAgICAoY3JvcF9ib3R0b20gLSBjcm9wX3RvcCArIDEpLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICBkc3RCcHAoKSk7CisgICAgYWRkRnJhbWUoZnJhbWVNZW0pOworICAgIFZpZGVvRnJhbWUqIGZyYW1lID0gc3RhdGljX2Nhc3Q8VmlkZW9GcmFtZSo+KGZyYW1lTWVtLT5wb2ludGVyKCkpOworCisgICAgaW50MzJfdCBzcmNGb3JtYXQ7CisgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZzcmNGb3JtYXQpKTsKKworICAgIENvbG9yQ29udmVydGVyIGNvbnZlcnRlcigoT01YX0NPTE9SX0ZPUk1BVFRZUEUpc3JjRm9ybWF0LCBkc3RGb3JtYXQoKSk7CisKKyAgICBpZiAoY29udmVydGVyLmlzVmFsaWQoKSkgeworICAgICAgICBjb252ZXJ0ZXIuY29udmVydCgKKyAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKXZpZGVvRnJhbWVCdWZmZXItPmRhdGEoKSwKKyAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgIGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3BfcmlnaHQsIGNyb3BfYm90dG9tLAorICAgICAgICAgICAgICAgIGZyYW1lLT5nZXRGbGF0dGVuZWREYXRhKCksCisgICAgICAgICAgICAgICAgZnJhbWUtPm1XaWR0aCwKKyAgICAgICAgICAgICAgICBmcmFtZS0+bUhlaWdodCwKKyAgICAgICAgICAgICAgICBjcm9wX2xlZnQsIGNyb3BfdG9wLCBjcm9wX3JpZ2h0LCBjcm9wX2JvdHRvbSk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBBTE9HRSgiVW5hYmxlIHRvIGNvbnZlcnQgZnJvbSBmb3JtYXQgMHglMDh4IHRvIDB4JTA4eCIsCisgICAgICAgICAgICAgICAgc3JjRm9ybWF0LCBkc3RGb3JtYXQoKSk7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworSW1hZ2VEZWNvZGVyOjpJbWFnZURlY29kZXIoCisgICAgICAgIGNvbnN0IEFTdHJpbmcgJmNvbXBvbmVudE5hbWUsCisgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmdHJhY2tNZXRhLAorICAgICAgICBjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpCisgICAgOiBGcmFtZURlY29kZXIoY29tcG9uZW50TmFtZSwgdHJhY2tNZXRhLCBzb3VyY2UpLAorICAgICAgbUZyYW1lKE5VTEwpLAorICAgICAgbVdpZHRoKDApLAorICAgICAgbUhlaWdodCgwKSwKKyAgICAgIG1HcmlkUm93cygxKSwKKyAgICAgIG1HcmlkQ29scygxKSwKKyAgICAgIG1UaWxlV2lkdGgoMCksCisgICAgICBtVGlsZUhlaWdodCgwKSwKKyAgICAgIG1UaWxlc0RlY29kZWQoMCksCisgICAgICBtVGFyZ2V0VGlsZXMoMCkgeworfQorCitzcDxBTWVzc2FnZT4gSW1hZ2VEZWNvZGVyOjpvbkdldEZvcm1hdEFuZFNlZWtPcHRpb25zKAorICAgICAgICBpbnQ2NF90IGZyYW1lVGltZVVzLCBzaXplX3QgLypudW1GcmFtZXMqLywKKyAgICAgICAgaW50IC8qc2Vla01vZGUqLywgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgc3A8TWV0YURhdGE+IG92ZXJyaWRlTWV0YTsKKyAgICBpZiAoZnJhbWVUaW1lVXMgPCAwKSB7CisgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgIHNpemVfdCBzaXplOworCisgICAgICAgIC8vIGlmIHdlIGhhdmUgYSBzdGFuZC1hbG9uZSB0aHVtYm5haWwsIHNldCB1cCB0aGUgb3ZlcnJpZGUgbWV0YSwKKyAgICAgICAgLy8gYW5kIHNldCBzZWVrVG8gdGltZSB0byAtMS4KKyAgICAgICAgaWYgKCFmaW5kVGh1bWJuYWlsSW5mbyh0cmFja01ldGEoKSwgJm1XaWR0aCwgJm1IZWlnaHQsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICBBTE9HRSgiVGh1bWJuYWlsIG5vdCBhdmFpbGFibGUiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIG92ZXJyaWRlTWV0YSA9IG5ldyBNZXRhRGF0YSgqKHRyYWNrTWV0YSgpKSk7CisgICAgICAgIG92ZXJyaWRlTWV0YS0+cmVtb3ZlKGtLZXlEaXNwbGF5V2lkdGgpOworICAgICAgICBvdmVycmlkZU1ldGEtPnJlbW92ZShrS2V5RGlzcGxheUhlaWdodCk7CisgICAgICAgIG92ZXJyaWRlTWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCBtV2lkdGgpOworICAgICAgICBvdmVycmlkZU1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIG1IZWlnaHQpOworICAgICAgICBvdmVycmlkZU1ldGEtPnNldERhdGEoa0tleUhWQ0MsIHR5cGUsIGRhdGEsIHNpemUpOworICAgICAgICBvcHRpb25zLT5zZXRTZWVrVG8oLTEpOworICAgIH0gZWxzZSB7CisgICAgICAgIENIRUNLKHRyYWNrTWV0YSgpLT5maW5kSW50MzIoa0tleVdpZHRoLCAmbVdpZHRoKSk7CisgICAgICAgIENIRUNLKHRyYWNrTWV0YSgpLT5maW5kSW50MzIoa0tleUhlaWdodCwgJm1IZWlnaHQpKTsKKworICAgICAgICBvcHRpb25zLT5zZXRTZWVrVG8oZnJhbWVUaW1lVXMpOworICAgIH0KKworICAgIG1HcmlkUm93cyA9IG1HcmlkQ29scyA9IDE7CisgICAgaWYgKG92ZXJyaWRlTWV0YSA9PSBOVUxMKSB7CisgICAgICAgIC8vIGNoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIHRpbGVkIGhlaWYKKyAgICAgICAgaW50MzJfdCB0aWxlV2lkdGgsIHRpbGVIZWlnaHQsIGdyaWRSb3dzLCBncmlkQ29sczsKKyAgICAgICAgaWYgKGZpbmRHcmlkSW5mbyh0cmFja01ldGEoKSwgJnRpbGVXaWR0aCwgJnRpbGVIZWlnaHQsICZncmlkUm93cywgJmdyaWRDb2xzKSkgeworICAgICAgICAgICAgaWYgKG1XaWR0aCA8PSB0aWxlV2lkdGggKiBncmlkQ29scyAmJiBtSGVpZ2h0IDw9IHRpbGVIZWlnaHQgKiBncmlkUm93cykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJncmlkOiAlZHglZCwgdGlsZSBzaXplOiAlZHglZCwgcGljdHVyZSBzaXplOiAlZHglZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBncmlkQ29scywgZ3JpZFJvd3MsIHRpbGVXaWR0aCwgdGlsZUhlaWdodCwgbVdpZHRoLCBtSGVpZ2h0KTsKKworICAgICAgICAgICAgICAgIG92ZXJyaWRlTWV0YSA9IG5ldyBNZXRhRGF0YSgqKHRyYWNrTWV0YSgpKSk7CisgICAgICAgICAgICAgICAgb3ZlcnJpZGVNZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHRpbGVXaWR0aCk7CisgICAgICAgICAgICAgICAgb3ZlcnJpZGVNZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCB0aWxlSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBtVGlsZVdpZHRoID0gdGlsZVdpZHRoOworICAgICAgICAgICAgICAgIG1UaWxlSGVpZ2h0ID0gdGlsZUhlaWdodDsKKyAgICAgICAgICAgICAgICBtR3JpZENvbHMgPSBncmlkQ29sczsKKyAgICAgICAgICAgICAgICBtR3JpZFJvd3MgPSBncmlkUm93czsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coImlnbm9yZSBiYWQgZ3JpZDogJWR4JWQsIHRpbGUgc2l6ZTogJWR4JWQsIHBpY3R1cmUgc2l6ZTogJWR4JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZENvbHMsIGdyaWRSb3dzLCB0aWxlV2lkdGgsIHRpbGVIZWlnaHQsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG92ZXJyaWRlTWV0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICBvdmVycmlkZU1ldGEgPSB0cmFja01ldGEoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtVGFyZ2V0VGlsZXMgPSBtR3JpZENvbHMgKiBtR3JpZFJvd3M7CisKKyAgICBzcDxBTWVzc2FnZT4gdmlkZW9Gb3JtYXQ7CisgICAgaWYgKGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShvdmVycmlkZU1ldGEsICZ2aWRlb0Zvcm1hdCkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImIvMjM2ODA3ODAiKTsKKyAgICAgICAgQUxPR1coIkZhaWxlZCB0byBjb252ZXJ0IG1ldGEgZGF0YSB0byBtZXNzYWdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIFRPRE86IFVzZSBGbGV4aWJsZSBjb2xvciBpbnN0ZWFkCisgICAgdmlkZW9Gb3JtYXQtPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKKworICAgIGlmICgobUdyaWRSb3dzID09IDEpICYmIChtR3JpZENvbHMgPT0gMSkpIHsKKyAgICAgICAgdmlkZW9Gb3JtYXQtPnNldEludDMyKCJhbmRyb2lkLl9udW0taW5wdXQtYnVmZmVycyIsIDEpOworICAgICAgICB2aWRlb0Zvcm1hdC0+c2V0SW50MzIoImFuZHJvaWQuX251bS1vdXRwdXQtYnVmZmVycyIsIDEpOworICAgIH0KKyAgICByZXR1cm4gdmlkZW9Gb3JtYXQ7Cit9CisKK3N0YXR1c190IEltYWdlRGVjb2Rlcjo6b25FeHRyYWN0UmVjdChGcmFtZVJlY3QgKnJlY3QpIHsKKyAgICAvLyBUT0RPOgorICAgIC8vIFRoaXMgY2FsbGJhY2sgaXMgZm9yIHZlcmlmeWluZyB3aGV0aGVyIHdlIGNhbiBkZWNvZGUgdGhlIHJlY3QsCisgICAgLy8gYW5kIGlmIHNvLCBzZXQgdXAgdGhlIGludGVybmFsIHZhcmlhYmxlcyBmb3IgZGVjb2RpbmcuCisgICAgLy8gQ3VycmVudGx5LCByZWN0IGRlY29kaW5nIGlzIHJlc3RyaWN0ZWQgdG8gc2VxdWVudGlhbGx5IGRlY29kaW5nIG9uZQorICAgIC8vIHJvdyBvZiB0aWxlcyBhdCBhIHRpbWUuIFdlIGNhbid0IGRlY29kZSBhcmJpdHJhcnkgcmVjdHMsIGFzIHRoZSBpbWFnZQorICAgIC8vIHRyYWNrIGRvZXNuJ3QgeWV0IHN1cHBvcnQgc2Vla2luZyBieSB0aWxlcy4gU28gYWxsIHdlIGRvIGhlcmUgaXMgdG8KKyAgICAvLyB2ZXJpZnkgdGhlIHJlY3QgYWdhaW5zdCB3aGF0IHdlIGV4cGVjdC4KKyAgICAvLyBXaGVuIHNlZWtpbmcgYnkgdGlsZSBpcyBzdXBwb3J0ZWQsIHRoaXMgY29kZSBzaG91bGQgYmUgdXBkYXRlZCB0bworICAgIC8vIHNldCB0aGUgc2VlayBwYXJhbWV0ZXJzLgorICAgIGlmIChyZWN0ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKG1UaWxlc0RlY29kZWQgPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgIH0KKyAgICAgICAgbVRhcmdldFRpbGVzID0gbUdyaWRSb3dzICogbUdyaWRDb2xzOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaWYgKG1UaWxlV2lkdGggPD0gMCB8fCBtVGlsZUhlaWdodCA8PTApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIGludDMyX3Qgcm93ID0gbVRpbGVzRGVjb2RlZCAvIG1HcmlkQ29sczsKKyAgICBpbnQzMl90IGV4cGVjdGVkVG9wID0gcm93ICogbVRpbGVIZWlnaHQ7CisgICAgaW50MzJfdCBleHBlY3RlZEJvdCA9IChyb3cgKyAxKSAqIG1UaWxlSGVpZ2h0OworICAgIGlmIChleHBlY3RlZEJvdCA+IG1IZWlnaHQpIHsKKyAgICAgICAgZXhwZWN0ZWRCb3QgPSBtSGVpZ2h0OworICAgIH0KKyAgICBpZiAocmVjdC0+bGVmdCAhPSAwIHx8IHJlY3QtPnRvcCAhPSBleHBlY3RlZFRvcAorICAgICAgICAgICAgfHwgcmVjdC0+cmlnaHQgIT0gbVdpZHRoIHx8IHJlY3QtPmJvdHRvbSAhPSBleHBlY3RlZEJvdCkgeworICAgICAgICBBTE9HRSgiY3VycmVudGx5IG9ubHkgc3VwcG9ydCBzZXF1ZW50aWFsIGRlY29kaW5nIG9mIHNsaWNlcyIpOworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgLy8gYWR2YW5jZSBvbmUgcm93CisgICAgbVRhcmdldFRpbGVzID0gbVRpbGVzRGVjb2RlZCArIG1HcmlkQ29sczsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEltYWdlRGVjb2Rlcjo6b25PdXRwdXRSZWNlaXZlZCgKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJnZpZGVvRnJhbWVCdWZmZXIsCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0LCBpbnQ2NF90IC8qdGltZVVzKi8sIGJvb2wgKmRvbmUpIHsKKyAgICBpZiAob3V0cHV0Rm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSk7CisgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKTsKKworICAgIGlmIChtRnJhbWUgPT0gTlVMTCkgeworICAgICAgICBzcDxJTWVtb3J5PiBmcmFtZU1lbSA9IGFsbG9jVmlkZW9GcmFtZSgKKyAgICAgICAgICAgICAgICB0cmFja01ldGEoKSwgbVdpZHRoLCBtSGVpZ2h0LCBtVGlsZVdpZHRoLCBtVGlsZUhlaWdodCwgZHN0QnBwKCkpOworICAgICAgICBtRnJhbWUgPSBzdGF0aWNfY2FzdDxWaWRlb0ZyYW1lKj4oZnJhbWVNZW0tPnBvaW50ZXIoKSk7CisKKyAgICAgICAgYWRkRnJhbWUoZnJhbWVNZW0pOworICAgIH0KKworICAgIGludDMyX3Qgc3JjRm9ybWF0OworICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmc3JjRm9ybWF0KSk7CisKKyAgICBDb2xvckNvbnZlcnRlciBjb252ZXJ0ZXIoKE9NWF9DT0xPUl9GT1JNQVRUWVBFKXNyY0Zvcm1hdCwgZHN0Rm9ybWF0KCkpOworCisgICAgaW50MzJfdCBkc3RMZWZ0LCBkc3RUb3AsIGRzdFJpZ2h0LCBkc3RCb3R0b207CisgICAgZHN0TGVmdCA9IG1UaWxlc0RlY29kZWQgJSBtR3JpZENvbHMgKiB3aWR0aDsKKyAgICBkc3RUb3AgPSBtVGlsZXNEZWNvZGVkIC8gbUdyaWRDb2xzICogaGVpZ2h0OworICAgIGRzdFJpZ2h0ID0gZHN0TGVmdCArIHdpZHRoIC0gMTsKKyAgICBkc3RCb3R0b20gPSBkc3RUb3AgKyBoZWlnaHQgLSAxOworCisgICAgaW50MzJfdCBjcm9wX2xlZnQsIGNyb3BfdG9wLCBjcm9wX3JpZ2h0LCBjcm9wX2JvdHRvbTsKKyAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZFJlY3QoImNyb3AiLCAmY3JvcF9sZWZ0LCAmY3JvcF90b3AsICZjcm9wX3JpZ2h0LCAmY3JvcF9ib3R0b20pKSB7CisgICAgICAgIGNyb3BfbGVmdCA9IGNyb3BfdG9wID0gMDsKKyAgICAgICAgY3JvcF9yaWdodCA9IHdpZHRoIC0gMTsKKyAgICAgICAgY3JvcF9ib3R0b20gPSBoZWlnaHQgLSAxOworICAgIH0KKworICAgIC8vIGFwcGx5IGNyb3Agb24gYm90dG9tLXJpZ2h0CisgICAgLy8gVE9ETzogbmVlZCB0byBtb3ZlIHRoaXMgaW50byB0aGUgY29sb3IgY29udmVydGVyIGl0c2VsZi4KKyAgICBpZiAoZHN0UmlnaHQgPj0gbVdpZHRoKSB7CisgICAgICAgIGNyb3BfcmlnaHQgPSBtV2lkdGggLSBkc3RMZWZ0IC0gMTsKKyAgICAgICAgZHN0UmlnaHQgPSBkc3RMZWZ0ICsgY3JvcF9yaWdodDsKKyAgICB9CisgICAgaWYgKGRzdEJvdHRvbSA+PSBtSGVpZ2h0KSB7CisgICAgICAgIGNyb3BfYm90dG9tID0gbUhlaWdodCAtIGRzdFRvcCAtIDE7CisgICAgICAgIGRzdEJvdHRvbSA9IGRzdFRvcCArIGNyb3BfYm90dG9tOworICAgIH0KKworICAgICpkb25lID0gKCsrbVRpbGVzRGVjb2RlZCA+PSBtVGFyZ2V0VGlsZXMpOworCisgICAgaWYgKGNvbnZlcnRlci5pc1ZhbGlkKCkpIHsKKyAgICAgICAgY29udmVydGVyLmNvbnZlcnQoCisgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKil2aWRlb0ZyYW1lQnVmZmVyLT5kYXRhKCksCisgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICBjcm9wX2xlZnQsIGNyb3BfdG9wLCBjcm9wX3JpZ2h0LCBjcm9wX2JvdHRvbSwKKyAgICAgICAgICAgICAgICBtRnJhbWUtPmdldEZsYXR0ZW5lZERhdGEoKSwKKyAgICAgICAgICAgICAgICBtRnJhbWUtPm1XaWR0aCwKKyAgICAgICAgICAgICAgICBtRnJhbWUtPm1IZWlnaHQsCisgICAgICAgICAgICAgICAgZHN0TGVmdCwgZHN0VG9wLCBkc3RSaWdodCwgZHN0Qm90dG9tKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIEFMT0dFKCJVbmFibGUgdG8gY29udmVydCBmcm9tIGZvcm1hdCAweCUwOHggdG8gMHglMDh4IiwKKyAgICAgICAgICAgICAgICBzcmNGb3JtYXQsIGRzdEZvcm1hdCgpKTsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9IZXZjVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSGV2Y1V0aWxzLmNwcAppbmRleCA3ZDQ2M2E5Li5mMTUyYTM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9IZXZjVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hldmNVdGlscy5jcHAKQEAgLTIxLDEyICsyMSwxMiBAQAogI2luY2x1ZGUgPHV0aWxpdHk+CiAKICNpbmNsdWRlICJpbmNsdWRlL0hldmNVdGlscy5oIgotI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KIApAQCAtMTYyLDYgKzE2Miw4IEBACiAgICAgcmVhZGVyLnNraXBCaXRzKDEpOwogICAgIC8vIFNraXAgdnBzX21heF9sYXllcnNfbWludXNfMQogICAgIHJlYWRlci5za2lwQml0cyg2KTsKKyAgICAvLyBTa2lwIHZwc19tYXhfc3ViX2xheWVyc19taW51czEKKyAgICByZWFkZXIuc2tpcEJpdHMoMyk7CiAgICAgLy8gU2tpcCB2cHNfdGVtcG9yYWxfaWRfbmVzdGluZ19mbGFncwogICAgIHJlYWRlci5za2lwQml0cygxKTsKICAgICAvLyBTa2lwIHJlc2VydmVkCkBAIC00MjIsNyArNDI0LDcgQEAKIAogICAgIHVpbnQ4X3QgKmhlYWRlciA9IGh2Y2M7CiAgICAgaGVhZGVyWzBdID0gMTsKLSAgICBoZWFkZXJbMV0gPSAoa0dlbmVyYWxQcm9maWxlU3BhY2UgPDwgNikgfCAoa0dlbmVyYWxUaWVyRmxhZyA8PCA1KSB8IGtHZW5lcmFsUHJvZmlsZUlkYzsKKyAgICBoZWFkZXJbMV0gPSAoZ2VuZXJhbFByb2ZpbGVTcGFjZSA8PCA2KSB8IChnZW5lcmFsVGllckZsYWcgPDwgNSkgfCBnZW5lcmFsUHJvZmlsZUlkYzsKICAgICBoZWFkZXJbMl0gPSAoY29tcGF0aWJpbGl0eUZsYWdzID4+IDI0KSAmIDB4ZmY7CiAgICAgaGVhZGVyWzNdID0gKGNvbXBhdGliaWxpdHlGbGFncyA+PiAxNikgJiAweGZmOwogICAgIGhlYWRlcls0XSA9IChjb21wYXRpYmlsaXR5RmxhZ3MgPj4gOCkgJiAweGZmOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YzU5MDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5jcHAKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJpbmNsdWRlL0NhbGxiYWNrRGF0YVNvdXJjZS5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2FsbGJhY2tNZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3A8RGF0YVNvdXJjZT4gQ3JlYXRlRGF0YVNvdXJjZUZyb21JRGF0YVNvdXJjZShjb25zdCBzcDxJRGF0YVNvdXJjZT4gJnNvdXJjZSkgeworICAgIGlmIChzb3VyY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBUaW55Q2FjaGVTb3VyY2UobmV3IENhbGxiYWNrRGF0YVNvdXJjZShzb3VyY2UpKTsKK30KKworc3A8SURhdGFTb3VyY2U+IENyZWF0ZUlEYXRhU291cmNlRnJvbURhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkgeworICAgIGlmIChzb3VyY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIFJlbW90ZURhdGFTb3VyY2U6OndyYXAoc291cmNlKTsKK30KKworc3A8SU1lZGlhRXh0cmFjdG9yPiBDcmVhdGVJTWVkaWFFeHRyYWN0b3JGcm9tTWVkaWFFeHRyYWN0b3IoCisgICAgICAgIE1lZGlhRXh0cmFjdG9yICpleHRyYWN0b3IsCisgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgIGNvbnN0IHNwPFJlZkJhc2U+ICZwbHVnaW4pIHsKKyAgICBpZiAoZXh0cmFjdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBSZW1vdGVNZWRpYUV4dHJhY3Rvcjo6d3JhcChleHRyYWN0b3IsIHNvdXJjZSwgcGx1Z2luKTsKK30KKworc3A8TWVkaWFTb3VyY2U+IENyZWF0ZU1lZGlhU291cmNlRnJvbUlNZWRpYVNvdXJjZShjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKKyAgICBpZiAoc291cmNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBuZXcgQ2FsbGJhY2tNZWRpYVNvdXJjZShzb3VyY2UpOworfQorCitzcDxJTWVkaWFTb3VyY2U+IENyZWF0ZUlNZWRpYVNvdXJjZUZyb21NZWRpYVNvdXJjZUJhc2UoCisgICAgICAgIGNvbnN0IHNwPFJlbW90ZU1lZGlhRXh0cmFjdG9yPiAmZXh0cmFjdG9yLAorICAgICAgICBNZWRpYVRyYWNrICpzb3VyY2UsIGNvbnN0IHNwPFJlZkJhc2U+ICZwbHVnaW4pIHsKKyAgICBpZiAoc291cmNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBSZW1vdGVNZWRpYVNvdXJjZTo6d3JhcChleHRyYWN0b3IsIHNvdXJjZSwgcGx1Z2luKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0l0ZW1UYWJsZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9JdGVtVGFibGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTg5ZjRmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0l0ZW1UYWJsZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkl0ZW1UYWJsZSIKLQotI2luY2x1ZGUgPGluY2x1ZGUvSXRlbVRhYmxlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLW5hbWVzcGFjZSBoZWlmIHsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gIHN0cnVjdCB0byBrZWVwIHRyYWNrIG9mIG9uZSBpbWFnZSBpdGVtCi0vLwotCi1zdHJ1Y3QgSW1hZ2VJdGVtIHsKLSAgICBmcmllbmQgc3RydWN0IEl0ZW1SZWZlcmVuY2U7Ci0gICAgZnJpZW5kIHN0cnVjdCBJdGVtUHJvcGVydHk7Ci0KLSAgICBJbWFnZUl0ZW0oKSA6IEltYWdlSXRlbSgwKSB7fQotICAgIEltYWdlSXRlbSh1aW50MzJfdCBfdHlwZSkgOiB0eXBlKF90eXBlKSwKLSAgICAgICAgICAgIHJvd3MoMCksIGNvbHVtbnMoMCksIHdpZHRoKDApLCBoZWlnaHQoMCksIHJvdGF0aW9uKDApLAotICAgICAgICAgICAgb2Zmc2V0KDApLCBzaXplKDApLCBuZXh0VGlsZUluZGV4KDApIHt9Ci0KLSAgICBib29sIGlzR3JpZCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIHR5cGUgPT0gRk9VUkNDKCdnJywgJ3InLCAnaScsICdkJyk7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZ2V0TmV4dFRpbGVJdGVtSWQodWludDMyX3QgKm5leHRUaWxlSXRlbUlkLCBib29sIHJlc2V0KSB7Ci0gICAgICAgIGlmIChyZXNldCkgewotICAgICAgICAgICAgbmV4dFRpbGVJbmRleCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5leHRUaWxlSW5kZXggPj0gZGltZ1JlZnMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgfQotICAgICAgICAqbmV4dFRpbGVJdGVtSWQgPSBkaW1nUmVmc1tuZXh0VGlsZUluZGV4KytdOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgdWludDMyX3QgdHlwZTsKLSAgICBpbnQzMl90IHJvd3M7Ci0gICAgaW50MzJfdCBjb2x1bW5zOwotICAgIGludDMyX3Qgd2lkdGg7Ci0gICAgaW50MzJfdCBoZWlnaHQ7Ci0gICAgaW50MzJfdCByb3RhdGlvbjsKLSAgICBvZmY2NF90IG9mZnNldDsKLSAgICBzaXplX3Qgc2l6ZTsKLSAgICBzcDxBQnVmZmVyPiBodmNjOwotICAgIHNwPEFCdWZmZXI+IGljYzsKLQotICAgIFZlY3Rvcjx1aW50MzJfdD4gdGh1bWJuYWlsczsKLSAgICBWZWN0b3I8dWludDMyX3Q+IGRpbWdSZWZzOwotICAgIHNpemVfdCBuZXh0VGlsZUluZGV4OwotfTsKLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyAgSVNPIGJveGVzCi0vLwotCi1zdHJ1Y3QgQm94IHsKLXByb3RlY3RlZDoKLSAgICBCb3goY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlLCB1aW50MzJfdCB0eXBlKSA6Ci0gICAgICAgIG1EYXRhU291cmNlKHNvdXJjZSksIG1UeXBlKHR5cGUpIHt9Ci0KLSAgICB2aXJ0dWFsIH5Cb3goKSB7fQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvbkNodW5rRGF0YSgKLSAgICAgICAgICAgIHVpbnQzMl90IC8qdHlwZSovLCBvZmY2NF90IC8qb2Zmc2V0Ki8sIHNpemVfdCAvKnNpemUqLykgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgaW5saW5lIHVpbnQzMl90IHR5cGUoKSBjb25zdCB7IHJldHVybiBtVHlwZTsgfQotCi0gICAgaW5saW5lIHNwPERhdGFTb3VyY2U+IHNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIG1EYXRhU291cmNlOyB9Ci0KLSAgICBzdGF0dXNfdCBwYXJzZUNodW5rKG9mZjY0X3QgKm9mZnNldCk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZUNodW5rcyhvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwotCi1wcml2YXRlOgotICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwotICAgIHVpbnQzMl90IG1UeXBlOwotfTsKLQotc3RhdHVzX3QgQm94OjpwYXJzZUNodW5rKG9mZjY0X3QgKm9mZnNldCkgewotICAgIGlmICgqb2Zmc2V0IDwgMCkgewotICAgICAgICBBTE9HRSgiYi8yMzU0MDkxNCIpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICB1aW50MzJfdCBoZHJbMl07Ci0gICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgaGRyLCA4KSA8IDgpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLSAgICB1aW50NjRfdCBjaHVua19zaXplID0gbnRvaGwoaGRyWzBdKTsKLSAgICBpbnQzMl90IGNodW5rX3R5cGUgPSBudG9obChoZHJbMV0pOwotICAgIG9mZjY0X3QgZGF0YV9vZmZzZXQgPSAqb2Zmc2V0ICsgODsKLQotICAgIGlmIChjaHVua19zaXplID09IDEpIHsKLSAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCArIDgsICZjaHVua19zaXplLCA4KSA8IDgpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgfQotICAgICAgICBjaHVua19zaXplID0gbnRvaDY0KGNodW5rX3NpemUpOwotICAgICAgICBkYXRhX29mZnNldCArPSA4OwotCi0gICAgICAgIGlmIChjaHVua19zaXplIDwgMTYpIHsKLSAgICAgICAgICAgIC8vIFRoZSBzbWFsbGVzdCB2YWxpZCBjaHVuayBpcyAxNiBieXRlcyBsb25nIGluIHRoaXMgY2FzZS4KLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGNodW5rX3NpemUgPT0gMCkgewotICAgICAgICAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4gc2luY2Ugd2Ugc2hvdWxkIG5ldmVyIGJlIHRvcCBsZXZlbAotICAgICAgICBBTE9HRSgiaW52YWxpZCBjaHVuayBzaXplIDAgZm9yIG5vbi10b3AgbGV2ZWwgYm94Iik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfSBlbHNlIGlmIChjaHVua19zaXplIDwgOCkgewotICAgICAgICAvLyBUaGUgc21hbGxlc3QgdmFsaWQgY2h1bmsgaXMgOCBieXRlcyBsb25nLgotICAgICAgICBBTE9HRSgiaW52YWxpZCBjaHVuayBzaXplOiAlbGxkIiwgKGxvbmcgbG9uZyljaHVua19zaXplKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBjaGFyIGNodW5rWzVdOwotICAgIE1ha2VGb3VyQ0NTdHJpbmcoY2h1bmtfdHlwZSwgY2h1bmspOwotICAgIEFMT0dWKCJjaHVuazogJXMgQCAlbGxkIiwgY2h1bmssIChsb25nIGxvbmcpKm9mZnNldCk7Ci0KLSAgICBvZmY2NF90IGNodW5rX2RhdGFfc2l6ZSA9IGNodW5rX3NpemUgLSAoZGF0YV9vZmZzZXQgLSAqb2Zmc2V0KTsKLSAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgMCkgewotICAgICAgICBBTE9HRSgiYi8yMzU0MDkxNCIpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IG9uQ2h1bmtEYXRhKGNodW5rX3R5cGUsIGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBCb3g6OnBhcnNlQ2h1bmtzKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewotICAgIG9mZjY0X3Qgc3RvcE9mZnNldCA9IG9mZnNldCArIHNpemU7Ci0gICAgd2hpbGUgKG9mZnNldCA8IHN0b3BPZmZzZXQpIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuaygmb2Zmc2V0KTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAob2Zmc2V0ICE9IHN0b3BPZmZzZXQpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1zdHJ1Y3QgRnVsbEJveCA6IHB1YmxpYyBCb3ggewotcHJvdGVjdGVkOgotICAgIEZ1bGxCb3goY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlLCB1aW50MzJfdCB0eXBlKSA6Ci0gICAgICAgIEJveChzb3VyY2UsIHR5cGUpLCBtVmVyc2lvbigwKSwgbUZsYWdzKDApIHt9Ci0KLSAgICBpbmxpbmUgdWludDhfdCB2ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbVZlcnNpb247IH0KLQotICAgIGlubGluZSB1aW50MzJfdCBmbGFncygpIGNvbnN0IHsgcmV0dXJuIG1GbGFnczsgfQotCi0gICAgc3RhdHVzX3QgcGFyc2VGdWxsQm94SGVhZGVyKG9mZjY0X3QgKm9mZnNldCwgc2l6ZV90ICpzaXplKTsKLQotcHJpdmF0ZToKLSAgICB1aW50OF90IG1WZXJzaW9uOwotICAgIHVpbnQzMl90IG1GbGFnczsKLX07Ci0KLXN0YXR1c190IEZ1bGxCb3g6OnBhcnNlRnVsbEJveEhlYWRlcihvZmY2NF90ICpvZmZzZXQsIHNpemVfdCAqc2l6ZSkgewotICAgIGlmICgqc2l6ZSA8IDQpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0gICAgaWYgKCFzb3VyY2UoKS0+cmVhZEF0KCpvZmZzZXQsICZtVmVyc2lvbiwgMSkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLSAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MjQoKm9mZnNldCArIDEsICZtRmxhZ3MpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0gICAgKm9mZnNldCArPSA0OwotICAgICpzaXplIC09IDQ7Ci0gICAgcmV0dXJuIE9LOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyAgUHJpbWFyeUltYWdlIGJveAotLy8KLQotc3RydWN0IFBpdG1Cb3ggOiBwdWJsaWMgRnVsbEJveCB7Ci0gICAgUGl0bUJveChjb25zdCBzcDxEYXRhU291cmNlPiBzb3VyY2UpIDoKLSAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygncCcsICdpJywgJ3QnLCAnbScpKSB7fQotCi0gICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCB1aW50MzJfdCAqcHJpbWFyeUl0ZW1JZCk7Ci19OwotCi1zdGF0dXNfdCBQaXRtQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUsIHVpbnQzMl90ICpwcmltYXJ5SXRlbUlkKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gcGFyc2VGdWxsQm94SGVhZGVyKCZvZmZzZXQsICZzaXplKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgc2l6ZV90IGl0ZW1JZFNpemUgPSAodmVyc2lvbigpID09IDApID8gMiA6IDQ7Ci0gICAgaWYgKHNpemUgPCBpdGVtSWRTaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotICAgIHVpbnQzMl90IGl0ZW1JZDsKLSAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MzJWYXIob2Zmc2V0LCAmaXRlbUlkLCBpdGVtSWRTaXplKSkgewotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotCi0gICAgQUxPR1YoInByaW1hcnkgaWQgJWQiLCBpdGVtSWQpOwotICAgICpwcmltYXJ5SXRlbUlkID0gaXRlbUlkOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyAgSXRlbUxvY2F0aW9uIHJlbGF0ZWQgYm94ZXMKLS8vCi0KLXN0cnVjdCBFeHRlbnRFbnRyeSB7Ci0gICAgdWludDY0X3QgZXh0ZW50SW5kZXg7Ci0gICAgdWludDY0X3QgZXh0ZW50T2Zmc2V0OwotICAgIHVpbnQ2NF90IGV4dGVudExlbmd0aDsKLX07Ci0KLXN0cnVjdCBJdGVtTG9jIHsKLSAgICBJdGVtTG9jKCkgOiBJdGVtTG9jKDAsIDAsIDAsIDApIHt9Ci0gICAgSXRlbUxvYyh1aW50MzJfdCBpdGVtX2lkLCB1aW50MTZfdCBjb25zdHJ1Y3Rpb25fbWV0aG9kLAotICAgICAgICAgICAgdWludDE2X3QgZGF0YV9yZWZlcmVuY2VfaW5kZXgsIHVpbnQ2NF90IGJhc2Vfb2Zmc2V0KSA6Ci0gICAgICAgIGl0ZW1JZChpdGVtX2lkKSwKLSAgICAgICAgY29uc3RydWN0aW9uTWV0aG9kKGNvbnN0cnVjdGlvbl9tZXRob2QpLAotICAgICAgICBkYXRhUmVmZXJlbmNlSW5kZXgoZGF0YV9yZWZlcmVuY2VfaW5kZXgpLAotICAgICAgICBiYXNlT2Zmc2V0KGJhc2Vfb2Zmc2V0KSB7fQotCi0gICAgdm9pZCBhZGRFeHRlbnQoY29uc3QgRXh0ZW50RW50cnkmIGV4dGVudCkgewotICAgICAgICBleHRlbnRzLnB1c2hfYmFjayhleHRlbnQpOwotICAgIH0KLQotICAgIHN0YXR1c190IGdldExvYyhvZmY2NF90ICpvZmZzZXQsIHNpemVfdCAqc2l6ZSwKLSAgICAgICAgICAgIG9mZjY0X3QgaWRhdE9mZnNldCwgc2l6ZV90IGlkYXRTaXplKSBjb25zdCB7Ci0gICAgICAgIC8vIFRPRE86IGZpeCBleHRlbnQgaGFuZGxpbmcsIGZpeCBjb25zdHJ1Y3Rpb25NZXRob2QgPSAyCi0gICAgICAgIENIRUNLKGV4dGVudHMuc2l6ZSgpID09IDEpOwotICAgICAgICBpZiAoY29uc3RydWN0aW9uTWV0aG9kID09IDApIHsKLSAgICAgICAgICAgICpvZmZzZXQgPSBiYXNlT2Zmc2V0ICsgZXh0ZW50c1swXS5leHRlbnRPZmZzZXQ7Ci0gICAgICAgICAgICAqc2l6ZSA9IGV4dGVudHNbMF0uZXh0ZW50TGVuZ3RoOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9IGVsc2UgaWYgKGNvbnN0cnVjdGlvbk1ldGhvZCA9PSAxKSB7Ci0gICAgICAgICAgICBpZiAoYmFzZU9mZnNldCArIGV4dGVudHNbMF0uZXh0ZW50T2Zmc2V0ICsgZXh0ZW50c1swXS5leHRlbnRMZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgPiBpZGF0U2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqb2Zmc2V0ID0gYmFzZU9mZnNldCArIGV4dGVudHNbMF0uZXh0ZW50T2Zmc2V0ICsgaWRhdE9mZnNldDsKLSAgICAgICAgICAgICpzaXplID0gZXh0ZW50c1swXS5leHRlbnRMZW5ndGg7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIC8vIHBhcnNlZCBpbmZvCi0gICAgdWludDMyX3QgaXRlbUlkOwotICAgIHVpbnQxNl90IGNvbnN0cnVjdGlvbk1ldGhvZDsKLSAgICB1aW50MTZfdCBkYXRhUmVmZXJlbmNlSW5kZXg7Ci0gICAgb2ZmNjRfdCBiYXNlT2Zmc2V0OwotICAgIFZlY3RvcjxFeHRlbnRFbnRyeT4gZXh0ZW50czsKLX07Ci0KLXN0cnVjdCBJbG9jQm94IDogcHVibGljIEZ1bGxCb3ggewotICAgIElsb2NCb3goY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlLCBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSXRlbUxvYz4gKml0ZW1Mb2NzKSA6Ci0gICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAnbCcsICdvJywgJ2MnKSksCi0gICAgICAgIG1JdGVtTG9jcyhpdGVtTG9jcyksIG1IYXNDb25zdHJ1Y3RNZXRob2QxKGZhbHNlKSB7fQotCi0gICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKLQotICAgIGJvb2wgaGFzQ29uc3RydWN0TWV0aG9kMSgpIHsgcmV0dXJuIG1IYXNDb25zdHJ1Y3RNZXRob2QxOyB9Ci0KLXByaXZhdGU6Ci0gICAgc3RhdGljIGJvb2wgaXNTaXplRmllbGRWYWxpZCh1aW50MzJfdCBvZmZzZXRfc2l6ZSkgewotICAgICAgICByZXR1cm4gb2Zmc2V0X3NpemUgPT0gMCB8fCBvZmZzZXRfc2l6ZSA9PSA0IHx8IG9mZnNldF9zaXplID09IDg7Ci0gICAgfQotICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBJdGVtTG9jPiAqbUl0ZW1Mb2NzOwotICAgIGJvb2wgbUhhc0NvbnN0cnVjdE1ldGhvZDE7Ci19OwotCi1zdGF0dXNfdCBJbG9jQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKLSAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUZ1bGxCb3hIZWFkZXIoJm9mZnNldCwgJnNpemUpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgaWYgKHZlcnNpb24oKSA+IDIpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIHZlcnNpb24gJWQiLCBfX0ZVTkNUSU9OX18sIHZlcnNpb24oKSk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKHNpemUgPCAyKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotICAgIHVpbnQ4X3Qgb2Zmc2V0X3NpemU7Ci0gICAgaWYgKCFzb3VyY2UoKS0+cmVhZEF0KG9mZnNldCsrLCAmb2Zmc2V0X3NpemUsIDEpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0gICAgdWludDhfdCBsZW5ndGhfc2l6ZSA9IChvZmZzZXRfc2l6ZSAmIDB4Rik7Ci0gICAgb2Zmc2V0X3NpemUgPj49IDQ7Ci0KLSAgICB1aW50OF90IGJhc2Vfb2Zmc2V0X3NpemU7Ci0gICAgaWYgKCFzb3VyY2UoKS0+cmVhZEF0KG9mZnNldCsrLCAmYmFzZV9vZmZzZXRfc2l6ZSwgMSkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLSAgICB1aW50OF90IGluZGV4X3NpemUgPSAwOwotICAgIGlmICh2ZXJzaW9uKCkgPT0gMSB8fCB2ZXJzaW9uKCkgPT0gMikgewotICAgICAgICBpbmRleF9zaXplID0gKGJhc2Vfb2Zmc2V0X3NpemUgJiAweEYpOwotICAgIH0KLSAgICBiYXNlX29mZnNldF9zaXplID4+PSA0OwotICAgIHNpemUgLT0gMjsKLQotICAgIGlmICghaXNTaXplRmllbGRWYWxpZChvZmZzZXRfc2l6ZSkKLSAgICAgICAgICAgIHx8ICFpc1NpemVGaWVsZFZhbGlkKGxlbmd0aF9zaXplKQotICAgICAgICAgICAgfHwgIWlzU2l6ZUZpZWxkVmFsaWQoYmFzZV9vZmZzZXRfc2l6ZSkKLSAgICAgICAgICAgIHx8ICFpc1NpemVGaWVsZFZhbGlkKChpbmRleF9zaXplKSkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBvZmZzZXQgc2l6ZSBub3QgdmFsaWQ6ICVkLCAlZCwgJWQsICVkIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgIG9mZnNldF9zaXplLCBsZW5ndGhfc2l6ZSwgYmFzZV9vZmZzZXRfc2l6ZSwgaW5kZXhfc2l6ZSk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDMyX3QgaXRlbV9jb3VudDsKLSAgICBzaXplX3QgaXRlbUZpZWxkU2l6ZSA9IHZlcnNpb24oKSA8IDIgPyAyIDogNDsKLSAgICBpZiAoc2l6ZSA8IGl0ZW1GaWVsZFNpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0gICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyVmFyKG9mZnNldCwgJml0ZW1fY291bnQsIGl0ZW1GaWVsZFNpemUpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0KLSAgICBBTE9HVigiaXRlbV9jb3VudCAlbGxkIiwgKGxvbmcgbG9uZykgaXRlbV9jb3VudCk7Ci0gICAgb2Zmc2V0ICs9IGl0ZW1GaWVsZFNpemU7Ci0gICAgc2l6ZSAtPSBpdGVtRmllbGRTaXplOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpdGVtX2NvdW50OyBpKyspIHsKLSAgICAgICAgdWludDMyX3QgaXRlbV9pZDsKLSAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyVmFyKG9mZnNldCwgJml0ZW1faWQsIGl0ZW1GaWVsZFNpemUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIml0ZW1bJXp1XTogaWQgJWxsZCIsIGksIChsb25nIGxvbmcpaXRlbV9pZCk7Ci0gICAgICAgIG9mZnNldCArPSBpdGVtRmllbGRTaXplOwotCi0gICAgICAgIHVpbnQ4X3QgY29uc3RydWN0aW9uX21ldGhvZCA9IDA7Ci0gICAgICAgIGlmICh2ZXJzaW9uKCkgPT0gMSB8fCB2ZXJzaW9uKCkgPT0gMikgewotICAgICAgICAgICAgdWludDhfdCBidWZbMl07Ci0gICAgICAgICAgICBpZiAoIXNvdXJjZSgpLT5yZWFkQXQob2Zmc2V0LCBidWYsIDIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29uc3RydWN0aW9uX21ldGhvZCA9IChidWZbMV0gJiAweEYpOwotICAgICAgICAgICAgQUxPR1YoImNvbnN0cnVjdGlvbl9tZXRob2QgJWQiLCBjb25zdHJ1Y3Rpb25fbWV0aG9kKTsKLSAgICAgICAgICAgIGlmIChjb25zdHJ1Y3Rpb25fbWV0aG9kID09IDEpIHsKLSAgICAgICAgICAgICAgICBtSGFzQ29uc3RydWN0TWV0aG9kMSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9mZnNldCArPSAyOwotICAgICAgICB9Ci0KLSAgICAgICAgdWludDE2X3QgZGF0YV9yZWZlcmVuY2VfaW5kZXg7Ci0gICAgICAgIGlmICghc291cmNlKCktPmdldFVJbnQxNihvZmZzZXQsICZkYXRhX3JlZmVyZW5jZV9pbmRleCkpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiZGF0YV9yZWZlcmVuY2VfaW5kZXggJWQiLCBkYXRhX3JlZmVyZW5jZV9pbmRleCk7Ci0gICAgICAgIGlmIChkYXRhX3JlZmVyZW5jZV9pbmRleCAhPSAwKSB7Ci0gICAgICAgICAgICAvLyB3ZSBkb24ndCBzdXBwb3J0IHJlZmVyZW5jZSB0byBvdGhlciBmaWxlcwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgICAgICB9Ci0gICAgICAgIG9mZnNldCArPSAyOwotCi0gICAgICAgIHVpbnQ2NF90IGJhc2Vfb2Zmc2V0ID0gMDsKLSAgICAgICAgaWYgKGJhc2Vfb2Zmc2V0X3NpemUgIT0gMCkgewotICAgICAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDY0VmFyKG9mZnNldCwgJmJhc2Vfb2Zmc2V0LCBiYXNlX29mZnNldF9zaXplKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9mZnNldCArPSBiYXNlX29mZnNldF9zaXplOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJiYXNlX29mZnNldCAlbGxkIiwgKGxvbmcgbG9uZykgYmFzZV9vZmZzZXQpOwotCi0gICAgICAgIHNzaXplX3QgaW5kZXggPSBtSXRlbUxvY3MtPmFkZChpdGVtX2lkLCBJdGVtTG9jKAotICAgICAgICAgICAgICAgIGl0ZW1faWQsIGNvbnN0cnVjdGlvbl9tZXRob2QsIGRhdGFfcmVmZXJlbmNlX2luZGV4LCBiYXNlX29mZnNldCkpOwotICAgICAgICBJdGVtTG9jICZpdGVtID0gbUl0ZW1Mb2NzLT5lZGl0VmFsdWVBdChpbmRleCk7Ci0KLSAgICAgICAgdWludDE2X3QgZXh0ZW50X2NvdW50OwotICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MTYob2Zmc2V0LCAmZXh0ZW50X2NvdW50KSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJleHRlbnRfY291bnQgJWQiLCBleHRlbnRfY291bnQpOwotCi0gICAgICAgIGlmIChleHRlbnRfY291bnQgPiAxICYmIChvZmZzZXRfc2l6ZSA9PSAwIHx8IGxlbmd0aF9zaXplID09IDApKSB7Ci0gICAgICAgICAgICAvLyBpZiB0aGUgaXRlbSBpcyBkaXZpZGVjIGludG8gbW9yZSB0aGFuIG9uZSBleHRlbnRzLCBvZmZzZXQgYW5kCi0gICAgICAgICAgICAvLyBsZW5ndGggbXVzdCBiZSBwcmVzZW50LgotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotICAgICAgICBvZmZzZXQgKz0gMjsKLQotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGV4dGVudF9jb3VudDsgaisrKSB7Ci0gICAgICAgICAgICB1aW50NjRfdCBleHRlbnRfaW5kZXggPSAxOyAvLyBkZWZhdWx0PTEKLSAgICAgICAgICAgIGlmICgodmVyc2lvbigpID09IDEgfHwgdmVyc2lvbigpID09IDIpICYmIChpbmRleF9zaXplID4gMCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50NjRWYXIob2Zmc2V0LCAmZXh0ZW50X2luZGV4LCBpbmRleF9zaXplKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciB0aGlzIG1vZGUKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gaW5kZXhfc2l6ZTsKLSAgICAgICAgICAgICAgICBBTE9HVigiZXh0ZW50X2luZGV4ICVsbGQiLCAobG9uZyBsb25nKWV4dGVudF9pbmRleCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVpbnQ2NF90IGV4dGVudF9vZmZzZXQgPSAwOyAvLyBkZWZhdWx0PTAKLSAgICAgICAgICAgIGlmIChvZmZzZXRfc2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50NjRWYXIob2Zmc2V0LCAmZXh0ZW50X29mZnNldCwgb2Zmc2V0X3NpemUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IG9mZnNldF9zaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoImV4dGVudF9vZmZzZXQgJWxsZCIsIChsb25nIGxvbmcpZXh0ZW50X29mZnNldCk7Ci0KLSAgICAgICAgICAgIHVpbnQ2NF90IGV4dGVudF9sZW5ndGggPSAwOyAvLyB0aGlzIGluZGljYXRlcyBmdWxsIGxlbmd0aCBvZiBmaWxlCi0gICAgICAgICAgICBpZiAobGVuZ3RoX3NpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDY0VmFyKG9mZnNldCwgJmV4dGVudF9sZW5ndGgsIGxlbmd0aF9zaXplKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9mZnNldCArPSBsZW5ndGhfc2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJleHRlbnRfbGVuZ3RoICVsbGQiLCAobG9uZyBsb25nKWV4dGVudF9sZW5ndGgpOwotCi0gICAgICAgICAgICBpdGVtLmFkZEV4dGVudCh7IGV4dGVudF9pbmRleCwgZXh0ZW50X29mZnNldCwgZXh0ZW50X2xlbmd0aCB9KTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vICBJdGVtUmVmZXJlbmNlIHJlbGF0ZWQgYm94ZXMKLS8vCi0KLXN0cnVjdCBJdGVtUmVmZXJlbmNlIDogcHVibGljIEJveCwgcHVibGljIFJlZkJhc2UgewotICAgIEl0ZW1SZWZlcmVuY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlLCB1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBpdGVtSWRTaXplKSA6Ci0gICAgICAgIEJveChzb3VyY2UsIHR5cGUpLCBtSXRlbUlkKDApLCBtUmVmSWRTaXplKGl0ZW1JZFNpemUpIHt9Ci0KLSAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwotCi0gICAgdWludDMyX3QgaXRlbUlkKCkgeyByZXR1cm4gbUl0ZW1JZDsgfQotCi0gICAgdm9pZCBhcHBseShLZXllZFZlY3Rvcjx1aW50MzJfdCwgSW1hZ2VJdGVtPiAmaXRlbUlkVG9JbWFnZU1hcCkgY29uc3QgewotICAgICAgICBzc2l6ZV90IGltYWdlSW5kZXggPSBpdGVtSWRUb0ltYWdlTWFwLmluZGV4T2ZLZXkobUl0ZW1JZCk7Ci0KLSAgICAgICAgLy8gaWdub3JlIG5vbi1pbWFnZSBpdGVtcwotICAgICAgICBpZiAoaW1hZ2VJbmRleCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEFMT0dWKCJhdHRhY2ggcmVmZXJlbmNlIHR5cGUgMHgleCB0byBpdGVtIGlkICVkKSIsIHR5cGUoKSwgbUl0ZW1JZCk7Ci0KLSAgICAgICAgaWYgKHR5cGUoKSA9PSBGT1VSQ0MoJ2QnLCAnaScsICdtJywgJ2cnKSkgewotICAgICAgICAgICAgSW1hZ2VJdGVtICZpbWFnZSA9IGl0ZW1JZFRvSW1hZ2VNYXAuZWRpdFZhbHVlQXQoaW1hZ2VJbmRleCk7Ci0gICAgICAgICAgICBpZiAoIWltYWdlLmRpbWdSZWZzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiZGltZ1JlZnMgaWYgbm90IGNsZWFuISIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW1hZ2UuZGltZ1JlZnMuYXBwZW5kVmVjdG9yKG1SZWZzKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlKCkgPT0gRk9VUkNDKCd0JywgJ2gnLCAnbScsICdiJykpIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVJlZnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpbWFnZUluZGV4ID0gaXRlbUlkVG9JbWFnZU1hcC5pbmRleE9mS2V5KG1SZWZzW2ldKTsKLQotICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBub24taW1hZ2UgaXRlbXMKLSAgICAgICAgICAgICAgICBpZiAoaW1hZ2VJbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dWKCJJbWFnZSBpdGVtIGlkICVkIHVzZXMgdGh1bWJuYWlsIGl0ZW0gaWQgJWQiLCBtUmVmc1tpXSwgbUl0ZW1JZCk7Ci0gICAgICAgICAgICAgICAgSW1hZ2VJdGVtICZpbWFnZSA9IGl0ZW1JZFRvSW1hZ2VNYXAuZWRpdFZhbHVlQXQoaW1hZ2VJbmRleCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFpbWFnZS50aHVtYm5haWxzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImFscmVhZHkgaGFzIHRodW1ibmFpbHMhIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGltYWdlLnRodW1ibmFpbHMucHVzaF9iYWNrKG1JdGVtSWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nIHVuc3VwcG9ydGVkIHJlZiB0eXBlIDB4JXgiLCB0eXBlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi1wcml2YXRlOgotICAgIHVpbnQzMl90IG1JdGVtSWQ7Ci0gICAgdWludDMyX3QgbVJlZklkU2l6ZTsKLSAgICBWZWN0b3I8dWludDMyX3Q+IG1SZWZzOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSXRlbVJlZmVyZW5jZSk7Ci19OwotCi1zdGF0dXNfdCBJdGVtUmVmZXJlbmNlOjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKLSAgICBpZiAoc2l6ZSA8IG1SZWZJZFNpemUgKyAyKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotICAgIGlmICghc291cmNlKCktPmdldFVJbnQzMlZhcihvZmZzZXQsICZtSXRlbUlkLCBtUmVmSWRTaXplKSkgewotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotICAgIG9mZnNldCArPSBtUmVmSWRTaXplOwotCi0gICAgdWludDE2X3QgY291bnQ7Ci0gICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDE2KG9mZnNldCwgJmNvdW50KSkgewotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotICAgIG9mZnNldCArPSAyOwotICAgIHNpemUgLT0gKG1SZWZJZFNpemUgKyAyKTsKLQotICAgIGlmIChzaXplIDwgY291bnQgKiBtUmVmSWRTaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIHVpbnQzMl90IHJlZkl0ZW1JZDsKLSAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyVmFyKG9mZnNldCwgJnJlZkl0ZW1JZCwgbVJlZklkU2l6ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgfQotICAgICAgICBvZmZzZXQgKz0gbVJlZklkU2l6ZTsKLSAgICAgICAgbVJlZnMucHVzaF9iYWNrKHJlZkl0ZW1JZCk7Ci0gICAgICAgIEFMT0dWKCJpdGVtIGlkICVkOiByZWZlcmVuY2luZyBpdGVtIGlkICVkIiwgbUl0ZW1JZCwgcmVmSXRlbUlkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0cnVjdCBJcmVmQm94IDogcHVibGljIEZ1bGxCb3ggewotICAgIElyZWZCb3goY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlLCBWZWN0b3I8c3A8SXRlbVJlZmVyZW5jZT4gPiAqaXRlbVJlZnMpIDoKLSAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygnaScsICdyJywgJ2UnLCAnZicpKSwgbVJlZklkU2l6ZSgwKSwgbUl0ZW1SZWZzKGl0ZW1SZWZzKSB7fQotCi0gICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKLQotcHJvdGVjdGVkOgotICAgIHN0YXR1c190IG9uQ2h1bmtEYXRhKHVpbnQzMl90IHR5cGUsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7Ci0KLXByaXZhdGU6Ci0gICAgdWludDMyX3QgbVJlZklkU2l6ZTsKLSAgICBWZWN0b3I8c3A8SXRlbVJlZmVyZW5jZT4gPiAqbUl0ZW1SZWZzOwotfTsKLQotc3RhdHVzX3QgSXJlZkJveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7Ci0gICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKLSAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUZ1bGxCb3hIZWFkZXIoJm9mZnNldCwgJnNpemUpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBtUmVmSWRTaXplID0gKHZlcnNpb24oKSA9PSAwKSA/IDIgOiA0OwotICAgIHJldHVybiBwYXJzZUNodW5rcyhvZmZzZXQsIHNpemUpOwotfQotCi1zdGF0dXNfdCBJcmVmQm94OjpvbkNodW5rRGF0YSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKLSAgICBzcDxJdGVtUmVmZXJlbmNlPiBpdGVtUmVmID0gbmV3IEl0ZW1SZWZlcmVuY2Uoc291cmNlKCksIHR5cGUsIG1SZWZJZFNpemUpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gaXRlbVJlZi0+cGFyc2Uob2Zmc2V0LCBzaXplKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIG1JdGVtUmVmcy0+cHVzaF9iYWNrKGl0ZW1SZWYpOwotICAgIHJldHVybiBPSzsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gIEl0ZW1Qcm9wZXJ0eSByZWxhdGVkIGJveGVzCi0vLwotCi1zdHJ1Y3QgQXNzb2NpYXRpb25FbnRyeSB7Ci0gICAgdWludDMyX3QgaXRlbUlkOwotICAgIGJvb2wgZXNzZW50aWFsOwotICAgIHVpbnQxNl90IGluZGV4OwotfTsKLQotc3RydWN0IEl0ZW1Qcm9wZXJ0eSA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBJdGVtUHJvcGVydHkoKSB7fQotCi0gICAgdmlydHVhbCB2b2lkIGF0dGFjaFRvKEltYWdlSXRlbSAmLyppbWFnZSovKSBjb25zdCB7Ci0gICAgICAgIEFMT0dXKCJVbnJlY29nbml6ZWQgcHJvcGVydHkiKTsKLSAgICB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBwYXJzZShvZmY2NF90IC8qb2Zmc2V0Ki8sIHNpemVfdCAvKnNpemUqLykgewotICAgICAgICBBTE9HVygiVW5yZWNvZ25pemVkIHByb3BlcnR5Iik7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSXRlbVByb3BlcnR5KTsKLX07Ci0KLXN0cnVjdCBJc3BlQm94IDogcHVibGljIEZ1bGxCb3gsIHB1YmxpYyBJdGVtUHJvcGVydHkgewotICAgIElzcGVCb3goY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlKSA6Ci0gICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAncycsICdwJywgJ2UnKSksIG1XaWR0aCgwKSwgbUhlaWdodCgwKSB7fQotCi0gICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKLQotICAgIHZvaWQgYXR0YWNoVG8oSW1hZ2VJdGVtICZpbWFnZSkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgICBpbWFnZS53aWR0aCA9IG1XaWR0aDsKLSAgICAgICAgaW1hZ2UuaGVpZ2h0ID0gbUhlaWdodDsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgdWludDMyX3QgbVdpZHRoOwotICAgIHVpbnQzMl90IG1IZWlnaHQ7Ci19OwotCi1zdGF0dXNfdCBJc3BlQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKLSAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gcGFyc2VGdWxsQm94SGVhZGVyKCZvZmZzZXQsICZzaXplKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKHNpemUgPCA4KSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotICAgIGlmICghc291cmNlKCktPmdldFVJbnQzMihvZmZzZXQsICZtV2lkdGgpCi0gICAgICAgICAgICB8fCAhc291cmNlKCktPmdldFVJbnQzMihvZmZzZXQgKyA0LCAmbUhlaWdodCkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLSAgICBBTE9HVigicHJvcGVydHkgaXNwZTogJWR4JWQiLCBtV2lkdGgsIG1IZWlnaHQpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdHJ1Y3QgSHZjY0JveCA6IHB1YmxpYyBCb3gsIHB1YmxpYyBJdGVtUHJvcGVydHkgewotICAgIEh2Y2NCb3goY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlKSA6Ci0gICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygnaCcsICd2JywgJ2MnLCAnQycpKSB7fQotCi0gICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKLQotICAgIHZvaWQgYXR0YWNoVG8oSW1hZ2VJdGVtICZpbWFnZSkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgICBpbWFnZS5odmNjID0gbUhWQ0M7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIHNwPEFCdWZmZXI+IG1IVkNDOwotfTsKLQotc3RhdHVzX3QgSHZjY0JveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7Ci0gICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKLQotICAgIG1IVkNDID0gbmV3IEFCdWZmZXIoc2l6ZSk7Ci0KLSAgICBpZiAobUhWQ0MtPmRhdGEoKSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJiLzI4NDcxMjA2Iik7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotCi0gICAgaWYgKHNvdXJjZSgpLT5yZWFkQXQob2Zmc2V0LCBtSFZDQy0+ZGF0YSgpLCBzaXplKSA8IChzc2l6ZV90KXNpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLQotICAgIEFMT0dWKCJwcm9wZXJ0eSBodmNDIik7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0cnVjdCBJcm90Qm94IDogcHVibGljIEJveCwgcHVibGljIEl0ZW1Qcm9wZXJ0eSB7Ci0gICAgSXJvdEJveChjb25zdCBzcDxEYXRhU291cmNlPiBzb3VyY2UpIDoKLSAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ3InLCAnbycsICd0JykpLCBtQW5nbGUoMCkge30KLQotICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7Ci0KLSAgICB2b2lkIGF0dGFjaFRvKEltYWdlSXRlbSAmaW1hZ2UpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgICAgaW1hZ2Uucm90YXRpb24gPSBtQW5nbGUgKiA5MDsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgdWludDhfdCBtQW5nbGU7Ci19OwotCi1zdGF0dXNfdCBJcm90Qm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKLSAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOwotCi0gICAgaWYgKHNpemUgPCAxKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotICAgIGlmIChzb3VyY2UoKS0+cmVhZEF0KG9mZnNldCwgJm1BbmdsZSwgMSkgIT0gMSkgewotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotICAgIG1BbmdsZSAmPSAweDM7Ci0gICAgQUxPR1YoInByb3BlcnR5IGlyb3Q6ICVkIiwgbUFuZ2xlKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RydWN0IENvbHJCb3ggOiBwdWJsaWMgQm94LCBwdWJsaWMgSXRlbVByb3BlcnR5IHsKLSAgICBDb2xyQm94KGNvbnN0IHNwPERhdGFTb3VyY2U+IHNvdXJjZSkgOgotICAgICAgICBCb3goc291cmNlLCBGT1VSQ0MoJ2MnLCAnbycsICdsJywgJ3InKSkge30KLQotICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7Ci0KLSAgICB2b2lkIGF0dGFjaFRvKEltYWdlSXRlbSAmaW1hZ2UpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgICAgaW1hZ2UuaWNjID0gbUlDQ0RhdGE7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIHNwPEFCdWZmZXI+IG1JQ0NEYXRhOwotfTsKLQotc3RhdHVzX3QgQ29sckJveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7Ci0gICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKLQotICAgIGlmIChzaXplIDwgNCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICB1aW50MzJfdCBjb2xvdXJfdHlwZTsKLSAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MzIob2Zmc2V0LCAmY29sb3VyX3R5cGUpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0gICAgb2Zmc2V0ICs9IDQ7Ci0gICAgc2l6ZSAtPSA0OwotICAgIGlmIChjb2xvdXJfdHlwZSA9PSBGT1VSQ0MoJ24nLCAnYycsICdsJywgJ3gnKSkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotICAgIGlmICgoY29sb3VyX3R5cGUgIT0gRk9VUkNDKCdyJywgJ0knLCAnQycsICdDJykpICYmCi0gICAgICAgIChjb2xvdXJfdHlwZSAhPSBGT1VSQ0MoJ3AnLCAncicsICdvJywgJ2YnKSkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBtSUNDRGF0YSA9IG5ldyBBQnVmZmVyKHNpemUpOwotICAgIGlmIChtSUNDRGF0YS0+ZGF0YSgpID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoImIvMjg0NzEyMDYiKTsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0KLSAgICBpZiAoc291cmNlKCktPnJlYWRBdChvZmZzZXQsIG1JQ0NEYXRhLT5kYXRhKCksIHNpemUpICE9IChzc2l6ZV90KXNpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLQotICAgIEFMT0dWKCJwcm9wZXJ0eSBDb2xyOiBzaXplICV6ZCIsIHNpemUpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RydWN0IElwbWFCb3ggOiBwdWJsaWMgRnVsbEJveCB7Ci0gICAgSXBtYUJveChjb25zdCBzcDxEYXRhU291cmNlPiBzb3VyY2UsIFZlY3RvcjxBc3NvY2lhdGlvbkVudHJ5PiAqYXNzb2NpYXRpb25zKSA6Ci0gICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAncCcsICdtJywgJ2EnKSksIG1Bc3NvY2lhdGlvbnMoYXNzb2NpYXRpb25zKSB7fQotCi0gICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKLXByaXZhdGU6Ci0gICAgVmVjdG9yPEFzc29jaWF0aW9uRW50cnk+ICptQXNzb2NpYXRpb25zOwotfTsKLQotc3RhdHVzX3QgSXBtYUJveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gcGFyc2VGdWxsQm94SGVhZGVyKCZvZmZzZXQsICZzaXplKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKHNpemUgPCA0KSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotICAgIHVpbnQzMl90IGVudHJ5Q291bnQ7Ci0gICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyKG9mZnNldCwgJmVudHJ5Q291bnQpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0gICAgb2Zmc2V0ICs9IDQ7Ci0gICAgc2l6ZSAtPSA0OwotCi0gICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBlbnRyeUNvdW50OyArK2spIHsKLSAgICAgICAgdWludDMyX3QgaXRlbUlkID0gMDsKLSAgICAgICAgc2l6ZV90IGl0ZW1JZFNpemUgPSAodmVyc2lvbigpIDwgMSkgPyAyIDogNDsKLQotICAgICAgICBpZiAoc2l6ZSA8IGl0ZW1JZFNpemUgKyAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyVmFyKG9mZnNldCwgJml0ZW1JZCwgaXRlbUlkU2l6ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgfQotICAgICAgICBvZmZzZXQgKz0gaXRlbUlkU2l6ZTsKLSAgICAgICAgc2l6ZSAtPSBpdGVtSWRTaXplOwotCi0gICAgICAgIHVpbnQ4X3QgYXNzb2NpYXRpb25Db3VudDsKLSAgICAgICAgaWYgKCFzb3VyY2UoKS0+cmVhZEF0KG9mZnNldCwgJmFzc29jaWF0aW9uQ291bnQsIDEpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgIH0KLSAgICAgICAgb2Zmc2V0Kys7Ci0gICAgICAgIHNpemUtLTsKLQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFzc29jaWF0aW9uQ291bnQ7ICsraSkgewotICAgICAgICAgICAgc2l6ZV90IHByb3BJbmRleFNpemUgPSAoZmxhZ3MoKSAmIDEpID8gMiA6IDE7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA8IHByb3BJbmRleFNpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdWludDE2X3QgcHJvcEluZGV4OwotICAgICAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDE2VmFyKG9mZnNldCwgJnByb3BJbmRleCwgcHJvcEluZGV4U2l6ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvZmZzZXQgKz0gcHJvcEluZGV4U2l6ZTsKLSAgICAgICAgICAgIHNpemUgLT0gcHJvcEluZGV4U2l6ZTsKLSAgICAgICAgICAgIHVpbnQxNl90IGJpdG1hc2sgPSAoMSA8PCAoOCAqIHByb3BJbmRleFNpemUgLSAxKSk7Ci0gICAgICAgICAgICBBc3NvY2lhdGlvbkVudHJ5IGVudHJ5ID0gewotICAgICAgICAgICAgICAgICAgICAuaXRlbUlkID0gaXRlbUlkLAotICAgICAgICAgICAgICAgICAgICAuZXNzZW50aWFsID0gISEocHJvcEluZGV4ICYgYml0bWFzayksCi0gICAgICAgICAgICAgICAgICAgIC5pbmRleCA9ICh1aW50MTZfdCkgKHByb3BJbmRleCAmIH5iaXRtYXNrKQotICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgQUxPR1YoIml0ZW0gaWQgJWQgYXNzb2NpYXRlZCB0byBwcm9wZXJ0eSAlZCAoZXNzZW50aWFsICVkKSIsCi0gICAgICAgICAgICAgICAgICAgIGl0ZW1JZCwgZW50cnkuaW5kZXgsIGVudHJ5LmVzc2VudGlhbCk7Ci0KLSAgICAgICAgICAgIG1Bc3NvY2lhdGlvbnMtPnB1c2hfYmFjayhlbnRyeSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0cnVjdCBJcGNvQm94IDogcHVibGljIEJveCB7Ci0gICAgSXBjb0JveChjb25zdCBzcDxEYXRhU291cmNlPiBzb3VyY2UsIFZlY3RvcjxzcDxJdGVtUHJvcGVydHk+ID4gKnByb3BlcnRpZXMpIDoKLSAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ3AnLCAnYycsICdvJykpLCBtSXRlbVByb3BlcnRpZXMocHJvcGVydGllcykge30KLQotICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7Ci1wcm90ZWN0ZWQ6Ci0gICAgc3RhdHVzX3Qgb25DaHVua0RhdGEodWludDMyX3QgdHlwZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKLQotcHJpdmF0ZToKLSAgICBWZWN0b3I8c3A8SXRlbVByb3BlcnR5PiA+ICptSXRlbVByb3BlcnRpZXM7Ci19OwotCi1zdGF0dXNfdCBJcGNvQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKLSAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOwotICAgIC8vIHB1c2ggZHVtbXkgYXMgdGhlIGluZGV4IGlzIDEtYmFzZWQKLSAgICBtSXRlbVByb3BlcnRpZXMtPnB1c2hfYmFjayhuZXcgSXRlbVByb3BlcnR5KCkpOwotICAgIHJldHVybiBwYXJzZUNodW5rcyhvZmZzZXQsIHNpemUpOwotfQotCi1zdGF0dXNfdCBJcGNvQm94OjpvbkNodW5rRGF0YSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKLSAgICBzcDxJdGVtUHJvcGVydHk+IGl0ZW1Qcm9wZXJ0eTsKLSAgICBzd2l0Y2godHlwZSkgewotICAgICAgICBjYXNlIEZPVVJDQygnaCcsICd2JywgJ2MnLCAnQycpOgotICAgICAgICB7Ci0gICAgICAgICAgICBpdGVtUHJvcGVydHkgPSBuZXcgSHZjY0JveChzb3VyY2UoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygnaScsICdzJywgJ3AnLCAnZScpOgotICAgICAgICB7Ci0gICAgICAgICAgICBpdGVtUHJvcGVydHkgPSBuZXcgSXNwZUJveChzb3VyY2UoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygnaScsICdyJywgJ28nLCAndCcpOgotICAgICAgICB7Ci0gICAgICAgICAgICBpdGVtUHJvcGVydHkgPSBuZXcgSXJvdEJveChzb3VyY2UoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygnYycsICdvJywgJ2wnLCAncicpOgotICAgICAgICB7Ci0gICAgICAgICAgICBpdGVtUHJvcGVydHkgPSBuZXcgQ29sckJveChzb3VyY2UoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBwdXNoIGR1bW15IHRvIG1haW50YWluIGNvcnJlY3QgaXRlbSBwcm9wZXJ0eSBpbmRleAotICAgICAgICAgICAgaXRlbVByb3BlcnR5ID0gbmV3IEl0ZW1Qcm9wZXJ0eSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgc3RhdHVzX3QgZXJyID0gaXRlbVByb3BlcnR5LT5wYXJzZShvZmZzZXQsIHNpemUpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgbUl0ZW1Qcm9wZXJ0aWVzLT5wdXNoX2JhY2soaXRlbVByb3BlcnR5KTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0cnVjdCBJcHJwQm94IDogcHVibGljIEJveCB7Ci0gICAgSXBycEJveChjb25zdCBzcDxEYXRhU291cmNlPiBzb3VyY2UsCi0gICAgICAgICAgICBWZWN0b3I8c3A8SXRlbVByb3BlcnR5PiA+ICpwcm9wZXJ0aWVzLAotICAgICAgICAgICAgVmVjdG9yPEFzc29jaWF0aW9uRW50cnk+ICphc3NvY2lhdGlvbnMpIDoKLSAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ3AnLCAncicsICdwJykpLAotICAgICAgICBtUHJvcGVydGllcyhwcm9wZXJ0aWVzKSwgbUFzc29jaWF0aW9ucyhhc3NvY2lhdGlvbnMpIHt9Ci0KLSAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwotcHJvdGVjdGVkOgotICAgIHN0YXR1c190IG9uQ2h1bmtEYXRhKHVpbnQzMl90IHR5cGUsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7Ci0KLXByaXZhdGU6Ci0gICAgVmVjdG9yPHNwPEl0ZW1Qcm9wZXJ0eT4gPiAqbVByb3BlcnRpZXM7Ci0gICAgVmVjdG9yPEFzc29jaWF0aW9uRW50cnk+ICptQXNzb2NpYXRpb25zOwotfTsKLQotc3RhdHVzX3QgSXBycEJveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7Ci0gICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKLQotICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmtzKG9mZnNldCwgc2l6ZSk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IElwcnBCb3g6Om9uQ2h1bmtEYXRhKHVpbnQzMl90IHR5cGUsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewotICAgIHN3aXRjaCh0eXBlKSB7Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ3AnLCAnYycsICdvJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIElwY29Cb3ggaXBjb0JveChzb3VyY2UoKSwgbVByb3BlcnRpZXMpOwotICAgICAgICAgICAgcmV0dXJuIGlwY29Cb3gucGFyc2Uob2Zmc2V0LCBzaXplKTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygnaScsICdwJywgJ20nLCAnYScpOgotICAgICAgICB7Ci0gICAgICAgICAgICBJcG1hQm94IGlwbWFCb3goc291cmNlKCksIG1Bc3NvY2lhdGlvbnMpOwotICAgICAgICAgICAgcmV0dXJuIGlwbWFCb3gucGFyc2Uob2Zmc2V0LCBzaXplKTsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVygiVW5yZWNvZ25pemVkIGJveC4iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gIEl0ZW1JbmZvIHJlbGF0ZWQgYm94ZXMKLS8vCi1zdHJ1Y3QgSXRlbUluZm8gewotICAgIHVpbnQzMl90IGl0ZW1JZDsKLSAgICB1aW50MzJfdCBpdGVtVHlwZTsKLX07Ci0KLXN0cnVjdCBJbmZlQm94IDogcHVibGljIEZ1bGxCb3ggewotICAgIEluZmVCb3goY29uc3Qgc3A8RGF0YVNvdXJjZT4gc291cmNlKSA6Ci0gICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAnbicsICdmJywgJ2UnKSkge30KLQotICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgSXRlbUluZm8gKml0ZW1JbmZvKTsKLQotcHJpdmF0ZToKLSAgICBib29sIHBhcnNlTnVsbFRlcm1pbmF0ZWRTdHJpbmcob2ZmNjRfdCAqb2Zmc2V0LCBzaXplX3QgKnNpemUsIFN0cmluZzggKm91dCk7Ci19OwotCi1ib29sIEluZmVCb3g6OnBhcnNlTnVsbFRlcm1pbmF0ZWRTdHJpbmcoCi0gICAgICAgIG9mZjY0X3QgKm9mZnNldCwgc2l6ZV90ICpzaXplLCBTdHJpbmc4ICpvdXQpIHsKLSAgICBjaGFyIHRtcFsyNTZdOwotICAgIHNpemVfdCBsZW4gPSAwOwotICAgIG9mZjY0X3QgbmV3T2Zmc2V0ID0gKm9mZnNldDsKLSAgICBvZmY2NF90IHN0b3BPZmZzZXQgPSAqb2Zmc2V0ICsgKnNpemU7Ci0gICAgd2hpbGUgKG5ld09mZnNldCA8IHN0b3BPZmZzZXQpIHsKLSAgICAgICAgaWYgKCFzb3VyY2UoKS0+cmVhZEF0KG5ld09mZnNldCsrLCAmdG1wW2xlbl0sIDEpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRtcFtsZW5dID09IDApIHsKLSAgICAgICAgICAgIG91dC0+YXBwZW5kKHRtcCwgbGVuKTsKLQotICAgICAgICAgICAgKm9mZnNldCA9IG5ld09mZnNldDsKLSAgICAgICAgICAgICpzaXplID0gc3RvcE9mZnNldCAtIG5ld09mZnNldDsKLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCsrbGVuID49IHNpemVvZih0bXApKSB7Ci0gICAgICAgICAgICBvdXQtPmFwcGVuZCh0bXAsIGxlbik7Ci0gICAgICAgICAgICBsZW4gPSAwOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdHVzX3QgSW5mZUJveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBJdGVtSW5mbyAqaXRlbUluZm8pIHsKLSAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUZ1bGxCb3hIZWFkZXIoJm9mZnNldCwgJnNpemUpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAodmVyc2lvbigpID09IDAgfHwgdmVyc2lvbigpID09IDEpIHsKLSAgICAgICAgaWYgKHNpemUgPCA0KSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQxNl90IGl0ZW1faWQ7Ci0gICAgICAgIGlmICghc291cmNlKCktPmdldFVJbnQxNihvZmZzZXQsICZpdGVtX2lkKSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJpdGVtX2lkICVkIiwgaXRlbV9pZCk7Ci0gICAgICAgIHVpbnQxNl90IGl0ZW1fcHJvdGVjdGlvbl9pbmRleDsKLSAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDE2KG9mZnNldCArIDIsICZpdGVtX3Byb3RlY3Rpb25faW5kZXgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgIH0KLSAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgICAgIHNpemUgLT0gNDsKLQotICAgICAgICBTdHJpbmc4IGl0ZW1fbmFtZTsKLSAgICAgICAgaWYgKCFwYXJzZU51bGxUZXJtaW5hdGVkU3RyaW5nKCZvZmZzZXQsICZzaXplLCAmaXRlbV9uYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZzggY29udGVudF90eXBlOwotICAgICAgICBpZiAoIXBhcnNlTnVsbFRlcm1pbmF0ZWRTdHJpbmcoJm9mZnNldCwgJnNpemUsICZjb250ZW50X3R5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nOCBjb250ZW50X2VuY29kaW5nOwotICAgICAgICBpZiAoIXBhcnNlTnVsbFRlcm1pbmF0ZWRTdHJpbmcoJm9mZnNldCwgJnNpemUsICZjb250ZW50X2VuY29kaW5nKSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2ZXJzaW9uKCkgPT0gMSkgewotICAgICAgICAgICAgdWludDMyX3QgZXh0ZW5zaW9uX3R5cGU7Ci0gICAgICAgICAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MzIob2Zmc2V0LCAmZXh0ZW5zaW9uX3R5cGUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2Zmc2V0Kys7Ci0gICAgICAgICAgICBzaXplLS07Ci0gICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgdGhpcyBjYXNlCi0gICAgICAgIH0KLSAgICB9IGVsc2UgeyAvLyB2ZXJzaW9uID49IDIKLSAgICAgICAgdWludDMyX3QgaXRlbV9pZDsKLSAgICAgICAgc2l6ZV90IGl0ZW1JZFNpemUgPSAodmVyc2lvbigpID09IDIpID8gMiA6IDQ7Ci0gICAgICAgIGlmIChzaXplIDwgaXRlbUlkU2l6ZSArIDYpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyVmFyKG9mZnNldCwgJml0ZW1faWQsIGl0ZW1JZFNpemUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIml0ZW1faWQgJWQiLCBpdGVtX2lkKTsKLSAgICAgICAgb2Zmc2V0ICs9IGl0ZW1JZFNpemU7Ci0gICAgICAgIHVpbnQxNl90IGl0ZW1fcHJvdGVjdGlvbl9pbmRleDsKLSAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDE2KG9mZnNldCwgJml0ZW1fcHJvdGVjdGlvbl9pbmRleCkpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiaXRlbV9wcm90ZWN0aW9uX2luZGV4ICVkIiwgaXRlbV9wcm90ZWN0aW9uX2luZGV4KTsKLSAgICAgICAgb2Zmc2V0ICs9IDI7Ci0gICAgICAgIHVpbnQzMl90IGl0ZW1fdHlwZTsKLSAgICAgICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyKG9mZnNldCwgJml0ZW1fdHlwZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgfQotCi0gICAgICAgIGl0ZW1JbmZvLT5pdGVtSWQgPSBpdGVtX2lkOwotICAgICAgICBpdGVtSW5mby0+aXRlbVR5cGUgPSBpdGVtX3R5cGU7Ci0KLSAgICAgICAgY2hhciBpdGVtVHlwZVN0cmluZ1s1XTsKLSAgICAgICAgTWFrZUZvdXJDQ1N0cmluZyhpdGVtX3R5cGUsIGl0ZW1UeXBlU3RyaW5nKTsKLSAgICAgICAgQUxPR1YoIml0ZW1fdHlwZSAlcyIsIGl0ZW1UeXBlU3RyaW5nKTsKLSAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgICAgIHNpemUgLT0gaXRlbUlkU2l6ZSArIDY7Ci0KLSAgICAgICAgU3RyaW5nOCBpdGVtX25hbWU7Ci0gICAgICAgIGlmICghcGFyc2VOdWxsVGVybWluYXRlZFN0cmluZygmb2Zmc2V0LCAmc2l6ZSwgJml0ZW1fbmFtZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIml0ZW1fbmFtZSAlcyIsIGl0ZW1fbmFtZS5jX3N0cigpKTsKLQotICAgICAgICBpZiAoaXRlbV90eXBlID09IEZPVVJDQygnbScsICdpJywgJ20nLCAnZScpKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IGNvbnRlbnRfdHlwZTsKLSAgICAgICAgICAgIGlmICghcGFyc2VOdWxsVGVybWluYXRlZFN0cmluZygmb2Zmc2V0LCAmc2l6ZSwgJmNvbnRlbnRfdHlwZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmc4IGNvbnRlbnRfZW5jb2Rpbmc7Ci0gICAgICAgICAgICBpZiAoIXBhcnNlTnVsbFRlcm1pbmF0ZWRTdHJpbmcoJm9mZnNldCwgJnNpemUsICZjb250ZW50X2VuY29kaW5nKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoaXRlbV90eXBlID09IEZPVVJDQygndScsICdyJywgJ2knLCAnICcpKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IGl0ZW1fdXJpX3R5cGU7Ci0gICAgICAgICAgICBpZiAoIXBhcnNlTnVsbFRlcm1pbmF0ZWRTdHJpbmcoJm9mZnNldCwgJnNpemUsICZpdGVtX3VyaV90eXBlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdHJ1Y3QgSWluZkJveCA6IHB1YmxpYyBGdWxsQm94IHsKLSAgICBJaW5mQm94KGNvbnN0IHNwPERhdGFTb3VyY2U+IHNvdXJjZSwgVmVjdG9yPEl0ZW1JbmZvPiAqaXRlbUluZm9zKSA6Ci0gICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAnaScsICduJywgJ2YnKSksCi0gICAgICAgIG1JdGVtSW5mb3MoaXRlbUluZm9zKSwgbUhhc0dyaWRzKGZhbHNlKSB7fQotCi0gICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKLQotICAgIGJvb2wgaGFzR3JpZHMoKSB7IHJldHVybiBtSGFzR3JpZHM7IH0KLQotcHJvdGVjdGVkOgotICAgIHN0YXR1c190IG9uQ2h1bmtEYXRhKHVpbnQzMl90IHR5cGUsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7Ci0KLXByaXZhdGU6Ci0gICAgVmVjdG9yPEl0ZW1JbmZvPiAqbUl0ZW1JbmZvczsKLSAgICBib29sIG1IYXNHcmlkczsKLX07Ci0KLXN0YXR1c190IElpbmZCb3g6OnBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewotICAgIEFMT0dWKCIlczogb2Zmc2V0ICVsbGQsIHNpemUgJXp1IiwgX19GVU5DVElPTl9fLCAobG9uZyBsb25nKW9mZnNldCwgc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUZ1bGxCb3hIZWFkZXIoJm9mZnNldCwgJnNpemUpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBzaXplX3QgZW50cnlDb3VudFNpemUgPSB2ZXJzaW9uKCkgPT0gMCA/IDIgOiA0OwotICAgIGlmIChzaXplIDwgZW50cnlDb3VudFNpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0gICAgdWludDMyX3QgZW50cnlfY291bnQ7Ci0gICAgaWYgKCFzb3VyY2UoKS0+Z2V0VUludDMyVmFyKG9mZnNldCwgJmVudHJ5X2NvdW50LCBlbnRyeUNvdW50U2l6ZSkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLSAgICBBTE9HVigiZW50cnlfY291bnQgJWQiLCBlbnRyeV9jb3VudCk7Ci0KLSAgICBvZmY2NF90IHN0b3BPZmZzZXQgPSBvZmZzZXQgKyBzaXplOwotICAgIG9mZnNldCArPSBlbnRyeUNvdW50U2l6ZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5X2NvdW50ICYmIG9mZnNldCA8IHN0b3BPZmZzZXQ7IGkrKykgewotICAgICAgICBBTE9HVigiZW50cnkgJXp1IiwgaSk7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsoJm9mZnNldCk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG9mZnNldCAhPSBzdG9wT2Zmc2V0KSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBJaW5mQm94OjpvbkNodW5rRGF0YSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKLSAgICBpZiAodHlwZSAhPSBGT1VSQ0MoJ2knLCAnbicsICdmJywgJ2UnKSkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgSW5mZUJveCBpbmZlQm94KHNvdXJjZSgpKTsKLSAgICBJdGVtSW5mbyBpdGVtSW5mbzsKLSAgICBzdGF0dXNfdCBlcnIgPSBpbmZlQm94LnBhcnNlKG9mZnNldCwgc2l6ZSwgJml0ZW1JbmZvKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIG1JdGVtSW5mb3MtPnB1c2hfYmFjayhpdGVtSW5mbyk7Ci0gICAgbUhhc0dyaWRzIHw9IChpdGVtSW5mby5pdGVtVHlwZSA9PSBGT1VSQ0MoJ2cnLCAncicsICdpJywgJ2QnKSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotSXRlbVRhYmxlOjpJdGVtVGFibGUoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkKLSAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCi0gICAgICBtUHJpbWFyeUl0ZW1JZCgwKSwKLSAgICAgIG1JZGF0T2Zmc2V0KDApLAotICAgICAgbUlkYXRTaXplKDApLAotICAgICAgbUltYWdlSXRlbXNWYWxpZChmYWxzZSksCi0gICAgICBtQ3VycmVudEltYWdlSW5kZXgoMCkgewotICAgIG1SZXF1aXJlZEJveGVzLmluc2VydCgnaXBycCcpOwotICAgIG1SZXF1aXJlZEJveGVzLmluc2VydCgnaWxvYycpOwotICAgIG1SZXF1aXJlZEJveGVzLmluc2VydCgncGl0bScpOwotICAgIG1SZXF1aXJlZEJveGVzLmluc2VydCgnaWluZicpOwotfQotCi1JdGVtVGFibGU6On5JdGVtVGFibGUoKSB7fQotCi1zdGF0dXNfdCBJdGVtVGFibGU6OnBhcnNlKHVpbnQzMl90IHR5cGUsIG9mZjY0X3QgZGF0YV9vZmZzZXQsIHNpemVfdCBjaHVua19kYXRhX3NpemUpIHsKLSAgICBzd2l0Y2godHlwZSkgewotICAgICAgICBjYXNlIEZPVVJDQygnaScsICdsJywgJ28nLCAnYycpOgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyc2VJbG9jQm94KGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ2knLCAnbicsICdmJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJzZUlpbmZCb3goZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAncCcsICdyJywgJ3AnKToKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHBhcnNlSXBycEJveChkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygncCcsICdpJywgJ3QnLCAnbScpOgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyc2VQaXRtQm94KGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ2QnLCAnYScsICd0Jyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJzZUlkYXRCb3goZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAncicsICdlJywgJ2YnKToKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHBhcnNlSXJlZkJveChkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygnaScsICdwJywgJ3InLCAnbycpOgotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVygiaXBybyBib3ggbm90IHN1cHBvcnRlZCEiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dXKCJ1bnJlY29nbml6ZWQgYm94IHR5cGU6IDB4JXgiLCB0eXBlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLX0KLQotc3RhdHVzX3QgSXRlbVRhYmxlOjpwYXJzZUlsb2NCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7Ci0gICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKLQotICAgIElsb2NCb3ggaWxvY0JveChtRGF0YVNvdXJjZSwgJm1JdGVtTG9jcyk7Ci0gICAgc3RhdHVzX3QgZXJyID0gaWxvY0JveC5wYXJzZShvZmZzZXQsIHNpemUpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAoaWxvY0JveC5oYXNDb25zdHJ1Y3RNZXRob2QxKCkpIHsKLSAgICAgICAgbVJlcXVpcmVkQm94ZXMuaW5zZXJ0KCdpZGF0Jyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGJ1aWxkSW1hZ2VJdGVtc0lmUG9zc2libGUoJ2lsb2MnKTsKLX0KLQotc3RhdHVzX3QgSXRlbVRhYmxlOjpwYXJzZUlpbmZCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7Ci0gICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKLQotICAgIElpbmZCb3ggaWluZkJveChtRGF0YVNvdXJjZSwgJm1JdGVtSW5mb3MpOwotICAgIHN0YXR1c190IGVyciA9IGlpbmZCb3gucGFyc2Uob2Zmc2V0LCBzaXplKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKGlpbmZCb3guaGFzR3JpZHMoKSkgewotICAgICAgICBtUmVxdWlyZWRCb3hlcy5pbnNlcnQoJ2lyZWYnKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gYnVpbGRJbWFnZUl0ZW1zSWZQb3NzaWJsZSgnaWluZicpOwotfQotCi1zdGF0dXNfdCBJdGVtVGFibGU6OnBhcnNlUGl0bUJveChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKLSAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOwotCi0gICAgUGl0bUJveCBwaXRtQm94KG1EYXRhU291cmNlKTsKLSAgICBzdGF0dXNfdCBlcnIgPSBwaXRtQm94LnBhcnNlKG9mZnNldCwgc2l6ZSwgJm1QcmltYXJ5SXRlbUlkKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIGJ1aWxkSW1hZ2VJdGVtc0lmUG9zc2libGUoJ3BpdG0nKTsKLX0KLQotc3RhdHVzX3QgSXRlbVRhYmxlOjpwYXJzZUlwcnBCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7Ci0gICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKLQotICAgIElwcnBCb3ggaXBycEJveChtRGF0YVNvdXJjZSwgJm1JdGVtUHJvcGVydGllcywgJm1Bc3NvY2lhdGlvbnMpOwotICAgIHN0YXR1c190IGVyciA9IGlwcnBCb3gucGFyc2Uob2Zmc2V0LCBzaXplKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIGJ1aWxkSW1hZ2VJdGVtc0lmUG9zc2libGUoJ2lwcnAnKTsKLX0KLQotc3RhdHVzX3QgSXRlbVRhYmxlOjpwYXJzZUlkYXRCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7Ci0gICAgQUxPR1YoIiVzOiBpZGF0IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOwotCi0gICAgLy8gb25seSByZW1lbWJlciB0aGUgb2Zmc2V0IGFuZCBzaXplIG9mIGlkYXQgYm94IGZvciBsYXRlciB1c2UKLSAgICBtSWRhdE9mZnNldCA9IG9mZnNldDsKLSAgICBtSWRhdFNpemUgPSBzaXplOwotCi0gICAgcmV0dXJuIGJ1aWxkSW1hZ2VJdGVtc0lmUG9zc2libGUoJ2lkYXQnKTsKLX0KLQotc3RhdHVzX3QgSXRlbVRhYmxlOjpwYXJzZUlyZWZCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7Ci0gICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKLQotICAgIElyZWZCb3ggaXJlZkJveChtRGF0YVNvdXJjZSwgJm1JdGVtUmVmZXJlbmNlcyk7Ci0gICAgc3RhdHVzX3QgZXJyID0gaXJlZkJveC5wYXJzZShvZmZzZXQsIHNpemUpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gYnVpbGRJbWFnZUl0ZW1zSWZQb3NzaWJsZSgnaXJlZicpOwotfQotCi1zdGF0dXNfdCBJdGVtVGFibGU6OmJ1aWxkSW1hZ2VJdGVtc0lmUG9zc2libGUodWludDMyX3QgdHlwZSkgewotICAgIGlmIChtSW1hZ2VJdGVtc1ZhbGlkKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBtQm94ZXNTZWVuLmluc2VydCh0eXBlKTsKLQotICAgIC8vIG5lZWQgYXQgbGVhc3QgJ2lwcnAnLCAnaWxvYycsICdwaXRtJywgJ2lpbmYnOwotICAgIC8vIG5lZWQgJ2lkYXQnIGlmIGFueSBpdGVtcyB1c2VkIGNvbnN0cnVjdGlvbl9tZXRob2Qgb2YgMjsKLSAgICAvLyBuZWVkICdpcmVmJyBpZiB0aGVyZSBhcmUgZ3JpZHMuCi0gICAgaWYgKCFzdGQ6OmluY2x1ZGVzKAotICAgICAgICAgICAgbUJveGVzU2Vlbi5iZWdpbigpLCBtQm94ZXNTZWVuLmVuZCgpLAotICAgICAgICAgICAgbVJlcXVpcmVkQm94ZXMuYmVnaW4oKSwgbVJlcXVpcmVkQm94ZXMuZW5kKCkpKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBBTE9HVigiYnVpbGRpbmcgaW1hZ2UgdGFibGUuLi4iKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUl0ZW1JbmZvcy5zaXplKCk7IGkrKykgewotICAgICAgICBjb25zdCBJdGVtSW5mbyAmaW5mbyA9IG1JdGVtSW5mb3NbaV07Ci0KLQotICAgICAgICAvLyBpZ25vcmUgbm9uLWltYWdlIGl0ZW1zCi0gICAgICAgIGlmIChpbmZvLml0ZW1UeXBlICE9IEZPVVJDQygnZycsICdyJywgJ2knLCAnZCcpICYmCi0gICAgICAgICAgICBpbmZvLml0ZW1UeXBlICE9IEZPVVJDQygnaCcsICd2JywgJ2MnLCAnMScpKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNzaXplX3QgaW1hZ2VJbmRleCA9IG1JdGVtSWRUb0ltYWdlTWFwLmluZGV4T2ZLZXkoaW5mby5pdGVtSWQpOwotICAgICAgICBpZiAoaW1hZ2VJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiaWdub3JpbmcgZHVwbGljYXRlIGltYWdlIGl0ZW0gaWQgJWQiLCBpbmZvLml0ZW1JZCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNzaXplX3QgaWxvY0luZGV4ID0gbUl0ZW1Mb2NzLmluZGV4T2ZLZXkoaW5mby5pdGVtSWQpOwotICAgICAgICBpZiAoaWxvY0luZGV4IDwgMCkgewotICAgICAgICAgICAgQUxPR0UoImlsb2MgbWlzc2luZyBmb3IgaW1hZ2UgaXRlbSBpZCAlZCIsIGluZm8uaXRlbUlkKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IEl0ZW1Mb2MgJmlsb2MgPSBtSXRlbUxvY3NbaWxvY0luZGV4XTsKLQotICAgICAgICBvZmY2NF90IG9mZnNldDsKLSAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgIGlmIChpbG9jLmdldExvYygmb2Zmc2V0LCAmc2l6ZSwgbUlkYXRPZmZzZXQsIG1JZGF0U2l6ZSkgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBJbWFnZUl0ZW0gaW1hZ2UoaW5mby5pdGVtVHlwZSk7Ci0KLSAgICAgICAgQUxPR1YoImFkZGluZyAlczogaXRlbUlkICVkIiwgaW1hZ2UuaXNHcmlkKCkgPyAiZ3JpZCIgOiAiaW1hZ2UiLCBpbmZvLml0ZW1JZCk7Ci0KLSAgICAgICAgaWYgKGltYWdlLmlzR3JpZCgpKSB7Ci0gICAgICAgICAgICAvLyBJbWFnZUdyaWQgc3RydWN0IGlzIGF0IGxlYXN0IDgtYnl0ZSwgYXQgbW9zdCAxMi1ieXRlIChpZiBmbGFncyYxKQotICAgICAgICAgICAgaWYgKHNpemUgPCA4IHx8IHNpemUgPiAxMikgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1aW50OF90IGJ1ZlsxMl07Ci0gICAgICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWYsIHNpemUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbWFnZS5yb3dzID0gYnVmWzJdICsgMTsKLSAgICAgICAgICAgIGltYWdlLmNvbHVtbnMgPSBidWZbM10gKyAxOwotCi0gICAgICAgICAgICBBTE9HVigicm93cyAlZCwgY29sdW1hbnMgJWQiLCBpbWFnZS5yb3dzLCBpbWFnZS5jb2x1bW5zKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGltYWdlLm9mZnNldCA9IG9mZnNldDsKLSAgICAgICAgICAgIGltYWdlLnNpemUgPSBzaXplOwotICAgICAgICB9Ci0gICAgICAgIG1JdGVtSWRUb0ltYWdlTWFwLmFkZChpbmZvLml0ZW1JZCwgaW1hZ2UpOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUFzc29jaWF0aW9ucy5zaXplKCk7IGkrKykgewotICAgICAgICBhdHRhY2hQcm9wZXJ0eShtQXNzb2NpYXRpb25zW2ldKTsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JdGVtUmVmZXJlbmNlcy5zaXplKCk7IGkrKykgewotICAgICAgICBtSXRlbVJlZmVyZW5jZXNbaV0tPmFwcGx5KG1JdGVtSWRUb0ltYWdlTWFwKTsKLSAgICB9Ci0KLSAgICBtSW1hZ2VJdGVtc1ZhbGlkID0gdHJ1ZTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgSXRlbVRhYmxlOjphdHRhY2hQcm9wZXJ0eShjb25zdCBBc3NvY2lhdGlvbkVudHJ5ICZhc3NvY2lhdGlvbikgewotICAgIHNzaXplX3QgaW1hZ2VJbmRleCA9IG1JdGVtSWRUb0ltYWdlTWFwLmluZGV4T2ZLZXkoYXNzb2NpYXRpb24uaXRlbUlkKTsKLQotICAgIC8vIGlnbm9yZSBub24taW1hZ2UgaXRlbXMKLSAgICBpZiAoaW1hZ2VJbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHVpbnQxNl90IHByb3BlcnR5SW5kZXggPSBhc3NvY2lhdGlvbi5pbmRleDsKLSAgICBpZiAocHJvcGVydHlJbmRleCA+PSBtSXRlbVByb3BlcnRpZXMuc2l6ZSgpKSB7Ci0gICAgICAgIEFMT0dXKCJJZ25vcmluZyBpbnZhbGlkIHByb3BlcnR5IGluZGV4ICVkIiwgcHJvcGVydHlJbmRleCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBTE9HVigiYXR0YWNoIHByb3BlcnR5ICVkIHRvIGl0ZW0gaWQgJWQpIiwKLSAgICAgICAgICAgIHByb3BlcnR5SW5kZXgsIGFzc29jaWF0aW9uLml0ZW1JZCk7Ci0KLSAgICBtSXRlbVByb3BlcnRpZXNbcHJvcGVydHlJbmRleF0tPmF0dGFjaFRvKAotICAgICAgICAgICAgbUl0ZW1JZFRvSW1hZ2VNYXAuZWRpdFZhbHVlQXQoaW1hZ2VJbmRleCkpOwotfQotCi1zcDxNZXRhRGF0YT4gSXRlbVRhYmxlOjpnZXRJbWFnZU1ldGEoKSB7Ci0gICAgaWYgKCFtSW1hZ2VJdGVtc1ZhbGlkKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHNzaXplX3QgaW1hZ2VJbmRleCA9IG1JdGVtSWRUb0ltYWdlTWFwLmluZGV4T2ZLZXkobVByaW1hcnlJdGVtSWQpOwotICAgIGlmIChpbWFnZUluZGV4IDwgMCkgewotICAgICAgICBBTE9HRSgiUHJpbWFyeSBpdGVtIGlkICVkIG5vdCBmb3VuZCEiLCBtUHJpbWFyeUl0ZW1JZCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIEFMT0dWKCJwcmltYXJ5IGltYWdlIGluZGV4ICV6dSIsIGltYWdlSW5kZXgpOwotCi0gICAgY29uc3QgSW1hZ2VJdGVtICppbWFnZSA9ICZtSXRlbUlkVG9JbWFnZU1hcFtpbWFnZUluZGV4XTsKLQotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKTsKLQotICAgIEFMT0dWKCJzZXR0aW5nIGltYWdlIHNpemUgJWR4JWQiLCBpbWFnZS0+d2lkdGgsIGltYWdlLT5oZWlnaHQpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgaW1hZ2UtPndpZHRoKTsKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBpbWFnZS0+aGVpZ2h0KTsKLSAgICBpZiAoaW1hZ2UtPnJvdGF0aW9uICE9IDApIHsKLSAgICAgICAgLy8gUm90YXRpb24gYW5nbGUgaW4gSEVJRiBpcyBDQ1csIGNvbnZlcnQgdG8gQ1cgaGVyZSB0byBiZQotICAgICAgICAvLyBjb25zaXN0ZW50IHdpdGggdGhlIG90aGVyIG1lZGlhIGZvcm1hdHMuCi0gICAgICAgIHN3aXRjaChpbWFnZS0+cm90YXRpb24pIHsKLSAgICAgICAgICAgIGNhc2UgOTA6IG1ldGEtPnNldEludDMyKGtLZXlSb3RhdGlvbiwgMjcwKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE4MDogbWV0YS0+c2V0SW50MzIoa0tleVJvdGF0aW9uLCAxODApOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjcwOiBtZXRhLT5zZXRJbnQzMihrS2V5Um90YXRpb24sIDkwKTsgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OiBicmVhazsgLy8gZG9uJ3Qgc2V0IGlmIGludmFsaWQKLSAgICAgICAgfQotICAgIH0KLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBpbWFnZS0+d2lkdGggKiBpbWFnZS0+aGVpZ2h0ICogMS41KTsKLQotICAgIGlmICghaW1hZ2UtPnRodW1ibmFpbHMuZW1wdHkoKSkgewotICAgICAgICBzc2l6ZV90IHRodW1ibmFpbEluZGV4ID0gbUl0ZW1JZFRvSW1hZ2VNYXAuaW5kZXhPZktleShpbWFnZS0+dGh1bWJuYWlsc1swXSk7Ci0gICAgICAgIGlmICh0aHVtYm5haWxJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBjb25zdCBJbWFnZUl0ZW0gJnRodW1ibmFpbCA9IG1JdGVtSWRUb0ltYWdlTWFwW3RodW1ibmFpbEluZGV4XTsKLQotICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRodW1ibmFpbFdpZHRoLCB0aHVtYm5haWwud2lkdGgpOwotICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRodW1ibmFpbEhlaWdodCwgdGh1bWJuYWlsLmhlaWdodCk7Ci0gICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlUaHVtYm5haWxIVkNDLCBrVHlwZUhWQ0MsCi0gICAgICAgICAgICAgICAgICAgIHRodW1ibmFpbC5odmNjLT5kYXRhKCksIHRodW1ibmFpbC5odmNjLT5zaXplKCkpOwotICAgICAgICAgICAgQUxPR1YoInRodW1ibmFpbCBtZXRhOiAlZHglZCwgaW5kZXggJXpkIiwKLSAgICAgICAgICAgICAgICAgICAgdGh1bWJuYWlsLndpZHRoLCB0aHVtYm5haWwuaGVpZ2h0LCB0aHVtYm5haWxJbmRleCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygiUmVmZXJlbmNlZCB0aHVtYm5haWwgZG9lcyBub3QgZXhpc3QhIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaW1hZ2UtPmlzR3JpZCgpKSB7Ci0gICAgICAgIHNzaXplX3QgdGlsZUluZGV4ID0gbUl0ZW1JZFRvSW1hZ2VNYXAuaW5kZXhPZktleShpbWFnZS0+ZGltZ1JlZnNbMF0pOwotICAgICAgICBpZiAodGlsZUluZGV4IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUdyaWRSb3dzLCBpbWFnZS0+cm93cyk7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlHcmlkQ29scywgaW1hZ2UtPmNvbHVtbnMpOwotCi0gICAgICAgIC8vIHBvaW50IGltYWdlIHRvIHRoZSBmaXJzdCB0aWxlIGZvciBncmlkIHNpemUgYW5kIEhWQ0MKLSAgICAgICAgaW1hZ2UgPSAmbUl0ZW1JZFRvSW1hZ2VNYXAuZWRpdFZhbHVlQXQodGlsZUluZGV4KTsKLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUdyaWRXaWR0aCwgaW1hZ2UtPndpZHRoKTsKLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUdyaWRIZWlnaHQsIGltYWdlLT5oZWlnaHQpOwotICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBpbWFnZS0+d2lkdGggKiBpbWFnZS0+aGVpZ2h0ICogMS41KTsKLSAgICB9Ci0KLSAgICBpZiAoaW1hZ2UtPmh2Y2MgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiaHZjYyBpcyBtaXNzaW5nISIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgbWV0YS0+c2V0RGF0YShrS2V5SFZDQywga1R5cGVIVkNDLCBpbWFnZS0+aHZjYy0+ZGF0YSgpLCBpbWFnZS0+aHZjYy0+c2l6ZSgpKTsKLQotICAgIGlmIChpbWFnZS0+aWNjICE9IE5VTEwpIHsKLSAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5SWNjUHJvZmlsZSwgMCwgaW1hZ2UtPmljYy0+ZGF0YSgpLCBpbWFnZS0+aWNjLT5zaXplKCkpOwotICAgIH0KLSAgICByZXR1cm4gbWV0YTsKLX0KLQotdWludDMyX3QgSXRlbVRhYmxlOjpjb3VudEltYWdlcygpIGNvbnN0IHsKLSAgICByZXR1cm4gbUltYWdlSXRlbXNWYWxpZCA/IG1JdGVtSWRUb0ltYWdlTWFwLnNpemUoKSA6IDA7Ci19Ci0KLXN0YXR1c190IEl0ZW1UYWJsZTo6ZmluZFByaW1hcnlJbWFnZSh1aW50MzJfdCAqaW1hZ2VJbmRleCkgewotICAgIGlmICghbUltYWdlSXRlbXNWYWxpZCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgc3NpemVfdCBpbmRleCA9IG1JdGVtSWRUb0ltYWdlTWFwLmluZGV4T2ZLZXkobVByaW1hcnlJdGVtSWQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICAqaW1hZ2VJbmRleCA9IGluZGV4OwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgSXRlbVRhYmxlOjpmaW5kVGh1bWJuYWlsKHVpbnQzMl90ICppbWFnZUluZGV4KSB7Ci0gICAgaWYgKCFtSW1hZ2VJdGVtc1ZhbGlkKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBzc2l6ZV90IHByaW1hcnlJbmRleCA9IG1JdGVtSWRUb0ltYWdlTWFwLmluZGV4T2ZLZXkobVByaW1hcnlJdGVtSWQpOwotICAgIGlmIChwcmltYXJ5SW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dFKCJQcmltYXJ5IGl0ZW0gaWQgJWQgbm90IGZvdW5kISIsIG1QcmltYXJ5SXRlbUlkKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBjb25zdCBJbWFnZUl0ZW0gJnByaW1hcnlJbWFnZSA9IG1JdGVtSWRUb0ltYWdlTWFwW3ByaW1hcnlJbmRleF07Ci0gICAgaWYgKHByaW1hcnlJbWFnZS50aHVtYm5haWxzLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR1coIlVzaW5nIHByaW1hcnkgaW4gcGxhY2Ugb2YgdGh1bWJuYWlsLiIpOwotICAgICAgICAqaW1hZ2VJbmRleCA9IHByaW1hcnlJbmRleDsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHNzaXplX3QgdGh1bWJuYWlsSW5kZXggPSBtSXRlbUlkVG9JbWFnZU1hcC5pbmRleE9mS2V5KAotICAgICAgICAgICAgcHJpbWFyeUltYWdlLnRodW1ibmFpbHNbMF0pOwotICAgIGlmICh0aHVtYm5haWxJbmRleCA8IDApIHsKLSAgICAgICAgQUxPR0UoIlRodW1ibmFpbCBpdGVtIGlkICVkIG5vdCBmb3VuZCEiLCBwcmltYXJ5SW1hZ2UudGh1bWJuYWlsc1swXSk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgKmltYWdlSW5kZXggPSB0aHVtYm5haWxJbmRleDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEl0ZW1UYWJsZTo6Z2V0SW1hZ2VPZmZzZXRBbmRTaXplKAotICAgICAgICB1aW50MzJfdCAqaW1hZ2VJbmRleCwgb2ZmNjRfdCAqb2Zmc2V0LCBzaXplX3QgKnNpemUpIHsKLSAgICBpZiAoIW1JbWFnZUl0ZW1zVmFsaWQpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIGlmIChpbWFnZUluZGV4ICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCppbWFnZUluZGV4ID49IG1JdGVtSWRUb0ltYWdlTWFwLnNpemUoKSkgewotICAgICAgICAgICAgQUxPR0UoIkJhZCBpbWFnZSBpbmRleCEiKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRJbWFnZUluZGV4ID0gKmltYWdlSW5kZXg7Ci0gICAgfQotCi0gICAgSW1hZ2VJdGVtICZpbWFnZSA9IG1JdGVtSWRUb0ltYWdlTWFwLmVkaXRWYWx1ZUF0KG1DdXJyZW50SW1hZ2VJbmRleCk7Ci0gICAgaWYgKGltYWdlLmlzR3JpZCgpKSB7Ci0gICAgICAgIHVpbnQzMl90IHRpbGVJdGVtSWQ7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IGltYWdlLmdldE5leHRUaWxlSXRlbUlkKCZ0aWxlSXRlbUlkLCBpbWFnZUluZGV4ICE9IE5VTEwpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHNzaXplX3QgdGlsZUltYWdlSW5kZXggPSBtSXRlbUlkVG9JbWFnZU1hcC5pbmRleE9mS2V5KHRpbGVJdGVtSWQpOwotICAgICAgICBpZiAodGlsZUltYWdlSW5kZXggPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgfQotICAgICAgICAqb2Zmc2V0ID0gbUl0ZW1JZFRvSW1hZ2VNYXBbdGlsZUltYWdlSW5kZXhdLm9mZnNldDsKLSAgICAgICAgKnNpemUgPSBtSXRlbUlkVG9JbWFnZU1hcFt0aWxlSW1hZ2VJbmRleF0uc2l6ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoaW1hZ2VJbmRleCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAvLyBGb3Igc2luZ2xlIGltYWdlcywgd2Ugb25seSBhbGxvdyBpdCB0byBiZSByZWFkIG9uY2UsIGFmdGVyIHRoYXQKLSAgICAgICAgICAgIC8vIGl0J3MgRU9TLiAgTmV3IGltYWdlIGluZGV4IG11c3QgYmUgcmVxdWVzdGVkIGVhY2ggdGltZS4KLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgICAgICB9Ci0gICAgICAgICpvZmZzZXQgPSBtSXRlbUlkVG9JbWFnZU1hcFttQ3VycmVudEltYWdlSW5kZXhdLm9mZnNldDsKLSAgICAgICAgKnNpemUgPSBtSXRlbUlkVG9JbWFnZU1hcFttQ3VycmVudEltYWdlSW5kZXhdLnNpemU7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi19IC8vIG5hbWVzcGFjZSBoZWlmCi0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9KUEVHU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0pQRUdTb3VyY2UuY3BwCmluZGV4IGJhZmE0YjIuLjEwZWIyZDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0pQRUdTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0pQRUdTb3VyY2UuY3BwCkBAIC0xOCw5ICsxOCwxMCBAQAogI2RlZmluZSBMT0dfVEFHICJKUEVHU291cmNlIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0pQRUdTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgpAQCAtMTA4LDcgKzEwOSw3IEBACiB9CiAKIHN0YXR1c190IEpQRUdTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgKm91dCA9IE5VTEw7CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CkBAIC0xMTcsNyArMTE4LDcgQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCi0gICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKICAgICBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOwogCiAgICAgc3NpemVfdCBuID0gbVNvdXJjZS0+cmVhZEF0KG1PZmZzZXQsIGJ1ZmZlci0+ZGF0YSgpLCBtU2l6ZSAtIG1PZmZzZXQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVAzRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QM0V4dHJhY3Rvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZGY1MjIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVAzRXh0cmFjdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJNUDNFeHRyYWN0b3IiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL01QM0V4dHJhY3Rvci5oIgotCi0jaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKLSNpbmNsdWRlICJpbmNsdWRlL0lEMy5oIgotI2luY2x1ZGUgImluY2x1ZGUvVkJSSVNlZWtlci5oIgotI2luY2x1ZGUgImluY2x1ZGUvWElOR1NlZWtlci5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIEV2ZXJ5dGhpbmcgbXVzdCBtYXRjaCBleGNlcHQgZm9yCi0vLyBwcm90ZWN0aW9uLCBiaXRyYXRlLCBwYWRkaW5nLCBwcml2YXRlIGJpdHMsIG1vZGUsIG1vZGUgZXh0ZW5zaW9uLAotLy8gY29weXJpZ2h0IGJpdCwgb3JpZ2luYWwgYml0IGFuZCBlbXBoYXNpcy4KLS8vIFllcyAuLi4gdGhlcmUgYXJlIHRoaW5ncyB0aGF0IG11c3QgaW5kZWVkIG1hdGNoLi4uCi1zdGF0aWMgY29uc3QgdWludDMyX3Qga01hc2sgPSAweGZmZmUwYzAwOwotCi1zdGF0aWMgYm9vbCBSZXN5bmMoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIHVpbnQzMl90IG1hdGNoX2hlYWRlciwKLSAgICAgICAgb2ZmNjRfdCAqaW5vdXRfcG9zLCBvZmY2NF90ICpwb3N0X2lkM19wb3MsIHVpbnQzMl90ICpvdXRfaGVhZGVyKSB7Ci0gICAgaWYgKHBvc3RfaWQzX3BvcyAhPSBOVUxMKSB7Ci0gICAgICAgICpwb3N0X2lkM19wb3MgPSAwOwotICAgIH0KLQotICAgIGlmICgqaW5vdXRfcG9zID09IDApIHsKLSAgICAgICAgLy8gU2tpcCBhbiBvcHRpb25hbCBJRDMgaGVhZGVyIGlmIHN5bmNpbmcgYXQgdGhlIHZlcnkgYmVnaW5uaW5nCi0gICAgICAgIC8vIG9mIHRoZSBkYXRhc291cmNlLgotCi0gICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgaWQzaGVhZGVyWzEwXTsKLSAgICAgICAgICAgIGlmIChzb3VyY2UtPnJlYWRBdCgqaW5vdXRfcG9zLCBpZDNoZWFkZXIsIHNpemVvZihpZDNoZWFkZXIpKQotICAgICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihpZDNoZWFkZXIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgd2UgY2FuJ3QgZXZlbiByZWFkIHRoZXNlIDEwIGJ5dGVzLCB3ZSBtaWdodCBhcyB3ZWxsIGJhaWwKLSAgICAgICAgICAgICAgICAvLyBvdXQsIGV2ZW4gaWYgdGhlcmUgX3dlcmVfIDEwIGJ5dGVzIG9mIHZhbGlkIG1wMyBhdWRpbyBkYXRhLi4uCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobWVtY21wKCJJRDMiLCBpZDNoZWFkZXIsIDMpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFNraXAgdGhlIElEM3YyIGhlYWRlci4KLQotICAgICAgICAgICAgc2l6ZV90IGxlbiA9Ci0gICAgICAgICAgICAgICAgKChpZDNoZWFkZXJbNl0gJiAweDdmKSA8PCAyMSkKLSAgICAgICAgICAgICAgICB8ICgoaWQzaGVhZGVyWzddICYgMHg3ZikgPDwgMTQpCi0gICAgICAgICAgICAgICAgfCAoKGlkM2hlYWRlcls4XSAmIDB4N2YpIDw8IDcpCi0gICAgICAgICAgICAgICAgfCAoaWQzaGVhZGVyWzldICYgMHg3Zik7Ci0KLSAgICAgICAgICAgIGxlbiArPSAxMDsKLQotICAgICAgICAgICAgKmlub3V0X3BvcyArPSBsZW47Ci0KLSAgICAgICAgICAgIEFMT0dWKCJza2lwcGVkIElEMyB0YWcsIG5ldyBzdGFydGluZyBvZmZzZXQgaXMgJWxsZCAoMHglMDE2bGx4KSIsCi0gICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpKmlub3V0X3BvcywgKGxvbmcgbG9uZykqaW5vdXRfcG9zKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwb3N0X2lkM19wb3MgIT0gTlVMTCkgewotICAgICAgICAgICAgKnBvc3RfaWQzX3BvcyA9ICppbm91dF9wb3M7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBvZmY2NF90IHBvcyA9ICppbm91dF9wb3M7Ci0gICAgYm9vbCB2YWxpZCA9IGZhbHNlOwotCi0gICAgY29uc3Qgc2l6ZV90IGtNYXhSZWFkQnl0ZXMgPSAxMDI0OwotICAgIGNvbnN0IHNpemVfdCBrTWF4Qnl0ZXNDaGVja2VkID0gMTI4ICogMTAyNDsKLSAgICB1aW50OF90IGJ1ZltrTWF4UmVhZEJ5dGVzXTsKLSAgICBzc2l6ZV90IGJ5dGVzVG9SZWFkID0ga01heFJlYWRCeXRlczsKLSAgICBzc2l6ZV90IHRvdGFsQnl0ZXNSZWFkID0gMDsKLSAgICBzc2l6ZV90IHJlbWFpbmluZ0J5dGVzID0gMDsKLSAgICBib29sIHJlYWNoRU9TID0gZmFsc2U7Ci0gICAgdWludDhfdCAqdG1wID0gYnVmOwotCi0gICAgZG8gewotICAgICAgICBpZiAocG9zID49IChvZmY2NF90KSgqaW5vdXRfcG9zICsga01heEJ5dGVzQ2hlY2tlZCkpIHsKLSAgICAgICAgICAgIC8vIERvbid0IHNjYW4gZm9yZXZlci4KLSAgICAgICAgICAgIEFMT0dWKCJnaXZpbmcgdXAgYXQgb2Zmc2V0ICVsbGQiLCAobG9uZyBsb25nKXBvcyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZW1haW5pbmdCeXRlcyA8IDQpIHsKLSAgICAgICAgICAgIGlmIChyZWFjaEVPUykgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoYnVmLCB0bXAsIHJlbWFpbmluZ0J5dGVzKTsKLSAgICAgICAgICAgICAgICBieXRlc1RvUmVhZCA9IGtNYXhSZWFkQnl0ZXMgLSByZW1haW5pbmdCeXRlczsKLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogVGhlIG5leHQgcmVhZCBwb3NpdGlvbiBzaG91bGQgc3RhcnQgZnJvbSB0aGUgZW5kIG9mCi0gICAgICAgICAgICAgICAgICogdGhlIGxhc3QgYnVmZmVyLCBhbmQgdGh1cyBzaG91bGQgaW5jbHVkZSB0aGUgcmVtYWluaW5nCi0gICAgICAgICAgICAgICAgICogYnl0ZXMgaW4gdGhlIGJ1ZmZlci4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzUmVhZCA9IHNvdXJjZS0+cmVhZEF0KHBvcyArIHJlbWFpbmluZ0J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmICsgcmVtYWluaW5nQnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1RvUmVhZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRvdGFsQnl0ZXNSZWFkIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlYWNoRU9TID0gKHRvdGFsQnl0ZXNSZWFkICE9IGJ5dGVzVG9SZWFkKTsKLSAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzUmVhZCArPSByZW1haW5pbmdCeXRlczsKLSAgICAgICAgICAgICAgICByZW1haW5pbmdCeXRlcyA9IHRvdGFsQnl0ZXNSZWFkOwotICAgICAgICAgICAgICAgIHRtcCA9IGJ1ZjsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHVpbnQzMl90IGhlYWRlciA9IFUzMl9BVCh0bXApOwotCi0gICAgICAgIGlmIChtYXRjaF9oZWFkZXIgIT0gMCAmJiAoaGVhZGVyICYga01hc2spICE9IChtYXRjaF9oZWFkZXIgJiBrTWFzaykpIHsKLSAgICAgICAgICAgICsrcG9zOwotICAgICAgICAgICAgKyt0bXA7Ci0gICAgICAgICAgICAtLXJlbWFpbmluZ0J5dGVzOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgZnJhbWVfc2l6ZTsKLSAgICAgICAgaW50IHNhbXBsZV9yYXRlLCBudW1fY2hhbm5lbHMsIGJpdHJhdGU7Ci0gICAgICAgIGlmICghR2V0TVBFR0F1ZGlvRnJhbWVTaXplKAotICAgICAgICAgICAgICAgICAgICBoZWFkZXIsICZmcmFtZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAmc2FtcGxlX3JhdGUsICZudW1fY2hhbm5lbHMsICZiaXRyYXRlKSkgewotICAgICAgICAgICAgKytwb3M7Ci0gICAgICAgICAgICArK3RtcDsKLSAgICAgICAgICAgIC0tcmVtYWluaW5nQnl0ZXM7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIEFMT0dWKCJmb3VuZCBwb3NzaWJsZSAxc3QgZnJhbWUgYXQgJWxsZCAoaGVhZGVyID0gMHglMDh4KSIsIChsb25nIGxvbmcpcG9zLCBoZWFkZXIpOwotCi0gICAgICAgIC8vIFdlIGZvdW5kIHdoYXQgbG9va3MgbGlrZSBhIHZhbGlkIGZyYW1lLAotICAgICAgICAvLyBub3cgZmluZCBpdHMgc3VjY2Vzc29ycy4KLQotICAgICAgICBvZmY2NF90IHRlc3RfcG9zID0gcG9zICsgZnJhbWVfc2l6ZTsKLQotICAgICAgICB2YWxpZCA9IHRydWU7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzsgKytqKSB7Ci0gICAgICAgICAgICB1aW50OF90IHRtcFs0XTsKLSAgICAgICAgICAgIGlmIChzb3VyY2UtPnJlYWRBdCh0ZXN0X3BvcywgdG1wLCA0KSA8IDQpIHsKLSAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1aW50MzJfdCB0ZXN0X2hlYWRlciA9IFUzMl9BVCh0bXApOwotCi0gICAgICAgICAgICBBTE9HVigic3Vic2VxdWVudCBoZWFkZXIgaXMgJTA4eCIsIHRlc3RfaGVhZGVyKTsKLQotICAgICAgICAgICAgaWYgKCh0ZXN0X2hlYWRlciAmIGtNYXNrKSAhPSAoaGVhZGVyICYga01hc2spKSB7Ci0gICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2l6ZV90IHRlc3RfZnJhbWVfc2l6ZTsKLSAgICAgICAgICAgIGlmICghR2V0TVBFR0F1ZGlvRnJhbWVTaXplKAotICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9oZWFkZXIsICZ0ZXN0X2ZyYW1lX3NpemUpKSB7Ci0gICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQUxPR1YoImZvdW5kIHN1YnNlcXVlbnQgZnJhbWUgIyVkIGF0ICVsbGQiLCBqICsgMiwgKGxvbmcgbG9uZyl0ZXN0X3Bvcyk7Ci0KLSAgICAgICAgICAgIHRlc3RfcG9zICs9IHRlc3RfZnJhbWVfc2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2YWxpZCkgewotICAgICAgICAgICAgKmlub3V0X3BvcyA9IHBvczsKLQotICAgICAgICAgICAgaWYgKG91dF9oZWFkZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICpvdXRfaGVhZGVyID0gaGVhZGVyOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1YoIm5vIGRpY2UsIG5vIHZhbGlkIHNlcXVlbmNlIG9mIGZyYW1lcyBmb3VuZC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgICsrcG9zOwotICAgICAgICArK3RtcDsKLSAgICAgICAgLS1yZW1haW5pbmdCeXRlczsKLSAgICB9IHdoaWxlICghdmFsaWQpOwotCi0gICAgcmV0dXJuIHZhbGlkOwotfQotCi1jbGFzcyBNUDNTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewotcHVibGljOgotICAgIE1QM1NvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSwgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwKLSAgICAgICAgICAgIG9mZjY0X3QgZmlyc3RfZnJhbWVfcG9zLCB1aW50MzJfdCBmaXhlZF9oZWFkZXIsCi0gICAgICAgICAgICBjb25zdCBzcDxNUDNTZWVrZXI+ICZzZWVrZXIpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0KLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+TVAzU291cmNlKCk7Ci0KLXByaXZhdGU6Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4RnJhbWVTaXplOwotICAgIHNwPE1ldGFEYXRhPiBtTWV0YTsKLSAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKLSAgICBvZmY2NF90IG1GaXJzdEZyYW1lUG9zOwotICAgIHVpbnQzMl90IG1GaXhlZEhlYWRlcjsKLSAgICBvZmY2NF90IG1DdXJyZW50UG9zOwotICAgIGludDY0X3QgbUN1cnJlbnRUaW1lVXM7Ci0gICAgYm9vbCBtU3RhcnRlZDsKLSAgICBzcDxNUDNTZWVrZXI+IG1TZWVrZXI7Ci0gICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOwotCi0gICAgaW50NjRfdCBtQmFzaXNUaW1lVXM7Ci0gICAgaW50NjRfdCBtU2FtcGxlc1JlYWQ7Ci0KLSAgICBNUDNTb3VyY2UoY29uc3QgTVAzU291cmNlICYpOwotICAgIE1QM1NvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IE1QM1NvdXJjZSAmKTsKLX07Ci0KLU1QM0V4dHJhY3Rvcjo6TVAzRXh0cmFjdG9yKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBjb25zdCBzcDxBTWVzc2FnZT4gJm1ldGEpCi0gICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpLAotICAgICAgbURhdGFTb3VyY2Uoc291cmNlKSwKLSAgICAgIG1GaXJzdEZyYW1lUG9zKC0xKSwKLSAgICAgIG1GaXhlZEhlYWRlcigwKSB7Ci0KLSAgICBvZmY2NF90IHBvcyA9IDA7Ci0gICAgb2ZmNjRfdCBwb3N0X2lkM19wb3M7Ci0gICAgdWludDMyX3QgaGVhZGVyOwotICAgIGJvb2wgc3VjY2VzczsKLQotICAgIGludDY0X3QgbWV0YV9vZmZzZXQ7Ci0gICAgdWludDMyX3QgbWV0YV9oZWFkZXI7Ci0gICAgaW50NjRfdCBtZXRhX3Bvc3RfaWQzX29mZnNldDsKLSAgICBpZiAobWV0YSAhPSBOVUxMCi0gICAgICAgICAgICAmJiBtZXRhLT5maW5kSW50NjQoIm9mZnNldCIsICZtZXRhX29mZnNldCkKLSAgICAgICAgICAgICYmIG1ldGEtPmZpbmRJbnQzMigiaGVhZGVyIiwgKGludDMyX3QgKikmbWV0YV9oZWFkZXIpCi0gICAgICAgICAgICAmJiBtZXRhLT5maW5kSW50NjQoInBvc3QtaWQzLW9mZnNldCIsICZtZXRhX3Bvc3RfaWQzX29mZnNldCkpIHsKLSAgICAgICAgLy8gVGhlIHNuaWZmZXIgaGFzIGFscmVhZHkgZG9uZSBhbGwgdGhlIGhhcmQgd29yayBmb3IgdXMsIHNpbXBseQotICAgICAgICAvLyBhY2NlcHQgaXRzIGp1ZGdlbWVudC4KLSAgICAgICAgcG9zID0gKG9mZjY0X3QpbWV0YV9vZmZzZXQ7Ci0gICAgICAgIGhlYWRlciA9IG1ldGFfaGVhZGVyOwotICAgICAgICBwb3N0X2lkM19wb3MgPSAob2ZmNjRfdCltZXRhX3Bvc3RfaWQzX29mZnNldDsKLQotICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBzdWNjZXNzID0gUmVzeW5jKG1EYXRhU291cmNlLCAwLCAmcG9zLCAmcG9zdF9pZDNfcG9zLCAmaGVhZGVyKTsKLSAgICB9Ci0KLSAgICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICAgICAgLy8gbUluaXRDaGVjayB3aWxsIHJlbWFpbiBOT19JTklUCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtRmlyc3RGcmFtZVBvcyA9IHBvczsKLSAgICBtRml4ZWRIZWFkZXIgPSBoZWFkZXI7Ci0gICAgbU1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgc3A8WElOR1NlZWtlcj4gc2Vla2VyID0gWElOR1NlZWtlcjo6Q3JlYXRlRnJvbVNvdXJjZShtRGF0YVNvdXJjZSwgbUZpcnN0RnJhbWVQb3MpOwotCi0gICAgaWYgKHNlZWtlciA9PSBOVUxMKSB7Ci0gICAgICAgIG1TZWVrZXIgPSBWQlJJU2Vla2VyOjpDcmVhdGVGcm9tU291cmNlKG1EYXRhU291cmNlLCBwb3N0X2lkM19wb3MpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1TZWVrZXIgPSBzZWVrZXI7Ci0gICAgICAgIGludCBlbmNkID0gc2Vla2VyLT5nZXRFbmNvZGVyRGVsYXkoKTsKLSAgICAgICAgaW50IGVuY3AgPSBzZWVrZXItPmdldEVuY29kZXJQYWRkaW5nKCk7Ci0gICAgICAgIGlmIChlbmNkICE9IDAgfHwgZW5jcCAhPSAwKSB7Ci0gICAgICAgICAgICBtTWV0YS0+c2V0SW50MzIoa0tleUVuY29kZXJEZWxheSwgZW5jZCk7Ci0gICAgICAgICAgICBtTWV0YS0+c2V0SW50MzIoa0tleUVuY29kZXJQYWRkaW5nLCBlbmNwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChtU2Vla2VyICE9IE5VTEwpIHsKLSAgICAgICAgLy8gV2hpbGUgaXQgaXMgc2FmZSB0byBzZW5kIHRoZSBYSU5HL1ZCUkkgZnJhbWUgdG8gdGhlIGRlY29kZXIsIHRoaXMgd2lsbAotICAgICAgICAvLyByZXN1bHQgaW4gYW4gZXh0cmEgMTE1MiBzYW1wbGVzIGJlaW5nIG91dHB1dC4gSW4gYWRkaXRpb24sIHRoZSBiaXRyYXRlCi0gICAgICAgIC8vIG9mIHRoZSBYaW5nIGhlYWRlciBtaWdodCBub3QgbWF0Y2ggdGhlIHJlc3Qgb2YgdGhlIGZpbGUsIHdoaWNoIGNvdWxkCi0gICAgICAgIC8vIGxlYWQgdG8gcHJvYmxlbXMgd2hlbiBzZWVraW5nLiBUaGUgcmVhbCBmaXJzdCBmcmFtZSB0byBkZWNvZGUgaXMgYWZ0ZXIKLSAgICAgICAgLy8gdGhlIFhJTkcvVkJSSSBmcmFtZSwgc28gc2tpcCB0aGVyZS4KLSAgICAgICAgc2l6ZV90IGZyYW1lX3NpemU7Ci0gICAgICAgIGludCBzYW1wbGVfcmF0ZTsKLSAgICAgICAgaW50IG51bV9jaGFubmVsczsKLSAgICAgICAgaW50IGJpdHJhdGU7Ci0gICAgICAgIEdldE1QRUdBdWRpb0ZyYW1lU2l6ZSgKLSAgICAgICAgICAgICAgICBoZWFkZXIsICZmcmFtZV9zaXplLCAmc2FtcGxlX3JhdGUsICZudW1fY2hhbm5lbHMsICZiaXRyYXRlKTsKLSAgICAgICAgcG9zICs9IGZyYW1lX3NpemU7Ci0gICAgICAgIGlmICghUmVzeW5jKG1EYXRhU291cmNlLCAwLCAmcG9zLCAmcG9zdF9pZDNfcG9zLCAmaGVhZGVyKSkgewotICAgICAgICAgICAgLy8gbUluaXRDaGVjayB3aWxsIHJlbWFpbiBOT19JTklUCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUZpcnN0RnJhbWVQb3MgPSBwb3M7Ci0gICAgICAgIG1GaXhlZEhlYWRlciA9IGhlYWRlcjsKLSAgICB9Ci0KLSAgICBzaXplX3QgZnJhbWVfc2l6ZTsKLSAgICBpbnQgc2FtcGxlX3JhdGU7Ci0gICAgaW50IG51bV9jaGFubmVsczsKLSAgICBpbnQgYml0cmF0ZTsKLSAgICBHZXRNUEVHQXVkaW9GcmFtZVNpemUoCi0gICAgICAgICAgICBoZWFkZXIsICZmcmFtZV9zaXplLCAmc2FtcGxlX3JhdGUsICZudW1fY2hhbm5lbHMsICZiaXRyYXRlKTsKLQotICAgIHVuc2lnbmVkIGxheWVyID0gNCAtICgoaGVhZGVyID4+IDE3KSAmIDMpOwotCi0gICAgc3dpdGNoIChsYXllcikgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBtTWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUdfTEFZRVJfSSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgbU1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0lJKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICBtTWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBUUkVTUEFTUygpOwotICAgIH0KLQotICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlX3JhdGUpOwotICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgYml0cmF0ZSAqIDEwMDApOwotICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBudW1fY2hhbm5lbHMpOwotCi0gICAgaW50NjRfdCBkdXJhdGlvblVzOwotCi0gICAgaWYgKG1TZWVrZXIgPT0gTlVMTCB8fCAhbVNlZWtlci0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpKSB7Ci0gICAgICAgIG9mZjY0X3QgZmlsZVNpemU7Ci0gICAgICAgIGlmIChtRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmZmlsZVNpemUpID09IE9LKSB7Ci0gICAgICAgICAgICBvZmY2NF90IGRhdGFMZW5ndGggPSBmaWxlU2l6ZSAtIG1GaXJzdEZyYW1lUG9zOwotICAgICAgICAgICAgaWYgKGRhdGFMZW5ndGggPiBJTlQ2NF9NQVggLyA4MDAwTEwpIHsKLSAgICAgICAgICAgICAgICAvLyBkdXJhdGlvbiB3b3VsZCBvdmVyZmxvdwotICAgICAgICAgICAgICAgIGR1cmF0aW9uVXMgPSBJTlQ2NF9NQVg7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGR1cmF0aW9uVXMgPSA4MDAwTEwgKiBkYXRhTGVuZ3RoIC8gYml0cmF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGR1cmF0aW9uVXMgPSAtMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChkdXJhdGlvblVzID49IDApIHsKLSAgICAgICAgbU1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7Ci0gICAgfQotCi0gICAgbUluaXRDaGVjayA9IE9LOwotCi0gICAgLy8gR2V0IGlUdW5lcy1zdHlsZSBnYXBsZXNzIGluZm8gaWYgcHJlc2VudC4KLSAgICAvLyBXaGVuIGdldHRpbmcgdGhlIGlkMyB0YWcsIHNraXAgdGhlIFYxIHRhZ3MgdG8gcHJldmVudCB0aGUgc291cmNlIGNhY2hlCi0gICAgLy8gZnJvbSBiZWluZyBpdGVyYXRlZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLgotICAgIElEMyBpZDMobURhdGFTb3VyY2UsIHRydWUpOwotICAgIGlmIChpZDMuaXNWYWxpZCgpKSB7Ci0gICAgICAgIElEMzo6SXRlcmF0b3IgKmNvbSA9IG5ldyBJRDM6Okl0ZXJhdG9yKGlkMywgIkNPTSIpOwotICAgICAgICBpZiAoY29tLT5kb25lKCkpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBjb207Ci0gICAgICAgICAgICBjb20gPSBuZXcgSUQzOjpJdGVyYXRvcihpZDMsICJDT01NIik7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUoIWNvbS0+ZG9uZSgpKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IGNvbW1lbnRkZXNjOwotICAgICAgICAgICAgU3RyaW5nOCBjb21tZW50dmFsdWU7Ci0gICAgICAgICAgICBjb20tPmdldFN0cmluZygmY29tbWVudGRlc2MsICZjb21tZW50dmFsdWUpOwotICAgICAgICAgICAgY29uc3QgY2hhciAqIGRlc2MgPSBjb21tZW50ZGVzYy5zdHJpbmcoKTsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKiB2YWx1ZSA9IGNvbW1lbnR2YWx1ZS5zdHJpbmcoKTsKLQotICAgICAgICAgICAgLy8gZmlyc3QgMyBjaGFyYWN0ZXJzIGFyZSB0aGUgbGFuZ3VhZ2UsIHdoaWNoIHdlIGRvbid0IGNhcmUgYWJvdXQKLSAgICAgICAgICAgIGlmKHN0cmxlbihkZXNjKSA+IDMgJiYgc3RyY21wKGRlc2MgKyAzLCAiaVR1blNNUEIiKSA9PSAwKSB7Ci0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGRlbGF5LCBwYWRkaW5nOwotICAgICAgICAgICAgICAgIGlmIChzc2NhbmYodmFsdWUsICIgJSp4ICV4ICV4ICUqeCIsICZkZWxheSwgJnBhZGRpbmcpID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgbU1ldGEtPnNldEludDMyKGtLZXlFbmNvZGVyRGVsYXksIGRlbGF5KTsKLSAgICAgICAgICAgICAgICAgICAgbU1ldGEtPnNldEludDMyKGtLZXlFbmNvZGVyUGFkZGluZywgcGFkZGluZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29tLT5uZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVsZXRlIGNvbTsKLSAgICAgICAgY29tID0gTlVMTDsKLSAgICB9Ci19Ci0KLXNpemVfdCBNUDNFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewotICAgIHJldHVybiBtSW5pdENoZWNrICE9IE9LID8gMCA6IDE7Ci19Ci0KLXNwPElNZWRpYVNvdXJjZT4gTVAzRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBuZXcgTVAzU291cmNlKAotICAgICAgICAgICAgbU1ldGEsIG1EYXRhU291cmNlLCBtRmlyc3RGcmFtZVBvcywgbUZpeGVkSGVhZGVyLAotICAgICAgICAgICAgbVNlZWtlcik7Ci19Ci0KLXNwPE1ldGFEYXRhPiBNUDNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBtTWV0YTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotLy8gVGhlIHRoZW9yZXRpY2FsIG1heGltdW0gZnJhbWUgc2l6ZSBmb3IgYW4gTVBFRyBhdWRpbyBzdHJlYW0gc2hvdWxkIG9jY3VyCi0vLyB3aGlsZSBwbGF5aW5nIGEgTGF5ZXIgMiwgTVBFR3YyLjUgYXVkaW8gc3RyZWFtIGF0IDE2MGticHMgKHdpdGggcGFkZGluZykuCi0vLyBUaGUgc2l6ZSBvZiB0aGlzIGZyYW1lIHNob3VsZCBiZS4uLgotLy8gKCgxMTUyIHNhbXBsZXMvZnJhbWUgKiAxNjAwMDAgYml0cy9zZWMpIC8KLS8vICAoODAwMCBzYW1wbGVzL3NlYyAqIDggYml0cy9ieXRlKSkgKyAxIHBhZGRpbmcgYnl0ZS9mcmFtZSA9IDI4ODEgYnl0ZXMvZnJhbWUuCi0vLyBTZXQgb3VyIG1heCBmcmFtZSBzaXplIHRvIHRoZSBuZWFyZXN0IHBvd2VyIG9mIDIgYWJvdmUgdGhpcyBzaXplIChha2EsIDRrQikKLWNvbnN0IHNpemVfdCBNUDNTb3VyY2U6OmtNYXhGcmFtZVNpemUgPSAoMSA8PCAxMik7IC8qIDQwOTYgYnl0ZXMgKi8KLU1QM1NvdXJjZTo6TVAzU291cmNlKAotICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsCi0gICAgICAgIG9mZjY0X3QgZmlyc3RfZnJhbWVfcG9zLCB1aW50MzJfdCBmaXhlZF9oZWFkZXIsCi0gICAgICAgIGNvbnN0IHNwPE1QM1NlZWtlcj4gJnNlZWtlcikKLSAgICA6IG1NZXRhKG1ldGEpLAotICAgICAgbURhdGFTb3VyY2Uoc291cmNlKSwKLSAgICAgIG1GaXJzdEZyYW1lUG9zKGZpcnN0X2ZyYW1lX3BvcyksCi0gICAgICBtRml4ZWRIZWFkZXIoZml4ZWRfaGVhZGVyKSwKLSAgICAgIG1DdXJyZW50UG9zKDApLAotICAgICAgbUN1cnJlbnRUaW1lVXMoMCksCi0gICAgICBtU3RhcnRlZChmYWxzZSksCi0gICAgICBtU2Vla2VyKHNlZWtlciksCi0gICAgICBtR3JvdXAoTlVMTCksCi0gICAgICBtQmFzaXNUaW1lVXMoMCksCi0gICAgICBtU2FtcGxlc1JlYWQoMCkgewotfQotCi1NUDNTb3VyY2U6On5NUDNTb3VyY2UoKSB7Ci0gICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgIHN0b3AoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IE1QM1NvdXJjZTo6c3RhcnQoTWV0YURhdGEgKikgewotICAgIENIRUNLKCFtU3RhcnRlZCk7Ci0KLSAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKLQotICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihuZXcgTWVkaWFCdWZmZXIoa01heEZyYW1lU2l6ZSkpOwotCi0gICAgbUN1cnJlbnRQb3MgPSBtRmlyc3RGcmFtZVBvczsKLSAgICBtQ3VycmVudFRpbWVVcyA9IDA7Ci0KLSAgICBtQmFzaXNUaW1lVXMgPSBtQ3VycmVudFRpbWVVczsKLSAgICBtU2FtcGxlc1JlYWQgPSAwOwotCi0gICAgbVN0YXJ0ZWQgPSB0cnVlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNUDNTb3VyY2U6OnN0b3AoKSB7Ci0gICAgQ0hFQ0sobVN0YXJ0ZWQpOwotCi0gICAgZGVsZXRlIG1Hcm91cDsKLSAgICBtR3JvdXAgPSBOVUxMOwotCi0gICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3A8TWV0YURhdGE+IE1QM1NvdXJjZTo6Z2V0Rm9ybWF0KCkgewotICAgIHJldHVybiBtTWV0YTsKLX0KLQotc3RhdHVzX3QgTVAzU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICAqb3V0ID0gTlVMTDsKLQotICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKLSAgICBib29sIHNlZWtDQlIgPSBmYWxzZTsKLQotICAgIGlmIChvcHRpb25zICE9IE5VTEwgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKLSAgICAgICAgaW50NjRfdCBhY3R1YWxTZWVrVGltZVVzID0gc2Vla1RpbWVVczsKLSAgICAgICAgaWYgKG1TZWVrZXIgPT0gTlVMTAotICAgICAgICAgICAgICAgIHx8ICFtU2Vla2VyLT5nZXRPZmZzZXRGb3JUaW1lKCZhY3R1YWxTZWVrVGltZVVzLCAmbUN1cnJlbnRQb3MpKSB7Ci0gICAgICAgICAgICBpbnQzMl90IGJpdHJhdGU7Ci0gICAgICAgICAgICBpZiAoIW1NZXRhLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZiaXRyYXRlKSkgewotICAgICAgICAgICAgICAgIC8vIGJpdHJhdGUgaXMgaW4gYml0cy9zZWMuCi0gICAgICAgICAgICAgICAgQUxPR0koIm5vIGJpdHJhdGUiKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUN1cnJlbnRUaW1lVXMgPSBzZWVrVGltZVVzOwotICAgICAgICAgICAgbUN1cnJlbnRQb3MgPSBtRmlyc3RGcmFtZVBvcyArIHNlZWtUaW1lVXMgKiBiaXRyYXRlIC8gODAwMDAwMDsKLSAgICAgICAgICAgIHNlZWtDQlIgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUN1cnJlbnRUaW1lVXMgPSBhY3R1YWxTZWVrVGltZVVzOwotICAgICAgICB9Ci0KLSAgICAgICAgbUJhc2lzVGltZVVzID0gbUN1cnJlbnRUaW1lVXM7Ci0gICAgICAgIG1TYW1wbGVzUmVhZCA9IDA7Ci0gICAgfQotCi0gICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKLSAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBzaXplX3QgZnJhbWVfc2l6ZTsKLSAgICBpbnQgYml0cmF0ZTsKLSAgICBpbnQgbnVtX3NhbXBsZXM7Ci0gICAgaW50IHNhbXBsZV9yYXRlOwotICAgIGZvciAoOzspIHsKLSAgICAgICAgc3NpemVfdCBuID0gbURhdGFTb3VyY2UtPnJlYWRBdChtQ3VycmVudFBvcywgYnVmZmVyLT5kYXRhKCksIDQpOwotICAgICAgICBpZiAobiA8IDQpIHsKLSAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKLQotICAgICAgICAgICAgcmV0dXJuIChuIDwgMCA/IG4gOiBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKLSAgICAgICAgfQotCi0gICAgICAgIHVpbnQzMl90IGhlYWRlciA9IFUzMl9BVCgoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpKTsKLQotICAgICAgICBpZiAoKGhlYWRlciAmIGtNYXNrKSA9PSAobUZpeGVkSGVhZGVyICYga01hc2spCi0gICAgICAgICAgICAmJiBHZXRNUEVHQXVkaW9GcmFtZVNpemUoCi0gICAgICAgICAgICAgICAgaGVhZGVyLCAmZnJhbWVfc2l6ZSwgJnNhbXBsZV9yYXRlLCBOVUxMLAotICAgICAgICAgICAgICAgICZiaXRyYXRlLCAmbnVtX3NhbXBsZXMpKSB7Ci0KLSAgICAgICAgICAgIC8vIHJlLWNhbGN1bGF0ZSBtQ3VycmVudFRpbWVVcyBiZWNhdXNlIHdlIG1pZ2h0IGhhdmUgY2FsbGVkIFJlc3luYygpCi0gICAgICAgICAgICBpZiAoc2Vla0NCUikgewotICAgICAgICAgICAgICAgIG1DdXJyZW50VGltZVVzID0gKG1DdXJyZW50UG9zIC0gbUZpcnN0RnJhbWVQb3MpICogODAwMCAvIGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgbUJhc2lzVGltZVVzID0gbUN1cnJlbnRUaW1lVXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTG9zdCBzeW5jLgotICAgICAgICBBTE9HVigibG9zdCBzeW5jISBoZWFkZXIgPSAweCUwOHgsIG9sZCBoZWFkZXIgPSAweCUwOHhcbiIsIGhlYWRlciwgbUZpeGVkSGVhZGVyKTsKLQotICAgICAgICBvZmY2NF90IHBvcyA9IG1DdXJyZW50UG9zOwotICAgICAgICBpZiAoIVJlc3luYyhtRGF0YVNvdXJjZSwgbUZpeGVkSGVhZGVyLCAmcG9zLCBOVUxMLCBOVUxMKSkgewotICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byByZXN5bmMuIFNpZ25hbGxpbmcgZW5kIG9mIHN0cmVhbS4iKTsKLQotICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBidWZmZXIgPSBOVUxMOwotCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgfQotCi0gICAgICAgIG1DdXJyZW50UG9zID0gcG9zOwotCi0gICAgICAgIC8vIFRyeSBhZ2FpbiB3aXRoIHRoZSBuZXcgcG9zaXRpb24uCi0gICAgfQotCi0gICAgQ0hFQ0soZnJhbWVfc2l6ZSA8PSBidWZmZXItPnNpemUoKSk7Ci0KLSAgICBzc2l6ZV90IG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG1DdXJyZW50UG9zLCBidWZmZXItPmRhdGEoKSwgZnJhbWVfc2l6ZSk7Ci0gICAgaWYgKG4gPCAoc3NpemVfdClmcmFtZV9zaXplKSB7Ci0gICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBidWZmZXIgPSBOVUxMOwotCi0gICAgICAgIHJldHVybiAobiA8IDAgPyBuIDogRVJST1JfRU5EX09GX1NUUkVBTSk7Ci0gICAgfQotCi0gICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZnJhbWVfc2l6ZSk7Ci0KLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgbUN1cnJlbnRUaW1lVXMpOwotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7Ci0KLSAgICBtQ3VycmVudFBvcyArPSBmcmFtZV9zaXplOwotCi0gICAgbVNhbXBsZXNSZWFkICs9IG51bV9zYW1wbGVzOwotICAgIG1DdXJyZW50VGltZVVzID0gbUJhc2lzVGltZVVzICsgKChtU2FtcGxlc1JlYWQgKiAxMDAwMDAwKSAvIHNhbXBsZV9yYXRlKTsKLQotICAgICpvdXQgPSBidWZmZXI7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXNwPE1ldGFEYXRhPiBNUDNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKCkgewotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotCi0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1ldGE7Ci0gICAgfQotCi0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsICJhdWRpby9tcGVnIik7Ci0KLSAgICBJRDMgaWQzKG1EYXRhU291cmNlKTsKLQotICAgIGlmICghaWQzLmlzVmFsaWQoKSkgewotICAgICAgICByZXR1cm4gbWV0YTsKLSAgICB9Ci0KLSAgICBzdHJ1Y3QgTWFwIHsKLSAgICAgICAgaW50IGtleTsKLSAgICAgICAgY29uc3QgY2hhciAqdGFnMTsKLSAgICAgICAgY29uc3QgY2hhciAqdGFnMjsKLSAgICB9OwotICAgIHN0YXRpYyBjb25zdCBNYXAga01hcFtdID0gewotICAgICAgICB7IGtLZXlBbGJ1bSwgIlRBTEIiLCAiVEFMIiB9LAotICAgICAgICB7IGtLZXlBcnRpc3QsICJUUEUxIiwgIlRQMSIgfSwKLSAgICAgICAgeyBrS2V5QWxidW1BcnRpc3QsICJUUEUyIiwgIlRQMiIgfSwKLSAgICAgICAgeyBrS2V5Q29tcG9zZXIsICJUQ09NIiwgIlRDTSIgfSwKLSAgICAgICAgeyBrS2V5R2VucmUsICJUQ09OIiwgIlRDTyIgfSwKLSAgICAgICAgeyBrS2V5VGl0bGUsICJUSVQyIiwgIlRUMiIgfSwKLSAgICAgICAgeyBrS2V5WWVhciwgIlRZRSIsICJUWUVSIiB9LAotICAgICAgICB7IGtLZXlBdXRob3IsICJUWFQiLCAiVEVYVCIgfSwKLSAgICAgICAgeyBrS2V5Q0RUcmFja051bWJlciwgIlRSSyIsICJUUkNLIiB9LAotICAgICAgICB7IGtLZXlEaXNjTnVtYmVyLCAiVFBBIiwgIlRQT1MiIH0sCi0gICAgICAgIHsga0tleUNvbXBpbGF0aW9uLCAiVENQIiwgIlRDTVAiIH0sCi0gICAgfTsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1NYXBFbnRyaWVzID0gc2l6ZW9mKGtNYXApIC8gc2l6ZW9mKGtNYXBbMF0pOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtTWFwRW50cmllczsgKytpKSB7Ci0gICAgICAgIElEMzo6SXRlcmF0b3IgKml0ID0gbmV3IElEMzo6SXRlcmF0b3IoaWQzLCBrTWFwW2ldLnRhZzEpOwotICAgICAgICBpZiAoaXQtPmRvbmUoKSkgewotICAgICAgICAgICAgZGVsZXRlIGl0OwotICAgICAgICAgICAgaXQgPSBuZXcgSUQzOjpJdGVyYXRvcihpZDMsIGtNYXBbaV0udGFnMik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXQtPmRvbmUoKSkgewotICAgICAgICAgICAgZGVsZXRlIGl0OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmc4IHM7Ci0gICAgICAgIGl0LT5nZXRTdHJpbmcoJnMpOwotICAgICAgICBkZWxldGUgaXQ7Ci0KLSAgICAgICAgbWV0YS0+c2V0Q1N0cmluZyhrTWFwW2ldLmtleSwgcyk7Ci0gICAgfQotCi0gICAgc2l6ZV90IGRhdGFTaXplOwotICAgIFN0cmluZzggbWltZTsKLSAgICBjb25zdCB2b2lkICpkYXRhID0gaWQzLmdldEFsYnVtQXJ0KCZkYXRhU2l6ZSwgJm1pbWUpOwotCi0gICAgaWYgKGRhdGEpIHsKLSAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QWxidW1BcnQsIE1ldGFEYXRhOjpUWVBFX05PTkUsIGRhdGEsIGRhdGFTaXplKTsKLSAgICAgICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5QWxidW1BcnRNSU1FLCBtaW1lLnN0cmluZygpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbWV0YTsKLX0KLQotYm9vbCBTbmlmZk1QMygKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsCi0gICAgICAgIGZsb2F0ICpjb25maWRlbmNlLCBzcDxBTWVzc2FnZT4gKm1ldGEpIHsKLSAgICBvZmY2NF90IHBvcyA9IDA7Ci0gICAgb2ZmNjRfdCBwb3N0X2lkM19wb3M7Ci0gICAgdWludDMyX3QgaGVhZGVyOwotICAgIGlmICghUmVzeW5jKHNvdXJjZSwgMCwgJnBvcywgJnBvc3RfaWQzX3BvcywgJmhlYWRlcikpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgICptZXRhID0gbmV3IEFNZXNzYWdlOwotICAgICgqbWV0YSktPnNldEludDY0KCJvZmZzZXQiLCBwb3MpOwotICAgICgqbWV0YSktPnNldEludDMyKCJoZWFkZXIiLCBoZWFkZXIpOwotICAgICgqbWV0YSktPnNldEludDY0KCJwb3N0LWlkMy1vZmZzZXQiLCBwb3N0X2lkM19wb3MpOwotCi0gICAgKm1pbWVUeXBlID0gTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRzsKLSAgICAqY29uZmlkZW5jZSA9IDAuMmY7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5jcHAKaW5kZXggMDNlYTk1OS4uNzcwNTM1YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5jcHAKQEAgLTE2LDE4ICsxNiwxOCBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk1QRUcyVFNXcml0ZXIiCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KIAorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgogCiAjaW5jbHVkZSAiaW5jbHVkZS9FU0RTLmgiCkBAIC0zNSw3ICszNSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBNUEVHMlRTV3JpdGVyOjpTb3VyY2VJbmZvIDogcHVibGljIEFIYW5kbGVyIHsKLSAgICBleHBsaWNpdCBTb3VyY2VJbmZvKGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CisgICAgZXhwbGljaXQgU291cmNlSW5mbyhjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CiAKICAgICB2b2lkIHN0YXJ0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBjb25zdCBzcDxNZXRhRGF0YT4gJnBhcmFtcyk7CiAgICAgdm9pZCBzdG9wKCk7CkBAIC02OSw3ICs2OSw3IEBACiAgICAgICAgIGtXaGF0UmVhZCAgPSAncmVhZCcsCiAgICAgfTsKIAotICAgIHNwPElNZWRpYVNvdXJjZT4gbVNvdXJjZTsKKyAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKICAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwogICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OwogCkBAIC04NSwxMyArODUsMTMgQEAKIAogICAgIHZvaWQgZXh0cmFjdENvZGVjU3BlY2lmaWNEYXRhKCk7CiAKLSAgICB2b2lkIGFwcGVuZEFBQ0ZyYW1lcyhNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKLSAgICB2b2lkIGFwcGVuZEFWQ0ZyYW1lKE1lZGlhQnVmZmVyICpidWZmZXIpOworICAgIHZvaWQgYXBwZW5kQUFDRnJhbWVzKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKTsKKyAgICB2b2lkIGFwcGVuZEFWQ0ZyYW1lKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvdXJjZUluZm8pOwogfTsKIAotTVBFRzJUU1dyaXRlcjo6U291cmNlSW5mbzo6U291cmNlSW5mbyhjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpCitNUEVHMlRTV3JpdGVyOjpTb3VyY2VJbmZvOjpTb3VyY2VJbmZvKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKQogICAgIDogbVNvdXJjZShzb3VyY2UpLAogICAgICAgbUxvb3BlcihuZXcgQUxvb3BlciksCiAgICAgICBtRU9TUmVjZWl2ZWQoZmFsc2UpLApAQCAtMjQ5LDcgKzI0OSw3IEBACiAgICAgbm90aWZ5LT5wb3N0KCk7CiB9CiAKLXZvaWQgTVBFRzJUU1dyaXRlcjo6U291cmNlSW5mbzo6YXBwZW5kQVZDRnJhbWUoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgewordm9pZCBNUEVHMlRTV3JpdGVyOjpTb3VyY2VJbmZvOjphcHBlbmRBVkNGcmFtZShNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgewogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga05vdGlmeUJ1ZmZlcik7CiAKQEAgLTI2NCwxMSArMjY0LDExIEBACiAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwogCiAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKICAgICBtQnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwogCiAgICAgaW50MzJfdCBpc1N5bmM7Ci0gICAgaWYgKGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsICZpc1N5bmMpCisgICAgaWYgKGJ1ZmZlci0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlJc1N5bmNGcmFtZSwgJmlzU3luYykKICAgICAgICAgICAgICYmIGlzU3luYyAhPSAwKSB7CiAgICAgICAgIG1CdWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImlzU3luYyIsIHRydWUpOwogICAgIH0KQEAgLTI3OSw3ICsyNzksNyBAQAogICAgIG5vdGlmeS0+cG9zdCgpOwogfQogCi12b2lkIE1QRUcyVFNXcml0ZXI6OlNvdXJjZUluZm86OmFwcGVuZEFBQ0ZyYW1lcyhNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7Cit2b2lkIE1QRUcyVFNXcml0ZXI6OlNvdXJjZUluZm86OmFwcGVuZEFBQ0ZyYW1lcyhNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgewogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga05vdGlmeUJ1ZmZlcik7CiAKQEAgLTI4OCw3ICsyODgsNyBAQAogICAgIH0KIAogICAgIGludDY0X3QgdGltZVVzOwotICAgIENIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCkuZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CiAKICAgICBtQnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwogICAgIG1CdWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImlzU3luYyIsIHRydWUpOwpAQCAtMzY4LDcgKzM2OCw3IEBACiAKICAgICAgICAgY2FzZSBrV2hhdFJlYWQ6CiAgICAgICAgIHsKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXI7CisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnJlYWQoJmJ1ZmZlcik7CiAKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0sgJiYgZXJyICE9IElORk9fRk9STUFUX0NIQU5HRUQpIHsKQEAgLTQ5OSw3ICs0OTksNyBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgTVBFRzJUU1dyaXRlcjo6YWRkU291cmNlKGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSkgeworc3RhdHVzX3QgTVBFRzJUU1dyaXRlcjo6YWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKSB7CiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKIAogICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gc291cmNlLT5nZXRGb3JtYXQoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM3NzdiMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NDQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIk1QRUc0RXh0cmFjdG9yIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oIgotI2luY2x1ZGUgImluY2x1ZGUvU2FtcGxlVGFibGUuaCIKLSNpbmNsdWRlICJpbmNsdWRlL0l0ZW1UYWJsZS5oIgotI2luY2x1ZGUgImluY2x1ZGUvRVNEUy5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi0jaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KLSNpbmNsdWRlICJpbmNsdWRlL0lEMy5oIgotI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCi0KLSNpZm5kZWYgVUlOVDMyX01BWAotI2RlZmluZSBVSU5UMzJfTUFYICAgICAgICg0Mjk0OTY3Mjk1VSkKLSNlbmRpZgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWVudW0gewotICAgIC8vIG1heCB0cmFjayBoZWFkZXIgY2h1bmsgdG8gcmV0dXJuCi0gICAga01heFRyYWNrSGVhZGVyU2l6ZSA9IDMyLAotCi0gICAgLy8gbWF4aW11bSBzaXplIG9mIGFuIGF0b20uIFNvbWUgYXRvbXMgY2FuIGJlIGJpZ2dlciBhY2NvcmRpbmcgdG8gdGhlIHNwZWMsCi0gICAgLy8gYnV0IHdlIG9ubHkgYWxsb3cgdXAgdG8gdGhpcyBzaXplLgotICAgIGtNYXhBdG9tU2l6ZSA9IDY0ICogMTAyNCAqIDEwMjQsCi19OwotCi1jbGFzcyBNUEVHNFNvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7Ci1wdWJsaWM6Ci0gICAgLy8gQ2FsbGVyIHJldGFpbnMgb3duZXJzaGlwIG9mIGJvdGggImRhdGFTb3VyY2UiIGFuZCAic2FtcGxlVGFibGUiLgotICAgIE1QRUc0U291cmNlKGNvbnN0IHNwPE1QRUc0RXh0cmFjdG9yPiAmb3duZXIsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZmb3JtYXQsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UsCi0gICAgICAgICAgICAgICAgaW50MzJfdCB0aW1lU2NhbGUsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3A8U2FtcGxlVGFibGU+ICZzYW1wbGVUYWJsZSwKLSAgICAgICAgICAgICAgICBWZWN0b3I8U2lkeEVudHJ5PiAmc2lkeCwKLSAgICAgICAgICAgICAgICBjb25zdCBUcmV4ICp0cmV4LAotICAgICAgICAgICAgICAgIG9mZjY0X3QgZmlyc3RNb29mT2Zmc2V0LAotICAgICAgICAgICAgICAgIGNvbnN0IHNwPEl0ZW1UYWJsZT4gJml0ZW1UYWJsZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLQotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwotICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCkgeyByZXR1cm4gdHJ1ZTsgfQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZnJhZ21lbnRlZFJlYWQoTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5NUEVHNFNvdXJjZSgpOwotCi1wcml2YXRlOgotICAgIE11dGV4IG1Mb2NrOwotCi0gICAgLy8ga2VlcCB0aGUgTVBFRzRFeHRyYWN0b3IgYXJvdW5kLCBzaW5jZSB3ZSdyZSByZWZlcmVuY2luZyBpdHMgZGF0YQotICAgIHNwPE1QRUc0RXh0cmFjdG9yPiBtT3duZXI7Ci0gICAgc3A8TWV0YURhdGE+IG1Gb3JtYXQ7Ci0gICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7Ci0gICAgaW50MzJfdCBtVGltZXNjYWxlOwotICAgIHNwPFNhbXBsZVRhYmxlPiBtU2FtcGxlVGFibGU7Ci0gICAgdWludDMyX3QgbUN1cnJlbnRTYW1wbGVJbmRleDsKLSAgICB1aW50MzJfdCBtQ3VycmVudEZyYWdtZW50SW5kZXg7Ci0gICAgVmVjdG9yPFNpZHhFbnRyeT4gJm1TZWdtZW50czsKLSAgICBjb25zdCBUcmV4ICptVHJleDsKLSAgICBvZmY2NF90IG1GaXJzdE1vb2ZPZmZzZXQ7Ci0gICAgb2ZmNjRfdCBtQ3VycmVudE1vb2ZPZmZzZXQ7Ci0gICAgb2ZmNjRfdCBtTmV4dE1vb2ZPZmZzZXQ7Ci0gICAgdWludDMyX3QgbUN1cnJlbnRUaW1lOwotICAgIGludDMyX3QgbUxhc3RQYXJzZWRUcmFja0lkOwotICAgIGludDMyX3QgbVRyYWNrSWQ7Ci0KLSAgICBpbnQzMl90IG1DcnlwdG9Nb2RlOyAgICAvLyBwYXNzZWQgaW4gZnJvbSBleHRyYWN0b3IKLSAgICBpbnQzMl90IG1EZWZhdWx0SVZTaXplOyAvLyBwYXNzZWQgaW4gZnJvbSBleHRyYWN0b3IKLSAgICB1aW50OF90IG1DcnlwdG9LZXlbMTZdOyAvLyBwYXNzZWQgaW4gZnJvbSBleHRyYWN0b3IKLSAgICB1aW50MzJfdCBtQ3VycmVudEF1eEluZm9UeXBlOwotICAgIHVpbnQzMl90IG1DdXJyZW50QXV4SW5mb1R5cGVQYXJhbWV0ZXI7Ci0gICAgaW50MzJfdCBtQ3VycmVudERlZmF1bHRTYW1wbGVJbmZvU2l6ZTsKLSAgICB1aW50MzJfdCBtQ3VycmVudFNhbXBsZUluZm9Db3VudDsKLSAgICB1aW50MzJfdCBtQ3VycmVudFNhbXBsZUluZm9BbGxvY1NpemU7Ci0gICAgdWludDhfdCogbUN1cnJlbnRTYW1wbGVJbmZvU2l6ZXM7Ci0gICAgdWludDMyX3QgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0Q291bnQ7Ci0gICAgdWludDMyX3QgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0c0FsbG9jU2l6ZTsKLSAgICB1aW50NjRfdCogbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0czsKLQotICAgIGJvb2wgbUlzQVZDOwotICAgIGJvb2wgbUlzSEVWQzsKLSAgICBzaXplX3QgbU5BTExlbmd0aFNpemU7Ci0KLSAgICBib29sIG1TdGFydGVkOwotCi0gICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOwotCi0gICAgTWVkaWFCdWZmZXIgKm1CdWZmZXI7Ci0KLSAgICBib29sIG1XYW50c05BTEZyYWdtZW50czsKLQotICAgIHVpbnQ4X3QgKm1TcmNCdWZmZXI7Ci0KLSAgICBib29sIG1Jc0hFSUY7Ci0gICAgc3A8SXRlbVRhYmxlPiBtSXRlbVRhYmxlOwotCi0gICAgc2l6ZV90IHBhcnNlTkFMU2l6ZShjb25zdCB1aW50OF90ICpkYXRhKSBjb25zdDsKLSAgICBzdGF0dXNfdCBwYXJzZUNodW5rKG9mZjY0X3QgKm9mZnNldCk7Ci0gICAgc3RhdHVzX3QgcGFyc2VUcmFja0ZyYWdtZW50SGVhZGVyKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IHNpemUpOwotICAgIHN0YXR1c190IHBhcnNlVHJhY2tGcmFnbWVudFJ1bihvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBzaXplKTsKLSAgICBzdGF0dXNfdCBwYXJzZVNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uU2l6ZXMob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3Qgc2l6ZSk7Ci0gICAgc3RhdHVzX3QgcGFyc2VTYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvbk9mZnNldHMob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3Qgc2l6ZSk7Ci0KLSAgICBzdHJ1Y3QgVHJhY2tGcmFnbWVudEhlYWRlckluZm8gewotICAgICAgICBlbnVtIEZsYWdzIHsKLSAgICAgICAgICAgIGtCYXNlRGF0YU9mZnNldFByZXNlbnQgICAgICAgICA9IDB4MDEsCi0gICAgICAgICAgICBrU2FtcGxlRGVzY3JpcHRpb25JbmRleFByZXNlbnQgPSAweDAyLAotICAgICAgICAgICAga0RlZmF1bHRTYW1wbGVEdXJhdGlvblByZXNlbnQgID0gMHgwOCwKLSAgICAgICAgICAgIGtEZWZhdWx0U2FtcGxlU2l6ZVByZXNlbnQgICAgICA9IDB4MTAsCi0gICAgICAgICAgICBrRGVmYXVsdFNhbXBsZUZsYWdzUHJlc2VudCAgICAgPSAweDIwLAotICAgICAgICAgICAga0R1cmF0aW9uSXNFbXB0eSAgICAgICAgICAgICAgID0gMHgxMDAwMCwKLSAgICAgICAgfTsKLQotICAgICAgICB1aW50MzJfdCBtVHJhY2tJRDsKLSAgICAgICAgdWludDMyX3QgbUZsYWdzOwotICAgICAgICB1aW50NjRfdCBtQmFzZURhdGFPZmZzZXQ7Ci0gICAgICAgIHVpbnQzMl90IG1TYW1wbGVEZXNjcmlwdGlvbkluZGV4OwotICAgICAgICB1aW50MzJfdCBtRGVmYXVsdFNhbXBsZUR1cmF0aW9uOwotICAgICAgICB1aW50MzJfdCBtRGVmYXVsdFNhbXBsZVNpemU7Ci0gICAgICAgIHVpbnQzMl90IG1EZWZhdWx0U2FtcGxlRmxhZ3M7Ci0KLSAgICAgICAgdWludDY0X3QgbURhdGFPZmZzZXQ7Ci0gICAgfTsKLSAgICBUcmFja0ZyYWdtZW50SGVhZGVySW5mbyBtVHJhY2tGcmFnbWVudEhlYWRlckluZm87Ci0KLSAgICBzdHJ1Y3QgU2FtcGxlIHsKLSAgICAgICAgb2ZmNjRfdCBvZmZzZXQ7Ci0gICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICB1aW50MzJfdCBkdXJhdGlvbjsKLSAgICAgICAgaW50MzJfdCBjb21wb3NpdGlvbk9mZnNldDsKLSAgICAgICAgdWludDhfdCBpdlsxNl07Ci0gICAgICAgIFZlY3RvcjxzaXplX3Q+IGNsZWFyc2l6ZXM7Ci0gICAgICAgIFZlY3RvcjxzaXplX3Q+IGVuY3J5cHRlZHNpemVzOwotICAgIH07Ci0gICAgVmVjdG9yPFNhbXBsZT4gbUN1cnJlbnRTYW1wbGVzOwotCi0gICAgTVBFRzRTb3VyY2UoY29uc3QgTVBFRzRTb3VyY2UgJik7Ci0gICAgTVBFRzRTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBNUEVHNFNvdXJjZSAmKTsKLX07Ci0KLS8vIFRoaXMgY3VzdG9tIGRhdGEgc291cmNlIHdyYXBzIGFuIGV4aXN0aW5nIG9uZSBhbmQgc2F0aXNmaWVzIHJlcXVlc3RzCi0vLyBmYWxsaW5nIGVudGlyZWx5IHdpdGhpbiBhIGNhY2hlZCByYW5nZSBmcm9tIHRoZSBjYWNoZSB3aGlsZSBmb3J3YXJkaW5nCi0vLyBhbGwgcmVtYWluaW5nIHJlcXVlc3RzIHRvIHRoZSB3cmFwcGVkIGRhdGFzb3VyY2UuCi0vLyBUaGlzIGlzIHVzZWQgdG8gY2FjaGUgdGhlIGZ1bGwgc2FtcGxldGFibGUgbWV0YWRhdGEgZm9yIGEgc2luZ2xlIHRyYWNrLAotLy8gcG9zc2libHkgd3JhcHBpbmcgbXVsdGlwbGUgdGltZXMgdG8gY292ZXIgYWxsIHRyYWNrcywgaS5lLgotLy8gRWFjaCBNUEVHNERhdGFTb3VyY2UgY2FjaGVzIHRoZSBzYW1wbGV0YWJsZSBtZXRhZGF0YSBmb3IgYSBzaW5nbGUgdHJhY2suCi0KLXN0cnVjdCBNUEVHNERhdGFTb3VyY2UgOiBwdWJsaWMgRGF0YVNvdXJjZSB7Ci0gICAgZXhwbGljaXQgTVBFRzREYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKLSAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOwotICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKTsKLQotICAgIHN0YXR1c190IHNldENhY2hlZFJhbmdlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5NUEVHNERhdGFTb3VyY2UoKTsKLQotcHJpdmF0ZToKLSAgICBNdXRleCBtTG9jazsKLQotICAgIHNwPERhdGFTb3VyY2U+IG1Tb3VyY2U7Ci0gICAgb2ZmNjRfdCBtQ2FjaGVkT2Zmc2V0OwotICAgIHNpemVfdCBtQ2FjaGVkU2l6ZTsKLSAgICB1aW50OF90ICptQ2FjaGU7Ci0KLSAgICB2b2lkIGNsZWFyQ2FjaGUoKTsKLQotICAgIE1QRUc0RGF0YVNvdXJjZShjb25zdCBNUEVHNERhdGFTb3VyY2UgJik7Ci0gICAgTVBFRzREYXRhU291cmNlICZvcGVyYXRvcj0oY29uc3QgTVBFRzREYXRhU291cmNlICYpOwotfTsKLQotTVBFRzREYXRhU291cmNlOjpNUEVHNERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkKLSAgICA6IG1Tb3VyY2Uoc291cmNlKSwKLSAgICAgIG1DYWNoZWRPZmZzZXQoMCksCi0gICAgICBtQ2FjaGVkU2l6ZSgwKSwKLSAgICAgIG1DYWNoZShOVUxMKSB7Ci19Ci0KLU1QRUc0RGF0YVNvdXJjZTo6fk1QRUc0RGF0YVNvdXJjZSgpIHsKLSAgICBjbGVhckNhY2hlKCk7Ci19Ci0KLXZvaWQgTVBFRzREYXRhU291cmNlOjpjbGVhckNhY2hlKCkgewotICAgIGlmIChtQ2FjaGUpIHsKLSAgICAgICAgZnJlZShtQ2FjaGUpOwotICAgICAgICBtQ2FjaGUgPSBOVUxMOwotICAgIH0KLQotICAgIG1DYWNoZWRPZmZzZXQgPSAwOwotICAgIG1DYWNoZWRTaXplID0gMDsKLX0KLQotc3RhdHVzX3QgTVBFRzREYXRhU291cmNlOjppbml0Q2hlY2soKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Tb3VyY2UtPmluaXRDaGVjaygpOwotfQotCi1zc2l6ZV90IE1QRUc0RGF0YVNvdXJjZTo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAoaXNJblJhbmdlKG1DYWNoZWRPZmZzZXQsIG1DYWNoZWRTaXplLCBvZmZzZXQsIHNpemUpKSB7Ci0gICAgICAgIG1lbWNweShkYXRhLCAmbUNhY2hlW29mZnNldCAtIG1DYWNoZWRPZmZzZXRdLCBzaXplKTsKLSAgICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1Tb3VyY2UtPnJlYWRBdChvZmZzZXQsIGRhdGEsIHNpemUpOwotfQotCi1zdGF0dXNfdCBNUEVHNERhdGFTb3VyY2U6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgewotICAgIHJldHVybiBtU291cmNlLT5nZXRTaXplKHNpemUpOwotfQotCi11aW50MzJfdCBNUEVHNERhdGFTb3VyY2U6OmZsYWdzKCkgewotICAgIHJldHVybiBtU291cmNlLT5mbGFncygpOwotfQotCi1zdGF0dXNfdCBNUEVHNERhdGFTb3VyY2U6OnNldENhY2hlZFJhbmdlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBjbGVhckNhY2hlKCk7Ci0KLSAgICBtQ2FjaGUgPSAodWludDhfdCAqKW1hbGxvYyhzaXplKTsKLQotICAgIGlmIChtQ2FjaGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT01FTTsKLSAgICB9Ci0KLSAgICBtQ2FjaGVkT2Zmc2V0ID0gb2Zmc2V0OwotICAgIG1DYWNoZWRTaXplID0gc2l6ZTsKLQotICAgIHNzaXplX3QgZXJyID0gbVNvdXJjZS0+cmVhZEF0KG1DYWNoZWRPZmZzZXQsIG1DYWNoZSwgbUNhY2hlZFNpemUpOwotCi0gICAgaWYgKGVyciA8IChzc2l6ZV90KXNpemUpIHsKLSAgICAgICAgY2xlYXJDYWNoZSgpOwotCi0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLXN0YXRpYyBjb25zdCBib29sIGtVc2VIZXhEdW1wID0gZmFsc2U7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpGb3VyQ0MyTUlNRSh1aW50MzJfdCBmb3VyY2MpIHsKLSAgICBzd2l0Y2ggKGZvdXJjYykgewotICAgICAgICBjYXNlIEZPVVJDQygnbScsICdwJywgJzQnLCAnYScpOgotICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQzsKLQotICAgICAgICBjYXNlIEZPVVJDQygncycsICdhJywgJ20nLCAncicpOgotICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQjsKLQotICAgICAgICBjYXNlIEZPVVJDQygncycsICdhJywgJ3cnLCAnYicpOgotICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQjsKLQotICAgICAgICBjYXNlIEZPVVJDQygnbScsICdwJywgJzQnLCAndicpOgotICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0OwotCi0gICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJzInLCAnNicsICczJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJzInLCAnNicsICczJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdIJywgJzInLCAnNicsICczJyk6Ci0gICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MzsKLQotICAgICAgICBjYXNlIEZPVVJDQygnYScsICd2JywgJ2MnLCAnMScpOgotICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQzsKLQotICAgICAgICBjYXNlIEZPVVJDQygnaCcsICd2JywgJ2MnLCAnMScpOgotICAgICAgICBjYXNlIEZPVVJDQygnaCcsICdlJywgJ3YnLCAnMScpOgotICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkM7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBDSEVDSyghInNob3VsZCBub3QgYmUgaGVyZS4iKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotc3RhdGljIGJvb2wgQWRqdXN0Q2hhbm5lbHNBbmRSYXRlKHVpbnQzMl90IGZvdXJjYywgdWludDMyX3QgKmNoYW5uZWxzLCB1aW50MzJfdCAqcmF0ZSkgewotICAgIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsIEZvdXJDQzJNSU1FKGZvdXJjYykpKSB7Ci0gICAgICAgIC8vIEFNUiBOQiBhdWRpbyBpcyBhbHdheXMgbW9ubywgOGtIegotICAgICAgICAqY2hhbm5lbHMgPSAxOwotICAgICAgICAqcmF0ZSA9IDgwMDA7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCLCBGb3VyQ0MyTUlNRShmb3VyY2MpKSkgewotICAgICAgICAvLyBBTVIgV0IgYXVkaW8gaXMgYWx3YXlzIG1vbm8sIDE2a0h6Ci0gICAgICAgICpjaGFubmVscyA9IDE7Ci0gICAgICAgICpyYXRlID0gMTYwMDA7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLU1QRUc0RXh0cmFjdG9yOjpNUEVHNEV4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKQotICAgIDogbU1vb2ZPZmZzZXQoMCksCi0gICAgICBtTW9vZkZvdW5kKGZhbHNlKSwKLSAgICAgIG1NZGF0Rm91bmQoZmFsc2UpLAotICAgICAgbURhdGFTb3VyY2Uoc291cmNlKSwKLSAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCi0gICAgICBtSGVhZGVyVGltZXNjYWxlKDApLAotICAgICAgbUlzUVQoZmFsc2UpLAotICAgICAgbUlzSEVJRihmYWxzZSksCi0gICAgICBtRmlyc3RUcmFjayhOVUxMKSwKLSAgICAgIG1MYXN0VHJhY2soTlVMTCksCi0gICAgICBtRmlsZU1ldGFEYXRhKG5ldyBNZXRhRGF0YSksCi0gICAgICBtRmlyc3RTSU5GKE5VTEwpLAotICAgICAgbUlzRHJtKGZhbHNlKSB7Ci19Ci0KLU1QRUc0RXh0cmFjdG9yOjp+TVBFRzRFeHRyYWN0b3IoKSB7Ci0gICAgcmVsZWFzZSgpOwotfQotCi12b2lkIE1QRUc0RXh0cmFjdG9yOjpyZWxlYXNlKCkgewotICAgIFRyYWNrICp0cmFjayA9IG1GaXJzdFRyYWNrOwotICAgIHdoaWxlICh0cmFjaykgewotICAgICAgICBUcmFjayAqbmV4dCA9IHRyYWNrLT5uZXh0OwotCi0gICAgICAgIGRlbGV0ZSB0cmFjazsKLSAgICAgICAgdHJhY2sgPSBuZXh0OwotICAgIH0KLSAgICBtRmlyc3RUcmFjayA9IG1MYXN0VHJhY2sgPSBOVUxMOwotCi0gICAgU0lORiAqc2luZiA9IG1GaXJzdFNJTkY7Ci0gICAgd2hpbGUgKHNpbmYpIHsKLSAgICAgICAgU0lORiAqbmV4dCA9IHNpbmYtPm5leHQ7Ci0gICAgICAgIGRlbGV0ZVtdIHNpbmYtPklQTVBEYXRhOwotICAgICAgICBkZWxldGUgc2luZjsKLSAgICAgICAgc2luZiA9IG5leHQ7Ci0gICAgfQotICAgIG1GaXJzdFNJTkYgPSBOVUxMOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUHNzaC5zaXplKCk7IGkrKykgewotICAgICAgICBkZWxldGUgW10gbVBzc2hbaV0uZGF0YTsKLSAgICB9Ci0gICAgbVBzc2guY2xlYXIoKTsKLQotICAgIGlmIChtRGF0YVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1EYXRhU291cmNlLT5jbG9zZSgpOwotICAgICAgICBtRGF0YVNvdXJjZS5jbGVhcigpOwotICAgIH0KLX0KLQotdWludDMyX3QgTVBFRzRFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgewotICAgIHJldHVybiBDQU5fUEFVU0UgfAotICAgICAgICAgICAgKChtTW9vZk9mZnNldCA9PSAwIHx8IG1TaWR4RW50cmllcy5zaXplKCkgIT0gMCkgPwotICAgICAgICAgICAgICAgICAgICAoQ0FOX1NFRUtfQkFDS1dBUkQgfCBDQU5fU0VFS19GT1JXQVJEIHwgQ0FOX1NFRUspIDogMCk7Ci19Ci0KLXNwPE1ldGFEYXRhPiBNUEVHNEV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoKSB7Ci0gICAgc3RhdHVzX3QgZXJyOwotICAgIGlmICgoZXJyID0gcmVhZE1ldGFEYXRhKCkpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWV0YURhdGE7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1GaWxlTWV0YURhdGE7Ci19Ci0KLXNpemVfdCBNUEVHNEV4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7Ci0gICAgc3RhdHVzX3QgZXJyOwotICAgIGlmICgoZXJyID0gcmVhZE1ldGFEYXRhKCkpICE9IE9LKSB7Ci0gICAgICAgIEFMT0dWKCJNUEVHNEV4dHJhY3Rvcjo6Y291bnRUcmFja3M6IG5vIHRyYWNrcyIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBzaXplX3QgbiA9IDA7Ci0gICAgVHJhY2sgKnRyYWNrID0gbUZpcnN0VHJhY2s7Ci0gICAgd2hpbGUgKHRyYWNrKSB7Ci0gICAgICAgICsrbjsKLSAgICAgICAgdHJhY2sgPSB0cmFjay0+bmV4dDsKLSAgICB9Ci0KLSAgICBBTE9HVigiTVBFRzRFeHRyYWN0b3I6OmNvdW50VHJhY2tzOiAlenUgdHJhY2tzIiwgbik7Ci0gICAgcmV0dXJuIG47Ci19Ci0KLXNwPE1ldGFEYXRhPiBNUEVHNEV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykgewotICAgIHN0YXR1c190IGVycjsKLSAgICBpZiAoKGVyciA9IHJlYWRNZXRhRGF0YSgpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBUcmFjayAqdHJhY2sgPSBtRmlyc3RUcmFjazsKLSAgICB3aGlsZSAoaW5kZXggPiAwKSB7Ci0gICAgICAgIGlmICh0cmFjayA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIHRyYWNrID0gdHJhY2stPm5leHQ7Ci0gICAgICAgIC0taW5kZXg7Ci0gICAgfQotCi0gICAgaWYgKHRyYWNrID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKChmbGFncyAmIGtJbmNsdWRlRXh0ZW5zaXZlTWV0YURhdGEpCi0gICAgICAgICAgICAmJiAhdHJhY2stPmluY2x1ZGVzX2V4cGVuc2l2ZV9tZXRhZGF0YSkgewotICAgICAgICB0cmFjay0+aW5jbHVkZXNfZXhwZW5zaXZlX21ldGFkYXRhID0gdHJ1ZTsKLQotICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICBDSEVDSyh0cmFjay0+bWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwotICAgICAgICBpZiAoIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtaW1lLCA2KSkgewotICAgICAgICAgICAgLy8gTVBFRzIgdHJhY2tzIGRvIG5vdCBwcm92aWRlIENTRCwgc28gcmVhZCB0aGUgc3RyZWFtIGhlYWRlcgotICAgICAgICAgICAgaWYgKCFzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpKSB7Ci0gICAgICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5zYW1wbGVUYWJsZS0+Z2V0TWV0YURhdGFGb3JTYW1wbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBzYW1wbGVJbmRleCAqLywgJm9mZnNldCwgJnNpemUsIE5VTEwgLyogc2FtcGxlVGltZSAqLykgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPiBrTWF4VHJhY2tIZWFkZXJTaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaXplID0ga01heFRyYWNrSGVhZGVyU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB1aW50OF90IGhlYWRlcltrTWF4VHJhY2tIZWFkZXJTaXplXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCAmaGVhZGVyLCBzaXplKSA9PSAoc3NpemVfdClzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS0+c2V0RGF0YShrS2V5U3RyZWFtSGVhZGVyLCAnbWRhdCcsIGhlYWRlciwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtTW9vZk9mZnNldCA+IDApIHsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uOwotICAgICAgICAgICAgICAgIGlmICh0cmFjay0+bWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIGZhbmN5LCBqdXN0IHBpY2sgYSBmcmFtZSBuZWFyIDEvNHRoIG9mIHRoZSBkdXJhdGlvbgotICAgICAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS0+c2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleVRodW1ibmFpbFRpbWUsIGR1cmF0aW9uIC8gNCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleDsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVUaW1lOwotICAgICAgICAgICAgICAgIGlmICh0cmFjay0+dGltZXNjYWxlICE9IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zYW1wbGVUYWJsZS0+ZmluZFRodW1ibmFpbFNhbXBsZSgmc2FtcGxlSW5kZXgpID09IE9LCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiB0cmFjay0+c2FtcGxlVGFibGUtPmdldE1ldGFEYXRhRm9yU2FtcGxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUluZGV4LCBOVUxMIC8qIG9mZnNldCAqLywgTlVMTCAvKiBzaXplICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lKSA9PSBPSykgewotICAgICAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS0+c2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleVRodW1ibmFpbFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQ2NF90KXNhbXBsZVRpbWUgKiAxMDAwMDAwKSAvIHRyYWNrLT50aW1lc2NhbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0cmFjay0+bWV0YTsKLX0KLQotc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnJlYWRNZXRhRGF0YSgpIHsKLSAgICBpZiAobUluaXRDaGVjayAhPSBOT19JTklUKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KLQotICAgIG9mZjY0X3Qgb2Zmc2V0ID0gMDsKLSAgICBzdGF0dXNfdCBlcnI7Ci0gICAgYm9vbCBzYXdNb292T3JTaWR4ID0gZmFsc2U7Ci0KLSAgICB3aGlsZSAoISgoc2F3TW9vdk9yU2lkeCAmJiAobU1kYXRGb3VuZCB8fCBtTW9vZkZvdW5kKSkgfHwKLSAgICAgICAgICAgIChtSXNIRUlGICYmIChtSXRlbVRhYmxlICE9IE5VTEwpICYmIG1JdGVtVGFibGUtPmlzVmFsaWQoKSkpKSB7Ci0gICAgICAgIG9mZjY0X3Qgb3JpZ19vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICAgIGVyciA9IHBhcnNlQ2h1bmsoJm9mZnNldCwgMCk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSyAmJiBlcnIgIT0gVU5LTk9XTl9FUlJPUikgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSBpZiAob2Zmc2V0IDw9IG9yaWdfb2Zmc2V0KSB7Ci0gICAgICAgICAgICAvLyBvbmx5IGNvbnRpbnVlIHBhcnNpbmcgaWYgdGhlIG9mZnNldCB3YXMgYWR2YW5jZWQsCi0gICAgICAgICAgICAvLyBvdGhlcndpc2Ugd2UgbWlnaHQgZW5kIHVwIGluIGFuIGluZmluaXRlIGxvb3AKLSAgICAgICAgICAgIEFMT0dFKCJkaWQgbm90IGFkdmFuY2U6ICVsbGQtPiVsbGQiLCAobG9uZyBsb25nKW9yaWdfb2Zmc2V0LCAobG9uZyBsb25nKW9mZnNldCk7Ci0gICAgICAgICAgICBlcnIgPSBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gVU5LTk9XTl9FUlJPUikgewotICAgICAgICAgICAgc2F3TW9vdk9yU2lkeCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobUluaXRDaGVjayA9PSBPSykgewotICAgICAgICBpZiAoZmluZFRyYWNrQnlNaW1lUHJlZml4KCJ2aWRlby8iKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZmluZFRyYWNrQnlNaW1lUHJlZml4KCJhdWRpby8iKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgImF1ZGlvL21wNCIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1Jbml0Q2hlY2sgPSBlcnI7Ci0gICAgfQotCi0gICAgQ0hFQ0tfTkUoZXJyLCAoc3RhdHVzX3QpTk9fSU5JVCk7Ci0KLSAgICAvLyBjb3B5IHBzc2ggZGF0YSBpbnRvIGZpbGUgbWV0YWRhdGEKLSAgICB1aW50NjRfdCBwc3Noc2l6ZSA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUHNzaC5zaXplKCk7IGkrKykgewotICAgICAgICBwc3Noc2l6ZSArPSAyMCArIG1Qc3NoW2ldLmRhdGFsZW47Ci0gICAgfQotICAgIGlmIChwc3Noc2l6ZSA+IDAgJiYgcHNzaHNpemUgPD0gVUlOVDMyX01BWCkgewotICAgICAgICBjaGFyICpidWYgPSAoY2hhciopbWFsbG9jKHBzc2hzaXplKTsKLSAgICAgICAgaWYgKCFidWYpIHsKLSAgICAgICAgICAgIEFMT0dFKCJiLzI4NDcxMjA2Iik7Ci0gICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICB9Ci0gICAgICAgIGNoYXIgKnB0ciA9IGJ1ZjsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUHNzaC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgbWVtY3B5KHB0ciwgbVBzc2hbaV0udXVpZCwgMjApOyAvLyB1dWlkICsgbGVuZ3RoCi0gICAgICAgICAgICBtZW1jcHkocHRyICsgMjAsIG1Qc3NoW2ldLmRhdGEsIG1Qc3NoW2ldLmRhdGFsZW4pOwotICAgICAgICAgICAgcHRyICs9ICgyMCArIG1Qc3NoW2ldLmRhdGFsZW4pOwotICAgICAgICB9Ci0gICAgICAgIG1GaWxlTWV0YURhdGEtPnNldERhdGEoa0tleVBzc2gsICdwc3NoJywgYnVmLCBwc3Noc2l6ZSk7Ci0gICAgICAgIGZyZWUoYnVmKTsKLSAgICB9Ci0KLSAgICBpZiAobUlzSEVJRikgewotICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1JdGVtVGFibGUtPmdldEltYWdlTWV0YSgpOwotICAgICAgICBpZiAobWV0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgVHJhY2sgKnRyYWNrID0gbUxhc3RUcmFjazsKLSAgICAgICAgaWYgKHRyYWNrICE9IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dXKCJ0cmFjayBpcyBzZXQgYmVmb3JlIG1ldGFkYXRhIGlzIGZ1bGx5IHByb2Nlc3NlZCIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJhY2sgPSBuZXcgVHJhY2s7Ci0gICAgICAgICAgICB0cmFjay0+bmV4dCA9IE5VTEw7Ci0gICAgICAgICAgICBtRmlyc3RUcmFjayA9IG1MYXN0VHJhY2sgPSB0cmFjazsKLSAgICAgICAgfQotCi0gICAgICAgIHRyYWNrLT5tZXRhID0gbWV0YTsKLSAgICAgICAgdHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlUcmFja0lELCAwKTsKLSAgICAgICAgdHJhY2stPmluY2x1ZGVzX2V4cGVuc2l2ZV9tZXRhZGF0YSA9IGZhbHNlOwotICAgICAgICB0cmFjay0+c2tpcFRyYWNrID0gZmFsc2U7Ci0gICAgICAgIHRyYWNrLT50aW1lc2NhbGUgPSAwOwotICAgIH0KLQotICAgIHJldHVybiBtSW5pdENoZWNrOwotfQotCi1jaGFyKiBNUEVHNEV4dHJhY3Rvcjo6Z2V0RHJtVHJhY2tJbmZvKHNpemVfdCB0cmFja0lELCBpbnQgKmxlbikgewotICAgIGlmIChtRmlyc3RTSU5GID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgU0lORiAqc2luZiA9IG1GaXJzdFNJTkY7Ci0gICAgd2hpbGUgKHNpbmYgJiYgKHRyYWNrSUQgIT0gc2luZi0+dHJhY2tJRCkpIHsKLSAgICAgICAgc2luZiA9IHNpbmYtPm5leHQ7Ci0gICAgfQotCi0gICAgaWYgKHNpbmYgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAqbGVuID0gc2luZi0+bGVuOwotICAgIHJldHVybiBzaW5mLT5JUE1QRGF0YTsKLX0KLQotLy8gUmVhZHMgYW4gZW5jb2RlZCBpbnRlZ2VyIDcgYml0cyBhdCBhIHRpbWUgdW50aWwgaXQgZW5jb3VudGVycyB0aGUgaGlnaCBiaXQgY2xlYXIuCi1zdGF0aWMgaW50MzJfdCByZWFkU2l6ZShvZmY2NF90IG9mZnNldCwKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJkRhdGFTb3VyY2UsIHVpbnQ4X3QgKm51bU9mQnl0ZXMpIHsKLSAgICB1aW50MzJfdCBzaXplID0gMDsKLSAgICB1aW50OF90IGRhdGE7Ci0gICAgYm9vbCBtb3JlRGF0YSA9IHRydWU7Ci0gICAgKm51bU9mQnl0ZXMgPSAwOwotCi0gICAgd2hpbGUgKG1vcmVEYXRhKSB7Ci0gICAgICAgIGlmIChEYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCAmZGF0YSwgMSkgPCAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgb2Zmc2V0ICsrOwotICAgICAgICBtb3JlRGF0YSA9IChkYXRhID49IDEyOCkgPyB0cnVlIDogZmFsc2U7Ci0gICAgICAgIHNpemUgPSAoc2l6ZSA8PCA3KSB8IChkYXRhICYgMHg3Zik7IC8vIFRha2UgbGFzdCA3IGJpdHMKLSAgICAgICAgKCpudW1PZkJ5dGVzKSArKzsKLSAgICB9Ci0KLSAgICByZXR1cm4gc2l6ZTsKLX0KLQotc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlRHJtU0lORigKLSAgICAgICAgb2ZmNjRfdCAqIC8qIG9mZnNldCAqLywgb2ZmNjRfdCBkYXRhX29mZnNldCkgewotICAgIHVpbnQ4X3QgdXBkYXRlSWRUYWc7Ci0gICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQsICZ1cGRhdGVJZFRhZywgMSkgPCAxKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0gICAgZGF0YV9vZmZzZXQgKys7Ci0KLSAgICBpZiAoMHgwMS8qT0JKRUNUX0RFU0NSSVBUT1JfVVBEQVRFX0lEX1RBRyovICE9IHVwZGF0ZUlkVGFnKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDhfdCBudW1PZkJ5dGVzOwotICAgIGludDMyX3Qgc2l6ZSA9IHJlYWRTaXplKGRhdGFfb2Zmc2V0LCBtRGF0YVNvdXJjZSwgJm51bU9mQnl0ZXMpOwotICAgIGlmIChzaXplIDwgMCkgewotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotICAgIGRhdGFfb2Zmc2V0ICs9IG51bU9mQnl0ZXM7Ci0KLSAgICB3aGlsZShzaXplID49IDExICkgewotICAgICAgICB1aW50OF90IGRlc2NyaXB0b3JUYWc7Ci0gICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0LCAmZGVzY3JpcHRvclRhZywgMSkgPCAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YV9vZmZzZXQgKys7Ci0KLSAgICAgICAgaWYgKDB4MTEvKk9CSkVDVF9ERVNDUklQVE9SX0lEX1RBRyovICE9IGRlc2NyaXB0b3JUYWcpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICB1aW50OF90IGJ1ZmZlcls4XTsKLSAgICAgICAgLy9PYmplY3REZXNjcmlwdG9ySUQgYW5kIE9iamVjdERlc2NyaXB0b3IgdXJsIGZsYWcKLSAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQsIGJ1ZmZlciwgMikgPCAyKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YV9vZmZzZXQgKz0gMjsKLQotICAgICAgICBpZiAoKGJ1ZmZlclsxXSA+PiA1KSAmIDB4MDAwMSkgeyAvL3VybCBmbGFnIGlzIHNldAotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0LCBidWZmZXIsIDgpIDwgOCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICB9Ci0gICAgICAgIGRhdGFfb2Zmc2V0ICs9IDg7Ci0KLSAgICAgICAgaWYgKCgweDBGLypFU19JRF9SRUZfVEFHKi8gIT0gYnVmZmVyWzFdKQotICAgICAgICAgICAgICAgIHx8ICggMHgwQS8qSVBNUF9ERVNDUklQVE9SX1BPSU5URVJfSURfVEFHKi8gIT0gYnVmZmVyWzVdKSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIFNJTkYgKnNpbmYgPSBuZXcgU0lORjsKLSAgICAgICAgc2luZi0+dHJhY2tJRCA9IFUxNl9BVCgmYnVmZmVyWzNdKTsKLSAgICAgICAgc2luZi0+SVBNUERlc2NyaXB0b3JJRCA9IGJ1ZmZlcls3XTsKLSAgICAgICAgc2luZi0+bmV4dCA9IG1GaXJzdFNJTkY7Ci0gICAgICAgIG1GaXJzdFNJTkYgPSBzaW5mOwotCi0gICAgICAgIHNpemUgLT0gKDggKyAyICsgMSk7Ci0gICAgfQotCi0gICAgaWYgKHNpemUgIT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0LCAmdXBkYXRlSWRUYWcsIDEpIDwgMSkgewotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotICAgIGRhdGFfb2Zmc2V0ICsrOwotCi0gICAgaWYoMHgwNS8qSVBNUF9ERVNDUklQVE9SX1VQREFURV9JRF9UQUcqLyAhPSB1cGRhdGVJZFRhZykgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHNpemUgPSByZWFkU2l6ZShkYXRhX29mZnNldCwgbURhdGFTb3VyY2UsICZudW1PZkJ5dGVzKTsKLSAgICBpZiAoc2l6ZSA8IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLSAgICBkYXRhX29mZnNldCArPSBudW1PZkJ5dGVzOwotCi0gICAgd2hpbGUgKHNpemUgPiAwKSB7Ci0gICAgICAgIHVpbnQ4X3QgdGFnOwotICAgICAgICBpbnQzMl90IGRhdGFMZW47Ci0gICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0LCAmdGFnLCAxKSA8IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgfQotICAgICAgICBkYXRhX29mZnNldCArKzsKLQotICAgICAgICBpZiAoMHgwQi8qSVBNUF9ERVNDUklQVE9SX0lEX1RBRyovID09IHRhZykgewotICAgICAgICAgICAgdWludDhfdCBpZDsKLSAgICAgICAgICAgIGRhdGFMZW4gPSByZWFkU2l6ZShkYXRhX29mZnNldCwgbURhdGFTb3VyY2UsICZudW1PZkJ5dGVzKTsKLSAgICAgICAgICAgIGlmIChkYXRhTGVuIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YUxlbiA8IDQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGF0YV9vZmZzZXQgKz0gbnVtT2ZCeXRlczsKLQotICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQsICZpZCwgMSkgPCAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGF0YV9vZmZzZXQgKys7Ci0KLSAgICAgICAgICAgIFNJTkYgKnNpbmYgPSBtRmlyc3RTSU5GOwotICAgICAgICAgICAgd2hpbGUgKHNpbmYgJiYgKHNpbmYtPklQTVBEZXNjcmlwdG9ySUQgIT0gaWQpKSB7Ci0gICAgICAgICAgICAgICAgc2luZiA9IHNpbmYtPm5leHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2luZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNpbmYtPmxlbiA9IGRhdGFMZW4gLSAzOwotICAgICAgICAgICAgc2luZi0+SVBNUERhdGEgPSBuZXcgKHN0ZDo6bm90aHJvdykgY2hhcltzaW5mLT5sZW5dOwotICAgICAgICAgICAgaWYgKHNpbmYtPklQTVBEYXRhID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGF0YV9vZmZzZXQgKz0gMjsKLQotICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQsIHNpbmYtPklQTVBEYXRhLCBzaW5mLT5sZW4pIDwgc2luZi0+bGVuKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGF0YV9vZmZzZXQgKz0gc2luZi0+bGVuOwotCi0gICAgICAgICAgICBzaXplIC09IChkYXRhTGVuICsgbnVtT2ZCeXRlcyArIDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHNpemUgIT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHJldHVybiBVTktOT1dOX0VSUk9SOyAgLy8gUmV0dXJuIGEgZHVtbXkgZXJyb3IuCi19Ci0KLXN0cnVjdCBQYXRoQWRkZXIgewotICAgIFBhdGhBZGRlcihWZWN0b3I8dWludDMyX3Q+ICpwYXRoLCB1aW50MzJfdCBjaHVua1R5cGUpCi0gICAgICAgIDogbVBhdGgocGF0aCkgewotICAgICAgICBtUGF0aC0+cHVzaChjaHVua1R5cGUpOwotICAgIH0KLQotICAgIH5QYXRoQWRkZXIoKSB7Ci0gICAgICAgIG1QYXRoLT5wb3AoKTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgVmVjdG9yPHVpbnQzMl90PiAqbVBhdGg7Ci0KLSAgICBQYXRoQWRkZXIoY29uc3QgUGF0aEFkZGVyICYpOwotICAgIFBhdGhBZGRlciAmb3BlcmF0b3I9KGNvbnN0IFBhdGhBZGRlciAmKTsKLX07Ci0KLXN0YXRpYyBib29sIHVuZGVyTWV0YURhdGFQYXRoKGNvbnN0IFZlY3Rvcjx1aW50MzJfdD4gJnBhdGgpIHsKLSAgICByZXR1cm4gcGF0aC5zaXplKCkgPj0gNQotICAgICAgICAmJiBwYXRoWzBdID09IEZPVVJDQygnbScsICdvJywgJ28nLCAndicpCi0gICAgICAgICYmIHBhdGhbMV0gPT0gRk9VUkNDKCd1JywgJ2QnLCAndCcsICdhJykKLSAgICAgICAgJiYgcGF0aFsyXSA9PSBGT1VSQ0MoJ20nLCAnZScsICd0JywgJ2EnKQotICAgICAgICAmJiBwYXRoWzNdID09IEZPVVJDQygnaScsICdsJywgJ3MnLCAndCcpOwotfQotCi1zdGF0aWMgYm9vbCB1bmRlclFUTWV0YVBhdGgoY29uc3QgVmVjdG9yPHVpbnQzMl90PiAmcGF0aCwgaW50MzJfdCBkZXB0aCkgewotICAgIHJldHVybiBwYXRoLnNpemUoKSA+PSAyCi0gICAgICAgICAgICAmJiBwYXRoWzBdID09IEZPVVJDQygnbScsICdvJywgJ28nLCAndicpCi0gICAgICAgICAgICAmJiBwYXRoWzFdID09IEZPVVJDQygnbScsICdlJywgJ3QnLCAnYScpCi0gICAgICAgICAgICAmJiAoZGVwdGggPT0gMgotICAgICAgICAgICAgfHwgKGRlcHRoID09IDMKLSAgICAgICAgICAgICAgICAgICAgJiYgKHBhdGhbMl0gPT0gRk9VUkNDKCdoJywgJ2QnLCAnbCcsICdyJykKLSAgICAgICAgICAgICAgICAgICAgfHwgIHBhdGhbMl0gPT0gRk9VUkNDKCdpJywgJ2wnLCAncycsICd0JykKLSAgICAgICAgICAgICAgICAgICAgfHwgIHBhdGhbMl0gPT0gRk9VUkNDKCdrJywgJ2UnLCAneScsICdzJykpKSk7Ci19Ci0KLS8vIEdpdmVuIGEgdGltZSBpbiBzZWNvbmRzIHNpbmNlIEphbiAxIDE5MDQsIHByb2R1Y2UgYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcuCi1zdGF0aWMgYm9vbCBjb252ZXJ0VGltZVRvRGF0ZShpbnQ2NF90IHRpbWVfMTkwNCwgU3RyaW5nOCAqcykgewotICAgIC8vIGRlbHRhIGJldHdlZW4gbXBlZzQgdGltZSBhbmQgdW5peCBlcG9jaCB0aW1lCi0gICAgc3RhdGljIGNvbnN0IGludDY0X3QgZGVsdGEgPSAoKCg2NiAqIDM2NSArIDE3KSAqIDI0KSAqIDM2MDApOwotICAgIGlmICh0aW1lXzE5MDQgPCBJTlQ2NF9NSU4gKyBkZWx0YSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHRpbWVfdCB0aW1lXzE5NzAgPSB0aW1lXzE5MDQgLSBkZWx0YTsKLQotICAgIGNoYXIgdG1wWzMyXTsKLSAgICBzdHJ1Y3QgdG0qIHRtID0gZ210aW1lKCZ0aW1lXzE5NzApOwotICAgIGlmICh0bSAhPSBOVUxMICYmCi0gICAgICAgICAgICBzdHJmdGltZSh0bXAsIHNpemVvZih0bXApLCAiJVklbSVkVCVIJU0lUy4wMDBaIiwgdG0pID4gMCkgewotICAgICAgICBzLT5zZXRUbyh0bXApOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VDaHVuayhvZmY2NF90ICpvZmZzZXQsIGludCBkZXB0aCkgewotICAgIEFMT0dWKCJlbnRlcmluZyBwYXJzZUNodW5rICVsbGQvJWQiLCAobG9uZyBsb25nKSpvZmZzZXQsIGRlcHRoKTsKLQotICAgIGlmICgqb2Zmc2V0IDwgMCkgewotICAgICAgICBBTE9HRSgiYi8yMzU0MDkxNCIpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICBpZiAoZGVwdGggPiAxMDApIHsKLSAgICAgICAgQUxPR0UoImIvMjc0NTYyOTkiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0gICAgdWludDMyX3QgaGRyWzJdOwotICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KCpvZmZzZXQsIGhkciwgOCkgPCA4KSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0gICAgdWludDY0X3QgY2h1bmtfc2l6ZSA9IG50b2hsKGhkclswXSk7Ci0gICAgaW50MzJfdCBjaHVua190eXBlID0gbnRvaGwoaGRyWzFdKTsKLSAgICBvZmY2NF90IGRhdGFfb2Zmc2V0ID0gKm9mZnNldCArIDg7Ci0KLSAgICBpZiAoY2h1bmtfc2l6ZSA9PSAxKSB7Ci0gICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KCpvZmZzZXQgKyA4LCAmY2h1bmtfc2l6ZSwgOCkgPCA4KSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgIH0KLSAgICAgICAgY2h1bmtfc2l6ZSA9IG50b2g2NChjaHVua19zaXplKTsKLSAgICAgICAgZGF0YV9vZmZzZXQgKz0gODsKLQotICAgICAgICBpZiAoY2h1bmtfc2l6ZSA8IDE2KSB7Ci0gICAgICAgICAgICAvLyBUaGUgc21hbGxlc3QgdmFsaWQgY2h1bmsgaXMgMTYgYnl0ZXMgbG9uZyBpbiB0aGlzIGNhc2UuCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChjaHVua19zaXplID09IDApIHsKLSAgICAgICAgaWYgKGRlcHRoID09IDApIHsKLSAgICAgICAgICAgIC8vIGF0b20gZXh0ZW5kcyB0byBlbmQgb2YgZmlsZQotICAgICAgICAgICAgb2ZmNjRfdCBzb3VyY2VTaXplOwotICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5nZXRTaXplKCZzb3VyY2VTaXplKSA9PSBPSykgewotICAgICAgICAgICAgICAgIGNodW5rX3NpemUgPSAoc291cmNlU2l6ZSAtICpvZmZzZXQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBYWFggY291bGQgd2UganVzdCBwaWNrIGEgInN1ZmZpY2llbnRseSBsYXJnZSIgdmFsdWUgaGVyZT8KLSAgICAgICAgICAgICAgICBBTE9HRSgiYXRvbSBzaXplIGlzIDAsIGFuZCBkYXRhIHNvdXJjZSBoYXMgbm8gc2l6ZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBub3QgYWxsb3dlZCBmb3Igbm9uLXRvcGxldmVsIGF0b21zLCBza2lwIGl0Ci0gICAgICAgICAgICAqb2Zmc2V0ICs9IDQ7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGNodW5rX3NpemUgPCA4KSB7Ci0gICAgICAgIC8vIFRoZSBzbWFsbGVzdCB2YWxpZCBjaHVuayBpcyA4IGJ5dGVzIGxvbmcuCi0gICAgICAgIEFMT0dFKCJpbnZhbGlkIGNodW5rIHNpemU6ICUiIFBSSXU2NCwgY2h1bmtfc2l6ZSk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgY2hhciBjaHVua1s1XTsKLSAgICBNYWtlRm91ckNDU3RyaW5nKGNodW5rX3R5cGUsIGNodW5rKTsKLSAgICBBTE9HVigiY2h1bms6ICVzIEAgJWxsZCwgJWQiLCBjaHVuaywgKGxvbmcgbG9uZykqb2Zmc2V0LCBkZXB0aCk7Ci0KLSAgICBpZiAoa1VzZUhleER1bXApIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIga1doaXRlc3BhY2VbXSA9ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKLSAgICAgICAgY29uc3QgY2hhciAqaW5kZW50ID0gJmtXaGl0ZXNwYWNlW3NpemVvZihrV2hpdGVzcGFjZSkgLSAxIC0gMiAqIGRlcHRoXTsKLSAgICAgICAgcHJpbnRmKCIlc2ZvdW5kIGNodW5rICclcycgb2Ygc2l6ZSAlIiBQUkl1NjQgIlxuIiwgaW5kZW50LCBjaHVuaywgY2h1bmtfc2l6ZSk7Ci0KLSAgICAgICAgY2hhciBidWZmZXJbMjU2XTsKLSAgICAgICAgc2l6ZV90IG4gPSBjaHVua19zaXplOwotICAgICAgICBpZiAobiA+IHNpemVvZihidWZmZXIpKSB7Ci0gICAgICAgICAgICBuID0gc2l6ZW9mKGJ1ZmZlcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgYnVmZmVyLCBuKQotICAgICAgICAgICAgICAgIDwgKHNzaXplX3QpbikgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICB9Ci0KLSAgICAgICAgaGV4ZHVtcChidWZmZXIsIG4pOwotICAgIH0KLQotICAgIFBhdGhBZGRlciBhdXRvQWRkZXIoJm1QYXRoLCBjaHVua190eXBlKTsKLQotICAgIC8vIChkYXRhX29mZnNldCAtICpvZmZzZXQpIGlzIGVpdGhlciA4IG9yIDE2Ci0gICAgb2ZmNjRfdCBjaHVua19kYXRhX3NpemUgPSBjaHVua19zaXplIC0gKGRhdGFfb2Zmc2V0IC0gKm9mZnNldCk7Ci0gICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDApIHsKLSAgICAgICAgQUxPR0UoImIvMjM1NDA5MTQiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0gICAgaWYgKGNodW5rX3R5cGUgIT0gRk9VUkNDKCdtJywgJ2QnLCAnYScsICd0JykgJiYgY2h1bmtfZGF0YV9zaXplID4ga01heEF0b21TaXplKSB7Ci0gICAgICAgIGNoYXIgZXJyTXNnWzEwMF07Ci0gICAgICAgIHNwcmludGYoZXJyTXNnLCAiJXMgYXRvbSBoYXMgc2l6ZSAlIiBQUklkNjQsIGNodW5rLCBjaHVua19kYXRhX3NpemUpOwotICAgICAgICBBTE9HRSgiJXMgKGIvMjg2MTU0NDgpIiwgZXJyTXNnKTsKLSAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlV2l0aEluZm9Mb2coMHg1MzRlNDU1NCwgIjI4NjE1NDQ4IiwgLTEsIGVyck1zZywgc3RybGVuKGVyck1zZykpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmIChjaHVua190eXBlICE9IEZPVVJDQygnYycsICdwJywgJ3InLCAndCcpCi0gICAgICAgICAgICAmJiBjaHVua190eXBlICE9IEZPVVJDQygnYycsICdvJywgJ3YnLCAncicpCi0gICAgICAgICAgICAmJiBtUGF0aC5zaXplKCkgPT0gNSAmJiB1bmRlck1ldGFEYXRhUGF0aChtUGF0aCkpIHsKLSAgICAgICAgb2ZmNjRfdCBzdG9wX29mZnNldCA9ICpvZmZzZXQgKyBjaHVua19zaXplOwotICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQ7Ci0gICAgICAgIHdoaWxlICgqb2Zmc2V0IDwgc3RvcF9vZmZzZXQpIHsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsob2Zmc2V0LCBkZXB0aCArIDEpOwotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKm9mZnNldCAhPSBzdG9wX29mZnNldCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBzd2l0Y2goY2h1bmtfdHlwZSkgewotICAgICAgICBjYXNlIEZPVVJDQygnbScsICdvJywgJ28nLCAndicpOgotICAgICAgICBjYXNlIEZPVVJDQygndCcsICdyJywgJ2EnLCAnaycpOgotICAgICAgICBjYXNlIEZPVVJDQygnbScsICdkJywgJ2knLCAnYScpOgotICAgICAgICBjYXNlIEZPVVJDQygnbScsICdpJywgJ24nLCAnZicpOgotICAgICAgICBjYXNlIEZPVVJDQygnZCcsICdpJywgJ24nLCAnZicpOgotICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ2InLCAnbCcpOgotICAgICAgICBjYXNlIEZPVVJDQygnbScsICd2JywgJ2UnLCAneCcpOgotICAgICAgICBjYXNlIEZPVVJDQygnbScsICdvJywgJ28nLCAnZicpOgotICAgICAgICBjYXNlIEZPVVJDQygndCcsICdyJywgJ2EnLCAnZicpOgotICAgICAgICBjYXNlIEZPVVJDQygnbScsICdmJywgJ3InLCAnYScpOgotICAgICAgICBjYXNlIEZPVVJDQygndScsICdkJywgJ3QnLCAnYScpOgotICAgICAgICBjYXNlIEZPVVJDQygnaScsICdsJywgJ3MnLCAndCcpOgotICAgICAgICBjYXNlIEZPVVJDQygncycsICdpJywgJ24nLCAnZicpOgotICAgICAgICBjYXNlIEZPVVJDQygncycsICdjJywgJ2gnLCAnaScpOgotICAgICAgICBjYXNlIEZPVVJDQygnZScsICdkJywgJ3QnLCAncycpOgotICAgICAgICBjYXNlIEZPVVJDQygndycsICdhJywgJ3YnLCAnZScpOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ3YnKSAmJiBkZXB0aCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIm1vb3Y6IGRlcHRoICVkIiwgZGVwdGgpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygnbScsICdvJywgJ28nLCAndicpICYmIG1Jbml0Q2hlY2sgPT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiZHVwbGljYXRlIG1vb3YiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ2YnKSAmJiAhbU1vb2ZGb3VuZCkgewotICAgICAgICAgICAgICAgIC8vIHN0b3JlIHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IHNlZ21lbnQKLSAgICAgICAgICAgICAgICBtTW9vZkZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtTW9vZk9mZnNldCA9ICpvZmZzZXQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygncycsICd0JywgJ2InLCAnbCcpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInNhbXBsZVRhYmxlIGNodW5rIGlzICUiIFBSSXU2NCAiIGJ5dGVzIGxvbmcuIiwgY2h1bmtfc2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPmZsYWdzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICYgKERhdGFTb3VyY2U6OmtXYW50c1ByZWZldGNoaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEYXRhU291cmNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3A8TVBFRzREYXRhU291cmNlPiBjYWNoZWRTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1QRUc0RGF0YVNvdXJjZShtRGF0YVNvdXJjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZFNvdXJjZS0+c2V0Q2FjaGVkUmFuZ2UoKm9mZnNldCwgY2h1bmtfc2l6ZSkgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EYXRhU291cmNlID0gY2FjaGVkU291cmNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID0gbmV3IFNhbXBsZVRhYmxlKG1EYXRhU291cmNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbCBpc1RyYWNrID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ3QnLCAncicsICdhJywgJ2snKSkgewotICAgICAgICAgICAgICAgIGlmIChkZXB0aCAhPSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJ0cmFrOiBkZXB0aCAlZCIsIGRlcHRoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaXNUcmFjayA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICBUcmFjayAqdHJhY2sgPSBuZXcgVHJhY2s7Ci0gICAgICAgICAgICAgICAgdHJhY2stPm5leHQgPSBOVUxMOwotICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm5leHQgPSB0cmFjazsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtRmlyc3RUcmFjayA9IHRyYWNrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrID0gdHJhY2s7Ci0KLSAgICAgICAgICAgICAgICB0cmFjay0+bWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICAgICAgICAgICAgICB0cmFjay0+aW5jbHVkZXNfZXhwZW5zaXZlX21ldGFkYXRhID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgdHJhY2stPnNraXBUcmFjayA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHRyYWNrLT50aW1lc2NhbGUgPSAwOwotICAgICAgICAgICAgICAgIHRyYWNrLT5tZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvZmY2NF90IHN0b3Bfb2Zmc2V0ID0gKm9mZnNldCArIGNodW5rX3NpemU7Ci0gICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQ7Ci0gICAgICAgICAgICB3aGlsZSAoKm9mZnNldCA8IHN0b3Bfb2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuayhvZmZzZXQsIGRlcHRoICsgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXNUcmFjaykgewotICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2tpcFRyYWNrID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKm9mZnNldCAhPSBzdG9wX29mZnNldCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpc1RyYWNrKSB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCB0cmFja0lkOwotICAgICAgICAgICAgICAgIC8vIFRoZXJlIG11c3QgYmUgZXhhY3Qgb25lIHRyYWNrIGhlYWRlciBwZXIgdHJhY2suCi0gICAgICAgICAgICAgICAgaWYgKCFtTGFzdFRyYWNrLT5tZXRhLT5maW5kSW50MzIoa0tleVRyYWNrSUQsICZ0cmFja0lkKSkgewotICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5za2lwVHJhY2sgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHZlcmlmeVRyYWNrKG1MYXN0VHJhY2spOwotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2tpcFRyYWNrID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjay0+c2tpcFRyYWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRyYWNrICpjdXIgPSBtRmlyc3RUcmFjazsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoY3VyID09IG1MYXN0VHJhY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjdXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRmlyc3RUcmFjayA9IG1MYXN0VHJhY2sgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGN1ciAmJiBjdXItPm5leHQgIT0gbUxhc3RUcmFjaykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ciA9IGN1ci0+bmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXItPm5leHQgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1MYXN0VHJhY2s7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrID0gY3VyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ3YnKSkgewotICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBPSzsKLQotICAgICAgICAgICAgICAgIGlmICghbUlzRHJtKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOyAgLy8gUmV0dXJuIGEgZHVtbXkgZXJyb3IuCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2UnLCAnbCcsICdzJywgJ3QnKToKLSAgICAgICAgewotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotCi0gICAgICAgICAgICAvLyBTZWUgMTQ0OTYtMTIgOC42LjYKLSAgICAgICAgICAgIHVpbnQ4X3QgdmVyc2lvbjsKLSAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0LCAmdmVyc2lvbiwgMSkgPCAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1aW50MzJfdCBlbnRyeV9jb3VudDsKLSAgICAgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihkYXRhX29mZnNldCArIDQsICZlbnRyeV9jb3VudCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlbnRyeV9jb3VudCAhPSAxKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2Ugb25seSBzdXBwb3J0IGEgc2luZ2xlIGVudHJ5IGF0IHRoZSBtb21lbnQsIGZvciBnYXBsZXNzIHBsYXliYWNrCi0gICAgICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nIGVkaXQgbGlzdCB3aXRoICVkIGVudHJpZXMiLCBlbnRyeV9jb3VudCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1IZWFkZXJUaW1lc2NhbGUgPT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJpZ25vcmluZyBlZGl0IGxpc3QgYmVjYXVzZSB0aW1lc2NhbGUgaXMgMCIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvZmY2NF90IGVudHJpZXNvZmZzZXQgPSBkYXRhX29mZnNldCArIDg7Ci0gICAgICAgICAgICAgICAgdWludDY0X3Qgc2VnbWVudF9kdXJhdGlvbjsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IG1lZGlhX3RpbWU7Ci0KLSAgICAgICAgICAgICAgICBpZiAodmVyc2lvbiA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQ2NChlbnRyaWVzb2Zmc2V0LCAmc2VnbWVudF9kdXJhdGlvbikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbURhdGFTb3VyY2UtPmdldFVJbnQ2NChlbnRyaWVzb2Zmc2V0ICsgOCwgKHVpbnQ2NF90KikmbWVkaWFfdGltZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNkOwotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG10OwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIoZW50cmllc29mZnNldCwgJnNkKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKGVudHJpZXNvZmZzZXQgKyA0LCAodWludDMyX3QqKSZtdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZWdtZW50X2R1cmF0aW9uID0gc2Q7Ci0gICAgICAgICAgICAgICAgICAgIG1lZGlhX3RpbWUgPSBtdDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdWludDY0X3QgaGFsZnNjYWxlID0gbUhlYWRlclRpbWVzY2FsZSAvIDI7Ci0gICAgICAgICAgICAgICAgc2VnbWVudF9kdXJhdGlvbiA9IChzZWdtZW50X2R1cmF0aW9uICogMTAwMDAwMCArIGhhbGZzY2FsZSkvIG1IZWFkZXJUaW1lc2NhbGU7Ci0gICAgICAgICAgICAgICAgbWVkaWFfdGltZSA9IChtZWRpYV90aW1lICogMTAwMDAwMCArIGhhbGZzY2FsZSkgLyBtSGVhZGVyVGltZXNjYWxlOwotCi0gICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvbjsKLSAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXJhdGU7Ci0gICAgICAgICAgICAgICAgaWYgKCFtTGFzdFRyYWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrLT5tZXRhLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb24pICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVyYXRlKSkgewotCi0gICAgICAgICAgICAgICAgICAgIGludDY0X3QgZGVsYXkgPSAobWVkaWFfdGltZSAgKiBzYW1wbGVyYXRlICsgNTAwMDAwKSAvIDEwMDAwMDA7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlFbmNvZGVyRGVsYXksIGRlbGF5KTsKLQotICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBhZGRpbmd1cyA9IGR1cmF0aW9uIC0gKGludDY0X3QpKHNlZ21lbnRfZHVyYXRpb24gKyBtZWRpYV90aW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhZGRpbmd1cyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyYWNrIGR1cmF0aW9uIGZyb20gbWVkaWEgaGVhZGVyICh3aGljaCBpcyB3aGF0IGtLZXlEdXJhdGlvbiBpcykgbWlnaHQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlIHNsaWdodGx5IHNob3J0ZXIgdGhhbiB0aGUgc2VnbWVudCBkdXJhdGlvbiwgd2hpY2ggd291bGQgbWFrZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhZGRpbmcgbmVnYXRpdmUuIENsYW1wIHRvIHplcm8uCi0gICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5ndXMgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGludDY0X3QgcGFkZGluZ3NhbXBsZXMgPSAocGFkZGluZ3VzICogc2FtcGxlcmF0ZSArIDUwMDAwMCkgLyAxMDAwMDAwOwotICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5RW5jb2RlclBhZGRpbmcsIHBhZGRpbmdzYW1wbGVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRk9VUkNDKCdmJywgJ3InLCAnbScsICdhJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLQotICAgICAgICAgICAgdWludDMyX3Qgb3JpZ2luYWxfZm91cmNjOwotICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQsICZvcmlnaW5hbF9mb3VyY2MsIDQpIDwgNCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9yaWdpbmFsX2ZvdXJjYyA9IG50b2hsKG9yaWdpbmFsX2ZvdXJjYyk7Ci0gICAgICAgICAgICBBTE9HVigicmVhZCBvcmlnaW5hbCBmb3JtYXQ6ICVkIiwgb3JpZ2luYWxfZm91cmNjKTsKLQotICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBGb3VyQ0MyTUlNRShvcmlnaW5hbF9mb3VyY2MpKTsKLSAgICAgICAgICAgIHVpbnQzMl90IG51bV9jaGFubmVscyA9IDA7Ci0gICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVfcmF0ZSA9IDA7Ci0gICAgICAgICAgICBpZiAoQWRqdXN0Q2hhbm5lbHNBbmRSYXRlKG9yaWdpbmFsX2ZvdXJjYywgJm51bV9jaGFubmVscywgJnNhbXBsZV9yYXRlKSkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bV9jaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZV9yYXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAnZScsICduJywgJ2MnKToKLSAgICAgICAgewotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotCi0gICAgICAgICAgICBpZiAoY2h1bmtfc2l6ZSA8IDMyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gdGVuYyBib3ggY29udGFpbnMgMSBieXRlIHZlcnNpb24sIDMgYnl0ZSBmbGFncywgMyBieXRlIGRlZmF1bHQgYWxnb3JpdGhtIGlkLCBvbmUgYnl0ZQotICAgICAgICAgICAgLy8gZGVmYXVsdCBJViBzaXplLCAxNiBieXRlcyBkZWZhdWx0IEtleUlECi0gICAgICAgICAgICAvLyAoSVNPIDIzMDAxLTcpCi0gICAgICAgICAgICBjaGFyIGJ1Zls0XTsKLSAgICAgICAgICAgIG1lbXNldChidWYsIDAsIDQpOwotICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQgKyA0LCBidWYgKyAxLCAzKSA8IDMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1aW50MzJfdCBkZWZhdWx0QWxnb3JpdGhtSWQgPSBudG9obCgqKChpbnQzMl90KilidWYpKTsKLSAgICAgICAgICAgIGlmIChkZWZhdWx0QWxnb3JpdGhtSWQgPiAxKSB7Ci0gICAgICAgICAgICAgICAgLy8gb25seSAwIChjbGVhcikgYW5kIDEgKEFFUy0xMjgpIGFyZSB2YWxpZAotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1lbXNldChidWYsIDAsIDQpOwotICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQgKyA3LCBidWYgKyAzLCAxKSA8IDEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1aW50MzJfdCBkZWZhdWx0SVZTaXplID0gbnRvaGwoKigoaW50MzJfdCopYnVmKSk7Ci0KLSAgICAgICAgICAgIGlmICgoZGVmYXVsdEFsZ29yaXRobUlkID09IDAgJiYgZGVmYXVsdElWU2l6ZSAhPSAwKSB8fAotICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdEFsZ29yaXRobUlkICE9IDAgJiYgZGVmYXVsdElWU2l6ZSA9PSAwKSkgewotICAgICAgICAgICAgICAgIC8vIG9ubHkgdW5lbmNyeXB0ZWQgZGF0YSBtdXN0IGhhdmUgMCBJViBzaXplCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVmYXVsdElWU2l6ZSAhPSAwICYmCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRJVlNpemUgIT0gOCAmJgotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0SVZTaXplICE9IDE2KSB7Ci0gICAgICAgICAgICAgICAgLy8gb25seSBzdXBwb3J0ZWQgc2l6ZXMgYXJlIDAsIDggYW5kIDE2Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdWludDhfdCBkZWZhdWx0S2V5SWRbMTZdOwotCi0gICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCArIDgsICZkZWZhdWx0S2V5SWQsIDE2KSA8IDE2KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0KLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlDcnlwdG9Nb2RlLCBkZWZhdWx0QWxnb3JpdGhtSWQpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUNyeXB0b0RlZmF1bHRJVlNpemUsIGRlZmF1bHRJVlNpemUpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0RGF0YShrS2V5Q3J5cHRvS2V5LCAndGVuYycsIGRlZmF1bHRLZXlJZCwgMTYpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEZPVVJDQygndCcsICdrJywgJ2gnLCAnZCcpOgotICAgICAgICB7Ci0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGVycjsKLSAgICAgICAgICAgIGlmICgoZXJyID0gcGFyc2VUcmFja0hlYWRlcihkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKSkgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRk9VUkNDKCdwJywgJ3MnLCAncycsICdoJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLQotICAgICAgICAgICAgUHNzaEluZm8gcHNzaDsKLQotICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQgKyA0LCAmcHNzaC51dWlkLCAxNikgPCAxNikgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdWludDMyX3QgcHNzaGRhdGFsZW4gPSAwOwotICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQgKyAyMCwgJnBzc2hkYXRhbGVuLCA0KSA8IDQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwc3NoLmRhdGFsZW4gPSBudG9obChwc3NoZGF0YWxlbik7Ci0gICAgICAgICAgICBBTE9HVigicHNzaCBkYXRhIHNpemU6ICVkIiwgcHNzaC5kYXRhbGVuKTsKLSAgICAgICAgICAgIGlmIChjaHVua19zaXplIDwgMjAgfHwgcHNzaC5kYXRhbGVuID4gY2h1bmtfc2l6ZSAtIDIwKSB7Ci0gICAgICAgICAgICAgICAgLy8gcHNzaCBkYXRhIGxlbmd0aCBleGNlZWRzIHNpemUgb2YgY29udGFpbmluZyBib3gKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwc3NoLmRhdGEgPSBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtwc3NoLmRhdGFsZW5dOwotICAgICAgICAgICAgaWYgKHBzc2guZGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJhbGxvY2F0ZWQgcHNzaCBAICVwIiwgcHNzaC5kYXRhKTsKLSAgICAgICAgICAgIHNzaXplX3QgcmVxdWVzdGVkID0gKHNzaXplX3QpIHBzc2guZGF0YWxlbjsKLSAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0ICsgMjQsIHBzc2guZGF0YSwgcmVxdWVzdGVkKSA8IHJlcXVlc3RlZCkgewotICAgICAgICAgICAgICAgIGRlbGV0ZVtdIHBzc2guZGF0YTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUHNzaC5wdXNoX2JhY2socHNzaCk7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZCcsICdoJywgJ2QnKToKLSAgICAgICAgewotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotCi0gICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgNCB8fCBtTGFzdFRyYWNrID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1aW50OF90IHZlcnNpb247Ci0gICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCAmdmVyc2lvbiwgc2l6ZW9mKHZlcnNpb24pKQotICAgICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZih2ZXJzaW9uKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb2ZmNjRfdCB0aW1lc2NhbGVfb2Zmc2V0OwotCi0gICAgICAgICAgICBpZiAodmVyc2lvbiA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgdGltZXNjYWxlX29mZnNldCA9IGRhdGFfb2Zmc2V0ICsgNCArIDE2OwotICAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDApIHsKLSAgICAgICAgICAgICAgICB0aW1lc2NhbGVfb2Zmc2V0ID0gZGF0YV9vZmZzZXQgKyA0ICsgODsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1aW50MzJfdCB0aW1lc2NhbGU7Ci0gICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzY2FsZV9vZmZzZXQsICZ0aW1lc2NhbGUsIHNpemVvZih0aW1lc2NhbGUpKQotICAgICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZih0aW1lc2NhbGUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXRpbWVzY2FsZSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJ0aW1lc2NhbGUgc2hvdWxkIG5vdCBiZSBaRVJPLiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1MYXN0VHJhY2stPnRpbWVzY2FsZSA9IG50b2hsKHRpbWVzY2FsZSk7Ci0KLSAgICAgICAgICAgIC8vIDE0NDk2LTEyIHNheXMgYWxsIG9uZXMgbWVhbnMgaW5kZXRlcm1pbmF0ZSwgYnV0IHNvbWUgZmlsZXMgc2VlbSB0byB1c2UKLSAgICAgICAgICAgIC8vIDAgaW5zdGVhZC4gV2UgdHJlYXQgYm90aCB0aGUgc2FtZS4KLSAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb24gPSAwOwotICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gMSkgewotICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzY2FsZV9vZmZzZXQgKyA0LCAmZHVyYXRpb24sIHNpemVvZihkdXJhdGlvbikpCi0gICAgICAgICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihkdXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBudG9oNjQoZHVyYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgZHVyYXRpb24zMjsKLSAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc2NhbGVfb2Zmc2V0ICsgNCwgJmR1cmF0aW9uMzIsIHNpemVvZihkdXJhdGlvbjMyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIDwgKHNzaXplX3Qpc2l6ZW9mKGR1cmF0aW9uMzIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGR1cmF0aW9uMzIgIT0gMHhmZmZmZmZmZikgewotICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IG50b2hsKGR1cmF0aW9uMzIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkdXJhdGlvbiAhPSAwICYmIG1MYXN0VHJhY2stPnRpbWVzY2FsZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sIChkdXJhdGlvbiAqIDEwMDAwMDApIC8gbUxhc3RUcmFjay0+dGltZXNjYWxlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdWludDhfdCBsYW5nWzJdOwotICAgICAgICAgICAgb2ZmNjRfdCBsYW5nX29mZnNldDsKLSAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IDEpIHsKLSAgICAgICAgICAgICAgICBsYW5nX29mZnNldCA9IHRpbWVzY2FsZV9vZmZzZXQgKyA0ICsgODsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbGFuZ19vZmZzZXQgPSB0aW1lc2NhbGVfb2Zmc2V0ICsgNCArIDQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQobGFuZ19vZmZzZXQsICZsYW5nLCBzaXplb2YobGFuZykpCi0gICAgICAgICAgICAgICAgICAgIDwgKHNzaXplX3Qpc2l6ZW9mKGxhbmcpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBUbyBnZXQgdGhlIElTTy02MzktMi9UIHRocmVlIGNoYXJhY3RlciBsYW5ndWFnZSBjb2RlCi0gICAgICAgICAgICAvLyAxIGJpdCBwYWQgZm9sbG93ZWQgYnkgMyA1LWJpdHMgY2hhcmFjdGVycy4gRWFjaCBjaGFyYWN0ZXIKLSAgICAgICAgICAgIC8vIGlzIHBhY2tlZCBhcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGl0cyBBU0NJSSB2YWx1ZSBhbmQgMHg2MC4KLSAgICAgICAgICAgIGNoYXIgbGFuZ19jb2RlWzRdOwotICAgICAgICAgICAgbGFuZ19jb2RlWzBdID0gKChsYW5nWzBdID4+IDIpICYgMHgxZikgKyAweDYwOwotICAgICAgICAgICAgbGFuZ19jb2RlWzFdID0gKChsYW5nWzBdICYgMHgzKSA8PCAzIHwgKGxhbmdbMV0gPj4gNSkpICsgMHg2MDsKLSAgICAgICAgICAgIGxhbmdfY29kZVsyXSA9IChsYW5nWzFdICYgMHgxZikgKyAweDYwOwotICAgICAgICAgICAgbGFuZ19jb2RlWzNdID0gJ1wwJzsKLQotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0Q1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAga0tleU1lZGlhTGFuZ3VhZ2UsIGxhbmdfY29kZSk7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAndCcsICdzJywgJ2QnKToKLSAgICAgICAgewotICAgICAgICAgICAgdWludDhfdCBidWZmZXJbOF07Ci0gICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgKG9mZjY0X3Qpc2l6ZW9mKGJ1ZmZlcikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXIsIDgpIDwgOCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKFUzMl9BVChidWZmZXIpICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyBTaG91bGQgYmUgdmVyc2lvbiAwLCBmbGFncyAwLgotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IGVudHJ5X2NvdW50ID0gVTMyX0FUKCZidWZmZXJbNF0pOwotCi0gICAgICAgICAgICBpZiAoZW50cnlfY291bnQgPiAxKSB7Ci0gICAgICAgICAgICAgICAgLy8gRm9yIDNHUFAgdGltZWQgdGV4dCwgdGhlcmUgY291bGQgYmUgbXVsdGlwbGUgdHgzZyBib3hlcyBjb250YWluCi0gICAgICAgICAgICAgICAgLy8gbXVsdGlwbGUgdGV4dCBkaXNwbGF5IGZvcm1hdHMuIFRoZXNlIGZvcm1hdHMgd2lsbCBiZSB1c2VkIHRvCi0gICAgICAgICAgICAgICAgLy8gZGlzcGxheSB0aGUgdGltZWQgdGV4dC4KLSAgICAgICAgICAgICAgICAvLyBGb3IgZW5jcnlwdGVkIGZpbGVzLCB0aGVyZSBtYXkgYWxzbyBiZSBtb3JlIHRoYW4gb25lIGVudHJ5LgotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0KLSAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotCi0gICAgICAgICAgICAgICAgQ0hFQ0sobUxhc3RUcmFjay0+bWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwotICAgICAgICAgICAgICAgIGlmIChzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNhc2VjbXAobWltZSwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZvciBub3cgd2Ugb25seSBzdXBwb3J0IGEgc2luZ2xlIHR5cGUgb2YgbWVkaWEgcGVyIHRyYWNrLgotICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5za2lwVHJhY2sgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9mZjY0X3Qgc3RvcF9vZmZzZXQgPSAqb2Zmc2V0ICsgY2h1bmtfc2l6ZTsKLSAgICAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldCArIDg7Ci0gICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZW50cnlfY291bnQ7ICsraSkgewotICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsob2Zmc2V0LCBkZXB0aCArIDEpOwotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgqb2Zmc2V0ICE9IHN0b3Bfb2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2UnLCAndCcsICd0Jyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLQotICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotCi0gICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihjaHVua19kYXRhX3NpemUpOwotICAgICAgICAgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXItPmRhdGEoKSwgY2h1bmtfZGF0YV9zaXplKSA8IGNodW5rX2RhdGFfc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nOCBtaW1lRm9ybWF0KChjb25zdCBjaGFyICopKGJ1ZmZlci0+ZGF0YSgpKSwgY2h1bmtfZGF0YV9zaXplKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtaW1lRm9ybWF0LnN0cmluZygpKTsKLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEZPVVJDQygnbScsICdwJywgJzQnLCAnYScpOgotICAgICAgICBjYXNlIEZPVVJDQygnZScsICduJywgJ2MnLCAnYScpOgotICAgICAgICBjYXNlIEZPVVJDQygncycsICdhJywgJ20nLCAncicpOgotICAgICAgICBjYXNlIEZPVVJDQygncycsICdhJywgJ3cnLCAnYicpOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobUlzUVQgJiYgY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ2EnKQotICAgICAgICAgICAgICAgICAgICAmJiBkZXB0aCA+PSAxICYmIG1QYXRoW2RlcHRoIC0gMV0gPT0gRk9VUkNDKCd3JywgJ2EnLCAndicsICdlJykpIHsKLSAgICAgICAgICAgICAgICAvLyBJZ25vcmUgbXA0YSBlbWJlZGRlZCBpbiBRVCB3YXZlIGF0b20KLSAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVpbnQ4X3QgYnVmZmVyWzggKyAyMF07Ci0gICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgKHNzaXplX3Qpc2l6ZW9mKGJ1ZmZlcikpIHsKLSAgICAgICAgICAgICAgICAvLyBCYXNpYyBBdWRpb1NhbXBsZUVudHJ5IHNpemUuCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSkgPCAoc3NpemVfdClzaXplb2YoYnVmZmVyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdWludDE2X3QgZGF0YV9yZWZfaW5kZXggX191bnVzZWQgPSBVMTZfQVQoJmJ1ZmZlcls2XSk7Ci0gICAgICAgICAgICB1aW50MTZfdCB2ZXJzaW9uID0gVTE2X0FUKCZidWZmZXJbOF0pOwotICAgICAgICAgICAgdWludDMyX3QgbnVtX2NoYW5uZWxzID0gVTE2X0FUKCZidWZmZXJbMTZdKTsKLQotICAgICAgICAgICAgdWludDE2X3Qgc2FtcGxlX3NpemUgPSBVMTZfQVQoJmJ1ZmZlclsxOF0pOwotICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlX3JhdGUgPSBVMzJfQVQoJmJ1ZmZlclsyNF0pID4+IDE2OwotCi0gICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0KLSAgICAgICAgICAgIG9mZjY0X3Qgc3RvcF9vZmZzZXQgPSAqb2Zmc2V0ICsgY2h1bmtfc2l6ZTsKLSAgICAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldCArIHNpemVvZihidWZmZXIpOwotCi0gICAgICAgICAgICBpZiAobUlzUVQgJiYgY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ2EnKSkgewotICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgYnVmZmVyLCAxNikgPCAxNikgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSNpZiAwCi0gICAgICAgICAgICAgICAgICAgIFUzMl9BVChidWZmZXIpOyAgLy8gc2FtcGxlcyBwZXIgcGFja2V0Ci0gICAgICAgICAgICAgICAgICAgIFUzMl9BVCgmYnVmZmVyWzRdKTsgIC8vIGJ5dGVzIHBlciBwYWNrZXQKLSAgICAgICAgICAgICAgICAgICAgVTMyX0FUKCZidWZmZXJbOF0pOyAgLy8gYnl0ZXMgcGVyIGZyYW1lCi0gICAgICAgICAgICAgICAgICAgIFUzMl9BVCgmYnVmZmVyWzEyXSk7ICAvLyBieXRlcyBwZXIgc2FtcGxlCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgKm9mZnNldCArPSAxNjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb24gPT0gMikgewotICAgICAgICAgICAgICAgICAgICB1aW50OF90IHYyYnVmZmVyWzM2XTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgdjJidWZmZXIsIDM2KSA8IDM2KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotI2lmIDAKLSAgICAgICAgICAgICAgICAgICAgVTMyX0FUKHYyYnVmZmVyKTsgIC8vIHNpemUgb2Ygc3RydWN0IG9ubHkKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3JhdGUgPSAodWludDMyX3QpVTY0X0FUKCZ2MmJ1ZmZlcls0XSk7ICAvLyBhdWRpbyBzYW1wbGUgcmF0ZQotICAgICAgICAgICAgICAgICAgICBudW1fY2hhbm5lbHMgPSBVMzJfQVQoJnYyYnVmZmVyWzEyXSk7ICAvLyBudW0gYXVkaW8gY2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgVTMyX0FUKCZ2MmJ1ZmZlclsxNl0pOyAgLy8gYWx3YXlzIDB4N2YwMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3NpemUgPSAodWludDE2X3QpVTMyX0FUKCZ2MmJ1ZmZlclsyMF0pOyAgLy8gY29uc3QgYml0cyBwZXIgY2hhbm5lbAotICAgICAgICAgICAgICAgICAgICBVMzJfQVQoJnYyYnVmZmVyWzI0XSk7ICAvLyBmb3JtYXQgc3BlY2lmYyBmbGFncwotICAgICAgICAgICAgICAgICAgICBVMzJfQVQoJnYyYnVmZmVyWzI4XSk7ICAvLyBjb25zdCBieXRlcyBwZXIgYXVkaW8gcGFja2V0Ci0gICAgICAgICAgICAgICAgICAgIFUzMl9BVCgmdjJidWZmZXJbMzJdKTsgIC8vIGNvbnN0IExQQ00gZnJhbWVzIHBlciBhdWRpbyBwYWNrZXQKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IDM2OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgIT0gRk9VUkNDKCdlJywgJ24nLCAnYycsICdhJykpIHsKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY2h1bmsgdHlwZSBpcyBlbmNhLCB3ZSdsbCBnZXQgdGhlIHR5cGUgZnJvbSB0aGUgc2luZi9mcm1hIGJveCBsYXRlcgotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBGb3VyQ0MyTUlNRShjaHVua190eXBlKSk7Ci0gICAgICAgICAgICAgICAgQWRqdXN0Q2hhbm5lbHNBbmRSYXRlKGNodW5rX3R5cGUsICZudW1fY2hhbm5lbHMsICZzYW1wbGVfcmF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiKioqIGNvZGluZz0nJXMnICVkIGNoYW5uZWxzLCBzaXplICVkLCByYXRlICVkXG4iLAotICAgICAgICAgICAgICAgICAgIGNodW5rLCBudW1fY2hhbm5lbHMsIHNhbXBsZV9zaXplLCBzYW1wbGVfcmF0ZSk7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBudW1fY2hhbm5lbHMpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZV9yYXRlKTsKLQotICAgICAgICAgICAgd2hpbGUgKCpvZmZzZXQgPCBzdG9wX29mZnNldCkgewotICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsob2Zmc2V0LCBkZXB0aCArIDEpOwotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgqb2Zmc2V0ICE9IHN0b3Bfb2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ3YnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2UnLCAnbicsICdjJywgJ3YnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnMicsICc2JywgJzMnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ0gnLCAnMicsICc2JywgJzMnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAnMicsICc2JywgJzMnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAndicsICdjJywgJzEnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAndicsICdjJywgJzEnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAnZScsICd2JywgJzEnKToKLSAgICAgICAgewotICAgICAgICAgICAgdWludDhfdCBidWZmZXJbNzhdOwotICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IChzc2l6ZV90KXNpemVvZihidWZmZXIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gQmFzaWMgVmlkZW9TYW1wbGVFbnRyeSBzaXplLgotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKGJ1ZmZlcikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVpbnQxNl90IGRhdGFfcmVmX2luZGV4IF9fdW51c2VkID0gVTE2X0FUKCZidWZmZXJbNl0pOwotICAgICAgICAgICAgdWludDE2X3Qgd2lkdGggPSBVMTZfQVQoJmJ1ZmZlcls2ICsgMThdKTsKLSAgICAgICAgICAgIHVpbnQxNl90IGhlaWdodCA9IFUxNl9BVCgmYnVmZmVyWzYgKyAyMF0pOwotCi0gICAgICAgICAgICAvLyBUaGUgdmlkZW8gc2FtcGxlIGlzIG5vdCBzdGFuZGFyZC1jb21wbGlhbnQgaWYgaXQgaGFzIGludmFsaWQgZGltZW5zaW9uLgotICAgICAgICAgICAgLy8gVXNlIHNvbWUgZGVmYXVsdCB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlLCBhbmQKLSAgICAgICAgICAgIC8vIGxldCB0aGUgZGVjb2RlciBmaWd1cmUgb3V0IHRoZSBhY3R1YWwgd2lkdGggYW5kIGhlaWdodCAoYW5kIHRodXMKLSAgICAgICAgICAgIC8vIGJlIHByZXBhcmVkIGZvciBJTkZPX0ZPTVJBVF9DSEFOR0VEIGV2ZW50KS4KLSAgICAgICAgICAgIGlmICh3aWR0aCA9PSAwKSAgd2lkdGggID0gMzUyOwotICAgICAgICAgICAgaWYgKGhlaWdodCA9PSAwKSBoZWlnaHQgPSAyODg7Ci0KLSAgICAgICAgICAgIC8vIHByaW50ZigiKioqIGNvZGluZz0nJXMnIHdpZHRoPSVkIGhlaWdodD0lZFxuIiwKLSAgICAgICAgICAgIC8vICAgICAgICBjaHVuaywgd2lkdGgsIGhlaWdodCk7Ci0KLSAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLQotICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgIT0gRk9VUkNDKCdlJywgJ24nLCAnYycsICd2JykpIHsKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY2h1bmsgdHlwZSBpcyBlbmN2LCB3ZSdsbCBnZXQgdGhlIHR5cGUgZnJvbSB0aGUgc2luZi9mcm1hIGJveCBsYXRlcgotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBGb3VyQ0MyTUlNRShjaHVua190eXBlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7Ci0KLSAgICAgICAgICAgIG9mZjY0X3Qgc3RvcF9vZmZzZXQgPSAqb2Zmc2V0ICsgY2h1bmtfc2l6ZTsKLSAgICAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldCArIHNpemVvZihidWZmZXIpOwotICAgICAgICAgICAgd2hpbGUgKCpvZmZzZXQgPCBzdG9wX29mZnNldCkgewotICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsob2Zmc2V0LCBkZXB0aCArIDEpOwotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgqb2Zmc2V0ICE9IHN0b3Bfb2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAndCcsICdjJywgJ28nKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2MnLCAnbycsICc2JywgJzQnKToKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChtTGFzdFRyYWNrID09IE5VTEwpIHx8IChtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZSA9PSBOVUxMKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPnNldENodW5rT2Zmc2V0UGFyYW1zKAotICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtfdHlwZSwgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7Ci0KLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAndCcsICdzJywgJ2MnKToKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChtTGFzdFRyYWNrID09IE5VTEwpIHx8IChtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZSA9PSBOVUxMKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPQotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5zZXRTYW1wbGVUb0NodW5rUGFyYW1zKAotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7Ci0KLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAndCcsICdzJywgJ3onKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAndCcsICd6JywgJzInKToKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChtTGFzdFRyYWNrID09IE5VTEwpIHx8IChtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZSA9PSBOVUxMKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPnNldFNhbXBsZVNpemVQYXJhbXMoCi0gICAgICAgICAgICAgICAgICAgICAgICBjaHVua190eXBlLCBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKLQotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2l6ZV90IG1heF9zaXplOwotICAgICAgICAgICAgZXJyID0gbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPmdldE1heFNhbXBsZVNpemUoJm1heF9zaXplKTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtYXhfc2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gQXNzdW1lIHRoYXQgYSBnaXZlbiBidWZmZXIgb25seSBjb250YWlucyBhdCBtb3N0IDEwIGNodW5rcywKLSAgICAgICAgICAgICAgICAvLyBlYWNoIGNodW5rIG9yaWdpbmFsbHkgcHJlZml4ZWQgd2l0aCBhIDIgYnl0ZSBsZW5ndGggd2lsbAotICAgICAgICAgICAgICAgIC8vIGhhdmUgYSA0IGJ5dGUgaGVhZGVyICgweDAwIDB4MDAgMHgwMCAweDAxKSBhZnRlciBjb252ZXJzaW9uLAotICAgICAgICAgICAgICAgIC8vIGFuZCB0aHVzIHdpbGwgZ3JvdyBieSAyIGJ5dGVzIHBlciBjaHVuay4KLSAgICAgICAgICAgICAgICBpZiAobWF4X3NpemUgPiBTSVpFX01BWCAtIDEwICogMikgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgibWF4IHNhbXBsZSBzaXplIHRvbyBiaWc6ICV6dSIsIG1heF9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgbWF4X3NpemUgKyAxMCAqIDIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBObyBzaXplIHdhcyBzcGVjaWZpZWQuIFBpY2sgYSBjb25zZXJ2YXRpdmVseSBsYXJnZSBzaXplLgotICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgICAgICAgICAgICAgaWYgKCFtTGFzdFRyYWNrLT5tZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAoaW50MzJfdCopJndpZHRoKSB8fAotICAgICAgICAgICAgICAgICAgICAhbUxhc3RUcmFjay0+bWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsKGludDMyX3QqKSAmaGVpZ2h0KSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTm8gd2lkdGggb3IgaGVpZ2h0LCBhc3N1bWluZyB3b3JzdCBjYXNlIDEwODBwIik7Ci0gICAgICAgICAgICAgICAgICAgIHdpZHRoID0gMTkyMDsKLSAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gMTA4MDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBBIHJlc29sdXRpb24gd2FzIHNwZWNpZmllZCwgY2hlY2sgdGhhdCBpdCdzIG5vdCB0b28gYmlnLiBUaGUgdmFsdWVzIGJlbG93Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdlcmUgY2hvc2VuIHNvIHRoYXQgdGhlIGNhbGN1bGF0aW9ucyBiZWxvdyBkb24ndCBjYXVzZSBvdmVyZmxvd3MsIHRoZXkncmUKLSAgICAgICAgICAgICAgICAgICAgLy8gbm90IGluZGljYXRpbmcgdGhhdCByZXNvbHV0aW9ucyB1cCB0byAzMmt4MzJrIGFyZSBhY3R1YWxseSBzdXBwb3J0ZWQuCi0gICAgICAgICAgICAgICAgICAgIGlmICh3aWR0aCA+IDMyNzY4IHx8IGhlaWdodCA+IDMyNzY4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiY2FuJ3Qgc3VwcG9ydCAldSB4ICV1IHZpZGVvIiwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgICAgICAgICBDSEVDSyhtTGFzdFRyYWNrLT5tZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgIXN0cmNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBBVkMgJiBIRVZDIHJlcXVpcmVzIGNvbXByZXNzaW9uIHJhdGlvIG9mIGF0IGxlYXN0IDIsIGFuZCB1c2VzCi0gICAgICAgICAgICAgICAgICAgIC8vIG1hY3JvYmxvY2tzCi0gICAgICAgICAgICAgICAgICAgIG1heF9zaXplID0gKCh3aWR0aCArIDE1KSAvIDE2KSAqICgoaGVpZ2h0ICsgMTUpIC8gMTYpICogMTkyOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZvciBhbGwgb3RoZXIgZm9ybWF0cyB0aGVyZSBpcyBubyBtaW5pbXVtIGNvbXByZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgIC8vIHJhdGlvLiBVc2UgY29tcHJlc3Npb24gcmF0aW8gb2YgMS4KLSAgICAgICAgICAgICAgICAgICAgbWF4X3NpemUgPSB3aWR0aCAqIGhlaWdodCAqIDMgLyAyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBIQUNLOiBhbGxvdyAxMCUgb3ZlcmhlYWQKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiByZWFkIHNhbXBsZSBzaXplIGZyb20gdHJhZiBhdG9tIGZvciBmcmFnbWVudGVkIE1QRUc0LgotICAgICAgICAgICAgICAgIG1heF9zaXplICs9IG1heF9zaXplIC8gMTA7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgbWF4X3NpemUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBOT1RFOiBzZXR0aW5nIGFub3RoZXIgcGllY2Ugb2YgbWV0YWRhdGEgaW52YWxpZGF0ZXMgYW55IHBvaW50ZXJzIChzdWNoIGFzIHRoZQotICAgICAgICAgICAgLy8gbWltZXR5cGUpIHByZXZpb3VzbHkgb2J0YWluZWQsIHNvIGRvbid0IGNhY2hlIHRoZW0uCi0gICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICAgICAgQ0hFQ0sobUxhc3RUcmFjay0+bWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwotICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGF2ZXJhZ2UgZnJhbWUgcmF0ZS4KLSAgICAgICAgICAgIGlmICghc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUsIDYpKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IG5TYW1wbGVzID0gbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPmNvdW50U2FtcGxlcygpOwotICAgICAgICAgICAgICAgIGlmIChuU2FtcGxlcyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgdHJhY2tJZDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2stPm1ldGEtPmZpbmRJbnQzMihrS2V5VHJhY2tJRCwgJnRyYWNrSWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmV4LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJleCAqdCA9ICZtVHJleC5lZGl0SXRlbUF0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LT50cmFja19JRCA9PSAodWludDMyX3QpIHRyYWNrSWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQtPmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZVJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT50aW1lc2NhbGUgLyB0LT5kZWZhdWx0X3NhbXBsZV9kdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlGcmFtZVJhdGUsIGZyYW1lUmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOwotICAgICAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjay0+bWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb25VcyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lUmF0ZSA9IChuU2FtcGxlcyAqIDEwMDAwMDBMTCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGR1cmF0aW9uVXMgPj4gMSkpIC8gZHVyYXRpb25VczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5RnJhbWVSYXRlLCBmcmFtZVJhdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAndCcsICdzJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgobUxhc3RUcmFjayA9PSBOVUxMKSB8fCAobUxhc3RUcmFjay0+c2FtcGxlVGFibGUgPT0gTlVMTCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLQotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPQotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5zZXRUaW1lVG9TYW1wbGVQYXJhbXMoCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2MnLCAndCcsICd0JywgJ3MnKToKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChtTGFzdFRyYWNrID09IE5VTEwpIHx8IChtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZSA9PSBOVUxMKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPnNldENvbXBvc2l0aW9uVGltZVRvU2FtcGxlUGFyYW1zKAotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAncycsICdzJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgobUxhc3RUcmFjayA9PSBOVUxMKSB8fCAobUxhc3RUcmFjay0+c2FtcGxlVGFibGUgPT0gTlVMTCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLQotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPQotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5zZXRTeW5jU2FtcGxlUGFyYW1zKAotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFx4QTl4eXoKLSAgICAgICAgY2FzZSBGT1VSQ0MoMHhBOSwgJ3gnLCAneScsICd6Jyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLQotICAgICAgICAgICAgLy8gQmVzdCBjYXNlIHRoZSB0b3RhbCBkYXRhIGxlbmd0aCBpbnNpZGUgIlx4QTl4eXoiIGJveCB3b3VsZAotICAgICAgICAgICAgLy8gYmUgOSwgZm9yIGluc3RhbmNlICJceEE5eHl6IiArICJceDAwXHgwNVx4MTVceGM3IiArICIrMCswLyIsCi0gICAgICAgICAgICAvLyB3aGVyZSAiXHgwMFx4MDUiIGlzIHRoZSB0ZXh0IHN0cmluZyBsZW5ndGggd2l0aCB2YWx1ZSA9IDUsCi0gICAgICAgICAgICAvLyAiXDB4MTVceGM3IiBpcyB0aGUgbGFuZ3VhZ2UgY29kZSA9IGVuLCBhbmQgIiswKzAvIiBpcyBhCi0gICAgICAgICAgICAvLyBsb2NhdGlvbiAoc3RyaW5nKSB2YWx1ZSB3aXRoIGxvbmdpdHVkZSA9IDAgYW5kIGxhdGl0dWRlID0gMC4KLSAgICAgICAgICAgIC8vIFNpbmNlIHNvbWUgZGV2aWNlcyBlbmNvdW50ZXJlZCBpbiB0aGUgd2lsZCBvbWl0IHRoZSB0cmFpbGluZwotICAgICAgICAgICAgLy8gc2xhc2gsIHdlJ2xsIGFsbG93IHRoYXQuCi0gICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgOCkgeyAvLyA4IGluc3RlYWQgb2YgOSB0byBhbGxvdyBmb3IgbWlzc2luZyAvCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdWludDE2X3QgbGVuOwotICAgICAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDE2KGRhdGFfb2Zmc2V0LCAmbGVuKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYWxsb3cgIiswKzAiIHdpdGhvdXQgdHJhaWxpbmcgc2xhc2gKLSAgICAgICAgICAgIGlmIChsZW4gPCA0IHx8IGxlbiA+IGNodW5rX2RhdGFfc2l6ZSAtIDQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVGhlIGxvY2F0aW9uIHN0cmluZyBmb2xsb3dpbmcgdGhlIGxhbmd1YWdlIGNvZGUgaXMgZm9ybWF0dGVkCi0gICAgICAgICAgICAvLyBhY2NvcmRpbmcgdG8gSVNPIDY3MDk6MjAwOCAoaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzY3MDkpLgotICAgICAgICAgICAgLy8gQWxsb2NhdGUgMiBleHRyYSBieXRlcywgaW4gY2FzZSB3ZSBuZWVkIHRvIGFkZCBhIHRyYWlsaW5nIHNsYXNoLAotICAgICAgICAgICAgLy8gYW5kIHRvIGFkZCBhIHRlcm1pbmF0aW5nIDAuCi0gICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Y2hhcltdPiBidWZmZXIobmV3IChzdGQ6Om5vdGhyb3cpIGNoYXJbbGVuKzJdKCkpOwotICAgICAgICAgICAgaWYgKCFidWZmZXIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICsgNCwgJmJ1ZmZlclswXSwgbGVuKSA8IGxlbikgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbGVuID0gc3RybGVuKCZidWZmZXJbMF0pOwotICAgICAgICAgICAgaWYgKGxlbiA8IDQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gQWRkIGEgdHJhaWxpbmcgc2xhc2ggaWYgdGhlcmUgd2Fzbid0IG9uZS4KLSAgICAgICAgICAgIGlmIChidWZmZXJbbGVuIC0gMV0gIT0gJy8nKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyW2xlbl0gPSAnLyc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRDU3RyaW5nKGtLZXlMb2NhdGlvbiwgJmJ1ZmZlclswXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRk9VUkNDKCdlJywgJ3MnLCAnZCcsICdzJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLQotICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1aW50OF90IGJ1ZmZlclsyNTZdOwotICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA+IChvZmY2NF90KXNpemVvZihidWZmZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0JVRkZFUl9UT09fU01BTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGJ1ZmZlciwgY2h1bmtfZGF0YV9zaXplKSA8IGNodW5rX2RhdGFfc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKFUzMl9BVChidWZmZXIpICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyBTaG91bGQgYmUgdmVyc2lvbiAwLCBmbGFncyAwLgotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLQotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleUVTRFMsIGtUeXBlRVNEUywgJmJ1ZmZlcls0XSwgY2h1bmtfZGF0YV9zaXplIC0gNCk7Ci0KLSAgICAgICAgICAgIGlmIChtUGF0aC5zaXplKCkgPj0gMgotICAgICAgICAgICAgICAgICAgICAmJiBtUGF0aFttUGF0aC5zaXplKCkgLSAyXSA9PSBGT1VSQ0MoJ20nLCAncCcsICc0JywgJ2EnKSkgewotICAgICAgICAgICAgICAgIC8vIEluZm9ybWF0aW9uIGZyb20gdGhlIEVTRFMgbXVzdCBiZSByZWxpZWQgb24gZm9yIHByb3BlcgotICAgICAgICAgICAgICAgIC8vIHNldHVwIG9mIHNhbXBsZSByYXRlIGFuZCBjaGFubmVsIGNvdW50IGZvciBNUEVHNCBBdWRpby4KLSAgICAgICAgICAgICAgICAvLyBUaGUgZ2VuZXJpYyBoZWFkZXIgYXBwZWFycyB0byBvbmx5IGNvbnRhaW4gZ2VuZXJpYwotICAgICAgICAgICAgICAgIC8vIGluZm9ybWF0aW9uLi4uCi0KLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSB1cGRhdGVBdWRpb1RyYWNrSW5mb0Zyb21FU0RTX01QRUc0QXVkaW8oCi0gICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyWzRdLCBjaHVua19kYXRhX3NpemUgLSA0KTsKLQotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVBhdGguc2l6ZSgpID49IDIKLSAgICAgICAgICAgICAgICAgICAgJiYgbVBhdGhbbVBhdGguc2l6ZSgpIC0gMl0gPT0gRk9VUkNDKCdtJywgJ3AnLCAnNCcsICd2JykpIHsKLSAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmlkZW8gaXMgTVBFRzIKLSAgICAgICAgICAgICAgICBFU0RTIGVzZHMoJmJ1ZmZlcls0XSwgY2h1bmtfZGF0YV9zaXplIC0gNCk7Ci0KLSAgICAgICAgICAgICAgICB1aW50OF90IG9iamVjdFR5cGVJbmRpY2F0aW9uOwotICAgICAgICAgICAgICAgIGlmIChlc2RzLmdldE9iamVjdFR5cGVJbmRpY2F0aW9uKCZvYmplY3RUeXBlSW5kaWNhdGlvbikgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdFR5cGVJbmRpY2F0aW9uID49IDB4NjAgJiYgb2JqZWN0VHlwZUluZGljYXRpb24gPD0gMHg2NSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2InLCAndCcsICdyJywgJ3QnKToKLSAgICAgICAgewotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVpbnQ4X3QgYnVmZmVyWzEyXTsKLSAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgIT0gc2l6ZW9mKGJ1ZmZlcikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGJ1ZmZlciwgY2h1bmtfZGF0YV9zaXplKSA8IGNodW5rX2RhdGFfc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdWludDMyX3QgbWF4Qml0cmF0ZSA9IFUzMl9BVCgmYnVmZmVyWzRdKTsKLSAgICAgICAgICAgIHVpbnQzMl90IGF2Z0JpdHJhdGUgPSBVMzJfQVQoJmJ1ZmZlcls4XSk7Ci0gICAgICAgICAgICBpZiAobWF4Qml0cmF0ZSA+IDAgJiYgbWF4Qml0cmF0ZSA8IElOVDMyX01BWCkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlNYXhCaXRSYXRlLCAoaW50MzJfdCltYXhCaXRyYXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhdmdCaXRyYXRlID4gMCAmJiBhdmdCaXRyYXRlIDwgSU5UMzJfTUFYKSB7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUJpdFJhdGUsIChpbnQzMl90KWF2Z0JpdHJhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEZPVVJDQygnYScsICd2JywgJ2MnLCAnQycpOgotICAgICAgICB7Ci0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0KLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKGNodW5rX2RhdGFfc2l6ZSk7Ci0KLSAgICAgICAgICAgIGlmIChidWZmZXItPmRhdGEoKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImIvMjg0NzEyMDYiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXItPmRhdGEoKSwgY2h1bmtfZGF0YV9zaXplKSA8IGNodW5rX2RhdGFfc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotCi0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXREYXRhKAotICAgICAgICAgICAgICAgICAgICBrS2V5QVZDQywga1R5cGVBVkNDLCBidWZmZXItPmRhdGEoKSwgY2h1bmtfZGF0YV9zaXplKTsKLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAndicsICdjJywgJ0MnKToKLSAgICAgICAgewotICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoY2h1bmtfZGF0YV9zaXplKTsKLQotICAgICAgICAgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYi8yODQ3MTIwNiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGJ1ZmZlci0+ZGF0YSgpLCBjaHVua19kYXRhX3NpemUpIDwgY2h1bmtfZGF0YV9zaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0KLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldERhdGEoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlIVkNDLCBrVHlwZUhWQ0MsIGJ1ZmZlci0+ZGF0YSgpLCBjaHVua19kYXRhX3NpemUpOwotCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJzInLCAnNicsICczJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBkMjYzIGNvbnRhaW5zIGEgZml4ZWQgNyBieXRlcyBwYXJ0OgotICAgICAgICAgICAgICogICB2ZW5kb3IgLSA0IGJ5dGVzCi0gICAgICAgICAgICAgKiAgIHZlcnNpb24gLSAxIGJ5dGUKLSAgICAgICAgICAgICAqICAgbGV2ZWwgLSAxIGJ5dGUKLSAgICAgICAgICAgICAqICAgcHJvZmlsZSAtIDEgYnl0ZQotICAgICAgICAgICAgICogb3B0aW9uYWxseSwgImQyNjMiIGJveCBpdHNlbGYgbWF5IGNvbnRhaW4gYSAxNi1ieXRlCi0gICAgICAgICAgICAgKiBiaXQgcmF0ZSBib3ggKGJpdHIpCi0gICAgICAgICAgICAgKiAgIGF2ZXJhZ2UgYml0IHJhdGUgLSA0IGJ5dGVzCi0gICAgICAgICAgICAgKiAgIG1heCBiaXQgcmF0ZSAtIDQgYnl0ZXMKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgY2hhciBidWZmZXJbMjNdOwotICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSAhPSA3ICYmCi0gICAgICAgICAgICAgICAgY2h1bmtfZGF0YV9zaXplICE9IDIzKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkluY29ycmVjdCBEMjYzIGJveCBzaXplICVsbGQiLCAobG9uZyBsb25nKWNodW5rX2RhdGFfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXIsIGNodW5rX2RhdGFfc2l6ZSkgPCBjaHVua19kYXRhX3NpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLQotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0RGF0YShrS2V5RDI2Mywga1R5cGVEMjYzLCBidWZmZXIsIGNodW5rX2RhdGFfc2l6ZSk7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZScsICd0JywgJ2EnKToKLSAgICAgICAgewotICAgICAgICAgICAgb2ZmNjRfdCBzdG9wX29mZnNldCA9ICpvZmZzZXQgKyBjaHVua19zaXplOwotICAgICAgICAgICAgKm9mZnNldCA9IGRhdGFfb2Zmc2V0OwotICAgICAgICAgICAgYm9vbCBpc1BhcnNpbmdNZXRhS2V5cyA9IHVuZGVyUVRNZXRhUGF0aChtUGF0aCwgMik7Ci0gICAgICAgICAgICBpZiAoIWlzUGFyc2luZ01ldGFLZXlzKSB7Ci0gICAgICAgICAgICAgICAgdWludDhfdCBidWZmZXJbNF07Ci0gICAgICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IChvZmY2NF90KXNpemVvZihidWZmZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICpvZmZzZXQgPSBzdG9wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgYnVmZmVyLCA0KSA8IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgKm9mZnNldCA9IHN0b3Bfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKFUzMl9BVChidWZmZXIpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIGJlIHZlcnNpb24gMCwgZmxhZ3MgMC4KLQotICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCdzIG5vdCwgbGV0J3MgYXNzdW1lIHRoaXMgaXMgb25lIG9mIHRob3NlCi0gICAgICAgICAgICAgICAgICAgIC8vIGFwcGFyZW50bHkgbWFsZm9ybWVkIGNodW5rcyB0aGF0IGRvbid0IGhhdmUgZmxhZ3MKLSAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNlbWFudGljcyB0aGFuIHdoYXQncwotICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgTVBFRzQgc3BlY3MgYW5kIHNraXAgaXQuCi0gICAgICAgICAgICAgICAgICAgICpvZmZzZXQgPSBzdG9wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9ICBzaXplb2YoYnVmZmVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd2hpbGUgKCpvZmZzZXQgPCBzdG9wX29mZnNldCkgewotICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsob2Zmc2V0LCBkZXB0aCArIDEpOwotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgqb2Zmc2V0ICE9IHN0b3Bfb2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAnbCcsICdvJywgJ2MnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAnaScsICduJywgJ2YnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAncCcsICdyJywgJ3AnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3AnLCAnaScsICd0JywgJ20nKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAnZCcsICdhJywgJ3QnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAncicsICdlJywgJ2YnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAncCcsICdyJywgJ28nKToKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1Jc0hFSUYpIHsKLSAgICAgICAgICAgICAgICBpZiAobUl0ZW1UYWJsZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1JdGVtVGFibGUgPSBuZXcgSXRlbVRhYmxlKG1EYXRhU291cmNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUl0ZW1UYWJsZS0+cGFyc2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBjaHVua190eXBlLCBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKLSAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEZPVVJDQygnbScsICdlJywgJ2EnLCAnbicpOgotICAgICAgICBjYXNlIEZPVVJDQygnbicsICdhJywgJ20nLCAnZScpOgotICAgICAgICBjYXNlIEZPVVJDQygnZCcsICdhJywgJ3QnLCAnYScpOgotICAgICAgICB7Ci0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0KLSAgICAgICAgICAgIGlmIChtUGF0aC5zaXplKCkgPT0gNiAmJiB1bmRlck1ldGFEYXRhUGF0aChtUGF0aCkpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUlUdW5lc01ldGFEYXRhKGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEZPVVJDQygnbScsICd2JywgJ2gnLCAnZCcpOgotICAgICAgICB7Ci0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0KLSAgICAgICAgICAgIGlmIChkZXB0aCAhPSAxKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIm12aGQ6IGRlcHRoICVkIiwgZGVwdGgpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgMzIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1aW50OF90IGhlYWRlclszMl07Ci0gICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKQotICAgICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihoZWFkZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1aW50NjRfdCBjcmVhdGlvblRpbWU7Ci0gICAgICAgICAgICB1aW50NjRfdCBkdXJhdGlvbiA9IDA7Ci0gICAgICAgICAgICBpZiAoaGVhZGVyWzBdID09IDEpIHsKLSAgICAgICAgICAgICAgICBjcmVhdGlvblRpbWUgPSBVNjRfQVQoJmhlYWRlcls0XSk7Ci0gICAgICAgICAgICAgICAgbUhlYWRlclRpbWVzY2FsZSA9IFUzMl9BVCgmaGVhZGVyWzIwXSk7Ci0gICAgICAgICAgICAgICAgZHVyYXRpb24gPSBVNjRfQVQoJmhlYWRlclsyNF0pOwotICAgICAgICAgICAgICAgIGlmIChkdXJhdGlvbiA9PSAweGZmZmZmZmZmZmZmZmZmZmYpIHsKLSAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaGVhZGVyWzBdICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjcmVhdGlvblRpbWUgPSBVMzJfQVQoJmhlYWRlcls0XSk7Ci0gICAgICAgICAgICAgICAgbUhlYWRlclRpbWVzY2FsZSA9IFUzMl9BVCgmaGVhZGVyWzEyXSk7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgZDMyID0gVTMyX0FUKCZoZWFkZXJbMTZdKTsKLSAgICAgICAgICAgICAgICBpZiAoZDMyID09IDB4ZmZmZmZmZmYpIHsKLSAgICAgICAgICAgICAgICAgICAgZDMyID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZHVyYXRpb24gPSBkMzI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCAmJiBtSGVhZGVyVGltZXNjYWxlICE9IDAgJiYgZHVyYXRpb24gPCBVSU5UNjRfTUFYIC8gMTAwMDAwMCkgewotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb24gKiAxMDAwMDAwIC8gbUhlYWRlclRpbWVzY2FsZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZzggczsKLSAgICAgICAgICAgIGlmIChjb252ZXJ0VGltZVRvRGF0ZShjcmVhdGlvblRpbWUsICZzKSkgewotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEtPnNldENTdHJpbmcoa0tleURhdGUsIHMuc3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZScsICdoJywgJ2QnKToKLSAgICAgICAgewotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotCi0gICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgOCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVpbnQ4X3QgZmxhZ3NbNF07Ci0gICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBmbGFncywgc2l6ZW9mKGZsYWdzKSkKLSAgICAgICAgICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YoZmxhZ3MpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1aW50NjRfdCBkdXJhdGlvbiA9IDA7Ci0gICAgICAgICAgICBpZiAoZmxhZ3NbMF0gPT0gMSkgewotICAgICAgICAgICAgICAgIC8vIDY0IGJpdAotICAgICAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAxMikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZS0+Z2V0VUludDY0KGRhdGFfb2Zmc2V0ICsgNCwgJmR1cmF0aW9uKTsKLSAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb24gPT0gMHhmZmZmZmZmZmZmZmZmZmZmKSB7Ci0gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGZsYWdzWzBdID09IDApIHsKLSAgICAgICAgICAgICAgICAvLyAzMiBiaXQKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBkMzI7Ci0gICAgICAgICAgICAgICAgbURhdGFTb3VyY2UtPmdldFVJbnQzMihkYXRhX29mZnNldCArIDQsICZkMzIpOwotICAgICAgICAgICAgICAgIGlmIChkMzIgPT0gMHhmZmZmZmZmZikgewotICAgICAgICAgICAgICAgICAgICBkMzIgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IGQzMjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGR1cmF0aW9uICE9IDAgJiYgbUhlYWRlclRpbWVzY2FsZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvbiAqIDEwMDAwMDAgLyBtSGVhZGVyVGltZXNjYWxlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEZPVVJDQygnbScsICdkJywgJ2EnLCAndCcpOgotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVigibWRhdCBjaHVuaywgZHJtOiAlZCIsIG1Jc0RybSk7Ci0KLSAgICAgICAgICAgIG1NZGF0Rm91bmQgPSB0cnVlOwotCi0gICAgICAgICAgICBpZiAoIW1Jc0RybSkgewotICAgICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNodW5rX3NpemUgPCA4KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHBhcnNlRHJtU0lORihvZmZzZXQsIGRhdGFfb2Zmc2V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ2QnLCAnbCcsICdyJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLQotICAgICAgICAgICAgaWYgKHVuZGVyUVRNZXRhUGF0aChtUGF0aCwgMykpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdWludDMyX3QgYnVmZmVyOwotICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCArIDgsICZidWZmZXIsIDQpIDwgNCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdWludDMyX3QgdHlwZSA9IG50b2hsKGJ1ZmZlcik7Ci0gICAgICAgICAgICAvLyBGb3IgdGhlIDNHUFAgZmlsZSBmb3JtYXQsIHRoZSBoYW5kbGVyLXR5cGUgd2l0aGluIHRoZSAnaGRscicgYm94Ci0gICAgICAgICAgICAvLyBzaGFsbCBiZSAndGV4dCcuIFdlIGFsc28gd2FudCB0byBzdXBwb3J0ICdzYnRsJyBoYW5kbGVyIHR5cGUKLSAgICAgICAgICAgIC8vIGZvciBhIHByYWN0aWNhbCByZWFzb24gYXMgdmFyaW91cyBNUEVHNCBjb250YWluZXJzIHVzZSBpdC4KLSAgICAgICAgICAgIGlmICh0eXBlID09IEZPVVJDQygndCcsICdlJywgJ3gnLCAndCcpIHx8IHR5cGUgPT0gRk9VUkNDKCdzJywgJ2InLCAndCcsICdsJykpIHsKLSAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEZPVVJDQygnaycsICdlJywgJ3knLCAncycpOgotICAgICAgICB7Ci0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0KLSAgICAgICAgICAgIGlmICh1bmRlclFUTWV0YVBhdGgobVBhdGgsIDMpKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VRVE1ldGFLZXkoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAncicsICdlJywgJ3gnKToKLSAgICAgICAgewotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotCi0gICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgMjQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUcmV4IHRyZXg7Ci0gICAgICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIoZGF0YV9vZmZzZXQgKyA0LCAmdHJleC50cmFja19JRCkgfHwKLSAgICAgICAgICAgICAgICAhbURhdGFTb3VyY2UtPmdldFVJbnQzMihkYXRhX29mZnNldCArIDgsICZ0cmV4LmRlZmF1bHRfc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4KSB8fAotICAgICAgICAgICAgICAgICFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKGRhdGFfb2Zmc2V0ICsgMTIsICZ0cmV4LmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uKSB8fAotICAgICAgICAgICAgICAgICFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKGRhdGFfb2Zmc2V0ICsgMTYsICZ0cmV4LmRlZmF1bHRfc2FtcGxlX3NpemUpIHx8Ci0gICAgICAgICAgICAgICAgIW1EYXRhU291cmNlLT5nZXRVSW50MzIoZGF0YV9vZmZzZXQgKyAyMCwgJnRyZXguZGVmYXVsdF9zYW1wbGVfZmxhZ3MpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVRyZXguYWRkKHRyZXgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEZPVVJDQygndCcsICd4JywgJzMnLCAnZycpOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhOwotICAgICAgICAgICAgc2l6ZV90IHNpemUgPSAwOwotICAgICAgICAgICAgaWYgKCFtTGFzdFRyYWNrLT5tZXRhLT5maW5kRGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleVRleHRGb3JtYXREYXRhLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICAgICAgICAgIHNpemUgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKGNodW5rX3NpemUgPiBTSVpFX01BWCkgfHwgKFNJWkVfTUFYIC0gY2h1bmtfc2l6ZSA8PSBzaXplKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W3NpemUgKyBjaHVua19zaXplXTsKLSAgICAgICAgICAgIGlmIChidWZmZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzaXplID4gMCkgewotICAgICAgICAgICAgICAgIG1lbWNweShidWZmZXIsIGRhdGEsIHNpemUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKHNpemVfdCkobURhdGFTb3VyY2UtPnJlYWRBdCgqb2Zmc2V0LCBidWZmZXIgKyBzaXplLCBjaHVua19zaXplKSkKLSAgICAgICAgICAgICAgICAgICAgPCBjaHVua19zaXplKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlW10gYnVmZmVyOwotICAgICAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgICAgICAgICAvLyBhZHZhbmNlIHJlYWQgcG9pbnRlciBzbyB3ZSBkb24ndCBlbmQgdXAgcmVhZGluZyB0aGlzIGFnYWluCi0gICAgICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleVRleHRGb3JtYXREYXRhLCAwLCBidWZmZXIsIHNpemUgKyBjaHVua19zaXplKTsKLQotICAgICAgICAgICAgZGVsZXRlW10gYnVmZmVyOwotCi0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRk9VUkNDKCdjJywgJ28nLCAndicsICdyJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLQotICAgICAgICAgICAgaWYgKG1GaWxlTWV0YURhdGEgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJjaHVua19kYXRhX3NpemUgPSAlIiBQUklkNjQgIiBhbmQgZGF0YV9vZmZzZXQgPSAlIiBQUklkNjQsCi0gICAgICAgICAgICAgICAgICAgICAgY2h1bmtfZGF0YV9zaXplLCBkYXRhX29mZnNldCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgMCB8fCBzdGF0aWNfY2FzdDx1aW50NjRfdD4oY2h1bmtfZGF0YV9zaXplKSA+PSBTSVpFX01BWCAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoY2h1bmtfZGF0YV9zaXplICsgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImIvMjg0NzEyMDYiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXItPmRhdGEoKSwgY2h1bmtfZGF0YV9zaXplKSAhPSAoc3NpemVfdCljaHVua19kYXRhX3NpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb25zdCBpbnQga1NraXBCeXRlc09mRGF0YUJveCA9IDE2OwotICAgICAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPD0ga1NraXBCeXRlc09mRGF0YUJveCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEtPnNldERhdGEoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlBbGJ1bUFydCwgTWV0YURhdGE6OlRZUEVfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCkgKyBrU2tpcEJ5dGVzT2ZEYXRhQm94LCBjaHVua19kYXRhX3NpemUgLSBrU2tpcEJ5dGVzT2ZEYXRhQm94KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEZPVVJDQygnYycsICdvJywgJ2wnLCAncicpOgotICAgICAgICB7Ci0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0gICAgICAgICAgICAvLyB0aGlzIG11c3QgYmUgaW4gYSBWaXN1YWxTYW1wbGVFbnRyeSBib3ggdW5kZXIgdGhlIFNhbXBsZSBEZXNjcmlwdGlvbiBCb3ggKCdzdHNkJykKLSAgICAgICAgICAgIC8vIGlnbm9yZSBvdGhlcndpc2UKLSAgICAgICAgICAgIGlmIChkZXB0aCA+PSAyICYmIG1QYXRoW2RlcHRoIC0gMl0gPT0gRk9VUkNDKCdzJywgJ3QnLCAncycsICdkJykpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNvbG9ySW5mbyhkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKLSAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ2knLCAndCcsICdsJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdwJywgJ2UnLCAncicsICdmJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ3UnLCAndCcsICdoJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdnJywgJ24nLCAncicsICdlJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ2wnLCAnYicsICdtJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCd5JywgJ3InLCAncicsICdjJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2UzR1BQTWV0YURhdGEoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSwgZGVwdGgpOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEZPVVJDQygnSScsICdEJywgJzMnLCAnMicpOgotICAgICAgICB7Ci0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0KLSAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCA2KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcGFyc2VJRDN2Mk1ldGFEYXRhKGRhdGFfb2Zmc2V0ICsgNik7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJy0nLCAnLScsICctJywgJy0nKToKLSAgICAgICAgewotICAgICAgICAgICAgbUxhc3RDb21tZW50TWVhbi5jbGVhcigpOwotICAgICAgICAgICAgbUxhc3RDb21tZW50TmFtZS5jbGVhcigpOwotICAgICAgICAgICAgbUxhc3RDb21tZW50RGF0YS5jbGVhcigpOwotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEZPVVJDQygncycsICdpJywgJ2QnLCAneCcpOgotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZVNlZ21lbnRJbmRleChkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7IC8vIHN0b3AgcGFyc2luZyBhZnRlciBzaWR4Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEZPVVJDQygnYScsICdjJywgJy0nLCAnMycpOgotICAgICAgICB7Ci0gICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0gICAgICAgICAgICByZXR1cm4gcGFyc2VBQzNTYW1wbGVFbnRyeShkYXRhX29mZnNldCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEZPVVJDQygnZicsICd0JywgJ3knLCAncCcpOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgOCB8fCBkZXB0aCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb2ZmNjRfdCBzdG9wX29mZnNldCA9ICpvZmZzZXQgKyBjaHVua19zaXplOwotICAgICAgICAgICAgdWludDMyX3QgbnVtQ29tcGF0aWJsZUJyYW5kcyA9IChjaHVua19kYXRhX3NpemUgLSA4KSAvIDQ7Ci0gICAgICAgICAgICBzdGQ6OnNldDx1aW50MzJfdD4gYnJhbmRTZXQ7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUNvbXBhdGlibGVCcmFuZHMgKyAyOyArK2kpIHsKLSAgICAgICAgICAgICAgICBpZiAoaSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhpcyBpbmRleCwgaXQgcmVmZXJzIHRvIHRoZSBtaW5vclZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgIC8vIG5vdCBhIGJyYW5kLgotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB1aW50MzJfdCBicmFuZDsKLSAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCArIDQgKiBpLCAmYnJhbmQsIDQpIDwgNCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyYW5kID0gbnRvaGwoYnJhbmQpOwotICAgICAgICAgICAgICAgIGJyYW5kU2V0Lmluc2VydChicmFuZCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChicmFuZFNldC5jb3VudChGT1VSQ0MoJ3EnLCAndCcsICcgJywgJyAnKSkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbUlzUVQgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChicmFuZFNldC5jb3VudChGT1VSQ0MoJ20nLCAnaScsICdmJywgJzEnKSkgPiAwCi0gICAgICAgICAgICAgICAgICAgICYmIGJyYW5kU2V0LmNvdW50KEZPVVJDQygnaCcsICdlJywgJ2knLCAnYycpKSA+IDApIHsKLSAgICAgICAgICAgICAgICBtSXNIRUlGID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBBTE9HVigiaWRlbnRpZmllZCBIRUlGIGltYWdlIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICpvZmZzZXQgPSBzdG9wX29mZnNldDsKLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBjaGVjayBpZiB3ZSdyZSBwYXJzaW5nICdpbHN0JyBmb3IgbWV0YSBrZXlzCi0gICAgICAgICAgICAvLyBpZiBzbywgdHJlYXQgdHlwZSBhcyBhIG51bWJlciAoa2V5LWlkKS4KLSAgICAgICAgICAgIGlmICh1bmRlclFUTWV0YVBhdGgobVBhdGgsIDMpKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VRVE1ldGFWYWwoY2h1bmtfdHlwZSwgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZUFDM1NhbXBsZUVudHJ5KG9mZjY0X3Qgb2Zmc2V0KSB7Ci0gICAgLy8gc2tpcCAxNiBieXRlczoKLSAgICAvLyAgKyA2LWJ5dGUgcmVzZXJ2ZWQsCi0gICAgLy8gICsgMi1ieXRlIGRhdGEgcmVmZXJlbmNlIGluZGV4LAotICAgIC8vICArIDgtYnl0ZSByZXNlcnZlZAotICAgIG9mZnNldCArPSAxNjsKLSAgICB1aW50MTZfdCBjaGFubmVsQ291bnQ7Ci0gICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDE2KG9mZnNldCwgJmNoYW5uZWxDb3VudCkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0gICAgLy8gc2tpcCA4IGJ5dGVzOgotICAgIC8vICArIDItYnl0ZSBjaGFubmVsQ291bnQsCi0gICAgLy8gICsgMi1ieXRlIHNhbXBsZSBzaXplLAotICAgIC8vICArIDQtYnl0ZSByZXNlcnZlZAotICAgIG9mZnNldCArPSA4OwotICAgIHVpbnQxNl90IHNhbXBsZVJhdGU7Ci0gICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDE2KG9mZnNldCwgJnNhbXBsZVJhdGUpKSB7Ci0gICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBhYy0zIGJsb2NrOiBjYW5ub3QgcmVhZCBzYW1wbGUgcmF0ZSIpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIC8vIHNraXAgNCBieXRlczoKLSAgICAvLyAgKyAyLWJ5dGUgc2FtcGxlUmF0ZSwKLSAgICAvLyAgKyAyLWJ5dGUgcmVzZXJ2ZWQKLSAgICBvZmZzZXQgKz0gNDsKLSAgICByZXR1cm4gcGFyc2VBQzNTcGVjaWZpY0JveChvZmZzZXQsIHNhbXBsZVJhdGUpOwotfQotCi1zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VBQzNTcGVjaWZpY0JveCgKLSAgICAgICAgb2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90IHNhbXBsZVJhdGUpIHsKLSAgICB1aW50MzJfdCBzaXplOwotICAgIC8vICsgNC1ieXRlIHNpemUKLSAgICAvLyArIDQtYnl0ZSB0eXBlCi0gICAgLy8gKyAzLWJ5dGUgcGF5bG9hZAotICAgIGNvbnN0IHVpbnQzMl90IGtBQzNTcGVjaWZpY0JveFNpemUgPSAxMTsKLSAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmc2l6ZSkgfHwgc2l6ZSA8IGtBQzNTcGVjaWZpY0JveFNpemUpIHsKLSAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGFjLTMgYmxvY2s6IGNhbm5vdCByZWFkIHNwZWNpZmljIGJveCBzaXplIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgb2Zmc2V0ICs9IDQ7Ci0gICAgdWludDMyX3QgdHlwZTsKLSAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmdHlwZSkgfHwgdHlwZSAhPSBGT1VSQ0MoJ2QnLCAnYScsICdjJywgJzMnKSkgewotICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgYWMtMyBzcGVjaWZpYyBibG9jazogaGVhZGVyIG5vdCBkYWMzIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgb2Zmc2V0ICs9IDQ7Ci0gICAgY29uc3QgdWludDMyX3Qga0FDM1NwZWNpZmljQm94UGF5bG9hZFNpemUgPSAzOwotICAgIHVpbnQ4X3QgY2h1bmtba0FDM1NwZWNpZmljQm94UGF5bG9hZFNpemVdOwotICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgY2h1bmssIHNpemVvZihjaHVuaykpICE9IHNpemVvZihjaHVuaykpIHsKLSAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGFjLTMgc3BlY2lmaWMgYmxvY2s6IGJpdHN0cmVhbSBmaWVsZHMiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBBQml0UmVhZGVyIGJyKGNodW5rLCBzaXplb2YoY2h1bmspKTsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhbm5lbENvdW50VGFibGVbXSA9IHsyLCAxLCAyLCAzLCAzLCA0LCA0LCA1fTsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxlUmF0ZVRhYmxlW10gPSB7NDgwMDAsIDQ0MTAwLCAzMjAwMH07Ci0KLSAgICB1bnNpZ25lZCBmc2NvZCA9IGJyLmdldEJpdHMoMik7Ci0gICAgaWYgKGZzY29kID09IDMpIHsKLSAgICAgICAgQUxPR0UoIkluY29ycmVjdCBmc2NvZCAoMykgaW4gQUMzIGhlYWRlciIpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICB1bnNpZ25lZCBib3hTYW1wbGVSYXRlID0gc2FtcGxlUmF0ZVRhYmxlW2ZzY29kXTsKLSAgICBpZiAoYm94U2FtcGxlUmF0ZSAhPSBzYW1wbGVSYXRlKSB7Ci0gICAgICAgIEFMT0dFKCJzYW1wbGUgcmF0ZSBtaXNtYXRjaDogYm94U2FtcGxlUmF0ZSA9ICVkLCBzYW1wbGVSYXRlID0gJWQiLAotICAgICAgICAgICAgYm94U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdW5zaWduZWQgYnNpZCA9IGJyLmdldEJpdHMoNSk7Ci0gICAgaWYgKGJzaWQgPiA4KSB7Ci0gICAgICAgIEFMT0dXKCJJbmNvcnJlY3QgYnNpZCBpbiBBQzMgaGVhZGVyLiBQb3NzaWJseSBFLUFDLTM/Iik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgLy8gc2tpcAotICAgIHVuc2lnbmVkIGJzbW9kIF9fdW51c2VkID0gYnIuZ2V0Qml0cygzKTsKLQotICAgIHVuc2lnbmVkIGFjbW9kID0gYnIuZ2V0Qml0cygzKTsKLSAgICB1bnNpZ25lZCBsZmVvbiA9IGJyLmdldEJpdHMoMSk7Ci0gICAgdW5zaWduZWQgY2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50VGFibGVbYWNtb2RdICsgbGZlb247Ci0KLSAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQzMpOwotICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGNoYW5uZWxDb3VudCk7Ci0gICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlU2VnbWVudEluZGV4KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewotICBBTE9HVigiTVBFRzRFeHRyYWN0b3I6OnBhcnNlU2VnbWVudEluZGV4Iik7Ci0KLSAgICBpZiAoc2l6ZSA8IDEyKSB7Ci0gICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBmbGFnczsKLSAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmZmxhZ3MpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDMyX3QgdmVyc2lvbiA9IGZsYWdzID4+IDI0OwotICAgIGZsYWdzICY9IDB4ZmZmZmZmOwotCi0gICAgQUxPR1YoInNpZHggdmVyc2lvbiAlZCIsIHZlcnNpb24pOwotCi0gICAgdWludDMyX3QgcmVmZXJlbmNlSWQ7Ci0gICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCArIDQsICZyZWZlcmVuY2VJZCkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCB0aW1lU2NhbGU7Ci0gICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCArIDgsICZ0aW1lU2NhbGUpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotICAgIEFMT0dWKCJzaWR4IHJlZmlkL3RpbWVzY2FsZTogJWQvJWQiLCByZWZlcmVuY2VJZCwgdGltZVNjYWxlKTsKLSAgICBpZiAodGltZVNjYWxlID09IDApCi0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0KLSAgICB1aW50NjRfdCBlYXJsaWVzdFByZXNlbnRhdGlvblRpbWU7Ci0gICAgdWludDY0X3QgZmlyc3RPZmZzZXQ7Ci0KLSAgICBvZmZzZXQgKz0gMTI7Ci0gICAgc2l6ZSAtPSAxMjsKLQotICAgIGlmICh2ZXJzaW9uID09IDApIHsKLSAgICAgICAgaWYgKHNpemUgPCA4KSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICB1aW50MzJfdCB0bXA7Ci0gICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZ0bXApKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgICAgIGVhcmxpZXN0UHJlc2VudGF0aW9uVGltZSA9IHRtcDsKLSAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCArIDQsICZ0bXApKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgICAgIGZpcnN0T2Zmc2V0ID0gdG1wOwotICAgICAgICBvZmZzZXQgKz0gODsKLSAgICAgICAgc2l6ZSAtPSA4OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChzaXplIDwgMTYpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQ2NChvZmZzZXQsICZlYXJsaWVzdFByZXNlbnRhdGlvblRpbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQ2NChvZmZzZXQgKyA4LCAmZmlyc3RPZmZzZXQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgICAgIG9mZnNldCArPSAxNjsKLSAgICAgICAgc2l6ZSAtPSAxNjsKLSAgICB9Ci0gICAgQUxPR1YoInNpZHggcHJlcy9vZmY6ICUiIFBSSXU2NCAiLyUiIFBSSXU2NCwgZWFybGllc3RQcmVzZW50YXRpb25UaW1lLCBmaXJzdE9mZnNldCk7Ci0KLSAgICBpZiAoc2l6ZSA8IDQpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgdWludDE2X3QgcmVmZXJlbmNlQ291bnQ7Ci0gICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDE2KG9mZnNldCArIDIsICZyZWZlcmVuY2VDb3VudCkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0gICAgb2Zmc2V0ICs9IDQ7Ci0gICAgc2l6ZSAtPSA0OwotICAgIEFMT0dWKCJyZWZjb3VudDogJWQiLCByZWZlcmVuY2VDb3VudCk7Ci0KLSAgICBpZiAoc2l6ZSA8IHJlZmVyZW5jZUNvdW50ICogMTIpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgdWludDY0X3QgdG90YWxfZHVyYXRpb24gPSAwOwotICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlQ291bnQ7IGkrKykgewotICAgICAgICB1aW50MzJfdCBkMSwgZDIsIGQzOwotCi0gICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZkMSkgfHwgICAgIC8vIHNpemUKLSAgICAgICAgICAgICFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCArIDQsICZkMikgfHwgLy8gZHVyYXRpb24KLSAgICAgICAgICAgICFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCArIDgsICZkMykpIHsgLy8gZmxhZ3MKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZDEgJiAweDgwMDAwMDAwKSB7Ci0gICAgICAgICAgICBBTE9HVygic3ViLXNpZHggYm94ZXMgbm90IHN1cHBvcnRlZCB5ZXQiKTsKLSAgICAgICAgfQotICAgICAgICBib29sIHNhcCA9IGQzICYgMHg4MDAwMDAwMDsKLSAgICAgICAgdWludDMyX3Qgc2FwdHlwZSA9IChkMyA+PiAyOCkgJiA3OwotICAgICAgICBpZiAoIXNhcCB8fCAoc2FwdHlwZSAhPSAxICYmIHNhcHR5cGUgIT0gMikpIHsKLSAgICAgICAgICAgIC8vIHR5cGUgMSBhbmQgMiBhcmUgc3luYyBzYW1wbGVzCi0gICAgICAgICAgICBBTE9HVygibm90IGEgc3RyZWFtIGFjY2VzcyBwb2ludCwgb3IgdW5zdXBwb3J0ZWQgdHlwZTogJTA4eCIsIGQzKTsKLSAgICAgICAgfQotICAgICAgICB0b3RhbF9kdXJhdGlvbiArPSBkMjsKLSAgICAgICAgb2Zmc2V0ICs9IDEyOwotICAgICAgICBBTE9HVigiIGl0ZW0gJWQsICUwOHggJTA4eCAlMDh4IiwgaSwgZDEsIGQyLCBkMyk7Ci0gICAgICAgIFNpZHhFbnRyeSBzZTsKLSAgICAgICAgc2UubVNpemUgPSBkMSAmIDB4N2ZmZmZmZmY7Ci0gICAgICAgIHNlLm1EdXJhdGlvblVzID0gMTAwMDAwMExMICogZDIgLyB0aW1lU2NhbGU7Ci0gICAgICAgIG1TaWR4RW50cmllcy5hZGQoc2UpOwotICAgIH0KLQotICAgIHVpbnQ2NF90IHNpZHhEdXJhdGlvbiA9IHRvdGFsX2R1cmF0aW9uICogMTAwMDAwMCAvIHRpbWVTY2FsZTsKLQotICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCi0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0KLSAgICBpbnQ2NF90IG1ldGFEdXJhdGlvbjsKLSAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZtZXRhRHVyYXRpb24pIHx8IG1ldGFEdXJhdGlvbiA9PSAwKSB7Ci0gICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgc2lkeER1cmF0aW9uKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VRVE1ldGFLZXkob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKHNpemUgPCA4KSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDMyX3QgY291bnQ7Ci0gICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCArIDQsICZjb3VudCkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAobU1ldGFLZXlNYXAuc2l6ZSgpID4gMCkgewotICAgICAgICBBTE9HVygiJ2tleXMnIGF0b20gc2VlbiBhZ2FpbiwgZGlzY2FyZGluZyBleGlzdGluZyBlbnRyaWVzIik7Ci0gICAgICAgIG1NZXRhS2V5TWFwLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgb2ZmNjRfdCBrZXlPZmZzZXQgPSBvZmZzZXQgKyA4OwotICAgIG9mZjY0X3Qgc3RvcE9mZnNldCA9IG9mZnNldCArIHNpemU7Ci0gICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPD0gY291bnQ7IGkrKykgewotICAgICAgICBpZiAoa2V5T2Zmc2V0ICsgOCA+IHN0b3BPZmZzZXQpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICB1aW50MzJfdCBrZXlTaXplOwotICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIoa2V5T2Zmc2V0LCAma2V5U2l6ZSkKLSAgICAgICAgICAgICAgICB8fCBrZXlTaXplIDwgOAotICAgICAgICAgICAgICAgIHx8IGtleU9mZnNldCArIGtleVNpemUgPiBzdG9wT2Zmc2V0KSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgdWludDMyX3QgdHlwZTsKLSAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKGtleU9mZnNldCArIDQsICZ0eXBlKQotICAgICAgICAgICAgICAgIHx8IHR5cGUgIT0gRk9VUkNDKCdtJywgJ2QnLCAndCcsICdhJykpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBrZXlTaXplIC09IDg7Ci0gICAgICAgIGtleU9mZnNldCArPSA4OwotCi0gICAgICAgIHNwPEFCdWZmZXI+IGtleURhdGEgPSBuZXcgQUJ1ZmZlcihrZXlTaXplKTsKLSAgICAgICAgaWYgKGtleURhdGEtPmRhdGEoKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAotICAgICAgICAgICAgICAgIGtleU9mZnNldCwga2V5RGF0YS0+ZGF0YSgpLCBrZXlTaXplKSA8IChzc2l6ZV90KSBrZXlTaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgQVN0cmluZyBrZXkoKGNvbnN0IGNoYXIgKilrZXlEYXRhLT5kYXRhKCksIGtleVNpemUpOwotICAgICAgICBtTWV0YUtleU1hcC5hZGQoaSwga2V5KTsKLQotICAgICAgICBrZXlPZmZzZXQgKz0ga2V5U2l6ZTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VRVE1ldGFWYWwoCi0gICAgICAgIGludDMyX3Qga2V5SWQsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewotICAgIHNzaXplX3QgaW5kZXggPSBtTWV0YUtleU1hcC5pbmRleE9mS2V5KGtleUlkKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIC8vIGNvcnJlc3BvbmRpbmcga2V5IGlzIG5vdCBwcmVzZW50LCBpZ25vcmUKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAoc2l6ZSA8PSAxNikgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICB1aW50MzJfdCBkYXRhU2l6ZTsKLSAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmZGF0YVNpemUpCi0gICAgICAgICAgICB8fCBkYXRhU2l6ZSA+IHNpemUgfHwgZGF0YVNpemUgPD0gMTYpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0gICAgdWludDMyX3QgYXRvbUZvdXJDQzsKLSAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0ICsgNCwgJmF0b21Gb3VyQ0MpCi0gICAgICAgICAgICB8fCBhdG9tRm91ckNDICE9IEZPVVJDQygnZCcsICdhJywgJ3QnLCAnYScpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotICAgIHVpbnQzMl90IGRhdGFUeXBlOwotICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQgKyA4LCAmZGF0YVR5cGUpCi0gICAgICAgICAgICB8fCAoKGRhdGFUeXBlICYgMHhmZjAwMDAwMCkgIT0gMCkpIHsKLSAgICAgICAgLy8gbm90IHdlbGwta25vd24gdHlwZQotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGRhdGFTaXplIC09IDE2OwotICAgIG9mZnNldCArPSAxNjsKLQotICAgIGlmIChkYXRhVHlwZSA9PSAyMyAmJiBkYXRhU2l6ZSA+PSA0KSB7Ci0gICAgICAgIC8vIEJFIEZsb2F0MzIKLSAgICAgICAgdWludDMyX3QgdmFsOwotICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmdmFsKSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXN0cmNhc2VjbXAobU1ldGFLZXlNYXBbaW5kZXhdLmNfc3RyKCksICJjb20uYW5kcm9pZC5jYXB0dXJlLmZwcyIpKSB7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRGbG9hdChrS2V5Q2FwdHVyZUZyYW1lcmF0ZSwgKihmbG9hdCAqKSZ2YWwpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChkYXRhVHlwZSA9PSA2NyAmJiBkYXRhU2l6ZSA+PSA0KSB7Ci0gICAgICAgIC8vIEJFIHNpZ25lZCBpbnQzMgotICAgICAgICB1aW50MzJfdCB2YWw7Ci0gICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZ2YWwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgICAgIGlmICghc3RyY2FzZWNtcChtTWV0YUtleU1hcFtpbmRleF0uY19zdHIoKSwgImNvbS5hbmRyb2lkLnZpZGVvLnRlbXBvcmFsX2xheWVyc19jb3VudCIpKSB7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRJbnQzMihrS2V5VGVtcG9yYWxMYXllckNvdW50LCB2YWwpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gYWRkIG1vcmUga2V5cyBpZiBuZWVkZWQKLSAgICAgICAgQUxPR1YoImlnbm9yaW5nIGtleTogdHlwZSAlZCwgc2l6ZSAlZCIsIGRhdGFUeXBlLCBkYXRhU2l6ZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VUcmFja0hlYWRlcigKLSAgICAgICAgb2ZmNjRfdCBkYXRhX29mZnNldCwgb2ZmNjRfdCBkYXRhX3NpemUpIHsKLSAgICBpZiAoZGF0YV9zaXplIDwgNCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVpbnQ4X3QgdmVyc2lvbjsKLSAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCwgJnZlcnNpb24sIDEpIDwgMSkgewotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotCi0gICAgc2l6ZV90IGR5blNpemUgPSAodmVyc2lvbiA9PSAxKSA/IDM2IDogMjQ7Ci0KLSAgICB1aW50OF90IGJ1ZmZlclszNiArIDYwXTsKLQotICAgIGlmIChkYXRhX3NpemUgIT0gKG9mZjY0X3QpZHluU2l6ZSArIDYwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGJ1ZmZlciwgZGF0YV9zaXplKSA8IChzc2l6ZV90KWRhdGFfc2l6ZSkgewotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotCi0gICAgdWludDY0X3QgY3RpbWUgX191bnVzZWQsIG10aW1lIF9fdW51c2VkLCBkdXJhdGlvbiBfX3VudXNlZDsKLSAgICBpbnQzMl90IGlkOwotCi0gICAgaWYgKHZlcnNpb24gPT0gMSkgewotICAgICAgICBjdGltZSA9IFU2NF9BVCgmYnVmZmVyWzRdKTsKLSAgICAgICAgbXRpbWUgPSBVNjRfQVQoJmJ1ZmZlclsxMl0pOwotICAgICAgICBpZCA9IFUzMl9BVCgmYnVmZmVyWzIwXSk7Ci0gICAgICAgIGR1cmF0aW9uID0gVTY0X0FUKCZidWZmZXJbMjhdKTsKLSAgICB9IGVsc2UgaWYgKHZlcnNpb24gPT0gMCkgewotICAgICAgICBjdGltZSA9IFUzMl9BVCgmYnVmZmVyWzRdKTsKLSAgICAgICAgbXRpbWUgPSBVMzJfQVQoJmJ1ZmZlcls4XSk7Ci0gICAgICAgIGlkID0gVTMyX0FUKCZidWZmZXJbMTJdKTsKLSAgICAgICAgZHVyYXRpb24gPSBVMzJfQVQoJmJ1ZmZlclsyMF0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotCi0gICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleVRyYWNrSUQsIGlkKTsKLQotICAgIHNpemVfdCBtYXRyaXhPZmZzZXQgPSBkeW5TaXplICsgMTY7Ci0gICAgaW50MzJfdCBhMDAgPSBVMzJfQVQoJmJ1ZmZlclttYXRyaXhPZmZzZXRdKTsKLSAgICBpbnQzMl90IGEwMSA9IFUzMl9BVCgmYnVmZmVyW21hdHJpeE9mZnNldCArIDRdKTsKLSAgICBpbnQzMl90IGExMCA9IFUzMl9BVCgmYnVmZmVyW21hdHJpeE9mZnNldCArIDEyXSk7Ci0gICAgaW50MzJfdCBhMTEgPSBVMzJfQVQoJmJ1ZmZlclttYXRyaXhPZmZzZXQgKyAxNl0pOwotCi0jaWYgMAotICAgIGludDMyX3QgZHggPSBVMzJfQVQoJmJ1ZmZlclttYXRyaXhPZmZzZXQgKyA4XSk7Ci0gICAgaW50MzJfdCBkeSA9IFUzMl9BVCgmYnVmZmVyW21hdHJpeE9mZnNldCArIDIwXSk7Ci0KLSAgICBBTE9HSSgieCcgPSAlLjJmICogeCArICUuMmYgKiB5ICsgJS4yZiIsCi0gICAgICAgICBhMDAgLyA2NTUzNi4wZiwgYTAxIC8gNjU1MzYuMGYsIGR4IC8gNjU1MzYuMGYpOwotICAgIEFMT0dJKCJ5JyA9ICUuMmYgKiB4ICsgJS4yZiAqIHkgKyAlLjJmIiwKLSAgICAgICAgIGExMCAvIDY1NTM2LjBmLCBhMTEgLyA2NTUzNi4wZiwgZHkgLyA2NTUzNi4wZik7Ci0jZW5kaWYKLQotICAgIHVpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKLQotICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtGaXhlZE9uZSA9IDB4MTAwMDA7Ci0gICAgaWYgKGEwMCA9PSBrRml4ZWRPbmUgJiYgYTAxID09IDAgJiYgYTEwID09IDAgJiYgYTExID09IGtGaXhlZE9uZSkgewotICAgICAgICAvLyBJZGVudGl0eSwgbm8gcm90YXRpb24KLSAgICAgICAgcm90YXRpb25EZWdyZWVzID0gMDsKLSAgICB9IGVsc2UgaWYgKGEwMCA9PSAwICYmIGEwMSA9PSBrRml4ZWRPbmUgJiYgYTEwID09IC1rRml4ZWRPbmUgJiYgYTExID09IDApIHsKLSAgICAgICAgcm90YXRpb25EZWdyZWVzID0gOTA7Ci0gICAgfSBlbHNlIGlmIChhMDAgPT0gMCAmJiBhMDEgPT0gLWtGaXhlZE9uZSAmJiBhMTAgPT0ga0ZpeGVkT25lICYmIGExMSA9PSAwKSB7Ci0gICAgICAgIHJvdGF0aW9uRGVncmVlcyA9IDI3MDsKLSAgICB9IGVsc2UgaWYgKGEwMCA9PSAta0ZpeGVkT25lICYmIGEwMSA9PSAwICYmIGExMCA9PSAwICYmIGExMSA9PSAta0ZpeGVkT25lKSB7Ci0gICAgICAgIHJvdGF0aW9uRGVncmVlcyA9IDE4MDsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygiV2Ugb25seSBzdXBwb3J0IDAsOTAsMTgwLDI3MCBkZWdyZWUgcm90YXRpb24gbWF0cmljZXMiKTsKLSAgICAgICAgcm90YXRpb25EZWdyZWVzID0gMDsKLSAgICB9Ci0KLSAgICBpZiAocm90YXRpb25EZWdyZWVzICE9IDApIHsKLSAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleVJvdGF0aW9uLCByb3RhdGlvbkRlZ3JlZXMpOwotICAgIH0KLQotICAgIC8vIEhhbmRsZSBwcmVzZW50YXRpb24gZGlzcGxheSBzaXplLCB3aGljaCBjb3VsZCBiZSBkaWZmZXJlbnQKLSAgICAvLyBmcm9tIHRoZSBpbWFnZSBzaXplIGluZGljYXRlZCBieSBrS2V5V2lkdGggYW5kIGtLZXlIZWlnaHQuCi0gICAgdWludDMyX3Qgd2lkdGggPSBVMzJfQVQoJmJ1ZmZlcltkeW5TaXplICsgNTJdKTsKLSAgICB1aW50MzJfdCBoZWlnaHQgPSBVMzJfQVQoJmJ1ZmZlcltkeW5TaXplICsgNTZdKTsKLSAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5RGlzcGxheVdpZHRoLCB3aWR0aCA+PiAxNik7Ci0gICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleURpc3BsYXlIZWlnaHQsIGhlaWdodCA+PiAxNik7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZUlUdW5lc01ldGFEYXRhKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewotICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGlmIChzaXplIDwgNCB8fCBzaXplID09IFNJWkVfTUFYKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDhfdCAqYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3Rbc2l6ZSArIDFdOwotICAgIGlmIChidWZmZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICBvZmZzZXQsIGJ1ZmZlciwgc2l6ZSkgIT0gKHNzaXplX3Qpc2l6ZSkgewotICAgICAgICBkZWxldGVbXSBidWZmZXI7Ci0gICAgICAgIGJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLQotICAgIHVpbnQzMl90IGZsYWdzID0gVTMyX0FUKGJ1ZmZlcik7Ci0KLSAgICB1aW50MzJfdCBtZXRhZGF0YUtleSA9IDA7Ci0gICAgY2hhciBjaHVua1s1XTsKLSAgICBNYWtlRm91ckNDU3RyaW5nKG1QYXRoWzRdLCBjaHVuayk7Ci0gICAgQUxPR1YoIm1ldGE6ICVzIEAgJWxsZCIsIGNodW5rLCAobG9uZyBsb25nKW9mZnNldCk7Ci0gICAgc3dpdGNoICgoaW50MzJfdCltUGF0aFs0XSkgewotICAgICAgICBjYXNlIEZPVVJDQygweGE5LCAnYScsICdsJywgJ2InKToKLSAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5QWxidW07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygweGE5LCAnQScsICdSJywgJ1QnKToKLSAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5QXJ0aXN0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAnQScsICdSJywgJ1QnKToKLSAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5QWxidW1BcnRpc3Q7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygweGE5LCAnZCcsICdhJywgJ3knKToKLSAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5WWVhcjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKDB4YTksICduJywgJ2EnLCAnbScpOgotICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlUaXRsZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKDB4YTksICd3JywgJ3InLCAndCcpOgotICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlXcml0ZXI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygnYycsICdvJywgJ3YnLCAncicpOgotICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlBbGJ1bUFydDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdnJywgJ24nLCAncicsICdlJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUdlbnJlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoMHhhOSwgJ2cnLCAnZScsICduJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUdlbnJlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2MnLCAncCcsICdpJywgJ2wnKToKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNpemUgPT0gOSAmJiBmbGFncyA9PSAyMSkgewotICAgICAgICAgICAgICAgIGNoYXIgdG1wWzE2XTsKLSAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpYnVmZmVyW3NpemUgLSAxXSk7Ci0KLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRDU3RyaW5nKGtLZXlDb21waWxhdGlvbiwgdG1wKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ3InLCAnaycsICduJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzaXplID09IDE2ICYmIGZsYWdzID09IDApIHsKLSAgICAgICAgICAgICAgICBjaGFyIHRtcFsxNl07Ci0gICAgICAgICAgICAgICAgdWludDE2X3QqIHBUcmFjayA9ICh1aW50MTZfdCopJmJ1ZmZlclsxMF07Ci0gICAgICAgICAgICAgICAgdWludDE2X3QqIHBUb3RhbFRyYWNrcyA9ICh1aW50MTZfdCopJmJ1ZmZlclsxMl07Ci0gICAgICAgICAgICAgICAgc3ByaW50Zih0bXAsICIlZC8lZCIsIG50b2hzKCpwVHJhY2spLCBudG9ocygqcFRvdGFsVHJhY2tzKSk7Ci0KLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRDU3RyaW5nKGtLZXlDRFRyYWNrTnVtYmVyLCB0bXApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2QnLCAnaScsICdzJywgJ2snKToKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChzaXplID09IDE0IHx8IHNpemUgPT0gMTYpICYmIGZsYWdzID09IDApIHsKLSAgICAgICAgICAgICAgICBjaGFyIHRtcFsxNl07Ci0gICAgICAgICAgICAgICAgdWludDE2X3QqIHBEaXNjID0gKHVpbnQxNl90KikmYnVmZmVyWzEwXTsKLSAgICAgICAgICAgICAgICB1aW50MTZfdCogcFRvdGFsRGlzY3MgPSAodWludDE2X3QqKSZidWZmZXJbMTJdOwotICAgICAgICAgICAgICAgIHNwcmludGYodG1wLCAiJWQvJWQiLCBudG9ocygqcERpc2MpLCBudG9ocygqcFRvdGFsRGlzY3MpKTsKLQotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEtPnNldENTdHJpbmcoa0tleURpc2NOdW1iZXIsIHRtcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygnLScsICctJywgJy0nLCAnLScpOgotICAgICAgICB7Ci0gICAgICAgICAgICBidWZmZXJbc2l6ZV0gPSAnXDAnOwotICAgICAgICAgICAgc3dpdGNoIChtUGF0aFs1XSkgewotICAgICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2UnLCAnYScsICduJyk6Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0Q29tbWVudE1lYW4uc2V0VG8oKGNvbnN0IGNoYXIgKilidWZmZXIgKyA0KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ24nLCAnYScsICdtJywgJ2UnKToKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RDb21tZW50TmFtZS5zZXRUbygoY29uc3QgY2hhciAqKWJ1ZmZlciArIDQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEZPVVJDQygnZCcsICdhJywgJ3QnLCAnYScpOgotICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IDgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiYi8yNDM0NjQzMCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtTGFzdENvbW1lbnREYXRhLnNldFRvKChjb25zdCBjaGFyICopYnVmZmVyICsgOCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBPbmNlIHdlIGhhdmUgYSBzZXQgb2YgbWVhbi9uYW1lL2RhdGEgaW5mbywgZ28gYWhlYWQgYW5kIHByb2Nlc3MKLSAgICAgICAgICAgIC8vIGl0IHRvIHNlZSBpZiBpdHMgc29tZXRoaW5nIHdlIGFyZSBpbnRlcmVzdGVkIGluLiAgV2hldGhlciBvciBub3QKLSAgICAgICAgICAgIC8vIHdlcmUgYXJlIGludGVyZXN0ZWQgaW4gdGhlIHNwZWNpZmljIHRhZywgbWFrZSBzdXJlIHRvIGNsZWFyIG91dAotICAgICAgICAgICAgLy8gdGhlIHNldCBzbyB3ZSBjYW4gYmUgcmVhZHkgdG8gcHJvY2VzcyBhbm90aGVyIHR1cGxlIHNob3VsZCBvbmUKLSAgICAgICAgICAgIC8vIHNob3cgdXAgbGF0ZXIgaW4gdGhlIGZpbGUuCi0gICAgICAgICAgICBpZiAoKG1MYXN0Q29tbWVudE1lYW4ubGVuZ3RoKCkgIT0gMCkgJiYKLSAgICAgICAgICAgICAgICAobUxhc3RDb21tZW50TmFtZS5sZW5ndGgoKSAhPSAwKSAmJgotICAgICAgICAgICAgICAgIChtTGFzdENvbW1lbnREYXRhLmxlbmd0aCgpICE9IDApKSB7Ci0KLSAgICAgICAgICAgICAgICBpZiAobUxhc3RDb21tZW50TWVhbiA9PSAiY29tLmFwcGxlLmlUdW5lcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIG1MYXN0Q29tbWVudE5hbWUgPT0gImlUdW5TTVBCIikgewotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRlbGF5LCBwYWRkaW5nOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3NjYW5mKG1MYXN0Q29tbWVudERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAlKnggJXggJXggJSp4IiwgJmRlbGF5LCAmcGFkZGluZykgPT0gMikgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5RW5jb2RlckRlbGF5LCBkZWxheSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5RW5jb2RlclBhZGRpbmcsIHBhZGRpbmcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbUxhc3RDb21tZW50TWVhbi5jbGVhcigpOwotICAgICAgICAgICAgICAgIG1MYXN0Q29tbWVudE5hbWUuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBtTGFzdENvbW1lbnREYXRhLmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoc2l6ZSA+PSA4ICYmIG1ldGFkYXRhS2V5ICYmICFtRmlsZU1ldGFEYXRhLT5oYXNEYXRhKG1ldGFkYXRhS2V5KSkgewotICAgICAgICBpZiAobWV0YWRhdGFLZXkgPT0ga0tleUFsYnVtQXJ0KSB7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXREYXRhKAotICAgICAgICAgICAgICAgICAgICBrS2V5QWxidW1BcnQsIE1ldGFEYXRhOjpUWVBFX05PTkUsCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlciArIDgsIHNpemUgLSA4KTsKLSAgICAgICAgfSBlbHNlIGlmIChtZXRhZGF0YUtleSA9PSBrS2V5R2VucmUpIHsKLSAgICAgICAgICAgIGlmIChmbGFncyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gdWludDhfdCBnZW5yZSBjb2RlLCBpVHVuZXMgZ2VucmUgY29kZXMgYXJlCi0gICAgICAgICAgICAgICAgLy8gdGhlIHN0YW5kYXJkIGlkMyBjb2RlcywgZXhjZXB0IHRoZXkgc3RhcnQKLSAgICAgICAgICAgICAgICAvLyBhdCAxIGluc3RlYWQgb2YgMCAoZS5nLiBQb3AgaXMgMTQsIG5vdCAxMykKLSAgICAgICAgICAgICAgICAvLyBXZSB1c2Ugc3RhbmRhcmQgaWQzIG51bWJlcmluZywgc28gc3VidHJhY3QgMS4KLSAgICAgICAgICAgICAgICBpbnQgZ2VucmVjb2RlID0gKGludClidWZmZXJbc2l6ZSAtIDFdOwotICAgICAgICAgICAgICAgIGdlbnJlY29kZS0tOwotICAgICAgICAgICAgICAgIGlmIChnZW5yZWNvZGUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdlbnJlY29kZSA9IDI1NTsgLy8gcmVzZXJ2ZWQgZm9yICd1bmtub3duIGdlbnJlJwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjaGFyIGdlbnJlWzEwXTsKLSAgICAgICAgICAgICAgICBzcHJpbnRmKGdlbnJlLCAiJWQiLCBnZW5yZWNvZGUpOwotCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0Q1N0cmluZyhtZXRhZGF0YUtleSwgZ2VucmUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChmbGFncyA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgLy8gY3VzdG9tIGdlbnJlIHN0cmluZwotICAgICAgICAgICAgICAgIGJ1ZmZlcltzaXplXSA9ICdcMCc7Ci0KLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFLZXksIChjb25zdCBjaGFyICopYnVmZmVyICsgOCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBidWZmZXJbc2l6ZV0gPSAnXDAnOwotCi0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUtleSwgKGNvbnN0IGNoYXIgKilidWZmZXIgKyA4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKLSAgICBidWZmZXIgPSBOVUxMOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VDb2xvckluZm8ob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKHNpemUgPCA0IHx8IHNpemUgPT0gU0laRV9NQVggfHwgbUxhc3RUcmFjayA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDhfdCAqYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3Rbc2l6ZSArIDFdOwotICAgIGlmIChidWZmZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGJ1ZmZlciwgc2l6ZSkgIT0gKHNzaXplX3Qpc2l6ZSkgewotICAgICAgICBkZWxldGVbXSBidWZmZXI7Ci0gICAgICAgIGJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLQotICAgIGludDMyX3QgdHlwZSA9IFUzMl9BVCgmYnVmZmVyWzBdKTsKLSAgICBpZiAoKHR5cGUgPT0gRk9VUkNDKCduJywgJ2MnLCAnbCcsICd4JykgJiYgc2l6ZSA+PSAxMSkKLSAgICAgICAgICAgIHx8ICh0eXBlID09IEZPVVJDQygnbicsICdjJywgJ2wnLCAnYycpICYmIHNpemUgPj0gMTApKSB7Ci0gICAgICAgIGludDMyX3QgcHJpbWFyaWVzID0gVTE2X0FUKCZidWZmZXJbNF0pOwotICAgICAgICBpbnQzMl90IHRyYW5zZmVyID0gVTE2X0FUKCZidWZmZXJbNl0pOwotICAgICAgICBpbnQzMl90IGNvZWZmcyA9IFUxNl9BVCgmYnVmZmVyWzhdKTsKLSAgICAgICAgYm9vbCBmdWxsUmFuZ2UgPSAodHlwZSA9PSBGT1VSQ0MoJ24nLCAnYycsICdsJywgJ3gnKSkgJiYgKGJ1ZmZlclsxMF0gJiAxMjgpOwotCi0gICAgICAgIENvbG9yQXNwZWN0cyBhc3BlY3RzOwotICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMoCi0gICAgICAgICAgICAgICAgcHJpbWFyaWVzLCB0cmFuc2ZlciwgY29lZmZzLCBmdWxsUmFuZ2UsIGFzcGVjdHMpOwotCi0gICAgICAgIC8vIG9ubHkgc3RvcmUgdGhlIGZpcnN0IGNvbG9yIHNwZWNpZmljYXRpb24KLSAgICAgICAgaWYgKCFtTGFzdFRyYWNrLT5tZXRhLT5oYXNEYXRhKGtLZXlDb2xvclByaW1hcmllcykpIHsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlDb2xvclByaW1hcmllcywgYXNwZWN0cy5tUHJpbWFyaWVzKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlUcmFuc2ZlckZ1bmN0aW9uLCBhc3BlY3RzLm1UcmFuc2Zlcik7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5Q29sb3JNYXRyaXgsIGFzcGVjdHMubU1hdHJpeENvZWZmcyk7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5Q29sb3JSYW5nZSwgYXNwZWN0cy5tUmFuZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZGVsZXRlW10gYnVmZmVyOwotICAgIGJ1ZmZlciA9IE5VTEw7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZTNHUFBNZXRhRGF0YShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUsIGludCBkZXB0aCkgewotICAgIGlmIChzaXplIDwgNCB8fCBzaXplID09IFNJWkVfTUFYKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdWludDhfdCAqYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3Rbc2l6ZSArIDFdOwotICAgIGlmIChidWZmZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICBvZmZzZXQsIGJ1ZmZlciwgc2l6ZSkgIT0gKHNzaXplX3Qpc2l6ZSkgewotICAgICAgICBkZWxldGVbXSBidWZmZXI7Ci0gICAgICAgIGJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLQotICAgIHVpbnQzMl90IG1ldGFkYXRhS2V5ID0gMDsKLSAgICBzd2l0Y2ggKG1QYXRoW2RlcHRoXSkgewotICAgICAgICBjYXNlIEZPVVJDQygndCcsICdpJywgJ3QnLCAnbCcpOgotICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlUaXRsZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdwJywgJ2UnLCAncicsICdmJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFydGlzdDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ3UnLCAndCcsICdoJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleVdyaXRlcjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdnJywgJ24nLCAncicsICdlJyk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUdlbnJlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAnbCcsICdiJywgJ20nKToKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGJ1ZmZlcltzaXplIC0gMV0gIT0gJ1wwJykgewotICAgICAgICAgICAgICBjaGFyIHRtcFs0XTsKLSAgICAgICAgICAgICAgc3ByaW50Zih0bXAsICIldSIsIGJ1ZmZlcltzaXplIC0gMV0pOwotCi0gICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEtPnNldENTdHJpbmcoa0tleUNEVHJhY2tOdW1iZXIsIHRtcCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFsYnVtOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3knLCAncicsICdyJywgJ2MnKToKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNpemUgPCA2KSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlW10gYnVmZmVyOwotICAgICAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImIvNjIxMzMyMjciKTsKLSAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjYyMTMzMjI3Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoYXIgdG1wWzVdOwotICAgICAgICAgICAgdWludDE2X3QgeWVhciA9IFUxNl9BVCgmYnVmZmVyWzRdKTsKLQotICAgICAgICAgICAgaWYgKHllYXIgPCAxMDAwMCkgewotICAgICAgICAgICAgICAgIHNwcmludGYodG1wLCAiJXUiLCB5ZWFyKTsKLQotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEtPnNldENTdHJpbmcoa0tleVllYXIsIHRtcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAobWV0YWRhdGFLZXkgPiAwKSB7Ci0gICAgICAgIGJvb2wgaXNVVEY4ID0gdHJ1ZTsgLy8gQ29tbW9uIGNhc2UKLSAgICAgICAgY2hhcjE2X3QgKmZyYW1lZGF0YSA9IE5VTEw7Ci0gICAgICAgIGludCBsZW4xNiA9IDA7IC8vIE51bWJlciBvZiBVVEYtMTYgY2hhcmFjdGVycwotCi0gICAgICAgIC8vIHNtYWxsZXN0IHBvc3NpYmxlIHZhbGlkIFVURi0xNiBzdHJpbmcgdyBCT006IDB4ZmUgMHhmZiAweDAwIDB4MDAKLSAgICAgICAgaWYgKHNpemUgPCA2KSB7Ci0gICAgICAgICAgICBkZWxldGVbXSBidWZmZXI7Ci0gICAgICAgICAgICBidWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzaXplIC0gNiA+PSA0KSB7Ci0gICAgICAgICAgICBsZW4xNiA9ICgoc2l6ZSAtIDYpIC8gMikgLSAxOyAvLyBkb24ndCBpbmNsdWRlIDB4MDAwMCB0ZXJtaW5hdG9yCi0gICAgICAgICAgICBmcmFtZWRhdGEgPSAoY2hhcjE2X3QgKikoYnVmZmVyICsgNik7Ci0gICAgICAgICAgICBpZiAoMHhmZmZlID09ICpmcmFtZWRhdGEpIHsKLSAgICAgICAgICAgICAgICAvLyBlbmRpYW5uZXNzIG1hcmtlciAoQk9NKSBkb2Vzbid0IG1hdGNoIGhvc3QgZW5kaWFubmVzcwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuMTY7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBmcmFtZWRhdGFbaV0gPSBic3dhcF8xNihmcmFtZWRhdGFbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBCT00gaXMgbm93IHN3YXBwZWQgdG8gMHhmZWZmLCB3ZSB3aWxsIGV4ZWN1dGUgbmV4dCBibG9jayB0b28KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKDB4ZmVmZiA9PSAqZnJhbWVkYXRhKSB7Ci0gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBCT00KLSAgICAgICAgICAgICAgICBmcmFtZWRhdGErKzsKLSAgICAgICAgICAgICAgICBsZW4xNi0tOwotICAgICAgICAgICAgICAgIGlzVVRGOCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gZWxzZSBub3JtYWwgbm9uLXplcm8tbGVuZ3RoIFVURi04IHN0cmluZwotICAgICAgICAgICAgLy8gd2UgY2FuJ3QgaGFuZGxlIFVURi0xNiB3aXRob3V0IEJPTSBhcyB0aGVyZSBpcyBubyBvdGhlcgotICAgICAgICAgICAgLy8gaW5kaWNhdGlvbiBvZiBlbmNvZGluZy4KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc1VURjgpIHsKLSAgICAgICAgICAgIGJ1ZmZlcltzaXplXSA9IDA7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRDU3RyaW5nKG1ldGFkYXRhS2V5LCAoY29uc3QgY2hhciAqKWJ1ZmZlciArIDYpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gQ29udmVydCBmcm9tIFVURi0xNiBzdHJpbmcgdG8gVVRGLTggc3RyaW5nLgotICAgICAgICAgICAgU3RyaW5nOCB0bXBVVEY4c3RyKGZyYW1lZGF0YSwgbGVuMTYpOwotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0Q1N0cmluZyhtZXRhZGF0YUtleSwgdG1wVVRGOHN0ci5zdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBkZWxldGVbXSBidWZmZXI7Ci0gICAgYnVmZmVyID0gTlVMTDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VJRDN2Mk1ldGFEYXRhKG9mZjY0X3Qgb2Zmc2V0KSB7Ci0gICAgSUQzIGlkMyhtRGF0YVNvdXJjZSwgdHJ1ZSAvKiBpZ25vcmV2MSAqLywgb2Zmc2V0KTsKLQotICAgIGlmIChpZDMuaXNWYWxpZCgpKSB7Ci0gICAgICAgIHN0cnVjdCBNYXAgewotICAgICAgICAgICAgaW50IGtleTsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRhZzE7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICp0YWcyOwotICAgICAgICB9OwotICAgICAgICBzdGF0aWMgY29uc3QgTWFwIGtNYXBbXSA9IHsKLSAgICAgICAgICAgIHsga0tleUFsYnVtLCAiVEFMQiIsICJUQUwiIH0sCi0gICAgICAgICAgICB7IGtLZXlBcnRpc3QsICJUUEUxIiwgIlRQMSIgfSwKLSAgICAgICAgICAgIHsga0tleUFsYnVtQXJ0aXN0LCAiVFBFMiIsICJUUDIiIH0sCi0gICAgICAgICAgICB7IGtLZXlDb21wb3NlciwgIlRDT00iLCAiVENNIiB9LAotICAgICAgICAgICAgeyBrS2V5R2VucmUsICJUQ09OIiwgIlRDTyIgfSwKLSAgICAgICAgICAgIHsga0tleVRpdGxlLCAiVElUMiIsICJUVDIiIH0sCi0gICAgICAgICAgICB7IGtLZXlZZWFyLCAiVFlFIiwgIlRZRVIiIH0sCi0gICAgICAgICAgICB7IGtLZXlBdXRob3IsICJUWFQiLCAiVEVYVCIgfSwKLSAgICAgICAgICAgIHsga0tleUNEVHJhY2tOdW1iZXIsICJUUksiLCAiVFJDSyIgfSwKLSAgICAgICAgICAgIHsga0tleURpc2NOdW1iZXIsICJUUEEiLCAiVFBPUyIgfSwKLSAgICAgICAgICAgIHsga0tleUNvbXBpbGF0aW9uLCAiVENQIiwgIlRDTVAiIH0sCi0gICAgICAgIH07Ci0gICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga051bU1hcEVudHJpZXMgPSBzaXplb2Yoa01hcCkgLyBzaXplb2Yoa01hcFswXSk7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtTWFwRW50cmllczsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoIW1GaWxlTWV0YURhdGEtPmhhc0RhdGEoa01hcFtpXS5rZXkpKSB7Ci0gICAgICAgICAgICAgICAgSUQzOjpJdGVyYXRvciAqaXQgPSBuZXcgSUQzOjpJdGVyYXRvcihpZDMsIGtNYXBbaV0udGFnMSk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0LT5kb25lKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGl0OwotICAgICAgICAgICAgICAgICAgICBpdCA9IG5ldyBJRDM6Okl0ZXJhdG9yKGlkMywga01hcFtpXS50YWcyKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXQtPmRvbmUoKSkgewotICAgICAgICAgICAgICAgICAgICBkZWxldGUgaXQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFN0cmluZzggczsKLSAgICAgICAgICAgICAgICBpdC0+Z2V0U3RyaW5nKCZzKTsKLSAgICAgICAgICAgICAgICBkZWxldGUgaXQ7Ci0KLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXRDU3RyaW5nKGtNYXBbaV0ua2V5LCBzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHNpemVfdCBkYXRhU2l6ZTsKLSAgICAgICAgU3RyaW5nOCBtaW1lOwotICAgICAgICBjb25zdCB2b2lkICpkYXRhID0gaWQzLmdldEFsYnVtQXJ0KCZkYXRhU2l6ZSwgJm1pbWUpOwotCi0gICAgICAgIGlmIChkYXRhKSB7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLT5zZXREYXRhKGtLZXlBbGJ1bUFydCwgTWV0YURhdGE6OlRZUEVfTk9ORSwgZGF0YSwgZGF0YVNpemUpOwotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5QWxidW1BcnRNSU1FLCBtaW1lLnN0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3A8SU1lZGlhU291cmNlPiBNUEVHNEV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7Ci0gICAgc3RhdHVzX3QgZXJyOwotICAgIGlmICgoZXJyID0gcmVhZE1ldGFEYXRhKCkpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIFRyYWNrICp0cmFjayA9IG1GaXJzdFRyYWNrOwotICAgIHdoaWxlIChpbmRleCA+IDApIHsKLSAgICAgICAgaWYgKHRyYWNrID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJhY2sgPSB0cmFjay0+bmV4dDsKLSAgICAgICAgLS1pbmRleDsKLSAgICB9Ci0KLSAgICBpZiAodHJhY2sgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLQotICAgIFRyZXggKnRyZXggPSBOVUxMOwotICAgIGludDMyX3QgdHJhY2tJZDsKLSAgICBpZiAodHJhY2stPm1ldGEtPmZpbmRJbnQzMihrS2V5VHJhY2tJRCwgJnRyYWNrSWQpKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyZXguc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFRyZXggKnQgPSAmbVRyZXguZWRpdEl0ZW1BdChpKTsKLSAgICAgICAgICAgIGlmICh0LT50cmFja19JRCA9PSAodWludDMyX3QpIHRyYWNrSWQpIHsKLSAgICAgICAgICAgICAgICB0cmV4ID0gdDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJiLzIxNjU3OTU3Iik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIEFMT0dWKCJnZXRUcmFjayBjYWxsZWQsIHBzc2g6ICV6dSIsIG1Qc3NoLnNpemUoKSk7Ci0KLSAgICBjb25zdCBjaGFyICptaW1lOwotICAgIGlmICghdHJhY2stPm1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7Ci0gICAgICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7Ci0gICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLT5maW5kRGF0YShrS2V5QVZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOwotCi0gICAgICAgIGlmIChzaXplIDwgNyB8fCBwdHJbMF0gIT0gMSkgeyAgLy8gY29uZmlndXJhdGlvblZlcnNpb24gPT0gMQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpKSB7Ci0gICAgICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7Ci0gICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLT5maW5kRGF0YShrS2V5SFZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOwotCi0gICAgICAgIGlmIChzaXplIDwgMjIgfHwgcHRyWzBdICE9IDEpIHsgIC8vIGNvbmZpZ3VyYXRpb25WZXJzaW9uID09IDEKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3A8TVBFRzRTb3VyY2U+IHNvdXJjZSA9ICBuZXcgTVBFRzRTb3VyY2UodGhpcywKLSAgICAgICAgICAgIHRyYWNrLT5tZXRhLCBtRGF0YVNvdXJjZSwgdHJhY2stPnRpbWVzY2FsZSwgdHJhY2stPnNhbXBsZVRhYmxlLAotICAgICAgICAgICAgbVNpZHhFbnRyaWVzLCB0cmV4LCBtTW9vZk9mZnNldCwgbUl0ZW1UYWJsZSk7Ci0gICAgaWYgKHNvdXJjZS0+aW5pdCgpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gc291cmNlOwotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjp2ZXJpZnlUcmFjayhUcmFjayAqdHJhY2spIHsKLSAgICBjb25zdCBjaGFyICptaW1lOwotICAgIENIRUNLKHRyYWNrLT5tZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7Ci0KLSAgICB1aW50MzJfdCB0eXBlOwotICAgIGNvbnN0IHZvaWQgKmRhdGE7Ci0gICAgc2l6ZV90IHNpemU7Ci0gICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykpIHsKLSAgICAgICAgaWYgKCF0cmFjay0+bWV0YS0+ZmluZERhdGEoa0tleUFWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpCi0gICAgICAgICAgICAgICAgfHwgdHlwZSAhPSBrVHlwZUFWQ0MpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpKSB7Ci0gICAgICAgIGlmICghdHJhY2stPm1ldGEtPmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKQotICAgICAgICAgICAgICAgICAgICB8fCB0eXBlICE9IGtUeXBlSFZDQykgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpCi0gICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMikKLSAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpIHsKLSAgICAgICAgaWYgKCF0cmFjay0+bWV0YS0+ZmluZERhdGEoa0tleUVTRFMsICZ0eXBlLCAmZGF0YSwgJnNpemUpCi0gICAgICAgICAgICAgICAgfHwgdHlwZSAhPSBrVHlwZUVTRFMpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwgfHwgIXRyYWNrLT5zYW1wbGVUYWJsZS0+aXNWYWxpZCgpKSB7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGFsbCB0aGUgbWV0YWRhdGEgd2UgbmVlZC4KLSAgICAgICAgQUxPR0UoInN0YmwgYXRvbSBtaXNzaW5nL2ludmFsaWQuIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKHRyYWNrLT50aW1lc2NhbGUgPT0gMCkgewotICAgICAgICBBTE9HRSgidGltZXNjYWxlIGludmFsaWQuIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi10eXBlZGVmIGVudW0gewotICAgIC8vQU9UX05PTkUgICAgICAgICAgICAgPSAtMSwKLSAgICAvL0FPVF9OVUxMX09CSkVDVCAgICAgID0gMCwKLSAgICAvL0FPVF9BQUNfTUFJTiAgICAgICAgID0gMSwgLyoqPCBNYWluIHByb2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEFPVF9BQUNfTEMgICAgICAgICAgID0gMiwgICAvKio8IExvdyBDb21wbGV4aXR5IG9iamVjdCAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLy9BT1RfQUFDX1NTUiAgICAgICAgICA9IDMsCi0gICAgLy9BT1RfQUFDX0xUUCAgICAgICAgICA9IDQsCi0gICAgQU9UX1NCUiAgICAgICAgICAgICAgPSA1LAotICAgIC8vQU9UX0FBQ19TQ0FMICAgICAgICAgPSA2LAotICAgIC8vQU9UX1RXSU5fVlEgICAgICAgICAgPSA3LAotICAgIC8vQU9UX0NFTFAgICAgICAgICAgICAgPSA4LAotICAgIC8vQU9UX0hWWEMgICAgICAgICAgICAgPSA5LAotICAgIC8vQU9UX1JTVkRfMTAgICAgICAgICAgPSAxMCwgLyoqPCAocmVzZXJ2ZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8vQU9UX1JTVkRfMTEgICAgICAgICAgPSAxMSwgLyoqPCAocmVzZXJ2ZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8vQU9UX1RUU0kgICAgICAgICAgICAgPSAxMiwgLyoqPCBUVFNJIE9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8vQU9UX01BSU5fU1lOVEggICAgICAgPSAxMywgLyoqPCBNYWluIFN5bnRoZXRpYyBvYmplY3QgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8vQU9UX1dBVl9UQUJfU1lOVEggICAgPSAxNCwgLyoqPCBXYXZldGFibGUgU3ludGhlc2lzIG9iamVjdCAgICAgICAgICAgICAgICAqLwotICAgIC8vQU9UX0dFTl9NSURJICAgICAgICAgPSAxNSwgLyoqPCBHZW5lcmFsIE1JREkgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8vQU9UX0FMR19TWU5USF9BVURfRlggPSAxNiwgLyoqPCBBbGdvcml0aG1pYyBTeW50aGVzaXMgYW5kIEF1ZGlvIEZYIG9iamVjdCAqLwotICAgIEFPVF9FUl9BQUNfTEMgICAgICAgID0gMTcsICAgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEFBQyBMb3cgQ29tcGxleGl0eSAgICAqLwotICAgIC8vQU9UX1JTVkRfMTggICAgICAgICAgPSAxOCwgLyoqPCAocmVzZXJ2ZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8vQU9UX0VSX0FBQ19MVFAgICAgICAgPSAxOSwgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEFBQyBMVFAgb2JqZWN0ICAgICAgICAqLwotICAgIEFPVF9FUl9BQUNfU0NBTCAgICAgID0gMjAsICAgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEFBQyBTY2FsYWJsZSBvYmplY3QgICAqLwotICAgIC8vQU9UX0VSX1RXSU5fVlEgICAgICAgPSAyMSwgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIFR3aW5WUSBvYmplY3QgICAgICAgICAqLwotICAgIEFPVF9FUl9CU0FDICAgICAgICAgID0gMjIsICAgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEJTQUMgb2JqZWN0ICAgICAgICAgICAqLwotICAgIEFPVF9FUl9BQUNfTEQgICAgICAgID0gMjMsICAgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEFBQyBMb3dEZWxheSBvYmplY3QgICAqLwotICAgIC8vQU9UX0VSX0NFTFAgICAgICAgICAgPSAyNCwgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIENFTFAgb2JqZWN0ICAgICAgICAgICAqLwotICAgIC8vQU9UX0VSX0hWWEMgICAgICAgICAgPSAyNSwgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEhWWEMgb2JqZWN0ICAgICAgICAgICAqLwotICAgIC8vQU9UX0VSX0hJTE4gICAgICAgICAgPSAyNiwgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIEhJTE4gb2JqZWN0ICAgICAgICAgICAqLwotICAgIC8vQU9UX0VSX1BBUkEgICAgICAgICAgPSAyNywgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIFBhcmFtZXRyaWMgb2JqZWN0ICAgICAqLwotICAgIC8vQU9UX1JTVkRfMjggICAgICAgICAgPSAyOCwgLyoqPCBtaWdodCBiZWNvbWUgU1NDICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEFPVF9QUyAgICAgICAgICAgICAgID0gMjksICAgLyoqPCBQUywgUGFyYW1ldHJpYyBTdGVyZW8gKGluY2x1ZGVzIFNCUikgICAgICAqLwotICAgIC8vQU9UX01QRUdTICAgICAgICAgICAgPSAzMCwgLyoqPCBNUEVHIFN1cnJvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgQU9UX0VTQ0FQRSAgICAgICAgICAgPSAzMSwgICAvKio8IFNpZ25hbCBBT1QgdXNlcyBtb3JlIHRoYW4gNSBiaXRzICAgICAgICAgICovCi0KLSAgICAvL0FPVF9NUDNPTk1QNF9MMSAgICAgID0gMzIsIC8qKjwgTVBFRy1MYXllcjEgaW4gbXA0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvL0FPVF9NUDNPTk1QNF9MMiAgICAgID0gMzMsIC8qKjwgTVBFRy1MYXllcjIgaW4gbXA0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvL0FPVF9NUDNPTk1QNF9MMyAgICAgID0gMzQsIC8qKjwgTVBFRy1MYXllcjMgaW4gbXA0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvL0FPVF9SU1ZEXzM1ICAgICAgICAgID0gMzUsIC8qKjwgbWlnaHQgYmVjb21lIERTVCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvL0FPVF9SU1ZEXzM2ICAgICAgICAgID0gMzYsIC8qKjwgbWlnaHQgYmVjb21lIEFMUyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvL0FPVF9BQUNfU0xTICAgICAgICAgID0gMzcsIC8qKjwgQUFDICsgU0xTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvL0FPVF9TTFMgICAgICAgICAgICAgID0gMzgsIC8qKjwgU0xTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvL0FPVF9FUl9BQUNfRUxEICAgICAgID0gMzksIC8qKjwgQUFDIEVuaGFuY2VkIExvdyBEZWxheSAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIC8vQU9UX1VTQUMgICAgICAgICAgICAgPSA0MiwgLyoqPCBVU0FDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8vQU9UX1NBT0MgICAgICAgICAgICAgPSA0MywgLyoqPCBTQU9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8vQU9UX0xEX01QRUdTICAgICAgICAgPSA0NCwgLyoqPCBMb3cgRGVsYXkgTVBFRyBTdXJyb3VuZCAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgLy9BT1RfUlNWRDUwICAgICAgICAgICA9IDUwLCAgLyoqPCBJbnRlcmltIEFPVCBmb3IgUnN2ZDUwICAgICAgICAgICAgICAgICAgICovCi19IEFVRElPX09CSkVDVF9UWVBFOwotCi1zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6dXBkYXRlQXVkaW9UcmFja0luZm9Gcm9tRVNEU19NUEVHNEF1ZGlvKAotICAgICAgICBjb25zdCB2b2lkICplc2RzX2RhdGEsIHNpemVfdCBlc2RzX3NpemUpIHsKLSAgICBFU0RTIGVzZHMoZXNkc19kYXRhLCBlc2RzX3NpemUpOwotCi0gICAgdWludDhfdCBvYmplY3RUeXBlSW5kaWNhdGlvbjsKLSAgICBpZiAoZXNkcy5nZXRPYmplY3RUeXBlSW5kaWNhdGlvbigmb2JqZWN0VHlwZUluZGljYXRpb24pICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKG9iamVjdFR5cGVJbmRpY2F0aW9uID09IDB4ZTEpIHsKLSAgICAgICAgLy8gVGhpcyBpc24ndCBNUEVHNCBhdWRpbyBhdCBhbGwsIGl0J3MgUUNFTFAgMTRrLi4uCi0gICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotCi0gICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19RQ0VMUCk7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBpZiAob2JqZWN0VHlwZUluZGljYXRpb24gID09IDB4NmIpIHsKLSAgICAgICAgLy8gVGhlIG1lZGlhIHN1YnR5cGUgaXMgTVAzIGF1ZGlvCi0gICAgICAgIC8vIE91ciBzb2Z0d2FyZSBNUDMgYXVkaW8gZGVjb2RlciBtYXkgbm90IGJlIGFibGUgdG8gaGFuZGxlCi0gICAgICAgIC8vIHBhY2tldGl6ZWQgTVAzIGF1ZGlvOyBmb3Igbm93LCBsZXRzIGp1c3QgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVECi0gICAgICAgIEFMT0dFKCJNUDMgdHJhY2sgaW4gTVA0LzNHUFAgZmlsZSBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBjb25zdCB1aW50OF90ICpjc2Q7Ci0gICAgc2l6ZV90IGNzZF9zaXplOwotICAgIGlmIChlc2RzLmdldENvZGVjU3BlY2lmaWNJbmZvKAotICAgICAgICAgICAgICAgIChjb25zdCB2b2lkICoqKSZjc2QsICZjc2Rfc2l6ZSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAoa1VzZUhleER1bXApIHsKLSAgICAgICAgcHJpbnRmKCJFU0Qgb2Ygc2l6ZSAlenVcbiIsIGNzZF9zaXplKTsKLSAgICAgICAgaGV4ZHVtcChjc2QsIGNzZF9zaXplKTsKLSAgICB9Ci0KLSAgICBpZiAoY3NkX3NpemUgPT0gMCkgewotICAgICAgICAvLyBUaGVyZSdzIG5vIGZ1cnRoZXIgaW5mb3JtYXRpb24sIGkuZS4gbm8gY29kZWMgc3BlY2lmaWMgZGF0YQotICAgICAgICAvLyBMZXQncyBhc3N1bWUgdGhhdCB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgaW4gdGhlIG1wZWc0IGhlYWRlcnMKLSAgICAgICAgLy8gaXMgYWNjdXJhdGUgYW5kIGhvcGUgZm9yIHRoZSBiZXN0LgotCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBpZiAoY3NkX3NpemUgPCAyKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgc3RhdGljIHVpbnQzMl90IGtTYW1wbGluZ1JhdGVbXSA9IHsKLSAgICAgICAgOTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsIDQ0MTAwLCAzMjAwMCwgMjQwMDAsIDIyMDUwLAotICAgICAgICAxNjAwMCwgMTIwMDAsIDExMDI1LCA4MDAwLCA3MzUwCi0gICAgfTsKLQotICAgIEFCaXRSZWFkZXIgYnIoY3NkLCBjc2Rfc2l6ZSk7Ci0gICAgdWludDMyX3Qgb2JqZWN0VHlwZSA9IGJyLmdldEJpdHMoNSk7Ci0KLSAgICBpZiAob2JqZWN0VHlwZSA9PSAzMSkgeyAgLy8gQUFDLUVMRCA9PiBhZGRpdGlvbmFsIDYgYml0cwotICAgICAgICBvYmplY3RUeXBlID0gMzIgKyBici5nZXRCaXRzKDYpOwotICAgIH0KLQotICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCi0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0KLSAgICAvL2tlZXAgQU9UIHR5cGUKLSAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5QUFDQU9ULCBvYmplY3RUeXBlKTsKLQotICAgIHVpbnQzMl90IGZyZXFJbmRleCA9IGJyLmdldEJpdHMoNCk7Ci0KLSAgICBpbnQzMl90IHNhbXBsZVJhdGUgPSAwOwotICAgIGludDMyX3QgbnVtQ2hhbm5lbHMgPSAwOwotICAgIGlmIChmcmVxSW5kZXggPT0gMTUpIHsKLSAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAyOCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgc2FtcGxlUmF0ZSA9IGJyLmdldEJpdHMoMjQpOwotICAgICAgICBudW1DaGFubmVscyA9IGJyLmdldEJpdHMoNCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICBudW1DaGFubmVscyA9IGJyLmdldEJpdHMoNCk7Ci0KLSAgICAgICAgaWYgKGZyZXFJbmRleCA9PSAxMyB8fCBmcmVxSW5kZXggPT0gMTQpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBzYW1wbGVSYXRlID0ga1NhbXBsaW5nUmF0ZVtmcmVxSW5kZXhdOwotICAgIH0KLQotICAgIGlmIChvYmplY3RUeXBlID09IEFPVF9TQlIgfHwgb2JqZWN0VHlwZSA9PSBBT1RfUFMpIHsvL1NCUiBzcGVjaWZpYyBjb25maWcgcGVyIDE0NDk2LTMgdGFibGUgMS4xMwotICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDQpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIHVpbnQzMl90IGV4dEZyZXFJbmRleCA9IGJyLmdldEJpdHMoNCk7Ci0gICAgICAgIGludDMyX3QgZXh0U2FtcGxlUmF0ZSBfX3VudXNlZDsKLSAgICAgICAgaWYgKGV4dEZyZXFJbmRleCA9PSAxNSkgewotICAgICAgICAgICAgaWYgKGNzZF9zaXplIDwgOCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDI0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgZXh0U2FtcGxlUmF0ZSA9IGJyLmdldEJpdHMoMjQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGV4dEZyZXFJbmRleCA9PSAxMyB8fCBleHRGcmVxSW5kZXggPT0gMTQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXh0U2FtcGxlUmF0ZSA9IGtTYW1wbGluZ1JhdGVbZXh0RnJlcUluZGV4XTsKLSAgICAgICAgfQotICAgICAgICAvL1RPRE86IHNhdmUgdGhlIGV4dGVuc2lvbiBzYW1wbGluZyByYXRlIHZhbHVlIGluIG1ldGEgZGF0YSA9PgotICAgICAgICAvLyAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlFeHRTYW1wbGVSYXRlLCBleHRTYW1wbGVSYXRlKTsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKG51bUNoYW5uZWxzKSB7Ci0gICAgICAgIC8vIHZhbHVlcyBkZWZpbmVkIGluIDE0NDk2LTNfMjAwOSBhbWVuZG1lbnQtNCBUYWJsZSAxLjE5IC0gQ2hhbm5lbCBDb25maWd1cmF0aW9uCi0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgY2FzZSAxOi8vIEZDCi0gICAgICAgIGNhc2UgMjovLyBGTCBGUgotICAgICAgICBjYXNlIDM6Ly8gRkMsIEZMIEZSCi0gICAgICAgIGNhc2UgNDovLyBGQywgRkwgRlIsIFJDCi0gICAgICAgIGNhc2UgNTovLyBGQywgRkwgRlIsIFNMIFNSCi0gICAgICAgIGNhc2UgNjovLyBGQywgRkwgRlIsIFNMIFNSLCBMRkUKLSAgICAgICAgICAgIC8vbnVtQ2hhbm5lbHMgYWxyZWFkeSBjb250YWlucyB0aGUgcmlnaHQgdmFsdWUKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDExOi8vIEZDLCBGTCBGUiwgU0wgU1IsIFJDLCBMRkUKLSAgICAgICAgICAgIG51bUNoYW5uZWxzID0gNzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDc6IC8vIEZDLCBGQ0wgRkNSLCBGTCBGUiwgU0wgU1IsIExGRQotICAgICAgICBjYXNlIDEyOi8vIEZDLCBGTCAgRlIsICBTTCBTUiwgUkwgUlIsIExGRQotICAgICAgICBjYXNlIDE0Oi8vIEZDLCBGTCAgRlIsICBTTCBTUiwgTEZFLCBGSEwgRkhSCi0gICAgICAgICAgICBudW1DaGFubmVscyA9IDg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIGlmIChvYmplY3RUeXBlID09IEFPVF9TQlIgfHwgb2JqZWN0VHlwZSA9PSBBT1RfUFMpIHsKLSAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNSkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIG9iamVjdFR5cGUgPSBici5nZXRCaXRzKDUpOwotCi0gICAgICAgICAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfRVNDQVBFKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA2KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgPSAzMiArIGJyLmdldEJpdHMoNik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9iamVjdFR5cGUgPT0gQU9UX0FBQ19MQyB8fCBvYmplY3RUeXBlID09IEFPVF9FUl9BQUNfTEMgfHwKLSAgICAgICAgICAgICAgICBvYmplY3RUeXBlID09IEFPVF9FUl9BQUNfTEQgfHwgb2JqZWN0VHlwZSA9PSBBT1RfRVJfQUFDX1NDQUwgfHwKLSAgICAgICAgICAgICAgICBvYmplY3RUeXBlID09IEFPVF9FUl9CU0FDKSB7Ci0gICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDIpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICBjb25zdCBpbnQzMl90IGZyYW1lTGVuZ3RoRmxhZyBfX3VudXNlZCA9IGJyLmdldEJpdHMoMSk7Ci0KLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZGVwZW5kc09uQ29yZUNvZGVyID0gYnIuZ2V0Qml0cygxKTsKLQotICAgICAgICAgICAgaWYgKGRlcGVuZHNPbkNvcmVDb2RlciApIHsKLSAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDE0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgY29yZUNvZGVyRGVsYXkgX191bnVzZWQgPSBici5nZXRCaXRzKDE0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50MzJfdCBleHRlbnNpb25GbGFnID0gLTE7Ci0gICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBleHRlbnNpb25GbGFnID0gYnIuZ2V0Qml0cygxKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChvYmplY3RUeXBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gMTQ0OTYtMyA0LjUuMS4xIGV4dGVuc2lvbkZsYWcKLSAgICAgICAgICAgICAgICBjYXNlIEFPVF9BQUNfTEM6Ci0gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbkZsYWcgPSAwOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEFPVF9FUl9BQUNfTEM6Ci0gICAgICAgICAgICAgICAgY2FzZSBBT1RfRVJfQUFDX1NDQUw6Ci0gICAgICAgICAgICAgICAgY2FzZSBBT1RfRVJfQlNBQzoKLSAgICAgICAgICAgICAgICBjYXNlIEFPVF9FUl9BQUNfTEQ6Ci0gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbkZsYWcgPSAxOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR1coImNzZCBtaXNzaW5nIGV4dGVuc2lvbiBmbGFnOyBhc3N1bWluZyAlZCBmb3Igb2JqZWN0IHR5cGUgJXUuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbkZsYWcsIG9iamVjdFR5cGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobnVtQ2hhbm5lbHMgPT0gMCkgewotICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbHNFZmZlY3RpdmVOdW0gPSAwOwotICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbHNOdW0gPSAwOwotICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMzIpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBFbGVtZW50SW5zdGFuY2VUYWcgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOwotICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgUHJvZmlsZSBfX3VudXNlZCA9IGJyLmdldEJpdHMoMik7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTYW1wbGluZ0ZyZXF1ZW5jeUluZGV4IF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bUZyb250Q2hhbm5lbEVsZW1lbnRzID0gYnIuZ2V0Qml0cyg0KTsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bVNpZGVDaGFubmVsRWxlbWVudHMgPSBici5nZXRCaXRzKDQpOwotICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtQmFja0NoYW5uZWxFbGVtZW50cyA9IGJyLmdldEJpdHMoNCk7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1MZmVDaGFubmVsRWxlbWVudHMgPSBici5nZXRCaXRzKDIpOwotICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtQXNzb2NEYXRhRWxlbWVudHMgX191bnVzZWQgPSBici5nZXRCaXRzKDMpOwotICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtVmFsaWRDY0VsZW1lbnRzIF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKLQotICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTW9ub01peGRvd25QcmVzZW50ID0gYnIuZ2V0Qml0cygxKTsKLQotICAgICAgICAgICAgICAgIGlmIChNb25vTWl4ZG93blByZXNlbnQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDQpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTW9ub01peGRvd25FbGVtZW50TnVtYmVyIF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDEpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTdGVyZW9NaXhkb3duUHJlc2VudCA9IGJyLmdldEJpdHMoMSk7Ci0gICAgICAgICAgICAgICAgaWYgKFN0ZXJlb01peGRvd25QcmVzZW50ICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFN0ZXJlb01peGRvd25FbGVtZW50TnVtYmVyIF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDEpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNYXRyaXhNaXhkb3duSW5kZXhQcmVzZW50ID0gYnIuZ2V0Qml0cygxKTsKLSAgICAgICAgICAgICAgICBpZiAoTWF0cml4TWl4ZG93bkluZGV4UHJlc2VudCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMykgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNYXRyaXhNaXhkb3duSW5kZXggX191bnVzZWQgPSBici5nZXRCaXRzKDIpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFBzZXVkb1N1cnJvdW5kRW5hYmxlIF9fdW51c2VkID0gYnIuZ2V0Qml0cygxKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bUZyb250Q2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA1KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEZyb250RWxlbWVudElzQ3BlID0gYnIuZ2V0Qml0cygxKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBGcm9udEVsZW1lbnRUYWdTZWxlY3QgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOwotICAgICAgICAgICAgICAgICAgICBjaGFubmVsc051bSArPSBGcm9udEVsZW1lbnRJc0NwZSA/IDIgOiAxOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgTnVtU2lkZUNoYW5uZWxFbGVtZW50czsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNSkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTaWRlRWxlbWVudElzQ3BlID0gYnIuZ2V0Qml0cygxKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTaWRlRWxlbWVudFRhZ1NlbGVjdCBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzTnVtICs9IFNpZGVFbGVtZW50SXNDcGUgPyAyIDogMTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bUJhY2tDaGFubmVsRWxlbWVudHM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDUpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgQmFja0VsZW1lbnRJc0NwZSA9IGJyLmdldEJpdHMoMSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgQmFja0VsZW1lbnRUYWdTZWxlY3QgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOwotICAgICAgICAgICAgICAgICAgICBjaGFubmVsc051bSArPSBCYWNrRWxlbWVudElzQ3BlID8gMiA6IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNoYW5uZWxzRWZmZWN0aXZlTnVtID0gY2hhbm5lbHNOdW07Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bUxmZUNoYW5uZWxFbGVtZW50czsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBMZmVFbGVtZW50VGFnU2VsZWN0IF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNOdW0gKz0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR1YoIm1wZWc0IGF1ZGlvIGNoYW5uZWxzTnVtID0gJWQiLCBjaGFubmVsc051bSk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIm1wZWc0IGF1ZGlvIGNoYW5uZWxzRWZmZWN0aXZlTnVtID0gJWQiLCBjaGFubmVsc0VmZmVjdGl2ZU51bSk7Ci0gICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMgPSBjaGFubmVsc051bTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChudW1DaGFubmVscyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotCi0gICAgaW50MzJfdCBwcmV2U2FtcGxlUmF0ZTsKLSAgICBDSEVDSyhtTGFzdFRyYWNrLT5tZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZwcmV2U2FtcGxlUmF0ZSkpOwotCi0gICAgaWYgKHByZXZTYW1wbGVSYXRlICE9IHNhbXBsZVJhdGUpIHsKLSAgICAgICAgQUxPR1YoIm1wZWc0IGF1ZGlvIHNhbXBsZSByYXRlIGRpZmZlcmVudCBmcm9tIHByZXZpb3VzIHNldHRpbmcuICIKLSAgICAgICAgICAgICAid2FzOiAlZCwgbm93OiAlZCIsIHByZXZTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKLSAgICB9Ci0KLSAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7Ci0KLSAgICBpbnQzMl90IHByZXZDaGFubmVsQ291bnQ7Ci0gICAgQ0hFQ0sobUxhc3RUcmFjay0+bWV0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZwcmV2Q2hhbm5lbENvdW50KSk7Ci0KLSAgICBpZiAocHJldkNoYW5uZWxDb3VudCAhPSBudW1DaGFubmVscykgewotICAgICAgICBBTE9HVigibXBlZzQgYXVkaW8gY2hhbm5lbCBjb3VudCBkaWZmZXJlbnQgZnJvbSBwcmV2aW91cyBzZXR0aW5nLiAiCi0gICAgICAgICAgICAgIndhczogJWQsIG5vdzogJWQiLCBwcmV2Q2hhbm5lbENvdW50LCBudW1DaGFubmVscyk7Ci0gICAgfQotCi0gICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtQ2hhbm5lbHMpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1NUEVHNFNvdXJjZTo6TVBFRzRTb3VyY2UoCi0gICAgICAgIGNvbnN0IHNwPE1QRUc0RXh0cmFjdG9yPiAmb3duZXIsCi0gICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0LAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YVNvdXJjZSwKLSAgICAgICAgaW50MzJfdCB0aW1lU2NhbGUsCi0gICAgICAgIGNvbnN0IHNwPFNhbXBsZVRhYmxlPiAmc2FtcGxlVGFibGUsCi0gICAgICAgIFZlY3RvcjxTaWR4RW50cnk+ICZzaWR4LAotICAgICAgICBjb25zdCBUcmV4ICp0cmV4LAotICAgICAgICBvZmY2NF90IGZpcnN0TW9vZk9mZnNldCwKLSAgICAgICAgY29uc3Qgc3A8SXRlbVRhYmxlPiAmaXRlbVRhYmxlKQotICAgIDogbU93bmVyKG93bmVyKSwKLSAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKLSAgICAgIG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAotICAgICAgbVRpbWVzY2FsZSh0aW1lU2NhbGUpLAotICAgICAgbVNhbXBsZVRhYmxlKHNhbXBsZVRhYmxlKSwKLSAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXgoMCksCi0gICAgICBtQ3VycmVudEZyYWdtZW50SW5kZXgoMCksCi0gICAgICBtU2VnbWVudHMoc2lkeCksCi0gICAgICBtVHJleCh0cmV4KSwKLSAgICAgIG1GaXJzdE1vb2ZPZmZzZXQoZmlyc3RNb29mT2Zmc2V0KSwKLSAgICAgIG1DdXJyZW50TW9vZk9mZnNldChmaXJzdE1vb2ZPZmZzZXQpLAotICAgICAgbU5leHRNb29mT2Zmc2V0KC0xKSwKLSAgICAgIG1DdXJyZW50VGltZSgwKSwKLSAgICAgIG1DdXJyZW50U2FtcGxlSW5mb0FsbG9jU2l6ZSgwKSwKLSAgICAgIG1DdXJyZW50U2FtcGxlSW5mb1NpemVzKE5VTEwpLAotICAgICAgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0c0FsbG9jU2l6ZSgwKSwKLSAgICAgIG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHMoTlVMTCksCi0gICAgICBtSXNBVkMoZmFsc2UpLAotICAgICAgbUlzSEVWQyhmYWxzZSksCi0gICAgICBtTkFMTGVuZ3RoU2l6ZSgwKSwKLSAgICAgIG1TdGFydGVkKGZhbHNlKSwKLSAgICAgIG1Hcm91cChOVUxMKSwKLSAgICAgIG1CdWZmZXIoTlVMTCksCi0gICAgICBtV2FudHNOQUxGcmFnbWVudHMoZmFsc2UpLAotICAgICAgbVNyY0J1ZmZlcihOVUxMKSwKLSAgICAgIG1Jc0hFSUYoaXRlbVRhYmxlICE9IE5VTEwpLAotICAgICAgbUl0ZW1UYWJsZShpdGVtVGFibGUpIHsKLQotICAgIG1lbXNldCgmbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLCAwLCBzaXplb2YobVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvKSk7Ci0KLSAgICBtRm9ybWF0LT5maW5kSW50MzIoa0tleUNyeXB0b01vZGUsICZtQ3J5cHRvTW9kZSk7Ci0gICAgbURlZmF1bHRJVlNpemUgPSAwOwotICAgIG1Gb3JtYXQtPmZpbmRJbnQzMihrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSwgJm1EZWZhdWx0SVZTaXplKTsKLSAgICB1aW50MzJfdCBrZXl0eXBlOwotICAgIGNvbnN0IHZvaWQgKmtleTsKLSAgICBzaXplX3Qga2V5c2l6ZTsKLSAgICBpZiAobUZvcm1hdC0+ZmluZERhdGEoa0tleUNyeXB0b0tleSwgJmtleXR5cGUsICZrZXksICZrZXlzaXplKSkgewotICAgICAgICBDSEVDSyhrZXlzaXplIDw9IDE2KTsKLSAgICAgICAgbWVtc2V0KG1DcnlwdG9LZXksIDAsIDE2KTsKLSAgICAgICAgbWVtY3B5KG1DcnlwdG9LZXksIGtleSwga2V5c2l6ZSk7Ci0gICAgfQotCi0gICAgY29uc3QgY2hhciAqbWltZTsKLSAgICBib29sIHN1Y2Nlc3MgPSBtRm9ybWF0LT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKLSAgICBDSEVDSyhzdWNjZXNzKTsKLQotICAgIG1Jc0FWQyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7Ci0gICAgbUlzSEVWQyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpOwotCi0gICAgaWYgKG1Jc0FWQykgewotICAgICAgICB1aW50MzJfdCB0eXBlOwotICAgICAgICBjb25zdCB2b2lkICpkYXRhOwotICAgICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kRGF0YShrS2V5QVZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpOwotCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKLQotICAgICAgICBDSEVDSyhzaXplID49IDcpOwotICAgICAgICBDSEVDS19FUSgodW5zaWduZWQpcHRyWzBdLCAxdSk7ICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbiA9PSAxCi0KLSAgICAgICAgLy8gVGhlIG51bWJlciBvZiBieXRlcyB1c2VkIHRvIGVuY29kZSB0aGUgbGVuZ3RoIG9mIGEgTkFMIHVuaXQuCi0gICAgICAgIG1OQUxMZW5ndGhTaXplID0gMSArIChwdHJbNF0gJiAzKTsKLSAgICB9IGVsc2UgaWYgKG1Jc0hFVkMpIHsKLSAgICAgICAgdWludDMyX3QgdHlwZTsKLSAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKLSAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZERhdGEoa0tleUhWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKTsKLQotICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7Ci0KLSAgICAgICAgQ0hFQ0soc2l6ZSA+PSAyMik7Ci0gICAgICAgIENIRUNLX0VRKCh1bnNpZ25lZClwdHJbMF0sIDF1KTsgIC8vIGNvbmZpZ3VyYXRpb25WZXJzaW9uID09IDEKLQotICAgICAgICBtTkFMTGVuZ3RoU2l6ZSA9IDEgKyAocHRyWzE0ICsgN10gJiAzKTsKLSAgICB9Ci0KLSAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMihrS2V5VHJhY2tJRCwgJm1UcmFja0lkKSk7Ci0KLX0KLQotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OmluaXQoKSB7Ci0gICAgaWYgKG1GaXJzdE1vb2ZPZmZzZXQgIT0gMCkgewotICAgICAgICBvZmY2NF90IG9mZnNldCA9IG1GaXJzdE1vb2ZPZmZzZXQ7Ci0gICAgICAgIHJldHVybiBwYXJzZUNodW5rKCZvZmZzZXQpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLU1QRUc0U291cmNlOjp+TVBFRzRTb3VyY2UoKSB7Ci0gICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgIHN0b3AoKTsKLSAgICB9Ci0gICAgZnJlZShtQ3VycmVudFNhbXBsZUluZm9TaXplcyk7Ci0gICAgZnJlZShtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzKTsKLX0KLQotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgQ0hFQ0soIW1TdGFydGVkKTsKLQotICAgIGludDMyX3QgdmFsOwotICAgIGlmIChwYXJhbXMgJiYgcGFyYW1zLT5maW5kSW50MzIoa0tleVdhbnRzTkFMRnJhZ21lbnRzLCAmdmFsKQotICAgICAgICAmJiB2YWwgIT0gMCkgewotICAgICAgICBtV2FudHNOQUxGcmFnbWVudHMgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1XYW50c05BTEZyYWdtZW50cyA9IGZhbHNlOwotICAgIH0KLQotICAgIGludDMyX3QgdG1wOwotICAgIENIRUNLKG1Gb3JtYXQtPmZpbmRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCAmdG1wKSk7Ci0gICAgc2l6ZV90IG1heF9zaXplID0gdG1wOwotCi0gICAgLy8gQSBzb21ld2hhdCBhcmJpdHJhcnkgbGltaXQgdGhhdCBzaG91bGQgYmUgc3VmZmljaWVudCBmb3IgOGsgdmlkZW8gZnJhbWVzCi0gICAgLy8gSWYgeW91IHNlZSB0aGUgbWVzc2FnZSBiZWxvdyBmb3IgYSB2YWxpZCBpbnB1dCBzdHJlYW06IGluY3JlYXNlIHRoZSBsaW1pdAotICAgIGNvbnN0IHNpemVfdCBrTWF4QnVmZmVyU2l6ZSA9IDY0ICogMTAyNCAqIDEwMjQ7Ci0gICAgaWYgKG1heF9zaXplID4ga01heEJ1ZmZlclNpemUpIHsKLSAgICAgICAgQUxPR0UoImJvZ3VzIG1heCBpbnB1dCBzaXplOiAlenUgPiAlenUiLCBtYXhfc2l6ZSwga01heEJ1ZmZlclNpemUpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICBpZiAobWF4X3NpemUgPT0gMCkgewotICAgICAgICBBTE9HRSgiemVybyBtYXggaW5wdXQgc2l6ZSIpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIC8vIEFsbG93IHVwIHRvIGtNYXhCdWZmZXJzLCBidXQgbm90IGlmIHRoZSB0b3RhbCBleGNlZWRzIGtNYXhCdWZmZXJTaXplLgotICAgIGNvbnN0IHNpemVfdCBrTWF4QnVmZmVycyA9IDg7Ci0gICAgY29uc3Qgc2l6ZV90IGJ1ZmZlcnMgPSBtaW4oa01heEJ1ZmZlclNpemUgLyBtYXhfc2l6ZSwga01heEJ1ZmZlcnMpOwotICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwKGJ1ZmZlcnMsIG1heF9zaXplKTsKLSAgICBtU3JjQnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3RbbWF4X3NpemVdOwotICAgIGlmIChtU3JjQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgLy8gZmlsZSBwcm9iYWJseSBzcGVjaWZpZWQgYSBiYWQgbWF4IHNpemUKLSAgICAgICAgZGVsZXRlIG1Hcm91cDsKLSAgICAgICAgbUdyb3VwID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBtU3RhcnRlZCA9IHRydWU7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE1QRUc0U291cmNlOjpzdG9wKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBDSEVDSyhtU3RhcnRlZCk7Ci0KLSAgICBpZiAobUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgZGVsZXRlW10gbVNyY0J1ZmZlcjsKLSAgICBtU3JjQnVmZmVyID0gTlVMTDsKLQotICAgIGRlbGV0ZSBtR3JvdXA7Ci0gICAgbUdyb3VwID0gTlVMTDsKLQotICAgIG1TdGFydGVkID0gZmFsc2U7Ci0gICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IDA7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE1QRUc0U291cmNlOjpwYXJzZUNodW5rKG9mZjY0X3QgKm9mZnNldCkgewotICAgIHVpbnQzMl90IGhkclsyXTsKLSAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgqb2Zmc2V0LCBoZHIsIDgpIDwgOCkgewotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotICAgIHVpbnQ2NF90IGNodW5rX3NpemUgPSBudG9obChoZHJbMF0pOwotICAgIHVpbnQzMl90IGNodW5rX3R5cGUgPSBudG9obChoZHJbMV0pOwotICAgIG9mZjY0X3QgZGF0YV9vZmZzZXQgPSAqb2Zmc2V0ICsgODsKLQotICAgIGlmIChjaHVua19zaXplID09IDEpIHsKLSAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCArIDgsICZjaHVua19zaXplLCA4KSA8IDgpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgfQotICAgICAgICBjaHVua19zaXplID0gbnRvaDY0KGNodW5rX3NpemUpOwotICAgICAgICBkYXRhX29mZnNldCArPSA4OwotCi0gICAgICAgIGlmIChjaHVua19zaXplIDwgMTYpIHsKLSAgICAgICAgICAgIC8vIFRoZSBzbWFsbGVzdCB2YWxpZCBjaHVuayBpcyAxNiBieXRlcyBsb25nIGluIHRoaXMgY2FzZS4KLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGNodW5rX3NpemUgPCA4KSB7Ci0gICAgICAgIC8vIFRoZSBzbWFsbGVzdCB2YWxpZCBjaHVuayBpcyA4IGJ5dGVzIGxvbmcuCi0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgY2hhciBjaHVua1s1XTsKLSAgICBNYWtlRm91ckNDU3RyaW5nKGNodW5rX3R5cGUsIGNodW5rKTsKLSAgICBBTE9HVigiTVBFRzRTb3VyY2UgY2h1bmsgJXMgQCAlI2xseCIsIGNodW5rLCAobG9uZyBsb25nKSpvZmZzZXQpOwotCi0gICAgb2ZmNjRfdCBjaHVua19kYXRhX3NpemUgPSAqb2Zmc2V0ICsgY2h1bmtfc2l6ZSAtIGRhdGFfb2Zmc2V0OwotCi0gICAgc3dpdGNoKGNodW5rX3R5cGUpIHsKLQotICAgICAgICBjYXNlIEZPVVJDQygndCcsICdyJywgJ2EnLCAnZicpOgotICAgICAgICBjYXNlIEZPVVJDQygnbScsICdvJywgJ28nLCAnZicpOiB7Ci0gICAgICAgICAgICBvZmY2NF90IHN0b3Bfb2Zmc2V0ID0gKm9mZnNldCArIGNodW5rX3NpemU7Ci0gICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQ7Ci0gICAgICAgICAgICB3aGlsZSAoKm9mZnNldCA8IHN0b3Bfb2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuayhvZmZzZXQpOwotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ2YnKSkgewotICAgICAgICAgICAgICAgIC8vICpvZmZzZXQgcG9pbnRzIHRvIHRoZSBib3ggZm9sbG93aW5nIHRoaXMgbW9vZi4gRmluZCB0aGUgbmV4dCBtb29mIGZyb20gdGhlcmUuCi0KLSAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgqb2Zmc2V0LCBoZHIsIDgpIDwgOCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gbW9yZSBib3ggdG8gdGhlIGVuZCBvZiBmaWxlLgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2h1bmtfc2l6ZSA9IG50b2hsKGhkclswXSk7Ci0gICAgICAgICAgICAgICAgICAgIGNodW5rX3R5cGUgPSBudG9obChoZHJbMV0pOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2h1bmtfc2l6ZSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJU08vSUVDIDE0NDk2LTEyOjIwMTIsIDguOC40IE1vdmllIEZyYWdtZW50IEJveCwgbW9vZiBpcyBhIEJveAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggaXMgZGVmaW5lZCBpbiA0LjIgT2JqZWN0IFN0cnVjdHVyZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gY2h1bmtfc2l6ZT09MSwgOCBieXRlcyBmb2xsb3dzIGFzICJsYXJnZXNpemUiLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCArIDgsICZjaHVua19zaXplLCA4KSA8IDgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaHVua19zaXplID0gbnRvaDY0KGNodW5rX3NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNodW5rX3NpemUgPCAxNikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzbWFsbGVzdCB2YWxpZCBjaHVuayBpcyAxNiBieXRlcyBsb25nIGluIHRoaXMgY2FzZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNodW5rX3NpemUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBib3ggZXh0ZW5kcyB0byBlbmQgb2YgZmlsZS4KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaHVua19zaXplIDwgOCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNtYWxsZXN0IHZhbGlkIGNodW5rIGlzIDggYnl0ZXMgbG9uZyBpbiB0aGlzIGNhc2UuCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICdmJykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1OZXh0TW9vZk9mZnNldCA9ICpvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaHVua19zaXplID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ2YnLCAnaCcsICdkJyk6IHsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgICAgICAgICAgaWYgKChlcnIgPSBwYXJzZVRyYWNrRnJhZ21lbnRIZWFkZXIoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSkpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ3InLCAndScsICduJyk6IHsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgICAgICAgICAgaWYgKG1MYXN0UGFyc2VkVHJhY2tJZCA9PSBtVHJhY2tJZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKGVyciA9IHBhcnNlVHJhY2tGcmFnbWVudFJ1bihkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKSkgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEZPVVJDQygncycsICdhJywgJ2knLCAneicpOiB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgICAgICBpZiAoKGVyciA9IHBhcnNlU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25TaXplcyhkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKSkgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnYScsICdpJywgJ28nKTogewotICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICAgICAgaWYgKChlcnIgPSBwYXJzZVNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uT2Zmc2V0cyhkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKSkgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEZPVVJDQygnbScsICdkJywgJ2EnLCAndCcpOiB7Ci0gICAgICAgICAgICAvLyBwYXJzZSBEUk0gaW5mbyBpZiBwcmVzZW50Ci0gICAgICAgICAgICBBTE9HVigiTVBFRzRTb3VyY2U6OnBhcnNlQ2h1bmsgbWRhdCIpOwotICAgICAgICAgICAgLy8gaWYgc2Fpei9zYW9pIHdhcyBwcmV2aW91c2x5IG9ic2VydmVkLCBkbyBzb21ldGhpbmcgd2l0aCB0aGUgc2FtcGxlaW5mb3MKLSAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNUEVHNFNvdXJjZTo6cGFyc2VTYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvblNpemVzKAotICAgICAgICBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCAvKiBzaXplICovKSB7Ci0gICAgQUxPR1YoInBhcnNlU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25TaXplcyIpOwotICAgIC8vIDE0NDk2LTEyIDguNy4xMgotICAgIHVpbnQ4X3QgdmVyc2lvbjsKLSAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgIG9mZnNldCwgJnZlcnNpb24sIHNpemVvZih2ZXJzaW9uKSkKLSAgICAgICAgICAgIDwgKHNzaXplX3Qpc2l6ZW9mKHZlcnNpb24pKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0KLSAgICBpZiAodmVyc2lvbiAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0gICAgb2Zmc2V0Kys7Ci0KLSAgICB1aW50MzJfdCBmbGFnczsKLSAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MjQob2Zmc2V0LCAmZmxhZ3MpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0gICAgb2Zmc2V0ICs9IDM7Ci0KLSAgICBpZiAoZmxhZ3MgJiAxKSB7Ci0gICAgICAgIHVpbnQzMl90IHRtcDsKLSAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnRtcCkpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRBdXhJbmZvVHlwZSA9IHRtcDsKLSAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZ0bXApKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgICAgIG1DdXJyZW50QXV4SW5mb1R5cGVQYXJhbWV0ZXIgPSB0bXA7Ci0gICAgICAgIG9mZnNldCArPSA0OwotICAgIH0KLQotICAgIHVpbnQ4X3QgZGVmc2l6ZTsKLSAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsICZkZWZzaXplLCAxKSAhPSAxKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotICAgIG1DdXJyZW50RGVmYXVsdFNhbXBsZUluZm9TaXplID0gZGVmc2l6ZTsKLSAgICBvZmZzZXQrKzsKLQotICAgIHVpbnQzMl90IHNtcGxjbnQ7Ci0gICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnNtcGxjbnQpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotICAgIG1DdXJyZW50U2FtcGxlSW5mb0NvdW50ID0gc21wbGNudDsKLSAgICBvZmZzZXQgKz0gNDsKLQotICAgIGlmIChtQ3VycmVudERlZmF1bHRTYW1wbGVJbmZvU2l6ZSAhPSAwKSB7Ci0gICAgICAgIEFMT0dWKCJAQEBAIHVzaW5nIGRlZmF1bHQgc2FtcGxlIGluZm8gc2l6ZSBvZiAlZCIsIG1DdXJyZW50RGVmYXVsdFNhbXBsZUluZm9TaXplKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICBpZiAoc21wbGNudCA+IG1DdXJyZW50U2FtcGxlSW5mb0FsbG9jU2l6ZSkgewotICAgICAgICB1aW50OF90ICogbmV3UHRyID0gICh1aW50OF90KikgcmVhbGxvYyhtQ3VycmVudFNhbXBsZUluZm9TaXplcywgc21wbGNudCk7Ci0gICAgICAgIGlmIChuZXdQdHIgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byByZWFsbG9jICV1IC0+ICV1IiwgbUN1cnJlbnRTYW1wbGVJbmZvQWxsb2NTaXplLCBzbXBsY250KTsKLSAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmZvU2l6ZXMgPSBuZXdQdHI7Ci0gICAgICAgIG1DdXJyZW50U2FtcGxlSW5mb0FsbG9jU2l6ZSA9IHNtcGxjbnQ7Ci0gICAgfQotCi0gICAgbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIG1DdXJyZW50U2FtcGxlSW5mb1NpemVzLCBzbXBsY250KTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE1QRUc0U291cmNlOjpwYXJzZVNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uT2Zmc2V0cygKLSAgICAgICAgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgLyogc2l6ZSAqLykgewotICAgIEFMT0dWKCJwYXJzZVNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uT2Zmc2V0cyIpOwotICAgIC8vIDE0NDk2LTEyIDguNy4xMwotICAgIHVpbnQ4X3QgdmVyc2lvbjsKLSAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsICZ2ZXJzaW9uLCBzaXplb2YodmVyc2lvbikpICE9IDEpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLSAgICBvZmZzZXQrKzsKLQotICAgIHVpbnQzMl90IGZsYWdzOwotICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQyNChvZmZzZXQsICZmbGFncykpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLSAgICBvZmZzZXQgKz0gMzsKLQotICAgIHVpbnQzMl90IGVudHJ5Y291bnQ7Ci0gICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJmVudHJ5Y291bnQpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0gICAgb2Zmc2V0ICs9IDQ7Ci0gICAgaWYgKGVudHJ5Y291bnQgPT0gMCkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotICAgIGlmIChlbnRyeWNvdW50ID4gVUlOVDMyX01BWCAvIDgpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAoZW50cnljb3VudCA+IG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHNBbGxvY1NpemUpIHsKLSAgICAgICAgdWludDY0X3QgKm5ld1B0ciA9ICh1aW50NjRfdCAqKXJlYWxsb2MobUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0cywgZW50cnljb3VudCAqIDgpOwotICAgICAgICBpZiAobmV3UHRyID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gcmVhbGxvYyAldSAtPiAldSIsIG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHNBbGxvY1NpemUsIGVudHJ5Y291bnQgKiA4KTsKLSAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0cyA9IG5ld1B0cjsKLSAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0c0FsbG9jU2l6ZSA9IGVudHJ5Y291bnQ7Ci0gICAgfQotICAgIG1DdXJyZW50U2FtcGxlSW5mb09mZnNldENvdW50ID0gZW50cnljb3VudDsKLQotICAgIGlmIChtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnljb3VudDsgaSsrKSB7Ci0gICAgICAgIGlmICh2ZXJzaW9uID09IDApIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHRtcDsKLSAgICAgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZ0bXApKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0c1tpXSA9IHRtcDsKLSAgICAgICAgICAgIG9mZnNldCArPSA0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdWludDY0X3QgdG1wOwotICAgICAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDY0KG9mZnNldCwgJnRtcCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzW2ldID0gdG1wOwotICAgICAgICAgICAgb2Zmc2V0ICs9IDg7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBwYXJzZSBjbGVhci9lbmNyeXB0ZWQgZGF0YQotCi0gICAgb2ZmNjRfdCBkcm1vZmZzZXQgPSBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzWzBdOyAvLyBmcm9tIG1vb2YKLQotICAgIGRybW9mZnNldCArPSBtQ3VycmVudE1vb2ZPZmZzZXQ7Ci0gICAgaW50IGl2bGVuZ3RoOwotICAgIENIRUNLKG1Gb3JtYXQtPmZpbmRJbnQzMihrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSwgJml2bGVuZ3RoKSk7Ci0KLSAgICAvLyBvbmx5IDAsIDggYW5kIDE2IGJ5dGUgaW5pdGlhbGl6YXRpb24gdmVjdG9ycyBhcmUgc3VwcG9ydGVkCi0gICAgaWYgKGl2bGVuZ3RoICE9IDAgJiYgaXZsZW5ndGggIT0gOCAmJiBpdmxlbmd0aCAhPSAxNikgewotICAgICAgICBBTE9HVygidW5zdXBwb3J0ZWQgSVYgbGVuZ3RoOiAlZCIsIGl2bGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0gICAgLy8gcmVhZCBDZW5jU2FtcGxlQXV4aWxpYXJ5RGF0YUZvcm1hdHMKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DdXJyZW50U2FtcGxlSW5mb0NvdW50OyBpKyspIHsKLSAgICAgICAgaWYgKGkgPj0gbUN1cnJlbnRTYW1wbGVzLnNpemUoKSkgewotICAgICAgICAgICAgQUxPR1coInRvbyBmZXcgc2FtcGxlcyIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgU2FtcGxlICpzbXBsID0gJm1DdXJyZW50U2FtcGxlcy5lZGl0SXRlbUF0KGkpOwotCi0gICAgICAgIG1lbXNldChzbXBsLT5pdiwgMCwgMTYpOwotICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkcm1vZmZzZXQsIHNtcGwtPml2LCBpdmxlbmd0aCkgIT0gaXZsZW5ndGgpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgfQotCi0gICAgICAgIGRybW9mZnNldCArPSBpdmxlbmd0aDsKLQotICAgICAgICBpbnQzMl90IHNtcGxpbmZvc2l6ZSA9IG1DdXJyZW50RGVmYXVsdFNhbXBsZUluZm9TaXplOwotICAgICAgICBpZiAoc21wbGluZm9zaXplID09IDApIHsKLSAgICAgICAgICAgIHNtcGxpbmZvc2l6ZSA9IG1DdXJyZW50U2FtcGxlSW5mb1NpemVzW2ldOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzbXBsaW5mb3NpemUgPiBpdmxlbmd0aCkgewotICAgICAgICAgICAgdWludDE2X3QgbnVtc3Vic2FtcGxlczsKLSAgICAgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQxNihkcm1vZmZzZXQsICZudW1zdWJzYW1wbGVzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRybW9mZnNldCArPSAyOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBudW1zdWJzYW1wbGVzOyBqKyspIHsKLSAgICAgICAgICAgICAgICB1aW50MTZfdCBudW1jbGVhcjsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBudW1lbmNyeXB0ZWQ7Ci0gICAgICAgICAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDE2KGRybW9mZnNldCwgJm51bWNsZWFyKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRybW9mZnNldCArPSAyOwotICAgICAgICAgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihkcm1vZmZzZXQsICZudW1lbmNyeXB0ZWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZHJtb2Zmc2V0ICs9IDQ7Ci0gICAgICAgICAgICAgICAgc21wbC0+Y2xlYXJzaXplcy5hZGQobnVtY2xlYXIpOwotICAgICAgICAgICAgICAgIHNtcGwtPmVuY3J5cHRlZHNpemVzLmFkZChudW1lbmNyeXB0ZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc21wbC0+Y2xlYXJzaXplcy5hZGQoMCk7Ci0gICAgICAgICAgICBzbXBsLT5lbmNyeXB0ZWRzaXplcy5hZGQoc21wbC0+c2l6ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnBhcnNlVHJhY2tGcmFnbWVudEhlYWRlcihvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBzaXplKSB7Ci0KLSAgICBpZiAoc2l6ZSA8IDgpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgdWludDMyX3QgZmxhZ3M7Ci0gICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJmZsYWdzKSkgeyAvLyBhY3R1YWxseSB2ZXJzaW9uICsgZmxhZ3MKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiAweGZmMDAwMDAwKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQgKyA0LCAodWludDMyX3QqKSZtTGFzdFBhcnNlZFRyYWNrSWQpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKG1MYXN0UGFyc2VkVHJhY2tJZCAhPSBtVHJhY2tJZCkgewotICAgICAgICAvLyB0aGlzIGlzIG5vdCB0aGUgcmlnaHQgdHJhY2ssIHNraXAgaXQKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRmxhZ3MgPSBmbGFnczsKLSAgICBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubVRyYWNrSUQgPSBtTGFzdFBhcnNlZFRyYWNrSWQ7Ci0gICAgb2Zmc2V0ICs9IDg7Ci0gICAgc2l6ZSAtPSA4OwotCi0gICAgQUxPR1YoImZyYWdtZW50IGhlYWRlcjogJTA4eCAlMDh4IiwgZmxhZ3MsIG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tVHJhY2tJRCk7Ci0KLSAgICBpZiAoZmxhZ3MgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a0Jhc2VEYXRhT2Zmc2V0UHJlc2VudCkgewotICAgICAgICBpZiAoc2l6ZSA8IDgpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDY0KG9mZnNldCwgJm1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tQmFzZURhdGFPZmZzZXQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgICAgIG9mZnNldCArPSA4OwotICAgICAgICBzaXplIC09IDg7Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtTYW1wbGVEZXNjcmlwdGlvbkluZGV4UHJlc2VudCkgewotICAgICAgICBpZiAoc2l6ZSA8IDQpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJm1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tU2FtcGxlRGVzY3JpcHRpb25JbmRleCkpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgICAgIHNpemUgLT0gNDsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a0RlZmF1bHRTYW1wbGVEdXJhdGlvblByZXNlbnQpIHsKLSAgICAgICAgaWYgKHNpemUgPCA0KSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURlZmF1bHRTYW1wbGVEdXJhdGlvbikpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgICAgIHNpemUgLT0gNDsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a0RlZmF1bHRTYW1wbGVTaXplUHJlc2VudCkgewotICAgICAgICBpZiAoc2l6ZSA8IDQpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJm1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGVmYXVsdFNhbXBsZVNpemUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgICAgIG9mZnNldCArPSA0OwotICAgICAgICBzaXplIC09IDQ7Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtEZWZhdWx0U2FtcGxlRmxhZ3NQcmVzZW50KSB7Ci0gICAgICAgIGlmIChzaXplIDwgNCkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EZWZhdWx0U2FtcGxlRmxhZ3MpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgICAgIG9mZnNldCArPSA0OwotICAgICAgICBzaXplIC09IDQ7Ci0gICAgfQotCi0gICAgaWYgKCEoZmxhZ3MgJiBUcmFja0ZyYWdtZW50SGVhZGVySW5mbzo6a0Jhc2VEYXRhT2Zmc2V0UHJlc2VudCkpIHsKLSAgICAgICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1CYXNlRGF0YU9mZnNldCA9IG1DdXJyZW50TW9vZk9mZnNldDsKLSAgICB9Ci0KLSAgICBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURhdGFPZmZzZXQgPSAwOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnBhcnNlVHJhY2tGcmFnbWVudFJ1bihvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBzaXplKSB7Ci0KLSAgICBBTE9HVigiTVBFRzRFeHRyYWN0b3I6OnBhcnNlVHJhY2tGcmFnbWVudFJ1biIpOwotICAgIGlmIChzaXplIDwgOCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBlbnVtIHsKLSAgICAgICAga0RhdGFPZmZzZXRQcmVzZW50ICAgICAgICAgICAgICAgICAgPSAweDAxLAotICAgICAgICBrRmlyc3RTYW1wbGVGbGFnc1ByZXNlbnQgICAgICAgICAgICA9IDB4MDQsCi0gICAgICAgIGtTYW1wbGVEdXJhdGlvblByZXNlbnQgICAgICAgICAgICAgID0gMHgxMDAsCi0gICAgICAgIGtTYW1wbGVTaXplUHJlc2VudCAgICAgICAgICAgICAgICAgID0gMHgyMDAsCi0gICAgICAgIGtTYW1wbGVGbGFnc1ByZXNlbnQgICAgICAgICAgICAgICAgID0gMHg0MDAsCi0gICAgICAgIGtTYW1wbGVDb21wb3NpdGlvblRpbWVPZmZzZXRQcmVzZW50ID0gMHg4MDAsCi0gICAgfTsKLQotICAgIHVpbnQzMl90IGZsYWdzOwotICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZmbGFncykpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0gICAgLy8gfHZlcnNpb258IG9ubHkgYWZmZWN0cyBTYW1wbGVDb21wb3NpdGlvblRpbWVPZmZzZXQgZmllbGQuCi0gICAgLy8gSWYgdmVyc2lvbiA9PSAwLCBTYW1wbGVDb21wb3NpdGlvblRpbWVPZmZzZXQgaXMgdWludDMyX3Q7Ci0gICAgLy8gT3RoZXJ3aXNlLCBTYW1wbGVDb21wb3NpdGlvblRpbWVPZmZzZXQgaXMgaW50MzJfdC4KLSAgICAvLyBTYW1wbGUuY29tcG9zaXRpb25PZmZzZXQgaXMgZGVmaW5lZCBhcyBpbnQzMl90LgotICAgIHVpbnQ4X3QgdmVyc2lvbiA9IGZsYWdzID4+IDI0OwotICAgIGZsYWdzICY9IDB4ZmZmZmZmOwotICAgIEFMT0dWKCJmcmFnbWVudCBydW4gdmVyc2lvbjogMHglMDJ4LCBmbGFnczogMHglMDZ4IiwgdmVyc2lvbiwgZmxhZ3MpOwotCi0gICAgaWYgKChmbGFncyAmIGtGaXJzdFNhbXBsZUZsYWdzUHJlc2VudCkgJiYgKGZsYWdzICYga1NhbXBsZUZsYWdzUHJlc2VudCkpIHsKLSAgICAgICAgLy8gVGhlc2UgdHdvIHNoYWxsIG5vdCBiZSB1c2VkIHRvZ2V0aGVyLgotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBzYW1wbGVDb3VudDsKLSAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0ICsgNCwgJnNhbXBsZUNvdW50KSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICBvZmZzZXQgKz0gODsKLSAgICBzaXplIC09IDg7Ci0KLSAgICB1aW50NjRfdCBkYXRhT2Zmc2V0ID0gbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EYXRhT2Zmc2V0OwotCi0gICAgdWludDMyX3QgZmlyc3RTYW1wbGVGbGFncyA9IDA7Ci0KLSAgICBpZiAoZmxhZ3MgJiBrRGF0YU9mZnNldFByZXNlbnQpIHsKLSAgICAgICAgaWYgKHNpemUgPCA0KSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIGludDMyX3QgZGF0YU9mZnNldERlbHRhOwotICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAodWludDMyX3QqKSZkYXRhT2Zmc2V0RGVsdGEpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgZGF0YU9mZnNldCA9IG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tQmFzZURhdGFPZmZzZXQgKyBkYXRhT2Zmc2V0RGVsdGE7Ci0KLSAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgICAgIHNpemUgLT0gNDsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBrRmlyc3RTYW1wbGVGbGFnc1ByZXNlbnQpIHsKLSAgICAgICAgaWYgKHNpemUgPCA0KSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZmaXJzdFNhbXBsZUZsYWdzKSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotICAgICAgICBvZmZzZXQgKz0gNDsKLSAgICAgICAgc2l6ZSAtPSA0OwotICAgIH0KLQotICAgIHVpbnQzMl90IHNhbXBsZUR1cmF0aW9uID0gMCwgc2FtcGxlU2l6ZSA9IDAsIHNhbXBsZUZsYWdzID0gMCwKLSAgICAgICAgICAgICBzYW1wbGVDdHNPZmZzZXQgPSAwOwotCi0gICAgc2l6ZV90IGJ5dGVzUGVyU2FtcGxlID0gMDsKLSAgICBpZiAoZmxhZ3MgJiBrU2FtcGxlRHVyYXRpb25QcmVzZW50KSB7Ci0gICAgICAgIGJ5dGVzUGVyU2FtcGxlICs9IDQ7Ci0gICAgfSBlbHNlIGlmIChtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUZsYWdzCi0gICAgICAgICAgICAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprRGVmYXVsdFNhbXBsZUR1cmF0aW9uUHJlc2VudCkgewotICAgICAgICBzYW1wbGVEdXJhdGlvbiA9IG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRGVmYXVsdFNhbXBsZUR1cmF0aW9uOwotICAgIH0gZWxzZSBpZiAobVRyZXgpIHsKLSAgICAgICAgc2FtcGxlRHVyYXRpb24gPSBtVHJleC0+ZGVmYXVsdF9zYW1wbGVfZHVyYXRpb247Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYga1NhbXBsZVNpemVQcmVzZW50KSB7Ci0gICAgICAgIGJ5dGVzUGVyU2FtcGxlICs9IDQ7Ci0gICAgfSBlbHNlIGlmIChtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubUZsYWdzCi0gICAgICAgICAgICAmIFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvOjprRGVmYXVsdFNhbXBsZVNpemVQcmVzZW50KSB7Ci0gICAgICAgIHNhbXBsZVNpemUgPSBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURlZmF1bHRTYW1wbGVTaXplOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNhbXBsZVNpemUgPSBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURlZmF1bHRTYW1wbGVTaXplOwotICAgIH0KLQotICAgIGlmIChmbGFncyAmIGtTYW1wbGVGbGFnc1ByZXNlbnQpIHsKLSAgICAgICAgYnl0ZXNQZXJTYW1wbGUgKz0gNDsKLSAgICB9IGVsc2UgaWYgKG1UcmFja0ZyYWdtZW50SGVhZGVySW5mby5tRmxhZ3MKLSAgICAgICAgICAgICYgVHJhY2tGcmFnbWVudEhlYWRlckluZm86OmtEZWZhdWx0U2FtcGxlRmxhZ3NQcmVzZW50KSB7Ci0gICAgICAgIHNhbXBsZUZsYWdzID0gbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EZWZhdWx0U2FtcGxlRmxhZ3M7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2FtcGxlRmxhZ3MgPSBtVHJhY2tGcmFnbWVudEhlYWRlckluZm8ubURlZmF1bHRTYW1wbGVGbGFnczsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBrU2FtcGxlQ29tcG9zaXRpb25UaW1lT2Zmc2V0UHJlc2VudCkgewotICAgICAgICBieXRlc1BlclNhbXBsZSArPSA0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNhbXBsZUN0c09mZnNldCA9IDA7Ci0gICAgfQotCi0gICAgaWYgKHNpemUgPCAob2ZmNjRfdCkoc2FtcGxlQ291bnQgKiBieXRlc1BlclNhbXBsZSkpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgU2FtcGxlIHRtcDsKLSAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc2FtcGxlQ291bnQ7ICsraSkgewotICAgICAgICBpZiAoZmxhZ3MgJiBrU2FtcGxlRHVyYXRpb25QcmVzZW50KSB7Ci0gICAgICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmc2FtcGxlRHVyYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9mZnNldCArPSA0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZsYWdzICYga1NhbXBsZVNpemVQcmVzZW50KSB7Ci0gICAgICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmc2FtcGxlU2l6ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmxhZ3MgJiBrU2FtcGxlRmxhZ3NQcmVzZW50KSB7Ci0gICAgICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmc2FtcGxlRmxhZ3MpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9mZnNldCArPSA0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZsYWdzICYga1NhbXBsZUNvbXBvc2l0aW9uVGltZU9mZnNldFByZXNlbnQpIHsKLSAgICAgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZzYW1wbGVDdHNPZmZzZXQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9mZnNldCArPSA0OwotICAgICAgICB9Ci0KLSAgICAgICAgQUxPR1YoImFkZGluZyBzYW1wbGUgJWQgYXQgb2Zmc2V0IDB4JTA4IiBQUkl4NjQgIiwgc2l6ZSAldSwgZHVyYXRpb24gJXUsICIKLSAgICAgICAgICAgICAgIiBmbGFncyAweCUwOHgiLCBpICsgMSwKLSAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LCBzYW1wbGVTaXplLCBzYW1wbGVEdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAoZmxhZ3MgJiBrRmlyc3RTYW1wbGVGbGFnc1ByZXNlbnQpICYmIGkgPT0gMAotICAgICAgICAgICAgICAgICAgICA/IGZpcnN0U2FtcGxlRmxhZ3MgOiBzYW1wbGVGbGFncyk7Ci0gICAgICAgIHRtcC5vZmZzZXQgPSBkYXRhT2Zmc2V0OwotICAgICAgICB0bXAuc2l6ZSA9IHNhbXBsZVNpemU7Ci0gICAgICAgIHRtcC5kdXJhdGlvbiA9IHNhbXBsZUR1cmF0aW9uOwotICAgICAgICB0bXAuY29tcG9zaXRpb25PZmZzZXQgPSBzYW1wbGVDdHNPZmZzZXQ7Ci0gICAgICAgIG1DdXJyZW50U2FtcGxlcy5hZGQodG1wKTsKLQotICAgICAgICBkYXRhT2Zmc2V0ICs9IHNhbXBsZVNpemU7Ci0gICAgfQotCi0gICAgbVRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvLm1EYXRhT2Zmc2V0ID0gZGF0YU9mZnNldDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3A8TWV0YURhdGE+IE1QRUc0U291cmNlOjpnZXRGb3JtYXQoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHJldHVybiBtRm9ybWF0OwotfQotCi1zaXplX3QgTVBFRzRTb3VyY2U6OnBhcnNlTkFMU2l6ZShjb25zdCB1aW50OF90ICpkYXRhKSBjb25zdCB7Ci0gICAgc3dpdGNoIChtTkFMTGVuZ3RoU2l6ZSkgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICByZXR1cm4gKmRhdGE7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIHJldHVybiBVMTZfQVQoZGF0YSk7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIHJldHVybiAoKHNpemVfdClkYXRhWzBdIDw8IDE2KSB8IFUxNl9BVCgmZGF0YVsxXSk7Ci0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIHJldHVybiBVMzJfQVQoZGF0YSk7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBjYW5ub3QgaGFwcGVuLCBtTkFMTGVuZ3RoU2l6ZSBzcHJpbmdzIHRvIGxpZmUgYnkgYWRkaW5nIDEgdG8KLSAgICAvLyBhIDItYml0IGludGVnZXIuCi0gICAgQ0hFQ0soISJTaG91bGQgbm90IGJlIGhlcmUuIik7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBDSEVDSyhtU3RhcnRlZCk7Ci0KLSAgICBpZiAob3B0aW9ucyAhPSBudWxscHRyICYmIG9wdGlvbnMtPmdldE5vbkJsb2NraW5nKCkgJiYgIW1Hcm91cC0+aGFzX2J1ZmZlcnMoKSkgewotICAgICAgICAqb3V0ID0gbnVsbHB0cjsKLSAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOwotICAgIH0KLQotICAgIGlmIChtRmlyc3RNb29mT2Zmc2V0ID4gMCkgewotICAgICAgICByZXR1cm4gZnJhZ21lbnRlZFJlYWQob3V0LCBvcHRpb25zKTsKLSAgICB9Ci0KLSAgICAqb3V0ID0gTlVMTDsKLQotICAgIGludDY0X3QgdGFyZ2V0U2FtcGxlVGltZVVzID0gLTE7Ci0KLSAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7Ci0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKLSAgICAgICAgaWYgKG1Jc0hFSUYpIHsKLSAgICAgICAgICAgIENIRUNLKG1TYW1wbGVUYWJsZSA9PSBOVUxMKTsKLSAgICAgICAgICAgIENIRUNLKG1JdGVtVGFibGUgIT0gTlVMTCk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGVycjsKLSAgICAgICAgICAgIGlmIChzZWVrVGltZVVzID49IDApIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBtSXRlbVRhYmxlLT5maW5kUHJpbWFyeUltYWdlKCZtQ3VycmVudFNhbXBsZUluZGV4KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gbUl0ZW1UYWJsZS0+ZmluZFRodW1ibmFpbCgmbUN1cnJlbnRTYW1wbGVJbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVpbnQzMl90IGZpbmRGbGFncyA9IDA7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM6Ci0gICAgICAgICAgICAgICAgICAgIGZpbmRGbGFncyA9IFNhbXBsZVRhYmxlOjprRmxhZ0JlZm9yZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBSZWFkT3B0aW9uczo6U0VFS19ORVhUX1NZTkM6Ci0gICAgICAgICAgICAgICAgICAgIGZpbmRGbGFncyA9IFNhbXBsZVRhYmxlOjprRmxhZ0FmdGVyOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQzoKLSAgICAgICAgICAgICAgICBjYXNlIFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1Q6Ci0gICAgICAgICAgICAgICAgICAgIGZpbmRGbGFncyA9IFNhbXBsZVRhYmxlOjprRmxhZ0Nsb3Nlc3Q7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKCEiU2hvdWxkIG5vdCBiZSBoZXJlLiIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXg7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU2FtcGxlVGFibGUtPmZpbmRTYW1wbGVBdFRpbWUoCi0gICAgICAgICAgICAgICAgICAgIHNlZWtUaW1lVXMsIDEwMDAwMDAsIG1UaW1lc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICZzYW1wbGVJbmRleCwgZmluZEZsYWdzKTsKLQotICAgICAgICAgICAgaWYgKG1vZGUgPT0gUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVCkgewotICAgICAgICAgICAgICAgIC8vIFdlIGZvdW5kIHRoZSBjbG9zZXN0IHNhbXBsZSBhbHJlYWR5LCBub3cgd2Ugd2FudCB0aGUgc3luYwotICAgICAgICAgICAgICAgIC8vIHNhbXBsZSBwcmVjZWRpbmcgaXQgKG9yIHRoZSBzYW1wbGUgaXRzZWxmIG9mIGNvdXJzZSksIGV2ZW4KLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgc3Vic2VxdWVudCBzeW5jIHNhbXBsZSBpcyBjbG9zZXIuCi0gICAgICAgICAgICAgICAgZmluZEZsYWdzID0gU2FtcGxlVGFibGU6OmtGbGFnQmVmb3JlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1aW50MzJfdCBzeW5jU2FtcGxlSW5kZXg7Ci0gICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gbVNhbXBsZVRhYmxlLT5maW5kU3luY1NhbXBsZU5lYXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVJbmRleCwgJnN5bmNTYW1wbGVJbmRleCwgZmluZEZsYWdzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlVGltZTsKLSAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBtU2FtcGxlVGFibGUtPmdldE1ldGFEYXRhRm9yU2FtcGxlKAotICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlSW5kZXgsIE5VTEwsIE5VTEwsICZzYW1wbGVUaW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfT1VUX09GX1JBTkdFKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFuIGF0dGVtcHQgdG8gc2VlayBwYXN0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbSB3b3VsZAotICAgICAgICAgICAgICAgICAgICAvLyBub3JtYWxseSBjYXVzZSB0aGlzIEVSUk9SX09VVF9PRl9SQU5HRSBlcnJvci4gUHJvcGFnYXRpbmcKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBhbGwgdGhlIHdheSB0byB0aGUgTWVkaWFQbGF5ZXIgd291bGQgY2F1c2UgYWJub3JtYWwKLSAgICAgICAgICAgICAgICAgICAgLy8gdGVybWluYXRpb24uIExlZ2FjeSBiZWhhdmlvdXIgYXBwZWFycyB0byBiZSB0byBiZWhhdmUgYXMgaWYKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGFkIHNlZWtlZCB0byB0aGUgZW5kIG9mIHN0cmVhbSwgZW5kaW5nIG5vcm1hbGx5LgotICAgICAgICAgICAgICAgICAgICBlcnIgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HVigiZW5kIG9mIHN0cmVhbSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QpIHsKLSAgICAgICAgICAgICAgICB0YXJnZXRTYW1wbGVUaW1lVXMgPSAoc2FtcGxlVGltZSAqIDEwMDAwMDBsbCkgLyBtVGltZXNjYWxlOwotICAgICAgICAgICAgfQotCi0jaWYgMAotICAgICAgICAgICAgdWludDMyX3Qgc3luY1NhbXBsZVRpbWU7Ci0gICAgICAgICAgICBDSEVDS19FUShPSywgbVNhbXBsZVRhYmxlLT5nZXRNZXRhRGF0YUZvclNhbXBsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNTYW1wbGVJbmRleCwgTlVMTCwgTlVMTCwgJnN5bmNTYW1wbGVUaW1lKSk7Ci0KLSAgICAgICAgICAgIEFMT0dJKCJzZWVrIHRvIHRpbWUgJWxsZCB1cyA9PiBzYW1wbGUgYXQgdGltZSAlbGxkIHVzLCAiCi0gICAgICAgICAgICAgICAgICJzeW5jIHNhbXBsZSBhdCB0aW1lICVsbGQgdXMiLAotICAgICAgICAgICAgICAgICBzZWVrVGltZVVzLAotICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lICogMTAwMDAwMGxsIC8gbVRpbWVzY2FsZSwKLSAgICAgICAgICAgICAgICAgc3luY1NhbXBsZVRpbWUgKiAxMDAwMDAwbGwgLyBtVGltZXNjYWxlKTsKLSNlbmRpZgotCi0gICAgICAgICAgICBtQ3VycmVudFNhbXBsZUluZGV4ID0gc3luY1NhbXBsZUluZGV4OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1CdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmYWxsIHRocm91Z2gKLSAgICB9Ci0KLSAgICBvZmY2NF90IG9mZnNldCA9IDA7Ci0gICAgc2l6ZV90IHNpemUgPSAwOwotICAgIHVpbnQzMl90IGN0cywgc3R0czsKLSAgICBib29sIGlzU3luY1NhbXBsZTsKLSAgICBib29sIG5ld0J1ZmZlciA9IGZhbHNlOwotICAgIGlmIChtQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgbmV3QnVmZmVyID0gdHJ1ZTsKLQotICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgIGlmICghbUlzSEVJRikgewotICAgICAgICAgICAgZXJyID0gbVNhbXBsZVRhYmxlLT5nZXRNZXRhRGF0YUZvclNhbXBsZSgKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCwgJm9mZnNldCwgJnNpemUsICZjdHMsICZpc1N5bmNTYW1wbGUsICZzdHRzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVyciA9IG1JdGVtVGFibGUtPmdldEltYWdlT2Zmc2V0QW5kU2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1DdXJyZW50U2FtcGxlSW5kZXggOiBOVUxMLCAmb2Zmc2V0LCAmc2l6ZSk7Ci0KLSAgICAgICAgICAgIGN0cyA9IHN0dHMgPSAwOwotICAgICAgICAgICAgaXNTeW5jU2FtcGxlID0gMDsKLSAgICAgICAgICAgIEFMT0dWKCJpbWFnZSBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCAobG9uZyBsb25nKW9mZnNldCwgc2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmbUJ1ZmZlcik7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciA9PSBOVUxMKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNpemUgPiBtQnVmZmVyLT5zaXplKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJidWZmZXIgdG9vIHNtYWxsOiAlenUgPiAlenUiLCBzaXplLCBtQnVmZmVyLT5zaXplKCkpOwotICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfQlVGRkVSX1RPT19TTUFMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICgoIW1Jc0FWQyAmJiAhbUlzSEVWQykgfHwgbVdhbnRzTkFMRnJhZ21lbnRzKSB7Ci0gICAgICAgIGlmIChuZXdCdWZmZXIpIHsKLSAgICAgICAgICAgIHNzaXplX3QgbnVtX2J5dGVzX3JlYWQgPQotICAgICAgICAgICAgICAgIG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSwgc2l6ZSk7Ci0KLSAgICAgICAgICAgIGlmIChudW1fYnl0ZXNfcmVhZCA8IChzc2l6ZV90KXNpemUpIHsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgc2l6ZSk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+Y2xlYXIoKTsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAga0tleVRpbWUsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwotICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICgoaW50NjRfdClzdHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKLQotICAgICAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICAgICAga0tleVRhcmdldFRpbWUsIHRhcmdldFNhbXBsZVRpbWVVcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpc1N5bmNTYW1wbGUpIHsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgKyttQ3VycmVudFNhbXBsZUluZGV4OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFtSXNBVkMgJiYgIW1Jc0hFVkMpIHsKLSAgICAgICAgICAgICpvdXQgPSBtQnVmZmVyOwotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVhY2ggTkFMIHVuaXQgaXMgc3BsaXQgdXAgaW50byBpdHMgY29uc3RpdHVlbnQgZnJhZ21lbnRzIGFuZAotICAgICAgICAvLyBlYWNoIG9uZSBvZiB0aGVtIHJldHVybmVkIGluIGl0cyBvd24gYnVmZmVyLgotCi0gICAgICAgIENIRUNLKG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpID49IG1OQUxMZW5ndGhTaXplKTsKLQotICAgICAgICBjb25zdCB1aW50OF90ICpzcmMgPQotICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCkgKyBtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKLQotICAgICAgICBzaXplX3QgbmFsX3NpemUgPSBwYXJzZU5BTFNpemUoc3JjKTsKLSAgICAgICAgaWYgKG1OQUxMZW5ndGhTaXplID4gU0laRV9NQVggLSBuYWxfc2l6ZSkgewotICAgICAgICAgICAgQUxPR0UoImIvMjQ0NDE1NTMsIGIvMjQ0NDUxMjIiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSBtTkFMTGVuZ3RoU2l6ZSA8IG5hbF9zaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiaW5jb21wbGV0ZSBOQUwgdW5pdC4iKTsKLQotICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBNZWRpYUJ1ZmZlciAqY2xvbmUgPSBtQnVmZmVyLT5jbG9uZSgpOwotICAgICAgICBDSEVDSyhjbG9uZSAhPSBOVUxMKTsKLSAgICAgICAgY2xvbmUtPnNldF9yYW5nZShtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIG1OQUxMZW5ndGhTaXplLCBuYWxfc2l6ZSk7Ci0KLSAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKAotICAgICAgICAgICAgICAgIG1CdWZmZXItPnJhbmdlX29mZnNldCgpICsgbU5BTExlbmd0aFNpemUgKyBuYWxfc2l6ZSwKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIG1OQUxMZW5ndGhTaXplIC0gbmFsX3NpemUpOwotCi0gICAgICAgIGlmIChtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgICpvdXQgPSBjbG9uZTsKLQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gV2hvbGUgTkFMIHVuaXRzIGFyZSByZXR1cm5lZCBidXQgZWFjaCBmcmFnbWVudCBpcyBwcmVmaXhlZCBieQotICAgICAgICAvLyB0aGUgc3RhcnQgY29kZSAoMHgwMCAwMCAwMCAwMSkuCi0gICAgICAgIHNzaXplX3QgbnVtX2J5dGVzX3JlYWQgPSAwOwotICAgICAgICBpbnQzMl90IGRybSA9IDA7Ci0gICAgICAgIGJvb2wgdXNlc0RSTSA9IChtRm9ybWF0LT5maW5kSW50MzIoa0tleUlzRFJNLCAmZHJtKSAmJiBkcm0gIT0gMCk7Ci0gICAgICAgIGlmICh1c2VzRFJNKSB7Ci0gICAgICAgICAgICBudW1fYnl0ZXNfcmVhZCA9Ci0gICAgICAgICAgICAgICAgbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsICh1aW50OF90KiltQnVmZmVyLT5kYXRhKCksIHNpemUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbnVtX2J5dGVzX3JlYWQgPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgbVNyY0J1ZmZlciwgc2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobnVtX2J5dGVzX3JlYWQgPCAoc3NpemVfdClzaXplKSB7Ci0gICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLQotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHVzZXNEUk0pIHsKLSAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgc2l6ZSk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgKmRzdERhdGEgPSAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKTsKLSAgICAgICAgICAgIHNpemVfdCBzcmNPZmZzZXQgPSAwOwotICAgICAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7Ci0KLSAgICAgICAgICAgIHdoaWxlIChzcmNPZmZzZXQgPCBzaXplKSB7Ci0gICAgICAgICAgICAgICAgYm9vbCBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBtTkFMTGVuZ3RoU2l6ZSk7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IG5hbExlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc01hbEZvcm1lZCkgewotICAgICAgICAgICAgICAgICAgICBuYWxMZW5ndGggPSBwYXJzZU5BTFNpemUoJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSk7Ci0gICAgICAgICAgICAgICAgICAgIHNyY09mZnNldCArPSBtTkFMTGVuZ3RoU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbmFsTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNNYWxGb3JtZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlZpZGVvIGlzIG1hbGZvcm1lZCIpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYWxMZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZHN0T2Zmc2V0ID4gU0laRV9NQVggLSA0IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ID4gU0laRV9NQVggLSBuYWxMZW5ndGggfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCArIDQgKyBuYWxMZW5ndGggPiBtQnVmZmVyLT5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImIvMjcyMDg2MjEgOiAlenUgJXp1IiwgZHN0T2Zmc2V0LCBtQnVmZmVyLT5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3MjA4NjIxIik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOwotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7Ci0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAxOwotICAgICAgICAgICAgICAgIG1lbWNweSgmZHN0RGF0YVtkc3RPZmZzZXRdLCAmbVNyY0J1ZmZlcltzcmNPZmZzZXRdLCBuYWxMZW5ndGgpOwotICAgICAgICAgICAgICAgIHNyY09mZnNldCArPSBuYWxMZW5ndGg7Ci0gICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICs9IG5hbExlbmd0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENIRUNLX0VRKHNyY09mZnNldCwgc2l6ZSk7Ci0gICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwotICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIGRzdE9mZnNldCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+Y2xlYXIoKTsKLSAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KAotICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKLSAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KAotICAgICAgICAgICAgICAgIGtLZXlEdXJhdGlvbiwgKChpbnQ2NF90KXN0dHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwotCi0gICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgewotICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICBrS2V5VGFyZ2V0VGltZSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSXNBVkMpIHsKLSAgICAgICAgICAgIHVpbnQzMl90IGxheWVySWQgPSBGaW5kQVZDTGF5ZXJJZCgKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5VGVtcG9yYWxMYXllcklkLCBsYXllcklkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc1N5bmNTYW1wbGUpIHsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgKyttQ3VycmVudFNhbXBsZUluZGV4OwotCi0gICAgICAgICpvdXQgPSBtQnVmZmVyOwotICAgICAgICBtQnVmZmVyID0gTlVMTDsKLQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBNUEVHNFNvdXJjZTo6ZnJhZ21lbnRlZFJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotCi0gICAgQUxPR1YoIk1QRUc0U291cmNlOjpmcmFnbWVudGVkUmVhZCIpOwotCi0gICAgQ0hFQ0sobVN0YXJ0ZWQpOwotCi0gICAgKm91dCA9IE5VTEw7Ci0KLSAgICBpbnQ2NF90IHRhcmdldFNhbXBsZVRpbWVVcyA9IC0xOwotCi0gICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwotICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7Ci0KLSAgICAgICAgaW50IG51bVNpZHhFbnRyaWVzID0gbVNlZ21lbnRzLnNpemUoKTsKLSAgICAgICAgaWYgKG51bVNpZHhFbnRyaWVzICE9IDApIHsKLSAgICAgICAgICAgIGludDY0X3QgdG90YWxUaW1lID0gMDsKLSAgICAgICAgICAgIG9mZjY0X3QgdG90YWxPZmZzZXQgPSBtRmlyc3RNb29mT2Zmc2V0OwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TaWR4RW50cmllczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgU2lkeEVudHJ5ICpzZSA9ICZtU2VnbWVudHNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKHRvdGFsVGltZSArIHNlLT5tRHVyYXRpb25VcyA+IHNlZWtUaW1lVXMpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlcXVlc3RlZCB0aW1lIGlzIHNvbWV3aGVyZSBpbiB0aGlzIHNlZ21lbnQKLSAgICAgICAgICAgICAgICAgICAgaWYgKChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQyAmJiBzZWVrVGltZVVzID4gdG90YWxUaW1lKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKG1vZGUgPT0gUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoc2Vla1RpbWVVcyAtIHRvdGFsVGltZSkgPiAodG90YWxUaW1lICsgc2UtPm1EdXJhdGlvblVzIC0gc2Vla1RpbWVVcykpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0ZWQgbmV4dCBzeW5jLCBvciBjbG9zZXN0IHN5bmMgYW5kIGl0IHdhcyBjbG9zZXIgdG8gdGhlIGVuZCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBzZWdtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFRpbWUgKz0gc2UtPm1EdXJhdGlvblVzOwotICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxPZmZzZXQgKz0gc2UtPm1TaXplOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0b3RhbFRpbWUgKz0gc2UtPm1EdXJhdGlvblVzOwotICAgICAgICAgICAgICAgIHRvdGFsT2Zmc2V0ICs9IHNlLT5tU2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DdXJyZW50TW9vZk9mZnNldCA9IHRvdGFsT2Zmc2V0OwotICAgICAgICAgICAgbU5leHRNb29mT2Zmc2V0ID0gLTE7Ci0gICAgICAgICAgICBtQ3VycmVudFNhbXBsZXMuY2xlYXIoKTsKLSAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSAwOwotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuaygmdG90YWxPZmZzZXQpOwotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ3VycmVudFRpbWUgPSB0b3RhbFRpbWUgKiBtVGltZXNjYWxlIC8gMTAwMDAwMGxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gd2l0aG91dCBzaWR4IGJveGVzLCB3ZSBjYW4gb25seSBzZWVrIHRvIDAKLSAgICAgICAgICAgIG1DdXJyZW50TW9vZk9mZnNldCA9IG1GaXJzdE1vb2ZPZmZzZXQ7Ci0gICAgICAgICAgICBtTmV4dE1vb2ZPZmZzZXQgPSAtMTsKLSAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlcy5jbGVhcigpOwotICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IDA7Ci0gICAgICAgICAgICBvZmY2NF90IHRtcCA9IG1DdXJyZW50TW9vZk9mZnNldDsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsoJnRtcCk7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DdXJyZW50VGltZSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGZhbGwgdGhyb3VnaAotICAgIH0KLQotICAgIG9mZjY0X3Qgb2Zmc2V0ID0gMDsKLSAgICBzaXplX3Qgc2l6ZSA9IDA7Ci0gICAgdWludDMyX3QgY3RzID0gMDsKLSAgICBib29sIGlzU3luY1NhbXBsZSA9IGZhbHNlOwotICAgIGJvb2wgbmV3QnVmZmVyID0gZmFsc2U7Ci0gICAgaWYgKG1CdWZmZXIgPT0gTlVMTCkgewotICAgICAgICBuZXdCdWZmZXIgPSB0cnVlOwotCi0gICAgICAgIGlmIChtQ3VycmVudFNhbXBsZUluZGV4ID49IG1DdXJyZW50U2FtcGxlcy5zaXplKCkpIHsKLSAgICAgICAgICAgIC8vIG1vdmUgdG8gbmV4dCBmcmFnbWVudCBpZiB0aGVyZSBpcyBvbmUKLSAgICAgICAgICAgIGlmIChtTmV4dE1vb2ZPZmZzZXQgPD0gbUN1cnJlbnRNb29mT2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvZmY2NF90IG5leHRNb29mID0gbU5leHRNb29mT2Zmc2V0OwotICAgICAgICAgICAgbUN1cnJlbnRNb29mT2Zmc2V0ID0gbmV4dE1vb2Y7Ci0gICAgICAgICAgICBtQ3VycmVudFNhbXBsZXMuY2xlYXIoKTsKLSAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSAwOwotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuaygmbmV4dE1vb2YpOwotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUN1cnJlbnRTYW1wbGVJbmRleCA+PSBtQ3VycmVudFNhbXBsZXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBTYW1wbGUgKnNtcGwgPSAmbUN1cnJlbnRTYW1wbGVzW21DdXJyZW50U2FtcGxlSW5kZXhdOwotICAgICAgICBvZmZzZXQgPSBzbXBsLT5vZmZzZXQ7Ci0gICAgICAgIHNpemUgPSBzbXBsLT5zaXplOwotICAgICAgICBjdHMgPSBtQ3VycmVudFRpbWUgKyBzbXBsLT5jb21wb3NpdGlvbk9mZnNldDsKLSAgICAgICAgbUN1cnJlbnRUaW1lICs9IHNtcGwtPmR1cmF0aW9uOwotICAgICAgICBpc1N5bmNTYW1wbGUgPSAobUN1cnJlbnRTYW1wbGVJbmRleCA9PSAwKTsgLy8gWFhYCi0KLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmbUJ1ZmZlcik7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciA9PSBOVUxMKTsKLSAgICAgICAgICAgIEFMT0dWKCJhY3F1aXJlX2J1ZmZlciByZXR1cm5lZCAlZCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzaXplID4gbUJ1ZmZlci0+c2l6ZSgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiYnVmZmVyIHRvbyBzbWFsbDogJXp1ID4gJXp1Iiwgc2l6ZSwgbUJ1ZmZlci0+c2l6ZSgpKTsKLSAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0JVRkZFUl9UT09fU01BTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjb25zdCBTYW1wbGUgKnNtcGwgPSAmbUN1cnJlbnRTYW1wbGVzW21DdXJyZW50U2FtcGxlSW5kZXhdOwotICAgIGNvbnN0IHNwPE1ldGFEYXRhPiBidWZtZXRhID0gbUJ1ZmZlci0+bWV0YV9kYXRhKCk7Ci0gICAgYnVmbWV0YS0+Y2xlYXIoKTsKLSAgICBpZiAoc21wbC0+ZW5jcnlwdGVkc2l6ZXMuc2l6ZSgpKSB7Ci0gICAgICAgIC8vIHN0b3JlIGNsZWFyL2VuY3J5cHRlZCBsZW5ndGhzIGluIG1ldGFkYXRhCi0gICAgICAgIGJ1Zm1ldGEtPnNldERhdGEoa0tleVBsYWluU2l6ZXMsIDAsCi0gICAgICAgICAgICAgICAgc21wbC0+Y2xlYXJzaXplcy5hcnJheSgpLCBzbXBsLT5jbGVhcnNpemVzLnNpemUoKSAqIDQpOwotICAgICAgICBidWZtZXRhLT5zZXREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgMCwKLSAgICAgICAgICAgICAgICBzbXBsLT5lbmNyeXB0ZWRzaXplcy5hcnJheSgpLCBzbXBsLT5lbmNyeXB0ZWRzaXplcy5zaXplKCkgKiA0KTsKLSAgICAgICAgYnVmbWV0YS0+c2V0RGF0YShrS2V5Q3J5cHRvSVYsIDAsIHNtcGwtPml2LCAxNik7IC8vIHVzZSAxNiBvciB0aGUgYWN0dWFsIHNpemU/Ci0gICAgICAgIGJ1Zm1ldGEtPnNldEludDMyKGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplLCBtRGVmYXVsdElWU2l6ZSk7Ci0gICAgICAgIGJ1Zm1ldGEtPnNldEludDMyKGtLZXlDcnlwdG9Nb2RlLCBtQ3J5cHRvTW9kZSk7Ci0gICAgICAgIGJ1Zm1ldGEtPnNldERhdGEoa0tleUNyeXB0b0tleSwgMCwgbUNyeXB0b0tleSwgMTYpOwotICAgIH0KLQotICAgIGlmICgoIW1Jc0FWQyAmJiAhbUlzSEVWQyl8fCBtV2FudHNOQUxGcmFnbWVudHMpIHsKLSAgICAgICAgaWYgKG5ld0J1ZmZlcikgewotICAgICAgICAgICAgaWYgKCFpc0luUmFuZ2UoKHNpemVfdCkwdSwgbUJ1ZmZlci0+c2l6ZSgpLCBzaXplKSkgewotICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLQotICAgICAgICAgICAgICAgIEFMT0dFKCJmcmFnbWVudGVkUmVhZCBFUlJPUl9NQUxGT1JNRUQgc2l6ZSAlenUiLCBzaXplKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzc2l6ZV90IG51bV9ieXRlc19yZWFkID0KLSAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgKHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCksIHNpemUpOwotCi0gICAgICAgICAgICBpZiAobnVtX2J5dGVzX3JlYWQgPCAoc3NpemVfdClzaXplKSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotCi0gICAgICAgICAgICAgICAgQUxPR0UoImkvbyBlcnJvciIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBzaXplKTsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAga0tleVRpbWUsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwotICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICgoaW50NjRfdClzbXBsLT5kdXJhdGlvbiAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7Ci0KLSAgICAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgewotICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCB0YXJnZXRTYW1wbGVUaW1lVXMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUlzQVZDKSB7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgbGF5ZXJJZCA9IEZpbmRBVkNMYXllcklkKAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleVRlbXBvcmFsTGF5ZXJJZCwgbGF5ZXJJZCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpc1N5bmNTYW1wbGUpIHsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgKyttQ3VycmVudFNhbXBsZUluZGV4OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFtSXNBVkMgJiYgIW1Jc0hFVkMpIHsKLSAgICAgICAgICAgICpvdXQgPSBtQnVmZmVyOwotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVhY2ggTkFMIHVuaXQgaXMgc3BsaXQgdXAgaW50byBpdHMgY29uc3RpdHVlbnQgZnJhZ21lbnRzIGFuZAotICAgICAgICAvLyBlYWNoIG9uZSBvZiB0aGVtIHJldHVybmVkIGluIGl0cyBvd24gYnVmZmVyLgotCi0gICAgICAgIENIRUNLKG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpID49IG1OQUxMZW5ndGhTaXplKTsKLQotICAgICAgICBjb25zdCB1aW50OF90ICpzcmMgPQotICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCkgKyBtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKLQotICAgICAgICBzaXplX3QgbmFsX3NpemUgPSBwYXJzZU5BTFNpemUoc3JjKTsKLSAgICAgICAgaWYgKG1OQUxMZW5ndGhTaXplID4gU0laRV9NQVggLSBuYWxfc2l6ZSkgewotICAgICAgICAgICAgQUxPR0UoImIvMjQ0NDE1NTMsIGIvMjQ0NDUxMjIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIG1OQUxMZW5ndGhTaXplIDwgbmFsX3NpemUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJpbmNvbXBsZXRlIE5BTCB1bml0LiIpOwotCi0gICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLQotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIE1lZGlhQnVmZmVyICpjbG9uZSA9IG1CdWZmZXItPmNsb25lKCk7Ci0gICAgICAgIENIRUNLKGNsb25lICE9IE5VTEwpOwotICAgICAgICBjbG9uZS0+c2V0X3JhbmdlKG1CdWZmZXItPnJhbmdlX29mZnNldCgpICsgbU5BTExlbmd0aFNpemUsIG5hbF9zaXplKTsKLQotICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwotICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoCi0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkgKyBtTkFMTGVuZ3RoU2l6ZSArIG5hbF9zaXplLAotICAgICAgICAgICAgICAgIG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gbU5BTExlbmd0aFNpemUgLSBuYWxfc2l6ZSk7Ci0KLSAgICAgICAgaWYgKG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgKm91dCA9IGNsb25lOwotCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigid2hvbGUgTkFMIik7Ci0gICAgICAgIC8vIFdob2xlIE5BTCB1bml0cyBhcmUgcmV0dXJuZWQgYnV0IGVhY2ggZnJhZ21lbnQgaXMgcHJlZml4ZWQgYnkKLSAgICAgICAgLy8gdGhlIHN0YXJ0IGNvZGUgKDB4MDAgMDAgMDAgMDEpLgotICAgICAgICBzc2l6ZV90IG51bV9ieXRlc19yZWFkID0gMDsKLSAgICAgICAgaW50MzJfdCBkcm0gPSAwOwotICAgICAgICBib29sIHVzZXNEUk0gPSAobUZvcm1hdC0+ZmluZEludDMyKGtLZXlJc0RSTSwgJmRybSkgJiYgZHJtICE9IDApOwotICAgICAgICB2b2lkICpkYXRhID0gTlVMTDsKLSAgICAgICAgYm9vbCBpc01hbEZvcm1lZCA9IGZhbHNlOwotICAgICAgICBpZiAodXNlc0RSTSkgewotICAgICAgICAgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCB8fCAhaXNJblJhbmdlKChzaXplX3QpMHUsIG1CdWZmZXItPnNpemUoKSwgc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRhdGEgPSBtQnVmZmVyLT5kYXRhKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQzMl90IG1heF9zaXplOwotICAgICAgICAgICAgaWYgKG1Gb3JtYXQgPT0gTlVMTAotICAgICAgICAgICAgICAgICAgICB8fCAhbUZvcm1hdC0+ZmluZEludDMyKGtLZXlNYXhJbnB1dFNpemUsICZtYXhfc2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCAoc2l6ZV90KW1heF9zaXplLCBzaXplKSkgewotICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGF0YSA9IG1TcmNCdWZmZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNNYWxGb3JtZWQgfHwgZGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiaXNNYWxGb3JtZWQgc2l6ZSAlenUiLCBzaXplKTsKLSAgICAgICAgICAgIGlmIChtQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgICAgIG51bV9ieXRlc19yZWFkID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGRhdGEsIHNpemUpOwotCi0gICAgICAgIGlmIChudW1fYnl0ZXNfcmVhZCA8IChzc2l6ZV90KXNpemUpIHsKLSAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotCi0gICAgICAgICAgICBBTE9HRSgiaS9vIGVycm9yIik7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodXNlc0RSTSkgewotICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBzaXplKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdWludDhfdCAqZHN0RGF0YSA9ICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpOwotICAgICAgICAgICAgc2l6ZV90IHNyY09mZnNldCA9IDA7Ci0gICAgICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKLQotICAgICAgICAgICAgd2hpbGUgKHNyY09mZnNldCA8IHNpemUpIHsKLSAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBtTkFMTGVuZ3RoU2l6ZSk7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IG5hbExlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc01hbEZvcm1lZCkgewotICAgICAgICAgICAgICAgICAgICBuYWxMZW5ndGggPSBwYXJzZU5BTFNpemUoJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSk7Ci0gICAgICAgICAgICAgICAgICAgIHNyY09mZnNldCArPSBtTkFMTGVuZ3RoU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbmFsTGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgbUJ1ZmZlci0+c2l6ZSgpLCBkc3RPZmZzZXQsIChzaXplX3QpNHUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBtQnVmZmVyLT5zaXplKCksIGRzdE9mZnNldCArIDQsIG5hbExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzTWFsRm9ybWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJWaWRlbyBpcyBtYWxmb3JtZWQ7IG5hbExlbmd0aCAlenUiLCBuYWxMZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYWxMZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZHN0T2Zmc2V0ID4gU0laRV9NQVggLSA0IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ID4gU0laRV9NQVggLSBuYWxMZW5ndGggfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCArIDQgKyBuYWxMZW5ndGggPiBtQnVmZmVyLT5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImIvMjYzNjUzNDkgOiAlenUgJXp1IiwgZHN0T2Zmc2V0LCBtQnVmZmVyLT5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI2MzY1MzQ5Iik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOwotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7Ci0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAxOwotICAgICAgICAgICAgICAgIG1lbWNweSgmZHN0RGF0YVtkc3RPZmZzZXRdLCAmbVNyY0J1ZmZlcltzcmNPZmZzZXRdLCBuYWxMZW5ndGgpOwotICAgICAgICAgICAgICAgIHNyY09mZnNldCArPSBuYWxMZW5ndGg7Ci0gICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICs9IG5hbExlbmd0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENIRUNLX0VRKHNyY09mZnNldCwgc2l6ZSk7Ci0gICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwotICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIGRzdE9mZnNldCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCi0gICAgICAgICAgICAgICAga0tleVRpbWUsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwotICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCi0gICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoKGludDY0X3Qpc21wbC0+ZHVyYXRpb24gKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwotCi0gICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgewotICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICBrS2V5VGFyZ2V0VGltZSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc1N5bmNTYW1wbGUpIHsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgKyttQ3VycmVudFNhbXBsZUluZGV4OwotCi0gICAgICAgICpvdXQgPSBtQnVmZmVyOwotICAgICAgICBtQnVmZmVyID0gTlVMTDsKLQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotfQotCi1NUEVHNEV4dHJhY3Rvcjo6VHJhY2sgKk1QRUc0RXh0cmFjdG9yOjpmaW5kVHJhY2tCeU1pbWVQcmVmaXgoCi0gICAgICAgIGNvbnN0IGNoYXIgKm1pbWVQcmVmaXgpIHsKLSAgICBmb3IgKFRyYWNrICp0cmFjayA9IG1GaXJzdFRyYWNrOyB0cmFjayAhPSBOVUxMOyB0cmFjayA9IHRyYWNrLT5uZXh0KSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgICAgIGlmICh0cmFjay0+bWV0YSAhPSBOVUxMCi0gICAgICAgICAgICAgICAgJiYgdHJhY2stPm1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpCi0gICAgICAgICAgICAgICAgJiYgIXN0cm5jYXNlY21wKG1pbWUsIG1pbWVQcmVmaXgsIHN0cmxlbihtaW1lUHJlZml4KSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cmFjazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIE1QRUc0RXh0cmFjdG9yOjpwb3B1bGF0ZU1ldHJpY3MoKSB7Ci0gICAgQUxPR1YoIk1QRUc0RXh0cmFjdG9yOjpwb3B1bGF0ZU1ldHJpY3MiKTsKLSAgICAvLyB3cml0ZSBpbnRvIG1BbmFseXRpY3NJdGVtCi19Ci0KLXN0YXRpYyBib29sIExlZ2FjeVNuaWZmTVBFRzQoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSkgewotICAgIHVpbnQ4X3QgaGVhZGVyWzhdOwotCi0gICAgc3NpemVfdCBuID0gc291cmNlLT5yZWFkQXQoNCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSk7Ci0gICAgaWYgKG4gPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCFtZW1jbXAoaGVhZGVyLCAiZnR5cDNncCIsIDcpIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cG1wNDIiLCA4KQotICAgICAgICB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXAzZ3I2IiwgOCkgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwM2dzNiIsIDgpCi0gICAgICAgIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cDNnZTYiLCA4KSB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXAzZ2c2IiwgOCkKLSAgICAgICAgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwaXNvbSIsIDgpIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cE00ViAiLCA4KQotICAgICAgICB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBNNEEgIiwgOCkgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwZjR2ICIsIDgpCi0gICAgICAgIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cGtkZGkiLCA4KSB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBNNFZQIiwgOCkKLSAgICAgICAgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwbWlmMSIsIDgpIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cGhlaWMiLCA4KSkgewotICAgICAgICAqbWltZVR5cGUgPSBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzQ7Ci0gICAgICAgICpjb25maWRlbmNlID0gMC40OwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgaXNDb21wYXRpYmxlQnJhbmQodWludDMyX3QgZm91cmNjKSB7Ci0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtDb21wYXRpYmxlQnJhbmRzW10gPSB7Ci0gICAgICAgIEZPVVJDQygnaScsICdzJywgJ28nLCAnbScpLAotICAgICAgICBGT1VSQ0MoJ2knLCAncycsICdvJywgJzInKSwKLSAgICAgICAgRk9VUkNDKCdhJywgJ3YnLCAnYycsICcxJyksCi0gICAgICAgIEZPVVJDQygnaCcsICd2JywgJ2MnLCAnMScpLAotICAgICAgICBGT1VSQ0MoJ2gnLCAnZScsICd2JywgJzEnKSwKLSAgICAgICAgRk9VUkNDKCczJywgJ2cnLCAncCcsICc0JyksCi0gICAgICAgIEZPVVJDQygnbScsICdwJywgJzQnLCAnMScpLAotICAgICAgICBGT1VSQ0MoJ20nLCAncCcsICc0JywgJzInKSwKLSAgICAgICAgRk9VUkNDKCdkJywgJ2EnLCAncycsICdoJyksCi0KLSAgICAgICAgLy8gV29uJ3QgcHJvbWlzZSB0aGF0IHRoZSBmb2xsb3dpbmcgZmlsZSB0eXBlcyBjYW4gYmUgcGxheWVkLgotICAgICAgICAvLyBKdXN0IGdpdmUgdGhlc2UgZmlsZSB0eXBlcyBhIGNoYW5jZS4KLSAgICAgICAgRk9VUkNDKCdxJywgJ3QnLCAnICcsICcgJyksICAvLyBBcHBsZSdzIFF1aWNrVGltZQotICAgICAgICBGT1VSQ0MoJ00nLCAnUycsICdOJywgJ1YnKSwgIC8vIFNvbnkncyBQU1AKLQotICAgICAgICBGT1VSQ0MoJzMnLCAnZycsICcyJywgJ2EnKSwgIC8vIDNHUFAyCi0gICAgICAgIEZPVVJDQygnMycsICdnJywgJzInLCAnYicpLAotICAgICAgICBGT1VSQ0MoJ20nLCAnaScsICdmJywgJzEnKSwgIC8vIEhFSUYgaW1hZ2UKLSAgICAgICAgRk9VUkNDKCdoJywgJ2UnLCAnaScsICdjJyksICAvLyBIRUlGIGltYWdlCi0gICAgfTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOwotICAgICAgICAgaSA8IHNpemVvZihrQ29tcGF0aWJsZUJyYW5kcykgLyBzaXplb2Yoa0NvbXBhdGlibGVCcmFuZHNbMF0pOwotICAgICAgICAgKytpKSB7Ci0gICAgICAgIGlmIChrQ29tcGF0aWJsZUJyYW5kc1tpXSA9PSBmb3VyY2MpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyBBdHRlbXB0IHRvIGFjdHVhbGx5IHBhcnNlIHRoZSAnZnR5cCcgYXRvbSBhbmQgZGV0ZXJtaW5lIGlmIGEgc3VpdGFibGUKLS8vIGNvbXBhdGlibGUgYnJhbmQgaXMgcHJlc2VudC4KLS8vIEFsc28gdHJ5IHRvIGlkZW50aWZ5IHdoZXJlIHRoaXMgZmlsZSdzIG1ldGFkYXRhIGVuZHMKLS8vIChlbmQgb2YgdGhlICdtb292JyBhdG9tKSBhbmQgcmVwb3J0IGl0IHRvIHRoZSBjYWxsZXIgYXMgcGFydCBvZgotLy8gdGhlIG1ldGFkYXRhLgotc3RhdGljIGJvb2wgQmV0dGVyU25pZmZNUEVHNCgKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICBzcDxBTWVzc2FnZT4gKm1ldGEpIHsKLSAgICAvLyBXZSBzY2FuIHVwIHRvIDEyOCBieXRlcyB0byBpZGVudGlmeSB0aGlzIGZpbGUgYXMgYW4gTVA0LgotICAgIHN0YXRpYyBjb25zdCBvZmY2NF90IGtNYXhTY2FuT2Zmc2V0ID0gMTI4bGw7Ci0KLSAgICBvZmY2NF90IG9mZnNldCA9IDBsbDsKLSAgICBib29sIGZvdW5kR29vZEZpbGVUeXBlID0gZmFsc2U7Ci0gICAgb2ZmNjRfdCBtb292QXRvbUVuZE9mZnNldCA9IC0xbGw7Ci0gICAgYm9vbCBkb25lID0gZmFsc2U7Ci0KLSAgICB3aGlsZSAoIWRvbmUgJiYgb2Zmc2V0IDwga01heFNjYW5PZmZzZXQpIHsKLSAgICAgICAgdWludDMyX3QgaGRyWzJdOwotICAgICAgICBpZiAoc291cmNlLT5yZWFkQXQob2Zmc2V0LCBoZHIsIDgpIDwgOCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgdWludDY0X3QgY2h1bmtTaXplID0gbnRvaGwoaGRyWzBdKTsKLSAgICAgICAgdWludDMyX3QgY2h1bmtUeXBlID0gbnRvaGwoaGRyWzFdKTsKLSAgICAgICAgb2ZmNjRfdCBjaHVua0RhdGFPZmZzZXQgPSBvZmZzZXQgKyA4OwotCi0gICAgICAgIGlmIChjaHVua1NpemUgPT0gMSkgewotICAgICAgICAgICAgaWYgKHNvdXJjZS0+cmVhZEF0KG9mZnNldCArIDgsICZjaHVua1NpemUsIDgpIDwgOCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2h1bmtTaXplID0gbnRvaDY0KGNodW5rU2l6ZSk7Ci0gICAgICAgICAgICBjaHVua0RhdGFPZmZzZXQgKz0gODsKLQotICAgICAgICAgICAgaWYgKGNodW5rU2l6ZSA8IDE2KSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIHNtYWxsZXN0IHZhbGlkIGNodW5rIGlzIDE2IGJ5dGVzIGxvbmcgaW4gdGhpcyBjYXNlLgotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgaWYgKGNodW5rU2l6ZSA8IDgpIHsKLSAgICAgICAgICAgIC8vIFRoZSBzbWFsbGVzdCB2YWxpZCBjaHVuayBpcyA4IGJ5dGVzIGxvbmcuCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAoZGF0YV9vZmZzZXQgLSBvZmZzZXQpIGlzIGVpdGhlciA4IG9yIDE2Ci0gICAgICAgIG9mZjY0X3QgY2h1bmtEYXRhU2l6ZSA9IGNodW5rU2l6ZSAtIChjaHVua0RhdGFPZmZzZXQgLSBvZmZzZXQpOwotICAgICAgICBpZiAoY2h1bmtEYXRhU2l6ZSA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJiLzIzNTQwOTE0Iik7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgY2hhciBjaHVua3N0cmluZ1s1XTsKLSAgICAgICAgTWFrZUZvdXJDQ1N0cmluZyhjaHVua1R5cGUsIGNodW5rc3RyaW5nKTsKLSAgICAgICAgQUxPR1YoInNhdyBjaHVuayB0eXBlICVzLCBzaXplICUiIFBSSXU2NCAiIEAgJWxsZCIsIGNodW5rc3RyaW5nLCBjaHVua1NpemUsIChsb25nIGxvbmcpb2Zmc2V0KTsKLSAgICAgICAgc3dpdGNoIChjaHVua1R5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdmJywgJ3QnLCAneScsICdwJyk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGNodW5rRGF0YVNpemUgPCA4KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB1aW50MzJfdCBudW1Db21wYXRpYmxlQnJhbmRzID0gKGNodW5rRGF0YVNpemUgLSA4KSAvIDQ7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1Db21wYXRpYmxlQnJhbmRzICsgMjsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhpcyBpbmRleCwgaXQgcmVmZXJzIHRvIHRoZSBtaW5vclZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgYSBicmFuZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYnJhbmQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtEYXRhT2Zmc2V0ICsgNCAqIGksICZicmFuZCwgNCkgPCA0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBicmFuZCA9IG50b2hsKGJyYW5kKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoaXNDb21wYXRpYmxlQnJhbmQoYnJhbmQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEdvb2RGaWxlVHlwZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghZm91bmRHb29kRmlsZVR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIEZPVVJDQygnbScsICdvJywgJ28nLCAndicpOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1vb3ZBdG9tRW5kT2Zmc2V0ID0gb2Zmc2V0ICsgY2h1bmtTaXplOwotCi0gICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBvZmZzZXQgKz0gY2h1bmtTaXplOwotICAgIH0KLQotICAgIGlmICghZm91bmRHb29kRmlsZVR5cGUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgICptaW1lVHlwZSA9IE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNDsKLSAgICAqY29uZmlkZW5jZSA9IDAuNGY7Ci0KLSAgICBpZiAobW9vdkF0b21FbmRPZmZzZXQgPj0gMCkgewotICAgICAgICAqbWV0YSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgKCptZXRhKS0+c2V0SW50NjQoIm1ldGEtZGF0YS1zaXplIiwgbW9vdkF0b21FbmRPZmZzZXQpOwotCi0gICAgICAgIEFMT0dWKCJmb3VuZCBtZXRhZGF0YSBzaXplOiAlbGxkIiwgKGxvbmcgbG9uZyltb292QXRvbUVuZE9mZnNldCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU25pZmZNUEVHNCgKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICBzcDxBTWVzc2FnZT4gKm1ldGEpIHsKLSAgICBpZiAoQmV0dGVyU25pZmZNUEVHNChzb3VyY2UsIG1pbWVUeXBlLCBjb25maWRlbmNlLCBtZXRhKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoTGVnYWN5U25pZmZNUEVHNChzb3VyY2UsIG1pbWVUeXBlLCBjb25maWRlbmNlKSkgewotICAgICAgICBBTE9HVygiSWRlbnRpZmllZCBzdXBwb3J0ZWQgbXBlZzQgdGhyb3VnaCBMZWdhY3lTbmlmZk1QRUc0LiIpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKaW5kZXggNzc4NmM0ZC4uNTUwYTk5YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcApAQCAtMzIsMjMgKzMyLDI0IEBACiAKICNpbmNsdWRlIDxmdW5jdGlvbmFsPgogCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIAogI2luY2x1ZGUgImluY2x1ZGUvRVNEUy5oIgogI2luY2x1ZGUgImluY2x1ZGUvSGV2Y1V0aWxzLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKIAogI2lmbmRlZiBfX3ByZWRpY3RfZmFsc2UKICNkZWZpbmUgX19wcmVkaWN0X2ZhbHNlKGV4cCkgX19idWlsdGluX2V4cGVjdCgoZXhwKSAhPSAwLCAwKQpAQCAtMTAwLDcgKzEwMSw3IEBACiAKIGNsYXNzIE1QRUc0V3JpdGVyOjpUcmFjayB7CiBwdWJsaWM6Ci0gICAgVHJhY2soTVBFRzRXcml0ZXIgKm93bmVyLCBjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UsIHNpemVfdCB0cmFja0lkKTsKKyAgICBUcmFjayhNUEVHNFdyaXRlciAqb3duZXIsIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLCBzaXplX3QgdHJhY2tJZCk7CiAKICAgICB+VHJhY2soKTsKIApAQCAtMTExLDE0ICsxMTIsMTggQEAKIAogICAgIGludDY0X3QgZ2V0RHVyYXRpb25VcygpIGNvbnN0OwogICAgIGludDY0X3QgZ2V0RXN0aW1hdGVkVHJhY2tTaXplQnl0ZXMoKSBjb25zdDsKKyAgICBpbnQzMl90IGdldE1ldGFTaXplSW5jcmVhc2UoKSBjb25zdDsKICAgICB2b2lkIHdyaXRlVHJhY2tIZWFkZXIoYm9vbCB1c2UzMkJpdE9mZnNldCA9IHRydWUpOwogICAgIGludDY0X3QgZ2V0TWluQ3R0c09mZnNldFRpbWVVcygpOwogICAgIHZvaWQgYnVmZmVyQ2h1bmsoaW50NjRfdCB0aW1lc3RhbXBVcyk7CiAgICAgYm9vbCBpc0F2YygpIGNvbnN0IHsgcmV0dXJuIG1Jc0F2YzsgfQogICAgIGJvb2wgaXNIZXZjKCkgY29uc3QgeyByZXR1cm4gbUlzSGV2YzsgfQorICAgIGJvb2wgaXNIZWljKCkgY29uc3QgeyByZXR1cm4gbUlzSGVpYzsgfQogICAgIGJvb2wgaXNBdWRpbygpIGNvbnN0IHsgcmV0dXJuIG1Jc0F1ZGlvOyB9CiAgICAgYm9vbCBpc01QRUc0KCkgY29uc3QgeyByZXR1cm4gbUlzTVBFRzQ7IH0KKyAgICBib29sIHVzZVByZWZpeCgpIGNvbnN0IHsgcmV0dXJuIG1Jc0F2YyB8fCBtSXNIZXZjIHx8IG1Jc0hlaWM7IH0KICAgICB2b2lkIGFkZENodW5rT2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KTsKKyAgICB2b2lkIGFkZEl0ZW1PZmZzZXRBbmRTaXplKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CiAgICAgaW50MzJfdCBnZXRUcmFja0lkKCkgY29uc3QgeyByZXR1cm4gbVRyYWNrSWQ7IH0KICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldEZvdXJDQ0Zvck1pbWUoY29uc3QgY2hhciAqbWltZSk7CkBAIC0yNzEsNyArMjc2LDcgQEAKIAogICAgIE1QRUc0V3JpdGVyICptT3duZXI7CiAgICAgc3A8TWV0YURhdGE+IG1NZXRhOwotICAgIHNwPElNZWRpYVNvdXJjZT4gbVNvdXJjZTsKKyAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKICAgICB2b2xhdGlsZSBib29sIG1Eb25lOwogICAgIHZvbGF0aWxlIGJvb2wgbVBhdXNlZDsKICAgICB2b2xhdGlsZSBib29sIG1SZXN1bWVkOwpAQCAtMjgwLDYgKzI4NSw3IEBACiAgICAgYm9vbCBtSXNIZXZjOwogICAgIGJvb2wgbUlzQXVkaW87CiAgICAgYm9vbCBtSXNWaWRlbzsKKyAgICBib29sIG1Jc0hlaWM7CiAgICAgYm9vbCBtSXNNUEVHNDsKICAgICBib29sIG1Hb3RTdGFydEtleUZyYW1lOwogICAgIGJvb2wgbUlzTWFsZm9ybWVkOwpAQCAtMzQ2LDYgKzM1MiwxNiBAQAogICAgIGludDY0X3QgbVByZXZpb3VzVHJhY2tUaW1lVXM7CiAgICAgaW50NjRfdCBtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzOwogCisgICAgaW50MzJfdCBtUm90YXRpb247CisKKyAgICBWZWN0b3I8dWludDE2X3Q+IG1Qcm9wZXJ0aWVzOworICAgIFZlY3Rvcjx1aW50MTZfdD4gbURpbWdSZWZzOworICAgIGludDMyX3QgbUlzUHJpbWFyeTsKKyAgICBpbnQzMl90IG1XaWR0aCwgbUhlaWdodDsKKyAgICBpbnQzMl90IG1UaWxlV2lkdGgsIG1UaWxlSGVpZ2h0OworICAgIGludDMyX3QgbUdyaWRSb3dzLCBtR3JpZENvbHM7CisgICAgc2l6ZV90IG1OdW1UaWxlcywgbVRpbGVJbmRleDsKKwogICAgIC8vIFVwZGF0ZSB0aGUgYXVkaW8gdHJhY2sncyBkcmlmdCBpbmZvcm1hdGlvbi4KICAgICB2b2lkIHVwZGF0ZURyaWZ0VGltZShjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEpOwogCkBAIC0zODUsNyArNDAxLDYgQEAKIAogICAgIC8vIFNpbXBsZSB2YWxpZGF0aW9uIG9uIHRoZSBjb2RlYyBzcGVjaWZpYyBkYXRhCiAgICAgc3RhdHVzX3QgY2hlY2tDb2RlY1NwZWNpZmljRGF0YSgpIGNvbnN0OwotICAgIGludDMyX3QgbVJvdGF0aW9uOwogCiAgICAgdm9pZCB1cGRhdGVUcmFja1NpemVFc3RpbWF0ZSgpOwogICAgIHZvaWQgYWRkT25lU3RzY1RhYmxlRW50cnkoc2l6ZV90IGNodW5rSWQsIHNpemVfdCBzYW1wbGVJZCk7CkBAIC00NzMsMTggKzQ4OCwyMyBAQAogICAgIG1Vc2UzMkJpdE9mZnNldCA9IHRydWU7CiAgICAgbU9mZnNldCA9IDA7CiAgICAgbU1kYXRPZmZzZXQgPSAwOwotICAgIG1Nb292Qm94QnVmZmVyID0gTlVMTDsKLSAgICBtTW9vdkJveEJ1ZmZlck9mZnNldCA9IDA7Ci0gICAgbVdyaXRlTW9vdkJveFRvTWVtb3J5ID0gZmFsc2U7CisgICAgbUluTWVtb3J5Q2FjaGUgPSBOVUxMOworICAgIG1Jbk1lbW9yeUNhY2hlT2Zmc2V0ID0gMDsKKyAgICBtSW5NZW1vcnlDYWNoZVNpemUgPSAwOworICAgIG1Xcml0ZUJveFRvTWVtb3J5ID0gZmFsc2U7CiAgICAgbUZyZWVCb3hPZmZzZXQgPSAwOwogICAgIG1TdHJlYW1hYmxlRmlsZSA9IGZhbHNlOwotICAgIG1Fc3RpbWF0ZWRNb292Qm94U2l6ZSA9IDA7CiAgICAgbVRpbWVTY2FsZSA9IC0xOworICAgIG1IYXNGaWxlTGV2ZWxNZXRhID0gZmFsc2U7CisgICAgbVByaW1hcnlJdGVtSWQgPSAwOworICAgIG1Bc3NvY2lhdGlvbkVudHJ5Q291bnQgPSAwOworICAgIG1OdW1HcmlkcyA9IDA7CiAKICAgICAvLyBGb2xsb3dpbmcgdmFyaWFibGVzIG9ubHkgbmVlZCB0byBiZSBzZXQgZm9yIHRoZSBmaXJzdCByZWNvcmRpbmcgc2Vzc2lvbi4KICAgICAvLyBBbmQgdGhleSB3aWxsIHN0YXkgdGhlIHNhbWUgZm9yIGFsbCB0aGUgcmVjb3JkaW5nIHNlc3Npb25zLgogICAgIGlmIChpc0ZpcnN0U2Vzc2lvbikgewogICAgICAgICBtTW9vdkV4dHJhU2l6ZSA9IDA7CisgICAgICAgIG1IYXNNb292Qm94ID0gZmFsc2U7CiAgICAgICAgIG1NZXRhS2V5cyA9IG5ldyBBTWVzc2FnZSgpOwogICAgICAgICBhZGREZXZpY2VNZXRhKCk7CiAgICAgICAgIG1MYXRpdHVkZXgxMDAwMCA9IDA7CkBAIC01NjYsMTMgKzU4NiwxNSBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAobWltZSwgImFwcGxpY2F0aW9uLyIsIDEyKSkgewogICAgICAgICByZXR1cm4gIm1ldHQiOworICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDLCBtaW1lKSkgeworICAgICAgICByZXR1cm4gImhlaWMiOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dFKCJUcmFjayAoJXMpIG90aGVyIHRoYW4gdmlkZW8vYXVkaW8vbWV0YWRhdGEgaXMgbm90IHN1cHBvcnRlZCIsIG1pbWUpOwogICAgIH0KICAgICByZXR1cm4gTlVMTDsKIH0KIAotc3RhdHVzX3QgTVBFRzRXcml0ZXI6OmFkZFNvdXJjZShjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKK3N0YXR1c190IE1QRUc0V3JpdGVyOjphZGRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgaWYgKG1TdGFydGVkKSB7CiAgICAgICAgIEFMT0dFKCJBdHRlbXB0IHRvIGFkZCBzb3VyY2UgQUZURVIgcmVjb3JkaW5nIGlzIHN0YXJ0ZWQiKTsKQEAgLTU5NCw2ICs2MTYsOSBAQAogICAgIFRyYWNrICp0cmFjayA9IG5ldyBUcmFjayh0aGlzLCBzb3VyY2UsIDEgKyBtVHJhY2tzLnNpemUoKSk7CiAgICAgbVRyYWNrcy5wdXNoX2JhY2sodHJhY2spOwogCisgICAgbUhhc01vb3ZCb3ggfD0gIXRyYWNrLT5pc0hlaWMoKTsKKyAgICBtSGFzRmlsZUxldmVsTWV0YSB8PSB0cmFjay0+aXNIZWljKCk7CisKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTY1NSw2ICs2ODAsMzIgQEAKICNlbmRpZgogfQogCitpbnQ2NF90IE1QRUc0V3JpdGVyOjplc3RpbWF0ZUZpbGVMZXZlbE1ldGFTaXplKCkgeworICAgIC8vIGJhc2UgbWV0YSBzaXplCisgICAgaW50NjRfdCBtZXRhU2l6ZSA9ICAgICAxMiAgLy8gbWV0YSBmdWxsYm94IGhlYWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICsgMzMgIC8vIGhkbHIgYm94CisgICAgICAgICAgICAgICAgICAgICAgICAgKyAxNCAgLy8gcGl0bSBib3gKKyAgICAgICAgICAgICAgICAgICAgICAgICArIDE2ICAvLyBpbG9jIGJveCAoZml4ZWQgc2l6ZSBwb3J0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICsgMTQgIC8vIGlpbmYgYm94IChmaXhlZCBzaXplIHBvcnRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgKyAzMiAgLy8gaXBycCBib3ggKGZpeGVkIHNpemUgcHJvdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICArIDggICAvLyBpZGF0IGJveCAod2hlbiBlbXB0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgICArIDEyICAvLyBpcmVmIGJveCAod2hlbiBlbXB0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgICA7CisKKyAgICBmb3IgKExpc3Q8VHJhY2sgKj46Oml0ZXJhdG9yIGl0ID0gbVRyYWNrcy5iZWdpbigpOworICAgICAgICAgaXQgIT0gbVRyYWNrcy5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoKCppdCktPmlzSGVpYygpKSB7CisgICAgICAgICAgICBtZXRhU2l6ZSArPSAoKml0KS0+Z2V0TWV0YVNpemVJbmNyZWFzZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoImVzdGltYXRlZCBtZXRhIHNpemU6ICVsbGQiLCAobG9uZyBsb25nKSBtZXRhU2l6ZSk7CisKKyAgICAvLyBOZWVkIGF0IGxlYXN0IDgtYnl0ZSBwYWRkaW5nIGF0IHRoZSBlbmQsIG90aGVyd2lzZSB0aGUgbGVmdC1vdmVyCisgICAgLy8gZnJlZWJveCBtYXkgYmVjb21lIG1hbGZvcm1lZAorICAgIHJldHVybiBtZXRhU2l6ZSArIDg7Cit9CisKIGludDY0X3QgTVBFRzRXcml0ZXI6OmVzdGltYXRlTW9vdkJveFNpemUoaW50MzJfdCBiaXRSYXRlKSB7CiAgICAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBoaWdobHkgZXhwZXJpbWVudGFsL2hldXJpc2l0aWMuCiAgICAgLy8KQEAgLTcxNCw3ICs3NjUsMTEgQEAKICAgICBBTE9HSSgibGltaXRzOiAlIiBQUklkNjQgIi8lIiBQUklkNjQgIiBieXRlcy91cywgYml0IHJhdGU6ICVkIGJwcyBhbmQgdGhlIgogICAgICAgICAgIiBlc3RpbWF0ZWQgbW9vdiBzaXplICUiIFBSSWQ2NCAiIGJ5dGVzIiwKICAgICAgICAgIG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMsIG1NYXhGaWxlRHVyYXRpb25MaW1pdFVzLCBiaXRSYXRlLCBzaXplKTsKLSAgICByZXR1cm4gZmFjdG9yICogc2l6ZTsKKworICAgIGludDY0X3QgZXN0aW1hdGVkU2l6ZSA9IGZhY3RvciAqIHNpemU7CisgICAgQ0hFQ0tfR0UoZXN0aW1hdGVkU2l6ZSwgOCk7CisKKyAgICByZXR1cm4gZXN0aW1hdGVkU2l6ZTsKIH0KIAogc3RhdHVzX3QgTVBFRzRXcml0ZXI6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbSkgewpAQCAtNzk2LDYzICs4NTEsNzAgQEAKICAgICAgICAgIG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgPj0ga01pblN0cmVhbWFibGVGaWxlU2l6ZUluQnl0ZXMpOwogCiAgICAgLyoKLSAgICAgKiBtV3JpdGVNb292Qm94VG9NZW1vcnkgaXMgdHJ1ZSBpZiB0aGUgYW1vdW50IG9mIGRhdGEgaW4gbW9vdiBib3ggaXMKLSAgICAgKiBzbWFsbGVyIHRoYW4gdGhlIHJlc2VydmVkIGZyZWUgc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGZpbGUsIEFORAotICAgICAqIHdoZW4gdGhlIGNvbnRlbnQgb2YgbW9vdiBib3ggaXMgY29uc3RydWN0ZWQuIE5vdGUgdGhhdCB2aWRlby9hdWRpbwotICAgICAqIGZyYW1lIGRhdGEgaXMgYWx3YXlzIHdyaXR0ZW4gdG8gdGhlIGZpbGUgYnV0IG5vdCBpbiB0aGUgbWVtb3J5LgorICAgICAqIG1Xcml0ZUJveFRvTWVtb3J5IGlzIHRydWUgaWYgdGhlIGFtb3VudCBvZiBkYXRhIGluIGEgZmlsZS1sZXZlbCBtZXRhIG9yCisgICAgICogbW9vdiBib3ggaXMgc21hbGxlciB0aGFuIHRoZSByZXNlcnZlZCBmcmVlIHNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgYQorICAgICAqIGZpbGUsIEFORCB3aGVuIHRoZSBjb250ZW50IG9mIHRoZSBib3ggaXMgY29uc3RydWN0ZWQuIE5vdGUgdGhhdCB2aWRlby8KKyAgICAgKiBhdWRpbyBmcmFtZSBkYXRhIGlzIGFsd2F5cyB3cml0dGVuIHRvIHRoZSBmaWxlIGJ1dCBub3QgaW4gdGhlIG1lbW9yeS4KICAgICAgKgotICAgICAqIEJlZm9yZSBzdG9wKCkvcmVzZXQoKSBpcyBjYWxsZWQsIG1Xcml0ZU1vb3ZCb3hUb01lbW9yeSBpcyBhbHdheXMKKyAgICAgKiBCZWZvcmUgc3RvcCgpL3Jlc2V0KCkgaXMgY2FsbGVkLCBtV3JpdGVCb3hUb01lbW9yeSBpcyBhbHdheXMKICAgICAgKiBmYWxzZS4gV2hlbiByZXNldCgpIGlzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIGEgcmVjb3JkaW5nIHNlc3Npb24sCi0gICAgICogTW9vdiBib3ggbmVlZHMgdG8gYmUgY29uc3RydWN0ZWQuCisgICAgICogZmlsZS1sZXZlbCBtZXRhIGFuZC9vciBtb292IGJveCBuZWVkcyB0byBiZSBjb25zdHJ1Y3RlZC4KICAgICAgKgotICAgICAqIDEpIFJpZ2h0IGJlZm9yZSBhIG1vb3YgYm94IGlzIGNvbnN0cnVjdGVkLCBtV3JpdGVNb292Qm94VG9NZW1vcnkKLSAgICAgKiB0byBzZXQgdG8gbVN0cmVhbWFibGVGaWxlIHNvIHRoYXQgaWYKLSAgICAgKiB0aGUgZmlsZSBpcyBpbnRlbmRlZCB0byBiZSBzdHJlYW1hYmxlLCBpdCBpcyBzZXQgdG8gdHJ1ZTsKLSAgICAgKiBvdGhlcndpc2UsIGl0IGlzIHNldCB0byBmYWxzZS4gV2hlbiB0aGUgdmFsdWUgaXMgc2V0IHRvIGZhbHNlLAotICAgICAqIGFsbCB0aGUgY29udGVudCBvZiB0aGUgbW9vdiBib3ggaXMgd3JpdHRlbiBpbW1lZGlhdGVseSB0bworICAgICAqIDEpIFJpZ2h0IGJlZm9yZSB0aGUgYm94IGlzIGNvbnN0cnVjdGVkLCBtV3JpdGVCb3hUb01lbW9yeSB0byBzZXQgdG8KKyAgICAgKiBtU3RyZWFtYWJsZUZpbGUgc28gdGhhdCBpZiB0aGUgZmlsZSBpcyBpbnRlbmRlZCB0byBiZSBzdHJlYW1hYmxlLCBpdAorICAgICAqIGlzIHNldCB0byB0cnVlOyBvdGhlcndpc2UsIGl0IGlzIHNldCB0byBmYWxzZS4gV2hlbiB0aGUgdmFsdWUgaXMgc2V0CisgICAgICogdG8gZmFsc2UsIGFsbCB0aGUgY29udGVudCBvZiB0aGF0IGJveCBpcyB3cml0dGVuIGltbWVkaWF0ZWx5IHRvCiAgICAgICogdGhlIGVuZCBvZiB0aGUgZmlsZS4gV2hlbiB0aGUgdmFsdWUgaXMgc2V0IHRvIHRydWUsIGFsbCB0aGUKLSAgICAgKiBjb250ZW50IG9mIHRoZSBtb292IGJveCBpcyB3cml0dGVuIHRvIGFuIGluLW1lbW9yeSBjYWNoZSwKLSAgICAgKiBtTW9vdkJveEJ1ZmZlciwgdXRpbCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbiBoYXBwZW5zLiBOb3RlCisgICAgICogY29udGVudCBvZiB0aGF0IGJveCBpcyB3cml0dGVuIHRvIGFuIGluLW1lbW9yeSBjYWNoZSwKKyAgICAgKiBtSW5NZW1vcnlDYWNoZSwgdXRpbCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbiBoYXBwZW5zLiBOb3RlCiAgICAgICogdGhhdCB0aGUgc2l6ZSBvZiB0aGUgaW4tbWVtb3J5IGNhY2hlIGlzIHRoZSBzYW1lIGFzIHRoZQogICAgICAqIHJlc2VydmVkIGZyZWUgc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KICAgICAgKgotICAgICAqIDIpIFdoaWxlIHRoZSBkYXRhIG9mIHRoZSBtb292IGJveCBpcyB3cml0dGVuIHRvIGFuIGluLW1lbW9yeQorICAgICAqIDIpIFdoaWxlIHRoZSBkYXRhIG9mIHRoZSBib3ggaXMgd3JpdHRlbiB0byBhbiBpbi1tZW1vcnkKICAgICAgKiBjYWNoZSwgdGhlIGRhdGEgc2l6ZSBpcyBjaGVja2VkIGFnYWluc3QgdGhlIHJlc2VydmVkIHNwYWNlLgotICAgICAqIElmIHRoZSBkYXRhIHNpemUgc3VycGFzc2VzIHRoZSByZXNlcnZlZCBzcGFjZSwgc3Vic2VxdWVudCBtb292Ci0gICAgICogZGF0YSBjb3VsZCBubyBsb25nZXIgYmUgaG9sZCBpbiB0aGUgaW4tbWVtb3J5IGNhY2hlLiBUaGlzIGFsc28KKyAgICAgKiBJZiB0aGUgZGF0YSBzaXplIHN1cnBhc3NlcyB0aGUgcmVzZXJ2ZWQgc3BhY2UsIHN1YnNlcXVlbnQgYm94IGRhdGEKKyAgICAgKiBjb3VsZCBubyBsb25nZXIgYmUgaG9sZCBpbiB0aGUgaW4tbWVtb3J5IGNhY2hlLiBUaGlzIGFsc28KICAgICAgKiBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVzZXJ2ZWQgc3BhY2Ugd2FzIHRvbyBzbWFsbC4gQXQgdGhpcyBwb2ludCwKLSAgICAgKiBfYWxsXyBtb292IGRhdGEgbXVzdCBiZSB3cml0dGVuIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUuCi0gICAgICogbVdyaXRlTW9vdkJveFRvTWVtb3J5IG11c3QgYmUgc2V0IHRvIGZhbHNlIHRvIGRpcmVjdCB0aGUgd3JpdGUKKyAgICAgKiBfYWxsXyBzdWJzZXF1ZW50IGJveCBkYXRhIG11c3QgYmUgd3JpdHRlbiB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLgorICAgICAqIG1Xcml0ZUJveFRvTWVtb3J5IG11c3QgYmUgc2V0IHRvIGZhbHNlIHRvIGRpcmVjdCB0aGUgd3JpdGUKICAgICAgKiB0byB0aGUgZmlsZS4KICAgICAgKgotICAgICAqIDMpIElmIHRoZSBkYXRhIHNpemUgaW4gbW9vdiBib3ggaXMgc21hbGxlciB0aGFuIHRoZSByZXNlcnZlZAotICAgICAqIHNwYWNlIGFmdGVyIG1vb3YgYm94IGlzIGNvbXBsZXRlbHkgY29uc3RydWN0ZWQsIHRoZSBpbi1tZW1vcnkKLSAgICAgKiBjYWNoZSBjb3B5IG9mIHRoZSBtb292IGJveCBpcyB3cml0dGVuIHRvIHRoZSByZXNlcnZlZCBmcmVlCi0gICAgICogc3BhY2UuIFRodXMsIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBtb292IGlzIGNvbXBsZXRlZGx5Ci0gICAgICogY29uc3RydWN0ZWQsIG1Xcml0ZU1vb3ZCb3hUb01lbW9yeSBpcyBhbHdheXMgc2V0IHRvIGZhbHNlLgorICAgICAqIDMpIElmIHRoZSBkYXRhIHNpemUgaW4gdGhlIGJveCBpcyBzbWFsbGVyIHRoYW4gdGhlIHJlc2VydmVkCisgICAgICogc3BhY2UgYWZ0ZXIgdGhlIGJveCBpcyBjb21wbGV0ZWx5IGNvbnN0cnVjdGVkLCB0aGUgaW4tbWVtb3J5CisgICAgICogY2FjaGUgY29weSBvZiB0aGUgYm94IGlzIHdyaXR0ZW4gdG8gdGhlIHJlc2VydmVkIGZyZWUgc3BhY2UuCisgICAgICogbVdyaXRlQm94VG9NZW1vcnkgaXMgYWx3YXlzIHNldCB0byBmYWxzZSBhZnRlciBhbGwgYm94ZXMgdGhhdAorICAgICAqIHVzaW5nIHRoZSBpbi1tZW1vcnkgY2FjaGUgaGF2ZSBiZWVuIGNvbnN0cnVjdGVkLgogICAgICAqLwotICAgIG1Xcml0ZU1vb3ZCb3hUb01lbW9yeSA9IGZhbHNlOwotICAgIG1Nb292Qm94QnVmZmVyID0gTlVMTDsKLSAgICBtTW9vdkJveEJ1ZmZlck9mZnNldCA9IDA7CisgICAgbVdyaXRlQm94VG9NZW1vcnkgPSBmYWxzZTsKKyAgICBtSW5NZW1vcnlDYWNoZSA9IE5VTEw7CisgICAgbUluTWVtb3J5Q2FjaGVPZmZzZXQgPSAwOworCisKKyAgICBBTE9HVigibXV4ZXIgc3RhcnRpbmc6IG1IYXNNb292Qm94ICVkLCBtSGFzRmlsZUxldmVsTWV0YSAlZCIsCisgICAgICAgICAgICBtSGFzTW9vdkJveCwgbUhhc0ZpbGVMZXZlbE1ldGEpOwogCiAgICAgd3JpdGVGdHlwQm94KHBhcmFtKTsKIAogICAgIG1GcmVlQm94T2Zmc2V0ID0gbU9mZnNldDsKIAotICAgIGlmIChtRXN0aW1hdGVkTW9vdkJveFNpemUgPT0gMCkgeworICAgIGlmIChtSW5NZW1vcnlDYWNoZVNpemUgPT0gMCkgewogICAgICAgICBpbnQzMl90IGJpdFJhdGUgPSAtMTsKLSAgICAgICAgaWYgKHBhcmFtKSB7Ci0gICAgICAgICAgICBwYXJhbS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmYml0UmF0ZSk7CisgICAgICAgIGlmIChtSGFzRmlsZUxldmVsTWV0YSkgeworICAgICAgICAgICAgbUluTWVtb3J5Q2FjaGVTaXplICs9IGVzdGltYXRlRmlsZUxldmVsTWV0YVNpemUoKTsKICAgICAgICAgfQotICAgICAgICBtRXN0aW1hdGVkTW9vdkJveFNpemUgPSBlc3RpbWF0ZU1vb3ZCb3hTaXplKGJpdFJhdGUpOworICAgICAgICBpZiAobUhhc01vb3ZCb3gpIHsKKyAgICAgICAgICAgIGlmIChwYXJhbSkgeworICAgICAgICAgICAgICAgIHBhcmFtLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZiaXRSYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Jbk1lbW9yeUNhY2hlU2l6ZSArPSBlc3RpbWF0ZU1vb3ZCb3hTaXplKGJpdFJhdGUpOworICAgICAgICB9CiAgICAgfQotICAgIENIRUNLX0dFKG1Fc3RpbWF0ZWRNb292Qm94U2l6ZSwgOCk7CiAgICAgaWYgKG1TdHJlYW1hYmxlRmlsZSkgewogICAgICAgICAvLyBSZXNlcnZlIGEgJ2ZyZWUnIGJveCBvbmx5IGZvciBzdHJlYW1hYmxlIGZpbGUKICAgICAgICAgbHNlZWs2NChtRmQsIG1GcmVlQm94T2Zmc2V0LCBTRUVLX1NFVCk7Ci0gICAgICAgIHdyaXRlSW50MzIobUVzdGltYXRlZE1vb3ZCb3hTaXplKTsKKyAgICAgICAgd3JpdGVJbnQzMihtSW5NZW1vcnlDYWNoZVNpemUpOwogICAgICAgICB3cml0ZSgiZnJlZSIsIDQpOwotICAgICAgICBtTWRhdE9mZnNldCA9IG1GcmVlQm94T2Zmc2V0ICsgbUVzdGltYXRlZE1vb3ZCb3hTaXplOworICAgICAgICBtTWRhdE9mZnNldCA9IG1GcmVlQm94T2Zmc2V0ICsgbUluTWVtb3J5Q2FjaGVTaXplOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1NZGF0T2Zmc2V0ID0gbU9mZnNldDsKICAgICB9CkBAIC05NjQsOCArMTAyNiw4IEBACiAgICAgbUZkID0gLTE7CiAgICAgbUluaXRDaGVjayA9IE5PX0lOSVQ7CiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICBmcmVlKG1Nb292Qm94QnVmZmVyKTsKLSAgICBtTW9vdkJveEJ1ZmZlciA9IE5VTEw7CisgICAgZnJlZShtSW5NZW1vcnlDYWNoZSk7CisgICAgbUluTWVtb3J5Q2FjaGUgPSBOVUxMOwogfQogCiB2b2lkIE1QRUc0V3JpdGVyOjpmaW5pc2hDdXJyZW50U2Vzc2lvbigpIHsKQEAgLTEwMDgsMTMgKzEwNzAsMTggQEAKICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKICAgICBpbnQ2NF90IG1heER1cmF0aW9uVXMgPSAwOwogICAgIGludDY0X3QgbWluRHVyYXRpb25VcyA9IDB4N2ZmZmZmZmZmZmZmZmZmZkxMOworICAgIGludDMyX3Qgbm9uSW1hZ2VUcmFja0NvdW50ID0gMDsKICAgICBmb3IgKExpc3Q8VHJhY2sgKj46Oml0ZXJhdG9yIGl0ID0gbVRyYWNrcy5iZWdpbigpOwotICAgICAgICAgaXQgIT0gbVRyYWNrcy5lbmQoKTsgKytpdCkgeworICAgICAgICBpdCAhPSBtVHJhY2tzLmVuZCgpOyArK2l0KSB7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9ICgqaXQpLT5zdG9wKHN0b3BTb3VyY2UpOwogICAgICAgICBpZiAoZXJyID09IE9LICYmIHN0YXR1cyAhPSBPSykgewogICAgICAgICAgICAgZXJyID0gc3RhdHVzOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gc2tpcCBpbWFnZSB0cmFja3MKKyAgICAgICAgaWYgKCgqaXQpLT5pc0hlaWMoKSkgY29udGludWU7CisgICAgICAgIG5vbkltYWdlVHJhY2tDb3VudCsrOworCiAgICAgICAgIGludDY0X3QgZHVyYXRpb25VcyA9ICgqaXQpLT5nZXREdXJhdGlvblVzKCk7CiAgICAgICAgIGlmIChkdXJhdGlvblVzID4gbWF4RHVyYXRpb25VcykgewogICAgICAgICAgICAgbWF4RHVyYXRpb25VcyA9IGR1cmF0aW9uVXM7CkBAIC0xMDI0LDcgKzEwOTEsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKG1UcmFja3Muc2l6ZSgpID4gMSkgeworICAgIGlmIChub25JbWFnZVRyYWNrQ291bnQgPiAxKSB7CiAgICAgICAgIEFMT0dEKCJEdXJhdGlvbiBmcm9tIHRyYWNrcyByYW5nZSBpcyBbJSIgUFJJZDY0ICIsICUiIFBSSWQ2NCAiXSB1cyIsCiAgICAgICAgICAgICBtaW5EdXJhdGlvblVzLCBtYXhEdXJhdGlvblVzKTsKICAgICB9CkBAIC0xMDUwLDQ1ICsxMTE3LDQzIEBACiAgICAgfQogICAgIGxzZWVrNjQobUZkLCBtT2Zmc2V0LCBTRUVLX1NFVCk7CiAKLSAgICAvLyBDb25zdHJ1Y3QgbW9vdiBib3ggbm93Ci0gICAgbU1vb3ZCb3hCdWZmZXJPZmZzZXQgPSAwOwotICAgIG1Xcml0ZU1vb3ZCb3hUb01lbW9yeSA9IG1TdHJlYW1hYmxlRmlsZTsKLSAgICBpZiAobVdyaXRlTW9vdkJveFRvTWVtb3J5KSB7CisgICAgLy8gQ29uc3RydWN0IGZpbGUtbGV2ZWwgbWV0YSBhbmQgbW9vdiBib3ggbm93CisgICAgbUluTWVtb3J5Q2FjaGVPZmZzZXQgPSAwOworICAgIG1Xcml0ZUJveFRvTWVtb3J5ID0gbVN0cmVhbWFibGVGaWxlOworICAgIGlmIChtV3JpdGVCb3hUb01lbW9yeSkgewogICAgICAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIGFsbG9jYXRlIGluLW1lbW9yeSBjYWNoZQotICAgICAgICAvLyBmb3IgbW9vdiBib3ggaWYgdGhlIGZpbGUgaXMgbm90IHN0cmVhbWFibGUuCisgICAgICAgIC8vIGlmIHRoZSBmaWxlIGlzIG5vdCBzdHJlYW1hYmxlLgogCi0gICAgICAgIG1Nb292Qm94QnVmZmVyID0gKHVpbnQ4X3QgKikgbWFsbG9jKG1Fc3RpbWF0ZWRNb292Qm94U2l6ZSk7Ci0gICAgICAgIENIRUNLKG1Nb292Qm94QnVmZmVyICE9IE5VTEwpOwotICAgIH0KLSAgICB3cml0ZU1vb3ZCb3gobWF4RHVyYXRpb25Vcyk7Ci0KLSAgICAvLyBtV3JpdGVNb292Qm94VG9NZW1vcnkgY291bGQgYmUgc2V0IHRvIGZhbHNlIGluCi0gICAgLy8gTVBFRzRXcml0ZXI6OndyaXRlKCkgbWV0aG9kCi0gICAgaWYgKG1Xcml0ZU1vb3ZCb3hUb01lbW9yeSkgewotICAgICAgICBtV3JpdGVNb292Qm94VG9NZW1vcnkgPSBmYWxzZTsKLSAgICAgICAgLy8gQ29udGVudCBvZiB0aGUgbW9vdiBib3ggaXMgc2F2ZWQgaW4gdGhlIGNhY2hlLCBhbmQgdGhlIGluLW1lbW9yeQotICAgICAgICAvLyBtb292IGJveCBuZWVkcyB0byBiZSB3cml0dGVuIHRvIHRoZSBmaWxlIGluIGEgc2luZ2xlIHNob3QuCi0KLSAgICAgICAgQ0hFQ0tfTEUobU1vb3ZCb3hCdWZmZXJPZmZzZXQgKyA4LCBtRXN0aW1hdGVkTW9vdkJveFNpemUpOwotCi0gICAgICAgIC8vIE1vb3YgYm94Ci0gICAgICAgIGxzZWVrNjQobUZkLCBtRnJlZUJveE9mZnNldCwgU0VFS19TRVQpOwotICAgICAgICBtT2Zmc2V0ID0gbUZyZWVCb3hPZmZzZXQ7Ci0gICAgICAgIHdyaXRlKG1Nb292Qm94QnVmZmVyLCAxLCBtTW9vdkJveEJ1ZmZlck9mZnNldCk7Ci0KLSAgICAgICAgLy8gRnJlZSBib3gKLSAgICAgICAgbHNlZWs2NChtRmQsIG1PZmZzZXQsIFNFRUtfU0VUKTsKLSAgICAgICAgd3JpdGVJbnQzMihtRXN0aW1hdGVkTW9vdkJveFNpemUgLSBtTW9vdkJveEJ1ZmZlck9mZnNldCk7Ci0gICAgICAgIHdyaXRlKCJmcmVlIiwgNCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0koIlRoZSBtcDQgZmlsZSB3aWxsIG5vdCBiZSBzdHJlYW1hYmxlLiIpOworICAgICAgICBtSW5NZW1vcnlDYWNoZSA9ICh1aW50OF90ICopIG1hbGxvYyhtSW5NZW1vcnlDYWNoZVNpemUpOworICAgICAgICBDSEVDSyhtSW5NZW1vcnlDYWNoZSAhPSBOVUxMKTsKICAgICB9CiAKLSAgICAvLyBGcmVlIGluLW1lbW9yeSBjYWNoZSBmb3IgbW9vdiBib3gKLSAgICBpZiAobU1vb3ZCb3hCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBmcmVlKG1Nb292Qm94QnVmZmVyKTsKLSAgICAgICAgbU1vb3ZCb3hCdWZmZXIgPSBOVUxMOwotICAgICAgICBtTW9vdkJveEJ1ZmZlck9mZnNldCA9IDA7CisgICAgaWYgKG1IYXNGaWxlTGV2ZWxNZXRhKSB7CisgICAgICAgIHdyaXRlRmlsZUxldmVsTWV0YUJveCgpOworICAgICAgICBpZiAobVdyaXRlQm94VG9NZW1vcnkpIHsKKyAgICAgICAgICAgIHdyaXRlQ2FjaGVkQm94VG9GaWxlKCJtZXRhIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HSSgiVGhlIGZpbGUgbWV0YSBib3ggaXMgd3JpdHRlbiBhdCB0aGUgZW5kLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1IYXNNb292Qm94KSB7CisgICAgICAgIHdyaXRlTW9vdkJveChtYXhEdXJhdGlvblVzKTsKKyAgICAgICAgLy8gbVdyaXRlQm94VG9NZW1vcnkgY291bGQgYmUgc2V0IHRvIGZhbHNlIGluCisgICAgICAgIC8vIE1QRUc0V3JpdGVyOjp3cml0ZSgpIG1ldGhvZAorICAgICAgICBpZiAobVdyaXRlQm94VG9NZW1vcnkpIHsKKyAgICAgICAgICAgIHdyaXRlQ2FjaGVkQm94VG9GaWxlKCJtb292Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HSSgiVGhlIG1wNCBmaWxlIHdpbGwgbm90IGJlIHN0cmVhbWFibGUuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgbVdyaXRlQm94VG9NZW1vcnkgPSBmYWxzZTsKKworICAgIC8vIEZyZWUgaW4tbWVtb3J5IGNhY2hlIGZvciBib3ggd3JpdGluZworICAgIGlmIChtSW5NZW1vcnlDYWNoZSAhPSBOVUxMKSB7CisgICAgICAgIGZyZWUobUluTWVtb3J5Q2FjaGUpOworICAgICAgICBtSW5NZW1vcnlDYWNoZSA9IE5VTEw7CisgICAgICAgIG1Jbk1lbW9yeUNhY2hlT2Zmc2V0ID0gMDsKICAgICB9CiAKICAgICBDSEVDSyhtQm94ZXMuZW1wdHkoKSk7CkBAIC0xMDk3LDYgKzExNjIsNDIgQEAKICAgICByZXR1cm4gZXJyOwogfQogCisvKgorICogV3JpdGVzIGN1cnJlbnRseSBjYWNoZWQgYm94IGludG8gZmlsZS4KKyAqCisgKiBNdXN0IGJlIGNhbGxlZCB3aGlsZSBtV3JpdGVCb3hUb01lbW9yeSBpcyB0cnVlLCBhbmQgd2lsbCBub3QgbW9kaWZ5CisgKiBtV3JpdGVCb3hUb01lbW9yeS4gQWZ0ZXIgdGhlIGNhbGwsIHJlbWFpbmluZyBjYWNoZSBzaXplIHdpbGwgYmUKKyAqIHJlZHVjZWQgYW5kIGJ1ZmZlciBvZmZzZXQgd2lsbCBiZSBzZXQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgY2FjaGUuCisgKi8KK3ZvaWQgTVBFRzRXcml0ZXI6OndyaXRlQ2FjaGVkQm94VG9GaWxlKGNvbnN0IGNoYXIgKnR5cGUpIHsKKyAgICBDSEVDSyhtV3JpdGVCb3hUb01lbW9yeSk7CisKKyAgICBtV3JpdGVCb3hUb01lbW9yeSA9IGZhbHNlOworICAgIC8vIENvbnRlbnQgb2YgdGhlIGJveCBpcyBzYXZlZCBpbiB0aGUgY2FjaGUsIGFuZCB0aGUgaW4tbWVtb3J5CisgICAgLy8gYm94IG5lZWRzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGZpbGUgaW4gYSBzaW5nbGUgc2hvdC4KKworICAgIENIRUNLX0xFKG1Jbk1lbW9yeUNhY2hlT2Zmc2V0ICsgOCwgbUluTWVtb3J5Q2FjaGVTaXplKTsKKworICAgIC8vIENhY2hlZCBib3gKKyAgICBsc2VlazY0KG1GZCwgbUZyZWVCb3hPZmZzZXQsIFNFRUtfU0VUKTsKKyAgICBtT2Zmc2V0ID0gbUZyZWVCb3hPZmZzZXQ7CisgICAgd3JpdGUobUluTWVtb3J5Q2FjaGUsIDEsIG1Jbk1lbW9yeUNhY2hlT2Zmc2V0KTsKKworICAgIC8vIEZyZWUgYm94CisgICAgbHNlZWs2NChtRmQsIG1PZmZzZXQsIFNFRUtfU0VUKTsKKyAgICBtRnJlZUJveE9mZnNldCA9IG1PZmZzZXQ7CisgICAgd3JpdGVJbnQzMihtSW5NZW1vcnlDYWNoZVNpemUgLSBtSW5NZW1vcnlDYWNoZU9mZnNldCk7CisgICAgd3JpdGUoImZyZWUiLCA0KTsKKworICAgIC8vIFJld2luZCBidWZmZXJpbmcgdG8gdGhlIGJlZ2lubmluZywgYW5kIHJlc3RvcmUgbVdyaXRlQm94VG9NZW1vcnkgZmxhZworICAgIG1Jbk1lbW9yeUNhY2hlU2l6ZSAtPSBtSW5NZW1vcnlDYWNoZU9mZnNldDsKKyAgICBtSW5NZW1vcnlDYWNoZU9mZnNldCA9IDA7CisgICAgbVdyaXRlQm94VG9NZW1vcnkgPSB0cnVlOworCisgICAgQUxPR1YoImR1bXBlZCBvdXQgJXMgYm94LCBlc3RpbWF0ZWQgc2l6ZSByZW1haW5pbmcgJWxsZCIsCisgICAgICAgICAgICB0eXBlLCAobG9uZyBsb25nKW1Jbk1lbW9yeUNhY2hlU2l6ZSk7Cit9CisKIHVpbnQzMl90IE1QRUc0V3JpdGVyOjpnZXRNcGVnNFRpbWUoKSB7CiAgICAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CiAgICAgLy8gTVA0IGZpbGUgdXNlcyB0aW1lIGNvdW50aW5nIHNlY29uZHMgc2luY2UgbWlkbmlnaHQsIEphbi4gMSwgMTkwNApAQCAtMTE0MSwxNCArMTI0MiwxNiBAQAogICAgIGlmIChtQXJlR2VvVGFnc0F2YWlsYWJsZSkgewogICAgICAgICB3cml0ZVVkdGFCb3goKTsKICAgICB9Ci0gICAgd3JpdGVNZXRhQm94KCk7CisgICAgd3JpdGVNb292TGV2ZWxNZXRhQm94KCk7CiAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgdHJhY2tzIHRvIGdldCB0aGUgZ2xvYmFsIHRpbWUgb2Zmc2V0IGlmIHRoZXJlIGlzCiAgICAgLy8gYW55IGN0dHMgdGFibGUgYXBwZWFycyBpbiBhIHZpZGVvIHRyYWNrLgogICAgIGludDY0X3QgbWluQ3R0c09mZnNldFRpbWVVcyA9IGtNYXhDdHRzT2Zmc2V0VGltZVVzOwogICAgIGZvciAoTGlzdDxUcmFjayAqPjo6aXRlcmF0b3IgaXQgPSBtVHJhY2tzLmJlZ2luKCk7CiAgICAgICAgIGl0ICE9IG1UcmFja3MuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgbWluQ3R0c09mZnNldFRpbWVVcyA9Ci0gICAgICAgICAgICBzdGQ6Om1pbihtaW5DdHRzT2Zmc2V0VGltZVVzLCAoKml0KS0+Z2V0TWluQ3R0c09mZnNldFRpbWVVcygpKTsKKyAgICAgICAgaWYgKCEoKml0KS0+aXNIZWljKCkpIHsKKyAgICAgICAgICAgIG1pbkN0dHNPZmZzZXRUaW1lVXMgPQorICAgICAgICAgICAgICAgIHN0ZDo6bWluKG1pbkN0dHNPZmZzZXRUaW1lVXMsICgqaXQpLT5nZXRNaW5DdHRzT2Zmc2V0VGltZVVzKCkpOworICAgICAgICB9CiAgICAgfQogICAgIEFMT0dJKCJBanVzdCB0aGUgbW9vdiBzdGFydCB0aW1lIGZyb20gJWxsZCB1cyAtPiAlbGxkIHVzIiwKICAgICAgICAgICAgIChsb25nIGxvbmcpbVN0YXJ0VGltZXN0YW1wVXMsCkBAIC0xMTU4LDcgKzEyNjEsOSBAQAogCiAgICAgZm9yIChMaXN0PFRyYWNrICo+OjppdGVyYXRvciBpdCA9IG1UcmFja3MuYmVnaW4oKTsKICAgICAgICAgaXQgIT0gbVRyYWNrcy5lbmQoKTsgKytpdCkgewotICAgICAgICAoKml0KS0+d3JpdGVUcmFja0hlYWRlcihtVXNlMzJCaXRPZmZzZXQpOworICAgICAgICBpZiAoISgqaXQpLT5pc0hlaWMoKSkgeworICAgICAgICAgICAgKCppdCktPndyaXRlVHJhY2tIZWFkZXIobVVzZTMyQml0T2Zmc2V0KTsKKyAgICAgICAgfQogICAgIH0KICAgICBlbmRCb3goKTsgIC8vIG1vb3YKIH0KQEAgLTExNjcsMTcgKzEyNzIsMzEgQEAKICAgICBiZWdpbkJveCgiZnR5cCIpOwogCiAgICAgaW50MzJfdCBmaWxlVHlwZTsKLSAgICBpZiAocGFyYW0gJiYgcGFyYW0tPmZpbmRJbnQzMihrS2V5RmlsZVR5cGUsICZmaWxlVHlwZSkgJiYKLSAgICAgICAgZmlsZVR5cGUgIT0gT1VUUFVUX0ZPUk1BVF9NUEVHXzQpIHsKKyAgICBpZiAoIXBhcmFtIHx8ICFwYXJhbS0+ZmluZEludDMyKGtLZXlGaWxlVHlwZSwgJmZpbGVUeXBlKSkgeworICAgICAgICBmaWxlVHlwZSA9IE9VVFBVVF9GT1JNQVRfTVBFR180OworICAgIH0KKyAgICBpZiAoZmlsZVR5cGUgIT0gT1VUUFVUX0ZPUk1BVF9NUEVHXzQgJiYgZmlsZVR5cGUgIT0gT1VUUFVUX0ZPUk1BVF9IRUlGKSB7CiAgICAgICAgIHdyaXRlRm91cmNjKCIzZ3A0Iik7CiAgICAgICAgIHdyaXRlSW50MzIoMCk7CiAgICAgICAgIHdyaXRlRm91cmNjKCJpc29tIik7CiAgICAgICAgIHdyaXRlRm91cmNjKCIzZ3A0Iik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgd3JpdGVGb3VyY2MoIm1wNDIiKTsKKyAgICAgICAgLy8gT25seSB3cml0ZSAiaGVpYyIgYXMgbWFqb3IgYnJhbmQgaWYgdGhlIGNsaWVudCBzcGVjaWZpZWQgSEVJRgorICAgICAgICAvLyBBTkQgd2UgaW5kZWVkIHJlY2VpdmUgc29tZSBpbWFnZSBoZWljIHRyYWNrcy4KKyAgICAgICAgaWYgKGZpbGVUeXBlID09IE9VVFBVVF9GT1JNQVRfSEVJRiAmJiBtSGFzRmlsZUxldmVsTWV0YSkgeworICAgICAgICAgICAgd3JpdGVGb3VyY2MoImhlaWMiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdyaXRlRm91cmNjKCJtcDQyIik7CisgICAgICAgIH0KICAgICAgICAgd3JpdGVJbnQzMigwKTsKLSAgICAgICAgd3JpdGVGb3VyY2MoImlzb20iKTsKLSAgICAgICAgd3JpdGVGb3VyY2MoIm1wNDIiKTsKKyAgICAgICAgaWYgKG1IYXNGaWxlTGV2ZWxNZXRhKSB7CisgICAgICAgICAgICB3cml0ZUZvdXJjYygibWlmMSIpOworICAgICAgICAgICAgd3JpdGVGb3VyY2MoImhlaWMiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUhhc01vb3ZCb3gpIHsKKyAgICAgICAgICAgIHdyaXRlRm91cmNjKCJpc29tIik7CisgICAgICAgICAgICB3cml0ZUZvdXJjYygibXA0MiIpOworICAgICAgICB9CiAgICAgfQogCiAgICAgZW5kQm94KCk7CkBAIC0xMjI0LDE1ICsxMzQzLDIxIEBACiAgICAgbUxvY2sudW5sb2NrKCk7CiB9CiAKLW9mZjY0X3QgTVBFRzRXcml0ZXI6OmFkZFNhbXBsZV9sKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKK29mZjY0X3QgTVBFRzRXcml0ZXI6OmFkZFNhbXBsZV9sKAorICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyLCBib29sIHVzZVByZWZpeCwgc2l6ZV90ICpieXRlc1dyaXR0ZW4pIHsKICAgICBvZmY2NF90IG9sZF9vZmZzZXQgPSBtT2Zmc2V0OwogCi0gICAgOjp3cml0ZShtRmQsCi0gICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgaWYgKHVzZVByZWZpeCkgeworICAgICAgICBhZGRNdWx0aXBsZUxlbmd0aFByZWZpeGVkU2FtcGxlc19sKGJ1ZmZlcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgOjp3cml0ZShtRmQsCisgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAorICAgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKIAotICAgIG1PZmZzZXQgKz0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgbU9mZnNldCArPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOworICAgIH0KIAorICAgICpieXRlc1dyaXR0ZW4gPSBtT2Zmc2V0IC0gb2xkX29mZnNldDsKICAgICByZXR1cm4gb2xkX29mZnNldDsKIH0KIApAQCAtMTI1MCwxOCArMTM3NSwxMyBAQAogICAgIH0KIH0KIAotb2ZmNjRfdCBNUEVHNFdyaXRlcjo6YWRkTXVsdGlwbGVMZW5ndGhQcmVmaXhlZFNhbXBsZXNfbChNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7Ci0gICAgb2ZmNjRfdCBvbGRfb2Zmc2V0ID0gbU9mZnNldDsKLQotICAgIGNvbnN0IHNpemVfdCBrRXh0ZW5zaW9uTkFMU2VhcmNoUmFuZ2UgPSA2NDsgLy8gYnl0ZXMgdG8gbG9vayBmb3Igbm9uLVZDTCBOQUxVcwotCit2b2lkIE1QRUc0V3JpdGVyOjphZGRNdWx0aXBsZUxlbmd0aFByZWZpeGVkU2FtcGxlc19sKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKICAgICBjb25zdCB1aW50OF90ICpkYXRhU3RhcnQgPSAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKICAgICBjb25zdCB1aW50OF90ICpjdXJyZW50TmFsU3RhcnQgPSBkYXRhU3RhcnQ7CiAgICAgY29uc3QgdWludDhfdCAqbmV4dE5hbFN0YXJ0OwogICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBkYXRhU3RhcnQ7CiAgICAgc2l6ZV90IG5leHROYWxTaXplOwotICAgIHNpemVfdCBzZWFyY2hTaXplID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA+IGtFeHRlbnNpb25OQUxTZWFyY2hSYW5nZSA/Ci0gICAgICAgICAgICAgICAgICAga0V4dGVuc2lvbk5BTFNlYXJjaFJhbmdlIDogYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKyAgICBzaXplX3Qgc2VhcmNoU2l6ZSA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CiAKICAgICB3aGlsZSAoZ2V0TmV4dE5BTFVuaXQoJmRhdGEsICZzZWFyY2hTaXplLCAmbmV4dE5hbFN0YXJ0LAogICAgICAgICAgICAgJm5leHROYWxTaXplLCB0cnVlKSA9PSBPSykgewpAQCAtMTI3NywxMyArMTM5Nyw5IEBACiAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIGN1cnJlbnROYWxPZmZzZXQsCiAgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gY3VycmVudE5hbE9mZnNldCk7CiAgICAgYWRkTGVuZ3RoUHJlZml4ZWRTYW1wbGVfbChidWZmZXIpOwotCi0gICAgcmV0dXJuIG9sZF9vZmZzZXQ7CiB9CiAKLW9mZjY0X3QgTVBFRzRXcml0ZXI6OmFkZExlbmd0aFByZWZpeGVkU2FtcGxlX2woTWVkaWFCdWZmZXIgKmJ1ZmZlcikgewotICAgIG9mZjY0X3Qgb2xkX29mZnNldCA9IG1PZmZzZXQ7Ci0KK3ZvaWQgTVBFRzRXcml0ZXI6OmFkZExlbmd0aFByZWZpeGVkU2FtcGxlX2woTWVkaWFCdWZmZXIgKmJ1ZmZlcikgewogICAgIHNpemVfdCBsZW5ndGggPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOwogCiAgICAgaWYgKG1Vc2U0Qnl0ZU5hbExlbmd0aCkgewpAQCAtMTMxMSw0MCArMTQyNywzNSBAQAogICAgICAgICA6OndyaXRlKG1GZCwgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksIGxlbmd0aCk7CiAgICAgICAgIG1PZmZzZXQgKz0gbGVuZ3RoICsgMjsKICAgICB9Ci0KLSAgICByZXR1cm4gb2xkX29mZnNldDsKIH0KIAogc2l6ZV90IE1QRUc0V3JpdGVyOjp3cml0ZSgKICAgICAgICAgY29uc3Qgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IG5tZW1iKSB7CiAKICAgICBjb25zdCBzaXplX3QgYnl0ZXMgPSBzaXplICogbm1lbWI7Ci0gICAgaWYgKG1Xcml0ZU1vb3ZCb3hUb01lbW9yeSkgeworICAgIGlmIChtV3JpdGVCb3hUb01lbW9yeSkgewogCi0gICAgICAgIG9mZjY0X3QgbW9vdkJveFNpemUgPSA4ICsgbU1vb3ZCb3hCdWZmZXJPZmZzZXQgKyBieXRlczsKLSAgICAgICAgaWYgKG1vb3ZCb3hTaXplID4gbUVzdGltYXRlZE1vb3ZCb3hTaXplKSB7Ci0gICAgICAgICAgICAvLyBUaGUgcmVzZXJ2ZWQgbW9vdiBib3ggYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZQotICAgICAgICAgICAgLy8gaXMgbm90IGJpZyBlbm91Z2guIE1vb3YgYm94IHNob3VsZCBiZSB3cml0dGVuIHRvCi0gICAgICAgICAgICAvLyB0aGUgZW5kIG9mIHRoZSBmaWxlIGZyb20gbm93IG9uLCBidXQgbm90IHRvIHRoZQotICAgICAgICAgICAgLy8gaW4tbWVtb3J5IGNhY2hlLgorICAgICAgICBvZmY2NF90IGJveFNpemUgPSA4ICsgbUluTWVtb3J5Q2FjaGVPZmZzZXQgKyBieXRlczsKKyAgICAgICAgaWYgKGJveFNpemUgPiBtSW5NZW1vcnlDYWNoZVNpemUpIHsKKyAgICAgICAgICAgIC8vIFRoZSByZXNlcnZlZCBmcmVlIHNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgaXMgbm90IGJpZworICAgICAgICAgICAgLy8gZW5vdWdoLiBCb3hlcyBzaG91bGQgYmUgd3JpdHRlbiB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGZyb20gbm93CisgICAgICAgICAgICAvLyBvbiwgYnV0IG5vdCB0byB0aGUgaW4tbWVtb3J5IGNhY2hlLgogCi0gICAgICAgICAgICAvLyBXZSB3cml0ZSBwYXJ0aWFsIG1vb3YgYm94IHRoYXQgaXMgaW4gdGhlIG1lbW9yeSB0bwotICAgICAgICAgICAgLy8gdGhlIGZpbGUgZmlyc3QuCisgICAgICAgICAgICAvLyBXZSB3cml0ZSBwYXJ0aWFsIGJveCB0aGF0IGlzIGluIHRoZSBtZW1vcnkgdG8gdGhlIGZpbGUgZmlyc3QuCiAgICAgICAgICAgICBmb3IgKExpc3Q8b2ZmNjRfdD46Oml0ZXJhdG9yIGl0ID0gbUJveGVzLmJlZ2luKCk7CiAgICAgICAgICAgICAgICAgIGl0ICE9IG1Cb3hlcy5lbmQoKTsgKytpdCkgewogICAgICAgICAgICAgICAgICgqaXQpICs9IG1PZmZzZXQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBsc2VlazY0KG1GZCwgbU9mZnNldCwgU0VFS19TRVQpOwotICAgICAgICAgICAgOjp3cml0ZShtRmQsIG1Nb292Qm94QnVmZmVyLCBtTW9vdkJveEJ1ZmZlck9mZnNldCk7CisgICAgICAgICAgICA6OndyaXRlKG1GZCwgbUluTWVtb3J5Q2FjaGUsIG1Jbk1lbW9yeUNhY2hlT2Zmc2V0KTsKICAgICAgICAgICAgIDo6d3JpdGUobUZkLCBwdHIsIGJ5dGVzKTsKLSAgICAgICAgICAgIG1PZmZzZXQgKz0gKGJ5dGVzICsgbU1vb3ZCb3hCdWZmZXJPZmZzZXQpOworICAgICAgICAgICAgbU9mZnNldCArPSAoYnl0ZXMgKyBtSW5NZW1vcnlDYWNoZU9mZnNldCk7CiAKLSAgICAgICAgICAgIC8vIEFsbCBzdWJzZXF1ZW50IG1vb3YgYm94IGNvbnRlbnQgd2lsbCBiZSB3cml0dGVuCi0gICAgICAgICAgICAvLyB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLgotICAgICAgICAgICAgbVdyaXRlTW9vdkJveFRvTWVtb3J5ID0gZmFsc2U7CisgICAgICAgICAgICAvLyBBbGwgc3Vic2VxdWVudCBib3hlcyB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIGVuZCBvZiB0aGUgZmlsZS4KKyAgICAgICAgICAgIG1Xcml0ZUJveFRvTWVtb3J5ID0gZmFsc2U7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtZW1jcHkobU1vb3ZCb3hCdWZmZXIgKyBtTW9vdkJveEJ1ZmZlck9mZnNldCwgcHRyLCBieXRlcyk7Ci0gICAgICAgICAgICBtTW9vdkJveEJ1ZmZlck9mZnNldCArPSBieXRlczsKKyAgICAgICAgICAgIG1lbWNweShtSW5NZW1vcnlDYWNoZSArIG1Jbk1lbW9yeUNhY2hlT2Zmc2V0LCBwdHIsIGJ5dGVzKTsKKyAgICAgICAgICAgIG1Jbk1lbW9yeUNhY2hlT2Zmc2V0ICs9IGJ5dGVzOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgOjp3cml0ZShtRmQsIHB0ciwgc2l6ZSAqIG5tZW1iKTsKQEAgLTEzNTQsOCArMTQ2NSw4IEBACiB9CiAKIHZvaWQgTVBFRzRXcml0ZXI6OmJlZ2luQm94KHVpbnQzMl90IGlkKSB7Ci0gICAgbUJveGVzLnB1c2hfYmFjayhtV3JpdGVNb292Qm94VG9NZW1vcnk/Ci0gICAgICAgICAgICBtTW9vdkJveEJ1ZmZlck9mZnNldDogbU9mZnNldCk7CisgICAgbUJveGVzLnB1c2hfYmFjayhtV3JpdGVCb3hUb01lbW9yeT8KKyAgICAgICAgICAgIG1Jbk1lbW9yeUNhY2hlT2Zmc2V0OiBtT2Zmc2V0KTsKIAogICAgIHdyaXRlSW50MzIoMCk7CiAgICAgd3JpdGVJbnQzMihpZCk7CkBAIC0xMzY0LDggKzE0NzUsOCBAQAogdm9pZCBNUEVHNFdyaXRlcjo6YmVnaW5Cb3goY29uc3QgY2hhciAqZm91cmNjKSB7CiAgICAgQ0hFQ0tfRVEoc3RybGVuKGZvdXJjYyksIDR1KTsKIAotICAgIG1Cb3hlcy5wdXNoX2JhY2sobVdyaXRlTW9vdkJveFRvTWVtb3J5PwotICAgICAgICAgICAgbU1vb3ZCb3hCdWZmZXJPZmZzZXQ6IG1PZmZzZXQpOworICAgIG1Cb3hlcy5wdXNoX2JhY2sobVdyaXRlQm94VG9NZW1vcnk/CisgICAgICAgICAgICBtSW5NZW1vcnlDYWNoZU9mZnNldDogbU9mZnNldCk7CiAKICAgICB3cml0ZUludDMyKDApOwogICAgIHdyaXRlRm91cmNjKGZvdXJjYyk7CkBAIC0xMzc3LDkgKzE0ODgsOSBAQAogICAgIG9mZjY0X3Qgb2Zmc2V0ID0gKi0tbUJveGVzLmVuZCgpOwogICAgIG1Cb3hlcy5lcmFzZSgtLW1Cb3hlcy5lbmQoKSk7CiAKLSAgICBpZiAobVdyaXRlTW9vdkJveFRvTWVtb3J5KSB7Ci0gICAgICAgaW50MzJfdCB4ID0gaHRvbmwobU1vb3ZCb3hCdWZmZXJPZmZzZXQgLSBvZmZzZXQpOwotICAgICAgIG1lbWNweShtTW9vdkJveEJ1ZmZlciArIG9mZnNldCwgJngsIDQpOworICAgIGlmIChtV3JpdGVCb3hUb01lbW9yeSkgeworICAgICAgICBpbnQzMl90IHggPSBodG9ubChtSW5NZW1vcnlDYWNoZU9mZnNldCAtIG9mZnNldCk7CisgICAgICAgIG1lbWNweShtSW5NZW1vcnlDYWNoZSArIG9mZnNldCwgJngsIDQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGxzZWVrNjQobUZkLCBvZmZzZXQsIFNFRUtfU0VUKTsKICAgICAgICAgd3JpdGVJbnQzMihtT2Zmc2V0IC0gb2Zmc2V0KTsKQEAgLTE1MzgsNyArMTY0OSw3IEBACiAgICAgaWYgKG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgPT0gMCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIGludDY0X3QgblRvdGFsQnl0ZXNFc3RpbWF0ZSA9IHN0YXRpY19jYXN0PGludDY0X3Q+KG1Fc3RpbWF0ZWRNb292Qm94U2l6ZSk7CisgICAgaW50NjRfdCBuVG90YWxCeXRlc0VzdGltYXRlID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4obUluTWVtb3J5Q2FjaGVTaXplKTsKICAgICBmb3IgKExpc3Q8VHJhY2sgKj46Oml0ZXJhdG9yIGl0ID0gbVRyYWNrcy5iZWdpbigpOwogICAgICAgICAgaXQgIT0gbVRyYWNrcy5lbmQoKTsgKytpdCkgewogICAgICAgICBuVG90YWxCeXRlc0VzdGltYXRlICs9ICgqaXQpLT5nZXRFc3RpbWF0ZWRUcmFja1NpemVCeXRlcygpOwpAQCAtMTU2MSw3ICsxNjcyLDcgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGludDY0X3QgblRvdGFsQnl0ZXNFc3RpbWF0ZSA9IHN0YXRpY19jYXN0PGludDY0X3Q+KG1Fc3RpbWF0ZWRNb292Qm94U2l6ZSk7CisgICAgaW50NjRfdCBuVG90YWxCeXRlc0VzdGltYXRlID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4obUluTWVtb3J5Q2FjaGVTaXplKTsKICAgICBmb3IgKExpc3Q8VHJhY2sgKj46Oml0ZXJhdG9yIGl0ID0gbVRyYWNrcy5iZWdpbigpOwogICAgICAgICAgaXQgIT0gbVRyYWNrcy5lbmQoKTsgKytpdCkgewogICAgICAgICBuVG90YWxCeXRlc0VzdGltYXRlICs9ICgqaXQpLT5nZXRFc3RpbWF0ZWRUcmFja1NpemVCeXRlcygpOwpAQCAtMTU4Myw3ICsxNjk0LDcgQEAKIAogICAgIGZvciAoTGlzdDxUcmFjayAqPjo6aXRlcmF0b3IgaXQgPSBtVHJhY2tzLmJlZ2luKCk7CiAgICAgICAgICBpdCAhPSBtVHJhY2tzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIGlmICgoKml0KS0+Z2V0RHVyYXRpb25VcygpID49IG1NYXhGaWxlRHVyYXRpb25MaW1pdFVzKSB7CisgICAgICAgIGlmICghKCppdCktPmlzSGVpYygpICYmICgqaXQpLT5nZXREdXJhdGlvblVzKCkgPj0gbU1heEZpbGVEdXJhdGlvbkxpbWl0VXMpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQpAQCAtMTYyNiw3ICsxNzM3LDcgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIE1QRUc0V3JpdGVyOjpUcmFjazo6VHJhY2soCi0gICAgICAgIE1QRUc0V3JpdGVyICpvd25lciwgY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlLCBzaXplX3QgdHJhY2tJZCkKKyAgICAgICAgTVBFRzRXcml0ZXIgKm93bmVyLCBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwgc2l6ZV90IHRyYWNrSWQpCiAgICAgOiBtT3duZXIob3duZXIpLAogICAgICAgbU1ldGEoc291cmNlLT5nZXRGb3JtYXQoKSksCiAgICAgICBtU291cmNlKHNvdXJjZSksCkBAIC0xNjU1LDcgKzE3NjYsMTYgQEAKICAgICAgIG1Hb3RBbGxDb2RlY1NwZWNpZmljRGF0YShmYWxzZSksCiAgICAgICBtUmVhY2hlZEVPUyhmYWxzZSksCiAgICAgICBtU3RhcnRUaW1lc3RhbXBVcygtMSksCi0gICAgICBtUm90YXRpb24oMCkgeworICAgICAgbVJvdGF0aW9uKDApLAorICAgICAgbUlzUHJpbWFyeSgwKSwKKyAgICAgIG1XaWR0aCgwKSwKKyAgICAgIG1IZWlnaHQoMCksCisgICAgICBtVGlsZVdpZHRoKDApLAorICAgICAgbVRpbGVIZWlnaHQoMCksCisgICAgICBtR3JpZFJvd3MoMCksCisgICAgICBtR3JpZENvbHMoMCksCisgICAgICBtTnVtVGlsZXMoMSksCisgICAgICBtVGlsZUluZGV4KDApIHsKICAgICBnZXRDb2RlY1NwZWNpZmljRGF0YUZyb21JbnB1dEZvcm1hdElmUG9zc2libGUoKTsKIAogICAgIGNvbnN0IGNoYXIgKm1pbWU7CkBAIC0xNjY0LDYgKzE3ODQsNyBAQAogICAgIG1Jc0hldmMgPSAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKTsKICAgICBtSXNBdWRpbyA9ICFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNik7CiAgICAgbUlzVmlkZW8gPSAhc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpOworICAgIG1Jc0hlaWMgPSAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpOwogICAgIG1Jc01QRUc0ID0gIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpIHx8CiAgICAgICAgICAgICAgICAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOwogCkBAIC0xNjc1LDcgKzE3OTYsMjcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHNldFRpbWVTY2FsZSgpOworICAgIGlmICghbUlzSGVpYykgeworICAgICAgICBzZXRUaW1lU2NhbGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBDSEVDSyhtTWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJm1XaWR0aCkgJiYgKG1XaWR0aCA+IDApKTsKKyAgICAgICAgQ0hFQ0sobU1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmbUhlaWdodCkgJiYgKG1IZWlnaHQgPiAwKSk7CisKKyAgICAgICAgaW50MzJfdCB0aWxlV2lkdGgsIHRpbGVIZWlnaHQsIGdyaWRSb3dzLCBncmlkQ29sczsKKyAgICAgICAgaWYgKG1NZXRhLT5maW5kSW50MzIoa0tleVRpbGVXaWR0aCwgJnRpbGVXaWR0aCkgJiYgKHRpbGVXaWR0aCA+IDApICYmCisgICAgICAgICAgICBtTWV0YS0+ZmluZEludDMyKGtLZXlUaWxlSGVpZ2h0LCAmdGlsZUhlaWdodCkgJiYgKHRpbGVIZWlnaHQgPiAwKSAmJgorICAgICAgICAgICAgbU1ldGEtPmZpbmRJbnQzMihrS2V5R3JpZFJvd3MsICZncmlkUm93cykgJiYgKGdyaWRSb3dzID4gMCkgJiYKKyAgICAgICAgICAgIG1NZXRhLT5maW5kSW50MzIoa0tleUdyaWRDb2xzLCAmZ3JpZENvbHMpICYmIChncmlkQ29scyA+IDApKSB7CisgICAgICAgICAgICBtVGlsZVdpZHRoID0gdGlsZVdpZHRoOworICAgICAgICAgICAgbVRpbGVIZWlnaHQgPSB0aWxlSGVpZ2h0OworICAgICAgICAgICAgbUdyaWRSb3dzID0gZ3JpZFJvd3M7CisgICAgICAgICAgICBtR3JpZENvbHMgPSBncmlkQ29sczsKKyAgICAgICAgICAgIG1OdW1UaWxlcyA9IGdyaWRSb3dzICogZ3JpZENvbHM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtTWV0YS0+ZmluZEludDMyKGtLZXlUcmFja0lzRGVmYXVsdCwgJm1Jc1ByaW1hcnkpKSB7CisgICAgICAgICAgICBtSXNQcmltYXJ5ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIC8vIENsZWFyIGFsbCB0aGUgaW50ZXJuYWwgc3RhdGVzIGV4Y2VwdCB0aGUgQ1NEIGRhdGEuCkBAIC0xNzIzLDE1ICsxODY0LDE1IEBACiB9CiAKIHZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp1cGRhdGVUcmFja1NpemVFc3RpbWF0ZSgpIHsKLQotICAgIHVpbnQzMl90IHN0Y29Cb3hDb3VudCA9IChtT3duZXItPnVzZTMyQml0RmlsZU9mZnNldCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtU3Rjb1RhYmxlRW50cmllcy0+Y291bnQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbUNvNjRUYWJsZUVudHJpZXMtPmNvdW50KCkpOwotICAgIGludDY0X3Qgc3Rjb0JveFNpemVCeXRlcyA9IHN0Y29Cb3hDb3VudCAqIDQ7Ci0gICAgaW50NjRfdCBzdHN6Qm94U2l6ZUJ5dGVzID0gbVNhbXBsZXNIYXZlU2FtZVNpemU/IDQ6IChtU3RzelRhYmxlRW50cmllcy0+Y291bnQoKSAqIDQpOwotCiAgICAgbUVzdGltYXRlZFRyYWNrU2l6ZUJ5dGVzID0gbU1kYXRTaXplQnl0ZXM7ICAvLyBtZWRpYSBkYXRhIHNpemUKLSAgICBpZiAoIW1Pd25lci0+aXNGaWxlU3RyZWFtYWJsZSgpKSB7CisKKyAgICBpZiAoIWlzSGVpYygpICYmICFtT3duZXItPmlzRmlsZVN0cmVhbWFibGUoKSkgeworICAgICAgICB1aW50MzJfdCBzdGNvQm94Q291bnQgPSAobU93bmVyLT51c2UzMkJpdEZpbGVPZmZzZXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1TdGNvVGFibGVFbnRyaWVzLT5jb3VudCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbUNvNjRUYWJsZUVudHJpZXMtPmNvdW50KCkpOworICAgICAgICBpbnQ2NF90IHN0Y29Cb3hTaXplQnl0ZXMgPSBzdGNvQm94Q291bnQgKiA0OworICAgICAgICBpbnQ2NF90IHN0c3pCb3hTaXplQnl0ZXMgPSBtU2FtcGxlc0hhdmVTYW1lU2l6ZT8gNDogKG1TdHN6VGFibGVFbnRyaWVzLT5jb3VudCgpICogNCk7CisKICAgICAgICAgLy8gUmVzZXJ2ZWQgZnJlZSBzcGFjZSBpcyBub3QgbGFyZ2UgZW5vdWdoIHRvIGhvbGQKICAgICAgICAgLy8gYWxsIG1ldGEgZGF0YSBhbmQgdGh1cyB3YXN0ZWQuCiAgICAgICAgIG1Fc3RpbWF0ZWRUcmFja1NpemVCeXRlcyArPSBtU3RzY1RhYmxlRW50cmllcy0+Y291bnQoKSAqIDEyICsgIC8vIHN0c2MgYm94IHNpemUKQEAgLTE3NDUsMTAgKzE4ODYsOSBAQAogCiB2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6YWRkT25lU3RzY1RhYmxlRW50cnkoCiAgICAgICAgIHNpemVfdCBjaHVua0lkLCBzaXplX3Qgc2FtcGxlSWQpIHsKLQotICAgICAgICBtU3RzY1RhYmxlRW50cmllcy0+YWRkKGh0b25sKGNodW5rSWQpKTsKLSAgICAgICAgbVN0c2NUYWJsZUVudHJpZXMtPmFkZChodG9ubChzYW1wbGVJZCkpOwotICAgICAgICBtU3RzY1RhYmxlRW50cmllcy0+YWRkKGh0b25sKDEpKTsKKyAgICBtU3RzY1RhYmxlRW50cmllcy0+YWRkKGh0b25sKGNodW5rSWQpKTsKKyAgICBtU3RzY1RhYmxlRW50cmllcy0+YWRkKGh0b25sKHNhbXBsZUlkKSk7CisgICAgbVN0c2NUYWJsZUVudHJpZXMtPmFkZChodG9ubCgxKSk7CiB9CiAKIHZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjphZGRPbmVTdHNzVGFibGVFbnRyeShzaXplX3Qgc2FtcGxlSWQpIHsKQEAgLTE3OTQsNiArMTkzNCw3IEBACiB9CiAKIHZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjphZGRDaHVua09mZnNldChvZmY2NF90IG9mZnNldCkgeworICAgIENIRUNLKCFtSXNIZWljKTsKICAgICBpZiAobU93bmVyLT51c2UzMkJpdEZpbGVPZmZzZXQoKSkgewogICAgICAgICB1aW50MzJfdCB2YWx1ZSA9IG9mZnNldDsKICAgICAgICAgbVN0Y29UYWJsZUVudHJpZXMtPmFkZChodG9ubCh2YWx1ZSkpOwpAQCAtMTgwMiw2ICsxOTQzLDk0IEBACiAgICAgfQogfQogCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6YWRkSXRlbU9mZnNldEFuZFNpemUob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgQ0hFQ0sobUlzSGVpYyk7CisKKyAgICBpZiAob2Zmc2V0ID4gVUlOVDMyX01BWCB8fCBzaXplID4gVUlOVDMyX01BWCkgeworICAgICAgICBBTE9HRSgib2Zmc2V0IG9yIHNpemUgaXMgb3V0IG9mIHJhbmdlOiAlbGxkLCAlbGxkIiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBvZmZzZXQsIChsb25nIGxvbmcpIHNpemUpOworICAgICAgICBtSXNNYWxmb3JtZWQgPSB0cnVlOworICAgIH0KKyAgICBpZiAobUlzTWFsZm9ybWVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKG1UaWxlSW5kZXggPj0gbU51bVRpbGVzKSB7CisgICAgICAgIEFMT0dXKCJJZ25vcmluZyBleGNlc3MgdGlsZXMhIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBSb3RhdGlvbiBhbmdsZSBpbiBIRUlGIGlzIENDVywgZnJhbWV3b3JrIGFuZ2xlIGlzIENXLgorICAgIGludDMyX3QgaGVpZlJvdGF0aW9uID0gMDsKKyAgICBzd2l0Y2gobVJvdGF0aW9uKSB7CisgICAgICAgIGNhc2UgOTA6IGhlaWZSb3RhdGlvbiA9IDM7IGJyZWFrOworICAgICAgICBjYXNlIDE4MDogaGVpZlJvdGF0aW9uID0gMjsgYnJlYWs7CisgICAgICAgIGNhc2UgMjcwOiBoZWlmUm90YXRpb24gPSAxOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7IC8vIGRvbid0IHNldCBpZiBpbnZhbGlkCisgICAgfQorCisgICAgYm9vbCBoYXNHcmlkID0gKG1OdW1UaWxlcyA+IDEpOworCisgICAgaWYgKG1Qcm9wZXJ0aWVzLmVtcHR5KCkpIHsKKyAgICAgICAgbVByb3BlcnRpZXMucHVzaF9iYWNrKG1Pd25lci0+YWRkUHJvcGVydHlfbCh7CisgICAgICAgICAgICAudHlwZSA9IEZPVVJDQygnaCcsICd2JywgJ2MnLCAnQycpLAorICAgICAgICAgICAgLmh2Y2MgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkobUNvZGVjU3BlY2lmaWNEYXRhLCBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKQorICAgICAgICB9KSk7CisKKyAgICAgICAgbVByb3BlcnRpZXMucHVzaF9iYWNrKG1Pd25lci0+YWRkUHJvcGVydHlfbCh7CisgICAgICAgICAgICAudHlwZSA9IEZPVVJDQygnaScsICdzJywgJ3AnLCAnZScpLAorICAgICAgICAgICAgLndpZHRoID0gaGFzR3JpZCA/IG1UaWxlV2lkdGggOiBtV2lkdGgsCisgICAgICAgICAgICAuaGVpZ2h0ID0gaGFzR3JpZCA/IG1UaWxlSGVpZ2h0IDogbUhlaWdodCwKKyAgICAgICAgfSkpOworCisgICAgICAgIGlmICghaGFzR3JpZCAmJiBoZWlmUm90YXRpb24gPiAwKSB7CisgICAgICAgICAgICBtUHJvcGVydGllcy5wdXNoX2JhY2sobU93bmVyLT5hZGRQcm9wZXJ0eV9sKHsKKyAgICAgICAgICAgICAgICAudHlwZSA9IEZPVVJDQygnaScsICdyJywgJ28nLCAndCcpLAorICAgICAgICAgICAgICAgIC5yb3RhdGlvbiA9IGhlaWZSb3RhdGlvbiwKKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHVpbnQxNl90IGl0ZW1JZCA9IG1Pd25lci0+YWRkSXRlbV9sKHsKKyAgICAgICAgLml0ZW1UeXBlID0gImh2YzEiLAorICAgICAgICAuaXNQcmltYXJ5ID0gaGFzR3JpZCA/IGZhbHNlIDogKG1Jc1ByaW1hcnkgIT0gMCksCisgICAgICAgIC5pc0hpZGRlbiA9IGhhc0dyaWQsCisgICAgICAgIC5vZmZzZXQgPSAodWludDMyX3Qpb2Zmc2V0LAorICAgICAgICAuc2l6ZSA9ICh1aW50MzJfdClzaXplLAorICAgICAgICAucHJvcGVydGllcyA9IG1Qcm9wZXJ0aWVzLAorICAgIH0pOworCisgICAgbVRpbGVJbmRleCsrOworICAgIGlmIChoYXNHcmlkKSB7CisgICAgICAgIG1EaW1nUmVmcy5wdXNoX2JhY2soaXRlbUlkKTsKKworICAgICAgICBpZiAobVRpbGVJbmRleCA9PSBtTnVtVGlsZXMpIHsKKyAgICAgICAgICAgIG1Qcm9wZXJ0aWVzLmNsZWFyKCk7CisgICAgICAgICAgICBtUHJvcGVydGllcy5wdXNoX2JhY2sobU93bmVyLT5hZGRQcm9wZXJ0eV9sKHsKKyAgICAgICAgICAgICAgICAudHlwZSA9IEZPVVJDQygnaScsICdzJywgJ3AnLCAnZScpLAorICAgICAgICAgICAgICAgIC53aWR0aCA9IG1XaWR0aCwKKyAgICAgICAgICAgICAgICAuaGVpZ2h0ID0gbUhlaWdodCwKKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgIGlmIChoZWlmUm90YXRpb24gPiAwKSB7CisgICAgICAgICAgICAgICAgbVByb3BlcnRpZXMucHVzaF9iYWNrKG1Pd25lci0+YWRkUHJvcGVydHlfbCh7CisgICAgICAgICAgICAgICAgICAgIC50eXBlID0gRk9VUkNDKCdpJywgJ3InLCAnbycsICd0JyksCisgICAgICAgICAgICAgICAgICAgIC5yb3RhdGlvbiA9IGhlaWZSb3RhdGlvbiwKKyAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtT3duZXItPmFkZEl0ZW1fbCh7CisgICAgICAgICAgICAgICAgLml0ZW1UeXBlID0gImdyaWQiLAorICAgICAgICAgICAgICAgIC5pc1ByaW1hcnkgPSAobUlzUHJpbWFyeSAhPSAwKSwKKyAgICAgICAgICAgICAgICAuaXNIaWRkZW4gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAucm93cyA9ICh1aW50MzJfdCltR3JpZFJvd3MsCisgICAgICAgICAgICAgICAgLmNvbHMgPSAodWludDMyX3QpbUdyaWRDb2xzLAorICAgICAgICAgICAgICAgIC53aWR0aCA9ICh1aW50MzJfdCltV2lkdGgsCisgICAgICAgICAgICAgICAgLmhlaWdodCA9ICh1aW50MzJfdCltSGVpZ2h0LAorICAgICAgICAgICAgICAgIC5wcm9wZXJ0aWVzID0gbVByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgLmRpbWdSZWZzID0gbURpbWdSZWZzLAorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIHZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjpzZXRUaW1lU2NhbGUoKSB7CiAgICAgQUxPR1YoInNldFRpbWVTY2FsZSIpOwogICAgIC8vIERlZmF1bHQgdGltZSBzY2FsZQpAQCAtMTg1NCw3ICsyMDgzLDggQEAKICAgICBzaXplX3Qgc2l6ZSA9IDA7CiAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykpIHsKICAgICAgICAgbU1ldGEtPmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKTsKLSAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpKSB7CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSB8fAorICAgICAgICAgICAgICAgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDKSkgewogICAgICAgICBtTWV0YS0+ZmluZERhdGEoa0tleUhWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpOwogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpCiAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKSB7CkBAIC0xOTQ0LDE0ICsyMTc0LDE2IEBACiAgICAgICAgIGNodW5rLT5tVGltZVN0YW1wVXMsIGNodW5rLT5tVHJhY2stPmdldFRyYWNrVHlwZSgpKTsKIAogICAgIGludDMyX3QgaXNGaXJzdFNhbXBsZSA9IHRydWU7CisgICAgYm9vbCB1c2VQcmVmaXggPSBjaHVuay0+bVRyYWNrLT51c2VQcmVmaXgoKTsKICAgICB3aGlsZSAoIWNodW5rLT5tU2FtcGxlcy5lbXB0eSgpKSB7CiAgICAgICAgIExpc3Q8TWVkaWFCdWZmZXIgKj46Oml0ZXJhdG9yIGl0ID0gY2h1bmstPm1TYW1wbGVzLmJlZ2luKCk7CiAKLSAgICAgICAgb2ZmNjRfdCBvZmZzZXQgPSAoY2h1bmstPm1UcmFjay0+aXNBdmMoKSB8fCBjaHVuay0+bVRyYWNrLT5pc0hldmMoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhZGRNdWx0aXBsZUxlbmd0aFByZWZpeGVkU2FtcGxlc19sKCppdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhZGRTYW1wbGVfbCgqaXQpOworICAgICAgICBzaXplX3QgYnl0ZXNXcml0dGVuOworICAgICAgICBvZmY2NF90IG9mZnNldCA9IGFkZFNhbXBsZV9sKCppdCwgdXNlUHJlZml4LCAmYnl0ZXNXcml0dGVuKTsKIAotICAgICAgICBpZiAoaXNGaXJzdFNhbXBsZSkgeworICAgICAgICBpZiAoY2h1bmstPm1UcmFjay0+aXNIZWljKCkpIHsKKyAgICAgICAgICAgIGNodW5rLT5tVHJhY2stPmFkZEl0ZW1PZmZzZXRBbmRTaXplKG9mZnNldCwgYnl0ZXNXcml0dGVuKTsKKyAgICAgICAgfSBlbHNlIGlmIChpc0ZpcnN0U2FtcGxlKSB7CiAgICAgICAgICAgICBjaHVuay0+bVRyYWNrLT5hZGRDaHVua09mZnNldChvZmZzZXQpOwogICAgICAgICAgICAgaXNGaXJzdFNhbXBsZSA9IGZhbHNlOwogICAgICAgICB9CkBAIC0yMDk0LDcgKzIzMjYsOCBAQAogICAgIG1TdGFydFRpbWVSZWFsVXMgPSBzdGFydFRpbWVVczsKIAogICAgIGludDMyX3Qgcm90YXRpb25EZWdyZWVzOwotICAgIGlmIChtSXNWaWRlbyAmJiBwYXJhbXMgJiYgcGFyYW1zLT5maW5kSW50MzIoa0tleVJvdGF0aW9uLCAmcm90YXRpb25EZWdyZWVzKSkgeworICAgIGlmICgobUlzVmlkZW8gfHwgbUlzSGVpYykgJiYgcGFyYW1zICYmCisgICAgICAgICAgICBwYXJhbXMtPmZpbmRJbnQzMihrS2V5Um90YXRpb24sICZyb3RhdGlvbkRlZ3JlZXMpKSB7CiAgICAgICAgIG1Sb3RhdGlvbiA9IHJvdGF0aW9uRGVncmVlczsKICAgICB9CiAKQEAgLTI1OTgsNyArMjgzMSw3IEBACiAgICAgc3A8TWV0YURhdGE+IG1ldGFfZGF0YTsKIAogICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgIE1lZGlhQnVmZmVyICpidWZmZXI7CisgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7CiAgICAgY29uc3QgY2hhciAqdHJhY2tOYW1lID0gZ2V0VHJhY2tUeXBlKCk7CiAgICAgd2hpbGUgKCFtRG9uZSAmJiAoZXJyID0gbVNvdXJjZS0+cmVhZCgmYnVmZmVyKSkgPT0gT0spIHsKICAgICAgICAgaWYgKGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPT0gMCkgewpAQCAtMjYyMCw3ICsyODUzLDcgQEAKICAgICAgICAgKytjb3VudDsKIAogICAgICAgICBpbnQzMl90IGlzQ29kZWNDb25maWc7Ci0gICAgICAgIGlmIChidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoa0tleUlzQ29kZWNDb25maWcsICZpc0NvZGVjQ29uZmlnKQorICAgICAgICBpZiAoYnVmZmVyLT5tZXRhX2RhdGEoKS5maW5kSW50MzIoa0tleUlzQ29kZWNDb25maWcsICZpc0NvZGVjQ29uZmlnKQogICAgICAgICAgICAgICAgICYmIGlzQ29kZWNDb25maWcpIHsKICAgICAgICAgICAgIC8vIGlmIGNvbmZpZyBmb3JtYXQgKGF0IHRyYWNrIGFkZGl0aW9uKSBhbHJlYWR5IGhhZCBDU0QsIGtlZXAgdGhhdAogICAgICAgICAgICAgLy8gVU5MRVNTIHdlIGhhdmUgbm90IHJlY2VpdmVkIGFueSBmcmFtZXMgeWV0LgpAQCAtMjYzNiw3ICsyODY5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Jc0hldmMpIHsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Jc0hldmMgfHwgbUlzSGVpYykgewogICAgICAgICAgICAgICAgICAgICBlcnIgPSBtYWtlSEVWQ0NvZGVjU3BlY2lmaWNEYXRhKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLApAQCAtMjY2MSw3ICsyODk0LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIFBlci1mcmFtZSBtZXRhZGF0YSBzYW1wbGUncyBzaXplIG11c3QgYmUgc21hbGxlciB0aGFuIG1heCBhbGxvd2VkLgotICAgICAgICBpZiAoIW1Jc1ZpZGVvICYmICFtSXNBdWRpbyAmJiBidWZmZXItPnJhbmdlX2xlbmd0aCgpID49IGtNYXhNZXRhZGF0YVNpemUpIHsKKyAgICAgICAgaWYgKCFtSXNWaWRlbyAmJiAhbUlzQXVkaW8gJiYgIW1Jc0hlaWMgJiYKKyAgICAgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpID49IGtNYXhNZXRhZGF0YVNpemUpIHsKICAgICAgICAgICAgIEFMT0dXKCJCdWZmZXIgc2l6ZSBpcyAlenUuIE1heGltdW0gbWV0YWRhdGEgYnVmZmVyIHNpemUgaXMgJWxsZCBmb3IgJXMgdHJhY2siLAogICAgICAgICAgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpLCAobG9uZyBsb25nKWtNYXhNZXRhZGF0YVNpemUsIHRyYWNrTmFtZSk7CiAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKQEAgLTI2NzgsMTQgKzI5MTIsMTQgQEAKICAgICAgICAgbWVtY3B5KGNvcHktPmRhdGEoKSwgKHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCiAgICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CiAgICAgICAgIGNvcHktPnNldF9yYW5nZSgwLCBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLSAgICAgICAgbWV0YV9kYXRhID0gbmV3IE1ldGFEYXRhKCpidWZmZXItPm1ldGFfZGF0YSgpLmdldCgpKTsKKyAgICAgICAgbWV0YV9kYXRhID0gbmV3IE1ldGFEYXRhKGJ1ZmZlci0+bWV0YV9kYXRhKCkpOwogICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgYnVmZmVyID0gTlVMTDsKIAotICAgICAgICBpZiAobUlzQXZjIHx8IG1Jc0hldmMpIFN0cmlwU3RhcnRjb2RlKGNvcHkpOworICAgICAgICBpZiAodXNlUHJlZml4KCkpIFN0cmlwU3RhcnRjb2RlKGNvcHkpOwogCiAgICAgICAgIHNpemVfdCBzYW1wbGVTaXplID0gY29weS0+cmFuZ2VfbGVuZ3RoKCk7Ci0gICAgICAgIGlmIChtSXNBdmMgfHwgbUlzSGV2YykgeworICAgICAgICBpZiAodXNlUHJlZml4KCkpIHsKICAgICAgICAgICAgIGlmIChtT3duZXItPnVzZU5hbExlbmd0aEZvdXIoKSkgewogICAgICAgICAgICAgICAgIHNhbXBsZVNpemUgKz0gNDsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0yNzM5LDIyMyArMjk3MywyMzAgQEAKICAgICAgICAgICAgIG1Hb3RTdGFydEtleUZyYW1lID0gdHJ1ZTsKICAgICAgICAgfQogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAgICAgaWYgKG1TdHN6VGFibGVFbnRyaWVzLT5jb3VudCgpID09IDApIHsKLSAgICAgICAgICAgIG1GaXJzdFNhbXBsZVRpbWVSZWFsVXMgPSBzeXN0ZW1UaW1lKCkgLyAxMDAwOwotICAgICAgICAgICAgbVN0YXJ0VGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKLSAgICAgICAgICAgIG1Pd25lci0+c2V0U3RhcnRUaW1lc3RhbXBVcyhtU3RhcnRUaW1lc3RhbXBVcyk7Ci0gICAgICAgICAgICBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMgPSBtU3RhcnRUaW1lc3RhbXBVczsKLSAgICAgICAgfQogCi0gICAgICAgIGlmIChtUmVzdW1lZCkgewotICAgICAgICAgICAgaW50NjRfdCBkdXJFeGNsdWRpbmdFYXJsaWVyUGF1c2VzVXMgPSB0aW1lc3RhbXBVcyAtIHByZXZpb3VzUGF1c2VkRHVyYXRpb25VczsKLSAgICAgICAgICAgIGlmIChXQVJOX1VOTEVTUyhkdXJFeGNsdWRpbmdFYXJsaWVyUGF1c2VzVXMgPj0gMGxsLCAiZm9yICVzIHRyYWNrIiwgdHJhY2tOYW1lKSkgewotICAgICAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgbUlzTWFsZm9ybWVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50NjRfdCBwYXVzZWREdXJhdGlvblVzID0gZHVyRXhjbHVkaW5nRWFybGllclBhdXNlc1VzIC0gbVRyYWNrRHVyYXRpb25VczsKLSAgICAgICAgICAgIGlmIChXQVJOX1VOTEVTUyhwYXVzZWREdXJhdGlvblVzID49IGxhc3REdXJhdGlvblVzLCAiZm9yICVzIHRyYWNrIiwgdHJhY2tOYW1lKSkgewotICAgICAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgbUlzTWFsZm9ybWVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzICs9IHBhdXNlZER1cmF0aW9uVXMgLSBsYXN0RHVyYXRpb25VczsKLSAgICAgICAgICAgIG1SZXN1bWVkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgVGltZXN0YW1wRGVidWdIZWxwZXJFbnRyeSB0aW1lc3RhbXBEZWJ1Z0VudHJ5OwotICAgICAgICB0aW1lc3RhbXBVcyAtPSBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXM7Ci0gICAgICAgIHRpbWVzdGFtcERlYnVnRW50cnkucHRzID0gdGltZXN0YW1wVXM7Ci0gICAgICAgIGlmIChXQVJOX1VOTEVTUyh0aW1lc3RhbXBVcyA+PSAwbGwsICJmb3IgJXMgdHJhY2siLCB0cmFja05hbWUpKSB7Ci0gICAgICAgICAgICBjb3B5LT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7Ci0gICAgICAgICAgICBtSXNNYWxmb3JtZWQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUlzVmlkZW8pIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBDb21wb3NpdGlvbiB0aW1lOiB0aW1lc3RhbXBVcwotICAgICAgICAgICAgICogRGVjb2RpbmcgdGltZTogZGVjb2RpbmdUaW1lVXMKLSAgICAgICAgICAgICAqIENvbXBvc2l0aW9uIHRpbWUgb2Zmc2V0ID0gY29tcG9zaXRpb24gdGltZSAtIGRlY29kaW5nIHRpbWUKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaW50NjRfdCBkZWNvZGluZ1RpbWVVczsKLSAgICAgICAgICAgIENIRUNLKG1ldGFfZGF0YS0+ZmluZEludDY0KGtLZXlEZWNvZGluZ1RpbWUsICZkZWNvZGluZ1RpbWVVcykpOwotICAgICAgICAgICAgZGVjb2RpbmdUaW1lVXMgLT0gcHJldmlvdXNQYXVzZWREdXJhdGlvblVzOwotCi0gICAgICAgICAgICAvLyBlbnN1cmUgbm9uLW5lZ2F0aXZlLCBtb25vdG9uaWMgZGVjb2RpbmcgdGltZQotICAgICAgICAgICAgaWYgKG1MYXN0RGVjb2RpbmdUaW1lVXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgZGVjb2RpbmdUaW1lVXMgPSBzdGQ6Om1heCgoaW50NjRfdCkwLCBkZWNvZGluZ1RpbWVVcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGluY3JlYXNlIGRlY29kaW5nIHRpbWUgYnkgYXQgbGVhc3QgdGhlIGxhcmdlciB2YXVsZSBvZiAxIHRpY2sgYW5kCi0gICAgICAgICAgICAgICAgLy8gMC4xIG1pbGxpc2Vjb25kcy4gVGhpcyBuZWVkcyB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgcG9zc2libGUKLSAgICAgICAgICAgICAgICAvLyBkZWx0YSBhZGp1c3RtZW50IGluIER1cmF0aW9uVGlja3MgaW4gYmVsb3cuCi0gICAgICAgICAgICAgICAgZGVjb2RpbmdUaW1lVXMgPSBzdGQ6Om1heChtTGFzdERlY29kaW5nVGltZVVzICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWF4KDEwMCwgZGl2VXAoMTAwMDAwMCwgbVRpbWVTY2FsZSkpLCBkZWNvZGluZ1RpbWVVcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1MYXN0RGVjb2RpbmdUaW1lVXMgPSBkZWNvZGluZ1RpbWVVczsKLSAgICAgICAgICAgIHRpbWVzdGFtcERlYnVnRW50cnkuZHRzID0gZGVjb2RpbmdUaW1lVXM7Ci0gICAgICAgICAgICB0aW1lc3RhbXBEZWJ1Z0VudHJ5LmZyYW1lVHlwZSA9IGlzU3luYyA/ICJLZXkgZnJhbWUiIDogIk5vbi1LZXkgZnJhbWUiOwotICAgICAgICAgICAgLy8gSW5zZXJ0IHRoZSB0aW1lc3RhbXAgaW50byB0aGUgbVRpbWVzdGFtcERlYnVnSGVscGVyCi0gICAgICAgICAgICBpZiAobVRpbWVzdGFtcERlYnVnSGVscGVyLnNpemUoKSA+PSBrVGltZXN0YW1wRGVidWdDb3VudCkgewotICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBEZWJ1Z0hlbHBlci5wb3BfZnJvbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1UaW1lc3RhbXBEZWJ1Z0hlbHBlci5wdXNoX2JhY2sodGltZXN0YW1wRGVidWdFbnRyeSk7Ci0KLSAgICAgICAgICAgIGN0dHNPZmZzZXRUaW1lVXMgPQotICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcyArIGtNYXhDdHRzT2Zmc2V0VGltZVVzIC0gZGVjb2RpbmdUaW1lVXM7Ci0gICAgICAgICAgICBpZiAoV0FSTl9VTkxFU1MoY3R0c09mZnNldFRpbWVVcyA+PSAwbGwsICJmb3IgJXMgdHJhY2siLCB0cmFja05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKLSAgICAgICAgICAgICAgICBtSXNNYWxmb3JtZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aW1lc3RhbXBVcyA9IGRlY29kaW5nVGltZVVzOwotICAgICAgICAgICAgQUxPR1YoImRlY29kaW5nIHRpbWU6ICUiIFBSSWQ2NCAiIGFuZCBjdHRzIG9mZnNldCB0aW1lOiAlIiBQUklkNjQsCi0gICAgICAgICAgICAgICAgdGltZXN0YW1wVXMsIGN0dHNPZmZzZXRUaW1lVXMpOwotCi0gICAgICAgICAgICAvLyBVcGRhdGUgY3R0cyBib3ggdGFibGUgaWYgbmVjZXNzYXJ5Ci0gICAgICAgICAgICBjdXJyQ3R0c09mZnNldFRpbWVUaWNrcyA9Ci0gICAgICAgICAgICAgICAgICAgIChjdHRzT2Zmc2V0VGltZVVzICogbVRpbWVTY2FsZSArIDUwMDAwMExMKSAvIDEwMDAwMDBMTDsKLSAgICAgICAgICAgIGlmIChXQVJOX1VOTEVTUyhjdXJyQ3R0c09mZnNldFRpbWVUaWNrcyA8PSAweDBGRkZGRkZGRkxMLCAiZm9yICVzIHRyYWNrIiwgdHJhY2tOYW1lKSkgewotICAgICAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgbUlzTWFsZm9ybWVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQorICAgICAgICBpZiAoIW1Jc0hlaWMpIHsKICAgICAgICAgICAgIGlmIChtU3RzelRhYmxlRW50cmllcy0+Y291bnQoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gRm9yY2UgdGhlIGZpcnN0IGN0dHMgdGFibGUgZW50cnkgdG8gaGF2ZSBvbmUgc2luZ2xlIGVudHJ5Ci0gICAgICAgICAgICAgICAgLy8gc28gdGhhdCB3ZSBjYW4gZG8gYWRqdXN0bWVudCBmb3IgdGhlIGluaXRpYWwgdHJhY2sgc3RhcnQKLSAgICAgICAgICAgICAgICAvLyB0aW1lIG9mZnNldCBlYXNpbHkgaW4gd3JpdGVDdHRzQm94KCkuCi0gICAgICAgICAgICAgICAgbGFzdEN0dHNPZmZzZXRUaW1lVGlja3MgPSBjdXJyQ3R0c09mZnNldFRpbWVUaWNrczsKLSAgICAgICAgICAgICAgICBhZGRPbmVDdHRzVGFibGVFbnRyeSgxLCBjdXJyQ3R0c09mZnNldFRpbWVUaWNrcyk7Ci0gICAgICAgICAgICAgICAgY3R0c1NhbXBsZUNvdW50ID0gMDsgICAgICAvLyBObyBzYW1wbGUgaW4gY3R0cyBib3ggaXMgcGVuZGluZwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoY3VyckN0dHNPZmZzZXRUaW1lVGlja3MgIT0gbGFzdEN0dHNPZmZzZXRUaW1lVGlja3MpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkT25lQ3R0c1RhYmxlRW50cnkoY3R0c1NhbXBsZUNvdW50LCBsYXN0Q3R0c09mZnNldFRpbWVUaWNrcyk7Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RDdHRzT2Zmc2V0VGltZVRpY2tzID0gY3VyckN0dHNPZmZzZXRUaW1lVGlja3M7Ci0gICAgICAgICAgICAgICAgICAgIGN0dHNTYW1wbGVDb3VudCA9IDE7ICAvLyBPbmUgc2FtcGxlIGluIGN0dHMgYm94IGlzIHBlbmRpbmcKKyAgICAgICAgICAgICAgICBtRmlyc3RTYW1wbGVUaW1lUmVhbFVzID0gc3lzdGVtVGltZSgpIC8gMTAwMDsKKyAgICAgICAgICAgICAgICBtU3RhcnRUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgICAgICAgICAgICAgIG1Pd25lci0+c2V0U3RhcnRUaW1lc3RhbXBVcyhtU3RhcnRUaW1lc3RhbXBVcyk7CisgICAgICAgICAgICAgICAgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzID0gbVN0YXJ0VGltZXN0YW1wVXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtUmVzdW1lZCkgeworICAgICAgICAgICAgICAgIGludDY0X3QgZHVyRXhjbHVkaW5nRWFybGllclBhdXNlc1VzID0gdGltZXN0YW1wVXMgLSBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXM7CisgICAgICAgICAgICAgICAgaWYgKFdBUk5fVU5MRVNTKGR1ckV4Y2x1ZGluZ0VhcmxpZXJQYXVzZXNVcyA+PSAwbGwsICJmb3IgJXMgdHJhY2siLCB0cmFja05hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbVNvdXJjZS0+c3RvcCgpOworICAgICAgICAgICAgICAgICAgICBtSXNNYWxmb3JtZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHBhdXNlZER1cmF0aW9uVXMgPSBkdXJFeGNsdWRpbmdFYXJsaWVyUGF1c2VzVXMgLSBtVHJhY2tEdXJhdGlvblVzOworICAgICAgICAgICAgICAgIGlmIChXQVJOX1VOTEVTUyhwYXVzZWREdXJhdGlvblVzID49IGxhc3REdXJhdGlvblVzLCAiZm9yICVzIHRyYWNrIiwgdHJhY2tOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBjb3B5LT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgbUlzTWFsZm9ybWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzICs9IHBhdXNlZER1cmF0aW9uVXMgLSBsYXN0RHVyYXRpb25VczsKKyAgICAgICAgICAgICAgICBtUmVzdW1lZCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVGltZXN0YW1wRGVidWdIZWxwZXJFbnRyeSB0aW1lc3RhbXBEZWJ1Z0VudHJ5OworICAgICAgICAgICAgdGltZXN0YW1wVXMgLT0gcHJldmlvdXNQYXVzZWREdXJhdGlvblVzOworICAgICAgICAgICAgdGltZXN0YW1wRGVidWdFbnRyeS5wdHMgPSB0aW1lc3RhbXBVczsKKyAgICAgICAgICAgIGlmIChXQVJOX1VOTEVTUyh0aW1lc3RhbXBVcyA+PSAwbGwsICJmb3IgJXMgdHJhY2siLCB0cmFja05hbWUpKSB7CisgICAgICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgICAgICAgICBtSXNNYWxmb3JtZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUlzVmlkZW8pIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIENvbXBvc2l0aW9uIHRpbWU6IHRpbWVzdGFtcFVzCisgICAgICAgICAgICAgICAgICogRGVjb2RpbmcgdGltZTogZGVjb2RpbmdUaW1lVXMKKyAgICAgICAgICAgICAgICAgKiBDb21wb3NpdGlvbiB0aW1lIG9mZnNldCA9IGNvbXBvc2l0aW9uIHRpbWUgLSBkZWNvZGluZyB0aW1lCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaW50NjRfdCBkZWNvZGluZ1RpbWVVczsKKyAgICAgICAgICAgICAgICBDSEVDSyhtZXRhX2RhdGEtPmZpbmRJbnQ2NChrS2V5RGVjb2RpbmdUaW1lLCAmZGVjb2RpbmdUaW1lVXMpKTsKKyAgICAgICAgICAgICAgICBkZWNvZGluZ1RpbWVVcyAtPSBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXM7CisKKyAgICAgICAgICAgICAgICAvLyBlbnN1cmUgbm9uLW5lZ2F0aXZlLCBtb25vdG9uaWMgZGVjb2RpbmcgdGltZQorICAgICAgICAgICAgICAgIGlmIChtTGFzdERlY29kaW5nVGltZVVzIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBkZWNvZGluZ1RpbWVVcyA9IHN0ZDo6bWF4KChpbnQ2NF90KTAsIGRlY29kaW5nVGltZVVzKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICArK2N0dHNTYW1wbGVDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVhc2UgZGVjb2RpbmcgdGltZSBieSBhdCBsZWFzdCB0aGUgbGFyZ2VyIHZhdWxlIG9mIDEgdGljayBhbmQKKyAgICAgICAgICAgICAgICAgICAgLy8gMC4xIG1pbGxpc2Vjb25kcy4gVGhpcyBuZWVkcyB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgcG9zc2libGUKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVsdGEgYWRqdXN0bWVudCBpbiBEdXJhdGlvblRpY2tzIGluIGJlbG93LgorICAgICAgICAgICAgICAgICAgICBkZWNvZGluZ1RpbWVVcyA9IHN0ZDo6bWF4KG1MYXN0RGVjb2RpbmdUaW1lVXMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWF4KDEwMCwgZGl2VXAoMTAwMDAwMCwgbVRpbWVTY2FsZSkpLCBkZWNvZGluZ1RpbWVVcyk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBVcGRhdGUgY3R0cyB0aW1lIG9mZnNldCByYW5nZQotICAgICAgICAgICAgaWYgKG1TdHN6VGFibGVFbnRyaWVzLT5jb3VudCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBtTWluQ3R0c09mZnNldFRpY2tzID0gY3VyckN0dHNPZmZzZXRUaW1lVGlja3M7Ci0gICAgICAgICAgICAgICAgbU1heEN0dHNPZmZzZXRUaWNrcyA9IGN1cnJDdHRzT2Zmc2V0VGltZVRpY2tzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoY3VyckN0dHNPZmZzZXRUaW1lVGlja3MgPiBtTWF4Q3R0c09mZnNldFRpY2tzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NYXhDdHRzT2Zmc2V0VGlja3MgPSBjdXJyQ3R0c09mZnNldFRpbWVUaWNrczsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJDdHRzT2Zmc2V0VGltZVRpY2tzIDwgbU1pbkN0dHNPZmZzZXRUaWNrcykgeworICAgICAgICAgICAgICAgIG1MYXN0RGVjb2RpbmdUaW1lVXMgPSBkZWNvZGluZ1RpbWVVczsKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBEZWJ1Z0VudHJ5LmR0cyA9IGRlY29kaW5nVGltZVVzOworICAgICAgICAgICAgICAgIHRpbWVzdGFtcERlYnVnRW50cnkuZnJhbWVUeXBlID0gaXNTeW5jID8gIktleSBmcmFtZSIgOiAiTm9uLUtleSBmcmFtZSI7CisgICAgICAgICAgICAgICAgLy8gSW5zZXJ0IHRoZSB0aW1lc3RhbXAgaW50byB0aGUgbVRpbWVzdGFtcERlYnVnSGVscGVyCisgICAgICAgICAgICAgICAgaWYgKG1UaW1lc3RhbXBEZWJ1Z0hlbHBlci5zaXplKCkgPj0ga1RpbWVzdGFtcERlYnVnQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcERlYnVnSGVscGVyLnBvcF9mcm9udCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wRGVidWdIZWxwZXIucHVzaF9iYWNrKHRpbWVzdGFtcERlYnVnRW50cnkpOworCisgICAgICAgICAgICAgICAgY3R0c09mZnNldFRpbWVVcyA9CisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcyArIGtNYXhDdHRzT2Zmc2V0VGltZVVzIC0gZGVjb2RpbmdUaW1lVXM7CisgICAgICAgICAgICAgICAgaWYgKFdBUk5fVU5MRVNTKGN0dHNPZmZzZXRUaW1lVXMgPj0gMGxsLCAiZm9yICVzIHRyYWNrIiwgdHJhY2tOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBjb3B5LT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgbUlzTWFsZm9ybWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGltZXN0YW1wVXMgPSBkZWNvZGluZ1RpbWVVczsKKyAgICAgICAgICAgICAgICBBTE9HVigiZGVjb2RpbmcgdGltZTogJSIgUFJJZDY0ICIgYW5kIGN0dHMgb2Zmc2V0IHRpbWU6ICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wVXMsIGN0dHNPZmZzZXRUaW1lVXMpOworCisgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGN0dHMgYm94IHRhYmxlIGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgIGN1cnJDdHRzT2Zmc2V0VGltZVRpY2tzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChjdHRzT2Zmc2V0VGltZVVzICogbVRpbWVTY2FsZSArIDUwMDAwMExMKSAvIDEwMDAwMDBMTDsKKyAgICAgICAgICAgICAgICBpZiAoV0FSTl9VTkxFU1MoY3VyckN0dHNPZmZzZXRUaW1lVGlja3MgPD0gMHgwRkZGRkZGRkZMTCwgImZvciAlcyB0cmFjayIsIHRyYWNrTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7CisgICAgICAgICAgICAgICAgICAgIG1Jc01hbGZvcm1lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtU3RzelRhYmxlRW50cmllcy0+Y291bnQoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZvcmNlIHRoZSBmaXJzdCBjdHRzIHRhYmxlIGVudHJ5IHRvIGhhdmUgb25lIHNpbmdsZSBlbnRyeQorICAgICAgICAgICAgICAgICAgICAvLyBzbyB0aGF0IHdlIGNhbiBkbyBhZGp1c3RtZW50IGZvciB0aGUgaW5pdGlhbCB0cmFjayBzdGFydAorICAgICAgICAgICAgICAgICAgICAvLyB0aW1lIG9mZnNldCBlYXNpbHkgaW4gd3JpdGVDdHRzQm94KCkuCisgICAgICAgICAgICAgICAgICAgIGxhc3RDdHRzT2Zmc2V0VGltZVRpY2tzID0gY3VyckN0dHNPZmZzZXRUaW1lVGlja3M7CisgICAgICAgICAgICAgICAgICAgIGFkZE9uZUN0dHNUYWJsZUVudHJ5KDEsIGN1cnJDdHRzT2Zmc2V0VGltZVRpY2tzKTsKKyAgICAgICAgICAgICAgICAgICAgY3R0c1NhbXBsZUNvdW50ID0gMDsgICAgICAvLyBObyBzYW1wbGUgaW4gY3R0cyBib3ggaXMgcGVuZGluZworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyQ3R0c09mZnNldFRpbWVUaWNrcyAhPSBsYXN0Q3R0c09mZnNldFRpbWVUaWNrcykgeworICAgICAgICAgICAgICAgICAgICAgICAgYWRkT25lQ3R0c1RhYmxlRW50cnkoY3R0c1NhbXBsZUNvdW50LCBsYXN0Q3R0c09mZnNldFRpbWVUaWNrcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0Q3R0c09mZnNldFRpbWVUaWNrcyA9IGN1cnJDdHRzT2Zmc2V0VGltZVRpY2tzOworICAgICAgICAgICAgICAgICAgICAgICAgY3R0c1NhbXBsZUNvdW50ID0gMTsgIC8vIE9uZSBzYW1wbGUgaW4gY3R0cyBib3ggaXMgcGVuZGluZworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgKytjdHRzU2FtcGxlQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBVcGRhdGUgY3R0cyB0aW1lIG9mZnNldCByYW5nZQorICAgICAgICAgICAgICAgIGlmIChtU3RzelRhYmxlRW50cmllcy0+Y291bnQoKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIG1NaW5DdHRzT2Zmc2V0VGlja3MgPSBjdXJyQ3R0c09mZnNldFRpbWVUaWNrczsKLSAgICAgICAgICAgICAgICAgICAgbU1pbkN0dHNPZmZzZXRUaW1lVXMgPSBjdHRzT2Zmc2V0VGltZVVzOworICAgICAgICAgICAgICAgICAgICBtTWF4Q3R0c09mZnNldFRpY2tzID0gY3VyckN0dHNPZmZzZXRUaW1lVGlja3M7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJDdHRzT2Zmc2V0VGltZVRpY2tzID4gbU1heEN0dHNPZmZzZXRUaWNrcykgeworICAgICAgICAgICAgICAgICAgICAgICAgbU1heEN0dHNPZmZzZXRUaWNrcyA9IGN1cnJDdHRzT2Zmc2V0VGltZVRpY2tzOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJDdHRzT2Zmc2V0VGltZVRpY2tzIDwgbU1pbkN0dHNPZmZzZXRUaWNrcykgeworICAgICAgICAgICAgICAgICAgICAgICAgbU1pbkN0dHNPZmZzZXRUaWNrcyA9IGN1cnJDdHRzT2Zmc2V0VGltZVRpY2tzOworICAgICAgICAgICAgICAgICAgICAgICAgbU1pbkN0dHNPZmZzZXRUaW1lVXMgPSBjdHRzT2Zmc2V0VGltZVVzOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1Pd25lci0+aXNSZWFsVGltZVJlY29yZGluZygpKSB7Ci0gICAgICAgICAgICBpZiAobUlzQXVkaW8pIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVEcmlmdFRpbWUobWV0YV9kYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChXQVJOX1VOTEVTUyh0aW1lc3RhbXBVcyA+PSAwbGwsICJmb3IgJXMgdHJhY2siLCB0cmFja05hbWUpKSB7Ci0gICAgICAgICAgICBjb3B5LT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7Ci0gICAgICAgICAgICBtSXNNYWxmb3JtZWQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBBTE9HVigiJXMgbWVkaWEgdGltZSBzdGFtcDogJSIgUFJJZDY0ICIgYW5kIHByZXZpb3VzIHBhdXNlZCBkdXJhdGlvbiAlIiBQUklkNjQsCi0gICAgICAgICAgICAgICAgdHJhY2tOYW1lLCB0aW1lc3RhbXBVcywgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzKTsKLSAgICAgICAgaWYgKHRpbWVzdGFtcFVzID4gbVRyYWNrRHVyYXRpb25VcykgewotICAgICAgICAgICAgbVRyYWNrRHVyYXRpb25VcyA9IHRpbWVzdGFtcFVzOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2UgbmVlZCB0byB1c2UgdGhlIHRpbWUgc2NhbGUgYmFzZWQgdGlja3MsIHJhdGhlciB0aGFuIHRoZQotICAgICAgICAvLyB0aW1lc3RhbXAgaXRzZWxmIHRvIGRldGVybWluZSB3aGV0aGVyIHdlIGhhdmUgdG8gdXNlIGEgbmV3Ci0gICAgICAgIC8vIHN0dHMgZW50cnksIHNpbmNlIHdlIG1heSBoYXZlIHJvdW5kaW5nIGVycm9ycy4KLSAgICAgICAgLy8gVGhlIGNhbGN1bGF0aW9uIGlzIGludGVuZGVkIHRvIHJlZHVjZSB0aGUgYWNjdW11bGF0ZWQKLSAgICAgICAgLy8gcm91bmRpbmcgZXJyb3JzLgotICAgICAgICBjdXJyRHVyYXRpb25UaWNrcyA9Ci0gICAgICAgICAgICAoKHRpbWVzdGFtcFVzICogbVRpbWVTY2FsZSArIDUwMDAwMExMKSAvIDEwMDAwMDBMTCAtCi0gICAgICAgICAgICAgICAgKGxhc3RUaW1lc3RhbXBVcyAqIG1UaW1lU2NhbGUgKyA1MDAwMDBMTCkgLyAxMDAwMDAwTEwpOwotICAgICAgICBpZiAoY3VyckR1cmF0aW9uVGlja3MgPCAwbGwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJkbyBub3Qgc3VwcG9ydCBvdXQgb2Ygb3JkZXIgZnJhbWVzICh0aW1lc3RhbXA6ICVsbGQgPCBsYXN0OiAlbGxkIGZvciAlcyB0cmFjayIsCi0gICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZXN0YW1wVXMsIChsb25nIGxvbmcpbGFzdFRpbWVzdGFtcFVzLCB0cmFja05hbWUpOwotICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbVNvdXJjZS0+c3RvcCgpOwotICAgICAgICAgICAgbUlzTWFsZm9ybWVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgdGhlIGR1cmF0aW9uIGlzIGRpZmZlcmVudCBmb3IgdGhpcyBzYW1wbGUsIHNlZSBpZiBpdCBpcyBjbG9zZSBlbm91Z2ggdG8gdGhlIHByZXZpb3VzCi0gICAgICAgIC8vIGR1cmF0aW9uIHRoYXQgd2UgY2FuIGZ1ZGdlIGl0IGFuZCB1c2UgdGhlIHNhbWUgdmFsdWUsIHRvIGF2b2lkIGZpbGxpbmcgdGhlIHN0dHMgdGFibGUKLSAgICAgICAgLy8gd2l0aCBsb3RzIG9mIG5lYXItaWRlbnRpY2FsIGVudHJpZXMuCi0gICAgICAgIC8vICJjbG9zZSBlbm91Z2giIGhlcmUgbWVhbnMgdGhhdCB0aGUgY3VycmVudCBkdXJhdGlvbiBuZWVkcyB0byBiZSBhZGp1c3RlZCBieSBsZXNzCi0gICAgICAgIC8vIHRoYW4gMC4xIG1pbGxpc2Vjb25kcwotICAgICAgICBpZiAobGFzdER1cmF0aW9uVGlja3MgJiYgKGN1cnJEdXJhdGlvblRpY2tzICE9IGxhc3REdXJhdGlvblRpY2tzKSkgewotICAgICAgICAgICAgaW50NjRfdCBkZWx0YVVzID0gKChsYXN0RHVyYXRpb25UaWNrcyAtIGN1cnJEdXJhdGlvblRpY2tzKSAqIDEwMDAwMDBMTAotICAgICAgICAgICAgICAgICAgICArIChtVGltZVNjYWxlIC8gMikpIC8gbVRpbWVTY2FsZTsKLSAgICAgICAgICAgIGlmIChkZWx0YVVzID4gLTEwMCAmJiBkZWx0YVVzIDwgMTAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gdXNlIHByZXZpb3VzIHRpY2tzLCBhbmQgYWRqdXN0IHRpbWVzdGFtcCBhcyBpZiBpdCB3YXMgYWN0dWFsbHkgdGhhdCBudW1iZXIKLSAgICAgICAgICAgICAgICAvLyBvZiB0aWNrcwotICAgICAgICAgICAgICAgIGN1cnJEdXJhdGlvblRpY2tzID0gbGFzdER1cmF0aW9uVGlja3M7Ci0gICAgICAgICAgICAgICAgdGltZXN0YW1wVXMgKz0gZGVsdGFVczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtU3RzelRhYmxlRW50cmllcy0+YWRkKGh0b25sKHNhbXBsZVNpemUpKTsKLSAgICAgICAgaWYgKG1TdHN6VGFibGVFbnRyaWVzLT5jb3VudCgpID4gMikgewotCi0gICAgICAgICAgICAvLyBGb3JjZSB0aGUgZmlyc3Qgc2FtcGxlIHRvIGhhdmUgaXRzIG93biBzdHRzIGVudHJ5IHNvIHRoYXQKLSAgICAgICAgICAgIC8vIHdlIGNhbiBhZGp1c3QgaXRzIHZhbHVlIGxhdGVyIHRvIG1haW50YWluIHRoZSBBL1Ygc3luYy4KLSAgICAgICAgICAgIGlmIChtU3RzelRhYmxlRW50cmllcy0+Y291bnQoKSA9PSAzIHx8IGN1cnJEdXJhdGlvblRpY2tzICE9IGxhc3REdXJhdGlvblRpY2tzKSB7Ci0gICAgICAgICAgICAgICAgYWRkT25lU3R0c1RhYmxlRW50cnkoc2FtcGxlQ291bnQsIGxhc3REdXJhdGlvblRpY2tzKTsKLSAgICAgICAgICAgICAgICBzYW1wbGVDb3VudCA9IDE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICsrc2FtcGxlQ291bnQ7CisgICAgICAgICAgICBpZiAobU93bmVyLT5pc1JlYWxUaW1lUmVjb3JkaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUlzQXVkaW8pIHsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlRHJpZnRUaW1lKG1ldGFfZGF0YSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgIH0KLSAgICAgICAgaWYgKG1TYW1wbGVzSGF2ZVNhbWVTaXplKSB7Ci0gICAgICAgICAgICBpZiAobVN0c3pUYWJsZUVudHJpZXMtPmNvdW50KCkgPj0gMiAmJiBwcmV2aW91c1NhbXBsZVNpemUgIT0gc2FtcGxlU2l6ZSkgewotICAgICAgICAgICAgICAgIG1TYW1wbGVzSGF2ZVNhbWVTaXplID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoV0FSTl9VTkxFU1ModGltZXN0YW1wVXMgPj0gMGxsLCAiZm9yICVzIHRyYWNrIiwgdHJhY2tOYW1lKSkgeworICAgICAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7CisgICAgICAgICAgICAgICAgbUlzTWFsZm9ybWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByZXZpb3VzU2FtcGxlU2l6ZSA9IHNhbXBsZVNpemU7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIiVzIHRpbWVzdGFtcFVzL2xhc3RUaW1lc3RhbXBVczogJSIgUFJJZDY0ICIvJSIgUFJJZDY0LAotICAgICAgICAgICAgICAgIHRyYWNrTmFtZSwgdGltZXN0YW1wVXMsIGxhc3RUaW1lc3RhbXBVcyk7Ci0gICAgICAgIGxhc3REdXJhdGlvblVzID0gdGltZXN0YW1wVXMgLSBsYXN0VGltZXN0YW1wVXM7Ci0gICAgICAgIGxhc3REdXJhdGlvblRpY2tzID0gY3VyckR1cmF0aW9uVGlja3M7Ci0gICAgICAgIGxhc3RUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOwogCi0gICAgICAgIGlmIChpc1N5bmMgIT0gMCkgewotICAgICAgICAgICAgYWRkT25lU3Rzc1RhYmxlRW50cnkobVN0c3pUYWJsZUVudHJpZXMtPmNvdW50KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1UcmFja2luZ1Byb2dyZXNzU3RhdHVzKSB7Ci0gICAgICAgICAgICBpZiAobVByZXZpb3VzVHJhY2tUaW1lVXMgPD0gMCkgewotICAgICAgICAgICAgICAgIG1QcmV2aW91c1RyYWNrVGltZVVzID0gbVN0YXJ0VGltZXN0YW1wVXM7CisgICAgICAgICAgICBBTE9HVigiJXMgbWVkaWEgdGltZSBzdGFtcDogJSIgUFJJZDY0ICIgYW5kIHByZXZpb3VzIHBhdXNlZCBkdXJhdGlvbiAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgICAgIHRyYWNrTmFtZSwgdGltZXN0YW1wVXMsIHByZXZpb3VzUGF1c2VkRHVyYXRpb25Vcyk7CisgICAgICAgICAgICBpZiAodGltZXN0YW1wVXMgPiBtVHJhY2tEdXJhdGlvblVzKSB7CisgICAgICAgICAgICAgICAgbVRyYWNrRHVyYXRpb25VcyA9IHRpbWVzdGFtcFVzOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJhY2tQcm9ncmVzc1N0YXR1cyh0aW1lc3RhbXBVcyk7CisKKyAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gdXNlIHRoZSB0aW1lIHNjYWxlIGJhc2VkIHRpY2tzLCByYXRoZXIgdGhhbiB0aGUKKyAgICAgICAgICAgIC8vIHRpbWVzdGFtcCBpdHNlbGYgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UgaGF2ZSB0byB1c2UgYSBuZXcKKyAgICAgICAgICAgIC8vIHN0dHMgZW50cnksIHNpbmNlIHdlIG1heSBoYXZlIHJvdW5kaW5nIGVycm9ycy4KKyAgICAgICAgICAgIC8vIFRoZSBjYWxjdWxhdGlvbiBpcyBpbnRlbmRlZCB0byByZWR1Y2UgdGhlIGFjY3VtdWxhdGVkCisgICAgICAgICAgICAvLyByb3VuZGluZyBlcnJvcnMuCisgICAgICAgICAgICBjdXJyRHVyYXRpb25UaWNrcyA9CisgICAgICAgICAgICAgICAgKCh0aW1lc3RhbXBVcyAqIG1UaW1lU2NhbGUgKyA1MDAwMDBMTCkgLyAxMDAwMDAwTEwgLQorICAgICAgICAgICAgICAgICAgICAobGFzdFRpbWVzdGFtcFVzICogbVRpbWVTY2FsZSArIDUwMDAwMExMKSAvIDEwMDAwMDBMTCk7CisgICAgICAgICAgICBpZiAoY3VyckR1cmF0aW9uVGlja3MgPCAwbGwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZG8gbm90IHN1cHBvcnQgb3V0IG9mIG9yZGVyIGZyYW1lcyAodGltZXN0YW1wOiAlbGxkIDwgbGFzdDogJWxsZCBmb3IgJXMgdHJhY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lc3RhbXBVcywgKGxvbmcgbG9uZylsYXN0VGltZXN0YW1wVXMsIHRyYWNrTmFtZSk7CisgICAgICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgICAgICAgICBtSXNNYWxmb3JtZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpZiB0aGUgZHVyYXRpb24gaXMgZGlmZmVyZW50IGZvciB0aGlzIHNhbXBsZSwgc2VlIGlmIGl0IGlzIGNsb3NlIGVub3VnaCB0byB0aGUgcHJldmlvdXMKKyAgICAgICAgICAgIC8vIGR1cmF0aW9uIHRoYXQgd2UgY2FuIGZ1ZGdlIGl0IGFuZCB1c2UgdGhlIHNhbWUgdmFsdWUsIHRvIGF2b2lkIGZpbGxpbmcgdGhlIHN0dHMgdGFibGUKKyAgICAgICAgICAgIC8vIHdpdGggbG90cyBvZiBuZWFyLWlkZW50aWNhbCBlbnRyaWVzLgorICAgICAgICAgICAgLy8gImNsb3NlIGVub3VnaCIgaGVyZSBtZWFucyB0aGF0IHRoZSBjdXJyZW50IGR1cmF0aW9uIG5lZWRzIHRvIGJlIGFkanVzdGVkIGJ5IGxlc3MKKyAgICAgICAgICAgIC8vIHRoYW4gMC4xIG1pbGxpc2Vjb25kcworICAgICAgICAgICAgaWYgKGxhc3REdXJhdGlvblRpY2tzICYmIChjdXJyRHVyYXRpb25UaWNrcyAhPSBsYXN0RHVyYXRpb25UaWNrcykpIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGRlbHRhVXMgPSAoKGxhc3REdXJhdGlvblRpY2tzIC0gY3VyckR1cmF0aW9uVGlja3MpICogMTAwMDAwMExMCisgICAgICAgICAgICAgICAgICAgICAgICArIChtVGltZVNjYWxlIC8gMikpIC8gbVRpbWVTY2FsZTsKKyAgICAgICAgICAgICAgICBpZiAoZGVsdGFVcyA+IC0xMDAgJiYgZGVsdGFVcyA8IDEwMCkgeworICAgICAgICAgICAgICAgICAgICAvLyB1c2UgcHJldmlvdXMgdGlja3MsIGFuZCBhZGp1c3QgdGltZXN0YW1wIGFzIGlmIGl0IHdhcyBhY3R1YWxseSB0aGF0IG51bWJlcgorICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aWNrcworICAgICAgICAgICAgICAgICAgICBjdXJyRHVyYXRpb25UaWNrcyA9IGxhc3REdXJhdGlvblRpY2tzOworICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcyArPSBkZWx0YVVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TdHN6VGFibGVFbnRyaWVzLT5hZGQoaHRvbmwoc2FtcGxlU2l6ZSkpOworICAgICAgICAgICAgaWYgKG1TdHN6VGFibGVFbnRyaWVzLT5jb3VudCgpID4gMikgeworCisgICAgICAgICAgICAgICAgLy8gRm9yY2UgdGhlIGZpcnN0IHNhbXBsZSB0byBoYXZlIGl0cyBvd24gc3R0cyBlbnRyeSBzbyB0aGF0CisgICAgICAgICAgICAgICAgLy8gd2UgY2FuIGFkanVzdCBpdHMgdmFsdWUgbGF0ZXIgdG8gbWFpbnRhaW4gdGhlIEEvViBzeW5jLgorICAgICAgICAgICAgICAgIGlmIChtU3RzelRhYmxlRW50cmllcy0+Y291bnQoKSA9PSAzIHx8IGN1cnJEdXJhdGlvblRpY2tzICE9IGxhc3REdXJhdGlvblRpY2tzKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZE9uZVN0dHNUYWJsZUVudHJ5KHNhbXBsZUNvdW50LCBsYXN0RHVyYXRpb25UaWNrcyk7CisgICAgICAgICAgICAgICAgICAgIHNhbXBsZUNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICArK3NhbXBsZUNvdW50OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1TYW1wbGVzSGF2ZVNhbWVTaXplKSB7CisgICAgICAgICAgICAgICAgaWYgKG1TdHN6VGFibGVFbnRyaWVzLT5jb3VudCgpID49IDIgJiYgcHJldmlvdXNTYW1wbGVTaXplICE9IHNhbXBsZVNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNhbXBsZXNIYXZlU2FtZVNpemUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJldmlvdXNTYW1wbGVTaXplID0gc2FtcGxlU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCIlcyB0aW1lc3RhbXBVcy9sYXN0VGltZXN0YW1wVXM6ICUiIFBSSWQ2NCAiLyUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tOYW1lLCB0aW1lc3RhbXBVcywgbGFzdFRpbWVzdGFtcFVzKTsKKyAgICAgICAgICAgIGxhc3REdXJhdGlvblVzID0gdGltZXN0YW1wVXMgLSBsYXN0VGltZXN0YW1wVXM7CisgICAgICAgICAgICBsYXN0RHVyYXRpb25UaWNrcyA9IGN1cnJEdXJhdGlvblRpY2tzOworICAgICAgICAgICAgbGFzdFRpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7CisKKyAgICAgICAgICAgIGlmIChpc1N5bmMgIT0gMCkgeworICAgICAgICAgICAgICAgIGFkZE9uZVN0c3NUYWJsZUVudHJ5KG1TdHN6VGFibGVFbnRyaWVzLT5jb3VudCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1UcmFja2luZ1Byb2dyZXNzU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgaWYgKG1QcmV2aW91c1RyYWNrVGltZVVzIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzVHJhY2tUaW1lVXMgPSBtU3RhcnRUaW1lc3RhbXBVczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJhY2tQcm9ncmVzc1N0YXR1cyh0aW1lc3RhbXBVcyk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFoYXNNdWx0aXBsZVRyYWNrcykgewotICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQgPSAobUlzQXZjIHx8IG1Jc0hldmMpID8gbU93bmVyLT5hZGRNdWx0aXBsZUxlbmd0aFByZWZpeGVkU2FtcGxlc19sKGNvcHkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1Pd25lci0+YWRkU2FtcGxlX2woY29weSk7CisgICAgICAgICAgICBzaXplX3QgYnl0ZXNXcml0dGVuOworICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQgPSBtT3duZXItPmFkZFNhbXBsZV9sKGNvcHksIHVzZVByZWZpeCgpLCAmYnl0ZXNXcml0dGVuKTsKIAotICAgICAgICAgICAgdWludDMyX3QgY291bnQgPSAobU93bmVyLT51c2UzMkJpdEZpbGVPZmZzZXQoKQotICAgICAgICAgICAgICAgICAgICAgICAgPyBtU3Rjb1RhYmxlRW50cmllcy0+Y291bnQoKQotICAgICAgICAgICAgICAgICAgICAgICAgOiBtQ282NFRhYmxlRW50cmllcy0+Y291bnQoKSk7CisgICAgICAgICAgICBpZiAobUlzSGVpYykgeworICAgICAgICAgICAgICAgIGFkZEl0ZW1PZmZzZXRBbmRTaXplKG9mZnNldCwgYnl0ZXNXcml0dGVuKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgY291bnQgPSAobU93bmVyLT51c2UzMkJpdEZpbGVPZmZzZXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbVN0Y29UYWJsZUVudHJpZXMtPmNvdW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1DbzY0VGFibGVFbnRyaWVzLT5jb3VudCgpKTsKIAotICAgICAgICAgICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgICAgICAgICBhZGRDaHVua09mZnNldChvZmZzZXQpOworICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZENodW5rT2Zmc2V0KG9mZnNldCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOwogICAgICAgICAgICAgY29weSA9IE5VTEw7CkBAIC0yOTYzLDcgKzMyMDQsMTAgQEAKICAgICAgICAgfQogCiAgICAgICAgIG1DaHVua1NhbXBsZXMucHVzaF9iYWNrKGNvcHkpOwotICAgICAgICBpZiAoaW50ZXJsZWF2ZUR1cmF0aW9uVXMgPT0gMCkgeworICAgICAgICBpZiAobUlzSGVpYykgeworICAgICAgICAgICAgYnVmZmVyQ2h1bmsoMCAvKnRpbWVzdGFtcFVzKi8pOworICAgICAgICAgICAgKytuQ2h1bmtzOworICAgICAgICB9IGVsc2UgaWYgKGludGVybGVhdmVEdXJhdGlvblVzID09IDApIHsKICAgICAgICAgICAgIGFkZE9uZVN0c2NUYWJsZUVudHJ5KCsrbkNodW5rcywgMSk7CiAgICAgICAgICAgICBidWZmZXJDaHVuayh0aW1lc3RhbXBVcyk7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0yOTk2LDQyICszMjQwLDQ5IEBACiAKICAgICBtT3duZXItPnRyYWNrUHJvZ3Jlc3NTdGF0dXMobVRyYWNrSWQsIC0xLCBlcnIpOwogCi0gICAgLy8gTGFzdCBjaHVuawotICAgIGlmICghaGFzTXVsdGlwbGVUcmFja3MpIHsKLSAgICAgICAgYWRkT25lU3RzY1RhYmxlRW50cnkoMSwgbVN0c3pUYWJsZUVudHJpZXMtPmNvdW50KCkpOwotICAgIH0gZWxzZSBpZiAoIW1DaHVua1NhbXBsZXMuZW1wdHkoKSkgewotICAgICAgICBhZGRPbmVTdHNjVGFibGVFbnRyeSgrK25DaHVua3MsIG1DaHVua1NhbXBsZXMuc2l6ZSgpKTsKLSAgICAgICAgYnVmZmVyQ2h1bmsodGltZXN0YW1wVXMpOwotICAgIH0KLQotICAgIC8vIFdlIGRvbid0IHJlYWxseSBrbm93IGhvdyBsb25nIHRoZSBsYXN0IGZyYW1lIGxhc3RzLCBzaW5jZQotICAgIC8vIHRoZXJlIGlzIG5vIGZyYW1lIHRpbWUgYWZ0ZXIgaXQsIGp1c3QgcmVwZWF0IHRoZSBwcmV2aW91cwotICAgIC8vIGZyYW1lJ3MgZHVyYXRpb24uCi0gICAgaWYgKG1TdHN6VGFibGVFbnRyaWVzLT5jb3VudCgpID09IDEpIHsKLSAgICAgICAgbGFzdER1cmF0aW9uVXMgPSAwOyAgLy8gQSBzaW5nbGUgc2FtcGxlJ3MgZHVyYXRpb24KLSAgICAgICAgbGFzdER1cmF0aW9uVGlja3MgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICsrc2FtcGxlQ291bnQ7ICAvLyBDb3VudCBmb3IgdGhlIGxhc3Qgc2FtcGxlCi0gICAgfQotCi0gICAgaWYgKG1TdHN6VGFibGVFbnRyaWVzLT5jb3VudCgpIDw9IDIpIHsKLSAgICAgICAgYWRkT25lU3R0c1RhYmxlRW50cnkoMSwgbGFzdER1cmF0aW9uVGlja3MpOwotICAgICAgICBpZiAoc2FtcGxlQ291bnQgLSAxID4gMCkgewotICAgICAgICAgICAgYWRkT25lU3R0c1RhYmxlRW50cnkoc2FtcGxlQ291bnQgLSAxLCBsYXN0RHVyYXRpb25UaWNrcyk7CisgICAgaWYgKG1Jc0hlaWMpIHsKKyAgICAgICAgaWYgKCFtQ2h1bmtTYW1wbGVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGJ1ZmZlckNodW5rKDApOworICAgICAgICAgICAgKytuQ2h1bmtzOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgYWRkT25lU3R0c1RhYmxlRW50cnkoc2FtcGxlQ291bnQsIGxhc3REdXJhdGlvblRpY2tzKTsKLSAgICB9Ci0KLSAgICAvLyBUaGUgbGFzdCBjdHRzIGJveCBtYXkgbm90IGhhdmUgYmVlbiB3cml0dGVuIHlldCwgYW5kIHRoaXMKLSAgICAvLyBpcyB0byBtYWtlIHN1cmUgdGhhdCB3ZSB3cml0ZSBvdXQgdGhlIGxhc3QgY3R0cyBib3guCi0gICAgaWYgKGN1cnJDdHRzT2Zmc2V0VGltZVRpY2tzID09IGxhc3RDdHRzT2Zmc2V0VGltZVRpY2tzKSB7Ci0gICAgICAgIGlmIChjdHRzU2FtcGxlQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICBhZGRPbmVDdHRzVGFibGVFbnRyeShjdHRzU2FtcGxlQ291bnQsIGxhc3RDdHRzT2Zmc2V0VGltZVRpY2tzKTsKKyAgICAgICAgLy8gTGFzdCBjaHVuaworICAgICAgICBpZiAoIWhhc011bHRpcGxlVHJhY2tzKSB7CisgICAgICAgICAgICBhZGRPbmVTdHNjVGFibGVFbnRyeSgxLCBtU3RzelRhYmxlRW50cmllcy0+Y291bnQoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoIW1DaHVua1NhbXBsZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgYWRkT25lU3RzY1RhYmxlRW50cnkoKytuQ2h1bmtzLCBtQ2h1bmtTYW1wbGVzLnNpemUoKSk7CisgICAgICAgICAgICBidWZmZXJDaHVuayh0aW1lc3RhbXBVcyk7CiAgICAgICAgIH0KLSAgICB9CiAKLSAgICBtVHJhY2tEdXJhdGlvblVzICs9IGxhc3REdXJhdGlvblVzOworICAgICAgICAvLyBXZSBkb24ndCByZWFsbHkga25vdyBob3cgbG9uZyB0aGUgbGFzdCBmcmFtZSBsYXN0cywgc2luY2UKKyAgICAgICAgLy8gdGhlcmUgaXMgbm8gZnJhbWUgdGltZSBhZnRlciBpdCwganVzdCByZXBlYXQgdGhlIHByZXZpb3VzCisgICAgICAgIC8vIGZyYW1lJ3MgZHVyYXRpb24uCisgICAgICAgIGlmIChtU3RzelRhYmxlRW50cmllcy0+Y291bnQoKSA9PSAxKSB7CisgICAgICAgICAgICBsYXN0RHVyYXRpb25VcyA9IDA7ICAvLyBBIHNpbmdsZSBzYW1wbGUncyBkdXJhdGlvbgorICAgICAgICAgICAgbGFzdER1cmF0aW9uVGlja3MgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKytzYW1wbGVDb3VudDsgIC8vIENvdW50IGZvciB0aGUgbGFzdCBzYW1wbGUKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtU3RzelRhYmxlRW50cmllcy0+Y291bnQoKSA8PSAyKSB7CisgICAgICAgICAgICBhZGRPbmVTdHRzVGFibGVFbnRyeSgxLCBsYXN0RHVyYXRpb25UaWNrcyk7CisgICAgICAgICAgICBpZiAoc2FtcGxlQ291bnQgLSAxID4gMCkgeworICAgICAgICAgICAgICAgIGFkZE9uZVN0dHNUYWJsZUVudHJ5KHNhbXBsZUNvdW50IC0gMSwgbGFzdER1cmF0aW9uVGlja3MpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRkT25lU3R0c1RhYmxlRW50cnkoc2FtcGxlQ291bnQsIGxhc3REdXJhdGlvblRpY2tzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZSBsYXN0IGN0dHMgYm94IG1heSBub3QgaGF2ZSBiZWVuIHdyaXR0ZW4geWV0LCBhbmQgdGhpcworICAgICAgICAvLyBpcyB0byBtYWtlIHN1cmUgdGhhdCB3ZSB3cml0ZSBvdXQgdGhlIGxhc3QgY3R0cyBib3guCisgICAgICAgIGlmIChjdXJyQ3R0c09mZnNldFRpbWVUaWNrcyA9PSBsYXN0Q3R0c09mZnNldFRpbWVUaWNrcykgeworICAgICAgICAgICAgaWYgKGN0dHNTYW1wbGVDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBhZGRPbmVDdHRzVGFibGVFbnRyeShjdHRzU2FtcGxlQ291bnQsIGxhc3RDdHRzT2Zmc2V0VGltZVRpY2tzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1UcmFja0R1cmF0aW9uVXMgKz0gbGFzdER1cmF0aW9uVXM7CisgICAgfQogICAgIG1SZWFjaGVkRU9TID0gdHJ1ZTsKIAogICAgIHNlbmRUcmFja1N1bW1hcnkoaGFzTXVsdGlwbGVUcmFja3MpOwpAQCAtMzA1Myw3ICszMzA0LDcgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgaWYgKG1TdHN6VGFibGVFbnRyaWVzLT5jb3VudCgpID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gc2FtcGxlcyB3cml0dGVuCisgICAgaWYgKCFtSXNIZWljICYmIG1TdHN6VGFibGVFbnRyaWVzLT5jb3VudCgpID09IDApIHsgIC8vIG5vIHNhbXBsZXMgd3JpdHRlbgogICAgICAgICBBTE9HRSgiVGhlIG51bWJlciBvZiByZWNvcmRlZCBzYW1wbGVzIGlzIDAiKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpAQCAtMzE5OSwxMyArMzQ1MCw0OCBAQAogICAgIHJldHVybiBtRXN0aW1hdGVkVHJhY2tTaXplQnl0ZXM7CiB9CiAKK2ludDMyX3QgTVBFRzRXcml0ZXI6OlRyYWNrOjpnZXRNZXRhU2l6ZUluY3JlYXNlKCkgY29uc3QgeworICAgIENIRUNLKG1Jc0hlaWMpOworCisgICAgaW50MzJfdCBncmlkID0gKG1OdW1UaWxlcyA+IDEpOworCisgICAgLy8gTm90ZSB0aGF0IHRoZSByb3RhdGlvbiBhbmdsZSBpcyBpbiB0aGUgZmlsZSBtZXRhLCBhbmQgd2UgZG9uJ3QgaGF2ZQorICAgIC8vIGl0IHVudGlsIHN0YXJ0LCBzbyBoZXJlIHRoZSBjYWxjdWxhdGlvbiBoYXMgdG8gYXNzdW1lIHJvdGF0aW9uLgorCisgICAgLy8gaW5jcmVhc2UgdG8gaXBjbworICAgIGludDMyX3QgaW5jcmVhc2UgPSAyMCAqIChncmlkICsgMSkgICAgICAgICAgICAgIC8vICdpc3BlJyBwcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICAgKyAoOCArIG1Db2RlY1NwZWNpZmljRGF0YVNpemUpIC8vICdodmNDJyBwcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICAgKyA5OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICdpcm90JyBwcm9wZXJ0eSAod29yc3QgY2FzZSkKKworICAgIC8vIGluY3JlYXNlIHRvIGlyZWYgYW5kIGlkYXQKKyAgICBpZiAoZ3JpZCkgeworICAgICAgICBpbmNyZWFzZSArPSAoOCArIDIgKyAyICsgbU51bVRpbGVzICogMikgIC8vICdkaW1nJyBpbiBpcmVmCisgICAgICAgICAgICAgICAgICArIDEyOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW1hZ2VHcmlkIGluICdpZGF0JyAod29yc3QgY2FzZSkKKyAgICB9CisKKyAgICAvLyBpbmNyZWFzZSB0byBpbG9jLCBpaW5mIGFuZCBpcG1hCisgICAgaW5jcmVhc2UgKz0gKDE2ICAgICAgICAgICAgIC8vIGluY3JlYXNlIHRvICdpbG9jJworICAgICAgICAgICAgICArIDIxICAgICAgICAgICAgICAvLyBpbmNyZWFzZSB0byAnaWluZicKKyAgICAgICAgICAgICAgKyAoMyArIDIgKiAyKSkgICAgLy8gaW5jcmVhc2UgdG8gJ2lwbWEnICh3b3JzdCBjYXNlLCAyIHByb3BzIHggMiBieXRlcykKKyAgICAgICAgICAgICAgKiAobU51bVRpbGVzICsgZ3JpZCk7CisKKyAgICAvLyBhZGp1c3QgdG8gaXBtYToKKyAgICAvLyBpZiByb3RhdGlvbiBpcyBwcmVzZW50IGFuZCBvbmx5IG9uZSB0aWxlLCBpdCBjb3VsZCByZWYgMyBwcm9wZXJ0aWVzCisgICAgaWYgKCFncmlkKSB7CisgICAgICAgIGluY3JlYXNlICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGluY3JlYXNlOworfQorCiBzdGF0dXNfdCBNUEVHNFdyaXRlcjo6VHJhY2s6OmNoZWNrQ29kZWNTcGVjaWZpY0RhdGEoKSBjb25zdCB7CiAgICAgY29uc3QgY2hhciAqbWltZTsKICAgICBDSEVDSyhtTWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwogICAgIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsIG1pbWUpIHx8CiAgICAgICAgICFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCBtaW1lKSB8fAogICAgICAgICAhc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIG1pbWUpIHx8Ci0gICAgICAgICFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMsIG1pbWUpKSB7CisgICAgICAgICFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMsIG1pbWUpIHx8CisgICAgICAgICFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQywgbWltZSkpIHsKICAgICAgICAgaWYgKCFtQ29kZWNTcGVjaWZpY0RhdGEgfHwKICAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljRGF0YVNpemUgPD0gMCkgewogICAgICAgICAgICAgQUxPR0UoIk1pc3NpbmcgY29kZWMgc3BlY2lmaWMgZGF0YSIpOwpAQCAtMzIyMiw3ICszNTA4LDEwIEBACiB9CiAKIGNvbnN0IGNoYXIgKk1QRUc0V3JpdGVyOjpUcmFjazo6Z2V0VHJhY2tUeXBlKCkgY29uc3QgewotICAgIHJldHVybiBtSXNBdWRpbyA/ICJBdWRpbyIgOiAobUlzVmlkZW8gPyAiVmlkZW8iIDogIk1ldGFkYXRhIik7CisgICAgcmV0dXJuIG1Jc0F1ZGlvID8gIkF1ZGlvIiA6CisgICAgICAgICAgIG1Jc1ZpZGVvID8gIlZpZGVvIiA6CisgICAgICAgICAgIG1Jc0hlaWMgID8gIkltYWdlIiA6CisgICAgICAgICAgICAgICAgICAgICAgIk1ldGFkYXRhIjsKIH0KIAogdm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OndyaXRlVHJhY2tIZWFkZXIoYm9vbCB1c2UzMkJpdE9mZnNldCkgewpAQCAtMzc5MiwxMSArNDA4MSwxMSBAQAogICAgIGVuZEJveCgpOwogfQogCi12b2lkIE1QRUc0V3JpdGVyOjp3cml0ZUhkbHIoKSB7Cit2b2lkIE1QRUc0V3JpdGVyOjp3cml0ZUhkbHIoY29uc3QgY2hhciAqaGFuZGxlclR5cGUpIHsKICAgICBiZWdpbkJveCgiaGRsciIpOwogICAgIHdyaXRlSW50MzIoMCk7IC8vIFZlcnNpb24sIEZsYWdzCiAgICAgd3JpdGVJbnQzMigwKTsgLy8gUHJlZGVmaW5lZAotICAgIHdyaXRlRm91cmNjKCJtZHRhIik7CisgICAgd3JpdGVGb3VyY2MoaGFuZGxlclR5cGUpOwogICAgIHdyaXRlSW50MzIoMCk7IC8vIFJlc2VydmVkWzBdCiAgICAgd3JpdGVJbnQzMigwKTsgLy8gUmVzZXJ2ZWRbMV0KICAgICB3cml0ZUludDMyKDApOyAvLyBSZXNlcnZlZFsyXQpAQCAtMzg3NiwxOSArNDE2NSwzMDUgQEAKICAgICBlbmRCb3goKTsgLy8gaWxzdAogfQogCi12b2lkIE1QRUc0V3JpdGVyOjp3cml0ZU1ldGFCb3goKSB7Cit2b2lkIE1QRUc0V3JpdGVyOjp3cml0ZU1vb3ZMZXZlbE1ldGFCb3goKSB7CiAgICAgc2l6ZV90IGNvdW50ID0gbU1ldGFLZXlzLT5jb3VudEVudHJpZXMoKTsKICAgICBpZiAoY291bnQgPT0gMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgYmVnaW5Cb3goIm1ldGEiKTsKLSAgICB3cml0ZUhkbHIoKTsKKyAgICB3cml0ZUhkbHIoIm1kdGEiKTsKICAgICB3cml0ZUtleXMoKTsKICAgICB3cml0ZUlsc3QoKTsKICAgICBlbmRCb3goKTsKIH0KIAordm9pZCBNUEVHNFdyaXRlcjo6d3JpdGVJbG9jQm94KCkgeworICAgIGJlZ2luQm94KCJpbG9jIik7CisgICAgLy8gVXNlIHZlcnNpb24gMSB0byBhbGxvdyBjb25zdHJ1Y3Rpb24gbWV0aG9kIDEgdGhhdCByZWZlcnMgdG8KKyAgICAvLyBkYXRhIGluIGlkYXQgYm94IGluc2lkZSBtZXRhIGJveC4KKyAgICB3cml0ZUludDMyKDB4MDEwMDAwMDApOyAvLyBWZXJzaW9uID0gMSwgRmxhZ3MgPSAwCisgICAgd3JpdGVJbnQxNigweDQ0MDApOyAgICAgLy8gb2Zmc2V0X3NpemUgPSBsZW5ndGhfc2l6ZSA9IDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYXNlX29mZnNldF9zaXplID0gaW5kZXhfc2l6ZSA9IDAKKworICAgIC8vIDE2LWJpdCBpdGVtX2NvdW50CisgICAgc2l6ZV90IGl0ZW1Db3VudCA9IG1JdGVtcy5zaXplKCk7CisgICAgaWYgKGl0ZW1Db3VudCA+IDY1NTM1KSB7CisgICAgICAgIEFMT0dXKCJEcm9wcGluZyBleGNlc3MgaXRlbXM6IGl0ZW1Db3VudCAlenUiLCBpdGVtQ291bnQpOworICAgICAgICBpdGVtQ291bnQgPSA2NTUzNTsKKyAgICB9CisgICAgd3JpdGVJbnQxNigodWludDE2X3QpaXRlbUNvdW50KTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHsKKyAgICAgICAgd3JpdGVJbnQxNihtSXRlbXNbaV0uaXRlbUlkKTsKKyAgICAgICAgYm9vbCBpc0dyaWQgPSBtSXRlbXNbaV0uaXNHcmlkKCk7CisKKyAgICAgICAgd3JpdGVJbnQxNihpc0dyaWQgPyAxIDogMCk7IC8vIGNvbnN0cnVjdGlvbl9tZXRob2QKKyAgICAgICAgd3JpdGVJbnQxNigwKTsgLy8gZGF0YV9yZWZlcmVuY2VfaW5kZXggPSAwCisgICAgICAgIHdyaXRlSW50MTYoMSk7IC8vIGV4dGVudF9jb3VudCA9IDEKKworICAgICAgICBpZiAoaXNHcmlkKSB7CisgICAgICAgICAgICAvLyBvZmZzZXQgaW50byB0aGUgJ2lkYXQnIGJveAorICAgICAgICAgICAgd3JpdGVJbnQzMihtTnVtR3JpZHMrKyAqIDgpOworICAgICAgICAgICAgd3JpdGVJbnQzMig4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdyaXRlSW50MzIobUl0ZW1zW2ldLm9mZnNldCk7CisgICAgICAgICAgICB3cml0ZUludDMyKG1JdGVtc1tpXS5zaXplKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbmRCb3goKTsKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6d3JpdGVJbmZlQm94KAorICAgICAgICB1aW50MTZfdCBpdGVtSWQsIGNvbnN0IGNoYXIgKml0ZW1UeXBlLCB1aW50MzJfdCBmbGFncykgeworICAgIGJlZ2luQm94KCJpbmZlIik7CisgICAgd3JpdGVJbnQzMigweDAyMDAwMDAwIHwgZmxhZ3MpOyAvLyBWZXJzaW9uID0gMiwgRmxhZ3MgPSAwCisgICAgd3JpdGVJbnQxNihpdGVtSWQpOworICAgIHdyaXRlSW50MTYoMCk7ICAgICAgICAgIC8vaXRlbV9wcm90ZWN0aW9uX2luZGV4ID0gMAorICAgIHdyaXRlRm91cmNjKGl0ZW1UeXBlKTsKKyAgICB3cml0ZUNTdHJpbmcoIiIpOyAgICAgICAvLyBpdGVtX25hbWUKKyAgICBlbmRCb3goKTsKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6d3JpdGVJaW5mQm94KCkgeworICAgIGJlZ2luQm94KCJpaW5mIik7CisgICAgd3JpdGVJbnQzMigwKTsgICAgICAgICAgLy8gVmVyc2lvbiA9IDAsIEZsYWdzID0gMAorCisgICAgLy8gMTYtYml0IGl0ZW1fY291bnQKKyAgICBzaXplX3QgaXRlbUNvdW50ID0gbUl0ZW1zLnNpemUoKTsKKyAgICBpZiAoaXRlbUNvdW50ID4gNjU1MzUpIHsKKyAgICAgICAgQUxPR1coIkRyb3BwaW5nIGV4Y2VzcyBpdGVtczogaXRlbUNvdW50ICV6dSIsIGl0ZW1Db3VudCk7CisgICAgICAgIGl0ZW1Db3VudCA9IDY1NTM1OworICAgIH0KKworICAgIHdyaXRlSW50MTYoKHVpbnQxNl90KWl0ZW1Db3VudCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpdGVtQ291bnQ7IGkrKykgeworICAgICAgICB3cml0ZUluZmVCb3gobUl0ZW1zW2ldLml0ZW1JZCwgbUl0ZW1zW2ldLml0ZW1UeXBlLAorICAgICAgICAgICAgICAgIG1JdGVtc1tpXS5pc0hpZGRlbiA/IDEgOiAwKTsKKyAgICB9CisKKyAgICBlbmRCb3goKTsKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6d3JpdGVJZGF0Qm94KCkgeworICAgIGJlZ2luQm94KCJpZGF0Iik7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JdGVtcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobUl0ZW1zW2ldLmlzR3JpZCgpKSB7CisgICAgICAgICAgICB3cml0ZUludDgoMCk7IC8vIHZlcnNpb24KKyAgICAgICAgICAgIC8vIGZsYWdzID09IDEgbWVhbnMgMzItYml0IHdpZHRoLGhlaWdodAorICAgICAgICAgICAgaW50OF90IGZsYWdzID0gKG1JdGVtc1tpXS53aWR0aCA+IDY1NTM1IHx8IG1JdGVtc1tpXS5oZWlnaHQgPiA2NTUzNSk7CisgICAgICAgICAgICB3cml0ZUludDgoZmxhZ3MpOworICAgICAgICAgICAgd3JpdGVJbnQ4KG1JdGVtc1tpXS5yb3dzIC0gMSk7CisgICAgICAgICAgICB3cml0ZUludDgobUl0ZW1zW2ldLmNvbHMgLSAxKTsKKyAgICAgICAgICAgIGlmIChmbGFncykgeworICAgICAgICAgICAgICAgIHdyaXRlSW50MzIobUl0ZW1zW2ldLndpZHRoKTsKKyAgICAgICAgICAgICAgICB3cml0ZUludDMyKG1JdGVtc1tpXS5oZWlnaHQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3cml0ZUludDE2KCh1aW50MTZfdCltSXRlbXNbaV0ud2lkdGgpOworICAgICAgICAgICAgICAgIHdyaXRlSW50MTYoKHVpbnQxNl90KW1JdGVtc1tpXS5oZWlnaHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZW5kQm94KCk7Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OndyaXRlSXJlZkJveCgpIHsKKyAgICBiZWdpbkJveCgiaXJlZiIpOworICAgIHdyaXRlSW50MzIoMCk7ICAgICAgICAgIC8vIFZlcnNpb24gPSAwLCBGbGFncyA9IDAKKyAgICB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUl0ZW1zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIW1JdGVtc1tpXS5pc0dyaWQoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmVnaW5Cb3goImRpbWciKTsKKyAgICAgICAgICAgIHdyaXRlSW50MTYobUl0ZW1zW2ldLml0ZW1JZCk7CisgICAgICAgICAgICBzaXplX3QgcmVmQ291bnQgPSBtSXRlbXNbaV0uZGltZ1JlZnMuc2l6ZSgpOworICAgICAgICAgICAgaWYgKHJlZkNvdW50ID4gNjU1MzUpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygidG9vIG1hbnkgZW50cmllcyBpbiBkaW1nIik7CisgICAgICAgICAgICAgICAgcmVmQ291bnQgPSA2NTUzNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlSW50MTYoKHVpbnQxNl90KXJlZkNvdW50KTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IHJlZkluZGV4ID0gMDsgcmVmSW5kZXggPCByZWZDb3VudDsgcmVmSW5kZXgrKykgeworICAgICAgICAgICAgICAgIHdyaXRlSW50MTYobUl0ZW1zW2ldLmRpbWdSZWZzW3JlZkluZGV4XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbmRCb3goKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbmRCb3goKTsKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6d3JpdGVQaXRtQm94KCkgeworICAgIGJlZ2luQm94KCJwaXRtIik7CisgICAgd3JpdGVJbnQzMigwKTsgICAgICAgICAgLy8gVmVyc2lvbiA9IDAsIEZsYWdzID0gMAorICAgIHdyaXRlSW50MTYobVByaW1hcnlJdGVtSWQpOworICAgIGVuZEJveCgpOworfQorCit2b2lkIE1QRUc0V3JpdGVyOjp3cml0ZUlwY29Cb3goKSB7CisgICAgYmVnaW5Cb3goImlwY28iKTsKKyAgICBzaXplX3QgbnVtUHJvcGVydGllcyA9IG1Qcm9wZXJ0aWVzLnNpemUoKTsKKyAgICBpZiAobnVtUHJvcGVydGllcyA+IDMyNzY3KSB7CisgICAgICAgIEFMT0dXKCJEcm9wcGluZyBleGNlc3MgcHJvcGVydGllczogbnVtUHJvcGVydGllcyAlenUiLCBudW1Qcm9wZXJ0aWVzKTsKKyAgICAgICAgbnVtUHJvcGVydGllcyA9IDMyNzY3OworICAgIH0KKyAgICBmb3IgKHNpemVfdCBwcm9wSW5kZXggPSAwOyBwcm9wSW5kZXggPCBudW1Qcm9wZXJ0aWVzOyBwcm9wSW5kZXgrKykgeworICAgICAgICBzd2l0Y2ggKG1Qcm9wZXJ0aWVzW3Byb3BJbmRleF0udHlwZSkgeworICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAndicsICdjJywgJ0MnKToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiZWdpbkJveCgiaHZjQyIpOworICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGh2Y2MgPSBtUHJvcGVydGllc1twcm9wSW5kZXhdLmh2Y2M7CisgICAgICAgICAgICAgICAgLy8gUGF0Y2ggYXZjYydzIGxlbmd0aFNpemUgZmllbGQgdG8gbWF0Y2ggdGhlIG51bWJlcgorICAgICAgICAgICAgICAgIC8vIG9mIGJ5dGVzIHdlIHVzZSB0byBpbmRpY2F0ZSB0aGUgc2l6ZSBvZiBhIG5hbCB1bml0LgorICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnB0ciA9ICh1aW50OF90ICopaHZjYy0+ZGF0YSgpOworICAgICAgICAgICAgICAgIHB0clsyMV0gPSAocHRyWzIxXSAmIDB4ZmMpIHwgKHVzZU5hbExlbmd0aEZvdXIoKSA/IDMgOiAxKTsKKyAgICAgICAgICAgICAgICB3cml0ZShodmNjLT5kYXRhKCksIGh2Y2MtPnNpemUoKSk7CisgICAgICAgICAgICAgICAgZW5kQm94KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEZPVVJDQygnaScsICdzJywgJ3AnLCAnZScpOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJlZ2luQm94KCJpc3BlIik7CisgICAgICAgICAgICAgICAgd3JpdGVJbnQzMigwKTsgLy8gVmVyc2lvbiA9IDAsIEZsYWdzID0gMAorICAgICAgICAgICAgICAgIHdyaXRlSW50MzIobVByb3BlcnRpZXNbcHJvcEluZGV4XS53aWR0aCk7CisgICAgICAgICAgICAgICAgd3JpdGVJbnQzMihtUHJvcGVydGllc1twcm9wSW5kZXhdLmhlaWdodCk7CisgICAgICAgICAgICAgICAgZW5kQm94KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEZPVVJDQygnaScsICdyJywgJ28nLCAndCcpOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJlZ2luQm94KCJpcm90Iik7CisgICAgICAgICAgICAgICAgd3JpdGVJbnQ4KG1Qcm9wZXJ0aWVzW3Byb3BJbmRleF0ucm90YXRpb24pOworICAgICAgICAgICAgICAgIGVuZEJveCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HVygiU2tpcHBpbmcgdW5yZWNvZ25pemVkIHByb3BlcnR5OiB0eXBlIDB4JTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgICBtUHJvcGVydGllc1twcm9wSW5kZXhdLnR5cGUpOworICAgICAgICB9CisgICAgfQorICAgIGVuZEJveCgpOworfQorCit2b2lkIE1QRUc0V3JpdGVyOjp3cml0ZUlwbWFCb3goKSB7CisgICAgYmVnaW5Cb3goImlwbWEiKTsKKyAgICB1aW50MzJfdCBmbGFncyA9IChtUHJvcGVydGllcy5zaXplKCkgPiAxMjcpID8gMSA6IDA7CisgICAgd3JpdGVJbnQzMihmbGFncyk7IC8vIFZlcnNpb24gPSAwCisKKyAgICB3cml0ZUludDMyKG1Bc3NvY2lhdGlvbkVudHJ5Q291bnQpOworICAgIGZvciAoc2l6ZV90IGl0ZW1JbmRleCA9IDA7IGl0ZW1JbmRleCA8IG1JdGVtcy5zaXplKCk7IGl0ZW1JbmRleCsrKSB7CisgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50MTZfdD4gJnByb3BlcnRpZXMgPSBtSXRlbXNbaXRlbUluZGV4XS5wcm9wZXJ0aWVzOworICAgICAgICBpZiAocHJvcGVydGllcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICB3cml0ZUludDE2KG1JdGVtc1tpdGVtSW5kZXhdLml0ZW1JZCk7CisKKyAgICAgICAgc2l6ZV90IGVudHJ5Q291bnQgPSBwcm9wZXJ0aWVzLnNpemUoKTsKKyAgICAgICAgaWYgKGVudHJ5Q291bnQgPiAyNTUpIHsKKyAgICAgICAgICAgIEFMT0dXKCJEcm9wcGluZyBleGNlc3MgYXNzb2NpYXRpb25zOiBlbnRyeUNvdW50ICV6dSIsIGVudHJ5Q291bnQpOworICAgICAgICAgICAgZW50cnlDb3VudCA9IDI1NTsKKyAgICAgICAgfQorICAgICAgICB3cml0ZUludDgoKHVpbnQ4X3QpZW50cnlDb3VudCk7CisgICAgICAgIGZvciAoc2l6ZV90IHByb3BJbmRleCA9IDA7IHByb3BJbmRleCA8IGVudHJ5Q291bnQ7IHByb3BJbmRleCsrKSB7CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiAxKSB7CisgICAgICAgICAgICAgICAgd3JpdGVJbnQxNigoMSA8PCAxNSkgfCBwcm9wZXJ0aWVzW3Byb3BJbmRleF0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3cml0ZUludDgoKDEgPDwgNykgfCBwcm9wZXJ0aWVzW3Byb3BJbmRleF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVuZEJveCgpOworfQorCit2b2lkIE1QRUc0V3JpdGVyOjp3cml0ZUlwcnBCb3goKSB7CisgICAgYmVnaW5Cb3goImlwcnAiKTsKKyAgICB3cml0ZUlwY29Cb3goKTsKKyAgICB3cml0ZUlwbWFCb3goKTsKKyAgICBlbmRCb3goKTsKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6d3JpdGVGaWxlTGV2ZWxNZXRhQm94KCkgeworICAgIGlmIChtSXRlbXMuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgibm8gdmFsaWQgaXRlbSB3YXMgZm91bmQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIHBhdGNoIHVwIHRoZSBtUHJpbWFyeUl0ZW1JZCBhbmQgY291bnQgaXRlbXMgd2l0aCBwcm9wIGFzc29jaWF0aW9ucworICAgIHVpbnQxNl90IGZpcnN0VmlzaWJsZUl0ZW1JZCA9IDA7CisgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IG1JdGVtcy5zaXplKCk7IGluZGV4KyspIHsKKyAgICAgICAgaWYgKG1JdGVtc1tpbmRleF0uaXNQcmltYXJ5KSB7CisgICAgICAgICAgICBtUHJpbWFyeUl0ZW1JZCA9IG1JdGVtc1tpbmRleF0uaXRlbUlkOworICAgICAgICB9IGVsc2UgaWYgKCFmaXJzdFZpc2libGVJdGVtSWQgJiYgIW1JdGVtc1tpbmRleF0uaXNIaWRkZW4pIHsKKyAgICAgICAgICAgIGZpcnN0VmlzaWJsZUl0ZW1JZCA9IG1JdGVtc1tpbmRleF0uaXRlbUlkOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtSXRlbXNbaW5kZXhdLnByb3BlcnRpZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgbUFzc29jaWF0aW9uRW50cnlDb3VudCsrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1QcmltYXJ5SXRlbUlkID09IDApIHsKKyAgICAgICAgaWYgKGZpcnN0VmlzaWJsZUl0ZW1JZCA+IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJkaWRuJ3QgZmluZCBwcmltYXJ5LCB1c2luZyBmaXJzdCB2aXNpYmxlIGl0ZW0iKTsKKyAgICAgICAgICAgIG1QcmltYXJ5SXRlbUlkID0gZmlyc3RWaXNpYmxlSXRlbUlkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIm5vIHByaW1hcnkgYW5kIG5vIHZpc2libGUgaXRlbSwgdXNpbmcgZmlyc3QgaXRlbSIpOworICAgICAgICAgICAgbVByaW1hcnlJdGVtSWQgPSBtSXRlbXNbMF0uaXRlbUlkOworICAgICAgICB9CisgICAgfQorCisgICAgYmVnaW5Cb3goIm1ldGEiKTsKKyAgICB3cml0ZUludDMyKDApOyAvLyBWZXJzaW9uID0gMCwgRmxhZ3MgPSAwCisgICAgd3JpdGVIZGxyKCJwaWN0Iik7CisgICAgd3JpdGVJbG9jQm94KCk7CisgICAgd3JpdGVJaW5mQm94KCk7CisgICAgd3JpdGVQaXRtQm94KCk7CisgICAgd3JpdGVJcHJwQm94KCk7CisgICAgaWYgKG1OdW1HcmlkcyA+IDApIHsKKyAgICAgICAgd3JpdGVJZGF0Qm94KCk7CisgICAgICAgIHdyaXRlSXJlZkJveCgpOworICAgIH0KKyAgICBlbmRCb3goKTsKK30KKwordWludDE2X3QgTVBFRzRXcml0ZXI6OmFkZFByb3BlcnR5X2woY29uc3QgSXRlbVByb3BlcnR5ICZwcm9wKSB7CisgICAgY2hhciB0eXBlU3RyWzVdOworICAgIE1ha2VGb3VyQ0NTdHJpbmcocHJvcC50eXBlLCB0eXBlU3RyKTsKKyAgICBBTE9HVigiYWRkUHJvcGVydHlfbDogJXMiLCB0eXBlU3RyKTsKKworICAgIG1Qcm9wZXJ0aWVzLnB1c2hfYmFjayhwcm9wKTsKKworICAgIC8vIHJldHVybmluZyAxLWJhc2VkIHByb3BlcnR5IGluZGV4CisgICAgcmV0dXJuIG1Qcm9wZXJ0aWVzLnNpemUoKTsKK30KKwordWludDE2X3QgTVBFRzRXcml0ZXI6OmFkZEl0ZW1fbChjb25zdCBJdGVtSW5mbyAmaW5mbykgeworICAgIEFMT0dWKCJhZGRJdGVtX2w6IHR5cGUgJXMsIG9mZnNldCAldSwgc2l6ZSAldSIsCisgICAgICAgICAgICBpbmZvLml0ZW1UeXBlLCBpbmZvLm9mZnNldCwgaW5mby5zaXplKTsKKworICAgIHNpemVfdCBpbmRleCA9IG1JdGVtcy5zaXplKCk7CisgICAgbUl0ZW1zLnB1c2hfYmFjayhpbmZvKTsKKworICAgIC8vIG1ha2UgdGhlIGl0ZW0gaWQgc3RhcnQgYXQgMTAwMDAKKyAgICBtSXRlbXMuZWRpdEl0ZW1BdChpbmRleCkuaXRlbUlkID0gaW5kZXggKyAxMDAwMDsKKworI2lmIChMT0dfTkRFQlVHPT0wKQorICAgIGlmICghaW5mby5wcm9wZXJ0aWVzLmVtcHR5KCkpIHsKKyAgICAgICAgQVN0cmluZyBzdHI7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5mby5wcm9wZXJ0aWVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgICAgICBzdHIuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyLmFwcGVuZChpbmZvLnByb3BlcnRpZXNbaV0pOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJhZGRJdGVtX2w6IGlkICVkLCBwcm9wZXJ0aWVzOiAlcyIsIG1JdGVtc1tpbmRleF0uaXRlbUlkLCBzdHIuY19zdHIoKSk7CisgICAgfQorI2VuZGlmIC8vIChMT0dfTkRFQlVHPT0wKQorCisgICAgcmV0dXJuIG1JdGVtc1tpbmRleF0uaXRlbUlkOworfQorCiAvKgogICogR2VvZGF0YSBpcyBzdG9yZWQgYWNjb3JkaW5nIHRvIElTTy02NzA5IHN0YW5kYXJkLgogICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUFkYXB0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFBZGFwdGVyLmNwcAppbmRleCBkNjgwZTBjLi5mMWI2ZThjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUFkYXB0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQWRhcHRlci5jcHAKQEAgLTQ1LDE3ICs0NSwyNCBAQAogfQogCiBzdGF0dXNfdCBNZWRpYUFkYXB0ZXI6OnN0b3AoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1BZGFwdGVyTG9jayk7Ci0gICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgIG1TdGFydGVkID0gZmFsc2U7Ci0gICAgICAgIC8vIElmIHN0b3AoKSBoYXBwZW5zIGltbWVkaWF0ZWx5IGFmdGVyIGEgcHVzaEJ1ZmZlcigpLCB3ZSBzaG91bGQKLSAgICAgICAgLy8gY2xlYW4gdXAgdGhlIG1DdXJyZW50TWVkaWFCdWZmZXIKLSAgICAgICAgaWYgKG1DdXJyZW50TWVkaWFCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgbUN1cnJlbnRNZWRpYUJ1ZmZlci0+cmVsZWFzZSgpOworICAgIE1lZGlhQnVmZmVyICpjdXJyZW50QnVmZmVyID0gTlVMTDsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtQWRhcHRlckxvY2spOworICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgICAgICAgICAvLyBJZiBzdG9wKCkgaGFwcGVucyBpbW1lZGlhdGVseSBhZnRlciBhIHB1c2hCdWZmZXIoKSwgd2Ugc2hvdWxkCisgICAgICAgICAgICAvLyBjbGVhbiB1cCB0aGUgbUN1cnJlbnRNZWRpYUJ1ZmZlci4gQnV0IG5lZWQgdG8gcmVsZWFzZSB3aXRob3V0CisgICAgICAgICAgICAvLyB0aGUgbG9jayBhcyBzaWduYWxCdWZmZXJSZXR1cm5lZCgpIHdpbGwgYWNxdWlyZSB0aGUgbG9jay4KKyAgICAgICAgICAgIGN1cnJlbnRCdWZmZXIgPSBtQ3VycmVudE1lZGlhQnVmZmVyOwogICAgICAgICAgICAgbUN1cnJlbnRNZWRpYUJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgICAgIC8vIFdoaWxlIHJlYWQoKSBpcyBzdGlsbCB3YWl0aW5nLCB3ZSBzaG91bGQgc2lnbmFsIGl0IHRvIGZpbmlzaC4KKyAgICAgICAgICAgIG1CdWZmZXJSZWFkQ29uZC5zaWduYWwoKTsKICAgICAgICAgfQotICAgICAgICAvLyBXaGlsZSByZWFkKCkgaXMgc3RpbGwgd2FpdGluZywgd2Ugc2hvdWxkIHNpZ25hbCBpdCB0byBmaW5pc2guCi0gICAgICAgIG1CdWZmZXJSZWFkQ29uZC5zaWduYWwoKTsKKyAgICB9CisgICAgaWYgKGN1cnJlbnRCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICBjdXJyZW50QnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgIGN1cnJlbnRCdWZmZXIgPSBOVUxMOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CkBAIC02NSw3ICs3Miw3IEBACiAgICAgcmV0dXJuIG1PdXRwdXRGb3JtYXQ7CiB9CiAKLXZvaWQgTWVkaWFBZGFwdGVyOjpzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7Cit2b2lkIE1lZGlhQWRhcHRlcjo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUFkYXB0ZXJMb2NrKTsKICAgICBDSEVDSyhidWZmZXIgIT0gTlVMTCk7CiAgICAgYnVmZmVyLT5zZXRPYnNlcnZlcigwKTsKQEAgLTc1LDcgKzgyLDcgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFBZGFwdGVyOjpyZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICogLyogb3B0aW9ucyAqLykgeworICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqIC8qIG9wdGlvbnMgKi8pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUFkYXB0ZXJMb2NrKTsKICAgICBpZiAoIW1TdGFydGVkKSB7CiAgICAgICAgIEFMT0dWKCJSZWFkIGJlZm9yZSBldmVuIHN0YXJ0ZWQhIik7CkBAIC05Nyw3ICsxMDQsNiBAQAogCiAgICAgKmJ1ZmZlciA9IG1DdXJyZW50TWVkaWFCdWZmZXI7CiAgICAgbUN1cnJlbnRNZWRpYUJ1ZmZlciA9IE5VTEw7Ci0gICAgKCpidWZmZXIpLT5zZXRPYnNlcnZlcih0aGlzKTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTExNCw2ICsxMjAsNyBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIG1DdXJyZW50TWVkaWFCdWZmZXIgPSBidWZmZXI7CisgICAgbUN1cnJlbnRNZWRpYUJ1ZmZlci0+c2V0T2JzZXJ2ZXIodGhpcyk7CiAgICAgbUJ1ZmZlclJlYWRDb25kLnNpZ25hbCgpOwogCiAgICAgQUxPR1YoIndhaXQgZm9yIHRoZSBidWZmZXIgcmV0dXJuZWQgQCBwdXNoQnVmZmVyISAlcCIsIGJ1ZmZlcik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNsb2NrLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ2xvY2suY3BwCmluZGV4IDNhYTAwNjEuLjQxZGJmZDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ2xvY2suY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ2xvY2suY3BwCkBAIC0xNywxMSArMTcsMTIgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTWVkaWFDbG9jayIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxtYXA+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNsb2NrLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0yOSwxNSArMzAsNTAgQEAKIC8vIElmIGxhcmdlciB0aGFuIHRoaXMgdGhyZXNob2xkLCBpdCdzIHRyZWF0ZWQgYXMgZGlzY29udGludWl0eS4KIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtBbmNob3JGbHVjdHVhdGlvbkFsbG93ZWRVcyA9IDEwMDAwbGw7CiAKK01lZGlhQ2xvY2s6OlRpbWVyOjpUaW1lcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgaW50NjRfdCBtZWRpYVRpbWVVcywgaW50NjRfdCBhZGp1c3RSZWFsVXMpCisgICAgOiBtTm90aWZ5KG5vdGlmeSksCisgICAgICBtTWVkaWFUaW1lVXMobWVkaWFUaW1lVXMpLAorICAgICAgbUFkanVzdFJlYWxVcyhhZGp1c3RSZWFsVXMpIHsKK30KKwogTWVkaWFDbG9jazo6TWVkaWFDbG9jaygpCiAgICAgOiBtQW5jaG9yVGltZU1lZGlhVXMoLTEpLAogICAgICAgbUFuY2hvclRpbWVSZWFsVXMoLTEpLAogICAgICAgbU1heFRpbWVNZWRpYVVzKElOVDY0X01BWCksCiAgICAgICBtU3RhcnRpbmdUaW1lTWVkaWFVcygtMSksCi0gICAgICBtUGxheWJhY2tSYXRlKDEuMCkgeworICAgICAgbVBsYXliYWNrUmF0ZSgxLjApLAorICAgICAgbUdlbmVyYXRpb24oMCkgeworICAgIG1Mb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBtTG9vcGVyLT5zZXROYW1lKCJNZWRpYUNsb2NrIik7CisgICAgbUxvb3Blci0+c3RhcnQoZmFsc2UgLyogcnVuT25DYWxsaW5nVGhyZWFkICovLAorICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGNhbkNhbGxKYXZhICovLAorICAgICAgICAgICAgICAgICAgIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOworfQorCit2b2lkIE1lZGlhQ2xvY2s6OmluaXQoKSB7CisgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXMpOwogfQogCiBNZWRpYUNsb2NrOjp+TWVkaWFDbG9jaygpIHsKKyAgICByZXNldCgpOworICAgIGlmIChtTG9vcGVyICE9IE5VTEwpIHsKKyAgICAgICAgbUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIoaWQoKSk7CisgICAgICAgIG1Mb29wZXItPnN0b3AoKTsKKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFDbG9jazo6cmVzZXQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBhdXRvIGl0ID0gbVRpbWVycy5iZWdpbigpOworICAgIHdoaWxlIChpdCAhPSBtVGltZXJzLmVuZCgpKSB7CisgICAgICAgIGl0LT5tTm90aWZ5LT5zZXRJbnQzMigicmVhc29uIiwgVElNRVJfUkVBU09OX1JFU0VUKTsKKyAgICAgICAgaXQtPm1Ob3RpZnktPnBvc3QoKTsKKyAgICAgICAgaXQgPSBtVGltZXJzLmVyYXNlKGl0KTsKKyAgICB9CisgICAgbU1heFRpbWVNZWRpYVVzID0gSU5UNjRfTUFYOworICAgIG1TdGFydGluZ1RpbWVNZWRpYVVzID0gLTE7CisgICAgdXBkYXRlQW5jaG9yVGltZXNBbmRQbGF5YmFja1JhdGVfbCgtMSwgLTEsIDEuMCk7CisgICAgKyttR2VuZXJhdGlvbjsKIH0KIAogdm9pZCBNZWRpYUNsb2NrOjpzZXRTdGFydGluZ1RpbWVNZWRpYShpbnQ2NF90IHN0YXJ0aW5nVGltZU1lZGlhVXMpIHsKQEAgLTQ3LDggKzgzLDcgQEAKIAogdm9pZCBNZWRpYUNsb2NrOjpjbGVhckFuY2hvcigpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIG1BbmNob3JUaW1lTWVkaWFVcyA9IC0xOwotICAgIG1BbmNob3JUaW1lUmVhbFVzID0gLTE7CisgICAgdXBkYXRlQW5jaG9yVGltZXNBbmRQbGF5YmFja1JhdGVfbCgtMSwgLTEsIG1QbGF5YmFja1JhdGUpOwogfQogCiB2b2lkIE1lZGlhQ2xvY2s6OnVwZGF0ZUFuY2hvcigKQEAgLTgwLDggKzExNSwxMCBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQotICAgIG1BbmNob3JUaW1lUmVhbFVzID0gbm93VXM7Ci0gICAgbUFuY2hvclRpbWVNZWRpYVVzID0gbm93TWVkaWFVczsKKyAgICB1cGRhdGVBbmNob3JUaW1lc0FuZFBsYXliYWNrUmF0ZV9sKG5vd01lZGlhVXMsIG5vd1VzLCBtUGxheWJhY2tSYXRlKTsKKworICAgICsrbUdlbmVyYXRpb247CisgICAgcHJvY2Vzc1RpbWVyc19sKCk7CiB9CiAKIHZvaWQgTWVkaWFDbG9jazo6dXBkYXRlTWF4VGltZU1lZGlhKGludDY0X3QgbWF4VGltZU1lZGlhVXMpIHsKQEAgLTk4LDEzICsxMzUsMTcgQEAKICAgICB9CiAKICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICBtQW5jaG9yVGltZU1lZGlhVXMgKz0gKG5vd1VzIC0gbUFuY2hvclRpbWVSZWFsVXMpICogKGRvdWJsZSltUGxheWJhY2tSYXRlOwotICAgIGlmIChtQW5jaG9yVGltZU1lZGlhVXMgPCAwKSB7CisgICAgaW50NjRfdCBub3dNZWRpYVVzID0gbUFuY2hvclRpbWVNZWRpYVVzICsgKG5vd1VzIC0gbUFuY2hvclRpbWVSZWFsVXMpICogKGRvdWJsZSltUGxheWJhY2tSYXRlOworICAgIGlmIChub3dNZWRpYVVzIDwgMCkgewogICAgICAgICBBTE9HVygic2V0UmF0ZTogYW5jaG9yIHRpbWUgc2hvdWxkIG5vdCBiZSBuZWdhdGl2ZSwgc2V0IHRvIDAuIik7Ci0gICAgICAgIG1BbmNob3JUaW1lTWVkaWFVcyA9IDA7CisgICAgICAgIG5vd01lZGlhVXMgPSAwOwogICAgIH0KLSAgICBtQW5jaG9yVGltZVJlYWxVcyA9IG5vd1VzOwotICAgIG1QbGF5YmFja1JhdGUgPSByYXRlOworICAgIHVwZGF0ZUFuY2hvclRpbWVzQW5kUGxheWJhY2tSYXRlX2wobm93TWVkaWFVcywgbm93VXMsIHJhdGUpOworCisgICAgaWYgKHJhdGUgPiAwLjApIHsKKyAgICAgICAgKyttR2VuZXJhdGlvbjsKKyAgICAgICAgcHJvY2Vzc1RpbWVyc19sKCk7CisgICAgfQogfQogCiBmbG9hdCBNZWRpYUNsb2NrOjpnZXRQbGF5YmFja1JhdGUoKSBjb25zdCB7CkBAIC0xNjUsNCArMjA2LDEzMyBAQAogICAgIHJldHVybiBPSzsKIH0KIAordm9pZCBNZWRpYUNsb2NrOjphZGRUaW1lcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgaW50NjRfdCBtZWRpYVRpbWVVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBhZGp1c3RSZWFsVXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgYm9vbCB1cGRhdGVUaW1lciA9IChtUGxheWJhY2tSYXRlICE9IDAuMCk7CisgICAgaWYgKHVwZGF0ZVRpbWVyKSB7CisgICAgICAgIGF1dG8gaXQgPSBtVGltZXJzLmJlZ2luKCk7CisgICAgICAgIHdoaWxlIChpdCAhPSBtVGltZXJzLmVuZCgpKSB7CisgICAgICAgICAgICBpZiAoKChpdC0+bUFkanVzdFJlYWxVcyAtIChkb3VibGUpYWRqdXN0UmVhbFVzKSAqIChkb3VibGUpbVBsYXliYWNrUmF0ZQorICAgICAgICAgICAgICAgICsgKGl0LT5tTWVkaWFUaW1lVXMgLSBtZWRpYVRpbWVVcykpIDw9IDApIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVUaW1lciA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1UaW1lcnMuZW1wbGFjZV9iYWNrKG5vdGlmeSwgbWVkaWFUaW1lVXMsIGFkanVzdFJlYWxVcyk7CisKKyAgICBpZiAodXBkYXRlVGltZXIpIHsKKyAgICAgICAgKyttR2VuZXJhdGlvbjsKKyAgICAgICAgcHJvY2Vzc1RpbWVyc19sKCk7CisgICAgfQorfQorCit2b2lkIE1lZGlhQ2xvY2s6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0VGltZUlzVXA6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IG1HZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcm9jZXNzVGltZXJzX2woKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFDbG9jazo6cHJvY2Vzc1RpbWVyc19sKCkgeworICAgIGludDY0X3Qgbm93TWVkaWFUaW1lVXM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0TWVkaWFUaW1lX2woCisgICAgICAgICAgICBBTG9vcGVyOjpHZXROb3dVcygpLCAmbm93TWVkaWFUaW1lVXMsIGZhbHNlIC8qIGFsbG93UGFzdE1heFRpbWUgKi8pOworCisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50NjRfdCBuZXh0TGFwc2VSZWFsVXMgPSBJTlQ2NF9NQVg7CisgICAgc3RkOjptdWx0aW1hcDxpbnQ2NF90LCBUaW1lcj4gbm90aWZ5TGlzdDsKKyAgICBhdXRvIGl0ID0gbVRpbWVycy5iZWdpbigpOworICAgIHdoaWxlIChpdCAhPSBtVGltZXJzLmVuZCgpKSB7CisgICAgICAgIGRvdWJsZSBkaWZmID0gaXQtPm1BZGp1c3RSZWFsVXMgKiAoZG91YmxlKW1QbGF5YmFja1JhdGUKKyAgICAgICAgICAgICsgaXQtPm1NZWRpYVRpbWVVcyAtIG5vd01lZGlhVGltZVVzOworICAgICAgICBpbnQ2NF90IGRpZmZNZWRpYVVzOworICAgICAgICBpZiAoZGlmZiA+IChkb3VibGUpSU5UNjRfTUFYKSB7CisgICAgICAgICAgICBkaWZmTWVkaWFVcyA9IElOVDY0X01BWDsKKyAgICAgICAgfSBlbHNlIGlmIChkaWZmIDwgKGRvdWJsZSlJTlQ2NF9NSU4pIHsKKyAgICAgICAgICAgIGRpZmZNZWRpYVVzID0gSU5UNjRfTUlOOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGlmZk1lZGlhVXMgPSBkaWZmOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRpZmZNZWRpYVVzIDw9IDApIHsKKyAgICAgICAgICAgIG5vdGlmeUxpc3QuZW1wbGFjZShkaWZmTWVkaWFVcywgKml0KTsKKyAgICAgICAgICAgIGl0ID0gbVRpbWVycy5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobVBsYXliYWNrUmF0ZSAhPSAwLjAKKyAgICAgICAgICAgICAgICAmJiAoZG91YmxlKWRpZmZNZWRpYVVzIDwgSU5UNjRfTUFYICogKGRvdWJsZSltUGxheWJhY2tSYXRlKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCB0YXJnZXRSZWFsVXMgPSBkaWZmTWVkaWFVcyAvIChkb3VibGUpbVBsYXliYWNrUmF0ZTsKKyAgICAgICAgICAgICAgICBpZiAodGFyZ2V0UmVhbFVzIDwgbmV4dExhcHNlUmVhbFVzKSB7CisgICAgICAgICAgICAgICAgICAgIG5leHRMYXBzZVJlYWxVcyA9IHRhcmdldFJlYWxVczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2l0OworICAgICAgICB9CisgICAgfQorCisgICAgYXV0byBpdE5vdGlmeSA9IG5vdGlmeUxpc3QuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXROb3RpZnkgIT0gbm90aWZ5TGlzdC5lbmQoKSkgeworICAgICAgICBpdE5vdGlmeS0+c2Vjb25kLm1Ob3RpZnktPnNldEludDMyKCJyZWFzb24iLCBUSU1FUl9SRUFTT05fUkVBQ0hFRCk7CisgICAgICAgIGl0Tm90aWZ5LT5zZWNvbmQubU5vdGlmeS0+cG9zdCgpOworICAgICAgICBpdE5vdGlmeSA9IG5vdGlmeUxpc3QuZXJhc2UoaXROb3RpZnkpOworICAgIH0KKworICAgIGlmIChtVGltZXJzLmVtcHR5KCkgfHwgbVBsYXliYWNrUmF0ZSA9PSAwLjAgfHwgbUFuY2hvclRpbWVNZWRpYVVzIDwgMAorICAgICAgICB8fCBuZXh0TGFwc2VSZWFsVXMgPT0gSU5UNjRfTUFYKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0VGltZUlzVXAsIHRoaXMpOworICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtR2VuZXJhdGlvbik7CisgICAgbXNnLT5wb3N0KG5leHRMYXBzZVJlYWxVcyk7Cit9CisKK3ZvaWQgTWVkaWFDbG9jazo6dXBkYXRlQW5jaG9yVGltZXNBbmRQbGF5YmFja1JhdGVfbChpbnQ2NF90IGFuY2hvclRpbWVNZWRpYVVzLAorICAgICAgICBpbnQ2NF90IGFuY2hvclRpbWVSZWFsVXMsIGZsb2F0IHBsYXliYWNrUmF0ZSkgeworICAgIGlmIChtQW5jaG9yVGltZU1lZGlhVXMgIT0gYW5jaG9yVGltZU1lZGlhVXMKKyAgICAgICAgICAgIHx8IG1BbmNob3JUaW1lUmVhbFVzICE9IGFuY2hvclRpbWVSZWFsVXMKKyAgICAgICAgICAgIHx8IG1QbGF5YmFja1JhdGUgIT0gcGxheWJhY2tSYXRlKSB7CisgICAgICAgIG1BbmNob3JUaW1lTWVkaWFVcyA9IGFuY2hvclRpbWVNZWRpYVVzOworICAgICAgICBtQW5jaG9yVGltZVJlYWxVcyA9IGFuY2hvclRpbWVSZWFsVXM7CisgICAgICAgIG1QbGF5YmFja1JhdGUgPSBwbGF5YmFja1JhdGU7CisgICAgICAgIG5vdGlmeURpc2NvbnRpbnVpdHlfbCgpOworICAgIH0KK30KKwordm9pZCBNZWRpYUNsb2NrOjpzZXROb3RpZmljYXRpb25NZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBtTm90aWZ5ID0gbXNnOworfQorCit2b2lkIE1lZGlhQ2xvY2s6Om5vdGlmeURpc2NvbnRpbnVpdHlfbCgpIHsKKyAgICBpZiAobU5vdGlmeSAhPSBudWxscHRyKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgbXNnLT5zZXRJbnQ2NCgiYW5jaG9yLW1lZGlhLXVzIiwgbUFuY2hvclRpbWVNZWRpYVVzKTsKKyAgICAgICAgbXNnLT5zZXRJbnQ2NCgiYW5jaG9yLXJlYWwtdXMiLCBtQW5jaG9yVGltZVJlYWxVcyk7CisgICAgICAgIG1zZy0+c2V0RmxvYXQoInBsYXliYWNrLXJhdGUiLCBtUGxheWJhY2tSYXRlKTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgfQorfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcAppbmRleCA3NTllNDJkLi4wNmE0OWQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcApAQCAtMTYsMTIgKzE2LDE1IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTWVkaWFDb2RlYyIKLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCiAjaW5jbHVkZSAiaW5jbHVkZS9TZWN1cmVCdWZmZXIuaCIKICNpbmNsdWRlICJpbmNsdWRlL1NoYXJlZE1lbW9yeUJ1ZmZlci5oIgogI2luY2x1ZGUgImluY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oIgorI2luY2x1ZGUgIlN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmgiCiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy9uYXRpdmUvMS4wL0lEZXNjcmFtYmxlci5oPgogCkBAIC0yOSw2ICszMiw3IEBACiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGd1aS9CdWZmZXJRdWV1ZS5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgpAQCAtNDEsNiArNDUsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQnVmZmVyUHJvZHVjZXJXcmFwcGVyLmg+CkBAIC00OSwxMyArNTQsMTEgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRmlsdGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9QZXJzaXN0ZW50U3VyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvQmF0dGVyeU5vdGlmaWVyLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvU2luZ2xldG9uLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTYzLDIzICs2Niw0NCBAQAogLy8ga2V5IGZvciBtZWRpYSBzdGF0aXN0aWNzCiBzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjS2V5TmFtZSA9ICJjb2RlYyI7CiAvLyBhdHRycyBmb3IgbWVkaWEgc3RhdGlzdGljcworLy8gTkI6IHRoZXNlIGFyZSBtYXRjaGVkIHdpdGggcHVibGljIEphdmEgQVBJIGNvbnN0YW50cyBkZWZpbmVkCisvLyBpbiBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhQ29kZWMuamF2YQorLy8gVGhlc2UgbXVzdCBiZSBrZXB0IHN5bmNocm9uaXplZCB3aXRoIHRoZSBjb25zdGFudHMgdGhlcmUuCiBzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjQ29kZWMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmNvZGVjIjsgIC8qIGUuZy4gT01YLmdvb2dsZS5hYWMuZGVjb2RlciAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY01pbWUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLm1pbWUiOyAgICAvKiBlLmcuIGF1ZGlvL21pbWUgKi8KIHN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNNb2RlID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5tb2RlIjsgICAgLyogYXVkaW8sIHZpZGVvICovCi1zdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjU2VjdXJlID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5zZWN1cmUiOyAgIC8qIDAsIDEgKi8KLXN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNIZWlnaHQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmhlaWdodCI7ICAgLyogMC4ubiAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY1dpZHRoID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy53aWR0aCI7ICAgICAvKiAwLi5uICovCi1zdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjUm90YXRpb24gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnJvdGF0aW9uLWRlZ3JlZXMiOyAgLyogMC85MC8xODAvMjcwICovCi1zdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjQ3J5cHRvID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5jcnlwdG8iOyAgIC8qIDAsMSAqLworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY01vZGVWaWRlbyA9ICJ2aWRlbyI7ICAgICAgICAgICAgLyogdmFsdWVzIHJldHVybmVkIGZvciBrQ29kZWNNb2RlICovCitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjTW9kZUF1ZGlvID0gImF1ZGlvIjsKIHN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNFbmNvZGVyID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5lbmNvZGVyIjsgLyogMCwxICovCitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjU2VjdXJlID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5zZWN1cmUiOyAgIC8qIDAsIDEgKi8KK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNXaWR0aCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMud2lkdGgiOyAgICAgLyogMC4ubiAqLworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY0hlaWdodCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuaGVpZ2h0IjsgICAvKiAwLi5uICovCitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjUm90YXRpb24gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnJvdGF0aW9uLWRlZ3JlZXMiOyAgLyogMC85MC8xODAvMjcwICovCiAKLXN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNCeXRlc0luID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5ieXRlc2luIjsgIC8qIDAuLm4gKi8KKy8vIE5COiBUaGVzZSBhcmUgbm90IHlldCBleHBvc2VkIGFzIHB1YmxpYyBKYXZhIEFQSSBjb25zdGFudHMuCitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjQ3J5cHRvID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5jcnlwdG8iOyAgIC8qIDAsMSAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY1Byb2ZpbGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnByb2ZpbGUiOyAgLyogMC4ubiAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY0xldmVsID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5sZXZlbCI7ICAvKiAwLi5uICovCiBzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjTWF4V2lkdGggPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLm1heHdpZHRoIjsgIC8qIDAuLm4gKi8KIHN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNNYXhIZWlnaHQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLm1heGhlaWdodCI7ICAvKiAwLi5uICovCiBzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjRXJyb3IgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmVycmNvZGUiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY0Vycm9yU3RhdGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmVycnN0YXRlIjsKK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNMYXRlbmN5TWF4ID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5sYXRlbmN5Lm1heCI7ICAgLyogaW4gdXMgKi8KK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNMYXRlbmN5TWluID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5sYXRlbmN5Lm1pbiI7ICAgLyogaW4gdXMgKi8KK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNMYXRlbmN5QXZnID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5sYXRlbmN5LmF2ZyI7ICAgLyogaW4gdXMgKi8KK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNMYXRlbmN5Q291bnQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmxhdGVuY3kubiI7CitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjTGF0ZW5jeUhpc3QgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmxhdGVuY3kuaGlzdCI7IC8qIGluIHVzICovCitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjTGF0ZW5jeVVua25vd24gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmxhdGVuY3kudW5rbm93biI7CisKKy8vIHRoZSBrQ29kZWNSZWNlbnQqIGZpZWxkcyBhcHBlYXIgb25seSBpbiBnZXRNZXRyaWNzKCkgcmVzdWx0cworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY1JlY2VudExhdGVuY3lNYXggPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnJlY2VudC5tYXgiOyAgICAgIC8qIGluIHVzICovCitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjUmVjZW50TGF0ZW5jeU1pbiA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMucmVjZW50Lm1pbiI7ICAgICAgLyogaW4gdXMgKi8KK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNSZWNlbnRMYXRlbmN5QXZnID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5yZWNlbnQuYXZnIjsgICAgICAvKiBpbiB1cyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY1JlY2VudExhdGVuY3lDb3VudCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMucmVjZW50Lm4iOworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY1JlY2VudExhdGVuY3lIaXN0ID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5yZWNlbnQuaGlzdCI7ICAgIC8qIGluIHVzICovCisKKy8vIFhYWCBzdXBwcmVzcyB1bnRpbCB3ZSBnZXQgb3VyIHJlcHJlc2VudGF0aW9uIHJpZ2h0CitzdGF0aWMgYm9vbCBrRW1pdEhpc3RvZ3JhbSA9IGZhbHNlOwogCiAKIHN0YXRpYyBpbnQ2NF90IGdldElkKGNvbnN0IHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+ICZjbGllbnQpIHsKQEAgLTQxNCwxMyArNDM4LDMxIEBACiBzcDxNZWRpYUNvZGVjPiBNZWRpYUNvZGVjOjpDcmVhdGVCeVR5cGUoCiAgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIGNvbnN0IEFTdHJpbmcgJm1pbWUsIGJvb2wgZW5jb2Rlciwgc3RhdHVzX3QgKmVyciwgcGlkX3QgcGlkLAogICAgICAgICB1aWRfdCB1aWQpIHsKLSAgICBzcDxNZWRpYUNvZGVjPiBjb2RlYyA9IG5ldyBNZWRpYUNvZGVjKGxvb3BlciwgcGlkLCB1aWQpOworICAgIFZlY3RvcjxBU3RyaW5nPiBtYXRjaGluZ0NvZGVjczsKIAotICAgIGNvbnN0IHN0YXR1c190IHJldCA9IGNvZGVjLT5pbml0KG1pbWUsIHRydWUgLyogbmFtZUlzVHlwZSAqLywgZW5jb2Rlcik7CisgICAgTWVkaWFDb2RlY0xpc3Q6OmZpbmRNYXRjaGluZ0NvZGVjcygKKyAgICAgICAgICAgIG1pbWUuY19zdHIoKSwKKyAgICAgICAgICAgIGVuY29kZXIsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgJm1hdGNoaW5nQ29kZWNzKTsKKwogICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICAqZXJyID0gcmV0OworICAgICAgICAqZXJyID0gTkFNRV9OT1RfRk9VTkQ7CiAgICAgfQotICAgIHJldHVybiByZXQgPT0gT0sgPyBjb2RlYyA6IE5VTEw7IC8vIE5VTEwgZGVhbGxvY2F0ZXMgY29kZWMuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXRjaGluZ0NvZGVjcy5zaXplKCk7ICsraSkgeworICAgICAgICBzcDxNZWRpYUNvZGVjPiBjb2RlYyA9IG5ldyBNZWRpYUNvZGVjKGxvb3BlciwgcGlkLCB1aWQpOworICAgICAgICBBU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBtYXRjaGluZ0NvZGVjc1tpXTsKKyAgICAgICAgc3RhdHVzX3QgcmV0ID0gY29kZWMtPmluaXQoY29tcG9uZW50TmFtZSk7CisgICAgICAgIGlmIChlcnIgIT0gTlVMTCkgeworICAgICAgICAgICAgKmVyciA9IHJldDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0ID09IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gY29kZWM7CisgICAgICAgIH0KKyAgICAgICAgQUxPR0QoIkFsbG9jYXRpbmcgY29tcG9uZW50ICclcycgZmFpbGVkICglZCksIHRyeSBuZXh0IG9uZS4iLAorICAgICAgICAgICAgICAgIGNvbXBvbmVudE5hbWUuY19zdHIoKSwgcmV0KTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8vIHN0YXRpYwpAQCAtNDI4LDcgKzQ3MCw3IEBACiAgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIGNvbnN0IEFTdHJpbmcgJm5hbWUsIHN0YXR1c190ICplcnIsIHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7CiAgICAgc3A8TWVkaWFDb2RlYz4gY29kZWMgPSBuZXcgTWVkaWFDb2RlYyhsb29wZXIsIHBpZCwgdWlkKTsKIAotICAgIGNvbnN0IHN0YXR1c190IHJldCA9IGNvZGVjLT5pbml0KG5hbWUsIGZhbHNlIC8qIG5hbWVJc1R5cGUgKi8sIGZhbHNlIC8qIGVuY29kZXIgKi8pOworICAgIGNvbnN0IHN0YXR1c190IHJldCA9IGNvZGVjLT5pbml0KG5hbWUpOwogICAgIGlmIChlcnIgIT0gTlVMTCkgewogICAgICAgICAqZXJyID0gcmV0OwogICAgIH0KQEAgLTQ4MCwxMiArNTIyLDE1IEBACiAgICAgICBtRGVxdWV1ZU91dHB1dFRpbWVvdXRHZW5lcmF0aW9uKDApLAogICAgICAgbURlcXVldWVPdXRwdXRSZXBseUlEKDApLAogICAgICAgbUhhdmVJbnB1dFN1cmZhY2UoZmFsc2UpLAotICAgICAgbUhhdmVQZW5kaW5nSW5wdXRCdWZmZXJzKGZhbHNlKSB7CisgICAgICBtSGF2ZVBlbmRpbmdJbnB1dEJ1ZmZlcnMoZmFsc2UpLAorICAgICAgbUNwdUJvb3N0UmVxdWVzdGVkKGZhbHNlKSwKKyAgICAgIG1MYXRlbmN5VW5rbm93bigwKSB7CiAgICAgaWYgKHVpZCA9PSBrTm9VaWQpIHsKICAgICAgICAgbVVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKICAgICB9IGVsc2UgewogICAgICAgICBtVWlkID0gdWlkOwogICAgIH0KKwogICAgIGluaXRBbmFseXRpY3NJdGVtKCk7CiB9CiAKQEAgLTQ5NywyMSArNTQyLDkzIEBACiB9CiAKIHZvaWQgTWVkaWFDb2RlYzo6aW5pdEFuYWx5dGljc0l0ZW0oKSB7Ci0gICAgQ0hFQ0sobUFuYWx5dGljc0l0ZW0gPT0gTlVMTCk7Ci0gICAgLy8gc2V0IHVwIG91ciBuZXcgcmVjb3JkLCBnZXQgYSBzZXNzaW9uSUQsIHB1dCBpdCBpbnRvIHRoZSBpbi1wcm9ncmVzcyBsaXN0Ci0gICAgbUFuYWx5dGljc0l0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKGtDb2RlY0tleU5hbWUpOwotICAgIGlmIChtQW5hbHl0aWNzSXRlbSAhPSBOVUxMKSB7Ci0gICAgICAgICh2b2lkKSBtQW5hbHl0aWNzSXRlbS0+Z2VuZXJhdGVTZXNzaW9uSUQoKTsKLSAgICAgICAgLy8gZG9uJ3QgcmVjb3JkIGl0IHlldDsgb25seSBhdCB0aGUgZW5kLCB3aGVuIHdlIGhhdmUgZGVjaWRlZCB0aGF0IHdlIGhhdmUKLSAgICAgICAgLy8gZGF0YSB3b3J0aCB3cml0aW5nIChlLmcuIC5jb3VudCgpID4gMCkKKyAgICBpZiAobUFuYWx5dGljc0l0ZW0gPT0gTlVMTCkgeworICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0NvZGVjS2V5TmFtZSk7CisgICAgfQorCisgICAgbUxhdGVuY3lIaXN0LnNldHVwKGtMYXRlbmN5SGlzdEJ1Y2tldHMsIGtMYXRlbmN5SGlzdFdpZHRoLCBrTGF0ZW5jeUhpc3RGbG9vcik7CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtUmVjZW50TG9jayk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpPGtSZWNlbnRMYXRlbmN5RnJhbWVzOyBpKyspIHsKKyAgICAgICAgICAgIG1SZWNlbnRTYW1wbGVzW2ldID0ga1JlY2VudFNhbXBsZUludmFsaWQ7CisgICAgICAgIH0KKyAgICAgICAgbVJlY2VudEhlYWQgPSAwOworICAgIH0KK30KKwordm9pZCBNZWRpYUNvZGVjOjp1cGRhdGVBbmFseXRpY3NJdGVtKCkgeworICAgIEFMT0dWKCJNZWRpYUNvZGVjOjp1cGRhdGVBbmFseXRpY3NJdGVtIik7CisgICAgaWYgKG1BbmFseXRpY3NJdGVtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtTGF0ZW5jeUhpc3QuZ2V0Q291bnQoKSAhPSAwICkgeworICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa0NvZGVjTGF0ZW5jeU1heCwgbUxhdGVuY3lIaXN0LmdldE1heCgpKTsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtDb2RlY0xhdGVuY3lNaW4sIG1MYXRlbmN5SGlzdC5nZXRNaW4oKSk7CisgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrQ29kZWNMYXRlbmN5QXZnLCBtTGF0ZW5jeUhpc3QuZ2V0QXZnKCkpOworICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa0NvZGVjTGF0ZW5jeUNvdW50LCBtTGF0ZW5jeUhpc3QuZ2V0Q291bnQoKSk7CisKKyAgICAgICAgaWYgKGtFbWl0SGlzdG9ncmFtKSB7CisgICAgICAgICAgICAvLyBhbmQgdGhlIGhpc3RvZ3JhbSBpdHNlbGYKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGhpc3QgPSBtTGF0ZW5jeUhpc3QuZW1pdCgpOworICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa0NvZGVjTGF0ZW5jeUhpc3QsIGhpc3QuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1MYXRlbmN5VW5rbm93biA+IDApIHsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtDb2RlY0xhdGVuY3lVbmtub3duLCBtTGF0ZW5jeVVua25vd24pOworICAgIH0KKworI2lmIDAKKyAgICAvLyBlbmFibGUgZm9yIHNob3J0IHRlcm0sIG9ubHkgd2hpbGUgZGVidWdnaW5nCisgICAgdXBkYXRlRXBoZW1lcmFsQW5hbHl0aWNzKG1BbmFseXRpY3NJdGVtKTsKKyNlbmRpZgorfQorCit2b2lkIE1lZGlhQ29kZWM6OnVwZGF0ZUVwaGVtZXJhbEFuYWx5dGljcyhNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0pIHsKKyAgICBBTE9HRCgiTWVkaWFDb2RlYzo6dXBkYXRlRXBoZW1lcmFsQW5hbHl0aWNzKCkiKTsKKworICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEhpc3RvZ3JhbSByZWNlbnRIaXN0OworCisgICAgLy8gYnVpbGQgYW4gZW1wdHkgaGlzdG9ncmFtCisgICAgcmVjZW50SGlzdC5zZXR1cChrTGF0ZW5jeUhpc3RCdWNrZXRzLCBrTGF0ZW5jeUhpc3RXaWR0aCwga0xhdGVuY3lIaXN0Rmxvb3IpOworCisgICAgLy8gc3R1ZmYgaXQgd2l0aCB0aGUgc2FtcGxlcyBpbiB0aGUgcmluZyBidWZmZXIKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtUmVjZW50TG9jayk7CisKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPGtSZWNlbnRMYXRlbmN5RnJhbWVzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtUmVjZW50U2FtcGxlc1tpXSAhPSBrUmVjZW50U2FtcGxlSW52YWxpZCkgeworICAgICAgICAgICAgICAgIHJlY2VudEhpc3QuaW5zZXJ0KG1SZWNlbnRTYW1wbGVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gc3BpdCB0aGUgZGF0YSAoaWYgYW55KSBpbnRvIHRoZSBzdXBwbGllZCBhbmFseXRpY3MgcmVjb3JkCisgICAgaWYgKHJlY2VudEhpc3QuZ2V0Q291bnQoKSE9IDAgKSB7CisgICAgICAgIGl0ZW0tPnNldEludDY0KGtDb2RlY1JlY2VudExhdGVuY3lNYXgsIHJlY2VudEhpc3QuZ2V0TWF4KCkpOworICAgICAgICBpdGVtLT5zZXRJbnQ2NChrQ29kZWNSZWNlbnRMYXRlbmN5TWluLCByZWNlbnRIaXN0LmdldE1pbigpKTsKKyAgICAgICAgaXRlbS0+c2V0SW50NjQoa0NvZGVjUmVjZW50TGF0ZW5jeUF2ZywgcmVjZW50SGlzdC5nZXRBdmcoKSk7CisgICAgICAgIGl0ZW0tPnNldEludDY0KGtDb2RlY1JlY2VudExhdGVuY3lDb3VudCwgcmVjZW50SGlzdC5nZXRDb3VudCgpKTsKKworICAgICAgICBpZiAoa0VtaXRIaXN0b2dyYW0pIHsKKyAgICAgICAgICAgIC8vIGFuZCB0aGUgaGlzdG9ncmFtIGl0c2VsZgorICAgICAgICAgICAgc3RkOjpzdHJpbmcgaGlzdCA9IHJlY2VudEhpc3QuZW1pdCgpOworICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQ29kZWNSZWNlbnRMYXRlbmN5SGlzdCwgaGlzdC5jX3N0cigpKTsKKyAgICAgICAgfQogICAgIH0KIH0KIAogdm9pZCBNZWRpYUNvZGVjOjpmbHVzaEFuYWx5dGljc0l0ZW0oKSB7CisgICAgdXBkYXRlQW5hbHl0aWNzSXRlbSgpOwogICAgIGlmIChtQW5hbHl0aWNzSXRlbSAhPSBOVUxMKSB7CiAgICAgICAgIC8vIGRvbid0IGxvZyBlbXB0eSByZWNvcmRzCiAgICAgICAgIGlmIChtQW5hbHl0aWNzSXRlbS0+Y291bnQoKSA+IDApIHsKLSAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRGaW5hbGl6ZWQodHJ1ZSk7CiAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2VsZnJlY29yZCgpOwogICAgICAgICB9CiAgICAgICAgIGRlbGV0ZSBtQW5hbHl0aWNzSXRlbTsKQEAgLTUxOSw2ICs2MzYsMTkwIEBACiAgICAgfQogfQogCitib29sIE1lZGlhQ29kZWM6Okhpc3RvZ3JhbTo6c2V0dXAoaW50IG5idWNrZXRzLCBpbnQ2NF90IHdpZHRoLCBpbnQ2NF90IGZsb29yKQoreworICAgIGlmIChuYnVja2V0cyA8PSAwIHx8IHdpZHRoIDw9IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIGdldCBoaXN0b2dyYW0gYnVja2V0cworICAgIGlmIChuYnVja2V0cyA9PSBtQnVja2V0Q291bnQgJiYgbUJ1Y2tldHMgIT0gTlVMTCkgeworICAgICAgICAvLyByZXVzZSBvdXIgZXhpc3RpbmcgYnVmZmVyCisgICAgICAgIG1lbXNldChtQnVja2V0cywgMCwgc2l6ZW9mKCptQnVja2V0cykgKiBtQnVja2V0Q291bnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGdldCBhIG5ldyBwcmUtemVyb2VkIGJ1ZmZlcgorICAgICAgICBpbnQ2NF90ICpuZXdidWNrZXRzID0gKGludDY0X3QgKiljYWxsb2MobmJ1Y2tldHMsIHNpemVvZiAoKm1CdWNrZXRzKSk7CisgICAgICAgIGlmIChuZXdidWNrZXRzID09IE5VTEwpIHsKKyAgICAgICAgICAgIGdvdG8gYmFkOworICAgICAgICB9CisgICAgICAgIGlmIChtQnVja2V0cyAhPSBOVUxMKQorICAgICAgICAgICAgZnJlZShtQnVja2V0cyk7CisgICAgICAgIG1CdWNrZXRzID0gbmV3YnVja2V0czsKKyAgICB9CisKKyAgICBtV2lkdGggPSB3aWR0aDsKKyAgICBtRmxvb3IgPSBmbG9vcjsKKyAgICBtQ2VpbGluZyA9IGZsb29yICsgbmJ1Y2tldHMgKiB3aWR0aDsKKyAgICBtQnVja2V0Q291bnQgPSBuYnVja2V0czsKKworICAgIG1NaW4gPSBJTlQ2NF9NQVg7CisgICAgbU1heCA9IElOVDY0X01JTjsKKyAgICBtU3VtID0gMDsKKyAgICBtQ291bnQgPSAwOworICAgIG1CZWxvdyA9IG1BYm92ZSA9IDA7CisKKyAgICByZXR1cm4gdHJ1ZTsKKworICBiYWQ6CisgICAgaWYgKG1CdWNrZXRzICE9IE5VTEwpIHsKKyAgICAgICAgZnJlZShtQnVja2V0cyk7CisgICAgICAgIG1CdWNrZXRzID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgTWVkaWFDb2RlYzo6SGlzdG9ncmFtOjppbnNlcnQoaW50NjRfdCBzYW1wbGUpCit7CisgICAgLy8gaGlzdG9ncmFtIGlzIG5vdCBzZXQgdXAKKyAgICBpZiAobUJ1Y2tldHMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUNvdW50Kys7CisgICAgbVN1bSArPSBzYW1wbGU7CisgICAgaWYgKG1NaW4gPiBzYW1wbGUpIG1NaW4gPSBzYW1wbGU7CisgICAgaWYgKG1NYXggPCBzYW1wbGUpIG1NYXggPSBzYW1wbGU7CisKKyAgICBpZiAoc2FtcGxlIDwgbUZsb29yKSB7CisgICAgICAgIG1CZWxvdysrOworICAgIH0gZWxzZSBpZiAoc2FtcGxlID49IG1DZWlsaW5nKSB7CisgICAgICAgIG1BYm92ZSsrOworICAgIH0gZWxzZSB7CisgICAgICAgIGludDY0X3Qgc2xvdCA9IChzYW1wbGUgLSBtRmxvb3IpIC8gbVdpZHRoOworICAgICAgICBDSEVDSyhzbG90IDwgbUJ1Y2tldENvdW50KTsKKyAgICAgICAgbUJ1Y2tldHNbc2xvdF0rKzsKKyAgICB9CisgICAgcmV0dXJuOworfQorCitzdGQ6OnN0cmluZyBNZWRpYUNvZGVjOjpIaXN0b2dyYW06OmVtaXQoKQoreworICAgIHN0ZDo6c3RyaW5nIHZhbHVlOworICAgIGNoYXIgYnVmZmVyWzY0XTsKKworICAgIC8vIGVtaXRzOiAgd2lkdGgsQmVsb3d7YnVja2V0MCxidWNrZXQxLC4uLi4sIGJ1Y2tldE59YWJvdmUKKyAgICAvLyB1bmNvbmZpZ3VyZWQgd2lsbCBlbWl0OiAwLDB7fTAKKyAgICAvLyBYWFg6IGlzIHRoaXMgYmVzdCByZXByZXNlbnRhdGlvbj8KKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJSIgUFJJZDY0ICIsJSIgUFJJZDY0ICIsJSIgUFJJZDY0ICJ7IiwKKyAgICAgICAgICAgICBtRmxvb3IsIG1XaWR0aCwgbUJlbG93KTsKKyAgICB2YWx1ZSA9IGJ1ZmZlcjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1CdWNrZXRDb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChpICE9IDApIHsKKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKyAiLCI7CisgICAgICAgIH0KKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiUiIFBSSWQ2NCwgbUJ1Y2tldHNbaV0pOworICAgICAgICB2YWx1ZSA9IHZhbHVlICsgYnVmZmVyOworICAgIH0KKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAifSUiIFBSSWQ2NCAsIG1BYm92ZSk7CisgICAgdmFsdWUgPSB2YWx1ZSArIGJ1ZmZlcjsKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKKy8vIHdoZW4gd2Ugc2VuZCBhIGJ1ZmZlciB0byB0aGUgY29kZWM7Cit2b2lkIE1lZGlhQ29kZWM6OnN0YXRzQnVmZmVyU2VudChpbnQ2NF90IHByZXNlbnRhdGlvblVzKSB7CisKKyAgICAvLyBvbmx5IGVucXVldWUgaWYgd2UgaGF2ZSBhIGxlZ2l0aW1hdGUgdGltZQorICAgIGlmIChwcmVzZW50YXRpb25VcyA8PSAwKSB7CisgICAgICAgIEFMT0dWKCJwcmVzZW50YXRpb24gdGltZTogJSIgUFJJZDY0LCBwcmVzZW50YXRpb25Vcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBpbnQ2NF90IG5vd05zID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOworICAgIEJ1ZmZlckZsaWdodFRpbWluZ190IHN0YXJ0ZGF0YSA9IHsgcHJlc2VudGF0aW9uVXMsIG5vd05zIH07CisKKyAgICB7CisgICAgICAgIC8vIG11dGV4IGFjY2VzcyB0byBtQnVmZmVyc0luRmxpZ2h0IGFuZCBvdGhlciBzdGF0cworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobUxhdGVuY3lMb2NrKTsKKworCisgICAgICAgIC8vIFhYWDogd2UgKmNvdWxkKiBtYWtlIHN1cmUgdGhhdCB0aGUgdGltZSBpcyBsYXRlciB0aGFuIHRoZSBlbmQgb2YgcXVldWUKKyAgICAgICAgLy8gYXMgcGFydCBvZiBhIGNvbnNpc3RlbmN5IGNoZWNrLi4uCisgICAgICAgIG1CdWZmZXJzSW5GbGlnaHQucHVzaF9iYWNrKHN0YXJ0ZGF0YSk7CisgICAgfQorfQorCisvLyB3aGVuIHdlIGdldCBhIGJ1ZmZlciBiYWNrIGZyb20gdGhlIGNvZGVjCit2b2lkIE1lZGlhQ29kZWM6OnN0YXRzQnVmZmVyUmVjZWl2ZWQoaW50NjRfdCBwcmVzZW50YXRpb25VcykgeworCisgICAgQ0hFQ0tfTkUobVN0YXRlLCBVTklOSVRJQUxJWkVEKTsKKworICAgIC8vIG11dGV4IGFjY2VzcyB0byBtQnVmZmVyc0luRmxpZ2h0IGFuZCBvdGhlciBzdGF0cworICAgIE11dGV4OjpBdXRvbG9jayBhbChtTGF0ZW5jeUxvY2spOworCisgICAgLy8gaG93IGxvbmcgdGhpcyBidWZmZXIgdG9vayBmb3IgdGhlIHJvdW5kIHRyaXAgdGhyb3VnaCB0aGUgY29kZWMKKyAgICAvLyBOQjogcGlwZWxpbmluZyBjYW4vd2lsbCBtYWtlIHRoZXNlIHRpbWVzIGxhcmdlci4gZS5nLiwgaWYgZWFjaCBwYWNrZXQKKyAgICAvLyBpcyBhbHdheXMgMiBtc2VjIGFuZCB3ZSBoYXZlIDMgaW4gZmxpZ2h0IGF0IGFueSBnaXZlbiB0aW1lLCB3ZSdyZSBnb2luZyB0bworICAgIC8vIHNlZSAiNiBtc2VjIiBhcyBhbiBhbnN3ZXIuCisKKyAgICAvLyBpZ25vcmUgc3R1ZmYgd2l0aCBubyBwcmVzZW50YXRpb24gdGltZQorICAgIGlmIChwcmVzZW50YXRpb25VcyA8PSAwKSB7CisgICAgICAgIEFMT0dWKCItLSByZXR1cm5lZCBidWZmZXIgdGltZXN0YW1wICUiIFBSSWQ2NCAiIDw9IDAsIGlnbm9yZSBpdCIsIHByZXNlbnRhdGlvblVzKTsKKyAgICAgICAgbUxhdGVuY3lVbmtub3duKys7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBCdWZmZXJGbGlnaHRUaW1pbmdfdCBzdGFydGRhdGE7CisgICAgYm9vbCB2YWxpZCA9IGZhbHNlOworICAgIHdoaWxlIChtQnVmZmVyc0luRmxpZ2h0LnNpemUoKSA+IDApIHsKKyAgICAgICAgc3RhcnRkYXRhID0gKm1CdWZmZXJzSW5GbGlnaHQuYmVnaW4oKTsKKyAgICAgICAgQUxPR1YoIi0tIExvb2tpbmcgYXQgc3RhcnRkYXRhLiBwcmVzZW50YXRpb24gJSIgUFJJZDY0ICIsIHN0YXJ0ICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgc3RhcnRkYXRhLnByZXNlbnRhdGlvblVzLCBzdGFydGRhdGEuc3RhcnRlZE5zKTsKKyAgICAgICAgaWYgKHN0YXJ0ZGF0YS5wcmVzZW50YXRpb25VcyA9PSBwcmVzZW50YXRpb25VcykgeworICAgICAgICAgICAgLy8gYSBtYXRjaAorICAgICAgICAgICAgQUxPR1YoIi0tIG1hdGNoIGVudHJ5IGZvciAlIiBQUklkNjQgIiwgaGl0cyBvdXIgZnJhbWUgb2YgJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgICAgc3RhcnRkYXRhLnByZXNlbnRhdGlvblVzLCBwcmVzZW50YXRpb25Vcyk7CisgICAgICAgICAgICBtQnVmZmVyc0luRmxpZ2h0LnBvcF9mcm9udCgpOworICAgICAgICAgICAgdmFsaWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRkYXRhLnByZXNlbnRhdGlvblVzIDwgcHJlc2VudGF0aW9uVXMpIHsKKyAgICAgICAgICAgIC8vIHdlIG11c3QgaGF2ZSBtaXNzZWQgdGhlIG1hdGNoIGZvciB0aGlzLCBkcm9wIGl0IGFuZCBrZWVwIGxvb2tpbmcKKyAgICAgICAgICAgIEFMT0dWKCItLSAgZHJvcCBlbnRyeSBmb3IgJSIgUFJJZDY0ICIsIGJlZm9yZSBvdXIgZnJhbWUgb2YgJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgICAgc3RhcnRkYXRhLnByZXNlbnRhdGlvblVzLCBwcmVzZW50YXRpb25Vcyk7CisgICAgICAgICAgICBtQnVmZmVyc0luRmxpZ2h0LnBvcF9mcm9udCgpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBoZWFkIGlzIGFmdGVyLCBzbyB3ZSBkb24ndCBoYXZlIGEgZnJhbWUgZm9yIG91cnNlbHZlcworICAgICAgICAgICAgQUxPR1YoIi0tICBmb3VuZCBlbnRyeSBmb3IgJSIgUFJJZDY0ICIsIEFGVEVSIG91ciBmcmFtZSBvZiAlIiBQUklkNjQKKyAgICAgICAgICAgICAgICAgICIgd2UgaGF2ZSBub3RoaW5nIHRvIHBhaXIgd2l0aCIsCisgICAgICAgICAgICAgICAgICBzdGFydGRhdGEucHJlc2VudGF0aW9uVXMsIHByZXNlbnRhdGlvblVzKTsKKyAgICAgICAgICAgIG1MYXRlbmN5VW5rbm93bisrOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGlmICghdmFsaWQpIHsKKyAgICAgICAgQUxPR1YoIi0tIGVtcHR5IHF1ZXVlLCBzbyBpZ25vcmUgdGhhdC4iKTsKKyAgICAgICAgbUxhdGVuY3lVbmtub3duKys7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBub3dOcyBzdGFydCBvdXIgY2FsY3VsYXRpb25zCisgICAgY29uc3QgaW50NjRfdCBub3dOcyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKKyAgICBpbnQ2NF90IGxhdGVuY3lVcyA9IChub3dOcyAtIHN0YXJ0ZGF0YS5zdGFydGVkTnMgKyA1MDApIC8gMTAwMDsKKworICAgIG1MYXRlbmN5SGlzdC5pbnNlcnQobGF0ZW5jeVVzKTsKKworICAgIC8vIHB1c2ggaW50byB0aGUgcmVjZW50IHNhbXBsZXMKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtUmVjZW50TG9jayk7CisKKyAgICAgICAgaWYgKG1SZWNlbnRIZWFkID49IGtSZWNlbnRMYXRlbmN5RnJhbWVzKSB7CisgICAgICAgICAgICBtUmVjZW50SGVhZCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgbVJlY2VudFNhbXBsZXNbbVJlY2VudEhlYWQrK10gPSBsYXRlbmN5VXM7CisgICAgfQorfQorCiAvLyBzdGF0aWMKIHN0YXR1c190IE1lZGlhQ29kZWM6OlBvc3RBbmRBd2FpdFJlc3BvbnNlKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgc3A8QU1lc3NhZ2U+ICpyZXNwb25zZSkgewpAQCAtNTQ3LDEwICs4NDgsMTcgQEAKICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwogfQogCitzdGF0aWMgQ29kZWNCYXNlICpDcmVhdGVDQ29kZWMoKSB7CisgICAgcmV0dXJuIFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyOjpHZXRDQ29kZWNJbnN0YW5jZSgpLT5jcmVhdGVDb2RlYygpOworfQorCiAvL3N0YXRpYwotc3A8Q29kZWNCYXNlPiBNZWRpYUNvZGVjOjpHZXRDb2RlY0Jhc2UoY29uc3QgQVN0cmluZyAmbmFtZSwgYm9vbCBuYW1lSXNUeXBlKSB7Ci0gICAgLy8gYXQgdGhpcyB0aW1lIG9ubHkgQUNvZGVjIHNwZWNpZmllcyBhIG1pbWUgdHlwZS4KLSAgICBpZiAobmFtZUlzVHlwZSB8fCBuYW1lLnN0YXJ0c1dpdGhJZ25vcmVDYXNlKCJvbXguIikpIHsKK3NwPENvZGVjQmFzZT4gTWVkaWFDb2RlYzo6R2V0Q29kZWNCYXNlKGNvbnN0IEFTdHJpbmcgJm5hbWUpIHsKKyAgICBzdGF0aWMgYm9vbCBjY29kZWNFbmFibGVkID0gcHJvcGVydHlfZ2V0X2Jvb2woImRlYnVnLnN0YWdlZnJpZ2h0LmNjb2RlYyIsIGZhbHNlKTsKKyAgICBpZiAoY2NvZGVjRW5hYmxlZCAmJiBuYW1lLnN0YXJ0c1dpdGhJZ25vcmVDYXNlKCJjMi4iKSkgeworICAgICAgICByZXR1cm4gQ3JlYXRlQ0NvZGVjKCk7CisgICAgfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGhJZ25vcmVDYXNlKCJvbXguIikpIHsKKyAgICAgICAgLy8gYXQgdGhpcyB0aW1lIG9ubHkgQUNvZGVjIHNwZWNpZmllcyBhIG1pbWUgdHlwZS4KICAgICAgICAgcmV0dXJuIG5ldyBBQ29kZWM7CiAgICAgfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhbmRyb2lkLmZpbHRlci4iKSkgewogICAgICAgICByZXR1cm4gbmV3IE1lZGlhRmlsdGVyOwpAQCAtNTU5LDUwICs4NjcsNTMgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IE1lZGlhQ29kZWM6OmluaXQoY29uc3QgQVN0cmluZyAmbmFtZSwgYm9vbCBuYW1lSXNUeXBlLCBib29sIGVuY29kZXIpIHsKK3N0YXR1c190IE1lZGlhQ29kZWM6OmluaXQoY29uc3QgQVN0cmluZyAmbmFtZSkgewogICAgIG1SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLT5pbml0KCk7CiAKICAgICAvLyBzYXZlIGluaXQgcGFyYW1ldGVycyBmb3IgcmVzZXQKICAgICBtSW5pdE5hbWUgPSBuYW1lOwotICAgIG1Jbml0TmFtZUlzVHlwZSA9IG5hbWVJc1R5cGU7Ci0gICAgbUluaXRJc0VuY29kZXIgPSBlbmNvZGVyOwogCiAgICAgLy8gQ3VycmVudCB2aWRlbyBkZWNvZGVycyBkbyBub3QgcmV0dXJuIGZyb20gT01YX0ZpbGxUaGlzQnVmZmVyCiAgICAgLy8gcXVpY2tseSwgdmlvbGF0aW5nIHRoZSBPcGVuTUFYIHNwZWNzLCB1bnRpbCB0aGF0IGlzIHJlbWVkaWVkCiAgICAgLy8gd2UgbmVlZCB0byBpbnZlc3QgaW4gYW4gZXh0cmEgbG9vcGVyIHRvIGZyZWUgdGhlIG1haW4gZXZlbnQKICAgICAvLyBxdWV1ZS4KIAotICAgIG1Db2RlYyA9IEdldENvZGVjQmFzZShuYW1lLCBuYW1lSXNUeXBlKTsKKyAgICBtQ29kZWMgPSBHZXRDb2RlY0Jhc2UobmFtZSk7CiAgICAgaWYgKG1Db2RlYyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKICAgICB9CiAKKyAgICBtQ29kZWNJbmZvLmNsZWFyKCk7CisKICAgICBib29sIHNlY3VyZUNvZGVjID0gZmFsc2U7Ci0gICAgaWYgKG5hbWVJc1R5cGUgJiYgIXN0cm5jYXNlY21wKG5hbWUuY19zdHIoKSwgInZpZGVvLyIsIDYpKSB7Ci0gICAgICAgIG1Jc1ZpZGVvID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBBU3RyaW5nIHRtcCA9IG5hbWU7Ci0gICAgICAgIGlmICh0bXAuZW5kc1dpdGgoIi5zZWN1cmUiKSkgewotICAgICAgICAgICAgc2VjdXJlQ29kZWMgPSB0cnVlOwotICAgICAgICAgICAgdG1wLmVyYXNlKHRtcC5zaXplKCkgLSA3LCA3KTsKKyAgICBBU3RyaW5nIHRtcCA9IG5hbWU7CisgICAgaWYgKHRtcC5lbmRzV2l0aCgiLnNlY3VyZSIpKSB7CisgICAgICAgIHNlY3VyZUNvZGVjID0gdHJ1ZTsKKyAgICAgICAgdG1wLmVyYXNlKHRtcC5zaXplKCkgLSA3LCA3KTsKKyAgICB9CisgICAgY29uc3Qgc3A8SU1lZGlhQ29kZWNMaXN0PiBtY2wgPSBNZWRpYUNvZGVjTGlzdDo6Z2V0SW5zdGFuY2UoKTsKKyAgICBpZiAobWNsID09IE5VTEwpIHsKKyAgICAgICAgbUNvZGVjID0gTlVMTDsgIC8vIHJlbW92ZSB0aGUgY29kZWMuCisgICAgICAgIHJldHVybiBOT19JTklUOyAvLyBpZiBjYWxsZWQgZnJvbSBKYXZhIHNob3VsZCByYWlzZSBJT0V4Y2VwdGlvbgorICAgIH0KKyAgICBmb3IgKGNvbnN0IEFTdHJpbmcgJmNvZGVjTmFtZSA6IHsgbmFtZSwgdG1wIH0pIHsKKyAgICAgICAgc3NpemVfdCBjb2RlY0lkeCA9IG1jbC0+ZmluZENvZGVjQnlOYW1lKGNvZGVjTmFtZS5jX3N0cigpKTsKKyAgICAgICAgaWYgKGNvZGVjSWR4IDwgMCkgeworICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3A8SU1lZGlhQ29kZWNMaXN0PiBtY2wgPSBNZWRpYUNvZGVjTGlzdDo6Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgaWYgKG1jbCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtQ29kZWMgPSBOVUxMOyAgLy8gcmVtb3ZlIHRoZSBjb2RlYy4KLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOyAvLyBpZiBjYWxsZWQgZnJvbSBKYXZhIHNob3VsZCByYWlzZSBJT0V4Y2VwdGlvbgotICAgICAgICB9Ci0gICAgICAgIHNzaXplX3QgY29kZWNJZHggPSBtY2wtPmZpbmRDb2RlY0J5TmFtZSh0bXAuY19zdHIoKSk7Ci0gICAgICAgIGlmIChjb2RlY0lkeCA+PSAwKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IG1jbC0+Z2V0Q29kZWNJbmZvKGNvZGVjSWR4KTsKLSAgICAgICAgICAgIFZlY3RvcjxBU3RyaW5nPiBtaW1lczsKLSAgICAgICAgICAgIGluZm8tPmdldFN1cHBvcnRlZE1pbWVzKCZtaW1lcyk7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1pbWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1pbWVzW2ldLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Jc1ZpZGVvID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICBtQ29kZWNJbmZvID0gbWNsLT5nZXRDb2RlY0luZm8oY29kZWNJZHgpOworICAgICAgICBWZWN0b3I8QVN0cmluZz4gbWltZXM7CisgICAgICAgIG1Db2RlY0luZm8tPmdldFN1cHBvcnRlZE1pbWVzKCZtaW1lcyk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWltZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtaW1lc1tpXS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgeworICAgICAgICAgICAgICAgIG1Jc1ZpZGVvID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKG1Db2RlY0luZm8gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CiAgICAgfQogCiAgICAgaWYgKG1Jc1ZpZGVvKSB7CkBAIC02MjksMjMgKzk0MCwxNCBAQAogICAgICAgICAgICAgICAgICAgICBuZXcgQnVmZmVyQ2FsbGJhY2sobmV3IEFNZXNzYWdlKGtXaGF0Q29kZWNOb3RpZnksIHRoaXMpKSkpOwogCiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEluaXQsIHRoaXMpOworICAgIG1zZy0+c2V0T2JqZWN0KCJjb2RlY0luZm8iLCBtQ29kZWNJbmZvKTsKKyAgICAvLyBuYW1lIG1heSBiZSBkaWZmZXJlbnQgZnJvbSBtQ29kZWNJbmZvLT5nZXRDb2RlY05hbWUoKSBpZiB3ZSBzdHJpcHBlZAorICAgIC8vICIuc2VjdXJlIgogICAgIG1zZy0+c2V0U3RyaW5nKCJuYW1lIiwgbmFtZSk7Ci0gICAgbXNnLT5zZXRJbnQzMigibmFtZUlzVHlwZSIsIG5hbWVJc1R5cGUpOwotCi0gICAgaWYgKG5hbWVJc1R5cGUpIHsKLSAgICAgICAgbXNnLT5zZXRJbnQzMigiZW5jb2RlciIsIGVuY29kZXIpOwotICAgIH0KIAogICAgIGlmIChtQW5hbHl0aWNzSXRlbSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChuYW1lSXNUeXBlKSB7Ci0gICAgICAgICAgICAvLyBuYW1lIGlzIHRoZSBtaW1lIHR5cGUKLSAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtDb2RlY01pbWUsIG5hbWUuY19zdHIoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrQ29kZWNDb2RlYywgbmFtZS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrQ29kZWNNb2RlLCBtSXNWaWRlbyA/ICJ2aWRlbyIgOiAiYXVkaW8iKTsKLSAgICAgICAgaWYgKG5hbWVJc1R5cGUpCi0gICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0NvZGVjRW5jb2RlciwgZW5jb2Rlcik7CisgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtDb2RlY0NvZGVjLCBuYW1lLmNfc3RyKCkpOworICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrQ29kZWNNb2RlLCBtSXNWaWRlbyA/IGtDb2RlY01vZGVWaWRlbyA6IGtDb2RlY01vZGVBdWRpbyk7CiAgICAgfQogCiAgICAgc3RhdHVzX3QgZXJyOwpAQCAtNzExLDYgKzEwMTMsNyBAQAogICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoImxldmVsIiwgJmxldmVsKSkgewogICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY0xldmVsLCBsZXZlbCk7CiAgICAgICAgIH0KKyAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY0VuY29kZXIsIChmbGFncyAmIENPTkZJR1VSRV9GTEFHX0VOQ09ERSkgPyAxIDogMCk7CiAgICAgfQogCiAgICAgaWYgKG1Jc1ZpZGVvKSB7CkBAIC03MzUsOCArMTAzOCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBQcmV2ZW50IHBvc3NpYmxlIGludGVnZXIgb3ZlcmZsb3cgaW4gZG93bnN0cmVhbSBjb2RlLgotICAgICAgICBpZiAobUluaXRJc0VuY29kZXIKLSAgICAgICAgICAgICAgICAmJiAodWludDY0X3QpbVZpZGVvV2lkdGggKiBtVmlkZW9IZWlnaHQgPiAodWludDY0X3QpSU5UMzJfTUFYIC8gNCkgeworICAgICAgICBpZiAoKHVpbnQ2NF90KW1WaWRlb1dpZHRoICogbVZpZGVvSGVpZ2h0ID4gKHVpbnQ2NF90KUlOVDMyX01BWCAvIDQpIHsKICAgICAgICAgICAgIEFMT0dFKCJidWZmZXIgc2l6ZSBpcyB0b28gYmlnLCB3aWR0aD0lZCwgaGVpZ2h0PSVkIiwgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CkBAIC03NTMsNyArMTA1NSw2IEBACiAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoImRlc2NyYW1ibGVyIiwgZGVzY3JhbWJsZXIuZ2V0KCkpOwogICAgICAgICB9CiAgICAgICAgIGlmIChtQW5hbHl0aWNzSXRlbSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAvLyBYWFg6IHNhdmUgaW5kaWNhdGlvbiB0aGF0IGl0J3MgY3J5cHRvIGluIHNvbWUgd2F5Li4uCiAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0NvZGVjQ3J5cHRvLCAxKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdJc1NlY3VyZSkgewpAQCAtMTAxNSw3ICsxMzE2LDcgQEAKICAgICBtSGF2ZUlucHV0U3VyZmFjZSA9IGZhbHNlOwogCiAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICBlcnIgPSBpbml0KG1Jbml0TmFtZSwgbUluaXROYW1lSXNUeXBlLCBtSW5pdElzRW5jb2Rlcik7CisgICAgICAgIGVyciA9IGluaXQobUluaXROYW1lKTsKICAgICB9CiAgICAgcmV0dXJuIGVycjsKIH0KQEAgLTExOTUsNiArMTQ5NiwyMiBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgTWVkaWFDb2RlYzo6Z2V0Q29kZWNJbmZvKHNwPE1lZGlhQ29kZWNJbmZvPiAqY29kZWNJbmZvKSBjb25zdCB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldENvZGVjSW5mbywgdGhpcyk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyOworICAgIGlmICgoZXJyID0gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICBDSEVDSyhyZXNwb25zZS0+ZmluZE9iamVjdCgiY29kZWNJbmZvIiwgJm9iaikpOworICAgICpjb2RlY0luZm8gPSBzdGF0aWNfY2FzdDxNZWRpYUNvZGVjSW5mbyAqPihvYmouZ2V0KCkpOworCisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBNZWRpYUNvZGVjOjpnZXRNZXRyaWNzKE1lZGlhQW5hbHl0aWNzSXRlbSAqICZyZXBseSkgewogCiAgICAgcmVwbHkgPSBOVUxMOwpAQCAtMTIwNCwxMSArMTUyMSwxNCBAQAogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKLSAgICAvLyBYWFg6IGdvIGdldCBjdXJyZW50IHZhbHVlcyBmb3Igd2hhdGV2ZXIgaW4tZmxpZ2h0IGRhdGEgd2Ugd2FudAorICAgIC8vIHVwZGF0ZSBhbnkgaW4tZmxpZ2h0IGRhdGEgdGhhdCdzIG5vdCBjYXJyaWVkIHdpdGhpbiB0aGUgcmVjb3JkCisgICAgdXBkYXRlQW5hbHl0aWNzSXRlbSgpOwogCiAgICAgLy8gc2VuZCBpdCBiYWNrIHRvIHRoZSBjYWxsZXIuCiAgICAgcmVwbHkgPSBtQW5hbHl0aWNzSXRlbS0+ZHVwKCk7CiAKKyAgICB1cGRhdGVFcGhlbWVyYWxBbmFseXRpY3MocmVwbHkpOworCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0xMzE5LDYgKzE2MzksMzEgQEAKICAgICBtc2ctPnBvc3QoKTsKIH0KIAordm9pZCBNZWRpYUNvZGVjOjpyZXF1ZXN0Q3B1Qm9vc3RJZk5lZWRlZCgpIHsKKyAgICBpZiAobUNwdUJvb3N0UmVxdWVzdGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50MzJfdCBjb2xvckZvcm1hdDsKKyAgICBpZiAobVNvZnRSZW5kZXJlciAhPSBOVUxMCisgICAgICAgICAgICAmJiBtT3V0cHV0Rm9ybWF0LT5jb250YWlucygiaGRyLXN0YXRpYy1pbmZvIikKKyAgICAgICAgICAgICYmIG1PdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0KQorICAgICAgICAgICAgJiYgKGNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNikpIHsKKyAgICAgICAgaW50MzJfdCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHdpZHRoLCBoZWlnaHQ7CisgICAgICAgIGludDY0X3QgdG90YWxQaXhlbCA9IDA7CisgICAgICAgIGlmIChtT3V0cHV0Rm9ybWF0LT5maW5kUmVjdCgiY3JvcCIsICZsZWZ0LCAmdG9wLCAmcmlnaHQsICZib3R0b20pKSB7CisgICAgICAgICAgICB0b3RhbFBpeGVsID0gKHJpZ2h0IC0gbGVmdCArIDEpICogKGJvdHRvbSAtIHRvcCArIDEpOworICAgICAgICB9IGVsc2UgaWYgKG1PdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpCisgICAgICAgICAgICAgICAgJiYgbU91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgeworICAgICAgICAgICAgdG90YWxQaXhlbCA9IHdpZHRoICogaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIGlmICh0b3RhbFBpeGVsID49IDE5MjAgKiAxMDgwKSB7CisgICAgICAgICAgICBhZGRSZXNvdXJjZShNZWRpYVJlc291cmNlOjprQ3B1Qm9vc3QsCisgICAgICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OmtVbnNwZWNpZmllZFN1YlR5cGUsIDEpOworICAgICAgICAgICAgbUNwdUJvb3N0UmVxdWVzdGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogdm9pZCBNZWRpYUNvZGVjOjpjYW5jZWxQZW5kaW5nRGVxdWV1ZU9wZXJhdGlvbnMoKSB7CkBAIC0xMzk0LDYgKzE3MzksOCBAQAogICAgICAgICBpbnQ2NF90IHRpbWVVczsKICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwogCisgICAgICAgIHN0YXRzQnVmZmVyUmVjZWl2ZWQodGltZVVzKTsKKwogICAgICAgICByZXNwb25zZS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CiAKICAgICAgICAgaW50MzJfdCBmbGFnczsKQEAgLTE0NDAsNyArMTc4Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbkNvZGUgPT0gQUNUSU9OX0NPREVfRkFUQUwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY0Vycm9yLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0NvZGVjRXJyb3JTdGF0ZSwgbVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa0NvZGVjRXJyb3JTdGF0ZSwgc3RhdGVTdHJpbmcobVN0YXRlKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hBbmFseXRpY3NJdGVtKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRBbmFseXRpY3NJdGVtKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTQ1Myw3ICsxODAwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uQ29kZSA9PSBBQ1RJT05fQ09ERV9GQVRBTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0NvZGVjRXJyb3IsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQ29kZWNFcnJvclN0YXRlLCBtU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrQ29kZWNFcnJvclN0YXRlLCBzdGF0ZVN0cmluZyhtU3RhdGUpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaEFuYWx5dGljc0l0ZW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdEFuYWx5dGljc0l0ZW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0xNDk0LDcgKzE4NDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25Db2RlID09IEFDVElPTl9DT0RFX0ZBVEFMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQ29kZWNFcnJvciwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY0Vycm9yU3RhdGUsIG1TdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtDb2RlY0Vycm9yU3RhdGUsIHN0YXRlU3RyaW5nKG1TdGF0ZSkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoQW5hbHl0aWNzSXRlbSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0QW5hbHl0aWNzSXRlbSgpOwogCkBAIC0xNTI3LDcgKzE4NzQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0NvZGVjRXJyb3IsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQ29kZWNFcnJvclN0YXRlLCBtU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrQ29kZWNFcnJvclN0YXRlLCBzdGF0ZVN0cmluZyhtU3RhdGUpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaEFuYWx5dGljc0l0ZW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdEFuYWx5dGljc0l0ZW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoVU5JTklUSUFMSVpFRCk7CkBAIC0xODI3LDEyICsyMTc0LDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2UuZ2V0KCksIChhbmRyb2lkX2RhdGFzcGFjZSlkYXRhU3BhY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HV19JRihlcnIgIT0gMCwgImZhaWxlZCB0byBzZXQgZGF0YXNwYWNlIG9uIHN1cmZhY2UgKCVkKSIsIGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtT3V0cHV0Rm9ybWF0LT5jb250YWlucygiaGRyLXN0YXRpYy1pbmZvIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSERSU3RhdGljSW5mbyBpbmZvOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29sb3JVdGlsczo6Z2V0SERSU3RhdGljSW5mb0Zyb21Gb3JtYXQobU91dHB1dEZvcm1hdCwgJmluZm8pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXROYXRpdmVXaW5kb3dIZHJNZXRhZGF0YShtU3VyZmFjZS5nZXQoKSwgJmluZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pbWUuc3RhcnRzV2l0aElnbm9yZUNhc2UoInZpZGVvLyIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Tb2Z0UmVuZGVyZXIgPSBuZXcgU29mdHdhcmVSZW5kZXJlcihtU3VyZmFjZSwgbVJvdGF0aW9uRGVncmVlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q3B1Qm9vc3RJZk5lZWRlZCgpOworCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdJc0VuY29kZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCZWZvcmUgd2UgYW5ub3VuY2UgdGhlIGZvcm1hdCBjaGFuZ2Ugd2Ugc2hvdWxkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBjb2RlYyBzcGVjaWZpYyBkYXRhIGFuZCBhbWVuZCB0aGUgb3V0cHV0CkBAIC0xODQ5LDcgKzIyMDQsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25PdXRwdXRGb3JtYXRDaGFuZ2VkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTk1NywyNCArMjMxMSwxNCBAQAogICAgICAgICAgICAgbVJlcGx5SUQgPSByZXBseUlEOwogICAgICAgICAgICAgc2V0U3RhdGUoSU5JVElBTElaSU5HKTsKIAorICAgICAgICAgICAgc3A8UmVmQmFzZT4gY29kZWNJbmZvOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJjb2RlY0luZm8iLCAmY29kZWNJbmZvKSk7CiAgICAgICAgICAgICBBU3RyaW5nIG5hbWU7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoIm5hbWUiLCAmbmFtZSkpOwogCi0gICAgICAgICAgICBpbnQzMl90IG5hbWVJc1R5cGU7Ci0gICAgICAgICAgICBpbnQzMl90IGVuY29kZXIgPSBmYWxzZTsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJuYW1lSXNUeXBlIiwgJm5hbWVJc1R5cGUpKTsKLSAgICAgICAgICAgIGlmIChuYW1lSXNUeXBlKSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVuY29kZXIiLCAmZW5jb2RlcikpOwotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlOwotCi0gICAgICAgICAgICBpZiAobmFtZUlzVHlwZSkgewotICAgICAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgbmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJlbmNvZGVyIiwgZW5jb2Rlcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJjb21wb25lbnROYW1lIiwgbmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcm1hdC0+c2V0T2JqZWN0KCJjb2RlY0luZm8iLCBjb2RlY0luZm8pOworICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoImNvbXBvbmVudE5hbWUiLCBuYW1lKTsKIAogICAgICAgICAgICAgbUNvZGVjLT5pbml0aWF0ZUFsbG9jYXRlQ29tcG9uZW50KGZvcm1hdCk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTI1OTMsNiArMjkzNywxNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0R2V0Q29kZWNJbmZvOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVzcG9uc2UtPnNldE9iamVjdCgiY29kZWNJbmZvIiwgbUNvZGVjSW5mbyk7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIGtXaGF0U2V0UGFyYW1ldGVyczoKICAgICAgICAgewogICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CkBAIC0yODcyLDkgKzMyMjcsOCBAQAogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobUJ1ZmZlckxvY2spOwogICAgICAgICBpbmZvLT5tT3duZWRCeUNsaWVudCA9IGZhbHNlOwogICAgICAgICBpbmZvLT5tRGF0YS5jbGVhcigpOwotICAgICAgICBpZiAobUFuYWx5dGljc0l0ZW0gIT0gTlVMTCkgewotICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPmFkZEludDY0KGtDb2RlY0J5dGVzSW4sIHNpemUpOwotICAgICAgICB9CisKKyAgICAgICAgc3RhdHNCdWZmZXJTZW50KHRpbWVVcyk7CiAgICAgfQogCiAgICAgcmV0dXJuIGVycjsKQEAgLTI5NDIsOCArMzI5Niw4IEBACiAKICAgICAgICAgaWYgKG1Tb2Z0UmVuZGVyZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgc3RkOjpsaXN0PEZyYW1lUmVuZGVyVHJhY2tlcjo6SW5mbz4gZG9uZUZyYW1lcyA9IG1Tb2Z0UmVuZGVyZXItPnJlbmRlcigKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICBtZWRpYVRpbWVVcywgcmVuZGVyVGltZU5zLCBOVUxMLCBidWZmZXItPmZvcm1hdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpLCBtZWRpYVRpbWVVcywgcmVuZGVyVGltZU5zLAorICAgICAgICAgICAgICAgICAgICBtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0uc2l6ZSgpLCBidWZmZXItPmZvcm1hdCgpKTsKIAogICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHJ1bm5pbmcsIG5vdGlmeSByZW5kZXJlZCBmcmFtZXMKICAgICAgICAgICAgIGlmICghZG9uZUZyYW1lcy5lbXB0eSgpICYmIG1TdGF0ZSA9PSBTVEFSVEVEICYmIG1PbkZyYW1lUmVuZGVyZWROb3RpZmljYXRpb24gIT0gTlVMTCkgewpAQCAtMzA5MSw2ICszNDQ1LDggQEAKIAogICAgICAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwogCisgICAgICAgIHN0YXRzQnVmZmVyUmVjZWl2ZWQodGltZVVzKTsKKwogICAgICAgICBpbnQzMl90IGZsYWdzOwogICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJmbGFncyIsICZmbGFncykpOwogCkBAIC0zMjI0LDQgKzM1ODAsMjggQEAKICAgICB9CiB9CiAKK3N0ZDo6c3RyaW5nIE1lZGlhQ29kZWM6OnN0YXRlU3RyaW5nKFN0YXRlIHN0YXRlKSB7CisgICAgY29uc3QgY2hhciAqcnZhbCA9IE5VTEw7CisgICAgY2hhciByYXdidWZmZXJbMTZdOyAvLyByb29tIGZvciAiJWQiCisKKyAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgIGNhc2UgVU5JTklUSUFMSVpFRDogcnZhbCA9ICJVTklOSVRJQUxJWkVEIjsgYnJlYWs7CisgICAgICAgIGNhc2UgSU5JVElBTElaSU5HOiBydmFsID0gIklOSVRJQUxJWklORyI7IGJyZWFrOworICAgICAgICBjYXNlIElOSVRJQUxJWkVEOiBydmFsID0gIklOSVRJQUxJWkVEIjsgYnJlYWs7CisgICAgICAgIGNhc2UgQ09ORklHVVJJTkc6IHJ2YWwgPSAiQ09ORklHVVJJTkciOyBicmVhazsKKyAgICAgICAgY2FzZSBDT05GSUdVUkVEOiBydmFsID0gIkNPTkZJR1VSRUQiOyBicmVhazsKKyAgICAgICAgY2FzZSBTVEFSVElORzogcnZhbCA9ICJTVEFSVElORyI7IGJyZWFrOworICAgICAgICBjYXNlIFNUQVJURUQ6IHJ2YWwgPSAiU1RBUlRFRCI7IGJyZWFrOworICAgICAgICBjYXNlIEZMVVNISU5HOiBydmFsID0gIkZMVVNISU5HIjsgYnJlYWs7CisgICAgICAgIGNhc2UgRkxVU0hFRDogcnZhbCA9ICJGTFVTSEVEIjsgYnJlYWs7CisgICAgICAgIGNhc2UgU1RPUFBJTkc6IHJ2YWwgPSAiU1RPUFBJTkciOyBicmVhazsKKyAgICAgICAgY2FzZSBSRUxFQVNJTkc6IHJ2YWwgPSAiUkVMRUFTSU5HIjsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzbnByaW50ZihyYXdidWZmZXIsIHNpemVvZihyYXdidWZmZXIpLCAiJWQiLCBzdGF0ZSk7CisgICAgICAgICAgICBydmFsID0gcmF3YnVmZmVyOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBydmFsOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwCmluZGV4IDQ2NTI1OTQuLjlhMzMxNjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5jcHAKQEAgLTE5LDI4ICsxOSwyNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuaCIKKyNpbmNsdWRlICJTdGFnZWZyaWdodFBsdWdpbkxvYWRlci5oIgogCiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQ29kZWNMaXN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUNvZGVjU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNJbmZvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFEZWZzLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgorI2luY2x1ZGUgPHhtbHBhcnNlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgogCiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPGV4cGF0Lmg+CiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAKQEAgLTgwLDYgKzc5LDI2IEBACiAKIE9teEluZm9CdWlsZGVyIHNPbXhJbmZvQnVpbGRlcjsKIAorTXV0ZXggc0NvZGVjMkluZm9CdWlsZGVyTXV0ZXg7CitzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZT4gc0NvZGVjMkluZm9CdWlsZGVyOworCitNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlICpHZXRDb2RlYzJJbmZvQnVpbGRlcigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woc0NvZGVjMkluZm9CdWlsZGVyTXV0ZXgpOworICAgIGlmICghc0NvZGVjMkluZm9CdWlsZGVyKSB7CisgICAgICAgIHNDb2RlYzJJbmZvQnVpbGRlci5yZXNldCgKKyAgICAgICAgICAgICAgICBTdGFnZWZyaWdodFBsdWdpbkxvYWRlcjo6R2V0Q0NvZGVjSW5zdGFuY2UoKS0+Y3JlYXRlQnVpbGRlcigpKTsKKyAgICB9CisgICAgcmV0dXJuIHNDb2RlYzJJbmZvQnVpbGRlci5nZXQoKTsKK30KKworc3RkOjp2ZWN0b3I8TWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZSAqPiBHZXRCdWlsZGVycygpIHsKKyAgICBzdGQ6OnZlY3RvcjxNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlICo+IGJ1aWxkZXJzIHsmc09teEluZm9CdWlsZGVyfTsKKyAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woImRlYnVnLnN0YWdlZnJpZ2h0LmNjb2RlYyIsIGZhbHNlKSkgeworICAgICAgICBidWlsZGVycy5wdXNoX2JhY2soR2V0Q29kZWMySW5mb0J1aWxkZXIoKSk7CisgICAgfQorICAgIHJldHVybiBidWlsZGVyczsKK30KKwogfSAgLy8gdW5uYW1lZCBuYW1lc3BhY2UKIAogLy8gc3RhdGljCkBAIC05MCw3ICsxMDksNyBAQAogICAgIEFMT0dWKCJFbnRlciBwcm9maWxlclRocmVhZFdyYXBwZXIuIik7CiAgICAgcmVtb3ZlKGtQcm9maWxpbmdSZXN1bHRzKTsgIC8vIHJlbW92ZSBwcmV2aW91cyByZXN1bHQgc28gdGhhdCBpdCB3b24ndCBiZSBsb2FkZWQgdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5ldyBNZWRpYUNvZGVjTGlzdAotICAgIHNwPE1lZGlhQ29kZWNMaXN0PiBjb2RlY0xpc3QobmV3IE1lZGlhQ29kZWNMaXN0KCZzT214SW5mb0J1aWxkZXIpKTsKKyAgICBzcDxNZWRpYUNvZGVjTGlzdD4gY29kZWNMaXN0KG5ldyBNZWRpYUNvZGVjTGlzdChHZXRCdWlsZGVycygpKSk7CiAgICAgaWYgKGNvZGVjTGlzdC0+aW5pdENoZWNrKCkgIT0gT0spIHsKICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBjcmVhdGUgYSBuZXcgTWVkaWFDb2RlY0xpc3QsIHNraXBwaW5nIGNvZGVjIHByb2ZpbGluZy4iKTsKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC0xMDAsNyArMTE5LDcgQEAKICAgICBBTE9HVigiQ29kZWMgcHJvZmlsaW5nIHN0YXJ0ZWQuIik7CiAgICAgcHJvZmlsZUNvZGVjcyhpbmZvcywga1Byb2ZpbGluZ1Jlc3VsdHMpOwogICAgIEFMT0dWKCJDb2RlYyBwcm9maWxpbmcgY29tcGxldGVkLiIpOwotICAgIGNvZGVjTGlzdCA9IG5ldyBNZWRpYUNvZGVjTGlzdCgmc09teEluZm9CdWlsZGVyKTsKKyAgICBjb2RlY0xpc3QgPSBuZXcgTWVkaWFDb2RlY0xpc3QoR2V0QnVpbGRlcnMoKSk7CiAgICAgaWYgKGNvZGVjTGlzdC0+aW5pdENoZWNrKCkgIT0gT0spIHsKICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBwYXJzZSBwcm9maWxpbmcgcmVzdWx0cy4iKTsKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC0xMTgsNyArMTM3LDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soc0luaXRNdXRleCk7CiAKICAgICBpZiAoc0NvZGVjTGlzdCA9PSBudWxscHRyKSB7Ci0gICAgICAgIE1lZGlhQ29kZWNMaXN0ICpjb2RlY0xpc3QgPSBuZXcgTWVkaWFDb2RlY0xpc3QoJnNPbXhJbmZvQnVpbGRlcik7CisgICAgICAgIE1lZGlhQ29kZWNMaXN0ICpjb2RlY0xpc3QgPSBuZXcgTWVkaWFDb2RlY0xpc3QoR2V0QnVpbGRlcnMoKSk7CiAgICAgICAgIGlmIChjb2RlY0xpc3QtPmluaXRDaGVjaygpID09IE9LKSB7CiAgICAgICAgICAgICBzQ29kZWNMaXN0ID0gY29kZWNMaXN0OwogCkBAIC0xNzEsMTEgKzE5MCwzNCBAQAogICAgIHJldHVybiBzUmVtb3RlTGlzdDsKIH0KIAotTWVkaWFDb2RlY0xpc3Q6Ok1lZGlhQ29kZWNMaXN0KE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2UqIGJ1aWxkZXIpIHsKK01lZGlhQ29kZWNMaXN0OjpNZWRpYUNvZGVjTGlzdChzdGQ6OnZlY3RvcjxNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlKj4gYnVpbGRlcnMpIHsKICAgICBtR2xvYmFsU2V0dGluZ3MgPSBuZXcgQU1lc3NhZ2UoKTsKICAgICBtQ29kZWNJbmZvcy5jbGVhcigpOwotICAgIE1lZGlhQ29kZWNMaXN0V3JpdGVyIHdyaXRlcih0aGlzKTsKLSAgICBtSW5pdENoZWNrID0gYnVpbGRlci0+YnVpbGRNZWRpYUNvZGVjTGlzdCgmd3JpdGVyKTsKKyAgICBNZWRpYUNvZGVjTGlzdFdyaXRlciB3cml0ZXI7CisgICAgZm9yIChNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlICpidWlsZGVyIDogYnVpbGRlcnMpIHsKKyAgICAgICAgaWYgKGJ1aWxkZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0QoImlnbm9yZWQgYSBudWxsIGJ1aWxkZXIiKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG1Jbml0Q2hlY2sgPSBidWlsZGVyLT5idWlsZE1lZGlhQ29kZWNMaXN0KCZ3cml0ZXIpOworICAgICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgd3JpdGVyLndyaXRlR2xvYmFsU2V0dGluZ3MobUdsb2JhbFNldHRpbmdzKTsKKyAgICB3cml0ZXIud3JpdGVDb2RlY0luZm9zKCZtQ29kZWNJbmZvcyk7CisgICAgc3RkOjpzdGFibGVfc29ydCgKKyAgICAgICAgICAgIG1Db2RlY0luZm9zLmJlZ2luKCksCisgICAgICAgICAgICBtQ29kZWNJbmZvcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmaW5mbzEsIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmaW5mbzIpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5mbzIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbmZvMSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmZvMS0+cmFuaygpIDwgaW5mbzItPnJhbmsoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKIH0KIAogTWVkaWFDb2RlY0xpc3Q6On5NZWRpYUNvZGVjTGlzdCgpIHsKQEAgLTE4NSwyMyArMjI3LDYgQEAKICAgICByZXR1cm4gbUluaXRDaGVjazsKIH0KIAotTWVkaWFDb2RlY0xpc3RXcml0ZXI6Ok1lZGlhQ29kZWNMaXN0V3JpdGVyKE1lZGlhQ29kZWNMaXN0KiBsaXN0KSA6Ci0gICAgbUxpc3QobGlzdCkgewotfQotCi12b2lkIE1lZGlhQ29kZWNMaXN0V3JpdGVyOjphZGRHbG9iYWxTZXR0aW5nKAotICAgICAgICBjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gICAgbUxpc3QtPm1HbG9iYWxTZXR0aW5ncy0+c2V0U3RyaW5nKGtleSwgdmFsdWUpOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+Ci0gICAgICAgIE1lZGlhQ29kZWNMaXN0V3JpdGVyOjphZGRNZWRpYUNvZGVjSW5mbygpIHsKLSAgICBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IG5ldyBNZWRpYUNvZGVjSW5mbygpOwotICAgIG1MaXN0LT5tQ29kZWNJbmZvcy5wdXNoX2JhY2soaW5mbyk7Ci0gICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4oCi0gICAgICAgICAgICBuZXcgTWVkaWFDb2RlY0luZm9Xcml0ZXIoaW5mby5nZXQoKSkpOwotfQotCiAvLyBsZWdhY3kgbWV0aG9kIGZvciBub24tYWR2YW5jZWQgY29kZWNzCiBzc2l6ZV90IE1lZGlhQ29kZWNMaXN0OjpmaW5kQ29kZWNCeVR5cGUoCiAgICAgICAgIGNvbnN0IGNoYXIgKnR5cGUsIGJvb2wgZW5jb2Rlciwgc2l6ZV90IHN0YXJ0SW5kZXgpIGNvbnN0IHsKQEAgLTI2Miw3ICsyODcsOSBAQAogLy9zdGF0aWMKIGJvb2wgTWVkaWFDb2RlY0xpc3Q6OmlzU29mdHdhcmVDb2RlYyhjb25zdCBBU3RyaW5nICZjb21wb25lbnROYW1lKSB7CiAgICAgcmV0dXJuIGNvbXBvbmVudE5hbWUuc3RhcnRzV2l0aElnbm9yZUNhc2UoIk9NWC5nb29nbGUuIikKLSAgICAgICAgfHwgIWNvbXBvbmVudE5hbWUuc3RhcnRzV2l0aElnbm9yZUNhc2UoIk9NWC4iKTsKKyAgICAgICAgICAgIHx8IGNvbXBvbmVudE5hbWUuc3RhcnRzV2l0aElnbm9yZUNhc2UoImMyLmFuZHJvaWQuIikKKyAgICAgICAgICAgIHx8ICghY29tcG9uZW50TmFtZS5zdGFydHNXaXRoSWdub3JlQ2FzZSgiT01YLiIpCisgICAgICAgICAgICAgICAgICAgICYmICFjb21wb25lbnROYW1lLnN0YXJ0c1dpdGhJZ25vcmVDYXNlKCJjMi4iKSk7CiB9CiAKIHN0YXRpYyBpbnQgY29tcGFyZVNvZnR3YXJlQ29kZWNzRmlyc3QoY29uc3QgQVN0cmluZyAqbmFtZTEsIGNvbnN0IEFTdHJpbmcgKm5hbWUyKSB7CkBAIC0yNzMsNyArMzAwLDE0IEBACiAgICAgICAgIHJldHVybiBpc1NvZnR3YXJlQ29kZWMyIC0gaXNTb2Z0d2FyZUNvZGVjMTsKICAgICB9CiAKLSAgICAvLyBzb3J0IG9yZGVyIDI6IE9NWCBjb2RlY3MgYXJlIGZpcnN0IChsb3dlcikKKyAgICAvLyBzb3J0IG9yZGVyIDI6IENvZGVjIDIuMCBjb2RlY3MgYXJlIGZpcnN0IChsb3dlcikKKyAgICBib29sIGlzQzJfMSA9IG5hbWUxLT5zdGFydHNXaXRoSWdub3JlQ2FzZSgiYzIuIik7CisgICAgYm9vbCBpc0MyXzIgPSBuYW1lMi0+c3RhcnRzV2l0aElnbm9yZUNhc2UoImMyLiIpOworICAgIGlmIChpc0MyXzEgIT0gaXNDMl8yKSB7CisgICAgICAgIHJldHVybiBpc0MyXzIgLSBpc0MyXzE7CisgICAgfQorCisgICAgLy8gc29ydCBvcmRlciAzOiBPTVggY29kZWNzIGFyZSBmaXJzdCAobG93ZXIpCiAgICAgYm9vbCBpc09NWDEgPSBuYW1lMS0+c3RhcnRzV2l0aElnbm9yZUNhc2UoIk9NWC4iKTsKICAgICBib29sIGlzT01YMiA9IG5hbWUyLT5zdGFydHNXaXRoSWdub3JlQ2FzZSgiT01YLiIpOwogICAgIHJldHVybiBpc09NWDIgLSBpc09NWDE7CkBAIC0yODIsMTEgKzMxNiw4IEBACiAvL3N0YXRpYwogdm9pZCBNZWRpYUNvZGVjTGlzdDo6ZmluZE1hdGNoaW5nQ29kZWNzKAogICAgICAgICBjb25zdCBjaGFyICptaW1lLCBib29sIGVuY29kZXIsIHVpbnQzMl90IGZsYWdzLAotICAgICAgICBWZWN0b3I8QVN0cmluZz4gKm1hdGNoZXMsIFZlY3RvcjxBU3RyaW5nPiAqb3duZXJzKSB7CisgICAgICAgIFZlY3RvcjxBU3RyaW5nPiAqbWF0Y2hlcykgewogICAgIG1hdGNoZXMtPmNsZWFyKCk7Ci0gICAgaWYgKG93bmVycyAhPSBudWxscHRyKSB7Ci0gICAgICAgIG93bmVycy0+Y2xlYXIoKTsKLSAgICB9CiAKICAgICBjb25zdCBzcDxJTWVkaWFDb2RlY0xpc3Q+IGxpc3QgPSBnZXRJbnN0YW5jZSgpOwogICAgIGlmIChsaXN0ID09IG51bGxwdHIpIHsKQEAgLTMxMiw5ICszNDMsNiBAQAogICAgICAgICAgICAgQUxPR1YoInNraXBwaW5nIFNXIGNvZGVjICclcyciLCBjb21wb25lbnROYW1lLmNfc3RyKCkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbWF0Y2hlcy0+cHVzaChjb21wb25lbnROYW1lKTsKLSAgICAgICAgICAgIGlmIChvd25lcnMgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIG93bmVycy0+cHVzaChBU3RyaW5nKGluZm8tPmdldE93bmVyTmFtZSgpKSk7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigibWF0Y2hpbmcgJyVzJyIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMjUsNyArMzUzLDQgQEAKICAgICB9CiB9CiAKLU1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2U6On5NZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlKCkgewotfQotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuY3BwCmluZGV4IDY5MjBlNTEuLmNhYzUzZjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5jcHAKQEAgLTIyMiw3ICsyMjIsNyBAQAogICAgIEFTdHJpbmcgc3VwcG9ydE11bHRpcGxlU2VjdXJlQ29kZWNzID0gInRydWUiOwogICAgIGZvciAoY29uc3QgYXV0byYgaW5mbyA6IGluZm9zKSB7CiAgICAgICAgIEFTdHJpbmcgbmFtZSA9IGluZm8tPmdldENvZGVjTmFtZSgpOwotICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJPTVguZ29vZ2xlLiIpIHx8CisgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoIk9NWC5nb29nbGUuIikgfHwgbmFtZS5zdGFydHNXaXRoKCJjMi5hbmRyb2lkLiIpIHx8CiAgICAgICAgICAgICAgICAgLy8gVE9ETzogcmVlbmFibGUgYmVsb3cgY29kZWNzIG9uY2UgZml4ZWQKICAgICAgICAgICAgICAgICBuYW1lID09ICJPTVguSW50ZWwuVmlkZW9EZWNvZGVyLlZQOS5oeWJyaWQiKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzJlNDcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFDb2RlY0xpc3RXcml0ZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjSW5mby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3ZvaWQgTWVkaWFDb2RlY0xpc3RXcml0ZXI6OmFkZEdsb2JhbFNldHRpbmcoCisgICAgICAgIGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFsdWUpIHsKKyAgICBtR2xvYmFsU2V0dGluZ3MuZW1wbGFjZV9iYWNrKGtleSwgdmFsdWUpOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+CisgICAgICAgIE1lZGlhQ29kZWNMaXN0V3JpdGVyOjphZGRNZWRpYUNvZGVjSW5mbygpIHsKKyAgICBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IG5ldyBNZWRpYUNvZGVjSW5mbygpOworICAgIG1Db2RlY0luZm9zLnB1c2hfYmFjayhpbmZvKTsKKyAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvV3JpdGVyPigKKyAgICAgICAgICAgIG5ldyBNZWRpYUNvZGVjSW5mb1dyaXRlcihpbmZvLmdldCgpKSk7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY0xpc3RXcml0ZXI6OndyaXRlR2xvYmFsU2V0dGluZ3MoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZ2xvYmFsU2V0dGluZ3MpIGNvbnN0IHsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+ICZrdiA6IG1HbG9iYWxTZXR0aW5ncykgeworICAgICAgICBnbG9iYWxTZXR0aW5ncy0+c2V0U3RyaW5nKGt2LmZpcnN0LmNfc3RyKCksIGt2LnNlY29uZC5jX3N0cigpKTsKKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFDb2RlY0xpc3RXcml0ZXI6OndyaXRlQ29kZWNJbmZvcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+PiAqY29kZWNJbmZvcykgY29uc3QgeworICAgIGZvciAoY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+ICZpbmZvIDogbUNvZGVjSW5mb3MpIHsKKyAgICAgICAgY29kZWNJbmZvcy0+cHVzaF9iYWNrKGluZm8pOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAKaW5kZXggZDgwOGU1Yi4uMjA4ODFhNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAKQEAgLTIzLDcgKzIzLDkgQEAKICNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQnVmZmVySG9sZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KQEAgLTMzLDcgKzM1LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogCkBAIC01OCw3ICs1OSw3IEBACiAgICAgdm9pZCBwYXVzZSgpOwogICAgIHZvaWQgcmVzdW1lKCk7CiAgICAgc3RhdHVzX3Qgc2V0U3RvcFRpbWVVcyhpbnQ2NF90IHN0b3BUaW1lVXMpOwotICAgIGJvb2wgcmVhZEJ1ZmZlcihNZWRpYUJ1ZmZlciAqKmJ1ZmZlcik7CisgICAgYm9vbCByZWFkQnVmZmVyKE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlcik7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwpAQCAtODUsMTQgKzg2LDE0IEBACiAgICAgICAgIGludDY0X3QgbVJlYWRQZW5kaW5nU2luY2U7CiAgICAgICAgIGJvb2wgbVBhdXNlZDsKICAgICAgICAgYm9vbCBtUHVsbGluZzsKLSAgICAgICAgVmVjdG9yPE1lZGlhQnVmZmVyICo+IG1SZWFkQnVmZmVyczsKKyAgICAgICAgVmVjdG9yPE1lZGlhQnVmZmVyQmFzZSAqPiBtUmVhZEJ1ZmZlcnM7CiAKICAgICAgICAgdm9pZCBmbHVzaCgpOwogICAgICAgICAvLyBpZiBxdWV1ZSBpcyBlbXB0eSwgcmV0dXJuIGZhbHNlIGFuZCBzZXQgKnxidWZmZXJ8IHRvIE5VTEwgLiBPdGhlcndpc2UsIHBvcAogICAgICAgICAvLyBidWZmZXIgZnJvbSBmcm9udCBvZiB0aGUgcXVldWUsIHBsYWNlIGl0IGludG8gKnxidWZmZXJ8IGFuZCByZXR1cm4gdHJ1ZS4KLSAgICAgICAgYm9vbCByZWFkQnVmZmVyKE1lZGlhQnVmZmVyICoqYnVmZmVyKTsKKyAgICAgICAgYm9vbCByZWFkQnVmZmVyKE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlcik7CiAgICAgICAgIC8vIGFkZCBhIGJ1ZmZlciB0byB0aGUgYmFjayBvZiB0aGUgcXVldWUKLSAgICAgICAgdm9pZCBwdXNoQnVmZmVyKE1lZGlhQnVmZmVyICptYnVmKTsKKyAgICAgICAgdm9pZCBwdXNoQnVmZmVyKE1lZGlhQnVmZmVyQmFzZSAqbWJ1Zik7CiAgICAgfTsKICAgICBNdXRleGVkPFF1ZXVlPiBtUXVldWU7CiAKQEAgLTEyMiwxMSArMTIzLDExIEBACiAgICAgbUxvb3Blci0+c3RvcCgpOwogfQogCi12b2lkIE1lZGlhQ29kZWNTb3VyY2U6OlB1bGxlcjo6UXVldWU6OnB1c2hCdWZmZXIoTWVkaWFCdWZmZXIgKm1idWYpIHsKK3ZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6UHVsbGVyOjpRdWV1ZTo6cHVzaEJ1ZmZlcihNZWRpYUJ1ZmZlckJhc2UgKm1idWYpIHsKICAgICBtUmVhZEJ1ZmZlcnMucHVzaF9iYWNrKG1idWYpOwogfQogCi1ib29sIE1lZGlhQ29kZWNTb3VyY2U6OlB1bGxlcjo6UXVldWU6OnJlYWRCdWZmZXIoTWVkaWFCdWZmZXIgKiptYnVmKSB7Citib29sIE1lZGlhQ29kZWNTb3VyY2U6OlB1bGxlcjo6UXVldWU6OnJlYWRCdWZmZXIoTWVkaWFCdWZmZXJCYXNlICoqbWJ1ZikgewogICAgIGlmIChtUmVhZEJ1ZmZlcnMuZW1wdHkoKSkgewogICAgICAgICAqbWJ1ZiA9IE5VTEw7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTEzNywxNCArMTM4LDE0IEBACiB9CiAKIHZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6UHVsbGVyOjpRdWV1ZTo6Zmx1c2goKSB7Ci0gICAgTWVkaWFCdWZmZXIgKm1idWY7CisgICAgTWVkaWFCdWZmZXJCYXNlICptYnVmOwogICAgIHdoaWxlIChyZWFkQnVmZmVyKCZtYnVmKSkgewogICAgICAgICAvLyB0aGVyZSBhcmUgbm8gbnVsbCBidWZmZXJzIGluIHRoZSBxdWV1ZQogICAgICAgICBtYnVmLT5yZWxlYXNlKCk7CiAgICAgfQogfQogCi1ib29sIE1lZGlhQ29kZWNTb3VyY2U6OlB1bGxlcjo6cmVhZEJ1ZmZlcihNZWRpYUJ1ZmZlciAqKm1idWYpIHsKK2Jvb2wgTWVkaWFDb2RlY1NvdXJjZTo6UHVsbGVyOjpyZWFkQnVmZmVyKE1lZGlhQnVmZmVyQmFzZSAqKm1idWYpIHsKICAgICBNdXRleGVkPFF1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1RdWV1ZSk7CiAgICAgcmV0dXJuIHF1ZXVlLT5yZWFkQnVmZmVyKG1idWYpOwogfQpAQCAtMjk3LDcgKzI5OCw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHF1ZXVlLnVubG9jaygpOwotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKm1idWYgPSBOVUxMOworICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICptYnVmID0gTlVMTDsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnJlYWQoJm1idWYpOwogICAgICAgICAgICAgcXVldWUubG9jaygpOwogCkBAIC00MTIsNyArNDEzLDcgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXIqKiBidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zKiAvKiBvcHRpb25zICovKSB7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSoqIGJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMqIC8qIG9wdGlvbnMgKi8pIHsKICAgICBNdXRleGVkPE91dHB1dD46OkxvY2tlZCBvdXRwdXQobU91dHB1dCk7CiAKICAgICAqYnVmZmVyID0gTlVMTDsKQEAgLTQyNyw3ICs0MjgsNyBAQAogICAgIHJldHVybiBvdXRwdXQtPm1FcnJvckNvZGU7CiB9CiAKLXZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgewordm9pZCBNZWRpYUNvZGVjU291cmNlOjpzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgewogICAgIGJ1ZmZlci0+c2V0T2JzZXJ2ZXIoMCk7CiAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiB9CkBAIC00NTcsMTMgKzQ1OCw2IEBACiAgICAgICBtR2VuZXJhdGlvbigwKSB7CiAgICAgQ0hFQ0sobUxvb3BlciAhPSBOVUxMKTsKIAotICAgIEFTdHJpbmcgbWltZTsKLSAgICBDSEVDSyhtT3V0cHV0Rm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKLQotICAgIGlmICghc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUuY19zdHIoKSwgNikpIHsKLSAgICAgICAgbUlzVmlkZW8gPSB0cnVlOwotICAgIH0KLQogICAgIGlmICghKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpKSB7CiAgICAgICAgIG1QdWxsZXIgPSBuZXcgUHVsbGVyKHNvdXJjZSk7CiAgICAgfQpAQCAtNDg3LDYgKzQ4MSw3IEBACiB9CiAKIHN0YXR1c190IE1lZGlhQ29kZWNTb3VyY2U6OmluaXRFbmNvZGVyKCkgeworCiAgICAgbVJlZmxlY3RvciA9IG5ldyBBSGFuZGxlclJlZmxlY3RvcjxNZWRpYUNvZGVjU291cmNlPih0aGlzKTsKICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobVJlZmxlY3Rvcik7CiAKQEAgLTUwMCwyMyArNDk1LDEyIEBACiAKICAgICBBU3RyaW5nIG91dHB1dE1JTUU7CiAgICAgQ0hFQ0sobU91dHB1dEZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZvdXRwdXRNSU1FKSk7CisgICAgbUlzVmlkZW8gPSBvdXRwdXRNSU1FLnN0YXJ0c1dpdGhJZ25vcmVDYXNlKCJ2aWRlby8iKTsKIAotICAgIFZlY3RvcjxBU3RyaW5nPiBtYXRjaGluZ0NvZGVjczsKLSAgICBNZWRpYUNvZGVjTGlzdDo6ZmluZE1hdGNoaW5nQ29kZWNzKAotICAgICAgICAgICAgb3V0cHV0TUlNRS5jX3N0cigpLCB0cnVlIC8qIGVuY29kZXIgKi8sCi0gICAgICAgICAgICAoKG1GbGFncyAmIEZMQUdfUFJFRkVSX1NPRlRXQVJFX0NPREVDKSA/IE1lZGlhQ29kZWNMaXN0OjprUHJlZmVyU29mdHdhcmVDb2RlY3MgOiAwKSwKLSAgICAgICAgICAgICZtYXRjaGluZ0NvZGVjcyk7Ci0KKyAgICBBU3RyaW5nIG5hbWU7CiAgICAgc3RhdHVzX3QgZXJyID0gTk9fSU5JVDsKLSAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgbWF0Y2hpbmdDb2RlY3Muc2l6ZSgpOyArK2l4KSB7Ci0gICAgICAgIG1FbmNvZGVyID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKAotICAgICAgICAgICAgICAgIG1Db2RlY0xvb3BlciwgbWF0Y2hpbmdDb2RlY3NbaXhdKTsKLQotICAgICAgICBpZiAobUVuY29kZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBBTE9HVigib3V0cHV0IGZvcm1hdCBpcyAnJXMnIiwgbU91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoMCkuY19zdHIoKSk7CisgICAgaWYgKG1PdXRwdXRGb3JtYXQtPmZpbmRTdHJpbmcoInRlc3RpbmctbmFtZSIsICZuYW1lKSkgeworICAgICAgICBtRW5jb2RlciA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZShtQ29kZWNMb29wZXIsIG5hbWUpOwogCiAgICAgICAgIG1FbmNvZGVyQWN0aXZpdHlOb3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRFbmNvZGVyQWN0aXZpdHksIG1SZWZsZWN0b3IpOwogICAgICAgICBtRW5jb2Rlci0+c2V0Q2FsbGJhY2sobUVuY29kZXJBY3Rpdml0eU5vdGlmeSk7CkBAIC01MjYsMTIgKzUxMCwzOCBAQAogICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIG5hdGl2ZVdpbmRvdyAqLywKICAgICAgICAgICAgICAgICAgICAgTlVMTCAvKiBjcnlwdG8gKi8sCiAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29kZWM6OkNPTkZJR1VSRV9GTEFHX0VOQ09ERSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVmVjdG9yPEFTdHJpbmc+IG1hdGNoaW5nQ29kZWNzOworICAgICAgICBNZWRpYUNvZGVjTGlzdDo6ZmluZE1hdGNoaW5nQ29kZWNzKAorICAgICAgICAgICAgICAgIG91dHB1dE1JTUUuY19zdHIoKSwgdHJ1ZSAvKiBlbmNvZGVyICovLAorICAgICAgICAgICAgICAgICgobUZsYWdzICYgRkxBR19QUkVGRVJfU09GVFdBUkVfQ09ERUMpID8gTWVkaWFDb2RlY0xpc3Q6OmtQcmVmZXJTb2Z0d2FyZUNvZGVjcyA6IDApLAorICAgICAgICAgICAgICAgICZtYXRjaGluZ0NvZGVjcyk7CiAKLSAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBtYXRjaGluZ0NvZGVjcy5zaXplKCk7ICsraXgpIHsKKyAgICAgICAgICAgIG1FbmNvZGVyID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKAorICAgICAgICAgICAgICAgICAgICBtQ29kZWNMb29wZXIsIG1hdGNoaW5nQ29kZWNzW2l4XSk7CisKKyAgICAgICAgICAgIGlmIChtRW5jb2RlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFMT0dWKCJvdXRwdXQgZm9ybWF0IGlzICclcyciLCBtT3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygwKS5jX3N0cigpKTsKKworICAgICAgICAgICAgbUVuY29kZXJBY3Rpdml0eU5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdEVuY29kZXJBY3Rpdml0eSwgbVJlZmxlY3Rvcik7CisgICAgICAgICAgICBtRW5jb2Rlci0+c2V0Q2FsbGJhY2sobUVuY29kZXJBY3Rpdml0eU5vdGlmeSk7CisKKyAgICAgICAgICAgIGVyciA9IG1FbmNvZGVyLT5jb25maWd1cmUoCisgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAvKiBuYXRpdmVXaW5kb3cgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIGNyeXB0byAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29kZWM6OkNPTkZJR1VSRV9GTEFHX0VOQ09ERSk7CisKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1FbmNvZGVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtRW5jb2RlciA9IE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgbUVuY29kZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUVuY29kZXIgPSBOVUxMOwogICAgIH0KIAogICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTYyNiw3ICs2MzYsNyBAQAogICAgICAgICBpZiAoIXJlYWNoZWRFT1MpIHsKICAgICAgICAgICAgIEFMT0dWKCJlbmNvZGVyICglcykgcmVhY2hlZCBFT1MiLCBtSXNWaWRlbyA/ICJ2aWRlbyIgOiAiYXVkaW8iKTsKICAgICAgICAgICAgIC8vIHJlbGVhc2UgYWxsIHVucmVhZCBtZWRpYSBidWZmZXJzCi0gICAgICAgICAgICBmb3IgKExpc3Q8TWVkaWFCdWZmZXIqPjo6aXRlcmF0b3IgaXQgPSBvdXRwdXQtPm1CdWZmZXJRdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgZm9yIChMaXN0PE1lZGlhQnVmZmVyQmFzZSo+OjppdGVyYXRvciBpdCA9IG91dHB1dC0+bUJ1ZmZlclF1ZXVlLmJlZ2luKCk7CiAgICAgICAgICAgICAgICAgICAgIGl0ICE9IG91dHB1dC0+bUJ1ZmZlclF1ZXVlLmVuZCgpOyBpdCsrKSB7CiAgICAgICAgICAgICAgICAgKCppdCktPnJlbGVhc2UoKTsKICAgICAgICAgICAgIH0KQEAgLTY0Myw3ICs2NTMsOSBAQAogCiAgICAgaWYgKG1TdG9wcGluZyAmJiByZWFjaGVkRU9TKSB7CiAgICAgICAgIEFMT0dJKCJlbmNvZGVyICglcykgc3RvcHBlZCIsIG1Jc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIpOwotICAgICAgICBtUHVsbGVyLT5zdG9wU291cmNlKCk7CisgICAgICAgIGlmIChtUHVsbGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1QdWxsZXItPnN0b3BTb3VyY2UoKTsKKyAgICAgICAgfQogICAgICAgICBBTE9HVigic291cmNlICglcykgc3RvcHBlZCIsIG1Jc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIpOwogICAgICAgICAvLyBwb3N0aW5nIHJlcGx5IHRvIGV2ZXJ5b25lIHRoYXQncyB3YWl0aW5nCiAgICAgICAgIExpc3Q8c3A8QVJlcGx5VG9rZW4+Pjo6aXRlcmF0b3IgaXQ7CkBAIC02NzAsNyArNjgyLDcgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6ZmVlZEVuY29kZXJJbnB1dEJ1ZmZlcnMoKSB7Ci0gICAgTWVkaWFCdWZmZXIqIG1idWYgPSBOVUxMOworICAgIE1lZGlhQnVmZmVyQmFzZSogbWJ1ZiA9IE5VTEw7CiAgICAgd2hpbGUgKCFtQXZhaWxFbmNvZGVySW5wdXRJbmRpY2VzLmVtcHR5KCkgJiYgbVB1bGxlci0+cmVhZEJ1ZmZlcigmbWJ1ZikpIHsKICAgICAgICAgc2l6ZV90IGJ1ZmZlckluZGV4ID0gKm1BdmFpbEVuY29kZXJJbnB1dEluZGljZXMuYmVnaW4oKTsKICAgICAgICAgbUF2YWlsRW5jb2RlcklucHV0SW5kaWNlcy5lcmFzZShtQXZhaWxFbmNvZGVySW5wdXRJbmRpY2VzLmJlZ2luKCkpOwpAQCAtNjgwLDcgKzY5Miw3IEBACiAgICAgICAgIHNpemVfdCBzaXplID0gMDsKIAogICAgICAgICBpZiAobWJ1ZiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBDSEVDSyhtYnVmLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CisgICAgICAgICAgICBDSEVDSyhtYnVmLT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKICAgICAgICAgICAgIGlmIChtRmlyc3RTYW1wbGVTeXN0ZW1UaW1lVXMgPCAwbGwpIHsKICAgICAgICAgICAgICAgICBtRmlyc3RTYW1wbGVTeXN0ZW1UaW1lVXMgPSBzeXN0ZW1UaW1lKCkgLyAxMDAwOwogICAgICAgICAgICAgICAgIGlmIChtUGF1c2VQZW5kaW5nKSB7CkBAIC03MDMsNyArNzE1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbUZpcnN0U2FtcGxlVGltZVVzID0gdGltZVVzOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpbnQ2NF90IGRyaWZ0VGltZVVzID0gMDsKLSAgICAgICAgICAgICAgICBpZiAobWJ1Zi0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5RHJpZnRUaW1lLCAmZHJpZnRUaW1lVXMpCisgICAgICAgICAgICAgICAgaWYgKG1idWYtPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5RHJpZnRUaW1lLCAmZHJpZnRUaW1lVXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAmJiBkcmlmdFRpbWVVcykgewogICAgICAgICAgICAgICAgICAgICBkcmlmdFRpbWVVcyA9IHRpbWVVcyAtIG1GaXJzdFNhbXBsZVRpbWVVcyAtIGRyaWZ0VGltZVVzOwogICAgICAgICAgICAgICAgIH0KQEAgLTcyOCw3ICs3NDAsOCBAQAogICAgICAgICAgICAgaWYgKG1Jc1ZpZGVvKSB7CiAgICAgICAgICAgICAgICAgLy8gdmlkZW8gZW5jb2RlciB3aWxsIHJlbGVhc2UgTWVkaWFCdWZmZXIgd2hlbiBkb25lCiAgICAgICAgICAgICAgICAgLy8gd2l0aCB1bmRlcmx5aW5nIGRhdGEuCi0gICAgICAgICAgICAgICAgaW5idWYtPnNldE1lZGlhQnVmZmVyQmFzZShtYnVmKTsKKyAgICAgICAgICAgICAgICBpbmJ1Zi0+bWV0YSgpLT5zZXRPYmplY3QoIm1lZGlhQnVmZmVySG9sZGVyIiwgbmV3IE1lZGlhQnVmZmVySG9sZGVyKG1idWYpKTsKKyAgICAgICAgICAgICAgICBtYnVmLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG1idWYtPnJlbGVhc2UoKTsKICAgICAgICAgICAgIH0KQEAgLTg5Myw3ICs5MDYsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqbWJ1ZiA9IG5ldyBNZWRpYUJ1ZmZlcihvdXRidWYtPnNpemUoKSk7CisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKm1idWYgPSBuZXcgTWVkaWFCdWZmZXIob3V0YnVmLT5zaXplKCkpOwogICAgICAgICAgICAgbWJ1Zi0+c2V0T2JzZXJ2ZXIodGhpcyk7CiAgICAgICAgICAgICBtYnVmLT5hZGRfcmVmKCk7CiAKQEAgLTkyNCw3ICs5MzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RpbmdUaW1lVXMgPSAqKG1EZWNvZGluZ1RpbWVRdWV1ZS5iZWdpbigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWNvZGluZ1RpbWVRdWV1ZS5lcmFzZShtRGVjb2RpbmdUaW1lUXVldWUuYmVnaW4oKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbWJ1Zi0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlEZWNvZGluZ1RpbWUsIGRlY29kaW5nVGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgbWJ1Zi0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleURlY29kaW5nVGltZSwgZGVjb2RpbmdUaW1lVXMpOwogCiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbdmlkZW9dIHRpbWUgJSIgUFJJZDY0ICIgdXMgKCUuMmYgc2VjcyksIGR0cy9wdHMgZGlmZiAlIiBQUklkNjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVVzLCB0aW1lVXMgLyAxRTYsIGRlY29kaW5nVGltZVVzIC0gdGltZVVzKTsKQEAgLTkzNCwxOCArOTQ3LDE4IEBACiAgICAgICAgICAgICAgICAgICAgIENIRUNLKCFtRHJpZnRUaW1lUXVldWUuZW1wdHkoKSk7CiAgICAgICAgICAgICAgICAgICAgIGRyaWZ0VGltZVVzID0gKihtRHJpZnRUaW1lUXVldWUuYmVnaW4oKSk7CiAgICAgICAgICAgICAgICAgICAgIG1EcmlmdFRpbWVRdWV1ZS5lcmFzZShtRHJpZnRUaW1lUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5RHJpZnRUaW1lLCBkcmlmdFRpbWVVcyk7CisgICAgICAgICAgICAgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlEcmlmdFRpbWUsIGRyaWZ0VGltZVVzKTsKICNlbmRpZiAvLyBERUJVR19EUklGVF9USU1FCiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbYXVkaW9dIHRpbWUgJSIgUFJJZDY0ICIgdXMgKCUuMmYgc2VjcyksIGRyaWZ0ICUiIFBSSWQ2NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lVXMsIHRpbWVVcyAvIDFFNiwgZHJpZnRUaW1lVXMpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisgICAgICAgICAgICAgICAgbWJ1Zi0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgMGxsKTsKLSAgICAgICAgICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzQ29kZWNDb25maWcsIHRydWUpOworICAgICAgICAgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCAwbGwpOworICAgICAgICAgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc0NvZGVjQ29uZmlnLCB0cnVlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChmbGFncyAmIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX1NZTkNGUkFNRSkgewotICAgICAgICAgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIHRydWUpOworICAgICAgICAgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgdHJ1ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtZW1jcHkobWJ1Zi0+ZGF0YSgpLCBvdXRidWYtPmRhdGEoKSwgb3V0YnVmLT5zaXplKCkpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MWM4MmIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIk1lZGlhRXh0cmFjdG9yIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8cHdkLmg+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL0FNUkV4dHJhY3Rvci5oIgotI2luY2x1ZGUgImluY2x1ZGUvTVAzRXh0cmFjdG9yLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oIgotI2luY2x1ZGUgImluY2x1ZGUvV0FWRXh0cmFjdG9yLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9PZ2dFeHRyYWN0b3IuaCIKLSNpbmNsdWRlICJpbmNsdWRlL01QRUcyUFNFeHRyYWN0b3IuaCIKLSNpbmNsdWRlICJpbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaCIKLSNpbmNsdWRlICJpbmNsdWRlL0ZMQUNFeHRyYWN0b3IuaCIKLSNpbmNsdWRlICJpbmNsdWRlL0FBQ0V4dHJhY3Rvci5oIgotI2luY2x1ZGUgImluY2x1ZGUvTWlkaUV4dHJhY3Rvci5oIgotCi0jaW5jbHVkZSAibWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuaCIKLQotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaD4KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KLQotLy8gc3RpbGwgZG9pbmcgc29tZSBvbi9vZmYgdG9nZ2xpbmcgaGVyZS4KLSNkZWZpbmUgTUVESUFfTE9HICAgICAgIDEKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIGtleSBmb3IgbWVkaWEgc3RhdGlzdGljcwotc3RhdGljIGNvbnN0IGNoYXIgKmtLZXlFeHRyYWN0b3IgPSAiZXh0cmFjdG9yIjsKLS8vIGF0dHJzIGZvciBtZWRpYSBzdGF0aXN0aWNzCi1zdGF0aWMgY29uc3QgY2hhciAqa0V4dHJhY3Rvck1pbWUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWV4dHJhY3Rvci5taW1lIjsKLXN0YXRpYyBjb25zdCBjaGFyICprRXh0cmFjdG9yVHJhY2tzID0gImFuZHJvaWQubWVkaWEubWVkaWFleHRyYWN0b3IubnRyayI7Ci1zdGF0aWMgY29uc3QgY2hhciAqa0V4dHJhY3RvckZvcm1hdCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhZXh0cmFjdG9yLmZtdCI7Ci0KLU1lZGlhRXh0cmFjdG9yOjpNZWRpYUV4dHJhY3RvcigpIHsKLSAgICBpZiAoIUxPR19OREVCVUcpIHsKLSAgICAgICAgdWlkX3QgdWlkID0gZ2V0dWlkKCk7Ci0gICAgICAgIHN0cnVjdCBwYXNzd2QgKnB3ID0gZ2V0cHd1aWQodWlkKTsKLSAgICAgICAgQUxPR0koImV4dHJhY3RvciBjcmVhdGVkIGluIHVpZDogJWQgKCVzKSIsIGdldHVpZCgpLCBwdy0+cHdfbmFtZSk7Ci0gICAgfQotCi0gICAgbUFuYWx5dGljc0l0ZW0gPSBOVUxMOwotICAgIGlmIChNRURJQV9MT0cpIHsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKGtLZXlFeHRyYWN0b3IpOwotICAgICAgICAodm9pZCkgbUFuYWx5dGljc0l0ZW0tPmdlbmVyYXRlU2Vzc2lvbklEKCk7Ci0gICAgfQotfQotCi1NZWRpYUV4dHJhY3Rvcjo6fk1lZGlhRXh0cmFjdG9yKCkgewotCi0gICAgLy8gbG9nIHRoZSBjdXJyZW50IHJlY29yZCwgcHJvdmlkZWQgaXQgaGFzIHNvbWUgaW5mb3JtYXRpb24gd29ydGggcmVjb3JkaW5nCi0gICAgaWYgKE1FRElBX0xPRykgewotICAgICAgICBpZiAobUFuYWx5dGljc0l0ZW0gIT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKG1BbmFseXRpY3NJdGVtLT5jb3VudCgpID4gMCkgewotICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRGaW5hbGl6ZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNlbGZyZWNvcmQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobUFuYWx5dGljc0l0ZW0gIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgbUFuYWx5dGljc0l0ZW07Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtID0gTlVMTDsKLSAgICB9Ci19Ci0KLXNwPE1ldGFEYXRhPiBNZWRpYUV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoKSB7Ci0gICAgcmV0dXJuIG5ldyBNZXRhRGF0YTsKLX0KLQotc3RhdHVzX3QgTWVkaWFFeHRyYWN0b3I6OmdldE1ldHJpY3MoUGFyY2VsICpyZXBseSkgewotCi0gICAgaWYgKG1BbmFseXRpY3NJdGVtID09IE5VTEwgfHwgcmVwbHkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBwb3B1bGF0ZU1ldHJpY3MoKTsKLSAgICBtQW5hbHl0aWNzSXRlbS0+d3JpdGVUb1BhcmNlbChyZXBseSk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgTWVkaWFFeHRyYWN0b3I6OnBvcHVsYXRlTWV0cmljcygpIHsKLSAgICBBTE9HVigiTWVkaWFFeHRyYWN0b3I6OnBvcHVsYXRlTWV0cmljcyIpOwotICAgIC8vIG5vcm1hbGx5IG92ZXJyaWRkZW4gaW4gc3ViY2xhc3NlcwotfQotCi11aW50MzJfdCBNZWRpYUV4dHJhY3Rvcjo6ZmxhZ3MoKSBjb25zdCB7Ci0gICAgcmV0dXJuIENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9QQVVTRSB8IENBTl9TRUVLOwotfQotCi0vLyBzdGF0aWMKLXNwPElNZWRpYUV4dHJhY3Rvcj4gTWVkaWFFeHRyYWN0b3I6OkNyZWF0ZSgKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSkgewotICAgIEFMT0dWKCJNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlICVzIiwgbWltZSk7Ci0KLSAgICBpZiAoIXByb3BlcnR5X2dldF9ib29sKCJtZWRpYS5zdGFnZWZyaWdodC5leHRyYWN0cmVtb3RlIiwgdHJ1ZSkpIHsKLSAgICAgICAgLy8gbG9jYWwgZXh0cmFjdG9yCi0gICAgICAgIEFMT0dXKCJjcmVhdGluZyBtZWRpYSBleHRyYWN0b3IgaW4gY2FsbGluZyBwcm9jZXNzIik7Ci0gICAgICAgIHJldHVybiBDcmVhdGVGcm9tU2VydmljZShzb3VyY2UsIG1pbWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIHJlbW90ZSBleHRyYWN0b3IKLSAgICAgICAgQUxPR1YoImdldCBzZXJ2aWNlIG1hbmFnZXIiKTsKLSAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmV4dHJhY3RvciIpKTsKLQotICAgICAgICBpZiAoYmluZGVyICE9IDApIHsKLSAgICAgICAgICAgIHNwPElNZWRpYUV4dHJhY3RvclNlcnZpY2U+IG1lZGlhRXhTZXJ2aWNlKGludGVyZmFjZV9jYXN0PElNZWRpYUV4dHJhY3RvclNlcnZpY2U+KGJpbmRlcikpOwotICAgICAgICAgICAgc3A8SU1lZGlhRXh0cmFjdG9yPiBleCA9IG1lZGlhRXhTZXJ2aWNlLT5tYWtlRXh0cmFjdG9yKHNvdXJjZS0+YXNJRGF0YVNvdXJjZSgpLCBtaW1lKTsKLSAgICAgICAgICAgIHJldHVybiBleDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJleHRyYWN0b3Igc2VydmljZSBub3QgcnVubmluZyIpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXNwPE1lZGlhRXh0cmFjdG9yPiBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlRnJvbVNlcnZpY2UoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpIHsKLQotICAgIEFMT0dWKCJNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlRnJvbVNlcnZpY2UgJXMiLCBtaW1lKTsKLSAgICBSZWdpc3RlckRlZmF1bHRTbmlmZmVycygpOwotCi0gICAgLy8gaW5pdGlhbGl6ZSBzb3VyY2UgZGVjcnlwdGlvbiBpZiBuZWVkZWQKLSAgICBzb3VyY2UtPkRybUluaXRpYWxpemF0aW9uKG51bGxwdHIgLyogbWltZSAqLyk7Ci0KLSAgICBzcDxBTWVzc2FnZT4gbWV0YTsKLQotICAgIFN0cmluZzggdG1wOwotICAgIGlmIChtaW1lID09IE5VTEwpIHsKLSAgICAgICAgZmxvYXQgY29uZmlkZW5jZTsKLSAgICAgICAgaWYgKCFzbmlmZihzb3VyY2UsICZ0bXAsICZjb25maWRlbmNlLCAmbWV0YSkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJGQUlMRUQgdG8gYXV0b2RldGVjdCBtZWRpYSBjb250ZW50LiIpOwotCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIG1pbWUgPSB0bXAuc3RyaW5nKCk7Ci0gICAgICAgIEFMT0dWKCJBdXRvZGV0ZWN0ZWQgbWVkaWEgY29udGVudCBhcyAnJXMnIHdpdGggY29uZmlkZW5jZSAlLjJmIiwKLSAgICAgICAgICAgICBtaW1lLCBjb25maWRlbmNlKTsKLSAgICB9Ci0KLSAgICBNZWRpYUV4dHJhY3RvciAqcmV0ID0gTlVMTDsKLSAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUc0KQotICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAobWltZSwgImF1ZGlvL21wNCIpKSB7Ci0gICAgICAgIHJldCA9IG5ldyBNUEVHNEV4dHJhY3Rvcihzb3VyY2UpOwotICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRykpIHsKLSAgICAgICAgcmV0ID0gbmV3IE1QM0V4dHJhY3Rvcihzb3VyY2UsIG1ldGEpOwotICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CKQotICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCKSkgewotICAgICAgICByZXQgPSBuZXcgQU1SRXh0cmFjdG9yKHNvdXJjZSk7Ci0gICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKSkgewotICAgICAgICByZXQgPSBuZXcgRkxBQ0V4dHJhY3Rvcihzb3VyY2UpOwotICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dBVikpIHsKLSAgICAgICAgcmV0ID0gbmV3IFdBVkV4dHJhY3Rvcihzb3VyY2UpOwotICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX09HRykpIHsKLSAgICAgICAgcmV0ID0gbmV3IE9nZ0V4dHJhY3Rvcihzb3VyY2UpOwotICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01BVFJPU0tBKSkgewotICAgICAgICByZXQgPSBuZXcgTWF0cm9za2FFeHRyYWN0b3Ioc291cmNlKTsKLSAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlRTKSkgewotICAgICAgICByZXQgPSBuZXcgTVBFRzJUU0V4dHJhY3Rvcihzb3VyY2UpOwotICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFMpKSB7Ci0gICAgICAgIHJldCA9IG5ldyBBQUNFeHRyYWN0b3Ioc291cmNlLCBtZXRhKTsKLSAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlBTKSkgewotICAgICAgICByZXQgPSBuZXcgTVBFRzJQU0V4dHJhY3Rvcihzb3VyY2UpOwotICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTUlESSkpIHsKLSAgICAgICAgcmV0ID0gbmV3IE1pZGlFeHRyYWN0b3Ioc291cmNlKTsKLSAgICB9Ci0KLSAgICBpZiAocmV0ICE9IE5VTEwpIHsKLSAgICAgICAvLyB0cmFjayB0aGUgY29udGFpbmVyIGZvcm1hdCAobXBlZywgYWFjLCB3dm0sIGV0YykKLSAgICAgICBpZiAoTUVESUFfTE9HKSB7Ci0gICAgICAgICAgaWYgKHJldC0+bUFuYWx5dGljc0l0ZW0gIT0gTlVMTCkgewotICAgICAgICAgICAgICBzaXplX3QgbnRyYWNrcyA9IHJldC0+Y291bnRUcmFja3MoKTsKLSAgICAgICAgICAgICAgcmV0LT5tQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrRXh0cmFjdG9yRm9ybWF0LCAgcmV0LT5uYW1lKCkpOwotICAgICAgICAgICAgICAvLyB0cmFja3MgKHNpemVfdCkKLSAgICAgICAgICAgICAgcmV0LT5tQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0V4dHJhY3RvclRyYWNrcywgIG50cmFja3MpOwotICAgICAgICAgICAgICAvLyBtZXRhZGF0YQotICAgICAgICAgICAgICBzcDxNZXRhRGF0YT4gcE1ldGFEYXRhID0gcmV0LT5nZXRNZXRhRGF0YSgpOwotICAgICAgICAgICAgICBpZiAocE1ldGFEYXRhICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmc4IHh4ID0gcE1ldGFEYXRhLT50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIC8vICd0aXRsJyAtLSBidXQgdGhpcyB2ZXJnZXMgaW50byBQSUkKLSAgICAgICAgICAgICAgICAvLyAnbWltZScKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lID0gTlVMTDsKLSAgICAgICAgICAgICAgICBpZiAocE1ldGFEYXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXQtPm1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtFeHRyYWN0b3JNaW1lLCAgbWltZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIHdoYXQgZWxzZSBpcyBpbnRlcmVzdGluZyBhbmQgbm90IGFscmVhZHkgYXZhaWxhYmxlPwotICAgICAgICAgICAgICB9Ci0JICB9Ci0gICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLU11dGV4IE1lZGlhRXh0cmFjdG9yOjpnU25pZmZlck11dGV4OwotTGlzdDxNZWRpYUV4dHJhY3Rvcjo6U25pZmZlckZ1bmM+IE1lZGlhRXh0cmFjdG9yOjpnU25pZmZlcnM7Ci1ib29sIE1lZGlhRXh0cmFjdG9yOjpnU25pZmZlcnNSZWdpc3RlcmVkID0gZmFsc2U7Ci0KLS8vIHN0YXRpYwotYm9vbCBNZWRpYUV4dHJhY3Rvcjo6c25pZmYoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwgc3A8QU1lc3NhZ2U+ICptZXRhKSB7Ci0gICAgKm1pbWVUeXBlID0gIiI7Ci0gICAgKmNvbmZpZGVuY2UgPSAwLjBmOwotICAgIG1ldGEtPmNsZWFyKCk7Ci0KLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhnU25pZmZlck11dGV4KTsKLSAgICAgICAgaWYgKCFnU25pZmZlcnNSZWdpc3RlcmVkKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKExpc3Q8U25pZmZlckZ1bmM+OjppdGVyYXRvciBpdCA9IGdTbmlmZmVycy5iZWdpbigpOwotICAgICAgICAgaXQgIT0gZ1NuaWZmZXJzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIFN0cmluZzggbmV3TWltZVR5cGU7Ci0gICAgICAgIGZsb2F0IG5ld0NvbmZpZGVuY2U7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBuZXdNZXRhOwotICAgICAgICBpZiAoKCppdCkoc291cmNlLCAmbmV3TWltZVR5cGUsICZuZXdDb25maWRlbmNlLCAmbmV3TWV0YSkpIHsKLSAgICAgICAgICAgIGlmIChuZXdDb25maWRlbmNlID4gKmNvbmZpZGVuY2UpIHsKLSAgICAgICAgICAgICAgICAqbWltZVR5cGUgPSBuZXdNaW1lVHlwZTsKLSAgICAgICAgICAgICAgICAqY29uZmlkZW5jZSA9IG5ld0NvbmZpZGVuY2U7Ci0gICAgICAgICAgICAgICAgKm1ldGEgPSBuZXdNZXRhOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuICpjb25maWRlbmNlID4gMC4wOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgTWVkaWFFeHRyYWN0b3I6OlJlZ2lzdGVyU25pZmZlcl9sKFNuaWZmZXJGdW5jIGZ1bmMpIHsKLSAgICBmb3IgKExpc3Q8U25pZmZlckZ1bmM+OjppdGVyYXRvciBpdCA9IGdTbmlmZmVycy5iZWdpbigpOwotICAgICAgICAgaXQgIT0gZ1NuaWZmZXJzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIGlmICgqaXQgPT0gZnVuYykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZ1NuaWZmZXJzLnB1c2hfYmFjayhmdW5jKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIE1lZGlhRXh0cmFjdG9yOjpSZWdpc3RlckRlZmF1bHRTbmlmZmVycygpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soZ1NuaWZmZXJNdXRleCk7Ci0gICAgaWYgKGdTbmlmZmVyc1JlZ2lzdGVyZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFJlZ2lzdGVyU25pZmZlcl9sKFNuaWZmTVBFRzQpOwotICAgIFJlZ2lzdGVyU25pZmZlcl9sKFNuaWZmTWF0cm9za2EpOwotICAgIFJlZ2lzdGVyU25pZmZlcl9sKFNuaWZmT2dnKTsKLSAgICBSZWdpc3RlclNuaWZmZXJfbChTbmlmZldBVik7Ci0gICAgUmVnaXN0ZXJTbmlmZmVyX2woU25pZmZGTEFDKTsKLSAgICBSZWdpc3RlclNuaWZmZXJfbChTbmlmZkFNUik7Ci0gICAgUmVnaXN0ZXJTbmlmZmVyX2woU25pZmZNUEVHMlRTKTsKLSAgICBSZWdpc3RlclNuaWZmZXJfbChTbmlmZk1QMyk7Ci0gICAgUmVnaXN0ZXJTbmlmZmVyX2woU25pZmZBQUMpOwotICAgIFJlZ2lzdGVyU25pZmZlcl9sKFNuaWZmTVBFRzJQUyk7Ci0gICAgUmVnaXN0ZXJTbmlmZmVyX2woU25pZmZNaWRpKTsKLQotICAgIGdTbmlmZmVyc1JlZ2lzdGVyZWQgPSB0cnVlOwotfQotCi0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmM2MWEwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcApAQCAtMCwwICsxLDM0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFFeHRyYWN0b3JGYWN0b3J5IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx6aXBhcmNoaXZlL3ppcF9hcmNoaXZlLmg+CisKKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0YXRpYworc3A8SU1lZGlhRXh0cmFjdG9yPiBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkNyZWF0ZSgKKyAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSkgeworICAgIEFMT0dWKCJNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkNyZWF0ZSAlcyIsIG1pbWUpOworCisgICAgaWYgKCFwcm9wZXJ0eV9nZXRfYm9vbCgibWVkaWEuc3RhZ2VmcmlnaHQuZXh0cmFjdHJlbW90ZSIsIHRydWUpKSB7CisgICAgICAgIC8vIGxvY2FsIGV4dHJhY3RvcgorICAgICAgICBBTE9HVygiY3JlYXRpbmcgbWVkaWEgZXh0cmFjdG9yIGluIGNhbGxpbmcgcHJvY2VzcyIpOworICAgICAgICByZXR1cm4gQ3JlYXRlRnJvbVNlcnZpY2Uoc291cmNlLCBtaW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyByZW1vdGUgZXh0cmFjdG9yCisgICAgICAgIEFMT0dWKCJnZXQgc2VydmljZSBtYW5hZ2VyIik7CisgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5leHRyYWN0b3IiKSk7CisKKyAgICAgICAgaWYgKGJpbmRlciAhPSAwKSB7CisgICAgICAgICAgICBzcDxJTWVkaWFFeHRyYWN0b3JTZXJ2aWNlPiBtZWRpYUV4U2VydmljZShpbnRlcmZhY2VfY2FzdDxJTWVkaWFFeHRyYWN0b3JTZXJ2aWNlPihiaW5kZXIpKTsKKyAgICAgICAgICAgIHNwPElNZWRpYUV4dHJhY3Rvcj4gZXggPSBtZWRpYUV4U2VydmljZS0+bWFrZUV4dHJhY3RvcigKKyAgICAgICAgICAgICAgICAgICAgQ3JlYXRlSURhdGFTb3VyY2VGcm9tRGF0YVNvdXJjZShzb3VyY2UpLCBtaW1lKTsKKyAgICAgICAgICAgIHJldHVybiBleDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJleHRyYWN0b3Igc2VydmljZSBub3QgcnVubmluZyIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3NwPElNZWRpYUV4dHJhY3Rvcj4gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpDcmVhdGVGcm9tU2VydmljZSgKKyAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSkgeworCisgICAgQUxPR1YoIk1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Q3JlYXRlRnJvbVNlcnZpY2UgJXMiLCBtaW1lKTsKKworICAgIFVwZGF0ZUV4dHJhY3RvcnMobnVsbHB0cik7CisKKyAgICAvLyBpbml0aWFsaXplIHNvdXJjZSBkZWNyeXB0aW9uIGlmIG5lZWRlZAorICAgIHNvdXJjZS0+RHJtSW5pdGlhbGl6YXRpb24obnVsbHB0ciAvKiBtaW1lICovKTsKKworICAgIHZvaWQgKm1ldGEgPSBudWxscHRyOworICAgIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBjcmVhdG9yID0gTlVMTDsKKyAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jIGZyZWVNZXRhID0gbnVsbHB0cjsKKyAgICBmbG9hdCBjb25maWRlbmNlOworICAgIHNwPEV4dHJhY3RvclBsdWdpbj4gcGx1Z2luOworICAgIGNyZWF0b3IgPSBzbmlmZihzb3VyY2UuZ2V0KCksICZjb25maWRlbmNlLCAmbWV0YSwgJmZyZWVNZXRhLCBwbHVnaW4pOworICAgIGlmICghY3JlYXRvcikgeworICAgICAgICBBTE9HVigiRkFJTEVEIHRvIGF1dG9kZXRlY3QgbWVkaWEgY29udGVudC4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgTWVkaWFFeHRyYWN0b3IgKnJldCA9IGNyZWF0b3Ioc291cmNlLmdldCgpLCBtZXRhKTsKKyAgICBpZiAobWV0YSAhPSBudWxscHRyICYmIGZyZWVNZXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgZnJlZU1ldGEobWV0YSk7CisgICAgfQorCisgICAgQUxPR1YoIkNyZWF0ZWQgYW4gZXh0cmFjdG9yICclcycgd2l0aCBjb25maWRlbmNlICUuMmYiLAorICAgICAgICAgcmV0ICE9IG51bGxwdHIgPyByZXQtPm5hbWUoKSA6ICI8bnVsbD4iLCBjb25maWRlbmNlKTsKKworICAgIHJldHVybiBDcmVhdGVJTWVkaWFFeHRyYWN0b3JGcm9tTWVkaWFFeHRyYWN0b3IocmV0LCBzb3VyY2UsIHBsdWdpbik7Cit9CisKKy8vc3RhdGljCit2b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6TG9hZFBsdWdpbnMoY29uc3QgOjpzdGQ6OnN0cmluZyYgYXBrUGF0aCkgeworICAgIC8vIFRPRE86IFZlcmlmeSBhcGsgcGF0aCB3aXRoIHBhY2thZ2UgbWFuYWdlciBpbiBleHRyYWN0b3IgcHJvY2Vzcy4KKyAgICBBTE9HVigiTG9hZCBwbHVnaW5zIGZyb206ICVzIiwgYXBrUGF0aC5jX3N0cigpKTsKKyAgICBVcGRhdGVFeHRyYWN0b3JzKGFwa1BhdGguZW1wdHkoKSA/IG51bGxwdHIgOiBhcGtQYXRoLmNfc3RyKCkpOworfQorCitzdHJ1Y3QgRXh0cmFjdG9yUGx1Z2luIDogcHVibGljIFJlZkJhc2UgeworICAgIE1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgZGVmOworICAgIHZvaWQgKmxpYkhhbmRsZTsKKyAgICBTdHJpbmc4IGxpYlBhdGg7CisgICAgU3RyaW5nOCB1dWlkU3RyaW5nOworCisgICAgRXh0cmFjdG9yUGx1Z2luKE1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgZGVmaW5pdGlvbiwgdm9pZCAqaGFuZGxlLCBTdHJpbmc4ICZwYXRoKQorICAgICAgICA6IGRlZihkZWZpbml0aW9uKSwgbGliSGFuZGxlKGhhbmRsZSksIGxpYlBhdGgocGF0aCkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZiBNZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmOjpleHRyYWN0b3JfdXVpZDsgaSsrKSB7CisgICAgICAgICAgICB1dWlkU3RyaW5nLmFwcGVuZEZvcm1hdCgiJTAyeCIsIGRlZi5leHRyYWN0b3JfdXVpZC5iW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB+RXh0cmFjdG9yUGx1Z2luKCkgeworICAgICAgICBpZiAobGliSGFuZGxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJjbG9zaW5nIGhhbmRsZSBmb3IgJXMgJWQiLCBsaWJQYXRoLmNfc3RyKCksIGRlZi5leHRyYWN0b3JfdmVyc2lvbik7CisgICAgICAgICAgICBkbGNsb3NlKGxpYkhhbmRsZSk7CisgICAgICAgIH0KKyAgICB9Cit9OworCitNdXRleCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmdQbHVnaW5NdXRleDsKK3N0ZDo6c2hhcmVkX3B0cjxMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+PiBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmdQbHVnaW5zOworYm9vbCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmdQbHVnaW5zUmVnaXN0ZXJlZCA9IGZhbHNlOworCisvLyBzdGF0aWMKK01lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OnNuaWZmKAorICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsCisgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKmZyZWVNZXRhLCBzcDxFeHRyYWN0b3JQbHVnaW4+ICZwbHVnaW4pIHsKKyAgICAqY29uZmlkZW5jZSA9IDAuMGY7CisgICAgKm1ldGEgPSBudWxscHRyOworCisgICAgc3RkOjpzaGFyZWRfcHRyPExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4+IHBsdWdpbnM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soZ1BsdWdpbk11dGV4KTsKKyAgICAgICAgaWYgKCFnUGx1Z2luc1JlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHBsdWdpbnMgPSBnUGx1Z2luczsKKyAgICB9CisKKyAgICBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgY3VyQ3JlYXRvciA9IE5VTEw7CisgICAgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIGJlc3RDcmVhdG9yID0gTlVMTDsKKyAgICBmb3IgKGF1dG8gaXQgPSBwbHVnaW5zLT5iZWdpbigpOyBpdCAhPSBwbHVnaW5zLT5lbmQoKTsgKytpdCkgeworICAgICAgICBmbG9hdCBuZXdDb25maWRlbmNlOworICAgICAgICB2b2lkICpuZXdNZXRhID0gbnVsbHB0cjsKKyAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyBuZXdGcmVlTWV0YSA9IG51bGxwdHI7CisgICAgICAgIGlmICgoY3VyQ3JlYXRvciA9ICgqaXQpLT5kZWYuc25pZmYoc291cmNlLCAmbmV3Q29uZmlkZW5jZSwgJm5ld01ldGEsICZuZXdGcmVlTWV0YSkpKSB7CisgICAgICAgICAgICBpZiAobmV3Q29uZmlkZW5jZSA+ICpjb25maWRlbmNlKSB7CisgICAgICAgICAgICAgICAgKmNvbmZpZGVuY2UgPSBuZXdDb25maWRlbmNlOworICAgICAgICAgICAgICAgIGlmICgqbWV0YSAhPSBudWxscHRyICYmICpmcmVlTWV0YSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICgqZnJlZU1ldGEpKCptZXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKm1ldGEgPSBuZXdNZXRhOworICAgICAgICAgICAgICAgICpmcmVlTWV0YSA9IG5ld0ZyZWVNZXRhOworICAgICAgICAgICAgICAgIHBsdWdpbiA9ICppdDsKKyAgICAgICAgICAgICAgICBiZXN0Q3JlYXRvciA9IGN1ckNyZWF0b3I7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChuZXdNZXRhICE9IG51bGxwdHIgJiYgbmV3RnJlZU1ldGEgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBuZXdGcmVlTWV0YShuZXdNZXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYmVzdENyZWF0b3I7Cit9CisKKy8vIHN0YXRpYwordm9pZCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OlJlZ2lzdGVyRXh0cmFjdG9yKGNvbnN0IHNwPEV4dHJhY3RvclBsdWdpbj4gJnBsdWdpbiwKKyAgICAgICAgTGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCkgeworICAgIC8vIHNhbml0eSBjaGVjayBjaGVjayBzdHJ1Y3QgdmVyc2lvbiwgdXVpZCwgbmFtZQorICAgIGlmIChwbHVnaW4tPmRlZi5kZWZfdmVyc2lvbiA9PSAwCisgICAgICAgICAgICB8fCBwbHVnaW4tPmRlZi5kZWZfdmVyc2lvbiA+IE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTikgeworICAgICAgICBBTE9HRSgiZG9uJ3QgdW5kZXJzdGFuZCBleHRyYWN0b3IgZm9ybWF0ICV1LCBpZ25vcmluZy4iLCBwbHVnaW4tPmRlZi5kZWZfdmVyc2lvbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKG1lbWNtcCgmcGx1Z2luLT5kZWYuZXh0cmFjdG9yX3V1aWQsICJcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMCIsIDE2KSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJpbnZhbGlkIFVVSUQsIGlnbm9yaW5nIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHBsdWdpbi0+ZGVmLmV4dHJhY3Rvcl9uYW1lID09IE5VTEwgfHwgc3RybGVuKHBsdWdpbi0+ZGVmLmV4dHJhY3Rvcl9uYW1lKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJleHRyYWN0b3JzIHNob3VsZCBoYXZlIGEgbmFtZSwgaWdub3JpbmciKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoYXV0byBpdCA9IHBsdWdpbkxpc3QuYmVnaW4oKTsgaXQgIT0gcGx1Z2luTGlzdC5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAobWVtY21wKCYoKCppdCktPmRlZi5leHRyYWN0b3JfdXVpZCksICZwbHVnaW4tPmRlZi5leHRyYWN0b3JfdXVpZCwgMTYpID09IDApIHsKKyAgICAgICAgICAgIC8vIHRoZXJlJ3MgYWxyZWFkeSBhbiBleHRyYWN0b3Igd2l0aCB0aGUgc2FtZSB1dWlkCisgICAgICAgICAgICBpZiAoKCppdCktPmRlZi5leHRyYWN0b3JfdmVyc2lvbiA8IHBsdWdpbi0+ZGVmLmV4dHJhY3Rvcl92ZXJzaW9uKSB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyBvbmUgaXMgbmV3ZXIsIHJlcGxhY2UgdGhlIG9sZCBvbmUKKyAgICAgICAgICAgICAgICBBTE9HVygicmVwbGFjaW5nIGV4dHJhY3RvciAnJXMnIHZlcnNpb24gJXUgd2l0aCB2ZXJzaW9uICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi0+ZGVmLmV4dHJhY3Rvcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgKCppdCktPmRlZi5leHRyYWN0b3JfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi0+ZGVmLmV4dHJhY3Rvcl92ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBwbHVnaW5MaXN0LmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nIGV4dHJhY3RvciAnJXMnIHZlcnNpb24gJXUgaW4gZmF2b3Igb2YgdmVyc2lvbiAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4tPmRlZi5leHRyYWN0b3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi0+ZGVmLmV4dHJhY3Rvcl92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgKCppdCktPmRlZi5leHRyYWN0b3JfdmVyc2lvbik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJyZWdpc3RlcmluZyBleHRyYWN0b3IgZm9yICVzIiwgcGx1Z2luLT5kZWYuZXh0cmFjdG9yX25hbWUpOworICAgIHBsdWdpbkxpc3QucHVzaF9iYWNrKHBsdWdpbik7Cit9CisKKy8vc3RhdGljCit2b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6UmVnaXN0ZXJFeHRyYWN0b3JzSW5BcGsoCisgICAgICAgIGNvbnN0IGNoYXIgKmFwa1BhdGgsIExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpIHsKKyAgICBBTE9HVigic2VhcmNoIGZvciBwbHVnaW5zIGF0ICVzIiwgYXBrUGF0aCk7CisgICAgWmlwQXJjaGl2ZUhhbmRsZSB6aXBIYW5kbGU7CisgICAgaW50MzJfdCByZXQgPSBPcGVuQXJjaGl2ZShhcGtQYXRoLCAmemlwSGFuZGxlKTsKKyAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgY2hhciBhYmlbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICAgICAgcHJvcGVydHlfZ2V0KCJyby5wcm9kdWN0LmNwdS5hYmkiLCBhYmksICJhcm02NC12OGEiKTsKKyAgICAgICAgU3RyaW5nOCBwcmVmaXg4ID0gU3RyaW5nODo6Zm9ybWF0KCJsaWIvJXMvIiwgYWJpKTsKKyAgICAgICAgWmlwU3RyaW5nIHByZWZpeChwcmVmaXg4LmNfc3RyKCkpOworICAgICAgICBaaXBTdHJpbmcgc3VmZml4KCJleHRyYWN0b3Iuc28iKTsKKyAgICAgICAgdm9pZCogY29va2llOworICAgICAgICByZXQgPSBTdGFydEl0ZXJhdGlvbih6aXBIYW5kbGUsICZjb29raWUsICZwcmVmaXgsICZzdWZmaXgpOworICAgICAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5OworICAgICAgICAgICAgWmlwU3RyaW5nIG5hbWU7CisgICAgICAgICAgICB3aGlsZSAoTmV4dChjb29raWUsICZlbnRyeSwgJm5hbWUpID09IDApIHsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IGxpYlBhdGggPSBTdHJpbmc4KGFwa1BhdGgpICsgIiEvIiArCisgICAgICAgICAgICAgICAgICAgIFN0cmluZzgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4obmFtZS5uYW1lKSwgbmFtZS5uYW1lX2xlbmd0aCk7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogT3BlbiB3aXRoIGEgbGlua2VyIG5hbWVzcGFjZSBzbyB0aGF0IGl0IGNhbiBiZSBsaW5rZWQgd2l0aCBzdWItbGlicmFyaWVzCisgICAgICAgICAgICAgICAgLy8gd2l0aGluIHRoZSBhcGsgaW5zdGVhZCBvZiBzeXN0ZW0gbGlicmFyaWVzIGFscmVhZHkgbG9hZGVkLgorICAgICAgICAgICAgICAgIHZvaWQgKmxpYkhhbmRsZSA9IGRsb3BlbihsaWJQYXRoLnN0cmluZygpLCBSVExEX05PVyB8IFJUTERfTE9DQUwpOworICAgICAgICAgICAgICAgIGlmIChsaWJIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkdldEV4dHJhY3RvckRlZiBnZXREZWYgPQorICAgICAgICAgICAgICAgICAgICAgICAgKE1lZGlhRXh0cmFjdG9yOjpHZXRFeHRyYWN0b3JEZWYpIGRsc3ltKGxpYkhhbmRsZSwgIkdFVEVYVFJBQ1RPUkRFRiIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0RGVmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXJpbmcgc25pZmZlciBmb3IgJXMiLCBsaWJQYXRoLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyRXh0cmFjdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXh0cmFjdG9yUGx1Z2luKGdldERlZigpLCBsaWJIYW5kbGUsIGxpYlBhdGgpLCBwbHVnaW5MaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBkb2VzIG5vdCBjb250YWluIHNuaWZmZXIiLCBsaWJQYXRoLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRsY2xvc2UobGliSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjb3VsZG4ndCBkbG9wZW4oJXMpICVzIiwgbGliUGF0aC5zdHJpbmcoKSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFbmRJdGVyYXRpb24oY29va2llKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCJjb3VsZG4ndCBmaW5kIHBsdWdpbnMgZnJvbSAlcywgJWQiLCBhcGtQYXRoLCByZXQpOworICAgICAgICB9CisgICAgICAgIENsb3NlQXJjaGl2ZSh6aXBIYW5kbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCJjb3VsZG4ndCBvcGVuKCVzKSAlZCIsIGFwa1BhdGgsIHJldCk7CisgICAgfQorfQorCisvL3N0YXRpYwordm9pZCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OlJlZ2lzdGVyRXh0cmFjdG9yc0luU3lzdGVtKAorICAgICAgICBjb25zdCBjaGFyICpsaWJEaXJQYXRoLCBMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KSB7CisgICAgQUxPR1YoInNlYXJjaCBmb3IgcGx1Z2lucyBhdCAlcyIsIGxpYkRpclBhdGgpOworICAgIERJUiAqbGliRGlyID0gb3BlbmRpcihsaWJEaXJQYXRoKTsKKyAgICBpZiAobGliRGlyKSB7CisgICAgICAgIHN0cnVjdCBkaXJlbnQqIGxpYkVudHJ5OworICAgICAgICB3aGlsZSAoKGxpYkVudHJ5ID0gcmVhZGRpcihsaWJEaXIpKSkgeworICAgICAgICAgICAgU3RyaW5nOCBsaWJQYXRoID0gU3RyaW5nOChsaWJEaXJQYXRoKSArICIvIiArIGxpYkVudHJ5LT5kX25hbWU7CisgICAgICAgICAgICB2b2lkICpsaWJIYW5kbGUgPSBkbG9wZW4obGliUGF0aC5zdHJpbmcoKSwgUlRMRF9OT1cgfCBSVExEX0xPQ0FMKTsKKyAgICAgICAgICAgIGlmIChsaWJIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6R2V0RXh0cmFjdG9yRGVmIGdldERlZiA9CisgICAgICAgICAgICAgICAgICAgIChNZWRpYUV4dHJhY3Rvcjo6R2V0RXh0cmFjdG9yRGVmKSBkbHN5bShsaWJIYW5kbGUsICJHRVRFWFRSQUNUT1JERUYiKTsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0RGVmKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJyZWdpc3RlcmluZyBzbmlmZmVyIGZvciAlcyIsIGxpYlBhdGguc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBSZWdpc3RlckV4dHJhY3RvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXh0cmFjdG9yUGx1Z2luKGdldERlZigpLCBsaWJIYW5kbGUsIGxpYlBhdGgpLCBwbHVnaW5MaXN0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMgZG9lcyBub3QgY29udGFpbiBzbmlmZmVyIiwgbGliUGF0aC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGRsY2xvc2UobGliSGFuZGxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJjb3VsZG4ndCBkbG9wZW4oJXMpICVzIiwgbGliUGF0aC5zdHJpbmcoKSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsb3NlZGlyKGxpYkRpcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoImNvdWxkbid0IG9wZW5kaXIoJXMpIiwgbGliRGlyUGF0aCk7CisgICAgfQorfQorCisvLyBzdGF0aWMKK3ZvaWQgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpVcGRhdGVFeHRyYWN0b3JzKGNvbnN0IGNoYXIgKm5ld1VwZGF0ZUFwa1BhdGgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soZ1BsdWdpbk11dGV4KTsKKyAgICBpZiAobmV3VXBkYXRlQXBrUGF0aCAhPSBudWxscHRyKSB7CisgICAgICAgIGdQbHVnaW5zUmVnaXN0ZXJlZCA9IGZhbHNlOworICAgIH0KKyAgICBpZiAoZ1BsdWdpbnNSZWdpc3RlcmVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+Pj4gbmV3TGlzdChuZXcgTGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PigpKTsKKworICAgIFJlZ2lzdGVyRXh0cmFjdG9yc0luU3lzdGVtKCIvc3lzdGVtL2xpYiIKKyNpZmRlZiBfX0xQNjRfXworICAgICAgICAgICAgIjY0IgorI2VuZGlmCisgICAgICAgICAgICAiL2V4dHJhY3RvcnMiLCAqbmV3TGlzdCk7CisKKyAgICBSZWdpc3RlckV4dHJhY3RvcnNJblN5c3RlbSgiL3ZlbmRvci9saWIiCisjaWZkZWYgX19MUDY0X18KKyAgICAgICAgICAgICI2NCIKKyNlbmRpZgorICAgICAgICAgICAgIi9leHRyYWN0b3JzIiwgKm5ld0xpc3QpOworCisgICAgaWYgKG5ld1VwZGF0ZUFwa1BhdGggIT0gbnVsbHB0cikgeworICAgICAgICBSZWdpc3RlckV4dHJhY3RvcnNJbkFwayhuZXdVcGRhdGVBcGtQYXRoLCAqbmV3TGlzdCk7CisgICAgfQorCisgICAgZ1BsdWdpbnMgPSBuZXdMaXN0OworICAgIGdQbHVnaW5zUmVnaXN0ZXJlZCA9IHRydWU7Cit9CisKK3N0YXR1c190IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKGdQbHVnaW5NdXRleCk7CisgICAgU3RyaW5nOCBvdXQ7CisgICAgb3V0LmFwcGVuZCgiQXZhaWxhYmxlIGV4dHJhY3RvcnM6XG4iKTsKKyAgICBpZiAoZ1BsdWdpbnNSZWdpc3RlcmVkKSB7CisgICAgICAgIGZvciAoYXV0byBpdCA9IGdQbHVnaW5zLT5iZWdpbigpOyBpdCAhPSBnUGx1Z2lucy0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIG91dC5hcHBlbmRGb3JtYXQoIiAgJTI1czogdXVpZCglcyksIHZlcnNpb24oJXUpLCBwYXRoKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgKCppdCktPmRlZi5leHRyYWN0b3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgKCppdCktPnV1aWRTdHJpbmcuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgKCppdCktPmRlZi5leHRyYWN0b3JfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgKCppdCktPmxpYlBhdGguY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBvdXQuYXBwZW5kKCIgIChubyBwbHVnaW5zIHJlZ2lzdGVyZWQpXG4iKTsKKyAgICB9CisgICAgd3JpdGUoZmQsIG91dC5zdHJpbmcoKSwgb3V0LnNpemUoKSk7CisgICAgcmV0dXJuIE9LOworfQorCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYU11eGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuY3BwCmluZGV4IGM3Yjg4ODguLjIzZTU0M2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuY3BwCkBAIC0yMyw2ICsyMyw4IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KQEAgLTMxLDE3ICszMywyMiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RhdGljIGJvb2wgaXNNcDRGb3JtYXQoTWVkaWFNdXhlcjo6T3V0cHV0Rm9ybWF0IGZvcm1hdCkgeworICAgIHJldHVybiBmb3JtYXQgPT0gTWVkaWFNdXhlcjo6T1VUUFVUX0ZPUk1BVF9NUEVHXzQgfHwKKyAgICAgICAgICAgZm9ybWF0ID09IE1lZGlhTXV4ZXI6Ok9VVFBVVF9GT1JNQVRfVEhSRUVfR1BQIHx8CisgICAgICAgICAgIGZvcm1hdCA9PSBNZWRpYU11eGVyOjpPVVRQVVRfRk9STUFUX0hFSUY7Cit9CisKIE1lZGlhTXV4ZXI6Ok1lZGlhTXV4ZXIoaW50IGZkLCBPdXRwdXRGb3JtYXQgZm9ybWF0KQogICAgIDogbUZvcm1hdChmb3JtYXQpLAogICAgICAgbVN0YXRlKFVOSU5JVElBTElaRUQpIHsKLSAgICBpZiAoZm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfTVBFR180IHx8IGZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX1RIUkVFX0dQUCkgeworICAgIGlmIChpc01wNEZvcm1hdChmb3JtYXQpKSB7CiAgICAgICAgIG1Xcml0ZXIgPSBuZXcgTVBFRzRXcml0ZXIoZmQpOwogICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfV0VCTSkgewogICAgICAgICBtV3JpdGVyID0gbmV3IFdlYm1Xcml0ZXIoZmQpOwpAQCAtNDksNiArNTYsMTAgQEAKIAogICAgIGlmIChtV3JpdGVyICE9IE5VTEwpIHsKICAgICAgICAgbUZpbGVNZXRhID0gbmV3IE1ldGFEYXRhOworICAgICAgICBpZiAoZm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfSEVJRikgeworICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBrZXkgdXNlcyByZWNvcmRlciBmaWxlIHR5cGVzLgorICAgICAgICAgICAgbUZpbGVNZXRhLT5zZXRJbnQzMihrS2V5RmlsZVR5cGUsIG91dHB1dF9mb3JtYXQ6Ok9VVFBVVF9GT1JNQVRfSEVJRik7CisgICAgICAgIH0KICAgICAgICAgbVN0YXRlID0gSU5JVElBTElaRUQ7CiAgICAgfQogfQpAQCAtMTA4LDggKzExOSw4IEBACiAgICAgICAgIEFMT0dFKCJzZXRMb2NhdGlvbigpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBzdGFydCgpLiIpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIGlmIChtRm9ybWF0ICE9IE9VVFBVVF9GT1JNQVRfTVBFR180ICYmIG1Gb3JtYXQgIT0gT1VUUFVUX0ZPUk1BVF9USFJFRV9HUFApIHsKLSAgICAgICAgQUxPR0UoInNldExvY2F0aW9uKCkgaXMgb25seSBzdXBwb3J0ZWQgZm9yIC5tcDQgcHIgLjNncCBvdXRwdXQuIik7CisgICAgaWYgKCFpc01wNEZvcm1hdChtRm9ybWF0KSkgeworICAgICAgICBBTE9HRSgic2V0TG9jYXRpb24oKSBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgLm1wNCwgLjNncCBvciAuaGVpYyBvdXRwdXQuIik7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKQEAgLTE3MCwxMyArMTgxLDEzIEBACiAgICAgbWVkaWFCdWZmZXItPmFkZF9yZWYoKTsgLy8gUmVsZWFzZWQgaW4gTWVkaWFBZGFwdGVyOjpzaWduYWxCdWZmZXJSZXR1cm5lZCgpLgogICAgIG1lZGlhQnVmZmVyLT5zZXRfcmFuZ2UoYnVmZmVyLT5vZmZzZXQoKSwgYnVmZmVyLT5zaXplKCkpOwogCi0gICAgc3A8TWV0YURhdGE+IHNhbXBsZU1ldGFEYXRhID0gbWVkaWFCdWZmZXItPm1ldGFfZGF0YSgpOwotICAgIHNhbXBsZU1ldGFEYXRhLT5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKyAgICBNZXRhRGF0YUJhc2UgJnNhbXBsZU1ldGFEYXRhID0gbWVkaWFCdWZmZXItPm1ldGFfZGF0YSgpOworICAgIHNhbXBsZU1ldGFEYXRhLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOwogICAgIC8vIEp1c3Qgc2V0IHRoZSBrS2V5RGVjb2RpbmdUaW1lIGFzIHRoZSBwcmVzZW50YXRpb24gdGltZSBmb3Igbm93LgotICAgIHNhbXBsZU1ldGFEYXRhLT5zZXRJbnQ2NChrS2V5RGVjb2RpbmdUaW1lLCB0aW1lVXMpOworICAgIHNhbXBsZU1ldGFEYXRhLnNldEludDY0KGtLZXlEZWNvZGluZ1RpbWUsIHRpbWVVcyk7CiAKICAgICBpZiAoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19TWU5DRlJBTUUpIHsKLSAgICAgICAgc2FtcGxlTWV0YURhdGEtPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgdHJ1ZSk7CisgICAgICAgIHNhbXBsZU1ldGFEYXRhLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgdHJ1ZSk7CiAgICAgfQogCiAgICAgc3A8TWVkaWFBZGFwdGVyPiBjdXJyZW50VHJhY2sgPSBtVHJhY2tMaXN0W3RyYWNrSW5kZXhdOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTc3NTdhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU291cmNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1NZWRpYVNvdXJjZTo6TWVkaWFTb3VyY2UoKSB7fQotCi1NZWRpYVNvdXJjZTo6fk1lZGlhU291cmNlKCkge30KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU3luYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVN5bmMuY3BwCmluZGV4IDkyNzgzODEuLmJhMTRlNWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU3luYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFTeW5jLmNwcApAQCAtNjEsNiArNjEsNyBAQAogICAgICAgICBtTmV4dEJ1ZmZlckl0ZW1NZWRpYVVzKC0xKSwKICAgICAgICAgbVBsYXliYWNrUmF0ZSgwLjApIHsKICAgICBtTWVkaWFDbG9jayA9IG5ldyBNZWRpYUNsb2NrOworICAgIG1NZWRpYUNsb2NrLT5pbml0KCk7CiAKICAgICAvLyBpbml0aWFsaXplIHNldHRpbmdzCiAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSBBVURJT19QTEFZQkFDS19SQVRFX0RFRkFVTFQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZjZhZGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmNwcApAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZXRhRGF0YVV0aWxzIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworYm9vbCBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGludDMyX3Qgd2lkdGg7CisgICAgaW50MzJfdCBoZWlnaHQ7CisgICAgaW50MzJfdCBzYXJXaWR0aDsKKyAgICBpbnQzMl90IHNhckhlaWdodDsKKyAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gbmV3IEFCdWZmZXIoKHZvaWQqKWRhdGEsICBzaXplKTsKKyAgICBzcDxBQnVmZmVyPiBjc2QgPSBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoYWNjZXNzVW5pdCwgJndpZHRoLCAmaGVpZ2h0LCAmc2FyV2lkdGgsICZzYXJIZWlnaHQpOworICAgIGlmIChjc2QgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisKKyAgICBtZXRhLnNldERhdGEoa0tleUFWQ0MsIGtUeXBlQVZDQywgY3NkLT5kYXRhKCksIGNzZC0+c2l6ZSgpKTsKKyAgICBtZXRhLnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOworICAgIG1ldGEuc2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKKyAgICBpZiAoc2FyV2lkdGggPiAwICYmIHNhckhlaWdodCA+IDApIHsKKyAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5U0FSV2lkdGgsIHNhcldpZHRoKTsKKyAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5U0FSSGVpZ2h0LCBzYXJIZWlnaHQpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgdW5zaWduZWQgcHJvZmlsZSwgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCwKKyAgICAgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uKSB7CisgICAgaWYoc2FtcGxpbmdfZnJlcV9pbmRleCA+IDExdSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICBpbnQzMl90IGNoYW5uZWxDb3VudDsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrU2FtcGxpbmdGcmVxW10gPSB7CisgICAgICAgIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsIDI0MDAwLCAyMjA1MCwKKyAgICAgICAgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMAorICAgIH07CisgICAgc2FtcGxlUmF0ZSA9IGtTYW1wbGluZ0ZyZXFbc2FtcGxpbmdfZnJlcV9pbmRleF07CisgICAgY2hhbm5lbENvdW50ID0gY2hhbm5lbF9jb25maWd1cmF0aW9uOworCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1N0YXRpY0VTRFNbXSA9IHsKKyAgICAgICAgMHgwMywgMjIsCisgICAgICAgIDB4MDAsIDB4MDAsICAgICAvLyBFU19JRAorICAgICAgICAweDAwLCAgICAgICAgICAgLy8gc3RyZWFtRGVwZW5kZW5jZUZsYWcsIFVSTF9GbGFnLCBPQ1JzdHJlYW1GbGFnCisKKyAgICAgICAgMHgwNCwgMTcsCisgICAgICAgIDB4NDAsICAgICAgICAgICAgICAgICAgICAgICAvLyBBdWRpbyBJU08vSUVDIDE0NDk2LTMKKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKworICAgICAgICAweDA1LCAyLAorICAgICAgICAvLyBBdWRpb1NwZWNpZmljSW5mbyBmb2xsb3dzCisKKyAgICAgICAgLy8gb29vbyBvZmZmIGZjY2MgYzAwMAorICAgICAgICAvLyBvIC0gYXVkaW9PYmplY3RUeXBlCisgICAgICAgIC8vIGYgLSBzYW1wbGluZ0ZyZXFJbmRleAorICAgICAgICAvLyBjIC0gY2hhbm5lbENvbmZpZworICAgIH07CisKKyAgICBzaXplX3QgY3NkU2l6ZSA9IHNpemVvZihrU3RhdGljRVNEUykgKyAyOworICAgIHVpbnQ4X3QgKmNzZCA9IG5ldyB1aW50OF90W2NzZFNpemVdOworICAgIG1lbWNweShjc2QsIGtTdGF0aWNFU0RTLCBzaXplb2Yoa1N0YXRpY0VTRFMpKTsKKworICAgIGNzZFtzaXplb2Yoa1N0YXRpY0VTRFMpXSA9CisgICAgICAgICgocHJvZmlsZSArIDEpIDw8IDMpIHwgKHNhbXBsaW5nX2ZyZXFfaW5kZXggPj4gMSk7CisKKyAgICBjc2Rbc2l6ZW9mKGtTdGF0aWNFU0RTKSArIDFdID0KKyAgICAgICAgKChzYW1wbGluZ19mcmVxX2luZGV4IDw8IDcpICYgMHg4MCkgfCAoY2hhbm5lbF9jb25maWd1cmF0aW9uIDw8IDMpOworCisgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKKworICAgIG1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOworICAgIG1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgY2hhbm5lbENvdW50KTsKKworICAgIG1ldGEuc2V0RGF0YShrS2V5RVNEUywgMCwgY3NkLCBjc2RTaXplKTsKKyAgICBkZWxldGUgW10gY3NkOworICAgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWlkaUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NaWRpRXh0cmFjdG9yLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkzMGJiYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NaWRpRXh0cmFjdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJNaWRpRXh0cmFjdG9yIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiaW5jbHVkZS9NaWRpRXh0cmFjdG9yLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9NaWRpSW9XcmFwcGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPGxpYnNvbml2b3gvZWFzX3JldmVyYi5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIGhvdyBtYW55IFNvbml2b3ggb3V0cHV0IGJ1ZmZlcnMgdG8gYWdncmVnYXRlIGludG8gb25lIE1lZGlhQnVmZmVyCi1zdGF0aWMgY29uc3QgaW50IE5VTV9DT01CSU5FX0JVRkZFUlMgPSA0OwotCi1jbGFzcyBNaWRpU291cmNlIDogcHVibGljIE1lZGlhU291cmNlIHsKLQotcHVibGljOgotICAgIE1pZGlTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBzcDxNaWRpRW5naW5lPiAmZW5naW5lLAotICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZ0cmFja01ldGFkYXRhKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfk1pZGlTb3VyY2UoKTsKLQotcHJpdmF0ZToKLSAgICBzcDxNaWRpRW5naW5lPiBtRW5naW5lOwotICAgIHNwPE1ldGFEYXRhPiBtVHJhY2tNZXRhZGF0YTsKLSAgICBib29sIG1Jbml0Q2hlY2s7Ci0gICAgYm9vbCBtU3RhcnRlZDsKLQotICAgIHN0YXR1c190IGluaXQoKTsKLQotICAgIC8vIG5vIGNvcHkgY29uc3RydWN0b3Igb3IgYXNzaWdubWVudAotICAgIE1pZGlTb3VyY2UoY29uc3QgTWlkaVNvdXJjZSAmKTsKLSAgICBNaWRpU291cmNlICZvcGVyYXRvcj0oY29uc3QgTWlkaVNvdXJjZSAmKTsKLQotfTsKLQotCi0vLyBNaWRpc291cmNlCi0KLU1pZGlTb3VyY2U6Ok1pZGlTb3VyY2UoCi0gICAgICAgIGNvbnN0IHNwPE1pZGlFbmdpbmU+ICZlbmdpbmUsCi0gICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmdHJhY2tNZXRhZGF0YSkKLSAgICA6IG1FbmdpbmUoZW5naW5lKSwKLSAgICAgIG1UcmFja01ldGFkYXRhKHRyYWNrTWV0YWRhdGEpLAotICAgICAgbUluaXRDaGVjayhmYWxzZSksCi0gICAgICBtU3RhcnRlZChmYWxzZSkKLXsKLSAgICBBTE9HVigiTWlkaVNvdXJjZSBjdG9yIik7Ci0gICAgbUluaXRDaGVjayA9IGluaXQoKTsKLX0KLQotTWlkaVNvdXJjZTo6fk1pZGlTb3VyY2UoKQotewotICAgIEFMT0dWKCJNaWRpU291cmNlIGR0b3IiKTsKLSAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgc3RvcCgpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgTWlkaVNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKiAvKiBwYXJhbXMgKi8pCi17Ci0gICAgQUxPR1YoIk1pZGlTb3VyY2U6OnN0YXJ0Iik7Ci0KLSAgICBDSEVDSyghbVN0YXJ0ZWQpOwotICAgIG1TdGFydGVkID0gdHJ1ZTsKLSAgICBtRW5naW5lLT5hbGxvY2F0ZUJ1ZmZlcnMoKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE1pZGlTb3VyY2U6OnN0b3AoKQotewotICAgIEFMT0dWKCJNaWRpU291cmNlOjpzdG9wIik7Ci0KLSAgICBDSEVDSyhtU3RhcnRlZCk7Ci0gICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICBtRW5naW5lLT5yZWxlYXNlQnVmZmVycygpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zcDxNZXRhRGF0YT4gTWlkaVNvdXJjZTo6Z2V0Rm9ybWF0KCkKLXsKLSAgICByZXR1cm4gbVRyYWNrTWV0YWRhdGE7Ci19Ci0KLXN0YXR1c190IE1pZGlTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyICoqb3V0QnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykKLXsKLSAgICBBTE9HVigiTWlkaVNvdXJjZTo6cmVhZCIpOwotICAgIE1lZGlhQnVmZmVyICpidWZmZXI7Ci0gICAgLy8gcHJvY2VzcyBhbiBvcHRpb25hbCBzZWVrIHJlcXVlc3QKLSAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7Ci0gICAgaWYgKChOVUxMICE9IG9wdGlvbnMpICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7Ci0gICAgICAgIGlmIChzZWVrVGltZVVzIDw9IDBMTCkgewotICAgICAgICAgICAgc2Vla1RpbWVVcyA9IDBMTDsKLSAgICAgICAgfQotICAgICAgICBtRW5naW5lLT5zZWVrVG8oc2Vla1RpbWVVcyk7Ci0gICAgfQotICAgIGJ1ZmZlciA9IG1FbmdpbmUtPnJlYWRCdWZmZXIoKTsKLSAgICAqb3V0QnVmZmVyID0gYnVmZmVyOwotICAgIEFMT0dWKCJNaWRpU291cmNlOjpyZWFkICVwIGRvbmUiLCB0aGlzKTsKLSAgICByZXR1cm4gYnVmZmVyICE9IE5VTEwgPyAoc3RhdHVzX3QpIE9LIDogKHN0YXR1c190KSBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotfQotCi1zdGF0dXNfdCBNaWRpU291cmNlOjppbml0KCkKLXsKLSAgICBBTE9HVigiTWlkaVNvdXJjZTo6aW5pdCIpOwotICAgIHJldHVybiBPSzsKLX0KLQotLy8gTWlkaUVuZ2luZQotCi1NaWRpRW5naW5lOjpNaWRpRW5naW5lKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZkYXRhU291cmNlLAotICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJmZpbGVNZXRhZGF0YSwKLSAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZ0cmFja01ldGFkYXRhKSA6Ci0gICAgICAgICAgICBtR3JvdXAoTlVMTCksCi0gICAgICAgICAgICBtRWFzRGF0YShOVUxMKSwKLSAgICAgICAgICAgIG1FYXNIYW5kbGUoTlVMTCksCi0gICAgICAgICAgICBtRWFzQ29uZmlnKE5VTEwpLAotICAgICAgICAgICAgbUlzSW5pdGlhbGl6ZWQoZmFsc2UpIHsKLSAgICBtSW9XcmFwcGVyID0gbmV3IE1pZGlJb1dyYXBwZXIoZGF0YVNvdXJjZSk7Ci0gICAgLy8gc3BpbiB1cCBhIG5ldyBFQVMgZW5naW5lCi0gICAgRUFTX0kzMiB0ZW1wOwotICAgIEVBU19SRVNVTFQgcmVzdWx0ID0gRUFTX0luaXQoJm1FYXNEYXRhKTsKLQotICAgIGlmIChyZXN1bHQgPT0gRUFTX1NVQ0NFU1MpIHsKLSAgICAgICAgcmVzdWx0ID0gRUFTX09wZW5GaWxlKG1FYXNEYXRhLCBtSW9XcmFwcGVyLT5nZXRMb2NhdG9yKCksICZtRWFzSGFuZGxlKTsKLSAgICB9Ci0gICAgaWYgKHJlc3VsdCA9PSBFQVNfU1VDQ0VTUykgewotICAgICAgICByZXN1bHQgPSBFQVNfUHJlcGFyZShtRWFzRGF0YSwgbUVhc0hhbmRsZSk7Ci0gICAgfQotICAgIGlmIChyZXN1bHQgPT0gRUFTX1NVQ0NFU1MpIHsKLSAgICAgICAgcmVzdWx0ID0gRUFTX1BhcnNlTWV0YURhdGEobUVhc0RhdGEsIG1FYXNIYW5kbGUsICZ0ZW1wKTsKLSAgICB9Ci0KLSAgICBpZiAocmVzdWx0ICE9IEVBU19TVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoZmlsZU1ldGFkYXRhICE9IE5VTEwpIHsKLSAgICAgICAgZmlsZU1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTUlESSk7Ci0gICAgfQotCi0gICAgaWYgKHRyYWNrTWV0YWRhdGEgIT0gTlVMTCkgewotICAgICAgICB0cmFja01ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKLSAgICAgICAgdHJhY2tNZXRhZGF0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCAxMDAwbGwgKiB0ZW1wKTsgLy8gbWlsbGktPm1pY3JvCi0gICAgICAgIG1FYXNDb25maWcgPSBFQVNfQ29uZmlnKCk7Ci0gICAgICAgIHRyYWNrTWV0YWRhdGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtRWFzQ29uZmlnLT5zYW1wbGVSYXRlKTsKLSAgICAgICAgdHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbUVhc0NvbmZpZy0+bnVtQ2hhbm5lbHMpOwotICAgICAgICB0cmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5UGNtRW5jb2RpbmcsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOwotICAgIH0KLSAgICBtSXNJbml0aWFsaXplZCA9IHRydWU7Ci19Ci0KLU1pZGlFbmdpbmU6On5NaWRpRW5naW5lKCkgewotICAgIGlmIChtRWFzSGFuZGxlKSB7Ci0gICAgICAgIEVBU19DbG9zZUZpbGUobUVhc0RhdGEsIG1FYXNIYW5kbGUpOwotICAgIH0KLSAgICBpZiAobUVhc0RhdGEpIHsKLSAgICAgICAgRUFTX1NodXRkb3duKG1FYXNEYXRhKTsKLSAgICB9Ci0gICAgZGVsZXRlIG1Hcm91cDsKLQotfQotCi1zdGF0dXNfdCBNaWRpRW5naW5lOjppbml0Q2hlY2soKSB7Ci0gICAgcmV0dXJuIG1Jc0luaXRpYWxpemVkID8gT0sgOiBVTktOT1dOX0VSUk9SOwotfQotCi1zdGF0dXNfdCBNaWRpRW5naW5lOjphbGxvY2F0ZUJ1ZmZlcnMoKSB7Ci0gICAgLy8gc2VsZWN0IHJldmVyYiBwcmVzZXQgYW5kIGVuYWJsZQotICAgIEVBU19TZXRQYXJhbWV0ZXIobUVhc0RhdGEsIEVBU19NT0RVTEVfUkVWRVJCLCBFQVNfUEFSQU1fUkVWRVJCX1BSRVNFVCwgRUFTX1BBUkFNX1JFVkVSQl9DSEFNQkVSKTsKLSAgICBFQVNfU2V0UGFyYW1ldGVyKG1FYXNEYXRhLCBFQVNfTU9EVUxFX1JFVkVSQiwgRUFTX1BBUkFNX1JFVkVSQl9CWVBBU1MsIEVBU19GQUxTRSk7Ci0KLSAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKLSAgICBpbnQgYnVmc2l6ZSA9IHNpemVvZihFQVNfUENNKQotICAgICAgICAgICAgKiBtRWFzQ29uZmlnLT5taXhCdWZmZXJTaXplICogbUVhc0NvbmZpZy0+bnVtQ2hhbm5lbHMgKiBOVU1fQ09NQklORV9CVUZGRVJTOwotICAgIEFMT0dWKCJ1c2luZyAlZCBieXRlIGJ1ZmZlciIsIGJ1ZnNpemUpOwotICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihuZXcgTWVkaWFCdWZmZXIoYnVmc2l6ZSkpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTWlkaUVuZ2luZTo6cmVsZWFzZUJ1ZmZlcnMoKSB7Ci0gICAgZGVsZXRlIG1Hcm91cDsKLSAgICBtR3JvdXAgPSBOVUxMOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTWlkaUVuZ2luZTo6c2Vla1RvKGludDY0X3QgcG9zaXRpb25VcykgewotICAgIEFMT0dWKCJzZWVrVG8gJWxsZCIsIChsb25nIGxvbmcpcG9zaXRpb25Vcyk7Ci0gICAgRUFTX1JFU1VMVCByZXN1bHQgPSBFQVNfTG9jYXRlKG1FYXNEYXRhLCBtRWFzSGFuZGxlLCBwb3NpdGlvblVzIC8gMTAwMCwgZmFsc2UpOwotICAgIHJldHVybiByZXN1bHQgPT0gRUFTX1NVQ0NFU1MgPyBPSyA6IFVOS05PV05fRVJST1I7Ci19Ci0KLU1lZGlhQnVmZmVyKiBNaWRpRW5naW5lOjpyZWFkQnVmZmVyKCkgewotICAgIEVBU19TVEFURSBzdGF0ZTsKLSAgICBFQVNfU3RhdGUobUVhc0RhdGEsIG1FYXNIYW5kbGUsICZzdGF0ZSk7Ci0gICAgaWYgKChzdGF0ZSA9PSBFQVNfU1RBVEVfU1RPUFBFRCkgfHwgKHN0YXRlID09IEVBU19TVEFURV9FUlJPUikpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIE1lZGlhQnVmZmVyICpidWZmZXI7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJyZWFkQnVmZmVyOiBubyBidWZmZXIiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEVBU19JMzIgdGltZU1zOwotICAgIEVBU19HZXRMb2NhdGlvbihtRWFzRGF0YSwgbUVhc0hhbmRsZSwgJnRpbWVNcyk7Ci0gICAgaW50NjRfdCB0aW1lVXMgPSAxMDAwbGwgKiB0aW1lTXM7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7Ci0KLSAgICBFQVNfUENNKiBwID0gKEVBU19QQ00qKSBidWZmZXItPmRhdGEoKTsKLSAgICBpbnQgbnVtQnl0ZXNPdXRwdXQgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX0NPTUJJTkVfQlVGRkVSUzsgaSsrKSB7Ci0gICAgICAgIEVBU19JMzIgbnVtUmVuZGVyZWQ7Ci0gICAgICAgIEVBU19SRVNVTFQgcmVzdWx0ID0gRUFTX1JlbmRlcihtRWFzRGF0YSwgcCwgbUVhc0NvbmZpZy0+bWl4QnVmZmVyU2l6ZSwgJm51bVJlbmRlcmVkKTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBFQVNfU1VDQ0VTUykgewotICAgICAgICAgICAgQUxPR0UoIkVBU19SZW5kZXIgcmV0dXJuZWQgJWxkIiwgcmVzdWx0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHAgKz0gbnVtUmVuZGVyZWQgKiBtRWFzQ29uZmlnLT5udW1DaGFubmVsczsKLSAgICAgICAgbnVtQnl0ZXNPdXRwdXQgKz0gbnVtUmVuZGVyZWQgKiBtRWFzQ29uZmlnLT5udW1DaGFubmVscyAqIHNpemVvZihFQVNfUENNKTsKLSAgICB9Ci0gICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgbnVtQnl0ZXNPdXRwdXQpOwotICAgIEFMT0dWKCJyZWFkQnVmZmVyOiByZXR1cm5pbmcgJXpkIGluIGJ1ZmZlciAlcCIsIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCksIGJ1ZmZlcik7Ci0gICAgcmV0dXJuIGJ1ZmZlcjsKLX0KLQotCi0vLyBNaWRpRXh0cmFjdG9yCi0KLU1pZGlFeHRyYWN0b3I6Ok1pZGlFeHRyYWN0b3IoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZkYXRhU291cmNlKQotICAgIDogbURhdGFTb3VyY2UoZGF0YVNvdXJjZSksCi0gICAgICBtSW5pdENoZWNrKGZhbHNlKQotewotICAgIEFMT0dWKCJNaWRpRXh0cmFjdG9yIGN0b3IiKTsKLSAgICBtRmlsZU1ldGFkYXRhID0gbmV3IE1ldGFEYXRhOwotICAgIG1UcmFja01ldGFkYXRhID0gbmV3IE1ldGFEYXRhOwotICAgIG1FbmdpbmUgPSBuZXcgTWlkaUVuZ2luZShtRGF0YVNvdXJjZSwgbUZpbGVNZXRhZGF0YSwgbVRyYWNrTWV0YWRhdGEpOwotICAgIG1Jbml0Q2hlY2sgPSBtRW5naW5lLT5pbml0Q2hlY2soKTsKLX0KLQotTWlkaUV4dHJhY3Rvcjo6fk1pZGlFeHRyYWN0b3IoKQotewotICAgIEFMT0dWKCJNaWRpRXh0cmFjdG9yIGR0b3IiKTsKLX0KLQotc2l6ZV90IE1pZGlFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkKLXsKLSAgICByZXR1cm4gbUluaXRDaGVjayA9PSBPSyA/IDEgOiAwOwotfQotCi1zcDxJTWVkaWFTb3VyY2U+IE1pZGlFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkKLXsKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBuZXcgTWlkaVNvdXJjZShtRW5naW5lLCBtVHJhY2tNZXRhZGF0YSk7Ci19Ci0KLXNwPE1ldGFEYXRhPiBNaWRpRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7Ci0gICAgQUxPR1YoIk1pZGlFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEiKTsKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBtVHJhY2tNZXRhZGF0YTsKLX0KLQotc3A8TWV0YURhdGE+IE1pZGlFeHRyYWN0b3I6OmdldE1ldGFEYXRhKCkKLXsKLSAgICBBTE9HVigiTWlkaUV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEiKTsKLSAgICByZXR1cm4gbUZpbGVNZXRhZGF0YTsKLX0KLQotLy8gU25pZmZlcgotCi1ib29sIFNuaWZmTWlkaSgKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICBzcDxBTWVzc2FnZT4gKikKLXsKLSAgICBzcDxNaWRpRW5naW5lPiBwID0gbmV3IE1pZGlFbmdpbmUoc291cmNlLCBOVUxMLCBOVUxMKTsKLSAgICBpZiAocC0+aW5pdENoZWNrKCkgPT0gT0spIHsKLSAgICAgICAgKm1pbWVUeXBlID0gTUVESUFfTUlNRVRZUEVfQVVESU9fTUlESTsKLSAgICAgICAgKmNvbmZpZGVuY2UgPSAwLjg7Ci0gICAgICAgIEFMT0dWKCJTbmlmZk1pZGk6IHllcyIpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgQUxPR1YoIlNuaWZmTWlkaTogbm8iKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L05ka1V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L05ka1V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDRmZTcyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTmRrVXRpbHMuY3BwCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9OZGtVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3NwPE1ldGFEYXRhPiBjb252ZXJ0TWVkaWFGb3JtYXRXcmFwcGVyVG9NZXRhRGF0YShjb25zdCBzcDxBTWVkaWFGb3JtYXRXcmFwcGVyPiAmZm10KSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IGZtdC0+dG9BTWVzc2FnZSgpOworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOworICAgIGNvbnZlcnRNZXNzYWdlVG9NZXRhRGF0YShtc2csIG1ldGEpOworICAgIHJldHVybiBtZXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcAppbmRleCBhZmQ2ZmZiLi4xOGY0YjEyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAKQEAgLTY4MSwxMCArNjgxLDYgQEAKICAgICByZXR1cm4gbVNvdXJjZS0+RHJtSW5pdGlhbGl6YXRpb24obWltZSk7CiB9CiAKLXZvaWQgTnVDYWNoZWRTb3VyY2UyOjpnZXREcm1JbmZvKHNwPERlY3J5cHRIYW5kbGU+ICZoYW5kbGUsIERybU1hbmFnZXJDbGllbnQgKipjbGllbnQpIHsKLSAgICBtU291cmNlLT5nZXREcm1JbmZvKGhhbmRsZSwgY2xpZW50KTsKLX0KLQogU3RyaW5nOCBOdUNhY2hlZFNvdXJjZTI6OmdldFVyaSgpIHsKICAgICByZXR1cm4gbVNvdXJjZS0+Z2V0VXJpKCk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IDY0MGNiODIuLjRhN2Q2Y2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIExPR19OREVCVUcgMAorLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJOdU1lZGlhRXh0cmFjdG9yIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCkBAIC0yMywyOCArMjMsNDAgQEAKICNpbmNsdWRlICJpbmNsdWRlL0VTRFMuaCIKICNpbmNsdWRlICJpbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIgogCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorTnVNZWRpYUV4dHJhY3Rvcjo6U2FtcGxlOjpTYW1wbGUoKQorICAgIDogbUJ1ZmZlcihOVUxMKSwKKyAgICAgIG1TYW1wbGVUaW1lVXMoLTFsbCkgeworfQorCitOdU1lZGlhRXh0cmFjdG9yOjpTYW1wbGU6OlNhbXBsZShNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciwgaW50NjRfdCB0aW1lVXMpCisgICAgOiBtQnVmZmVyKGJ1ZmZlciksCisgICAgICBtU2FtcGxlVGltZVVzKHRpbWVVcykgeworfQorCiBOdU1lZGlhRXh0cmFjdG9yOjpOdU1lZGlhRXh0cmFjdG9yKCkKICAgICA6IG1Ub3RhbEJpdHJhdGUoLTFsbCksCiAgICAgICBtRHVyYXRpb25VcygtMWxsKSB7CiB9CiAKIE51TWVkaWFFeHRyYWN0b3I6On5OdU1lZGlhRXh0cmFjdG9yKCkgewotICAgIHJlbGVhc2VUcmFja1NhbXBsZXMoKTsKKyAgICByZWxlYXNlQWxsVHJhY2tTYW1wbGVzKCk7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TZWxlY3RlZFRyYWNrcy5zaXplKCk7ICsraSkgewogICAgICAgICBUcmFja0luZm8gKmluZm8gPSAmbVNlbGVjdGVkVHJhY2tzLmVkaXRJdGVtQXQoaSk7CkBAIC02MCw3ICs3Miw3IEBACiB9CiAKIHN0YXR1c190IE51TWVkaWFFeHRyYWN0b3I6OnNldERhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgY29uc3QgY2hhciAqcGF0aCwKICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwpAQCAtNzAsMTMgKzgyLDEzIEBACiAgICAgfQogCiAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9Ci0gICAgICAgIERhdGFTb3VyY2U6OkNyZWF0ZUZyb21VUkkoaHR0cFNlcnZpY2UsIHBhdGgsIGhlYWRlcnMpOworICAgICAgICBEYXRhU291cmNlRmFjdG9yeTo6Q3JlYXRlRnJvbVVSSShodHRwU2VydmljZSwgcGF0aCwgaGVhZGVycyk7CiAKICAgICBpZiAoZGF0YVNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtRU5PRU5UOwogICAgIH0KIAotICAgIG1JbXBsID0gTWVkaWFFeHRyYWN0b3I6OkNyZWF0ZShkYXRhU291cmNlKTsKKyAgICBtSW1wbCA9IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Q3JlYXRlKGRhdGFTb3VyY2UpOwogCiAgICAgaWYgKG1JbXBsID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwpAQCAtMTEyLDcgKzEyNCw3IEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgbUltcGwgPSBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKGZpbGVTb3VyY2UpOworICAgIG1JbXBsID0gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpDcmVhdGUoZmlsZVNvdXJjZSk7CiAKICAgICBpZiAobUltcGwgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CkBAIC0xNDIsNyArMTU0LDcgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICBtSW1wbCA9IE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUoc291cmNlKTsKKyAgICBtSW1wbCA9IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Q3JlYXRlKHNvdXJjZSk7CiAKICAgICBpZiAobUltcGwgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CkBAIC0xOTMsNiArMjA1LDE1IEBACiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIE51TWVkaWFFeHRyYWN0b3I6OmRpc2Nvbm5lY3QoKSB7CisgICAgaWYgKG1EYXRhU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgLy8gZGlzY29ubmVjdCBkYXRhIHNvdXJjZQorICAgICAgICBpZiAobURhdGFTb3VyY2UtPmZsYWdzKCkgJiBEYXRhU291cmNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSkgeworICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TnVDYWNoZWRTb3VyY2UyICo+KG1EYXRhU291cmNlLmdldCgpKS0+ZGlzY29ubmVjdCgpOworICAgICAgICB9CisgICAgfQorfQorCiBzdGF0dXNfdCBOdU1lZGlhRXh0cmFjdG9yOjp1cGRhdGVEdXJhdGlvbkFuZEJpdHJhdGUoKSB7CiAgICAgaWYgKG1JbXBsLT5jb3VudFRyYWNrcygpID4ga01heFRyYWNrQ291bnQpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwpAQCAtMjg2LDcgKzMwNywyOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTnVNZWRpYUV4dHJhY3Rvcjo6c2VsZWN0VHJhY2soc2l6ZV90IGluZGV4KSB7CitzdGF0dXNfdCBOdU1lZGlhRXh0cmFjdG9yOjpnZXRFeGlmT2Zmc2V0U2l6ZShvZmY2NF90ICpvZmZzZXQsIHNpemVfdCAqc2l6ZSkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUltcGwgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1JbXBsLT5nZXRNZXRhRGF0YSgpOworCisgICAgaW50NjRfdCBleGlmT2Zmc2V0LCBleGlmU2l6ZTsKKyAgICBpZiAobWV0YS0+ZmluZEludDY0KGtLZXlFeGlmT2Zmc2V0LCAmZXhpZk9mZnNldCkKKyAgICAgJiYgbWV0YS0+ZmluZEludDY0KGtLZXlFeGlmU2l6ZSwgJmV4aWZTaXplKSkgeworICAgICAgICAqb2Zmc2V0ID0gKG9mZjY0X3QpIGV4aWZPZmZzZXQ7CisgICAgICAgICpzaXplID0gKHNpemVfdCkgZXhpZlNpemU7CisKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IE51TWVkaWFFeHRyYWN0b3I6OnNlbGVjdFRyYWNrKHNpemVfdCBpbmRleCwKKyAgICAgICAgaW50NjRfdCBzdGFydFRpbWVVcywgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIGlmIChtSW1wbCA9PSBOVUxMKSB7CkBAIC0zMDksMzEgKzM1MSw1NiBAQAogICAgIHNwPElNZWRpYVNvdXJjZT4gc291cmNlID0gbUltcGwtPmdldFRyYWNrKGluZGV4KTsKIAogICAgIGlmIChzb3VyY2UgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgidHJhY2sgJXp1IGlzIGVtcHR5IiwgaW5kZXgpOwogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAogICAgIHN0YXR1c190IHJldCA9IHNvdXJjZS0+c3RhcnQoKTsKICAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJ0cmFjayAlenUgZmFpbGVkIHRvIHN0YXJ0IiwgaW5kZXgpOwogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAorICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gc291cmNlLT5nZXRGb3JtYXQoKTsKKyAgICBpZiAobWV0YSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJ0cmFjayAlenUgaGFzIG5vIG1ldGEgZGF0YSIsIGluZGV4KTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIGlmICghbWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpIHsKKyAgICAgICAgQUxPR0UoInRyYWNrICV6dSBoYXMgbm8gbWltZSB0eXBlIGluIG1ldGEgZGF0YSIsIGluZGV4KTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgQUxPR1YoInNlbGVjdFRyYWNrLCB0cmFja1slenVdOiAlcyIsIGluZGV4LCBtaW1lKTsKKwogICAgIG1TZWxlY3RlZFRyYWNrcy5wdXNoKCk7CiAgICAgVHJhY2tJbmZvICppbmZvID0gJm1TZWxlY3RlZFRyYWNrcy5lZGl0SXRlbUF0KG1TZWxlY3RlZFRyYWNrcy5zaXplKCkgLSAxKTsKIAogICAgIGluZm8tPm1Tb3VyY2UgPSBzb3VyY2U7CiAgICAgaW5mby0+bVRyYWNrSW5kZXggPSBpbmRleDsKKyAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KSkgeworICAgICAgICBpbmZvLT5tVHJhY2tUeXBlID0gTUVESUFfVFJBQ0tfVFlQRV9BVURJTzsKKyAgICAgICAgaW5mby0+bU1heEZldGNoQ291bnQgPSA2NDsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKKyAgICAgICAgaW5mby0+bVRyYWNrVHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfVklERU87CisgICAgICAgIGluZm8tPm1NYXhGZXRjaENvdW50ID0gODsKKyAgICB9IGVsc2UgeworICAgICAgICBpbmZvLT5tVHJhY2tUeXBlID0gTUVESUFfVFJBQ0tfVFlQRV9VTktOT1dOOworICAgICAgICBpbmZvLT5tTWF4RmV0Y2hDb3VudCA9IDE7CisgICAgfQogICAgIGluZm8tPm1GaW5hbFJlc3VsdCA9IE9LOwotICAgIGluZm8tPm1TYW1wbGUgPSBOVUxMOwotICAgIGluZm8tPm1TYW1wbGVUaW1lVXMgPSAtMWxsOworICAgIHJlbGVhc2VUcmFja1NhbXBsZXMoaW5mbyk7CiAgICAgaW5mby0+bVRyYWNrRmxhZ3MgPSAwOwogCi0gICAgY29uc3QgY2hhciAqbWltZTsKLSAgICBDSEVDSyhzb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7Ci0KICAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKSkgewogICAgICAgICBpbmZvLT5tVHJhY2tGbGFncyB8PSBrSXNWb3JiaXM7CiAgICAgfQogCisgICAgaWYgKHN0YXJ0VGltZVVzID49IDApIHsKKyAgICAgICAgZmV0Y2hUcmFja1NhbXBsZXMoaW5mbywgc3RhcnRUaW1lVXMsIG1vZGUpOworICAgIH0KKwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMzY0LDEyICs0MzEsNyBAQAogCiAgICAgVHJhY2tJbmZvICppbmZvID0gJm1TZWxlY3RlZFRyYWNrcy5lZGl0SXRlbUF0KGkpOwogCi0gICAgaWYgKGluZm8tPm1TYW1wbGUgIT0gTlVMTCkgewotICAgICAgICBpbmZvLT5tU2FtcGxlLT5yZWxlYXNlKCk7Ci0gICAgICAgIGluZm8tPm1TYW1wbGUgPSBOVUxMOwotCi0gICAgICAgIGluZm8tPm1TYW1wbGVUaW1lVXMgPSAtMWxsOwotICAgIH0KKyAgICByZWxlYXNlVHJhY2tTYW1wbGVzKGluZm8pOwogCiAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBpbmZvLT5tU291cmNlLT5zdG9wKCkpOwogCkBAIC0zNzgsNzkgKzQ0MCwxNDEgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgTnVNZWRpYUV4dHJhY3Rvcjo6cmVsZWFzZVRyYWNrU2FtcGxlcygpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TZWxlY3RlZFRyYWNrcy5zaXplKCk7ICsraSkgewotICAgICAgICBUcmFja0luZm8gKmluZm8gPSAmbVNlbGVjdGVkVHJhY2tzLmVkaXRJdGVtQXQoaSk7Cit2b2lkIE51TWVkaWFFeHRyYWN0b3I6OnJlbGVhc2VPbmVTYW1wbGUoVHJhY2tJbmZvICppbmZvKSB7CisgICAgaWYgKGluZm8gPT0gTlVMTCB8fCBpbmZvLT5tU2FtcGxlcy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLSAgICAgICAgaWYgKGluZm8tPm1TYW1wbGUgIT0gTlVMTCkgewotICAgICAgICAgICAgaW5mby0+bVNhbXBsZS0+cmVsZWFzZSgpOwotICAgICAgICAgICAgaW5mby0+bVNhbXBsZSA9IE5VTEw7CisgICAgYXV0byBpdCA9IGluZm8tPm1TYW1wbGVzLmJlZ2luKCk7CisgICAgaWYgKGl0LT5tQnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgaXQtPm1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICB9CisgICAgaW5mby0+bVNhbXBsZXMuZXJhc2UoaXQpOworfQogCi0gICAgICAgICAgICBpbmZvLT5tU2FtcGxlVGltZVVzID0gLTFsbDsKK3ZvaWQgTnVNZWRpYUV4dHJhY3Rvcjo6cmVsZWFzZVRyYWNrU2FtcGxlcyhUcmFja0luZm8gKmluZm8pIHsKKyAgICBpZiAoaW5mbyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIGl0ID0gaW5mby0+bVNhbXBsZXMuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gaW5mby0+bVNhbXBsZXMuZW5kKCkpIHsKKyAgICAgICAgaWYgKGl0LT5tQnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGl0LT5tQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgIH0KKyAgICAgICAgaXQgPSBpbmZvLT5tU2FtcGxlcy5lcmFzZShpdCk7CiAgICAgfQogfQogCi1zc2l6ZV90IE51TWVkaWFFeHRyYWN0b3I6OmZldGNoVHJhY2tTYW1wbGVzKAordm9pZCBOdU1lZGlhRXh0cmFjdG9yOjpyZWxlYXNlQWxsVHJhY2tTYW1wbGVzKCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNlbGVjdGVkVHJhY2tzLnNpemUoKTsgKytpKSB7CisgICAgICAgIHJlbGVhc2VUcmFja1NhbXBsZXMoJm1TZWxlY3RlZFRyYWNrcy5lZGl0SXRlbUF0KGkpKTsKKyAgICB9Cit9CisKK3NzaXplX3QgTnVNZWRpYUV4dHJhY3Rvcjo6ZmV0Y2hBbGxUcmFja1NhbXBsZXMoCiAgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVcywgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlKSB7CiAgICAgVHJhY2tJbmZvICptaW5JbmZvID0gTlVMTDsKLSAgICBzc2l6ZV90IG1pbkluZGV4ID0gLTE7CisgICAgc3NpemVfdCBtaW5JbmRleCA9IEVSUk9SX0VORF9PRl9TVFJFQU07CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TZWxlY3RlZFRyYWNrcy5zaXplKCk7ICsraSkgewogICAgICAgICBUcmFja0luZm8gKmluZm8gPSAmbVNlbGVjdGVkVHJhY2tzLmVkaXRJdGVtQXQoaSk7CisgICAgICAgIGZldGNoVHJhY2tTYW1wbGVzKGluZm8sIHNlZWtUaW1lVXMsIG1vZGUpOwogCi0gICAgICAgIGlmIChzZWVrVGltZVVzID49IDBsbCkgewotICAgICAgICAgICAgaW5mby0+bUZpbmFsUmVzdWx0ID0gT0s7CisgICAgICAgIHN0YXR1c190IGVyciA9IGluZm8tPm1GaW5hbFJlc3VsdDsKKyAgICAgICAgaWYgKGVyciAhPSBPSyAmJiBlcnIgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoaW5mby0+bVNhbXBsZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaW5mby0+bVNhbXBsZS0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIGluZm8tPm1TYW1wbGUgPSBOVUxMOwotICAgICAgICAgICAgICAgIGluZm8tPm1TYW1wbGVUaW1lVXMgPSAtMWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGluZm8tPm1GaW5hbFJlc3VsdCAhPSBPSykgeworICAgICAgICBpZiAoaW5mby0+bVNhbXBsZXMuZW1wdHkoKSkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoaW5mby0+bVNhbXBsZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgb3B0aW9uczsKLSAgICAgICAgICAgIGlmIChzZWVrVGltZVVzID49IDBsbCkgewotICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKHNlZWtUaW1lVXMsIG1vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gaW5mby0+bVNvdXJjZS0+cmVhZCgmaW5mby0+bVNhbXBsZSwgJm9wdGlvbnMpOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soaW5mby0+bVNhbXBsZSA9PSBOVUxMKTsKLQotICAgICAgICAgICAgICAgIGluZm8tPm1GaW5hbFJlc3VsdCA9IGVycjsKLQotICAgICAgICAgICAgICAgIGlmIChpbmZvLT5tRmluYWxSZXN1bHQgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygicmVhZCBvbiB0cmFjayAlenUgZmFpbGVkIHdpdGggZXJyb3IgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5tVHJhY2tJbmRleCwgZXJyKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbmZvLT5tU2FtcGxlVGltZVVzID0gLTFsbDsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soaW5mby0+bVNhbXBsZSAhPSBOVUxMKTsKLSAgICAgICAgICAgICAgICBDSEVDSyhpbmZvLT5tU2FtcGxlLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAmaW5mby0+bVNhbXBsZVRpbWVVcykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1pbkluZm8gPT0gTlVMTCAgfHwgaW5mby0+bVNhbXBsZVRpbWVVcyA8IG1pbkluZm8tPm1TYW1wbGVUaW1lVXMpIHsKKyAgICAgICAgaWYgKG1pbkluZm8gPT0gTlVMTCkgewogICAgICAgICAgICAgbWluSW5mbyA9IGluZm87CiAgICAgICAgICAgICBtaW5JbmRleCA9IGk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdXRvIGl0ID0gaW5mby0+bVNhbXBsZXMuYmVnaW4oKTsKKyAgICAgICAgICAgIGF1dG8gaXRNaW4gPSBtaW5JbmZvLT5tU2FtcGxlcy5iZWdpbigpOworICAgICAgICAgICAgaWYgKGl0LT5tU2FtcGxlVGltZVVzIDwgaXRNaW4tPm1TYW1wbGVUaW1lVXMpIHsKKyAgICAgICAgICAgICAgICBtaW5JbmZvID0gaW5mbzsKKyAgICAgICAgICAgICAgICBtaW5JbmRleCA9IGk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gbWluSW5kZXg7CiB9CiAKK3ZvaWQgTnVNZWRpYUV4dHJhY3Rvcjo6ZmV0Y2hUcmFja1NhbXBsZXMoVHJhY2tJbmZvICppbmZvLAorICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXMsIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZSkgeworICAgIGlmIChpbmZvID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOworICAgIGlmIChzZWVrVGltZVVzID49IDBsbCkgeworICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhzZWVrVGltZVVzLCBtb2RlKTsKKyAgICAgICAgaW5mby0+bUZpbmFsUmVzdWx0ID0gT0s7CisgICAgICAgIHJlbGVhc2VUcmFja1NhbXBsZXMoaW5mbyk7CisgICAgfSBlbHNlIGlmIChpbmZvLT5tRmluYWxSZXN1bHQgIT0gT0sgfHwgIWluZm8tPm1TYW1wbGVzLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIFZlY3RvcjxNZWRpYUJ1ZmZlckJhc2UgKj4gbWVkaWFCdWZmZXJzOworICAgIGlmIChpbmZvLT5tU291cmNlLT5zdXBwb3J0UmVhZE11bHRpcGxlKCkpIHsKKyAgICAgICAgb3B0aW9ucy5zZXROb25CbG9ja2luZygpOworICAgICAgICBlcnIgPSBpbmZvLT5tU291cmNlLT5yZWFkTXVsdGlwbGUoJm1lZGlhQnVmZmVycywgaW5mby0+bU1heEZldGNoQ291bnQsICZvcHRpb25zKTsKKyAgICB9IGVsc2UgeworICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKm1idWYgPSBOVUxMOworICAgICAgICBlcnIgPSBpbmZvLT5tU291cmNlLT5yZWFkKCZtYnVmLCAmb3B0aW9ucyk7CisgICAgICAgIGlmIChlcnIgPT0gT0sgJiYgbWJ1ZiAhPSBOVUxMKSB7CisgICAgICAgICAgICBtZWRpYUJ1ZmZlcnMucHVzaF9iYWNrKG1idWYpOworICAgICAgICB9CisgICAgfQorCisgICAgaW5mby0+bUZpbmFsUmVzdWx0ID0gZXJyOworICAgIGlmIChlcnIgIT0gT0sgJiYgZXJyICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgQUxPR1coInJlYWQgb24gdHJhY2sgJXp1IGZhaWxlZCB3aXRoIGVycm9yICVkIiwgaW5mby0+bVRyYWNrSW5kZXgsIGVycik7CisgICAgICAgIHNpemVfdCBjb3VudCA9IG1lZGlhQnVmZmVycy5zaXplKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGlkID0gMDsgaWQgPCBjb3VudDsgKytpZCkgeworICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICptYnVmID0gbWVkaWFCdWZmZXJzW2lkXTsKKyAgICAgICAgICAgIGlmIChtYnVmICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtYnVmLT5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBjb3VudCA9IG1lZGlhQnVmZmVycy5zaXplKCk7CisgICAgYm9vbCByZWxlYXNlUmVtYWluaW5nID0gZmFsc2U7CisgICAgZm9yIChzaXplX3QgaWQgPSAwOyBpZCA8IGNvdW50OyArK2lkKSB7CisgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKm1idWYgPSBtZWRpYUJ1ZmZlcnNbaWRdOworICAgICAgICBpZiAobWJ1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVsZWFzZVJlbWFpbmluZykgeworICAgICAgICAgICAgbWJ1Zi0+cmVsZWFzZSgpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1idWYtPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpIHsKKyAgICAgICAgICAgIGluZm8tPm1TYW1wbGVzLmVtcGxhY2VfYmFjayhtYnVmLCB0aW1lVXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWJ1Zi0+bWV0YV9kYXRhKCkuZHVtcFRvTG9nKCk7CisgICAgICAgICAgICBpbmZvLT5tRmluYWxSZXN1bHQgPSBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICBtYnVmLT5yZWxlYXNlKCk7CisgICAgICAgICAgICByZWxlYXNlUmVtYWluaW5nID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKwogc3RhdHVzX3QgTnVNZWRpYUV4dHJhY3Rvcjo6c2Vla1RvKAogICAgICAgICBpbnQ2NF90IHRpbWVVcywgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIHNzaXplX3QgbWluSW5kZXggPSBmZXRjaFRyYWNrU2FtcGxlcyh0aW1lVXMsIG1vZGUpOworICAgIHNzaXplX3QgbWluSW5kZXggPSBmZXRjaEFsbFRyYWNrU2FtcGxlcyh0aW1lVXMsIG1vZGUpOwogCiAgICAgaWYgKG1pbkluZGV4IDwgMCkgewogICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKQEAgLTQ2Miw3ICs1ODYsNyBAQAogc3RhdHVzX3QgTnVNZWRpYUV4dHJhY3Rvcjo6YWR2YW5jZSgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgc3NpemVfdCBtaW5JbmRleCA9IGZldGNoVHJhY2tTYW1wbGVzKCk7CisgICAgc3NpemVfdCBtaW5JbmRleCA9IGZldGNoQWxsVHJhY2tTYW1wbGVzKCk7CiAKICAgICBpZiAobWluSW5kZXggPCAwKSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwpAQCAtNDcwLDI4ICs1OTQsMjcgQEAKIAogICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtU2VsZWN0ZWRUcmFja3MuZWRpdEl0ZW1BdChtaW5JbmRleCk7CiAKLSAgICBpbmZvLT5tU2FtcGxlLT5yZWxlYXNlKCk7Ci0gICAgaW5mby0+bVNhbXBsZSA9IE5VTEw7Ci0gICAgaW5mby0+bVNhbXBsZVRpbWVVcyA9IC0xbGw7CisgICAgcmVsZWFzZU9uZVNhbXBsZShpbmZvKTsKIAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTnVNZWRpYUV4dHJhY3Rvcjo6YXBwZW5kVm9yYmlzTnVtUGFnZVNhbXBsZXMoVHJhY2tJbmZvICppbmZvLCBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CitzdGF0dXNfdCBOdU1lZGlhRXh0cmFjdG9yOjphcHBlbmRWb3JiaXNOdW1QYWdlU2FtcGxlcygKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICptYnVmLCBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CiAgICAgaW50MzJfdCBudW1QYWdlU2FtcGxlczsKLSAgICBpZiAoIWluZm8tPm1TYW1wbGUtPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoCisgICAgaWYgKCFtYnVmLT5tZXRhX2RhdGEoKS5maW5kSW50MzIoCiAgICAgICAgICAgICBrS2V5VmFsaWRTYW1wbGVzLCAmbnVtUGFnZVNhbXBsZXMpKSB7CiAgICAgICAgIG51bVBhZ2VTYW1wbGVzID0gLTE7CiAgICAgfQogCi0gICAgbWVtY3B5KCh1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBpbmZvLT5tU2FtcGxlLT5yYW5nZV9sZW5ndGgoKSwKKyAgICBtZW1jcHkoKHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIG1idWYtPnJhbmdlX2xlbmd0aCgpLAogICAgICAgICAgICAmbnVtUGFnZVNhbXBsZXMsCiAgICAgICAgICAgIHNpemVvZihudW1QYWdlU2FtcGxlcykpOwogCiAgICAgdWludDMyX3QgdHlwZTsKICAgICBjb25zdCB2b2lkICpkYXRhOwogICAgIHNpemVfdCBzaXplLCBzaXplMjsKLSAgICBpZiAoaW5mby0+bVNhbXBsZS0+bWV0YV9kYXRhKCktPmZpbmREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICBpZiAobWJ1Zi0+bWV0YV9kYXRhKCkuZmluZERhdGEoa0tleUVuY3J5cHRlZFNpemVzLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewogICAgICAgICAvLyBTaWduYWwgbnVtUGFnZVNhbXBsZXMgKGEgcGxhaW4gaW50MzJfdCkgaXMgYXBwZW5kZWQgYXQgdGhlIGVuZCwKICAgICAgICAgLy8gaS5lLiBzaXplb2YobnVtUGFnZVNhbXBsZXMpIHBsYWluIGJ5dGVzICsgMCBlbmNyeXB0ZWQgYnl0ZXMKICAgICAgICAgaWYgKFNJWkVfTUFYIC0gc2l6ZSA8IHNpemVvZihpbnQzMl90KSkgewpAQCAtNTA5LDkgKzYzMiw5IEBACiAgICAgICAgIGludDMyX3QgemVybyA9IDA7CiAgICAgICAgIG1lbWNweShhZGF0YSwgZGF0YSwgc2l6ZSk7CiAgICAgICAgIG1lbWNweShhZGF0YSArIHNpemUsICZ6ZXJvLCBzaXplb2YoemVybykpOwotICAgICAgICBpbmZvLT5tU2FtcGxlLT5tZXRhX2RhdGEoKS0+c2V0RGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsIHR5cGUsIGFkYXRhLCBuZXdTaXplKTsKKyAgICAgICAgbWJ1Zi0+bWV0YV9kYXRhKCkuc2V0RGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsIHR5cGUsIGFkYXRhLCBuZXdTaXplKTsKIAotICAgICAgICBpZiAoaW5mby0+bVNhbXBsZS0+bWV0YV9kYXRhKCktPmZpbmREYXRhKGtLZXlQbGFpblNpemVzLCAmdHlwZSwgJmRhdGEsICZzaXplMikpIHsKKyAgICAgICAgaWYgKG1idWYtPm1ldGFfZGF0YSgpLmZpbmREYXRhKGtLZXlQbGFpblNpemVzLCAmdHlwZSwgJmRhdGEsICZzaXplMikpIHsKICAgICAgICAgICAgIGlmIChzaXplMiAhPSBzaXplKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KQEAgLTUyNCw3ICs2NDcsNyBAQAogICAgICAgICAvLyBhcHBlbmQgc2l6ZW9mKG51bVBhZ2VTYW1wbGVzKSB0byBwbGFpbiBzaXplcy4KICAgICAgICAgaW50MzJfdCBpbnQzMlNpemUgPSBzaXplb2YobnVtUGFnZVNhbXBsZXMpOwogICAgICAgICBtZW1jcHkoYWRhdGEgKyBzaXplLCAmaW50MzJTaXplLCBzaXplb2YoaW50MzJTaXplKSk7Ci0gICAgICAgIGluZm8tPm1TYW1wbGUtPm1ldGFfZGF0YSgpLT5zZXREYXRhKGtLZXlQbGFpblNpemVzLCB0eXBlLCBhZGF0YSwgbmV3U2l6ZSk7CisgICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLnNldERhdGEoa0tleVBsYWluU2l6ZXMsIHR5cGUsIGFkYXRhLCBuZXdTaXplKTsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CkBAIC01MzMsNyArNjU2LDcgQEAKIHN0YXR1c190IE51TWVkaWFFeHRyYWN0b3I6OnJlYWRTYW1wbGVEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgc3NpemVfdCBtaW5JbmRleCA9IGZldGNoVHJhY2tTYW1wbGVzKCk7CisgICAgc3NpemVfdCBtaW5JbmRleCA9IGZldGNoQWxsVHJhY2tTYW1wbGVzKCk7CiAKICAgICBpZiAobWluSW5kZXggPCAwKSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwpAQCAtNTQxLDcgKzY2NCw4IEBACiAKICAgICBUcmFja0luZm8gKmluZm8gPSAmbVNlbGVjdGVkVHJhY2tzLmVkaXRJdGVtQXQobWluSW5kZXgpOwogCi0gICAgc2l6ZV90IHNhbXBsZVNpemUgPSBpbmZvLT5tU2FtcGxlLT5yYW5nZV9sZW5ndGgoKTsKKyAgICBhdXRvIGl0ID0gaW5mby0+bVNhbXBsZXMuYmVnaW4oKTsKKyAgICBzaXplX3Qgc2FtcGxlU2l6ZSA9IGl0LT5tQnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKIAogICAgIGlmIChpbmZvLT5tVHJhY2tGbGFncyAmIGtJc1ZvcmJpcykgewogICAgICAgICAvLyBFYWNoIHNhbXBsZSdzIGRhdGEgaXMgc3VmZml4ZWQgYnkgdGhlIG51bWJlciBvZiBwYWdlIHNhbXBsZXMKQEAgLTU1NCwxNCArNjc4LDE0IEBACiAgICAgfQogCiAgICAgY29uc3QgdWludDhfdCAqc3JjID0KLSAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilpbmZvLT5tU2FtcGxlLT5kYXRhKCkKLSAgICAgICAgICAgICsgaW5mby0+bVNhbXBsZS0+cmFuZ2Vfb2Zmc2V0KCk7CisgICAgICAgIChjb25zdCB1aW50OF90ICopaXQtPm1CdWZmZXItPmRhdGEoKQorICAgICAgICAgICAgKyBpdC0+bUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CiAKLSAgICBtZW1jcHkoKHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSwgc3JjLCBpbmZvLT5tU2FtcGxlLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgbWVtY3B5KCh1aW50OF90ICopYnVmZmVyLT5kYXRhKCksIHNyYywgaXQtPm1CdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKIAogICAgIHN0YXR1c190IGVyciA9IE9LOwogICAgIGlmIChpbmZvLT5tVHJhY2tGbGFncyAmIGtJc1ZvcmJpcykgewotICAgICAgICBlcnIgPSBhcHBlbmRWb3JiaXNOdW1QYWdlU2FtcGxlcyhpbmZvLCBidWZmZXIpOworICAgICAgICBlcnIgPSBhcHBlbmRWb3JiaXNOdW1QYWdlU2FtcGxlcyhpdC0+bUJ1ZmZlciwgYnVmZmVyKTsKICAgICB9CiAKICAgICBpZiAoZXJyID09IE9LKSB7CkBAIC01NzEsMTAgKzY5NSwzMiBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKK3N0YXR1c190IE51TWVkaWFFeHRyYWN0b3I6OmdldFNhbXBsZVNpemUoc2l6ZV90ICpzYW1wbGVTaXplKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIHNzaXplX3QgbWluSW5kZXggPSBmZXRjaEFsbFRyYWNrU2FtcGxlcygpOworCisgICAgaWYgKG1pbkluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9CisKKyAgICBUcmFja0luZm8gKmluZm8gPSAmbVNlbGVjdGVkVHJhY2tzLmVkaXRJdGVtQXQobWluSW5kZXgpOworICAgIGF1dG8gaXQgPSBpbmZvLT5tU2FtcGxlcy5iZWdpbigpOworICAgICpzYW1wbGVTaXplID0gaXQtPm1CdWZmZXItPnJhbmdlX2xlbmd0aCgpOworCisgICAgaWYgKGluZm8tPm1UcmFja0ZsYWdzICYga0lzVm9yYmlzKSB7CisgICAgICAgIC8vIEVhY2ggc2FtcGxlJ3MgZGF0YSBpcyBzdWZmaXhlZCBieSB0aGUgbnVtYmVyIG9mIHBhZ2Ugc2FtcGxlcworICAgICAgICAvLyBvciAtMSBpZiBub3QgYXZhaWxhYmxlLgorICAgICAgICAqc2FtcGxlU2l6ZSArPSBzaXplb2YoaW50MzJfdCk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBOdU1lZGlhRXh0cmFjdG9yOjpnZXRTYW1wbGVUcmFja0luZGV4KHNpemVfdCAqdHJhY2tJbmRleCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKLSAgICBzc2l6ZV90IG1pbkluZGV4ID0gZmV0Y2hUcmFja1NhbXBsZXMoKTsKKyAgICBzc2l6ZV90IG1pbkluZGV4ID0gZmV0Y2hBbGxUcmFja1NhbXBsZXMoKTsKIAogICAgIGlmIChtaW5JbmRleCA8IDApIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CkBAIC01ODksMTQgKzczNSwxNCBAQAogc3RhdHVzX3QgTnVNZWRpYUV4dHJhY3Rvcjo6Z2V0U2FtcGxlVGltZShpbnQ2NF90ICpzYW1wbGVUaW1lVXMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgc3NpemVfdCBtaW5JbmRleCA9IGZldGNoVHJhY2tTYW1wbGVzKCk7CisgICAgc3NpemVfdCBtaW5JbmRleCA9IGZldGNoQWxsVHJhY2tTYW1wbGVzKCk7CiAKICAgICBpZiAobWluSW5kZXggPCAwKSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgIH0KIAogICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtU2VsZWN0ZWRUcmFja3MuZWRpdEl0ZW1BdChtaW5JbmRleCk7Ci0gICAgKnNhbXBsZVRpbWVVcyA9IGluZm8tPm1TYW1wbGVUaW1lVXM7CisgICAgKnNhbXBsZVRpbWVVcyA9IGluZm8tPm1TYW1wbGVzLmJlZ2luKCktPm1TYW1wbGVUaW1lVXM7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC02MDYsMTQgKzc1MiwxNSBAQAogCiAgICAgKnNhbXBsZU1ldGEgPSBOVUxMOwogCi0gICAgc3NpemVfdCBtaW5JbmRleCA9IGZldGNoVHJhY2tTYW1wbGVzKCk7CisgICAgc3NpemVfdCBtaW5JbmRleCA9IGZldGNoQWxsVHJhY2tTYW1wbGVzKCk7CiAKICAgICBpZiAobWluSW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtaW5JbmRleDsKKyAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKICAgICBUcmFja0luZm8gKmluZm8gPSAmbVNlbGVjdGVkVHJhY2tzLmVkaXRJdGVtQXQobWluSW5kZXgpOwotICAgICpzYW1wbGVNZXRhID0gaW5mby0+bVNhbXBsZS0+bWV0YV9kYXRhKCk7CisgICAgKnNhbXBsZU1ldGEgPSBuZXcgTWV0YURhdGEoaW5mby0+bVNhbXBsZXMuYmVnaW4oKS0+bUJ1ZmZlci0+bWV0YV9kYXRhKCkpOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtNjI0LDcgKzc3MSw3IEBACiB9CiAKIGJvb2wgTnVNZWRpYUV4dHJhY3Rvcjo6Z2V0VG90YWxCaXRyYXRlKGludDY0X3QgKmJpdHJhdGUpIGNvbnN0IHsKLSAgICBpZiAobVRvdGFsQml0cmF0ZSA+PSAwKSB7CisgICAgaWYgKG1Ub3RhbEJpdHJhdGUgPiAwKSB7CiAgICAgICAgICpiaXRyYXRlID0gbVRvdGFsQml0cmF0ZTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ2xpZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENsaWVudC5jcHAKaW5kZXggNWY1MGU0Ni4uOTM3NWRlMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDbGllbnQuY3BwCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY1NlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KQEAgLTM4LDcwICszNywyNSBAQAogfQogCiBzdGF0dXNfdCBPTVhDbGllbnQ6OmNvbm5lY3QoKSB7Ci0gICAgcmV0dXJuIGNvbm5lY3QoImRlZmF1bHQiLCBudWxscHRyKTsKKyAgICByZXR1cm4gY29ubmVjdCgiZGVmYXVsdCIpOwogfQogCi1zdGF0dXNfdCBPTVhDbGllbnQ6OmNvbm5lY3QoYm9vbCogdHJlYmxlRmxhZykgewotICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5tZWRpYS50cmVibGVfb214IiwgdHJ1ZSkpIHsKLSAgICAgICAgaWYgKHRyZWJsZUZsYWcgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgKnRyZWJsZUZsYWcgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb25uZWN0VHJlYmxlKCk7Ci0gICAgfQotICAgIGlmICh0cmVibGVGbGFnICE9IG51bGxwdHIpIHsKLSAgICAgICAgKnRyZWJsZUZsYWcgPSBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbm5lY3RMZWdhY3koKTsKLX0KLQotc3RhdHVzX3QgT01YQ2xpZW50Ojpjb25uZWN0KGNvbnN0IGNoYXIqIG5hbWUsIGJvb2wqIHRyZWJsZUZsYWcpIHsKLSAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QubWVkaWEudHJlYmxlX29teCIsIHRydWUpKSB7Ci0gICAgICAgIGlmICh0cmVibGVGbGFnICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICp0cmVibGVGbGFnID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29ubmVjdFRyZWJsZShuYW1lKTsKLSAgICB9Ci0gICAgaWYgKHRyZWJsZUZsYWcgIT0gbnVsbHB0cikgewotICAgICAgICAqdHJlYmxlRmxhZyA9IGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gY29ubmVjdExlZ2FjeSgpOwotfQotCi1zdGF0dXNfdCBPTVhDbGllbnQ6OmNvbm5lY3RMZWdhY3koKSB7Ci0gICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwotICAgIHNwPElCaW5kZXI+IGNvZGVjYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmNvZGVjIikpOwotICAgIHNwPElNZWRpYUNvZGVjU2VydmljZT4gY29kZWNzZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhQ29kZWNTZXJ2aWNlPihjb2RlY2JpbmRlcik7Ci0KLSAgICBpZiAoY29kZWNzZXJ2aWNlLmdldCgpID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkNhbm5vdCBvYnRhaW4gSU1lZGlhQ29kZWNTZXJ2aWNlIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgIG1PTVggPSBjb2RlY3NlcnZpY2UtPmdldE9NWCgpOwotICAgIGlmIChtT01YLmdldCgpID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkNhbm5vdCBvYnRhaW4gbWVkaWFjb2RlYyBJT01YIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgT01YQ2xpZW50Ojpjb25uZWN0VHJlYmxlKGNvbnN0IGNoYXIqIG5hbWUpIHsKK3N0YXR1c190IE9NWENsaWVudDo6Y29ubmVjdChjb25zdCBjaGFyKiBuYW1lKSB7CiAgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA7CiAgICAgaWYgKG5hbWUgPT0gbnVsbHB0cikgewogICAgICAgICBuYW1lID0gImRlZmF1bHQiOwogICAgIH0KICAgICBzcDxJT214PiB0T214ID0gSU9teDo6Z2V0U2VydmljZShuYW1lKTsKICAgICBpZiAodE9teC5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJDYW5ub3Qgb2J0YWluIFRyZWJsZSBJT214LiIpOworICAgICAgICBBTE9HRSgiQ2Fubm90IG9idGFpbiBJT214IHNlcnZpY2UuIik7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBpZiAoIXRPbXgtPmlzUmVtb3RlKCkpIHsKLSAgICAgICAgQUxPR0UoIlRyZWJsZSBJT214IGlzIGluIHBhc3N0aHJvdWdoIG1vZGUuIik7CisgICAgICAgIEFMT0dFKCJJT214IHNlcnZpY2UgcnVubmluZyBpbiBwYXNzdGhyb3VnaCBtb2RlLiIpOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgbU9NWCA9IG5ldyB1dGlsczo6TFdPbXgodE9teCk7Ci0gICAgQUxPR0koIlRyZWJsZSBJT214IG9idGFpbmVkIik7CisgICAgQUxPR0koIklPbXggc2VydmljZSBvYnRhaW5lZCIpOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMTA5LDQgKzYzLDggQEAKICAgICBtT01YLmNsZWFyKCk7CiB9CiAKK3NwPElPTVg+IE9NWENsaWVudDo6aW50ZXJmYWNlKCkgeworICAgIHJldHVybiBtT01YOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ0V4dHJhY3Rvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMGIwZDYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnRXh0cmFjdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiT2dnRXh0cmFjdG9yIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiaW5jbHVkZS9PZ2dFeHRyYWN0b3IuaCIKLQotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotZXh0ZXJuICJDIiB7Ci0gICAgI2luY2x1ZGUgPFRyZW1vbG8vY29kZWNfaW50ZXJuYWwuaD4KLQotICAgIGludCBfdm9yYmlzX3VucGFja19ib29rcyh2b3JiaXNfaW5mbyAqdmksb2dncGFja19idWZmZXIgKm9wYik7Ci0gICAgaW50IF92b3JiaXNfdW5wYWNrX2luZm8odm9yYmlzX2luZm8gKnZpLG9nZ3BhY2tfYnVmZmVyICpvcGIpOwotICAgIGludCBfdm9yYmlzX3VucGFja19jb21tZW50KHZvcmJpc19jb21tZW50ICp2YyxvZ2dwYWNrX2J1ZmZlciAqb3BiKTsKLSAgICBsb25nIHZvcmJpc19wYWNrZXRfYmxvY2tzaXplKHZvcmJpc19pbmZvICp2aSxvZ2dfcGFja2V0ICpvcCk7Ci19Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IE9nZ1NvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7Ci0gICAgZXhwbGljaXQgT2dnU291cmNlKGNvbnN0IHNwPE9nZ0V4dHJhY3Rvcj4gJmV4dHJhY3Rvcik7Ci0KLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5PZ2dTb3VyY2UoKTsKLQotcHJpdmF0ZToKLSAgICBzcDxPZ2dFeHRyYWN0b3I+IG1FeHRyYWN0b3I7Ci0gICAgYm9vbCBtU3RhcnRlZDsKLQotICAgIE9nZ1NvdXJjZShjb25zdCBPZ2dTb3VyY2UgJik7Ci0gICAgT2dnU291cmNlICZvcGVyYXRvcj0oY29uc3QgT2dnU291cmNlICYpOwotfTsKLQotc3RydWN0IE15T2dnRXh0cmFjdG9yIHsKLSAgICBNeU9nZ0V4dHJhY3RvcigKLSAgICAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsCi0gICAgICAgICAgICBjb25zdCBjaGFyICptaW1lVHlwZSwKLSAgICAgICAgICAgIHNpemVfdCBudW1IZWFkZXJzLAotICAgICAgICAgICAgaW50NjRfdCBzZWVrUHJlUm9sbFVzKTsKLSAgICB2aXJ0dWFsIH5NeU9nZ0V4dHJhY3RvcigpOwotCi0gICAgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpIGNvbnN0OwotCi0gICAgLy8gUmV0dXJucyBhbiBhcHByb3hpbWF0ZSBiaXRyYXRlIGluIGJpdHMgcGVyIHNlY29uZC4KLSAgICB2aXJ0dWFsIHVpbnQ2NF90IGFwcHJveEJpdHJhdGUoKSBjb25zdCA9IDA7Ci0KLSAgICBzdGF0dXNfdCBzZWVrVG9UaW1lKGludDY0X3QgdGltZVVzKTsKLSAgICBzdGF0dXNfdCBzZWVrVG9PZmZzZXQob2ZmNjRfdCBvZmZzZXQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXIgKipidWZmZXIpID0gMDsKLQotICAgIHN0YXR1c190IGluaXQoKTsKLQotICAgIHNwPE1ldGFEYXRhPiBnZXRGaWxlTWV0YURhdGEoKSB7IHJldHVybiBtRmlsZU1ldGE7IH0KLQotcHJvdGVjdGVkOgotICAgIHN0cnVjdCBQYWdlIHsKLSAgICAgICAgdWludDY0X3QgbUdyYW51bGVQb3NpdGlvbjsKLSAgICAgICAgaW50MzJfdCBtUHJldlBhY2tldFNpemU7Ci0gICAgICAgIHVpbnQ2NF90IG1QcmV2UGFja2V0UG9zOwotICAgICAgICB1aW50MzJfdCBtU2VyaWFsTm87Ci0gICAgICAgIHVpbnQzMl90IG1QYWdlTm87Ci0gICAgICAgIHVpbnQ4X3QgbUZsYWdzOwotICAgICAgICB1aW50OF90IG1OdW1TZWdtZW50czsKLSAgICAgICAgdWludDhfdCBtTGFjZVsyNTVdOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgVE9DRW50cnkgewotICAgICAgICBvZmY2NF90IG1QYWdlT2Zmc2V0OwotICAgICAgICBpbnQ2NF90IG1UaW1lVXM7Ci0gICAgfTsKLQotICAgIHNwPERhdGFTb3VyY2U+IG1Tb3VyY2U7Ci0gICAgb2ZmNjRfdCBtT2Zmc2V0OwotICAgIFBhZ2UgbUN1cnJlbnRQYWdlOwotICAgIHVpbnQ2NF90IG1DdXJHcmFudWxlUG9zaXRpb247Ci0gICAgdWludDY0X3QgbVByZXZHcmFudWxlUG9zaXRpb247Ci0gICAgc2l6ZV90IG1DdXJyZW50UGFnZVNpemU7Ci0gICAgYm9vbCBtRmlyc3RQYWNrZXRJblBhZ2U7Ci0gICAgdWludDY0X3QgbUN1cnJlbnRQYWdlU2FtcGxlczsKLSAgICBzaXplX3QgbU5leHRMYWNlSW5kZXg7Ci0KLSAgICBjb25zdCBjaGFyICptTWltZVR5cGU7Ci0gICAgc2l6ZV90IG1OdW1IZWFkZXJzOwotICAgIGludDY0X3QgbVNlZWtQcmVSb2xsVXM7Ci0KLSAgICBvZmY2NF90IG1GaXJzdERhdGFPZmZzZXQ7Ci0KLSAgICB2b3JiaXNfaW5mbyBtVmk7Ci0gICAgdm9yYmlzX2NvbW1lbnQgbVZjOwotCi0gICAgc3A8TWV0YURhdGE+IG1NZXRhOwotICAgIHNwPE1ldGFEYXRhPiBtRmlsZU1ldGE7Ci0KLSAgICBWZWN0b3I8VE9DRW50cnk+IG1UYWJsZU9mQ29udGVudHM7Ci0KLSAgICBzc2l6ZV90IHJlYWRQYWdlKG9mZjY0X3Qgb2Zmc2V0LCBQYWdlICpwYWdlKTsKLSAgICBzdGF0dXNfdCBmaW5kTmV4dFBhZ2Uob2ZmNjRfdCBzdGFydE9mZnNldCwgb2ZmNjRfdCAqcGFnZU9mZnNldCk7Ci0KLSAgICB2aXJ0dWFsIGludDY0X3QgZ2V0VGltZVVzT2ZHcmFudWxlKHVpbnQ2NF90IGdyYW51bGVQb3MpIGNvbnN0ID0gMDsKLQotICAgIC8vIEV4dHJhY3QgY29kZWMgZm9ybWF0LCBtZXRhZGF0YSB0YWdzLCBhbmQgdmFyaW91cyBjb2RlYyBzcGVjaWZpYyBkYXRhOwotICAgIC8vIHRoZSBmb3JtYXQgYW5kIENTRCdzIGFyZSByZXF1aXJlZCB0byBzZXR1cCB0aGUgZGVjb2RlcnMgZm9yIHRoZSBlbmNsb3NlZCBtZWRpYSBjb250ZW50LgotICAgIC8vCi0gICAgLy8gVmFsaWQgdmFsdWVzIGZvciBgdHlwZWAgYXJlOgotICAgIC8vIDEgLSBiaXRzdHJlYW0gaWRlbnRpZmljYXRpb24gaGVhZGVyCi0gICAgLy8gMyAtIGNvbW1lbnQgaGVhZGVyCi0gICAgLy8gNSAtIGNvZGVjIHNldHVwIGhlYWRlciAoVm9yYmlzIG9ubHkpCi0gICAgdmlydHVhbCBzdGF0dXNfdCB2ZXJpZnlIZWFkZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlciwgdWludDhfdCB0eXBlKSA9IDA7Ci0KLSAgICAvLyBSZWFkIHRoZSBuZXh0IG9nZyBwYWNrZXQgZnJvbSB0aGUgdW5kZXJseWluZyBkYXRhIHNvdXJjZTsgb3B0aW9uYWxseQotICAgIC8vIGNhbGN1bGF0ZSB0aGUgdGltZXN0YW1wIGZvciB0aGUgb3V0cHV0IHBhY2tldCB3aGlsc3QgcHJldGVuZGluZwotICAgIC8vIHRoYXQgd2UgYXJlIHBhcnNpbmcgYW4gT2dnIFZvcmJpcyBzdHJlYW0uCi0gICAgLy8KLSAgICAvLyAqYnVmZmVyIGlzIE5VTEwnZWQgb3V0IGltbWVkaWF0ZWx5IHVwb24gZW50cnksIGFuZCBpZiBzdWNjZXNzZnVsIGEgbmV3IGJ1ZmZlciBpcyBhbGxvY2F0ZWQ7Ci0gICAgLy8gY2xpZW50cyBhcmUgcmVzcG9uc2libGUgZm9yIHJlbGVhc2luZyB0aGUgb3JpZ2luYWwgYnVmZmVyLgotICAgIHN0YXR1c190IF9yZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgYm9vbCBjYWxjVm9yYmlzVGltZXN0YW1wKTsKLQotICAgIGludDMyX3QgZ2V0UGFja2V0QmxvY2tTaXplKE1lZGlhQnVmZmVyICpidWZmZXIpOwotCi0gICAgdm9pZCBwYXJzZUZpbGVNZXRhRGF0YSgpOwotCi0gICAgc3RhdHVzX3QgZmluZFByZXZHcmFudWxlUG9zaXRpb24ob2ZmNjRfdCBwYWdlT2Zmc2V0LCB1aW50NjRfdCAqZ3JhbnVsZVBvcyk7Ci0KLSAgICB2b2lkIGJ1aWxkVGFibGVPZkNvbnRlbnRzKCk7Ci0KLSAgICBNeU9nZ0V4dHJhY3Rvcihjb25zdCBNeU9nZ0V4dHJhY3RvciAmKTsKLSAgICBNeU9nZ0V4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE15T2dnRXh0cmFjdG9yICYpOwotfTsKLQotc3RydWN0IE15Vm9yYmlzRXh0cmFjdG9yIDogcHVibGljIE15T2dnRXh0cmFjdG9yIHsKLSAgICBleHBsaWNpdCBNeVZvcmJpc0V4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKQotICAgICAgICA6IE15T2dnRXh0cmFjdG9yKHNvdXJjZSwKLSAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsCi0gICAgICAgICAgICAgICAgLyogbnVtSGVhZGVycyAqLyAzLAotICAgICAgICAgICAgICAgIC8qIHNlZWtQcmVSb2xsVXMgKi8gMCkgewotICAgIH0KLQotICAgIHZpcnR1YWwgdWludDY0X3QgYXBwcm94Qml0cmF0ZSgpIGNvbnN0OwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlciAqKmJ1ZmZlcikgewotICAgICAgICByZXR1cm4gX3JlYWROZXh0UGFja2V0KGJ1ZmZlciwgLyogY2FsY1ZvcmJpc1RpbWVzdGFtcCA9ICovIHRydWUpOwotICAgIH0KLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgaW50NjRfdCBnZXRUaW1lVXNPZkdyYW51bGUodWludDY0X3QgZ3JhbnVsZVBvcykgY29uc3QgewotICAgICAgICBpZiAoZ3JhbnVsZVBvcyA+IElOVDY0X01BWCAvIDEwMDAwMDBsbCkgewotICAgICAgICAgICAgcmV0dXJuIElOVDY0X01BWDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ3JhbnVsZVBvcyAqIDEwMDAwMDBsbCAvIG1WaS5yYXRlOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVyICpidWZmZXIsIHVpbnQ4X3QgdHlwZSk7Ci19OwotCi1zdHJ1Y3QgTXlPcHVzRXh0cmFjdG9yIDogcHVibGljIE15T2dnRXh0cmFjdG9yIHsKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrT3B1c1NhbXBsZVJhdGUgPSA0ODAwMDsKLSAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrT3B1c1NlZWtQcmVSb2xsVXMgPSA4MDAwMDsgLy8gODAgbXMKLQotICAgIGV4cGxpY2l0IE15T3B1c0V4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKQotICAgICAgICA6IE15T2dnRXh0cmFjdG9yKHNvdXJjZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUywgLypudW1IZWFkZXJzKi8gMiwga09wdXNTZWVrUHJlUm9sbFVzKSwKLSAgICAgICAgICBtQ2hhbm5lbENvdW50KDApLAotICAgICAgICAgIG1Db2RlY0RlbGF5KDApLAotICAgICAgICAgIG1TdGFydEdyYW51bGVQb3NpdGlvbigtMSkgewotICAgIH0KLQotICAgIHZpcnR1YWwgdWludDY0X3QgYXBwcm94Qml0cmF0ZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlciAqKmJ1ZmZlcik7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIGludDY0X3QgZ2V0VGltZVVzT2ZHcmFudWxlKHVpbnQ2NF90IGdyYW51bGVQb3MpIGNvbnN0OwotICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVyICpidWZmZXIsIHVpbnQ4X3QgdHlwZSk7Ci0KLXByaXZhdGU6Ci0gICAgc3RhdHVzX3QgdmVyaWZ5T3B1c0hlYWRlcihNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKLSAgICBzdGF0dXNfdCB2ZXJpZnlPcHVzQ29tbWVudHMoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7Ci0gICAgdWludDMyX3QgZ2V0TnVtU2FtcGxlc0luUGFja2V0KE1lZGlhQnVmZmVyICpidWZmZXIpIGNvbnN0OwotCi0gICAgdWludDhfdCBtQ2hhbm5lbENvdW50OwotICAgIHVpbnQxNl90IG1Db2RlY0RlbGF5OwotICAgIGludDY0X3QgbVN0YXJ0R3JhbnVsZVBvc2l0aW9uOwotfTsKLQotc3RhdGljIHZvaWQgZXh0cmFjdEFsYnVtQXJ0KAotICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJmZpbGVNZXRhLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLU9nZ1NvdXJjZTo6T2dnU291cmNlKGNvbnN0IHNwPE9nZ0V4dHJhY3Rvcj4gJmV4dHJhY3RvcikKLSAgICA6IG1FeHRyYWN0b3IoZXh0cmFjdG9yKSwKLSAgICAgIG1TdGFydGVkKGZhbHNlKSB7Ci19Ci0KLU9nZ1NvdXJjZTo6fk9nZ1NvdXJjZSgpIHsKLSAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgc3RvcCgpOwotICAgIH0KLX0KLQotc3A8TWV0YURhdGE+IE9nZ1NvdXJjZTo6Z2V0Rm9ybWF0KCkgewotICAgIHJldHVybiBtRXh0cmFjdG9yLT5tSW1wbC0+Z2V0Rm9ybWF0KCk7Ci19Ci0KLXN0YXR1c190IE9nZ1NvdXJjZTo6c3RhcnQoTWV0YURhdGEgKiAvKiBwYXJhbXMgKi8pIHsKLSAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIG1TdGFydGVkID0gdHJ1ZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgT2dnU291cmNlOjpzdG9wKCkgewotICAgIG1TdGFydGVkID0gZmFsc2U7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE9nZ1NvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7Ci0gICAgKm91dCA9IE5VTEw7Ci0KLSAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7Ci0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+bUltcGwtPnNlZWtUb1RpbWUoc2Vla1RpbWVVcyk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBNZWRpYUJ1ZmZlciAqcGFja2V0OwotICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPm1JbXBsLT5yZWFkTmV4dFBhY2tldCgmcGFja2V0KTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSNpZiAwCi0gICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgaWYgKHBhY2tldC0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpIHsKLSAgICAgICAgQUxPR0koImZvdW5kIHRpbWUgPSAlbGxkIHVzIiwgdGltZVVzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HSSgiTk8gdGltZSIpOwotICAgIH0KLSNlbmRpZgotCi0gICAgcGFja2V0LT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKLQotICAgICpvdXQgPSBwYWNrZXQ7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLU15T2dnRXh0cmFjdG9yOjpNeU9nZ0V4dHJhY3RvcigKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwKLSAgICAgICAgY29uc3QgY2hhciAqbWltZVR5cGUsCi0gICAgICAgIHNpemVfdCBudW1IZWFkZXJzLAotICAgICAgICBpbnQ2NF90IHNlZWtQcmVSb2xsVXMpCi0gICAgOiBtU291cmNlKHNvdXJjZSksCi0gICAgICBtT2Zmc2V0KDApLAotICAgICAgbUN1ckdyYW51bGVQb3NpdGlvbigwKSwKLSAgICAgIG1QcmV2R3JhbnVsZVBvc2l0aW9uKDApLAotICAgICAgbUN1cnJlbnRQYWdlU2l6ZSgwKSwKLSAgICAgIG1GaXJzdFBhY2tldEluUGFnZSh0cnVlKSwKLSAgICAgIG1DdXJyZW50UGFnZVNhbXBsZXMoMCksCi0gICAgICBtTmV4dExhY2VJbmRleCgwKSwKLSAgICAgIG1NaW1lVHlwZShtaW1lVHlwZSksCi0gICAgICBtTnVtSGVhZGVycyhudW1IZWFkZXJzKSwKLSAgICAgIG1TZWVrUHJlUm9sbFVzKHNlZWtQcmVSb2xsVXMpLAotICAgICAgbUZpcnN0RGF0YU9mZnNldCgtMSkgewotICAgIG1DdXJyZW50UGFnZS5tTnVtU2VnbWVudHMgPSAwOwotCi0gICAgdm9yYmlzX2luZm9faW5pdCgmbVZpKTsKLSAgICB2b3JiaXNfY29tbWVudF9pbml0KCZtVmMpOwotfQotCi1NeU9nZ0V4dHJhY3Rvcjo6fk15T2dnRXh0cmFjdG9yKCkgewotICAgIHZvcmJpc19jb21tZW50X2NsZWFyKCZtVmMpOwotICAgIHZvcmJpc19pbmZvX2NsZWFyKCZtVmkpOwotfQotCi1zcDxNZXRhRGF0YT4gTXlPZ2dFeHRyYWN0b3I6OmdldEZvcm1hdCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbU1ldGE7Ci19Ci0KLXN0YXR1c190IE15T2dnRXh0cmFjdG9yOjpmaW5kTmV4dFBhZ2UoCi0gICAgICAgIG9mZjY0X3Qgc3RhcnRPZmZzZXQsIG9mZjY0X3QgKnBhZ2VPZmZzZXQpIHsKLSAgICAqcGFnZU9mZnNldCA9IHN0YXJ0T2Zmc2V0OwotCi0gICAgZm9yICg7OykgewotICAgICAgICBjaGFyIHNpZ25hdHVyZVs0XTsKLSAgICAgICAgc3NpemVfdCBuID0gbVNvdXJjZS0+cmVhZEF0KCpwYWdlT2Zmc2V0LCAmc2lnbmF0dXJlLCA0KTsKLQotICAgICAgICBpZiAobiA8IDQpIHsKLSAgICAgICAgICAgICpwYWdlT2Zmc2V0ID0gMDsKLQotICAgICAgICAgICAgcmV0dXJuIChuIDwgMCkgPyBuIDogKHN0YXR1c190KUVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW1lbWNtcChzaWduYXR1cmUsICJPZ2dTIiwgNCkpIHsKLSAgICAgICAgICAgIGlmICgqcGFnZU9mZnNldCA+IHN0YXJ0T2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInNraXBwZWQgJWxsZCBieXRlcyBvZiBqdW5rIHRvIHJlYWNoIG5leHQgZnJhbWUiLAotICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykoKnBhZ2VPZmZzZXQgLSBzdGFydE9mZnNldCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLQotICAgICAgICArKypwYWdlT2Zmc2V0OwotICAgIH0KLX0KLQotLy8gR2l2ZW4gdGhlIG9mZnNldCBvZiB0aGUgImN1cnJlbnQiIHBhZ2UsIGZpbmQgdGhlIHBhZ2UgaW1tZWRpYXRlbHkgcHJlY2VkaW5nCi0vLyBpdCAoaWYgYW55KSBhbmQgcmV0dXJuIGl0cyBncmFudWxlIHBvc2l0aW9uLgotLy8gVG8gZG8gdGhpcyB3ZSBiYWNrIHVwIGZyb20gdGhlICJjdXJyZW50IiBwYWdlJ3Mgb2Zmc2V0IHVudGlsIHdlIGZpbmQgYW55Ci0vLyBwYWdlIHByZWNlZGluZyBpdCBhbmQgdGhlbiBzY2FuIGZvcndhcmQgdG8ganVzdCBiZWZvcmUgdGhlIGN1cnJlbnQgcGFnZS4KLXN0YXR1c190IE15T2dnRXh0cmFjdG9yOjpmaW5kUHJldkdyYW51bGVQb3NpdGlvbigKLSAgICAgICAgb2ZmNjRfdCBwYWdlT2Zmc2V0LCB1aW50NjRfdCAqZ3JhbnVsZVBvcykgewotICAgICpncmFudWxlUG9zID0gMDsKLQotICAgIG9mZjY0X3QgcHJldlBhZ2VPZmZzZXQgPSAwOwotICAgIG9mZjY0X3QgcHJldkd1ZXNzID0gcGFnZU9mZnNldDsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGlmIChwcmV2R3Vlc3MgPj0gNTAwMCkgewotICAgICAgICAgICAgcHJldkd1ZXNzIC09IDUwMDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcmV2R3Vlc3MgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgQUxPR1YoImJhY2tpbmcgdXAgJWxsZCBieXRlcyIsIChsb25nIGxvbmcpKHBhZ2VPZmZzZXQgLSBwcmV2R3Vlc3MpKTsKLQotICAgICAgICBzdGF0dXNfdCBlcnIgPSBmaW5kTmV4dFBhZ2UocHJldkd1ZXNzLCAmcHJldlBhZ2VPZmZzZXQpOwotICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgICAgIC8vIFdlIGFyZSBhdCB0aGUgbGFzdCBwYWdlIGFuZCBkaWRuJ3QgYmFjayBvZmYgZW5vdWdoOwotICAgICAgICAgICAgLy8gYmFjayBvZmYgNTAwMCBieXRlcyBtb3JlIGFuZCB0cnkgYWdhaW4uCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJldlBhZ2VPZmZzZXQgPCBwYWdlT2Zmc2V0IHx8IHByZXZHdWVzcyA9PSAwKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChwcmV2UGFnZU9mZnNldCA9PSBwYWdlT2Zmc2V0KSB7Ci0gICAgICAgIC8vIFdlIGRpZCBub3QgZmluZCBhIHBhZ2UgcHJlY2VkaW5nIHRoaXMgb25lLgotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBBTE9HVigicHJldlBhZ2VPZmZzZXQgYXQgJWxsZCwgcGFnZU9mZnNldCBhdCAlbGxkIiwKLSAgICAgICAgICAgIChsb25nIGxvbmcpcHJldlBhZ2VPZmZzZXQsIChsb25nIGxvbmcpcGFnZU9mZnNldCk7Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIFBhZ2UgcHJldlBhZ2U7Ci0gICAgICAgIHNzaXplX3QgbiA9IHJlYWRQYWdlKHByZXZQYWdlT2Zmc2V0LCAmcHJldlBhZ2UpOwotCi0gICAgICAgIGlmIChuIDw9IDApIHsKLSAgICAgICAgICAgIHJldHVybiAoc3RhdHVzX3QpbjsKLSAgICAgICAgfQotCi0gICAgICAgIHByZXZQYWdlT2Zmc2V0ICs9IG47Ci0KLSAgICAgICAgaWYgKHByZXZQYWdlT2Zmc2V0ID09IHBhZ2VPZmZzZXQpIHsKLSAgICAgICAgICAgICpncmFudWxlUG9zID0gcHJldlBhZ2UubUdyYW51bGVQb3NpdGlvbjsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6OnNlZWtUb1RpbWUoaW50NjRfdCB0aW1lVXMpIHsKLSAgICB0aW1lVXMgLT0gbVNlZWtQcmVSb2xsVXM7Ci0gICAgaWYgKHRpbWVVcyA8IDApIHsKLSAgICAgICAgdGltZVVzID0gMDsKLSAgICB9Ci0KLSAgICBpZiAobVRhYmxlT2ZDb250ZW50cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgLy8gUGVyZm9ybSBhcHByb3hpbWF0ZSBzZWVraW5nIGJhc2VkIG9uIGF2Zy4gYml0cmF0ZS4KLSAgICAgICAgdWludDY0X3QgYnBzID0gYXBwcm94Qml0cmF0ZSgpOwotICAgICAgICBpZiAoYnBzIDw9IDApIHsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotCi0gICAgICAgIG9mZjY0X3QgcG9zID0gdGltZVVzICogYnBzIC8gODAwMDAwMGxsOwotCi0gICAgICAgIEFMT0dWKCJzZWVraW5nIHRvIG9mZnNldCAlbGxkIiwgKGxvbmcgbG9uZylwb3MpOwotICAgICAgICByZXR1cm4gc2Vla1RvT2Zmc2V0KHBvcyk7Ci0gICAgfQotCi0gICAgc2l6ZV90IGxlZnQgPSAwOwotICAgIHNpemVfdCByaWdodF9wbHVzX29uZSA9IG1UYWJsZU9mQ29udGVudHMuc2l6ZSgpOwotICAgIHdoaWxlIChsZWZ0IDwgcmlnaHRfcGx1c19vbmUpIHsKLSAgICAgICAgc2l6ZV90IGNlbnRlciA9IGxlZnQgKyAocmlnaHRfcGx1c19vbmUgLSBsZWZ0KSAvIDI7Ci0KLSAgICAgICAgY29uc3QgVE9DRW50cnkgJmVudHJ5ID0gbVRhYmxlT2ZDb250ZW50cy5pdGVtQXQoY2VudGVyKTsKLQotICAgICAgICBpZiAodGltZVVzIDwgZW50cnkubVRpbWVVcykgewotICAgICAgICAgICAgcmlnaHRfcGx1c19vbmUgPSBjZW50ZXI7Ci0gICAgICAgIH0gZWxzZSBpZiAodGltZVVzID4gZW50cnkubVRpbWVVcykgewotICAgICAgICAgICAgbGVmdCA9IGNlbnRlciArIDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsZWZ0ID0gY2VudGVyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobGVmdCA9PSBtVGFibGVPZkNvbnRlbnRzLnNpemUoKSkgewotICAgICAgICAtLWxlZnQ7Ci0gICAgfQotCi0gICAgY29uc3QgVE9DRW50cnkgJmVudHJ5ID0gbVRhYmxlT2ZDb250ZW50cy5pdGVtQXQobGVmdCk7Ci0KLSAgICBBTE9HVigic2Vla2luZyB0byBlbnRyeSAlenUgLyAlenUgYXQgb2Zmc2V0ICVsbGQiLAotICAgICAgICAgbGVmdCwgbVRhYmxlT2ZDb250ZW50cy5zaXplKCksIChsb25nIGxvbmcpZW50cnkubVBhZ2VPZmZzZXQpOwotCi0gICAgcmV0dXJuIHNlZWtUb09mZnNldChlbnRyeS5tUGFnZU9mZnNldCk7Ci19Ci0KLXN0YXR1c190IE15T2dnRXh0cmFjdG9yOjpzZWVrVG9PZmZzZXQob2ZmNjRfdCBvZmZzZXQpIHsKLSAgICBpZiAobUZpcnN0RGF0YU9mZnNldCA+PSAwICYmIG9mZnNldCA8IG1GaXJzdERhdGFPZmZzZXQpIHsKLSAgICAgICAgLy8gT25jZSB3ZSBrbm93IHdoZXJlIHRoZSBhY3R1YWwgYXVkaW8gZGF0YSBzdGFydHMgKHBhc3QgdGhlIGhlYWRlcnMpCi0gICAgICAgIC8vIGRvbid0IGV2ZXIgc2VlayB0byBhbnl3aGVyZSBiZWZvcmUgdGhhdC4KLSAgICAgICAgb2Zmc2V0ID0gbUZpcnN0RGF0YU9mZnNldDsKLSAgICB9Ci0KLSAgICBvZmY2NF90IHBhZ2VPZmZzZXQ7Ci0gICAgc3RhdHVzX3QgZXJyID0gZmluZE5leHRQYWdlKG9mZnNldCwgJnBhZ2VPZmZzZXQpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8vIFdlIGZvdW5kIHRoZSBwYWdlIHdlIHdhbnRlZCB0byBzZWVrIHRvLCBidXQgd2UnbGwgYWxzbyBuZWVkCi0gICAgLy8gdGhlIHBhZ2UgcHJlY2VkaW5nIGl0IHRvIGRldGVybWluZSBob3cgbWFueSB2YWxpZCBzYW1wbGVzIGFyZSBvbgotICAgIC8vIHRoaXMgcGFnZS4KLSAgICBmaW5kUHJldkdyYW51bGVQb3NpdGlvbihwYWdlT2Zmc2V0LCAmbVByZXZHcmFudWxlUG9zaXRpb24pOwotCi0gICAgbU9mZnNldCA9IHBhZ2VPZmZzZXQ7Ci0KLSAgICBtQ3VycmVudFBhZ2VTaXplID0gMDsKLSAgICBtRmlyc3RQYWNrZXRJblBhZ2UgPSB0cnVlOwotICAgIG1DdXJyZW50UGFnZVNhbXBsZXMgPSAwOwotICAgIG1DdXJyZW50UGFnZS5tTnVtU2VnbWVudHMgPSAwOwotICAgIG1DdXJyZW50UGFnZS5tUHJldlBhY2tldFNpemUgPSAtMTsKLSAgICBtTmV4dExhY2VJbmRleCA9IDA7Ci0KLSAgICAvLyBYWFggd2hhdCBpZiBuZXcgcGFnZSBjb250aW51ZXMgcGFja2V0IGZyb20gbGFzdD8/PwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zc2l6ZV90IE15T2dnRXh0cmFjdG9yOjpyZWFkUGFnZShvZmY2NF90IG9mZnNldCwgUGFnZSAqcGFnZSkgewotICAgIHVpbnQ4X3QgaGVhZGVyWzI3XTsKLSAgICBzc2l6ZV90IG47Ci0gICAgaWYgKChuID0gbVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkpCi0gICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihoZWFkZXIpKSB7Ci0gICAgICAgIEFMT0dWKCJmYWlsZWQgdG8gcmVhZCAlenUgYnl0ZXMgYXQgb2Zmc2V0ICUjMDE2bGx4LCBnb3QgJXpkIGJ5dGVzIiwKLSAgICAgICAgICAgICAgICBzaXplb2YoaGVhZGVyKSwgKGxvbmcgbG9uZylvZmZzZXQsIG4pOwotCi0gICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIG47Ci0gICAgICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChtZW1jbXAoaGVhZGVyLCAiT2dnUyIsIDQpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKGhlYWRlcls0XSAhPSAwKSB7Ci0gICAgICAgIC8vIFdyb25nIHZlcnNpb24uCi0KLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHBhZ2UtPm1GbGFncyA9IGhlYWRlcls1XTsKLQotICAgIGlmIChwYWdlLT5tRmxhZ3MgJiB+NykgewotICAgICAgICAvLyBPbmx5IGJpdHMgMC0yIGFyZSBkZWZpbmVkIGluIHZlcnNpb24gMC4KLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBwYWdlLT5tR3JhbnVsZVBvc2l0aW9uID0gVTY0TEVfQVQoJmhlYWRlcls2XSk7Ci0KLSNpZiAwCi0gICAgcHJpbnRmKCJncmFudWxlUG9zaXRpb24gPSAlbGx1ICgweCVsbHgpXG4iLAotICAgICAgICAgICBwYWdlLT5tR3JhbnVsZVBvc2l0aW9uLCBwYWdlLT5tR3JhbnVsZVBvc2l0aW9uKTsKLSNlbmRpZgotCi0gICAgcGFnZS0+bVNlcmlhbE5vID0gVTMyTEVfQVQoJmhlYWRlclsxNF0pOwotICAgIHBhZ2UtPm1QYWdlTm8gPSBVMzJMRV9BVCgmaGVhZGVyWzE4XSk7Ci0KLSAgICBwYWdlLT5tTnVtU2VnbWVudHMgPSBoZWFkZXJbMjZdOwotICAgIGlmIChtU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgb2Zmc2V0ICsgc2l6ZW9mKGhlYWRlciksIHBhZ2UtPm1MYWNlLCBwYWdlLT5tTnVtU2VnbWVudHMpCi0gICAgICAgICAgICA8IChzc2l6ZV90KXBhZ2UtPm1OdW1TZWdtZW50cykgewotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotCi0gICAgc2l6ZV90IHRvdGFsU2l6ZSA9IDA7OwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFnZS0+bU51bVNlZ21lbnRzOyArK2kpIHsKLSAgICAgICAgdG90YWxTaXplICs9IHBhZ2UtPm1MYWNlW2ldOwotICAgIH0KLQotI2lmIDAKLSAgICBTdHJpbmc4IHRtcDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhZ2UtPm1OdW1TZWdtZW50czsgKytpKSB7Ci0gICAgICAgIGNoYXIgeFszMl07Ci0gICAgICAgIHNwcmludGYoeCwgIiVzJXUiLCBpID4gMCA/ICIsICIgOiAiIiwgKHVuc2lnbmVkKXBhZ2UtPm1MYWNlW2ldKTsKLQotICAgICAgICB0bXAuYXBwZW5kKHgpOwotICAgIH0KLQotICAgIEFMT0dWKCIlYyAlcyIsIHBhZ2UtPm1GbGFncyAmIDEgPyAnKycgOiAnICcsIHRtcC5zdHJpbmcoKSk7Ci0jZW5kaWYKLQotICAgIHJldHVybiBzaXplb2YoaGVhZGVyKSArIHBhZ2UtPm1OdW1TZWdtZW50cyArIHRvdGFsU2l6ZTsKLX0KLQotc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjpyZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlciAqKm91dCkgewotICAgIGlmIChtT2Zmc2V0IDw9IG1GaXJzdERhdGFPZmZzZXQgJiYgbVN0YXJ0R3JhbnVsZVBvc2l0aW9uIDwgMCkgewotICAgICAgICAvLyBUaGUgZmlyc3Qgc2FtcGxlIG1pZ2h0IG5vdCBzdGFydCBhdCB0aW1lIDA7IGZpbmQgb3V0IHdoZXJlIGJ5IHN1YnRyYWN0aW5nCi0gICAgICAgIC8vIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBvbiB0aGUgZmlyc3QgcGFnZSBmcm9tIHRoZSBncmFudWxlIHBvc2l0aW9uCi0gICAgICAgIC8vIChwb3NpdGlvbiBvZiBsYXN0IGNvbXBsZXRlIHNhbXBsZSkgb2YgdGhlIGZpcnN0IHBhZ2UuIFRoaXMgaGFwcGVucwotICAgICAgICAvLyB0aGUgZmlyc3QgdGltZSBiZWZvcmUgd2UgYXR0ZW1wdCB0byByZWFkIGEgcGFja2V0IGZyb20gdGhlIGZpcnN0IHBhZ2UuCi0gICAgICAgIE1lZGlhQnVmZmVyICptQnVmOwotICAgICAgICB1aW50MzJfdCBudW1TYW1wbGVzID0gMDsKLSAgICAgICAgdWludDY0X3QgY3VyR3JhbnVsZVBvc2l0aW9uID0gMDsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IF9yZWFkTmV4dFBhY2tldCgmbUJ1ZiwgLyogY2FsY1ZvcmJpc1RpbWVzdGFtcCA9ICovZmFsc2UpOwotICAgICAgICAgICAgaWYgKGVyciAhPSBPSyAmJiBlcnIgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBGaXJzdCB0d28gcGFnZXMgYXJlIGhlYWRlciBwYWdlcy4KLSAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSB8fCBtQ3VycmVudFBhZ2UubVBhZ2VObyA+IDIpIHsKLSAgICAgICAgICAgICAgICBpZiAobUJ1ZiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWYtPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY3VyR3JhbnVsZVBvc2l0aW9uID0gbUN1cnJlbnRQYWdlLm1HcmFudWxlUG9zaXRpb247Ci0gICAgICAgICAgICBudW1TYW1wbGVzICs9IGdldE51bVNhbXBsZXNJblBhY2tldChtQnVmKTsKLSAgICAgICAgICAgIG1CdWYtPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1CdWYgPSBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGN1ckdyYW51bGVQb3NpdGlvbiA+IG51bVNhbXBsZXMpIHsKLSAgICAgICAgICAgIG1TdGFydEdyYW51bGVQb3NpdGlvbiA9IGN1ckdyYW51bGVQb3NpdGlvbiAtIG51bVNhbXBsZXM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3RhcnRHcmFudWxlUG9zaXRpb24gPSAwOwotICAgICAgICB9Ci0gICAgICAgIHNlZWtUb09mZnNldCgwKTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBfcmVhZE5leHRQYWNrZXQob3V0LCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi9mYWxzZSk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGludDMyX3QgY3VycmVudFBhZ2VTYW1wbGVzOwotICAgIC8vIENhbGN1bGF0ZSB0aW1lc3RhbXBzIGJ5IGFjY3VtdWxhdGluZyBkdXJhdGlvbnMgc3RhcnRpbmcgZnJvbSB0aGUgZmlyc3Qgc2FtcGxlIG9mIGEgcGFnZTsKLSAgICAvLyBXZSBhc3N1bWUgdGhhdCB3ZSBvbmx5IHNlZWsgdG8gcGFnZSBib3VuZGFyaWVzLgotICAgIGlmICgoKm91dCktPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoa0tleVZhbGlkU2FtcGxlcywgJmN1cnJlbnRQYWdlU2FtcGxlcykpIHsKLSAgICAgICAgLy8gZmlyc3QgcGFja2V0IGluIHBhZ2UKLSAgICAgICAgaWYgKG1PZmZzZXQgPT0gbUZpcnN0RGF0YU9mZnNldCkgewotICAgICAgICAgICAgY3VycmVudFBhZ2VTYW1wbGVzIC09IG1TdGFydEdyYW51bGVQb3NpdGlvbjsKLSAgICAgICAgICAgICgqb3V0KS0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlWYWxpZFNhbXBsZXMsIGN1cnJlbnRQYWdlU2FtcGxlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1ckdyYW51bGVQb3NpdGlvbiA9IG1DdXJyZW50UGFnZS5tR3JhbnVsZVBvc2l0aW9uIC0gY3VycmVudFBhZ2VTYW1wbGVzOwotICAgIH0KLQotICAgIGludDY0X3QgdGltZVVzID0gZ2V0VGltZVVzT2ZHcmFudWxlKG1DdXJHcmFudWxlUG9zaXRpb24pOwotICAgICgqb3V0KS0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOwotCi0gICAgdWludDMyX3QgZnJhbWVzID0gZ2V0TnVtU2FtcGxlc0luUGFja2V0KCpvdXQpOwotICAgIG1DdXJHcmFudWxlUG9zaXRpb24gKz0gZnJhbWVzOwotICAgIHJldHVybiBPSzsKLX0KLQotdWludDMyX3QgTXlPcHVzRXh0cmFjdG9yOjpnZXROdW1TYW1wbGVzSW5QYWNrZXQoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgY29uc3QgewotICAgIGlmIChidWZmZXIgPT0gTlVMTCB8fCBidWZmZXItPnJhbmdlX2xlbmd0aCgpIDwgMSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICB1aW50OF90ICpkYXRhID0gKHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7Ci0gICAgdWludDhfdCB0b2MgPSBkYXRhWzBdOwotICAgIHVpbnQ4X3QgY29uZmlnID0gKHRvYyA+PiAzKSAmIDB4MWY7Ci0gICAgdWludDMyX3QgZnJhbWVTaXplc1VzW10gPSB7Ci0gICAgICAgIDEwMDAwLCAyMDAwMCwgNDAwMDAsIDYwMDAwLCAvLyAwLi4uMwotICAgICAgICAxMDAwMCwgMjAwMDAsIDQwMDAwLCA2MDAwMCwgLy8gNC4uLjcKLSAgICAgICAgMTAwMDAsIDIwMDAwLCA0MDAwMCwgNjAwMDAsIC8vIDguLi4xMQotICAgICAgICAxMDAwMCwgMjAwMDAsICAgICAgICAgICAgICAgLy8gMTIuLi4xMwotICAgICAgICAxMDAwMCwgMjAwMDAsICAgICAgICAgICAgICAgLy8gMTQuLi4xNQotICAgICAgICAyNTAwLCA1MDAwLCAxMDAwMCwgMjAwMDAsICAgLy8gMTYuLi4xOQotICAgICAgICAyNTAwLCA1MDAwLCAxMDAwMCwgMjAwMDAsICAgLy8gMjAuLi4yMwotICAgICAgICAyNTAwLCA1MDAwLCAxMDAwMCwgMjAwMDAsICAgLy8gMjQuLi4yNwotICAgICAgICAyNTAwLCA1MDAwLCAxMDAwMCwgMjAwMDAgICAgLy8gMjguLi4zMQotICAgIH07Ci0gICAgdWludDMyX3QgZnJhbWVTaXplVXMgPSBmcmFtZVNpemVzVXNbY29uZmlnXTsKLQotICAgIHVpbnQzMl90IG51bUZyYW1lczsKLSAgICB1aW50OF90IGMgPSB0b2MgJiAzOwotICAgIHN3aXRjaCAoYykgewotICAgIGNhc2UgMDoKLSAgICAgICAgbnVtRnJhbWVzID0gMTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgIGNhc2UgMjoKLSAgICAgICAgbnVtRnJhbWVzID0gMjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgICBpZiAoYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA8IDMpIHsKLSAgICAgICAgICAgIG51bUZyYW1lcyA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBudW1GcmFtZXMgPSBkYXRhWzJdICYgMHgzZjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBUUkVTUEFTUygpOwotICAgIH0KLQotICAgIHVpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZVNpemVVcyAqIG51bUZyYW1lcyAqIGtPcHVzU2FtcGxlUmF0ZSAvIDEwMDAwMDA7Ci0gICAgcmV0dXJuIG51bVNhbXBsZXM7Ci19Ci0KLXN0YXR1c190IE15T2dnRXh0cmFjdG9yOjpfcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXIgKipvdXQsIGJvb2wgY2FsY1ZvcmJpc1RpbWVzdGFtcCkgewotICAgICpvdXQgPSBOVUxMOwotCi0gICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9IE5VTEw7Ci0gICAgaW50NjRfdCB0aW1lVXMgPSAtMTsKLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgc2l6ZV90IGk7Ci0gICAgICAgIHNpemVfdCBwYWNrZXRTaXplID0gMDsKLSAgICAgICAgYm9vbCBnb3RGdWxsUGFja2V0ID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaSA9IG1OZXh0TGFjZUluZGV4OyBpIDwgbUN1cnJlbnRQYWdlLm1OdW1TZWdtZW50czsgKytpKSB7Ci0gICAgICAgICAgICB1aW50OF90IGxhY2UgPSBtQ3VycmVudFBhZ2UubUxhY2VbaV07Ci0KLSAgICAgICAgICAgIHBhY2tldFNpemUgKz0gbGFjZTsKLQotICAgICAgICAgICAgaWYgKGxhY2UgPCAyNTUpIHsKLSAgICAgICAgICAgICAgICBnb3RGdWxsUGFja2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICArK2k7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU5leHRMYWNlSW5kZXggPCBtQ3VycmVudFBhZ2UubU51bVNlZ21lbnRzKSB7Ci0gICAgICAgICAgICBvZmY2NF90IGRhdGFPZmZzZXQgPSBtT2Zmc2V0ICsgMjcgKyBtQ3VycmVudFBhZ2UubU51bVNlZ21lbnRzOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtTmV4dExhY2VJbmRleDsgKytqKSB7Ci0gICAgICAgICAgICAgICAgZGF0YU9mZnNldCArPSBtQ3VycmVudFBhZ2UubUxhY2Vbal07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNpemVfdCBmdWxsU2l6ZSA9IHBhY2tldFNpemU7Ci0gICAgICAgICAgICBpZiAoYnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBmdWxsU2l6ZSArPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZ1bGxTaXplID4gMTYgKiAxMDI0ICogMTAyNCkgeyAvLyBhcmJpdHJhcnkgbGltaXQgb2YgMTYgTUIgcGFja2V0IHNpemUKLSAgICAgICAgICAgICAgICBpZiAoYnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dFKCJiLzM2NTkyMjAyIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICp0bXAgPSBuZXcgKHN0ZDo6bm90aHJvdykgTWVkaWFCdWZmZXIoZnVsbFNpemUpOwotICAgICAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HRSgiYi8zNjU5MjIwMiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkodG1wLT5kYXRhKCksIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICB0bXAtPnNldF9yYW5nZSgwLCBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdG1wLT5zZXRfcmFuZ2UoMCwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWZmZXIgPSB0bXA7Ci0KLSAgICAgICAgICAgIHNzaXplX3QgbiA9IG1Tb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCksCi0gICAgICAgICAgICAgICAgICAgIHBhY2tldFNpemUpOwotCi0gICAgICAgICAgICBpZiAobiA8IChzc2l6ZV90KXBhY2tldFNpemUpIHsKLSAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBBTE9HVigiZmFpbGVkIHRvIHJlYWQgJXp1IGJ5dGVzIGF0ICUjMDE2bGx4LCBnb3QgJXpkIGJ5dGVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldFNpemUsIChsb25nIGxvbmcpZGF0YU9mZnNldCwgbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCBmdWxsU2l6ZSk7Ci0KLSAgICAgICAgICAgIG1OZXh0TGFjZUluZGV4ID0gaTsKLQotICAgICAgICAgICAgaWYgKGdvdEZ1bGxQYWNrZXQpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSd2ZSBqdXN0IHJlYWQgdGhlIGVudGlyZSBwYWNrZXQuCi0KLSAgICAgICAgICAgICAgICBpZiAobUZpcnN0UGFja2V0SW5QYWdlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlWYWxpZFNhbXBsZXMsIG1DdXJyZW50UGFnZVNhbXBsZXMpOwotICAgICAgICAgICAgICAgICAgICBtRmlyc3RQYWNrZXRJblBhZ2UgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2FsY1ZvcmJpc1RpbWVzdGFtcCkgewotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGN1ckJsb2NrU2l6ZSA9IGdldFBhY2tldEJsb2NrU2l6ZShidWZmZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRQYWdlLm1QcmV2UGFja2V0U2l6ZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50UGFnZS5tUHJldlBhY2tldFNpemUgPSBjdXJCbG9ja1NpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFBhZ2UubVByZXZQYWNrZXRQb3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFBhZ2UubUdyYW51bGVQb3NpdGlvbiAtIG1DdXJyZW50UGFnZVNhbXBsZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lVXMgPSBtQ3VycmVudFBhZ2UubVByZXZQYWNrZXRQb3MgKiAxMDAwMDAwbGwgLyBtVmkucmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBlZmZlY3RpdmUgYmxvY2sgc2l6ZSBpcyB0aGUgYXZlcmFnZSBvZiB0aGUgdHdvIG92ZXJsYXBwZWQgYmxvY2tzCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGFjdHVhbEJsb2NrU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdXJCbG9ja1NpemUgKyBtQ3VycmVudFBhZ2UubVByZXZQYWNrZXRTaXplKSAvIDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lVXMgPSBtQ3VycmVudFBhZ2UubVByZXZQYWNrZXRQb3MgKiAxMDAwMDAwbGwgLyBtVmkucmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBhY3R1YWwgc2l6ZSBvdXRwdXQgYnkgdGhlIGRlY29kZXIgd2lsbCBiZSBoYWxmIHRoZSBlZmZlY3RpdmUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpemUsIGR1ZSB0byB0aGUgb3ZlcmxhcAotICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRQYWdlLm1QcmV2UGFja2V0UG9zICs9IGFjdHVhbEJsb2NrU2l6ZSAvIDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFBhZ2UubVByZXZQYWNrZXRTaXplID0gY3VyQmxvY2tTaXplOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAqb3V0ID0gYnVmZmVyOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gsIHRoZSBidWZmZXIgbm93IGNvbnRhaW5zIHRoZSBzdGFydCBvZiB0aGUgcGFja2V0LgotICAgICAgICB9Ci0KLSAgICAgICAgQ0hFQ0tfRVEobU5leHRMYWNlSW5kZXgsIG1DdXJyZW50UGFnZS5tTnVtU2VnbWVudHMpOwotCi0gICAgICAgIG1PZmZzZXQgKz0gbUN1cnJlbnRQYWdlU2l6ZTsKLSAgICAgICAgc3NpemVfdCBuID0gcmVhZFBhZ2UobU9mZnNldCwgJm1DdXJyZW50UGFnZSk7Ci0KLSAgICAgICAgaWYgKG4gPD0gMCkgewotICAgICAgICAgICAgaWYgKGJ1ZmZlcikgewotICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFMT0dWKCJyZWFkUGFnZSByZXR1cm5lZCAlemQiLCBuKTsKLQotICAgICAgICAgICAgcmV0dXJuIG4gPCAwID8gbiA6IChzdGF0dXNfdClFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUHJldmVudCBhIGhhcm1sZXNzIHVuc2lnbmVkIGludGVnZXIgb3ZlcmZsb3cgYnkgY2xhbXBpbmcgdG8gMAotICAgICAgICBpZiAobUN1cnJlbnRQYWdlLm1HcmFudWxlUG9zaXRpb24gPj0gbVByZXZHcmFudWxlUG9zaXRpb24pIHsKLSAgICAgICAgICAgIG1DdXJyZW50UGFnZVNhbXBsZXMgPQotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFBhZ2UubUdyYW51bGVQb3NpdGlvbiAtIG1QcmV2R3JhbnVsZVBvc2l0aW9uOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUN1cnJlbnRQYWdlU2FtcGxlcyA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgbUZpcnN0UGFja2V0SW5QYWdlID0gdHJ1ZTsKLQotICAgICAgICBtUHJldkdyYW51bGVQb3NpdGlvbiA9IG1DdXJyZW50UGFnZS5tR3JhbnVsZVBvc2l0aW9uOwotCi0gICAgICAgIG1DdXJyZW50UGFnZVNpemUgPSBuOwotICAgICAgICBtTmV4dExhY2VJbmRleCA9IDA7Ci0KLSAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAoKG1DdXJyZW50UGFnZS5tRmxhZ3MgJiAxKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBwYWdlIGRvZXMgbm90IGNvbnRpbnVlIHRoZSBwYWNrZXQsIGkuZS4gdGhlIHBhY2tldAotICAgICAgICAgICAgICAgIC8vIGlzIGFscmVhZHkgY29tcGxldGUuCi0KLSAgICAgICAgICAgICAgICBpZiAodGltZVVzID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5VmFsaWRTYW1wbGVzLCBtQ3VycmVudFBhZ2VTYW1wbGVzKTsKLSAgICAgICAgICAgICAgICBtRmlyc3RQYWNrZXRJblBhZ2UgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICpvdXQgPSBidWZmZXI7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXR1c190IE15T2dnRXh0cmFjdG9yOjppbml0KCkgewotICAgIG1NZXRhID0gbmV3IE1ldGFEYXRhOwotICAgIG1NZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbU1pbWVUeXBlKTsKLQotICAgIHN0YXR1c190IGVycjsKLSAgICBNZWRpYUJ1ZmZlciAqcGFja2V0OwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bUhlYWRlcnM7ICsraSkgewotICAgICAgICAvLyBpZ25vcmUgdGltZXN0YW1wIGZvciBjb25maWd1cmF0aW9uIHBhY2tldHMKLSAgICAgICAgaWYgKChlcnIgPSBfcmVhZE5leHRQYWNrZXQoJnBhY2tldCwgLyogY2FsY1ZvcmJpc1RpbWVzdGFtcCA9ICovIGZhbHNlKSkgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoInJlYWQgcGFja2V0IG9mIHNpemUgJXp1XG4iLCBwYWNrZXQtPnJhbmdlX2xlbmd0aCgpKTsKLSAgICAgICAgZXJyID0gdmVyaWZ5SGVhZGVyKHBhY2tldCwgLyogdHlwZSA9ICovIGkgKiAyICsgMSk7Ci0gICAgICAgIHBhY2tldC0+cmVsZWFzZSgpOwotICAgICAgICBwYWNrZXQgPSBOVUxMOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbUZpcnN0RGF0YU9mZnNldCA9IG1PZmZzZXQgKyBtQ3VycmVudFBhZ2VTaXplOwotCi0gICAgb2ZmNjRfdCBzaXplOwotICAgIHVpbnQ2NF90IGxhc3RHcmFudWxlUG9zaXRpb247Ci0gICAgaWYgKCEobVNvdXJjZS0+ZmxhZ3MoKSAmIERhdGFTb3VyY2U6OmtJc0NhY2hpbmdEYXRhU291cmNlKQotICAgICAgICAgICAgJiYgbVNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSkgPT0gT0sKLSAgICAgICAgICAgICYmIGZpbmRQcmV2R3JhbnVsZVBvc2l0aW9uKHNpemUsICZsYXN0R3JhbnVsZVBvc2l0aW9uKSA9PSBPSykgewotICAgICAgICAvLyBMZXQncyBhc3N1bWUgaXQncyBjaGVhcCB0byBzZWVrIHRvIHRoZSBlbmQuCi0gICAgICAgIC8vIFRoZSBncmFudWxlIHBvc2l0aW9uIG9mIHRoZSBmaW5hbCBwYWdlIGluIHRoZSBzdHJlYW0gd2lsbAotICAgICAgICAvLyBnaXZlIHVzIHRoZSBleGFjdCBkdXJhdGlvbiBvZiB0aGUgY29udGVudCwgc29tZXRoaW5nIHRoYXQKLSAgICAgICAgLy8gd2UgY2FuIG9ubHkgYXBwcm94aW1hdGUgdXNpbmcgYXZnLiBiaXRyYXRlIGlmIHNlZWtpbmcgdG8KLSAgICAgICAgLy8gdGhlIGVuZCBpcyB0b28gZXhwZW5zaXZlIG9yIGltcG9zc2libGUgKGxpdmUgc3RyZWFtaW5nKS4KLQotICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSBnZXRUaW1lVXNPZkdyYW51bGUobGFzdEdyYW51bGVQb3NpdGlvbik7Ci0KLSAgICAgICAgbU1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7Ci0KLSAgICAgICAgYnVpbGRUYWJsZU9mQ29udGVudHMoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgTXlPZ2dFeHRyYWN0b3I6OmJ1aWxkVGFibGVPZkNvbnRlbnRzKCkgewotICAgIG9mZjY0X3Qgb2Zmc2V0ID0gbUZpcnN0RGF0YU9mZnNldDsKLSAgICBQYWdlIHBhZ2U7Ci0gICAgc3NpemVfdCBwYWdlU2l6ZTsKLSAgICB3aGlsZSAoKHBhZ2VTaXplID0gcmVhZFBhZ2Uob2Zmc2V0LCAmcGFnZSkpID4gMCkgewotICAgICAgICBtVGFibGVPZkNvbnRlbnRzLnB1c2goKTsKLQotICAgICAgICBUT0NFbnRyeSAmZW50cnkgPQotICAgICAgICAgICAgbVRhYmxlT2ZDb250ZW50cy5lZGl0SXRlbUF0KG1UYWJsZU9mQ29udGVudHMuc2l6ZSgpIC0gMSk7Ci0KLSAgICAgICAgZW50cnkubVBhZ2VPZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICAgIGVudHJ5Lm1UaW1lVXMgPSBnZXRUaW1lVXNPZkdyYW51bGUocGFnZS5tR3JhbnVsZVBvc2l0aW9uKTsKLQotICAgICAgICBvZmZzZXQgKz0gKHNpemVfdClwYWdlU2l6ZTsKLSAgICB9Ci0KLSAgICAvLyBMaW1pdCB0aGUgbWF4aW11bSBhbW91bnQgb2YgUkFNIHdlIHNwZW5kIG9uIHRoZSB0YWJsZSBvZiBjb250ZW50cywKLSAgICAvLyBpZiBuZWNlc3NhcnkgdGhpbiBvdXQgdGhlIHRhYmxlIGV2ZW5seSB0byB0cmltIGl0IGRvd24gdG8gbWF4aW11bQotICAgIC8vIHNpemUuCi0KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhUT0NTaXplID0gODE5MjsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhOdW1UT0NFbnRyaWVzID0ga01heFRPQ1NpemUgLyBzaXplb2YoVE9DRW50cnkpOwotCi0gICAgc2l6ZV90IG51bWVyYXRvciA9IG1UYWJsZU9mQ29udGVudHMuc2l6ZSgpOwotCi0gICAgaWYgKG51bWVyYXRvciA+IGtNYXhOdW1UT0NFbnRyaWVzKSB7Ci0gICAgICAgIHNpemVfdCBkZW5vbSA9IG51bWVyYXRvciAtIGtNYXhOdW1UT0NFbnRyaWVzOwotCi0gICAgICAgIHNpemVfdCBhY2N1bSA9IDA7Ci0gICAgICAgIGZvciAoc3NpemVfdCBpID0gbVRhYmxlT2ZDb250ZW50cy5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgewotICAgICAgICAgICAgYWNjdW0gKz0gZGVub207Ci0gICAgICAgICAgICBpZiAoYWNjdW0gPj0gbnVtZXJhdG9yKSB7Ci0gICAgICAgICAgICAgICAgbVRhYmxlT2ZDb250ZW50cy5yZW1vdmVBdChpKTsKLSAgICAgICAgICAgICAgICBhY2N1bSAtPSBudW1lcmF0b3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWludDMyX3QgTXlPZ2dFeHRyYWN0b3I6OmdldFBhY2tldEJsb2NrU2l6ZShNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7Ci0gICAgY29uc3QgdWludDhfdCAqZGF0YSA9Ci0gICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOwotCi0gICAgc2l6ZV90IHNpemUgPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOwotCi0gICAgb2dnX2J1ZmZlciBidWY7Ci0gICAgYnVmLmRhdGEgPSAodWludDhfdCAqKWRhdGE7Ci0gICAgYnVmLnNpemUgPSBzaXplOwotICAgIGJ1Zi5yZWZjb3VudCA9IDE7Ci0gICAgYnVmLnB0ci5vd25lciA9IE5VTEw7Ci0KLSAgICBvZ2dfcmVmZXJlbmNlIHJlZjsKLSAgICByZWYuYnVmZmVyID0gJmJ1ZjsKLSAgICByZWYuYmVnaW4gPSAwOwotICAgIHJlZi5sZW5ndGggPSBzaXplOwotICAgIHJlZi5uZXh0ID0gTlVMTDsKLQotICAgIG9nZ19wYWNrZXQgcGFjazsKLSAgICBwYWNrLnBhY2tldCA9ICZyZWY7Ci0gICAgcGFjay5ieXRlcyA9IHJlZi5sZW5ndGg7Ci0gICAgcGFjay5iX29fcyA9IDA7Ci0gICAgcGFjay5lX29fcyA9IDA7Ci0gICAgcGFjay5ncmFudWxlcG9zID0gMDsKLSAgICBwYWNrLnBhY2tldG5vID0gMDsKLQotICAgIHJldHVybiB2b3JiaXNfcGFja2V0X2Jsb2Nrc2l6ZSgmbVZpLCAmcGFjayk7Ci19Ci0KLWludDY0X3QgTXlPcHVzRXh0cmFjdG9yOjpnZXRUaW1lVXNPZkdyYW51bGUodWludDY0X3QgZ3JhbnVsZVBvcykgY29uc3QgewotICAgIHVpbnQ2NF90IHBjbVNhbXBsZVBvc2l0aW9uID0gMDsKLSAgICBpZiAoZ3JhbnVsZVBvcyA+IG1Db2RlY0RlbGF5KSB7Ci0gICAgICAgIHBjbVNhbXBsZVBvc2l0aW9uID0gZ3JhbnVsZVBvcyAtIG1Db2RlY0RlbGF5OwotICAgIH0KLSAgICBpZiAocGNtU2FtcGxlUG9zaXRpb24gPiBJTlQ2NF9NQVggLyAxMDAwMDAwbGwpIHsKLSAgICAgICAgcmV0dXJuIElOVDY0X01BWDsKLSAgICB9Ci0gICAgcmV0dXJuIHBjbVNhbXBsZVBvc2l0aW9uICogMTAwMDAwMGxsIC8ga09wdXNTYW1wbGVSYXRlOwotfQotCi1zdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlciAqYnVmZmVyLCB1aW50OF90IHR5cGUpIHsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgLy8gdGhlcmUgYXJlIGFjdHVhbGx5IG5vIGhlYWRlciB0eXBlcyBkZWZpbmVkIGluIHRoZSBPcHVzIHNwZWM7IHdlIGNob29zZSAxIGFuZCAzIHRvIG1lYW4KLSAgICAgICAgLy8gaGVhZGVyIGFuZCBjb21tZW50cyBzdWNoIHRoYXQgd2UgY2FuIHNoYXJlIGNvZGUgd2l0aCBNeVZvcmJpc0V4dHJhY3Rvci4KLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgcmV0dXJuIHZlcmlmeU9wdXNIZWFkZXIoYnVmZmVyKTsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgcmV0dXJuIHZlcmlmeU9wdXNDb21tZW50cyhidWZmZXIpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLX0KLQotc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjp2ZXJpZnlPcHVzSGVhZGVyKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKLSAgICBjb25zdCBzaXplX3Qga09wdXNIZWFkZXJTaXplID0gMTk7Ci0gICAgY29uc3QgdWludDhfdCAqZGF0YSA9Ci0gICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOwotCi0gICAgc2l6ZV90IHNpemUgPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOwotCi0gICAgaWYgKHNpemUgPCBrT3B1c0hlYWRlclNpemUKLSAgICAgICAgICAgIHx8IG1lbWNtcChkYXRhLCAiT3B1c0hlYWQiLCA4KQotICAgICAgICAgICAgfHwgLyogdmVyc2lvbiA9ICovIGRhdGFbOF0gIT0gMSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIG1DaGFubmVsQ291bnQgPSBkYXRhWzldOwotICAgIG1Db2RlY0RlbGF5ID0gVTE2TEVfQVQoJmRhdGFbMTBdKTsKLQotICAgIG1NZXRhLT5zZXREYXRhKGtLZXlPcHVzSGVhZGVyLCAwLCBkYXRhLCBzaXplKTsKLSAgICBtTWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIGtPcHVzU2FtcGxlUmF0ZSk7Ci0gICAgbU1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG1DaGFubmVsQ291bnQpOwotICAgIG1NZXRhLT5zZXRJbnQ2NChrS2V5T3B1c1NlZWtQcmVSb2xsIC8qIG5zICovLCBrT3B1c1NlZWtQcmVSb2xsVXMgKiAxMDAwIC8qID0gODAgbXMqLyk7Ci0gICAgbU1ldGEtPnNldEludDY0KGtLZXlPcHVzQ29kZWNEZWxheSAvKiBucyAqLywKLSAgICAgICAgICAgIG1Db2RlY0RlbGF5IC8qIHNhbXBsZS9zICovICogMTAwMDAwMDAwMGxsIC8ga09wdXNTYW1wbGVSYXRlKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjp2ZXJpZnlPcHVzQ29tbWVudHMoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgewotICAgIC8vIGFkZCBhcnRpZmljaWFsIGZyYW1pbmcgYml0IHNvIHdlIGNhbiByZXVzZSBfdm9yYmlzX3VucGFja19jb21tZW50Ci0gICAgaW50MzJfdCBjb21tZW50U2l6ZSA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgKyAxOwotICAgIHNwPEFCdWZmZXI+IGFCdWYgPSBuZXcgQUJ1ZmZlcihjb21tZW50U2l6ZSk7Ci0gICAgaWYgKGFCdWYtPmNhcGFjaXR5KCkgPD0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVpbnQ4X3QqIGNvbW1lbnREYXRhID0gYUJ1Zi0+ZGF0YSgpOwotICAgIG1lbWNweShjb21tZW50RGF0YSwKLSAgICAgICAgICAgICh1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAotICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0KLSAgICBvZ2dfYnVmZmVyIGJ1ZjsKLSAgICBidWYuZGF0YSA9IGNvbW1lbnREYXRhOwotICAgIGJ1Zi5zaXplID0gY29tbWVudFNpemU7Ci0gICAgYnVmLnJlZmNvdW50ID0gMTsKLSAgICBidWYucHRyLm93bmVyID0gTlVMTDsKLQotICAgIG9nZ19yZWZlcmVuY2UgcmVmOwotICAgIHJlZi5idWZmZXIgPSAmYnVmOwotICAgIHJlZi5iZWdpbiA9IDA7Ci0gICAgcmVmLmxlbmd0aCA9IGNvbW1lbnRTaXplOwotICAgIHJlZi5uZXh0ID0gTlVMTDsKLQotICAgIG9nZ3BhY2tfYnVmZmVyIGJpdHM7Ci0gICAgb2dncGFja19yZWFkaW5pdCgmYml0cywgJnJlZik7Ci0KLSAgICAvLyBza2lwICdPcHVzVGFncycKLSAgICBjb25zdCBjaGFyICpPcHVzVGFncyA9ICJPcHVzVGFncyI7Ci0gICAgY29uc3QgaW50MzJfdCBoZWFkZXJMZW4gPSBzdHJsZW4oT3B1c1RhZ3MpOwotICAgIGludDMyX3QgZnJhbWluZ0JpdE9mZnNldCA9IGhlYWRlckxlbjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlckxlbjsgKytpKSB7Ci0gICAgICAgIGNoYXIgY2hyID0gb2dncGFja19yZWFkKCZiaXRzLCA4KTsKLSAgICAgICAgaWYgKGNociAhPSBPcHVzVGFnc1tpXSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludDMyX3QgdmVuZG9yTGVuID0gb2dncGFja19yZWFkKCZiaXRzLCAzMik7Ci0gICAgZnJhbWluZ0JpdE9mZnNldCArPSA0OwotICAgIGlmICh2ZW5kb3JMZW4gPCAwIHx8IHZlbmRvckxlbiA+IGNvbW1lbnRTaXplIC0gOCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICAvLyBza2lwIHZlbmRvciBzdHJpbmcKLSAgICBmcmFtaW5nQml0T2Zmc2V0ICs9IHZlbmRvckxlbjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHZlbmRvckxlbjsgKytpKSB7Ci0gICAgICAgIG9nZ3BhY2tfcmVhZCgmYml0cywgOCk7Ci0gICAgfQotCi0gICAgaW50MzJfdCBuID0gb2dncGFja19yZWFkKCZiaXRzLCAzMik7Ci0gICAgZnJhbWluZ0JpdE9mZnNldCArPSA0OwotICAgIGlmIChuIDwgMCB8fCBuID4gKChjb21tZW50U2l6ZSAtIG9nZ3BhY2tfYnl0ZXMoJmJpdHMpKSA+PiAyKSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewotICAgICAgICBpbnQzMl90IGxlbiA9IG9nZ3BhY2tfcmVhZCgmYml0cywgMzIpOwotICAgICAgICBmcmFtaW5nQml0T2Zmc2V0ICs9IDQ7Ci0gICAgICAgIGlmIChsZW4gIDwgMCB8fCBsZW4gID4gKGNvbW1lbnRTaXplIC0gb2dncGFja19ieXRlcygmYml0cykpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgICAgIGZyYW1pbmdCaXRPZmZzZXQgKz0gbGVuOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbjsgKytqKSB7Ci0gICAgICAgICAgICBvZ2dwYWNrX3JlYWQoJmJpdHMsIDgpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChmcmFtaW5nQml0T2Zmc2V0IDwgMCB8fCBmcmFtaW5nQml0T2Zmc2V0ID49IGNvbW1lbnRTaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotICAgIGNvbW1lbnREYXRhW2ZyYW1pbmdCaXRPZmZzZXRdID0gMTsKLQotICAgIGJ1Zi5kYXRhID0gY29tbWVudERhdGEgKyBoZWFkZXJMZW47Ci0gICAgYnVmLnNpemUgPSBjb21tZW50U2l6ZSAtIGhlYWRlckxlbjsKLSAgICBidWYucmVmY291bnQgPSAxOwotICAgIGJ1Zi5wdHIub3duZXIgPSBOVUxMOwotCi0gICAgcmVmLmJ1ZmZlciA9ICZidWY7Ci0gICAgcmVmLmJlZ2luID0gMDsKLSAgICByZWYubGVuZ3RoID0gY29tbWVudFNpemUgLSBoZWFkZXJMZW47Ci0gICAgcmVmLm5leHQgPSBOVUxMOwotCi0gICAgb2dncGFja19yZWFkaW5pdCgmYml0cywgJnJlZik7Ci0gICAgaW50IGVyciA9IF92b3JiaXNfdW5wYWNrX2NvbW1lbnQoJm1WYywgJmJpdHMpOwotICAgIGlmICgwICE9IGVycikgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHBhcnNlRmlsZU1ldGFEYXRhKCk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6dmVyaWZ5SGVhZGVyKAotICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyLCB1aW50OF90IHR5cGUpIHsKLSAgICBjb25zdCB1aW50OF90ICpkYXRhID0KLSAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7Ci0KLSAgICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7Ci0KLSAgICBpZiAoc2l6ZSA8IDcgfHwgZGF0YVswXSAhPSB0eXBlIHx8IG1lbWNtcCgmZGF0YVsxXSwgInZvcmJpcyIsIDYpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgb2dnX2J1ZmZlciBidWY7Ci0gICAgYnVmLmRhdGEgPSAodWludDhfdCAqKWRhdGE7Ci0gICAgYnVmLnNpemUgPSBzaXplOwotICAgIGJ1Zi5yZWZjb3VudCA9IDE7Ci0gICAgYnVmLnB0ci5vd25lciA9IE5VTEw7Ci0KLSAgICBvZ2dfcmVmZXJlbmNlIHJlZjsKLSAgICByZWYuYnVmZmVyID0gJmJ1ZjsKLSAgICByZWYuYmVnaW4gPSAwOwotICAgIHJlZi5sZW5ndGggPSBzaXplOwotICAgIHJlZi5uZXh0ID0gTlVMTDsKLQotICAgIG9nZ3BhY2tfYnVmZmVyIGJpdHM7Ci0gICAgb2dncGFja19yZWFkaW5pdCgmYml0cywgJnJlZik7Ci0KLSAgICBpZiAob2dncGFja19yZWFkKCZiaXRzLCA4KSAhPSB0eXBlKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgNjsgKytpKSB7Ci0gICAgICAgIG9nZ3BhY2tfcmVhZCgmYml0cywgOCk7ICAvLyBza2lwICd2b3JiaXMnCi0gICAgfQotCi0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKDAgIT0gX3ZvcmJpc191bnBhY2tfaW5mbygmbVZpLCAmYml0cykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtTWV0YS0+c2V0RGF0YShrS2V5Vm9yYmlzSW5mbywgMCwgZGF0YSwgc2l6ZSk7Ci0gICAgICAgICAgICBtTWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1WaS5yYXRlKTsKLSAgICAgICAgICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBtVmkuY2hhbm5lbHMpOwotCi0gICAgICAgICAgICBBTE9HVigibG93ZXItYml0cmF0ZSA9ICVsZCIsIG1WaS5iaXRyYXRlX2xvd2VyKTsKLSAgICAgICAgICAgIEFMT0dWKCJ1cHBlci1iaXRyYXRlID0gJWxkIiwgbVZpLmJpdHJhdGVfdXBwZXIpOwotICAgICAgICAgICAgQUxPR1YoIm5vbWluYWwtYml0cmF0ZSA9ICVsZCIsIG1WaS5iaXRyYXRlX25vbWluYWwpOwotICAgICAgICAgICAgQUxPR1YoIndpbmRvdy1iaXRyYXRlID0gJWxkIiwgbVZpLmJpdHJhdGVfd2luZG93KTsKLSAgICAgICAgICAgIEFMT0dWKCJibG9ja3NpemVzOiAlZC8lZCIsCi0gICAgICAgICAgICAgICAgICAgIHZvcmJpc19pbmZvX2Jsb2Nrc2l6ZSgmbVZpLCAwKSwKLSAgICAgICAgICAgICAgICAgICAgdm9yYmlzX2luZm9fYmxvY2tzaXplKCZtVmksIDEpCi0gICAgICAgICAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgIG9mZjY0X3Qgc2l6ZTsKLSAgICAgICAgICAgIGlmIChtU291cmNlLT5nZXRTaXplKCZzaXplKSA9PSBPSykgewotICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJwcyA9IGFwcHJveEJpdHJhdGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoYnBzICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbU1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgc2l6ZSAqIDgwMDAwMDBsbCAvIGJwcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIDM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgwICE9IF92b3JiaXNfdW5wYWNrX2NvbW1lbnQoJm1WYywgJmJpdHMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcGFyc2VGaWxlTWV0YURhdGEoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSA1OgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoMCAhPSBfdm9yYmlzX3VucGFja19ib29rcygmbVZpLCAmYml0cykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtTWV0YS0+c2V0RGF0YShrS2V5Vm9yYmlzQm9va3MsIDAsIGRhdGEsIHNpemUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXVpbnQ2NF90IE15Vm9yYmlzRXh0cmFjdG9yOjphcHByb3hCaXRyYXRlKCkgY29uc3QgewotICAgIGlmIChtVmkuYml0cmF0ZV9ub21pbmFsICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1WaS5iaXRyYXRlX25vbWluYWw7Ci0gICAgfQotCi0gICAgcmV0dXJuIChtVmkuYml0cmF0ZV9sb3dlciArIG1WaS5iaXRyYXRlX3VwcGVyKSAvIDI7Ci19Ci0KLXZvaWQgTXlPZ2dFeHRyYWN0b3I6OnBhcnNlRmlsZU1ldGFEYXRhKCkgewotICAgIG1GaWxlTWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBtRmlsZU1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfT0dHKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVZjLmNvbW1lbnRzOyArK2kpIHsKLSAgICAgICAgY29uc3QgY2hhciAqY29tbWVudCA9IG1WYy51c2VyX2NvbW1lbnRzW2ldOwotICAgICAgICBzaXplX3QgY29tbWVudExlbmd0aCA9IG1WYy5jb21tZW50X2xlbmd0aHNbaV07Ci0gICAgICAgIHBhcnNlVm9yYmlzQ29tbWVudChtRmlsZU1ldGEsIGNvbW1lbnQsIGNvbW1lbnRMZW5ndGgpOwotICAgICAgICAvL0FMT0dJKCJjb21tZW50ICMlZDogJyVzJyIsIGkgKyAxLCBtVmMudXNlcl9jb21tZW50c1tpXSk7Ci0gICAgfQotfQotCi12b2lkIHBhcnNlVm9yYmlzQ29tbWVudCgKLSAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZmaWxlTWV0YSwgY29uc3QgY2hhciAqY29tbWVudCwgc2l6ZV90IGNvbW1lbnRMZW5ndGgpCi17Ci0gICAgc3RydWN0IHsKLSAgICAgICAgY29uc3QgY2hhciAqY29uc3QgbVRhZzsKLSAgICAgICAgdWludDMyX3QgbUtleTsKLSAgICB9IGtNYXBbXSA9IHsKLSAgICAgICAgeyAiVElUTEUiLCBrS2V5VGl0bGUgfSwKLSAgICAgICAgeyAiQVJUSVNUIiwga0tleUFydGlzdCB9LAotICAgICAgICB7ICJBTEJVTUFSVElTVCIsIGtLZXlBbGJ1bUFydGlzdCB9LAotICAgICAgICB7ICJBTEJVTSBBUlRJU1QiLCBrS2V5QWxidW1BcnRpc3QgfSwKLSAgICAgICAgeyAiQ09NUElMQVRJT04iLCBrS2V5Q29tcGlsYXRpb24gfSwKLSAgICAgICAgeyAiQUxCVU0iLCBrS2V5QWxidW0gfSwKLSAgICAgICAgeyAiQ09NUE9TRVIiLCBrS2V5Q29tcG9zZXIgfSwKLSAgICAgICAgeyAiR0VOUkUiLCBrS2V5R2VucmUgfSwKLSAgICAgICAgeyAiQVVUSE9SIiwga0tleUF1dGhvciB9LAotICAgICAgICB7ICJUUkFDS05VTUJFUiIsIGtLZXlDRFRyYWNrTnVtYmVyIH0sCi0gICAgICAgIHsgIkRJU0NOVU1CRVIiLCBrS2V5RGlzY051bWJlciB9LAotICAgICAgICB7ICJEQVRFIiwga0tleURhdGUgfSwKLSAgICAgICAgeyAiWUVBUiIsIGtLZXlZZWFyIH0sCi0gICAgICAgIHsgIkxZUklDSVNUIiwga0tleVdyaXRlciB9LAotICAgICAgICB7ICJNRVRBREFUQV9CTE9DS19QSUNUVVJFIiwga0tleUFsYnVtQXJ0IH0sCi0gICAgICAgIHsgIkFORFJPSURfTE9PUCIsIGtLZXlBdXRvTG9vcCB9LAotICAgIH07Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzaXplb2Yoa01hcCkgLyBzaXplb2Yoa01hcFswXSk7ICsraikgewotICAgICAgICAgICAgc2l6ZV90IHRhZ0xlbiA9IHN0cmxlbihrTWFwW2pdLm1UYWcpOwotICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChrTWFwW2pdLm1UYWcsIGNvbW1lbnQsIHRhZ0xlbikKLSAgICAgICAgICAgICAgICAgICAgJiYgY29tbWVudFt0YWdMZW5dID09ICc9JykgewotICAgICAgICAgICAgICAgIGlmIChrTWFwW2pdLm1LZXkgPT0ga0tleUFsYnVtQXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4dHJhY3RBbGJ1bUFydCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTWV0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tbWVudFt0YWdMZW4gKyAxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50TGVuZ3RoIC0gdGFnTGVuIC0gMSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrTWFwW2pdLm1LZXkgPT0ga0tleUF1dG9Mb29wKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcCgmY29tbWVudFt0YWdMZW4gKyAxXSwgInRydWUiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU1ldGEtPnNldEludDMyKGtLZXlBdXRvTG9vcCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmaWxlTWV0YS0+c2V0Q1N0cmluZyhrTWFwW2pdLm1LZXksICZjb21tZW50W3RhZ0xlbiArIDFdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotfQotCi1zdGF0aWMgdm9pZCBleHRyYWN0QWxidW1BcnQoCi0gICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZmlsZU1ldGEsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgQUxPR1YoImV4dHJhY3RBbGJ1bUFydCBmcm9tICclcyciLCAoY29uc3QgY2hhciAqKWRhdGEpOwotCi0gICAgc3A8QUJ1ZmZlcj4gZmxhY0J1ZmZlciA9IGRlY29kZUJhc2U2NChBU3RyaW5nKChjb25zdCBjaGFyICopZGF0YSwgc2l6ZSkpOwotICAgIGlmIChmbGFjQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIm1hbGZvcm1lZCBiYXNlNjQgZW5jb2RlZCBkYXRhLiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc2l6ZV90IGZsYWNTaXplID0gZmxhY0J1ZmZlci0+c2l6ZSgpOwotICAgIHVpbnQ4X3QgKmZsYWMgPSBmbGFjQnVmZmVyLT5kYXRhKCk7Ci0gICAgQUxPR1YoImdvdCBmbGFjIG9mIHNpemUgJXp1IiwgZmxhY1NpemUpOwotCi0gICAgdWludDMyX3QgcGljVHlwZTsKLSAgICB1aW50MzJfdCB0eXBlTGVuOwotICAgIHVpbnQzMl90IGRlc2NMZW47Ci0gICAgdWludDMyX3QgZGF0YUxlbjsKLSAgICBjaGFyIHR5cGVbMTI4XTsKLQotICAgIGlmIChmbGFjU2l6ZSA8IDgpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHBpY1R5cGUgPSBVMzJfQVQoZmxhYyk7Ci0KLSAgICBpZiAocGljVHlwZSAhPSAzKSB7Ci0gICAgICAgIC8vIFRoaXMgaXMgbm90IGEgZnJvbnQgY292ZXIuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB0eXBlTGVuID0gVTMyX0FUKCZmbGFjWzRdKTsKLSAgICBpZiAodHlwZUxlbiA+IHNpemVvZih0eXBlKSAtIDEpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCBhYm92ZSB0aGF0IGZsYWNTaXplID49IDgKLSAgICBpZiAoZmxhY1NpemUgLSA4IDwgdHlwZUxlbikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbWVtY3B5KHR5cGUsICZmbGFjWzhdLCB0eXBlTGVuKTsKLSAgICB0eXBlW3R5cGVMZW5dID0gJ1wwJzsKLQotICAgIEFMT0dWKCJwaWNUeXBlID0gJWQsIHR5cGUgPSAnJXMnIiwgcGljVHlwZSwgdHlwZSk7Ci0KLSAgICBpZiAoIXN0cmNtcCh0eXBlLCAiLS0+IikpIHsKLSAgICAgICAgLy8gVGhpcyBpcyBub3QgaW5saW5lIGNvdmVyIGFydCwgYnV0IGFuIGV4dGVybmFsIHVybCBpbnN0ZWFkLgotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGZsYWNTaXplIDwgMzIgfHwgZmxhY1NpemUgLSAzMiA8IHR5cGVMZW4pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGRlc2NMZW4gPSBVMzJfQVQoJmZsYWNbOCArIHR5cGVMZW5dKTsKLSAgICBpZiAoZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gPCBkZXNjTGVuKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBkYXRhTGVuID0gVTMyX0FUKCZmbGFjWzggKyB0eXBlTGVuICsgNCArIGRlc2NMZW4gKyAxNl0pOwotCi0gICAgLy8gd2UndmUgYWxyZWFkeSBjaGVja2VkIGFib3ZlIHRoYXQgKGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIC0gZGVzY0xlbikgPj0gMAotICAgIGlmIChmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiAtIGRlc2NMZW4gPCBkYXRhTGVuKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBTE9HVigiZ290IGltYWdlIGRhdGEsICV6dSB0cmFpbGluZyBieXRlcyIsCi0gICAgICAgICBmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiAtIGRlc2NMZW4gLSBkYXRhTGVuKTsKLQotICAgIGZpbGVNZXRhLT5zZXREYXRhKAotICAgICAgICAgICAga0tleUFsYnVtQXJ0LCAwLCAmZmxhY1s4ICsgdHlwZUxlbiArIDQgKyBkZXNjTGVuICsgMjBdLCBkYXRhTGVuKTsKLQotICAgIGZpbGVNZXRhLT5zZXRDU3RyaW5nKGtLZXlBbGJ1bUFydE1JTUUsIHR5cGUpOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1PZ2dFeHRyYWN0b3I6Ok9nZ0V4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKQotICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKLSAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCi0gICAgICBtSW1wbChOVUxMKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKLSAgICAgICAgaWYgKG1JbXBsICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBtSW1wbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaSA9PSAwKSB7Ci0gICAgICAgICAgICBtSW1wbCA9IG5ldyBNeVZvcmJpc0V4dHJhY3RvcihtRGF0YVNvdXJjZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtSW1wbCA9IG5ldyBNeU9wdXNFeHRyYWN0b3IobURhdGFTb3VyY2UpOwotICAgICAgICB9Ci0gICAgICAgIG1Jbml0Q2hlY2sgPSBtSW1wbC0+c2Vla1RvT2Zmc2V0KDApOwotCi0gICAgICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7Ci0gICAgICAgICAgICBtSW5pdENoZWNrID0gbUltcGwtPmluaXQoKTsKLSAgICAgICAgICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLU9nZ0V4dHJhY3Rvcjo6fk9nZ0V4dHJhY3RvcigpIHsKLSAgICBkZWxldGUgbUltcGw7Ci0gICAgbUltcGwgPSBOVUxMOwotfQotCi1zaXplX3QgT2dnRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKLSAgICByZXR1cm4gbUluaXRDaGVjayAhPSBPSyA/IDAgOiAxOwotfQotCi1zcDxJTWVkaWFTb3VyY2U+IE9nZ0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7Ci0gICAgaWYgKGluZGV4ID49IDEpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ldyBPZ2dTb3VyY2UodGhpcyk7Ci19Ci0KLXNwPE1ldGFEYXRhPiBPZ2dFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKLSAgICBpZiAoaW5kZXggPj0gMSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbUltcGwtPmdldEZvcm1hdCgpOwotfQotCi1zcDxNZXRhRGF0YT4gT2dnRXh0cmFjdG9yOjpnZXRNZXRhRGF0YSgpIHsKLSAgICByZXR1cm4gbUltcGwtPmdldEZpbGVNZXRhRGF0YSgpOwotfQotCi1ib29sIFNuaWZmT2dnKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsCi0gICAgICAgIHNwPEFNZXNzYWdlPiAqKSB7Ci0gICAgY2hhciB0bXBbNF07Ci0gICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIHRtcCwgNCkgPCA0IHx8IG1lbWNtcCh0bXAsICJPZ2dTIiwgNCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIG1pbWVUeXBlLT5zZXRUbyhNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfT0dHKTsKLSAgICAqY29uZmlkZW5jZSA9IDAuMmY7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmNwcAppbmRleCA4NzE3YTc5Li45NmI4OTZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuY3BwCkBAIC0yNCw4ICsyNCw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIAotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmg+CiAKQEAgLTM0LDEwICszMyw5IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXhOb2RlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9JT01YU3RvcmUuaD4KICNpbmNsdWRlIDxtZWRpYS9JT01YLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvb214LzEuMC9XT214Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfSW5kZXguaD4KICNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9JbmRleEV4dC5oPgpAQCAtNDgsMTAgKzQ2LDE4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOworCiBuYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CiAKK2Jvb2wgaGFzUHJlZml4KGNvbnN0IGhpZGxfc3RyaW5nJiBzLCBjb25zdCBjaGFyKiBwcmVmaXgpIHsKKyAgICByZXR1cm4gc3RybmNtcChzLmNfc3RyKCksIHByZWZpeCwgc3RybGVuKHByZWZpeCkpID09IDA7Cit9CisKIHN0YXR1c190IHF1ZXJ5Q2FwYWJpbGl0aWVzKAotICAgICAgICBjb25zdCBJT01YU3RvcmU6Ok5vZGVJbmZvJiBub2RlLCBjb25zdCBjaGFyKiBtaW1lLCBib29sIGlzRW5jb2RlciwKKyAgICAgICAgY29uc3QgSU9teFN0b3JlOjpOb2RlSW5mbyYgbm9kZSwgY29uc3QgY2hhciogbWltZSwgYm9vbCBpc0VuY29kZXIsCiAgICAgICAgIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXIqIGNhcHMpIHsKICAgICBzcDxBQ29kZWM+IGNvZGVjID0gbmV3IEFDb2RlYygpOwogICAgIHN0YXR1c190IGVyciA9IGNvZGVjLT5xdWVyeUNhcGFiaWxpdGllcygKQEAgLTYyLDE0ICs2OCwxMyBAQAogICAgIGZvciAoY29uc3QgYXV0byYgYXR0cmlidXRlIDogbm9kZS5hdHRyaWJ1dGVzKSB7CiAgICAgICAgIC8vIEFsbCBmZWF0dXJlcyBoYXZlIGFuIGludDMyIHZhbHVlIGV4Y2VwdAogICAgICAgICAvLyAiZmVhdHVyZS1iaXRyYXRlLW1vZGVzIiwgd2hpY2ggaGFzIGEgc3RyaW5nIHZhbHVlLgotICAgICAgICBpZiAoKGF0dHJpYnV0ZS5rZXkuY29tcGFyZSgwLCA4LCAiZmVhdHVyZS0iKSA9PSAwKSAmJgotICAgICAgICAgICAgICAgIChhdHRyaWJ1dGUua2V5LmNvbXBhcmUoOCwgMTUsICJiaXRyYXRlLW1vZGVzIikKLSAgICAgICAgICAgICAgICAgIT0gMCkpIHsKLSAgICAgICAgICAgIC8vIElmIHRoaXMgYXR0cmlidXRlLmtleSBpcyBhIGZlYXR1cmUgdGhhdCBpcyBub3QgYSBiaXRyYXRlCi0gICAgICAgICAgICAvLyBjb250cm9sLCBhZGQgYW4gaW50MzIgdmFsdWUuCisgICAgICAgIGlmIChoYXNQcmVmaXgoYXR0cmlidXRlLmtleSwgImZlYXR1cmUtIikgJiYKKyAgICAgICAgICAgICAgICAhaGFzUHJlZml4KGF0dHJpYnV0ZS5rZXksICJmZWF0dXJlLWJpdHJhdGUtbW9kZXMiKSkgeworICAgICAgICAgICAgLy8gSWYgdGhpcyBhdHRyaWJ1dGUua2V5IGlzIGEgZmVhdHVyZSB0aGF0IGlzIG5vdCBiaXRyYXRlIG1vZGVzLAorICAgICAgICAgICAgLy8gYWRkIGFuIGludDMyIHZhbHVlLgogICAgICAgICAgICAgY2Fwcy0+YWRkRGV0YWlsKAogICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUua2V5LmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS52YWx1ZSA9PSAiMSIgPyAxIDogMCk7CisgICAgICAgICAgICAgICAgICAgIGhhc1ByZWZpeChhdHRyaWJ1dGUudmFsdWUsICIxIikgPyAxIDogMCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBOb24tZmVhdHVyZSBhdHRyaWJ1dGVzCiAgICAgICAgICAgICBjYXBzLT5hZGREZXRhaWwoCkBAIC04NSwxNTUgKzkwLDY5IEBACiB9CiAKIHN0YXR1c190IE9teEluZm9CdWlsZGVyOjpidWlsZE1lZGlhQ29kZWNMaXN0KE1lZGlhQ29kZWNMaXN0V3JpdGVyKiB3cml0ZXIpIHsKLSAgICBib29sIHRyZWJsZTsKLSAgICBzcDxJT01YPiBvbXg7Ci0gICAgc3RkOjp2ZWN0b3I8SU9NWFN0b3JlOjpSb2xlSW5mbz4gcm9sZXM7CisgICAgLy8gT2J0YWluIElPbXhTdG9yZQorICAgIHNwPElPbXhTdG9yZT4gb214U3RvcmUgPSBJT214U3RvcmU6OmdldFNlcnZpY2UoKTsKKyAgICBpZiAob214U3RvcmUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGZpbmQgYW4gSU9teFN0b3JlIHNlcnZpY2UuIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KIAotICAgIHRyZWJsZSA9IHByb3BlcnR5X2dldF9ib29sKCJwZXJzaXN0Lm1lZGlhLnRyZWJsZV9vbXgiLCB0cnVlKTsKLSAgICBpZiAodHJlYmxlKSB7Ci0gICAgICAgIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOwotICAgICAgICB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLSAgICAgICAgdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CisgICAgLy8gTGlzdCBzZXJ2aWNlIGF0dHJpYnV0ZXMgKGdsb2JhbCBzZXR0aW5ncykKKyAgICBTdGF0dXMgc3RhdHVzOworICAgIGhpZGxfdmVjPElPbXhTdG9yZTo6Um9sZUluZm8+IHJvbGVzOworICAgIGF1dG8gdHJhbnNTdGF0dXMgPSBvbXhTdG9yZS0+bGlzdFJvbGVzKAorICAgICAgICAgICAgWyZyb2xlc10gKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8SU9teFN0b3JlOjpSb2xlSW5mbz4mIGluUm9sZUxpc3QpIHsKKyAgICAgICAgICAgICAgICByb2xlcyA9IGluUm9sZUxpc3Q7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiRmFpbCB0byBvYnRhaW4gY29kZWMgcm9sZXMgZnJvbSBJT214U3RvcmUuIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KIAotICAgICAgICAvLyBPYnRhaW4gSU9teFN0b3JlCi0gICAgICAgIHNwPElPbXhTdG9yZT4gb214U3RvcmUgPSBJT214U3RvcmU6OmdldFNlcnZpY2UoKTsKLSAgICAgICAgaWYgKG9teFN0b3JlID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgY29ubmVjdCB0byBhbiBJT214U3RvcmUgaW5zdGFuY2UuIik7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIExpc3Qgc2VydmljZSBhdHRyaWJ1dGVzIChnbG9iYWwgc2V0dGluZ3MpCi0gICAgICAgIFN0YXR1cyBzdGF0dXM7Ci0gICAgICAgIGhpZGxfdmVjPElPbXhTdG9yZTo6U2VydmljZUF0dHJpYnV0ZT4gc2VydmljZUF0dHJpYnV0ZXM7Ci0gICAgICAgIGF1dG8gdHJhbnNTdGF0dXMgPSBvbXhTdG9yZS0+bGlzdFNlcnZpY2VBdHRyaWJ1dGVzKAotICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmc2VydmljZUF0dHJpYnV0ZXNdCi0gICAgICAgICAgICAgICAgKFN0YXR1cyBpblN0YXR1cywgY29uc3QgaGlkbF92ZWM8SU9teFN0b3JlOjpTZXJ2aWNlQXR0cmlidXRlPiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGluQXR0cmlidXRlcykgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBpblN0YXR1czsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZUF0dHJpYnV0ZXMgPSBpbkF0dHJpYnV0ZXM7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbCB0byBvYnRhaW4gZ2xvYmFsIHNldHRpbmdzIGZyb20gSU9teFN0b3JlLiIpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiSU9teFN0b3JlIHJlcG9ydHMgcGFyc2luZyBlcnJvci4iKTsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byYgcCA6IHNlcnZpY2VBdHRyaWJ1dGVzKSB7Ci0gICAgICAgICAgICB3cml0ZXItPmFkZEdsb2JhbFNldHRpbmcoCi0gICAgICAgICAgICAgICAgICAgIHAua2V5LmNfc3RyKCksIHAudmFsdWUuY19zdHIoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBMaXN0IHJvbGVzIGFuZCBjb252ZXJ0IHRvIElPTVhTdG9yZSdzIGZvcm1hdAotICAgICAgICB0cmFuc1N0YXR1cyA9IG9teFN0b3JlLT5saXN0Um9sZXMoCi0gICAgICAgICAgICAgICAgWyZyb2xlc10KLSAgICAgICAgICAgICAgICAoY29uc3QgaGlkbF92ZWM8SU9teFN0b3JlOjpSb2xlSW5mbz4mIGluUm9sZUxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgcm9sZXMucmVzZXJ2ZShpblJvbGVMaXN0LnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgaW5Sb2xlIDogaW5Sb2xlTGlzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgSU9NWFN0b3JlOjpSb2xlSW5mbyByb2xlOwotICAgICAgICAgICAgICAgICAgICAgICAgcm9sZS5yb2xlID0gaW5Sb2xlLnJvbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICByb2xlLnR5cGUgPSBpblJvbGUudHlwZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvbGUuaXNFbmNvZGVyID0gaW5Sb2xlLmlzRW5jb2RlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvbGUucHJlZmVyUGxhdGZvcm1Ob2RlcyA9IGluUm9sZS5wcmVmZXJQbGF0Zm9ybU5vZGVzOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8SU9NWFN0b3JlOjpOb2RlSW5mbz4mIG5vZGVzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZS5ub2RlczsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzLnJlc2VydmUoaW5Sb2xlLm5vZGVzLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGluTm9kZSA6IGluUm9sZS5ub2RlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPTVhTdG9yZTo6Tm9kZUluZm8gbm9kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLm5hbWUgPSBpbk5vZGUubmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLm93bmVyID0gaW5Ob2RlLm93bmVyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPElPTVhTdG9yZTo6QXR0cmlidXRlPiYgYXR0cmlidXRlcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmF0dHJpYnV0ZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5yZXNlcnZlKGluTm9kZS5hdHRyaWJ1dGVzLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpbkF0dHIgOiBpbk5vZGUuYXR0cmlidXRlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT01YU3RvcmU6OkF0dHJpYnV0ZSBhdHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmtleSA9IGluQXR0ci5rZXk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIudmFsdWUgPSBpbkF0dHIudmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMucHVzaF9iYWNrKHN0ZDo6bW92ZShhdHRyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzLnB1c2hfYmFjayhzdGQ6Om1vdmUobm9kZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcm9sZXMucHVzaF9iYWNrKHN0ZDo6bW92ZShyb2xlKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsIHRvIG9idGFpbiBjb2RlYyByb2xlcyBmcm9tIElPbXhTdG9yZS4iKTsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gT2J0YWluIElPTVhTdG9yZQotICAgICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7Ci0gICAgICAgIGlmIChzbSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ2Fubm90IG9idGFpbiB0aGUgZGVmYXVsdCBzZXJ2aWNlIG1hbmFnZXIuIik7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotICAgICAgICBzcDxJQmluZGVyPiBjb2RlY0JpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5jb2RlYyIpKTsKLSAgICAgICAgaWYgKGNvZGVjQmluZGVyID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIEFMT0dFKCJDYW5ub3Qgb2J0YWluIHRoZSBtZWRpYSBjb2RlYyBzZXJ2aWNlLiIpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIH0KLSAgICAgICAgc3A8SU1lZGlhQ29kZWNTZXJ2aWNlPiBjb2RlY1NlcnZpY2UgPQotICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElNZWRpYUNvZGVjU2VydmljZT4oY29kZWNCaW5kZXIpOwotICAgICAgICBpZiAoY29kZWNTZXJ2aWNlID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIEFMT0dFKCJXcm9uZyB0eXBlIG9mIG1lZGlhIGNvZGVjIHNlcnZpY2Ugb2J0YWluZWQuIik7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotICAgICAgICBvbXggPSBjb2RlY1NlcnZpY2UtPmdldE9NWCgpOwotICAgICAgICBpZiAob214ID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgY29ubmVjdCB0byBhbiBJT01YIGluc3RhbmNlLiIpOwotICAgICAgICB9Ci0gICAgICAgIHNwPElPTVhTdG9yZT4gb214U3RvcmUgPSBjb2RlY1NlcnZpY2UtPmdldE9NWFN0b3JlKCk7Ci0gICAgICAgIGlmIChvbXhTdG9yZSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ2Fubm90IGNvbm5lY3QgdG8gYW4gSU9NWFN0b3JlIGluc3RhbmNlLiIpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBMaXN0IHNlcnZpY2UgYXR0cmlidXRlcyAoZ2xvYmFsIHNldHRpbmdzKQotICAgICAgICBzdGQ6OnZlY3RvcjxJT01YU3RvcmU6OkF0dHJpYnV0ZT4gc2VydmljZUF0dHJpYnV0ZXM7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG9teFN0b3JlLT5saXN0U2VydmljZUF0dHJpYnV0ZXMoJnNlcnZpY2VBdHRyaWJ1dGVzKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIkZhaWwgdG8gb2J0YWluIGdsb2JhbCBzZXR0aW5ncyBmcm9tIElPTVhTdG9yZS4iKTsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byYgcCA6IHNlcnZpY2VBdHRyaWJ1dGVzKSB7Ci0gICAgICAgICAgICB3cml0ZXItPmFkZEdsb2JhbFNldHRpbmcoCi0gICAgICAgICAgICAgICAgICAgIHAua2V5LmNfc3RyKCksIHAudmFsdWUuY19zdHIoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBMaXN0IHJvbGVzCi0gICAgICAgIHN0YXR1cyA9IG9teFN0b3JlLT5saXN0Um9sZXMoJnJvbGVzKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIkZhaWwgdG8gb2J0YWluIGNvZGVjIHJvbGVzIGZyb20gSU9NWFN0b3JlLiIpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIH0KKyAgICBoaWRsX3ZlYzxJT214U3RvcmU6OlNlcnZpY2VBdHRyaWJ1dGU+IHNlcnZpY2VBdHRyaWJ1dGVzOworICAgIHRyYW5zU3RhdHVzID0gb214U3RvcmUtPmxpc3RTZXJ2aWNlQXR0cmlidXRlcygKKyAgICAgICAgICAgIFsmc3RhdHVzLCAmc2VydmljZUF0dHJpYnV0ZXNdICgKKyAgICAgICAgICAgIFN0YXR1cyBpblN0YXR1cywKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPElPbXhTdG9yZTo6U2VydmljZUF0dHJpYnV0ZT4mIGluQXR0cmlidXRlcykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGluU3RhdHVzOworICAgICAgICAgICAgICAgIHNlcnZpY2VBdHRyaWJ1dGVzID0gaW5BdHRyaWJ1dGVzOworICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWwgdG8gb2J0YWluIGdsb2JhbCBzZXR0aW5ncyBmcm9tIElPbXhTdG9yZS4iKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICBBTE9HRSgiSU9teFN0b3JlIHJlcG9ydHMgcGFyc2luZyBlcnJvci4iKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYgcCA6IHNlcnZpY2VBdHRyaWJ1dGVzKSB7CisgICAgICAgIHdyaXRlci0+YWRkR2xvYmFsU2V0dGluZygKKyAgICAgICAgICAgICAgICBwLmtleS5jX3N0cigpLCBwLnZhbHVlLmNfc3RyKCkpOwogICAgIH0KIAogICAgIC8vIENvbnZlcnQgcm9sZXMgdG8gbGlzdHMgb2YgY29kZWNzCiAKLSAgICAvLyBjb2RlYyBuYW1lIC0+IGluZGV4IGludG8gc3dDb2RlY3MKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvV3JpdGVyPiA+Ci0gICAgICAgICAgICBzd0NvZGVjTmFtZTJJbmZvOwotICAgIC8vIGNvZGVjIG5hbWUgLT4gaW5kZXggaW50byBod0NvZGVjcwotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+ID4KLSAgICAgICAgICAgIGh3Q29kZWNOYW1lMkluZm87Ci0gICAgLy8gb3duZXIgbmFtZSAtPiBNZWRpYUNvZGVjSW5mbwotICAgIC8vIFRoaXMgbWFwIHdpbGwgYmUgdXNlZCB0byBvYnRhaW4gdGhlIGNvcnJlY3QgSU9teCBzZXJ2aWNlKHMpIG5lZWRlZCBmb3IKLSAgICAvLyBjcmVhdGluZyBJT214Tm9kZSBpbnN0YW5jZXMgYW5kIHF1ZXJ5aW5nIGNhcGFiaWxpdGllcy4KLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+ID4gPgotICAgICAgICAgICAgb3duZXIyQ29kZWNJbmZvOworICAgIC8vIGNvZGVjIG5hbWUgLT4gaW5kZXggaW50byBzd0NvZGVjcy9od0NvZGVjcworICAgIHN0ZDo6bWFwPGhpZGxfc3RyaW5nLCBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+PgorICAgICAgICAgICAgc3dDb2RlY05hbWUySW5mbywgaHdDb2RlY05hbWUySW5mbzsKIAotICAgIGZvciAoY29uc3QgYXV0byYgcm9sZSA6IHJvbGVzKSB7Ci0gICAgICAgIGNvbnN0IGF1dG8mIHR5cGVOYW1lID0gcm9sZS50eXBlOworICAgIGNoYXIgcmFua1tQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIHVpbnQzMl90IGRlZmF1bHRSYW5rID0gMHgxMDA7CisgICAgaWYgKHByb3BlcnR5X2dldCgiZGVidWcuc3RhZ2VmcmlnaHQub214X2RlZmF1bHRfcmFuayIsIHJhbmssIG51bGxwdHIpKSB7CisgICAgICAgIGRlZmF1bHRSYW5rID0gc3RkOjpzdHJ0b3VsKHJhbmssIG51bGxwdHIsIDEwKTsKKyAgICB9CisgICAgZm9yIChjb25zdCBJT214U3RvcmU6OlJvbGVJbmZvJiByb2xlIDogcm9sZXMpIHsKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIHR5cGVOYW1lID0gcm9sZS50eXBlOwogICAgICAgICBib29sIGlzRW5jb2RlciA9IHJvbGUuaXNFbmNvZGVyOwogICAgICAgICBib29sIHByZWZlclBsYXRmb3JtTm9kZXMgPSByb2xlLnByZWZlclBsYXRmb3JtTm9kZXM7CiAgICAgICAgIC8vIElmIHByZWZlclBsYXRmb3JtTm9kZXMgaXMgdHJ1ZSwgaGFyZHdhcmUgbm9kZXMgbXVzdCBiZSBhZGRlZCBhZnRlcgogICAgICAgICAvLyBwbGF0Zm9ybSAoc29mdHdhcmUpIG5vZGVzLiBod0NvZGVjcyBpcyB1c2VkIHRvIGhvbGQgaGFyZHdhcmUgbm9kZXMKICAgICAgICAgLy8gdGhhdCBuZWVkIHRvIGJlIGFkZGVkIGFmdGVyIHNvZnR3YXJlIG5vZGVzIGZvciB0aGUgc2FtZSByb2xlLgotICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBJT01YU3RvcmU6Ok5vZGVJbmZvKj4gaHdDb2RlY3M7Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byYgbm9kZSA6IHJvbGUubm9kZXMpIHsKLSAgICAgICAgICAgIGNvbnN0IGF1dG8mIG5vZGVOYW1lID0gbm9kZS5uYW1lOwotICAgICAgICAgICAgYm9vbCBpc1NvZnR3YXJlID0gbm9kZU5hbWUuY29tcGFyZSgwLCAxMCwgIk9NWC5nb29nbGUiKSA9PSAwOworICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBJT214U3RvcmU6Ok5vZGVJbmZvKj4gaHdDb2RlY3M7CisgICAgICAgIGZvciAoY29uc3QgSU9teFN0b3JlOjpOb2RlSW5mbyYgbm9kZSA6IHJvbGUubm9kZXMpIHsKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBub2RlTmFtZSA9IG5vZGUubmFtZTsKKyAgICAgICAgICAgIGJvb2wgaXNTb2Z0d2FyZSA9IGhhc1ByZWZpeChub2RlTmFtZSwgIk9NWC5nb29nbGUiKTsKICAgICAgICAgICAgIE1lZGlhQ29kZWNJbmZvV3JpdGVyKiBpbmZvOwogICAgICAgICAgICAgaWYgKGlzU29mdHdhcmUpIHsKICAgICAgICAgICAgICAgICBhdXRvIGMyaSA9IHN3Q29kZWNOYW1lMkluZm8uZmluZChub2RlTmFtZSk7CkBAIC0yNDUsNiArMTY0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0TmFtZShub2RlTmFtZS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0T3duZXIobm9kZS5vd25lci5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0RW5jb2Rlcihpc0VuY29kZXIpOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXRSYW5rKGRlZmF1bHRSYW5rKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbm9kZSBoYXMgYmVlbiBzZWVuIGJlZm9yZS4gU2ltcGx5IHJldHJpZXZlIHRoZQogICAgICAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBNZWRpYUNvZGVjSW5mb1dyaXRlci4KQEAgLTI2MSw2ICsxODEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0TmFtZShub2RlTmFtZS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNldE93bmVyKG5vZGUub3duZXIuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXRFbmNvZGVyKGlzRW5jb2Rlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXRSYW5rKGRlZmF1bHRSYW5rKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHByZWZlclBsYXRmb3JtTm9kZXMgaXMgdHJ1ZSwgdGhpcyBub2RlIG11c3QgYmUKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZGVkIGFmdGVyIGFsbCBzb2Z0d2FyZSBub2Rlcy4KQEAgLTI4Nyw5ICsyMDgsOSBAQAogICAgICAgICAvLyBhZGRlZCBpbiB0aGUgbG9vcCBhYm92ZSwgYnV0IHJhdGhlciBzYXZlZCBpbiBod0NvZGVjcy4gVGhleSBhcmUKICAgICAgICAgLy8gZ29pbmcgdG8gYmUgYWRkZWQgaGVyZS4KICAgICAgICAgaWYgKHByZWZlclBsYXRmb3JtTm9kZXMpIHsKLSAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgbm9kZSA6IGh3Q29kZWNzKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IElPbXhTdG9yZTo6Tm9kZUluZm8gKm5vZGUgOiBod0NvZGVjcykgewogICAgICAgICAgICAgICAgIE1lZGlhQ29kZWNJbmZvV3JpdGVyKiBpbmZvOwotICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8mIG5vZGVOYW1lID0gbm9kZS0+bmFtZTsKKyAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbm9kZU5hbWUgPSBub2RlLT5uYW1lOwogICAgICAgICAgICAgICAgIGF1dG8gYzJpID0gaHdDb2RlY05hbWUySW5mby5maW5kKG5vZGVOYW1lKTsKICAgICAgICAgICAgICAgICBpZiAoYzJpID09IGh3Q29kZWNOYW1lMkluZm8uZW5kKCkpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IE1lZGlhQ29kZWNJbmZvIGZvciBhIG5ldyBub2RlLgpAQCAtMjk5LDYgKzIyMCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNldE5hbWUobm9kZU5hbWUuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNldE93bmVyKG5vZGUtPm93bmVyLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXRFbmNvZGVyKGlzRW5jb2Rlcik7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPnNldFJhbmsoZGVmYXVsdFJhbmspOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBub2RlIGhhcyBiZWVuIHNlZW4gYmVmb3JlLiBTaW1wbHkgcmV0cmlldmUgdGhlCiAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIE1lZGlhQ29kZWNJbmZvV3JpdGVyLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFFeHRyYWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMmM0MmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5jcHAKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiUmVtb3RlTWVkaWFFeHRyYWN0b3IiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFFeHRyYWN0b3IuaD4KKworLy8gc3RpbGwgZG9pbmcgc29tZSBvbi9vZmYgdG9nZ2xpbmcgaGVyZS4KKyNkZWZpbmUgTUVESUFfTE9HICAgICAgIDEKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBrZXkgZm9yIG1lZGlhIHN0YXRpc3RpY3MKK3N0YXRpYyBjb25zdCBjaGFyICprS2V5RXh0cmFjdG9yID0gImV4dHJhY3RvciI7CisKKy8vIGF0dHJzIGZvciBtZWRpYSBzdGF0aXN0aWNzCisvLyBOQjogdGhlc2UgYXJlIG1hdGNoZWQgd2l0aCBwdWJsaWMgSmF2YSBBUEkgY29uc3RhbnRzIGRlZmluZWQKKy8vIGluIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFFeHRyYWN0b3IuamF2YQorLy8gVGhlc2UgbXVzdCBiZSBrZXB0IHN5bmNocm9uaXplZCB3aXRoIHRoZSBjb25zdGFudHMgdGhlcmUuCitzdGF0aWMgY29uc3QgY2hhciAqa0V4dHJhY3RvckZvcm1hdCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhZXh0cmFjdG9yLmZtdCI7CitzdGF0aWMgY29uc3QgY2hhciAqa0V4dHJhY3Rvck1pbWUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWV4dHJhY3Rvci5taW1lIjsKK3N0YXRpYyBjb25zdCBjaGFyICprRXh0cmFjdG9yVHJhY2tzID0gImFuZHJvaWQubWVkaWEubWVkaWFleHRyYWN0b3IubnRyayI7CisKK1JlbW90ZU1lZGlhRXh0cmFjdG9yOjpSZW1vdGVNZWRpYUV4dHJhY3RvcigKKyAgICAgICAgTWVkaWFFeHRyYWN0b3IgKmV4dHJhY3RvciwKKyAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgY29uc3Qgc3A8UmVmQmFzZT4gJnBsdWdpbikKKyAgICA6bUV4dHJhY3RvcihleHRyYWN0b3IpLAorICAgICBtU291cmNlKHNvdXJjZSksCisgICAgIG1FeHRyYWN0b3JQbHVnaW4ocGx1Z2luKSB7CisKKyAgICBtQW5hbHl0aWNzSXRlbSA9IG51bGxwdHI7CisgICAgaWYgKE1FRElBX0xPRykgeworICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0tleUV4dHJhY3Rvcik7CisKKyAgICAgICAgLy8gdHJhY2sgdGhlIGNvbnRhaW5lciBmb3JtYXQgKG1wZWcsIGFhYywgd3ZtLCBldGMpCisgICAgICAgIHNpemVfdCBudHJhY2tzID0gZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOworICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrRXh0cmFjdG9yRm9ybWF0LCBleHRyYWN0b3ItPm5hbWUoKSk7CisgICAgICAgIC8vIHRyYWNrcyAoc2l6ZV90KQorICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0V4dHJhY3RvclRyYWNrcywgbnRyYWNrcyk7CisgICAgICAgIC8vIG1ldGFkYXRhCisgICAgICAgIE1ldGFEYXRhQmFzZSBwTWV0YURhdGE7CisgICAgICAgIGlmIChleHRyYWN0b3ItPmdldE1ldGFEYXRhKHBNZXRhRGF0YSkgPT0gT0spIHsKKyAgICAgICAgICAgIFN0cmluZzggeHggPSBwTWV0YURhdGEudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIC8vICd0aXRsJyAtLSBidXQgdGhpcyB2ZXJnZXMgaW50byBQSUkKKyAgICAgICAgICAgIC8vICdtaW1lJworICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZSA9IG51bGxwdHI7CisgICAgICAgICAgICBpZiAocE1ldGFEYXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKSB7CisgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa0V4dHJhY3Rvck1pbWUsICBtaW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHdoYXQgZWxzZSBpcyBpbnRlcmVzdGluZyBhbmQgbm90IGFscmVhZHkgYXZhaWxhYmxlPworICAgICAgICB9CisgICAgfQorfQorCitSZW1vdGVNZWRpYUV4dHJhY3Rvcjo6flJlbW90ZU1lZGlhRXh0cmFjdG9yKCkgeworICAgIGRlbGV0ZSBtRXh0cmFjdG9yOworICAgIG1Tb3VyY2UtPmNsb3NlKCk7CisgICAgbVNvdXJjZS5jbGVhcigpOworICAgIG1FeHRyYWN0b3JQbHVnaW4gPSBudWxscHRyOworICAgIC8vIGxvZyB0aGUgY3VycmVudCByZWNvcmQsIHByb3ZpZGVkIGl0IGhhcyBzb21lIGluZm9ybWF0aW9uIHdvcnRoIHJlY29yZGluZworICAgIGlmIChNRURJQV9MT0cpIHsKKyAgICAgICAgaWYgKG1BbmFseXRpY3NJdGVtICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmIChtQW5hbHl0aWNzSXRlbS0+Y291bnQoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2VsZnJlY29yZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChtQW5hbHl0aWNzSXRlbSAhPSBudWxscHRyKSB7CisgICAgICAgIGRlbGV0ZSBtQW5hbHl0aWNzSXRlbTsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBudWxscHRyOworICAgIH0KK30KKworc2l6ZV90IFJlbW90ZU1lZGlhRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKKyAgICByZXR1cm4gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKK30KKworc3A8SU1lZGlhU291cmNlPiBSZW1vdGVNZWRpYUV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CisgICAgTWVkaWFUcmFjayAqc291cmNlID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2soaW5kZXgpOworICAgIHJldHVybiAoc291cmNlID09IG51bGxwdHIpCisgICAgICAgICAgICA/IG51bGxwdHIgOiBDcmVhdGVJTWVkaWFTb3VyY2VGcm9tTWVkaWFTb3VyY2VCYXNlKHRoaXMsIHNvdXJjZSwgbUV4dHJhY3RvclBsdWdpbik7Cit9CisKK3NwPE1ldGFEYXRhPiBSZW1vdGVNZWRpYUV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YShzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGEoKTsKKyAgICBpZiAobUV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YSgqbWV0YS5nZXQoKSwgaW5kZXgsIGZsYWdzKSA9PSBPSykgeworICAgICAgICByZXR1cm4gbWV0YTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3NwPE1ldGFEYXRhPiBSZW1vdGVNZWRpYUV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoKSB7CisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGEoKTsKKyAgICBpZiAobUV4dHJhY3Rvci0+Z2V0TWV0YURhdGEoKm1ldGEuZ2V0KCkpID09IE9LKSB7CisgICAgICAgIHJldHVybiBtZXRhOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworc3RhdHVzX3QgUmVtb3RlTWVkaWFFeHRyYWN0b3I6OmdldE1ldHJpY3MoUGFyY2VsICpyZXBseSkgeworICAgIGlmIChtQW5hbHl0aWNzSXRlbSA9PSBudWxscHRyIHx8IHJlcGx5ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgbUFuYWx5dGljc0l0ZW0tPndyaXRlVG9QYXJjZWwocmVwbHkpOworICAgIHJldHVybiBPSzsKK30KKwordWludDMyX3QgUmVtb3RlTWVkaWFFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgeworICAgIHJldHVybiBtRXh0cmFjdG9yLT5mbGFncygpOworfQorCitzdGF0dXNfdCBSZW1vdGVNZWRpYUV4dHJhY3Rvcjo6c2V0TWVkaWFDYXMoY29uc3QgSEludGVyZmFjZVRva2VuICZjYXNUb2tlbikgeworICAgIHJldHVybiBtRXh0cmFjdG9yLT5zZXRNZWRpYUNhcygodWludDhfdCopY2FzVG9rZW4uZGF0YSgpLCBjYXNUb2tlbi5zaXplKCkpOworfQorCitjb25zdCBjaGFyICogUmVtb3RlTWVkaWFFeHRyYWN0b3I6Om5hbWUoKSB7CisgICAgcmV0dXJuIG1FeHRyYWN0b3ItPm5hbWUoKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gc3RhdGljCitzcDxJTWVkaWFFeHRyYWN0b3I+IFJlbW90ZU1lZGlhRXh0cmFjdG9yOjp3cmFwKAorICAgICAgICBNZWRpYUV4dHJhY3RvciAqZXh0cmFjdG9yLAorICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLAorICAgICAgICBjb25zdCBzcDxSZWZCYXNlPiAmcGx1Z2luKSB7CisgICAgaWYgKGV4dHJhY3RvciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gbmV3IFJlbW90ZU1lZGlhRXh0cmFjdG9yKGV4dHJhY3Rvciwgc291cmNlLCBwbHVnaW4pOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwN2FmZWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5jcHAKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFTb3VyY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitSZW1vdGVNZWRpYVNvdXJjZTo6UmVtb3RlTWVkaWFTb3VyY2UoCisgICAgICAgIGNvbnN0IHNwPFJlbW90ZU1lZGlhRXh0cmFjdG9yPiAmZXh0cmFjdG9yLAorICAgICAgICBNZWRpYVRyYWNrICpzb3VyY2UsCisgICAgICAgIGNvbnN0IHNwPFJlZkJhc2U+ICZwbHVnaW4pCisgICAgOiBtRXh0cmFjdG9yKGV4dHJhY3RvciksCisgICAgICBtU291cmNlKHNvdXJjZSksCisgICAgICBtRXh0cmFjdG9yUGx1Z2luKHBsdWdpbikge30KKworUmVtb3RlTWVkaWFTb3VyY2U6On5SZW1vdGVNZWRpYVNvdXJjZSgpIHsKKyAgICBkZWxldGUgbVNvdXJjZTsKKyAgICBtRXh0cmFjdG9yUGx1Z2luID0gbnVsbHB0cjsKK30KKworc3RhdHVzX3QgUmVtb3RlTWVkaWFTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICByZXR1cm4gbVNvdXJjZS0+c3RhcnQocGFyYW1zKTsKK30KKworc3RhdHVzX3QgUmVtb3RlTWVkaWFTb3VyY2U6OnN0b3AoKSB7CisgICAgcmV0dXJuIG1Tb3VyY2UtPnN0b3AoKTsKK30KKworc3A8TWV0YURhdGE+IFJlbW90ZU1lZGlhU291cmNlOjpnZXRGb3JtYXQoKSB7CisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGEoKTsKKyAgICBpZiAobVNvdXJjZS0+Z2V0Rm9ybWF0KCptZXRhLmdldCgpKSA9PSBPSykgeworICAgICAgICByZXR1cm4gbWV0YTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3N0YXR1c190IFJlbW90ZU1lZGlhU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgIHJldHVybiBtU291cmNlLT5yZWFkKGJ1ZmZlciwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMqPihvcHRpb25zKSk7Cit9CisKK3N0YXR1c190IFJlbW90ZU1lZGlhU291cmNlOjpwYXVzZSgpIHsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IFJlbW90ZU1lZGlhU291cmNlOjpzZXRTdG9wVGltZVVzKGludDY0X3QgLyogc3RvcFRpbWVVcyAqLykgeworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gc3RhdGljCitzcDxJTWVkaWFTb3VyY2U+IFJlbW90ZU1lZGlhU291cmNlOjp3cmFwKAorICAgICAgICBjb25zdCBzcDxSZW1vdGVNZWRpYUV4dHJhY3Rvcj4gJmV4dHJhY3RvciwKKyAgICAgICAgTWVkaWFUcmFjayAqc291cmNlLCBjb25zdCBzcDxSZWZCYXNlPiAmcGx1Z2luKSB7CisgICAgaWYgKHNvdXJjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gbmV3IFJlbW90ZU1lZGlhU291cmNlKGV4dHJhY3Rvciwgc291cmNlLCBwbHVnaW4pOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2FtcGxlSXRlcmF0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2FtcGxlSXRlcmF0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjMxYzVmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NhbXBsZUl0ZXJhdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJTYW1wbGVJdGVyYXRvciIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgImluY2x1ZGUvU2FtcGxlSXRlcmF0b3IuaCIKLQotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KLQotI2luY2x1ZGUgImluY2x1ZGUvU2FtcGxlVGFibGUuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1TYW1wbGVJdGVyYXRvcjo6U2FtcGxlSXRlcmF0b3IoU2FtcGxlVGFibGUgKnRhYmxlKQotICAgIDogbVRhYmxlKHRhYmxlKSwKLSAgICAgIG1Jbml0aWFsaXplZChmYWxzZSksCi0gICAgICBtVGltZVRvU2FtcGxlSW5kZXgoMCksCi0gICAgICBtVFRTU2FtcGxlSW5kZXgoMCksCi0gICAgICBtVFRTU2FtcGxlVGltZSgwKSwKLSAgICAgIG1UVFNDb3VudCgwKSwKLSAgICAgIG1UVFNEdXJhdGlvbigwKSB7Ci0gICAgcmVzZXQoKTsKLX0KLQotdm9pZCBTYW1wbGVJdGVyYXRvcjo6cmVzZXQoKSB7Ci0gICAgbVNhbXBsZVRvQ2h1bmtJbmRleCA9IDA7Ci0gICAgbUZpcnN0Q2h1bmsgPSAwOwotICAgIG1GaXJzdENodW5rU2FtcGxlSW5kZXggPSAwOwotICAgIG1TdG9wQ2h1bmsgPSAwOwotICAgIG1TdG9wQ2h1bmtTYW1wbGVJbmRleCA9IDA7Ci0gICAgbVNhbXBsZXNQZXJDaHVuayA9IDA7Ci0gICAgbUNodW5rRGVzYyA9IDA7Ci19Ci0KLXN0YXR1c190IFNhbXBsZUl0ZXJhdG9yOjpzZWVrVG8odWludDMyX3Qgc2FtcGxlSW5kZXgpIHsKLSAgICBBTE9HVigic2Vla1RvKCVkKSIsIHNhbXBsZUluZGV4KTsKLQotICAgIGlmIChzYW1wbGVJbmRleCA+PSBtVGFibGUtPm1OdW1TYW1wbGVTaXplcykgewotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICB9Ci0KLSAgICBpZiAobVRhYmxlLT5tU2FtcGxlVG9DaHVua09mZnNldCA8IDAKLSAgICAgICAgICAgIHx8IG1UYWJsZS0+bUNodW5rT2Zmc2V0T2Zmc2V0IDwgMAotICAgICAgICAgICAgfHwgbVRhYmxlLT5tU2FtcGxlU2l6ZU9mZnNldCA8IDAKLSAgICAgICAgICAgIHx8IG1UYWJsZS0+bVRpbWVUb1NhbXBsZUNvdW50ID09IDApIHsKLQotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmIChtSW5pdGlhbGl6ZWQgJiYgbUN1cnJlbnRTYW1wbGVJbmRleCA9PSBzYW1wbGVJbmRleCkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgaWYgKCFtSW5pdGlhbGl6ZWQgfHwgc2FtcGxlSW5kZXggPCBtRmlyc3RDaHVua1NhbXBsZUluZGV4KSB7Ci0gICAgICAgIHJlc2V0KCk7Ci0gICAgfQotCi0gICAgaWYgKHNhbXBsZUluZGV4ID49IG1TdG9wQ2h1bmtTYW1wbGVJbmRleCkgewotICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgIGlmICgoZXJyID0gZmluZENodW5rUmFuZ2Uoc2FtcGxlSW5kZXgpKSAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoImZpbmRDaHVua1JhbmdlIGZhaWxlZCIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIENIRUNLKHNhbXBsZUluZGV4IDwgbVN0b3BDaHVua1NhbXBsZUluZGV4KTsKLQotICAgIGlmIChtU2FtcGxlc1BlckNodW5rID09IDApIHsKLSAgICAgICAgQUxPR0UoImIvMjI4MDIzNDQiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBjaHVuayA9Ci0gICAgICAgIChzYW1wbGVJbmRleCAtIG1GaXJzdENodW5rU2FtcGxlSW5kZXgpIC8gbVNhbXBsZXNQZXJDaHVuawotICAgICAgICArIG1GaXJzdENodW5rOwotCi0gICAgaWYgKCFtSW5pdGlhbGl6ZWQgfHwgY2h1bmsgIT0gbUN1cnJlbnRDaHVua0luZGV4KSB7Ci0gICAgICAgIHN0YXR1c190IGVycjsKLSAgICAgICAgaWYgKChlcnIgPSBnZXRDaHVua09mZnNldChjaHVuaywgJm1DdXJyZW50Q2h1bmtPZmZzZXQpKSAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoImdldENodW5rT2Zmc2V0IHJldHVybiBlcnJvciIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIG1DdXJyZW50Q2h1bmtTYW1wbGVTaXplcy5jbGVhcigpOwotCi0gICAgICAgIHVpbnQzMl90IGZpcnN0Q2h1bmtTYW1wbGVJbmRleCA9Ci0gICAgICAgICAgICBtRmlyc3RDaHVua1NhbXBsZUluZGV4Ci0gICAgICAgICAgICAgICAgKyBtU2FtcGxlc1BlckNodW5rICogKGNodW5rIC0gbUZpcnN0Q2h1bmspOwotCi0gICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtU2FtcGxlc1BlckNodW5rOyArK2kpIHsKLSAgICAgICAgICAgIHNpemVfdCBzYW1wbGVTaXplOwotICAgICAgICAgICAgaWYgKChlcnIgPSBnZXRTYW1wbGVTaXplRGlyZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q2h1bmtTYW1wbGVJbmRleCArIGksICZzYW1wbGVTaXplKSkgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0U2FtcGxlU2l6ZURpcmVjdCByZXR1cm4gZXJyb3IiKTsKLSAgICAgICAgICAgICAgICBtQ3VycmVudENodW5rU2FtcGxlU2l6ZXMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQ3VycmVudENodW5rU2FtcGxlU2l6ZXMucHVzaChzYW1wbGVTaXplKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1DdXJyZW50Q2h1bmtJbmRleCA9IGNodW5rOwotICAgIH0KLQotICAgIHVpbnQzMl90IGNodW5rUmVsYXRpdmVTYW1wbGVJbmRleCA9Ci0gICAgICAgIChzYW1wbGVJbmRleCAtIG1GaXJzdENodW5rU2FtcGxlSW5kZXgpICUgbVNhbXBsZXNQZXJDaHVuazsKLQotICAgIG1DdXJyZW50U2FtcGxlT2Zmc2V0ID0gbUN1cnJlbnRDaHVua09mZnNldDsKLSAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY2h1bmtSZWxhdGl2ZVNhbXBsZUluZGV4OyArK2kpIHsKLSAgICAgICAgbUN1cnJlbnRTYW1wbGVPZmZzZXQgKz0gbUN1cnJlbnRDaHVua1NhbXBsZVNpemVzW2ldOwotICAgIH0KLQotICAgIG1DdXJyZW50U2FtcGxlU2l6ZSA9IG1DdXJyZW50Q2h1bmtTYW1wbGVTaXplc1tjaHVua1JlbGF0aXZlU2FtcGxlSW5kZXhdOwotICAgIGlmIChzYW1wbGVJbmRleCA8IG1UVFNTYW1wbGVJbmRleCkgewotICAgICAgICBtVGltZVRvU2FtcGxlSW5kZXggPSAwOwotICAgICAgICBtVFRTU2FtcGxlSW5kZXggPSAwOwotICAgICAgICBtVFRTU2FtcGxlVGltZSA9IDA7Ci0gICAgICAgIG1UVFNDb3VudCA9IDA7Ci0gICAgICAgIG1UVFNEdXJhdGlvbiA9IDA7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyOwotICAgIGlmICgoZXJyID0gZmluZFNhbXBsZVRpbWVBbmREdXJhdGlvbigKLSAgICAgICAgICAgIHNhbXBsZUluZGV4LCAmbUN1cnJlbnRTYW1wbGVUaW1lLCAmbUN1cnJlbnRTYW1wbGVEdXJhdGlvbikpICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJmaW5kU2FtcGxlVGltZSByZXR1cm4gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBtQ3VycmVudFNhbXBsZUluZGV4ID0gc2FtcGxlSW5kZXg7Ci0KLSAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTYW1wbGVJdGVyYXRvcjo6ZmluZENodW5rUmFuZ2UodWludDMyX3Qgc2FtcGxlSW5kZXgpIHsKLSAgICBDSEVDSyhzYW1wbGVJbmRleCA+PSBtRmlyc3RDaHVua1NhbXBsZUluZGV4KTsKLQotICAgIHdoaWxlIChzYW1wbGVJbmRleCA+PSBtU3RvcENodW5rU2FtcGxlSW5kZXgpIHsKLSAgICAgICAgaWYgKG1TYW1wbGVUb0NodW5rSW5kZXggPT0gbVRhYmxlLT5tTnVtU2FtcGxlVG9DaHVua09mZnNldHMpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7Ci0gICAgICAgIH0KLQotICAgICAgICBtRmlyc3RDaHVua1NhbXBsZUluZGV4ID0gbVN0b3BDaHVua1NhbXBsZUluZGV4OwotCi0gICAgICAgIGNvbnN0IFNhbXBsZVRhYmxlOjpTYW1wbGVUb0NodW5rRW50cnkgKmVudHJ5ID0KLSAgICAgICAgICAgICZtVGFibGUtPm1TYW1wbGVUb0NodW5rRW50cmllc1ttU2FtcGxlVG9DaHVua0luZGV4XTsKLQotICAgICAgICBtRmlyc3RDaHVuayA9IGVudHJ5LT5zdGFydENodW5rOwotICAgICAgICBtU2FtcGxlc1BlckNodW5rID0gZW50cnktPnNhbXBsZXNQZXJDaHVuazsKLSAgICAgICAgbUNodW5rRGVzYyA9IGVudHJ5LT5jaHVua0Rlc2M7Ci0KLSAgICAgICAgaWYgKG1TYW1wbGVUb0NodW5rSW5kZXggKyAxIDwgbVRhYmxlLT5tTnVtU2FtcGxlVG9DaHVua09mZnNldHMpIHsKLSAgICAgICAgICAgIG1TdG9wQ2h1bmsgPSBlbnRyeVsxXS5zdGFydENodW5rOwotCi0gICAgICAgICAgICBpZiAobVN0b3BDaHVuayA8IG1GaXJzdENodW5rIHx8Ci0gICAgICAgICAgICAgICAgKG1TdG9wQ2h1bmsgLSBtRmlyc3RDaHVuaykgPiBVSU5UMzJfTUFYIC8gbVNhbXBsZXNQZXJDaHVuayB8fAotICAgICAgICAgICAgICAgICgobVN0b3BDaHVuayAtIG1GaXJzdENodW5rKSAqIG1TYW1wbGVzUGVyQ2h1bmsgPgotICAgICAgICAgICAgICAgICBVSU5UMzJfTUFYIC0gbUZpcnN0Q2h1bmtTYW1wbGVJbmRleCkpIHsKLQotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU3RvcENodW5rU2FtcGxlSW5kZXggPQotICAgICAgICAgICAgICAgIG1GaXJzdENodW5rU2FtcGxlSW5kZXgKLSAgICAgICAgICAgICAgICAgICAgKyAobVN0b3BDaHVuayAtIG1GaXJzdENodW5rKSAqIG1TYW1wbGVzUGVyQ2h1bms7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3RvcENodW5rID0gMHhmZmZmZmZmZjsKLSAgICAgICAgICAgIG1TdG9wQ2h1bmtTYW1wbGVJbmRleCA9IDB4ZmZmZmZmZmY7Ci0gICAgICAgIH0KLQotICAgICAgICArK21TYW1wbGVUb0NodW5rSW5kZXg7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTYW1wbGVJdGVyYXRvcjo6Z2V0Q2h1bmtPZmZzZXQodWludDMyX3QgY2h1bmssIG9mZjY0X3QgKm9mZnNldCkgewotICAgICpvZmZzZXQgPSAwOwotCi0gICAgaWYgKGNodW5rID49IG1UYWJsZS0+bU51bUNodW5rT2Zmc2V0cykgewotICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOwotICAgIH0KLQotICAgIGlmIChtVGFibGUtPm1DaHVua09mZnNldFR5cGUgPT0gU2FtcGxlVGFibGU6OmtDaHVua09mZnNldFR5cGUzMikgewotICAgICAgICB1aW50MzJfdCBvZmZzZXQzMjsKLQotICAgICAgICBpZiAobVRhYmxlLT5tRGF0YVNvdXJjZS0+cmVhZEF0KAotICAgICAgICAgICAgICAgICAgICBtVGFibGUtPm1DaHVua09mZnNldE9mZnNldCArIDggKyA0ICogY2h1bmssCi0gICAgICAgICAgICAgICAgICAgICZvZmZzZXQzMiwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9mZnNldDMyKSkgPCAoc3NpemVfdClzaXplb2Yob2Zmc2V0MzIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgIH0KLQotICAgICAgICAqb2Zmc2V0ID0gbnRvaGwob2Zmc2V0MzIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIENIRUNLX0VRKG1UYWJsZS0+bUNodW5rT2Zmc2V0VHlwZSwgU2FtcGxlVGFibGU6OmtDaHVua09mZnNldFR5cGU2NCk7Ci0KLSAgICAgICAgdWludDY0X3Qgb2Zmc2V0NjQ7Ci0gICAgICAgIGlmIChtVGFibGUtPm1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgICAgIG1UYWJsZS0+bUNodW5rT2Zmc2V0T2Zmc2V0ICsgOCArIDggKiBjaHVuaywKLSAgICAgICAgICAgICAgICAgICAgJm9mZnNldDY0LAotICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2Zmc2V0NjQpKSA8IChzc2l6ZV90KXNpemVvZihvZmZzZXQ2NCkpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgfQotCi0gICAgICAgICpvZmZzZXQgPSBudG9oNjQob2Zmc2V0NjQpOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU2FtcGxlSXRlcmF0b3I6OmdldFNhbXBsZVNpemVEaXJlY3QoCi0gICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4LCBzaXplX3QgKnNpemUpIHsKLSAgICAqc2l6ZSA9IDA7Ci0KLSAgICBpZiAoc2FtcGxlSW5kZXggPj0gbVRhYmxlLT5tTnVtU2FtcGxlU2l6ZXMpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKLSAgICB9Ci0KLSAgICBpZiAobVRhYmxlLT5tRGVmYXVsdFNhbXBsZVNpemUgPiAwKSB7Ci0gICAgICAgICpzaXplID0gbVRhYmxlLT5tRGVmYXVsdFNhbXBsZVNpemU7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKG1UYWJsZS0+bVNhbXBsZVNpemVGaWVsZFNpemUpIHsKLSAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1UYWJsZS0+bURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UYWJsZS0+bVNhbXBsZVNpemVPZmZzZXQgKyAxMiArIDQgKiBzYW1wbGVJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIHNpemVvZigqc2l6ZSkpIDwgKHNzaXplX3Qpc2l6ZW9mKCpzaXplKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgKnNpemUgPSBudG9obCgqc2l6ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgMTY6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQxNl90IHg7Ci0gICAgICAgICAgICBpZiAobVRhYmxlLT5tRGF0YVNvdXJjZS0+cmVhZEF0KAotICAgICAgICAgICAgICAgICAgICAgICAgbVRhYmxlLT5tU2FtcGxlU2l6ZU9mZnNldCArIDEyICsgMiAqIHNhbXBsZUluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgJngsIHNpemVvZih4KSkgPCAoc3NpemVfdClzaXplb2YoeCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICpzaXplID0gbnRvaHMoeCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgODoKLSAgICAgICAgewotICAgICAgICAgICAgdWludDhfdCB4OwotICAgICAgICAgICAgaWYgKG1UYWJsZS0+bURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UYWJsZS0+bVNhbXBsZVNpemVPZmZzZXQgKyAxMiArIHNhbXBsZUluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgJngsIHNpemVvZih4KSkgPCAoc3NpemVfdClzaXplb2YoeCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICpzaXplID0geDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgQ0hFQ0tfRVEobVRhYmxlLT5tU2FtcGxlU2l6ZUZpZWxkU2l6ZSwgNHUpOwotCi0gICAgICAgICAgICB1aW50OF90IHg7Ci0gICAgICAgICAgICBpZiAobVRhYmxlLT5tRGF0YVNvdXJjZS0+cmVhZEF0KAotICAgICAgICAgICAgICAgICAgICAgICAgbVRhYmxlLT5tU2FtcGxlU2l6ZU9mZnNldCArIDEyICsgc2FtcGxlSW5kZXggLyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgJngsIHNpemVvZih4KSkgPCAoc3NpemVfdClzaXplb2YoeCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICpzaXplID0gKHNhbXBsZUluZGV4ICYgMSkgPyB4ICYgMHgwZiA6IHggPj4gNDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTYW1wbGVJdGVyYXRvcjo6ZmluZFNhbXBsZVRpbWVBbmREdXJhdGlvbigKLSAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXgsIHVpbnQzMl90ICp0aW1lLCB1aW50MzJfdCAqZHVyYXRpb24pIHsKLSAgICBpZiAoc2FtcGxlSW5kZXggPj0gbVRhYmxlLT5tTnVtU2FtcGxlU2l6ZXMpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKLSAgICB9Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBpZiAobVRUU1NhbXBsZUluZGV4ID4gVUlOVDMyX01BWCAtIG1UVFNDb3VudCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKLSAgICAgICAgfQotICAgICAgICBpZihzYW1wbGVJbmRleCA8IG1UVFNTYW1wbGVJbmRleCArIG1UVFNDb3VudCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1UaW1lVG9TYW1wbGVJbmRleCA9PSBtVGFibGUtPm1UaW1lVG9TYW1wbGVDb3VudCB8fAotICAgICAgICAgICAgKG1UVFNEdXJhdGlvbiAhPSAwICYmIG1UVFNDb3VudCA+IFVJTlQzMl9NQVggLyBtVFRTRHVyYXRpb24pIHx8Ci0gICAgICAgICAgICBtVFRTU2FtcGxlVGltZSA+IFVJTlQzMl9NQVggLSAobVRUU0NvdW50ICogbVRUU0R1cmF0aW9uKSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKLSAgICAgICAgfQotCi0gICAgICAgIG1UVFNTYW1wbGVJbmRleCArPSBtVFRTQ291bnQ7Ci0gICAgICAgIG1UVFNTYW1wbGVUaW1lICs9IG1UVFNDb3VudCAqIG1UVFNEdXJhdGlvbjsKLQotICAgICAgICBtVFRTQ291bnQgPSBtVGFibGUtPm1UaW1lVG9TYW1wbGVbMiAqIG1UaW1lVG9TYW1wbGVJbmRleF07Ci0gICAgICAgIG1UVFNEdXJhdGlvbiA9IG1UYWJsZS0+bVRpbWVUb1NhbXBsZVsyICogbVRpbWVUb1NhbXBsZUluZGV4ICsgMV07Ci0KLSAgICAgICAgKyttVGltZVRvU2FtcGxlSW5kZXg7Ci0gICAgfQotCi0gICAgKnRpbWUgPSBtVFRTU2FtcGxlVGltZSArIG1UVFNEdXJhdGlvbiAqIChzYW1wbGVJbmRleCAtIG1UVFNTYW1wbGVJbmRleCk7Ci0KLSAgICBpbnQzMl90IG9mZnNldCA9IG1UYWJsZS0+Z2V0Q29tcG9zaXRpb25UaW1lT2Zmc2V0KHNhbXBsZUluZGV4KTsKLSAgICBpZiAoKG9mZnNldCA8IDAgJiYgKnRpbWUgPCAob2Zmc2V0ID09IElOVDMyX01JTiA/Ci0gICAgICAgICAgICBJTlQzMl9NQVggOiB1aW50MzJfdCgtb2Zmc2V0KSkpIHx8Ci0gICAgICAgICAgICAob2Zmc2V0ID4gMCAmJiAqdGltZSA+IFVJTlQzMl9NQVggLSBvZmZzZXQpKSB7Ci0gICAgICAgIEFMT0dFKCIldSArICVkIHdvdWxkIG92ZXJmbG93IiwgKnRpbWUsIG9mZnNldCk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7Ci0gICAgfQotICAgIGlmIChvZmZzZXQgPiAwKSB7Ci0gICAgICAgICp0aW1lICs9IG9mZnNldDsKLSAgICB9IGVsc2UgewotICAgICAgICAqdGltZSAtPSAob2Zmc2V0ID09IElOVDMyX01JTiA/IElOVDMyX01BWCA6ICgtb2Zmc2V0KSk7Ci0gICAgfQotCi0gICAgKmR1cmF0aW9uID0gbVRUU0R1cmF0aW9uOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TYW1wbGVUYWJsZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TYW1wbGVUYWJsZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMmE5MzEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2FtcGxlVGFibGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTAwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJTYW1wbGVUYWJsZSIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPGxpbWl0cz4KLQotI2luY2x1ZGUgImluY2x1ZGUvU2FtcGxlVGFibGUuaCIKLSNpbmNsdWRlICJpbmNsdWRlL1NhbXBsZUl0ZXJhdG9yLmgiCi0KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+Ci0KLS8qIFRPRE86IHJlbW92ZSBhZnRlciBiZWluZyBtZXJnZWQgaW50byBvdGhlciBicmFuY2hlcyAqLwotI2lmbmRlZiBVSU5UMzJfTUFYCi0jZGVmaW5lIFVJTlQzMl9NQVggICAgICAgKDQyOTQ5NjcyOTVVKQotI2VuZGlmCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gc3RhdGljCi1jb25zdCB1aW50MzJfdCBTYW1wbGVUYWJsZTo6a0NodW5rT2Zmc2V0VHlwZTMyID0gRk9VUkNDKCdzJywgJ3QnLCAnYycsICdvJyk7Ci0vLyBzdGF0aWMKLWNvbnN0IHVpbnQzMl90IFNhbXBsZVRhYmxlOjprQ2h1bmtPZmZzZXRUeXBlNjQgPSBGT1VSQ0MoJ2MnLCAnbycsICc2JywgJzQnKTsKLS8vIHN0YXRpYwotY29uc3QgdWludDMyX3QgU2FtcGxlVGFibGU6OmtTYW1wbGVTaXplVHlwZTMyID0gRk9VUkNDKCdzJywgJ3QnLCAncycsICd6Jyk7Ci0vLyBzdGF0aWMKLWNvbnN0IHVpbnQzMl90IFNhbXBsZVRhYmxlOjprU2FtcGxlU2l6ZVR5cGVDb21wYWN0ID0gRk9VUkNDKCdzJywgJ3QnLCAneicsICcyJyk7Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLWNvbnN0IG9mZjY0X3Qga01heE9mZnNldCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8b2ZmNjRfdD46Om1heCgpOwotCi1zdHJ1Y3QgU2FtcGxlVGFibGU6OkNvbXBvc2l0aW9uRGVsdGFMb29rdXAgewotICAgIENvbXBvc2l0aW9uRGVsdGFMb29rdXAoKTsKLQotICAgIHZvaWQgc2V0RW50cmllcygKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgKmRlbHRhRW50cmllcywgc2l6ZV90IG51bURlbHRhRW50cmllcyk7Ci0KLSAgICBpbnQzMl90IGdldENvbXBvc2l0aW9uVGltZU9mZnNldCh1aW50MzJfdCBzYW1wbGVJbmRleCk7Ci0KLXByaXZhdGU6Ci0gICAgTXV0ZXggbUxvY2s7Ci0KLSAgICBjb25zdCBpbnQzMl90ICptRGVsdGFFbnRyaWVzOwotICAgIHNpemVfdCBtTnVtRGVsdGFFbnRyaWVzOwotCi0gICAgc2l6ZV90IG1DdXJyZW50RGVsdGFFbnRyeTsKLSAgICBzaXplX3QgbUN1cnJlbnRFbnRyeVNhbXBsZUluZGV4OwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ29tcG9zaXRpb25EZWx0YUxvb2t1cCk7Ci19OwotCi1TYW1wbGVUYWJsZTo6Q29tcG9zaXRpb25EZWx0YUxvb2t1cDo6Q29tcG9zaXRpb25EZWx0YUxvb2t1cCgpCi0gICAgOiBtRGVsdGFFbnRyaWVzKE5VTEwpLAotICAgICAgbU51bURlbHRhRW50cmllcygwKSwKLSAgICAgIG1DdXJyZW50RGVsdGFFbnRyeSgwKSwKLSAgICAgIG1DdXJyZW50RW50cnlTYW1wbGVJbmRleCgwKSB7Ci19Ci0KLXZvaWQgU2FtcGxlVGFibGU6OkNvbXBvc2l0aW9uRGVsdGFMb29rdXA6OnNldEVudHJpZXMoCi0gICAgICAgIGNvbnN0IGludDMyX3QgKmRlbHRhRW50cmllcywgc2l6ZV90IG51bURlbHRhRW50cmllcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7Ci0KLSAgICBtRGVsdGFFbnRyaWVzID0gZGVsdGFFbnRyaWVzOwotICAgIG1OdW1EZWx0YUVudHJpZXMgPSBudW1EZWx0YUVudHJpZXM7Ci0gICAgbUN1cnJlbnREZWx0YUVudHJ5ID0gMDsKLSAgICBtQ3VycmVudEVudHJ5U2FtcGxlSW5kZXggPSAwOwotfQotCi1pbnQzMl90IFNhbXBsZVRhYmxlOjpDb21wb3NpdGlvbkRlbHRhTG9va3VwOjpnZXRDb21wb3NpdGlvblRpbWVPZmZzZXQoCi0gICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4KSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtRGVsdGFFbnRyaWVzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKHNhbXBsZUluZGV4IDwgbUN1cnJlbnRFbnRyeVNhbXBsZUluZGV4KSB7Ci0gICAgICAgIG1DdXJyZW50RGVsdGFFbnRyeSA9IDA7Ci0gICAgICAgIG1DdXJyZW50RW50cnlTYW1wbGVJbmRleCA9IDA7Ci0gICAgfQotCi0gICAgd2hpbGUgKG1DdXJyZW50RGVsdGFFbnRyeSA8IG1OdW1EZWx0YUVudHJpZXMpIHsKLSAgICAgICAgdWludDMyX3Qgc2FtcGxlQ291bnQgPSBtRGVsdGFFbnRyaWVzWzIgKiBtQ3VycmVudERlbHRhRW50cnldOwotICAgICAgICBpZiAoc2FtcGxlSW5kZXggPCBtQ3VycmVudEVudHJ5U2FtcGxlSW5kZXggKyBzYW1wbGVDb3VudCkgewotICAgICAgICAgICAgcmV0dXJuIG1EZWx0YUVudHJpZXNbMiAqIG1DdXJyZW50RGVsdGFFbnRyeSArIDFdOwotICAgICAgICB9Ci0KLSAgICAgICAgbUN1cnJlbnRFbnRyeVNhbXBsZUluZGV4ICs9IHNhbXBsZUNvdW50OwotICAgICAgICArK21DdXJyZW50RGVsdGFFbnRyeTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotU2FtcGxlVGFibGU6OlNhbXBsZVRhYmxlKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpCi0gICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAotICAgICAgbUNodW5rT2Zmc2V0T2Zmc2V0KC0xKSwKLSAgICAgIG1DaHVua09mZnNldFR5cGUoMCksCi0gICAgICBtTnVtQ2h1bmtPZmZzZXRzKDApLAotICAgICAgbVNhbXBsZVRvQ2h1bmtPZmZzZXQoLTEpLAotICAgICAgbU51bVNhbXBsZVRvQ2h1bmtPZmZzZXRzKDApLAotICAgICAgbVNhbXBsZVNpemVPZmZzZXQoLTEpLAotICAgICAgbVNhbXBsZVNpemVGaWVsZFNpemUoMCksCi0gICAgICBtRGVmYXVsdFNhbXBsZVNpemUoMCksCi0gICAgICBtTnVtU2FtcGxlU2l6ZXMoMCksCi0gICAgICBtSGFzVGltZVRvU2FtcGxlKGZhbHNlKSwKLSAgICAgIG1UaW1lVG9TYW1wbGVDb3VudCgwKSwKLSAgICAgIG1UaW1lVG9TYW1wbGUoTlVMTCksCi0gICAgICBtU2FtcGxlVGltZUVudHJpZXMoTlVMTCksCi0gICAgICBtQ29tcG9zaXRpb25UaW1lRGVsdGFFbnRyaWVzKE5VTEwpLAotICAgICAgbU51bUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllcygwKSwKLSAgICAgIG1Db21wb3NpdGlvbkRlbHRhTG9va3VwKG5ldyBDb21wb3NpdGlvbkRlbHRhTG9va3VwKSwKLSAgICAgIG1TeW5jU2FtcGxlT2Zmc2V0KC0xKSwKLSAgICAgIG1OdW1TeW5jU2FtcGxlcygwKSwKLSAgICAgIG1TeW5jU2FtcGxlcyhOVUxMKSwKLSAgICAgIG1MYXN0U3luY1NhbXBsZUluZGV4KDApLAotICAgICAgbVNhbXBsZVRvQ2h1bmtFbnRyaWVzKE5VTEwpLAotICAgICAgbVRvdGFsU2l6ZSgwKSB7Ci0gICAgbVNhbXBsZUl0ZXJhdG9yID0gbmV3IFNhbXBsZUl0ZXJhdG9yKHRoaXMpOwotfQotCi1TYW1wbGVUYWJsZTo6flNhbXBsZVRhYmxlKCkgewotICAgIGRlbGV0ZVtdIG1TYW1wbGVUb0NodW5rRW50cmllczsKLSAgICBtU2FtcGxlVG9DaHVua0VudHJpZXMgPSBOVUxMOwotCi0gICAgZGVsZXRlW10gbVN5bmNTYW1wbGVzOwotICAgIG1TeW5jU2FtcGxlcyA9IE5VTEw7Ci0KLSAgICBkZWxldGVbXSBtVGltZVRvU2FtcGxlOwotICAgIG1UaW1lVG9TYW1wbGUgPSBOVUxMOwotCi0gICAgZGVsZXRlIG1Db21wb3NpdGlvbkRlbHRhTG9va3VwOwotICAgIG1Db21wb3NpdGlvbkRlbHRhTG9va3VwID0gTlVMTDsKLQotICAgIGRlbGV0ZVtdIG1Db21wb3NpdGlvblRpbWVEZWx0YUVudHJpZXM7Ci0gICAgbUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllcyA9IE5VTEw7Ci0KLSAgICBkZWxldGVbXSBtU2FtcGxlVGltZUVudHJpZXM7Ci0gICAgbVNhbXBsZVRpbWVFbnRyaWVzID0gTlVMTDsKLQotICAgIGRlbGV0ZSBtU2FtcGxlSXRlcmF0b3I7Ci0gICAgbVNhbXBsZUl0ZXJhdG9yID0gTlVMTDsKLX0KLQotYm9vbCBTYW1wbGVUYWJsZTo6aXNWYWxpZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUNodW5rT2Zmc2V0T2Zmc2V0ID49IDAKLSAgICAgICAgJiYgbVNhbXBsZVRvQ2h1bmtPZmZzZXQgPj0gMAotICAgICAgICAmJiBtU2FtcGxlU2l6ZU9mZnNldCA+PSAwCi0gICAgICAgICYmIG1IYXNUaW1lVG9TYW1wbGU7Ci19Ci0KLXN0YXR1c190IFNhbXBsZVRhYmxlOjpzZXRDaHVua09mZnNldFBhcmFtcygKLSAgICAgICAgdWludDMyX3QgdHlwZSwgb2ZmNjRfdCBkYXRhX29mZnNldCwgc2l6ZV90IGRhdGFfc2l6ZSkgewotICAgIGlmIChtQ2h1bmtPZmZzZXRPZmZzZXQgPj0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIENIRUNLKHR5cGUgPT0ga0NodW5rT2Zmc2V0VHlwZTMyIHx8IHR5cGUgPT0ga0NodW5rT2Zmc2V0VHlwZTY0KTsKLQotICAgIG1DaHVua09mZnNldE9mZnNldCA9IGRhdGFfb2Zmc2V0OwotICAgIG1DaHVua09mZnNldFR5cGUgPSB0eXBlOwotCi0gICAgaWYgKGRhdGFfc2l6ZSA8IDgpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1aW50OF90IGhlYWRlcls4XTsKLSAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgewotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotCi0gICAgaWYgKFUzMl9BVChoZWFkZXIpICE9IDApIHsKLSAgICAgICAgLy8gRXhwZWN0ZWQgdmVyc2lvbiA9IDAsIGZsYWdzID0gMC4KLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBtTnVtQ2h1bmtPZmZzZXRzID0gVTMyX0FUKCZoZWFkZXJbNF0pOwotCi0gICAgaWYgKG1DaHVua09mZnNldFR5cGUgPT0ga0NodW5rT2Zmc2V0VHlwZTMyKSB7Ci0gICAgICBpZiAoKGRhdGFfc2l6ZSAtIDgpIC8gNCA8IG1OdW1DaHVua09mZnNldHMpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKChkYXRhX3NpemUgLSA4KSAvIDggPCBtTnVtQ2h1bmtPZmZzZXRzKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTYW1wbGVUYWJsZTo6c2V0U2FtcGxlVG9DaHVua1BhcmFtcygKLSAgICAgICAgb2ZmNjRfdCBkYXRhX29mZnNldCwgc2l6ZV90IGRhdGFfc2l6ZSkgewotICAgIGlmIChtU2FtcGxlVG9DaHVua09mZnNldCA+PSAwKSB7Ci0gICAgICAgIC8vIGFscmVhZHkgc2V0Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKGRhdGFfb2Zmc2V0IDwgMCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIG1TYW1wbGVUb0NodW5rT2Zmc2V0ID0gZGF0YV9vZmZzZXQ7Ci0KLSAgICBpZiAoZGF0YV9zaXplIDwgOCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVpbnQ4X3QgaGVhZGVyWzhdOwotICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAotICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKSA8IChzc2l6ZV90KXNpemVvZihoZWFkZXIpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0KLSAgICBpZiAoVTMyX0FUKGhlYWRlcikgIT0gMCkgewotICAgICAgICAvLyBFeHBlY3RlZCB2ZXJzaW9uID0gMCwgZmxhZ3MgPSAwLgotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIG1OdW1TYW1wbGVUb0NodW5rT2Zmc2V0cyA9IFUzMl9BVCgmaGVhZGVyWzRdKTsKLQotICAgIGlmICgoZGF0YV9zaXplIC0gOCkgLyBzaXplb2YoU2FtcGxlVG9DaHVua0VudHJ5KSA8IG1OdW1TYW1wbGVUb0NodW5rT2Zmc2V0cykgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmICgodWludDY0X3Qpa01heFRvdGFsU2l6ZSAvIHNpemVvZihTYW1wbGVUb0NodW5rRW50cnkpIDw9Ci0gICAgICAgICAgICAodWludDY0X3QpbU51bVNhbXBsZVRvQ2h1bmtPZmZzZXRzKSB7Ci0gICAgICAgIEFMT0dFKCJTYW1wbGUtdG8tY2h1bmsgdGFibGUgc2l6ZSB0b28gbGFyZ2UuIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7Ci0gICAgfQotCi0gICAgbVRvdGFsU2l6ZSArPSAodWludDY0X3QpbU51bVNhbXBsZVRvQ2h1bmtPZmZzZXRzICoKLSAgICAgICAgICAgIHNpemVvZihTYW1wbGVUb0NodW5rRW50cnkpOwotICAgIGlmIChtVG90YWxTaXplID4ga01heFRvdGFsU2l6ZSkgewotICAgICAgICBBTE9HRSgiU2FtcGxlLXRvLWNodW5rIHRhYmxlIHNpemUgd291bGQgbWFrZSBzYW1wbGUgdGFibGUgdG9vIGxhcmdlLlxuIgotICAgICAgICAgICAgICAiICAgIFJlcXVlc3RlZCBzYW1wbGUtdG8tY2h1bmsgdGFibGUgc2l6ZSA9ICVsbHVcbiIKLSAgICAgICAgICAgICAgIiAgICBFdmVudHVhbCBzYW1wbGUgdGFibGUgc2l6ZSA+PSAlbGx1XG4iCi0gICAgICAgICAgICAgICIgICAgQWxsb3dlZCBzYW1wbGUgdGFibGUgc2l6ZSA9ICVsbHVcbiIsCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbU51bVNhbXBsZVRvQ2h1bmtPZmZzZXRzICoKLSAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoU2FtcGxlVG9DaHVua0VudHJ5KSwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyltVG90YWxTaXplLAotICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWtNYXhUb3RhbFNpemUpOwotICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOwotICAgIH0KLQotICAgIG1TYW1wbGVUb0NodW5rRW50cmllcyA9Ci0gICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSBTYW1wbGVUb0NodW5rRW50cnlbbU51bVNhbXBsZVRvQ2h1bmtPZmZzZXRzXTsKLSAgICBpZiAoIW1TYW1wbGVUb0NodW5rRW50cmllcykgewotICAgICAgICBBTE9HRSgiQ2Fubm90IGFsbG9jYXRlIHNhbXBsZS10by1jaHVuayB0YWJsZSB3aXRoICVsbHUgZW50cmllcy4iLAotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbU51bVNhbXBsZVRvQ2h1bmtPZmZzZXRzKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKLSAgICB9Ci0KLSAgICBpZiAobU51bVNhbXBsZVRvQ2h1bmtPZmZzZXRzID09IDApIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGlmICgob2ZmNjRfdCkoa01heE9mZnNldCAtIDggLQotICAgICAgICAgICAgKChtTnVtU2FtcGxlVG9DaHVua09mZnNldHMgLSAxKSAqIHNpemVvZihTYW1wbGVUb0NodW5rRW50cnkpKSkKLSAgICAgICAgICAgIDwgbVNhbXBsZVRvQ2h1bmtPZmZzZXQpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbU51bVNhbXBsZVRvQ2h1bmtPZmZzZXRzOyArK2kpIHsKLSAgICAgICAgdWludDhfdCBidWZmZXJbc2l6ZW9mKFNhbXBsZVRvQ2h1bmtFbnRyeSldOwotCi0gICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAotICAgICAgICAgICAgICAgICAgICBtU2FtcGxlVG9DaHVua09mZnNldCArIDggKyBpICogc2l6ZW9mKFNhbXBsZVRvQ2h1bmtFbnRyeSksCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJ1ZmZlcikpCi0gICAgICAgICAgICAgICAgIT0gKHNzaXplX3Qpc2l6ZW9mKGJ1ZmZlcikpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgfQotICAgICAgICAvLyBjaHVuayBpbmRleCBpcyAxIGJhc2VkIGluIHRoZSBzcGVjLgotICAgICAgICBpZiAoVTMyX0FUKGJ1ZmZlcikgPCAxKSB7Ci0gICAgICAgICAgICBBTE9HRSgiYi8yMzUzNDE2MCIpOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdlIHdhbnQgdGhlIGNodW5rIGluZGV4IHRvIGJlIDAtYmFzZWQuCi0gICAgICAgIG1TYW1wbGVUb0NodW5rRW50cmllc1tpXS5zdGFydENodW5rID0gVTMyX0FUKGJ1ZmZlcikgLSAxOwotICAgICAgICBtU2FtcGxlVG9DaHVua0VudHJpZXNbaV0uc2FtcGxlc1BlckNodW5rID0gVTMyX0FUKCZidWZmZXJbNF0pOwotICAgICAgICBtU2FtcGxlVG9DaHVua0VudHJpZXNbaV0uY2h1bmtEZXNjID0gVTMyX0FUKCZidWZmZXJbOF0pOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU2FtcGxlVGFibGU6OnNldFNhbXBsZVNpemVQYXJhbXMoCi0gICAgICAgIHVpbnQzMl90IHR5cGUsIG9mZjY0X3QgZGF0YV9vZmZzZXQsIHNpemVfdCBkYXRhX3NpemUpIHsKLSAgICBpZiAobVNhbXBsZVNpemVPZmZzZXQgPj0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIENIRUNLKHR5cGUgPT0ga1NhbXBsZVNpemVUeXBlMzIgfHwgdHlwZSA9PSBrU2FtcGxlU2l6ZVR5cGVDb21wYWN0KTsKLQotICAgIG1TYW1wbGVTaXplT2Zmc2V0ID0gZGF0YV9vZmZzZXQ7Ci0KLSAgICBpZiAoZGF0YV9zaXplIDwgMTIpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1aW50OF90IGhlYWRlclsxMl07Ci0gICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLQotICAgIGlmIChVMzJfQVQoaGVhZGVyKSAhPSAwKSB7Ci0gICAgICAgIC8vIEV4cGVjdGVkIHZlcnNpb24gPSAwLCBmbGFncyA9IDAuCi0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgbURlZmF1bHRTYW1wbGVTaXplID0gVTMyX0FUKCZoZWFkZXJbNF0pOwotICAgIG1OdW1TYW1wbGVTaXplcyA9IFUzMl9BVCgmaGVhZGVyWzhdKTsKLSAgICBpZiAobU51bVNhbXBsZVNpemVzID4gKFVJTlQzMl9NQVggLSAxMikgLyAxNikgewotICAgICAgICBBTE9HRSgiYi8yMzI0NzA1NSwgbU51bVNhbXBsZVNpemVzKCV1KSIsIG1OdW1TYW1wbGVTaXplcyk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKHR5cGUgPT0ga1NhbXBsZVNpemVUeXBlMzIpIHsKLSAgICAgICAgbVNhbXBsZVNpemVGaWVsZFNpemUgPSAzMjsKLQotICAgICAgICBpZiAobURlZmF1bHRTYW1wbGVTaXplICE9IDApIHsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkYXRhX3NpemUgPCAxMiArIG1OdW1TYW1wbGVTaXplcyAqIDQpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoKG1EZWZhdWx0U2FtcGxlU2l6ZSAmIDB4ZmZmZmZmMDApICE9IDApIHsKLSAgICAgICAgICAgIC8vIFRoZSBoaWdoIDI0IGJpdHMgYXJlIHJlc2VydmVkIGFuZCBtdXN0IGJlIDAuCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgbVNhbXBsZVNpemVGaWVsZFNpemUgPSBtRGVmYXVsdFNhbXBsZVNpemUgJiAweGZmOwotICAgICAgICBtRGVmYXVsdFNhbXBsZVNpemUgPSAwOwotCi0gICAgICAgIGlmIChtU2FtcGxlU2l6ZUZpZWxkU2l6ZSAhPSA0ICYmIG1TYW1wbGVTaXplRmllbGRTaXplICE9IDgKLSAgICAgICAgICAgICYmIG1TYW1wbGVTaXplRmllbGRTaXplICE9IDE2KSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRhdGFfc2l6ZSA8IDEyICsgKG1OdW1TYW1wbGVTaXplcyAqIG1TYW1wbGVTaXplRmllbGRTaXplICsgNCkgLyA4KSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTYW1wbGVUYWJsZTo6c2V0VGltZVRvU2FtcGxlUGFyYW1zKAotICAgICAgICBvZmY2NF90IGRhdGFfb2Zmc2V0LCBzaXplX3QgZGF0YV9zaXplKSB7Ci0gICAgaWYgKG1IYXNUaW1lVG9TYW1wbGUgfHwgZGF0YV9zaXplIDwgOCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVpbnQ4X3QgaGVhZGVyWzhdOwotICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAotICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKSA8IChzc2l6ZV90KXNpemVvZihoZWFkZXIpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9Ci0KLSAgICBpZiAoVTMyX0FUKGhlYWRlcikgIT0gMCkgewotICAgICAgICAvLyBFeHBlY3RlZCB2ZXJzaW9uID0gMCwgZmxhZ3MgPSAwLgotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIG1UaW1lVG9TYW1wbGVDb3VudCA9IFUzMl9BVCgmaGVhZGVyWzRdKTsKLSAgICBpZiAobVRpbWVUb1NhbXBsZUNvdW50ID4gVUlOVDMyX01BWCAvICgyICogc2l6ZW9mKHVpbnQzMl90KSkpIHsKLSAgICAgICAgLy8gQ2hvb3NlIHRoaXMgYm91bmQgYmVjYXVzZQotICAgICAgICAvLyAxKSAyICogc2l6ZW9mKHVpbnQzMl90KSBpcyB0aGUgYW1vdW50IG9mIG1lbW9yeSBuZWVkZWQgZm9yIG9uZQotICAgICAgICAvLyAgICB0aW1lLXRvLXNhbXBsZSBlbnRyeSBpbiB0aGUgdGltZS10by1zYW1wbGUgdGFibGUuCi0gICAgICAgIC8vIDIpIG1UaW1lVG9TYW1wbGVDb3VudCBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgb2YgdGhlIHRpbWUtdG8tc2FtcGxlCi0gICAgICAgIC8vICAgIHRhYmxlLgotICAgICAgICAvLyAzKSBXZSBob3BlIHRoYXQgdGhlIHRhYmxlIHNpemUgZG9lcyBub3QgZXhjZWVkIFVJTlQzMl9NQVguCi0gICAgICAgIEFMT0dFKCJUaW1lLXRvLXNhbXBsZSB0YWJsZSBzaXplIHRvbyBsYXJnZS4iKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKLSAgICB9Ci0KLSAgICAvLyBOb3RlOiBBdCB0aGlzIHBvaW50LCB3ZSBrbm93IHRoYXQgbVRpbWVUb1NhbXBsZUNvdW50ICogMiB3aWxsIG5vdAotICAgIC8vIG92ZXJmbG93IGJlY2F1c2Ugb2YgdGhlIGFib3ZlIGNvbmRpdGlvbi4KLQotICAgIHVpbnQ2NF90IGFsbG9jU2l6ZSA9ICh1aW50NjRfdCltVGltZVRvU2FtcGxlQ291bnQgKiAyICogc2l6ZW9mKHVpbnQzMl90KTsKLSAgICBtVG90YWxTaXplICs9IGFsbG9jU2l6ZTsKLSAgICBpZiAobVRvdGFsU2l6ZSA+IGtNYXhUb3RhbFNpemUpIHsKLSAgICAgICAgQUxPR0UoIlRpbWUtdG8tc2FtcGxlIHRhYmxlIHNpemUgd291bGQgbWFrZSBzYW1wbGUgdGFibGUgdG9vIGxhcmdlLlxuIgotICAgICAgICAgICAgICAiICAgIFJlcXVlc3RlZCB0aW1lLXRvLXNhbXBsZSB0YWJsZSBzaXplID0gJWxsdVxuIgotICAgICAgICAgICAgICAiICAgIEV2ZW50dWFsIHNhbXBsZSB0YWJsZSBzaXplID49ICVsbHVcbiIKLSAgICAgICAgICAgICAgIiAgICBBbGxvd2VkIHNhbXBsZSB0YWJsZSBzaXplID0gJWxsdVxuIiwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhbGxvY1NpemUsCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbVRvdGFsU2l6ZSwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylrTWF4VG90YWxTaXplKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKLSAgICB9Ci0KLSAgICBtVGltZVRvU2FtcGxlID0gbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQzMl90W21UaW1lVG9TYW1wbGVDb3VudCAqIDJdOwotICAgIGlmICghbVRpbWVUb1NhbXBsZSkgewotICAgICAgICBBTE9HRSgiQ2Fubm90IGFsbG9jYXRlIHRpbWUtdG8tc2FtcGxlIHRhYmxlIHdpdGggJWxsdSBlbnRyaWVzLiIsCi0gICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyltVGltZVRvU2FtcGxlQ291bnQpOwotICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOwotICAgIH0KLQotICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0ICsgOCwgbVRpbWVUb1NhbXBsZSwKLSAgICAgICAgICAgIChzaXplX3QpYWxsb2NTaXplKSA8IChzc2l6ZV90KWFsbG9jU2l6ZSkgewotICAgICAgICBBTE9HRSgiSW5jb21wbGV0ZSBkYXRhIHJlYWQgZm9yIHRpbWUtdG8tc2FtcGxlIHRhYmxlLiIpOwotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVGltZVRvU2FtcGxlQ291bnQgKiAyOyArK2kpIHsKLSAgICAgICAgbVRpbWVUb1NhbXBsZVtpXSA9IG50b2hsKG1UaW1lVG9TYW1wbGVbaV0pOwotICAgIH0KLQotICAgIG1IYXNUaW1lVG9TYW1wbGUgPSB0cnVlOwotICAgIHJldHVybiBPSzsKLX0KLQotLy8gTk9URTogcGVyIDE0OTk2LTEyLCB2ZXJzaW9uIDAgY3R0cyBjb250YWlucyB1bnNpZ25lZCB2YWx1ZXMsIHdoaWxlIHZlcnNpb24gMQotLy8gY29udGFpbnMgc2lnbmVkIHZhbHVlcywgaG93ZXZlciBzb21lIHNvZnR3YXJlIGNyZWF0ZXMgdmVyc2lvbiAwIGZpbGVzIHRoYXQKLS8vIGNvbnRhaW4gc2lnbmVkIHZhbHVlcywgc28gd2UncmUgYWx3YXlzIHRyZWF0aW5nIHRoZSB2YWx1ZXMgYXMgc2lnbmVkLAotLy8gcmVnYXJkbGVzcyBvZiB2ZXJzaW9uLgotc3RhdHVzX3QgU2FtcGxlVGFibGU6OnNldENvbXBvc2l0aW9uVGltZVRvU2FtcGxlUGFyYW1zKAotICAgICAgICBvZmY2NF90IGRhdGFfb2Zmc2V0LCBzaXplX3QgZGF0YV9zaXplKSB7Ci0gICAgQUxPR0koIlRoZXJlIGFyZSByZW9yZGVyZWQgZnJhbWVzIHByZXNlbnQuIik7Ci0KLSAgICBpZiAobUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllcyAhPSBOVUxMIHx8IGRhdGFfc2l6ZSA8IDgpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1aW50OF90IGhlYWRlcls4XTsKLSAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkKLSAgICAgICAgICAgIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLQotICAgIHVpbnQzMl90IGZsYWdzID0gVTMyX0FUKGhlYWRlcik7Ci0gICAgdWludDMyX3QgdmVyc2lvbiA9IGZsYWdzID4+IDI0OwotICAgIGZsYWdzICY9IDB4ZmZmZmZmOwotCi0gICAgaWYgKCh2ZXJzaW9uICE9IDAgJiYgdmVyc2lvbiAhPSAxKSB8fCBmbGFncyAhPSAwKSB7Ci0gICAgICAgIC8vIEV4cGVjdGVkIHZlcnNpb24gPSAwIG9yIDEsIGZsYWdzID0gMC4KLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBzaXplX3QgbnVtRW50cmllcyA9IFUzMl9BVCgmaGVhZGVyWzRdKTsKLQotICAgIGlmICgoKFNJWkVfTUFYIC8gOCkgLSAxIDwgbnVtRW50cmllcykgfHwgKGRhdGFfc2l6ZSAhPSAobnVtRW50cmllcyArIDEpICogOCkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBtTnVtQ29tcG9zaXRpb25UaW1lRGVsdGFFbnRyaWVzID0gbnVtRW50cmllczsKLSAgICB1aW50NjRfdCBhbGxvY1NpemUgPSAodWludDY0X3QpbnVtRW50cmllcyAqIDIgKiBzaXplb2YoaW50MzJfdCk7Ci0gICAgaWYgKGFsbG9jU2l6ZSA+IGtNYXhUb3RhbFNpemUpIHsKLSAgICAgICAgQUxPR0UoIkNvbXBvc2l0aW9uLXRpbWUtdG8tc2FtcGxlIHRhYmxlIHNpemUgdG9vIGxhcmdlLiIpOwotICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOwotICAgIH0KLQotICAgIG1Ub3RhbFNpemUgKz0gYWxsb2NTaXplOwotICAgIGlmIChtVG90YWxTaXplID4ga01heFRvdGFsU2l6ZSkgewotICAgICAgICBBTE9HRSgiQ29tcG9zaXRpb24tdGltZS10by1zYW1wbGUgdGFibGUgd291bGQgbWFrZSBzYW1wbGUgdGFibGUgdG9vIGxhcmdlLlxuIgotICAgICAgICAgICAgICAiICAgIFJlcXVlc3RlZCBjb21wb3NpdGlvbi10aW1lLXRvLXNhbXBsZSB0YWJsZSBzaXplID0gJWxsdVxuIgotICAgICAgICAgICAgICAiICAgIEV2ZW50dWFsIHNhbXBsZSB0YWJsZSBzaXplID49ICVsbHVcbiIKLSAgICAgICAgICAgICAgIiAgICBBbGxvd2VkIHNhbXBsZSB0YWJsZSBzaXplID0gJWxsdVxuIiwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhbGxvY1NpemUsCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbVRvdGFsU2l6ZSwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylrTWF4VG90YWxTaXplKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKLSAgICB9Ci0KLSAgICBtQ29tcG9zaXRpb25UaW1lRGVsdGFFbnRyaWVzID0gbmV3IChzdGQ6Om5vdGhyb3cpIGludDMyX3RbMiAqIG51bUVudHJpZXNdOwotICAgIGlmICghbUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllcykgewotICAgICAgICBBTE9HRSgiQ2Fubm90IGFsbG9jYXRlIGNvbXBvc2l0aW9uLXRpbWUtdG8tc2FtcGxlIHRhYmxlIHdpdGggJWxsdSAiCi0gICAgICAgICAgICAgICAgImVudHJpZXMuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyludW1FbnRyaWVzKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKLSAgICB9Ci0KLSAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCArIDgsIG1Db21wb3NpdGlvblRpbWVEZWx0YUVudHJpZXMsCi0gICAgICAgICAgICAoc2l6ZV90KWFsbG9jU2l6ZSkgPCAoc3NpemVfdClhbGxvY1NpemUpIHsKLSAgICAgICAgZGVsZXRlW10gbUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllczsKLSAgICAgICAgbUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllcyA9IE5VTEw7Ci0KLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMiAqIG51bUVudHJpZXM7ICsraSkgewotICAgICAgICBtQ29tcG9zaXRpb25UaW1lRGVsdGFFbnRyaWVzW2ldID0gbnRvaGwobUNvbXBvc2l0aW9uVGltZURlbHRhRW50cmllc1tpXSk7Ci0gICAgfQotCi0gICAgbUNvbXBvc2l0aW9uRGVsdGFMb29rdXAtPnNldEVudHJpZXMoCi0gICAgICAgICAgICBtQ29tcG9zaXRpb25UaW1lRGVsdGFFbnRyaWVzLCBtTnVtQ29tcG9zaXRpb25UaW1lRGVsdGFFbnRyaWVzKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU2FtcGxlVGFibGU6OnNldFN5bmNTYW1wbGVQYXJhbXMob2ZmNjRfdCBkYXRhX29mZnNldCwgc2l6ZV90IGRhdGFfc2l6ZSkgewotICAgIGlmIChtU3luY1NhbXBsZU9mZnNldCA+PSAwIHx8IGRhdGFfc2l6ZSA8IDgpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1aW50OF90IGhlYWRlcls4XTsKLSAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgewotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotCi0gICAgaWYgKFUzMl9BVChoZWFkZXIpICE9IDApIHsKLSAgICAgICAgLy8gRXhwZWN0ZWQgdmVyc2lvbiA9IDAsIGZsYWdzID0gMC4KLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBudW1TeW5jU2FtcGxlcyA9IFUzMl9BVCgmaGVhZGVyWzRdKTsKLQotICAgIGlmIChudW1TeW5jU2FtcGxlcyA8IDIpIHsKLSAgICAgICAgQUxPR1YoIlRhYmxlIG9mIHN5bmMgc2FtcGxlcyBpcyBlbXB0eSBvciBoYXMgb25seSBhIHNpbmdsZSBlbnRyeSEiKTsKLSAgICB9Ci0KLSAgICB1aW50NjRfdCBhbGxvY1NpemUgPSAodWludDY0X3QpbnVtU3luY1NhbXBsZXMgKiBzaXplb2YodWludDMyX3QpOwotICAgIGlmIChhbGxvY1NpemUgPiBrTWF4VG90YWxTaXplKSB7Ci0gICAgICAgIEFMT0dFKCJTeW5jIHNhbXBsZSB0YWJsZSBzaXplIHRvbyBsYXJnZS4iKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKLSAgICB9Ci0KLSAgICBtVG90YWxTaXplICs9IGFsbG9jU2l6ZTsKLSAgICBpZiAobVRvdGFsU2l6ZSA+IGtNYXhUb3RhbFNpemUpIHsKLSAgICAgICAgQUxPR0UoIlN5bmMgc2FtcGxlIHRhYmxlIHNpemUgd291bGQgbWFrZSBzYW1wbGUgdGFibGUgdG9vIGxhcmdlLlxuIgotICAgICAgICAgICAgICAiICAgIFJlcXVlc3RlZCBzeW5jIHNhbXBsZSB0YWJsZSBzaXplID0gJWxsdVxuIgotICAgICAgICAgICAgICAiICAgIEV2ZW50dWFsIHNhbXBsZSB0YWJsZSBzaXplID49ICVsbHVcbiIKLSAgICAgICAgICAgICAgIiAgICBBbGxvd2VkIHNhbXBsZSB0YWJsZSBzaXplID0gJWxsdVxuIiwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhbGxvY1NpemUsCi0gICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbVRvdGFsU2l6ZSwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylrTWF4VG90YWxTaXplKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKLSAgICB9Ci0KLSAgICBtU3luY1NhbXBsZXMgPSBuZXcgKHN0ZDo6bm90aHJvdykgdWludDMyX3RbbnVtU3luY1NhbXBsZXNdOwotICAgIGlmICghbVN5bmNTYW1wbGVzKSB7Ci0gICAgICAgIEFMT0dFKCJDYW5ub3QgYWxsb2NhdGUgc3luYyBzYW1wbGUgdGFibGUgd2l0aCAlbGx1IGVudHJpZXMuIiwKLSAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW51bVN5bmNTYW1wbGVzKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKLSAgICB9Ci0KLSAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCArIDgsIG1TeW5jU2FtcGxlcywKLSAgICAgICAgICAgIChzaXplX3QpYWxsb2NTaXplKSAhPSAoc3NpemVfdClhbGxvY1NpemUpIHsKLSAgICAgICAgZGVsZXRlW10gbVN5bmNTYW1wbGVzOwotICAgICAgICBtU3luY1NhbXBsZXMgPSBOVUxMOwotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TeW5jU2FtcGxlczsgKytpKSB7Ci0gICAgICAgIGlmIChtU3luY1NhbXBsZXNbaV0gPT0gMCkgewotICAgICAgICAgICAgQUxPR0UoImIvMzI0MjM4NjIsIHVuZXhwZWN0ZWQgemVybyB2YWx1ZSBpbiBzdHNzIik7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBtU3luY1NhbXBsZXNbaV0gPSBudG9obChtU3luY1NhbXBsZXNbaV0pIC0gMTsKLSAgICB9Ci0KLSAgICBtU3luY1NhbXBsZU9mZnNldCA9IGRhdGFfb2Zmc2V0OwotICAgIG1OdW1TeW5jU2FtcGxlcyA9IG51bVN5bmNTYW1wbGVzOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi11aW50MzJfdCBTYW1wbGVUYWJsZTo6Y291bnRDaHVua09mZnNldHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1OdW1DaHVua09mZnNldHM7Ci19Ci0KLXVpbnQzMl90IFNhbXBsZVRhYmxlOjpjb3VudFNhbXBsZXMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1OdW1TYW1wbGVTaXplczsKLX0KLQotc3RhdHVzX3QgU2FtcGxlVGFibGU6OmdldE1heFNhbXBsZVNpemUoc2l6ZV90ICptYXhfc2l6ZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAqbWF4X3NpemUgPSAwOwotCi0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1OdW1TYW1wbGVTaXplczsgKytpKSB7Ci0gICAgICAgIHNpemVfdCBzYW1wbGVfc2l6ZTsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gZ2V0U2FtcGxlU2l6ZV9sKGksICZzYW1wbGVfc2l6ZSk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzYW1wbGVfc2l6ZSA+ICptYXhfc2l6ZSkgewotICAgICAgICAgICAgKm1heF9zaXplID0gc2FtcGxlX3NpemU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXVpbnQzMl90IGFic19kaWZmZXJlbmNlKHVpbnQzMl90IHRpbWUxLCB1aW50MzJfdCB0aW1lMikgewotICAgIHJldHVybiB0aW1lMSA+IHRpbWUyID8gdGltZTEgLSB0aW1lMiA6IHRpbWUyIC0gdGltZTE7Ci19Ci0KLS8vIHN0YXRpYwotaW50IFNhbXBsZVRhYmxlOjpDb21wYXJlSW5jcmVhc2luZ1RpbWUoY29uc3Qgdm9pZCAqX2EsIGNvbnN0IHZvaWQgKl9iKSB7Ci0gICAgY29uc3QgU2FtcGxlVGltZUVudHJ5ICphID0gKGNvbnN0IFNhbXBsZVRpbWVFbnRyeSAqKV9hOwotICAgIGNvbnN0IFNhbXBsZVRpbWVFbnRyeSAqYiA9IChjb25zdCBTYW1wbGVUaW1lRW50cnkgKilfYjsKLQotICAgIGlmIChhLT5tQ29tcG9zaXRpb25UaW1lIDwgYi0+bUNvbXBvc2l0aW9uVGltZSkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIGlmIChhLT5tQ29tcG9zaXRpb25UaW1lID4gYi0+bUNvbXBvc2l0aW9uVGltZSkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBTYW1wbGVUYWJsZTo6YnVpbGRTYW1wbGVFbnRyaWVzVGFibGUoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtU2FtcGxlVGltZUVudHJpZXMgIT0gTlVMTCB8fCBtTnVtU2FtcGxlU2l6ZXMgPT0gMCkgewotICAgICAgICBpZiAobU51bVNhbXBsZVNpemVzID09IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJiLzIzMjQ3MDU1LCBtTnVtU2FtcGxlU2l6ZXMoJXUpIiwgbU51bVNhbXBsZVNpemVzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbVRvdGFsU2l6ZSArPSAodWludDY0X3QpbU51bVNhbXBsZVNpemVzICogc2l6ZW9mKFNhbXBsZVRpbWVFbnRyeSk7Ci0gICAgaWYgKG1Ub3RhbFNpemUgPiBrTWF4VG90YWxTaXplKSB7Ci0gICAgICAgIEFMT0dFKCJTYW1wbGUgZW50cnkgdGFibGUgc2l6ZSB3b3VsZCBtYWtlIHNhbXBsZSB0YWJsZSB0b28gbGFyZ2UuXG4iCi0gICAgICAgICAgICAgICIgICAgUmVxdWVzdGVkIHNhbXBsZSBlbnRyeSB0YWJsZSBzaXplID0gJWxsdVxuIgotICAgICAgICAgICAgICAiICAgIEV2ZW50dWFsIHNhbXBsZSB0YWJsZSBzaXplID49ICVsbHVcbiIKLSAgICAgICAgICAgICAgIiAgICBBbGxvd2VkIHNhbXBsZSB0YWJsZSBzaXplID0gJWxsdVxuIiwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyltTnVtU2FtcGxlU2l6ZXMgKiBzaXplb2YoU2FtcGxlVGltZUVudHJ5KSwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyltVG90YWxTaXplLAotICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWtNYXhUb3RhbFNpemUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbVNhbXBsZVRpbWVFbnRyaWVzID0gbmV3IChzdGQ6Om5vdGhyb3cpIFNhbXBsZVRpbWVFbnRyeVttTnVtU2FtcGxlU2l6ZXNdOwotICAgIGlmICghbVNhbXBsZVRpbWVFbnRyaWVzKSB7Ci0gICAgICAgIEFMT0dFKCJDYW5ub3QgYWxsb2NhdGUgc2FtcGxlIGVudHJ5IHRhYmxlIHdpdGggJWxsdSBlbnRyaWVzLiIsCi0gICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyltTnVtU2FtcGxlU2l6ZXMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdWludDMyX3Qgc2FtcGxlSW5kZXggPSAwOwotICAgIHVpbnQzMl90IHNhbXBsZVRpbWUgPSAwOwotCi0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1UaW1lVG9TYW1wbGVDb3VudDsgKytpKSB7Ci0gICAgICAgIHVpbnQzMl90IG4gPSBtVGltZVRvU2FtcGxlWzIgKiBpXTsKLSAgICAgICAgdWludDMyX3QgZGVsdGEgPSBtVGltZVRvU2FtcGxlWzIgKiBpICsgMV07Ci0KLSAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IG47ICsraikgewotICAgICAgICAgICAgaWYgKHNhbXBsZUluZGV4IDwgbU51bVNhbXBsZVNpemVzKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGVjaG5pY2FsbHkgdGhpcyBzaG91bGQgYWx3YXlzIGJlIHRoZSBjYXNlIGlmIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgLy8gaXMgd2VsbC1mb3JtZWQsIGJ1dCB5b3Uga25vdy4uLiB0aGVyZSdzIChnYXNwKSBtYWxmb3JtZWQKLSAgICAgICAgICAgICAgICAvLyBjb250ZW50IG91dCB0aGVyZS4KLQotICAgICAgICAgICAgICAgIG1TYW1wbGVUaW1lRW50cmllc1tzYW1wbGVJbmRleF0ubVNhbXBsZUluZGV4ID0gc2FtcGxlSW5kZXg7Ci0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGNvbXBUaW1lRGVsdGEgPQotICAgICAgICAgICAgICAgICAgICBtQ29tcG9zaXRpb25EZWx0YUxvb2t1cC0+Z2V0Q29tcG9zaXRpb25UaW1lT2Zmc2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUluZGV4KTsKLQotICAgICAgICAgICAgICAgIGlmICgoY29tcFRpbWVEZWx0YSA8IDAgJiYgc2FtcGxlVGltZSA8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoY29tcFRpbWVEZWx0YSA9PSBJTlQzMl9NSU4gPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMl9NQVggOiB1aW50MzJfdCgtY29tcFRpbWVEZWx0YSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGNvbXBUaW1lRGVsdGEgPiAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUgPiBVSU5UMzJfTUFYIC0gY29tcFRpbWVEZWx0YSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiV1ICsgJWQgd291bGQgb3ZlcmZsb3csIGNsYW1waW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lLCBjb21wVGltZURlbHRhKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBUaW1lRGVsdGEgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUgPSBVSU5UMzJfTUFYOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBUaW1lRGVsdGEgPSAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1TYW1wbGVUaW1lRW50cmllc1tzYW1wbGVJbmRleF0ubUNvbXBvc2l0aW9uVGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21wVGltZURlbHRhID4gMCA/IHNhbXBsZVRpbWUgKyBjb21wVGltZURlbHRhOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lIC0gKC1jb21wVGltZURlbHRhKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgKytzYW1wbGVJbmRleDsKLSAgICAgICAgICAgIGlmIChzYW1wbGVUaW1lID4gVUlOVDMyX01BWCAtIGRlbHRhKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiV1ICsgJXUgd291bGQgb3ZlcmZsb3csIGNsYW1waW5nIiwKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSwgZGVsdGEpOwotICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUgPSBVSU5UMzJfTUFYOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzYW1wbGVUaW1lICs9IGRlbHRhOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcXNvcnQobVNhbXBsZVRpbWVFbnRyaWVzLCBtTnVtU2FtcGxlU2l6ZXMsIHNpemVvZihTYW1wbGVUaW1lRW50cnkpLAotICAgICAgICAgIENvbXBhcmVJbmNyZWFzaW5nVGltZSk7Ci19Ci0KLXN0YXR1c190IFNhbXBsZVRhYmxlOjpmaW5kU2FtcGxlQXRUaW1lKAotICAgICAgICB1aW50NjRfdCByZXFfdGltZSwgdWludDY0X3Qgc2NhbGVfbnVtLCB1aW50NjRfdCBzY2FsZV9kZW4sCi0gICAgICAgIHVpbnQzMl90ICpzYW1wbGVfaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgYnVpbGRTYW1wbGVFbnRyaWVzVGFibGUoKTsKLQotICAgIGlmIChtU2FtcGxlVGltZUVudHJpZXMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOwotICAgIH0KLQotICAgIHVpbnQzMl90IGxlZnQgPSAwOwotICAgIHVpbnQzMl90IHJpZ2h0X3BsdXNfb25lID0gbU51bVNhbXBsZVNpemVzOwotICAgIHdoaWxlIChsZWZ0IDwgcmlnaHRfcGx1c19vbmUpIHsKLSAgICAgICAgdWludDMyX3QgY2VudGVyID0gbGVmdCArIChyaWdodF9wbHVzX29uZSAtIGxlZnQpIC8gMjsKLSAgICAgICAgdWludDY0X3QgY2VudGVyVGltZSA9Ci0gICAgICAgICAgICBnZXRTYW1wbGVUaW1lKGNlbnRlciwgc2NhbGVfbnVtLCBzY2FsZV9kZW4pOwotCi0gICAgICAgIGlmIChyZXFfdGltZSA8IGNlbnRlclRpbWUpIHsKLSAgICAgICAgICAgIHJpZ2h0X3BsdXNfb25lID0gY2VudGVyOwotICAgICAgICB9IGVsc2UgaWYgKHJlcV90aW1lID4gY2VudGVyVGltZSkgewotICAgICAgICAgICAgbGVmdCA9IGNlbnRlciArIDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqc2FtcGxlX2luZGV4ID0gbVNhbXBsZVRpbWVFbnRyaWVzW2NlbnRlcl0ubVNhbXBsZUluZGV4OwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdWludDMyX3QgY2xvc2VzdEluZGV4ID0gbGVmdDsKLQotICAgIGlmIChjbG9zZXN0SW5kZXggPT0gbU51bVNhbXBsZVNpemVzKSB7Ci0gICAgICAgIGlmIChmbGFncyA9PSBrRmxhZ0FmdGVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOwotICAgICAgICB9Ci0gICAgICAgIGZsYWdzID0ga0ZsYWdCZWZvcmU7Ci0gICAgfSBlbHNlIGlmIChjbG9zZXN0SW5kZXggPT0gMCkgewotICAgICAgICBpZiAoZmxhZ3MgPT0ga0ZsYWdCZWZvcmUpIHsKLSAgICAgICAgICAgIC8vIG5vcm1hbGx5IHdlIHNob3VsZCByZXR1cm4gb3V0IG9mIHJhbmdlLCBidXQgdGhhdCBpcwotICAgICAgICAgICAgLy8gdHJlYXRlZCBhcyBlbmQtb2Ytc3RyZWFtLiAgaW5zdGVhZCByZXR1cm4gZmlyc3Qgc2FtcGxlCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKLSAgICAgICAgfQotICAgICAgICBmbGFncyA9IGtGbGFnQWZ0ZXI7Ci0gICAgfQotCi0gICAgc3dpdGNoIChmbGFncykgewotICAgICAgICBjYXNlIGtGbGFnQmVmb3JlOgotICAgICAgICB7Ci0gICAgICAgICAgICAtLWNsb3Nlc3RJbmRleDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrRmxhZ0FmdGVyOgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLKGZsYWdzID09IGtGbGFnQ2xvc2VzdCk7Ci0gICAgICAgICAgICAvLyBwaWNrIGNsb3Nlc3QgYmFzZWQgb24gdGltZXN0YW1wLiB1c2UgYWJzX2RpZmZlcmVuY2UgZm9yIHNhZmV0eQotICAgICAgICAgICAgaWYgKGFic19kaWZmZXJlbmNlKAotICAgICAgICAgICAgICAgICAgICBnZXRTYW1wbGVUaW1lKGNsb3Nlc3RJbmRleCwgc2NhbGVfbnVtLCBzY2FsZV9kZW4pLCByZXFfdGltZSkgPgotICAgICAgICAgICAgICAgIGFic19kaWZmZXJlbmNlKAotICAgICAgICAgICAgICAgICAgICByZXFfdGltZSwgZ2V0U2FtcGxlVGltZShjbG9zZXN0SW5kZXggLSAxLCBzY2FsZV9udW0sIHNjYWxlX2RlbikpKSB7Ci0gICAgICAgICAgICAgICAgLS1jbG9zZXN0SW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgICpzYW1wbGVfaW5kZXggPSBtU2FtcGxlVGltZUVudHJpZXNbY2xvc2VzdEluZGV4XS5tU2FtcGxlSW5kZXg7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTYW1wbGVUYWJsZTo6ZmluZFN5bmNTYW1wbGVOZWFyKAotICAgICAgICB1aW50MzJfdCBzdGFydF9zYW1wbGVfaW5kZXgsIHVpbnQzMl90ICpzYW1wbGVfaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgICpzYW1wbGVfaW5kZXggPSAwOwotCi0gICAgaWYgKG1TeW5jU2FtcGxlT2Zmc2V0IDwgMCkgewotICAgICAgICAvLyBBbGwgc2FtcGxlcyBhcmUgc3luYy1zYW1wbGVzLgotICAgICAgICAqc2FtcGxlX2luZGV4ID0gc3RhcnRfc2FtcGxlX2luZGV4OwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgaWYgKG1OdW1TeW5jU2FtcGxlcyA9PSAwKSB7Ci0gICAgICAgICpzYW1wbGVfaW5kZXggPSAwOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgdWludDMyX3QgbGVmdCA9IDA7Ci0gICAgdWludDMyX3QgcmlnaHRfcGx1c19vbmUgPSBtTnVtU3luY1NhbXBsZXM7Ci0gICAgd2hpbGUgKGxlZnQgPCByaWdodF9wbHVzX29uZSkgewotICAgICAgICB1aW50MzJfdCBjZW50ZXIgPSBsZWZ0ICsgKHJpZ2h0X3BsdXNfb25lIC0gbGVmdCkgLyAyOwotICAgICAgICB1aW50MzJfdCB4ID0gbVN5bmNTYW1wbGVzW2NlbnRlcl07Ci0KLSAgICAgICAgaWYgKHN0YXJ0X3NhbXBsZV9pbmRleCA8IHgpIHsKLSAgICAgICAgICAgIHJpZ2h0X3BsdXNfb25lID0gY2VudGVyOwotICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0X3NhbXBsZV9pbmRleCA+IHgpIHsKLSAgICAgICAgICAgIGxlZnQgPSBjZW50ZXIgKyAxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKnNhbXBsZV9pbmRleCA9IHg7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobGVmdCA9PSBtTnVtU3luY1NhbXBsZXMpIHsKLSAgICAgICAgaWYgKGZsYWdzID09IGtGbGFnQWZ0ZXIpIHsKLSAgICAgICAgICAgIEFMT0dFKCJ0cmllZCB0byBmaW5kIGEgc3luYyBmcmFtZSBhZnRlciB0aGUgbGFzdCBvbmU6ICVkIiwgbGVmdCk7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOwotICAgICAgICB9Ci0gICAgICAgIGZsYWdzID0ga0ZsYWdCZWZvcmU7Ci0gICAgfQotICAgIGVsc2UgaWYgKGxlZnQgPT0gMCkgewotICAgICAgICBpZiAoZmxhZ3MgPT0ga0ZsYWdCZWZvcmUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJ0cmllZCB0byBmaW5kIGEgc3luYyBmcmFtZSBiZWZvcmUgdGhlIGZpcnN0IG9uZTogJWQiLCBsZWZ0KTsKLQotICAgICAgICAgICAgLy8gbm9ybWFsbHkgd2Ugc2hvdWxkIHJldHVybiBvdXQgb2YgcmFuZ2UsIGJ1dCB0aGF0IGlzCi0gICAgICAgICAgICAvLyB0cmVhdGVkIGFzIGVuZC1vZi1zdHJlYW0uICBpbnN0ZWFkIHNlZWsgdG8gZmlyc3Qgc3luYwotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7Ci0gICAgICAgIH0KLSAgICAgICAgZmxhZ3MgPSBrRmxhZ0FmdGVyOwotICAgIH0KLQotICAgIC8vIE5vdyBzc2lbbGVmdCAtIDFdIDwoPSkgc3RhcnRfc2FtcGxlX2luZGV4IDw9IHNzaVtsZWZ0XQotICAgIHN3aXRjaCAoZmxhZ3MpIHsKLSAgICAgICAgY2FzZSBrRmxhZ0JlZm9yZToKLSAgICAgICAgewotICAgICAgICAgICAgLS1sZWZ0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBrRmxhZ0FmdGVyOgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyB0aGlzIHJvdXRlIGlzIG5vdCB1c2VkLCBidXQgaW1wbGVtZW50IGl0IG5vbmV0aGVsZXNzCi0gICAgICAgICAgICBDSEVDSyhmbGFncyA9PSBrRmxhZ0Nsb3Nlc3QpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU2FtcGxlSXRlcmF0b3ItPnNlZWtUbyhzdGFydF9zYW1wbGVfaW5kZXgpOwotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOwotCi0gICAgICAgICAgICBlcnIgPSBtU2FtcGxlSXRlcmF0b3ItPnNlZWtUbyhtU3luY1NhbXBsZXNbbGVmdF0pOwotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1aW50MzJfdCB1cHBlcl90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7Ci0KLSAgICAgICAgICAgIGVyciA9IG1TYW1wbGVJdGVyYXRvci0+c2Vla1RvKG1TeW5jU2FtcGxlc1tsZWZ0IC0gMV0pOwotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1aW50MzJfdCBsb3dlcl90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7Ci0KLSAgICAgICAgICAgIC8vIHVzZSBhYnNfZGlmZmVyZW5jZSBmb3Igc2FmZXR5Ci0gICAgICAgICAgICBpZiAoYWJzX2RpZmZlcmVuY2UodXBwZXJfdGltZSwgc2FtcGxlX3RpbWUpID4KLSAgICAgICAgICAgICAgICBhYnNfZGlmZmVyZW5jZShzYW1wbGVfdGltZSwgbG93ZXJfdGltZSkpIHsKLSAgICAgICAgICAgICAgICAtLWxlZnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgICpzYW1wbGVfaW5kZXggPSBtU3luY1NhbXBsZXNbbGVmdF07Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTYW1wbGVUYWJsZTo6ZmluZFRodW1ibmFpbFNhbXBsZSh1aW50MzJfdCAqc2FtcGxlX2luZGV4KSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtU3luY1NhbXBsZU9mZnNldCA8IDApIHsKLSAgICAgICAgLy8gQWxsIHNhbXBsZXMgYXJlIHN5bmMtc2FtcGxlcy4KLSAgICAgICAgKnNhbXBsZV9pbmRleCA9IDA7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBiZXN0U2FtcGxlSW5kZXggPSAwOwotICAgIHNpemVfdCBtYXhTYW1wbGVTaXplID0gMDsKLQotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heE51bVN5bmNTYW1wbGVzVG9TY2FuID0gMjA7Ci0KLSAgICAvLyBDb25zaWRlciB0aGUgZmlyc3Qga01heE51bVN5bmNTYW1wbGVzVG9TY2FuIHN5bmMgc2FtcGxlcyBhbmQKLSAgICAvLyBwaWNrIHRoZSBvbmUgd2l0aCB0aGUgbGFyZ2VzdCAoY29tcHJlc3NlZCkgc2l6ZSBhcyB0aGUgdGh1bWJuYWlsLgotCi0gICAgc2l6ZV90IG51bVNhbXBsZXNUb1NjYW4gPSBtTnVtU3luY1NhbXBsZXM7Ci0gICAgaWYgKG51bVNhbXBsZXNUb1NjYW4gPiBrTWF4TnVtU3luY1NhbXBsZXNUb1NjYW4pIHsKLSAgICAgICAgbnVtU2FtcGxlc1RvU2NhbiA9IGtNYXhOdW1TeW5jU2FtcGxlc1RvU2NhbjsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVNhbXBsZXNUb1NjYW47ICsraSkgewotICAgICAgICB1aW50MzJfdCB4ID0gbVN5bmNTYW1wbGVzW2ldOwotCi0gICAgICAgIC8vIE5vdyB4IGlzIGEgc2FtcGxlIGluZGV4LgotICAgICAgICBzaXplX3Qgc2FtcGxlU2l6ZTsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gZ2V0U2FtcGxlU2l6ZV9sKHgsICZzYW1wbGVTaXplKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpID09IDAgfHwgc2FtcGxlU2l6ZSA+IG1heFNhbXBsZVNpemUpIHsKLSAgICAgICAgICAgIGJlc3RTYW1wbGVJbmRleCA9IHg7Ci0gICAgICAgICAgICBtYXhTYW1wbGVTaXplID0gc2FtcGxlU2l6ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgICpzYW1wbGVfaW5kZXggPSBiZXN0U2FtcGxlSW5kZXg7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFNhbXBsZVRhYmxlOjpnZXRTYW1wbGVTaXplX2woCi0gICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4LCBzaXplX3QgKnNhbXBsZVNpemUpIHsKLSAgICByZXR1cm4gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVTaXplRGlyZWN0KAotICAgICAgICAgICAgc2FtcGxlSW5kZXgsIHNhbXBsZVNpemUpOwotfQotCi1zdGF0dXNfdCBTYW1wbGVUYWJsZTo6Z2V0TWV0YURhdGFGb3JTYW1wbGUoCi0gICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4LAotICAgICAgICBvZmY2NF90ICpvZmZzZXQsCi0gICAgICAgIHNpemVfdCAqc2l6ZSwKLSAgICAgICAgdWludDMyX3QgKmNvbXBvc2l0aW9uVGltZSwKLSAgICAgICAgYm9vbCAqaXNTeW5jU2FtcGxlLAotICAgICAgICB1aW50MzJfdCAqc2FtcGxlRHVyYXRpb24pIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgc3RhdHVzX3QgZXJyOwotICAgIGlmICgoZXJyID0gbVNhbXBsZUl0ZXJhdG9yLT5zZWVrVG8oc2FtcGxlSW5kZXgpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChvZmZzZXQpIHsKLSAgICAgICAgKm9mZnNldCA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlT2Zmc2V0KCk7Ci0gICAgfQotCi0gICAgaWYgKHNpemUpIHsKLSAgICAgICAgKnNpemUgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZVNpemUoKTsKLSAgICB9Ci0KLSAgICBpZiAoY29tcG9zaXRpb25UaW1lKSB7Ci0gICAgICAgICpjb21wb3NpdGlvblRpbWUgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZVRpbWUoKTsKLSAgICB9Ci0KLSAgICBpZiAoaXNTeW5jU2FtcGxlKSB7Ci0gICAgICAgICppc1N5bmNTYW1wbGUgPSBmYWxzZTsKLSAgICAgICAgaWYgKG1TeW5jU2FtcGxlT2Zmc2V0IDwgMCkgewotICAgICAgICAgICAgLy8gRXZlcnkgc2FtcGxlIGlzIGEgc3luYyBzYW1wbGUuCi0gICAgICAgICAgICAqaXNTeW5jU2FtcGxlID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNpemVfdCBpID0gKG1MYXN0U3luY1NhbXBsZUluZGV4IDwgbU51bVN5bmNTYW1wbGVzKQotICAgICAgICAgICAgICAgICAgICAmJiAobVN5bmNTYW1wbGVzW21MYXN0U3luY1NhbXBsZUluZGV4XSA8PSBzYW1wbGVJbmRleCkKLSAgICAgICAgICAgICAgICA/IG1MYXN0U3luY1NhbXBsZUluZGV4IDogMDsKLQotICAgICAgICAgICAgd2hpbGUgKGkgPCBtTnVtU3luY1NhbXBsZXMgJiYgbVN5bmNTYW1wbGVzW2ldIDwgc2FtcGxlSW5kZXgpIHsKLSAgICAgICAgICAgICAgICArK2k7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpIDwgbU51bVN5bmNTYW1wbGVzICYmIG1TeW5jU2FtcGxlc1tpXSA9PSBzYW1wbGVJbmRleCkgewotICAgICAgICAgICAgICAgICppc1N5bmNTYW1wbGUgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtTGFzdFN5bmNTYW1wbGVJbmRleCA9IGk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoc2FtcGxlRHVyYXRpb24pIHsKLSAgICAgICAgKnNhbXBsZUR1cmF0aW9uID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVEdXJhdGlvbigpOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotaW50MzJfdCBTYW1wbGVUYWJsZTo6Z2V0Q29tcG9zaXRpb25UaW1lT2Zmc2V0KHVpbnQzMl90IHNhbXBsZUluZGV4KSB7Ci0gICAgcmV0dXJuIG1Db21wb3NpdGlvbkRlbHRhTG9va3VwLT5nZXRDb21wb3NpdGlvblRpbWVPZmZzZXQoc2FtcGxlSW5kZXgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuY3BwCmluZGV4IDkwYjg2MDMuLjQwNGM1MzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TaW1wbGVEZWNvZGluZ1NvdXJjZS5jcHAKQEAgLTE0LDYgKzE0LDEwIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlNpbXBsZURlY29kaW5nU291cmNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KQEAgLTM2LDE0ICs0MCwxNCBAQAogCiAvL3N0YXRpYwogc3A8U2ltcGxlRGVjb2RpbmdTb3VyY2U+IFNpbXBsZURlY29kaW5nU291cmNlOjpDcmVhdGUoCi0gICAgICAgIGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsIHVpbnQzMl90IGZsYWdzKSB7CiAgICAgcmV0dXJuIFNpbXBsZURlY29kaW5nU291cmNlOjpDcmVhdGUoc291cmNlLCBmbGFncywgbnVsbHB0ciwgbnVsbHB0cik7CiB9CiAKIC8vc3RhdGljCiBzcDxTaW1wbGVEZWNvZGluZ1NvdXJjZT4gU2ltcGxlRGVjb2RpbmdTb3VyY2U6OkNyZWF0ZSgKLSAgICAgICAgY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlLCB1aW50MzJfdCBmbGFncywgY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4gJm5hdGl2ZVdpbmRvdywKLSAgICAgICAgY29uc3QgY2hhciAqZGVzaXJlZENvZGVjKSB7CisgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLCB1aW50MzJfdCBmbGFncywgY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4gJm5hdGl2ZVdpbmRvdywKKyAgICAgICAgY29uc3QgY2hhciAqZGVzaXJlZENvZGVjLCBib29sIHNraXBNZWRpYUNvZGVjTGlzdCkgewogICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UgPSBzdGF0aWNfY2FzdDxTdXJmYWNlKj4obmF0aXZlV2luZG93LmdldCgpKTsKICAgICBjb25zdCBjaGFyICptaW1lID0gTlVMTDsKICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IHNvdXJjZS0+Z2V0Rm9ybWF0KCk7CkBAIC02Myw2ICs2NywzMyBAQAogICAgIGxvb3Blci0+c3RhcnQoKTsKIAogICAgIHNwPE1lZGlhQ29kZWM+IGNvZGVjOworICAgIGF1dG8gY29uZmlndXJlID0gWz1dKGNvbnN0IHNwPE1lZGlhQ29kZWM+ICZjb2RlYywgY29uc3QgQVN0cmluZyAmY29tcG9uZW50TmFtZSkKKyAgICAgICAgICAgIC0+IHNwPFNpbXBsZURlY29kaW5nU291cmNlPiB7CisgICAgICAgIGlmIChjb2RlYyAhPSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HSSgiU3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZCBjb2RlYyAnJXMnIiwgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKKworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gY29kZWMtPmNvbmZpZ3VyZShmb3JtYXQsIHN1cmZhY2UsIE5VTEwgLyogY3J5cHRvICovLCAwIC8qIGZsYWdzICovKTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBvdXRGb3JtYXQ7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgZXJyID0gY29kZWMtPmdldE91dHB1dEZvcm1hdCgmb3V0Rm9ybWF0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZURlY29kaW5nU291cmNlKGNvZGVjLCBzb3VyY2UsIGxvb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UgIT0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpID09IDAsCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRGb3JtYXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIGNvbmZpZ3VyZSBjb2RlYyAnJXMnIiwgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIGNvZGVjLT5yZWxlYXNlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfTsKKworICAgIGlmIChza2lwTWVkaWFDb2RlY0xpc3QpIHsKKyAgICAgICAgY29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUobG9vcGVyLCBkZXNpcmVkQ29kZWMpOworICAgICAgICByZXR1cm4gY29uZmlndXJlKGNvZGVjLCBkZXNpcmVkQ29kZWMpOworICAgIH0KIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0Y2hpbmdDb2RlY3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgY29uc3QgQVN0cmluZyAmY29tcG9uZW50TmFtZSA9IG1hdGNoaW5nQ29kZWNzW2ldOwpAQCAtNzMsMjIgKzEwNCwxMCBAQAogICAgICAgICBBTE9HVigiQXR0ZW1wdGluZyB0byBhbGxvY2F0ZSBjb2RlYyAnJXMnIiwgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKIAogICAgICAgICBjb2RlYyA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZShsb29wZXIsIGNvbXBvbmVudE5hbWUpOwotICAgICAgICBpZiAoY29kZWMgIT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0koIlN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQgY29kZWMgJyVzJyIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGNvZGVjLT5jb25maWd1cmUoZm9ybWF0LCBzdXJmYWNlLCBOVUxMIC8qIGNyeXB0byAqLywgMCAvKiBmbGFncyAqLyk7Ci0gICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gY29kZWMtPmdldE91dHB1dEZvcm1hdCgmZm9ybWF0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZURlY29kaW5nU291cmNlKGNvZGVjLCBzb3VyY2UsIGxvb3BlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UgIT0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpID09IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIGNvbmZpZ3VyZSBjb2RlYyAnJXMnIiwgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgIGNvZGVjLT5yZWxlYXNlKCk7CisgICAgICAgIHNwPFNpbXBsZURlY29kaW5nU291cmNlPiByZXMgPSBjb25maWd1cmUoY29kZWMsIGNvbXBvbmVudE5hbWUpOworICAgICAgICBpZiAocmVzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjb2RlYyA9IE5VTEw7CiAgICAgICAgIH0KICAgICB9CkBAIC05OSw3ICsxMTgsNyBAQAogfQogCiBTaW1wbGVEZWNvZGluZ1NvdXJjZTo6U2ltcGxlRGVjb2RpbmdTb3VyY2UoCi0gICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWM+ICZjb2RlYywgY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlLCBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLAorICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjPiAmY29kZWMsIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLCBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLAogICAgICAgICBib29sIHVzaW5nU3VyZmFjZSwgYm9vbCBpc1ZvcmJpcywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpCiAgICAgOiBtQ29kZWMoY29kZWMpLAogICAgICAgbVNvdXJjZShzb3VyY2UpLApAQCAtMTgxLDcgKzIwMCw3IEBACiB9CiAKIHN0YXR1c190IFNpbXBsZURlY29kaW5nU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpidWZmZXIgPSBOVUxMOwogCiAgICAgTXV0ZXhlZDxQcm90ZWN0ZWRTdGF0ZT46OkxvY2tlZCBtZShtUHJvdGVjdGVkU3RhdGUpOwpAQCAtMjAyLDcgKzIyMSw3IEBACiB9CiAKIHN0YXR1c190IFNpbXBsZURlY29kaW5nU291cmNlOjpkb1JlYWQoCi0gICAgICAgIE11dGV4ZWQ8UHJvdGVjdGVkU3RhdGU+OjpMb2NrZWQgJm1lLCBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICAgICAgTXV0ZXhlZDxQcm90ZWN0ZWRTdGF0ZT46OkxvY2tlZCAmbWUsIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICAvLyB8bWV8IGlzIGFsd2F5cyBsb2NrZWQgb24gZW50cnksIGJ1dCBpcyBhbGxvd2VkIHRvIGJlIHVubG9ja2VkIG9uIGV4aXQKICAgICBDSEVDS19FUShtZS0+bVN0YXRlLCBTVEFSVEVEKTsKIApAQCAtMjEyLDcgKzIzMSw3IEBACiAgICAgc3RhdHVzX3QgcmVzOwogCiAgICAgLy8gZmx1c2ggY29kZWMgb24gc2VlawotICAgIElNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CisgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwogICAgIGlmIChvcHRpb25zICE9IE5VTEwgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZvdXRfcHRzLCAmbW9kZSkpIHsKICAgICAgICAgbWUtPm1RdWV1ZWRJbnB1dEVPUyA9IGZhbHNlOwogICAgICAgICBtZS0+bUdvdE91dHB1dEVPUyA9IGZhbHNlOwpAQCAtMjQ4LDcgKzI2Nyw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICppbl9idWY7CisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmluX2J1ZjsKICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgICAgICAgaW5fYnVmID0gTlVMTDsKICAgICAgICAgICAgICAgICBtZS51bmxvY2soKTsKQEAgLTI5MCw3ICszMDksNyBAQAogCiAgICAgICAgICAgICBpZiAoaW5fYnVmICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzID0gMDsKLSAgICAgICAgICAgICAgICBDSEVDSyhpbl9idWYtPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lc3RhbXBVcykpOworICAgICAgICAgICAgICAgIENIRUNLKGluX2J1Zi0+bWV0YV9kYXRhKCkuZmluZEludDY0KGtLZXlUaW1lLCAmdGltZXN0YW1wVXMpKTsKICAgICAgICAgICAgICAgICBpZiAoaW5fYnVmLT5yYW5nZV9sZW5ndGgoKSArIChtSXNWb3JiaXMgPyA0IDogMCkgPiBpbl9idWZmZXItPmNhcGFjaXR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiclcycgcmVjZWl2ZWQgJXp1IGlucHV0IGJ5dGVzIGZvciBidWZmZXIgb2Ygc2l6ZSAlenUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksCkBAIC0zMDIsNyArMzIxLDcgQEAKIAogICAgICAgICAgICAgICAgIGlmIChtSXNWb3JiaXMpIHsKICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1QYWdlU2FtcGxlczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpbl9idWYtPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoa0tleVZhbGlkU2FtcGxlcywgJm51bVBhZ2VTYW1wbGVzKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWluX2J1Zi0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlWYWxpZFNhbXBsZXMsICZudW1QYWdlU2FtcGxlcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG51bVBhZ2VTYW1wbGVzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGluX2J1ZmZlci0+YmFzZSgpICsgY3BMZW4sICZudW1QYWdlU2FtcGxlcywgc2l6ZW9mKG51bVBhZ2VTYW1wbGVzKSk7CkBAIC0zNzQsNyArMzkzLDcgQEAKICAgICAgICAgICAgICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIob3V0X3NpemUpOwogICAgICAgICAgICAgQ0hFQ0tfTEUob3V0X2J1ZmZlci0+c2l6ZSgpLCAoKmJ1ZmZlciktPnNpemUoKSk7CiAgICAgICAgICAgICBtZW1jcHkoKCpidWZmZXIpLT5kYXRhKCksIG91dF9idWZmZXItPmRhdGEoKSwgb3V0X2J1ZmZlci0+c2l6ZSgpKTsKLSAgICAgICAgICAgICgqYnVmZmVyKS0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBvdXRfcHRzKTsKKyAgICAgICAgICAgICgqYnVmZmVyKS0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIG91dF9wdHMpOwogICAgICAgICAgICAgbUNvZGVjLT5yZWxlYXNlT3V0cHV0QnVmZmVyKG91dF9peCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIE9LOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwCmluZGV4IDRmZjJiZmUuLmUwMTBiM2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAKQEAgLTQwLDcgKzQwLDggQEAKICAgICAgICAgIi5tcGVnIiwgIi5vZ2ciLCAiLm1pZCIsICIuc21mIiwgIi5pbXkiLCAiLndtYSIsICIuYWFjIiwKICAgICAgICAgIi53YXYiLCAiLmFtciIsICIubWlkaSIsICIueG1mIiwgIi5ydHR0bCIsICIucnR4IiwgIi5vdGEiLAogICAgICAgICAiLm1rdiIsICIubWthIiwgIi53ZWJtIiwgIi50cyIsICIuZmwiLCAiLmZsYWMiLCAiLm14bWYiLAotICAgICAgICAiLmF2aSIsICIubXBlZyIsICIubXBnIiwgIi5hd2IiLCAiLm1wZ2EiLCAiLm1vdiIKKyAgICAgICAgIi5hdmkiLCAiLm1wZWciLCAiLm1wZyIsICIuYXdiIiwgIi5tcGdhIiwgIi5tb3YiLAorICAgICAgICAiLm00diIsICIub2dhIgogICAgIH07CiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTnVtVmFsaWRFeHRlbnNpb25zID0KICAgICAgICAgc2l6ZW9mKGtWYWxpZEV4dGVuc2lvbnMpIC8gc2l6ZW9mKGtWYWxpZEV4dGVuc2lvbnNbMF0pOwpAQCAtNjIsNiArNjMsMTEgQEAKICAgICBjbGllbnQuc2V0TG9jYWxlKGxvY2FsZSgpKTsKICAgICBjbGllbnQuYmVnaW5GaWxlKCk7CiAgICAgTWVkaWFTY2FuUmVzdWx0IHJlc3VsdCA9IHByb2Nlc3NGaWxlSW50ZXJuYWwocGF0aCwgbWltZVR5cGUsIGNsaWVudCk7CisgICAgQUxPR1YoInJlc3VsdDogJWQiLCByZXN1bHQpOworICAgIGlmIChtaW1lVHlwZSA9PSBOVUxMICYmIHJlc3VsdCAhPSBNRURJQV9TQ0FOX1JFU1VMVF9PSykgeworICAgICAgICBBTE9HVygibWVkaWEgc2NhbiBmYWlsZWQgZm9yICVzIiwgcGF0aCk7CisgICAgICAgIGNsaWVudC5zZXRNaW1lVHlwZSgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisgICAgfQogICAgIGNsaWVudC5lbmRGaWxlKCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAKaW5kZXggZThjM2RkMy4uZTgwZWMzYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAKQEAgLTIwLDUyICsyMCwzNCBAQAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogCi0jaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKKyNpbmNsdWRlICJpbmNsdWRlL0ZyYW1lRGVjb2Rlci5oIgogI2luY2x1ZGUgImluY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oIgogCi0jaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgotCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+Ci0KICNpbmNsdWRlIDxtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RhdGljIGNvbnN0IGludDY0X3Qga0J1ZmZlclRpbWVPdXRVcyA9IDMwMDAwbGw7IC8vIDMwIG1zZWMKLXN0YXRpYyBjb25zdCBzaXplX3Qga1JldHJ5Q291bnQgPSAyMDsgLy8gbXVzdCBiZSA+MAotCiBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjpTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyKCkKICAgICA6IG1QYXJzZWRNZXRhRGF0YShmYWxzZSksCi0gICAgICBtQWxidW1BcnQoTlVMTCkgeworICAgICAgbUFsYnVtQXJ0KE5VTEwpLAorICAgICAgbUxhc3RJbWFnZUluZGV4KC0xKSB7CiAgICAgQUxPR1YoIlN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIoKSIpOwogfQogCiBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjp+U3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcigpIHsKICAgICBBTE9HVigiflN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIoKSIpOwogICAgIGNsZWFyTWV0YWRhdGEoKTsKLSAgICAvLyBFeHBsaWNpdGx5IHJlbGVhc2UgZXh0cmFjdG9yIGJlZm9yZSBjb250aW51aW5nIHdpdGggdGhlIGRlc3RydWN0b3IsCi0gICAgLy8gc29tZSBleHRyYWN0b3JzIG1pZ2h0IG5lZWQgdG8gY2FsbGJhY2sgdG8gY2xvc2Ugb2ZmIHRoZSBEYXRhU291cmNlCi0gICAgLy8gYW5kIHdlIG5lZWQgdG8gbWFrZSBzdXJlIGl0J3Mgc3RpbGwgdGhlcmUuCi0gICAgaWYgKG1FeHRyYWN0b3IgIT0gTlVMTCkgewotICAgICAgICBtRXh0cmFjdG9yLT5yZWxlYXNlKCk7Ci0gICAgfQogICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKICAgICAgICAgbVNvdXJjZS0+Y2xvc2UoKTsKICAgICB9CkBAIC03OCwxNCArNjAsMTQgQEAKICAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcykiLCB1cmkpOwogCiAgICAgY2xlYXJNZXRhZGF0YSgpOwotICAgIG1Tb3VyY2UgPSBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKGh0dHBTZXJ2aWNlLCB1cmksIGhlYWRlcnMpOworICAgIG1Tb3VyY2UgPSBEYXRhU291cmNlRmFjdG9yeTo6Q3JlYXRlRnJvbVVSSShodHRwU2VydmljZSwgdXJpLCBoZWFkZXJzKTsKIAogICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBjcmVhdGUgZGF0YSBzb3VyY2UgZm9yICclcycuIiwgdXJpKTsKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCi0gICAgbUV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUobVNvdXJjZSk7CisgICAgbUV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Q3JlYXRlKG1Tb3VyY2UpOwogCiAgICAgaWYgKG1FeHRyYWN0b3IgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGluc3RhbnRpYXRlIGFuIGV4dHJhY3RvciBmb3IgJyVzJy4iLCB1cmkpOwpAQCAtMTE1LDcgKzk3LDcgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICBtRXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3I6OkNyZWF0ZShtU291cmNlKTsKKyAgICBtRXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpDcmVhdGUobVNvdXJjZSk7CiAKICAgICBpZiAobUV4dHJhY3RvciA9PSBOVUxMKSB7CiAgICAgICAgIG1Tb3VyY2UuY2xlYXIoKTsKQEAgLTEzMiw3ICsxMTQsNyBAQAogCiAgICAgY2xlYXJNZXRhZGF0YSgpOwogICAgIG1Tb3VyY2UgPSBzb3VyY2U7Ci0gICAgbUV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUobVNvdXJjZSwgbWltZSk7CisgICAgbUV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Q3JlYXRlKG1Tb3VyY2UsIG1pbWUpOwogCiAgICAgaWYgKG1FeHRyYWN0b3IgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluc3RhbnRpYXRlIGEgTWVkaWFFeHRyYWN0b3IuIik7CkBAIC0xNDMsNDc0ICsxMjUsMTU1IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0aWMgVmlkZW9GcmFtZSAqYWxsb2NWaWRlb0ZyYW1lKAotICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJnRyYWNrTWV0YSwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QgYnBwLCBib29sIG1ldGFPbmx5KSB7Ci0gICAgaW50MzJfdCByb3RhdGlvbkFuZ2xlOwotICAgIGlmICghdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVJvdGF0aW9uLCAmcm90YXRpb25BbmdsZSkpIHsKLSAgICAgICAgcm90YXRpb25BbmdsZSA9IDA7ICAvLyBCeSBkZWZhdWx0LCBubyByb3RhdGlvbgotICAgIH0KK3NwPElNZW1vcnk+IFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXI6OmdldEltYWdlQXRJbmRleCgKKyAgICAgICAgaW50IGluZGV4LCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHksIGJvb2wgdGh1bWJuYWlsKSB7CisgICAgQUxPR1YoImdldEltYWdlQXRJbmRleDogaW5kZXgoJWQpIGNvbG9yRm9ybWF0KCVkKSBtZXRhT25seSglZCkgdGh1bWJuYWlsKCVkKSIsCisgICAgICAgICAgICBpbmRleCwgY29sb3JGb3JtYXQsIG1ldGFPbmx5LCB0aHVtYm5haWwpOwogCi0gICAgdWludDMyX3QgdHlwZTsKLSAgICBjb25zdCB2b2lkICppY2NEYXRhOwotICAgIHNpemVfdCBpY2NTaXplOwotICAgIGlmICghdHJhY2tNZXRhLT5maW5kRGF0YShrS2V5SWNjUHJvZmlsZSwgJnR5cGUsICZpY2NEYXRhLCAmaWNjU2l6ZSkpewotICAgICAgICBpY2NEYXRhID0gTlVMTDsKLSAgICAgICAgaWNjU2l6ZSA9IDA7Ci0gICAgfQotCi0gICAgaW50MzJfdCBzYXJXaWR0aCwgc2FySGVpZ2h0OwotICAgIGludDMyX3QgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0OwotICAgIGlmICh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5U0FSV2lkdGgsICZzYXJXaWR0aCkKLSAgICAgICAgICAgICYmIHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlTQVJIZWlnaHQsICZzYXJIZWlnaHQpCi0gICAgICAgICAgICAmJiBzYXJIZWlnaHQgIT0gMCkgewotICAgICAgICBkaXNwbGF5V2lkdGggPSAod2lkdGggKiBzYXJXaWR0aCkgLyBzYXJIZWlnaHQ7Ci0gICAgICAgIGRpc3BsYXlIZWlnaHQgPSBoZWlnaHQ7Ci0gICAgfSBlbHNlIGlmICh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5RGlzcGxheVdpZHRoLCAmZGlzcGxheVdpZHRoKQotICAgICAgICAgICAgICAgICYmIHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlEaXNwbGF5SGVpZ2h0LCAmZGlzcGxheUhlaWdodCkKLSAgICAgICAgICAgICAgICAmJiBkaXNwbGF5V2lkdGggPiAwICYmIGRpc3BsYXlIZWlnaHQgPiAwCi0gICAgICAgICAgICAgICAgJiYgd2lkdGggPiAwICYmIGhlaWdodCA+IDApIHsKLSAgICAgICAgQUxPR1YoImZvdW5kIGRpc3BsYXkgc2l6ZSAlZHglZCIsIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZGlzcGxheVdpZHRoID0gd2lkdGg7Ci0gICAgICAgIGRpc3BsYXlIZWlnaHQgPSBoZWlnaHQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ldyBWaWRlb0ZyYW1lKHdpZHRoLCBoZWlnaHQsIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCwKLSAgICAgICAgICAgIHJvdGF0aW9uQW5nbGUsIGJwcCwgIW1ldGFPbmx5LCBpY2NEYXRhLCBpY2NTaXplKTsKKyAgICByZXR1cm4gZ2V0SW1hZ2VJbnRlcm5hbChpbmRleCwgY29sb3JGb3JtYXQsIG1ldGFPbmx5LCB0aHVtYm5haWwsIE5VTEwpOwogfQogCi1zdGF0aWMgYm9vbCBnZXREc3RDb2xvckZvcm1hdChhbmRyb2lkX3BpeGVsX2Zvcm1hdF90IGNvbG9yRm9ybWF0LAotICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSAqb214Q29sb3JGb3JtYXQsIGludDMyX3QgKmJwcCkgewotICAgIHN3aXRjaCAoY29sb3JGb3JtYXQpIHsKLSAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQl81NjU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICpvbXhDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NTsKLSAgICAgICAgICAgICpicHAgPSAyOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4ODoKLSAgICAgICAgewotICAgICAgICAgICAgKm9teENvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODg7Ci0gICAgICAgICAgICAqYnBwID0gNDsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODg6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICpvbXhDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4OwotICAgICAgICAgICAgKmJwcCA9IDQ7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgY29sb3IgZm9ybWF0OiAlZCIsIGNvbG9yRm9ybWF0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CitzcDxJTWVtb3J5PiBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjpnZXRJbWFnZVJlY3RBdEluZGV4KAorICAgICAgICBpbnQgaW5kZXgsIGludCBjb2xvckZvcm1hdCwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkgeworICAgIEFMT0dWKCJnZXRJbWFnZVJlY3RBdEluZGV4OiBpbmRleCglZCkgY29sb3JGb3JtYXQoJWQpIHJlY3QgeyVkLCAlZCwgJWQsICVkfSIsCisgICAgICAgICAgICBpbmRleCwgY29sb3JGb3JtYXQsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisKKyAgICBGcmFtZVJlY3QgcmVjdCA9IHtsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b219OworCisgICAgaWYgKG1JbWFnZURlY29kZXIgIT0gTlVMTCAmJiBpbmRleCA9PSBtTGFzdEltYWdlSW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIG1JbWFnZURlY29kZXItPmV4dHJhY3RGcmFtZSgmcmVjdCk7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBnZXRJbWFnZUludGVybmFsKAorICAgICAgICAgICAgaW5kZXgsIGNvbG9yRm9ybWF0LCBmYWxzZSAvKm1ldGFPbmx5Ki8sIGZhbHNlIC8qdGh1bWJuYWlsKi8sICZyZWN0KTsKIH0KIAotc3RhdGljIFZpZGVvRnJhbWUgKmV4dHJhY3RWaWRlb0ZyYW1lKAotICAgICAgICBjb25zdCBBU3RyaW5nICZjb21wb25lbnROYW1lLAotICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJnRyYWNrTWV0YSwKLSAgICAgICAgY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlLAotICAgICAgICBpbnQ2NF90IGZyYW1lVGltZVVzLAotICAgICAgICBpbnQgc2Vla01vZGUsCi0gICAgICAgIGludCBjb2xvckZvcm1hdCwKLSAgICAgICAgYm9vbCBtZXRhT25seSkgewotICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBzb3VyY2UtPmdldEZvcm1hdCgpOworc3A8SU1lbW9yeT4gU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjo6Z2V0SW1hZ2VJbnRlcm5hbCgKKyAgICAgICAgaW50IGluZGV4LCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHksIGJvb2wgdGh1bWJuYWlsLCBGcmFtZVJlY3QqIHJlY3QpIHsKIAotICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZSA9Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlPihzZWVrTW9kZSk7Ci0gICAgaWYgKHNlZWtNb2RlIDwgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMgfHwKLSAgICAgICAgc2Vla01vZGUgPiBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVCkgewotICAgICAgICBBTE9HRSgiVW5rbm93biBzZWVrIG1vZGU6ICVkIiwgc2Vla01vZGUpOworICAgIGlmIChtRXh0cmFjdG9yLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIm5vIGV4dHJhY3Rvci4iKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgaW50MzJfdCBkc3RCcHA7Ci0gICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZHN0Rm9ybWF0OwotICAgIGlmICghZ2V0RHN0Q29sb3JGb3JtYXQoCi0gICAgICAgICAgICAoYW5kcm9pZF9waXhlbF9mb3JtYXRfdCljb2xvckZvcm1hdCwgJmRzdEZvcm1hdCwgJmRzdEJwcCkpIHsKKyAgICBzaXplX3QgbiA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CisgICAgc2l6ZV90IGk7CisgICAgaW50IGltYWdlQ291bnQgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoaSk7CisgICAgICAgIEFMT0dWKCJnZXR0aW5nIHRyYWNrICV6dSBvZiAlenUsIG1ldGE9JXMiLCBpLCBuLCBtZXRhLT50b1N0cmluZygpLmNfc3RyKCkpOworCisgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKworICAgICAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWUsICJpbWFnZS8iLCA2KSkgeworICAgICAgICAgICAgaW50MzJfdCBpc1ByaW1hcnk7CisgICAgICAgICAgICBpZiAoKGluZGV4IDwgMCAmJiBtZXRhLT5maW5kSW50MzIoCisgICAgICAgICAgICAgICAgICAgIGtLZXlUcmFja0lzRGVmYXVsdCwgJmlzUHJpbWFyeSkgJiYgaXNQcmltYXJ5KQorICAgICAgICAgICAgICAgICAgICB8fCAoaW5kZXggPT0gaW1hZ2VDb3VudCsrKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGkgPT0gbikgeworICAgICAgICBBTE9HRSgiaW1hZ2UgdHJhY2sgbm90IGZvdW5kLiIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKKyAgICBzcDxNZXRhRGF0YT4gdHJhY2tNZXRhID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YShpKTsKKwogICAgIGlmIChtZXRhT25seSkgewotICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgICAgIENIRUNLKHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKSk7Ci0gICAgICAgIENIRUNLKHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpKTsKLSAgICAgICAgcmV0dXJuIGFsbG9jVmlkZW9GcmFtZSh0cmFja01ldGEsIHdpZHRoLCBoZWlnaHQsIGRzdEJwcCwgdHJ1ZSk7CisgICAgICAgIHJldHVybiBGcmFtZURlY29kZXI6OmdldE1ldGFkYXRhT25seSh0cmFja01ldGEsIGNvbG9yRm9ybWF0LCB0aHVtYm5haWwpOwogICAgIH0KIAotICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOwotICAgIHNwPE1ldGFEYXRhPiBvdmVycmlkZU1ldGE7Ci0gICAgaWYgKGZyYW1lVGltZVVzIDwgMCkgewotICAgICAgICB1aW50MzJfdCB0eXBlOwotICAgICAgICBjb25zdCB2b2lkICpkYXRhOwotICAgICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgICAgaW50NjRfdCB0aHVtYk5haWxUaW1lOwotICAgICAgICBpbnQzMl90IHRodW1ibmFpbFdpZHRoLCB0aHVtYm5haWxIZWlnaHQ7CisgICAgc3A8SU1lZGlhU291cmNlPiBzb3VyY2UgPSBtRXh0cmFjdG9yLT5nZXRUcmFjayhpKTsKIAotICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgc3RhbmQtYWxvbmUgdGh1bWJuYWlsLCBzZXQgdXAgdGhlIG92ZXJyaWRlIG1ldGEsCi0gICAgICAgIC8vIGFuZCBzZXQgc2Vla1RvIHRpbWUgdG8gLTEuCi0gICAgICAgIGlmICh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5VGh1bWJuYWlsV2lkdGgsICZ0aHVtYm5haWxXaWR0aCkKLSAgICAgICAgICYmIHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlUaHVtYm5haWxIZWlnaHQsICZ0aHVtYm5haWxIZWlnaHQpCi0gICAgICAgICAmJiB0cmFja01ldGEtPmZpbmREYXRhKGtLZXlUaHVtYm5haWxIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSl7Ci0gICAgICAgICAgICBvdmVycmlkZU1ldGEgPSBuZXcgTWV0YURhdGEoKnRyYWNrTWV0YSk7Ci0gICAgICAgICAgICBvdmVycmlkZU1ldGEtPnJlbW92ZShrS2V5RGlzcGxheVdpZHRoKTsKLSAgICAgICAgICAgIG92ZXJyaWRlTWV0YS0+cmVtb3ZlKGtLZXlEaXNwbGF5SGVpZ2h0KTsKLSAgICAgICAgICAgIG92ZXJyaWRlTWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCB0aHVtYm5haWxXaWR0aCk7Ci0gICAgICAgICAgICBvdmVycmlkZU1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIHRodW1ibmFpbEhlaWdodCk7Ci0gICAgICAgICAgICBvdmVycmlkZU1ldGEtPnNldERhdGEoa0tleUhWQ0MsIHR5cGUsIGRhdGEsIHNpemUpOwotICAgICAgICAgICAgdGh1bWJOYWlsVGltZSA9IC0xbGw7Ci0gICAgICAgICAgICBBTE9HVigidGh1bWJuYWlsOiAlZHglZCIsIHRodW1ibmFpbFdpZHRoLCB0aHVtYm5haWxIZWlnaHQpOwotICAgICAgICB9IGVsc2UgaWYgKCF0cmFja01ldGEtPmZpbmRJbnQ2NChrS2V5VGh1bWJuYWlsVGltZSwgJnRodW1iTmFpbFRpbWUpCi0gICAgICAgICAgICAgICAgfHwgdGh1bWJOYWlsVGltZSA8IDApIHsKLSAgICAgICAgICAgIHRodW1iTmFpbFRpbWUgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8odGh1bWJOYWlsVGltZSwgbW9kZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8oZnJhbWVUaW1lVXMsIG1vZGUpOwotICAgIH0KLQotICAgIGludDMyX3QgZ3JpZFJvd3MgPSAxLCBncmlkQ29scyA9IDE7Ci0gICAgaWYgKG92ZXJyaWRlTWV0YSA9PSBOVUxMKSB7Ci0gICAgICAgIC8vIGNoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIHRpbGVkIGhlaWYKLSAgICAgICAgaW50MzJfdCBncmlkV2lkdGgsIGdyaWRIZWlnaHQsIHRtcFJvd3MsIHRtcENvbHM7Ci0gICAgICAgIGlmICh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5R3JpZFdpZHRoLCAmZ3JpZFdpZHRoKSAmJiBncmlkV2lkdGggPiAwCi0gICAgICAgICAmJiB0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5R3JpZEhlaWdodCwgJmdyaWRIZWlnaHQpICYmIGdyaWRIZWlnaHQgPiAwCi0gICAgICAgICAmJiB0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5R3JpZFJvd3MsICZ0bXBSb3dzKSAmJiB0bXBSb3dzID4gMAotICAgICAgICAgJiYgdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleUdyaWRDb2xzLCAmdG1wQ29scykgJiYgdG1wQ29scyA+IDApIHsKLSAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICAgICAgICAgIENIRUNLKHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKSk7Ci0gICAgICAgICAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KSk7Ci0KLSAgICAgICAgICAgIGlmICh3aWR0aCA8PSBncmlkV2lkdGggKiB0bXBDb2xzICYmIGhlaWdodCA8PSBncmlkSGVpZ2h0ICogdG1wUm93cykgewotICAgICAgICAgICAgICAgIEFMT0dWKCJncmlkOiAlZHglZCwgc2l6ZTogJWR4JWQsIHBpY3R1cmUgc2l6ZTogJWR4JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgdG1wQ29scywgdG1wUm93cywgZ3JpZFdpZHRoLCBncmlkSGVpZ2h0LCB3aWR0aCwgaGVpZ2h0KTsKLQotICAgICAgICAgICAgICAgIG92ZXJyaWRlTWV0YSA9IG5ldyBNZXRhRGF0YSgqdHJhY2tNZXRhKTsKLSAgICAgICAgICAgICAgICBvdmVycmlkZU1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgZ3JpZFdpZHRoKTsKLSAgICAgICAgICAgICAgICBvdmVycmlkZU1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGdyaWRIZWlnaHQpOwotICAgICAgICAgICAgICAgIGdyaWRDb2xzID0gdG1wQ29sczsKLSAgICAgICAgICAgICAgICBncmlkUm93cyA9IHRtcFJvd3M7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dFKCJiYWQgZ3JpZDogJWR4JWQsIHNpemU6ICVkeCVkLCBwaWN0dXJlIHNpemU6ICVkeCVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcENvbHMsIHRtcFJvd3MsIGdyaWRXaWR0aCwgZ3JpZEhlaWdodCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG92ZXJyaWRlTWV0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBvdmVycmlkZU1ldGEgPSB0cmFja01ldGE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaW50MzJfdCBudW1UaWxlcyA9IGdyaWRSb3dzICogZ3JpZENvbHM7Ci0KLSAgICBzcDxBTWVzc2FnZT4gdmlkZW9Gb3JtYXQ7Ci0gICAgaWYgKGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShvdmVycmlkZU1ldGEsICZ2aWRlb0Zvcm1hdCkgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoImIvMjM2ODA3ODAiKTsKLSAgICAgICAgQUxPR1coIkZhaWxlZCB0byBjb252ZXJ0IG1ldGEgZGF0YSB0byBtZXNzYWdlIik7CisgICAgaWYgKHNvdXJjZS5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJ1bmFibGUgdG8gaW5zdGFudGlhdGUgaW1hZ2UgdHJhY2suIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIC8vIFRPRE86IFVzZSBGbGV4aWJsZSBjb2xvciBpbnN0ZWFkCi0gICAgdmlkZW9Gb3JtYXQtPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKLQotICAgIC8vIEZvciB0aGUgdGh1bWJuYWlsIGV4dHJhY3Rpb24gY2FzZSwgdHJ5IHRvIGFsbG9jYXRlIHNpbmdsZSBidWZmZXIgaW4gYm90aAotICAgIC8vIGlucHV0IGFuZCBvdXRwdXQgcG9ydHMsIGlmIHNlZWtpbmcgdG8gYSBzeW5jIGZyYW1lLiBOT1RFOiBUaGlzIHJlcXVlc3QgbWF5Ci0gICAgLy8gZmFpbCBpZiBjb21wb25lbnQgcmVxdWlyZXMgbW9yZSB0aGFuIHRoYXQgZm9yIGRlY29kaW5nLgotICAgIGJvb2wgaXNTZWVraW5nQ2xvc2VzdCA9IChzZWVrTW9kZSA9PSBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVCk7Ci0gICAgYm9vbCBkZWNvZGVTaW5nbGVGcmFtZSA9ICFpc1NlZWtpbmdDbG9zZXN0ICYmIChudW1UaWxlcyA9PSAxKTsKLSAgICBpZiAoZGVjb2RlU2luZ2xlRnJhbWUpIHsKLSAgICAgICAgdmlkZW9Gb3JtYXQtPnNldEludDMyKCJhbmRyb2lkLl9udW0taW5wdXQtYnVmZmVycyIsIDEpOwotICAgICAgICB2aWRlb0Zvcm1hdC0+c2V0SW50MzIoImFuZHJvaWQuX251bS1vdXRwdXQtYnVmZmVycyIsIDEpOwotICAgIH0KLQotICAgIHN0YXR1c190IGVycjsKLSAgICBzcDxBTG9vcGVyPiBsb29wZXIgPSBuZXcgQUxvb3BlcjsKLSAgICBsb29wZXItPnN0YXJ0KCk7Ci0gICAgc3A8TWVkaWFDb2RlYz4gZGVjb2RlciA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZSgKLSAgICAgICAgICAgIGxvb3BlciwgY29tcG9uZW50TmFtZSwgJmVycik7Ci0KLSAgICBpZiAoZGVjb2Rlci5nZXQoKSA9PSBOVUxMIHx8IGVyciAhPSBPSykgewotICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGluc3RhbnRpYXRlIGRlY29kZXIgWyVzXSIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGVyciA9IGRlY29kZXItPmNvbmZpZ3VyZSh2aWRlb0Zvcm1hdCwgTlVMTCAvKiBzdXJmYWNlICovLCBOVUxMIC8qIGNyeXB0byAqLywgMCAvKiBmbGFncyAqLyk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HVygiY29uZmlndXJlIHJldHVybmVkIGVycm9yICVkICglcykiLCBlcnIsIGFzU3RyaW5nKGVycikpOwotICAgICAgICBkZWNvZGVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGVyciA9IGRlY29kZXItPnN0YXJ0KCk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HVygic3RhcnQgcmV0dXJuZWQgZXJyb3IgJWQgKCVzKSIsIGVyciwgYXNTdHJpbmcoZXJyKSk7Ci0gICAgICAgIGRlY29kZXItPnJlbGVhc2UoKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgZXJyID0gc291cmNlLT5zdGFydCgpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR1coInNvdXJjZSBmYWlsZWQgdG8gc3RhcnQ6ICVkICglcykiLCBlcnIsIGFzU3RyaW5nKGVycikpOwotICAgICAgICBkZWNvZGVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPiA+IGlucHV0QnVmZmVyczsKLSAgICBlcnIgPSBkZWNvZGVyLT5nZXRJbnB1dEJ1ZmZlcnMoJmlucHV0QnVmZmVycyk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HVygiZmFpbGVkIHRvIGdldCBpbnB1dCBidWZmZXJzOiAlZCAoJXMpIiwgZXJyLCBhc1N0cmluZyhlcnIpKTsKLSAgICAgICAgZGVjb2Rlci0+cmVsZWFzZSgpOwotICAgICAgICBzb3VyY2UtPnN0b3AoKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+ID4gb3V0cHV0QnVmZmVyczsKLSAgICBlcnIgPSBkZWNvZGVyLT5nZXRPdXRwdXRCdWZmZXJzKCZvdXRwdXRCdWZmZXJzKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gZ2V0IG91dHB1dCBidWZmZXJzOiAlZCAoJXMpIiwgZXJyLCBhc1N0cmluZyhlcnIpKTsKLSAgICAgICAgZGVjb2Rlci0+cmVsZWFzZSgpOwotICAgICAgICBzb3VyY2UtPnN0b3AoKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgc3A8QU1lc3NhZ2U+IG91dHB1dEZvcm1hdCA9IE5VTEw7Ci0gICAgYm9vbCBoYXZlTW9yZUlucHV0cyA9IHRydWU7Ci0gICAgc2l6ZV90IGluZGV4LCBvZmZzZXQsIHNpemU7Ci0gICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgc2l6ZV90IHJldHJpZXNMZWZ0ID0ga1JldHJ5Q291bnQ7Ci0gICAgYm9vbCBkb25lID0gZmFsc2U7CiAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICBib29sIHN1Y2Nlc3MgPSBmb3JtYXQtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOwotICAgIGlmICghc3VjY2VzcykgewotICAgICAgICBBTE9HRSgiQ291bGQgbm90IGZpbmQgbWltZSB0eXBlIik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIENIRUNLKHRyYWNrTWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgIEFMT0dWKCJleHRyYWN0aW5nIGZyb20gJXMgdHJhY2siLCBtaW1lKTsKKyAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDKSkgeworICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQzsKKyAgICAgICAgdHJhY2tNZXRhID0gbmV3IE1ldGFEYXRhKCp0cmFja01ldGEpOworICAgICAgICB0cmFja01ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtaW1lKTsKICAgICB9CiAKLSAgICBib29sIGlzQXZjT3JIZXZjID0gIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKQotICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQyk7CisgICAgVmVjdG9yPEFTdHJpbmc+IG1hdGNoaW5nQ29kZWNzOworICAgIE1lZGlhQ29kZWNMaXN0OjpmaW5kTWF0Y2hpbmdDb2RlY3MoCisgICAgICAgICAgICBtaW1lLAorICAgICAgICAgICAgZmFsc2UsIC8qIGVuY29kZXIgKi8KKyAgICAgICAgICAgIE1lZGlhQ29kZWNMaXN0OjprUHJlZmVyU29mdHdhcmVDb2RlY3MsCisgICAgICAgICAgICAmbWF0Y2hpbmdDb2RlY3MpOwogCi0gICAgYm9vbCBmaXJzdFNhbXBsZSA9IHRydWU7Ci0gICAgaW50NjRfdCB0YXJnZXRUaW1lVXMgPSAtMWxsOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0Y2hpbmdDb2RlY3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgQVN0cmluZyAmY29tcG9uZW50TmFtZSA9IG1hdGNoaW5nQ29kZWNzW2ldOworICAgICAgICBzcDxJbWFnZURlY29kZXI+IGRlY29kZXIgPSBuZXcgSW1hZ2VEZWNvZGVyKGNvbXBvbmVudE5hbWUsIHRyYWNrTWV0YSwgc291cmNlKTsKKyAgICAgICAgaW50NjRfdCBmcmFtZVRpbWVVcyA9IHRodW1ibmFpbCA/IC0xIDogMDsKKyAgICAgICAgaWYgKGRlY29kZXItPmluaXQoZnJhbWVUaW1lVXMsIDEgLypudW1GcmFtZXMqLywgMCAvKm9wdGlvbiovLCBjb2xvckZvcm1hdCkgPT0gT0spIHsKKyAgICAgICAgICAgIHNwPElNZW1vcnk+IGZyYW1lID0gZGVjb2Rlci0+ZXh0cmFjdEZyYW1lKHJlY3QpOwogCi0gICAgVmlkZW9GcmFtZSAqZnJhbWUgPSBOVUxMOwotICAgIGludDMyX3QgdGlsZXNEZWNvZGVkID0gMDsKLQotICAgIGRvIHsKLSAgICAgICAgc2l6ZV90IGlucHV0SW5kZXggPSAtMTsKLSAgICAgICAgaW50NjRfdCBwdHNVcyA9IDBsbDsKLSAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOwotICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBjb2RlY0J1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgd2hpbGUgKGhhdmVNb3JlSW5wdXRzKSB7Ci0gICAgICAgICAgICBlcnIgPSBkZWNvZGVyLT5kZXF1ZXVlSW5wdXRCdWZmZXIoJmlucHV0SW5kZXgsIGtCdWZmZXJUaW1lT3V0VXMpOwotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIEFMT0dXKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgaW5wdXQiKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0cmllc0xlZnQpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgICAgICBpZiAoZnJhbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChyZWN0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCB0aGUgZGVjb2RlciBpZiBzbGljZSBkZWNvZGluZworICAgICAgICAgICAgICAgICAgICBtSW1hZ2VEZWNvZGVyID0gZGVjb2RlcjsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3RJbWFnZUluZGV4ID0gaW5kZXg7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29kZWNCdWZmZXIgPSBpbnB1dEJ1ZmZlcnNbaW5wdXRJbmRleF07Ci0KLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICptZWRpYUJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgICAgIGVyciA9IHNvdXJjZS0+cmVhZCgmbWVkaWFCdWZmZXIsICZvcHRpb25zKTsKLSAgICAgICAgICAgIG9wdGlvbnMuY2xlYXJTZWVrVG8oKTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiSW5wdXQgRXJyb3Igb3IgRU9TIik7Ci0gICAgICAgICAgICAgICAgaGF2ZU1vcmVJbnB1dHMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZpcnN0U2FtcGxlICYmIGlzU2Vla2luZ0Nsb3Nlc3QpIHsKLSAgICAgICAgICAgICAgICBtZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGFyZ2V0VGltZSwgJnRhcmdldFRpbWVVcyk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlNlZWtpbmcgY2xvc2VzdDogdGFyZ2V0VGltZVVzPSVsbGQiLCAobG9uZyBsb25nKXRhcmdldFRpbWVVcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaXJzdFNhbXBsZSA9IGZhbHNlOwotCi0gICAgICAgICAgICBpZiAobWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpID4gY29kZWNCdWZmZXItPmNhcGFjaXR5KCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYnVmZmVyIHNpemUgKCV6dSkgdG9vIGxhcmdlIGZvciBjb2RlYyBpbnB1dCBzaXplICglenUpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSwgY29kZWNCdWZmZXItPmNhcGFjaXR5KCkpOwotICAgICAgICAgICAgICAgIGhhdmVNb3JlSW5wdXRzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZXJyID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb2RlY0J1ZmZlci0+c2V0UmFuZ2UoMCwgbWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLQotICAgICAgICAgICAgICAgIENIRUNLKG1lZGlhQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmcHRzVXMpKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoY29kZWNCdWZmZXItPmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KiltZWRpYUJ1ZmZlci0+ZGF0YSgpICsgbWVkaWFCdWZmZXItPnJhbmdlX29mZnNldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWVkaWFCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhdmVNb3JlSW5wdXRzICYmIGlucHV0SW5kZXggPCBpbnB1dEJ1ZmZlcnMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBpZiAoaXNBdmNPckhldmMgJiYgSXNJRFIoY29kZWNCdWZmZXIpICYmIGRlY29kZVNpbmdsZUZyYW1lKSB7Ci0gICAgICAgICAgICAgICAgLy8gT25seSBuZWVkIHRvIGRlY29kZSBvbmUgSURSIGZyYW1lLCB1bmxlc3Mgd2UncmUgc2Vla2luZyB3aXRoIENMT1NFU1QKLSAgICAgICAgICAgICAgICAvLyBvcHRpb24sIGluIHdoaWNoIGNhc2Ugd2UgbmVlZCB0byBhY3R1YWxseSBkZWNvZGUgdG8gdGFyZ2V0VGltZVVzLgotICAgICAgICAgICAgICAgIGhhdmVNb3JlSW5wdXRzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBTE9HVigiUXVldWVJbnB1dDogc2l6ZT0lenUgdHM9JSIgUFJJZDY0ICIgdXMgZmxhZ3M9JXgiLAotICAgICAgICAgICAgICAgICAgICBjb2RlY0J1ZmZlci0+c2l6ZSgpLCBwdHNVcywgZmxhZ3MpOwotICAgICAgICAgICAgZXJyID0gZGVjb2Rlci0+cXVldWVJbnB1dEJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgaW5wdXRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPm9mZnNldCgpLAotICAgICAgICAgICAgICAgICAgICBjb2RlY0J1ZmZlci0+c2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICBwdHNVcywKLSAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCi0gICAgICAgICAgICAvLyB3ZSBkb24ndCBleHBlY3QgYW4gb3V0cHV0IGZyb20gY29kZWMgY29uZmlnIGJ1ZmZlcgotICAgICAgICAgICAgaWYgKGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfQ09ERUNDT05GSUcpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZnJhbWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICB3aGlsZSAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAvLyB3YWl0IGZvciBhIGRlY29kZWQgYnVmZmVyCi0gICAgICAgICAgICBlcnIgPSBkZWNvZGVyLT5kZXF1ZXVlT3V0cHV0QnVmZmVyKAotICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICZzaXplLAotICAgICAgICAgICAgICAgICAgICAmdGltZVVzLAotICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgIGtCdWZmZXJUaW1lT3V0VXMpOwotCi0gICAgICAgICAgICBpZiAoZXJyID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiUmVjZWl2ZWQgZm9ybWF0IGNoYW5nZSIpOwotICAgICAgICAgICAgICAgIGVyciA9IGRlY29kZXItPmdldE91dHB1dEZvcm1hdCgmb3V0cHV0Rm9ybWF0KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IElORk9fT1VUUFVUX0JVRkZFUlNfQ0hBTkdFRCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJPdXRwdXQgYnVmZmVycyBjaGFuZ2VkIik7Ci0gICAgICAgICAgICAgICAgZXJyID0gZGVjb2Rlci0+Z2V0T3V0cHV0QnVmZmVycygmb3V0cHV0QnVmZmVycyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gLUVBR0FJTiAvKiBJTkZPX1RSWV9BR0FJTl9MQVRFUiAqLyAmJiAtLXJldHJpZXNMZWZ0ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiVGltZWQtb3V0IHdhaXRpbmcgZm9yIG91dHB1dC4uIHJldHJpZXMgbGVmdCA9ICV6dSIsIHJldHJpZXNMZWZ0KTsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gT0spIHsKLQkgICAgICAgICAgICBpZiAob3V0cHV0Rm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXItPnJlbGVhc2VPdXRwdXRCdWZmZXIoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBzZWVraW5nIHdpdGggQ0xPU0VTVCBvcHRpb24gYW5kIG9idGFpbmVkIGEgdmFsaWQgdGFyZ2V0VGltZVVzCi0gICAgICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIGV4dHJhY3RvciwgZGVjb2RlIHRvIHRoZSBzcGVjaWZpZWQgZnJhbWUuIE90aGVyd2lzZSB3ZSdyZSBkb25lLgotICAgICAgICAgICAgICAgICAgICBBTE9HVigiUmVjZWl2ZWQgYW4gb3V0cHV0IGJ1ZmZlciwgdGltZVVzPSVsbGQiLCAobG9uZyBsb25nKXRpbWVVcyk7Ci0gICAgICAgICAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IHZpZGVvRnJhbWVCdWZmZXIgPSBvdXRwdXRCdWZmZXJzLml0ZW1BdChpbmRleCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpKTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKTsKLQotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3BfcmlnaHQsIGNyb3BfYm90dG9tOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZFJlY3QoImNyb3AiLCAmY3JvcF9sZWZ0LCAmY3JvcF90b3AsICZjcm9wX3JpZ2h0LCAmY3JvcF9ib3R0b20pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjcm9wX2xlZnQgPSBjcm9wX3RvcCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjcm9wX3JpZ2h0ID0gd2lkdGggLSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgY3JvcF9ib3R0b20gPSBoZWlnaHQgLSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lID0gYWxsb2NWaWRlb0ZyYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja01ldGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjcm9wX3JpZ2h0IC0gY3JvcF9sZWZ0ICsgMSkgKiBncmlkQ29scywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNyb3BfYm90dG9tIC0gY3JvcF90b3AgKyAxKSAqIGdyaWRSb3dzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RCcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qbWV0YU9ubHkqLyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyY0Zvcm1hdDsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZzcmNGb3JtYXQpKTsKLQotICAgICAgICAgICAgICAgICAgICBDb2xvckNvbnZlcnRlciBjb252ZXJ0ZXIoKE9NWF9DT0xPUl9GT1JNQVRUWVBFKXNyY0Zvcm1hdCwgZHN0Rm9ybWF0KTsKLQotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdExlZnQsIGRzdFRvcCwgZHN0UmlnaHQsIGRzdEJvdHRvbTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG51bVRpbGVzID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdExlZnQgPSBjcm9wX2xlZnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkc3RUb3AgPSBjcm9wX3RvcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdFJpZ2h0ID0gY3JvcF9yaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJvdHRvbSA9IGNyb3BfYm90dG9tOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZHN0TGVmdCA9IHRpbGVzRGVjb2RlZCAlIGdyaWRDb2xzICogd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkc3RUb3AgPSB0aWxlc0RlY29kZWQgLyBncmlkQ29scyAqIGhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdFJpZ2h0ID0gZHN0TGVmdCArIHdpZHRoIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJvdHRvbSA9IGRzdFRvcCArIGhlaWdodCAtIDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkb25lID0gKHRhcmdldFRpbWVVcyA8IDBsbCkgfHwgKHRpbWVVcyA+PSB0YXJnZXRUaW1lVXMpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChkb25lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udmVydGVyLmlzVmFsaWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGNvbnZlcnRlci5jb252ZXJ0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKil2aWRlb0ZyYW1lQnVmZmVyLT5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcF9sZWZ0LCBjcm9wX3RvcCwgY3JvcF9yaWdodCwgY3JvcF9ib3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bVdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPm1IZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RMZWZ0LCBkc3RUb3AsIGRzdFJpZ2h0LCBkc3RCb3R0b20pOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGNvbnZlcnQgZnJvbSBmb3JtYXQgMHglMDh4IHRvIDB4JTA4eCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNGb3JtYXQsIGRzdEZvcm1hdCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1UaWxlcyA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlc0RlY29kZWQrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lICY9ICh0aWxlc0RlY29kZWQgPj0gbnVtVGlsZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci0+cmVsZWFzZU91dHB1dEJ1ZmZlcihpbmRleCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coIlJlY2VpdmVkIGVycm9yICVkICglcykgaW5zdGVhZCBvZiBvdXRwdXQiLCBlcnIsIGFzU3RyaW5nKGVycikpOwotICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChlcnIgPT0gT0sgJiYgIWRvbmUpOwotCi0gICAgc291cmNlLT5zdG9wKCk7Ci0gICAgZGVjb2Rlci0+cmVsZWFzZSgpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGdldCB2aWRlbyBmcmFtZSAoZXJyICVkKSIsIGVycik7Ci0gICAgICAgIGRlbGV0ZSBmcmFtZTsKLSAgICAgICAgZnJhbWUgPSBOVUxMOworICAgICAgICBBTE9HVigiJXMgZmFpbGVkIHRvIGV4dHJhY3QgdGh1bWJuYWlsLCB0cnlpbmcgbmV4dCBkZWNvZGVyLiIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAgICAgfQogCi0gICAgcmV0dXJuIGZyYW1lOworICAgIHJldHVybiBOVUxMOwogfQogCi1WaWRlb0ZyYW1lICpTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjpnZXRGcmFtZUF0VGltZSgKK3NwPElNZW1vcnk+IFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXI6OmdldEZyYW1lQXRUaW1lKAogICAgICAgICBpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbiwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5KSB7Ci0KICAgICBBTE9HVigiZ2V0RnJhbWVBdFRpbWU6ICUiIFBSSWQ2NCAiIHVzIG9wdGlvbjogJWQgY29sb3JGb3JtYXQ6ICVkLCBtZXRhT25seTogJWQiLAogICAgICAgICAgICAgdGltZVVzLCBvcHRpb24sIGNvbG9yRm9ybWF0LCBtZXRhT25seSk7CiAKKyAgICBzcDxJTWVtb3J5PiBmcmFtZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBnZXRGcmFtZUludGVybmFsKAorICAgICAgICAgICAgdGltZVVzLCAxLCBvcHRpb24sIGNvbG9yRm9ybWF0LCBtZXRhT25seSwgJmZyYW1lLCBOVUxMIC8qb3V0RnJhbWVzKi8pOworICAgIHJldHVybiAoZXJyID09IE9LKSA/IGZyYW1lIDogTlVMTDsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjo6Z2V0RnJhbWVBdEluZGV4KAorICAgICAgICBzdGQ6OnZlY3RvcjxzcDxJTWVtb3J5PiA+KiBmcmFtZXMsCisgICAgICAgIGludCBmcmFtZUluZGV4LCBpbnQgbnVtRnJhbWVzLCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHkpIHsKKyAgICBBTE9HVigiZ2V0RnJhbWVBdEluZGV4OiBmcmFtZUluZGV4ICVkLCBudW1GcmFtZXMgJWQsIGNvbG9yRm9ybWF0OiAlZCwgbWV0YU9ubHk6ICVkIiwKKyAgICAgICAgICAgIGZyYW1lSW5kZXgsIG51bUZyYW1lcywgY29sb3JGb3JtYXQsIG1ldGFPbmx5KTsKKworICAgIHJldHVybiBnZXRGcmFtZUludGVybmFsKAorICAgICAgICAgICAgZnJhbWVJbmRleCwgbnVtRnJhbWVzLCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfRlJBTUVfSU5ERVgsCisgICAgICAgICAgICBjb2xvckZvcm1hdCwgbWV0YU9ubHksIE5VTEwgLypvdXRGcmFtZSovLCBmcmFtZXMpOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjpnZXRGcmFtZUludGVybmFsKAorICAgICAgICBpbnQ2NF90IHRpbWVVcywgaW50IG51bUZyYW1lcywgaW50IG9wdGlvbiwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5LAorICAgICAgICBzcDxJTWVtb3J5Piogb3V0RnJhbWUsIHN0ZDo6dmVjdG9yPHNwPElNZW1vcnk+ID4qIG91dEZyYW1lcykgewogICAgIGlmIChtRXh0cmFjdG9yLmdldCgpID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoIm5vIGV4dHJhY3Rvci4iKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIEFMT0dFKCJubyBleHRyYWN0b3IuIik7CisgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KIAogICAgIHNwPE1ldGFEYXRhPiBmaWxlTWV0YSA9IG1FeHRyYWN0b3ItPmdldE1ldGFEYXRhKCk7CiAKICAgICBpZiAoZmlsZU1ldGEgPT0gTlVMTCkgewotICAgICAgICBBTE9HVigiZXh0cmFjdG9yIGRvZXNuJ3QgcHVibGlzaCBtZXRhZGF0YSwgZmFpbGVkIHRvIGluaXRpYWxpemU/Iik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBBTE9HRSgiZXh0cmFjdG9yIGRvZXNuJ3QgcHVibGlzaCBtZXRhZGF0YSwgZmFpbGVkIHRvIGluaXRpYWxpemU/Iik7CisgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KIAogICAgIGludDMyX3QgZHJtID0gMDsKICAgICBpZiAoZmlsZU1ldGEtPmZpbmRJbnQzMihrS2V5SXNEUk0sICZkcm0pICYmIGRybSAhPSAwKSB7CiAgICAgICAgIEFMT0dFKCJmcmFtZSBncmFiIG5vdCBhbGxvd2VkLiIpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9VTktOT1dOOwogICAgIH0KIAogICAgIHNpemVfdCBuID0gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKQEAgLTYyNywxOCArMjkwLDI4IEBACiAgICAgfQogCiAgICAgaWYgKGkgPT0gbikgewotICAgICAgICBBTE9HVigibm8gdmlkZW8gdHJhY2sgZm91bmQuIik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBBTE9HRSgibm8gdmlkZW8gdHJhY2sgZm91bmQuIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKICAgICBzcDxNZXRhRGF0YT4gdHJhY2tNZXRhID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YSgKICAgICAgICAgICAgIGksIE1lZGlhRXh0cmFjdG9yOjprSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhKTsKIAorICAgIGlmIChtZXRhT25seSkgeworICAgICAgICBpZiAob3V0RnJhbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgKm91dEZyYW1lID0gRnJhbWVEZWNvZGVyOjpnZXRNZXRhZGF0YU9ubHkodHJhY2tNZXRhLCBjb2xvckZvcm1hdCk7CisgICAgICAgICAgICBpZiAoKm91dEZyYW1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCiAgICAgc3A8SU1lZGlhU291cmNlPiBzb3VyY2UgPSBtRXh0cmFjdG9yLT5nZXRUcmFjayhpKTsKIAogICAgIGlmIChzb3VyY2UuZ2V0KCkgPT0gTlVMTCkgewogICAgICAgICBBTE9HVigidW5hYmxlIHRvIGluc3RhbnRpYXRlIHZpZGVvIHRyYWNrLiIpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCiAgICAgY29uc3Qgdm9pZCAqZGF0YTsKQEAgLTY2MSwxNiArMzM0LDI1IEBACiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1hdGNoaW5nQ29kZWNzLnNpemUoKTsgKytpKSB7CiAgICAgICAgIGNvbnN0IEFTdHJpbmcgJmNvbXBvbmVudE5hbWUgPSBtYXRjaGluZ0NvZGVjc1tpXTsKLSAgICAgICAgVmlkZW9GcmFtZSAqZnJhbWUgPSBleHRyYWN0VmlkZW9GcmFtZSgKLSAgICAgICAgICAgICAgICBjb21wb25lbnROYW1lLCB0cmFja01ldGEsIHNvdXJjZSwgdGltZVVzLCBvcHRpb24sIGNvbG9yRm9ybWF0LCBtZXRhT25seSk7Ci0KLSAgICAgICAgaWYgKGZyYW1lICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBmcmFtZTsKKyAgICAgICAgVmlkZW9GcmFtZURlY29kZXIgZGVjb2Rlcihjb21wb25lbnROYW1lLCB0cmFja01ldGEsIHNvdXJjZSk7CisgICAgICAgIGlmIChkZWNvZGVyLmluaXQodGltZVVzLCBudW1GcmFtZXMsIG9wdGlvbiwgY29sb3JGb3JtYXQpID09IE9LKSB7CisgICAgICAgICAgICBpZiAob3V0RnJhbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICpvdXRGcmFtZSA9IGRlY29kZXIuZXh0cmFjdEZyYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKCpvdXRGcmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG91dEZyYW1lcyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gZGVjb2Rlci5leHRyYWN0RnJhbWVzKG91dEZyYW1lcyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCIlcyBmYWlsZWQgdG8gZXh0cmFjdCB0aHVtYm5haWwsIHRyeWluZyBuZXh0IGRlY29kZXIuIiwgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgQUxPR1YoIiVzIGZhaWxlZCB0byBleHRyYWN0IGZyYW1lLCB0cnlpbmcgbmV4dCBkZWNvZGVyLiIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAgICAgfQogCi0gICAgcmV0dXJuIE5VTEw7CisgICAgQUxPR0UoImFsbCBjb2RlY3MgZmFpbGVkIHRvIGV4dHJhY3QgZnJhbWUuIik7CisgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiB9CiAKIE1lZGlhQWxidW1BcnQgKlN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXI6OmV4dHJhY3RBbGJ1bUFydCgpIHsKQEAgLTc5OCwxMiArNDgwLDI3IEBACiAgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX0NBUFRVUkVfRlJBTUVSQVRFLCBTdHJpbmc4KHRtcCkpOwogICAgIH0KIAorICAgIGludDY0X3QgZXhpZk9mZnNldCwgZXhpZlNpemU7CisgICAgaWYgKG1ldGEtPmZpbmRJbnQ2NChrS2V5RXhpZk9mZnNldCwgJmV4aWZPZmZzZXQpCisgICAgICYmIG1ldGEtPmZpbmRJbnQ2NChrS2V5RXhpZlNpemUsICZleGlmU2l6ZSkpIHsKKyAgICAgICAgc3ByaW50Zih0bXAsICIlbGxkIiwgKGxvbmcgbG9uZylleGlmT2Zmc2V0KTsKKyAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfRVhJRl9PRkZTRVQsIFN0cmluZzgodG1wKSk7CisgICAgICAgIHNwcmludGYodG1wLCAiJWxsZCIsIChsb25nIGxvbmcpZXhpZlNpemUpOworICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9FWElGX0xFTkdUSCwgU3RyaW5nOCh0bXApKTsKKyAgICB9CisKICAgICBib29sIGhhc0F1ZGlvID0gZmFsc2U7CiAgICAgYm9vbCBoYXNWaWRlbyA9IGZhbHNlOwogICAgIGludDMyX3QgdmlkZW9XaWR0aCA9IC0xOwogICAgIGludDMyX3QgdmlkZW9IZWlnaHQgPSAtMTsKKyAgICBpbnQzMl90IHZpZGVvRnJhbWVDb3VudCA9IDA7CiAgICAgaW50MzJfdCBhdWRpb0JpdHJhdGUgPSAtMTsKICAgICBpbnQzMl90IHJvdGF0aW9uQW5nbGUgPSAtMTsKKyAgICBpbnQzMl90IGltYWdlQ291bnQgPSAwOworICAgIGludDMyX3QgaW1hZ2VQcmltYXJ5ID0gMDsKKyAgICBpbnQzMl90IGltYWdlV2lkdGggPSAtMTsKKyAgICBpbnQzMl90IGltYWdlSGVpZ2h0ID0gLTE7CisgICAgaW50MzJfdCBpbWFnZVJvdGF0aW9uID0gLTE7CiAKICAgICAvLyBUaGUgb3ZlcmFsbCBkdXJhdGlvbiBpcyB0aGUgZHVyYXRpb24gb2YgdGhlIGxvbmdlc3QgdHJhY2suCiAgICAgaW50NjRfdCBtYXhEdXJhdGlvblVzID0gMDsKQEAgLTgzNCw2ICs1MzEsMjEgQEAKICAgICAgICAgICAgICAgICBpZiAoIXRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlSb3RhdGlvbiwgJnJvdGF0aW9uQW5nbGUpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uQW5nbGUgPSAwOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIXRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlGcmFtZUNvdW50LCAmdmlkZW9GcmFtZUNvdW50KSkgeworICAgICAgICAgICAgICAgICAgICB2aWRlb0ZyYW1lQ291bnQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKCJpbWFnZS8iLCBtaW1lLCA2KSkgeworICAgICAgICAgICAgICAgIGludDMyX3QgaXNQcmltYXJ5OworICAgICAgICAgICAgICAgIGlmICh0cmFja01ldGEtPmZpbmRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlUcmFja0lzRGVmYXVsdCwgJmlzUHJpbWFyeSkgJiYgaXNQcmltYXJ5KSB7CisgICAgICAgICAgICAgICAgICAgIGltYWdlUHJpbWFyeSA9IGltYWdlQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJmltYWdlV2lkdGgpKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sodHJhY2tNZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmltYWdlSGVpZ2h0KSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVJvdGF0aW9uLCAmaW1hZ2VSb3RhdGlvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlUm90YXRpb24gPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGltYWdlQ291bnQrKzsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQKSkgewogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxhbmc7CiAgICAgICAgICAgICAgICAgaWYgKHRyYWNrTWV0YS0+ZmluZENTdHJpbmcoa0tleU1lZGlhTGFuZ3VhZ2UsICZsYW5nKSkgewpAQCAtODcyLDYgKzU4NCwzMCBAQAogCiAgICAgICAgIHNwcmludGYodG1wLCAiJWQiLCByb3RhdGlvbkFuZ2xlKTsKICAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfVklERU9fUk9UQVRJT04sIFN0cmluZzgodG1wKSk7CisKKyAgICAgICAgaWYgKHZpZGVvRnJhbWVDb3VudCA+IDApIHsKKyAgICAgICAgICAgIHNwcmludGYodG1wLCAiJWQiLCB2aWRlb0ZyYW1lQ291bnQpOworICAgICAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfVklERU9fRlJBTUVfQ09VTlQsIFN0cmluZzgodG1wKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaW1hZ2VDb3VudCA+IDApIHsKKyAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfSEFTX0lNQUdFLCBTdHJpbmc4KCJ5ZXMiKSk7CisKKyAgICAgICAgc3ByaW50Zih0bXAsICIlZCIsIGltYWdlQ291bnQpOworICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9JTUFHRV9DT1VOVCwgU3RyaW5nOCh0bXApKTsKKworICAgICAgICBzcHJpbnRmKHRtcCwgIiVkIiwgaW1hZ2VQcmltYXJ5KTsKKyAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfSU1BR0VfUFJJTUFSWSwgU3RyaW5nOCh0bXApKTsKKworICAgICAgICBzcHJpbnRmKHRtcCwgIiVkIiwgaW1hZ2VXaWR0aCk7CisgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX0lNQUdFX1dJRFRILCBTdHJpbmc4KHRtcCkpOworCisgICAgICAgIHNwcmludGYodG1wLCAiJWQiLCBpbWFnZUhlaWdodCk7CisgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX0lNQUdFX0hFSUdIVCwgU3RyaW5nOCh0bXApKTsKKworICAgICAgICBzcHJpbnRmKHRtcCwgIiVkIiwgaW1hZ2VSb3RhdGlvbik7CisgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX0lNQUdFX1JPVEFUSU9OLCBTdHJpbmc4KHRtcCkpOwogICAgIH0KIAogICAgIGlmIChudW1UcmFja3MgPT0gMSAmJiBoYXNBdWRpbyAmJiBhdWRpb0JpdHJhdGUgPj0gMCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMTNmODcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodFBsdWdpbkxvYWRlci5jcHAKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTdGFnZWZyaWdodFBsdWdpbkxvYWRlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGRsZmNuLmg+CisKKyNpbmNsdWRlICJTdGFnZWZyaWdodFBsdWdpbkxvYWRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qIHN0YXRpYyAqLyBNdXRleCBTdGFnZWZyaWdodFBsdWdpbkxvYWRlcjo6c011dGV4OworLyogc3RhdGljICovIHN0ZDo6dW5pcXVlX3B0cjxTdGFnZWZyaWdodFBsdWdpbkxvYWRlcj4gU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXI6OnNJbnN0YW5jZTsKKworU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXI6OlN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyKGNvbnN0IGNoYXIgKmxpYlBhdGgpCisgICAgOiBtQ3JlYXRlQ29kZWMobnVsbHB0ciksCisgICAgICBtQ3JlYXRlQnVpbGRlcihudWxscHRyKSB7CisgICAgbUxpYkhhbmRsZSA9IGRsb3BlbihsaWJQYXRoLCBSVExEX05PVyB8IFJUTERfTk9ERUxFVEUpOworICAgIGlmIChtTGliSGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIkZhaWxlZCB0byBsb2FkIGxpYnJhcnk6ICVzICglcykiLCBsaWJQYXRoLCBkbGVycm9yKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1DcmVhdGVDb2RlYyA9IChDb2RlY0Jhc2U6OkNyZWF0ZUNvZGVjRnVuYylkbHN5bShtTGliSGFuZGxlLCAiQ3JlYXRlQ29kZWMiKTsKKyAgICBpZiAobUNyZWF0ZUNvZGVjID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIkZhaWxlZCB0byBmaW5kIHN5bWJvbDogQ3JlYXRlQ29kZWMgKCVzKSIsIGRsZXJyb3IoKSk7CisgICAgfQorICAgIG1DcmVhdGVCdWlsZGVyID0gKE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2U6OkNyZWF0ZUJ1aWxkZXJGdW5jKWRsc3ltKAorICAgICAgICAgICAgbUxpYkhhbmRsZSwgIkNyZWF0ZUJ1aWxkZXIiKTsKKyAgICBpZiAobUNyZWF0ZUJ1aWxkZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIGZpbmQgc3ltYm9sOiBDcmVhdGVCdWlsZGVyICglcykiLCBkbGVycm9yKCkpOworICAgIH0KK30KKworU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXI6On5TdGFnZWZyaWdodFBsdWdpbkxvYWRlcigpIHsKKyAgICBpZiAobUxpYkhhbmRsZSAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dWKCJDbG9zaW5nIGhhbmRsZSIpOworICAgICAgICBkbGNsb3NlKG1MaWJIYW5kbGUpOworICAgIH0KK30KKworQ29kZWNCYXNlICpTdGFnZWZyaWdodFBsdWdpbkxvYWRlcjo6Y3JlYXRlQ29kZWMoKSB7CisgICAgaWYgKG1MaWJIYW5kbGUgPT0gbnVsbHB0ciB8fCBtQ3JlYXRlQ29kZWMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiSGFuZGxlIG9yIENyZWF0ZUNvZGVjIHN5bWJvbCBpcyBudWxsIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gbUNyZWF0ZUNvZGVjKCk7Cit9CisKK01lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2UgKlN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyOjpjcmVhdGVCdWlsZGVyKCkgeworICAgIGlmIChtTGliSGFuZGxlID09IG51bGxwdHIgfHwgbUNyZWF0ZUJ1aWxkZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiSGFuZGxlIG9yIENyZWF0ZUJ1aWxkZXIgc3ltYm9sIGlzIG51bGwiKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBtQ3JlYXRlQnVpbGRlcigpOworfQorCisvL3N0YXRpYworY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyPiAmU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXI6OkdldENDb2RlY0luc3RhbmNlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChzTXV0ZXgpOworICAgIGlmICghc0luc3RhbmNlKSB7CisgICAgICAgIEFMT0dWKCJMb2FkaW5nIGxpYnJhcnkiKTsKKyAgICAgICAgc0luc3RhbmNlLnJlc2V0KG5ldyBTdGFnZWZyaWdodFBsdWdpbkxvYWRlcigibGlic3RhZ2VmcmlnaHRfY2NvZGVjLnNvIikpOworICAgIH0KKyAgICByZXR1cm4gc0luc3RhbmNlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc0Njc1NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTVEFHRUZSSUdIVF9QTFVHSU5fTE9BREVSX0hfCisKKyNkZWZpbmUgU1RBR0VGUklHSFRfUExVR0lOX0xPQURFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyPiAmR2V0Q0NvZGVjSW5zdGFuY2UoKTsKKyAgICB+U3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIoKTsKKworICAgIENvZGVjQmFzZSAqY3JlYXRlQ29kZWMoKTsKKyAgICBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlICpjcmVhdGVCdWlsZGVyKCk7Citwcml2YXRlOgorICAgIGV4cGxpY2l0IFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyKGNvbnN0IGNoYXIgKmxpYlBhdGgpOworCisgICAgc3RhdGljIE11dGV4IHNNdXRleDsKKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyPiBzSW5zdGFuY2U7CisKKyAgICB2b2lkICptTGliSGFuZGxlOworICAgIENvZGVjQmFzZTo6Q3JlYXRlQ29kZWNGdW5jIG1DcmVhdGVDb2RlYzsKKyAgICBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlOjpDcmVhdGVCdWlsZGVyRnVuYyBtQ3JlYXRlQnVpbGRlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gU1RBR0VGUklHSFRfUExVR0lOX0xPQURFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNGU4NmIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiU3VyZmFjZU1lZGlhU291cmNlIgotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxPTVhfSVZDb21tb24uaD4KLSNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgotI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgotCi0jaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgotI2luY2x1ZGUgPGd1aS9CdWZmZXJJdGVtLmg+Ci0jaW5jbHVkZSA8Z3VpL0lTdXJmYWNlQ29tcG9zZXIuaD4KLSNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLSNpbmNsdWRlIDxwcml2YXRlL2d1aS9Db21wb3NlclNlcnZpY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1TdXJmYWNlTWVkaWFTb3VyY2U6OlN1cmZhY2VNZWRpYVNvdXJjZSh1aW50MzJfdCBidWZmZXJXaWR0aCwgdWludDMyX3QgYnVmZmVySGVpZ2h0KSA6Ci0gICAgbVdpZHRoKGJ1ZmZlcldpZHRoKSwKLSAgICBtSGVpZ2h0KGJ1ZmZlckhlaWdodCksCi0gICAgbUN1cnJlbnRTbG90KEJ1ZmZlclF1ZXVlOjpJTlZBTElEX0JVRkZFUl9TTE9UKSwKLSAgICBtTnVtUGVuZGluZ0J1ZmZlcnMoMCksCi0gICAgbUN1cnJlbnRUaW1lc3RhbXAoMCksCi0gICAgbUZyYW1lUmF0ZSgzMCksCi0gICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgIG1OdW1GcmFtZXNSZWNlaXZlZCgwKSwKLSAgICBtTnVtRnJhbWVzRW5jb2RlZCgwKSwKLSAgICBtRmlyc3RGcmFtZVRpbWVzdGFtcCgwKSwKLSAgICBtTWF4QWNxdWlyZWRCdWZmZXJDb3VudCg0KSwgIC8vIFhYWCBkb3VibGUtY2hlY2sgdGhlIGRlZmF1bHQKLSAgICBtVXNlQWJzb2x1dGVUaW1lc3RhbXBzKGZhbHNlKSB7Ci0gICAgQUxPR1YoIlN1cmZhY2VNZWRpYVNvdXJjZSIpOwotCi0gICAgaWYgKGJ1ZmZlcldpZHRoID09IDAgfHwgYnVmZmVySGVpZ2h0ID09IDApIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgZGltZW5zaW9ucyAlZHglZCIsIGJ1ZmZlcldpZHRoLCBidWZmZXJIZWlnaHQpOwotICAgIH0KLQotICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmbVByb2R1Y2VyLCAmbUNvbnN1bWVyKTsKLSAgICBtQ29uc3VtZXItPnNldERlZmF1bHRCdWZmZXJTaXplKGJ1ZmZlcldpZHRoLCBidWZmZXJIZWlnaHQpOwotICAgIG1Db25zdW1lci0+c2V0Q29uc3VtZXJVc2FnZUJpdHMoR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSIHwKLSAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSk7Ci0KLSAgICBzcDxJU3VyZmFjZUNvbXBvc2VyPiBjb21wb3NlcihDb21wb3NlclNlcnZpY2U6OmdldENvbXBvc2VyU2VydmljZSgpKTsKLQotICAgIC8vIE5vdGUgdGhhdCB3ZSBjYW4ndCBjcmVhdGUgYW4gc3A8Li4uPih0aGlzKSBpbiBhIGN0b3IgdGhhdCB3aWxsIG5vdCBrZWVwIGEKLSAgICAvLyByZWZlcmVuY2Ugb25jZSB0aGUgY3RvciBlbmRzLCBhcyB0aGF0IHdvdWxkIGNhdXNlIHRoZSByZWZjb3VudCBvZiAndGhpcycKLSAgICAvLyBkcm9wcGluZyB0byAwIGF0IHRoZSBlbmQgb2YgdGhlIGN0b3IuICBTaW5jZSBhbGwgd2UgbmVlZCBpcyBhIHdwPC4uLj4KLSAgICAvLyB0aGF0J3Mgd2hhdCB3ZSBjcmVhdGUuCi0gICAgd3A8Q29uc3VtZXJMaXN0ZW5lcj4gbGlzdGVuZXIgPSBzdGF0aWNfY2FzdDxDb25zdW1lckxpc3RlbmVyKj4odGhpcyk7Ci0gICAgc3A8QnVmZmVyUXVldWU6OlByb3h5Q29uc3VtZXJMaXN0ZW5lcj4gcHJveHkgPSBuZXcgQnVmZmVyUXVldWU6OlByb3h5Q29uc3VtZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtQ29uc3VtZXItPmNvbnN1bWVyQ29ubmVjdChwcm94eSwgZmFsc2UpOwotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIlN1cmZhY2VNZWRpYVNvdXJjZTogZXJyb3IgY29ubmVjdGluZyB0byBCdWZmZXJRdWV1ZTogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIGVycik7Ci0gICAgfQotfQotCi1TdXJmYWNlTWVkaWFTb3VyY2U6On5TdXJmYWNlTWVkaWFTb3VyY2UoKSB7Ci0gICAgQUxPR1YoIn5TdXJmYWNlTWVkaWFTb3VyY2UiKTsKLSAgICBDSEVDSyghbVN0YXJ0ZWQpOwotfQotCi1uc2Vjc190IFN1cmZhY2VNZWRpYVNvdXJjZTo6Z2V0VGltZXN0YW1wKCkgewotICAgIEFMT0dWKCJnZXRUaW1lc3RhbXAiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIHJldHVybiBtQ3VycmVudFRpbWVzdGFtcDsKLX0KLQotdm9pZCBTdXJmYWNlTWVkaWFTb3VyY2U6OnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIoCi0gICAgICAgIGNvbnN0IHNwPEZyYW1lQXZhaWxhYmxlTGlzdGVuZXI+JiBsaXN0ZW5lcikgewotICAgIEFMT0dWKCJzZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICBtRnJhbWVBdmFpbGFibGVMaXN0ZW5lciA9IGxpc3RlbmVyOwotfQotCi12b2lkIFN1cmZhY2VNZWRpYVNvdXJjZTo6ZHVtcFN0YXRlKFN0cmluZzgmIHJlc3VsdCkgY29uc3QKLXsKLSAgICBjaGFyIGJ1ZmZlclsxMDI0XTsKLSAgICBkdW1wU3RhdGUocmVzdWx0LCAiIiwgYnVmZmVyLCAxMDI0KTsKLX0KLQotdm9pZCBTdXJmYWNlTWVkaWFTb3VyY2U6OmR1bXBTdGF0ZSgKLSAgICAgICAgU3RyaW5nOCYgcmVzdWx0LAotICAgICAgICBjb25zdCBjaGFyKiAvKiBwcmVmaXggKi8sCi0gICAgICAgIGNoYXIqIGJ1ZmZlciwKLSAgICAgICAgc2l6ZV90IC8qIFNJWkUgKi8pIGNvbnN0Ci17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLQotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBtQ29uc3VtZXItPmR1bXBTdGF0ZShyZXN1bHQsICIiKTsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZU1lZGlhU291cmNlOjpzZXRGcmFtZVJhdGUoaW50MzJfdCBmcHMpCi17Ci0gICAgQUxPR1YoInNldEZyYW1lUmF0ZSIpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgY29uc3QgaW50IE1BWF9GUkFNRV9SQVRFID0gNjA7Ci0gICAgaWYgKGZwcyA8IDAgfHwgZnBzID4gTUFYX0ZSQU1FX1JBVEUpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgbUZyYW1lUmF0ZSA9IGZwczsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLU1ldGFkYXRhQnVmZmVyVHlwZSBTdXJmYWNlTWVkaWFTb3VyY2U6Om1ldGFEYXRhU3RvcmVkSW5WaWRlb0J1ZmZlcnMoKSBjb25zdCB7Ci0gICAgQUxPR1YoImlzTWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycyIpOwotICAgIHJldHVybiBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyOwotfQotCi1pbnQzMl90IFN1cmZhY2VNZWRpYVNvdXJjZTo6Z2V0RnJhbWVSYXRlKCApIGNvbnN0IHsKLSAgICBBTE9HVigiZ2V0RnJhbWVSYXRlIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICByZXR1cm4gbUZyYW1lUmF0ZTsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZU1lZGlhU291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKQotewotICAgIEFMT0dWKCJzdGFydCIpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLQotICAgIENIRUNLKCFtU3RhcnRlZCk7Ci0KLSAgICBtU3RhcnRUaW1lTnMgPSAwOwotICAgIGludDY0X3Qgc3RhcnRUaW1lVXM7Ci0gICAgaW50MzJfdCBidWZmZXJDb3VudCA9IDA7Ci0gICAgaWYgKHBhcmFtcykgewotICAgICAgICBpZiAocGFyYW1zLT5maW5kSW50NjQoa0tleVRpbWUsICZzdGFydFRpbWVVcykpIHsKLSAgICAgICAgICAgIG1TdGFydFRpbWVOcyA9IHN0YXJ0VGltZVVzICogMTAwMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghcGFyYW1zLT5maW5kSW50MzIoa0tleU51bUJ1ZmZlcnMsICZidWZmZXJDb3VudCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmluZCB0aGUgYWR2ZXJ0aXNlZCBidWZmZXIgY291bnQiKTsKLSAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJ1ZmZlckNvdW50IDw9IDEpIHsKLSAgICAgICAgICAgIEFMT0dFKCJidWZmZXJDb3VudCAlZCBpcyB0b28gc21hbGwiLCBidWZmZXJDb3VudCk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0KLSAgICAgICAgbU1heEFjcXVpcmVkQnVmZmVyQ291bnQgPSBidWZmZXJDb3VudDsKLSAgICB9Ci0KLSAgICBDSEVDS19HVChtTWF4QWNxdWlyZWRCdWZmZXJDb3VudCwgMXUpOwotCi0gICAgc3RhdHVzX3QgZXJyID0KLSAgICAgICAgbUNvbnN1bWVyLT5zZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KG1NYXhBY3F1aXJlZEJ1ZmZlckNvdW50KTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBtTnVtUGVuZGluZ0J1ZmZlcnMgPSAwOwotICAgIG1TdGFydGVkID0gdHJ1ZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZU1lZGlhU291cmNlOjpzZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KHNpemVfdCBjb3VudCkgewotICAgIEFMT0dWKCJzZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KCV6dSkiLCBjb3VudCk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLQotICAgIENIRUNLX0dUKGNvdW50LCAxdSk7Ci0gICAgbU1heEFjcXVpcmVkQnVmZmVyQ291bnQgPSBjb3VudDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZU1lZGlhU291cmNlOjpzZXRVc2VBYnNvbHV0ZVRpbWVzdGFtcHMoKSB7Ci0gICAgQUxPR1YoInNldFVzZUFic29sdXRlVGltZXN0YW1wcyIpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgbVVzZUFic29sdXRlVGltZXN0YW1wcyA9IHRydWU7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VNZWRpYVNvdXJjZTo6c3RvcCgpCi17Ci0gICAgQUxPR1YoInN0b3AiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotCi0gICAgaWYgKCFtU3RhcnRlZCkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICBtRnJhbWVBdmFpbGFibGVDb25kaXRpb24uc2lnbmFsKCk7Ci0KLSAgICB3aGlsZSAobU51bVBlbmRpbmdCdWZmZXJzID4gMCkgewotICAgICAgICBBTE9HSSgiU3RpbGwgd2FpdGluZyBmb3IgJXp1IGJ1ZmZlcnMgdG8gYmUgcmV0dXJuZWQuIiwKLSAgICAgICAgICAgICAgICBtTnVtUGVuZGluZ0J1ZmZlcnMpOwotCi0jaWYgREVCVUdfUEVORElOR19CVUZGRVJTCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBlbmRpbmdCdWZmZXJzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBBTE9HSSgiJWQ6ICVwIiwgaSwgbVBlbmRpbmdCdWZmZXJzLml0ZW1BdChpKSk7Ci0gICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgIG1NZWRpYUJ1ZmZlcnNBdmFpbGFibGVDb25kaXRpb24ud2FpdChtTXV0ZXgpOwotICAgIH0KLQotICAgIG1NZWRpYUJ1ZmZlcnNBdmFpbGFibGVDb25kaXRpb24uc2lnbmFsKCk7Ci0KLSAgICByZXR1cm4gbUNvbnN1bWVyLT5jb25zdW1lckRpc2Nvbm5lY3QoKTsKLX0KLQotc3A8TWV0YURhdGE+IFN1cmZhY2VNZWRpYVNvdXJjZTo6Z2V0Rm9ybWF0KCkKLXsKLSAgICBBTE9HVigiZ2V0Rm9ybWF0Iik7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotCi0gICAgbWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCBtV2lkdGgpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIG1IZWlnaHQpOwotICAgIC8vIFRoZSBlbmNvZGVyIGZvcm1hdCBpcyBzZXQgYXMgYW4gb3BhcXVlIGNvbG9yZm9ybWF0Ci0gICAgLy8gVGhlIGVuY29kZXIgd2lsbCBsYXRlciBmaW5kIG91dCB0aGUgYWN0dWFsIGNvbG9yZm9ybWF0Ci0gICAgLy8gZnJvbSB0aGUgR0wgRnJhbWVzIGl0c2VsZi4KLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5Q29sb3JGb3JtYXQsIE9NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkT3BhcXVlKTsKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5U3RyaWRlLCBtV2lkdGgpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlTbGljZUhlaWdodCwgbUhlaWdodCk7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleUZyYW1lUmF0ZSwgbUZyYW1lUmF0ZSk7Ci0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVyk7Ci0gICAgcmV0dXJuIG1ldGE7Ci19Ci0KLS8vIFBhc3MgdGhlIGRhdGEgdG8gdGhlIE1lZGlhQnVmZmVyLiBQYXNzIGluIG9ubHkgdGhlIG1ldGFkYXRhCi0vLyBOb3RlOiBDYWxsIG9ubHkgd2hlbiB5b3UgaGF2ZSB0aGUgbG9jawotdm9pZCBTdXJmYWNlTWVkaWFTb3VyY2U6OnBhc3NNZXRhZGF0YUJ1ZmZlcl9sKE1lZGlhQnVmZmVyICoqYnVmZmVyLAotICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyICpidWZmZXJIYW5kbGUpIGNvbnN0IHsKLSAgICAqYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKHNpemVvZihWaWRlb05hdGl2ZU1ldGFkYXRhKSk7Ci0gICAgVmlkZW9OYXRpdmVNZXRhZGF0YSAqZGF0YSA9IChWaWRlb05hdGl2ZU1ldGFkYXRhICopKCpidWZmZXIpLT5kYXRhKCk7Ci0gICAgaWYgKGRhdGEgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgbWV0YWRhdGEgYnVmZmVyISIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGRhdGEtPmVUeXBlID0gbWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycygpOwotICAgIGRhdGEtPnBCdWZmZXIgPSBidWZmZXJIYW5kbGU7Ci0gICAgZGF0YS0+bkZlbmNlRmQgPSAtMTsKLSAgICBBTE9HVigiaGFuZGxlID0gJXAsIG9mZnNldCA9ICV6dSwgbGVuZ3RoID0gJXp1IiwKLSAgICAgICAgICAgIGJ1ZmZlckhhbmRsZSwgKCpidWZmZXIpLT5yYW5nZV9sZW5ndGgoKSwgKCpidWZmZXIpLT5yYW5nZV9vZmZzZXQoKSk7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VNZWRpYVNvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICogLyogb3B0aW9ucyAqLykgewotICAgIEFMT0dWKCJyZWFkIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLQotICAgICpidWZmZXIgPSBOVUxMOwotCi0gICAgd2hpbGUgKG1TdGFydGVkICYmIG1OdW1QZW5kaW5nQnVmZmVycyA9PSBtTWF4QWNxdWlyZWRCdWZmZXJDb3VudCkgewotICAgICAgICBtTWVkaWFCdWZmZXJzQXZhaWxhYmxlQ29uZGl0aW9uLndhaXQobU11dGV4KTsKLSAgICB9Ci0KLSAgICAvLyBVcGRhdGUgdGhlIGN1cnJlbnQgYnVmZmVyIGluZm8KLSAgICAvLyBUT0RPOiBtQ3VycmVudFNsb3QgY2FuIGJlIG1hZGUgYSBidWZmZXJzdGF0ZSBzaW5jZSB0aGVyZQotICAgIC8vIGNhbiBiZSBtb3JlIHRoYW4gb25lICJjdXJyZW50IiBzbG90cy4KLQotICAgIEJ1ZmZlckl0ZW0gaXRlbTsKLSAgICAvLyBJZiB0aGUgcmVjb3JkaW5nIGhhcyBzdGFydGVkIGFuZCB0aGUgcXVldWUgaXMgZW1wdHksIHRoZW4ganVzdAotICAgIC8vIHdhaXQgaGVyZSB0aWxsIHRoZSBmcmFtZXMgY29tZSBpbiBmcm9tIHRoZSBjbGllbnQgc2lkZQotICAgIHdoaWxlIChtU3RhcnRlZCkgewotCi0gICAgICAgIHN0YXR1c190IGVyciA9IG1Db25zdW1lci0+YWNxdWlyZUJ1ZmZlcigmaXRlbSwgMCk7Ci0gICAgICAgIGlmIChlcnIgPT0gQnVmZmVyUXVldWU6Ok5PX0JVRkZFUl9BVkFJTEFCTEUpIHsKLSAgICAgICAgICAgIC8vIHdhaXQgZm9yIGEgYnVmZmVyIHRvIGJlIHF1ZXVlZAotICAgICAgICAgICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLndhaXQobU11dGV4KTsKLSAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgIGVyciA9IGl0ZW0ubUZlbmNlLT53YWl0Rm9yZXZlcigiU3VyZmFjZU1lZGlhU291cmNlOjpyZWFkIik7Ci0gICAgICAgICAgICBpZiAoZXJyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInJlYWQ6IGZhaWxlZCB0byB3YWl0IGZvciBidWZmZXIgZmVuY2U6ICVkIiwgZXJyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRmlyc3QgdGltZSBzZWVpbmcgdGhlIGJ1ZmZlcj8gIEFkZGVkIGl0IHRvIHRoZSBTTVMgc2xvdAotICAgICAgICAgICAgaWYgKGl0ZW0ubUdyYXBoaWNCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1TbG90c1tpdGVtLm1TbG90XS5tR3JhcGhpY0J1ZmZlciA9IGl0ZW0ubUdyYXBoaWNCdWZmZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU2xvdHNbaXRlbS5tU2xvdF0ubUZyYW1lTnVtYmVyID0gaXRlbS5tRnJhbWVOdW1iZXI7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIGZvciB0aGUgdGltaW5nIG9mIHRoaXMgYnVmZmVyCi0gICAgICAgICAgICBpZiAobU51bUZyYW1lc1JlY2VpdmVkID09IDAgJiYgIW1Vc2VBYnNvbHV0ZVRpbWVzdGFtcHMpIHsKLSAgICAgICAgICAgICAgICBtRmlyc3RGcmFtZVRpbWVzdGFtcCA9IGl0ZW0ubVRpbWVzdGFtcDsKLSAgICAgICAgICAgICAgICAvLyBJbml0aWFsIGRlbGF5Ci0gICAgICAgICAgICAgICAgaWYgKG1TdGFydFRpbWVOcyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ubVRpbWVzdGFtcCA8IG1TdGFydFRpbWVOcykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBmcmFtZSBwcmVkYXRlcyBzdGFydCBvZiByZWNvcmQsIGRpc2NhcmQKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5tU2xvdCwgaXRlbS5tRnJhbWVOdW1iZXIsIEVHTF9OT19ESVNQTEFZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xfTk9fU1lOQ19LSFIsIEZlbmNlOjpOT19GRU5DRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lTnMgPSBpdGVtLm1UaW1lc3RhbXAgLSBtU3RhcnRUaW1lTnM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaXRlbS5tVGltZXN0YW1wID0gbVN0YXJ0VGltZU5zICsgKGl0ZW0ubVRpbWVzdGFtcCAtIG1GaXJzdEZyYW1lVGltZXN0YW1wKTsKLQotICAgICAgICAgICAgbU51bUZyYW1lc1JlY2VpdmVkKys7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoInJlYWQ6IGFjcXVpcmUgZmFpbGVkIHdpdGggZXJyb3IgY29kZSAlZCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLy8gSWYgdGhlIGxvb3Agd2FzIGV4aXRlZCBhcyBhIHJlc3VsdCBvZiBzdG9wcGluZyB0aGUgcmVjb3JkaW5nLAotICAgIC8vIGl0IGlzIE9LCi0gICAgaWYgKCFtU3RhcnRlZCkgewotICAgICAgICBBTE9HVigiUmVhZDogU3VyZmFjZU1lZGlhU291cmNlIGlzIHN0b3BwZWQuIFJldHVybmluZyBFUlJPUl9FTkRfT0ZfU1RSRUFNLiIpOwotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICB9Ci0KLSAgICBtQ3VycmVudFNsb3QgPSBpdGVtLm1TbG90OwotCi0gICAgLy8gRmlyc3QgdGltZSBzZWVpbmcgdGhlIGJ1ZmZlcj8gIEFkZGVkIGl0IHRvIHRoZSBTTVMgc2xvdAotICAgIGlmIChpdGVtLm1HcmFwaGljQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgbVNsb3RzW2l0ZW0ubVNsb3RdLm1HcmFwaGljQnVmZmVyID0gaXRlbS5tR3JhcGhpY0J1ZmZlcjsKLSAgICB9Ci0gICAgbVNsb3RzW2l0ZW0ubVNsb3RdLm1GcmFtZU51bWJlciA9IGl0ZW0ubUZyYW1lTnVtYmVyOwotCi0gICAgbUN1cnJlbnRCdWZmZXJzLnB1c2hfYmFjayhtU2xvdHNbbUN1cnJlbnRTbG90XS5tR3JhcGhpY0J1ZmZlcik7Ci0gICAgaW50NjRfdCBwcmV2VGltZVN0YW1wID0gbUN1cnJlbnRUaW1lc3RhbXA7Ci0gICAgbUN1cnJlbnRUaW1lc3RhbXAgPSBpdGVtLm1UaW1lc3RhbXA7Ci0KLSAgICBtTnVtRnJhbWVzRW5jb2RlZCsrOwotICAgIC8vIFBhc3MgdGhlIGRhdGEgdG8gdGhlIE1lZGlhQnVmZmVyLiBQYXNzIGluIG9ubHkgdGhlIG1ldGFkYXRhCi0KLSAgICBwYXNzTWV0YWRhdGFCdWZmZXJfbChidWZmZXIsIG1TbG90c1ttQ3VycmVudFNsb3RdLm1HcmFwaGljQnVmZmVyLT5nZXROYXRpdmVCdWZmZXIoKSk7Ci0KLSAgICAoKmJ1ZmZlciktPnNldE9ic2VydmVyKHRoaXMpOwotICAgICgqYnVmZmVyKS0+YWRkX3JlZigpOwotICAgICgqYnVmZmVyKS0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBtQ3VycmVudFRpbWVzdGFtcCAvIDEwMDApOwotICAgIEFMT0dWKCJGcmFtZXMgZW5jb2RlZCA9ICVkLCB0aW1lc3RhbXAgPSAlIiBQUklkNjQgIiwgdGltZSBkaWZmID0gJSIgUFJJZDY0LAotICAgICAgICAgICAgbU51bUZyYW1lc0VuY29kZWQsIG1DdXJyZW50VGltZXN0YW1wIC8gMTAwMCwKLSAgICAgICAgICAgIG1DdXJyZW50VGltZXN0YW1wIC8gMTAwMCAtIHByZXZUaW1lU3RhbXAgLyAxMDAwKTsKLQotICAgICsrbU51bVBlbmRpbmdCdWZmZXJzOwotCi0jaWYgREVCVUdfUEVORElOR19CVUZGRVJTCi0gICAgbVBlbmRpbmdCdWZmZXJzLnB1c2hfYmFjaygqYnVmZmVyKTsKLSNlbmRpZgotCi0gICAgQUxPR1YoInJldHVybmluZyBtYnVmICVwIiwgKmJ1ZmZlcik7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXRpYyBidWZmZXJfaGFuZGxlX3QgZ2V0TWVkaWFCdWZmZXJIYW5kbGUoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgewotICAgIC8vIG5lZWQgdG8gY29udmVydCB0byBjaGFyKiBmb3IgcG9pbnRlciBhcml0aG1ldGljIGFuZCB0aGVuCi0gICAgLy8gY29weSB0aGUgYnl0ZSBzdHJlYW0gaW50byBvdXIgaGFuZGxlCi0gICAgYnVmZmVyX2hhbmRsZV90IGJ1ZmZlckhhbmRsZTsKLSAgICBtZW1jcHkoJmJ1ZmZlckhhbmRsZSwgKGNoYXIqKShidWZmZXItPmRhdGEoKSkgKyA0LCBzaXplb2YoYnVmZmVyX2hhbmRsZV90KSk7Ci0gICAgcmV0dXJuIGJ1ZmZlckhhbmRsZTsKLX0KLQotdm9pZCBTdXJmYWNlTWVkaWFTb3VyY2U6OnNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKLSAgICBBTE9HVigic2lnbmFsQnVmZmVyUmV0dXJuZWQiKTsKLQotICAgIGJvb2wgZm91bmRCdWZmZXIgPSBmYWxzZTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0KLSAgICBidWZmZXJfaGFuZGxlX3QgYnVmZmVySGFuZGxlID0gZ2V0TWVkaWFCdWZmZXJIYW5kbGUoYnVmZmVyKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUN1cnJlbnRCdWZmZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtQ3VycmVudEJ1ZmZlcnNbaV0tPmhhbmRsZSA9PSBidWZmZXJIYW5kbGUpIHsKLSAgICAgICAgICAgIG1DdXJyZW50QnVmZmVycy5yZW1vdmVBdChpKTsKLSAgICAgICAgICAgIGZvdW5kQnVmZmVyID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFmb3VuZEJ1ZmZlcikgewotICAgICAgICBBTE9HVygicmV0dXJuZWQgYnVmZmVyIHdhcyBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgYnVmZmVyIGxpc3QiKTsKLSAgICB9Ci0KLSAgICBmb3IgKGludCBpZCA9IDA7IGlkIDwgQnVmZmVyUXVldWU6Ok5VTV9CVUZGRVJfU0xPVFM7IGlkKyspIHsKLSAgICAgICAgaWYgKG1TbG90c1tpZF0ubUdyYXBoaWNCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYnVmZmVySGFuZGxlID09IG1TbG90c1tpZF0ubUdyYXBoaWNCdWZmZXItPmhhbmRsZSkgewotICAgICAgICAgICAgQUxPR1YoIlNsb3QgJWQgcmV0dXJuZWQsIG1hdGNoZXMgaGFuZGxlID0gJXAiLCBpZCwKLSAgICAgICAgICAgICAgICAgICAgbVNsb3RzW2lkXS5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlKTsKLQotICAgICAgICAgICAgbUNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKGlkLCBtU2xvdHNbaWRdLm1GcmFtZU51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NZTkNfS0hSLAotICAgICAgICAgICAgICAgICAgICBGZW5jZTo6Tk9fRkVOQ0UpOwotCi0gICAgICAgICAgICBidWZmZXItPnNldE9ic2VydmVyKDApOwotICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0KLSAgICAgICAgICAgIGZvdW5kQnVmZmVyID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFmb3VuZEJ1ZmZlcikgewotICAgICAgICBDSEVDSyghInNpZ25hbEJ1ZmZlclJldHVybmVkOiBib2d1cyBidWZmZXIiKTsKLSAgICB9Ci0KLSNpZiBERUJVR19QRU5ESU5HX0JVRkZFUlMKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QZW5kaW5nQnVmZmVycy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAobVBlbmRpbmdCdWZmZXJzLml0ZW1BdChpKSA9PSBidWZmZXIpIHsKLSAgICAgICAgICAgIG1QZW5kaW5nQnVmZmVycy5yZW1vdmVBdChpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotI2VuZGlmCi0KLSAgICAtLW1OdW1QZW5kaW5nQnVmZmVyczsKLSAgICBtTWVkaWFCdWZmZXJzQXZhaWxhYmxlQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwotfQotCi0vLyBQYXJ0IG9mIHRoZSBCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lcgotdm9pZCBTdXJmYWNlTWVkaWFTb3VyY2U6Om9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgLyogaXRlbSAqLykgewotICAgIEFMT0dWKCJvbkZyYW1lQXZhaWxhYmxlIik7Ci0KLSAgICBzcDxGcmFtZUF2YWlsYWJsZUxpc3RlbmVyPiBsaXN0ZW5lcjsKLSAgICB7IC8vIHNjb3BlIGZvciB0aGUgbG9jawotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgICAgICBtRnJhbWVBdmFpbGFibGVDb25kaXRpb24uYnJvYWRjYXN0KCk7Ci0gICAgICAgIGxpc3RlbmVyID0gbUZyYW1lQXZhaWxhYmxlTGlzdGVuZXI7Ci0gICAgfQotCi0gICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoImFjdHVhbGx5IGNhbGxpbmcgb25GcmFtZUF2YWlsYWJsZSIpOwotICAgICAgICBsaXN0ZW5lci0+b25GcmFtZUF2YWlsYWJsZSgpOwotICAgIH0KLX0KLQotLy8gU3VyZmFjZU1lZGlhU291cmNlIGhpamFja3MgdGhpcyBldmVudCB0byBhc3N1bWUKLS8vIHRoZSBwcm9kY3VlciBpcyBkaXNjb25uZWN0aW5nIGZyb20gdGhlIEJ1ZmZlclF1ZXVlCi0vLyBhbmQgdGhhdCBpdCBzaG91bGQgc3RvcCB0aGUgcmVjb3JkaW5nCi12b2lkIFN1cmZhY2VNZWRpYVNvdXJjZTo6b25CdWZmZXJzUmVsZWFzZWQoKSB7Ci0gICAgQUxPR1YoIm9uQnVmZmVyc1JlbGVhc2VkIik7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotCi0gICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCdWZmZXJRdWV1ZTo6TlVNX0JVRkZFUl9TTE9UUzsgaSsrKSB7Ci0gICAgICAgbVNsb3RzW2ldLm1HcmFwaGljQnVmZmVyID0gMDsKLSAgICB9Ci19Ci0KLXZvaWQgU3VyZmFjZU1lZGlhU291cmNlOjpvblNpZGViYW5kU3RyZWFtQ2hhbmdlZCgpIHsKLSAgICBBTE9HX0FTU0VSVChmYWxzZSwgIlN1cmZhY2VNZWRpYVNvdXJjZSBjYW4ndCBjb25zdW1lIHNpZGViYW5kIHN0cmVhbXMiKTsKLX0KLQotfSAvLyBlbmQgb2YgbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuY3BwCmluZGV4IGI3YzE1OTguLjllMTFhOTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmNwcApAQCAtMTgsOCArMTgsOCBAQAogI2RlZmluZSBMT0dfVEFHICJTdXJmYWNlVXRpbHMiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oPgotCiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMTI4LDYgKzEyOCw0MCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAordm9pZCBzZXROYXRpdmVXaW5kb3dIZHJNZXRhZGF0YShBTmF0aXZlV2luZG93ICpuYXRpdmVXaW5kb3csIEhEUlN0YXRpY0luZm8gKmluZm8pIHsKKyAgICBzdHJ1Y3QgYW5kcm9pZF9zbXB0ZTIwODZfbWV0YWRhdGEgc21wdGUyMDg2X21ldGEgPSB7CisgICAgICAgICAgICAuZGlzcGxheVByaW1hcnlSZWQgPSB7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPnNUeXBlMS5tUi54ICogMC4wMDAwMmYsCisgICAgICAgICAgICAgICAgICAgIGluZm8tPnNUeXBlMS5tUi55ICogMC4wMDAwMmYKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAuZGlzcGxheVByaW1hcnlHcmVlbiA9IHsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+c1R5cGUxLm1HLnggKiAwLjAwMDAyZiwKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+c1R5cGUxLm1HLnkgKiAwLjAwMDAyZgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC5kaXNwbGF5UHJpbWFyeUJsdWUgPSB7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPnNUeXBlMS5tQi54ICogMC4wMDAwMmYsCisgICAgICAgICAgICAgICAgICAgIGluZm8tPnNUeXBlMS5tQi55ICogMC4wMDAwMmYKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAud2hpdGVQb2ludCA9IHsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+c1R5cGUxLm1XLnggKiAwLjAwMDAyZiwKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+c1R5cGUxLm1XLnkgKiAwLjAwMDAyZgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC5tYXhMdW1pbmFuY2UgPSAoZmxvYXQpIGluZm8tPnNUeXBlMS5tTWF4RGlzcGxheUx1bWluYW5jZSwKKyAgICAgICAgICAgIC5taW5MdW1pbmFuY2UgPSBpbmZvLT5zVHlwZTEubU1pbkRpc3BsYXlMdW1pbmFuY2UgKiAwLjAwMDFmCisgICAgfTsKKworICAgIGludCBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3NtcHRlMjA4Nl9tZXRhZGF0YShuYXRpdmVXaW5kb3csICZzbXB0ZTIwODZfbWV0YSk7CisgICAgQUxPR1dfSUYoZXJyICE9IDAsICJmYWlsZWQgdG8gc2V0IHNtcHRlMjA4NiBtZXRhZGF0YSBvbiBzdXJmYWNlICglZCkiLCBlcnIpOworCisgICAgc3RydWN0IGFuZHJvaWRfY3RhODYxXzNfbWV0YWRhdGEgY3RhODYxX21ldGEgPSB7CisgICAgICAgICAgICAubWF4Q29udGVudExpZ2h0TGV2ZWwgPSAoZmxvYXQpIGluZm8tPnNUeXBlMS5tTWF4Q29udGVudExpZ2h0TGV2ZWwsCisgICAgICAgICAgICAubWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCA9IChmbG9hdCkgaW5mby0+c1R5cGUxLm1NYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsCisgICAgfTsKKworICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfY3RhODYxXzNfbWV0YWRhdGEobmF0aXZlV2luZG93LCAmY3RhODYxX21ldGEpOworICAgIEFMT0dXX0lGKGVyciAhPSAwLCAiZmFpbGVkIHRvIHNldCBjdGE4NjFfMyBtZXRhZGF0YSBvbiBzdXJmYWNlICglZCkiLCBlcnIpOworfQorCiBzdGF0dXNfdCBwdXNoQmxhbmtCdWZmZXJzVG9OYXRpdmVXaW5kb3coQU5hdGl2ZVdpbmRvdyAqbmF0aXZlV2luZG93IC8qIG5vbm51bGwgKi8pIHsKICAgICBzdGF0dXNfdCBlcnIgPSBOT19FUlJPUjsKICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBhbmIgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCmluZGV4IDNlZjhmMmEuLmNmNWU5MWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlICJpbmNsdWRlL0VTRFMuaCIKICNpbmNsdWRlICJpbmNsdWRlL0hldmNVdGlscy5oIgogCi0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9BdWRpby5oPgogI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX1ZpZGVvLmg+CkBAIC0zNyw2ICszNiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29rdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CkBAIC00NywzOSArNDcsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXVpbnQxNl90IFUxNl9BVChjb25zdCB1aW50OF90ICpwdHIpIHsKLSAgICByZXR1cm4gcHRyWzBdIDw8IDggfCBwdHJbMV07Ci19Ci0KLXVpbnQzMl90IFUzMl9BVChjb25zdCB1aW50OF90ICpwdHIpIHsKLSAgICByZXR1cm4gcHRyWzBdIDw8IDI0IHwgcHRyWzFdIDw8IDE2IHwgcHRyWzJdIDw8IDggfCBwdHJbM107Ci19Ci0KLXVpbnQ2NF90IFU2NF9BVChjb25zdCB1aW50OF90ICpwdHIpIHsKLSAgICByZXR1cm4gKCh1aW50NjRfdClVMzJfQVQocHRyKSkgPDwgMzIgfCBVMzJfQVQocHRyICsgNCk7Ci19Ci0KLXVpbnQxNl90IFUxNkxFX0FUKGNvbnN0IHVpbnQ4X3QgKnB0cikgewotICAgIHJldHVybiBwdHJbMF0gfCAocHRyWzFdIDw8IDgpOwotfQotCi11aW50MzJfdCBVMzJMRV9BVChjb25zdCB1aW50OF90ICpwdHIpIHsKLSAgICByZXR1cm4gcHRyWzNdIDw8IDI0IHwgcHRyWzJdIDw8IDE2IHwgcHRyWzFdIDw8IDggfCBwdHJbMF07Ci19Ci0KLXVpbnQ2NF90IFU2NExFX0FUKGNvbnN0IHVpbnQ4X3QgKnB0cikgewotICAgIHJldHVybiAoKHVpbnQ2NF90KVUzMkxFX0FUKHB0ciArIDQpKSA8PCAzMiB8IFUzMkxFX0FUKHB0cik7Ci19Ci0KLS8vIFhYWCB3YXJuaW5nOiB0aGVzZSB3b24ndCB3b3JrIG9uIGJpZy1lbmRpYW4gaG9zdC4KLXVpbnQ2NF90IG50b2g2NCh1aW50NjRfdCB4KSB7Ci0gICAgcmV0dXJuICgodWludDY0X3QpbnRvaGwoeCAmIDB4ZmZmZmZmZmYpIDw8IDMyKSB8IG50b2hsKHggPj4gMzIpOwotfQotCi11aW50NjRfdCBodG9uNjQodWludDY0X3QgeCkgewotICAgIHJldHVybiAoKHVpbnQ2NF90KWh0b25sKHggJiAweGZmZmZmZmZmKSA8PCAzMikgfCBodG9ubCh4ID4+IDMyKTsKLX0KLQogc3RhdGljIHN0YXR1c190IGNvcHlOQUxVVG9BQnVmZmVyKHNwPEFCdWZmZXI+ICpidWZmZXIsIGNvbnN0IHVpbnQ4X3QgKnB0ciwgc2l6ZV90IGxlbmd0aCkgewogICAgIGlmICgoKCpidWZmZXIpLT5zaXplKCkgKyA0ICsgbGVuZ3RoKSA+ICgoKmJ1ZmZlciktPmNhcGFjaXR5KCkgLSAoKmJ1ZmZlciktPm9mZnNldCgpKSkgewogICAgICAgICBzcDxBQnVmZmVyPiB0bXBCdWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcigoKmJ1ZmZlciktPnNpemUoKSArIDQgKyBsZW5ndGggKyAxMDI0KTsKQEAgLTE4Nyw2ICsxNTQsNyBAQAogICAgICAgICB7IDIzLCBPTVhfQVVESU9fQUFDT2JqZWN0TEQgICAgICAgfSwKICAgICAgICAgeyAyOSwgT01YX0FVRElPX0FBQ09iamVjdEhFX1BTICAgIH0sCiAgICAgICAgIHsgMzksIE9NWF9BVURJT19BQUNPYmplY3RFTEQgICAgICB9LAorICAgICAgICB7IDQyLCBPTVhfQVVESU9fQUFDT2JqZWN0WEhFICAgICAgfSwKICAgICB9OwogCiAgICAgT01YX0FVRElPX0FBQ1BST0ZJTEVUWVBFIHByb2ZpbGU7CkBAIC0zMzYsNiArMzA0LDggQEAKICAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBPTVhfVklERU9fSEVWQ1BST0ZJTEVUWVBFPiBwcm9maWxlcyB7CiAgICAgICAgIHsgMSwgT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbiAgIH0sCiAgICAgICAgIHsgMiwgT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbjEwIH0sCisgICAgICAgIC8vIHVzZSBNYWluIGZvciBNYWluIFN0aWxsIFBpY3R1cmUgZGVjb2RpbmcKKyAgICAgICAgeyAzLCBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluIH0sCiAgICAgfTsKIAogICAgIC8vIHNldCBwcm9maWxlICYgbGV2ZWwgaWYgdGhleSBhcmUgcmVjb2duaXplZApAQCAtMzQzLDYgKzMxMyw3IEBACiAgICAgT01YX1ZJREVPX0hFVkNMRVZFTFRZUEUgY29kZWNMZXZlbDsKICAgICBpZiAoIXByb2ZpbGVzLm1hcChwcm9maWxlLCAmY29kZWNQcm9maWxlKSkgewogICAgICAgICBpZiAocHRyWzJdICYgMHg0MCAvKiBnZW5lcmFsIGNvbXBhdGliaWxpdHkgZmxhZyAxICovKSB7CisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBjYXNlIGNvdmVycyBNYWluIFN0aWxsIFBpY3R1cmUgdG9vCiAgICAgICAgICAgICBjb2RlY1Byb2ZpbGUgPSBPTVhfVklERU9fSEVWQ1Byb2ZpbGVNYWluOwogICAgICAgICB9IGVsc2UgaWYgKHB0clsyXSAmIDB4MjAgLyogZ2VuZXJhbCBjb21wYXRpYmlsaXR5IGZsYWcgMiAqLykgewogICAgICAgICAgICAgY29kZWNQcm9maWxlID0gT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbjEwOwpAQCAtNjcyLDcgKzY0Myw4IEBACiAgICAgICAgIG1zZy0+c2V0U3RyaW5nKCJsYW5ndWFnZSIsIGxhbmcpOwogICAgIH0KIAotICAgIGlmICghc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUsIDYpKSB7CisgICAgaWYgKCFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikgfHwKKyAgICAgICAgICAgICFzdHJuY2FzZWNtcCgiaW1hZ2UvIiwgbWltZSwgNikpIHsKICAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OwogICAgICAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCkKICAgICAgICAgICAgICAgICB8fCAhbWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpKSB7CkBAIC02OTYsNiArNjY4LDIzIEBACiAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJzYXItaGVpZ2h0Iiwgc2FySGVpZ2h0KTsKICAgICAgICAgfQogCisgICAgICAgIGlmICghc3RybmNhc2VjbXAoImltYWdlLyIsIG1pbWUsIDYpKSB7CisgICAgICAgICAgICBpbnQzMl90IHRpbGVXaWR0aCwgdGlsZUhlaWdodCwgZ3JpZFJvd3MsIGdyaWRDb2xzOworICAgICAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5VGlsZVdpZHRoLCAmdGlsZVdpZHRoKQorICAgICAgICAgICAgICAgICAgICAmJiBtZXRhLT5maW5kSW50MzIoa0tleVRpbGVIZWlnaHQsICZ0aWxlSGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICAmJiBtZXRhLT5maW5kSW50MzIoa0tleUdyaWRSb3dzLCAmZ3JpZFJvd3MpCisgICAgICAgICAgICAgICAgICAgICYmIG1ldGEtPmZpbmRJbnQzMihrS2V5R3JpZENvbHMsICZncmlkQ29scykpIHsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJ0aWxlLXdpZHRoIiwgdGlsZVdpZHRoKTsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJ0aWxlLWhlaWdodCIsIHRpbGVIZWlnaHQpOworICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImdyaWQtcm93cyIsIGdyaWRSb3dzKTsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJncmlkLWNvbHMiLCBncmlkQ29scyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQzMl90IGlzUHJpbWFyeTsKKyAgICAgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVRyYWNrSXNEZWZhdWx0LCAmaXNQcmltYXJ5KSAmJiBpc1ByaW1hcnkpIHsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJpcy1kZWZhdWx0IiwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBpbnQzMl90IGNvbG9yRm9ybWF0OwogICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlDb2xvckZvcm1hdCwgJmNvbG9yRm9ybWF0KSkgewogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiY29sb3ItZm9ybWF0IiwgY29sb3JGb3JtYXQpOwpAQCAtMTMyNyw3ICsxMzE2LDcgQEAKICAgICAgICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TWVkaWFMYW5ndWFnZSwgbGFuZy5jX3N0cigpKTsKICAgICB9CiAKLSAgICBpZiAobWltZS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgeworICAgIGlmIChtaW1lLnN0YXJ0c1dpdGgoInZpZGVvLyIpIHx8IG1pbWUuc3RhcnRzV2l0aCgiaW1hZ2UvIikpIHsKICAgICAgICAgaW50MzJfdCB3aWR0aDsKICAgICAgICAgaW50MzJfdCBoZWlnaHQ7CiAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpICYmIG1zZy0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgewpAQCAtMTM1MSw2ICsxMzQwLDI2IEBACiAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5RGlzcGxheUhlaWdodCwgZGlzcGxheUhlaWdodCk7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAobWltZS5zdGFydHNXaXRoKCJpbWFnZS8iKSl7CisgICAgICAgICAgICBpbnQzMl90IGlzUHJpbWFyeTsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiaXMtZGVmYXVsdCIsICZpc1ByaW1hcnkpICYmIGlzUHJpbWFyeSkgeworICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUcmFja0lzRGVmYXVsdCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQzMl90IHRpbGVXaWR0aCwgdGlsZUhlaWdodCwgZ3JpZFJvd3MsIGdyaWRDb2xzOworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJ0aWxlLXdpZHRoIiwgJnRpbGVXaWR0aCkpIHsKKyAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGlsZVdpZHRoLCB0aWxlV2lkdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJ0aWxlLWhlaWdodCIsICZ0aWxlSGVpZ2h0KSkgeworICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUaWxlSGVpZ2h0LCB0aWxlSGVpZ2h0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZ3JpZC1yb3dzIiwgJmdyaWRSb3dzKSkgeworICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlHcmlkUm93cywgZ3JpZFJvd3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJncmlkLWNvbHMiLCAmZ3JpZENvbHMpKSB7CisgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUdyaWRDb2xzLCBncmlkQ29scyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBpbnQzMl90IGNvbG9yRm9ybWF0OwogICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCkpIHsKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlDb2xvckZvcm1hdCwgY29sb3JGb3JtYXQpOwpAQCAtMTQ2Nyw3ICsxNDc2LDggQEAKICAgICAgICAgICAgIC8vIGZvciB0cmFuc3BvcnRpbmcgdGhlIENTRCB0byBtdXhlcnMuCiAgICAgICAgICAgICByZWFzc2VtYmxlRVNEUyhjc2QwLCBlc2RzLmRhdGEoKSk7CiAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlFU0RTLCBrS2V5RVNEUywgZXNkcy5kYXRhKCksIGVzZHMuc2l6ZSgpKTsKLSAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpIHsKKyAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMgfHwKKyAgICAgICAgICAgICAgICAgICBtaW1lID09IE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQykgewogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaHZjYyhjc2Qwc2l6ZSArIDEwMjQpOwogICAgICAgICAgICAgc2l6ZV90IG91dHNpemUgPSByZWFzc2VtYmxlSFZDQyhjc2QwLCBodmNjLmRhdGEoKSwgaHZjYy5zaXplKCksIDQpOwogICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5SFZDQywga0tleUhWQ0MsIGh2Y2MuZGF0YSgpLCBvdXRzaXplKTsKQEAgLTE2MDEsNiArMTYxMSw3IEBACiAgICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0TEQsICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfTER9LAogICAgIHsgT01YX0FVRElPX0FBQ09iamVjdEhFX1BTLCAgICAgICBBVURJT19GT1JNQVRfQUFDX0hFX1YyfSwKICAgICB7IE9NWF9BVURJT19BQUNPYmplY3RFTEQsICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19FTER9LAorICAgIHsgT01YX0FVRElPX0FBQ09iamVjdFhIRSwgICAgICAgICBBVURJT19GT1JNQVRfQUFDX1hIRX0sCiAgICAgeyBPTVhfQVVESU9fQUFDT2JqZWN0TnVsbCwgICAgICAgIEFVRElPX0ZPUk1BVF9BQUN9LAogfTsKIApAQCAtMTgwOSw0MSArMTgyMCwxNyBAQAogfQogCiB2b2lkIHdyaXRlVG9BTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MgJmJ1ZmZlcmluZykgewotICAgIG1zZy0+c2V0SW50MzIoImluaXQtbW9kZSIsIGJ1ZmZlcmluZy5tSW5pdGlhbEJ1ZmZlcmluZ01vZGUpOwotICAgIG1zZy0+c2V0SW50MzIoInJlYnVmZmVyLW1vZGUiLCBidWZmZXJpbmcubVJlYnVmZmVyaW5nTW9kZSk7Ci0gICAgbXNnLT5zZXRJbnQzMigiaW5pdC1tcyIsIGJ1ZmZlcmluZy5tSW5pdGlhbFdhdGVybWFya01zKTsKLSAgICBtc2ctPnNldEludDMyKCJpbml0LWtiIiwgYnVmZmVyaW5nLm1Jbml0aWFsV2F0ZXJtYXJrS0IpOwotICAgIG1zZy0+c2V0SW50MzIoInJlYnVmZmVyLWxvdy1tcyIsIGJ1ZmZlcmluZy5tUmVidWZmZXJpbmdXYXRlcm1hcmtMb3dNcyk7Ci0gICAgbXNnLT5zZXRJbnQzMigicmVidWZmZXItaGlnaC1tcyIsIGJ1ZmZlcmluZy5tUmVidWZmZXJpbmdXYXRlcm1hcmtIaWdoTXMpOwotICAgIG1zZy0+c2V0SW50MzIoInJlYnVmZmVyLWxvdy1rYiIsIGJ1ZmZlcmluZy5tUmVidWZmZXJpbmdXYXRlcm1hcmtMb3dLQik7Ci0gICAgbXNnLT5zZXRJbnQzMigicmVidWZmZXItaGlnaC1rYiIsIGJ1ZmZlcmluZy5tUmVidWZmZXJpbmdXYXRlcm1hcmtIaWdoS0IpOworICAgIG1zZy0+c2V0SW50MzIoImluaXQtbXMiLCBidWZmZXJpbmcubUluaXRpYWxNYXJrTXMpOworICAgIG1zZy0+c2V0SW50MzIoInJlc3VtZS1wbGF5YmFjay1tcyIsIGJ1ZmZlcmluZy5tUmVzdW1lUGxheWJhY2tNYXJrTXMpOwogfQogCiB2b2lkIHJlYWRGcm9tQU1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIEJ1ZmZlcmluZ1NldHRpbmdzICpidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgewogICAgIGludDMyX3QgdmFsdWU7Ci0gICAgaWYgKG1zZy0+ZmluZEludDMyKCJpbml0LW1vZGUiLCAmdmFsdWUpKSB7Ci0gICAgICAgIGJ1ZmZlcmluZy0+bUluaXRpYWxCdWZmZXJpbmdNb2RlID0gKEJ1ZmZlcmluZ01vZGUpdmFsdWU7Ci0gICAgfQotICAgIGlmIChtc2ctPmZpbmRJbnQzMigicmVidWZmZXItbW9kZSIsICZ2YWx1ZSkpIHsKLSAgICAgICAgYnVmZmVyaW5nLT5tUmVidWZmZXJpbmdNb2RlID0gKEJ1ZmZlcmluZ01vZGUpdmFsdWU7Ci0gICAgfQogICAgIGlmIChtc2ctPmZpbmRJbnQzMigiaW5pdC1tcyIsICZ2YWx1ZSkpIHsKLSAgICAgICAgYnVmZmVyaW5nLT5tSW5pdGlhbFdhdGVybWFya01zID0gdmFsdWU7CisgICAgICAgIGJ1ZmZlcmluZy0+bUluaXRpYWxNYXJrTXMgPSB2YWx1ZTsKICAgICB9Ci0gICAgaWYgKG1zZy0+ZmluZEludDMyKCJpbml0LWtiIiwgJnZhbHVlKSkgewotICAgICAgICBidWZmZXJpbmctPm1Jbml0aWFsV2F0ZXJtYXJrS0IgPSB2YWx1ZTsKLSAgICB9Ci0gICAgaWYgKG1zZy0+ZmluZEludDMyKCJyZWJ1ZmZlci1sb3ctbXMiLCAmdmFsdWUpKSB7Ci0gICAgICAgIGJ1ZmZlcmluZy0+bVJlYnVmZmVyaW5nV2F0ZXJtYXJrTG93TXMgPSB2YWx1ZTsKLSAgICB9Ci0gICAgaWYgKG1zZy0+ZmluZEludDMyKCJyZWJ1ZmZlci1oaWdoLW1zIiwgJnZhbHVlKSkgewotICAgICAgICBidWZmZXJpbmctPm1SZWJ1ZmZlcmluZ1dhdGVybWFya0hpZ2hNcyA9IHZhbHVlOwotICAgIH0KLSAgICBpZiAobXNnLT5maW5kSW50MzIoInJlYnVmZmVyLWxvdy1rYiIsICZ2YWx1ZSkpIHsKLSAgICAgICAgYnVmZmVyaW5nLT5tUmVidWZmZXJpbmdXYXRlcm1hcmtMb3dLQiA9IHZhbHVlOwotICAgIH0KLSAgICBpZiAobXNnLT5maW5kSW50MzIoInJlYnVmZmVyLWhpZ2gta2IiLCAmdmFsdWUpKSB7Ci0gICAgICAgIGJ1ZmZlcmluZy0+bVJlYnVmZmVyaW5nV2F0ZXJtYXJrSGlnaEtCID0gdmFsdWU7CisgICAgaWYgKG1zZy0+ZmluZEludDMyKCJyZXN1bWUtcGxheWJhY2stbXMiLCAmdmFsdWUpKSB7CisgICAgICAgIGJ1ZmZlcmluZy0+bVJlc3VtZVBsYXliYWNrTWFya01zID0gdmFsdWU7CiAgICAgfQogfQogCkBAIC0xODc5LDEzICsxODY2LDUgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi12b2lkIE1ha2VGb3VyQ0NTdHJpbmcodWludDMyX3QgeCwgY2hhciAqcykgewotICAgIHNbMF0gPSB4ID4+IDI0OwotICAgIHNbMV0gPSAoeCA+PiAxNikgJiAweGZmOwotICAgIHNbMl0gPSAoeCA+PiA4KSAmIDB4ZmY7Ci0gICAgc1szXSA9IHggJiAweGZmOwotICAgIHNbNF0gPSAnXDAnOwotfQotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9WQlJJU2Vla2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZCUklTZWVrZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjhmMjNhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZCUklTZWVrZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIlZCUklTZWVrZXIiCi0KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL1ZCUklTZWVrZXIuaCIKLQotI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9NUDNFeHRyYWN0b3IuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIHVpbnQzMl90IFUyNF9BVChjb25zdCB1aW50OF90ICpwdHIpIHsKLSAgICByZXR1cm4gcHRyWzBdIDw8IDE2IHwgcHRyWzFdIDw8IDggfCBwdHJbMl07Ci19Ci0KLS8vIHN0YXRpYwotc3A8VkJSSVNlZWtlcj4gVkJSSVNlZWtlcjo6Q3JlYXRlRnJvbVNvdXJjZSgKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgb2ZmNjRfdCBwb3N0X2lkM19wb3MpIHsKLSAgICBvZmY2NF90IHBvcyA9IHBvc3RfaWQzX3BvczsKLQotICAgIHVpbnQ4X3QgaGVhZGVyWzRdOwotICAgIHNzaXplX3QgbiA9IHNvdXJjZS0+cmVhZEF0KHBvcywgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSk7Ci0gICAgaWYgKG4gPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCB0bXAgPSBVMzJfQVQoJmhlYWRlclswXSk7Ci0gICAgc2l6ZV90IGZyYW1lU2l6ZTsKLSAgICBpbnQgc2FtcGxlUmF0ZTsKLSAgICBpZiAoIUdldE1QRUdBdWRpb0ZyYW1lU2l6ZSh0bXAsICZmcmFtZVNpemUsICZzYW1wbGVSYXRlKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvLyBWQlJJIGhlYWRlciBmb2xsb3dzIDMyIGJ5dGVzIGFmdGVyIHRoZSBoZWFkZXIgX2VuZHNfLgotICAgIHBvcyArPSBzaXplb2YoaGVhZGVyKSArIDMyOwotCi0gICAgdWludDhfdCB2YnJpSGVhZGVyWzI2XTsKLSAgICBuID0gc291cmNlLT5yZWFkQXQocG9zLCB2YnJpSGVhZGVyLCBzaXplb2YodmJyaUhlYWRlcikpOwotICAgIGlmIChuIDwgKHNzaXplX3Qpc2l6ZW9mKHZicmlIZWFkZXIpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmIChtZW1jbXAodmJyaUhlYWRlciwgIlZCUkkiLCA0KSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBzaXplX3QgbnVtRnJhbWVzID0gVTMyX0FUKCZ2YnJpSGVhZGVyWzE0XSk7Ci0KLSAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPQotICAgICAgICBudW1GcmFtZXMgKiAxMDAwMDAwbGwgKiAoc2FtcGxlUmF0ZSA+PSAzMjAwMCA/IDExNTIgOiA1NzYpIC8gc2FtcGxlUmF0ZTsKLQotICAgIEFMT0dWKCJkdXJhdGlvbiA9ICUuMmYgc2VjcyIsIGR1cmF0aW9uVXMgLyAxRTYpOwotCi0gICAgc2l6ZV90IG51bUVudHJpZXMgPSBVMTZfQVQoJnZicmlIZWFkZXJbMThdKTsKLSAgICBzaXplX3QgZW50cnlTaXplID0gVTE2X0FUKCZ2YnJpSGVhZGVyWzIyXSk7Ci0gICAgc2l6ZV90IHNjYWxlID0gVTE2X0FUKCZ2YnJpSGVhZGVyWzIwXSk7Ci0KLSAgICBBTE9HVigiJXp1IGVudHJpZXMsIHNjYWxlPSV6dSwgc2l6ZV9wZXJfZW50cnk9JXp1IiwKLSAgICAgICAgIG51bUVudHJpZXMsCi0gICAgICAgICBzY2FsZSwKLSAgICAgICAgIGVudHJ5U2l6ZSk7Ci0KLSAgICBpZiAoZW50cnlTaXplID4gNCkgewotICAgICAgICBBTE9HRSgiaW52YWxpZCBWQlJJIGVudHJ5IHNpemU6ICV6dSIsIGVudHJ5U2l6ZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHNwPFZCUklTZWVrZXI+IHNlZWtlciA9IG5ldyAoc3RkOjpub3Rocm93KSBWQlJJU2Vla2VyOwotICAgIGlmIChzZWVrZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygiQ291bGRuJ3QgYWxsb2NhdGUgVkJSSVNlZWtlciIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBzaXplX3QgdG90YWxFbnRyeVNpemUgPSBudW1FbnRyaWVzICogZW50cnlTaXplOwotICAgIHVpbnQ4X3QgKmJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W3RvdGFsRW50cnlTaXplXTsKLSAgICBpZiAoIWJ1ZmZlcikgewotICAgICAgICBBTE9HVygiQ291bGRuJ3QgYWxsb2NhdGUgJXp1IGJ5dGVzIiwgdG90YWxFbnRyeVNpemUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBuID0gc291cmNlLT5yZWFkQXQocG9zICsgc2l6ZW9mKHZicmlIZWFkZXIpLCBidWZmZXIsIHRvdGFsRW50cnlTaXplKTsKLSAgICBpZiAobiA8IChzc2l6ZV90KXRvdGFsRW50cnlTaXplKSB7Ci0gICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKLSAgICAgICAgYnVmZmVyID0gTlVMTDsKLQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBzZWVrZXItPm1CYXNlUG9zID0gcG9zdF9pZDNfcG9zICsgZnJhbWVTaXplOwotICAgIC8vIG9ubHkgdXBkYXRlIG1EdXJhdGlvblVzIGlmIHRoZSBjYWxjdWxhdGVkIGR1cmF0aW9uIGlzIHZhbGlkIChub24gemVybykKLSAgICAvLyBvdGhlcndpc2UsIGxlYXZlIGR1cmF0aW9uIGF0IC0xIHNvIHRoYXQgZ2V0RHVyYXRpb24oKSBhbmQgZ2V0T2Zmc2V0Rm9yVGltZSgpCi0gICAgLy8gcmV0dXJuIGZhbHNlIHdoZW4gY2FsbGVkLCB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgdmJyaSB0YWcgZG9lcyBub3QgaGF2ZSB0aGUKLSAgICAvLyByZXF1ZXN0ZWQgaW5mb3JtYXRpb24KLSAgICBpZiAoZHVyYXRpb25VcykgewotICAgICAgICBzZWVrZXItPm1EdXJhdGlvblVzID0gZHVyYXRpb25VczsKLSAgICB9Ci0KLSAgICBvZmY2NF90IG9mZnNldCA9IHBvc3RfaWQzX3BvczsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUVudHJpZXM7ICsraSkgewotICAgICAgICB1aW50MzJfdCBudW1CeXRlczsKLSAgICAgICAgc3dpdGNoIChlbnRyeVNpemUpIHsKLSAgICAgICAgICAgIGNhc2UgMTogbnVtQnl0ZXMgPSBidWZmZXJbaV07IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyOiBudW1CeXRlcyA9IFUxNl9BVChidWZmZXIgKyAyICogaSk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzOiBudW1CeXRlcyA9IFUyNF9BVChidWZmZXIgKyAzICogaSk7IGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDSEVDS19FUShlbnRyeVNpemUsIDR1KTsKLSAgICAgICAgICAgICAgICBudW1CeXRlcyA9IFUzMl9BVChidWZmZXIgKyA0ICogaSk7IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbnVtQnl0ZXMgKj0gc2NhbGU7Ci0KLSAgICAgICAgc2Vla2VyLT5tU2VnbWVudHMucHVzaChudW1CeXRlcyk7Ci0KLSAgICAgICAgQUxPR1YoImVudHJ5ICMlenU6ICV1IG9mZnNldCAlIzAxNmxseCIsIGksIG51bUJ5dGVzLCAobG9uZyBsb25nKW9mZnNldCk7Ci0gICAgICAgIG9mZnNldCArPSBudW1CeXRlczsKLSAgICB9Ci0KLSAgICBkZWxldGVbXSBidWZmZXI7Ci0gICAgYnVmZmVyID0gTlVMTDsKLQotICAgIEFMT0dJKCJGb3VuZCBWQlJJIGhlYWRlci4iKTsKLQotICAgIHJldHVybiBzZWVrZXI7Ci19Ci0KLVZCUklTZWVrZXI6OlZCUklTZWVrZXIoKQotICAgIDogbUR1cmF0aW9uVXMoLTEpIHsKLX0KLQotYm9vbCBWQlJJU2Vla2VyOjpnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKSB7Ci0gICAgaWYgKG1EdXJhdGlvblVzIDwgMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgKmR1cmF0aW9uVXMgPSBtRHVyYXRpb25VczsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFZCUklTZWVrZXI6OmdldE9mZnNldEZvclRpbWUoaW50NjRfdCAqdGltZVVzLCBvZmY2NF90ICpwb3MpIHsKLSAgICBpZiAobUR1cmF0aW9uVXMgPCAwIHx8IG1TZWdtZW50cy5zaXplKCkgPT0gMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaW50NjRfdCBzZWdtZW50RHVyYXRpb25VcyA9IG1EdXJhdGlvblVzIC8gbVNlZ21lbnRzLnNpemUoKTsKLQotICAgIGludDY0X3Qgbm93VXMgPSAwOwotICAgICpwb3MgPSBtQmFzZVBvczsKLSAgICBzaXplX3Qgc2VnbWVudEluZGV4ID0gMDsKLSAgICB3aGlsZSAoc2VnbWVudEluZGV4IDwgbVNlZ21lbnRzLnNpemUoKSAmJiBub3dVcyA8ICp0aW1lVXMpIHsKLSAgICAgICAgbm93VXMgKz0gc2VnbWVudER1cmF0aW9uVXM7Ci0gICAgICAgICpwb3MgKz0gbVNlZ21lbnRzLml0ZW1BdChzZWdtZW50SW5kZXgrKyk7Ci0gICAgfQotCi0gICAgQUxPR1YoImdldE9mZnNldEZvclRpbWUgJWxsZCB1cyA9PiAweCUwMTZsbHgiLCAobG9uZyBsb25nKSp0aW1lVXMsIChsb25nIGxvbmcpKnBvcyk7Ci0KLSAgICAqdGltZVVzID0gbm93VXM7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvV0FWRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1dBVkV4dHJhY3Rvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MGI3NDYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvV0FWRXh0cmFjdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJXQVZFeHRyYWN0b3IiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL1dBVkV4dHJhY3Rvci5oIgotCi0jaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2JpdG9wcy5oPgotCi0jZGVmaW5lIENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUiAwCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotZW51bSB7Ci0gICAgV0FWRV9GT1JNQVRfUENNICAgICAgICA9IDB4MDAwMSwKLSAgICBXQVZFX0ZPUk1BVF9JRUVFX0ZMT0FUID0gMHgwMDAzLAotICAgIFdBVkVfRk9STUFUX0FMQVcgICAgICAgPSAweDAwMDYsCi0gICAgV0FWRV9GT1JNQVRfTVVMQVcgICAgICA9IDB4MDAwNywKLSAgICBXQVZFX0ZPUk1BVF9NU0dTTSAgICAgID0gMHgwMDMxLAotICAgIFdBVkVfRk9STUFUX0VYVEVOU0lCTEUgPSAweEZGRkUKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBXQVZFRVhUX1NVQkZPUk1BVCA9ICJceDAwXHgwMFx4MDBceDAwXHgxMFx4MDBceDgwXHgwMFx4MDBceEFBXHgwMFx4MzhceDlCXHg3MSI7Ci1zdGF0aWMgY29uc3QgY2hhciogQU1CSVNPTklDX1NVQkZPUk1BVCA9ICJceDAwXHgwMFx4MjFceDA3XHhEM1x4MTFceDg2XHg0NFx4QzhceEMxXHhDQVx4MDBceDAwXHgwMCI7Ci0KLXN0YXRpYyB1aW50MzJfdCBVMzJfTEVfQVQoY29uc3QgdWludDhfdCAqcHRyKSB7Ci0gICAgcmV0dXJuIHB0clszXSA8PCAyNCB8IHB0clsyXSA8PCAxNiB8IHB0clsxXSA8PCA4IHwgcHRyWzBdOwotfQotCi1zdGF0aWMgdWludDE2X3QgVTE2X0xFX0FUKGNvbnN0IHVpbnQ4X3QgKnB0cikgewotICAgIHJldHVybiBwdHJbMV0gPDwgOCB8IHB0clswXTsKLX0KLQotc3RydWN0IFdBVlNvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7Ci0gICAgV0FWU291cmNlKAotICAgICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UsCi0gICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsCi0gICAgICAgICAgICB1aW50MTZfdCB3YXZlRm9ybWF0LAotICAgICAgICAgICAgaW50MzJfdCBiaXRzUGVyU2FtcGxlLAotICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydE5vbmJsb2NraW5nUmVhZCgpIHsgcmV0dXJuIHRydWU7IH0KLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfldBVlNvdXJjZSgpOwotCi1wcml2YXRlOgotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heEZyYW1lU2l6ZTsKLQotICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwotICAgIHNwPE1ldGFEYXRhPiBtTWV0YTsKLSAgICB1aW50MTZfdCBtV2F2ZUZvcm1hdDsKLSAgICBpbnQzMl90IG1TYW1wbGVSYXRlOwotICAgIGludDMyX3QgbU51bUNoYW5uZWxzOwotICAgIGludDMyX3QgbUJpdHNQZXJTYW1wbGU7Ci0gICAgb2ZmNjRfdCBtT2Zmc2V0OwotICAgIHNpemVfdCBtU2l6ZTsKLSAgICBib29sIG1TdGFydGVkOwotICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1Hcm91cDsKLSAgICBvZmY2NF90IG1DdXJyZW50UG9zOwotCi0gICAgV0FWU291cmNlKGNvbnN0IFdBVlNvdXJjZSAmKTsKLSAgICBXQVZTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBXQVZTb3VyY2UgJik7Ci19OwotCi1XQVZFeHRyYWN0b3I6OldBVkV4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKQotICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKLSAgICAgIG1WYWxpZEZvcm1hdChmYWxzZSksCi0gICAgICBtQ2hhbm5lbE1hc2soQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSKSB7Ci0gICAgbUluaXRDaGVjayA9IGluaXQoKTsKLX0KLQotV0FWRXh0cmFjdG9yOjp+V0FWRXh0cmFjdG9yKCkgewotfQotCi1zcDxNZXRhRGF0YT4gV0FWRXh0cmFjdG9yOjpnZXRNZXRhRGF0YSgpIHsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKLQotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtZXRhOwotICAgIH0KLQotICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfV0FWKTsKLQotICAgIHJldHVybiBtZXRhOwotfQotCi1zaXplX3QgV0FWRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKLSAgICByZXR1cm4gbUluaXRDaGVjayA9PSBPSyA/IDEgOiAwOwotfQotCi1zcDxJTWVkaWFTb3VyY2U+IFdBVkV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggPiAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBuZXcgV0FWU291cmNlKAotICAgICAgICAgICAgbURhdGFTb3VyY2UsIG1UcmFja01ldGEsCi0gICAgICAgICAgICBtV2F2ZUZvcm1hdCwgbUJpdHNQZXJTYW1wbGUsIG1EYXRhT2Zmc2V0LCBtRGF0YVNpemUpOwotfQotCi1zcDxNZXRhRGF0YT4gV0FWRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7Ci0gICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggPiAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBtVHJhY2tNZXRhOwotfQotCi1zdGF0dXNfdCBXQVZFeHRyYWN0b3I6OmluaXQoKSB7Ci0gICAgdWludDhfdCBoZWFkZXJbMTJdOwotICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAotICAgICAgICAgICAgICAgIDAsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgaWYgKG1lbWNtcChoZWFkZXIsICJSSUZGIiwgNCkgfHwgbWVtY21wKCZoZWFkZXJbOF0sICJXQVZFIiwgNCkpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgc2l6ZV90IHRvdGFsU2l6ZSA9IFUzMl9MRV9BVCgmaGVhZGVyWzRdKTsKLQotICAgIG9mZjY0X3Qgb2Zmc2V0ID0gMTI7Ci0gICAgc2l6ZV90IHJlbWFpbmluZ1NpemUgPSB0b3RhbFNpemU7Ci0gICAgd2hpbGUgKHJlbWFpbmluZ1NpemUgPj0gOCkgewotICAgICAgICB1aW50OF90IGNodW5rSGVhZGVyWzhdOwotICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGNodW5rSGVhZGVyLCA4KSA8IDgpIHsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVtYWluaW5nU2l6ZSAtPSA4OwotICAgICAgICBvZmZzZXQgKz0gODsKLQotICAgICAgICB1aW50MzJfdCBjaHVua1NpemUgPSBVMzJfTEVfQVQoJmNodW5rSGVhZGVyWzRdKTsKLQotICAgICAgICBpZiAoY2h1bmtTaXplID4gcmVtYWluaW5nU2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW1lbWNtcChjaHVua0hlYWRlciwgImZtdCAiLCA0KSkgewotICAgICAgICAgICAgaWYgKGNodW5rU2l6ZSA8IDE2KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVpbnQ4X3QgZm9ybWF0U3BlY1s0MF07Ci0gICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGZvcm1hdFNwZWMsIDIpIDwgMikgewotICAgICAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtV2F2ZUZvcm1hdCA9IFUxNl9MRV9BVChmb3JtYXRTcGVjKTsKLSAgICAgICAgICAgIGlmIChtV2F2ZUZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9QQ00KLSAgICAgICAgICAgICAgICAgICAgJiYgbVdhdmVGb3JtYXQgIT0gV0FWRV9GT1JNQVRfSUVFRV9GTE9BVAotICAgICAgICAgICAgICAgICAgICAmJiBtV2F2ZUZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9BTEFXCi0gICAgICAgICAgICAgICAgICAgICYmIG1XYXZlRm9ybWF0ICE9IFdBVkVfRk9STUFUX01VTEFXCi0gICAgICAgICAgICAgICAgICAgICYmIG1XYXZlRm9ybWF0ICE9IFdBVkVfRk9STUFUX01TR1NNCi0gICAgICAgICAgICAgICAgICAgICYmIG1XYXZlRm9ybWF0ICE9IFdBVkVfRk9STUFUX0VYVEVOU0lCTEUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVpbnQ4X3QgZm10U2l6ZSA9IDE2OwotICAgICAgICAgICAgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX0VYVEVOU0lCTEUpIHsKLSAgICAgICAgICAgICAgICBmbXRTaXplID0gNDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGZvcm1hdFNwZWMsIGZtdFNpemUpIDwgZm10U2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtTnVtQ2hhbm5lbHMgPSBVMTZfTEVfQVQoJmZvcm1hdFNwZWNbMl0pOwotCi0gICAgICAgICAgICBpZiAobU51bUNoYW5uZWxzIDwgMSB8fCBtTnVtQ2hhbm5lbHMgPiA4KSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIG51bWJlciBvZiBjaGFubmVscyAoJWQpIiwgbU51bUNoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtV2F2ZUZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9FWFRFTlNJQkxFKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1OdW1DaGFubmVscyAhPSAxICYmIG1OdW1DaGFubmVscyAhPSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJNb3JlIHRoYW4gMiBjaGFubmVscyAoJWQpIGluIG5vbi1XQVZFX0VYVCwgdW5rbm93biBjaGFubmVsIG1hc2siLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1DaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtU2FtcGxlUmF0ZSA9IFUzMl9MRV9BVCgmZm9ybWF0U3BlY1s0XSk7Ci0KLSAgICAgICAgICAgIGlmIChtU2FtcGxlUmF0ZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUJpdHNQZXJTYW1wbGUgPSBVMTZfTEVfQVQoJmZvcm1hdFNwZWNbMTRdKTsKLQotICAgICAgICAgICAgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX0VYVEVOU0lCTEUpIHsKLSAgICAgICAgICAgICAgICB1aW50MTZfdCB2YWxpZEJpdHNQZXJTYW1wbGUgPSBVMTZfTEVfQVQoJmZvcm1hdFNwZWNbMThdKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsaWRCaXRzUGVyU2FtcGxlICE9IG1CaXRzUGVyU2FtcGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZEJpdHNQZXJTYW1wbGUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoInZhbGlkQml0cyglZCkgIT0gYml0c1BlclNhbXBsZSglZCkgYXJlIG5vdCBzdXBwb3J0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZEJpdHNQZXJTYW1wbGUsIG1CaXRzUGVyU2FtcGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgc3VwcG9ydCB2YWxpdEJpdHNQZXJTYW1wbGUgPT0gYml0c1BlclNhbXBsZSBidXQgc29tZSBXQVZfRVhUCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZXJzIGRvbid0IGNvcnJlY3RseSBzZXQgdGhlIHZhbGlkIGJpdHMgdmFsdWUsIGFuZCBsZWF2ZSBpdCBhdCAwLgotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIldBVkVfRVhUIGhhcyAwIHZhbGlkIGJpdHMgcGVyIHNhbXBsZSwgaWdub3JpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzayA9IFUzMl9MRV9BVCgmZm9ybWF0U3BlY1syMF0pOwotICAgICAgICAgICAgICAgIEFMT0dWKCJudW1DaGFubmVscz0lZCBjaGFubmVsTWFzaz0weCV4IiwgbU51bUNoYW5uZWxzLCBtQ2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgIGlmICgobUNoYW5uZWxNYXNrID4+IDE4KSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJpbnZhbGlkIGNoYW5uZWwgbWFzayAweCV4IiwgbUNoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoKG1DaGFubmVsTWFzayAhPSBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVIpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocG9wY291bnQobUNoYW5uZWxNYXNrKSAhPSBtTnVtQ2hhbm5lbHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJpbnZhbGlkIG51bWJlciBvZiBjaGFubmVscyAoJWQpIGluIGNoYW5uZWwgbWFzayAoMHgleCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcGNvdW50KG1DaGFubmVsTWFzayksIG1DaGFubmVsTWFzayk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gSW4gYSBXQVZFX0VYVCBoZWFkZXIsIHRoZSBmaXJzdCB0d28gYnl0ZXMgb2YgdGhlIEdVSUQgc3RvcmVkIGF0IGJ5dGUgMjQgY29udGFpbgotICAgICAgICAgICAgICAgIC8vIHRoZSBzYW1wbGUgZm9ybWF0LCB1c2luZyB0aGUgc2FtZSBkZWZpbml0aW9ucyBhcyBhIHJlZ3VsYXIgV0FWIGhlYWRlcgotICAgICAgICAgICAgICAgIG1XYXZlRm9ybWF0ID0gVTE2X0xFX0FUKCZmb3JtYXRTcGVjWzI0XSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1lbWNtcCgmZm9ybWF0U3BlY1syNl0sIFdBVkVFWFRfU1VCRk9STUFULCAxNCkgJiYKLSAgICAgICAgICAgICAgICAgICAgbWVtY21wKCZmb3JtYXRTcGVjWzI2XSwgQU1CSVNPTklDX1NVQkZPUk1BVCwgMTQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJ1bnN1cHBvcnRlZCBHVUlEIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9QQ00pIHsKLSAgICAgICAgICAgICAgICBpZiAobUJpdHNQZXJTYW1wbGUgIT0gOCAmJiBtQml0c1BlclNhbXBsZSAhPSAxNgotICAgICAgICAgICAgICAgICAgICAmJiBtQml0c1BlclNhbXBsZSAhPSAyNCAmJiBtQml0c1BlclNhbXBsZSAhPSAzMikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9JRUVFX0ZMT0FUKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1CaXRzUGVyU2FtcGxlICE9IDMyKSB7ICAvLyBUT0RPIHdlIGRvbid0IHN1cHBvcnQgZG91YmxlCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9NU0dTTSkgewotICAgICAgICAgICAgICAgIGlmIChtQml0c1BlclNhbXBsZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX01VTEFXIHx8IG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX0FMQVcpIHsKLSAgICAgICAgICAgICAgICBpZiAobUJpdHNQZXJTYW1wbGUgIT0gOCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1WYWxpZEZvcm1hdCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoIW1lbWNtcChjaHVua0hlYWRlciwgImRhdGEiLCA0KSkgewotICAgICAgICAgICAgaWYgKG1WYWxpZEZvcm1hdCkgewotICAgICAgICAgICAgICAgIG1EYXRhT2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICAgICAgICAgIG1EYXRhU2l6ZSA9IGNodW5rU2l6ZTsKLQotICAgICAgICAgICAgICAgIG1UcmFja01ldGEgPSBuZXcgTWV0YURhdGE7Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKG1XYXZlRm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgV0FWRV9GT1JNQVRfUENNOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFdBVkVfRk9STUFUX0lFRUVfRkxPQVQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLT5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBXQVZFX0ZPUk1BVF9BTEFXOgotICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNrTWV0YS0+c2V0Q1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgV0FWRV9GT1JNQVRfTVNHU006Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLT5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01TR1NNKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobVdhdmVGb3JtYXQsICh1aW50MTZfdClXQVZFX0ZPUk1BVF9NVUxBVyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLT5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBtTnVtQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgIG1UcmFja01ldGEtPnNldEludDMyKGtLZXlDaGFubmVsTWFzaywgbUNoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgbVNhbXBsZVJhdGUpOwotICAgICAgICAgICAgICAgIG1UcmFja01ldGEtPnNldEludDMyKGtLZXlQY21FbmNvZGluZywga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCk7Ci0KLSAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSAwOwotICAgICAgICAgICAgICAgIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9NU0dTTSkgewotICAgICAgICAgICAgICAgICAgICAvLyA2NSBieXRlcyBkZWNvZGUgdG8gMzIwIDhrSHogc2FtcGxlcwotICAgICAgICAgICAgICAgICAgICBkdXJhdGlvblVzID0KLSAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDBMTCAqIChtRGF0YVNpemUgLyA2NSAqIDMyMCkgLyA4MDAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBieXRlc1BlclNhbXBsZSA9IG1CaXRzUGVyU2FtcGxlID4+IDM7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFieXRlc1BlclNhbXBsZSB8fCAhbU51bUNoYW5uZWxzKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLQotICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtX3NhbXBsZXMgPSBtRGF0YVNpemUgLyAobU51bUNoYW5uZWxzICogYnl0ZXNQZXJTYW1wbGUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghbVNhbXBsZVJhdGUpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotCi0gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uVXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMExMICogbnVtX3NhbXBsZXMgLyBtU2FtcGxlUmF0ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgb2Zmc2V0ICs9IGNodW5rU2l6ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTk9fSU5JVDsKLX0KLQotY29uc3Qgc2l6ZV90IFdBVlNvdXJjZTo6a01heEZyYW1lU2l6ZSA9IDMyNzY4OwotCi1XQVZTb3VyY2U6OldBVlNvdXJjZSgKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UsCi0gICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSwKLSAgICAgICAgdWludDE2X3Qgd2F2ZUZvcm1hdCwKLSAgICAgICAgaW50MzJfdCBiaXRzUGVyU2FtcGxlLAotICAgICAgICBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpCi0gICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKLSAgICAgIG1NZXRhKG1ldGEpLAotICAgICAgbVdhdmVGb3JtYXQod2F2ZUZvcm1hdCksCi0gICAgICBtU2FtcGxlUmF0ZSgwKSwKLSAgICAgIG1OdW1DaGFubmVscygwKSwKLSAgICAgIG1CaXRzUGVyU2FtcGxlKGJpdHNQZXJTYW1wbGUpLAotICAgICAgbU9mZnNldChvZmZzZXQpLAotICAgICAgbVNpemUoc2l6ZSksCi0gICAgICBtU3RhcnRlZChmYWxzZSksCi0gICAgICBtR3JvdXAoTlVMTCkgewotICAgIENIRUNLKG1NZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZtU2FtcGxlUmF0ZSkpOwotICAgIENIRUNLKG1NZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm1OdW1DaGFubmVscykpOwotCi0gICAgbU1ldGEtPnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIGtNYXhGcmFtZVNpemUpOwotfQotCi1XQVZTb3VyY2U6On5XQVZTb3VyY2UoKSB7Ci0gICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgIHN0b3AoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFdBVlNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKiAvKiBwYXJhbXMgKi8pIHsKLSAgICBBTE9HVigiV0FWU291cmNlOjpzdGFydCIpOwotCi0gICAgQ0hFQ0soIW1TdGFydGVkKTsKLQotICAgIC8vIHNvbWUgV0FWIGZpbGVzIG1heSBoYXZlIGxhcmdlIGF1ZGlvIGJ1ZmZlcnMgdGhhdCB1c2Ugc2hhcmVkIG1lbW9yeSB0cmFuc2Zlci4KLSAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cCg0IC8qIGJ1ZmZlcnMgKi8sIGtNYXhGcmFtZVNpemUpOwotCi0gICAgaWYgKG1CaXRzUGVyU2FtcGxlID09IDgpIHsKLSAgICAgICAgLy8gQXMgYSB0ZW1wb3JhcnkgYnVmZmVyIGZvciA4LT4xNiBiaXQgY29udmVyc2lvbi4KLSAgICAgICAgbUdyb3VwLT5hZGRfYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcihrTWF4RnJhbWVTaXplKSk7Ci0gICAgfQotCi0gICAgbUN1cnJlbnRQb3MgPSBtT2Zmc2V0OwotCi0gICAgbVN0YXJ0ZWQgPSB0cnVlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBXQVZTb3VyY2U6OnN0b3AoKSB7Ci0gICAgQUxPR1YoIldBVlNvdXJjZTo6c3RvcCIpOwotCi0gICAgQ0hFQ0sobVN0YXJ0ZWQpOwotCi0gICAgZGVsZXRlIG1Hcm91cDsKLSAgICBtR3JvdXAgPSBOVUxMOwotCi0gICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3A8TWV0YURhdGE+IFdBVlNvdXJjZTo6Z2V0Rm9ybWF0KCkgewotICAgIEFMT0dWKCJXQVZTb3VyY2U6OmdldEZvcm1hdCIpOwotCi0gICAgcmV0dXJuIG1NZXRhOwotfQotCi1zdGF0dXNfdCBXQVZTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotICAgICpvdXQgPSBOVUxMOwotCi0gICAgaWYgKG9wdGlvbnMgIT0gbnVsbHB0ciAmJiBvcHRpb25zLT5nZXROb25CbG9ja2luZygpICYmICFtR3JvdXAtPmhhc19idWZmZXJzKCkpIHsKLSAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOwotICAgIH0KLQotICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKLSAgICBpZiAob3B0aW9ucyAhPSBOVUxMICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7Ci0gICAgICAgIGludDY0X3QgcG9zID0gMDsKLQotICAgICAgICBpZiAobVdhdmVGb3JtYXQgPT0gV0FWRV9GT1JNQVRfTVNHU00pIHsKLSAgICAgICAgICAgIC8vIDY1IGJ5dGVzIGRlY29kZSB0byAzMjAgOGtIeiBzYW1wbGVzCi0gICAgICAgICAgICBpbnQ2NF90IHNhbXBsZW51bWJlciA9IChzZWVrVGltZVVzICogbVNhbXBsZVJhdGUpIC8gMTAwMDAwMDsKLSAgICAgICAgICAgIGludDY0X3QgZnJhbWVudW1iZXIgPSBzYW1wbGVudW1iZXIgLyAzMjA7Ci0gICAgICAgICAgICBwb3MgPSBmcmFtZW51bWJlciAqIDY1OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcG9zID0gKHNlZWtUaW1lVXMgKiBtU2FtcGxlUmF0ZSkgLyAxMDAwMDAwICogbU51bUNoYW5uZWxzICogKG1CaXRzUGVyU2FtcGxlID4+IDMpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwb3MgPiAob2ZmNjRfdCltU2l6ZSkgewotICAgICAgICAgICAgcG9zID0gbVNpemU7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRQb3MgPSBwb3MgKyBtT2Zmc2V0OwotICAgIH0KLQotICAgIE1lZGlhQnVmZmVyICpidWZmZXI7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLy8gbWFrZSBzdXJlIHRoYXQgbWF4Qnl0ZXNUb1JlYWQgaXMgbXVsdGlwbGUgb2YgMywgaW4gMjQtYml0IGNhc2UKLSAgICBzaXplX3QgbWF4Qnl0ZXNUb1JlYWQgPQotICAgICAgICBtQml0c1BlclNhbXBsZSA9PSA4ID8ga01heEZyYW1lU2l6ZSAvIDIgOiAKLSAgICAgICAgKG1CaXRzUGVyU2FtcGxlID09IDI0ID8gMyooa01heEZyYW1lU2l6ZS8zKToga01heEZyYW1lU2l6ZSk7Ci0KLSAgICBzaXplX3QgbWF4Qnl0ZXNBdmFpbGFibGUgPQotICAgICAgICAobUN1cnJlbnRQb3MgLSBtT2Zmc2V0ID49IChvZmY2NF90KW1TaXplKQotICAgICAgICAgICAgPyAwIDogbVNpemUgLSAobUN1cnJlbnRQb3MgLSBtT2Zmc2V0KTsKLQotICAgIGlmIChtYXhCeXRlc1RvUmVhZCA+IG1heEJ5dGVzQXZhaWxhYmxlKSB7Ci0gICAgICAgIG1heEJ5dGVzVG9SZWFkID0gbWF4Qnl0ZXNBdmFpbGFibGU7Ci0gICAgfQotCi0gICAgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX01TR1NNKSB7Ci0gICAgICAgIC8vIE1pY3Jvc29mdCBwYWNrcyAyIGZyYW1lcyBpbnRvIDY1IGJ5dGVzLCByYXRoZXIgdGhhbiB1c2luZyBzZXBhcmF0ZSAzMy1ieXRlIGZyYW1lcywKLSAgICAgICAgLy8gc28gcmVhZCBtdWx0aXBsZXMgb2YgNjUsIGFuZCB1c2Ugc21hbGxlciBidWZmZXJzIHRvIGFjY291bnQgZm9yIH4xMDoxIGV4cGFuc2lvbiByYXRpbwotICAgICAgICBpZiAobWF4Qnl0ZXNUb1JlYWQgPiAxMDI0KSB7Ci0gICAgICAgICAgICBtYXhCeXRlc1RvUmVhZCA9IDEwMjQ7Ci0gICAgICAgIH0KLSAgICAgICAgbWF4Qnl0ZXNUb1JlYWQgPSAobWF4Qnl0ZXNUb1JlYWQgLyA2NSkgKiA2NTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyByZWFkIG9ubHkgaW50ZWdyYWwgYW1vdW50cyBvZiBhdWRpbyB1bml0IGZyYW1lcy4KLSAgICAgICAgY29uc3Qgc2l6ZV90IGlucHV0VW5pdEZyYW1lU2l6ZSA9IG1OdW1DaGFubmVscyAqIG1CaXRzUGVyU2FtcGxlIC8gODsKLSAgICAgICAgbWF4Qnl0ZXNUb1JlYWQgLT0gbWF4Qnl0ZXNUb1JlYWQgJSBpbnB1dFVuaXRGcmFtZVNpemU7Ci0gICAgfQotCi0gICAgc3NpemVfdCBuID0gbURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgIG1DdXJyZW50UG9zLCBidWZmZXItPmRhdGEoKSwKLSAgICAgICAgICAgIG1heEJ5dGVzVG9SZWFkKTsKLQotICAgIGlmIChuIDw9IDApIHsKLSAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIGJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgfQotCi0gICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgbik7Ci0KLSAgICAvLyBUT0RPOiBhZGQgY2FwYWJpbGl0eSB0byByZXR1cm4gZGF0YSBhcyBmbG9hdCBQQ00gaW5zdGVhZCBvZiAxNiBiaXQgUENNLgotICAgIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9QQ00pIHsKLSAgICAgICAgaWYgKG1CaXRzUGVyU2FtcGxlID09IDgpIHsKLSAgICAgICAgICAgIC8vIENvbnZlcnQgOC1iaXQgdW5zaWduZWQgc2FtcGxlcyB0byAxNi1iaXQgc2lnbmVkLgotCi0gICAgICAgICAgICAvLyBDcmVhdGUgbmV3IGJ1ZmZlciB3aXRoIDIgYnl0ZSB3aWRlIHNhbXBsZXMKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICp0bXA7Ci0gICAgICAgICAgICBDSEVDS19FUShtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZ0bXApLCAoc3RhdHVzX3QpT0spOwotICAgICAgICAgICAgdG1wLT5zZXRfcmFuZ2UoMCwgMiAqIG4pOwotCi0gICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fdTgoKGludDE2X3QgKil0bXAtPmRhdGEoKSwgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSwgbik7Ci0gICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIGJ1ZmZlciA9IHRtcDsKLSAgICAgICAgfSBlbHNlIGlmIChtQml0c1BlclNhbXBsZSA9PSAyNCkgewotICAgICAgICAgICAgLy8gQ29udmVydCAyNC1iaXQgc2lnbmVkIHNhbXBsZXMgdG8gMTYtYml0IHNpZ25lZCBpbiBwbGFjZQotICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBuIC8gMzsKLQotICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX3AyNCgoaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpLCAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKLSAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDIgKiBudW1TYW1wbGVzKTsKLSAgICAgICAgfSAgZWxzZSBpZiAobUJpdHNQZXJTYW1wbGUgPT0gMzIpIHsKLSAgICAgICAgICAgIC8vIENvbnZlcnQgMzItYml0IHNpZ25lZCBzYW1wbGVzIHRvIDE2LWJpdCBzaWduZWQgaW4gcGxhY2UKLSAgICAgICAgICAgIGNvbnN0IHNpemVfdCBudW1TYW1wbGVzID0gbiAvIDQ7Ci0KLSAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9pMzIoKGludDE2X3QgKilidWZmZXItPmRhdGEoKSwgKGNvbnN0IGludDMyX3QgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7Ci0gICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCAyICogbnVtU2FtcGxlcyk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX0lFRUVfRkxPQVQpIHsKLSAgICAgICAgaWYgKG1CaXRzUGVyU2FtcGxlID09IDMyKSB7Ci0gICAgICAgICAgICAvLyBDb252ZXJ0IDMyLWJpdCBmbG9hdCBzYW1wbGVzIHRvIDE2LWJpdCBzaWduZWQgaW4gcGxhY2UKLSAgICAgICAgICAgIGNvbnN0IHNpemVfdCBudW1TYW1wbGVzID0gbiAvIDQ7Ci0KLSAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdCgoaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpLCAoY29uc3QgZmxvYXQgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7Ci0gICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCAyICogbnVtU2FtcGxlcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQ2NF90IHRpbWVTdGFtcFVzID0gMDsKLQotICAgIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9NU0dTTSkgewotICAgICAgICB0aW1lU3RhbXBVcyA9IDEwMDAwMDBMTCAqIChtQ3VycmVudFBvcyAtIG1PZmZzZXQpICogMzIwIC8gNjUgLyBtU2FtcGxlUmF0ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBzaXplX3QgYnl0ZXNQZXJTYW1wbGUgPSBtQml0c1BlclNhbXBsZSA+PiAzOwotICAgICAgICB0aW1lU3RhbXBVcyA9IDEwMDAwMDBMTCAqIChtQ3VycmVudFBvcyAtIG1PZmZzZXQpCi0gICAgICAgICAgICAgICAgLyAobU51bUNoYW5uZWxzICogYnl0ZXNQZXJTYW1wbGUpIC8gbVNhbXBsZVJhdGU7Ci0gICAgfQotCi0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVTdGFtcFVzKTsKLQotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7Ci0gICAgbUN1cnJlbnRQb3MgKz0gbjsKLQotICAgICpvdXQgPSBidWZmZXI7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLWJvb2wgU25pZmZXQVYoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgc3A8QU1lc3NhZ2U+ICopIHsKLSAgICBjaGFyIGhlYWRlclsxMl07Ci0gICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChtZW1jbXAoaGVhZGVyLCAiUklGRiIsIDQpIHx8IG1lbWNtcCgmaGVhZGVyWzhdLCAiV0FWRSIsIDQpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzcDxNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yID0gbmV3IFdBVkV4dHJhY3Rvcihzb3VyY2UpOwotICAgIGlmIChleHRyYWN0b3ItPmNvdW50VHJhY2tzKCkgPT0gMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgKm1pbWVUeXBlID0gTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dBVjsKLSAgICAqY29uZmlkZW5jZSA9IDAuM2Y7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1hJTkdTZWVrZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvWElOR1NlZWtlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZWQ5YzYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvWElOR1NlZWtlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiWElOR1NFRUtFUiIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgImluY2x1ZGUvWElOR1NlZWtlci5oIgotI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1YSU5HU2Vla2VyOjpYSU5HU2Vla2VyKCkKLSAgICA6IG1EdXJhdGlvblVzKC0xKSwKLSAgICAgIG1TaXplQnl0ZXMoMCksCi0gICAgICBtRW5jb2RlckRlbGF5KDApLAotICAgICAgbUVuY29kZXJQYWRkaW5nKDApLAotICAgICAgbVRPQ1ZhbGlkKGZhbHNlKSB7Ci19Ci0KLWJvb2wgWElOR1NlZWtlcjo6Z2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25VcykgewotICAgIGlmIChtRHVyYXRpb25VcyA8IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgICpkdXJhdGlvblVzID0gbUR1cmF0aW9uVXM7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBYSU5HU2Vla2VyOjpnZXRPZmZzZXRGb3JUaW1lKGludDY0X3QgKnRpbWVVcywgb2ZmNjRfdCAqcG9zKSB7Ci0gICAgaWYgKG1TaXplQnl0ZXMgPT0gMCB8fCAhbVRPQ1ZhbGlkIHx8IG1EdXJhdGlvblVzIDwgMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgZmxvYXQgcGVyY2VudCA9IChmbG9hdCkoKnRpbWVVcykgKiAxMDAgLyBtRHVyYXRpb25VczsKLSAgICBmbG9hdCBmeDsKLSAgICBpZiggcGVyY2VudCA8PSAwLjBmICkgewotICAgICAgICBmeCA9IDAuMGY7Ci0gICAgfSBlbHNlIGlmKCBwZXJjZW50ID49IDEwMC4wZiApIHsKLSAgICAgICAgZnggPSAyNTYuMGY7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IGEgPSAoaW50KXBlcmNlbnQ7Ci0gICAgICAgIGZsb2F0IGZhLCBmYjsKLSAgICAgICAgaWYgKCBhID09IDAgKSB7Ci0gICAgICAgICAgICBmYSA9IDAuMGY7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmYSA9IChmbG9hdCltVE9DW2EtMV07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCBhIDwgOTkgKSB7Ci0gICAgICAgICAgICBmYiA9IChmbG9hdCltVE9DW2FdOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmIgPSAyNTYuMGY7Ci0gICAgICAgIH0KLSAgICAgICAgZnggPSBmYSArIChmYi1mYSkqKHBlcmNlbnQtYSk7Ci0gICAgfQotCi0gICAgKnBvcyA9IChpbnQpKCgxLjBmLzI1Ni4wZikqZngqbVNpemVCeXRlcykgKyBtRmlyc3RGcmFtZVBvczsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vLyBzdGF0aWMKLXNwPFhJTkdTZWVrZXI+IFhJTkdTZWVrZXI6OkNyZWF0ZUZyb21Tb3VyY2UoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIG9mZjY0X3QgZmlyc3RfZnJhbWVfcG9zKSB7Ci0gICAgc3A8WElOR1NlZWtlcj4gc2Vla2VyID0gbmV3IFhJTkdTZWVrZXI7Ci0KLSAgICBzZWVrZXItPm1GaXJzdEZyYW1lUG9zID0gZmlyc3RfZnJhbWVfcG9zOwotCi0gICAgdWludDhfdCBidWZmZXJbNF07Ci0gICAgaW50IG9mZnNldCA9IGZpcnN0X2ZyYW1lX3BvczsKLSAgICBpZiAoc291cmNlLT5yZWFkQXQob2Zmc2V0LCAmYnVmZmVyLCA0KSA8IDQpIHsgLy8gZ2V0IGhlYWRlcgotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgb2Zmc2V0ICs9IDQ7Ci0KLSAgICBpbnQgaGVhZGVyID0gVTMyX0FUKGJ1ZmZlcik7OwotICAgIHNpemVfdCB4aW5nZnJhbWVzaXplID0gMDsKLSAgICBpbnQgc2FtcGxpbmdfcmF0ZSA9IDA7Ci0gICAgaW50IG51bV9jaGFubmVsczsKLSAgICBpbnQgc2FtcGxlc19wZXJfZnJhbWUgPSAwOwotICAgIGlmICghR2V0TVBFR0F1ZGlvRnJhbWVTaXplKGhlYWRlciwgJnhpbmdmcmFtZXNpemUsICZzYW1wbGluZ19yYXRlLCAmbnVtX2NoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZzYW1wbGVzX3Blcl9mcmFtZSkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHNlZWtlci0+bUZpcnN0RnJhbWVQb3MgKz0geGluZ2ZyYW1lc2l6ZTsKLQotICAgIHVpbnQ4X3QgdmVyc2lvbiA9IChidWZmZXJbMV0gPj4gMykgJiAzOwotCi0gICAgLy8gZGV0ZXJtaW5lIG9mZnNldCBvZiBYSU5HIGhlYWRlcgotICAgIGlmKHZlcnNpb24gJiAxKSB7IC8vIG1wZWcxCi0gICAgICAgIGlmIChudW1fY2hhbm5lbHMgIT0gMSkgb2Zmc2V0ICs9IDMyOwotICAgICAgICBlbHNlIG9mZnNldCArPSAxNzsKLSAgICB9IGVsc2UgeyAvLyBtcGVnIDIgb3IgMi41Ci0gICAgICAgIGlmIChudW1fY2hhbm5lbHMgIT0gMSkgb2Zmc2V0ICs9IDE3OwotICAgICAgICBlbHNlIG9mZnNldCArPSA5OwotICAgIH0KLQotICAgIGludCB4aW5nYmFzZSA9IG9mZnNldDsKLQotICAgIGlmIChzb3VyY2UtPnJlYWRBdChvZmZzZXQsICZidWZmZXIsIDQpIDwgNCkgeyAvLyBYSU5HIGhlYWRlciBJRAotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgb2Zmc2V0ICs9IDQ7Ci0gICAgLy8gQ2hlY2sgWElORyBJRAotICAgIGlmICgoYnVmZmVyWzBdICE9ICdYJykgfHwgKGJ1ZmZlclsxXSAhPSAnaScpCi0gICAgICAgICAgICAgICAgfHwgKGJ1ZmZlclsyXSAhPSAnbicpIHx8IChidWZmZXJbM10gIT0gJ2cnKSkgewotICAgICAgICBpZiAoKGJ1ZmZlclswXSAhPSAnSScpIHx8IChidWZmZXJbMV0gIT0gJ24nKQotICAgICAgICAgICAgICAgICAgICB8fCAoYnVmZmVyWzJdICE9ICdmJykgfHwgKGJ1ZmZlclszXSAhPSAnbycpKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChzb3VyY2UtPnJlYWRBdChvZmZzZXQsICZidWZmZXIsIDQpIDwgNCkgeyAvLyBmbGFncwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgb2Zmc2V0ICs9IDQ7Ci0gICAgdWludDMyX3QgZmxhZ3MgPSBVMzJfQVQoYnVmZmVyKTsKLQotICAgIGlmIChmbGFncyAmIDB4MDAwMSkgeyAgLy8gRnJhbWVzIGZpZWxkIGlzIHByZXNlbnQKLSAgICAgICAgaWYgKHNvdXJjZS0+cmVhZEF0KG9mZnNldCwgYnVmZmVyLCA0KSA8IDQpIHsKLSAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpbnQzMl90IGZyYW1lcyA9IFUzMl9BVChidWZmZXIpOwotICAgICAgICAvLyBvbmx5IHVwZGF0ZSBtRHVyYXRpb25VcyBpZiB0aGUgY2FsY3VsYXRlZCBkdXJhdGlvbiBpcyB2YWxpZCAobm9uIHplcm8pCi0gICAgICAgIC8vIG90aGVyd2lzZSwgbGVhdmUgZHVyYXRpb24gYXQgLTEgc28gdGhhdCBnZXREdXJhdGlvbigpIGFuZCBnZXRPZmZzZXRGb3JUaW1lKCkKLSAgICAgICAgLy8gcmV0dXJuIGZhbHNlIHdoZW4gY2FsbGVkLCB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgeGluZyB0YWcgZG9lcyBub3QgaGF2ZSB0aGUKLSAgICAgICAgLy8gcmVxdWVzdGVkIGluZm9ybWF0aW9uCi0gICAgICAgIGlmIChmcmFtZXMpIHsKLSAgICAgICAgICAgIHNlZWtlci0+bUR1cmF0aW9uVXMgPSAoaW50NjRfdClmcmFtZXMgKiBzYW1wbGVzX3Blcl9mcmFtZSAqIDEwMDAwMDBMTCAvIHNhbXBsaW5nX3JhdGU7Ci0gICAgICAgIH0KLSAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgfQotICAgIGlmIChmbGFncyAmIDB4MDAwMikgeyAgLy8gQnl0ZXMgZmllbGQgaXMgcHJlc2VudAotICAgICAgICBpZiAoc291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWZmZXIsIDQpIDwgNCkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgc2Vla2VyLT5tU2l6ZUJ5dGVzID0gVTMyX0FUKGJ1ZmZlcik7Ci0gICAgICAgIG9mZnNldCArPSA0OwotICAgIH0KLSAgICBpZiAoZmxhZ3MgJiAweDAwMDQpIHsgIC8vIFRPQyBmaWVsZCBpcyBwcmVzZW50Ci0gICAgICAgIGlmIChzb3VyY2UtPnJlYWRBdChvZmZzZXQgKyAxLCBzZWVrZXItPm1UT0MsIDk5KSA8IDk5KSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBzZWVrZXItPm1UT0NWYWxpZCA9IHRydWU7Ci0gICAgICAgIG9mZnNldCArPSAxMDA7Ci0gICAgfQotCi0jaWYgMAotICAgIGlmIChmbGFncyAmIDB4MDAwOCkgeyAgLy8gUXVhbGl0eSBpbmRpY2F0b3IgZmllbGQgaXMgcHJlc2VudAotICAgICAgICBpZiAoc291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWZmZXIsIDQpIDwgNCkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZG8gc29tZXRoaW5nIHdpdGggdGhlIHF1YWxpdHkgaW5kaWNhdG9yCi0gICAgICAgIG9mZnNldCArPSA0OwotICAgIH0KLQotICAgIGlmIChzb3VyY2UtPnJlYWRBdCh4aW5nYmFzZSArIDB4YWYgLSAweDI0LCAmYnVmZmVyLCAxKSA8IDEpIHsgLy8gZW5jb2RpbmcgZmxhZ3MKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEFMT0dWKCJub2dhcCBwcmVjZWRpbmc6ICVzLCBub2dhcCBjb250aW51ZWQgaW4gbmV4dDogJXMiLAotICAgICAgICAgICAgICAoYnVmZmVyWzBdICYgMHg4MCkgPyAidHJ1ZSIgOiAiZmFsc2UiLAotICAgICAgICAgICAgICAoYnVmZmVyWzBdICYgMHg0MCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSNlbmRpZgotCi0gICAgaWYgKHNvdXJjZS0+cmVhZEF0KHhpbmdiYXNlICsgMHhiMSAtIDB4MjQsICZidWZmZXIsIDMpID09IDMpIHsKLSAgICAgICAgc2Vla2VyLT5tRW5jb2RlckRlbGF5ID0gKGJ1ZmZlclswXSA8PCA0KSArIChidWZmZXJbMV0gPj4gNCk7Ci0gICAgICAgIHNlZWtlci0+bUVuY29kZXJQYWRkaW5nID0gKChidWZmZXJbMV0gJiAweGYpIDw8IDgpICsgYnVmZmVyWzJdOwotICAgIH0KLQotICAgIHJldHVybiBzZWVrZXI7Ci19Ci0KLWludDMyX3QgWElOR1NlZWtlcjo6Z2V0RW5jb2RlckRlbGF5KCkgewotICAgIHJldHVybiBtRW5jb2RlckRlbGF5OwotfQotCi1pbnQzMl90IFhJTkdTZWVrZXI6OmdldEVuY29kZXJQYWRkaW5nKCkgewotICAgIHJldHVybiBtRW5jb2RlclBhZGRpbmc7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2F2Y191dGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9hdmNfdXRpbHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTI0MzNhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2F2Y191dGlscy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiYXZjX3V0aWxzIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi11bnNpZ25lZCBwYXJzZVVFKEFCaXRSZWFkZXIgKmJyKSB7Ci0gICAgdW5zaWduZWQgbnVtWmVyb2VzID0gMDsKLSAgICB3aGlsZSAoYnItPmdldEJpdHMoMSkgPT0gMCkgewotICAgICAgICArK251bVplcm9lczsKLSAgICB9Ci0KLSAgICB1bnNpZ25lZCB4ID0gYnItPmdldEJpdHMobnVtWmVyb2VzKTsKLQotICAgIHJldHVybiB4ICsgKDF1IDw8IG51bVplcm9lcykgLSAxOwotfQotCi11bnNpZ25lZCBwYXJzZVVFV2l0aEZhbGxiYWNrKEFCaXRSZWFkZXIgKmJyLCB1bnNpZ25lZCBmYWxsYmFjaykgewotICAgIHVuc2lnbmVkIG51bVplcm9lcyA9IDA7Ci0gICAgd2hpbGUgKGJyLT5nZXRCaXRzV2l0aEZhbGxiYWNrKDEsIDEpID09IDApIHsKLSAgICAgICAgKytudW1aZXJvZXM7Ci0gICAgfQotICAgIHVpbnQzMl90IHg7Ci0gICAgaWYgKG51bVplcm9lcyA8IDMyKSB7Ci0gICAgICAgIGlmIChici0+Z2V0Qml0c0dyYWNlZnVsKG51bVplcm9lcywgJngpKSB7Ci0gICAgICAgICAgICByZXR1cm4geCArICgxdSA8PCBudW1aZXJvZXMpIC0gMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxsYmFjazsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJyLT5za2lwQml0cyhudW1aZXJvZXMpOwotICAgICAgICByZXR1cm4gZmFsbGJhY2s7Ci0gICAgfQotfQotCi1zaWduZWQgcGFyc2VTRShBQml0UmVhZGVyICpicikgewotICAgIHVuc2lnbmVkIGNvZGVOdW0gPSBwYXJzZVVFKGJyKTsKLQotICAgIHJldHVybiAoY29kZU51bSAmIDEpID8gKGNvZGVOdW0gKyAxKSAvIDIgOiAtc2lnbmVkKGNvZGVOdW0gLyAyKTsKLX0KLQotc2lnbmVkIHBhcnNlU0VXaXRoRmFsbGJhY2soQUJpdFJlYWRlciAqYnIsIHNpZ25lZCBmYWxsYmFjaykgewotICAgIC8vIE5PVEU6IHBhcnNlVUUgY2Fubm90IG5vcm1hbGx5IHJldHVybiB+MCBhcyB0aGUgbWF4IHN1cHBvcnRlZCB2YWx1ZSBpcyAweEZGRkUKLSAgICB1bnNpZ25lZCBjb2RlTnVtID0gcGFyc2VVRVdpdGhGYWxsYmFjayhiciwgfjBVKTsKLSAgICBpZiAoY29kZU51bSA9PSB+MFUpIHsKLSAgICAgICAgcmV0dXJuIGZhbGxiYWNrOwotICAgIH0KLSAgICByZXR1cm4gKGNvZGVOdW0gJiAxKSA/IChjb2RlTnVtICsgMSkgLyAyIDogLXNpZ25lZChjb2RlTnVtIC8gMik7Ci19Ci0KLXN0YXRpYyB2b2lkIHNraXBTY2FsaW5nTGlzdChBQml0UmVhZGVyICpiciwgc2l6ZV90IHNpemVPZlNjYWxpbmdMaXN0KSB7Ci0gICAgc2l6ZV90IGxhc3RTY2FsZSA9IDg7Ci0gICAgc2l6ZV90IG5leHRTY2FsZSA9IDg7Ci0gICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzaXplT2ZTY2FsaW5nTGlzdDsgKytqKSB7Ci0gICAgICAgIGlmIChuZXh0U2NhbGUgIT0gMCkgewotICAgICAgICAgICAgc2lnbmVkIGRlbHRhX3NjYWxlID0gcGFyc2VTRShicik7Ci0gICAgICAgICAgICAvLyBJU09fSUVDXzE0NDk2LTEwXzIwMTQwMi1JVFUsIDcuNC4yLjEuMS4xLCBUaGUgdmFsdWUgb2YgZGVsdGFfc2NhbGUKLSAgICAgICAgICAgIC8vIHNoYWxsIGJlIGluIHRoZSByYW5nZSBvZiDiiJIxMjggdG8gKzEyNywgaW5jbHVzaXZlLgotICAgICAgICAgICAgaWYgKGRlbHRhX3NjYWxlIDwgLTEyOCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJkZWx0YV9zY2FsZSAoJWQpIGlzIGJlbG93IHJhbmdlLCBjYXBwZWQgdG8gLTEyOCIsIGRlbHRhX3NjYWxlKTsKLSAgICAgICAgICAgICAgICBkZWx0YV9zY2FsZSA9IC0xMjg7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGRlbHRhX3NjYWxlID4gMTI3KSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImRlbHRhX3NjYWxlICglZCkgaXMgYWJvdmUgcmFuZ2UsIGNhcHBlZCB0byAxMjciLCBkZWx0YV9zY2FsZSk7Ci0gICAgICAgICAgICAgICAgZGVsdGFfc2NhbGUgPSAxMjc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuZXh0U2NhbGUgPSAobGFzdFNjYWxlICsgKGRlbHRhX3NjYWxlICsgMjU2KSkgJSAyNTY7Ci0gICAgICAgIH0KLQotICAgICAgICBsYXN0U2NhbGUgPSAobmV4dFNjYWxlID09IDApID8gbGFzdFNjYWxlIDogbmV4dFNjYWxlOwotICAgIH0KLX0KLQotLy8gRGV0ZXJtaW5lIHZpZGVvIGRpbWVuc2lvbnMgZnJvbSB0aGUgc2VxdWVuY2UgcGFyYW1ldGVyc2V0Lgotdm9pZCBGaW5kQVZDRGltZW5zaW9ucygKLSAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJnNlcVBhcmFtU2V0LAotICAgICAgICBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0LAotICAgICAgICBpbnQzMl90ICpzYXJXaWR0aCwgaW50MzJfdCAqc2FySGVpZ2h0KSB7Ci0gICAgQUJpdFJlYWRlciBicihzZXFQYXJhbVNldC0+ZGF0YSgpICsgMSwgc2VxUGFyYW1TZXQtPnNpemUoKSAtIDEpOwotCi0gICAgdW5zaWduZWQgcHJvZmlsZV9pZGMgPSBici5nZXRCaXRzKDgpOwotICAgIGJyLnNraXBCaXRzKDE2KTsKLSAgICBwYXJzZVVFKCZicik7ICAvLyBzZXFfcGFyYW1ldGVyX3NldF9pZAotCi0gICAgdW5zaWduZWQgY2hyb21hX2Zvcm1hdF9pZGMgPSAxOyAgLy8gNDoyOjAgY2hyb21hIGZvcm1hdAotCi0gICAgaWYgKHByb2ZpbGVfaWRjID09IDEwMCB8fCBwcm9maWxlX2lkYyA9PSAxMTAKLSAgICAgICAgICAgIHx8IHByb2ZpbGVfaWRjID09IDEyMiB8fCBwcm9maWxlX2lkYyA9PSAyNDQKLSAgICAgICAgICAgIHx8IHByb2ZpbGVfaWRjID09IDQ0IHx8IHByb2ZpbGVfaWRjID09IDgzIHx8IHByb2ZpbGVfaWRjID09IDg2KSB7Ci0gICAgICAgIGNocm9tYV9mb3JtYXRfaWRjID0gcGFyc2VVRSgmYnIpOwotICAgICAgICBpZiAoY2hyb21hX2Zvcm1hdF9pZGMgPT0gMykgewotICAgICAgICAgICAgYnIuc2tpcEJpdHMoMSk7ICAvLyByZXNpZHVhbF9jb2xvdXJfdHJhbnNmb3JtX2ZsYWcKLSAgICAgICAgfQotICAgICAgICBwYXJzZVVFKCZicik7ICAvLyBiaXRfZGVwdGhfbHVtYV9taW51czgKLSAgICAgICAgcGFyc2VVRSgmYnIpOyAgLy8gYml0X2RlcHRoX2Nocm9tYV9taW51czgKLSAgICAgICAgYnIuc2tpcEJpdHMoMSk7ICAvLyBxcHByaW1lX3lfemVyb190cmFuc2Zvcm1fYnlwYXNzX2ZsYWcKLQotICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSkgeyAgLy8gc2VxX3NjYWxpbmdfbWF0cml4X3ByZXNlbnRfZmxhZwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA4OyArK2kpIHsKLSAgICAgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSkgeyAgLy8gc2VxX3NjYWxpbmdfbGlzdF9wcmVzZW50X2ZsYWdbaV0KLQotICAgICAgICAgICAgICAgICAgICAvLyBXQVJOSU5HOiB0aGUgY29kZSBiZWxvdyBoYXMgbm90IGV2ZXIgYmVlbiBleGVyY2lzZWQuLi4KLSAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCBhIHJlYWwtd29ybGQgZXhhbXBsZS4KLQotICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IDYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNjYWxpbmdMaXN0NHg0W2ldLDE2LC4uLgotICAgICAgICAgICAgICAgICAgICAgICAgc2tpcFNjYWxpbmdMaXN0KCZiciwgMTYpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2NhbGluZ0xpc3Q4eDhbaS02XSw2NCwuLi4KLSAgICAgICAgICAgICAgICAgICAgICAgIHNraXBTY2FsaW5nTGlzdCgmYnIsIDY0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHBhcnNlVUUoJmJyKTsgIC8vIGxvZzJfbWF4X2ZyYW1lX251bV9taW51czQKLSAgICB1bnNpZ25lZCBwaWNfb3JkZXJfY250X3R5cGUgPSBwYXJzZVVFKCZicik7Ci0KLSAgICBpZiAocGljX29yZGVyX2NudF90eXBlID09IDApIHsKLSAgICAgICAgcGFyc2VVRSgmYnIpOyAgLy8gbG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0Ci0gICAgfSBlbHNlIGlmIChwaWNfb3JkZXJfY250X3R5cGUgPT0gMSkgewotICAgICAgICAvLyBvZmZzZXRfZm9yX25vbl9yZWZfcGljLCBvZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGQgYW5kCi0gICAgICAgIC8vIG9mZnNldF9mb3JfcmVmX2ZyYW1lIGFyZSB0ZWNobmljYWxseSBzZSh2KSwgYnV0IHNpbmNlIHdlIGFyZQotICAgICAgICAvLyBqdXN0IHNraXBwaW5nIG92ZXIgdGhlbSB0aGUgbWlkcG9pbnQgZG9lcyBub3QgbWF0dGVyLgotCi0gICAgICAgIGJyLmdldEJpdHMoMSk7ICAvLyBkZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZwotICAgICAgICBwYXJzZVVFKCZicik7ICAvLyBvZmZzZXRfZm9yX25vbl9yZWZfcGljCi0gICAgICAgIHBhcnNlVUUoJmJyKTsgIC8vIG9mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZAotCi0gICAgICAgIHVuc2lnbmVkIG51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUgPSBwYXJzZVVFKCZicik7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlOyArK2kpIHsKLSAgICAgICAgICAgIHBhcnNlVUUoJmJyKTsgIC8vIG9mZnNldF9mb3JfcmVmX2ZyYW1lCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwYXJzZVVFKCZicik7ICAvLyBudW1fcmVmX2ZyYW1lcwotICAgIGJyLmdldEJpdHMoMSk7ICAvLyBnYXBzX2luX2ZyYW1lX251bV92YWx1ZV9hbGxvd2VkX2ZsYWcKLQotICAgIHVuc2lnbmVkIHBpY193aWR0aF9pbl9tYnNfbWludXMxID0gcGFyc2VVRSgmYnIpOwotICAgIHVuc2lnbmVkIHBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMSA9IHBhcnNlVUUoJmJyKTsKLSAgICB1bnNpZ25lZCBmcmFtZV9tYnNfb25seV9mbGFnID0gYnIuZ2V0Qml0cygxKTsKLQotICAgICp3aWR0aCA9IHBpY193aWR0aF9pbl9tYnNfbWludXMxICogMTYgKyAxNjsKLQotICAgICpoZWlnaHQgPSAoMiAtIGZyYW1lX21ic19vbmx5X2ZsYWcpCi0gICAgICAgICogKHBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMSAqIDE2ICsgMTYpOwotCi0gICAgaWYgKCFmcmFtZV9tYnNfb25seV9mbGFnKSB7Ci0gICAgICAgIGJyLmdldEJpdHMoMSk7ICAvLyBtYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mbGFnCi0gICAgfQotCi0gICAgYnIuZ2V0Qml0cygxKTsgIC8vIGRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcKLQotICAgIGlmIChici5nZXRCaXRzKDEpKSB7ICAvLyBmcmFtZV9jcm9wcGluZ19mbGFnCi0gICAgICAgIHVuc2lnbmVkIGZyYW1lX2Nyb3BfbGVmdF9vZmZzZXQgPSBwYXJzZVVFKCZicik7Ci0gICAgICAgIHVuc2lnbmVkIGZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0ID0gcGFyc2VVRSgmYnIpOwotICAgICAgICB1bnNpZ25lZCBmcmFtZV9jcm9wX3RvcF9vZmZzZXQgPSBwYXJzZVVFKCZicik7Ci0gICAgICAgIHVuc2lnbmVkIGZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCA9IHBhcnNlVUUoJmJyKTsKLQotICAgICAgICB1bnNpZ25lZCBjcm9wVW5pdFgsIGNyb3BVbml0WTsKLSAgICAgICAgaWYgKGNocm9tYV9mb3JtYXRfaWRjID09IDAgIC8qIG1vbm9jaHJvbWUgKi8pIHsKLSAgICAgICAgICAgIGNyb3BVbml0WCA9IDE7Ci0gICAgICAgICAgICBjcm9wVW5pdFkgPSAyIC0gZnJhbWVfbWJzX29ubHlfZmxhZzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIHN1YldpZHRoQyA9IChjaHJvbWFfZm9ybWF0X2lkYyA9PSAzKSA/IDEgOiAyOwotICAgICAgICAgICAgdW5zaWduZWQgc3ViSGVpZ2h0QyA9IChjaHJvbWFfZm9ybWF0X2lkYyA9PSAxKSA/IDIgOiAxOwotCi0gICAgICAgICAgICBjcm9wVW5pdFggPSBzdWJXaWR0aEM7Ci0gICAgICAgICAgICBjcm9wVW5pdFkgPSBzdWJIZWlnaHRDICogKDIgLSBmcmFtZV9tYnNfb25seV9mbGFnKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFMT0dWKCJmcmFtZV9jcm9wID0gKCV1LCAldSwgJXUsICV1KSwgY3JvcFVuaXRYID0gJXUsIGNyb3BVbml0WSA9ICV1IiwKLSAgICAgICAgICAgICBmcmFtZV9jcm9wX2xlZnRfb2Zmc2V0LCBmcmFtZV9jcm9wX3JpZ2h0X29mZnNldCwKLSAgICAgICAgICAgICBmcmFtZV9jcm9wX3RvcF9vZmZzZXQsIGZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCwKLSAgICAgICAgICAgICBjcm9wVW5pdFgsIGNyb3BVbml0WSk7Ci0KLSAgICAgICAgKndpZHRoIC09Ci0gICAgICAgICAgICAoZnJhbWVfY3JvcF9sZWZ0X29mZnNldCArIGZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0KSAqIGNyb3BVbml0WDsKLSAgICAgICAgKmhlaWdodCAtPQotICAgICAgICAgICAgKGZyYW1lX2Nyb3BfdG9wX29mZnNldCArIGZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCkgKiBjcm9wVW5pdFk7Ci0gICAgfQotCi0gICAgaWYgKHNhcldpZHRoICE9IE5VTEwpIHsKLSAgICAgICAgKnNhcldpZHRoID0gMDsKLSAgICB9Ci0KLSAgICBpZiAoc2FySGVpZ2h0ICE9IE5VTEwpIHsKLSAgICAgICAgKnNhckhlaWdodCA9IDA7Ci0gICAgfQotCi0gICAgaWYgKGJyLmdldEJpdHMoMSkpIHsgIC8vIHZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZwotICAgICAgICB1bnNpZ25lZCBzYXJfd2lkdGggPSAwLCBzYXJfaGVpZ2h0ID0gMDsKLQotICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSkgeyAgLy8gYXNwZWN0X3JhdGlvX2luZm9fcHJlc2VudF9mbGFnCi0gICAgICAgICAgICB1bnNpZ25lZCBhc3BlY3RfcmF0aW9faWRjID0gYnIuZ2V0Qml0cyg4KTsKLQotICAgICAgICAgICAgaWYgKGFzcGVjdF9yYXRpb19pZGMgPT0gMjU1IC8qIGV4dGVuZGVkU0FSICovKSB7Ci0gICAgICAgICAgICAgICAgc2FyX3dpZHRoID0gYnIuZ2V0Qml0cygxNik7Ci0gICAgICAgICAgICAgICAgc2FyX2hlaWdodCA9IGJyLmdldEJpdHMoMTYpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsgdW5zaWduZWQgd2lkdGgsIGhlaWdodDsgfSBrRml4ZWRTQVJzW10gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB7ICAgMCwgIDAgfSwgLy8gSW52YWxpZAotICAgICAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICB7ICAxMiwgMTEgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgIDEwLCAxMSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgeyAgMTYsIDExIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICB7ICA0MCwgMzMgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgIDI0LCAxMSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgeyAgMjAsIDExIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICB7ICAzMiwgMTEgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgIDgwLCAzMyB9LAotICAgICAgICAgICAgICAgICAgICAgICAgeyAgMTgsIDExIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICB7ICAxNSwgMTEgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgIDY0LCAzMyB9LAotICAgICAgICAgICAgICAgICAgICAgICAgeyAxNjAsIDk5IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICB7ICAgNCwgIDMgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgICAzLCAgMiB9LAotICAgICAgICAgICAgICAgICAgICAgICAgeyAgIDIsICAxIH0sCi0gICAgICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgICAgIGlmIChhc3BlY3RfcmF0aW9faWRjID4gMCAmJiBhc3BlY3RfcmF0aW9faWRjIDwgTkVMRU0oa0ZpeGVkU0FScykpIHsKLSAgICAgICAgICAgICAgICAgICAgc2FyX3dpZHRoID0ga0ZpeGVkU0FSc1thc3BlY3RfcmF0aW9faWRjXS53aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgc2FyX2hlaWdodCA9IGtGaXhlZFNBUnNbYXNwZWN0X3JhdGlvX2lkY10uaGVpZ2h0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEFMT0dWKCJzYW1wbGUgYXNwZWN0IHJhdGlvID0gJXUgOiAldSIsIHNhcl93aWR0aCwgc2FyX2hlaWdodCk7Ci0KLSAgICAgICAgaWYgKHNhcldpZHRoICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpzYXJXaWR0aCA9IHNhcl93aWR0aDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzYXJIZWlnaHQgIT0gTlVMTCkgewotICAgICAgICAgICAgKnNhckhlaWdodCA9IHNhcl9oZWlnaHQ7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXR1c190IGdldE5leHROQUxVbml0KAotICAgICAgICBjb25zdCB1aW50OF90ICoqX2RhdGEsIHNpemVfdCAqX3NpemUsCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKipuYWxTdGFydCwgc2l6ZV90ICpuYWxTaXplLAotICAgICAgICBib29sIHN0YXJ0Q29kZUZvbGxvd3MpIHsKLSAgICBjb25zdCB1aW50OF90ICpkYXRhID0gKl9kYXRhOwotICAgIHNpemVfdCBzaXplID0gKl9zaXplOwotCi0gICAgKm5hbFN0YXJ0ID0gTlVMTDsKLSAgICAqbmFsU2l6ZSA9IDA7Ci0KLSAgICBpZiAoc2l6ZSA8IDMpIHsKLSAgICAgICAgcmV0dXJuIC1FQUdBSU47Ci0gICAgfQotCi0gICAgc2l6ZV90IG9mZnNldCA9IDA7Ci0KLSAgICAvLyBBIHZhbGlkIHN0YXJ0Y29kZSBjb25zaXN0cyBvZiBhdCBsZWFzdCB0d28gMHgwMCBieXRlcyBmb2xsb3dlZCBieSAweDAxLgotICAgIGZvciAoOyBvZmZzZXQgKyAyIDwgc2l6ZTsgKytvZmZzZXQpIHsKLSAgICAgICAgaWYgKGRhdGFbb2Zmc2V0ICsgMl0gPT0gMHgwMSAmJiBkYXRhW29mZnNldF0gPT0gMHgwMAotICAgICAgICAgICAgICAgICYmIGRhdGFbb2Zmc2V0ICsgMV0gPT0gMHgwMCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG9mZnNldCArIDIgPj0gc2l6ZSkgewotICAgICAgICAqX2RhdGEgPSAmZGF0YVtvZmZzZXRdOwotICAgICAgICAqX3NpemUgPSAyOwotICAgICAgICByZXR1cm4gLUVBR0FJTjsKLSAgICB9Ci0gICAgb2Zmc2V0ICs9IDM7Ci0KLSAgICBzaXplX3Qgc3RhcnRPZmZzZXQgPSBvZmZzZXQ7Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIHdoaWxlIChvZmZzZXQgPCBzaXplICYmIGRhdGFbb2Zmc2V0XSAhPSAweDAxKSB7Ci0gICAgICAgICAgICArK29mZnNldDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvZmZzZXQgPT0gc2l6ZSkgewotICAgICAgICAgICAgaWYgKHN0YXJ0Q29kZUZvbGxvd3MpIHsKLSAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplICsgMjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIC1FQUdBSU47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGF0YVtvZmZzZXQgLSAxXSA9PSAweDAwICYmIGRhdGFbb2Zmc2V0IC0gMl0gPT0gMHgwMCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICArK29mZnNldDsKLSAgICB9Ci0KLSAgICBzaXplX3QgZW5kT2Zmc2V0ID0gb2Zmc2V0IC0gMjsKLSAgICB3aGlsZSAoZW5kT2Zmc2V0ID4gc3RhcnRPZmZzZXQgKyAxICYmIGRhdGFbZW5kT2Zmc2V0IC0gMV0gPT0gMHgwMCkgewotICAgICAgICAtLWVuZE9mZnNldDsKLSAgICB9Ci0KLSAgICAqbmFsU3RhcnQgPSAmZGF0YVtzdGFydE9mZnNldF07Ci0gICAgKm5hbFNpemUgPSBlbmRPZmZzZXQgLSBzdGFydE9mZnNldDsKLQotICAgIGlmIChvZmZzZXQgKyAyIDwgc2l6ZSkgewotICAgICAgICAqX2RhdGEgPSAmZGF0YVtvZmZzZXQgLSAyXTsKLSAgICAgICAgKl9zaXplID0gc2l6ZSAtIG9mZnNldCArIDI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKl9kYXRhID0gTlVMTDsKLSAgICAgICAgKl9zaXplID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXRpYyBzcDxBQnVmZmVyPiBGaW5kTkFMKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplLCB1bnNpZ25lZCBuYWxUeXBlKSB7Ci0gICAgY29uc3QgdWludDhfdCAqbmFsU3RhcnQ7Ci0gICAgc2l6ZV90IG5hbFNpemU7Ci0gICAgd2hpbGUgKGdldE5leHROQUxVbml0KCZkYXRhLCAmc2l6ZSwgJm5hbFN0YXJ0LCAmbmFsU2l6ZSwgdHJ1ZSkgPT0gT0spIHsKLSAgICAgICAgaWYgKG5hbFNpemUgPiAwICYmIChuYWxTdGFydFswXSAmIDB4MWYpID09IG5hbFR5cGUpIHsKLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKG5hbFNpemUpOwotICAgICAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpLCBuYWxTdGFydCwgbmFsU2l6ZSk7Ci0gICAgICAgICAgICByZXR1cm4gYnVmZmVyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLWNvbnN0IGNoYXIgKkFWQ1Byb2ZpbGVUb1N0cmluZyh1aW50OF90IHByb2ZpbGUpIHsKLSAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKLSAgICAgICAgY2FzZSBrQVZDUHJvZmlsZUJhc2VsaW5lOgotICAgICAgICAgICAgcmV0dXJuICJCYXNlbGluZSI7Ci0gICAgICAgIGNhc2Uga0FWQ1Byb2ZpbGVNYWluOgotICAgICAgICAgICAgcmV0dXJuICJNYWluIjsKLSAgICAgICAgY2FzZSBrQVZDUHJvZmlsZUV4dGVuZGVkOgotICAgICAgICAgICAgcmV0dXJuICJFeHRlbmRlZCI7Ci0gICAgICAgIGNhc2Uga0FWQ1Byb2ZpbGVIaWdoOgotICAgICAgICAgICAgcmV0dXJuICJIaWdoIjsKLSAgICAgICAgY2FzZSBrQVZDUHJvZmlsZUhpZ2gxMDoKLSAgICAgICAgICAgIHJldHVybiAiSGlnaCAxMCI7Ci0gICAgICAgIGNhc2Uga0FWQ1Byb2ZpbGVIaWdoNDIyOgotICAgICAgICAgICAgcmV0dXJuICJIaWdoIDQyMiI7Ci0gICAgICAgIGNhc2Uga0FWQ1Byb2ZpbGVIaWdoNDQ0OgotICAgICAgICAgICAgcmV0dXJuICJIaWdoIDQ0NCI7Ci0gICAgICAgIGNhc2Uga0FWQ1Byb2ZpbGVDQVZMQzQ0NEludHJhOgotICAgICAgICAgICAgcmV0dXJuICJDQVZMQyA0NDQgSW50cmEiOwotICAgICAgICBkZWZhdWx0OiAgIHJldHVybiAiVW5rbm93biI7Ci0gICAgfQotfQotCi1zcDxNZXRhRGF0YT4gTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KSB7Ci0gICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGFjY2Vzc1VuaXQtPmRhdGEoKTsKLSAgICBzaXplX3Qgc2l6ZSA9IGFjY2Vzc1VuaXQtPnNpemUoKTsKLQotICAgIHNwPEFCdWZmZXI+IHNlcVBhcmFtU2V0ID0gRmluZE5BTChkYXRhLCBzaXplLCA3KTsKLSAgICBpZiAoc2VxUGFyYW1TZXQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgaW50MzJfdCBzYXJXaWR0aCwgc2FySGVpZ2h0OwotICAgIEZpbmRBVkNEaW1lbnNpb25zKAotICAgICAgICAgICAgc2VxUGFyYW1TZXQsICZ3aWR0aCwgJmhlaWdodCwgJnNhcldpZHRoLCAmc2FySGVpZ2h0KTsKLQotICAgIHNwPEFCdWZmZXI+IHBpY1BhcmFtU2V0ID0gRmluZE5BTChkYXRhLCBzaXplLCA4KTsKLSAgICBDSEVDSyhwaWNQYXJhbVNldCAhPSBOVUxMKTsKLQotICAgIHNpemVfdCBjc2RTaXplID0KLSAgICAgICAgMSArIDMgKyAxICsgMQotICAgICAgICArIDIgKiAxICsgc2VxUGFyYW1TZXQtPnNpemUoKQotICAgICAgICArIDEgKyAyICogMSArIHBpY1BhcmFtU2V0LT5zaXplKCk7Ci0KLSAgICBzcDxBQnVmZmVyPiBjc2QgPSBuZXcgQUJ1ZmZlcihjc2RTaXplKTsKLSAgICB1aW50OF90ICpvdXQgPSBjc2QtPmRhdGEoKTsKLQotICAgICpvdXQrKyA9IDB4MDE7ICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbgotICAgIG1lbWNweShvdXQsIHNlcVBhcmFtU2V0LT5kYXRhKCkgKyAxLCAzKTsgIC8vIHByb2ZpbGUvbGV2ZWwuLi4KLQotICAgIHVpbnQ4X3QgcHJvZmlsZSA9IG91dFswXTsKLSAgICB1aW50OF90IGxldmVsID0gb3V0WzJdOwotCi0gICAgb3V0ICs9IDM7Ci0gICAgKm91dCsrID0gKDB4M2YgPDwgMikgfCAxOyAgLy8gbGVuZ3RoU2l6ZSA9PSAyIGJ5dGVzCi0gICAgKm91dCsrID0gMHhlMCB8IDE7Ci0KLSAgICAqb3V0KysgPSBzZXFQYXJhbVNldC0+c2l6ZSgpID4+IDg7Ci0gICAgKm91dCsrID0gc2VxUGFyYW1TZXQtPnNpemUoKSAmIDB4ZmY7Ci0gICAgbWVtY3B5KG91dCwgc2VxUGFyYW1TZXQtPmRhdGEoKSwgc2VxUGFyYW1TZXQtPnNpemUoKSk7Ci0gICAgb3V0ICs9IHNlcVBhcmFtU2V0LT5zaXplKCk7Ci0KLSAgICAqb3V0KysgPSAxOwotCi0gICAgKm91dCsrID0gcGljUGFyYW1TZXQtPnNpemUoKSA+PiA4OwotICAgICpvdXQrKyA9IHBpY1BhcmFtU2V0LT5zaXplKCkgJiAweGZmOwotICAgIG1lbWNweShvdXQsIHBpY1BhcmFtU2V0LT5kYXRhKCksIHBpY1BhcmFtU2V0LT5zaXplKCkpOwotCi0jaWYgMAotICAgIEFMT0dJKCJBVkMgc2VxIHBhcmFtIHNldCIpOwotICAgIGhleGR1bXAoc2VxUGFyYW1TZXQtPmRhdGEoKSwgc2VxUGFyYW1TZXQtPnNpemUoKSk7Ci0jZW5kaWYKLQotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOwotCi0gICAgbWV0YS0+c2V0RGF0YShrS2V5QVZDQywga1R5cGVBVkNDLCBjc2QtPmRhdGEoKSwgY3NkLT5zaXplKCkpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7Ci0KLSAgICBpZiAoKHNhcldpZHRoID4gMCAmJiBzYXJIZWlnaHQgPiAwKSAmJiAoc2FyV2lkdGggIT0gMSB8fCBzYXJIZWlnaHQgIT0gMSkpIHsKLSAgICAgICAgLy8gV2UgdHJlYXQgKjowIGFuZCAwOiogKHVuc3BlY2lmaWVkKSBhcyAxOjEuCi0KLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVNBUldpZHRoLCBzYXJXaWR0aCk7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlTQVJIZWlnaHQsIHNhckhlaWdodCk7Ci0KLSAgICAgICAgQUxPR0koImZvdW5kIEFWQyBjb2RlYyBjb25maWcgKCVkIHggJWQsICVzLXByb2ZpbGUgbGV2ZWwgJWQuJWQpICIKLSAgICAgICAgICAgICAgIlNBUiAlZCA6ICVkIiwKLSAgICAgICAgICAgICB3aWR0aCwKLSAgICAgICAgICAgICBoZWlnaHQsCi0gICAgICAgICAgICAgQVZDUHJvZmlsZVRvU3RyaW5nKHByb2ZpbGUpLAotICAgICAgICAgICAgIGxldmVsIC8gMTAsCi0gICAgICAgICAgICAgbGV2ZWwgJSAxMCwKLSAgICAgICAgICAgICBzYXJXaWR0aCwKLSAgICAgICAgICAgICBzYXJIZWlnaHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dJKCJmb3VuZCBBVkMgY29kZWMgY29uZmlnICglZCB4ICVkLCAlcy1wcm9maWxlIGxldmVsICVkLiVkKSIsCi0gICAgICAgICAgICAgd2lkdGgsCi0gICAgICAgICAgICAgaGVpZ2h0LAotICAgICAgICAgICAgIEFWQ1Byb2ZpbGVUb1N0cmluZyhwcm9maWxlKSwKLSAgICAgICAgICAgICBsZXZlbCAvIDEwLAotICAgICAgICAgICAgIGxldmVsICUgMTApOwotICAgIH0KLQotICAgIHJldHVybiBtZXRhOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWJvb2wgSXNJRFJJbnRlcm5hbChjb25zdCBzcDxUPiAmYnVmZmVyKSB7Ci0gICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOwotICAgIHNpemVfdCBzaXplID0gYnVmZmVyLT5zaXplKCk7Ci0KLSAgICBib29sIGZvdW5kSURSID0gZmFsc2U7Ci0KLSAgICBjb25zdCB1aW50OF90ICpuYWxTdGFydDsKLSAgICBzaXplX3QgbmFsU2l6ZTsKLSAgICB3aGlsZSAoZ2V0TmV4dE5BTFVuaXQoJmRhdGEsICZzaXplLCAmbmFsU3RhcnQsICZuYWxTaXplLCB0cnVlKSA9PSBPSykgewotICAgICAgICBpZiAobmFsU2l6ZSA9PSAwdSkgewotICAgICAgICAgICAgQUxPR1coInNraXBwaW5nIGVtcHR5IG5hbCB1bml0IGZyb20gcG90ZW50aWFsbHkgbWFsZm9ybWVkIGJpdHN0cmVhbSIpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICB1bnNpZ25lZCBuYWxUeXBlID0gbmFsU3RhcnRbMF0gJiAweDFmOwotCi0gICAgICAgIGlmIChuYWxUeXBlID09IDUpIHsKLSAgICAgICAgICAgIGZvdW5kSURSID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGZvdW5kSURSOwotfQotCi1ib29sIElzSURSKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKLSAgICByZXR1cm4gSXNJRFJJbnRlcm5hbChidWZmZXIpOwotfQotCi1ib29sIElzSURSKGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIpIHsKLSAgICByZXR1cm4gSXNJRFJJbnRlcm5hbChidWZmZXIpOwotfQotCi1ib29sIElzQVZDUmVmZXJlbmNlRnJhbWUoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpIHsKLSAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYWNjZXNzVW5pdC0+ZGF0YSgpOwotICAgIHNpemVfdCBzaXplID0gYWNjZXNzVW5pdC0+c2l6ZSgpOwotICAgIGlmIChkYXRhID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIklzQVZDUmVmZXJlbmNlRnJhbWU6IGNhbGxlZCBvbiBOVUxMIGRhdGEgKCVwLCAlenUpIiwgYWNjZXNzVW5pdC5nZXQoKSwgc2l6ZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjb25zdCB1aW50OF90ICpuYWxTdGFydDsKLSAgICBzaXplX3QgbmFsU2l6ZTsKLSAgICB3aGlsZSAoZ2V0TmV4dE5BTFVuaXQoJmRhdGEsICZzaXplLCAmbmFsU3RhcnQsICZuYWxTaXplLCB0cnVlKSA9PSBPSykgewotICAgICAgICBpZiAobmFsU2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiSXNBVkNSZWZlcmVuY2VGcmFtZTogaW52YWxpZCBuYWxTaXplOiAwICglcCwgJXp1KSIsIGFjY2Vzc1VuaXQuZ2V0KCksIHNpemUpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgdW5zaWduZWQgbmFsVHlwZSA9IG5hbFN0YXJ0WzBdICYgMHgxZjsKLQotICAgICAgICBpZiAobmFsVHlwZSA9PSA1KSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChuYWxUeXBlID09IDEpIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIG5hbF9yZWZfaWRjID0gKG5hbFN0YXJ0WzBdID4+IDUpICYgMzsKLSAgICAgICAgICAgIHJldHVybiBuYWxfcmVmX2lkYyAhPSAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXVpbnQzMl90IEZpbmRBVkNMYXllcklkKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgQ0hFQ0soZGF0YSAhPSBOVUxMKTsKLQotICAgIGNvbnN0IHVuc2lnbmVkIGtTdmNOYWxUeXBlID0gMHhFOwotICAgIGNvbnN0IHVuc2lnbmVkIGtTdmNOYWxTZWFyY2hSYW5nZSA9IDMyOwotICAgIC8vIFNWQyBOQUwKLSAgICAvLyB8LS0tMCAxMTEwfDEtLS0gLS0tLXwtLS0tIC0tLS18aWlpLSAtLS18Ci0gICAgLy8gICAgICAgXiAgICAgICAgICAgICAgICAgICAgICAgIF4KLSAgICAvLyAgIE5BTC10eXBlID0gMHhFICAgICAgICAgICAgICAgbGF5ZXItSWQKLSAgICAvLwotICAgIC8vIGxheWVyX2lkIDAgaXMgZm9yIGJhc2UgbGF5ZXIsIHdoaWxlIDEsIDIsIC4uLiBhcmUgZW5oYW5jZW1lbnQgbGF5ZXJzLgotICAgIC8vIExheWVyIG4gdXNlcyByZWZlcmVuY2UgZnJhbWVzIGZyb20gbGF5ZXIgMCwgMSwgLi4uLCBuLTEuCi0KLSAgICB1aW50MzJfdCBsYXllcklkID0gMDsKLSAgICBzcDxBQnVmZmVyPiBzdmNOQUwgPSBGaW5kTkFMKAotICAgICAgICAgICAgZGF0YSwgc2l6ZSA+IGtTdmNOYWxTZWFyY2hSYW5nZSA/IGtTdmNOYWxTZWFyY2hSYW5nZSA6IHNpemUsIGtTdmNOYWxUeXBlKTsKLSAgICBpZiAoc3ZjTkFMICE9IE5VTEwgJiYgc3ZjTkFMLT5zaXplKCkgPj0gNCkgewotICAgICAgICBsYXllcklkID0gKCooc3ZjTkFMLT5kYXRhKCkgKyAzKSA+PiA1KSAmIDB4NzsKLSAgICB9Ci0gICAgcmV0dXJuIGxheWVySWQ7Ci19Ci0KLXNwPE1ldGFEYXRhPiBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoCi0gICAgICAgIHVuc2lnbmVkIHByb2ZpbGUsIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXgsCi0gICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbikgewotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOwotCi0gICAgQ0hFQ0tfTEUoc2FtcGxpbmdfZnJlcV9pbmRleCwgMTF1KTsKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrU2FtcGxpbmdGcmVxW10gPSB7Ci0gICAgICAgIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsIDI0MDAwLCAyMjA1MCwKLSAgICAgICAgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMAotICAgIH07Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIGtTYW1wbGluZ0ZyZXFbc2FtcGxpbmdfZnJlcV9pbmRleF0pOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGNoYW5uZWxfY29uZmlndXJhdGlvbik7Ci0KLSAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrU3RhdGljRVNEU1tdID0gewotICAgICAgICAweDAzLCAyMiwKLSAgICAgICAgMHgwMCwgMHgwMCwgICAgIC8vIEVTX0lECi0gICAgICAgIDB4MDAsICAgICAgICAgICAvLyBzdHJlYW1EZXBlbmRlbmNlRmxhZywgVVJMX0ZsYWcsIE9DUnN0cmVhbUZsYWcKLQotICAgICAgICAweDA0LCAxNywKLSAgICAgICAgMHg0MCwgICAgICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvIElTTy9JRUMgMTQ0OTYtMwotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCi0gICAgICAgIDB4MDUsIDIsCi0gICAgICAgIC8vIEF1ZGlvU3BlY2lmaWNJbmZvIGZvbGxvd3MKLQotICAgICAgICAvLyBvb29vIG9mZmYgZmNjYyBjMDAwCi0gICAgICAgIC8vIG8gLSBhdWRpb09iamVjdFR5cGUKLSAgICAgICAgLy8gZiAtIHNhbXBsaW5nRnJlcUluZGV4Ci0gICAgICAgIC8vIGMgLSBjaGFubmVsQ29uZmlnCi0gICAgfTsKLSAgICBzcDxBQnVmZmVyPiBjc2QgPSBuZXcgQUJ1ZmZlcihzaXplb2Yoa1N0YXRpY0VTRFMpICsgMik7Ci0gICAgbWVtY3B5KGNzZC0+ZGF0YSgpLCBrU3RhdGljRVNEUywgc2l6ZW9mKGtTdGF0aWNFU0RTKSk7Ci0KLSAgICBjc2QtPmRhdGEoKVtzaXplb2Yoa1N0YXRpY0VTRFMpXSA9Ci0gICAgICAgICgocHJvZmlsZSArIDEpIDw8IDMpIHwgKHNhbXBsaW5nX2ZyZXFfaW5kZXggPj4gMSk7Ci0KLSAgICBjc2QtPmRhdGEoKVtzaXplb2Yoa1N0YXRpY0VTRFMpICsgMV0gPQotICAgICAgICAoKHNhbXBsaW5nX2ZyZXFfaW5kZXggPDwgNykgJiAweDgwKSB8IChjaGFubmVsX2NvbmZpZ3VyYXRpb24gPDwgMyk7Ci0KLSAgICBtZXRhLT5zZXREYXRhKGtLZXlFU0RTLCAwLCBjc2QtPmRhdGEoKSwgY3NkLT5zaXplKCkpOwotCi0gICAgcmV0dXJuIG1ldGE7Ci19Ci0KLWJvb2wgRXh0cmFjdERpbWVuc2lvbnNGcm9tVk9MSGVhZGVyKAotICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50MzJfdCAqd2lkdGgsIGludDMyX3QgKmhlaWdodCkgewotICAgIEFCaXRSZWFkZXIgYnIoJmRhdGFbNF0sIHNpemUgLSA0KTsKLSAgICBici5za2lwQml0cygxKTsgIC8vIHJhbmRvbV9hY2Nlc3NpYmxlX3ZvbAotICAgIHVuc2lnbmVkIHZpZGVvX29iamVjdF90eXBlX2luZGljYXRpb24gPSBici5nZXRCaXRzKDgpOwotCi0gICAgQ0hFQ0tfTkUodmlkZW9fb2JqZWN0X3R5cGVfaW5kaWNhdGlvbiwKLSAgICAgICAgICAgICAweDIxdSAvKiBGaW5lIEdyYW51bGFyaXR5IFNjYWxhYmxlICovKTsKLQotICAgIHVuc2lnbmVkIHZpZGVvX29iamVjdF9sYXllcl92ZXJpZCBfX3VudXNlZDsKLSAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfbGF5ZXJfcHJpb3JpdHkgX191bnVzZWQ7Ci0gICAgaWYgKGJyLmdldEJpdHMoMSkpIHsKLSAgICAgICAgdmlkZW9fb2JqZWN0X2xheWVyX3ZlcmlkID0gYnIuZ2V0Qml0cyg0KTsKLSAgICAgICAgdmlkZW9fb2JqZWN0X2xheWVyX3ByaW9yaXR5ID0gYnIuZ2V0Qml0cygzKTsKLSAgICB9Ci0gICAgdW5zaWduZWQgYXNwZWN0X3JhdGlvX2luZm8gPSBici5nZXRCaXRzKDQpOwotICAgIGlmIChhc3BlY3RfcmF0aW9faW5mbyA9PSAweDBmIC8qIGV4dGVuZGVkIFBBUiAqLykgewotICAgICAgICBici5za2lwQml0cyg4KTsgIC8vIHBhcl93aWR0aAotICAgICAgICBici5za2lwQml0cyg4KTsgIC8vIHBhcl9oZWlnaHQKLSAgICB9Ci0gICAgaWYgKGJyLmdldEJpdHMoMSkpIHsgIC8vIHZvbF9jb250cm9sX3BhcmFtZXRlcnMKLSAgICAgICAgYnIuc2tpcEJpdHMoMik7ICAvLyBjaHJvbWFfZm9ybWF0Ci0gICAgICAgIGJyLnNraXBCaXRzKDEpOyAgLy8gbG93X2RlbGF5Ci0gICAgICAgIGlmIChici5nZXRCaXRzKDEpKSB7ICAvLyB2YnZfcGFyYW1ldGVycwotICAgICAgICAgICAgYnIuc2tpcEJpdHMoMTUpOyAgLy8gZmlyc3RfaGFsZl9iaXRfcmF0ZQotICAgICAgICAgICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0Ci0gICAgICAgICAgICBici5za2lwQml0cygxNSk7ICAvLyBsYXR0ZXJfaGFsZl9iaXRfcmF0ZQotICAgICAgICAgICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0Ci0gICAgICAgICAgICBici5za2lwQml0cygxNSk7ICAvLyBmaXJzdF9oYWxmX3Zidl9idWZmZXJfc2l6ZQotICAgICAgICAgICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0Ci0gICAgICAgICAgICBici5za2lwQml0cygzKTsgIC8vIGxhdHRlcl9oYWxmX3Zidl9idWZmZXJfc2l6ZQotICAgICAgICAgICAgYnIuc2tpcEJpdHMoMTEpOyAgLy8gZmlyc3RfaGFsZl92YnZfb2NjdXBhbmN5Ci0gICAgICAgICAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKLSAgICAgICAgICAgIGJyLnNraXBCaXRzKDE1KTsgIC8vIGxhdHRlcl9oYWxmX3Zidl9vY2N1cGFuY3kKLSAgICAgICAgICAgIENIRUNLKGJyLmdldEJpdHMoMSkpOyAgLy8gbWFya2VyX2JpdAotICAgICAgICB9Ci0gICAgfQotICAgIHVuc2lnbmVkIHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSA9IGJyLmdldEJpdHMoMik7Ci0gICAgQ0hFQ0tfRVEodmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlLCAweDAwdSAvKiByZWN0YW5ndWxhciAqLyk7Ci0KLSAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKLSAgICB1bnNpZ25lZCB2b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiA9IGJyLmdldEJpdHMoMTYpOwotICAgIENIRUNLKGJyLmdldEJpdHMoMSkpOyAgLy8gbWFya2VyX2JpdAotCi0gICAgaWYgKGJyLmdldEJpdHMoMSkpIHsgIC8vIGZpeGVkX3ZvcF9yYXRlCi0gICAgICAgIC8vIHJhbmdlIFswLi52b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbikKLQotICAgICAgICAvLyB2b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbgotICAgICAgICAvLyAyID0+IDAuLjEsIDEgYml0Ci0gICAgICAgIC8vIDMgPT4gMC4uMiwgMiBiaXRzCi0gICAgICAgIC8vIDQgPT4gMC4uMywgMiBiaXRzCi0gICAgICAgIC8vIDUgPT4gMC4uNCwgMyBiaXRzCi0gICAgICAgIC8vIC4uLgotCi0gICAgICAgIENIRUNLX0dUKHZvcF90aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uLCAwdSk7Ci0gICAgICAgIC0tdm9wX3RpbWVfaW5jcmVtZW50X3Jlc29sdXRpb247Ci0KLSAgICAgICAgdW5zaWduZWQgbnVtQml0cyA9IDA7Ci0gICAgICAgIHdoaWxlICh2b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiA+IDApIHsKLSAgICAgICAgICAgICsrbnVtQml0czsKLSAgICAgICAgICAgIHZvcF90aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uID4+PSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgYnIuc2tpcEJpdHMobnVtQml0cyk7ICAvLyBmaXhlZF92b3BfdGltZV9pbmNyZW1lbnQKLSAgICB9Ci0KLSAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKLSAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfbGF5ZXJfd2lkdGggPSBici5nZXRCaXRzKDEzKTsKLSAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKLSAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfbGF5ZXJfaGVpZ2h0ID0gYnIuZ2V0Qml0cygxMyk7Ci0gICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0Ci0KLSAgICB1bnNpZ25lZCBpbnRlcmxhY2VkIF9fdW51c2VkID0gYnIuZ2V0Qml0cygxKTsKLQotICAgICp3aWR0aCA9IHZpZGVvX29iamVjdF9sYXllcl93aWR0aDsKLSAgICAqaGVpZ2h0ID0gdmlkZW9fb2JqZWN0X2xheWVyX2hlaWdodDsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIEdldE1QRUdBdWRpb0ZyYW1lU2l6ZSgKLSAgICAgICAgdWludDMyX3QgaGVhZGVyLCBzaXplX3QgKmZyYW1lX3NpemUsCi0gICAgICAgIGludCAqb3V0X3NhbXBsaW5nX3JhdGUsIGludCAqb3V0X2NoYW5uZWxzLAotICAgICAgICBpbnQgKm91dF9iaXRyYXRlLCBpbnQgKm91dF9udW1fc2FtcGxlcykgewotICAgICpmcmFtZV9zaXplID0gMDsKLQotICAgIGlmIChvdXRfc2FtcGxpbmdfcmF0ZSkgewotICAgICAgICAqb3V0X3NhbXBsaW5nX3JhdGUgPSAwOwotICAgIH0KLQotICAgIGlmIChvdXRfY2hhbm5lbHMpIHsKLSAgICAgICAgKm91dF9jaGFubmVscyA9IDA7Ci0gICAgfQotCi0gICAgaWYgKG91dF9iaXRyYXRlKSB7Ci0gICAgICAgICpvdXRfYml0cmF0ZSA9IDA7Ci0gICAgfQotCi0gICAgaWYgKG91dF9udW1fc2FtcGxlcykgewotICAgICAgICAqb3V0X251bV9zYW1wbGVzID0gMTE1MjsKLSAgICB9Ci0KLSAgICBpZiAoKGhlYWRlciAmIDB4ZmZlMDAwMDApICE9IDB4ZmZlMDAwMDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHVuc2lnbmVkIHZlcnNpb24gPSAoaGVhZGVyID4+IDE5KSAmIDM7Ci0KLSAgICBpZiAodmVyc2lvbiA9PSAweDAxKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB1bnNpZ25lZCBsYXllciA9IChoZWFkZXIgPj4gMTcpICYgMzsKLQotICAgIGlmIChsYXllciA9PSAweDAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB1bnNpZ25lZCBwcm90ZWN0aW9uIF9fdW51c2VkID0gKGhlYWRlciA+PiAxNikgJiAxOwotCi0gICAgdW5zaWduZWQgYml0cmF0ZV9pbmRleCA9IChoZWFkZXIgPj4gMTIpICYgMHgwZjsKLQotICAgIGlmIChiaXRyYXRlX2luZGV4ID09IDAgfHwgYml0cmF0ZV9pbmRleCA9PSAweDBmKSB7Ci0gICAgICAgIC8vIERpc2FsbG93ICJmcmVlIiBiaXRyYXRlLgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdW5zaWduZWQgc2FtcGxpbmdfcmF0ZV9pbmRleCA9IChoZWFkZXIgPj4gMTApICYgMzsKLQotICAgIGlmIChzYW1wbGluZ19yYXRlX2luZGV4ID09IDMpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHN0YXRpYyBjb25zdCBpbnQga1NhbXBsaW5nUmF0ZVYxW10gPSB7IDQ0MTAwLCA0ODAwMCwgMzIwMDAgfTsKLSAgICBpbnQgc2FtcGxpbmdfcmF0ZSA9IGtTYW1wbGluZ1JhdGVWMVtzYW1wbGluZ19yYXRlX2luZGV4XTsKLSAgICBpZiAodmVyc2lvbiA9PSAyIC8qIFYyICovKSB7Ci0gICAgICAgIHNhbXBsaW5nX3JhdGUgLz0gMjsKLSAgICB9IGVsc2UgaWYgKHZlcnNpb24gPT0gMCAvKiBWMi41ICovKSB7Ci0gICAgICAgIHNhbXBsaW5nX3JhdGUgLz0gNDsKLSAgICB9Ci0KLSAgICB1bnNpZ25lZCBwYWRkaW5nID0gKGhlYWRlciA+PiA5KSAmIDE7Ci0KLSAgICBpZiAobGF5ZXIgPT0gMykgewotICAgICAgICAvLyBsYXllciBJCi0KLSAgICAgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYxW10gPSB7Ci0gICAgICAgICAgICAzMiwgNjQsIDk2LCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwKLSAgICAgICAgICAgIDI4OCwgMzIwLCAzNTIsIDM4NCwgNDE2LCA0NDgKLSAgICAgICAgfTsKLQotICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjJbXSA9IHsKLSAgICAgICAgICAgIDMyLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LAotICAgICAgICAgICAgMTQ0LCAxNjAsIDE3NiwgMTkyLCAyMjQsIDI1NgotICAgICAgICB9OwotCi0gICAgICAgIGludCBiaXRyYXRlID0KLSAgICAgICAgICAgICh2ZXJzaW9uID09IDMgLyogVjEgKi8pCi0gICAgICAgICAgICAgICAgPyBrQml0cmF0ZVYxW2JpdHJhdGVfaW5kZXggLSAxXQotICAgICAgICAgICAgICAgIDoga0JpdHJhdGVWMltiaXRyYXRlX2luZGV4IC0gMV07Ci0KLSAgICAgICAgaWYgKG91dF9iaXRyYXRlKSB7Ci0gICAgICAgICAgICAqb3V0X2JpdHJhdGUgPSBiaXRyYXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgKmZyYW1lX3NpemUgPSAoMTIwMDAgKiBiaXRyYXRlIC8gc2FtcGxpbmdfcmF0ZSArIHBhZGRpbmcpICogNDsKLQotICAgICAgICBpZiAob3V0X251bV9zYW1wbGVzKSB7Ci0gICAgICAgICAgICAqb3V0X251bV9zYW1wbGVzID0gMzg0OwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gbGF5ZXIgSUkgb3IgSUlJCi0KLSAgICAgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYxTDJbXSA9IHsKLSAgICAgICAgICAgIDMyLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LAotICAgICAgICAgICAgMTYwLCAxOTIsIDIyNCwgMjU2LCAzMjAsIDM4NAotICAgICAgICB9OwotCi0gICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMUwzW10gPSB7Ci0gICAgICAgICAgICAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLAotICAgICAgICAgICAgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDMyMAotICAgICAgICB9OwotCi0gICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMltdID0gewotICAgICAgICAgICAgOCwgMTYsIDI0LCAzMiwgNDAsIDQ4LCA1NiwgNjQsCi0gICAgICAgICAgICA4MCwgOTYsIDExMiwgMTI4LCAxNDQsIDE2MAotICAgICAgICB9OwotCi0gICAgICAgIGludCBiaXRyYXRlOwotICAgICAgICBpZiAodmVyc2lvbiA9PSAzIC8qIFYxICovKSB7Ci0gICAgICAgICAgICBiaXRyYXRlID0gKGxheWVyID09IDIgLyogTDIgKi8pCi0gICAgICAgICAgICAgICAgPyBrQml0cmF0ZVYxTDJbYml0cmF0ZV9pbmRleCAtIDFdCi0gICAgICAgICAgICAgICAgOiBrQml0cmF0ZVYxTDNbYml0cmF0ZV9pbmRleCAtIDFdOwotCi0gICAgICAgICAgICBpZiAob3V0X251bV9zYW1wbGVzKSB7Ci0gICAgICAgICAgICAgICAgKm91dF9udW1fc2FtcGxlcyA9IDExNTI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBWMiAob3IgMi41KQotCi0gICAgICAgICAgICBiaXRyYXRlID0ga0JpdHJhdGVWMltiaXRyYXRlX2luZGV4IC0gMV07Ci0gICAgICAgICAgICBpZiAob3V0X251bV9zYW1wbGVzKSB7Ci0gICAgICAgICAgICAgICAgKm91dF9udW1fc2FtcGxlcyA9IChsYXllciA9PSAxIC8qIEwzICovKSA/IDU3NiA6IDExNTI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3V0X2JpdHJhdGUpIHsKLSAgICAgICAgICAgICpvdXRfYml0cmF0ZSA9IGJpdHJhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmVyc2lvbiA9PSAzIC8qIFYxICovKSB7Ci0gICAgICAgICAgICAqZnJhbWVfc2l6ZSA9IDE0NDAwMCAqIGJpdHJhdGUgLyBzYW1wbGluZ19yYXRlICsgcGFkZGluZzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFYyIG9yIFYyLjUKLSAgICAgICAgICAgIHNpemVfdCB0bXAgPSAobGF5ZXIgPT0gMSAvKiBMMyAqLykgPyA3MjAwMCA6IDE0NDAwMDsKLSAgICAgICAgICAgICpmcmFtZV9zaXplID0gdG1wICogYml0cmF0ZSAvIHNhbXBsaW5nX3JhdGUgKyBwYWRkaW5nOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG91dF9zYW1wbGluZ19yYXRlKSB7Ci0gICAgICAgICpvdXRfc2FtcGxpbmdfcmF0ZSA9IHNhbXBsaW5nX3JhdGU7Ci0gICAgfQotCi0gICAgaWYgKG91dF9jaGFubmVscykgewotICAgICAgICBpbnQgY2hhbm5lbF9tb2RlID0gKGhlYWRlciA+PiA2KSAmIDM7Ci0KLSAgICAgICAgKm91dF9jaGFubmVscyA9IChjaGFubmVsX21vZGUgPT0gMykgPyAxIDogMjsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY0NmJlNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2OCBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZV9oZWxwZXIiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDb252ZXJzaW9uLmNwcCIsCisgICAgICAgICJGcmFtZURyb3BwZXIuY3BwIiwKKyAgICAgICAgIkdyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIiwKKyAgICAgICAgIldQcm9kdWNlckxpc3RlbmVyLmNwcCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGxtZW1vcnkiLAorICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJ1dGlscyIsCisKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKKworICAgICAgICAibGlibmF0aXZld2luZG93IiwgLy8gVE9ETyhiLzYyOTIzNDc5KTogdXNlIGhlYWRlciBsaWJyYXJ5CisgICAgXSwKKworICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKKyAgICAgICAgIi1Xbm8tZG9jdW1lbnRhdGlvbiIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9Db252ZXJzaW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmVkMDA1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5jcHAKQEAgLTAsMCArMSwxNTQyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0NvbnZlcnNpb24uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNvbnZlcnNpb24geworCisvLyBuYXRpdmVfaGFuZGxlX3QgaGVscGVyIGZ1bmN0aW9ucy4KKworLyoqCisgKiBcYnJpZWYgVGFrZSBhbiBmZCBhbmQgY3JlYXRlIGEgbmF0aXZlIGhhbmRsZSBjb250YWluaW5nIG9ubHkgdGhlIGdpdmVuIGZkLgorICogVGhlIGNyZWF0ZWQgaGFuZGxlIHdpbGwgbmVlZCB0byBiZSBkZWxldGVkIG1hbnVhbGx5IHdpdGgKKyAqIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYC4KKyAqCisgKiBccGFyYW1baW5dIGZkIFRoZSBzb3VyY2UgZmlsZSBkZXNjcmlwdG9yIChvZiB0eXBlIGBpbnRgKS4KKyAqIFxyZXR1cm4gVGhlIGNyZWF0ZSBgbmF0aXZlX2hhbmRsZV90KmAgdGhhdCBjb250YWlucyB0aGUgZ2l2ZW4gXHAgZmQuIElmIHRoZQorICogc3VwcGxpZWQgXHAgZmQgaXMgbmVnYXRpdmUsIHRoZSBjcmVhdGVkIG5hdGl2ZSBoYW5kbGUgd2lsbCBjb250YWluIG5vIGZpbGUKKyAqIGRlc2NyaXB0b3JzLgorICoKKyAqIElmIHRoZSBuYXRpdmUgaGFuZGxlIGNhbm5vdCBiZSBjcmVhdGVkLCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUKKyAqIGBudWxscHRyYC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGR1cGxpY2F0ZSB0aGUgZmlsZSBkZXNjcmlwdG9yLgorICovCituYXRpdmVfaGFuZGxlX3QqIG5hdGl2ZV9oYW5kbGVfY3JlYXRlX2Zyb21fZmQoaW50IGZkKSB7CisgICAgaWYgKGZkIDwgMikgeworICAgICAgICByZXR1cm4gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMCwgMCk7CisgICAgfQorICAgIG5hdGl2ZV9oYW5kbGVfdCogbmggPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICBpZiAobmggPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgbmgtPmRhdGFbMF0gPSBmZDsKKyAgICByZXR1cm4gbmg7Cit9CisKKy8qKgorICogXGJyaWVmIEV4dHJhY3QgYSBmaWxlIGRlc2NyaXB0b3IgZnJvbSBhIG5hdGl2ZSBoYW5kbGUuCisgKgorICogXHBhcmFtW2luXSBuaCBUaGUgc291cmNlIGBuYXRpdmVfaGFuZGxlX3QqYC4KKyAqIFxwYXJhbVtpbl0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBmaWxlIGRlc2NyaXB0b3IgaW4gXHAgbmggdG8gcmVhZCBmcm9tLiBUaGlzCisgKiBpbnB1dCBoYXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYDBgLgorICogXHJldHVybiBUaGUgYGluZGV4YC10aCBmaWxlIGRlc2NyaXB0b3IgaW4gXHAgbmguIElmIFxwIG5oIGRvZXMgbm90IGhhdmUKKyAqIGVub3VnaCBmaWxlIGRlc2NyaXB0b3JzLCB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSBgLTFgLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZHVwbGljYXRlIHRoZSBmaWxlIGRlc2NyaXB0b3IuCisgKi8KK2ludCBuYXRpdmVfaGFuZGxlX3JlYWRfZmQobmF0aXZlX2hhbmRsZV90IGNvbnN0KiBuaCwgaW50IGluZGV4KSB7CisgICAgcmV0dXJuICgobmggPT0gbnVsbHB0cikgfHwgKG5oLT5udW1GZHMgPT0gMCkgfHwKKyAgICAgICAgICAgIChuaC0+bnVtRmRzIDw9IGluZGV4KSB8fCAoaW5kZXggPCAwKSkgPworICAgICAgICAgICAgLTEgOiBuaC0+ZGF0YVtpbmRleF07Cit9CisKKy8qKgorICogQ29udmVyc2lvbiBmdW5jdGlvbnMKKyAqID09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhlcmUgYXJlIHR3byBtYWluIGRpcmVjdGlvbnMgb2YgY29udmVyc2lvbjoKKyAqIC0gYGluVGFyZ2V0VHlwZSguLi4pYDogQ3JlYXRlIGEgd3JhcHBlciB3aG9zZSBsaWZldGltZSBkZXBlbmRzIG9uIHRoZQorICogICBpbnB1dC4gVGhlIHdyYXBwZXIgaGFzIHR5cGUgYFRhcmdldFR5cGVgLgorICogLSBgdG9UYXJnZXRUeXBlKC4uLilgOiBDcmVhdGUgYSBzdGFuZGFsb25lIG9iamVjdCBvZiB0eXBlIGBUYXJnZXRUeXBlYCB0aGF0CisgKiAgIGNvcnJlc3BvbmRzIHRvIHRoZSBpbnB1dC4gVGhlIGxpZmV0aW1lIG9mIHRoZSBvdXRwdXQgZG9lcyBub3QgZGVwZW5kIG9uIHRoZQorICogICBsaWZldGltZSBvZiB0aGUgaW5wdXQuCisgKiAtIGB3cmFwSW4oVGFyZ2V0VHlwZSosIC4uLilgOiBTYW1lIGFzIGBpblRhcmdldFR5cGUoKWAsIGJ1dCBmb3IgYFRhcmdldFR5cGVgCisgKiAgIHRoYXQgY2Fubm90IGJlIGNvcGllZCBhbmQvb3IgbW92ZWQgZWZmaWNpZW50bHksIG9yIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlCisgKiAgIG91dHB1dCBhcmd1bWVudHMuCisgKiAtIGBjb252ZXJ0VG8oVGFyZ2V0VHlwZSosIC4uLilgOiBTYW1lIGFzIGB0b1RhcmdldFR5cGUoKWAsIGJ1dCBmb3IKKyAqICAgYFRhcmdldFR5cGVgIHRoYXQgY2Fubm90IGJlIGNvcGllZCBhbmQvb3IgbW92ZWQgZWZmaWNpZW50bHksIG9yIHdoZW4gdGhlcmUKKyAqICAgYXJlIG11bHRpcGxlIG91dHB1dCBhcmd1bWVudHMuCisgKgorICogYHdyYXBJbigpYCBhbmQgYGNvbnZlcnRUbygpYCBmdW5jdGlvbnMgd2lsbCB0YWtlIG91dHB1dCBhcmd1bWVudHMgYmVmb3JlCisgKiBpbnB1dCBhcmd1bWVudHMuIFNvbWUgb2YgdGhlc2UgZnVuY3Rpb25zIG1pZ2h0IHJldHVybiBhIHZhbHVlIHRvIGluZGljYXRlCisgKiBzdWNjZXNzIG9yIGVycm9yLgorICoKKyAqIEluIGNvbnZlcnRpbmcgb3Igd3JhcHBpbmcgc29tZXRoaW5nIGFzIGEgVHJlYmxlIHR5cGUgdGhhdCBjb250YWlucyBhCisgKiBgaGlkbF9oYW5kbGVgLCBgbmF0aXZlX2hhbmRsZV90KmAgd2lsbCBuZWVkIHRvIGJlIGNyZWF0ZWQgYW5kIHJldHVybmVkIGFzCisgKiBhbiBhZGRpdGlvbmFsIG91dHB1dCBhcmd1bWVudCwgaGVuY2Ugb25seSBgd3JhcEluKClgIG9yIGBjb252ZXJ0VG8oKWAgd291bGQKKyAqIGJlIGF2YWlsYWJsZS4gVGhlIGNhbGxlciBtdXN0IGNhbGwgYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgIHRvIGRlYWxsb2NhdGUgdGhlCisgKiByZXR1cm5lZCBuYXRpdmUgaGFuZGxlIHdoZW4gaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KKyAqCisgKiBGb3IgdHlwZXMgdGhhdCBjb250YWluIGZpbGUgZGVzY3JpcHRvcnMsIGBpblRhcmdldFR5cGUoKWAgYW5kIGB3cmFwQXMoKWAgZG8KKyAqIG5vdCBwZXJmb3JtIGR1cGxpY2F0aW9uIG9mIGZpbGUgZGVzY3JpcHRvcnMsIHdoaWxlIGB0b1RhcmdldFR5cGUoKWAgYW5kCisgKiBgY29udmVydFRvKClgIGRvLgorICovCisKKy8qKgorICogXGJyaWVmIENvbnZlcnQgYFJldHVybjx2b2lkPmAgdG8gYGJpbmRlcjo6U3RhdHVzYC4KKyAqCisgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgUmV0dXJuPHZvaWQ+YC4KKyAqIFxyZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgYGJpbmRlcjo6U3RhdHVzYC4KKyAqLworLy8gY29udmVydDogUmV0dXJuPHZvaWQ+IC0+IDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgdG9CaW5kZXJTdGF0dXMoCisgICAgICAgIFJldHVybjx2b2lkPiBjb25zdCYgdCkgeworICAgIHJldHVybiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZSgKKyAgICAgICAgICAgIHQuaXNPaygpID8gT0sgOiBVTktOT1dOX0VSUk9SLAorICAgICAgICAgICAgdC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworfQorCisvKioKKyAqIFxicmllZiBDb252ZXJ0IGBSZXR1cm48dm9pZD5gIHRvIGBzdGF0dXNfdGAuIFRoaXMgaXMgZm9yIGxlZ2FjeSBiaW5kZXIgY2FsbHMuCisgKgorICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYFJldHVybjx2b2lkPmAuCisgKiBccmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGBzdGF0dXNfdGAuCisgKi8KKy8vIGNvbnZlcnQ6IFJldHVybjx2b2lkPiAtPiBzdGF0dXNfdAorc3RhdHVzX3QgdG9TdGF0dXNUKFJldHVybjx2b2lkPiBjb25zdCYgdCkgeworICAgIHJldHVybiB0LmlzT2soKSA/IE9LIDogVU5LTk9XTl9FUlJPUjsKK30KKworLyoqCisgKiBcYnJpZWYgV3JhcCBgbmF0aXZlX2hhbmRsZV90KmAgaW4gYGhpZGxfaGFuZGxlYC4KKyAqCisgKiBccGFyYW1baW5dIG5oIFRoZSBzb3VyY2UgYG5hdGl2ZV9oYW5kbGVfdCpgLgorICogXHJldHVybiBUaGUgYGhpZGxfaGFuZGxlYCB0aGF0IHBvaW50cyB0byBccCBuaC4KKyAqLworLy8gd3JhcDogbmF0aXZlX2hhbmRsZV90KiAtPiBoaWRsX2hhbmRsZQoraGlkbF9oYW5kbGUgaW5IaWRsSGFuZGxlKG5hdGl2ZV9oYW5kbGVfdCBjb25zdCogbmgpIHsKKyAgICByZXR1cm4gaGlkbF9oYW5kbGUobmgpOworfQorCisvKioKKyAqIFxicmllZiBDb252ZXJ0IGBpbnQzMl90YCB0byBgRGF0YXNwYWNlYC4KKyAqCisgKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgaW50MzJfdGAuCisgKiBccmVzdWx0IFRoZSBjb3JyZXNwb25kaW5nIGBEYXRhc3BhY2VgLgorICovCisvLyBjb252ZXJ0OiBpbnQzMl90IC0+IERhdGFzcGFjZQorRGF0YXNwYWNlIHRvSGFyZHdhcmVEYXRhc3BhY2UoaW50MzJfdCBsKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PERhdGFzcGFjZT4obCk7Cit9CisKKy8qKgorICogXGJyaWVmIENvbnZlcnQgYERhdGFzcGFjZWAgdG8gYGludDMyX3RgLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBEYXRhc3BhY2VgLgorICogXHJlc3VsdCBUaGUgY29ycmVzcG9uZGluZyBgaW50MzJfdGAuCisgKi8KKy8vIGNvbnZlcnQ6IERhdGFzcGFjZSAtPiBpbnQzMl90CitpbnQzMl90IHRvUmF3RGF0YXNwYWNlKERhdGFzcGFjZSBjb25zdCYgdCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90Pih0KTsKK30KKworLyoqCisgKiBcYnJpZWYgV3JhcCBhbiBvcGFxdWUgYnVmZmVyIGluc2lkZSBhIGBoaWRsX3ZlYzx1aW50OF90PmAuCisgKgorICogXHBhcmFtW2luXSBsIFRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9wYXF1ZSBidWZmZXIuCisgKiBccGFyYW1baW5dIHNpemUgVGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4KKyAqIFxyZXR1cm4gQSBgaGlkbF92ZWM8dWludDhfdD5gIHRoYXQgcG9pbnRzIHRvIHRoZSBidWZmZXIuCisgKi8KKy8vIHdyYXA6IHZvaWQqLCBzaXplX3QgLT4gaGlkbF92ZWM8dWludDhfdD4KK2hpZGxfdmVjPHVpbnQ4X3Q+IGluSGlkbEJ5dGVzKHZvaWQgY29uc3QqIGwsIHNpemVfdCBzaXplKSB7CisgICAgaGlkbF92ZWM8dWludDhfdD4gdDsKKyAgICB0LnNldFRvRXh0ZXJuYWwoc3RhdGljX2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8dm9pZCo+KGwpKSwgc2l6ZSwgZmFsc2UpOworICAgIHJldHVybiB0OworfQorCisvKioKKyAqIFxicmllZiBDcmVhdGUgYSBgaGlkbF92ZWM8dWludDhfdD5gIHRoYXQgaXMgYSBjb3B5IG9mIGFuIG9wYXF1ZSBidWZmZXIuCisgKgorICogXHBhcmFtW2luXSBsIFRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9wYXF1ZSBidWZmZXIuCisgKiBccGFyYW1baW5dIHNpemUgVGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4KKyAqIFxyZXR1cm4gQSBgaGlkbF92ZWM8dWludDhfdD5gIHRoYXQgaXMgYSBjb3B5IG9mIHRoZSBpbnB1dCBidWZmZXIuCisgKi8KKy8vIGNvbnZlcnQ6IHZvaWQqLCBzaXplX3QgLT4gaGlkbF92ZWM8dWludDhfdD4KK2hpZGxfdmVjPHVpbnQ4X3Q+IHRvSGlkbEJ5dGVzKHZvaWQgY29uc3QqIGwsIHNpemVfdCBzaXplKSB7CisgICAgaGlkbF92ZWM8dWludDhfdD4gdDsKKyAgICB0LnJlc2l6ZShzaXplKTsKKyAgICB1aW50OF90IGNvbnN0KiBzcmMgPSBzdGF0aWNfY2FzdDx1aW50OF90IGNvbnN0Kj4obCk7CisgICAgc3RkOjpjb3B5KHNyYywgc3JjICsgc2l6ZSwgdC5kYXRhKCkpOworICAgIHJldHVybiB0OworfQorCisvKioKKyAqIFxicmllZiBXcmFwIGBHcmFwaGljQnVmZmVyYCBpbiBgQW53QnVmZmVyYC4KKyAqCisgKiBccGFyYW1bb3V0XSB0IFRoZSB3cmFwcGVyIG9mIHR5cGUgYEFud0J1ZmZlcmAuCisgKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgR3JhcGhpY0J1ZmZlcmAuCisgKi8KKy8vIHdyYXA6IEdyYXBoaWNCdWZmZXIgLT4gQW53QnVmZmVyCit2b2lkIHdyYXBBcyhBbndCdWZmZXIqIHQsIEdyYXBoaWNCdWZmZXIgY29uc3QmIGwpIHsKKyAgICB0LT5hdHRyLndpZHRoID0gbC5nZXRXaWR0aCgpOworICAgIHQtPmF0dHIuaGVpZ2h0ID0gbC5nZXRIZWlnaHQoKTsKKyAgICB0LT5hdHRyLnN0cmlkZSA9IGwuZ2V0U3RyaWRlKCk7CisgICAgdC0+YXR0ci5mb3JtYXQgPSBzdGF0aWNfY2FzdDxQaXhlbEZvcm1hdD4obC5nZXRQaXhlbEZvcm1hdCgpKTsKKyAgICB0LT5hdHRyLmxheWVyQ291bnQgPSBsLmdldExheWVyQ291bnQoKTsKKyAgICB0LT5hdHRyLnVzYWdlID0gbC5nZXRVc2FnZSgpOworICAgIHQtPmF0dHIuaWQgPSBsLmdldElkKCk7CisgICAgdC0+YXR0ci5nZW5lcmF0aW9uTnVtYmVyID0gbC5nZXRHZW5lcmF0aW9uTnVtYmVyKCk7CisgICAgdC0+bmF0aXZlSGFuZGxlID0gaGlkbF9oYW5kbGUobC5oYW5kbGUpOworfQorCisvKioKKyAqIFxicmllZiBDb252ZXJ0IGBBbndCdWZmZXJgIHRvIGBHcmFwaGljQnVmZmVyYC4KKyAqCisgKiBccGFyYW1bb3V0XSBsIFRoZSBkZXN0aW5hdGlvbiBgR3JhcGhpY0J1ZmZlcmAuCisgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgQW53QnVmZmVyYC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZHVwbGljYXRlIGFsbCBmaWxlIGRlc2NyaXB0b3JzIGluIFxwIHQuCisgKi8KKy8vIGNvbnZlcnQ6IEFud0J1ZmZlciAtPiBHcmFwaGljQnVmZmVyCisvLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvdWkvR3JhcGhpY0J1ZmZlci5jcHA6IEdyYXBoaWNCdWZmZXI6OmZsYXR0ZW4KK2Jvb2wgY29udmVydFRvKEdyYXBoaWNCdWZmZXIqIGwsIEFud0J1ZmZlciBjb25zdCYgdCkgeworICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gdC5uYXRpdmVIYW5kbGUgPT0gbnVsbHB0ciA/CisgICAgICAgICAgICBudWxscHRyIDogbmF0aXZlX2hhbmRsZV9jbG9uZSh0Lm5hdGl2ZUhhbmRsZSk7CisKKyAgICBzaXplX3QgY29uc3QgbnVtSW50cyA9IDEyICsgKGhhbmRsZSA/IGhhbmRsZS0+bnVtSW50cyA6IDApOworICAgIGludDMyX3QqIGludHMgPSBuZXcgaW50MzJfdFtudW1JbnRzXTsKKworICAgIHNpemVfdCBudW1GZHMgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGhhbmRsZSA/IGhhbmRsZS0+bnVtRmRzIDogMCk7CisgICAgaW50KiBmZHMgPSBuZXcgaW50W251bUZkc107CisKKyAgICBpbnRzWzBdID0gJ0dCRlInOworICAgIGludHNbMV0gPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmF0dHIud2lkdGgpOworICAgIGludHNbMl0gPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmF0dHIuaGVpZ2h0KTsKKyAgICBpbnRzWzNdID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4odC5hdHRyLnN0cmlkZSk7CisgICAgaW50c1s0XSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHQuYXR0ci5mb3JtYXQpOworICAgIGludHNbNV0gPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmF0dHIubGF5ZXJDb3VudCk7CisgICAgaW50c1s2XSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHQuYXR0ci51c2FnZSk7CisgICAgaW50c1s3XSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHQuYXR0ci5pZCA+PiAzMik7CisgICAgaW50c1s4XSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHQuYXR0ci5pZCAmIDB4RkZGRkZGRkYpOworICAgIGludHNbOV0gPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmF0dHIuZ2VuZXJhdGlvbk51bWJlcik7CisgICAgaW50c1sxMF0gPSAwOworICAgIGludHNbMTFdID0gMDsKKyAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgIGludHNbMTBdID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFuZGxlLT5udW1GZHMpOworICAgICAgICBpbnRzWzExXSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbmRsZS0+bnVtSW50cyk7CisgICAgICAgIGludCogaW50c1N0YXJ0ID0gaGFuZGxlLT5kYXRhICsgaGFuZGxlLT5udW1GZHM7CisgICAgICAgIHN0ZDo6Y29weShoYW5kbGUtPmRhdGEsIGludHNTdGFydCwgZmRzKTsKKyAgICAgICAgc3RkOjpjb3B5KGludHNTdGFydCwgaW50c1N0YXJ0ICsgaGFuZGxlLT5udW1JbnRzLCAmaW50c1sxMl0pOworICAgIH0KKworICAgIHZvaWQgY29uc3QqIGNvbnN0QnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCBjb25zdCo+KGludHMpOworICAgIHNpemVfdCBzaXplID0gbnVtSW50cyAqIHNpemVvZihpbnQzMl90KTsKKyAgICBpbnQgY29uc3QqIGNvbnN0RmRzID0gc3RhdGljX2Nhc3Q8aW50IGNvbnN0Kj4oZmRzKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBsLT51bmZsYXR0ZW4oY29uc3RCdWZmZXIsIHNpemUsIGNvbnN0RmRzLCBudW1GZHMpOworCisgICAgZGVsZXRlIFtdIGZkczsKKyAgICBkZWxldGUgW10gaW50czsKKyAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOworICAgIHJldHVybiBzdGF0dXMgPT0gTk9fRVJST1I7Cit9CisKKy8qKgorICogQ29udmVyc2lvbiBmdW5jdGlvbnMgZm9yIHR5cGVzIG91dHNpZGUgbWVkaWEKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogU29tZSBvYmplY3RzIGluIGxpYnVpIGFuZCBsaWJndWkgdGhhdCB3ZXJlIG1hZGUgdG8gZ28gdGhyb3VnaCBiaW5kZXIgY2FsbHMgZG8KKyAqIG5vdCBleHBvc2Ugd2F5cyB0byByZWFkIG9yIHdyaXRlIHRoZWlyIGZpZWxkcyB0byB0aGUgcHVibGljLiBUbyBwYXNzIGFuCisgKiBvYmplY3Qgb2YgdGhpcyBraW5kIHRocm91Z2ggdGhlIEhJREwgYm91bmRhcnksIHRyYW5zbGF0aW9uIGZ1bmN0aW9ucyBuZWVkIHRvCisgKiB3b3JrIGFyb3VuZCB0aGUgYWNjZXNzIHJlc3RyaWN0aW9uIGJ5IHVzaW5nIHRoZSBwdWJsaWNseSBhdmFpbGFibGUKKyAqIGBmbGF0dGVuKClgIGFuZCBgdW5mbGF0dGVuKClgIGZ1bmN0aW9ucy4KKyAqCisgKiBBbGwgYGZsYXR0ZW4oKWAgYW5kIGB1bmZsYXR0ZW4oKWAgb3ZlcmxvYWRzIGZvbGxvdyB0aGUgc2FtZSBjb252ZW50aW9uIGFzCisgKiBmb2xsb3dzOgorICoKKyAqICAgICBzdGF0dXNfdCBmbGF0dGVuKE9iamVjdFR5cGUgY29uc3QmIG9iamVjdCwKKyAqICAgICAgICAgICAgICAgICAgICAgIFtPdGhlclR5cGUgY29uc3QmIG90aGVyLCAuLi5dCisgKiAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUsCisgKiAgICAgICAgICAgICAgICAgICAgICBpbnQqJiBmZHMsIHNpemVfdCYgbnVtRmRzKQorICoKKyAqICAgICBzdGF0dXNfdCB1bmZsYXR0ZW4oT2JqZWN0VHlwZSogb2JqZWN0LAorICogICAgICAgICAgICAgICAgICAgICAgICBbT3RoZXJUeXBlKiBvdGhlciwgLi4uLF0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLAorICogICAgICAgICAgICAgICAgICAgICAgICBpbnQqJiBmZHMsIHNpemVfdCYgbnVtRmRzKQorICoKKyAqIFRoZSBudW1iZXIgb2YgYG90aGVyYCBwYXJhbWV0ZXJzIHZhcmllcyBkZXBlbmRpbmcgb24gdGhlIGBPYmplY3RUeXBlYC4gRm9yCisgKiBleGFtcGxlLCBpbiB0aGUgcHJvY2VzcyBvZiB1bmZsYXR0ZW5pbmcgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMKKyAqIGBoaWRsX2hhbmRsZWAsIGBvdGhlcmAgaXMgbmVlZGVkIHRvIGhvbGQgYG5hdGl2ZV9oYW5kbGVfdGAgb2JqZWN0cyB0aGF0IHdpbGwKKyAqIGJlIGNyZWF0ZWQuCisgKgorICogVGhlIGxhc3QgZm91ciBwYXJhbWV0ZXJzIGFsd2F5cyB3b3JrIHRoZSBzYW1lIHdheSBpbiBhbGwgb3ZlcmxvYWRzIG9mCisgKiBgZmxhdHRlbigpYCBhbmQgYHVuZmxhdHRlbigpYDoKKyAqIC0gRm9yIGBmbGF0dGVuKClgLCBgYnVmZmVyYCBpcyB0aGUgcG9pbnRlciB0byB0aGUgbm9uLWZkIGJ1ZmZlciB0byBiZSBmaWxsZWQsCisgKiAgIGBzaXplYCBpcyB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSBub24tZmQgYnVmZmVyIHBvaW50ZWQgdG8gYnkgYGJ1ZmZlcmAsCisgKiAgIGBmZHNgIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBmZCBidWZmZXIgdG8gYmUgZmlsbGVkLCBhbmQgYG51bUZkc2AgaXMgdGhlCisgKiAgIHNpemUgKGluIGludHMpIG9mIHRoZSBmZCBidWZmZXIgcG9pbnRlZCB0byBieSBgZmRzYC4KKyAqIC0gRm9yIGB1bmZsYXR0ZW4oKWAsIGBidWZmZXJgIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBub24tZmQgYnVmZmVyIHRvIGJlIHJlYWQKKyAqICAgZnJvbSwgYHNpemVgIGlzIHRoZSBzaXplIChpbiBieXRlcykgb2YgdGhlIG5vbi1mZCBidWZmZXIgcG9pbnRlZCB0byBieQorICogICBgYnVmZmVyYCwgYGZkc2AgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIGZkIGJ1ZmZlciB0byBiZSByZWFkIGZyb20sIGFuZAorICogICBgbnVtRmRzYCBpcyB0aGUgc2l6ZSAoaW4gaW50cykgb2YgdGhlIGZkIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IGBmZHNgLgorICogLSBBZnRlciBhIHN1Y2Nlc3NmdWwgY2FsbCB0byBgZmxhdHRlbigpYCBvciBgdW5mbGF0dGVuKClgLCBgYnVmZmVyYCBhbmQgYGZkc2AKKyAqICAgd2lsbCBiZSBhZHZhbmNlZCwgd2hpbGUgYHNpemVgIGFuZCBgbnVtRmRzYCB3aWxsIGJlIGRlY3JlYXNlZCB0byByZWZsZWN0CisgKiAgIGhvdyBtdWNoIHN0b3JhZ2UvZGF0YSBvZiB0aGUgdHdvIGJ1ZmZlcnMgKGZkIGFuZCBub24tZmQpIGhhdmUgYmVlbiB1c2VkLgorICogLSBBZnRlciBhbiB1bnN1Y2Nlc3NmdWwgY2FsbCwgdGhlIHZhbHVlcyBvZiBgYnVmZmVyYCwgYHNpemVgLCBgZmRzYCBhbmQKKyAqICAgYG51bUZkc2AgYXJlIGludmFsaWQuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBvZiBhIHN1Y2Nlc3NmdWwgYGZsYXR0ZW4oKWAgb3IgYHVuZmxhdHRlbigpYCBjYWxsIHdpbGwgYmUKKyAqIGBPS2AgKGFsc28gYWxpYXNlZCBhcyBgTk9fRVJST1JgKS4gQW55IG90aGVyIHZhbHVlcyBpbmRpY2F0ZSBhIGZhaWx1cmUuCisgKgorICogRm9yIGVhY2ggb2JqZWN0IHR5cGUgdGhhdCBzdXBwb3J0cyBmbGF0dGVuaW5nLCB0aGVyZSB3aWxsIGJlIHR3byBhY2NvbXBhbnlpbmcKKyAqIGZ1bmN0aW9uczogYGdldEZsYXR0ZW5lZFNpemUoKWAgYW5kIGBnZXRGZENvdW50KClgLiBgZ2V0RmxhdHRlbmVkU2l6ZSgpYCB3aWxsCisgKiByZXR1cm4gdGhlIHNpemUgb2YgdGhlIG5vbi1mZCBidWZmZXIgdGhhdCB0aGUgb2JqZWN0IHdpbGwgbmVlZCBmb3IKKyAqIGZsYXR0ZW5pbmcuIGBnZXRGZENvdW50KClgIHdpbGwgcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBmZCBidWZmZXIgdGhhdCB0aGUKKyAqIG9iamVjdCB3aWxsIG5lZWQgZm9yIGZsYXR0ZW5pbmcuCisgKgorICogVGhlIHNldCBvZiB0aGVzZSBmb3VyIGZ1bmN0aW9ucywgYGdldEZsYXR0ZW5lZFNpemUoKWAsIGBnZXRGZENvdW50KClgLAorICogYGZsYXR0ZW4oKWAgYW5kIGB1bmZsYXR0ZW4oKWAsIGFyZSBzaW1pbGFyIHRvIGZ1bmN0aW9ucyBvZiB0aGUgc2FtZSBuYW1lIGluCisgKiB0aGUgYWJzdHJhY3QgY2xhc3MgYEZsYXR0ZW5hYmxlYC4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGF0IGZ1bmN0aW9ucyBpbgorICogdGhpcyBmaWxlIGFyZSBub3QgbWVtYmVyIGZ1bmN0aW9ucyBvZiB0aGUgb2JqZWN0IHR5cGUuIEZvciBleGFtcGxlLCB3ZSB3cml0ZQorICoKKyAqICAgICBmbGF0dGVuKHgsIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpCisgKgorICogaW5zdGVhZCBvZgorICoKKyAqICAgICB4LmZsYXR0ZW4oYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcykKKyAqCisgKiBiZWNhdXNlIHdlIGNhbm5vdCBtb2RpZnkgdGhlIHR5cGUgb2YgYHhgLgorICoKKyAqIFRoZXJlIGlzIG9uZSBleGNlcHRpb24gdG8gdGhlIG5hbWluZyBjb252ZW50aW9uOiBgaGlkbF9oYW5kbGVgIHRoYXQKKyAqIHJlcHJlc2VudHMgYSBmZW5jZS4gVGhlIGZvdXIgZnVuY3Rpb25zIGZvciB0aGlzICJGZW5jZSIgdHlwZSBoYXZlIHRoZSB3b3JkCisgKiAiRmVuY2UiIGF0dGNoZWQgdG8gdGhlaXIgbmFtZXMgYmVjYXVzZSB0aGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzCisgKiBgaGlkbF9oYW5kbGVgLCBkb2VzIG5vdCBjYXJyeSB0aGUgc3BlY2lhbCBtZWFuaW5nIHRoYXQgdGhlIG9iamVjdCBpdHNlbGYgY2FuCisgKiBvbmx5IGNvbnRhaW4gemVybyBvciBvbmUgZmlsZSBkZXNjcmlwdG9yLgorICovCisKKy8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy91aS9GZW5jZS5jcHAKKworLyoqCisgKiBcYnJpZWYgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub24tZmQgYnVmZmVyIHJlcXVpcmVkIHRvIGZsYXR0ZW4gYSBmZW5jZS4KKyAqCisgKiBccGFyYW1baW5dIGZlbmNlIFRoZSBpbnB1dCBmZW5jZSBvZiB0eXBlIGBoaWRsX2hhbmRsZWAuCisgKiBccmV0dXJuIFRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KKyAqCisgKiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgNCwgd2hpY2ggaXMgdGhlIG51bWJlciBvZgorICogYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiB0aGUgZmQKKyAqIHBhcnQgb2YgdGhlIGZsYXQgYnVmZmVyLgorICovCitzaXplX3QgZ2V0RmVuY2VGbGF0dGVuZWRTaXplKGhpZGxfaGFuZGxlIGNvbnN0JiAvKiBmZW5jZSAqLykgeworICAgIHJldHVybiA0OworfTsKKworLyoqCisgKiBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gYSBmZW5jZS4KKyAqCisgKiBccGFyYW1baW5dIGZlbmNlIFRoZSBpbnB1dCBmZW5jZSBvZiB0eXBlIGBoaWRsX2hhbmRsZWAuCisgKiBccmV0dXJuIGAwYCBpZiBccCBmZW5jZSBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yLCBvciBgMWAKKyAqIG90aGVyd2lzZS4KKyAqLworc2l6ZV90IGdldEZlbmNlRmRDb3VudChoaWRsX2hhbmRsZSBjb25zdCYgZmVuY2UpIHsKKyAgICByZXR1cm4gbmF0aXZlX2hhbmRsZV9yZWFkX2ZkKGZlbmNlKSA9PSAtMSA/IDAgOiAxOworfQorCisvKioKKyAqIFxicmllZiBVbmZsYXR0ZW4gYEZlbmNlYCB0byBgaGlkbF9oYW5kbGVgLgorICoKKyAqIFxwYXJhbVtvdXRdIGZlbmNlIFRoZSBkZXN0aW5hdGlvbiBgaGlkbF9oYW5kbGVgLgorICogXHBhcmFtW291dF0gbmggVGhlIHVuZGVybHlpbmcgbmF0aXZlIGhhbmRsZS4KKyAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCisgKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KKyAqCisgKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGBOT19FUlJPUmAsIFxwIG5oIHdpbGwgcG9pbnQgdG8gYSBuZXdseSBjcmVhdGVkCisgKiBuYXRpdmUgaGFuZGxlLCB3aGljaCBuZWVkcyB0byBiZSBkZWxldGVkIHdpdGggYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgCisgKiBhZnRlcndhcmRzLgorICovCitzdGF0dXNfdCB1bmZsYXR0ZW5GZW5jZShoaWRsX2hhbmRsZSogZmVuY2UsIG5hdGl2ZV9oYW5kbGVfdCoqIG5oLAorICAgICAgICB2b2lkIGNvbnN0KiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludCBjb25zdComIGZkcywgc2l6ZV90JiBudW1GZHMpIHsKKyAgICBpZiAoc2l6ZSA8IDQpIHsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBudW1GZHNJbkhhbmRsZTsKKyAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgbnVtRmRzSW5IYW5kbGUpOworCisgICAgaWYgKG51bUZkc0luSGFuZGxlID4gMSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChudW1GZHMgPCBudW1GZHNJbkhhbmRsZSkgeworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIGlmIChudW1GZHNJbkhhbmRsZSkgeworICAgICAgICAqbmggPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZV9mcm9tX2ZkKCpmZHMpOworICAgICAgICBpZiAoKm5oID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgKmZlbmNlID0gKm5oOworICAgICAgICArK2ZkczsKKyAgICAgICAgLS1udW1GZHM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKm5oID0gbnVsbHB0cjsKKyAgICAgICAgKmZlbmNlID0gaGlkbF9oYW5kbGUoKTsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qKgorICogXGJyaWVmIEZsYXR0ZW4gYGhpZGxfaGFuZGxlYCBhcyBgRmVuY2VgLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBoaWRsX2hhbmRsZWAuCisgKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXR1c190IGZsYXR0ZW5GZW5jZShoaWRsX2hhbmRsZSBjb25zdCYgZmVuY2UsCisgICAgICAgIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50KiYgZmRzLCBzaXplX3QmIG51bUZkcykgeworICAgIGlmIChzaXplIDwgZ2V0RmVuY2VGbGF0dGVuZWRTaXplKGZlbmNlKSB8fAorICAgICAgICAgICAgbnVtRmRzIDwgZ2V0RmVuY2VGZENvdW50KGZlbmNlKSkgeworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKyAgICAvLyBDYXN0IHRvIHVpbnQzMl90IHNpbmNlIHRoZSBzaXplIG9mIGEgc2l6ZV90IGNhbiB2YXJ5IGJldHdlZW4gMzItIGFuZAorICAgIC8vIDY0LWJpdCBwcm9jZXNzZXMKKyAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZ2V0RmVuY2VGZENvdW50KGZlbmNlKSkpOworICAgIGludCBmZCA9IG5hdGl2ZV9oYW5kbGVfcmVhZF9mZChmZW5jZSk7CisgICAgaWYgKGZkICE9IC0xKSB7CisgICAgICAgICpmZHMgPSBmZDsKKyAgICAgICAgKytmZHM7CisgICAgICAgIC0tbnVtRmRzOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qKgorICogXGJyaWVmIFdyYXAgYEZlbmNlYCBpbiBgaGlkbF9oYW5kbGVgLgorICoKKyAqIFxwYXJhbVtvdXRdIHQgVGhlIHdyYXBwZXIgb2YgdHlwZSBgaGlkbF9oYW5kbGVgLgorICogXHBhcmFtW291dF0gbmggVGhlIG5hdGl2ZSBoYW5kbGUgcG9pbnRlZCB0byBieSBccCB0LgorICogXHBhcmFtW2luXSBsIFRoZSBzb3VyY2UgYEZlbmNlYC4KKyAqCisgKiBPbiBzdWNjZXNzLCBccCBuaCB3aWxsIGhvbGQgYSBuZXdseSBjcmVhdGVkIG5hdGl2ZSBoYW5kbGUsIHdoaWNoIG11c3QgYmUKKyAqIGRlbGV0ZWQgbWFudWFsbHkgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAgYWZ0ZXJ3YXJkcy4KKyAqLworLy8gd3JhcDogRmVuY2UgLT4gaGlkbF9oYW5kbGUKK2Jvb2wgd3JhcEFzKGhpZGxfaGFuZGxlKiB0LCBuYXRpdmVfaGFuZGxlX3QqKiBuaCwgRmVuY2UgY29uc3QmIGwpIHsKKyAgICBzaXplX3QgY29uc3QgYmFzZVNpemUgPSBsLmdldEZsYXR0ZW5lZFNpemUoKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBiYXNlQnVmZmVyKAorICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3RbYmFzZVNpemVdKTsKKyAgICBpZiAoIWJhc2VCdWZmZXIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNpemVfdCBjb25zdCBiYXNlTnVtRmRzID0gbC5nZXRGZENvdW50KCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPGludFtdPiBiYXNlRmRzKAorICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIGludFtiYXNlTnVtRmRzXSk7CisgICAgaWYgKCFiYXNlRmRzKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkKiBidWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkKj4oYmFzZUJ1ZmZlci5nZXQoKSk7CisgICAgc2l6ZV90IHNpemUgPSBiYXNlU2l6ZTsKKyAgICBpbnQqIGZkcyA9IHN0YXRpY19jYXN0PGludCo+KGJhc2VGZHMuZ2V0KCkpOworICAgIHNpemVfdCBudW1GZHMgPSBiYXNlTnVtRmRzOworICAgIGlmIChsLmZsYXR0ZW4oYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZvaWQgY29uc3QqIGNvbnN0QnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCBjb25zdCo+KGJhc2VCdWZmZXIuZ2V0KCkpOworICAgIHNpemUgPSBiYXNlU2l6ZTsKKyAgICBpbnQgY29uc3QqIGNvbnN0RmRzID0gc3RhdGljX2Nhc3Q8aW50IGNvbnN0Kj4oYmFzZUZkcy5nZXQoKSk7CisgICAgbnVtRmRzID0gYmFzZU51bUZkczsKKyAgICBpZiAodW5mbGF0dGVuRmVuY2UodCwgbmgsIGNvbnN0QnVmZmVyLCBzaXplLCBjb25zdEZkcywgbnVtRmRzKQorICAgICAgICAgICAgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIFxicmllZiBDb252ZXJ0IGBoaWRsX2hhbmRsZWAgdG8gYEZlbmNlYC4KKyAqCisgKiBccGFyYW1bb3V0XSBsIFRoZSBkZXN0aW5hdGlvbiBgRmVuY2VgLiBgbGAgbXVzdCBub3QgaGF2ZSBiZWVuIHVzZWQKKyAqIChgbC0+aXNWYWxpZCgpYCBtdXN0IHJldHVybiBgZmFsc2VgKSBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCisgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgaGlkbF9oYW5kbGVgLgorICoKKyAqIElmIFxwIHQgY29udGFpbnMgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IsIGl0IHdpbGwgYmUgZHVwbGljYXRlZC4KKyAqLworLy8gY29udmVydDogaGlkbF9oYW5kbGUgLT4gRmVuY2UKK2Jvb2wgY29udmVydFRvKEZlbmNlKiBsLCBoaWRsX2hhbmRsZSBjb25zdCYgdCkgeworICAgIGludCBmZCA9IG5hdGl2ZV9oYW5kbGVfcmVhZF9mZCh0KTsKKyAgICBpZiAoZmQgIT0gLTEpIHsKKyAgICAgICAgZmQgPSBkdXAoZmQpOworICAgICAgICBpZiAoZmQgPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBuYXRpdmVfaGFuZGxlX3QqIG5oID0gbmF0aXZlX2hhbmRsZV9jcmVhdGVfZnJvbV9mZChmZCk7CisgICAgaWYgKG5oID09IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKGZkICE9IC0xKSB7CisgICAgICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNpemVfdCBjb25zdCBiYXNlU2l6ZSA9IGdldEZlbmNlRmxhdHRlbmVkU2l6ZSh0KTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBiYXNlQnVmZmVyKAorICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3RbYmFzZVNpemVdKTsKKyAgICBpZiAoIWJhc2VCdWZmZXIpIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc2l6ZV90IGNvbnN0IGJhc2VOdW1GZHMgPSBnZXRGZW5jZUZkQ291bnQodCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPGludFtdPiBiYXNlRmRzKAorICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIGludFtiYXNlTnVtRmRzXSk7CisgICAgaWYgKCFiYXNlRmRzKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZvaWQqIGJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQqPihiYXNlQnVmZmVyLmdldCgpKTsKKyAgICBzaXplX3Qgc2l6ZSA9IGJhc2VTaXplOworICAgIGludCogZmRzID0gc3RhdGljX2Nhc3Q8aW50Kj4oYmFzZUZkcy5nZXQoKSk7CisgICAgc2l6ZV90IG51bUZkcyA9IGJhc2VOdW1GZHM7CisgICAgaWYgKGZsYXR0ZW5GZW5jZShoaWRsX2hhbmRsZShuaCksIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7CisKKyAgICB2b2lkIGNvbnN0KiBjb25zdEJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQgY29uc3QqPihiYXNlQnVmZmVyLmdldCgpKTsKKyAgICBzaXplID0gYmFzZVNpemU7CisgICAgaW50IGNvbnN0KiBjb25zdEZkcyA9IHN0YXRpY19jYXN0PGludCBjb25zdCo+KGJhc2VGZHMuZ2V0KCkpOworICAgIG51bUZkcyA9IGJhc2VOdW1GZHM7CisgICAgaWYgKGwtPnVuZmxhdHRlbihjb25zdEJ1ZmZlciwgc2l6ZSwgY29uc3RGZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvdWkvRmVuY2VUaW1lLmNwcDogRmVuY2VUaW1lOjpTbmFwc2hvdAorCisvKioKKyAqIFxicmllZiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIG5vbi1mZCBidWZmZXIgcmVxdWlyZWQgdG8gZmxhdHRlbgorICogYEZlbmNlVGltZVNuYXBzaG90YC4KKyAqCisgKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBGZW5jZVRpbWVTbmFwc2hvdGAuCisgKiBccmV0dXJuIFRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KKyAqLworc2l6ZV90IGdldEZsYXR0ZW5lZFNpemUoCisgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90IGNvbnN0JiB0KSB7CisgICAgY29uc3RleHByIHNpemVfdCBtaW4gPSBzaXplb2YodC5zdGF0ZSk7CisgICAgc3dpdGNoICh0LnN0YXRlKSB7CisgICAgICAgIGNhc2UgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3Q6OlN0YXRlOjpFTVBUWToKKyAgICAgICAgICAgIHJldHVybiBtaW47CisgICAgICAgIGNhc2UgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3Q6OlN0YXRlOjpGRU5DRToKKyAgICAgICAgICAgIHJldHVybiBtaW4gKyBnZXRGZW5jZUZsYXR0ZW5lZFNpemUodC5mZW5jZSk7CisgICAgICAgIGNhc2UgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3Q6OlN0YXRlOjpTSUdOQUxfVElNRToKKyAgICAgICAgICAgIHJldHVybiBtaW4gKyBzaXplb2YoCisgICAgICAgICAgICAgICAgICAgIDo6YW5kcm9pZDo6RmVuY2VUaW1lOjpTbmFwc2hvdDo6c2lnbmFsVGltZSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKioKKyAqIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbgorICogYEZlbmNlVGltZVNuYXBzaG90YC4KKyAqCisgKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBGZW5jZVRpbWVTbmFwc2hvdGAuCisgKiBccmV0dXJuIFRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gXHAgc25hcHNob3QuCisgKi8KK3NpemVfdCBnZXRGZENvdW50KAorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdCBjb25zdCYgdCkgeworICAgIHJldHVybiB0LnN0YXRlID09CisgICAgICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdDo6U3RhdGU6OkZFTkNFID8KKyAgICAgICAgICAgIGdldEZlbmNlRmRDb3VudCh0LmZlbmNlKSA6IDA7Cit9CisKKy8qKgorICogXGJyaWVmIEZsYXR0ZW4gYEZlbmNlVGltZVNuYXBzaG90YC4KKyAqCisgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgRmVuY2VUaW1lU25hcHNob3RgLgorICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KKyAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgdGhlIGZpbGUgZGVzY3JpcHRvciBpbiBgdC5mZW5jZWAgaWYgYHQuc3RhdGUgPT0KKyAqIEZFTkNFYC4KKyAqLworc3RhdHVzX3QgZmxhdHRlbihIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdCBjb25zdCYgdCwKKyAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQqJiBmZHMsIHNpemVfdCYgbnVtRmRzKSB7CisgICAgaWYgKHNpemUgPCBnZXRGbGF0dGVuZWRTaXplKHQpKSB7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgc3dpdGNoICh0LnN0YXRlKSB7CisgICAgICAgIGNhc2UgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3Q6OlN0YXRlOjpFTVBUWToKKyAgICAgICAgICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgOjphbmRyb2lkOjpGZW5jZVRpbWU6OlNuYXBzaG90OjpTdGF0ZTo6RU1QVFkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICBjYXNlIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90OjpTdGF0ZTo6RkVOQ0U6CisgICAgICAgICAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsCisgICAgICAgICAgICAgICAgICAgIDo6YW5kcm9pZDo6RmVuY2VUaW1lOjpTbmFwc2hvdDo6U3RhdGU6OkZFTkNFKTsKKyAgICAgICAgICAgIHJldHVybiBmbGF0dGVuRmVuY2UodC5mZW5jZSwgYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcyk7CisgICAgICAgIGNhc2UgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3Q6OlN0YXRlOjpTSUdOQUxfVElNRToKKyAgICAgICAgICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgOjphbmRyb2lkOjpGZW5jZVRpbWU6OlNuYXBzaG90OjpTdGF0ZTo6U0lHTkFMX1RJTUUpOworICAgICAgICAgICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0LnNpZ25hbFRpbWVOcyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyoqCisgKiBcYnJpZWYgVW5mbGF0dGVuIGBGZW5jZVRpbWVTbmFwc2hvdGAuCisgKgorICogXHBhcmFtW291dF0gdCBUaGUgZGVzdGluYXRpb24gYEZlbmNlVGltZVNuYXBzaG90YC4KKyAqIFxwYXJhbVtvdXRdIG5oIFRoZSB1bmRlcmx5aW5nIG5hdGl2ZSBoYW5kbGUuCisgKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCisgKgorICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBgTk9fRVJST1JgIGFuZCB0aGUgY29uc3RydWN0ZWQgc25hcHNob3QgY29udGFpbnMgYQorICogZmlsZSBkZXNjcmlwdG9yLCBccCBuaCB3aWxsIGJlIGNyZWF0ZWQgdG8gaG9sZCB0aGF0IGZpbGUgZGVzY3JpcHRvci4gSW4gdGhpcworICogY2FzZSwgXHAgbmggbmVlZHMgdG8gYmUgZGVsZXRlZCB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYCBhZnRlcndhcmRzLgorICovCitzdGF0dXNfdCB1bmZsYXR0ZW4oCisgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90KiB0LCBuYXRpdmVfaGFuZGxlX3QqKiBuaCwKKyAgICAgICAgdm9pZCBjb25zdComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQgY29uc3QqJiBmZHMsIHNpemVfdCYgbnVtRmRzKSB7CisgICAgaWYgKHNpemUgPCBzaXplb2YodC0+c3RhdGUpKSB7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgKm5oID0gbnVsbHB0cjsKKyAgICA6OmFuZHJvaWQ6OkZlbmNlVGltZTo6U25hcHNob3Q6OlN0YXRlIHN0YXRlOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCBzdGF0ZSk7CisgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICBjYXNlIDo6YW5kcm9pZDo6RmVuY2VUaW1lOjpTbmFwc2hvdDo6U3RhdGU6OkVNUFRZOgorICAgICAgICAgICAgdC0+c3RhdGUgPSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdDo6U3RhdGU6OkVNUFRZOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICBjYXNlIDo6YW5kcm9pZDo6RmVuY2VUaW1lOjpTbmFwc2hvdDo6U3RhdGU6OkZFTkNFOgorICAgICAgICAgICAgdC0+c3RhdGUgPSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdDo6U3RhdGU6OkZFTkNFOworICAgICAgICAgICAgcmV0dXJuIHVuZmxhdHRlbkZlbmNlKCZ0LT5mZW5jZSwgbmgsIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpOworICAgICAgICBjYXNlIDo6YW5kcm9pZDo6RmVuY2VUaW1lOjpTbmFwc2hvdDo6U3RhdGU6OlNJR05BTF9USU1FOgorICAgICAgICAgICAgdC0+c3RhdGUgPSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdDo6U3RhdGU6OlNJR05BTF9USU1FOworICAgICAgICAgICAgaWYgKHNpemUgPCBzaXplb2YodC0+c2lnbmFsVGltZU5zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdC0+c2lnbmFsVGltZU5zKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvZ3VpL0ZyYW1lVGltZXN0YW1wcy5jcHA6IEZyYW1lRXZlbnRzRGVsdGEKKworLyoqCisgKiBcYnJpZWYgUmV0dXJuIGEgbG93ZXIgYm91bmQgb24gdGhlIHNpemUgb2YgdGhlIG5vbi1mZCBidWZmZXIgcmVxdWlyZWQgdG8KKyAqIGZsYXR0ZW4gYEZyYW1lRXZlbnRzRGVsdGFgLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEZyYW1lRXZlbnRzRGVsdGFgLgorICogXHJldHVybiBBIGxvd2VyIGJvdW5kIG9uIHRoZSBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KKyAqLworY29uc3RleHByIHNpemVfdCBtaW5GbGF0dGVuZWRTaXplKAorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50c0RlbHRhIGNvbnN0JiAvKiB0ICovKSB7CisgICAgcmV0dXJuIHNpemVvZih1aW50NjRfdCkgKyAvLyBtRnJhbWVOdW1iZXIKKyAgICAgICAgICAgIHNpemVvZih1aW50OF90KSArIC8vIG1JbmRleAorICAgICAgICAgICAgc2l6ZW9mKHVpbnQ4X3QpICsgLy8gbUFkZFBvc3RDb21wb3NpdGVDYWxsZWQKKyAgICAgICAgICAgIHNpemVvZih1aW50OF90KSArIC8vIG1BZGRSZXRpcmVDYWxsZWQKKyAgICAgICAgICAgIHNpemVvZih1aW50OF90KSArIC8vIG1BZGRSZWxlYXNlQ2FsbGVkCisgICAgICAgICAgICBzaXplb2YobnNlY3NfdCkgKyAvLyBtUG9zdGVkVGltZQorICAgICAgICAgICAgc2l6ZW9mKG5zZWNzX3QpICsgLy8gbVJlcXVlc3RlZFByZXNlbnRUaW1lCisgICAgICAgICAgICBzaXplb2YobnNlY3NfdCkgKyAvLyBtTGF0Y2hUaW1lCisgICAgICAgICAgICBzaXplb2YobnNlY3NfdCkgKyAvLyBtRmlyc3RSZWZyZXNoU3RhcnRUaW1lCisgICAgICAgICAgICBzaXplb2YobnNlY3NfdCk7IC8vIG1MYXN0UmVmcmVzaFN0YXJ0VGltZQorfQorCisvKioKKyAqIFxicmllZiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIG5vbi1mZCBidWZmZXIgcmVxdWlyZWQgdG8gZmxhdHRlbgorICogYEZyYW1lRXZlbnRzRGVsdGFgLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEZyYW1lRXZlbnRzRGVsdGFgLgorICogXHJldHVybiBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCisgKi8KK3NpemVfdCBnZXRGbGF0dGVuZWRTaXplKAorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50c0RlbHRhIGNvbnN0JiB0KSB7CisgICAgcmV0dXJuIG1pbkZsYXR0ZW5lZFNpemUodCkgKworICAgICAgICAgICAgZ2V0RmxhdHRlbmVkU2l6ZSh0LmdwdUNvbXBvc2l0aW9uRG9uZUZlbmNlKSArCisgICAgICAgICAgICBnZXRGbGF0dGVuZWRTaXplKHQuZGlzcGxheVByZXNlbnRGZW5jZSkgKworICAgICAgICAgICAgZ2V0RmxhdHRlbmVkU2l6ZSh0LmRpc3BsYXlSZXRpcmVGZW5jZSkgKworICAgICAgICAgICAgZ2V0RmxhdHRlbmVkU2l6ZSh0LnJlbGVhc2VGZW5jZSk7Cit9OworCisvKioKKyAqIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbgorICogYEZyYW1lRXZlbnRzRGVsdGFgLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEZyYW1lRXZlbnRzRGVsdGFgLgorICogXHJldHVybiBUaGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCisgKi8KK3NpemVfdCBnZXRGZENvdW50KAorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50c0RlbHRhIGNvbnN0JiB0KSB7CisgICAgcmV0dXJuIGdldEZkQ291bnQodC5ncHVDb21wb3NpdGlvbkRvbmVGZW5jZSkgKworICAgICAgICAgICAgZ2V0RmRDb3VudCh0LmRpc3BsYXlQcmVzZW50RmVuY2UpICsKKyAgICAgICAgICAgIGdldEZkQ291bnQodC5kaXNwbGF5UmV0aXJlRmVuY2UpICsKKyAgICAgICAgICAgIGdldEZkQ291bnQodC5yZWxlYXNlRmVuY2UpOworfTsKKworLyoqCisgKiBcYnJpZWYgVW5mbGF0dGVuIGBGcmFtZUV2ZW50c0RlbHRhYC4KKyAqCisgKiBccGFyYW1bb3V0XSB0IFRoZSBkZXN0aW5hdGlvbiBgRnJhbWVFdmVudHNEZWx0YWAuCisgKiBccGFyYW1bb3V0XSBuaCBUaGUgdW5kZXJseWluZyBhcnJheSBvZiBuYXRpdmUgaGFuZGxlcy4KKyAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCisgKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KKyAqCisgKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGBOT19FUlJPUmAsIFxwIG5oIHdpbGwgaGF2ZSBsZW5ndGggNCwgYW5kIGl0IHdpbGwgYmUKKyAqIHBvcHVsYXRlZCB3aXRoIGBudWxscHRyYCBvciBuZXdseSBjcmVhdGVkIGhhbmRsZXMuIEVhY2ggbm9uLW51bGwgc2xvdCBpbiBccAorICogbmggd2lsbCBuZWVkIHRvIGJlIGRlbGV0ZWQgbWFudWFsbHkgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAuCisgKi8KK3N0YXR1c190IHVuZmxhdHRlbihIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50c0RlbHRhKiB0LAorICAgICAgICBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiogbmgsCisgICAgICAgIHZvaWQgY29uc3QqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50IGNvbnN0KiYgZmRzLCBzaXplX3QmIG51bUZkcykgeworICAgIGlmIChzaXplIDwgbWluRmxhdHRlbmVkU2l6ZSgqdCkpIHsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHQtPmZyYW1lTnVtYmVyKTsKKworICAgIC8vIFRoZXNlIHdlcmUgd3JpdHRlbiBhcyB1aW50OF90IGZvciBhbGlnbm1lbnQuCisgICAgdWludDhfdCB0ZW1wID0gMDsKKyAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdGVtcCk7CisgICAgc2l6ZV90IGluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90Pih0ZW1wKTsKKyAgICBpZiAoaW5kZXggPj0gOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeTo6TUFYX0ZSQU1FX0hJU1RPUlkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgdC0+aW5kZXggPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaW5kZXgpOworCisgICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHRlbXApOworICAgIHQtPmFkZFBvc3RDb21wb3NpdGVDYWxsZWQgPSBzdGF0aWNfY2FzdDxib29sPih0ZW1wKTsKKyAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdGVtcCk7CisgICAgdC0+YWRkUmV0aXJlQ2FsbGVkID0gc3RhdGljX2Nhc3Q8Ym9vbD4odGVtcCk7CisgICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHRlbXApOworICAgIHQtPmFkZFJlbGVhc2VDYWxsZWQgPSBzdGF0aWNfY2FzdDxib29sPih0ZW1wKTsKKworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5wb3N0ZWRUaW1lTnMpOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5yZXF1ZXN0ZWRQcmVzZW50VGltZU5zKTsKKyAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdC0+bGF0Y2hUaW1lTnMpOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5maXJzdFJlZnJlc2hTdGFydFRpbWVOcyk7CisgICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHQtPmxhc3RSZWZyZXNoU3RhcnRUaW1lTnMpOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5kZXF1ZXVlUmVhZHlUaW1lKTsKKworICAgIC8vIEZlbmNlcworICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90KiB0U25hcHNob3RbNF07CisgICAgdFNuYXBzaG90WzBdID0gJnQtPmdwdUNvbXBvc2l0aW9uRG9uZUZlbmNlOworICAgIHRTbmFwc2hvdFsxXSA9ICZ0LT5kaXNwbGF5UHJlc2VudEZlbmNlOworICAgIHRTbmFwc2hvdFsyXSA9ICZ0LT5kaXNwbGF5UmV0aXJlRmVuY2U7CisgICAgdFNuYXBzaG90WzNdID0gJnQtPnJlbGVhc2VGZW5jZTsKKyAgICBuaC0+cmVzaXplKDQpOworICAgIGZvciAoc2l6ZV90IHNuYXBzaG90SW5kZXggPSAwOyBzbmFwc2hvdEluZGV4IDwgNDsgKytzbmFwc2hvdEluZGV4KSB7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHVuZmxhdHRlbigKKyAgICAgICAgICAgICAgICB0U25hcHNob3Rbc25hcHNob3RJbmRleF0sICYoKCpuaClbc25hcHNob3RJbmRleF0pLAorICAgICAgICAgICAgICAgIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICB3aGlsZSAoc25hcHNob3RJbmRleCA+IDApIHsKKyAgICAgICAgICAgICAgICAtLXNuYXBzaG90SW5kZXg7CisgICAgICAgICAgICAgICAgaWYgKCgqbmgpW3NuYXBzaG90SW5kZXhdICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoKCpuaClbc25hcHNob3RJbmRleF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKioKKyAqIFxicmllZiBGbGF0dGVuIGBGcmFtZUV2ZW50c0RlbHRhYC4KKyAqCisgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgRnJhbWVFdmVudHNEZWx0YWAuCisgKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCB0LgorICovCisvLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvZ3VpL0ZyYW1lVGltZXN0YW1wLmNwcDoKKy8vICAgICAgRnJhbWVFdmVudHNEZWx0YTo6ZmxhdHRlbgorc3RhdHVzX3QgZmxhdHRlbihIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50c0RlbHRhIGNvbnN0JiB0LAorICAgICAgICB2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludComIGZkcywgc2l6ZV90IG51bUZkcykgeworICAgIC8vIENoZWNrIHRoYXQgdC5pbmRleCBpcyB3aXRoaW4gYSB2YWxpZCByYW5nZS4KKyAgICBpZiAodC5pbmRleCA+PSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oRnJhbWVFdmVudEhpc3Rvcnk6Ok1BWF9GUkFNRV9ISVNUT1JZKQorICAgICAgICAgICAgfHwgdC5pbmRleCA+IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDhfdD46Om1heCgpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0LmZyYW1lTnVtYmVyKTsKKworICAgIC8vIFRoZXNlIGFyZSBzdGF0aWNfY2FzdCB0byB1aW50OF90IGZvciBhbGlnbm1lbnQuCisgICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCBzdGF0aWNfY2FzdDx1aW50OF90Pih0LmluZGV4KSk7CisgICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoCisgICAgICAgICAgICBidWZmZXIsIHNpemUsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHQuYWRkUG9zdENvbXBvc2l0ZUNhbGxlZCkpOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKAorICAgICAgICAgICAgYnVmZmVyLCBzaXplLCBzdGF0aWNfY2FzdDx1aW50OF90Pih0LmFkZFJldGlyZUNhbGxlZCkpOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKAorICAgICAgICAgICAgYnVmZmVyLCBzaXplLCBzdGF0aWNfY2FzdDx1aW50OF90Pih0LmFkZFJlbGVhc2VDYWxsZWQpKTsKKworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5wb3N0ZWRUaW1lTnMpOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5yZXF1ZXN0ZWRQcmVzZW50VGltZU5zKTsKKyAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHQubGF0Y2hUaW1lTnMpOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5maXJzdFJlZnJlc2hTdGFydFRpbWVOcyk7CisgICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0Lmxhc3RSZWZyZXNoU3RhcnRUaW1lTnMpOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5kZXF1ZXVlUmVhZHlUaW1lKTsKKworICAgIC8vIEZlbmNlcworICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90IGNvbnN0KiB0U25hcHNob3RbNF07CisgICAgdFNuYXBzaG90WzBdID0gJnQuZ3B1Q29tcG9zaXRpb25Eb25lRmVuY2U7CisgICAgdFNuYXBzaG90WzFdID0gJnQuZGlzcGxheVByZXNlbnRGZW5jZTsKKyAgICB0U25hcHNob3RbMl0gPSAmdC5kaXNwbGF5UmV0aXJlRmVuY2U7CisgICAgdFNuYXBzaG90WzNdID0gJnQucmVsZWFzZUZlbmNlOworICAgIGZvciAoc2l6ZV90IHNuYXBzaG90SW5kZXggPSAwOyBzbmFwc2hvdEluZGV4IDwgNDsgKytzbmFwc2hvdEluZGV4KSB7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGZsYXR0ZW4oCisgICAgICAgICAgICAgICAgKih0U25hcHNob3Rbc25hcHNob3RJbmRleF0pLCBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9ndWkvRnJhbWVUaW1lc3RhbXBzLmNwcDogRnJhbWVFdmVudEhpc3RvcnlEZWx0YQorCisvKioKKyAqIFxicmllZiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIG5vbi1mZCBidWZmZXIgcmVxdWlyZWQgdG8gZmxhdHRlbgorICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgorICogXHJldHVybiBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCisgKi8KK3NpemVfdCBnZXRGbGF0dGVuZWRTaXplKAorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIGNvbnN0JiB0KSB7CisgICAgc2l6ZV90IHNpemUgPSA0ICsgLy8gbURlbHRhcy5zaXplKCkKKyAgICAgICAgICAgIHNpemVvZih0LmNvbXBvc2l0b3JUaW1pbmcpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdC5kZWx0YXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgc2l6ZSArPSBnZXRGbGF0dGVuZWRTaXplKHQuZGVsdGFzW2ldKTsKKyAgICB9CisgICAgcmV0dXJuIHNpemU7Cit9CisKKy8qKgorICogXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluCisgKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCisgKgorICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCisgKiBccmV0dXJuIFRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gXHAgdC4KKyAqLworc2l6ZV90IGdldEZkQ291bnQoCisgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEgY29uc3QmIHQpIHsKKyAgICBzaXplX3QgbnVtRmRzID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHQuZGVsdGFzLnNpemUoKTsgKytpKSB7CisgICAgICAgIG51bUZkcyArPSBnZXRGZENvdW50KHQuZGVsdGFzW2ldKTsKKyAgICB9CisgICAgcmV0dXJuIG51bUZkczsKK30KKworLyoqCisgKiBcYnJpZWYgVW5mbGF0dGVuIGBGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KKyAqCisgKiBccGFyYW1bb3V0XSB0IFRoZSBkZXN0aW5hdGlvbiBgRnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCisgKiBccGFyYW1bb3V0XSBuaCBUaGUgdW5kZXJseWluZyBhcnJheSBvZiBhcnJheXMgb2YgbmF0aXZlIGhhbmRsZXMuCisgKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCisgKgorICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBgTk9fRVJST1JgLCBccCBuaCB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIGBudWxscHRyYCBvcgorICogbmV3bHkgY3JlYXRlZCBoYW5kbGVzLiBUaGUgc2Vjb25kIGRpbWVuc2lvbiBvZiBccCBuaCB3aWxsIGJlIDQuIEVhY2ggbm9uLW51bGwKKyAqIHNsb3QgaW4gXHAgbmggd2lsbCBuZWVkIHRvIGJlIGRlbGV0ZWQgbWFudWFsbHkgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAuCisgKi8KK3N0YXR1c190IHVuZmxhdHRlbigKKyAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSogdCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gPiogbmgsCisgICAgICAgIHZvaWQgY29uc3QqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50IGNvbnN0KiYgZmRzLCBzaXplX3QmIG51bUZkcykgeworICAgIGlmIChzaXplIDwgNCkgeworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5jb21wb3NpdG9yVGltaW5nKTsKKworICAgIHVpbnQzMl90IGRlbHRhQ291bnQgPSAwOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCBkZWx0YUNvdW50KTsKKyAgICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PihkZWx0YUNvdW50KSA+CisgICAgICAgICAgICA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5OjpNQVhfRlJBTUVfSElTVE9SWSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICB0LT5kZWx0YXMucmVzaXplKGRlbHRhQ291bnQpOworICAgIG5oLT5yZXNpemUoZGVsdGFDb3VudCk7CisgICAgZm9yIChzaXplX3QgZGVsdGFJbmRleCA9IDA7IGRlbHRhSW5kZXggPCBkZWx0YUNvdW50OyArK2RlbHRhSW5kZXgpIHsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gdW5mbGF0dGVuKAorICAgICAgICAgICAgICAgICYodC0+ZGVsdGFzW2RlbHRhSW5kZXhdKSwgJigoKm5oKVtkZWx0YUluZGV4XSksCisgICAgICAgICAgICAgICAgYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcyk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKioKKyAqIFxicmllZiBGbGF0dGVuIGBGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KKyAqCisgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgRnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCisgKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCB0LgorICovCitzdGF0dXNfdCBmbGF0dGVuKAorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIGNvbnN0JiB0LAorICAgICAgICB2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludComIGZkcywgc2l6ZV90JiBudW1GZHMpIHsKKyAgICBpZiAodC5kZWx0YXMuc2l6ZSgpID4gOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeTo6TUFYX0ZSQU1FX0hJU1RPUlkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKHNpemUgPCBnZXRGbGF0dGVuZWRTaXplKHQpKSB7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0LmNvbXBvc2l0b3JUaW1pbmcpOworCisgICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4odC5kZWx0YXMuc2l6ZSgpKSk7CisgICAgZm9yIChzaXplX3QgZGVsdGFJbmRleCA9IDA7IGRlbHRhSW5kZXggPCB0LmRlbHRhcy5zaXplKCk7ICsrZGVsdGFJbmRleCkgeworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBmbGF0dGVuKHQuZGVsdGFzW2RlbHRhSW5kZXhdLCBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qKgorICogXGJyaWVmIFdyYXAgYDo6YW5kcm9pZDo6RnJhbWVFdmVudEhpc3RvcnlEYXRhYCBpbgorICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgorICoKKyAqIFxwYXJhbVtvdXRdIHQgVGhlIHdyYXBwZXIgb2YgdHlwZQorICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgorICogXHBhcmFtW291dF0gbmggVGhlIGFycmF5IG9mIGFycmF5IG9mIG5hdGl2ZSBoYW5kbGVzIHRoYXQgYXJlIHJlZmVycmVkIHRvIGJ5CisgKiBtZW1iZXJzIG9mIFxwIHQuCisgKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KKyAqCisgKiBPbiBzdWNjZXNzLCBlYWNoIG1lbWJlciBvZiBccCBuaCB3aWxsIGJlIGVpdGhlciBgbnVsbHB0cmAgb3IgYSBuZXdseSBjcmVhdGVkCisgKiBuYXRpdmUgaGFuZGxlLiBBbGwgdGhlIG5vbi1gbnVsbHB0cmAgZWxlbWVudHMgbXVzdCBiZSBkZWxldGVkIGluZGl2aWR1YWxseQorICogd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAuCisgKi8KK2Jvb2wgd3JhcEFzKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEqIHQsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+ID4qIG5oLAorICAgICAgICA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEgY29uc3QmIGwpIHsKKworICAgIHNpemVfdCBjb25zdCBiYXNlU2l6ZSA9IGwuZ2V0RmxhdHRlbmVkU2l6ZSgpOworICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJhc2VCdWZmZXIoCisgICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtiYXNlU2l6ZV0pOworICAgIGlmICghYmFzZUJ1ZmZlcikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc2l6ZV90IGNvbnN0IGJhc2VOdW1GZHMgPSBsLmdldEZkQ291bnQoKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8aW50W10+IGJhc2VGZHMoCisgICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgaW50W2Jhc2VOdW1GZHNdKTsKKyAgICBpZiAoIWJhc2VGZHMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZvaWQqIGJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQqPihiYXNlQnVmZmVyLmdldCgpKTsKKyAgICBzaXplX3Qgc2l6ZSA9IGJhc2VTaXplOworICAgIGludCogZmRzID0gYmFzZUZkcy5nZXQoKTsKKyAgICBzaXplX3QgbnVtRmRzID0gYmFzZU51bUZkczsKKyAgICBpZiAobC5mbGF0dGVuKGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIGNvbnN0KiBjb25zdEJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQgY29uc3QqPihiYXNlQnVmZmVyLmdldCgpKTsKKyAgICBzaXplID0gYmFzZVNpemU7CisgICAgaW50IGNvbnN0KiBjb25zdEZkcyA9IHN0YXRpY19jYXN0PGludCBjb25zdCo+KGJhc2VGZHMuZ2V0KCkpOworICAgIG51bUZkcyA9IGJhc2VOdW1GZHM7CisgICAgaWYgKHVuZmxhdHRlbih0LCBuaCwgY29uc3RCdWZmZXIsIHNpemUsIGNvbnN0RmRzLCBudW1GZHMpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBcYnJpZWYgQ29udmVydCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAgdG8KKyAqIGA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgorICoKKyAqIFxwYXJhbVtvdXRdIGwgVGhlIGRlc3RpbmF0aW9uIGA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgorICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgYWxsIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCisgKi8KK2Jvb2wgY29udmVydFRvKAorICAgICAgICA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEqIGwsCisgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEgY29uc3QmIHQpIHsKKworICAgIHNpemVfdCBjb25zdCBiYXNlU2l6ZSA9IGdldEZsYXR0ZW5lZFNpemUodCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gYmFzZUJ1ZmZlcigKKyAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W2Jhc2VTaXplXSk7CisgICAgaWYgKCFiYXNlQnVmZmVyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzaXplX3QgY29uc3QgYmFzZU51bUZkcyA9IGdldEZkQ291bnQodCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPGludFtdPiBiYXNlRmRzKAorICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIGludFtiYXNlTnVtRmRzXSk7CisgICAgaWYgKCFiYXNlRmRzKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkKiBidWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkKj4oYmFzZUJ1ZmZlci5nZXQoKSk7CisgICAgc2l6ZV90IHNpemUgPSBiYXNlU2l6ZTsKKyAgICBpbnQqIGZkcyA9IHN0YXRpY19jYXN0PGludCo+KGJhc2VGZHMuZ2V0KCkpOworICAgIHNpemVfdCBudW1GZHMgPSBiYXNlTnVtRmRzOworICAgIGlmIChmbGF0dGVuKHQsIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIGNvbnN0KiBjb25zdEJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQgY29uc3QqPihiYXNlQnVmZmVyLmdldCgpKTsKKyAgICBzaXplID0gYmFzZVNpemU7CisgICAgaW50IGNvbnN0KiBjb25zdEZkcyA9IHN0YXRpY19jYXN0PGludCBjb25zdCo+KGJhc2VGZHMuZ2V0KCkpOworICAgIG51bUZkcyA9IGJhc2VOdW1GZHM7CisgICAgaWYgKGwtPnVuZmxhdHRlbihjb25zdEJ1ZmZlciwgc2l6ZSwgY29uc3RGZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvdWkvUmVnaW9uLmNwcAorCisvKioKKyAqIFxicmllZiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciByZXF1aXJlZCB0byBmbGF0dGVuIGBSZWdpb25gLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYFJlZ2lvbmAuCisgKiBccmV0dXJuIFRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KKyAqLworc2l6ZV90IGdldEZsYXR0ZW5lZFNpemUoUmVnaW9uIGNvbnN0JiB0KSB7CisgICAgcmV0dXJuIHNpemVvZih1aW50MzJfdCkgKyB0LnNpemUoKSAqIHNpemVvZig6OmFuZHJvaWQ6OlJlY3QpOworfQorCisvKioKKyAqIFxicmllZiBVbmZsYXR0ZW4gYFJlZ2lvbmAuCisgKgorICogXHBhcmFtW291dF0gdCBUaGUgZGVzdGluYXRpb24gYFJlZ2lvbmAuCisgKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCisgKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KKyAqLworc3RhdHVzX3QgdW5mbGF0dGVuKFJlZ2lvbiogdCwgdm9pZCBjb25zdComIGJ1ZmZlciwgc2l6ZV90JiBzaXplKSB7CisgICAgaWYgKHNpemUgPCBzaXplb2YodWludDMyX3QpKSB7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgdWludDMyX3QgbnVtUmVjdHMgPSAwOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCBudW1SZWN0cyk7CisgICAgaWYgKHNpemUgPCBudW1SZWN0cyAqIHNpemVvZihSZWN0KSkgeworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKyAgICBpZiAobnVtUmVjdHMgPiAoVUlOVDMyX01BWCAvIHNpemVvZihSZWN0KSkpIHsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICB0LT5yZXNpemUobnVtUmVjdHMpOworICAgIGZvciAoc2l6ZV90IHIgPSAwOyByIDwgbnVtUmVjdHM7ICsrcikgeworICAgICAgICA6OmFuZHJvaWQ6OlJlY3QgcmVjdCg6OmFuZHJvaWQ6OlJlY3Q6OkVNUFRZX1JFQ1QpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZWN0LnVuZmxhdHRlbihidWZmZXIsIHNpemUpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIEZsYXR0ZW5hYmxlVXRpbHM6OmFkdmFuY2UoYnVmZmVyLCBzaXplLCBzaXplb2YocmVjdCkpOworICAgICAgICAoKnQpW3JdID0gUmVjdHsKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihyZWN0LmxlZnQpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHJlY3QudG9wKSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihyZWN0LnJpZ2h0KSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihyZWN0LmJvdHRvbSl9OworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qKgorICogXGJyaWVmIEZsYXR0ZW4gYFJlZ2lvbmAuCisgKgorICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYFJlZ2lvbmAuCisgKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCisgKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KKyAqLworc3RhdHVzX3QgZmxhdHRlbihSZWdpb24gY29uc3QmIHQsIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSkgeworICAgIGlmIChzaXplIDwgZ2V0RmxhdHRlbmVkU2l6ZSh0KSkgeworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHQuc2l6ZSgpKSk7CisgICAgZm9yIChzaXplX3QgciA9IDA7IHIgPCB0LnNpemUoKTsgKytyKSB7CisgICAgICAgIDo6YW5kcm9pZDo6UmVjdCByZWN0KAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHRbcl0ubGVmdCksCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4odFtyXS50b3ApLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHRbcl0ucmlnaHQpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHRbcl0uYm90dG9tKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlY3QuZmxhdHRlbihidWZmZXIsIHNpemUpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIEZsYXR0ZW5hYmxlVXRpbHM6OmFkdmFuY2UoYnVmZmVyLCBzaXplLCBzaXplb2YocmVjdCkpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qKgorICogXGJyaWVmIENvbnZlcnQgYDo6YW5kcm9pZDo6UmVnaW9uYCB0byBgUmVnaW9uYC4KKyAqCisgKiBccGFyYW1bb3V0XSB0IFRoZSBkZXN0aW5hdGlvbiBgUmVnaW9uYC4KKyAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGA6OmFuZHJvaWQ6OlJlZ2lvbmAuCisgKi8KKy8vIGNvbnZlcnQ6IDo6YW5kcm9pZDo6UmVnaW9uIC0+IFJlZ2lvbgorYm9vbCBjb252ZXJ0VG8oUmVnaW9uKiB0LCA6OmFuZHJvaWQ6OlJlZ2lvbiBjb25zdCYgbCkgeworICAgIHNpemVfdCBjb25zdCBiYXNlU2l6ZSA9IGwuZ2V0RmxhdHRlbmVkU2l6ZSgpOworICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJhc2VCdWZmZXIoCisgICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtiYXNlU2l6ZV0pOworICAgIGlmICghYmFzZUJ1ZmZlcikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCogYnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCo+KGJhc2VCdWZmZXIuZ2V0KCkpOworICAgIHNpemVfdCBzaXplID0gYmFzZVNpemU7CisgICAgaWYgKGwuZmxhdHRlbihidWZmZXIsIHNpemUpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIGNvbnN0KiBjb25zdEJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQgY29uc3QqPihiYXNlQnVmZmVyLmdldCgpKTsKKyAgICBzaXplID0gYmFzZVNpemU7CisgICAgaWYgKHVuZmxhdHRlbih0LCBjb25zdEJ1ZmZlciwgc2l6ZSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIFxicmllZiBDb252ZXJ0IGBSZWdpb25gIHRvIGA6OmFuZHJvaWQ6OlJlZ2lvbmAuCisgKgorICogXHBhcmFtW291dF0gbCBUaGUgZGVzdGluYXRpb24gYDo6YW5kcm9pZDo6UmVnaW9uYC4KKyAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBSZWdpb25gLgorICovCisvLyBjb252ZXJ0OiBSZWdpb24gLT4gOjphbmRyb2lkOjpSZWdpb24KK2Jvb2wgY29udmVydFRvKDo6YW5kcm9pZDo6UmVnaW9uKiBsLCBSZWdpb24gY29uc3QmIHQpIHsKKyAgICBzaXplX3QgY29uc3QgYmFzZVNpemUgPSBnZXRGbGF0dGVuZWRTaXplKHQpOworICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJhc2VCdWZmZXIoCisgICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtiYXNlU2l6ZV0pOworICAgIGlmICghYmFzZUJ1ZmZlcikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCogYnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCo+KGJhc2VCdWZmZXIuZ2V0KCkpOworICAgIHNpemVfdCBzaXplID0gYmFzZVNpemU7CisgICAgaWYgKGZsYXR0ZW4odCwgYnVmZmVyLCBzaXplKSAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCBjb25zdCogY29uc3RCdWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkIGNvbnN0Kj4oYmFzZUJ1ZmZlci5nZXQoKSk7CisgICAgc2l6ZSA9IGJhc2VTaXplOworICAgIGlmIChsLT51bmZsYXR0ZW4oY29uc3RCdWZmZXIsIHNpemUpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gUmVmOiBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL2d1aS9CR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmNwcDoKKy8vICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dAorCisvKioKKyAqIFxicmllZiBSZXR1cm4gYSBsb3dlciBib3VuZCBvbiB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHJlcXVpcmVkIHRvIGZsYXR0ZW4KKyAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KKyAqCisgKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KKyAqIFxyZXR1cm4gQSBsb3dlciBib3VuZCBvbiB0aGUgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCisgKi8KK2NvbnN0ZXhwciBzaXplX3QgbWluRmxhdHRlbmVkU2l6ZSgKKyAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBjb25zdCYgLyogdCAqLykgeworICAgIHJldHVybiBzaXplb2YoaW50NjRfdCkgKyAvLyB0aW1lc3RhbXAKKyAgICAgICAgICAgIHNpemVvZihpbnQpICsgLy8gaXNBdXRvVGltZXN0YW1wCisgICAgICAgICAgICBzaXplb2YoYW5kcm9pZF9kYXRhc3BhY2UpICsgLy8gZGF0YVNwYWNlCisgICAgICAgICAgICBzaXplb2YoOjphbmRyb2lkOjpSZWN0KSArIC8vIGNyb3AKKyAgICAgICAgICAgIHNpemVvZihpbnQpICsgLy8gc2NhbGluZ01vZGUKKyAgICAgICAgICAgIHNpemVvZih1aW50MzJfdCkgKyAvLyB0cmFuc2Zvcm0KKyAgICAgICAgICAgIHNpemVvZih1aW50MzJfdCkgKyAvLyBzdGlja3lUcmFuc2Zvcm0KKyAgICAgICAgICAgIHNpemVvZihib29sKTsgLy8gZ2V0RnJhbWVUaW1lc3RhbXBzCit9CisKKy8qKgorICogXGJyaWVmIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHJlcXVpcmVkIHRvIGZsYXR0ZW4KKyAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KKyAqCisgKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KKyAqIFxyZXR1cm4gVGhlIHJlcXVpcmVkIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgorICovCitzaXplX3QgZ2V0RmxhdHRlbmVkU2l6ZShIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IGNvbnN0JiB0KSB7CisgICAgcmV0dXJuIG1pbkZsYXR0ZW5lZFNpemUodCkgKworICAgICAgICAgICAgZ2V0RmVuY2VGbGF0dGVuZWRTaXplKHQuZmVuY2UpICsKKyAgICAgICAgICAgIGdldEZsYXR0ZW5lZFNpemUodC5zdXJmYWNlRGFtYWdlKSArCisgICAgICAgICAgICBzaXplb2YoSGRyTWV0YWRhdGE6OnZhbGlkVHlwZXMpOworfQorCisvKioKKyAqIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbgorICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgorICogXHJldHVybiBUaGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCisgKi8KK3NpemVfdCBnZXRGZENvdW50KAorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IGNvbnN0JiB0KSB7CisgICAgcmV0dXJuIGdldEZlbmNlRmRDb3VudCh0LmZlbmNlKTsKK30KKworLyoqCisgKiBcYnJpZWYgRmxhdHRlbiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCisgKgorICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgorICogXHBhcmFtW291dF0gbmggVGhlIG5hdGl2ZSBoYW5kbGUgY2xvbmVkIGZyb20gYHQuZmVuY2VgLgorICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KKyAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgdGhlIGZpbGUgZGVzY3JpcHRvciBpbiBgdC5mZW5jZWAuICovCitzdGF0dXNfdCBmbGF0dGVuKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgY29uc3QmIHQsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCoqIG5oLAorICAgICAgICB2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludComIGZkcywgc2l6ZV90JiBudW1GZHMpIHsKKyAgICBpZiAoc2l6ZSA8IGdldEZsYXR0ZW5lZFNpemUodCkpIHsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHQudGltZXN0YW1wKTsKKyAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHN0YXRpY19jYXN0PGludD4odC5pc0F1dG9UaW1lc3RhbXApKTsKKyAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxhbmRyb2lkX2RhdGFzcGFjZV90Pih0LmRhdGFTcGFjZSkpOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgOjphbmRyb2lkOjpSZWN0KAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4odC5jcm9wLmxlZnQpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4odC5jcm9wLnRvcCksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmNyb3AucmlnaHQpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4odC5jcm9wLmJvdHRvbSkpKTsKKyAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHN0YXRpY19jYXN0PGludD4odC5zY2FsaW5nTW9kZSkpOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC50cmFuc2Zvcm0pOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5zdGlja3lUcmFuc2Zvcm0pOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5nZXRGcmFtZVRpbWVzdGFtcHMpOworCisgICAgKm5oID0gdC5mZW5jZS5nZXROYXRpdmVIYW5kbGUoKSA9PSBudWxscHRyID8KKyAgICAgICAgICAgIG51bGxwdHIgOiBuYXRpdmVfaGFuZGxlX2Nsb25lKHQuZmVuY2UpOworICAgIHN0YXR1c190IHN0YXR1cyA9IGZsYXR0ZW5GZW5jZShoaWRsX2hhbmRsZSgqbmgpLCBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHN0YXR1cyA9IGZsYXR0ZW4odC5zdXJmYWNlRGFtYWdlLCBidWZmZXIsIHNpemUpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCBkZWNsdHlwZShIZHJNZXRhZGF0YTo6dmFsaWRUeXBlcykoMCkpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyoqCisgKiBcYnJpZWYgVW5mbGF0dGVuIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KKyAqCisgKiBccGFyYW1bb3V0XSB0IFRoZSBkZXN0aW5hdGlvbiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCisgKiBccGFyYW1bb3V0XSBuaCBUaGUgdW5kZXJseWluZyBuYXRpdmUgaGFuZGxlIGZvciBgdC0+ZmVuY2VgLgorICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KKyAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgorICoKKyAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYE5PX0VSUk9SYCBhbmQgYHQtPmZlbmNlYCBjb250YWlucyBhIHZhbGlkIGZpbGUKKyAqIGRlc2NyaXB0b3IsIFxwIG5oIHdpbGwgYmUgYSBuZXdseSBjcmVhdGVkIG5hdGl2ZSBoYW5kbGUgaG9sZGluZyB0aGF0IGZpbGUKKyAqIGRlc2NyaXB0b3IuIFxwIG5oIG5lZWRzIHRvIGJlIGRlbGV0ZWQgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAKKyAqIGFmdGVyd2FyZHMuCisgKi8KK3N0YXR1c190IHVuZmxhdHRlbigKKyAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCogdCwgbmF0aXZlX2hhbmRsZV90KiogbmgsCisgICAgICAgIHZvaWQgY29uc3QqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50IGNvbnN0KiYgZmRzLCBzaXplX3QmIG51bUZkcykgeworICAgIGlmIChzaXplIDwgbWluRmxhdHRlbmVkU2l6ZSgqdCkpIHsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdC0+dGltZXN0YW1wKTsKKyAgICBpbnQgbElzQXV0b1RpbWVzdGFtcDsKKyAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgbElzQXV0b1RpbWVzdGFtcCk7CisgICAgdC0+aXNBdXRvVGltZXN0YW1wID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4obElzQXV0b1RpbWVzdGFtcCk7CisgICAgYW5kcm9pZF9kYXRhc3BhY2VfdCBsRGF0YVNwYWNlOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCBsRGF0YVNwYWNlKTsKKyAgICB0LT5kYXRhU3BhY2UgPSBzdGF0aWNfY2FzdDxEYXRhc3BhY2U+KGxEYXRhU3BhY2UpOworICAgIFJlY3QgbENyb3A7CisgICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIGxDcm9wKTsKKyAgICB0LT5jcm9wID0gUmVjdHsKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGxDcm9wLmxlZnQpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4obENyb3AudG9wKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGxDcm9wLnJpZ2h0KSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGxDcm9wLmJvdHRvbSl9OworICAgIGludCBsU2NhbGluZ01vZGU7CisgICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIGxTY2FsaW5nTW9kZSk7CisgICAgdC0+c2NhbGluZ01vZGUgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihsU2NhbGluZ01vZGUpOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT50cmFuc2Zvcm0pOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5zdGlja3lUcmFuc2Zvcm0pOworICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5nZXRGcmFtZVRpbWVzdGFtcHMpOworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gdW5mbGF0dGVuRmVuY2UoJih0LT5mZW5jZSksIG5oLAorICAgICAgICAgICAgYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcyk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICAvLyBIZHJNZXRhZGF0YSBpZ25vcmVkCisgICAgcmV0dXJuIHVuZmxhdHRlbigmKHQtPnN1cmZhY2VEYW1hZ2UpLCBidWZmZXIsIHNpemUpOworfQorCisvKioKKyAqIFxicmllZiBXcmFwIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YCBpbgorICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgorICoKKyAqIFxwYXJhbVtvdXRdIHQgVGhlIHdyYXBwZXIgb2YgdHlwZQorICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgorICogXHBhcmFtW291dF0gbmggVGhlIHVuZGVybHlpbmcgbmF0aXZlIGhhbmRsZSBmb3IgYHQtPmZlbmNlYC4KKyAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KKyAqCisgKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGB0cnVlYCBhbmQgYHQtPmZlbmNlYCBjb250YWlucyBhIHZhbGlkIGZpbGUKKyAqIGRlc2NyaXB0b3IsIFxwIG5oIHdpbGwgYmUgYSBuZXdseSBjcmVhdGVkIG5hdGl2ZSBoYW5kbGUgaG9sZGluZyB0aGF0IGZpbGUKKyAqIGRlc2NyaXB0b3IuIFxwIG5oIG5lZWRzIHRvIGJlIGRlbGV0ZWQgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAKKyAqIGFmdGVyd2FyZHMuCisgKi8KK2Jvb2wgd3JhcEFzKAorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0KiB0LAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QqKiBuaCwKKyAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBjb25zdCYgbCkgeworCisgICAgc2l6ZV90IGNvbnN0IGJhc2VTaXplID0gbC5nZXRGbGF0dGVuZWRTaXplKCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gYmFzZUJ1ZmZlcigKKyAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W2Jhc2VTaXplXSk7CisgICAgaWYgKCFiYXNlQnVmZmVyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzaXplX3QgY29uc3QgYmFzZU51bUZkcyA9IGwuZ2V0RmRDb3VudCgpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxpbnRbXT4gYmFzZUZkcygKKyAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSBpbnRbYmFzZU51bUZkc10pOworICAgIGlmICghYmFzZUZkcykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCogYnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCo+KGJhc2VCdWZmZXIuZ2V0KCkpOworICAgIHNpemVfdCBzaXplID0gYmFzZVNpemU7CisgICAgaW50KiBmZHMgPSBiYXNlRmRzLmdldCgpOworICAgIHNpemVfdCBudW1GZHMgPSBiYXNlTnVtRmRzOworICAgIGlmIChsLmZsYXR0ZW4oYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZvaWQgY29uc3QqIGNvbnN0QnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCBjb25zdCo+KGJhc2VCdWZmZXIuZ2V0KCkpOworICAgIHNpemUgPSBiYXNlU2l6ZTsKKyAgICBpbnQgY29uc3QqIGNvbnN0RmRzID0gc3RhdGljX2Nhc3Q8aW50IGNvbnN0Kj4oYmFzZUZkcy5nZXQoKSk7CisgICAgbnVtRmRzID0gYmFzZU51bUZkczsKKyAgICBpZiAodW5mbGF0dGVuKHQsIG5oLCBjb25zdEJ1ZmZlciwgc2l6ZSwgY29uc3RGZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIFxicmllZiBDb252ZXJ0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YCB0bworICogYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgorICoKKyAqIFxwYXJhbVtvdXRdIGwgVGhlIGRlc3RpbmF0aW9uIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KKyAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KKyAqCisgKiBJZiBgdC5mZW5jZWAgaGFzIGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yLCBpdCB3aWxsIGJlIGR1cGxpY2F0ZWQuCisgKi8KK2Jvb2wgY29udmVydFRvKAorICAgICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0KiBsLAorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IGNvbnN0JiB0KSB7CisKKyAgICBzaXplX3QgY29uc3QgYmFzZVNpemUgPSBnZXRGbGF0dGVuZWRTaXplKHQpOworICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJhc2VCdWZmZXIoCisgICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtiYXNlU2l6ZV0pOworICAgIGlmICghYmFzZUJ1ZmZlcikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc2l6ZV90IGNvbnN0IGJhc2VOdW1GZHMgPSBnZXRGZENvdW50KHQpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxpbnRbXT4gYmFzZUZkcygKKyAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSBpbnRbYmFzZU51bUZkc10pOworICAgIGlmICghYmFzZUZkcykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCogYnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCo+KGJhc2VCdWZmZXIuZ2V0KCkpOworICAgIHNpemVfdCBzaXplID0gYmFzZVNpemU7CisgICAgaW50KiBmZHMgPSBiYXNlRmRzLmdldCgpOworICAgIHNpemVfdCBudW1GZHMgPSBiYXNlTnVtRmRzOworICAgIG5hdGl2ZV9oYW5kbGVfdCogbmg7CisgICAgaWYgKGZsYXR0ZW4odCwgJm5oLCBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKSAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCBjb25zdCogY29uc3RCdWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkIGNvbnN0Kj4oYmFzZUJ1ZmZlci5nZXQoKSk7CisgICAgc2l6ZSA9IGJhc2VTaXplOworICAgIGludCBjb25zdCogY29uc3RGZHMgPSBzdGF0aWNfY2FzdDxpbnQgY29uc3QqPihiYXNlRmRzLmdldCgpKTsKKyAgICBudW1GZHMgPSBiYXNlTnVtRmRzOworICAgIGlmIChsLT51bmZsYXR0ZW4oY29uc3RCdWZmZXIsIHNpemUsIGNvbnN0RmRzLCBudW1GZHMpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIGlmIChuaCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKG5oKTsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvZ3VpL0JHcmFwaGljQnVmZmVyUHJvZHVjZXIuY3BwOgorLy8gICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dAorCisvKioKKyAqIFxicmllZiBXcmFwIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAgaW4KKyAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAuCisgKgorICogXHBhcmFtW291dF0gdCBUaGUgd3JhcHBlciBvZiB0eXBlCisgKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgLgorICogXHBhcmFtW291dF0gbmggVGhlIGFycmF5IG9mIGFycmF5IG9mIG5hdGl2ZSBoYW5kbGVzIHRoYXQgYXJlIHJlZmVycmVkIHRvIGJ5CisgKiBtZW1iZXJzIG9mIFxwIHQuCisgKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgLgorICoKKyAqIE9uIHN1Y2Nlc3MsIGVhY2ggbWVtYmVyIG9mIFxwIG5oIHdpbGwgYmUgZWl0aGVyIGBudWxscHRyYCBvciBhIG5ld2x5IGNyZWF0ZWQKKyAqIG5hdGl2ZSBoYW5kbGUuIEFsbCB0aGUgbm9uLWBudWxscHRyYCBlbGVtZW50cyBtdXN0IGJlIGRlbGV0ZWQgaW5kaXZpZHVhbGx5CisgKiB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYC4KKyAqLworLy8gd3JhcDogQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgLT4KKy8vIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0Citib29sIHdyYXBBcyhIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCogdCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gPiogbmgsCisgICAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IGNvbnN0JiBsKSB7CisgICAgaWYgKCF3cmFwQXMoJih0LT5mcmFtZVRpbWVzdGFtcHMpLCBuaCwgbC5mcmFtZVRpbWVzdGFtcHMpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdC0+d2lkdGggPSBsLndpZHRoOworICAgIHQtPmhlaWdodCA9IGwuaGVpZ2h0OworICAgIHQtPnRyYW5zZm9ybUhpbnQgPSBsLnRyYW5zZm9ybUhpbnQ7CisgICAgdC0+bnVtUGVuZGluZ0J1ZmZlcnMgPSBsLm51bVBlbmRpbmdCdWZmZXJzOworICAgIHQtPm5leHRGcmFtZU51bWJlciA9IGwubmV4dEZyYW1lTnVtYmVyOworICAgIHQtPmJ1ZmZlclJlcGxhY2VkID0gbC5idWZmZXJSZXBsYWNlZDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBcYnJpZWYgQ29udmVydCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgIHRvCisgKiBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgLgorICoKKyAqIFxwYXJhbVtvdXRdIGwgVGhlIGRlc3RpbmF0aW9uIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAuCisgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgYWxsIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCisgKi8KKy8vIGNvbnZlcnQ6IEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IC0+CisvLyBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dAorYm9vbCBjb252ZXJ0VG8oCisgICAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0KiBsLAorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCBjb25zdCYgdCkgeworICAgIGlmICghY29udmVydFRvKCYobC0+ZnJhbWVUaW1lc3RhbXBzKSwgdC5mcmFtZVRpbWVzdGFtcHMpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbC0+d2lkdGggPSB0LndpZHRoOworICAgIGwtPmhlaWdodCA9IHQuaGVpZ2h0OworICAgIGwtPnRyYW5zZm9ybUhpbnQgPSB0LnRyYW5zZm9ybUhpbnQ7CisgICAgbC0+bnVtUGVuZGluZ0J1ZmZlcnMgPSB0Lm51bVBlbmRpbmdCdWZmZXJzOworICAgIGwtPm5leHRGcmFtZU51bWJlciA9IHQubmV4dEZyYW1lTnVtYmVyOworICAgIGwtPmJ1ZmZlclJlcGxhY2VkID0gdC5idWZmZXJSZXBsYWNlZDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBcYnJpZWYgQ29udmVydCBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgIHRvCisgKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgorICoKKyAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZWAuCisgKiBccmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZWAuCisgKi8KK0hHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlIHRvSGlkbERpc2Nvbm5lY3RNb2RlKAorICAgICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZSBsKSB7CisgICAgc3dpdGNoIChsKSB7CisgICAgICAgIGNhc2UgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGU6OkFwaToKKyAgICAgICAgICAgIHJldHVybiBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZTo6QVBJOworICAgICAgICBjYXNlIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlOjpBbGxMb2NhbDoKKyAgICAgICAgICAgIHJldHVybiBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZTo6QUxMX0xPQ0FMOworICAgIH0KKyAgICByZXR1cm4gSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGU6OkFQSTsKK30KKworLyoqCisgKiBcYnJpZWYgQ29udmVydCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgIHRvCisgKiBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgorICoKKyAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZWAuCisgKiBccmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZWAuCisgKi8KK0JHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlIHRvR3VpRGlzY29ubmVjdE1vZGUoCisgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlIHQpIHsKKyAgICBzd2l0Y2ggKHQpIHsKKyAgICAgICAgY2FzZSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZTo6QVBJOgorICAgICAgICAgICAgcmV0dXJuIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlOjpBcGk7CisgICAgICAgIGNhc2UgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGU6OkFMTF9MT0NBTDoKKyAgICAgICAgICAgIHJldHVybiBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZTo6QWxsTG9jYWw7CisgICAgfQorICAgIHJldHVybiBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZTo6QXBpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY29udmVyc2lvbgorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvRnJhbWVEcm9wcGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0ZyYW1lRHJvcHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FmZTgzNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0ZyYW1lRHJvcHBlci5jcHAKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRnJhbWVEcm9wcGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvRnJhbWVEcm9wcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3QgaW50NjRfdCBrTWF4Sml0dGVyVXMgPSAyMDAwOworCitGcmFtZURyb3BwZXI6OkZyYW1lRHJvcHBlcigpCisgICAgOiBtRGVzaXJlZE1pblRpbWVVcygtMSksCisgICAgICBtTWluSW50ZXJ2YWxVcygwKSB7Cit9CisKK0ZyYW1lRHJvcHBlcjo6fkZyYW1lRHJvcHBlcigpIHsKK30KKworc3RhdHVzX3QgRnJhbWVEcm9wcGVyOjpzZXRNYXhGcmFtZVJhdGUoZmxvYXQgbWF4RnJhbWVSYXRlKSB7CisgICAgaWYgKG1heEZyYW1lUmF0ZSA8PSAwKSB7CisgICAgICAgIEFMT0dFKCJmcmFtZXJhdGUgc2hvdWxkIGJlIHBvc2l0aXZlIGJ1dCBnb3QgJWYuIiwgbWF4RnJhbWVSYXRlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbU1pbkludGVydmFsVXMgPSAoaW50NjRfdCkgKDEwMDAwMDAuMGYgLyBtYXhGcmFtZVJhdGUpOworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBGcmFtZURyb3BwZXI6OnNob3VsZERyb3AoaW50NjRfdCB0aW1lVXMpIHsKKyAgICBpZiAobU1pbkludGVydmFsVXMgPD0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1EZXNpcmVkTWluVGltZVVzIDwgMCkgeworICAgICAgICBtRGVzaXJlZE1pblRpbWVVcyA9IHRpbWVVcyArIG1NaW5JbnRlcnZhbFVzOworICAgICAgICBBTE9HVigiZmlyc3QgZnJhbWUgJWxsZCwgbmV4dCBkZXNpcmVkIGZyYW1lICVsbGQiLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZVVzLCAobG9uZyBsb25nKW1EZXNpcmVkTWluVGltZVVzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICh0aW1lVXMgPCAobURlc2lyZWRNaW5UaW1lVXMgLSBrTWF4Sml0dGVyVXMpKSB7CisgICAgICAgIEFMT0dWKCJkcm9wIGZyYW1lICVsbGQsIGRlc2lyZWQgZnJhbWUgJWxsZCwgZGlmZiAlbGxkIiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVVcywgKGxvbmcgbG9uZyltRGVzaXJlZE1pblRpbWVVcywKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKShtRGVzaXJlZE1pblRpbWVVcyAtIHRpbWVVcykpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpbnQ2NF90IG4gPSAodGltZVVzIC0gbURlc2lyZWRNaW5UaW1lVXMgKyBrTWF4Sml0dGVyVXMpIC8gbU1pbkludGVydmFsVXM7CisgICAgbURlc2lyZWRNaW5UaW1lVXMgKz0gKG4gKyAxKSAqIG1NaW5JbnRlcnZhbFVzOworICAgIEFMT0dWKCJrZWVwIGZyYW1lICVsbGQsIG5leHQgZGVzaXJlZCBmcmFtZSAlbGxkLCBkaWZmICVsbGQiLAorICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lVXMsIChsb25nIGxvbmcpbURlc2lyZWRNaW5UaW1lVXMsCisgICAgICAgICAgICAobG9uZyBsb25nKShtRGVzaXJlZE1pblRpbWVVcyAtIHRpbWVVcykpOworICAgIHJldHVybiBmYWxzZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhhZThlYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCkBAIC0wLDAgKzEsMTM3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjZGVmaW5lIExPR19UQUcgIkdyYXBoaWNCdWZmZXJTb3VyY2UiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNkZWZpbmUgU1RSSU5HSUZZX0VOVU1TIC8vIGZvciBhc1N0cmluZyBpbiBIYXJkd2FyZUFQSS5oL1ZpZGVvQVBJLmgKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9GcmFtZURyb3BwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0ZpbGVEZXNjcmlwdG9yLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KKyNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CisjaW5jbHVkZSA8Z3VpL0J1ZmZlckl0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGNtYXRoPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisvLyBrVGltZXN0YW1wRmx1Y3R1YXRpb24gaXMgYW4gdXBwZXIgYm91bmQgb2YgdGltZXN0YW1wIGZsdWN0dWF0aW9uIGZyb20gdGhlCisvLyBzb3VyY2UgdGhhdCBHcmFwaGljQnVmZmVyU291cmNlIGFsbG93cy4gVGhlIHVuaXQgb2Yga1RpbWVzdGFtcEZsdWN0dWF0aW9uIGlzCisvLyBmcmFtZXMuIE1vcmUgc3BlY2lmaWNhbGx5LCBHcmFwaGljQnVmZmVyU291cmNlIHdpbGwgZHJvcCBhIGZyYW1lIGlmCisvLworLy8gZXhwZWN0ZWROZXdGcmFtZXRpbWVzdGFtcCAtIGFjdHVhbE5ld0ZyYW1lVGltZXN0YW1wIDwKKy8vICAgICAoMC41IC0ga1RpbWVzdGFtcEZsdWN0dWF0aW9uKSAqIGV4cGVjdGVkdGltZVBlcmlvZEJldHdlZW5GcmFtZXMKKy8vCisvLyB3aGVyZQorLy8gLSBleHBlY3RlZE5ld0ZyYW1lVGltZXN0YW1wIGlzIHRoZSBjYWxjdWxhdGVkIGlkZWFsIHRpbWVzdGFtcCBvZiB0aGUgbmV3CisvLyAgIGluY29taW5nIGZyYW1lCisvLyAtIGFjdHVhbE5ld0ZyYW1lVGltZXN0YW1wIGlzIHRoZSB0aW1lc3RhbXAgcmVjZWl2ZWQgZnJvbSB0aGUgc291cmNlCisvLyAtIGV4cGVjdGVkVGltZVBlcmlvZEJldHdlZW5GcmFtZXMgaXMgdGhlIGlkZWFsIGRpZmZlcmVuY2Ugb2YgdGhlIHRpbWVzdGFtcHMKKy8vICAgb2YgdHdvIGFkamFjZW50IGZyYW1lcworLy8KKy8vIFNlZSBHcmFwaGljQnVmZmVyU291cmNlOjpjYWxjdWxhdGVDb2RlY1RpbWVzdGFtcF9sKCkgZm9yIG1vcmUgZGV0YWlsIGFib3V0CisvLyBob3cga1RpbWVzdGFtcEZsdWN0dWF0aW9uIGlzIHVzZWQuCisvLworLy8ga1RpbWVzdGFtcEZsdWN0dWF0aW9uIHNob3VsZCBiZSBub24tbmVnYXRpdmUuIEEgaGlnaGVyIHZhbHVlIGNhdXNlcyBhIHNtYWxsZXIKKy8vIGNoYW5jZSBvZiBkcm9wcGluZyBmcmFtZXMsIGJ1dCBhdCB0aGUgc2FtZSB0aW1lIGEgaGlnaGVyIGJvdW5kIG9uIHRoZQorLy8gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzb3VyY2UgdGltZXN0YW1wIGFuZCB0aGUgaW50ZXJwcmV0ZWQgKHNuYXBwZWQpCisvLyB0aW1lc3RhbXAuCisvLworLy8gVGhlIHZhbHVlIG9mIDAuMDUgbWVhbnMgdGhhdCBHcmFwaGljQnVmZmVyU291cmNlIGV4cGVjdHMgdGhlIGlucHV0IHRpbWVzdGFtcHMKKy8vIHRvIGZsdWN0dWF0ZSBubyBtb3JlIHRoYW4gNSUgZnJvbSB0aGUgcmVndWxhciB0aW1lIHBlcmlvZC4KKy8vCisvLyBUT0RPOiBKdXN0aWZ5IHRoZSBjaG9pY2Ugb2YgdGhpcyB2YWx1ZSwgb3IgbWFrZSBpdCBjb25maWd1cmFibGUuCitjb25zdGV4cHIgZG91YmxlIGtUaW1lc3RhbXBGbHVjdHVhdGlvbiA9IDAuMDU7Cit9CisKKy8qKgorICogQSBjb3BpYWJsZSBvYmplY3QgbWFuYWdpbmcgYSBidWZmZXIgaW4gdGhlIGJ1ZmZlciBjYWNoZSBtYW5hZ2VkIGJ5IHRoZSBwcm9kdWNlci4gVGhpcyBvYmplY3QKKyAqIGhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIsIGFuZCBtYWludGFpbnMgd2hpY2ggYnVmZmVyIHNsb3QgaXQgYmVsb25ncyB0byAoaWYgYW55KSwgYW5kCisgKiB3aGV0aGVyIGl0IGlzIHN0aWxsIGluIGEgYnVmZmVyIHNsb3QuIEl0IGFsc28gbWFpbnRhaW5zIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBvdXRzdGFuZ2luZyBhY3F1aXJlCisgKiByZWZlcmVuY2VzIHRvIGl0IChieSBidWZmZXJzIGFjcXVpcmVkIGZyb20gdGhlIHNsb3QpIG1haW5seSBzbyB0aGF0IHdlIGNhbiBrZWVwIGEgZGVidWcKKyAqIGNvdW50IG9mIGhvdyBtYW55IGJ1ZmZlcnMgd2UgbmVlZCB0byBzdGlsbCByZWxlYXNlIGJhY2sgdG8gdGhlIHByb2R1Y2VyLgorICovCitzdHJ1Y3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6Q2FjaGVkQnVmZmVyIHsKKyAgICAvKioKKyAgICAgKiBUb2tlbiB0aGF0IGlzIHVzZWQgdG8gdHJhY2sgYWNxdWlyZSBjb3VudHMgKGFzIG9wcG9zZWQgdG8gYWxsIHJlZmVyZW5jZXMgdG8gdGhpcyBvYmplY3QpLgorICAgICAqLworICAgIHN0cnVjdCBBY3F1aXJhYmxlIHsgfTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSB1c2luZyBhIGJ1ZmZlciBjYWNoZWQgaW4gYSBzbG90LgorICAgICAqLworICAgIENhY2hlZEJ1ZmZlcihzbG90X2lkIHNsb3QsIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+ICZncmFwaGljQnVmZmVyKQorICAgICAgICA6IG1Jc0NhY2hlZCh0cnVlKSwKKyAgICAgICAgICBtU2xvdChzbG90KSwKKyAgICAgICAgICBtR3JhcGhpY0J1ZmZlcihncmFwaGljQnVmZmVyKSwKKyAgICAgICAgICBtQWNxdWlyYWJsZShzdGQ6Om1ha2Vfc2hhcmVkPEFjcXVpcmFibGU+KCkpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjYWNoZSBzbG90IHRoYXQgdGhpcyBidWZmZXIgaXMgY2FjaGVkIGluLCBvciAtMSBpZiBpdCBpcyBubyBsb25nZXIgY2FjaGVkLgorICAgICAqCisgICAgICogVGhpcyBhc3N1bWVzIHRoYXQgLTEgc2xvdCBpZCBpcyBpbnZhbGlkOyB0aG91Z2gsIGl0IGlzIGp1c3QgYSBiZW5pZ24gY29sbGlzaW9uIHVzZWQgZm9yCisgICAgICogZGVidWdnaW5nLiBUaGlzIG9iamVjdCBleHBsaWNpdGx5IG1hbmFnZXMgd2hldGhlciBpdCBpcyBzdGlsbCBjYWNoZWQuCisgICAgICovCisgICAgc2xvdF9pZCBnZXRTbG90KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUlzQ2FjaGVkID8gbVNsb3QgOiAtMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjYWNoZWQgYnVmZmVyLgorICAgICAqLworICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdldEdyYXBoaWNCdWZmZXIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtR3JhcGhpY0J1ZmZlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3Mgd2hldGhlciB0aGlzIGJ1ZmZlciBpcyBzdGlsbCBpbiB0aGUgYnVmZmVyIGNhY2hlLgorICAgICAqLworICAgIGJvb2wgaXNDYWNoZWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSXNDYWNoZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBidWZmZXIgaGFzIGFuIGFjcXVpcmVkIHJlZmVyZW5jZS4KKyAgICAgKi8KKyAgICBib29sIGlzQWNxdWlyZWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQWNxdWlyYWJsZS51c2VfY291bnQoKSA+IDE7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhbmQgcmV0dXJucyBhIHNoYXJlZCBhY3F1aXJlZCByZWZlcmVuY2UuCisgICAgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPEFjcXVpcmFibGU+IGdldEFjcXVpcmFibGUoKSB7CisgICAgICAgIHJldHVybiBtQWNxdWlyYWJsZTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6ZGlzY2FyZEJ1ZmZlckF0U2xvdEluZGV4X2woc3NpemVfdCk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCB0byBiZSBjYWxsZWQgd2hlbiB0aGUgYnVmZmVyIGlzIG5vIGxvbmdlciBpbiB0aGUgYnVmZmVyIGNhY2hlLgorICAgICAqIENhbGxlZCBmcm9tIGRpc2NhcmRCdWZmZXJBdFNsb3RJbmRleF9sLgorICAgICAqLworICAgIHZvaWQgb25Ecm9wcGVkRnJvbUNhY2hlKCkgeworICAgICAgICBDSEVDS19EQkcobUlzQ2FjaGVkKTsKKyAgICAgICAgbUlzQ2FjaGVkID0gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBtSXNDYWNoZWQ7CisgICAgc2xvdF9pZCBtU2xvdDsKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBtR3JhcGhpY0J1ZmZlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QWNxdWlyYWJsZT4gbUFjcXVpcmFibGU7Cit9OworCisvKioKKyAqIEEgY29waWFibGUgb2JqZWN0IG1hbmFnaW5nIGEgYnVmZmVyIGFjcXVpcmVkIGZyb20gdGhlIHByb2R1Y2VyLiBUaGlzIG11c3QgYWx3YXlzIGJlIGEgY2FjaGVkCisgKiBidWZmZXIuIFRoaXMgb2JqZWN0cyBhbHNvIG1hbmFnZXMgaXRzIGFjcXVpcmUgZmVuY2UgYW5kIGFueSByZWxlYXNlIGZlbmNlcyB0aGF0IG1heSBiZSByZXR1cm5lZAorICogYnkgdGhlIGVuY29kZXIgZm9yIHRoaXMgYnVmZmVyICh0aGlzIGJ1ZmZlciBtYXkgYmUgcXVldWVkIHRvIHRoZSBlbmNvZGVyIG11bHRpcGxlIHRpbWVzKS4KKyAqIElmIG5vIHJlbGVhc2UgZmVuY2VzIGFyZSBhZGRlZCBieSB0aGUgZW5jb2RlciwgdGhlIGFjcXVpcmUgZmVuY2UgaXMgcmV0dXJuZWQgYXMgdGhlIHJlbGVhc2UKKyAqIGZlbmNlIGZvciB0aGlzIC0gYXMgaXQgaXMgYXNzdW1lZCB0aGF0IG5vb25lIHdhaXRlZCBmb3IgdGhlIGFjcXVpcmUgZmVuY2UuIE90aGVyd2lzZSwgaXQgaXMKKyAqIGFzc3VtZWQgdGhhdCB0aGUgZW5jb2RlciBoYXMgd2FpdGVkIGZvciB0aGUgYWNxdWlyZSBmZW5jZSAob3IgcmV0dXJuZWQgaXQgYXMgdGhlIHJlbGVhc2UKKyAqIGZlbmNlKS4KKyAqLworc3RydWN0IEdyYXBoaWNCdWZmZXJTb3VyY2U6OkFjcXVpcmVkQnVmZmVyIHsKKyAgICBBY3F1aXJlZEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDYWNoZWRCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQWNxdWlyZWRCdWZmZXIgKik+IG9uUmVsZWFzZWQsCisgICAgICAgICAgICBjb25zdCBzcDxGZW5jZT4gJmFjcXVpcmVGZW5jZSkKKyAgICAgICAgOiBtQnVmZmVyKGJ1ZmZlciksCisgICAgICAgICAgbUFjcXVpcmFibGUoYnVmZmVyLT5nZXRBY3F1aXJhYmxlKCkpLAorICAgICAgICAgIG1BY3F1aXJlRmVuY2UoYWNxdWlyZUZlbmNlKSwKKyAgICAgICAgICBtR290UmVsZWFzZUZlbmNlcyhmYWxzZSksCisgICAgICAgICAgbU9uUmVsZWFzZWQob25SZWxlYXNlZCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSByZWxlYXNlIGZlbmNlIHJldHVybmVkIGJ5IHRoZSBlbmNvZGVyIHRvIHRoaXMgb2JqZWN0LiBJZiB0aGlzIGlzIGNhbGxlZCB3aXRoIGFuCisgICAgICogdmFsaWQgZmlsZSBkZXNjcmlwdG9yLCBpdCBpcyBhZGRlZCB0byB0aGUgbGlzdCBvZiByZWxlYXNlIGZlbmNlcy4gVGhlc2UgYXJlIHJldHVybmVkIHRvIHRoZQorICAgICAqIHByb2R1Y2VyIG9uIHJlbGVhc2UoKSBhcyBhIG1lcmdlZCBmZW5jZS4gUmVnYXJkbGVzcyBvZiB0aGUgdmFsaWRpdHkgb2YgdGhlIGZpbGUgZGVzY3JpcHRvciwKKyAgICAgKiB3ZSB0YWtlIG5vdGUgdGhhdCBhIHJlbGVhc2UgZmVuY2Ugd2FzIGF0dGVtcHRlZCB0byBiZSBhZGRlZCBhbmQgdGhlIGFjcXVpcmUgZmVuY2UgY2FuIG5vdyBiZQorICAgICAqIGFzc3VtZWQgYXMgYWNxdWlyZWQuCisgICAgICovCisgICAgdm9pZCBhZGRSZWxlYXNlRmVuY2VGZChpbnQgZmVuY2VGZCkgeworICAgICAgICAvLyBzYXZlIGFsbCByZWxlYXNlIGZlbmNlcyAtIHRoZXNlIHdpbGwgYmUgcHJvcGFnYXRlZCB0byB0aGUgcHJvZHVjZXIgaWYgdGhpcyBidWZmZXIgaXMKKyAgICAgICAgLy8gZXZlciByZWxlYXNlZCB0byBpdAorICAgICAgICBpZiAoZmVuY2VGZCA+PSAwKSB7CisgICAgICAgICAgICBtUmVsZWFzZUZlbmNlRmRzLnB1c2hfYmFjayhmZW5jZUZkKTsKKyAgICAgICAgfQorICAgICAgICBtR290UmVsZWFzZUZlbmNlcyA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWNxdWlyZSBmZW5jZSBmaWxlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIGludCBnZXRBY3F1aXJlRmVuY2VGZCgpIHsKKyAgICAgICAgaWYgKG1BY3F1aXJlRmVuY2UgPT0gbnVsbHB0ciB8fCAhbUFjcXVpcmVGZW5jZS0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1BY3F1aXJlRmVuY2UtPmR1cCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgYnVmZmVyIGlzIHN0aWxsIGluIHRoZSBidWZmZXIgY2FjaGUuCisgICAgICovCisgICAgYm9vbCBpc0NhY2hlZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1CdWZmZXItPmlzQ2FjaGVkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWNxdWlyZWQgYnVmZmVyLgorICAgICAqLworICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdldEdyYXBoaWNCdWZmZXIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQnVmZmVyLT5nZXRHcmFwaGljQnVmZmVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2xvdCB0aGF0IHRoaXMgYnVmZmVyIGlzIGNhY2hlZCBhdCwgb3IgLTEgb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogVGhpcyBhc3N1bWVzIHRoYXQgLTEgc2xvdCBpZCBpcyBpbnZhbGlkOyB0aG91Z2gsIGl0IGlzIGp1c3QgYSBiZW5pZ24gY29sbGlzaW9uIHVzZWQgZm9yCisgICAgICogZGVidWdnaW5nLiBUaGlzIG9iamVjdCBleHBsaWNpdGx5IG1hbmFnZXMgd2hldGhlciBpdCBpcyBzdGlsbCBjYWNoZWQuCisgICAgICovCisgICAgc2xvdF9pZCBnZXRTbG90KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUJ1ZmZlci0+Z2V0U2xvdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSByZWxlYXNlIGZlbmNlIG9iamVjdCBmcm9tIHRoZSBhY3F1aXJlIGZlbmNlIGFuZC9vciBhbnkgcmVsZWFzZSBmZW5jZXMKKyAgICAgKiBhZGRlZC4gSWYgbm8gcmVsZWFzZSBmZW5jZXMgd2VyZSBhZGRlZCAoZXZlbiBpZiBpbnZhbGlkKSwgcmV0dXJucyB0aGUgYWNxdWlyZSBmZW5jZS4KKyAgICAgKiBPdGhlcndpc2UsIGl0IHJldHVybnMgYSBtZXJnZWQgZmVuY2UgZnJvbSBhbGwgdGhlIHZhbGlkIHJlbGVhc2UgZmVuY2VzIGFkZGVkLgorICAgICAqLworICAgIHNwPEZlbmNlPiBnZXRSZWxlYXNlRmVuY2UoKSB7CisgICAgICAgIC8vIElmIGRpZCBub3QgcmVjZWl2ZSByZWxlYXNlIGZlbmNlcywgd2UgYXNzdW1lIHRoaXMgYnVmZmVyIHdhcyBub3QgY29uc3VtZWQgKGl0IHdhcworICAgICAgICAvLyBkaXNjYXJkZWQgb3IgZHJvcHBlZCkuIEluIHRoaXMgY2FzZSByZWxlYXNlIHRoZSBhY3F1aXJlIGZlbmNlIGFzIHRoZSByZWxlYXNlIGZlbmNlLgorICAgICAgICAvLyBXZSBkbyB0aGlzIGhlcmUgdG8gYXZvaWQgYSBkdXAsIGNsb3NlIGFuZCByZWNyZWF0aW9uIG9mIHRoZSBGZW5jZSBvYmplY3QuCisgICAgICAgIGlmICghbUdvdFJlbGVhc2VGZW5jZXMpIHsKKyAgICAgICAgICAgIHJldHVybiBtQWNxdWlyZUZlbmNlOworICAgICAgICB9CisgICAgICAgIHNwPEZlbmNlPiByZXQgPSBnZXRSZWxlYXNlRmVuY2UoMCwgbVJlbGVhc2VGZW5jZUZkcy5zaXplKCkpOworICAgICAgICAvLyBjbGVhciBmZHMgYXMgZmVuY2UgdG9vayBvd25lcnNoaXAgb2YgdGhlbQorICAgICAgICBtUmVsZWFzZUZlbmNlRmRzLmNsZWFyKCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLy8gdGhpcyB2aWRlbyBidWZmZXIgaXMgbm8gbG9uZ2VyIHJlZmVyZW5jZWQgYnkgdGhlIGNvZGVjIChvciBrZXB0IGZvciBsYXRlciBlbmNvZGluZykKKyAgICAvLyBpdCBpcyBub3cgc2FmZSB0byByZWxlYXNlIHRvIHRoZSBwcm9kdWNlcgorICAgIH5BY3F1aXJlZEJ1ZmZlcigpIHsKKyAgICAgICAgLy9tQWNxdWlyYWJsZS5jbGVhcigpOworICAgICAgICBtT25SZWxlYXNlZCh0aGlzKTsKKyAgICAgICAgLy8gbU9uUmVsZWFzZSBtZXRob2Qgc2hvdWxkIGNhbGwgZ2V0UmVsZWFzZUZlbmNlKCkgdGhhdCByZWxlYXNlcyBhbGwgZmRzIGJ1dCBqdXN0IGluIGNhc2UKKyAgICAgICAgQUxPR1dfSUYoIW1SZWxlYXNlRmVuY2VGZHMuZW1wdHkoKSwgInJlbGVhc2UgZmVuY2VzIHdlcmUgbm90IG9idGFpbmVkLCBjbG9zaW5nIGZkcyIpOworICAgICAgICBmb3IgKGludCBmaWxkZXMgOiBtUmVsZWFzZUZlbmNlRmRzKSB7CisgICAgICAgICAgICA6OmNsb3NlKGZpbGRlcyk7CisgICAgICAgICAgICBUUkVTUEFTU19EQkcoKTsKKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8R3JhcGhpY0J1ZmZlclNvdXJjZTo6Q2FjaGVkQnVmZmVyPiBtQnVmZmVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxHcmFwaGljQnVmZmVyU291cmNlOjpDYWNoZWRCdWZmZXI6OkFjcXVpcmFibGU+IG1BY3F1aXJhYmxlOworICAgIHNwPEZlbmNlPiBtQWNxdWlyZUZlbmNlOworICAgIFZlY3RvcjxpbnQ+IG1SZWxlYXNlRmVuY2VGZHM7CisgICAgYm9vbCBtR290UmVsZWFzZUZlbmNlczsKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQWNxdWlyZWRCdWZmZXIgKik+IG1PblJlbGVhc2VkOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHJlbGVhc2UgZmVuY2UgZnJvbSAwIG9yIG1vcmUgcmVsZWFzZSBmZW5jZSBmaWxlIGRlc2NyaXB0b3JzIGluIGZyb20KKyAgICAgKiB0aGUgc3BlY2lmaWVkIHJhbmdlIGluIHRoZSBhcnJheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGFydCBzdGFydCBpbmRleAorICAgICAqIEBwYXJhbSBudW0gICBudW1iZXIgb2YgcmVsZWFzZSBmZHMgdG8gbWVyZ2UKKyAgICAgKi8KKyAgICBzcDxGZW5jZT4gZ2V0UmVsZWFzZUZlbmNlKHNpemVfdCBzdGFydCwgc2l6ZV90IG51bSkgY29uc3QgeworICAgICAgICBpZiAobnVtID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBGZW5jZTo6Tk9fRkVOQ0U7CisgICAgICAgIH0gZWxzZSBpZiAobnVtID09IDEpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmVuY2UobVJlbGVhc2VGZW5jZUZkc1tzdGFydF0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEZlbmNlOjptZXJnZSgiR0JTOjpBQiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlbGVhc2VGZW5jZShzdGFydCwgbnVtID4+IDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZWxlYXNlRmVuY2Uoc3RhcnQgKyAobnVtID4+IDEpLCBudW0gLSAobnVtID4+IDEpKSk7CisgICAgICAgIH0KKyAgICB9Cit9OworCitHcmFwaGljQnVmZmVyU291cmNlOjpHcmFwaGljQnVmZmVyU291cmNlKCkgOgorICAgIG1Jbml0Q2hlY2soVU5LTk9XTl9FUlJPUiksCisgICAgbU51bUF2YWlsYWJsZVVuYWNxdWlyZWRCdWZmZXJzKDApLAorICAgIG1OdW1PdXRzdGFuZGluZ0FjcXVpcmVzKDApLAorICAgIG1FbmRPZlN0cmVhbShmYWxzZSksCisgICAgbUVuZE9mU3RyZWFtU2VudChmYWxzZSksCisgICAgbUxhc3REYXRhc3BhY2UoSEFMX0RBVEFTUEFDRV9VTktOT1dOKSwKKyAgICBtRXhlY3V0aW5nKGZhbHNlKSwKKyAgICBtU3VzcGVuZGVkKGZhbHNlKSwKKyAgICBtTGFzdEZyYW1lVGltZXN0YW1wVXMoLTEpLAorICAgIG1TdG9wVGltZVVzKC0xKSwKKyAgICBtTGFzdEFjdGlvblRpbWVVcygtMWxsKSwKKyAgICBtU2tpcEZyYW1lc0JlZm9yZU5zKC0xbGwpLAorICAgIG1GcmFtZVJlcGVhdEludGVydmFsVXMoLTFsbCksCisgICAgbVJlcGVhdExhc3RGcmFtZUdlbmVyYXRpb24oMCksCisgICAgbU91dHN0YW5kaW5nRnJhbWVSZXBlYXRDb3VudCgwKSwKKyAgICBtRnJhbWVSZXBlYXRCbG9ja2VkT25Db2RlY0J1ZmZlcihmYWxzZSksCisgICAgbUZwcygtMS4wKSwKKyAgICBtQ2FwdHVyZUZwcygtMS4wKSwKKyAgICBtQmFzZUNhcHR1cmVVcygtMWxsKSwKKyAgICBtQmFzZUZyYW1lVXMoLTFsbCksCisgICAgbUZyYW1lQ291bnQoMCksCisgICAgbVByZXZDYXB0dXJlVXMoLTFsbCksCisgICAgbVByZXZGcmFtZVVzKC0xbGwpLAorICAgIG1JbnB1dEJ1ZmZlclRpbWVPZmZzZXRVcygwbGwpIHsKKyAgICBBTE9HVigiR3JhcGhpY0J1ZmZlclNvdXJjZSIpOworCisgICAgU3RyaW5nOCBuYW1lKCJHcmFwaGljQnVmZmVyU291cmNlIik7CisKKyAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJm1Qcm9kdWNlciwgJm1Db25zdW1lcik7CisgICAgbUNvbnN1bWVyLT5zZXRDb25zdW1lck5hbWUobmFtZSk7CisKKyAgICAvLyBOb3RlIHRoYXQgd2UgY2FuJ3QgY3JlYXRlIGFuIHNwPC4uLj4odGhpcykgaW4gYSBjdG9yIHRoYXQgd2lsbCBub3Qga2VlcCBhCisgICAgLy8gcmVmZXJlbmNlIG9uY2UgdGhlIGN0b3IgZW5kcywgYXMgdGhhdCB3b3VsZCBjYXVzZSB0aGUgcmVmY291bnQgb2YgJ3RoaXMnCisgICAgLy8gZHJvcHBpbmcgdG8gMCBhdCB0aGUgZW5kIG9mIHRoZSBjdG9yLiAgU2luY2UgYWxsIHdlIG5lZWQgaXMgYSB3cDwuLi4+CisgICAgLy8gdGhhdCdzIHdoYXQgd2UgY3JlYXRlLgorICAgIHdwPEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyPiBsaXN0ZW5lciA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lcio+KHRoaXMpOworICAgIHNwPElDb25zdW1lckxpc3RlbmVyPiBwcm94eSA9CisgICAgICAgICAgICBuZXcgQnVmZmVyUXVldWU6OlByb3h5Q29uc3VtZXJMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICBtSW5pdENoZWNrID0gbUNvbnN1bWVyLT5jb25zdW1lckNvbm5lY3QocHJveHksIGZhbHNlKTsKKyAgICBpZiAobUluaXRDaGVjayAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiRXJyb3IgY29ubmVjdGluZyB0byBCdWZmZXJRdWV1ZTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLW1Jbml0Q2hlY2spLCBtSW5pdENoZWNrKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1lbXNldCgmbURlZmF1bHRDb2xvckFzcGVjdHNQYWNrZWQsIDAsIHNpemVvZihtRGVmYXVsdENvbG9yQXNwZWN0c1BhY2tlZCkpOworCisgICAgQ0hFQ0sobUluaXRDaGVjayA9PSBOT19FUlJPUik7Cit9CisKK0dyYXBoaWNCdWZmZXJTb3VyY2U6On5HcmFwaGljQnVmZmVyU291cmNlKCkgeworICAgIEFMT0dWKCJ+R3JhcGhpY0J1ZmZlclNvdXJjZSIpOworICAgIHsKKyAgICAgICAgLy8gYWxsIGFjcXVpcmVkIGJ1ZmZlcnMgbXVzdCBiZSBmcmVlZCB3aXRoIHRoZSBtdXRleCBsb2NrZWQgb3RoZXJ3aXNlIG91ciBkZWJ1ZyBhc3NlcnRpb24KKyAgICAgICAgLy8gbWF5IHRyaWdnZXIKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisgICAgICAgIG1BdmFpbGFibGVCdWZmZXJzLmNsZWFyKCk7CisgICAgICAgIG1TdWJtaXR0ZWRDb2RlY0J1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgbUxhdGVzdEJ1ZmZlci5tQnVmZmVyLnJlc2V0KCk7CisgICAgfQorCisgICAgaWYgKG1OdW1PdXRzdGFuZGluZ0FjcXVpcmVzICE9IDApIHsKKyAgICAgICAgQUxPR1coInBvdGVudGlhbCBidWZmZXIgbGVhazogYWNxdWlyZWQ9JWQiLCBtTnVtT3V0c3RhbmRpbmdBY3F1aXJlcyk7CisgICAgICAgIFRSRVNQQVNTX0RCRygpOworICAgIH0KKyAgICBpZiAobUNvbnN1bWVyICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvbnN1bWVyLT5jb25zdW1lckRpc2Nvbm5lY3QoKTsKKyAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR1coImNvbnN1bWVyRGlzY29ubmVjdCBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgfQorICAgIH0KK30KKworU3RhdHVzIEdyYXBoaWNCdWZmZXJTb3VyY2U6OnN0YXJ0KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworICAgIEFMT0dWKCItLT4gc3RhcnQ7IGF2YWlsYWJsZT0lenUsIHN1Ym1pdHRhYmxlPSV6ZCIsCisgICAgICAgICAgICBtQXZhaWxhYmxlQnVmZmVycy5zaXplKCksIG1GcmVlQ29kZWNCdWZmZXJzLnNpemUoKSk7CisgICAgQ0hFQ0soIW1FeGVjdXRpbmcpOworICAgIG1FeGVjdXRpbmcgPSB0cnVlOworICAgIG1MYXN0RGF0YXNwYWNlID0gSEFMX0RBVEFTUEFDRV9VTktOT1dOOworICAgIEFMT0dWKCJjbGVhcmluZyBsYXN0IGRhdGFTcGFjZSIpOworCisgICAgLy8gU3RhcnQgYnkgbG9hZGluZyB1cCBhcyBtYW55IGJ1ZmZlcnMgYXMgcG9zc2libGUuICBXZSB3YW50IHRvIGRvIHRoaXMsCisgICAgLy8gcmF0aGVyIHRoYW4ganVzdCBzdWJtaXQgdGhlIGZpcnN0IGJ1ZmZlciwgdG8gYXZvaWQgYSBkZWdlbmVyYXRlIGNhc2U6CisgICAgLy8gaWYgYWxsIEJRIGJ1ZmZlcnMgYXJyaXZlIGJlZm9yZSB3ZSBzdGFydCBleGVjdXRpbmcsIGFuZCB3ZSBvbmx5IHN1Ym1pdAorICAgIC8vIG9uZSBoZXJlLCB0aGUgb3RoZXIgQlEgYnVmZmVycyB3aWxsIGp1c3Qgc2l0IHVudGlsIHdlIGdldCBub3RpZmllZAorICAgIC8vIHRoYXQgdGhlIGNvZGVjIGJ1ZmZlciBoYXMgYmVlbiByZWxlYXNlZC4gIFdlJ2QgdGhlbiBhY3F1aXJlIGFuZAorICAgIC8vIHN1Ym1pdCBhIHNpbmdsZSBhZGRpdGlvbmFsIGJ1ZmZlciwgcmVwZWF0ZWRseSwgbmV2ZXIgdXNpbmcgbW9yZSB0aGFuCisgICAgLy8gb25lIGNvZGVjIGJ1ZmZlciBzaW11bHRhbmVvdXNseS4gIChXZSBjb3VsZCBpbnN0ZWFkIHRyeSB0byBzdWJtaXQKKyAgICAvLyBhbGwgQlEgYnVmZmVycyB3aGVuZXZlciBhbnkgY29kZWMgYnVmZmVyIGlzIGZyZWVkLCBidXQgaWYgd2UgZ2V0IHRoZQorICAgIC8vIGluaXRpYWwgY29uZGl0aW9ucyByaWdodCB0aGF0IHdpbGwgbmV2ZXIgYmUgdXNlZnVsLikKKyAgICB3aGlsZSAoaGF2ZUF2YWlsYWJsZUJ1ZmZlcnNfbCgpKSB7CisgICAgICAgIGlmICghZmlsbENvZGVjQnVmZmVyX2woKSkgeworICAgICAgICAgICAgQUxPR1YoInN0b3AgbG9hZCB3aXRoIGF2YWlsYWJsZT0lenUrJWQiLAorICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlQnVmZmVycy5zaXplKCksIG1OdW1BdmFpbGFibGVVbmFjcXVpcmVkQnVmZmVycyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJkb25lIGxvYWRpbmcgaW5pdGlhbCBmcmFtZXMsIGF2YWlsYWJsZT0lenUrJWQiLAorICAgICAgICAgICAgbUF2YWlsYWJsZUJ1ZmZlcnMuc2l6ZSgpLCBtTnVtQXZhaWxhYmxlVW5hY3F1aXJlZEJ1ZmZlcnMpOworCisgICAgLy8gSWYgRU9TIGhhcyBhbHJlYWR5IGJlZW4gc2lnbmFsZWQsIGFuZCB0aGVyZSBhcmUgbm8gbW9yZSBmcmFtZXMgdG8KKyAgICAvLyBzdWJtaXQsIHRyeSB0byBzZW5kIEVPUyBub3cgYXMgd2VsbC4KKyAgICBpZiAobVN0b3BUaW1lVXMgPT0gLTEgJiYgbUVuZE9mU3RyZWFtICYmICFoYXZlQXZhaWxhYmxlQnVmZmVyc19sKCkpIHsKKyAgICAgICAgc3VibWl0RW5kT2ZJbnB1dFN0cmVhbV9sKCk7CisgICAgfQorCisgICAgaWYgKG1GcmFtZVJlcGVhdEludGVydmFsVXMgPiAwbGwgJiYgbUxvb3BlciA9PSBOVUxMKSB7CisgICAgICAgIG1SZWZsZWN0b3IgPSBuZXcgQUhhbmRsZXJSZWZsZWN0b3I8R3JhcGhpY0J1ZmZlclNvdXJjZT4odGhpcyk7CisKKyAgICAgICAgbUxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobVJlZmxlY3Rvcik7CisgICAgICAgIG1Mb29wZXItPnN0YXJ0KCk7CisKKyAgICAgICAgaWYgKG1MYXRlc3RCdWZmZXIubUJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBxdWV1ZUZyYW1lUmVwZWF0X2woKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBHcmFwaGljQnVmZmVyU291cmNlOjpzdG9wKCkgeworICAgIEFMT0dWKCJzdG9wIik7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIGlmIChtRXhlY3V0aW5nKSB7CisgICAgICAgIC8vIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIHRyYW5zaXRpb24gZnJvbSBleGVjdXRpbmctPmlkbGUsCisgICAgICAgIC8vIG5vdCBsb2FkZWQtPmlkbGUuCisgICAgICAgIG1FeGVjdXRpbmcgPSBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIEdyYXBoaWNCdWZmZXJTb3VyY2U6OnJlbGVhc2UoKXsKKyAgICBzcDxBTG9vcGVyPiBsb29wZXI7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKyAgICAgICAgbG9vcGVyID0gbUxvb3BlcjsKKyAgICAgICAgaWYgKG1Mb29wZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgbUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobVJlZmxlY3Rvci0+aWQoKSk7CisgICAgICAgICAgICBtUmVmbGVjdG9yLmNsZWFyKCk7CisKKyAgICAgICAgICAgIG1Mb29wZXIuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCItLT4gcmVsZWFzZTsgYXZhaWxhYmxlPSV6dSslZCBlb3M9JWQgZW9zU2VudD0lZCBhY3F1aXJlZD0lZCIsCisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUJ1ZmZlcnMuc2l6ZSgpLCBtTnVtQXZhaWxhYmxlVW5hY3F1aXJlZEJ1ZmZlcnMsCisgICAgICAgICAgICAgICAgbUVuZE9mU3RyZWFtLCBtRW5kT2ZTdHJlYW1TZW50LCBtTnVtT3V0c3RhbmRpbmdBY3F1aXJlcyk7CisKKyAgICAgICAgLy8gQ29kZWMgaXMgbm8gbG9uZ2VyIGV4ZWN1dGluZy4gIFJlbGVhc2luZyBhbGwgYnVmZmVycyB0byBicS4KKyAgICAgICAgbUZyZWVDb2RlY0J1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgbVN1Ym1pdHRlZENvZGVjQnVmZmVycy5jbGVhcigpOworICAgICAgICBtTGF0ZXN0QnVmZmVyLm1CdWZmZXIucmVzZXQoKTsKKyAgICAgICAgbUNvbXBvbmVudC5jbGVhcigpOworICAgICAgICBtRXhlY3V0aW5nID0gZmFsc2U7CisgICAgfQorICAgIGlmIChsb29wZXIgIT0gTlVMTCkgeworICAgICAgICBsb29wZXItPnN0b3AoKTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIEdyYXBoaWNCdWZmZXJTb3VyY2U6Om9uSW5wdXRCdWZmZXJBZGRlZChjb2RlY19idWZmZXJfaWQgYnVmZmVySWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIGlmIChtRXhlY3V0aW5nKSB7CisgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAtLSBidWZmZXJzIGNhbiBvbmx5IGJlIGFsbG9jYXRlZCB3aGVuCisgICAgICAgIC8vIHRyYW5zaXRpb25pbmcgZnJvbSAibG9hZGVkIiB0byAiaWRsZSIuCisgICAgICAgIEFMT0dFKCJhZGRDb2RlY0J1ZmZlcjogYnVmZmVyIGFkZGVkIHdoaWxlIGV4ZWN1dGluZyIpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoSU5WQUxJRF9PUEVSQVRJT04pOworICAgIH0KKworICAgIEFMT0dWKCJhZGRDb2RlY0J1ZmZlcjogYnVmZmVySWQ9JXUiLCBidWZmZXJJZCk7CisKKyAgICBtRnJlZUNvZGVjQnVmZmVycy5wdXNoX2JhY2soYnVmZmVySWQpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBHcmFwaGljQnVmZmVyU291cmNlOjpvbklucHV0QnVmZmVyRW1wdGllZChjb2RlY19idWZmZXJfaWQgYnVmZmVySWQsIGludCBmZW5jZUZkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisgICAgRmlsZURlc2NyaXB0b3I6OkF1dG9jbG9zZSBmZW5jZShmZW5jZUZkKTsKKworICAgIHNzaXplX3QgY2JpID0gbVN1Ym1pdHRlZENvZGVjQnVmZmVycy5pbmRleE9mS2V5KGJ1ZmZlcklkKTsKKyAgICBpZiAoY2JpIDwgMCkgeworICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uCisgICAgICAgIEFMT0dFKCJvbklucHV0QnVmZmVyRW1wdGllZDogYnVmZmVyIG5vdCByZWNvZ25pemVkIChidWZmZXJJZD0ldSkiLCBidWZmZXJJZCk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihCQURfVkFMVUUpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxBY3F1aXJlZEJ1ZmZlcj4gYnVmZmVyID0gbVN1Ym1pdHRlZENvZGVjQnVmZmVycy52YWx1ZUF0KGNiaSk7CisKKyAgICAvLyBNb3ZlIGJ1ZmZlciB0byBhdmFpbGFibGUgYnVmZmVycworICAgIG1TdWJtaXR0ZWRDb2RlY0J1ZmZlcnMucmVtb3ZlSXRlbXNBdChjYmkpOworICAgIG1GcmVlQ29kZWNCdWZmZXJzLnB1c2hfYmFjayhidWZmZXJJZCk7CisKKyAgICAvLyBoZWFkZXItPm5GaWxsZWRMZW4gbWF5IG5vdCBiZSB0aGUgb3JpZ2luYWwgdmFsdWUsIHNvIHdlIGNhbid0IGNvbXBhcmUKKyAgICAvLyB0aGF0IHRvIHplcm8gdG8gc2VlIG9mIHRoaXMgd2FzIHRoZSBFT1MgYnVmZmVyLiAgSW5zdGVhZCB3ZSBqdXN0CisgICAgLy8gc2VlIGlmIHRoZXJlIGlzIGEgbnVsbCBBY3F1aXJlZEJ1ZmZlciwgd2hpY2ggc2hvdWxkIG9ubHkgZXZlciBoYXBwZW4gZm9yIEVPUy4KKyAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKCEobUVuZE9mU3RyZWFtICYmIG1FbmRPZlN0cmVhbVNlbnQpKSB7CisgICAgICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gd2hlbiBicm9rZW4gY29kZSBzZW5kcyB1cyB0aGUgc2FtZSBidWZmZXIgdHdpY2UgaW4gYSByb3cuCisgICAgICAgICAgICBBTE9HRSgib25JbnB1dEJ1ZmZlckVtcHRpZWQ6IG5vbi1FT1MgbnVsbCBidWZmZXIgKGJ1ZmZlcklkPSV1KSIsIGJ1ZmZlcklkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJvbklucHV0QnVmZmVyRW1wdGllZDogRU9TIG51bGwgYnVmZmVyIChidWZmZXJJZD0ldUAlemQpIiwgYnVmZmVySWQsIGNiaSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gTm8gR3JhcGhpY0J1ZmZlciB0byBkZWFsIHdpdGgsIG5vIGFkZGl0aW9uYWwgaW5wdXQgb3Igb3V0cHV0IGlzIGV4cGVjdGVkLCBzbyBqdXN0IHJldHVybi4KKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKEJBRF9WQUxVRSk7CisgICAgfQorCisgICAgaWYgKCFtRXhlY3V0aW5nKSB7CisgICAgICAgIC8vIHRoaXMgaXMgZmluZSBzaW5jZSB0aGlzIGNvdWxkIGhhcHBlbiB3aGVuIGdvaW5nIGZyb20gSWRsZSB0byBMb2FkZWQKKyAgICAgICAgQUxPR1YoIm9uSW5wdXRCdWZmZXJFbXB0aWVkOiBubyBsb25nZXIgZXhlY3V0aW5nIChidWZmZXJJZD0ldUAlemQpIiwgYnVmZmVySWQsIGNiaSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihPSyk7CisgICAgfQorCisgICAgQUxPR1YoIm9uSW5wdXRCdWZmZXJFbXB0aWVkOiBidWZmZXJJZD0lZEAlemQgW3Nsb3Q9JWQsIHVzZUNvdW50PSVsZCwgaGFuZGxlPSVwXSBhY3F1aXJlZD0lZCIsCisgICAgICAgICAgICBidWZmZXJJZCwgY2JpLCBidWZmZXItPmdldFNsb3QoKSwgYnVmZmVyLnVzZV9jb3VudCgpLCBidWZmZXItPmdldEdyYXBoaWNCdWZmZXIoKS0+aGFuZGxlLAorICAgICAgICAgICAgbU51bU91dHN0YW5kaW5nQWNxdWlyZXMpOworCisgICAgYnVmZmVyLT5hZGRSZWxlYXNlRmVuY2VGZChmZW5jZS5yZWxlYXNlKCkpOworICAgIC8vIHJlbGVhc2UgY29kZWMgcmVmZXJlbmNlIGZvciB2aWRlbyBidWZmZXIganVzdCBpbiBjYXNlIHJlbW92ZSBkb2VzIG5vdCBpdAorICAgIGJ1ZmZlci5yZXNldCgpOworCisgICAgaWYgKGhhdmVBdmFpbGFibGVCdWZmZXJzX2woKSkgeworICAgICAgICAvLyBGaWxsIHRoaXMgY29kZWMgYnVmZmVyLgorICAgICAgICBDSEVDSyghbUVuZE9mU3RyZWFtU2VudCk7CisgICAgICAgIEFMT0dWKCJvbklucHV0QnVmZmVyRW1wdGllZDogYnVmZmVyIGZyZWVkLCBmZWVkaW5nIGNvZGVjIChhdmFpbGFibGU9JXp1KyVkLCBlb3M9JWQpIiwKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlQnVmZmVycy5zaXplKCksIG1OdW1BdmFpbGFibGVVbmFjcXVpcmVkQnVmZmVycywgbUVuZE9mU3RyZWFtKTsKKyAgICAgICAgZmlsbENvZGVjQnVmZmVyX2woKTsKKyAgICB9IGVsc2UgaWYgKG1FbmRPZlN0cmVhbSAmJiBtU3RvcFRpbWVVcyA9PSAtMSkgeworICAgICAgICAvLyBObyBmcmFtZXMgYXZhaWxhYmxlLCBidXQgRU9TIGlzIHBlbmRpbmcgYW5kIG5vIHN0b3AgdGltZSwgc28gdXNlIHRoaXMgYnVmZmVyIHRvCisgICAgICAgIC8vIHNlbmQgdGhhdC4KKyAgICAgICAgQUxPR1YoIm9uSW5wdXRCdWZmZXJFbXB0aWVkOiBidWZmZXIgZnJlZWQsIHN1Ym1pdHRpbmcgRU9TIik7CisgICAgICAgIHN1Ym1pdEVuZE9mSW5wdXRTdHJlYW1fbCgpOworICAgIH0gZWxzZSBpZiAobUZyYW1lUmVwZWF0QmxvY2tlZE9uQ29kZWNCdWZmZXIpIHsKKyAgICAgICAgYm9vbCBzdWNjZXNzID0gcmVwZWF0TGF0ZXN0QnVmZmVyX2woKTsKKyAgICAgICAgQUxPR1YoIm9uSW5wdXRCdWZmZXJFbXB0aWVkOiBjb21wbGV0aW5nIGRlZmVycmVkIHJlcGVhdExhdGVzdEJ1ZmZlcl9sICVzIiwKKyAgICAgICAgICAgICAgICBzdWNjZXNzID8gIlNVQ0NFU1MiIDogIkZBSUxVUkUiKTsKKyAgICAgICAgbUZyYW1lUmVwZWF0QmxvY2tlZE9uQ29kZWNCdWZmZXIgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvLyByZWxlYXNlUmVsZWFzYWJsZUJ1ZmZlcnNfbCgpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK3ZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6b25EYXRhc3BhY2VDaGFuZ2VkX2woCisgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFzcGFjZSwgYW5kcm9pZF9waXhlbF9mb3JtYXQgcGl4ZWxGb3JtYXQpIHsKKyAgICBBTE9HRCgiZ290IGJ1ZmZlciB3aXRoIG5ldyBkYXRhU3BhY2UgIyV4IiwgZGF0YXNwYWNlKTsKKyAgICBtTGFzdERhdGFzcGFjZSA9IGRhdGFzcGFjZTsKKworICAgIGlmIChDb2xvclV0aWxzOjpjb252ZXJ0RGF0YVNwYWNlVG9WMChkYXRhc3BhY2UpKSB7CisgICAgICAgIG1Db21wb25lbnQtPmRpc3BhdGNoRGF0YVNwYWNlQ2hhbmdlZCgKKyAgICAgICAgICAgICAgICBtTGFzdERhdGFzcGFjZSwgbURlZmF1bHRDb2xvckFzcGVjdHNQYWNrZWQsIHBpeGVsRm9ybWF0KTsKKyAgICB9Cit9CisKK2Jvb2wgR3JhcGhpY0J1ZmZlclNvdXJjZTo6ZmlsbENvZGVjQnVmZmVyX2woKSB7CisgICAgQ0hFQ0sobUV4ZWN1dGluZyAmJiBoYXZlQXZhaWxhYmxlQnVmZmVyc19sKCkpOworCisgICAgaWYgKG1GcmVlQ29kZWNCdWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gTm8gYnVmZmVycyBhdmFpbGFibGUsIGJhaWwuCisgICAgICAgIEFMT0dWKCJmaWxsQ29kZWNCdWZmZXJfbDogbm8gY29kZWMgYnVmZmVycywgYXZhaWxhYmxlPSV6dSslZCIsCisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUJ1ZmZlcnMuc2l6ZSgpLCBtTnVtQXZhaWxhYmxlVW5hY3F1aXJlZEJ1ZmZlcnMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgVmlkZW9CdWZmZXIgaXRlbTsKKyAgICBpZiAobUF2YWlsYWJsZUJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBBTE9HVigiZmlsbENvZGVjQnVmZmVyX2w6IGFjcXVpcmluZyBhdmFpbGFibGUgYnVmZmVyLCBhdmFpbGFibGU9JXp1KyVkIiwKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlQnVmZmVycy5zaXplKCksIG1OdW1BdmFpbGFibGVVbmFjcXVpcmVkQnVmZmVycyk7CisgICAgICAgIGlmIChhY3F1aXJlQnVmZmVyX2woJml0ZW0pICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiZmlsbENvZGVjQnVmZmVyX2w6IGZhaWxlZCB0byBhY3F1aXJlIGF2YWlsYWJsZSBidWZmZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJmaWxsQ29kZWNCdWZmZXJfbDogZ2V0dGluZyBhdmFpbGFibGUgYnVmZmVyLCBhdmFpbGFibGU9JXp1KyVkIiwKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlQnVmZmVycy5zaXplKCksIG1OdW1BdmFpbGFibGVVbmFjcXVpcmVkQnVmZmVycyk7CisgICAgICAgIGl0ZW0gPSAqbUF2YWlsYWJsZUJ1ZmZlcnMuYmVnaW4oKTsKKyAgICAgICAgbUF2YWlsYWJsZUJ1ZmZlcnMuZXJhc2UobUF2YWlsYWJsZUJ1ZmZlcnMuYmVnaW4oKSk7CisgICAgfQorCisgICAgaW50NjRfdCBpdGVtVGltZVVzID0gaXRlbS5tVGltZXN0YW1wTnMgLyAxMDAwOworCisgICAgLy8gUHJvY2VzcyBBY3Rpb25JdGVtIGluIHRoZSBRdWV1ZSBpZiB0aGVyZSBpcyBhbnkuIElmIGEgYnVmZmVyJ3MgdGltZXN0YW1wCisgICAgLy8gaXMgc21hbGxlciB0aGFuIHRoZSBmaXJzdCBhY3Rpb24ncyB0aW1lc3RhbXAsIG5vIGFjdGlvbiBuZWVkIHRvIGJlIHBlcmZvcm1lZC4KKyAgICAvLyBJZiBidWZmZXIncyB0aW1lc3RhbXAgaXMgbGFyZ2VyIG9yIGVxdWFsIHRoYW4gdGhlIGxhc3QgYWN0aW9uJ3MgdGltZXN0YW1wLAorICAgIC8vIG9ubHkgdGhlIGxhc3QgYWN0aW9uIG5lZWRzIHRvIGJlIHBlcmZvcm1lZCBhcyBhbGwgdGhlIGFjaXRpb25zIGJlZm9yZSB0aGUKKyAgICAvLyB0aGUgYWN0aW9uIGFyZSBvdmVycmlkZGVuIGJ5IHRoZSBsYXN0IGFjdGlvbi4gRm9yIHRoZSBvdGhlciBjYXNlcywgdHJhdmVyc2UKKyAgICAvLyB0aGUgUXVldWUgdG8gZmluZCB0aGUgbmV3ZXN0IGFjdGlvbiB0aGF0IHdpdGggdGltZXN0YW1wIHNtYWxsZXIgb3IgZXF1YWwgdG8KKyAgICAvLyB0aGUgYnVmZmVyJ3MgdGltZXN0YW1wLiBGb3IgZXhhbXBsZSwgYW4gYWN0aW9uIHF1ZXVlIGxpa2UKKyAgICAvLyBbcGF1c2UgMXVzXSwgW3Jlc3VtZSAydXNdLCBbcGF1c2UgM3VzXSwgW3Jlc3VtZSA0dXNdLCBbcGF1c2UgNXVzXS4uLi4gVXBvbgorICAgIC8vIHJlY2VpdmluZyBhIGJ1ZmZlciB3aXRoIHRpbWVzdGFtcCAzLjV1cywgb25seSB0aGUgYWN0aW9uIFtwYXVzZSwgM3VzXSBuZWVkcworICAgIC8vIHRvIGJlIGhhbmRsZWQgYW5kIFtwYXVzZSwgMXVzXSwgW3Jlc3VtZSAydXNdIHdpbGwgYmUgZGlzY2FyZGVkLgorICAgIGJvb2wgZG9uZSA9IGZhbHNlOworICAgIGJvb2wgc2VlU3RvcEFjdGlvbiA9IGZhbHNlOworICAgIGlmICghbUFjdGlvblF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gRmlyc3Qgc2NhbiB0byBjaGVjayBpZiBidWZmZXJUaW1lc3RhbXAgaXMgc21hbGxlciB0aGFuIGZpcnN0IGFjdGlvbidzIHRpbWVzdGFtcC4KKyAgICAgICAgQWN0aW9uSXRlbSBuZXh0QWN0aW9uID0gKihtQWN0aW9uUXVldWUuYmVnaW4oKSk7CisgICAgICAgIGlmIChpdGVtVGltZVVzIDwgbmV4dEFjdGlvbi5tQWN0aW9uVGltZVVzKSB7CisgICAgICAgICAgICBBTE9HVigiTm8gYWN0aW9uLiBidWZmZXIgdGltZXN0YW1wICVsbGQgdXMgPCBhY3Rpb24gdGltZXN0YW1wOiAlbGxkIHVzIiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKWl0ZW1UaW1lVXMsIChsb25nIGxvbmcpbmV4dEFjdGlvbi5tQWN0aW9uVGltZVVzKTsKKyAgICAgICAgICAgIC8vIEFsbCB0aGUgYWN0aW9ucyBhcmUgYWhlYWQuIE5vIGFjdGlvbiBuZWVkIHRvIHBlcmZvcm0gbm93LgorICAgICAgICAgICAgLy8gUmVsZWFzZSB0aGUgYnVmZmVyIGlmIGlzIGluIHN1c3BlbmRlZCBzdGF0ZSwgb3IgcHJvY2VzcyB0aGUgYnVmZmVyCisgICAgICAgICAgICAvLyBpZiBub3QgaW4gc3VzcGVuZGVkIHN0YXRlLgorICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWRvbmUpIHsKKyAgICAgICAgICAgIC8vIEZpbmQgdGhlIG5ld2VzdCBhY3Rpb24gdGhhdCB3aXRoIHRpbWVzdGFtcCBzbWFsbGVyIHRoYW4gaXRlbVRpbWVVcy4gVGhlbgorICAgICAgICAgICAgLy8gcmVtb3ZlIGFsbCB0aGUgYWN0aW9ucyBiZWZvcmUgYW5kIGluY2x1ZGUgdGhlIG5ld2VzdCBhY3Rpb24uCisgICAgICAgICAgICBMaXN0PEFjdGlvbkl0ZW0+OjppdGVyYXRvciBpdCA9IG1BY3Rpb25RdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgd2hpbGUgKGl0ICE9IG1BY3Rpb25RdWV1ZS5lbmQoKSAmJiBpdC0+bUFjdGlvblRpbWVVcyA8PSBpdGVtVGltZVVzCisgICAgICAgICAgICAgICAgICAgICYmIG5leHRBY3Rpb24ubUFjdGlvbiAhPSBBY3Rpb25JdGVtOjpTVE9QKSB7CisgICAgICAgICAgICAgICAgbmV4dEFjdGlvbiA9ICppdDsKKyAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUFjdGlvblF1ZXVlLmVyYXNlKG1BY3Rpb25RdWV1ZS5iZWdpbigpLCBpdCk7CisKKyAgICAgICAgICAgIENIRUNLKGl0ZW1UaW1lVXMgPj0gbmV4dEFjdGlvbi5tQWN0aW9uVGltZVVzKTsKKyAgICAgICAgICAgIHN3aXRjaCAobmV4dEFjdGlvbi5tQWN0aW9uKSB7CisgICAgICAgICAgICAgICAgY2FzZSBBY3Rpb25JdGVtOjpQQVVTRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1TdXNwZW5kZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiUlVOTklORy9QQVVTRSAtPiBQQVVTRSBhdCBidWZmZXIgJWxsZCB1cyAgUEFVU0UgVGltZTogJWxsZCB1cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylpdGVtVGltZVVzLCAobG9uZyBsb25nKW5leHRBY3Rpb24ubUFjdGlvblRpbWVVcyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIEFjdGlvbkl0ZW06OlJFU1VNRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1TdXNwZW5kZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlBBVVNFL1JVTk5JTkcgLT4gUlVOTklORyBhdCBidWZmZXIgJWxsZCB1cyAgUkVTVU1FIFRpbWU6ICVsbGQgdXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpaXRlbVRpbWVVcywgKGxvbmcgbG9uZyluZXh0QWN0aW9uLm1BY3Rpb25UaW1lVXMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBBY3Rpb25JdGVtOjpTVE9QOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlJVTk5JTkcvUEFVU0UgLT4gU1RPUCBhdCBidWZmZXIgJWxsZCB1cyAgU1RPUCBUaW1lOiAlbGxkIHVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWl0ZW1UaW1lVXMsIChsb25nIGxvbmcpbmV4dEFjdGlvbi5tQWN0aW9uVGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIHdob2xlIEFjdGlvblF1ZXVlIGFzIHJlY29yZGluZyBpcyBkb25lCisgICAgICAgICAgICAgICAgICAgIG1BY3Rpb25RdWV1ZS5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBzZWVTdG9wQWN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIFRSRVNQQVNTX0RCRygiVW5rbm93biBhY3Rpb24gdHlwZSIpOworICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdHJ1ZSBoZXJlIGJlY2F1c2Ugd2UgZGlkIGNvbnN1bWUgYW4gYXZhaWxhYmxlIGJ1ZmZlciwgc28gdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGxvb3AgaW4gc3RhcnQgd2lsbCBldmVudHVhbGx5IHRlcm1pbmF0ZSBldmVuIGlmIHdlIGhpdCB0aGlzLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2VlU3RvcEFjdGlvbikgeworICAgICAgICAvLyBDbGVhciBhbGwgdGhlIGJ1ZmZlcnMgYmVmb3JlIHNldHRpbmcgbUVuZE9mU3RyZWFtIGFuZCBzaWduYWwgRW5kT2ZJbnB1dFN0cmVhbS4KKyAgICAgICAgcmVsZWFzZUFsbEF2YWlsYWJsZUJ1ZmZlcnNfbCgpOworICAgICAgICBtRW5kT2ZTdHJlYW0gPSB0cnVlOworICAgICAgICBzdWJtaXRFbmRPZklucHV0U3RyZWFtX2woKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKG1TdXNwZW5kZWQpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaW50IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICAvLyBvbmx5IHN1Ym1pdCBzYW1wbGUgaWYgc3RhcnQgdGltZSBpcyB1bnNwZWNpZmllZCwgb3Igc2FtcGxlCisgICAgLy8gaXMgcXVldWVkIGFmdGVyIHRoZSBzcGVjaWZpZWQgc3RhcnQgdGltZQorICAgIGlmIChtU2tpcEZyYW1lc0JlZm9yZU5zIDwgMGxsIHx8IGl0ZW0ubVRpbWVzdGFtcE5zID49IG1Ta2lwRnJhbWVzQmVmb3JlTnMpIHsKKyAgICAgICAgLy8gaWYgc3RhcnQgdGltZSBpcyBzZXQsIG9mZnNldCB0aW1lIHN0YW1wIGJ5IHN0YXJ0IHRpbWUKKyAgICAgICAgaWYgKG1Ta2lwRnJhbWVzQmVmb3JlTnMgPiAwKSB7CisgICAgICAgICAgICBpdGVtLm1UaW1lc3RhbXBOcyAtPSBtU2tpcEZyYW1lc0JlZm9yZU5zOworICAgICAgICB9CisKKyAgICAgICAgaW50NjRfdCB0aW1lVXMgPSBpdGVtLm1UaW1lc3RhbXBOcyAvIDEwMDA7CisgICAgICAgIGlmIChtRnJhbWVEcm9wcGVyICE9IE5VTEwgJiYgbUZyYW1lRHJvcHBlci0+c2hvdWxkRHJvcCh0aW1lVXMpKSB7CisgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgZnJhbWUgKCVsbGQpIHRvIG1lZXQgbWF4IGZyYW1lcmF0ZSIsIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4odGltZVVzKSk7CisgICAgICAgICAgICAvLyBzZXQgZXJyIHRvIE9LIHNvIHRoYXQgdGhlIHNraXBwZWQgZnJhbWUgY2FuIHN0aWxsIGJlIHNhdmVkIGFzIHRoZSBsYXN0ZXN0IGZyYW1lCisgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVyciA9IHN1Ym1pdEJ1ZmZlcl9sKGl0ZW0pOyAvLyB0aGlzIHRha2VzIHNoYXJlZCBvd25lcnNoaXAgb2YgdGhlIGFjcXVpcmVkIGJ1ZmZlciBvbiBzdWNjZWVzcworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HVigic3VibWl0QnVmZmVyX2wgZmFpbGVkLCB3aWxsIHJlbGVhc2UgYnEgc2xvdCAlZCIsIGl0ZW0ubUJ1ZmZlci0+Z2V0U2xvdCgpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRG9uJ3Qgc2V0IHRoZSBsYXN0IGJ1ZmZlciBpZCBpZiB3ZSdyZSBub3QgcmVwZWF0aW5nLAorICAgICAgICAvLyB3ZSdsbCBiZSBob2xkaW5nIG9uIHRvIHRoZSBsYXN0IGJ1ZmZlciBmb3Igbm90aGluZy4KKyAgICAgICAgaWYgKG1GcmFtZVJlcGVhdEludGVydmFsVXMgPiAwbGwpIHsKKyAgICAgICAgICAgIHNldExhdGVzdEJ1ZmZlcl9sKGl0ZW0pOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJidWZmZXIgc3VibWl0dGVkIFtzbG90PSVkLCB1c2VDb3VudD0lbGRdIGFjcXVpcmVkPSVkIiwKKyAgICAgICAgICAgICAgICBpdGVtLm1CdWZmZXItPmdldFNsb3QoKSwgaXRlbS5tQnVmZmVyLnVzZV9jb3VudCgpLCBtTnVtT3V0c3RhbmRpbmdBY3F1aXJlcyk7CisgICAgICAgIG1MYXN0RnJhbWVUaW1lc3RhbXBVcyA9IGl0ZW1UaW1lVXM7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgR3JhcGhpY0J1ZmZlclNvdXJjZTo6cmVwZWF0TGF0ZXN0QnVmZmVyX2woKSB7CisgICAgQ0hFQ0sobUV4ZWN1dGluZyAmJiAhaGF2ZUF2YWlsYWJsZUJ1ZmZlcnNfbCgpKTsKKworICAgIGlmIChtTGF0ZXN0QnVmZmVyLm1CdWZmZXIgPT0gbnVsbHB0ciB8fCBtU3VzcGVuZGVkKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobUZyZWVDb2RlY0J1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICAvLyBObyBidWZmZXJzIGF2YWlsYWJsZSwgYmFpbC4KKyAgICAgICAgQUxPR1YoInJlcGVhdExhdGVzdEJ1ZmZlcl9sOiBubyBjb2RlYyBidWZmZXJzLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFtTGF0ZXN0QnVmZmVyLm1CdWZmZXItPmlzQ2FjaGVkKCkpIHsKKyAgICAgICAgQUxPR1YoInJlcGVhdExhdGVzdEJ1ZmZlcl9sOiBzbG90IHdhcyBkaXNjYXJkZWQsIGJ1dCByZXBlYXRpbmcgb3VyIG93biByZWZlcmVuY2UiKTsKKyAgICB9CisKKyAgICAvLyBpdCBpcyBvayB0byB1cGRhdGUgdGhlIHRpbWVzdGFtcCBvZiBsYXRlc3QgYnVmZmVyIGFzIGl0IGlzIG9ubHkgdXNlZCBmb3Igc3VibWlzc2lvbgorICAgIHN0YXR1c190IGVyciA9IHN1Ym1pdEJ1ZmZlcl9sKG1MYXRlc3RCdWZmZXIpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qIHJlcGVhdCBsYXN0IGZyYW1lIHVwIHRvIGtSZXBlYXRMYXN0RnJhbWVDb3VudCB0aW1lcy4KKyAgICAgKiBpbiBjYXNlIG9mIHN0YXRpYyBzY2VuZSwgYSBzaW5nbGUgcmVwZWF0IG1pZ2h0IG5vdCBnZXQgcmlkIG9mIGVuY29kZXIKKyAgICAgKiBnaG9zdGluZyBjb21wbGV0ZWx5LCByZWZyZXNoIGEgY291cGxlIG1vcmUgdGltZXMgdG8gZ2V0IGJldHRlciBxdWFsaXR5CisgICAgICovCisgICAgaWYgKC0tbU91dHN0YW5kaW5nRnJhbWVSZXBlYXRDb3VudCA+IDApIHsKKyAgICAgICAgLy8gc2V0IHVwIHRpbWVzdGFtcCBmb3IgcmVwZWF0IGZyYW1lCisgICAgICAgIG1MYXRlc3RCdWZmZXIubVRpbWVzdGFtcE5zICs9IG1GcmFtZVJlcGVhdEludGVydmFsVXMgKiAxMDAwOworICAgICAgICBxdWV1ZUZyYW1lUmVwZWF0X2woKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpzZXRMYXRlc3RCdWZmZXJfbChjb25zdCBWaWRlb0J1ZmZlciAmaXRlbSkgeworICAgIG1MYXRlc3RCdWZmZXIgPSBpdGVtOworCisgICAgQUxPR1YoInNldExhdGVzdEJ1ZmZlcl9sOiBbc2xvdD0lZCwgdXNlQ291bnQ9JWxkXSIsCisgICAgICAgICAgICBtTGF0ZXN0QnVmZmVyLm1CdWZmZXItPmdldFNsb3QoKSwgbUxhdGVzdEJ1ZmZlci5tQnVmZmVyLnVzZV9jb3VudCgpKTsKKworICAgIG1PdXRzdGFuZGluZ0ZyYW1lUmVwZWF0Q291bnQgPSBrUmVwZWF0TGFzdEZyYW1lQ291bnQ7CisgICAgLy8gc2V0IHVwIHRpbWVzdGFtcCBmb3IgcmVwZWF0IGZyYW1lCisgICAgbUxhdGVzdEJ1ZmZlci5tVGltZXN0YW1wTnMgKz0gbUZyYW1lUmVwZWF0SW50ZXJ2YWxVcyAqIDEwMDA7CisgICAgcXVldWVGcmFtZVJlcGVhdF9sKCk7Cit9CisKK3ZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6cXVldWVGcmFtZVJlcGVhdF9sKCkgeworICAgIG1GcmFtZVJlcGVhdEJsb2NrZWRPbkNvZGVjQnVmZmVyID0gZmFsc2U7CisKKyAgICBpZiAobVJlZmxlY3RvciAhPSBOVUxMKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZXBlYXRMYXN0RnJhbWUsIG1SZWZsZWN0b3IpOworICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgKyttUmVwZWF0TGFzdEZyYW1lR2VuZXJhdGlvbik7CisgICAgICAgIG1zZy0+cG9zdChtRnJhbWVSZXBlYXRJbnRlcnZhbFVzKTsKKyAgICB9Cit9CisKK2Jvb2wgR3JhcGhpY0J1ZmZlclNvdXJjZTo6Y2FsY3VsYXRlQ29kZWNUaW1lc3RhbXBfbCgKKyAgICAgICAgbnNlY3NfdCBidWZmZXJUaW1lTnMsIGludDY0X3QgKmNvZGVjVGltZVVzKSB7CisgICAgaW50NjRfdCB0aW1lVXMgPSBidWZmZXJUaW1lTnMgLyAxMDAwOworICAgIHRpbWVVcyArPSBtSW5wdXRCdWZmZXJUaW1lT2Zmc2V0VXM7CisKKyAgICBpZiAobUNhcHR1cmVGcHMgPiAwLgorICAgICAgICAgICAgJiYgKG1GcHMgPiAyICogbUNhcHR1cmVGcHMKKyAgICAgICAgICAgIHx8IG1DYXB0dXJlRnBzID4gMiAqIG1GcHMpKSB7CisgICAgICAgIC8vIFRpbWUgbGFwc2Ugb3Igc2xvdyBtb3Rpb24gbW9kZQorICAgICAgICBpZiAobVByZXZDYXB0dXJlVXMgPCAwbGwpIHsKKyAgICAgICAgICAgIC8vIGZpcnN0IGNhcHR1cmUKKyAgICAgICAgICAgIG1QcmV2Q2FwdHVyZVVzID0gbUJhc2VDYXB0dXJlVXMgPSB0aW1lVXM7CisgICAgICAgICAgICAvLyBhZGp1c3QgdGhlIGZpcnN0IHNhbXBsZSB0aW1lc3RhbXAuCisgICAgICAgICAgICBtUHJldkZyYW1lVXMgPSBtQmFzZUZyYW1lVXMgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6Omxscm91bmQoKHRpbWVVcyAqIG1DYXB0dXJlRnBzKSAvIG1GcHMpOworICAgICAgICAgICAgbUZyYW1lQ291bnQgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gc25hcCB0byBuZWFyZXN0IGNhcHR1cmUgcG9pbnQKKyAgICAgICAgICAgIGRvdWJsZSBuRnJhbWVzID0gKHRpbWVVcyAtIG1QcmV2Q2FwdHVyZVVzKSAqIG1DYXB0dXJlRnBzIC8gMTAwMDAwMDsKKyAgICAgICAgICAgIGlmIChuRnJhbWVzIDwgMC41IC0ga1RpbWVzdGFtcEZsdWN0dWF0aW9uKSB7CisgICAgICAgICAgICAgICAgLy8gc2tpcCB0aGlzIGZyYW1lIGFzIGl0J3MgdG9vIGNsb3NlIHRvIHByZXZpb3VzIGNhcHR1cmUKKyAgICAgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgZnJhbWUsIHRpbWVVcyAlbGxkIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih0aW1lVXMpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobkZyYW1lcyA8PSAxLjApIHsKKyAgICAgICAgICAgICAgICBuRnJhbWVzID0gMS4wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUZyYW1lQ291bnQgKz0gc3RkOjpsbHJvdW5kKG5GcmFtZXMpOworICAgICAgICAgICAgbVByZXZDYXB0dXJlVXMgPSBtQmFzZUNhcHR1cmVVcyArIHN0ZDo6bGxyb3VuZCgKKyAgICAgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQgKiAxMDAwMDAwIC8gbUNhcHR1cmVGcHMpOworICAgICAgICAgICAgbVByZXZGcmFtZVVzID0gbUJhc2VGcmFtZVVzICsgc3RkOjpsbHJvdW5kKAorICAgICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCAqIDEwMDAwMDAgLyBtRnBzKTsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJ0aW1lVXMgJWxsZCwgY2FwdHVyZVVzICVsbGQsIGZyYW1lVXMgJWxsZCIsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih0aW1lVXMpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4obVByZXZDYXB0dXJlVXMpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4obVByZXZGcmFtZVVzKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHRpbWVVcyA8PSBtUHJldkZyYW1lVXMpIHsKKyAgICAgICAgICAgIC8vIERyb3AgdGhlIGZyYW1lIGlmIGl0J3MgZ29pbmcgYmFja3dhcmQgaW4gdGltZS4gQmFkIHRpbWVzdGFtcAorICAgICAgICAgICAgLy8gY291bGQgZGlzcnVwdCBlbmNvZGVyJ3MgcmF0ZSBjb250cm9sIGNvbXBsZXRlbHkuCisgICAgICAgICAgICBBTE9HVygiRHJvcHBpbmcgZnJhbWUgdGhhdCdzIGdvaW5nIGJhY2t3YXJkIGluIHRpbWUiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIG1QcmV2RnJhbWVVcyA9IHRpbWVVczsKKyAgICB9CisKKyAgICAqY29kZWNUaW1lVXMgPSBtUHJldkZyYW1lVXM7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXR1c190IEdyYXBoaWNCdWZmZXJTb3VyY2U6OnN1Ym1pdEJ1ZmZlcl9sKGNvbnN0IFZpZGVvQnVmZmVyICZpdGVtKSB7CisgICAgQ0hFQ0soIW1GcmVlQ29kZWNCdWZmZXJzLmVtcHR5KCkpOworICAgIHVpbnQzMl90IGNvZGVjQnVmZmVySWQgPSAqbUZyZWVDb2RlY0J1ZmZlcnMuYmVnaW4oKTsKKworICAgIEFMT0dWKCJzdWJtaXRCdWZmZXJfbCBbc2xvdD0lZCwgYnVmZmVySWQ9JWRdIiwgaXRlbS5tQnVmZmVyLT5nZXRTbG90KCksIGNvZGVjQnVmZmVySWQpOworCisgICAgaW50NjRfdCBjb2RlY1RpbWVVczsKKyAgICBpZiAoIWNhbGN1bGF0ZUNvZGVjVGltZXN0YW1wX2woaXRlbS5tVGltZXN0YW1wTnMsICZjb2RlY1RpbWVVcykpIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaWYgKChhbmRyb2lkX2RhdGFzcGFjZSlpdGVtLm1EYXRhc3BhY2UgIT0gbUxhc3REYXRhc3BhY2UpIHsKKyAgICAgICAgb25EYXRhc3BhY2VDaGFuZ2VkX2woCisgICAgICAgICAgICAgICAgaXRlbS5tRGF0YXNwYWNlLAorICAgICAgICAgICAgICAgIChhbmRyb2lkX3BpeGVsX2Zvcm1hdClpdGVtLm1CdWZmZXItPmdldEdyYXBoaWNCdWZmZXIoKS0+Zm9ybWF0KTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QWNxdWlyZWRCdWZmZXI+IGJ1ZmZlciA9IGl0ZW0ubUJ1ZmZlcjsKKyAgICAvLyB1c2UgYSBHcmFwaGljQnVmZmVyIGZvciBub3cgYXMgY29tcG9uZW50IGlzIHVzaW5nIEdyYXBoaWNCdWZmZXJzIHRvIGhvbGQgcmVmZXJlbmNlcworICAgIC8vIGFuZCBpdCByZXF1aXJlcyB0aGlzIGdyYXBoaWMgYnVmZmVyIHRvIGJlIGFibGUgdG8gaG9sZCBpdHMgcmVmZXJlbmNlCisgICAgLy8gYW5kIHRodXMgd2Ugd291bGQgbmVlZCB0byBjcmVhdGUgYSBuZXcgR3JhcGhpY0J1ZmZlciBmcm9tIGFuIEFOV0J1ZmZlciBzZXBhcmF0ZSBmcm9tIHRoZQorICAgIC8vIGFjcXVpcmVkIEdyYXBoaWNCdWZmZXIuCisgICAgLy8gVE9ETzogdGhpcyBjYW4gYmUgcmV3b3JrZWQgZ2xvYmFsbHkgdG8gdXNlIEFOV0J1ZmZlciByZWZlcmVuY2VzCisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlciA9IGJ1ZmZlci0+Z2V0R3JhcGhpY0J1ZmZlcigpOworICAgIHN0YXR1c190IGVyciA9IG1Db21wb25lbnQtPnN1Ym1pdEJ1ZmZlcigKKyAgICAgICAgICAgIGNvZGVjQnVmZmVySWQsIGdyYXBoaWNCdWZmZXIsIGNvZGVjVGltZVVzLCBidWZmZXItPmdldEFjcXVpcmVGZW5jZUZkKCkpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HVygiV0FSTklORzogZW1wdHlHcmFwaGljQnVmZmVyIGZhaWxlZDogMHgleCIsIGVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgbUZyZWVDb2RlY0J1ZmZlcnMuZXJhc2UobUZyZWVDb2RlY0J1ZmZlcnMuYmVnaW4oKSk7CisKKyAgICBzc2l6ZV90IGNiaXggPSBtU3VibWl0dGVkQ29kZWNCdWZmZXJzLmFkZChjb2RlY0J1ZmZlcklkLCBidWZmZXIpOworICAgIEFMT0dWKCJlbXB0eUdyYXBoaWNCdWZmZXIgc3VjY2VlZGVkLCBidWZmZXJJZD0ldUAlemQgYnVmaGFuZGxlPSVwIiwKKyAgICAgICAgICAgIGNvZGVjQnVmZmVySWQsIGNiaXgsIGdyYXBoaWNCdWZmZXItPmhhbmRsZSk7CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6OnN1Ym1pdEVuZE9mSW5wdXRTdHJlYW1fbCgpIHsKKyAgICBDSEVDSyhtRW5kT2ZTdHJlYW0pOworICAgIGlmIChtRW5kT2ZTdHJlYW1TZW50KSB7CisgICAgICAgIEFMT0dWKCJFT1MgYWxyZWFkeSBzZW50Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUZyZWVDb2RlY0J1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBBTE9HVigic3VibWl0RW5kT2ZJbnB1dFN0cmVhbV9sOiBubyBjb2RlYyBidWZmZXJzIGF2YWlsYWJsZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHVpbnQzMl90IGNvZGVjQnVmZmVySWQgPSAqbUZyZWVDb2RlY0J1ZmZlcnMuYmVnaW4oKTsKKworICAgIC8vIFdlIHJlamVjdCBhbnkgYWRkaXRpb25hbCBpbmNvbWluZyBncmFwaGljIGJ1ZmZlcnMuIFRoZXJlIGlzIG5vIGFjcXVpcmVkIGJ1ZmZlciB1c2VkIGZvciBFT1MKKyAgICBzdGF0dXNfdCBlcnIgPSBtQ29tcG9uZW50LT5zdWJtaXRFb3MoY29kZWNCdWZmZXJJZCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HVygiZW1wdHlEaXJlY3RCdWZmZXIgRU9TIGZhaWxlZDogMHgleCIsIGVycik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUZyZWVDb2RlY0J1ZmZlcnMuZXJhc2UobUZyZWVDb2RlY0J1ZmZlcnMuYmVnaW4oKSk7CisgICAgICAgIHNzaXplX3QgY2JpeCA9IG1TdWJtaXR0ZWRDb2RlY0J1ZmZlcnMuYWRkKGNvZGVjQnVmZmVySWQsIG51bGxwdHIpOworICAgICAgICBBTE9HVigic3VibWl0RW5kT2ZJbnB1dFN0cmVhbV9sOiBidWZmZXIgc3VibWl0dGVkLCBidWZmZXJJZD0ldUAlemQiLCBjb2RlY0J1ZmZlcklkLCBjYml4KTsKKyAgICAgICAgbUVuZE9mU3RyZWFtU2VudCA9IHRydWU7CisKKyAgICAgICAgLy8gbm8gbmVlZCB0byBob2xkIG9udG8gYW55IGJ1ZmZlcnMgZm9yIGZyYW1lIHJlcGVhdGluZworICAgICAgICArK21SZXBlYXRMYXN0RnJhbWVHZW5lcmF0aW9uOworICAgICAgICBtTGF0ZXN0QnVmZmVyLm1CdWZmZXIucmVzZXQoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEdyYXBoaWNCdWZmZXJTb3VyY2U6OmFjcXVpcmVCdWZmZXJfbChWaWRlb0J1ZmZlciAqYWIpIHsKKyAgICBCdWZmZXJJdGVtIGJpOworICAgIHN0YXR1c190IGVyciA9IG1Db25zdW1lci0+YWNxdWlyZUJ1ZmZlcigmYmksIDApOworICAgIGlmIChlcnIgPT0gQnVmZmVyUXVldWU6Ok5PX0JVRkZFUl9BVkFJTEFCTEUpIHsKKyAgICAgICAgLy8gc2hvdWxkbid0IGhhcHBlbgorICAgICAgICBBTE9HVygiYWNxdWlyZUJ1ZmZlcl9sOiBmcmFtZSB3YXMgbm90IGF2YWlsYWJsZSIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dXKCJhY3F1aXJlQnVmZmVyX2w6IGZhaWxlZCB3aXRoIGVycj0lZCIsIGVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIC0tbU51bUF2YWlsYWJsZVVuYWNxdWlyZWRCdWZmZXJzOworCisgICAgLy8gTWFuYWdlIG91ciBidWZmZXIgY2FjaGUuCisgICAgc3RkOjpzaGFyZWRfcHRyPENhY2hlZEJ1ZmZlcj4gYnVmZmVyOworICAgIHNzaXplX3QgYnNpID0gbUJ1ZmZlclNsb3RzLmluZGV4T2ZLZXkoYmkubVNsb3QpOworICAgIGlmIChiaS5tR3JhcGhpY0J1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgIC8vIHJlcGxhY2UvaW5pdGlhbGl6ZSBzbG90IHdpdGggbmV3IGJ1ZmZlcgorICAgICAgICBBTE9HVigiYWNxdWlyZUJ1ZmZlcl9sOiAlcyBidWZmZXIgc2xvdCAlZCIsIGJzaSA8IDAgPyAic2V0dGluZyIgOiAiVVBEQVRJTkciLCBiaS5tU2xvdCk7CisgICAgICAgIGlmIChic2kgPj0gMCkgeworICAgICAgICAgICAgZGlzY2FyZEJ1ZmZlckF0U2xvdEluZGV4X2woYnNpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJzaSA9IG1CdWZmZXJTbG90cy5hZGQoYmkubVNsb3QsIG51bGxwdHIpOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q2FjaGVkQnVmZmVyPihiaS5tU2xvdCwgYmkubUdyYXBoaWNCdWZmZXIpOworICAgICAgICBtQnVmZmVyU2xvdHMucmVwbGFjZVZhbHVlQXQoYnNpLCBidWZmZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZmZlciA9IG1CdWZmZXJTbG90cy52YWx1ZUF0KGJzaSk7CisgICAgfQorICAgIGludDY0X3QgZnJhbWVOdW0gPSBiaS5tRnJhbWVOdW1iZXI7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QWNxdWlyZWRCdWZmZXI+IGFjcXVpcmVkQnVmZmVyID0KKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxBY3F1aXJlZEJ1ZmZlcj4oCisgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgICAgICAgICAgICAgIFtmcmFtZU51bSwgdGhpc10oQWNxdWlyZWRCdWZmZXIgKmJ1ZmZlcil7CisgICAgICAgICAgICAgICAgICAgIC8vIEFjcXVpcmVkQnVmZmVyJ3MgZGVzdHJ1Y3RvciBzaG91bGQgYWx3YXlzIGJlIGNhbGxlZCB3aGVuIG1NdXRleCBpcyBsb2NrZWQuCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhZCBhIHJlZW50cmFudCBtdXRleCwgd2UgY291bGQganVzdCBsb2NrIGl0IGFnYWluIHRvIGVuc3VyZSB0aGlzLgorICAgICAgICAgICAgICAgICAgICBpZiAobU11dGV4LnRyeUxvY2soKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUUkVTUEFTU19EQkcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1NdXRleC51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbiByZWxlYXNlIGJ1ZmZlcnMgaW1tZWRpYXRlbHkgaWYgbm90IHVzaW5nIGFkYXB0ZXJzCisgICAgICAgICAgICAgICAgICAgIC8vIGFsdGVybmF0ZWx5LCB3ZSBjb3VsZCBhZGQgdGhlbSB0byBtU2xvdHNUb1JlbGVhc2UsIGJ1dCB3ZSB3b3VsZAorICAgICAgICAgICAgICAgICAgICAvLyBzb21laG93IG5lZWQgdG8gcHJvcGFnYXRlIGZyYW1lIG51bWJlciB0byB0aGF0IHF1ZXVlCisgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXItPmlzQ2FjaGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tbU51bU91dHN0YW5kaW5nQWNxdWlyZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+Z2V0U2xvdCgpLCBmcmFtZU51bSwgRUdMX05PX0RJU1BMQVksIEVHTF9OT19TWU5DX0tIUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5nZXRSZWxlYXNlRmVuY2UoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIGJpLm1GZW5jZSk7CisgICAgVmlkZW9CdWZmZXIgdmlkZW9CdWZmZXJ7YWNxdWlyZWRCdWZmZXIsIGJpLm1UaW1lc3RhbXAsIGJpLm1EYXRhU3BhY2V9OworICAgICphYiA9IHZpZGVvQnVmZmVyOworICAgICsrbU51bU91dHN0YW5kaW5nQWNxdWlyZXM7CisgICAgcmV0dXJuIE9LOworfQorCisvLyBCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lciBjYWxsYmFjawordm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0gX191bnVzZWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIEFMT0dWKCJvbkZyYW1lQXZhaWxhYmxlOiBleGVjdXRpbmc9JWQgYXZhaWxhYmxlPSV6dSslZCIsCisgICAgICAgICAgICBtRXhlY3V0aW5nLCBtQXZhaWxhYmxlQnVmZmVycy5zaXplKCksIG1OdW1BdmFpbGFibGVVbmFjcXVpcmVkQnVmZmVycyk7CisgICAgKyttTnVtQXZhaWxhYmxlVW5hY3F1aXJlZEJ1ZmZlcnM7CisKKyAgICAvLyBGb3IgQnVmZmVyUXVldWUgd2UgY2Fubm90IGFjcXVpcmUgYSBidWZmZXIgaWYgd2UgY2Fubm90IGltbWVkaWF0ZWx5IGZlZWQgaXQgdG8gdGhlIGNvZGVjCisgICAgLy8gVU5MRVNTIHdlIGFyZSBkaXNjYXJkaW5nIHRoaXMgYnVmZmVyIChhY3F1aXJpbmcgYW5kIGltbWVkaWF0ZWx5IHJlbGVhc2luZyBpdCksIHdoaWNoIG1ha2VzCisgICAgLy8gdGhpcyBhbiB1Z2x5IGxvZ2ljLgorICAgIC8vIE5PVEU6IFdlIGNvdWxkIGFsc28gcmVseSBvbiBvdXIgZGVidWcgY291bnRlciBidXQgdGhhdCBpcyBtZWFudCBvbmx5IGFzIGEgZGVidWcgY291bnRlci4KKyAgICBpZiAoIWFyZVdlRGlzY2FyZGluZ0F2YWlsYWJsZUJ1ZmZlcnNfbCgpICYmIG1GcmVlQ29kZWNCdWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gd2UgbWF5IG5vdCBiZSBhbGxvd2VkIHRvIGFjcXVpcmUgYSBwb3NzaWJseSBlbmNvZGFibGUgYnVmZmVyLCBzbyBqdXN0IG5vdGUgdGhhdAorICAgICAgICAvLyBpdCBpcyBhdmFpbGFibGUKKyAgICAgICAgQUxPR1YoIm9uRnJhbWVBdmFpbGFibGU6IGNhbm5vdCBhY3F1aXJlIGJ1ZmZlciByaWdodCBub3csIGRvIGl0IGxhdGVyIik7CisKKyAgICAgICAgKyttUmVwZWF0TGFzdEZyYW1lR2VuZXJhdGlvbjsgLy8gY2FuY2VsIGFueSBwZW5kaW5nIGZyYW1lIHJlcGVhdAorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVmlkZW9CdWZmZXIgYnVmZmVyOworICAgIHN0YXR1c190IGVyciA9IGFjcXVpcmVCdWZmZXJfbCgmYnVmZmVyKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJvbkZyYW1lQXZhaWxhYmxlOiBhY3F1aXJlQnVmZmVyIHJldHVybmVkIGVycj0lZCIsIGVycik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb25CdWZmZXJBY3F1aXJlZF9sKGJ1ZmZlcik7CisgICAgfQorfQorCitib29sIEdyYXBoaWNCdWZmZXJTb3VyY2U6OmFyZVdlRGlzY2FyZGluZ0F2YWlsYWJsZUJ1ZmZlcnNfbCgpIHsKKyAgICByZXR1cm4gbUVuZE9mU3RyZWFtU2VudCAvLyBhbHJlYWR5IHNlbnQgRU9TIHRvIGNvZGVjCisgICAgICAgICAgICB8fCBtQ29tcG9uZW50ID09IG51bGxwdHIgLy8gdGhlcmUgaXMgbm8gY29kZWMgY29ubmVjdGVkCisgICAgICAgICAgICB8fCAobVN1c3BlbmRlZCAmJiBtQWN0aW9uUXVldWUuZW1wdHkoKSkgLy8gd2UgYXJlIHN1c3BlbmRlZCBhbmQgbm90IHdhaXRpbmcgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW55IGZ1cnRoZXIgYWN0aW9uCisgICAgICAgICAgICB8fCAhbUV4ZWN1dGluZzsKK30KKwordm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpvbkJ1ZmZlckFjcXVpcmVkX2woY29uc3QgVmlkZW9CdWZmZXIgJmJ1ZmZlcikgeworICAgIGlmIChtRW5kT2ZTdHJlYW1TZW50KSB7CisgICAgICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgcG9zc2libGUgaWYgYSBuZXcgYnVmZmVyIHdhcyBxdWV1ZWQgYWZ0ZXIKKyAgICAgICAgLy8gRU9TIHdhcyBzaWduYWxlZCwgaS5lLiB0aGUgYXBwIGlzIG1pc2JlaGF2aW5nLgorICAgICAgICBBTE9HVygib25GcmFtZUF2YWlsYWJsZTogRU9TIGlzIHNlbnQsIGlnbm9yaW5nIGZyYW1lIik7CisgICAgfSBlbHNlIGlmIChtQ29tcG9uZW50ID09IE5VTEwgfHwgKG1TdXNwZW5kZWQgJiYgbUFjdGlvblF1ZXVlLmVtcHR5KCkpKSB7CisgICAgICAgIC8vIEZJWE1FOiBpZiB3ZSBhcmUgc3VzcGVuZGVkIGJ1dCBoYXZlIGEgcmVzdW1lIHF1ZXVlZCB3ZSB3aWxsIHN0b3AgcmVwZWF0aW5nIHRoZSBsYXN0CisgICAgICAgIC8vIGZyYW1lLiBJcyB0aGF0IHRoZSBkZXNpcmVkIGJlaGF2aW9yPworICAgICAgICBBTE9HVigib25GcmFtZUF2YWlsYWJsZTogc3VzcGVuZGVkLCBpZ25vcmluZyBmcmFtZSIpOworICAgIH0gZWxzZSB7CisgICAgICAgICsrbVJlcGVhdExhc3RGcmFtZUdlbmVyYXRpb247IC8vIGNhbmNlbCBhbnkgcGVuZGluZyBmcmFtZSByZXBlYXQKKyAgICAgICAgbUF2YWlsYWJsZUJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgIGlmIChtRXhlY3V0aW5nKSB7CisgICAgICAgICAgICBmaWxsQ29kZWNCdWZmZXJfbCgpOworICAgICAgICB9CisgICAgfQorfQorCisvLyBCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lciBjYWxsYmFjawordm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpvbkJ1ZmZlcnNSZWxlYXNlZCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOworCisgICAgdWludDY0X3Qgc2xvdE1hc2s7CisgICAgdWludDY0X3QgcmVsZWFzZU1hc2s7CisgICAgaWYgKG1Db25zdW1lci0+Z2V0UmVsZWFzZWRCdWZmZXJzKCZyZWxlYXNlTWFzaykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgc2xvdE1hc2sgPSAweGZmZmZmZmZmZmZmZmZmZmZVTEw7CisgICAgICAgIEFMT0dXKCJvbkJ1ZmZlcnNSZWxlYXNlZDogdW5hYmxlIHRvIGdldCByZWxlYXNlZCBidWZmZXIgc2V0Iik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2xvdE1hc2sgPSByZWxlYXNlTWFzazsKKyAgICAgICAgQUxPR1YoIm9uQnVmZmVyc1JlbGVhc2VkOiAweCUwMTYiIFBSSXg2NCwgc2xvdE1hc2spOworICAgIH0KKworICAgIEFTdHJpbmcgdW5wb3B1bGF0ZWQ7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCdWZmZXJRdWV1ZTo6TlVNX0JVRkZFUl9TTE9UUzsgaSsrKSB7CisgICAgICAgIGlmICgoc2xvdE1hc2sgJiAweDAxKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoIWRpc2NhcmRCdWZmZXJJblNsb3RfbChpKSkgeworICAgICAgICAgICAgICAgIGlmICghdW5wb3B1bGF0ZWQuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICB1bnBvcHVsYXRlZC5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVucG9wdWxhdGVkLmFwcGVuZChpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzbG90TWFzayA+Pj0gMTsKKyAgICB9CisgICAgaWYgKCF1bnBvcHVsYXRlZC5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dXKCJyZWxlYXNlZCB1bnBvcHVsYXRlZCBzbG90czogWyVzXSIsIHVucG9wdWxhdGVkLmNfc3RyKCkpOworICAgIH0KK30KKworYm9vbCBHcmFwaGljQnVmZmVyU291cmNlOjpkaXNjYXJkQnVmZmVySW5TbG90X2woR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2xvdF9pZCBpKSB7CisgICAgc3NpemVfdCBic2kgPSBtQnVmZmVyU2xvdHMuaW5kZXhPZktleShpKTsKKyAgICBpZiAoYnNpIDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGlzY2FyZEJ1ZmZlckF0U2xvdEluZGV4X2woYnNpKTsKKyAgICAgICAgbUJ1ZmZlclNsb3RzLnJlbW92ZUl0ZW1zQXQoYnNpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQorCit2b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6OmRpc2NhcmRCdWZmZXJBdFNsb3RJbmRleF9sKHNzaXplX3QgYnNpKSB7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENhY2hlZEJ1ZmZlcj4mIGJ1ZmZlciA9IG1CdWZmZXJTbG90cy52YWx1ZUF0KGJzaSk7CisgICAgLy8gdXNlIC0yIGlmIHRoZXJlIGlzIG5vIGxhdGVzdCBidWZmZXIsIGFuZCAtMSBpZiBpdCBpcyBubyBsb25nZXIgY2FjaGVkCisgICAgc2xvdF9pZCBsYXRlc3RCdWZmZXJTbG90ID0KKyAgICAgICAgbUxhdGVzdEJ1ZmZlci5tQnVmZmVyID09IG51bGxwdHIgPyAtMiA6IG1MYXRlc3RCdWZmZXIubUJ1ZmZlci0+Z2V0U2xvdCgpOworICAgIEFMT0dWKCJyZWxlYXNpbmcgYWNxdWlyZWQgYnVmZmVyOiBbc2xvdD0lZCwgdXNlQ291bnQ9JWxkXSwgbGF0ZXN0OiBbc2xvdD0lZF0iLAorICAgICAgICAgICAgbUJ1ZmZlclNsb3RzLmtleUF0KGJzaSksIGJ1ZmZlci51c2VfY291bnQoKSwgbGF0ZXN0QnVmZmVyU2xvdCk7CisgICAgbUJ1ZmZlclNsb3RzLnZhbHVlQXQoYnNpKS0+b25Ecm9wcGVkRnJvbUNhY2hlKCk7CisKKyAgICAvLyBJZiB0aGUgc2xvdCBvZiBhbiBhY3F1aXJlZCBidWZmZXIgaXMgZGlzY2FyZGVkLCB0aGF0IGJ1ZmZlciB3aWxsIG5vdCBoYXZlIHRvIGJlCisgICAgLy8gcmVsZWFzZWQgdG8gdGhlIHByb2R1Y2VyLCBzbyBhY2NvdW50IGl0IGhlcmUuIEhvd2V2ZXIsIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlCisgICAgLy8gYWNxdWlyZWQgYnVmZmVyIGhhcyBhbHJlYWR5IGJlZW4gZGlzY2FyZGVkIHNvIGNoZWNrIGlmIGl0IHN0aWxsIGlzLgorICAgIGlmIChidWZmZXItPmlzQWNxdWlyZWQoKSkgeworICAgICAgICAtLW1OdW1PdXRzdGFuZGluZ0FjcXVpcmVzOworICAgIH0KKworICAgIC8vIGNsZWFyIHRoZSBidWZmZXIgcmVmZXJlbmNlIChub3QgdGVjaG5pY2FsbHkgbmVlZGVkIGFzIGNhbGxlciBlaXRoZXIgcmVwbGFjZXMgb3IgZGVsZXRlcworICAgIC8vIGl0OyBkb25lIGhlcmUgZm9yIHNhZmV0eSkuCisgICAgbUJ1ZmZlclNsb3RzLmVkaXRWYWx1ZUF0KGJzaSkucmVzZXQoKTsKKyAgICBDSEVDS19EQkcoYnVmZmVyID09IG51bGxwdHIpOworfQorCit2b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6OnJlbGVhc2VBbGxBdmFpbGFibGVCdWZmZXJzX2woKSB7CisgICAgbUF2YWlsYWJsZUJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3aGlsZSAobU51bUF2YWlsYWJsZVVuYWNxdWlyZWRCdWZmZXJzID4gMCkgeworICAgICAgICBWaWRlb0J1ZmZlciBpdGVtOworICAgICAgICBpZiAoYWNxdWlyZUJ1ZmZlcl9sKCZpdGVtKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coInJlbGVhc2VBbGxBdmFpbGFibGVCdWZmZXJzOiBmYWlsZWQgdG8gYWNxdWlyZSBhdmFpbGFibGUgdW5hY3F1aXJlZCBidWZmZXIiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCisvLyBCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lciBjYWxsYmFjawordm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpvblNpZGViYW5kU3RyZWFtQ2hhbmdlZCgpIHsKKyAgICBBTE9HX0FTU0VSVChmYWxzZSwgIkdyYXBoaWNCdWZmZXJTb3VyY2UgY2FuJ3QgY29uc3VtZSBzaWRlYmFuZCBzdHJlYW1zIik7Cit9CisKK3N0YXR1c190IEdyYXBoaWNCdWZmZXJTb3VyY2U6OmNvbmZpZ3VyZSgKKyAgICAgICAgY29uc3Qgc3A8Q29tcG9uZW50V3JhcHBlcj4mIGNvbXBvbmVudCwKKyAgICAgICAgaW50MzJfdCBkYXRhU3BhY2UsCisgICAgICAgIGludDMyX3QgYnVmZmVyQ291bnQsCisgICAgICAgIHVpbnQzMl90IGZyYW1lV2lkdGgsCisgICAgICAgIHVpbnQzMl90IGZyYW1lSGVpZ2h0LAorICAgICAgICB1aW50MzJfdCBjb25zdW1lclVzYWdlKSB7CisgICAgaWYgKGNvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisKKyAgICAvLyBDYWxsIHNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQgd2l0aG91dCBsb2NrLgorICAgIC8vIHNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQgY291bGQgY2FsbCBiYWNrIHRvIG9uQnVmZmVyc1JlbGVhc2VkCisgICAgLy8gaWYgdGhlIGJ1ZmZlciBjb3VudCBjaGFuZ2UgcmVzdWx0cyBpbiByZWxlYXNpbmcgb2YgZXhpc3RpbmcgYnVmZmVycywKKyAgICAvLyB3aGljaCB3b3VsZCBsZWFkIHRvIGRlYWRsb2NrLgorICAgIHN0YXR1c190IGVyciA9IG1Db25zdW1lci0+c2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudChidWZmZXJDb3VudCk7CisgICAgaWYgKGVyciAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBCUSBtYXggYWNxdWlyZWQgYnVmZmVyIGNvdW50IHRvICV1OiAlZCIsCisgICAgICAgICAgICAgICAgYnVmZmVyQ291bnQsIGVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKyAgICAgICAgbUNvbXBvbmVudCA9IGNvbXBvbmVudDsKKworICAgICAgICBlcnIgPSBtQ29uc3VtZXItPnNldERlZmF1bHRCdWZmZXJTaXplKGZyYW1lV2lkdGgsIGZyYW1lSGVpZ2h0KTsKKyAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgQlEgZGVmYXVsdCBidWZmZXIgc2l6ZSB0byAldXgldTogJWQiLAorICAgICAgICAgICAgICAgICAgICBmcmFtZVdpZHRoLCBmcmFtZUhlaWdodCwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICBjb25zdW1lclVzYWdlIHw9IEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUjsKKyAgICAgICAgbUNvbnN1bWVyLT5zZXRDb25zdW1lclVzYWdlQml0cyhjb25zdW1lclVzYWdlKTsKKworICAgICAgICAvLyBTZXRzIHRoZSBkZWZhdWx0IGJ1ZmZlciBkYXRhIHNwYWNlCisgICAgICAgIEFMT0dEKCJzZXR0aW5nIGRhdGFzcGFjZTogJSN4LCBhY3F1aXJlZD0lZCIsIGRhdGFTcGFjZSwgbU51bU91dHN0YW5kaW5nQWNxdWlyZXMpOworICAgICAgICBtQ29uc3VtZXItPnNldERlZmF1bHRCdWZmZXJEYXRhU3BhY2UoKGFuZHJvaWRfZGF0YXNwYWNlKWRhdGFTcGFjZSk7CisgICAgICAgIG1MYXN0RGF0YXNwYWNlID0gKGFuZHJvaWRfZGF0YXNwYWNlKWRhdGFTcGFjZTsKKworICAgICAgICBtRXhlY3V0aW5nID0gZmFsc2U7CisgICAgICAgIG1TdXNwZW5kZWQgPSBmYWxzZTsKKyAgICAgICAgbUVuZE9mU3RyZWFtID0gZmFsc2U7CisgICAgICAgIG1FbmRPZlN0cmVhbVNlbnQgPSBmYWxzZTsKKyAgICAgICAgbVNraXBGcmFtZXNCZWZvcmVOcyA9IC0xbGw7CisgICAgICAgIG1GcmFtZVJlcGVhdEludGVydmFsVXMgPSAtMWxsOworICAgICAgICBtUmVwZWF0TGFzdEZyYW1lR2VuZXJhdGlvbiA9IDA7CisgICAgICAgIG1PdXRzdGFuZGluZ0ZyYW1lUmVwZWF0Q291bnQgPSAwOworICAgICAgICBtTGF0ZXN0QnVmZmVyLm1CdWZmZXIucmVzZXQoKTsKKyAgICAgICAgbUZyYW1lUmVwZWF0QmxvY2tlZE9uQ29kZWNCdWZmZXIgPSBmYWxzZTsKKyAgICAgICAgbUZwcyA9IC0xLjA7CisgICAgICAgIG1DYXB0dXJlRnBzID0gLTEuMDsKKyAgICAgICAgbUJhc2VDYXB0dXJlVXMgPSAtMWxsOworICAgICAgICBtQmFzZUZyYW1lVXMgPSAtMWxsOworICAgICAgICBtUHJldkNhcHR1cmVVcyA9IC0xbGw7CisgICAgICAgIG1QcmV2RnJhbWVVcyA9IC0xbGw7CisgICAgICAgIG1GcmFtZUNvdW50ID0gMDsKKyAgICAgICAgbUlucHV0QnVmZmVyVGltZU9mZnNldFVzID0gMDsKKyAgICAgICAgbVN0b3BUaW1lVXMgPSAtMTsKKyAgICAgICAgbUFjdGlvblF1ZXVlLmNsZWFyKCk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBHcmFwaGljQnVmZmVyU291cmNlOjpzZXRTdXNwZW5kKGJvb2wgc3VzcGVuZCwgaW50NjRfdCBzdXNwZW5kU3RhcnRUaW1lVXMpIHsKKyAgICBBTE9HVigic2V0U3VzcGVuZD0lZCBhdCB0aW1lICVsbGQgdXMiLCBzdXNwZW5kLCAobG9uZyBsb25nKXN1c3BlbmRTdGFydFRpbWVVcyk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIGlmIChtU3RvcFRpbWVVcyAhPSAtMSkgeworICAgICAgICBBTE9HRSgic2V0U3VzcGVuZCBmYWlsZWQgYXMgU1RPUCBhY3Rpb24gaXMgcGVuZGluZyIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgLy8gUHVzaCB0aGUgYWN0aW9uIHRvIHRoZSBxdWV1ZS4KKyAgICBpZiAoc3VzcGVuZFN0YXJ0VGltZVVzICE9IC0xKSB7CisgICAgICAgIC8vIHN1c3BlbmRTdGFydFRpbWVVcyBtdXN0IGJlIHNtYWxsZXIgb3IgZXF1YWwgdG8gY3VycmVudCBzeXN0ZW1UaW1lLgorICAgICAgICBpbnQ2NF90IGN1cnJlbnRTeXN0ZW1UaW1lVXMgPSBzeXN0ZW1UaW1lKCkgLyAxMDAwOworICAgICAgICBpZiAoc3VzcGVuZFN0YXJ0VGltZVVzID4gY3VycmVudFN5c3RlbVRpbWVVcykgeworICAgICAgICAgICAgQUxPR0UoInNldFN1c3BlbmQgZmFpbGVkLiAlbGxkIGlzIGxhcmdlciB0aGFuIGN1cnJlbnQgc3lzdGVtIHRpbWUgJWxsZCB1cyIsCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpc3VzcGVuZFN0YXJ0VGltZVVzLCAobG9uZyBsb25nKWN1cnJlbnRTeXN0ZW1UaW1lVXMpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIGlmIChtTGFzdEFjdGlvblRpbWVVcyAhPSAtMSAmJiBzdXNwZW5kU3RhcnRUaW1lVXMgPCBtTGFzdEFjdGlvblRpbWVVcykgeworICAgICAgICAgICAgQUxPR0UoInNldFN1c3BlbmQgZmFpbGVkLiAlbGxkIGlzIHNtYWxsZXIgdGhhbiBsYXN0IGFjdGlvbiB0aW1lICVsbGQgdXMiLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXN1c3BlbmRTdGFydFRpbWVVcywgKGxvbmcgbG9uZyltTGFzdEFjdGlvblRpbWVVcyk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgbUxhc3RBY3Rpb25UaW1lVXMgPSBzdXNwZW5kU3RhcnRUaW1lVXM7CisgICAgICAgIEFjdGlvbkl0ZW0gYWN0aW9uOworICAgICAgICBhY3Rpb24ubUFjdGlvbiA9IHN1c3BlbmQgPyBBY3Rpb25JdGVtOjpQQVVTRSA6IEFjdGlvbkl0ZW06OlJFU1VNRTsKKyAgICAgICAgYWN0aW9uLm1BY3Rpb25UaW1lVXMgPSBzdXNwZW5kU3RhcnRUaW1lVXM7CisgICAgICAgIEFMT0dWKCJQdXNoICVzIGFjdGlvbiBpbnRvIGFjdGlvblF1ZXVlIiwgc3VzcGVuZCA/ICJQQVVTRSIgOiAiUkVTVU1FIik7CisgICAgICAgIG1BY3Rpb25RdWV1ZS5wdXNoX2JhY2soYWN0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoc3VzcGVuZCkgeworICAgICAgICAgICAgbVN1c3BlbmRlZCA9IHRydWU7CisgICAgICAgICAgICByZWxlYXNlQWxsQXZhaWxhYmxlQnVmZmVyc19sKCk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU3VzcGVuZGVkID0gZmFsc2U7CisgICAgICAgICAgICBpZiAobUV4ZWN1dGluZyAmJiAhaGF2ZUF2YWlsYWJsZUJ1ZmZlcnNfbCgpCisgICAgICAgICAgICAgICAgICAgICYmIG1GcmFtZVJlcGVhdEJsb2NrZWRPbkNvZGVjQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlcGVhdExhdGVzdEJ1ZmZlcl9sKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoInN1c3BlbmQvZGVmZXJyZWQgcmVwZWF0TGF0ZXN0QnVmZmVyX2wgU1VDQ0VTUyIpOworICAgICAgICAgICAgICAgICAgICBtRnJhbWVSZXBlYXRCbG9ja2VkT25Db2RlY0J1ZmZlciA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzdXNwZW5kL2RlZmVycmVkIHJlcGVhdExhdGVzdEJ1ZmZlcl9sIEZBSUxVUkUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBHcmFwaGljQnVmZmVyU291cmNlOjpzZXRSZXBlYXRQcmV2aW91c0ZyYW1lRGVsYXlVcyhpbnQ2NF90IHJlcGVhdEFmdGVyVXMpIHsKKyAgICBBTE9HVigic2V0UmVwZWF0UHJldmlvdXNGcmFtZURlbGF5VXM6IGRlbGF5VXM9JWxsZCIsIChsb25nIGxvbmcpcmVwZWF0QWZ0ZXJVcyk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIGlmIChtRXhlY3V0aW5nIHx8IHJlcGVhdEFmdGVyVXMgPD0gMGxsKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBtRnJhbWVSZXBlYXRJbnRlcnZhbFVzID0gcmVwZWF0QWZ0ZXJVczsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEdyYXBoaWNCdWZmZXJTb3VyY2U6OnNldFRpbWVPZmZzZXRVcyhpbnQ2NF90IHRpbWVPZmZzZXRVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgLy8gdGltZU9mZnNldFVzIG11c3QgYmUgbmVnYXRpdmUgZm9yIGFkanVzdG1lbnQuCisgICAgaWYgKHRpbWVPZmZzZXRVcyA+PSAwbGwpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIG1JbnB1dEJ1ZmZlclRpbWVPZmZzZXRVcyA9IHRpbWVPZmZzZXRVczsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEdyYXBoaWNCdWZmZXJTb3VyY2U6OnNldE1heEZwcyhmbG9hdCBtYXhGcHMpIHsKKyAgICBBTE9HVigic2V0TWF4RnBzOiBtYXhGcHM9JWxsZCIsIChsb25nIGxvbmcpbWF4RnBzKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgaWYgKG1FeGVjdXRpbmcpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIG1GcmFtZURyb3BwZXIgPSBuZXcgRnJhbWVEcm9wcGVyKCk7CisgICAgc3RhdHVzX3QgZXJyID0gbUZyYW1lRHJvcHBlci0+c2V0TWF4RnJhbWVSYXRlKG1heEZwcyk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBtRnJhbWVEcm9wcGVyLmNsZWFyKCk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBHcmFwaGljQnVmZmVyU291cmNlOjpzZXRTdGFydFRpbWVVcyhpbnQ2NF90IHNraXBGcmFtZXNCZWZvcmVVcykgeworICAgIEFMT0dWKCJzZXRTdGFydFRpbWVVczogc2tpcEZyYW1lc0JlZm9yZVVzPSVsbGQiLCAobG9uZyBsb25nKXNraXBGcmFtZXNCZWZvcmVVcyk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKworICAgIG1Ta2lwRnJhbWVzQmVmb3JlTnMgPQorICAgICAgICAgICAgKHNraXBGcmFtZXNCZWZvcmVVcyA+IDAgJiYgc2tpcEZyYW1lc0JlZm9yZVVzIDw9IElOVDY0X01BWCAvIDEwMDApID8KKyAgICAgICAgICAgIChza2lwRnJhbWVzQmVmb3JlVXMgKiAxMDAwKSA6IC0xbGw7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEdyYXBoaWNCdWZmZXJTb3VyY2U6OnNldFN0b3BUaW1lVXMoaW50NjRfdCBzdG9wVGltZVVzKSB7CisgICAgQUxPR1YoInNldFN0b3BUaW1lVXM6ICVsbGQgdXMiLCAobG9uZyBsb25nKXN0b3BUaW1lVXMpOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgaWYgKG1TdG9wVGltZVVzICE9IC0xKSB7CisgICAgICAgIC8vIElnbm9yZSBpZiBzdG9wIHRpbWUgaGFzIGFscmVhZHkgYmVlbiBzZXQKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIC8vIHN0b3BUaW1lVXMgbXVzdCBiZSBzbWFsbGVyIG9yIGVxdWFsIHRvIGN1cnJlbnQgc3lzdGVtVGltZS4KKyAgICBpbnQ2NF90IGN1cnJlbnRTeXN0ZW1UaW1lVXMgPSBzeXN0ZW1UaW1lKCkgLyAxMDAwOworICAgIGlmIChzdG9wVGltZVVzID4gY3VycmVudFN5c3RlbVRpbWVVcykgeworICAgICAgICBBTE9HRSgic2V0U3RvcFRpbWVVcyBmYWlsZWQuICVsbGQgaXMgbGFyZ2VyIHRoYW4gY3VycmVudCBzeXN0ZW0gdGltZSAlbGxkIHVzIiwKKyAgICAgICAgICAgIChsb25nIGxvbmcpc3RvcFRpbWVVcywgKGxvbmcgbG9uZyljdXJyZW50U3lzdGVtVGltZVVzKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBpZiAobUxhc3RBY3Rpb25UaW1lVXMgIT0gLTEgJiYgc3RvcFRpbWVVcyA8IG1MYXN0QWN0aW9uVGltZVVzKSB7CisgICAgICAgIEFMT0dFKCJzZXRTdXNwZW5kIGZhaWxlZC4gJWxsZCBpcyBzbWFsbGVyIHRoYW4gbGFzdCBhY3Rpb24gdGltZSAlbGxkIHVzIiwKKyAgICAgICAgICAgIChsb25nIGxvbmcpc3RvcFRpbWVVcywgKGxvbmcgbG9uZyltTGFzdEFjdGlvblRpbWVVcyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgbUxhc3RBY3Rpb25UaW1lVXMgPSBzdG9wVGltZVVzOworICAgIEFjdGlvbkl0ZW0gYWN0aW9uOworICAgIGFjdGlvbi5tQWN0aW9uID0gQWN0aW9uSXRlbTo6U1RPUDsKKyAgICBhY3Rpb24ubUFjdGlvblRpbWVVcyA9IHN0b3BUaW1lVXM7CisgICAgbUFjdGlvblF1ZXVlLnB1c2hfYmFjayhhY3Rpb24pOworICAgIG1TdG9wVGltZVVzID0gc3RvcFRpbWVVczsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEdyYXBoaWNCdWZmZXJTb3VyY2U6OmdldFN0b3BUaW1lT2Zmc2V0VXMoaW50NjRfdCAqc3RvcFRpbWVPZmZzZXRVcykgeworICAgIEFMT0dWKCJnZXRTdG9wVGltZU9mZnNldFVzIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisgICAgaWYgKG1TdG9wVGltZVVzID09IC0xKSB7CisgICAgICAgIEFMT0dXKCJGYWlsIHRvIHJldHVybiBzdG9wVGltZU9mZnNldFVzIGFzIHN0b3AgdGltZSBpcyBub3Qgc2V0Iik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgKnN0b3BUaW1lT2Zmc2V0VXMgPQorICAgICAgICBtTGFzdEZyYW1lVGltZXN0YW1wVXMgPT0gLTEgPyAwIDogbVN0b3BUaW1lVXMgLSBtTGFzdEZyYW1lVGltZXN0YW1wVXM7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBHcmFwaGljQnVmZmVyU291cmNlOjpzZXRUaW1lTGFwc2VDb25maWcoZG91YmxlIGZwcywgZG91YmxlIGNhcHR1cmVGcHMpIHsKKyAgICBBTE9HVigic2V0VGltZUxhcHNlQ29uZmlnOiBmcHM9JWxnLCBjYXB0dXJlRnBzPSVsZyIsCisgICAgICAgICAgICBmcHMsIGNhcHR1cmVGcHMpOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgaWYgKG1FeGVjdXRpbmcgfHwgIShmcHMgPiAwKSB8fCAhKGNhcHR1cmVGcHMgPiAwKSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgbUZwcyA9IGZwczsKKyAgICBtQ2FwdHVyZUZwcyA9IGNhcHR1cmVGcHM7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEdyYXBoaWNCdWZmZXJTb3VyY2U6OnNldENvbG9yQXNwZWN0cyhpbnQzMl90IGFzcGVjdHNQYWNrZWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKyAgICBtRGVmYXVsdENvbG9yQXNwZWN0c1BhY2tlZCA9IGFzcGVjdHNQYWNrZWQ7CisgICAgQ29sb3JBc3BlY3RzIGNvbG9yQXNwZWN0cyA9IENvbG9yVXRpbHM6OnVucGFja1RvQ29sb3JBc3BlY3RzKGFzcGVjdHNQYWNrZWQpOworICAgIEFMT0dEKCJyZXF1ZXN0aW5nIGNvbG9yIGFzcGVjdHMgKFI6JWQoJXMpLCBQOiVkKCVzKSwgTTolZCglcyksIFQ6JWQoJXMpKSIsCisgICAgICAgICAgICBjb2xvckFzcGVjdHMubVJhbmdlLCBhc1N0cmluZyhjb2xvckFzcGVjdHMubVJhbmdlKSwKKyAgICAgICAgICAgIGNvbG9yQXNwZWN0cy5tUHJpbWFyaWVzLCBhc1N0cmluZyhjb2xvckFzcGVjdHMubVByaW1hcmllcyksCisgICAgICAgICAgICBjb2xvckFzcGVjdHMubU1hdHJpeENvZWZmcywgYXNTdHJpbmcoY29sb3JBc3BlY3RzLm1NYXRyaXhDb2VmZnMpLAorICAgICAgICAgICAgY29sb3JBc3BlY3RzLm1UcmFuc2ZlciwgYXNTdHJpbmcoY29sb3JBc3BlY3RzLm1UcmFuc2ZlcikpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBHcmFwaGljQnVmZmVyU291cmNlOjpzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworICAgIEFMT0dWKCJzaWduYWxFbmRPZklucHV0U3RyZWFtOiBleGVjdXRpbmc9JWQgYXZhaWxhYmxlPSV6dSslZCBlb3M9JWQiLAorICAgICAgICAgICAgbUV4ZWN1dGluZywgbUF2YWlsYWJsZUJ1ZmZlcnMuc2l6ZSgpLCBtTnVtQXZhaWxhYmxlVW5hY3F1aXJlZEJ1ZmZlcnMsIG1FbmRPZlN0cmVhbSk7CisKKyAgICBpZiAobUVuZE9mU3RyZWFtKSB7CisgICAgICAgIEFMT0dFKCJFT1Mgd2FzIGFscmVhZHkgc2lnbmFsZWQiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIC8vIFNldCB0aGUgZW5kLW9mLXN0cmVhbSBmbGFnLiAgSWYgbm8gZnJhbWVzIGFyZSBwZW5kaW5nIGZyb20gdGhlCisgICAgLy8gQnVmZmVyUXVldWUsIGFuZCBhIGNvZGVjIGJ1ZmZlciBpcyBhdmFpbGFibGUsIGFuZCB3ZSdyZSBleGVjdXRpbmcsCisgICAgLy8gYW5kIHRoZXJlIGlzIG5vIHN0b3AgdGltZXN0YW1wLCB3ZSBpbml0aWF0ZSB0aGUgRU9TIGZyb20gaGVyZS4KKyAgICAvLyBPdGhlcndpc2UsIHdlJ2xsIGxldCBjb2RlY0J1ZmZlckVtcHRpZWQoKSAob3Igc3RhcnQpIGRvIGl0LgorICAgIC8vCisgICAgLy8gTm90ZTogaWYgdGhlcmUgYXJlIG5vIHBlbmRpbmcgZnJhbWVzIGFuZCBhbGwgY29kZWMgYnVmZmVycyBhcmUKKyAgICAvLyBhdmFpbGFibGUsIHdlICptdXN0KiBzdWJtaXQgdGhlIEVPUyBmcm9tIGhlcmUgb3Igd2UnbGwganVzdAorICAgIC8vIHN0YWxsIHNpbmNlIG5vIGZ1dHVyZSBldmVudHMgYXJlIGV4cGVjdGVkLgorICAgIG1FbmRPZlN0cmVhbSA9IHRydWU7CisKKyAgICBpZiAobVN0b3BUaW1lVXMgPT0gLTEgJiYgbUV4ZWN1dGluZyAmJiAhaGF2ZUF2YWlsYWJsZUJ1ZmZlcnNfbCgpKSB7CisgICAgICAgIHN1Ym1pdEVuZE9mSW5wdXRTdHJlYW1fbCgpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdFJlcGVhdExhc3RGcmFtZToKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisKKyAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKworICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT0gbVJlcGVhdExhc3RGcmFtZUdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICAvLyBzdGFsZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIW1FeGVjdXRpbmcgfHwgaGF2ZUF2YWlsYWJsZUJ1ZmZlcnNfbCgpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgc3VjY2VzcyA9IHJlcGVhdExhdGVzdEJ1ZmZlcl9sKCk7CisgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJyZXBlYXRMYXRlc3RCdWZmZXJfbCBTVUNDRVNTIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dWKCJyZXBlYXRMYXRlc3RCdWZmZXJfbCBGQUlMVVJFIik7CisgICAgICAgICAgICAgICAgbUZyYW1lUmVwZWF0QmxvY2tlZE9uQ29kZWNCdWZmZXIgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9XUHJvZHVjZXJMaXN0ZW5lci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9XUHJvZHVjZXJMaXN0ZW5lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNhMTNiZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL1dQcm9kdWNlckxpc3RlbmVyLmNwcApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dQcm9kdWNlckxpc3RlbmVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gVFdQcm9kdWNlckxpc3RlbmVyCitUV1Byb2R1Y2VyTGlzdGVuZXI6OlRXUHJvZHVjZXJMaXN0ZW5lcigKKyAgICAgICAgc3A8QlByb2R1Y2VyTGlzdGVuZXI+IGNvbnN0JiBiYXNlKToKKyAgICBtQmFzZShiYXNlKSB7Cit9CisKK1JldHVybjx2b2lkPiBUV1Byb2R1Y2VyTGlzdGVuZXI6Om9uQnVmZmVyUmVsZWFzZWQoKSB7CisgICAgbUJhc2UtPm9uQnVmZmVyUmVsZWFzZWQoKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48Ym9vbD4gVFdQcm9kdWNlckxpc3RlbmVyOjpuZWVkc1JlbGVhc2VOb3RpZnkoKSB7CisgICAgcmV0dXJuIG1CYXNlLT5uZWVkc1JlbGVhc2VOb3RpZnkoKTsKK30KKworLy8gTFdQcm9kdWNlckxpc3RlbmVyCitMV1Byb2R1Y2VyTGlzdGVuZXI6OkxXUHJvZHVjZXJMaXN0ZW5lcigKKyAgICAgICAgc3A8SFByb2R1Y2VyTGlzdGVuZXI+IGNvbnN0JiBiYXNlKToKKyAgICBtQmFzZShiYXNlKSB7Cit9CisKK3ZvaWQgTFdQcm9kdWNlckxpc3RlbmVyOjpvbkJ1ZmZlclJlbGVhc2VkKCkgeworICAgIG1CYXNlLT5vbkJ1ZmZlclJlbGVhc2VkKCk7Cit9CisKK2Jvb2wgTFdQcm9kdWNlckxpc3RlbmVyOjpuZWVkc1JlbGVhc2VOb3RpZnkoKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KG1CYXNlLT5uZWVkc1JlbGVhc2VOb3RpZnkoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0NvbXBvbmVudFdyYXBwZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29tcG9uZW50V3JhcHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNzgyOWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0NvbXBvbmVudFdyYXBwZXIuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT01QT05FTlRfV1JBUFBFUl9IXworI2RlZmluZSBDT01QT05FTlRfV1JBUFBFUl9IXworCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQ29tcG9uZW50V3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1Ym1pdEJ1ZmZlcigKKyAgICAgICAgICAgIGludDMyX3QgYnVmZmVySWQsIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+ICZidWZmZXIgPSBudWxscHRyLAorICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAgPSAwLCBpbnQgZmVuY2VGZCA9IC0xKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdWJtaXRFb3MoaW50MzJfdCBidWZmZXJJZCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERhdGFTcGFjZUNoYW5nZWQoCisgICAgICAgICAgICBpbnQzMl90IGRhdGFTcGFjZSwgaW50MzJfdCBhc3BlY3RzLCBpbnQzMl90IHBpeGVsRm9ybWF0KSA9IDA7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPTVBPTkVOVF9XUkFQUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0NvbnZlcnNpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZDhjMWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0NvbnZlcnNpb24uaApAQCAtMCwwICsxLDc2OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfU1RBR0VGUklHSFRfQlFIRUxQRVJfQ09OVkVSU0lPTl9IXworI2RlZmluZSBNRURJQV9TVEFHRUZSSUdIVF9CUUhFTFBFUl9DT05WRVJTSU9OX0hfCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bGlzdD4KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPGhpZGxtZW1vcnkvbWFwcGluZy5oPgorCisjaW5jbHVkZSA8YmluZGVyL0JpbmRlci5oPgorI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KKyNpbmNsdWRlIDx1aS9GZW5jZVRpbWUuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21lbW9yeS8xLjAvSU1lbW9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMS4wL0lQcm9kdWNlckxpc3RlbmVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjb252ZXJzaW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOwordXNpbmcgOjphbmRyb2lkOjpzdGF0dXNfdDsKKwordXNpbmcgOjphbmRyb2lkOjpTdHJpbmc4OworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6VjFfMDo6UmVjdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpWMV8wOjpSZWdpb247CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OkRhdGFzcGFjZTsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQ7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpWMV8wOjpBbndCdWZmZXI7Cit1c2luZyA6OmFuZHJvaWQ6OkdyYXBoaWNCdWZmZXI7CisKK3R5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyCisgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit0eXBlZGVmIDo6YW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcgorICAgICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworCisvLyBuYXRpdmVfaGFuZGxlX3QgaGVscGVyIGZ1bmN0aW9ucy4KKworLyoqCisgKiBcYnJpZWYgVGFrZSBhbiBmZCBhbmQgY3JlYXRlIGEgbmF0aXZlIGhhbmRsZSBjb250YWluaW5nIG9ubHkgdGhlIGdpdmVuIGZkLgorICogVGhlIGNyZWF0ZWQgaGFuZGxlIHdpbGwgbmVlZCB0byBiZSBkZWxldGVkIG1hbnVhbGx5IHdpdGgKKyAqIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYC4KKyAqCisgKiBccGFyYW1baW5dIGZkIFRoZSBzb3VyY2UgZmlsZSBkZXNjcmlwdG9yIChvZiB0eXBlIGBpbnRgKS4KKyAqIFxyZXR1cm4gVGhlIGNyZWF0ZSBgbmF0aXZlX2hhbmRsZV90KmAgdGhhdCBjb250YWlucyB0aGUgZ2l2ZW4gXHAgZmQuIElmIHRoZQorICogc3VwcGxpZWQgXHAgZmQgaXMgbmVnYXRpdmUsIHRoZSBjcmVhdGVkIG5hdGl2ZSBoYW5kbGUgd2lsbCBjb250YWluIG5vIGZpbGUKKyAqIGRlc2NyaXB0b3JzLgorICoKKyAqIElmIHRoZSBuYXRpdmUgaGFuZGxlIGNhbm5vdCBiZSBjcmVhdGVkLCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUKKyAqIGBudWxscHRyYC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGR1cGxpY2F0ZSB0aGUgZmlsZSBkZXNjcmlwdG9yLgorICovCituYXRpdmVfaGFuZGxlX3QqIG5hdGl2ZV9oYW5kbGVfY3JlYXRlX2Zyb21fZmQoaW50IGZkKTsKKworLyoqCisgKiBcYnJpZWYgRXh0cmFjdCBhIGZpbGUgZGVzY3JpcHRvciBmcm9tIGEgbmF0aXZlIGhhbmRsZS4KKyAqCisgKiBccGFyYW1baW5dIG5oIFRoZSBzb3VyY2UgYG5hdGl2ZV9oYW5kbGVfdCpgLgorICogXHBhcmFtW2luXSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGZpbGUgZGVzY3JpcHRvciBpbiBccCBuaCB0byByZWFkIGZyb20uIFRoaXMKKyAqIGlucHV0IGhhcyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBgMGAuCisgKiBccmV0dXJuIFRoZSBgaW5kZXhgLXRoIGZpbGUgZGVzY3JpcHRvciBpbiBccCBuaC4gSWYgXHAgbmggZG9lcyBub3QgaGF2ZQorICogZW5vdWdoIGZpbGUgZGVzY3JpcHRvcnMsIHRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlIGAtMWAuCisgKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBkdXBsaWNhdGUgdGhlIGZpbGUgZGVzY3JpcHRvci4KKyAqLworaW50IG5hdGl2ZV9oYW5kbGVfcmVhZF9mZChuYXRpdmVfaGFuZGxlX3QgY29uc3QqIG5oLCBpbnQgaW5kZXggPSAwKTsKKworLyoqCisgKiBDb252ZXJzaW9uIGZ1bmN0aW9ucworICogPT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGVyZSBhcmUgdHdvIG1haW4gZGlyZWN0aW9ucyBvZiBjb252ZXJzaW9uOgorICogLSBgaW5UYXJnZXRUeXBlKC4uLilgOiBDcmVhdGUgYSB3cmFwcGVyIHdob3NlIGxpZmV0aW1lIGRlcGVuZHMgb24gdGhlCisgKiAgIGlucHV0LiBUaGUgd3JhcHBlciBoYXMgdHlwZSBgVGFyZ2V0VHlwZWAuCisgKiAtIGB0b1RhcmdldFR5cGUoLi4uKWA6IENyZWF0ZSBhIHN0YW5kYWxvbmUgb2JqZWN0IG9mIHR5cGUgYFRhcmdldFR5cGVgIHRoYXQKKyAqICAgY29ycmVzcG9uZHMgdG8gdGhlIGlucHV0LiBUaGUgbGlmZXRpbWUgb2YgdGhlIG91dHB1dCBkb2VzIG5vdCBkZXBlbmQgb24gdGhlCisgKiAgIGxpZmV0aW1lIG9mIHRoZSBpbnB1dC4KKyAqIC0gYHdyYXBJbihUYXJnZXRUeXBlKiwgLi4uKWA6IFNhbWUgYXMgYGluVGFyZ2V0VHlwZSgpYCwgYnV0IGZvciBgVGFyZ2V0VHlwZWAKKyAqICAgdGhhdCBjYW5ub3QgYmUgY29waWVkIGFuZC9vciBtb3ZlZCBlZmZpY2llbnRseSwgb3Igd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUKKyAqICAgb3V0cHV0IGFyZ3VtZW50cy4KKyAqIC0gYGNvbnZlcnRUbyhUYXJnZXRUeXBlKiwgLi4uKWA6IFNhbWUgYXMgYHRvVGFyZ2V0VHlwZSgpYCwgYnV0IGZvcgorICogICBgVGFyZ2V0VHlwZWAgdGhhdCBjYW5ub3QgYmUgY29waWVkIGFuZC9vciBtb3ZlZCBlZmZpY2llbnRseSwgb3Igd2hlbiB0aGVyZQorICogICBhcmUgbXVsdGlwbGUgb3V0cHV0IGFyZ3VtZW50cy4KKyAqCisgKiBgd3JhcEluKClgIGFuZCBgY29udmVydFRvKClgIGZ1bmN0aW9ucyB3aWxsIHRha2Ugb3V0cHV0IGFyZ3VtZW50cyBiZWZvcmUKKyAqIGlucHV0IGFyZ3VtZW50cy4gU29tZSBvZiB0aGVzZSBmdW5jdGlvbnMgbWlnaHQgcmV0dXJuIGEgdmFsdWUgdG8gaW5kaWNhdGUKKyAqIHN1Y2Nlc3Mgb3IgZXJyb3IuCisgKgorICogSW4gY29udmVydGluZyBvciB3cmFwcGluZyBzb21ldGhpbmcgYXMgYSBUcmVibGUgdHlwZSB0aGF0IGNvbnRhaW5zIGEKKyAqIGBoaWRsX2hhbmRsZWAsIGBuYXRpdmVfaGFuZGxlX3QqYCB3aWxsIG5lZWQgdG8gYmUgY3JlYXRlZCBhbmQgcmV0dXJuZWQgYXMKKyAqIGFuIGFkZGl0aW9uYWwgb3V0cHV0IGFyZ3VtZW50LCBoZW5jZSBvbmx5IGB3cmFwSW4oKWAgb3IgYGNvbnZlcnRUbygpYCB3b3VsZAorICogYmUgYXZhaWxhYmxlLiBUaGUgY2FsbGVyIG11c3QgY2FsbCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAgdG8gZGVhbGxvY2F0ZSB0aGUKKyAqIHJldHVybmVkIG5hdGl2ZSBoYW5kbGUgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkLgorICoKKyAqIEZvciB0eXBlcyB0aGF0IGNvbnRhaW4gZmlsZSBkZXNjcmlwdG9ycywgYGluVGFyZ2V0VHlwZSgpYCBhbmQgYHdyYXBBcygpYCBkbworICogbm90IHBlcmZvcm0gZHVwbGljYXRpb24gb2YgZmlsZSBkZXNjcmlwdG9ycywgd2hpbGUgYHRvVGFyZ2V0VHlwZSgpYCBhbmQKKyAqIGBjb252ZXJ0VG8oKWAgZG8uCisgKi8KKworLyoqCisgKiBcYnJpZWYgQ29udmVydCBgUmV0dXJuPHZvaWQ+YCB0byBgYmluZGVyOjpTdGF0dXNgLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBSZXR1cm48dm9pZD5gLgorICogXHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBgYmluZGVyOjpTdGF0dXNgLgorICovCisvLyBjb252ZXJ0OiBSZXR1cm48dm9pZD4gLT4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cworOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyB0b0JpbmRlclN0YXR1cyhSZXR1cm48dm9pZD4gY29uc3QmIHQpOworCisvKioKKyAqIFxicmllZiBDb252ZXJ0IGBSZXR1cm48dm9pZD5gIHRvIGBzdGF0dXNfdGAuIFRoaXMgaXMgZm9yIGxlZ2FjeSBiaW5kZXIgY2FsbHMuCisgKgorICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYFJldHVybjx2b2lkPmAuCisgKiBccmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGBzdGF0dXNfdGAuCisgKi8KKy8vIGNvbnZlcnQ6IFJldHVybjx2b2lkPiAtPiBzdGF0dXNfdAorc3RhdHVzX3QgdG9TdGF0dXNUKFJldHVybjx2b2lkPiBjb25zdCYgdCk7CisKKy8qKgorICogXGJyaWVmIFdyYXAgYG5hdGl2ZV9oYW5kbGVfdCpgIGluIGBoaWRsX2hhbmRsZWAuCisgKgorICogXHBhcmFtW2luXSBuaCBUaGUgc291cmNlIGBuYXRpdmVfaGFuZGxlX3QqYC4KKyAqIFxyZXR1cm4gVGhlIGBoaWRsX2hhbmRsZWAgdGhhdCBwb2ludHMgdG8gXHAgbmguCisgKi8KKy8vIHdyYXA6IG5hdGl2ZV9oYW5kbGVfdCogLT4gaGlkbF9oYW5kbGUKK2hpZGxfaGFuZGxlIGluSGlkbEhhbmRsZShuYXRpdmVfaGFuZGxlX3QgY29uc3QqIG5oKTsKKworLyoqCisgKiBcYnJpZWYgQ29udmVydCBgaW50MzJfdGAgdG8gYERhdGFzcGFjZWAuCisgKgorICogXHBhcmFtW2luXSBsIFRoZSBzb3VyY2UgYGludDMyX3RgLgorICogXHJlc3VsdCBUaGUgY29ycmVzcG9uZGluZyBgRGF0YXNwYWNlYC4KKyAqLworLy8gY29udmVydDogaW50MzJfdCAtPiBEYXRhc3BhY2UKK0RhdGFzcGFjZSB0b0hhcmR3YXJlRGF0YXNwYWNlKGludDMyX3QgbCk7CisKKy8qKgorICogXGJyaWVmIENvbnZlcnQgYERhdGFzcGFjZWAgdG8gYGludDMyX3RgLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBEYXRhc3BhY2VgLgorICogXHJlc3VsdCBUaGUgY29ycmVzcG9uZGluZyBgaW50MzJfdGAuCisgKi8KKy8vIGNvbnZlcnQ6IERhdGFzcGFjZSAtPiBpbnQzMl90CitpbnQzMl90IHRvUmF3RGF0YXNwYWNlKERhdGFzcGFjZSBjb25zdCYgdCk7CisKKy8qKgorICogXGJyaWVmIFdyYXAgYW4gb3BhcXVlIGJ1ZmZlciBpbnNpZGUgYSBgaGlkbF92ZWM8dWludDhfdD5gLgorICoKKyAqIFxwYXJhbVtpbl0gbCBUaGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvcGFxdWUgYnVmZmVyLgorICogXHBhcmFtW2luXSBzaXplIFRoZSBzaXplIG9mIHRoZSBidWZmZXIuCisgKiBccmV0dXJuIEEgYGhpZGxfdmVjPHVpbnQ4X3Q+YCB0aGF0IHBvaW50cyB0byB0aGUgYnVmZmVyLgorICovCisvLyB3cmFwOiB2b2lkKiwgc2l6ZV90IC0+IGhpZGxfdmVjPHVpbnQ4X3Q+CitoaWRsX3ZlYzx1aW50OF90PiBpbkhpZGxCeXRlcyh2b2lkIGNvbnN0KiBsLCBzaXplX3Qgc2l6ZSk7CisKKy8qKgorICogXGJyaWVmIENyZWF0ZSBhIGBoaWRsX3ZlYzx1aW50OF90PmAgdGhhdCBpcyBhIGNvcHkgb2YgYW4gb3BhcXVlIGJ1ZmZlci4KKyAqCisgKiBccGFyYW1baW5dIGwgVGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3BhcXVlIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbl0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyLgorICogXHJldHVybiBBIGBoaWRsX3ZlYzx1aW50OF90PmAgdGhhdCBpcyBhIGNvcHkgb2YgdGhlIGlucHV0IGJ1ZmZlci4KKyAqLworLy8gY29udmVydDogdm9pZCosIHNpemVfdCAtPiBoaWRsX3ZlYzx1aW50OF90PgoraGlkbF92ZWM8dWludDhfdD4gdG9IaWRsQnl0ZXModm9pZCBjb25zdCogbCwgc2l6ZV90IHNpemUpOworCisvKioKKyAqIFxicmllZiBXcmFwIGBHcmFwaGljQnVmZmVyYCBpbiBgQW53QnVmZmVyYC4KKyAqCisgKiBccGFyYW1bb3V0XSB0IFRoZSB3cmFwcGVyIG9mIHR5cGUgYEFud0J1ZmZlcmAuCisgKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgR3JhcGhpY0J1ZmZlcmAuCisgKi8KKy8vIHdyYXA6IEdyYXBoaWNCdWZmZXIgLT4gQW53QnVmZmVyCit2b2lkIHdyYXBBcyhBbndCdWZmZXIqIHQsIEdyYXBoaWNCdWZmZXIgY29uc3QmIGwpOworCisvKioKKyAqIFxicmllZiBDb252ZXJ0IGBBbndCdWZmZXJgIHRvIGBHcmFwaGljQnVmZmVyYC4KKyAqCisgKiBccGFyYW1bb3V0XSBsIFRoZSBkZXN0aW5hdGlvbiBgR3JhcGhpY0J1ZmZlcmAuCisgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgQW53QnVmZmVyYC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZHVwbGljYXRlIGFsbCBmaWxlIGRlc2NyaXB0b3JzIGluIFxwIHQuCisgKi8KKy8vIGNvbnZlcnQ6IEFud0J1ZmZlciAtPiBHcmFwaGljQnVmZmVyCisvLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvdWkvR3JhcGhpY0J1ZmZlci5jcHA6IEdyYXBoaWNCdWZmZXI6OmZsYXR0ZW4KK2Jvb2wgY29udmVydFRvKEdyYXBoaWNCdWZmZXIqIGwsIEFud0J1ZmZlciBjb25zdCYgdCk7CisKKy8qKgorICogQ29udmVyc2lvbiBmdW5jdGlvbnMgZm9yIHR5cGVzIG91dHNpZGUgbWVkaWEKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogU29tZSBvYmplY3RzIGluIGxpYnVpIGFuZCBsaWJndWkgdGhhdCB3ZXJlIG1hZGUgdG8gZ28gdGhyb3VnaCBiaW5kZXIgY2FsbHMgZG8KKyAqIG5vdCBleHBvc2Ugd2F5cyB0byByZWFkIG9yIHdyaXRlIHRoZWlyIGZpZWxkcyB0byB0aGUgcHVibGljLiBUbyBwYXNzIGFuCisgKiBvYmplY3Qgb2YgdGhpcyBraW5kIHRocm91Z2ggdGhlIEhJREwgYm91bmRhcnksIHRyYW5zbGF0aW9uIGZ1bmN0aW9ucyBuZWVkIHRvCisgKiB3b3JrIGFyb3VuZCB0aGUgYWNjZXNzIHJlc3RyaWN0aW9uIGJ5IHVzaW5nIHRoZSBwdWJsaWNseSBhdmFpbGFibGUKKyAqIGBmbGF0dGVuKClgIGFuZCBgdW5mbGF0dGVuKClgIGZ1bmN0aW9ucy4KKyAqCisgKiBBbGwgYGZsYXR0ZW4oKWAgYW5kIGB1bmZsYXR0ZW4oKWAgb3ZlcmxvYWRzIGZvbGxvdyB0aGUgc2FtZSBjb252ZW50aW9uIGFzCisgKiBmb2xsb3dzOgorICoKKyAqICAgICBzdGF0dXNfdCBmbGF0dGVuKE9iamVjdFR5cGUgY29uc3QmIG9iamVjdCwKKyAqICAgICAgICAgICAgICAgICAgICAgIFtPdGhlclR5cGUgY29uc3QmIG90aGVyLCAuLi5dCisgKiAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUsCisgKiAgICAgICAgICAgICAgICAgICAgICBpbnQqJiBmZHMsIHNpemVfdCYgbnVtRmRzKQorICoKKyAqICAgICBzdGF0dXNfdCB1bmZsYXR0ZW4oT2JqZWN0VHlwZSogb2JqZWN0LAorICogICAgICAgICAgICAgICAgICAgICAgICBbT3RoZXJUeXBlKiBvdGhlciwgLi4uLF0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLAorICogICAgICAgICAgICAgICAgICAgICAgICBpbnQqJiBmZHMsIHNpemVfdCYgbnVtRmRzKQorICoKKyAqIFRoZSBudW1iZXIgb2YgYG90aGVyYCBwYXJhbWV0ZXJzIHZhcmllcyBkZXBlbmRpbmcgb24gdGhlIGBPYmplY3RUeXBlYC4gRm9yCisgKiBleGFtcGxlLCBpbiB0aGUgcHJvY2VzcyBvZiB1bmZsYXR0ZW5pbmcgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMKKyAqIGBoaWRsX2hhbmRsZWAsIGBvdGhlcmAgaXMgbmVlZGVkIHRvIGhvbGQgYG5hdGl2ZV9oYW5kbGVfdGAgb2JqZWN0cyB0aGF0IHdpbGwKKyAqIGJlIGNyZWF0ZWQuCisgKgorICogVGhlIGxhc3QgZm91ciBwYXJhbWV0ZXJzIGFsd2F5cyB3b3JrIHRoZSBzYW1lIHdheSBpbiBhbGwgb3ZlcmxvYWRzIG9mCisgKiBgZmxhdHRlbigpYCBhbmQgYHVuZmxhdHRlbigpYDoKKyAqIC0gRm9yIGBmbGF0dGVuKClgLCBgYnVmZmVyYCBpcyB0aGUgcG9pbnRlciB0byB0aGUgbm9uLWZkIGJ1ZmZlciB0byBiZSBmaWxsZWQsCisgKiAgIGBzaXplYCBpcyB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSBub24tZmQgYnVmZmVyIHBvaW50ZWQgdG8gYnkgYGJ1ZmZlcmAsCisgKiAgIGBmZHNgIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBmZCBidWZmZXIgdG8gYmUgZmlsbGVkLCBhbmQgYG51bUZkc2AgaXMgdGhlCisgKiAgIHNpemUgKGluIGludHMpIG9mIHRoZSBmZCBidWZmZXIgcG9pbnRlZCB0byBieSBgZmRzYC4KKyAqIC0gRm9yIGB1bmZsYXR0ZW4oKWAsIGBidWZmZXJgIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBub24tZmQgYnVmZmVyIHRvIGJlIHJlYWQKKyAqICAgZnJvbSwgYHNpemVgIGlzIHRoZSBzaXplIChpbiBieXRlcykgb2YgdGhlIG5vbi1mZCBidWZmZXIgcG9pbnRlZCB0byBieQorICogICBgYnVmZmVyYCwgYGZkc2AgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIGZkIGJ1ZmZlciB0byBiZSByZWFkIGZyb20sIGFuZAorICogICBgbnVtRmRzYCBpcyB0aGUgc2l6ZSAoaW4gaW50cykgb2YgdGhlIGZkIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IGBmZHNgLgorICogLSBBZnRlciBhIHN1Y2Nlc3NmdWwgY2FsbCB0byBgZmxhdHRlbigpYCBvciBgdW5mbGF0dGVuKClgLCBgYnVmZmVyYCBhbmQgYGZkc2AKKyAqICAgd2lsbCBiZSBhZHZhbmNlZCwgd2hpbGUgYHNpemVgIGFuZCBgbnVtRmRzYCB3aWxsIGJlIGRlY3JlYXNlZCB0byByZWZsZWN0CisgKiAgIGhvdyBtdWNoIHN0b3JhZ2UvZGF0YSBvZiB0aGUgdHdvIGJ1ZmZlcnMgKGZkIGFuZCBub24tZmQpIGhhdmUgYmVlbiB1c2VkLgorICogLSBBZnRlciBhbiB1bnN1Y2Nlc3NmdWwgY2FsbCwgdGhlIHZhbHVlcyBvZiBgYnVmZmVyYCwgYHNpemVgLCBgZmRzYCBhbmQKKyAqICAgYG51bUZkc2AgYXJlIGludmFsaWQuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBvZiBhIHN1Y2Nlc3NmdWwgYGZsYXR0ZW4oKWAgb3IgYHVuZmxhdHRlbigpYCBjYWxsIHdpbGwgYmUKKyAqIGBPS2AgKGFsc28gYWxpYXNlZCBhcyBgTk9fRVJST1JgKS4gQW55IG90aGVyIHZhbHVlcyBpbmRpY2F0ZSBhIGZhaWx1cmUuCisgKgorICogRm9yIGVhY2ggb2JqZWN0IHR5cGUgdGhhdCBzdXBwb3J0cyBmbGF0dGVuaW5nLCB0aGVyZSB3aWxsIGJlIHR3byBhY2NvbXBhbnlpbmcKKyAqIGZ1bmN0aW9uczogYGdldEZsYXR0ZW5lZFNpemUoKWAgYW5kIGBnZXRGZENvdW50KClgLiBgZ2V0RmxhdHRlbmVkU2l6ZSgpYCB3aWxsCisgKiByZXR1cm4gdGhlIHNpemUgb2YgdGhlIG5vbi1mZCBidWZmZXIgdGhhdCB0aGUgb2JqZWN0IHdpbGwgbmVlZCBmb3IKKyAqIGZsYXR0ZW5pbmcuIGBnZXRGZENvdW50KClgIHdpbGwgcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBmZCBidWZmZXIgdGhhdCB0aGUKKyAqIG9iamVjdCB3aWxsIG5lZWQgZm9yIGZsYXR0ZW5pbmcuCisgKgorICogVGhlIHNldCBvZiB0aGVzZSBmb3VyIGZ1bmN0aW9ucywgYGdldEZsYXR0ZW5lZFNpemUoKWAsIGBnZXRGZENvdW50KClgLAorICogYGZsYXR0ZW4oKWAgYW5kIGB1bmZsYXR0ZW4oKWAsIGFyZSBzaW1pbGFyIHRvIGZ1bmN0aW9ucyBvZiB0aGUgc2FtZSBuYW1lIGluCisgKiB0aGUgYWJzdHJhY3QgY2xhc3MgYEZsYXR0ZW5hYmxlYC4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGF0IGZ1bmN0aW9ucyBpbgorICogdGhpcyBmaWxlIGFyZSBub3QgbWVtYmVyIGZ1bmN0aW9ucyBvZiB0aGUgb2JqZWN0IHR5cGUuIEZvciBleGFtcGxlLCB3ZSB3cml0ZQorICoKKyAqICAgICBmbGF0dGVuKHgsIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpCisgKgorICogaW5zdGVhZCBvZgorICoKKyAqICAgICB4LmZsYXR0ZW4oYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcykKKyAqCisgKiBiZWNhdXNlIHdlIGNhbm5vdCBtb2RpZnkgdGhlIHR5cGUgb2YgYHhgLgorICoKKyAqIFRoZXJlIGlzIG9uZSBleGNlcHRpb24gdG8gdGhlIG5hbWluZyBjb252ZW50aW9uOiBgaGlkbF9oYW5kbGVgIHRoYXQKKyAqIHJlcHJlc2VudHMgYSBmZW5jZS4gVGhlIGZvdXIgZnVuY3Rpb25zIGZvciB0aGlzICJGZW5jZSIgdHlwZSBoYXZlIHRoZSB3b3JkCisgKiAiRmVuY2UiIGF0dGNoZWQgdG8gdGhlaXIgbmFtZXMgYmVjYXVzZSB0aGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzCisgKiBgaGlkbF9oYW5kbGVgLCBkb2VzIG5vdCBjYXJyeSB0aGUgc3BlY2lhbCBtZWFuaW5nIHRoYXQgdGhlIG9iamVjdCBpdHNlbGYgY2FuCisgKiBvbmx5IGNvbnRhaW4gemVybyBvciBvbmUgZmlsZSBkZXNjcmlwdG9yLgorICovCisKKy8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy91aS9GZW5jZS5jcHAKKworLyoqCisgKiBcYnJpZWYgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub24tZmQgYnVmZmVyIHJlcXVpcmVkIHRvIGZsYXR0ZW4gYSBmZW5jZS4KKyAqCisgKiBccGFyYW1baW5dIGZlbmNlIFRoZSBpbnB1dCBmZW5jZSBvZiB0eXBlIGBoaWRsX2hhbmRsZWAuCisgKiBccmV0dXJuIFRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KKyAqCisgKiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgNCwgd2hpY2ggaXMgdGhlIG51bWJlciBvZgorICogYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiB0aGUgZmQKKyAqIHBhcnQgb2YgdGhlIGZsYXQgYnVmZmVyLgorICovCitzaXplX3QgZ2V0RmVuY2VGbGF0dGVuZWRTaXplKGhpZGxfaGFuZGxlIGNvbnN0JiBmZW5jZSk7CisKKy8qKgorICogXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIGEgZmVuY2UuCisgKgorICogXHBhcmFtW2luXSBmZW5jZSBUaGUgaW5wdXQgZmVuY2Ugb2YgdHlwZSBgaGlkbF9oYW5kbGVgLgorICogXHJldHVybiBgMGAgaWYgXHAgZmVuY2UgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvciwgb3IgYDFgCisgKiBvdGhlcndpc2UuCisgKi8KK3NpemVfdCBnZXRGZW5jZUZkQ291bnQoaGlkbF9oYW5kbGUgY29uc3QmIGZlbmNlKTsKKworLyoqCisgKiBcYnJpZWYgVW5mbGF0dGVuIGBGZW5jZWAgdG8gYGhpZGxfaGFuZGxlYC4KKyAqCisgKiBccGFyYW1bb3V0XSBmZW5jZSBUaGUgZGVzdGluYXRpb24gYGhpZGxfaGFuZGxlYC4KKyAqIFxwYXJhbVtvdXRdIG5oIFRoZSB1bmRlcmx5aW5nIG5hdGl2ZSBoYW5kbGUuCisgKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCisgKgorICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBgTk9fRVJST1JgLCBccCBuaCB3aWxsIHBvaW50IHRvIGEgbmV3bHkgY3JlYXRlZAorICogbmF0aXZlIGhhbmRsZSwgd2hpY2ggbmVlZHMgdG8gYmUgZGVsZXRlZCB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYAorICogYWZ0ZXJ3YXJkcy4KKyAqLworc3RhdHVzX3QgdW5mbGF0dGVuRmVuY2UoaGlkbF9oYW5kbGUqIGZlbmNlLCBuYXRpdmVfaGFuZGxlX3QqKiBuaCwKKyAgICAgICAgdm9pZCBjb25zdComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQgY29uc3QqJiBmZHMsIHNpemVfdCYgbnVtRmRzKTsKKworLyoqCisgKiBcYnJpZWYgRmxhdHRlbiBgaGlkbF9oYW5kbGVgIGFzIGBGZW5jZWAuCisgKgorICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYGhpZGxfaGFuZGxlYC4KKyAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCisgKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KKyAqLworc3RhdHVzX3QgZmxhdHRlbkZlbmNlKGhpZGxfaGFuZGxlIGNvbnN0JiBmZW5jZSwKKyAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQqJiBmZHMsIHNpemVfdCYgbnVtRmRzKTsKKworLyoqCisgKiBcYnJpZWYgV3JhcCBgRmVuY2VgIGluIGBoaWRsX2hhbmRsZWAuCisgKgorICogXHBhcmFtW291dF0gdCBUaGUgd3JhcHBlciBvZiB0eXBlIGBoaWRsX2hhbmRsZWAuCisgKiBccGFyYW1bb3V0XSBuaCBUaGUgbmF0aXZlIGhhbmRsZSBwb2ludGVkIHRvIGJ5IFxwIHQuCisgKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgRmVuY2VgLgorICoKKyAqIE9uIHN1Y2Nlc3MsIFxwIG5oIHdpbGwgaG9sZCBhIG5ld2x5IGNyZWF0ZWQgbmF0aXZlIGhhbmRsZSwgd2hpY2ggbXVzdCBiZQorICogZGVsZXRlZCBtYW51YWxseSB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYCBhZnRlcndhcmRzLgorICovCisvLyB3cmFwOiBGZW5jZSAtPiBoaWRsX2hhbmRsZQorYm9vbCB3cmFwQXMoaGlkbF9oYW5kbGUqIHQsIG5hdGl2ZV9oYW5kbGVfdCoqIG5oLCBGZW5jZSBjb25zdCYgbCk7CisKKy8qKgorICogXGJyaWVmIENvbnZlcnQgYGhpZGxfaGFuZGxlYCB0byBgRmVuY2VgLgorICoKKyAqIFxwYXJhbVtvdXRdIGwgVGhlIGRlc3RpbmF0aW9uIGBGZW5jZWAuIGBsYCBtdXN0IG5vdCBoYXZlIGJlZW4gdXNlZAorICogKGBsLT5pc1ZhbGlkKClgIG11c3QgcmV0dXJuIGBmYWxzZWApIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KKyAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBoaWRsX2hhbmRsZWAuCisgKgorICogSWYgXHAgdCBjb250YWlucyBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvciwgaXQgd2lsbCBiZSBkdXBsaWNhdGVkLgorICovCisvLyBjb252ZXJ0OiBoaWRsX2hhbmRsZSAtPiBGZW5jZQorYm9vbCBjb252ZXJ0VG8oRmVuY2UqIGwsIGhpZGxfaGFuZGxlIGNvbnN0JiB0KTsKKworLy8gUmVmOiBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL3VpL0ZlbmNlVGltZS5jcHA6IEZlbmNlVGltZTo6U25hcHNob3QKKworLyoqCisgKiBcYnJpZWYgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub24tZmQgYnVmZmVyIHJlcXVpcmVkIHRvIGZsYXR0ZW4KKyAqIGBGZW5jZVRpbWVTbmFwc2hvdGAuCisgKgorICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgRmVuY2VUaW1lU25hcHNob3RgLgorICogXHJldHVybiBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCisgKi8KK3NpemVfdCBnZXRGbGF0dGVuZWRTaXplKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90IGNvbnN0JiB0KTsKKworLyoqCisgKiBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4KKyAqIGBGZW5jZVRpbWVTbmFwc2hvdGAuCisgKgorICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgRmVuY2VUaW1lU25hcHNob3RgLgorICogXHJldHVybiBUaGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHNuYXBzaG90LgorICovCitzaXplX3QgZ2V0RmRDb3VudChIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdCBjb25zdCYgdCk7CisKKy8qKgorICogXGJyaWVmIEZsYXR0ZW4gYEZlbmNlVGltZVNuYXBzaG90YC4KKyAqCisgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgRmVuY2VUaW1lU25hcHNob3RgLgorICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KKyAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgdGhlIGZpbGUgZGVzY3JpcHRvciBpbiBgdC5mZW5jZWAgaWYgYHQuc3RhdGUgPT0KKyAqIEZFTkNFYC4KKyAqLworc3RhdHVzX3QgZmxhdHRlbihIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdCBjb25zdCYgdCwKKyAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQqJiBmZHMsIHNpemVfdCYgbnVtRmRzKTsKKworLyoqCisgKiBcYnJpZWYgVW5mbGF0dGVuIGBGZW5jZVRpbWVTbmFwc2hvdGAuCisgKgorICogXHBhcmFtW291dF0gdCBUaGUgZGVzdGluYXRpb24gYEZlbmNlVGltZVNuYXBzaG90YC4KKyAqIFxwYXJhbVtvdXRdIG5oIFRoZSB1bmRlcmx5aW5nIG5hdGl2ZSBoYW5kbGUuCisgKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCisgKgorICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBgTk9fRVJST1JgIGFuZCB0aGUgY29uc3RydWN0ZWQgc25hcHNob3QgY29udGFpbnMgYQorICogZmlsZSBkZXNjcmlwdG9yLCBccCBuaCB3aWxsIGJlIGNyZWF0ZWQgdG8gaG9sZCB0aGF0IGZpbGUgZGVzY3JpcHRvci4gSW4gdGhpcworICogY2FzZSwgXHAgbmggbmVlZHMgdG8gYmUgZGVsZXRlZCB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYCBhZnRlcndhcmRzLgorICovCitzdGF0dXNfdCB1bmZsYXR0ZW4oCisgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90KiB0LCBuYXRpdmVfaGFuZGxlX3QqKiBuaCwKKyAgICAgICAgdm9pZCBjb25zdComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQgY29uc3QqJiBmZHMsIHNpemVfdCYgbnVtRmRzKTsKKworLy8gUmVmOiBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL2d1aS9GcmFtZVRpbWVzdGFtcHMuY3BwOiBGcmFtZUV2ZW50c0RlbHRhCisKKy8qKgorICogXGJyaWVmIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbm9uLWZkIGJ1ZmZlciByZXF1aXJlZCB0byBmbGF0dGVuCisgKiBgRnJhbWVFdmVudHNEZWx0YWAuCisgKgorICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgRnJhbWVFdmVudHNEZWx0YWAuCisgKiBccmV0dXJuIFRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KKyAqLworc2l6ZV90IGdldEZsYXR0ZW5lZFNpemUoSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudHNEZWx0YSBjb25zdCYgdCk7CisKKy8qKgorICogXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluCisgKiBgRnJhbWVFdmVudHNEZWx0YWAuCisgKgorICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgRnJhbWVFdmVudHNEZWx0YWAuCisgKiBccmV0dXJuIFRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gXHAgdC4KKyAqLworc2l6ZV90IGdldEZkQ291bnQoSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudHNEZWx0YSBjb25zdCYgdCk7CisKKy8qKgorICogXGJyaWVmIFVuZmxhdHRlbiBgRnJhbWVFdmVudHNEZWx0YWAuCisgKgorICogXHBhcmFtW291dF0gdCBUaGUgZGVzdGluYXRpb24gYEZyYW1lRXZlbnRzRGVsdGFgLgorICogXHBhcmFtW291dF0gbmggVGhlIHVuZGVybHlpbmcgYXJyYXkgb2YgbmF0aXZlIGhhbmRsZXMuCisgKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCisgKgorICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBgTk9fRVJST1JgLCBccCBuaCB3aWxsIGhhdmUgbGVuZ3RoIDQsIGFuZCBpdCB3aWxsIGJlCisgKiBwb3B1bGF0ZWQgd2l0aCBgbnVsbHB0cmAgb3IgbmV3bHkgY3JlYXRlZCBoYW5kbGVzLiBFYWNoIG5vbi1udWxsIHNsb3QgaW4gXHAKKyAqIG5oIHdpbGwgbmVlZCB0byBiZSBkZWxldGVkIG1hbnVhbGx5IHdpdGggYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgLgorICovCitzdGF0dXNfdCB1bmZsYXR0ZW4oSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudHNEZWx0YSogdCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4qIG5oLAorICAgICAgICB2b2lkIGNvbnN0KiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludCBjb25zdComIGZkcywgc2l6ZV90JiBudW1GZHMpOworCisvKioKKyAqIFxicmllZiBGbGF0dGVuIGBGcmFtZUV2ZW50c0RlbHRhYC4KKyAqCisgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgRnJhbWVFdmVudHNEZWx0YWAuCisgKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCB0LgorICovCisvLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvZ3VpL0ZyYW1lVGltZXN0YW1wLmNwcDoKKy8vICAgICAgRnJhbWVFdmVudHNEZWx0YTo6ZmxhdHRlbgorc3RhdHVzX3QgZmxhdHRlbihIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50c0RlbHRhIGNvbnN0JiB0LAorICAgICAgICB2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludComIGZkcywgc2l6ZV90IG51bUZkcyk7CisKKy8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9ndWkvRnJhbWVUaW1lc3RhbXBzLmNwcDogRnJhbWVFdmVudEhpc3RvcnlEZWx0YQorCisvKioKKyAqIFxicmllZiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIG5vbi1mZCBidWZmZXIgcmVxdWlyZWQgdG8gZmxhdHRlbgorICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgorICogXHJldHVybiBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCisgKi8KK3NpemVfdCBnZXRGbGF0dGVuZWRTaXplKAorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIGNvbnN0JiB0KTsKKworLyoqCisgKiBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4KKyAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KKyAqCisgKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KKyAqIFxyZXR1cm4gVGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCB0LgorICovCitzaXplX3QgZ2V0RmRDb3VudCgKKyAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSBjb25zdCYgdCk7CisKKy8qKgorICogXGJyaWVmIFVuZmxhdHRlbiBgRnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCisgKgorICogXHBhcmFtW291dF0gdCBUaGUgZGVzdGluYXRpb24gYEZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgorICogXHBhcmFtW291dF0gbmggVGhlIHVuZGVybHlpbmcgYXJyYXkgb2YgYXJyYXlzIG9mIG5hdGl2ZSBoYW5kbGVzLgorICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KKyAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgorICoKKyAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYE5PX0VSUk9SYCwgXHAgbmggd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCBgbnVsbHB0cmAgb3IKKyAqIG5ld2x5IGNyZWF0ZWQgaGFuZGxlcy4gVGhlIHNlY29uZCBkaW1lbnNpb24gb2YgXHAgbmggd2lsbCBiZSA0LiBFYWNoIG5vbi1udWxsCisgKiBzbG90IGluIFxwIG5oIHdpbGwgbmVlZCB0byBiZSBkZWxldGVkIG1hbnVhbGx5IHdpdGggYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgLgorICovCitzdGF0dXNfdCB1bmZsYXR0ZW4oCisgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEqIHQsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+ID4qIG5oLAorICAgICAgICB2b2lkIGNvbnN0KiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludCBjb25zdComIGZkcywgc2l6ZV90JiBudW1GZHMpOworCisvKioKKyAqIFxicmllZiBGbGF0dGVuIGBGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KKyAqCisgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgRnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCisgKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCB0LgorICovCitzdGF0dXNfdCBmbGF0dGVuKAorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIGNvbnN0JiB0LAorICAgICAgICB2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludComIGZkcywgc2l6ZV90JiBudW1GZHMpOworCisvKioKKyAqIFxicmllZiBXcmFwIGA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGF0YWAgaW4KKyAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KKyAqCisgKiBccGFyYW1bb3V0XSB0IFRoZSB3cmFwcGVyIG9mIHR5cGUKKyAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KKyAqIFxwYXJhbVtvdXRdIG5oIFRoZSBhcnJheSBvZiBhcnJheSBvZiBuYXRpdmUgaGFuZGxlcyB0aGF0IGFyZSByZWZlcnJlZCB0byBieQorICogbWVtYmVycyBvZiBccCB0LgorICogXHBhcmFtW2luXSBsIFRoZSBzb3VyY2UgYDo6YW5kcm9pZDo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCisgKgorICogT24gc3VjY2VzcywgZWFjaCBtZW1iZXIgb2YgXHAgbmggd2lsbCBiZSBlaXRoZXIgYG51bGxwdHJgIG9yIGEgbmV3bHkgY3JlYXRlZAorICogbmF0aXZlIGhhbmRsZS4gQWxsIHRoZSBub24tYG51bGxwdHJgIGVsZW1lbnRzIG11c3QgYmUgZGVsZXRlZCBpbmRpdmlkdWFsbHkKKyAqIHdpdGggYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgLgorICovCitib29sIHdyYXBBcyhIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhKiB0LAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiA+KiBuaCwKKyAgICAgICAgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIGNvbnN0JiBsKTsKKworLyoqCisgKiBcYnJpZWYgQ29udmVydCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAgdG8KKyAqIGA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgorICoKKyAqIFxwYXJhbVtvdXRdIGwgVGhlIGRlc3RpbmF0aW9uIGA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgorICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgYWxsIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCisgKi8KK2Jvb2wgY29udmVydFRvKAorICAgICAgICA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEqIGwsCisgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEgY29uc3QmIHQpOworCisvLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvdWkvUmVnaW9uLmNwcAorCisvKioKKyAqIFxicmllZiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciByZXF1aXJlZCB0byBmbGF0dGVuIGBSZWdpb25gLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYFJlZ2lvbmAuCisgKiBccmV0dXJuIFRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KKyAqLworc2l6ZV90IGdldEZsYXR0ZW5lZFNpemUoUmVnaW9uIGNvbnN0JiB0KTsKKworLyoqCisgKiBcYnJpZWYgVW5mbGF0dGVuIGBSZWdpb25gLgorICoKKyAqIFxwYXJhbVtvdXRdIHQgVGhlIGRlc3RpbmF0aW9uIGBSZWdpb25gLgorICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgorICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXR1c190IHVuZmxhdHRlbihSZWdpb24qIHQsIHZvaWQgY29uc3QqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSk7CisKKy8qKgorICogXGJyaWVmIEZsYXR0ZW4gYFJlZ2lvbmAuCisgKgorICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYFJlZ2lvbmAuCisgKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCisgKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KKyAqLworc3RhdHVzX3QgZmxhdHRlbihSZWdpb24gY29uc3QmIHQsIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSk7CisKKy8qKgorICogXGJyaWVmIENvbnZlcnQgYDo6YW5kcm9pZDo6UmVnaW9uYCB0byBgUmVnaW9uYC4KKyAqCisgKiBccGFyYW1bb3V0XSB0IFRoZSBkZXN0aW5hdGlvbiBgUmVnaW9uYC4KKyAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGA6OmFuZHJvaWQ6OlJlZ2lvbmAuCisgKi8KKy8vIGNvbnZlcnQ6IDo6YW5kcm9pZDo6UmVnaW9uIC0+IFJlZ2lvbgorYm9vbCBjb252ZXJ0VG8oUmVnaW9uKiB0LCA6OmFuZHJvaWQ6OlJlZ2lvbiBjb25zdCYgbCk7CisKKy8qKgorICogXGJyaWVmIENvbnZlcnQgYFJlZ2lvbmAgdG8gYDo6YW5kcm9pZDo6UmVnaW9uYC4KKyAqCisgKiBccGFyYW1bb3V0XSBsIFRoZSBkZXN0aW5hdGlvbiBgOjphbmRyb2lkOjpSZWdpb25gLgorICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYFJlZ2lvbmAuCisgKi8KKy8vIGNvbnZlcnQ6IFJlZ2lvbiAtPiA6OmFuZHJvaWQ6OlJlZ2lvbgorYm9vbCBjb252ZXJ0VG8oOjphbmRyb2lkOjpSZWdpb24qIGwsIFJlZ2lvbiBjb25zdCYgdCk7CisKKy8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9ndWkvQkdyYXBoaWNCdWZmZXJQcm9kdWNlci5jcHA6CisvLyAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQKKworLyoqCisgKiBcYnJpZWYgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgcmVxdWlyZWQgdG8gZmxhdHRlbgorICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgorICogXHJldHVybiBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCisgKi8KK3NpemVfdCBnZXRGbGF0dGVuZWRTaXplKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgY29uc3QmIHQpOworCisvKioKKyAqIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbgorICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgorICogXHJldHVybiBUaGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCisgKi8KK3NpemVfdCBnZXRGZENvdW50KAorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IGNvbnN0JiB0KTsKKy8qKgorICogXGJyaWVmIEZsYXR0ZW4gYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgorICoKKyAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KKyAqIFxwYXJhbVtvdXRdIG5oIFRoZSBuYXRpdmUgaGFuZGxlIGNsb25lZCBmcm9tIGB0LmZlbmNlYC4KKyAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCisgKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZHVwbGljYXRlIHRoZSBmaWxlIGRlc2NyaXB0b3IgaW4gYHQuZmVuY2VgLiAqLworc3RhdHVzX3QgZmxhdHRlbihIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IGNvbnN0JiB0LAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QqKiBuaCwKKyAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQqJiBmZHMsIHNpemVfdCYgbnVtRmRzKTsKKworLyoqCisgKiBcYnJpZWYgVW5mbGF0dGVuIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KKyAqCisgKiBccGFyYW1bb3V0XSB0IFRoZSBkZXN0aW5hdGlvbiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCisgKiBccGFyYW1bb3V0XSBuaCBUaGUgdW5kZXJseWluZyBuYXRpdmUgaGFuZGxlIGZvciBgdC0+ZmVuY2VgLgorICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCisgKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgorICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KKyAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgorICoKKyAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYE5PX0VSUk9SYCBhbmQgYHQtPmZlbmNlYCBjb250YWlucyBhIHZhbGlkIGZpbGUKKyAqIGRlc2NyaXB0b3IsIFxwIG5oIHdpbGwgYmUgYSBuZXdseSBjcmVhdGVkIG5hdGl2ZSBoYW5kbGUgaG9sZGluZyB0aGF0IGZpbGUKKyAqIGRlc2NyaXB0b3IuIFxwIG5oIG5lZWRzIHRvIGJlIGRlbGV0ZWQgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAKKyAqIGFmdGVyd2FyZHMuCisgKi8KK3N0YXR1c190IHVuZmxhdHRlbigKKyAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCogdCwgbmF0aXZlX2hhbmRsZV90KiogbmgsCisgICAgICAgIHZvaWQgY29uc3QqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50IGNvbnN0KiYgZmRzLCBzaXplX3QmIG51bUZkcyk7CisKKy8qKgorICogXGJyaWVmIFdyYXAgYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgIGluCisgKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCisgKgorICogXHBhcmFtW291dF0gdCBUaGUgd3JhcHBlciBvZiB0eXBlCisgKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCisgKiBccGFyYW1bb3V0XSBuaCBUaGUgdW5kZXJseWluZyBuYXRpdmUgaGFuZGxlIGZvciBgdC0+ZmVuY2VgLgorICogXHBhcmFtW2luXSBsIFRoZSBzb3VyY2UgYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgorICoKKyAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYHRydWVgIGFuZCBgdC0+ZmVuY2VgIGNvbnRhaW5zIGEgdmFsaWQgZmlsZQorICogZGVzY3JpcHRvciwgXHAgbmggd2lsbCBiZSBhIG5ld2x5IGNyZWF0ZWQgbmF0aXZlIGhhbmRsZSBob2xkaW5nIHRoYXQgZmlsZQorICogZGVzY3JpcHRvci4gXHAgbmggbmVlZHMgdG8gYmUgZGVsZXRlZCB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYAorICogYWZ0ZXJ3YXJkcy4KKyAqLworYm9vbCB3cmFwQXMoCisgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQqIHQsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCoqIG5oLAorICAgICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IGNvbnN0JiBsKTsKKworLyoqCisgKiBcYnJpZWYgQ29udmVydCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAgdG8KKyAqIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KKyAqCisgKiBccGFyYW1bb3V0XSBsIFRoZSBkZXN0aW5hdGlvbiBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCisgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCisgKgorICogSWYgYHQuZmVuY2VgIGhhcyBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvciwgaXQgd2lsbCBiZSBkdXBsaWNhdGVkLgorICovCitib29sIGNvbnZlcnRUbygKKyAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCogbCwKKyAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBjb25zdCYgdCk7CisKKy8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9ndWkvQkdyYXBoaWNCdWZmZXJQcm9kdWNlci5jcHA6CisvLyAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0CisKKy8qKgorICogXGJyaWVmIFdyYXAgYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0YCBpbgorICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0YC4KKyAqCisgKiBccGFyYW1bb3V0XSB0IFRoZSB3cmFwcGVyIG9mIHR5cGUKKyAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAuCisgKiBccGFyYW1bb3V0XSBuaCBUaGUgYXJyYXkgb2YgYXJyYXkgb2YgbmF0aXZlIGhhbmRsZXMgdGhhdCBhcmUgcmVmZXJyZWQgdG8gYnkKKyAqIG1lbWJlcnMgb2YgXHAgdC4KKyAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAuCisgKgorICogT24gc3VjY2VzcywgZWFjaCBtZW1iZXIgb2YgXHAgbmggd2lsbCBiZSBlaXRoZXIgYG51bGxwdHJgIG9yIGEgbmV3bHkgY3JlYXRlZAorICogbmF0aXZlIGhhbmRsZS4gQWxsIHRoZSBub24tYG51bGxwdHJgIGVsZW1lbnRzIG11c3QgYmUgZGVsZXRlZCBpbmRpdmlkdWFsbHkKKyAqIHdpdGggYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgLgorICovCisvLyB3cmFwOiBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCAtPgorLy8gSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQKK2Jvb2wgd3JhcEFzKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0KiB0LAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiA+KiBuaCwKKyAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgY29uc3QmIGwpOworCisvKioKKyAqIFxicmllZiBDb252ZXJ0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAgdG8KKyAqIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAuCisgKgorICogXHBhcmFtW291dF0gbCBUaGUgZGVzdGluYXRpb24gYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0YC4KKyAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSBhbGwgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gXHAgdC4KKyAqLworLy8gY29udmVydDogSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgLT4KKy8vIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0Citib29sIGNvbnZlcnRUbygKKyAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQqIGwsCisgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IGNvbnN0JiB0KTsKKworLyoqCisgKiBcYnJpZWYgQ29udmVydCBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgIHRvCisgKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgorICoKKyAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZWAuCisgKiBccmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZWAuCisgKi8KK0hHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlIHRvSGlkbERpc2Nvbm5lY3RNb2RlKAorICAgICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZSBsKTsKKworLyoqCisgKiBcYnJpZWYgQ29udmVydCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgIHRvCisgKiBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgorICoKKyAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZWAuCisgKiBccmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZWAuCisgKi8KK0JHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlIHRvR3VpRGlzY29ubmVjdE1vZGUoCisgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlIHQpOworCit9ICAvLyBuYW1lc3BhY2UgY29udmVyc2lvbgorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9TVEFHRUZSSUdIVF9CUUhFTFBFUl9DT05WRVJTSU9OX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvRnJhbWVEcm9wcGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0ZyYW1lRHJvcHBlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvRnJhbWVEcm9wcGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvRnJhbWVEcm9wcGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFmOTU1NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5oCkBAIC0wLDAgKzEsNDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBHUkFQSElDX0JVRkZFUl9TT1VSQ0VfSF8KKworI2RlZmluZSBHUkFQSElDX0JVRkZFUl9TT1VSQ0VfSF8KKworI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KKyNpbmNsdWRlIDxndWkvQnVmZmVyUXVldWUuaD4KKyNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXJSZWZsZWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9Db21wb25lbnRXcmFwcGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czsKKworc3RydWN0IEZyYW1lRHJvcHBlcjsKKworLyoKKyAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBmZWVkIGNvZGVjcyBmcm9tIGEgU3VyZmFjZSB2aWEgQnVmZmVyUXVldWUgb3IKKyAqIEhXIHByb2R1Y2VyLgorICoKKyAqIEluc3RhbmNlcyBvZiB0aGUgY2xhc3MgZG9uJ3QgcnVuIG9uIGEgZGVkaWNhdGVkIHRocmVhZC4gIEluc3RlYWQsCisgKiB2YXJpb3VzIGV2ZW50cyB0cmlnZ2VyIGRhdGEgbW92ZW1lbnQ6CisgKgorICogIC0gQXZhaWxhYmlsaXR5IG9mIGEgbmV3IGZyYW1lIG9mIGRhdGEgZnJvbSB0aGUgQnVmZmVyUXVldWUgKG5vdGlmaWVkCisgKiAgICB2aWEgdGhlIG9uRnJhbWVBdmFpbGFibGUgY2FsbGJhY2spLgorICogIC0gVGhlIHJldHVybiBvZiBhIGNvZGVjIGJ1ZmZlci4KKyAqICAtIEFwcGxpY2F0aW9uIHNpZ25hbGluZyBlbmQtb2Ytc3RyZWFtLgorICogIC0gVHJhbnNpdGlvbiB0byBvciBmcm9tICJleGVjdXRpbmciIHN0YXRlLgorICoKKyAqIEZyYW1lcyBvZiBkYXRhIChhbmQsIHBlcmhhcHMsIHRoZSBlbmQtb2Ytc3RyZWFtIGluZGljYXRpb24pIGNhbiBhcnJpdmUKKyAqIGJlZm9yZSB0aGUgY29kZWMgaXMgaW4gdGhlICJleGVjdXRpbmciIHN0YXRlLCBzbyB3ZSBuZWVkIHRvIHF1ZXVlCisgKiB0aGluZ3MgdXAgdW50aWwgd2UncmUgcmVhZHkgdG8gZ28uCisgKgorICogVGhlIEdyYXBoaWNCdWZmZXJTb3VyY2UgY2FuIGJlIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0byBkaXNjYXJkIGZyYW1lcworICogZnJvbSB0aGUgc291cmNlOgorICoKKyAqIC0gaWYgdGhlaXIgdGltZXN0YW1wIGlzIGxlc3MgdGhhbiBhIHN0YXJ0IHRpbWUKKyAqIC0gaWYgdGhlIHNvdXJjZSBpcyBzdXNwZW5kZWQgb3Igc3RvcHBlZCBhbmQgdGhlIHN1c3BlbmQvc3RvcC10aW1lIGlzIHJlYWNoZWQKKyAqIC0gaWYgRU9TIHdhcyBzaWduYWxlZAorICogLSBpZiB0aGVyZSBpcyBubyBlbmNvZGVyIGNvbm5lY3RlZCB0byBpdAorICoKKyAqIFRoZSBzb3VyY2UsIGZ1cnRoZXJtb3JlLCBtYXkgY2hvb3NlIHRvIG5vdCBlbmNvZGUgKGRyb3ApIGZyYW1lcyBpZjoKKyAqCisgKiAtIHRvIHRocm90dGxlIHRoZSBmcmFtZSByYXRlIChrZWVwIGl0IHVuZGVyIGEgY2VydGFpbiBsaW1pdCkKKyAqCisgKiBGaW5hbGx5IHRoZSBzb3VyY2UgbWF5IG9wdGlvbmFsbHkgaG9sZCBvbnRvIHRoZSBsYXN0IG5vbi1kaXNjYXJkZWQgZnJhbWUKKyAqIChldmVuIGlmIGl0IHdhcyBkcm9wcGVkKSB0byByZWVuY29kZSBpdCBhZnRlciBhbiBpbnRlcnZhbCBpZiBubyBmdXJ0aGVyCisgKiBmcmFtZXMgYXJlIHNlbnQgYnkgdGhlIHByb2R1Y2VyLgorICovCitjbGFzcyBHcmFwaGljQnVmZmVyU291cmNlIDogcHVibGljIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIHsKK3B1YmxpYzoKKyAgICBHcmFwaGljQnVmZmVyU291cmNlKCk7CisKKyAgICB2aXJ0dWFsIH5HcmFwaGljQnVmZmVyU291cmNlKCk7CisKKyAgICAvLyBXZSBjYW4ndCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbnN0cnVjdG9yIGZhaWxzLCBzbyB3ZSBqdXN0IHNldAorICAgIC8vIHRoaXMgYW5kIHJlcXVpcmUgdGhhdCB0aGUgY2FsbGVyIHRlc3QgdGhlIHZhbHVlLgorICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgLy8gUmV0dXJucyB0aGUgaGFuZGxlIHRvIHRoZSBwcm9kdWNlciBzaWRlIG9mIHRoZSBCdWZmZXJRdWV1ZS4gIEJ1ZmZlcnMKKyAgICAvLyBxdWV1ZWQgb24gdGhpcyB3aWxsIGJlIHJlY2VpdmVkIGJ5IEdyYXBoaWNCdWZmZXJTb3VyY2UuCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Qcm9kdWNlcjsKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIGNvbXBvbmVudCB0cmFuc2l0aW9ucyB0byBydW5uaW5nIHN0YXRlLCB3aGljaCBtZWFucworICAgIC8vIHdlIGNhbiBzdGFydCBoYW5kaW5nIGl0IGJ1ZmZlcnMuICBJZiB3ZSBhbHJlYWR5IGhhdmUgYnVmZmVycyBvZiBkYXRhCisgICAgLy8gc2l0dGluZyBpbiB0aGUgQnVmZmVyUXVldWUsIHRoaXMgd2lsbCBzZW5kIHRoZW0gdG8gdGhlIGNvZGVjLgorICAgIFN0YXR1cyBzdGFydCgpOworCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiBjb21wb25lbnQgdHJhbnNpdGlvbnMgdG8gc3RvcHBlZCwgaW5kaWNhdGluZyB0aGF0CisgICAgLy8gdGhlIGNvZGVjIGlzIG1lYW50IHRvIHJldHVybiBhbGwgYnVmZmVycyBiYWNrIHRvIHRoZSBjbGllbnQgZm9yIHRoZW0KKyAgICAvLyB0byBiZSBmcmVlZC4gRG8gTk9UIHN1Ym1pdCBhbnkgbW9yZSBidWZmZXJzIHRvIHRoZSBjb21wb25lbnQuCisgICAgU3RhdHVzIHN0b3AoKTsKKworICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gY29tcG9uZW50IHRyYW5zaXRpb25zIHRvIHJlbGVhc2VkLCBpbmRpY2F0aW5nIHRoYXQKKyAgICAvLyB3ZSBhcmUgc2h1dHRpbmcgZG93bi4KKyAgICBTdGF0dXMgcmVsZWFzZSgpOworCisgICAgLy8gQSAiY29kZWMgYnVmZmVyIiwgaS5lLiBhIGJ1ZmZlciB0aGF0IGNhbiBiZSB1c2VkIHRvIHBhc3MgZGF0YSBpbnRvCisgICAgLy8gdGhlIGVuY29kZXIsIGhhcyBiZWVuIGFsbG9jYXRlZC4gIChUaGlzIGNhbGwgZG9lcyBub3QgY2FsbCBiYWNrIGludG8KKyAgICAvLyBjb21wb25lbnQuKQorICAgIFN0YXR1cyBvbklucHV0QnVmZmVyQWRkZWQoaW50MzJfdCBidWZmZXJJZCk7CisKKyAgICAvLyBDYWxsZWQgd2hlbiBlbmNvZGVyIGlzIG5vIGxvbmdlciB1c2luZyB0aGUgYnVmZmVyLiAgSWYgd2UgaGF2ZSBhIEJRCisgICAgLy8gYnVmZmVyIGF2YWlsYWJsZSwgZmlsbCBpdCB3aXRoIGEgbmV3IGZyYW1lIG9mIGRhdGE7IG90aGVyd2lzZSwganVzdCBtYXJrCisgICAgLy8gaXQgYXMgYXZhaWxhYmxlLgorICAgIFN0YXR1cyBvbklucHV0QnVmZmVyRW1wdGllZChpbnQzMl90IGJ1ZmZlcklkLCBpbnQgZmVuY2VGZCk7CisKKyAgICAvLyBJR3JhcGhpY0J1ZmZlclNvdXJjZSBpbnRlcmZhY2UKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vIENvbmZpZ3VyZSB0aGUgYnVmZmVyIHNvdXJjZSB0byBiZSB1c2VkIHdpdGggYSBjb21wb25lbnQgd2l0aCB0aGUgZGVmYXVsdAorICAgIC8vIGRhdGEgc3BhY2UuCisgICAgc3RhdHVzX3QgY29uZmlndXJlKAorICAgICAgICBjb25zdCBzcDxDb21wb25lbnRXcmFwcGVyPiAmY29tcG9uZW50LAorICAgICAgICBpbnQzMl90IGRhdGFTcGFjZSwKKyAgICAgICAgaW50MzJfdCBidWZmZXJDb3VudCwKKyAgICAgICAgdWludDMyX3QgZnJhbWVXaWR0aCwKKyAgICAgICAgdWludDMyX3QgZnJhbWVIZWlnaHQsCisgICAgICAgIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2UpOworCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGxhc3QgaW5wdXQgZnJhbWUgaGFzIGJlZW4gc3VibWl0dGVkIG9yIGJ1ZmZlcgorICAgIC8vIHRpbWVzdGFtcCBpcyBncmVhdGVyIG9yIGVxdWFsIHRoYW4gc3RvcFRpbWVVcy4gV2UgbmVlZCB0byBzdWJtaXQgYW4gZW1wdHkKKyAgICAvLyBidWZmZXIgd2l0aCB0aGUgRU9TIGZsYWcgc2V0LiAgSWYgd2UgZG9uJ3QgaGF2ZSBhIGNvZGVjIGJ1ZmZlciByZWFkeSwKKyAgICAvLyB3ZSBqdXN0IHNldCB0aGUgbUVuZE9mU3RyZWFtIGZsYWcuCisgICAgc3RhdHVzX3Qgc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpOworCisgICAgLy8gSWYgc3VzcGVuZCBpcyB0cnVlLCBhbGwgaW5jb21pbmcgYnVmZmVycyAoaW5jbHVkaW5nIHRob3NlIGN1cnJlbnRseQorICAgIC8vIGluIHRoZSBCdWZmZXJRdWV1ZSkgd2l0aCB0aW1lc3RhbXAgbGFyZ2VyIHRoYW4gdGltZVVzIHdpbGwgYmUgZGlzY2FyZGVkCisgICAgLy8gdW50aWwgdGhlIHN1c3BlbnNpb24gaXMgbGlmdGVkLiBJZiBzdXNwZW5kIGlzIGZhbHNlLCBhbGwgaW5jb21pbmcgYnVmZmVycworICAgIC8vIGluY2x1ZGluZyB0aG9zZSBjdXJyZW50bHkgaW4gdGhlIEJ1ZmZlclF1ZXVlKSB3aXRoIHRpbWVzdGFtcCBsYXJnZXIgdGhhbgorICAgIC8vIHRpbWVVcyB3aWxsIGJlIHByb2Nlc3NlZC4gdGltZVVzIHVzZXMgU1lTVEVNX1RJTUVfTU9OT1RPTklDIHRpbWUgYmFzZS4KKyAgICBzdGF0dXNfdCBzZXRTdXNwZW5kKGJvb2wgc3VzcGVuZCwgaW50NjRfdCB0aW1lVXMpOworCisgICAgLy8gU3BlY2lmaWVzIHRoZSBpbnRlcnZhbCBhZnRlciB3aGljaCB3ZSByZXF1ZXVlIHRoZSBidWZmZXIgcHJldmlvdXNseQorICAgIC8vIHF1ZXVlZCB0byB0aGUgZW5jb2Rlci4gVGhpcyBpcyB1c2VmdWwgaW4gdGhlIGNhc2Ugb2Ygc3VyZmFjZSBmbGluZ2VyCisgICAgLy8gcHJvdmlkaW5nIHRoZSBpbnB1dCBzdXJmYWNlIGlmIHRoZSByZXN1bHRpbmcgZW5jb2RlZCBzdHJlYW0gaXMgdG8KKyAgICAvLyBiZSBkaXNwbGF5ZWQgImxpdmUiLiBJZiB3ZSB3ZXJlIG5vdCB0byBwdXNoIHRocm91Z2ggdGhlIGV4dHJhIGZyYW1lCisgICAgLy8gdGhlIGRlY29kZXIgb24gdGhlIHJlbW90ZSBlbmQgd291bGQgYmUgdW5hYmxlIHRvIGRlY29kZSB0aGUgbGF0ZXN0IGZyYW1lLgorICAgIC8vIFRoaXMgQVBJIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0cmFuc2l0aW9uaW5nIHRoZSBlbmNvZGVyIHRvICJleGVjdXRpbmciCisgICAgLy8gc3RhdGUgYW5kIG9uY2UgdGhpcyBiZWhhdmlvdXIgaXMgc3BlY2lmaWVkIGl0IGNhbm5vdCBiZSByZXNldC4KKyAgICBzdGF0dXNfdCBzZXRSZXBlYXRQcmV2aW91c0ZyYW1lRGVsYXlVcyhpbnQ2NF90IHJlcGVhdEFmdGVyVXMpOworCisgICAgLy8gU2V0cyB0aGUgaW5wdXQgYnVmZmVyIHRpbWVzdGFtcCBvZmZzZXQuCisgICAgLy8gV2hlbiBzZXQsIHRoZSBzYW1wbGUncyB0aW1lc3RhbXAgd2lsbCBiZSBhZGp1c3RlZCB3aXRoIHRoZSB0aW1lT2Zmc2V0VXMuCisgICAgc3RhdHVzX3Qgc2V0VGltZU9mZnNldFVzKGludDY0X3QgdGltZU9mZnNldFVzKTsKKworICAgIC8vIFdoZW4gc2V0LCB0aGUgbWF4IGZyYW1lIHJhdGUgZmVkIHRvIHRoZSBlbmNvZGVyIHdpbGwgYmUgY2FwcGVkIGF0IG1heEZwcy4KKyAgICBzdGF0dXNfdCBzZXRNYXhGcHMoZmxvYXQgbWF4RnBzKTsKKworICAgIC8vIFNldHMgdGhlIHRpbWUgbGFwc2UgKG9yIHNsb3cgbW90aW9uKSBwYXJhbWV0ZXJzLgorICAgIC8vIFdoZW4gc2V0LCB0aGUgc2FtcGxlJ3MgdGltZXN0YW1wIHdpbGwgYmUgbW9kaWZpZWQgdG8gcGxheWJhY2sgZnJhbWVyYXRlLAorICAgIC8vIGFuZCBjYXB0dXJlIHRpbWVzdGFtcCB3aWxsIGJlIG1vZGlmaWVkIHRvIGNhcHR1cmUgcmF0ZS4KKyAgICBzdGF0dXNfdCBzZXRUaW1lTGFwc2VDb25maWcoZG91YmxlIGZwcywgZG91YmxlIGNhcHR1cmVGcHMpOworCisgICAgLy8gU2V0cyB0aGUgc3RhcnQgdGltZSB1cyAoaW4gc3lzdGVtIHRpbWUpLCBzYW1wbGVzIGJlZm9yZSB3aGljaCBzaG91bGQKKyAgICAvLyBiZSBkcm9wcGVkIGFuZCBub3Qgc3VibWl0dGVkIHRvIGVuY29kZXIKKyAgICBzdGF0dXNfdCBzZXRTdGFydFRpbWVVcyhpbnQ2NF90IHN0YXJ0VGltZVVzKTsKKworICAgIC8vIFNldHMgdGhlIHN0b3AgdGltZSB1cyAoaW4gc3lzdGVtIHRpbWUpLCBzYW1wbGVzIGFmdGVyIHdoaWNoIHNob3VsZCBiZSBkcm9wcGVkCisgICAgLy8gYW5kIG5vdCBzdWJtaXR0ZWQgdG8gZW5jb2Rlci4gdGltZVVzIHVzZXMgU1lTVEVNX1RJTUVfTU9OT1RPTklDIHRpbWUgYmFzZS4KKyAgICBzdGF0dXNfdCBzZXRTdG9wVGltZVVzKGludDY0X3Qgc3RvcFRpbWVVcyk7CisKKyAgICAvLyBHZXRzIHRoZSBzdG9wIHRpbWUgb2Zmc2V0IGluIHVzLiBUaGlzIGlzIHRoZSB0aW1lIG9mZnNldCBiZXR3ZWVuIGxhdGVzdCBidWZmZXIKKyAgICAvLyB0aW1lIGFuZCB0aGUgc3RvcFRpbWVVcy4gSWYgc3RvcCB0aW1lIGlzIG5vdCBzZXQsIElOVkFMSURfT1BFUkFUSU9OIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgLy8gSWYgcmV0dXJuIGlzIE9LLCAqc3RvcFRpbWVPZmZzZXRVcyB3aWxsIGNvbnRhaW4gdGhlIHZhbGlkIG9mZnNldC4gT3RoZXJ3aXNlLAorICAgIC8vICpzdG9wVGltZU9mZnNldFVzIHdpbGwgbm90IGJlIG1vZGlmaWVkLiBQb3NpdGl2ZSBzdG9wVGltZU9mZnNldFVzIG1lYW5zIGJ1ZmZlciB0aW1lCisgICAgLy8gbGFyZ2VyIHRoYW4gc3RvcFRpbWVVcy4KKyAgICBzdGF0dXNfdCBnZXRTdG9wVGltZU9mZnNldFVzKGludDY0X3QgKnN0b3BUaW1lT2Zmc2V0VXMpOworCisgICAgLy8gU2V0cyB0aGUgZGVzaXJlZCBjb2xvciBhc3BlY3RzLCBlLmcuIHRvIGJlIHVzZWQgd2hlbiBwcm9kdWNlciBkb2VzIG5vdCBzcGVjaWZ5IGEgZGF0YXNwYWNlLgorICAgIHN0YXR1c190IHNldENvbG9yQXNwZWN0cyhpbnQzMl90IGFzcGVjdHNQYWNrZWQpOworCitwcm90ZWN0ZWQ6CisgICAgLy8gQlE6OkNvbnN1bWVyTGlzdGVuZXIgaW50ZXJmYWNlCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvLyBCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lciBpbnRlcmZhY2UsIGNhbGxlZCB3aGVuIGEgbmV3IGZyYW1lIG9mCisgICAgLy8gZGF0YSBpcyBhdmFpbGFibGUuICBJZiB3ZSdyZSBleGVjdXRpbmcgYW5kIGEgY29kZWMgYnVmZmVyIGlzCisgICAgLy8gYXZhaWxhYmxlLCB3ZSBhY3F1aXJlIHRoZSBidWZmZXIsIGNvcHkgdGhlIEdyYXBoaWNCdWZmZXIgcmVmZXJlbmNlCisgICAgLy8gaW50byB0aGUgY29kZWMgYnVmZmVyLCBhbmQgY2FsbCBFbXB0eVtUaGlzXUJ1ZmZlci4gIElmIHdlJ3JlIG5vdCB5ZXQKKyAgICAvLyBleGVjdXRpbmcgb3IgdGhlcmUncyBubyBjb2RlYyBidWZmZXIgYXZhaWxhYmxlLCB3ZSBqdXN0IGluY3JlbWVudAorICAgIC8vIG1OdW1GcmFtZXNBdmFpbGFibGUgYW5kIHJldHVybi4KKyAgICB2b2lkIG9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgaXRlbSkgb3ZlcnJpZGU7CisKKyAgICAvLyBCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lciBpbnRlcmZhY2UsIGNhbGxlZCB3aGVuIHRoZSBjbGllbnQgaGFzCisgICAgLy8gcmVsZWFzZWQgb25lIG9yIG1vcmUgR3JhcGhpY0J1ZmZlcnMuICBXZSBjbGVhciBvdXQgdGhlIGFwcHJvcHJpYXRlCisgICAgLy8gc2V0IG9mIG1CdWZmZXJTbG90IGVudHJpZXMuCisgICAgdm9pZCBvbkJ1ZmZlcnNSZWxlYXNlZCgpIG92ZXJyaWRlOworCisgICAgLy8gQnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXIgaW50ZXJmYWNlLCBjYWxsZWQgd2hlbiB0aGUgY2xpZW50IGhhcworICAgIC8vIGNoYW5nZWQgdGhlIHNpZGViYW5kIHN0cmVhbS4gR3JhcGhpY0J1ZmZlclNvdXJjZSBkb2Vzbid0IGhhbmRsZSBzaWRlYmFuZAorICAgIC8vIHN0cmVhbXMgc28gdGhpcyBpcyBhIG5vLW9wIChhbmQgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCkuCisgICAgdm9pZCBvblNpZGViYW5kU3RyZWFtQ2hhbmdlZCgpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIC8vIExvY2ssIGNvdmVycyBhbGwgbWVtYmVyIHZhcmlhYmxlcy4KKyAgICBtdXRhYmxlIE11dGV4IG1NdXRleDsKKworICAgIC8vIFVzZWQgdG8gcmVwb3J0IGNvbnN0cnVjdG9yIGZhaWx1cmUuCisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKworICAgIC8vIEdyYXBoaWMgYnVmZmVyIHJlZmVyZW5jZSBvYmplY3RzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vIFRoZXNlIGFyZSB1c2VkIHRvIGtlZXAgYSBzaGFyZWQgcmVmZXJlbmNlIHRvIEdyYXBoaWNCdWZmZXJzIGFuZCBncmFsbG9jIGhhbmRsZXMgb3duZWQgYnkgdGhlCisgICAgLy8gR3JhcGhpY0J1ZmZlclNvdXJjZSBhcyB3ZWxsIGFzIHRvIG1hbmFnZSB0aGUgY2FjaGUgc2xvdHMuIFNlcGFyYXRlIHJlZmVyZW5jZXMgYXJlIG93bmVkIGJ5CisgICAgLy8gdGhlIGJ1ZmZlciBjYWNoZSAoY29udHJvbGxlZCBieSB0aGUgYnVmZmVyIHF1ZXVlL2J1ZmZlciBwcm9kdWNlcikgYW5kIHRoZSBjb2RlYy4KKworICAgIC8vIFdoZW4gd2UgZ2V0IGEgYnVmZmVyIGZyb20gdGhlIHByb2R1Y2VyIChCUSkgaXQgZGVzaWduYXRlcyB0aGVtIHRvIGJlIGNhY2hlZCBpbnRvIHNwZWNpZmljCisgICAgLy8gc2xvdHMuIEVhY2ggc2xvdCBvd25zIGEgc2hhcmVkIHJlZmVyZW5jZSB0byB0aGUgZ3JhcGhpYyBidWZmZXIgKHdlIHRyYWNrIHRoZXNlIHVzaW5nCisgICAgLy8gQ2FjaGVkQnVmZmVyKSB0aGF0IGlzIGluIHRoYXQgc2xvdCwgYnV0IHRoZSBwcm9kdWNlciBjb250cm9scyB0aGUgc2xvdHMuCisgICAgc3RydWN0IENhY2hlZEJ1ZmZlcjsKKworICAgIC8vIFdoZW4gd2UgYWNxdWlyZSBhIGJ1ZmZlciwgd2UgbXVzdCByZWxlYXNlIGl0IGJhY2sgdG8gdGhlIHByb2R1Y2VyIG9uY2Ugd2UgKG9yIHRoZSBjb2RlYykKKyAgICAvLyBubyBsb25nZXIgdXNlcyBpdCAoYXMgbG9uZyBhcyB0aGUgYnVmZmVyIGlzIHN0aWxsIGluIHRoZSBjYWNoZSBzbG90KS4gV2UgdXNlIHNoYXJlZAorICAgIC8vIEFjcXVpcmVkQnVmZmVyIGluc3RhbmNlcyBmb3IgdGhpcyBwdXJwb3NlIC0gYW5kIHdlIGNhbGwgcmVsZWFzZSBidWZmZXIgd2hlbiB0aGUgbGFzdAorICAgIC8vIHJlZmVyZW5jZSBpcyByZWxpbnF1aXNoZWQuCisgICAgc3RydWN0IEFjcXVpcmVkQnVmZmVyOworCisgICAgLy8gV2UgYWxzbyBuZWVkIHRvIGtlZXAgc29tZSBleHRyYSBtZXRhZGF0YSAob3RoZXIgdGhhbiB0aGUgYnVmZmVyIHJlZmVyZW5jZSkgZm9yIGFjcXVpcmVkCisgICAgLy8gYnVmZmVycy4gVGhlc2UgYXJlIHRyYWNrZWQgaW4gVmlkZW9CdWZmZXIgc3RydWN0LgorICAgIHN0cnVjdCBWaWRlb0J1ZmZlciB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBY3F1aXJlZEJ1ZmZlcj4gbUJ1ZmZlcjsKKyAgICAgICAgbnNlY3NfdCBtVGltZXN0YW1wTnM7CisgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlX3QgbURhdGFzcGFjZTsKKyAgICB9OworCisgICAgLy8gQ2FjaGVkIGFuZCBhcXVpcmVkIGJ1ZmZlcnMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgdHlwZWRlZiBpbnQgc2xvdF9pZDsKKworICAgIC8vIE1hcHMgYSBzbG90IHRvIHRoZSBjYWNoZWQgYnVmZmVyIGluIHRoYXQgc2xvdAorICAgIEtleWVkVmVjdG9yPHNsb3RfaWQsIHN0ZDo6c2hhcmVkX3B0cjxDYWNoZWRCdWZmZXI+PiBtQnVmZmVyU2xvdHM7CisKKyAgICAvLyBRdWV1ZSBvZiBidWZmZXJzIGFjcXVpcmVkIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIgdGhhdCBhcmUgbm90IHlldCBzdWJtaXR0ZWQgdG8gdGhlIGNvZGVjCisgICAgTGlzdDxWaWRlb0J1ZmZlcj4gbUF2YWlsYWJsZUJ1ZmZlcnM7CisKKyAgICAvLyBOdW1iZXIgb2YgYnVmZmVycyB0aGF0IGhhdmUgYmVlbiBzaWduYWxlZCBieSB0aGUgcHJvZHVjZXIgdGhhdCB0aGV5IGFyZSBhdmFpbGFibGUsIGJ1dAorICAgIC8vIHdlJ3ZlIGJlZW4gdW5hYmxlIHRvIGFjcXVpcmUgdGhlbSBkdWUgdG8gb3VyIG1heCBhY3F1aXJlIGNvdW50CisgICAgaW50MzJfdCBtTnVtQXZhaWxhYmxlVW5hY3F1aXJlZEJ1ZmZlcnM7CisKKyAgICAvLyBOdW1iZXIgb2YgZnJhbWVzIGFjcXVpcmVkIGZyb20gY29uc3VtZXIgKGRlYnVnIG9ubHkpCisgICAgLy8gKGFzIGluIGFxdWlyZUJ1ZmZlciBjYWxsZWQsIGFuZCByZWxlYXNlIG5lZWRzIHRvIGJlIGNhbGxlZCkKKyAgICBpbnQzMl90IG1OdW1PdXRzdGFuZGluZ0FjcXVpcmVzOworCisgICAgLy8gQWNxdWlyZSBhIGJ1ZmZlciBmcm9tIHRoZSBCUSBhbmQgc3RvcmUgaXQgaW4gfGl0ZW18IGlmIHN1Y2Nlc3NmdWwKKyAgICAvLyBccmV0dXJuIE9LIG9uIHN1Y2Nlc3MsIG9yIGVycm9yIG9uIGZhaWx1cmUuCisgICAgc3RhdHVzX3QgYWNxdWlyZUJ1ZmZlcl9sKFZpZGVvQnVmZmVyICppdGVtKTsKKworICAgIC8vIENhbGxlZCB3aGVuIGEgYnVmZmVyIHdhcyBhY3F1aXJlZCBmcm9tIHRoZSBwcm9kdWNlcgorICAgIHZvaWQgb25CdWZmZXJBY3F1aXJlZF9sKGNvbnN0IFZpZGVvQnVmZmVyICZidWZmZXIpOworCisgICAgLy8gbWFya3MgdGhlIGJ1ZmZlciBhdCB0aGUgc2xvdCBubyBsb25nZXIgY2FjaGVkLCBhbmQgYWNjb3VudHMgZm9yIHRoZSBvdXRzdGFuZGluZworICAgIC8vIGFjcXVpcmUgY291bnQuIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2xvdCB3YXMgcG9wdWxhdGVkOyBvdGhlcndpc2UsIGZhbHNlLgorICAgIGJvb2wgZGlzY2FyZEJ1ZmZlckluU2xvdF9sKHNsb3RfaWQgaSk7CisKKyAgICAvLyBtYXJrcyB0aGUgYnVmZmVyIGF0IHRoZSBzbG90IGluZGV4IG5vIGxvbmdlciBjYWNoZWQsIGFuZCBhY2NvdW50cyBmb3IgdGhlIG91dHN0YW5kaW5nCisgICAgLy8gYWNxdWlyZSBjb3VudAorICAgIHZvaWQgZGlzY2FyZEJ1ZmZlckF0U2xvdEluZGV4X2woc3NpemVfdCBic2kpOworCisgICAgLy8gcmVsZWFzZSBhbGwgYWNxdWlyZWQgYW5kIHVuYWNxdWlyZWQgYXZhaWxhYmxlIGJ1ZmZlcnMKKyAgICAvLyBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBpZiBpdCBmYWlscyB0byBhY3F1aXJlIGFuIHVuYWNxdWlyZWQgYXZhaWxhYmxlIGJ1ZmZlciwgd2hpY2ggd2lsbAorICAgIC8vIGxlYXZlIG1OdW1BdmFpbGFibGVVbmFjcXVpcmVkQnVmZmVycyBwb3NpdGl2ZSBvbiByZXR1cm4uCisgICAgdm9pZCByZWxlYXNlQWxsQXZhaWxhYmxlQnVmZmVyc19sKCk7CisKKyAgICAvLyByZXR1cm5zIHdoZXRoZXIgd2UgaGF2ZSBhbnkgYXZhaWxhYmxlIGJ1ZmZlcnMgKGFjcXVpcmVkIG9yIG5vdC15ZXQtYWNxdWlyZWQpCisgICAgYm9vbCBoYXZlQXZhaWxhYmxlQnVmZmVyc19sKCkgY29uc3QgeworICAgICAgICByZXR1cm4gIW1BdmFpbGFibGVCdWZmZXJzLmVtcHR5KCkgfHwgbU51bUF2YWlsYWJsZVVuYWNxdWlyZWRCdWZmZXJzID4gMDsKKyAgICB9CisKKyAgICAvLyBDb2RlYyBidWZmZXJzCisgICAgLy8gLS0tLS0tLS0tLS0tLQorCisgICAgLy8gV2hlbiB3ZSBxdWV1ZSBidWZmZXJzIHRvIHRoZSBlbmNvZGVyLCB3ZSBtdXN0IGhvbGQgdGhlIHJlZmVyZW5jZXMgdG8gdGhlIGdyYXBoaWMgYnVmZmVycworICAgIC8vIGluIHRob3NlIGJ1ZmZlcnMgLSBhcyB0aGUgcHJvZHVjZXIgbWF5IGZyZWUgdGhlIHNsb3RzLgorCisgICAgdHlwZWRlZiBpbnQzMl90IGNvZGVjX2J1ZmZlcl9pZDsKKworICAgIC8vIHNldCBvZiBjb2RlYyBidWZmZXIgSUQtcyBvZiBidWZmZXJzIGF2YWlsYWJsZSB0byBmaWxsCisgICAgTGlzdDxjb2RlY19idWZmZXJfaWQ+IG1GcmVlQ29kZWNCdWZmZXJzOworCisgICAgLy8gbWFwcyBjb2RlYyBidWZmZXIgSUQtcyB0byBidWZmZXIgaW5mbyBzdWJtaXR0ZWQgdG8gdGhlIGNvZGVjLiBVc2VkIHRvIGtlZXAgYSByZWZlcmVuY2UgZm9yCisgICAgLy8gdGhlIGdyYXBoaWNzIGJ1ZmZlci4KKyAgICBLZXllZFZlY3Rvcjxjb2RlY19idWZmZXJfaWQsIHN0ZDo6c2hhcmVkX3B0cjxBY3F1aXJlZEJ1ZmZlcj4+IG1TdWJtaXR0ZWRDb2RlY0J1ZmZlcnM7CisKKyAgICAvLyBQcm9jZXNzZXMgdGhlIG5leHQgYWNxdWlyZWQgZnJhbWUuIElmIHRoZXJlIGlzIG5vIGF2YWlsYWJsZSBjb2RlYyBidWZmZXIsIGl0IHJldHVybnMgZmFsc2UKKyAgICAvLyB3aXRob3V0IGFueSBmdXJ0aGVyIGFjdGlvbi4KKyAgICAvLworICAgIC8vIE90aGVyd2lzZSwgaXQgY29uc3VtZXMgdGhlIG5leHQgYWNxdWlyZWQgZnJhbWUgYW5kIGRldGVybWluZXMgaWYgaXQgbmVlZHMgdG8gYmUgZGlzY2FyZGVkIG9yCisgICAgLy8gZHJvcHBlZC4gSWYgbmVpdGhlciBhcmUgbmVlZGVkLCBpdCBzdWJtaXRzIGl0IHRvIHRoZSBjb2RlYy4gSXQgYWxzbyBzYXZlcyB0aGUgbGF0ZXN0CisgICAgLy8gbm9uLWRyb3BwZWQgZnJhbWUgYW5kIHN1Ym1pdHMgaXQgZm9yIHJlcGVhdCBlbmNvZGluZyAoaWYgdGhpcyBpcyBlbmFibGVkKS4KKyAgICAvLworICAgIC8vIFxyZXF1aXJlIHRoZXJlIG11c3QgYmUgYW4gYWNxdWlyZWQgZnJhbWUgKGkuZS4gd2UncmUgaW4gdGhlIG9uRnJhbWVBdmFpbGFibGUgY2FsbGJhY2ssCisgICAgLy8gb3IgaWYgd2UncmUgaW4gY29kZWNCdWZmZXJFbXB0aWVkIGFuZCBtTnVtRnJhbWVzQXZhaWxhYmxlIGlzIG5vbnplcm8pLgorICAgIC8vIFxyZXF1aXJlIGNvZGVjIG11c3QgYmUgZXhlY3V0aW5nCisgICAgLy8gXHJldHVybnMgdHJ1ZSBpZiBhY3F1aXJlZCAoYW5kIGhhbmRsZWQpIHRoZSBuZXh0IGZyYW1lLiBPdGhlcndpc2UsIGZhbHNlLgorICAgIGJvb2wgZmlsbENvZGVjQnVmZmVyX2woKTsKKworICAgIC8vIENhbGN1bGF0ZXMgdGhlIG1lZGlhIHRpbWVzdGFtcCBmb3IgfGl0ZW18IGFuZCBvbiBzdWNjZXNzIGl0IHN1Ym1pdHMgdGhlIGJ1ZmZlciB0byB0aGUgY29kZWMsCisgICAgLy8gd2hpbGUgYWxzbyBrZWVwaW5nIGEgcmVmZXJlbmNlIGZvciBpdCBpbiBtU3VibWl0dGVkQ29kZWNCdWZmZXJzLgorICAgIC8vIFJldHVybnMgVU5LTk9XTl9FUlJPUiBpZiB0aGUgYnVmZmVyIHdhcyBub3Qgc3VibWl0dGVkIGR1ZSB0byBidWZmZXIgdGltZXN0YW1wLiBPdGhlcndpc2UsCisgICAgLy8gaXQgcmV0dXJucyBhbnkgc3VibWl0IHN1Y2Nlc3Mgb3IgZXJyb3IgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGNvZGVjLgorICAgIHN0YXR1c190IHN1Ym1pdEJ1ZmZlcl9sKGNvbnN0IFZpZGVvQnVmZmVyICZpdGVtKTsKKworICAgIC8vIFN1Ym1pdHMgYW4gZW1wdHkgYnVmZmVyLCB3aXRoIHRoZSBFT1MgZmxhZyBzZXQgaWYgdGhlcmUgaXMgYW4gYXZhaWxhYmxlIGNvZGVjIGJ1ZmZlciBhbmQKKyAgICAvLyBzZXRzIG1FbmRPZlN0cmVhbVNlbnQgZmxhZy4gRG9lcyBub3RoaW5nIGlmIHRoZXJlIGlzIG5vIGNvZGVjIGJ1ZmZlciBhdmFpbGFibGUuCisgICAgdm9pZCBzdWJtaXRFbmRPZklucHV0U3RyZWFtX2woKTsKKworICAgIC8vIFNldCB0byB0cnVlIGlmIHdlIHdhbnQgdG8gc2VuZCBlbmQtb2Ytc3RyZWFtIGFmdGVyIHdlIHJ1biBvdXQgb2YgYXZhaWxhYmxlIGZyYW1lcyBmcm9tIHRoZQorICAgIC8vIHByb2R1Y2VyCisgICAgYm9vbCBtRW5kT2ZTdHJlYW07CisKKyAgICAvLyBGbGFnIHRoYXQgdGhlIEVPUyB3YXMgc3VibWl0dGVkIHRvIHRoZSBlbmNvZGVyCisgICAgYm9vbCBtRW5kT2ZTdHJlYW1TZW50OworCisgICAgLy8gRGF0YXNwYWNlIGZvciB0aGUgbGFzdCBmcmFtZSBzdWJtaXR0ZWQgdG8gdGhlIGNvZGVjCisgICAgYW5kcm9pZF9kYXRhc3BhY2UgbUxhc3REYXRhc3BhY2U7CisKKyAgICAvLyBEZWZhdWx0IGNvbG9yIGFzcGVjdHMgZm9yIHRoaXMgc291cmNlCisgICAgaW50MzJfdCBtRGVmYXVsdENvbG9yQXNwZWN0c1BhY2tlZDsKKworICAgIC8vIGNhbGxlZCB3aGVuIHRoZSBkYXRhIHNwYWNlIG9mIHRoZSBpbnB1dCBidWZmZXIgY2hhbmdlcworICAgIHZvaWQgb25EYXRhc3BhY2VDaGFuZ2VkX2woYW5kcm9pZF9kYXRhc3BhY2UgZGF0YXNwYWNlLCBhbmRyb2lkX3BpeGVsX2Zvcm1hdCBwaXhlbEZvcm1hdCk7CisKKyAgICAvLyBQb2ludGVyIGJhY2sgdG8gdGhlIGNvbXBvbmVudCB0aGF0IGNyZWF0ZWQgdXMuICBXZSBzZW5kIGJ1ZmZlcnMgaGVyZS4KKyAgICBzcDxDb21wb25lbnRXcmFwcGVyPiBtQ29tcG9uZW50OworCisgICAgLy8gU2V0IGJ5IHN0YXJ0KCkgLyBzdG9wKCkuCisgICAgYm9vbCBtRXhlY3V0aW5nOworCisgICAgYm9vbCBtU3VzcGVuZGVkOworCisgICAgLy8gcmV0dXJucyB0cnVlIGlmIHRoaXMgc291cmNlIGlzIHVuY29uZGl0aW9uYWxseSBkaXNjYXJkaW5nIGFjcXVpcmVkIGJ1ZmZlcnMgYXQgdGhlIG1vbWVudAorICAgIC8vIHJlZ2FyZGxlc3Mgb2YgdGhlIG1ldGFkYXRhIG9mIHRob3NlIGJ1ZmZlcnMKKyAgICBib29sIGFyZVdlRGlzY2FyZGluZ0F2YWlsYWJsZUJ1ZmZlcnNfbCgpOworCisgICAgaW50NjRfdCBtTGFzdEZyYW1lVGltZXN0YW1wVXM7CisKKyAgICAvLyBPdXIgQnVmZmVyUXVldWUgaW50ZXJmYWNlcy4gbVByb2R1Y2VyIGlzIHBhc3NlZCB0byB0aGUgcHJvZHVjZXIgdGhyb3VnaAorICAgIC8vIGdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIsIGFuZCBtQ29uc3VtZXIgaXMgdXNlZCBpbnRlcm5hbGx5IHRvIHJldHJpZXZlCisgICAgLy8gdGhlIGJ1ZmZlcnMgcXVldWVkIGJ5IHRoZSBwcm9kdWNlci4KKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtUHJvZHVjZXI7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gbUNvbnN1bWVyOworCisgICAgLy8gVGhlIHRpbWUgdG8gc3RvcCBzZW5kaW5nIGJ1ZmZlcnMuCisgICAgaW50NjRfdCBtU3RvcFRpbWVVczsKKworICAgIHN0cnVjdCBBY3Rpb25JdGVtIHsKKyAgICAgICAgdHlwZWRlZiBlbnVtIHsKKyAgICAgICAgICAgIFBBVVNFLAorICAgICAgICAgICAgUkVTVU1FLAorICAgICAgICAgICAgU1RPUAorICAgICAgICB9IEFjdGlvblR5cGU7CisgICAgICAgIEFjdGlvblR5cGUgbUFjdGlvbjsKKyAgICAgICAgaW50NjRfdCBtQWN0aW9uVGltZVVzOworICAgIH07CisKKyAgICAvLyBNYWludGFpbiBsYXN0IGFjdGlvbiB0aW1lc3RhbXAgdG8gZW5zdXJlIGFsbCB0aGUgYWN0aW9uIHRpbWVzdGFtcHMgYXJlCisgICAgLy8gbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLgorICAgIGludDY0X3QgbUxhc3RBY3Rpb25UaW1lVXM7CisKKyAgICAvLyBBbiBhY3Rpb24gcXVldWUgdGhhdCBxdWV1ZSB1cCBhbGwgdGhlIGFjdGlvbnMgc2VudCB0byBHcmFwaGljQnVmZmVyU291cmNlLgorICAgIC8vIFNUT1AgYWN0aW9uIHNob3VsZCBvbmx5IHNob3cgdXAgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCBhcyBhbGwgdGhlIGFjdGlvbnMKKyAgICAvLyBhZnRlciBhIFNUT1AgYWN0aW9uIHdpbGwgYmUgZGlzY2FyZGVkLiBtQWN0aW9uUXVldWUgaXMgcHJvdGVjdGVkIGJ5IG1NdXRleC4KKyAgICBMaXN0PEFjdGlvbkl0ZW0+IG1BY3Rpb25RdWV1ZTsKKworICAgIC8vLy8KKyAgICBmcmllbmQgc3RydWN0IEFIYW5kbGVyUmVmbGVjdG9yPEdyYXBoaWNCdWZmZXJTb3VyY2U+OworCisgICAgZW51bSB7CisgICAgICAgIGtXaGF0UmVwZWF0TGFzdEZyYW1lLCAgIC8vLzwgcXVldWUgbGFzdCBmcmFtZSBmb3IgcmVlbmNvZGluZworICAgIH07CisgICAgZW51bSB7CisgICAgICAgIGtSZXBlYXRMYXN0RnJhbWVDb3VudCA9IDEwLAorICAgIH07CisKKyAgICBpbnQ2NF90IG1Ta2lwRnJhbWVzQmVmb3JlTnM7CisKKyAgICBzcDxGcmFtZURyb3BwZXI+IG1GcmFtZURyb3BwZXI7CisKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOworICAgIHNwPEFIYW5kbGVyUmVmbGVjdG9yPEdyYXBoaWNCdWZmZXJTb3VyY2U+ID4gbVJlZmxlY3RvcjsKKworICAgIC8vIFJlcGVhdCBsYXN0IGZyYW1lIGZlYXR1cmUKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXI6IHJlcGVhdCBpbnRlcnZhbCBmb3IgZnJhbWUgcmVwZWF0aW5nICg8MCBpZiByZXBlYXRpbmcgaXMgZGlzYWJsZWQpCisgICAgaW50NjRfdCBtRnJhbWVSZXBlYXRJbnRlcnZhbFVzOworCisgICAgLy8gY3VycmVudCBmcmFtZSByZXBlYXQgZ2VuZXJhdGlvbiAtIHVzZWQgdG8gY2FuY2VsIGEgcGVuZGluZyBmcmFtZSByZXBlYXQKKyAgICBpbnQzMl90IG1SZXBlYXRMYXN0RnJhbWVHZW5lcmF0aW9uOworCisgICAgLy8gbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCBsYXRlc3QgZnJhbWUgKDAgPSBub25lKQorICAgIGludDMyX3QgbU91dHN0YW5kaW5nRnJhbWVSZXBlYXRDb3VudDsKKworICAgIC8vIFRoZSBwcmV2aW91cyBidWZmZXIgc2hvdWxkJ3ZlIGJlZW4gcmVwZWF0ZWQgYnV0CisgICAgLy8gbm8gY29kZWMgYnVmZmVyIHdhcyBhdmFpbGFibGUgYXQgdGhlIHRpbWUuCisgICAgYm9vbCBtRnJhbWVSZXBlYXRCbG9ja2VkT25Db2RlY0J1ZmZlcjsKKworICAgIC8vIGhvbGQgYSByZWZlcmVuY2UgdG8gdGhlIGxhc3QgYWNxdWlyZWQgKGFuZCBub3QgZGlzY2FyZGVkKSBmcmFtZSBmb3IgZnJhbWUgcmVwZWF0aW5nCisgICAgVmlkZW9CdWZmZXIgbUxhdGVzdEJ1ZmZlcjsKKworICAgIC8vIHF1ZXVlIGxhc3QgZnJhbWUgZm9yIHJlZW5jb2RlIGFmdGVyIHRoZSByZXBlYXQgaW50ZXJ2YWwuCisgICAgdm9pZCBxdWV1ZUZyYW1lUmVwZWF0X2woKTsKKworICAgIC8vIHNhdmUgfGl0ZW18IGFzIHRoZSBsYXRlc3QgYnVmZmVyIGFuZCBxdWV1ZSBpdCBmb3IgcmVlbmNvZGUgKHJlcGVhdCkKKyAgICB2b2lkIHNldExhdGVzdEJ1ZmZlcl9sKGNvbnN0IFZpZGVvQnVmZmVyICZpdGVtKTsKKworICAgIC8vIHN1Ym1pdCBsYXN0IGZyYW1lIHRvIGVuY29kZXIgYW5kIHF1ZXVlIGl0IGZvciByZWVuY29kZQorICAgIC8vIFxyZXR1cm4gdHJ1ZSBpZiBidWZmZXIgd2FzIHN1Ym1pdHRlZCwgZmFsc2UgaWYgaXQgd2Fzbid0IChlLmcuIHNvdXJjZSBpcyBzdXNwZW5kZWQsIHRoZXJlCisgICAgLy8gaXMgbm8gYXZhaWxhYmxlIGNvZGVjIGJ1ZmZlcikKKyAgICBib29sIHJlcGVhdExhdGVzdEJ1ZmZlcl9sKCk7CisKKyAgICAvLyBUaW1lIGxhcHNlIC8gc2xvdyBtb3Rpb24gY29uZmlndXJhdGlvbgorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvLyBkZXNpcmVkIGZyYW1lIHJhdGUgZm9yIGVuY29kaW5nIC0gdmFsdWUgPD0gMCBpZiB1bmRlZmluZWQKKyAgICBkb3VibGUgbUZwczsKKworICAgIC8vIGRlc2lyZWQgZnJhbWUgcmF0ZSBmb3IgY2FwdHVyZSAtIHZhbHVlIDw9IDAgaWYgdW5kZWZpbmVkCisgICAgZG91YmxlIG1DYXB0dXJlRnBzOworCisgICAgLy8gVGltZSBsYXBzZSBtb2RlIGlzIGVuYWJsZWQgaWYgdGhlIGNhcHR1cmUgZnJhbWUgcmF0ZSBpcyBkZWZpbmVkIGFuZCBpdCBpcworICAgIC8vIHNtYWxsZXIgdGhhbiBoYWxmIHRoZSBlbmNvZGluZyBmcmFtZSByYXRlIChpZiBkZWZpbmVkKS4gSW4gdGhpcyBtb2RlLAorICAgIC8vIGZyYW1lcyB0aGF0IGNvbWUgaW4gYmV0d2VlbiB0aGUgY2FwdHVyZSBpbnRlcnZhbCAodGhlIHJlY2lwcm9jYWwgb2YgdGhlCisgICAgLy8gY2FwdHVyZSBmcmFtZSByYXRlKSBhcmUgZHJvcHBlZCBhbmQgdGhlIGVuY29kaW5nIHRpbWVzdGFtcCBpcyBhZGp1c3RlZCB0bworICAgIC8vIG1hdGNoIHRoZSBkZXNpcmVkIGVuY29kaW5nIGZyYW1lIHJhdGUuCisgICAgLy8KKyAgICAvLyBTbG93IG1vdGlvbiBtb2RlIGlzIGVuYWJsZWQgaWYgYm90aCBlbmNvZGluZyBhbmQgY2FwdHVyZSBmcmFtZSByYXRlcyBhcmUKKyAgICAvLyBkZWZpbmVkIGFuZCB0aGUgZW5jb2RpbmcgZnJhbWUgcmF0ZSBpcyBsZXNzIHRoYW4gaGFsZiB0aGUgY2FwdHVyZSBmcmFtZQorICAgIC8vIHJhdGUuIEluIHRoaXMgbW9kZSwgdGhlIHNvdXJjZSBpcyBleHBlY3RlZCB0byBwcm9kdWNlIGZyYW1lcyB3aXRoIGFuIGV2ZW4KKyAgICAvLyB0aW1lc3RhbXAgaW50ZXJ2YWwgKGFmdGVyIHJvdW5kaW5nKSB3aXRoIHRoZSBjb25maWd1cmVkIGNhcHR1cmUgZnBzLiBUaGUKKyAgICAvLyBmaXJzdCBzb3VyY2UgdGltZXN0YW1wIGlzIHVzZWQgYXMgdGhlIHNvdXJjZSBiYXNlIHRpbWUuIEFmdGVyd2FyZHMsIHRoZQorICAgIC8vIHRpbWVzdGFtcCBvZiBlYWNoIHNvdXJjZSBmcmFtZSBpcyBzbmFwcGVkIHRvIHRoZSBuZWFyZXN0IGV4cGVjdGVkIGNhcHR1cmUKKyAgICAvLyB0aW1lc3RhbXAgYW5kIHNjYWxlZCB0byBtYXRjaCB0aGUgY29uZmlndXJlZCBlbmNvZGluZyBmcmFtZSByYXRlLgorCisgICAgLy8gVGhlc2UgbW9kZXMgbXVzdCBiZSBlbmFibGVkIGJlZm9yZSB1c2luZyB0aGlzIHNvdXJjZS4KKworICAgIC8vIGFkanVzdGVkIGNhcHR1cmUgdGltZXN0YW1wIG9mIHRoZSBiYXNlIGZyYW1lCisgICAgaW50NjRfdCBtQmFzZUNhcHR1cmVVczsKKworICAgIC8vIGFkanVzdGVkIGVuY29kaW5nIHRpbWVzdGFtcCBvZiB0aGUgYmFzZSBmcmFtZQorICAgIGludDY0X3QgbUJhc2VGcmFtZVVzOworCisgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBmcm9tIHRoZSBiYXNlIHRpbWUKKyAgICBpbnQ2NF90IG1GcmFtZUNvdW50OworCisgICAgLy8gYWRqdXN0ZWQgY2FwdHVyZSB0aW1lc3RhbXAgZm9yIHByZXZpb3VzIGZyYW1lIChuZWdhdGl2ZSBpZiB0aGVyZSB3ZXJlCisgICAgLy8gbm9uZSkKKyAgICBpbnQ2NF90IG1QcmV2Q2FwdHVyZVVzOworCisgICAgLy8gYWRqdXN0ZWQgbWVkaWEgdGltZXN0YW1wIGZvciBwcmV2aW91cyBmcmFtZSAobmVnYXRpdmUgaWYgdGhlcmUgd2VyZSBub25lKQorICAgIGludDY0X3QgbVByZXZGcmFtZVVzOworCisgICAgLy8gZGVzaXJlZCBvZmZzZXQgYmV0d2VlbiBtZWRpYSB0aW1lIGFuZCBjYXB0dXJlIHRpbWUKKyAgICBpbnQ2NF90IG1JbnB1dEJ1ZmZlclRpbWVPZmZzZXRVczsKKworICAgIC8vIENhbGN1bGF0ZXMgYW5kIG91dHB1dHMgdGhlIHRpbWVzdGFtcCB0byB1c2UgZm9yIGEgYnVmZmVyIHdpdGggYSBzcGVjaWZpYyBidWZmZXIgdGltZXN0YW1wCisgICAgLy8gfGJ1ZmZlclRpbWVzdGFtcE5zfC4gUmV0dXJucyBmYWxzZSBvbiBmYWlsdXJlIChidWZmZXIgdG9vIGNsb3NlIG9yIHRpbWVzdGFtcCBpcyBtb3ZpbmcKKyAgICAvLyBiYWNrd2FyZHMpLiBPdGhlcndpc2UsIHN0b3JlcyB0aGUgbWVkaWEgdGltZXN0YW1wIGluIHwqY29kZWNUaW1lVXN8IGFuZCByZXR1cm5zIHRydWUuCisgICAgLy8KKyAgICAvLyBUaGlzIG1ldGhvZCB0YWtlcyBpbnRvIGFjY291bnQgdGhlIHN0YXJ0IHRpbWUgb2Zmc2V0IGFuZCBhbnkgdGltZSBsYXBzZSBvciBzbG93IG1vdGlvbiB0aW1lCisgICAgLy8gYWRqdXN0bWVudCByZXF1ZXN0cy4KKyAgICBib29sIGNhbGN1bGF0ZUNvZGVjVGltZXN0YW1wX2wobnNlY3NfdCBidWZmZXJUaW1lTnMsIGludDY0X3QgKmNvZGVjVGltZVVzKTsKKworICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoR3JhcGhpY0J1ZmZlclNvdXJjZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEdSQVBISUNfQlVGRkVSX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGRmMjBmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmgKQEAgLTAsMCArMSwzODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX1NUQUdFRlJJR0hUX1dHUkFQSElDQlVGRkVSUFJPRFVDRVJfSF8KKyNkZWZpbmUgTUVESUFfU1RBR0VGUklHSFRfV0dSQVBISUNCVUZGRVJQUk9EVUNFUl9IXworCisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorCisjaW5jbHVkZSA8YmluZGVyL0JpbmRlci5oPgorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Z3VpL0lQcm9kdWNlckxpc3RlbmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dQcm9kdWNlckxpc3RlbmVyLmg+CisjaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9idWZmZXJxdWV1ZS8xLjAvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpWMV8wOjpBbndCdWZmZXI7Cit1c2luZyA6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3R5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjoKKyAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OgorICAgICAgICBJUHJvZHVjZXJMaXN0ZW5lciBIUHJvZHVjZXJMaXN0ZW5lcjsKKwordHlwZWRlZiA6OmFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXIgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3R5cGVkZWYgOjphbmRyb2lkOjpJUHJvZHVjZXJMaXN0ZW5lciBCUHJvZHVjZXJMaXN0ZW5lcjsKK3VzaW5nIDo6YW5kcm9pZDo6Qm5HcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKKyNpZm5kZWYgTE9HCitzdHJ1Y3QgTE9HX2R1bW15IHsKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICBMT0dfZHVtbXkmIG9wZXJhdG9yPDwgKGNvbnN0IFQmKSB7IHJldHVybiAqdGhpczsgfQorfTsKKworI2RlZmluZSBMT0coeCkgIExPR19kdW1teSgpCisjZW5kaWYKKworLy8gSW5zdGFudGlhdGUgb25seSBpZiBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGlzIGJhc2Ugb2YgQkFTRS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBCQVNFLAorICAgICAgICAgIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19iYXNlX29mPEhHcmFwaGljQnVmZmVyUHJvZHVjZXIsIEJBU0U+Ojp2YWx1ZT46OnR5cGU+CitzdHJ1Y3QgVFdHcmFwaGljQnVmZmVyUHJvZHVjZXIgOiBwdWJsaWMgQkFTRSB7CisgICAgVFdHcmFwaGljQnVmZmVyUHJvZHVjZXIoc3A8QkdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gY29uc3QmIGJhc2UpIDogbUJhc2UoYmFzZSkge30KKyAgICBSZXR1cm48dm9pZD4gcmVxdWVzdEJ1ZmZlcihpbnQzMl90IHNsb3QsIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OnJlcXVlc3RCdWZmZXJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQmFzZS0+cmVxdWVzdEJ1ZmZlcihzbG90LCAmYnVmKTsKKyAgICAgICAgQW53QnVmZmVyIGFud0J1ZmZlcjsKKyAgICAgICAgaWYgKGJ1ZiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICA6OmFuZHJvaWQ6OmNvbnZlcnNpb246OndyYXBBcygmYW53QnVmZmVyLCAqYnVmKTsKKyAgICAgICAgfQorICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLCBhbndCdWZmZXIpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIFJldHVybjxpbnQzMl90PiBzZXRNYXhEZXF1ZXVlZEJ1ZmZlckNvdW50KGludDMyX3QgbWF4RGVxdWV1ZWRCdWZmZXJzKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtQmFzZS0+c2V0TWF4RGVxdWV1ZWRCdWZmZXJDb3VudCgKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KG1heERlcXVldWVkQnVmZmVycykpKTsKKyAgICB9CisKKyAgICBSZXR1cm48aW50MzJfdD4gc2V0QXN5bmNNb2RlKGJvb2wgYXN5bmMpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1CYXNlLT5zZXRBc3luY01vZGUoYXN5bmMpKTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gZGVxdWV1ZUJ1ZmZlcigKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdCBmb3JtYXQsIHVpbnQzMl90IHVzYWdlLAorICAgICAgICAgICAgYm9vbCBnZXRGcmFtZVRpbWVzdGFtcHMsIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmRlcXVldWVCdWZmZXJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlIHsKKyAgICAgICAgaW50IHNsb3Q7CisgICAgICAgIHNwPEZlbmNlPiBmZW5jZTsKKyAgICAgICAgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIG91dFRpbWVzdGFtcHM7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1CYXNlLT5kZXF1ZXVlQnVmZmVyKAorICAgICAgICAgICAgJnNsb3QsICZmZW5jZSwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PDo6YW5kcm9pZDo6UGl4ZWxGb3JtYXQ+KGZvcm1hdCksIHVzYWdlLCBudWxscHRyLAorICAgICAgICAgICAgZ2V0RnJhbWVUaW1lc3RhbXBzID8gJm91dFRpbWVzdGFtcHMgOiBudWxscHRyKTsKKyAgICAgICAgaGlkbF9oYW5kbGUgdEZlbmNlOworICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIHRPdXRUaW1lc3RhbXBzOworCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogbmggPSBudWxscHRyOworICAgICAgICBpZiAoKGZlbmNlID09IG51bGxwdHIpIHx8ICE6OmFuZHJvaWQ6OmNvbnZlcnNpb246OndyYXBBcygmdEZlbmNlLCAmbmgsICpmZW5jZSkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpkZXF1ZXVlQnVmZmVyIC0gIgorICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBvdXRwdXQgZmVuY2UiOworICAgICAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHNsb3QpLAorICAgICAgICAgICAgICAgICAgICAgdEZlbmNlLAorICAgICAgICAgICAgICAgICAgICAgdE91dFRpbWVzdGFtcHMpOworICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiA+IG5oQUE7CisgICAgICAgIGlmIChnZXRGcmFtZVRpbWVzdGFtcHMgJiYgITo6YW5kcm9pZDo6Y29udmVyc2lvbjo6d3JhcEFzKCZ0T3V0VGltZXN0YW1wcywgJm5oQUEsIG91dFRpbWVzdGFtcHMpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6ZGVxdWV1ZUJ1ZmZlciAtICIKKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgb3V0cHV0IHRpbWVzdGFtcHMiOworICAgICAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHNsb3QpLAorICAgICAgICAgICAgICAgICAgICAgdEZlbmNlLAorICAgICAgICAgICAgICAgICAgICAgdE91dFRpbWVzdGFtcHMpOworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOworICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oc2xvdCksCisgICAgICAgICAgICAgICAgdEZlbmNlLAorICAgICAgICAgICAgICAgIHRPdXRUaW1lc3RhbXBzKTsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOworICAgICAgICBpZiAoZ2V0RnJhbWVUaW1lc3RhbXBzKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8mIG5oQSA6IG5oQUEpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIGhhbmRsZSA6IG5oQSkgeworICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIFJldHVybjxpbnQzMl90PiBkZXRhY2hCdWZmZXIoaW50MzJfdCBzbG90KSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtQmFzZS0+ZGV0YWNoQnVmZmVyKHNsb3QpKTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gZGV0YWNoTmV4dEJ1ZmZlcihIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpkZXRhY2hOZXh0QnVmZmVyX2NiIF9oaWRsX2NiKSBvdmVycmlkZSB7CisgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IG91dEJ1ZmZlcjsKKyAgICAgICAgc3A8RmVuY2U+IG91dEZlbmNlOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQmFzZS0+ZGV0YWNoTmV4dEJ1ZmZlcigmb3V0QnVmZmVyLCAmb3V0RmVuY2UpOworICAgICAgICBBbndCdWZmZXIgdEJ1ZmZlcjsKKyAgICAgICAgaGlkbF9oYW5kbGUgdEZlbmNlOworCisgICAgICAgIGlmIChvdXRCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmRldGFjaE5leHRCdWZmZXIgLSAiCisgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIG91dHB1dCBidWZmZXIiOworICAgICAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwgdEJ1ZmZlciwgdEZlbmNlKTsKKyAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgIH0KKyAgICAgICAgOjphbmRyb2lkOjpjb252ZXJzaW9uOjp3cmFwQXMoJnRCdWZmZXIsICpvdXRCdWZmZXIpOworICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIG5oID0gbnVsbHB0cjsKKyAgICAgICAgaWYgKChvdXRGZW5jZSAhPSBudWxscHRyKSAmJiAhOjphbmRyb2lkOjpjb252ZXJzaW9uOjp3cmFwQXMoJnRGZW5jZSwgJm5oLCAqb3V0RmVuY2UpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6ZGV0YWNoTmV4dEJ1ZmZlciAtICIKKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgb3V0cHV0IGZlbmNlIjsKKyAgICAgICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksIHRCdWZmZXIsIHRGZW5jZSk7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisKKyAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwgdEJ1ZmZlciwgdEZlbmNlKTsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIFJldHVybjx2b2lkPiBhdHRhY2hCdWZmZXIoY29uc3QgQW53QnVmZmVyJiBidWZmZXIsIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmF0dGFjaEJ1ZmZlcl9jYiBfaGlkbF9jYikgb3ZlcnJpZGUgeworICAgICAgICBpbnQgb3V0U2xvdDsKKyAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gbEJ1ZmZlciA9IG5ldyBHcmFwaGljQnVmZmVyKCk7CisgICAgICAgIGlmICghOjphbmRyb2lkOjpjb252ZXJzaW9uOjpjb252ZXJ0VG8obEJ1ZmZlci5nZXQoKSwgYnVmZmVyKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmF0dGFjaEJ1ZmZlciAtICIKKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgaW5wdXQgbmF0aXZlIHdpbmRvdyBidWZmZXIiOworICAgICAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oQkFEX1ZBTFVFKSwgLTEpOworICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQmFzZS0+YXR0YWNoQnVmZmVyKCZvdXRTbG90LCBsQnVmZmVyKTsKKworICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLCBzdGF0aWNfY2FzdDxpbnQzMl90PihvdXRTbG90KSk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgUmV0dXJuPHZvaWQ+IHF1ZXVlQnVmZmVyKAorICAgICAgICAgICAgaW50MzJfdCBzbG90LCBjb25zdCBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0JiBpbnB1dCwKKyAgICAgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OnF1ZXVlQnVmZmVyX2NiIF9oaWRsX2NiKSBvdmVycmlkZSB7CisgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IHRPdXRwdXQ7CisgICAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgbElucHV0KAorICAgICAgICAgICAgICAgIDAsIGZhbHNlLCBIQUxfREFUQVNQQUNFX1VOS05PV04sCisgICAgICAgICAgICAgICAgOjphbmRyb2lkOjpSZWN0KDAsIDAsIDEsIDEpLAorICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX0ZSRUVaRSwKKyAgICAgICAgICAgICAgICAwLCA6OmFuZHJvaWQ6OkZlbmNlOjpOT19GRU5DRSk7CisgICAgICAgIGlmICghOjphbmRyb2lkOjpjb252ZXJzaW9uOjpjb252ZXJ0VG8oJmxJbnB1dCwgaW5wdXQpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6cXVldWVCdWZmZXIgLSAiCisgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGlucHV0IjsKKyAgICAgICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KEJBRF9WQUxVRSksIHRPdXRwdXQpOworICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgfQorICAgICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCBsT3V0cHV0OworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQmFzZS0+cXVldWVCdWZmZXIoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzbG90KSwgbElucHV0LCAmbE91dHB1dCk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gPiBuaEFBOworICAgICAgICBpZiAoITo6YW5kcm9pZDo6Y29udmVyc2lvbjo6d3JhcEFzKCZ0T3V0cHV0LCAmbmhBQSwgbE91dHB1dCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpxdWV1ZUJ1ZmZlciAtICIKKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgb3V0cHV0IjsKKyAgICAgICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KEJBRF9WQUxVRSksIHRPdXRwdXQpOworICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksIHRPdXRwdXQpOworICAgICAgICBmb3IgKGF1dG8mIG5oQSA6IG5oQUEpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgbmggOiBuaEEpIHsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBSZXR1cm48aW50MzJfdD4gY2FuY2VsQnVmZmVyKGludDMyX3Qgc2xvdCwgY29uc3QgaGlkbF9oYW5kbGUmIGZlbmNlKSBvdmVycmlkZSB7CisgICAgICAgIHNwPEZlbmNlPiBsRmVuY2UgPSBuZXcgRmVuY2UoKTsKKyAgICAgICAgaWYgKCE6OmFuZHJvaWQ6OmNvbnZlcnNpb246OmNvbnZlcnRUbyhsRmVuY2UuZ2V0KCksIGZlbmNlKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmNhbmNlbEJ1ZmZlciAtICIKKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgaW5wdXQgZmVuY2UiOworICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KEJBRF9WQUxVRSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1CYXNlLT5jYW5jZWxCdWZmZXIoc3RhdGljX2Nhc3Q8aW50PihzbG90KSwgbEZlbmNlKSk7CisgICAgfQorCisgICAgUmV0dXJuPHZvaWQ+IHF1ZXJ5KGludDMyX3Qgd2hhdCwgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6cXVlcnlfY2IgX2hpZGxfY2IpIG92ZXJyaWRlIHsKKyAgICAgICAgaW50IGxWYWx1ZTsKKyAgICAgICAgaW50IGxSZXR1cm4gPSBtQmFzZS0+cXVlcnkoc3RhdGljX2Nhc3Q8aW50Pih3aGF0KSwgJmxWYWx1ZSk7CisgICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KGxSZXR1cm4pLCBzdGF0aWNfY2FzdDxpbnQzMl90PihsVmFsdWUpKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gY29ubmVjdChjb25zdCBzcDxIUHJvZHVjZXJMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgaW50MzJfdCBhcGksIGJvb2wgcHJvZHVjZXJDb250cm9sbGVkQnlBcHAsCisgICAgICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpjb25uZWN0X2NiIF9oaWRsX2NiKSBvdmVycmlkZSB7CisgICAgICAgIHNwPEJQcm9kdWNlckxpc3RlbmVyPiBsTGlzdGVuZXIgPSBsaXN0ZW5lciA9PSBudWxscHRyID8KKyAgICAgICAgICAgICAgICBudWxscHRyIDogbmV3IExXUHJvZHVjZXJMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IGxPdXRwdXQ7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1CYXNlLT5jb25uZWN0KGxMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGFwaSksCisgICAgICAgICAgICAgICAgcHJvZHVjZXJDb250cm9sbGVkQnlBcHAsCisgICAgICAgICAgICAgICAgJmxPdXRwdXQpOworCisgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IHRPdXRwdXQ7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+ID4gbmhBQTsKKyAgICAgICAgaWYgKCE6OmFuZHJvaWQ6OmNvbnZlcnNpb246OndyYXBBcygmdE91dHB1dCwgJm5oQUEsIGxPdXRwdXQpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6Y29ubmVjdCAtICIKKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgb3V0cHV0IjsKKyAgICAgICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksIHRPdXRwdXQpOworICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksIHRPdXRwdXQpOworICAgICAgICBmb3IgKGF1dG8mIG5oQSA6IG5oQUEpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byYgbmggOiBuaEEpIHsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBSZXR1cm48aW50MzJfdD4gZGlzY29ubmVjdCgKKyAgICAgICAgICAgIGludDMyX3QgYXBpLAorICAgICAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGUgbW9kZSkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUJhc2UtPmRpc2Nvbm5lY3QoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihhcGkpLAorICAgICAgICAgICAgICAgIDo6YW5kcm9pZDo6Y29udmVyc2lvbjo6dG9HdWlEaXNjb25uZWN0TW9kZShtb2RlKSkpOworICAgIH0KKworICAgIFJldHVybjxpbnQzMl90PiBzZXRTaWRlYmFuZFN0cmVhbShjb25zdCBoaWRsX2hhbmRsZSYgc3RyZWFtKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtQmFzZS0+c2V0U2lkZWJhbmRTdHJlYW0oTmF0aXZlSGFuZGxlOjpjcmVhdGUoCisgICAgICAgICAgICAgICAgc3RyZWFtID8gbmF0aXZlX2hhbmRsZV9jbG9uZShzdHJlYW0pIDogTlVMTCwgdHJ1ZSkpKTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gYWxsb2NhdGVCdWZmZXJzKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgIHVpbnQzMl90IHVzYWdlKSBvdmVycmlkZSB7CisgICAgICAgIG1CYXNlLT5hbGxvY2F0ZUJ1ZmZlcnMoCisgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDw6OmFuZHJvaWQ6OlBpeGVsRm9ybWF0Pihmb3JtYXQpLAorICAgICAgICAgICAgICAgIHVzYWdlKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBSZXR1cm48aW50MzJfdD4gYWxsb3dBbGxvY2F0aW9uKGJvb2wgYWxsb3cpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1CYXNlLT5hbGxvd0FsbG9jYXRpb24oYWxsb3cpKTsKKyAgICB9CisKKyAgICBSZXR1cm48aW50MzJfdD4gc2V0R2VuZXJhdGlvbk51bWJlcih1aW50MzJfdCBnZW5lcmF0aW9uTnVtYmVyKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtQmFzZS0+c2V0R2VuZXJhdGlvbk51bWJlcihnZW5lcmF0aW9uTnVtYmVyKSk7CisgICAgfQorCisgICAgUmV0dXJuPHZvaWQ+IGdldENvbnN1bWVyTmFtZShIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpnZXRDb25zdW1lck5hbWVfY2IgX2hpZGxfY2IpIG92ZXJyaWRlIHsKKyAgICAgICAgX2hpZGxfY2IobUJhc2UtPmdldENvbnN1bWVyTmFtZSgpLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBSZXR1cm48aW50MzJfdD4gc2V0U2hhcmVkQnVmZmVyTW9kZShib29sIHNoYXJlZEJ1ZmZlck1vZGUpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1CYXNlLT5zZXRTaGFyZWRCdWZmZXJNb2RlKHNoYXJlZEJ1ZmZlck1vZGUpKTsKKyAgICB9CisKKyAgICBSZXR1cm48aW50MzJfdD4gc2V0QXV0b1JlZnJlc2goYm9vbCBhdXRvUmVmcmVzaCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUJhc2UtPnNldEF1dG9SZWZyZXNoKGF1dG9SZWZyZXNoKSk7CisgICAgfQorCisgICAgUmV0dXJuPGludDMyX3Q+IHNldERlcXVldWVUaW1lb3V0KGludDY0X3QgdGltZW91dE5zKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtQmFzZS0+c2V0RGVxdWV1ZVRpbWVvdXQodGltZW91dE5zKSk7CisgICAgfQorCisgICAgUmV0dXJuPHZvaWQ+IGdldExhc3RRdWV1ZWRCdWZmZXIoSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6Z2V0TGFzdFF1ZXVlZEJ1ZmZlcl9jYiBfaGlkbF9jYikgb3ZlcnJpZGUgeworICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBsT3V0QnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKKyAgICAgICAgc3A8RmVuY2U+IGxPdXRGZW5jZSA9IG5ldyBGZW5jZSgpOworICAgICAgICBmbG9hdCBsT3V0VHJhbnNmb3JtTWF0cml4WzE2XTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUJhc2UtPmdldExhc3RRdWV1ZWRCdWZmZXIoCisgICAgICAgICAgICAgICAgJmxPdXRCdWZmZXIsICZsT3V0RmVuY2UsIGxPdXRUcmFuc2Zvcm1NYXRyaXgpOworCisgICAgICAgIEFud0J1ZmZlciB0T3V0QnVmZmVyOworICAgICAgICBpZiAobE91dEJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICA6OmFuZHJvaWQ6OmNvbnZlcnNpb246OndyYXBBcygmdE91dEJ1ZmZlciwgKmxPdXRCdWZmZXIpOworICAgICAgICB9CisgICAgICAgIGhpZGxfaGFuZGxlIHRPdXRGZW5jZTsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBuaCA9IG51bGxwdHI7CisgICAgICAgIGlmICgobE91dEZlbmNlID09IG51bGxwdHIpIHx8ICE6OmFuZHJvaWQ6OmNvbnZlcnNpb246OndyYXBBcygmdE91dEZlbmNlLCAmbmgsICpsT3V0RmVuY2UpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6Z2V0TGFzdFF1ZXVlZEJ1ZmZlciAtICIKKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgb3V0cHV0IGZlbmNlIjsKKyAgICAgICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksCisgICAgICAgICAgICAgICAgICAgIHRPdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgIHRPdXRGZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgaGlkbF9hcnJheTxmbG9hdCwgMTY+KCkpOworICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgfQorICAgICAgICBoaWRsX2FycmF5PGZsb2F0LCAxNj4gdE91dFRyYW5zZm9ybU1hdHJpeChsT3V0VHJhbnNmb3JtTWF0cml4KTsKKworICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLCB0T3V0QnVmZmVyLCB0T3V0RmVuY2UsIHRPdXRUcmFuc2Zvcm1NYXRyaXgpOworICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgUmV0dXJuPHZvaWQ+IGdldEZyYW1lVGltZXN0YW1wcyhIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpnZXRGcmFtZVRpbWVzdGFtcHNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlIHsKKyAgICAgICAgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIGxEZWx0YTsKKyAgICAgICAgbUJhc2UtPmdldEZyYW1lVGltZXN0YW1wcygmbERlbHRhKTsKKworICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIHREZWx0YTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gPiBuaEFBOworICAgICAgICBpZiAoITo6YW5kcm9pZDo6Y29udmVyc2lvbjo6d3JhcEFzKCZ0RGVsdGEsICZuaEFBLCBsRGVsdGEpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6Z2V0RnJhbWVUaW1lc3RhbXBzIC0gIgorICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBvdXRwdXQgZnJhbWUgdGltZXN0YW1wcyI7CisgICAgICAgICAgICBfaGlkbF9jYih0RGVsdGEpOworICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIF9oaWRsX2NiKHREZWx0YSk7CisgICAgICAgIGZvciAoYXV0byYgbmhBIDogbmhBQSkgeworICAgICAgICAgICAgZm9yIChhdXRvJiBuaCA6IG5oQSkgeworICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIFJldHVybjx2b2lkPiBnZXRVbmlxdWVJZChIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpnZXRVbmlxdWVJZF9jYiBfaGlkbF9jYikgb3ZlcnJpZGUgeworICAgICAgICB1aW50NjRfdCBvdXRJZDsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUJhc2UtPmdldFVuaXF1ZUlkKCZvdXRJZCk7CisgICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksIG91dElkKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3A8QkdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbUJhc2U7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX1NUQUdFRlJJR0hUX1dHUkFQSElDQlVGRkVSUFJPRFVDRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV1Byb2R1Y2VyTGlzdGVuZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV1Byb2R1Y2VyTGlzdGVuZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWJiYTg3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9XUHJvZHVjZXJMaXN0ZW5lci5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX1NUQUdFRlJJR0hUX1dQUk9EVUNFUkxJU1RFTkVSX0hfCisjZGVmaW5lIE1FRElBX1NUQUdFRlJJR0hUX1dQUk9EVUNFUkxJU1RFTkVSX0hfCisKKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSUJpbmRlci5oPgorI2luY2x1ZGUgPGd1aS9JUHJvZHVjZXJMaXN0ZW5lci5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9idWZmZXJxdWV1ZS8xLjAvSVByb2R1Y2VyTGlzdGVuZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyA6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCit0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6SVByb2R1Y2VyTGlzdGVuZXIKKyAgICAgICAgSFByb2R1Y2VyTGlzdGVuZXI7Cit0eXBlZGVmIDo6YW5kcm9pZDo6SVByb2R1Y2VyTGlzdGVuZXIKKyAgICAgICAgQlByb2R1Y2VyTGlzdGVuZXI7Cit1c2luZyA6OmFuZHJvaWQ6OkJuUHJvZHVjZXJMaXN0ZW5lcjsKKworc3RydWN0IFRXUHJvZHVjZXJMaXN0ZW5lciA6IHB1YmxpYyBIUHJvZHVjZXJMaXN0ZW5lciB7CisgICAgc3A8QlByb2R1Y2VyTGlzdGVuZXI+IG1CYXNlOworICAgIFRXUHJvZHVjZXJMaXN0ZW5lcihzcDxCUHJvZHVjZXJMaXN0ZW5lcj4gY29uc3QmIGJhc2UpOworICAgIFJldHVybjx2b2lkPiBvbkJ1ZmZlclJlbGVhc2VkKCkgb3ZlcnJpZGU7CisgICAgUmV0dXJuPGJvb2w+IG5lZWRzUmVsZWFzZU5vdGlmeSgpIG92ZXJyaWRlOworfTsKKworY2xhc3MgTFdQcm9kdWNlckxpc3RlbmVyIDogcHVibGljIEJuUHJvZHVjZXJMaXN0ZW5lciB7CitwdWJsaWM6CisgICAgc3A8SFByb2R1Y2VyTGlzdGVuZXI+IG1CYXNlOworICAgIExXUHJvZHVjZXJMaXN0ZW5lcihzcDxIUHJvZHVjZXJMaXN0ZW5lcj4gY29uc3QmIGJhc2UpOworICAgIHZvaWQgb25CdWZmZXJSZWxlYXNlZCgpIG92ZXJyaWRlOworICAgIGJvb2wgbmVlZHNSZWxlYXNlTm90aWZ5KCkgb3ZlcnJpZGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX1NUQUdFRlJJR0hUX1dQUk9EVUNFUkxJU1RFTkVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvdGVzdHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmJjM2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvdGVzdHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDE1IEBACitjY190ZXN0IHsKKyAgICBuYW1lOiAiRnJhbWVEcm9wcGVyX3Rlc3QiLAorCisgICAgc3JjczogWyJGcmFtZURyb3BwZXJfdGVzdC5jcHAiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZV9oZWxwZXIiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci90ZXN0cy9GcmFtZURyb3BwZXJfdGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci90ZXN0cy9GcmFtZURyb3BwZXJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVhZTc3YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL3Rlc3RzL0ZyYW1lRHJvcHBlcl90ZXN0LmNwcApAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRnJhbWVEcm9wcGVyX3Rlc3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvRnJhbWVEcm9wcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgVGVzdEZyYW1lIHsKKyAgaW50NjRfdCB0aW1lVXM7CisgIGJvb2wgc2hvdWxkRHJvcDsKK307CisKK3N0YXRpYyBjb25zdCBUZXN0RnJhbWUgdGVzdEZyYW1lczIwRnBzW10gPSB7CisgICAgezEwMDAwMDAsIGZhbHNlfSwgezEwNTAwMDAsIGZhbHNlfSwgezExMDAwMDAsIGZhbHNlfSwgezExNTAwMDAsIGZhbHNlfSwKKyAgICB7MTIwMDAwMCwgZmFsc2V9LCB7MTI1MDAwMCwgZmFsc2V9LCB7MTMwMDAwMCwgZmFsc2V9LCB7MTM1MDAwMCwgZmFsc2V9LAorICAgIHsxNDAwMDAwLCBmYWxzZX0sIHsxNDUwMDAwLCBmYWxzZX0sIHsxNTAwMDAwLCBmYWxzZX0sIHsxNTUwMDAwLCBmYWxzZX0sCisgICAgezE2MDAwMDAsIGZhbHNlfSwgezE2NTAwMDAsIGZhbHNlfSwgezE3MDAwMDAsIGZhbHNlfSwgezE3NTAwMDAsIGZhbHNlfSwKKyAgICB7MTgwMDAwMCwgZmFsc2V9LCB7MTg1MDAwMCwgZmFsc2V9LCB7MTkwMDAwMCwgZmFsc2V9LCB7MTk1MDAwMCwgZmFsc2V9LAorfTsKKworc3RhdGljIGNvbnN0IFRlc3RGcmFtZSB0ZXN0RnJhbWVzMzBGcHNbXSA9IHsKKyAgICB7MTAwMDAwMCwgZmFsc2V9LCB7MTAzMzMzMywgZmFsc2V9LCB7MTA2NjY2NywgZmFsc2V9LCB7MTEwMDAwMCwgZmFsc2V9LAorICAgIHsxMTMzMzMzLCBmYWxzZX0sIHsxMTY2NjY3LCBmYWxzZX0sIHsxMjAwMDAwLCBmYWxzZX0sIHsxMjMzMzMzLCBmYWxzZX0sCisgICAgezEyNjY2NjcsIGZhbHNlfSwgezEzMDAwMDAsIGZhbHNlfSwgezEzMzMzMzMsIGZhbHNlfSwgezEzNjY2NjcsIGZhbHNlfSwKKyAgICB7MTQwMDAwMCwgZmFsc2V9LCB7MTQzMzMzMywgZmFsc2V9LCB7MTQ2NjY2NywgZmFsc2V9LCB7MTUwMDAwMCwgZmFsc2V9LAorICAgIHsxNTMzMzMzLCBmYWxzZX0sIHsxNTY2NjY3LCBmYWxzZX0sIHsxNjAwMDAwLCBmYWxzZX0sIHsxNjMzMzMzLCBmYWxzZX0sCit9OworCitzdGF0aWMgY29uc3QgVGVzdEZyYW1lIHRlc3RGcmFtZXM0MEZwc1tdID0geworICAgIHsxMDAwMDAwLCBmYWxzZX0sIHsxMDI1MDAwLCB0cnVlfSwgezEwNTAwMDAsIGZhbHNlfSwgezEwNzUwMDAsIGZhbHNlfSwKKyAgICB7MTEwMDAwMCwgZmFsc2V9LCB7MTEyNTAwMCwgdHJ1ZX0sIHsxMTUwMDAwLCBmYWxzZX0sIHsxMTc1MDAwLCBmYWxzZX0sCisgICAgezEyMDAwMDAsIGZhbHNlfSwgezEyMjUwMDAsIHRydWV9LCB7MTI1MDAwMCwgZmFsc2V9LCB7MTI3NTAwMCwgZmFsc2V9LAorICAgIHsxMzAwMDAwLCBmYWxzZX0sIHsxMzI1MDAwLCB0cnVlfSwgezEzNTAwMDAsIGZhbHNlfSwgezEzNzUwMDAsIGZhbHNlfSwKKyAgICB7MTQwMDAwMCwgZmFsc2V9LCB7MTQyNTAwMCwgdHJ1ZX0sIHsxNDUwMDAwLCBmYWxzZX0sIHsxNDc1MDAwLCBmYWxzZX0sCit9OworCitzdGF0aWMgY29uc3QgVGVzdEZyYW1lIHRlc3RGcmFtZXM2MEZwc1tdID0geworICAgIHsxMDAwMDAwLCBmYWxzZX0sIHsxMDE2NjY3LCB0cnVlfSwgezEwMzMzMzMsIGZhbHNlfSwgezEwNTAwMDAsIHRydWV9LAorICAgIHsxMDY2NjY3LCBmYWxzZX0sIHsxMDgzMzMzLCB0cnVlfSwgezExMDAwMDAsIGZhbHNlfSwgezExMTY2NjcsIHRydWV9LAorICAgIHsxMTMzMzMzLCBmYWxzZX0sIHsxMTUwMDAwLCB0cnVlfSwgezExNjY2NjcsIGZhbHNlfSwgezExODMzMzMsIHRydWV9LAorICAgIHsxMjAwMDAwLCBmYWxzZX0sIHsxMjE2NjY3LCB0cnVlfSwgezEyMzMzMzMsIGZhbHNlfSwgezEyNTAwMDAsIHRydWV9LAorICAgIHsxMjY2NjY3LCBmYWxzZX0sIHsxMjgzMzMzLCB0cnVlfSwgezEzMDAwMDAsIGZhbHNlfSwgezEzMTY2NjcsIHRydWV9LAorfTsKKworc3RhdGljIGNvbnN0IFRlc3RGcmFtZSB0ZXN0RnJhbWVzVmFyaWFibGVGcHNbXSA9IHsKKyAgICAvLyA0MGZwcworICAgIHsxMDAwMDAwLCBmYWxzZX0sIHsxMDI1MDAwLCB0cnVlfSwgezEwNTAwMDAsIGZhbHNlfSwgezEwNzUwMDAsIGZhbHNlfSwKKyAgICB7MTEwMDAwMCwgZmFsc2V9LCB7MTEyNTAwMCwgdHJ1ZX0sIHsxMTUwMDAwLCBmYWxzZX0sIHsxMTc1MDAwLCBmYWxzZX0sCisgICAgezEyMDAwMDAsIGZhbHNlfSwgezEyMjUwMDAsIHRydWV9LCB7MTI1MDAwMCwgZmFsc2V9LCB7MTI3NTAwMCwgZmFsc2V9LAorICAgIHsxMzAwMDAwLCBmYWxzZX0sIHsxMzI1MDAwLCB0cnVlfSwgezEzNTAwMDAsIGZhbHNlfSwgezEzNzUwMDAsIGZhbHNlfSwKKyAgICB7MTQwMDAwMCwgZmFsc2V9LCB7MTQyNTAwMCwgdHJ1ZX0sIHsxNDUwMDAwLCBmYWxzZX0sIHsxNDc1MDAwLCBmYWxzZX0sCisgICAgLy8gYSB0aW1lc3RhbXAganVtcCBwbHVzIHN3aXRjaCB0byAyMGZwcworICAgIHsyMDAwMDAwLCBmYWxzZX0sIHsyMDUwMDAwLCBmYWxzZX0sIHsyMTAwMDAwLCBmYWxzZX0sIHsyMTUwMDAwLCBmYWxzZX0sCisgICAgezIyMDAwMDAsIGZhbHNlfSwgezIyNTAwMDAsIGZhbHNlfSwgezIzMDAwMDAsIGZhbHNlfSwgezIzNTAwMDAsIGZhbHNlfSwKKyAgICB7MjQwMDAwMCwgZmFsc2V9LCB7MjQ1MDAwMCwgZmFsc2V9LCB7MjUwMDAwMCwgZmFsc2V9LCB7MjU1MDAwMCwgZmFsc2V9LAorICAgIHsyNjAwMDAwLCBmYWxzZX0sIHsyNjUwMDAwLCBmYWxzZX0sIHsyNzAwMDAwLCBmYWxzZX0sIHsyNzUwMDAwLCBmYWxzZX0sCisgICAgezI4MDAwMDAsIGZhbHNlfSwgezI4NTAwMDAsIGZhbHNlfSwgezI5MDAwMDAsIGZhbHNlfSwgezI5NTAwMDAsIGZhbHNlfSwKKyAgICAvLyA2MGZwcworICAgIHsyOTY2NjY3LCBmYWxzZX0sIHsyOTgzMzMzLCB0cnVlfSwgezMwMDAwMDAsIGZhbHNlfSwgezMwMTY2NjcsIHRydWV9LAorICAgIHszMDMzMzMzLCBmYWxzZX0sIHszMDUwMDAwLCB0cnVlfSwgezMwNjY2NjcsIGZhbHNlfSwgezMwODMzMzMsIHRydWV9LAorICAgIHszMTAwMDAwLCBmYWxzZX0sIHszMTE2NjY3LCB0cnVlfSwgezMxMzMzMzMsIGZhbHNlfSwgezMxNTAwMDAsIHRydWV9LAorICAgIHszMTY2NjY3LCBmYWxzZX0sIHszMTgzMzMzLCB0cnVlfSwgezMyMDAwMDAsIGZhbHNlfSwgezMyMTY2NjcsIHRydWV9LAorICAgIHszMjMzMzMzLCBmYWxzZX0sIHszMjUwMDAwLCB0cnVlfSwgezMyNjY2NjcsIGZhbHNlfSwgezMyODMzMzMsIHRydWV9LAorfTsKKworc3RhdGljIGNvbnN0IGludCBrTWF4VGVzdEppdHRlclVzID0gMjAwMDsKKy8vIHJldHVybiBvbmUgb2YgMTAwMCwgMCwgLTEwMDAgYXMgaml0dGVyLgorc3RhdGljIGludCBHZXRKaXR0ZXIoc2l6ZV90IGkpIHsKKyAgICByZXR1cm4gKDEgLSAoaSAlIDMpKSAqIChrTWF4VGVzdEppdHRlclVzIC8gMik7Cit9CisKK2NsYXNzIEZyYW1lRHJvcHBlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3B1YmxpYzoKKyAgICBGcmFtZURyb3BwZXJUZXN0KCkgOiBtRnJhbWVEcm9wcGVyKG5ldyBGcmFtZURyb3BwZXIoKSkgeworICAgICAgICBFWFBFQ1RfRVEoT0ssIG1GcmFtZURyb3BwZXItPnNldE1heEZyYW1lUmF0ZSgzMC4wKSk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBSdW5UZXN0KGNvbnN0IFRlc3RGcmFtZSogZnJhbWVzLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICAgICAgaW50IGppdHRlciA9IEdldEppdHRlcihpKTsKKyAgICAgICAgICAgIGludDY0X3QgdGVzdFRpbWVVcyA9IGZyYW1lc1tpXS50aW1lVXMgKyBqaXR0ZXI7CisgICAgICAgICAgICBwcmludGYoInRpbWUgJWxsZCwgdGVzdFRpbWUgJWxsZCwgaml0dGVyICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWZyYW1lc1tpXS50aW1lVXMsIChsb25nIGxvbmcpdGVzdFRpbWVVcywgaml0dGVyKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShmcmFtZXNbaV0uc2hvdWxkRHJvcCwgbUZyYW1lRHJvcHBlci0+c2hvdWxkRHJvcCh0ZXN0VGltZVVzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxGcmFtZURyb3BwZXI+IG1GcmFtZURyb3BwZXI7Cit9OworCitURVNUX0YoRnJhbWVEcm9wcGVyVGVzdCwgVGVzdEludmFsaWRNYXhGcmFtZVJhdGUpIHsKKyAgICBFWFBFQ1RfTkUoT0ssIG1GcmFtZURyb3BwZXItPnNldE1heEZyYW1lUmF0ZSgtMS4wKSk7CisgICAgRVhQRUNUX05FKE9LLCBtRnJhbWVEcm9wcGVyLT5zZXRNYXhGcmFtZVJhdGUoMCkpOworfQorCitURVNUX0YoRnJhbWVEcm9wcGVyVGVzdCwgVGVzdDIwRnBzKSB7CisgICAgUnVuVGVzdCh0ZXN0RnJhbWVzMjBGcHMsIEFSUkFZX1NJWkUodGVzdEZyYW1lczIwRnBzKSk7Cit9CisKK1RFU1RfRihGcmFtZURyb3BwZXJUZXN0LCBUZXN0MzBGcHMpIHsKKyAgICBSdW5UZXN0KHRlc3RGcmFtZXMzMEZwcywgQVJSQVlfU0laRSh0ZXN0RnJhbWVzMzBGcHMpKTsKK30KKworVEVTVF9GKEZyYW1lRHJvcHBlclRlc3QsIFRlc3Q0MEZwcykgeworICAgIFJ1blRlc3QodGVzdEZyYW1lczQwRnBzLCBBUlJBWV9TSVpFKHRlc3RGcmFtZXM0MEZwcykpOworfQorCitURVNUX0YoRnJhbWVEcm9wcGVyVGVzdCwgVGVzdDYwRnBzKSB7CisgICAgUnVuVGVzdCh0ZXN0RnJhbWVzNjBGcHMsIEFSUkFZX1NJWkUodGVzdEZyYW1lczYwRnBzKSk7Cit9CisKK1RFU1RfRihGcmFtZURyb3BwZXJUZXN0LCBUZXN0VmFyaWFibGVGcHMpIHsKKyAgICBSdW5UZXN0KHRlc3RGcmFtZXNWYXJpYWJsZUZwcywgQVJSQVlfU0laRSh0ZXN0RnJhbWVzVmFyaWFibGVGcHMpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwNmVkNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLSAgICAgICAgQzIuY3BwICAgIFwKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9pbmNsdWRlIFwKLSAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvaGFyZHdhcmUgXAotCi1MT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9jb2RlYzIKLUxPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCi1MT0NBTF9DTEFORyA6PSB0cnVlCi1MT0NBTF9TQU5JVElaRSA6PSB1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IHNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IGNmaQotTE9DQUxfU0FOSVRJWkVfRElBRyA6PSBjZmkKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1pbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvQzIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL0MyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUxYjA3My4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvQzIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxDMi5oPgotI2luY2x1ZGUgPEMyQnVmZmVyLmg+Ci0jaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KLSNpbmNsdWRlIDxDMkNvbmZpZy5oPgotI2luY2x1ZGUgPEMyUGFyYW0uaD4KLSNpbmNsdWRlIDxDMlBhcmFtRGVmLmg+Ci0jaW5jbHVkZSA8QzJXb3JrLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLyoqCi0gKiBUaGVyZSBpcyBub3RoaW5nIGhlcmUgeWV0LiBUaGlzIGxpYnJhcnkgaXMgYnVpbHQgdG8gc2VlIHdoYXQgc3ltYm9scyBhbmQgbWV0aG9kcyBnZXQKLSAqIGRlZmluZWQgYXMgcGFydCBvZiB0aGUgQVBJIGluY2x1ZGUgZmlsZXMuCi0gKgotICogR29pbmcgZm9yd2FyZCwgdGhlIENvZGVjMiBsaWJyYXJ5IHdpbGwgY29udGFpbiB1dGlsaXR5IG1ldGhvZHMgdGhhdCBhcmUgdXNlZnVsIGZvcgotICogQ29kZWMyIGNsaWVudHMuCi0gKi8KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvaW5jbHVkZS9DMi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL2luY2x1ZGUvQzIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QwMGEwMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvaW5jbHVkZS9DMi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEMyX0hfCi0jZGVmaW5lIEMyX0hfCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGxpc3Q+Ci0KLSNpZmRlZiBfX0FORFJPSURfXwotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+ICAgICAgIC8vIGZvciBzdGF0dXNfdAotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPiAgICAgICAvLyBmb3IgbnNlY3NfdAotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLSNlbHNlCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotdHlwZWRlZiBpbnQ2NF90IG5zZWNzX3Q7Ci0KLWVudW0gewotICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiwKLSAgICBHUkFMTE9DX1VTQUdFX1JFTkRFUlNDUklQVCwKLSAgICBHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUsCi0gICAgR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUiwKLSAgICBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIsCi0gICAgR1JBTExPQ19VU0FHRV9QUk9URUNURUQsCi0gICAgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwKLSAgICBHUkFMTE9DX1VTQUdFX0hXX1JFTkRFUiwKLX07Ci0KLSNlbmRpZgotCi0vKiogXG1haW5wYWdlIENvZGVjMgotICoKLSAqIENvZGVjMiBpcyBhIGZyYW1lLWJhc2VkIGRhdGEgcHJvY2Vzc2luZyBBUEkgdXNlZCBieSBhbmRyb2lkLgotICoKLSAqIFRoZSBmcmFtZXdvcmsgYWNjZXNzZXMgY29tcG9uZW50cyB2aWEgdGhlIFxyZWYgQVBJLgotICovCi0KLS8qKiBcaW5ncm91cCBBUEkKLSAqCi0gKiBUaGUgQ29kZWMyIEFQSSBkZWZpbmVzIHRoZSBvcGVyYXRpb24gb2YgZGF0YSBwcm9jZXNzaW5nIGNvbXBvbmVudHMgYW5kIHRoZWlyIGludGVyYWN0aW9uIHdpdGgKLSAqIHRoZSByZXN0IG9mIHRoZSBzeXN0ZW0uCi0gKgotICogQ29kaW5nIENvbnZlbnRpb25zCi0gKgotICogTWl0aWdhdGluZyBCaW5hcnkgQ29tcGF0aWJpbGl0eS4KLSAqCi0gKiBXaGlsZSBmdWxsIGJpbmFyeSBjb21wYXRpYmlsaXR5IGlzIG5vdCBhIGdvYWwgb2YgdGhlIEFQSSAoZHVlIHRvIG91ciB1c2Ugb2YgU1RMKSwgd2UgdHJ5IHRvCi0gKiBtaXRpZ2F0ZSBiaW5hcnkgYnJlYWtzIGJ5IGFkaGVyaW5nIHRvIHRoZSBmb2xsb3dpbmcgY29udmVudGlvbnM6Ci0gKgotICogLSBhdCBtb3N0IG9uZSB2dGFibGUgd2l0aCBwbGFjZWhvbGRlciB2aXJ0dWFsIG1ldGhvZHMKLSAqIC0gYWxsIG9wdGlvbmFsL3BsYWNlaG9sZGVyIHZpcnR1YWwgbWV0aG9kcyByZXR1cm5pbmcgYSBzdGF0dXNfdCwgd2l0aCBDMl9OT1RfSU1QTEVNRU5URUQgbm90Ci0gKiAgIHJlcXVpcmluZyBhbnkgdXBkYXRlIHRvIGlucHV0L291dHB1dCBhcmd1bWVudHMuCi0gKiAtIGxpbWl0aW5nIHN5bWJvbCBleHBvcnQgb2YgaW5saW5lIG1ldGhvZHMKLSAqIC0gdXNlIG9mIHBpbXBsIChvciBzaGFyZWQtcGltcGwpCi0gKgotICogTmFtaW5nCi0gKgotICogLSBhbGwgY2xhc3NlcyBhbmQgdHlwZXMgcHJlZml4IHdpdGggQzIKLSAqIC0gY2xhc3NlcyBmb3IgaW50ZXJuYWwgdXNlIHByZWZpeCB3aXRoIF9DMgotICogLSBlbnVtIHZhbHVlcyBpbiBnbG9iYWwgbmFtZXNwYWNlIHByZWZpeCB3aXRoIEMyXyBhbGwgY2FwcwotICogLSBlbnVtIHZhbHVlcyBpbnNpZGUgY2xhc3NlcyBoYXZlIG5vIEMyXyBwcmVmaXggYXMgY2xhc3MgYWxyZWFkeSBoYXMgaXQKLSAqIC0gc3VwcG9ydGluZyB0d28ga2luZHMgb2YgZW51bSBuYW1pbmc6IGFsbC1jYXBzIGFuZCBrQ2FtZWxDYXNlCi0gKiBcdG9kbyByZXZpc2l0IGtDYW1lbENhc2UgZm9yIHBhcmFtLXR5cGUKLSAqCi0gKiBBc3BlY3RzCi0gKgotICogQXNwZWN0cyBkZWZpbmUgY2VydGFpbiBjb21tb24gYmVoYXZpb3IgYWNyb3NzIGEgZ3JvdXAgb2Ygb2JqZWN0cy4KLSAqIC0gY2xhc3NlcyB3aG9zZSBuYW1lIG1hdGNoZXMgX0MyLipBc3BlY3QKLSAqIC0gb25seSBwcm90ZWN0ZWQgY29uc3RydWN0b3JzCi0gKiAtIG5vIGRlc2N0cnVjdG9yIGFuZCBjb3BpYWJsZQotICogLSBhbGwgbWV0aG9kcyBhcmUgaW5saW5lIG9yIHN0YXRpYyAodGhpcyBpcyBvcHBvc2l0ZSBvZiB0aGUgaW50ZXJmYWNlIHBhcmFkaWdtIHdoZXJlIGFsbCBtZXRob2RzCi0gKiAgIGFyZSB2aXJ0dWFsLCB3aGljaCB3b3VsZCBub3Qgd29yayBkdWUgdG8gdGhlIGF0IG1vc3Qgb25lIHZ0YWJsZSBydWxlLikKLSAqIC0gb25seSBwcml2YXRlIHZhcmlhYmxlcyAodGhpcyBwcmV2ZW50cyBzdWJjbGFzc2VzIGludGVyZmVyaW5nIHdpdGggdGhlIGFzcGVjdHMuKQotICovCi0KLS8vLyBcZGVmZ3JvdXAgdHlwZXMgQ29tbW9uIFR5cGVzCi0vLy8gQHsKLQotLyoqCi0gKiBDMlN0cmluZzogYmFzaWMgc3RyaW5nIGltcGxlbWVudGF0aW9uCi0gKi8KLXR5cGVkZWYgc3RkOjpzdHJpbmcgQzJTdHJpbmc7Ci10eXBlZGVmIGNvbnN0IGNoYXIgKkMyU3RyaW5nTGl0ZXJhbDsKLQotLyoqCi0gKiBDMkVycm9yOiBzdGF0dXMgY29kZXMgdXNlZC4KLSAqLwotdHlwZWRlZiBpbnQzMl90IEMyRXJyb3I7Ci1lbnVtIHsKLSNpZm5kZWYgX19BTkRST0lEX18KLSAgICBPSyAgICAgICAgICAgICAgICAgID0gMCwKLSAgICBCQURfVkFMVUUgICAgICAgICAgID0gLUVJTlZBTCwKLSAgICBCQURfSU5ERVggICAgICAgICAgID0gLUVPVkVSRkxPVywKLSAgICBVTktOT1dOX1RSQU5TQUNUSU9OID0gLUVCQURNU0csCi0gICAgQUxSRUFEWV9FWElTVFMgICAgICA9IC1FRVhJU1QsCi0gICAgTkFNRV9OT1RfRk9VTkQgICAgICA9IC1FTk9FTlQsCi0gICAgSU5WQUxJRF9PUEVSQVRJT04gICA9IC1FTk9TWVMsCi0gICAgTk9fTUVNT1JZICAgICAgICAgICA9IC1FTk9NRU0sCi0gICAgUEVSTUlTU0lPTl9ERU5JRUQgICA9IC1FUEVSTSwKLSAgICBUSU1FRF9PVVQgICAgICAgICAgID0gLUVUSU1FRE9VVCwKLSAgICBVTktOT1dOX0VSUk9SICAgICAgID0gLUVJTlZBTCwKLSNlbmRpZgotCi0gICAgQzJfT0sgICAgICAgICAgICAgICA9IE9LLCAgICAgICAgICAgICAgICAgICAvLy88IG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Ci0KLSAgICAvLyBiYWQgaW5wdXQKLSAgICBDMl9CQURfVkFMVUUgICAgICAgID0gQkFEX1ZBTFVFLCAgICAgICAgICAgIC8vLzwgYXJndW1lbnQgaGFzIGludmFsaWQgdmFsdWUgKHVzZXIgZXJyb3IpCi0gICAgQzJfQkFEX0lOREVYICAgICAgICA9IEJBRF9JTkRFWCwgICAgICAgICAgICAvLy88IGFyZ3VtZW50IHVzZXMgaW52YWxpZCBpbmRleCAodXNlciBlcnJvcikKLSAgICBDMl9VTlNVUFBPUlRFRCAgICAgID0gVU5LTk9XTl9UUkFOU0FDVElPTiwgIC8vLzwgYXJndW1lbnQvaW5kZXggaXMgdmFsdWUgYnV0IG5vdCBzdXBwb3J0ZWQgXHRvZG8gaXMgdGhpcyByZWFsbHkgQkFEX0lOREVYL1ZBTFVFPwotCi0gICAgLy8gYmFkIHNlcXVlbmNpbmcgb2YgZXZlbnRzCi0gICAgQzJfRFVQTElDQVRFICAgICAgICA9IEFMUkVBRFlfRVhJU1RTLCAgICAgICAvLy88IG9iamVjdCBhbHJlYWR5IGV4aXN0cwotICAgIEMyX05PVF9GT1VORCAgICAgICAgPSBOQU1FX05PVF9GT1VORCwgICAgICAgLy8vPCBvYmplY3Qgbm90IGZvdW5kCi0gICAgQzJfQkFEX1NUQVRFICAgICAgICA9IElOVkFMSURfT1BFUkFUSU9OLCAgICAvLy88IG9wZXJhdGlvbiBpcyBub3QgcGVybWl0dGVkIGluIHRoZSBjdXJyZW50IHN0YXRlCi0KLSAgICAvLyBiYWQgZW52aXJvbm1lbnQKLSAgICBDMl9OT19NRU1PUlkgICAgICAgID0gTk9fTUVNT1JZLCAgICAgICAgICAgIC8vLzwgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgb3BlcmF0aW9uCi0gICAgQzJfTk9fUEVSTUlTU0lPTiAgICA9IFBFUk1JU1NJT05fREVOSUVELCAgICAvLy88IG1pc3NpbmcgcGVybWlzc2lvbiB0byBjb21wbGV0ZSBvcGVyYXRpb24KLSAgICBDMl9USU1FRF9PVVQgICAgICAgID0gVElNRURfT1VULCAgICAgICAgICAgIC8vLzwgb3BlcmF0aW9uIGRpZCBub3QgY29tcGxldGUgd2l0aGluIHRpbWVvdXQKLQotICAgIC8vIGJhZCB2ZXJzaW9uaW5nCi0gICAgQzJfTk9UX0lNUExFTUVOVEVEICA9IFVOS05PV05fVFJBTlNBQ1RJT04sICAvLy88IG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQgKG9wdGlvbmFsIG9ubHkpIFx0b2RvIGZvciBub3cgcmV1c2UgZXJyb3IgY29kZQotCi0gICAgLy8gdW5rbm93biBmYXRhbAotICAgIEMyX0NPUlJVUFRFRCAgICAgICAgPSBVTktOT1dOX0VSUk9SLCAgICAgICAgLy8vPCBzb21lIHVuZXhwZWN0ZWQgZXJyb3IgcHJldmVudGVkIHRoZSBvcGVyYXRpb24KLX07Ci0KLS8vLyBAfQotCi0vLy8gXGRlZmdyb3VwIHV0aWxzIFV0aWxpdGllcwotLy8vIEB7Ci0KLSNkZWZpbmUgQzJfRE9fTk9UX0NPUFkodHlwZSwgYXJncy4uLikgXAotICAgIHR5cGUgYXJncyYgb3BlcmF0b3I9KGNvbnN0IHR5cGUgYXJncyYpID0gZGVsZXRlOyBcCi0gICAgdHlwZShjb25zdCB0eXBlIGFyZ3MmKSA9IGRlbGV0ZTsgXAotCi0jZGVmaW5lIEMyX1BVUkUgX19hdHRyaWJ1dGVfXygocHVyZSkpCi0jZGVmaW5lIEMyX0NPTlNUIF9fYXR0cmlidXRlX18oKGNvbnN0KSkKLSNkZWZpbmUgQzJfSElERSBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpCi0jZGVmaW5lIEMyX0lOVEVSTkFMIF9fYXR0cmlidXRlX18oKGludGVybmFsX2xpbmthZ2UpKQotCi0jZGVmaW5lIERFRklORV9PVEhFUl9DT01QQVJJU09OX09QRVJBVE9SUyh0eXBlKSBcCi0gICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCB0eXBlICZvdGhlcikgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0gXAotICAgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgdHlwZSAmb3RoZXIpIHsgcmV0dXJuICgqdGhpcyA9PSBvdGhlcikgfHwgKCp0aGlzIDwgb3RoZXIpOyB9IFwKLSAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IHR5cGUgJm90aGVyKSB7IHJldHVybiAhKCp0aGlzIDwgb3RoZXIpOyB9IFwKLSAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgdHlwZSAmb3RoZXIpIHsgcmV0dXJuICEoKnRoaXMgPCBvdGhlcikgJiYgISgqdGhpcyA9PSBvdGhlcik7IH0KLQotI2RlZmluZSBERUZJTkVfRklFTERfQkFTRURfQ09NUEFSSVNPTl9PUEVSQVRPUlModHlwZSwgZmllbGQpIFwKLSAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgdHlwZSAmb3RoZXIpIGNvbnN0IHsgcmV0dXJuIGZpZWxkIDwgb3RoZXIuZmllbGQ7IH0gXAotICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgdHlwZSAmb3RoZXIpIGNvbnN0IHsgcmV0dXJuIGZpZWxkID09IG90aGVyLmZpZWxkOyB9IFwKLSAgICBERUZJTkVfT1RIRVJfQ09NUEFSSVNPTl9PUEVSQVRPUlModHlwZSkKLQotLy8vIFxjb25kIElOVEVSTkFMCi0KLS8vLyBcZGVmZ3JvdXAgdXRpbHNfaW50ZXJuYWwKLS8vLyBAewotCi10ZW1wbGF0ZTx0eXBlbmFtZS4uLiBUPiBzdHJ1Y3QgYzJfdHlwZXM7Ci0KLS8qKiBzcGVjaWFsaXphdGlvbiBmb3IgYSBzaW5nbGUgdHlwZSAqLwotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXN0cnVjdCBjMl90eXBlczxUPiB7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmRlY2F5PFQ+Ojp0eXBlIHdpZGVfdHlwZTsKLSAgICB0eXBlZGVmIHdpZGVfdHlwZSBuYXJyb3dfdHlwZTsKLSAgICB0eXBlZGVmIHdpZGVfdHlwZSBtaW50eXBlOwotfTsKLQotLyoqIHNwZWNpYWxpemF0aW9uIGZvciB0d28gdHlwZXMgKi8KLXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Ci1zdHJ1Y3QgYzJfdHlwZXM8VCwgVT4gewotICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWUgPT0gc3RkOjppc19mbG9hdGluZ19wb2ludDxVPjo6dmFsdWUsCi0gICAgICAgICAgICAgICAgICAibWl4aW5nIGZsb2F0aW5nIHBvaW50IGFuZCBub24tZmxvYXRpbmcgcG9pbnQgdHlwZXMgaXMgZGlzYWxsb3dlZCIpOwotICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zaWduZWQ8VD46OnZhbHVlID09IHN0ZDo6aXNfc2lnbmVkPFU+Ojp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICJtaXhpbmcgc2lnbmVkIGFuZCB1bnNpZ25lZCB0eXBlcyBpcyBkaXNhbGxvd2VkIik7Ci0KLSAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6ZGVjYXk8Ci0gICAgICAgICAgICBkZWNsdHlwZSh0cnVlID8gc3RkOjpkZWNsdmFsPFQ+KCkgOiBzdGQ6OmRlY2x2YWw8VT4oKSk+Ojp0eXBlIHdpZGVfdHlwZTsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6ZGVjYXk8Ci0gICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPHNpemVvZihUKSA8IHNpemVvZihVKSwgVCwgVT46OnR5cGU+Ojp0eXBlIG5hcnJvd190eXBlOwotICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDwKLSAgICAgICAgICAgIHN0ZDo6aXNfc2lnbmVkPFQ+Ojp2YWx1ZSwgd2lkZV90eXBlLCBuYXJyb3dfdHlwZT46OnR5cGUgbWludHlwZTsKLX07Ci0KLS8vLyBAfQotCi0vLy8gXGVuZGNvbmQKLQotLyoqCi0gKiBUeXBlIHN1cHBvcnQgdXRpbGl0eSBjbGFzcy4gT25seSBzdXBwb3J0cyBzaW1pbGFyIGNsYXNzZXMsIHN1Y2ggYXM6Ci0gKiAtIGFsbCBmbG9hdGluZyBwb2ludAotICogLSBhbGwgdW5zaWduZWQvYWxsIHNpZ25lZAotICogLSBhbGwgcG9pbnRlcgotICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZS4uLiBWPgotc3RydWN0IGMyX3R5cGVzPFQsIFUsIFYuLi4+IHsKLSAgICAvKiogQ29tbW9uIHR5cGUgdGhhdCBhY2NvbW1vZGF0ZXMgYWxsIHRlbXBsYXRlIHBhcmFtZXRlciB0eXBlcy4gKi8KLSAgICB0eXBlZGVmIHR5cGVuYW1lIGMyX3R5cGVzPHR5cGVuYW1lIGMyX3R5cGVzPFQsIFU+Ojp3aWRlX3R5cGUsIFYuLi4+Ojp3aWRlX3R5cGUgd2lkZV90eXBlOwotICAgIC8qKiBOYXJyb3dlc3QgdHlwZSBvZiB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIHR5cGVzLiAqLwotICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8dHlwZW5hbWUgYzJfdHlwZXM8VCwgVT46Om5hcnJvd190eXBlLCBWLi4uPjo6bmFycm93X3R5cGUgbmFycm93X3R5cGU7Ci0gICAgLyoqIFR5cGUgdGhhdCBhY2NvbW1vZGF0ZXMgdGhlIG1pbmltdW0gdmFsdWUgZm9yIGFueSBpbnB1dCBmb3IgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciB0eXBlcy4gKi8KLSAgICB0eXBlZGVmIHR5cGVuYW1lIGMyX3R5cGVzPHR5cGVuYW1lIGMyX3R5cGVzPFQsIFU+OjptaW50eXBlLCBWLi4uPjo6bWludHlwZSBtaW50eXBlOwotfTsKLQotLyoqCi0gKiAgXGluZ3JvdXAgdXRpbHNfaW50ZXJuYWwKLSAqIHNwZWNpYWxpemF0aW9uIGZvciB0d28gdmFsdWVzICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgotaW5saW5lIGNvbnN0ZXhwciB0eXBlbmFtZSBjMl90eXBlczxULCBVPjo6d2lkZV90eXBlIGMyX21heChjb25zdCBUIGEsIGNvbnN0IFUgYikgewotICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8VCwgVT46OndpZGVfdHlwZSB3aWRlX3R5cGU7Ci0gICAgcmV0dXJuICh7IHdpZGVfdHlwZSBhXyhhKSwgYl8oYik7IGFfID4gYl8gPyBhXyA6IGJfOyB9KTsKLX0KLQotLyoqCi0gKiBGaW5kcyB0aGUgbWF4aW11bSB2YWx1ZSBvZiBhIGxpc3Qgb2YgInNpbWlsYXJseSB0eXBlZCIgdmFsdWVzLgotICoKLSAqIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIHRvIHN0ZDo6bWF4IHdoZXJlIHRoZSB0eXBlcyBkbyBub3QgaGF2ZSB0byBiZSBpZGVudGljYWwsIGFuZCB0aGUgc21hbGxlc3QKLSAqIHJlc3VsdGluZyB0eXBlIGlzIHVzZWQgdGhhdCBhY2NvbW1vZGF0ZXMgdGhlIGFyZ3VtZW50IHR5cGVzLgotICoKLSAqIFxub3RlIFZhbHVlIHR5cGVzIG11c3QgYmUgc2ltaWxhciwgZS5nLiBhbGwgZmxvYXRpbmcgcG9pbnQsIGFsbCBwb2ludGVycywgYWxsIHNpZ25lZCwgb3IgYWxsCi0gKiB1bnNpZ25lZC4KLSAqCi0gKiBAcmV0dXJuIHRoZSBsYXJnZXN0IG9mIHRoZSBpbnB1dCBhcmd1bWVudHMuCi0gKi8KLXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lLi4uIFY+Ci1jb25zdGV4cHIgdHlwZW5hbWUgYzJfdHlwZXM8VCwgVSwgVi4uLj46OndpZGVfdHlwZSBjMl9tYXgoY29uc3QgVCBhLCBjb25zdCBVIGIsIGNvbnN0IFYgLi4uIGMpIHsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFUsIFYuLi4+Ojp3aWRlX3R5cGUgd2lkZV90eXBlOwotICAgIHJldHVybiAoeyB3aWRlX3R5cGUgYV8oYSksIGJfKGMyX21heChiLCBjLi4uKSk7IGFfID4gYl8gPyBhXyA6IGJfOyB9KTsKLX0KLQotLyoqCi0gKiAgXGluZ3JvdXAgdXRpbHNfaW50ZXJuYWwKLSAqIHNwZWNpYWxpemF0aW9uIGZvciB0d28gdmFsdWVzICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgotaW5saW5lIGNvbnN0ZXhwciB0eXBlbmFtZSBjMl90eXBlczxULCBVPjo6bWludHlwZSBjMl9taW4oY29uc3QgVCBhLCBjb25zdCBVIGIpIHsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFU+Ojp3aWRlX3R5cGUgd2lkZV90eXBlOwotICAgIHJldHVybiAoewotICAgICAgICB3aWRlX3R5cGUgYV8oYSksIGJfKGIpOwotICAgICAgICBzdGF0aWNfY2FzdDx0eXBlbmFtZSBjMl90eXBlczxULCBVPjo6bWludHlwZT4oYV8gPCBiXyA/IGFfIDogYl8pOwotICAgIH0pOwotfQotCi0vKioKLSAqIEZpbmRzIHRoZSBtaW5pbXVtIHZhbHVlIG9mIGEgbGlzdCBvZiAic2ltaWxhcmx5IHR5cGVkIiB2YWx1ZXMuCi0gKgotICogVGhpcyBpcyBhbiBleHRlbnNpb24gdG8gc3RkOjptaW4gd2hlcmUgdGhlIHR5cGVzIGRvIG5vdCBoYXZlIHRvIGJlIGlkZW50aWNhbCwgYW5kIHRoZSBzbWFsbGVzdAotICogcmVzdWx0aW5nIHR5cGUgaXMgdXNlZCB0aGF0IGFjY29tbW9kYXRlcyB0aGUgYXJndW1lbnQgdHlwZXMuCi0gKgotICogXG5vdGUgVmFsdWUgdHlwZXMgbXVzdCBiZSBzaW1pbGFyLCBlLmcuIGFsbCBmbG9hdGluZyBwb2ludCwgYWxsIHBvaW50ZXJzLCBhbGwgc2lnbmVkLCBvciBhbGwKLSAqIHVuc2lnbmVkLgotICoKLSAqIEByZXR1cm4gdGhlIHNtYWxsZXN0IG9mIHRoZSBpbnB1dCBhcmd1bWVudHMuCi0gKi8KLXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lLi4uIFY+Ci1jb25zdGV4cHIgdHlwZW5hbWUgYzJfdHlwZXM8VCwgVSwgVi4uLj46Om1pbnR5cGUgYzJfbWluKGNvbnN0IFQgYSwgY29uc3QgVSBiLCBjb25zdCBWIC4uLiBjKSB7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBjMl90eXBlczxVLCBWLi4uPjo6bWludHlwZSByZXN0X3R5cGU7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBjMl90eXBlczxULCByZXN0X3R5cGU+Ojp3aWRlX3R5cGUgd2lkZV90eXBlOwotICAgIHJldHVybiAoewotICAgICAgICB3aWRlX3R5cGUgYV8oYSksIGJfKGMyX21pbihiLCBjLi4uKSk7Ci0gICAgICAgIHN0YXRpY19jYXN0PHR5cGVuYW1lIGMyX3R5cGVzPFQsIHJlc3RfdHlwZT46Om1pbnR5cGU+KGFfIDwgYl8gPyBhXyA6IGJfKTsKLSAgICB9KTsKLX0KLQotLy8vIEB9Ci0KLSNpZmRlZiBfX0FORFJPSURfXwotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotI2VuZGlmCi0KLSNlbmRpZiAgLy8gQzJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9pbmNsdWRlL0MyQnVmZmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvaW5jbHVkZS9DMkJ1ZmZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjZiNDg3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9pbmNsdWRlL0MyQnVmZmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEMyQlVGRkVSX0hfCi0jZGVmaW5lIEMyQlVGRkVSX0hfCi0KLSNpbmNsdWRlIDxDMi5oPgotI2luY2x1ZGUgPEMyUGFyYW0uaD4gLy8gZm9yIEMySW5mbwotCi0jaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLXR5cGVkZWYgaW50IEMyRmVuY2U7Ci0KLSNpZmRlZiBfX0FORFJPSURfXwotCi0vLyAjaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgotI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPiAvLyBUT0RPOiByZW1vdmUKLQotdHlwZWRlZiBuYXRpdmVfaGFuZGxlX3QgQzJIYW5kbGU7Ci0KLSNlbHNlCi0KLXR5cGVkZWYgdm9pZCogQzJIYW5kbGU7Ci0KLSNlbmRpZgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vLyBcZGVmZ3JvdXAgYnVmZmVyIEJ1ZmZlcnMKLS8vLyBAewotCi0vLy8gXGRlZmdyb3VwIGJ1ZmZlcl9zeW5jIFN5bmNocm9uaXphdGlvbgotLy8vIEB7Ci0KLS8qKgotICogU3luY2hyb25pemF0aW9uIGlzIGFjY29tcGxpc2hlZCB1c2luZyBldmVudCBhbmQgZmVuY2Ugb2JqZWN0cy4KLSAqCi0gKiBUaGVzZSBhcmUgY3Jvc3MtcHJvY2VzcyBleHRlbnNpb25zIG9mIHByb21pc2UvZnV0dXJlIGluZnJhc3RydWN0dXJlLgotICogRXZlbnRzIGFyZSBhbmFsb2dvdXMgdG8gc3RkOjpwcm9taXNlPHZvaWQ+LCB3aGVyZWFzIGZlbmNlcyBhcmUgdG8gc3RkOjpzaGFyZWRfZnV0dXJlPHZvaWQ+LgotICoKLSAqIEZlbmNlcyBhbmQgZXZlbnRzIGFyZSBzaGFyZWFibGUvY29weWFibGUuCi0gKgotICogRmVuY2VzIGFyZSB1c2VkIGluIHR3byBzY2VuYXJpb3MsIGFuZCBhbGwgY29waWVkIGluc3RhbmNlcyByZWZlciB0byB0aGUgc2FtZSBldmVudC4KLSAqIFx0b2RvIGRvIGV2ZW50cyBuZWVkIHRvIGJlIGNvcHlhYmxlIG9yIHNob3VsZCB0aGV5IGJlIHVuaXF1ZT8KLSAqCi0gKiBhY3F1aXJlIHN5bmMgZmVuY2Ugb2JqZWN0OiBzaWduYWxlZCB3aGVuIGl0IGlzIHNhZmUgZm9yIHRoZSBjb21wb25lbnQgb3IgY2xpZW50IHRvIGFjY2VzcwotICogKHRoZSBjb250ZW50cyBvZikgYW4gb2JqZWN0LgotICoKLSAqIHJlbGVhc2Ugc3luYyBmZW5jZSBvYmplY3Q6IFx0b2RvCi0gKgotICogRmVuY2VzIGNhbiBiZSBiYWNrZWQgYnkgaGFyZHdhcmUuIEhhcmR3YXJlIGZlbmNlcyBhcmUgZ3VhcmFudGVlZCB0byBzaWduYWwgTk8gTUFUVEVSIFdIQVQgd2l0aGluCi0gKiBhIHNob3J0IChwbGF0Zm9ybSBzcGVjaWZpYykgYW1vdW50IG9mIHRpbWU7IHRoaXMgZ3VhcmFudGVlIGlzIHVzdWFsbHkgbGVzcyB0aGFuIDE1IG1zZWNzLgotICovCi0KLS8qKgotICogRmVuY2Ugb2JqZWN0IHVzZWQgYnkgY29tcG9uZW50cyBhbmQgdGhlIGZyYW1ld29yay4KLSAqCi0gKiBJbXBsZW1lbnRzIHRoZSB3YWl0aW5nIGZvciBhbiBldmVudCwgYW5hbG9nb3VzIHRvIGEgJ2Z1dHVyZScuCi0gKgotICogVG8gYmUgaW1wbGVtZW50ZWQgYnkgdmVuZG9ycyBpZiB1c2luZyBIVyBmZW5jZXMuCi0gKi8KLWNsYXNzIEMyRmVuY2UgewotcHVibGljOgotICAgIC8qKgotICAgICAqIFdhaXRzIGZvciBhIGZlbmNlIHRvIGJlIHNpZ25hbGVkIHdpdGggYSB0aW1lb3V0LgotICAgICAqCi0gICAgICogXHRvZG8gYSBtZWNoYW5pc20gdG8gY2FuY2VsIGEgd2FpdCAtIGZvciBub3cgdGhlIG9ubHkgd2F5IHRvIGRvIHRoaXMgaXMgdG8gYWJhbmRvbiB0aGUKLSAgICAgKiBldmVudCwgYnV0IGZlbmNlcyBhcmUgc2hhcmVkIHNvIGNhbmNlbGluZyBhIHdhaXQgd2lsbCBjYW5jZWwgYWxsIHdhaXRzLgotICAgICAqCi0gICAgICogXHBhcmFtIHRpbWVvdXROcyAgICAgICAgICAgdGhlIG1heGltdW0gdGltZSB0byB3YWl0IGluIG5zZWNzCi0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgdGhlIGZlbmNlIGhhcyBiZWVuIHNpZ25hbGVkCi0gICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgICAgIHRoZSBmZW5jZSBoYXMgbm90IGJlZW4gc2lnbmFsZWQgd2l0aGluIHRoZSB0aW1lb3V0Ci0gICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgICAgIHRoZSBmZW5jZSBoYXMgYmVlbiBhYmFuZG9uZWQgd2l0aG91dCBiZWluZyBzaWduYWxlZCAoaXQgd2lsbCBuZXZlcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBzaWduYWxlZCkKLSAgICAgKiBccmV0dmFsIEMyX05PX1BFUk1JU1NJT04gbm8gcGVybWlzc2lvbiB0byB3YWl0IGZvciB0aGUgZmVuY2UgKHVuZXhwZWN0ZWQgLSBzeXN0ZW0pCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgd2FpdGluZyBmb3IgdGhlIGZlbmNlICh1bmV4cGVjdGVkKQotICAgICAqLwotICAgIEMyRXJyb3Igd2FpdChuc2Vjc190IHRpbWVvdXROcyk7Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIHRvIGNoZWNrIGlmIHRoaXMgZmVuY2UgaXMgdmFsaWQgKGlmIHRoZXJlIGlzIGEgY2hhbmNlIGZvciBpdCB0byBiZSBzaWduYWxlZC4pCi0gICAgICogQSBmZW5jZSBiZWNvbWVzIGludmFsaWQgaWYgdGhlIGNvbnRyb2xpbmcgZXZlbnQgaXMgZGVzdHJveWVkIHdpdGhvdXQgaXQgc2lnbmFsaW5nIHRoZSBmZW5jZS4KLSAgICAgKgotICAgICAqIFxyZXR1cm4gd2hldGhlciB0aGlzIGZlbmNlIGlzIHZhbGlkCi0gICAgICovCi0gICAgYm9vbCB2YWxpZCgpIGNvbnN0OwotCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBjaGVjayBpZiB0aGlzIGZlbmNlIGhhcyBiZWVuIHNpZ25hbGVkIChpcyByZWFkeSkuCi0gICAgICoKLSAgICAgKiBccmV0dXJuIHdoZXRoZXIgdGhpcyBmZW5jZSBoYXMgYmVlbiBzaWduYWxlZAotICAgICAqLwotICAgIGJvb2wgcmVhZHkoKSBjb25zdDsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byB3YWl0IGZvciB0aGlzIGZlbmNlIGluIGEgc2VsZWN0IHN5c3RlbSBjYWxsLgotICAgICAqIFxub3RlIFRoZSByZXR1cm5lZCBmaWxlIGRlc2NyaXB0b3IsIGlmIHZhbGlkLCBtdXN0IGJlIGNsb3NlZCBieSB0aGUgY2FsbGVyLgotICAgICAqCi0gICAgICogVGhpcyBjYW4gYmUgdXNlZCBpbiBlLmcuIHBvbGwoKSBzeXN0ZW0gY2FsbHMuIFRoaXMgZmlsZSBiZWNvbWVzIHJlYWRhYmxlIChQT0xMSU4pIHdoZW4gdGhlCi0gICAgICogZmVuY2UgaXMgc2lnbmFsZWQsIGFuZCBiYWQgKFBPTExFUlIpIGlmIHRoZSBmZW5jZSBpcyBhYmFuZG9uZWQuCi0gICAgICoKLSAgICAgKiBccmV0dXJuIGEgZmlsZSBkZXNjcmlwdG9yIHJlcHJlc2VudGluZyB0aGlzIGZlbmNlICh3aXRoIG93bmVyc2hpcCksIG9yIC0xIGlmIHRoZSBmZW5jZQotICAgICAqIGhhcyBhbHJlYWR5IGJlZW4gc2lnbmFsZWQgKFx0b2RvIG9yIGFiYW5kb25lZCkuCi0gICAgICoKLSAgICAgKiBcdG9kbyB0aGlzIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIGZlbmNlcyB1c2VkIGJ5IGdyYWxsb2MKLSAgICAgKi8KLSAgICBpbnQgZmQoKSBjb25zdDsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGZlbmNlIGlzIGEgaGFyZHdhcmUtYmFja2VkIGZlbmNlLgotICAgICAqIFxyZXR1cm4gd2hldGhlciB0aGlzIGlzIGEgaGFyZHdhcmUgZmVuY2UKLSAgICAgKi8KLSAgICBib29sIGlzSFcoKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICBjbGFzcyBJbXBsOwotICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKLX07Ci0KLS8qKgotICogRXZlbnQgb2JqZWN0IHVzZWQgYnkgY29tcG9uZW50cyBhbmQgdGhlIGZyYW1ld29yay4KLSAqCi0gKiBJbXBsZW1lbnRzIHRoZSBzaWduYWxpbmcgb2YgYW4gZXZlbnQsIGFuYWxvZ291cyB0byBhICdwcm9taXNlJy4KLSAqCi0gKiBIYXJkd2FyZSBiYWNrZWQgZXZlbnRzIGRvIG5vdCBnbyB0aHJvdWdoIHRoaXMgb2JqZWN0LCBhbmQgbXVzdCBiZSBleHBvc2VkIGRpcmVjdGx5IGFzIGZlbmNlcwotICogYnkgdmVuZG9ycy4KLSAqLwotY2xhc3MgQzJFdmVudCB7Ci1wdWJsaWM6Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGZlbmNlIGZvciB0aGlzIGV2ZW50LgotICAgICAqLwotICAgIEMyRmVuY2UgZmVuY2UoKSBjb25zdDsKLQotICAgIC8qKgotICAgICAqIFNpZ25hbHMgKGFsbCkgYXNzb2NpYXRlZCBmZW5jZShzKS4KLSAgICAgKiBUaGlzIGhhcyBubyBlZmZlY3Qgbm8gZWZmZWN0IGlmIHRoZSBldmVudCB3YXMgYWxyZWFkeSBzaWduYWxlZCBvciBhYmFuZG9uZWQuCi0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgdGhlIGZlbmNlKHMpIHdlcmUgc3VjY2Vzc2Z1bGx5IHNpZ25hbGVkCi0gICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgICAgIHRoZSBmZW5jZShzKSBoYXZlIGFscmVhZHkgYmVlbiBhYmFuZG9uZWQgb3IgbWVyZ2VkIChjYWxsZXIgZXJyb3IpCi0gICAgICogXHJldHZhbCBDMl9BTFJFQURZX0VYSVNUUyB0aGUgZmVuY2UocykgaGF2ZSBhbHJlYWR5IGJlZW4gc2lnbmFsZWQgKGNhbGxlciBlcnJvcikKLSAgICAgKiBccmV0dmFsIEMyX05PX1BFUk1JU1NJT04gbm8gcGVybWlzc2lvbiB0byBzaWduYWwgdGhlIGZlbmNlICh1bmV4cGVjdGVkIC0gc3lzdGVtKQotICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEICAgICBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHNpZ25hbGluZyB0aGUgZmVuY2UocykgKHVuZXhwZWN0ZWQpCi0gICAgICovCi0gICAgQzJFcnJvciBmaXJlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUcmlnZ2VyIHRoaXMgZXZlbnQgZnJvbSB0aGUgbWVyZ2luZyBvZiB0aGUgc3VwcGxpZWQgZmVuY2VzLiBUaGlzIG1lYW5zIHRoYXQgaXQgd2lsbCBiZQotICAgICAqIGFiYW5kb25lZCBpZiBhbnkgb2YgdGhlc2UgZmVuY2VzIGhhdmUgYmVlbiBhYmFuZG9uZWQsIGFuZCBpdCB3aWxsIGJlIGZpcmVkIGlmIGFsbCBvZiB0aGVzZQotICAgICAqIGZlbmNlcyBoYXZlIGJlZW4gc2lnbmFsZWQuCi0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgdGhlIG1lcmdpbmcgd2FzIHN1Y2Nlc3NmdWxseSBkb25lCi0gICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgICAgIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHBlcmZvcm0gdGhlIG1lcmdpbmcKLSAgICAgKiBccmV0dmFsIEMyX0FMUkVBRFlfRVhJU1RTICAgIHRoZSBmZW5jZSBoYXZlIGFscmVhZHkgYmVlbiBtZXJnZWQgKGNhbGxlciBlcnJvcikKLSAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSAgICAgdGhlIGZlbmNlIGhhdmUgYWxyZWFkeSBiZWVuIHNpZ25hbGVkIG9yIGFiYW5kb25lZCAoY2FsbGVyIGVycm9yKQotICAgICAqIFxyZXR2YWwgQzJfTk9fUEVSTUlTU0lPTiBubyBwZXJtaXNzaW9uIHRvIG1lcmdlIHRoZSBmZW5jZSAodW5leHBlY3RlZCAtIHN5c3RlbSkKLSAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCAgICAgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBtZXJnaW5nIHRoZSBmZW5jZShzKSAodW5leHBlY3RlZCkKLSAgICAgKi8KLSAgICBDMkVycm9yIG1lcmdlKHN0ZDo6dmVjdG9yPEMyRmVuY2U+IGZlbmNlcyk7Ci0KLSAgICAvKioKLSAgICAgKiBBYmFuZG9ucyB0aGUgZXZlbnQgYW5kIGFueSBhc3NvY2lhdGVkIGZlbmNlKHMpLgotICAgICAqIFxub3RlIENhbGwgdGhpcyB0byBleHBsaWNpdGx5IGFiYW5kb24gYW4gZXZlbnQgYmVmb3JlIGl0IGlzIGRlc3RydWN0ZWQgdG8gYXZvaWQgYSB3YXJuaW5nLgotICAgICAqCi0gICAgICogVGhpcyBoYXMgbm8gZWZmZWN0IG5vIGVmZmVjdCBpZiB0aGUgZXZlbnQgd2FzIGFscmVhZHkgc2lnbmFsZWQgb3IgYWJhbmRvbmVkLgotICAgICAqCi0gICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgICAgIHRoZSBmZW5jZShzKSB3ZXJlIHN1Y2Nlc3NmdWxseSBzaWduYWxlZAotICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFICAgICB0aGUgZmVuY2UocykgaGF2ZSBhbHJlYWR5IGJlZW4gc2lnbmFsZWQgb3IgbWVyZ2VkIChjYWxsZXIgZXJyb3IpCi0gICAgICogXHJldHZhbCBDMl9BTFJFQURZX0VYSVNUUyAgICB0aGUgZmVuY2UocykgaGF2ZSBhbHJlYWR5IGJlZW4gYWJhbmRvbmVkIChjYWxsZXIgZXJyb3IpCi0gICAgICogXHJldHZhbCBDMl9OT19QRVJNSVNTSU9OIG5vIHBlcm1pc3Npb24gdG8gYWJhbmRvbiB0aGUgZmVuY2UgKHVuZXhwZWN0ZWQgLSBzeXN0ZW0pCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgc2lnbmFsaW5nIHRoZSBmZW5jZShzKSAodW5leHBlY3RlZCkKLSAgICAgKi8KLSAgICBDMkVycm9yIGFiYW5kb24oKTsKLQotcHJpdmF0ZToKLSAgICBjbGFzcyBJbXBsOwotICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKLX07Ci0KLS8vLyBcYWRkdG9ncm91cCBidWZfaW50ZXJuYWwgSW50ZXJuYWwKLS8vLyBAewotCi0vKioKLSAqIEludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IGVuY2Fwc3VsYXRlIGFuIHVwZGF0YWJsZSBlcnJvciB2YWx1ZS4KLSAqLwotc3RydWN0IF9DMklubmF0ZUVycm9yIHsKLSAgICBpbmxpbmUgQzJFcnJvciBlcnJvcigpIGNvbnN0IHsgcmV0dXJuIG1FcnJvcjsgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgX0MySW5uYXRlRXJyb3IoQzJFcnJvciBlcnJvcikgOiBtRXJyb3IoZXJyb3IpIHsgfQotCi0gICAgQzJFcnJvciBtRXJyb3I7IC8vIHRoaXMgZXJyb3IgaXMgdXBkYXRhYmxlIGJ5IHRoZSBvYmplY3QKLX07Ci0KLS8vLyBAfQotCi0vKioKLSAqIFRoaXMgaXMgYSB1dGlsaXR5IHRlbXBsYXRlIGZvciBvYmplY3RzIHByb3RlY3RlZCBieSBhbiBhY3F1aXJlIGZlbmNlLCBzbyB0aGF0IGVycm9ycyBkdXJpbmcKLSAqIGFjcXVpcmluZyB0aGUgb2JqZWN0IGFyZSBwcm9wYWdhdGVkIHRvIHRoZSBvYmplY3QgaXRzZWxmLgotICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotY2xhc3MgQzJBY3F1aXJhYmxlIDogcHVibGljIEMyRmVuY2UgewotcHVibGljOgotICAgIC8qKgotICAgICAqIEFjcXVpcmVzIHRoZSBvYmplY3QgcHJvdGVjdGVkIGJ5IGFuIGFjcXVpcmUgZmVuY2UuIEFueSBlcnJvcnMgZHVyaW5nIHRoZSBtYXBwaW5nIHdpbGwgYmUKLSAgICAgKiBwYXNzZWQgdG8gdGhlIG9iamVjdC4KLSAgICAgKgotICAgICAqIFxyZXR1cm4gYWNxdWlyZWQgb2JqZWN0IHBvdGVudGlhbGx5IGludmFsaWRhdGVkIGlmIHdhaXRpbmcgZm9yIHRoZSBmZW5jZSBmYWlsZWQuCi0gICAgICovCi0gICAgVCBnZXQoKTsKLQotcHJvdGVjdGVkOgotICAgIEMyQWNxdWlyYWJsZShDMkVycm9yIGVycm9yLCBDMkZlbmNlIGZlbmNlLCBUIHQpIDogQzJGZW5jZShmZW5jZSksIG1Jbml0aWFsRXJyb3IoZXJyb3IpLCBtVCh0KSB7IH0KLQotcHJpdmF0ZToKLSAgICBDMkVycm9yIG1Jbml0aWFsRXJyb3I7Ci0gICAgVCBtVDsgLy8gVE9ETzogbW92ZSBpbnN0ZWFkIG9mIGNvcHkKLX07Ci0KLS8vLyBAfQotCi0vLy8gXGRlZmdyb3VwIGxpbmVhciBMaW5lYXIgRGF0YSBCbG9ja3MKLS8vLyBAewotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgTElORUFSIEFTUEVDVFMsIEJMT0NLUyBBTkQgVklFV1MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIENvbW1vbiBhc3BlY3QgZm9yIGFsbCBvYmplY3RzIHRoYXQgaGF2ZSBhIGxpbmVhciBjYXBhY2l0eS4KLSAqLwotY2xhc3MgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgewotLy8vIFxuYW1lIExpbmVhciBjYXBhY2l0eSBpbnRlcmZhY2UKLS8vLyBAewotcHVibGljOgotICAgIGlubGluZSB1aW50MzJfdCBjYXBhY2l0eSgpIGNvbnN0IHsgcmV0dXJuIG1DYXBhY2l0eTsgfQotCi1wcm90ZWN0ZWQ6Ci0KLSNpZiBVSU5UUFRSX01BWCA9PSAweGZmZmZmZmZmCi0gICAgc3RhdGljX2Fzc2VydChzaXplb2Yoc2l6ZV90KSA9PSBzaXplb2YodWludDMyX3QpLCAic2l6ZV90IGlzIHRvbyBiaWciKTsKLSNlbHNlCi0gICAgc3RhdGljX2Fzc2VydChzaXplb2Yoc2l6ZV90KSA+IHNpemVvZih1aW50MzJfdCksICJzaXplX3QgaXMgdG9vIHNtYWxsIik7Ci0gICAgLy8gZXhwbGljaXRseSBkaXNhYmxlIGNvbnN0cnVjdGlvbiBmcm9tIHNpemVfdAotICAgIGlubGluZSBleHBsaWNpdCBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChzaXplX3QgY2FwYWNpdHkpID0gZGVsZXRlOwotI2VuZGlmCi0KLSAgICBpbmxpbmUgZXhwbGljaXQgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QodWludDMyX3QgY2FwYWNpdHkpCi0gICAgICA6IG1DYXBhY2l0eShjYXBhY2l0eSkgeyB9Ci0KLSAgICBpbmxpbmUgZXhwbGljaXQgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QoY29uc3QgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgKnBhcmVudCkKLSAgICAgICAgOiBtQ2FwYWNpdHkocGFyZW50ID09IG51bGxwdHIgPyAwIDogcGFyZW50LT5jYXBhY2l0eSgpKSB7IH0KLQotcHJpdmF0ZToKLSAgICBjb25zdCB1aW50MzJfdCBtQ2FwYWNpdHk7Ci0vLy8gQH0KLX07Ci0KLS8qKgotICogQXNwZWN0IGZvciBvYmplY3RzIHRoYXQgaGF2ZSBhIGxpbmVhciByYW5nZS4KLSAqCi0gKiBUaGlzIGNsYXNzIGlzIGNvcGlhYmxlLgotICovCi1jbGFzcyBfQzJMaW5lYXJSYW5nZUFzcGVjdCA6IHB1YmxpYyBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCB7Ci0vLy8gXG5hbWUgTGluZWFyIHJhbmdlIGludGVyZmFjZQotLy8vIEB7Ci1wdWJsaWM6Ci0gICAgaW5saW5lIHVpbnQzMl90IG9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIG1PZmZzZXQ7IH0KLSAgICBpbmxpbmUgdWludDMyX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1TaXplOyB9Ci0KLXByb3RlY3RlZDoKLSAgICBpbmxpbmUgZXhwbGljaXQgX0MyTGluZWFyUmFuZ2VBc3BlY3QoY29uc3QgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgKnBhcmVudCkKLSAgICAgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChwYXJlbnQpLAotICAgICAgICAgIG1PZmZzZXQoMCksCi0gICAgICAgICAgbVNpemUoY2FwYWNpdHkoKSkgeyB9Ci0KLSAgICBpbmxpbmUgX0MyTGluZWFyUmFuZ2VBc3BlY3QoY29uc3QgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgKnBhcmVudCwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpCi0gICAgICAgIDogX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QocGFyZW50KSwKLSAgICAgICAgICBtT2Zmc2V0KGMyX21pbihvZmZzZXQsIGNhcGFjaXR5KCkpKSwKLSAgICAgICAgICBtU2l6ZShjMl9taW4oc2l6ZSwgY2FwYWNpdHkoKSAtIG1PZmZzZXQpKSB7IH0KLQotICAgIC8vIHN1YnNlY3Rpb24gb2YgdGhlIHR3byBbb2Zmc2V0LCBvZmZzZXQgKyBzaXplXSByYW5nZXMKLSAgICBpbmxpbmUgX0MyTGluZWFyUmFuZ2VBc3BlY3QoY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgKnBhcmVudCwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpCi0gICAgICAgIDogX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QocGFyZW50ID09IG51bGxwdHIgPyAwIDogcGFyZW50LT5jYXBhY2l0eSgpKSwKLSAgICAgICAgICBtT2Zmc2V0KGMyX21pbihjMl9tYXgob2Zmc2V0LCBwYXJlbnQgPT0gbnVsbHB0ciA/IDAgOiBwYXJlbnQtPm9mZnNldCgpKSwgY2FwYWNpdHkoKSkpLAotICAgICAgICAgIG1TaXplKGMyX21pbihjMl9taW4oc2l6ZSwgcGFyZW50ID09IG51bGxwdHIgPyAwIDogcGFyZW50LT5zaXplKCkpLCBjYXBhY2l0eSgpIC0gbU9mZnNldCkpIHsgfQotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBfQzJFZGl0YWJsZUxpbmVhclJhbmdlOwotICAgIC8vIGludmFyaWFudHMgMCA8PSBtT2Zmc2V0IDw9IG1PZmZzZXQgKyBtU2l6ZSA8PSBjYXBhY2l0eSgpCi0gICAgdWludDMyX3QgbU9mZnNldDsKLSAgICB1aW50MzJfdCBtU2l6ZTsKLS8vLyBAfQotfTsKLQotLyoqCi0gKiBBc3BlY3QgZm9yIG9iamVjdHMgdGhhdCBoYXZlIGFuIGVkaXRhYmxlIGxpbmVhciByYW5nZS4KLSAqCi0gKiBUaGlzIGNsYXNzIGlzIGNvcGlhYmxlLgotICovCi1jbGFzcyBfQzJFZGl0YWJsZUxpbmVhclJhbmdlIDogcHVibGljIF9DMkxpbmVhclJhbmdlQXNwZWN0IHsKLXByb3RlY3RlZDoKLSAgICBpbmxpbmUgZXhwbGljaXQgX0MyRWRpdGFibGVMaW5lYXJSYW5nZShjb25zdCBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCAqcGFyZW50KQotICAgICAgICA6IF9DMkxpbmVhclJhbmdlQXNwZWN0KHBhcmVudCkgeyB9Ci0KLSAgICBpbmxpbmUgX0MyRWRpdGFibGVMaW5lYXJSYW5nZShjb25zdCBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCAqcGFyZW50LCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKLSAgICAgICAgOiBfQzJMaW5lYXJSYW5nZUFzcGVjdChwYXJlbnQsIG9mZnNldCwgc2l6ZSkgeyB9Ci0KLSAgICAvLyBzdWJzZWN0aW9uIG9mIHRoZSB0d28gW29mZnNldCwgb2Zmc2V0ICsgc2l6ZV0gcmFuZ2VzCi0gICAgaW5saW5lIF9DMkVkaXRhYmxlTGluZWFyUmFuZ2UoY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgKnBhcmVudCwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpCi0gICAgICAgIDogX0MyTGluZWFyUmFuZ2VBc3BlY3QocGFyZW50LCBvZmZzZXQsIHNpemUpIHsgfQotCi0vLy8gXG5hbWUgRWRpdGFibGUgbGluZWFyIHJhbmdlIGludGVyZmFjZQotLy8vIEB7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBvZmZzZXQgdG8gfG9mZnNldHwsIHdoaWxlIHRyeWluZyB0byBrZWVwIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB1bmNoYW5nZWQgKGUuZy4KLSAgICAgKiBzaXplIHdpbGwgZ3JvdyBpZiBvZmZzZXQgaXMgZGVjcmVhc2VkLCBhbmQgbWF5IHNocmluayBpZiBvZmZzZXQgaXMgaW5jcmVhc2VkLikgUmV0dXJucwotICAgICAqIHRydWUgaWYgc3VjY2Vzc2Z1bCwgd2hpY2ggaXMgZXF1aXZhbGVudCB0byBpZiAwIDw9IHxvZmZzZXR8IDw9IGNhcGFjaXR5KCkuCi0gICAgICoKLSAgICAgKiBOb3RlOiBzZXR0aW5nIG9mZnNldCBhbmQgc2l6ZSB3aWxsIHlpZWxkIGRpZmZlcmVudCByZXN1bHQgZGVwZW5kaW5nIG9uIHRoZSBvcmRlciBvZiB0aGUKLSAgICAgKiBvcGVyYXRpb25zLiBBbHdheXMgc2V0IG9mZnNldCBmaXJzdCB0byBlbnN1cmUgcHJvcGVyIHNpemUuCi0gICAgICovCi0gICAgaW5saW5lIGJvb2wgc2V0T2Zmc2V0KHVpbnQzMl90IG9mZnNldCkgewotICAgICAgICBpZiAob2Zmc2V0ID4gY2FwYWNpdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9mZnNldCA+IG1PZmZzZXQgKyBtU2l6ZSkgewotICAgICAgICAgICAgbVNpemUgPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVNpemUgPSBtT2Zmc2V0ICsgbVNpemUgLSBvZmZzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgbU9mZnNldCA9IG9mZnNldDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNpemUgdG8gfHNpemV8LiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCwgd2hpY2ggaXMgZXF1aXZhbGVudCB0bwotICAgICAqIGlmIDAgPD0gfHNpemV8IDw9IGNhcGFjaXR5KCkgLSBvZmZzZXQoKS4KLSAgICAgKgotICAgICAqIE5vdGU6IHNldHRpbmcgb2Zmc2V0IGFuZCBzaXplIHdpbGwgeWllbGQgZGlmZmVyZW50IHJlc3VsdCBkZXBlbmRpbmcgb24gdGhlIG9yZGVyIG9mIHRoZQotICAgICAqIG9wZXJhdGlvbnMuIEFsd2F5cyBzZXQgb2Zmc2V0IGZpcnN0IHRvIGVuc3VyZSBwcm9wZXIgc2l6ZS4KLSAgICAgKi8KLSAgICBpbmxpbmUgYm9vbCBzZXRTaXplKHVpbnQzMl90IHNpemUpIHsKLSAgICAgICAgaWYgKHNpemUgPiBjYXBhY2l0eSgpIC0gbU9mZnNldCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVNpemUgPSBzaXplOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgb2Zmc2V0IHRvIHxvZmZzZXR8IHdpdGggYmVzdCBlZmZvcnQuIFNhbWUgYXMgc2V0T2Zmc2V0KCkgZXhjZXB0IHRoYXQgb2Zmc2V0IHdpbGwKLSAgICAgKiBiZSBjbGFtcGVkIHRvIHRoZSBidWZmZXIgY2FwYWNpdHkuCi0gICAgICoKLSAgICAgKiBOb3RlOiBzZXR0aW5nIG9mZnNldCBhbmQgc2l6ZSAoZXZlbiB1c2luZyBiZXN0IGVmZm9ydCkgd2lsbCB5aWVsZCBkaWZmZXJlbnQgcmVzdWx0IGRlcGVuZGluZwotICAgICAqIG9uIHRoZSBvcmRlciBvZiB0aGUgb3BlcmF0aW9ucy4gQWx3YXlzIHNldCBvZmZzZXQgZmlyc3QgdG8gZW5zdXJlIHByb3BlciBzaXplLgotICAgICAqLwotICAgIGlubGluZSB2b2lkIHNldE9mZnNldF9iZSh1aW50MzJfdCBvZmZzZXQpIHsKLSAgICAgICAgaWYgKG9mZnNldCA+IGNhcGFjaXR5KCkpIHsKLSAgICAgICAgICAgIG9mZnNldCA9IGNhcGFjaXR5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9mZnNldCA+IG1PZmZzZXQgKyBtU2l6ZSkgewotICAgICAgICAgICAgbVNpemUgPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVNpemUgPSBtT2Zmc2V0ICsgbVNpemUgLSBvZmZzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgbU9mZnNldCA9IG9mZnNldDsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2l6ZSB0byB8c2l6ZXwgd2l0aCBiZXN0IGVmZm9ydC4gU2FtZSBhcyBzZXRTaXplKCkgZXhjZXB0IHRoYXQgdGhlIHNlbGVjdGVkIHJlZ2lvbgotICAgICAqIHdpbGwgYmUgY2xhbXBlZCB0byB0aGUgYnVmZmVyIGNhcGFjaXR5IChlLmcuIHNpemUgaXMgY2xhbXBlZCB0byBbMCwgY2FwYWNpdHkoKSAtIG9mZnNldCgpXSkuCi0gICAgICoKLSAgICAgKiBOb3RlOiBzZXR0aW5nIG9mZnNldCBhbmQgc2l6ZSAoZXZlbiB1c2luZyBiZXN0IGVmZm9ydCkgd2lsbCB5aWVsZCBkaWZmZXJlbnQgcmVzdWx0IGRlcGVuZGluZwotICAgICAqIG9uIHRoZSBvcmRlciBvZiB0aGUgb3BlcmF0aW9ucy4gQWx3YXlzIHNldCBvZmZzZXQgZmlyc3QgdG8gZW5zdXJlIHByb3BlciBzaXplLgotICAgICAqLwotICAgIGlubGluZSB2b2lkIHNldFNpemVfYmUodWludDMyX3Qgc2l6ZSkgewotICAgICAgICBtU2l6ZSA9IHN0ZDo6bWluKHNpemUsIGNhcGFjaXR5KCkgLSBtT2Zmc2V0KTsKLSAgICB9Ci0vLy8gQH0KLX07Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gIEJMT0NLUwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8qKgotICogQmxvY2tzIGFyZSBzZWN0aW9ucyBvZiBhbGxvY2F0aW9ucy4gVGhleSBjYW4gYmUgZWl0aGVyIDFEIG9yIDJELgotICovCi0KLWNsYXNzIEMyTGluZWFyQWxsb2NhdGlvbjsKLQotY2xhc3MgQzJCbG9jazFEIDogcHVibGljIF9DMkxpbmVhclJhbmdlQXNwZWN0IHsKLXB1YmxpYzoKLSAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgICBDMkJsb2NrMUQoc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gYWxsb2MpOwotICAgIEMyQmxvY2sxRChzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBhbGxvYywgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpOwotCi1wcml2YXRlOgotICAgIGNsYXNzIEltcGw7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOwotfTsKLQotLyoqCi0gKiBSZWFkIHZpZXcgcHJvdmlkZXMgcmVhZC1vbmx5IGFjY2VzcyBmb3IgYSBsaW5lYXIgbWVtb3J5IHNlZ21lbnQuCi0gKgotICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZS4KLSAqLwotY2xhc3MgQzJSZWFkVmlldyA6IHB1YmxpYyBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCB7Ci1wdWJsaWM6Ci0gICAgLyoqCi0gICAgICogXHJldHVybiBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgYmxvY2sgb3IgbnVsbHB0ciBvbiBlcnJvci4KLSAgICAgKi8KLSAgICBjb25zdCB1aW50OF90ICpkYXRhKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgcG9ydGlvbiBvZiB0aGlzIHZpZXcuCi0gICAgICoKLSAgICAgKiBccGFyYW0gb2Zmc2V0ICB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBwb3J0aW9uLiBcbm90ZSBUaGlzIGlzIGNsYW1wZWQgdG8gdGhlIGNhcGFjaXR5IG9mIHRoaXMKLSAgICAgKiAgICAgICAgICAgICAgdmlldy4KLSAgICAgKiBccGFyYW0gc2l6ZSAgICB0aGUgc2l6ZSBvZiB0aGUgcG9ydGlvbi4gXG5vdGUgVGhpcyBpcyBjbGFtcGVkIHRvIHRoZSByZW1haW5pbmcgZGF0YSBmcm9tIG9mZnNldC4KLSAgICAgKgotICAgICAqIFxyZXR1cm4gYSByZWFkIHZpZXcgY29udGFpbmluZyBhIHBvcnRpb24gb2YgdGhpcyB2aWV3Ci0gICAgICovCi0gICAgQzJSZWFkVmlldyBzdWJWaWV3KHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBjb25zdDsKLQotICAgIC8qKgotICAgICAqIFxyZXR1cm4gZXJyb3IgZHVyaW5nIHRoZSBjcmVhdGlvbi9tYXBwaW5nIG9mIHRoaXMgdmlldy4KLSAgICAgKi8KLSAgICBDMkVycm9yIGVycm9yKCk7Ci0KLXByaXZhdGU6Ci0gICAgY2xhc3MgSW1wbDsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7Ci19OwotCi0vKioKLSAqIFdyaXRlIHZpZXcgcHJvdmlkZXMgcmVhZC93cml0ZSBhY2Nlc3MgZm9yIGEgbGluZWFyIG1lbW9yeSBzZWdtZW50LgotICoKLSAqIFRoaXMgY2xhc3MgaXMgY29waWFibGUuIFx0b2RvIG1vdmFibGUgb25seT8KLSAqLwotY2xhc3MgQzJXcml0ZVZpZXcgOiBwdWJsaWMgX0MyRWRpdGFibGVMaW5lYXJSYW5nZSB7Ci1wdWJsaWM6Ci0gICAgLyoqCi0gICAgICogU3RhcnQgb2YgdGhlIGJsb2NrLgotICAgICAqCi0gICAgICogXHJldHVybiBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgYmxvY2sgb3IgbnVsbHB0ciBvbiBlcnJvci4KLSAgICAgKi8KLSAgICB1aW50OF90ICpiYXNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBccmV0dXJuIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGF0IHRoZSBjdXJyZW50IG9mZnNldCBvciBudWxscHRyIG9uIGVycm9yLgotICAgICAqLwotICAgIHVpbnQ4X3QgKmRhdGEoKTsKLQotICAgIC8qKgotICAgICAqIFxyZXR1cm4gZXJyb3IgZHVyaW5nIHRoZSBjcmVhdGlvbi9tYXBwaW5nIG9mIHRoaXMgdmlldy4KLSAgICAgKi8KLSAgICBDMkVycm9yIGVycm9yKCk7Ci0KLXByaXZhdGU6Ci0gICAgY2xhc3MgSW1wbDsKLSAgICAvLy8gXHRvZG8gc2hvdWxkIHRoaXMgYmUgdW5pcXVlX3B0ciB0byBtYWtlIHRoaXMgbW92YWJsZSBvbmx5IC0gdG8gYXZvaWQgaW5jb25zaXN0ZW50IHJlZ2lvbnMKLSAgICAvLy8gYmV0d2VlbiBjb3BpZXMuCi0gICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOwotfTsKLQotLyoqCi0gKiBBIGNvbnN0YW50IChyZWFkLW9ubHkpIGxpbmVhciBibG9jayAocG9ydGlvbiBvZiBhbiBhbGxvY2F0aW9uKSB3aXRoIGFuIGFjcXVpcmUgZmVuY2UuCi0gKiBCbG9ja3MgYXJlIHVubWFwcGVkIHdoZW4gY3JlYXRlZCwgYW5kIGNhbiBiZSBtYXBwZWQgaW50byBhIHJlYWQgdmlldyBvbiBkZW1hbmQuCi0gKgotICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZSBhbmQgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIGFsbG9jYXRpb24gdGhhdCBpdCBpcyBiYXNlZCBvbi4KLSAqLwotY2xhc3MgQzJDb25zdExpbmVhckJsb2NrIDogcHVibGljIEMyQmxvY2sxRCB7Ci1wdWJsaWM6Ci0gICAgLyoqCi0gICAgICogTWFwcyB0aGlzIGJsb2NrIGludG8gbWVtb3J5IGFuZCByZXR1cm5zIGEgcmVhZCB2aWV3IGZvciBpdC4KLSAgICAgKgotICAgICAqIFxyZXR1cm4gYSByZWFkIHZpZXcgZm9yIHRoaXMgYmxvY2suCi0gICAgICovCi0gICAgQzJBY3F1aXJhYmxlPEMyUmVhZFZpZXc+IG1hcCgpIGNvbnN0OwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHBvcnRpb24gb2YgdGhpcyBibG9jay4KLSAgICAgKgotICAgICAqIFxwYXJhbSBvZmZzZXQgIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIHBvcnRpb24uIFxub3RlIFRoaXMgaXMgY2xhbXBlZCB0byB0aGUgY2FwYWNpdHkgb2YgdGhpcwotICAgICAqICAgICAgICAgICAgICBibG9jay4KLSAgICAgKiBccGFyYW0gc2l6ZSAgICB0aGUgc2l6ZSBvZiB0aGUgcG9ydGlvbi4gXG5vdGUgVGhpcyBpcyBjbGFtcGVkIHRvIHRoZSByZW1haW5pbmcgZGF0YSBmcm9tIG9mZnNldC4KLSAgICAgKgotICAgICAqIFxyZXR1cm4gYSBjb25zdGFudCBsaW5lYXIgYmxvY2sgY29udGFpbmluZyBhIHBvcnRpb24gb2YgdGhpcyBibG9jawotICAgICAqLwotICAgIEMyQ29uc3RMaW5lYXJCbG9jayBzdWJCbG9jayhzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgY29uc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhY3F1aXJlIGZlbmNlIGZvciB0aGlzIGJsb2NrLgotICAgICAqCi0gICAgICogXHJldHVybiBhIGZlbmNlIHRoYXQgbXVzdCBiZSB3YWl0ZWQgb24gYmVmb3JlIHJlYWRpbmcgdGhlIGJsb2NrLgotICAgICAqLwotICAgIEMyRmVuY2UgZmVuY2UoKSBjb25zdCB7IHJldHVybiBtRmVuY2U7IH0KLQotcHJpdmF0ZToKLSAgICBDMkZlbmNlIG1GZW5jZTsKLX07Ci0KLS8qKgotICogTGluZWFyIGJsb2NrIGlzIGEgd3JpdGVhYmxlIDFEIGJsb2NrLiBPbmNlIHdyaXR0ZW4sIGl0IGNhbiBiZSBzaGFyZWQgaW4gd2hvbGUgb3IgaW4gcGFydHMgd2l0aAotICogY29uc3VtZXJzL3JlYWRlcnMgYXMgcmVhZC1vbmx5IGNvbnN0IGxpbmVhciBibG9jayhzKS4KLSAqLwotY2xhc3MgQzJMaW5lYXJCbG9jayA6IHB1YmxpYyBDMkJsb2NrMUQgewotcHVibGljOgotICAgIC8qKgotICAgICAqIE1hcHMgdGhpcyBibG9jayBpbnRvIG1lbW9yeSBhbmQgcmV0dXJucyBhIHdyaXRlIHZpZXcgZm9yIGl0LgotICAgICAqCi0gICAgICogXHJldHVybiBhIHdyaXRlIHZpZXcgZm9yIHRoaXMgYmxvY2suCi0gICAgICovCi0gICAgQzJBY3F1aXJhYmxlPEMyV3JpdGVWaWV3PiBtYXAoKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSByZWFkLW9ubHkgY29uc3QgbGluZWFyIGJsb2NrIGZvciBhIHBvcnRpb24gb2YgdGhpcyBibG9jazsgb3B0aW9uYWxseSBwcm90ZWN0ZWQKLSAgICAgKiBieSBhbiBhY3F1aXJlIGZlbmNlLiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gdXNlIHRoaXM6Ci0gICAgICoKLSAgICAgKiAxKSBzaGFyZSByZWFkeSBibG9jayBhZnRlciB3cml0aW5nIGRhdGEgaW50byB0aGUgYmxvY2suIEluIHRoaXMgY2FzZSBubyBmZW5jZSBzaGFsbCBiZQotICAgICAqICAgIHN1cHBsaWVkLCBhbmQgdGhlIGJsb2NrIHNoYWxsIG5vdCBiZSBtb2RpZmllZCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLgotICAgICAqIDIpIHNoYXJlIGJsb2NrIG1ldGFkYXRhIGJlZm9yZSBhY3R1YWxseSAoZmluaXNoaW5nKSB3cml0aW5nIHRoZSBkYXRhIGludG8gdGhlIGJsb2NrLiBJbgotICAgICAqICAgIHRoaXMgY2FzZSBhIGZlbmNlIG11c3QgYmUgc3VwcGxpZWQgdGhhdCB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSBkYXRhIGlzIHdyaXR0ZW4uCi0gICAgICogICAgVGhlIGJsb2NrIHNoYWxsIGJlIG1vZGlmaWVkIG9ubHkgdW50aWwgZmlyaW5nIHRoZSBldmVudCBmb3IgdGhlIGZlbmNlLgotICAgICAqLwotICAgIEMyQ29uc3RMaW5lYXJCbG9jayBzaGFyZShzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgQzJGZW5jZSBmZW5jZSk7Ci19OwotCi0vLy8gQH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gIENJUkNVTEFSIEJMT0NLUyBBTkQgVklFV1MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vLy8gXGRlZmdyb3VwIGNpcmN1bGFyIENpcmN1bGFyIGJ1ZmZlciBzdXBwb3J0Ci0vLy8gQHsKLQotLyoqCi0gKiBDaXJjdWxhciBibG9ja3MgY2FuIGJlIHVzZWQgdG8gc2hhcmUgZGF0YSBiZXR3ZWVuIGEgd3JpdGVyIGFuZCBhIHJlYWRlciAoYW5kL29yIG90aGVyIGNvbnN1bWVycyktCi0gKiBpbiBhIG1lbW9yeS1lZmZpY2llbnQgd2F5IGJ5IHJldXNpbmcgYSBzZWN0aW9uIG9mIG1lbW9yeS4gQ2lyY3VsYXIgYmxvY2tzIGFyZSBhIGJpdCBtb3JlIGNvbXBsZXgKLSAqIHRoYW4gc2luZ2xlIHJlYWRlci9zaW5nbGUgd3JpdGVyIHNjaGVtZXMgdG8gZmFjaWxpdGF0ZSBibG9jay1iYXNlZCBjb25zdW1pbmcgb2YgZGF0YS4KLSAqCi0gKiBUaGV5IGNhbiBvcGVyYXRlIGluIHR3byBtb2RlczoKLSAqCi0gKiAxKSBvbmUgd3JpdGVyIHRoYXQgY3JlYXRlcyBibG9ja3MgdG8gYmUgY29uc3VtZWQgKHRoaXMgbW9kZWwgY2FuIGJlIHVzZWQgYnkgY29tcG9uZW50cykKLSAqCi0gKiAyKSBvbmUgd3JpdGVyIHRoYXQgd3JpdGVzIGNvbnRpbnVvdXNseSwgYW5kIG9uZSByZWFkZXIgdGhhdCBjYW4gY3JlYXRlcyBibG9ja3MgdG8gYmUgY29uc3VtZWQKLSAqICAgIGJ5IGZ1cnRoZXIgcmVjaXBpZW50cyAodGhpcyBtb2RlbCBpcyB1c2VkIGJ5IHRoZSBmcmFtZXdvcmssIGFuZCBjYW5ub3QgYmUgdXNlZCBieSBjb21wb25lbnRzLikKLSAqCi0gKiBDaXJjdWxhciBibG9ja3MgaGF2ZSBmb3VyIHNlZ21lbnRzIHdpdGggcnVubmluZyBwb2ludGVyczoKLSAqICAtIHJlc2VydmVkOiBkYXRhIHJlc2VydmVkIGFuZCBhdmFpbGFibGUgZm9yIHRoZSB3cml0ZXIKLSAqICAtIGNvbW1pdHRlZDogZGF0YSBjb21taXR0ZWQgYnkgdGhlIHdyaXRlciBhbmQgYXZhaWxhYmxlIHRvIHRoZSByZWFkZXIgKGlmIHByZXNlbnQpCi0gKiAgLSB1c2VkOiBkYXRhIHVzZWQgYnkgY29uc3VtZXJzIChpZiBwcmVzZW50KQotICogIC0gYXZhaWxhYmxlOiB1bnVzZWQgZGF0YSBhdmFpbGFibGUgdG8gYmUgcmVzZXJ2ZWQKLSAqLwotY2xhc3MgQzJDaXJjdWxhckJsb2NrIDogcHVibGljIEMyQmxvY2sxRCB7Ci0gICAgLy8gVE9ETzogYWRkIG1ldGhvZHMKLQotcHJpdmF0ZToKLSAgICBzaXplX3QgbVJlc2VydmVkIF9fdW51c2VkOyAgIC8vIGVuZCBvZiByZXNlcnZlZCBzZWN0aW9uCi0gICAgc2l6ZV90IG1Db21taXR0ZWQgX191bnVzZWQ7ICAvLyBlbmQgb2YgY29tbWl0dGVkIHNlY3Rpb24KLSAgICBzaXplX3QgbVVzZWQgX191bnVzZWQ7ICAgICAgIC8vIGVuZCBvZiB1c2VkIHNlY3Rpb24KLSAgICBzaXplX3QgbUZyZWUgX191bnVzZWQ7ICAgICAgIC8vIGVuZCBvZiBmcmVlIHNlY3Rpb24KLX07Ci0KLWNsYXNzIF9DMkNpcmN1bGFyQmxvY2tTZWdtZW50IDogcHVibGljIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0IHsKLXB1YmxpYzoKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhdmFpbGFibGUgc2l6ZSBmb3IgdGhpcyBzZWdtZW50LgotICAgICAqCi0gICAgICogXHJldHVybiBjdXJyZW50bHkgYXZhaWxhYmxlIHNpemUgZm9yIHRoaXMgc2VnbWVudAotICAgICAqLwotICAgIHNpemVfdCBhdmFpbGFibGUoKSBjb25zdDsKLQotICAgIC8qKgotICAgICAqIFJlc2VydmUgc29tZSBzcGFjZSBmb3IgdGhpcyBzZWdtZW50IGZyb20gaXRzIGN1cnJlbnQgc3RhcnQuCi0gICAgICoKLSAgICAgKiBccGFyYW0gc2l6ZSAgICBkZXNpcmVkIHNwYWNlIGluIGJ5dGVzCi0gICAgICogXHBhcmFtIGZlbmNlICAgYSBwb2ludGVyIHRvIGFuIGFjcXVpcmUgZmVuY2UuIElmIG5vbi1udWxsLCB0aGUgcmVzZXJ2YXRpb24gaXMgYXN5bmNocm9ub3VzIGFuZAotICAgICAqICAgICAgICAgICAgICBhIGZlbmNlIHdpbGwgYmUgc3RvcmVkIGhlcmUgdGhhdCB3aWxsIGJlIHNpZ25hbGVkIHdoZW4gdGhlIHJlc2VydmF0aW9uIGlzCi0gICAgICogICAgICAgICAgICAgIGNvbXBsZXRlLiBJZiBudWxsLCB0aGUgcmVzZXJ2YXRpb24gaXMgc3luY2hyb25vdXMuCi0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgdGhlIHNwYWNlIHdhcyBzdWNjZXNzZnVsbHkgcmVzZXJ2ZWQKLSAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSAgICAgdGhlIHNwYWNlIHJlcXVlc3RlZCBjYW5ub3QgYmUgcmVzZXJ2ZWQKLSAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCAgICAgdGhlIHJlc2VydmF0aW9uIHRpbWVkIG91dCBcdG9kbyB3aGVuPwotICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEICAgICBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHJlc2VydmluZyBzcGFjZS4gKHVuZXhwZWN0ZWQpCi0gICAgICovCi0gICAgQzJFcnJvciByZXNlcnZlKHNpemVfdCBzaXplLCBDMkZlbmNlICpmZW5jZSAvKiBudWxsYWJsZSAqLyk7Ci0KLSAgICAvKioKLSAgICAgKiBBYmFuZG9ucyBhIHBvcnRpb24gb2YgdGhpcyBzZWdtZW50LiBUaGlzIHdpbGwgbW92ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgc2VnbWVudC4KLSAgICAgKgotICAgICAqIFxub3RlIFRoaXMgbWV0aG9kcyBpcyBvbmx5IGFsbG93ZWQgaWYgdGhpcyBzZWdtZW50IGlzIHByb2R1Y2luZyBibG9ja3MuCi0gICAgICoKLSAgICAgKiBccGFyYW0gc2l6ZSAgICBudW1iZXIgb2YgYnl0ZXMgdG8gYWJhbmRvbgotICAgICAqCi0gICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgICAgIHRoZSBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgYWJhbmRvbmVkCi0gICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgICAgIHRoZSBvcGVyYXRpb24gdGltZWQgb3V0ICh1bmV4cGVjdGVkKQotICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEICAgICBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIGFiYW5kb25pbmcgdGhlIGRhdGEgKHVuZXhwZWN0ZWQpCi0gICAgICovCi0gICAgQzJFcnJvciBhYmFuZG9uKHNpemVfdCBzaXplKTsKLQotICAgIC8qKgotICAgICAqIFNoYXJlIGEgcG9ydGlvbiBhcyBibG9jayhzKSB3aXRoIGNvbnN1bWVycyAodGhlc2UgYXJlIG1vdmVkIHRvIHRoZSB1c2VkIHNlY3Rpb24pLgotICAgICAqCi0gICAgICogXG5vdGUgVGhpcyBtZXRob2RzIGlzIG9ubHkgYWxsb3dlZCBpZiB0aGlzIHNlZ21lbnQgaXMgcHJvZHVjaW5nIGJsb2Nrcy4KLSAgICAgKiBcbm90ZSBTaGFyZSBkb2VzIG5vdCBtb3ZlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlZ21lbnQuIChcdG9kbyBhZGQgYWJhbmRvbi9vZmZzZXQ/KQotICAgICAqCi0gICAgICogXHBhcmFtIHNpemUgICAgbnVtYmVyIG9mIGJ5dGVzIHRvIHNoYXJlCi0gICAgICogXHBhcmFtIGZlbmNlICAgZmVuY2UgdG8gYmUgdXNlZCBmb3IgdGhlIHNlY3Rpb24KLSAgICAgKiBccGFyYW0gYmxvY2tzICBsaXN0IHdoZXJlIHRoZSBibG9ja3Mgb2YgdGhlIHNlY3Rpb24gYXJlIGFwcGVuZGVkIHRvCi0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgdGhlIHBvcnRpb24gd2FzIHN1Y2Nlc3NmdWxseSBzaGFyZWQKLSAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSAgICAgbm90IGVub3VnaCBtZW1vcnkgdG8gc2hhcmUgdGhlIHBvcnRpb24KLSAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCAgICAgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQgKHVuZXhwZWN0ZWQpCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgc2hhcmluZyB0aGUgZGF0YSAodW5leHBlY3RlZCkKLSAgICAgKi8KLSAgICBDMkVycm9yIHNoYXJlKHNpemVfdCBzaXplLCBDMkZlbmNlIGZlbmNlLCBzdGQ6Omxpc3Q8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGJlZ2lubmluZyBvZmZzZXQgb2YgdGhpcyBzZWdtZW50IGZyb20gdGhlIHN0YXJ0IG9mIHRoaXMgY2lyY3VsYXIgYmxvY2suCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGJlZ2lubmluZyBvZmZzZXQKLSAgICAgKi8KLSAgICBzaXplX3QgYmVnaW4oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGVuZCBvZmZzZXQgb2YgdGhpcyBzZWdtZW50IGZyb20gdGhlIHN0YXJ0IG9mIHRoaXMgY2lyY3VsYXIgYmxvY2suCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGVuZCBvZmZzZXQKLSAgICAgKi8KLSAgICBzaXplX3QgZW5kKCk7Ci19OwotCi0vKioKLSAqIEEgY2lyY3VsYXIgd3JpdGUtdmlldyBpcyBhIGR5bmFtaWMgbWFwcGVkIHZpZXcgZm9yIGEgc2VnbWVudCBvZiBhIGNpcmN1bGFyIGJsb2NrLiBDYXJlIG11c3QgYmUKLSAqIHRha2VuIHdoZW4gdXNpbmcgdGhpcyB2aWV3IHNvIHRoYXQgb25seSB0aGUgc2VjdGlvbiBvd25lZCBieSB0aGUgc2VnbWVudCBpcyBtb2RpZmllZC4KLSAqLwotY2xhc3MgQzJDaXJjdWxhcldyaXRlVmlldyA6IHB1YmxpYyBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCB7Ci1wdWJsaWM6Ci0gICAgLyoqCi0gICAgICogU3RhcnQgb2YgdGhlIGNpcmN1bGFyIGJsb2NrLgotICAgICAqIFxub3RlIHRoZSBzZWdtZW50IGRvZXMgbm90IG93biB0aGlzIHBvaW50ZXIuCi0gICAgICoKLSAgICAgKiBccmV0dXJuIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjaXJjdWxhciBibG9jayBvciBudWxscHRyIG9uIGVycm9yLgotICAgICAqLwotICAgIHVpbnQ4X3QgKmJhc2UoKTsKLQotICAgIC8qKgotICAgICAqIFxyZXR1cm4gZXJyb3IgZHVyaW5nIHRoZSBjcmVhdGlvbi9tYXBwaW5nIG9mIHRoaXMgdmlldy4KLSAgICAgKi8KLSAgICBDMkVycm9yIGVycm9yKCk7Ci19OwotCi0vKioKLSAqIFRoZSB3cml0ZXIgb2YgYSBjaXJjdWxhciBidWZmZXIuCi0gKgotICogQ2FuIGNvbW1pdCBkYXRhIHRvIGEgcmVhZGVyIChub3Qgc3VwcG9ydGVkIGZvciBjb21wb25lbnRzKSBPUiBzaGFyZSBkYXRhIGJsb2NrcyBkaXJlY3RseSB3aXRoIGEKLSAqIGNvbnN1bWVyLgotICoKLSAqIElmIGEgY29tcG9uZW50IHN1cHBvcnRzIG91dHB1dHRpbmcgZGF0YSBpbnRvIGNpcmN1bGFyIGJ1ZmZlcnMsIGl0IG11c3QgYWxsb2NhdGUgYSBjaXJjdWxhcgotICogYmxvY2sgYW5kIHVzZSBhIGNpcmN1bGFyIHdyaXRlci4KLSAqLwotY2xhc3MgQzJDaXJjdWxhcldyaXRlciA6IHB1YmxpYyBfQzJDaXJjdWxhckJsb2NrU2VnbWVudCB7Ci1wdWJsaWM6Ci0gICAgLyoqCi0gICAgICogQ29tbWl0cyBhIHBvcnRpb24gb2YgdGhpcyBzZWdtZW50IHRvIHRoZSBuZXh0IHNlZ21lbnQuIFRoaXMgbW92ZXMgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgICAgKiBzZWdtZW50LgotICAgICAqCi0gICAgICogXHBhcmFtIHNpemUgICAgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbW1pdCB0byB0aGUgbmV4dCBzZWdtZW50Ci0gICAgICogXHBhcmFtIGZlbmNlICAgZmVuY2UgdXNlZCBmb3IgdGhlIGNvbW1pdCAodGhlIGZlbmNlIG11c3Qgc2lnbmFsIGJlZm9yZSB0aGUgZGF0YSBpcyBjb21taXR0ZWQpCi0gICAgICovCi0gICAgQzJFcnJvciBjb21taXQoc2l6ZV90IHNpemUsIEMyRmVuY2UgZmVuY2UpOwotCi0gICAgLyoqCi0gICAgICogTWFwcyB0aGlzIGJsb2NrIGludG8gbWVtb3J5IGFuZCByZXR1cm5zIGEgd3JpdGUgdmlldyBmb3IgaXQuCi0gICAgICoKLSAgICAgKiBccmV0dXJuIGEgd3JpdGUgdmlldyBmb3IgdGhpcyBibG9jay4KLSAgICAgKi8KLSAgICBDMkFjcXVpcmFibGU8QzJDaXJjdWxhcldyaXRlVmlldz4gbWFwKCk7Ci19OwotCi0vLy8gQH0KLQotLy8vIFxkZWZncm91cCBncmFwaGljIEdyYXBoaWMgRGF0YSBCbG9ja3MKLS8vLyBAewotCi0vKioKLSAqIEludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IGhhdmUgYSB3aWR0aCBhbmQgaGVpZ2h0IChwbGFuYXIgY2FwYWNpdHkpLgotICovCi1jbGFzcyBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdCB7Ci0vLy8gXG5hbWUgUGxhbmFyIGNhcGFjaXR5IGludGVyZmFjZQotLy8vIEB7Ci1wdWJsaWM6Ci0gICAgaW5saW5lIHVpbnQzMl90IHdpZHRoKCkgY29uc3QgeyByZXR1cm4gbVdpZHRoOyB9Ci0gICAgaW5saW5lIHVpbnQzMl90IGhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1IZWlnaHQ7IH0KLQotcHJvdGVjdGVkOgotICAgIGlubGluZSBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdCh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KQotICAgICAgOiBtV2lkdGgod2lkdGgpLCBtSGVpZ2h0KGhlaWdodCkgeyB9Ci0KLSAgICBpbmxpbmUgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QoY29uc3QgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QgKnBhcmVudCkKLSAgICAgICAgOiBtV2lkdGgocGFyZW50ID09IG51bGxwdHIgPyAwIDogcGFyZW50LT53aWR0aCgpKSwKLSAgICAgICAgICBtSGVpZ2h0KHBhcmVudCA9PSBudWxscHRyID8gMCA6IHBhcmVudC0+aGVpZ2h0KCkpIHsgfQotCi1wcml2YXRlOgotICAgIGNvbnN0IHVpbnQzMl90IG1XaWR0aDsKLSAgICBjb25zdCB1aW50MzJfdCBtSGVpZ2h0OwotLy8vIEB9Ci19OwotCi0vKioKLSAqIEMyUmVjdDogcmVjdGFuZ2xlIHR5cGUgd2l0aCBub24tbmVnYXRpdmUgY29vcmRpbmF0ZXMuCi0gKgotICogXG5vdGUgVGhpcyBzdHJ1Y3QgaGFzIHB1YmxpYyBmaWVsZHMgd2l0aG91dCBnZXR0ZXJzL3NldHRlcnMuIEFsbCBtZXRob2RzIGFyZSBpbmxpbmUuCi0gKi8KLXN0cnVjdCBDMlJlY3QgewotLy8gcHVibGljOgotICAgIHVpbnQzMl90IG1MZWZ0OwotICAgIHVpbnQzMl90IG1Ub3A7Ci0gICAgdWludDMyX3QgbVdpZHRoOwotICAgIHVpbnQzMl90IG1IZWlnaHQ7Ci0KLSAgICBpbmxpbmUgQzJSZWN0KHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpCi0gICAgICAgIDogQzJSZWN0KHdpZHRoLCBoZWlnaHQsIDAsIDApIHsgfQotCi0gICAgaW5saW5lIEMyUmVjdCh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBsZWZ0LCB1aW50MzJfdCB0b3ApCi0gICAgICAgIDogbUxlZnQobGVmdCksIG1Ub3AodG9wKSwgbVdpZHRoKHdpZHRoKSwgbUhlaWdodChoZWlnaHQpIHsgfQotCi0gICAgLy8gdXRpbGl0eSBtZXRob2RzCi0KLSAgICBpbmxpbmUgYm9vbCBpc0VtcHR5KCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVdpZHRoID09IDAgfHwgbUhlaWdodCA9PSAwOwotICAgIH0KLQotICAgIGlubGluZSBib29sIGlzVmFsaWQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtTGVmdCA8PSB+bVdpZHRoICYmIG1Ub3AgPD0gfm1IZWlnaHQ7Ci0gICAgfQotCi0gICAgaW5saW5lIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBpc1ZhbGlkKCkgJiYgIWlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciEoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAhYm9vbCgqdGhpcyk7Ci0gICAgfQotCi0gICAgaW5saW5lIGJvb2wgY29udGFpbnMoY29uc3QgQzJSZWN0ICZvdGhlcikgY29uc3QgewotICAgICAgICBpZiAoIWlzVmFsaWQoKSB8fCAhb3RoZXIuaXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAob3RoZXIuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBtTGVmdCA8PSBvdGhlci5tTGVmdCAmJiBtVG9wIDw9IG90aGVyLm1Ub3AKLSAgICAgICAgICAgICAgICAgICAgJiYgbUxlZnQgKyBtV2lkdGggPj0gb3RoZXIubUxlZnQgKyBvdGhlci5tV2lkdGgKLSAgICAgICAgICAgICAgICAgICAgJiYgbVRvcCArIG1IZWlnaHQgPj0gb3RoZXIubVRvcCArIG90aGVyLm1IZWlnaHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEMyUmVjdCAmb3RoZXIpIGNvbnN0IHsKLSAgICAgICAgaWYgKCFpc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAhb3RoZXIuaXNWYWxpZCgpOwotICAgICAgICB9IGVsc2UgaWYgKGlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIG90aGVyLmlzRW1wdHkoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBtTGVmdCA9PSBvdGhlci5tTGVmdCAmJiBtVG9wID09IG90aGVyLm1Ub3AKLSAgICAgICAgICAgICAgICAgICAgJiYgbVdpZHRoID09IG90aGVyLm1XaWR0aCAmJiBtSGVpZ2h0ID09IG90aGVyLm1IZWlnaHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEMyUmVjdCAmb3RoZXIpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuICFvcGVyYXRvcj09KG90aGVyKTsKLSAgICB9Ci0KLSAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEMyUmVjdCAmb3RoZXIpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIGNvbnRhaW5zKG90aGVyKTsKLSAgICB9Ci0KLSAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgQzJSZWN0ICZvdGhlcikgY29uc3QgewotICAgICAgICByZXR1cm4gY29udGFpbnMob3RoZXIpICYmICFvcGVyYXRvcj09KG90aGVyKTsKLSAgICB9Ci0KLSAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEMyUmVjdCAmb3RoZXIpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG90aGVyLmNvbnRhaW5zKCp0aGlzKTsKLSAgICB9Ci0KLSAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgQzJSZWN0ICZvdGhlcikgY29uc3QgewotICAgICAgICByZXR1cm4gb3RoZXIuY29udGFpbnMoKnRoaXMpICYmICFvcGVyYXRvcj09KG90aGVyKTsKLSAgICB9Ci19OwotCi0vKioKLSAqIEMyUGxhbmVJbmZvOiBpbmZvcm1hdGlvbiBvbiB0aGUgbGF5b3V0IG9mIGZsZXhpYmxlIHBsYW5lcy4KLSAqCi0gKiBQdWJsaWMgZmllbGRzIHdpdGhvdXQgZ2V0dGVycy9zZXR0ZXJzLgotICovCi1zdHJ1Y3QgQzJQbGFuZUluZm8gewotLy8gcHVibGljOgotICAgIGVudW0gQ2hhbm5lbCA6IHVpbnQzMl90IHsKLSAgICAgICAgWSwKLSAgICAgICAgUiwKLSAgICAgICAgRywKLSAgICAgICAgQiwKLSAgICAgICAgQSwKLSAgICAgICAgQ3IsCi0gICAgICAgIENiLAotICAgIH0gbUNoYW5uZWw7Ci0KLSAgICBpbnQzMl90IG1Db2xJbmM7ICAgICAgICAgICAgICAgLy8gY29sdW1uIGluY3JlbWVudCBpbiBieXRlcy4gbWF5IGJlIG5lZ2F0aXZlCi0gICAgaW50MzJfdCBtUm93SW5jOyAgICAgICAgICAgICAgIC8vIHJvdyBpbmNyZW1lbnQgaW4gYnl0ZXMuIG1heSBiZSBuZWdhdGl2ZQotICAgIHVpbnQzMl90IG1Ib3JpelN1YnNhbXBsaW5nOyAgICAvLyBzdWJzYW1wbGluZyBjb21wYXJlZCB0byB3aWR0aAotICAgIHVpbnQzMl90IG1WZXJ0U3Vic2FtcGxpbmc7ICAgICAvLyBzdWJzYW1wbGluZyBjb21wYXJlZCB0byBoZWlnaHQKLQotICAgIHVpbnQzMl90IG1CaXREZXB0aDsKLSAgICB1aW50MzJfdCBtQWxsb2NhdGVkRGVwdGg7Ci0KLSAgICBpbmxpbmUgc3NpemVfdCBtaW5PZmZzZXQodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgewotICAgICAgICBzc2l6ZV90IG9mZnMgPSAwOwotICAgICAgICBpZiAod2lkdGggPiAwICYmIG1Db2xJbmMgPCAwKSB7Ci0gICAgICAgICAgICBvZmZzICs9IG1Db2xJbmMgKiAoc3NpemVfdCkod2lkdGggLSAxKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaGVpZ2h0ID4gMCAmJiBtUm93SW5jIDwgMCkgewotICAgICAgICAgICAgb2ZmcyArPSBtUm93SW5jICogKHNzaXplX3QpKGhlaWdodCAtIDEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvZmZzOwotICAgIH0KLQotICAgIGlubGluZSBzc2l6ZV90IG1heE9mZnNldCh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBhbGxvY2F0ZWREZXB0aCkgewotICAgICAgICBzc2l6ZV90IG9mZnMgPSAoYWxsb2NhdGVkRGVwdGggKyA3KSA+PiAzOwotICAgICAgICBpZiAod2lkdGggPiAwICYmIG1Db2xJbmMgPiAwKSB7Ci0gICAgICAgICAgICBvZmZzICs9IG1Db2xJbmMgKiAoc3NpemVfdCkod2lkdGggLSAxKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaGVpZ2h0ID4gMCAmJiBtUm93SW5jID4gMCkgewotICAgICAgICAgICAgb2ZmcyArPSBtUm93SW5jICogKHNzaXplX3QpKGhlaWdodCAtIDEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvZmZzOwotICAgIH0KLX07Ci0KLXN0cnVjdCBDMlBsYW5lTGF5b3V0IHsKLXB1YmxpYzoKLSAgICBlbnVtIFR5cGUgOiB1aW50MzJfdCB7Ci0gICAgICAgIE1FRElBX0lNQUdFX1RZUEVfVU5LTk9XTiA9IDAsCi0gICAgICAgIE1FRElBX0lNQUdFX1RZUEVfWVVWID0gMHgxMDAsCi0gICAgICAgIE1FRElBX0lNQUdFX1RZUEVfWVVWQSwKLSAgICAgICAgTUVESUFfSU1BR0VfVFlQRV9SR0IsCi0gICAgICAgIE1FRElBX0lNQUdFX1RZUEVfUkdCQSwKLSAgICB9OwotCi0gICAgVHlwZSBtVHlwZTsKLSAgICB1aW50MzJfdCBtTnVtUGxhbmVzOyAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBwbGFuZXMKLQotICAgIGVudW0gUGxhbmVJbmRleCA6IHVpbnQzMl90IHsKLSAgICAgICAgWSA9IDAsCi0gICAgICAgIFUgPSAxLAotICAgICAgICBWID0gMiwKLSAgICAgICAgUiA9IDAsCi0gICAgICAgIEcgPSAxLAotICAgICAgICBCID0gMiwKLSAgICAgICAgQSA9IDMsCi0gICAgICAgIE1BWF9OVU1fUExBTkVTID0gNCwKLSAgICB9OwotCi0gICAgQzJQbGFuZUluZm8gbVBsYW5lc1tNQVhfTlVNX1BMQU5FU107Ci19OwotCi0vKioKLSAqIEFzcGVjdCBmb3Igb2JqZWN0cyB0aGF0IGhhdmUgYSBwbGFuYXIgc2VjdGlvbiAoY3JvcCByZWN0YW5nbGUpLgotICoKLSAqIFRoaXMgY2xhc3MgaXMgY29waWFibGUuCi0gKi8KLWNsYXNzIF9DMlBsYW5hclNlY3Rpb24gOiBwdWJsaWMgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QgewotLy8vIFxuYW1lIFBsYW5hciBzZWN0aW9uIGludGVyZmFjZQotLy8vIEB7Ci1wdWJsaWM6Ci0gICAgLy8gY3JvcCBjYW4gYmUgYW4gZW1wdHkgcmVjdCwgZG9lcyBub3QgaGF2ZSB0byBsaW5lIHVwIHdpdGggc3Vic2FtcGxpbmcKLSAgICAvLyBOT1RFOiB3ZSBkbyBub3Qgc3VwcG9ydCBmbG9hdGluZy1wb2ludCBjcm9wCi0gICAgaW5saW5lIGNvbnN0IEMyUmVjdCBjcm9wKCkgeyByZXR1cm4gbUNyb3A7IH0KLQotICAgIC8qKgotICAgICAqICBTZXRzIGNyb3AgdG8gY3JvcCBpbnRlcnNlY3RlZCB3aXRoIFsoMCwwKSAuLiAod2lkdGgsIGhlaWdodCldCi0gICAgICovCi0gICAgaW5saW5lIHZvaWQgc2V0Q3JvcF9iZShjb25zdCBDMlJlY3QgJmNyb3ApOwotCi0gICAgLyoqCi0gICAgICogSWYgY3JvcCBpcyB3aXRoaW4gdGhlIGRpbWVuc2lvbnMgb2YgdGhpcyBvYmplY3QsIGl0IHNldHMgY3JvcCB0byBpdC4KLSAgICAgKgotICAgICAqIFxyZXR1cm4gdHJ1ZSBpZmYgY3JvcCBpcyB3aXRoaW4gdGhlIGRpbWVuc2lvbnMgb2YgdGhpcyBvYmplY3QKLSAgICAgKi8KLSAgICBpbmxpbmUgYm9vbCBzZXRDcm9wKGNvbnN0IEMyUmVjdCAmY3JvcCk7Ci0KLXByaXZhdGU6Ci0gICAgQzJSZWN0IG1Dcm9wOwotLy8vIEB9Ci19OwotCi1jbGFzcyBDMkJsb2NrMkQgOiBwdWJsaWMgX0MyUGxhbmFyU2VjdGlvbiB7Ci1wdWJsaWM6Ci0gICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIGNsYXNzIEltcGw7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOwotfTsKLQotLyoqCi0gKiBHcmFwaGljIHZpZXcgcHJvdmlkZXMgcmVhZCBvciByZWFkLXdyaXRlIGFjY2VzcyBmb3IgYSBncmFwaGljIGJsb2NrLgotICoKLSAqIFRoaXMgY2xhc3MgaXMgY29waWFibGUuCi0gKgotICogXG5vdGUgRHVlIHRvIHRoZSBzdWJzYW1wbGluZyBvZiBncmFwaGljIGJ1ZmZlcnMsIGEgcmVhZCB2aWV3IG11c3Qgc3RpbGwgY29udGFpbiBhIGNyb3AgcmVjdGFuZ2xlCi0gKiB0byBlbnN1cmUgc3Vic2FtcGxpbmcgaXMgZm9sbG93ZWQuIFRoaXMgcmVzdWx0cyBpbiBuZWFybHkgaWRlbnRpY2FsIGludGVyZmFjZSBiZXR3ZWVuIHJlYWQgYW5kCi0gKiB3cml0ZSB2aWV3cywgc28gQzJHcmFwaGljVmlldyBjYW4gZW5jb21wYXNzIGJvdGggb2YgdGhlbS4KLSAqLwotY2xhc3MgQzJHcmFwaGljVmlldyA6IHB1YmxpYyBfQzJQbGFuYXJTZWN0aW9uIHsKLXB1YmxpYzoKLSAgICAvKioKLSAgICAgKiBccmV0dXJuIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBibG9jayBvciBudWxscHRyIG9uIGVycm9yLgotICAgICAqLwotICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEoKSBjb25zdDsKLQotICAgIC8qKgotICAgICAqIFxyZXR1cm4gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrIG9yIG51bGxwdHIgb24gZXJyb3IuCi0gICAgICovCi0gICAgdWludDhfdCAqZGF0YSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHNlY3Rpb24gb2YgdGhpcyB2aWV3LgotICAgICAqCi0gICAgICogXHBhcmFtIHJlY3QgICAgdGhlIGRpbWVuc2lvbiBvZiB0aGUgc2VjdGlvbi4gXG5vdGUgVGhpcyBpcyBjbGFtcGVkIHRvIHRoZSBjcm9wIG9mIHRoaXMgdmlldy4KLSAgICAgKgotICAgICAqIFxyZXR1cm4gYSByZWFkIHZpZXcgY29udGFpbmluZyB0aGUgcmVxdWVzdGVkIHNlY3Rpb24gb2YgdGhpcyB2aWV3Ci0gICAgICovCi0gICAgY29uc3QgQzJHcmFwaGljVmlldyBzdWJWaWV3KGNvbnN0IEMyUmVjdCAmcmVjdCkgY29uc3Q7Ci0gICAgQzJHcmFwaGljVmlldyBzdWJWaWV3KGNvbnN0IEMyUmVjdCAmcmVjdCk7Ci0KLSAgICAvKioKLSAgICAgKiBccmV0dXJuIGVycm9yIGR1cmluZyB0aGUgY3JlYXRpb24vbWFwcGluZyBvZiB0aGlzIHZpZXcuCi0gICAgICovCi0gICAgQzJFcnJvciBlcnJvcigpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIGNsYXNzIEltcGw7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOwotfTsKLQotLyoqCi0gKiBBIGNvbnN0YW50IChyZWFkLW9ubHkpIGdyYXBoaWMgYmxvY2sgKHBvcnRpb24gb2YgYW4gYWxsb2NhdGlvbikgd2l0aCBhbiBhY3F1aXJlIGZlbmNlLgotICogQmxvY2tzIGFyZSB1bm1hcHBlZCB3aGVuIGNyZWF0ZWQsIGFuZCBjYW4gYmUgbWFwcGVkIGludG8gYSByZWFkIHZpZXcgb24gZGVtYW5kLgotICoKLSAqIFRoaXMgY2xhc3MgaXMgY29waWFibGUgYW5kIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSBhbGxvY2F0aW9uIHRoYXQgaXQgaXMgYmFzZWQgb24uCi0gKi8KLWNsYXNzIEMyQ29uc3RHcmFwaGljQmxvY2sgOiBwdWJsaWMgQzJCbG9jazJEIHsKLXB1YmxpYzoKLSAgICAvKioKLSAgICAgKiBNYXBzIHRoaXMgYmxvY2sgaW50byBtZW1vcnkgYW5kIHJldHVybnMgYSByZWFkIHZpZXcgZm9yIGl0LgotICAgICAqCi0gICAgICogXHJldHVybiBhIHJlYWQgdmlldyBmb3IgdGhpcyBibG9jay4KLSAgICAgKi8KLSAgICBDMkFjcXVpcmFibGU8Y29uc3QgQzJHcmFwaGljVmlldz4gbWFwKCkgY29uc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc2VjdGlvbiBvZiB0aGlzIGJsb2NrLgotICAgICAqCi0gICAgICogXHBhcmFtIHJlY3QgICAgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBzZWN0aW9uLiBcbm90ZSBUaGlzIGlzIGNsYW1wZWQgdG8gdGhlIGNyb3AgcmVjdGFuZ2xlIG9mCi0gICAgICogICAgICAgICAgICAgIHRoaXMgYmxvY2suCi0gICAgICoKLSAgICAgKiBccmV0dXJuIGEgY29uc3RhbnQgZ3JhcGhpYyBibG9jayBjb250YWluaW5nIGEgcG9ydGlvbiBvZiB0aGlzIGJsb2NrCi0gICAgICovCi0gICAgQzJDb25zdEdyYXBoaWNCbG9jayBzdWJCbG9jayhjb25zdCBDMlJlY3QgJnJlY3QpIGNvbnN0OwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWNxdWlyZSBmZW5jZSBmb3IgdGhpcyBibG9jay4KLSAgICAgKgotICAgICAqIFxyZXR1cm4gYSBmZW5jZSB0aGF0IG11c3QgYmUgd2FpdGVkIG9uIGJlZm9yZSByZWFkaW5nIHRoZSBibG9jay4KLSAgICAgKi8KLSAgICBDMkZlbmNlIGZlbmNlKCkgY29uc3QgeyByZXR1cm4gbUZlbmNlOyB9Ci0KLXByaXZhdGU6Ci0gICAgQzJGZW5jZSBtRmVuY2U7Ci19OwotCi0vKioKLSAqIEdyYXBoaWMgYmxvY2sgaXMgYSB3cml0ZWFibGUgMkQgYmxvY2suIE9uY2Ugd3JpdHRlbiwgaXQgY2FuIGJlIHNoYXJlZCBpbiB3aG9sZSBvciBpbiBwYXJ0IHdpdGgKLSAqIGNvbnN1bWVycy9yZWFkZXJzIGFzIHJlYWQtb25seSBjb25zdCBncmFwaGljIGJsb2NrLgotICovCi1jbGFzcyBDMkdyYXBoaWNCbG9jayA6IHB1YmxpYyBDMkJsb2NrMkQgewotcHVibGljOgotICAgIC8qKgotICAgICAqIE1hcHMgdGhpcyBibG9jayBpbnRvIG1lbW9yeSBhbmQgcmV0dXJucyBhIHdyaXRlIHZpZXcgZm9yIGl0LgotICAgICAqCi0gICAgICogXHJldHVybiBhIHdyaXRlIHZpZXcgZm9yIHRoaXMgYmxvY2suCi0gICAgICovCi0gICAgQzJBY3F1aXJhYmxlPEMyR3JhcGhpY1ZpZXc+IG1hcCgpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHJlYWQtb25seSBjb25zdCBsaW5lYXIgYmxvY2sgZm9yIGEgcG9ydGlvbiBvZiB0aGlzIGJsb2NrOyBvcHRpb25hbGx5IHByb3RlY3RlZAotICAgICAqIGJ5IGFuIGFjcXVpcmUgZmVuY2UuIFRoZXJlIGFyZSB0d28gd2F5cyB0byB1c2UgdGhpczoKLSAgICAgKgotICAgICAqIDEpIHNoYXJlIHJlYWR5IGJsb2NrIGFmdGVyIHdyaXRpbmcgZGF0YSBpbnRvIHRoZSBibG9jay4gSW4gdGhpcyBjYXNlIG5vIGZlbmNlIHNoYWxsIGJlCi0gICAgICogICAgc3VwcGxpZWQsIGFuZCB0aGUgYmxvY2sgc2hhbGwgbm90IGJlIG1vZGlmaWVkIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QuCi0gICAgICogMikgc2hhcmUgYmxvY2sgbWV0YWRhdGEgYmVmb3JlIGFjdHVhbGx5IChmaW5pc2hpbmcpIHdyaXRpbmcgdGhlIGRhdGEgaW50byB0aGUgYmxvY2suIEluCi0gICAgICogICAgdGhpcyBjYXNlIGEgZmVuY2UgbXVzdCBiZSBzdXBwbGllZCB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIGRhdGEgaXMgd3JpdHRlbi4KLSAgICAgKiAgICBUaGUgYmxvY2sgc2hhbGwgYmUgbW9kaWZpZWQgb25seSB1bnRpbCBmaXJpbmcgdGhlIGV2ZW50IGZvciB0aGUgZmVuY2UuCi0gICAgICovCi0gICAgQzJDb25zdEdyYXBoaWNCbG9jayBzaGFyZShjb25zdCBDMlJlY3QgJmNyb3AsIEMyRmVuY2UgZmVuY2UpOwotfTsKLQotLy8vIEB9Ci0KLS8vLyBcZGVmZ3JvdXAgYnVmZmVyX29uaiBCdWZmZXIgb2JqZWN0cwotLy8vIEB7Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gIEJVRkZFUlMKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vLy8gXHRvZG86IERvIHdlIHN0aWxsIG5lZWQgdGhpcz8KLS8vLwotLy8gVGhlcmUgYXJlIDIga2luZHMgb2YgYnVmZmVyczogbGluZWFyIG9yIGdyYXBoaWMuIExpbmVhciBidWZmZXJzIGNhbiBjb250YWluIGEgc2luZ2xlIGJsb2NrLCBvcgotLy8gYSBsaXN0IG9mIGJsb2NrcyAoTElORUFSX0NIVU5LUykuIFN1cHBvcnQgZm9yIGxpc3Qgb2YgYmxvY2tzIGlzIG9wdGlvbmFsLCBhbmQgY2FuIGFsbG93IGNvbnN1bWluZwotLy8gZGF0YSBmcm9tIGNpcmN1bGFyIGJ1ZmZlcnMgb3Igc2NhdHRlcmVkIGRhdGEgc291cmNlcyB3aXRob3V0IGV4dHJhIG1lbWNweS4gQ3VycmVudGx5LCBsaXN0IG9mCi0vLyBncmFwaGljIGJsb2NrcyBpcyBub3Qgc3VwcG9ydGVkLgotCi1jbGFzcyBDMkxpbmVhckJ1ZmZlcjsgICAvLyByZWFkLXdyaXRlIGJ1ZmZlcgotY2xhc3MgQzJHcmFwaGljQnVmZmVyOyAgLy8gcmVhZC13cml0ZSBidWZmZXIKLWNsYXNzIEMyTGluZWFyQ2h1bmtzQnVmZmVyOwotCi0vKioKLSAqIEMyQnVmZmVyRGF0YTogdGhlIG1haW4sIG5vbi1tZXRhIGRhdGEgb2YgYSBidWZmZXIuIEEgYnVmZmVyIGNhbiBjb250YWluIGVpdGhlciBsaW5lYXIgYmxvY2tzCi0gKiBvciBncmFwaGljIGJsb2NrcywgYW5kIGNhbiBjb250YWluIGVpdGhlciBhIHNpbmdsZSBibG9jayBvciBtdWx0aXBsZSBibG9ja3MuIFRoaXMgaXMgZGV0ZXJtaW5lZAotICogYnkgaXRzIHR5cGUuCi0gKi8KLWNsYXNzIEMyQnVmZmVyRGF0YSB7Ci1wdWJsaWM6Ci0gICAgLyoqCi0gICAgICogIFRoZSB0eXBlIG9mIGJ1ZmZlciBkYXRhLgotICAgICAqLwotICAgIGVudW0gVHlwZSA6IHVpbnQzMl90IHsKLSAgICAgICAgTElORUFSLCAgICAgICAgICAgICAvLy88IHRoZSBidWZmZXIgY29udGFpbnMgYSBzaW5nbGUgbGluZWFyIGJsb2NrCi0gICAgICAgIExJTkVBUl9DSFVOS1MsICAgICAgLy8vPCB0aGUgYnVmZmVyIGNvbnRhaW5zIG9uZSBvciBtb3JlIGxpbmVhciBibG9ja3MKLSAgICAgICAgR1JBUEhJQywgICAgICAgICAgICAvLy88IHRoZSBidWZmZXIgY29udGFpbnMgYSBzaW5nbGUgZ3JhcGhpYyBibG9jawotICAgICAgICBHUkFQSElDX0NIVU5LUywgICAgIC8vLzwgdGhlIGJ1ZmZlciBjb250YWlucyBvbmUgb2YgbW9yZSBncmFwaGljIGJsb2NrcwotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0eXBlIG9mIHRoaXMgYnVmZmVyIChkYXRhKS4KLSAgICAgKiBccmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgYnVmZmVyIGRhdGEuCi0gICAgICovCi0gICAgVHlwZSB0eXBlKCkgY29uc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsaW5lYXIgYmxvY2tzIG9mIHRoaXMgYnVmZmVyLgotICAgICAqIFxyZXR1cm4gYSBjb25zdGFudCBsaXN0IG9mIGNvbnN0IGxpbmVhciBibG9ja3Mgb2YgdGhpcyBidWZmZXIuCi0gICAgICogXHJldHZhbCBlbXB0eSBsaXN0IGlmIHRoaXMgYnVmZmVyIGRvZXMgbm90IGNvbnRhaW4gbGluZWFyIGJsb2NrKHMpLgotICAgICAqLwotICAgIGNvbnN0IHN0ZDo6bGlzdDxDMkNvbnN0TGluZWFyQmxvY2s+IGxpbmVhckJsb2NrcygpIGNvbnN0OwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZ3JhcGhpYyBibG9ja3Mgb2YgdGhpcyBidWZmZXIuCi0gICAgICogXHJldHVybiBhIGNvbnN0YW50IGxpc3Qgb2YgY29uc3QgZ3JhcGhpYyBibG9ja3Mgb2YgdGhpcyBidWZmZXIuCi0gICAgICogXHJldHZhbCBlbXB0eSBsaXN0IGlmIHRoaXMgYnVmZmVyIGRvZXMgbm90IGNvbnRhaW4gZ3JhcGhpYyBibG9jayhzKS4KLSAgICAgKi8KLSAgICBjb25zdCBzdGQ6Omxpc3Q8QzJDb25zdEdyYXBoaWNCbG9jaz4gZ3JhcGhpY0Jsb2NrcygpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIGNsYXNzIEltcGw7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOwotCi1wcm90ZWN0ZWQ6Ci0gICAgLy8gbm8gcHVibGljIGNvbnN0cnVjdG9yCi0gICAgLy8gQzJCdWZmZXJEYXRhKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBJbXBsPiAmaW1wbCkgOiBtSW1wbChpbXBsKSB7fQotfTsKLQotLyoqCi0gKiBDMkJ1ZmZlcjogYnVmZmVyIGJhc2UgY2xhc3MuIFRoZXNlIGFyZSBhbHdheXMgdXNlZCBhcyBzaGFyZWRfcHRycy4gVGhvdWdoIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlcgotICogb2JqZWN0cyAobmF0aXZlIGJ1ZmZlcnMsIGlvbiBidWZmZXJzLCBvciBkbWFidWZzKSBhcmUgcmVmZXJlbmNlLWNvdW50ZWQgYnkgdGhlIHN5c3RlbSwKLSAqIEMyQnVmZmVycyBob2xkIG9ubHkgYSBzaW5nbGUgcmVmZXJlbmNlLgotICoKLSAqIFRoZXNlIG9iamVjdHMgY2Fubm90IGJlIHVzZWQgb24gdGhlIHN0YWNrLgotICovCi1jbGFzcyBDMkJ1ZmZlciB7Ci1wdWJsaWM6Ci0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgYnVmZmVyJ3MgZGF0YS4KLSAgICAgKgotICAgICAqIFxyZXR1cm4gdGhlIGJ1ZmZlcidzIGRhdGEuCi0gICAgICovCi0gICAgY29uc3QgQzJCdWZmZXJEYXRhIGRhdGEoKSBjb25zdDsKLQotICAgIC8qKgotICAgICAqIFRoZXNlIHdpbGwgc3RpbGwgd29yayBpZiB1c2VkIGluIG9uRGVhdGhOb3RpZnkuCi0gICAgICovCi0jaWYgMAotICAgIGlubGluZSBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCdWZmZXI+IGFzTGluZWFyQnVmZmVyKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVR5cGUgPT0gTElORUFSID8gc3RkOjpzaGFyZWRfcHRyOjpyZWludGVycHJldF9jYXN0PEMyTGluZWFyQnVmZmVyPih0aGlzKSA6IG51bGxwdHI7Ci0gICAgfQotCi0gICAgaW5saW5lIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+IGFzR3JhcGhpY0J1ZmZlcigpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1UeXBlID09IEdSQVBISUMgPyBzdGQ6OnNoYXJlZF9wdHI6OnJlaW50ZXJwcmV0X2Nhc3Q8QzJHcmFwaGljQnVmZmVyPih0aGlzKSA6IG51bGxwdHI7Ci0gICAgfQotCi0gICAgaW5saW5lIHN0ZDo6c2hhcmVkX3B0cjxDMkNpcmN1bGFyQnVmZmVyPiBhc0NpcmN1bGFyQnVmZmVyKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVR5cGUgPT0gQ0lSQ1VMQVIgPyBzdGQ6OnNoYXJlZF9wdHI6OnJlaW50ZXJwcmV0X2Nhc3Q8QzJDaXJjdWxhckJ1ZmZlcj4odGhpcykgOiBudWxscHRyOwotICAgIH0KLSNlbmRpZgotCi0gICAgLy8vQG5hbWUgUHJlLWRlc3Ryb3kgbm90aWZpY2F0aW9uIGhhbmRsaW5nCi0gICAgLy8vQHsKLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVyIGZvciBub3RpZmljYXRpb24ganVzdCBwcmlvciB0byB0aGUgZGVzdHJ1Y3Rpb24gb2YgdGhpcyBvYmplY3QuCi0gICAgICovCi0gICAgdHlwZWRlZiB2b2lkICgqT25EZXN0cm95Tm90aWZ5KSAoY29uc3QgQzJCdWZmZXIgKmJ1Ziwgdm9pZCAqYXJnKTsKLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBmb3IgYSBwcmUtZGVzdHJveSBub3RpZmljYXRpb24uIFRoaXMgaXMgY2FsbGVkIGp1c3QgcHJpb3IgdG8gdGhlIGRlc3RydWN0aW9uIG9mCi0gICAgICogdGhpcyBidWZmZXIgKHdoZW4gdGhpcyBidWZmZXIgaXMgbm8gbG9uZ2VyIHZhbGlkLikKLSAgICAgKgotICAgICAqIFxwYXJhbSBvbkRlc3Ryb3lOb3RpZnkgICB0aGUgbm90aWZpY2F0aW9uIGNhbGxiYWNrCi0gICAgICogXHBhcmFtIGFyZyAgICAgICAgICAgICAgIGFuIGFyYml0cmFyeSBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBjYWxsYmFjawotICAgICAqCi0gICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIHJlZ2lzdHJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KLSAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSBhIG5vdGlmaWNhdGlvbiB3YXMgYWxyZWFkeSByZWdpc3RlcmVkIGZvciB0aGlzIGNhbGxiYWNrIGFuZCBhcmd1bWVudAotICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlZ2lzdGVyIGZvciB0aGlzIGNhbGxiYWNrCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgYW4gdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHJlZ2lzdHJhdGlvbiAodW5leHBlY3RlZCkKLSAgICAgKi8KLSAgICBDMkVycm9yIHJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KE9uRGVzdHJveU5vdGlmeSAqb25EZXN0cm95Tm90aWZ5LCB2b2lkICphcmcgPSBudWxscHRyKTsKLQotICAgIC8qKgotICAgICAqIFVucmVnaXN0ZXJzIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIHByZS1kZXN0cm95IG5vdGlmaWNhdGlvbi4KLSAgICAgKgotICAgICAqIFxwYXJhbSBvbkRlc3Ryb3lOb3RpZnkgICB0aGUgbm90aWZpY2F0aW9uIGNhbGxiYWNrCi0gICAgICogXHBhcmFtIGFyZyAgICAgICAgICAgICAgIGFuIGFyYml0cmFyeSBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBjYWxsYmFjawotICAgICAqCi0gICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIHVucmVnaXN0cmF0aW9uIHdhcyBzdWNjZXNzZnVsLgotICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIHRoZSBub3RpZmljYXRpb24gd2FzIG5vdCBmb3VuZAotICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIGFuIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSByZWdpc3RyYXRpb24gKHVuZXhwZWN0ZWQpCi0gICAgICovCi0gICAgQzJFcnJvciB1bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KE9uRGVzdHJveU5vdGlmeSAqb25EZXN0cm95Tm90aWZ5LCB2b2lkICphcmcgPSBudWxscHRyKTsKLQotICAgIC8vL0B9Ci0KLSAgICB2aXJ0dWFsIH5DMkJ1ZmZlcigpID0gZGVmYXVsdDsKLQotICAgIC8vL0BuYW1lIEJ1ZmZlci1zcGVjaWZpYyBhcmJpdHJhcnkgbWV0YWRhdGEgaGFuZGxpbmcKLSAgICAvLy9AewotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbGlzdCBvZiBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWZmZXIuCi0gICAgICoKLSAgICAgKiBccmV0dXJuIGEgY29uc3RhbnQgbGlzdCBvZiBpbmZvIG9iamVjdHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYnVmZmVyLgotICAgICAqLwotICAgIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPj4gaW5mb3MoKSBjb25zdDsKLQotICAgIC8qKgotICAgICAqIEF0dGFjaGVzIChvciB1cGRhdGVzKSBhbiAoZXhpc3RpbmcpIG1ldGFkYXRhIGZvciB0aGlzIGJ1ZmZlci4KLSAgICAgKiBJZiB0aGUgbWV0YWRhdGEgaXMgc3RyZWFtIHNwZWNpZmljLCB0aGUgc3RyZWFtIGluZm9ybWF0aW9uIHdpbGwgYmUgcmVzZXQuCi0gICAgICoKLSAgICAgKiBccGFyYW0gaW5mbyBNZXRhZGF0YSB0byB1cGRhdGUKLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBtZXRhZGF0YSB3YXMgc3VjY2Vzc2Z1bGx5IGF0dGFjaGVkL3VwZGF0ZWQuCi0gICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gYXR0YWNoIHRoZSBtZXRhZGF0YSAodGhpcyByZXR1cm4gdmFsdWUgaXMgbm90Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgdXNlZCBpZiB0aGUgc2FtZSBraW5kIG9mIG1ldGFkYXRhIGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gdGhlIGJ1ZmZlcikuCi0gICAgICovCi0gICAgQzJFcnJvciBzZXRJbmZvKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+ICZpbmZvKTsKLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGVyZSBpcyBhIGNlcnRhaW4gdHlwZSBvZiBtZXRhZGF0YSBhdHRhY2hlZCB0byB0aGlzIGJ1ZmZlci4KLSAgICAgKgotICAgICAqIFxwYXJhbSBpbmRleCB0aGUgcGFyYW1ldGVyIHR5cGUgb2YgdGhlIG1ldGFkYXRhCi0gICAgICoKLSAgICAgKiBccmV0dXJuIHRydWUgaWZmIHRoZXJlIGlzIGEgbWV0YWRhdGEgd2l0aCB0aGUgcGFyYW1ldGVyIHR5cGUgYXR0YWNoZWQgdG8gdGhpcyBidWZmZXIuCi0gICAgICovCi0gICAgYm9vbCBoYXNJbmZvKEMyUGFyYW06OlR5cGUgaW5kZXgpIGNvbnN0OwotICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+IHJlbW92ZUluZm8oQzJQYXJhbTo6VHlwZSBpbmRleCkgY29uc3Q7Ci0gICAgLy8vQH0KLQotcHJvdGVjdGVkOgotICAgIC8vIG5vIHB1YmxpYyBjb25zdHJ1Y3RvcgotICAgIGlubGluZSBDMkJ1ZmZlcigpID0gZGVmYXVsdDsKLQotcHJpdmF0ZToKLS8vICAgIFR5cGUgX21UeXBlOwotfTsKLQotLyoqCi0gKiBBbiBleHRlbnNpb24gb2YgQzJJbmZvIG9iamVjdHMgdGhhdCBjYW4gY29udGFpbiBhcmJpdHJhcnkgYnVmZmVyIGRhdGEuCi0gKgotICogXG5vdGUgVGhpcyBvYmplY3QgaXMgbm90IGRlc2NyaWJhYmxlIGFuZCBjb250YWlucyBvcGFxdWUgZGF0YS4KLSAqLwotY2xhc3MgQzJJbmZvQnVmZmVyIHsKLXB1YmxpYzoKLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBpbmRleCBvZiB0aGlzIGluZm8gb2JqZWN0LgotICAgICAqCi0gICAgICogXHJldHVybiB0aGUgcGFyYW1ldGVyIGluZGV4LgotICAgICAqLwotICAgIGNvbnN0IEMyUGFyYW06OkluZGV4IGluZGV4KCkgY29uc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBidWZmZXIncyBkYXRhLgotICAgICAqCi0gICAgICogXHJldHVybiB0aGUgYnVmZmVyJ3MgZGF0YS4KLSAgICAgKi8KLSAgICBjb25zdCBDMkJ1ZmZlckRhdGEgZGF0YSgpIGNvbnN0OwotfTsKLQotLy8vIEB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICBBTExPQ0FUSU9OUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8vLyBcZGVmZ3JvdXAgYWxsb2NhdG9yIEFsbG9jYXRpb24gYW5kIG1lbW9yeSBwbGFjZW1lbnQKLS8vLyBAewotCi0vKioKLSAqIEJ1ZmZlci9tZW1vcnkgdXNhZ2UgYml0cy4gVGhlc2UgYXJlIHVzZWQgYnkgdGhlIGFsbG9jYXRvcnMgdG8gc2VsZWN0IG9wdGltYWwgbWVtb3J5IHR5cGUvcG9vbCBhbmQKLSAqIGJ1ZmZlciBsYXlvdXQuCi0gKgotICogXG5vdGUgVGhpcyBzdHJ1Y3QgaGFzIHB1YmxpYyBmaWVsZHMgd2l0aG91dCBnZXR0ZXJzL3NldHRlcnMuIEFsbCBtZXRob2RzIGFyZSBpbmxpbmUuCi0gKi8KLXN0cnVjdCBDMk1lbW9yeVVzYWdlIHsKLS8vIHB1YmxpYzoKLSAgICAvLyBUT0RPOiBtYXRjaCB0aGVzZSB0byBncmFsbG9jMS5oCi0gICAgZW51bSBDb25zdW1lciA6IHVpbnQ2NF90IHsKLSAgICAgICAga1NvZnR3YXJlUmVhZCAgICAgICAgPSBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4sCi0gICAgICAgIGtSZW5kZXJTY3JpcHRSZWFkICAgID0gR1JBTExPQ19VU0FHRV9SRU5ERVJTQ1JJUFQsCi0gICAgICAgIGtUZXh0dXJlUmVhZCAgICAgICAgID0gR1JBTExPQ19VU0FHRV9IV19URVhUVVJFLAotICAgICAgICBrSGFyZHdhcmVDb21wb3NlciAgICA9IEdSQUxMT0NfVVNBR0VfSFdfQ09NUE9TRVIsCi0gICAgICAgIGtIYXJkd2FyZUVuY29kZXIgICAgID0gR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSLAotICAgICAgICBrUHJvdGVjdGVkUmVhZCAgICAgICA9IEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVELAotICAgIH07Ci0KLSAgICBlbnVtIFByb2R1Y2VyIDogdWludDY0X3QgewotICAgICAgICBrU29mdHdhcmVXcml0ZSAgICAgICA9IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sCi0gICAgICAgIGtSZW5kZXJTY3JpcHRXcml0ZSAgID0gR1JBTExPQ19VU0FHRV9SRU5ERVJTQ1JJUFQsCi0gICAgICAgIGtUZXh0dXJlV3JpdGUgICAgICAgID0gR1JBTExPQ19VU0FHRV9IV19SRU5ERVIsCi0gICAgICAgIGtDb21wb3NpdGlvblRhcmdldCAgID0gR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUiB8IEdSQUxMT0NfVVNBR0VfSFdfUkVOREVSLAotICAgICAgICBrSGFyZHdhcmVEZWNvZGVyICAgICA9IEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUiwKLSAgICAgICAga1Byb3RlY3RlZFdyaXRlICAgICAgPSBHUkFMTE9DX1VTQUdFX1BST1RFQ1RFRCwKLSAgICB9OwotCi0gICAgdWludDY0X3QgbUNvbnN1bWVyOyAvLyBlLmcuIGlucHV0Ci0gICAgdWludDY0X3QgbVByb2R1Y2VyOyAvLyBlLmcuIG91dHB1dAotfTsKLQotLyoqCi0gKiBcaW5ncm91cCBsaW5lYXIgYWxsb2NhdG9yCi0gKiAxRCBhbGxvY2F0aW9uIGludGVyZmFjZS4KLSAqLwotY2xhc3MgQzJMaW5lYXJBbGxvY2F0aW9uIDogcHVibGljIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0IHsKLXB1YmxpYzoKLSAgICAvKioKLSAgICAgKiBNYXBzIGEgcG9ydGlvbiBvZiBhbiBhbGxvY2F0aW9uIHN0YXJ0aW5nIGZyb20gfG9mZnNldHwgd2l0aCB8c2l6ZXwgaW50byBsb2NhbCBwcm9jZXNzIG1lbW9yeS4KLSAgICAgKiBTdG9yZXMgdGhlIHN0YXJ0aW5nIGFkZHJlc3MgaW50byB8YWRkcnwsIG9yIE5VTEwgaWYgdGhlIG9wZXJhdGlvbiB3YXMgdW5zdWNjZXNzZnVsLgotICAgICAqIHxmZW5jZUZkfCBpcyBhIGZpbGUgZGVzY3JpcHRvciByZWZlcnJpbmcgdG8gYW4gYWNxdWlyZSBzeW5jIGZlbmNlIG9iamVjdC4gSWYgaXQgaXMgYWxyZWFkeQotICAgICAqIHNhZmUgdG8gYWNjZXNzIHRoZSBidWZmZXIgY29udGVudHMsIHRoZW4gLTEuCi0gICAgICoKLSAgICAgKiBccGFyYW0gb2Zmc2V0ICAgICAgICAgIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBwb3J0aW9uIHRvIGJlIG1hcHBlZCAodGhpcyBkb2VzIG5vdCBoYXZlIHRvCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgYmUgcGFnZSBhbGlnbmVkKQotICAgICAqIFxwYXJhbSBzaXplICAgICAgICAgICAgc2l6ZSBvZiB0aGUgcG9ydGlvbiB0byBiZSBtYXBwZWQgKHRoaXMgZG9lcyBub3QgaGF2ZSB0byBiZSBwYWdlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgYWxpZ25lZCkKLSAgICAgKiBccGFyYW0gdXNhZ2UgICAgICAgICAgIHRoZSBkZXNpcmVkIHVzYWdlLiBcdG9kbyB0aGlzIG11c3QgYmUga1NvZnR3YXJlUmVhZCBhbmQvb3IKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBrU29mdHdhcmVXcml0ZS4KLSAgICAgKiBccGFyYW0gZmVuY2VGZCAgICAgICAgIGEgcG9pbnRlciB0byBhIGZpbGUgZGVzY3JpcHRvciBpZiBhbiBhc3luYyBtYXBwaW5nIGlzIHJlcXVlc3RlZC4gSWYKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBub3QtbnVsbCwgYW5kIGFjcXVpcmUgZmVuY2UgRkQgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBzdWNjZXNzLCBvciAtMQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9uIGZhaWx1cmUuIElmIG51bGwsIHRoZSBtYXBwaW5nIHdpbGwgYmUgc3luY2hyb25vdXMuCi0gICAgICogXHBhcmFtIGFkZHIgICAgICAgICAgICBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIG1hcHBlZCBwb3J0aW9uIHdpbGwgYmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzdG9yZWQuIE9uIGZhaWx1cmUsIG51bGxwdHIgd2lsbCBiZSBzdG9yZWQgaGVyZS4KLSAgICAgKgotICAgICAqIFx0b2RvIE9ubHkgb25lIHBvcnRpb24gY2FuIGJlIG1hcHBlZCBhdCB0aGUgc2FtZSB0aW1lIC0gdGhpcyBpcyB0cnVlIGZvciBncmFsbG9jLCBidXQgdGhlcmUKLSAgICAgKiAgICAgICBpcyBubyBuZWVkIGZvciB0aGlzIGZvciAxRCBidWZmZXJzLgotICAgICAqIFx0b2RvIERvIHdlIG5lZWQgdG8gc3VwcG9ydCBzeW5jIG9wZXJhdGlvbiBhcyB3ZSBjb3VsZCBqdXN0IHdhaXQgZm9yIHRoZSBmZW5jZT8KLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKLSAgICAgKiBccmV0dmFsIEMyX05PX1BFUk1JU1NJT04gbm8gcGVybWlzc2lvbiB0byBtYXAgdGhlIHBvcnRpb24KLSAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dAotICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSBvcGVyYXRpb24KLSAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSB0aGUgcGFyYW1ldGVycyAob2Zmc2V0L3NpemUpIGFyZSBpbnZhbGlkIG9yIG91dHNpZGUgdGhlIGFsbG9jYXRpb24sIG9yCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgdGhlIHVzYWdlIGZsYWdzIGFyZSBpbnZhbGlkIChjYWxsZXIgZXJyb3IpCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgb3BlcmF0aW9uIGZyb20gY29tcGxldGluZyAodW5leHBlY3RlZCkKLSAgICAgKi8KLSAgICB2aXJ0dWFsIEMyRXJyb3IgbWFwKAotICAgICAgICAgICAgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIGludCAqZmVuY2VGZCAvKiBudWxsYWJsZSAqLywKLSAgICAgICAgICAgIHZvaWQgKiphZGRyIC8qIG5vbm51bGwgKi8pID0gMDsKLQotICAgIC8qKgotICAgICAqIFVubWFwcyBhIHBvcnRpb24gb2YgYW4gYWxsb2NhdGlvbiBhdCB8YWRkcnwgd2l0aCB8c2l6ZXwuIFRoZXNlIG11c3QgYmUgcGFyYW1ldGVycyBwcmV2aW91c2x5Ci0gICAgICogcGFzc2VkIHRvIHxtYXB8OyBvdGhlcndpc2UsIHRoaXMgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCi0gICAgICoKLSAgICAgKiBccGFyYW0gYWRkciAgICAgICAgICAgIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIG1hcHBlZCByZWdpb24KLSAgICAgKiBccGFyYW0gc2l6ZSAgICAgICAgICAgIHNpemUgb2YgdGhlIG1hcHBlZCByZWdpb24KLSAgICAgKiBccGFyYW0gZmVuY2VGZCAgICAgICAgIGEgcG9pbnRlciB0byBhIGZpbGUgZGVzY3JpcHRvciBpZiBhbiBhc3luYyB1bm1hcHBpbmcgaXMgcmVxdWVzdGVkLiBJZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIG5vdC1udWxsLCBhIHJlbGVhc2UgZmVuY2UgRkQgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBzdWNjZXNzLCBvciAtMQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9uIGZhaWx1cmUuIFRoaXMgZmVuY2Ugc2lnbmFscyB3aGVuIHRoZSBvcmlnaW5hbCBhbGxvY2F0aW9uIGNvbnRhaW5zCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgYW55IGNoYW5nZXMgdGhhdCBoYXBwZW5lZCB0byB0aGUgbWFwcGVkIHJlZ2lvbi4gSWYgbnVsbCwgdGhlIHVubWFwcGluZwotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc3luY2hyb25vdXMuCi0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCi0gICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQKLSAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSB0aGUgcGFyYW1ldGVycyAoYWRkci9zaXplKSBkbyBub3QgY29ycmVzcG9uZCB0byBwcmV2aW91c2x5IG1hcHBlZAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbnMgKGNhbGxlciBlcnJvcikKLSAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBvcGVyYXRpb24gZnJvbSBjb21wbGV0aW5nICh1bmV4cGVjdGVkKQotICAgICAqIFxyZXR2YWwgQzJfTk9fUEVSTUlTU0lPTiBubyBwZXJtaXNzaW9uIHRvIHVubWFwIHRoZSBwb3J0aW9uICh1bmV4cGVjdGVkIC0gc3lzdGVtKQotICAgICAqLwotICAgIHZpcnR1YWwgQzJFcnJvciB1bm1hcCh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSwgaW50ICpmZW5jZUZkIC8qIG51bGxhYmxlICovKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIHZhbGlkIGFsbG9jYXRpb24uCi0gICAgICoKLSAgICAgKiBcdG9kbyByZW1vdmU/Ci0gICAgICovCi0gICAgdmlydHVhbCBib29sIGlzVmFsaWQoKSBjb25zdCA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGlvbiBoYW5kbGUuCi0gICAgICovCi0gICAgdmlydHVhbCBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3QgPSAwOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgdGhlIHNhbWUgYWxsb2NhdGlvbiBhcyB8b3RoZXJ8LgotICAgICAqLwotICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gJm90aGVyKSBjb25zdCA9IDA7Ci0KLXByb3RlY3RlZDoKLSAgICAvLyBcdG9kbyBzaG91bGQgd2UgbGltaXQgYWxsb2NhdGlvbiBkaXJlY3RseT8KLSAgICBDMkxpbmVhckFsbG9jYXRpb24oc2l6ZV90IGNhcGFjaXR5KSA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KGMyX21pbihjYXBhY2l0eSwgVUlOVDMyX01BWCkpIHt9Ci0gICAgdmlydHVhbCB+QzJMaW5lYXJBbGxvY2F0aW9uKCkgPSBkZWZhdWx0OwotfTsKLQotLyoqCi0gKiBcaW5ncm91cCBncmFwaGljIGFsbG9jYXRvcgotICogMkQgYWxsb2NhdGlvbiBpbnRlcmZhY2UuCi0gKi8KLWNsYXNzIEMyR3JhcGhpY0FsbG9jYXRpb24gOiBwdWJsaWMgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QgewotcHVibGljOgotICAgIC8qKgotICAgICAqIE1hcHMgYSByZWN0YW5ndWxhciBzZWN0aW9uIChhcyBkZWZpbmVkIGJ5IHxyZWN0fCkgb2YgYSAyRCBhbGxvY2F0aW9uIGludG8gbG9jYWwgcHJvY2VzcwotICAgICAqIG1lbW9yeSBmb3IgZmxleGlibGUgYWNjZXNzLiBPbiBzdWNjZXNzLCBpdCBmaWxscyBvdXQgfGxheW91dHwgd2l0aCB0aGUgcGxhbmUgc3BlY2lmaWNhdGlvbnMKLSAgICAgKiBhbmQgZmlsbHMgdGhlIHxhZGRyfCBhcnJheSB3aXRoIHBvaW50ZXJzIHRvIHRoZSBmaXJzdCBieXRlIG9mIHRoZSB0b3AtbGVmdCBwaXhlbCBvZiBlYWNoCi0gICAgICogcGxhbmUgdXNlZC4gT3RoZXJ3aXNlLCBpdCBsZWF2ZXMgfGxheW91dHwgYW5kIHxhZGRyfCB1bnRvdWNoZWQuIHxmZW5jZUZkfCBpcyBhIGZpbGUKLSAgICAgKiBkZXNjcmlwdG9yIHJlZmVycmluZyB0byBhbiBhY3F1aXJlIHN5bmMgZmVuY2Ugb2JqZWN0LiBJZiBpdCBpcyBhbHJlYWR5IHNhZmUgdG8gYWNjZXNzIHRoZQotICAgICAqIGJ1ZmZlciBjb250ZW50cywgdGhlbiAtMS4KLSAgICAgKgotICAgICAqIFxub3RlIE9ubHkgb25lIHBvcnRpb24gb2YgdGhlIGdyYXBoaWMgYWxsb2NhdGlvbiBjYW4gYmUgbWFwcGVkIGF0IHRoZSBzYW1lIHRpbWUuIChUaGlzIGlzCi0gICAgICogZnJvbSBncmFsbG9jMSBsaW1pdGF0aW9uLikKLSAgICAgKgotICAgICAqIFxwYXJhbSByZWN0ICAgICAgICAgICAgc2VjdGlvbiB0byBiZSBtYXBwZWQgKHRoaXMgZG9lcyBub3QgaGF2ZSB0byBiZSBhbGlnbmVkKQotICAgICAqIFxwYXJhbSB1c2FnZSAgICAgICAgICAgdGhlIGRlc2lyZWQgdXNhZ2UuIFx0b2RvIHRoaXMgbXVzdCBiZSBrU29mdHdhcmVSZWFkIGFuZC9vcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGtTb2Z0d2FyZVdyaXRlLgotICAgICAqIFxwYXJhbSBmZW5jZUZkICAgICAgICAgYSBwb2ludGVyIHRvIGEgZmlsZSBkZXNjcmlwdG9yIGlmIGFuIGFzeW5jIG1hcHBpbmcgaXMgcmVxdWVzdGVkLiBJZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIG5vdC1udWxsLCBhbmQgYWNxdWlyZSBmZW5jZSBGRCB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIHN1Y2Nlc3MsIG9yIC0xCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgb24gZmFpbHVyZS4gSWYgbnVsbCwgdGhlIG1hcHBpbmcgd2lsbCBiZSBzeW5jaHJvbm91cy4KLSAgICAgKiBccGFyYW0gbGF5b3V0ICAgICAgICAgIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgbWFwcGVkIHBsYW5lcycgZGVzY3JpcHRvcnMgd2lsbCBiZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZC4gT24gZmFpbHVyZSwgbnVsbHB0ciB3aWxsIGJlIHN0b3JlZCBoZXJlLgotICAgICAqCi0gICAgICogXHRvZG8gRG8gd2UgbmVlZCB0byBzdXBwb3J0IHN5bmMgb3BlcmF0aW9uIGFzIHdlIGNvdWxkIGp1c3Qgd2FpdCBmb3IgdGhlIGZlbmNlPwotICAgICAqCi0gICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAotICAgICAqIFxyZXR2YWwgQzJfTk9fUEVSTUlTU0lPTiBubyBwZXJtaXNzaW9uIHRvIG1hcCB0aGUgc2VjdGlvbgotICAgICAqIFxyZXR2YWwgQzJfQUxSRUFEWV9FWElTVFMgdGhlcmUgaXMgYWxyZWFkeSBhIG1hcHBlZCByZWdpb24gKGNhbGxlciBlcnJvcikKLSAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dAotICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSBvcGVyYXRpb24KLSAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSB0aGUgcGFyYW1ldGVycyAocmVjdCkgYXJlIGludmFsaWQgb3Igb3V0c2lkZSB0aGUgYWxsb2NhdGlvbiwgb3IgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgdXNhZ2UgZmxhZ3MgYXJlIGludmFsaWQgKGNhbGxlciBlcnJvcikKLSAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBvcGVyYXRpb24gZnJvbSBjb21wbGV0aW5nICh1bmV4cGVjdGVkKQotCi0gICAgICovCi0gICAgdmlydHVhbCBDMkVycm9yIG1hcCgKLSAgICAgICAgICAgIEMyUmVjdCByZWN0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBpbnQgKmZlbmNlRmQsCi0gICAgICAgICAgICAvLyBUT0RPOiByZXR1cm4gPGFkZHIsIHNpemU+IGJ1ZmZlcnMgd2l0aCBwbGFuZSBzaXplcwotICAgICAgICAgICAgQzJQbGFuZUxheW91dCAqbGF5b3V0IC8qIG5vbm51bGwgKi8sIHVpbnQ4X3QgKiphZGRyIC8qIG5vbm51bGwgKi8pID0gMDsKLQotICAgIC8qKgotICAgICAqIFVubWFwcyB0aGUgbGFzdCBtYXBwZWQgcmVjdGFuZ3VsYXIgc2VjdGlvbi4KLSAgICAgKgotICAgICAqIFxwYXJhbSBmZW5jZUZkICAgICAgICAgYSBwb2ludGVyIHRvIGEgZmlsZSBkZXNjcmlwdG9yIGlmIGFuIGFzeW5jIHVubWFwcGluZyBpcyByZXF1ZXN0ZWQuIElmCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgbm90LW51bGwsIGEgcmVsZWFzZSBmZW5jZSBGRCB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIHN1Y2Nlc3MsIG9yIC0xCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgb24gZmFpbHVyZS4gVGhpcyBmZW5jZSBzaWduYWxzIHdoZW4gdGhlIG9yaWdpbmFsIGFsbG9jYXRpb24gY29udGFpbnMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhbnkgY2hhbmdlcyB0aGF0IGhhcHBlbmVkIHRvIHRoZSBtYXBwZWQgc2VjdGlvbi4gSWYgbnVsbCwgdGhlIHVubWFwcGluZwotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc3luY2hyb25vdXMuCi0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCi0gICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQKLSAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCB0aGVyZSBpcyBubyBtYXBwZWQgcmVnaW9uIChjYWxsZXIgZXJyb3IpCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgb3BlcmF0aW9uIGZyb20gY29tcGxldGluZyAodW5leHBlY3RlZCkKLSAgICAgKiBccmV0dmFsIEMyX05PX1BFUk1JU1NJT04gbm8gcGVybWlzc2lvbiB0byB1bm1hcCB0aGUgc2VjdGlvbiAodW5leHBlY3RlZCAtIHN5c3RlbSkKLSAgICAgKi8KLSAgICB2aXJ0dWFsIEMyRXJyb3IgdW5tYXAoQzJGZW5jZSAqZmVuY2VGZCAvKiBudWxsYWJsZSAqLykgPSAwOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSB2YWxpZCBhbGxvY2F0aW9uLgotICAgICAqCi0gICAgICogXHRvZG8gcmVtb3ZlPwotICAgICAqLwotICAgIHZpcnR1YWwgYm9vbCBpc1ZhbGlkKCkgY29uc3QgPSAwOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRpb24gaGFuZGxlLgotICAgICAqLwotICAgIHZpcnR1YWwgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0ID0gMDsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBzYW1lIGFsbG9jYXRpb24gYXMgfG90aGVyfC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIGJvb2wgZXF1YWxzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkdyYXBoaWNBbGxvY2F0aW9uPiAmb3RoZXIpID0gMDsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkMyR3JhcGhpY0FsbG9jYXRpb24oKTsKLX07Ci0KLS8qKgotICogIEFsbG9jYXRvcnMgYXJlIHVzZWQgYnkgdGhlIGZyYW1ld29yayB0byBhbGxvY2F0ZSBtZW1vcnkgKGFsbG9jYXRpb25zKSBmb3IgYnVmZmVycy4gVGhleSBjYW4KLSAqICBzdXBwb3J0IGVpdGhlciAxRCBvciAyRCBhbGxvY2F0aW9ucy4KLSAqCi0gKiAgXG5vdGUgSW4gdGhlb3J5IHRoZXkgY291bGQgc3VwcG9ydCBib3RoLCBidXQgaW4gcHJhY3RpY2UsIHdlIHdpbGwgdXNlIG9ubHkgb25lIG9yIHRoZSBvdGhlci4KLSAqCi0gKiAgTmV2ZXIgY29uc3RydWN0ZWQgb24gc3RhY2suCi0gKgotICogIEFsbG9jYXRvcnMgYXJlIHByb3ZpZGVkIGJ5IHZlbmRvcnMuCi0gKi8KLWNsYXNzIEMyQWxsb2NhdG9yIHsKLXB1YmxpYzoKLSAgICAvKioKLSAgICAgKiBBbGxvY2F0ZXMgYSAxRCBhbGxvY2F0aW9uIG9mIGdpdmVuIHxjYXBhY2l0eXwgYW5kIHx1c2FnZXwuIElmIHN1Y2Nlc3NmdWwsIHRoZSBhbGxvY2F0aW9uIGlzCi0gICAgICogc3RvcmVkIGluIHxhbGxvY2F0aW9ufC4gT3RoZXJ3aXNlLCB8YWxsb2NhdGlvbnwgaXMgc2V0IHRvICdudWxscHRyJy4KLSAgICAgKgotICAgICAqIFxwYXJhbSBjYXBhY2l0eSAgICAgICAgdGhlIHNpemUgb2YgcmVxdWVzdGVkIGFsbG9jYXRpb24gKHRoZSBhbGxvY2F0aW9uIGNvdWxkIGJlIHNsaWdodGx5Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgbGFyZ2VyLCBlLmcuIHRvIGFjY291bnQgZm9yIGFueSBzeXN0ZW0tcmVxdWlyZWQgYWxpZ25tZW50KQotICAgICAqIFxwYXJhbSB1c2FnZSAgICAgICAgICAgdGhlIG1lbW9yeSB1c2FnZSBpbmZvIGZvciB0aGUgcmVxdWVzdGVkIGFsbG9jYXRpb24uIFxub3RlIHRoYXQgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgYWxsb2NhdGlvbiBtYXkgYmUgbGF0ZXIgdXNlZC9tYXBwZWQgd2l0aCBkaWZmZXJlbnQgdXNhZ2UuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgVGhlIGFsbG9jYXRvciBzaG91bGQgbGF5b3V0IHRoZSBidWZmZXIgdG8gYmUgb3B0aW1pemVkIGZvciB0aGlzIHVzYWdlLAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGJ1dCBtdXN0IHN1cHBvcnQgYW55IHVzYWdlLiBPbmUgZXhjZXB0aW9uOiBwcm90ZWN0ZWQgYnVmZmVycyBjYW4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvbmx5IGJlIHVzZWQgaW4gYSBwcm90ZWN0ZWQgc2NlbmFyaW8uCi0gICAgICogXHBhcmFtIGFsbG9jYXRpb24gICAgICBwb2ludGVyIHRvIHdoZXJlIHRoZSBhbGxvY2F0aW9uIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCi0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgYWxsb2NhdGlvbiB3YXMgc3VjY2Vzc2Z1bAotICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSBhbGxvY2F0aW9uCi0gICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGFsbG9jYXRpb24gdGltZWQgb3V0Ci0gICAgICogXHJldHZhbCBDMl9OT19QRVJNSVNTSU9OICAgICBubyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIHRoZSBhbGxvY2F0aW9uCi0gICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgY2FwYWNpdHkgb3IgdXNhZ2UgYXJlIG5vdCBzdXBwb3J0ZWQgKGludmFsaWQpIChjYWxsZXIgZXJyb3IpCi0gICAgICogXHJldHZhbCBDMl9VTlNVUFBPUlRFRCAgICAgICB0aGlzIGFsbG9jYXRvciBkb2VzIG5vdCBzdXBwb3J0IDFEIGFsbG9jYXRpb25zCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIGFsbG9jYXRpb24gKHVuZXhwZWN0ZWQpCi0gICAgICovCi0gICAgdmlydHVhbCBDMkVycm9yIGFsbG9jYXRlTGluZWFyQnVmZmVyKAotICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHkgX191bnVzZWQsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgX191bnVzZWQsCi0gICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbiAvKiBub25udWxsICovKSB7Ci0gICAgICAgICphbGxvY2F0aW9uID0gbnVsbHB0cjsKLSAgICAgICAgcmV0dXJuIEMyX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIChSZSljcmVhdGVzIGEgMUQgYWxsb2NhdGlvbiBmcm9tIGEgbmF0aXZlIHxoYW5kbGV8LiBJZiBzdWNjZXNzZnVsLCB0aGUgYWxsb2NhdGlvbiBpcyBzdG9yZWQKLSAgICAgKiBpbiB8YWxsb2NhdGlvbnwuIE90aGVyd2lzZSwgfGFsbG9jYXRpb258IGlzIHNldCB0byAnbnVsbHB0cicuCi0gICAgICoKLSAgICAgKiBccGFyYW0gaGFuZGxlICAgICAgdGhlIGhhbmRsZSBmb3IgdGhlIGV4aXN0aW5nIGFsbG9jYXRpb24KLSAgICAgKiBccGFyYW0gYWxsb2NhdGlvbiAgcG9pbnRlciB0byB3aGVyZSB0aGUgYWxsb2NhdGlvbiBzaGFsbCBiZSBzdG9yZWQgb24gc3VjY2Vzcy4gbnVsbHB0cgotICAgICAqICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCi0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgYWxsb2NhdGlvbiB3YXMgcmVjcmVhdGVkIHN1Y2Nlc3NmdWxseQotICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlY3JlYXRlIHRoZSBhbGxvY2F0aW9uCi0gICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIHJlY3JlYXRpb24gdGltZWQgb3V0ICh1bmV4cGVjdGVkKQotICAgICAqIFxyZXR2YWwgQzJfTk9fUEVSTUlTU0lPTiAgICAgbm8gcGVybWlzc2lvbiB0byByZWNyZWF0ZSB0aGUgYWxsb2NhdGlvbgotICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIGludmFsaWQgaGFuZGxlIChjYWxsZXIgZXJyb3IpCi0gICAgICogXHJldHZhbCBDMl9VTlNVUFBPUlRFRCAgICAgICB0aGlzIGFsbG9jYXRvciBkb2VzIG5vdCBzdXBwb3J0IDFEIGFsbG9jYXRpb25zCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIGFsbG9jYXRpb24gKHVuZXhwZWN0ZWQpCi0gICAgICovCi0gICAgdmlydHVhbCBDMkVycm9yIHJlY3JlYXRlTGluZWFyQnVmZmVyKAotICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSBfX3VudXNlZCwKLSAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICphbGxvY2F0aW9uIC8qIG5vbm51bGwgKi8pIHsKLSAgICAgICAgKmFsbG9jYXRpb24gPSBudWxscHRyOwotICAgICAgICByZXR1cm4gQzJfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWxsb2NhdGVzIGEgMkQgYWxsb2NhdGlvbiBvZiBnaXZlbiB8d2lkdGh8LCB8aGVpZ2h0fCwgfGZvcm1hdHwgYW5kIHx1c2FnZXwuIElmIHN1Y2Nlc3NmdWwsCi0gICAgICogdGhlIGFsbG9jYXRpb24gaXMgc3RvcmVkIGluIHxhbGxvY2F0aW9ufC4gT3RoZXJ3aXNlLCB8YWxsb2NhdGlvbnwgaXMgc2V0IHRvICdudWxscHRyJy4KLSAgICAgKgotICAgICAqIFxwYXJhbSB3aWR0aCAgICAgICAgICAgdGhlIHdpZHRoIG9mIHJlcXVlc3RlZCBhbGxvY2F0aW9uICh0aGUgYWxsb2NhdGlvbiBjb3VsZCBiZSBzbGlnaHRseQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGxhcmdlciwgZS5nLiB0byBhY2NvdW50IGZvciBhbnkgc3lzdGVtLXJlcXVpcmVkIGFsaWdubWVudCkKLSAgICAgKiBccGFyYW0gaGVpZ2h0ICAgICAgICAgIHRoZSBoZWlnaHQgb2YgcmVxdWVzdGVkIGFsbG9jYXRpb24gKHRoZSBhbGxvY2F0aW9uIGNvdWxkIGJlIHNsaWdodGx5Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgbGFyZ2VyLCBlLmcuIHRvIGFjY291bnQgZm9yIGFueSBzeXN0ZW0tcmVxdWlyZWQgYWxpZ25tZW50KQotICAgICAqIFxwYXJhbSBmb3JtYXQgICAgICAgICAgdGhlIHBpeGVsIGZvcm1hdCBvZiByZXF1ZXN0ZWQgYWxsb2NhdGlvbi4gVGhpcyBjb3VsZCBiZSBhIHZlbmRvcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljIGZvcm1hdC4KLSAgICAgKiBccGFyYW0gdXNhZ2UgICAgICAgICAgIHRoZSBtZW1vcnkgdXNhZ2UgaW5mbyBmb3IgdGhlIHJlcXVlc3RlZCBhbGxvY2F0aW9uLiBcbm90ZSB0aGF0IHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkIGFsbG9jYXRpb24gbWF5IGJlIGxhdGVyIHVzZWQvbWFwcGVkIHdpdGggZGlmZmVyZW50IHVzYWdlLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBhbGxvY2F0b3Igc2hvdWxkIGxheW91dCB0aGUgYnVmZmVyIHRvIGJlIG9wdGltaXplZCBmb3IgdGhpcyB1c2FnZSwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBidXQgbXVzdCBzdXBwb3J0IGFueSB1c2FnZS4gT25lIGV4Y2VwdGlvbjogcHJvdGVjdGVkIGJ1ZmZlcnMgY2FuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgb25seSBiZSB1c2VkIGluIGEgcHJvdGVjdGVkIHNjZW5hcmlvLgotICAgICAqIFxwYXJhbSBhbGxvY2F0aW9uICAgICAgcG9pbnRlciB0byB3aGVyZSB0aGUgYWxsb2NhdGlvbiBzaGFsbCBiZSBzdG9yZWQgb24gc3VjY2Vzcy4gbnVsbHB0cgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gZmFpbHVyZQotICAgICAqCi0gICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGFsbG9jYXRpb24gd2FzIHN1Y2Nlc3NmdWwKLSAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSB0aGUgYWxsb2NhdGlvbgotICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBhbGxvY2F0aW9uIHRpbWVkIG91dAotICAgICAqIFxyZXR2YWwgQzJfTk9fUEVSTUlTU0lPTiAgICAgbm8gcGVybWlzc2lvbiB0byBjb21wbGV0ZSB0aGUgYWxsb2NhdGlvbgotICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCBvciB1c2FnZSBhcmUgbm90IHN1cHBvcnRlZCAoaW52YWxpZCkgKGNhbGxlciBlcnJvcikKLSAgICAgKiBccmV0dmFsIEMyX1VOU1VQUE9SVEVEICAgICAgIHRoaXMgYWxsb2NhdG9yIGRvZXMgbm90IHN1cHBvcnQgMkQgYWxsb2NhdGlvbnMKLSAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJlZCBkdXJpbmcgYWxsb2NhdGlvbiAodW5leHBlY3RlZCkKLSAgICAgKi8KLSAgICB2aXJ0dWFsIEMyRXJyb3IgYWxsb2NhdGVHcmFwaGljQnVmZmVyKAotICAgICAgICAgICAgdWludDMyX3Qgd2lkdGggX191bnVzZWQsIHVpbnQzMl90IGhlaWdodCBfX3VudXNlZCwgdWludDMyX3QgZm9ybWF0IF9fdW51c2VkLAotICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSBfX3VudXNlZCwKLSAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbiAvKiBub25udWxsICovKSB7Ci0gICAgICAgICphbGxvY2F0aW9uID0gbnVsbHB0cjsKLSAgICAgICAgcmV0dXJuIEMyX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIChSZSljcmVhdGVzIGEgMkQgYWxsb2NhdGlvbiBmcm9tIGEgbmF0aXZlIGhhbmRsZS4gIElmIHN1Y2Nlc3NmdWwsIHRoZSBhbGxvY2F0aW9uIGlzIHN0b3JlZAotICAgICAqIGluIHxhbGxvY2F0aW9ufC4gT3RoZXJ3aXNlLCB8YWxsb2NhdGlvbnwgaXMgc2V0IHRvICdudWxscHRyJy4KLSAgICAgKgotICAgICAqIFxwYXJhbSBoYW5kbGUgICAgICB0aGUgaGFuZGxlIGZvciB0aGUgZXhpc3RpbmcgYWxsb2NhdGlvbgotICAgICAqIFxwYXJhbSBhbGxvY2F0aW9uICBwb2ludGVyIHRvIHdoZXJlIHRoZSBhbGxvY2F0aW9uIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyCi0gICAgICogICAgICAgICAgICAgICAgICB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIGZhaWx1cmUKLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBhbGxvY2F0aW9uIHdhcyByZWNyZWF0ZWQgc3VjY2Vzc2Z1bGx5Ci0gICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gcmVjcmVhdGUgdGhlIGFsbG9jYXRpb24KLSAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgcmVjcmVhdGlvbiB0aW1lZCBvdXQgKHVuZXhwZWN0ZWQpCi0gICAgICogXHJldHZhbCBDMl9OT19QRVJNSVNTSU9OICAgICBubyBwZXJtaXNzaW9uIHRvIHJlY3JlYXRlIHRoZSBhbGxvY2F0aW9uCi0gICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgaW52YWxpZCBoYW5kbGUgKGNhbGxlciBlcnJvcikKLSAgICAgKiBccmV0dmFsIEMyX1VOU1VQUE9SVEVEICAgICAgIHRoaXMgYWxsb2NhdG9yIGRvZXMgbm90IHN1cHBvcnQgMkQgYWxsb2NhdGlvbnMKLSAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJlZCBkdXJpbmcgcmVjcmVhdGlvbiAodW5leHBlY3RlZCkKLSAgICAgKi8KLSAgICB2aXJ0dWFsIEMyRXJyb3IgcmVjcmVhdGVHcmFwaGljQnVmZmVyKAotICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSBfX3VudXNlZCwKLSAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbiAvKiBub25udWxsICovKSB7Ci0gICAgICAgICphbGxvY2F0aW9uID0gbnVsbHB0cjsKLSAgICAgICAgcmV0dXJuIEMyX1VOU1VQUE9SVEVEOwotICAgIH0KLQotcHJvdGVjdGVkOgotICAgIEMyQWxsb2NhdG9yKCkgPSBkZWZhdWx0OwotCi0gICAgdmlydHVhbCB+QzJBbGxvY2F0b3IoKSA9IGRlZmF1bHQ7Ci19OwotCi0vKioKLSAqICBCbG9jayBhbGxvY2F0b3JzIGFyZSB1c2VkIGJ5IGNvbXBvbmVudHMgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBvdXRwdXQgYnVmZmVycy4gVGhleSBjYW4KLSAqICBzdXBwb3J0IGVpdGhlciBsaW5lYXIgKDFEKSwgY2lyY3VsYXIgKDFEKSBvciBncmFwaGljICgyRCkgYWxsb2NhdGlvbnMuCi0gKgotICogIE5ldmVyIGNvbnN0cnVjdGVkIG9uIHN0YWNrLgotICoKLSAqICBCbG9jayBhbGxvY2F0b3JzIGFyZSBwcm92aWRlZCBieSB0aGUgZnJhbWV3b3JrLgotICovCi1jbGFzcyBDMkJsb2NrQWxsb2NhdG9yIHsKLXB1YmxpYzoKLSAgICAvKioKLSAgICAgKiBBbGxvY2F0ZXMgYSBsaW5lYXIgd3JpdGVhYmxlIGJsb2NrIG9mIGdpdmVuIHxjYXBhY2l0eXwgYW5kIHx1c2FnZXwuIElmIHN1Y2Nlc3NmdWwsIHRoZQotICAgICAqIGJsb2NrIGlzIHN0b3JlZCBpbiB8YmxvY2t8LiBPdGhlcndpc2UsIHxibG9ja3wgaXMgc2V0IHRvICdudWxscHRyJy4KLSAgICAgKgotICAgICAqIFxwYXJhbSBjYXBhY2l0eSAgICAgICAgdGhlIHNpemUgb2YgcmVxdWVzdGVkIGJsb2NrLgotICAgICAqIFxwYXJhbSB1c2FnZSAgICAgICAgICAgdGhlIG1lbW9yeSB1c2FnZSBpbmZvIGZvciB0aGUgcmVxdWVzdGVkIGFsbG9jYXRpb24uIFxub3RlIHRoYXQgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgYWxsb2NhdGlvbiBtYXkgYmUgbGF0ZXIgdXNlZC9tYXBwZWQgd2l0aCBkaWZmZXJlbnQgdXNhZ2UuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgVGhlIGFsbG9jYXRvciBzaGFsbCBsYXkgb3V0IHRoZSBidWZmZXIgdG8gYmUgb3B0aW1pemVkIGZvciB0aGlzIHVzYWdlLAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGJ1dCBtdXN0IHN1cHBvcnQgYW55IHVzYWdlLiBPbmUgZXhjZXB0aW9uOiBwcm90ZWN0ZWQgYnVmZmVycyBjYW4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvbmx5IGJlIHVzZWQgaW4gYSBwcm90ZWN0ZWQgc2NlbmFyaW8uCi0gICAgICogXHBhcmFtIGJsb2NrICAgICAgcG9pbnRlciB0byB3aGVyZSB0aGUgYWxsb2NhdGVkIGJsb2NrIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCi0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgYWxsb2NhdGlvbiB3YXMgc3VjY2Vzc2Z1bAotICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSBhbGxvY2F0aW9uCi0gICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGFsbG9jYXRpb24gdGltZWQgb3V0Ci0gICAgICogXHJldHZhbCBDMl9OT19QRVJNSVNTSU9OICAgICBubyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIHRoZSBhbGxvY2F0aW9uCi0gICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgY2FwYWNpdHkgb3IgdXNhZ2UgYXJlIG5vdCBzdXBwb3J0ZWQgKGludmFsaWQpIChjYWxsZXIgZXJyb3IpCi0gICAgICogXHJldHZhbCBDMl9VTlNVUFBPUlRFRCAgICAgICB0aGlzIGFsbG9jYXRvciBkb2VzIG5vdCBzdXBwb3J0IGxpbmVhciBhbGxvY2F0aW9ucwotICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyBhbGxvY2F0aW9uICh1bmV4cGVjdGVkKQotICAgICAqLwotICAgIHZpcnR1YWwgQzJFcnJvciBhbGxvY2F0ZUxpbmVhckJsb2NrKAotICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHkgX191bnVzZWQsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgX191bnVzZWQsCi0gICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKLSAgICAgICAgKmJsb2NrID0gbnVsbHB0cjsKLSAgICAgICAgcmV0dXJuIEMyX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFsbG9jYXRlcyBhIGNpcmN1bGFyIHdyaXRlYWJsZSBibG9jayBvZiBnaXZlbiB8Y2FwYWNpdHl8IGFuZCB8dXNhZ2V8LiBJZiBzdWNjZXNzZnVsLCB0aGUKLSAgICAgKiBibG9jayBpcyBzdG9yZWQgaW4gfGJsb2NrfC4gT3RoZXJ3aXNlLCB8YmxvY2t8IGlzIHNldCB0byAnbnVsbHB0cicuCi0gICAgICoKLSAgICAgKiBccGFyYW0gY2FwYWNpdHkgICAgICAgIHRoZSBzaXplIG9mIHJlcXVlc3RlZCBjaXJjdWxhciBibG9jay4gKHRoZSBhbGxvY2F0aW9uIGNvdWxkIGJlIHNsaWdodGx5Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgbGFyZ2VyLCBlLmcuIHRvIGFjY291bnQgZm9yIGFueSBzeXN0ZW0tcmVxdWlyZWQgYWxpZ25tZW50KQotICAgICAqIFxwYXJhbSB1c2FnZSAgICAgICAgICAgdGhlIG1lbW9yeSB1c2FnZSBpbmZvIGZvciB0aGUgcmVxdWVzdGVkIGFsbG9jYXRpb24uIFxub3RlIHRoYXQgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgYWxsb2NhdGlvbiBtYXkgYmUgbGF0ZXIgdXNlZC9tYXBwZWQgd2l0aCBkaWZmZXJlbnQgdXNhZ2UuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgVGhlIGFsbG9jYXRvciBzaGFsbCBsYXkgb3V0IHRoZSBidWZmZXIgdG8gYmUgb3B0aW1pemVkIGZvciB0aGlzIHVzYWdlLAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGJ1dCBtdXN0IHN1cHBvcnQgYW55IHVzYWdlLiBPbmUgZXhjZXB0aW9uOiBwcm90ZWN0ZWQgYnVmZmVycyBjYW4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvbmx5IGJlIHVzZWQgaW4gYSBwcm90ZWN0ZWQgc2NlbmFyaW8uCi0gICAgICogXHBhcmFtIGJsb2NrICAgICAgcG9pbnRlciB0byB3aGVyZSB0aGUgYWxsb2NhdGVkIGJsb2NrIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCi0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgdGhlIGFsbG9jYXRpb24gd2FzIHN1Y2Nlc3NmdWwKLSAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSAgICAgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhlIGFsbG9jYXRpb24KLSAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCAgICAgdGhlIGFsbG9jYXRpb24gdGltZWQgb3V0Ci0gICAgICogXHJldHZhbCBDMl9OT19QRVJNSVNTSU9OICAgICBubyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIHRoZSBhbGxvY2F0aW9uCi0gICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgICAgIGNhcGFjaXR5IG9yIHVzYWdlIGFyZSBub3Qgc3VwcG9ydGVkIChpbnZhbGlkKSAoY2FsbGVyIGVycm9yKQotICAgICAqIFxyZXR2YWwgQzJfVU5TVVBQT1JURUQgICB0aGlzIGFsbG9jYXRvciBkb2VzIG5vdCBzdXBwb3J0IGNpcmN1bGFyIGFsbG9jYXRpb25zCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyBhbGxvY2F0aW9uICh1bmV4cGVjdGVkKQotICAgICAqLwotICAgIHZpcnR1YWwgQzJFcnJvciBhbGxvY2F0ZUNpcmN1bGFyQmxvY2soCi0gICAgICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSBfX3VudXNlZCwgQzJNZW1vcnlVc2FnZSB1c2FnZSBfX3VudXNlZCwKLSAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNpcmN1bGFyQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7Ci0gICAgICAgICpibG9jayA9IG51bGxwdHI7Ci0gICAgICAgIHJldHVybiBDMl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvY2F0ZXMgYSAyRCBncmFwaGljIGJsb2NrIG9mIGdpdmVuIHx3aWR0aHwsIHxoZWlnaHR8LCB8Zm9ybWF0fCBhbmQgfHVzYWdlfC4gSWYgc3VjY2Vzc2Z1bCwKLSAgICAgKiB0aGUgYWxsb2NhdGlvbiBpcyBzdG9yZWQgaW4gfGJsb2NrfC4gT3RoZXJ3aXNlLCB8YmxvY2t8IGlzIHNldCB0byAnbnVsbHB0cicuCi0gICAgICoKLSAgICAgKiBccGFyYW0gd2lkdGggICAgICAgICAgIHRoZSB3aWR0aCBvZiByZXF1ZXN0ZWQgYWxsb2NhdGlvbiAodGhlIGFsbG9jYXRpb24gY291bGQgYmUgc2xpZ2h0bHkKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBsYXJnZXIsIGUuZy4gdG8gYWNjb3VudCBmb3IgYW55IHN5c3RlbS1yZXF1aXJlZCBhbGlnbm1lbnQpCi0gICAgICogXHBhcmFtIGhlaWdodCAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHJlcXVlc3RlZCBhbGxvY2F0aW9uICh0aGUgYWxsb2NhdGlvbiBjb3VsZCBiZSBzbGlnaHRseQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGxhcmdlciwgZS5nLiB0byBhY2NvdW50IGZvciBhbnkgc3lzdGVtLXJlcXVpcmVkIGFsaWdubWVudCkKLSAgICAgKiBccGFyYW0gZm9ybWF0ICAgICAgICAgIHRoZSBwaXhlbCBmb3JtYXQgb2YgcmVxdWVzdGVkIGFsbG9jYXRpb24uIFRoaXMgY291bGQgYmUgYSB2ZW5kb3IKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpYyBmb3JtYXQuCi0gICAgICogXHBhcmFtIHVzYWdlICAgICAgICAgICB0aGUgbWVtb3J5IHVzYWdlIGluZm8gZm9yIHRoZSByZXF1ZXN0ZWQgYWxsb2NhdGlvbi4gXG5vdGUgdGhhdCB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCBhbGxvY2F0aW9uIG1heSBiZSBsYXRlciB1c2VkL21hcHBlZCB3aXRoIGRpZmZlcmVudCB1c2FnZS4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgYWxsb2NhdG9yIHNob3VsZCBsYXlvdXQgdGhlIGJ1ZmZlciB0byBiZSBvcHRpbWl6ZWQgZm9yIHRoaXMgdXNhZ2UsCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgYnV0IG11c3Qgc3VwcG9ydCBhbnkgdXNhZ2UuIE9uZSBleGNlcHRpb246IHByb3RlY3RlZCBidWZmZXJzIGNhbgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9ubHkgYmUgdXNlZCBpbiBhIHByb3RlY3RlZCBzY2VuYXJpby4KLSAgICAgKiBccGFyYW0gYmxvY2sgICAgICBwb2ludGVyIHRvIHdoZXJlIHRoZSBhbGxvY2F0aW9uIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCi0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgdGhlIGFsbG9jYXRpb24gd2FzIHN1Y2Nlc3NmdWwKLSAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSAgICAgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhlIGFsbG9jYXRpb24KLSAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCAgICAgdGhlIGFsbG9jYXRpb24gdGltZWQgb3V0Ci0gICAgICogXHJldHZhbCBDMl9OT19QRVJNSVNTSU9OICAgICBubyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIHRoZSBhbGxvY2F0aW9uCi0gICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCBvciB1c2FnZSBhcmUgbm90IHN1cHBvcnRlZCAoaW52YWxpZCkgKGNhbGxlciBlcnJvcikKLSAgICAgKiBccmV0dmFsIEMyX1VOU1VQUE9SVEVEICAgdGhpcyBhbGxvY2F0b3IgZG9lcyBub3Qgc3VwcG9ydCAyRCBhbGxvY2F0aW9ucwotICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEICAgICBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJlZCBkdXJpbmcgYWxsb2NhdGlvbiAodW5leHBlY3RlZCkKLSAgICAgKi8KLSAgICB2aXJ0dWFsIEMyRXJyb3IgYWxsb2NhdGVHcmFwaGljQmxvY2soCi0gICAgICAgICAgICB1aW50MzJfdCB3aWR0aCBfX3VudXNlZCwgdWludDMyX3QgaGVpZ2h0IF9fdW51c2VkLCB1aW50MzJfdCBmb3JtYXQgX191bnVzZWQsCi0gICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlIF9fdW51c2VkLAotICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgewotICAgICAgICAqYmxvY2sgPSBudWxscHRyOwotICAgICAgICByZXR1cm4gQzJfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgQzJCbG9ja0FsbG9jYXRvcigpID0gZGVmYXVsdDsKLQotICAgIHZpcnR1YWwgfkMyQmxvY2tBbGxvY2F0b3IoKSA9IGRlZmF1bHQ7Ci19OwotCi0vLy8gQH0KLQotLy8vIFxjb25kIElOVEVSTkFMCi0KLS8vLyBcdG9kbyBUaGVzZSBhcmUgbm8gbG9uZ2VyIHVzZWQKLQotLy8vIFxhZGR0b2dyb3VwIGxpbmVhcgotLy8vIEB7Ci0KLS8qKiBcZGVwcmVjYXRlZCAqLwotY2xhc3MgQzJMaW5lYXJCdWZmZXIKLSAgICA6IHB1YmxpYyBDMkJ1ZmZlciwgcHVibGljIF9DMkxpbmVhclJhbmdlQXNwZWN0LAotICAgICAgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8QzJMaW5lYXJCdWZmZXI+IHsKLXB1YmxpYzoKLSAgICAvKiogXHRvZG8gd2hhdCBpcyB0aGlzPyAqLwotICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUoKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICAgIGlubGluZSBDMkxpbmVhckJ1ZmZlcihjb25zdCBDMkNvbnN0TGluZWFyQmxvY2sgJmJsb2NrKTsKLQotcHJpdmF0ZToKLSAgICBjbGFzcyBJbXBsOwotICAgIEltcGwgKm1JbXBsOwotfTsKLQotY2xhc3MgQzJSZWFkQ3Vyc29yOwotCi1jbGFzcyBDMldyaXRlQ3Vyc29yIHsKLXB1YmxpYzoKLSAgICB1aW50MzJfdCByZW1haW5pbmcoKSBjb25zdDsgLy8gcmVtYWluaW5nIGRhdGEgdG8gYmUgcmVhZAotICAgIHZvaWQgY29tbWl0KCk7IC8vIGNvbW1pdHMgdGhlIGN1cnJlbnQgcG9zaXRpb24uIGRpc2NhcmQgZGF0YSBiZWZvcmUgY3VycmVudCBwb3NpdGlvbgotICAgIHZvaWQgcmVzZXQoKSBjb25zdDsgIC8vIHJlc2V0cyBwb3NpdGlvbiB0byB0aGUgbGFzdCBjb21taXR0ZWQgcG9zaXRpb24KLSAgICAvLyBzbGljZXMgb2ZmIGF0IG1vc3QgfHNpemV8IGJ5dGVzLCBhbmQgbW92ZXMgY3Vyc29yIGFoZWFkIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAgICAvLyBzbGljZWQgb2ZmLgotICAgIEMyUmVhZEN1cnNvciBzbGljZSh1aW50MzJfdCBzaXplKSBjb25zdDsKLSAgICAvLyBzbGljZXMgb2ZmIGF0IG1vc3QgfHNpemV8IGJ5dGVzLCBhbmQgbW92ZXMgY3Vyc29yIGFoZWFkIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAgICAvLyBzbGljZWQgb2ZmLgotICAgIEMyV3JpdGVDdXJzb3IgcmVzZXJ2ZSh1aW50MzJfdCBzaXplKTsKLSAgICAvLyBib29sIHJlYWQoVCYpOwotICAgIC8vIGJvb2wgd3JpdGUoVCYpOwotICAgIEMyRmVuY2Ugd2FpdEZvclNwYWNlKHVpbnQzMl90IHNpemUpOwotfTsKLQotLy8vIEB9Ci0KLS8vLyBcYWRkdG9ncm91cCBncmFwaGljCi0vLy8gQHsKLQotc3RydWN0IEMyQ29sb3JTcGFjZSB7Ci0vL3B1YmxpYzoKLSAgICBlbnVtIFN0YW5kYXJkIHsKLSAgICAgICAgQlQ2MDEsCi0gICAgICAgIEJUNzA5LAotICAgICAgICBCVDIwMjAsCi0gICAgICAgIC8vIFRPRE8KLSAgICB9OwotCi0gICAgZW51bSBSYW5nZSB7Ci0gICAgICAgIExJTUlURUQsCi0gICAgICAgIEZVTEwsCi0gICAgICAgIC8vIFRPRE8KLSAgICB9OwotCi0gICAgZW51bSBUcmFuc2ZlckZ1bmN0aW9uIHsKLSAgICAgICAgQlQ3MDlUcmFuc2ZlciwKLSAgICAgICAgQlQyMDIwVHJhbnNmZXIsCi0gICAgICAgIEh5YnJpZExvZ0dhbW1hMiwKLSAgICAgICAgSHlicmlkTG9nR2FtbWE0LAotICAgICAgICAvLyBUT0RPCi0gICAgfTsKLX07Ci0KLS8qKiBcZGVwcmVjYXRlZCAqLwotY2xhc3MgQzJHcmFwaGljQnVmZmVyIDogcHVibGljIEMyQnVmZmVyIHsKLXB1YmxpYzoKLSAgICAvLyBjb25zdGFudCBhdHRyaWJ1dGVzCi0gICAgaW5saW5lIHVpbnQzMl90IHdpZHRoKCkgY29uc3QgIHsgcmV0dXJuIG1XaWR0aDsgfQotICAgIGlubGluZSB1aW50MzJfdCBoZWlnaHQoKSBjb25zdCB7IHJldHVybiBtSGVpZ2h0OyB9Ci0gICAgaW5saW5lIHVpbnQzMl90IGZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1Gb3JtYXQ7IH0KLSAgICBpbmxpbmUgY29uc3QgQzJNZW1vcnlVc2FnZSB1c2FnZSgpIGNvbnN0IHsgcmV0dXJuIG1Vc2FnZTsgfQotCi0gICAgLy8gbW9kaWZpYWJsZSBhdHRyaWJ1dGVzCi0KLQotICAgIHZpcnR1YWwgY29uc3QgQzJDb2xvclNwYWNlIGNvbG9yU3BhY2UoKSBjb25zdCA9IDA7Ci0gICAgLy8gYmVzdCBlZmZvcnQKLSAgICB2aXJ0dWFsIHZvaWQgc2V0Q29sb3JTcGFjZV9iZShjb25zdCBDMkNvbG9yU3BhY2UgJmNvbG9yU3BhY2UpID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wgc2V0Q29sb3JTcGFjZShjb25zdCBDMkNvbG9yU3BhY2UgJmNvbG9yU3BhY2UpID0gMDsKLQotICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUoKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICAgIHVpbnQzMl90IG1XaWR0aDsKLSAgICB1aW50MzJfdCBtSGVpZ2h0OwotICAgIHVpbnQzMl90IG1Gb3JtYXQ7Ci0gICAgQzJNZW1vcnlVc2FnZSBtVXNhZ2U7Ci0KLSAgICBjbGFzcyBJbXBsOwotICAgIEltcGwgKm1JbXBsOwotfTsKLQotLy8vIEB9Ci0KLS8vLyBcZW5kY29uZAotCi0vLy8gQH0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBDMkJVRkZFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL2luY2x1ZGUvQzJDb21wb25lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9pbmNsdWRlL0MyQ29tcG9uZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZTkzMDIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL2luY2x1ZGUvQzJDb21wb25lbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBDMkNPTVBPTkVOVF9IXwotCi0jZGVmaW5lIEMyQ09NUE9ORU5UX0hfCi0KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLQotI2luY2x1ZGUgPEMyUGFyYW0uaD4KLSNpbmNsdWRlIDxDMldvcmsuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLy8gXGRlZmdyb3VwIGNvbXBvbmVudHMgQ29tcG9uZW50cwotLy8vIEB7Ci0KLWNsYXNzIEMyQ29tcG9uZW50OwotCi1jbGFzcyBDMkNvbXBvbmVudExpc3RlbmVyIHsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrRG9uZShzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtJdGVtcykgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkIG9uVHJpcHBlZChzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gc2V0dGluZ1Jlc3VsdCkgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkIG9uRXJyb3Ioc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGVycm9yQ29kZSkgPSAwOwotCi0gICAgLy8gdmlydHVhbCB2b2lkIG9uVHVubmVsUmVsZWFzZWQoPGZyb20+LCA8dG8+KSA9IDA7Ci0KLSAgICAvLyB2aXJ0dWFsIHZvaWQgb25Db21wb25lbnRSZWxlYXNlZCg8aWQ+KSA9IDA7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5DMkNvbXBvbmVudExpc3RlbmVyKCk7Ci19OwotCi0vKioKLSAqIENvbXBvbmVudCBpbnRlcmZhY2Ugb2JqZWN0LiBUaGlzIG9iamVjdCBjb250YWlucyBhbGwgb2YgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBwb3RlbnRpYWwgb3IKLSAqIGFjdHVhbCBjb21wb25lbnQuIEl0IGNhbiBiZSBjcmVhdGVkIGFuZCB1c2VkIGluZGVwZW5kZW50bHkgb2YgYW4gYWN0dWFsIEMyQ29tcG9uZW50IGluc3RhbmNlIHRvCi0gKiBxdWVyeSBzdXBwb3J0IGFuZCBwYXJhbWV0ZXJzIGZvciB2YXJpb3VzIGNvbXBvbmVudCBzZXR0aW5ncyBhbmQgY29uZmlndXJhdGlvbnMgZm9yIGEgcG90ZW50aWFsCi0gKiBjb21wb25lbnQuIEFjdHVhbCBjb21wb25lbnRzIGFsc28gZXhwb3NlIHRoaXMgaW50ZXJmYWNlLgotICovCi0KLWNsYXNzIEMyQ29tcG9uZW50SW50ZXJmYWNlIHsKLXB1YmxpYzoKLSAgICAvLyBBTFdBWVMgQVZBSUxBQkxFIE1FVEhPRFMKLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBjb21wb25lbnQgb3IgY29tcG9uZW50IGludGVyZmFjZSBvYmplY3QuCi0gICAgICogVGhpcyBpcyBhIHVuaXF1ZSBuYW1lIGZvciB0aGlzIGNvbXBvbmVudCBvciBjb21wb25lbnQgaW50ZXJmYWNlICdjbGFzcyc7IGhvd2V2ZXIsIG11bHRpcGxlCi0gICAgICogaW5zdGFuY2VzIG9mIHRoaXMgY29tcG9uZW50IFNIQUxMIGhhdmUgdGhlIHNhbWUgbmFtZS4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBzdGF0ZS4gVGhpcyBjYWxsIGRvZXMgbm90IGNoYW5nZSB0aGUgc3RhdGUgbm9yIHRoZQotICAgICAqIGludGVybmFsIHN0YXRlcyBvZiB0aGUgY29tcG9uZW50LgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCi0gICAgICoKLSAgICAgKiBccmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgY29tcG9uZW50IG9yIGNvbXBvbmVudCBpbnRlcmZhY2Ugb2JqZWN0LgotICAgICAqIFxyZXR2YWwgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUgYWN0dWFsIG5hbWUuCi0gICAgICovCi0gICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3QgPSAwOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHVuaXF1ZSBJRCBmb3IgdGhpcyBjb21wb25lbnQgb3IgaW50ZXJmYWNlIG9iamVjdC4KLSAgICAgKiBUaGlzIElEIGlzIHVzZWQgYXMgd29yayB0YXJnZXRzLCB1bmlxdWUgd29yayBJRHMsIGFuZCB3aGVuIGNvbmZpZ3VyaW5nIHR1bm5lbGluZy4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBzdGF0ZS4gVGhpcyBjYWxsIGRvZXMgbm90IGNoYW5nZSB0aGUgc3RhdGUgbm9yIHRoZQotICAgICAqIGludGVybmFsIHN0YXRlcyBvZiB0aGUgY29tcG9uZW50LgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCi0gICAgICoKLSAgICAgKiBccmV0dXJuIGEgdW5pcXVlIG5vZGUgSUQgZm9yIHRoaXMgY29tcG9uZW50IG9yIGNvbXBvbmVudCBpbnRlcmZhY2UgaW5zdGFuY2UuCi0gICAgICovCi0gICAgdmlydHVhbCBub2RlX2lkIGdldElkKCkgY29uc3QgPSAwOwotCi0gICAgLyoqCi0gICAgICogUXVlcmllcyBhIHNldCBvZiBwYXJhbWV0ZXJzIGZyb20gdGhlIGNvbXBvbmVudCBvciBpbnRlcmZhY2Ugb2JqZWN0LgotICAgICAqIFF1ZXJ5aW5nIGlzIHBlcmZvcm1lZCBhdCBiZXN0IGVmZm9ydDogdGhlIGNvbXBvbmVudCBTSEFMTCBxdWVyeSBhbGwgc3VwcG9ydGVkIHBhcmFtZXRlcnMgYW5kCi0gICAgICogc2tpcCB1bnN1cHBvcnRlZCBvbmVzLCBvciBoZWFwIGFsbG9jYXRlZCBwYXJhbWV0ZXJzIHRoYXQgY291bGQgbm90IGJlIGFsbG9jYXRlZC4gQW55IGVycm9ycwotICAgICAqIGFyZSBjb21tdW5pY2F0ZWQgaW4gdGhlIHJldHVybiB2YWx1ZS4gQWRkaXRpb25hbGx5LCBwcmVhbGxvY2F0ZWQgKGUuZy4gc3RhY2spIHBhcmFtZXRlcnMgdGhhdAotICAgICAqIGNvdWxkIG5vdCBiZSBxdWVyaWVkIGFyZSBpbnZhbGlkYXRlZC4gUGFyYW1ldGVycyB0byBiZSBhbGxvY2F0ZWQgb24gdGhlIGhlYXAgYXJlIG9taXR0ZWQgZnJvbQotICAgICAqIHRoZSByZXN1bHQuCi0gICAgICoKLSAgICAgKiBcbm90ZSBQYXJhbWV0ZXIgdmFsdWVzIGRvIG5vdCBkZXBlbmQgb24gdGhlIG9yZGVyIG9mIHF1ZXJ5LgotICAgICAqCi0gICAgICogXHRvZG8gVGhpcyBtZXRob2QgY2Fubm90IGJlIHVzZWQgdG8gcXVlcnkgaW5mby1idWZmZXJzLiBJcyB0aGF0IGEgcHJvYmxlbT8KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBzdGF0ZS4gVGhpcyBjYWxsIGRvZXMgbm90IGNoYW5nZSB0aGUgc3RhdGUgbm9yIHRoZQotICAgICAqIGludGVybmFsIHN0YXRlcyBvZiB0aGUgY29tcG9uZW50LgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCi0gICAgICoKLSAgICAgKiBccGFyYW1baW4sb3V0XSBzdGFja1BhcmFtcyAgIGEgbGlzdCBvZiBwYXJhbXMgcXVlcmllZC4gVGhlc2UgYXJlIGluaXRpYWxpemVkIHNwZWNpZmljIHRvIGVhY2gKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nOyBlLmcuIHNpemUgYW5kIGluZGV4IGFyZSBzZXQgYW5kIHJlc3Qgb2YgdGhlIG1lbWJlcnMgYXJlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgY2xlYXJlZC4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBcbm90ZSBGbGV4aWJsZSBzZXR0aW5ncyB0aGF0IGFyZSBvZiBpbmNvcnJlY3Qgc2l6ZSB3aWxsIGJlIGludmFsaWRhdGVkLgotICAgICAqIFxwYXJhbVtpbl0gaGVhcFBhcmFtSW5kaWNlcyBhIHZlY3RvciBvZiBwYXJhbSBpbmRpY2VzIGZvciBwYXJhbXMgdG8gYmUgcXVlcmllZCBhbmQgcmV0dXJuZWQgb24gdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgaGVhcC4gVGhlc2UgcGFyYW1ldGVycyB3aWxsIGJlIHJldHVybmVkIGluIGhlYXBQYXJhbXMuIFVuc3VwcG9ydGVkIHBhcmFtCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgaW5kaWNlcyB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICogXHBhcmFtW291dF0gaGVhcFBhcmFtcyAgICBhIGxpc3Qgb2YgcGFyYW1zIHdoZXJlIHRvIHdoaWNoIHRoZSBzdXBwb3J0ZWQgaGVhcCBwYXJhbWV0ZXJzIHdpbGwgYmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gaGVhcFBhcmFtSW5kaWNlcy4KLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIGFsbCBwYXJhbWV0ZXJzIGNvdWxkIGJlIHF1ZXJpZWQKLSAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCBhbGwgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgYmUgcXVlcmllZCwgYnV0IHNvbWUgcGFyYW1ldGVycyB3ZXJlIG5vdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZAotICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIGNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGEgc3VwcG9ydGVkIHBhcmFtZXRlcgotICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHF1ZXJ5aW5nIG9mIHRoZSBwYXJhbWV0ZXJzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgKHVuZXhwZWN0ZWQpCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeV9uYigKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSogY29uc3Q+ICZzdGFja1BhcmFtcywKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSBjb25zdCA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgc2V0IG9mIHBhcmFtZXRlcnMgZm9yIHRoZSBjb21wb25lbnQgb3IgaW50ZXJmYWNlIG9iamVjdC4KLSAgICAgKiBUdW5pbmcgaXMgcGVyZm9ybWVkIGF0IGJlc3QgZWZmb3J0OiB0aGUgY29tcG9uZW50IFNIQUxMIHVwZGF0ZSBhbGwgc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb24gYXQKLSAgICAgKiBiZXN0IGVmZm9ydCAodW5sZXNzIGNvbmZpZ3VyZWQgb3RoZXJ3aXNlKSBhbmQgc2tpcCB1bnN1cHBvcnRlZCBvbmVzLiBBbnkgZXJyb3JzIGFyZQotICAgICAqIGNvbW11bmljYXRlZCBpbiB0aGUgcmV0dXJuIHZhbHVlIGFuZCBpbiB8ZmFpbHVyZXN8LgotICAgICAqCi0gICAgICogXG5vdGUgUGFyYW1ldGVyIHR1bmluZyBET0VTIGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgdGhlIHR1bmluZyBwYXJhbWV0ZXJzLiBFLmcuIHNvbWUgcGFyYW1ldGVyCi0gICAgICogdXBkYXRlIG1heSBhbGxvdyBzb21lIHN1YnNlcXVlbnQgcGFyYW1ldGVyIHVwZGF0ZS4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBzdGF0ZS4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgotICAgICAqCi0gICAgICogXHBhcmFtW2luLG91dF0gcGFyYW1zICAgICAgICAgIGEgbGlzdCBvZiBwYXJhbWV0ZXIgdXBkYXRlcy4gVGhlc2Ugd2lsbCBiZSB1cGRhdGVkIHRvIHRoZSBhY3R1YWwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgdmFsdWVzIGFmdGVyIHRoZSB1cGRhdGVzICh0aGlzIGlzIGJlY2F1c2UgdHVuaW5nIGlzIHBlcmZvcm1lZAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGF0IGJlc3QgZWZmb3J0KS4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBcdG9kbyBwYXJhbXMgdGhhdCBjb3VsZCBub3QgYmUgdXBkYXRlZCBhcmUgbm90IG1hcmtlZCBoZXJlLCBzbyBhcmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjb25mdXNpbmcgLSBhcmUgdGhleSAiZXhpc3RpbmciIHZhbHVlcyBvciBpbnRlbmRlZCB0byBiZSBjb25maWd1cmVkCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPwotICAgICAqIFxwYXJhbVtvdXRdIGZhaWx1cmVzICAgICAgICBhIGxpc3Qgb2YgcGFyYW1ldGVyIGZhaWx1cmVzCi0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICBhbGwgcGFyYW1ldGVycyBjb3VsZCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseQotICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIGFsbCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSwgYnV0IHNvbWUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIHdlcmUgbm90IHN1cHBvcnRlZAotICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHNvbWUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgbm90IGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IGJlY2F1c2UKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGV5IGNvbnRhaW5lZCB1bnN1cHBvcnRlZCB2YWx1ZXMuIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB8ZmFpbHVyZXN8LgotICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIHNvbWUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgbm90IGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IGJlY2F1c2UKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGV5IGNvbnRhaW5lZCB1bnN1cHBvcnRlZCB2YWx1ZXMsIGJ1dCBjb3VsZCBub3QgYWxsb2NhdGUgYSBmYWlsdXJlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IGZvciB0aGVtLgotICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHVwZGF0ZSBvZiB0aGUgcGFyYW1ldGVycwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQotICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlnX25iKAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSogY29uc3Q+ICZwYXJhbXMsCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBBdG9taWNhbGx5IHNldHMgYSBzZXQgb2YgcGFyYW1ldGVycyBmb3IgdGhlIGNvbXBvbmVudCBvciBpbnRlcmZhY2Ugb2JqZWN0LgotICAgICAqCi0gICAgICogXG5vdGUgVGhpcyBtZXRob2QgaXMgdXNlZCBtYWlubHkgZm9yIHJlc2VydmluZyByZXNvdXJjZXMgZm9yIGEgY29tcG9uZW50LgotICAgICAqCi0gICAgICogVGhlIGNvbXBvbmVudCBTSEFMTCB1cGRhdGUgYWxsIHN1cHBvcnRlZCBjb25maWd1cmF0aW9uIGF0Ci0gICAgICogYmVzdCBlZmZvcnQoVEJEKSAodW5sZXNzIGNvbmZpZ3VyZWQgb3RoZXJ3aXNlKSBhbmQgc2tpcCB1bnN1cHBvcnRlZCBvbmVzLiBBbnkgZXJyb3JzIGFyZQotICAgICAqIGNvbW11bmljYXRlZCBpbiB0aGUgcmV0dXJuIHZhbHVlIGFuZCBpbiB8ZmFpbHVyZXN8LgotICAgICAqCi0gICAgICogXG5vdGUgUGFyYW1ldGVyIHR1bmluZyBET0VTIGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgdGhlIHR1bmluZyBwYXJhbWV0ZXJzLiBFLmcuIHNvbWUgcGFyYW1ldGVyCi0gICAgICogdXBkYXRlIG1heSBhbGxvdyBzb21lIHN1YnNlcXVlbnQgcGFyYW1ldGVyIHVwZGF0ZS4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBzdGF0ZS4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCi0gICAgICoKLSAgICAgKiBccGFyYW0gcGFyYW1zW2luLG91dF0gICAgICAgICAgYSBsaXN0IG9mIHBhcmFtZXRlciB1cGRhdGVzLiBUaGVzZSB3aWxsIGJlIHVwZGF0ZWQgdG8gdGhlIGFjdHVhbAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciB2YWx1ZXMgYWZ0ZXIgdGhlIHVwZGF0ZXMgKHRoaXMgaXMgYmVjYXVzZSB0dW5pbmcgaXMgcGVyZm9ybWVkCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgYXQgYmVzdCBlZmZvcnQpLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIFx0b2RvIHBhcmFtcyB0aGF0IGNvdWxkIG5vdCBiZSB1cGRhdGVkIGFyZSBub3QgbWFya2VkIGhlcmUsIHNvIGFyZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNvbmZ1c2luZyAtIGFyZSB0aGV5ICJleGlzdGluZyIgdmFsdWVzIG9yIGludGVuZGVkIHRvIGJlIGNvbmZpZ3VyZWQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM/Ci0gICAgICogXHBhcmFtIGZhaWx1cmVzW291dF0gICAgICAgIGEgbGlzdCBvZiBwYXJhbWV0ZXIgZmFpbHVyZXMKLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIGFsbCBwYXJhbWV0ZXJzIGNvdWxkIGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5Ci0gICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggYWxsIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGNvdWxkIGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LCBidXQgc29tZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgd2VyZSBub3Qgc3VwcG9ydGVkCi0gICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgc29tZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBub3QgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkgYmVjYXVzZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZXkgY29udGFpbmVkIHVuc3VwcG9ydGVkIHZhbHVlcy4gVGhlc2UgYXJlIHJldHVybmVkIGluIHxmYWlsdXJlc3wuCi0gICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgc29tZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBub3QgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkgYmVjYXVzZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZXkgY29udGFpbmVkIHVuc3VwcG9ydGVkIHZhbHVlcywgYnV0IGNvdWxkIG5vdCBhbGxvY2F0ZSBhIGZhaWx1cmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgZm9yIHRoZW0uCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgdXBkYXRlIG9mIHRoZSBwYXJhbWV0ZXJzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgKHVuZXhwZWN0ZWQpCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb21taXRfc20oCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKiBjb25zdD4gJnBhcmFtcywKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpID0gMDsKLQotICAgIC8vIFRVTk5FTElORwotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHR1bm5lbCBmcm9tIHRoaXMgY29tcG9uZW50IHRvIHRoZSB0YXJnZXQgY29tcG9uZW50LgotICAgICAqCi0gICAgICogSWYgdGhlIGNvbXBvbmVudCBpcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCwgc3Vic2VxdWVudCB3b3JrIGl0ZW1zIHF1ZXVlZCBtYXkgaW5jbHVkZSBhCi0gICAgICogdHVubmVsZWQgcGF0aCBiZXR3ZWVuIHRoZXNlIGNvbXBvbmVudHMuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbnkgc3RhdGUuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgbW9tZW50YXJpbHkgYmxvY2tpbmcsIGJ1dCBNVVNUIHJldHVybiB3aXRoaW4gNW1zLgotICAgICAqCi0gICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIHR1bm5lbCB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQKLSAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCB0aGUgdGFyZ2V0IGNvbXBvbmVudCBkb2VzIG5vdCBleGlzdAotICAgICAqIFxyZXR2YWwgQzJfQUxSRUFEWV9FWElTVCB0aGUgdHVubmVsIGFscmVhZHkgZXhpc3RzCi0gICAgICogXHJldHZhbCBDMl9VTlNVUFBPUlRFRCAgdGhlIHR1bm5lbCBpcyBub3Qgc3VwcG9ydGVkCi0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgY3JlYXRlIHRoZSB0dW5uZWwgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQotICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIGNyZWF0aW9uIG9mIHRoZSB0dW5uZWwgKHVuZXhwZWN0ZWQpCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVUdW5uZWxfc20obm9kZV9pZCB0YXJnZXRDb21wb25lbnQpID0gMDsKLQotICAgIC8qKgotICAgICAqIFJlbGVhc2VzIGEgdHVubmVsIGZyb20gdGhpcyBjb21wb25lbnQgdG8gdGhlIHRhcmdldCBjb21wb25lbnQuCi0gICAgICoKLSAgICAgKiBUaGUgcmVsZWFzZSBvZiBhIHR1bm5lbCBpcyBkZWxheWVkIHdoaWxlIHRoZXJlIGFyZSBwZW5kaW5nIHdvcmsgaXRlbXMgZm9yIHRoZSB0dW5uZWwuCi0gICAgICogQWZ0ZXIgcmVsZWFzaW5nIGEgdHVubmVsLCBzdWJzZXF1ZW50IHdvcmsgaXRlbXMgcXVldWVkIE1VU1QgTk9UIGluY2x1ZGUgYSB0dW5uZWxlZAotICAgICAqIHBhdGggYmV0d2VlbiB0aGVzZSBjb21wb25lbnRzLgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IHN0YXRlLgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgTVVTVCByZXR1cm4gd2l0aGluIDVtcy4KLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSB0dW5uZWwgd2FzIG1hcmtlZCBmb3IgcmVsZWFzZSBzdWNjZXNzZnVsbHkKLSAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCB0aGUgdGFyZ2V0IGNvbXBvbmVudCBkb2VzIG5vdCBleGlzdAotICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIHRoZSB0dW5uZWwgZG9lcyBub3QgZXhpc3QKLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBtYXJrIHRoZSB0dW5uZWwgZm9yIHJlbGVhc2Ugd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQotICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHJlbGVhc2Ugb2YgdGhlIHR1bm5lbCAodW5leHBlY3RlZCkKLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VUdW5uZWxfc20obm9kZV9pZCB0YXJnZXRDb21wb25lbnQpID0gMDsKLQotCi0gICAgLy8gUkVGTEVDVElPTiBNRUNIQU5JU00gKFVTRUQgRk9SIEVYVEVOU0lPTikKLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBhcmFtZXRlciByZWZsZWN0b3IuCi0gICAgICoKLSAgICAgKiBUaGlzIGlzIHVzZWQgdG8gZGVzY3JpYmUgcGFyYW1ldGVyIGZpZWxkcy4KLSAgICAgKgotICAgICAqIFxyZXR1cm4gYSBzaGFyZWQgcGFyYW1ldGVyIHJlZmxlY3RvciBvYmplY3QuCi0gICAgICovCi0gICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gZ2V0UGFyYW1SZWZsZWN0b3IoKSBjb25zdCA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2Ygc3VwcG9ydGVkIHBhcmFtZXRlcnMuCi0gICAgICoKLSAgICAgKiBccGFyYW1bb3V0XSBwYXJhbXMgYSB2ZWN0b3Igb2Ygc3VwcG9ydGVkIHBhcmFtZXRlcnMgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGlzIHZlY3Rvci4KLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KLSAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSB0aGlzIG1ldGhvZC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cHBvcnRlZFBhcmFtcygKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICogY29uc3QgcGFyYW1zKSBjb25zdCA9IDA7Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIFx0b2RvIHNob3VsZCB0aGlzIHRha2UgYSBsaXN0IGNvbnNpZGVyaW5nIHRoYXQgc2V0dGluZyBzb21lIGZpZWxkcyBtYXkgZnVydGhlciBsaW1pdCBvdGhlcgotICAgICAqIGZpZWxkcyBpbiB0aGUgc2FtZSBsaXN0PwotICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkVmFsdWVzKAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgQzJQYXJhbUZpZWxkPiBmaWVsZHMsCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPiogY29uc3QgdmFsdWVzKSBjb25zdCA9IDA7Ci0KLSAgICB2aXJ0dWFsIH5DMkNvbXBvbmVudEludGVyZmFjZSgpID0gZGVmYXVsdDsKLX07Ci0KLWNsYXNzIEMyQ29tcG9uZW50IHsKLXB1YmxpYzoKLSAgICAvLyBNRVRIT0RTIEFWQUlMQUJMRSBXSEVOIFJVTk5JTkcKLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIC8qKgotICAgICAqIFF1ZXVlcyB1cCB3b3JrIGZvciB0aGUgY29tcG9uZW50LgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gcnVubmluZyAoaW5jbHVkaW5nIHRyaXBwZWQpIHN0YXRlcy4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zCi0gICAgICoKLSAgICAgKiBJdCBpcyBhY2NlcHRhYmxlIGZvciB0aGlzIG1ldGhvZCB0byByZXR1cm4gT0sgYW5kIHJldHVybiBhbiBlcnJvciB2YWx1ZSB1c2luZyB0aGUKLSAgICAgKiBvbldvcmtEb25lKCkgY2FsbGJhY2suCi0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgd29yayB3YXMgc3VjY2Vzc2Z1bGx5IHF1ZXVlZAotICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIHNvbWUgY29tcG9uZW50KHMpIGluIHRoZSB3b3JrIGRvKGVzKSBub3QgZXhpc3QKLSAgICAgKiBccmV0dmFsIEMyX1VOU1VQUE9SVEVEICB0aGUgY29tcG9uZW50cyBhcmUgbm90IHR1bm5lbGVkCi0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBxdWV1ZSB0aGUgd29yawotICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgcXVldWluZyB0aGUgd29yayAodW5leHBlY3RlZCkKLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXVlX25iKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGl0ZW1zKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBBbm5vdW5jZXMgYSB3b3JrIHRvIGJlIHF1ZXVlZCBsYXRlciBmb3IgdGhlIGNvbXBvbmVudC4gVGhpcyByZXNlcnZlcyBhIHNsb3QgZm9yIHRoZSBxdWV1ZQotICAgICAqIHRvIGVuc3VyZSBjb3JyZWN0IHdvcmsgb3JkZXJpbmcgZXZlbiBpZiB0aGUgd29yayBpcyBxdWV1ZWQgbGF0ZXIuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBydW5uaW5nIChpbmNsdWRpbmcgdHJpcHBlZCkgc3RhdGVzLgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxIG1zCi0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgd29yayBhbm5vdW5jZW1lbnQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJlY29yZGVkCi0gICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggc29tZSBjb21wb25lbnQocykgaW4gdGhlIHdvcmsgb3V0bGluZSBkbyhlcykgbm90IGV4aXN0Ci0gICAgICogXHJldHZhbCBDMl9VTlNVUFBPUlRFRCAgdGhlIGNvbXBvbmVudGVzIGFyZSBub3QgdHVubmVsZWQKLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlY29yZCB0aGUgd29yayBhbm5vdW5jZW1lbnQKLSAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHJlY29yZGluZyB0aGUgYW5ub3VuY2VtZW50ICh1bmV4cGVjdGVkKQotICAgICAqCi0gICAgICogXHRvZG8gQ2FuIHRoaXMgYmUgcm9sbGVkIGludG8gcXVldWVfbmI/Ci0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhbm5vdW5jZV9uYihjb25zdCBzdGQ6OnZlY3RvcjxDMldvcmtPdXRsaW5lPiAmaXRlbXMpID0gMDsKLQotICAgIC8qKgotICAgICAqIERpc2NhcmRzIGFuZCBhYmFuZG9ucyBhbnkgcGVuZGluZyB3b3JrIGZvciB0aGUgY29tcG9uZW50LCBhbmQgb3B0aW9uYWxseSBhbnkgY29tcG9uZW50Ci0gICAgICogZG93bnN0cmVhbS4KLSAgICAgKgotICAgICAqIFx0b2RvIGRlZmluZSB0aGlzOiB3ZSBjb3VsZCBmbHVzaCBhbGwgd29yayBiZWZvcmUgbGFzdCBpdGVtIHF1ZXVlZCBmb3IgY29tcG9uZW50IGFjcm9zcyBhbGwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cyBsaW5rZWQgdG8gdGhpczsgZmx1c2ggb25seSB3b3JrIGl0ZW1zIHRoYXQgYXJlIHF1ZXVlZCB0byB0aGlzCi0gICAgICogICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudAotICAgICAqIFx0b2RvIHJldHVybiB3b3JrICMgb2YgbGFzdCBmbHVzaGVkIGl0ZW07IG9yIGFsbCBmbHVzaGVkIChidXQgbm90IHJldHVybmVkIGl0ZW1zKQotICAgICAqIFx0b2RvIHdlIGNvdWxkIG1ha2UgZmx1c2ggdGFrZSBhIHdvcmsgaXRlbSBhbmQgZmx1c2ggYWxsIHdvcmsgYmVmb3JlL2FmdGVyIHRoYXQgaXRlbSB0byBhbGxvdwotICAgICAqICAgICAgIFRCRCAoc2xpY2luZy9zZWVrPykKLSAgICAgKiBcdG9kbyB3ZSBjb3VsZCBzaW1wbHkgdGFrZSBhIGxpc3Qgb2YgbnVtYmVycyBhbmQgZmx1c2ggdGhvc2UuLi4gdGhpcyBpcyBiYWQgZm9yIGRlY29kZXJzCi0gICAgICogICAgICAgYWxzbywgd2hhdCB3b3VsZCBoYXBwZW4gdG8gZmluZSBncmFkZSByZWZlcmVuY2VzPwotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gcnVubmluZyAoaW5jbHVkaW5nIHRyaXBwZWQpIHN0YXRlcy4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IG11c3QgcmV0dXJuIHdpdGhpbiA1bXMuCi0gICAgICoKLSAgICAgKiBXb3JrIHRoYXQgY291bGQgYmUgaW1tZWRpYXRlbHkgYWJhbmRvbmVkL2Rpc2NhcmRlZCBTSEFMTCBiZSByZXR1cm5lZCBpbiB8Zmx1c2hlZFdvcmt8OyB0aGlzCi0gICAgICogY2FuIGJlIGRvbmUgaW4gYW4gYXJiaXRyYXJ5IG9yZGVyLgotICAgICAqCi0gICAgICogV29yayB0aGF0IGNvdWxkIG5vdCBiZSBhYmFuZG9uZWQgb3IgZGlzY2FyZGVkIGltbWVkaWF0ZWx5IFNIQUxMIGJlIG1hcmtlZCB0byBiZQotICAgICAqIGRpc2NhcmRlZCBhdCB0aGUgZWFybGllc3Qgb3Bwb3J0dW5pdHksIGFuZCBTSEFMTCBiZSByZXR1cm5lZCB2aWEgdGhlIG9uV29ya0RvbmUoKSBjYWxsYmFjay4KLSAgICAgKgotICAgICAqIFxwYXJhbSBmbHVzaFRocm91Z2ggICAgZmx1c2ggd29yayBmcm9tIHRoaXMgY29tcG9uZW50IGFuZCBhbGwgY29tcG9uZW50cyBjb25uZWN0ZWQgZG93bnN0cmVhbQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGZyb20gaXQgdmlhIHR1bm5lbGluZy4KLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSB3b3JrIGFubm91bmNlbWVudCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcmVjb3JkZWQKLSAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgZmx1c2ggY291bGQgbm90IGJlIGNvbXBsZXRlZCB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBmbHVzaGluZyBmcm9tIGNvbXBsZXRpb24gKHVuZXhwZWN0ZWQpCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaF9zbShib29sIGZsdXNoVGhyb3VnaCwgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgZmx1c2hlZFdvcmspID0gMDsKLQotICAgIC8qKgotICAgICAqIERyYWlucyB0aGUgY29tcG9uZW50LCBhbmQgb3B0aW9uYWxseSBkb3duc3RyZWFtIGNvbXBvbmVudHMKLSAgICAgKgotICAgICAqIFx0b2RvIGRlZmluZSB0aGlzOyB3ZSBjb3VsZCBwbGFjZSBFT1MgdG8gYWxsIHVwc3RyZWFtIGNvbXBvbmVudHMsIGp1c3QgdGhpcyBjb21wb25lbnQsIG9yCi0gICAgICogICAgICAgYWxsIHVwc3RyZWFtIGFuZCBkb3duc3RyZWFtIGNvbXBvbmVudC4KLSAgICAgKiBcdG9kbyBzaG91bGQgRU9TIGNhcnJ5IG92ZXIgdG8gZG93bnN0cmVhbSBjb21wb25lbnRzPwotICAgICAqCi0gICAgICogTWFya3MgbGFzdCB3b3JrIGl0ZW0gYXMgImVuZC1vZi1zdHJlYW0iLCBzbyBjb21wb25lbnQgaXMgbm90aWZpZWQgbm90IHRvIHdhaXQgZm9yIGZ1cnRoZXIKLSAgICAgKiB3b3JrIGJlZm9yZSBpdCBwcm9jZXNzZXMgd29yayBhbHJlYWR5IHF1ZXVlZC4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIHNldCB0aGUgZW5kLW9mLXN0cmVhbQotICAgICAqIGZsYWcgYWZ0ZXIgd29yayBoYXMgYmVlbiBxdWV1ZWQuIENsaWVudCBjYW4gY29udGludWUgdG8gcXVldWUgZnVydGhlciB3b3JrIGltbWVkaWF0ZWx5IGFmdGVyCi0gICAgICogdGhpcyBtZXRob2QgcmV0dXJucy4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIHJ1bm5pbmcgKGluY2x1ZGluZyB0cmlwcGVkKSBzdGF0ZXMuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KLSAgICAgKgotICAgICAqIFdvcmsgdGhhdCBpcyBjb21wbGV0ZWQgU0hBTEwgYmUgcmV0dXJuZWQgdmlhIHRoZSBvbldvcmtEb25lKCkgY2FsbGJhY2suCi0gICAgICoKLSAgICAgKiBccGFyYW0gZHJhaW5UaHJvdWdoICAgIG1hcmtzIHRoZSBsYXN0IHdvcmsgaXRlbSB3aXRoIGEgcGVyc2lzdGVudCAiZW5kLW9mLXN0cmVhbSIgbWFya2VyIHRoYXQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3aWxsIGRyYWluIGRvd25zdHJlYW0gY29tcG9uZW50cy4KLSAgICAgKgotICAgICAqIFx0b2RvIHRoaXMgbWF5IGNvbmZ1c2Ugd29yay1vcmRlcmluZyBkb3duc3RyZWFtOyBjb3VsZCBiZSBhbiBtb2RlIGVudW0KLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSB3b3JrIGFubm91bmNlbWVudCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcmVjb3JkZWQKLSAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgZmx1c2ggY291bGQgbm90IGJlIGNvbXBsZXRlZCB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBmbHVzaGluZyBmcm9tIGNvbXBsZXRpb24gKHVuZXhwZWN0ZWQpCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkcmFpbl9uYihib29sIGRyYWluVGhyb3VnaCkgPSAwOwotCi0gICAgLy8gU1RBVEUgQ0hBTkdFIE1FVEhPRFMKLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0cyB0aGUgY29tcG9uZW50LgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gc3RvcHBlZCBzdGF0ZS4KLSAgICAgKgotICAgICAqIFx0b2RvIFRoaXMgbWV0aG9kIE1VU1QgcmV0dXJuIHdpdGhpbiA1MDBtcy4gU2VlbXMgdGhpcyBzaG91bGQgYmUgYWJsZSB0byByZXR1cm4gcXVpY2tseSwgYXMKLSAgICAgKiB0aGVyZSBhcmUgbm8gaW1tZWRpYXRlIGd1YXJhbnRlZXMuIFRob3VnaCB0aGVyZSBhcmUgZ3VhcmFudGVlcyBmb3IgcmVzcG9uc2l2ZW5lc3MgaW1tZWRpYXRlbHkKLSAgICAgKiBhZnRlciBzdGFydCByZXR1cm5zLgotICAgICAqCi0gICAgICogXHRvZG8gQ291bGQgd2UganVzdCBzdGFydCBhIENvbXBvbmVudEludGVyZmFjZSB0byBnZXQgYSBDb21wb25lbnQ/Ci0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgd29yayBhbm5vdW5jZW1lbnQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJlY29yZGVkCi0gICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gc3RhcnQgdGhlIGNvbXBvbmVudAotICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBjb21wb25lbnQgY291bGQgbm90IGJlIHN0YXJ0ZWQgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQotICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgc3RhcnRpbmcgdGhlIGNvbXBvbmVudCAodW5leHBlY3RlZCkKLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOwotCi0gICAgLyoqCi0gICAgICogU3RvcHMgdGhlIGNvbXBvbmVudC4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIHJ1bm5pbmcgKGluY2x1ZGluZyB0cmlwcGVkKSBzdGF0ZS4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0dXJuIHdpdGhpbmcgNTAwbXMuCi0gICAgICoKLSAgICAgKiBVcG9uIHRoaXMgY2FsbCwgYWxsIHBlbmRpbmcgd29yayBTSEFMTCBiZSBhYmFuZG9uZWQuCi0gICAgICoKLSAgICAgKiBcdG9kbyBzaG91bGQgdGhpcyByZXR1cm4gY29tcGxldGVkIHdvcmssIHNpbmNlIGNsaWVudCB3aWxsIGp1c3QgZnJlZSBpdD8gUGVyaGFwcyBqdXN0IHRvCi0gICAgICogdmVyaWZ5IGFjY291bnRpbmcuCi0gICAgICoKLSAgICAgKiBUaGlzIGRvZXMgbm90IGFsdGVyIGFueSBzZXR0aW5ncyBhbmQgdHVuaW5ncyB0aGF0IG1heSBoYXZlIHJlc3VsdGVkIGluIGEgdHJpcHBlZCBzdGF0ZS4KLSAgICAgKiAoSXMgdGhpcyBtYXRlcmlhbCBnaXZlbiB0aGUgZGVmaW5pdGlvbj8gUGVyaGFwcyBpbiBjYXNlIHdlIHdhbnQgdG8gc3RhcnQgYWdhaW4uKQotICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpID0gMDsKLQotICAgIC8qKgotICAgICAqIFJlc2V0cyB0aGUgY29tcG9uZW50LgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gcnVubmluZyAoaW5jbHVkaW5nIHRyaXBwZWQpIHN0YXRlLgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgZHVyaW5nIGFueSBvdGhlciBjYWxsIChcdG9kbyBvciBqdXN0IGJsb2NraW5nIG9uZXM/KQotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgTVVTVCByZXR1cm4gd2l0aGluZyA1MDBtcy4KLSAgICAgKgotICAgICAqIEFmdGVyIHRoaXMgY2FsbCByZXR1cm5zIGFsbCB3b3JrIGlzL211c3QgYmUgYWJhbmRvbmVkLCBhbGwgcmVmZXJlbmNlcyBzaG91bGQgYmUgcmVsZWFzZWQuCi0gICAgICoKLSAgICAgKiBcdG9kbyBzaG91bGQgdGhpcyByZXR1cm4gY29tcGxldGVkIHdvcmssIHNpbmNlIGNsaWVudCB3aWxsIGp1c3QgZnJlZSBpdD8gQWxzbywgaWYgaXQgdW5ibG9ja3MKLSAgICAgKiBhIHN0b3AsIHdoZXJlIHNob3VsZCBjb21wbGV0ZWQgd29yayBiZSByZXR1cm5lZD8KLSAgICAgKgotICAgICAqIFRoaXMgYnJpbmdzIHNldHRpbmdzIGJhY2sgdG8gdGhlaXIgZGVmYXVsdCAtICJndWFyYW50ZWVpbmciIG5vIHRyaXBwZWQgc3BhY2UuCi0gICAgICoKLSAgICAgKiBcdG9kbyByZWNsYWltIHN1cHBvcnQgLSBpdCBzZWVtcyB0aGF0IHNpbmNlIG93bmVyc2hpcCBpcyBwYXNzZWQsIHRoaXMgd2lsbCBhbGxvdyByZWNsYWltaW5nIHN0dWZmLgotICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCByZXNldCgpID0gMDsKLQotICAgIC8qKgotICAgICAqIFJlbGVhc2VzIHRoZSBjb21wb25lbnQuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbnkgc3RhdGUuIChcdG9kbyBPciBzaGFsbCB3ZSBmb3JjZSByZXNldCgpIGZpcnN0IHRvIGJyaW5nCi0gICAgICogdG8gYSBrbm93biBzdGF0ZT8pCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldHVybiB3aXRoaW5nIDUwMG1zLgotICAgICAqCi0gICAgICogXHRvZG8gc2hvdWxkIHRoaXMgcmV0dXJuIGNvbXBsZXRlZCB3b3JrLCBzaW5jZSBjbGllbnQgd2lsbCBqdXN0IGZyZWUgaXQ/IEFsc28sIGlmIGl0IHVuYmxvY2tzCi0gICAgICogYSBzdG9wLCB3aGVyZSBzaG91bGQgY29tcGxldGVkIHdvcmsgYmUgcmV0dXJuZWQ/Ci0gICAgICoKLSAgICAgKiBUT0RPOiBkb2VzIGl0IG1hdHRlciBpZiB0aGlzIGNhbGwgaGFzIGEgc2hvcnQgdGltZSBsaW1pdD8gWWVzLCBhcyB1cG9uIHJldHVybiBhbGwgcmVmZXJlbmNlcwotICAgICAqIHNoYWxsIGJlIGFiYW5kb25lZC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpID0gMDsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGludGVyZmFjZSBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAgICoKLSAgICAgKiBccmV0dXJuIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlCi0gICAgICovCi0gICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYoKSA9IDA7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5DMkNvbXBvbmVudCgpID0gZGVmYXVsdDsKLX07Ci0KLWNsYXNzIEMyRnJhbWVJbmZvUGFyc2VyIHsKLXB1YmxpYzoKLSAgICAvKioKLSAgICAgKiBccmV0dXJuIHRoZSBjb250ZW50IHR5cGUgc3VwcG9ydGVkIGJ5IHRoaXMgaW5mbyBwYXJzZXIuCi0gICAgICoKLSAgICAgKiBcdG9kbyB0aGlzIG1heSBiZSByZWR1bmRhbnQKLSAgICAgKi8KLSAgICB2aXJ0dWFsIEMyU3RyaW5nTGl0ZXJhbCBnZXRUeXBlKCkgY29uc3QgPSAwOwotCi0gICAgLyoqCi0gICAgICogXHJldHVybiBhIHZlY3RvciBvZiBzdXBwb3J0ZWQgcGFyYW1ldGVyIGluZGljZXMgcGFyc2VkIGJ5IHRoaXMgaW5mbyBwYXJzZXIuCi0gICAgICoKLSAgICAgKiBcdG9kbyBzdGlja3kgdnMuIG5vbi1zdGlja3kgcGFyYW1zPyB0aGlzIG1heSBiZSBjb21tdW5pY2F0ZWQgYnkgcGFyYW0tcmVmbGVjdG9yLgotICAgICAqLwotICAgIHZpcnR1YWwgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGdldFBhcnNlZFBhcmFtcygpIGNvbnN0ID0gMDsKLQotICAgIC8qKgotICAgICAqIFJlc2V0cyB0aGlzIGluZm8gcGFyc2VyLiBUaGlzIGJyaW5ncyB0aGlzIHBhcnNlciB0byBpdHMgaW5pdGlhbCBzdGF0ZSBhZnRlciBjcmVhdGlvbi4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIFNIQUxMIHJldHVybiB3aXRoaW4gNW1zLgotICAgICAqCi0gICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGluZm8gcGFyc2VyIHdhcyByZXNldAotICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCByZXNldCB0aGUgcGFyc2VyIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKLSAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSByZXNldHRpbmcgb2YgdGhlIHBhcnNlciAodW5leHBlY3RlZCkKLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlc2V0KCkgeyByZXR1cm4gQzJfT0s7IH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcGFyc2VGcmFtZShDMkJ1ZmZlclBhY2sgJmZyYW1lKTsKLQotICAgIHZpcnR1YWwgfkMyRnJhbWVJbmZvUGFyc2VyKCkgPSBkZWZhdWx0OwotfTsKLQotc3RydWN0IEMyQ29tcG9uZW50SW5mbyB7Ci0gICAgLy8gVEJECi0KLX07Ci0KLWNsYXNzIEMyQWxsb2NhdG9yU3RvcmUgewotcHVibGljOgotICAgIC8vIFRCRAotCi0gICAgZW51bSBUeXBlIHsKLSAgICAgICAgTElORUFSLCAgICAgLy8vPCBiYXNpYyBsaW5lYXIgYWxsb2NhdG9yIHR5cGUKLSAgICAgICAgR1JBTExPQywgICAgLy8vPCBiYXNpYyBncmFsbG9jIGFsbG9jYXRvciB0eXBlCi0gICAgfTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gYWxsb2NhdG9yLgotICAgICAqCi0gICAgICogXHBhcmFtIHR5cGUgICAgICB0aGUgdHlwZSBvZiBhbGxvY2F0b3IgdG8gY3JlYXRlCi0gICAgICogXHBhcmFtIGFsbG9jYXRvciBzaGFyZWQgcG9pbnRlciB3aGVyZSB0aGUgY3JlYXRlZCBhbGxvY2F0b3IgaXMgc3RvcmVkLiBDbGVhcmVkIG9uIGZhaWx1cmUKLSAgICAgKiAgICAgICAgICAgICAgICAgIGFuZCB1cGRhdGVkIG9uIHN1Y2Nlc3MuCi0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgYWxsb2NhdG9yIHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseQotICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBjcmVhdGUgdGhlIGFsbG9jYXRvciB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgY3JlYXRpb24gb2YgdGhlIGFsbG9jYXRvciAodW5leHBlY3RlZCkKLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIG5vIHN1Y2ggYWxsb2NhdG9yCi0gICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIHRoZSBhbGxvY2F0b3IKLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUFsbG9jYXRvcihUeXBlIHR5cGUsIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4qIGNvbnN0IGFsbG9jYXRvcikgPSAwOwotCi0gICAgdmlydHVhbCB+QzJBbGxvY2F0b3JTdG9yZSgpID0gZGVmYXVsdDsKLX07Ci0KLWNsYXNzIEMyQ29tcG9uZW50U3RvcmUgewotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBjb21wb25lbnQuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBTSEFMTCByZXR1cm4gd2l0aGluIDEwMG1zLgotICAgICAqCi0gICAgICogXHBhcmFtIG5hbWUgICAgICAgICAgbmFtZSBvZiB0aGUgY29tcG9uZW50IHRvIGNyZWF0ZQotICAgICAqIFxwYXJhbSBjb21wb25lbnQgICAgIHNoYXJlZCBwb2ludGVyIHdoZXJlIHRoZSBjcmVhdGVkIGNvbXBvbmVudCBpcyBzdG9yZWQuIENsZWFyZWQgb24KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlIGFuZCB1cGRhdGVkIG9uIHN1Y2Nlc3MuCi0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseQotICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBjcmVhdGUgdGhlIGNvbXBvbmVudCB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgY3JlYXRpb24gb2YgdGhlIGNvbXBvbmVudCAodW5leHBlY3RlZCkKLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIG5vIHN1Y2ggY29tcG9uZW50Ci0gICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIHRoZSBjb21wb25lbnQKLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUNvbXBvbmVudChDMlN0cmluZyBuYW1lLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGNvbXBvbmVudCBpbnRlcmZhY2UuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBTSEFMTCByZXR1cm4gd2l0aGluIDEwMG1zLgotICAgICAqCi0gICAgICogXHBhcmFtIG5hbWUgICAgICAgICAgbmFtZSBvZiB0aGUgY29tcG9uZW50IGludGVyZmFjZSB0byBjcmVhdGUKLSAgICAgKiBccGFyYW0gaW50ZXJmYWNlICAgICBzaGFyZWQgcG9pbnRlciB3aGVyZSB0aGUgY3JlYXRlZCBpbnRlcmZhY2UgaXMgc3RvcmVkCi0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IGludGVyZmFjZSB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkKLSAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgY3JlYXRlIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlIHdpdGhpbiB0aGUgdGltZSBsaW1pdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQotICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIGNyZWF0aW9uIG9mIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgKHVuZXhwZWN0ZWQpCi0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCBubyBzdWNoIGNvbXBvbmVudCBpbnRlcmZhY2UKLSAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2UKLSAgICAgKgotICAgICAqIFx0b2RvIERvIHdlIG5lZWQgYW4gaW50ZXJmYWNlLCBvciBjb3VsZCB0aGlzIGp1c3QgYmUgYSBjb21wb25lbnQgdGhhdCBpcyBuZXZlciBzdGFydGVkPwotICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKEMyU3RyaW5nIG5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGNvbXBvbmVudHMgc3VwcG9ydGVkIGJ5IHRoaXMgY29tcG9uZW50IHN0b3JlLgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiAxbXMuCi0gICAgICoKLSAgICAgKiBccmV0dmFsIHZlY3RvciBvZiBjb21wb25lbnQgaW5mb3JtYXRpb24uCi0gICAgICovCi0gICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJDb21wb25lbnRJbmZvPj4gZ2V0Q29tcG9uZW50cygpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVRJTElUWSBNRVRIT0RTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyBvbi1kZW1hbmQgYnVmZmVyIGxheW91dCBjb252ZXJzaW9uIChzd2l6emxpbmcpCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb3B5QnVmZmVyKHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+IHNyYywgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gZHN0KTsKLQotICAgIC8vIHN0YXR1c190IHNlbGVjdFByZWZlcnJlZENvbG9yKGZvcm1hdHM8QT4sIGZvcm1hdHM8Qj4pOwotCi0gICAgLy8gR0xPQkFMIFNFVFRJTkdTCi0gICAgLy8gc3lzdGVtLXdpZGUgc3RyaWRlICYgc2xpY2UtaGVpZ2h0ICg/Pz8pCi0KLSAgICAvKioKLSAgICAgKiBRdWVyaWVzIGEgc2V0IG9mIHN5c3RlbS13aWRlIHBhcmFtZXRlcnMuCi0gICAgICogUXVlcnlpbmcgaXMgcGVyZm9ybWVkIGF0IGJlc3QgZWZmb3J0OiB0aGUgc3RvcmUgU0hBTEwgcXVlcnkgYWxsIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGFuZAotICAgICAqIHNraXAgdW5zdXBwb3J0ZWQgb25lcywgb3IgaGVhcCBhbGxvY2F0ZWQgcGFyYW1ldGVycyB0aGF0IGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuIEFueSBlcnJvcnMKLSAgICAgKiBhcmUgY29tbXVuaWNhdGVkIGluIHRoZSByZXR1cm4gdmFsdWUuIEFkZGl0aW9uYWxseSwgcHJlYWxsb2NhdGVkIChlLmcuIHN0YWNrKSBwYXJhbWV0ZXJzIHRoYXQKLSAgICAgKiBjb3VsZCBub3QgYmUgcXVlcmllZCBhcmUgaW52YWxpZGF0ZWQuIFBhcmFtZXRlcnMgdG8gYmUgYWxsb2NhdGVkIG9uIHRoZSBoZWFwIGFyZSBvbWl0dGVkIGZyb20KLSAgICAgKiB0aGUgcmVzdWx0LgotICAgICAqCi0gICAgICogXG5vdGUgUGFyYW1ldGVyIHZhbHVlcyBkbyBub3QgZGVwZW5kIG9uIHRoZSBvcmRlciBvZiBxdWVyeS4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgotICAgICAqCi0gICAgICogXHBhcmFtIHN0YWNrUGFyYW1zICAgICBhIGxpc3Qgb2YgcGFyYW1zIHF1ZXJpZWQuIFRoZXNlIGFyZSBpbml0aWFsaXplZCBzcGVjaWZpYyB0byBlYWNoCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgc2V0dGluZzsgZS5nLiBzaXplIGFuZCBpbmRleCBhcmUgc2V0IGFuZCByZXN0IG9mIHRoZSBtZW1iZXJzIGFyZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNsZWFyZWQuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgTk9URTogRmxleGlibGUgc2V0dGluZ3MgdGhhdCBhcmUgb2YgaW5jb3JyZWN0IHNpemUgd2lsbCBiZSBpbnZhbGlkYXRlZC4KLSAgICAgKiBccGFyYW0gaGVhcFBhcmFtSW5kaWNlcyBhIHZlY3RvciBvZiBwYXJhbSBpbmRpY2VzIGZvciBwYXJhbXMgdG8gYmUgcXVlcmllZCBhbmQgcmV0dXJuZWQgb24gdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgaGVhcC4gVGhlc2UgcGFyYW1ldGVycyB3aWxsIGJlIHJldHVybmVkIGluIGhlYXBQYXJhbXMuIFVuc3VwcG9ydGVkIHBhcmFtCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgaW5kaWNlcyB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICogXHBhcmFtIGhlYXBQYXJhbXMgICAgICBhIGxpc3Qgb2YgcGFyYW1zIHdoZXJlIHRvIHdoaWNoIHRoZSBzdXBwb3J0ZWQgaGVhcCBwYXJhbWV0ZXJzIHdpbGwgYmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gaGVhcFBhcmFtSW5kaWNlcy4KLSAgICAgKgotICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIGFsbCBwYXJhbWV0ZXJzIGNvdWxkIGJlIHF1ZXJpZWQKLSAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCBhbGwgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgYmUgcXVlcmllZCwgYnV0IHNvbWUgcGFyYW1ldGVycyB3ZXJlIG5vdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZAotICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIGNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGEgc3VwcG9ydGVkIHBhcmFtZXRlcgotICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHF1ZXJ5aW5nIG9mIHRoZSBwYXJhbWV0ZXJzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgKHVuZXhwZWN0ZWQpCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeV9uYigKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSogY29uc3Q+ICZzdGFja1BhcmFtcywKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgc2V0IG9mIHN5c3RlbS13aWRlIHBhcmFtZXRlcnMuCi0gICAgICoKLSAgICAgKiBcbm90ZSBUaGVyZSBhcmUgbm8gc2V0dGFibGUgc3lzdGVtLXdpZGUgcGFyYW1ldGVycyBkZWZpbmVkIHRodXMgZmFyLCBidXQgbWF5IGJlIGFkZGVkIGluIHRoZQotICAgICAqIGZ1dHVyZS4KLSAgICAgKgotICAgICAqIFR1bmluZyBpcyBwZXJmb3JtZWQgYXQgYmVzdCBlZmZvcnQ6IHRoZSBzdG9yZSBTSEFMTCB1cGRhdGUgYWxsIHN1cHBvcnRlZCBjb25maWd1cmF0aW9uIGF0Ci0gICAgICogYmVzdCBlZmZvcnQgKHVubGVzcyBjb25maWd1cmVkIG90aGVyd2lzZSkgYW5kIHNraXAgdW5zdXBwb3J0ZWQgb25lcy4gQW55IGVycm9ycyBhcmUKLSAgICAgKiBjb21tdW5pY2F0ZWQgaW4gdGhlIHJldHVybiB2YWx1ZSBhbmQgaW4gfGZhaWx1cmVzfC4KLSAgICAgKgotICAgICAqIFxub3RlIFBhcmFtZXRlciB0dW5pbmcgRE9FUyBkZXBlbmQgb24gdGhlIG9yZGVyIG9mIHRoZSB0dW5pbmcgcGFyYW1ldGVycy4gRS5nLiBzb21lIHBhcmFtZXRlcgotICAgICAqIHVwZGF0ZSBtYXkgYWxsb3cgc29tZSBzdWJzZXF1ZW50IHBhcmFtZXRlciB1cGRhdGUuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KLSAgICAgKgotICAgICAqIFxwYXJhbSBwYXJhbXMgICAgICAgICAgYSBsaXN0IG9mIHBhcmFtZXRlciB1cGRhdGVzLiBUaGVzZSB3aWxsIGJlIHVwZGF0ZWQgdG8gdGhlIGFjdHVhbAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciB2YWx1ZXMgYWZ0ZXIgdGhlIHVwZGF0ZXMgKHRoaXMgaXMgYmVjYXVzZSB0dW5pbmcgaXMgcGVyZm9ybWVkCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgYXQgYmVzdCBlZmZvcnQpLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIFx0b2RvIHBhcmFtcyB0aGF0IGNvdWxkIG5vdCBiZSB1cGRhdGVkIGFyZSBub3QgbWFya2VkIGhlcmUsIHNvIGFyZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNvbmZ1c2luZyAtIGFyZSB0aGV5ICJleGlzdGluZyIgdmFsdWVzIG9yIGludGVuZGVkIHRvIGJlIGNvbmZpZ3VyZWQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM/Ci0gICAgICogXHBhcmFtIGZhaWx1cmVzICAgICAgICBhIGxpc3Qgb2YgcGFyYW1ldGVyIGZhaWx1cmVzCi0gICAgICoKLSAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICBhbGwgcGFyYW1ldGVycyBjb3VsZCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseQotICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIGFsbCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSwgYnV0IHNvbWUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIHdlcmUgbm90IHN1cHBvcnRlZAotICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHNvbWUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgbm90IGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IGJlY2F1c2UKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGV5IGNvbnRhaW5lZCB1bnN1cHBvcnRlZCB2YWx1ZXMuIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB8ZmFpbHVyZXN8LgotICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIHNvbWUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgY291bGQgbm90IGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IGJlY2F1c2UKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGV5IGNvbnRhaW5lZCB1bnN1cHBvcnRlZCB2YWx1ZXMsIGJ1dCBjb3VsZCBub3QgYWxsb2NhdGUgYSBmYWlsdXJlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IGZvciB0aGVtLgotICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHVwZGF0ZSBvZiB0aGUgcGFyYW1ldGVycwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQotICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlnX25iKAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSogY29uc3Q+ICZwYXJhbXMsCi0gICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgPSAwOwotCi0gICAgdmlydHVhbCB+QzJDb21wb25lbnRTdG9yZSgpID0gZGVmYXVsdDsKLX07Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vLy8gQH0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBDMkNPTVBPTkVOVF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL2luY2x1ZGUvQzJDb25maWcuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9pbmNsdWRlL0MyQ29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZTkxOTMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL2luY2x1ZGUvQzJDb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBDMkNPTkZJR19IXwotI2RlZmluZSBDMkNPTkZJR19IXwotCi0jaW5jbHVkZSA8QzJQYXJhbURlZi5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vLyBcZGVmZ3JvdXAgY29uZmlnIENvbXBvbmVudCBjb25maWd1cmF0aW9uCi0vLy8gQHsKLQotI2lmbmRlZiBERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUgotI2RlZmluZSBERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUihuYW1lLCB0eXBlLCBwcmVmaXgsIC4uLikKLSNkZWZpbmUgREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihuYW1lLCB0eXBlLCBuYW1lcywgLi4uKQotI2VuZGlmCi0KLSNkZWZpbmUgQzJFTlVNKG5hbWUsIHR5cGUsIC4uLikgXAotZW51bSBuYW1lIDogdHlwZSB7IF9fVkFfQVJHU19fIH07IFwKLURFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSKG5hbWUsIHR5cGUsIE5VTEwsIF9fVkFfQVJHU19fKQotCi0jZGVmaW5lIEMyRU5VTV9DVVNUT01fUFJFRklYKG5hbWUsIHR5cGUsIHByZWZpeCwgLi4uKSBcCi1lbnVtIG5hbWUgOiB0eXBlIHsgX19WQV9BUkdTX18gfTsgXAotREVGSU5FX0MyX0VOVU1fVkFMVUVfQVVUT19IRUxQRVIobmFtZSwgdHlwZSwgcHJlZml4LCBfX1ZBX0FSR1NfXykKLQotI2RlZmluZSBDMkVOVU1fQ1VTVE9NX05BTUVTKG5hbWUsIHR5cGUsIG5hbWVzLCAuLi4pIFwKLWVudW0gbmFtZSA6IHR5cGUgeyBfX1ZBX0FSR1NfXyB9OyBcCi1ERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSKG5hbWUsIHR5cGUsIG5hbWVzLCBfX1ZBX0FSR1NfXykKLQotZW51bSBDMlBhcmFtSW5kZXhLaW5kIDogdWludDMyX3QgewotICAgIC8vLyBkb21haW4KLSAgICBrUGFyYW1JbmRleERvbWFpbiwKLQotICAgIC8vLyBjb25maWd1cmF0aW9uIGRlc2NyaXB0b3JzCi0gICAga1BhcmFtSW5kZXhTdXBwb3J0ZWRQYXJhbXMsCi0gICAga1BhcmFtSW5kZXhSZXF1aXJlZFBhcmFtcywKLSAgICBrUGFyYW1JbmRleFJlYWRPbmx5UGFyYW1zLAotICAgIGtQYXJhbUluZGV4UmVxdWVzdGVkSW5mb3MsCi0KLSAgICAvLy8gbGF0ZW5jeQotICAgIGtQYXJhbUluZGV4TGF0ZW5jeSwKLQotICAgIC8vIGdlbmVyaWMgdGltZSBiZWhhdmlvcgotICAgIGtQYXJhbUluZGV4VGVtcG9yYWwsCi0KLSAgICAvLy8gcG9ydCBjb25maWd1cmF0aW9uCi0gICAga1BhcmFtSW5kZXhNaW1lLAotICAgIGtQYXJhbUluZGV4U3RyZWFtQ291bnQsCi0gICAga1BhcmFtSW5kZXhGb3JtYXQsCi0KLSAgICAvLyB2aWRlbyBpbmZvCi0KLSAgICBrUGFyYW1JbmRleFN0cnVjdFN0YXJ0ID0gMHgxLAotICAgIGtQYXJhbUluZGV4VmlkZW9TaXplLAotICAgIGtQYXJhbUluZGV4TWF4VmlkZW9TaXplSGludCwKLQotICAgIGtQYXJhbUluZGV4UGFyYW1TdGFydCA9IDB4ODAwLAotfTsKLQotQzJFTlVNKEMyRG9tYWluS2luZCwgaW50MzJfdCwKLSAgICBDMkRvbWFpblZpZGVvLAotICAgIEMyRG9tYWluQXVkaW8sCi0gICAgQzJEb21haW5PdGhlciA9IEMyRG9tYWluQXVkaW8gKyAxCi0pOwotCi0vLyByZWFkLW9ubHkKLQotdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkRvbWFpbktpbmQ+LCBrUGFyYW1JbmRleERvbWFpbj4gQzJDb21wb25lbnREb21haW5JbmZvOwotLy8gdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhEb21haW4+IEMyQ29tcG9uZW50RG9tYWluSW5mbzsKLS8vREVTQ1JJQkVfVEVNUExBVEVEX0MyU1RSVUNUKEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJEb21haW5LaW5kPiwgeyBDMkZJRUxEKG1WYWx1ZSwgInZhbHVlIikgfSk7Ci0KLS8vIHJlYWQtb25seQotdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJVaW50MzJBcnJheSwga1BhcmFtSW5kZXhTdXBwb3J0ZWRQYXJhbXM+IEMyU3VwcG9ydGVkUGFyYW1zSW5mbzsKLQotLy8vIFx0b2RvIGRvIHdlIGRlZmluZSBpdCBhcyBhIHBhcmFtPwotLy8gcmVhZC1vbmx5Ci10eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlVpbnQzMkFycmF5LCBrUGFyYW1JbmRleFJlcXVpcmVkUGFyYW1zPiBDMlJlcXVpcmVkUGFyYW1zSW5mbzsKLQotLy8gcmVhZC1vbmx5Ci10eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlVpbnQzMkFycmF5LCBrUGFyYW1JbmRleFJlYWRPbmx5UGFyYW1zPiBDMlJlYWRPbmx5UGFyYW1zSW5mbzsKLQotLy8gcmVhZC1vbmx5Ci10eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlVpbnQzMkFycmF5LCBrUGFyYW1JbmRleFJlcXVlc3RlZEluZm9zPiBDMlJlcXVlc3RlZEluZm9zSW5mbzsKLQotLy8gcmVhZC1vbmx5Ci0vL3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4UmVxdWVzdGVkSW5mb3M+IEMyUmVxdWVzdGVkSW5mb3NJbmZvOwotCi0vLy8gbGF0ZW5jeQotCi10eXBlZGVmIEMyUG9ydFBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhMYXRlbmN5PiBDMlBvcnRMYXRlbmN5SW5mbzsKLQotdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhMYXRlbmN5PiBDMkNvbXBvbmVudExhdGVuY3lJbmZvOwotCi0vLy8gXHRvZG8KLXR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4VGVtcG9yYWw+IEMyQ29tcG9uZW50VGVtcG9yYWxJbmZvOwotCi0vLy8gcG9ydCBjb25maWd1cmF0aW9uCi0KLXR5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyU3RyaW5nVmFsdWUsIGtQYXJhbUluZGV4TWltZT4gQzJQb3J0TWltZUNvbmZpZzsKLQotdHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhTdHJlYW1Db3VudD4gQzJQb3J0U3RyZWFtQ291bnRDb25maWc7Ci0KLXR5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJTdHJpbmdWYWx1ZSwga1BhcmFtSW5kZXhNaW1lPiBDMlN0cmVhbU1pbWVDb25maWc7Ci0KLUMyRU5VTShDMkZvcm1hdEtpbmQsIHVpbnQzMl90LAotICAgIEMyRm9ybWF0Q29tcHJlc3NlZCwKLSAgICBDMkZvcm1hdEF1ZGlvID0gMSwKLSAgICBDMkZvcm1hdFZpZGVvID0gNCwKLSkKLQotdHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleEZvcm1hdD4gQzJTdHJlYW1Gb3JtYXRDb25maWc7Ci0KLS8qCi0gICBDb21wb25lbnQgZGVzY3JpcHRpb24gZmllbGRzOgotCi0vLyBmb3JtYXQgKHZpZGVvL2NvbXByZXNzZWQvYXVkaW8vb3RoZXItZG8gd2UgbmVlZCBvdGhlcj8pIHBlciBzdHJlYW0KLQotLy8gbGlrZWx5IHNvbWUgb2YgdGhlc2UgYXJlIGV4cG9zZWQgYXMgc2VwYXJhdGUgc2V0dGluZ3M6Ci0KLXN0cnVjdCBDMkJhc2VUdW5pbmcgewotICAgIC8vIGxhdGVuY3kgY2hhcmFjdGVyaXN0aWNzCi0gICAgdWludDMyX3QgbGF0ZW5jeTsKLSAgICBib29sIHRlbXBvcmFsOyAgICAgICAgICAgICAgIC8vIHNlZW1zIHRoaXMgb25seSBtYWtlcyBzZW5zZSBpZiBsYXRlbmN5IGlzIDEuLi4sIHNvIHRoaXMgY291bGQgYmUgY2FwdHVyZWQgYXMgbGF0ZW5jeSA9IDAKLSAgICB1aW50MzJfdCBkZWxheTsKLQotICAgIHVpbnQzMl90IG51bUlucHV0U3RyZWFtczsgICAgLy8gUlc/IC0gb3Igc3VnZ2VzdGlvbiBvbmx5OiBSTwotICAgIHVpbnQzMl90IG51bU91dHB1dFN0cmVhbXM7ICAgLy8gUlcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi0gICAgLy8gcmVmcyBjaGFyYWN0ZXJpc3RpY3MgKHBlciBzdHJlYW0/KQotICAgIHVpbnQzMl90IG1heElucHV0UmVmczsgICAgICAgLy8gUk8KLSAgICB1aW50MzJfdCBtYXhPdXRwdXRSZWZzOyAgICAgIC8vIFJPCi0gICAgdWludDMyX3QgbWF4SW5wdXRNZW1vcnk7ICAgICAvLyBSTyAtIG1heCB0aW1lIHJlZnMgYXJlIGhlbGQgZm9yCi0gICAgdWludDMyX3QgbWF4T3V0cHV0TWVtb3J5OyAgICAvLyBSTwotCi0gICAgLy8gcGVyIHN0cmVhbQotICAgIGJvb2wgY29tcHJlc3NlZDsKLSAgICAvLyBmb3JtYXQuLi4gdmlkZW8vY29tcHJlc3NlZC9hdWRpby9vdGhlcj8KLSAgICAvLyBhY3R1YWwgImF1ZGlvL3ZpZGVvIiBmb3JtYXQgdHlwZQotICAgIHVpbnQzMl90IHdpZHRoL2hlaWdodD8gaXMgdGhpcyBuZWVkZWQsIG9yIGp1c3QgcXVldWUuLi4KLSAgICAvLyBtaW1lLi4uCi19OwotKi8KLQotCi0KLQotCi0KLS8vIG92ZXJhbGwgY29tcG9uZW50Ci0vLyAgID0+IEM6IGRvbWFpbjogYXVkaW8gb3IgdmlkZW8KLS8vICAgPT4gQzoga2luZDogZGVjb2RlciwgZW5jb2RlciBvciBmaWx0ZXIKLS8vICAgPT4gIm1pbWUiIGNsYXNzCi0KLS8vICAgPT4gQzogdGVtcG9yYWwgKGJvb2wpID0+IGRvZXMgdGhpcyBkZXBlbmQgb24gb3JkZXJpbmc/Ci0vLyAgID0+IEk6IGxhdGVuY3kKLS8vICAgPT4gSTogaGlzdG9yeSBtYXggZHVyYXRpb24uLi4KLS8vICAgPT4gSTogaGlzdG9yeSBtYXggZnJhbWVzIGtlcHQuLi4KLS8vICAgPT4gSTogcmVvcmRlcmluZyBkZXB0aAotLy8gICA9PiBJOiBmcmMgKGJvb2wpIChwZXJoYXBzIHJhdGlvPykKLS8vICAgPT4gSTogY3VycmVudCBmcmMKLQotLy8gICAtIHBhdXNlCi0vLyAgID0+IGxhc3QgZnJhbWUgJ251bWJlcicgcHJvY2Vzc2VkCi0vLyAgID0+IGN1cnJlbnQgZnJhbWUgJ251bWJlcicgcHJvY2Vzc2VkCi0vLyAgID0+IGludmFsaWQgc2V0dGluZ3MgPT5bXQotCi0vLyB2aWRlbyBkZWNvZGVyIGNvbmZpZ3VyYXRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXVkaW8KLS8vICAgLSBlbmNvZGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAtZW5jb2RpbmcKLS8vICAgLSBoaW50OiBtYXggd2lkdGgvaGVpZ2h0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAtaGludDogc2FtcGxlIHJhdGUsIGNoYW5uZWxzCi0vLyAgIC0gaGludDogcHJvZmlsZS9sZXZlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLWhpbnQ6IHRvb2xzIHVzZWQKLS8vICAgLSBoaW50OiBmcmFtZXJhdGUgKGJpdHJhdGU/KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAtaGludDogYml0cmF0ZQotLy8gICAtIGRlZmF1bHQ6IGNvbG9yIHNwYWNlIChmcm9tIGNvbnRhaW5lcikKLS8vICAgLSBoaW50OiBjb2xvciBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAtaGludDogcGNtLWVuY29kaW5nCi0vLyAgIC0gaGludDogIyBvZiB2aWV3cyAoZS5nLiBNVkMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLWhpbnQ/OiBjaGFubmVsIGdyb3VwcwotLy8gICAtIGRlZmF1bHQ6IEhEUiBzdGF0aWMgaW5mbyAoZnJvbSBjb250YWluZXIpICAgICAgICAgICAgICAgIC8vIC1oaW50PzogY2hhbm5lbCBtYXBwaW5ncwotLy8gICAtIGhpbnQ6IHJvdGF0aW9uIChlLmcuIGZvciBhbGxvY2F0b3IpCi0KLS8vID0+ICMgb2Ygc3RyZWFtcyByZXF1aXJlZCBhbmQgdGhlaXIgZm9ybWF0cz8gKHNldHRpbmc/KQotLy8gPT4gIyBvZiBzdHJlYW1zIHByb2R1Y2VkIGFuZCB0aGVpciBmb3JtYXRzPyAodHVuaW5nKQotCi0vLyA9PiBvdXRwdXQKLS8vICAgLSAjIG9mIHZpZXdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAtY2hhbm5lbCBncm91cHMgJiYgY2hhbm5lbCBtYXBwaW5ncwotLy8gICAtIHdpZHRoL2hlaWdodC9jcm9wL2NvbG9yIGZvcm1hdC9jb2xvciBzcGFjZS9IRFIgc3RhdGljIGluZm8gKGZyb20gYnVmZmVycykKLS8vICAgICAoYXMgcmVxdWlyZWQgYnkgdGhlIGFsbG9jYXRvciAmIGZyYW1ld29yaykKLS8vICAgLSBTRUkgKG9yIGVxdWl2YWxlbnQpIDw9IFtwb3J0XQotLy8gICAgIC0gQ0MKLS8vICAgLSByZWZlcmVuY2UgaW5mbwotCi0vLyB2aWRlbyBlbmNvZGVyIGNvbmZpZ3VyYXRpb25zCi0vLyAgIC0gZW5jb2RpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLSBlbmNvZGluZwotLy8gICAtIGhpbnQ6IHdpZHRoL2hlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0gaGludDogc2FtcGxlIHJhdGUsIGNoYW5uZWxzCi0vLyAgIC0gaGludDogZnJhbWUgcmF0ZQotLy8gICAtIGhpbnQ6IG1heCB3aWR0aC9oZWlnaHQgKD8gZG9lcyB0aGlzIGRpZmZlciBmcm9tIHdpZHRoL2hlaWdodD8pCi0vLyAgIC0gIyBvZiBpbnB1dCAoZS5nLiBNVkMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLSBoaW50OiAjIGdyb3VwcyBhbmQgbWFwcGluZ3MKLS8vICAgLSAjIG9mIG91dHB1dCAoZS5nLiBTVkMpID0+IGJpdHJhdGVzL3dpZHRoL2hlaWdodC9mcmFtZXJhdGVzPyBwZXIgc3RyZWFtCi0vLyAgIC0gaGludDogcHJvZmlsZS9sZXZlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLSBoaW50OiBwcm9maWxlL2xldmVsCi0vLyAgIC0gSERSIHN0YXRpYyBpbmZvICsgKGluZm86IEhEUikKLS8vICAgLSBjb2xvciBzcGFjZQotLy8gICAtIGhpbnQ6IGNvbG9yIGZvcm1hdD8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0gaGludDogcGNtIGVuY29kaW5nCi0vLyAgIC0gU0VJCi0vLyAgICAgLSBDQwotLy8gICAtIHJlZmVyZW5jZSBkaXJlY3RpdmUKLS8vICAgLSBoaW50OiBiaXRyYXRlIChvciBxdWFsaXR5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAtIGhpbnQ6IGJpdHJhdGUvcXVhbGl0eQotLy8gICAtIG9wdGlvbmFsOiBjb2RlYy1zcGVjaWZpYyBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgIC8vIC0gb3B0aW9uYWw6IGNzZAotCi0vLyA9PiBvdXRwdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPT4gb3V0cHV0Ci0vLyAgIC0gbGF5ZXJzIHBlciBzdHJlYW0/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRS1BQzM/Li4uIERUUz8uLi5Eb2xieS1WaXNpb24/Ci0vLyAgIC0gcmVmZXJlbmNlIGluZm8KLQotCi0vLyBSTToKLS8vICAgLSBuZWVkIFNQUyBmb3IgZnVsbCBrbm93bGVkZ2UgPT4gY29tcG9uZW50IHNob3VsZCByZXR1cm4gbWF4LiAoY29tcG9uZW50IGNhbiB1c2UgbGVzcykKLS8vICAgLSBjcml0aWNhbCBwYXJhbWV0ZXJzPyAoaW50ZXJsYWNlZD8gcHJvZmlsZT8gbGV2ZWw/KQotCi1zdHJ1Y3QgQzJWaWRlb1NpemVTdHJ1Y3QgewotICAgIGludDMyX3QgbVdpZHRoOyAgICAgLy8vPCB2aWRlbyB3aWR0aAotICAgIGludDMyX3QgbUhlaWdodDsgICAgLy8vPCB2aWRlbyBoZWlnaHQKLQotICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoVmlkZW9TaXplKQotICAgIEMyRklFTEQobVdpZHRoLCAid2lkdGgiKQotICAgIEMyRklFTEQobUhlaWdodCwgImhlaWdodCIpCi19OwotCi0vLyB2aWRlbyBzaXplIGZvciB2aWRlbyBkZWNvZGVyIFtPVVRdCi10eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlZpZGVvU2l6ZVN0cnVjdD4gQzJWaWRlb1NpemVTdHJlYW1JbmZvOwotCi0vLyBtYXggdmlkZW8gc2l6ZSBmb3IgdmlkZW8gZGVjb2RlciBbSU5dCi10eXBlZGVmIEMyUG9ydFBhcmFtPEMyU2V0dGluZywgQzJWaWRlb1NpemVTdHJ1Y3QsIGtQYXJhbUluZGV4TWF4VmlkZW9TaXplSGludD4gQzJNYXhWaWRlb1NpemVIaW50UG9ydFNldHRpbmc7Ci0KLS8vIHZpZGVvIGVuY29kZXIgc2l6ZSBbSU5dCi10eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyVmlkZW9TaXplU3RydWN0PiBDMlZpZGVvU2l6ZVN0cmVhbVR1bmluZzsKLQotLy8vIEB9Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvaW5jbHVkZS9DMlBhcmFtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvaW5jbHVkZS9DMlBhcmFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNDMwNjEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL2luY2x1ZGUvQzJQYXJhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBDMlBBUkFNX0hfCi0jZGVmaW5lIEMyUEFSQU1fSF8KLQotI2luY2x1ZGUgPEMyLmg+Ci0KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dHlwZV90cmFpdHM+Ci0KLSNkZWZpbmUgQzJfUEFDSyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vLyBcYWRkdG9ncm91cCBQYXJhbWV0ZXJzCi0vLy8gQHsKLQotLy8vIFxkZWZncm91cCBpbnRlcm5hbCBJbnRlcm5hbCBoZWxwZXJzLgotCi0vKiEKLSAqIFxmaWxlCi0gKiBQQVJBTUVURVJTOiBTRVRUSU5HcywgVFVOSU5HcywgYW5kIElORk9zCi0gKiA9PT0KLSAqCi0gKiBUaGVzZSByZXByZXNlbnQgbWlzY2VsbGFuZW91cyBjb250cm9sIGFuZCBtZXRhZGF0YSBpbmZvcm1hdGlvbiBhbmQgYXJlIGxpa2VseSBjb3BpZWQgaW50bwotICoga2VybmVsIHNwYWNlLiBUaGVyZWZvcmUsIHRoZXNlIGFyZSBDLWxpa2Ugc3RydWN0dXJlcyBkZXNpZ25lZCB0byBjYXJyeSBqdXN0IGEgc21hbGwgYW1vdW50IG9mCi0gKiBpbmZvcm1hdGlvbi4gV2UgYXJlIHVzaW5nIEMrKyB0byBiZSBhYmxlIHRvIGFkZCBjb25zdHJ1Y3RvcnMsIGFzIHdlbGwgYXMgbm9uLXZpcnR1YWwgYW5kIGNsYXNzCi0gKiBtZXRob2RzLgotICoKLSAqID09U3BlY2lmaWNhdGlvbiBkZXRhaWxzOgotICoKLSAqIFJlc3RyaWN0aW9uczoKLSAqICAgLSBtdXN0IGJlIFBPRCBzdHJ1Y3QsIGUuZy4gbm8gdnRhYmxlIChubyB2aXJ0dWFsIGRlc3RydWN0b3IpCi0gKiAgIC0gbXVzdCBoYXZlIHRoZSBzYW1lIHNpemUgaW4gNjQtYml0IGFuZCAzMi1iaXQgbW9kZSAobm8gc2l6ZV90KQotICogICAtIGFzIHN1Y2gsIG5vIHBvaW50ZXIgbWVtYmVycwotICoKLSAqIEJlaGF2aW9yOgotICogLSBQYXJhbXMgY2FuIGJlIGdsb2JhbCAobm90IHJlbGF0ZWQgdG8gaW5wdXQgb3Igb3V0cHV0KSwgcmVsYXRlZCB0byBpbnB1dCBvciBvdXRwdXQsCi0gKiAgIG9yIHJlbGF0ZWQgdG8gYW4gaW5wdXQvb3V0cHV0IHN0cmVhbS4KLSAqIC0gQWxsIHBhcmFtcyBhcmUgcXVlcmllZC9zZXQgdXNpbmcgYSB1bmlxdWUgcGFyYW0gaW5kZXgsIHdoaWNoIGluY29ycG9yYXRlcyBhIHBvdGVudGlhbCBzdHJlYW0KLSAqICAgaW5kZXggYW5kL29yIHBvcnQuCi0gKiAtIFF1ZXJ5aW5nIChzdXBwb3J0ZWQpIHBhcmFtcyBNVVNUIG5ldmVyIGZhaWwuCi0gKiAtIEFsbCBwYXJhbXMgTVVTVCBoYXZlIGRlZmF1bHQgdmFsdWVzLgotICogLSBJZiBzb21lIGZpZWxkcyBoYXZlICJ1bnN1cHBvcnRlZCIgb3IgImludmFsaWQiIHZhbHVlcyBkdXJpbmcgc2V0dGluZywgdGhpcyBTSE9VTEQgYmUKLSAqICAgY29tbXVuaWNhdGVkIHRvIHRoZSBhcHAuCi0gKiAgIGEpIElkZWFsbHksIHRoaXMgc2hvdWxkIGJlIGF2b2lkZWQuICBXaGVuIHNldHRpbmcgcGFyYW1ldGVycywgaW4gZ2VuZXJhbCwgY29tcG9uZW50IHNob3VsZCBkbwotICogICAgICJiZXN0IGVmZm9ydCIgdG8gYXBwbHkgYWxsIHNldHRpbmdzLiBJdCBzaG91bGQgY2hhbmdlICJpbnZhbGlkL3Vuc3VwcG9ydGVkIiB2YWx1ZXMgdG8gdGhlCi0gKiAgICAgbmVhcmVzdCBzdXBwb3J0ZWQgdmFsdWVzLgotICogICAtIFRoaXMgaXMgY29tbXVuaWNhdGVkIHRvIHRoZSBjbGllbnQgYnkgY2hhbmdpbmcgdGhlIHNvdXJjZSB2YWx1ZXMgaW4gdHVuZSgpLwotICogICAgIGNvbmZpZ3VyZSgpLgotICogICBiKSBJZiBmYWxsaW5nIGJhY2sgdG8gYSBzdXBwb3J0ZWQgdmFsdWUgaXMgYWJzb2x1dGVseSBpbXBvc3NpYmxlLCB0aGUgY29tcG9uZW50IFNIQUxMIHJldHVybgotICogICAgIGFuIGVycm9yIGZvciB0aGUgc3BlY2lmaWMgc2V0dGluZywgYnV0IHNob3VsZCBjb250aW51ZSB0byBhcHBseSBvdGhlciBzZXR0aW5ncy4KLSAqICAgICBUT0RPOiB0aGlzIGN1cnJlbnRseSBtYXkgcmVzdWx0IGluIHVuaW50ZW5kZWQgcmVzdWx0cy4KLSAqCi0gKiAqKk5PVEU6KiogdW5saWtlIE9NWCwgcGFyYW1zIGFyZSBub3QgdmVyc2lvbmVkLiBJbnN0ZWFkLCBhIG5ldyBzdHJ1Y3Qgd2l0aCBuZXcgYmFzZSBpbmRleAotICogU0hBTEwgYmUgYWRkZWQgYXMgbmV3IHZlcnNpb25zIGFyZSByZXF1aXJlZC4KLSAqCi0gKiBUaGUgcHJvcGVyIHN1YnR5cGUgKFNldHRpbmcsIEluZm8gb3IgUGFyYW0pIGlzIGluY29ycG9yYXRlZCBpbnRvIHRoZSBjbGFzcyB0eXBlLiBEZWZpbmUgc3RydWN0cwotICogdG8gZGVmaW5lIG11bHRpcGxlIHN1YnR5cGVkIHZlcnNpb25zIG9mIHJlbGF0ZWQgcGFyYW1ldGVycy4KLSAqCi0gKiA9PUltcGxlbWVudGF0aW9uIGRldGFpbHM6Ci0gKgotICogLSBVc2UgbWFjcm9zIHRvIGRlZmluZSBwYXJhbWV0ZXJzCi0gKiAtIEFsbCBwYXJhbWV0ZXJzIG11c3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IKLSAqICAgLSBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgaW5zdGFudGlhdGluZyB0aGUgY2xhc3MgaW4gc291cmNlIChlLmcuIHdpbGwgbm90IGJlIHVzZWQKLSAqICAgICB3aGVuIGJ1aWxkaW5nIGEgcGFyYW1ldGVyIGJ5IHRoZSBmcmFtZXdvcmsgZnJvbSBrZXkvdmFsdWUgcGFpcnMuKQotICovCi0KLS8vLyBcaW5ncm91cCBpbnRlcm5hbAotc3RydWN0IF9DMlBhcmFtTWFuaXB1bGF0b3I7Ci0KLS8qKgotICogUGFyYW1ldGVyIGJhc2UgY2xhc3MuCi0gKi8KLXN0cnVjdCBDMlBhcmFtIHsKLSAgICAvLyBwYXJhbSBpbmRleCBlbmNvbXBhc3NlcyB0aGUgZm9sbG93aW5nOgotICAgIC8vCi0gICAgLy8gLSB0eXBlIChzZXR0aW5nLCB0dW5pbmcsIGluZm8sIHN0cnVjdCkKLSAgICAvLyAtIHZlbmRvciBleHRlbnNpb24gZmxhZwotICAgIC8vIC0gZmxleGlibGUgcGFyYW1ldGVyIGZsYWcKLSAgICAvLyAtIGRpcmVjdGlvbiAoZ2xvYmFsLCBpbnB1dCwgb3V0cHV0KQotICAgIC8vIC0gc3RyZWFtIGZsYWcKLSAgICAvLyAtIHN0cmVhbSBJRCAodXN1YWxseSAwKQotICAgIC8vCi0gICAgLy8gbGF5b3V0OgotICAgIC8vCi0gICAgLy8gICAgICArLS0tLS0tKy0tLS0tKy0tLSstLS0tLS0rLS0tLS0tLS0rLS0tLXwtLS0tLS0rLS0tLS0tLS0tLS0tLS0rCi0gICAgLy8gICAgICB8IGtpbmQgfCBkaXIgfCAtIHxzdHJlYW18c3RyZWFtSUR8ZmxleHx2ZW5kb3J8ICBiYXNlIGluZGV4ICB8Ci0gICAgLy8gICAgICArLS0tLS0tKy0tLS0tKy0tLSstLS0tLS0rLS0tLS0tLS0rLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLS0rCi0gICAgLy8gIGJpdDogMzEuLjMwIDI5LjI4ICAgICAgIDI1ICAgMjQgLi4gMTcgIDE2ICAgIDE1ICAgMTQgICAgLi4gICAgIDAKLSAgICAvLwotcHVibGljOgotICAgIC8qKgotICAgICAqIEMyUGFyYW0ga2luZHMsIHVzYWJsZSBhcyBiaXRtYXBzLgotICAgICAqLwotICAgIGVudW0gS2luZCA6IHVpbnQzMl90IHsKLSAgICAgICAgTk9ORSAgICA9IDAsCi0gICAgICAgIFNUUlVDVCAgPSAoMSA8PCAwKSwKLSAgICAgICAgSU5GTyAgICA9ICgxIDw8IDEpLAotICAgICAgICBTRVRUSU5HID0gKDEgPDwgMiksCi0gICAgICAgIFRVTklORyAgPSAoMSA8PCAzKSB8IFNFVFRJTkcsIC8vIHR1bmluZ3MgYXJlIHNldHRpbmdzCi0gICAgfTsKLQotICAgIC8qKgotICAgICAqIGJhc2UgaW5kZXggKGluY2x1ZGluZyB0aGUgdmVuZG9yIGV4dGVuc2lvbiBiaXQpIGlzIGEgZ2xvYmFsIGluZGV4IGZvcgotICAgICAqIEMyIHBhcmFtZXRlciBzdHJ1Y3RzLiAoZS5nLiB0aGUgc2FtZSBpbmRpY2VzIGNhbm5vdCBiZSByZXVzZWQgZm9yIGRpZmZlcmVudAotICAgICAqIHN0cnVjdHMgZm9yIGRpZmZlcmVudCBjb21wb25lbnRzKS4KLSAgICAgKi8KLSAgICBzdHJ1Y3QgQmFzZUluZGV4IHsKLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIGVudW0gOiB1aW50MzJfdCB7Ci0gICAgICAgICAgICBrVHlwZU1hc2sgICAgICA9IDB4QzAwMDAwMDAsCi0gICAgICAgICAgICBrVHlwZVN0cnVjdCAgICA9IDB4MDAwMDAwMDAsCi0gICAgICAgICAgICBrVHlwZVR1bmluZyAgICA9IDB4NDAwMDAwMDAsCi0gICAgICAgICAgICBrVHlwZVNldHRpbmcgICA9IDB4ODAwMDAwMDAsCi0gICAgICAgICAgICBrVHlwZUluZm8gICAgICA9IDB4QzAwMDAwMDAsCi0KLSAgICAgICAgICAgIGtEaXJNYXNrICAgICAgID0gMHgzMDAwMDAwMCwKLSAgICAgICAgICAgIGtEaXJHbG9iYWwgICAgID0gMHgyMDAwMDAwMCwKLSAgICAgICAgICAgIGtEaXJVbmRlZmluZWQgID0gMHgzMDAwMDAwMCwgLy8gTVVTVCBoYXZlIGFsbCBiaXRzIHNldAotICAgICAgICAgICAga0RpcklucHV0ICAgICAgPSAweDAwMDAwMDAwLAotICAgICAgICAgICAga0Rpck91dHB1dCAgICAgPSAweDEwMDAwMDAwLAotCi0gICAgICAgICAgICBrU3RyZWFtRmxhZyAgICA9IDB4MDIwMDAwMDAsCi0gICAgICAgICAgICBrU3RyZWFtSWRNYXNrICA9IDB4MDFGRTAwMDAsCi0gICAgICAgICAgICBrU3RyZWFtSWRTaGlmdCA9IDE3LAotICAgICAgICAgICAga1N0cmVhbUlkTWF4ICAgPSBrU3RyZWFtSWRNYXNrID4+IGtTdHJlYW1JZFNoaWZ0LAotICAgICAgICAgICAga1N0cmVhbU1hc2sgICAgPSBrU3RyZWFtRmxhZyB8IGtTdHJlYW1JZE1hc2ssCi0KLSAgICAgICAgICAgIGtGbGV4aWJsZUZsYWcgID0gMHgwMDAxMDAwMCwKLSAgICAgICAgICAgIGtWZW5kb3JGbGFnICAgID0gMHgwMDAwODAwMCwKLSAgICAgICAgICAgIGtQYXJhbU1hc2sgICAgID0gMHgwMDAwRkZGRiwKLSAgICAgICAgICAgIGtCYXNlTWFzayAgICAgID0ga1BhcmFtTWFzayB8IGtGbGV4aWJsZUZsYWcsCi0gICAgICAgIH07Ci0KLSAgICBwdWJsaWM6Ci0gICAgICAgIGVudW0gOiB1aW50MzJfdCB7Ci0gICAgICAgICAgICBrVmVuZG9yU3RhcnQgPSBrVmVuZG9yRmxhZywgLy8vPCB2ZW5kb3Igc3RydWN0cyBTSEFMTCBzdGFydCBhZnRlciB0aGlzCi0gICAgICAgICAgICBfa0ZsZXhpYmxlRmxhZyA9IGtGbGV4aWJsZUZsYWcsIC8vIFRPRE86IHRoaXMgaXMgb25seSBuZWVkZWQgZm9yIHRlc3RpbmcKLSAgICAgICAgfTsKLQotICAgICAgICAvLy8gY29uc3RydWN0b3IvY29udmVyc2lvbiBmcm9tIHVpbnQzMl90Ci0gICAgICAgIGlubGluZSBCYXNlSW5kZXgodWludDMyX3QgaW5kZXgpIDogbUluZGV4KGluZGV4KSB7IH0KLQotICAgICAgICAvLyBubyBjb252ZXJzaW9uIGZyb20gdWludDY0X3QKLSAgICAgICAgaW5saW5lIEJhc2VJbmRleCh1aW50NjRfdCBpbmRleCkgPSBkZWxldGU7Ci0KLSAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIHZlbmRvciBleHRlbnNpb24gcGFyYW1ldGVyCi0gICAgICAgIGlubGluZSBib29sIGlzVmVuZG9yKCkgY29uc3QgeyByZXR1cm4gbUluZGV4ICYga1ZlbmRvckZsYWc7IH0KLQotICAgICAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGEgZmxleGlibGUgcGFyYW1ldGVyICh3aXRoIHZhcmlhYmxlIHNpemUpCi0gICAgICAgIGlubGluZSBib29sIGlzRmxleGlibGUoKSBjb25zdCB7IHJldHVybiBtSW5kZXggJiBrRmxleGlibGVGbGFnOyB9Ci0KLSAgICAgICAgLy8vIHJldHVybnMgdGhlIGJhc2UgdHlwZTogdGhlIGluZGV4IGZvciB0aGUgdW5kZXJseWluZyBzdHJ1Y3QKLSAgICAgICAgaW5saW5lIHVuc2lnbmVkIGludCBiYXNlSW5kZXgoKSBjb25zdCB7IHJldHVybiBtSW5kZXggJiBrQmFzZU1hc2s7IH0KLQotICAgICAgICAvLy8gcmV0dXJucyB0aGUgcGFyYW0gaW5kZXggZm9yIHRoZSB1bmRlcmx5aW5nIHN0cnVjdAotICAgICAgICBpbmxpbmUgdW5zaWduZWQgaW50IHBhcmFtSW5kZXgoKSBjb25zdCB7IHJldHVybiBtSW5kZXggJiBrUGFyYW1NYXNrOyB9Ci0KLSAgICAgICAgREVGSU5FX0ZJRUxEX0JBU0VEX0NPTVBBUklTT05fT1BFUkFUT1JTKEJhc2VJbmRleCwgbUluZGV4KQotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICB1aW50MzJfdCBtSW5kZXg7Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAqIHR5cGUgZW5jb21wYXNzZXMgdGhlIHBhcmFtZXRlciBraW5kICh0dW5pbmcsIHNldHRpbmcsIGluZm8pLCB3aGV0aGVyIHRoZQotICAgICAqIHBhcmFtZXRlciBpcyBnbG9iYWwsIGlucHV0IG9yIG91dHB1dCwgYW5kIHdoZXRoZXIgaXQgaXMgZm9yIGEgc3RyZWFtLgotICAgICAqLwotICAgIHN0cnVjdCBUeXBlIDogcHVibGljIEJhc2VJbmRleCB7Ci0gICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBnbG9iYWwgcGFyYW1ldGVyIChub3QgZm9yIGlucHV0IG5vciBvdXRwdXQpCi0gICAgICAgIGlubGluZSBib29sIGlzR2xvYmFsKCkgY29uc3QgeyByZXR1cm4gKG1JbmRleCAmIGtEaXJNYXNrKSA9PSBrRGlyR2xvYmFsOyB9Ci0gICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYW4gaW5wdXQgb3IgaW5wdXQgc3RyZWFtIHBhcmFtZXRlcgotICAgICAgICBpbmxpbmUgYm9vbCBmb3JJbnB1dCgpIGNvbnN0IHsgcmV0dXJuIChtSW5kZXggJiBrRGlyTWFzaykgPT0ga0RpcklucHV0OyB9Ci0gICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYW4gb3V0cHV0IG9yIG91dHB1dCBzdHJlYW0gcGFyYW1ldGVyCi0gICAgICAgIGlubGluZSBib29sIGZvck91dHB1dCgpIGNvbnN0IHsgcmV0dXJuIChtSW5kZXggJiBrRGlyTWFzaykgPT0ga0Rpck91dHB1dDsgfQotCi0gICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBzdHJlYW0gcGFyYW1ldGVyCi0gICAgICAgIGlubGluZSBib29sIGZvclN0cmVhbSgpIGNvbnN0IHsgcmV0dXJuIG1JbmRleCAmIGtTdHJlYW1GbGFnOyB9Ci0gICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBwb3J0IChpbnB1dCBvciBvdXRwdXQpIHBhcmFtZXRlcgotICAgICAgICBpbmxpbmUgYm9vbCBmb3JQb3J0KCkgY29uc3QgICB7IHJldHVybiAhZm9yU3RyZWFtKCkgJiYgIWlzR2xvYmFsKCk7IH0KLQotICAgICAgICAvLy8gcmV0dXJucyB0aGUgcGFyYW1ldGVyIHR5cGU6IHRoZSBwYXJhbWV0ZXIgaW5kZXggd2l0aG91dCB0aGUgc3RyZWFtIElECi0gICAgICAgIGlubGluZSB1aW50MzJfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gbUluZGV4ICYgKH5rU3RyZWFtSWRNYXNrKTsgfQotCi0gICAgICAgIC8vLyByZXR1cm4gdGhlIGtpbmQgb2YgdGhpcyBwYXJhbQotICAgICAgICBpbmxpbmUgS2luZCBraW5kKCkgY29uc3QgewotICAgICAgICAgICAgc3dpdGNoIChtSW5kZXggJiBrVHlwZU1hc2spIHsKLSAgICAgICAgICAgICAgICBjYXNlIGtUeXBlU3RydWN0OiByZXR1cm4gU1RSVUNUOwotICAgICAgICAgICAgICAgIGNhc2Uga1R5cGVJbmZvOiByZXR1cm4gSU5GTzsKLSAgICAgICAgICAgICAgICBjYXNlIGtUeXBlU2V0dGluZzogcmV0dXJuIFNFVFRJTkc7Ci0gICAgICAgICAgICAgICAgY2FzZSBrVHlwZVR1bmluZzogcmV0dXJuIFRVTklORzsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gTk9ORTsgLy8gc2hvdWxkIG5vdCBoYXBwZW4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyBjb25zdHJ1Y3Rvci9jb252ZXJzaW9uIGZyb20gdWludDMyX3QKLSAgICAgICAgaW5saW5lIFR5cGUodWludDMyX3QgaW5kZXgpIDogQmFzZUluZGV4KGluZGV4KSB7IH0KLQotICAgICAgICAvLyBubyBjb252ZXJzaW9uIGZyb20gdWludDY0X3QKLSAgICAgICAgaW5saW5lIFR5cGUodWludDY0X3QgaW5kZXgpID0gZGVsZXRlOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgZnJpZW5kIHN0cnVjdCBDMlBhcmFtOyAgIC8vIGZvciBzZXRQb3J0KCkKLSAgICAgICAgZnJpZW5kIHN0cnVjdCBDMlR1bmluZzsgIC8vIGZvciBrVHlwZVR1bmluZwotICAgICAgICBmcmllbmQgc3RydWN0IEMyU2V0dGluZzsgLy8gZm9yIGtUeXBlU2V0dGluZwotICAgICAgICBmcmllbmQgc3RydWN0IEMySW5mbzsgICAgLy8gZm9yIGtUeXBlSW5mbwotICAgICAgICAvLyBmb3Iga0Rpckdsb2JhbAotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgSSwgY2xhc3MgRj4gZnJpZW5kIHN0cnVjdCBDMkdsb2JhbFBhcmFtOwotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgSSwgY2xhc3MgRj4gZnJpZW5kIHN0cnVjdCBDMlBvcnRQYXJhbTsgICAvLyBmb3Iga0RpcioKLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgaW50IEksIGNsYXNzIEY+IGZyaWVuZCBzdHJ1Y3QgQzJTdHJlYW1QYXJhbTsgLy8gZm9yIGtEaXIqCi0gICAgICAgIGZyaWVuZCBzdHJ1Y3QgX0MyUGFyYW1JbnNwZWN0b3I7IC8vIGZvciB0ZXN0aW5nCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHBvcnQvc3RyZWFtIGRpcmVjdGlvbi4KLSAgICAgICAgICogQHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIGlmIGNvdWxkIG5vdCBzZXQgZGlyZWN0aW9uIChlLmcuIGl0IGlzIGdsb2JhbCBwYXJhbSkuCi0gICAgICAgICAqLwotICAgICAgICBpbmxpbmUgYm9vbCBzZXRQb3J0KGJvb2wgb3V0cHV0KSB7Ci0gICAgICAgICAgICBpZiAoaXNHbG9iYWwoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUluZGV4ID0gKG1JbmRleCAmIH5rRGlyTWFzaykgfCAob3V0cHV0ID8ga0Rpck91dHB1dCA6IGtEaXJJbnB1dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogaW5kZXggZW5jb21wYXNzZXMgYWxsIHJlbWFpbmluZyBpbmZvcm1hdGlvbjogYmFzaWNhbGx5IHRoZSBzdHJlYW0gSUQuCi0gICAgICovCi0gICAgc3RydWN0IEluZGV4IDogcHVibGljIFR5cGUgewotICAgICAgICAvLy8gcmV0dXJucyB0aGUgaW5kZXggYXMgdWludDMyX3QKLSAgICAgICAgaW5saW5lIG9wZXJhdG9yIHVpbnQzMl90KCkgY29uc3QgeyByZXR1cm4gbUluZGV4OyB9Ci0KLSAgICAgICAgLy8vIGNvbnN0cnVjdG9yL2NvbnZlcnNpb24gZnJvbSB1aW50MzJfdAotICAgICAgICBpbmxpbmUgSW5kZXgodWludDMyX3QgaW5kZXgpIDogVHlwZShpbmRleCkgeyB9Ci0KLSAgICAgICAgLy8gbm8gY29udmVyc2lvbiBmcm9tIHVpbnQ2NF90Ci0gICAgICAgIGlubGluZSBJbmRleCh1aW50NjRfdCBpbmRleCkgPSBkZWxldGU7Ci0KLSAgICAgICAgLy8vIHJldHVybnMgdGhlIHN0cmVhbSBJRCBvciB+MCBpZiBub3QgYSBzdHJlYW0KLSAgICAgICAgaW5saW5lIHVuc2lnbmVkIHN0cmVhbSgpIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiBmb3JTdHJlYW0oKSA/IHJhd1N0cmVhbSgpIDogfjBVOwotICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBmcmllbmQgc3RydWN0IEMyUGFyYW07ICAgICAgICAgICAvLyBmb3Igc2V0U3RyZWFtLCBtYWtlU3RyZWFtSWQsIGlzVmFsaWQKLSAgICAgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsgLy8gZm9yIHRlc3RpbmcKLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0eXBlIGlzIHZhbGlkLCBlLmcuIGRpcmVjdGlvbiBpcyBub3QgdW5kZWZpbmVkIEFORAotICAgICAgICAgKiBzdHJlYW0gaXMgMCBpZiBub3QgYSBzdHJlYW0gcGFyYW0uCi0gICAgICAgICAqLwotICAgICAgICBpbmxpbmUgYm9vbCBpc1ZhbGlkKCkgY29uc3QgewotICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gVHlwZTo6aXNWYWxpZCAoZXZlbiB0aG91Z2ggc29tZSBvZiB0aGlzIGNoZWNrIGNvdWxkIGJlCi0gICAgICAgICAgICAvLyBwZXJmb3JtZWQgb24gdHlwZXMpIGFzIHRoaXMgaXMgb25seSB1c2VkIG9uIGluZGV4Li4uCi0gICAgICAgICAgICByZXR1cm4gKGZvclN0cmVhbSgpID8gcmF3U3RyZWFtKCkgPCBrU3RyZWFtSWRNYXggOiByYXdTdHJlYW0oKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAmJiAobUluZGV4ICYga0Rpck1hc2spICE9IGtEaXJVbmRlZmluZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gcmV0dXJucyB0aGUgcmF3IHN0cmVhbSBJRCBmaWVsZAotICAgICAgICBpbmxpbmUgdW5zaWduZWQgcmF3U3RyZWFtKCkgY29uc3QgewotICAgICAgICAgICAgcmV0dXJuIChtSW5kZXggJiBrU3RyZWFtSWRNYXNrKSA+PiBrU3RyZWFtSWRTaGlmdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyByZXR1cm5zIHRoZSBzdHJlYW1JZCBiaXRmaWVsZCBmb3IgYSBnaXZlbiB8c3RyZWFtfC4gSWYgc3RyZWFtIGlzIGludmFsaWQsCi0gICAgICAgIC8vLyByZXR1cm5zIGFuIGludmFsaWQgYml0ZmllbGQuCi0gICAgICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgbWFrZVN0cmVhbUlkKHVuc2lnbmVkIHN0cmVhbSkgewotICAgICAgICAgICAgLy8gc2F0dXJhdGUgc3RyZWFtIElEIChtYXggdmFsdWUgaXMgaW52YWxpZCkKLSAgICAgICAgICAgIGlmIChzdHJlYW0gPiBrU3RyZWFtSWRNYXgpIHsKLSAgICAgICAgICAgICAgICBzdHJlYW0gPSBrU3RyZWFtSWRNYXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gKHN0cmVhbSA8PCBrU3RyZWFtSWRTaGlmdCkgJiBrU3RyZWFtSWRNYXNrOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHN0cmVhbSBpbmRleC4KLSAgICAgICAgICogXHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIGlmIGNvdWxkIG5vdCBzZXQgaW5kZXggKGUuZy4gbm90IGEgc3RyZWFtIHBhcmFtKS4KLSAgICAgICAgICovCi0gICAgICAgIGlubGluZSBib29sIHNldFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIHsKLSAgICAgICAgICAgIGlmIChmb3JTdHJlYW0oKSkgewotICAgICAgICAgICAgICAgIG1JbmRleCA9IChtSW5kZXggJiB+a1N0cmVhbUlkTWFzaykgfCBtYWtlU3RyZWFtSWQoc3RyZWFtKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy0+c3RyZWFtKCkgPCBrU3RyZWFtSWRNYXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9OwotCi1wdWJsaWM6Ci0gICAgLy8gcHVibGljIGdldHRlcnMgZm9yIEluZGV4IG1ldGhvZHMKLQotICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSB2ZW5kb3IgZXh0ZW5zaW9uIHBhcmFtZXRlcgotICAgIGlubGluZSBib29sIGlzVmVuZG9yKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5pc1ZlbmRvcigpOyB9Ci0gICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIGZsZXhpYmxlIHBhcmFtZXRlcgotICAgIGlubGluZSBib29sIGlzRmxleGlibGUoKSBjb25zdCB7IHJldHVybiBfbUluZGV4LmlzRmxleGlibGUoKTsgfQotICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBnbG9iYWwgcGFyYW1ldGVyIChub3QgZm9yIGlucHV0IG5vciBvdXRwdXQpCi0gICAgaW5saW5lIGJvb2wgaXNHbG9iYWwoKSBjb25zdCB7IHJldHVybiBfbUluZGV4LmlzR2xvYmFsKCk7IH0KLSAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGFuIGlucHV0IG9yIGlucHV0IHN0cmVhbSBwYXJhbWV0ZXIKLSAgICBpbmxpbmUgYm9vbCBmb3JJbnB1dCgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguZm9ySW5wdXQoKTsgfQotICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYW4gb3V0cHV0IG9yIG91dHB1dCBzdHJlYW0gcGFyYW1ldGVyCi0gICAgaW5saW5lIGJvb2wgZm9yT3V0cHV0KCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5mb3JPdXRwdXQoKTsgfQotCi0gICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIHN0cmVhbSBwYXJhbWV0ZXIKLSAgICBpbmxpbmUgYm9vbCBmb3JTdHJlYW0oKSBjb25zdCB7IHJldHVybiBfbUluZGV4LmZvclN0cmVhbSgpOyB9Ci0gICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIHBvcnQgKGlucHV0IG9yIG91dHB1dCkgcGFyYW1ldGVyCi0gICAgaW5saW5lIGJvb2wgZm9yUG9ydCgpIGNvbnN0ICAgeyByZXR1cm4gX21JbmRleC5mb3JQb3J0KCk7IH0KLQotICAgIC8vLyByZXR1cm5zIHRoZSBzdHJlYW0gSUQgb3IgfjAgaWYgbm90IGEgc3RyZWFtCi0gICAgaW5saW5lIHVuc2lnbmVkIHN0cmVhbSgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguc3RyZWFtKCk7IH0KLQotICAgIC8vLyByZXR1cm5zIHRoZSBwYXJhbWV0ZXIgdHlwZTogdGhlIHBhcmFtZXRlciBpbmRleCB3aXRob3V0IHRoZSBzdHJlYW0gSUQKLSAgICBpbmxpbmUgdWludDMyX3QgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXgudHlwZSgpOyB9Ci0KLSAgICAvLy8gcmV0dXJucyB0aGUga2luZCBvZiB0aGlzIHBhcmFtZXRlcgotICAgIGlubGluZSBLaW5kIGtpbmQoKSBjb25zdCB7IHJldHVybiBfbUluZGV4LmtpbmQoKTsgfQotCi0gICAgLy8vIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIHBhcmFtZXRlciBvciAwIGlmIHRoZSBwYXJhbWV0ZXIgaXMgaW52YWxpZAotICAgIGlubGluZSBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9tU2l6ZTsgfQotCi0gICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhlIHBhcmFtZXRlciBpcyB2YWxpZAotICAgIGlubGluZSBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5pc1ZhbGlkKCkgJiYgX21TaXplID4gMDsgfQotCi0gICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhlIHBhcmFtZXRlciBpcyBpbnZhbGlkCi0gICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yIGJvb2woKTsgfQotCi0gICAgLy8gZXF1YWxpdHkgaXMgZG9uZSBieSBtZW1jbXAgKHVzZSBlcXVhbHMoKSB0byBwcmV2ZW50IGFueSBvdmVycmVhZCkKLSAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEMyUGFyYW0gJm8pIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIGVxdWFscyhvKSAmJiBtZW1jbXAodGhpcywgJm8sIF9tU2l6ZSkgPT0gMDsKLSAgICB9Ci0gICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDMlBhcmFtICZvKSBjb25zdCB7IHJldHVybiAhb3BlcmF0b3I9PShvKTsgfQotCi0gICAgLy8vIHNhZmUocikgdHlwZSBjYXN0IGZyb20gcG9pbnRlciBhbmQgc2l6ZQotICAgIGlubGluZSBzdGF0aWMgQzJQYXJhbSogRnJvbSh2b2lkICphZGRyLCBzaXplX3QgbGVuKSB7Ci0gICAgICAgIC8vIF9tU2l6ZSBtdXN0IGZpdCBpbnRvIHNpemUKLSAgICAgICAgaWYgKGxlbiA8IHNpemVvZihfbVNpemUpICsgb2Zmc2V0b2YoQzJQYXJhbSwgX21TaXplKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gX21TaXplIG11c3QgbWF0Y2ggbGVuZ3RoCi0gICAgICAgIEMyUGFyYW0gKnBhcmFtID0gKEMyUGFyYW0qKWFkZHI7Ci0gICAgICAgIGlmIChwYXJhbS0+X21TaXplICE9IGxlbikgewotICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhcmFtOwotICAgIH0KLQotI2lmIDAKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQLCBjbGFzcz1kZWNsdHlwZShDMlBhcmFtKFAoKSkpPgotICAgIFAgKkFzKCkgeyByZXR1cm4gUDo6RnJvbSh0aGlzKTsgfQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFA+Ci0gICAgY29uc3QgUCAqQXMoKSBjb25zdCB7IHJldHVybiBjb25zdF9jYXN0PGNvbnN0IFAqPihQOjpGcm9tKGNvbnN0X2Nhc3Q8QzJQYXJhbSo+KHRoaXMpKSk7IH0KLSNlbmRpZgotCi1wcm90ZWN0ZWQ6Ci0gICAgLy8vIHNldHMgdGhlIHN0cmVhbSBmaWVsZC4gUmV0dXJucyB0cnVlIGlmZiBzdWNjZXNzZnVsLgotICAgIGlubGluZSBib29sIHNldFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIHsKLSAgICAgICAgcmV0dXJuIF9tSW5kZXguc2V0U3RyZWFtKHN0cmVhbSk7Ci0gICAgfQotCi0gICAgLy8vIHNldHMgdGhlIHBvcnQgKGRpcmVjdGlvbikuIFJldHVybnMgdHJ1ZSBpZmYgc3VjY2Vzc2Z1bC4KLSAgICBpbmxpbmUgYm9vbCBzZXRQb3J0KGJvb2wgb3V0cHV0KSB7Ci0gICAgICAgIHJldHVybiBfbUluZGV4LnNldFBvcnQob3V0cHV0KTsKLSAgICB9Ci0KLXB1YmxpYzoKLSAgICAvLy8gaW52YWxpZGF0ZSB0aGlzIHBhcmFtZXRlci4gVGhlcmUgaXMgbm8gcmVjb3ZlcnkgZnJvbSB0aGlzIGNhbGw7IGUuZy4gcGFyYW1ldGVyCi0gICAgLy8vIGNhbm5vdCBiZSAnY29ycmVjdGVkJyB0byBiZSB2YWxpZC4KLSAgICBpbmxpbmUgdm9pZCBpbnZhbGlkYXRlKCkgeyBfbVNpemUgPSAwOyB9Ci0KLSAgICAvLyBpZiBvdGhlciBpcyB0aGUgc2FtZSBraW5kIG9mICh2YWxpZCkgcGFyYW0gYXMgdGhpcywgY29weSBpdCBpbnRvIHRoaXMgYW5kIHJldHVybiB0cnVlLgotICAgIC8vIG90aGVyd2lzZSwgZG8gbm90IGNvcHkgYW55dGhpbmcsIGFuZCByZXR1cm4gZmFsc2UuCi0gICAgaW5saW5lIGJvb2wgdXBkYXRlRnJvbShjb25zdCBDMlBhcmFtICZvdGhlcikgewotICAgICAgICBpZiAob3RoZXIuX21TaXplID09IF9tU2l6ZSAmJiBvdGhlci5fbUluZGV4ID09IF9tSW5kZXggJiYgX21TaXplID4gMCkgewotICAgICAgICAgICAgbWVtY3B5KHRoaXMsICZvdGhlciwgX21TaXplKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICAvLyByZXR1cm5zIHxvfCBpZiBpdCBpcyBhIG51bGwgcHRyLCBvciBpZiBjYW4gc3VpdGFibHkgYmUgYSBwYXJhbSBvZiBnaXZlbiB8dHlwZXwgKGUuZy4gaGFzCi0gICAgLy8gc2FtZSB0eXBlIChpZ25vcmluZyBzdHJlYW0gSUQpLCBhbmQgc2l6ZSkuIE90aGVyd2lzZSwgcmV0dXJucyBudWxsLiBJZiB8Y2hlY2tEaXJ8IGlzIGZhbHNlLAotICAgIC8vIGFsbG93IHVuZGVmaW5lZCBvciBkaWZmZXJlbnQgZGlyZWN0aW9uIChlLmcuIGFzIGNvbnN0cnVjdGVkIGZyb20gQzJQb3J0UGFyYW0oKSB2cy4KLSAgICAvLyBDMlBvcnRQYXJhbTo6aW5wdXQpLCBidXQgc3RpbGwgcmVxdWlyZSBlcXVpdmFsZW50IHR5cGUgKHN0cmVhbSwgcG9ydCBvciBnbG9iYWwpOyBvdGhlcndpc2UsCi0gICAgLy8gcmV0dXJuIG51bGwuCi0gICAgaW5saW5lIHN0YXRpYyBjb25zdCBDMlBhcmFtKiBpZlN1aXRhYmxlKAotICAgICAgICAgICAgY29uc3QgQzJQYXJhbSogbywgc2l6ZV90IHNpemUsIFR5cGUgdHlwZSwgc2l6ZV90IGZsZXhTaXplID0gMCwgYm9vbCBjaGVja0RpciA9IHRydWUpIHsKLSAgICAgICAgaWYgKG8gPT0gbnVsbHB0ciB8fCBvLT5fbVNpemUgPCBzaXplIHx8IChmbGV4U2l6ZSAmJiAoKG8tPl9tU2l6ZSAtIHNpemUpICUgZmxleFNpemUpKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2hlY2tEaXIpIHsKLSAgICAgICAgICAgIHJldHVybiBvLT5fbUluZGV4LnR5cGUoKSA9PSB0eXBlLm1JbmRleCA/IG8gOiBudWxscHRyOwotICAgICAgICB9IGVsc2UgaWYgKG8tPl9tSW5kZXguaXNHbG9iYWwoKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gKChvLT5fbUluZGV4LnR5cGUoKSBeIHR5cGUubUluZGV4KSAmIH5UeXBlOjprRGlyTWFzaykgPyBudWxscHRyIDogbzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vLyBiYXNlIGNvbnN0cnVjdG9yCi0gICAgaW5saW5lIEMyUGFyYW0odWludDMyX3QgcGFyYW1TaXplLCBJbmRleCBwYXJhbUluZGV4KQotICAgICAgICA6IF9tU2l6ZShwYXJhbVNpemUpLAotICAgICAgICAgIF9tSW5kZXgocGFyYW1JbmRleCkgewotICAgICAgICBpZiAocGFyYW1TaXplID4gc2l6ZW9mKEMyUGFyYW0pKSB7Ci0gICAgICAgICAgICBtZW1zZXQodGhpcyArIDEsIDAsIHBhcmFtU2l6ZSAtIHNpemVvZihDMlBhcmFtKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gYmFzZSBjb25zdHJ1Y3RvciB3aXRoIHN0cmVhbSBzZXQKLSAgICBpbmxpbmUgQzJQYXJhbSh1aW50MzJfdCBwYXJhbVNpemUsIEluZGV4IHBhcmFtSW5kZXgsIHVuc2lnbmVkIHN0cmVhbSkKLSAgICAgICAgOiBfbVNpemUocGFyYW1TaXplKSwKLSAgICAgICAgICBfbUluZGV4KHBhcmFtSW5kZXggfCBJbmRleDo6bWFrZVN0cmVhbUlkKHN0cmVhbSkpIHsKLSAgICAgICAgaWYgKHBhcmFtU2l6ZSA+IHNpemVvZihDMlBhcmFtKSkgewotICAgICAgICAgICAgbWVtc2V0KHRoaXMgKyAxLCAwLCBwYXJhbVNpemUgLSBzaXplb2YoQzJQYXJhbSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZm9yU3RyZWFtKCkpIHsKLSAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotcHJpdmF0ZToKLSAgICBmcmllbmQgc3RydWN0IF9DMlBhcmFtSW5zcGVjdG9yOyAvLyBmb3IgdGVzdGluZwotCi0gICAgLy8vIHJldHVybnMgdGhlIGJhc2UgdHlwZTogdGhlIGluZGV4IGZvciB0aGUgdW5kZXJseWluZyBzdHJ1Y3QgKGZvciB0ZXN0aW5nCi0gICAgLy8vIGFzIHRoaXMgY2FuIGJlIGdvdHRlbiBieSB0aGUgYmFzZUluZGV4IGVudW0pCi0gICAgaW5saW5lIHVpbnQzMl90IF9iYXNlSW5kZXgoKSBjb25zdCB7IHJldHVybiBfbUluZGV4LmJhc2VJbmRleCgpOyB9Ci0KLSAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB8b3wgaGFzIHRoZSBzYW1lIHNpemUgYW5kIGluZGV4IGFzIHRoaXMuIFRoaXMgcGVyZm9ybXMgdGhlCi0gICAgLy8vIGJhc2ljIGNoZWNrIGZvciBlcXVhbGl0eS4KLSAgICBpbmxpbmUgYm9vbCBlcXVhbHMoY29uc3QgQzJQYXJhbSAmbykgY29uc3QgewotICAgICAgICByZXR1cm4gX21TaXplID09IG8uX21TaXplICYmIF9tSW5kZXggPT0gby5fbUluZGV4OwotICAgIH0KLQotICAgIHVpbnQzMl90IF9tU2l6ZTsKLSAgICBJbmRleCBfbUluZGV4OwotfTsKLQotLy8vIFxpbmdyb3VwIGludGVybmFsCi0vLy8gYWxsb3cgQzJQYXJhbXMgYWNjZXNzIHRvIHByaXZhdGUgbWV0aG9kcywgZS5nLiBjb25zdHJ1Y3RvcnMKLSNkZWZpbmUgQzJQQVJBTV9NQUtFX0ZSSUVORFMgXAotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFMsIGludCBJLCBjbGFzcyBGPiBmcmllbmQgc3RydWN0IEMyR2xvYmFsUGFyYW07IFwKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBTLCBpbnQgSSwgY2xhc3MgRj4gZnJpZW5kIHN0cnVjdCBDMlBvcnRQYXJhbTsgXAotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFMsIGludCBJLCBjbGFzcyBGPiBmcmllbmQgc3RydWN0IEMyU3RyZWFtUGFyYW07IFwKLQotLyoqCi0gKiBTZXR0aW5nIGJhc2Ugc3RydWN0dXJlIGZvciBjb21wb25lbnQgbWV0aG9kIHNpZ25hdHVyZXMuIFdyYXAgY29uc3RydWN0b3JzLgotICovCi1zdHJ1Y3QgQzJTZXR0aW5nIDogcHVibGljIEMyUGFyYW0gewotcHJvdGVjdGVkOgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+Ci0gICAgaW5saW5lIEMyU2V0dGluZyhjb25zdCBBcmdzKCYuLi4gYXJncykpIDogQzJQYXJhbShhcmdzLi4uKSB7IH0KLXB1YmxpYzogLy8gVE9ETwotICAgIGVudW0gOiB1aW50MzJfdCB7IGluZGV4RmxhZ3MgPSBUeXBlOjprVHlwZVNldHRpbmcgfTsKLX07Ci0KLS8qKgotICogVHVuaW5nIGJhc2Ugc3RydWN0dXJlIGZvciBjb21wb25lbnQgbWV0aG9kIHNpZ25hdHVyZXMuIFdyYXAgY29uc3RydWN0b3JzLgotICovCi1zdHJ1Y3QgQzJUdW5pbmcgOiBwdWJsaWMgQzJTZXR0aW5nIHsKLXByb3RlY3RlZDoKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgotICAgIGlubGluZSBDMlR1bmluZyhjb25zdCBBcmdzKCYuLi4gYXJncykpIDogQzJTZXR0aW5nKGFyZ3MuLi4pIHsgfQotcHVibGljOiAvLyBUT0RPCi0gICAgZW51bSA6IHVpbnQzMl90IHsgaW5kZXhGbGFncyA9IFR5cGU6OmtUeXBlVHVuaW5nIH07Ci19OwotCi0vKioKLSAqIEluZm8gYmFzZSBzdHJ1Y3R1cmUgZm9yIGNvbXBvbmVudCBtZXRob2Qgc2lnbmF0dXJlcy4gV3JhcCBjb25zdHJ1Y3RvcnMuCi0gKi8KLXN0cnVjdCBDMkluZm8gOiBwdWJsaWMgQzJQYXJhbSB7Ci1wcm90ZWN0ZWQ6Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KLSAgICBpbmxpbmUgQzJJbmZvKGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgOiBDMlBhcmFtKGFyZ3MuLi4pIHsgfQotcHVibGljOiAvLyBUT0RPCi0gICAgZW51bSA6IHVpbnQzMl90IHsgaW5kZXhGbGFncyA9IFR5cGU6OmtUeXBlSW5mbyB9OwotfTsKLQotLyoqCi0gKiBTdHJ1Y3R1cmUgdW5pcXVlbHkgc3BlY2lmeWluZyBhIGZpZWxkIGluIGFuIGFyYml0cmFyeSBzdHJ1Y3R1cmUuCi0gKgotICogXG5vdGUgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBkaWZmZXJlbnRseSBpbiBDMkZpZWxkRGVzY3JpcHRvciB0bwotICogaWRlbnRpZnkgYXJyYXkgZmllbGRzLCBzdWNoIHRoYXQgX21TaXplIGlzIHRoZSBzaXplIG9mIGVhY2ggZWxlbWVudC4gVGhpcyBpcwotICogYmVjYXVzZSB0aGUgZmllbGQgZGVzY3JpcHRvciBjb250YWlucyB0aGUgYXJyYXktbGVuZ3RoLCBhbmQgd2Ugd2FudCB0byBrZWVwCi0gKiBhIHJlbGV2YW50IGVsZW1lbnQgc2l6ZSBmb3IgdmFyaWFibGUgbGVuZ3RoIGFycmF5cy4KLSAqLwotc3RydWN0IF9DMkZpZWxkSWQgewotLy9wdWJsaWM6Ci0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdXNlZCBmb3IgQzJGaWVsZERlc2NyaXB0b3IgdGhhdCByZW1vdmVzIHRoZSBhcnJheSBleHRlbnQuCi0gICAgICoKLSAgICAgKiBccGFyYW1baW5dIG9mZnNldCBwb2ludGVyIHRvIHRoZSBmaWVsZCBpbiBhbiBvYmplY3QgYXQgYWRkcmVzcyAwLgotICAgICAqLwotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIGNsYXNzIEI9dHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PFQ+Ojp0eXBlPgotICAgIGlubGluZSBfQzJGaWVsZElkKFQqIG9mZnNldCkKLSAgICAgICAgOiAvLyBvZmZzZXQgaXMgZnJvbSAiMCIgc28gd2lsbCBmaXQgb24gMzItYml0cwotICAgICAgICAgIF9tT2Zmc2V0KCh1aW50MzJfdCkodWludHB0cl90KShvZmZzZXQpKSwKLSAgICAgICAgICBfbVNpemUoc2l6ZW9mKEIpKSB7IH0KLQotICAgIC8qKgotICAgICAqIERpcmVjdCBjb25zdHJ1Y3RvciBmcm9tIG9mZnNldCBhbmQgc2l6ZS4KLSAgICAgKgotICAgICAqIFxwYXJhbVtpbl0gb2Zmc2V0IG9mZnNldCBvZiB0aGUgZmllbGQuCi0gICAgICogXHBhcmFtW2luXSBzaXplIHNpemUgb2YgdGhlIGZpZWxkLgotICAgICAqLwotICAgIGlubGluZSBfQzJGaWVsZElkKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQotICAgICAgICA6IF9tT2Zmc2V0KG9mZnNldCksIF9tU2l6ZShzaXplKSB7fQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdXNlZCB0byBpZGVudGlmeSBhIGZpZWxkIGluIGFuIG9iamVjdC4KLSAgICAgKgotICAgICAqIFxwYXJhbSBVW3R5cGVdIHBvaW50ZXIgdG8gdGhlIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoaXMgZmllbGQuIFRoaXMgaXMgbmVlZGVkIGluIGNhc2UgdGhlCi0gICAgICogICAgICAgIGZpZWxkIGlzIGluIGFuIChpbmhlcml0ZWQpIGJhc2UgY2xhc3MsIGluIHdoaWNoIGNhc2UgVCB3aWxsIGJlIHRoYXQgYmFzZSBjbGFzcy4KLSAgICAgKiBccGFyYW0gcG1baW1dIG1lbWJlciBwb2ludGVyIHRvIHRoZSBmaWVsZAotICAgICAqLwotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lIEI9dHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PFI+Ojp0eXBlPgotICAgIGlubGluZSBfQzJGaWVsZElkKFUgKiwgUiBUOjoqIHBtKQotICAgICAgICA6IF9tT2Zmc2V0KCh1aW50MzJfdCkodWludHB0cl90KSgmKCgoVSopMjU2KS0+KnBtKSkgLSAyNTZ1KSwKLSAgICAgICAgICBfbVNpemUoc2l6ZW9mKEIpKSB7IH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHVzZWQgdG8gaWRlbnRpZnkgYSBmaWVsZCBpbiBhbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBccGFyYW0gVVt0eXBlXSBwb2ludGVyIHRvIHRoZSBvYmplY3QgdGhhdCBjb250YWlucyB0aGlzIGZpZWxkCi0gICAgICogXHBhcmFtIHBtW2ltXSBtZW1iZXIgcG9pbnRlciB0byB0aGUgZmllbGQKLSAgICAgKi8KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBCPXR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxSPjo6dHlwZT4KLSAgICBpbmxpbmUgX0MyRmllbGRJZChSIFQ6OiogcG0pCi0gICAgICAgIDogX21PZmZzZXQoKHVpbnQzMl90KSh1aW50cHRyX3QpKCYoKChUKikwKS0+KnBtKSkpLAotICAgICAgICAgIF9tU2l6ZShzaXplb2YoQikpIHsgfQotCi0gICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBfQzJGaWVsZElkICZvdGhlcikgY29uc3QgewotICAgICAgICByZXR1cm4gX21PZmZzZXQgPT0gb3RoZXIuX21PZmZzZXQgJiYgX21TaXplID09IG90aGVyLl9tU2l6ZTsKLSAgICB9Ci0KLSAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgX0MyRmllbGRJZCAmb3RoZXIpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIF9tT2Zmc2V0IDwgb3RoZXIuX21PZmZzZXQgfHwKLSAgICAgICAgICAgIC8vIE5PVEU6IG9yZGVyIHBhcmVudCBzdHJ1Y3R1cmUgYmVmb3JlIHN1YiBmaWVsZAotICAgICAgICAgICAgKF9tT2Zmc2V0ID09IG90aGVyLl9tT2Zmc2V0ICYmIF9tU2l6ZSA+IG90aGVyLl9tU2l6ZSk7Ci0gICAgfQotCi0gICAgREVGSU5FX09USEVSX0NPTVBBUklTT05fT1BFUkFUT1JTKF9DMkZpZWxkSWQpCi0KLSNpZiAwCi0gICAgaW5saW5lIHVpbnQzMl90IG9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIF9tT2Zmc2V0OyB9Ci0gICAgaW5saW5lIHVpbnQzMl90IHNpemUoKSBjb25zdCB7IHJldHVybiBfbVNpemU7IH0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChGUklFTkRfVEVTVCkKLSAgICBmcmllbmQgdm9pZCBQcmludFRvKGNvbnN0IF9DMkZpZWxkSWQgJmQsIDo6c3RkOjpvc3RyZWFtKik7Ci0jZW5kaWYKLQotcHJpdmF0ZToKLSAgICB1aW50MzJfdCBfbU9mZnNldDsgLy8gb2Zmc2V0IG9mIGZpZWxkCi0gICAgdWludDMyX3QgX21TaXplOyAgIC8vIHNpemUgb2YgZmllbGQKLX07Ci0KLS8qKgotICogU3RydWN0dXJlIHVuaXF1ZWx5IHNwZWNpZnlpbmcgYSBmaWVsZCBpbiBhIGNvbmZpZ3VyYXRpb24KLSAqLwotc3RydWN0IEMyUGFyYW1GaWVsZCB7Ci0vL3B1YmxpYzoKLSAgICAvLyBUT0RPOiBmaXggd2hhdCB0aGlzIGlzIGZvciBUW10gKGZvciBub3cgc2l6ZSBiZWNvbWVzIFRbMV0pCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgUywgdHlwZW5hbWUgVD4KLSAgICBpbmxpbmUgQzJQYXJhbUZpZWxkKFMqIHBhcmFtLCBUKiBvZmZzZXQpCi0gICAgICAgIDogX21JbmRleChwYXJhbS0+aW5kZXgoKSksCi0gICAgICAgICAgX21GaWVsZElkKG9mZnNldCkge30KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Ci0gICAgaW5saW5lIEMyUGFyYW1GaWVsZChVICpwLCBSIFQ6OiogcG0pIDogX21JbmRleChwLT50eXBlKCkpLCBfbUZpZWxkSWQocCwgcG0pIHsgfQotCi0gICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMlBhcmFtRmllbGQgJm90aGVyKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBfbUluZGV4ID09IG90aGVyLl9tSW5kZXggJiYgX21GaWVsZElkID09IG90aGVyLl9tRmllbGRJZDsKLSAgICB9Ci0KLSAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgQzJQYXJhbUZpZWxkICZvdGhlcikgY29uc3QgewotICAgICAgICByZXR1cm4gX21JbmRleCA8IG90aGVyLl9tSW5kZXggfHwKLSAgICAgICAgICAgIChfbUluZGV4ID09IG90aGVyLl9tSW5kZXggJiYgX21GaWVsZElkIDwgb3RoZXIuX21GaWVsZElkKTsKLSAgICB9Ci0KLSAgICBERUZJTkVfT1RIRVJfQ09NUEFSSVNPTl9PUEVSQVRPUlMoQzJQYXJhbUZpZWxkKQotCi1wcml2YXRlOgotICAgIEMyUGFyYW06OkluZGV4IF9tSW5kZXg7Ci0gICAgX0MyRmllbGRJZCBfbUZpZWxkSWQ7Ci19OwotCi0vKioKLSAqIEEgc2hhcmVkICh1bmlvbikgcmVwcmVzZW50YXRpb24gb2YgbnVtZXJpYyB2YWx1ZXMKLSAqLwotY2xhc3MgQzJWYWx1ZSB7Ci1wdWJsaWM6Ci0gICAgLy8vIEEgdW5pb24gb2Ygc3VwcG9ydGVkIHByaW1pdGl2ZSB0eXBlcy4KLSAgICB1bmlvbiBQcmltaXRpdmUgewotICAgICAgICBpbnQzMl90ICBpMzI7ICAgLy8vPCBpbnQzMl90IHZhbHVlCi0gICAgICAgIHVpbnQzMl90IHUzMjsgICAvLy88IHVpbnQzMl90IHZhbHVlCi0gICAgICAgIGludDY0X3QgIGk2NDsgICAvLy88IGludDY0X3QgdmFsdWUKLSAgICAgICAgdWludDY0X3QgdTY0OyAgIC8vLzwgdWludDY0X3QgdmFsdWUKLSAgICAgICAgZmxvYXQgICAgZnA7ICAgIC8vLzwgZmxvYXQgdmFsdWUKLQotICAgICAgICAvLyBjb25zdHJ1Y3RvcnMgLSBpbXBsaWNpdAotICAgICAgICBQcmltaXRpdmUoaW50MzJfdCB2YWx1ZSkgIDogaTMyKHZhbHVlKSB7IH0KLSAgICAgICAgUHJpbWl0aXZlKHVpbnQzMl90IHZhbHVlKSA6IHUzMih2YWx1ZSkgeyB9Ci0gICAgICAgIFByaW1pdGl2ZShpbnQ2NF90IHZhbHVlKSAgOiBpNjQodmFsdWUpIHsgfQotICAgICAgICBQcmltaXRpdmUodWludDY0X3QgdmFsdWUpIDogdTY0KHZhbHVlKSB7IH0KLSAgICAgICAgUHJpbWl0aXZlKGZsb2F0IHZhbHVlKSAgICA6IGZwKHZhbHVlKSAgeyB9Ci0KLSAgICAgICAgUHJpbWl0aXZlKCkgOiB1NjQoMCkgeyB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBmcmllbmQgY2xhc3MgQzJWYWx1ZTsKLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY29uc3QgVCAmcmVmKCkgY29uc3Q7Ci0gICAgfTsKLQotICAgIGVudW0gVHlwZSB7Ci0gICAgICAgIE5PX0lOSVQsCi0gICAgICAgIElOVDMyLAotICAgICAgICBVSU5UMzIsCi0gICAgICAgIElOVDY0LAotICAgICAgICBVSU5UNjQsCi0gICAgICAgIEZMT0FULAotICAgIH07Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdGF0aWMgY29uc3RleHByIFR5cGUgdHlwZUZvcigpOwotCi0gICAgLy8gY29uc3RydWN0b3JzIC0gaW1wbGljaXQKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgIEMyVmFsdWUoVCB2YWx1ZSkgIDogbVR5cGUodHlwZUZvcjxUPigpKSwgIG1WYWx1ZSh2YWx1ZSkgeyB9Ci0KLSAgICBDMlZhbHVlKCkgOiBtVHlwZShOT19JTklUKSB7IH0KLQotICAgIGlubGluZSBUeXBlIHR5cGUoKSBjb25zdCB7IHJldHVybiBtVHlwZTsgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBpbmxpbmUgYm9vbCBnZXQoVCAqdmFsdWUpIGNvbnN0IHsKLSAgICAgICAgaWYgKG1UeXBlID09IHR5cGVGb3I8VD4oKSkgewotICAgICAgICAgICAgKnZhbHVlID0gbVZhbHVlLnJlZjxUPigpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBUeXBlIG1UeXBlOwotICAgIFByaW1pdGl2ZSBtVmFsdWU7Ci19OwotCi10ZW1wbGF0ZTw+IGNvbnN0IGludDMyX3QgJkMyVmFsdWU6OlByaW1pdGl2ZTo6cmVmPGludDMyX3Q+KCkgY29uc3QgeyByZXR1cm4gaTMyOyB9Ci10ZW1wbGF0ZTw+IGNvbnN0IGludDY0X3QgJkMyVmFsdWU6OlByaW1pdGl2ZTo6cmVmPGludDY0X3Q+KCkgY29uc3QgeyByZXR1cm4gaTY0OyB9Ci10ZW1wbGF0ZTw+IGNvbnN0IHVpbnQzMl90ICZDMlZhbHVlOjpQcmltaXRpdmU6OnJlZjx1aW50MzJfdD4oKSBjb25zdCB7IHJldHVybiB1MzI7IH0KLXRlbXBsYXRlPD4gY29uc3QgdWludDY0X3QgJkMyVmFsdWU6OlByaW1pdGl2ZTo6cmVmPHVpbnQ2NF90PigpIGNvbnN0IHsgcmV0dXJuIHU2NDsgfQotdGVtcGxhdGU8PiBjb25zdCBmbG9hdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8ZmxvYXQ+KCkgY29uc3QgeyByZXR1cm4gZnA7IH0KLQotdGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6VHlwZSBDMlZhbHVlOjp0eXBlRm9yPGludDMyX3Q+KCkgeyByZXR1cm4gSU5UMzI7IH0KLXRlbXBsYXRlPD4gY29uc3RleHByIEMyVmFsdWU6OlR5cGUgQzJWYWx1ZTo6dHlwZUZvcjxpbnQ2NF90PigpIHsgcmV0dXJuIElOVDY0OyB9Ci10ZW1wbGF0ZTw+IGNvbnN0ZXhwciBDMlZhbHVlOjpUeXBlIEMyVmFsdWU6OnR5cGVGb3I8dWludDMyX3Q+KCkgeyByZXR1cm4gVUlOVDMyOyB9Ci10ZW1wbGF0ZTw+IGNvbnN0ZXhwciBDMlZhbHVlOjpUeXBlIEMyVmFsdWU6OnR5cGVGb3I8dWludDY0X3Q+KCkgeyByZXR1cm4gVUlOVDY0OyB9Ci10ZW1wbGF0ZTw+IGNvbnN0ZXhwciBDMlZhbHVlOjpUeXBlIEMyVmFsdWU6OnR5cGVGb3I8ZmxvYXQ+KCkgeyByZXR1cm4gRkxPQVQ7IH0KLQotLyoqCi0gKiBmaWVsZCBkZXNjcmlwdG9yLiBBIGZpZWxkIGlzIHVuaXF1ZWx5IGRlZmluZWQgYnkgYW4gaW5kZXggaW50byBhIHBhcmFtZXRlci4KLSAqIChOb3RlOiBTdHJlYW0taWQgaXMgbm90IGNhcHR1cmVkIGFzIGEgZmllbGQuKQotICoKLSAqIE9yZGVyaW5nIG9mIGZpZWxkcyBpcyBieSBvZmZzZXQuIEluIGNhc2Ugb2Ygc3RydWN0dXJlcywgaXQgaXMgZGVwdGggZmlyc3QsCi0gKiB3aXRoIGEgc3RydWN0dXJlIHRha2luZyBhbiBpbmRleCBqdXN0IGJlZm9yZSBhbmQgaW4gYWRkaXRpb24gdG8gaXRzIG1lbWJlcnMuCi0gKi8KLXN0cnVjdCBDMkZpZWxkRGVzY3JpcHRvciB7Ci0vL3B1YmxpYzoKLSAgICAvKiogZmllbGQgdHlwZXMgYW5kIGZsYWdzCi0gICAgICogXG5vdGU6IG9ubHkgMzItYml0IGFuZCA2NC1iaXQgZmllbGRzIGFyZSBzdXBwb3J0ZWQgKGUuZy4gbm8gYm9vbGVhbiwgYXMgdGhhdAotICAgICAqIGlzIHJlcHJlc2VudGVkIHVzaW5nIElOVDMyKS4KLSAgICAgKi8KLSAgICBlbnVtIFR5cGUgOiB1aW50MzJfdCB7Ci0gICAgICAgIC8vIHByaW1pdGl2ZSB0eXBlcwotICAgICAgICBJTlQzMiAgID0gQzJWYWx1ZTo6SU5UMzIsICAvLy88IDMyLWJpdCBzaWduZWQgaW50ZWdlcgotICAgICAgICBVSU5UMzIgID0gQzJWYWx1ZTo6VUlOVDMyLCAvLy88IDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyCi0gICAgICAgIElOVDY0ICAgPSBDMlZhbHVlOjpJTlQ2NCwgIC8vLzwgNjQtYml0IHNpZ25lZCBpbnRlZ2VyCi0gICAgICAgIFVJTlQ2NCAgPSBDMlZhbHVlOjpVSU5UNjQsIC8vLzwgNjQtYml0IHNpZ25lZCBpbnRlZ2VyCi0gICAgICAgIEZMT0FUICAgPSBDMlZhbHVlOjpGTE9BVCwgIC8vLzwgMzItYml0IGZsb2F0aW5nIHBvaW50Ci0KLSAgICAgICAgLy8gYXJyYXkgdHlwZXMKLSAgICAgICAgU1RSSU5HID0gMHgxMDAsIC8vLzwgZml4ZWQtc2l6ZSBzdHJpbmcgKFBPRCkKLSAgICAgICAgQkxPQiwgICAgICAgICAgIC8vLzwgYmxvYi4gQmxvYnMgaGF2ZSBubyBzdWItZWxlbWVudHMgYW5kIGNhbiBiZSB0aG91Z2h0IG9mIGFzIGJ5dGUgYXJyYXlzOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBob3dldmVyLCBieXRlcyBjYW5ub3QgYmUgaW5kaXZpZHVhbGx5IGFkZHJlc3NlZCBieSBjbGllbnRzLgotCi0gICAgICAgIC8vIGNvbXBsZXggdHlwZXMKLSAgICAgICAgU1RSVUNUX0ZMQUcgPSAweDEwMDAwLCAvLy88IHN0cnVjdHMuIE1hcmtlZCB3aXRoIHRoaXMgZmxhZyBpbiBhZGRpdGlvbiB0byB0aGVpciBiYXNlSW5kZXguCi0gICAgfTsKLQotICAgIHR5cGVkZWYgc3RkOjpwYWlyPEMyU3RyaW5nLCBDMlZhbHVlOjpQcmltaXRpdmU+IG5hbWVkX3ZhbHVlX3R5cGU7Ci0gICAgdHlwZWRlZiBzdGQ6OnZlY3Rvcjxjb25zdCBuYW1lZF92YWx1ZV90eXBlPiBuYW1lZF92YWx1ZXNfdHlwZTsKLSAgICAvL3R5cGVkZWYgc3RkOjpwYWlyPHN0ZDo6dmVjdG9yPEMyU3RyaW5nPiwgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPj4gbmFtZWRfdmFsdWVzX3R5cGU7Ci0KLSAgICAvKioKLSAgICAgKiBUZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB0aGF0IHJldHVybnMgdGhlIG5hbWVkIHZhbHVlcyBmb3IgYSB0eXBlLgotICAgICAqCi0gICAgICogXHRvZG8gaGlkZSBmcm9tIGNsaWVudC4KLSAgICAgKgotICAgICAqIFxyZXR1cm4gYSB2ZWN0b3Igb2YgbmFtZS12YWx1ZSBwYWlycy4KLSAgICAgKi8KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCPgotICAgIHN0YXRpYyBuYW1lZF92YWx1ZXNfdHlwZSBuYW1lZFZhbHVlc0Zvcihjb25zdCBCICYpOwotCi0gICAgaW5saW5lIEMyRmllbGREZXNjcmlwdG9yKHVpbnQzMl90IHR5cGUsIHVpbnQzMl90IGxlbmd0aCwgQzJTdHJpbmdMaXRlcmFsIG5hbWUsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQotICAgICAgICA6IF9tVHlwZSgoVHlwZSl0eXBlKSwgX21MZW5ndGgobGVuZ3RoKSwgX21OYW1lKG5hbWUpLCBfbUZpZWxkSWQob2Zmc2V0LCBzaXplKSB7IH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIGNsYXNzIEI9dHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PFQ+Ojp0eXBlPgotICAgIGlubGluZSBDMkZpZWxkRGVzY3JpcHRvcihjb25zdCBUKiBvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUpCi0gICAgICAgIDogX21UeXBlKHRoaXMtPmdldFR5cGUoKEIqKW51bGxwdHIpKSwKLSAgICAgICAgICBfbUxlbmd0aChzdGQ6OmlzX2FycmF5PFQ+Ojp2YWx1ZSA/IHN0ZDo6ZXh0ZW50PFQ+Ojp2YWx1ZSA6IDEpLAotICAgICAgICAgIF9tTmFtZShuYW1lKSwKLSAgICAgICAgICBfbU5hbWVkVmFsdWVzKG5hbWVkVmFsdWVzRm9yKCooQiopMCkpLAotICAgICAgICAgIF9tRmllbGRJZChvZmZzZXQpIHt9Ci0KLS8qCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8VD46OnR5cGU+Ci0gICAgaW5saW5lIEMyRmllbGREZXNjcmlwdG9yPFQsIEIsIGZhbHNlPihUKiBvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUpCi0gICAgICAgIDogX21UeXBlKHRoaXMtPmdldFR5cGUoKEIqKW51bGxwdHIpKSwKLSAgICAgICAgICBfbUxlbmd0aChzdGQ6OmlzX2FycmF5PFQ+Ojp2YWx1ZSA/IHN0ZDo6ZXh0ZW50PFQ+Ojp2YWx1ZSA6IDEpLAotICAgICAgICAgIF9tTmFtZShuYW1lKSwKLSAgICAgICAgICBfbUZpZWxkSWQob2Zmc2V0KSB7fQotKi8KLQotICAgIC8vLyBcZGVwcmVjYXRlZAotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGNsYXNzIEI9dHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PFQ+Ojp0eXBlPgotICAgIGNvbnN0ZXhwciBpbmxpbmUgQzJGaWVsZERlc2NyaXB0b3IoUyosIFQgUzo6KiBmaWVsZCwgY29uc3QgY2hhciAqbmFtZSkKLSAgICAgICAgOiBfbVR5cGUodGhpcy0+Z2V0VHlwZSgoQiopbnVsbHB0cikpLAotICAgICAgICAgIF9tTGVuZ3RoKHN0ZDo6aXNfYXJyYXk8VD46OnZhbHVlID8gc3RkOjpleHRlbnQ8VD46OnZhbHVlIDogMSksCi0gICAgICAgICAgX21OYW1lKG5hbWUpLAotICAgICAgICAgIF9tRmllbGRJZCgmKCgoUyopMCktPipmaWVsZCkpIHt9Ci0KLSAgICAvLy8gcmV0dXJucyB0aGUgdHlwZSBvZiB0aGlzIGZpZWxkCi0gICAgaW5saW5lIFR5cGUgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIF9tVHlwZTsgfQotICAgIC8vLyByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGZpZWxkIGluIGNhc2UgaXQgaXMgYW4gYXJyYXkuIFJldHVybnMgMCBmb3IKLSAgICAvLy8gVFtdIGFycmF5cywgcmV0dXJucyAxIGZvciBUWzFdIGFycmF5cyBhcyB3ZWxsIGFzIGlmIHRoZSBmaWVsZCBpcyBub3QgYW4gYXJyYXkuCi0gICAgaW5saW5lIHNpemVfdCBsZW5ndGgoKSBjb25zdCB7IHJldHVybiBfbUxlbmd0aDsgfQotICAgIC8vLyByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAotICAgIGlubGluZSBDMlN0cmluZ0xpdGVyYWwgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIF9tTmFtZTsgfQotCi0gICAgY29uc3QgbmFtZWRfdmFsdWVzX3R5cGUgJm5hbWVkVmFsdWVzKCkgY29uc3QgeyByZXR1cm4gX21OYW1lZFZhbHVlczsgfQotCi0jaWYgZGVmaW5lZChGUklFTkRfVEVTVCkKLSAgICBmcmllbmQgdm9pZCBQcmludFRvKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICYsIDo6c3RkOjpvc3RyZWFtKik7Ci0gICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmLCBjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmKTsKLSAgICBGUklFTkRfVEVTVChDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgVmVyaWZ5U3RydWN0KTsKLSNlbmRpZgotCi1wcml2YXRlOgotICAgIGNvbnN0IFR5cGUgX21UeXBlOwotICAgIGNvbnN0IHVpbnQzMl90IF9tTGVuZ3RoOyAvLyB0aGUgbGFzdCBtZW1iZXIgY2FuIGJlIGFyYml0cmFyeSBsZW5ndGggaWYgaXQgaXMgVFtdIGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAvLyBleHRlbmRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgcGFyYW1ldGVyICh0aGlzIGlzIG1hcmtlZCB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgIC8vIDApLiBUWzBdLXMgYXJlIG5vdCBmaWVsZHMuCi0gICAgY29uc3QgQzJTdHJpbmdMaXRlcmFsIF9tTmFtZTsKLSAgICBjb25zdCBuYW1lZF92YWx1ZXNfdHlwZSBfbU5hbWVkVmFsdWVzOwotCi0gICAgY29uc3QgX0MyRmllbGRJZCBfbUZpZWxkSWQ7ICAgLy8gZmllbGQgaWRlbnRpZmllciAob2Zmc2V0IGFuZCBzaXplKQotCi0gICAgLy8gTk9URTogV2UgZG8gbm90IGNhcHR1cmUgZGVmYXVsdCB2YWx1ZShzKSBoZXJlIGFzIHRoYXQgbWF5IGRlcGVuZCBvbiB0aGUgY29tcG9uZW50LgotICAgIC8vIE5PVEU6IFdlIGFsc28gZG8gbm90IGNhcHR1cmUgYmVzdEVmZm9ydCwgYXMgMSkgdGhpcyBzaG91bGQgYmUgdHJ1ZSBmb3IgbW9zdCBmaWVsZHMsCi0gICAgLy8gMikgdGhpcyBpcyBhdCBwYXJhbWV0ZXIgZ3JhbnVsYXJpdHkuCi0KLSAgICAvLyB0eXBlIHJlc29sdXRpb24KLSAgICBpbmxpbmUgc3RhdGljIFR5cGUgZ2V0VHlwZShpbnQzMl90KikgIHsgcmV0dXJuIElOVDMyOyB9Ci0gICAgaW5saW5lIHN0YXRpYyBUeXBlIGdldFR5cGUodWludDMyX3QqKSB7IHJldHVybiBVSU5UMzI7IH0KLSAgICBpbmxpbmUgc3RhdGljIFR5cGUgZ2V0VHlwZShpbnQ2NF90KikgIHsgcmV0dXJuIElOVDY0OyB9Ci0gICAgaW5saW5lIHN0YXRpYyBUeXBlIGdldFR5cGUodWludDY0X3QqKSB7IHJldHVybiBVSU5UNjQ7IH0KLSAgICBpbmxpbmUgc3RhdGljIFR5cGUgZ2V0VHlwZShmbG9hdCopICAgIHsgcmV0dXJuIEZMT0FUOyB9Ci0gICAgaW5saW5lIHN0YXRpYyBUeXBlIGdldFR5cGUoY2hhciopICAgICB7IHJldHVybiBTVFJJTkc7IH0KLSAgICBpbmxpbmUgc3RhdGljIFR5cGUgZ2V0VHlwZSh1aW50OF90KikgIHsgcmV0dXJuIEJMT0I7IH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsCi0gICAgICAgICAgICAgY2xhc3M9dHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19lbnVtPFQ+Ojp2YWx1ZT46OnR5cGU+Ci0gICAgaW5saW5lIHN0YXRpYyBUeXBlIGdldFR5cGUoVCopIHsKLSAgICAgICAgdHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8VD46OnR5cGUgdW5kZXJseWluZygwKTsKLSAgICAgICAgcmV0dXJuIGdldFR5cGUoJnVuZGVybHlpbmcpOwotICAgIH0KLQotICAgIC8vIHZlcmlmeSBDMlN0cnVjdCBieSBoYXZpbmcgYSBmaWVsZExpc3QgYW5kIGEgYmFzZUluZGV4LgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsCi0gICAgICAgICAgICAgY2xhc3M9ZGVjbHR5cGUoVDo6YmFzZUluZGV4ICsgMSksIGNsYXNzPWRlY2x0eXBlKFQ6OmZpZWxkTGlzdCk+Ci0gICAgaW5saW5lIHN0YXRpYyBUeXBlIGdldFR5cGUoVCopIHsKLSAgICAgICAgc3RhdGljX2Fzc2VydCghc3RkOjppc19iYXNlX29mPEMyUGFyYW0sIFQ+Ojp2YWx1ZSwgImNhbm5vdCB1c2UgQzJQYXJhbXMgYXMgZmllbGRzIik7Ci0gICAgICAgIHJldHVybiAoVHlwZSkoVDo6YmFzZUluZGV4IHwgU1RSVUNUX0ZMQUcpOwotICAgIH0KLX07Ci0KLSNkZWZpbmUgREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IodHlwZSkgXAotdGVtcGxhdGU8PiBpbmxpbmUgQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkX3ZhbHVlc190eXBlIEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0Zvcihjb25zdCB0eXBlICYpIHsgXAotICAgIHJldHVybiBuYW1lZF92YWx1ZXNfdHlwZSgpOyBcCi19Ci0KLS8vIFdlIGNhbm5vdCBzdWJ0eXBlIGNvbnN0cnVjdG9yIGZvciBlbnVtZXJhdGVkIHR5cGVzIHNvIGluc3RlZCBkZWZpbmUgbm8gbmFtZWQgdmFsdWVzIGZvcgotLy8gbm9uLWVudW1lcmF0ZWQgaW50ZWdyYWwgdHlwZXMuCi1ERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUihpbnQzMl90KQotREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IodWludDMyX3QpCi1ERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUihpbnQ2NF90KQotREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IodWludDY0X3QpCi1ERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUih1aW50OF90KQotREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IoY2hhcikKLURFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKGZsb2F0KQotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUgZmllbGRzIG9mIGEgc3RydWN0dXJlLgotICovCi1zdHJ1Y3QgQzJTdHJ1Y3REZXNjcmlwdG9yIHsKLXB1YmxpYzoKLSAgICAvLy8gUmV0dXJucyB0aGUgcGFyYW1ldGVyIHR5cGUKLSAgICBpbmxpbmUgQzJQYXJhbTo6QmFzZUluZGV4IGJhc2VJbmRleCgpIGNvbnN0IHsgcmV0dXJuIF9tVHlwZS5iYXNlSW5kZXgoKTsgfQotCi0gICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZpZWxkcyBpbiB0aGlzIHBhcmFtIChub3QgY291bnRpbmcgYW55IHJlY3Vyc2l2ZSBmaWVsZHMpLgotICAgIC8vIE11c3QgYmUgYXQgbGVhc3QgMSBmb3IgdmFsaWQgcGFyYW1zLgotICAgIGlubGluZSBzaXplX3QgbnVtRmllbGRzKCkgY29uc3QgeyByZXR1cm4gX21GaWVsZHMuc2l6ZSgpOyB9Ci0KLSAgICAvLyBSZXR1cm5zIHRoZSBsaXN0IG9mIGltbWVkaWF0ZSBmaWVsZHMgKG5vdCBjb3VudGluZyBhbnkgcmVjdXJzaXZlIGZpZWxkcykuCi0gICAgdHlwZWRlZiBzdGQ6OnZlY3Rvcjxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj46OmNvbnN0X2l0ZXJhdG9yIGZpZWxkX2l0ZXJhdG9yOwotICAgIGlubGluZSBmaWVsZF9pdGVyYXRvciBjYmVnaW4oKSBjb25zdCB7IHJldHVybiBfbUZpZWxkcy5jYmVnaW4oKTsgfQotICAgIGlubGluZSBmaWVsZF9pdGVyYXRvciBjZW5kKCkgY29uc3QgeyByZXR1cm4gX21GaWVsZHMuY2VuZCgpOyB9Ci0KLSAgICAvLyBvbmx5IHN1cHBseWluZyBjb25zdCBpdGVyYXRvciAtIGJ1dCB0aGVzZSBhcmUgbmVlZGVkIGZvciByYW5nZSBiYXNlZCBsb29wcwotICAgIGlubGluZSBmaWVsZF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9tRmllbGRzLmNiZWdpbigpOyB9Ci0gICAgaW5saW5lIGZpZWxkX2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIF9tRmllbGRzLmNlbmQoKTsgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBpbmxpbmUgQzJTdHJ1Y3REZXNjcmlwdG9yKFQqKQotICAgICAgICA6IEMyU3RydWN0RGVzY3JpcHRvcihUOjpiYXNlSW5kZXgsIFQ6OmZpZWxkTGlzdCkgeyB9Ci0KLSAgICBpbmxpbmUgQzJTdHJ1Y3REZXNjcmlwdG9yKAotICAgICAgICAgICAgQzJQYXJhbTo6QmFzZUluZGV4IHR5cGUsCi0gICAgICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcykKLSAgICAgICAgOiBfbVR5cGUodHlwZSksIF9tRmllbGRzKGZpZWxkcykgeyB9Ci0KLXByaXZhdGU6Ci0gICAgY29uc3QgQzJQYXJhbTo6QmFzZUluZGV4IF9tVHlwZTsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gX21GaWVsZHM7Ci19OwotCi0vKioKLSAqIERlc2NyaWJlcyBwYXJhbWV0ZXJzIGZvciBhIGNvbXBvbmVudC4KLSAqLwotc3RydWN0IEMyUGFyYW1EZXNjcmlwdG9yIHsKLXB1YmxpYzoKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgc2V0dGluZyB0aGlzIHBhcmFtIGlzIHJlcXVpcmVkIHRvIGNvbmZpZ3VyZSB0aGlzIGNvbXBvbmVudC4KLSAgICAgKiBUaGlzIGNhbiBvbmx5IGJlIHRydWUgZm9yIGJ1aWx0aW4gcGFyYW1zIGZvciBwbGF0Zm9ybS1kZWZpbmVkIGNvbXBvbmVudHMgKGUuZy4gdmlkZW8gYW5kCi0gICAgICogYXVkaW8gZW5jb2RlcnMvZGVjb2RlcnMsIHZpZGVvL2F1ZGlvIGZpbHRlcnMpLgotICAgICAqIEZvciB2ZW5kb3ItZGVmaW5lZCBjb21wb25lbnRzLCBpdCBjYW4gYmUgdHJ1ZSBldmVuIGZvciB2ZW5kb3ItZGVmaW5lZCBwYXJhbXMsCi0gICAgICogYnV0IGl0IGlzIG5vdCByZWNvbW1lbmRlZCwgaW4gY2FzZSB0aGUgY29tcG9uZW50IGJlY29tZXMgcGxhdGZvcm0tZGVmaW5lZC4KLSAgICAgKi8KLSAgICBpbmxpbmUgYm9vbCBpc1JlcXVpcmVkKCkgY29uc3QgeyByZXR1cm4gX21Jc1JlcXVpcmVkOyB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBwYXJhbWV0ZXIgaXMgcGVyc2lzdGVudC4gVGhpcyBpcyBhbHdheXMgdHJ1ZSBmb3IgQzJUdW5pbmcgYW5kIEMyU2V0dGluZywKLSAgICAgKiBidXQgbWF5IGJlIGZhbHNlIGZvciBDMkluZm8uIElmIHRydWUsIHRoaXMgcGFyYW1ldGVyIHBlcnNpc3RzIGFjcm9zcyBmcmFtZXMgYW5kIGFwcGxpZXMgdG8KLSAgICAgKiB0aGUgY3VycmVudCBhbmQgc3Vic2VxdWVudCBmcmFtZXMuIElmIGZhbHNlLCB0aGlzIEMySW5mbyBwYXJhbWV0ZXIgb25seSBhcHBsaWVzIHRvIHRoZQotICAgICAqIGN1cnJlbnQgZnJhbWUgYW5kIGlzIG5vdCBhc3N1bWVkIHRvIGhhdmUgdGhlIHNhbWUgdmFsdWUgKG9yIGV2ZW4gYmUgcHJlc2VudCkgb24gc3Vic2VxdWVudAotICAgICAqIGZyYW1lcywgdW5sZXNzIGl0IGlzIHNwZWNpZmllZCBmb3IgdGhvc2UgZnJhbWVzLgotICAgICAqLwotICAgIGlubGluZSBib29sIGlzUGVyc2lzdGVudCgpIGNvbnN0IHsgcmV0dXJuIF9tSXNQZXJzaXN0ZW50OyB9Ci0KLSAgICAvLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIHBhcmFtLgotICAgIC8vLyBUaGlzIGRlZmF1bHRzIHRvIHRoZSB1bmRlcmx5aW5nIEMyU3RydWN0J3MgbmFtZSwgYnV0IGNvdWxkIGJlIGFsdGVyZWQgZm9yIGEgY29tcG9uZW50LgotICAgIGlubGluZSBDMlN0cmluZyBuYW1lKCkgY29uc3QgeyByZXR1cm4gX21OYW1lOyB9Ci0KLSAgICAvLy8gUmV0dXJucyB0aGUgcGFyYW1ldGVyIHR5cGUKLSAgICAvLy8gXHRvZG8gZml4IHRoaXMKLSAgICBpbmxpbmUgQzJQYXJhbTo6VHlwZSB0eXBlKCkgY29uc3QgeyByZXR1cm4gX21UeXBlOyB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgIGlubGluZSBDMlBhcmFtRGVzY3JpcHRvcihib29sIGlzUmVxdWlyZWQsIEMyU3RyaW5nTGl0ZXJhbCBuYW1lLCBjb25zdCBUKikKLSAgICAgICAgOiBfbUlzUmVxdWlyZWQoaXNSZXF1aXJlZCksCi0gICAgICAgICAgX21Jc1BlcnNpc3RlbnQodHJ1ZSksCi0gICAgICAgICAgX21OYW1lKG5hbWUpLAotICAgICAgICAgIF9tVHlwZShUOjp0eXBlSW5kZXgpIHsgfQotCi0gICAgaW5saW5lIEMyUGFyYW1EZXNjcmlwdG9yKAotICAgICAgICAgICAgYm9vbCBpc1JlcXVpcmVkLCBDMlN0cmluZ0xpdGVyYWwgbmFtZSwgQzJQYXJhbTo6VHlwZSB0eXBlKQotICAgICAgICA6IF9tSXNSZXF1aXJlZChpc1JlcXVpcmVkKSwKLSAgICAgICAgICBfbUlzUGVyc2lzdGVudCh0cnVlKSwKLSAgICAgICAgICBfbU5hbWUobmFtZSksCi0gICAgICAgICAgX21UeXBlKHR5cGUpIHsgfQotCi1wcml2YXRlOgotICAgIGNvbnN0IGJvb2wgX21Jc1JlcXVpcmVkOwotICAgIGNvbnN0IGJvb2wgX21Jc1BlcnNpc3RlbnQ7Ci0gICAgY29uc3QgQzJTdHJpbmcgX21OYW1lOwotICAgIGNvbnN0IEMyUGFyYW06OlR5cGUgX21UeXBlOwotfTsKLQotLy8vIFxpbmdyb3VwIGludGVybmFsCi0vLy8gRGVmaW5lIGEgc3RydWN0dXJlIHdpdGhvdXQgYmFzZUluZGV4LgotI2RlZmluZSBERUZJTkVfQzJTVFJVQ1RfTk9fQkFTRShuYW1lKSBcCi1wdWJsaWM6IFwKLSAgICB0eXBlZGVmIEMyIyNuYW1lIyNTdHJ1Y3QgX3R5cGU7IC8qKjwgdHlwZSBuYW1lIHNob3J0aGFuZCAqLyBcCi0gICAgY29uc3Qgc3RhdGljIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRMaXN0OyAvKio8IHN0cnVjdHVyZSBmaWVsZHMgKi8KLQotLy8vIERlZmluZSBhIHN0cnVjdHVyZSB3aXRoIG1hdGNoaW5nIGJhc2VJbmRleC4KLSNkZWZpbmUgREVGSU5FX0MyU1RSVUNUKG5hbWUpIFwKLXB1YmxpYzogXAotICAgIGVudW0gOiB1aW50MzJfdCB7IGJhc2VJbmRleCA9IGtQYXJhbUluZGV4IyNuYW1lIH07IFwKLSAgICBERUZJTkVfQzJTVFJVQ1RfTk9fQkFTRShuYW1lKQotCi0vLy8gRGVmaW5lIGEgZmxleGlibGUgc3RydWN0dXJlIHdpdGggbWF0Y2hpbmcgYmFzZUluZGV4LgotI2RlZmluZSBERUZJTkVfRkxFWF9DMlNUUlVDVChuYW1lLCBmbGV4TWVtYmVyKSBcCi1wdWJsaWM6IFwKLSAgICBGTEVYKEMyIyNuYW1lIyNTdHJ1Y3QsIGZsZXhNZW1iZXIpIFwKLSAgICBlbnVtIDogdWludDMyX3QgeyBiYXNlSW5kZXggPSBrUGFyYW1JbmRleCMjbmFtZSB8IEMyUGFyYW06OkJhc2VJbmRleDo6X2tGbGV4aWJsZUZsYWcgfTsgXAotICAgIERFRklORV9DMlNUUlVDVF9OT19CQVNFKG5hbWUpCi0KLS8vLyBcaW5ncm91cCBpbnRlcm5hbAotLy8vIERlc2NyaWJlIGEgc3RydWN0dXJlIG9mIGEgdGVtcGxhdGVkIHN0cnVjdHVyZS4KLSNkZWZpbmUgREVTQ1JJQkVfVEVNUExBVEVEX0MyU1RSVUNUKHN0cnVrdCwgbGlzdCkgXAotICAgIHRlbXBsYXRlPD4gXAotICAgIGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gc3RydWt0OjpmaWVsZExpc3QgPSBsaXN0OwotCi0vLy8gXGRlcHJlY2F0ZWQKLS8vLyBEZXNjcmliZSB0aGUgZmllbGRzIG9mIGEgc3RydWN0dXJlIHVzaW5nIGFuIGluaXRpYWxpemVyIGxpc3QuCi0jZGVmaW5lIERFU0NSSUJFX0MyU1RSVUNUKG5hbWUsIGxpc3QpIFwKLSAgICBjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+IEMyIyNuYW1lIyNTdHJ1Y3Q6OmZpZWxkTGlzdCA9IGxpc3Q7Ci0KLS8qKgotICogRGVzY3JpYmUgYSBmaWVsZCBvZiBhIHN0cnVjdHVyZS4KLSAqIFRoZXNlIG11c3QgYmUgaW4gb3JkZXIuCi0gKgotICogVGhlcmUgYXJlIHR3byB3YXlzIHRvIHVzZSB0aGlzIG1hY3JvOgotICoKLSAqICB+fn5+fn5+fn5+fn5+ICguY3BwKQotICogIHN0cnVjdCBDMlZpZGVvV2lkdGhTdHJ1Y3QgewotICogICAgICBpbnQzMl90IG1XaWR0aDsKLSAqICAgICAgQzJWaWRlb1dpZHRoU3RydWN0KCkge30gLy8gb3B0aW9uYWwgZGVmYXVsdCBjb25zdHJ1Y3RvcgotICogICAgICBDMlZpZGVvV2lkdGhTdHJ1Y3QoaW50MzJfdCBfd2lkdGgpIDogbVdpZHRoKF93aWR0aCkge30KLSAqCi0gKiAgICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoVmlkZW9XaWR0aCkKLSAqICAgICAgQzJGSUVMRChtV2lkdGgsICJ3aWR0aCIpCi0gKiAgfTsKLSAqICB+fn5+fn5+fn5+fn5+Ci0gKgotICogIH5+fn5+fn5+fn5+fn4gKC5jcHApCi0gKiAgc3RydWN0IEMyVmlkZW9XaWR0aFN0cnVjdCB7Ci0gKiAgICAgIGludDMyX3QgbVdpZHRoOwotICogICAgICBDMlZpZGVvV2lkdGhTdHJ1Y3QoKSA9IGRlZmF1bHQ7IC8vIG9wdGlvbmFsIGRlZmF1bHQgY29uc3RydWN0b3IKLSAqICAgICAgQzJWaWRlb1dpZHRoU3RydWN0KGludDMyX3QgX3dpZHRoKSA6IG1XaWR0aChfd2lkdGgpIHt9Ci0gKgotICogICAgICBERUZJTkVfQzJTVFJVQ1QoVmlkZW9XaWR0aCkKLSAqICB9IEMyX1BBQ0s7Ci0gKgotICogIERFU0NSSUJFX0MyU1RSVUNUKFZpZGVvV2lkdGgsIHsKLSAqICAgICAgQzJGSUVMRChtV2lkdGgsICJ3aWR0aCIpCi0gKiAgfSkKLSAqICB+fn5+fn5+fn5+fn5+Ci0gKgotICogIEZvciBmbGV4aWJsZSBzdHJ1Y3R1cmVzICh0aG9zZSBlbmRpbmcgaW4gVFtdKSwgdXNlIHRoZSBmbGV4aWJsZSBtYWNyb3M6Ci0gKgotICogIH5+fn5+fn5+fn5+fn4gKC5jcHApCi0gKiAgc3RydWN0IEMyVmlkZW9GbGV4V2lkdGhzU3RydWN0IHsKLSAqICAgICAgaW50MzJfdCBtV2lkdGhzW107Ci0gKiAgICAgIEMyVmlkZW9GbGV4V2lkdGhzU3RydWN0KCk7IC8vIG11c3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IKLSAqCi0gKiAgcHJpdmF0ZToKLSAqICAgICAgLy8gbWF5IGhhdmUgcHJpdmF0ZSBjb25zdHJ1Y3RvcnMgdGFraW5nIG51bWJlciBvZiB3aWR0aHMgYXMgdGhlIGZpcnN0IGFyZ3VtZW50Ci0gKiAgICAgIC8vIFRoaXMgaXMgdXNlZCBieSB0aGUgQzJQYXJhbSBmYWN0b3J5IG1ldGhvZHMsIGUuZy4KLSAqICAgICAgLy8gICBDMlZpZGVvRmxleFdpZHRoc0dsb2JhbFBhcmFtOjphbGxvY191bmlxdWUoc2l6ZV90LCBpbnQzMl90KTsKLSAqICAgICAgQzJWaWRlb0ZsZXhXaWR0aHNTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgaW50MzJfdCB2YWx1ZSkgewotICogICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmbGV4Q291bnQ7ICsraSkgewotICogICAgICAgICAgICAgIG1XaWR0aHNbaV0gPSB2YWx1ZTsKLSAqICAgICAgICAgIH0KLSAqICAgICAgfQotICoKLSAqICAgICAgLy8gSWYgdGhlIGxhc3QgYXJndW1lbnQgaXMgVFtOXSBvciBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4sIHRoZSBmbGV4Q291bnQgd2lsbAotICogICAgICAvLyBiZSBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0ZWQgYW5kIHBhc3NlZCBieSB0aGUgQzJQYXJhbSBmYWN0b3J5IG1ldGhvZHMsIGUuZy4KLSAqICAgICAgLy8gICBpbnQgd2lkdGhzW10gPSB7IDEsIDIsIDMgfTsKLSAqICAgICAgLy8gICBDMlZpZGVvRmxleFdpZHRoc0dsb2JhbFBhcmFtOjphbGxvY191bmlxdWUod2lkdGhzKTsKLSAqICAgICAgdGVtcGxhdGU8dW5zaWduZWQgTj4KLSAqICAgICAgQzJWaWRlb0ZsZXhXaWR0aHNTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgY29uc3QgaW50MzJfdCgmaW5pdClbTl0pIHsKLSAqICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmxleENvdW50OyArK2kpIHsKLSAqICAgICAgICAgICAgICBtV2lkdGhzW2ldID0gaW5pdFtpXTsKLSAqICAgICAgICAgIH0KLSAqICAgICAgfQotICoKLSAqICAgICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKFZpZGVvRmxleFdpZHRocywgbVdpZHRocykKLSAqICAgICAgQzJGSUVMRChtV2lkdGhzLCAid2lkdGhzIikKLSAqICB9OwotICogIH5+fn5+fn5+fn5+fn4KLSAqCi0gKiAgfn5+fn5+fn5+fn5+fiAoLmNwcCkKLSAqICBzdHJ1Y3QgQzJWaWRlb0ZsZXhXaWR0aHNTdHJ1Y3QgewotICogICAgICBpbnQzMl90IG1XaWR0aHNbXTsKLSAqICAgICAgQzJWaWRlb0ZsZXhXaWR0aHNTdHJ1Y3QoKTsgLy8gbXVzdCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3RvcgotICoKLSAqICAgICAgREVGSU5FX0ZMRVhfQzJTVFJVQ1QoVmlkZW9GbGV4V2lkdGhzLCBtV2lkdGhzKQotICogIH0gQzJfUEFDSzsKLSAqCi0gKiAgREVTQ1JJQkVfQzJTVFJVQ1QoVmlkZW9GbGV4V2lkdGhzLCB7Ci0gKiAgICAgIEMyRklFTEQobVdpZHRocywgIndpZHRocyIpCi0gKiAgfSkKLSAqICB+fn5+fn5+fn5+fn5+Ci0gKgotICovCi0jZGVmaW5lIEMyRklFTEQobWVtYmVyLCBuYW1lKSBcCi0gIEMyRmllbGREZXNjcmlwdG9yKCYoKF90eXBlKikobnVsbHB0cikpLT5tZW1iZXIsIG5hbWUpLAotCi0vLy8gXGRlcHJlY2F0ZWQKLSNkZWZpbmUgQzJTT0xFX0ZJRUxEKG1lbWJlciwgbmFtZSkgXAotICBDMkZpZWxkRGVzY3JpcHRvcigmX3R5cGU6Om1lbWJlciwgbmFtZSwgMCkKLQotLy8vIERlZmluZSBhIHN0cnVjdHVyZSB3aXRoIG1hdGNoaW5nIGJhc2VJbmRleCBhbmQgc3RhcnQgZGVzY3JpYmluZyBpdHMgZmllbGRzLgotLy8vIFRoaXMgbXVzdCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KLSNkZWZpbmUgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChuYW1lKSBcCi0gICAgREVGSU5FX0MyU1RSVUNUKG5hbWUpIH0gIEMyX1BBQ0s7IFwKLSAgICBjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+IEMyIyNuYW1lIyNTdHJ1Y3Q6OmZpZWxkTGlzdCA9IHsKLQotLy8vIERlZmluZSBhIGZsZXhpYmxlIHN0cnVjdHVyZSB3aXRoIG1hdGNoaW5nIGJhc2VJbmRleCBhbmQgc3RhcnQgZGVzY3JpYmluZyBpdHMgZmllbGRzLgotLy8vIFRoaXMgbXVzdCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KLSNkZWZpbmUgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKG5hbWUsIGZsZXhNZW1iZXIpIFwKLSAgICBERUZJTkVfRkxFWF9DMlNUUlVDVChuYW1lLCBmbGV4TWVtYmVyKSB9IEMyX1BBQ0s7IFwKLSAgICBjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+IEMyIyNuYW1lIyNTdHJ1Y3Q6OmZpZWxkTGlzdCA9IHsKLQotLyoqCi0gKiBQYXJhbWV0ZXIgcmVmbGVjdG9yIGNsYXNzLgotICoKLSAqIFRoaXMgY2xhc3MgY2VudHJhbGl6ZXMgdGhlIGRlc2NyaXB0aW9uIG9mIHBhcmFtZXRlciBzdHJ1Y3R1cmVzLiBUaGlzIGNhbiBiZSBzaGFyZWQKLSAqIGJ5IG11bHRpcGxlIGNvbXBvbmVudHMgYXMgZGVzY3JpYmluZyBhIHBhcmFtZXRlciBkb2VzIG5vdCBpbXBseSBzdXBwb3J0IG9mIHRoYXQKLSAqIHBhcmFtZXRlci4gSG93ZXZlciwgZWFjaCBzdXBwb3J0ZWQgcGFyYW1ldGVyIGFuZCBhbnkgZGVwZW5kZW50IHN0cnVjdHVyZXMgd2l0aGluCi0gKiBtdXN0IGJlIGRlc2NyaWJlZCBieSB0aGUgcGFyYW1ldGVyIHJlZmxlY3RvciBwcm92aWRlZCBieSBhIGNvbXBvbmVudC4KLSAqLwotY2xhc3MgQzJQYXJhbVJlZmxlY3RvciB7Ci1wdWJsaWM6Ci0gICAgLyoqCi0gICAgICogIERlc2NyaWJlcyBhIHBhcmFtZXRlciBzdHJ1Y3R1cmUuCi0gICAgICoKLSAgICAgKiAgXHBhcmFtW2luXSBwYXJhbUluZGV4IHRoZSBiYXNlIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlCi0gICAgICoKLSAgICAgKiAgXHJldHVybiB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUKLSAgICAgKiAgXHJldHZhbCBudWxscHRyIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHJlZmxlY3RvcgotICAgICAqCi0gICAgICogIFRoaXMgbWV0aG9kcyBzaGFsbCBub3QgYmxvY2sgYW5kIHJldHVybiBpbW1lZGlhdGVseS4KLSAgICAgKgotICAgICAqICBcbm90ZSB0aGlzIGNsYXNzIGRvZXMgbm90IHRha2UgYSBzZXQgb2YgaW5kaWNlcyBiZWNhdXNlIHdlIHdvdWxkIHRoZW4gcHJlZmVyCi0gICAgICogIHRvIGFsc28gcmV0dXJuIGFueSBkZXBlbmRlbnQgc3RydWN0dXJlcywgYW5kIHdlIGRvbid0IHdhbnQgdGhpcyBsb2dpYyB0byBiZQotICAgICAqICByZXBlYXRlZCBpbiBlYWNoIHJlZmxlY3Rvci4gQWx0ZXJuYXRlbHksIHRoaXMgY291bGQganVzdCByZXR1cm4gYSBtYXAgb2YgYWxsCi0gICAgICogIGRlc2NyaXB0aW9ucywgYnV0IHdlIHdhbnQgdG8gY29uc2VydmUgbWVtb3J5IGlmIGNsaWVudCBvbmx5IHdhbnRzIHRoZSBkZXNjcmlwdGlvbgotICAgICAqICBvZiBhIGZldyBpbmRpY2VzLgotICAgICAqLwotICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzY3JpYmUoQzJQYXJhbTo6QmFzZUluZGV4IHBhcmFtSW5kZXgpID0gMDsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkMyUGFyYW1SZWZsZWN0b3IoKSA9IGRlZmF1bHQ7Ci19OwotCi0vKioKLSAqIEEgdXNlYWJsZSBzdXBwb3J0ZWQgdmFsdWVzIGZvciBhIGZpZWxkLgotICoKLSAqIFRoaXMgY2FuIGJlIGVpdGhlciBhIHJhbmdlIG9yIGEgc2V0IG9mIHZhbHVlcy4gVGhlIHJhbmdlIGNhbiBiZSBsaW5lYXIgb3IgZ2VvbWV0cmljIHdpdGggYQotICogY2xlYXIgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZSwgYW5kIGNhbiBoYXZlIGFuIG9wdGlvbmFsIHN0ZXAgc2l6ZSBvciBnZW9tZXRyaWMgcmF0aW8uIFZhbHVlcwotICogY2FuIG9wdGlvbmFsbHkgcmVwcmVzZW50IGZsYWdzLgotICoKLSAqIFxub3RlIERvIG5vdCB1c2UgZmxhZ3MgdG8gcmVwcmVzZW50IGJpdGZpZWxkcy4gVXNlIGluZGl2aWR1YWwgdmFsdWVzIG9yIHNlcGFyYXRlIGZpZWxkcyBpbnN0ZWFkLgotICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3RydWN0IEMyVHlwZWRGaWVsZFN1cHBvcnRlZFZhbHVlcyB7Ci0vL3B1YmxpYzoKLSAgICBlbnVtIFR5cGUgewotICAgICAgICBSQU5HRSwgICAgICAvLy88IGEgbnVtZXJpYyByYW5nZSB0aGF0IGNhbiBiZSBjb250aW51b3VzIG9yIGRpc2NyZXRlCi0gICAgICAgIFZBTFVFUywgICAgIC8vLzwgYSBsaXN0IG9mIHZhbHVlcwotICAgICAgICBGTEFHUyAgICAgICAvLy88IGEgbGlzdCBvZiBmbGFncyB0aGF0IGNhbiBiZSBPUi1lZAotICAgIH07Ci0KLSAgICBUeXBlIHR5cGU7Ci0KLSAgICBzdHJ1Y3QgewotICAgICAgICBUIG1pbjsKLSAgICAgICAgVCBtYXg7Ci0gICAgICAgIFQgc3RlcDsKLSAgICAgICAgVCBub207Ci0gICAgICAgIFQgZGVub207Ci0gICAgfSByYW5nZTsKLSAgICBzdGQ6OnZlY3RvcjxUPiB2YWx1ZXM7Ci0KLSAgICBDMlR5cGVkRmllbGRTdXBwb3J0ZWRWYWx1ZXMoVCBtaW4sIFQgbWF4LCBUIHN0ZXAgPSBUKHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlID8gMCA6IDEpKQotICAgICAgICA6IHR5cGUoUkFOR0UpLAotICAgICAgICAgIHJhbmdle21pbiwgbWF4LCBzdGVwLCAoVCkxLCAoVCkxfSB7IH0KLQotICAgIEMyVHlwZWRGaWVsZFN1cHBvcnRlZFZhbHVlcyhUIG1pbiwgVCBtYXgsIFQgbm9tLCBUIGRlbikgOgotICAgICAgICB0eXBlKFJBTkdFKSwKLSAgICAgICAgcmFuZ2V7bWluLCBtYXgsIChUKTAsIG5vbSwgZGVufSB7IH0KLQotICAgIEMyVHlwZWRGaWVsZFN1cHBvcnRlZFZhbHVlcyhib29sIGZsYWdzLCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gbGlzdCkgOgotICAgICAgICB0eXBlKGZsYWdzID8gRkxBR1MgOiBWQUxVRVMpLAotICAgICAgICB2YWx1ZXMobGlzdCkge30KLX07Ci0KLS8qKgotICogR2VuZXJpYyBzdXBwb3J0ZWQgdmFsdWVzIGZvciBhIGZpZWxkLgotICoKLSAqIFRoaXMgY2FuIGJlIGVpdGhlciBhIHJhbmdlIG9yIGEgc2V0IG9mIHZhbHVlcy4gVGhlIHJhbmdlIGNhbiBiZSBsaW5lYXIgb3IgZ2VvbWV0cmljIHdpdGggYQotICogY2xlYXIgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZSwgYW5kIGNhbiBoYXZlIGFuIG9wdGlvbmFsIHN0ZXAgc2l6ZSBvciBnZW9tZXRyaWMgcmF0aW8uIFZhbHVlcwotICogY2FuIG9wdGlvbmFsbHkgcmVwcmVzZW50IGZsYWdzLgotICoKLSAqIFxub3RlIERvIG5vdCB1c2UgZmxhZ3MgdG8gcmVwcmVzZW50IGJpdGZpZWxkcy4gVXNlIGluZGl2aWR1YWwgdmFsdWVzIG9yIHNlcGFyYXRlIGZpZWxkcyBpbnN0ZWFkLgotICovCi1zdHJ1Y3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyB7Ci0vL3B1YmxpYzoKLSAgICBlbnVtIFR5cGUgewotICAgICAgICBSQU5HRSwgICAgICAvLy88IGEgbnVtZXJpYyByYW5nZSB0aGF0IGNhbiBiZSBjb250aW51b3VzIG9yIGRpc2NyZXRlCi0gICAgICAgIFZBTFVFUywgICAgIC8vLzwgYSBsaXN0IG9mIHZhbHVlcwotICAgICAgICBGTEFHUyAgICAgICAvLy88IGEgbGlzdCBvZiBmbGFncyB0aGF0IGNhbiBiZSBPUi1lZAotICAgIH07Ci0KLSAgICBUeXBlIHR5cGU7Ci0KLSAgICB0eXBlZGVmIEMyVmFsdWU6OlByaW1pdGl2ZSBQcmltaXRpdmU7Ci0KLSAgICBzdHJ1Y3QgewotICAgICAgICBQcmltaXRpdmUgbWluOwotICAgICAgICBQcmltaXRpdmUgbWF4OwotICAgICAgICBQcmltaXRpdmUgc3RlcDsKLSAgICAgICAgUHJpbWl0aXZlIG5vbTsKLSAgICAgICAgUHJpbWl0aXZlIGRlbm9tOwotICAgIH0gcmFuZ2U7Ci0gICAgc3RkOjp2ZWN0b3I8UHJpbWl0aXZlPiB2YWx1ZXM7Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoVCBtaW4sIFQgbWF4LCBUIHN0ZXAgPSBUKHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlID8gMCA6IDEpKQotICAgICAgICA6IHR5cGUoUkFOR0UpLAotICAgICAgICAgIHJhbmdle21pbiwgbWF4LCBzdGVwLCAoVCkxLCAoVCkxfSB7IH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhUIG1pbiwgVCBtYXgsIFQgbm9tLCBUIGRlbikgOgotICAgICAgICB0eXBlKFJBTkdFKSwKLSAgICAgICAgcmFuZ2V7bWluLCBtYXgsIChUKTAsIG5vbSwgZGVufSB7IH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhib29sIGZsYWdzLCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gbGlzdCkKLSAgICAgICAgOiB0eXBlKGZsYWdzID8gRkxBR1MgOiBWQUxVRVMpLAotICAgICAgICAgIHJhbmdleyhUKTAsIChUKTAsIChUKTAsIChUKTAsIChUKTB9IHsKLSAgICAgICAgZm9yKFQgdmFsdWUgOiBsaXN0KSB7Ci0gICAgICAgICAgICB2YWx1ZXMuZW1wbGFjZV9iYWNrKHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEU9ZGVjbHR5cGUoQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkVmFsdWVzRm9yKCooVCopMCkpPgotICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoYm9vbCBmbGFncywgY29uc3QgVCopCi0gICAgICAgIDogdHlwZShmbGFncyA/IEZMQUdTIDogVkFMVUVTKSwKLSAgICAgICAgICByYW5nZXsoVCkwLCAoVCkwLCAoVCkwLCAoVCkwLCAoVCkwfSB7Ci0gICAgICAgICAgICAgIEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZF92YWx1ZXNfdHlwZSBuYW1lZCA9IEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0ZvcigqKFQqKTApOwotICAgICAgICBmb3IgKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZF92YWx1ZV90eXBlICZpdGVtIDogbmFtZWQpIHsKLSAgICAgICAgICAgIHZhbHVlcy5lbXBsYWNlX2JhY2soaXRlbS5zZWNvbmQpOwotICAgICAgICB9Ci0gICAgfQotfTsKLQotLy8vIEB9Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQzJQQVJBTV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL2luY2x1ZGUvQzJQYXJhbURlZi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL2luY2x1ZGUvQzJQYXJhbURlZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzY5NjE3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9pbmNsdWRlL0MyUGFyYW1EZWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDkwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqIFxmaWxlCi0gKiBUZW1wbGF0ZXMgdXNlZCB0byBkZWNsYXJlIHBhcmFtZXRlcnMuCi0gKi8KLSNpZm5kZWYgQzJQQVJBTV9ERUZfSF8KLSNkZWZpbmUgQzJQQVJBTV9ERUZfSF8KLQotI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgotCi0jaW5jbHVkZSA8QzJQYXJhbS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vLyBcYWRkdG9ncm91cCBQYXJhbWV0ZXJzCi0vLy8gQHsKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09IFVUSUxJVFkgVEVNUExBVEVTIEZPUiBQQVJBTUVURVIgREVGSU5JVElPTlMgPT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLS8vLyBcYWRkdG9ncm91cCBpbnRlcm5hbAotLy8vIEB7Ci0KLS8vLyBIZWxwZXIgY2xhc3MgdGhhdCBjaGVja3MgaWYgYSB0eXBlIGhhcyBlcXVhbGl0eSBhbmQgaW5lcXVhbGl0eSBvcGVyYXRvcnMuCi1zdHJ1Y3QgQzJfSElERSBfQzJDb21wYXJhYmxlX2ltcGwKLXsKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTLCB0eXBlbmFtZT1kZWNsdHlwZShTKCkgPT0gUygpKT4KLSAgICBzdGF0aWMgc3RkOjp0cnVlX3R5cGUgX190ZXN0RVEoaW50KTsKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4KLSAgICBzdGF0aWMgc3RkOjpmYWxzZV90eXBlIF9fdGVzdEVRKC4uLik7Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTLCB0eXBlbmFtZT1kZWNsdHlwZShTKCkgIT0gUygpKT4KLSAgICBzdGF0aWMgc3RkOjp0cnVlX3R5cGUgX190ZXN0TkUoaW50KTsKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4KLSAgICBzdGF0aWMgc3RkOjpmYWxzZV90eXBlIF9fdGVzdE5FKC4uLik7Ci19OwotCi0vKioKLSAqIEhlbHBlciB0ZW1wbGF0ZSB0aGF0IHJldHVybnMgaWYgYSB0eXBlIGhhcyBlcXVhbGl0eSBhbmQgaW5lcXVhbGl0eSBvcGVyYXRvcnMuCi0gKgotICogVXNlIGFzIF9DMkNvbXBhcmFibGU8dHlwZW5hbWUgUz46OnZhbHVlLgotICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBTPgotc3RydWN0IEMyX0hJREUgX0MyQ29tcGFyYWJsZQotICAgIDogcHVibGljIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgZGVjbHR5cGUoX0MyQ29tcGFyYWJsZV9pbXBsOjpfX3Rlc3RFUTxTPigwKSk6OnZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBkZWNsdHlwZShfQzJDb21wYXJhYmxlX2ltcGw6Ol9fdGVzdE5FPFM+KDApKTo6dmFsdWU+IHsKLX07Ci0KLS8vLyAgSGVscGVyIGNsYXNzIHRoYXQgY2hlY2tzIGlmIGEgdHlwZSBoYXMgYSBiYXNlSW5kZXggY29uc3RhbnQuCi1zdHJ1Y3QgQzJfSElERSBfQzJCYXNlSW5kZXhIZWxwZXJfaW1wbAotewotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFMsIGludD1TOjpiYXNlSW5kZXg+Ci0gICAgc3RhdGljIHN0ZDo6dHJ1ZV90eXBlIF9fdGVzdEJhc2VJbmRleChpbnQpOwotICAgIHRlbXBsYXRlPHR5cGVuYW1lPgotICAgIHN0YXRpYyBzdGQ6OmZhbHNlX3R5cGUgX190ZXN0QmFzZUluZGV4KC4uLik7Ci19OwotCi0vLy8gSGVscGVyIHRlbXBsYXRlIHRoYXQgdmVyaWZpZXMgYSB0eXBlJ3MgYmFzZUluZGV4IGFuZCBjcmVhdGVzIGl0IGlmIHRoZSB0eXBlIGRvZXMgbm90IGhhdmUgb25lLgotdGVtcGxhdGU8dHlwZW5hbWUgUywgaW50IEJhc2VJbmRleCwKLSAgICAgICAgYm9vbCBIYXNCYXNlPWRlY2x0eXBlKF9DMkJhc2VJbmRleEhlbHBlcl9pbXBsOjpfX3Rlc3RCYXNlSW5kZXg8Uz4oMCkpOjp2YWx1ZT4KLXN0cnVjdCBDMl9ISURFIEMyQmFzZUluZGV4T3ZlcnJpZGUgewotICAgIC8vIFRPRE86IHdoYXQgaWYgd2UgYWxsb3cgc3RydWN0cyB3aXRob3V0IGJhc2VJbmRleD8KLSAgICBzdGF0aWNfYXNzZXJ0KEJhc2VJbmRleCA9PSBTOjpiYXNlSW5kZXgsICJiYXNlSW5kZXggZGlmZmVycyBmcm9tIHN0cnVjdHVyZSIpOwotfTsKLQotLy8vIFNwZWNpYWxpemF0aW9uIGZvciB0eXBlcyB3aXRob3V0IGEgYmFzZUluZGV4LgotdGVtcGxhdGU8dHlwZW5hbWUgUywgaW50IEJhc2VJbmRleD4KLXN0cnVjdCBDMl9ISURFIEMyQmFzZUluZGV4T3ZlcnJpZGU8UywgQmFzZUluZGV4LCBmYWxzZT4gewotcHVibGljOgotICAgIGVudW0gOiB1aW50MzJfdCB7Ci0gICAgICAgIGJhc2VJbmRleCA9IEJhc2VJbmRleCwgLy8vPCBiYXNlSW5kZXggb3ZlcnJpZGUuCi0gICAgfTsKLX07Ci0KLS8vLyBIZWxwZXIgdGVtcGxhdGUgdGhhdCBhZGRzIGEgYmFzZUluZGV4IHRvIGEgdHlwZSBpZiBpdCBkb2VzIG5vdCBoYXZlIG9uZS4KLXRlbXBsYXRlPHR5cGVuYW1lIFMsIGludCBCYXNlSW5kZXg+Ci1zdHJ1Y3QgQzJfSElERSBDMkFkZEJhc2VJbmRleCA6IHB1YmxpYyBTLCBwdWJsaWMgQzJCYXNlSW5kZXhPdmVycmlkZTxTLCBCYXNlSW5kZXg+IHt9OwotCi0vKioKLSAqIFxicmllZiBIZWxwZXIgY2xhc3MgdG8gY2hlY2sgc3RydWN0IHJlcXVpcmVtZW50cyBmb3IgcGFyYW1ldGVycy4KLSAqCi0gKiBGZWF0dXJlczoKLSAqICAtIHZlcmlmeSBkZWZhdWx0IGNvbnN0cnVjdG9yLCBubyB2aXJ0dWFsIG1ldGhvZHMsIGFuZCBubyBlcXVhbGl0eSBvcGVyYXRvcnMuCi0gKiAgLSBleHBvc2UgdHlwZUluZGV4LCBhbmQgbm9uLWZsZXggZmxleFNpemUuCi0gKi8KLXRlbXBsYXRlPHR5cGVuYW1lIFMsIGludCBCYXNlSW5kZXgsIHVuc2lnbmVkIFR5cGVJbmRleD4KLXN0cnVjdCBDMl9ISURFIEMyU3RydWN0Q2hlY2sgewotICAgIHN0YXRpY19hc3NlcnQoCi0gICAgICAgICAgICBzdGQ6OmlzX2RlZmF1bHRfY29uc3RydWN0aWJsZTxTPjo6dmFsdWUsICJDMiBzdHJ1Y3R1cmUgbXVzdCBoYXZlIGRlZmF1bHQgY29uc3RydWN0b3IiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX3BvbHltb3JwaGljPFM+Ojp2YWx1ZSwgIkMyIHN0cnVjdHVyZSBtdXN0IG5vdCBoYXZlIHZpcnR1YWwgbWV0aG9kcyIpOwotICAgIHN0YXRpY19hc3NlcnQoIV9DMkNvbXBhcmFibGU8Uz46OnZhbHVlLCAiQzIgc3RydWN0dXJlIG11c3Qgbm90IGhhdmUgb3BlcmF0b3I9PSBvciAhPSIpOwotCi1wdWJsaWM6Ci0gICAgZW51bSA6IHVpbnQzMl90IHsKLSAgICAgICAgdHlwZUluZGV4ID0gQmFzZUluZGV4IHwgVHlwZUluZGV4Ci0gICAgfTsKLQotcHJvdGVjdGVkOgotICAgIGVudW0gOiB1aW50MzJfdCB7Ci0gICAgICAgIGZsZXhTaXplID0gMCwgLy8gVE9ETzogaXMgdGhpcyBzdGlsbCBuZWVkZWQ/IHRoaXMgbWF5IGJlIGNvbmZ1c2luZy4KLSAgICB9OwotfTsKLQotLy8vIEhlbHBlciBjbGFzcyB0aGF0IGNoZWNrcyBpZiBhIHR5cGUgaGFzIGFuIGludGVnZXIgZmxleFNpemUgbWVtYmVyLgotc3RydWN0IEMyX0hJREUgX0MyRmxleGlibGVfaW1wbCB7Ci0gICAgLy8vIHNwZWNpYWxpemF0aW9uIGZvciB0eXBlcyB0aGF0IGhhdmUgYSBmbGV4U2l6ZSBtZW1iZXIKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTLCB1bnNpZ25lZD1TOjpmbGV4U2l6ZT4KLSAgICBzdGF0aWMgc3RkOjp0cnVlX3R5cGUgX190ZXN0RmxleFNpemUoaW50KTsKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4KLSAgICBzdGF0aWMgc3RkOjpmYWxzZV90eXBlIF9fdGVzdEZsZXhTaXplKC4uLik7Ci19OwotCi0vLy8gSGVscGVyIHRlbXBsYXRlIHRoYXQgcmV0dXJucyBpZiBhIHR5cGUgaGFzIGFuIGludGVnZXIgZmxleFNpemUgbWVtYmVyLgotdGVtcGxhdGU8dHlwZW5hbWUgUz4KLXN0cnVjdCBDMl9ISURFIF9DMkZsZXhpYmxlCi0gICAgOiBwdWJsaWMgc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLCBkZWNsdHlwZShfQzJGbGV4aWJsZV9pbXBsOjpfX3Rlc3RGbGV4U2l6ZTxTPigwKSk6OnZhbHVlPiB7Ci19OwotCi0vLy8gTWFjcm8gdG8gdGVzdCBpZiBhIHR5cGUgaXMgZmxleGlibGUgKGhhcyBhIGZsZXhTaXplIG1lbWJlcikuCi0jZGVmaW5lIElGX0ZMRVhJQkxFKFMpIEVOQUJMRV9JRihfQzJGbGV4aWJsZTxTPjo6dmFsdWUpCi0vLy8gU2hvcnRoYW5kIGZvciBzdGQ6OmVuYWJsZV9pZgotI2RlZmluZSBFTkFCTEVfSUYoY29uZCkgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8Y29uZD46OnR5cGUKLQotLy8vIEhlbHBlciB0ZW1wbGF0ZSB0aGF0IGV4cG9zZXMgdGhlIGZsZXhpYmxlIHN1YnR5cGUgb2YgYSBzdHJ1Y3QuCi10ZW1wbGF0ZTx0eXBlbmFtZSBTLCB0eXBlbmFtZSBFPXZvaWQ+Ci1zdHJ1Y3QgQzJfSElERSBfQzJGbGV4SGVscGVyIHsKLSAgICB0eXBlZGVmIHZvaWQgZmxleFR5cGU7Ci0gICAgZW51bSA6IHVpbnQzMl90IHsgZmxleFNpemUgPSAwIH07Ci19OwotCi0vLy8gU3BlY2lhbGl6YXRpb24gZm9yIGZsZXhpYmxlIHR5cGVzLgotdGVtcGxhdGU8dHlwZW5hbWUgUz4KLXN0cnVjdCBDMl9ISURFIF9DMkZsZXhIZWxwZXI8UywKLSAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IXN0ZDo6aXNfdm9pZDx0eXBlbmFtZSBTOjpmbGV4TWVtYmVyVHlwZT46OnZhbHVlPjo6dHlwZT4gewotICAgIHR5cGVkZWYgdHlwZW5hbWUgX0MyRmxleEhlbHBlcjx0eXBlbmFtZSBTOjpmbGV4TWVtYmVyVHlwZT46OmZsZXhUeXBlIGZsZXhUeXBlOwotICAgIGVudW0gOiB1aW50MzJfdCB7IGZsZXhTaXplID0gX0MyRmxleEhlbHBlcjx0eXBlbmFtZSBTOjpmbGV4TWVtYmVyVHlwZT46OmZsZXhTaXplIH07Ci19OwotCi0vLy8gU3BlY2lhbGl6YXRpb24gZm9yIGZsZXggYXJyYXlzLgotdGVtcGxhdGU8dHlwZW5hbWUgUz4KLXN0cnVjdCBDMl9ISURFIF9DMkZsZXhIZWxwZXI8U1tdLAotICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3ZvaWQ8dHlwZW5hbWUgX0MyRmxleEhlbHBlcjxTPjo6ZmxleFR5cGU+Ojp2YWx1ZT46OnR5cGU+IHsKLSAgICB0eXBlZGVmIFMgZmxleFR5cGU7Ci0gICAgZW51bSA6IHVpbnQzMl90IHsgZmxleFNpemUgPSBzaXplb2YoUykgfTsKLX07Ci0KLS8qKgotICogXGJyaWVmIEhlbHBlciBjbGFzcyB0byBjaGVjayBmbGV4aWJsZSBzdHJ1Y3QgcmVxdWlyZW1lbnRzIGFuZCBhZGQgY29tbW9uIG9wZXJhdGlvbnMuCi0gKgotICogRmVhdHVyZXM6Ci0gKiAgLSBleHBvc2UgYmFzZUluZGV4IGFuZCBmaWVsZExpc3QgKHRoaXMgaXMgbm9ybWFsbHkgaW5oZXJpdGVkIGZyb20gdGhlIHN0cnVjdCwgYnV0IGZsZXhpYmxlCi0gKiAgICBzdHJ1Y3RzIGNhbm5vdCBiZSBiYXNlIGNsYXNzZXMgYW5kIHRodXMgaW5oZXJpdGVkIGZyb20pCi0gKiAgLSBkaXNhYmxlIGNvcHkgYXNzaWdubWVudCBhbmQgY29uc3RydWN0aW9uIChUT0RPOiB0aGlzIGlzIGFscmVhZHkgZG9uZSBpbiB0aGUgRkxFWCBtYWNybyBmb3IgdGhlCi0gKiAgICBmbGV4aWJsZSBzdHJ1Y3QsIHNvIG1heSBub3QgYmUgbmVlZGVkIGhlcmUpCi0gKi8KLXRlbXBsYXRlPHR5cGVuYW1lIFMsIGludCBCYXNlSW5kZXgsIHVuc2lnbmVkIFR5cGVJbmRleD4KLXN0cnVjdCBDMl9ISURFIEMyRmxleFN0cnVjdENoZWNrIDogcHVibGljIEMyU3RydWN0Q2hlY2s8UywgQmFzZUluZGV4LCBUeXBlSW5kZXg+IHsKLXB1YmxpYzoKLSAgICBlbnVtIDogdWludDMyX3QgewotICAgICAgICAvLy8gXGhpZGVpbml0aWFsaXplcgotICAgICAgICBiYXNlSW5kZXggPSBCYXNlSW5kZXggfCBDMlBhcmFtOjpCYXNlSW5kZXg6Ol9rRmxleGlibGVGbGFnLCAvLy88IGZsZXhpYmxlIHN0cnVjdCBiYXNlLWluZGV4Ci0gICAgfTsKLQotICAgIGNvbnN0IHN0YXRpYyBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkTGlzdDsgLy8gVE9ETyBhc3NpZ24gaGVyZQotCi0gICAgLy8gZGVmYXVsdCBjb25zdHJ1Y3RvciBuZWVkZWQgYmVjYXVzZSBvZiB0aGUgZGlzYWJsZWQgY29weSBjb25zdHJ1Y3RvcgotICAgIGlubGluZSBDMkZsZXhTdHJ1Y3RDaGVjaygpID0gZGVmYXVsdDsKLQotcHJvdGVjdGVkOgotICAgIC8vIGNhbm5vdCBjb3B5IGZsZXhpYmxlIHBhcmFtcwotICAgIEMyRmxleFN0cnVjdENoZWNrKGNvbnN0IEMyRmxleFN0cnVjdENoZWNrPFMsIEJhc2VJbmRleCwgVHlwZUluZGV4PiAmKSA9IGRlbGV0ZTsKLSAgICBDMkZsZXhTdHJ1Y3RDaGVjayYgb3BlcmF0b3I9IChjb25zdCBDMkZsZXhTdHJ1Y3RDaGVjazxTLCBCYXNlSW5kZXgsIFR5cGVJbmRleD4gJikgPSBkZWxldGU7Ci0KLSAgICAvLyBjb25zdGFudHMgdXNlZCBmb3IgaGVscGVyIG1ldGhvZHMKLSAgICBlbnVtIDogdWludDMyX3QgewotICAgICAgICAvLy8gXGhpZGVpbml0aWFsaXplcgotICAgICAgICBmbGV4U2l6ZSA9IF9DMkZsZXhIZWxwZXI8Uz46OmZsZXhTaXplLCAvLy88IHNpemUgb2YgZmxleGlibGUgdHlwZQotICAgICAgICAvLy8gXGhpZGVpbml0aWFsaXplcgotICAgICAgICBtYXhTaXplID0gKHVpbnQzMl90KXN0ZDo6bWluKChzaXplX3QpVUlOVDMyX01BWCwgU0laRV9NQVgpLCAvLyBUT0RPOiBpcyB0aGlzIGFsd2F5cyB1MzIgbWF4PwotICAgICAgICAvLy8gXGhpZGVpbml0aWFsaXplcgotICAgICAgICBiYXNlU2l6ZSA9IHNpemVvZihTKSArIHNpemVvZihDMlBhcmFtKSwgLy8vPCBzaXplIG9mIHRoZSBiYXNlIHBhcmFtCi0gICAgfTsKLQotICAgIC8vLyByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgc2l6ZSBvZiB0aGlzIHBhcmFtIHdpdGggZmxleENvdW50LCBvciAwIGlmIGl0IHdvdWxkIG92ZXJmbG93LgotICAgIGlubGluZSBzdGF0aWMgc2l6ZV90IGNhbGNTaXplKHNpemVfdCBmbGV4Q291bnQsIHNpemVfdCBzaXplID0gYmFzZVNpemUpIHsKLSAgICAgICAgaWYgKGZsZXhDb3VudCA8PSAobWF4U2l6ZSAtIHNpemUpIC8gUzo6ZmxleFNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiBzaXplICsgUzo6ZmxleFNpemUgKiBmbGV4Q291bnQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLy8vIGR5bmFtaWMgbmV3IG9wZXJhdG9yIHVzYWJsZSBmb3IgcGFyYW1zIG9mIHR5cGUgUwotICAgIGlubGluZSB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUsIHNpemVfdCBmbGV4Q291bnQpIG5vZXhjZXB0IHsKLSAgICAgICAgLy8gVE9ETzogYXNzZXJ0KHNpemUgPT0gYmFzZVNpemUpOwotICAgICAgICBzaXplID0gY2FsY1NpemUoZmxleENvdW50LCBzaXplKTsKLSAgICAgICAgaWYgKHNpemUgPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gOjpvcGVyYXRvciBuZXcoc2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotfTsKLQotLy8gVE9ETzogdGhpcyBwcm9iYWJseSBkb2VzIG5vdCB3b3JrLgotLy8vIEV4cG9zZSBmaWVsZExpc3QgZnJvbSBzdWJDbGFzczsKLXRlbXBsYXRlPHR5cGVuYW1lIFMsIGludCBCYXNlSW5kZXgsIHVuc2lnbmVkIFR5cGVJbmRleD4KLWNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gQzJGbGV4U3RydWN0Q2hlY2s8UywgQmFzZUluZGV4LCBUeXBlSW5kZXg+OjpmaWVsZExpc3QgPSBTOjpmaWVsZExpc3Q7Ci0KLS8vLyBEZWZpbmUgRnJvbSgpIGNhc3Qgb3BlcmF0b3JzIGZvciBwYXJhbXMuCi0jZGVmaW5lIERFRklORV9DQVNUX09QRVJBVE9SUyhfdHlwZSkgXAotICAgIGlubGluZSBzdGF0aWMgX3R5cGUqIEZyb20oQzJQYXJhbSAqb3RoZXIpIHsgXAotICAgICAgICByZXR1cm4gKF90eXBlKilDMlBhcmFtOjppZlN1aXRhYmxlKCBcCi0gICAgICAgICAgICAgICAgb3RoZXIsIHNpemVvZihfdHlwZSksX3R5cGU6OnR5cGVJbmRleCwgX3R5cGU6OmZsZXhTaXplLCBcCi0gICAgICAgICAgICAgICAgKF90eXBlOjp0eXBlSW5kZXggJiBUOjpJbmRleDo6a0RpclVuZGVmaW5lZCkgIT0gVDo6SW5kZXg6OmtEaXJVbmRlZmluZWQpOyBcCi0gICAgfSBcCi0gICAgaW5saW5lIHN0YXRpYyBjb25zdCBfdHlwZSogRnJvbShjb25zdCBDMlBhcmFtICpvdGhlcikgeyBcCi0gICAgICAgIHJldHVybiBjb25zdF9jYXN0PGNvbnN0IF90eXBlKj4oRnJvbShjb25zdF9jYXN0PEMyUGFyYW0gKj4ob3RoZXIpKSk7IFwKLSAgICB9IFwKLSAgICBpbmxpbmUgc3RhdGljIF90eXBlKiBGcm9tKHN0ZDo6bnVsbHB0cl90KSB7IHJldHVybiBudWxscHRyOyB9IFwKLQotLyoqCi0gKiBEZWZpbmUgZmxleGlibGUgYWxsb2NhdG9ycyAoYWxsb2Nfc2hhcmVkIG9yIGFsbG9jX3VuaXF1ZSkgZm9yIGZsZXhpYmxlIHBhcmFtcy4KLSAqICAtIFA6OmFsbG9jX3h5eihmbGV4Q291bnQsIGFyZ3MuLi4pOiBhbGxvY2F0ZSBmb3IgZ2l2ZW4gZmxleC1jb3VudC4KLSAqICAtIFA6OmFsbG9jX3h5eihhcmdzLi4uLCBUW10pOiBhbGxvY2F0ZSBmb3Igc2l6ZSBvZiAoYW5kIHdpdGgpIGluaXQgYXJyYXkuCi0gKiAgLSBQOjphbGxvY194eXooVFtdKTogYWxsb2NhdGUgZm9yIHNpemUgb2YgKGFuZCB3aXRoKSBpbml0IGFycmF5IHdpdGggbm8gb3RoZXIgYXJncy4KLSAqICAtIFA6OmFsbG9jX3h5eihhcmdzLi4uLCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4pOiBhbGxvY2F0ZSBmb3Igc2l6ZSBvZiAoYW5kIHdpdGgpIGluaXRpYWxpemVyCi0gKiAgICBsaXN0LgotICovCi0jZGVmaW5lIERFRklORV9GTEVYSUJMRV9BTExPQyhfdHlwZSwgUywgcHRyKSBcCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4gXAotICAgIGlubGluZSBzdGF0aWMgc3RkOjpwdHIjI19wdHI8X3R5cGU+IGFsbG9jXyMjcHRyKHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgeyBcCi0gICAgICAgIHJldHVybiBzdGQ6OnB0ciMjX3B0cjxfdHlwZT4obmV3KGZsZXhDb3VudCkgX3R5cGUoZmxleENvdW50LCBhcmdzLi4uKSk7IFwKLSAgICB9IFwKLSAgICAvKiBOT1RFOiB1bmZvcnR1bmF0ZWx5IHRoaXMgaXMgbm90IHN1cHBvcnRlZCBieSBjbGFuZyB5ZXQgKi8gXAotICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3MsIHR5cGVuYW1lIFU9dHlwZW5hbWUgUzo6ZmxleFR5cGUsIHVuc2lnbmVkIE4+IFwKLSAgICBpbmxpbmUgc3RhdGljIHN0ZDo6cHRyIyNfcHRyPF90eXBlPiBhbGxvY18jI3B0cihjb25zdCBBcmdzKCYuLi4gYXJncyksIGNvbnN0IFUoJmluaXQpW05dKSB7IFwKLSAgICAgICAgcmV0dXJuIHN0ZDo6cHRyIyNfcHRyPF90eXBlPihuZXcoTikgX3R5cGUoTiwgYXJncy4uLiwgaW5pdCkpOyBcCi0gICAgfSBcCi0gICAgLyogc28gZm9yIG5vdywgc3BlY2lhbGl6ZSBmb3Igbm8gYXJncyAqLyBcCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVT10eXBlbmFtZSBTOjpmbGV4VHlwZSwgdW5zaWduZWQgTj4gXAotICAgIGlubGluZSBzdGF0aWMgc3RkOjpwdHIjI19wdHI8X3R5cGU+IGFsbG9jXyMjcHRyKGNvbnN0IFUoJmluaXQpW05dKSB7IFwKLSAgICAgICAgcmV0dXJuIHN0ZDo6cHRyIyNfcHRyPF90eXBlPihuZXcoTikgX3R5cGUoTiwgaW5pdCkpOyBcCi0gICAgfSBcCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncywgdHlwZW5hbWUgVT10eXBlbmFtZSBTOjpmbGV4VHlwZT4gXAotICAgIGlubGluZSBzdGF0aWMgc3RkOjpwdHIjI19wdHI8X3R5cGU+IGFsbG9jXyMjcHRyKCBcCi0gICAgICAgICAgICBjb25zdCBBcmdzKCYuLi4gYXJncyksIGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxVPiAmaW5pdCkgeyBcCi0gICAgICAgIHJldHVybiBzdGQ6OnB0ciMjX3B0cjxfdHlwZT4obmV3KGluaXQuc2l6ZSgpKSBfdHlwZShpbml0LnNpemUoKSwgYXJncy4uLiwgaW5pdCkpOyBcCi0gICAgfSBcCi0KLS8qKgotICogRGVmaW5lIGZsZXhpYmxlIG1ldGhvZHMgYWxsb2Nfc2hhcmVkLCBhbGxvY191bmlxdWUgYW5kIGZsZXhDb3VudC4KLSAqLwotI2RlZmluZSBERUZJTkVfRkxFWElCTEVfTUVUSE9EUyhfdHlwZSwgUykgXAotICAgIERFRklORV9GTEVYSUJMRV9BTExPQyhfdHlwZSwgUywgc2hhcmVkKSBcCi0gICAgREVGSU5FX0ZMRVhJQkxFX0FMTE9DKF90eXBlLCBTLCB1bmlxdWUpIFwKLSAgICBpbmxpbmUgc2l6ZV90IGZsZXhDb3VudCgpIGNvbnN0IHsgXAotICAgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihfdHlwZSkgPT0gX3R5cGU6OmJhc2VTaXplLCAiaW5jb3JyZWN0IGJhc2VTaXplIik7IFwKLSAgICAgICAgc2l6ZV90IHN6ID0gdGhpcy0+c2l6ZSgpOyBcCi0gICAgICAgIGlmIChzeiA+PSBzaXplb2YoX3R5cGUpKSB7IFwKLSAgICAgICAgICAgIHJldHVybiAoc3ogLSBzaXplb2YoX3R5cGUpKSAvIF90eXBlOjpmbGV4U2l6ZTsgXAotICAgICAgICB9IFwKLSAgICAgICAgcmV0dXJuIDA7IFwKLSAgICB9IFwKLQotLy8vIE1hcmsgZmxleGlibGUgbWVtYmVyIHZhcmlhYmxlIGFuZCBtYWtlIHN0cnVjdHVyZSBmbGV4aWJsZS4KLSNkZWZpbmUgRkxFWChjbHMsIG0pIFwKLSAgICBDMl9ET19OT1RfQ09QWShjbHMpIFwKLXByaXZhdGU6IFwKLSAgICBDMlBBUkFNX01BS0VfRlJJRU5EUyBcCi0gICAgLyogZGVmYXVsdCBjb25zdHJ1Y3RvciB3aXRoIGZsZXhDb3VudCAqLyBcCi0gICAgaW5saW5lIGNscyhzaXplX3QpIDogY2xzKCkge30gXAotICAgIC8qKiBcaWYgMCAqLyBcCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUsIHR5cGVuYW1lPiBmcmllbmQgc3RydWN0IF9DMkZsZXhIZWxwZXI7IFwKLSAgICB0eXBlZGVmIGRlY2x0eXBlKG0pIGZsZXhNZW1iZXJUeXBlOyBcCi1wdWJsaWM6IFwKLSAgICAvKiBjb25zdGV4cHIgc3RhdGljIGZsZXhNZW1iZXJUeXBlIGNsczo6KiBmbGV4TWVtYmVyID0gJmNsczo6bTsgKi8gXAotICAgIHR5cGVkZWYgdHlwZW5hbWUgX0MyRmxleEhlbHBlcjxmbGV4TWVtYmVyVHlwZT46OmZsZXhUeXBlIGZsZXhUeXBlOyBcCi0gICAgc3RhdGljX2Fzc2VydChcCi0gICAgICAgICAgICAhc3RkOjppc192b2lkPGZsZXhUeXBlPjo6dmFsdWUsIFwKLSAgICAgICAgICAgICJtZW1iZXIgaXMgbm90IGZsZXhpYmxlLCBvciBhIGZsZXhpYmxlIGFycmF5IG9mIGEgZmxleGlibGUgdHlwZSIpOyBcCi0gICAgZW51bSA6IHVpbnQzMl90IHsgZmxleFNpemUgPSBfQzJGbGV4SGVscGVyPGZsZXhNZW1iZXJUeXBlPjo6ZmxleFNpemUgfTsgXAotICAgIC8qKiBcZW5kaWYgKi8gXAotCi0vLy8gQH0KLQotLyoqCi0gKiBHbG9iYWwtcGFyYW1ldGVyIHRlbXBsYXRlLgotICoKLSAqIEJhc2UgdGVtcGxhdGUgdG8gZGVmaW5lIGEgZ2xvYmFsIHNldHRpbmcvdHVuaW5nIG9yIGluZm8gYmFzZWQgb24gYSBzdHJ1Y3R1cmUgYW5kCi0gKiBhbiBvcHRpb25hbCBCYXNlSW5kZXguIEdsb2JhbCBwYXJhbWV0ZXJzIGFyZSBub3QgdGllZCB0byBhIHBvcnQgKGlucHV0IG9yIG91dHB1dCkuCi0gKgotICogUGFyYW1ldGVycyB3cmFwIHN0cnVjdHVyZXMgYnkgcHJlcGVuZGluZyBhIChwYXJhbWV0ZXIpIGhlYWRlci4gVGhlIGZpZWxkcyBvZiB0aGUgd3JhcHBlZAotICogc3RydWN0dXJlIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSwgYW5kIGNvbnN0cnVjdG9ycyBhbmQgcG90ZW50aWFsIHB1YmxpYyBtZXRob2RzIGFyZSBhbHNvCi0gKiB3cmFwcGVkLgotICoKLSAqIFx0cGFyYW0gVCBwYXJhbSB0eXBlIEMyU2V0dGluZywgQzJUdW5pbmcgb3IgQzJJbmZvCi0gKiBcdHBhcmFtIFMgd3JhcHBlZCBzdHJ1Y3R1cmUKLSAqIFx0cGFyYW0gQmFzZUluZGV4IG9wdGlvbmFsIGJhc2UtaW5kZXggb3ZlcnJpZGUuIE11c3QgYmUgc3BlY2lmaWVkIGZvciBjb21tb24vcmV1c2VkIHN0cnVjdHVyZXMuCi0gKi8KLXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBCYXNlSW5kZXg9Uzo6YmFzZUluZGV4LCBjbGFzcyBGbGV4PXZvaWQ+Ci1zdHJ1Y3QgQzJfSElERSBDMkdsb2JhbFBhcmFtIDogcHVibGljIFQsIHB1YmxpYyBTLCBwdWJsaWMgQzJCYXNlSW5kZXhPdmVycmlkZTxTLCBCYXNlSW5kZXg+LAotICAgICAgICBwdWJsaWMgQzJTdHJ1Y3RDaGVjazxTLCBCYXNlSW5kZXgsIFQ6OmluZGV4RmxhZ3MgfCBUOjpUeXBlOjprRGlyR2xvYmFsPiB7Ci1wcml2YXRlOgotICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxULCBTLCBCYXNlSW5kZXg+IF90eXBlOwotCi1wdWJsaWM6Ci0gICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3IuCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KLSAgICBpbmxpbmUgQzJHbG9iYWxQYXJhbShjb25zdCBBcmdzKCYuLi4gYXJncykpIDogVChzaXplb2YoX3R5cGUpLCBfdHlwZTo6dHlwZUluZGV4KSwgUyhhcmdzLi4uKSB7IH0KLQotICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhfdHlwZSkKLX07Ci0KLS8qKgotICogR2xvYmFsLXBhcmFtZXRlciB0ZW1wbGF0ZSBmb3IgZmxleGlibGUgc3RydWN0dXJlcy4KLSAqCi0gKiBCYXNlIHRlbXBsYXRlIHRvIGRlZmluZSBhIGdsb2JhbCBzZXR0aW5nL3R1bmluZyBvciBpbmZvIGJhc2VkIG9uIGEgZmxleGlibGUgc3RydWN0dXJlIGFuZAotICogYW4gb3B0aW9uYWwgQmFzZUluZGV4LiBHbG9iYWwgcGFyYW1ldGVycyBhcmUgbm90IHRpZWQgdG8gYSBwb3J0IChpbnB1dCBvciBvdXRwdXQpLgotICoKLSAqIFx0cGFyYW0gVCBwYXJhbSB0eXBlIEMyU2V0dGluZywgQzJUdW5pbmcgb3IgQzJJbmZvCi0gKiBcdHBhcmFtIFMgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKLSAqIFx0cGFyYW0gQmFzZUluZGV4IG9wdGlvbmFsIGJhc2UtaW5kZXggb3ZlcnJpZGUuIE11c3QgYmUgc3BlY2lmaWVkIGZvciBjb21tb24vcmV1c2VkIHN0cnVjdHVyZXMuCi0gKgotICogUGFyYW1ldGVycyB3cmFwIHN0cnVjdHVyZXMgYnkgcHJlcGVuZGluZyBhIChwYXJhbWV0ZXIpIGhlYWRlci4gVGhlIGZpZWxkcyBhbmQgbWV0aG9kcyBvZiBmbGV4aWJsZQotICogc3RydWN0dXJlcyBjYW4gYmUgYWNjZXNzZWQgdmlhIHRoZSBtIG1lbWJlciB2YXJpYWJsZTsgaG93ZXZlciwgdGhlIGNvbnN0cnVjdG9ycyBvZiB0aGUgc3RydWN0dXJlCi0gKiBhcmUgd3JhcHBlZCBkaXJlY3RseS4gKFRoaXMgaXMgYmVjYXVzZSBmbGV4aWJsZSB0eXBlcyBjYW5ub3QgYmUgc3ViY2xhc3NlZC4pCi0gKi8KLXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBCYXNlSW5kZXg+Ci1zdHJ1Y3QgQzJfSElERSBDMkdsb2JhbFBhcmFtPFQsIFMsIEJhc2VJbmRleCwgSUZfRkxFWElCTEUoUyk+Ci0gICAgOiBwdWJsaWMgVCwgcHVibGljIEMyRmxleFN0cnVjdENoZWNrPFMsIEJhc2VJbmRleCwgVDo6aW5kZXhGbGFncyB8IFQ6OlR5cGU6OmtEaXJHbG9iYWw+IHsKLXByaXZhdGU6Ci0gICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPFQsIFMsIEJhc2VJbmRleD4gX3R5cGU7Ci0KLSAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3Rvci4KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgotICAgIGlubGluZSBDMkdsb2JhbFBhcmFtKHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKLSAgICAgICAgOiBUKF90eXBlOjpjYWxjU2l6ZShmbGV4Q291bnQpLCBfdHlwZTo6dHlwZUluZGV4KSwgbShmbGV4Q291bnQsIGFyZ3MuLi4pIHsgfQotCi1wdWJsaWM6Ci0gICAgUyBtOyAvLy88IHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCi0KLSAgICBERUZJTkVfRkxFWElCTEVfTUVUSE9EUyhfdHlwZSwgUykKLSAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoX3R5cGUpCi19OwotCi0vKioKLSAqIFBvcnQtcGFyYW1ldGVyIHRlbXBsYXRlLgotICoKLSAqIEJhc2UgdGVtcGxhdGUgdG8gZGVmaW5lIGEgcG9ydCBzZXR0aW5nL3R1bmluZyBvciBpbmZvIGJhc2VkIG9uIGEgc3RydWN0dXJlIGFuZAotICogYW4gb3B0aW9uYWwgQmFzZUluZGV4LiBQb3J0IHBhcmFtZXRlcnMgYXJlIHRpZWQgdG8gYSBwb3J0IChpbnB1dCBvciBvdXRwdXQpLCBidXQgbm90IHRvIGEKLSAqIHNwZWNpZmljIHN0cmVhbS4KLSAqCi0gKiBcdHBhcmFtIFQgcGFyYW0gdHlwZSBDMlNldHRpbmcsIEMyVHVuaW5nIG9yIEMySW5mbwotICogXHRwYXJhbSBTIHdyYXBwZWQgc3RydWN0dXJlCi0gKiBcdHBhcmFtIEJhc2VJbmRleCBvcHRpb25hbCBiYXNlLWluZGV4IG92ZXJyaWRlLiBNdXN0IGJlIHNwZWNpZmllZCBmb3IgY29tbW9uL3JldXNlZCBzdHJ1Y3R1cmVzLgotICoKLSAqIFBhcmFtZXRlcnMgd3JhcCBzdHJ1Y3R1cmVzIGJ5IHByZXBlbmRpbmcgYSAocGFyYW1ldGVyKSBoZWFkZXIuIFRoZSBmaWVsZHMgb2YgdGhlIHdyYXBwZWQKLSAqIHN0cnVjdHVyZSBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHksIGFuZCBjb25zdHJ1Y3RvcnMgYW5kIHBvdGVudGlhbCBwdWJsaWMgbWV0aG9kcyBhcmUgYWxzbwotICogd3JhcHBlZC4KLSAqCi0gKiBUaGVyZSBhcmUgMyBmbGF2b3JzIG9mIHBvcnQgcGFyYW1ldGVyczogdW5zcGVjaWZpZWQsIGlucHV0IGFuZCBvdXRwdXQuIFBhcmFtZXRlcnMgd2l0aAotICogdW5zcGVjaWZpZWQgcG9ydCBleHBvc2UgYSBzZXRQb3J0IG1ldGhvZCwgYW5kIGFkZCBhbiBpbml0aWFsIHBvcnQgcGFyYW1ldGVyIHRvIHRoZSBjb25zdHJ1Y3Rvci4KLSAqLwotdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgaW50IEJhc2VJbmRleD1TOjpiYXNlSW5kZXgsIGNsYXNzIEZsZXg9dm9pZD4KLXN0cnVjdCBDMl9ISURFIEMyUG9ydFBhcmFtIDogcHVibGljIFQsIHB1YmxpYyBTLCBwdWJsaWMgQzJCYXNlSW5kZXhPdmVycmlkZTxTLCBCYXNlSW5kZXg+LAotICAgICAgICBwcml2YXRlIEMyU3RydWN0Q2hlY2s8UywgQmFzZUluZGV4LCBUOjppbmRleEZsYWdzIHwgVDo6SW5kZXg6OmtEaXJVbmRlZmluZWQ+IHsKLXByaXZhdGU6Ci0gICAgdHlwZWRlZiBDMlBvcnRQYXJhbTxULCBTLCBCYXNlSW5kZXg+IF90eXBlOwotCi1wdWJsaWM6Ci0gICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgaW5saW5lIEMyUG9ydFBhcmFtKCkgOiBUKHNpemVvZihfdHlwZSksIF90eXBlOjp0eXBlSW5kZXgpIHsgfQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+Ci0gICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgc3BlY2lmeWluZyBwb3J0L2RpcmVjdGlvbi4KLSAgICBpbmxpbmUgQzJQb3J0UGFyYW0oYm9vbCBfb3V0cHV0LCBjb25zdCBBcmdzKCYuLi4gYXJncykpCi0gICAgICAgIDogVChzaXplb2YoX3R5cGUpLCBfb3V0cHV0ID8gb3V0cHV0Ojp0eXBlSW5kZXggOiBpbnB1dDo6dHlwZUluZGV4KSwgUyhhcmdzLi4uKSB7IH0KLSAgICAvLy8gU2V0IHBvcnQvZGlyZWN0aW9uLgotICAgIGlubGluZSB2b2lkIHNldFBvcnQoYm9vbCBvdXRwdXQpIHsgQzJQYXJhbTo6c2V0UG9ydChvdXRwdXQpOyB9Ci0KLSAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoX3R5cGUpCi0KLSAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGFuIGlucHV0IHBvcnQgcGFyYW1ldGVyLgotICAgIHN0cnVjdCBpbnB1dCA6IHB1YmxpYyBULCBwdWJsaWMgUywgcHVibGljIEMyQmFzZUluZGV4T3ZlcnJpZGU8UywgQmFzZUluZGV4PiwKLSAgICAgICAgICAgIHB1YmxpYyBDMlN0cnVjdENoZWNrPFMsIEJhc2VJbmRleCwgVDo6aW5kZXhGbGFncyB8IFQ6OkluZGV4OjprRGlySW5wdXQ+IHsKLSAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3IuCi0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+Ci0gICAgICAgIGlubGluZSBpbnB1dChjb25zdCBBcmdzKCYuLi4gYXJncykpIDogVChzaXplb2YoX3R5cGUpLCBpbnB1dDo6dHlwZUluZGV4KSwgUyhhcmdzLi4uKSB7IH0KLQotICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoaW5wdXQpCi0KLSAgICB9OwotCi0gICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBhbiBvdXRwdXQgcG9ydCBwYXJhbWV0ZXIuCi0gICAgc3RydWN0IG91dHB1dCA6IHB1YmxpYyBULCBwdWJsaWMgUywgcHVibGljIEMyQmFzZUluZGV4T3ZlcnJpZGU8UywgQmFzZUluZGV4PiwKLSAgICAgICAgICAgIHB1YmxpYyBDMlN0cnVjdENoZWNrPFMsIEJhc2VJbmRleCwgVDo6aW5kZXhGbGFncyB8IFQ6OkluZGV4OjprRGlyT3V0cHV0PiB7Ci0gICAgICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yLgotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgotICAgICAgICBpbmxpbmUgb3V0cHV0KGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgOiBUKHNpemVvZihfdHlwZSksIG91dHB1dDo6dHlwZUluZGV4KSwgUyhhcmdzLi4uKSB7IH0KLQotICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMob3V0cHV0KQotICAgIH07Ci19OwotCi0vKioKLSAqIFBvcnQtcGFyYW1ldGVyIHRlbXBsYXRlIGZvciBmbGV4aWJsZSBzdHJ1Y3R1cmVzLgotICoKLSAqIEJhc2UgdGVtcGxhdGUgdG8gZGVmaW5lIGEgcG9ydCBzZXR0aW5nL3R1bmluZyBvciBpbmZvIGJhc2VkIG9uIGEgZmxleGlibGUgc3RydWN0dXJlIGFuZAotICogYW4gb3B0aW9uYWwgQmFzZUluZGV4LiBQb3J0IHBhcmFtZXRlcnMgYXJlIHRpZWQgdG8gYSBwb3J0IChpbnB1dCBvciBvdXRwdXQpLCBidXQgbm90IHRvIGEKLSAqIHNwZWNpZmljIHN0cmVhbS4KLSAqCi0gKiBcdHBhcmFtIFQgcGFyYW0gdHlwZSBDMlNldHRpbmcsIEMyVHVuaW5nIG9yIEMySW5mbwotICogXHRwYXJhbSBTIHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCi0gKiBcdHBhcmFtIEJhc2VJbmRleCBvcHRpb25hbCBiYXNlLWluZGV4IG92ZXJyaWRlLiBNdXN0IGJlIHNwZWNpZmllZCBmb3IgY29tbW9uL3JldXNlZCBzdHJ1Y3R1cmVzLgotICoKLSAqIFBhcmFtZXRlcnMgd3JhcCBzdHJ1Y3R1cmVzIGJ5IHByZXBlbmRpbmcgYSAocGFyYW1ldGVyKSBoZWFkZXIuIFRoZSBmaWVsZHMgYW5kIG1ldGhvZHMgb2YgZmxleGlibGUKLSAqIHN0cnVjdHVyZXMgY2FuIGJlIGFjY2Vzc2VkIHZpYSB0aGUgbSBtZW1iZXIgdmFyaWFibGU7IGhvd2V2ZXIsIHRoZSBjb25zdHJ1Y3RvcnMgb2YgdGhlIHN0cnVjdHVyZQotICogYXJlIHdyYXBwZWQgZGlyZWN0bHkuIChUaGlzIGlzIGJlY2F1c2UgZmxleGlibGUgdHlwZXMgY2Fubm90IGJlIHN1YmNsYXNzZWQuKQotICoKLSAqIFRoZXJlIGFyZSAzIGZsYXZvcnMgb2YgcG9ydCBwYXJhbWV0ZXJzOiB1bnNwZWNpZmllZCwgaW5wdXQgYW5kIG91dHB1dC4gUGFyYW1ldGVycyB3aXRoCi0gKiB1bnNwZWNpZmllZCBwb3J0IGV4cG9zZSBhIHNldFBvcnQgbWV0aG9kLCBhbmQgYWRkIGFuIGluaXRpYWwgcG9ydCBwYXJhbWV0ZXIgdG8gdGhlIGNvbnN0cnVjdG9yLgotICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgQmFzZUluZGV4Pgotc3RydWN0IEMyX0hJREUgQzJQb3J0UGFyYW08VCwgUywgQmFzZUluZGV4LCBJRl9GTEVYSUJMRShTKT4KLSAgICA6IHB1YmxpYyBULCBwdWJsaWMgQzJGbGV4U3RydWN0Q2hlY2s8UywgQmFzZUluZGV4LCBUOjppbmRleEZsYWdzIHwgVDo6VHlwZTo6a0RpclVuZGVmaW5lZD4gewotcHJpdmF0ZToKLSAgICB0eXBlZGVmIEMyUG9ydFBhcmFtPFQsIFMsIEJhc2VJbmRleD4gX3R5cGU7Ci0KLSAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciBmb3IgYmFzaWMgYWxsb2NhdGlvbjogbmV3KGZsZXhDb3VudCkgUC4KLSAgICBpbmxpbmUgQzJQb3J0UGFyYW0oc2l6ZV90IGZsZXhDb3VudCkgOiBUKF90eXBlOjpjYWxjU2l6ZShmbGV4Q291bnQpLCBfdHlwZTo6dHlwZUluZGV4KSB7IH0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgotICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBwb3J0L2RpcmVjdGlvbi4KLSAgICBpbmxpbmUgQzJQb3J0UGFyYW0oc2l6ZV90IGZsZXhDb3VudCwgYm9vbCBfb3V0cHV0LCBjb25zdCBBcmdzKCYuLi4gYXJncykpCi0gICAgICAgIDogVChfdHlwZTo6Y2FsY1NpemUoZmxleENvdW50KSwgX291dHB1dCA/IG91dHB1dDo6dHlwZUluZGV4IDogaW5wdXQ6OnR5cGVJbmRleCksCi0gICAgICAgICAgbShmbGV4Q291bnQsIGFyZ3MuLi4pIHsgfQotCi1wdWJsaWM6Ci0gICAgLy8vIFNldCBwb3J0L2RpcmVjdGlvbi4KLSAgICBpbmxpbmUgdm9pZCBzZXRQb3J0KGJvb2wgb3V0cHV0KSB7IEMyUGFyYW06OnNldFBvcnQob3V0cHV0KTsgfQotCi0gICAgUyBtOyAvLy88IHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCi0KLSAgICBERUZJTkVfRkxFWElCTEVfTUVUSE9EUyhfdHlwZSwgUykKLSAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoX3R5cGUpCi0KLSAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGFuIGlucHV0IHBvcnQgcGFyYW1ldGVyLgotICAgIHN0cnVjdCBpbnB1dCA6IHB1YmxpYyBULCBwdWJsaWMgQzJCYXNlSW5kZXhPdmVycmlkZTxTLCBCYXNlSW5kZXg+LAotICAgICAgICAgICAgcHVibGljIEMyRmxleFN0cnVjdENoZWNrPFMsIEJhc2VJbmRleCwgVDo6aW5kZXhGbGFncyB8IFQ6OkluZGV4OjprRGlySW5wdXQ+IHsKLSAgICBwcml2YXRlOgotICAgICAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgcG9ydC9kaXJlY3Rpb24uCi0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+Ci0gICAgICAgIGlubGluZSBpbnB1dChzaXplX3QgZmxleENvdW50LCBjb25zdCBBcmdzKCYuLi4gYXJncykpCi0gICAgICAgICAgICA6IFQoX3R5cGU6OmNhbGNTaXplKGZsZXhDb3VudCksIGlucHV0Ojp0eXBlSW5kZXgpLCBtKGZsZXhDb3VudCwgYXJncy4uLikgeyB9Ci0KLSAgICBwdWJsaWM6Ci0gICAgICAgIFMgbTsgLy8vPCB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQotCi0gICAgICAgIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKGlucHV0LCBTKQotICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoaW5wdXQpCi0gICAgfTsKLQotICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gb3V0cHV0IHBvcnQgcGFyYW1ldGVyLgotICAgIHN0cnVjdCBvdXRwdXQgOiBwdWJsaWMgVCwgcHVibGljIEMyQmFzZUluZGV4T3ZlcnJpZGU8UywgQmFzZUluZGV4PiwKLSAgICAgICAgICAgIHB1YmxpYyBDMkZsZXhTdHJ1Y3RDaGVjazxTLCBCYXNlSW5kZXgsIFQ6OmluZGV4RmxhZ3MgfCBUOjpJbmRleDo6a0Rpck91dHB1dD4gewotICAgIHByaXZhdGU6Ci0gICAgICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBwb3J0L2RpcmVjdGlvbi4KLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KLSAgICAgICAgaW5saW5lIG91dHB1dChzaXplX3QgZmxleENvdW50LCBjb25zdCBBcmdzKCYuLi4gYXJncykpCi0gICAgICAgICAgICA6IFQoX3R5cGU6OmNhbGNTaXplKGZsZXhDb3VudCksIG91dHB1dDo6dHlwZUluZGV4KSwgbShmbGV4Q291bnQsIGFyZ3MuLi4pIHsgfQotCi0gICAgcHVibGljOgotICAgICAgICBTIG07IC8vLzwgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKLQotICAgICAgICBERUZJTkVfRkxFWElCTEVfTUVUSE9EUyhvdXRwdXQsIFMpCi0gICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhvdXRwdXQpCi0gICAgfTsKLX07Ci0KLS8qKgotICogU3RyZWFtLXBhcmFtZXRlciB0ZW1wbGF0ZS4KLSAqCi0gKiBCYXNlIHRlbXBsYXRlIHRvIGRlZmluZSBhIHN0cmVhbSBzZXR0aW5nL3R1bmluZyBvciBpbmZvIGJhc2VkIG9uIGEgc3RydWN0dXJlIGFuZAotICogYW4gb3B0aW9uYWwgQmFzZUluZGV4LiBTdHJlYW0gcGFyYW1ldGVycyBhcmUgdGllZCB0byBhIHNwZWNpZmljIHN0cmVhbSBvbiBhIHBvcnQgKGlucHV0IG9yCi0gKiBvdXRwdXQpLgotICoKLSAqIFx0cGFyYW0gVCBwYXJhbSB0eXBlIEMyU2V0dGluZywgQzJUdW5pbmcgb3IgQzJJbmZvCi0gKiBcdHBhcmFtIFMgd3JhcHBlZCBzdHJ1Y3R1cmUKLSAqIFx0cGFyYW0gQmFzZUluZGV4IG9wdGlvbmFsIGJhc2UtaW5kZXggb3ZlcnJpZGUuIE11c3QgYmUgc3BlY2lmaWVkIGZvciBjb21tb24vcmV1c2VkIHN0cnVjdHVyZXMuCi0gKgotICogUGFyYW1ldGVycyB3cmFwIHN0cnVjdHVyZXMgYnkgcHJlcGVuZGluZyBhIChwYXJhbWV0ZXIpIGhlYWRlci4gVGhlIGZpZWxkcyBvZiB0aGUgd3JhcHBlZAotICogc3RydWN0dXJlIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSwgYW5kIGNvbnN0cnVjdG9ycyBhbmQgcG90ZW50aWFsIHB1YmxpYyBtZXRob2RzIGFyZSBhbHNvCi0gKiB3cmFwcGVkLgotICoKLSAqIFRoZXJlIGFyZSAzIGZsYXZvcnMgb2Ygc3RyZWFtIHBhcmFtZXRlcnM6IHVuc3BlY2lmaWVkIHBvcnQsIGlucHV0IGFuZCBvdXRwdXQuIEFsbCBvZiB0aGVzZSBleHBvc2UKLSAqIGEgc2V0U3RyZWFtIG1ldGhvZCBhbmQgYW4gZXh0cmEgaW5pdGlhbCBzdHJlYW1JRCBwYXJhbWV0ZXIgZm9yIHRoZSBjb25zdHJ1Y3Rvci4gTW9yZW92ZXIsCi0gKiBwYXJhbWV0ZXJzIHdpdGggdW5zcGVjaWZpZWQgcG9ydCBleHBvc2UgYSBzZXRQb3J0IG1ldGhvZCwgYW5kIGFkZCBhbiBhZGRpdGlvbmFsIGluaXRpYWwgcG9ydAotICogcGFyYW1ldGVyIHRvIHRoZSBjb25zdHJ1Y3Rvci4KLSAqLwotdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgaW50IEJhc2VJbmRleD1TOjpiYXNlSW5kZXgsIGNsYXNzIEZsZXg9dm9pZD4KLXN0cnVjdCBDMl9ISURFIEMyU3RyZWFtUGFyYW0gOiBwdWJsaWMgVCwgcHVibGljIFMsIHB1YmxpYyBDMkJhc2VJbmRleE92ZXJyaWRlPFMsIEJhc2VJbmRleD4sCi0gICAgICAgIHByaXZhdGUgQzJTdHJ1Y3RDaGVjazxTLCBCYXNlSW5kZXgsCi0gICAgICAgICAgICAgICAgVDo6aW5kZXhGbGFncyB8IFQ6OkluZGV4OjprU3RyZWFtRmxhZyB8IFQ6OkluZGV4OjprRGlyVW5kZWZpbmVkPiB7Ci1wcml2YXRlOgotICAgIHR5cGVkZWYgQzJTdHJlYW1QYXJhbTxULCBTLCBCYXNlSW5kZXg+IF90eXBlOwotCi1wdWJsaWM6Ci0gICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuIFBvcnQvZGlyZWN0aW9uIGFuZCBzdHJlYW0tSUQgaXMgdW5kZWZpbmVkLgotICAgIGlubGluZSBDMlN0cmVhbVBhcmFtKCkgOiBUKHNpemVvZihfdHlwZSksIF90eXBlOjp0eXBlSW5kZXgpIHsgfQotICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBwb3J0L2RpcmVjdGlvbiBhbmQKLSAgICAvLy8gc3RyZWFtLUlELgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+Ci0gICAgaW5saW5lIEMyU3RyZWFtUGFyYW0oYm9vbCBfb3V0cHV0LCB1bnNpZ25lZCBzdHJlYW0sIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKLSAgICAgICAgOiBUKHNpemVvZihfdHlwZSksIF9vdXRwdXQgPyBvdXRwdXQ6OnR5cGVJbmRleCA6IGlucHV0Ojp0eXBlSW5kZXgsIHN0cmVhbSksCi0gICAgICAgICAgUyhhcmdzLi4uKSB7IH0KLSAgICAvLy8gU2V0IHBvcnQvZGlyZWN0aW9uLgotICAgIGlubGluZSB2b2lkIHNldFBvcnQoYm9vbCBvdXRwdXQpIHsgQzJQYXJhbTo6c2V0UG9ydChvdXRwdXQpOyB9Ci0gICAgLy8vIFNldCBzdHJlYW0taWQuIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgc3RyZWFtLWlkIHdhcyBzdWNjZXNzZnVsbHkgc2V0LgotICAgIGlubGluZSBib29sIHNldFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIHsgcmV0dXJuIEMyUGFyYW06OnNldFN0cmVhbShzdHJlYW0pOyB9Ci0KLSAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoX3R5cGUpCi0KLSAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGFuIGlucHV0IHN0cmVhbSBwYXJhbWV0ZXIuCi0gICAgc3RydWN0IGlucHV0IDogcHVibGljIFQsIHB1YmxpYyBTLCBwdWJsaWMgQzJCYXNlSW5kZXhPdmVycmlkZTxTLCBCYXNlSW5kZXg+LAotICAgICAgICAgICAgcHVibGljIEMyU3RydWN0Q2hlY2s8UywgQmFzZUluZGV4LAotICAgICAgICAgICAgICAgICAgICBUOjppbmRleEZsYWdzIHwgVDo6SW5kZXg6OmtTdHJlYW1GbGFnIHwgVDo6VHlwZTo6a0RpcklucHV0PiB7Ci0gICAgICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLiBTdHJlYW0tSUQgaXMgdW5kZWZpbmVkLgotICAgICAgICBpbmxpbmUgaW5wdXQoKSA6IFQoc2l6ZW9mKF90eXBlKSwgaW5wdXQ6OnR5cGVJbmRleCkgeyB9Ci0gICAgICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBzdHJlYW0tSUQuCi0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+Ci0gICAgICAgIGlubGluZSBpbnB1dCh1bnNpZ25lZCBzdHJlYW0sIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKLSAgICAgICAgICAgIDogVChzaXplb2YoX3R5cGUpLCBpbnB1dDo6dHlwZUluZGV4LCBzdHJlYW0pLCBTKGFyZ3MuLi4pIHsgfQotICAgICAgICAvLy8gU2V0IHN0cmVhbS1pZC4gXHJldHZhbCB0cnVlIGlmIHRoZSBzdHJlYW0taWQgd2FzIHN1Y2Nlc3NmdWxseSBzZXQuCi0gICAgICAgIGlubGluZSBib29sIHNldFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIHsgcmV0dXJuIEMyUGFyYW06OnNldFN0cmVhbShzdHJlYW0pOyB9Ci0KLSAgICAgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKGlucHV0KQotICAgIH07Ci0KLSAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGFuIG91dHB1dCBzdHJlYW0gcGFyYW1ldGVyLgotICAgIHN0cnVjdCBvdXRwdXQgOiBwdWJsaWMgVCwgcHVibGljIFMsIHB1YmxpYyBDMkJhc2VJbmRleE92ZXJyaWRlPFMsIEJhc2VJbmRleD4sCi0gICAgICAgICAgICBwdWJsaWMgQzJTdHJ1Y3RDaGVjazxTLCBCYXNlSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgIFQ6OmluZGV4RmxhZ3MgfCBUOjpJbmRleDo6a1N0cmVhbUZsYWcgfCBUOjpUeXBlOjprRGlyT3V0cHV0PiB7Ci0gICAgICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLiBTdHJlYW0tSUQgaXMgdW5kZWZpbmVkLgotICAgICAgICBpbmxpbmUgb3V0cHV0KCkgOiBUKHNpemVvZihfdHlwZSksIG91dHB1dDo6dHlwZUluZGV4KSB7IH0KLSAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHN0cmVhbS1JRC4KLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KLSAgICAgICAgaW5saW5lIG91dHB1dCh1bnNpZ25lZCBzdHJlYW0sIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKLSAgICAgICAgICAgIDogVChzaXplb2YoX3R5cGUpLCBvdXRwdXQ6OnR5cGVJbmRleCwgc3RyZWFtKSwgUyhhcmdzLi4uKSB7IH0KLSAgICAgICAgLy8vIFNldCBzdHJlYW0taWQuIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgc3RyZWFtLWlkIHdhcyBzdWNjZXNzZnVsbHkgc2V0LgotICAgICAgICBpbmxpbmUgYm9vbCBzZXRTdHJlYW0odW5zaWduZWQgc3RyZWFtKSB7IHJldHVybiBDMlBhcmFtOjpzZXRTdHJlYW0oc3RyZWFtKTsgfQotCi0gICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhvdXRwdXQpCi0gICAgfTsKLX07Ci0KLS8qKgotICogU3RyZWFtLXBhcmFtZXRlciB0ZW1wbGF0ZSBmb3IgZmxleGlibGUgc3RydWN0dXJlcy4KLSAqCi0gKiBCYXNlIHRlbXBsYXRlIHRvIGRlZmluZSBhIHN0cmVhbSBzZXR0aW5nL3R1bmluZyBvciBpbmZvIGJhc2VkIG9uIGEgZmxleGlibGUgc3RydWN0dXJlIGFuZAotICogYW4gb3B0aW9uYWwgQmFzZUluZGV4LiBTdHJlYW0gcGFyYW1ldGVycyBhcmUgdGllZCB0byBhIHNwZWNpZmljIHN0cmVhbSBvbiBhIHBvcnQgKGlucHV0IG9yCi0gKiBvdXRwdXQpLgotICoKLSAqIFx0cGFyYW0gVCBwYXJhbSB0eXBlIEMyU2V0dGluZywgQzJUdW5pbmcgb3IgQzJJbmZvCi0gKiBcdHBhcmFtIFMgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKLSAqIFx0cGFyYW0gQmFzZUluZGV4IG9wdGlvbmFsIGJhc2UtaW5kZXggb3ZlcnJpZGUuIE11c3QgYmUgc3BlY2lmaWVkIGZvciBjb21tb24vcmV1c2VkIHN0cnVjdHVyZXMuCi0gKgotICogUGFyYW1ldGVycyB3cmFwIHN0cnVjdHVyZXMgYnkgcHJlcGVuZGluZyBhIChwYXJhbWV0ZXIpIGhlYWRlci4gVGhlIGZpZWxkcyBhbmQgbWV0aG9kcyBvZiBmbGV4aWJsZQotICogc3RydWN0dXJlcyBjYW4gYmUgYWNjZXNzZWQgdmlhIHRoZSBtIG1lbWJlciB2YXJpYWJsZTsgaG93ZXZlciwgdGhlIGNvbnN0cnVjdG9ycyBvZiB0aGUgc3RydWN0dXJlCi0gKiBhcmUgd3JhcHBlZCBkaXJlY3RseS4gKFRoaXMgaXMgYmVjYXVzZSBmbGV4aWJsZSB0eXBlcyBjYW5ub3QgYmUgc3ViY2xhc3NlZC4pCi0gKgotICogVGhlcmUgYXJlIDMgZmxhdm9ycyBvZiBzdHJlYW0gcGFyYW1ldGVyczogdW5zcGVjaWZpZWQgcG9ydCwgaW5wdXQgYW5kIG91dHB1dC4gQWxsIG9mIHRoZXNlIGV4cG9zZQotICogYSBzZXRTdHJlYW0gbWV0aG9kIGFuZCBhbiBleHRyYSBpbml0aWFsIHN0cmVhbUlEIHBhcmFtZXRlciBmb3IgdGhlIGNvbnN0cnVjdG9yLiBNb3Jlb3ZlciwKLSAqIHBhcmFtZXRlcnMgd2l0aCB1bnNwZWNpZmllZCBwb3J0IGV4cG9zZSBhIHNldFBvcnQgbWV0aG9kLCBhbmQgYWRkIGFuIGFkZGl0aW9uYWwgaW5pdGlhbCBwb3J0Ci0gKiBwYXJhbWV0ZXIgdG8gdGhlIGNvbnN0cnVjdG9yLgotICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgQmFzZUluZGV4Pgotc3RydWN0IEMyX0hJREUgQzJTdHJlYW1QYXJhbTxULCBTLCBCYXNlSW5kZXgsIElGX0ZMRVhJQkxFKFMpPgotICAgIDogcHVibGljIFQsIHB1YmxpYyBDMkJhc2VJbmRleE92ZXJyaWRlPFMsIEJhc2VJbmRleD4sCi0gICAgICBwcml2YXRlIEMyRmxleFN0cnVjdENoZWNrPFMsIEJhc2VJbmRleCwKLSAgICAgICAgICAgICAgVDo6aW5kZXhGbGFncyB8IFQ6OkluZGV4OjprU3RyZWFtRmxhZyB8IFQ6OkluZGV4OjprRGlyVW5kZWZpbmVkPiB7Ci1wcml2YXRlOgotICAgIHR5cGVkZWYgQzJTdHJlYW1QYXJhbTxULCBTPiBfdHlwZTsKLSAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4gUG9ydC9kaXJlY3Rpb24gYW5kIHN0cmVhbS1JRCBpcyB1bmRlZmluZWQuCi0gICAgaW5saW5lIEMyU3RyZWFtUGFyYW0oc2l6ZV90IGZsZXhDb3VudCkgOiBUKF90eXBlOjpjYWxjU2l6ZShmbGV4Q291bnQpLCBfdHlwZTo6dHlwZUluZGV4LCAwdSkgeyB9Ci0gICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHBvcnQvZGlyZWN0aW9uIGFuZAotICAgIC8vLyBzdHJlYW0tSUQuCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KLSAgICBpbmxpbmUgQzJTdHJlYW1QYXJhbShzaXplX3QgZmxleENvdW50LCBib29sIF9vdXRwdXQsIHVuc2lnbmVkIHN0cmVhbSwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQotICAgICAgICA6IFQoX3R5cGU6OmNhbGNTaXplKGZsZXhDb3VudCksIF9vdXRwdXQgPyBvdXRwdXQ6OnR5cGVJbmRleCA6IGlucHV0Ojp0eXBlSW5kZXgsIHN0cmVhbSksCi0gICAgICAgICAgbShmbGV4Q291bnQsIGFyZ3MuLi4pIHsgfQotCi1wdWJsaWM6Ci0gICAgUyBtOyAvLy88IHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCi0KLSAgICAvLy8gU2V0IHBvcnQvZGlyZWN0aW9uLgotICAgIGlubGluZSB2b2lkIHNldFBvcnQoYm9vbCBvdXRwdXQpIHsgQzJQYXJhbTo6c2V0UG9ydChvdXRwdXQpOyB9Ci0gICAgLy8vIFNldCBzdHJlYW0taWQuIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgc3RyZWFtLWlkIHdhcyBzdWNjZXNzZnVsbHkgc2V0LgotICAgIGlubGluZSBib29sIHNldFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIHsgcmV0dXJuIEMyUGFyYW06OnNldFN0cmVhbShzdHJlYW0pOyB9Ci0KLSAgICBERUZJTkVfRkxFWElCTEVfTUVUSE9EUyhfdHlwZSwgUykKLSAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoX3R5cGUpCi0KLSAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGFuIGlucHV0IHN0cmVhbSBwYXJhbWV0ZXIuCi0gICAgc3RydWN0IGlucHV0IDogcHVibGljIFQsIHB1YmxpYyBDMkJhc2VJbmRleE92ZXJyaWRlPFMsIEJhc2VJbmRleD4sCi0gICAgICAgICAgICBwdWJsaWMgQzJGbGV4U3RydWN0Q2hlY2s8UywgQmFzZUluZGV4LAotICAgICAgICAgICAgICAgICAgICBUOjppbmRleEZsYWdzIHwgVDo6SW5kZXg6OmtTdHJlYW1GbGFnIHwgVDo6VHlwZTo6a0RpcklucHV0PiB7Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuIFN0cmVhbS1JRCBpcyB1bmRlZmluZWQuCi0gICAgICAgIGlubGluZSBpbnB1dChzaXplX3QgZmxleENvdW50KSA6IFQoX3R5cGU6OmNhbGNTaXplKGZsZXhDb3VudCksIGlucHV0Ojp0eXBlSW5kZXgpIHsgfQotICAgICAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgc3RyZWFtLUlELgotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgotICAgICAgICBpbmxpbmUgaW5wdXQoc2l6ZV90IGZsZXhDb3VudCwgdW5zaWduZWQgc3RyZWFtLCBjb25zdCBBcmdzKCYuLi4gYXJncykpCi0gICAgICAgICAgICA6IFQoX3R5cGU6OmNhbGNTaXplKGZsZXhDb3VudCksIGlucHV0Ojp0eXBlSW5kZXgsIHN0cmVhbSksIG0oZmxleENvdW50LCBhcmdzLi4uKSB7IH0KLQotICAgIHB1YmxpYzoKLSAgICAgICAgUyBtOyAvLy88IHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCi0KLSAgICAgICAgLy8vIFNldCBzdHJlYW0taWQuIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgc3RyZWFtLWlkIHdhcyBzdWNjZXNzZnVsbHkgc2V0LgotICAgICAgICBpbmxpbmUgYm9vbCBzZXRTdHJlYW0odW5zaWduZWQgc3RyZWFtKSB7IHJldHVybiBDMlBhcmFtOjpzZXRTdHJlYW0oc3RyZWFtKTsgfQotCi0gICAgICAgIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKGlucHV0LCBTKQotICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoaW5wdXQpCi0gICAgfTsKLQotICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gb3V0cHV0IHN0cmVhbSBwYXJhbWV0ZXIuCi0gICAgc3RydWN0IG91dHB1dCA6IHB1YmxpYyBULCBwdWJsaWMgQzJCYXNlSW5kZXhPdmVycmlkZTxTLCBCYXNlSW5kZXg+LAotICAgICAgICAgICAgcHVibGljIEMyRmxleFN0cnVjdENoZWNrPFMsIEJhc2VJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgVDo6aW5kZXhGbGFncyB8IFQ6OkluZGV4OjprU3RyZWFtRmxhZyB8IFQ6OlR5cGU6OmtEaXJPdXRwdXQ+IHsKLSAgICBwcml2YXRlOgotICAgICAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4gU3RyZWFtLUlEIGlzIHVuZGVmaW5lZC4KLSAgICAgICAgaW5saW5lIG91dHB1dChzaXplX3QgZmxleENvdW50KSA6IFQoX3R5cGU6OmNhbGNTaXplKGZsZXhDb3VudCksIG91dHB1dDo6dHlwZUluZGV4KSB7IH0KLSAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHN0cmVhbS1JRC4KLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KLSAgICAgICAgaW5saW5lIG91dHB1dChzaXplX3QgZmxleENvdW50LCB1bnNpZ25lZCBzdHJlYW0sIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKLSAgICAgICAgICAgIDogVChfdHlwZTo6Y2FsY1NpemUoZmxleENvdW50KSwgb3V0cHV0Ojp0eXBlSW5kZXgsIHN0cmVhbSksIG0oZmxleENvdW50LCBhcmdzLi4uKSB7IH0KLQotICAgIHB1YmxpYzoKLSAgICAgICAgUyBtOyAvLy88IHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCi0KLSAgICAgICAgLy8vIFNldCBzdHJlYW0taWQuIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgc3RyZWFtLWlkIHdhcyBzdWNjZXNzZnVsbHkgc2V0LgotICAgICAgICBpbmxpbmUgYm9vbCBzZXRTdHJlYW0odW5zaWduZWQgc3RyZWFtKSB7IHJldHVybiBDMlBhcmFtOjpzZXRTdHJlYW0oc3RyZWFtKTsgfQotCi0gICAgICAgIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKG91dHB1dCwgUykKLSAgICAgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKG91dHB1dCkKLSAgICB9OwotfTsKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09IFNJTVBMRSBWQUxVRSBQQVJBTUVURVJTID09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi0vKioKLSAqIFxpbmdyb3VwIGludGVybmFsCi0gKiBBIHN0cnVjdHVyZSB0ZW1wbGF0ZSBlbmNhcHN1bGF0aW5nIGEgc2luZ2xlIGVsZW1lbnQgd2l0aCBkZWZhdWx0IGNvbnN0cnVjdG9ycyBhbmQgbm8gYmFzZS1pbmRleC4KLSAqLwotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXN0cnVjdCBDMlNpbXBsZVZhbHVlU3RydWN0IHsKLSAgICBUIG1WYWx1ZTsgLy8vPCBzaW1wbGUgdmFsdWUgb2YgdGhlIHN0cnVjdHVyZQotICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgaW5saW5lIEMyU2ltcGxlVmFsdWVTdHJ1Y3QoKSA9IGRlZmF1bHQ7Ci0gICAgLy8gQ29uc3RydWN0b3Igd2l0aCBhbiBpbml0aWFsIHZhbHVlLgotICAgIGlubGluZSBDMlNpbXBsZVZhbHVlU3RydWN0KFQgdmFsdWUpIDogbVZhbHVlKHZhbHVlKSB7fQotICAgIERFRklORV9DMlNUUlVDVF9OT19CQVNFKFNpbXBsZVZhbHVlKQotfTsKLQotLy8gVE9ETzogbW92ZSB0aGlzIGFuZCBuZXh0IHRvIHNvbWUgZ2VuZXJpYyBwbGFjZQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gYSBibG9jayBvZiAobWFwcGVkKSBtZW1vcnkgY29udGFpbmluZyBhbiBhcnJheSBvZiBzb21lIHR5cGUgKFQpLgotICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3RydWN0IEMyTWVtb3J5QmxvY2sgewotICAgIC8vLyBccmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgYmxvY2suCi0gICAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIGNvbnN0ID0gMDsKLSAgICAvLy8gXHJldHVybnMgYSBjb25zdCBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGlzIGJsb2NrLiBDYXJlIG11c3QgYmUgdGFrZW4gdG8gbm90IHJlYWQgb3V0c2lkZQotICAgIC8vLyB0aGUgYmxvY2suCi0gICAgdmlydHVhbCBjb25zdCBUICpkYXRhKCkgY29uc3QgPSAwOyAvLyBUT0RPOiBzaG91bGQgdGhpcyBiZSBmcmllbmQgYWNjZXNzIG9ubHkgaW4gc29tZSBDMk1lbW9yeSBtb2R1bGU/Ci0gICAgLy8vIFxyZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhpcyBibG9jay4gQ2FyZSBtdXN0IGJlIHRha2VuIHRvIG5vdCByZWFkIG9yIHdyaXRlCi0gICAgLy8vIG91dHNpZGUgdGhlIGJsb2NrLgotICAgIGlubGluZSBUICpkYXRhKCkgeyByZXR1cm4gY29uc3RfY2FzdDxUKj4oZGF0YSgpKTsgfQotcHJvdGVjdGVkOgotICAgIC8vIFRPRE86IGZvciBub3cgaXQgc2hvdWxkIG5ldmVyIGJlIGRlbGV0ZWQgYXMgQzJNZW1vcnlCbG9jawotICAgIHZpcnR1YWwgfkMyTWVtb3J5QmxvY2soKSA9IGRlZmF1bHQ7Ci19OwotCi0vKioKLSAqIEludGVyZmFjZSB0byBhIGJsb2NrIG9mIG1lbW9yeSBjb250YWluaW5nIGEgY29uc3RhbnQgKGNvbnN0ZXhwcikgYXJyYXkgb2Ygc29tZSB0eXBlIChUKS4KLSAqLwotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXN0cnVjdCBDMkNvbnN0TWVtb3J5QmxvY2sgOiBwdWJsaWMgQzJNZW1vcnlCbG9jazxUPiB7Ci0gICAgdmlydHVhbCBjb25zdCBUICogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1EYXRhOyB9Ci0gICAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1TaXplOyB9Ci0KLSAgICAvLy8gQ29uc3RydWN0b3IuCi0gICAgdGVtcGxhdGU8dW5zaWduZWQgTj4KLSAgICBpbmxpbmUgY29uc3RleHByIEMyQ29uc3RNZW1vcnlCbG9jayhjb25zdCBUKCZpbml0KVtOXSkgOiBtRGF0YShpbml0KSwgbVNpemUoTikge30KLQotcHJpdmF0ZToKLSAgICBjb25zdCBUICptRGF0YTsKLSAgICBjb25zdCBzaXplX3QgbVNpemU7Ci19OwotCi0vLy8gXGFkZHRvZ3JvdXAgaW50ZXJuYWwKLS8vLyBAewotCi0vLy8gSGVscGVyIGNsYXNzIHRvIGluaXRpYWxpemUgZmxleGlibGUgYXJyYXlzIHdpdGggdmFyaW91cyBpbml0YWxpemVycy4KLXN0cnVjdCBfQzJWYWx1ZUFycmF5SGVscGVyIHsKLSAgICAvLyBjaGFyW10tcyBhcmUgdXNlZCBhcyBudWxsIHRlcm1pbmF0ZWQgc3RyaW5ncywgc28gdGhlIGxhc3QgZWxlbWVudCBpcyBuZXZlciBpbml0ZWQuCi0KLSAgICAvLy8gSW5pdGlhbGl6ZSBhIGZsZXhpYmxlIGFycmF5IHVzaW5nIGEgY29uc3RleHByIG1lbW9yeSBibG9jay4KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgIHN0YXRpYyB2b2lkIGluaXQoVCgmYXJyYXkpW10sIHNpemVfdCBhcnJheUxlbiwgY29uc3QgQzJNZW1vcnlCbG9jazxUPiAmYmxvY2spIHsKLSAgICAgICAgLy8gcmVzZXJ2ZSBsYXN0IGVsZW1lbnQgZm9yIHRlcm1pbmFsIDAgZm9yIHN0cmluZ3MKLSAgICAgICAgaWYgKGFycmF5TGVuICYmIHN0ZDo6aXNfc2FtZTxULCBjaGFyPjo6dmFsdWUpIHsKLSAgICAgICAgICAgIC0tYXJyYXlMZW47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJsb2NrLmRhdGEoKSkgewotICAgICAgICAgICAgbWVtY3B5KGFycmF5LCBibG9jay5kYXRhKCksIHN0ZDo6bWluKGFycmF5TGVuLCBibG9jay5zaXplKCkpICogc2l6ZW9mKFQpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vLyBJbml0aWFsaXplIGEgZmxleGlibGUgYXJyYXkgdXNpbmcgYW4gaW5pdGlhbGl6ZXIgbGlzdC4KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgIHN0YXRpYyB2b2lkIGluaXQoVCgmYXJyYXkpW10sIHNpemVfdCBhcnJheUxlbiwgY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+ICZpbml0KSB7Ci0gICAgICAgIHNpemVfdCBpeCA9IDA7Ci0gICAgICAgIC8vIHJlc2VydmUgbGFzdCBlbGVtZW50IGZvciB0ZXJtaW5hbCAwIGZvciBzdHJpbmdzCi0gICAgICAgIGlmIChhcnJheUxlbiAmJiBzdGQ6OmlzX3NhbWU8VCwgY2hhcj46OnZhbHVlKSB7Ci0gICAgICAgICAgICAtLWFycmF5TGVuOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoY29uc3QgVCAmaXRlbSA6IGluaXQpIHsKLSAgICAgICAgICAgIGlmIChpeCA9PSBhcnJheUxlbikgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXJyYXlbaXgrK10gPSBpdGVtOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8vIEluaXRpYWxpemUgYSBmbGV4aWJsZSBhcnJheSB1c2luZyBhbm90aGVyIGZsZXhpYmxlIGFycmF5LgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHVuc2lnbmVkIE4+Ci0gICAgc3RhdGljIHZvaWQgaW5pdChUKCZhcnJheSlbXSwgc2l6ZV90IGFycmF5TGVuLCBjb25zdCBUKCZzdHIpW05dKSB7Ci0gICAgICAgIC8vIHJlc2VydmUgbGFzdCBlbGVtZW50IGZvciB0ZXJtaW5hbCAwIGZvciBzdHJpbmdzCi0gICAgICAgIGlmIChhcnJheUxlbiAmJiBzdGQ6OmlzX3NhbWU8VCwgY2hhcj46OnZhbHVlKSB7Ci0gICAgICAgICAgICAtLWFycmF5TGVuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhcnJheUxlbikgewotICAgICAgICAgICAgc3RybmNweShhcnJheSwgc3RyLCBzdGQ6Om1pbihhcnJheUxlbiwgKHNpemVfdClOKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19OwotCi0vKioKLSAqIFNwZWNpYWxpemF0aW9uIGZvciBhIGZsZXhpYmxlIGJsb2IgYW5kIHN0cmluZyBhcnJheXMuIEEgc3RydWN0dXJlIHRlbXBsYXRlIGVuY2Fwc3VsYXRpbmcgYSBzaW5nbGUKLSAqIGZsZXhpYmxlIGFycmF5IG1lbWJlciB3aXRoIGRlZmF1bHQgZmxleGlibGUgY29uc3RydWN0b3JzIGFuZCBubyBiYXNlLWluZGV4LiBUaGlzIHR5cGUgY2Fubm90IGJlCi0gKiBjb25zdHJ1Y3RlZCBvbiBpdHMgb3duIGFzIGl0J3Mgc2l6ZSBpcyAwLgotICoKLSAqIFxpbnRlcm5hbCBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8VFtdPiBzaW1wbHkgYmVjYXVzZSBpdHMgbWVtYmVyIGhhcyB0aGUgbmFtZQotICogYXMgbVZhbHVlIHRvIHJlZmxlY3QgdGhpcyBpcyBhIHNpbmdsZSB2YWx1ZS4KLSAqLwotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXN0cnVjdCBDMlNpbXBsZVZhbHVlU3RydWN0PFRbXT4gewotICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPFQsIGNoYXI+Ojp2YWx1ZSB8fCBzdGQ6OmlzX3NhbWU8VCwgdWludDhfdD46OnZhbHVlLAotICAgICAgICAgICAgICAgICAgIkMyU2ltcGxlVmFsdWVTdHJ1Y3Q8VFtdPiBpcyBvbmx5IGZvciBCTE9CIG9yIFNUUklORyIpOwotICAgIFQgbVZhbHVlW107Ci0KLSAgICBpbmxpbmUgQzJTaW1wbGVWYWx1ZVN0cnVjdCgpID0gZGVmYXVsdDsKLSAgICBERUZJTkVfQzJTVFJVQ1RfTk9fQkFTRShTaW1wbGVWYWx1ZSkKLSAgICBGTEVYKEMyU2ltcGxlVmFsdWVTdHJ1Y3QsIG1WYWx1ZSkKLQotcHJpdmF0ZToKLSAgICBpbmxpbmUgQzJTaW1wbGVWYWx1ZVN0cnVjdChzaXplX3QgZmxleENvdW50LCBjb25zdCBDMk1lbW9yeUJsb2NrPFQ+ICZibG9jaykgewotICAgICAgICBfQzJWYWx1ZUFycmF5SGVscGVyOjppbml0KG1WYWx1ZSwgZmxleENvdW50LCBibG9jayk7Ci0gICAgfQotCi0gICAgaW5saW5lIEMyU2ltcGxlVmFsdWVTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+ICZpbml0KSB7Ci0gICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQobVZhbHVlLCBmbGV4Q291bnQsIGluaXQpOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHVuc2lnbmVkIE4+Ci0gICAgaW5saW5lIEMyU2ltcGxlVmFsdWVTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgY29uc3QgVCgmaW5pdClbTl0pIHsKLSAgICAgICAgX0MyVmFsdWVBcnJheUhlbHBlcjo6aW5pdChtVmFsdWUsIGZsZXhDb3VudCwgaW5pdCk7Ci0gICAgfQotfTsKLQotLy8vIEB9Ci0KLS8qKgotICogQSBzdHJ1Y3R1cmUgdGVtcGxhdGUgZW5jYXBzdWxhdGluZyBhIHNpbmdsZSBmbGV4aWJsZSBhcnJheSBlbGVtZW50IG9mIGEgc3BlY2lmaWMgdHlwZSAoVCkgd2l0aAotICogZGVmYXVsdCBjb25zdHJ1Y3RvcnMgYW5kIG5vIGJhc2UtaW5kZXguIFRoaXMgdHlwZSBjYW5ub3QgYmUgY29uc3RydWN0ZWQgb24gaXRzIG93biBhcyBpdCdzIHNpemUKLSAqIGlzIDAuIEluc3RlYWQsIGl0IGlzIG1lYW50IHRvIGJlIHVzZWQgYXMgYSBwYXJhbWV0ZXIsIGUuZy4KLSAqCi0gKiAgIHR5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8QzJNeUZhbmN5U3RydWN0PiwKLSAqICAgICAgICAgICBrUGFyYW1JbmRleE15RmFuY3lBcnJheVN0cmVhbVBhcmFtPiBDMk15RmFuY3lBcnJheVN0cmVhbUluZm87Ci0gKi8KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgQzJTaW1wbGVBcnJheVN0cnVjdCB7Ci0gICAgc3RhdGljX2Fzc2VydCghc3RkOjppc19zYW1lPFQsIGNoYXI+Ojp2YWx1ZSAmJiAhc3RkOjppc19zYW1lPFQsIHVpbnQ4X3Q+Ojp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICJ1c2UgQzJTaW1wbGVWYWx1ZVN0cnVjdDxUW10+IGlzIGZvciBCTE9CIG9yIFNUUklORyIpOwotCi0gICAgVCBtVmFsdWVzW107IC8vLzwgYXJyYXkgbWVtYmVyCi0gICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IKLSAgICBpbmxpbmUgQzJTaW1wbGVBcnJheVN0cnVjdCgpID0gZGVmYXVsdDsKLSAgICBERUZJTkVfQzJTVFJVQ1RfTk9fQkFTRShTaW1wbGVBcnJheSkKLSAgICBGTEVYKEMyU2ltcGxlQXJyYXlTdHJ1Y3QsIG1WYWx1ZXMpCi0KLXByaXZhdGU6Ci0gICAgLy8vIENvbnN0cnVjdCBmcm9tIGEgQzJNZW1vcnlCbG9jay4KLSAgICAvLy8gVXNlZCBvbmx5IGJ5IHRoZSBmbGV4aWJsZSBwYXJhbWV0ZXIgYWxsb2NhdG9ycyAoYWxsb2NfdW5pcXVlICYgYWxsb2Nfc2hhcmVkKS4KLSAgICBpbmxpbmUgQzJTaW1wbGVBcnJheVN0cnVjdChzaXplX3QgZmxleENvdW50LCBjb25zdCBDMk1lbW9yeUJsb2NrPFQ+ICZibG9jaykgewotICAgICAgICBfQzJWYWx1ZUFycmF5SGVscGVyOjppbml0KG1WYWx1ZXMsIGZsZXhDb3VudCwgYmxvY2spOwotICAgIH0KLQotICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhbiBpbml0aWFsaXplciBsaXN0LgotICAgIC8vLyBVc2VkIG9ubHkgYnkgdGhlIGZsZXhpYmxlIHBhcmFtZXRlciBhbGxvY2F0b3JzIChhbGxvY191bmlxdWUgJiBhbGxvY19zaGFyZWQpLgotICAgIGlubGluZSBDMlNpbXBsZUFycmF5U3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiAmaW5pdCkgewotICAgICAgICBfQzJWYWx1ZUFycmF5SGVscGVyOjppbml0KG1WYWx1ZXMsIGZsZXhDb3VudCwgaW5pdCk7Ci0gICAgfQotCi0gICAgLy8vIENvbnN0cnVjdCBmcm9tIGFub3RoZXIgZmxleGlibGUgYXJyYXkuCi0gICAgLy8vIFVzZWQgb25seSBieSB0aGUgZmxleGlibGUgcGFyYW1ldGVyIGFsbG9jYXRvcnMgKGFsbG9jX3VuaXF1ZSAmIGFsbG9jX3NoYXJlZCkuCi0gICAgdGVtcGxhdGU8dW5zaWduZWQgTj4KLSAgICBpbmxpbmUgQzJTaW1wbGVBcnJheVN0cnVjdChzaXplX3QgZmxleENvdW50LCBjb25zdCBUKCZpbml0KVtOXSkgewotICAgICAgICBfQzJWYWx1ZUFycmF5SGVscGVyOjppbml0KG1WYWx1ZXMsIGZsZXhDb3VudCwgaW5pdCk7Ci0gICAgfQotfTsKLQotLyoqCi0gKiBcYWRkdG9ncm91cCBzaW1wbGV2YWx1ZSBTaW1wbGUgdmFsdWUgYW5kIGFycmF5IHN0cnVjdHVyZXMuCi0gKiBAewotICoKLSAqIFNpbXBsZSB2YWx1ZSBzdHJ1Y3R1cmVzLgotICoKLSAqIFN0cnVjdHVyZXMgY29udGFpbmluZyBhIHNpbmdsZSBzaW1wbGUgdmFsdWUuIFRoZXNlIGNhbiBiZSByZXVzZWQgdG8gZWFzaWx5IGRlZmluZSBzaW1wbGUKLSAqIHBhcmFtZXRlcnMgb2YgdmFyaW91cyB0eXBlczoKLSAqCi0gKiAgIHR5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMySW50MzJWYWx1ZSwga1BhcmFtSW5kZXhNeUludGVnZXJQb3J0UGFyYW0+Ci0gKiAgICAgICAgICAgQzJNeUludGVnZXJQb3J0UGFyYW1UdW5pbmc7Ci0gKgotICogVGhleSBjb250YWluIGEgc2luZ2xlIG1lbWJlciAobVZhbHVlIG9yIG1WYWx1ZXMpIHRoYXQgaXMgZGVzY3JpYmVkIGFzICJ2YWx1ZSIgb3IgInZhbHVlcyIuCi0gKi8KLS8vLyBBIDMyLWJpdCBzaWduZWQgaW50ZWdlciBwYXJhbWV0ZXIgaW4gbVZhbHVlLCBkZXNjcmliZWQgYXMgInZhbHVlIgotdHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PGludDMyX3Q+IEMySW50MzJWYWx1ZTsKLS8vLyBBIDMyLWJpdCBzaWduZWQgaW50ZWdlciBhcnJheSBwYXJhbWV0ZXIgaW4gbVZhbHVlcywgZGVzY3JpYmVkIGFzICJ2YWx1ZXMiCi10eXBlZGVmIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8aW50MzJfdD4gQzJJbnQzMkFycmF5OwotLy8vIEEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgcGFyYW1ldGVyIGluIG1WYWx1ZSwgZGVzY3JpYmVkIGFzICJ2YWx1ZSIKLXR5cGVkZWYgQzJTaW1wbGVWYWx1ZVN0cnVjdDx1aW50MzJfdD4gQzJVaW50MzJWYWx1ZTsKLS8vLyBBIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGFycmF5IHBhcmFtZXRlciBpbiBtVmFsdWVzLCBkZXNjcmliZWQgYXMgInZhbHVlcyIKLXR5cGVkZWYgQzJTaW1wbGVBcnJheVN0cnVjdDx1aW50MzJfdD4gQzJVaW50MzJBcnJheTsKLS8vLyBBIDY0LWJpdCBzaWduZWQgaW50ZWdlciBwYXJhbWV0ZXIgaW4gbVZhbHVlLCBkZXNjcmliZWQgYXMgInZhbHVlIgotdHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PGludDY0X3Q+IEMySW50NjRWYWx1ZTsKLS8vLyBBIDY0LWJpdCBzaWduZWQgaW50ZWdlciBhcnJheSBwYXJhbWV0ZXIgaW4gbVZhbHVlcywgZGVzY3JpYmVkIGFzICJ2YWx1ZXMiCi10eXBlZGVmIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8aW50NjRfdD4gQzJJbnQ2NEFycmF5OwotLy8vIEEgNjQtYml0IHVuc2lnbmVkIGludGVnZXIgcGFyYW1ldGVyIGluIG1WYWx1ZSwgZGVzY3JpYmVkIGFzICJ2YWx1ZSIKLXR5cGVkZWYgQzJTaW1wbGVWYWx1ZVN0cnVjdDx1aW50NjRfdD4gQzJVaW50NjRWYWx1ZTsKLS8vLyBBIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGFycmF5IHBhcmFtZXRlciBpbiBtVmFsdWVzLCBkZXNjcmliZWQgYXMgInZhbHVlcyIKLXR5cGVkZWYgQzJTaW1wbGVBcnJheVN0cnVjdDx1aW50NjRfdD4gQzJVaW50NjRBcnJheTsKLS8vLyBBIGZsb2F0IHBhcmFtZXRlciBpbiBtVmFsdWUsIGRlc2NyaWJlZCBhcyAidmFsdWUiCi10eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8ZmxvYXQ+IEMyRmxvYXRWYWx1ZTsKLS8vLyBBIGZsb2F0IGFycmF5IHBhcmFtZXRlciBpbiBtVmFsdWVzLCBkZXNjcmliZWQgYXMgInZhbHVlcyIKLXR5cGVkZWYgQzJTaW1wbGVBcnJheVN0cnVjdDxmbG9hdD4gQzJGbG9hdEFycmF5OwotLy8vIEEgYmxvYiBmbGV4aWJsZSBwYXJhbWV0ZXIgaW4gbVZhbHVlLCBkZXNjcmliZWQgYXMgInZhbHVlIgotdHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PHVpbnQ4X3RbXT4gQzJCbG9iVmFsdWU7Ci0vLy8gQSBzdHJpbmcgZmxleGlibGUgcGFyYW1ldGVyIGluIG1WYWx1ZSwgZGVzY3JpYmVkIGFzICJ2YWx1ZSIKLXR5cGVkZWYgQzJTaW1wbGVWYWx1ZVN0cnVjdDxjaGFyW10+IEMyU3RyaW5nVmFsdWU7Ci0KLSNpZiAxCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBDMlNpbXBsZVZhbHVlU3RydWN0PFQ+OjpmaWVsZExpc3QgPSB7IEMyRklFTEQobVZhbHVlLCAidmFsdWUiKSB9OwotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLWNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gQzJTaW1wbGVWYWx1ZVN0cnVjdDxUW10+OjpmaWVsZExpc3QgPSB7IEMyRklFTEQobVZhbHVlLCAidmFsdWUiKSB9OwotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLWNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gQzJTaW1wbGVBcnJheVN0cnVjdDxUPjo6ZmllbGRMaXN0ID0geyBDMkZJRUxEKG1WYWx1ZXMsICJ2YWx1ZXMiKSB9OwotI2Vsc2UKLS8vIFRoaXMgc2VlbSB0byBiZSBhYmxlIHRvIGJlIGhhbmRsZWQgYnkgdGhlIHRlbXBsYXRlIGFib3ZlCi1ERVNDUklCRV9URU1QTEFURURfQzJTVFJVQ1QoQzJTaW1wbGVWYWx1ZVN0cnVjdDxpbnQzMl90PiwgeyBDMkZJRUxEKG1WYWx1ZSwgInZhbHVlIikgfSk7Ci1ERVNDUklCRV9URU1QTEFURURfQzJTVFJVQ1QoQzJTaW1wbGVWYWx1ZVN0cnVjdDx1aW50MzJfdD4sIHsgQzJGSUVMRChtVmFsdWUsICJ2YWx1ZSIpIH0pOwotREVTQ1JJQkVfVEVNUExBVEVEX0MyU1RSVUNUKEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8aW50NjRfdD4sIHsgQzJGSUVMRChtVmFsdWUsICJ2YWx1ZSIpIH0pOwotREVTQ1JJQkVfVEVNUExBVEVEX0MyU1RSVUNUKEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8dWludDY0X3Q+LCB7IEMyRklFTEQobVZhbHVlLCAidmFsdWUiKSB9KTsKLURFU0NSSUJFX1RFTVBMQVRFRF9DMlNUUlVDVChDMlNpbXBsZVZhbHVlU3RydWN0PGZsb2F0PiwgeyBDMkZJRUxEKG1WYWx1ZSwgInZhbHVlIikgfSk7Ci1ERVNDUklCRV9URU1QTEFURURfQzJTVFJVQ1QoQzJTaW1wbGVWYWx1ZVN0cnVjdDx1aW50OF90W10+LCB7IEMyRklFTEQobVZhbHVlLCAidmFsdWUiKSB9KTsKLURFU0NSSUJFX1RFTVBMQVRFRF9DMlNUUlVDVChDMlNpbXBsZVZhbHVlU3RydWN0PGNoYXJbXT4sIHsgQzJGSUVMRChtVmFsdWUsICJ2YWx1ZSIpIH0pOwotREVTQ1JJQkVfVEVNUExBVEVEX0MyU1RSVUNUKEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8aW50MzJfdD4sIHsgQzJGSUVMRChtVmFsdWVzLCAidmFsdWVzIikgfSk7Ci1ERVNDUklCRV9URU1QTEFURURfQzJTVFJVQ1QoQzJTaW1wbGVBcnJheVN0cnVjdDx1aW50MzJfdD4sIHsgQzJGSUVMRChtVmFsdWVzLCAidmFsdWVzIikgfSk7Ci1ERVNDUklCRV9URU1QTEFURURfQzJTVFJVQ1QoQzJTaW1wbGVBcnJheVN0cnVjdDxpbnQ2NF90PiwgeyBDMkZJRUxEKG1WYWx1ZXMsICJ2YWx1ZXMiKSB9KTsKLURFU0NSSUJFX1RFTVBMQVRFRF9DMlNUUlVDVChDMlNpbXBsZUFycmF5U3RydWN0PHVpbnQ2NF90PiwgeyBDMkZJRUxEKG1WYWx1ZXMsICJ2YWx1ZXMiKSB9KTsKLURFU0NSSUJFX1RFTVBMQVRFRF9DMlNUUlVDVChDMlNpbXBsZUFycmF5U3RydWN0PGZsb2F0PiwgeyBDMkZJRUxEKG1WYWx1ZXMsICJ2YWx1ZXMiKSB9KTsKLSNlbmRpZgotCi0vLy8gQH0KLQotLy8vIEB9Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQzJQQVJBTV9ERUZfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi9pbmNsdWRlL0MyV29yay5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL2luY2x1ZGUvQzJXb3JrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MmQxMWEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL2luY2x1ZGUvQzJXb3JrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQzJXT1JLX0hfCi0KLSNkZWZpbmUgQzJXT1JLX0hfCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8QzJQYXJhbS5oPgotI2luY2x1ZGUgPEMyQnVmZmVyLmg+Ci0jaW5jbHVkZSA8QzJDb25maWcuaD4KLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotdHlwZWRlZiBpbnQgc3RhdHVzX3Q7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8vIFxkZWZncm91cCB3b3JrIFdvcmsgYW5kIGRhdGEgcHJvY2Vzc2luZwotLy8vIEB7Ci0KLXN0cnVjdCBDMlNldHRpbmdSZXN1bHQgewotICAgIGVudW0gRmFpbHVyZSB7Ci0gICAgICAgIFJFQURfT05MWSwgIC8vLzwgcGFyYW1ldGVyIGlzIHJlYWQtb25seSBhbmQgY2Fubm90IGJlIHNldAotICAgICAgICBNSVNNQVRDSCwgICAvLy88IHBhcmFtZXRlciBtaXNtYXRjaGVzIGlucHV0IGRhdGEKLSAgICAgICAgQkFEX1ZBTFVFLCAgLy8vPCBwYXJhbWV0ZXIgZG9lcyBub3QgYWNjZXB0IHZhbHVlCi0gICAgICAgIEJBRF9UWVBFLCAgIC8vLzwgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAgICAgQkFEX1BPUlQsICAgLy8vPCBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGUgc3BlY2lmaWMgcG9ydAotICAgICAgICBCQURfSU5ERVgsICAvLy88IHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBzcGVjaWZpYyBzdHJlYW0KLSAgICAgICAgQ09ORkxJQ1QsICAgLy8vPCBwYXJhbWV0ZXIgaXMgaW4gY29uZmxpY3Qgd2l0aCBhbm90aGVyIHNldHRpbmcKLSAgICB9OwotCi0gICAgQzJQYXJhbUZpZWxkIGZpZWxkOwotICAgIEZhaWx1cmUgZmFpbHVyZTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gc3VwcG9ydGVkVmFsdWVzOyAvLzwgaWYgZGlmZmVyZW50IGZyb20gbm9ybWFsIChlLmcuIGluIGNvbmZsaWN0IHcvYW5vdGhlciBwYXJhbSBvciBpbnB1dCBkYXRhKQotICAgIHN0ZDo6bGlzdDxDMlBhcmFtRmllbGQ+IGNvbmZsaWN0aW5nRmllbGRzOwotfTsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyAgV09SSwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vIG5vZGVfaWQtcwotdHlwZWRlZiB1aW50MzJfdCBub2RlX2lkOwotCi1lbnVtIGZsYWdzX3QgOiB1aW50MzJfdCB7Ci0gICAgQlVGRkVSRkxBR19DT0RFQ19DT05GSUcsCi0gICAgQlVGRkVSRkxBR19EUk9QX0ZSQU1FLAotICAgIEJVRkZFUkZMQUdfRU5EX09GX1NUUkVBTSwKLX07Ci0KLWVudW0gewotICAgIGtQYXJhbUluZGV4V29ya09yZGluYWwsCi19OwotCi1zdHJ1Y3QgQzJXb3JrT3JkaW5hbFN0cnVjdCB7Ci0gICAgdWludDY0X3QgdGltZXN0YW1wOwotICAgIHVpbnQ2NF90IGZyYW1lX2luZGV4OyAgICAvLyBzdWJtaXNzaW9uIG9yZGluYWwgb24gdGhlIGluaXRpYWwgY29tcG9uZW50Ci0gICAgdWludDY0X3QgY3VzdG9tX29yZGluYWw7IC8vIGNhbiBiZSBnaXZlbiBieSB0aGUgY29tcG9uZW50LCBlLmcuIGRlY29kZSBvcmRlcgotCi0gICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChXb3JrT3JkaW5hbCkKLSAgICBDMkZJRUxEKHRpbWVzdGFtcCwgInRpbWVzdGFtcCIpCi0gICAgQzJGSUVMRChmcmFtZV9pbmRleCwgImZyYW1lLWluZGV4IikKLSAgICBDMkZJRUxEKGN1c3RvbV9vcmRpbmFsLCAiY3VzdG9tLW9yZGluYWwiKQotfTsKLQotc3RydWN0IEMyQnVmZmVyUGFjayB7Ci0vL3B1YmxpYzoKLSAgICBmbGFnc190ICBmbGFnczsKLSAgICBDMldvcmtPcmRpbmFsU3RydWN0IG9yZGluYWw7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPj4gYnVmZmVyczsKLSAgICAvLzwgZm9yIGluaXRpYWwgd29yayBpdGVtLCB0aGVzZSBtYXkgYWxzbyBjb21lIGZyb20gdGhlIHBhcnNlciAtIGlmIHByb3ZpZGVkCi0gICAgLy88IGZvciBvdXRwdXQgYnVmZmVycywgdGhlc2UgYXJlIHRoZSByZXNwb25zZXMgdG8gcmVxdWVzdGVkSW5mb3MKLSAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMySW5mbz4+ICAgICAgIGluZm9zOwotICAgIHN0ZDo6bGlzdDxzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvQnVmZmVyPj4gaW5mb0J1ZmZlcnM7Ci19OwotCi1zdHJ1Y3QgQzJXb3JrbGV0IHsKLS8vcHVibGljOgotICAgIC8vIElOCi0gICAgbm9kZV9pZCBjb21wb25lbnQ7Ci0KLSAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiB0dW5pbmdzOyAvLzwgdHVuaW5ncyB0byBiZSBhcHBsaWVkIGJlZm9yZSBwcm9jZXNzaW5nIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JrbGV0Ci0gICAgc3RkOjpsaXN0PEMyUGFyYW06OlR5cGU+IHJlcXVlc3RlZEluZm9zOwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrQWxsb2NhdG9yPj4gYWxsb2NhdG9yczsgLy88IFRoaXMgdmVjdG9yIHNoYWxsIGJlIHRoZSBzYW1lIHNpemUgYXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLzwgb3V0cHV0LmJ1ZmZlcnMuCi0KLSAgICAvLyBPVVQKLSAgICBDMkJ1ZmZlclBhY2sgb3V0cHV0OwotICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7Ci19OwotCi0vKioKLSAqIFRoaXMgc3RydWN0dXJlIGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IGFsbCBhIHNpbmdsZSB3b3JrIGl0ZW0uCi0gKgotICogVGhpcyBzdHJ1Y3R1cmUgc2hhbGwgYmUgcGFzc2VkIGJ5IHRoZSBjbGllbnQgdG8gdGhlIGNvbXBvbmVudCBmb3IgdGhlIGZpcnN0IHdvcmtsZXQuIEFzIHN1Y2gsCi0gKiB3b3JrbGV0cyBtdXN0IG5vdCBiZSBlbXB0eS4gVGhlIG93bmVyc2hpcCBvZiB0aGlzIG9iamVjdCBpcyBwYXNzZWQuCi0gKgotICogaW5wdXQ6Ci0gKiAgICAgIFRoZSBpbnB1dCBkYXRhIHRvIGJlIHByb2Nlc3NlZC4gVGhpcyBpcyBwcm92aWRlZCBieSB0aGUgY2xpZW50IHdpdGggb3duZXJzaGlwLiBXaGVuIHRoZSB3b3JrCi0gKiAgICAgIGlzIHJldHVybmVkLCB0aGUgaW5wdXQgYnVmZmVyLXBhY2sncyBidWZmZXIgdmVjdG9yIHNoYWxsIGNvbnRhaW4gbnVsbHB0cnMuCi0gKgotICogd29ya2xldHM6Ci0gKiAgICAgIFRoZSBjaGFpbiBvZiBjb21wb25lbnRzIGFuZCBhc3NvY2lhdGVkIGFsbG9jYXRvcnMsIHR1bmluZ3MgYW5kIGluZm8gcmVxdWVzdHMgdGhhdCB0aGUgZGF0YQotICogICAgICBtdXN0IHBhc3MgdGhyb3VnaC4gSWYgdGhpcyBoYXMgbW9yZSB0aGFuIGEgc2luZ2xlIGVsZW1lbnQsIHRoZSB0dW5uZWxzIGJldHdlZW4gc3VjY2Vzc2l2ZQotICogICAgICBjb21wb25lbnRzIG9mIHRoZSB3b3JrbGV0IGNoYWluIG11c3QgaGF2ZSBiZWVuIChzdWNjZXNzZnVsbHkpIHByZS1yZWdpc3RlcmVkIGF0IHRoZSB0aW1lCi0gKiAgICAgIHRoZSB3b3JrIGlzIHN1Ym1pdHRlZC4gQWxsb2NhdGluZyB0aGUgb3V0cHV0IGJ1ZmZlcnMgaW4gdGhlIHdvcmtsZXRzIGlzIHRoZSByZXNwb25zaWJpbGl0eQotICogICAgICBvZiBlYWNoIGNvbXBvbmVudC4gVXBvbiB3b3JrIHN1Ym1pc3Npb24sIGVhY2ggb3V0cHV0IGJ1ZmZlci1wYWNrIHNoYWxsIGJlIGFuIGFwcHJvcHJpYXRlbHkKLSAqICAgICAgc2l6ZWQgdmVjdG9yIGNvbnRhaW5pbmcgbnVsbHB0cnMuIFdoZW4gdGhlIHdvcmsgaXMgY29tcGxldGVkL3JldHVybmVkIHRvIHRoZSBjbGllbnQsCi0gKgotICogd29ya2xldHNfcHJvY2Vzc2VkOgotICogICAgICBJdCBzaGFsbCBiZSBpbml0aWFsaXplZCB0byAwIGJ5IHRoZSBjbGllbnQgd2hlbiB0aGUgd29yayBpcyBzdWJtaXR0ZWQuCi0gKiAgICAgIEl0IHNoYWxsIGNvbnRhaW4gdGhlIG51bWJlciBvZiB3b3JrbGV0cyB0aGF0IHdlcmUgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCB3aGVuIHRoZSB3b3JrIGlzCi0gKiAgICAgIHJldHVybmVkLiBJZiB0aGlzIGlzIGxlc3MgdGhlbiB0aGUgbnVtYmVyIG9mIHdvcmtsZXRzLCByZXN1bHQgbXVzdCBub3QgYmUgc3VjY2Vzcy4KLSAqICAgICAgSXQgbXVzdCBiZSBpbiB0aGUgcmFuZ2Ugb2YgWzAsIHdvcmtsZXRzLnNpemUoKV0uCi0gKgotICogcmVzdWx0OgotICogICAgICBUaGUgZmluYWwgb3V0Y29tZSBvZiB0aGUgd29yay4gSWYgMCB3aGVuIHdvcmsgaXMgcmV0dXJuZWQsIGl0IGlzIGFzc3VtZWQgdGhhdCBhbGwgd29ya2xldHMKLSAqICAgICAgaGF2ZSBiZWVuIHByb2Nlc3NlZC4KLSAqLwotc3RydWN0IEMyV29yayB7Ci0vL3B1YmxpYzoKLSAgICAvLyBwcmUtY2hhaW4gaW5mb3MgKGZvciBwb3J0aW9ucyBvZiBhIHR1bm5lbGluZyBjaGFpbiB0aGF0IGhhcHBlbmQgYmVmb3JlIHRoaXMgd29yay1jaGFpbiBmb3IKLSAgICAvLyB0aGlzIHdvcmsgaXRlbSAtIGR1ZSB0byBmcmFtZXdvcmsgZmFjaWxpdGF0ZWQgKG5vbi10dW5uZWxlZCkgd29yay1jaGFpbmluZykKLSAgICBzdGQ6Omxpc3Q8c3RkOjpwYWlyPHN0ZDo6dW5pcXVlX3B0cjxDMlBvcnRNaW1lQ29uZmlnPiwgc3RkOjp1bmlxdWVfcHRyPEMySW5mbz4+PiBwcmVDaGFpbkluZm9zOwotICAgIHN0ZDo6bGlzdDxzdGQ6OnBhaXI8c3RkOjp1bmlxdWVfcHRyPEMyUG9ydE1pbWVDb25maWc+LCBzdGQ6OnVuaXF1ZV9wdHI8QzJCdWZmZXI+Pj4gcHJlQ2hhaW5JbmZvQmxvYnM7Ci0KLSAgICBDMkJ1ZmZlclBhY2sgaW5wdXQ7Ci0gICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcmtsZXQ+PiB3b3JrbGV0czsKLQotICAgIHVpbnQzMl90IHdvcmtsZXRzX3Byb2Nlc3NlZDsKLSAgICBzdGF0dXNfdCByZXN1bHQ7Ci19OwotCi1zdHJ1Y3QgQzJXb3JrT3V0bGluZSB7Ci0vL3B1YmxpYzoKLSAgICBDMldvcmtPcmRpbmFsU3RydWN0IG9yZGluYWw7Ci0gICAgc3RkOjpsaXN0PG5vZGVfaWQ+IGNoYWluOwotfTsKLQotLy8vIEB9Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQzJXT1JLX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvdGVzdHMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi90ZXN0cy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWM0MjUzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi90ZXN0cy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotIyBCdWlsZCB0aGUgdW5pdCB0ZXN0cy4KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUyA6PSAkKExPQ0FMX1BBVEgpL0FuZHJvaWQubWsKLQotTE9DQUxfTU9EVUxFIDo9IGNvZGVjMl90ZXN0Ci0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0Jdm5kay9DMlV0aWxUZXN0LmNwcCBcCi0JQzJfdGVzdC5jcHAgXAotCUMyUGFyYW1fdGVzdC5jcHAgXAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjdXRpbHMgXAotCWxpYnN0YWdlZnJpZ2h0X2NvZGVjMiBcCi0JbGlibG9nCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotCWZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL2luY2x1ZGUgXAotCWZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL3ZuZGsvaW5jbHVkZSBcCi0JJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCi0KLUxPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsIC1zdGQ9YysrMTQKLUxPQ0FMX0NMQU5HIDo9IHRydWUKLQotaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQotCi0jIEluY2x1ZGUgc3ViZGlyZWN0b3J5IG1ha2VmaWxlcwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBJZiB3ZSdyZSBidWlsZGluZyB3aXRoIE9ORV9TSE9UX01BS0VGSUxFIChtbSwgbW1tKSwgdGhlbiB3aGF0IHRoZSBmcmFtZXdvcmsKLSMgdGVhbSByZWFsbHkgd2FudHMgaXMgdG8gYnVpbGQgdGhlIHN0dWZmIGRlZmluZWQgYnkgdGhpcyBtYWtlZmlsZS4KLWlmZXEgKCwkKE9ORV9TSE9UX01BS0VGSUxFKSkKLWluY2x1ZGUgJChjYWxsIGZpcnN0LW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQotZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi90ZXN0cy9DMlBhcmFtX3Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL3Rlc3RzL0MyUGFyYW1fdGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjODJjODQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL3Rlc3RzL0MyUGFyYW1fdGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNjg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiQzJQYXJhbV90ZXN0IgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgPHV0aWwvQzJQYXJhbVV0aWxzLmg+Ci0jaW5jbHVkZSA8QzJQYXJhbURlZi5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXZvaWQgUHJpbnRUbyhjb25zdCBfQzJGaWVsZElkICZpZCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7Ci0gICAgKm9zIDw8ICJAIiA8PCBpZC5fbU9mZnNldCA8PCAiKyIgPDwgaWQuX21TaXplOwotfQotCi12b2lkIFByaW50VG8oY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZkLCA6OnN0ZDo6b3N0cmVhbSAqb3MpIHsKLSAgICB1c2luZyBGRD1DMkZpZWxkRGVzY3JpcHRvcjsKLSAgICBzd2l0Y2ggKGZkLnR5cGUoKSkgewotICAgIGNhc2UgRkQ6OklOVDMyOiAqb3MgPDwgImkzMiI7IGJyZWFrOwotICAgIGNhc2UgRkQ6OklOVDY0OiAqb3MgPDwgImk2NCI7IGJyZWFrOwotICAgIGNhc2UgRkQ6OlVJTlQzMjogKm9zIDw8ICJ1MzIiOyBicmVhazsKLSAgICBjYXNlIEZEOjpVSU5UNjQ6ICpvcyA8PCAidTY0IjsgYnJlYWs7Ci0gICAgY2FzZSBGRDo6RkxPQVQ6ICpvcyA8PCAiZmxvYXQiOyBicmVhazsKLSAgICBjYXNlIEZEOjpTVFJJTkc6ICpvcyA8PCAiY2hhciI7IGJyZWFrOwotICAgIGNhc2UgRkQ6OkJMT0I6ICpvcyA8PCAidTgiOyBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBpZiAoZmQudHlwZSgpICYgRkQ6OlNUUlVDVF9GTEFHKSB7Ci0gICAgICAgICAgICAqb3MgPDwgInN0cnVjdC0iIDw8IChmZC50eXBlKCkgJiB+RkQ6OlNUUlVDVF9GTEFHKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpvcyA8PCAidHlwZS0iIDw8IGZkLnR5cGUoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAqb3MgPDwgIiAiIDw8IGZkLm5hbWUoKTsKLSAgICBpZiAoZmQubGVuZ3RoKCkgPiAxKSB7Ci0gICAgICAgICpvcyA8PCAiWyIgPDwgZmQubGVuZ3RoKCkgPDwgIl0iOwotICAgIH0gZWxzZSBpZiAoZmQubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAqb3MgPDwgIltdIjsKLSAgICB9Ci0gICAgKm9zIDw8ICIgKCI7Ci0gICAgUHJpbnRUbyhmZC5fbUZpZWxkSWQsIG9zKTsKLSAgICAqb3MgPDwgIioiIDw8IGZkLmxlbmd0aCgpIDw8ICIpIjsKLX0KLQotZW51bSBDMlBhcmFtSW5kZXhUeXBlIHsKLSAgICBrUGFyYW1JbmRleE51bWJlciwKLSAgICBrUGFyYW1JbmRleE51bWJlcnMsCi0gICAga1BhcmFtSW5kZXhOdW1iZXIyLAotICAgIGtQYXJhbUluZGV4VmVuZG9yU3RhcnQgPSBDMlBhcmFtOjpCYXNlSW5kZXg6OmtWZW5kb3JTdGFydCwKLSAgICBrUGFyYW1JbmRleFZlbmRvck51bWJlcnMsCi19OwotCi12b2lkIGZmZmYoaW50KCopKGludCkpIHt9Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNUUlVDVCBERUNMQVJBVElPTiBBTkQgREVTQ1JJUFRJT04gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotdHlwZWRlZiBDMkZpZWxkRGVzY3JpcHRvciBGRDsKLQotY2xhc3MgQzJQYXJhbVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLX07Ci0KLWNsYXNzIEMyUGFyYW1UZXN0X1BhcmFtRmllbGRMaXN0Ci0gICAgICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdGQ6OmluaXRpYWxpemVyX2xpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+PiB7Ci19OwotCi1lbnVtIHsKLSAgICBrUGFyYW1JbmRleFNpemUsCi0gICAga1BhcmFtSW5kZXhUZXN0QSwKLSAgICBrUGFyYW1JbmRleFRlc3RCLAotICAgIGtQYXJhbUluZGV4VGVzdEZsZXhTMzIsCi0gICAga1BhcmFtSW5kZXhUZXN0RmxleEVuZFMzMiwKLSAgICBrUGFyYW1JbmRleFRlc3RGbGV4UzY0LAotICAgIGtQYXJhbUluZGV4VGVzdEZsZXhFbmRTNjQsCi0gICAga1BhcmFtSW5kZXhUZXN0RmxleFNpemUsCi0gICAga1BhcmFtSW5kZXhUZXN0RmxleEVuZFNpemUsCi19OwotCi1zdHJ1Y3QgQzJTaXplU3RydWN0IHsKLSAgICBpbnQzMl90IG1OdW1iZXI7Ci0gICAgaW50MzJfdCBtSGVpZ2h0OwotICAgIGVudW0gOiB1aW50MzJfdCB7IGJhc2VJbmRleCA9IGtQYXJhbUluZGV4U2l6ZSB9OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDw9IG5lZWRlZCBmb3IgQzJGaWVsZERlc2NyaXB0b3IKLSAgICBjb25zdCBzdGF0aWMgc3RkOjppbml0aWFsaXplcl9saXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZExpc3Q7ICAvLyA8PSBuZWVkZWQgZm9yIEMyRmllbGREZXNjcmlwdG9yCi0gICAgY29uc3Qgc3RhdGljIEZEOjpUeXBlIFRZUEUgPSAoRkQ6OlR5cGUpKGJhc2VJbmRleCB8IEZEOjpTVFJVQ1RfRkxBRyk7Ci19OwotCi1ERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUihDMlNpemVTdHJ1Y3QpCi0KLS8vIFRlc3QgMS4gZGVmaW5lIGEgc3RydWN0dXJlIHdpdGhvdXQgYW55IGhlbHBlciBtZXRob2RzCi0KLWJvb2wgb3BlcmF0b3I9PShjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmYSwgY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmIpIHsKLSAgICByZXR1cm4gYS50eXBlKCkgPT0gYi50eXBlKCkKLSAgICAgICAgICAgICYmIGEubGVuZ3RoKCkgPT0gYi5sZW5ndGgoKQotICAgICAgICAgICAgJiYgc3RyY21wKGEubmFtZSgpLCBiLm5hbWUoKSkgPT0gMAotICAgICAgICAgICAgJiYgYS5fbUZpZWxkSWQgPT0gYi5fbUZpZWxkSWQ7Ci19Ci0KLXN0cnVjdCBDMlRlc3RTdHJ1Y3RfQSB7Ci0gICAgaW50MzJfdCBtU2lnbmVkMzI7Ci0gICAgaW50NjRfdCBtU2lnbmVkNjRbMl07Ci0gICAgdWludDMyX3QgbVVuc2lnbmVkMzJbMV07Ci0gICAgdWludDY0X3QgbVVuc2lnbmVkNjQ7Ci0gICAgZmxvYXQgbUZsb2F0OwotICAgIEMyU2l6ZVN0cnVjdCBtU2l6ZVszXTsKLSAgICB1aW50OF90IG1CbG9iWzEwMF07Ci0gICAgY2hhciBtU3RyaW5nWzEwMF07Ci0gICAgYm9vbCBtWWVzTm9bMTAwXTsKLQotICAgIGNvbnN0IHN0YXRpYyBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkTGlzdDsKLSAgICAvLyBlbnVtIDogdWludDMyX3QgeyBiYXNlSW5kZXggPSBrUGFyYW1JbmRleFRlc3QgfTsKLSAgICAvLyB0eXBlZGVmIEMyVGVzdFN0cnVjdF9BIF90eXBlOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfQTo6ZmllbGRMaXN0ID0KLSAgICB7IHsgRkQ6OklOVDMyLCAgICAxLCAiczMyIiwgICAwLCA0IH0sCi0gICAgICB7IEZEOjpJTlQ2NCwgICAgMiwgInM2NCIsICAgNCwgOCB9LAotICAgICAgeyBGRDo6VUlOVDMyLCAgIDEsICJ1MzIiLCAgMjAsIDQgfSwKLSAgICAgIHsgRkQ6OlVJTlQ2NCwgICAxLCAidTY0IiwgIDI0LCA4IH0sCi0gICAgICB7IEZEOjpGTE9BVCwgICAgMSwgImZwIiwgICAzMiwgNCB9LAotICAgICAgeyBDMlNpemVTdHJ1Y3Q6OlRZUEUsIDMsICJzaXplIiwgMzYsIDggfSwKLSAgICAgIHsgRkQ6OkJMT0IsICAgMTAwLCAiYmxvYiIsIDYwLCAxIH0sCi0gICAgICB7IEZEOjpTVFJJTkcsIDEwMCwgInN0ciIsIDE2MCwgMSB9LAotICAgICAgeyBGRDo6QkxPQiwgICAxMDAsICJ5LW4iLCAyNjAsIDEgfSB9OwotCi1URVNUX1AoQzJQYXJhbVRlc3RfUGFyYW1GaWVsZExpc3QsIFZlcmlmeVN0cnVjdCkgewotICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZHMgPSBHZXRQYXJhbSgpLCBleHBlY3RlZCA9IEMyVGVzdFN0cnVjdF9BOjpmaWVsZExpc3Q7Ci0KLSAgICAvLyB2ZXJpZnkgZmlyc3QgZmllbGQgZGVzY3JpcHRvcgotICAgIEVYUEVDVF9FUShGRDo6SU5UMzIsIGZpZWxkc1swXS50eXBlKCkpOwotICAgIEVYUEVDVF9TVFJFUSgiczMyIiwgZmllbGRzWzBdLm5hbWUoKSk7Ci0gICAgRVhQRUNUX0VRKDF1LCBmaWVsZHNbMF0ubGVuZ3RoKCkpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBmaWVsZHNbMF0uX21GaWVsZElkKTsKLQotICAgIEVYUEVDVF9FUShleHBlY3RlZFswXSwgZmllbGRzWzBdKTsKLSAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbMV0sIGZpZWxkc1sxXSk7Ci0gICAgRVhQRUNUX0VRKGV4cGVjdGVkWzJdLCBmaWVsZHNbMl0pOwotICAgIEVYUEVDVF9FUShleHBlY3RlZFszXSwgZmllbGRzWzNdKTsKLSAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbNF0sIGZpZWxkc1s0XSk7Ci0gICAgRVhQRUNUX0VRKGV4cGVjdGVkWzVdLCBmaWVsZHNbNV0pOwotICAgIEVYUEVDVF9FUShleHBlY3RlZFs2XSwgZmllbGRzWzZdKTsKLSAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbN10sIGZpZWxkc1s3XSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDg7IGkgPCBmaWVsZHMuc2l6ZSgpICYmIGkgPCBleHBlY3RlZC5zaXplKCk7ICsraSkgewotICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbaV0sIGZpZWxkc1tpXSk7Ci0gICAgfQotfQotCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChJbml0aWFsaXplckxpc3QsIEMyUGFyYW1UZXN0X1BhcmFtRmllbGRMaXN0LCA6OnRlc3Rpbmc6OlZhbHVlcyhDMlRlc3RTdHJ1Y3RfQTo6ZmllbGRMaXN0KSk7Ci0KLS8vIGRlZmluZSBmaWVsZHMgdXNpbmcgQzJGaWVsZERlc2NyaXB0b3IgcG9pbnRlciBjb25zdHJ1Y3RvcgotY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfQV9GRF9QVFJfZmllbGRMaXN0ID0KLSAgICB7IEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9BKikobnVsbHB0cikpLT5tU2lnbmVkMzIsICAgInMzMiIpLAotICAgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPm1TaWduZWQ2NCwgICAiczY0IiksCi0gICAgICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfQSopKG51bGxwdHIpKS0+bVVuc2lnbmVkMzIsICJ1MzIiKSwKLSAgICAgIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9BKikobnVsbHB0cikpLT5tVW5zaWduZWQ2NCwgInU2NCIpLAotICAgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPm1GbG9hdCwgICAgICAiZnAiKSwKLSAgICAgIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9BKikobnVsbHB0cikpLT5tU2l6ZSwgICAgICAgInNpemUiKSwKLSAgICAgIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9BKikobnVsbHB0cikpLT5tQmxvYiwgICAgICAgImJsb2IiKSwKLSAgICAgIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9BKikobnVsbHB0cikpLT5tU3RyaW5nLCAgICAgInN0ciIpLAotICAgIC8vICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfQSopKG51bGxwdHIpKS0+bVllc05vLCAgICAgICJ5LW4iKQotICAgIH07Ci0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFBvaW50ZXJDb25zdHJ1Y3RvciwgQzJQYXJhbVRlc3RfUGFyYW1GaWVsZExpc3QsIDo6dGVzdGluZzo6VmFsdWVzKEMyVGVzdFN0cnVjdF9BX0ZEX1BUUl9maWVsZExpc3QpKTsKLQotLy8gZGVmaW5lIGZpZWxkcyB1c2luZyBDMkZpZWxkRGVzY3JpcHRvciBtZW1iZXItcG9pbnRlciBjb25zdHJ1Y3RvcgotY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfQV9GRF9NRU1fUFRSX2ZpZWxkTGlzdCA9Ci0gICAgeyBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6bVNpZ25lZDMyLCAgICJzMzIiKSwKLSAgICAgIEMyRmllbGREZXNjcmlwdG9yKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjptU2lnbmVkNjQsICAgInM2NCIpLAotICAgICAgQzJGaWVsZERlc2NyaXB0b3IoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6Om1VbnNpZ25lZDMyLCAidTMyIiksCi0gICAgICBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6bVVuc2lnbmVkNjQsICJ1NjQiKSwKLSAgICAgIEMyRmllbGREZXNjcmlwdG9yKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjptRmxvYXQsICAgICAgImZwIiksCi0gICAgICBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6bVNpemUsICAgICAgICJzaXplIiksCi0gICAgICBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6bUJsb2IsICAgICAgICJibG9iIiksCi0gICAgICBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6bVN0cmluZywgICAgICJzdHIiKSwKLSAgICAvLyAgQzJGaWVsZERlc2NyaXB0b3IoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6Om1ZZXNObywgICAgICAieS1uIikKLSAgICB9OwotCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChNZW1iZXJQb2ludGVyQ29uc3RydWN0b3IsIEMyUGFyYW1UZXN0X1BhcmFtRmllbGRMaXN0LCA6OnRlc3Rpbmc6OlZhbHVlcyhDMlRlc3RTdHJ1Y3RfQV9GRF9NRU1fUFRSX2ZpZWxkTGlzdCkpOwotCi0vLyBUZXN0IDIuIGRlZmluZSBhIHN0cnVjdHVyZSB3aXRoIHR3by1zdGVwIGhlbHBlciBtZXRob2RzCi0KLXN0cnVjdCBDMlRlc3RBU3RydWN0IHsKLSAgICBpbnQzMl90IG1TaWduZWQzMjsKLSAgICBpbnQ2NF90IG1TaWduZWQ2NFsyXTsKLSAgICB1aW50MzJfdCBtVW5zaWduZWQzMlsxXTsKLSAgICB1aW50NjRfdCBtVW5zaWduZWQ2NDsKLSAgICBmbG9hdCBtRmxvYXQ7Ci0gICAgQzJTaXplU3RydWN0IG1TaXplWzNdOwotICAgIHVpbnQ4X3QgbUJsb2JbMTAwXTsKLSAgICBjaGFyIG1TdHJpbmdbMTAwXTsKLSAgICBib29sIG1ZZXNOb1sxMDBdOwotCi1wcml2YXRlOiAvLyB0ZXN0IGFjY2VzcyBsZXZlbAotICAgIERFRklORV9DMlNUUlVDVChUZXN0QSkKLX0gQzJfUEFDSzsKLQotREVTQ1JJQkVfQzJTVFJVQ1QoVGVzdEEsIHsKLSAgICBDMkZJRUxEKG1TaWduZWQzMiwgInMzMiIpCi0gICAgQzJGSUVMRChtU2lnbmVkNjQsICJzNjQiKQotICAgIEMyRklFTEQobVVuc2lnbmVkMzIsICJ1MzIiKQotICAgIEMyRklFTEQobVVuc2lnbmVkNjQsICJ1NjQiKQotICAgIEMyRklFTEQobUZsb2F0LCAiZnAiKQotICAgIEMyRklFTEQobVNpemUsICJzaXplIikKLSAgICBDMkZJRUxEKG1CbG9iLCAiYmxvYiIpCi0gICAgQzJGSUVMRChtU3RyaW5nLCAic3RyIikKLSAgICAvLyBDMkZJRUxEKG1ZZXNObywgInktbiIpCi19KSAvLyA7IG9wdGlvbmFsCi0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKERlc2NyaWJlU3RydWN0MlN0ZXAsIEMyUGFyYW1UZXN0X1BhcmFtRmllbGRMaXN0LCA6OnRlc3Rpbmc6OlZhbHVlcyhDMlRlc3RBU3RydWN0OjpmaWVsZExpc3QpKTsKLQotLy8gVGVzdCAzLiBkZWZpbmUgYSBzdHJ1Y3R1cmUgd2l0aCBvbmUtc3RlcCBoZWxwZXIgbWV0aG9kCi0KLXN0cnVjdCBDMlRlc3RCU3RydWN0IHsKLSAgICBpbnQzMl90IG1TaWduZWQzMjsKLSAgICBpbnQ2NF90IG1TaWduZWQ2NFsyXTsKLSAgICB1aW50MzJfdCBtVW5zaWduZWQzMlsxXTsKLSAgICB1aW50NjRfdCBtVW5zaWduZWQ2NDsKLSAgICBmbG9hdCBtRmxvYXQ7Ci0gICAgQzJTaXplU3RydWN0IG1TaXplWzNdOwotICAgIHVpbnQ4X3QgbUJsb2JbMTAwXTsKLSAgICBjaGFyIG1TdHJpbmdbMTAwXTsKLSAgICBib29sIG1ZZXNOb1sxMDBdOwotCi1wcml2YXRlOiAvLyB0ZXN0IGFjY2VzcyBsZXZlbAotICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoVGVzdEIpCi0KLSAgICBDMkZJRUxEKG1TaWduZWQzMiwgInMzMiIpCi0gICAgQzJGSUVMRChtU2lnbmVkNjQsICJzNjQiKQotICAgIEMyRklFTEQobVVuc2lnbmVkMzIsICJ1MzIiKQotICAgIEMyRklFTEQobVVuc2lnbmVkNjQsICJ1NjQiKQotICAgIEMyRklFTEQobUZsb2F0LCAiZnAiKQotICAgIEMyRklFTEQobVNpemUsICJzaXplIikKLSAgICBDMkZJRUxEKG1CbG9iLCAiYmxvYiIpCi0gICAgQzJGSUVMRChtU3RyaW5nLCAic3RyIikKLSAgICAvLyBDMkZJRUxEKG1ZZXNObywgInktbiIpCi19OwotCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChEZXNjcmliZVN0cnVjdDFTdGVwLCBDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoQzJUZXN0QlN0cnVjdDo6ZmllbGRMaXN0KSk7Ci0KLS8vIFRlc3QgNC4gZmxleGlibGUgbWVtYmVycwotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotY2xhc3MgQzJQYXJhbVRlc3RfRmxleFBhcmFtRmllbGRMaXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci1wcm90ZWN0ZWQ6Ci0gICAgdXNpbmcgVHlwZT1GRDo6VHlwZTsKLQotICAgIC8vIHN0YXRpYyBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8c3RkOjppbml0aWFsaXplcl9saXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPj4KLSAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+PgotICAgICAgICAgICAgR2V0TGlzdHMoKTsKLQotICAgIGNvbnN0ZXhwciBzdGF0aWMgVHlwZSBmbGV4VHlwZSA9Ci0gICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgaW50MzJfdD46OnZhbHVlID8gRkQ6OklOVDMyIDoKLSAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCBpbnQ2NF90Pjo6dmFsdWUgPyBGRDo6SU5UNjQgOgotICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIHVpbnQzMl90Pjo6dmFsdWUgPyBGRDo6VUlOVDMyIDoKLSAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCB1aW50NjRfdD46OnZhbHVlID8gRkQ6OlVJTlQ2NCA6Ci0gICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgZmxvYXQ+Ojp2YWx1ZSA/IEZEOjpGTE9BVCA6Ci0gICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgdWludDhfdD46OnZhbHVlID8gRkQ6OkJMT0IgOgotICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIGNoYXI+Ojp2YWx1ZSA/IEZEOjpTVFJJTkcgOgotICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIEMyU2l6ZVN0cnVjdD46OnZhbHVlID8gQzJTaXplU3RydWN0OjpUWVBFIDogKFR5cGUpMDsKLSAgICBjb25zdGV4cHIgc3RhdGljIHNpemVfdCBmbGV4U2l6ZSA9IHNpemVvZihUKTsKLX07Ci0KLXR5cGVkZWYgOjp0ZXN0aW5nOjpUeXBlczxpbnQzMl90LCBpbnQ2NF90LCBDMlNpemVTdHJ1Y3Q+IEZsZXhUeXBlczsKLVRZUEVEX1RFU1RfQ0FTRShDMlBhcmFtVGVzdF9GbGV4UGFyYW1GaWVsZExpc3QsIEZsZXhUeXBlcyk7Ci0KLVRZUEVEX1RFU1QoQzJQYXJhbVRlc3RfRmxleFBhcmFtRmllbGRMaXN0LCBWZXJpZnlTdHJ1Y3QpIHsKLSAgICBmb3IgKGF1dG8gYSA6IHRoaXMtPkdldExpc3RzKCkpIHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IGE7Ci0gICAgICAgIGlmIChmaWVsZHMuc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgRVhQRUNUX0VRKDJ1LCBmaWVsZHMuc2l6ZSgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9FUShDMkZpZWxkRGVzY3JpcHRvcihGRDo6SU5UMzIsIDEsICJzMzIiLCAwLCA0KSwgZmllbGRzWzBdKTsKLSAgICAgICAgICAgIEVYUEVDVF9FUShDMkZpZWxkRGVzY3JpcHRvcih0aGlzLT5mbGV4VHlwZSwgMCwgImZsZXgiLCA0LCB0aGlzLT5mbGV4U2l6ZSksCi0gICAgICAgICAgICAgICAgICAgICAgZmllbGRzWzFdKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLnNpemUoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRVEoQzJGaWVsZERlc2NyaXB0b3IodGhpcy0+ZmxleFR5cGUsIDAsICJmbGV4IiwgMCwgdGhpcy0+ZmxleFNpemUpLAotICAgICAgICAgICAgICAgICAgICAgIGZpZWxkc1swXSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0cnVjdCBDMlRlc3RTdHJ1Y3RfRmxleFMzMiB7Ci0gICAgaW50MzJfdCBtRmxleFtdOwotCi0gICAgY29uc3Qgc3RhdGljIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRMaXN0OwotICAgIC8vIGVudW0gOiB1aW50MzJfdCB7IGJhc2VJbmRleCA9IGtQYXJhbUluZGV4VGVzdEZsZXgsIGZsZXhTaXplID0gNCB9OwotICAgIC8vIHR5cGVkZWYgQzJUZXN0U3RydWN0X0ZsZXhTMzIgX3R5cGU7Ci0gICAgLy8gdHlwZWRlZiBpbnQzMl90IGZsZXhUeXBlOwotfTsKLQotY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleFMzMjo6ZmllbGRMaXN0ID0gewotICAgIHsgRkQ6OklOVDMyLCAwLCAiZmxleCIsIDAsIDQgfQotfTsKLQotc3RydWN0IEMyVGVzdFN0cnVjdF9GbGV4RW5kUzMyIHsKLSAgICBpbnQzMl90IG1TaWduZWQzMjsKLSAgICBpbnQzMl90IG1GbGV4W107Ci0KLSAgICBjb25zdCBzdGF0aWMgc3RkOjppbml0aWFsaXplcl9saXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZExpc3Q7Ci0gICAgLy8gZW51bSA6IHVpbnQzMl90IHsgYmFzZUluZGV4ID0ga1BhcmFtSW5kZXhUZXN0RmxleEVuZCwgZmxleFNpemUgPSA0IH07Ci0gICAgLy8gdHlwZWRlZiBDMlRlc3RTdHJ1Y3RfRmxleEVuZCBfdHlwZTsKLSAgICAvLyB0eXBlZGVmIGludDMyX3QgZmxleFR5cGU7Ci19OwotCi1jb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4RW5kUzMyOjpmaWVsZExpc3QgPSB7Ci0gICAgeyBGRDo6SU5UMzIsIDEsICJzMzIiLCAwLCA0IH0sCi0gICAgeyBGRDo6SU5UMzIsIDAsICJmbGV4IiwgNCwgNCB9LAotfTsKLQotY29uc3Qgc3RhdGljIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzJfcHRyX2ZpZWxkTGlzdCA9IHsKLSAgICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfRmxleEVuZFMzMiopMCktPm1TaWduZWQzMiwgInMzMiIpLAotICAgIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9GbGV4RW5kUzMyKikwKS0+bUZsZXgsICJmbGV4IiksCi19OwotCi1zdHJ1Y3QgQzJUZXN0RmxleFMzMlN0cnVjdCB7Ci0gICAgaW50MzJfdCBtRmxleFNpZ25lZDMyW107Ci1wcml2YXRlOiAvLyB0ZXN0IGFjY2VzcyBsZXZlbAotICAgIEMyVGVzdEZsZXhTMzJTdHJ1Y3QoKSB7fQotCi0gICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKFRlc3RGbGV4UzMyLCBtRmxleFNpZ25lZDMyKQotICAgIEMyRklFTEQobUZsZXhTaWduZWQzMiwgImZsZXgiKQotfTsKLQotc3RydWN0IEMyVGVzdEZsZXhFbmRTMzJTdHJ1Y3QgewotICAgIGludDMyX3QgbVNpZ25lZDMyOwotICAgIGludDMyX3QgbUZsZXhTaWduZWQzMltdOwotcHJpdmF0ZTogLy8gdGVzdCBhY2Nlc3MgbGV2ZWwKLSAgICBDMlRlc3RGbGV4RW5kUzMyU3RydWN0KCkge30KLQotICAgIERFRklORV9GTEVYX0MyU1RSVUNUKFRlc3RGbGV4RW5kUzMyLCBtRmxleFNpZ25lZDMyKQotfSBDMl9QQUNLOwotCi1ERVNDUklCRV9DMlNUUlVDVChUZXN0RmxleEVuZFMzMiwgewotICAgIEMyRklFTEQobVNpZ25lZDMyLCAiczMyIikKLSAgICBDMkZJRUxEKG1GbGV4U2lnbmVkMzIsICJmbGV4IikKLX0pIC8vIDsgb3B0aW9uYWwKLQotdGVtcGxhdGU8Pgotc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+PgotLy9zdGQ6OmluaXRpYWxpemVyX2xpc3Q8c3RkOjppbml0aWFsaXplcl9saXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPj4KLUMyUGFyYW1UZXN0X0ZsZXhQYXJhbUZpZWxkTGlzdDxpbnQzMl90Pjo6R2V0TGlzdHMoKSB7Ci0gICAgcmV0dXJuIHsKLSAgICAgICAgQzJUZXN0U3RydWN0X0ZsZXhTMzI6OmZpZWxkTGlzdCwKLSAgICAgICAgQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzI6OmZpZWxkTGlzdCwKLSAgICAgICAgQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzJfcHRyX2ZpZWxkTGlzdCwKLSAgICAgICAgQzJUZXN0RmxleFMzMlN0cnVjdDo6ZmllbGRMaXN0LAotICAgICAgICBDMlRlc3RGbGV4RW5kUzMyU3RydWN0OjpmaWVsZExpc3QsCi0gICAgfTsKLX0KLQotc3RydWN0IEMyVGVzdFN0cnVjdF9GbGV4UzY0IHsKLSAgICBpbnQ2NF90IG1GbGV4U2lnbmVkNjRbXTsKLQotICAgIGNvbnN0IHN0YXRpYyBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkTGlzdDsKLSAgICAvLyBlbnVtIDogdWludDMyX3QgeyBiYXNlSW5kZXggPSBrUGFyYW1JbmRleFRlc3RGbGV4UzY0LCBmbGV4U2l6ZSA9IDggfTsKLSAgICAvLyB0eXBlZGVmIEMyVGVzdFN0cnVjdF9GbGV4UzY0IF90eXBlOwotICAgIC8vIHR5cGVkZWYgaW50NjRfdCBmbGV4VHlwZTsKLX07Ci0KLWNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhTNjQ6OmZpZWxkTGlzdCA9IHsKLSAgICB7IEZEOjpJTlQ2NCwgMCwgImZsZXgiLCAwLCA4IH0KLX07Ci0KLXN0cnVjdCBDMlRlc3RTdHJ1Y3RfRmxleEVuZFM2NCB7Ci0gICAgaW50MzJfdCBtU2lnbmVkMzI7Ci0gICAgaW50NjRfdCBtU2lnbmVkNjRGbGV4W107Ci0KLSAgICBjb25zdCBzdGF0aWMgc3RkOjppbml0aWFsaXplcl9saXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZExpc3Q7Ci0gICAgLy8gZW51bSA6IHVpbnQzMl90IHsgYmFzZUluZGV4ID0gQzJUZXN0U3RydWN0X0ZsZXhFbmRTNjQsIGZsZXhTaXplID0gOCB9OwotICAgIC8vIHR5cGVkZWYgQzJUZXN0U3RydWN0X0ZsZXhFbmRTNjQgX3R5cGU7Ci0gICAgLy8gdHlwZWRlZiBpbnQ2NF90IGZsZXhUeXBlOwotfTsKLQotY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleEVuZFM2NDo6ZmllbGRMaXN0ID0gewotICAgIHsgRkQ6OklOVDMyLCAxLCAiczMyIiwgMCwgNCB9LAotICAgIHsgRkQ6OklOVDY0LCAwLCAiZmxleCIsIDQsIDggfSwKLX07Ci0KLXN0cnVjdCBDMlRlc3RGbGV4UzY0U3RydWN0IHsKLSAgICBpbnQ2NF90IG1GbGV4U2lnbmVkNjRbXTsKLSAgICBDMlRlc3RGbGV4UzY0U3RydWN0KCkge30KLQotICAgIERFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChUZXN0RmxleFM2NCwgbUZsZXhTaWduZWQ2NCkKLSAgICBDMkZJRUxEKG1GbGV4U2lnbmVkNjQsICJmbGV4IikKLX07Ci0KLXN0cnVjdCBDMlRlc3RGbGV4RW5kUzY0U3RydWN0IHsKLSAgICBpbnQzMl90IG1TaWduZWQzMjsKLSAgICBpbnQ2NF90IG1GbGV4U2lnbmVkNjRbXTsKLSAgICBDMlRlc3RGbGV4RW5kUzY0U3RydWN0KCkge30KLQotICAgIERFRklORV9GTEVYX0MyU1RSVUNUKFRlc3RGbGV4RW5kUzY0LCBtRmxleFNpZ25lZDY0KQotfSBDMl9QQUNLOwotCi1ERVNDUklCRV9DMlNUUlVDVChUZXN0RmxleEVuZFM2NCwgewotICAgIEMyRklFTEQobVNpZ25lZDMyLCAiczMyIikKLSAgICBDMkZJRUxEKG1GbGV4U2lnbmVkNjQsICJmbGV4IikKLX0pIC8vIDsgb3B0aW9uYWwKLQotdGVtcGxhdGU8Pgotc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+PgotLy9zdGQ6OmluaXRpYWxpemVyX2xpc3Q8c3RkOjppbml0aWFsaXplcl9saXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPj4KLUMyUGFyYW1UZXN0X0ZsZXhQYXJhbUZpZWxkTGlzdDxpbnQ2NF90Pjo6R2V0TGlzdHMoKSB7Ci0gICAgcmV0dXJuIHsKLSAgICAgICAgQzJUZXN0U3RydWN0X0ZsZXhTNjQ6OmZpZWxkTGlzdCwKLSAgICAgICAgQzJUZXN0U3RydWN0X0ZsZXhFbmRTNjQ6OmZpZWxkTGlzdCwKLSAgICAgICAgQzJUZXN0RmxleFM2NFN0cnVjdDo6ZmllbGRMaXN0LAotICAgICAgICBDMlRlc3RGbGV4RW5kUzY0U3RydWN0OjpmaWVsZExpc3QsCi0gICAgfTsKLX0KLQotc3RydWN0IEMyVGVzdFN0cnVjdF9GbGV4U2l6ZSB7Ci0gICAgQzJTaXplU3RydWN0IG1GbGV4U2l6ZVtdOwotCi0gICAgY29uc3Qgc3RhdGljIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRMaXN0OwotICAgIC8vIGVudW0gOiB1aW50MzJfdCB7IGJhc2VJbmRleCA9IGtQYXJhbUluZGV4VGVzdEZsZXhTaXplLCBmbGV4U2l6ZSA9IDggfTsKLSAgICAvLyB0eXBlZGVmIEMyVGVzdFN0cnVjdF9GbGV4U2l6ZSBfdHlwZTsKLSAgICAvLyB0eXBlZGVmIEMyU2l6ZVN0cnVjdCBmbGV4VHlwZTsKLX07Ci0KLWNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhTaXplOjpmaWVsZExpc3QgPSB7Ci0gICAgeyBDMlNpemVTdHJ1Y3Q6OlRZUEUsIDAsICJmbGV4IiwgMCwgc2l6ZW9mKEMyU2l6ZVN0cnVjdCkgfQotfTsKLQotc3RydWN0IEMyVGVzdFN0cnVjdF9GbGV4RW5kU2l6ZSB7Ci0gICAgaW50MzJfdCBtU2lnbmVkMzI7Ci0gICAgQzJTaXplU3RydWN0IG1TaXplRmxleFtdOwotCi0gICAgY29uc3Qgc3RhdGljIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRMaXN0OwotICAgIC8vIGVudW0gOiB1aW50MzJfdCB7IGJhc2VJbmRleCA9IEMyVGVzdFN0cnVjdF9GbGV4RW5kU2l6ZSwgZmxleFNpemUgPSA4IH07Ci0gICAgLy8gdHlwZWRlZiBDMlRlc3RTdHJ1Y3RfRmxleEVuZFNpemUgX3R5cGU7Ci0gICAgLy8gdHlwZWRlZiBDMlNpemVTdHJ1Y3QgZmxleFR5cGU7Ci19OwotCi1jb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4RW5kU2l6ZTo6ZmllbGRMaXN0ID0gewotICAgIHsgRkQ6OklOVDMyLCAxLCAiczMyIiwgMCwgNCB9LAotICAgIHsgQzJTaXplU3RydWN0OjpUWVBFLCAwLCAiZmxleCIsIDQsIHNpemVvZihDMlNpemVTdHJ1Y3QpIH0sCi19OwotCi1zdHJ1Y3QgQzJUZXN0RmxleFNpemVTdHJ1Y3QgewotICAgIEMyU2l6ZVN0cnVjdCBtRmxleFNpemVbXTsKLSAgICBDMlRlc3RGbGV4U2l6ZVN0cnVjdCgpIHt9Ci0KLSAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoVGVzdEZsZXhTaXplLCBtRmxleFNpemUpCi0gICAgQzJGSUVMRChtRmxleFNpemUsICJmbGV4IikKLX07Ci0KLXN0cnVjdCBDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdCB7Ci0gICAgaW50MzJfdCBtU2lnbmVkMzI7Ci0gICAgQzJTaXplU3RydWN0IG1GbGV4U2l6ZVtdOwotICAgIEMyVGVzdEZsZXhFbmRTaXplU3RydWN0KCkge30KLQotICAgIERFRklORV9GTEVYX0MyU1RSVUNUKFRlc3RGbGV4RW5kU2l6ZSwgbUZsZXhTaXplKQotfSBDMl9QQUNLOwotCi1ERVNDUklCRV9DMlNUUlVDVChUZXN0RmxleEVuZFNpemUsIHsKLSAgICBDMkZJRUxEKG1TaWduZWQzMiwgInMzMiIpCi0gICAgQzJGSUVMRChtRmxleFNpemUsICJmbGV4IikKLX0pIC8vIDsgb3B0aW9uYWwKLQotdGVtcGxhdGU8Pgotc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+PgotLy9zdGQ6OmluaXRpYWxpemVyX2xpc3Q8c3RkOjppbml0aWFsaXplcl9saXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPj4KLUMyUGFyYW1UZXN0X0ZsZXhQYXJhbUZpZWxkTGlzdDxDMlNpemVTdHJ1Y3Q+OjpHZXRMaXN0cygpIHsKLSAgICByZXR1cm4gewotICAgICAgICBDMlRlc3RTdHJ1Y3RfRmxleFNpemU6OmZpZWxkTGlzdCwKLSAgICAgICAgQzJUZXN0U3RydWN0X0ZsZXhFbmRTaXplOjpmaWVsZExpc3QsCi0gICAgICAgIEMyVGVzdEZsZXhTaXplU3RydWN0OjpmaWVsZExpc3QsCi0gICAgICAgIEMyVGVzdEZsZXhFbmRTaXplU3RydWN0OjpmaWVsZExpc3QsCi0gICAgfTsKLX0KLQotVEVTVF9GKEMyUGFyYW1UZXN0LCBGaWVsZElkKSB7Ci0gICAgLy8gcG9pbnRlciBjb25zdHJ1Y3RvcgotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+bVNpZ25lZDMyKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5tU2lnbmVkNjQpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyMCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5tVW5zaWduZWQzMikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI0LCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPm1VbnNpZ25lZDY0KSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzIsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+bUZsb2F0KSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzYsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+bVNpemUpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg2MCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5tQmxvYikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDE2MCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5tU3RyaW5nKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjYwLCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPm1ZZXNObykpOwotCi0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3QqKTApLT5tU2lnbmVkMzIpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdCopMCktPm1GbGV4U2l6ZSkpOwotCi0gICAgLy8gbWVtYmVyIHBvaW50ZXIgY29uc3RydWN0b3IKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6bVNpZ25lZDMyKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6Om1TaWduZWQ2NCkpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDIwLCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6bVVuc2lnbmVkMzIpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNCwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6Om1VbnNpZ25lZDY0KSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzIsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjptRmxvYXQpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzNiwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6Om1TaXplKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNjAsIDEpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjptQmxvYikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDE2MCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6Om1TdHJpbmcpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNjAsIDEpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjptWWVzTm8pKTsKLQotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdCopMCwgJkMyVGVzdEZsZXhFbmRTaXplU3RydWN0OjptU2lnbmVkMzIpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3QqKTAsICZDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdDo6bUZsZXhTaXplKSk7Ci0KLSAgICAvLyBtZW1iZXIgcG9pbnRlciBzYW5zIHR5cGUgcG9pbnRlcgotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6bVNpZ25lZDMyKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjptU2lnbmVkNjQpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyMCwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjptVW5zaWduZWQzMikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI0LCA4KSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6Om1VbnNpZ25lZDY0KSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzIsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6bUZsb2F0KSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzYsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6bVNpemUpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg2MCwgMSksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjptQmxvYikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDE2MCwgMSksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjptU3RyaW5nKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjYwLCAxKSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6Om1ZZXNObykpOwotCi0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdEZsZXhFbmRTaXplU3RydWN0OjptU2lnbmVkMzIpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgmQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3Q6Om1GbGV4U2l6ZSkpOwotCi0gICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJUZXN0QVN0cnVjdD4gQzJUZXN0QUluZm87Ci0gICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3Q+IEMyVGVzdEZsZXhFbmRTaXplSW5mbzsKLQotICAgIC8vIHBvaW50ZXIgY29uc3RydWN0b3IgaW4gQzJQYXJhbQotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDgsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+bVNpZ25lZDMyKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTIsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+bVNpZ25lZDY0KSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjgsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+bVVuc2lnbmVkMzIpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzMiwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5tVW5zaWduZWQ2NCkpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQwLCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPm1GbG9hdCkpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQ0LCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPm1TaXplKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNjgsIDEpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+bUJsb2IpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxNjgsIDEpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+bVN0cmluZykpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI2OCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5tWWVzTm8pKTsKLQotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDgsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEZsZXhFbmRTaXplSW5mbyopMCktPm0ubVNpZ25lZDMyKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTIsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEZsZXhFbmRTaXplSW5mbyopMCktPm0ubUZsZXhTaXplKSk7Ci0KLSAgICAvLyBtZW1iZXIgcG9pbnRlciBpbiBDMlBhcmFtCi0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86Om1TaWduZWQzMikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDEyLCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6bVNpZ25lZDY0KSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjgsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjptVW5zaWduZWQzMikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDMyLCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6bVVuc2lnbmVkNjQpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0MCwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86Om1GbG9hdCkpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQ0LCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6bVNpemUpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg2OCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86Om1CbG9iKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTY4LCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6bVN0cmluZykpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI2OCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86Om1ZZXNObykpOwotCi0gICAgLy8gTk9URTogY2Fubm90IHVzZSBhIG1lbWJlciBwb2ludGVyIGZvciBmbGV4IHBhcmFtcyBkdWUgdG8gaW50cm9kdWN0aW9uIG9mICdtJwotICAgIC8vIEVYUEVDVF9FUShfQzJGaWVsZElkKDgsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RGbGV4RW5kU2l6ZUluZm86Om0ubVNpZ25lZDMyKSk7Ci0gICAgLy8gRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTIsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RGbGV4RW5kU2l6ZUluZm86Om0ubUZsZXhTaXplKSk7Ci0KLQotCi19Ci0KLXN0cnVjdCBTMzIgewotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIGNsYXNzIEI9dHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PFQ+Ojp0eXBlPgotICAgIGlubGluZSBTMzIoY29uc3QgVCopIHsKLSAgICAgICAgc3RhdGljX2Fzc2VydCghc3RkOjppc19hcnJheTxUPjo6dmFsdWUsICJzaG91bGQgbm90IGJlIGFuIGFycmF5Iik7Ci0gICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPEIsIGludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQzMl90Iik7Ci0gICAgfQotfTsKLQotc3RydWN0IEZMWCB7Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgVCwgY2xhc3MgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8VD46OnR5cGU+Ci0gICAgaW5saW5lIEZMWChjb25zdCBUKiwgY29uc3QgVSopIHsKLSAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2FycmF5PFQ+Ojp2YWx1ZSwgInNob3VsZCBiZSBhbiBhcnJheSIpOwotICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6ZXh0ZW50PFQ+Ojp2YWx1ZSA9PSAwLCAic2hvdWxkIGJlIGFuIGFycmF5IG9mIDAgZXh0ZW50Iik7Ci0gICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPEIsIFU+Ojp2YWx1ZSwgInNob3VsZCBiZSB0eXBlIFUiKTsKLSAgICB9Ci19OwotCi1zdHJ1Y3QgTVAgewotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIEV4cGVjdGVkVSwgdHlwZW5hbWUgVW5leHBlY3RlZFU+Ci0gICAgaW5saW5lIE1QKFQgVTo6KiwgY29uc3QgRXhwZWN0ZWRVKiwgY29uc3QgVW5leHBlY3RlZFUqKSB7Ci0gICAgICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfc2FtZTxVLCBVbmV4cGVjdGVkVT46OnZhbHVlLCAic2hvdWxkIG5vdCBiZSBtZW1iZXIgcG9pbnRlciBvZiB0aGUgYmFzZSB0eXBlIik7Ci0gICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPFUsIEV4cGVjdGVkVT46OnZhbHVlLCAic2hvdWxkIGJlIG1lbWJlciBwb2ludGVyIG9mIHRoZSBkZXJpdmVkIHR5cGUiKTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBCLCB0eXBlbmFtZSBEPgotICAgIGlubGluZSBNUChUIEQ6OiosIGNvbnN0IEQqKSB7IH0KLX07Ci0KLXZvaWQgY29tcGlsZWRTdGF0aWNfYXJyYXlUeXBlUHJvcGFnYXRpb25UZXN0KCkgewotICAgICh2b2lkKVMzMigmKChDMlRlc3RGbGV4RW5kUzMyU3RydWN0ICopMCktPm1TaWduZWQzMik7Ci0gICAgKHZvaWQpRkxYKCYoKEMyVGVzdEZsZXhFbmRTMzJTdHJ1Y3QgKikwKS0+bUZsZXhTaWduZWQzMiwgKGludDMyX3QqKTApOwotICAgICh2b2lkKUZMWCgmKChDMlRlc3RGbGV4UzMyU3RydWN0ICopMCktPm1GbGV4U2lnbmVkMzIsIChpbnQzMl90KikwKTsKLQotICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyVGVzdEFTdHJ1Y3Q+IEMyVGVzdEFJbmZvOwotCi0gICAgLy8gVFJJQ0tZOiAmZGVyaXZlZENsYXNzOjpiYXNlTWVtYmVyIGhhcyB0eXBlIG9mIGJhc2VDbGFzczo6KgotICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKCZDMlRlc3RBSW5mbzo6bVNpZ25lZDMyKSwgaW50MzJfdCBDMlRlc3RBU3RydWN0OjoqPjo6dmFsdWUsCi0gICAgICAgICAgICAgICAgICAiYmFzZSBtZW1iZXIgcG9pbnRlciBzaG91bGQgaGF2ZSBiYXNlIGNsYXNzIGluIHR5cGUiKTsKLQotICAgIC8vIHRoZXJlZm9yZSwgbWVtYmVyIHBvaW50ZXIgZXhwYW5kcyB0byBiYXNlQ2xhc3M6OiogaW4gdGVtcGxhdGVzCi0gICAgKHZvaWQpTVAoJkMyVGVzdEFJbmZvOjptU2lnbmVkMzIsCi0gICAgICAgICAgICAgKEMyVGVzdEFTdHJ1Y3QqKTAgLyogZXhwZWN0ZWQgKi8sIChDMlRlc3RBSW5mbyopMCAvKiB1bmV4cGVjdGVkICovKTsKLSAgICAvLyBidXQgY2FuIGJlIGNhc3QgdG8gZGVyaXZlZENsYXNzOjoqCi0gICAgKHZvaWQpTVAoKGludDMyX3QgQzJUZXN0QUluZm86OiopJkMyVGVzdEFJbmZvOjptU2lnbmVkMzIsCi0gICAgICAgICAgICAgKEMyVGVzdEFJbmZvKikwIC8qIGV4cGVjdGVkICovLCAoQzJUZXN0QVN0cnVjdCopMCAvKiB1bmV4cGVjdGVkICovKTsKLQotICAgIC8vIFRSSUNLWTogYmFzZUNsYXNzOjoqIGRvZXMgbm90IGF1dG9jb252ZXJ0IHRvIGRlcml2ZWRDbGFzczo6KiBldmVuIGluIHRlbXBsYXRlcwotICAgIC8vICh2b2lkKU1QKCZDMlRlc3RBSW5mbzo6bVNpZ25lZDMyLCAoQzJUZXN0QUluZm8qKTApOwotfQotCi1URVNUX0YoQzJQYXJhbVRlc3QsIE1lbWJlclBvaW50ZXJDYXN0KSB7Ci0gICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJUZXN0QVN0cnVjdD4gQzJUZXN0QUluZm87Ci0KLSAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyVGVzdEFJbmZvLCBtU2lnbmVkMzIpID09IDgsICJvZmZzZXQgc2hvdWxkIGJlIDgiKTsKLSAgICBjb25zdGV4cHIgaW50MzJfdCBDMlRlc3RBU3RydWN0OjoqIHMzMnB0ciA9ICZDMlRlc3RBSW5mbzo6bVNpZ25lZDMyOwotICAgIGNvbnN0ZXhwciBpbnQzMl90IEMyVGVzdEFJbmZvOjoqIHMzMnB0cl9kZXJpdmVkID0gKGludDMyX3QgQzJUZXN0QVN0cnVjdDo6KikmQzJUZXN0QUluZm86Om1TaWduZWQzMjsKLSAgICBjb25zdGV4cHIgaW50MzJfdCBDMlRlc3RBSW5mbzo6KiBzMzJwdHJfY2FzdDJkZXJpdmVkID0gKGludDMyX3QgQzJUZXN0QUluZm86OiopczMycHRyOwotICAgIEMyVGVzdEFJbmZvICppbmZvID0gKEMyVGVzdEFJbmZvICopMjU2OwotICAgIEMyVGVzdEFTdHJ1Y3QgKnN0cnVrdCA9IChDMlRlc3RBU3RydWN0ICopaW5mbzsKLSAgICBpbnQzMl90ICppbmZvX3MzMl9kZXJpdmVkID0gJihpbmZvLT4qczMycHRyX2Rlcml2ZWQpOwotICAgIGludDMyX3QgKmluZm9fczMyX2Nhc3QyZGVyaXZlZCA9ICYoaW5mby0+KnMzMnB0cl9jYXN0MmRlcml2ZWQpOwotICAgIGludDMyX3QgKmluZm9fczMyID0gJihpbmZvLT4qczMycHRyKTsKLSAgICBpbnQzMl90ICpzdHJ1a3RfczMyID0gJihzdHJ1a3QtPipzMzJwdHIpOwotCi0gICAgRVhQRUNUX0VRKDI1NnUsICh1aW50cHRyX3QpaW5mbyk7Ci0gICAgRVhQRUNUX0VRKDI2NHUsICh1aW50cHRyX3Qpc3RydWt0KTsKLSAgICBFWFBFQ1RfRVEoMjY0dSwgKHVpbnRwdHJfdClpbmZvX3MzMl9kZXJpdmVkKTsKLSAgICBFWFBFQ1RfRVEoMjY0dSwgKHVpbnRwdHJfdClpbmZvX3MzMl9jYXN0MmRlcml2ZWQpOwotICAgIEVYUEVDVF9FUSgyNjR1LCAodWludHB0cl90KWluZm9fczMyKTsKLSAgICBFWFBFQ1RfRVEoMjY0dSwgKHVpbnRwdHJfdClzdHJ1a3RfczMyKTsKLQotICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyVGVzdEZsZXhFbmRTaXplU3RydWN0PiBDMlRlc3RGbGV4RW5kU2l6ZUluZm87Ci0gICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMlRlc3RGbGV4RW5kU2l6ZUluZm8sIG0ubVNpZ25lZDMyKSA9PSA4LCAib2Zmc2V0IHNob3VsZCBiZSA4Iik7Ci0gICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMlRlc3RGbGV4RW5kU2l6ZUluZm8sIG0ubUZsZXhTaXplKSA9PSAxMiwgIm9mZnNldCBzaG91bGQgYmUgMTIiKTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBQQVJBTSBVU0FHRSBURVNUUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLXN0cnVjdCBDMk51bWJlclN0cnVjdCB7Ci0gICAgaW50MzJfdCBtTnVtYmVyOwotICAgIEMyTnVtYmVyU3RydWN0KCkge30KLSAgICBDMk51bWJlclN0cnVjdChpbnQzMl90IF9udW1iZXIpIDogbU51bWJlcihfbnVtYmVyKSB7fQotCi0gICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChOdW1iZXIpCi0gICAgQzJGSUVMRChtTnVtYmVyLCAibnVtYmVyIikKLX07Ci0KLXN0cnVjdCBDMk51bWJlcnNTdHJ1Y3QgewotICAgIGludDMyX3QgbU51bWJlcnNbXTsKLSAgICBDMk51bWJlcnNTdHJ1Y3QoKSB7fQotCi0gICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKE51bWJlcnMsIG1OdW1iZXJzKQotICAgIEMyRklFTEQobU51bWJlcnMsICJudW1iZXJzIikKLX07Ci1zdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNTdHJ1Y3QpID09IDAsICJDMk51bWJlcnNTdHJ1Y3QgaGFzIGluY29ycmVjdCBzaXplIik7Ci0KLXR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJOdW1iZXJTdHJ1Y3Q+IEMyTnVtYmVyVHVuaW5nOwotdHlwZWRlZiAgIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMk51bWJlclN0cnVjdD4gQzJOdW1iZXJQb3J0VHVuaW5nOwotdHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMk51bWJlclN0cnVjdD4gQzJOdW1iZXJTdHJlYW1UdW5pbmc7Ci0KLXR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJOdW1iZXJzU3RydWN0PiBDMk51bWJlcnNUdW5pbmc7Ci10eXBlZGVmICAgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyTnVtYmVyc1N0cnVjdD4gQzJOdW1iZXJzUG9ydFR1bmluZzsKLXR5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJOdW1iZXJzU3RydWN0PiBDMk51bWJlcnNTdHJlYW1UdW5pbmc7Ci0KLS8vCi0jaWYgMAotCi12b2lkIHRlc3QoKSB7Ci0gICAgQzJOdW1iZXJTdHJ1Y3QgcygxMCk7Ci0gICAgKHZvaWQpQzJOdW1iZXJTdHJ1Y3Q6OmZpZWxkTGlzdDsKLX07Ci0KLXR5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJJbnQ2NFZhbHVlLCBrUGFyYW1JbmRleE51bWJlckI+IEMyTnVtYmVyQ29uZmlnNDsKLXR5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMySW50MzJWYWx1ZSwga1BhcmFtSW5kZXhOdW1iZXI+IEMyTnVtYmVyQ29uZmlnMzsKLXR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJTdHJpbmdWYWx1ZSwga1BhcmFtSW5kZXhOdW1iZXI+IEMyVmlkZW9OYW1lQ29uZmlnOwotCi12b2lkIHRlc3QzKCkgewotICAgIEMyTnVtYmVyQ29uZmlnMyBzKDEwKTsKLSAgICBzLm1WYWx1ZSA9IDExOwotICAgIHMgPSAxMjsKLSAgICAodm9pZClDMk51bWJlckNvbmZpZzM6OmZpZWxkTGlzdDsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8QzJWaWRlb05hbWVDb25maWc+IG4gPSBDMlZpZGVvTmFtZUNvbmZpZzo6YWxsb2Nfc2hhcmVkKDI1KTsKLSAgICBzdHJjcHkobi0+bS5tVmFsdWUsICJsYWpvcyIpOwotICAgIEMyTnVtYmVyQ29uZmlnNCB0KGZhbHNlLCAwLCAxMSk7Ci0gICAgdC5tVmFsdWUgPSAxNTsKLX07Ci0KLXN0cnVjdCBDMk51bWJlcnNTdHJ1Y3QgewotICAgIGludDMyX3QgbU51bWJlcnNbXTsKLSAgICBlbnVtIHsgYmFzZUluZGV4ID0ga1BhcmFtSW5kZXhOdW1iZXIgfTsKLSAgICBjb25zdCBzdGF0aWMgc3RkOjppbml0aWFsaXplcl9saXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZExpc3Q7Ci0gICAgQzJOdW1iZXJzU3RydWN0KCkge30KLQotICAgIEZMRVgoQzJOdW1iZXJzU3RydWN0LCBtTnVtYmVycyk7Ci19OwotCi1zdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNTdHJ1Y3QpID09IDAsICJ5ZXMiKTsKLQotCi10eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMk51bWJlcnNTdHJ1Y3Q+IEMyTnVtYmVyc0luZm87Ci0KLWNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gQzJOdW1iZXJzU3RydWN0OjpmaWVsZExpc3QgPQotLy8gICAgeyB7IEZEOjpJTlQzMiwgMCwgIndpZHRocyIgfSB9OwotICAgIHsgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJOdW1iZXJzU3RydWN0KikobnVsbHB0cikpLT5tTnVtYmVycywgIm51bWJlciIpIH07Ci0KLXR5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyTnVtYmVyU3RydWN0PiBDMk51bWJlckNvbmZpZzsKLQotc3RkOjpsaXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBteUxpc3QgPSBDMk51bWJlckNvbmZpZzo6ZmllbGRMaXN0OwotCi0gICAgc3RkOjp1bmlxdWVfcHRyPGFuZHJvaWQ6OkMyUGFyYW1EZXNjcmlwdG9yPiBfX3Rlc3RfZGVzY3JpYmUodWludDMyX3QgcGFyYW1UeXBlKSB7Ci0gICAgICAgIHN0ZDo6bGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gZGVzY3JpYmVDMlBhcmFtczxDMk51bWJlckNvbmZpZz4oKTsKLQotICAgICAgICBhdXRvIHdpZHRocyA9IEMyTnVtYmVyc0luZm86OmFsbG9jX3NoYXJlZCg1KTsKLSAgICAgICAgd2lkdGhzLT5mbGV4Q291bnQoKTsKLSAgICAgICAgd2lkdGhzLT5tLm1OdW1iZXJzWzRdID0gMTsKLQotICAgICAgICB0ZXN0KCk7Ci0gICAgICAgIHRlc3QzKCk7Ci0KLSAgICAgICAgQzJOdW1iZXJDb25maWcgb3V0cHV0V2lkdGgoZmFsc2UsIDEyMyk7Ci0KLSAgICAgICAgQzJQYXJhbTo6SW5kZXggaW5kZXgocGFyYW1UeXBlKTsKLSAgICAgICAgc3dpdGNoIChwYXJhbVR5cGUpIHsKLSAgICAgICAgY2FzZSBDMk51bWJlckNvbmZpZzo6YmFzZUluZGV4OgotICAgICAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4obmV3IEMyUGFyYW1EZXNjcmlwdG9yewotICAgICAgICAgICAgICAgIHRydWUgLyogaXNSZXF1aXJlZCAqLywKLSAgICAgICAgICAgICAgICAibnVtYmVyIiwKLSAgICAgICAgICAgICAgICBpbmRleCwKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZgotLy8KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLWJvb2wgY2FuU2V0UG9ydChUICZvLCBib29sIG91dHB1dCkgeyByZXR1cm4gby5zZXRQb3J0KG91dHB1dCk7IH0KLWJvb2wgY2FuU2V0UG9ydCguLi4pIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFMsIHR5cGVuYW1lPWRlY2x0eXBlKCgoUyopMCktPnNldFBvcnQodHJ1ZSkpPgotc3RhdGljIHN0ZDo6dHJ1ZV90eXBlIF9jYW5DYWxsU2V0UG9ydChpbnQpOwotdGVtcGxhdGU8dHlwZW5hbWU+Ci1zdGF0aWMgc3RkOjpmYWxzZV90eXBlIF9jYW5DYWxsU2V0UG9ydCguLi4pOwotI2RlZmluZSBjYW5DYWxsU2V0UG9ydCh4KSBkZWNsdHlwZShfY2FuQ2FsbFNldFBvcnQ8c3RkOjpyZW1vdmVfcmVmZXJlbmNlPGRlY2x0eXBlKHgpPjo6dHlwZT4oMCkpOjp2YWx1ZQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU1RBVElDIFRFU1RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi1zdGF0aWNfYXNzZXJ0KF9DMkNvbXBhcmFibGU8aW50Pjo6dmFsdWUsICJpbnQgaXMgbm90IGNvbXBhcmFibGUiKTsKLXN0YXRpY19hc3NlcnQoIV9DMkNvbXBhcmFibGU8dm9pZD46OnZhbHVlLCAidm9pZCBpcyBjb21wYXJhYmxlIik7Ci0KLXN0cnVjdCBDMl9ISURFIF90ZXN0MCB7Ci0gICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IF90ZXN0MCYpOwotICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBfdGVzdDAmKTsKLX07Ci1zdHJ1Y3QgQzJfSElERSBfdGVzdDEgewotICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBfdGVzdDEmKTsKLX07Ci1zdHJ1Y3QgQzJfSElERSBfdGVzdDIgewotICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBfdGVzdDImKTsKLX07Ci1zdGF0aWNfYXNzZXJ0KF9DMkNvbXBhcmFibGU8X3Rlc3QwPjo6dmFsdWUsICJjbGFzcyB3aXRoID09IGFuZCAhPSBpcyBub3QgY29tcGFyYWJsZSIpOwotc3RhdGljX2Fzc2VydChfQzJDb21wYXJhYmxlPF90ZXN0MT46OnZhbHVlLCAiY2xhc3Mgd2l0aCA9PSBpcyBub3QgY29tcGFyYWJsZSIpOwotc3RhdGljX2Fzc2VydChfQzJDb21wYXJhYmxlPF90ZXN0Mj46OnZhbHVlLCAiY2xhc3Mgd2l0aCAhPSBpcyBub3QgY29tcGFyYWJsZSIpOwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQzJQQVJBTSBURVNUUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotc3RydWN0IF9DMlBhcmFtSW5zcGVjdG9yIHsKLSAgICBzdGF0aWMgdm9pZCBTdGF0aWNUZXN0KCk7Ci0gICAgc3RhdGljIHZvaWQgU3RhdGljRmxleFRlc3QoKTsKLX07Ci0KLS8vIFRFU1RfRihfQzJQYXJhbUluc3BlY3RvciwgU3RhdGljVGVzdCkgewotdm9pZCBfQzJQYXJhbUluc3BlY3Rvcjo6U3RhdGljVGVzdCgpIHsKLSAgICB0eXBlZGVmIEMyUGFyYW06OkluZGV4IEk7Ci0KLSAgICAvLyBDMk51bWJlclN0cnVjdDogYmFzZUluZGV4ID0ga0luZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAoYXJncykKLSAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyU3RydWN0OjpiYXNlSW5kZXggPT0ga1BhcmFtSW5kZXhOdW1iZXIsICJiYWQgaW5kZXgiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlclN0cnVjdCkgPT0gNCwgImJhZCBzaXplIik7Ci0KLSAgICAvLyBDMk51bWJlclR1bmluZzogICAgICAgICAgICAga0luZGV4IHwgdHVuIHwgZ2xvYmFsICAgICAgICAgICAoYXJncykKLSAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyVHVuaW5nOjpiYXNlSW5kZXggPT0ga1BhcmFtSW5kZXhOdW1iZXIsICJiYWQgaW5kZXgiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyVHVuaW5nOjp0eXBlSW5kZXggPT0gKGtQYXJhbUluZGV4TnVtYmVyIHwgSTo6a1R5cGVUdW5pbmcgfCBJOjprRGlyR2xvYmFsKSwgImJhZCBpbmRleCIpOwotICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyVHVuaW5nKSA9PSAxMiwgImJhZCBzaXplIik7Ci0KLSAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyVHVuaW5nLCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOwotICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJUdW5pbmcsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7Ci0gICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclR1bmluZywgbU51bWJlcikgPT0gOCwgImJhZCBvZmZzZXQiKTsKLQotICAgIC8vIEMyTnVtYmVyUG9ydFR1bmluZzogICAgICAgICBrSW5kZXggfCB0dW4gfCBwb3J0ICAgICAgICAgICAgIChib29sLCBhcmdzKQotICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyUG9ydFR1bmluZykgPT0gMTIsICJiYWQgc2l6ZSIpOwotICAgIC8vIEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6ICBrSW5kZXggfCB0dW4gfCBwb3J0IHwgaW5wdXQgICAgIChhcmdzKQotICAgIC8vIEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OiBrSW5kZXggfCB0dW4gfCBwb3J0IHwgb3V0cHV0ICAgIChhcmdzKQotICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6YmFzZUluZGV4ID09Ci0gICAgICAgICAgICAgICAgICBrUGFyYW1JbmRleE51bWJlciwgImJhZCBpbmRleCIpOwotICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6dHlwZUluZGV4ID09Ci0gICAgICAgICAgICAgICAgICAoa1BhcmFtSW5kZXhOdW1iZXIgfCBJOjprVHlwZVR1bmluZyB8IEk6OmtEaXJJbnB1dCksICJiYWQgaW5kZXgiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpiYXNlSW5kZXggPT0KLSAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4TnVtYmVyLCAiYmFkIGluZGV4Iik7Ci0gICAgc3RhdGljX2Fzc2VydChDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6dHlwZUluZGV4ID09Ci0gICAgICAgICAgICAgICAgICAoa1BhcmFtSW5kZXhOdW1iZXIgfCBJOjprVHlwZVR1bmluZyB8IEk6OmtEaXJPdXRwdXQpLCAiYmFkIGluZGV4Iik7Ci0gICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dCkgPT0gMTIsICJiYWQgc2l6ZSIpOwotICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0KSA9PSAxMiwgImJhZCBzaXplIik7Ci0gICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOwotICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7Ci0gICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOwotICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7Ci0KLSAgICAvLyBDMk51bWJlclN0cmVhbVR1bmluZzogICAgICAga0luZGV4IHwgdHVuIHwgc3RyICAgICAgICAgICAgICAoYm9vbCwgdWludCwgYXJncykKLSAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlclN0cmVhbVR1bmluZykgPT0gMTJ1LCAiYmFkIHNpemUiKTsKLSAgICAvLyBDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQga0luZGV4IHwgdHVuIHwgc3RyIHwgaW5wdXQgICAgICAoaW50LCBhcmdzKQotICAgIC8vIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQga0l4ICAgfCB0dW4gfCBzdHIgfCBvdXRwdXQgICAgIChpbnQsIGFyZ3MpCi0gICAgc3RhdGljX2Fzc2VydChDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OmJhc2VJbmRleCA9PQotICAgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhOdW1iZXIsICJiYWQgaW5kZXgiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6dHlwZUluZGV4ID09Ci0gICAgICAgICAgICAgICAgICAoa1BhcmFtSW5kZXhOdW1iZXIgfCBJOjprVHlwZVR1bmluZyB8IEk6OmtEaXJJbnB1dCB8IEk6OmtTdHJlYW1GbGFnKSwgImJhZCBpbmRleCIpOwotICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6YmFzZUluZGV4ID09Ci0gICAgICAgICAgICAgICAgICBrUGFyYW1JbmRleE51bWJlciwgImJhZCBpbmRleCIpOwotICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6dHlwZUluZGV4ID09Ci0gICAgICAgICAgICAgICAgICAoa1BhcmFtSW5kZXhOdW1iZXIgfCBJOjprVHlwZVR1bmluZyB8IEk6OmtEaXJPdXRwdXQgfCBJOjprU3RyZWFtRmxhZyksICJiYWQgaW5kZXgiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQpID09IDEydSwgImJhZCBzaXplIik7Ci0gICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dCkgPT0gMTJ1LCAiYmFkIHNpemUiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dCwgbU51bWJlcikgPT0gOCwgImJhZCBvZmZzZXQiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7Ci0gICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOwotICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dCwgbU51bWJlcikgPT0gOCwgImJhZCBvZmZzZXQiKTsKLX0KLQotdm9pZCBfQzJQYXJhbUluc3BlY3Rvcjo6U3RhdGljRmxleFRlc3QoKSB7Ci0gICAgdHlwZWRlZiBDMlBhcmFtOjpJbmRleCBJOwotCi0gICAgLy8gQzJOdW1iZXJzU3RydWN0OiBiYXNlSW5kZXggPSBrSW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgIChhcmdzKQotICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzU3RydWN0OjpiYXNlSW5kZXggPT0gKEk6OmtGbGV4aWJsZUZsYWcgfCBrUGFyYW1JbmRleE51bWJlcnMpLCAiYmFkIGluZGV4Iik7Ci0gICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzU3RydWN0KSA9PSAwLCAiYmFkIHNpemUiKTsKLQotICAgIC8vIEMyTnVtYmVyc1R1bmluZzogICAgICAgICAgICAga0luZGV4IHwgdHVuIHwgZ2xvYmFsICAgICAgICAgICAoYXJncykKLSAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1R1bmluZzo6YmFzZUluZGV4ID09IChJOjprRmxleGlibGVGbGFnIHwga1BhcmFtSW5kZXhOdW1iZXJzKSwgImJhZCBpbmRleCIpOwotICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzVHVuaW5nOjp0eXBlSW5kZXggPT0gKEk6OmtGbGV4aWJsZUZsYWcgfCBrUGFyYW1JbmRleE51bWJlcnMgfCBJOjprVHlwZVR1bmluZyB8IEk6OmtEaXJHbG9iYWwpLCAiYmFkIGluZGV4Iik7Ci0gICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzVHVuaW5nKSA9PSA4LCAiYmFkIHNpemUiKTsKLQotICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzVHVuaW5nLCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOwotICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzVHVuaW5nLCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOwotICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzVHVuaW5nLCBtLm1OdW1iZXJzKSA9PSA4LCAiYmFkIG9mZnNldCIpOwotCi0gICAgLy8gQzJOdW1iZXJzUG9ydFR1bmluZzogICAgICAgICBrSW5kZXggfCB0dW4gfCBwb3J0ICAgICAgICAgICAgIChib29sLCBhcmdzKQotICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1BvcnRUdW5pbmcpID09IDgsICJiYWQgc2l6ZSIpOwotICAgIC8vIEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OiAga0luZGV4IHwgdHVuIHwgcG9ydCB8IGlucHV0ICAgICAoYXJncykKLSAgICAvLyBDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6IGtJbmRleCB8IHR1biB8IHBvcnQgfCBvdXRwdXQgICAgKGFyZ3MpCi0gICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6YmFzZUluZGV4ID09Ci0gICAgICAgICAgICAgICAgICAoSTo6a0ZsZXhpYmxlRmxhZyB8IGtQYXJhbUluZGV4TnVtYmVycyksICJiYWQgaW5kZXgiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0Ojp0eXBlSW5kZXggPT0KLSAgICAgICAgICAgICAgICAgIChJOjprRmxleGlibGVGbGFnIHwga1BhcmFtSW5kZXhOdW1iZXJzIHwgSTo6a1R5cGVUdW5pbmcgfCBJOjprRGlySW5wdXQpLCAiYmFkIGluZGV4Iik7Ci0gICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OmJhc2VJbmRleCA9PQotICAgICAgICAgICAgICAgICAgKEk6OmtGbGV4aWJsZUZsYWcgfCBrUGFyYW1JbmRleE51bWJlcnMpLCAiYmFkIGluZGV4Iik7Ci0gICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OnR5cGVJbmRleCA9PQotICAgICAgICAgICAgICAgICAgKEk6OmtGbGV4aWJsZUZsYWcgfCBrUGFyYW1JbmRleE51bWJlcnMgfCBJOjprVHlwZVR1bmluZyB8IEk6OmtEaXJPdXRwdXQpLCAiYmFkIGluZGV4Iik7Ci0gICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQpID09IDgsICJiYWQgc2l6ZSIpOwotICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dCkgPT0gOCwgImJhZCBzaXplIik7Ci0gICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOwotICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQsIG0ubU51bWJlcnMpID09IDgsICJiYWQgb2Zmc2V0Iik7Ci0gICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7Ci0gICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7Ci0gICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQsIG0ubU51bWJlcnMpID09IDgsICJiYWQgb2Zmc2V0Iik7Ci0KLSAgICAvLyBDMk51bWJlcnNTdHJlYW1UdW5pbmc6ICAgICAgIGtJbmRleCB8IHR1biB8IHN0ciAgICAgICAgICAgICAgKGJvb2wsIHVpbnQsIGFyZ3MpCi0gICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzU3RyZWFtVHVuaW5nKSA9PSA4LCAiYmFkIHNpemUiKTsKLSAgICAvLyBDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0IGtJbmRleCB8IHR1biB8IHN0ciB8IGlucHV0ICAgICAgKGludCwgYXJncykKLSAgICAvLyBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dCBrSXggICB8IHR1biB8IHN0ciB8IG91dHB1dCAgICAgKGludCwgYXJncykKLSAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OmJhc2VJbmRleCA9PQotICAgICAgICAgICAgICAgICAgKEk6OmtGbGV4aWJsZUZsYWcgfCBrUGFyYW1JbmRleE51bWJlcnMpLCAiYmFkIGluZGV4Iik7Ci0gICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0Ojp0eXBlSW5kZXggPT0KLSAgICAgICAgICAgICAgICAgIChJOjprRmxleGlibGVGbGFnIHwga1BhcmFtSW5kZXhOdW1iZXJzIHwgSTo6a1R5cGVUdW5pbmcgfCBJOjprRGlySW5wdXQgfCBJOjprU3RyZWFtRmxhZyksICJiYWQgaW5kZXgiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpiYXNlSW5kZXggPT0KLSAgICAgICAgICAgICAgICAgIChJOjprRmxleGlibGVGbGFnIHwga1BhcmFtSW5kZXhOdW1iZXJzKSwgImJhZCBpbmRleCIpOwotICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OnR5cGVJbmRleCA9PQotICAgICAgICAgICAgICAgICAgKEk6OmtGbGV4aWJsZUZsYWcgfCBrUGFyYW1JbmRleE51bWJlcnMgfCBJOjprVHlwZVR1bmluZyB8IEk6OmtEaXJPdXRwdXQgfCBJOjprU3RyZWFtRmxhZyksICJiYWQgaW5kZXgiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0KSA9PSA4LCAiYmFkIHNpemUiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dCkgPT0gOCwgImJhZCBzaXplIik7Ci0gICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOwotICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQsIG0ubU51bWJlcnMpID09IDgsICJiYWQgb2Zmc2V0Iik7Ci0gICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKLSAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOwotICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQsIG0ubU51bWJlcnMpID09IDgsICJiYWQgb2Zmc2V0Iik7Ci19Ci0KLVRFU1RfRihDMlBhcmFtVGVzdCwgUGFyYW1PcHNUZXN0KSB7Ci0gICAgY29uc3QgQzJOdW1iZXJTdHJ1Y3Qgc3RyKDEwMCk7Ci0gICAgQzJOdW1iZXJTdHJ1Y3QgYnN0cjsKLQotICAgIHsKLSAgICAgICAgRVhQRUNUX0VRKDEwMCwgc3RyLm1OdW1iZXIpOwotICAgICAgICBic3RyLm1OdW1iZXIgPSAxMDA7Ci0KLSAgICAgICAgQzJQYXJhbTo6QmFzZUluZGV4IGluZGV4ID0gQzJOdW1iZXJTdHJ1Y3Q6OmJhc2VJbmRleDsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNGbGV4aWJsZSgpKTsKLSAgICAgICAgRVhQRUNUX0VRKGluZGV4LmJhc2VJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7Ci0gICAgICAgIEVYUEVDVF9FUShpbmRleC5wYXJhbUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKLSAgICB9Ci0KLSAgICBjb25zdCBDMk51bWJlclR1bmluZyB0dW4oMTAwKTsKLSAgICBDMk51bWJlclR1bmluZyBidHVuOwotCi0gICAgewotICAgICAgICAvLyBmbGFncyAmIGludmFyaWFibGVzCi0gICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgdHVuLCBidHVuIH0pIHsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKXApOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCFwKTsKLSAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAuc2l6ZSgpKTsKLQotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNWZW5kb3IoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0ZsZXhpYmxlKCkpOwotICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5pc0dsb2JhbCgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvcklucHV0KCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yT3V0cHV0KCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yU3RyZWFtKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yUG9ydCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHZhbHVlCi0gICAgICAgIEVYUEVDVF9FUSgxMDAsIHR1bi5tTnVtYmVyKTsKLSAgICAgICAgRVhQRUNUX0VRKDAsIGJ0dW4ubU51bWJlcik7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0dW4gPT0gYnR1bik7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0dW4ub3BlcmF0b3I9PShidHVuKSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKHR1biAhPSBidHVuKTsKLSAgICAgICAgRVhQRUNUX1RSVUUodHVuLm9wZXJhdG9yIT0oYnR1bikpOwotICAgICAgICBidHVuLm1OdW1iZXIgPSAxMDA7Ci0gICAgICAgIEVYUEVDVF9FUSh0dW4sIGJ0dW4pOwotCi0gICAgICAgIC8vIGluZGV4Ci0gICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKHR1bi50eXBlKCkpLmJhc2VJbmRleCgpLCBDMk51bWJlclN0cnVjdDo6YmFzZUluZGV4KTsKLSAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUodHVuLnR5cGUoKSkucGFyYW1JbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7Ci0gICAgICAgIEVYUEVDVF9FUSh0dW4udHlwZSgpLCBDMk51bWJlclR1bmluZzo6dHlwZUluZGV4KTsKLSAgICAgICAgRVhQRUNUX0VRKHR1bi5zdHJlYW0oKSwgfjB1KTsKLQotICAgICAgICBDMlBhcmFtOjpCYXNlSW5kZXggaW5kZXggPSBDMk51bWJlclR1bmluZzo6YmFzZUluZGV4OwotICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc0ZsZXhpYmxlKCkpOwotICAgICAgICBFWFBFQ1RfRVEoaW5kZXguYmFzZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKLSAgICAgICAgRVhQRUNUX0VRKGluZGV4LnBhcmFtSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOwotCi0gICAgICAgIEMyUGFyYW06OlR5cGUgdHlwZSA9IEMyTnVtYmVyVHVuaW5nOjp0eXBlSW5kZXg7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0ZsZXhpYmxlKCkpOwotICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmlzR2xvYmFsKCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JJbnB1dCgpKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yT3V0cHV0KCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JTdHJlYW0oKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclBvcnQoKSk7Ci0KLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZ0dW4pLCAmdHVuKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbSgmdHVuKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZ0dW4pLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZ0dW4pLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZ0dW4pLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmdHVuKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZ0dW4pLCBudWxscHRyKTsKLSAgICB9Ci0KLSAgICBjb25zdCBDMk51bWJlclBvcnRUdW5pbmcgb3V0cDEodHJ1ZSwgMTAwKSwgaW5wMShmYWxzZSwgMTAwKTsKLSAgICBDMk51bWJlclBvcnRUdW5pbmcgYm91dHAxLCBiaW5wMSwgYmlucDMoZmFsc2UsIDEwMCk7Ci0gICAgY29uc3QgQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dCBpbnAyKDEwMCk7Ci0gICAgQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dCBiaW5wMjsKLSAgICBjb25zdCBDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dCBvdXRwMigxMDApOwotICAgIEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0IGJvdXRwMjsKLQotICAgIHsKLSAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydChiaW5wMyksICJzaG91bGQgYmUgYWJsZSB0byIpOwotICAgICAgICBzdGF0aWNfYXNzZXJ0KGNhbkNhbGxTZXRQb3J0KGJpbnAxKSwgInNob3VsZCBiZSBhYmxlIHRvIik7Ci0gICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KGlucDEpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCkiKTsKLSAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoaW5wMiksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKGNvbnN0ICYgdHlwZSkiKTsKLSAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoYmlucDIpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvICh0eXBlKSIpOwotCi0gICAgICAgIC8vIGZsYWdzICYgaW52YXJpYWJsZXMKLSAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBvdXRwMSwgaW5wMSwgYm91dHAxIH0pIHsKLSAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAuc2l6ZSgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzVmVuZG9yKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNGbGV4aWJsZSgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzR2xvYmFsKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yU3RyZWFtKCkpOwotICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JQb3J0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgaW5wMiwgYmlucDIgfSkgewotICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC5zaXplKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNWZW5kb3IoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0ZsZXhpYmxlKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNHbG9iYWwoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JTdHJlYW0oKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRShwLmZvclBvcnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBvdXRwMiwgYm91dHAyIH0pIHsKLSAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAuc2l6ZSgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzVmVuZG9yKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNGbGV4aWJsZSgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzR2xvYmFsKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yU3RyZWFtKCkpOwotICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JQb3J0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcG9ydCBzcGVjaWZpYyBmbGFncyAmIGludmFyaWFibGVzCi0gICAgICAgIEVYUEVDVF9GQUxTRShvdXRwMS5mb3JJbnB1dCgpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUob3V0cDEuZm9yT3V0cHV0KCkpOwotCi0gICAgICAgIEVYUEVDVF9UUlVFKGlucDEuZm9ySW5wdXQoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShpbnAxLmZvck91dHB1dCgpKTsKLQotICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IG91dHAxLCBpbnAxIH0pIHsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKXApOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCFwKTsKLSAgICAgICAgICAgIEVYUEVDVF9FUSgxMDAsIHAubU51bWJlcik7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBvdXRwMiwgYm91dHAyIH0pIHsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKXApOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCFwKTsKLQotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9ySW5wdXQoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRShwLmZvck91dHB1dCgpKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IGlucDIsIGJpbnAyIH0pIHsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKXApOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCFwKTsKLQotICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JJbnB1dCgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvck91dHB1dCgpKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IGJvdXRwMSB9ICkgewotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKChib29sKXApOwotICAgICAgICAgICAgRVhQRUNUX1RSVUUoIXApOwotCi0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JJbnB1dCgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvck91dHB1dCgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9FUSgwLCBwLm1OdW1iZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdmFsdWVzCi0gICAgICAgIEVYUEVDVF9FUSgxMDAsIGlucDIubU51bWJlcik7Ci0gICAgICAgIEVYUEVDVF9FUSgxMDAsIG91dHAyLm1OdW1iZXIpOwotICAgICAgICBFWFBFQ1RfRVEoMCwgYmlucDEubU51bWJlcik7Ci0gICAgICAgIEVYUEVDVF9FUSgwLCBiaW5wMi5tTnVtYmVyKTsKLSAgICAgICAgRVhQRUNUX0VRKDAsIGJvdXRwMS5tTnVtYmVyKTsKLSAgICAgICAgRVhQRUNUX0VRKDAsIGJvdXRwMi5tTnVtYmVyKTsKLQotICAgICAgICBFWFBFQ1RfVFJVRShpbnAxICE9IG91dHAxKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoaW5wMSA9PSBpbnAyKTsKLSAgICAgICAgRVhQRUNUX1RSVUUob3V0cDEgPT0gb3V0cDIpOwotICAgICAgICBFWFBFQ1RfVFJVRShiaW5wMSA9PSBib3V0cDEpOwotICAgICAgICBFWFBFQ1RfVFJVRShiaW5wMiAhPSBib3V0cDIpOwotCi0gICAgICAgIEVYUEVDVF9UUlVFKGlucDEgIT0gYmlucDEpOwotICAgICAgICBiaW5wMS5tTnVtYmVyID0gMTAwOwotICAgICAgICBFWFBFQ1RfVFJVRShpbnAxICE9IGJpbnAxKTsKLSAgICAgICAgYmlucDEuc2V0UG9ydChmYWxzZSAvKiBvdXRwdXQgKi8pOwotICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCliaW5wMSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSghYmlucDEpOwotICAgICAgICBFWFBFQ1RfVFJVRShpbnAxID09IGJpbnAxKTsKLQotICAgICAgICBFWFBFQ1RfVFJVRShpbnAyICE9IGJpbnAyKTsKLSAgICAgICAgYmlucDIubU51bWJlciA9IDEwMDsKLSAgICAgICAgRVhQRUNUX1RSVUUoaW5wMiA9PSBiaW5wMik7Ci0KLSAgICAgICAgYmlucDEuc2V0UG9ydCh0cnVlIC8qIG91dHB1dCAqLyk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKG91dHAxID09IGJpbnAxKTsKLQotICAgICAgICBFWFBFQ1RfVFJVRShvdXRwMSAhPSBib3V0cDEpOwotICAgICAgICBib3V0cDEubU51bWJlciA9IDEwMDsKLSAgICAgICAgRVhQRUNUX1RSVUUob3V0cDEgIT0gYm91dHAxKTsKLSAgICAgICAgYm91dHAxLnNldFBvcnQodHJ1ZSAvKiBvdXRwdXQgKi8pOwotICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClib3V0cDEpOwotICAgICAgICBFWFBFQ1RfRkFMU0UoIWJvdXRwMSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKG91dHAxID09IGJvdXRwMSk7Ci0KLSAgICAgICAgRVhQRUNUX1RSVUUob3V0cDIgIT0gYm91dHAyKTsKLSAgICAgICAgYm91dHAyLm1OdW1iZXIgPSAxMDA7Ci0gICAgICAgIEVYUEVDVF9UUlVFKG91dHAyID09IGJvdXRwMik7Ci0KLSAgICAgICAgYm91dHAxLnNldFBvcnQoZmFsc2UgLyogb3V0cHV0ICovKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoaW5wMSA9PSBib3V0cDEpOwotCi0gICAgICAgIC8vIGluZGV4Ci0gICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDEudHlwZSgpKS5iYXNlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OmJhc2VJbmRleCk7Ci0gICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDEudHlwZSgpKS5wYXJhbUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKLSAgICAgICAgRVhQRUNUX0VRKGlucDEudHlwZSgpLCBDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0Ojp0eXBlSW5kZXgpOwotICAgICAgICBFWFBFQ1RfRVEoaW5wMS5zdHJlYW0oKSwgfjB1KTsKLQotICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnAyLnR5cGUoKSkuYmFzZUluZGV4KCksIEMyTnVtYmVyU3RydWN0OjpiYXNlSW5kZXgpOwotICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnAyLnR5cGUoKSkucGFyYW1JbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7Ci0gICAgICAgIEVYUEVDVF9FUShpbnAyLnR5cGUoKSwgQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6dHlwZUluZGV4KTsKLSAgICAgICAgRVhQRUNUX0VRKGlucDIuc3RyZWFtKCksIH4wdSk7Ci0KLSAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDEudHlwZSgpKS5iYXNlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OmJhc2VJbmRleCk7Ci0gICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHAxLnR5cGUoKSkucGFyYW1JbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7Ci0gICAgICAgIEVYUEVDVF9FUShvdXRwMS50eXBlKCksIEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0Ojp0eXBlSW5kZXgpOwotICAgICAgICBFWFBFQ1RfRVEob3V0cDEuc3RyZWFtKCksIH4wdSk7Ci0KLSAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDIudHlwZSgpKS5iYXNlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OmJhc2VJbmRleCk7Ci0gICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHAyLnR5cGUoKSkucGFyYW1JbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7Ci0gICAgICAgIEVYUEVDVF9FUShvdXRwMi50eXBlKCksIEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0Ojp0eXBlSW5kZXgpOwotICAgICAgICBFWFBFQ1RfRVEob3V0cDIuc3RyZWFtKCksIH4wdSk7Ci0KLSAgICAgICAgQzJQYXJhbTo6QmFzZUluZGV4IGluZGV4ID0gQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6dHlwZUluZGV4OwotICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc0ZsZXhpYmxlKCkpOwotICAgICAgICBFWFBFQ1RfRVEoaW5kZXguYmFzZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKLSAgICAgICAgRVhQRUNUX0VRKGluZGV4LnBhcmFtSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOwotCi0gICAgICAgIGluZGV4ID0gQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OnR5cGVJbmRleDsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNGbGV4aWJsZSgpKTsKLSAgICAgICAgRVhQRUNUX0VRKGluZGV4LmJhc2VJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7Ci0gICAgICAgIEVYUEVDVF9FUShpbmRleC5wYXJhbUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKLQotICAgICAgICBDMlBhcmFtOjpUeXBlIHR5cGUgPSBDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0Ojp0eXBlSW5kZXg7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0ZsZXhpYmxlKCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0dsb2JhbCgpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JJbnB1dCgpKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yT3V0cHV0KCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JTdHJlYW0oKSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yUG9ydCgpKTsKLQotICAgICAgICB0eXBlID0gQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OnR5cGVJbmRleDsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzRmxleGlibGUoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JJbnB1dCgpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JPdXRwdXQoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclN0cmVhbSgpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JQb3J0KCkpOwotCi0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclR1bmluZzo6RnJvbSgmaW5wMSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20oJmlucDIpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZvdXRwMSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20oJm91dHAyKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJmlucDEpLCAmaW5wMSk7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJmlucDIpLCAoQzJOdW1iZXJQb3J0VHVuaW5nKikmaW5wMik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJm91dHAxKSwgJm91dHAxKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbSgmb3V0cDIpLCAoQzJOdW1iZXJQb3J0VHVuaW5nKikmb3V0cDIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbSgmaW5wMSksIChDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0KikmaW5wMSk7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZpbnAyKSwgJmlucDIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbSgmb3V0cDEpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJm91dHAyKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSgmaW5wMSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oJmlucDIpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZvdXRwMSksIChDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dCopJm91dHAxKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZvdXRwMiksICZvdXRwMik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6RnJvbSgmaW5wMSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJmlucDIpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZvdXRwMSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJm91dHAyKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oJmlucDEpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmaW5wMiksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKCZvdXRwMSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKCZvdXRwMiksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbSgmaW5wMSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbSgmaW5wMiksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbSgmb3V0cDEpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJm91dHAyKSwgbnVsbHB0cik7Ci0gICAgfQotCi0gICAgY29uc3QgQzJOdW1iZXJTdHJlYW1UdW5pbmcgb3V0czEodHJ1ZSwgMXUsIDEwMCksIGluczEoZmFsc2UsIDF1LCAxMDApOwotICAgIEMyTnVtYmVyU3RyZWFtVHVuaW5nIGJvdXRzMSwgYmluczEsIGJpbnMzKGZhbHNlLCAxdSwgMTAwKTsKLSAgICBjb25zdCBDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQgaW5zMigxdSwgMTAwKTsKLSAgICBDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQgYmluczI7Ci0gICAgY29uc3QgQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dCBvdXRzMigxdSwgMTAwKTsKLSAgICBDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0IGJvdXRzMjsKLQotICAgIHsKLSAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydChiaW5zMyksICJzaG91bGQgYmUgYWJsZSB0byIpOwotICAgICAgICBzdGF0aWNfYXNzZXJ0KGNhbkNhbGxTZXRQb3J0KGJpbnMxKSwgInNob3VsZCBiZSBhYmxlIHRvIik7Ci0gICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KGluczEpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCkiKTsKLSAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoaW5zMiksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKGNvbnN0ICYgdHlwZSkiKTsKLSAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoYmluczIpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvICh0eXBlKSIpOwotCi0gICAgICAgIC8vIGZsYWdzICYgaW52YXJpYWJsZXMKLSAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBvdXRzMSwgaW5zMSwgYm91dHMxIH0pIHsKLSAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAuc2l6ZSgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzVmVuZG9yKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNGbGV4aWJsZSgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzR2xvYmFsKCkpOwotICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JTdHJlYW0oKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JQb3J0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgaW5zMiwgYmluczIgfSkgewotICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC5zaXplKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNWZW5kb3IoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0ZsZXhpYmxlKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNHbG9iYWwoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRShwLmZvclN0cmVhbSgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvclBvcnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBvdXRzMiwgYm91dHMyIH0pIHsKLSAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAuc2l6ZSgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzVmVuZG9yKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNGbGV4aWJsZSgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzR2xvYmFsKCkpOwotICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JTdHJlYW0oKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JQb3J0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcG9ydCBzcGVjaWZpYyBmbGFncyAmIGludmFyaWFibGVzCi0gICAgICAgIEVYUEVDVF9GQUxTRShvdXRzMS5mb3JJbnB1dCgpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUob3V0czEuZm9yT3V0cHV0KCkpOwotCi0gICAgICAgIEVYUEVDVF9UUlVFKGluczEuZm9ySW5wdXQoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShpbnMxLmZvck91dHB1dCgpKTsKLQotICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IG91dHMxLCBpbnMxIH0pIHsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKXApOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCFwKTsKLSAgICAgICAgICAgIEVYUEVDVF9FUSgxMDAsIHAubU51bWJlcik7Ci0gICAgICAgICAgICBFWFBFQ1RfRVEoMXUsIHAuc3RyZWFtKCkpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgb3V0czIsIGJvdXRzMiB9KSB7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClwKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghcCk7Ci0KLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvcklucHV0KCkpOwotICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JPdXRwdXQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBpbnMyLCBiaW5zMiB9KSB7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClwKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghcCk7Ci0KLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9ySW5wdXQoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JPdXRwdXQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBib3V0czEgfSApIHsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRSgoYm9vbClwKTsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKCFwKTsKLQotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9ySW5wdXQoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JPdXRwdXQoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRVEoMCwgcC5tTnVtYmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHZhbHVlcwotICAgICAgICBFWFBFQ1RfRVEoMTAwLCBpbnMyLm1OdW1iZXIpOwotICAgICAgICBFWFBFQ1RfRVEoMTAwLCBvdXRzMi5tTnVtYmVyKTsKLSAgICAgICAgRVhQRUNUX0VRKDAsIGJpbnMxLm1OdW1iZXIpOwotICAgICAgICBFWFBFQ1RfRVEoMCwgYmluczIubU51bWJlcik7Ci0gICAgICAgIEVYUEVDVF9FUSgwLCBib3V0czEubU51bWJlcik7Ci0gICAgICAgIEVYUEVDVF9FUSgwLCBib3V0czIubU51bWJlcik7Ci0KLSAgICAgICAgRVhQRUNUX0VRKDF1LCBpbnMyLnN0cmVhbSgpKTsKLSAgICAgICAgRVhQRUNUX0VRKDF1LCBvdXRzMi5zdHJlYW0oKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgwdSwgYmluczEuc3RyZWFtKCkpOwotICAgICAgICBFWFBFQ1RfRVEoMHUsIGJpbnMyLnN0cmVhbSgpKTsKLSAgICAgICAgRVhQRUNUX0VRKDB1LCBib3V0czEuc3RyZWFtKCkpOwotICAgICAgICBFWFBFQ1RfRVEoMHUsIGJvdXRzMi5zdHJlYW0oKSk7Ci0KLSAgICAgICAgRVhQRUNUX1RSVUUoaW5zMSAhPSBvdXRzMSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGluczEgPT0gaW5zMik7Ci0gICAgICAgIEVYUEVDVF9UUlVFKG91dHMxID09IG91dHMyKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoYmluczEgPT0gYm91dHMxKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoYmluczIgIT0gYm91dHMyKTsKLQotICAgICAgICBFWFBFQ1RfVFJVRShpbnMxICE9IGJpbnMxKTsKLSAgICAgICAgYmluczEubU51bWJlciA9IDEwMDsKLSAgICAgICAgRVhQRUNUX1RSVUUoaW5zMSAhPSBiaW5zMSk7Ci0gICAgICAgIGJpbnMxLnNldFBvcnQoZmFsc2UgLyogb3V0cHV0ICovKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoaW5zMSAhPSBiaW5zMSk7Ci0gICAgICAgIGJpbnMxLnNldFN0cmVhbSgxdSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGluczEgPT0gYmluczEpOwotCi0gICAgICAgIEVYUEVDVF9UUlVFKGluczIgIT0gYmluczIpOwotICAgICAgICBiaW5zMi5tTnVtYmVyID0gMTAwOwotICAgICAgICBFWFBFQ1RfVFJVRShpbnMyICE9IGJpbnMyKTsKLSAgICAgICAgYmluczIuc2V0U3RyZWFtKDF1KTsKLSAgICAgICAgRVhQRUNUX1RSVUUoaW5zMiA9PSBiaW5zMik7Ci0KLSAgICAgICAgYmluczEuc2V0UG9ydCh0cnVlIC8qIG91dHB1dCAqLyk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKG91dHMxID09IGJpbnMxKTsKLQotICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMSAhPSBib3V0czEpOwotICAgICAgICBib3V0czEubU51bWJlciA9IDEwMDsKLSAgICAgICAgRVhQRUNUX1RSVUUob3V0czEgIT0gYm91dHMxKTsKLSAgICAgICAgYm91dHMxLnNldFBvcnQodHJ1ZSAvKiBvdXRwdXQgKi8pOwotICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMSAhPSBib3V0czEpOwotICAgICAgICBib3V0czEuc2V0U3RyZWFtKDF1KTsKLSAgICAgICAgRVhQRUNUX1RSVUUob3V0czEgPT0gYm91dHMxKTsKLQotICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMiAhPSBib3V0czIpOwotICAgICAgICBib3V0czIubU51bWJlciA9IDEwMDsKLSAgICAgICAgRVhQRUNUX1RSVUUob3V0czIgIT0gYm91dHMyKTsKLSAgICAgICAgYm91dHMyLnNldFN0cmVhbSgxdSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKG91dHMyID09IGJvdXRzMik7Ci0KLSAgICAgICAgYm91dHMxLnNldFBvcnQoZmFsc2UgLyogb3V0cHV0ICovKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoaW5zMSA9PSBib3V0czEpOwotCi0gICAgICAgIC8vIGluZGV4Ci0gICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGluczEudHlwZSgpKS5iYXNlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OmJhc2VJbmRleCk7Ci0gICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGluczEudHlwZSgpKS5wYXJhbUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKLSAgICAgICAgRVhQRUNUX0VRKGluczEudHlwZSgpLCBDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OnR5cGVJbmRleCk7Ci0KLSAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5zMi50eXBlKCkpLmJhc2VJbmRleCgpLCBDMk51bWJlclN0cnVjdDo6YmFzZUluZGV4KTsKLSAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5zMi50eXBlKCkpLnBhcmFtSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOwotICAgICAgICBFWFBFQ1RfRVEoaW5zMi50eXBlKCksIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6dHlwZUluZGV4KTsKLQotICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMS50eXBlKCkpLmJhc2VJbmRleCgpLCBDMk51bWJlclN0cnVjdDo6YmFzZUluZGV4KTsKLSAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0czEudHlwZSgpKS5wYXJhbUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKLSAgICAgICAgRVhQRUNUX0VRKG91dHMxLnR5cGUoKSwgQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6dHlwZUluZGV4KTsKLQotICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMi50eXBlKCkpLmJhc2VJbmRleCgpLCBDMk51bWJlclN0cnVjdDo6YmFzZUluZGV4KTsKLSAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0czIudHlwZSgpKS5wYXJhbUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKLSAgICAgICAgRVhQRUNUX0VRKG91dHMyLnR5cGUoKSwgQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6dHlwZUluZGV4KTsKLQotICAgICAgICBDMlBhcmFtOjpCYXNlSW5kZXggaW5kZXggPSBDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OnR5cGVJbmRleDsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNGbGV4aWJsZSgpKTsKLSAgICAgICAgRVhQRUNUX0VRKGluZGV4LmJhc2VJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7Ci0gICAgICAgIEVYUEVDVF9FUShpbmRleC5wYXJhbUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKLQotICAgICAgICBpbmRleCA9IEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OnR5cGVJbmRleDsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNGbGV4aWJsZSgpKTsKLSAgICAgICAgRVhQRUNUX0VRKGluZGV4LmJhc2VJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7Ci0gICAgICAgIEVYUEVDVF9FUShpbmRleC5wYXJhbUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKLQotICAgICAgICBDMlBhcmFtOjpUeXBlIHR5cGUgPSBDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OnR5cGVJbmRleDsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzRmxleGlibGUoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOwotICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvcklucHV0KCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JPdXRwdXQoKSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yU3RyZWFtKCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JQb3J0KCkpOwotCi0gICAgICAgIHR5cGUgPSBDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0Ojp0eXBlSW5kZXg7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0ZsZXhpYmxlKCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0dsb2JhbCgpKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9ySW5wdXQoKSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yT3V0cHV0KCkpOwotICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvclN0cmVhbSgpKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yUG9ydCgpKTsKLQotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20oJmluczEpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZpbnMyKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclR1bmluZzo6RnJvbSgmb3V0czEpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZvdXRzMiksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKCZpbnMxKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJmluczIpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbSgmb3V0czEpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbSgmb3V0czIpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJmluczEpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJmluczIpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJm91dHMxKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZvdXRzMiksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oJmluczEpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZpbnMyKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSgmb3V0czEpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZvdXRzMiksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJmluczEpLCAmaW5zMSk7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6RnJvbSgmaW5zMiksIChDMk51bWJlclN0cmVhbVR1bmluZyopJmluczIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJm91dHMxKSwgJm91dHMxKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZvdXRzMiksIChDMk51bWJlclN0cmVhbVR1bmluZyopJm91dHMyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmaW5zMSksIChDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQqKSZpbnMxKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmaW5zMiksICZpbnMyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmb3V0czEpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmb3V0czIpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJmluczEpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJmluczIpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJm91dHMxKSwgKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQqKSZvdXRzMSk7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZvdXRzMiksICZvdXRzMik7Ci0KLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIHVpbnQzMl90IHZpZGVvV2lkdGhbXSA9IHsgMTJ1LCBDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0Ojp0eXBlSW5kZXgsIDEwMCB9OwotICAgICAgICBDMlBhcmFtICpwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgc2l6ZW9mKHZpZGVvV2lkdGgpKTsKLSAgICAgICAgRVhQRUNUX05FKHAxLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKDEydSwgcDEtPnNpemUoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShwMS0+dHlwZSgpLCBDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0Ojp0eXBlSW5kZXgpOwotCi0gICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkgKyAyKTsKLSAgICAgICAgRVhQRUNUX0VRKHAxLCBudWxscHRyKTsKLQotICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgc2l6ZW9mKHZpZGVvV2lkdGgpIC0gMik7Ci0gICAgICAgIEVYUEVDVF9FUShwMSwgbnVsbHB0cik7Ci0KLSAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIDMpOwotICAgICAgICBFWFBFQ1RfRVEocDEsIG51bGxwdHIpOwotCi0gICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCAwKTsKLSAgICAgICAgRVhQRUNUX0VRKHAxLCBudWxscHRyKTsKLSAgICB9Ci19Ci0KLXZvaWQgU3RhdGljVGVzdEFkZEJhc2VJbmRleCgpIHsKLSAgICBzdHJ1Y3Qgbm9iYXNlIHt9OwotICAgIHN0cnVjdCBiYXNlIHsgZW51bSA6IHVpbnQzMl90IHsgYmFzZUluZGV4ID0gMSB9OyB9OwotICAgIHN0YXRpY19hc3NlcnQoQzJBZGRCYXNlSW5kZXg8bm9iYXNlLCAyPjo6YmFzZUluZGV4ID09IDIsICJzaG91bGQgYmUgMiIpOwotICAgIHN0YXRpY19hc3NlcnQoQzJBZGRCYXNlSW5kZXg8YmFzZSwgMT46OmJhc2VJbmRleCA9PSAxLCAic2hvdWxkIGJlIDEiKTsKLX0KLQotY2xhc3MgVGVzdEZsZXhIZWxwZXIgewotICAgIHN0cnVjdCBfRmxleCB7Ci0gICAgICAgIGludDMyX3QgYTsKLSAgICAgICAgY2hhciBiW107Ci0gICAgICAgIF9GbGV4KCkge30KLSAgICAgICAgRkxFWChfRmxleCwgYik7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBfQm9GbGV4IHsKLSAgICAgICAgX0ZsZXggYTsKLSAgICAgICAgX0JvRmxleCgpIHt9Ci0gICAgICAgIEZMRVgoX0JvRmxleCwgYSk7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBfTm9uRmxleCB7Ci0gICAgfTsKLQotCi0gICAgc3RhdGljIHZvaWQgU3RhdGljVGVzdCgpIHsKLSAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8X0MyRmxleEhlbHBlcjxjaGFyPjo6ZmxleFR5cGUsIHZvaWQ+Ojp2YWx1ZSwgInNob3VsZCBiZSB2b2lkIik7Ci0gICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPF9DMkZsZXhIZWxwZXI8Y2hhcltdPjo6ZmxleFR5cGUsIGNoYXI+Ojp2YWx1ZSwgInNob3VsZCBiZSBjaGFyIik7Ci0gICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPF9DMkZsZXhIZWxwZXI8X0ZsZXg+OjpmbGV4VHlwZSwgY2hhcj46OnZhbHVlLCAic2hvdWxkIGJlIGNoYXIiKTsKLQotICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxfQzJGbGV4SGVscGVyPF9Cb0ZsZXg+OjpmbGV4VHlwZSwgY2hhcj46OnZhbHVlLCAic2hvdWxkIGJlIHZvaWQiKTsKLQotICAgICAgICBzdGF0aWNfYXNzZXJ0KF9DMkZsZXhpYmxlPF9GbGV4Pjo6dmFsdWUsICJzaG91bGQgYmUgZmxleGlibGUiKTsKLSAgICAgICAgc3RhdGljX2Fzc2VydCghX0MyRmxleGlibGU8X05vbkZsZXg+Ojp2YWx1ZSwgInNob3VsZCBub3QgYmUgZmxleGlibGUiKTsKLSAgICB9Ci19OwotCi1URVNUX0YoQzJQYXJhbVRlc3QsIEZsZXhQYXJhbU9wc1Rlc3QpIHsKLS8vICAgIGNvbnN0IEMyTnVtYmVyc1N0cnVjdCBzdHJ7MTAwfTsKLSAgICBDMk51bWJlcnNTdHJ1Y3QgYnN0cjsKLSAgICB7Ci0vLyAgICAgICAgRVhQRUNUX0VRKDEwMCwgc3RyLT5tLm1OdW1iZXJzWzBdKTsKLSAgICAgICAgKHZvaWQpJmJzdHIubU51bWJlcnNbMF07Ci0KLSAgICAgICAgQzJQYXJhbTo6QmFzZUluZGV4IGluZGV4ID0gQzJOdW1iZXJzU3RydWN0OjpiYXNlSW5kZXg7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoaW5kZXguaXNGbGV4aWJsZSgpKTsKLSAgICAgICAgRVhQRUNUX0VRKGluZGV4LmJhc2VJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMgfCBDMlBhcmFtOjpCYXNlSW5kZXg6Ol9rRmxleGlibGVGbGFnKTsKLSAgICAgICAgRVhQRUNUX0VRKGluZGV4LnBhcmFtSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKLSAgICB9Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzVHVuaW5nPiB0dW5fID0gQzJOdW1iZXJzVHVuaW5nOjphbGxvY191bmlxdWUoMSk7Ci0gICAgdHVuXy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJOdW1iZXJzVHVuaW5nPiB0dW4gPSBzdGQ6Om1vdmUodHVuXyk7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPEMyTnVtYmVyc1R1bmluZz4gYnR1biA9IEMyTnVtYmVyc1R1bmluZzo6YWxsb2Nfc2hhcmVkKDEpOwotCi0gICAgewotICAgICAgICAvLyBmbGFncyAmIGludmFyaWFibGVzCi0gICAgICAgIGNvbnN0IEMyTnVtYmVyc1R1bmluZyAqVFtdID0geyB0dW4uZ2V0KCksIGJ0dW4uZ2V0KCkgfTsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBUKSB7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCkoKnApKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghKCpwKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLT5zaXplKCkpOwotCi0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNWZW5kb3IoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5pc0ZsZXhpYmxlKCkpOwotICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+aXNHbG9iYWwoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9ySW5wdXQoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yT3V0cHV0KCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvclN0cmVhbSgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JQb3J0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdmFsdWUKLSAgICAgICAgRVhQRUNUX0VRKDEwMCwgdHVuLT5tLm1OdW1iZXJzWzBdKTsKLSAgICAgICAgRVhQRUNUX0VRKDAsIGJ0dW4tPm0ubU51bWJlcnNbMF0pOwotICAgICAgICBFWFBFQ1RfRkFMU0UoKnR1biA9PSAqYnR1bik7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0dW4tPm9wZXJhdG9yPT0oKmJ0dW4pKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoKnR1biAhPSAqYnR1bik7Ci0gICAgICAgIEVYUEVDVF9UUlVFKHR1bi0+b3BlcmF0b3IhPSgqYnR1bikpOwotICAgICAgICBidHVuLT5tLm1OdW1iZXJzWzBdID0gMTAwOwotICAgICAgICBFWFBFQ1RfRVEoKnR1biwgKmJ0dW4pOwotCi0gICAgICAgIC8vIGluZGV4Ci0gICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKHR1bi0+dHlwZSgpKS5iYXNlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpiYXNlSW5kZXgpOwotICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZSh0dW4tPnR5cGUoKSkucGFyYW1JbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOwotICAgICAgICBFWFBFQ1RfRVEodHVuLT50eXBlKCksIEMyTnVtYmVyc1R1bmluZzo6dHlwZUluZGV4KTsKLSAgICAgICAgRVhQRUNUX0VRKHR1bi0+c3RyZWFtKCksIH4wdSk7Ci0KLSAgICAgICAgQzJQYXJhbTo6QmFzZUluZGV4IGluZGV4ID0gQzJOdW1iZXJzVHVuaW5nOjpiYXNlSW5kZXg7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoaW5kZXguaXNGbGV4aWJsZSgpKTsKLSAgICAgICAgRVhQRUNUX0VRKGluZGV4LmJhc2VJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMgfCBDMlBhcmFtOjpCYXNlSW5kZXg6Ol9rRmxleGlibGVGbGFnKTsKLSAgICAgICAgRVhQRUNUX0VRKGluZGV4LnBhcmFtSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKLQotICAgICAgICBDMlBhcmFtOjpUeXBlIHR5cGUgPSBDMk51bWJlcnNUdW5pbmc6OnR5cGVJbmRleDsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuaXNGbGV4aWJsZSgpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5pc0dsb2JhbCgpKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9ySW5wdXQoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvck91dHB1dCgpKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yU3RyZWFtKCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JQb3J0KCkpOwotCi0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKHR1bi5nZXQoKSksIHR1bi5nZXQoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKHR1bi5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20odHVuLmdldCgpKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20odHVuLmdldCgpKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkZyb20odHVuLmdldCgpKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKHR1bi5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20odHVuLmdldCgpKSwgbnVsbHB0cik7Ci0gICAgfQotCi0gICAgc3RkOjp1bmlxdWVfcHRyPEMyTnVtYmVyc1BvcnRUdW5pbmc+IG91dHAxXyhDMk51bWJlcnNQb3J0VHVuaW5nOjphbGxvY191bmlxdWUoMSwgdHJ1ZSkpLAotICAgICAgICAgICAgaW5wMV8gPSBDMk51bWJlcnNQb3J0VHVuaW5nOjphbGxvY191bmlxdWUoMSwgZmFsc2UpOwotICAgIG91dHAxXy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKLSAgICBpbnAxXy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZz4gb3V0cDEgPSBzdGQ6Om1vdmUob3V0cDFfKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZz4gaW5wMSA9IHN0ZDo6bW92ZShpbnAxXyk7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPEMyTnVtYmVyc1BvcnRUdW5pbmc+IGJvdXRwMShDMk51bWJlcnNQb3J0VHVuaW5nOjphbGxvY19zaGFyZWQoMSkpLAotICAgICAgICAgICAgYmlucDEgPSBDMk51bWJlcnNQb3J0VHVuaW5nOjphbGxvY19zaGFyZWQoMSksCi0gICAgICAgICAgICBiaW5wMyA9IEMyTnVtYmVyc1BvcnRUdW5pbmc6OmFsbG9jX3NoYXJlZCgxLCBmYWxzZSk7Ci0gICAgYmlucDMtPm0ubU51bWJlcnNbMF0gPSAxMDA7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0PiBpbnAyXyhDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6YWxsb2NfdW5pcXVlKDEpKTsKLSAgICBpbnAyXy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ+IGlucDIgPSBzdGQ6Om1vdmUoaW5wMl8pOwotICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dD4gYmlucDIoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OmFsbG9jX3NoYXJlZCgxKSk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dD4gb3V0cDJfKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6YWxsb2NfdW5pcXVlKDEpKTsKLSAgICBvdXRwMl8tPm0ubU51bWJlcnNbMF0gPSAxMDA7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dD4gb3V0cDIgPSBzdGQ6Om1vdmUob3V0cDJfKTsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0PiBib3V0cDIoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjphbGxvY19zaGFyZWQoMSkpOwotCi0gICAgewotICAgICAgICBzdGF0aWNfYXNzZXJ0KGNhbkNhbGxTZXRQb3J0KCpiaW5wMyksICJzaG91bGQgYmUgYWJsZSB0byIpOwotICAgICAgICBzdGF0aWNfYXNzZXJ0KGNhbkNhbGxTZXRQb3J0KCpiaW5wMSksICJzaG91bGQgYmUgYWJsZSB0byIpOwotICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydCgqaW5wMSksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKGNvbnN0KSIpOwotICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydCgqaW5wMiksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKGNvbnN0ICYgdHlwZSkiKTsKLSAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoKmJpbnAyKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAodHlwZSkiKTsKLQotICAgICAgICAvLyBmbGFncyAmIGludmFyaWFibGVzCi0gICAgICAgIGNvbnN0IEMyTnVtYmVyc1BvcnRUdW5pbmcgKlBbXSA9IHsgb3V0cDEuZ2V0KCksIGlucDEuZ2V0KCksIGJvdXRwMS5nZXQoKSB9OwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFApIHsKLSAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAtPnNpemUoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNWZW5kb3IoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5pc0ZsZXhpYmxlKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzR2xvYmFsKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvclN0cmVhbSgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmZvclBvcnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQgKlBJW10gPSB7IGlucDIuZ2V0KCksIGJpbnAyLmdldCgpIH07Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUEkpIHsKLSAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAtPnNpemUoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNWZW5kb3IoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5pc0ZsZXhpYmxlKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzR2xvYmFsKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvclN0cmVhbSgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmZvclBvcnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0ICpQT1tdID0geyBvdXRwMi5nZXQoKSwgYm91dHAyLmdldCgpIH07Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUE8pIHsKLSAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAtPnNpemUoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNWZW5kb3IoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5pc0ZsZXhpYmxlKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzR2xvYmFsKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvclN0cmVhbSgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmZvclBvcnQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwb3J0IHNwZWNpZmljIGZsYWdzICYgaW52YXJpYWJsZXMKLSAgICAgICAgRVhQRUNUX0ZBTFNFKG91dHAxLT5mb3JJbnB1dCgpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUob3V0cDEtPmZvck91dHB1dCgpKTsKLQotICAgICAgICBFWFBFQ1RfVFJVRShpbnAxLT5mb3JJbnB1dCgpKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKGlucDEtPmZvck91dHB1dCgpKTsKLQotICAgICAgICBjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nICpQMltdID0geyBvdXRwMS5nZXQoKSwgaW5wMS5nZXQoKSB9OwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFAyKSB7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCkoKnApKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghKCpwKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRVEoMTAwLCBwLT5tLm1OdW1iZXJzWzBdKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFBPKSB7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCkoKnApKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghKCpwKSk7Ci0KLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JJbnB1dCgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmZvck91dHB1dCgpKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFBJKSB7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCkoKnApKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghKCpwKSk7Ci0KLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmZvcklucHV0KCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvck91dHB1dCgpKTsKLSAgICAgICAgfQotICAgICAgICBjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nICpQM1tdID0geyBib3V0cDEuZ2V0KCkgfTsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBQMykgewotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKChib29sKSgqcCkpOwotICAgICAgICAgICAgRVhQRUNUX1RSVUUoISgqcCkpOwotCi0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9ySW5wdXQoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yT3V0cHV0KCkpOwotICAgICAgICAgICAgRVhQRUNUX0VRKDAsIHAtPm0ubU51bWJlcnNbMF0pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdmFsdWVzCi0gICAgICAgIEVYUEVDVF9FUSgxMDAsIGlucDItPm0ubU51bWJlcnNbMF0pOwotICAgICAgICBFWFBFQ1RfRVEoMTAwLCBvdXRwMi0+bS5tTnVtYmVyc1swXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgwLCBiaW5wMS0+bS5tTnVtYmVyc1swXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgwLCBiaW5wMi0+bS5tTnVtYmVyc1swXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgwLCBib3V0cDEtPm0ubU51bWJlcnNbMF0pOwotICAgICAgICBFWFBFQ1RfRVEoMCwgYm91dHAyLT5tLm1OdW1iZXJzWzBdKTsKLQotICAgICAgICBFWFBFQ1RfVFJVRSgqaW5wMSAhPSAqb3V0cDEpOwotICAgICAgICBFWFBFQ1RfVFJVRSgqaW5wMSA9PSAqaW5wMik7Ci0gICAgICAgIEVYUEVDVF9UUlVFKCpvdXRwMSA9PSAqb3V0cDIpOwotICAgICAgICBFWFBFQ1RfVFJVRSgqYmlucDEgPT0gKmJvdXRwMSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKCpiaW5wMiAhPSAqYm91dHAyKTsKLQotICAgICAgICBFWFBFQ1RfVFJVRSgqaW5wMSAhPSAqYmlucDEpOwotICAgICAgICBiaW5wMS0+bS5tTnVtYmVyc1swXSA9IDEwMDsKLSAgICAgICAgRVhQRUNUX1RSVUUoKmlucDEgIT0gKmJpbnAxKTsKLSAgICAgICAgYmlucDEtPnNldFBvcnQoZmFsc2UgLyogb3V0cHV0ICovKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpKmJpbnAxKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKCEqYmlucDEpOwotICAgICAgICBFWFBFQ1RfVFJVRSgqaW5wMSA9PSAqYmlucDEpOwotCi0gICAgICAgIEVYUEVDVF9UUlVFKCppbnAyICE9ICpiaW5wMik7Ci0gICAgICAgIGJpbnAyLT5tLm1OdW1iZXJzWzBdID0gMTAwOwotICAgICAgICBFWFBFQ1RfVFJVRSgqaW5wMiA9PSAqYmlucDIpOwotCi0gICAgICAgIGJpbnAxLT5zZXRQb3J0KHRydWUgLyogb3V0cHV0ICovKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoKm91dHAxID09ICpiaW5wMSk7Ci0KLSAgICAgICAgRVhQRUNUX1RSVUUoKm91dHAxICE9ICpib3V0cDEpOwotICAgICAgICBib3V0cDEtPm0ubU51bWJlcnNbMF0gPSAxMDA7Ci0gICAgICAgIEVYUEVDVF9UUlVFKCpvdXRwMSAhPSAqYm91dHAxKTsKLSAgICAgICAgYm91dHAxLT5zZXRQb3J0KHRydWUgLyogb3V0cHV0ICovKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpKmJvdXRwMSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSghKmJvdXRwMSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKCpvdXRwMSA9PSAqYm91dHAxKTsKLQotICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0cDIgIT0gKmJvdXRwMik7Ci0gICAgICAgIGJvdXRwMi0+bS5tTnVtYmVyc1swXSA9IDEwMDsKLSAgICAgICAgRVhQRUNUX1RSVUUoKm91dHAyID09ICpib3V0cDIpOwotCi0gICAgICAgIGJvdXRwMS0+c2V0UG9ydChmYWxzZSAvKiBvdXRwdXQgKi8pOwotICAgICAgICBFWFBFQ1RfVFJVRSgqaW5wMSA9PSAqYm91dHAxKTsKLQotICAgICAgICAvLyBpbmRleAotICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnAxLT50eXBlKCkpLmJhc2VJbmRleCgpLCBDMk51bWJlcnNTdHJ1Y3Q6OmJhc2VJbmRleCk7Ci0gICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDEtPnR5cGUoKSkucGFyYW1JbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOwotICAgICAgICBFWFBFQ1RfRVEoaW5wMS0+dHlwZSgpLCBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6dHlwZUluZGV4KTsKLSAgICAgICAgRVhQRUNUX0VRKGlucDEtPnN0cmVhbSgpLCB+MHUpOwotCi0gICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDItPnR5cGUoKSkuYmFzZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6YmFzZUluZGV4KTsKLSAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5wMi0+dHlwZSgpKS5wYXJhbUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7Ci0gICAgICAgIEVYUEVDVF9FUShpbnAyLT50eXBlKCksIEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0Ojp0eXBlSW5kZXgpOwotICAgICAgICBFWFBFQ1RfRVEoaW5wMi0+c3RyZWFtKCksIH4wdSk7Ci0KLSAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDEtPnR5cGUoKSkuYmFzZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6YmFzZUluZGV4KTsKLSAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDEtPnR5cGUoKSkucGFyYW1JbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOwotICAgICAgICBFWFBFQ1RfRVEob3V0cDEtPnR5cGUoKSwgQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0Ojp0eXBlSW5kZXgpOwotICAgICAgICBFWFBFQ1RfRVEob3V0cDEtPnN0cmVhbSgpLCB+MHUpOwotCi0gICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHAyLT50eXBlKCkpLmJhc2VJbmRleCgpLCBDMk51bWJlcnNTdHJ1Y3Q6OmJhc2VJbmRleCk7Ci0gICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHAyLT50eXBlKCkpLnBhcmFtSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKLSAgICAgICAgRVhQRUNUX0VRKG91dHAyLT50eXBlKCksIEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6dHlwZUluZGV4KTsKLSAgICAgICAgRVhQRUNUX0VRKG91dHAyLT5zdHJlYW0oKSwgfjB1KTsKLQotICAgICAgICBDMlBhcmFtOjpCYXNlSW5kZXggaW5kZXggPSBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6dHlwZUluZGV4OwotICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGluZGV4LmlzRmxleGlibGUoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShpbmRleC5iYXNlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzIHwgQzJQYXJhbTo6QmFzZUluZGV4Ojpfa0ZsZXhpYmxlRmxhZyk7Ci0gICAgICAgIEVYUEVDVF9FUShpbmRleC5wYXJhbUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7Ci0KLSAgICAgICAgaW5kZXggPSBDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OnR5cGVJbmRleDsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOwotICAgICAgICBFWFBFQ1RfVFJVRShpbmRleC5pc0ZsZXhpYmxlKCkpOwotICAgICAgICBFWFBFQ1RfRVEoaW5kZXguYmFzZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyB8IEMyUGFyYW06OkJhc2VJbmRleDo6X2tGbGV4aWJsZUZsYWcpOwotICAgICAgICBFWFBFQ1RfRVEoaW5kZXgucGFyYW1JbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOwotCi0gICAgICAgIEMyUGFyYW06OlR5cGUgdHlwZSA9IEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0Ojp0eXBlSW5kZXg7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOwotICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmlzRmxleGlibGUoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOwotICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvcklucHV0KCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JPdXRwdXQoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclN0cmVhbSgpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JQb3J0KCkpOwotCi0gICAgICAgIHR5cGUgPSBDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OnR5cGVJbmRleDsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuaXNGbGV4aWJsZSgpKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNHbG9iYWwoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvcklucHV0KCkpOwotICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvck91dHB1dCgpKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yU3RyZWFtKCkpOwotICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvclBvcnQoKSk7Ci0KLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1R1bmluZzo6RnJvbShpbnAxLmdldCgpKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20oaW5wMi5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKG91dHAxLmdldCgpKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20ob3V0cDIuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20oaW5wMS5nZXQoKSksIGlucDEuZ2V0KCkpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShpbnAyLmdldCgpKSwgKEMyTnVtYmVyc1BvcnRUdW5pbmcqKWlucDIuZ2V0KCkpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShvdXRwMS5nZXQoKSksIG91dHAxLmdldCgpKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20ob3V0cDIuZ2V0KCkpLCAoQzJOdW1iZXJzUG9ydFR1bmluZyopb3V0cDIuZ2V0KCkpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oaW5wMS5nZXQoKSksIChDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dCopaW5wMS5nZXQoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShpbnAyLmdldCgpKSwgaW5wMi5nZXQoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShvdXRwMS5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20ob3V0cDIuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShpbnAxLmdldCgpKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oaW5wMi5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKG91dHAxLmdldCgpKSwgKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dCopb3V0cDEuZ2V0KCkpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKG91dHAyLmdldCgpKSwgb3V0cDIuZ2V0KCkpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpGcm9tKGlucDEuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbShpbnAyLmdldCgpKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkZyb20ob3V0cDEuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbShvdXRwMi5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbShpbnAxLmdldCgpKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKGlucDIuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20ob3V0cDEuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20ob3V0cDIuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKGlucDEuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKGlucDIuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKG91dHAxLmdldCgpKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShvdXRwMi5nZXQoKSksIG51bGxwdHIpOwotCi0gICAgfQotCi0gICAgc3RkOjp1bmlxdWVfcHRyPEMyTnVtYmVyc1N0cmVhbVR1bmluZz4gb3V0czFfKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6YWxsb2NfdW5pcXVlKDEsIHRydWUsIDF1KSk7Ci0gICAgb3V0czFfLT5tLm1OdW1iZXJzWzBdID0gMTAwOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmc+IG91dHMxID0gc3RkOjptb3ZlKG91dHMxXyk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPEMyTnVtYmVyc1N0cmVhbVR1bmluZz4gaW5zMV8oQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjphbGxvY191bmlxdWUoMSwgZmFsc2UsIDF1KSk7Ci0gICAgaW5zMV8tPm0ubU51bWJlcnNbMF0gPSAxMDA7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyTnVtYmVyc1N0cmVhbVR1bmluZz4gaW5zMSA9IHN0ZDo6bW92ZShpbnMxXyk7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPEMyTnVtYmVyc1N0cmVhbVR1bmluZz4gYm91dHMxKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6YWxsb2Nfc2hhcmVkKDEpKTsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nPiBiaW5zMShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmFsbG9jX3NoYXJlZCgxKSk7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPEMyTnVtYmVyc1N0cmVhbVR1bmluZz4gYmluczMoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjphbGxvY19zaGFyZWQoMSwgZmFsc2UsIDF1KSk7Ci0gICAgYmluczMtPm0ubU51bWJlcnNbMF0gPSAxMDA7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ+IGluczJfKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OmFsbG9jX3VuaXF1ZSgxLCAxdSkpOwotICAgIGluczJfLT5tLm1OdW1iZXJzWzBdID0gMTAwOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0PiBpbnMyID0gc3RkOjptb3ZlKGluczJfKTsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dD4gYmluczIoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6YWxsb2Nfc2hhcmVkKDEpKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ+IG91dHMyXyhDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6YWxsb2NfdW5pcXVlKDEsIDF1KSk7Ci0gICAgb3V0czJfLT5tLm1OdW1iZXJzWzBdID0gMTAwOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dD4gb3V0czIgPSBzdGQ6Om1vdmUob3V0czJfKTsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ+IGJvdXRzMihDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6YWxsb2Nfc2hhcmVkKDEpKTsKLQotICAgIHsKLSAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydCgqYmluczMpLCAic2hvdWxkIGJlIGFibGUgdG8iKTsKLSAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydCgqYmluczEpLCAic2hvdWxkIGJlIGFibGUgdG8iKTsKLSAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoKmluczEpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCkiKTsKLSAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoKmluczIpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCAmIHR5cGUpIik7Ci0gICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KCpiaW5zMiksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKHR5cGUpIik7Ci0KLSAgICAgICAgLy8gZmxhZ3MgJiBpbnZhcmlhYmxlcwotICAgICAgICBjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmcgKlNbXSA9IHsgb3V0czEuZ2V0KCksIGluczEuZ2V0KCksIGJvdXRzMS5nZXQoKSB9OwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFMpIHsKLSAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAtPnNpemUoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNWZW5kb3IoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5pc0ZsZXhpYmxlKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzR2xvYmFsKCkpOwotICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yU3RyZWFtKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvclBvcnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3QgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dCAqU0lbXSA9IHsgaW5zMi5nZXQoKSwgYmluczIuZ2V0KCkgfTsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBTSSkgewotICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC0+c2l6ZSgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc1ZlbmRvcigpKTsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzRmxleGlibGUoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNHbG9iYWwoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JTdHJlYW0oKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yUG9ydCgpKTsKLSAgICAgICAgfQotICAgICAgICBjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dCAqU09bXSA9IHsgb3V0czIuZ2V0KCksIGJvdXRzMi5nZXQoKSB9OwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFNPKSB7Ci0gICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLT5zaXplKCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzVmVuZG9yKCkpOwotICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+aXNGbGV4aWJsZSgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc0dsb2JhbCgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmZvclN0cmVhbSgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JQb3J0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcG9ydCBzcGVjaWZpYyBmbGFncyAmIGludmFyaWFibGVzCi0gICAgICAgIEVYUEVDVF9GQUxTRShvdXRzMS0+Zm9ySW5wdXQoKSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKG91dHMxLT5mb3JPdXRwdXQoKSk7Ci0KLSAgICAgICAgRVhQRUNUX1RSVUUoaW5zMS0+Zm9ySW5wdXQoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShpbnMxLT5mb3JPdXRwdXQoKSk7Ci0KLSAgICAgICAgY29uc3QgQzJOdW1iZXJzU3RyZWFtVHVuaW5nICpTMltdID0geyBvdXRzMS5nZXQoKSwgaW5zMS5nZXQoKSB9OwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFMyKSB7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCkoKnApKTsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghKCpwKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRVEoMTAwLCBwLT5tLm1OdW1iZXJzWzBdKTsKLSAgICAgICAgICAgIEVYUEVDVF9FUSgxdSwgcC0+c3RyZWFtKCkpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogU08pIHsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKLQotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvcklucHV0KCkpOwotICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yT3V0cHV0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogU0kpIHsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKLQotICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9ySW5wdXQoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yT3V0cHV0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IEMyTnVtYmVyc1N0cmVhbVR1bmluZyAqUzNbXSA9IHsgYm91dHMxLmdldCgpIH07Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUzMpIHsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRSgoYm9vbCkoKnApKTsKLSAgICAgICAgICAgIEVYUEVDVF9UUlVFKCEoKnApKTsKLQotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvcklucHV0KCkpOwotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvck91dHB1dCgpKTsKLSAgICAgICAgICAgIEVYUEVDVF9FUSgwLCBwLT5tLm1OdW1iZXJzWzBdKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHZhbHVlcwotICAgICAgICBFWFBFQ1RfRVEoMTAwLCBpbnMyLT5tLm1OdW1iZXJzWzBdKTsKLSAgICAgICAgRVhQRUNUX0VRKDEwMCwgb3V0czItPm0ubU51bWJlcnNbMF0pOwotICAgICAgICBFWFBFQ1RfRVEoMCwgYmluczEtPm0ubU51bWJlcnNbMF0pOwotICAgICAgICBFWFBFQ1RfRVEoMCwgYmluczItPm0ubU51bWJlcnNbMF0pOwotICAgICAgICBFWFBFQ1RfRVEoMCwgYm91dHMxLT5tLm1OdW1iZXJzWzBdKTsKLSAgICAgICAgRVhQRUNUX0VRKDAsIGJvdXRzMi0+bS5tTnVtYmVyc1swXSk7Ci0KLSAgICAgICAgRVhQRUNUX0VRKDF1LCBpbnMyLT5zdHJlYW0oKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgxdSwgb3V0czItPnN0cmVhbSgpKTsKLSAgICAgICAgRVhQRUNUX0VRKDB1LCBiaW5zMS0+c3RyZWFtKCkpOwotICAgICAgICBFWFBFQ1RfRVEoMHUsIGJpbnMyLT5zdHJlYW0oKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgwdSwgYm91dHMxLT5zdHJlYW0oKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgwdSwgYm91dHMyLT5zdHJlYW0oKSk7Ci0KLSAgICAgICAgRVhQRUNUX1RSVUUoKmluczEgIT0gKm91dHMxKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoKmluczEgPT0gKmluczIpOwotICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0czEgPT0gKm91dHMyKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoKmJpbnMxID09ICpib3V0czEpOwotICAgICAgICBFWFBFQ1RfVFJVRSgqYmluczIgIT0gKmJvdXRzMik7Ci0KLSAgICAgICAgRVhQRUNUX1RSVUUoKmluczEgIT0gKmJpbnMxKTsKLSAgICAgICAgYmluczEtPm0ubU51bWJlcnNbMF0gPSAxMDA7Ci0gICAgICAgIEVYUEVDVF9UUlVFKCppbnMxICE9ICpiaW5zMSk7Ci0gICAgICAgIGJpbnMxLT5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKCppbnMxICE9ICpiaW5zMSk7Ci0gICAgICAgIGJpbnMxLT5zZXRTdHJlYW0oMXUpOwotICAgICAgICBFWFBFQ1RfVFJVRSgqaW5zMSA9PSAqYmluczEpOwotCi0gICAgICAgIEVYUEVDVF9UUlVFKCppbnMyICE9ICpiaW5zMik7Ci0gICAgICAgIGJpbnMyLT5tLm1OdW1iZXJzWzBdID0gMTAwOwotICAgICAgICBFWFBFQ1RfVFJVRSgqaW5zMiAhPSAqYmluczIpOwotICAgICAgICBiaW5zMi0+c2V0U3RyZWFtKDF1KTsKLSAgICAgICAgRVhQRUNUX1RSVUUoKmluczIgPT0gKmJpbnMyKTsKLQotICAgICAgICBiaW5zMS0+c2V0UG9ydCh0cnVlIC8qIG91dHB1dCAqLyk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMSA9PSAqYmluczEpOwotCi0gICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMSAhPSAqYm91dHMxKTsKLSAgICAgICAgYm91dHMxLT5tLm1OdW1iZXJzWzBdID0gMTAwOwotICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0czEgIT0gKmJvdXRzMSk7Ci0gICAgICAgIGJvdXRzMS0+c2V0UG9ydCh0cnVlIC8qIG91dHB1dCAqLyk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMSAhPSAqYm91dHMxKTsKLSAgICAgICAgYm91dHMxLT5zZXRTdHJlYW0oMXUpOwotICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0czEgPT0gKmJvdXRzMSk7Ci0KLSAgICAgICAgRVhQRUNUX1RSVUUoKm91dHMyICE9ICpib3V0czIpOwotICAgICAgICBib3V0czItPm0ubU51bWJlcnNbMF0gPSAxMDA7Ci0gICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMiAhPSAqYm91dHMyKTsKLSAgICAgICAgYm91dHMyLT5zZXRTdHJlYW0oMXUpOwotICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0czIgPT0gKmJvdXRzMik7Ci0KLSAgICAgICAgYm91dHMxLT5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKCppbnMxID09ICpib3V0czEpOwotCi0gICAgICAgIC8vIGluZGV4Ci0gICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGluczEtPnR5cGUoKSkuYmFzZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6YmFzZUluZGV4KTsKLSAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5zMS0+dHlwZSgpKS5wYXJhbUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7Ci0gICAgICAgIEVYUEVDVF9FUShpbnMxLT50eXBlKCksIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OnR5cGVJbmRleCk7Ci0KLSAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5zMi0+dHlwZSgpKS5iYXNlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpiYXNlSW5kZXgpOwotICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnMyLT50eXBlKCkpLnBhcmFtSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKLSAgICAgICAgRVhQRUNUX0VRKGluczItPnR5cGUoKSwgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6dHlwZUluZGV4KTsKLQotICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMS0+dHlwZSgpKS5iYXNlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpiYXNlSW5kZXgpOwotICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMS0+dHlwZSgpKS5wYXJhbUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7Ci0gICAgICAgIEVYUEVDVF9FUShvdXRzMS0+dHlwZSgpLCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6dHlwZUluZGV4KTsKLQotICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMi0+dHlwZSgpKS5iYXNlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpiYXNlSW5kZXgpOwotICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMi0+dHlwZSgpKS5wYXJhbUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7Ci0gICAgICAgIEVYUEVDVF9FUShvdXRzMi0+dHlwZSgpLCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6dHlwZUluZGV4KTsKLQotICAgICAgICBDMlBhcmFtOjpCYXNlSW5kZXggaW5kZXggPSBDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0Ojp0eXBlSW5kZXg7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoaW5kZXguaXNGbGV4aWJsZSgpKTsKLSAgICAgICAgRVhQRUNUX0VRKGluZGV4LmJhc2VJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMgfCBDMlBhcmFtOjpCYXNlSW5kZXg6Ol9rRmxleGlibGVGbGFnKTsKLSAgICAgICAgRVhQRUNUX0VRKGluZGV4LnBhcmFtSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKLQotICAgICAgICBpbmRleCA9IEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0Ojp0eXBlSW5kZXg7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoaW5kZXguaXNGbGV4aWJsZSgpKTsKLSAgICAgICAgRVhQRUNUX0VRKGluZGV4LmJhc2VJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMgfCBDMlBhcmFtOjpCYXNlSW5kZXg6Ol9rRmxleGlibGVGbGFnKTsKLSAgICAgICAgRVhQRUNUX0VRKGluZGV4LnBhcmFtSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKLQotICAgICAgICBDMlBhcmFtOjpUeXBlIHR5cGUgPSBDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0Ojp0eXBlSW5kZXg7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOwotICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmlzRmxleGlibGUoKSk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOwotICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvcklucHV0KCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JPdXRwdXQoKSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yU3RyZWFtKCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JQb3J0KCkpOwotCi0gICAgICAgIHR5cGUgPSBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6dHlwZUluZGV4OwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc1ZlbmRvcigpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5pc0ZsZXhpYmxlKCkpOwotICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0dsb2JhbCgpKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9ySW5wdXQoKSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yT3V0cHV0KCkpOwotICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvclN0cmVhbSgpKTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yUG9ydCgpKTsKLQotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKGluczEuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1R1bmluZzo6RnJvbShpbnMyLmdldCgpKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20ob3V0czEuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1R1bmluZzo6RnJvbShvdXRzMi5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShpbnMxLmdldCgpKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKGluczIuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20ob3V0czEuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20ob3V0czIuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKGluczEuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKGluczIuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKG91dHMxLmdldCgpKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShvdXRzMi5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKGluczEuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShpbnMyLmdldCgpKSwgbnVsbHB0cik7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20ob3V0czEuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShvdXRzMi5nZXQoKSksIG51bGxwdHIpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpGcm9tKGluczEuZ2V0KCkpLCBpbnMxLmdldCgpKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbShpbnMyLmdldCgpKSwgKEMyTnVtYmVyc1N0cmVhbVR1bmluZyopaW5zMi5nZXQoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkZyb20ob3V0czEuZ2V0KCkpLCBvdXRzMS5nZXQoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkZyb20ob3V0czIuZ2V0KCkpLCAoQzJOdW1iZXJzU3RyZWFtVHVuaW5nKilvdXRzMi5nZXQoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKGluczEuZ2V0KCkpLCAoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dCopaW5zMS5nZXQoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKGluczIuZ2V0KCkpLCBpbnMyLmdldCgpKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20ob3V0czEuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20ob3V0czIuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKGluczEuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKGluczIuZ2V0KCkpLCBudWxscHRyKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKG91dHMxLmdldCgpKSwgKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0KilvdXRzMS5nZXQoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShvdXRzMi5nZXQoKSksIG91dHMyLmdldCgpKTsKLQotICAgIH0KLQotICAgIHsKLSAgICAgICAgQzJJbnQzMlZhbHVlIGludDMyVmFsdWUoSU5UMzJfTUlOKTsKLSAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoaW50MzJWYWx1ZS5tVmFsdWUpLCBpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50MzJfdCIpOwotICAgICAgICBFWFBFQ1RfRVEoSU5UMzJfTUlOLCBpbnQzMlZhbHVlLm1WYWx1ZSk7Ci0gICAgICAgIHN0ZDo6bGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gaW50MzJWYWx1ZS5maWVsZExpc3Q7Ci0gICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLnNpemUoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShGRDo6SU5UMzIsIGZpZWxkcy5jYmVnaW4oKS0+dHlwZSgpKTsKLSAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuY2JlZ2luKCktPmxlbmd0aCgpKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyU3RyaW5nKCJ2YWx1ZSIpLCBmaWVsZHMuY2JlZ2luKCktPm5hbWUoKSk7Ci0gICAgfQotCi0gICAgewotICAgICAgICBDMlVpbnQzMlZhbHVlIHVpbnQzMlZhbHVlKFVJTlQzMl9NQVgpOwotICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZSh1aW50MzJWYWx1ZS5tVmFsdWUpLCB1aW50MzJfdD46OnZhbHVlLCAic2hvdWxkIGJlIHVpbnQzMl90Iik7Ci0gICAgICAgIEVYUEVDVF9FUShVSU5UMzJfTUFYLCB1aW50MzJWYWx1ZS5tVmFsdWUpOwotICAgICAgICBzdGQ6Omxpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IHVpbnQzMlZhbHVlLmZpZWxkTGlzdDsKLSAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuc2l6ZSgpKTsKLSAgICAgICAgRVhQRUNUX0VRKEZEOjpVSU5UMzIsIGZpZWxkcy5jYmVnaW4oKS0+dHlwZSgpKTsKLSAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuY2JlZ2luKCktPmxlbmd0aCgpKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyU3RyaW5nKCJ2YWx1ZSIpLCBmaWVsZHMuY2JlZ2luKCktPm5hbWUoKSk7Ci0gICAgfQotCi0gICAgewotICAgICAgICBDMkludDY0VmFsdWUgaW50NjRWYWx1ZShJTlQ2NF9NSU4pOwotICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShpbnQ2NFZhbHVlLm1WYWx1ZSksIGludDY0X3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQ2NF90Iik7Ci0gICAgICAgIEVYUEVDVF9FUShJTlQ2NF9NSU4sIGludDY0VmFsdWUubVZhbHVlKTsKLSAgICAgICAgc3RkOjpsaXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZHMgPSBpbnQ2NFZhbHVlLmZpZWxkTGlzdDsKLSAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuc2l6ZSgpKTsKLSAgICAgICAgRVhQRUNUX0VRKEZEOjpJTlQ2NCwgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOwotICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5jYmVnaW4oKS0+bGVuZ3RoKCkpOwotICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIEMyVWludDY0VmFsdWUgdWludDY0VmFsdWUoVUlOVDY0X01BWCk7Ci0gICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKHVpbnQ2NFZhbHVlLm1WYWx1ZSksIHVpbnQ2NF90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDY0X3QiKTsKLSAgICAgICAgRVhQRUNUX0VRKFVJTlQ2NF9NQVgsIHVpbnQ2NFZhbHVlLm1WYWx1ZSk7Ci0gICAgICAgIHN0ZDo6bGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gdWludDY0VmFsdWUuZmllbGRMaXN0OwotICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOwotICAgICAgICBFWFBFQ1RfRVEoRkQ6OlVJTlQ2NCwgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOwotICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5jYmVnaW4oKS0+bGVuZ3RoKCkpOwotICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIEMyRmxvYXRWYWx1ZSBmbG9hdFZhbHVlKDEyMy40Zik7Ci0gICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGZsb2F0VmFsdWUubVZhbHVlKSwgZmxvYXQ+Ojp2YWx1ZSwgInNob3VsZCBiZSBmbG9hdCIpOwotICAgICAgICBFWFBFQ1RfRVEoMTIzLjRmLCBmbG9hdFZhbHVlLm1WYWx1ZSk7Ci0gICAgICAgIHN0ZDo6bGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gZmxvYXRWYWx1ZS5maWVsZExpc3Q7Ci0gICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLnNpemUoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShGRDo6RkxPQVQsIGZpZWxkcy5jYmVnaW4oKS0+dHlwZSgpKTsKLSAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuY2JlZ2luKCktPmxlbmd0aCgpKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyU3RyaW5nKCJ2YWx1ZSIpLCBmaWVsZHMuY2JlZ2luKCktPm5hbWUoKSk7Ci0gICAgfQotCi0gICAgewotICAgICAgICB1aW50OF90IGluaXRWYWx1ZVtdID0gIkFCQ0QiOwotICAgICAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMkJsb2JWYWx1ZSwgMD4gQmxvYlNldHRpbmc7Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxCbG9iU2V0dGluZz4gYmxvYlZhbHVlID0gQmxvYlNldHRpbmc6OmFsbG9jX3VuaXF1ZSg2LCBDMkNvbnN0TWVtb3J5QmxvY2s8dWludDhfdD4oaW5pdFZhbHVlKSk7Ci0gICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGJsb2JWYWx1ZS0+bS5tVmFsdWUpLCB1aW50OF90W10+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50OF90W10iKTsKLSAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChibG9iVmFsdWUtPm0ubVZhbHVlLCAiQUJDRFwwIiwgNikpOwotICAgICAgICBFWFBFQ1RfRVEoNnUsIGJsb2JWYWx1ZS0+ZmxleENvdW50KCkpOwotICAgICAgICBzdGQ6Omxpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IGJsb2JWYWx1ZS0+ZmllbGRMaXN0OwotICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOwotICAgICAgICBFWFBFQ1RfRVEoRkQ6OkJMT0IsIGZpZWxkcy5jYmVnaW4oKS0+dHlwZSgpKTsKLSAgICAgICAgRVhQRUNUX0VRKDB1LCBmaWVsZHMuY2JlZ2luKCktPmxlbmd0aCgpKTsKLSAgICAgICAgRVhQRUNUX0VRKEMyU3RyaW5nKCJ2YWx1ZSIpLCBmaWVsZHMuY2JlZ2luKCktPm5hbWUoKSk7Ci0KLSAgICAgICAgYmxvYlZhbHVlID0gQmxvYlNldHRpbmc6OmFsbG9jX3VuaXF1ZSgzLCBDMkNvbnN0TWVtb3J5QmxvY2s8dWludDhfdD4oaW5pdFZhbHVlKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoYmxvYlZhbHVlLT5tLm1WYWx1ZSwgIkFCQyIsIDMpKTsKLSAgICAgICAgRVhQRUNUX0VRKDN1LCBibG9iVmFsdWUtPmZsZXhDb3VudCgpKTsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIGNvbnN0ZXhwciBjaGFyIGluaXRWYWx1ZVtdID0gIkFCQ0QiOwotICAgICAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlN0cmluZ1ZhbHVlLCAwPiBTdHJpbmdTZXR0aW5nOwotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nU2V0dGluZz4gc3RyaW5nVmFsdWUgPSBTdHJpbmdTZXR0aW5nOjphbGxvY191bmlxdWUoNiwgQzJDb25zdE1lbW9yeUJsb2NrPGNoYXI+KGluaXRWYWx1ZSkpOwotICAgICAgICBzdHJpbmdWYWx1ZSA9IFN0cmluZ1NldHRpbmc6OmFsbG9jX3VuaXF1ZSg2LCBpbml0VmFsdWUpOwotICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShzdHJpbmdWYWx1ZS0+bS5tVmFsdWUpLCBjaGFyW10+Ojp2YWx1ZSwgInNob3VsZCBiZSBjaGFyW10iKTsKLSAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChzdHJpbmdWYWx1ZS0+bS5tVmFsdWUsICJBQkNEXDAiLCA2KSk7Ci0gICAgICAgIEVYUEVDVF9FUSg2dSwgc3RyaW5nVmFsdWUtPmZsZXhDb3VudCgpKTsKLSAgICAgICAgc3RkOjpsaXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZHMgPSBzdHJpbmdWYWx1ZS0+ZmllbGRMaXN0OwotICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOwotICAgICAgICBFWFBFQ1RfRVEoRkQ6OlNUUklORywgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOwotICAgICAgICBFWFBFQ1RfRVEoMHUsIGZpZWxkcy5jYmVnaW4oKS0+bGVuZ3RoKCkpOwotICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKLQotICAgICAgICBzdHJpbmdWYWx1ZSA9IFN0cmluZ1NldHRpbmc6OmFsbG9jX3VuaXF1ZSgzLCBDMkNvbnN0TWVtb3J5QmxvY2s8Y2hhcj4oaW5pdFZhbHVlKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoc3RyaW5nVmFsdWUtPm0ubVZhbHVlLCAiQUIiLCAzKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgzdSwgc3RyaW5nVmFsdWUtPmZsZXhDb3VudCgpKTsKLQotICAgICAgICBzdHJpbmdWYWx1ZSA9IFN0cmluZ1NldHRpbmc6OmFsbG9jX3VuaXF1ZSgxMSwgImluaXRWYWx1ZSIpOwotICAgICAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKHN0cmluZ1ZhbHVlLT5tLm1WYWx1ZSwgImluaXRWYWx1ZVwwIiwgMTEpKTsKLSAgICAgICAgRVhQRUNUX0VRKDExdSwgc3RyaW5nVmFsdWUtPmZsZXhDb3VudCgpKTsKLQotICAgICAgICBzdHJpbmdWYWx1ZSA9IFN0cmluZ1NldHRpbmc6OmFsbG9jX3VuaXF1ZShpbml0VmFsdWUpOwotICAgICAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKHN0cmluZ1ZhbHVlLT5tLm1WYWx1ZSwgIkFCQ0QiLCA1KSk7Ci0gICAgICAgIEVYUEVDVF9FUSg1dSwgc3RyaW5nVmFsdWUtPmZsZXhDb3VudCgpKTsKLQotICAgICAgICBzdHJpbmdWYWx1ZSA9IFN0cmluZ1NldHRpbmc6OmFsbG9jX3VuaXF1ZSh7ICdBJywgJ0InLCAnQycsICdEJyB9KTsKLSAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChzdHJpbmdWYWx1ZS0+bS5tVmFsdWUsICJBQkMiLCA0KSk7Ci0gICAgICAgIEVYUEVDVF9FUSg0dSwgc3RyaW5nVmFsdWUtPmZsZXhDb3VudCgpKTsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIHVpbnQzMl90IHZpZGVvV2lkdGhbXSA9IHsgMTJ1LCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6dHlwZUluZGV4LCAxMDAgfTsKLSAgICAgICAgQzJQYXJhbSAqcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIHNpemVvZih2aWRlb1dpZHRoKSk7Ci0gICAgICAgIEVYUEVDVF9ORShudWxscHRyLCBwMSk7Ci0gICAgICAgIEVYUEVDVF9FUSgxMnUsIHAxLT5zaXplKCkpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OnR5cGVJbmRleCwgcDEtPnR5cGUoKSk7Ci0KLSAgICAgICAgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQgKnZzdCA9IEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKHAxKTsKLSAgICAgICAgRVhQRUNUX05FKG51bGxwdHIsIHZzdCk7Ci0gICAgICAgIGlmICh2c3QpIHsKLSAgICAgICAgICAgIEVYUEVDVF9FUSgxdSwgdnN0LT5mbGV4Q291bnQoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRVEoMTAwLCB2c3QtPm0ubU51bWJlcnNbMF0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIHNpemVvZih2aWRlb1dpZHRoKSArIDIpOwotICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcDEpOwotCi0gICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkgLSAyKTsKLSAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIHAxKTsKLQotICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgMyk7Ci0gICAgICAgIEVYUEVDVF9FUShudWxscHRyLCBwMSk7Ci0KLSAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIDApOwotICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcDEpOwotICAgIH0KLQotICAgIHsKLSAgICAgICAgdWludDMyX3QgdmlkZW9XaWR0aFtdID0geyAxNnUsIEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0Ojp0eXBlSW5kZXgsIDEwMSwgMTAyIH07Ci0KLSAgICAgICAgQzJQYXJhbSAqcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIHNpemVvZih2aWRlb1dpZHRoKSk7Ci0gICAgICAgIEVYUEVDVF9ORShudWxscHRyLCBwMSk7Ci0gICAgICAgIEVYUEVDVF9FUSgxNnUsIHAxLT5zaXplKCkpOwotICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OnR5cGVJbmRleCwgcDEtPnR5cGUoKSk7Ci0KLSAgICAgICAgQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQgKnZwdCA9IEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKHAxKTsKLSAgICAgICAgRVhQRUNUX05FKG51bGxwdHIsIHZwdCk7Ci0gICAgICAgIGlmICh2cHQpIHsKLSAgICAgICAgICAgIEVYUEVDVF9FUSgydSwgdnB0LT5mbGV4Q291bnQoKSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRVEoMTAxLCB2cHQtPm0ubU51bWJlcnNbMF0pOwotICAgICAgICAgICAgRVhQRUNUX0VRKDEwMiwgdnB0LT5tLm1OdW1iZXJzWzFdKTsKLSAgICAgICAgfQotCi0gICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkgKyAyKTsKLSAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIHAxKTsKLQotICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgc2l6ZW9mKHZpZGVvV2lkdGgpIC0gMik7Ci0gICAgICAgIEVYUEVDVF9FUShudWxscHRyLCBwMSk7Ci0KLSAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIDMpOwotICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcDEpOwotCi0gICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCAwKTsKLSAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIHAxKTsKLSAgICB9Ci19Ci0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqCi0KLX0KLQotI2luY2x1ZGUgPHV0aWwvQzJQYXJhbVV0aWxzLmg+Ci0jaW5jbHVkZSA8QzJDb25maWcuaD4KLSNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotQzJFTlVNKAotICAgIE1ldGFkYXRhVHlwZSwgaW50MzJfdCwKLSAgICBrSW52YWxpZCA9IC0xLAotICAgIGtOb25lID0gMCwKLSAgICBrR3JhbGxvYywKLSAgICBrTmF0aXZlSGFuZGxlLAotICAgIGtBTmF0aXZlV2luZG93LAotICAgIGtDYW1lcmEsCi0pCi0KLWVudW0gewotICAgIGtQYXJhbUluZGV4VmlkZW9Db25maWcgPSAweDEyMzQsCi19OwotCi1zdHJ1Y3QgQzJWaWRlb0NvbmZpZ1N0cnVjdCB7Ci0gICAgaW50MzJfdCBtV2lkdGg7Ci0gICAgdWludDMyX3QgbUhlaWdodDsKLSAgICBNZXRhZGF0YVR5cGUgbU1ldGFkYXRhVHlwZTsKLSAgICBpbnQzMl90IG1TdXBwb3J0ZWRGb3JtYXRzW107Ci0KLSAgICBDMlZpZGVvQ29uZmlnU3RydWN0KCkge30KLQotICAgIERFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChWaWRlb0NvbmZpZywgbVN1cHBvcnRlZEZvcm1hdHMpCi0gICAgQzJGSUVMRChtV2lkdGgsICJ3aWR0aCIpCi0gICAgQzJGSUVMRChtSGVpZ2h0LCAiaGVpZ2h0IikKLSAgICBDMkZJRUxEKG1NZXRhZGF0YVR5cGUsICJtZXRhZGF0YS10eXBlIikKLSAgICBDMkZJRUxEKG1TdXBwb3J0ZWRGb3JtYXRzLCAiZm9ybWF0cyIpCi19OwotCi10eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlZpZGVvQ29uZmlnU3RydWN0PiBDMlZpZGVvQ29uZmlnUG9ydFR1bmluZzsKLQotY2xhc3MgTXlSZWZsZWN0b3IgOiBwdWJsaWMgQzJQYXJhbVJlZmxlY3RvciB7Ci1wcml2YXRlOgotICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlZpZGVvQ29uZmlnUG9ydFR1bmluZzo6aW5wdXQ+IGlucHV0VmlkZW9Db25maWdUdW5pbmc7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPEMyVmlkZW9Db25maWdQb3J0VHVuaW5nOjpvdXRwdXQ+IG91dHB1dFZpZGVvQ29uZmlnVHVuaW5nOwotCi1wdWJsaWM6Ci0gICAgdm9pZCBkZXNjcmliZVN1cHBvcnRlZFZhbHVlcygpIHsKLSAgICAgICAgQzJUeXBlZEZpZWxkU3VwcG9ydGVkVmFsdWVzPGludDMyX3Q+IHN1cHBvcnRlZFdpZHRocygxNiwgMTkyMCwgOCk7Ci0gICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgc3VwcG9ydGVkV2lkdGhzMigxNiwgMTkyMCwgOCk7Ci0KLQotICAgICAgICBzdGQ6Omxpc3Q8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gc3VwcG9ydGVkOwotICAgICAgICAvL3N1cHBvcnRlZC5lbXBsYWNlX3B1c2goaW5wdXRWaWRlb0NvbmZpZ1R1bmluZy0+bU51bWJlciwgcmFuZ2UoMTYsIDE5MjAsIDgpKTsKLSAgICAgICAgLy9zdXBwb3J0ZWQuZW1wbGFjZV9wdXNoKGlucHV0VmlkZW9Db25maWdUdW5pbmctPm1IZWlnaHQsIHJhbmdlKDE2LCAxMDg4LCA4KSk7Ci0gICAgICAgIC8vc3VwcG9ydGVkLmVtcGxhY2VfcHVzaChpbnB1dFZpZGVvQ29uZmlnVHVuaW5nLT5tTWV0YWRhdGFUeXBlLCBhbGxfZW51bXMpOwotICAgICAgICAvL3N1cHBvcnRlZC5lbXBsYWNlX3B1c2goaW5wdXRWaWRlb0NvbmZpZ1R1bmluZy0+bVN1cHBvcnRlZEZvcm1hdHMsIHsgMCwgMSwgNSwgNyB9KTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxhbmRyb2lkOjpDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaWJlKEMyUGFyYW06OkJhc2VJbmRleCBwYXJhbVR5cGUpIHsKLSAgICAgICAgc3dpdGNoIChwYXJhbVR5cGUuYmFzZUluZGV4KCkpIHsKLSAgICAgICAgY2FzZSBDMlZpZGVvQ29uZmlnUG9ydFR1bmluZzo6YmFzZUluZGV4OgotICAgICAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+KG5ldyBDMlN0cnVjdERlc2NyaXB0b3J7Ci0gICAgICAgICAgICAgICAgcGFyYW1UeXBlLmJhc2VJbmRleCgpLAotICAgICAgICAgICAgICAgIEMyVmlkZW9Db25maWdQb3J0VHVuaW5nOjpmaWVsZExpc3QsCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci19OwotCi1jbGFzcyBNeUNvbXBvbmVudEluc3RhbmNlIDogcHVibGljIEMyQ29tcG9uZW50SW50ZXJmYWNlIHsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCB7Ci0gICAgICAgIC8vLyBcdG9kbyB0aGlzIHNlZW1zIHRvbyBzcGVjaWZpYwotICAgICAgICByZXR1cm4gInNhbXBsZS5pbnRlcmZhY2UiOwotICAgIH07Ci0KLSAgICB2aXJ0dWFsIG5vZGVfaWQgZ2V0SWQoKSBjb25zdCB7Ci0gICAgICAgIC8vLyBcdG9kbyBob3cgYXJlIHRoZXNlIHNoYXJlZD8KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb21taXRfc20oCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKiBjb25zdD4gJnBhcmFtcywKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpIHsKLSAgICAgICAgKHZvaWQpcGFyYW1zOwotICAgICAgICAodm9pZClmYWlsdXJlczsKLSAgICAgICAgcmV0dXJuIEMyX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlnX25iKAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSogY29uc3Q+ICZwYXJhbXMsCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSB7Ci0gICAgICAgICh2b2lkKXBhcmFtczsKLSAgICAgICAgKHZvaWQpZmFpbHVyZXM7Ci0gICAgICAgIHJldHVybiBDMl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVR1bm5lbF9zbShub2RlX2lkIHRhcmdldENvbXBvbmVudCkgewotICAgICAgICAodm9pZCl0YXJnZXRDb21wb25lbnQ7Ci0gICAgICAgIHJldHVybiBDMl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5X25iKAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSogY29uc3Q+ICZzdGFja1BhcmFtcywKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0IHsKLSAgICAgICAgZm9yIChDMlBhcmFtKiBjb25zdCBwYXJhbSA6IHN0YWNrUGFyYW1zKSB7Ci0gICAgICAgICAgICBpZiAoISpwYXJhbSkgeyAvLyBwYXJhbSBpcyBhbHJlYWR5IGludmFsaWQgLSByZW1lbWJlciBpdAotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBub3RlOiB0aGlzIGRvZXMgbm90IGhhbmRsZSBzdHJlYW0gcGFyYW1zIChzaG91bGQgdXNlIGluZGV4Li4uKQotICAgICAgICAgICAgaWYgKCFtTXlQYXJhbXMuY291bnQocGFyYW0tPnR5cGUoKSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gbm90IG15IHBhcmFtCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEMyUGFyYW0gJiBteVBhcmFtID0gbU15UGFyYW1zLmZpbmQocGFyYW0tPnR5cGUoKSktPnNlY29uZDsKLSAgICAgICAgICAgIGlmIChteVBhcmFtLnNpemUoKSAhPSBwYXJhbS0+c2l6ZSgpKSB7IC8vIGluY29ycmVjdCBzaXplCi0gICAgICAgICAgICAgICAgcGFyYW0tPmludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcGFyYW0tPnVwZGF0ZUZyb20obXlQYXJhbSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGNvbnN0IEMyUGFyYW06OkluZGV4IGluZGV4IDogaGVhcFBhcmFtSW5kaWNlcykgewotICAgICAgICAgICAgaWYgKG1NeVBhcmFtcy5jb3VudChpbmRleCkpIHsKLSAgICAgICAgICAgICAgICBDMlBhcmFtICYgbXlQYXJhbSA9IG1NeVBhcmFtcy5maW5kKGluZGV4KS0+c2Vjb25kOwotICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBwYXJhbUNvcHkoQzJQYXJhbTo6RnJvbSgmbXlQYXJhbSwgbXlQYXJhbS5zaXplKCkpKTsKLSAgICAgICAgICAgICAgICBoZWFwUGFyYW1zLT5wdXNoX2JhY2soc3RkOjptb3ZlKHBhcmFtQ29weSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEMyX09LOwotICAgIH0KLQotICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50MzJfdCwgQzJQYXJhbSAmPiBtTXlQYXJhbXM7Ci0KLSAgICBDMkNvbXBvbmVudERvbWFpbkluZm8gbURvbWFpbkluZm87Ci0KLSAgICBNeUNvbXBvbmVudEluc3RhbmNlKCkgewotICAgICAgICBtTXlQYXJhbXMuaW5zZXJ0KHttRG9tYWluSW5mby50eXBlKCksIG1Eb21haW5JbmZvfSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlVHVubmVsX3NtKG5vZGVfaWQgdGFyZ2V0Q29tcG9uZW50KSB7Ci0gICAgICAgICh2b2lkKXRhcmdldENvbXBvbmVudDsKLSAgICAgICAgcmV0dXJuIEMyX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIGNsYXNzIE15UGFyYW1SZWZsZWN0b3IgOiBwdWJsaWMgQzJQYXJhbVJlZmxlY3RvciB7Ci0gICAgICAgIGNvbnN0IE15Q29tcG9uZW50SW5zdGFuY2UgKmluc3RhbmNlOwotCi0gICAgcHVibGljOgotICAgICAgICBNeVBhcmFtUmVmbGVjdG9yKGNvbnN0IE15Q29tcG9uZW50SW5zdGFuY2UgKmkpIDogaW5zdGFuY2UoaSkgeyB9Ci0KLSAgICAgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmliZShDMlBhcmFtOjpCYXNlSW5kZXggcGFyYW1JbmRleCkgewotICAgICAgICAgICAgc3dpdGNoIChwYXJhbUluZGV4LmJhc2VJbmRleCgpKSB7Ci0gICAgICAgICAgICBjYXNlIGRlY2x0eXBlKGluc3RhbmNlLT5tRG9tYWluSW5mbyk6OmJhc2VJbmRleDoKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+KG5ldyBDMlN0cnVjdERlc2NyaXB0b3J7Ci0gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLT5tRG9tYWluSW5mby50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgIGRlY2x0eXBlKGluc3RhbmNlLT5tRG9tYWluSW5mbyk6OmZpZWxkTGlzdCwKLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkVmFsdWVzKAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgQzJQYXJhbUZpZWxkPiBmaWVsZHMsCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPiogY29uc3QgdmFsdWVzKSBjb25zdCB7Ci0gICAgICAgIGZvciAoY29uc3QgQzJQYXJhbUZpZWxkICZmaWVsZCA6IGZpZWxkcykgewotICAgICAgICAgICAgaWYgKGZpZWxkID09IEMyUGFyYW1GaWVsZCgmbURvbWFpbkluZm8sICZDMkNvbXBvbmVudERvbWFpbkluZm86Om1WYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICB2YWx1ZXMtPnB1c2hfYmFjayhDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKAotICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBmbGFnICovLAotICAgICAgICAgICAgICAgICAgICAmbURvbWFpbkluZm8ubVZhbHVlCi0gICAgICAgICAgICAgICAgICAgIC8vLAotICAgICAgICAgICAgICAgICAgICAvL3soaW50MzJfdClDMkRvbWFpblZpZGVvfQotICAgICAgICAgICAgICAgICkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDMl9PSzsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBnZXRQYXJhbVJlZmxlY3RvcigpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPihuZXcgTXlQYXJhbVJlZmxlY3Rvcih0aGlzKSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWRQYXJhbXMoc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKiBjb25zdCBwYXJhbXMpIGNvbnN0IHsKLSAgICAgICAgcGFyYW1zLT5wdXNoX2JhY2soc3RkOjptYWtlX3NoYXJlZDxDMlBhcmFtRGVzY3JpcHRvcj4oCi0gICAgICAgICAgICAgICAgdHJ1ZSAvKiByZXF1aXJlZCAqLywgIl9kb21haW4iLCAmbURvbWFpbkluZm8pKTsKLSAgICAgICAgcmV0dXJuIEMyX09LOwotICAgIH0KLQotICAgIHN0YXR1c190IGdldFN1cHBvcnRlZFBhcmFtczIoc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKiBjb25zdCBwYXJhbXMpIHsKLSAgICAgICAgcGFyYW1zLT5wdXNoX2JhY2soc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPigKLSAgICAgICAgICAgICAgICBuZXcgQzJQYXJhbURlc2NyaXB0b3IodHJ1ZSAvKiByZXF1aXJlZCAqLywgIl9kb21haW4iLCAmbURvbWFpbkluZm8pKSk7Ci0gICAgICAgIHJldHVybiBDMl9PSzsKLSAgICB9Ci0KLX07Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEUsIGJvb2wgUz1zdGQ6OmlzX2VudW08RT46OnZhbHVlPgotc3RydWN0IGdldHRlciB7Ci0gICAgaW50MzJfdCBnZXQoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCBpbnQzMl90KikgewotICAgICAgICByZXR1cm4gcC5pMzI7Ci0gICAgfQotICAgIGludDY0X3QgZ2V0KGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlByaW1pdGl2ZSAmcCwgaW50NjRfdCopIHsKLSAgICAgICAgcmV0dXJuIHAuaTY0OwotICAgIH0KLSAgICB1aW50MzJfdCBnZXQoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCB1aW50MzJfdCopIHsKLSAgICAgICAgcmV0dXJuIHAudTMyOwotICAgIH0KLSAgICB1aW50NjRfdCBnZXQoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCB1aW50NjRfdCopIHsKLSAgICAgICAgcmV0dXJuIHAudTY0OwotICAgIH0KLSAgICBmbG9hdCBnZXQoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCBmbG9hdCopIHsKLSAgICAgICAgcmV0dXJuIHAuZnA7Ci0gICAgfQotfTsKLQotdGVtcGxhdGU8dHlwZW5hbWUgRT4KLXN0cnVjdCBnZXR0ZXI8RSwgdHJ1ZT4gewotICAgICB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFPjo6dHlwZSBnZXQoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCBFKikgewotICAgICAgICAgdXNpbmcgdT10eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFPjo6dHlwZTsKLSAgICAgICAgIHJldHVybiBnZXR0ZXI8dT4oKS5nZXQocCwgKHUqKTApOwotICAgICB9Ci19OwotCi10ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIEU9c3RkOjppc19lbnVtPFQ+Ojp2YWx1ZT4KLXN0cnVjdCBsYXhfdW5kZXJseWluZ190eXBlIHsKLSAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPFQ+Ojp0eXBlIHR5cGU7Ci19OwotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3RydWN0IGxheF91bmRlcmx5aW5nX3R5cGU8VCwgZmFsc2U+IHsKLSAgICB0eXBlZGVmIFQgdHlwZTsKLX07Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEU+Ci10eXBlbmFtZSBsYXhfdW5kZXJseWluZ190eXBlPEU+Ojp0eXBlIGdldCgKLSAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCBFKikgewotICAgIHJldHVybiBnZXR0ZXI8RT4oKS5nZXQocCwgKEUqKTApOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotdm9pZCBkdW1wRlNWKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnN2LCBUKnQpIHsKLSAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwotICAgIGNvdXQgPDwgKHN0ZDo6aXNfZW51bTxUPjo6dmFsdWUgPyAoc3RkOjppc19zaWduZWQ8dHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8VD46OnR5cGU+Ojp2YWx1ZSA/ICJpIiA6ICJ1IikKLSAgICAgICAgICAgICA6IHN0ZDo6aXNfaW50ZWdyYWw8VD46OnZhbHVlID8gc3RkOjppc19zaWduZWQ8VD46OnZhbHVlID8gImkiIDogInUiIDogImYiKQotICAgICAgICA8PCAoOCAqIHNpemVvZihUKSk7Ci0gICAgaWYgKHN2LnR5cGUgPT0gc3YuUkFOR0UpIHsKLSAgICAgICAgY291dCA8PCAiLnJhbmdlKCIgPDwgZ2V0KHN2LnJhbmdlLm1pbiwgdCk7Ci0gICAgICAgIGlmIChnZXQoc3YucmFuZ2Uuc3RlcCwgdCkgIT0gc3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUpIHsKLSAgICAgICAgICAgIGNvdXQgPDwgIjoiIDw8IGdldChzdi5yYW5nZS5zdGVwLCB0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZ2V0KHN2LnJhbmdlLm5vbSwgdCkgIT0gMSB8fCBnZXQoc3YucmFuZ2UuZGVub20sIHQpICE9IDEpIHsKLSAgICAgICAgICAgIGNvdXQgPDwgIjoiIDw8IGdldChzdi5yYW5nZS5ub20sIHQpIDw8ICIvIiA8PCBnZXQoc3YucmFuZ2UuZGVub20sIHQpOwotICAgICAgICB9Ci0gICAgICAgIGNvdXQgPDwgZ2V0KHN2LnJhbmdlLm1heCwgdCkgPDwgIikiOwotICAgIH0KLSAgICBpZiAoc3YudmFsdWVzLnNpemUoKSkgewotICAgICAgICBjb3V0IDw8IChzdi50eXBlID09IHN2LkZMQUdTID8gIi5mbGFncygiIDogIi5saXN0KCIpOwotICAgICAgICBjb25zdCBjaGFyICpzZXAgPSAiIjsKLSAgICAgICAgZm9yIChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpQcmltaXRpdmUgJnAgOiBzdi52YWx1ZXMpIHsKLSAgICAgICAgICAgIGNvdXQgPDwgc2VwIDw8IGdldChwLCB0KTsKLSAgICAgICAgICAgIHNlcCA9ICIsIjsKLSAgICAgICAgfQotICAgICAgICBjb3V0IDw8ICIpIjsKLSAgICB9Ci0gICAgY291dCA8PCBlbmRsOwotfQotCi12b2lkIGR1bXBUeXBlKEMyUGFyYW06OlR5cGUgdHlwZSkgewotICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0gICAgY291dCA8PCAodHlwZS5pc1ZlbmRvcigpID8gIlZlbmRvciIgOiAiQzIiKTsKLSAgICBpZiAodHlwZS5mb3JJbnB1dCgpKSB7Ci0gICAgICAgIGNvdXQgPDwgIklucHV0IjsKLSAgICB9IGVsc2UgaWYgKHR5cGUuZm9yT3V0cHV0KCkpIHsKLSAgICAgICAgY291dCA8PCAiT3V0cHV0IjsKLSAgICB9IGVsc2UgaWYgKHR5cGUuZm9yUG9ydCgpICYmICF0eXBlLmZvclN0cmVhbSgpKSB7Ci0gICAgICAgIGNvdXQgPDwgIlBvcnQiOwotICAgIH0KLSAgICBpZiAodHlwZS5mb3JTdHJlYW0oKSkgewotICAgICAgICBjb3V0IDw8ICJTdHJlYW0iOwotICAgIH0KLQotICAgIGlmICh0eXBlLmlzRmxleGlibGUoKSkgewotICAgICAgICBjb3V0IDw8ICJGbGV4IjsKLSAgICB9Ci0KLSAgICBjb3V0IDw8IHR5cGUucGFyYW1JbmRleCgpOwotCi0gICAgc3dpdGNoICh0eXBlLmtpbmQoKSkgewotICAgIGNhc2UgQzJQYXJhbTo6SU5GTzogY291dCA8PCAiSW5mbyI7IGJyZWFrOwotICAgIGNhc2UgQzJQYXJhbTo6U0VUVElORzogY291dCA8PCAiU2V0dGluZyI7IGJyZWFrOwotICAgIGNhc2UgQzJQYXJhbTo6VFVOSU5HOiBjb3V0IDw8ICJUdW5pbmciOyBicmVhazsKLSAgICBjYXNlIEMyUGFyYW06OlNUUlVDVDogY291dCA8PCAiU3RydWN0IjsgYnJlYWs7Ci0gICAgZGVmYXVsdDogY291dCA8PCAiS2luZCIgPDwgKGludDMyX3QpdHlwZS5raW5kKCk7IGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBkdW1wVHlwZShDMlBhcmFtOjpCYXNlSW5kZXggdHlwZSkgewotICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0gICAgY291dCA8PCAodHlwZS5pc1ZlbmRvcigpID8gIlZlbmRvciIgOiAiQzIiKTsKLSAgICBpZiAodHlwZS5pc0ZsZXhpYmxlKCkpIHsKLSAgICAgICAgY291dCA8PCAiRmxleCI7Ci0gICAgfQotCi0gICAgY291dCA8PCB0eXBlLnBhcmFtSW5kZXgoKSA8PCAiU3RydWN0IjsKLX0KLQotdm9pZCBkdW1wVHlwZShGRDo6VHlwZSB0eXBlKSB7Ci0gICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIEZEOjpCTE9COiBjb3V0IDw8ICJibG9iICI7IGJyZWFrOwotICAgIGNhc2UgRkQ6OkZMT0FUOiBjb3V0IDw8ICJmbG9hdCAiOyBicmVhazsKLSAgICBjYXNlIEZEOjpJTlQzMjogY291dCA8PCAiaW50MzJfdCAiOyBicmVhazsKLSAgICBjYXNlIEZEOjpJTlQ2NDogY291dCA8PCAiaW50NjRfdCAiOyBicmVhazsKLSAgICBjYXNlIEZEOjpVSU5UMzI6IGNvdXQgPDwgInVpbnQzMl90ICI7IGJyZWFrOwotICAgIGNhc2UgRkQ6OlVJTlQ2NDogY291dCA8PCAidWludDY0X3QgIjsgYnJlYWs7Ci0gICAgY2FzZSBGRDo6U1RSSU5HOiBjb3V0IDw8ICJjaGFyICI7IGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGNvdXQgPDwgInN0cnVjdCAiOwotICAgICAgICBkdW1wVHlwZSgoQzJQYXJhbTo6VHlwZSl0eXBlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi12b2lkIGR1bXBTdHJ1Y3QoY29uc3QgQzJTdHJ1Y3REZXNjcmlwdG9yICZzZCkgewotICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0gICAgY291dCA8PCAic3RydWN0ICI7Ci0gICAgZHVtcFR5cGUoc2QuYmFzZUluZGV4KCkpOwotICAgIGNvdXQgPDwgIiB7IiA8PCBlbmRsOwotICAgIC8vQzJGaWVsZERlc2NyaXB0b3IgJmY7Ci0gICAgZm9yIChjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZiA6IHNkKSB7Ci0gICAgICAgIFByaW50VG8oZiwgJmNvdXQpOwotICAgICAgICBjb3V0IDw8IGVuZGw7Ci0KLSAgICAgICAgaWYgKGYubmFtZWRWYWx1ZXMoKS5zaXplKCkpIHsKLSAgICAgICAgICAgIGNvdXQgPDwgIi5uYW1lZCgiOwotICAgICAgICAgICAgY29uc3QgY2hhciAqc2VwID0gIiI7Ci0gICAgICAgICAgICBmb3IgKGNvbnN0IEZEOjpuYW1lZF92YWx1ZV90eXBlICZwIDogZi5uYW1lZFZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgY291dCA8PCBzZXAgPDwgcC5maXJzdCA8PCAiPSI7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChmLnR5cGUoKSkgewotICAgICAgICAgICAgICAgIGNhc2UgQzJWYWx1ZTo6SU5UMzI6IGNvdXQgPDwgZ2V0KHAuc2Vjb25kLCAoaW50MzJfdCAqKTApOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OklOVDY0OiBjb3V0IDw8IGdldChwLnNlY29uZCwgKGludDY0X3QgKikwKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBDMlZhbHVlOjpVSU5UMzI6IGNvdXQgPDwgZ2V0KHAuc2Vjb25kLCAodWludDMyX3QgKikwKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBDMlZhbHVlOjpVSU5UNjQ6IGNvdXQgPDwgZ2V0KHAuc2Vjb25kLCAodWludDY0X3QgKikwKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBDMlZhbHVlOjpGTE9BVDogY291dCA8PCBnZXQocC5zZWNvbmQsIChmbG9hdCAqKTApOyBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBjb3V0IDw8ICI/Pz8iOyBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VwID0gIiwiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY291dCA8PCAiKSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjb3V0IDw8ICJ9OyIgPDwgZW5kbDsKLX0KLQotdm9pZCBkdW1wRGVzYyhjb25zdCBDMlBhcmFtRGVzY3JpcHRvciAmcGQpIHsKLSAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwotICAgIGlmIChwZC5pc1JlcXVpcmVkKCkpIHsKLSAgICAgICAgY291dCA8PCAicmVxdWlyZWQgIjsKLSAgICB9Ci0gICAgaWYgKHBkLmlzUGVyc2lzdGVudCgpKSB7Ci0gICAgICAgIGNvdXQgPDwgInBlcnNpc3RlbnQgIjsKLSAgICB9Ci0gICAgY291dCA8PCAic3RydWN0ICI7Ci0gICAgZHVtcFR5cGUocGQudHlwZSgpKTsKLSAgICBjb3V0IDw8ICIgIiA8PCBwZC5uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci19Ci0KLVRFU1RfRihDMlBhcmFtVGVzdCwgUmVmbGVjdG9yVGVzdCkgewotICAgIEMyQ29tcG9uZW50RG9tYWluSW5mbyBkb21haW5JbmZvOwotICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gY29tcChuZXcgTXlDb21wb25lbnRJbnN0YW5jZSk7Ci0gICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gdmFsdWVzOwotCi0gICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzY3sKLSAgICAgICAgY29tcC0+Z2V0UGFyYW1SZWZsZWN0b3IoKS0+ZGVzY3JpYmUoQzJDb21wb25lbnREb21haW5JbmZvOjppbmRleEZsYWdzKX07Ci0gICAgZHVtcFN0cnVjdCgqZGVzYyk7Ci0KLSAgICBFWFBFQ1RfRVEoCi0gICAgICAgIEMyX09LLAotICAgICAgICBjb21wLT5nZXRTdXBwb3J0ZWRWYWx1ZXMoCi0gICAgICAgICAgICB7IEMyUGFyYW1GaWVsZCgmZG9tYWluSW5mbywgJkMyQ29tcG9uZW50RG9tYWluSW5mbzo6bVZhbHVlKSB9LAotICAgICAgICAgICAgJnZhbHVlcykKLSAgICApOwotCi0gICAgZm9yIChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZzdiA6IHZhbHVlcykgewotICAgICAgICBkdW1wRlNWKHN2LCAmZG9tYWluSW5mby5tVmFsdWUpOwotICAgIH0KLX0KLQotQzJFTlVNKEVudW0xLCB1aW50MzJfdCwKLSAgICBFbnVtMVZhbHVlMSwKLSAgICBFbnVtMVZhbHVlMiwKLSAgICBFbnVtMVZhbHVlNCA9IEVudW0xVmFsdWUyICsgMiwKLSk7Ci0KLUMyRU5VTV9DVVNUT01fUFJFRklYKEVudW0yLCB1aW50MzJfdCwgIkVudW0iLAotICAgIEVudW0yVmFsdWUxLAotICAgIEVudW0yVmFsdWUyLAotICAgIEVudW0yVmFsdWU0ID0gRW51bTFWYWx1ZTIgKyAyLAotKTsKLQotQzJFTlVNX0NVU1RPTV9OQU1FUyhFbnVtMywgdWludDhfdCwKLSAgICAoeyB7ICJ2YWx1ZTEiLCBFbnVtM1ZhbHVlMSB9LAotICAgICAgIHsgInZhbHVlMiIsIEVudW0zVmFsdWUyIH0sCi0gICAgICAgeyAidmFsdWU0IiwgRW51bTNWYWx1ZTQgfSwKLSAgICAgICB7ICJpbnZhbGlkIiwgSW52YWxpZCB9IH0pLAotICAgIEVudW0zVmFsdWUxLAotICAgIEVudW0zVmFsdWUyLAotICAgIEVudW0zVmFsdWU0ID0gRW51bTNWYWx1ZTIgKyAyLAotICAgIEludmFsaWQsCi0pOwotCi1URVNUX0YoQzJQYXJhbVRlc3QsIEVudW1VdGlsc1Rlc3QpIHsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8QzJTdHJpbmcsIEVudW0zPj4gcGFpcnMgKCB7IHsgInZhbHVlMSIsIEVudW0zVmFsdWUxIH0sCi0gICAgICB7ICJ2YWx1ZTIiLCBFbnVtM1ZhbHVlMiB9LAotICAgICAgeyAidmFsdWU0IiwgRW51bTNWYWx1ZTQgfSwKLSAgICAgIHsgImludmFsaWQiLCBJbnZhbGlkIH0gfSk7Ci0gICAgRW51bTMgZTM7Ci0gICAgRkQ6Om5hbWVkVmFsdWVzRm9yKGUzKTsKLX0KLQotVEVTVF9GKEMyUGFyYW1UZXN0LCBQYXJhbVV0aWxzVGVzdCkgewotICAgIC8vIHVwcGVyIGNhc2UKLSAgICBFWFBFQ1RfRVEoInllcyIsIEMyUGFyYW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIllFUyIpKTsKLSAgICBFWFBFQ1RfRVEoIm5vIiwgQzJQYXJhbVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTk8iKSk7Ci0gICAgRVhQRUNUX0VRKCJ5ZXMtbm8iLCBDMlBhcmFtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJZRVNfTk8iKSk7Ci0gICAgRVhQRUNUX0VRKCJ5ZXMtbm8iLCBDMlBhcmFtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJZRVNfX05PIikpOwotICAgIEVYUEVDVF9FUSgiYTJkcCIsIEMyUGFyYW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIkEyRFAiKSk7Ci0gICAgRVhQRUNUX0VRKCJtcDItdHMiLCBDMlBhcmFtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJNUDJfVFMiKSk7Ci0gICAgRVhQRUNUX0VRKCJibG9jay0yZCIsIEMyUGFyYW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIkJMT0NLXzJEIikpOwotICAgIEVYUEVDVF9FUSgibXBlZy0yLXRzIiwgQzJQYXJhbVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTVBFR18yX1RTIikpOwotICAgIEVYUEVDVF9FUSgiX2hpZGRlbi12YWx1ZSIsIEMyUGFyYW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIl9ISURERU5fVkFMVUUiKSk7Ci0gICAgRVhQRUNUX0VRKCJfX2hpZGRlbi12YWx1ZTIiLCBDMlBhcmFtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfX0hJRERFTl9WQUxVRTIiKSk7Ci0gICAgRVhQRUNUX0VRKCJfX2hpZGRlbi12YWx1ZS0yIiwgQzJQYXJhbVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiX19ISURERU5fVkFMVUVfMiIpKTsKLQotICAgIC8vIGNhbWVsIGNhc2UKLSAgICBFWFBFQ1RfRVEoInllcyIsIEMyUGFyYW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIlllcyIpKTsKLSAgICBFWFBFQ1RfRVEoIm5vIiwgQzJQYXJhbVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTm8iKSk7Ci0gICAgRVhQRUNUX0VRKCJ5ZXMtbm8iLCBDMlBhcmFtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJZZXNObyIpKTsKLSAgICBFWFBFQ1RfRVEoInllcy1ubyIsIEMyUGFyYW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIlllc19ObyIpKTsKLSAgICBFWFBFQ1RfRVEoIm1wMi10cyIsIEMyUGFyYW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIk1QMlRzIikpOwotICAgIEVYUEVDVF9FUSgiYmxvY2stMmQiLCBDMlBhcmFtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJCbG9jazJEIikpOwotICAgIEVYUEVDVF9FUSgibXBlZy0yLXRzIiwgQzJQYXJhbVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTXBlZzJ0cyIpKTsKLSAgICBFWFBFQ1RfRVEoIl9oaWRkZW4tdmFsdWUiLCBDMlBhcmFtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfSGlkZGVuVmFsdWUiKSk7Ci0gICAgRVhQRUNUX0VRKCJfX2hpZGRlbi12YWx1ZS0yIiwgQzJQYXJhbVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiX19IaWRkZW5WYWx1ZTIiKSk7Ci0KLSAgICAvLyBtaXhlZCBjYXNlCi0gICAgRVhQRUNUX0VRKCJtcDJ0LXMiLCBDMlBhcmFtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJNUDJUX3MiKSk7Ci0gICAgRVhQRUNUX0VRKCJibG9jay0yZCIsIEMyUGFyYW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIkJsb2NrXzJEIikpOwotICAgIEVYUEVDVF9FUSgiYmxvY2stMi1kIiwgQzJQYXJhbVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiQmxvY2syX0QiKSk7Ci0gICAgRVhQRUNUX0VRKCJtcGVnLTItdHMiLCBDMlBhcmFtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJNcGVnXzJ0cyIpKTsKLSAgICBFWFBFQ1RfRVEoIm1wZWctMi10cyIsIEMyUGFyYW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIk1wZWdfMl9UUyIpKTsKLSAgICBFWFBFQ1RfRVEoIl9oaWRkZW4tdmFsdWUiLCBDMlBhcmFtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfSGlkZGVuX19WQUxVRSIpKTsKLSAgICBFWFBFQ1RfRVEoIl9faGlkZGVuLXZhbHVlLTIiLCBDMlBhcmFtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfX0hpZGRlblZhbHVlXzIiKSk7Ci0gICAgRVhQRUNUX0VRKCJfMiIsIEMyUGFyYW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIl8yIikpOwotICAgIEVYUEVDVF9FUSgiX18yMyIsIEMyUGFyYW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIl9fMjMiKSk7Ci19Ci0KLVRFU1RfRihDMlBhcmFtVGVzdCwgQzJWYWx1ZVRlc3QpIHsKLSAgICBDMlZhbHVlIHZhbDsKLSAgICBpbnQzMl90IGkzMiA9IC0zMjsKLSAgICBpbnQ2NF90IGk2NCA9IC02NDsKLSAgICB1aW50MzJfdCB1MzIgPSAzMjsKLSAgICB1aW50NjRfdCB1NjQgPSA2NDsKLSAgICBmbG9hdCBmcCA9IDEuNWY7Ci0KLSAgICBFWFBFQ1RfRVEoQzJWYWx1ZTo6Tk9fSU5JVCwgdmFsLnR5cGUoKSk7Ci0gICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpMzIpKTsKLSAgICBFWFBFQ1RfRVEoLTMyLCBpMzIpOwotICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTY0KSk7Ci0gICAgRVhQRUNUX0VRKC02NCwgaTY0KTsKLSAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnUzMikpOwotICAgIEVYUEVDVF9FUSgzMnUsIHUzMik7Ci0gICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1NjQpKTsKLSAgICBFWFBFQ1RfRVEoNjR1LCB1NjQpOwotICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmZnApKTsKLSAgICBFWFBFQ1RfRVEoMS41ZiwgZnApOwotCi0gICAgdmFsID0gaW50MzJfdCgtMzIxNik7Ci0gICAgRVhQRUNUX0VRKEMyVmFsdWU6OklOVDMyLCB2YWwudHlwZSgpKTsKLSAgICBFWFBFQ1RfRVEodHJ1ZSwgdmFsLmdldCgmaTMyKSk7Ci0gICAgRVhQRUNUX0VRKC0zMjE2LCBpMzIpOwotICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTY0KSk7Ci0gICAgRVhQRUNUX0VRKC02NCwgaTY0KTsKLSAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnUzMikpOwotICAgIEVYUEVDVF9FUSgzMnUsIHUzMik7Ci0gICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1NjQpKTsKLSAgICBFWFBFQ1RfRVEoNjR1LCB1NjQpOwotICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmZnApKTsKLSAgICBFWFBFQ1RfRVEoMS41ZiwgZnApOwotCi0gICAgdmFsID0gdWludDMyX3QoMzIxNik7Ci0gICAgRVhQRUNUX0VRKEMyVmFsdWU6OlVJTlQzMiwgdmFsLnR5cGUoKSk7Ci0gICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpMzIpKTsKLSAgICBFWFBFQ1RfRVEoLTMyMTYsIGkzMik7Ci0gICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpNjQpKTsKLSAgICBFWFBFQ1RfRVEoLTY0LCBpNjQpOwotICAgIEVYUEVDVF9FUSh0cnVlLCB2YWwuZ2V0KCZ1MzIpKTsKLSAgICBFWFBFQ1RfRVEoMzIxNnUsIHUzMik7Ci0gICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1NjQpKTsKLSAgICBFWFBFQ1RfRVEoNjR1LCB1NjQpOwotICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmZnApKTsKLSAgICBFWFBFQ1RfRVEoMS41ZiwgZnApOwotCi0gICAgdmFsID0gaW50NjRfdCgtNjQzMik7Ci0gICAgRVhQRUNUX0VRKEMyVmFsdWU6OklOVDY0LCB2YWwudHlwZSgpKTsKLSAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmkzMikpOwotICAgIEVYUEVDVF9FUSgtMzIxNiwgaTMyKTsKLSAgICBFWFBFQ1RfRVEodHJ1ZSwgdmFsLmdldCgmaTY0KSk7Ci0gICAgRVhQRUNUX0VRKC02NDMyLCBpNjQpOwotICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTMyKSk7Ci0gICAgRVhQRUNUX0VRKDMyMTZ1LCB1MzIpOwotICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTY0KSk7Ci0gICAgRVhQRUNUX0VRKDY0dSwgdTY0KTsKLSAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmZwKSk7Ci0gICAgRVhQRUNUX0VRKDEuNWYsIGZwKTsKLQotICAgIHZhbCA9IHVpbnQ2NF90KDY0MzIpOwotICAgIEVYUEVDVF9FUShDMlZhbHVlOjpVSU5UNjQsIHZhbC50eXBlKCkpOwotICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTMyKSk7Ci0gICAgRVhQRUNUX0VRKC0zMjE2LCBpMzIpOwotICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTY0KSk7Ci0gICAgRVhQRUNUX0VRKC02NDMyLCBpNjQpOwotICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTMyKSk7Ci0gICAgRVhQRUNUX0VRKDMyMTZ1LCB1MzIpOwotICAgIEVYUEVDVF9FUSh0cnVlLCB2YWwuZ2V0KCZ1NjQpKTsKLSAgICBFWFBFQ1RfRVEoNjQzMnUsIHU2NCk7Ci0gICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZmcCkpOwotICAgIEVYUEVDVF9FUSgxLjVmLCBmcCk7Ci0KLSAgICB2YWwgPSAxNS4yNWY7Ci0gICAgRVhQRUNUX0VRKEMyVmFsdWU6OkZMT0FULCB2YWwudHlwZSgpKTsKLSAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmkzMikpOwotICAgIEVYUEVDVF9FUSgtMzIxNiwgaTMyKTsKLSAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmk2NCkpOwotICAgIEVYUEVDVF9FUSgtNjQzMiwgaTY0KTsKLSAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnUzMikpOwotICAgIEVYUEVDVF9FUSgzMjE2dSwgdTMyKTsKLSAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnU2NCkpOwotICAgIEVYUEVDVF9FUSg2NDMydSwgdTY0KTsKLSAgICBFWFBFQ1RfRVEodHJ1ZSwgdmFsLmdldCgmZnApKTsKLSAgICBFWFBFQ1RfRVEoMTUuMjVmLCBmcCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi90ZXN0cy9DMl90ZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi90ZXN0cy9DMl90ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJhM2Q5MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvdGVzdHMvQzJfdGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkMyX3Rlc3QiCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSA8QzIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU1RBVElDIFRFU1RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi10ZW1wbGF0ZTxpbnQgTj4KLXN0cnVjdCBjMl9jb25zdF9jaGVja2VyCi17Ci0gICAgaW5saW5lIGNvbnN0ZXhwciBzdGF0aWMgaW50IG51bSgpIHsgcmV0dXJuIE47IH0KLX07Ci0KLWNvbnN0ZXhwciBhdXRvIG1pbl9pMzJfaTMyID0gYzJfbWluKGludDMyX3QoMSksIGludDMyX3QoMikpOwotc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWluX2kzMl9pMzIpLCBjb25zdCBpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50MzJfdCIpOwotY29uc3RleHByIGF1dG8gbWluX2kzMl9pNjQgPSBjMl9taW4oaW50MzJfdCgzKSwgaW50NjRfdCgyKSk7Ci1zdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtaW5faTMyX2k2NCksIGNvbnN0IGludDY0X3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQ2NF90Iik7Ci1jb25zdGV4cHIgYXV0byBtaW5faThfaTMyID0gYzJfbWluKGludDhfdCgweGZmKSwgaW50MzJfdCgweGZmZmZmZmZmKSk7Ci1zdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtaW5faThfaTMyKSwgY29uc3QgaW50MzJfdD46OnZhbHVlLCAic2hvdWxkIGJlIGludDMyX3QiKTsKLQotc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1pbl9pMzJfaTMyPjo6bnVtKCkgPT0gMSwgInNob3VsZCBiZSAxIik7Ci1zdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWluX2kzMl9pNjQ+OjpudW0oKSA9PSAyLCAic2hvdWxkIGJlIDIiKTsKLXN0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtaW5faThfaTMyPjo6bnVtKCkgPT0gMHhmZmZmZmZmZiwgInNob3VsZCBiZSAweGZmZmZmZmZmIik7Ci0KLWNvbnN0ZXhwciBhdXRvIG1pbl91MzJfdTMyID0gYzJfbWluKHVpbnQzMl90KDEpLCB1aW50MzJfdCgyKSk7Ci1zdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtaW5fdTMyX3UzMiksIGNvbnN0IHVpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDMyX3QiKTsKLWNvbnN0ZXhwciBhdXRvIG1pbl91MzJfdTY0ID0gYzJfbWluKHVpbnQzMl90KDMpLCB1aW50NjRfdCgyKSk7Ci1zdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtaW5fdTMyX3U2NCksIGNvbnN0IHVpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDMyX3QiKTsKLWNvbnN0ZXhwciBhdXRvIG1pbl91MzJfdTggPSBjMl9taW4odWludDMyX3QoMHhmZmZmZmZmZiksIHVpbnQ4X3QoMHhmZikpOwotc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWluX3UzMl91OCksIGNvbnN0IHVpbnQ4X3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50OF90Iik7Ci0KLXN0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtaW5fdTMyX3UzMj46Om51bSgpID09IDEsICJzaG91bGQgYmUgMSIpOwotc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1pbl91MzJfdTY0Pjo6bnVtKCkgPT0gMiwgInNob3VsZCBiZSAyIik7Ci1zdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWluX3UzMl91OD46Om51bSgpID09IDB4ZmYsICJzaG91bGQgYmUgMHhmZiIpOwotCi1jb25zdGV4cHIgYXV0byBtYXhfaTMyX2kzMiA9IGMyX21heChpbnQzMl90KDEpLCBpbnQzMl90KDIpKTsKLXN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1heF9pMzJfaTMyKSwgY29uc3QgaW50MzJfdD46OnZhbHVlLCAic2hvdWxkIGJlIGludDMyX3QiKTsKLWNvbnN0ZXhwciBhdXRvIG1heF9pMzJfaTY0ID0gYzJfbWF4KGludDMyX3QoMyksIGludDY0X3QoMikpOwotc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWF4X2kzMl9pNjQpLCBjb25zdCBpbnQ2NF90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50NjRfdCIpOwotY29uc3RleHByIGF1dG8gbWF4X2k4X2kzMiA9IGMyX21heChpbnQ4X3QoMHhmZiksIGludDMyX3QoMHhmZmZmZmZmZikpOwotc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWF4X2k4X2kzMiksIGNvbnN0IGludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQzMl90Iik7Ci0KLXN0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtYXhfaTMyX2kzMj46Om51bSgpID09IDIsICJzaG91bGQgYmUgMiIpOwotc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1heF9pMzJfaTY0Pjo6bnVtKCkgPT0gMywgInNob3VsZCBiZSAzIik7Ci1zdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWF4X2k4X2kzMj46Om51bSgpID09IDB4ZmZmZmZmZmYsICJzaG91bGQgYmUgMHhmZmZmZmZmZiIpOwotCi1jb25zdGV4cHIgYXV0byBtYXhfdTMyX3UzMiA9IGMyX21heCh1aW50MzJfdCgxKSwgdWludDMyX3QoMikpOwotc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWF4X3UzMl91MzIpLCBjb25zdCB1aW50MzJfdD46OnZhbHVlLCAic2hvdWxkIGJlIHVpbnQzMl90Iik7Ci1jb25zdGV4cHIgYXV0byBtYXhfdTMyX3U2NCA9IGMyX21heCh1aW50MzJfdCgzKSwgdWludDY0X3QoMikpOwotc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWF4X3UzMl91NjQpLCBjb25zdCB1aW50NjRfdD46OnZhbHVlLCAic2hvdWxkIGJlIHVpbnQ2NF90Iik7Ci1jb25zdGV4cHIgYXV0byBtYXhfdTMyX3U4ID0gYzJfbWF4KHVpbnQzMl90KDB4N2ZmZmZmZmYpLCB1aW50OF90KDB4ZmYpKTsKLXN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1heF91MzJfdTgpLCBjb25zdCB1aW50MzJfdD46OnZhbHVlLCAic2hvdWxkIGJlIHVpbnQzMl90Iik7Ci0KLXN0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtYXhfdTMyX3UzMj46Om51bSgpID09IDIsICJzaG91bGQgYmUgMiIpOwotc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1heF91MzJfdTY0Pjo6bnVtKCkgPT0gMywgInNob3VsZCBiZSAzIik7Ci1zdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWF4X3UzMl91OD46Om51bSgpID09IDB4N2ZmZmZmZmYsICJzaG91bGQgYmUgMHg3ZmZmZmZmZiIpOwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlYzIvdGVzdHMvdm5kay9DMlV0aWxUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi90ZXN0cy92bmRrL0MyVXRpbFRlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTEzNzRiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi90ZXN0cy92bmRrL0MyVXRpbFRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx1dGlsL19DMk1hY3JvVXRpbHMuaD4KLQotLyoqIFxmaWxlCi0gKiBUZXN0cyBmb3Igdm5kay91dGlsLgotICovCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBfQzJNYWNyb1V0aWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWNfYXNzZXJ0KDAgPT0gX0MyX0FSR0MoKSwgInNob3VsZCBiZSAwIik7Ci1zdGF0aWNfYXNzZXJ0KDEgPT0gX0MyX0FSR0MoMSksICJzaG91bGQgYmUgMSIpOwotc3RhdGljX2Fzc2VydCgyID09IF9DMl9BUkdDKDEsIDIpLCAic2hvdWxkIGJlIDIiKTsKLXN0YXRpY19hc3NlcnQoNjQgPT0gX0MyX0FSR0MoCi0gICAgICAgIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LAotICAgICAgICAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsCi0gICAgICAgIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDY0KSwgInNob3VsZCBiZSA2NCIpOwotCi1zdGF0aWNfYXNzZXJ0KDAgPT0gX0MyX0FSR0MoLCksICJzaG91bGQgYmUgMCIpOwotc3RhdGljX2Fzc2VydCgxID09IF9DMl9BUkdDKDEsKSwgInNob3VsZCBiZSAxIik7Ci1zdGF0aWNfYXNzZXJ0KDIgPT0gX0MyX0FSR0MoMSwgMiwpLCAic2hvdWxkIGJlIDIiKTsKLXN0YXRpY19hc3NlcnQoNjQgPT0gX0MyX0FSR0MoCi0gICAgICAgIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LAotICAgICAgICAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsCi0gICAgICAgIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDY0LCksICJzaG91bGQgYmUgNjQiKTsKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyUGFyYW1VdGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyUGFyYW1VdGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGFlMzAzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMlBhcmFtVXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBDMlVUSUxTX1BBUkFNX1VUSUxTX0hfCi0jZGVmaW5lIEMyVVRJTFNfUEFSQU1fVVRJTFNfSF8KLQotI2luY2x1ZGUgPEMyUGFyYW0uaD4KLSNpbmNsdWRlIDx1dGlsL19DMk1hY3JvVXRpbHMuaD4KLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0vKiogXGZpbGUKLSAqIFV0aWxpdGllcyBmb3IgcGFyYW1ldGVyIGhhbmRsaW5nIHRvIGJlIHVzZWQgYnkgQ29kZWMyIGltcGxlbWVudGF0aW9ucy4KLSAqLwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vLyBcY29uZCBJTlRFUk5BTAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVUSUxJVElFUyBGT1IgRU5VTUVSQVRJT04gUkVGTEVDVElPTiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0aGF0IGFsbG93cyBpZ25vcmluZyBlbnVtIHZhbHVlIGFzc2lnbm1lbnQgKGUuZy4gYm90aCAnKF9DMkVudW1Db25zdClrVmFsdWUgPSB4JwotICogYW5kICcoX0MyRW51bUNvbnN0KWtWYWx1ZScgd2lsbCBldmFsIHRvIGtWYWx1ZS4KLSAqLwotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLWNsYXNzIF9DMkVudW1Db25zdCB7Ci1wdWJsaWM6Ci0gICAgLy8gaW1wbGljaXQgY29udmVyc2lvbiBmcm9tIFQKLSAgICBpbmxpbmUgX0MyRW51bUNvbnN0KFQgdmFsdWUpIDogX21WYWx1ZSh2YWx1ZSkge30KLSAgICAvLyBpbXBsaWNpdCBjb252ZXJzaW9uIHRvIFQKLSAgICBpbmxpbmUgb3BlcmF0b3IgVCgpIHsgcmV0dXJuIF9tVmFsdWU7IH0KLSAgICAvLyBpbXBsaWNpdCBjb252ZXJzaW9uIHRvIEMyVmFsdWU6OlByaW1pdGl2ZQotICAgIGlubGluZSBvcGVyYXRvciBDMlZhbHVlOjpQcmltaXRpdmUoKSB7IHJldHVybiAoVClfbVZhbHVlOyB9Ci0gICAgLy8gaWdub3JlIGFzc2lnbm1lbnQgYW5kIHJldHVybiBUIGhlcmUgdG8gYXZvaWQgaW1wbGljaXQgY29udmVyc2lvbiB0byBUIGxhdGVyCi0gICAgaW5saW5lIFQgJm9wZXJhdG9yID0oVCB2YWx1ZSBfX3VudXNlZCkgeyByZXR1cm4gX21WYWx1ZTsgfQotcHJpdmF0ZToKLSAgICBUIF9tVmFsdWU7Ci19OwotCi0vLy8gbWFwcGVyIHRvIGdldCBuYW1lIG9mIGVudW0KLS8vLyBcbm90ZSB0aGlzIHdpbGwgY29udGFpbiBhbnkgaW5pdGlhbGl6YXRpb24sIHdoaWNoIHdlIHdpbGwgcmVtb3ZlIHdoZW4gY29udmVydGluZyB0byBsb3dlci1jYXNlCi0jZGVmaW5lIF9DMl9HRVRfRU5VTV9OQU1FKHgsIHkpICN4Ci0vLy8gbWFwcGVyIHRvIGdldCB2YWx1ZSBvZiBlbnVtCi0jZGVmaW5lIF9DMl9HRVRfRU5VTV9WQUxVRSh4LCB0eXBlKSAoX0MyRW51bUNvbnN0PHR5cGU+KXgKLQotLy8vIFxlbmRjb25kCi0KLSNkZWZpbmUgREVGSU5FX0MyX0VOVU1fVkFMVUVfQVVUT19IRUxQRVIobmFtZSwgdHlwZSwgcHJlZml4LCAuLi4pIFwKLXRlbXBsYXRlPD4gQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkX3ZhbHVlc190eXBlIEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0Zvcihjb25zdCBuYW1lICZyIF9fdW51c2VkKSB7IFwKLSAgICByZXR1cm4gQzJQYXJhbVV0aWxzOjpzYW5pdGl6ZUVudW1WYWx1ZXMoIFwKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyVmFsdWU6OlByaW1pdGl2ZT4geyBfQzJfTUFQKF9DMl9HRVRfRU5VTV9WQUxVRSwgdHlwZSwgX19WQV9BUkdTX18pIH0sIFwKLSAgICAgICAgICAgIHsgX0MyX01BUChfQzJfR0VUX0VOVU1fTkFNRSwgdHlwZSwgX19WQV9BUkdTX18pIH0sIFwKLSAgICAgICAgICAgIHByZWZpeCk7IFwKLX0KLQotI2RlZmluZSBERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSKG5hbWUsIHR5cGUsIG5hbWVzLCAuLi4pIFwKLXRlbXBsYXRlPD4gQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkX3ZhbHVlc190eXBlIEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0Zvcihjb25zdCBuYW1lICZyIF9fdW51c2VkKSB7IFwKLSAgICByZXR1cm4gQzJQYXJhbVV0aWxzOjpjdXN0b21FbnVtVmFsdWVzKCBcCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8QzJTdHJpbmdMaXRlcmFsLCBuYW1lPj4gbmFtZXMpOyBcCi19Ci0KLQotY2xhc3MgQzJQYXJhbVV0aWxzIHsKLXByaXZhdGU6Ci0gICAgc3RhdGljIHNpemVfdCBjb3VudExlYWRpbmdVbmRlcnNjb3JlcyhDMlN0cmluZ0xpdGVyYWwgYSkgewotICAgICAgICBzaXplX3QgaSA9IDA7Ci0gICAgICAgIHdoaWxlIChhW2ldID09ICdfJykgewotICAgICAgICAgICAgKytpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpOwotICAgIH0KLQotICAgIHN0YXRpYyBzaXplX3QgY291bnRNYXRjaGluZyhDMlN0cmluZ0xpdGVyYWwgYSwgY29uc3QgQzJTdHJpbmcgJmIpIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBiLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoIWFbaV0gfHwgYVtpXSAhPSBiW2ldKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGIuc2l6ZSgpOwotICAgIH0KLQotICAgIC8vIEFCQ0RlZiA9PiBhYmMtZGVmCi0gICAgLy8gQUJDRDJlZiA9PiBhYmNkMi1lZiAvLyAwCi0gICAgLy8gQUJDRDJFZiA9PiBhbmNkMi1lZiAvLyAtMQotICAgIC8vIEFiY0RlZiA9PiBhYmMtZGVmIC8vIC0xCi0gICAgLy8gQWJjMkRlZiA9PiBhYmMtMmRlZgotICAgIC8vIEFiYzJkZWYgPT4gYWJjLTItZGVmCi0gICAgLy8gX1lvID0+IF95bwotICAgIC8vIF95byA9PiBfeW8KLSAgICAvLyBDMl95byA9PiBjMi15bwotICAgIC8vIEMyX195byA9PiBjMi15bwotCi0gICAgc3RhdGljIEMyU3RyaW5nIGNhbWVsQ2FzZVRvRGFzaGVkKEMyU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgZW51bSB7Ci0gICAgICAgICAgICBrTm9uZSA9ICcuJywKLSAgICAgICAgICAgIGtMb3dlciA9ICdhJywKLSAgICAgICAgICAgIGtVcHBlciA9ICdBJywKLSAgICAgICAgICAgIGtEaWdpdCA9ICcxJywKLSAgICAgICAgICAgIGtEYXNoID0gJy0nLAotICAgICAgICAgICAga1VuZGVyc2NvcmUgPSAnXycsCi0gICAgICAgIH0gdHlwZSA9IGtOb25lOwotICAgICAgICBzaXplX3Qgd29yZF9zdGFydCA9IDA7Ci0gICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBuYW1lLnNpemUoKTsgKytpeCkgewotICAgICAgICAgICAgLyogc3RkOjpjb3V0IDw8IG5hbWUuc3Vic3RyKDAsIHdvcmRfc3RhcnQpIDw8ICJ8IgotICAgICAgICAgICAgICAgICAgICA8PCBuYW1lLnN1YnN0cih3b3JkX3N0YXJ0LCBpeCAtIHdvcmRfc3RhcnQpIDw8ICJbIgotICAgICAgICAgICAgICAgICAgICA8PCBuYW1lLnN1YnN0cihpeCwgMSkgPDwgIl0iIDw8IG5hbWUuc3Vic3RyKGl4ICsgMSkKLSAgICAgICAgICAgICAgICAgICAgPDwgIjogIiA8PCAoY2hhcil0eXBlIDw8IHN0ZDo6ZW5kbDsgKi8KLSAgICAgICAgICAgIGlmIChpc3VwcGVyKG5hbWVbaXhdKSkgewotICAgICAgICAgICAgICAgIGlmICh0eXBlID09IGtMb3dlcikgewotICAgICAgICAgICAgICAgICAgICBuYW1lLmluc2VydChpeCsrLCAxLCAnLScpOwotICAgICAgICAgICAgICAgICAgICB3b3JkX3N0YXJ0ID0gaXg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5hbWVbaXhdID0gdG9sb3dlcihuYW1lW2l4XSk7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IGtVcHBlcjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNsb3dlcihuYW1lW2l4XSkpIHsKLSAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBrRGlnaXQgJiYgaXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWUuaW5zZXJ0KGl4KyssIDEsICctJyk7Ci0gICAgICAgICAgICAgICAgICAgIHdvcmRfc3RhcnQgPSBpeDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0ga1VwcGVyICYmIGl4ID4gd29yZF9zdGFydCArIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZS5pbnNlcnQoaXgrKyAtIDEsIDEsICctJyk7Ci0gICAgICAgICAgICAgICAgICAgIHdvcmRfc3RhcnQgPSBpeCAtIDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHR5cGUgPSBrTG93ZXI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzZGlnaXQobmFtZVtpeF0pKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0ga0xvd2VyKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWUuaW5zZXJ0KGl4KyssIDEsICctJyk7Ci0gICAgICAgICAgICAgICAgICAgIHdvcmRfc3RhcnQgPSBpeDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHlwZSA9IGtEaWdpdDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZVtpeF0gPT0gJ18nKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0ga0Rhc2gpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZS5lcmFzZShpeC0tLCAxKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgIT0ga05vbmUgJiYgdHlwZSAhPSBrVW5kZXJzY29yZSkgewotICAgICAgICAgICAgICAgICAgICBuYW1lW2l4XSA9ICctJzsKLSAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGtEYXNoOwotICAgICAgICAgICAgICAgICAgICB3b3JkX3N0YXJ0ID0gaXggKyAxOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGUgPSBrVW5kZXJzY29yZTsKLSAgICAgICAgICAgICAgICAgICAgd29yZF9zdGFydCA9IGl4ICsgMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5hbWUucmVzaXplKGl4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgIj0+ICIgPDwgbmFtZSA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxDMlN0cmluZz4gc2FuaXRpemVFbnVtVmFsdWVOYW1lcygKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyU3RyaW5nTGl0ZXJhbD4gbmFtZXMsCi0gICAgICAgICAgICBDMlN0cmluZ0xpdGVyYWwgX3ByZWZpeCA9IE5VTEwpIHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IHNhbml0aXplZE5hbWVzOwotICAgICAgICBDMlN0cmluZyBwcmVmaXg7Ci0gICAgICAgIHNpemVfdCBleHRyYVVuZGVyc2NvcmVzID0gMDsKLSAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgICAgIGlmIChfcHJlZml4KSB7Ci0gICAgICAgICAgICBleHRyYVVuZGVyc2NvcmVzID0gY291bnRMZWFkaW5nVW5kZXJzY29yZXMoX3ByZWZpeCk7Ci0gICAgICAgICAgICBwcmVmaXggPSBfcHJlZml4ICsgZXh0cmFVbmRlcnNjb3JlczsKLSAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAvLyBzdGQ6OmNvdXQgPDwgInByZWZpeDoiIDw8IHByZWZpeCA8PCAiLCB1bmRlcnNjb3JlczoiIDw8IGV4dHJhVW5kZXJzY29yZXMgPDwgc3RkOjplbmRsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2FsY3VsYXRlIHByZWZpeCBhbmQgbWluaW11bSBsZWFkaW5nIHVuZGVyc2NvcmVzCi0gICAgICAgIGZvciAoQzJTdHJpbmdMaXRlcmFsIHMgOiBuYW1lcykgewotICAgICAgICAgICAgLy8gc3RkOjpjb3V0IDw8IHMgPDwgc3RkOjplbmRsOwotICAgICAgICAgICAgc2l6ZV90IHVuZGVyc2NvcmVzID0gY291bnRMZWFkaW5nVW5kZXJzY29yZXMocyk7Ci0gICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICBleHRyYVVuZGVyc2NvcmVzID0gdW5kZXJzY29yZXM7Ci0gICAgICAgICAgICAgICAgcHJlZml4ID0gcyArIHVuZGVyc2NvcmVzOwotICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNpemVfdCBtYXRjaGluZyA9IGNvdW50TWF0Y2hpbmcoCi0gICAgICAgICAgICAgICAgICAgIHMgKyB1bmRlcnNjb3JlcywKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4KTsKLSAgICAgICAgICAgICAgICBwcmVmaXgucmVzaXplKG1hdGNoaW5nKTsKLSAgICAgICAgICAgICAgICBleHRyYVVuZGVyc2NvcmVzID0gc3RkOjptaW4odW5kZXJzY29yZXMsIGV4dHJhVW5kZXJzY29yZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gc3RkOjpjb3V0IDw8ICJwcmVmaXg6IiA8PCBwcmVmaXggPDwgIiwgdW5kZXJzY29yZXM6IiA8PCBleHRyYVVuZGVyc2NvcmVzIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgICAgIGlmIChwcmVmaXguc2l6ZSgpID09IDAgJiYgZXh0cmFVbmRlcnNjb3JlcyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB3ZSBzd2FsbG93IHRoZSBmaXJzdCB1bmRlcnNjb3JlIGFmdGVyIHVwcGVyIGNhc2UgcHJlZml4ZXMKLSAgICAgICAgYm9vbCB1cHBlckNhc2VQcmVmaXggPSB0cnVlOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHByZWZpeC5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgaWYgKGlzbG93ZXIocHJlZml4W2ldKSkgewotICAgICAgICAgICAgICAgIHVwcGVyQ2FzZVByZWZpeCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChDMlN0cmluZ0xpdGVyYWwgcyA6IG5hbWVzKSB7Ci0gICAgICAgICAgICBzaXplX3QgdW5kZXJzY29yZXMgPSBjb3VudExlYWRpbmdVbmRlcnNjb3JlcyhzKTsKLSAgICAgICAgICAgIEMyU3RyaW5nIHNhbml0aXplZCA9IEMyU3RyaW5nKHMsIHVuZGVyc2NvcmVzIC0gZXh0cmFVbmRlcnNjb3Jlcyk7Ci0gICAgICAgICAgICBzYW5pdGl6ZWQuYXBwZW5kKHMgKyBwcmVmaXguc2l6ZSgpICsgdW5kZXJzY29yZXMgKwotICAgICAgICAgICAgICAgICAgICAgICAgKHVwcGVyQ2FzZVByZWZpeCAmJiBzW3ByZWZpeC5zaXplKCkgKyB1bmRlcnNjb3Jlc10gPT0gJ18nKSk7Ci0gICAgICAgICAgICBzYW5pdGl6ZWROYW1lcy5wdXNoX2JhY2soY2FtZWxDYXNlVG9EYXNoZWQoc2FuaXRpemVkKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKEMyU3RyaW5nIHMgOiBzYW5pdGl6ZWROYW1lcykgewotICAgICAgICAgICAgc3RkOjpjb3V0IDw8IHMgPDwgc3RkOjplbmRsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNhbml0aXplZE5hbWVzOwotICAgIH0KLQotICAgIGZyaWVuZCBjbGFzcyBDMlBhcmFtVGVzdF9QYXJhbVV0aWxzVGVzdF9UZXN0OwotCi1wdWJsaWM6Ci0gICAgc3RhdGljIHN0ZDo6dmVjdG9yPEMyU3RyaW5nPiBnZXRFbnVtVmFsdWVzRnJvbVN0cmluZyhDMlN0cmluZ0xpdGVyYWwgdmFsdWUpIHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IGZvdW5kTmFtZXM7Ci0gICAgICAgIHNpemVfdCBwb3MgPSAwLCBsZW4gPSBzdHJsZW4odmFsdWUpOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBzaXplX3QgZW5kUG9zID0gc3RyY3Nwbih2YWx1ZSArIHBvcywgIiAsPSIpICsgcG9zOwotICAgICAgICAgICAgaWYgKGVuZFBvcyA+IHBvcykgewotICAgICAgICAgICAgICAgIGZvdW5kTmFtZXMuZW1wbGFjZV9iYWNrKHZhbHVlICsgcG9zLCBlbmRQb3MgLSBwb3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHZhbHVlW2VuZFBvc10gJiYgdmFsdWVbZW5kUG9zXSAhPSAnLCcpIHsKLSAgICAgICAgICAgICAgICBlbmRQb3MgKz0gc3RyY3Nwbih2YWx1ZSArIGVuZFBvcywgIiwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBvcyA9IHN0cnNwbih2YWx1ZSArIGVuZFBvcywgIiAsIikgKyBlbmRQb3M7Ci0gICAgICAgIH0gd2hpbGUgKHBvcyA8IGxlbik7Ci0gICAgICAgIHJldHVybiBmb3VuZE5hbWVzOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgc3RhdGljIEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZF92YWx1ZXNfdHlwZSBzYW5pdGl6ZUVudW1WYWx1ZXMoCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxUPiB2YWx1ZXMsCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cmluZ0xpdGVyYWw+IG5hbWVzLAotICAgICAgICAgICAgQzJTdHJpbmdMaXRlcmFsIHByZWZpeCA9IE5VTEwpIHsKLSAgICAgICAgQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkX3ZhbHVlc190eXBlIG5hbWVkVmFsdWVzOwotICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cmluZz4gc2FuaXRpemVkTmFtZXMgPSBzYW5pdGl6ZUVudW1WYWx1ZU5hbWVzKG5hbWVzLCBwcmVmaXgpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZhbHVlcy5zaXplKCkgJiYgaSA8IHNhbml0aXplZE5hbWVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBuYW1lZFZhbHVlcy5lbXBsYWNlX2JhY2soc2FuaXRpemVkTmFtZXNbaV0sIHZhbHVlc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5hbWVkVmFsdWVzOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIEU+Ci0gICAgc3RhdGljIEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZF92YWx1ZXNfdHlwZSBjdXN0b21FbnVtVmFsdWVzKAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEMyU3RyaW5nTGl0ZXJhbCwgRT4+IGl0ZW1zKSB7Ci0gICAgICAgIEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZF92YWx1ZXNfdHlwZSBuYW1lZFZhbHVlczsKLSAgICAgICAgZm9yIChhdXRvICZpdGVtIDogaXRlbXMpIHsKLSAgICAgICAgICAgIG5hbWVkVmFsdWVzLmVtcGxhY2VfYmFjayhpdGVtLmZpcnN0LCBpdGVtLnNlY29uZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5hbWVkVmFsdWVzOwotICAgIH0KLX07Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVRJTElUSUVTIEZPUiBQQVJBTUVURVIgUkVGTEVDVElPTiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PSBVVElMSVRZIFRFTVBMQVRFUyBGT1IgUEFSQU1FVEVSIFJFRkxFQ1RJT04gPT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLSNpZiAxCi10ZW1wbGF0ZTx0eXBlbmFtZS4uLiBQYXJhbXM+Ci1jbGFzcyBDMl9ISURFIF9DMlR1cGxlIHsgfTsKLQotQzJfSElERQotdm9pZCBhZGRDMlBhcmFtcyhzdGQ6Omxpc3Q8Y29uc3QgQzJGaWVsZERlc2NyaXB0b3I+ICYsIF9DMlR1cGxlPD4gKikgewotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBQYXJhbXM+Ci1DMl9ISURFCi12b2lkIGFkZEMyUGFyYW1zKHN0ZDo6bGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gJmZpZWxkcywgX0MyVHVwbGU8VCwgUGFyYW1zLi4uPiAqKQotewotICAgIC8vQzJQYXJhbTo6aW5kZXhfdCBpbmRleCA9IFQ6OmJhc2VJbmRleDsKLSAgICAvLyh2b2lkKWluZGV4OwotICAgIGZpZWxkcy5pbnNlcnQoZmllbGRzLmVuZCgpLCBUOjpmaWVsZExpc3QpOwotICAgIGFkZEMyUGFyYW1zKGZpZWxkcywgKF9DMlR1cGxlPFBhcmFtcy4uLj4gKiludWxscHRyKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUuLi4gUGFyYW1zPgotQzJfSElERQotc3RkOjpsaXN0PGNvbnN0IEMyRmllbGREZXNjcmlwdG9yPiBkZXNjcmliZUMyUGFyYW1zKCkgewotICAgIHN0ZDo6bGlzdDxjb25zdCBDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzOwotICAgIGFkZEMyUGFyYW1zKGZpZWxkcywgKF9DMlR1cGxlPFBhcmFtcy4uLj4gKiludWxscHRyKTsKLSAgICByZXR1cm4gZmllbGRzOwotfQotCi0jZW5kaWYKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVVElMSVRJRVMgRk9SIEVOVU1FUkFUSU9OIFJFRkxFQ1RJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEMyVVRJTFNfUEFSQU1fVVRJTFNfSF8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL19DMk1hY3JvVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9fQzJNYWNyb1V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZTliYTUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL19DMk1hY3JvVXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBDMlVUSUxTX01BQ1JPX1VUSUxTX0hfCi0jZGVmaW5lIEMyVVRJTFNfTUFDUk9fVVRJTFNfSF8KLQotLyoqIFxmaWxlCi0gKiBNYWNybyB1dGlsaXRpZXMgZm9yIHRoZSB1dGlscyBsaWJyYXJ5IHVzZWQgYnkgQ29kZWMyIGltcGxlbWVudGF0aW9ucy4KLSAqLwotCi0vLy8gXGlmIDAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZBUklBQkxFIEFSR1VNRU5UIENPVU5USU5HIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vLyByZW1vdmUgZW1wdHkgYXJndW1lbnRzIC0gX0MyX0FSRygpIGV4cGFuZHMgdG8gJycsIHdoaWxlIF9DMl9BUkcoeCkgZXhwYW5kcyB0byAnLCB4JwotLy8gX0MyX0FSR24oLi4uKSBkb2VzIHRoZSBzYW1lIGZvciBuIGFyZ3VtZW50cwotI2RlZmluZSBfQzJfQVJHKC4uLikgLCAjI19fVkFfQVJHU19fCi0jZGVmaW5lIF9DMl9BUkcyKF8xLCBfMikgX0MyX0FSRyhfMSkgX0MyX0FSRyhfMikKLSNkZWZpbmUgX0MyX0FSRzQoXzEsIF8yLCBfMywgXzQpIF9DMl9BUkcyKF8xLCBfMikgX0MyX0FSRzIoXzMsIF80KQotI2RlZmluZSBfQzJfQVJHOChfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNywgXzgpIF9DMl9BUkc0KF8xLCBfMiwgXzMsIF80KSBfQzJfQVJHNChfNSwgXzYsIF83LCBfOCkKLSNkZWZpbmUgX0MyX0FSRzE2KF8xLCBfMiwgXzMsIF80LCBfNSwgXzYsIF83LCBfOCwgXzksIF8xMCwgXzExLCBfMTIsIF8xMywgXzE0LCBfMTUsIF8xNikgXAotICAgICAgICBfQzJfQVJHOChfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNywgXzgpIF9DMl9BUkc4KF85LCBfMTAsIF8xMSwgXzEyLCBfMTMsIF8xNCwgXzE1LCBfMTYpCi0KLS8vIHJldHVybiB0aGUgNjV0aCBhcmd1bWVudAotI2RlZmluZSBfQzJfQVJHQ18zKF8sIF8wLCBfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNywgXzgsIF85LCBfMTAsIF8xMSwgXzEyLCBfMTMsIF8xNCwgXzE1LCBfMTYsIFwKLSAgICAgICAgXzE3LCBfMTgsIF8xOSwgXzIwLCBfMjEsIF8yMiwgXzIzLCBfMjQsIF8yNSwgXzI2LCBfMjcsIF8yOCwgXzI5LCBfMzAsIF8zMSwgXzMyLCBcCi0gICAgICAgIF8zMywgXzM0LCBfMzUsIF8zNiwgXzM3LCBfMzgsIF8zOSwgXzQwLCBfNDEsIF80MiwgXzQzLCBfNDQsIF80NSwgXzQ2LCBfNDcsIF80OCwgXAotICAgICAgICBfNDksIF81MCwgXzUxLCBfNTIsIF81MywgXzU0LCBfNTUsIF81NiwgXzU3LCBfNTgsIF81OSwgXzYwLCBfNjEsIF82MiwgXzYzLCBfNjQsIC4uLikgXzY0Ci0KLS8vLyBcZW5kaWYKLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgotICovCi0vLyBXZSBkbyB0aGlzIGJ5IHByZXBlbmRpbmcgMSBhbmQgYXBwZW5kaW5nIDY1IGRlc2lnbmVkIHZhbHVlcyBzdWNoIHRoYXQgdGhlIDY1dGggZWxlbWVudAotLy8gd2lsbCBiZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KLSNkZWZpbmUgX0MyX0FSR0MoLi4uKSBfQzJfQVJHQ18xKDAsICMjX19WQV9BUkdTX18sIFwKLSAgICAgICAgNjQsIDYzLCA2MiwgNjEsIDYwLCA1OSwgNTgsIDU3LCA1NiwgNTUsIDU0LCA1MywgNTIsIDUxLCA1MCwgNDksIDQ4LCA0NywgNDYsIDQ1LCA0NCwgNDMsIFwKLSAgICAgICAgNDIsIDQxLCA0MCwgMzksIDM4LCAzNywgMzYsIDM1LCAzNCwgMzMsIDMyLCAzMSwgMzAsIDI5LCAyOCwgMjcsIDI2LCAyNSwgMjQsIDIzLCAyMiwgMjEsIFwKLSAgICAgICAgMjAsIDE5LCAxOCwgMTcsIDE2LCAxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyLCAxLCAwKQotCi0vLy8gXGlmIDAKLQotLy8gc3RlcCAxLiByZW1vdmUgZW1wdHkgYXJndW1lbnRzIC0gdGhpcyBpcyBuZWVkZWQgdG8gYWxsb3cgdHJhaWxpbmcgY29tbWEgaW4gZW51bSBkZWZpbml0aW9ucwotLy8gKE5PVEU6IHdlIGRvbid0IGtub3cgd2hpY2ggYXJndW1lbnQgd2lsbCBoYXZlIHRoaXMgdHJhaWxpbmcgY29tbWEgc28gd2UgaGF2ZSB0byB0cnkgYWxsKQotI2RlZmluZSBfQzJfQVJHQ18xKF8sIF8wLCBfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNywgXzgsIF85LCBfMTAsIF8xMSwgXzEyLCBfMTMsIF8xNCwgXzE1LCBfMTYsIFwKLSAgICAgICAgXzE3LCBfMTgsIF8xOSwgXzIwLCBfMjEsIF8yMiwgXzIzLCBfMjQsIF8yNSwgXzI2LCBfMjcsIF8yOCwgXzI5LCBfMzAsIF8zMSwgXzMyLCBcCi0gICAgICAgIF8zMywgXzM0LCBfMzUsIF8zNiwgXzM3LCBfMzgsIF8zOSwgXzQwLCBfNDEsIF80MiwgXzQzLCBfNDQsIF80NSwgXzQ2LCBfNDcsIF80OCwgXAotICAgICAgICBfNDksIF81MCwgXzUxLCBfNTIsIF81MywgXzU0LCBfNTUsIF81NiwgXzU3LCBfNTgsIF81OSwgXzYwLCBfNjEsIF82MiwgXzYzLCBfNjQsIC4uLikgXAotICAgIF9DMl9BUkdDXzIoXyBfQzJfQVJHKF8wKSBcCi0gICAgX0MyX0FSRzE2KF8xLCBfMiwgXzMsIF80LCBfNSwgXzYsIF83LCBfOCwgXzksIF8xMCwgXzExLCBfMTIsIF8xMywgXzE0LCBfMTUsIF8xNikgXAotICAgIF9DMl9BUkcxNihfMTcsIF8xOCwgXzE5LCBfMjAsIF8yMSwgXzIyLCBfMjMsIF8yNCwgXzI1LCBfMjYsIF8yNywgXzI4LCBfMjksIF8zMCwgXzMxLCBfMzIpIFwKLSAgICBfQzJfQVJHMTYoXzMzLCBfMzQsIF8zNSwgXzM2LCBfMzcsIF8zOCwgXzM5LCBfNDAsIF80MSwgXzQyLCBfNDMsIF80NCwgXzQ1LCBfNDYsIF80NywgXzQ4KSBcCi0gICAgX0MyX0FSRzE2KF80OSwgXzUwLCBfNTEsIF81MiwgXzUzLCBfNTQsIF81NSwgXzU2LCBfNTcsIF81OCwgXzU5LCBfNjAsIF82MSwgXzYyLCBfNjMsIF82NCksIFwKLSAgICAjI19fVkFfQVJHU19fKQotCi0vLyBzdGVwIDIuIHRoaXMgaXMgbmVlZGVkIGFzIHJlbW92ZWQgYXJndW1lbnRzIGNhbm5vdCBiZSBwYXNzZWQgZGlyZWN0bHkgYXMgZW1wdHkgaW50byBhIG1hY3JvCi0jZGVmaW5lIF9DMl9BUkdDXzIoLi4uKSBfQzJfQVJHQ18zKF9fVkFfQVJHU19fKQotCi0vLy8gXGVuZGlmCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZBUklBQkxFIEFSR1VNRU5UIENPTlZFUlNJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLy8vIFxpZiAwCi0KLS8vIG1hY3JvcyB0aGF0IGNvbnZlcnQgXzEsIF8yLCBfMywgLi4uIHRvIGZuKF8xLCBhcmcpLCBmbihfMiwgYXJnKSwgZm4oXzMsIGFyZyksIC4uLgotI2RlZmluZSBfQzJfTUFQXzY0KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF82MyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzYzKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF82MihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzYyKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF82MShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzYxKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF82MChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzYwKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81OShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzU5KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81OChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzU4KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81NyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzU3KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81NihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzU2KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81NShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzU1KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81NChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzU0KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81MyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzUzKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81MihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzUyKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81MShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzUxKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81MChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzUwKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80OShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzQ5KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80OChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzQ4KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80NyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzQ3KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80NihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzQ2KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80NShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzQ1KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80NChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzQ0KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80MyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzQzKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80MihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzQyKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80MShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzQxKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80MChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzQwKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zOShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzM5KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zOChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzM4KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zNyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzM3KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zNihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzM2KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zNShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzM1KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zNChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzM0KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zMyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzMzKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zMihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzMyKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zMShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzMxKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zMChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzMwKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yOShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzI5KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yOChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzI4KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yNyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzI3KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yNihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzI2KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yNShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzI1KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yNChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzI0KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yMyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzIzKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yMihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzIyKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yMShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzIxKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yMChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzIwKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xOShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzE5KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xOChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzE4KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xNyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzE3KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xNihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzE2KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xNShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzE1KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xNChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzE0KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xMyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzEzKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xMihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzEyKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xMShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzExKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xMChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzEwKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF85KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfOShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfOChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzgoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzcoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKLSNkZWZpbmUgX0MyX01BUF83KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF82KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfNihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzUoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKLSNkZWZpbmUgX0MyX01BUF80KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIF9DMl9NQVBfMyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBfQzJfTUFQXzIoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzEoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKLSNkZWZpbmUgX0MyX01BUF8xKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKQotCi0vLy8gXGVuZGlmCi0KLS8qKgotICogTWFwcyBlYWNoIGFyZ3VtZW50IHVzaW5nIGFub3RoZXIgbWFjcm8geCAtPiBmbih4LCBhcmcpCi0gKi8KLS8vIHVzZSB3cmFwcGVyIHRvIGNhbGwgdGhlIHByb3BlciBtYXBwZXIgYmFzZWQgb24gdGhlIG51bWJlciBvZiBhcmd1bWVudHMKLSNkZWZpbmUgX0MyX01BUChmbiwgYXJnLCAuLi4pIF9DMl9NQVBfXyhfQzJfQVJHQyhfX1ZBX0FSR1NfXyksIGZuLCBhcmcsICMjX19WQV9BUkdTX18pCi0KLS8vLyBcaWYgMAotCi0vLyBldmFsdWF0ZSBfbiBzbyBpdCBiZWNvbWVzIGEgbnVtYmVyCi0jZGVmaW5lIF9DMl9NQVBfXyhfbiwgZm4sIGFyZywgLi4uKSBfQzJfTUFQXyhfbiwgZm4sIGFyZywgX19WQV9BUkdTX18pCi0vLyBjYWxsIHRoZSBwcm9wZXIgbWFwcGVyCi0jZGVmaW5lIF9DMl9NQVBfKF9uLCBmbiwgYXJnLCAuLi4pIF9DMl9NQVBfIyNfbiAoZm4sIGFyZywgX19WQV9BUkdTX18pCi0KLS8vLyBcZW5kaWYKLQotI2VuZGlmICAvLyBDMlVUSUxTX01BQ1JPX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FuZHJvaWQuYnAKaW5kZXggMjFjMDBhMS4uNzM1Mjg1NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQW5kcm9pZC5icApAQCAtMTcsNiArMTcsOCBAQAogCiAgICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKIAorICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAorCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0RyY1ByZXNNb2RlV3JhcC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0RyY1ByZXNNb2RlV3JhcC5jcHAKaW5kZXggMTI5YWQ2NS4uOTVkMzcyNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9EcmNQcmVzTW9kZVdyYXAuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvRHJjUHJlc01vZGVXcmFwLmNwcApAQCAtMjQsNyArMjQsNyBAQAogLy8jZGVmaW5lIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRwogCiAjZGVmaW5lIEdQTV9FTkNPREVSX1RBUkdFVF9MRVZFTCA2NAotI2RlZmluZSBNQVhfVEFSR0VUX0xFVkVMIDY0CisjZGVmaW5lIE1BWF9UQVJHRVRfTEVWRUwgNDAKIAogQ0RyY1ByZXNNb2RlV3JhcHBlcjo6Q0RyY1ByZXNNb2RlV3JhcHBlcigpCiB7CkBAIC0xNjQsNyArMTY0LDcgQEAKICAgICBpZiAobURhdGFVcGRhdGUpIHsKICAgICAgICAgLy8gc2FuaXR5IGNoZWNrCiAgICAgICAgIGlmIChtRGVzVGFyZ2V0IDwgTUFYX1RBUkdFVF9MRVZFTCl7Ci0gICAgICAgICAgICBtRGVzVGFyZ2V0ID0gTUFYX1RBUkdFVF9MRVZFTDsgIC8vIGxpbWl0IHRhcmdldCBsZXZlbCB0byAtMTYgZEIgb3IgYmVsb3cKKyAgICAgICAgICAgIG1EZXNUYXJnZXQgPSBNQVhfVEFSR0VUX0xFVkVMOyAgLy8gbGltaXQgdGFyZ2V0IGxldmVsIHRvIC0xMCBkQiBvciBiZWxvdwogICAgICAgICAgICAgbmV3VGFyZ2V0ID0gTUFYX1RBUkdFVF9MRVZFTDsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwCmluZGV4IGUwYzBjMzIuLmJjMGE2OWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwCkBAIC0zNiw2ICszNiw3IEBACiAjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUICAgMTI3IC8qIG1heGltdW0gY29tcHJlc3Npb24gb2YgZHluYW1pYyByYW5nZSBmb3IgbW9iaWxlIGNvbmYgKi8KICNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19CT09TVCAxMjcgLyogbWF4aW11bSBjb21wcmVzc2lvbiBvZiBkeW5hbWljIHJhbmdlIGZvciBtb2JpbGUgY29uZiAqLwogI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0hFQVZZIDEgICAvKiBzd2l0Y2ggZm9yIGhlYXZ5IGNvbXByZXNzaW9uIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0VGRkVDVCAzICAvKiBNUEVHLUQgRFJDIGVmZmVjdCB0eXBlOyAzID0+IExpbWl0ZWQgcGxheWJhY2sgcmFuZ2UgKi8KICNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0VOQ19MRVZFTCAoLTEpIC8qIGVuY29kZXIgdGFyZ2V0IGxldmVsOyAtMSA9PiB0aGUgdmFsdWUgaXMgdW5rbm93biwgb3RoZXJ3aXNlIGRCIHN0ZXAgdmFsdWUgKGUuZy4gNjQgZm9yIC0xNiBkQikgKi8KICNkZWZpbmUgTUFYX0NIQU5ORUxfQ09VTlQgICAgICAgICAgICA4ICAvKiBtYXhpbXVtIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyB0aGF0IGNhbiBiZSBkZWNvZGVkICovCiAvLyBuYW1lcyBvZiBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgRFJDIHNldHRpbmdzCkBAIC00NCw2ICs0NSw3IEBACiAjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0JPT1NUICAgICAgImFhY19kcmNfYm9vc3QiCiAjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0hFQVZZICAgICAgImFhY19kcmNfaGVhdnkiCiAjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0VOQ19MRVZFTCAiYWFjX2RyY19lbmNfdGFyZ2V0X2xldmVsIgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9FRkZFQ1QgICAgICJyby5hYWNfZHJjX2VmZmVjdF90eXBlIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTYzLDYgKzY1LDcgQEAKICAgICBPTVhfQVVESU9fQUFDT2JqZWN0TEQsCiAgICAgT01YX0FVRElPX0FBQ09iamVjdEVMRCwKICAgICBPTVhfQVVESU9fQUFDT2JqZWN0RVJfU2NhbGFibGUsCisgICAgT01YX0FVRElPX0FBQ09iamVjdFhIRSwKIH07CiAKIFNvZnRBQUMyOjpTb2Z0QUFDMigKQEAgLTIwNyw2ICsyMTAsMTUgQEAKICAgICB9IGVsc2UgewogICAgICAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfRU5DT0RFUl9UQVJHRVQsIERSQ19ERUZBVUxUX01PQklMRV9FTkNfTEVWRUwpOwogICAgIH0KKyAgICAvLyBBQUNfVU5JRFJDX1NFVF9FRkZFQ1QKKyAgICBpbnQzMl90IGVmZmVjdFR5cGUgPQorICAgICAgICAgICAgcHJvcGVydHlfZ2V0X2ludDMyKFBST1BfRFJDX09WRVJSSURFX0VGRkVDVCwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19FRkZFQ1QpOworICAgIGlmIChlZmZlY3RUeXBlIDwgLTEgfHwgZWZmZWN0VHlwZSA+IDgpIHsKKyAgICAgICAgZWZmZWN0VHlwZSA9IERSQ19ERUZBVUxUX01PQklMRV9EUkNfRUZGRUNUOworICAgIH0KKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgTVBFRy1EIERSQyBlZmZlY3QgdHlwZSAlZCAoZGVmYXVsdD0lZCkiLAorICAgICAgICAgICAgZWZmZWN0VHlwZSwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19FRkZFQ1QpOworICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19VTklEUkNfU0VUX0VGRkVDVCwgZWZmZWN0VHlwZSk7CiAKICAgICAvLyBCeSBkZWZhdWx0LCB0aGUgZGVjb2RlciBjcmVhdGVzIGEgNS4xIGNoYW5uZWwgZG93bm1peCBzaWduYWwuCiAgICAgLy8gRm9yIHNldmVuIGFuZCBlaWdodCBjaGFubmVsIGlucHV0IHN0cmVhbXMsIGVuYWJsZSA2LjEgYW5kIDcuMSBjaGFubmVsIG91dHB1dApAQCAtNDE0LDEwICs0MjYsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEFhY1ByZXNlbnRhdGlvbjoKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEFhY0RyY1ByZXNlbnRhdGlvbjoKICAgICAgICAgewotICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX0FORFJPSURfQUFDUFJFU0VOVEFUSU9OVFlQRSAqYWFjUHJlc1BhcmFtcyA9Ci0gICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9BQUNQUkVTRU5UQVRJT05UWVBFICopcGFyYW1zOworICAgICAgICAgICAgY29uc3QgT01YX0FVRElPX1BBUkFNX0FORFJPSURfQUFDRFJDUFJFU0VOVEFUSU9OVFlQRSAqYWFjUHJlc1BhcmFtcyA9CisgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9BQUNEUkNQUkVTRU5UQVRJT05UWVBFICopcGFyYW1zOwogCiAgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShhYWNQcmVzUGFyYW1zKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CkBAIC00NDMsNiArNDU1LDEwIEBACiAgICAgICAgICAgICAgICAgQUxPR1YoInNldCBuTWF4T3V0cHV0Q2hhbm5lbHM9JWQiLCBtYXgpOwogICAgICAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19QQ01fTUFYX09VVFBVVF9DSEFOTkVMUywgbWF4KTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhYWNQcmVzUGFyYW1zLT5uRHJjRWZmZWN0VHlwZSA+PSAtMSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJzZXQgbkRyY0VmZmVjdFR5cGU9JWQiLCBhYWNQcmVzUGFyYW1zLT5uRHJjRWZmZWN0VHlwZSk7CisgICAgICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1VOSURSQ19TRVRfRUZGRUNULCBhYWNQcmVzUGFyYW1zLT5uRHJjRWZmZWN0VHlwZSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBib29sIHVwZGF0ZURyY1dyYXBwZXIgPSBmYWxzZTsKICAgICAgICAgICAgIGlmIChhYWNQcmVzUGFyYW1zLT5uRHJjQm9vc3QgPj0gMCkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJzZXQgbkRyY0Jvb3N0PSVkIiwgYWFjUHJlc1BhcmFtcy0+bkRyY0Jvb3N0KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvZXhwb3J0cy5sZHMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNGYzZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL2V4cG9ydHMubGRzCkBAIC0wLDAgKzEsNSBAQAoreworICAgIGdsb2JhbDoKKyAgICAgICAgX1oyMmNyZWF0ZVNvZnRPTVhDb21wb25lbnRQS2NQSzE2T01YX0NBTExCQUNLVFlQRVB2UFAxN09NWF9DT01QT05FTlRUWVBFOworICAgIGxvY2FsOiAqOworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQUFDRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FBQ0VuY29kZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjU2MTM5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQUFDRW5jb2Rlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiQUFDRW5jb2RlciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkFBQ0VuY29kZXIuaCIKLSNpbmNsdWRlICJ2b0FBQy5oIgotI2luY2x1ZGUgImNtbk1lbW9yeS5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLUFBQ0VuY29kZXI6OkFBQ0VuY29kZXIoY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlLCBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEpCi0gICAgOiBtU291cmNlKHNvdXJjZSksCi0gICAgICBtTWV0YShtZXRhKSwKLSAgICAgIG1TdGFydGVkKGZhbHNlKSwKLSAgICAgIG1CdWZmZXJHcm91cChOVUxMKSwKLSAgICAgIG1JbnB1dEJ1ZmZlcihOVUxMKSwKLSAgICAgIG1JbnB1dEZyYW1lKE5VTEwpLAotICAgICAgbUVuY29kZXJIYW5kbGUoTlVMTCksCi0gICAgICBtQXBpSGFuZGxlKE5VTEwpLAotICAgICAgbU1lbU9wZXJhdG9yKE5VTEwpIHsKLX0KLQotc3RhdHVzX3QgQUFDRW5jb2Rlcjo6aW5pdENoZWNrKCkgewotICAgIENIRUNLKG1BcGlIYW5kbGUgPT0gTlVMTCAmJiBtRW5jb2RlckhhbmRsZSA9PSBOVUxMKTsKLSAgICBDSEVDSyhtTWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmbVNhbXBsZVJhdGUpKTsKLSAgICBDSEVDSyhtTWV0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZtQ2hhbm5lbHMpKTsKLSAgICBDSEVDSyhtQ2hhbm5lbHMgPD0gMiAmJiBtQ2hhbm5lbHMgPj0gMSk7Ci0gICAgQ0hFQ0sobU1ldGEtPmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJm1CaXRSYXRlKSk7Ci0KLSAgICBtQXBpSGFuZGxlID0gbmV3IFZPX0FVRElPX0NPREVDQVBJOwotICAgIENIRUNLKG1BcGlIYW5kbGUpOwotCi0gICAgaWYgKFZPX0VSUl9OT05FICE9IHZvR2V0QUFDRW5jQVBJKG1BcGlIYW5kbGUpKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IGFwaSBoYW5kbGUiKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgbU1lbU9wZXJhdG9yID0gbmV3IFZPX01FTV9PUEVSQVRPUjsKLSAgICBDSEVDSyhtTWVtT3BlcmF0b3IgIT0gTlVMTCk7Ci0gICAgbU1lbU9wZXJhdG9yLT5BbGxvYyA9IGNtbk1lbUFsbG9jOwotICAgIG1NZW1PcGVyYXRvci0+Q29weSA9IGNtbk1lbUNvcHk7Ci0gICAgbU1lbU9wZXJhdG9yLT5GcmVlID0gY21uTWVtRnJlZTsKLSAgICBtTWVtT3BlcmF0b3ItPlNldCA9IGNtbk1lbVNldDsKLSAgICBtTWVtT3BlcmF0b3ItPkNoZWNrID0gY21uTWVtQ2hlY2s7Ci0KLSAgICBWT19DT0RFQ19JTklUX1VTRVJEQVRBIHVzZXJEYXRhOwotICAgIG1lbXNldCgmdXNlckRhdGEsIDAsIHNpemVvZih1c2VyRGF0YSkpOwotICAgIHVzZXJEYXRhLm1lbWZsYWcgPSBWT19JTUZfVVNFUk1FTU9QRVJBVE9SOwotICAgIHVzZXJEYXRhLm1lbURhdGEgPSAoVk9fUFRSKSBtTWVtT3BlcmF0b3I7Ci0gICAgaWYgKFZPX0VSUl9OT05FICE9IG1BcGlIYW5kbGUtPkluaXQoJm1FbmNvZGVySGFuZGxlLCBWT19BVURJT19Db2RpbmdBQUMsICZ1c2VyRGF0YSkpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0IEFBQyBlbmNvZGVyIik7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLSAgICBpZiAoT0sgIT0gc2V0QXVkaW9TcGVjaWZpY0NvbmZpZ0RhdGEoKSkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNvbmZpZ3VyZSBBQUMgZW5jb2RlciIpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICAvLyBDb25maWd1cmUgQUFDIGVuY29kZXIkCi0gICAgQUFDRU5DX1BBUkFNIHBhcmFtczsKLSAgICBtZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpOwotICAgIHBhcmFtcy5zYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7Ci0gICAgcGFyYW1zLmJpdFJhdGUgPSBtQml0UmF0ZTsKLSAgICBwYXJhbXMubkNoYW5uZWxzID0gbUNoYW5uZWxzOwotICAgIHBhcmFtcy5hZHRzVXNlZCA9IDA7ICAvLyBXZSBhZGQgYWR0cyBoZWFkZXIgaW4gdGhlIGZpbGUgd3JpdGVyIGlmIG5lZWRlZC4KLSAgICBpZiAoVk9fRVJSX05PTkUgIT0gbUFwaUhhbmRsZS0+U2V0UGFyYW0obUVuY29kZXJIYW5kbGUsIFZPX1BJRF9BQUNfRU5DUEFSQU0sICAmcGFyYW1zKSkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBQUMgZW5jb2RlciBwYXJhbWV0ZXJzIik7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdGljIHN0YXR1c190IGdldFNhbXBsZVJhdGVUYWJsZUluZGV4KGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCAmaW5kZXgpIHsKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrU2FtcGxlUmF0ZVRhYmxlW10gPSB7Ci0gICAgICAgIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsCi0gICAgICAgIDI0MDAwLCAyMjA1MCwgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMAotICAgIH07Ci0gICAgY29uc3QgaW50MzJfdCB0YWJsZVNpemUgPSBzaXplb2Yoa1NhbXBsZVJhdGVUYWJsZSkgLyBzaXplb2Yoa1NhbXBsZVJhdGVUYWJsZVswXSk7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgdGFibGVTaXplOyArK2kpIHsKLSAgICAgICAgaWYgKHNhbXBsZVJhdGUgPT0ga1NhbXBsZVJhdGVUYWJsZVtpXSkgewotICAgICAgICAgICAgaW5kZXggPSBpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQUxPR0UoIlNhbXBsaW5nIHJhdGUgJWQgYnBzIGlzIG5vdCBzdXBwb3J0ZWQiLCBzYW1wbGVSYXRlKTsKLSAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLX0KLQotc3RhdHVzX3QgQUFDRW5jb2Rlcjo6c2V0QXVkaW9TcGVjaWZpY0NvbmZpZ0RhdGEoKSB7Ci0gICAgQUxPR1YoInNldEF1ZGlvU3BlY2lmaWNDb25maWdEYXRhOiAlZCBoeiwgJWQgYnBzLCBhbmQgJWQgY2hhbm5lbHMiLAotICAgICAgICAgbVNhbXBsZVJhdGUsIG1CaXRSYXRlLCBtQ2hhbm5lbHMpOwotCi0gICAgaW50MzJfdCBpbmRleCA9IDA7Ci0gICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBnZXRTYW1wbGVSYXRlVGFibGVJbmRleChtU2FtcGxlUmF0ZSwgaW5kZXgpKTsKLSAgICBpZiAobUNoYW5uZWxzID4gMiB8fCBtQ2hhbm5lbHMgPD0gMCkgewotICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGNoYW5uZWxzKCVkKSIsIG1DaGFubmVscyk7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIC8vIE9NWF9BVURJT19BQUNPYmplY3RMQwotICAgIG1BdWRpb1NwZWNpZmljQ29uZmlnRGF0YVswXSA9ICgoMHgwMiA8PCAzKSB8IChpbmRleCA+PiAxKSk7Ci0gICAgbUF1ZGlvU3BlY2lmaWNDb25maWdEYXRhWzFdID0gKChpbmRleCAmIDB4MDEpIDw8IDcpIHwgKG1DaGFubmVscyA8PCAzKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLUFBQ0VuY29kZXI6On5BQUNFbmNvZGVyKCkgewotICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICBzdG9wKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBQUNFbmNvZGVyOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7Ci0gICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgIEFMT0dXKCJDYWxsIHN0YXJ0KCkgd2hlbiBlbmNvZGVyIGFscmVhZHkgc3RhcnRlZCIpOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgbUJ1ZmZlckdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0gICAgbUJ1ZmZlckdyb3VwLT5hZGRfYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcigyMDQ4KSk7Ci0KLSAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIGluaXRDaGVjaygpKTsKLQotICAgIG1OdW1JbnB1dFNhbXBsZXMgPSAwOwotICAgIG1BbmNob3JUaW1lVXMgPSAwOwotICAgIG1GcmFtZUNvdW50ID0gMDsKLQotICAgIG1JbnB1dEZyYW1lID0gbmV3IGludDE2X3RbbUNoYW5uZWxzICoga051bVNhbXBsZXNQZXJGcmFtZV07Ci0gICAgQ0hFQ0sobUlucHV0RnJhbWUgIT0gTlVMTCk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdGFydChwYXJhbXMpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgIEFMT0dFKCJBdWRpb1NvdXJjZSBpcyBub3QgYXZhaWxhYmxlIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbVN0YXJ0ZWQgPSB0cnVlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBBQUNFbmNvZGVyOjpzdG9wKCkgewotICAgIGlmIChtSW5wdXRCdWZmZXIpIHsKLSAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgZGVsZXRlIG1CdWZmZXJHcm91cDsKLSAgICBtQnVmZmVyR3JvdXAgPSBOVUxMOwotCi0gICAgaWYgKG1JbnB1dEZyYW1lKSB7Ci0gICAgICAgIGRlbGV0ZVtdIG1JbnB1dEZyYW1lOwotICAgICAgICBtSW5wdXRGcmFtZSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKCFtU3RhcnRlZCkgewotICAgICAgICBBTE9HVygiQ2FsbCBzdG9wKCkgd2hlbiBlbmNvZGVyIGhhcyBub3Qgc3RhcnRlZCIpOwotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICB9Ci0KLSAgICBtU291cmNlLT5zdG9wKCk7Ci0gICAgaWYgKG1FbmNvZGVySGFuZGxlKSB7Ci0gICAgICAgIENIRUNLX0VRKChWT19VMzIpVk9fRVJSX05PTkUsIG1BcGlIYW5kbGUtPlVuaW5pdChtRW5jb2RlckhhbmRsZSkpOwotICAgICAgICBtRW5jb2RlckhhbmRsZSA9IE5VTEw7Ci0gICAgfQotICAgIGRlbGV0ZSBtQXBpSGFuZGxlOwotICAgIG1BcGlIYW5kbGUgPSBOVUxMOwotCi0gICAgZGVsZXRlIG1NZW1PcGVyYXRvcjsKLSAgICBtTWVtT3BlcmF0b3IgPSBOVUxMOwotCi0gICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3A8TWV0YURhdGE+IEFBQ0VuY29kZXI6OmdldEZvcm1hdCgpIHsKLSAgICBzcDxNZXRhRGF0YT4gc3JjRm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0KLSAgICBtTWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7Ci0KLSAgICBpbnQ2NF90IGR1cmF0aW9uVXM7Ci0gICAgaWYgKHNyY0Zvcm1hdC0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7Ci0gICAgICAgIG1NZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOwotICAgIH0KLQotICAgIG1NZXRhLT5zZXRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAiQUFDRW5jb2RlciIpOwotCi0gICAgcmV0dXJuIG1NZXRhOwotfQotCi1zdGF0dXNfdCBBQUNFbmNvZGVyOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICAqb3V0ID0gTlVMTDsKLQotICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKLSAgICBDSEVDSyhvcHRpb25zID09IE5VTEwgfHwgIW9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKTsKLQotICAgIE1lZGlhQnVmZmVyICpidWZmZXI7Ci0gICAgQ0hFQ0tfRVEobUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKSwgKHN0YXR1c190KU9LKTsKLSAgICB1aW50OF90ICpvdXRQdHIgPSAodWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpOwotICAgIGJvb2wgcmVhZEZyb21Tb3VyY2UgPSBmYWxzZTsKLSAgICBpbnQ2NF90IHdhbGxDbG9ja1RpbWVVcyA9IC0xOwotCi0gICAgaWYgKG1GcmFtZUNvdW50ID09IDApIHsKLSAgICAgICAgbWVtY3B5KG91dFB0ciwgbUF1ZGlvU3BlY2lmaWNDb25maWdEYXRhLCAyKTsKLSAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgMik7Ci0gICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc0NvZGVjQ29uZmlnLCB0cnVlKTsKLSAgICAgICAgKm91dCA9IGJ1ZmZlcjsKLSAgICAgICAgKyttRnJhbWVDb3VudDsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSBpZiAobUZyYW1lQ291bnQgPT0gMSkgewotICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNDb2RlY0NvbmZpZywgZmFsc2UpOwotICAgIH0KLQotICAgIGNvbnN0IGludDMyX3QgblNhbXBsZXMgPSBtQ2hhbm5lbHMgKiBrTnVtU2FtcGxlc1BlckZyYW1lOwotICAgIHdoaWxlIChtTnVtSW5wdXRTYW1wbGVzIDwgblNhbXBsZXMpIHsKLSAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAobVNvdXJjZS0+cmVhZCgmbUlucHV0QnVmZmVyLCBvcHRpb25zKSAhPSBPSykgewotICAgICAgICAgICAgICAgIGlmIChtTnVtSW5wdXRTYW1wbGVzID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZW1zZXQoJm1JbnB1dEZyYW1lW21OdW1JbnB1dFNhbXBsZXNdLAotICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50MTZfdCkgKiAoblNhbXBsZXMgLSBtTnVtSW5wdXRTYW1wbGVzKSk7Ci0gICAgICAgICAgICAgICAgbU51bUlucHV0U2FtcGxlcyA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNpemVfdCBhbGlnbiA9IG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgJSBzaXplb2YoaW50MTZfdCk7Ci0gICAgICAgICAgICBDSEVDS19FUShhbGlnbiwgKHNpemVfdCkwKTsKLQotICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlEcmlmdFRpbWUsICZ0aW1lVXMpKSB7Ci0gICAgICAgICAgICAgICAgd2FsbENsb2NrVGltZVVzID0gdGltZVVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5QW5jaG9yVGltZSwgJnRpbWVVcykpIHsKLSAgICAgICAgICAgICAgICBtQW5jaG9yVGltZVVzID0gdGltZVVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVhZEZyb21Tb3VyY2UgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVhZEZyb21Tb3VyY2UgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBzaXplX3QgY29weSA9IChuU2FtcGxlcyAtIG1OdW1JbnB1dFNhbXBsZXMpICogc2l6ZW9mKGludDE2X3QpOwotCi0gICAgICAgIGlmIChjb3B5ID4gbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSkgewotICAgICAgICAgICAgY29weSA9IG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtZW1jcHkoJm1JbnB1dEZyYW1lW21OdW1JbnB1dFNhbXBsZXNdLAotICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKikgbUlucHV0QnVmZmVyLT5kYXRhKCkKLSAgICAgICAgICAgICAgICAgICAgKyBtSW5wdXRCdWZmZXItPnJhbmdlX29mZnNldCgpLAotICAgICAgICAgICAgICAgY29weSk7Ci0KLSAgICAgICAgbUlucHV0QnVmZmVyLT5zZXRfcmFuZ2UoCi0gICAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJhbmdlX29mZnNldCgpICsgY29weSwKLSAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSBjb3B5KTsKLQotICAgICAgICBpZiAobUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgbU51bUlucHV0U2FtcGxlcyArPSBjb3B5IC8gc2l6ZW9mKGludDE2X3QpOwotICAgICAgICBpZiAobU51bUlucHV0U2FtcGxlcyA+PSBuU2FtcGxlcykgewotICAgICAgICAgICAgbU51bUlucHV0U2FtcGxlcyAlPSBuU2FtcGxlczsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgVk9fQ09ERUNCVUZGRVIgaW5wdXREYXRhOwotICAgIG1lbXNldCgmaW5wdXREYXRhLCAwLCBzaXplb2YoaW5wdXREYXRhKSk7Ci0gICAgaW5wdXREYXRhLkJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyKikgbUlucHV0RnJhbWU7Ci0gICAgaW5wdXREYXRhLkxlbmd0aCA9IG5TYW1wbGVzICogc2l6ZW9mKGludDE2X3QpOwotICAgIENIRUNLKChWT19VMzIpVk9fRVJSX05PTkUgPT0gbUFwaUhhbmRsZS0+U2V0SW5wdXREYXRhKG1FbmNvZGVySGFuZGxlLCZpbnB1dERhdGEpKTsKLQotICAgIFZPX0NPREVDQlVGRkVSIG91dHB1dERhdGE7Ci0gICAgbWVtc2V0KCZvdXRwdXREYXRhLCAwLCBzaXplb2Yob3V0cHV0RGF0YSkpOwotICAgIFZPX0FVRElPX09VVFBVVElORk8gb3V0cHV0SW5mbzsKLSAgICBtZW1zZXQoJm91dHB1dEluZm8sIDAsIHNpemVvZihvdXRwdXRJbmZvKSk7Ci0KLSAgICBWT19VMzIgcmV0ID0gVk9fRVJSX05PTkU7Ci0gICAgc2l6ZV90IG5PdXRwdXRCeXRlcyA9IDA7Ci0gICAgZG8gewotICAgICAgICBvdXRwdXREYXRhLkJ1ZmZlciA9IG91dFB0cjsKLSAgICAgICAgb3V0cHV0RGF0YS5MZW5ndGggPSBidWZmZXItPnNpemUoKSAtIG5PdXRwdXRCeXRlczsKLSAgICAgICAgcmV0ID0gbUFwaUhhbmRsZS0+R2V0T3V0cHV0RGF0YShtRW5jb2RlckhhbmRsZSwgJm91dHB1dERhdGEsICZvdXRwdXRJbmZvKTsKLSAgICAgICAgaWYgKHJldCA9PSBWT19FUlJfTk9ORSkgewotICAgICAgICAgICAgb3V0UHRyICs9IG91dHB1dERhdGEuTGVuZ3RoOwotICAgICAgICAgICAgbk91dHB1dEJ5dGVzICs9IG91dHB1dERhdGEuTGVuZ3RoOwotICAgICAgICB9Ci0gICAgfSB3aGlsZSAocmV0ICE9IFZPX0VSUl9JTlBVVF9CVUZGRVJfU01BTEwpOwotICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIG5PdXRwdXRCeXRlcyk7Ci0KLSAgICBpbnQ2NF90IG1lZGlhVGltZVVzID0KLSAgICAgICAgKChtRnJhbWVDb3VudCAtIDEpICogMTAwMDAwMExMICoga051bVNhbXBsZXNQZXJGcmFtZSkgLyBtU2FtcGxlUmF0ZTsKLQotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBtQW5jaG9yVGltZVVzICsgbWVkaWFUaW1lVXMpOwotICAgIGlmIChyZWFkRnJvbVNvdXJjZSAmJiB3YWxsQ2xvY2tUaW1lVXMgIT0gLTEpIHsKLSAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleURyaWZ0VGltZSwgbWVkaWFUaW1lVXMgLSB3YWxsQ2xvY2tUaW1lVXMpOwotICAgIH0KLSAgICArK21GcmFtZUNvdW50OwotCi0gICAgKm91dCA9IGJ1ZmZlcjsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQuYnAKaW5kZXggZmIzNjhjMi4uOTM0MjM1MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQW5kcm9pZC5icApAQCAtMSwxMTUgKzEsMyBAQAotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9hYWNlbmMiLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJiYXNpY19vcC9iYXNpY29wMi5jIiwKLSAgICAgICAgImJhc2ljX29wL29wZXJfMzJiLmMiLAotCi0gICAgICAgICJBQUNFbmNvZGVyLmNwcCIsCi0gICAgICAgICJzcmMvYWFjX3JvbS5jIiwKLSAgICAgICAgInNyYy9hYWNlbmMuYyIsCi0gICAgICAgICJzcmMvYWFjZW5jX2NvcmUuYyIsCi0gICAgICAgICJzcmMvYWRqX3Roci5jIiwKLSAgICAgICAgInNyYy9iYW5kX25yZy5jIiwKLSAgICAgICAgInNyYy9iaXRfY250LmMiLAotICAgICAgICAic3JjL2JpdGJ1ZmZlci5jIiwKLSAgICAgICAgInNyYy9iaXRlbmMuYyIsCi0gICAgICAgICJzcmMvYmxvY2tfc3dpdGNoLmMiLAotICAgICAgICAic3JjL2NoYW5uZWxfbWFwLmMiLAotICAgICAgICAic3JjL2R5bl9iaXRzLmMiLAotICAgICAgICAic3JjL2dycF9kYXRhLmMiLAotICAgICAgICAic3JjL2ludGVyZmFjZS5jIiwKLSAgICAgICAgInNyYy9saW5lX3BlLmMiLAotICAgICAgICAic3JjL21zX3N0ZXJlby5jIiwKLSAgICAgICAgInNyYy9wcmVfZWNob19jb250cm9sLmMiLAotICAgICAgICAic3JjL3BzeV9jb25maWd1cmF0aW9uLmMiLAotICAgICAgICAic3JjL3BzeV9tYWluLmMiLAotICAgICAgICAic3JjL3FjX21haW4uYyIsCi0gICAgICAgICJzcmMvcXVhbnRpemUuYyIsCi0gICAgICAgICJzcmMvc2ZfZXN0aW0uYyIsCi0gICAgICAgICJzcmMvc3ByZWFkaW5nLmMiLAotICAgICAgICAic3JjL3N0YXRfYml0cy5jIiwKLSAgICAgICAgInNyYy90bnMuYyIsCi0gICAgICAgICJzcmMvdHJhbnNmb3JtLmMiLAotICAgICAgICAic3JjL21lbWFsaWduLmMiLAotICAgIF0sCi0KLSAgICBhcmNoOiB7Ci0gICAgICAgIGFybTogewotICAgICAgICAgICAgc3JjczogWwotICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9BdXRvQ29ycmVsYXRpb25fdjUucyIsCi0gICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL2JhbmRfbnJnX3Y1LnMiLAotICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9DYWxjV2luZG93RW5lcmd5X3Y1LnMiLAotICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9QcmVQb3N0TURDVF92NS5zIiwKLSAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvUjRSOEZpcnN0X3Y1LnMiLAotICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9SYWRpeDRGRlRfdjUucyIsCi0gICAgICAgICAgICBdLAotCi0gICAgICAgICAgICBjZmxhZ3M6IFsKLSAgICAgICAgICAgICAgICAiLURBUk1WNUUiLAotICAgICAgICAgICAgICAgICItREFSTV9JTkFTTSIsCi0gICAgICAgICAgICAgICAgIi1EQVJNVjVfSU5BU00iLAotICAgICAgICAgICAgXSwKLQotICAgICAgICAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbInNyYy9hc20vQVJNVjVFIl0sCi0KLSAgICAgICAgICAgIGluc3RydWN0aW9uX3NldDogImFybSIsCi0KLSAgICAgICAgICAgIGFybXY3X2FfbmVvbjogewotICAgICAgICAgICAgICAgIGV4Y2x1ZGVfc3JjczogWwotICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvUHJlUG9zdE1EQ1RfdjUucyIsCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9SNFI4Rmlyc3RfdjUucyIsCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9SYWRpeDRGRlRfdjUucyIsCi0gICAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICAgICBzcmNzOiBbCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY3L1ByZVBvc3RNRENUX3Y3LnMiLAotICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNy9SNFI4Rmlyc3RfdjcucyIsCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY3L1JhZGl4NEZGVF92Ny5zIiwKLSAgICAgICAgICAgICAgICBdLAotCi0gICAgICAgICAgICAgICAgY2ZsYWdzOiBbCi0gICAgICAgICAgICAgICAgICAgICItREFSTVY3TmVvbiIsCi0gICAgICAgICAgICAgICAgICAgICItREFSTVY2X0lOQVNNIiwKLSAgICAgICAgICAgICAgICBdLAotCi0gICAgICAgICAgICAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbInNyYy9hc20vQVJNVjciXSwKLSAgICAgICAgICAgIH0sCi0gICAgICAgIH0sCi0gICAgfSwKLQotICAgIC8vIGxpYnN0YWdlZnJpZ2h0IGxpbmtzIHRoaXMgc3RhdGljIGxpYnJhcnksIHNvIGl0IHByb2JhYmx5IGlzbid0IGFwcHJvcHJpYXRlIHRvCi0gICAgLy8gbGluayBsaWJzdGFnZWZyaWdodC4gIEhvd2V2ZXIsIHRoaXMgbGlicmFyeSBpbmNsdWRlcyBsaWJzdGFnZWZyaWdodCBoZWFkZXJzLAotICAgIC8vIGFuZCBuZWVkcyBsaWJiaW5kZXIgdG8gYmUgYWJsZSB0byBkbyBzbyBjb3JyZWN0bHkuCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9lbmNfY29tbW9uIiwKLSAgICBdLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICBdLAotCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzcmMiLAotICAgICAgICAiaW5jIiwKLSAgICAgICAgImJhc2ljX29wIiwKLSAgICBdLAotCi0gICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKLQotICAgIHNhbml0aXplOiB7Ci0gICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCi0gICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICBdLAotICAgIH0sCi0KLX0KLQotLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9hYWNlbmMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCkBAIC0xMjYsNiArMTQsOCBAQAogCiAgICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKIAorICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAorCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCkBAIC0xNDcsMzYgKzM3LDMgQEAKICAgICBdLAogICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9Ci0KLWNjX2xpYnJhcnlfc2hhcmVkIHsKLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9hYWNlbmNfdmlzdWFsb24iLAotCi0gICAgc3JjczogWyJTb2Z0QUFDRW5jb2Rlci5jcHAiXSwKLQotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgXSwKLQotICAgIGNmbGFnczogWwotICAgICAgICAiLURPU0NMX0lNUE9SVF9SRUY9IiwKLSAgICAgICAgIi1XZXJyb3IiLAotICAgIF0sCi0KLSAgICBzYW5pdGl6ZTogewotICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwotICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAgICAgXSwKLSAgICB9LAotCi0gICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfYWFjZW5jIl0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VuY19jb21tb24iLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvQUFDX0VfU0FNUExFUy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9TYW1wbGVDb2RlL0FBQ19FX1NBTVBMRVMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYzMWRlNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvQUFDX0VfU0FNUExFUy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJQUFDX0VfU0FNUExFUy5oCi0KLQlDb250ZW50OglzYW1wbGUgY29kZSBmb3IgQUFDIGVuY29kZXIKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUJCTxkbGZjbi5oPgotI2luY2x1ZGUJCTxzdGRpby5oPgotI2luY2x1ZGUJCTxzdGRsaWIuaD4KLSNpbmNsdWRlCQk8c3RyaW5nLmg+Ci0jaW5jbHVkZQkJPHRpbWUuaD4KLSNpbmNsdWRlCQkidm9BQUMuaCIKLSNpbmNsdWRlCQkiY21uTWVtb3J5LmgiCi0KLSNkZWZpbmUgIFZPX0FBQ19FX09VVFBVVAkgIDEKLSNkZWZpbmUgUkVBRF9TSVpFCSgxMDI0KjgpCi11bnNpZ25lZCBjaGFyIG91dEJ1ZlsxMDI0KjhdOwotdW5zaWduZWQgY2hhciBpbkJ1ZltSRUFEX1NJWkVdOwotCi1jb25zdCBjaGFyKiBIZWxwU3RyaW5nID0KLSJWaXN1YWxPbiBBQUMgZW5jb2RlciBVc2FnZTpcbiIKLSJ2b0FBQ0VuY1Rlc3QgLWlmIDxpbnB1dGZpbGUucGNtPiAtb2YgPG91dHB1dGZpbGUuYWFjPiAtc3IgPHNhbXBsZXJhdGU+IC1jaCA8Y2hhbm5lbD4gLWJyIDxiaXRyYXRlPiAtYWR0cyA8YWR0cz4gXG4iCi0iLWlmIGlucHV0IGZpbGUgbmFtZSBcbiIKLSItb2Ygb3V0cHV0IGZpbGUgbmFtZSBcbiIKLSItc3IgaW5wdXQgcGNtIHNhbXBsZXJhdGUsIGRlZmF1bHQgNDQxMDAgXG4iCi0iLWNoIGlucHV0IHBjbSBjaGFubmVsLCBkZWZhdWx0IDIgY2hhbm5lbCBcbiIKLSItYnIgZW5jb2RlZCBhYWMgYml0cmF0ZSwgZGVmYXVsdCA2NDAwMCAqIChzYW1wbGVyYXRlLzEwMCkqY2hhbm5lbC80NDEoNDgwKVxuIgotIi1hZHRzIGFkZCBvciBubyBhZHRzIGhlYWRlciwgZGVmYXVsdCBhZGQgYWR0cyBoZWFkZXJcbiIKLSJGb3IgZXhhbXBsZTogXG4iCi0iLi92b0FBQ0VuY1Rlc3QgLWlmIHJhdy5wY20gLW9mIHJhdy5hYWMgLXNyIDQ0MTAwIC1jaCAyIC1iciAxMjgwMDBcbiI7Ci0KLXN0YXRpYyBpbnQgcGFyc2VjbWRsaW5lKGludCBhcmdjLCBjaGFyICoqYXJndixjaGFyICAqKmlucHV0X2ZpbGVuYW1lLCBjaGFyICAqKm91dHB1dF9maWxlbmFtZSwgQUFDRU5DX1BBUkFNICpwYXJhbSkKLXsKLQkvLyBub3RpY2UgdGhhdDoKLQkvLyBiaXRSYXRlL25DaGFubmVscyA+IDgwMDAKLQkvLyBiaXRSYXRlL25DaGFubmVscyA8IDE2MDAwMAotCS8vIGJpdFJhdGUvbkNoYW5uZWxzIDwgc2FtcGxlUmF0ZSo2Ci0JcGFyYW0tPmFkdHNVc2VkID0gMTsKLQlwYXJhbS0+Yml0UmF0ZSA9IDA7Ci0JcGFyYW0tPm5DaGFubmVscyA9IDI7Ci0JcGFyYW0tPnNhbXBsZVJhdGUgPSA0NDEwMDsKLQotCWlmKGFyZ2MgPCA1IHx8IGFyZ2MgPiAxMykKLQl7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlhcmdjLS07Ci0JYXJndisrOwotCXdoaWxlIChhcmdjID4gMCkKLQl7Ci0JCWlmICghc3RyY21wKCphcmd2LCAiLWlmIikpCi0JCXsKLQkJCWFyZ3YrKzsKLQkJCWFyZ2MtLTsKLQkJCSppbnB1dF9maWxlbmFtZSA9ICphcmd2OwotCQl9Ci0JCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3YsICItb2YiKSkKLQkJewotCQkJYXJndisrOwotCQkJYXJnYy0tOwotCQkJKm91dHB1dF9maWxlbmFtZSA9ICphcmd2OwotCQl9Ci0JCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3YsICItc3IiKSkKLQkJewotCQkJYXJndisrOwotCQkJYXJnYy0tOwotCQkJcGFyYW0tPnNhbXBsZVJhdGUgPSBhdG9pKCphcmd2KTsKLQkJfQotCQllbHNlIGlmICghc3RyY21wKCphcmd2LCAiLWNoIikpCi0JCXsKLQkJCWFyZ3YrKzsKLQkJCWFyZ2MtLTsKLQkJCXBhcmFtLT5uQ2hhbm5lbHMgPSBhdG9pKCphcmd2KTsKLQkJfQotCQllbHNlIGlmICghc3RyY21wKCphcmd2LCAiLWJyIikpCi0JCXsKLQkJCWFyZ3YrKzsKLQkJCWFyZ2MtLTsKLQkJCXBhcmFtLT5iaXRSYXRlID0gYXRvaSgqYXJndik7Ci0JCX0KLQkJZWxzZSBpZighc3RyY21wKCphcmd2LCAiLWFkdHMiKSkKLQkJewotCQkJYXJndisrOwotCQkJYXJnYy0tOwotCQkJcGFyYW0tPmFkdHNVc2VkID0gYXRvaSgqYXJndik7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQlhcmd2Kys7Ci0JCWFyZ2MtLTsKLQl9Ci0KLQlpZihwYXJhbS0+Yml0UmF0ZSA9PSAwKQotCXsKLQkJaW50IHNjYWxlID0gNDQxOwotCQlpZihwYXJhbS0+c2FtcGxlUmF0ZSU4MDAwID09IDApCi0JCQlzY2FsZSA9IDQ4MDsKLQkJcGFyYW0tPmJpdFJhdGUgPSA2NDAqcGFyYW0tPm5DaGFubmVscypwYXJhbS0+c2FtcGxlUmF0ZS9zY2FsZTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IFJlYWRGaWxlMkJ1ZihGSUxFKiBpbmZpbGUsdW5zaWduZWQgY2hhciogZGVzdCxpbnQgcmVhZFNpemUpCi17Ci0JaW50IHJlYWRCeXRlcyA9IDA7Ci0JcmVhZEJ5dGVzID0gZnJlYWQoZGVzdCwgMSwgcmVhZFNpemUsIGluZmlsZSk7Ci0JcmV0dXJuIHJlYWRCeXRlczsKLX0KLQotdHlwZWRlZiBpbnQgKFZPX0FQSSAqIFZPR0VUQVVESU9ERUNBUEkpIChWT19BVURJT19DT0RFQ0FQSSAqIHBEZWNIYW5kbGUpOwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0JRklMRQkJCQkJCSppbmZpbGUsICpvdXRmaWxlOwotCWludAkJCQkJCQl0MSwgdDI7Ci0JVk9fQVVESU9fQ09ERUNBUEkJCQlBdWRpb0FQSTsKLQlWT19NRU1fT1BFUkFUT1IJCQkJbW9wZXI7Ci0JVk9fQ09ERUNfSU5JVF9VU0VSREFUQQkJdXNlRGF0YTsKLQlWT19IQU5ETEUJCQkJCWhDb2RlYzsKLQlWT19DT0RFQ0JVRkZFUgkJCQlpbkRhdGE7Ci0JVk9fQ09ERUNCVUZGRVIJCQkJb3V0RGF0YTsKLQlWT19BVURJT19PVVRQVVRJTkZPCQkJb3V0SW5mbzsKLSAgICBpbnQJCQkJCQkJZmlyc3RXcml0ZSA9IDE7Ci0JaW50CQkJCQkJCWVvZkZpbGUgPSAwOwotCWludAkJCQkJCQkqaW5mbz0oaW50KilpbkJ1ZjsKLQlpbnQJCQkJCQkJYnl0ZXNMZWZ0LCBuUmVhZDsKLQlpbnQJCQkJCQkJRW5jb2RlcmRGcmFtZSA9IDA7Ci0JaW50CQkJCQkJCXRvdGFsID0gMDsKLQlpbnQJCQkJCQkJaXNPdXRwdXQgPSAxOwotCWludAkJCQkJCQlyZXR1cm5Db2RlOwotCUFBQ0VOQ19QQVJBTQkJCQlhYWNwYXJhOwotCXZvaWQJCQkJCQkqaGFuZGxlOwotCXZvaWQJCQkJCQkqcGZ1bmM7Ci0JVk9HRVRBVURJT0RFQ0FQSQkJCXBHZXRBUEk7Ci0JY29uc3QgY2hhcgkJCQkJKmluZmlsZU5hbWUgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIJCQkJCSpvdXRmaWxlTmFtZSA9IE5VTEw7Ci0KLQlyZXR1cm5Db2RlID0gcGFyc2VjbWRsaW5lKGFyZ2MsYXJndiwgJmluZmlsZU5hbWUsICZvdXRmaWxlTmFtZSwgJmFhY3BhcmEpOwotCWlmKHJldHVybkNvZGUpCi0JewotCQlwcmludGYoIiVzIiwgSGVscFN0cmluZyk7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIG9wZW4gaW5wdXQgZmlsZSAqLwotCWluZmlsZSA9IGZvcGVuKGluZmlsZU5hbWUsICJyYiIpOwotCWlmICghaW5maWxlKSB7Ci0JCXByaW50ZigiT3BlbiBpbnB1dCBmaWxlIGZhaWwuLi4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIG9wZW4gb3V0cHV0IGZpbGUgKi8KLQlpZihpc091dHB1dCkKLQl7Ci0JCW91dGZpbGUgPSBmb3BlbihvdXRmaWxlTmFtZSwgIndiIik7Ci0JCWlmICghb3V0ZmlsZSkgewotCQkJcHJpbnRmKCJPcGVuIG91dHB1dCBmaWxlIGZhaWwuLi4iKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQkvLyBzZXQgbWVtb3J5IG9wZXJhdG9yczsKLQltb3Blci5BbGxvYyA9IGNtbk1lbUFsbG9jOwotCW1vcGVyLkNvcHkgPSBjbW5NZW1Db3B5OwotCW1vcGVyLkZyZWUgPSBjbW5NZW1GcmVlOwotCW1vcGVyLlNldCA9IGNtbk1lbVNldDsKLQltb3Blci5DaGVjayA9IGNtbk1lbUNoZWNrOwotCXVzZURhdGEubWVtZmxhZyA9IFZPX0lNRl9VU0VSTUVNT1BFUkFUT1I7Ci0JdXNlRGF0YS5tZW1EYXRhID0gKFZPX1BUUikoJm1vcGVyKTsKLQkvLyBvcGVuIGVuY29kZXIgZGxsOwotCWhhbmRsZSA9IGRsb3BlbigibGlic3RhZ2VmcmlnaHQuc28iLCBSVExEX05PVyk7Ci0JaWYoaGFuZGxlID09IDApCi0JewotCQlwcmludGYoIm9wZW4gZGxsIGVycm9yLi4uLi4uIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JLy8gR2V0IEFQSTsKLQlwZnVuYyA9IGRsc3ltKGhhbmRsZSwgInZvR2V0QUFDRW5jQVBJIik7Ci0JaWYocGZ1bmMgPT0gMCkKLQl7Ci0JCXByaW50Zigib3BlbiBmdW5jdGlvbiBlcnJvci4uLi4uLiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXBHZXRBUEkgPSAoVk9HRVRBVURJT0RFQ0FQSSlwZnVuYzsKLQlyZXR1cm5Db2RlICA9IHBHZXRBUEkoJkF1ZGlvQVBJKTsKLQlpZihyZXR1cm5Db2RlKQotCQlyZXR1cm4gLTE7Ci0KLQotLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICBJbml0IEVuY29kaW5nIFNlY3Rpb24gICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCXJldHVybkNvZGUgPSBBdWRpb0FQSS5Jbml0KCZoQ29kZWMsIFZPX0FVRElPX0NvZGluZ0FBQywgJnVzZURhdGEpOwotCWlmKHJldHVybkNvZGUgPCAwKQotCXsKLQkJcHJpbnRmKCIjIyMjIFZPSV9FcnJvcjI6ZmFpbCB0byBpbml0aWFsaXplIHRoZSBFbmNvZGVyciMjI1xuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR1cm5Db2RlID0gQXVkaW9BUEkuU2V0UGFyYW0oaENvZGVjLCBWT19QSURfQUFDX0VOQ1BBUkFNLCAmYWFjcGFyYSk7Ci0KLQlpbkRhdGEuQnVmZmVyID0gaW5CdWY7Ci0JYnl0ZXNMZWZ0ID0gUmVhZEZpbGUyQnVmKGluZmlsZSxpbkRhdGEuQnVmZmVyLFJFQURfU0laRSk7Ci0KLS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAgIEVuY29kaW5nIFNlY3Rpb24gICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0JZG8gewotCi0JCWluRGF0YS5MZW5ndGggICAgPSBieXRlc0xlZnQ7Ci0JCW91dERhdGEuQnVmZmVyICAgPSBvdXRCdWY7Ci0JCW91dERhdGEuTGVuZ3RoID0gMTAyNCo4OwotCi0JCXQxID0gY2xvY2soKTsKLQotCQlyZXR1cm5Db2RlID0gQXVkaW9BUEkuU2V0SW5wdXREYXRhKGhDb2RlYywmaW5EYXRhKTsKLQotCQlkbyB7Ci0JCQlvdXREYXRhLkJ1ZmZlciAgID0gb3V0QnVmOwotCQkJb3V0RGF0YS5MZW5ndGggPSAxMDI0Kjg7Ci0KLQkJCXJldHVybkNvZGUgPSBBdWRpb0FQSS5HZXRPdXRwdXREYXRhKGhDb2RlYywmb3V0RGF0YSwgJm91dEluZm8pOwotCi0JCQlpZihyZXR1cm5Db2RlID09IDApCi0JCQkJRW5jb2RlcmRGcmFtZSsrOwotCQkJaWYocmV0dXJuQ29kZSA9PSBWT19FUlJfTElDRU5TRV9FUlJPUikKLQkJCQlicmVhazsKLQotI2lmIFZPX0FBQ19FX09VVFBVVAotCQkJaWYgKGlzT3V0cHV0ICYmIHJldHVybkNvZGUgPT0gMCkKLQkJCXsKLQkJCQlmd3JpdGUob3V0RGF0YS5CdWZmZXIsIDEsIG91dERhdGEuTGVuZ3RoLCBvdXRmaWxlKTsKLQkJCX0KLSNlbmRpZgotCQl9IHdoaWxlKHJldHVybkNvZGUgIT0gKFZPX0VSUl9JTlBVVF9CVUZGRVJfU01BTEwpKTsKLQotCQlpZihyZXR1cm5Db2RlID09IFZPX0VSUl9MSUNFTlNFX0VSUk9SKQotCQkJYnJlYWs7Ci0KLQkJdDIgPSBjbG9jaygpOwotCQl0b3RhbCArPSB0MiAtIHQxOwotCi0JCWlmICghZW9mRmlsZSkgewotCQkJblJlYWQgPSBSZWFkRmlsZTJCdWYoaW5maWxlLCBpbkJ1ZixSRUFEX1NJWkUpOwotCQkJYnl0ZXNMZWZ0ID0gblJlYWQ7Ci0JCQlpbkRhdGEuQnVmZmVyID0gaW5CdWY7Ci0JCQlpZiAoZmVvZihpbmZpbGUpKQotCQkJCWVvZkZpbGUgPSAxOwotCQl9Ci0KLQl9IHdoaWxlICghZW9mRmlsZSAmJiByZXR1cm5Db2RlKTsKLQotCi0vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgRW5kIEVuY29kaW5nIFNlY3Rpb24gICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQlyZXR1cm5Db2RlID0gQXVkaW9BUEkuVW5pbml0KGhDb2RlYyk7Ci0KLQlmY2xvc2UoaW5maWxlKTsKLQlpZiAob3V0ZmlsZSkKLSAgICB7Ci0gICAgICAgIGZjbG9zZShvdXRmaWxlKTsKLSAgICB9Ci0JZGxjbG9zZShoYW5kbGUpOwotCXJldHVybiAwOwotfQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9TYW1wbGVDb2RlL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YmE0ZjMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9TYW1wbGVDb2RlL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1jY19iaW5hcnkgewotICAgIG5hbWU6ICJBQUNFbmNUZXN0IiwKLQotICAgIHNyY3M6IFsiQUFDX0VfU0FNUExFUy5jIl0sCi0KLSAgICBhcmNoOiB7Ci0gICAgICAgIGFybTogewotICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fc2V0OiAiYXJtIiwKLSAgICAgICAgfSwKLSAgICB9LAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKLSAgICAgICAgImxpYmRsIiwKLSAgICBdLAotCi0gICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfZW5jX2NvbW1vbiJdLAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9TYW1wbGVDb2RlL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvTk9USUNFIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9TYW1wbGVDb2RlL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViMWVmYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLQotICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzA0Mjk0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIlNvZnRBQUNFbmNvZGVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiU29mdEFBQ0VuY29kZXIuaCIKLQotI2luY2x1ZGUgInZvQUFDLmgiCi0jaW5jbHVkZSAiY21uTWVtb3J5LmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci1zdGF0aWMgdm9pZCBJbml0T01YUGFyYW1zKFQgKnBhcmFtcykgewotICAgIHBhcmFtcy0+blNpemUgPSBzaXplb2YoVCk7Ci0gICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5WZXJzaW9uTWFqb3IgPSAxOwotICAgIHBhcmFtcy0+blZlcnNpb24ucy5uVmVyc2lvbk1pbm9yID0gMDsKLSAgICBwYXJhbXMtPm5WZXJzaW9uLnMublJldmlzaW9uID0gMDsKLSAgICBwYXJhbXMtPm5WZXJzaW9uLnMublN0ZXAgPSAwOwotfQotCi1Tb2Z0QUFDRW5jb2Rlcjo6U29mdEFBQ0VuY29kZXIoCi0gICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKLSAgICAgICAgT01YX1BUUiBhcHBEYXRhLAotICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkKLSAgICA6IFNpbXBsZVNvZnRPTVhDb21wb25lbnQobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAotICAgICAgbUVuY29kZXJIYW5kbGUoTlVMTCksCi0gICAgICBtQXBpSGFuZGxlKE5VTEwpLAotICAgICAgbU1lbU9wZXJhdG9yKE5VTEwpLAotICAgICAgbU51bUNoYW5uZWxzKDEpLAotICAgICAgbVNhbXBsZVJhdGUoNDQxMDApLAotICAgICAgbUJpdFJhdGUoMCksCi0gICAgICBtU2VudENvZGVjU3BlY2lmaWNEYXRhKGZhbHNlKSwKLSAgICAgIG1JbnB1dFNpemUoMCksCi0gICAgICBtSW5wdXRGcmFtZShOVUxMKSwKLSAgICAgIG1JbnB1dFRpbWVVcygtMWxsKSwKLSAgICAgIG1TYXdJbnB1dEVPUyhmYWxzZSksCi0gICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpIHsKLSAgICBpbml0UG9ydHMoKTsKLSAgICBDSEVDS19FUShpbml0RW5jb2RlcigpLCAoc3RhdHVzX3QpT0spOwotCi0gICAgc2V0QXVkaW9QYXJhbXMoKTsKLX0KLQotU29mdEFBQ0VuY29kZXI6On5Tb2Z0QUFDRW5jb2RlcigpIHsKLSAgICBvblJlc2V0KCk7Ci0KLSAgICBpZiAobUVuY29kZXJIYW5kbGUpIHsKLSAgICAgICAgQ0hFQ0tfRVEoKFZPX1UzMilWT19FUlJfTk9ORSwgbUFwaUhhbmRsZS0+VW5pbml0KG1FbmNvZGVySGFuZGxlKSk7Ci0gICAgICAgIG1FbmNvZGVySGFuZGxlID0gTlVMTDsKLSAgICB9Ci0KLSAgICBkZWxldGUgbUFwaUhhbmRsZTsKLSAgICBtQXBpSGFuZGxlID0gTlVMTDsKLQotICAgIGRlbGV0ZSBtTWVtT3BlcmF0b3I7Ci0gICAgbU1lbU9wZXJhdG9yID0gTlVMTDsKLX0KLQotdm9pZCBTb2Z0QUFDRW5jb2Rlcjo6aW5pdFBvcnRzKCkgewotICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgZGVmOwotICAgIEluaXRPTVhQYXJhbXMoJmRlZik7Ci0KLSAgICBkZWYublBvcnRJbmRleCA9IDA7Ci0gICAgZGVmLmVEaXIgPSBPTVhfRGlySW5wdXQ7Ci0gICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1CdWZmZXJzOwotICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOwotICAgIGRlZi5uQnVmZmVyU2l6ZSA9IGtOdW1TYW1wbGVzUGVyRnJhbWUgKiBzaXplb2YoaW50MTZfdCkgKiAyOwotICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOwotICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOwotICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5BdWRpbzsKLSAgICBkZWYuYkJ1ZmZlcnNDb250aWd1b3VzID0gT01YX0ZBTFNFOwotICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gMTsKLQotICAgIGRlZi5mb3JtYXQuYXVkaW8uY01JTUVUeXBlID0gY29uc3RfY2FzdDxjaGFyICo+KCJhdWRpby9yYXciKTsKLSAgICBkZWYuZm9ybWF0LmF1ZGlvLnBOYXRpdmVSZW5kZXIgPSBOVUxMOwotICAgIGRlZi5mb3JtYXQuYXVkaW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOwotICAgIGRlZi5mb3JtYXQuYXVkaW8uZUVuY29kaW5nID0gT01YX0FVRElPX0NvZGluZ1BDTTsKLQotICAgIGFkZFBvcnQoZGVmKTsKLQotICAgIGRlZi5uUG9ydEluZGV4ID0gMTsKLSAgICBkZWYuZURpciA9IE9NWF9EaXJPdXRwdXQ7Ci0gICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1CdWZmZXJzOwotICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOwotICAgIGRlZi5uQnVmZmVyU2l6ZSA9IDgxOTI7Ci0gICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7Ci0gICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7Ci0gICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpbkF1ZGlvOwotICAgIGRlZi5iQnVmZmVyc0NvbnRpZ3VvdXMgPSBPTVhfRkFMU0U7Ci0gICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSAyOwotCi0gICAgZGVmLmZvcm1hdC5hdWRpby5jTUlNRVR5cGUgPSBjb25zdF9jYXN0PGNoYXIgKj4oImF1ZGlvL2FhYyIpOwotICAgIGRlZi5mb3JtYXQuYXVkaW8ucE5hdGl2ZVJlbmRlciA9IE5VTEw7Ci0gICAgZGVmLmZvcm1hdC5hdWRpby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfRkFMU0U7Ci0gICAgZGVmLmZvcm1hdC5hdWRpby5lRW5jb2RpbmcgPSBPTVhfQVVESU9fQ29kaW5nQUFDOwotCi0gICAgYWRkUG9ydChkZWYpOwotfQotCi1zdGF0dXNfdCBTb2Z0QUFDRW5jb2Rlcjo6aW5pdEVuY29kZXIoKSB7Ci0gICAgbUFwaUhhbmRsZSA9IG5ldyBWT19BVURJT19DT0RFQ0FQSTsKLQotICAgIGlmIChWT19FUlJfTk9ORSAhPSB2b0dldEFBQ0VuY0FQSShtQXBpSGFuZGxlKSkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBhcGkgaGFuZGxlIik7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIG1NZW1PcGVyYXRvciA9IG5ldyBWT19NRU1fT1BFUkFUT1I7Ci0gICAgbU1lbU9wZXJhdG9yLT5BbGxvYyA9IGNtbk1lbUFsbG9jOwotICAgIG1NZW1PcGVyYXRvci0+Q29weSA9IGNtbk1lbUNvcHk7Ci0gICAgbU1lbU9wZXJhdG9yLT5GcmVlID0gY21uTWVtRnJlZTsKLSAgICBtTWVtT3BlcmF0b3ItPlNldCA9IGNtbk1lbVNldDsKLSAgICBtTWVtT3BlcmF0b3ItPkNoZWNrID0gY21uTWVtQ2hlY2s7Ci0KLSAgICBWT19DT0RFQ19JTklUX1VTRVJEQVRBIHVzZXJEYXRhOwotICAgIG1lbXNldCgmdXNlckRhdGEsIDAsIHNpemVvZih1c2VyRGF0YSkpOwotICAgIHVzZXJEYXRhLm1lbWZsYWcgPSBWT19JTUZfVVNFUk1FTU9QRVJBVE9SOwotICAgIHVzZXJEYXRhLm1lbURhdGEgPSAoVk9fUFRSKSBtTWVtT3BlcmF0b3I7Ci0gICAgaWYgKFZPX0VSUl9OT05FICE9Ci0gICAgICAgICAgICBtQXBpSGFuZGxlLT5Jbml0KCZtRW5jb2RlckhhbmRsZSwgVk9fQVVESU9fQ29kaW5nQUFDLCAmdXNlckRhdGEpKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdCBBQUMgZW5jb2RlciIpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLU9NWF9FUlJPUlRZUEUgU29mdEFBQ0VuY29kZXI6OmludGVybmFsR2V0UGFyYW1ldGVyKAotICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgewotICAgIHN3aXRjaCAoaW5kZXgpIHsKLSAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdDoKLSAgICAgICAgewotICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpmb3JtYXRQYXJhbXMgPQotICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilwYXJhbXM7Ci0KLSAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGZvcm1hdFBhcmFtcykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4gMSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5JbmRleCA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVFbmNvZGluZyA9Ci0gICAgICAgICAgICAgICAgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSAwKQotICAgICAgICAgICAgICAgICAgICA/IE9NWF9BVURJT19Db2RpbmdQQ00gOiBPTVhfQVVESU9fQ29kaW5nQUFDOwotCi0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0FhYzoKLSAgICAgICAgewotICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFICphYWNQYXJhbXMgPQotICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUgKilwYXJhbXM7Ci0KLSAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGFhY1BhcmFtcykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYWFjUGFyYW1zLT5uUG9ydEluZGV4ICE9IDEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhYWNQYXJhbXMtPm5CaXRSYXRlID0gbUJpdFJhdGU7Ci0gICAgICAgICAgICBhYWNQYXJhbXMtPm5BdWRpb0JhbmRXaWR0aCA9IDA7Ci0gICAgICAgICAgICBhYWNQYXJhbXMtPm5BQUN0b29scyA9IDA7Ci0gICAgICAgICAgICBhYWNQYXJhbXMtPm5BQUNFUnRvb2xzID0gMDsKLSAgICAgICAgICAgIGFhY1BhcmFtcy0+ZUFBQ1Byb2ZpbGUgPSBPTVhfQVVESU9fQUFDT2JqZWN0TWFpbjsKLSAgICAgICAgICAgIGFhY1BhcmFtcy0+ZUFBQ1N0cmVhbUZvcm1hdCA9IE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRNUDRGRjsKLSAgICAgICAgICAgIGFhY1BhcmFtcy0+ZUNoYW5uZWxNb2RlID0gT01YX0FVRElPX0NoYW5uZWxNb2RlU3RlcmVvOwotCi0gICAgICAgICAgICBhYWNQYXJhbXMtPm5DaGFubmVscyA9IG1OdW1DaGFubmVsczsKLSAgICAgICAgICAgIGFhY1BhcmFtcy0+blNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKLSAgICAgICAgICAgIGFhY1BhcmFtcy0+bkZyYW1lTGVuZ3RoID0gMDsKLQotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9QY206Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KLSAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICopcGFyYW1zOwotCi0gICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShwY21QYXJhbXMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcGNtUGFyYW1zLT5lTnVtRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkOwotICAgICAgICAgICAgcGNtUGFyYW1zLT5lRW5kaWFuID0gT01YX0VuZGlhbkJpZzsKLSAgICAgICAgICAgIHBjbVBhcmFtcy0+YkludGVybGVhdmVkID0gT01YX1RSVUU7Ci0gICAgICAgICAgICBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPSAxNjsKLSAgICAgICAgICAgIHBjbVBhcmFtcy0+ZVBDTU1vZGUgPSBPTVhfQVVESU9fUENNTW9kZUxpbmVhcjsKLSAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzBdID0gT01YX0FVRElPX0NoYW5uZWxMRjsKLSAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzFdID0gT01YX0FVRElPX0NoYW5uZWxSRjsKLQotICAgICAgICAgICAgcGNtUGFyYW1zLT5uQ2hhbm5lbHMgPSBtTnVtQ2hhbm5lbHM7Ci0gICAgICAgICAgICBwY21QYXJhbXMtPm5TYW1wbGluZ1JhdGUgPSBtU2FtcGxlUmF0ZTsKLQotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsR2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOwotICAgIH0KLX0KLQotT01YX0VSUk9SVFlQRSBTb2Z0QUFDRW5jb2Rlcjo6aW50ZXJuYWxTZXRQYXJhbWV0ZXIoCi0gICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSB7Ci0gICAgc3dpdGNoIChpbmRleCkgewotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKnJvbGVQYXJhbXMgPQotICAgICAgICAgICAgICAgIChjb25zdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKilwYXJhbXM7Ci0KLSAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKHJvbGVQYXJhbXMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHN0cm5jbXAoKGNvbnN0IGNoYXIgKilyb2xlUGFyYW1zLT5jUm9sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpb19lbmNvZGVyLmFhYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRSAtIDEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0OgotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKLQotICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oZm9ybWF0UGFyYW1zKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPiAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKChmb3JtYXRQYXJhbXMtPm5Qb3J0SW5kZXggPT0gMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0UGFyYW1zLT5lRW5jb2RpbmcgIT0gT01YX0FVRElPX0NvZGluZ1BDTSkKLSAgICAgICAgICAgICAgICB8fCAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID09IDEKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFBhcmFtcy0+ZUVuY29kaW5nICE9IE9NWF9BVURJT19Db2RpbmdBQUMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BYWM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRSAqYWFjUGFyYW1zID0KLSAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFICopcGFyYW1zOwotCi0gICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShhYWNQYXJhbXMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGFhY1BhcmFtcy0+blBvcnRJbmRleCAhPSAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUJpdFJhdGUgPSBhYWNQYXJhbXMtPm5CaXRSYXRlOwotICAgICAgICAgICAgbU51bUNoYW5uZWxzID0gYWFjUGFyYW1zLT5uQ2hhbm5lbHM7Ci0gICAgICAgICAgICBtU2FtcGxlUmF0ZSA9IGFhY1BhcmFtcy0+blNhbXBsZVJhdGU7Ci0KLSAgICAgICAgICAgIGlmIChzZXRBdWRpb1BhcmFtcygpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9QY206Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqcGNtUGFyYW1zID0KLSAgICAgICAgICAgICAgICAoT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFICopcGFyYW1zOwotCi0gICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShwY21QYXJhbXMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+blBvcnRJbmRleCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbU51bUNoYW5uZWxzID0gcGNtUGFyYW1zLT5uQ2hhbm5lbHM7Ci0gICAgICAgICAgICBtU2FtcGxlUmF0ZSA9IHBjbVBhcmFtcy0+blNhbXBsaW5nUmF0ZTsKLQotICAgICAgICAgICAgaWYgKHNldEF1ZGlvUGFyYW1zKCkgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbFNldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFNvZnRBQUNFbmNvZGVyOjpzZXRBdWRpb1BhcmFtcygpIHsKLSAgICAvLyBXZSBjYWxsIHRoaXMgd2hlbmV2ZXIgc2FtcGxlIHJhdGUsIG51bWJlciBvZiBjaGFubmVscyBvciBiaXRyYXRlIGNoYW5nZQotICAgIC8vIGluIHJlcG9uc2UgdG8gc2V0UGFyYW1ldGVyIGNhbGxzLgotCi0gICAgQUxPR1YoInNldEF1ZGlvUGFyYW1zOiAldSBIeiwgJXUgY2hhbm5lbHMsICV1IGJwcyIsCi0gICAgICAgICBtU2FtcGxlUmF0ZSwgbU51bUNoYW5uZWxzLCBtQml0UmF0ZSk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBzZXRBdWRpb1NwZWNpZmljQ29uZmlnRGF0YSgpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIEFBQ0VOQ19QQVJBTSBwYXJhbXM7Ci0gICAgbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTsKLSAgICBwYXJhbXMuc2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOwotICAgIHBhcmFtcy5iaXRSYXRlID0gbUJpdFJhdGU7Ci0gICAgcGFyYW1zLm5DaGFubmVscyA9IG1OdW1DaGFubmVsczsKLSAgICBwYXJhbXMuYWR0c1VzZWQgPSAwOyAgLy8gV2UgYWRkIGFkdHMgaGVhZGVyIGluIHRoZSBmaWxlIHdyaXRlciBpZiBuZWVkZWQuCi0gICAgaWYgKFZPX0VSUl9OT05FICE9IG1BcGlIYW5kbGUtPlNldFBhcmFtKAotICAgICAgICAgICAgICAgIG1FbmNvZGVySGFuZGxlLCBWT19QSURfQUFDX0VOQ1BBUkFNLCAgJnBhcmFtcykpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgQUFDIGVuY29kZXIgcGFyYW1ldGVycyIpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXRpYyBzdGF0dXNfdCBnZXRTYW1wbGVSYXRlVGFibGVJbmRleChpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgJmluZGV4KSB7Ci0gICAgc3RhdGljIGNvbnN0IGludDMyX3Qga1NhbXBsZVJhdGVUYWJsZVtdID0gewotICAgICAgICA5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsIDMyMDAwLAotICAgICAgICAyNDAwMCwgMjIwNTAsIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAKLSAgICB9OwotICAgIGNvbnN0IGludDMyX3QgdGFibGVTaXplID0KLSAgICAgICAgc2l6ZW9mKGtTYW1wbGVSYXRlVGFibGUpIC8gc2l6ZW9mKGtTYW1wbGVSYXRlVGFibGVbMF0pOwotCi0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgdGFibGVTaXplOyArK2kpIHsKLSAgICAgICAgaWYgKHNhbXBsZVJhdGUgPT0ga1NhbXBsZVJhdGVUYWJsZVtpXSkgewotICAgICAgICAgICAgaW5kZXggPSBpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci19Ci0KLXN0YXR1c190IFNvZnRBQUNFbmNvZGVyOjpzZXRBdWRpb1NwZWNpZmljQ29uZmlnRGF0YSgpIHsKLSAgICAvLyBUaGUgQUFDIGVuY29kZXIncyBhdWRpbyBzcGVjaWZpYyBjb25maWcgcmVhbGx5IG9ubHkgZW5jb2RlcwotICAgIC8vIG51bWJlciBvZiBjaGFubmVscyBhbmQgdGhlIHNhbXBsZSByYXRlIChtYXBwZWQgdG8gYW4gaW5kZXggaW50bwotICAgIC8vIGEgZml4ZWQgc2FtcGxlIHJhdGUgdGFibGUpLgotCi0gICAgaW50MzJfdCBpbmRleDsKLSAgICBzdGF0dXNfdCBlcnIgPSBnZXRTYW1wbGVSYXRlVGFibGVJbmRleChtU2FtcGxlUmF0ZSwgaW5kZXgpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIHNhbXBsZSByYXRlICgldSBIeikiLCBtU2FtcGxlUmF0ZSk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKG1OdW1DaGFubmVscyA+IDIgfHwgbU51bUNoYW5uZWxzIDw9IDApIHsKLSAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIG51bWJlciBvZiBjaGFubmVscygldSkiLCBtTnVtQ2hhbm5lbHMpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICAvLyBPTVhfQVVESU9fQUFDT2JqZWN0TEMKLSAgICBtQXVkaW9TcGVjaWZpY0NvbmZpZ0RhdGFbMF0gPSAoKDB4MDIgPDwgMykgfCAoaW5kZXggPj4gMSkpOwotICAgIG1BdWRpb1NwZWNpZmljQ29uZmlnRGF0YVsxXSA9ICgoaW5kZXggJiAweDAxKSA8PCA3KSB8IChtTnVtQ2hhbm5lbHMgPDwgMyk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgU29mdEFBQ0VuY29kZXI6Om9uUXVldWVGaWxsZWQoT01YX1UzMiAvKnBvcnRJbmRleCovKSB7Ci0gICAgaWYgKG1TaWduYWxsZWRFcnJvcikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOwotICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7Ci0KLSAgICBpZiAoIW1TZW50Q29kZWNTcGVjaWZpY0RhdGEpIHsKLSAgICAgICAgLy8gVGhlIHZlcnkgZmlyc3QgdGhpbmcgd2Ugd2FudCB0byBvdXRwdXQgaXMgdGhlIGNvZGVjIHNwZWNpZmljCi0gICAgICAgIC8vIGRhdGEuIEl0IGRvZXMgbm90IHJlcXVpcmUgYW55IGlucHV0IGRhdGEgYnV0IHdlIHdpbGwgbmVlZCBhbgotICAgICAgICAvLyBvdXRwdXQgYnVmZmVyIHRvIHN0b3JlIGl0IGluLgotCi0gICAgICAgIGlmIChvdXRRdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOwotICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSBzaXplb2YobUF1ZGlvU3BlY2lmaWNDb25maWdEYXRhKTsKLSAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRzsKLQotICAgICAgICB1aW50OF90ICpvdXQgPSBvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQ7Ci0gICAgICAgIG1lbWNweShvdXQsIG1BdWRpb1NwZWNpZmljQ29uZmlnRGF0YSwgc2l6ZW9mKG1BdWRpb1NwZWNpZmljQ29uZmlnRGF0YSkpOwotCi0jaWYgMAotICAgICAgICBBTE9HSSgic2VuZGluZyBjb2RlYyBzcGVjaWZpYyBkYXRhLiIpOwotICAgICAgICBoZXhkdW1wKG91dCwgc2l6ZW9mKG1BdWRpb1NwZWNpZmljQ29uZmlnRGF0YSkpOwotI2VuZGlmCi0KLSAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7Ci0gICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKLQotICAgICAgICBtU2VudENvZGVjU3BlY2lmaWNEYXRhID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBzaXplX3QgbnVtQnl0ZXNQZXJJbnB1dEZyYW1lID0KLSAgICAgICAgbU51bUNoYW5uZWxzICoga051bVNhbXBsZXNQZXJGcmFtZSAqIHNpemVvZihpbnQxNl90KTsKLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgLy8gV2UgZG8gdGhlIGZvbGxvd2luZyB1bnRpbCB3ZSBydW4gb3V0IG9mIGJ1ZmZlcnMuCi0KLSAgICAgICAgd2hpbGUgKG1JbnB1dFNpemUgPCBudW1CeXRlc1BlcklucHV0RnJhbWUpIHsKLSAgICAgICAgICAgIC8vIEFzIGxvbmcgYXMgdGhlcmUncyBzdGlsbCBpbnB1dCBkYXRhIHRvIGJlIHJlYWQgd2UKLSAgICAgICAgICAgIC8vIHdpbGwgZHJhaW4gImtOdW1TYW1wbGVzUGVyRnJhbWUgKiBtTnVtQ2hhbm5lbHMiIHNhbXBsZXMKLSAgICAgICAgICAgIC8vIGludG8gdGhlICJtSW5wdXRGcmFtZSIgYnVmZmVyIGFuZCB0aGVuIGVuY29kZSB0aG9zZQotICAgICAgICAgICAgLy8gYXMgYSB1bml0IGludG8gYW4gb3V0cHV0IGJ1ZmZlci4KLQotICAgICAgICAgICAgaWYgKG1TYXdJbnB1dEVPUyB8fCBpblF1ZXVlLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7Ci0KLSAgICAgICAgICAgIGNvbnN0IHZvaWQgKmluRGF0YSA9IGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7Ci0KLSAgICAgICAgICAgIHNpemVfdCBjb3B5ID0gbnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUlucHV0U2l6ZTsKLSAgICAgICAgICAgIGlmIChjb3B5ID4gaW5IZWFkZXItPm5GaWxsZWRMZW4pIHsKLSAgICAgICAgICAgICAgICBjb3B5ID0gaW5IZWFkZXItPm5GaWxsZWRMZW47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtSW5wdXRGcmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbUlucHV0RnJhbWUgPSBuZXcgaW50MTZfdFtrTnVtU2FtcGxlc1BlckZyYW1lICogbU51bUNoYW5uZWxzXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1JbnB1dFNpemUgPT0gMCkgewotICAgICAgICAgICAgICAgIG1JbnB1dFRpbWVVcyA9IGluSGVhZGVyLT5uVGltZVN0YW1wOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtZW1jcHkoKHVpbnQ4X3QgKiltSW5wdXRGcmFtZSArIG1JbnB1dFNpemUsIGluRGF0YSwgY29weSk7Ci0gICAgICAgICAgICBtSW5wdXRTaXplICs9IGNvcHk7Ci0KLSAgICAgICAgICAgIGluSGVhZGVyLT5uT2Zmc2V0ICs9IGNvcHk7Ci0gICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiAtPSBjb3B5OwotCi0gICAgICAgICAgICAvLyAiVGltZSIgb24gdGhlIGlucHV0IGJ1ZmZlciBoYXMgaW4gZWZmZWN0IGFkdmFuY2VkIGJ5IHRoZQotICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyB3ZSBqdXN0IGFkdmFuY2VkIG5PZmZzZXQgYnkuCi0gICAgICAgICAgICBpbkhlYWRlci0+blRpbWVTdGFtcCArPQotICAgICAgICAgICAgICAgIChjb3B5ICogMTAwMDAwMGxsIC8gbVNhbXBsZVJhdGUpCi0gICAgICAgICAgICAgICAgICAgIC8gKG1OdW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KSk7Ci0KLSAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoInNhdyBpbnB1dCBFT1MiKTsKLSAgICAgICAgICAgICAgICAgICAgbVNhd0lucHV0RU9TID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBQYWQgYW55IHJlbWFpbmluZyBkYXRhIHdpdGggemVyb2VzLgotICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHVpbnQ4X3QgKiltSW5wdXRGcmFtZSArIG1JbnB1dFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUlucHV0U2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUlucHV0U2l6ZSA9IG51bUJ5dGVzUGVySW5wdXRGcmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbm90aWZ5RW1wdHlCdWZmZXJEb25lKGluSGVhZGVyKTsKLQotICAgICAgICAgICAgICAgIGluRGF0YSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIGluSW5mbyA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBdCB0aGlzICBwb2ludCB3ZSBoYXZlIGFsbCB0aGUgaW5wdXQgZGF0YSBuZWNlc3NhcnkgdG8gZW5jb2RlCi0gICAgICAgIC8vIGEgc2luZ2xlIGZyYW1lLCBhbGwgd2UgbmVlZCBpcyBhbiBvdXRwdXQgYnVmZmVyIHRvIHN0b3JlIHRoZSByZXN1bHQKLSAgICAgICAgLy8gaW4uCi0KLSAgICAgICAgaWYgKG91dFF1ZXVlLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7Ci0KLSAgICAgICAgVk9fQ09ERUNCVUZGRVIgaW5wdXREYXRhOwotICAgICAgICBtZW1zZXQoJmlucHV0RGF0YSwgMCwgc2l6ZW9mKGlucHV0RGF0YSkpOwotICAgICAgICBpbnB1dERhdGEuQnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKiltSW5wdXRGcmFtZTsKLSAgICAgICAgaW5wdXREYXRhLkxlbmd0aCA9IG51bUJ5dGVzUGVySW5wdXRGcmFtZTsKLSAgICAgICAgQ0hFQ0soKFZPX1UzMilWT19FUlJfTk9ORSA9PQotICAgICAgICAgICAgICAgIG1BcGlIYW5kbGUtPlNldElucHV0RGF0YShtRW5jb2RlckhhbmRsZSwgJmlucHV0RGF0YSkpOwotCi0gICAgICAgIFZPX0NPREVDQlVGRkVSIG91dHB1dERhdGE7Ci0gICAgICAgIG1lbXNldCgmb3V0cHV0RGF0YSwgMCwgc2l6ZW9mKG91dHB1dERhdGEpKTsKLSAgICAgICAgVk9fQVVESU9fT1VUUFVUSU5GTyBvdXRwdXRJbmZvOwotICAgICAgICBtZW1zZXQoJm91dHB1dEluZm8sIDAsIHNpemVvZihvdXRwdXRJbmZvKSk7Ci0KLSAgICAgICAgdWludDhfdCAqb3V0UHRyID0gKHVpbnQ4X3QgKilvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQ7Ci0gICAgICAgIHNpemVfdCBvdXRBdmFpbGFibGUgPSBvdXRIZWFkZXItPm5BbGxvY0xlbiAtIG91dEhlYWRlci0+bk9mZnNldDsKLQotICAgICAgICBWT19VMzIgcmV0ID0gVk9fRVJSX05PTkU7Ci0gICAgICAgIHNpemVfdCBuT3V0cHV0Qnl0ZXMgPSAwOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBvdXRwdXREYXRhLkJ1ZmZlciA9IG91dFB0cjsKLSAgICAgICAgICAgIG91dHB1dERhdGEuTGVuZ3RoID0gb3V0QXZhaWxhYmxlIC0gbk91dHB1dEJ5dGVzOwotICAgICAgICAgICAgcmV0ID0gbUFwaUhhbmRsZS0+R2V0T3V0cHV0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAgbUVuY29kZXJIYW5kbGUsICZvdXRwdXREYXRhLCAmb3V0cHV0SW5mbyk7Ci0gICAgICAgICAgICBpZiAocmV0ID09IFZPX0VSUl9OT05FKSB7Ci0gICAgICAgICAgICAgICAgb3V0UHRyICs9IG91dHB1dERhdGEuTGVuZ3RoOwotICAgICAgICAgICAgICAgIG5PdXRwdXRCeXRlcyArPSBvdXRwdXREYXRhLkxlbmd0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAocmV0ICE9IFZPX0VSUl9JTlBVVF9CVUZGRVJfU01BTEwpOwotCi0gICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IG5PdXRwdXRCeXRlczsKLQotICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0VORE9GRlJBTUU7Ci0KLSAgICAgICAgaWYgKG1TYXdJbnB1dEVPUykgewotICAgICAgICAgICAgLy8gV2UgYWxzbyB0YWcgdGhpcyBvdXRwdXQgYnVmZmVyIHdpdGggRU9TIGlmIGl0IGNvcnJlc3BvbmRzCi0gICAgICAgICAgICAvLyB0byB0aGUgZmluYWwgaW5wdXQgYnVmZmVyLgotICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSBtSW5wdXRUaW1lVXM7Ci0KLSNpZiAwCi0gICAgICAgIEFMT0dJKCJzZW5kaW5nICVkIGJ5dGVzIG9mIGRhdGEgKHRpbWUgPSAlbGxkIHVzLCBmbGFncyA9IDB4JTA4bHgpIiwKLSAgICAgICAgICAgICAgbk91dHB1dEJ5dGVzLCBtSW5wdXRUaW1lVXMsIG91dEhlYWRlci0+bkZsYWdzKTsKLQotICAgICAgICBoZXhkdW1wKG91dEhlYWRlci0+cEJ1ZmZlciArIG91dEhlYWRlci0+bk9mZnNldCwgb3V0SGVhZGVyLT5uRmlsbGVkTGVuKTsKLSNlbmRpZgotCi0gICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOwotICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7Ci0KLSAgICAgICAgb3V0SGVhZGVyID0gTlVMTDsKLSAgICAgICAgb3V0SW5mbyA9IE5VTEw7Ci0KLSAgICAgICAgbUlucHV0U2l6ZSA9IDA7Ci0gICAgfQotfQotCi12b2lkIFNvZnRBQUNFbmNvZGVyOjpvblJlc2V0KCkgewotICAgIGRlbGV0ZVtdIG1JbnB1dEZyYW1lOwotICAgIG1JbnB1dEZyYW1lID0gTlVMTDsKLSAgICBtSW5wdXRTaXplID0gMDsKLQotICAgIG1TZW50Q29kZWNTcGVjaWZpY0RhdGEgPSBmYWxzZTsKLSAgICBtSW5wdXRUaW1lVXMgPSAtMWxsOwotICAgIG1TYXdJbnB1dEVPUyA9IGZhbHNlOwotICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi1hbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50ICpjcmVhdGVTb2Z0T01YQ29tcG9uZW50KAotICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCi0gICAgICAgIE9NWF9QVFIgYXBwRGF0YSwgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpIHsKLSAgICByZXR1cm4gbmV3IGFuZHJvaWQ6OlNvZnRBQUNFbmNvZGVyKG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY0YzFiNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBTT0ZUX0FBQ19FTkNPREVSX0hfCi0KLSNkZWZpbmUgU09GVF9BQUNfRU5DT0RFUl9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaD4KLQotc3RydWN0IFZPX0FVRElPX0NPREVDQVBJOwotc3RydWN0IFZPX01FTV9PUEVSQVRPUjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgU29mdEFBQ0VuY29kZXIgOiBwdWJsaWMgU2ltcGxlU29mdE9NWENvbXBvbmVudCB7Ci0gICAgU29mdEFBQ0VuY29kZXIoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAotICAgICAgICAgICAgT01YX1BUUiBhcHBEYXRhLAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+U29mdEFBQ0VuY29kZXIoKTsKLQotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbEdldFBhcmFtZXRlcigKLSAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKTsKLQotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldFBhcmFtZXRlcigKLSAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKLQotICAgIHZpcnR1YWwgdm9pZCBvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKLQotICAgIHZpcnR1YWwgdm9pZCBvblJlc2V0KCk7Ci0KLXByaXZhdGU6Ci0gICAgZW51bSB7Ci0gICAgICAgIGtOdW1CdWZmZXJzICAgICAgICAgICAgID0gNCwKLSAgICAgICAga051bVNhbXBsZXNQZXJGcmFtZSAgICAgPSAxMDI0LAotICAgIH07Ci0KLSAgICB2b2lkICptRW5jb2RlckhhbmRsZTsKLSAgICBWT19BVURJT19DT0RFQ0FQSSAqbUFwaUhhbmRsZTsKLSAgICBWT19NRU1fT1BFUkFUT1IgICptTWVtT3BlcmF0b3I7Ci0KLSAgICBPTVhfVTMyIG1OdW1DaGFubmVsczsKLSAgICBPTVhfVTMyIG1TYW1wbGVSYXRlOwotICAgIE9NWF9VMzIgbUJpdFJhdGU7Ci0KLSAgICBib29sIG1TZW50Q29kZWNTcGVjaWZpY0RhdGE7Ci0gICAgc2l6ZV90IG1JbnB1dFNpemU7Ci0gICAgaW50MTZfdCAqbUlucHV0RnJhbWU7Ci0gICAgaW50NjRfdCBtSW5wdXRUaW1lVXM7Ci0KLSAgICBib29sIG1TYXdJbnB1dEVPUzsKLQotICAgIHVpbnQ4X3QgbUF1ZGlvU3BlY2lmaWNDb25maWdEYXRhWzJdOwotCi0gICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7Ci0KLSAgICB2b2lkIGluaXRQb3J0cygpOwotICAgIHN0YXR1c190IGluaXRFbmNvZGVyKCk7Ci0KLSAgICBzdGF0dXNfdCBzZXRBdWRpb1NwZWNpZmljQ29uZmlnRGF0YSgpOwotICAgIHN0YXR1c190IHNldEF1ZGlvUGFyYW1zKCk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb2Z0QUFDRW5jb2Rlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIFNPRlRfQUFDX0VOQ09ERVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3AvYmFzaWNfb3AuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3AvYmFzaWNfb3AuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJjNzUzYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL2Jhc2ljX29wLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTY4ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJYmFzaWNvcDIuaAotCi0JQ29udGVudDoJQ29uc3RhbnRzICwgR2xvYmFscyBhbmQgQmFzaWMgYXJpdGhtZXRpYyBvcGVyYXRvcnMuCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19CQVNJQ19PUF9ICi0jZGVmaW5lIF9fQkFTSUNfT1BfSAotCi0jaW5jbHVkZSAidHlwZWRlZi5oIgotCi0jZGVmaW5lIE1BWF8zMiAoV29yZDMyKTB4N2ZmZmZmZmZMCi0jZGVmaW5lIE1JTl8zMiAoV29yZDMyKTB4ODAwMDAwMDBMCi0KLSNkZWZpbmUgTUFYXzE2IChXb3JkMTYpMHg3ZmZmCi0jZGVmaW5lIE1JTl8xNiAoV29yZDE2KTB4ODAwMAotI2RlZmluZSBBQlMoYSkJKChhKSA+PSAwKSA/IChhKSA6ICgtKGEpKQotCi0vKiBTaG9ydCBhYnMsICAgICAgICAgICAxICAgKi8KLSNkZWZpbmUgYWJzX3MoeCkgICAgICAgKChXb3JkMTYpKCgoeCkgIT0gTUlOXzE2KSA/ICgoKHgpID49IDApID8gKHgpIDogKC0oeCkpKSA6IE1BWF8xNikpCi0KLS8qIDE2IGJpdCB2YXIxIC0+IE1TQiwgICAgIDIgKi8KLSNkZWZpbmUgTF9kZXBvc2l0X2goeCkgKCgoV29yZDMyKSh4KSkgPDwgMTYpCi0KLQotLyogMTYgYml0IHZhcjEgLT4gTFNCLCAgICAgMiAqLwotI2RlZmluZSBMX2RlcG9zaXRfbCh4KSAoKFdvcmQzMikoeCkpCi0KLQotLyogTG9uZyBhYnMsICAgICAgICAgICAgICAzICAqLwotI2RlZmluZSBMX2Ficyh4KSAoKCh4KSAhPSBNSU5fMzIpID8gKCgoeCkgPj0gMCkgPyAoeCkgOiAoLSh4KSkpIDogTUFYXzMyKQotCi0KLS8qIFNob3J0IG5lZ2F0ZSwgICAgICAgIDEgICAqLwotI2RlZmluZSBuZWdhdGUodmFyMSkgKChXb3JkMTYpKCgodmFyMSkgPT0gTUlOXzE2KSA/IE1BWF8xNiA6ICgtKHZhcjEpKSkpCi0KLQotLyogTG9uZyBuZWdhdGUsICAgICAyICovCi0jZGVmaW5lIExfbmVnYXRlKExfdmFyMSkgKCgoTF92YXIxKSA9PSAoTUlOXzMyKSkgPyAoTUFYXzMyKSA6ICgtKExfdmFyMSkpKQotCi0KLSNkZWZpbmUgTVVMSElHSChBLEIpIChpbnQpKCgoV29yZDY0KShBKSooV29yZDY0KShCKSkgPj4gMzIpCi0jZGVmaW5lIGZpeG11bChhLCBiKSAoaW50KSgoKChXb3JkNjQpKGEpKihXb3JkNjQpKGIpKSA+PiAzMikgPDwgMSkKLQotCi0jaWYgIChTQVRSVUFURV9JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMTYgc2F0dXJhdGUoV29yZDMyIExfdmFyMSk7Ci0jZWxzZQotV29yZDE2IHNhdHVyYXRlKFdvcmQzMiBMX3ZhcjEpOwotI2VuZGlmCi0KLS8qIFNob3J0IHNoaWZ0IGxlZnQsICAgIDEgICAqLwotI2lmIChTSExfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IHNobCAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbHNlCi1Xb3JkMTYgc2hsIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwotI2VuZGlmCi0KLS8qIFNob3J0IHNoaWZ0IHJpZ2h0LCAgIDEgICAqLwotI2lmIChTSFJfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IHNociAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbHNlCi1Xb3JkMTYgc2hyIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwotI2VuZGlmCi0KLSNpZiAoTF9NVUxUX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQzMiBMX211bHQoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbHNlCi1Xb3JkMzIgTF9tdWx0KFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7Ci0jZW5kaWYKLQotLyogTXN1LCAgMSAgKi8KLSNpZiAoTF9NU1VfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDMyIExfbXN1IChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwotI2Vsc2UKLVdvcmQzMiBMX21zdSAoV29yZDMyIExfdmFyMywgV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbmRpZgotCi0vKiBMb25nIHN1YiwgICAgICAgIDIgKi8KLSNpZiAoTF9TVUJfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDMyIExfc3ViKFdvcmQzMiBMX3ZhcjEsIFdvcmQzMiBMX3ZhcjIpOwotI2Vsc2UKLVdvcmQzMiBMX3N1YihXb3JkMzIgTF92YXIxLCBXb3JkMzIgTF92YXIyKTsKLSNlbmRpZgotCi0vKiBMb25nIHNoaWZ0IGxlZnQsIDIgKi8KLSNpZiAoTF9TSExfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDMyIExfc2hsIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMik7Ci0jZWxzZQotV29yZDMyIExfc2hsIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMik7Ci0jZW5kaWYKLQotLyogTG9uZyBzaGlmdCByaWdodCwgMiovCi0jaWYgKExfU0hSX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQzMiBMX3NociAoV29yZDMyIExfdmFyMSwgV29yZDE2IHZhcjIpOwotI2Vsc2UKLVdvcmQzMiBMX3NociAoV29yZDMyIExfdmFyMSwgV29yZDE2IHZhcjIpOwotI2VuZGlmCi0KLS8qIFNob3J0IGFkZCwgICAgICAgICAgIDEgICAqLwotI2lmIChBRERfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IGFkZCAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbHNlCi1Xb3JkMTYgYWRkIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwotI2VuZGlmCi0KLS8qIFNob3J0IHN1YiwgICAgICAgICAgIDEgICAqLwotI2lmIChTVUJfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IHN1YihXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwotI2Vsc2UKLVdvcmQxNiBzdWIoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbmRpZgotCi0vKiBTaG9ydCBkaXZpc2lvbiwgICAgICAgMTggICovCi0jaWYgKERJVl9TX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQxNiBkaXZfcyAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbHNlCi1Xb3JkMTYgZGl2X3MgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7Ci0jZW5kaWYKLQotLyogU2hvcnQgbXVsdCwgICAgICAgICAgMSAgICovCi0jaWYgKE1VTFRfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IG11bHQgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7Ci0jZWxzZQotV29yZDE2IG11bHQgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7Ci0jZW5kaWYKLQotLyogU2hvcnQgbm9ybSwgICAgICAgICAgIDE1ICAqLwotI2lmIChOT1JNX1NfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IG5vcm1fcyAoV29yZDE2IHZhcjEpOwotI2Vsc2UKLVdvcmQxNiBub3JtX3MgKFdvcmQxNiB2YXIxKTsKLSNlbmRpZgotCi0vKiBMb25nIG5vcm0sICAgICAgICAgICAgMzAgICovCi0jaWYgKE5PUk1fTF9JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMTYgbm9ybV9sIChXb3JkMzIgTF92YXIxKTsKLSNlbHNlCi1Xb3JkMTYgbm9ybV9sIChXb3JkMzIgTF92YXIxKTsKLSNlbmRpZgotCi0vKiBSb3VuZCwgICAgICAgICAgICAgICAxICAgKi8KLSNpZiAoUk9VTkRfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IHJvdW5kMTYoV29yZDMyIExfdmFyMSk7Ci0jZWxzZQotV29yZDE2IHJvdW5kMTYoV29yZDMyIExfdmFyMSk7Ci0jZW5kaWYKLQotLyogTWFjLCAgMSAgKi8KLSNpZiAoTF9NQUNfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDMyIExfbWFjIChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwotI2Vsc2UKLVdvcmQzMiBMX21hYyAoV29yZDMyIExfdmFyMywgV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbmRpZgotCi0jaWYgKExfQUREX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQzMiBMX2FkZCAoV29yZDMyIExfdmFyMSwgV29yZDMyIExfdmFyMik7Ci0jZWxzZQotV29yZDMyIExfYWRkIChXb3JkMzIgTF92YXIxLCBXb3JkMzIgTF92YXIyKTsKLSNlbmRpZgotCi0vKiBFeHRyYWN0IGhpZ2gsICAgICAgICAxICAgKi8KLSNpZiAoRVhUUkFDVF9IX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQxNiBleHRyYWN0X2ggKFdvcmQzMiBMX3ZhcjEpOwotI2Vsc2UKLVdvcmQxNiBleHRyYWN0X2ggKFdvcmQzMiBMX3ZhcjEpOwotI2VuZGlmCi0KLS8qIEV4dHJhY3QgbG93LCAgICAgICAgIDEgICAqLwotI2lmIChFWFRSQUNUX0xfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IGV4dHJhY3RfbChXb3JkMzIgTF92YXIxKTsKLSNlbHNlCi1Xb3JkMTYgZXh0cmFjdF9sKFdvcmQzMiBMX3ZhcjEpOwotI2VuZGlmCi0KLS8qIE11bHQgd2l0aCByb3VuZCwgMiAqLwotI2lmIChNVUxUX1JfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IG11bHRfcihXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwotI2Vsc2UKLVdvcmQxNiBtdWx0X3IoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbmRpZgotCi0vKiBTaGlmdCByaWdodCB3aXRoIHJvdW5kLCAyICAgICAgICAgICAqLwotI2lmIChTSFJfUl9JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMTYgc2hyX3IgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7Ci0jZWxzZQotV29yZDE2IHNocl9yIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwotI2VuZGlmCi0KLS8qIE1hYyB3aXRoIHJvdW5kaW5nLDIgKi8KLSNpZiAoTUFDX1JfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IG1hY19yIChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwotI2Vsc2UKLVdvcmQxNiBtYWNfciAoV29yZDMyIExfdmFyMywgV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbmRpZgotCi0vKiBNc3Ugd2l0aCByb3VuZGluZywyICovCi0jaWYgKE1TVV9SX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQxNiBtc3VfciAoV29yZDMyIExfdmFyMywgV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbHNlCi1Xb3JkMTYgbXN1X3IgKFdvcmQzMiBMX3ZhcjMsIFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7Ci0jZW5kaWYKLQotLyogTG9uZyBzaGlmdCByaWdodCB3aXRoIHJvdW5kLCAgMyAgICAgICAgICAgICAqLwotI2lmIChMX1NIUl9SX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQzMiBMX3Nocl9yIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMik7Ci0jZWxzZQotV29yZDMyIExfc2hyX3IgKFdvcmQzMiBMX3ZhcjEsIFdvcmQxNiB2YXIyKTsKLSNlbmRpZgotCi0jaWYgQVJNVjRfSU5BU00KLV9faW5saW5lIFdvcmQzMiBBU01fTF9zaHIoV29yZDMyIExfdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0JcmV0dXJuIExfdmFyMSA+PiB2YXIyOwotfQotCi1fX2lubGluZSBXb3JkMzIgQVNNX0xfc2hsKFdvcmQzMiBMX3ZhcjEsIFdvcmQxNiB2YXIyKQotewotCVdvcmQzMiByZXN1bHQ7Ci0JYXNtICgKLQkJIk1PVgklW3Jlc3VsdF0sICVbTF92YXIxXSwgQVNMICVbdmFyMl0gXG4iCi0JCSJURVEJJVtMX3ZhcjFdLCAlW3Jlc3VsdF0sIEFTUiAlW3ZhcjJdXG4iCi0JCSJFT1JORSAgJVtyZXN1bHRdLCAlW21hc2tdLCAlW0xfdmFyMV0sIEFTUiAjMzFcbiIKLQkJOltyZXN1bHRdIj0mciIocmVzdWx0KQotCQk6W0xfdmFyMV0iciIoTF92YXIxKSwgW3ZhcjJdInIiKHZhcjIpLCBbbWFza10iciIoMHg3ZmZmZmZmZikKLQkJKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1fX2lubGluZSBXb3JkMzIgQVNNX3NocihXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMikKLXsKLQlXb3JkMzIgcmVzdWx0OwotCWFzbSAoCi0JCSJDTVAJJVt2YXIyXSwgIzE1XG4iCi0JCSJNT1ZMVAklW3Jlc3VsdF0sICVbTF92YXIxXSwgQVNSICVbdmFyMl1cbiIKLQkJIk1PVkdFCSVbcmVzdWx0XSwgJVtMX3ZhcjFdLCBBU1IgIzE1XG4iCi0JCTpbcmVzdWx0XSI9ciIocmVzdWx0KQotCQk6W0xfdmFyMV0iciIoTF92YXIxKSwgW3ZhcjJdInIiKHZhcjIpCi0JCSk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotX19pbmxpbmUgV29yZDMyIEFTTV9zaGwoV29yZDMyIExfdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0jaWYgQVJNVjZfU0FUCi0JV29yZDMyIHJlc3VsdDsKLQlhc20gKAotCQkiQ01QCSVbdmFyMl0sICMxNlxuIgotCQkiTU9WTFQgICVbcmVzdWx0XSwgJVtMX3ZhcjFdLCBBU0wgJVt2YXIyXVxuIgotCQkiTU9WR0UgICVbcmVzdWx0XSwgJVtMX3ZhcjFdLCBBU0wgIzE2XG4iCi0JCSJTU0FUICAgJVtyZXN1bHRdLCAjMTYsICVbcmVzdWx0XVxuIgotCQk6W3Jlc3VsdF0iPXIiKHJlc3VsdCkKLQkJOltMX3ZhcjFdInIiKExfdmFyMSksIFt2YXIyXSJyIih2YXIyKQotCQkpOwotCXJldHVybiByZXN1bHQ7Ci0jZWxzZQotCVdvcmQzMiByZXN1bHQ7Ci0JV29yZDMyIHRtcDsKLQlhc20gKAotCQkiQ01QCSVbdmFyMl0sICMxNlxuIgotCQkiTU9WTFQgICVbcmVzdWx0XSwgJVtMX3ZhcjFdLCBBU0wgJVt2YXIyXVxuIgotCQkiTU9WR0UgICVbcmVzdWx0XSwgJVtMX3ZhcjFdLCBBU0wgIzE2XG4iCi0gICAgICAgICJNT1YgICAgJVt0bXBdLCAlW3Jlc3VsdF0sIEFTUiAjMTVcbiIKLSAgICAgICAgIlRFUSAgICAlW3RtcF0sICVbcmVzdWx0XSwgQVNSICMzMSBcbiIKLSAgICAgICAgIkVPUk5FICAlW3Jlc3VsdF0sICVbbWFza10sICVbcmVzdWx0XSxBU1IgIzMxIgotCQk6W3Jlc3VsdF0iPSZyIihyZXN1bHQpLCBbdG1wXSI9JnIiKHRtcCkKLQkJOltMX3ZhcjFdInIiKExfdmFyMSksIFt2YXIyXSJyIih2YXIyKSwgW21hc2tdInIiKDB4N2ZmZikKLQkJKTsKLQlyZXR1cm4gcmVzdWx0OwotI2VuZGlmCi19Ci0jZW5kaWYKLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBkZWZpbml0aW9ucyBmb3IgaW5saW5lIGJhc2ljIGFyaXRobWV0aWMgb3BlcmF0b3JzICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0jaWYgKFNBVFJVQVRFX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQxNiBzYXR1cmF0ZShXb3JkMzIgTF92YXIxKQotewotI2lmIEFSTVY2X1NBVAotICAgIFdvcmQxNiByZXN1bHQ7Ci0JYXNtICgKLQkJIlNTQVQgJVtyZXN1bHRdLCAjMTYsICVbTF92YXIxXSIKLQkJOiBbcmVzdWx0XSI9ciIocmVzdWx0KQotCQk6IFtMX3ZhcjFdInIiKExfdmFyMSkKLQkJKTsKLQlyZXR1cm4gcmVzdWx0OwotI2VsaWYgQVJNVjVURV9TQVQKLQlXb3JkMTYgcmVzdWx0OwotCVdvcmQzMiB0bXA7Ci0JYXNtIHZvbGF0aWxlICgKLQkJIk1PVgklW3RtcF0sICVbTF92YXIxXSxBU1IjMTVcbiIKLQkJIlRFUQklW3RtcF0sICVbTF92YXIxXSxBU1IjMzFcbiIKLQkJIkVPUk5FCSVbcmVzdWx0XSwgJVttYXNrXSwlW0xfdmFyMV0sQVNSIzMxXG4iCi0JCSJNT1ZFUQklW3Jlc3VsdF0sICVbTF92YXIxXVxuIgotCQk6W3Jlc3VsdF0iPSZyIihyZXN1bHQpLCBbdG1wXSI9JnIiKHRtcCkKLQkJOltMX3ZhcjFdInIiKExfdmFyMSksIFttYXNrXSJyIigweDdmZmYpCi0JKTsKLQotCXJldHVybiByZXN1bHQ7Ci0jZWxzZQotICAgIFdvcmQxNiB2YXJfb3V0OwotCi0gICAgLy92YXJfb3V0ID0gKExfdmFyMSA+IChXb3JkMzIpMFgwMDAwN2ZmZkwpID8gKE1BWF8xNikgOiAoKExfdmFyMSA8IChXb3JkMzIpMHhmZmZmODAwMEwpID8gKE1JTl8xNikgOiAoKFdvcmQxNilMX3ZhcjEpKTsKLQotICAgIGlmIChMX3ZhcjEgPiAwWDAwMDA3ZmZmTCkKLSAgICB7Ci0gICAgICAgIHZhcl9vdXQgPSBNQVhfMTY7Ci0gICAgfQotICAgIGVsc2UgaWYgKExfdmFyMSA8IChXb3JkMzIpIDB4ZmZmZjgwMDBMKQotICAgIHsKLSAgICAgICAgdmFyX291dCA9IE1JTl8xNjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdmFyX291dCA9IGV4dHJhY3RfbChMX3ZhcjEpOwotICAgIH0KLQotICAgIHJldHVybiAodmFyX291dCk7Ci0jZW5kaWYKLX0KLSNlbmRpZgotCi0vKiBTaG9ydCBzaGlmdCBsZWZ0LCAgICAxICAgKi8KLSNpZiAoU0hMX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQxNiBzaGwgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikKLXsKLSNpZiBBUk1WNVRFX1NITAotCWlmKHZhcjI+PTApCi0JewotCQlyZXR1cm4gQVNNX3NobCggdmFyMSwgdmFyMik7Ci0JfQotCWVsc2UKLQl7Ci0JCXJldHVybiBBU01fc2hyKCB2YXIxLCAtdmFyMik7Ci0JfQotI2Vsc2UKLSAgICBXb3JkMTYgdmFyX291dDsKLSAgICBXb3JkMzIgcmVzdWx0OwotCi0gICAgaWYgKHZhcjIgPCAwKQotICAgIHsKLSAgICAgICAgdmFyX291dCA9IHNociAodmFyMSwgKFdvcmQxNiktdmFyMik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJlc3VsdCA9IChXb3JkMzIpIHZhcjEgKigoV29yZDMyKSAxIDw8IHZhcjIpOwotCi0gICAgICAgIGlmICgodmFyMiA+IDE1ICYmIHZhcjEgIT0gMCkgfHwgKHJlc3VsdCAhPSAoV29yZDMyKSAoKFdvcmQxNikgcmVzdWx0KSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhcl9vdXQgPSAoV29yZDE2KSgodmFyMSA+IDApID8gTUFYXzE2IDogTUlOXzE2KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhcl9vdXQgPSBleHRyYWN0X2wocmVzdWx0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKHZhcl9vdXQpOwotI2VuZGlmCi19Ci0jZW5kaWYKLQotLyogU2hvcnQgc2hpZnQgcmlnaHQsICAgMSAgICovCi0jaWYgKFNIUl9JU19JTkxJTkUpCi1fX2lubGluZSBXb3JkMTYgc2hyIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0jaWYgQVJNVjVURV9TSFIKLQlpZih2YXIyPj0wKQotCXsKLQkJcmV0dXJuICBBU01fc2hyKCB2YXIxLCB2YXIyKTsKLQl9Ci0JZWxzZQotCXsKLQkJcmV0dXJuICBBU01fc2hsKCB2YXIxLCAtdmFyMik7Ci0JfQotI2Vsc2UKLSAgICBXb3JkMTYgdmFyX291dDsKLQotICAgIGlmICh2YXIyIDwgMCkKLSAgICB7Ci0gICAgICAgIHZhcl9vdXQgPSBzaGwgKHZhcjEsIChXb3JkMTYpLXZhcjIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAodmFyMiA+PSAxNSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyX291dCA9IChXb3JkMTYpKCh2YXIxIDwgMCkgPyAtMSA6IDApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhcjEgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhcl9vdXQgPSAoV29yZDE2KSh+KCh+dmFyMSkgPj4gdmFyMikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhcl9vdXQgPSAoV29yZDE2KSh2YXIxID4+IHZhcjIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuICh2YXJfb3V0KTsKLSNlbmRpZgotfQotI2VuZGlmCi0KLQotI2lmIChMX01VTFRfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDMyIExfbXVsdChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0jaWYgQVJNVjVURV9MX01VTFQKLQlXb3JkMzIgcmVzdWx0OwotCWFzbSAoCi0JCSJTTVVMQkIgJVtyZXN1bHRdLCAlW3ZhcjFdLCAlW3ZhcjJdIFxuIgotCQkiUUFERCAlW3Jlc3VsdF0sICVbcmVzdWx0XSwgJVtyZXN1bHRdIFxuIgotCQk6W3Jlc3VsdF0iPXIiKHJlc3VsdCkKLQkJOlt2YXIxXSJyIih2YXIxKSwgW3ZhcjJdInIiKHZhcjIpCi0JCSk7Ci0JcmV0dXJuIHJlc3VsdDsKLSNlbHNlCi0gICAgV29yZDMyIExfdmFyX291dDsKLQotICAgIExfdmFyX291dCA9IChXb3JkMzIpIHZhcjEgKihXb3JkMzIpIHZhcjI7Ci0KLSAgICBpZiAoTF92YXJfb3V0ICE9IChXb3JkMzIpIDB4NDAwMDAwMDBMKQotICAgIHsKLSAgICAgICAgTF92YXJfb3V0IDw8PSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBMX3Zhcl9vdXQgPSBNQVhfMzI7Ci0gICAgfQotICAgIHJldHVybiAoTF92YXJfb3V0KTsKLSNlbmRpZgotfQotI2VuZGlmCi0KLSNpZiAoTF9NU1VfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDMyIExfbXN1IChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0jaWYgQVJNVjVURV9MX01TVQotCVdvcmQzMiByZXN1bHQ7Ci0JYXNtICgKLQkJIlNNVUxCQiAlW3Jlc3VsdF0sICVbdmFyMV0sICVbdmFyMl0gXG4iCi0JCSJRRFNVQiAlW3Jlc3VsdF0sICVbTF92YXIzXSwgJVtyZXN1bHRdXG4iCi0JCTpbcmVzdWx0XSI9JnIiKHJlc3VsdCkKLQkJOltMX3ZhcjNdInIiKExfdmFyMyksIFt2YXIxXSJyIih2YXIxKSwgW3ZhcjJdInIiKHZhcjIpCi0JCSk7Ci0JcmV0dXJuIHJlc3VsdDsKLSNlbHNlCi0gICAgV29yZDMyIExfdmFyX291dDsKLSAgICBXb3JkMzIgTF9wcm9kdWN0OwotCi0gICAgTF9wcm9kdWN0ID0gTF9tdWx0KHZhcjEsIHZhcjIpOwotICAgIExfdmFyX291dCA9IExfc3ViKExfdmFyMywgTF9wcm9kdWN0KTsKLSAgICByZXR1cm4gKExfdmFyX291dCk7Ci0jZW5kaWYKLX0KLSNlbmRpZgotCi0jaWYgKExfU1VCX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQzMiBMX3N1YihXb3JkMzIgTF92YXIxLCBXb3JkMzIgTF92YXIyKQotewotI2lmIEFSTVY1VEVfTF9TVUIKLQlXb3JkMzIgcmVzdWx0OwotCWFzbSAoCi0JCSJRU1VCICVbcmVzdWx0XSwgJVtMX3ZhcjFdLCAlW0xfdmFyMl1cbiIKLQkJOltyZXN1bHRdIj1yIihyZXN1bHQpCi0JCTpbTF92YXIxXSJyIihMX3ZhcjEpLCBbTF92YXIyXSJyIihMX3ZhcjIpCi0JCSk7Ci0JcmV0dXJuIHJlc3VsdDsKLSNlbHNlCi0gICAgV29yZDMyIExfdmFyX291dDsKLQotICAgIExfdmFyX291dCA9IExfdmFyMSAtIExfdmFyMjsKLQotICAgIGlmICgoKExfdmFyMSBeIExfdmFyMikgJiBNSU5fMzIpICE9IDApCi0gICAgewotICAgICAgICBpZiAoKExfdmFyX291dCBeIExfdmFyMSkgJiBNSU5fMzIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExfdmFyX291dCA9IChMX3ZhcjEgPCAwTCkgPyBNSU5fMzIgOiBNQVhfMzI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gKExfdmFyX291dCk7Ci0jZW5kaWYKLX0KLSNlbmRpZgotCi0jaWYgKExfU0hMX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQzMiBMX3NobChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMikKLXsKLSNpZiBBUk1WNVRFX0xfU0hMCi0gICAgaWYodmFyMj49MCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAgQVNNX0xfc2hsKCBMX3ZhcjEsIHZhcjIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gIEFTTV9MX3NociggTF92YXIxLCAtdmFyMik7Ci0gICAgfQotI2Vsc2UKLSAgICBpZiAodmFyMiA8PSAwKQotICAgIHsKLSAgICAgICAgTF92YXIxID0gTF9zaHIoTF92YXIxLCAoV29yZDE2KS12YXIyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yICg7IHZhcjIgPiAwOyB2YXIyLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChMX3ZhcjEgPiAoV29yZDMyKSAwWDNmZmZmZmZmTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTUFYXzMyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChMX3ZhcjEgPCAoV29yZDMyKSAweGMwMDAwMDAwTCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNSU5fMzI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgTF92YXIxIDw8PSAxOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAoTF92YXIxKTsKLSNlbmRpZgotfQotI2VuZGlmCi0KLSNpZiAoTF9TSFJfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDMyIExfc2hyIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMikKLXsKLSNpZiBBUk1WNVRFX0xfU0hSCi0JaWYodmFyMj49MCkKLQl7Ci0JCXJldHVybiBBU01fTF9zaHIoIExfdmFyMSwgdmFyMik7Ci0JfQotCWVsc2UKLQl7Ci0JCXJldHVybiBBU01fTF9zaGwoIExfdmFyMSwgLXZhcjIpOwotCX0KLSNlbHNlCi0gICAgV29yZDMyIExfdmFyX291dDsKLQotICAgIGlmICh2YXIyIDwgMCkKLSAgICB7Ci0gICAgICAgIExfdmFyX291dCA9IExfc2hsIChMX3ZhcjEsIChXb3JkMTYpLXZhcjIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAodmFyMiA+PSAzMSkKLSAgICAgICAgewotICAgICAgICAgICAgTF92YXJfb3V0ID0gKExfdmFyMSA8IDBMKSA/IC0xIDogMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChMX3ZhcjEgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExfdmFyX291dCA9IH4oKH5MX3ZhcjEpID4+IHZhcjIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExfdmFyX291dCA9IExfdmFyMSA+PiB2YXIyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAoTF92YXJfb3V0KTsKLSNlbmRpZgotfQotI2VuZGlmCi0KLS8qIFNob3J0IGFkZCwgICAgICAgICAgIDEgICAqLwotI2lmIChBRERfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IGFkZCAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQotewotI2lmIEFSTVY1VEVfQURECi0JV29yZDMyIHJlc3VsdDsKLQlXb3JkMzIgdG1wOwotCWFzbSAoCi0JCSJBREQgICVbcmVzdWx0XSwgJVt2YXIxXSwgJVt2YXIyXSBcbiIKLQkJIk1PViAgJVt0bXBdLCAlW3Jlc3VsdF0sIEFTUiAjMTUgXG4iCi0JCSJURVEgICVbdG1wXSwgJVtyZXN1bHRdLCBBU1IgIzMxIFxuIgotCQkiRU9STkUgJVtyZXN1bHRdLCAlW21hc2tdLCAlW3Jlc3VsdF0sIEFTUiAjMzEiCi0JCTpbcmVzdWx0XSI9JnIiKHJlc3VsdCksIFt0bXBdIj0mciIodG1wKQotCQk6W3ZhcjFdInIiKHZhcjEpLCBbdmFyMl0iciIodmFyMiksIFttYXNrXSJyIigweDdmZmYpCi0JCSk7Ci0JcmV0dXJuIHJlc3VsdDsKLSNlbHNlCi0gICAgV29yZDE2IHZhcl9vdXQ7Ci0gICAgV29yZDMyIExfc3VtOwotCi0gICAgTF9zdW0gPSAoV29yZDMyKSB2YXIxICsgdmFyMjsKLSAgICB2YXJfb3V0ID0gc2F0dXJhdGUoTF9zdW0pOwotCi0gICAgcmV0dXJuICh2YXJfb3V0KTsKLSNlbmRpZgotfQotI2VuZGlmCi0KLS8qIFNob3J0IHN1YiwgICAgICAgICAgIDEgICAqLwotI2lmIChTVUJfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IHN1YihXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0jaWYgQVJNVjVURV9TVUIKLQlXb3JkMzIgcmVzdWx0OwotCVdvcmQzMiB0bXA7Ci0JYXNtICgKLQkJIlNVQiAgICVbcmVzdWx0XSwgJVt2YXIxXSwgJVt2YXIyXSBcbiIKLQkJIk1PViAgICVbdG1wXSwgJVt2YXIxXSwgQVNSICMxNSBcbiIKLQkJIlRFUSAgICVbdG1wXSwgJVt2YXIxXSwgQVNSICMzMSBcbiIKLQkJIkVPUk5FICVbcmVzdWx0XSwgJVttYXNrXSwgJVtyZXN1bHRdLCBBU1IgIzMxIFxuIgotCQk6W3Jlc3VsdF0iPSZyIihyZXN1bHQpLCBbdG1wXSI9JnIiKHRtcCkKLQkJOlt2YXIxXSJyIih2YXIxKSwgW3ZhcjJdInIiKHZhcjIpLCBbbWFza10iciIoMHg3ZmZmKQotCQkpOwotCXJldHVybiByZXN1bHQ7Ci0jZWxzZQotICAgIFdvcmQxNiB2YXJfb3V0OwotICAgIFdvcmQzMiBMX2RpZmY7Ci0KLSAgICBMX2RpZmYgPSAoV29yZDMyKSB2YXIxIC0gdmFyMjsKLSAgICB2YXJfb3V0ID0gc2F0dXJhdGUoTF9kaWZmKTsKLQotICAgIHJldHVybiAodmFyX291dCk7Ci0jZW5kaWYKLX0KLSNlbmRpZgotCi0vKiBTaG9ydCBkaXZpc2lvbiwgICAgICAgMTggICovCi0jaWYgKERJVl9TX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQxNiBkaXZfcyAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQotewotICAgIFdvcmQxNiB2YXJfb3V0ID0gMDsKLSAgICBXb3JkMTYgaXRlcmF0aW9uOwotICAgIFdvcmQzMiBMX251bTsKLSAgICBXb3JkMzIgTF9kZW5vbTsKLQotICAgIHZhcl9vdXQgPSBNQVhfMTY7Ci0gICAgaWYgKHZhcjEhPSB2YXIyKS8vdmFyMSE9IHZhcjIKLSAgICB7Ci0gICAgCXZhcl9vdXQgPSAwOwotICAgIAlMX251bSA9IChXb3JkMzIpIHZhcjE7Ci0KLSAgICAJTF9kZW5vbSA9IChXb3JkMzIpIHZhcjI7Ci0KLQkJLy9yZXR1cm4gKExfbnVtPDwxNSkvdmFyMjsKLQotICAgIAlmb3IgKGl0ZXJhdGlvbiA9IDA7IGl0ZXJhdGlvbiA8IDE1OyBpdGVyYXRpb24rKykKLSAgICAJewotICAgIAkJdmFyX291dCA8PD0gMTsKLSAgICAJCUxfbnVtIDw8PSAxOwotCi0gICAgCQlpZiAoTF9udW0gPj0gTF9kZW5vbSkKLSAgICAJCXsKLSAgICAJCQlMX251bSAtPSBMX2Rlbm9tOwotICAgIAkJCXZhcl9vdXQrKzsKLSAgICAJCX0KLSAgICAJfQotICAgIH0KLSAgICByZXR1cm4gKHZhcl9vdXQpOwotfQotI2VuZGlmCi0KLS8qIFNob3J0IG11bHQsICAgICAgICAgIDEgICAqLwotI2lmIChNVUxUX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQxNiBtdWx0IChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0jaWYgQVJNVjVURV9NVUxUICYmIEFSTVY2X1NBVAotCVdvcmQzMiByZXN1bHQ7Ci0JYXNtICgKLQkJIlNNVUxCQiAlW3Jlc3VsdF0sICVbdmFyMV0sICVbdmFyMl0gXG4iCi0JCSJTU0FUICAgJVtyZXN1bHRdLCAjMTYsICVbcmVzdWx0XSwgQVNSICMxNSBcbiIKLQkJOltyZXN1bHRdIj1yIihyZXN1bHQpCi0JCTpbdmFyMV0iciIodmFyMSksIFt2YXIyXSJyIih2YXIyKQotCQkpOwotCXJldHVybiByZXN1bHQ7Ci0jZWxpZiBBUk1WNVRFX01VTFQKLQlXb3JkMzIgcmVzdWx0LCB0bXA7Ci0JYXNtICgKLQkJIlNNVUxCQiAlW3RtcF0sICVbdmFyMV0sICVbdmFyMl0gXG4iCi0JCSJNT1YJJVtyZXN1bHRdLCAlW3RtcF0sIEFTUiAjMTVcbiIKLQkJIk1PVgklW3RtcF0sICVbcmVzdWx0XSwgQVNSICMxNVxuIgotCQkiVEVRCSVbdG1wXSwgJVtyZXN1bHRdLCBBU1IgIzMxXG4iCi0JCSJFT1JORSAgJVtyZXN1bHRdLCAlW21hc2tdLCAlW3Jlc3VsdF0sIEFTUiAjMzEgXG4iCi0JCTpbcmVzdWx0XSI9JnIiKHJlc3VsdCksIFt0bXBdIj0mciIodG1wKQotCQk6W3ZhcjFdInIiKHZhcjEpLCBbdmFyMl0iciIodmFyMiksIFttYXNrXSJyIigweDdmZmYpCi0JCSk7Ci0JcmV0dXJuIHJlc3VsdDsKLSNlbHNlCi0gICAgV29yZDE2IHZhcl9vdXQ7Ci0gICAgV29yZDMyIExfcHJvZHVjdDsKLQotICAgIExfcHJvZHVjdCA9IChXb3JkMzIpIHZhcjEgKihXb3JkMzIpIHZhcjI7Ci0gICAgTF9wcm9kdWN0ID0gKExfcHJvZHVjdCAmIChXb3JkMzIpIDB4ZmZmZjgwMDBMKSA+PiAxNTsKLSAgICBpZiAoTF9wcm9kdWN0ICYgKFdvcmQzMikgMHgwMDAxMDAwMEwpCi0gICAgICAgIExfcHJvZHVjdCA9IExfcHJvZHVjdCB8IChXb3JkMzIpIDB4ZmZmZjAwMDBMOwotICAgIHZhcl9vdXQgPSBzYXR1cmF0ZShMX3Byb2R1Y3QpOwotCi0gICAgcmV0dXJuICh2YXJfb3V0KTsKLSNlbmRpZgotfQotI2VuZGlmCi0KLQotLyogU2hvcnQgbm9ybSwgICAgICAgICAgIDE1ICAqLwotI2lmIChOT1JNX1NfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IG5vcm1fcyAoV29yZDE2IHZhcjEpCi17Ci0jaWYgQVJNVjVURV9OT1JNX1MKLQlXb3JkMTYgcmVzdWx0OwotCVdvcmQzMiB0bXA7Ci0JYXNtICgKLQkJIlJTQlMgICVbdG1wXSwgJVt2YXIxXSwgIzAgXG4iCi0JCSJDTFpMVCAlW3Jlc3VsdF0sICVbdmFyMV1cbiIKLQkJIkNMWkdUICVbcmVzdWx0XSwgJVt0bXBdXG4iCi0JCSJTVUJORSAlW3Jlc3VsdF0sICVbcmVzdWx0XSwgIzE3XG4iCi0JCSJNT1ZFUSAlW3Jlc3VsdF0sICMwXG4iCi0JCSJDTVAgICAlW3ZhcjFdLCAjLTFcbiIKLQkJIk1PVkVRICVbcmVzdWx0XSwgIzE1XG4iCi0JCTpbcmVzdWx0XSI9JnIiKHJlc3VsdCksIFt0bXBdIj0mciIodG1wKQotCQk6W3ZhcjFdInIiKHZhcjEpCi0JCSk7Ci0JcmV0dXJuIHJlc3VsdDsKLSNlbHNlCi0gICAgV29yZDE2IHZhcl9vdXQ7Ci0KLSAgICBpZiAodmFyMSA9PSAwKQotICAgIHsKLSAgICAgICAgdmFyX291dCA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmICh2YXIxID09IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXJfb3V0ID0gMTU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmFyMSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyMSA9IChXb3JkMTYpfnZhcjE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKHZhcl9vdXQgPSAwOyB2YXIxIDwgMHg0MDAwOyB2YXJfb3V0KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyMSA8PD0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKHZhcl9vdXQpOwotI2VuZGlmCi19Ci0jZW5kaWYKLQotLyogTG9uZyBub3JtLCAgICAgICAgICAgIDMwICAqLwotI2lmIChOT1JNX0xfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IG5vcm1fbCAoV29yZDMyIExfdmFyMSkKLXsKLSNpZiBBUk1WNVRFX05PUk1fTAotCVdvcmQxNiByZXN1bHQ7Ci0JYXNtIHZvbGF0aWxlKAotCQkiQ01QICAgICVbTF92YXIxXSwgIzBcbiIKLQkJIkNMWk5FICAlW3Jlc3VsdF0sICVbTF92YXIxXVxuIgotCQkiU1VCTkUgICVbcmVzdWx0XSwgJVtyZXN1bHRdLCAjMVxuIgotCQkiTU9WRVEgICVbcmVzdWx0XSwgIzBcbiIKLQkJOltyZXN1bHRdIj1yIihyZXN1bHQpCi0JCTpbTF92YXIxXSJyIihMX3ZhcjEpCi0JCSk7Ci0JcmV0dXJuIHJlc3VsdDsKLSNlbHNlCi0gICAgLy9Xb3JkMTYgdmFyX291dDsKLQotICAgIC8vaWYgKExfdmFyMSA9PSAwKQotICAgIC8vewotICAgIC8vICAgIHZhcl9vdXQgPSAwOwotICAgIC8vfQotICAgIC8vZWxzZQotICAgIC8vewotICAgIC8vICAgIGlmIChMX3ZhcjEgPT0gKFdvcmQzMikgMHhmZmZmZmZmZkwpCi0gICAgLy8gICAgewotICAgIC8vICAgICAgICB2YXJfb3V0ID0gMzE7Ci0gICAgLy8gICAgfQotICAgIC8vICAgIGVsc2UKLSAgICAvLyAgICB7Ci0gICAgLy8gICAgICAgIGlmIChMX3ZhcjEgPCAwKQotICAgIC8vICAgICAgICB7Ci0gICAgLy8gICAgICAgICAgICBMX3ZhcjEgPSB+TF92YXIxOwotICAgIC8vICAgICAgICB9Ci0gICAgLy8gICAgICAgIGZvciAodmFyX291dCA9IDA7IExfdmFyMSA8IChXb3JkMzIpIDB4NDAwMDAwMDBMOyB2YXJfb3V0KyspCi0gICAgLy8gICAgICAgIHsKLSAgICAvLyAgICAgICAgICAgIExfdmFyMSA8PD0gMTsKLSAgICAvLyAgICAgICAgfQotICAgIC8vICAgIH0KLSAgICAvL30KLSAgICAvL3JldHVybiAodmFyX291dCk7Ci0gIFdvcmQxNiBhMTY7Ci0gIFdvcmQxNiByID0gMCA7Ci0KLQotICBpZiAoIExfdmFyMSA8IDAgKSB7Ci0gICAgTF92YXIxID0gfkxfdmFyMTsKLSAgfQotCi0gIGlmICgwID09IChMX3ZhcjEgJiAweDdmZmY4MDAwKSkgewotICAgIGExNiA9IGV4dHJhY3RfbChMX3ZhcjEpOwotICAgIHIgKz0gMTY7Ci0KLSAgICBpZiAoMCA9PSAoYTE2ICYgMHg3ZjgwKSkgewotICAgICAgciArPSA4OwotCi0gICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwMDc4KSkgewotICAgICAgICByICs9IDQ7Ci0KLSAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDAwNikpIHsKLSAgICAgICAgICByICs9IDI7Ci0KLSAgICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwMDAxKSkgewotICAgICAgICAgICAgciArPSAxOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLQotICAgICAgICAgIGlmICgwID09IChhMTYgJiAweDAwMDQpKSB7Ci0gICAgICAgICAgICByICs9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLQotICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwMDYwKSkgewotICAgICAgICAgIHIgKz0gMjsKLQotICAgICAgICAgIGlmICgwID09IChhMTYgJiAweDAwMTApKSB7Ci0gICAgICAgICAgICByICs9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotCi0gICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDA0MCkpIHsKLSAgICAgICAgICAgIHIgKz0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0KLSAgICAgIGlmICgwID09IChhMTYgJiAweDc4MDApKSB7Ci0gICAgICAgIHIgKz0gNDsKLQotICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwNjAwKSkgewotICAgICAgICAgIHIgKz0gMjsKLQotICAgICAgICAgIGlmICgwID09IChhMTYgJiAweDAxMDApKSB7Ci0gICAgICAgICAgICByICs9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotCi0gICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDQwMCkpIHsKLSAgICAgICAgICAgIHIgKz0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgewotCi0gICAgICAgIGlmICgwID09IChhMTYgJiAweDYwMDApKSB7Ci0gICAgICAgICAgciArPSAyOwotCi0gICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MTAwMCkpIHsKLSAgICAgICAgICAgIHIgKz0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0KLSAgICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHg0MDAwKSkgewotICAgICAgICAgICAgciArPSAxOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICBlbHNlIHsKLSAgICBhMTYgPSBleHRyYWN0X2goTF92YXIxKTsKLQotICAgIGlmICgwID09IChhMTYgJiAweDdmODApKSB7Ci0gICAgICByICs9IDg7Ci0KLSAgICAgIGlmICgwID09IChhMTYgJiAweDAwNzgpKSB7Ci0gICAgICAgIHIgKz0gNCA7Ci0KLSAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDAwNikpIHsKLSAgICAgICAgICByICs9IDI7Ci0KLSAgICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwMDAxKSkgewotICAgICAgICAgICAgciArPSAxOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLQotICAgICAgICAgIGlmICgwID09IChhMTYgJiAweDAwMDQpKSB7Ci0gICAgICAgICAgICByICs9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLQotICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwMDYwKSkgewotICAgICAgICAgIHIgKz0gMjsKLQotICAgICAgICAgIGlmICgwID09IChhMTYgJiAweDAwMTApKSB7Ci0gICAgICAgICAgICByICs9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotCi0gICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDA0MCkpIHsKLSAgICAgICAgICAgIHIgKz0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0KLSAgICAgIGlmICgwID09IChhMTYgJiAweDc4MDApKSB7Ci0gICAgICAgIHIgKz0gNDsKLQotICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwNjAwKSkgewotICAgICAgICAgIHIgKz0gMjsKLQotICAgICAgICAgIGlmICgwID09IChhMTYgJiAweDAxMDApKSB7Ci0gICAgICAgICAgICByICs9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotCi0gICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDQwMCkpIHsKLSAgICAgICAgICAgIHIgKz0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgewotCi0gICAgICAgIGlmICgwID09IChhMTYgJiAweDYwMDApKSB7Ci0gICAgICAgICAgciArPSAyOwotCi0gICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MTAwMCkpIHsKLSAgICAgICAgICAgIHIgKz0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0KLSAgICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHg0MDAwKSkgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHIgOwotI2VuZGlmCi19Ci0jZW5kaWYKLQotLyogUm91bmQsICAgICAgICAgICAgICAgMSAgICovCi0jaWYgKFJPVU5EX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQxNiByb3VuZDE2KFdvcmQzMiBMX3ZhcjEpCi17Ci0jaWYgQVJNVjVURV9ST1VORAotCVdvcmQxNiByZXN1bHQ7Ci0JYXNtICgKLQkJIlFBREQgICVbcmVzdWx0XSwgJVtMX3ZhcjFdLCAlW2JpYXNdXG4iCi0JCSJNT1YgICAlW3Jlc3VsdF0sICVbcmVzdWx0XSwgQVNSICMxNiBcbiIKLQkJOltyZXN1bHRdIj1yIihyZXN1bHQpCi0JCTpbTF92YXIxXSJyIihMX3ZhcjEpLCBbYmlhc10iciIoMHg4MDAwKQotCQkpOwotCXJldHVybiByZXN1bHQ7Ci0jZWxzZQotICAgIFdvcmQxNiB2YXJfb3V0OwotICAgIFdvcmQzMiBMX3JvdW5kZWQ7Ci0KLSAgICBMX3JvdW5kZWQgPSBMX2FkZCAoTF92YXIxLCAoV29yZDMyKSAweDAwMDA4MDAwTCk7Ci0gICAgdmFyX291dCA9IGV4dHJhY3RfaCAoTF9yb3VuZGVkKTsKLSAgICByZXR1cm4gKHZhcl9vdXQpOwotI2VuZGlmCi19Ci0jZW5kaWYKLQotLyogTWFjLCAgMSAgKi8KLSNpZiAoTF9NQUNfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDMyIExfbWFjIChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0jaWYgQVJNVjVURV9MX01BQwotCVdvcmQzMiByZXN1bHQ7Ci0JYXNtICgKLQkJIlNNVUxCQiAlW3Jlc3VsdF0sICVbdmFyMV0sICVbdmFyMl1cbiIKLQkJIlFEQUREICAlW3Jlc3VsdF0sICVbTF92YXIzXSwgJVtyZXN1bHRdXG4iCi0JCTpbcmVzdWx0XSI9JnIiKHJlc3VsdCkKLQkJOiBbTF92YXIzXSJyIihMX3ZhcjMpLCBbdmFyMV0iciIodmFyMSksIFt2YXIyXSJyIih2YXIyKQotCQkpOwotCXJldHVybiByZXN1bHQ7Ci0jZWxzZQotICAgIFdvcmQzMiBMX3Zhcl9vdXQ7Ci0gICAgV29yZDMyIExfcHJvZHVjdDsKLQotICAgIExfcHJvZHVjdCA9IExfbXVsdCh2YXIxLCB2YXIyKTsKLSAgICBMX3Zhcl9vdXQgPSBMX2FkZCAoTF92YXIzLCBMX3Byb2R1Y3QpOwotICAgIHJldHVybiAoTF92YXJfb3V0KTsKLSNlbmRpZgotfQotI2VuZGlmCi0KLSNpZiAoTF9BRERfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDMyIExfYWRkIChXb3JkMzIgTF92YXIxLCBXb3JkMzIgTF92YXIyKQotewotI2lmIEFSTVY1VEVfTF9BREQKLQlXb3JkMzIgcmVzdWx0OwotCWFzbSAoCi0JCSJRQUREICVbcmVzdWx0XSwgJVtMX3ZhcjFdLCAlW0xfdmFyMl1cbiIKLQkJOltyZXN1bHRdIj1yIihyZXN1bHQpCi0JCTpbTF92YXIxXSJyIihMX3ZhcjEpLCBbTF92YXIyXSJyIihMX3ZhcjIpCi0JCSk7Ci0JcmV0dXJuIHJlc3VsdDsKLSNlbHNlCi0gICAgV29yZDMyIExfdmFyX291dDsKLQotICAgIExfdmFyX291dCA9IExfdmFyMSArIExfdmFyMjsKLSAgICBpZiAoKChMX3ZhcjEgXiBMX3ZhcjIpICYgTUlOXzMyKSA9PSAwKQotICAgIHsKLSAgICAgICAgaWYgKChMX3Zhcl9vdXQgXiBMX3ZhcjEpICYgTUlOXzMyKQotICAgICAgICB7Ci0gICAgICAgICAgICBMX3Zhcl9vdXQgPSAoTF92YXIxIDwgMCkgPyBNSU5fMzIgOiBNQVhfMzI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChMX3Zhcl9vdXQpOwotI2VuZGlmCi19Ci0jZW5kaWYKLQotCi0KLSNpZiAoTVVMVF9SX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQxNiBtdWx0X3IgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikKLXsKLSAgICBXb3JkMTYgdmFyX291dDsKLSAgICBXb3JkMzIgTF9wcm9kdWN0X2FycjsKLQotICAgIExfcHJvZHVjdF9hcnIgPSAoV29yZDMyKXZhcjEgKihXb3JkMzIpdmFyMjsgICAgICAgLyogcHJvZHVjdCAqLwotICAgIExfcHJvZHVjdF9hcnIgKz0gKFdvcmQzMikweDAwMDA0MDAwTDsgICAgICAvKiByb3VuZCAqLwotICAgIExfcHJvZHVjdF9hcnIgPj49IDE1OyAgICAgICAvKiBzaGlmdCAqLwotCi0gICAgdmFyX291dCA9IHNhdHVyYXRlKExfcHJvZHVjdF9hcnIpOwotCi0gICAgcmV0dXJuICh2YXJfb3V0KTsKLX0KLSNlbmRpZgotCi0jaWYgKFNIUl9SX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQxNiBzaHJfciAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQotewotICAgIFdvcmQxNiB2YXJfb3V0OwotCi0gICAgaWYgKHZhcjIgPiAxNSkKLSAgICB7Ci0gICAgICAgIHZhcl9vdXQgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB2YXJfb3V0ID0gc2hyKHZhcjEsIHZhcjIpOwotCi0gICAgICAgIGlmICh2YXIyID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCh2YXIxICYgKChXb3JkMTYpIDEgPDwgKHZhcjIgLSAxKSkpICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyX291dCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuICh2YXJfb3V0KTsKLX0KLSNlbmRpZgotCi0jaWYgKE1BQ19SX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQxNiBtYWNfciAoV29yZDMyIExfdmFyMywgV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQotewotICAgIFdvcmQxNiB2YXJfb3V0OwotCi0gICAgTF92YXIzID0gTF9tYWMgKExfdmFyMywgdmFyMSwgdmFyMik7Ci0gICAgdmFyX291dCA9IChXb3JkMTYpKChMX3ZhcjMgKyAweDgwMDBMKSA+PiAxNik7Ci0KLSAgICByZXR1cm4gKHZhcl9vdXQpOwotfQotI2VuZGlmCi0KLSNpZiAoTVNVX1JfSVNfSU5MSU5FKQotX19pbmxpbmUgV29yZDE2IG1zdV9yIChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0gICAgV29yZDE2IHZhcl9vdXQ7Ci0KLSAgICBMX3ZhcjMgPSBMX21zdSAoTF92YXIzLCB2YXIxLCB2YXIyKTsKLSAgICB2YXJfb3V0ID0gKFdvcmQxNikoKExfdmFyMyArIDB4ODAwMEwpID4+IDE2KTsKLQotICAgIHJldHVybiAodmFyX291dCk7Ci19Ci0jZW5kaWYKLQotI2lmIChMX1NIUl9SX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQzMiBMX3Nocl9yIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMikKLXsKLSAgICBXb3JkMzIgTF92YXJfb3V0OwotCi0gICAgaWYgKHZhcjIgPiAzMSkKLSAgICB7Ci0gICAgICAgIExfdmFyX291dCA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIExfdmFyX291dCA9IExfc2hyKExfdmFyMSwgdmFyMik7Ci0KLSAgICAgICAgaWYgKHZhcjIgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKExfdmFyMSAmICgoV29yZDMyKSAxIDw8ICh2YXIyIC0gMSkpKSAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExfdmFyX291dCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIChMX3Zhcl9vdXQpOwotfQotI2VuZGlmCi0KLSNpZiAoRVhUUkFDVF9IX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQxNiBleHRyYWN0X2ggKFdvcmQzMiBMX3ZhcjEpCi17Ci0gICAgV29yZDE2IHZhcl9vdXQ7Ci0KLSAgICB2YXJfb3V0ID0gKFdvcmQxNikgKExfdmFyMSA+PiAxNik7Ci0KLSAgICByZXR1cm4gKHZhcl9vdXQpOwotfQotI2VuZGlmCi0KLSNpZiAoRVhUUkFDVF9MX0lTX0lOTElORSkKLV9faW5saW5lIFdvcmQxNiBleHRyYWN0X2woV29yZDMyIExfdmFyMSkKLXsKLQlyZXR1cm4gKFdvcmQxNikgTF92YXIxOwotfQotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9iYXNpY29wMi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9iYXNpY29wMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDNiYmQ5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3AvYmFzaWNvcDIuYworKysgL2Rldi9udWxsCkBAIC0xLDE2MjQgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQliYXNpY29wMi5jCi0KLQlDb250ZW50OglCYXNpYyBhcml0aG1ldGljIG9wZXJhdG9ycy4KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInR5cGVkZWYuaCIKLSNpbmNsdWRlICJiYXNpY19vcC5oIgotCi0KLS8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBzYXR1cmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIExpbWl0IHRoZSAzMiBiaXQgaW5wdXQgdG8gdGhlIHJhbmdlIG9mIGEgMTYgYml0IHdvcmQuICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIxIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0KLSNpZiAoIVNBVFJVQVRFX0lTX0lOTElORSkKLVdvcmQxNiBzYXR1cmF0ZShXb3JkMzIgTF92YXIxKQotewotICAgIFdvcmQxNiB2YXJfb3V0OwotCi0gICAgaWYgKExfdmFyMSA+IDBYMDAwMDdmZmZMKQotICAgIHsKLSAgICAgICAgdmFyX291dCA9IE1BWF8xNjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoTF92YXIxIDwgKFdvcmQzMikgMHhmZmZmODAwMEwpCi0gICAgewotICAgICAgICB2YXJfb3V0ID0gTUlOXzE2OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB2YXJfb3V0ID0gZXh0cmFjdF9sKExfdmFyMSk7Ci0gICAgfQotCi0gICAgcmV0dXJuICh2YXJfb3V0KTsKLX0KLSNlbmRpZgotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBhZGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIFBlcmZvcm1zIHRoZSBhZGRpdGlvbiAodmFyMSt2YXIyKSB3aXRoIG92ZXJmbG93IGNvbnRyb2wgYW5kIHNhdHVyYXRpb247fAotIHwgICAgdGhlIDE2IGJpdCByZXN1bHQgaXMgc2V0IGF0ICszMjc2NyB3aGVuIG92ZXJmbG93IG9jY3VycyBvciBhdCAtMzI3NjggICB8Ci0gfCAgICB3aGVuIHVuZGVyZmxvdyBvY2N1cnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotCi0jaWYgKCFBRERfSVNfSU5MSU5FKQotV29yZDE2IGFkZCAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQotewotICAgIFdvcmQxNiB2YXJfb3V0OwotICAgIFdvcmQzMiBMX3N1bTsKLQotICAgIExfc3VtID0gKFdvcmQzMil2YXIxICsgKFdvcmQzMil2YXIyOwotICAgIHZhcl9vdXQgPSBzYXR1cmF0ZShMX3N1bSk7Ci0KLSAgICByZXR1cm4gKHZhcl9vdXQpOwotfQotI2VuZGlmCi0KLS8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRnVuY3Rpb24gTmFtZSA6IHN1YiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgUGVyZm9ybXMgdGhlIHN1YnRyYWN0aW9uICh2YXIxK3ZhcjIpIHdpdGggb3ZlcmZsb3cgY29udHJvbCBhbmQgc2F0dS0gICB8Ci0gfCAgICByYXRpb247IHRoZSAxNiBiaXQgcmVzdWx0IGlzIHNldCBhdCArMzI3Njcgd2hlbiBvdmVyZmxvdyBvY2N1cnMgb3IgYXQgIHwKLSB8ICAgIC0zMjc2OCB3aGVuIHVuZGVyZmxvdyBvY2N1cnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0jaWYgKCFTVUJfSVNfSU5MSU5FKQotV29yZDE2IHN1YihXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0gICAgV29yZDE2IHZhcl9vdXQ7Ci0gICAgV29yZDMyIExfZGlmZjsKLQotICAgIExfZGlmZiA9IChXb3JkMzIpIHZhcjEgLSB2YXIyOwotICAgIHZhcl9vdXQgPSBzYXR1cmF0ZShMX2RpZmYpOwotCi0gICAgcmV0dXJuICh2YXJfb3V0KTsKLX0KLSNlbmRpZgotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBhYnNfcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIEFic29sdXRlIHZhbHVlIG9mIHZhcjE7IGFic19zKC0zMjc2OCkgPSAzMjc2Ny4gICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHgwMDAwIDAwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotLy9Xb3JkMTYgYWJzX3MgKFdvcmQxNiB2YXIxKQotLy97Ci0vLyAgICBXb3JkMTYgdmFyX291dDsKLS8vCi0vLyAgICBpZiAodmFyMSA9PSBNSU5fMTYpCi0vLyAgICB7Ci0vLyAgICAgICAgdmFyX291dCA9IE1BWF8xNjsKLS8vICAgIH0KLS8vICAgIGVsc2UKLS8vICAgIHsKLS8vICAgICAgICBpZiAodmFyMSA8IDApCi0vLyAgICAgICAgewotLy8gICAgICAgICAgICB2YXJfb3V0ID0gKFdvcmQxNiktdmFyMTsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgZWxzZQotLy8gICAgICAgIHsKLS8vICAgICAgICAgICAgdmFyX291dCA9IHZhcjE7Ci0vLyAgICAgICAgfQotLy8gICAgfQotLy8KLS8vICAgIHJldHVybiAodmFyX291dCk7Ci0vL30KLQotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBzaGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgQXJpdGhtZXRpY2FsbHkgc2hpZnQgdGhlIDE2IGJpdCBpbnB1dCB2YXIxIGxlZnQgdmFyMiBwb3NpdGlvbnMuWmVybyBmaWxsfAotIHwgICB0aGUgdmFyMiBMU0Igb2YgdGhlIHJlc3VsdC4gSWYgdmFyMiBpcyBuZWdhdGl2ZSwgYXJpdGhtZXRpY2FsbHkgc2hpZnQgICB8Ci0gfCAgIHZhcjEgcmlnaHQgYnkgLXZhcjIgd2l0aCBzaWduIGV4dGVuc2lvbi4gU2F0dXJhdGUgdGhlIHJlc3VsdCBpbiBjYXNlIG9mIHwKLSB8ICAgdW5kZXJmbG93cyBvciBvdmVyZmxvd3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0KLSNpZiAoIVNITF9JU19JTkxJTkUpCi1Xb3JkMTYgc2hsIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0gICAgV29yZDE2IHZhcl9vdXQ7Ci0gICAgV29yZDMyIHJlc3VsdDsKLQotICAgIGlmICh2YXIyIDwgMCkKLSAgICB7Ci0gICAgICAgIGlmICh2YXIyIDwgLTE2KQotICAgICAgICAgICAgdmFyMiA9IC0xNjsKLSAgICAgICAgdmFyX291dCA9IHNociAodmFyMSwgKFdvcmQxNiktdmFyMik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJlc3VsdCA9IChXb3JkMzIpIHZhcjEgKigoV29yZDMyKSAxIDw8IHZhcjIpOwotCi0gICAgICAgIGlmICgodmFyMiA+IDE1ICYmIHZhcjEgIT0gMCkgfHwgKHJlc3VsdCAhPSAoV29yZDMyKSAoKFdvcmQxNikgcmVzdWx0KSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vT3ZlcmZsb3cgPSAxOwotICAgICAgICAgICAgdmFyX291dCA9IChXb3JkMTYpKCh2YXIxID4gMCkgPyBNQVhfMTYgOiBNSU5fMTYpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdmFyX291dCA9IGV4dHJhY3RfbChyZXN1bHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuICh2YXJfb3V0KTsKLX0KLSNlbmRpZgotLy8gZW5kCi0KLS8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRnVuY3Rpb24gTmFtZSA6IHNociAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBBcml0aG1ldGljYWxseSBzaGlmdCB0aGUgMTYgYml0IGlucHV0IHZhcjEgcmlnaHQgdmFyMiBwb3NpdGlvbnMgd2l0aCAgICB8Ci0gfCAgIHNpZ24gZXh0ZW5zaW9uLiBJZiB2YXIyIGlzIG5lZ2F0aXZlLCBhcml0aG1ldGljYWxseSBzaGlmdCB2YXIxIGxlZnQgYnkgIHwKLSB8ICAgLXZhcjIgd2l0aCBzaWduIGV4dGVuc2lvbi4gU2F0dXJhdGUgdGhlIHJlc3VsdCBpbiBjYXNlIG9mIHVuZGVyZmxvd3Mgb3IgfAotIHwgICBvdmVyZmxvd3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgIHwKLSB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAotKi8KLQotI2lmICghU0hSX0lTX0lOTElORSkKLVdvcmQxNiBzaHIgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikKLXsKLSAgICBXb3JkMTYgdmFyX291dDsKLQotICAgIGlmICh2YXIyIDwgMCkKLSAgICB7Ci0gICAgICAgIGlmICh2YXIyIDwgLTE2KQotICAgICAgICAgICAgdmFyMiA9IC0xNjsKLSAgICAgICAgdmFyX291dCA9IHNobCAodmFyMSwgKFdvcmQxNiktdmFyMik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmICh2YXIyID49IDE1KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXJfb3V0ID0gKFdvcmQxNikoKHZhcjEgPCAwKSA/IC0xIDogMCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmFyMSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyX291dCA9IChXb3JkMTYpKH4oKH52YXIxKSA+PiB2YXIyKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyX291dCA9IChXb3JkMTYpKHZhcjEgPj4gdmFyMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gKHZhcl9vdXQpOwotfQotI2VuZGlmCi0KLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBGdW5jdGlvbiBOYW1lIDogbXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBQZXJmb3JtcyB0aGUgbXVsdGlwbGljYXRpb24gb2YgdmFyMSBieSB2YXIyIGFuZCBnaXZlcyBhIDE2IGJpdCByZXN1bHQgIHwKLSB8ICAgIHdoaWNoIGlzIHNjYWxlZCBpLmUuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgbXVsdCh2YXIxLHZhcjIpID0gZXh0cmFjdF9sKExfc2hyKCh2YXIxIHRpbWVzIHZhcjIpLDE1KSkgYW5kICB8Ci0gfCAgICAgICAgICAgICBtdWx0KC0zMjc2OCwtMzI3NjgpID0gMzI3NjcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotI2lmICghTVVMVF9JU19JTkxJTkUpCi1Xb3JkMTYgbXVsdCAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQotewotICAgIFdvcmQxNiB2YXJfb3V0OwotICAgIFdvcmQzMiBMX3Byb2R1Y3Q7Ci0KLSAgICBMX3Byb2R1Y3QgPSAoV29yZDMyKSB2YXIxICooV29yZDMyKSB2YXIyOwotCi0gICAgTF9wcm9kdWN0ID0gKExfcHJvZHVjdCAmIChXb3JkMzIpIDB4ZmZmZjgwMDBMKSA+PiAxNTsKLQotICAgIGlmIChMX3Byb2R1Y3QgJiAoV29yZDMyKSAweDAwMDEwMDAwTCkKLSAgICAgICAgTF9wcm9kdWN0ID0gTF9wcm9kdWN0IHwgKFdvcmQzMikgMHhmZmZmMDAwMEw7Ci0KLSAgICB2YXJfb3V0ID0gc2F0dXJhdGUoTF9wcm9kdWN0KTsKLQotICAgIHJldHVybiAodmFyX291dCk7Ci19Ci0jZW5kaWYKLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBGdW5jdGlvbiBOYW1lIDogTF9tdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIExfbXVsdCBpcyB0aGUgMzIgYml0IHJlc3VsdCBvZiB0aGUgbXVsdGlwbGljYXRpb24gb2YgdmFyMSB0aW1lcyB2YXIyICAgIHwKLSB8ICAgd2l0aCBvbmUgc2hpZnQgbGVmdCBpLmUuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgIExfbXVsdCh2YXIxLHZhcjIpID0gTF9zaGwoKHZhcjEgdGltZXMgdmFyMiksMSkgYW5kICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgTF9tdWx0KC0zMjc2OCwtMzI3NjgpID0gMjE0NzQ4MzY0Ny4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXJfb3V0IDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotCi0jaWYgKCFMX01VTFRfSVNfSU5MSU5FKQotV29yZDMyIExfbXVsdChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0gICAgV29yZDMyIExfdmFyX291dDsKLQotICAgIExfdmFyX291dCA9IChXb3JkMzIpIHZhcjEgKihXb3JkMzIpIHZhcjI7Ci0KLSAgICBpZiAoTF92YXJfb3V0ICE9IChXb3JkMzIpIDB4NDAwMDAwMDBMKQotICAgIHsKLSAgICAgICAgTF92YXJfb3V0IDw8PSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBMX3Zhcl9vdXQgPSBNQVhfMzI7Ci0gICAgfQotCi0gICAgcmV0dXJuIChMX3Zhcl9vdXQpOwotfQotI2VuZGlmCi0vLyBlbmQKLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBGdW5jdGlvbiBOYW1lIDogbmVnYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE5lZ2F0ZSB2YXIxIHdpdGggc2F0dXJhdGlvbiwgc2F0dXJhdGUgaW4gdGhlIGNhc2Ugd2hlcmUgaW5wdXQgaXMgLTMyNzY4OnwKLSB8ICAgICAgICAgICAgICAgIG5lZ2F0ZSh2YXIxKSA9IHN1YigwLHZhcjEpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotLy9Xb3JkMTYgbmVnYXRlIChXb3JkMTYgdmFyMSkKLS8vewotLy8gICAgV29yZDE2IHZhcl9vdXQ7Ci0vLwotLy8gICAgdmFyX291dCA9IChXb3JkMTYpKCh2YXIxID09IE1JTl8xNikgPyBNQVhfMTYgOiAtdmFyMSk7Ci0vLwotLy8gICAgcmV0dXJuICh2YXJfb3V0KTsKLS8vfQotCi0KLS8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRnVuY3Rpb24gTmFtZSA6IGV4dHJhY3RfaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBSZXR1cm4gdGhlIDE2IE1TQiBvZiBMX3ZhcjEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyICkgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIxIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0jaWYgKCFFWFRSQUNUX0hfSVNfSU5MSU5FKQotV29yZDE2IGV4dHJhY3RfaCAoV29yZDMyIExfdmFyMSkKLXsKLSAgICBXb3JkMTYgdmFyX291dDsKLQotICAgIHZhcl9vdXQgPSAoV29yZDE2KSAoTF92YXIxID4+IDE2KTsKLQotICAgIHJldHVybiAodmFyX291dCk7Ci19Ci0jZW5kaWYKLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBGdW5jdGlvbiBOYW1lIDogZXh0cmFjdF9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiB0aGUgMTYgTFNCIG9mIExfdmFyMS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3ZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIgKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3ZhcjEgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgIHwKLSB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAotKi8KLSNpZiAoIUVYVFJBQ1RfTF9JU19JTkxJTkUpCi1Xb3JkMTYgZXh0cmFjdF9sKFdvcmQzMiBMX3ZhcjEpCi17Ci0gICAgV29yZDE2IHZhcl9vdXQ7Ci0KLSAgICB2YXJfb3V0ID0gKFdvcmQxNikgTF92YXIxOwotCi0gICAgcmV0dXJuICh2YXJfb3V0KTsKLX0KLSNlbmRpZgotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiByb3VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUm91bmQgdGhlIGxvd2VyIDE2IGJpdHMgb2YgdGhlIDMyIGJpdCBpbnB1dCBudW1iZXIgaW50byB0aGUgTVMgMTYgYml0cyAgfAotIHwgICB3aXRoIHNhdHVyYXRpb24uIFNoaWZ0IHRoZSByZXN1bHRpbmcgYml0cyByaWdodCBieSAxNiBhbmQgcmV0dXJuIHRoZSAxNiB8Ci0gfCAgIGJpdCBudW1iZXI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgcm91bmQoTF92YXIxKSA9IGV4dHJhY3RfaChMX2FkZChMX3ZhcjEsMzI3NjgpKSAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIExfdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMiApIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyMSA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotCi0jaWYgKCFST1VORF9JU19JTkxJTkUpCi1Xb3JkMTYgcm91bmQxNihXb3JkMzIgTF92YXIxKQotewotICAgIFdvcmQxNiB2YXJfb3V0OwotICAgIFdvcmQzMiBMX3JvdW5kZWQ7Ci0KLSAgICBMX3JvdW5kZWQgPSBMX2FkZCAoTF92YXIxLCAoV29yZDMyKSAweDAwMDA4MDAwTCk7Ci0gICAgdmFyX291dCA9IGV4dHJhY3RfaCAoTF9yb3VuZGVkKTsKLQotICAgIHJldHVybiAodmFyX291dCk7Ci19Ci0jZW5kaWYKLS8vIGVuZAotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBMX21hYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgTXVsdGlwbHkgdmFyMSBieSB2YXIyIGFuZCBzaGlmdCB0aGUgcmVzdWx0IGxlZnQgYnkgMS4gQWRkIHRoZSAzMiBiaXQgICAgfAotIHwgICByZXN1bHQgdG8gTF92YXIzIHdpdGggc2F0dXJhdGlvbiwgcmV0dXJuIGEgMzIgYml0IHJlc3VsdDogICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgTF9tYWMoTF92YXIzLHZhcjEsdmFyMikgPSBMX2FkZChMX3ZhcjMsTF9tdWx0KHZhcjEsdmFyMikpLiAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3ZhcjMgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIzIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXJfb3V0IDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotI2lmICghTF9NU1VfSVNfSU5MSU5FKQotV29yZDMyIExfbWFjIChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0gICAgV29yZDMyIExfdmFyX291dDsKLSAgICBXb3JkMzIgTF9wcm9kdWN0OwotCi0gICAgTF9wcm9kdWN0ID0gTF9tdWx0KHZhcjEsIHZhcjIpOwotICAgIExfdmFyX291dCA9IExfYWRkIChMX3ZhcjMsIExfcHJvZHVjdCk7Ci0KLSAgICByZXR1cm4gKExfdmFyX291dCk7Ci19Ci0jZW5kaWYKLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBGdW5jdGlvbiBOYW1lIDogTF9tc3UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE11bHRpcGx5IHZhcjEgYnkgdmFyMiBhbmQgc2hpZnQgdGhlIHJlc3VsdCBsZWZ0IGJ5IDEuIFN1YnRyYWN0IHRoZSAzMiAgIHwKLSB8ICAgYml0IHJlc3VsdCB0byBMX3ZhcjMgd2l0aCBzYXR1cmF0aW9uLCByZXR1cm4gYSAzMiBiaXQgcmVzdWx0OiAgICAgICAgICAgfAotIHwgICAgICAgIExfbXN1KExfdmFyMyx2YXIxLHZhcjIpID0gTF9zdWIoTF92YXIzLExfbXVsdCh2YXIxLHZhcjIpKS4gICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXIzICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyMyA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIExfdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyX291dCA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgIHwKLSB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAotKi8KLQotI2lmICghTF9NU1VfSVNfSU5MSU5FKQotV29yZDMyIExfbXN1IChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0gICAgV29yZDMyIExfdmFyX291dDsKLSAgICBXb3JkMzIgTF9wcm9kdWN0OwotCi0gICAgTF9wcm9kdWN0ID0gTF9tdWx0KHZhcjEsIHZhcjIpOwotICAgIExfdmFyX291dCA9IExfc3ViIChMX3ZhcjMsIExfcHJvZHVjdCk7Ci0KLSAgICByZXR1cm4gKExfdmFyX291dCk7Ci19Ci0jZW5kaWYKLQotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBMX2FkZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgMzIgYml0cyBhZGRpdGlvbiBvZiB0aGUgdHdvIDMyIGJpdHMgdmFyaWFibGVzIChMX3ZhcjErTF92YXIyKSB3aXRoICAgICAgfAotIHwgICBvdmVyZmxvdyBjb250cm9sIGFuZCBzYXR1cmF0aW9uOyB0aGUgcmVzdWx0IGlzIHNldCBhdCArMjE0NzQ4MzY0NyB3aGVuICB8Ci0gfCAgIG92ZXJmbG93IG9jY3VycyBvciBhdCAtMjE0NzQ4MzY0OCB3aGVuIHVuZGVyZmxvdyBvY2N1cnMuICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3ZhcjEgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIzIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3ZhcjIgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIzIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3Zhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3Zhcl9vdXQgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0jaWYgKCFMX0FERF9JU19JTkxJTkUpCi1Xb3JkMzIgTF9hZGQgKFdvcmQzMiBMX3ZhcjEsIFdvcmQzMiBMX3ZhcjIpCi17Ci0gICAgV29yZDMyIExfdmFyX291dDsKLQotICAgIExfdmFyX291dCA9IExfdmFyMSArIExfdmFyMjsKLQotICAgIGlmICgoKExfdmFyMSBeIExfdmFyMikgJiBNSU5fMzIpID09IDApCi0gICAgewotICAgICAgICBpZiAoKExfdmFyX291dCBeIExfdmFyMSkgJiBNSU5fMzIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExfdmFyX291dCA9IChMX3ZhcjEgPCAwKSA/IE1JTl8zMiA6IE1BWF8zMjsKLSAgICAgICAgICAgIC8vT3ZlcmZsb3cgPSAxOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIChMX3Zhcl9vdXQpOwotfQotI2VuZGlmCi0KLS8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRnVuY3Rpb24gTmFtZSA6IExfc3ViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAzMiBiaXRzIHN1YnRyYWN0aW9uIG9mIHRoZSB0d28gMzIgYml0cyB2YXJpYWJsZXMgKExfdmFyMS1MX3ZhcjIpIHdpdGggICB8Ci0gfCAgIG92ZXJmbG93IGNvbnRyb2wgYW5kIHNhdHVyYXRpb247IHRoZSByZXN1bHQgaXMgc2V0IGF0ICsyMTQ3NDgzNjQ3IHdoZW4gIHwKLSB8ICAgb3ZlcmZsb3cgb2NjdXJzIG9yIGF0IC0yMTQ3NDgzNjQ4IHdoZW4gdW5kZXJmbG93IG9jY3Vycy4gICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIExfdmFyMSAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3ZhcjMgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIExfdmFyMiAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3ZhcjMgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIExfdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyX291dCA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgIHwKLSB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAotKi8KLSNpZiAoIUxfU1VCX0lTX0lOTElORSkKLVdvcmQzMiBMX3N1YihXb3JkMzIgTF92YXIxLCBXb3JkMzIgTF92YXIyKQotewotICAgIFdvcmQzMiBMX3Zhcl9vdXQ7Ci0KLSAgICBMX3Zhcl9vdXQgPSBMX3ZhcjEgLSBMX3ZhcjI7Ci0KLSAgICBpZiAoKChMX3ZhcjEgXiBMX3ZhcjIpICYgTUlOXzMyKSAhPSAwKQotICAgIHsKLSAgICAgICAgaWYgKChMX3Zhcl9vdXQgXiBMX3ZhcjEpICYgTUlOXzMyKQotICAgICAgICB7Ci0gICAgICAgICAgICBMX3Zhcl9vdXQgPSAoTF92YXIxIDwgMEwpID8gTUlOXzMyIDogTUFYXzMyOwotICAgICAgICAgICAgLy9PdmVyZmxvdyA9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gKExfdmFyX291dCk7Ci19Ci0jZW5kaWYKLQotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBMX25lZ2F0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgTmVnYXRlIHRoZSAzMiBiaXQgdmFyaWFibGUgTF92YXIxIHdpdGggc2F0dXJhdGlvbjsgc2F0dXJhdGUgaW4gdGhlIGNhc2UgfAotIHwgICB3aGVyZSBpbnB1dCBpcyAtMjE0NzQ4MzY0OCAoMHg4MDAwIDAwMDApLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXIxICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyMyA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXJfb3V0IDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotLy9Xb3JkMzIgTF9uZWdhdGUgKFdvcmQzMiBMX3ZhcjEpCi0vL3sKLS8vICAgIFdvcmQzMiBMX3Zhcl9vdXQ7Ci0vLwotLy8gICAgTF92YXJfb3V0ID0gKExfdmFyMSA9PSBNSU5fMzIpID8gTUFYXzMyIDogLUxfdmFyMTsKLS8vCi0vLyAgICByZXR1cm4gKExfdmFyX291dCk7Ci0vL30KLQotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBtdWx0X3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgU2FtZSBhcyBtdWx0IHdpdGggcm91bmRpbmcsIGkuZS46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgIG11bHRfcih2YXIxLHZhcjIpID0gZXh0cmFjdF9sKExfc2hyKCgodmFyMSAqIHZhcjIpICsgMTYzODQpLDE1KSkgYW5kICB8Ci0gfCAgICAgbXVsdF9yKC0zMjc2OCwtMzI3NjgpID0gMzI3NjcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotI2lmICghTVVMVF9SX0lTX0lOTElORSkKLVdvcmQxNiBtdWx0X3IgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikKLXsKLSAgICBXb3JkMTYgdmFyX291dDsKLSAgICBXb3JkMzIgTF9wcm9kdWN0X2FycjsKLQotICAgIExfcHJvZHVjdF9hcnIgPSAoV29yZDMyKSB2YXIxICooV29yZDMyKSB2YXIyOyAgICAgICAvKiBwcm9kdWN0ICovCi0gICAgTF9wcm9kdWN0X2FyciArPSAoV29yZDMyKSAweDAwMDA0MDAwTDsgICAgICAvKiByb3VuZCAqLwotICAgIExfcHJvZHVjdF9hcnIgJj0gKFdvcmQzMikgMHhmZmZmODAwMEw7Ci0gICAgTF9wcm9kdWN0X2FyciA+Pj0gMTU7ICAgICAgIC8qIHNoaWZ0ICovCi0KLSAgICBpZiAoTF9wcm9kdWN0X2FyciAmIChXb3JkMzIpIDB4MDAwMTAwMDBMKSAgIC8qIHNpZ24gZXh0ZW5kIHdoZW4gbmVjZXNzYXJ5ICovCi0gICAgewotICAgICAgICBMX3Byb2R1Y3RfYXJyIHw9IChXb3JkMzIpIDB4ZmZmZjAwMDBMOwotICAgIH0KLSAgICB2YXJfb3V0ID0gc2F0dXJhdGUoTF9wcm9kdWN0X2Fycik7Ci0KLSAgICByZXR1cm4gKHZhcl9vdXQpOwotfQotI2VuZGlmCi0KLS8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRnVuY3Rpb24gTmFtZSA6IExfc2hsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBBcml0aG1ldGljYWxseSBzaGlmdCB0aGUgMzIgYml0IGlucHV0IExfdmFyMSBsZWZ0IHZhcjIgcG9zaXRpb25zLiBaZXJvICB8Ci0gfCAgIGZpbGwgdGhlIHZhcjIgTFNCIG9mIHRoZSByZXN1bHQuIElmIHZhcjIgaXMgbmVnYXRpdmUsIGFyaXRobWV0aWNhbGx5ICAgIHwKLSB8ICAgc2hpZnQgTF92YXIxIHJpZ2h0IGJ5IC12YXIyIHdpdGggc2lnbiBleHRlbnNpb24uIFNhdHVyYXRlIHRoZSByZXN1bHQgaW4gfAotIHwgICBjYXNlIG9mIHVuZGVyZmxvd3Mgb3Igb3ZlcmZsb3dzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXIxICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyMyA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3Zhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3Zhcl9vdXQgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0KLSNpZiAoIUxfU0hMX0lTX0lOTElORSkKLVdvcmQzMiBMX3NobCAoV29yZDMyIExfdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0gICAgV29yZDMyIExfdmFyX291dCA9IDBMOwotCi0gICAgaWYgKHZhcjIgPD0gMCkKLSAgICB7Ci0gICAgICAgIExfdmFyMSA9IExfc2hyKExfdmFyMSwgKFdvcmQxNiktdmFyMik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZvciAoOyB2YXIyID4gMDsgdmFyMi0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoTF92YXIxID4gKFdvcmQzMikgMFgzZmZmZmZmZkwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE1BWF8zMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoTF92YXIxIDwgKFdvcmQzMikgMHhjMDAwMDAwMEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTUlOXzMyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExfdmFyMSA8PD0gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKExfdmFyMSk7Ci19Ci0jZW5kaWYKLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBGdW5jdGlvbiBOYW1lIDogTF9zaHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEFyaXRobWV0aWNhbGx5IHNoaWZ0IHRoZSAzMiBiaXQgaW5wdXQgTF92YXIxIHJpZ2h0IHZhcjIgcG9zaXRpb25zIHdpdGggIHwKLSB8ICAgc2lnbiBleHRlbnNpb24uIElmIHZhcjIgaXMgbmVnYXRpdmUsIGFyaXRobWV0aWNhbGx5IHNoaWZ0IExfdmFyMSBsZWZ0ICAgfAotIHwgICBieSAtdmFyMiBhbmQgemVybyBmaWxsIHRoZSAtdmFyMiBMU0Igb2YgdGhlIHJlc3VsdC4gU2F0dXJhdGUgdGhlIHJlc3VsdCB8Ci0gfCAgIGluIGNhc2Ugb2YgdW5kZXJmbG93cyBvciBvdmVyZmxvd3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3ZhcjEgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIzIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIExfdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyX291dCA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgIHwKLSB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAotKi8KLQotI2lmICghTF9TSFJfSVNfSU5MSU5FKQotV29yZDMyIExfc2hyIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMikKLXsKLSAgICBXb3JkMzIgTF92YXJfb3V0OwotCi0gICAgaWYgKHZhcjIgPCAwKQotICAgIHsKLSAgICAgICAgTF92YXJfb3V0ID0gTF9zaGwgKExfdmFyMSwgKFdvcmQxNiktdmFyMik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmICh2YXIyID49IDMxKQotICAgICAgICB7Ci0gICAgICAgICAgICBMX3Zhcl9vdXQgPSAoTF92YXIxIDwgMEwpID8gLTEgOiAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKExfdmFyMSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTF92YXJfb3V0ID0gfigofkxfdmFyMSkgPj4gdmFyMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTF92YXJfb3V0ID0gTF92YXIxID4+IHZhcjI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChMX3Zhcl9vdXQpOwotfQotI2VuZGlmCi0KLS8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRnVuY3Rpb24gTmFtZSA6IHNocl9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBTYW1lIGFzIHNocih2YXIxLHZhcjIpIGJ1dCB3aXRoIHJvdW5kaW5nLiBTYXR1cmF0ZSB0aGUgcmVzdWx0IGluIGNhc2Ugb2Z8Ci0gfCAgIHVuZGVyZmxvd3Mgb3Igb3ZlcmZsb3dzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIC0gSWYgdmFyMiBpcyBncmVhdGVyIHRoYW4gemVybyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgaWYgKHN1YihzaGwoc2hyKHZhcjEsdmFyMiksMSksc2hyKHZhcjEsc3ViKHZhcjIsMSkpKSkgICAgICAgICAgICB8Ci0gfCAgICAgICAgICBpcyBlcXVhbCB0byB6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgdGhlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICBzaHJfcih2YXIxLHZhcjIpID0gc2hyKHZhcjEsdmFyMikgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgc2hyX3IodmFyMSx2YXIyKSA9IGFkZChzaHIodmFyMSx2YXIyKSwxKSAgICAgICAgICAgICAgfAotIHwgICAgLSBJZiB2YXIyIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB6ZXJvIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgIHNocl9yKHZhcjEsdmFyMikgPSBzaHIodmFyMSx2YXIyKS4gICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotI2lmICghU0hSX1JfSVNfSU5MSU5FKQotV29yZDE2IHNocl9yIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0gICAgV29yZDE2IHZhcl9vdXQ7Ci0KLSAgICBpZiAodmFyMiA+IDE1KQotICAgIHsKLSAgICAgICAgdmFyX291dCA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHZhcl9vdXQgPSBzaHIgKHZhcjEsIHZhcjIpOwotCi0gICAgICAgIGlmICh2YXIyID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCh2YXIxICYgKChXb3JkMTYpIDEgPDwgKHZhcjIgLSAxKSkpICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyX291dCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuICh2YXJfb3V0KTsKLX0KLSNlbmRpZgotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBtYWNfciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgTXVsdGlwbHkgdmFyMSBieSB2YXIyIGFuZCBzaGlmdCB0aGUgcmVzdWx0IGxlZnQgYnkgMS4gQWRkIHRoZSAzMiBiaXQgICAgfAotIHwgICByZXN1bHQgdG8gTF92YXIzIHdpdGggc2F0dXJhdGlvbi4gUm91bmQgdGhlIExTIDE2IGJpdHMgb2YgdGhlIHJlc3VsdCAgICB8Ci0gfCAgIGludG8gdGhlIE1TIDE2IGJpdHMgd2l0aCBzYXR1cmF0aW9uIGFuZCBzaGlmdCB0aGUgcmVzdWx0IHJpZ2h0IGJ5IDE2LiAgIHwKLSB8ICAgUmV0dXJuIGEgMTYgYml0IHJlc3VsdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICBtYWNfcihMX3ZhcjMsdmFyMSx2YXIyKSA9IHJvdW5kKExfbWFjKExfdmFyMyx2YXIxLHZhcjIpKSAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXIzICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyMyA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4MDAwMCA4MDAwIDw9IExfdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgIHwKLSB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAotKi8KLSNpZiAoIU1BQ19SX0lTX0lOTElORSkKLVdvcmQxNiBtYWNfciAoV29yZDMyIExfdmFyMywgV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQotewotICAgIFdvcmQxNiB2YXJfb3V0OwotCi0gICAgTF92YXIzID0gTF9tYWMgKExfdmFyMywgdmFyMSwgdmFyMik7Ci0gICAgTF92YXIzID0gTF9hZGQgKExfdmFyMywgKFdvcmQzMikgMHgwMDAwODAwMEwpOwotICAgIHZhcl9vdXQgPSBleHRyYWN0X2ggKExfdmFyMyk7Ci0KLSAgICByZXR1cm4gKHZhcl9vdXQpOwotfQotI2VuZGlmCi0KLS8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRnVuY3Rpb24gTmFtZSA6IG1zdV9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBNdWx0aXBseSB2YXIxIGJ5IHZhcjIgYW5kIHNoaWZ0IHRoZSByZXN1bHQgbGVmdCBieSAxLiBTdWJ0cmFjdCB0aGUgMzIgICB8Ci0gfCAgIGJpdCByZXN1bHQgdG8gTF92YXIzIHdpdGggc2F0dXJhdGlvbi4gUm91bmQgdGhlIExTIDE2IGJpdHMgb2YgdGhlIHJlcy0gIHwKLSB8ICAgdWx0IGludG8gdGhlIE1TIDE2IGJpdHMgd2l0aCBzYXR1cmF0aW9uIGFuZCBzaGlmdCB0aGUgcmVzdWx0IHJpZ2h0IGJ5ICAgfAotIHwgICAxNi4gUmV0dXJuIGEgMTYgYml0IHJlc3VsdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgIG1zdV9yKExfdmFyMyx2YXIxLHZhcjIpID0gcm91bmQoTF9tc3UoTF92YXIzLHZhcjEsdmFyMikpICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3ZhcjMgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIzIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHgwMDAwIDgwMDAgPD0gTF92YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotI2lmICghTVNVX1JfSVNfSU5MSU5FKQotV29yZDE2IG1zdV9yIChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpCi17Ci0gICAgV29yZDE2IHZhcl9vdXQ7Ci0KLSAgICBMX3ZhcjMgPSBMX21zdSAoTF92YXIzLCB2YXIxLCB2YXIyKTsKLSAgICBMX3ZhcjMgPSBMX2FkZCAoTF92YXIzLCAoV29yZDMyKSAweDAwMDA4MDAwTCk7Ci0gICAgdmFyX291dCA9IGV4dHJhY3RfaCAoTF92YXIzKTsKLQotICAgIHJldHVybiAodmFyX291dCk7Ci19Ci0jZW5kaWYKLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBGdW5jdGlvbiBOYW1lIDogTF9kZXBvc2l0X2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIERlcG9zaXQgdGhlIDE2IGJpdCB2YXIxIGludG8gdGhlIDE2IE1TIGJpdHMgb2YgdGhlIDMyIGJpdCBvdXRwdXQuIFRoZSAgIHwKLSB8ICAgMTYgTFMgYml0cyBvZiB0aGUgb3V0cHV0IGFyZSB6ZXJvZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gdmFyX291dCA8PSAweDdmZmYgMDAwMC4gICAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotLy9Xb3JkMzIgTF9kZXBvc2l0X2ggKFdvcmQxNiB2YXIxKQotLy97Ci0vLyAgICBXb3JkMzIgTF92YXJfb3V0OwotLy8KLS8vICAgIExfdmFyX291dCA9IChXb3JkMzIpIHZhcjEgPDwgMTY7Ci0vLwotLy8gICAgcmV0dXJuIChMX3Zhcl9vdXQpOwotLy99Ci0KLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBGdW5jdGlvbiBOYW1lIDogTF9kZXBvc2l0X2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIERlcG9zaXQgdGhlIDE2IGJpdCB2YXIxIGludG8gdGhlIDE2IExTIGJpdHMgb2YgdGhlIDMyIGJpdCBvdXRwdXQuIFRoZSAgIHwKLSB8ICAgMTYgTVMgYml0cyBvZiB0aGUgb3V0cHV0IGFyZSBzaWduIGV4dGVuZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhGRkZGIDgwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfAotIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0qLwotLy9Xb3JkMzIgTF9kZXBvc2l0X2wgKFdvcmQxNiB2YXIxKQotLy97Ci0vLyAgICBXb3JkMzIgTF92YXJfb3V0OwotLy8KLS8vICAgIExfdmFyX291dCA9IChXb3JkMzIpIHZhcjE7Ci0vLwotLy8gICAgcmV0dXJuIChMX3Zhcl9vdXQpOwotLy99Ci0KLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBGdW5jdGlvbiBOYW1lIDogTF9zaHJfciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFNhbWUgYXMgTF9zaHIoTF92YXIxLHZhcjIpIGJ1dCB3aXRoIHJvdW5kaW5nLiBTYXR1cmF0ZSB0aGUgcmVzdWx0IGluICAgIHwKLSB8ICAgY2FzZSBvZiB1bmRlcmZsb3dzIG9yIG92ZXJmbG93cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgLSBJZiB2YXIyIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICBpZiAoTF9zdWIoTF9zaGwoTF9zaHIoTF92YXIxLHZhcjIpLDEpLExfc2hyKExfdmFyMSxzdWIodmFyMiwxKSkpKXwKLSB8ICAgICAgICAgIGlzIGVxdWFsIHRvIHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICB0aGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgIExfc2hyX3IoTF92YXIxLHZhcjIpID0gTF9zaHIoTF92YXIxLHZhcjIpICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICBMX3Nocl9yKExfdmFyMSx2YXIyKSA9IExfYWRkKExfc2hyKExfdmFyMSx2YXIyKSwxKSAgICB8Ci0gfCAgICAtIElmIHZhcjIgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8gOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgTF9zaHJfcihMX3ZhcjEsdmFyMikgPSBMX3NocihMX3ZhcjEsdmFyMikuICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIExfdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IHZhcjEgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3Zhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSB2YXJfb3V0IDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0jaWYgKCFMX1NIUl9SX0lTX0lOTElORSkKLVdvcmQzMiBMX3Nocl9yIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMikKLXsKLSAgICBXb3JkMzIgTF92YXJfb3V0OwotCi0gICAgaWYgKHZhcjIgPiAzMSkKLSAgICB7Ci0gICAgICAgIExfdmFyX291dCA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIExfdmFyX291dCA9IExfc2hyIChMX3ZhcjEsIHZhcjIpOwotCi0gICAgICAgIGlmICh2YXIyID4gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChMX3ZhcjEgJiAoKFdvcmQzMikgMSA8PCAodmFyMiAtIDEpKSkgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMX3Zhcl9vdXQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAoTF92YXJfb3V0KTsKLX0KLSNlbmRpZgotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBMX2FicyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIEFic29sdXRlIHZhbHVlIG9mIExfdmFyMTsgU2F0dXJhdGUgaW4gY2FzZSB3aGVyZSB0aGUgaW5wdXQgaXMgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjE0NzgzNjQ4ICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gdmFyMSA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBMX3Zhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDAwMDAgMDAwMCA8PSB2YXJfb3V0IDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0vL1dvcmQzMiBMX2FicyAoV29yZDMyIExfdmFyMSkKLS8vewotLy8gICAgV29yZDMyIExfdmFyX291dDsKLS8vCi0vLyAgICBpZiAoTF92YXIxID09IE1JTl8zMikKLS8vICAgIHsKLS8vICAgICAgICBMX3Zhcl9vdXQgPSBNQVhfMzI7Ci0vLyAgICB9Ci0vLyAgICBlbHNlCi0vLyAgICB7Ci0vLyAgICAgICAgaWYgKExfdmFyMSA8IDApCi0vLyAgICAgICAgewotLy8gICAgICAgICAgICBMX3Zhcl9vdXQgPSAtTF92YXIxOwotLy8gICAgICAgIH0KLS8vICAgICAgICBlbHNlCi0vLyAgICAgICAgewotLy8gICAgICAgICAgICBMX3Zhcl9vdXQgPSBMX3ZhcjE7Ci0vLyAgICAgICAgfQotLy8gICAgfQotLy8KLS8vICAgIHJldHVybiAoTF92YXJfb3V0KTsKLS8vfQotCi0vKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIEZ1bmN0aW9uIE5hbWUgOiBub3JtX3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHJvZHVjZXMgdGhlIG51bWJlciBvZiBsZWZ0IHNoaWZ0IG5lZWRlZCB0byBub3JtYWxpemUgdGhlIDE2IGJpdCB2YXJpYS0gfAotIHwgICBibGUgdmFyMSBmb3IgcG9zaXRpdmUgdmFsdWVzIG9uIHRoZSBpbnRlcnZhbCB3aXRoIG1pbmltdW0gb2YgMTYzODQgYW5kICB8Ci0gfCAgIG1heGltdW0gb2YgMzI3NjcsIGFuZCBmb3IgbmVnYXRpdmUgdmFsdWVzIG9uIHRoZSBpbnRlcnZhbCB3aXRoIG1pbmltdW0gIHwKLSB8ICAgb2YgLTMyNzY4IGFuZCBtYXhpbXVtIG9mIC0xNjM4NDsgaW4gb3JkZXIgdG8gbm9ybWFsaXplIHRoZSByZXN1bHQsIHRoZSAgfAotIHwgICBmb2xsb3dpbmcgb3BlcmF0aW9uIG11c3QgYmUgZG9uZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgbm9ybV92YXIxID0gc2hsKHZhcjEsbm9ybV9zKHZhcjEpKS4gICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IDB4MDAwMCAwMDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDAwMGYuICAgICAgICAgICAgICAgIHwKLSB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAotKi8KLQotI2lmICghTk9STV9TX0lTX0lOTElORSkKLVdvcmQxNiBub3JtX3MgKFdvcmQxNiB2YXIxKQotewotICAgIFdvcmQxNiB2YXJfb3V0OwotCi0gICAgaWYgKHZhcjEgPT0gMCkKLSAgICB7Ci0gICAgICAgIHZhcl9vdXQgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAodmFyMSA9PSAtMSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyX291dCA9IDE1OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhcjEgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhcjEgPSAoV29yZDE2KX52YXIxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yICh2YXJfb3V0ID0gMDsgdmFyMSA8IDB4NDAwMDsgdmFyX291dCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhcjEgPDw9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gKHZhcl9vdXQpOwotfQotI2VuZGlmCi0KLS8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgRnVuY3Rpb24gTmFtZSA6IGRpdl9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBQcm9kdWNlcyBhIHJlc3VsdCB3aGljaCBpcyB0aGUgZnJhY3Rpb25hbCBpbnRlZ2VyIGRpdmlzaW9uIG9mIHZhcjEgIGJ5ICB8Ci0gfCAgIHZhcjI7IHZhcjEgYW5kIHZhcjIgbXVzdCBiZSBwb3NpdGl2ZSBhbmQgdmFyMiBtdXN0IGJlIGdyZWF0ZXIgb3IgZXF1YWwgIHwKLSB8ICAgdG8gdmFyMTsgdGhlIHJlc3VsdCBpcyBwb3NpdGl2ZSAobGVhZGluZyBiaXQgZXF1YWwgdG8gMCkgYW5kIHRydW5jYXRlZCAgfAotIHwgICB0byAxNiBiaXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIElmIHZhcjEgPSB2YXIyIHRoZW4gZGl2KHZhcjEsdmFyMikgPSAzMjc2Ny4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDAwMDAgMDAwMCA8PSB2YXIxIDw9IHZhcjIgYW5kIHZhcjIgIT0gMC4gICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8Ci0gfCAgICAgICAgICAgICByYW5nZSA6IHZhcjEgPD0gdmFyMiA8PSAweDAwMDAgN2ZmZiBhbmQgdmFyMiAhPSAwLiAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHgwMDAwIDAwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgSXQncyBhIFExNSB2YWx1ZSAocG9pbnQgYmV0d2VlbiBiMTUgYW5kIGIxNCkuICAgICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0KLSNpZiAoIURJVl9TX0lTX0lOTElORSkKLVdvcmQxNiBkaXZfcyAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQotewotICAgIFdvcmQxNiB2YXJfb3V0ID0gMDsKLSAgICBXb3JkMTYgaXRlcmF0aW9uOwotICAgIFdvcmQzMiBMX251bTsKLSAgICBXb3JkMzIgTF9kZW5vbTsKLQotICAgIGlmICh2YXIxID09IDApCi0gICAgewotICAgICAgICB2YXJfb3V0ID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKHZhcjEgPT0gdmFyMikKLSAgICAgICAgewotICAgICAgICAgICAgdmFyX291dCA9IE1BWF8xNjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIExfbnVtID0gTF9kZXBvc2l0X2wgKHZhcjEpOwotICAgICAgICAgICAgTF9kZW5vbSA9IExfZGVwb3NpdF9sICh2YXIyKTsKLQotICAgICAgICAgICAgZm9yIChpdGVyYXRpb24gPSAwOyBpdGVyYXRpb24gPCAxNTsgaXRlcmF0aW9uKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyX291dCA8PD0gMTsKLSAgICAgICAgICAgICAgICBMX251bSA8PD0gMTsKLQotICAgICAgICAgICAgICAgIGlmIChMX251bSA+PSBMX2Rlbm9tKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTF9udW0gPSBMX3N1YihMX251bSwgTF9kZW5vbSk7Ci0gICAgICAgICAgICAgICAgICAgIHZhcl9vdXQgPSBhZGQgKHZhcl9vdXQsIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAodmFyX291dCk7Ci19Ci0jZW5kaWYKLQotLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICBGdW5jdGlvbiBOYW1lIDogbm9ybV9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIFByb2R1Y2VzIHRoZSBudW1iZXIgb2YgbGVmdCBzaGlmdHMgbmVlZGVkIHRvIG5vcm1hbGl6ZSB0aGUgMzIgYml0IHZhcmlhLXwKLSB8ICAgYmxlIExfdmFyMSBmb3IgcG9zaXRpdmUgdmFsdWVzIG9uIHRoZSBpbnRlcnZhbCB3aXRoIG1pbmltdW0gb2YgICAgICAgICAgfAotIHwgICAxMDczNzQxODI0IGFuZCBtYXhpbXVtIG9mIDIxNDc0ODM2NDcsIGFuZCBmb3IgbmVnYXRpdmUgdmFsdWVzIG9uIHRoZSBpbi18Ci0gfCAgIHRlcnZhbCB3aXRoIG1pbmltdW0gb2YgLTIxNDc0ODM2NDggYW5kIG1heGltdW0gb2YgLTEwNzM3NDE4MjQ7IGluIG9yZGVyIHwKLSB8ICAgdG8gbm9ybWFsaXplIHRoZSByZXN1bHQsIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9uIG11c3QgYmUgZG9uZSA6ICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgbm9ybV9MX3ZhcjEgPSBMX3NobChMX3ZhcjEsbm9ybV9sKExfdmFyMSkpLiAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgTF92YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwKLSB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gdmFyMSA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfAotIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDAwMDAgMDAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCAwMDFmLiAgICAgICAgICAgICAgICB8Ci0gfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKLSovCi0KLSNpZiAoIU5PUk1fTF9JU19JTkxJTkUpCi1Xb3JkMTYgbm9ybV9sIChXb3JkMzIgTF92YXIxKQotewotICAgIFdvcmQxNiB2YXJfb3V0OwotCi0gICAgaWYgKExfdmFyMSA9PSAwKQotICAgIHsKLSAgICAgICAgdmFyX291dCA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChMX3ZhcjEgPT0gKFdvcmQzMikgMHhmZmZmZmZmZkwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhcl9vdXQgPSAzMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChMX3ZhcjEgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExfdmFyMSA9IH5MX3ZhcjE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKHZhcl9vdXQgPSAwOyBMX3ZhcjEgPCAoV29yZDMyKSAweDQwMDAwMDAwTDsgdmFyX291dCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExfdmFyMSA8PD0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAodmFyX291dCk7Ci19Ci0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9vcGVyXzMyYi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9vcGVyXzMyYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGYwMzJiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3Avb3Blcl8zMmIuYworKysgL2Rldi9udWxsCkBAIC0xLDM2MyArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCW9wZXJfMzJiLmMKLQotCUNvbnRlbnQ6CSAgVGhpcyBmaWxlIGNvbnRhaW5zIG9wZXJhdGlvbnMgaW4gZG91YmxlIHByZWNpc2lvbi4KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInR5cGVkZWYuaCIKLSNpbmNsdWRlICJiYXNpY19vcC5oIgotI2luY2x1ZGUgIm9wZXJfMzJiLmgiCi0KLSNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogIEZ1bmN0aW9uIExfRXh0cmFjdCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICBFeHRyYWN0IGZyb20gYSAzMiBiaXQgaW50ZWdlciB0d28gMTYgYml0IERQRi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgQXJndW1lbnRzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBMXzMyICAgICAgOiAzMiBiaXQgaW50ZWdlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgIDB4ODAwMCAwMDAwIDw9IExfMzIgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgaGkgICAgICAgIDogYjE2IHRvIGIzMSBvZiBMXzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBsbyAgICAgICAgOiAoTF8zMiAtIGhpPDwxNik+PjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLXZvaWQgTF9FeHRyYWN0IChXb3JkMzIgTF8zMiwgV29yZDE2ICpoaSwgV29yZDE2ICpsbykKLXsKLSAgICAqaGkgPSBleHRyYWN0X2ggKExfMzIpOwotICAgICpsbyA9IGV4dHJhY3RfbCAoTF9tc3UgKExfc2hyIChMXzMyLCAxKSwgKmhpLCAxNjM4NCkpOwotICAgIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICBGdW5jdGlvbiBMX0NvbXAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgQ29tcG9zZSBmcm9tIHR3byAxNiBiaXQgRFBGIGEgMzIgYml0IGludGVnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgIExfMzIgPSBoaTw8MTYgKyBsbzw8MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICBBcmd1bWVudHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIGhpICAgICAgICBtc2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgbG8gICAgICAgIGxzZiAod2l0aCBzaWduKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICAqCi0gKiAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfMzIgPD0gMHg3ZmZmIGZmZjAuICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1Xb3JkMzIgTF9Db21wIChXb3JkMTYgaGksIFdvcmQxNiBsbykKLXsKLSAgICBXb3JkMzIgTF8zMjsKLQotICAgIExfMzIgPSBMX2RlcG9zaXRfaCAoaGkpOwotICAgIHJldHVybiAoTF9tYWMgKExfMzIsIGxvLCAxKSk7ICAgICAgIC8qID0gaGk8PDE2ICsgbG88PDEgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiBNcHlfMzIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBNdWx0aXBseSB0d28gMzIgYml0IGludGVnZXJzIChEUEYpLiBUaGUgcmVzdWx0IGlzIGRpdmlkZWQgYnkgMioqMzEgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgTF8zMiA9IChoaTEqaGkyKTw8MSArICggKGhpMSpsbzIpPj4xNSArIChsbzEqaGkyKT4+MTUgKTw8MSAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIFRoaXMgb3BlcmF0aW9uIGNhbiBhbHNvIGJlIHZpZXdlZCBhcyB0aGUgbXVsdGlwbGljYXRpb24gb2YgdHdvIFEzMSAgICAgICoKLSAqICAgbnVtYmVyIGFuZCB0aGUgcmVzdWx0IGlzIGFsc28gaW4gUTMxLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBBcmd1bWVudHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogIGhpMSAgICAgICAgIGhpIHBhcnQgb2YgZmlyc3QgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgbG8xICAgICAgICAgbG8gcGFydCBvZiBmaXJzdCBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICBoaTIgICAgICAgICBoaSBwYXJ0IG9mIHNlY29uZCBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogIGxvMiAgICAgICAgIGxvIHBhcnQgb2Ygc2Vjb25kIG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotV29yZDMyIE1weV8zMiAoV29yZDE2IGhpMSwgV29yZDE2IGxvMSwgV29yZDE2IGhpMiwgV29yZDE2IGxvMikKLXsKLSAgICBXb3JkMzIgTF8zMjsKLQotICAgIExfMzIgPSBMX211bHQgKGhpMSwgaGkyKTsKLSAgICBMXzMyID0gTF9tYWMgKExfMzIsIG11bHQgKGhpMSwgbG8yKSwgMSk7Ci0gICAgTF8zMiA9IExfbWFjIChMXzMyLCBtdWx0IChsbzEsIGhpMiksIDEpOwotCi0gICAgcmV0dXJuIChMXzMyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiBNcHlfMzJfMTYoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICBNdWx0aXBseSBhIDE2IGJpdCBpbnRlZ2VyIGJ5IGEgMzIgYml0IChEUEYpLiBUaGUgcmVzdWx0IGlzIGRpdmlkZWQgICAgICAqCi0gKiAgIGJ5IDIqKjE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIExfMzIgPSAoaGkxKmxvMik8PDEgKyAoKGxvMSpsbzIpPj4xNSk8PDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogQXJndW1lbnRzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICBoaSAgICAgICAgICBoaSBwYXJ0IG9mIDMyIGJpdCBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogIGxvICAgICAgICAgIGxvIHBhcnQgb2YgMzIgYml0IG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgbiAgICAgICAgICAgMTYgYml0IG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1Xb3JkMzIgTXB5XzMyXzE2IChXb3JkMTYgaGksIFdvcmQxNiBsbywgV29yZDE2IG4pCi17Ci0gICAgV29yZDMyIExfMzI7Ci0KLSAgICBMXzMyID0gTF9tdWx0IChoaSwgbik7Ci0gICAgTF8zMiA9IExfbWFjIChMXzMyLCBtdWx0IChsbywgbiksIDEpOwotCi0gICAgcmV0dXJuIChMXzMyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgRnVuY3Rpb24gTmFtZSA6IERpdl8zMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgIEZyYWN0aW9uYWwgaW50ZWdlciBkaXZpc2lvbiBvZiB0d28gMzIgYml0IG51bWJlcnMuICAgICAgICAgICAgKgotICogICAgICAgICAgICAgTF9udW0gLyBMX2Rlbm9tLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICBMX251bSBhbmQgTF9kZW5vbSBtdXN0IGJlIHBvc2l0aXZlIGFuZCBMX251bSA8IExfZGVub20uICAgICAgICoKLSAqICAgICAgICAgICAgIExfZGVub20gPSBkZW5vbV9oaTw8MTYgKyBkZW5vbV9sbzw8MSAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgZGVub21faGkgaXMgYSBub3JtYWxpemUgbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICBMX251bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgKgotICogICAgICAgICAgICAgcmFuZ2UgOiAweDAwMDAgMDAwMCA8IExfbnVtIDwgTF9kZW5vbSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgIExfZGVub20gPSBkZW5vbV9oaTw8MTYgKyBkZW5vbV9sbzw8MSAgICAgIChEUEYpICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICBkZW5vbV9oaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgIDE2IGJpdCBwb3NpdGl2ZSBub3JtYWxpemVkIGludGVnZXIgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICAgKgotICogICAgICAgICAgICAgcmFuZ2UgOiAweDQwMDAgPCBoaSA8IDB4N2ZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICBkZW5vbV9sbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgIDE2IGJpdCBwb3NpdGl2ZSBpbnRlZ2VyIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgcmFuZ2UgOiAwIDwgbG8gPCAweDdmZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICBMX2RpdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgKgotICogICAgICAgICAgICAgcmFuZ2UgOiAweDAwMDAgMDAwMCA8PSBMX2RpdiA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICBBbGdvcml0aG06ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgLSBmaW5kID0gMS9MX2Rlbm9tLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgRmlyc3QgYXBwcm94aW1hdGlvbjogYXBwcm94ID0gMSAvIGRlbm9tX2hpICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAxL0xfZGVub20gPSBhcHByb3ggKiAoMi4wIC0gTF9kZW5vbSAqIGFwcHJveCApICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAtICByZXN1bHQgPSBMX251bSAqICgxL0xfZGVub20pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1Xb3JkMzIgRGl2XzMyIChXb3JkMzIgTF9udW0sIFdvcmQzMiBkZW5vbSkKLXsKLSAgICBXb3JkMTYgYXBwcm94OwotICAgIFdvcmQzMiBMXzMyOwotICAgIC8qIEZpcnN0IGFwcHJveGltYXRpb246IDEgLyBMX2Rlbm9tID0gMS9kZW5vbV9oaSAqLwotCi0gICAgYXBwcm94ID0gZGl2X3MgKChXb3JkMTYpIDB4M2ZmZiwgZGVub20gPj4gMTYpOwotCi0gICAgLyogMS9MX2Rlbm9tID0gYXBwcm94ICogKDIuMCAtIExfZGVub20gKiBhcHByb3gpICovCi0KLSAgICBMXzMyID0gTF9tcHlfbHMgKGRlbm9tLCBhcHByb3gpOwotCi0gICAgTF8zMiA9IExfc3ViICgoV29yZDMyKSAweDdmZmZmZmZmTCwgTF8zMik7Ci0KLQlMXzMyID0gTF9tcHlfbHMgKExfMzIsIGFwcHJveCk7Ci0gICAgLyogTF9udW0gKiAoMS9MX2Rlbm9tKSAqLwotCi0JTF8zMiA9IE1VTEhJR0goTF8zMiwgTF9udW0pOwotICAgIExfMzIgPSBMX3NobCAoTF8zMiwgMyk7Ci0KLSAgICByZXR1cm4gKExfMzIpOwotfQotCi0vKiEKLQotICBcYnJpZWYgIGNhbGN1bGF0ZXMgdGhlIGxvZyBkdWFsaXMgdGltZXMgNCBvZiBhcmd1bWVudAotICAgICAgICAgIGlMb2c0KHgpID0gKFdvcmQzMikoNCAqIGxvZyh2YWx1ZSkvbG9nKDIuMCkpCi0KLSAgXHJldHVybiBpbG9nNCB2YWx1ZQotCi0qLwotV29yZDE2IGlMb2c0KFdvcmQzMiB2YWx1ZSkKLXsKLSAgV29yZDE2IGlMb2c0OwotCi0gIGlmKHZhbHVlICE9IDApewotICAgIFdvcmQzMiB0bXA7Ci0gICAgV29yZDE2IHRtcDE2OwotICAgIGlMb2c0ID0gbm9ybV9sKHZhbHVlKTsKLSAgICB0bXAgPSAodmFsdWUgPDwgaUxvZzQpOwotICAgIHRtcDE2ID0gcm91bmQxNih0bXApOwotICAgIHRtcCA9IExfbXVsdCh0bXAxNiwgdG1wMTYpOwotICAgIHRtcDE2ID0gcm91bmQxNih0bXApOwotICAgIHRtcCA9IExfbXVsdCh0bXAxNiwgdG1wMTYpOwotICAgIHRtcDE2ID0gcm91bmQxNih0bXApOwotCi0gICAgaUxvZzQgPSAoLShpTG9nNCA8PCAyKSAtIG5vcm1fcyh0bXAxNikpIC0gMTsKLSAgfQotICBlbHNlIHsKLSAgICBpTG9nNCA9IC0xMjg7IC8qIC0oSU5UX0JJVFMqNCk7ICovCi0gIH0KLQotICByZXR1cm4gaUxvZzQ7Ci19Ci0KLSNkZWZpbmUgc3RlcChzaGlmdCkgXAotICAgIGlmICgoMHg0MDAwMDAwMGwgPj4gKHNoaWZ0KSkgKyByb290IDw9IHZhbHVlKSAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHZhbHVlIC09ICgweDQwMDAwMDAwbCA+PiAoc2hpZnQpKSArIHJvb3Q7ICAgICAgIFwKLSAgICAgICAgcm9vdCA9IChyb290ID4+IDEpIHwgKDB4NDAwMDAwMDBsID4+IChzaGlmdCkpOyAgXAotICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICByb290ID0gcm9vdCA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0KLQotV29yZDMyIHJzcXJ0KFdvcmQzMiB2YWx1ZSwgICAgIC8qITwgT3BlcmFuZCB0byBzcXVhcmUgcm9vdCAoMC4wIC4uLiAxKSAqLwotICAgICAgICAgICAgIFdvcmQzMiBhY2N1cmFjeSkgIC8qITwgTnVtYmVyIG9mIHZhbGlkIGJpdHMgdGhhdCB3aWxsIGJlIGNhbGN1bGF0ZWQgKi8KLXsKLSAgICBXb3JkMzIgcm9vdCA9IDA7Ci0JV29yZDMyIHNjYWxlOwotICAgIFVOVVNFRChhY2N1cmFjeSk7Ci0KLQlpZih2YWx1ZSA8IDApCi0JCXJldHVybiAwOwotCi0Jc2NhbGUgPSBub3JtX2wodmFsdWUpOwotCWlmKHNjYWxlICYgMSkgc2NhbGUtLTsKLQotCXZhbHVlIDw8PSBzY2FsZTsKLQotCXN0ZXAoIDApOyBzdGVwKCAyKTsgc3RlcCggNCk7IHN0ZXAoIDYpOwotICAgIHN0ZXAoIDgpOyBzdGVwKDEwKTsgc3RlcCgxMik7IHN0ZXAoMTQpOwotICAgIHN0ZXAoMTYpOyBzdGVwKDE4KTsgc3RlcCgyMCk7IHN0ZXAoMjIpOwotICAgIHN0ZXAoMjQpOyBzdGVwKDI2KTsgc3RlcCgyOCk7IHN0ZXAoMzApOwotCi0gICAgc2NhbGUgPj49IDE7Ci0JaWYgKHJvb3QgPCB2YWx1ZSkKLSAgICAgICAgKytyb290OwotCi0Jcm9vdCA+Pj0gc2NhbGU7Ci0gICAgcmV0dXJuIHJvb3QqIDQ2MzM0OwotfQotCi1zdGF0aWMgY29uc3QgV29yZDMyIHBvdzJUYWJsZVtQT1cyX1RBQkxFX1NJWkVdID0gewotMHg3ZmZmZmZmZiwgMHg3ZmE3NjVhZCwgMHg3ZjRmMDhhZSwgMHg3ZWY2ZThkYSwKLTB4N2U5ZjA2MDYsIDB4N2U0NzYwMDksIDB4N2RlZmY2YjYsIDB4N2Q5OGM5ZTYsCi0weDdkNDFkOTZlLCAweDdjZWIyNTIzLCAweDdjOTRhY2RlLCAweDdjM2U3MDczLAotMHg3YmU4NmZiOSwgMHg3YjkyYWE4OCwgMHg3YjNkMjBiNiwgMHg3YWU3ZDIxYSwKLTB4N2E5MmJlOGIsIDB4N2EzZGU1ZGYsIDB4NzllOTQ3ZWYsIDB4Nzk5NGU0OTIsCi0weDc5NDBiYjllLCAweDc4ZWNjY2VjLCAweDc4OTkxODU0LCAweDc4NDU5ZGFjLAotMHg3N2YyNWNjZSwgMHg3NzlmNTU5MSwgMHg3NzRjODdjYywgMHg3NmY5ZjM1OSwKLTB4NzZhNzk4MGYsIDB4NzY1NTc1YzgsIDB4NzYwMzhjNWIsIDB4NzViMWRiYTIsCi0weDc1NjA2Mzc0LCAweDc1MGYyM2FiLCAweDc0YmUxYzIwLCAweDc0NmQ0Y2FjLAotMHg3NDFjYjUyOCwgMHg3M2NjNTU2ZCwgMHg3MzdjMmQ1NSwgMHg3MzJjM2NiYSwKLTB4NzJkYzgzNzQsIDB4NzI4ZDAxNWQsIDB4NzIzZGI2NTAsIDB4NzFlZWEyMjYsCi0weDcxOWZjNGI5LCAweDcxNTExZGU0LCAweDcxMDJhZDgwLCAweDcwYjQ3MzY4LAotMHg3MDY2NmY3NiwgMHg3MDE4YTE4NSwgMHg2ZmNiMDk2ZiwgMHg2ZjdkYTcxMCwKLTB4NmYzMDdhNDEsIDB4NmVlMzgyZGUsIDB4NmU5NmMwYzMsIDB4NmU0YTMzYzksCi0weDZkZmRkYmNjLCAweDZkYjFiOGE4LCAweDZkNjVjYTM4LCAweDZkMWExMDU3LAotMHg2Y2NlOGFlMSwgMHg2YzgzMzliMiwgMHg2YzM4MWNhNiwgMHg2YmVkMzM5OCwKLTB4NmJhMjdlNjYsIDB4NmI1N2ZjZTksIDB4NmIwZGFlZmYsIDB4NmFjMzk0ODUsCi0weDZhNzlhZDU2LCAweDZhMmZmOTRmLCAweDY5ZTY3ODRkLCAweDY5OWQyYTJjLAotMHg2OTU0MGVjOSwgMHg2OTBiMjYwMSwgMHg2OGMyNmZiMSwgMHg2ODc5ZWJiNiwKLTB4NjgzMTk5ZWQsIDB4NjdlOTdhMzQsIDB4NjdhMThjNjgsIDB4Njc1OWQwNjUsCi0weDY3MTI0NjBiLCAweDY2Y2FlZDM1LCAweDY2ODNjNWMzLCAweDY2M2NjZjkyLAotMHg2NWY2MGE4MCwgMHg2NWFmNzY2YSwgMHg2NTY5MTMyZiwgMHg2NTIyZTBhZCwKLTB4NjRkY2RlYzMsIDB4NjQ5NzBkNGYsIDB4NjQ1MTZjMmUsIDB4NjQwYmZiNDEsCi0weDYzYzZiYTY0LCAweDYzODFhOTc4LCAweDYzM2NjODViLCAweDYyZjgxNmViLAotMHg2MmIzOTUwOSwgMHg2MjZmNDI5MiwgMHg2MjJiMWY2NiwgMHg2MWU3MmI2NSwKLTB4NjFhMzY2NmQsIDB4NjE1ZmQwNWYsIDB4NjExYzY5MTksIDB4NjBkOTMwN2IsCi0weDYwOTYyNjY1LCAweDYwNTM0YWI3LCAweDYwMTA5ZDUxLCAweDVmY2UxZTEyLAotMHg1ZjhiY2NkYiwgMHg1ZjQ5YTk4YywgMHg1ZjA3YjQwNSwgMHg1ZWM1ZWMyNiwKLTB4NWU4NDUxZDAsIDB4NWU0MmU0ZTMsIDB4NWUwMWE1NDAsIDB4NWRjMDkyYzcsCi0weDVkN2ZhZDU5LCAweDVkM2VmNGQ3LCAweDVjZmU2OTIzLCAweDVjYmUwYTFjLAotMHg1YzdkZDdhNCwgMHg1YzNkZDE5YywgMHg1YmZkZjdlNSwgMHg1YmJlNGE2MSwKLTB4NWI3ZWM4ZjIsIDB4NWIzZjczNzcsIDB4NWIwMDQ5ZDQsIDB4NWFjMTRiZWEsCi0weDVhODI3OTlhLCAweDVhNDNkMmM2LCAweDVhMDU1NzUxLCAweDU5YzcwNzFjLAotMHg1OTg4ZTIwOSwgMHg1OTRhZTdmYiwgMHg1OTBkMThkMywgMHg1OGNmNzQ3NCwKLTB4NTg5MWZhYzEsIDB4NTg1NGFiOWIsIDB4NTgxNzg2ZTYsIDB4NTdkYThjODMsCi0weDU3OWRiYzU3LCAweDU3NjExNjQyLCAweDU3MjQ5YTI5LCAweDU2ZTg0N2VmLAotMHg1NmFjMWY3NSwgMHg1NjcwMjBhMCwgMHg1NjM0NGI1MiwgMHg1NWY4OWY3MCwKLTB4NTViZDFjZGIsIDB4NTU4MWMzNzgsIDB4NTU0NjkzMjksIDB4NTUwYjhiZDQsCi0weDU0ZDBhZDViLCAweDU0OTVmN2ExLCAweDU0NWI2YThiLCAweDU0MjEwNWZkLAotMHg1M2U2YzlkYiwgMHg1M2FjYjYwNywgMHg1MzcyY2E2OCwgMHg1MzM5MDZlMCwKLTB4NTJmZjZiNTUsIDB4NTJjNWY3YWEsIDB4NTI4Y2FiYzMsIDB4NTI1Mzg3ODYsCi0weDUyMWE4YWQ3LCAweDUxZTFiNTlhLCAweDUxYTkwN2I0LCAweDUxNzA4MTBiLAotMHg1MTM4MjE4MiwgMHg1MGZmZThmZSwgMHg1MGM3ZDc2NSwgMHg1MDhmZWM5YywKLTB4NTA1ODI4ODgsIDB4NTAyMDhiMGUsIDB4NGZlOTE0MTMsIDB4NGZiMWMzN2MsCi0weDRmN2E5OTMwLCAweDRmNDM5NTE0LCAweDRmMGNiNzBjLCAweDRlZDVmZjAwLAotMHg0ZTlmNmNkNCwgMHg0ZTY5MDA2ZSwgMHg0ZTMyYjliNCwgMHg0ZGZjOTg4YywKLTB4NGRjNjljZGQsIDB4NGQ5MGM2OGIsIDB4NGQ1YjE1N2UsIDB4NGQyNTg5OWMsCi0weDRjZjAyMmNhLCAweDRjYmFlMGVmLCAweDRjODVjM2YxLCAweDRjNTBjYmI4LAotMHg0YzFiZjgyOSwgMHg0YmU3NDkyYiwgMHg0YmIyYmVhNSwgMHg0YjdlNTg3ZCwKLTB4NGI0YTE2OWMsIDB4NGIxNWY4ZTYsIDB4NGFlMWZmNDMsIDB4NGFhZTI5OWIsCi0weDRhN2E3N2Q1LCAweDRhNDZlOWQ2LCAweDRhMTM3Zjg4LCAweDQ5ZTAzOGQwLAotMHg0OWFkMTU5OCwgMHg0OTdhMTVjNCwgMHg0OTQ3MzkzZiwgMHg0OTE0N2ZlZSwKLTB4NDhlMWU5YmEsIDB4NDhhZjc2OGEsIDB4NDg3ZDI2NDYsIDB4NDg0YWY4ZDYsCi0weDQ4MThlZTIyLCAweDQ3ZTcwNjExLCAweDQ3YjU0MDhjLCAweDQ3ODM5ZDdiLAotMHg0NzUyMWNjNiwgMHg0NzIwYmU1NSwgMHg0NmVmODIxMCwgMHg0NmJlNjdlMCwKLTB4NDY4ZDZmYWUsIDB4NDY1Yzk5NjEsIDB4NDYyYmU0ZTIsIDB4NDVmYjUyMWEsCi0weDQ1Y2FlMGYyLCAweDQ1OWE5MTUyLCAweDQ1NmE2MzIzLCAweDQ1M2E1NjRkLAotMHg0NTBhNmFiYiwgMHg0NGRhYTA1NCwgMHg0NGFhZjcwMiwgMHg0NDdiNmVhZCwKLTB4NDQ0YzA3NDAsIDB4NDQxY2MwYTMsIDB4NDNlZDlhYzAsIDB4NDNiZTk1ODAsCi0weDQzOGZiMGNiLCAweDQzNjBlYzhkLCAweDQzMzI0OGFlLCAweDQzMDNjNTE3LAotMHg0MmQ1NjFiNCwgMHg0MmE3MWU2YywgMHg0Mjc4ZmIyYiwgMHg0MjRhZjdkYSwKLTB4NDIxZDE0NjIsIDB4NDFlZjUwYWUsIDB4NDFjMWFjYTgsIDB4NDE5NDI4MzksCi0weDQxNjZjMzRjLCAweDQxMzk3ZGNjLCAweDQxMGM1N2EyLCAweDQwZGY1MGI4LAotMHg0MGIyNjhmYSwgMHg0MDg1YTA1MSwgMHg0MDU4ZjZhOCwgMHg0MDJjNmJlOQotfTsKLQotLyohCi0KLSAgXGJyaWVmIGNhbGN1bGF0ZXMgMiBeICh4L3kpIGZvciB4PD0wLCB5ID4gMCwgeCA8PSAzMjc2OCAqIHkKLQotICBhdm9pZHMgaW50ZWdlciBkaXZpc2lvbgotCi0gIFxyZXR1cm4KLSovCi1Xb3JkMzIgcG93Ml94eShXb3JkMzIgeCwgV29yZDMyIHkpCi17Ci0gIFVXb3JkMzIgaVBhcnQ7Ci0gIFVXb3JkMzIgZlBhcnQ7Ci0gIFdvcmQzMiByZXM7Ci0gIFdvcmQzMiB0bXA7Ci0KLSAgdG1wID0gLXg7Ci0gIGlQYXJ0ID0gdG1wIC8geTsKLSAgZlBhcnQgPSB0bXAgLSBpUGFydCp5OwotICBpUGFydCA9IG1pbihpUGFydCxJTlRfQklUUy0xKTsKLQotICByZXMgPSBwb3cyVGFibGVbKFBPVzJfVEFCTEVfU0laRSpmUGFydCkveV0gPj4gaVBhcnQ7Ci0KLSAgcmV0dXJuKHJlcyk7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL29wZXJfMzJiLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL29wZXJfMzJiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNTg0NGYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9vcGVyXzMyYi5oCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlvcGVyXzMyYi5oCi0KLQlDb250ZW50OglEb3VibGUgcHJlY2lzaW9uIG9wZXJhdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX09QRVJfMzJiX0gKLSNkZWZpbmUgX19PUEVSXzMyYl9ICi0KLSNpbmNsdWRlICJ0eXBlZGVmLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2RlZmluZSBQT1cyX1RBQkxFX0JJVFMgOAotI2RlZmluZSBQT1cyX1RBQkxFX1NJWkUgKDE8PFBPVzJfVEFCTEVfQklUUykKLQotdm9pZCBMX0V4dHJhY3QgKFdvcmQzMiBMXzMyLCBXb3JkMTYgKmhpLCBXb3JkMTYgKmxvKTsKLVdvcmQzMiBMX0NvbXAgKFdvcmQxNiBoaSwgV29yZDE2IGxvKTsKLVdvcmQzMiBNcHlfMzIgKFdvcmQxNiBoaTEsIFdvcmQxNiBsbzEsIFdvcmQxNiBoaTIsIFdvcmQxNiBsbzIpOwotV29yZDMyIE1weV8zMl8xNiAoV29yZDE2IGhpLCBXb3JkMTYgbG8sIFdvcmQxNiBuKTsKLVdvcmQzMiBEaXZfMzIgKFdvcmQzMiBMX251bSwgV29yZDMyIGRlbm9tKTsKLVdvcmQxNiBpTG9nNChXb3JkMzIgdmFsdWUpOwotV29yZDMyIHJzcXJ0KFdvcmQzMiB2YWx1ZSwgIFdvcmQzMiBhY2N1cmFjeSk7Ci1Xb3JkMzIgcG93Ml94eShXb3JkMzIgeCwgV29yZDMyIHkpOwotCi1fX2lubGluZSBXb3JkMzIgTF9tcHlfbHMoV29yZDMyIExfdmFyMiwgV29yZDE2IHZhcjEpCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgc3dMb3cxOwotICAgIFdvcmQxNiBzd0hpZ2gxOwotICAgIFdvcmQzMiBsX3Zhcl9vdXQ7Ci0KLSAgICBzd0xvdzEgPSAodW5zaWduZWQgc2hvcnQpKExfdmFyMik7Ci0gICAgc3dIaWdoMSA9IChXb3JkMTYpKExfdmFyMiA+PiAxNik7Ci0KLSAgICBsX3Zhcl9vdXQgPSAobG9uZylzd0xvdzEgKiAobG9uZyl2YXIxID4+IDE1OwotCi0gICAgbF92YXJfb3V0ICs9IHN3SGlnaDEgKiB2YXIxIDw8IDE7Ci0KLSAgICByZXR1cm4obF92YXJfb3V0KTsKLX0KLQotX19pbmxpbmUgV29yZDMyIExfbXB5X3d4KFdvcmQzMiBMX3ZhcjIsIFdvcmQxNiB2YXIxKQotewotI2lmIEFSTVY1VEVfTF9NUFlfTFMKLQlXb3JkMzIgcmVzdWx0OwotCWFzbSB2b2xhdGlsZSgKLQkJIlNNVUxXQiAgJVtyZXN1bHRdLCAlW0xfdmFyMl0sICVbdmFyMV0gXG4iCi0JCTpbcmVzdWx0XSI9ciIocmVzdWx0KQotCQk6W0xfdmFyMl0iciIoTF92YXIyKSwgW3ZhcjFdInIiKHZhcjEpCi0JCSk7Ci0JcmV0dXJuIHJlc3VsdDsKLSNlbHNlCi0gICAgdW5zaWduZWQgc2hvcnQgc3dMb3cxOwotICAgIFdvcmQxNiBzd0hpZ2gxOwotICAgIFdvcmQzMiBsX3Zhcl9vdXQ7Ci0KLSAgICBzd0xvdzEgPSAodW5zaWduZWQgc2hvcnQpKExfdmFyMik7Ci0gICAgc3dIaWdoMSA9IChXb3JkMTYpKExfdmFyMiA+PiAxNik7Ci0KLSAgICBsX3Zhcl9vdXQgPSAobG9uZylzd0xvdzEgKiAobG9uZyl2YXIxID4+IDE2OwotICAgIGxfdmFyX291dCArPSBzd0hpZ2gxICogdmFyMTsKLQotICAgIHJldHVybihsX3Zhcl9vdXQpOwotI2VuZGlmCi19Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC90eXBlZGVmLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL3R5cGVkZWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFmODIyNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL3R5cGVkZWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJdHlwZWRlZi5oCi0KLQlDb250ZW50Ogl0eXBlIGRlZmluZWQgZm9yIGRlZmZlcmVudCBwYWx0Zm9ybQotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIHR5cGVkZWZfaAotI2RlZmluZSB0eXBlZGVmX2ggIiRJZCAkIgotCi0jdW5kZWYgT1JJR0lOQUxfVFlQRURFRl9IIC8qIGRlZmluZSB0byBnZXQgIm9yaWdpbmFsIiBFVFNJIHZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdHlwZWRlZi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2lmZGVmIE9SSUdJTkFMX1RZUEVERUZfSAotLyoKLSAqIHRoaXMgaXMgdGhlIG9yaWdpbmFsIGNvZGUgZnJvbSB0aGUgRVRTSSBmaWxlIHR5cGVkZWYuaAotICovCi0KLSNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgfHwgZGVmaW5lZChfX1dBVENPTUNfXykgfHwgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX1pUQ19fKQotdHlwZWRlZiBzaWduZWQgY2hhciBXb3JkODsKLXR5cGVkZWYgc2hvcnQgV29yZDE2OwotdHlwZWRlZiBsb25nIFdvcmQzMjsKLXR5cGVkZWYgaW50IEZsYWc7Ci0KLSNlbGlmIGRlZmluZWQoX19zdW4pCi10eXBlZGVmIHNpZ25lZCBjaGFyIFdvcmQ4OwotdHlwZWRlZiBzaG9ydCBXb3JkMTY7Ci10eXBlZGVmIGxvbmcgV29yZDMyOwotdHlwZWRlZiBpbnQgRmxhZzsKLQotI2VsaWYgZGVmaW5lZChfX3VuaXhfXykgfHwgZGVmaW5lZChfX3VuaXgpCi10eXBlZGVmIHNpZ25lZCBjaGFyIFdvcmQ4OwotdHlwZWRlZiBzaG9ydCBXb3JkMTY7Ci10eXBlZGVmIGludCBXb3JkMzI7Ci10eXBlZGVmIGludCBGbGFnOwotCi0jZW5kaWYKLSNlbHNlIC8qIG5vdCBvcmlnaW5hbCB0eXBlZGVmLmggKi8KLQotLyoKLSAqIHVzZSAoaW1wcm92ZWQpIHR5cGUgZGVmaW5pdGlvbiBmaWxlIHR5cGRlZnMuaCBhbmQgYWRkIGEgIkZsYWciIHR5cGUKLSAqLwotI2luY2x1ZGUgInR5cGVkZWZzLmgiCi10eXBlZGVmIGludCBGbGFnOwotCi0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL3R5cGVkZWZzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL3R5cGVkZWZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZDM1MGQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC90eXBlZGVmcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJdHlwZWRlZnMuaAotCi0JQ29udGVudDoJdHlwZSBkZWZpbmVkIG9yIGNvbnN0IGRlZmluZWQKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiB0eXBlZGVmc19oCi0jZGVmaW5lIHR5cGVkZWZzX2ggIiRJZCAkIgotCi0jaWZuZGVmIENIQVJfQklUCi0jZGVmaW5lIENIQVJfQklUICAgICAgOCAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIGEgY2hhciAqLwotI2VuZGlmCi0KLSNpZm5kZWYgVk9BQUNfU0hSVF9NQVgKLSNkZWZpbmUgVk9BQUNfU0hSVF9NQVggICAgKDMyNzY3KSAgICAgICAgLyogbWF4aW11bSAoc2lnbmVkKSBzaG9ydCB2YWx1ZSAqLwotI2VuZGlmCi0KLSNpZm5kZWYgVk9BQUNfU0hSVF9NSU4KLSNkZWZpbmUgVk9BQUNfU0hSVF9NSU4gICAgKC0zMjc2OCkgICAgICAgIC8qIG1pbmltdW0gKHNpZ25lZCkgc2hvcnQgdmFsdWUgKi8KLSNlbmRpZgotCi0vKiBEZWZpbmUgTlVMTCBwb2ludGVyIHZhbHVlICovCi0jaWZuZGVmIE5VTEwKLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBOVUxMICAgIDAKLSNlbHNlCi0jZGVmaW5lIE5VTEwgICAgKCh2b2lkICopMCkKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgYXNzZXJ0Ci0jZGVmaW5lIGFzc2VydChfRXhwcmVzc2lvbikgICAgICgodm9pZCkwKQotI2VuZGlmCi0KLSNkZWZpbmUgX19pbmxpbmUgc3RhdGljIF9faW5saW5lCi0KLSNkZWZpbmUgSU5UX0JJVFMgICAzMgotLyoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICAgICAgICAgICAgICAgIERFRklOSVRJT04gT0YgQ09OU1RBTlRTCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLS8qCi0gKioqKioqKioqIGRlZmluZSBjaGFyIHR5cGUKLSAqLwotdHlwZWRlZiBjaGFyIENoYXI7Ci0KLS8qCi0gKioqKioqKioqIGRlZmluZSA4IGJpdCBzaWduZWQvdW5zaWduZWQgdHlwZXMgJiBjb25zdGFudHMKLSAqLwotdHlwZWRlZiBzaWduZWQgY2hhciBXb3JkODsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBVV29yZDg7Ci0vKgotICoqKioqKioqKiBkZWZpbmUgMTYgYml0IHNpZ25lZC91bnNpZ25lZCB0eXBlcyAmIGNvbnN0YW50cwotICovCi10eXBlZGVmIHNob3J0IFdvcmQxNjsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgVVdvcmQxNjsKLQotLyoKLSAqKioqKioqKiogZGVmaW5lIDMyIGJpdCBzaWduZWQvdW5zaWduZWQgdHlwZXMgJiBjb25zdGFudHMKLSAqLwotdHlwZWRlZiBpbnQgV29yZDMyOwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgVVdvcmQzMjsKLQotCi0KLSNpZm5kZWYgX01TQ19WRVIKLXR5cGVkZWYgbG9uZyBsb25nIFdvcmQ2NDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIFVXb3JkNjQ7Ci0jZWxzZQotdHlwZWRlZiBfX2ludDY0IFdvcmQ2NDsKLXR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBVV29yZDY0OwotI2VuZGlmCi0KLSNpZm5kZWYgbWluCi0jZGVmaW5lIG1pbihhLGIpICggKGEpIDwgKGIpID8gKGEpIDogKGIpKQotI2VuZGlmCi0KLSNpZm5kZWYgbWF4Ci0jZGVmaW5lIG1heChhLGIpICggKGEpID4gKGIpID8gKGEpIDogKGIpKQotI2VuZGlmCi0KLSNpZmRlZiBBUk1fSU5BU00KLSNpZmRlZiBBUk1WNV9JTkFTTQotI2RlZmluZSBBUk1WNUVfSU5BU00JMQotI2VuZGlmCi0jZGVmaW5lIEFSTVY0X0lOQVNNCQkxCi0jZW5kaWYKLQotI2lmIEFSTVY0X0lOQVNNCi0JI2RlZmluZSBBUk1WNVRFX1NBVCAgICAgICAgICAgMQotICAgICNkZWZpbmUgQVJNVjVURV9BREQgICAgICAgICAgIDEKLSAgICAjZGVmaW5lIEFSTVY1VEVfU1VCICAgICAgICAgICAxCi0JI2RlZmluZSBBUk1WNVRFX1NITCAgICAgICAgICAgMQotICAgICNkZWZpbmUgQVJNVjVURV9TSFIgICAgICAgICAgIDEKLQkjZGVmaW5lIEFSTVY1VEVfTF9TSEwgICAgICAgICAxCi0gICAgI2RlZmluZSBBUk1WNVRFX0xfU0hSICAgICAgICAgMQotI2VuZGlmLy9BUk1WNAotI2lmIEFSTVY1RV9JTkFTTQotICAgICNkZWZpbmUgQVJNVjVURV9MX0FERCAgICAgICAgIDEKLSAgICAjZGVmaW5lIEFSTVY1VEVfTF9TVUIgICAgICAgICAxCi0gICAgI2RlZmluZSBBUk1WNVRFX0xfTVVMVCAgICAgICAgMQotICAgICNkZWZpbmUgQVJNVjVURV9MX01BQyAgICAgICAgIDEKLSAgICAjZGVmaW5lIEFSTVY1VEVfTF9NU1UgICAgICAgICAxCi0KLQotICAgICNkZWZpbmUgQVJNVjVURV9ESVZfUyAgICAgICAgIDEKLSAgICAjZGVmaW5lIEFSTVY1VEVfUk9VTkQgICAgICAgICAxCi0gICAgI2RlZmluZSBBUk1WNVRFX01VTFQgICAgICAgICAgMQotCi0gICAgI2RlZmluZSBBUk1WNVRFX05PUk1fUyAgICAgICAgMQotICAgICNkZWZpbmUgQVJNVjVURV9OT1JNX0wgICAgICAgIDEKLQkjZGVmaW5lIEFSTVY1VEVfTF9NUFlfTFMJICAxCi0jZW5kaWYKLSNpZiBBUk1WNl9JTkFTTQotICAgICN1bmRlZiAgQVJNVjVURV9BREQKLSAgICAjZGVmaW5lIEFSTVY1VEVfQUREICAgICAgICAgICAwCi0gICAgI3VuZGVmICBBUk1WNVRFX1NVQgotICAgICNkZWZpbmUgQVJNVjVURV9TVUIgICAgICAgICAgIDAKLSAgICAjZGVmaW5lIEFSTVY2X1NBVCAgICAgICAgICAgICAxCi0jZW5kaWYKLQotLy9iYXNpYyBvcGVyYXRpb24gZnVuY3Rpb25zIG9wdGltaXphdGlvbiBmbGFncwotI2RlZmluZSBTQVRSVUFURV9JU19JTkxJTkUgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBzYXR1cmF0ZSBhcyBpbmxpbmUgZnVuY3Rpb24KLSNkZWZpbmUgU0hMX0lTX0lOTElORSAgICAgICAgICAgICAgICAgICAxICAvL2RlZmluZSBzaGwgYXMgaW5saW5lIGZ1bmN0aW9uCi0jZGVmaW5lIFNIUl9JU19JTkxJTkUgICAgICAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIHNociBhcyBpbmxpbmUgZnVuY3Rpb24KLSNkZWZpbmUgTF9NVUxUX0lTX0lOTElORSAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgTF9tdWx0IGFzIGlubGluZSBmdW5jdGlvbgotI2RlZmluZSBMX01TVV9JU19JTkxJTkUgICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBMX21zdSBhcyBpbmxpbmUgZnVuY3Rpb24KLSNkZWZpbmUgTF9TVUJfSVNfSU5MSU5FICAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgTF9zdWIgYXMgaW5saW5lIGZ1bmN0aW9uCi0jZGVmaW5lIExfU0hMX0lTX0lOTElORSAgICAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIExfc2hsIGFzIGlubGluZSBmdW5jdGlvbgotI2RlZmluZSBMX1NIUl9JU19JTkxJTkUgICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBMX3NociBhcyBpbmxpbmUgZnVuY3Rpb24KLSNkZWZpbmUgQUREX0lTX0lOTElORSAgICAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgYWRkIGFzIGlubGluZSBmdW5jdGlvbiAvL2FkZCwgaW5saW5lIGlzIHRoZSBiZXN0Ci0jZGVmaW5lIFNVQl9JU19JTkxJTkUgICAgICAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIHN1YiBhcyBpbmxpbmUgZnVuY3Rpb24gLy9zdWIsIGlubGluZSBpcyB0aGUgYmVzdAotI2RlZmluZSBESVZfU19JU19JTkxJTkUgICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBkaXZfcyBhcyBpbmxpbmUgZnVuY3Rpb24KLSNkZWZpbmUgTVVMVF9JU19JTkxJTkUgICAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgbXVsdCBhcyBpbmxpbmUgZnVuY3Rpb24KLSNkZWZpbmUgTk9STV9TX0lTX0lOTElORSAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgbm9ybV9zIGFzIGlubGluZSBmdW5jdGlvbgotI2RlZmluZSBOT1JNX0xfSVNfSU5MSU5FICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBub3JtX2wgYXMgaW5saW5lIGZ1bmN0aW9uCi0jZGVmaW5lIFJPVU5EX0lTX0lOTElORSAgICAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIHJvdW5kIGFzIGlubGluZSBmdW5jdGlvbgotI2RlZmluZSBMX01BQ19JU19JTkxJTkUgICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBMX21hYyBhcyBpbmxpbmUgZnVuY3Rpb24KLSNkZWZpbmUgTF9BRERfSVNfSU5MSU5FICAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgTF9hZGQgYXMgaW5saW5lIGZ1bmN0aW9uCi0jZGVmaW5lIEVYVFJBQ1RfSF9JU19JTkxJTkUgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIGV4dHJhY3RfaCBhcyBpbmxpbmUgZnVuY3Rpb24KLSNkZWZpbmUgRVhUUkFDVF9MX0lTX0lOTElORSAgICAgICAgICAgICAxICAgLy9kZWZpbmUgZXh0cmFjdF9sIGFzIGlubGluZSBmdW5jdGlvbiAgICAgICAgLy8/Pz8KLSNkZWZpbmUgTVVMVF9SX0lTX0lOTElORSAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgbXVsdF9yIGFzIGlubGluZSBmdW5jdGlvbgotI2RlZmluZSBTSFJfUl9JU19JTkxJTkUgICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBzaHJfciBhcyBpbmxpbmUgZnVuY3Rpb24KLSNkZWZpbmUgTUFDX1JfSVNfSU5MSU5FICAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgbWFjX3IgYXMgaW5saW5lIGZ1bmN0aW9uCi0jZGVmaW5lIE1TVV9SX0lTX0lOTElORSAgICAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIG1zdV9yIGFzIGlubGluZSBmdW5jdGlvbgotI2RlZmluZSBMX1NIUl9SX0lTX0lOTElORSAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBMX3Nocl9yIGFzIGlubGluZSBmdW5jdGlvbgotCi0jZGVmaW5lIFBSRUZJWAkJCQl2b0FBQ0VuYwotI2RlZmluZSBMSU5LMCh4LCB5LCB6KQkJTElOSzEoeCx5LHopCi0jZGVmaW5lIExJTksxKHgseSx6KQkJeCMjeSMjegotI2RlZmluZSBBRERfUFJFRklYKGZ1bmMpCUxJTkswKFBSRUZJWCwgXywgZnVuYykKLQotI2RlZmluZSAgTF9FeHRyYWN0CQlBRERfUFJFRklYKExfRXh0cmFjdCkKLSNkZWZpbmUgIExfQ29tcAkJCUFERF9QUkVGSVgoTF9Db21wKQotI2RlZmluZSAgTXB5XzMyCQkJQUREX1BSRUZJWChNcHlfMzIpCi0jZGVmaW5lICBNcHlfMzJfMTYJCUFERF9QUkVGSVgoTXB5XzMyXzE2KQotI2RlZmluZSAgRGl2XzMyCQkJQUREX1BSRUZJWChEaXZfMzIpCi0jZGVmaW5lICBpTG9nNAkJCUFERF9QUkVGSVgoaUxvZzQpCi0jZGVmaW5lICByc3FydAkJCUFERF9QUkVGSVgocnNxcnQpCi0jZGVmaW5lICBwb3cyX3h5CQlBRERfUFJFRklYKHBvdzJfeHkpCi0jZGVmaW5lICBMX21weV9scwkJQUREX1BSRUZJWChMX21weV9scykKLSNkZWZpbmUgIExfbXB5X3d4CQlBRERfUFJFRklYKExfbXB5X3d4KQotCi0jZGVmaW5lIG1lbV9tYWxsb2MJCUFERF9QUkVGSVgobWVtX21hbGxvYykKLSNkZWZpbmUgbWVtX2ZyZWUJCUFERF9QUkVGSVgobWVtX2ZyZWUpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9kb2Mvdm9BQUNFbmNvZGVyU0RLLnBkZiBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvZG9jL3ZvQUFDRW5jb2RlclNESy5wZGYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NGQwZjcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9kb2Mvdm9BQUNFbmNvZGVyU0RLLnBkZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvZXhwb3J0cy5sZHMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNGYzZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2V4cG9ydHMubGRzCkBAIC0wLDAgKzEsNSBAQAoreworICAgIGdsb2JhbDoKKyAgICAgICAgX1oyMmNyZWF0ZVNvZnRPTVhDb21wb25lbnRQS2NQSzE2T01YX0NBTExCQUNLVFlQRVB2UFAxN09NWF9DT01QT05FTlRUWVBFOworICAgIGxvY2FsOiAqOworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2FhY19yb20uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2FhY19yb20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI2ZjY1Ni4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9hYWNfcm9tLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlhYWNfcm9tLmgKLQotCUNvbnRlbnQ6CWNvbnN0YW50IHRhYmxlcwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIFJPTV9ICi0jZGVmaW5lIFJPTV9ICi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJwc3lfY29uc3QuaCIKLSNpbmNsdWRlICJ0bnNfcGFyYW0uaCIKLQotLyoKLSAgbWRjdAotKi8KLWV4dGVybiBjb25zdCBpbnQgU2hvcnRXaW5kb3dTaW5lW0ZSQU1FX0xFTl9TSE9SVC8yXTsKLWV4dGVybiBjb25zdCBpbnQgTG9uZ1dpbmRvd0tCRFtGUkFNRV9MRU5fTE9ORy8yXTsKLQotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgYml0cmV2VGFiWzE3ICsgMTI5XTsKLWV4dGVybiBjb25zdCBpbnQgY29zc2ludGFiWzEyOCArIDEwMjRdOwotCi0jaWYgZGVmaW5lZCAoQVJNVjVFKSAmJiAhZGVmaW5lZCAoQVJNVjdOZW9uKQotZXh0ZXJuIGNvbnN0IGludCB0d2lkVGFiNjRbKDQqNiArIDE2KjYpLzJdOwotZXh0ZXJuIGNvbnN0IGludCB0d2lkVGFiNTEyWyg4KjYgKyAzMio2ICsgMTI4KjYpLzJdOwotI2Vsc2UKLWV4dGVybiBjb25zdCBpbnQgdHdpZFRhYjY0WzQqNiArIDE2KjZdOwotZXh0ZXJuIGNvbnN0IGludCB0d2lkVGFiNTEyWzgqNiArIDMyKjYgKyAxMjgqNl07Ci0jZW5kaWYKLQotLyoKLSAgZm9ybSBmYWN0b3IKLSovCi1leHRlcm4gY29uc3QgV29yZDMyIGZvcm1mYWNfc3FydHRhYmxlWzk2XTsKLQotLyoKLSAgcXVhbnRpemVyCi0qLwotZXh0ZXJuIGNvbnN0IFdvcmQzMiBtVGFiXzNfNFs1MTJdOwotZXh0ZXJuIGNvbnN0IFdvcmQzMiBtVGFiXzRfM1s1MTJdOwotLyohICQyXnstXGZyYWN7bn17MTZ9fSQgdGFibGUgKi8KLWV4dGVybiBjb25zdCBXb3JkMTYgcG93MnRvbWludXNOb3ZlcjE2WzE3XSA7Ci0KLWV4dGVybiBjb25zdCBXb3JkMzIgc3BlY0V4cE1hbnRUYWJsZUNvbWJfZW5jWzRdWzE0XTsKLWV4dGVybiBjb25zdCBVV29yZDggc3BlY0V4cFRhYmxlQ29tYl9lbmNbNF1bMTRdOwotCi1leHRlcm4gY29uc3QgV29yZDE2IHF1YW50Qm9yZGVyc1s0XVs0XTsKLS8vZXh0ZXJuIGNvbnN0IFdvcmQxNiBxdWFudFJlY29uWzNdWzRdOwotZXh0ZXJuIGNvbnN0IFdvcmQxNiBxdWFudFJlY29uWzRdWzNdOwotCi0vKgotICBodWZmbWFuCi0qLwotZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9sdGFiMV8yWzNdWzNdWzNdWzNdOwotZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9sdGFiM180WzNdWzNdWzNdWzNdOwotZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9sdGFiNV82WzldWzldOwotZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9sdGFiN184WzhdWzhdOwotZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9sdGFiOV8xMFsxM11bMTNdOwotZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9sdGFiMTFbMTddWzE3XTsKLWV4dGVybiBjb25zdCBVV29yZDE2IGh1ZmZfbHRhYnNjZlsxMjFdOwotZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9jdGFiMVszXVszXVszXVszXTsKLWV4dGVybiBjb25zdCBVV29yZDE2IGh1ZmZfY3RhYjJbM11bM11bM11bM107Ci1leHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2N0YWIzWzNdWzNdWzNdWzNdOwotZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9jdGFiNFszXVszXVszXVszXTsKLWV4dGVybiBjb25zdCBVV29yZDE2IGh1ZmZfY3RhYjVbOV1bOV07Ci1leHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2N0YWI2WzldWzldOwotZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9jdGFiN1s4XVs4XTsKLWV4dGVybiBjb25zdCBVV29yZDE2IGh1ZmZfY3RhYjhbOF1bOF07Ci1leHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2N0YWI5WzEzXVsxM107Ci1leHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2N0YWIxMFsxM11bMTNdOwotZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9jdGFiMTFbMTddWzE3XTsKLWV4dGVybiBjb25zdCBVV29yZDMyIGh1ZmZfY3RhYnNjZlsxMjFdOwotCi0KLQotLyoKLSAgbWlzYwotKi8KLWV4dGVybiBjb25zdCBpbnQgc2FtcFJhdGVUYWJbTlVNX1NBTVBMRV9SQVRFU107Ci1leHRlcm4gY29uc3QgaW50IEJhbmR3aXRoQ29lZlRhYls4XVtOVU1fU0FNUExFX1JBVEVTXTsKLWV4dGVybiBjb25zdCBpbnQgcmF0ZXNbOF07Ci1leHRlcm4gY29uc3QgVVdvcmQ4IHNmQmFuZFRvdGFsU2hvcnRbTlVNX1NBTVBMRV9SQVRFU107Ci1leHRlcm4gY29uc3QgVVdvcmQ4IHNmQmFuZFRvdGFsTG9uZ1tOVU1fU0FNUExFX1JBVEVTXTsKLWV4dGVybiBjb25zdCBpbnQgc2ZCYW5kVGFiU2hvcnRPZmZzZXRbTlVNX1NBTVBMRV9SQVRFU107Ci1leHRlcm4gY29uc3Qgc2hvcnQgc2ZCYW5kVGFiU2hvcnRbNzZdOwotZXh0ZXJuIGNvbnN0IGludCBzZkJhbmRUYWJMb25nT2Zmc2V0W05VTV9TQU1QTEVfUkFURVNdOwotZXh0ZXJuIGNvbnN0IHNob3J0IHNmQmFuZFRhYkxvbmdbMzI1XTsKLQotZXh0ZXJuIGNvbnN0IFdvcmQzMiBtX2xvZzJfdGFibGVbSU5UX0JJVFNdOwotCi0vKgotICBUTlMKLSovCi1leHRlcm4gY29uc3QgV29yZDMyIHRuc0NvZWZmM1s4XTsKLWV4dGVybiBjb25zdCBXb3JkMzIgdG5zQ29lZmYzQm9yZGVyc1s4XTsKLWV4dGVybiBjb25zdCBXb3JkMzIgdG5zQ29lZmY0WzE2XTsKLWV4dGVybiBjb25zdCBXb3JkMzIgdG5zQ29lZmY0Qm9yZGVyc1sxNl07Ci1leHRlcm4gY29uc3QgV29yZDMyIGludlNCRlsyNF07Ci1leHRlcm4gY29uc3QgV29yZDE2IHNpZGVJbmZvVGFiTG9uZ1tNQVhfU0ZCX0xPTkcgKyAxXTsKLWV4dGVybiBjb25zdCBXb3JkMTYgc2lkZUluZm9UYWJTaG9ydFtNQVhfU0ZCX1NIT1JUICsgMV07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2FhY2VuY19jb3JlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9hYWNlbmNfY29yZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjc1YjZkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2FhY2VuY19jb3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlhYWNlbmNfY29yZS5oCi0KLQlDb250ZW50OglhYWMgZW5jb2RlciBpbnRlcmZhY2UgZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX2FhY2VuY19jb3JlX2hfCi0jZGVmaW5lIF9hYWNlbmNfY29yZV9oXwotCi0KLSNpbmNsdWRlICJ0eXBlZGVmLmgiCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiYml0ZW5jLmgiCi0KLSNpbmNsdWRlICJwc3lfY29uZmlndXJhdGlvbi5oIgotI2luY2x1ZGUgInBzeV9tYWluLmgiCi0jaW5jbHVkZSAicWNfbWFpbi5oIgotI2luY2x1ZGUgInBzeV9tYWluLmgiCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRlZmluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0gc3RydWN0dXJlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi10eXBlZGVmICBzdHJ1Y3QgewotICBXb3JkMzIgICBzYW1wbGVSYXRlOyAgICAgICAgICAgIC8qIGF1ZGlvIGZpbGUgc2FtcGxlIHJhdGUgKi8KLSAgV29yZDMyICAgYml0UmF0ZTsgICAgICAgICAgICAgICAvKiBlbmNvZGVyIGJpdCByYXRlIGluIGJpdHMvc2VjICovCi0gIFdvcmQxNiAgIG5DaGFubmVsc0luOyAgICAgICAgICAgLyogbnVtYmVyIG9mIGNoYW5uZWxzIG9uIGlucHV0ICgxLDIpICovCi0gIFdvcmQxNiAgIG5DaGFubmVsc091dDsgICAgICAgICAgLyogbnVtYmVyIG9mIGNoYW5uZWxzIG9uIG91dHB1dCAoMSwyKSAqLwotICBXb3JkMTYgICBiYW5kV2lkdGg7ICAgICAgICAgICAgIC8qIHRhcmdldGVkIGF1ZGlvIGJhbmR3aWR0aCBpbiBIeiAqLwotICBXb3JkMTYgICBhZHRzVXNlZDsJCQkgIC8qIHdoZXRoZXIgd3JpdGUgYWR0cyBoZWFkZXIgKi8KLX0gQUFDRU5DX0NPTkZJRzsKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgQUFDRU5DX0NPTkZJRyBjb25maWc7ICAgICAvKiBXb3JkMTYgc2l6ZTogOCAqLwotCi0gIEVMRU1FTlRfSU5GTyBlbEluZm87ICAgICAgLyogV29yZDE2IHNpemU6IDQgKi8KLQotICBRQ19TVEFURSBxY0tlcm5lbDsgICAgICAgIC8qIFdvcmQxNiBzaXplOiA2ICsgNShQQURESU5HKSArIDcoRUxFTUVOVF9CSVRTKSArIDU0KEFESl9USFJfU1RBVEUpID0gNzIgKi8KLSAgUUNfT1VUICAgcWNPdXQ7ICAgICAgICAgICAvKiBXb3JkMTYgc2l6ZTogTUFYX0NIQU5ORUxTKjkyMChRQ19PVVRfQ0hBTk5FTCkgKyA1KFFDX09VVF9FTEVNRU5UKSArIDcgPSA5MzIgLyAxODUyICovCi0KLSAgUFNZX09VVCAgICBwc3lPdXQ7ICAgICAgICAvKiBXb3JkMTYgc2l6ZTogTUFYX0NIQU5ORUxTKjE4NiArIDIgPSAxODggLyAzNzQgKi8KLSAgUFNZX0tFUk5FTCBwc3lLZXJuZWw7ICAgICAvKiBXb3JkMTYgc2l6ZTogIDI1ODcgLyA0NDkxICovCi0KLSAgc3RydWN0IEJJVFNUUkVBTUVOQ09ERVJfSU5JVCBic2VJbml0OyAvKiBXb3JkMTYgc2l6ZTogNiAqLwotICBzdHJ1Y3QgQklUX0JVRiAgYml0U3RyZWFtOyAgICAgICAgICAgIC8qIFdvcmQxNiBzaXplOiA4ICovCi0gIEhBTkRMRV9CSVRfQlVGICBoQml0U3RyZWFtOwotICBpbnQJCQkgIGluaXRPSzsKLQotICBzaG9ydAkJCSppbnRidWY7Ci0gIHNob3J0CQkJKmVuY2J1ZjsKLSAgc2hvcnQJCQkqaW5idWY7Ci0gIGludAkJCWVuY2xlbjsKLSAgaW50CQkJaW5sZW47Ci0gIGludAkJCWludGxlbjsKLSAgaW50CQkJdXNlbGVuZ3RoOwotCi0gIHZvaWQJCQkqaENoZWNrOwotICBWT19NRU1fT1BFUkFUT1IgKnZvTWVtb3A7Ci0gIFZPX01FTV9PUEVSQVRPUiB2b01lbW9wcmF0b3I7Ci0KLX1BQUNfRU5DT0RFUjsgLyogV29yZDE2IHNpemU6IDM4MDkgLyA2ODUxICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZnVuY3Rpb25uYW1lOiBBYWNJbml0RGVmYXVsdENvbmZpZwotZGVzY3JpcHRpb246ICBnaXZlcyByZWFzb25hYmxlIGRlZmF1bHQgY29uZmlndXJhdGlvbgotcmV0dXJuczogICAgICAtLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgQWFjSW5pdERlZmF1bHRDb25maWcoQUFDRU5DX0NPTkZJRyAqY29uZmlnKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZnVuY3Rpb25uYW1lOkFhY0VuY09wZW4KLWRlc2NyaXB0aW9uOiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBlbmNvZGVyIGluc3RhbmNlCi1yZXR1cm5zOiAgICAgQUFDRU5DX09LIGlmIHN1Y2Nlc3MKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotV29yZDE2ICBBYWNFbmNPcGVuIChBQUNfRU5DT0RFUgkJCQkqaEFhY0VuYywgICAgICAgLyogcG9pbnRlciB0byBhbiBlbmNvZGVyIGhhbmRsZSwgaW5pdGlhbGl6ZWQgb24gcmV0dXJuICovCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0ICBBQUNFTkNfQ09ORklHICAgICBjb25maWcpOyAgICAgICAgLyogcHJlLWluaXRpYWxpemVkIGNvbmZpZyBzdHJ1Y3QgKi8KLQotV29yZDE2IEFhY0VuY0VuY29kZShBQUNfRU5DT0RFUgkJICAgKmhBYWNFbmMsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgICAqdGltZVNpZ25hbCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgVVdvcmQ4ICAgICAgICphbmNCeXRlcywgICAgICAvKiE8IHBvaW50ZXIgdG8gYW5jaWxsYXJ5IGRhdGEgYnl0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICAgICpudW1BbmNCeXRlcywgICAvKiE8IG51bWJlciBvZiBhbmNpbGxhcnkgRGF0YSBCeXRlcywgc2VuZCBhcyBmaWxsIGVsZW1lbnQgICovCi0gICAgICAgICAgICAgICAgICAgIFVXb3JkOCAgICAgICAgICAgICAqb3V0Qnl0ZXMsICAgICAgLyohPCBwb2ludGVyIHRvIG91dHB1dCBidWZmZXIgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBWT19VMzIgICAgICAgICAgICAgKm51bU91dEJ5dGVzICAgIC8qITwgbnVtYmVyIG9mIGJ5dGVzIGluIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZnVuY3Rpb25uYW1lOkFhY0VuY0Nsb3NlCi1kZXNjcmlwdGlvbjogZGVhbGxvY2F0ZSBhbiBlbmNvZGVyIGluc3RhbmNlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgQWFjRW5jQ2xvc2UgKEFBQ19FTkNPREVSKiBoQWFjRW5jLCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCk7IC8qIGFuIGVuY29kZXIgaGFuZGxlICovCi0KLSNlbmRpZiAvKiBfYWFjZW5jX2hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9hZGpfdGhyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9hZGpfdGhyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNGJiNWUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYWRqX3Roci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlhZGpfdGhyLmgKLQotCUNvbnRlbnQ6CVRocmVzaG9sZCBjb21wZW5zYXRpb24gZnVuY3Rpb24KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX0FESl9USFJfSAotI2RlZmluZSBfX0FESl9USFJfSAotCi0jaW5jbHVkZSAiYWRqX3Rocl9kYXRhLmgiCi0jaW5jbHVkZSAicWNfZGF0YS5oIgotI2luY2x1ZGUgImludGVyZmFjZS5oIgotCi1Xb3JkMTYgYml0czJwZShjb25zdCBXb3JkMTYgYml0cyk7Ci0KLVdvcmQzMiBBZGpUaHJOZXcoQURKX1RIUl9TVEFURSoqIHBoQWRqVGhyLAotICAgICAgICAgICAgICAgICBXb3JkMzIgbkVsZW1lbnRzKTsKLQotdm9pZCBBZGpUaHJEZWxldGUoQURKX1RIUl9TVEFURSAqaEFkalRocik7Ci0KLXZvaWQgQWRqVGhySW5pdChBREpfVEhSX1NUQVRFICpoQWRqVGhyLAotICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiBwZU1lYW4sCi0gICAgICAgICAgICAgICAgV29yZDMyIGNoQml0cmF0ZSk7Ci0KLXZvaWQgQWRqdXN0VGhyZXNob2xkcyhBREpfVEhSX1NUQVRFICphZGpUaHJTdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICBBVFNfRUxFTUVOVCogQWRqVGhyU3RhdGVFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UICpwc3lPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqY2hCaXREaXN0cmlidXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGxvZ1NmYkVuZXJneVtNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHNmYk5SZWxldmFudExpbmVzW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogcWNPRSwKLQkJCQkJICBFTEVNRU5UX0JJVFMqIGVsQml0cywKLQkJCQkJICBjb25zdCBXb3JkMTYgbkNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBtYXhCaXRGYWMpOwotCi12b2lkIEFkalRoclVwZGF0ZShBVFNfRUxFTUVOVCAqQWRqVGhyU3RhdGVFbGVtZW50LAotICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IGR5bkJpdHNVc2VkKTsKLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2Fkal90aHJfZGF0YS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYWRqX3Rocl9kYXRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMTMyZDguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYWRqX3Rocl9kYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCWFkal90aHJfZGF0YS5oCi0KLQlDb250ZW50OglUaHJlc2hvbGQgY29tcGVuc2F0aW9uIHBhcmFtZXRlcgotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fQURKX1RIUl9EQVRBX0gKLSNkZWZpbmUgX19BREpfVEhSX0RBVEFfSAotCi0jaW5jbHVkZSAidHlwZWRlZi5oIgotI2luY2x1ZGUgInBzeV9jb25zdC5oIgotI2luY2x1ZGUgImxpbmVfcGUuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgV29yZDE2IGNsaXBTYXZlTG93LCBjbGlwU2F2ZUhpZ2g7Ci0gICBXb3JkMTYgbWluQml0U2F2ZSwgbWF4Qml0U2F2ZTsKLSAgIFdvcmQxNiBjbGlwU3BlbmRMb3csIGNsaXBTcGVuZEhpZ2g7Ci0gICBXb3JkMTYgbWluQml0U3BlbmQsIG1heEJpdFNwZW5kOwotfSBCUkVTX1BBUkFNOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICBVV29yZDggbW9kaWZ5TWluU25yOwotICAgV29yZDE2IHN0YXJ0U2ZiTCwgc3RhcnRTZmJTOwotfSBBSF9QQVJBTTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBXb3JkMzIgbWF4UmVkOwotICBXb3JkMzIgc3RhcnRSYXRpbywgbWF4UmF0aW87Ci0gIFdvcmQzMiByZWRSYXRpb0ZhYzsKLSAgV29yZDMyIHJlZE9mZnM7Ci19IE1JTlNOUl9BREFQVF9QQVJBTTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiBwYXJhbWV0ZXJzIGZvciBiaXRyZXNlcnZvaXIgY29udHJvbCAqLwotICBXb3JkMTYgcGVNaW4sIHBlTWF4OwotICAvKiBjb25zdGFudCBvZmZzZXQgdG8gcGUgICAgICAgICAgICAgICAqLwotICBXb3JkMTYgIHBlT2Zmc2V0OwotICAvKiBhdm9pZCBob2xlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAqLwotICBBSF9QQVJBTSBhaFBhcmFtOwotICAvKiBwYXJhbXRlcnMgZm9yIGFkYXB0YXRpb24gb2YgbWluU25yICovCi0gIE1JTlNOUl9BREFQVF9QQVJBTSBtaW5TbnJBZGFwdFBhcmFtOwotICAvKiB2YWx1ZXMgZm9yIGNvcnJlY3Rpb24gb2YgcGUgKi8KLSAgV29yZDE2IHBlTGFzdDsKLSAgV29yZDE2IGR5bkJpdHNMYXN0OwotICBXb3JkMTYgcGVDb3JyZWN0aW9uRmFjdG9yOwotfSBBVFNfRUxFTUVOVDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBCUkVTX1BBUkFNICAgYnJlc1BhcmFtTG9uZywgYnJlc1BhcmFtU2hvcnQ7IC8qIFdvcmQxNiBzaXplOiAyKjggKi8KLSAgQVRTX0VMRU1FTlQgIGFkalRoclN0YXRlRWxlbTsgICAgICAgICAgICAgICAvKiBXb3JkMTYgc2l6ZTogMTkgKi8KLX0gQURKX1RIUl9TVEFURTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9iYW5kX25yZy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYmFuZF9ucmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU0NTNjMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9iYW5kX25yZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQliYW5kX25yZy5oCi0KLQlDb250ZW50OglCYW5kL0xpbmUgZW5lcmd5IGNhbGN1bGF0aW9ucyBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9CQU5EX05SR19ICi0jZGVmaW5lIF9CQU5EX05SR19ICi0KLSNpbmNsdWRlICJ0eXBlZGVmLmgiCi0KLQotdm9pZCBDYWxjQmFuZEVuZXJneShjb25zdCBXb3JkMzIgKm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICpiYW5kT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIG51bUJhbmRzLAotICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKmJhbmRFbmVyZ3ksCi0gICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqYmFuZEVuZXJneVN1bSk7Ci0KLQotdm9pZCBDYWxjQmFuZEVuZXJneU1TKGNvbnN0IFdvcmQzMiAqbWRjdFNwZWN0cnVtTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgKm1kY3RTcGVjdHJ1bVJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqYmFuZE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIG51bUJhbmRzLAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqYmFuZEVuZXJneU1pZCwKLSAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKmJhbmRFbmVyZ3lNaWRTdW0sCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpiYW5kRW5lcmd5U2lkZSwKLSAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKmJhbmRFbmVyZ3lTaWRlU3VtKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9iaXRfY250LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9iaXRfY250LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NmEyMTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYml0X2NudC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJYml0X2NudC5oCi0KLQlDb250ZW50OglIdWZmbWFuIEJpdGNvdW50ZXIgJiBjb2RlciBzdHJ1Y3R1cmUgYW5kIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fQklUQ09VTlRfSAotI2RlZmluZSBfX0JJVENPVU5UX0gKLQotI2luY2x1ZGUgImJpdGJ1ZmZlci5oIgotI2luY2x1ZGUgImJhc2ljX29wLmgiCi0jZGVmaW5lIElOVkFMSURfQklUQ09VTlQgKE1BWF8xNi80KQotCi0vKgotICBjb2RlIGJvb2sgbnVtYmVyIHRhYmxlCi0qLwotCi1lbnVtIGNvZGVCb29rTm97Ci0gIENPREVfQk9PS19aRVJPX05PPSAgICAgICAgICAgICAgIDAsCi0gIENPREVfQk9PS18xX05PPSAgICAgICAgICAgICAgICAgIDEsCi0gIENPREVfQk9PS18yX05PPSAgICAgICAgICAgICAgICAgIDIsCi0gIENPREVfQk9PS18zX05PPSAgICAgICAgICAgICAgICAgIDMsCi0gIENPREVfQk9PS180X05PPSAgICAgICAgICAgICAgICAgIDQsCi0gIENPREVfQk9PS181X05PPSAgICAgICAgICAgICAgICAgIDUsCi0gIENPREVfQk9PS182X05PPSAgICAgICAgICAgICAgICAgIDYsCi0gIENPREVfQk9PS183X05PPSAgICAgICAgICAgICAgICAgIDcsCi0gIENPREVfQk9PS184X05PPSAgICAgICAgICAgICAgICAgIDgsCi0gIENPREVfQk9PS185X05PPSAgICAgICAgICAgICAgICAgIDksCi0gIENPREVfQk9PS18xMF9OTz0gICAgICAgICAgICAgICAgMTAsCi0gIENPREVfQk9PS19FU0NfTk89ICAgICAgICAgICAgICAgMTEsCi0gIENPREVfQk9PS19SRVNfTk89ICAgICAgICAgICAgICAgMTIsCi0gIENPREVfQk9PS19QTlNfTk89ICAgICAgICAgICAgICAgMTMKLX07Ci0KLS8qCi0gIGNvZGUgYm9vayBpbmRleCB0YWJsZQotKi8KLQotZW51bSBjb2RlQm9va05keHsKLSAgQ09ERV9CT09LX1pFUk9fTkRYPTAsCi0gIENPREVfQk9PS18xX05EWCwKLSAgQ09ERV9CT09LXzJfTkRYLAotICBDT0RFX0JPT0tfM19ORFgsCi0gIENPREVfQk9PS180X05EWCwKLSAgQ09ERV9CT09LXzVfTkRYLAotICBDT0RFX0JPT0tfNl9ORFgsCi0gIENPREVfQk9PS183X05EWCwKLSAgQ09ERV9CT09LXzhfTkRYLAotICBDT0RFX0JPT0tfOV9ORFgsCi0gIENPREVfQk9PS18xMF9ORFgsCi0gIENPREVfQk9PS19FU0NfTkRYLAotICBDT0RFX0JPT0tfUkVTX05EWCwKLSAgQ09ERV9CT09LX1BOU19ORFgsCi0gIE5VTUJFUl9PRl9DT0RFX0JPT0tTCi19OwotCi0vKgotICBjb2RlIGJvb2sgbGF2IHRhYmxlCi0qLwotCi1lbnVtIGNvZGVCb29rTGF2ewotICBDT0RFX0JPT0tfWkVST19MQVY9MCwKLSAgQ09ERV9CT09LXzFfTEFWPTEsCi0gIENPREVfQk9PS18yX0xBVj0xLAotICBDT0RFX0JPT0tfM19MQVY9MiwKLSAgQ09ERV9CT09LXzRfTEFWPTIsCi0gIENPREVfQk9PS181X0xBVj00LAotICBDT0RFX0JPT0tfNl9MQVY9NCwKLSAgQ09ERV9CT09LXzdfTEFWPTcsCi0gIENPREVfQk9PS184X0xBVj03LAotICBDT0RFX0JPT0tfOV9MQVY9MTIsCi0gIENPREVfQk9PS18xMF9MQVY9MTIsCi0gIENPREVfQk9PS19FU0NfTEFWPTE2LAotICBDT0RFX0JPT0tfU0NGX0xBVj02MCwKLSAgQ09ERV9CT09LX1BOU19MQVY9NjAKLX07Ci0KLVdvcmQxNiBiaXRDb3VudChjb25zdCBXb3JkMTYgKmFRdWFudFNwZWN0cnVtLAotICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgbm9PZlNwZWNMaW5lcywKLSAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgIG1heFZhbCwKLSAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgKmJpdENvdW50THV0KTsKLQotV29yZDE2IGNvZGVWYWx1ZXMoV29yZDE2ICp2YWx1ZXMsIFdvcmQxNiB3aWR0aCwgV29yZDE2IGNvZGVCb29rLCBIQU5ETEVfQklUX0JVRiBoQml0c3RyZWFtKTsKLQotV29yZDE2IGJpdENvdW50U2NhbGVmYWN0b3JEZWx0YShXb3JkMTYgZGVsdGEpOwotV29yZDE2IGNvZGVTY2FsZWZhY3RvckRlbHRhKFdvcmQxNiBzY2FsZWZhY3RvciwgSEFORExFX0JJVF9CVUYgaEJpdHN0cmVhbSk7Ci0KLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2JpdGJ1ZmZlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYml0YnVmZmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNzlmMDcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYml0YnVmZmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCWJpdGJ1ZmZlci5oCi0KLQlDb250ZW50OglCaXQgQnVmZmVyIE1hbmFnZW1lbnQgc3RydWN0dXJlIGFuZCBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBCSVRCVUZGRVJfSAotI2RlZmluZSBCSVRCVUZGRVJfSAotCi0jaW5jbHVkZSAidHlwZWRlZi5oIgotCi0KLWVudW0gZGlyZWN0aW9uCi17Ci0gIGZvcndhcmREaXJlY3Rpb24sCi0gIGJhY2t3YXJkRGlyZWN0aW9uCi19OwotCi0KLS8qIQotICAgVGhlIHBvaW50ZXIgJ3BSZWFkTmV4dCcgcG9pbnRzIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSB3b3JkLCB3aGVyZSBiaXRzIGNhbiBiZSByZWFkIGZyb20uIFRoZSBwb2ludGVyCi0gICAncFdyaXRlTmV4dCcgcG9pbnRzIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSB3b3JkLCB3aGVyZSBiaXRzIGNhbiBiZSB3cml0dGVuIHRvLiBUaGUgcG9pbnRlciBwQml0QnVmQmFzZQotICAgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiB0aGUgYml0c3RyZWFtIGJ1ZmZlciBhbmQgdGhlIHBvaW50ZXIgcEJpdEJ1ZkVuZCBwb2ludHMgdG8gdGhlIGVuZCBvZiB0aGUgYml0c3RyZWFtCi0gICBidWZmZXIuIFRoZSB0d28gcG9pbnRlcnMgYXJlIHVzZWQgYXMgbG93ZXItYm91bmQgcmVzcGVjdGl2ZWx5IHVwcGVyLWJvdW5kIGFkZHJlc3MgZm9yIHRoZSBtb2R1bG8gYWRkcmVzc2luZwotICAgbW9kZS4KLQotICAgVGhlIGVsZW1lbnQgY250Qml0cyBjb250YWlucyB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSBiaXRzIGluIHRoZSBiaXQgYnVmZmVyLiBJdCB3aWxsIGJlIGluY3JlbWVudGVkIHdoZW4KLSAgIGJpdHMgYXJlIHdyaXR0ZW4gdG8gdGhlIGJpdHN0cmVhbSBidWZmZXIgYW5kIGRlY3JlbWVudGVkIHdoZW4gYml0cyBhcmUgcmVhZCBmcm9tIHRoZSBiaXRzdHJlYW0gYnVmZmVyLgotKi8KLXN0cnVjdCBCSVRfQlVGCi17Ci0gIFVXb3JkOCAqcEJpdEJ1ZkJhc2U7ICAgICAgICAgIC8qITwgcG9pbnRlciBwb2ludHMgdG8gZmlyc3QgcG9zaXRpb24gaW4gYml0c3RyZWFtIGJ1ZmZlciAqLwotICBVV29yZDggKnBCaXRCdWZFbmQ7ICAgICAgICAgICAvKiE8IHBvaW50ZXIgcG9pbnRzIHRvIGxhc3QgcG9zaXRpb24gaW4gYml0c3RyZWFtIGJ1ZmZlciAqLwotCi0gIFVXb3JkOCAqcFdyaXRlTmV4dDsgICAgICAgICAgIC8qITwgcG9pbnRlciBwb2ludHMgdG8gbmV4dCBhdmFpbGFibGUgd29yZCBpbiBiaXRzdHJlYW0gYnVmZmVyIHRvIHdyaXRlICovCi0KLSAgVVdvcmQzMiBjYWNoZTsKLQotICBXb3JkMTYgIHdCaXRQb3M7ICAgICAgICAgICAgICAvKiE8IDMxPD13Qml0UG9zPD0wKi8KLSAgV29yZDE2ICBjbnRCaXRzOyAgICAgICAgICAgICAgLyohPCBudW1iZXIgb2YgYXZhaWxhYmxlIGJpdHMgaW4gdGhlIGJpdHN0cmVhbSBidWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZSBiaXRzIHRvIGJpdHN0cmVhbSBidWZmZXIgID0+IGluY3JlbWVudCBjbnRCaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCBiaXRzIGZyb20gYml0c3RyZWFtIGJ1ZmZlciA9PiBkZWNyZW1lbnQgY250Qml0cyAqLwotICBXb3JkMTYgIHNpemU7ICAgICAgICAgICAgICAgICAvKiE8IHNpemUgb2YgYml0YnVmZmVyIGluIGJpdHMgKi8KLSAgV29yZDE2ICBpc1ZhbGlkOyAgICAgICAgICAgICAgLyohPCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgaW5zdGFuY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgKi8KLX07IC8qIHNpemUgV29yZDE2OiA4ICovCi0KLS8qISBEZWZpbmUgcG9pbnRlciB0byBiaXQgYnVmZmVyIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QgQklUX0JVRiAqSEFORExFX0JJVF9CVUY7Ci0KLQotSEFORExFX0JJVF9CVUYgQ3JlYXRlQml0QnVmZmVyKEhBTkRMRV9CSVRfQlVGIGhCaXRCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVdvcmQ4ICpwQml0QnVmQmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIGJpdEJ1ZlNpemUpOwotCi0KLXZvaWQgRGVsZXRlQml0QnVmZmVyKEhBTkRMRV9CSVRfQlVGICpoQml0QnVmKTsKLQotCi1Xb3JkMTYgR2V0Qml0c0F2YWlsKEhBTkRMRV9CSVRfQlVGIGhCaXRCdWYpOwotCi0KLVdvcmQxNiBXcml0ZUJpdHMoSEFORExFX0JJVF9CVUYgaEJpdEJ1ZiwKLSAgICAgICAgICAgICAgICAgVVdvcmQzMiB3cml0ZVZhbHVlLAotICAgICAgICAgICAgICAgICBXb3JkMTYgbm9CaXRzVG9Xcml0ZSk7Ci0KLXZvaWQgUmVzZXRCaXRCdWYoSEFORExFX0JJVF9CVUYgaEJpdEJ1ZiwKLSAgICAgICAgICAgICAgICAgVVdvcmQ4ICpwQml0QnVmQmFzZSwKLSAgICAgICAgICAgICAgICAgV29yZDE2ICBiaXRCdWZTaXplKTsKLQotI2RlZmluZSBHZXROckJpdHNBdmFpbGFibGUoaEJpdEJ1ZikgKCAoaEJpdEJ1ZiktPmNudEJpdHMpCi0jZGVmaW5lIEdldE5yQml0c1JlYWQoaEJpdEJ1ZikgICAgICAgKChoQml0QnVmKS0+c2l6ZS0oaEJpdEJ1ZiktPmNudEJpdHMpCi0KLSNlbmRpZiAvKiBCSVRCVUZGRVJfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYml0ZW5jLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9iaXRlbmMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE1OGFlYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9iaXRlbmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJYml0ZW5jLmgKLQotCUNvbnRlbnQ6CUJpdHN0cmVhbSBlbmNvZGVyIHN0cnVjdHVyZSBhbmQgZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX0JJVEVOQ19ICi0jZGVmaW5lIF9CSVRFTkNfSAotCi0jaW5jbHVkZSAicWNfZGF0YS5oIgotI2luY2x1ZGUgInRucy5oIgotI2luY2x1ZGUgImNoYW5uZWxfbWFwLmgiCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0KLXN0cnVjdCBCSVRTVFJFQU1FTkNPREVSX0lOSVQKLXsKLSAgV29yZDE2IG5DaGFubmVsczsKLSAgV29yZDMyIGJpdHJhdGU7Ci0gIFdvcmQzMiBzYW1wbGVSYXRlOwotICBXb3JkMTYgcHJvZmlsZTsKLX07Ci0KLQotCi1Xb3JkMTYgV3JpdGVCaXRzdHJlYW0gKEhBTkRMRV9CSVRfQlVGIGhCaXRzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfSU5GTyBlbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCAqcWNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVQgKnBzeU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpnbG9iVXNlZEJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVXb3JkOCAqYW5jQnl0ZXMsCi0JCQkJCSAgIFdvcmQxNiBzYW1wbGVyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICk7Ci0KLSNlbmRpZiAvKiBfQklURU5DX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2Jsb2NrX3N3aXRjaC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYmxvY2tfc3dpdGNoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZDNlOGYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYmxvY2tfc3dpdGNoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCWJsb2NrX3N3aXRjaC5oCi0KLQlDb250ZW50OglCbG9jayBzd2l0Y2hpbmcgc3RydWN0dXJlIGFuZCBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfQkxPQ0tfU1dJVENIX0gKLSNkZWZpbmUgX0JMT0NLX1NXSVRDSF9ICi0KLSNpbmNsdWRlICJ0eXBlZGVmLmgiCi0KLQotLyoqKioqKioqKioqKioqKioqKiBEZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgQkxPQ0tfU1dJVENISU5HX0lJUl9MRU4gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZW5ndGggb2YgSGlnaFBhc3MtRklSLUZpbHRlciBmb3IgQXR0YWNrLURldGVjdGlvbiAqLwotI2RlZmluZSBCTE9DS19TV0lUQ0hfV0lORE9XUyBUUkFOU19GQUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiB3aW5kb3dzIGZvciBlbmVyZ3kgY2FsY3VsYXRpb24gKi8KLSNkZWZpbmUgQkxPQ0tfU1dJVENIX1dJTkRPV19MRU4gRlJBTUVfTEVOX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtaW5pbWFsIGdyYW51bGFyaXR5IG9mIGVuZXJneSBjYWxjdWxhdGlvbiAqLwotCi0KLQotLyoqKioqKioqKioqKioqKioqKiBTdHJ1Y3R1cmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0ewotICBXb3JkMzIgaW52QXR0YWNrUmF0aW87Ci0gIFdvcmQxNiB3aW5kb3dTZXF1ZW5jZTsKLSAgV29yZDE2IG5leHR3aW5kb3dTZXF1ZW5jZTsKLSAgRmxhZyBhdHRhY2s7Ci0gIEZsYWcgbGFzdGF0dGFjazsKLSAgV29yZDE2IGF0dGFja0luZGV4OwotICBXb3JkMTYgbGFzdEF0dGFja0luZGV4OwotICBXb3JkMTYgbm9PZkdyb3VwczsKLSAgV29yZDE2IGdyb3VwTGVuW1RSQU5TX0ZBQ107Ci0gIFdvcmQzMiB3aW5kb3dOcmdbMl1bQkxPQ0tfU1dJVENIX1dJTkRPV1NdOyAgICAgLyogdGltZSBzaWduYWwgZW5lcmd5IGluIFN1YndpbmRvd3MgKGxhc3QgYW5kIGN1cnJlbnQpICovCi0gIFdvcmQzMiB3aW5kb3dOcmdGWzJdW0JMT0NLX1NXSVRDSF9XSU5ET1dTXTsgICAgLyogZmlsdGVyZWQgdGltZSBzaWduYWwgZW5lcmd5IGluIHNlZ21lbnRzIChsYXN0IGFuZCBjdXJyZW50KSAqLwotICBXb3JkMzIgaWlyU3RhdGVzW0JMT0NLX1NXSVRDSElOR19JSVJfTEVOXTsgICAgIC8qIGZpbHRlciBkZWxheS1saW5lICovCi0gIFdvcmQzMiBtYXhXaW5kb3dOcmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWF4IGVuZXJneSBpbiBzdWJ3aW5kb3dzICovCi0gIFdvcmQzMiBhY2NXaW5kb3dOcmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVjdXJzaXZlbHkgYWNjdW11bGF0ZWQgd2luZG93TnJnRiAqLwotfUJMT0NLX1NXSVRDSElOR19DT05UUk9MOwotCi0KLQotCi0KLVdvcmQxNiBJbml0QmxvY2tTd2l0Y2hpbmcoQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyIGJpdFJhdGUsIGNvbnN0IFdvcmQxNiBuQ2hhbm5lbHMpOwotCi1Xb3JkMTYgQmxvY2tTd2l0Y2hpbmcoQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnRpbWVTaWduYWwsCi0JCQkJCSAgV29yZDMyICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjaEluY3JlbWVudCk7Ci0KLVdvcmQxNiBTeW5jQmxvY2tTd2l0Y2hpbmcoQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEJMT0NLX1NXSVRDSElOR19DT05UUk9MICpibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IG5vT2ZDaGFubmVscyk7Ci0KLQotCi0jZW5kaWYgIC8qICNpZm5kZWYgX0JMT0NLX1NXSVRDSF9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9jaGFubmVsX21hcC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvY2hhbm5lbF9tYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM2MWZlYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9jaGFubmVsX21hcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQljaGFubmVsX21hcC5oCi0KLQlDb250ZW50OgljaGFubmVsIG1hcHBpbmcgZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX0NIQU5ORUxfTUFQX0gKLSNkZWZpbmUgX0NIQU5ORUxfTUFQX0gKLQotI2luY2x1ZGUgInBzeV9jb25zdC5oIgotI2luY2x1ZGUgInFjX2RhdGEuaCIKLQotV29yZDE2IEluaXRFbGVtZW50SW5mbyAoV29yZDE2IG5DaGFubmVscywgRUxFTUVOVF9JTkZPKiBlbEluZm8pOwotCi1Xb3JkMTYgSW5pdEVsZW1lbnRCaXRzKEVMRU1FTlRfQklUUyAqZWxlbWVudEJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfSU5GTyBlbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBiaXRyYXRlVG90LAotICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYXZlcmFnZUJpdHNUb3QsCi0gICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzdGF0aWNCaXRzVG90KTsKLQotI2VuZGlmIC8qIENIQU5ORUxfTUFQX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2NvbmZpZy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYjRjMjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCWNvbmZpZy5oCi0KLQlDb250ZW50OglhYWMgZW5jb2RlciBwYXJhbWV0ZXIKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfQUFDRU5DX0NPTkZJR19IXwotI2RlZmluZSBfQUFDRU5DX0NPTkZJR19IXwotCi0jZGVmaW5lIE1BWF9DSEFOTkVMUyAgICAgICAgMgotCi0jZGVmaW5lIEFBQ0VOQ19CTE9DS1NJWkUgICAgMTAyNCAgIC8qISBlbmNvZGVyIG9ubHkgdGFrZXMgQkxPQ0tTSVpFIHNhbXBsZXMgYXQgYSB0aW1lICovCi0jZGVmaW5lIEFBQ0VOQ19UUkFOU19GQUMgICAgOCAgICAgIC8qISBlbmNvZGVyIHNob3J0IGxvbmcgcmF0aW8gKi8KLQotCi0jZGVmaW5lIE1BWEJJVFNfQ09FRgkJNjE0NAotI2RlZmluZSBNSU5CSVRTX0NPRUYJCTc0NAotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvZHluX2JpdHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2R5bl9iaXRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYThhNjcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvZHluX2JpdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJZHluX2JpdHMuaAotCi0JQ29udGVudDoJTm9pc2VsZXNzIGNvZGVyIG1vZHVsZSBzdHJ1Y3R1cmUgYW5kIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fRFlOX0JJVFNfSAotI2RlZmluZSBfX0RZTl9CSVRTX0gKLQotI2luY2x1ZGUgInBzeV9jb25zdC5oIgotI2luY2x1ZGUgInRucy5oIgotI2luY2x1ZGUgImJpdF9jbnQuaCIKLQotCi0KLSNkZWZpbmUgTUFYX1NFQ1RJT05TICAgICAgICAgIE1BWF9HUk9VUEVEX1NGQgotI2RlZmluZSBTRUNUX0VTQ19WQUxfTE9ORyAgICAzMQotI2RlZmluZSBTRUNUX0VTQ19WQUxfU0hPUlQgICAgNwotI2RlZmluZSBDT0RFX0JPT0tfQklUUyAgICAgICAgNAotI2RlZmluZSBTRUNUX0JJVFNfTE9ORyAgICAgICAgNQotI2RlZmluZSBTRUNUX0JJVFNfU0hPUlQgICAgICAgMwotCi10eXBlZGVmIHN0cnVjdAotewotICBXb3JkMTYgY29kZUJvb2s7Ci0gIFdvcmQxNiBzZmJTdGFydDsKLSAgV29yZDE2IHNmYkNudDsKLSAgV29yZDE2IHNlY3Rpb25CaXRzOwotfQotU0VDVElPTl9JTkZPOwotCi0KLQotCi10eXBlZGVmIHN0cnVjdAotewotICBXb3JkMTYgYmxvY2tUeXBlOwotICBXb3JkMTYgbm9PZkdyb3VwczsKLSAgV29yZDE2IHNmYkNudDsKLSAgV29yZDE2IG1heFNmYlBlckdyb3VwOwotICBXb3JkMTYgc2ZiUGVyR3JvdXA7Ci0gIFdvcmQxNiBub09mU2VjdGlvbnM7Ci0gIFNFQ1RJT05fSU5GTyBzZWN0aW9uSW5mb1tNQVhfU0VDVElPTlNdOwotICBXb3JkMTYgc2lkZUluZm9CaXRzOyAgICAgICAgICAgICAvKiBzZWN0aW9uaW5nIGJpdHMgICAgICAgKi8KLSAgV29yZDE2IGh1ZmZtYW5CaXRzOyAgICAgICAgICAgICAgLyogaHVmZm1hbiAgICBjb2RlZCBiaXRzICovCi0gIFdvcmQxNiBzY2FsZWZhY0JpdHM7ICAgICAgICAgICAgIC8qIHNjYWxlZmFjICAgY29kZWQgYml0cyAqLwotICBXb3JkMTYgZmlyc3RTY2Y7ICAgICAgICAgICAgICAgICAvKiBmaXJzdCBzY2YgdG8gYmUgY29kZWQgKi8KLSAgV29yZDE2IGJpdExvb2tVcFtNQVhfU0ZCX0xPTkcqKENPREVfQk9PS19FU0NfTkRYKzEpXTsKLSAgV29yZDE2IG1lcmdlR2Fpbkxvb2tVcFtNQVhfU0ZCX0xPTkddOwotfQotU0VDVElPTl9EQVRBOyAvKiAgV29yZDE2IHNpemU6IDEwICsgNjAoTUFYX1NFQ1RJT05TKSo0KFNFQ1RJT05fSU5GTykgKyA1MShNQVhfU0ZCX0xPTkcpKjEyKENPREVfQk9PS19FU0NfTkRYKzEpICsgNTEoTUFYX1NGQl9MT05HKSA9IDkxMyAqLwotCi0KLVdvcmQxNiBCQ0luaXQodm9pZCk7Ci0KLVdvcmQxNiBkeW5CaXRDb3VudChjb25zdCBXb3JkMTYgKnF1YW50U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgY29uc3QgVVdvcmQxNiAqbWF4VmFsdWVJblNmYiwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKnNjYWxlZmFjLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBibG9ja1R5cGUsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IHNmYkNudCwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IHNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgIFNFQ1RJT05fREFUQSAqc2VjdGlvbkRhdGEpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2dycF9kYXRhLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9ncnBfZGF0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzFiMmNiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2dycF9kYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCWdycF9kYXRhLmgKLQotCUNvbnRlbnQ6CVNob3J0IGJsb2NrIGdyb3VwaW5nIGZ1bmN0aW9uCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19HUlBfREFUQV9IX18KLSNkZWZpbmUgX19HUlBfREFUQV9IX18KLSNpbmNsdWRlICJwc3lfZGF0YS5oIgotI2luY2x1ZGUgInR5cGVkZWZzLmgiCi0KLXZvaWQKLWdyb3VwU2hvcnREYXRhKFdvcmQzMiAgICAgICAgKm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAgKnRtcFNwZWN0cnVtLAotICAgICAgICAgICAgICAgU0ZCX1RIUkVTSE9MRCAqc2ZiVGhyZXNob2xkLAotICAgICAgICAgICAgICAgU0ZCX0VORVJHWSAgICAqc2ZiRW5lcmd5LAotICAgICAgICAgICAgICAgU0ZCX0VORVJHWSAgICAqc2ZiRW5lcmd5TVMsCi0gICAgICAgICAgICAgICBTRkJfRU5FUkdZICAgICpzZmJTcHJlYWRlZEVuZXJneSwKLSAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgIHNmYkNudCwKLSAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgKnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgKnNmYk1pblNuciwKLSAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgKmdyb3VwZWRTZmJPZmZzZXQsCi0gICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICptYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgKmdyb3VwZWRTZmJNaW5TbnIsCi0gICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICBub09mR3JvdXBzLAotICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAqZ3JvdXBMZW4pOwotCi0jZW5kaWYgLyogX0lOVEVSRkFDRV9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9pbnRlcmZhY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDJlNmE5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJaW50ZXJmYWNlLmgKLQotCUNvbnRlbnQ6CXBzeWNob2FjY291c3RpYy9xdWFudGl6ZXIgc3RydWN0dXJlcyBhbmQgaW50ZXJmYWNlCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX0lOVEVSRkFDRV9ICi0jZGVmaW5lIF9JTlRFUkZBQ0VfSAotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAicHN5X2NvbnN0LmgiCi0jaW5jbHVkZSAicHN5X2RhdGEuaCIKLSNpbmNsdWRlICJ0eXBlZGVmcy5oIgotCi0KLWVudW0KLXsKLSAgTVNfTk9ORSA9IDAsCi0gIE1TX1NPTUUgPSAxLAotICBNU19BTEwgID0gMgotfTsKLQotZW51bQotewotICBNU19PTiA9IDEKLX07Ci0KLXN0cnVjdCBUT09MU0lORk8gewotICBXb3JkMTYgbXNEaWdlc3Q7Ci0gIFdvcmQxNiBtc01hc2tbTUFYX0dST1VQRURfU0ZCXTsKLX07Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBXb3JkMTYgIHNmYkNudDsKLSAgV29yZDE2ICBzZmJQZXJHcm91cDsKLSAgV29yZDE2ICBtYXhTZmJQZXJHcm91cDsKLSAgV29yZDE2ICB3aW5kb3dTZXF1ZW5jZTsKLSAgV29yZDE2ICB3aW5kb3dTaGFwZTsKLSAgV29yZDE2ICBncm91cGluZ01hc2s7Ci0gIFdvcmQxNiAgc2ZiT2Zmc2V0c1tNQVhfR1JPVVBFRF9TRkIrMV07Ci0gIFdvcmQxNiAgbWRjdFNjYWxlOwotICBXb3JkMzIgKnNmYkVuZXJneTsKLSAgV29yZDMyICpzZmJTcHJlYWRlZEVuZXJneTsKLSAgV29yZDMyICpzZmJUaHJlc2hvbGQ7Ci0gIFdvcmQzMiAqbWRjdFNwZWN0cnVtOwotICBXb3JkMzIgIHNmYkVuU3VtTFI7Ci0gIFdvcmQzMiAgc2ZiRW5TdW1NUzsKLSAgV29yZDMyIHNmYkRpc3RbTUFYX0dST1VQRURfU0ZCXTsKLSAgV29yZDMyIHNmYkRpc3ROZXdbTUFYX0dST1VQRURfU0ZCXTsKLSAgV29yZDE2ICBzZmJNaW5TbnJbTUFYX0dST1VQRURfU0ZCXTsKLSAgV29yZDE2IG1pblNmTWF4UXVhbnRbTUFYX0dST1VQRURfU0ZCXTsKLSAgV29yZDE2IG1pblNjZkNhbGN1bGF0ZWRbTUFYX0dST1VQRURfU0ZCXTsKLSAgV29yZDE2IHByZXZTY2ZMYXN0W01BWF9HUk9VUEVEX1NGQl07Ci0gIFdvcmQxNiBwcmV2U2NmTmV4dFtNQVhfR1JPVVBFRF9TRkJdOwotICBXb3JkMTYgZGVsdGFQZUxhc3RbTUFYX0dST1VQRURfU0ZCXTsKLSAgVE5TX0lORk8gdG5zSW5mbzsKLX0gUFNZX09VVF9DSEFOTkVMOyAvKiBXb3JkMTYgc2l6ZTogMTQgKyA2MChNQVhfR1JPVVBFRF9TRkIpICsgMTEyKFROU19JTkZPKSA9IDE4NiAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBUT09MU0lORk8gdG9vbHNJbmZvOwotICBXb3JkMTYgZ3JvdXBlZFNmYk9mZnNldFtNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQisxXTsgIC8qIHBsdXMgb25lIGZvciBsYXN0IGR1bW15IG9mZnNldCAhICovCi0gIFdvcmQxNiBncm91cGVkU2ZiTWluU25yW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXTsKLX0gUFNZX09VVF9FTEVNRU5UOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qIGluZm9ybWF0aW9uIHNoYXJlZCBieSBib3RoIGNoYW5uZWxzICAqLwotICBQU1lfT1VUX0VMRU1FTlQgIHBzeU91dEVsZW1lbnQ7Ci0gIC8qIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIGVhY2ggY2hhbm5lbCAqLwotICBQU1lfT1VUX0NIQU5ORUwgIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXTsKLX1QU1lfT1VUOwotCi12b2lkIEJ1aWxkSW50ZXJmYWNlKFdvcmQzMiAgICAgICAgICAgICAgICAgKm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAgbWRjdFNjYWxlLAotICAgICAgICAgICAgICAgICAgICBTRkJfVEhSRVNIT0xEICAgICAgICAgICpzZmJUaHJlc2hvbGQsCi0gICAgICAgICAgICAgICAgICAgIFNGQl9FTkVSR1kgICAgICAgICAgICAgKnNmYkVuZXJneSwKLSAgICAgICAgICAgICAgICAgICAgU0ZCX0VORVJHWSAgICAgICAgICAgICAqc2ZiU3ByZWFkZWRFbmVyZ3ksCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFNGQl9FTkVSR1lfU1VNICAgIHNmYkVuZXJneVN1bUxSLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBTRkJfRU5FUkdZX1NVTSAgICBzZmJFbmVyZ3lTdW1NUywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAgd2luZG93U2VxdWVuY2UsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgIHdpbmRvd1NoYXBlLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgICAgICBzZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgKnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgKmdyb3VwZWRTZmJNaW5TbnIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgIG5vT2ZHcm91cHMsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgKmdyb3VwTGVuLAotICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgICAgICAgICpwc3lPdXRDaCk7Ci0KLSNlbmRpZiAvKiBfSU5URVJGQUNFX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2xpbmVfcGUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2xpbmVfcGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE2ZDVhOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9saW5lX3BlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCWxpbmVfcGUuaAotCi0JQ29udGVudDoJUGVyY2VwdHVhbCBlbnRyb3BpZSBtb2R1bGUgc3RydWN0dXJlIGFuZCBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX0xJTkVfUEVfSAotI2RlZmluZSBfX0xJTkVfUEVfSAotCi0KLSNpbmNsdWRlICJwc3lfY29uc3QuaCIKLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICBXb3JkMTYgc2ZiTGRFbmVyZ3lbTUFYX0dST1VQRURfU0ZCXTsgICAgIC8qIDQqbG9nKHNmYkVuZXJneSkvbG9nKDIpICovCi0gICBXb3JkMTYgc2ZiTkxpbmVzNFtNQVhfR1JPVVBFRF9TRkJdOyAgICAgIC8qIDQqbnVtYmVyIG9mIHJlbGV2YW50IGxpbmVzIGluIHNmYiAqLwotICAgV29yZDE2IHNmYlBlW01BWF9HUk9VUEVEX1NGQl07ICAgICAgICAgICAvKiBwZSBmb3IgZWFjaCBzZmIgKi8KLSAgIFdvcmQxNiBzZmJDb25zdFBhcnRbTUFYX0dST1VQRURfU0ZCXTsgICAgLyogY29uc3RhbnQgcGFydCBmb3IgZWFjaCBzZmIgKi8KLSAgIFdvcmQxNiBzZmJOQWN0aXZlTGluZXNbTUFYX0dST1VQRURfU0ZCXTsgLyogbnVtYmVyIG9mIGFjdGl2ZSBsaW5lcyBpbiBzZmIgKi8KLSAgIFdvcmQxNiBwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3VtIG9mIHNmYlBlICovCi0gICBXb3JkMTYgY29uc3RQYXJ0OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1bSBvZiBzZmJDb25zdFBhcnQgKi8KLSAgIFdvcmQxNiBuQWN0aXZlTGluZXM7ICAgICAgICAgICAgICAgICAgICAgLyogc3VtIG9mIHNmYk5BY3RpdmVMaW5lcyAqLwotfSBQRV9DSEFOTkVMX0RBVEE7IC8qIHNpemUgV29yZDE2OiAzMDMgKi8KLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICBQRV9DSEFOTkVMX0RBVEEgcGVDaGFubmVsRGF0YVtNQVhfQ0hBTk5FTFNdOwotICAgV29yZDE2IHBlOwotICAgV29yZDE2IGNvbnN0UGFydDsKLSAgIFdvcmQxNiBuQWN0aXZlTGluZXM7Ci0gICBXb3JkMTYgb2Zmc2V0OwotICAgV29yZDE2IGFoRmxhZ1tNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl07Ci0gICBXb3JkMzIgdGhyRXhwW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXTsKLSAgIFdvcmQzMiBzZmJQZUZhY3RvcnNbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdOwotfSBQRV9EQVRBOyAvKiBzaXplIFdvcmQxNjogMzAzICsgNCArIDEyMCArIDI0MCA9IDY2NyAqLwotCi0KLQotCi12b2lkIHByZXBhcmVTZmJQZShQRV9EQVRBICpwZURhdGEsCi0gICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgICAgIFdvcmQxNiBsb2dTZmJFbmVyZ3lbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgV29yZDE2IHNmYk5SZWxldmFudExpbmVzW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgcGVPZmZzZXQpOwotCi0KLQotCi0KLXZvaWQgY2FsY1NmYlBlKFBFX0RBVEEgKnBlRGF0YSwKLSAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbkNoYW5uZWxzKTsKLQotCi0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9tZW1hbGlnbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvbWVtYWxpZ24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBiYmY0NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9tZW1hbGlnbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQltZW1hbGlnbi5oCi0KLQlDb250ZW50OglNZW1vcnkgYWxsb2MgYWxpZ25tZW50cyBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX1ZPX0FBQ0VOQ19NRU1fQUxJR05fSF9fCi0jZGVmaW5lIF9fVk9fQUFDRU5DX01FTV9BTElHTl9IX18KLQotI2luY2x1ZGUgInZvTWVtLmgiCi0jaW5jbHVkZSAidHlwZWRlZi5oIgotCi1leHRlcm4gdm9pZCAqbWVtX21hbGxvYyhWT19NRU1fT1BFUkFUT1IgKnBNZW1vcCwgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGNoYXIgYWxpZ25tZW50LCB1bnNpZ25lZCBpbnQgQ29kZWNJRCk7Ci1leHRlcm4gdm9pZCBtZW1fZnJlZShWT19NRU1fT1BFUkFUT1IgKnBNZW1vcCwgdm9pZCAqbWVtX3B0ciwgdW5zaWduZWQgaW50IENvZGVjSUQpOwotCi0jZW5kaWYJLyogX19WT19NRU1fQUxJR05fSF9fICovCi0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9tc19zdGVyZW8uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL21zX3N0ZXJlby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzAzZGVhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL21zX3N0ZXJlby5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQltc19zdGVyZW8uaAotCi0JQ29udGVudDoJRGVjbGFyYXRpb24gTVMgc3RlcmVvIHByb2Nlc3Npbmcgc3RydWN0dXJlIGFuZCBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX01TX1NURVJFT19IX18KLSNkZWZpbmUgX19NU19TVEVSRU9fSF9fCi0jaW5jbHVkZSAidHlwZWRlZi5oIgotCi12b2lkIE1zU3RlcmVvUHJvY2Vzc2luZyhXb3JkMzIgICAgICAgKnNmYkVuZXJneUxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKnNmYkVuZXJneVJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyICpzZmJFbmVyZ3lNaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgKnNmYkVuZXJneVNpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKm1kY3RTcGVjdHJ1bUxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKm1kY3RTcGVjdHJ1bVJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpzZmJUaHJlc2hvbGRMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpzZmJUaHJlc2hvbGRSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqc2ZiU3ByZWFkZWRFbkxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKnNmYlNwcmVhZGVkRW5SaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAqbXNEaWdlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgKm1zTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgc2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICBzZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgbWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKnNmYk9mZnNldCk7Ci0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wcmVfZWNob19jb250cm9sLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wcmVfZWNob19jb250cm9sLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MTliYTcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcHJlX2VjaG9fY29udHJvbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlwcmVfZWNob19jb250cm9sLmgKLQotCUNvbnRlbnQ6CVByZSBlY2hvIGNvbnRyb2wgZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19QUkVfRUNIT19DT05UUk9MX0gKLSNkZWZpbmUgX19QUkVfRUNIT19DT05UUk9MX0gKLQotI2luY2x1ZGUgInR5cGVkZWZzLmgiCi0KLXZvaWQgSW5pdFByZUVjaG9Db250cm9sKFdvcmQzMiAqcGJUaHJlc2hvbGRubTEsCi0gICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG51bVBiLAotICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICpwYlRocmVzaG9sZFF1aWV0KTsKLQotCi12b2lkIFByZUVjaG9Db250cm9sKFdvcmQzMiAqcGJUaHJlc2hvbGRObTEsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbnVtUGIsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgbWF4QWxsb3dlZEluY3JlYXNlRmFjdG9yLAotICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgV29yZDMyICpwYlRocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBtZGN0U2NhbGUsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbWRjdFNjYWxlbm0xKTsKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3BzeV9jb25maWd1cmF0aW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wc3lfY29uZmlndXJhdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjk4MWZhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3BzeV9jb25maWd1cmF0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlwc3lfY29uZmlndXJhdGlvbi5oCi0KLQlDb250ZW50OglQc3ljaG9hY2NvdXN0aWMgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgYW5kIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9QU1lfQ09ORklHVVJBVElPTl9ICi0jZGVmaW5lIF9QU1lfQ09ORklHVVJBVElPTl9ICi0KLSNpbmNsdWRlICJ0eXBlZGVmcy5oIgotI2luY2x1ZGUgInBzeV9jb25zdC5oIgotI2luY2x1ZGUgInRucy5oIgotCi10eXBlZGVmIHN0cnVjdHsKLQotICBXb3JkMTYgc2ZiQ250OwotICBXb3JkMTYgc2ZiQWN0aXZlOyAgIC8qIG51bWJlciBvZiBzZiBiYW5kcyBjb250YWluaW5nIGVuZXJneSBhZnRlciBsb3dwYXNzICovCi0gIGNvbnN0IFdvcmQxNiAqc2ZiT2Zmc2V0OwotCi0gIFdvcmQzMiBzZmJUaHJlc2hvbGRRdWlldFtNQVhfU0ZCX0xPTkddOwotCi0gIFdvcmQxNiBtYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3I7ICAgLyogcHJlZWNobyBjb250cm9sICovCi0gIFdvcmQxNiBtaW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3I7Ci0KLSAgV29yZDE2IGxvd3Bhc3NMaW5lOwotICBXb3JkMTYgc2FtcFJhdGVJZHg7Ci0gIFdvcmQzMiBjbGlwRW5lcmd5OyAgICAgICAgICAgICAgICAgLyogZm9yIGxldmVsIGRlcGVuZGVuZCB0bW4gKi8KLQotICBXb3JkMTYgcmF0aW87Ci0gIFdvcmQxNiBzZmJNYXNrTG93RmFjdG9yW01BWF9TRkJfTE9OR107Ci0gIFdvcmQxNiBzZmJNYXNrSGlnaEZhY3RvcltNQVhfU0ZCX0xPTkddOwotCi0gIFdvcmQxNiBzZmJNYXNrTG93RmFjdG9yU3ByRW5bTUFYX1NGQl9MT05HXTsKLSAgV29yZDE2IHNmYk1hc2tIaWdoRmFjdG9yU3ByRW5bTUFYX1NGQl9MT05HXTsKLQotCi0gIFdvcmQxNiBzZmJNaW5TbnJbTUFYX1NGQl9MT05HXTsgICAgICAgLyogbWluaW11bSBzbnIgKGZvcm1lcmx5IGtub3duIGFzIGJtYXgpICovCi0KLSAgVE5TX0NPTkZJRyB0bnNDb25mOwotCi19UFNZX0NPTkZJR1VSQVRJT05fTE9ORzsgLypXb3JkMTYgc2l6ZTogOCArIDUyICsgMTAyICsgNTEgKyA1MSArIDUxICsgNTEgKyA0NyA9IDUxNSAqLwotCi0KLXR5cGVkZWYgc3RydWN0ewotCi0gIFdvcmQxNiBzZmJDbnQ7Ci0gIFdvcmQxNiBzZmJBY3RpdmU7ICAgLyogbnVtYmVyIG9mIHNmIGJhbmRzIGNvbnRhaW5pbmcgZW5lcmd5IGFmdGVyIGxvd3Bhc3MgKi8KLSAgY29uc3QgV29yZDE2ICpzZmJPZmZzZXQ7Ci0KLSAgV29yZDMyIHNmYlRocmVzaG9sZFF1aWV0W01BWF9TRkJfU0hPUlRdOwotCi0gIFdvcmQxNiBtYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3I7ICAgLyogcHJlZWNobyBjb250cm9sICovCi0gIFdvcmQxNiBtaW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3I7Ci0KLSAgV29yZDE2IGxvd3Bhc3NMaW5lOwotICBXb3JkMTYgc2FtcFJhdGVJZHg7Ci0gIFdvcmQzMiBjbGlwRW5lcmd5OyAgICAgICAgICAgICAgICAgLyogZm9yIGxldmVsIGRlcGVuZGVuZCB0bW4gKi8KLQotICBXb3JkMTYgcmF0aW87Ci0gIFdvcmQxNiBzZmJNYXNrTG93RmFjdG9yW01BWF9TRkJfU0hPUlRdOwotICBXb3JkMTYgc2ZiTWFza0hpZ2hGYWN0b3JbTUFYX1NGQl9TSE9SVF07Ci0KLSAgV29yZDE2IHNmYk1hc2tMb3dGYWN0b3JTcHJFbltNQVhfU0ZCX1NIT1JUXTsKLSAgV29yZDE2IHNmYk1hc2tIaWdoRmFjdG9yU3ByRW5bTUFYX1NGQl9TSE9SVF07Ci0KLQotICBXb3JkMTYgc2ZiTWluU25yW01BWF9TRkJfU0hPUlRdOyAgICAgICAvKiBtaW5pbXVtIHNuciAoZm9ybWVybHkga25vd24gYXMgYm1heCkgKi8KLQotICBUTlNfQ09ORklHIHRuc0NvbmY7Ci0KLX1QU1lfQ09ORklHVVJBVElPTl9TSE9SVDsgLypXb3JkMTYgc2l6ZTogOCArIDE2ICsgMTYgKyAxNiArIDE2ICsgMTYgKyAxNiArIDE2ICsgNDcgPSAxNjcgKi8KLQotCi0vKiBSZXR1cm5zIHRoZSBzYW1wbGUgcmF0ZSBpbmRleCAqLwotV29yZDMyIEdldFNSSW5kZXgoV29yZDMyIHNhbXBsZVJhdGUpOwotCi0KLVdvcmQxNiBJbml0UHN5Q29uZmlndXJhdGlvbkxvbmcoV29yZDMyIGJpdHJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBzYW1wbGVyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYmFuZHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTl9MT05HICpwc3lDb25mKTsKLQotV29yZDE2IEluaXRQc3lDb25maWd1cmF0aW9uU2hvcnQoV29yZDMyIGJpdHJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgc2FtcGxlcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBiYW5kd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTl9TSE9SVCAqcHN5Q29uZik7Ci0KLSNlbmRpZiAvKiBfUFNZX0NPTkZJR1VSQVRJT05fSCAqLwotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcHN5X2NvbnN0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wc3lfY29uc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI5ZjhjMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wc3lfY29uc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJcHN5X2NvbnN0LmgKLQotCUNvbnRlbnQ6CUdsb2JhbCBwc3ljaG9hY291c3RpYyBjb25zdGFudHMgc3RydWN0dXJlcwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9QU1lDT05TVF9ICi0jZGVmaW5lIF9QU1lDT05TVF9ICi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2RlZmluZSBUUlVFICAxCi0jZGVmaW5lIEZBTFNFIDAKLQotI2RlZmluZSBGUkFNRV9MRU5fTE9ORyAgICBBQUNFTkNfQkxPQ0tTSVpFCi0jZGVmaW5lIFRSQU5TX0ZBQyAgICAgICAgIDgKLSNkZWZpbmUgRlJBTUVfTEVOX1NIT1JUICAgKEZSQU1FX0xFTl9MT05HL1RSQU5TX0ZBQykKLQotCi0KLS8qIEJsb2NrIHR5cGVzICovCi1lbnVtCi17Ci0gIExPTkdfV0lORE9XID0gMCwKLSAgU1RBUlRfV0lORE9XLAotICBTSE9SVF9XSU5ET1csCi0gIFNUT1BfV0lORE9XCi19OwotCi0vKiBXaW5kb3cgc2hhcGVzICovCi1lbnVtCi17Ci0gIFNJTkVfV0lORE9XID0gMCwKLSAgS0JEX1dJTkRPVyAgPSAxCi19OwotCi0vKgotICBNUyBzdHVmZgotKi8KLWVudW0KLXsKLSAgU0lfTVNfTUFTS19OT05FID0gMCwKLSAgU0lfTVNfTUFTS19TT01FID0gMSwKLSAgU0lfTVNfTUFTS19BTEwgID0gMgotfTsKLQotI2RlZmluZSBNQVhfTk9fT0ZfR1JPVVBTIDQKLSNkZWZpbmUgTUFYX1NGQl9TSE9SVCAgIDE1ICAvKiAxNSBmb3IgYSBtZW1vcnkgb3B0aW1pemVkIGltcGxlbWVudGF0aW9uLCBtYXliZSAxNiBmb3IgY29udmVuaWVudCBkZWJ1Z2dpbmcgKi8KLSNkZWZpbmUgTUFYX1NGQl9MT05HICAgIDUxICAvKiA1MSBmb3IgYSBtZW1vcnkgb3B0aW1pemVkIGltcGxlbWVudGF0aW9uLCBtYXliZSA2NCBmb3IgY29udmVuaWVudCBkZWJ1Z2dpbmcgKi8KLSNkZWZpbmUgTUFYX1NGQiAgICAgICAgIChNQVhfU0ZCX1NIT1JUID4gTUFYX1NGQl9MT05HID8gTUFYX1NGQl9TSE9SVCA6IE1BWF9TRkJfTE9ORykgICAvKiA9IE1BWF9TRkJfTE9ORyAqLwotI2RlZmluZSBNQVhfR1JPVVBFRF9TRkIgKE1BWF9OT19PRl9HUk9VUFMqTUFYX1NGQl9TSE9SVCA+IE1BWF9TRkJfTE9ORyA/IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfTk9fT0ZfR1JPVVBTKk1BWF9TRkJfU0hPUlQgOiBNQVhfU0ZCX0xPTkcpCi0KLSNkZWZpbmUgQkxPQ0tfU1dJVENISU5HX09GRlNFVAkJICAgKDEqMTAyNCszKjEyOCs2NCsxMjgpCi0jZGVmaW5lIEJMT0NLX1NXSVRDSElOR19EQVRBX1NJWkUgICAgICAgICAgRlJBTUVfTEVOX0xPTkcKLQotI2RlZmluZSBUUkFOU0ZPUk1fT0ZGU0VUX0xPTkcgICAgMAotI2RlZmluZSBUUkFOU0ZPUk1fT0ZGU0VUX1NIT1JUICAgNDQ4Ci0KLSNkZWZpbmUgTE9HX05PUk1fUENNICAgICAgICAgICgtMTUpCi0KLSNkZWZpbmUgTlVNX1NBTVBMRV9SQVRFUwkxMgotCi0jZW5kaWYgLyogX1BTWUNPTlNUX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3BzeV9kYXRhLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wc3lfZGF0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWE2YTg0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3BzeV9kYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCXBzeV9kYXRhLmgKLQotCUNvbnRlbnQ6CVBzeWNob2Fjb3VzdGljIGRhdGEgYW5kIHN0cnVjdHVyZXMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfUFNZX0RBVEFfSAotI2RlZmluZSBfUFNZX0RBVEFfSAotCi0jaW5jbHVkZSAiYmxvY2tfc3dpdGNoLmgiCi0jaW5jbHVkZSAidG5zLmgiCi0KLS8qCi0gIHRoZSBzdHJ1Y3RzIGNhbiBiZSBpbXBsZW1lbnRlZCBhcyB1bmlvbnMKLSovCi0KLXR5cGVkZWYgc3RydWN0ewotICBXb3JkMzIgc2ZiTG9uZ1tNQVhfR1JPVVBFRF9TRkJdOwotICBXb3JkMzIgc2ZiU2hvcnRbVFJBTlNfRkFDXVtNQVhfU0ZCX1NIT1JUXTsKLX1TRkJfVEhSRVNIT0xEOyAvKiBXb3JkMTYgc2l6ZTogMjYwICovCi0KLXR5cGVkZWYgc3RydWN0ewotICBXb3JkMzIgc2ZiTG9uZ1tNQVhfR1JPVVBFRF9TRkJdOwotICBXb3JkMzIgc2ZiU2hvcnRbVFJBTlNfRkFDXVtNQVhfU0ZCX1NIT1JUXTsKLX1TRkJfRU5FUkdZOyAvKiBXb3JkMTYgc2l6ZTogMjYwICovCi0KLXR5cGVkZWYgc3RydWN0ewotICBXb3JkMzIgc2ZiTG9uZzsKLSAgV29yZDMyIHNmYlNob3J0W1RSQU5TX0ZBQ107Ci19U0ZCX0VORVJHWV9TVU07IC8qIFdvcmQxNiBzaXplOiAxOCAqLwotCi0KLXR5cGVkZWYgc3RydWN0ewotICBCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbDsgICAgICAgICAgLyogYmxvY2sgc3dpdGNoaW5nICovCi0gIFdvcmQxNiAgICAgICAgICAgICAgICAgICAgKm1kY3REZWxheUJ1ZmZlcjsgICAgICAgICAgICAgICAvKiBtZGN0IGRlbGF5IGJ1ZmZlciBbQkxPQ0tfU1dJVENISU5HX09GRlNFVF0qLwotICBXb3JkMzIgICAgICAgICAgICAgICAgICAgIHNmYlRocmVzaG9sZG5tMVtNQVhfU0ZCXTsgICAgICAgLyogUHJlRWNob0NvbnRyb2wgKi8KLSAgV29yZDE2ICAgICAgICAgICAgICAgICAgICBtZGN0U2NhbGVubTE7ICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIG9mIGxhc3QgYmxvY2sncyBtZGN0IChQcmVFY2hvQ29udHJvbCkgKi8KLQotICBTRkJfVEhSRVNIT0xEICAgICAgICAgICAgIHNmYlRocmVzaG9sZDsgICAgICAgICAgICAgICAgICAgLyogYWRhcHQgICAgICAgICAgICovCi0gIFNGQl9FTkVSR1kgICAgICAgICAgICAgICAgc2ZiRW5lcmd5OyAgICAgICAgICAgICAgICAgICAgICAvKiBzZmIgRW5lcmd5ICAgICAgKi8KLSAgU0ZCX0VORVJHWSAgICAgICAgICAgICAgICBzZmJFbmVyZ3lNUzsKLSAgU0ZCX0VORVJHWV9TVU0gICAgICAgICAgICBzZmJFbmVyZ3lTdW07Ci0gIFNGQl9FTkVSR1lfU1VNICAgICAgICAgICAgc2ZiRW5lcmd5U3VtTVM7Ci0gIFNGQl9FTkVSR1kgICAgICAgICAgICAgICAgc2ZiU3ByZWFkZWRFbmVyZ3k7Ci0KLSAgV29yZDMyICAgICAgICAgICAgICAgICAgICAqbWRjdFNwZWN0cnVtOyAgICAgICAgICAgICAgICAgIC8qIG1kY3Qgc3BlY3RydW0gW0ZSQU1FX0xFTl9MT05HXSAqLwotICBXb3JkMTYgICAgICAgICAgICAgICAgICAgIG1kY3RTY2FsZTsgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgb2YgbWRjdCAgICovCi19UFNZX0RBVEE7IC8qIFdvcmQxNiBzaXplOiA0ICsgODcgKyAxMDIgKyAzNjAgKyAzNjAgKyAzNjAgKyAxOCArIDE4ICsgMzYwID0gMTY2OSAqLwotCi0jZW5kaWYgLyogX1BTWV9EQVRBX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3BzeV9tYWluLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wc3lfbWFpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2NhYzYwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3BzeV9tYWluLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCXBzeV9tYWluLmgKLQotCUNvbnRlbnQ6CVBzeWNob2Fjb3VzdGljIG1ham9yIGZ1bmN0aW9uIGJsb2NrCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX1BTWU1BSU5fSAotI2RlZmluZSBfUFNZTUFJTl9ICi0KLSNpbmNsdWRlICJwc3lfY29uZmlndXJhdGlvbi5oIgotI2luY2x1ZGUgInFjX2RhdGEuaCIKLSNpbmNsdWRlICJtZW1hbGlnbi5oIgotCi0vKgotICBwc3kga2VybmVsCi0qLwotdHlwZWRlZiBzdHJ1Y3QgIHsKLSAgUFNZX0NPTkZJR1VSQVRJT05fTE9ORyAgcHN5Q29uZkxvbmc7ICAgICAgICAgICAvKiBXb3JkMTYgc2l6ZTogNTE1ICovCi0gIFBTWV9DT05GSUdVUkFUSU9OX1NIT1JUIHBzeUNvbmZTaG9ydDsgICAgICAgICAgLyogV29yZDE2IHNpemU6IDE2NyAqLwotICBQU1lfREFUQSAgICAgICAgICAgICAgICBwc3lEYXRhW01BWF9DSEFOTkVMU107IC8qIFdvcmQxNiBzaXplOiBNQVhfQ0hBTk5FTFMqMTY2OSovCi0gIFROU19EQVRBICAgICAgICAgICAgICAgIHRuc0RhdGFbTUFYX0NIQU5ORUxTXTsgLyogV29yZDE2IHNpemU6IE1BWF9DSEFOTkVMUyoyMzUgKi8KLSAgV29yZDMyKiAgICAgICAgICAgICAgICAgcFNjcmF0Y2hUbnM7Ci0gIFdvcmQxNgkJCQkgIHNhbXBsZVJhdGVJZHg7Ci19UFNZX0tFUk5FTDsgLyogV29yZDE2IHNpemU6IDI1ODcgLyA0NDkxICovCi0KLQotV29yZDE2IFBzeU5ldyggUFNZX0tFUk5FTCAgKmhQc3ksIFdvcmQzMiBuQ2hhbiwgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApOwotV29yZDE2IFBzeURlbGV0ZSggUFNZX0tFUk5FTCAgKmhQc3ksIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKTsKLQotV29yZDE2IFBzeU91dE5ldyggUFNZX09VVCAqaFBzeU91dCwgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApOwotV29yZDE2IFBzeU91dERlbGV0ZSggUFNZX09VVCAqaFBzeU91dCwgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApOwotCi1Xb3JkMTYgcHN5TWFpbkluaXQoIFBTWV9LRVJORUwgKmhQc3ksCi0gICAgICAgICAgICAgICAgICAgIFdvcmQzMiBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICBXb3JkMzIgYml0UmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgV29yZDE2IGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICBXb3JkMTYgdG5zTWFzaywKLSAgICAgICAgICAgICAgICAgICAgV29yZDE2IGJhbmR3aWR0aCk7Ci0KLQotV29yZDE2IHBzeU1haW4oV29yZDE2ICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywgICAvKiE8IHRvdGFsIG51bWJlciBvZiBjaGFubmVscyAqLwotICAgICAgICAgICAgICAgRUxFTUVOVF9JTkZPICAgICAgICAgICAgICplbGVtSW5mbywKLSAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgICAgICAgICAqdGltZVNpZ25hbCwgLyohPCBpbnRlcmxlYXZlZCB0aW1lIHNpZ25hbCAqLwotICAgICAgICAgICAgICAgUFNZX0RBVEEgICAgICAgICAgICAgICAgIHBzeURhdGFbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgIFROU19EQVRBICAgICAgICAgICAgICAgICB0bnNEYXRhW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTl9MT05HKiAgcHN5Q29uZkxvbmcsCi0gICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTl9TSE9SVCogcHN5Q29uZlNob3J0LAotICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICAgICAgICAgIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCAgICAgICAgICAqcHN5T3V0RWxlbWVudCwKLSAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAgICAgICAgICAgICAqcFNjcmF0Y2hUbnMsCi0JCQkgICBXb3JkMzIJCQkJCXNhbXBsZVJhdGUpOwotCi0jZW5kaWYgLyogX1BTWU1BSU5fSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcWNfZGF0YS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcWNfZGF0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDk5MjJkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3FjX2RhdGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCXFjX2RhdGEuaAotCi0JQ29udGVudDoJUXVhbnRpemluZyAmIGNvZGluZyBzdHJ1Y3R1cmVzCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX1FDX0RBVEFfSAotI2RlZmluZSBfUUNfREFUQV9ICi0KLSNpbmNsdWRlICJwc3lfY29uc3QuaCIKLSNpbmNsdWRlICJkeW5fYml0cy5oIgotI2luY2x1ZGUgImFkal90aHJfZGF0YS5oIgotCi0KLSNkZWZpbmUgTUFYX01PREVTIDEwCi0KLXR5cGVkZWYgZW51bSB7Ci0gIE1PREVfSU5WQUxJRCA9IDAsCi0gIE1PREVfMSwgICAgICAgIC8qIG1vbm8gICAgICAqLwotICBNT0RFXzFfMSwgICAgICAvKiBkdWFsIG1vbm8gKi8KLSAgTU9ERV8yICAgICAgICAgLyogc3RlcmVvICAgICovCi19IEVOQ09ERVJfTU9ERTsKLQotdHlwZWRlZiBlbnVtIHsKLSAgSURfU0NFPTAsICAgICAvKiBTaW5nbGUgQ2hhbm5lbCBFbGVtZW50ICAgKi8KLSAgSURfQ1BFPTEsICAgICAvKiBDaGFubmVsIFBhaXIgRWxlbWVudCAgICAgKi8KLSAgSURfQ0NFPTIsICAgICAvKiBDb3VwbGluZyBDaGFubmVsIEVsZW1lbnQgKi8KLSAgSURfTEZFPTMsICAgICAvKiBMRkUgQ2hhbm5lbCBFbGVtZW50ICAgICAgKi8KLSAgSURfRFNFPTQsICAgICAvKiBjdXJyZW50IG9uZSBEU0UgZWxlbWVudCBmb3IgYW5jaWxsYXJ5IGlzIHN1cHBvcnRlZCAqLwotICBJRF9QQ0U9NSwKLSAgSURfRklMPTYsCi0gIElEX0VORD03Ci19RUxFTUVOVF9UWVBFOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEVMRU1FTlRfVFlQRSBlbFR5cGU7Ci0gIFdvcmQxNiBpbnN0YW5jZVRhZzsKLSAgV29yZDE2IG5DaGFubmVsc0luRWw7Ci0gIFdvcmQxNiBDaGFubmVsSW5kZXhbTUFYX0NIQU5ORUxTXTsKLX0gRUxFTUVOVF9JTkZPOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFdvcmQzMiBwYWRkaW5nUmVzdDsKLX0gUEFERElORzsKLQotCi0vKiBRdWFudGl6aW5nICYgY29kaW5nIHN0YWdlICovCi0KLXN0cnVjdCBRQ19JTklUewotICBFTEVNRU5UX0lORk8gKmVsSW5mbzsKLSAgV29yZDE2IG1heEJpdHM7ICAgICAvKiBtYXhpbXVtIG51bWJlciBvZiBiaXRzIGluIHJlc2Vydm9pciAgKi8KLSAgV29yZDE2IGF2ZXJhZ2VCaXRzOyAvKiBhdmVyYWdlIG51bWJlciBvZiBiaXRzIHdlIHNob3VsZCB1c2UgKi8KLSAgV29yZDE2IGJpdFJlczsKLSAgV29yZDE2IG1lYW5QZTsKLSAgV29yZDMyIGNoQml0cmF0ZTsKLSAgV29yZDE2IG1heEJpdEZhYzsKLSAgV29yZDMyIGJpdHJhdGU7Ci0KLSAgUEFERElORyBwYWRkaW5nOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgV29yZDE2ICAgICAgICAgICpxdWFudFNwZWM7ICAgICAgIC8qIFtGUkFNRV9MRU5fTE9OR107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIFVXb3JkMTYgICAgICAgICAqbWF4VmFsdWVJblNmYjsgICAvKiBbTUFYX0dST1VQRURfU0ZCXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBXb3JkMTYgICAgICAgICAgKnNjZjsgICAgICAgICAgICAgLyogW01BWF9HUk9VUEVEX1NGQl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgV29yZDE2ICAgICAgICAgIGdsb2JhbEdhaW47Ci0gIFdvcmQxNiAgICAgICAgICBtZGN0U2NhbGU7Ci0gIFdvcmQxNiAgICAgICAgICBncm91cGluZ01hc2s7Ci0gIFNFQ1RJT05fREFUQSAgICBzZWN0aW9uRGF0YTsKLSAgV29yZDE2ICAgICAgICAgIHdpbmRvd1NoYXBlOwotfSBRQ19PVVRfQ0hBTk5FTDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgV29yZDE2CQkgIGFkdHNVc2VkOwotICBXb3JkMTYgICAgICAgICAgc3RhdGljQml0c1VzZWQ7IC8qIGZvciB2ZXJpZmljYXRpb24gcHVycG9zZXMgKi8KLSAgV29yZDE2ICAgICAgICAgIGR5bkJpdHNVc2VkOyAgICAvKiBmb3IgdmVyaWZpY2F0aW9uIHB1cnBvc2VzICovCi0gIFdvcmQxNiAgICAgICAgICBwZTsKLSAgV29yZDE2ICAgICAgICAgIGFuY0JpdHNVc2VkOwotICBXb3JkMTYgICAgICAgICAgZmlsbEJpdHM7Ci19IFFDX09VVF9FTEVNRU5UOwotCi10eXBlZGVmIHN0cnVjdAotewotICBRQ19PVVRfQ0hBTk5FTCAgcWNDaGFubmVsW01BWF9DSEFOTkVMU107Ci0gIFFDX09VVF9FTEVNRU5UICBxY0VsZW1lbnQ7Ci0gIFdvcmQxNiAgICAgICAgICB0b3RTdGF0aWNCaXRzVXNlZDsgLyogZm9yIHZlcmlmaWNhdGlvbiBwdXJwb3NlcyAqLwotICBXb3JkMTYgICAgICAgICAgdG90RHluQml0c1VzZWQ7ICAgIC8qIGZvciB2ZXJpZmljYXRpb24gcHVycG9zZXMgKi8KLSAgV29yZDE2ICAgICAgICAgIHRvdEFuY0JpdHNVc2VkOyAgICAvKiBmb3IgdmVyaWZpY2F0aW9uIHB1cnBvc2VzICovCi0gIFdvcmQxNiAgICAgICAgICB0b3RGaWxsQml0czsKLSAgV29yZDE2ICAgICAgICAgIGFsaWduQml0czsKLSAgV29yZDE2ICAgICAgICAgIGJpdFJlc1RvdDsKLSAgV29yZDE2ICAgICAgICAgIGF2ZXJhZ2VCaXRzVG90OwotfSBRQ19PVVQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgV29yZDMyIGNoQml0cmF0ZTsKLSAgV29yZDE2IGF2ZXJhZ2VCaXRzOyAgICAgICAgICAgICAgIC8qIGJydXR0byAtPiBsb29rIGFuY2lsbGFyeS5oICovCi0gIFdvcmQxNiBtYXhCaXRzOwotICBXb3JkMTYgYml0UmVzTGV2ZWw7Ci0gIFdvcmQxNiBtYXhCaXRSZXNCaXRzOwotICBXb3JkMTYgcmVsYXRpdmVCaXRzOyAgICAgICAgICAgIC8qIEJpdHMgcmVsYXRpdmUgdG8gdG90YWwgQml0cyBzY2FsZWQgZG93biBieSAyICovCi19IEVMRU1FTlRfQklUUzsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogdGhpcyBpcyBiYXNpY2FsbHkgc3RydWN0IFFDX0lOSVQgKi8KLSAgV29yZDE2IGF2ZXJhZ2VCaXRzVG90OwotICBXb3JkMTYgbWF4Qml0c1RvdDsKLSAgV29yZDE2IGdsb2JTdGF0Qml0czsKLSAgV29yZDE2IG5DaGFubmVsczsKLSAgV29yZDE2IGJpdFJlc1RvdDsKLQotICBXb3JkMTYgbWF4Qml0RmFjOwotCi0gIFBBRERJTkcgICBwYWRkaW5nOwotCi0gIEVMRU1FTlRfQklUUyAgZWxlbWVudEJpdHM7Ci0gIEFESl9USFJfU1RBVEUgYWRqVGhyOwotCi0gIFdvcmQxNiBsb2dTZmJGb3JtRmFjdG9yW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXTsKLSAgV29yZDE2IHNmYk5SZWxldmFudExpbmVzW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXTsKLSAgV29yZDE2IGxvZ1NmYkVuZXJneVtNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl07Ci19IFFDX1NUQVRFOwotCi0jZW5kaWYgLyogX1FDX0RBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcWNfbWFpbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcWNfbWFpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjgzOTczLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3FjX21haW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJcWNfbWFpbi5oCi0KLQlDb250ZW50OglRdWFudGl6aW5nICYgY29kaW5nIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9RQ19NQUlOX0gKLSNkZWZpbmUgX1FDX01BSU5fSAotCi0jaW5jbHVkZSAicWNfZGF0YS5oIgotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgIm1lbWFsaWduLmgiCi0KLS8qIFF1YW50aXppbmcgJiBjb2Rpbmcgc3RhZ2UgKi8KLQotV29yZDE2IFFDT3V0TmV3KFFDX09VVCAqaFFDLCBXb3JkMTYgbkNoYW5uZWxzLCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCk7Ci0KLXZvaWQgUUNPdXREZWxldGUoUUNfT1VUICpoUUMsIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKTsKLQotV29yZDE2IFFDTmV3KFFDX1NUQVRFICpoUUMsIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKTsKLQotV29yZDE2IFFDSW5pdChRQ19TVEFURSAqaFFDLAotICAgICAgICAgICAgICBzdHJ1Y3QgUUNfSU5JVCAqaW5pdCk7Ci0KLXZvaWQgUUNEZWxldGUoUUNfU1RBVEUgKmhRQywgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApOwotCi0KLVdvcmQxNiBRQ01haW4oUUNfU1RBVEUgKmhRQywKLSAgICAgICAgICAgICAgRUxFTUVOVF9CSVRTKiBlbEJpdHMsCi0gICAgICAgICAgICAgIEFUU19FTEVNRU5UKiBhZGpUaHJTdGF0ZUVsZW1lbnQsCi0gICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sIC8qIG1heSBiZSBtb2RpZmllZCBpbi1wbGFjZSAqLwotICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQqIHBzeU91dEVsZW1lbnQsCi0gICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMICBxY091dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwgICAvKiBvdXQgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqIHFjT3V0RWxlbWVudCwKLSAgICAgICAgICAgICAgV29yZDE2IG5DaGFubmVscywKLQkJCSAgV29yZDE2IGFuY2lsbGFyeURhdGFCeXRlcyk7ICAgICAvKiByZXR1cm5zIGVycm9yIGNvZGUgICAgICAgKi8KLQotdm9pZCB1cGRhdGVCaXRyZXMoUUNfU1RBVEUqIHFjS2VybmVsLAotICAgICAgICAgICAgICAgICAgUUNfT1VUKiBxY091dCk7Ci0KLVdvcmQxNiBGaW5hbGl6ZUJpdENvbnN1bXB0aW9uKFFDX1NUQVRFICpoUUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQqIHFjT3V0KTsKLQotV29yZDE2IEFkanVzdEJpdHJhdGUoUUNfU1RBVEUgKmhRQywKLSAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBiaXRSYXRlLAotICAgICAgICAgICAgICAgICAgICAgV29yZDMyIHNhbXBsZVJhdGUpOwotCi0jZW5kaWYgLyogX1FDX01BSU5fSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcXVhbnRpemUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3F1YW50aXplLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYWZlZjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcXVhbnRpemUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJcXVhbnRpemUuaAotCi0JQ29udGVudDoJUXVhbnRpemF0aW9uIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9RVUFOVElaRV9IXwotI2RlZmluZSBfUVVBTlRJWkVfSF8KLSNpbmNsdWRlICJ0eXBlZGVmcy5oIgotCi0vKiBxdWFudGl6aW5nICovCi0KLSNkZWZpbmUgTUFYX1FVQU5UIDgxOTEKLQotdm9pZCBRdWFudGl6ZVNwZWN0cnVtKFdvcmQxNiBzZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG1heFNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnNmYk9mZnNldCwgV29yZDMyICptZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGdsb2JhbEdhaW4sIFdvcmQxNiAqc2NhbGVmYWN0b3JzLAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcXVhbnRpemVkU3BlY3RydW0pOwotCi1Xb3JkMzIgY2FsY1NmYkRpc3QoY29uc3QgV29yZDMyICpzcGVjLAotICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgc2ZiV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgV29yZDE2ICBnYWluKTsKLQotI2VuZGlmIC8qIF9RVUFOVElaRV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvc2ZfZXN0aW0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3NmX2VzdGltLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5N2ViYTUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvc2ZfZXN0aW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJc2ZfZXN0aW0uaAotCi0JQ29udGVudDoJU2NhbGUgZmFjdG9yIGVzdGltYXRpb24gZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19TRl9FU1RJTV9IX18KLSNkZWZpbmUgX19TRl9FU1RJTV9IX18KLS8qCi0gICBTY2FsZSBmYWN0b3IgZXN0aW1hdGlvbgotICovCi0jaW5jbHVkZSAicHN5X2NvbnN0LmgiCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAicWNfZGF0YS5oIgotCi12b2lkCi1DYWxjRm9ybUZhY3RvcihXb3JkMTYgICAgICAgICAgbG9nU2ZiRm9ybUZhY3RvcltNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgc2ZiTlJlbGV2YW50TGluZXNbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgIGxvZ1NmYkVuZXJneVtNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAotICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgIG5DaGFubmVscyk7Ci0KLXZvaWQKLUVzdGltYXRlU2NhbGVGYWN0b3JzKFBTWV9PVVRfQ0hBTk5FTCBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCAgcWNPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgbG9nU2ZiRW5lcmd5W01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICBsb2dTZmJGb3JtRmFjdG9yW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICBzZmJOUmVsZXZhbnRMaW5lc1tNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgbkNoYW5uZWxzKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvc3ByZWFkaW5nLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9zcHJlYWRpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM5NmZjNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9zcHJlYWRpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJc3ByZWFkaW5nLmgKLQotCUNvbnRlbnQ6CVNwcmVhZGluZyBvZiBlbmVyZ3kgZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX1NQUkVBRElOR19ICi0jZGVmaW5lIF9TUFJFQURJTkdfSAotI2luY2x1ZGUgInR5cGVkZWZzLmgiCi0KLQotdm9pZCBTcHJlYWRpbmdNYXgoY29uc3QgV29yZDE2IHBiQ250LAotICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICptYXNrTG93RmFjdG9yLAotICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICptYXNrSGlnaEZhY3RvciwKLSAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqcGJTcHJlYWRlZEVuZXJneSk7Ci0KLSNlbmRpZiAvKiAjaWZuZGVmIF9TUFJFQURJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvc3RhdF9iaXRzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9zdGF0X2JpdHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkZGMxZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9zdGF0X2JpdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJc3RhdF9iaXRzLmgKLQotCUNvbnRlbnQ6CVN0YXRpYyBiaXQgY291bnRlciBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX1NUQVRfQklUU19ICi0jZGVmaW5lIF9fU1RBVF9CSVRTX0gKLQotI2luY2x1ZGUgInBzeV9jb25zdC5oIgotI2luY2x1ZGUgImludGVyZmFjZS5oIgotCi1Xb3JkMTYgY291bnRTdGF0aWNCaXRkZW1hbmQoUFNZX09VVF9DSEFOTkVMIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQgKnBzeU91dEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG5DaGFubmVscywKLQkJCQkJCQlXb3JkMTYgYWR0c1VzZWQpOwotCi0jZW5kaWYgLyogX19TVEFUX0JJVFNfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvdG5zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy90bnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBjZmFlZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy90bnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCXRucy5oCi0KLQlDb250ZW50OglUTlMgc3RydWN0dXJlcwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9UTlNfSAotI2RlZmluZSBfVE5TX0gKLQotI2luY2x1ZGUgInR5cGVkZWYuaCIKLSNpbmNsdWRlICJwc3lfY29uc3QuaCIKLQotCi0KLSNkZWZpbmUgVE5TX01BWF9PUkRFUiAxMgotI2RlZmluZSBUTlNfTUFYX09SREVSX1NIT1JUIDUKLQotI2RlZmluZSBGSUxURVJfRElSRUNUSU9OICAgIDAKLQotdHlwZWRlZiBzdHJ1Y3R7IC8qc3R1ZmYgdGhhdCBpcyB0YWJ1bGF0ZWQgZGVwZW5kZW50IG9uIGJpdHJhdGUgZXRjLiAqLwotICBXb3JkMTYgICAgIHRocmVzaE9uOyAgICAgICAgICAgICAgICAvKiBtaW4uIHByZWRpY3Rpb24gZ2FpbiBmb3IgdXNpbmcgdG5zIFRBQlVMICogMTAwKi8KLSAgV29yZDMyICAgICBscGNTdGFydEZyZXE7ICAgICAgICAgICAgLyogbG93ZXN0IGZyZXEgZm9yIGxwYyBUQUJVTCovCi0gIFdvcmQzMiAgICAgbHBjU3RvcEZyZXE7ICAgICAgICAgICAgIC8qIFRBQlVMICovCi0gIFdvcmQzMiAgICAgdG5zVGltZVJlc29sdXRpb247Ci19VE5TX0NPTkZJR19UQUJVTEFURUQ7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgeyAgIC8qYXNzaWduZWQgYXQgSW5pdFRpbWUqLwotICBXb3JkMTYgdG5zQWN0aXZlOwotICBXb3JkMTYgdG5zTWF4U2ZiOwotCi0gIFdvcmQxNiBtYXhPcmRlcjsgICAgICAgICAgICAgICAgLyogbWF4LiBvcmRlciBvZiB0bnMgZmlsdGVyICovCi0gIFdvcmQxNiB0bnNTdGFydEZyZXE7ICAgICAgICAgICAgLyogbG93ZXN0IGZyZXEuIGZvciB0bnMgZmlsdGVyaW5nICovCi0gIFdvcmQxNiBjb2VmUmVzOwotCi0gIFROU19DT05GSUdfVEFCVUxBVEVEIGNvbmZUYWI7Ci0KLSAgV29yZDMyIGFjZldpbmRvd1tUTlNfTUFYX09SREVSKzFdOwotCi0gIFdvcmQxNiB0bnNTdGFydEJhbmQ7Ci0gIFdvcmQxNiB0bnNTdGFydExpbmU7Ci0KLSAgV29yZDE2IHRuc1N0b3BCYW5kOwotICBXb3JkMTYgdG5zU3RvcExpbmU7Ci0KLSAgV29yZDE2IGxwY1N0YXJ0QmFuZDsKLSAgV29yZDE2IGxwY1N0YXJ0TGluZTsKLQotICBXb3JkMTYgbHBjU3RvcEJhbmQ7Ci0gIFdvcmQxNiBscGNTdG9wTGluZTsKLQotICBXb3JkMTYgdG5zUmF0aW9QYXRjaExvd2VzdENiOwotICBXb3JkMTYgdG5zTW9kaWZ5QmVnaW5DYjsKLQotICBXb3JkMTYgdGhyZXNob2xkOyAvKiBtaW4uIHByZWRpY3Rpb24gZ2FpbiBmb3IgdXNpbmcgdG5zIFRBQlVMICogMTAwICovCi0KLX1UTlNfQ09ORklHOwotCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgV29yZDE2IHRuc0FjdGl2ZTsKLSAgV29yZDMyIHBhcmNvcltUTlNfTUFYX09SREVSXTsKLSAgV29yZDE2IHByZWRpY3Rpb25HYWluOwotfSBUTlNfU1VCQkxPQ0tfSU5GTzsgLyogV29yZDE2IHNpemU6IDI2ICovCi0KLXR5cGVkZWYgc3RydWN0ewotICBUTlNfU1VCQkxPQ0tfSU5GTyBzdWJCbG9ja0luZm9bVFJBTlNfRkFDXTsKLX0gVE5TX0RBVEFfU0hPUlQ7Ci0KLXR5cGVkZWYgc3RydWN0ewotICBUTlNfU1VCQkxPQ0tfSU5GTyBzdWJCbG9ja0luZm87Ci19IFROU19EQVRBX0xPTkc7Ci0KLXR5cGVkZWYgc3RydWN0ewotICBUTlNfREFUQV9MT05HIHRuc0xvbmc7Ci0gIFROU19EQVRBX1NIT1JUIHRuc1Nob3J0OwotfVROU19EQVRBX1JBVzsKLQotdHlwZWRlZiBzdHJ1Y3R7Ci0gIFdvcmQxNiBudW1PZlN1YmJsb2NrczsKLSAgVE5TX0RBVEFfUkFXIGRhdGFSYXc7Ci19VE5TX0RBVEE7IC8qIFdvcmQxNiBzaXplOiAxICsgOCoyNiArIDI2ID0gMjM1ICovCi0KLXR5cGVkZWYgc3RydWN0ewotICBXb3JkMTYgdG5zQWN0aXZlW1RSQU5TX0ZBQ107Ci0gIFdvcmQxNiBjb2VmUmVzW1RSQU5TX0ZBQ107Ci0gIFdvcmQxNiBsZW5ndGhbVFJBTlNfRkFDXTsKLSAgV29yZDE2IG9yZGVyW1RSQU5TX0ZBQ107Ci0gIFdvcmQxNiBjb2VmW1RSQU5TX0ZBQypUTlNfTUFYX09SREVSX1NIT1JUXTsKLX1UTlNfSU5GTzsgLyogV29yZDE2IHNpemU6IDcyICovCi0KLSNlbmRpZiAvKiBfVE5TX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3Ruc19mdW5jLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy90bnNfZnVuYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmRmMjRkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3Ruc19mdW5jLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCXRuc19mdW5jLmgKLQotCUNvbnRlbnQ6CVROUyBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAgIFRlbXBvcmFsIG5vaXNlIHNoYXBpbmcKLSAqLwotI2lmbmRlZiBfVE5TX0ZVTkNfSAotI2RlZmluZSBfVE5TX0ZVTkNfSAotI2luY2x1ZGUgInR5cGVkZWYuaCIKLSNpbmNsdWRlICJwc3lfY29uZmlndXJhdGlvbi5oIgotCi1Xb3JkMTYgSW5pdFRuc0NvbmZpZ3VyYXRpb25Mb25nKFdvcmQzMiBiaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgc2FtcGxlcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTlNfQ09ORklHICp0bnNDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OX0xPTkcgKnBzeUNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGFjdGl2ZSk7Ci0KLVdvcmQxNiBJbml0VG5zQ29uZmlndXJhdGlvblNob3J0KFdvcmQzMiBiaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIHNhbXBsZXJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTlNfQ09ORklHICp0bnNDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTl9TSE9SVCAqcHN5Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGFjdGl2ZSk7Ci0KLVdvcmQzMiBUbnNEZXRlY3QoVE5TX0RBVEEqIHRuc0RhdGEsCi0gICAgICAgICAgICAgICAgIFROU19DT05GSUcgdEMsCi0gICAgICAgICAgICAgICAgIFdvcmQzMiogcFNjcmF0Y2hUbnMsCi0gICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBzZmJPZmZzZXRbXSwKLSAgICAgICAgICAgICAgICAgV29yZDMyKiBzcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgV29yZDE2IHN1YkJsb2NrTnVtYmVyLAotICAgICAgICAgICAgICAgICBXb3JkMTYgYmxvY2tUeXBlLAotICAgICAgICAgICAgICAgICBXb3JkMzIgKiBzZmJFbmVyZ3kpOwotCi12b2lkIFRuc1N5bmMoVE5TX0RBVEEgKnRuc0RhdGFEZXN0LAotICAgICAgICAgICAgIGNvbnN0IFROU19EQVRBICp0bnNEYXRhU3JjLAotICAgICAgICAgICAgIGNvbnN0IFROU19DT05GSUcgdEMsCi0gICAgICAgICAgICAgY29uc3QgV29yZDE2IHN1YkJsb2NrTnVtYmVyLAotICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBibG9ja1R5cGUpOwotCi1Xb3JkMTYgVG5zRW5jb2RlKFROU19JTkZPKiB0bnNJbmZvLAotICAgICAgICAgICAgICAgICBUTlNfREFUQSogdG5zRGF0YSwKLSAgICAgICAgICAgICAgICAgV29yZDE2IG51bU9mU2ZiLAotICAgICAgICAgICAgICAgICBUTlNfQ09ORklHIHRDLAotICAgICAgICAgICAgICAgICBXb3JkMTYgbG93UGFzc0xpbmUsCi0gICAgICAgICAgICAgICAgIFdvcmQzMiogc3BlY3RydW0sCi0gICAgICAgICAgICAgICAgIFdvcmQxNiBzdWJCbG9ja051bWJlciwKLSAgICAgICAgICAgICAgICAgV29yZDE2IGJsb2NrVHlwZSk7Ci0KLXZvaWQgQXBwbHlUbnNNdWx0VGFibGVUb1JhdGlvcyhXb3JkMTYgc3RhcnRDYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgc3RvcENiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROU19TVUJCTE9DS19JTkZPIHN1YkluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICp0aHJlc2hvbGRzKTsKLQotCi0jZW5kaWYgLyogX1ROU19GVU5DX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3Ruc19wYXJhbS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvdG5zX3BhcmFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYTMzYzMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvdG5zX3BhcmFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCXRuc19wYXJhbS5oCi0KLQlDb250ZW50OglUTlMgcGFyYW1ldGVycwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICAgVE5TIHBhcmFtZXRlcnMKLSAqLwotI2lmbmRlZiBfVE5TX1BBUkFNX0gKLSNkZWZpbmUgX1ROU19QQVJBTV9ICi0KLSNpbmNsdWRlICJ0bnMuaCIKLQotdHlwZWRlZiBzdHJ1Y3R7Ci0gIFdvcmQzMiBzYW1wbGluZ1JhdGU7Ci0gIFdvcmQxNiBtYXhCYW5kTG9uZzsKLSAgV29yZDE2IG1heEJhbmRTaG9ydDsKLX1UTlNfTUFYX1RBQl9FTlRSWTsKLQotdHlwZWRlZiBzdHJ1Y3R7Ci0gICAgV29yZDMyIGJpdFJhdGVGcm9tOwotICAgIFdvcmQzMiBiaXRSYXRlVG87Ci0gICAgY29uc3QgVE5TX0NPTkZJR19UQUJVTEFURUQgKnBhcmFtTW9ub19Mb25nOyAgLyogY29udGFpbnMgVE5TIHBhcmFtZXRlcnMgKi8KLSAgICBjb25zdCBUTlNfQ09ORklHX1RBQlVMQVRFRCAqcGFyYW1Nb25vX1Nob3J0OwotICAgIGNvbnN0IFROU19DT05GSUdfVEFCVUxBVEVEICpwYXJhbVN0ZXJlb19Mb25nOwotICAgIGNvbnN0IFROU19DT05GSUdfVEFCVUxBVEVEICpwYXJhbVN0ZXJlb19TaG9ydDsKLX1UTlNfSU5GT19UQUI7Ci0KLQotdm9pZCBHZXRUbnNQYXJhbShUTlNfQ09ORklHX1RBQlVMQVRFRCAqdG5zQ29uZmlnVGFiLAotICAgICAgICAgICAgICAgICBXb3JkMzIgYml0UmF0ZSwgV29yZDE2IGNoYW5uZWxzLCBXb3JkMTYgYmxvY2tUeXBlKTsKLQotdm9pZCBHZXRUbnNNYXhCYW5kcyhXb3JkMzIgc2FtcGxpbmdSYXRlLCBXb3JkMTYgYmxvY2tUeXBlLCBXb3JkMTYqIHRuc01heFNmYik7Ci0KLSNlbmRpZiAvKiBfVE5TX1BBUkFNX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3RyYW5zZm9ybS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvdHJhbnNmb3JtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMWNlZjUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvdHJhbnNmb3JtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCXRyYW5zZm9ybS5oCi0KLQlDb250ZW50OglNRENUIFRyYW5zZm9ybSBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiAgX19UUkFOU0ZPUk1fSF9fCi0jZGVmaW5lIF9fVFJBTlNGT1JNX0hfXwotCi0jaW5jbHVkZSAidHlwZWRlZi5oIgotCi12b2lkIFRyYW5zZm9ybV9SZWFsKFdvcmQxNiAqbWRjdERlbGF5QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnRpbWVTaWduYWwsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjaEluY3JlbWVudCwgICAgIC8qISBjaGFubmVsIGluY3JlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKnJlYWxPdXQsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbWRjdFNjYWxlLAotICAgICAgICAgICAgICAgICAgICBXb3JkMTYgd2luZG93U2VxdWVuY2UKLSAgICAgICAgICAgICAgICAgICAgKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNfcm9tLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNfcm9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOGYzYTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWFjX3JvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM2MyArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCWFhY19yb20uYwotCi0JQ29udGVudDoJY29uc3RhbnQgdGFibGVzCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJhYWNfcm9tLmgiCi0KLSNpZiBkZWZpbmVkIChBUk1WNUUpICYmICFkZWZpbmVkIChBUk1WN05lb24pCi0KLS8qCi0gKiAgUTMwIGZvciAxMjggYW5kIDEwMjQKLSAqCi0gKiBmb3IgKGkgPSAwOyBpIDwgbnVtLzQ7IGkrKykgewotICogICBhbmdsZSA9IChpICsgMC4xMjUpICogTV9QSSAvIG51bTsKLSAqICAgeCA9IGNvcyhhbmdsZSkgKiAoMSA8PCAzMCk7Ci0gKiAgIHggPSBzaW4oYW5nbGUpICogKDEgPDwgMzApOwotICoKLSAqICAgYW5nbGUgPSAobnVtLzIgLSAxIC0gaSArIDAuMTI1KSAqIE1fUEkgLyBudW07Ci0gKiAgIHggPSBjb3MoYW5nbGUpICogKDEgPDwgMzApOwotICogICB4ID0gc2luKGFuZ2xlKSAqICgxIDw8IDMwKTsKLSAqIH0KLSAqLwotY29uc3QgaW50IGNvc3NpbnRhYlsxMjggKyAxMDI0XSA9IHsKLQkvKiAxMjggKi8KLQkweDNmZmZlYzQzLCAweDAwMzI0M2YxLCAweDAxNWZkNGQyLCAweDNmZmMzOGQxLCAweDNmZjljMTNhLCAweDAxYzQ1NGY1LCAweDAyZjFiNzU1LCAweDNmZWVhNzc2LAotCTB4M2ZlOWI4YTksIDB4MDM1NjIwMzgsIDB4MDQ4MzI1OWQsIDB4M2ZkNzNhNGEsIDB4M2ZjZmQ1MGIsIDB4MDRlNzY3YzUsIDB4MDYxM2UxYzUsIDB4M2ZiNWY0ZWEsCi0JMHgzZmFjMWE1YiwgMHgwNjc3ZWRiYiwgMHgwN2EzYWRmZiwgMHgzZjhhZGM3NywgMHgzZjdlOGUxZSwgMHgwODA3NzQ1NywgMHgwOTMyNGNhNywgMHgzZjU1Zjc5NiwKLQkweDNmNDczNzU5LCAweDA5OTViZGZkLCAweDBhYmY4MDQzLCAweDNmMTc0ZTcwLCAweDNmMDYxZTk1LCAweDBiMjI4ZDQyLCAweDBjNGIwYjk0LCAweDNlY2VlYWFkLAotCTB4M2ViYjRkZGIsIDB4MGNhZGE0ZjUsIDB4MGRkNGIxOWEsIDB4M2U3Y2Q3NzgsIDB4M2U2NmQwYjQsIDB4MGUzNmM4MmEsIDB4MGY1YzM1YTMsIDB4M2UyMTIxNzksCi0JMHgzZTA4YjQyYSwgMHgwZmJkYmE0MCwgMHgxMGUxNWI0ZSwgMHgzZGJiZDZkNCwgMHgzZGExMDZiZCwgMHgxMTQyM2VmMCwgMHgxMjYzZTY5OSwgMHgzZDRkMDcyOCwKLQkweDNkMmZkODZjLCAweDEyYzQxYTRmLCAweDEzZTM5YmU5LCAweDNjZDRjMzhiLCAweDNjYjUzYWFhLCAweDE0NDMxMGRkLCAweDE1NjA0MDEzLCAweDNjNTMxZTg4LAotCTB4M2MzMTQwNjAsIDB4MTViZWU3OGMsIDB4MTZkOTk4NjQsIDB4M2JjODJjMWYsIDB4M2JhM2ZkZTcsIDB4MTczNzYzYzksIDB4MTg0ZjZhYWIsIDB4M2IzNDAxYmIsCi0JMHgzYjBkODkwOSwgMHgxOGFjNGI4NywgMHgxOWMxN2Q0NCwgMHgzYTk2YjYzNiwgMHgzYTZkZjhmOCwgMHgxYTFkNjU0NCwgMHgxYjJmOTcxZSwgMHgzOWYwNjFkMiwKLQkweDM5YzU2NjRmLCAweDFiOGE3ODE1LCAweDFjOTk3ZmM0LCAweDM5NDExZTMzLCAweDM5MTNlYjBlLCAweDFjZjM0YmFmLCAweDFkZmVmZjY3LCAweDM4ODkwNjYzLAotCTB4Mzg1OWEyOTIsIDB4MWU1N2E4NmQsIDB4MWY1ZmRlZTYsIDB4MzdjODM2YzIsIDB4Mzc5NmE5OTYsIDB4MWZiNzU3NWMsIDB4MjBiYmU3ZDgsIDB4MzZmZWNkMGUsCi0JMHgzNmNiMWUyYSwgMHgyMTEyMjI0MCwgMHgyMjEyZTQ5MiwgMHgzNjJjZTg1NSwgMHgzNWY3MWZiMSwgMHgyMjY3ZDNhMCwgMHgyMzY0YTAyZSwgMHgzNTUyYThmNCwKLQkweDM1MWFjZWRkLCAweDIzYjgzNmNhLCAweDI0YjBlNjk5LCAweDM0NzAzMDk1LCAweDM0MzY0ZGE2LCAweDI1MDMxN2RmLCAweDI1Zjc4NDk3LCAweDMzODVhMjIyLAotCTB4MzM0OWJmNDgsIDB4MjY0ODQzZDksIDB4MjczODQ3YzgsIDB4MzI5MzIxYzcsIDB4MzI1NTQ4NDAsIDB4Mjc4Nzg4OTMsIDB4Mjg3MmZlYjYsIDB4MzE5OGQ0ZWEsCi0JMHgzMTU5MGUzZSwgMHgyOGMwYjRkMiwgMHgyOWE3NzhkYiwgMHgzMDk2ZTIyMywgMHgzMDU1MzgyOCwgMHgyOWYzOTg0YywgMHgyYWQ1ODZhMywgMHgyZjhkNzEzYSwKLQkweDJmNDllZTBmLCAweDJiMjAwM2FjLCAweDJiZmNmOTdjLCAweDJlN2NhYjFjLCAweDJlMzc1OTJjLCAweDJjNDVjOGEwLCAweDJkMWRhM2Q1LCAweDJkNjRiOWRhLAotCS8qIDEwMjQgKi8KLQkweDNmZmZmZmIxLCAweDAwMDY0ODdmLCAweDAwMmJmYjc0LCAweDNmZmZmMGUzLCAweDNmZmZlNzA1LCAweDAwMzg4YzZlLCAweDAwNWUzZjRjLCAweDNmZmZiYTliLAotCTB4M2ZmZmE2ZGUsIDB4MDA2YWQwM2IsIDB4MDA5MDgyZWEsIDB4M2ZmZjVjZDgsIDB4M2ZmZjNmM2MsIDB4MDA5ZDEzYzUsIDB4MDBjMmM2MmYsIDB4M2ZmZWQ3OWIsCi0JMHgzZmZlYjAyMSwgMHgwMGNmNTZlZiwgMHgwMGY1MDhmYywgMHgzZmZlMmFlNSwgMHgzZmZkZjk4YywgMHgwMTAxOTk5OCwgMHgwMTI3NGIzMSwgMHgzZmZkNTZiNSwKLQkweDNmZmQxYjdlLCAweDAxMzNkYmEzLCAweDAxNTk4Y2IxLCAweDNmZmM1YjBjLCAweDNmZmMxNWY3LCAweDAxNjYxY2YwLCAweDAxOGJjZDViLCAweDNmZmIzN2VjLAotCTB4M2ZmYWU4ZjksIDB4MDE5ODVkNjAsIDB4MDFiZTBkMTEsIDB4M2ZmOWVkNTMsIDB4M2ZmOTk0ODMsIDB4MDFjYTljZDQsIDB4MDFmMDRiYjQsIDB4M2ZmODdiNDQsCi0JMHgzZmY4MTg5NiwgMHgwMWZjZGIyZSwgMHgwMjIyODkyNCwgMHgzZmY2ZTFiZiwgMHgzZmY2NzUzNCwgMHgwMjJmMTg0ZCwgMHgwMjU0YzU0NCwgMHgzZmY1MjBjNSwKLQkweDNmZjRhYTVkLCAweDAyNjE1NDE0LCAweDAyODZmZmYzLCAweDNmZjMzODU4LCAweDNmZjJiODEzLCAweDAyOTM4ZTYyLCAweDAyYjkzOTE0LCAweDNmZjEyODc4LAotCTB4M2ZmMDllNTYsIDB4MDJjNWM3MWEsIDB4MDJlYjcwODYsIDB4M2ZlZWYxMjYsIDB4M2ZlZTVkMjgsIDB4MDJmN2ZlMWMsIDB4MDMxZGE2MmIsIDB4M2ZlYzkyNjUsCi0JMHgzZmViZjQ4YiwgMHgwMzJhMzM0OSwgMHgwMzRmZDllNSwgMHgzZmVhMGMzNSwgMHgzZmU5NjQ4MCwgMHgwMzVjNjY4MiwgMHgwMzgyMGI5MywgMHgzZmU3NWU5OCwKLQkweDNmZTZhZDA4LCAweDAzOGU5N2E5LCAweDAzYjQzYjE3LCAweDNmZTQ4OTkwLCAweDNmZTNjZTI2LCAweDAzYzBjNjllLCAweDAzZTY2ODUyLCAweDNmZTE4ZDFmLAotCTB4M2ZlMGM3ZGEsIDB4MDNmMmYzNDIsIDB4MDQxODkzMjYsIDB4M2ZkZTY5NDUsIDB4M2ZkZDlhMjcsIDB4MDQyNTFkNzcsIDB4MDQ0YWJiNzMsIDB4M2ZkYjFlMDYsCi0JMHgzZmRhNDUwZiwgMHgwNDU3NDUxZCwgMHgwNDdjZTExYSwgMHgzZmQ3YWI2NCwgMHgzZmQ2Yzg5NCwgMHgwNDg5NmExNiwgMHgwNGFmMDNmYywgMHgzZmQ0MTE1ZiwKLQkweDNmZDMyNGI3LCAweDA0YmI4YzQyLCAweDA0ZTEyM2ZhLCAweDNmZDA0ZmZjLCAweDNmY2Y1OTdjLCAweDA0ZWRhYjgzLCAweDA1MTM0MGY2LCAweDNmY2M2NzNiLAotCTB4M2ZjYjY2ZTQsIDB4MDUxZmM3YjksIDB4MDU0NTVhZDEsIDB4M2ZjODU3MWYsIDB4M2ZjNzRjZjMsIDB4MDU1MWUwYzcsIDB4MDU3NzcxNmIsIDB4M2ZjNDFmYWMsCi0JMHgzZmMzMGJhYSwgMHgwNTgzZjY4YywgMHgwNWE5ODRhNiwgMHgzZmJmYzBlMywgMHgzZmJlYTMwYywgMHgwNWI2MDhlYiwgMHgwNWRiOTQ2MywgMHgzZmJiM2FjNywKLQkweDNmYmExMzFiLCAweDA1ZTgxN2MzLCAweDA2MGRhMDgzLCAweDNmYjY4ZDViLCAweDNmYjU1YmRjLCAweDA2MWEyMmY3LCAweDA2M2ZhOGU3LCAweDNmYjFiOGEyLAotCTB4M2ZiMDdkNTAsIDB4MDY0YzJhNjcsIDB4MDY3MWFkNzEsIDB4M2ZhY2JjOWYsIDB4M2ZhYjc3N2IsIDB4MDY3ZTJkZjUsIDB4MDZhM2FlMDAsIDB4M2ZhNzk5NTQsCi0JMHgzZmE2NGE1ZiwgMHgwNmIwMmQ4MSwgMHgwNmQ1YWE3NywgMHgzZmEyNGVjNiwgMHgzZmEwZjYwMCwgMHgwNmUyMjhlZSwgMHgwNzA3YTJiNywgMHgzZjljZGNmNywKLQkweDNmOWI3YTYyLCAweDA3MTQyMDFiLCAweDA3Mzk5NmExLCAweDNmOTc0M2ViLCAweDNmOTVkNzg3LCAweDA3NDYxMmViLCAweDA3NmI4NjE2LCAweDNmOTE4M2E1LAotCTB4M2Y5MDBkNzIsIDB4MDc3ODAxM2QsIDB4MDc5ZDcwZjcsIDB4M2Y4YjljMjgsIDB4M2Y4YTFjMjksIDB4MDdhOWVhZjUsIDB4MDdjZjU3MjYsIDB4M2Y4NThkNzksCi0JMHgzZjg0MDNhZSwgMHgwN2RiY2ZmMiwgMHgwODAxMzg4MywgMHgzZjdmNTc5YiwgMHgzZjdkYzQwNSwgMHgwODBkYjAxNiwgMHgwODMzMTRmMSwgMHgzZjc4ZmE5MiwKLQkweDNmNzc1ZDMxLCAweDA4M2Y4YjQzLCAweDA4NjRlYzRmLCAweDNmNzI3NjYxLCAweDNmNzBjZjM4LCAweDA4NzE2MTU5LCAweDA4OTZiZTgwLCAweDNmNmJjYjBlLAotCTB4M2Y2YTFhMWMsIDB4MDhhMzMyM2EsIDB4MDhjODhiNjUsIDB4M2Y2NGY4OWIsIDB4M2Y2MzNkZTIsIDB4MDhkNGZkYzYsIDB4MDhmYTUyZGUsIDB4M2Y1ZGZmMGUsCi0JMHgzZjVjM2E4ZiwgMHgwOTA2YzNlMCwgMHgwOTJjMTRjZSwgMHgzZjU2ZGU2YSwgMHgzZjU1MTAyNiwgMHgwOTM4ODQ2OSwgMHgwOTVkZDExNiwgMHgzZjRmOTZiNCwKLQkweDNmNGRiZWFjLCAweDA5NmEzZjQyLCAweDA5OGY4Nzk2LCAweDNmNDgyN2YwLCAweDNmNDY0NjI2LCAweDA5OWJmNDRjLCAweDA5YzEzODMxLCAweDNmNDA5MjIzLAotCTB4M2YzZWE2OTcsIDB4MDljZGEzNjgsIDB4MDlmMmUyYzcsIDB4M2YzOGQ1NTIsIDB4M2YzNmUwMDYsIDB4MDlmZjRjNzgsIDB4MGEyNDg3M2EsIDB4M2YzMGYxODEsCi0JMHgzZjJlZjI3NiwgMHgwYTMwZWY1ZSwgMHgwYTU2MjU2YywgMHgzZjI4ZTZiNiwgMHgzZjI2ZGRlYywgMHgwYTYyOGJmYSwgMHgwYTg3YmQzZCwgMHgzZjIwYjRmNSwKLQkweDNmMWVhMjZlLCAweDBhOTQyMjJmLCAweDBhYjk0ZThmLCAweDNmMTg1YzQzLCAweDNmMTY0MDAxLCAweDBhYzViMWRjLCAweDBhZWFkOTQ0LCAweDNmMGZkY2E1LAotCTB4M2YwZGI2YTksIDB4MGFmNzNhZTUsIDB4MGIxYzVkM2QsIDB4M2YwNzM2MjEsIDB4M2YwNTA2NmQsIDB4MGIyOGJkMmEsIDB4MGI0ZGRhNWMsIDB4M2VmZTY4YmMsCi0JMHgzZWZjMmY1MCwgMHgwYjVhMzg4ZCwgMHgwYjdmNTA4MSwgMHgzZWY1NzQ3YiwgMHgzZWYzMzE1YSwgMHgwYjhiYWNmMCwgMHgwYmIwYmY4ZiwgMHgzZWVjNTk2NSwKLQkweDNlZWEwYzhlLCAweDBiYmQxYTMzLCAweDBiZTIyNzY2LCAweDNlZTMxNzdlLCAweDNlZTBjMGY0LCAweDBiZWU4MDM4LCAweDBjMTM4N2U5LCAweDNlZDlhZWNjLAotCTB4M2VkNzRlOTEsIDB4MGMxZmRlZTEsIDB4MGM0NGUwZjksIDB4M2VkMDFmNTUsIDB4M2VjZGI1NmEsIDB4MGM1MTM2MTAsIDB4MGM3NjMyNzgsIDB4M2VjNjY5MjAsCi0JMHgzZWMzZjU4NSwgMHgwYzgyODVhNSwgMHgwY2E3N2M0NywgMHgzZWJjOGMzMSwgMHgzZWJhMGVlOSwgMHgwY2IzY2Q4NCwgMHgwY2Q4YmU0NywgMHgzZWIyODg4ZiwKLQkweDNlYjAwMTljLCAweDBjZTUwZDhjLCAweDBkMDlmODViLCAweDNlYTg1ZTQxLCAweDNlYTVjZGEzLCAweDBkMTY0NWEwLCAweDBkM2IyYTY0LCAweDNlOWUwZDRjLAotCTB4M2U5YjczMDYsIDB4MGQ0Nzc1YTEsIDB4MGQ2YzU0NDMsIDB4M2U5Mzk1YjcsIDB4M2U5MGYxY2EsIDB4MGQ3ODlkNzEsIDB4MGQ5ZDc1ZGIsIDB4M2U4OGY3ODgsCi0JMHgzZTg2NDlmNSwgMHgwZGE5YmNmMiwgMHgwZGNlOGYwZCwgMHgzZTdlMzJjNiwgMHgzZTdiN2I5MCwgMHgwZGRhZDQwNiwgMHgwZGZmOWZiYSwgMHgzZTczNDc3OCwKLQkweDNlNzA4NjlmLCAweDBlMGJlMjhlLCAweDBlMzBhN2M1LCAweDNlNjgzNWE0LCAweDNlNjU2YjJiLCAweDBlM2NlODZiLCAweDBlNjFhNzBmLCAweDNlNWNmZDUxLAotCTB4M2U1YTI5MzksIDB4MGU2ZGU1ODAsIDB4MGU5MjlkN2EsIDB4M2U1MTllODYsIDB4M2U0ZWMwZDEsIDB4MGU5ZWQ5YWYsIDB4MGVjMzhhZTgsIDB4M2U0NjE5NGEsCi0JMHgzZTQzMzFmYSwgMHgwZWNmYzRkOSwgMHgwZWY0NmYzYiwgMHgzZTNhNmRhNCwgMHgzZTM3N2NiYiwgMHgwZjAwYTZkZiwgMHgwZjI1NGE1MywgMHgzZTJlOWI5YywKLQkweDNlMmJhMTFiLCAweDBmMzE3ZmE1LCAweDBmNTYxYzE1LCAweDNlMjJhMzM4LCAweDNlMWY5ZjIxLCAweDBmNjI0ZjBjLCAweDBmODZlNDYwLCAweDNlMTY4NDgwLAotCTB4M2UxMzc2ZDUsIDB4MGY5MzE0ZjUsIDB4MGZiN2EzMTcsIDB4M2UwYTNmN2IsIDB4M2UwNzI4M2YsIDB4MGZjM2QxNDMsIDB4MGZlODU4MWQsIDB4M2RmZGQ0MzIsCi0JMHgzZGZhYjM2NSwgMHgwZmY0ODNkNywgMHgxMDE5MDM1MiwgMHgzZGYxNDJhYiwgMHgzZGVlMTg1MSwgMHgxMDI1MmM5NCwgMHgxMDQ5YTQ5YSwgMHgzZGU0OGFlZiwKLQkweDNkZTE1NzA4LCAweDEwNTVjYjViLCAweDEwN2EzYmQ1LCAweDNkZDdhZDA1LCAweDNkZDQ2Zjk0LCAweDEwODY2MDBlLCAweDEwYWFjOGU2LCAweDNkY2FhOGY1LAotCTB4M2RjNzYxZmMsIDB4MTBiNmVhOTAsIDB4MTBkYjRiYWYsIDB4M2RiZDdlYzcsIDB4M2RiYTJlNDgsIDB4MTBlNzZhYzMsIDB4MTEwYmM0MTMsIDB4M2RiMDJlODQsCi0JMHgzZGFjZDQ4MSwgMHgxMTE3ZTA4OCwgMHgxMTNjMzFmMywgMHgzZGEyYjgzNCwgMHgzZDlmNTRhZiwgMHgxMTQ4NGJjMiwgMHgxMTZjOTUzMSwgMHgzZDk1MWJkZSwKLQkweDNkOTFhZWQ5LCAweDExNzhhYzUzLCAweDExOWNlZGFmLCAweDNkODc1OThjLCAweDNkODNlMzA5LCAweDExYTkwMjFkLCAweDExY2QzYjUwLCAweDNkNzk3MTQ1LAotCTB4M2Q3NWYxNDcsIDB4MTFkOTRkMDIsIDB4MTFmZDdkZjYsIDB4M2Q2YjYzMTMsIDB4M2Q2N2Q5OWIsIDB4MTIwOThjZTUsIDB4MTIyZGI1ODMsIDB4M2Q1ZDJlZmUsCi0JMHgzZDU5OWMwZSwgMHgxMjM5YzFhNywgMHgxMjVkZTFkYSwgMHgzZDRlZDUwZiwgMHgzZDRiMzhhYSwgMHgxMjY5ZWIyYiwgMHgxMjhlMDJkYywgMHgzZDQwNTU0ZSwKLQkweDNkM2NhZjc2LCAweDEyOWEwOTU0LCAweDEyYmUxODZjLCAweDNkMzFhZmM1LCAweDNkMmUwMDdjLCAweDEyY2ExYzAzLCAweDEyZWUyMjZjLCAweDNkMjJlNDdjLAotCTB4M2QxZjJiYzUsIDB4MTJmYTIzMWIsIDB4MTMxZTIwYzAsIDB4M2QxM2YzN2UsIDB4M2QxMDMxNWEsIDB4MTMyYTFlN2UsIDB4MTM0ZTEzNDgsIDB4M2QwNGRjZDIsCi0JMHgzZDAxMTE0NSwgMHgxMzVhMGUwZSwgMHgxMzdkZjllNywgMHgzY2Y1YTA4MiwgMHgzY2YxY2I4ZSwgMHgxMzg5ZjFhZiwgMHgxM2FkZDQ4MSwgMHgzY2U2M2U5OCwKLQkweDNjZTI2MDNmLCAweDEzYjljOTQzLCAweDEzZGRhMmY3LCAweDNjZDZiNzFlLCAweDNjZDJjZjYyLCAweDEzZTk5NGFiLCAweDE0MGQ2NTJjLCAweDNjYzcwYTFjLAotCTB4M2NjMzE4ZmYsIDB4MTQxOTUzY2IsIDB4MTQzZDFiMDIsIDB4M2NiNzM3OWMsIDB4M2NiMzNkMjIsIDB4MTQ0OTA2ODUsIDB4MTQ2Y2M0NWMsIDB4M2NhNzNmYTksCi0JMHgzY2EzM2JkMywgMHgxNDc4YWNiYywgMHgxNDljNjExZCwgMHgzYzk3MjI0YywgMHgzYzkzMTUxZCwgMHgxNGE4NDY1MiwgMHgxNGNiZjEyNywgMHgzYzg2ZGY4ZSwKLQkweDNjODJjOTA5LCAweDE0ZDdkMzJhLCAweDE0ZmI3NDVlLCAweDNjNzY3NzdiLCAweDNjNzI1N2EyLCAweDE1MDc1MzI3LCAweDE1MmFlYWEzLCAweDNjNjVlYTFjLAotCTB4M2M2MWMwZjEsIDB4MTUzNmM2MmIsIDB4MTU1YTUzZDksIDB4M2M1NTM3N2IsIDB4M2M1MTA1MDEsIDB4MTU2NjJjMTgsIDB4MTU4OWFmZTMsIDB4M2M0NDVmYTIsCi0JMHgzYzQwMjNkZCwgMHgxNTk1ODRkMywgMHgxNWI4ZmVhNCwgMHgzYzMzNjI5ZCwgMHgzYzJmMWQ4ZSwgMHgxNWM0ZDAzZSwgMHgxNWU4M2ZmZiwgMHgzYzIyNDA3NSwKLQkweDNjMWRmMjFmLCAweDE1ZjQwZTNhLCAweDE2MTc3M2Q2LCAweDNjMTBmOTM1LCAweDNjMGNhMTliLCAweDE2MjMzZWFjLCAweDE2NDY5YTBkLCAweDNiZmY4Y2U4LAotCTB4M2JmYjJjMGMsIDB4MTY1MjYxNzYsIDB4MTY3NWIyODYsIDB4M2JlZGZiOTksIDB4M2JlOTkxN2UsIDB4MTY4MTc2N2MsIDB4MTZhNGJkMjUsIDB4M2JkYzQ1NTIsCi0JMHgzYmQ3ZDFmYSwgMHgxNmIwN2Q5ZiwgMHgxNmQzYjljYywgMHgzYmNhNmExZCwgMHgzYmM1ZWQ4ZCwgMHgxNmRmNzZjMywgMHgxNzAyYTg1ZSwgMHgzYmI4NmEwOCwKLQkweDNiYjNlNDQwLCAweDE3MGU2MWNjLCAweDE3MzE4OGJlLCAweDNiYTY0NTFiLCAweDNiYTFiNjIwLCAweDE3M2QzZTliLCAweDE3NjA1YWQwLCAweDNiOTNmYjYzLAotCTB4M2I4ZjYzMzcsIDB4MTc2YzBkMTUsIDB4MTc4ZjFlNzYsIDB4M2I4MThjZWIsIDB4M2I3Y2ViOTAsIDB4MTc5YWNkMWMsIDB4MTdiZGQzOTQsIDB4M2I2ZWY5YmUsCi0JMHgzYjZhNGYzOCwgMHgxN2M5N2U5MywgMHgxN2VjN2EwZCwgMHgzYjVjNDFlOCwgMHgzYjU3OGUzOSwgMHgxN2Y4MjE1ZSwgMHgxODFiMTFjNCwgMHgzYjQ5NjU3NCwKLQkweDNiNDRhOGEwLCAweDE4MjZiNTYxLCAweDE4NDk5YTlkLCAweDNiMzY2NDZlLCAweDNiMzE5ZTc3LCAweDE4NTUzYTdkLCAweDE4NzgxNDdhLCAweDNiMjMzZWUxLAotCTB4M2IxZTZmY2EsIDB4MTg4M2IwOTcsIDB4MThhNjdmM2YsIDB4M2IwZmY0ZDksIDB4M2IwYjFjYTYsIDB4MThiMjE3OTEsIDB4MThkNGRhZDAsIDB4M2FmYzg2NjMsCi0JMHgzYWY3YTUxNiwgMHgxOGUwNmY1MCwgMHgxOTAzMjcwZiwgMHgzYWU4ZjM4YiwgMHgzYWU0MDkyNiwgMHgxOTBlYjdiNywgMHgxOTMxNjNlMSwgMHgzYWQ1M2M1YiwKLQkweDNhZDA0OGUzLCAweDE5M2NmMGE5LCAweDE5NWY5MTI4LCAweDNhYzE2MGUxLCAweDNhYmM2NDU4LCAweDE5NmIxYTA5LCAweDE5OGRhZWM4LCAweDNhYWQ2MTI5LAotCTB4M2FhODViOTIsIDB4MTk5OTMzYmIsIDB4MTliYmJjYTYsIDB4M2E5OTNkM2UsIDB4M2E5NDJlOWQsIDB4MTljNzNkYTMsIDB4MTllOWJhYTMsIDB4M2E4NGY1MmYsCi0JMHgzYTdmZGQ4NiwgMHgxOWY1MzdhNCwgMHgxYTE3YThhNSwgMHgzYTcwODkwNiwgMHgzYTZiNjg1OSwgMHgxYTIzMjFhMiwgMHgxYTQ1ODY4ZSwgMHgzYTViZjhkMSwKLQkweDNhNTZjZjIzLCAweDFhNTBmYjgxLCAweDFhNzM1NDQyLCAweDNhNDc0NDljLCAweDNhNDIxMWYwLCAweDFhN2VjNTI0LCAweDFhYTExMWE2LCAweDNhMzI2Yzc0LAotCTB4M2EyZDMwY2QsIDB4MWFhYzdlNmYsIDB4MWFjZWJlOWQsIDB4M2ExZDcwNjYsIDB4M2ExODJiYzgsIDB4MWFkYTI3NDYsIDB4MWFmYzViMGEsIDB4M2EwODUwN2YsCi0JMHgzYTAzMDJlZCwgMHgxYjA3YmY4YywgMHgxYjI5ZTZkMiwgMHgzOWYzMGNjYywgMHgzOWVkYjY0OSwgMHgxYjM1NDcyNywgMHgxYjU3NjFkOCwgMHgzOWRkYTU1YSwKLQkweDM5ZDg0NWU5LCAweDFiNjJiZGY4LCAweDFiODRjYzAxLCAweDM5YzgxYTM2LCAweDM5YzJiMWRhLCAweDFiOTAyM2U1LCAweDFiYjIyNTMwLCAweDM5YjI2YjZkLAotCTB4MzlhY2ZhMmIsIDB4MWJiZDc4ZDIsIDB4MWJkZjZkNGEsIDB4Mzk5Yzk5MGQsIDB4Mzk5NzFlZTcsIDB4MWJlYWJjYTEsIDB4MWMwY2E0MzIsIDB4Mzk4NmEzMjQsCi0JMHgzOTgxMjAxZSwgMHgxYzE3ZWYzOSwgMHgxYzM5YzljZCwgMHgzOTcwODliZiwgMHgzOTZhZmRkYywgMHgxYzQ1MTA3YywgMHgxYzY2ZGRmZSwgMHgzOTVhNGNlYiwKLQkweDM5NTRiODJlLCAweDFjNzIyMDRmLCAweDFjOTNlMGFiLCAweDM5NDNlY2I2LCAweDM5M2U0ZjIzLCAweDFjOWYxZTk2LCAweDFjYzBkMWI2LCAweDM5MmQ2OTJmLAotCTB4MzkyN2MyYzksIDB4MWNjYzBiMzUsIDB4MWNlZGIxMDYsIDB4MzkxNmMyNjIsIDB4MzkxMTEzMmQsIDB4MWNmOGU2MTEsIDB4MWQxYTdlN2QsIDB4MzhmZmY4NWUsCi0JMHgzOGZhNDA1ZSwgMHgxZDI1YWYwZCwgMHgxZDQ3M2EwMCwgMHgzOGU5MGIzMSwgMHgzOGUzNGE2OSwgMHgxZDUyNjYwZiwgMHgxZDczZTM3NCwgMHgzOGQxZmFlOSwKLQkweDM4Y2MzMTVkLCAweDFkN2YwYWZiLCAweDFkYTA3YWJjLCAweDM4YmFjNzk1LCAweDM4YjRmNTQ3LCAweDFkYWI5ZGI1LCAweDFkY2NmZmJmLCAweDM4YTM3MTQyLAotCTB4Mzg5ZDk2MzcsIDB4MWRkODFlMjEsIDB4MWRmOTcyNWYsIDB4Mzg4YmY3ZmYsIDB4Mzg4NjE0M2IsIDB4MWUwNDhjMjQsIDB4MWUyNWQyODIsIDB4Mzg3NDViZGIsCi0JMHgzODZlNmY2MCwgMHgxZTMwZTdhNCwgMHgxZTUyMjAwYywgMHgzODVjOWNlMywgMHgzODU2YTdiNiwgMHgxZTVkMzA4NCwgMHgxZTdlNWFlMiwgMHgzODQ0YmIyOCwKLQkweDM4M2ViZDRjLCAweDFlODk2NmE4LCAweDFlYWE4MmU5LCAweDM4MmNiNmI3LCAweDM4MjZiMDMwLCAweDFlYjU4OWY3LCAweDFlZDY5ODA1LCAweDM4MTQ4ZjlmLAotCTB4MzgwZTgwNzEsIDB4MWVlMTlhNTQsIDB4MWYwMjlhMWMsIDB4MzdmYzQ1ZWYsIDB4MzdmNjJlMWQsIDB4MWYwZDk3YTUsIDB4MWYyZTg5MTEsIDB4MzdlM2Q5YjcsCi0JMHgzN2RkYjk0NSwgMHgxZjM5ODFjZSwgMHgxZjVhNjRjYiwgMHgzN2NiNGIwNCwgMHgzN2M1MjFmNiwgMHgxZjY1NThiNSwgMHgxZjg2MmQyZCwgMHgzN2IyOTllNywKLQkweDM3YWM2ODQxLCAweDFmOTExYzNkLCAweDFmYjFlMjFkLCAweDM3OTljNjZmLCAweDM3OTM4YzM0LCAweDFmYmNjYzRkLCAweDFmZGQ4MzgxLCAweDM3ODBkMGFhLAotCTB4Mzc3YThkZGYsIDB4MWZlODY4YzgsIDB4MjAwOTExM2MsIDB4Mzc2N2I4YTksIDB4Mzc2MTZkNTEsIDB4MjAxM2YxOTYsIDB4MjAzNDhiMzUsIDB4Mzc0ZTdlN2IsCi0JMHgzNzQ4MmE5YSwgMHgyMDNmNjY5OSwgMHgyMDVmZjE0ZiwgMHgzNzM1MjIyZiwgMHgzNzJlYzVjOSwgMHgyMDZhYzdiOCwgMHgyMDhiNDM3MiwgMHgzNzFiYTNkNCwKLQkweDM3MTUzZWVlLCAweDIwOTYxNGQ5LCAweDIwYjY4MTgxLCAweDM3MDIwMzdjLCAweDM2ZmI5NjE4LCAweDIwYzE0ZGRmLCAweDIwZTFhYjYzLCAweDM2ZTg0MTM1LAotCTB4MzZlMWNiNTgsIDB4MjBlYzcyYjEsIDB4MjEwY2MwZmMsIDB4MzZjZTVkMTAsIDB4MzZjN2RlYmQsIDB4MjExNzgzMzQsIDB4MjEzN2MyMzIsIDB4MzZiNDU3MWIsCi0JMHgzNmFkZDA1OCwgMHgyMTQyN2Y0ZCwgMHgyMTYyYWVlYSwgMHgzNjlhMmY2OSwgMHgzNjkzYTAzOCwgMHgyMTZkNjZlMiwgMHgyMThkODcwYiwgMHgzNjdmZTYwOCwKLQkweDM2Nzk0ZTZlLCAweDIxOTgzOWQ4LCAweDIxYjg0YTc5LCAweDM2NjU3YjA4LCAweDM2NWVkYjA5LCAweDIxYzJmODE1LCAweDIxZTJmOTFhLCAweDM2NGFlZTdiLAotCTB4MzY0NDQ2MWIsIDB4MjFlZGExN2YsIDB4MjIwZDkyZDQsIDB4MzYzMDQwNzAsIDB4MzYyOThmYjQsIDB4MjIxODM1ZmIsIDB4MjIzODE3OGQsIDB4MzYxNTcwZjgsCi0JMHgzNjBlYjdlMywgMHgyMjQyYjU2ZiwgMHgyMjYyODcyOSwgMHgzNWZhODAyMywgMHgzNWYzYmViYSwgMHgyMjZkMWZjMSwgMHgyMjhjZTE5MSwgMHgzNWRmNmUwMywKLQkweDM1ZDhhNDQ5LCAweDIyOTc3NGQ3LCAweDIyYjcyNmE4LCAweDM1YzQzYWE3LCAweDM1YmQ2OGExLCAweDIyYzFiNDk2LCAweDIyZTE1NjU1LCAweDM1YThlNjIxLAotCTB4MzVhMjBiZDMsIDB4MjJlYmRlZTUsIDB4MjMwYjcwN2UsIDB4MzU4ZDcwODEsIDB4MzU4NjhkZWYsIDB4MjMxNWYzYTgsIDB4MjMzNTc1MDksIDB4MzU3MWQ5ZDksCi0JMHgzNTZhZWYwOCwgMHgyMzNmZjJjOCwgMHgyMzVmNjNkYywgMHgzNTU2MjIzOSwgMHgzNTRmMmYyYywgMHgyMzY5ZGMyOSwgMHgyMzg5M2NkZCwgMHgzNTNhNDliMiwKLQkweDM1MzM0ZTZmLCAweDIzOTNhZmIyLCAweDIzYjJmZmYzLCAweDM1MWU1MDU2LCAweDM1MTc0Y2UwLCAweDIzYmQ2ZDQ4LCAweDIzZGNhZDAzLCAweDM1MDIzNjM2LAotCTB4MzRmYjJhOTIsIDB4MjNlNzE0ZDMsIDB4MjQwNjQzZjQsIDB4MzRlNWZiNjMsIDB4MzRkZWU3OTUsIDB4MjQxMGE2MzksIDB4MjQyZmM0YWQsIDB4MzRjOTlmZWYsCi0JMHgzNGMyODNmYiwgMHgyNDNhMjE1ZiwgMHgyNDU5MmYxMywgMHgzNGFkMjNlYiwgMHgzNGE1ZmZkNSwgMHgyNDYzODYyYywgMHgyNDgyODMwZCwgMHgzNDkwODc2OCwKLQkweDM0ODk1YjM2LCAweDI0OGNkNDg3LCAweDI0YWJjMDgyLCAweDM0NzNjYTc5LCAweDM0NmM5NjJmLCAweDI0YjYwYzU3LCAweDI0ZDRlNzU3LCAweDM0NTZlZDJmLAotCTB4MzQ0ZmIwZDEsIDB4MjRkZjJkODEsIDB4MjRmZGY3NzUsIDB4MzQzOWVmOWMsIDB4MzQzMmFiMmUsIDB4MjUwODM3ZWQsIDB4MjUyNmYwYzEsIDB4MzQxY2QxZDIsCi0JMHgzNDE1ODU1OSwgMHgyNTMxMmI4MSwgMHgyNTRmZDMyMywgMHgzM2ZmOTNlMiwgMHgzM2Y4M2Y2MiwgMHgyNTVhMDgyMywgMHgyNTc4OWU4MCwgMHgzM2UyMzVkZiwKLQkweDMzZGFkOTVlLCAweDI1ODJjZGJjLCAweDI1YTE1MmMwLCAweDMzYzRiN2RiLCAweDMzYmQ1MzVjLCAweDI1YWI3YzMwLCAweDI1YzllZmNhLCAweDMzYTcxOWU4LAotCTB4MzM5ZmFkNzAsIDB4MjVkNDEzNjksIDB4MjVmMjc1ODQsIDB4MzM4OTVjMTgsIDB4MzM4MWU3YWMsIDB4MjVmYzkzNGIsIDB4MjYxYWUzZDYsIDB4MzM2YjdlN2UsCi0JMHgzMzY0MDIyMywgMHgyNjI0ZmJiZiwgMHgyNjQzM2FhNywgMHgzMzRkODEyZCwgMHgzMzQ1ZmNlNiwgMHgyNjRkNGNhYywgMHgyNjZiNzlkZCwgMHgzMzJmNjQzNSwKLQkweDMzMjdkODA4LCAweDI2NzU4NWY4LCAweDI2OTNhMTYxLCAweDMzMTEyN2FiLCAweDMzMDk5MzljLCAweDI2OWRhNzhiLCAweDI2YmJiMTE5LCAweDMyZjJjYmExLAotCTB4MzJlYjJmYjUsIDB4MjZjNWIxNGMsIDB4MjZlM2E4ZWMsIDB4MzJkNDUwMjksIDB4MzJjY2FjNjQsIDB4MjZlZGEzMjIsIDB4MjcwYjg4YzIsIDB4MzJiNWI1NTcsCi0JMHgzMmFlMDliZSwgMHgyNzE1N2NmNSwgMHgyNzMzNTA4MiwgMHgzMjk2ZmIzZCwgMHgzMjhmNDdkNSwgMHgyNzNkM2VhYywgMHgyNzViMDAxNCwgMHgzMjc4MjFlZSwKLQkweDMyNzA2NmJjLCAweDI3NjRlODJmLCAweDI3ODI5NzYwLCAweDMyNTkyOTdkLCAweDMyNTE2Njg2LCAweDI3OGM3OTY1LCAweDI3YWExNjRjLCAweDMyM2ExMWZlLAotCTB4MzIzMjQ3NDYsIDB4MjdiM2YyMzUsIDB4MjdkMTdjYzEsIDB4MzIxYWRiODMsIDB4MzIxMzA5MGYsIDB4MjdkYjUyODgsIDB4MjdmOGNhYTUsIDB4MzFmYjg2MjAsCi0JMHgzMWYzYWJmNSwgMHgyODAyOWE0NSwgMHgyODFmZmZlMiwgMHgzMWRjMTFlOCwgMHgzMWQ0MzAwYiwgMHgyODI5Yzk1NCwgMHgyODQ3MWM1ZSwgMHgzMWJjN2VlZSwKLQkweDMxYjQ5NTY0LCAweDI4NTBkZjlkLCAweDI4NmUyMDAyLCAweDMxOWNjZDQ2LCAweDMxOTRkYzE0LCAweDI4NzdkZDA3LCAweDI4OTUwYWI2LCAweDMxN2NmZDA0LAotCTB4MzE3NTA0MmUsIDB4Mjg5ZWMxN2EsIDB4MjhiYmRjNjEsIDB4MzE1ZDBlM2IsIDB4MzE1NTBkYzYsIDB4MjhjNThjZGYsIDB4MjhlMjk0ZWIsIDB4MzEzZDAwZmYsCi0JMHgzMTM0ZjhmMSwgMHgyOGVjM2YxZSwgMHgyOTA5MzQzZSwgMHgzMTFjZDU2NCwgMHgzMTE0YzVjMCwgMHgyOTEyZDgxZiwgMHgyOTJmYmE0MCwgMHgzMGZjOGI3ZCwKLQkweDMwZjQ3NDQ5LCAweDI5Mzk1N2M5LCAweDI5NTYyNmRhLCAweDMwZGMyMzVlLCAweDMwZDQwNGEwLCAweDI5NWZiZTA2LCAweDI5N2M3OWY1LCAweDMwYmI5ZDFjLAotCTB4MzBiMzc2ZDgsIDB4Mjk4NjBhYmQsIDB4MjlhMmIzNzgsIDB4MzA5YWY4Y2EsIDB4MzA5MmNiMDUsIDB4MjlhYzNkZDcsIDB4MjljOGQzNGQsIDB4MzA3YTM2N2MsCi0JMHgzMDcyMDEzYywgMHgyOWQyNTczYywgMHgyOWVlZDk1YiwgMHgzMDU5NTY0OCwgMHgzMDUxMTk5MSwgMHgyOWY4NTZkNSwgMHgyYTE0YzU4YiwgMHgzMDM4NTg0MCwKLQkweDMwMzAxNDE4LCAweDJhMWUzYzhhLCAweDJhM2E5N2M3LCAweDMwMTczYzdhLCAweDMwMGVmMGU1LCAweDJhNDQwODQ0LCAweDJhNjA0ZmY1LCAweDJmZjYwMzBhLAotCTB4MmZlZGIwMGQsIDB4MmE2OWI5ZWMsIDB4MmE4NWVlMDAsIDB4MmZkNGFjMDQsIDB4MmZjYzUxYTUsIDB4MmE4ZjUxNmIsIDB4MmFhYjcxZDAsIDB4MmZiMzM3N2MsCi0JMHgyZmFhZDVjMSwgMHgyYWI0Y2VhOSwgMHgyYWQwZGI0ZSwgMHgyZjkxYTU4OSwgMHgyZjg5M2M3NSwgMHgyYWRhMzE4ZSwgMHgyYWY2MmE2MywgMHgyZjZmZjYzZCwKLQkweDJmNjc4NWQ3LCAweDJhZmY3YTA1LCAweDJiMWI1ZWY4LCAweDJmNGUyOWFmLCAweDJmNDViMWZiLCAweDJiMjRhN2Y2LCAweDJiNDA3OGY1LCAweDJmMmMzZmYyLAotCTB4MmYyM2MwZjYsIDB4MmI0OWJiNGEsIDB4MmI2NTc4NDQsIDB4MmYwYTM5MWQsIDB4MmYwMWIyZGUsIDB4MmI2ZWIzZWEsIDB4MmI4YTVjY2UsIDB4MmVlODE1NDMsCi0JMHgyZWRmODdjNiwgMHgyYjkzOTFjMCwgMHgyYmFmMjY3ZCwgMHgyZWM1ZDQ3OSwgMHgyZWJkM2ZjNCwgMHgyYmI4NTRiNCwgMHgyYmQzZDUzYSwgMHgyZWEzNzZkNiwKLQkweDJlOWFkYWVlLCAweDJiZGNmY2IwLCAweDJiZjg2OGVkLCAweDJlODBmYzZlLCAweDJlNzg1OTU4LCAweDJjMDE4OTllLCAweDJjMWNlMTgxLCAweDJlNWU2NTU2LAotCTB4MmU1NWJiMTcsIDB4MmMyNWZiNjYsIDB4MmM0MTNlZGYsIDB4MmUzYmIxYTQsIDB4MmUzMzAwNDIsIDB4MmM0YTUxZjMsIDB4MmM2NTgwZjEsIDB4MmUxOGUxNmQsCi0JMHgyZTEwMjhlZCwgMHgyYzZlOGQyZSwgMHgyYzg5YTc5ZiwgMHgyZGY1ZjRjNywgMHgyZGVkMzUyZiwgMHgyYzkyYWQwMSwgMHgyY2FkYjJkNSwgMHgyZGQyZWJjNywKLQkweDJkY2EyNTFjLCAweDJjYjZiMTU1LCAweDJjZDFhMjdiLCAweDJkYWZjNjgzLCAweDJkYTZmOGNhLCAweDJjZGE5YTE0LCAweDJjZjU3NjdjLCAweDJkOGM4NTEwLAotCTB4MmQ4M2IwNGYsIDB4MmNmZTY3MjgsIDB4MmQxOTJlYzEsIDB4MmQ2OTI3ODQsIDB4MmQ2MDRiYzAsIDB4MmQyMjE4N2EsIDB4MmQzY2NiMzQsIDB4MmQ0NWFkZjYKLX07Ci0KLQotY29uc3QgaW50IHR3aWRUYWI1MTJbKDgqNiArIDMyKjYgKyAxMjgqNikvMl0gPSB7Ci0JMHg0MDAwMDAwMCwgMHg0MDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgzYjIwMTg3ZCwKLQkweDNlYzUwYzdjLCAweDM1MzYyMzhlLCAweDJkNDEyZDQxLCAweDNiMjAxODdkLAotCTB4MTg3ZDNiMjAsIDB4MTg3ZDNiMjAsIDB4MzUzNjIzOGUsIDB4ZjM4NDNlYzUsCi0JMHgwMDAwNDAwMCwgMHgyZDQxMmQ0MSwgMHhkMmJmMmQ0MSwgMHhlNzgzM2IyMCwKLQkweDIzOGUzNTM2LCAweGMxM2IwYzdjLCAweGQyYmYyZDQxLCAweDE4N2QzYjIwLAotCTB4YzRlMGU3ODMsIDB4YzRlMDE4N2QsIDB4MGM3YzNlYzUsIDB4ZGM3MmNhY2EsCi0KLQkweDQwMDAwMDAwLCAweDQwMDAwMDAwLCAweDQwMDAwMDAwLCAweDNmYjEwNjQ1LAotCTB4M2ZlYzAzMjMsIDB4M2Y0ZTA5NjQsIDB4M2VjNTBjN2MsIDB4M2ZiMTA2NDUsCi0JMHgzZDNlMTI5NCwgMHgzZDNlMTI5NCwgMHgzZjRlMDk2NCwgMHgzOWRhMWI1ZCwKLQkweDNiMjAxODdkLCAweDNlYzUwYzdjLCAweDM1MzYyMzhlLCAweDM4NzExZTJiLAotCTB4M2UxNDBmOGMsIDB4MmY2YjJhZmEsIDB4MzUzNjIzOGUsIDB4M2QzZTEyOTQsCi0JMHgyODk5MzE3OSwgMHgzMTc5Mjg5OSwgMHgzYzQyMTU4ZiwgMHgyMGU3MzZlNSwKLQkweDJkNDEyZDQxLCAweDNiMjAxODdkLCAweDE4N2QzYjIwLCAweDI4OTkzMTc5LAotCTB4MzlkYTFiNWQsIDB4MGY4YzNlMTQsIDB4MjM4ZTM1MzYsIDB4Mzg3MTFlMmIsCi0JMHgwNjQ1M2ZiMSwgMHgxZTJiMzg3MSwgMHgzNmU1MjBlNywgMHhmY2RkM2ZlYywKLQkweDE4N2QzYjIwLCAweDM1MzYyMzhlLCAweGYzODQzZWM1LCAweDEyOTQzZDNlLAotCTB4MzM2NzI2MWYsIDB4ZWE3MTNjNDIsIDB4MGM3YzNlYzUsIDB4MzE3OTI4OTksCi0JMHhlMWQ1Mzg3MSwgMHgwNjQ1M2ZiMSwgMHgyZjZiMmFmYSwgMHhkOWUxMzM2NywKLQkweDAwMDA0MDAwLCAweDJkNDEyZDQxLCAweGQyYmYyZDQxLCAweGY5YmIzZmIxLAotCTB4MmFmYTJmNmIsIDB4Y2M5OTI2MWYsIDB4ZjM4NDNlYzUsIDB4Mjg5OTMxNzksCi0JMHhjNzhmMWUyYiwgMHhlZDZjM2QzZSwgMHgyNjFmMzM2NywgMHhjM2JlMTU4ZiwKLQkweGU3ODMzYjIwLCAweDIzOGUzNTM2LCAweGMxM2IwYzdjLCAweGUxZDUzODcxLAotCTB4MjBlNzM2ZTUsIDB4YzAxNDAzMjMsIDB4ZGM3MjM1MzYsIDB4MWUyYjM4NzEsCi0JMHhjMDRmZjliYiwgMHhkNzY3MzE3OSwgMHgxYjVkMzlkYSwgMHhjMWVjZjA3NCwKLQkweGQyYmYyZDQxLCAweDE4N2QzYjIwLCAweGM0ZTBlNzgzLCAweGNlODcyODk5LAotCTB4MTU4ZjNjNDIsIDB4YzkxYmRmMTksIDB4Y2FjYTIzOGUsIDB4MTI5NDNkM2UsCi0JMHhjZTg3ZDc2NywgMHhjNzhmMWUyYiwgMHgwZjhjM2UxNCwgMHhkNTA2ZDA5NSwKLQkweGM0ZTAxODdkLCAweDBjN2MzZWM1LCAweGRjNzJjYWNhLCAweGMyYzIxMjk0LAotCTB4MDk2NDNmNGUsIDB4ZTRhM2M2MjYsIDB4YzEzYjBjN2MsIDB4MDY0NTNmYjEsCi0JMHhlZDZjYzJjMiwgMHhjMDRmMDY0NSwgMHgwMzIzM2ZlYywgMHhmNjljYzBiMiwKLQotCTB4NDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4M2ZmYjAxOTIsCi0JMHgzZmZlMDBjOSwgMHgzZmY0MDI1YiwgMHgzZmVjMDMyMywgMHgzZmZiMDE5MiwKLQkweDNmZDMwNGI1LCAweDNmZDMwNGI1LCAweDNmZjQwMjViLCAweDNmOWMwNzBkLAotCTB4M2ZiMTA2NDUsIDB4M2ZlYzAzMjMsIDB4M2Y0ZTA5NjQsIDB4M2Y4NDA3ZDUsCi0JMHgzZmUxMDNlYywgMHgzZWViMGJiNiwgMHgzZjRlMDk2NCwgMHgzZmQzMDRiNSwKLQkweDNlNzEwZTA1LCAweDNmMGUwYWYxLCAweDNmYzMwNTdkLCAweDNkZTIxMDRmLAotCTB4M2VjNTBjN2MsIDB4M2ZiMTA2NDUsIDB4M2QzZTEyOTQsIDB4M2U3MTBlMDUsCi0JMHgzZjljMDcwZCwgMHgzYzg0MTRkMSwgMHgzZTE0MGY4YywgMHgzZjg0MDdkNSwKLQkweDNiYjYxNzA4LCAweDNkYWUxMTExLCAweDNmNmEwODljLCAweDNhZDIxOTM3LAotCTB4M2QzZTEyOTQsIDB4M2Y0ZTA5NjQsIDB4MzlkYTFiNWQsIDB4M2NjNTE0MTMsCi0JMHgzZjJmMGEyYSwgMHgzOGNmMWQ3OSwgMHgzYzQyMTU4ZiwgMHgzZjBlMGFmMSwKLQkweDM3YWYxZjhiLCAweDNiYjYxNzA4LCAweDNlZWIwYmI2LCAweDM2N2MyMTkyLAotCTB4M2IyMDE4N2QsIDB4M2VjNTBjN2MsIDB4MzUzNjIzOGUsIDB4M2E4MjE5ZWYsCi0JMHgzZTljMGQ0MSwgMHgzM2RlMjU3ZCwgMHgzOWRhMWI1ZCwgMHgzZTcxMGUwNSwKLQkweDMyNzQyNzVmLCAweDM5MmExY2M2LCAweDNlNDQwZWM5LCAweDMwZjgyOTM0LAotCTB4Mzg3MTFlMmIsIDB4M2UxNDBmOGMsIDB4MmY2YjJhZmEsIDB4MzdhZjFmOGIsCi0JMHgzZGUyMTA0ZiwgMHgyZGNlMmNiMiwgMHgzNmU1MjBlNywgMHgzZGFlMTExMSwKLQkweDJjMjEyZTVhLCAweDM2MTIyMjNkLCAweDNkNzcxMWQzLCAweDJhNjUyZmYxLAotCTB4MzUzNjIzOGUsIDB4M2QzZTEyOTQsIDB4Mjg5OTMxNzksIDB4MzQ1MzI0ZGEsCi0JMHgzZDAyMTM1NCwgMHgyNmMwMzJlZSwgMHgzMzY3MjYxZiwgMHgzY2M1MTQxMywKLQkweDI0ZGEzNDUzLCAweDMyNzQyNzVmLCAweDNjODQxNGQxLCAweDIyZTYzNWE1LAotCTB4MzE3OTI4OTksIDB4M2M0MjE1OGYsIDB4MjBlNzM2ZTUsIDB4MzA3NjI5Y2QsCi0JMHgzYmZkMTY0YywgMHgxZWRjMzgxMSwgMHgyZjZiMmFmYSwgMHgzYmI2MTcwOCwKLQkweDFjYzYzOTJhLCAweDJlNWEyYzIxLCAweDNiNmMxN2MzLCAweDFhYTYzYTJmLAotCTB4MmQ0MTJkNDEsIDB4M2IyMDE4N2QsIDB4MTg3ZDNiMjAsIDB4MmMyMTJlNWEsCi0JMHgzYWQyMTkzNywgMHgxNjRjM2JmZCwgMHgyYWZhMmY2YiwgMHgzYTgyMTllZiwKLQkweDE0MTMzY2M1LCAweDI5Y2QzMDc2LCAweDNhMmYxYWE2LCAweDExZDMzZDc3LAotCTB4Mjg5OTMxNzksIDB4MzlkYTFiNWQsIDB4MGY4YzNlMTQsIDB4Mjc1ZjMyNzQsCi0JMHgzOTgzMWMxMiwgMHgwZDQxM2U5YywgMHgyNjFmMzM2NywgMHgzOTJhMWNjNiwKLQkweDBhZjEzZjBlLCAweDI0ZGEzNDUzLCAweDM4Y2YxZDc5LCAweDA4OWMzZjZhLAotCTB4MjM4ZTM1MzYsIDB4Mzg3MTFlMmIsIDB4MDY0NTNmYjEsIDB4MjIzZDM2MTIsCi0JMHgzODExMWVkYywgMHgwM2VjM2ZlMSwgMHgyMGU3MzZlNSwgMHgzN2FmMWY4YiwKLQkweDAxOTIzZmZiLCAweDFmOGIzN2FmLCAweDM3NGIyMDM5LCAweGZmMzczZmZlLAotCTB4MWUyYjM4NzEsIDB4MzZlNTIwZTcsIDB4ZmNkZDNmZWMsIDB4MWNjNjM5MmEsCi0JMHgzNjdjMjE5MiwgMHhmYTgzM2ZjMywgMHgxYjVkMzlkYSwgMHgzNjEyMjIzZCwKLQkweGY4MmIzZjg0LCAweDE5ZWYzYTgyLCAweDM1YTUyMmU2LCAweGY1ZDYzZjJmLAotCTB4MTg3ZDNiMjAsIDB4MzUzNjIzOGUsIDB4ZjM4NDNlYzUsIDB4MTcwODNiYjYsCi0JMHgzNGM2MjQzNCwgMHhmMTM3M2U0NCwgMHgxNThmM2M0MiwgMHgzNDUzMjRkYSwKLQkweGVlZWYzZGFlLCAweDE0MTMzY2M1LCAweDMzZGUyNTdkLCAweGVjYWMzZDAyLAotCTB4MTI5NDNkM2UsIDB4MzM2NzI2MWYsIDB4ZWE3MTNjNDIsIDB4MTExMTNkYWUsCi0JMHgzMmVlMjZjMCwgMHhlODNkM2I2YywgMHgwZjhjM2UxNCwgMHgzMjc0Mjc1ZiwKLQkweGU2MTEzYTgyLCAweDBlMDUzZTcxLCAweDMxZjcyN2ZkLCAweGUzZWUzOTgzLAotCTB4MGM3YzNlYzUsIDB4MzE3OTI4OTksIDB4ZTFkNTM4NzEsIDB4MGFmMTNmMGUsCi0JMHgzMGY4MjkzNCwgMHhkZmM3Mzc0YiwgMHgwOTY0M2Y0ZSwgMHgzMDc2MjljZCwKLQkweGRkYzMzNjEyLCAweDA3ZDUzZjg0LCAweDJmZjEyYTY1LCAweGRiY2MzNGM2LAotCTB4MDY0NTNmYjEsIDB4MmY2YjJhZmEsIDB4ZDllMTMzNjcsIDB4MDRiNTNmZDMsCi0JMHgyZWUzMmI4ZSwgMHhkODAzMzFmNywgMHgwMzIzM2ZlYywgMHgyZTVhMmMyMSwKLQkweGQ2MzMzMDc2LCAweDAxOTIzZmZiLCAweDJkY2UyY2IyLCAweGQ0NzIyZWUzLAotCTB4MDAwMDQwMDAsIDB4MmQ0MTJkNDEsIDB4ZDJiZjJkNDEsIDB4ZmU2ZTNmZmIsCi0JMHgyY2IyMmRjZSwgMHhkMTFkMmI4ZSwgMHhmY2RkM2ZlYywgMHgyYzIxMmU1YSwKLQkweGNmOGEyOWNkLCAweGZiNGIzZmQzLCAweDJiOGUyZWUzLCAweGNlMDkyN2ZkLAotCTB4ZjliYjNmYjEsIDB4MmFmYTJmNmIsIDB4Y2M5OTI2MWYsIDB4ZjgyYjNmODQsCi0JMHgyYTY1MmZmMSwgMHhjYjNhMjQzNCwgMHhmNjljM2Y0ZSwgMHgyOWNkMzA3NiwKLQkweGM5ZWUyMjNkLCAweGY1MGYzZjBlLCAweDI5MzQzMGY4LCAweGM4YjUyMDM5LAotCTB4ZjM4NDNlYzUsIDB4Mjg5OTMxNzksIDB4Yzc4ZjFlMmIsIDB4ZjFmYjNlNzEsCi0JMHgyN2ZkMzFmNywgMHhjNjdkMWMxMiwgMHhmMDc0M2UxNCwgMHgyNzVmMzI3NCwKLQkweGM1N2UxOWVmLCAweGVlZWYzZGFlLCAweDI2YzAzMmVlLCAweGM0OTQxN2MzLAotCTB4ZWQ2YzNkM2UsIDB4MjYxZjMzNjcsIDB4YzNiZTE1OGYsIDB4ZWJlZDNjYzUsCi0JMHgyNTdkMzNkZSwgMHhjMmZlMTM1NCwgMHhlYTcxM2M0MiwgMHgyNGRhMzQ1MywKLQkweGMyNTIxMTExLCAweGU4ZjgzYmI2LCAweDI0MzQzNGM2LCAweGMxYmMwZWM5LAotCTB4ZTc4MzNiMjAsIDB4MjM4ZTM1MzYsIDB4YzEzYjBjN2MsIDB4ZTYxMTNhODIsCi0JMHgyMmU2MzVhNSwgMHhjMGQxMGEyYSwgMHhlNGEzMzlkYSwgMHgyMjNkMzYxMiwKLQkweGMwN2MwN2Q1LCAweGUzM2EzOTJhLCAweDIxOTIzNjdjLCAweGMwM2QwNTdkLAotCTB4ZTFkNTM4NzEsIDB4MjBlNzM2ZTUsIDB4YzAxNDAzMjMsIDB4ZTA3NTM3YWYsCi0JMHgyMDM5Mzc0YiwgMHhjMDAyMDBjOSwgMHhkZjE5MzZlNSwgMHgxZjhiMzdhZiwKLQkweGMwMDVmZTZlLCAweGRkYzMzNjEyLCAweDFlZGMzODExLCAweGMwMWZmYzE0LAotCTB4ZGM3MjM1MzYsIDB4MWUyYjM4NzEsIDB4YzA0ZmY5YmIsIDB4ZGIyNjM0NTMsCi0JMHgxZDc5MzhjZiwgMHhjMDk2Zjc2NCwgMHhkOWUxMzM2NywgMHgxY2M2MzkyYSwKLQkweGMwZjJmNTBmLCAweGQ4YTEzMjc0LCAweDFjMTIzOTgzLCAweGMxNjRmMmJmLAotCTB4ZDc2NzMxNzksIDB4MWI1ZDM5ZGEsIDB4YzFlY2YwNzQsIDB4ZDYzMzMwNzYsCi0JMHgxYWE2M2EyZiwgMHhjMjg5ZWUyZCwgMHhkNTA2MmY2YiwgMHgxOWVmM2E4MiwKLQkweGMzM2JlYmVkLCAweGQzZGYyZTVhLCAweDE5MzczYWQyLCAweGM0MDNlOWI0LAotCTB4ZDJiZjJkNDEsIDB4MTg3ZDNiMjAsIDB4YzRlMGU3ODMsIDB4ZDFhNjJjMjEsCi0JMHgxN2MzM2I2YywgMHhjNWQxZTU1YSwgMHhkMDk1MmFmYSwgMHgxNzA4M2JiNiwKLQkweGM2ZDZlMzNhLCAweGNmOGEyOWNkLCAweDE2NGMzYmZkLCAweGM3ZWZlMTI0LAotCTB4Y2U4NzI4OTksIDB4MTU4ZjNjNDIsIDB4YzkxYmRmMTksIDB4Y2Q4YzI3NWYsCi0JMHgxNGQxM2M4NCwgMHhjYTViZGQxYSwgMHhjYzk5MjYxZiwgMHgxNDEzM2NjNSwKLQkweGNiYWRkYjI2LCAweGNiYWQyNGRhLCAweDEzNTQzZDAyLCAweGNkMTJkOTQwLAotCTB4Y2FjYTIzOGUsIDB4MTI5NDNkM2UsIDB4Y2U4N2Q3NjcsIDB4YzllZTIyM2QsCi0JMHgxMWQzM2Q3NywgMHhkMDBmZDU5YiwgMHhjOTFiMjBlNywgMHgxMTExM2RhZSwKLQkweGQxYTZkM2RmLCAweGM4NTExZjhiLCAweDEwNGYzZGUyLCAweGQzNGVkMjMyLAotCTB4Yzc4ZjFlMmIsIDB4MGY4YzNlMTQsIDB4ZDUwNmQwOTUsIDB4YzZkNjFjYzYsCi0JMHgwZWM5M2U0NCwgMHhkNmNjY2YwOCwgMHhjNjI2MWI1ZCwgMHgwZTA1M2U3MSwKLQkweGQ4YTFjZDhjLCAweGM1N2UxOWVmLCAweDBkNDEzZTljLCAweGRhODNjYzIyLAotCTB4YzRlMDE4N2QsIDB4MGM3YzNlYzUsIDB4ZGM3MmNhY2EsIDB4YzQ0YTE3MDgsCi0JMHgwYmI2M2VlYiwgMHhkZTZlYzk4NCwgMHhjM2JlMTU4ZiwgMHgwYWYxM2YwZSwKLQkweGUwNzVjODUxLCAweGMzM2IxNDEzLCAweDBhMmEzZjJmLCAweGUyODdjNzMxLAotCTB4YzJjMjEyOTQsIDB4MDk2NDNmNGUsIDB4ZTRhM2M2MjYsIDB4YzI1MjExMTEsCi0JMHgwODljM2Y2YSwgMHhlNmM5YzUyZSwgMHhjMWVjMGY4YywgMHgwN2Q1M2Y4NCwKLQkweGU4ZjhjNDRhLCAweGMxOGYwZTA1LCAweDA3MGQzZjljLCAweGViMmZjMzdjLAotCTB4YzEzYjBjN2MsIDB4MDY0NTNmYjEsIDB4ZWQ2Y2MyYzIsIDB4YzBmMjBhZjEsCi0JMHgwNTdkM2ZjMywgMHhlZmIxYzIxZSwgMHhjMGIyMDk2NCwgMHgwNGI1M2ZkMywKLQkweGYxZmJjMThmLCAweGMwN2MwN2Q1LCAweDAzZWMzZmUxLCAweGY0NGFjMTE1LAotCTB4YzA0ZjA2NDUsIDB4MDMyMzNmZWMsIDB4ZjY5Y2MwYjIsIDB4YzAyZDA0YjUsCi0JMHgwMjViM2ZmNCwgMHhmOGYzYzA2NCwgMHhjMDE0MDMyMywgMHgwMTkyM2ZmYiwKLQkweGZiNGJjMDJkLCAweGMwMDUwMTkyLCAweDAwYzkzZmZlLCAweGZkYTVjMDBjCi19OwotCi1jb25zdCBpbnQgdHdpZFRhYjY0Wyg0KjYgKyAxNio2KS8yXSA9IHsKLQkweDQwMDAwMDAwLCAweDQwMDAwMDAwLCAweDQwMDAwMDAwLCAweDJkNDEyZDQxLAotCTB4M2IyMDE4N2QsIDB4MTg3ZDNiMjAsIDB4MDAwMDQwMDAsIDB4MmQ0MTJkNDEsCi0JMHhkMmJmMmQ0MSwgMHhkMmJmMmQ0MSwgMHgxODdkM2IyMCwgMHhjNGUwZTc4MywKLQotCTB4NDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4M2VjNTBjN2MsCi0JMHgzZmIxMDY0NSwgMHgzZDNlMTI5NCwgMHgzYjIwMTg3ZCwgMHgzZWM1MGM3YywKLQkweDM1MzYyMzhlLCAweDM1MzYyMzhlLCAweDNkM2UxMjk0LCAweDI4OTkzMTc5LAotCTB4MmQ0MTJkNDEsIDB4M2IyMDE4N2QsIDB4MTg3ZDNiMjAsIDB4MjM4ZTM1MzYsCi0JMHgzODcxMWUyYiwgMHgwNjQ1M2ZiMSwgMHgxODdkM2IyMCwgMHgzNTM2MjM4ZSwKLQkweGYzODQzZWM1LCAweDBjN2MzZWM1LCAweDMxNzkyODk5LCAweGUxZDUzODcxLAotCTB4MDAwMDQwMDAsIDB4MmQ0MTJkNDEsIDB4ZDJiZjJkNDEsIDB4ZjM4NDNlYzUsCi0JMHgyODk5MzE3OSwgMHhjNzhmMWUyYiwgMHhlNzgzM2IyMCwgMHgyMzhlMzUzNiwKLQkweGMxM2IwYzdjLCAweGRjNzIzNTM2LCAweDFlMmIzODcxLCAweGMwNGZmOWJiLAotCTB4ZDJiZjJkNDEsIDB4MTg3ZDNiMjAsIDB4YzRlMGU3ODMsIDB4Y2FjYTIzOGUsCi0JMHgxMjk0M2QzZSwgMHhjZTg3ZDc2NywgMHhjNGUwMTg3ZCwgMHgwYzdjM2VjNSwKLQkweGRjNzJjYWNhLCAweGMxM2IwYzdjLCAweDA2NDUzZmIxLCAweGVkNmNjMmMyCi19OwotCi0jZWxpZiBkZWZpbmVkIEFSTVY3TmVvbgotLyoKLSAqICBRMjkgZm9yIDEyOCBhbmQgMTAyNAotICoKLSAqIGZvciAoaSA9IDA7IGkgPCBudW0vNDsgaSsrKSB7Ci0gKiAgIGFuZ2xlID0gKGkgKyAwLjEyNSkgKiBNX1BJIC8gbnVtOwotICogICB4ID0gY29zKGFuZ2xlKSAqICgxIDw8IDI5KTsKLSAqICAgeCA9IHNpbihhbmdsZSkgKiAoMSA8PCAyOSk7Ci0gKgotICogICBhbmdsZSA9IChudW0vMiAtIDEgLSBpICsgMC4xMjUpICogTV9QSSAvIG51bTsKLSAqICAgeCA9IGNvcyhhbmdsZSkgKiAoMSA8PCAyOSk7Ci0gKiAgIHggPSBzaW4oYW5nbGUpICogKDEgPDwgMjkpOwotICogfQotICovCi1jb25zdCBpbnQgY29zc2ludGFiWzEyOCArIDEwMjRdID0gewotCS8qIDEyOCAqLwotCTB4MWZmZmY2MjEsIDB4MDAxOTIxZjksIDB4MDBhZmVhNjksIDB4MWZmZTFjNjgsIDB4MWZmY2UwOWQsIDB4MDBlMjJhN2EsIDB4MDE3OGRiYWEsIDB4MWZmNzUzYmIsCi0JMHgxZmY0ZGM1NSwgMHgwMWFiMTAxYywgMHgwMjQxOTJjZiwgMHgxZmViOWQyNSwgMHgxZmU3ZWE4NSwgMHgwMjczYjNlMiwgMHgwMzA5ZjBlMiwgMHgxZmRhZmE3NSwKLQkweDFmZDYwZDJlLCAweDAzM2JmNmRkLCAweDAzZDFkNzAwLCAweDFmYzU2ZTNiLCAweDFmYmY0NzBmLCAweDA0MDNiYTJiLCAweDA0OTkyNjUzLCAweDFmYWFmYmNiLAotCTB4MWZhMzliYWMsIDB4MDRjYWRlZmUsIDB4MDU1ZmMwMjIsIDB4MWY4YmE3MzgsIDB4MWY4MzBmNGEsIDB4MDU5MTQ2YTEsIDB4MDYyNTg1Y2EsIDB4MWY2Nzc1NTcsCi0JMHgxZjVkYTZlZCwgMHgwNjU2ZDI3YSwgMHgwNmVhNThjZCwgMHgxZjNlNmJiYywgMHgxZjMzNjg1YSwgMHgwNzFiNjQxNSwgMHgwN2FlMWFkMiwgMHgxZjEwOTBiZCwKLQkweDFmMDQ1YTE1LCAweDA3ZGVkZDIwLCAweDA4NzBhZGE3LCAweDFlZGRlYjZhLCAweDFlZDA4MzVmLCAweDA4YTExZjc4LCAweDA5MzFmMzRkLCAweDFlYTY4Mzk0LAotCTB4MWU5N2VjMzYsIDB4MDk2MjBkMjcsIDB4MDlmMWNkZjUsIDB4MWU2YTYxYzUsIDB4MWU1YTlkNTUsIDB4MGEyMTg4NmUsIDB4MGFiMDIwMDksIDB4MWUyOThmNDQsCi0JMHgxZTE4YTAzMCwgMHgwYWRmNzNjNiwgMHgwYjZjY2MzMiwgMHgxZGU0MTYwZiwgMHgxZGQxZmVmNCwgMHgwYjliYjFlNSwgMHgwYzI3YjU1NSwgMHgxZDlhMDBkZSwKLQkweDFkODZjNDg0LCAweDBjNTYyNWMzLCAweDBjZTBiZWEyLCAweDFkNGI1YjFiLCAweDFkMzZmYzdjLCAweDBkMGViMmEyLCAweDBkOTdjYjhmLCAweDFjZjgzMGU5LAotCTB4MWNlMmIzMjgsIDB4MGRjNTNjMGEsIDB4MGU0Y2JmZTIsIDB4MWNhMDhmMWEsIDB4MWM4OWY1ODcsIDB4MGU3OWE1ZDcsIDB4MGVmZjdmYjMsIDB4MWM0NDgzMzEsCi0JMHgxYzJjZDE0OSwgMHgwZjJiZDQzNywgMHgwZmFmZWY3MywgMHgxYmU0MWI2MSwgMHgxYmNiNTRjYiwgMHgwZmRiYWJhZSwgMHgxMDVkZjNlYywgMHgxYjdmNjY4NywKLQkweDFiNjU4ZjE1LCAweDEwODkxMTIwLCAweDExMDk3MjQ5LCAweDFiMTY3NDJhLCAweDFhZmI4ZmQ5LCAweDExMzNlOWQwLCAweDExYjI1MDE3LCAweDFhYTk1NDdhLAotCTB4MWE4ZDY3NmUsIDB4MTFkYzFiNjUsIDB4MTI1ODczNGQsIDB4MWEzODE4NGEsIDB4MWExYjI2ZDMsIDB4MTI4MThiZWYsIDB4MTJmYmMyNGIsIDB4MTljMmQxMTEsCi0JMHgxOWE0ZGZhNCwgMHgxMzI0MjFlYywgMHgxMzljMjNlNCwgMHgxOTQ5OTBlNCwgMHgxOTJhYTQyMCwgMHgxM2MzYzQ0YSwgMHgxNDM5N2Y1YiwgMHgxOGNjNmE3NSwKLQkweDE4YWM4NzFmLCAweDE0NjA1YTY5LCAweDE0ZDNiYzZkLCAweDE4NGI3MTEyLCAweDE4MmE5YzE0LCAweDE0ZjljYzI2LCAweDE1NmFjMzUyLCAweDE3YzZiODlkLAotCTB4MTdhNGY3MDgsIDB4MTU5MDAxZDYsIDB4MTVmZTdjYmUsIDB4MTczZTU1OGUsIDB4MTcxYmFjOTYsIDB4MTYyMmU0NTAsIDB4MTY4ZWQxZWIsIDB4MTZiMjVjZWQsCi0JLyogMTAyNCAqLwotCTB4MWZmZmZmZDksIDB4MDAwMzI0M2YsIDB4MDAxNWZkYmEsIDB4MWZmZmY4NzIsIDB4MWZmZmYzODIsIDB4MDAxYzQ2MzcsIDB4MDAyZjFmYTYsIDB4MWZmZmRkNGQsCi0JMHgxZmZmZDM2ZiwgMHgwMDM1NjgxZCwgMHgwMDQ4NDE3NSwgMHgxZmZmYWU2YywgMHgxZmZmOWY5ZSwgMHgwMDRlODllMywgMHgwMDYxNjMxOCwgMHgxZmZmNmJjZSwKLQkweDFmZmY1ODExLCAweDAwNjdhYjc3LCAweDAwN2E4NDdlLCAweDFmZmYxNTcyLCAweDFmZmVmY2M2LCAweDAwODBjY2NjLCAweDAwOTNhNTk5LCAweDFmZmVhYjViLAotCTB4MWZmZThkYmYsIDB4MDA5OWVkZDIsIDB4MDBhY2M2NTgsIDB4MWZmZTJkODYsIDB4MWZmZTBhZmMsIDB4MDBiMzBlNzgsIDB4MDBjNWU2YWQsIDB4MWZmZDliZjYsCi0JMHgxZmZkNzQ3YywgMHgwMGNjMmViMCwgMHgwMGRmMDY4OCwgMHgxZmZjZjZhYSwgMHgxZmZjY2E0MSwgMHgwMGU1NGU2YSwgMHgwMGY4MjVkYSwgMHgxZmZjM2RhMiwKLQkweDFmZmMwYzRiLCAweDAwZmU2ZDk3LCAweDAxMTE0NDkyLCAweDFmZmI3MGUwLCAweDFmZmIzYTlhLCAweDAxMTc4YzI3LCAweDAxMmE2MmEyLCAweDFmZmE5MDYzLAotCTB4MWZmYTU1MmUsIDB4MDEzMGFhMGEsIDB4MDE0MzdmZmEsIDB4MWZmOTljMmMsIDB4MWZmOTVjMDksIDB4MDE0OWM3MzEsIDB4MDE1YzljOGEsIDB4MWZmODk0M2MsCi0JMHgxZmY4NGYyYiwgMHgwMTYyZTM4ZCwgMHgwMTc1Yjg0MywgMHgxZmY3Nzg5MywgMHgxZmY3MmU5NCwgMHgwMTdiZmYwZSwgMHgwMThlZDMxNiwgMHgxZmY2NDkzMiwKLQkweDFmZjVmYTQ2LCAweDAxOTUxOWE1LCAweDAxYTdlY2YyLCAweDFmZjUwNjFiLCAweDFmZjRiMjQwLCAweDAxYWUzMzQxLCAweDAxYzEwNWM5LCAweDFmZjNhZjRjLAotCTB4MWZmMzU2ODQsIDB4MDFjNzRiZDUsIDB4MDFkYTFkOGMsIDB4MWZmMjQ0YzgsIDB4MWZmMWU3MTMsIDB4MDFlMDYzNGYsIDB4MDFmMzM0MjksIDB4MWZmMGM2OGYsCi0JMHgxZmYwNjNlZCwgMHgwMWY5NzlhMSwgMHgwMjBjNDk5MywgMHgxZmVmMzRhMywgMHgxZmVlY2QxNCwgMHgwMjEyOGViYiwgMHgwMjI1NWRiOSwgMHgxZmVkOGYwMywKLQkweDFmZWQyMjg3LCAweDAyMmJhMjhmLCAweDAyM2U3MDhkLCAweDFmZWJkNWIyLCAweDFmZWI2NDRhLCAweDAyNDRiNTBiLCAweDAyNTc4MWZlLCAweDFmZWEwOGIwLAotCTB4MWZlOTkyNWMsIDB4MDI1ZGM2MjEsIDB4MDI3MDkxZmQsIDB4MWZlODI3ZmUsIDB4MWZlN2FjYmUsIDB4MDI3NmQ1YzEsIDB4MDI4OWEwN2IsIDB4MWZlNjMzOWQsCi0JMHgxZmU1YjM3MiwgMHgwMjhmZTNkZCwgMHgwMmEyYWQ2OSwgMHgxZmU0MmI5MCwgMHgxZmUzYTY3OSwgMHgwMmE4ZjA2MywgMHgwMmJiYjhiNiwgMHgxZmUyMGZkNiwKLQkweDFmZTE4NWQ1LCAweDAyYzFmYjQ2LCAweDAyZDRjMjUzLCAweDFmZGZlMDcxLCAweDFmZGY1MTg2LCAweDAyZGIwNDc1LCAweDAyZWRjYTMyLCAweDFmZGQ5ZDY0LAotCTB4MWZkZDA5OGUsIDB4MDJmNDBiZTIsIDB4MDMwNmQwNDIsIDB4MWZkYjQ2YWUsIDB4MWZkYWFkZWUsIDB4MDMwZDExN2MsIDB4MDMxZmQ0NzQsIDB4MWZkOGRjNTEsCi0JMHgxZmQ4M2VhOCwgMHgwMzI2MTUzNCwgMHgwMzM4ZDZiOCwgMHgxZmQ2NWU0ZiwgMHgxZmQ1YmJiZCwgMHgwMzNmMTZmYiwgMHgwMzUxZDcwMCwgMHgxZmQzY2NhYSwKLQkweDFmZDMyNTMwLCAweDAzNTgxNmMxLCAweDAzNmFkNTNjLCAweDFmZDEyNzYzLCAweDFmZDA3YjAwLCAweDAzNzExNDc3LCAweDAzODNkMTVjLCAweDFmY2U2ZTdjLAotCTB4MWZjZGJkMzEsIDB4MDM4YTEwMGUsIDB4MDM5Y2NiNTEsIDB4MWZjYmExZjUsIDB4MWZjYWViYzMsIDB4MDNhMzA5NzUsIDB4MDNiNWMzMGIsIDB4MWZjOGMxZDIsCi0JMHgxZmM4MDZiOSwgMHgwM2JjMDA5ZiwgMHgwM2NlYjg3YywgMHgxZmM1Y2UxNCwgMHgxZmM1MGUxNCwgMHgwM2Q0ZjU3YSwgMHgwM2U3YWI5MywgMHgxZmMyYzZiZCwKLQkweDFmYzIwMWQ3LCAweDAzZWRlN2Y5LCAweDA0MDA5YzQyLCAweDFmYmZhYmNkLCAweDFmYmVlMjAyLCAweDA0MDZkODBiLCAweDA0MTk4YTc4LCAweDFmYmM3ZDQ5LAotCTB4MWZiYmFlOTksIDB4MDQxZmM1YTEsIDB4MDQzMjc2MjgsIDB4MWZiOTNiMzEsIDB4MWZiODY3OWMsIDB4MDQzOGIwYWMsIDB4MDQ0YjVmNDAsIDB4MWZiNWU1ODcsCi0JMHgxZmI1MGQwZSwgMHgwNDUxOTkxZCwgMHgwNDY0NDViMiwgMHgxZmIyN2M0ZSwgMHgxZmIxOWVmMSwgMHgwNDZhN2VlMywgMHgwNDdkMjk2ZiwgMHgxZmFlZmY4NywKLQkweDFmYWUxZDQ3LCAweDA0ODM2MWYwLCAweDA0OTYwYTY3LCAweDFmYWI2ZjM1LCAweDFmYWE4ODEzLCAweDA0OWM0MjM1LCAweDA0YWVlODhiLCAweDFmYTdjYjVhLAotCTB4MWZhNmRmNTYsIDB4MDRiNTFmYTEsIDB4MDRjN2MzY2IsIDB4MWZhNDEzZjgsIDB4MWZhMzIzMTMsIDB4MDRjZGZhMjYsIDB4MDRlMDljMTgsIDB4MWZhMDQ5MTIsCi0JMHgxZjlmNTM0YywgMHgwNGU2ZDFiNCwgMHgwNGY5NzE2MywgMHgxZjljNmFhOSwgMHgxZjliNzAwMywgMHgwNGZmYTYzYywgMHgwNTEyNDM5ZCwgMHgxZjk4NzhjMSwKLQkweDFmOTc3OTNiLCAweDA1MTg3N2FmLCAweDA1MmIxMmI2LCAweDFmOTQ3MzViLCAweDFmOTM2ZWY2LCAweDA1MzE0NWZkLCAweDA1NDNkZTllLCAweDFmOTA1YTdhLAotCTB4MWY4ZjUxMzcsIDB4MDU0YTExMTcsIDB4MDU1Y2E3NDgsIDB4MWY4YzJlMjEsIDB4MWY4YjIwMDAsIDB4MDU2MmQ4ZWUsIDB4MDU3NTZjYTIsIDB4MWY4N2VlNTIsCi0JMHgxZjg2ZGI1NSwgMHgwNTdiOWQ3MywgMHgwNThlMmU5ZiwgMHgxZjgzOWIxMCwgMHgxZjgyODMzNiwgMHgwNTk0NWU5NSwgMHgwNWE2ZWQyZSwgMHgxZjdmMzQ1ZSwKLQkweDFmN2UxN2E4LCAweDA1YWQxYzQ3LCAweDA1YmZhODQwLCAweDFmN2FiYTNlLCAweDFmNzk5OGFkLCAweDA1YzVkNjc4LCAweDA1ZDg1ZmM3LCAweDFmNzYyY2IyLAotCTB4MWY3NTA2NDcsIDB4MDVkZThkMTksIDB4MDVmMTEzYjMsIDB4MWY3MThiYmYsIDB4MWY3MDYwN2EsIDB4MDVmNzQwMWMsIDB4MDYwOWMzZjUsIDB4MWY2Y2Q3NjYsCi0JMHgxZjZiYTc0OCwgMHgwNjBmZWY3MSwgMHgwNjIyNzA3ZCwgMHgxZjY4MGZhYiwgMHgxZjY2ZGFiNSwgMHgwNjI4OWIwOCwgMHgwNjNiMTkzYywgMHgxZjYzMzQ5MCwKLQkweDFmNjFmYWMzLCAweDA2NDE0MmQzLCAweDA2NTNiZTIzLCAweDFmNWU0NjE5LCAweDFmNWQwNzc1LCAweDA2NTllNmMyLCAweDA2NmM1ZjI0LCAweDFmNTk0NDQ4LAotCTB4MWY1ODAwY2UsIDB4MDY3Mjg2YzYsIDB4MDY4NGZjMmUsIDB4MWY1NDJmMjEsIDB4MWY1MmU2ZDIsIDB4MDY4YjIyZDAsIDB4MDY5ZDk1MzIsIDB4MWY0ZjA2YTYsCi0JMHgxZjRkYjk4MywgMHgwNmEzYmFkMCwgMHgwNmI2MmEyMiwgMHgxZjQ5Y2FkYywgMHgxZjQ4NzhlNSwgMHgwNmJjNGViOSwgMHgwNmNlYmFlZSwgMHgxZjQ0N2JjNCwKLQkweDFmNDMyNGZiLCAweDA2ZDRkZTc5LCAweDA2ZTc0Nzg2LCAweDFmM2YxOTYzLCAweDFmM2RiZGM4LCAweDA2ZWQ2YTAzLCAweDA2ZmZjZmRkLCAweDFmMzlhM2JjLAotCTB4MWYzODQzNTAsIDB4MDcwNWYxNDcsIDB4MDcxODUzZTMsIDB4MWYzNDFhZDIsIDB4MWYzMmI1OTUsIDB4MDcxZTc0MzYsIDB4MDczMGQzODgsIDB4MWYyZTdlYTksCi0JMHgxZjJkMTQ5ZCwgMHgwNzM2ZjJjMCwgMHgwNzQ5NGViZCwgMHgxZjI4Y2Y0MywgMHgxZjI3NjA2OSwgMHgwNzRmNmNkNywgMHgwNzYxYzU3NCwgMHgxZjIzMGNhNSwKLQkweDFmMjE5OGZkLCAweDA3NjdlMjZjLCAweDA3N2EzNzlkLCAweDFmMWQzNmQyLCAweDFmMWJiZTVkLCAweDA3ODA1MzcwLCAweDA3OTJhNTJhLCAweDFmMTc0ZGNlLAotCTB4MWYxNWQwOGQsIDB4MDc5OGJmZDMsIDB4MDdhYjBlMGEsIDB4MWYxMTUxOWMsIDB4MWYwZmNmOTEsIDB4MDdiMTI3ODYsIDB4MDdjMzcyMzAsIDB4MWYwYjQyNDAsCi0JMHgxZjA5YmI2YiwgMHgwN2M5OGE3YSwgMHgwN2RiZDE4YywgMHgxZjA1MWZiZSwgMHgxZjAzOTQxZiwgMHgwN2UxZThhMSwgMHgwN2Y0MmMwZSwgMHgxZWZlZWExOSwKLQkweDFlZmQ1OWIzLCAweDA3ZmE0MWViLCAweDA4MGM4MWE5LCAweDFlZjhhMTU1LCAweDFlZjcwYzI4LCAweDA4MTI5NjRhLCAweDA4MjRkMjRkLCAweDFlZjI0NTc3LAotCTB4MWVmMGFiODQsIDB4MDgyYWU1YWQsIDB4MDgzZDFkZWEsIDB4MWVlYmQ2ODIsIDB4MWVlYTM3Y2EsIDB4MDg0MzMwMDcsIDB4MDg1NTY0NzMsIDB4MWVlNTU0N2EsCi0JMHgxZWUzYjBmZSwgMHgwODViNzU0OCwgMHgwODZkYTVkOCwgMHgxZWRlYmY2NCwgMHgxZWRkMTcyNCwgMHgwODczYjU2MiwgMHgwODg1ZTIwOSwgMHgxZWQ4MTc0MiwKLQkweDFlZDY2YTQxLCAweDA4OGJmMDQ0LCAweDA4OWUxOGY5LCAweDFlZDE1YzFhLCAweDFlY2ZhYTU3LCAweDA4YTQyNWUxLCAweDA4YjY0YTk4LCAweDFlY2E4ZGVmLAotCTB4MWVjOGQ3NmMsIDB4MDhiYzU2MmEsIDB4MDhjZTc2ZDgsIDB4MWVjM2FjYzYsIDB4MWVjMWYxODQsIDB4MDhkNDgxMGYsIDB4MDhlNjlkYTgsIDB4MWViY2I4YTMsCi0JMHgxZWJhZjhhMywgMHgwOGVjYTY4MSwgMHgwOGZlYmVmYiwgMHgxZWI1YjE4YSwgMHgxZWIzZWNjZCwgMHgwOTA0YzY3MywgMHgwOTE2ZGFjMiwgMHgxZWFlOTc3ZiwKLQkweDFlYWNjZTA3LCAweDA5MWNlMGQ0LCAweDA5MmVmMGVkLCAweDFlYTc2YTg3LCAweDFlYTU5YzU1LCAweDA5MzRmNTk2LCAweDA5NDcwMTZlLCAweDFlYTAyYWE3LAotCTB4MWU5ZTU3YmIsIDB4MDk0ZDA0YWEsIDB4MDk1ZjBjMzYsIDB4MWU5OGQ3ZTIsIDB4MWU5NzAwM2UsIDB4MDk2NTBlMDEsIDB4MDk3NzExMzYsIDB4MWU5MTcyM2UsCi0JMHgxZThmOTVlMywgMHgwOTdkMTE4ZCwgMHgwOThmMTA2MCwgMHgxZTg5ZjliZiwgMHgxZTg4MThhZCwgMHgwOTk1MGYzZiwgMHgwOWE3MDlhNCwgMHgxZTgyNmU2OSwKLQkweDFlODA4OGEyLCAweDA5YWQwNzA3LCAweDA5YmVmY2Y0LCAweDFlN2FkMDQxLCAweDFlNzhlNWM3LCAweDA5YzRmOGQ4LCAweDA5ZDZlYTQwLCAweDFlNzMxZjRjLAotCTB4MWU3MTMwMWYsIDB4MDlkY2U0YTEsIDB4MDllZWQxN2IsIDB4MWU2YjViOGYsIDB4MWU2OTY3YjEsIDB4MDlmNGNhNTYsIDB4MGEwNmIyOTYsIDB4MWU2Mzg1MGUsCi0JMHgxZTYxOGM4MCwgMHgwYTBjYTllNiwgMHgwYTFlOGQ4MSwgMHgxZTViOWJjZSwgMHgxZTU5OWU5MSwgMHgwYTI0ODM0MywgMHgwYTM2NjIyZSwgMHgxZTUzOWZkNCwKLQkweDFlNTE5ZGVhLCAweDBhM2M1NjVlLCAweDBhNGUzMDhmLCAweDFlNGI5MTI2LCAweDFlNDk4YThlLCAweDBhNTQyMzI5LCAweDBhNjVmODk0LCAweDFlNDM2ZmM3LAotCTB4MWU0MTY0ODUsIDB4MGE2YmU5OTUsIDB4MGE3ZGJhMmYsIDB4MWUzYjNiYmQsIDB4MWUzOTJiZDEsIDB4MGE4M2E5OTMsIDB4MGE5NTc1NTEsIDB4MWUzMmY1MGUsCi0JMHgxZTMwZTA3OSwgMHgwYTliNjMxNSwgMHgwYWFkMjllYywgMHgxZTJhOWJiZCwgMHgxZTI4ODI4MSwgMHgwYWIzMTYwYywgMHgwYWM0ZDdmMSwgMHgxZTIyMmZkMSwKLQkweDFlMjAxMWVlLCAweDBhY2FjMjZhLCAweDBhZGM3ZjUyLCAweDFlMTliMTRmLCAweDFlMTc4ZWM3LCAweDBhZTI2ODFmLCAweDBhZjQxZmZmLCAweDFlMTEyMDNiLAotCTB4MWUwZWY5MTAsIDB4MGFmYTA3MWQsIDB4MGIwYmI5ZWIsIDB4MWUwODdjOWIsIDB4MWUwNjUwY2UsIDB4MGIxMTlmNTYsIDB4MGIyMzRkMDcsIDB4MWRmZmM2NzQsCi0JMHgxZGZkOTYwNiwgMHgwYjI5MzBiYiwgMHgwYjNhZDk0MywgMHgxZGY2ZmRjYywgMHgxZGY0YzhiZiwgMHgwYjQwYmIzZSwgMHgwYjUyNWU5MiwgMHgxZGVlMjJhOSwKLQkweDFkZWJlOGZkLCAweDBiNTgzZWNmLCAweDBiNjlkY2U2LCAweDFkZTUzNTBmLCAweDFkZTJmNmM2LCAweDBiNmZiYjYyLCAweDBiODE1NDJmLCAweDFkZGMzNTA0LAotCTB4MWRkOWYyMjAsIDB4MGI4NzMwZTYsIDB4MGI5OGM0NWYsIDB4MWRkMzIyOGUsIDB4MWRkMGRiMTAsIDB4MGI5ZTlmNGQsIDB4MGJiMDJkNjgsIDB4MWRjOWZkYjIsCi0JMHgxZGM3YjE5YiwgMHgwYmI2MDY4YSwgMHgwYmM3OGYzYiwgMHgxZGMwYzY3NiwgMHgxZGJlNzVjOCwgMHgwYmNkNjY4ZSwgMHgwYmRlZTljYSwgMHgxZGI3N2NkZiwKLQkweDFkYjUyNzljLCAweDBiZTRiZjRhLCAweDBiZjYzZDA3LCAweDFkYWUyMGY0LCAweDFkYWJjNzFkLCAweDBiZmMxMGFmLCAweDBjMGQ4OGUyLCAweDFkYTRiMmJhLAotCTB4MWRhMjU0NTAsIDB4MGMxMzVhYjAsIDB4MGMyNGNkNGUsIDB4MWQ5YjMyMzcsIDB4MWQ5OGNmM2IsIDB4MGMyYTlkM2UsIDB4MGMzYzBhM2QsIDB4MWQ5MTlmNzAsCi0JMHgxZDhmMzdlNSwgMHgwYzQxZDg0YiwgMHgwYzUzM2ZhMCwgMHgxZDg3ZmE2ZCwgMHgxZDg1OGU1MywgMHgwYzU5MGJjOSwgMHgwYzZhNmQ2OCwgMHgxZDdlNDMzMiwKLQkweDFkN2JkMjhiLCAweDBjNzAzN2E4LCAweDBjODE5Mzg4LCAweDFkNzQ3OWM1LCAweDFkNzIwNDkzLCAweDBjODc1YmRiLCAweDBjOThiMWYwLCAweDFkNmE5ZTJlLAotCTB4MWQ2ODI0NzIsIDB4MGM5ZTc4NTQsIDB4MGNhZmM4OTQsIDB4MWQ2MGIwNzAsIDB4MWQ1ZTMyMmMsIDB4MGNiNThkMDQsIDB4MGNjNmQ3NjQsIDB4MWQ1NmIwOTQsCi0JMHgxZDU0MmRjOSwgMHgwY2NjOTlkZSwgMHgwY2RkZGU1MywgMHgxZDRjOWU5ZiwgMHgxZDRhMTc0ZiwgMHgwY2UzOWVkMiwgMHgwY2Y0ZGQ1MiwgMHgxZDQyN2E5NywKLQkweDFkM2ZlZWMzLCAweDBjZmE5YmQyLCAweDBkMGJkNDUyLCAweDFkMzg0NDgzLCAweDFkMzViNDJkLCAweDBkMTE5MGQxLCAweDBkMjJjMzQ3LCAweDFkMmRmYzY4LAotCTB4MWQyYjY3OTEsIDB4MGQyODdkYzEsIDB4MGQzOWFhMjEsIDB4MWQyM2EyNGUsIDB4MWQyMTA4ZjgsIDB4MGQzZjYyOTIsIDB4MGQ1MDg4ZDMsIDB4MWQxOTM2M2EsCi0JMHgxZDE2OTg2NywgMHgwZDU2M2YzOCwgMHgwZDY3NWY0ZSwgMHgxZDBlYjgzMywgMHgxZDBjMTVlNCwgMHgwZDZkMTNhMywgMHgwZDdlMmQ4NSwgMHgxZDA0MjgzZiwKLQkweDFkMDE4MTc2LCAweDBkODNkZmM2LCAweDBkOTRmMzY5LCAweDFjZjk4NjY2LCAweDFjZjZkYjI0LCAweDBkOWFhMzkzLCAweDBkYWJiMGVjLCAweDFjZWVkMmFkLAotCTB4MWNlYzIyZjQsIDB4MGRiMTVlZmMsIDB4MGRjMjY2MDAsIDB4MWNlNDBkMWIsIDB4MWNlMTU4ZWQsIDB4MGRjODExZjMsIDB4MGRkOTEyOTgsIDB4MWNkOTM1YjcsCi0JMHgxY2Q2N2QxNSwgMHgwZGRlYmM2OSwgMHgwZGVmYjZhNSwgMHgxY2NlNGM4NywgMHgxY2NiOGY3NCwgMHgwZGY1NWU1MSwgMHgwZTA2NTIxOSwgMHgxY2MzNTE5MiwKLQkweDFjYzA5MDBmLCAweDBlMGJmNzljLCAweDBlMWNlNGU2LCAweDFjYjg0NGRmLCAweDFjYjU3ZWVlLCAweDBlMjI4ODNlLCAweDBlMzM2ZWZmLCAweDFjYWQyNjc1LAotCTB4MWNhYTVjMTcsIDB4MGUzOTEwMjcsIDB4MGU0OWYwNTUsIDB4MWNhMWY2NWIsIDB4MWM5ZjI3OTIsIDB4MGU0ZjhmNGIsIDB4MGU2MDY4ZGIsIDB4MWM5NmI0OTcsCi0JMHgxYzkzZTE2NSwgMHgwZTY2MDU5YSwgMHgwZTc2ZDg4MywgMHgxYzhiNjEzMSwgMHgxYzg4ODk5NywgMHgwZTdjNzMwOCwgMHgwZThkM2YzZSwgMHgxYzdmZmMyZiwKLQkweDFjN2QyMDJmLCAweDBlOTJkNzg3LCAweDBlYTM5ZDAwLCAweDFjNzQ4NTk5LCAweDFjNzFhNTM1LCAweDBlYTkzMzA4LCAweDBlYjlmMWJhLCAweDFjNjhmZDc1LAotCTB4MWM2NjE4YWUsIDB4MGViZjg1N2QsIDB4MGVkMDNkNWUsIDB4MWM1ZDYzY2EsIDB4MWM1YTdhYTQsIDB4MGVkNWNlZGEsIDB4MGVlNjdmZGYsIDB4MWM1MWI4YTEsCi0JMHgxYzRlY2IxYywgMHgwZWVjMGYxMCwgMHgwZWZjYjkyZiwgMHgxYzQ1ZmMwMCwgMHgxYzQzMGExZCwgMHgwZjAyNDYxMiwgMHgwZjEyZTk0MSwgMHgxYzNhMmRlZCwKLQkweDFjMzczN2IwLCAweDBmMTg3M2QyLCAweDBmMjkxMDA2LCAweDFjMmU0ZTcyLCAweDFjMmI1M2RiLCAweDBmMmU5ODQyLCAweDBmM2YyZDcxLCAweDFjMjI1ZDk0LAotCTB4MWMxZjVlYTYsIDB4MGY0NGIzNTQsIDB4MGY1NTQxNzUsIDB4MWMxNjViNWIsIDB4MWMxMzU4MTgsIDB4MGY1YWM0ZmMsIDB4MGY2YjRjMDMsIDB4MWMwYTQ3Y2YsCi0JMHgxYzA3NDAzOCwgMHgwZjcwY2QyYSwgMHgwZjgxNGQwZSwgMHgxYmZlMjJmOCwgMHgxYmZiMTcwZiwgMHgwZjg2Y2JkMywgMHgwZjk3NDQ4OSwgMHgxYmYxZWNkYiwKLQkweDFiZWVkY2EyLCAweDBmOWNjMGU3LCAweDBmYWQzMjY1LCAweDFiZTVhNTgyLCAweDFiZTI5MGZiLCAweDBmYjJhYzVhLCAweDBmYzMxNjk3LCAweDFiZDk0Y2Y0LAotCTB4MWJkNjM0MjEsIDB4MGZjODhlMWUsIDB4MGZkOGYxMGYsIDB4MWJjY2UzMzcsIDB4MWJjOWM2MWEsIDB4MGZkZTY2MjYsIDB4MGZlZWMxYzAsIDB4MWJjMDY4NTUsCi0JMHgxYmJkNDZmMCwgMHgwZmY0MzQ2NCwgMHgxMDA0ODg5ZSwgMHgxYmIzZGM1NSwgMHgxYmIwYjZhOSwgMHgxMDA5ZjhjYiwgMHgxMDFhNDU5YSwgMHgxYmE3M2YzZCwKLQkweDFiYTQxNTRkLCAweDEwMWZiMzRkLCAweDEwMmZmOGE4LCAweDFiOWE5MTE3LCAweDFiOTc2MmU0LCAweDEwMzU2M2RjLCAweDEwNDVhMWI5LCAweDFiOGRkMWVhLAotCTB4MWI4YTlmNzcsIDB4MTA0YjBhNmMsIDB4MTA1YjQwYzEsIDB4MWI4MTAxYmUsIDB4MWI3ZGNiMGMsIDB4MTA2MGE2ZWYsIDB4MTA3MGQ1YjEsIDB4MWI3NDIwOWIsCi0JMHgxYjcwZTVhYywgMHgxMDc2Mzk1OCwgMHgxMDg2NjA3ZSwgMHgxYjY3MmU4OCwgMHgxYjYzZWY1ZiwgMHgxMDhiYzE5YSwgMHgxMDliZTExOSwgMHgxYjVhMmI4ZSwKLQkweDFiNTZlODJjLCAweDEwYTEzZmE2LCAweDEwYjE1Nzc1LCAweDFiNGQxN2I0LCAweDFiNDlkMDFjLCAweDEwYjZiMzcxLCAweDEwYzZjMzg1LCAweDFiM2ZmMzA0LAotCTB4MWIzY2E3MzcsIDB4MTBjYzFjZWMsIDB4MTBkYzI1M2MsIDB4MWIzMmJkODQsIDB4MWIyZjZkODUsIDB4MTBlMTdjMGIsIDB4MTBmMTdjOGQsIDB4MWIyNTc3M2QsCi0JMHgxYjIyMjMwZSwgMHgxMGY2ZDBjMCwgMHgxMTA2Yzk2YSwgMHgxYjE4MjAzOCwgMHgxYjE0YzdkYSwgMHgxMTBjMWFmZSwgMHgxMTFjMGJjNiwgMHgxYjBhYjg3YywKLQkweDFiMDc1YmYxLCAweDExMjE1YWI4LCAweDExMzE0Mzk1LCAweDFhZmQ0MDEyLCAweDFhZjlkZjVkLCAweDExMzY4ZmUxLCAweDExNDY3MGM4LCAweDFhZWZiNzAyLAotCTB4MWFlYzUyMjUsIDB4MTE0YmJhNmIsIDB4MTE1YjkzNTQsIDB4MWFlMjFkNTQsIDB4MWFkZWI0NTEsIDB4MTE2MGRhNGIsIDB4MTE3MGFiMmEsIDB4MWFkNDczMTEsCi0JMHgxYWQxMDVlOSwgMHgxMTc1ZWY3MiwgMHgxMTg1YjgzZiwgMHgxYWM2Yjg0MSwgMHgxYWMzNDZmOCwgMHgxMThhZjlkNCwgMHgxMTlhYmE4NCwgMHgxYWI4ZWNlYywKLQkweDFhYjU3Nzg0LCAweDExOWZmOTY0LCAweDExYWZiMWVlLCAweDFhYWIxMTFjLCAweDFhYTc5Nzk2LCAweDExYjRlZTE0LCAweDExYzQ5ZTZmLCAweDFhOWQyNGQ5LAotCTB4MWE5OWE3MzcsIDB4MTFjOWQ3ZDksIDB4MTFkOTdmZjksIDB4MWE4ZjI4MmIsIDB4MWE4YmE2NzAsIDB4MTFkZWI2YTQsIDB4MTFlZTU2ODIsIDB4MWE4MTFiMWIsCi0JMHgxYTdkOTU0OSwgMHgxMWYzOGE2YSwgMHgxMjAzMjFmYSwgMHgxYTcyZmRiMiwgMHgxYTZmNzNjYSwgMHgxMjA4NTMxYywgMHgxMjE3ZTI1NiwgMHgxYTY0Y2ZmOCwKLQkweDFhNjE0MWZkLCAweDEyMWQxMGFmLCAweDEyMmM5Nzg5LCAweDFhNTY5MWY1LCAweDFhNTJmZmViLCAweDEyMzFjMzE2LCAweDEyNDE0MTg2LCAweDFhNDg0M2I0LAotCTB4MWE0NGFkOWIsIDB4MTI0NjZhNDQsIDB4MTI1NWUwNDEsIDB4MWEzOWU1M2QsIDB4MWEzNjRiMTcsIDB4MTI1YjA2MmIsIDB4MTI2YTczYWMsIDB4MWEyYjc2OTgsCi0JMHgxYTI3ZDg2OCwgMHgxMjZmOTZjMSwgMHgxMjdlZmJiYiwgMHgxYTFjZjdjZSwgMHgxYTE5NTU5NywgMHgxMjg0MWJmNiwgMHgxMjkzNzg2MSwgMHgxYTBlNjhlOSwKLQkweDFhMGFjMmFjLCAweDEyOTg5NWMwLCAweDEyYTdlOTkxLCAweDE5ZmZjOWYxLCAweDE5ZmMxZmIxLCAweDEyYWQwNDEyLCAweDEyYmM0ZjQwLCAweDE5ZjExYWYwLAotCTB4MTllZDZjYWYsIDB4MTJjMTY2ZGUsIDB4MTJkMGE5NjAsIDB4MTllMjViZWUsIDB4MTlkZWE5YWUsIDB4MTJkNWJlMTgsIDB4MTJlNGY3ZTUsIDB4MTlkMzhjZjQsCi0JMHgxOWNmZDZiOCwgMHgxMmVhMDliNCwgMHgxMmY5M2FjMiwgMHgxOWM0YWUwYywgMHgxOWMwZjNkNiwgMHgxMmZlNDlhNiwgMHgxMzBkNzFlYiwgMHgxOWI1YmYzZiwKLQkweDE5YjIwMTExLCAweDEzMTI3ZGUwLCAweDEzMjE5ZDUzLCAweDE5YTZjMDk2LCAweDE5YTJmZTczLCAweDEzMjZhNjU2LCAweDEzMzViY2VmLCAweDE5OTdiMjFiLAotCTB4MTk5M2VjMDQsIDB4MTMzYWMyZmMsIDB4MTM0OWQwYjAsIDB4MTk4ODkzZDYsIDB4MTk4NGM5Y2UsIDB4MTM0ZWQzYzUsIDB4MTM1ZGQ4OGMsIDB4MTk3OTY1ZDAsCi0JMHgxOTc1OTdkYSwgMHgxMzYyZDhhNiwgMHgxMzcxZDQ3NiwgMHgxOTZhMjgxNSwgMHgxOTY2NTYzMiwgMHgxMzc2ZDE5MSwgMHgxMzg1YzQ2MSwgMHgxOTVhZGFhYiwKLQkweDE5NTcwNGRmLCAweDEzOGFiZTdiLCAweDEzOTlhODQxLCAweDE5NGI3ZDllLCAweDE5NDdhM2ViLCAweDEzOWU5ZjU2LCAweDEzYWQ4MDBhLCAweDE5M2MxMGY3LAotCTB4MTkzODMzNWUsIDB4MTNiMjc0MTcsIDB4MTNjMTRiYjAsIDB4MTkyYzk0YmYsIDB4MTkyOGIzNDMsIDB4MTNjNjNjYjIsIDB4MTNkNTBiMjYsIDB4MTkxZDA4ZmYsCi0JMHgxOTE5MjNhMywgMHgxM2Q5ZjkxYiwgMHgxM2U4YmU2MCwgMHgxOTBkNmRjMSwgMHgxOTA5ODQ4OCwgMHgxM2VkYTk0NCwgMHgxM2ZjNjU1MywgMHgxOGZkYzMxMCwKLQkweDE4ZjlkNWZhLCAweDE0MDE0ZDIzLCAweDE0MGZmZmYxLCAweDE4ZWUwOGY0LCAweDE4ZWExODA1LCAweDE0MTRlNGFhLCAweDE0MjM4ZTJmLCAweDE4ZGUzZjc3LAotCTB4MThkYTRhYjIsIDB4MTQyODZmY2UsIDB4MTQzNzEwMDEsIDB4MThjZTY2YTMsIDB4MThjYTZlMGEsIDB4MTQzYmVlODMsIDB4MTQ0YTg1NWIsIDB4MThiZTdlODIsCi0JMHgxOGJhODIxNywgMHgxNDRmNjBiZCwgMHgxNDVkZWUzMCwgMHgxOGFlODcxZSwgMHgxOGFhODZlMywgMHgxNDYyYzY3MCwgMHgxNDcxNGE3NiwgMHgxODllODA4MCwKLQkweDE4OWE3Yzc4LCAweDE0NzYxZjhmLCAweDE0ODQ5YTFmLCAweDE4OGU2YWIyLCAweDE4OGE2MmUwLCAweDE0ODk2YzBmLCAweDE0OTdkZDIwLCAweDE4N2U0NWJlLAotCTB4MTg3YTNhMjUsIDB4MTQ5Y2FiZTQsIDB4MTRhYjEzNmQsIDB4MTg2ZTExYWYsIDB4MTg2YTAyNTAsIDB4MTRhZmRmMDMsIDB4MTRiZTNjZmEsIDB4MTg1ZGNlOGUsCi0JMHgxODU5YmI2YywgMHgxNGMzMDU1ZSwgMHgxNGQxNTliYywgMHgxODRkN2M2NSwgMHgxODQ5NjU4MywgMHgxNGQ2MWVlYiwgMHgxNGU0NjlhNiwgMHgxODNkMWIzZSwKLQkweDE4MzkwMDllLCAweDE0ZTkyYjllLCAweDE0Zjc2Y2FkLCAweDE4MmNhYjI0LCAweDE4Mjg4Y2M4LCAweDE0ZmMyYjZhLCAweDE1MGE2MmM2LCAweDE4MWMyYzIwLAotCTB4MTgxODBhMGMsIDB4MTUwZjFlNDUsIDB4MTUxZDRiZTMsIDB4MTgwYjllM2QsIDB4MTgwNzc4NzMsIDB4MTUyMjA0MjIsIDB4MTUzMDI3ZmIsIDB4MTdmYjAxODUsCi0JMHgxN2Y2ZDgwNywgMHgxNTM0ZGNmNiwgMHgxNTQyZjcwMCwgMHgxN2VhNTYwMiwgMHgxN2U2MjhkMywgMHgxNTQ3YThiNSwgMHgxNTU1YjhlOCwgMHgxN2Q5OWJiZSwKLQkweDE3ZDU2YWUwLCAweDE1NWE2NzU0LCAweDE1Njg2ZGE3LCAweDE3YzhkMmM0LCAweDE3YzQ5ZTNiLCAweDE1NmQxOGM3LCAweDE1N2IxNTMyLCAweDE3YjdmYjFmLAotCTB4MTdiM2MyZWMsIDB4MTU3ZmJkMDMsIDB4MTU4ZGFmN2MsIDB4MTdhNzE0ZDcsIDB4MTdhMmQ4ZmUsIDB4MTU5MjUzZmIsIDB4MTVhMDNjN2EsIDB4MTc5NjFmZjksCi0JMHgxNzkxZTA3YiwgMHgxNWE0ZGRhNSwgMHgxNWIyYmMyMiwgMHgxNzg1MWM4ZSwgMHgxNzgwZDk2ZiwgMHgxNWI3NTlmNSwgMHgxNWM1MmU2NywgMHgxNzc0MGFhMSwKLQkweDE3NmZjM2UzLCAweDE1YzljOGUwLCAweDE1ZDc5MzNmLCAweDE3NjJlYTNkLCAweDE3NWU5ZmUyLCAweDE1ZGMyYTVhLCAweDE1ZTllYTlkLCAweDE3NTFiYjZiLAotCTB4MTc0ZDZkNzcsIDB4MTVlZTdlNTgsIDB4MTVmYzM0NzcsIDB4MTc0MDdlMzcsIDB4MTczYzJjYWMsIDB4MTYwMGM0Y2YsIDB4MTYwZTcwYzEsIDB4MTcyZjMyYWIsCi0JMHgxNzJhZGQ4YywgMHgxNjEyZmRiMywgMHgxNjIwOWY3MCwgMHgxNzFkZDhkMiwgMHgxNzE5ODAyMSwgMHgxNjI1MjhmYSwgMHgxNjMyYzA3OCwgMHgxNzBjNzBiNywKLQkweDE3MDgxNDc3LCAweDE2Mzc0Njk3LCAweDE2NDRkM2QwLCAweDE2ZmFmYTY0LCAweDE2ZjY5YTk3LCAweDE2NDk1NjgwLCAweDE2NTZkOTZhLCAweDE2ZTk3NWU0LAotCTB4MTZlNTEyOGUsIDB4MTY1YjU4YWEsIDB4MTY2OGQxM2UsIDB4MTZkN2UzNDEsIDB4MTZkMzdjNjUsIDB4MTY2ZDRkMGEsIDB4MTY3YWJiM2UsIDB4MTZjNjQyODgsCi0JMHgxNmMxZDgyNywgMHgxNjdmMzM5NCwgMHgxNjhjOTc2MCwgMHgxNmI0OTNjMiwgMHgxNmIwMjVlMCwgMHgxNjkxMGMzZCwgMHgxNjllNjU5YSwgMHgxNmEyZDZmYgotfTsKLQotY29uc3QgaW50IHR3aWRUYWI1MTJbOCo2ICsgMzIqNiArIDEyOCo2XSA9IHsKLQkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDFkOTA2YmNmLCAweDBjM2VmMTUzLCAweDE2YTA5ZTY2LCAweDE2YTA5ZTY2LCAweDBjM2VmMTUzLCAweDFkOTA2YmNmLAotCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWY2Mjk3ZDAsIDB4MDYzZTJlMGYsIDB4MWQ5MDZiY2YsIDB4MGMzZWYxNTMsIDB4MWE5YjY2MjksIDB4MTFjNzNiM2EsCi0JMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxYTliNjYyOSwgMHgxMWM3M2IzYSwgMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHhmOWMxZDFmMSwgMHgxZjYyOTdkMCwKLQkweDAwMDAwMDAwLCAweDIwMDAwMDAwLCAweGYzYzEwZWFkLCAweDFkOTA2YmNmLCAweGU5NWY2MTlhLCAweDE2YTA5ZTY2LCAweGUyNmY5NDMxLCAweDBjM2VmMTUzLAotCTB4MTZhMDllNjYsIDB4MTZhMDllNjYsIDB4MTFjNzNiM2EsIDB4MWE5YjY2MjksIDB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsIDB4MDYzZTJlMGYsIDB4MWY2Mjk3ZDAsCi0JMHhlOTVmNjE5YSwgMHgxNmEwOWU2NiwgMHhlMDlkNjgzMCwgMHgwNjNlMmUwZiwgMHhlMjZmOTQzMSwgMHhmM2MxMGVhZCwgMHhlZTM4YzRjNiwgMHhlNTY0OTlkNywKLQotCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWZkODhkYTQsIDB4MDMyMmY0ZDgsIDB4MWY2Mjk3ZDAsIDB4MDYzZTJlMGYsIDB4MWU5ZjQxNTcsIDB4MDk0YTAzMTcsCi0JMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxZmY2MjFlMywgMHgwMTkxZjY1ZiwgMHgxZmQ4OGRhNCwgMHgwMzIyZjRkOCwgMHgxZmE3NTU3ZiwgMHgwNGIyMDQxYywKLQkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDFmYTc1NTdmLCAweDA0YjIwNDFjLCAweDFlOWY0MTU3LCAweDA5NGEwMzE3LCAweDFjZWQ3YWY0LCAweDBkYWU4ODA1LAotCTB4MWQ5MDZiY2YsIDB4MGMzZWYxNTMsIDB4MWMzOGIyZjIsIDB4MGYxNWFlOWMsIDB4MWE5YjY2MjksIDB4MTFjNzNiM2EsIDB4MThiYzgwNmIsIDB4MTQ0Y2YzMjUsCi0JMHgxZjYyOTdkMCwgMHgwNjNlMmUwZiwgMHgxZjBhN2VmYywgMHgwN2M2N2U1ZiwgMHgxZTlmNDE1NywgMHgwOTRhMDMxNywgMHgxZTIxMjEwNSwgMHgwYWM3Y2QzYiwKLQkweDFhOWI2NjI5LCAweDExYzczYjNhLCAweDE3YjVkZjIyLCAweDE1N2Q2OTM1LCAweDE0NGNmMzI1LCAweDE4YmM4MDZiLCAweDEwNzM4Nzk5LCAweDFiNzI4MzQ1LAotCTB4MTZhMDllNjYsIDB4MTZhMDllNjYsIDB4MTQ0Y2YzMjUsIDB4MThiYzgwNmIsIDB4MTFjNzNiM2EsIDB4MWE5YjY2MjksIDB4MGYxNWFlOWMsIDB4MWMzOGIyZjIsCi0JMHgxZDkwNmJjZiwgMHgwYzNlZjE1MywgMHgxY2VkN2FmNCwgMHgwZGFlODgwNSwgMHgxYzM4YjJmMiwgMHgwZjE1YWU5YywgMHgxYjcyODM0NSwgMHgxMDczODc5OSwKLQkweDBjM2VmMTUzLCAweDFkOTA2YmNmLCAweDA3YzY3ZTVmLCAweDFmMGE3ZWZjLCAweDAzMjJmNGQ4LCAweDFmZDg4ZGE0LCAweGZlNmUwOWExLCAweDFmZjYyMWUzLAotCTB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsIDB4MDk0YTAzMTcsIDB4MWU5ZjQxNTcsIDB4MDYzZTJlMGYsIDB4MWY2Mjk3ZDAsIDB4MDMyMmY0ZDgsIDB4MWZkODhkYTQsCi0JMHgxYTliNjYyOSwgMHgxMWM3M2IzYSwgMHgxOWIzZTA0OCwgMHgxMzBmZjdmZCwgMHgxOGJjODA2YiwgMHgxNDRjZjMyNSwgMHgxN2I1ZGYyMiwgMHgxNTdkNjkzNSwKLQkweGY5YzFkMWYxLCAweDFmNjI5N2QwLCAweGY1MzgzMmM1LCAweDFlMjEyMTA1LCAweGYwZWE1MTY0LCAweDFjMzhiMmYyLCAweGVjZjAwODAzLCAweDE5YjNlMDQ4LAotCTB4MDAwMDAwMDAsIDB4MjAwMDAwMDAsIDB4ZmNkZDBiMjgsIDB4MWZkODhkYTQsIDB4ZjljMWQxZjEsIDB4MWY2Mjk3ZDAsIDB4ZjZiNWZjZTksIDB4MWU5ZjQxNTcsCi0JMHgxNmEwOWU2NiwgMHgxNmEwOWU2NiwgMHgxNTdkNjkzNSwgMHgxN2I1ZGYyMiwgMHgxNDRjZjMyNSwgMHgxOGJjODA2YiwgMHgxMzBmZjdmZCwgMHgxOWIzZTA0OCwKLQkweGU5NWY2MTlhLCAweDE2YTA5ZTY2LCAweGU2NGMxZmI4LCAweDEzMGZmN2ZkLCAweGUzYzc0ZDBlLCAweDBmMTVhZTljLCAweGUxZGVkZWZiLCAweDBhYzdjZDNiLAotCTB4ZjNjMTBlYWQsIDB4MWQ5MDZiY2YsIDB4ZjBlYTUxNjQsIDB4MWMzOGIyZjIsIDB4ZWUzOGM0YzYsIDB4MWE5YjY2MjksIDB4ZWJiMzBjZGIsIDB4MThiYzgwNmIsCi0JMHgxMWM3M2IzYSwgMHgxYTliNjYyOSwgMHgxMDczODc5OSwgMHgxYjcyODM0NSwgMHgwZjE1YWU5YywgMHgxYzM4YjJmMiwgMHgwZGFlODgwNSwgMHgxY2VkN2FmNCwKLQkweGUwOWQ2ODMwLCAweDA2M2UyZTBmLCAweGUwMDlkZTFkLCAweDAxOTFmNjVmLCAweGUwMjc3MjVjLCAweGZjZGQwYjI4LCAweGUwZjU4MTA0LCAweGY4Mzk4MWExLAotCTB4ZTk1ZjYxOWEsIDB4MTZhMDllNjYsIDB4ZTc0MzdmOTUsIDB4MTQ0Y2YzMjUsIDB4ZTU2NDk5ZDcsIDB4MTFjNzNiM2EsIDB4ZTNjNzRkMGUsIDB4MGYxNWFlOWMsCi0JMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHgwYWM3Y2QzYiwgMHgxZTIxMjEwNSwgMHgwOTRhMDMxNywgMHgxZTlmNDE1NywgMHgwN2M2N2U1ZiwgMHgxZjBhN2VmYywKLQkweGUyNmY5NDMxLCAweGYzYzEwZWFkLCAweGU0OGQ3Y2JiLCAweGVmOGM3ODY3LCAweGU3NDM3Zjk1LCAweGViYjMwY2RiLCAweGVhODI5NmNiLCAweGU4NGEyMGRlLAotCTB4ZTI2Zjk0MzEsIDB4MGMzZWYxNTMsIDB4ZTE2MGJlYTksIDB4MDk0YTAzMTcsIDB4ZTA5ZDY4MzAsIDB4MDYzZTJlMGYsIDB4ZTAyNzcyNWMsIDB4MDMyMmY0ZDgsCi0JMHgwNjNlMmUwZiwgMHgxZjYyOTdkMCwgMHgwNGIyMDQxYywgMHgxZmE3NTU3ZiwgMHgwMzIyZjRkOCwgMHgxZmQ4OGRhNCwgMHgwMTkxZjY1ZiwgMHgxZmY2MjFlMywKLQkweGVlMzhjNGM2LCAweGU1NjQ5OWQ3LCAweGYyNTE3N2ZiLCAweGUzMTI4NTBjLCAweGY2YjVmY2U5LCAweGUxNjBiZWE5LCAweGZiNGRmYmU0LCAweGUwNThhYTgxLAotCi0JMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxZmZkODg2MSwgMHgwMGM5MGFiMCwgMHgxZmY2MjFlMywgMHgwMTkxZjY1ZiwgMHgxZmU5Y2RhZCwgMHgwMjVhYTQxMiwKLQkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDFmZmY2MjE3LCAweDAwNjQ4NzQ4LCAweDFmZmQ4ODYxLCAweDAwYzkwYWIwLCAweDFmZmE3MmYwLCAweDAxMmQ4NjU3LAotCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWZmYTcyZjAsIDB4MDEyZDg2NTcsIDB4MWZlOWNkYWQsIDB4MDI1YWE0MTIsIDB4MWZjZTE1ZmQsIDB4MDM4NmYwYjksCi0JMHgxZmQ4OGRhNCwgMHgwMzIyZjRkOCwgMHgxZmMyNjQ3MSwgMHgwM2VhYzljYiwgMHgxZmE3NTU3ZiwgMHgwNGIyMDQxYywgMHgxZjg3NjRmYSwgMHgwNTc4ODUxMSwKLQkweDFmZjYyMWUzLCAweDAxOTFmNjVmLCAweDFmZjA5NTY2LCAweDAxZjY1NmU4LCAweDFmZTljZGFkLCAweDAyNWFhNDEyLCAweDFmZTFjYWZkLCAweDAyYmVkYTAxLAotCTB4MWZhNzU1N2YsIDB4MDRiMjA0MWMsIDB4MWY3NTk5YTQsIDB4MDVkYjc2NzgsIDB4MWYzOGYzYWMsIDB4MDcwMmUwOWIsIDB4MWVmMTc4YTQsIDB4MDgyN2RjMDcsCi0JMHgxZjYyOTdkMCwgMHgwNjNlMmUwZiwgMHgxZjM4ZjNhYywgMHgwNzAyZTA5YiwgMHgxZjBhN2VmYywgMHgwN2M2N2U1ZiwgMHgxZWQ3NDBlNywgMHgwODg4ZTkzMSwKLQkweDFmZDg4ZGE0LCAweDAzMjJmNGQ4LCAweDFmY2UxNWZkLCAweDAzODZmMGI5LCAweDFmYzI2NDcxLCAweDAzZWFjOWNiLCAweDFmYjU3OTcyLCAweDA0NGU3YzM0LAotCTB4MWU5ZjQxNTcsIDB4MDk0YTAzMTcsIDB4MWU0MjZhNGIsIDB4MGE2OGYxMjEsIDB4MWRkYjEzYjcsIDB4MGI4NDQyOTgsIDB4MWQ2OTYxNzQsIDB4MGM5Yjk1MzIsCi0JMHgxZTlmNDE1NywgMHgwOTRhMDMxNywgMHgxZTYyODhlYywgMHgwYTA5YWU0YSwgMHgxZTIxMjEwNSwgMHgwYWM3Y2QzYiwgMHgxZGRiMTNiNywgMHgwYjg0NDI5OCwKLQkweDFmYTc1NTdmLCAweDA0YjIwNDFjLCAweDFmOTdmOTI1LCAweDA1MTU1ZGFjLCAweDFmODc2NGZhLCAweDA1Nzg4NTExLCAweDFmNzU5OWE0LCAweDA1ZGI3Njc4LAotCTB4MWNlZDdhZjQsIDB4MGRhZTg4MDUsIDB4MWM2NzhiMzUsIDB4MGViY2JiYWUsIDB4MWJkN2MwYWMsIDB4MGZjNWQyNmUsIDB4MWIzZTRkM2YsIDB4MTBjOTcwNGQsCi0JMHgxZDkwNmJjZiwgMHgwYzNlZjE1MywgMHgxZDQxMzRkMSwgMHgwY2Y3YmNhMiwgMHgxY2VkN2FmNCwgMHgwZGFlODgwNSwgMHgxYzk1NGIyMSwgMHgwZTYzMzc0ZCwKLQkweDFmNjI5N2QwLCAweDA2M2UyZTBmLCAweDFmNGU2MDNiLCAweDA2YTBhODA5LCAweDFmMzhmM2FjLCAweDA3MDJlMDliLCAweDFmMjI1MmY3LCAweDA3NjRkM2Y5LAotCTB4MWE5YjY2MjksIDB4MTFjNzNiM2EsIDB4MTllZjQzZWYsIDB4MTJiZWRiMjYsIDB4MTkzYTIyNGEsIDB4MTNhZmZhMjksIDB4MTg3YzQwMTAsIDB4MTQ5YTQ0OWMsCi0JMHgxYzM4YjJmMiwgMHgwZjE1YWU5YywgMHgxYmQ3YzBhYywgMHgwZmM1ZDI2ZSwgMHgxYjcyODM0NSwgMHgxMDczODc5OSwgMHgxYjA5MGE1OCwgMHgxMTFlYjM1NCwKLQkweDFmMGE3ZWZjLCAweDA3YzY3ZTVmLCAweDFlZjE3OGE0LCAweDA4MjdkYzA3LCAweDFlZDc0MGU3LCAweDA4ODhlOTMxLCAweDFlYmJkOGM5LCAweDA4ZTlhMjIwLAotCTB4MTdiNWRmMjIsIDB4MTU3ZDY5MzUsIDB4MTZlNzQ0NTUsIDB4MTY1OTE5MjYsIDB4MTYxMGI3NTUsIDB4MTcyZDA4MzgsIDB4MTUzMjgyOTMsIDB4MTdmOGVjZTMsCi0JMHgxYTliNjYyOSwgMHgxMWM3M2IzYSwgMHgxYTI5YTdhMCwgMHgxMjZkMDU0ZCwgMHgxOWIzZTA0OCwgMHgxMzBmZjdmZCwgMHgxOTNhMjI0YSwgMHgxM2FmZmEyOSwKLQkweDFlOWY0MTU3LCAweDA5NGEwMzE3LCAweDFlODE3YmFiLCAweDA5YWEwODYxLCAweDFlNjI4OGVjLCAweDBhMDlhZTRhLCAweDFlNDI2YTRiLCAweDBhNjhmMTIxLAotCTB4MTQ0Y2YzMjUsIDB4MThiYzgwNmIsIDB4MTM2MDU4YjEsIDB4MTk3NzdlZjUsIDB4MTI2ZDA1NGQsIDB4MWEyOWE3YTAsIDB4MTE3MzRkNjQsIDB4MWFkMmJjOWUsCi0JMHgxOGJjODA2YiwgMHgxNDRjZjMyNSwgMHgxODNiMGUwYywgMHgxNGU2Y2FiYywgMHgxN2I1ZGYyMiwgMHgxNTdkNjkzNSwgMHgxNzJkMDgzOCwgMHgxNjEwYjc1NSwKLQkweDFlMjEyMTA1LCAweDBhYzdjZDNiLCAweDFkZmVhZTYyLCAweDBiMjYzZWVmLCAweDFkZGIxM2I3LCAweDBiODQ0Mjk4LCAweDFkYjY1MjYyLCAweDBiZTFkNDk5LAotCTB4MTA3Mzg3OTksIDB4MWI3MjgzNDUsIDB4MGY2ZTBjYTksIDB4MWMwOGM0MjYsIDB4MGU2MzM3NGQsIDB4MWM5NTRiMjEsIDB4MGQ1MzY0MTYsIDB4MWQxN2U3NzQsCi0JMHgxNmEwOWU2NiwgMHgxNmEwOWU2NiwgMHgxNjEwYjc1NSwgMHgxNzJkMDgzOCwgMHgxNTdkNjkzNSwgMHgxN2I1ZGYyMiwgMHgxNGU2Y2FiYywgMHgxODNiMGUwYywKLQkweDFkOTA2YmNmLCAweDBjM2VmMTUzLCAweDFkNjk2MTc0LCAweDBjOWI5NTMyLCAweDFkNDEzNGQxLCAweDBjZjdiY2EyLCAweDFkMTdlNzc0LCAweDBkNTM2NDE2LAotCTB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsIDB4MGIyNjNlZWYsIDB4MWRmZWFlNjIsIDB4MGEwOWFlNGEsIDB4MWU2Mjg4ZWMsIDB4MDhlOWEyMjAsIDB4MWViYmQ4YzksCi0JMHgxNDRjZjMyNSwgMHgxOGJjODA2YiwgMHgxM2FmZmEyOSwgMHgxOTNhMjI0YSwgMHgxMzBmZjdmZCwgMHgxOWIzZTA0OCwgMHgxMjZkMDU0ZCwgMHgxYTI5YTdhMCwKLQkweDFjZWQ3YWY0LCAweDBkYWU4ODA1LCAweDFjYzFmMGY0LCAweDBlMDkyNGVjLCAweDFjOTU0YjIxLCAweDBlNjMzNzRkLCAweDFjNjc4YjM1LCAweDBlYmNiYmFlLAotCTB4MDdjNjdlNWYsIDB4MWYwYTdlZmMsIDB4MDZhMGE4MDksIDB4MWY0ZTYwM2IsIDB4MDU3ODg1MTEsIDB4MWY4NzY0ZmEsIDB4MDQ0ZTdjMzQsIDB4MWZiNTc5NzIsCi0JMHgxMWM3M2IzYSwgMHgxYTliNjYyOSwgMHgxMTFlYjM1NCwgMHgxYjA5MGE1OCwgMHgxMDczODc5OSwgMHgxYjcyODM0NSwgMHgwZmM1ZDI2ZSwgMHgxYmQ3YzBhYywKLQkweDFjMzhiMmYyLCAweDBmMTVhZTljLCAweDFjMDhjNDI2LCAweDBmNmUwY2E5LCAweDFiZDdjMGFjLCAweDBmYzVkMjZlLCAweDFiYTVhYTY3LCAweDEwMWNmYzg3LAotCTB4MDMyMmY0ZDgsIDB4MWZkODhkYTQsIDB4MDFmNjU2ZTgsIDB4MWZmMDk1NjYsIDB4MDBjOTBhYjAsIDB4MWZmZDg4NjEsIDB4ZmY5Yjc4YjgsIDB4MWZmZjYyMTcsCi0JMHgwZjE1YWU5YywgMHgxYzM4YjJmMiwgMHgwZTYzMzc0ZCwgMHgxYzk1NGIyMSwgMHgwZGFlODgwNSwgMHgxY2VkN2FmNCwgMHgwY2Y3YmNhMiwgMHgxZDQxMzRkMSwKLQkweDFiNzI4MzQ1LCAweDEwNzM4Nzk5LCAweDFiM2U0ZDNmLCAweDEwYzk3MDRkLCAweDFiMDkwYTU4LCAweDExMWViMzU0LCAweDFhZDJiYzllLCAweDExNzM0ZDY0LAotCTB4ZmU2ZTA5YTEsIDB4MWZmNjIxZTMsIDB4ZmQ0MTI1ZmYsIDB4MWZlMWNhZmQsIDB4ZmMxNTM2MzUsIDB4MWZjMjY0NzEsIDB4ZmFlYWEyNTQsIDB4MWY5N2Y5MjUsCi0JMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHgwYjg0NDI5OCwgMHgxZGRiMTNiNywgMHgwYWM3Y2QzYiwgMHgxZTIxMjEwNSwgMHgwYTA5YWU0YSwgMHgxZTYyODhlYywKLQkweDFhOWI2NjI5LCAweDExYzczYjNhLCAweDFhNjMwOTFiLCAweDEyMWE3OTk5LCAweDFhMjlhN2EwLCAweDEyNmQwNTRkLCAweDE5ZWY0M2VmLCAweDEyYmVkYjI2LAotCTB4ZjljMWQxZjEsIDB4MWY2Mjk3ZDAsIDB4Zjg5YjJjMDcsIDB4MWYyMjUyZjcsIDB4Zjc3NzE2Y2YsIDB4MWVkNzQwZTcsIDB4ZjY1NWY3OWYsIDB4MWU4MTdiYWIsCi0JMHgwOTRhMDMxNywgMHgxZTlmNDE1NywgMHgwODg4ZTkzMSwgMHgxZWQ3NDBlNywgMHgwN2M2N2U1ZiwgMHgxZjBhN2VmYywgMHgwNzAyZTA5YiwgMHgxZjM4ZjNhYywKLQkweDE5YjNlMDQ4LCAweDEzMGZmN2ZkLCAweDE5Nzc3ZWY1LCAweDEzNjA1OGIxLCAweDE5M2EyMjRhLCAweDEzYWZmYTI5LCAweDE4ZmJjY2E0LCAweDEzZmVkOTUzLAotCTB4ZjUzODMyYzUsIDB4MWUyMTIxMDUsIDB4ZjQxZTJiNjcsIDB4MWRiNjUyNjIsIDB4ZjMwODQzNWUsIDB4MWQ0MTM0ZDEsIDB4ZjFmNmRiMTQsIDB4MWNjMWYwZjQsCi0JMHgwNjNlMmUwZiwgMHgxZjYyOTdkMCwgMHgwNTc4ODUxMSwgMHgxZjg3NjRmYSwgMHgwNGIyMDQxYywgMHgxZmE3NTU3ZiwgMHgwM2VhYzljYiwgMHgxZmMyNjQ3MSwKLQkweDE4YmM4MDZiLCAweDE0NGNmMzI1LCAweDE4N2M0MDEwLCAweDE0OWE0NDljLCAweDE4M2IwZTBjLCAweDE0ZTZjYWJjLCAweDE3ZjhlY2UzLCAweDE1MzI4MjkzLAotCTB4ZjBlYTUxNjQsIDB4MWMzOGIyZjIsIDB4ZWZlMzAzNzksIDB4MWJhNWFhNjcsIDB4ZWVlMTRjYWMsIDB4MWIwOTBhNTgsIDB4ZWRlNTg2NjcsIDB4MWE2MzA5MWIsCi0JMHgwMzIyZjRkOCwgMHgxZmQ4OGRhNCwgMHgwMjVhYTQxMiwgMHgxZmU5Y2RhZCwgMHgwMTkxZjY1ZiwgMHgxZmY2MjFlMywgMHgwMGM5MGFiMCwgMHgxZmZkODg2MSwKLQkweDE3YjVkZjIyLCAweDE1N2Q2OTM1LCAweDE3NzFlNzVmLCAweDE1Yzc3YmJlLCAweDE3MmQwODM4LCAweDE2MTBiNzU1LCAweDE2ZTc0NDU1LCAweDE2NTkxOTI2LAotCTB4ZWNmMDA4MDMsIDB4MTliM2UwNDgsIDB4ZWMwMTI2YWQsIDB4MThmYmNjYTQsIDB4ZWIxOTM1NDQsIDB4MTgzYjBlMGMsIDB4ZWEzODg0NDIsIDB4MTc3MWU3NWYsCi0JMHgwMDAwMDAwMCwgMHgyMDAwMDAwMCwgMHhmZjM2ZjU1MCwgMHgxZmZkODg2MSwgMHhmZTZlMDlhMSwgMHgxZmY2MjFlMywgMHhmZGE1NWJlZSwgMHgxZmU5Y2RhZCwKLQkweDE2YTA5ZTY2LCAweDE2YTA5ZTY2LCAweDE2NTkxOTI2LCAweDE2ZTc0NDU1LCAweDE2MTBiNzU1LCAweDE3MmQwODM4LCAweDE1Yzc3YmJlLCAweDE3NzFlNzVmLAotCTB4ZTk1ZjYxOWEsIDB4MTZhMDllNjYsIDB4ZTg4ZTE4YTEsIDB4MTVjNzdiYmUsIDB4ZTdjNGYxZjQsIDB4MTRlNmNhYmMsIDB4ZTcwNDMzNWMsIDB4MTNmZWQ5NTMsCi0JMHhmY2RkMGIyOCwgMHgxZmQ4OGRhNCwgMHhmYzE1MzYzNSwgMHgxZmMyNjQ3MSwgMHhmYjRkZmJlNCwgMHgxZmE3NTU3ZiwgMHhmYTg3N2FlZiwgMHgxZjg3NjRmYSwKLQkweDE1N2Q2OTM1LCAweDE3YjVkZjIyLCAweDE1MzI4MjkzLCAweDE3ZjhlY2UzLCAweDE0ZTZjYWJjLCAweDE4M2IwZTBjLCAweDE0OWE0NDljLCAweDE4N2M0MDEwLAotCTB4ZTY0YzFmYjgsIDB4MTMwZmY3ZmQsIDB4ZTU5Y2Y2ZTUsIDB4MTIxYTc5OTksIDB4ZTRmNmY1YTgsIDB4MTExZWIzNTQsIDB4ZTQ1YTU1OTksIDB4MTAxY2ZjODcsCi0JMHhmOWMxZDFmMSwgMHgxZjYyOTdkMCwgMHhmOGZkMWY2NSwgMHgxZjM4ZjNhYywgMHhmODM5ODFhMSwgMHgxZjBhN2VmYywgMHhmNzc3MTZjZiwgMHgxZWQ3NDBlNywKLQkweDE0NGNmMzI1LCAweDE4YmM4MDZiLCAweDEzZmVkOTUzLCAweDE4ZmJjY2E0LCAweDEzYWZmYTI5LCAweDE5M2EyMjRhLCAweDEzNjA1OGIxLCAweDE5Nzc3ZWY1LAotCTB4ZTNjNzRkMGUsIDB4MGYxNWFlOWMsIDB4ZTMzZTBmMGMsIDB4MGUwOTI0ZWMsIDB4ZTJiZWNiMmYsIDB4MGNmN2JjYTIsIDB4ZTI0OWFkOWUsIDB4MGJlMWQ0OTksCi0JMHhmNmI1ZmNlOSwgMHgxZTlmNDE1NywgMHhmNWY2NTFiNiwgMHgxZTYyODhlYywgMHhmNTM4MzJjNSwgMHgxZTIxMjEwNSwgMHhmNDdiYmQ2OCwgMHgxZGRiMTNiNywKLQkweDEzMGZmN2ZkLCAweDE5YjNlMDQ4LCAweDEyYmVkYjI2LCAweDE5ZWY0M2VmLCAweDEyNmQwNTRkLCAweDFhMjlhN2EwLCAweDEyMWE3OTk5LCAweDFhNjMwOTFiLAotCTB4ZTFkZWRlZmIsIDB4MGFjN2NkM2IsIDB4ZTE3ZTg0NTUsIDB4MDlhYTA4NjEsIDB4ZTEyOGJmMTksIDB4MDg4OGU5MzEsIDB4ZTBkZGFkMDksIDB4MDc2NGQzZjksCi0JMHhmM2MxMGVhZCwgMHgxZDkwNmJjZiwgMHhmMzA4NDM1ZSwgMHgxZDQxMzRkMSwgMHhmMjUxNzdmYiwgMHgxY2VkN2FmNCwgMHhmMTljYzhiMywgMHgxYzk1NGIyMSwKLQkweDExYzczYjNhLCAweDFhOWI2NjI5LCAweDExNzM0ZDY0LCAweDFhZDJiYzllLCAweDExMWViMzU0LCAweDFiMDkwYTU4LCAweDEwYzk3MDRkLCAweDFiM2U0ZDNmLAotCTB4ZTA5ZDY4MzAsIDB4MDYzZTJlMGYsIDB4ZTA2ODA2ZGIsIDB4MDUxNTVkYWMsIDB4ZTAzZDliOGYsIDB4MDNlYWM5Y2IsIDB4ZTAxZTM1MDMsIDB4MDJiZWRhMDEsCi0JMHhmMGVhNTE2NCwgMHgxYzM4YjJmMiwgMHhmMDNhMmQ5MiwgMHgxYmQ3YzBhYywgMHhlZjhjNzg2NywgMHgxYjcyODM0NSwgMHhlZWUxNGNhYywgMHgxYjA5MGE1OCwKLQkweDEwNzM4Nzk5LCAweDFiNzI4MzQ1LCAweDEwMWNmYzg3LCAweDFiYTVhYTY3LCAweDBmYzVkMjZlLCAweDFiZDdjMGFjLCAweDBmNmUwY2E5LCAweDFjMDhjNDI2LAotCTB4ZTAwOWRlMWQsIDB4MDE5MWY2NWYsIDB4ZTAwMDlkZTksIDB4MDA2NDg3NDgsIDB4ZTAwMjc3OWYsIDB4ZmYzNmY1NTAsIDB4ZTAwZjZhOWEsIDB4ZmUwOWE5MTgsCi0JMHhlZTM4YzRjNiwgMHgxYTliNjYyOSwgMHhlZDkyZmFiMywgMHgxYTI5YTdhMCwgMHhlY2YwMDgwMywgMHgxOWIzZTA0OCwgMHhlYzUwMDVkNywgMHgxOTNhMjI0YSwKLQkweDBmMTVhZTljLCAweDFjMzhiMmYyLCAweDBlYmNiYmFlLCAweDFjNjc4YjM1LCAweDBlNjMzNzRkLCAweDFjOTU0YjIxLCAweDBlMDkyNGVjLCAweDFjYzFmMGY0LAotCTB4ZTAyNzcyNWMsIDB4ZmNkZDBiMjgsIDB4ZTA0YTg2OGUsIDB4ZmJiMTgzY2MsIDB4ZTA3ODliMDYsIDB4ZmE4NzdhZWYsIDB4ZTBiMTlmYzUsIDB4Zjk1ZjU3ZjcsCi0JMHhlYmIzMGNkYiwgMHgxOGJjODA2YiwgMHhlYjE5MzU0NCwgMHgxODNiMGUwYywgMHhlYTgyOTZjYiwgMHgxN2I1ZGYyMiwgMHhlOWVmNDhhYiwgMHgxNzJkMDgzOCwKLQkweDBkYWU4ODA1LCAweDFjZWQ3YWY0LCAweDBkNTM2NDE2LCAweDFkMTdlNzc0LCAweDBjZjdiY2EyLCAweDFkNDEzNGQxLCAweDBjOWI5NTMyLCAweDFkNjk2MTc0LAotCTB4ZTBmNTgxMDQsIDB4ZjgzOTgxYTEsIDB4ZTE0NDI3MzcsIDB4ZjcxNjVkZTAsIDB4ZTE5ZDc3MTQsIDB4ZjVmNjUxYjYsIDB4ZTIwMTUxOWUsIDB4ZjRkOWMxMTEsCi0JMHhlOTVmNjE5YSwgMHgxNmEwOWU2NiwgMHhlOGQyZjdjOCwgMHgxNjEwYjc1NSwgMHhlODRhMjBkZSwgMHgxNTdkNjkzNSwgMHhlN2M0ZjFmNCwgMHgxNGU2Y2FiYywKLQkweDBjM2VmMTUzLCAweDFkOTA2YmNmLCAweDBiZTFkNDk5LCAweDFkYjY1MjYyLCAweDBiODQ0Mjk4LCAweDFkZGIxM2I3LCAweDBiMjYzZWVmLCAweDFkZmVhZTYyLAotCTB4ZTI2Zjk0MzEsIDB4ZjNjMTBlYWQsIDB4ZTJlODE4OGMsIDB4ZjJhYzliZWEsIDB4ZTM2YWI0ZGYsIDB4ZjE5Y2M4YjMsIDB4ZTNmNzNiZGEsIDB4ZjA5MWYzNTcsCi0JMHhlNzQzN2Y5NSwgMHgxNDRjZjMyNSwgMHhlNmM1ZGRiNiwgMHgxM2FmZmEyOSwgMHhlNjRjMWZiOCwgMHgxMzBmZjdmZCwgMHhlNWQ2NTg2MCwgMHgxMjZkMDU0ZCwKLQkweDBhYzdjZDNiLCAweDFlMjEyMTA1LCAweDBhNjhmMTIxLCAweDFlNDI2YTRiLCAweDBhMDlhZTRhLCAweDFlNjI4OGVjLCAweDA5YWEwODYxLCAweDFlODE3YmFiLAotCTB4ZTQ4ZDdjYmIsIDB4ZWY4Yzc4NjcsIDB4ZTUyZDQzNjIsIDB4ZWU4Y2IyOWMsIDB4ZTVkNjU4NjAsIDB4ZWQ5MmZhYjMsIDB4ZTY4ODgxMGIsIDB4ZWM5ZmE3NGYsCi0JMHhlNTY0OTlkNywgMHgxMWM3M2IzYSwgMHhlNGY2ZjVhOCwgMHgxMTFlYjM1NCwgMHhlNDhkN2NiYiwgMHgxMDczODc5OSwgMHhlNDI4M2Y1NCwgMHgwZmM1ZDI2ZSwKLQkweDA5NGEwMzE3LCAweDFlOWY0MTU3LCAweDA4ZTlhMjIwLCAweDFlYmJkOGM5LCAweDA4ODhlOTMxLCAweDFlZDc0MGU3LCAweDA4MjdkYzA3LCAweDFlZjE3OGE0LAotCTB4ZTc0MzdmOTUsIDB4ZWJiMzBjZGIsIDB4ZTgwNzEzMWQsIDB4ZWFjZDdkNmQsIDB4ZThkMmY3YzgsIDB4ZTllZjQ4YWIsIDB4ZTlhNmU2ZGEsIDB4ZTkxOGJiYWIsCi0JMHhlM2M3NGQwZSwgMHgwZjE1YWU5YywgMHhlMzZhYjRkZiwgMHgwZTYzMzc0ZCwgMHhlMzEyODUwYywgMHgwZGFlODgwNSwgMHhlMmJlY2IyZiwgMHgwY2Y3YmNhMiwKLQkweDA3YzY3ZTVmLCAweDFmMGE3ZWZjLCAweDA3NjRkM2Y5LCAweDFmMjI1MmY3LCAweDA3MDJlMDliLCAweDFmMzhmM2FjLCAweDA2YTBhODA5LCAweDFmNGU2MDNiLAotCTB4ZWE4Mjk2Y2IsIDB4ZTg0YTIwZGUsIDB4ZWI2NWJiNjQsIDB4ZTc4M2JmZjAsIDB4ZWM1MDA1ZDcsIDB4ZTZjNWRkYjYsIDB4ZWQ0MTI0ZGEsIDB4ZTYxMGJjMTEsCi0JMHhlMjZmOTQzMSwgMHgwYzNlZjE1MywgMHhlMjI0ZWM0OSwgMHgwYjg0NDI5OCwgMHhlMWRlZGVmYiwgMHgwYWM3Y2QzYiwgMHhlMTlkNzcxNCwgMHgwYTA5YWU0YSwKLQkweDA2M2UyZTBmLCAweDFmNjI5N2QwLCAweDA1ZGI3Njc4LCAweDFmNzU5OWE0LCAweDA1Nzg4NTExLCAweDFmODc2NGZhLCAweDA1MTU1ZGFjLCAweDFmOTdmOTI1LAotCTB4ZWUzOGM0YzYsIDB4ZTU2NDk5ZDcsIDB4ZWYzNjhmYjMsIDB4ZTRjMWIyYzEsIDB4ZjAzYTJkOTIsIDB4ZTQyODNmNTQsIDB4ZjE0MzQ0NTIsIDB4ZTM5ODc0Y2IsCi0JMHhlMTYwYmVhOSwgMHgwOTRhMDMxNywgMHhlMTI4YmYxOSwgMHgwODg4ZTkzMSwgMHhlMGY1ODEwNCwgMHgwN2M2N2U1ZiwgMHhlMGM3MGM1NCwgMHgwNzAyZTA5YiwKLQkweDA0YjIwNDFjLCAweDFmYTc1NTdmLCAweDA0NGU3YzM0LCAweDFmYjU3OTcyLCAweDAzZWFjOWNiLCAweDFmYzI2NDcxLCAweDAzODZmMGI5LCAweDFmY2UxNWZkLAotCTB4ZjI1MTc3ZmIsIDB4ZTMxMjg1MGMsIDB4ZjM2NDZhY2UsIDB4ZTI5NjllOGMsIDB4ZjQ3YmJkNjgsIDB4ZTIyNGVjNDksIDB4ZjU5NzBlZGYsIDB4ZTFiZDk1YjUsCi0JMHhlMDlkNjgzMCwgMHgwNjNlMmUwZiwgMHhlMDc4OWIwNiwgMHgwNTc4ODUxMSwgMHhlMDU4YWE4MSwgMHgwNGIyMDQxYywgMHhlMDNkOWI4ZiwgMHgwM2VhYzljYiwKLQkweDAzMjJmNGQ4LCAweDFmZDg4ZGE0LCAweDAyYmVkYTAxLCAweDFmZTFjYWZkLCAweDAyNWFhNDEyLCAweDFmZTljZGFkLCAweDAxZjY1NmU4LCAweDFmZjA5NTY2LAotCTB4ZjZiNWZjZTksIDB4ZTE2MGJlYTksIDB4ZjdkODIzZjksIDB4ZTEwZTg3NWMsIDB4ZjhmZDFmNjUsIDB4ZTBjNzBjNTQsIDB4ZmEyNDg5ODgsIDB4ZTA4YTY2NWMsCi0JMHhlMDI3NzI1YywgMHgwMzIyZjRkOCwgMHhlMDE2MzI1MywgMHgwMjVhYTQxMiwgMHhlMDA5ZGUxZCwgMHgwMTkxZjY1ZiwgMHhlMDAyNzc5ZiwgMHgwMGM5MGFiMCwKLQkweDAxOTFmNjVmLCAweDFmZjYyMWUzLCAweDAxMmQ4NjU3LCAweDFmZmE3MmYwLCAweDAwYzkwYWIwLCAweDFmZmQ4ODYxLCAweDAwNjQ4NzQ4LCAweDFmZmY2MjE3LAotCTB4ZmI0ZGZiZTQsIDB4ZTA1OGFhODEsIDB4ZmM3OTBmNDcsIDB4ZTAzMWVhMDMsIDB4ZmRhNTViZWUsIDB4ZTAxNjMyNTMsIDB4ZmVkMjc5YTksIDB4ZTAwNThkMTAKLX07Ci0KLWNvbnN0IGludCB0d2lkVGFiNjRbNCo2ICsgMTYqNl0gPSB7Ci0JMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxNmEwOWU2NiwgMHgxNmEwOWU2NiwgMHgwMDAwMDAwMCwgMHgyMDAwMDAwMCwgMHhlOTVmNjE5YSwgMHgxNmEwOWU2NiwKLQkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDFkOTA2YmNmLCAweDBjM2VmMTUzLCAweDE2YTA5ZTY2LCAweDE2YTA5ZTY2LCAweDBjM2VmMTUzLCAweDFkOTA2YmNmLAotCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsIDB4ZTk1ZjYxOWEsIDB4MTZhMDllNjYsIDB4ZTI2Zjk0MzEsIDB4ZjNjMTBlYWQsCi0KLQkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDFmNjI5N2QwLCAweDA2M2UyZTBmLCAweDFkOTA2YmNmLCAweDBjM2VmMTUzLCAweDFhOWI2NjI5LCAweDExYzczYjNhLAotCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWZkODhkYTQsIDB4MDMyMmY0ZDgsIDB4MWY2Mjk3ZDAsIDB4MDYzZTJlMGYsIDB4MWU5ZjQxNTcsIDB4MDk0YTAzMTcsCi0JMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxZTlmNDE1NywgMHgwOTRhMDMxNywgMHgxYTliNjYyOSwgMHgxMWM3M2IzYSwgMHgxNDRjZjMyNSwgMHgxOGJjODA2YiwKLQkweDE2YTA5ZTY2LCAweDE2YTA5ZTY2LCAweDExYzczYjNhLCAweDFhOWI2NjI5LCAweDBjM2VmMTUzLCAweDFkOTA2YmNmLCAweDA2M2UyZTBmLCAweDFmNjI5N2QwLAotCTB4MWQ5MDZiY2YsIDB4MGMzZWYxNTMsIDB4MWMzOGIyZjIsIDB4MGYxNWFlOWMsIDB4MWE5YjY2MjksIDB4MTFjNzNiM2EsIDB4MThiYzgwNmIsIDB4MTQ0Y2YzMjUsCi0JMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHgwMzIyZjRkOCwgMHgxZmQ4OGRhNCwgMHhmOWMxZDFmMSwgMHgxZjYyOTdkMCwgMHhmMGVhNTE2NCwgMHgxYzM4YjJmMiwKLQkweDAwMDAwMDAwLCAweDIwMDAwMDAwLCAweGY5YzFkMWYxLCAweDFmNjI5N2QwLCAweGYzYzEwZWFkLCAweDFkOTA2YmNmLCAweGVlMzhjNGM2LCAweDFhOWI2NjI5LAotCTB4MTZhMDllNjYsIDB4MTZhMDllNjYsIDB4MTQ0Y2YzMjUsIDB4MThiYzgwNmIsIDB4MTFjNzNiM2EsIDB4MWE5YjY2MjksIDB4MGYxNWFlOWMsIDB4MWMzOGIyZjIsCi0JMHhlOTVmNjE5YSwgMHgxNmEwOWU2NiwgMHhlM2M3NGQwZSwgMHgwZjE1YWU5YywgMHhlMDlkNjgzMCwgMHgwNjNlMmUwZiwgMHhlMDI3NzI1YywgMHhmY2RkMGIyOCwKLQkweGU5NWY2MTlhLCAweDE2YTA5ZTY2LCAweGU1NjQ5OWQ3LCAweDExYzczYjNhLCAweGUyNmY5NDMxLCAweDBjM2VmMTUzLCAweGUwOWQ2ODMwLCAweDA2M2UyZTBmLAotCTB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsIDB4MDk0YTAzMTcsIDB4MWU5ZjQxNTcsIDB4MDYzZTJlMGYsIDB4MWY2Mjk3ZDAsIDB4MDMyMmY0ZDgsIDB4MWZkODhkYTQsCi0JMHhlMjZmOTQzMSwgMHhmM2MxMGVhZCwgMHhlNzQzN2Y5NSwgMHhlYmIzMGNkYiwgMHhlZTM4YzRjNiwgMHhlNTY0OTlkNywgMHhmNmI1ZmNlOSwgMHhlMTYwYmVhOQotfTsKLQotI2Vsc2UKLQotLyoKLSAqICBRMzAgZm9yIDEyOCBhbmQgMTAyNAotICoKLSAqIGZvciAoaSA9IDA7IGkgPCBudW0vNDsgaSsrKSB7Ci0gKiAgIGFuZ2xlID0gKGkgKyAwLjEyNSkgKiBNX1BJIC8gbnVtOwotICogICB4ID0gY29zKGFuZ2xlKSAqICgxIDw8IDMwKTsKLSAqICAgeCA9IHNpbihhbmdsZSkgKiAoMSA8PCAzMCk7Ci0gKgotICogICBhbmdsZSA9IChudW0vMiAtIDEgLSBpICsgMC4xMjUpICogTV9QSSAvIG51bTsKLSAqICAgeCA9IGNvcyhhbmdsZSkgKiAoMSA8PCAzMCk7Ci0gKiAgIHggPSBzaW4oYW5nbGUpICogKDEgPDwgMzApOwotICogfQotICovCi1jb25zdCBpbnQgY29zc2ludGFiWzEyOCArIDEwMjRdID0gewotCS8qIDEyOCAqLwotCTB4M2ZmZmVjNDMsIDB4MDAzMjQzZjEsIDB4MDE1ZmQ0ZDIsIDB4M2ZmYzM4ZDEsIDB4M2ZmOWMxM2EsIDB4MDFjNDU0ZjUsIDB4MDJmMWI3NTUsIDB4M2ZlZWE3NzYsCi0JMHgzZmU5YjhhOSwgMHgwMzU2MjAzOCwgMHgwNDgzMjU5ZCwgMHgzZmQ3M2E0YSwgMHgzZmNmZDUwYiwgMHgwNGU3NjdjNSwgMHgwNjEzZTFjNSwgMHgzZmI1ZjRlYSwKLQkweDNmYWMxYTViLCAweDA2NzdlZGJiLCAweDA3YTNhZGZmLCAweDNmOGFkYzc3LCAweDNmN2U4ZTFlLCAweDA4MDc3NDU3LCAweDA5MzI0Y2E3LCAweDNmNTVmNzk2LAotCTB4M2Y0NzM3NTksIDB4MDk5NWJkZmQsIDB4MGFiZjgwNDMsIDB4M2YxNzRlNzAsIDB4M2YwNjFlOTUsIDB4MGIyMjhkNDIsIDB4MGM0YjBiOTQsIDB4M2VjZWVhYWQsCi0JMHgzZWJiNGRkYiwgMHgwY2FkYTRmNSwgMHgwZGQ0YjE5YSwgMHgzZTdjZDc3OCwgMHgzZTY2ZDBiNCwgMHgwZTM2YzgyYSwgMHgwZjVjMzVhMywgMHgzZTIxMjE3OSwKLQkweDNlMDhiNDJhLCAweDBmYmRiYTQwLCAweDEwZTE1YjRlLCAweDNkYmJkNmQ0LCAweDNkYTEwNmJkLCAweDExNDIzZWYwLCAweDEyNjNlNjk5LCAweDNkNGQwNzI4LAotCTB4M2QyZmQ4NmMsIDB4MTJjNDFhNGYsIDB4MTNlMzliZTksIDB4M2NkNGMzOGIsIDB4M2NiNTNhYWEsIDB4MTQ0MzEwZGQsIDB4MTU2MDQwMTMsIDB4M2M1MzFlODgsCi0JMHgzYzMxNDA2MCwgMHgxNWJlZTc4YywgMHgxNmQ5OTg2NCwgMHgzYmM4MmMxZiwgMHgzYmEzZmRlNywgMHgxNzM3NjNjOSwgMHgxODRmNmFhYiwgMHgzYjM0MDFiYiwKLQkweDNiMGQ4OTA5LCAweDE4YWM0Yjg3LCAweDE5YzE3ZDQ0LCAweDNhOTZiNjM2LCAweDNhNmRmOGY4LCAweDFhMWQ2NTQ0LCAweDFiMmY5NzFlLCAweDM5ZjA2MWQyLAotCTB4MzljNTY2NGYsIDB4MWI4YTc4MTUsIDB4MWM5OTdmYzQsIDB4Mzk0MTFlMzMsIDB4MzkxM2ViMGUsIDB4MWNmMzRiYWYsIDB4MWRmZWZmNjcsIDB4Mzg4OTA2NjMsCi0JMHgzODU5YTI5MiwgMHgxZTU3YTg2ZCwgMHgxZjVmZGVlNiwgMHgzN2M4MzZjMiwgMHgzNzk2YTk5NiwgMHgxZmI3NTc1YywgMHgyMGJiZTdkOCwgMHgzNmZlY2QwZSwKLQkweDM2Y2IxZTJhLCAweDIxMTIyMjQwLCAweDIyMTJlNDkyLCAweDM2MmNlODU1LCAweDM1ZjcxZmIxLCAweDIyNjdkM2EwLCAweDIzNjRhMDJlLCAweDM1NTJhOGY0LAotCTB4MzUxYWNlZGQsIDB4MjNiODM2Y2EsIDB4MjRiMGU2OTksIDB4MzQ3MDMwOTUsIDB4MzQzNjRkYTYsIDB4MjUwMzE3ZGYsIDB4MjVmNzg0OTcsIDB4MzM4NWEyMjIsCi0JMHgzMzQ5YmY0OCwgMHgyNjQ4NDNkOSwgMHgyNzM4NDdjOCwgMHgzMjkzMjFjNywgMHgzMjU1NDg0MCwgMHgyNzg3ODg5MywgMHgyODcyZmViNiwgMHgzMTk4ZDRlYSwKLQkweDMxNTkwZTNlLCAweDI4YzBiNGQyLCAweDI5YTc3OGRiLCAweDMwOTZlMjIzLCAweDMwNTUzODI4LCAweDI5ZjM5ODRjLCAweDJhZDU4NmEzLCAweDJmOGQ3MTNhLAotCTB4MmY0OWVlMGYsIDB4MmIyMDAzYWMsIDB4MmJmY2Y5N2MsIDB4MmU3Y2FiMWMsIDB4MmUzNzU5MmMsIDB4MmM0NWM4YTAsIDB4MmQxZGEzZDUsIDB4MmQ2NGI5ZGEsCi0JLyogMTAyNCAqLwotCTB4M2ZmZmZmYjEsIDB4MDAwNjQ4N2YsIDB4MDAyYmZiNzQsIDB4M2ZmZmYwZTMsIDB4M2ZmZmU3MDUsIDB4MDAzODhjNmUsIDB4MDA1ZTNmNGMsIDB4M2ZmZmJhOWIsCi0JMHgzZmZmYTZkZSwgMHgwMDZhZDAzYiwgMHgwMDkwODJlYSwgMHgzZmZmNWNkOCwgMHgzZmZmM2YzYywgMHgwMDlkMTNjNSwgMHgwMGMyYzYyZiwgMHgzZmZlZDc5YiwKLQkweDNmZmViMDIxLCAweDAwY2Y1NmVmLCAweDAwZjUwOGZjLCAweDNmZmUyYWU1LCAweDNmZmRmOThjLCAweDAxMDE5OTk4LCAweDAxMjc0YjMxLCAweDNmZmQ1NmI1LAotCTB4M2ZmZDFiN2UsIDB4MDEzM2RiYTMsIDB4MDE1OThjYjEsIDB4M2ZmYzViMGMsIDB4M2ZmYzE1ZjcsIDB4MDE2NjFjZjAsIDB4MDE4YmNkNWIsIDB4M2ZmYjM3ZWMsCi0JMHgzZmZhZThmOSwgMHgwMTk4NWQ2MCwgMHgwMWJlMGQxMSwgMHgzZmY5ZWQ1MywgMHgzZmY5OTQ4MywgMHgwMWNhOWNkNCwgMHgwMWYwNGJiNCwgMHgzZmY4N2I0NCwKLQkweDNmZjgxODk2LCAweDAxZmNkYjJlLCAweDAyMjI4OTI0LCAweDNmZjZlMWJmLCAweDNmZjY3NTM0LCAweDAyMmYxODRkLCAweDAyNTRjNTQ0LCAweDNmZjUyMGM1LAotCTB4M2ZmNGFhNWQsIDB4MDI2MTU0MTQsIDB4MDI4NmZmZjMsIDB4M2ZmMzM4NTgsIDB4M2ZmMmI4MTMsIDB4MDI5MzhlNjIsIDB4MDJiOTM5MTQsIDB4M2ZmMTI4NzgsCi0JMHgzZmYwOWU1NiwgMHgwMmM1YzcxYSwgMHgwMmViNzA4NiwgMHgzZmVlZjEyNiwgMHgzZmVlNWQyOCwgMHgwMmY3ZmUxYywgMHgwMzFkYTYyYiwgMHgzZmVjOTI2NSwKLQkweDNmZWJmNDhiLCAweDAzMmEzMzQ5LCAweDAzNGZkOWU1LCAweDNmZWEwYzM1LCAweDNmZTk2NDgwLCAweDAzNWM2NjgyLCAweDAzODIwYjkzLCAweDNmZTc1ZTk4LAotCTB4M2ZlNmFkMDgsIDB4MDM4ZTk3YTksIDB4MDNiNDNiMTcsIDB4M2ZlNDg5OTAsIDB4M2ZlM2NlMjYsIDB4MDNjMGM2OWUsIDB4MDNlNjY4NTIsIDB4M2ZlMThkMWYsCi0JMHgzZmUwYzdkYSwgMHgwM2YyZjM0MiwgMHgwNDE4OTMyNiwgMHgzZmRlNjk0NSwgMHgzZmRkOWEyNywgMHgwNDI1MWQ3NywgMHgwNDRhYmI3MywgMHgzZmRiMWUwNiwKLQkweDNmZGE0NTBmLCAweDA0NTc0NTFkLCAweDA0N2NlMTFhLCAweDNmZDdhYjY0LCAweDNmZDZjODk0LCAweDA0ODk2YTE2LCAweDA0YWYwM2ZjLCAweDNmZDQxMTVmLAotCTB4M2ZkMzI0YjcsIDB4MDRiYjhjNDIsIDB4MDRlMTIzZmEsIDB4M2ZkMDRmZmMsIDB4M2ZjZjU5N2MsIDB4MDRlZGFiODMsIDB4MDUxMzQwZjYsIDB4M2ZjYzY3M2IsCi0JMHgzZmNiNjZlNCwgMHgwNTFmYzdiOSwgMHgwNTQ1NWFkMSwgMHgzZmM4NTcxZiwgMHgzZmM3NGNmMywgMHgwNTUxZTBjNywgMHgwNTc3NzE2YiwgMHgzZmM0MWZhYywKLQkweDNmYzMwYmFhLCAweDA1ODNmNjhjLCAweDA1YTk4NGE2LCAweDNmYmZjMGUzLCAweDNmYmVhMzBjLCAweDA1YjYwOGViLCAweDA1ZGI5NDYzLCAweDNmYmIzYWM3LAotCTB4M2ZiYTEzMWIsIDB4MDVlODE3YzMsIDB4MDYwZGEwODMsIDB4M2ZiNjhkNWIsIDB4M2ZiNTViZGMsIDB4MDYxYTIyZjcsIDB4MDYzZmE4ZTcsIDB4M2ZiMWI4YTIsCi0JMHgzZmIwN2Q1MCwgMHgwNjRjMmE2NywgMHgwNjcxYWQ3MSwgMHgzZmFjYmM5ZiwgMHgzZmFiNzc3YiwgMHgwNjdlMmRmNSwgMHgwNmEzYWUwMCwgMHgzZmE3OTk1NCwKLQkweDNmYTY0YTVmLCAweDA2YjAyZDgxLCAweDA2ZDVhYTc3LCAweDNmYTI0ZWM2LCAweDNmYTBmNjAwLCAweDA2ZTIyOGVlLCAweDA3MDdhMmI3LCAweDNmOWNkY2Y3LAotCTB4M2Y5YjdhNjIsIDB4MDcxNDIwMWIsIDB4MDczOTk2YTEsIDB4M2Y5NzQzZWIsIDB4M2Y5NWQ3ODcsIDB4MDc0NjEyZWIsIDB4MDc2Yjg2MTYsIDB4M2Y5MTgzYTUsCi0JMHgzZjkwMGQ3MiwgMHgwNzc4MDEzZCwgMHgwNzlkNzBmNywgMHgzZjhiOWMyOCwgMHgzZjhhMWMyOSwgMHgwN2E5ZWFmNSwgMHgwN2NmNTcyNiwgMHgzZjg1OGQ3OSwKLQkweDNmODQwM2FlLCAweDA3ZGJjZmYyLCAweDA4MDEzODgzLCAweDNmN2Y1NzliLCAweDNmN2RjNDA1LCAweDA4MGRiMDE2LCAweDA4MzMxNGYxLCAweDNmNzhmYTkyLAotCTB4M2Y3NzVkMzEsIDB4MDgzZjhiNDMsIDB4MDg2NGVjNGYsIDB4M2Y3Mjc2NjEsIDB4M2Y3MGNmMzgsIDB4MDg3MTYxNTksIDB4MDg5NmJlODAsIDB4M2Y2YmNiMGUsCi0JMHgzZjZhMWExYywgMHgwOGEzMzIzYSwgMHgwOGM4OGI2NSwgMHgzZjY0Zjg5YiwgMHgzZjYzM2RlMiwgMHgwOGQ0ZmRjNiwgMHgwOGZhNTJkZSwgMHgzZjVkZmYwZSwKLQkweDNmNWMzYThmLCAweDA5MDZjM2UwLCAweDA5MmMxNGNlLCAweDNmNTZkZTZhLCAweDNmNTUxMDI2LCAweDA5Mzg4NDY5LCAweDA5NWRkMTE2LCAweDNmNGY5NmI0LAotCTB4M2Y0ZGJlYWMsIDB4MDk2YTNmNDIsIDB4MDk4Zjg3OTYsIDB4M2Y0ODI3ZjAsIDB4M2Y0NjQ2MjYsIDB4MDk5YmY0NGMsIDB4MDljMTM4MzEsIDB4M2Y0MDkyMjMsCi0JMHgzZjNlYTY5NywgMHgwOWNkYTM2OCwgMHgwOWYyZTJjNywgMHgzZjM4ZDU1MiwgMHgzZjM2ZTAwNiwgMHgwOWZmNGM3OCwgMHgwYTI0ODczYSwgMHgzZjMwZjE4MSwKLQkweDNmMmVmMjc2LCAweDBhMzBlZjVlLCAweDBhNTYyNTZjLCAweDNmMjhlNmI2LCAweDNmMjZkZGVjLCAweDBhNjI4YmZhLCAweDBhODdiZDNkLCAweDNmMjBiNGY1LAotCTB4M2YxZWEyNmUsIDB4MGE5NDIyMmYsIDB4MGFiOTRlOGYsIDB4M2YxODVjNDMsIDB4M2YxNjQwMDEsIDB4MGFjNWIxZGMsIDB4MGFlYWQ5NDQsIDB4M2YwZmRjYTUsCi0JMHgzZjBkYjZhOSwgMHgwYWY3M2FlNSwgMHgwYjFjNWQzZCwgMHgzZjA3MzYyMSwgMHgzZjA1MDY2ZCwgMHgwYjI4YmQyYSwgMHgwYjRkZGE1YywgMHgzZWZlNjhiYywKLQkweDNlZmMyZjUwLCAweDBiNWEzODhkLCAweDBiN2Y1MDgxLCAweDNlZjU3NDdiLCAweDNlZjMzMTVhLCAweDBiOGJhY2YwLCAweDBiYjBiZjhmLCAweDNlZWM1OTY1LAotCTB4M2VlYTBjOGUsIDB4MGJiZDFhMzMsIDB4MGJlMjI3NjYsIDB4M2VlMzE3N2UsIDB4M2VlMGMwZjQsIDB4MGJlZTgwMzgsIDB4MGMxMzg3ZTksIDB4M2VkOWFlY2MsCi0JMHgzZWQ3NGU5MSwgMHgwYzFmZGVlMSwgMHgwYzQ0ZTBmOSwgMHgzZWQwMWY1NSwgMHgzZWNkYjU2YSwgMHgwYzUxMzYxMCwgMHgwYzc2MzI3OCwgMHgzZWM2NjkyMCwKLQkweDNlYzNmNTg1LCAweDBjODI4NWE1LCAweDBjYTc3YzQ3LCAweDNlYmM4YzMxLCAweDNlYmEwZWU5LCAweDBjYjNjZDg0LCAweDBjZDhiZTQ3LCAweDNlYjI4ODhmLAotCTB4M2ViMDAxOWMsIDB4MGNlNTBkOGMsIDB4MGQwOWY4NWIsIDB4M2VhODVlNDEsIDB4M2VhNWNkYTMsIDB4MGQxNjQ1YTAsIDB4MGQzYjJhNjQsIDB4M2U5ZTBkNGMsCi0JMHgzZTliNzMwNiwgMHgwZDQ3NzVhMSwgMHgwZDZjNTQ0MywgMHgzZTkzOTViNywgMHgzZTkwZjFjYSwgMHgwZDc4OWQ3MSwgMHgwZDlkNzVkYiwgMHgzZTg4Zjc4OCwKLQkweDNlODY0OWY1LCAweDBkYTliY2YyLCAweDBkY2U4ZjBkLCAweDNlN2UzMmM2LCAweDNlN2I3YjkwLCAweDBkZGFkNDA2LCAweDBkZmY5ZmJhLCAweDNlNzM0Nzc4LAotCTB4M2U3MDg2OWYsIDB4MGUwYmUyOGUsIDB4MGUzMGE3YzUsIDB4M2U2ODM1YTQsIDB4M2U2NTZiMmIsIDB4MGUzY2U4NmIsIDB4MGU2MWE3MGYsIDB4M2U1Y2ZkNTEsCi0JMHgzZTVhMjkzOSwgMHgwZTZkZTU4MCwgMHgwZTkyOWQ3YSwgMHgzZTUxOWU4NiwgMHgzZTRlYzBkMSwgMHgwZTllZDlhZiwgMHgwZWMzOGFlOCwgMHgzZTQ2MTk0YSwKLQkweDNlNDMzMWZhLCAweDBlY2ZjNGQ5LCAweDBlZjQ2ZjNiLCAweDNlM2E2ZGE0LCAweDNlMzc3Y2JiLCAweDBmMDBhNmRmLCAweDBmMjU0YTUzLCAweDNlMmU5YjljLAotCTB4M2UyYmExMWIsIDB4MGYzMTdmYTUsIDB4MGY1NjFjMTUsIDB4M2UyMmEzMzgsIDB4M2UxZjlmMjEsIDB4MGY2MjRmMGMsIDB4MGY4NmU0NjAsIDB4M2UxNjg0ODAsCi0JMHgzZTEzNzZkNSwgMHgwZjkzMTRmNSwgMHgwZmI3YTMxNywgMHgzZTBhM2Y3YiwgMHgzZTA3MjgzZiwgMHgwZmMzZDE0MywgMHgwZmU4NTgxZCwgMHgzZGZkZDQzMiwKLQkweDNkZmFiMzY1LCAweDBmZjQ4M2Q3LCAweDEwMTkwMzUyLCAweDNkZjE0MmFiLCAweDNkZWUxODUxLCAweDEwMjUyYzk0LCAweDEwNDlhNDlhLCAweDNkZTQ4YWVmLAotCTB4M2RlMTU3MDgsIDB4MTA1NWNiNWIsIDB4MTA3YTNiZDUsIDB4M2RkN2FkMDUsIDB4M2RkNDZmOTQsIDB4MTA4NjYwMGUsIDB4MTBhYWM4ZTYsIDB4M2RjYWE4ZjUsCi0JMHgzZGM3NjFmYywgMHgxMGI2ZWE5MCwgMHgxMGRiNGJhZiwgMHgzZGJkN2VjNywgMHgzZGJhMmU0OCwgMHgxMGU3NmFjMywgMHgxMTBiYzQxMywgMHgzZGIwMmU4NCwKLQkweDNkYWNkNDgxLCAweDExMTdlMDg4LCAweDExM2MzMWYzLCAweDNkYTJiODM0LCAweDNkOWY1NGFmLCAweDExNDg0YmMyLCAweDExNmM5NTMxLCAweDNkOTUxYmRlLAotCTB4M2Q5MWFlZDksIDB4MTE3OGFjNTMsIDB4MTE5Y2VkYWYsIDB4M2Q4NzU5OGMsIDB4M2Q4M2UzMDksIDB4MTFhOTAyMWQsIDB4MTFjZDNiNTAsIDB4M2Q3OTcxNDUsCi0JMHgzZDc1ZjE0NywgMHgxMWQ5NGQwMiwgMHgxMWZkN2RmNiwgMHgzZDZiNjMxMywgMHgzZDY3ZDk5YiwgMHgxMjA5OGNlNSwgMHgxMjJkYjU4MywgMHgzZDVkMmVmZSwKLQkweDNkNTk5YzBlLCAweDEyMzljMWE3LCAweDEyNWRlMWRhLCAweDNkNGVkNTBmLCAweDNkNGIzOGFhLCAweDEyNjllYjJiLCAweDEyOGUwMmRjLCAweDNkNDA1NTRlLAotCTB4M2QzY2FmNzYsIDB4MTI5YTA5NTQsIDB4MTJiZTE4NmMsIDB4M2QzMWFmYzUsIDB4M2QyZTAwN2MsIDB4MTJjYTFjMDMsIDB4MTJlZTIyNmMsIDB4M2QyMmU0N2MsCi0JMHgzZDFmMmJjNSwgMHgxMmZhMjMxYiwgMHgxMzFlMjBjMCwgMHgzZDEzZjM3ZSwgMHgzZDEwMzE1YSwgMHgxMzJhMWU3ZSwgMHgxMzRlMTM0OCwgMHgzZDA0ZGNkMiwKLQkweDNkMDExMTQ1LCAweDEzNWEwZTBlLCAweDEzN2RmOWU3LCAweDNjZjVhMDgyLCAweDNjZjFjYjhlLCAweDEzODlmMWFmLCAweDEzYWRkNDgxLCAweDNjZTYzZTk4LAotCTB4M2NlMjYwM2YsIDB4MTNiOWM5NDMsIDB4MTNkZGEyZjcsIDB4M2NkNmI3MWUsIDB4M2NkMmNmNjIsIDB4MTNlOTk0YWIsIDB4MTQwZDY1MmMsIDB4M2NjNzBhMWMsCi0JMHgzY2MzMThmZiwgMHgxNDE5NTNjYiwgMHgxNDNkMWIwMiwgMHgzY2I3Mzc5YywgMHgzY2IzM2QyMiwgMHgxNDQ5MDY4NSwgMHgxNDZjYzQ1YywgMHgzY2E3M2ZhOSwKLQkweDNjYTMzYmQzLCAweDE0NzhhY2JjLCAweDE0OWM2MTFkLCAweDNjOTcyMjRjLCAweDNjOTMxNTFkLCAweDE0YTg0NjUyLCAweDE0Y2JmMTI3LCAweDNjODZkZjhlLAotCTB4M2M4MmM5MDksIDB4MTRkN2QzMmEsIDB4MTRmYjc0NWUsIDB4M2M3Njc3N2IsIDB4M2M3MjU3YTIsIDB4MTUwNzUzMjcsIDB4MTUyYWVhYTMsIDB4M2M2NWVhMWMsCi0JMHgzYzYxYzBmMSwgMHgxNTM2YzYyYiwgMHgxNTVhNTNkOSwgMHgzYzU1Mzc3YiwgMHgzYzUxMDUwMSwgMHgxNTY2MmMxOCwgMHgxNTg5YWZlMywgMHgzYzQ0NWZhMiwKLQkweDNjNDAyM2RkLCAweDE1OTU4NGQzLCAweDE1YjhmZWE0LCAweDNjMzM2MjlkLCAweDNjMmYxZDhlLCAweDE1YzRkMDNlLCAweDE1ZTgzZmZmLCAweDNjMjI0MDc1LAotCTB4M2MxZGYyMWYsIDB4MTVmNDBlM2EsIDB4MTYxNzczZDYsIDB4M2MxMGY5MzUsIDB4M2MwY2ExOWIsIDB4MTYyMzNlYWMsIDB4MTY0NjlhMGQsIDB4M2JmZjhjZTgsCi0JMHgzYmZiMmMwYywgMHgxNjUyNjE3NiwgMHgxNjc1YjI4NiwgMHgzYmVkZmI5OSwgMHgzYmU5OTE3ZSwgMHgxNjgxNzY3YywgMHgxNmE0YmQyNSwgMHgzYmRjNDU1MiwKLQkweDNiZDdkMWZhLCAweDE2YjA3ZDlmLCAweDE2ZDNiOWNjLCAweDNiY2E2YTFkLCAweDNiYzVlZDhkLCAweDE2ZGY3NmMzLCAweDE3MDJhODVlLCAweDNiYjg2YTA4LAotCTB4M2JiM2U0NDAsIDB4MTcwZTYxY2MsIDB4MTczMTg4YmUsIDB4M2JhNjQ1MWIsIDB4M2JhMWI2MjAsIDB4MTczZDNlOWIsIDB4MTc2MDVhZDAsIDB4M2I5M2ZiNjMsCi0JMHgzYjhmNjMzNywgMHgxNzZjMGQxNSwgMHgxNzhmMWU3NiwgMHgzYjgxOGNlYiwgMHgzYjdjZWI5MCwgMHgxNzlhY2QxYywgMHgxN2JkZDM5NCwgMHgzYjZlZjliZSwKLQkweDNiNmE0ZjM4LCAweDE3Yzk3ZTkzLCAweDE3ZWM3YTBkLCAweDNiNWM0MWU4LCAweDNiNTc4ZTM5LCAweDE3ZjgyMTVlLCAweDE4MWIxMWM0LCAweDNiNDk2NTc0LAotCTB4M2I0NGE4YTAsIDB4MTgyNmI1NjEsIDB4MTg0OTlhOWQsIDB4M2IzNjY0NmUsIDB4M2IzMTllNzcsIDB4MTg1NTNhN2QsIDB4MTg3ODE0N2EsIDB4M2IyMzNlZTEsCi0JMHgzYjFlNmZjYSwgMHgxODgzYjA5NywgMHgxOGE2N2YzZiwgMHgzYjBmZjRkOSwgMHgzYjBiMWNhNiwgMHgxOGIyMTc5MSwgMHgxOGQ0ZGFkMCwgMHgzYWZjODY2MywKLQkweDNhZjdhNTE2LCAweDE4ZTA2ZjUwLCAweDE5MDMyNzBmLCAweDNhZThmMzhiLCAweDNhZTQwOTI2LCAweDE5MGViN2I3LCAweDE5MzE2M2UxLCAweDNhZDUzYzViLAotCTB4M2FkMDQ4ZTMsIDB4MTkzY2YwYTksIDB4MTk1ZjkxMjgsIDB4M2FjMTYwZTEsIDB4M2FiYzY0NTgsIDB4MTk2YjFhMDksIDB4MTk4ZGFlYzgsIDB4M2FhZDYxMjksCi0JMHgzYWE4NWI5MiwgMHgxOTk5MzNiYiwgMHgxOWJiYmNhNiwgMHgzYTk5M2QzZSwgMHgzYTk0MmU5ZCwgMHgxOWM3M2RhMywgMHgxOWU5YmFhMywgMHgzYTg0ZjUyZiwKLQkweDNhN2ZkZDg2LCAweDE5ZjUzN2E0LCAweDFhMTdhOGE1LCAweDNhNzA4OTA2LCAweDNhNmI2ODU5LCAweDFhMjMyMWEyLCAweDFhNDU4NjhlLCAweDNhNWJmOGQxLAotCTB4M2E1NmNmMjMsIDB4MWE1MGZiODEsIDB4MWE3MzU0NDIsIDB4M2E0NzQ0OWMsIDB4M2E0MjExZjAsIDB4MWE3ZWM1MjQsIDB4MWFhMTExYTYsIDB4M2EzMjZjNzQsCi0JMHgzYTJkMzBjZCwgMHgxYWFjN2U2ZiwgMHgxYWNlYmU5ZCwgMHgzYTFkNzA2NiwgMHgzYTE4MmJjOCwgMHgxYWRhMjc0NiwgMHgxYWZjNWIwYSwgMHgzYTA4NTA3ZiwKLQkweDNhMDMwMmVkLCAweDFiMDdiZjhjLCAweDFiMjllNmQyLCAweDM5ZjMwY2NjLCAweDM5ZWRiNjQ5LCAweDFiMzU0NzI3LCAweDFiNTc2MWQ4LCAweDM5ZGRhNTVhLAotCTB4MzlkODQ1ZTksIDB4MWI2MmJkZjgsIDB4MWI4NGNjMDEsIDB4MzljODFhMzYsIDB4MzljMmIxZGEsIDB4MWI5MDIzZTUsIDB4MWJiMjI1MzAsIDB4MzliMjZiNmQsCi0JMHgzOWFjZmEyYiwgMHgxYmJkNzhkMiwgMHgxYmRmNmQ0YSwgMHgzOTljOTkwZCwgMHgzOTk3MWVlNywgMHgxYmVhYmNhMSwgMHgxYzBjYTQzMiwgMHgzOTg2YTMyNCwKLQkweDM5ODEyMDFlLCAweDFjMTdlZjM5LCAweDFjMzljOWNkLCAweDM5NzA4OWJmLCAweDM5NmFmZGRjLCAweDFjNDUxMDdjLCAweDFjNjZkZGZlLCAweDM5NWE0Y2ViLAotCTB4Mzk1NGI4MmUsIDB4MWM3MjIwNGYsIDB4MWM5M2UwYWIsIDB4Mzk0M2VjYjYsIDB4MzkzZTRmMjMsIDB4MWM5ZjFlOTYsIDB4MWNjMGQxYjYsIDB4MzkyZDY5MmYsCi0JMHgzOTI3YzJjOSwgMHgxY2NjMGIzNSwgMHgxY2VkYjEwNiwgMHgzOTE2YzI2MiwgMHgzOTExMTMyZCwgMHgxY2Y4ZTYxMSwgMHgxZDFhN2U3ZCwgMHgzOGZmZjg1ZSwKLQkweDM4ZmE0MDVlLCAweDFkMjVhZjBkLCAweDFkNDczYTAwLCAweDM4ZTkwYjMxLCAweDM4ZTM0YTY5LCAweDFkNTI2NjBmLCAweDFkNzNlMzc0LCAweDM4ZDFmYWU5LAotCTB4MzhjYzMxNWQsIDB4MWQ3ZjBhZmIsIDB4MWRhMDdhYmMsIDB4MzhiYWM3OTUsIDB4MzhiNGY1NDcsIDB4MWRhYjlkYjUsIDB4MWRjY2ZmYmYsIDB4MzhhMzcxNDIsCi0JMHgzODlkOTYzNywgMHgxZGQ4MWUyMSwgMHgxZGY5NzI1ZiwgMHgzODhiZjdmZiwgMHgzODg2MTQzYiwgMHgxZTA0OGMyNCwgMHgxZTI1ZDI4MiwgMHgzODc0NWJkYiwKLQkweDM4NmU2ZjYwLCAweDFlMzBlN2E0LCAweDFlNTIyMDBjLCAweDM4NWM5Y2UzLCAweDM4NTZhN2I2LCAweDFlNWQzMDg0LCAweDFlN2U1YWUyLCAweDM4NDRiYjI4LAotCTB4MzgzZWJkNGMsIDB4MWU4OTY2YTgsIDB4MWVhYTgyZTksIDB4MzgyY2I2YjcsIDB4MzgyNmIwMzAsIDB4MWViNTg5ZjcsIDB4MWVkNjk4MDUsIDB4MzgxNDhmOWYsCi0JMHgzODBlODA3MSwgMHgxZWUxOWE1NCwgMHgxZjAyOWExYywgMHgzN2ZjNDVlZiwgMHgzN2Y2MmUxZCwgMHgxZjBkOTdhNSwgMHgxZjJlODkxMSwgMHgzN2UzZDliNywKLQkweDM3ZGRiOTQ1LCAweDFmMzk4MWNlLCAweDFmNWE2NGNiLCAweDM3Y2I0YjA0LCAweDM3YzUyMWY2LCAweDFmNjU1OGI1LCAweDFmODYyZDJkLCAweDM3YjI5OWU3LAotCTB4MzdhYzY4NDEsIDB4MWY5MTFjM2QsIDB4MWZiMWUyMWQsIDB4Mzc5OWM2NmYsIDB4Mzc5MzhjMzQsIDB4MWZiY2NjNGQsIDB4MWZkZDgzODEsIDB4Mzc4MGQwYWEsCi0JMHgzNzdhOGRkZiwgMHgxZmU4NjhjOCwgMHgyMDA5MTEzYywgMHgzNzY3YjhhOSwgMHgzNzYxNmQ1MSwgMHgyMDEzZjE5NiwgMHgyMDM0OGIzNSwgMHgzNzRlN2U3YiwKLQkweDM3NDgyYTlhLCAweDIwM2Y2Njk5LCAweDIwNWZmMTRmLCAweDM3MzUyMjJmLCAweDM3MmVjNWM5LCAweDIwNmFjN2I4LCAweDIwOGI0MzcyLCAweDM3MWJhM2Q0LAotCTB4MzcxNTNlZWUsIDB4MjA5NjE0ZDksIDB4MjBiNjgxODEsIDB4MzcwMjAzN2MsIDB4MzZmYjk2MTgsIDB4MjBjMTRkZGYsIDB4MjBlMWFiNjMsIDB4MzZlODQxMzUsCi0JMHgzNmUxY2I1OCwgMHgyMGVjNzJiMSwgMHgyMTBjYzBmYywgMHgzNmNlNWQxMCwgMHgzNmM3ZGViZCwgMHgyMTE3ODMzNCwgMHgyMTM3YzIzMiwgMHgzNmI0NTcxYiwKLQkweDM2YWRkMDU4LCAweDIxNDI3ZjRkLCAweDIxNjJhZWVhLCAweDM2OWEyZjY5LCAweDM2OTNhMDM4LCAweDIxNmQ2NmUyLCAweDIxOGQ4NzBiLCAweDM2N2ZlNjA4LAotCTB4MzY3OTRlNmUsIDB4MjE5ODM5ZDgsIDB4MjFiODRhNzksIDB4MzY2NTdiMDgsIDB4MzY1ZWRiMDksIDB4MjFjMmY4MTUsIDB4MjFlMmY5MWEsIDB4MzY0YWVlN2IsCi0JMHgzNjQ0NDYxYiwgMHgyMWVkYTE3ZiwgMHgyMjBkOTJkNCwgMHgzNjMwNDA3MCwgMHgzNjI5OGZiNCwgMHgyMjE4MzVmYiwgMHgyMjM4MTc4ZCwgMHgzNjE1NzBmOCwKLQkweDM2MGViN2UzLCAweDIyNDJiNTZmLCAweDIyNjI4NzI5LCAweDM1ZmE4MDIzLCAweDM1ZjNiZWJhLCAweDIyNmQxZmMxLCAweDIyOGNlMTkxLCAweDM1ZGY2ZTAzLAotCTB4MzVkOGE0NDksIDB4MjI5Nzc0ZDcsIDB4MjJiNzI2YTgsIDB4MzVjNDNhYTcsIDB4MzViZDY4YTEsIDB4MjJjMWI0OTYsIDB4MjJlMTU2NTUsIDB4MzVhOGU2MjEsCi0JMHgzNWEyMGJkMywgMHgyMmViZGVlNSwgMHgyMzBiNzA3ZSwgMHgzNThkNzA4MSwgMHgzNTg2OGRlZiwgMHgyMzE1ZjNhOCwgMHgyMzM1NzUwOSwgMHgzNTcxZDlkOSwKLQkweDM1NmFlZjA4LCAweDIzM2ZmMmM4LCAweDIzNWY2M2RjLCAweDM1NTYyMjM5LCAweDM1NGYyZjJjLCAweDIzNjlkYzI5LCAweDIzODkzY2RkLCAweDM1M2E0OWIyLAotCTB4MzUzMzRlNmYsIDB4MjM5M2FmYjIsIDB4MjNiMmZmZjMsIDB4MzUxZTUwNTYsIDB4MzUxNzRjZTAsIDB4MjNiZDZkNDgsIDB4MjNkY2FkMDMsIDB4MzUwMjM2MzYsCi0JMHgzNGZiMmE5MiwgMHgyM2U3MTRkMywgMHgyNDA2NDNmNCwgMHgzNGU1ZmI2MywgMHgzNGRlZTc5NSwgMHgyNDEwYTYzOSwgMHgyNDJmYzRhZCwgMHgzNGM5OWZlZiwKLQkweDM0YzI4M2ZiLCAweDI0M2EyMTVmLCAweDI0NTkyZjEzLCAweDM0YWQyM2ViLCAweDM0YTVmZmQ1LCAweDI0NjM4NjJjLCAweDI0ODI4MzBkLCAweDM0OTA4NzY4LAotCTB4MzQ4OTViMzYsIDB4MjQ4Y2Q0ODcsIDB4MjRhYmMwODIsIDB4MzQ3M2NhNzksIDB4MzQ2Yzk2MmYsIDB4MjRiNjBjNTcsIDB4MjRkNGU3NTcsIDB4MzQ1NmVkMmYsCi0JMHgzNDRmYjBkMSwgMHgyNGRmMmQ4MSwgMHgyNGZkZjc3NSwgMHgzNDM5ZWY5YywgMHgzNDMyYWIyZSwgMHgyNTA4MzdlZCwgMHgyNTI2ZjBjMSwgMHgzNDFjZDFkMiwKLQkweDM0MTU4NTU5LCAweDI1MzEyYjgxLCAweDI1NGZkMzIzLCAweDMzZmY5M2UyLCAweDMzZjgzZjYyLCAweDI1NWEwODIzLCAweDI1Nzg5ZTgwLCAweDMzZTIzNWRmLAotCTB4MzNkYWQ5NWUsIDB4MjU4MmNkYmMsIDB4MjVhMTUyYzAsIDB4MzNjNGI3ZGIsIDB4MzNiZDUzNWMsIDB4MjVhYjdjMzAsIDB4MjVjOWVmY2EsIDB4MzNhNzE5ZTgsCi0JMHgzMzlmYWQ3MCwgMHgyNWQ0MTM2OSwgMHgyNWYyNzU4NCwgMHgzMzg5NWMxOCwgMHgzMzgxZTdhYywgMHgyNWZjOTM0YiwgMHgyNjFhZTNkNiwgMHgzMzZiN2U3ZSwKLQkweDMzNjQwMjIzLCAweDI2MjRmYmJmLCAweDI2NDMzYWE3LCAweDMzNGQ4MTJkLCAweDMzNDVmY2U2LCAweDI2NGQ0Y2FjLCAweDI2NmI3OWRkLCAweDMzMmY2NDM1LAotCTB4MzMyN2Q4MDgsIDB4MjY3NTg1ZjgsIDB4MjY5M2ExNjEsIDB4MzMxMTI3YWIsIDB4MzMwOTkzOWMsIDB4MjY5ZGE3OGIsIDB4MjZiYmIxMTksIDB4MzJmMmNiYTEsCi0JMHgzMmViMmZiNSwgMHgyNmM1YjE0YywgMHgyNmUzYThlYywgMHgzMmQ0NTAyOSwgMHgzMmNjYWM2NCwgMHgyNmVkYTMyMiwgMHgyNzBiODhjMiwgMHgzMmI1YjU1NywKLQkweDMyYWUwOWJlLCAweDI3MTU3Y2Y1LCAweDI3MzM1MDgyLCAweDMyOTZmYjNkLCAweDMyOGY0N2Q1LCAweDI3M2QzZWFjLCAweDI3NWIwMDE0LCAweDMyNzgyMWVlLAotCTB4MzI3MDY2YmMsIDB4Mjc2NGU4MmYsIDB4Mjc4Mjk3NjAsIDB4MzI1OTI5N2QsIDB4MzI1MTY2ODYsIDB4Mjc4Yzc5NjUsIDB4MjdhYTE2NGMsIDB4MzIzYTExZmUsCi0JMHgzMjMyNDc0NiwgMHgyN2IzZjIzNSwgMHgyN2QxN2NjMSwgMHgzMjFhZGI4MywgMHgzMjEzMDkwZiwgMHgyN2RiNTI4OCwgMHgyN2Y4Y2FhNSwgMHgzMWZiODYyMCwKLQkweDMxZjNhYmY1LCAweDI4MDI5YTQ1LCAweDI4MWZmZmUyLCAweDMxZGMxMWU4LCAweDMxZDQzMDBiLCAweDI4MjljOTU0LCAweDI4NDcxYzVlLCAweDMxYmM3ZWVlLAotCTB4MzFiNDk1NjQsIDB4Mjg1MGRmOWQsIDB4Mjg2ZTIwMDIsIDB4MzE5Y2NkNDYsIDB4MzE5NGRjMTQsIDB4Mjg3N2RkMDcsIDB4Mjg5NTBhYjYsIDB4MzE3Y2ZkMDQsCi0JMHgzMTc1MDQyZSwgMHgyODllYzE3YSwgMHgyOGJiZGM2MSwgMHgzMTVkMGUzYiwgMHgzMTU1MGRjNiwgMHgyOGM1OGNkZiwgMHgyOGUyOTRlYiwgMHgzMTNkMDBmZiwKLQkweDMxMzRmOGYxLCAweDI4ZWMzZjFlLCAweDI5MDkzNDNlLCAweDMxMWNkNTY0LCAweDMxMTRjNWMwLCAweDI5MTJkODFmLCAweDI5MmZiYTQwLCAweDMwZmM4YjdkLAotCTB4MzBmNDc0NDksIDB4MjkzOTU3YzksIDB4Mjk1NjI2ZGEsIDB4MzBkYzIzNWUsIDB4MzBkNDA0YTAsIDB4Mjk1ZmJlMDYsIDB4Mjk3Yzc5ZjUsIDB4MzBiYjlkMWMsCi0JMHgzMGIzNzZkOCwgMHgyOTg2MGFiZCwgMHgyOWEyYjM3OCwgMHgzMDlhZjhjYSwgMHgzMDkyY2IwNSwgMHgyOWFjM2RkNywgMHgyOWM4ZDM0ZCwgMHgzMDdhMzY3YywKLQkweDMwNzIwMTNjLCAweDI5ZDI1NzNjLCAweDI5ZWVkOTViLCAweDMwNTk1NjQ4LCAweDMwNTExOTkxLCAweDI5Zjg1NmQ1LCAweDJhMTRjNThiLCAweDMwMzg1ODQwLAotCTB4MzAzMDE0MTgsIDB4MmExZTNjOGEsIDB4MmEzYTk3YzcsIDB4MzAxNzNjN2EsIDB4MzAwZWYwZTUsIDB4MmE0NDA4NDQsIDB4MmE2MDRmZjUsIDB4MmZmNjAzMGEsCi0JMHgyZmVkYjAwZCwgMHgyYTY5YjllYywgMHgyYTg1ZWUwMCwgMHgyZmQ0YWMwNCwgMHgyZmNjNTFhNSwgMHgyYThmNTE2YiwgMHgyYWFiNzFkMCwgMHgyZmIzMzc3YywKLQkweDJmYWFkNWMxLCAweDJhYjRjZWE5LCAweDJhZDBkYjRlLCAweDJmOTFhNTg5LCAweDJmODkzYzc1LCAweDJhZGEzMThlLCAweDJhZjYyYTYzLCAweDJmNmZmNjNkLAotCTB4MmY2Nzg1ZDcsIDB4MmFmZjdhMDUsIDB4MmIxYjVlZjgsIDB4MmY0ZTI5YWYsIDB4MmY0NWIxZmIsIDB4MmIyNGE3ZjYsIDB4MmI0MDc4ZjUsIDB4MmYyYzNmZjIsCi0JMHgyZjIzYzBmNiwgMHgyYjQ5YmI0YSwgMHgyYjY1Nzg0NCwgMHgyZjBhMzkxZCwgMHgyZjAxYjJkZSwgMHgyYjZlYjNlYSwgMHgyYjhhNWNjZSwgMHgyZWU4MTU0MywKLQkweDJlZGY4N2M2LCAweDJiOTM5MWMwLCAweDJiYWYyNjdkLCAweDJlYzVkNDc5LCAweDJlYmQzZmM0LCAweDJiYjg1NGI0LCAweDJiZDNkNTNhLCAweDJlYTM3NmQ2LAotCTB4MmU5YWRhZWUsIDB4MmJkY2ZjYjAsIDB4MmJmODY4ZWQsIDB4MmU4MGZjNmUsIDB4MmU3ODU5NTgsIDB4MmMwMTg5OWUsIDB4MmMxY2UxODEsIDB4MmU1ZTY1NTYsCi0JMHgyZTU1YmIxNywgMHgyYzI1ZmI2NiwgMHgyYzQxM2VkZiwgMHgyZTNiYjFhNCwgMHgyZTMzMDA0MiwgMHgyYzRhNTFmMywgMHgyYzY1ODBmMSwgMHgyZTE4ZTE2ZCwKLQkweDJlMTAyOGVkLCAweDJjNmU4ZDJlLCAweDJjODlhNzlmLCAweDJkZjVmNGM3LCAweDJkZWQzNTJmLCAweDJjOTJhZDAxLCAweDJjYWRiMmQ1LCAweDJkZDJlYmM3LAotCTB4MmRjYTI1MWMsIDB4MmNiNmIxNTUsIDB4MmNkMWEyN2IsIDB4MmRhZmM2ODMsIDB4MmRhNmY4Y2EsIDB4MmNkYTlhMTQsIDB4MmNmNTc2N2MsIDB4MmQ4Yzg1MTAsCi0JMHgyZDgzYjA0ZiwgMHgyY2ZlNjcyOCwgMHgyZDE5MmVjMSwgMHgyZDY5Mjc4NCwgMHgyZDYwNGJjMCwgMHgyZDIyMTg3YSwgMHgyZDNjY2IzNCwgMHgyZDQ1YWRmNgotfTsKLQotY29uc3QgaW50IHR3aWRUYWI1MTJbOCo2ICsgMzIqNiArIDEyOCo2XSA9IHsKLQkweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDNiMjBkNzllLCAweDE4N2RlMmE2LAotCTB4M2VjNTJmOWYsIDB4MGM3YzVjMWUsIDB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsIDB4MmQ0MTNjY2MsIDB4MmQ0MTNjY2MsIDB4M2IyMGQ3OWUsIDB4MTg3ZGUyYTYsCi0JMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgMHhmMzgzYTNlMiwgMHgzZWM1MmY5ZiwKLQkweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDJkNDEzY2NjLCAweDJkNDEzY2NjLCAweGQyYmVjMzM0LCAweDJkNDEzY2NjLCAweGU3ODIxZDVhLCAweDNiMjBkNzllLAotCTB4MjM4ZTc2NzMsIDB4MzUzNmNjNTIsIDB4YzEzYWQwNjEsIDB4MGM3YzVjMWUsIDB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsCi0JMHhjNGRmMjg2MiwgMHhlNzgyMWQ1YSwgMHhjNGRmMjg2MiwgMHgxODdkZTJhNiwgMHgwYzdjNWMxZSwgMHgzZWM1MmY5ZiwgMHhkYzcxODk4ZCwgMHhjYWM5MzNhZSwKLQotCTB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2ZiMTFiNDcsIDB4MDY0NWU5YWYsCi0JMHgzZmVjNDNjNiwgMHgwMzIzZWNiZSwgMHgzZjRlYWFmZSwgMHgwOTY0MDgzNywgMHgzZWM1MmY5ZiwgMHgwYzdjNWMxZSwgMHgzZmIxMWI0NywgMHgwNjQ1ZTlhZiwKLQkweDNkM2U4MmFkLCAweDEyOTQwNjJlLCAweDNkM2U4MmFkLCAweDEyOTQwNjJlLCAweDNmNGVhYWZlLCAweDA5NjQwODM3LCAweDM5ZGFmNWU4LCAweDFiNWQxMDA5LAotCTB4M2IyMGQ3OWUsIDB4MTg3ZGUyYTYsIDB4M2VjNTJmOWYsIDB4MGM3YzVjMWUsIDB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsIDB4Mzg3MTY1ZTMsIDB4MWUyYjVkMzgsCi0JMHgzZTE0ZmRmNywgMHgwZjhjZmNiZCwgMHgyZjZiYmU0NCwgMHgyYWZhZDI2OSwgMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgMHgzZDNlODJhZCwgMHgxMjk0MDYyZSwKLQkweDI4OTllNjRhLCAweDMxNzkwMGQ2LCAweDMxNzkwMGQ2LCAweDI4OTllNjRhLCAweDNjNDI0MjA5LCAweDE1OGY5YTc1LCAweDIwZTcwZjMyLCAweDM2ZTUwNjhhLAotCTB4MmQ0MTNjY2MsIDB4MmQ0MTNjY2MsIDB4M2IyMGQ3OWUsIDB4MTg3ZGUyYTYsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4Mjg5OWU2NGEsIDB4MzE3OTAwZDYsCi0JMHgzOWRhZjVlOCwgMHgxYjVkMTAwOSwgMHgwZjhjZmNiZCwgMHgzZTE0ZmRmNywgMHgyMzhlNzY3MywgMHgzNTM2Y2M1MiwgMHgzODcxNjVlMywgMHgxZTJiNWQzOCwKLQkweDA2NDVlOWFmLCAweDNmYjExYjQ3LCAweDFlMmI1ZDM4LCAweDM4NzE2NWUzLCAweDM2ZTUwNjhhLCAweDIwZTcwZjMyLCAweGZjZGMxMzQyLCAweDNmZWM0M2M2LAotCTB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsIDB4ZjM4M2EzZTIsIDB4M2VjNTJmOWYsIDB4MTI5NDA2MmUsIDB4M2QzZTgyYWQsCi0JMHgzMzY3YzA4ZiwgMHgyNjFmZWZmOSwgMHhlYTcwNjU4YiwgMHgzYzQyNDIwOSwgMHgwYzdjNWMxZSwgMHgzZWM1MmY5ZiwgMHgzMTc5MDBkNiwgMHgyODk5ZTY0YSwKLQkweGUxZDRhMmM4LCAweDM4NzE2NWUzLCAweDA2NDVlOWFmLCAweDNmYjExYjQ3LCAweDJmNmJiZTQ0LCAweDJhZmFkMjY5LCAweGQ5ZTAxMDA3LCAweDMzNjdjMDhmLAotCTB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MmQ0MTNjY2MsIDB4MmQ0MTNjY2MsIDB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4ZjliYTE2NTEsIDB4M2ZiMTFiNDcsCi0JMHgyYWZhZDI2OSwgMHgyZjZiYmU0NCwgMHhjYzk4M2Y3MSwgMHgyNjFmZWZmOSwgMHhmMzgzYTNlMiwgMHgzZWM1MmY5ZiwgMHgyODk5ZTY0YSwgMHgzMTc5MDBkNiwKLQkweGM3OGU5YTFkLCAweDFlMmI1ZDM4LCAweGVkNmJmOWQyLCAweDNkM2U4MmFkLCAweDI2MWZlZmY5LCAweDMzNjdjMDhmLCAweGMzYmRiZGY3LCAweDE1OGY5YTc1LAotCTB4ZTc4MjFkNWEsIDB4M2IyMGQ3OWUsIDB4MjM4ZTc2NzMsIDB4MzUzNmNjNTIsIDB4YzEzYWQwNjEsIDB4MGM3YzVjMWUsIDB4ZTFkNGEyYzgsIDB4Mzg3MTY1ZTMsCi0JMHgyMGU3MGYzMiwgMHgzNmU1MDY4YSwgMHhjMDEzYmMzYSwgMHgwMzIzZWNiZSwgMHhkYzcxODk4ZCwgMHgzNTM2Y2M1MiwgMHgxZTJiNWQzOCwgMHgzODcxNjVlMywKLQkweGMwNGVlNGI5LCAweGY5YmExNjUxLCAweGQ3NjYxOWI2LCAweDMxNzkwMGQ2LCAweDFiNWQxMDA5LCAweDM5ZGFmNWU4LCAweGMxZWIwMjA5LCAweGYwNzMwMzQzLAotCTB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4YzRkZjI4NjIsIDB4ZTc4MjFkNWEsIDB4Y2U4NmZmMmEsIDB4Mjg5OWU2NGEsCi0JMHgxNThmOWE3NSwgMHgzYzQyNDIwOSwgMHhjOTFhZjk3NiwgMHhkZjE4ZjBjZSwgMHhjYWM5MzNhZSwgMHgyMzhlNzY3MywgMHgxMjk0MDYyZSwgMHgzZDNlODJhZCwKLQkweGNlODZmZjJhLCAweGQ3NjYxOWI2LCAweGM3OGU5YTFkLCAweDFlMmI1ZDM4LCAweDBmOGNmY2JkLCAweDNlMTRmZGY3LCAweGQ1MDUyZDk3LCAweGQwOTQ0MWJjLAotCTB4YzRkZjI4NjIsIDB4MTg3ZGUyYTYsIDB4MGM3YzVjMWUsIDB4M2VjNTJmOWYsIDB4ZGM3MTg5OGQsIDB4Y2FjOTMzYWUsIDB4YzJjMTdkNTMsIDB4MTI5NDA2MmUsCi0JMHgwOTY0MDgzNywgMHgzZjRlYWFmZSwgMHhlNGEyZWZmNywgMHhjNjI1MGExOCwgMHhjMTNhZDA2MSwgMHgwYzdjNWMxZSwgMHgwNjQ1ZTlhZiwgMHgzZmIxMWI0NywKLQkweGVkNmJmOWQyLCAweGMyYzE3ZDUzLCAweGMwNGVlNGI5LCAweDA2NDVlOWFmLCAweDAzMjNlY2JlLCAweDNmZWM0M2M2LCAweGY2OWJmN2M5LCAweGMwYjE1NTAyLAotCi0JMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgzZmZiMTBjMSwgMHgwMTkyMTU1ZiwKLQkweDNmZmVjNDJkLCAweDAwYzkwZThmLCAweDNmZjRlNWRmLCAweDAyNWIwY2FlLCAweDNmZWM0M2M2LCAweDAzMjNlY2JlLCAweDNmZmIxMGMxLCAweDAxOTIxNTVmLAotCTB4M2ZkMzliNWEsIDB4MDRiNTQ4MjQsIDB4M2ZkMzliNWEsIDB4MDRiNTQ4MjQsIDB4M2ZmNGU1ZGYsIDB4MDI1YjBjYWUsIDB4M2Y5YzJiZmEsIDB4MDcwZGUxNzEsCi0JMHgzZmIxMWI0NywgMHgwNjQ1ZTlhZiwgMHgzZmVjNDNjNiwgMHgwMzIzZWNiZSwgMHgzZjRlYWFmZSwgMHgwOTY0MDgzNywgMHgzZjg0YzhlMSwgMHgwN2Q1OTM5NSwKLQkweDNmZTEyYWNiLCAweDAzZWNhZGNmLCAweDNlZWIzMzQ3LCAweDBiYjZlY2VmLCAweDNmNGVhYWZlLCAweDA5NjQwODM3LCAweDNmZDM5YjVhLCAweDA0YjU0ODI0LAotCTB4M2U3MWU3NTgsIDB4MGUwNWMxMzUsIDB4M2YwZWM5ZjQsIDB4MGFmMTBhMjIsIDB4M2ZjMzk1ZjksIDB4MDU3ZGI0MDIsIDB4M2RlMmYxNDcsIDB4MTA0ZmI4MGUsCi0JMHgzZWM1MmY5ZiwgMHgwYzdjNWMxZSwgMHgzZmIxMWI0NywgMHgwNjQ1ZTlhZiwgMHgzZDNlODJhZCwgMHgxMjk0MDYyZSwgMHgzZTcxZTc1OCwgMHgwZTA1YzEzNSwKLQkweDNmOWMyYmZhLCAweDA3MGRlMTcxLCAweDNjODRkNDk2LCAweDE0ZDFlMjQyLCAweDNlMTRmZGY3LCAweDBmOGNmY2JkLCAweDNmODRjOGUxLCAweDA3ZDU5Mzk1LAotCTB4M2JiNjI3NmQsIDB4MTcwODg1MzAsIDB4M2RhZTgxY2UsIDB4MTExMWQyNjIsIDB4M2Y2YWYyZTMsIDB4MDg5Y2Y4NjcsIDB4M2FkMmMyZTcsIDB4MTkzNzJhNjMsCi0JMHgzZDNlODJhZCwgMHgxMjk0MDYyZSwgMHgzZjRlYWFmZSwgMHgwOTY0MDgzNywgMHgzOWRhZjVlOCwgMHgxYjVkMTAwOSwgMHgzY2M1MTFkOCwgMHgxNDEzNWM5NCwKLQkweDNmMmZmMjQ5LCAweDBhMmFiYjU4LCAweDM4Y2YxNjY5LCAweDFkNzk3NzViLCAweDNjNDI0MjA5LCAweDE1OGY5YTc1LCAweDNmMGVjOWY0LCAweDBhZjEwYTIyLAotCTB4MzdhZjgxNTgsIDB4MWY4YmE0ZGIsIDB4M2JiNjI3NmQsIDB4MTcwODg1MzAsIDB4M2VlYjMzNDcsIDB4MGJiNmVjZWYsIDB4MzY3YzlhN2QsIDB4MjE5MmUwOWEsCi0JMHgzYjIwZDc5ZSwgMHgxODdkZTJhNiwgMHgzZWM1MmY5ZiwgMHgwYzdjNWMxZSwgMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgMHgzYTgyNjlhMiwgMHgxOWVmNzk0MywKLQkweDNlOWNjMDc2LCAweDBkNDE1MDEyLCAweDMzZGU4N2RlLCAweDI1N2RiNjRiLCAweDM5ZGFmNWU4LCAweDFiNWQxMDA5LCAweDNlNzFlNzU4LCAweDBlMDVjMTM1LAotCTB4MzI3NDQ0OTMsIDB4Mjc1ZmY0NTIsIDB4MzkyYTk2NDIsIDB4MWNjNjZlOTksIDB4M2U0NGE1ZWUsIDB4MGVjOWE3ZjIsIDB4MzBmODgwMWYsIDB4MjkzNDg5MzcsCi0JMHgzODcxNjVlMywgMHgxZTJiNWQzOCwgMHgzZTE0ZmRmNywgMHgwZjhjZmNiZCwgMHgyZjZiYmU0NCwgMHgyYWZhZDI2OSwgMHgzN2FmODE1OCwgMHgxZjhiYTRkYiwKLQkweDNkZTJmMTQ3LCAweDEwNGZiODBlLCAweDJkY2U4OGE5LCAweDJjYjIzMjRiLCAweDM2ZTUwNjhhLCAweDIwZTcwZjMyLCAweDNkYWU4MWNlLCAweDExMTFkMjYyLAotCTB4MmMyMTZlYWEsIDB4MmU1YTEwNmYsIDB4MzYxMjE0YjAsIDB4MjIzZDY2YTgsIDB4M2Q3N2IxOTEsIDB4MTFkMzQ0M2YsIDB4MmE2NTA1MjUsIDB4MmZmMWQ5YzYsCi0JMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgMHgzZDNlODJhZCwgMHgxMjk0MDYyZSwgMHgyODk5ZTY0YSwgMHgzMTc5MDBkNiwgMHgzNDUzNGY0MCwgMHgyNGRhMGE5OSwKLQkweDNkMDJmNzU2LCAweDEzNTQxMGMyLCAweDI2YzBiMTYyLCAweDMyZWVmZGU5LCAweDMzNjdjMDhmLCAweDI2MWZlZmY5LCAweDNjYzUxMWQ4LCAweDE0MTM1Yzk0LAotCTB4MjRkYTBhOTksIDB4MzQ1MzRmNDAsIDB4MzI3NDQ0OTMsIDB4Mjc1ZmY0NTIsIDB4M2M4NGQ0OTYsIDB4MTRkMWUyNDIsIDB4MjJlNjlhYzcsIDB4MzVhNTc5M2MsCi0JMHgzMTc5MDBkNiwgMHgyODk5ZTY0YSwgMHgzYzQyNDIwOSwgMHgxNThmOWE3NSwgMHgyMGU3MGYzMiwgMHgzNmU1MDY4YSwgMHgzMDc2MWMxNywgMHgyOWNkOTU3NywKLQkweDNiZmQ1Y2M0LCAweDE2NGM3ZGRkLCAweDFlZGMxOTUyLCAweDM4MTE4ODRjLCAweDJmNmJiZTQ0LCAweDJhZmFkMjY5LCAweDNiYjYyNzZkLCAweDE3MDg4NTMwLAotCTB4MWNjNjZlOTksIDB4MzkyYTk2NDIsIDB4MmU1YTEwNmYsIDB4MmMyMTZlYWEsIDB4M2I2Y2E0YzQsIDB4MTdjM2E5MzEsIDB4MWFhNmM4MmIsIDB4M2EyZmNlZTgsCi0JMHgyZDQxM2NjYywgMHgyZDQxM2NjYywgMHgzYjIwZDc5ZSwgMHgxODdkZTJhNiwgMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHgyYzIxNmVhYSwgMHgyZTVhMTA2ZiwKLQkweDNhZDJjMmU3LCAweDE5MzcyYTYzLCAweDE2NGM3ZGRkLCAweDNiZmQ1Y2M0LCAweDJhZmFkMjY5LCAweDJmNmJiZTQ0LCAweDNhODI2OWEyLCAweDE5ZWY3OTQzLAotCTB4MTQxMzVjOTQsIDB4M2NjNTExZDgsIDB4MjljZDk1NzcsIDB4MzA3NjFjMTcsIDB4M2EyZmNlZTgsIDB4MWFhNmM4MmIsIDB4MTFkMzQ0M2YsIDB4M2Q3N2IxOTEsCi0JMHgyODk5ZTY0YSwgMHgzMTc5MDBkNiwgMHgzOWRhZjVlOCwgMHgxYjVkMTAwOSwgMHgwZjhjZmNiZCwgMHgzZTE0ZmRmNywgMHgyNzVmZjQ1MiwgMHgzMjc0NDQ5MywKLQkweDM5ODNlMWU3LCAweDFjMTI0OWQ4LCAweDBkNDE1MDEyLCAweDNlOWNjMDc2LCAweDI2MWZlZmY5LCAweDMzNjdjMDhmLCAweDM5MmE5NjQyLCAweDFjYzY2ZTk5LAotCTB4MGFmMTBhMjIsIDB4M2YwZWM5ZjQsIDB4MjRkYTBhOTksIDB4MzQ1MzRmNDAsIDB4MzhjZjE2NjksIDB4MWQ3OTc3NWIsIDB4MDg5Y2Y4NjcsIDB4M2Y2YWYyZTMsCi0JMHgyMzhlNzY3MywgMHgzNTM2Y2M1MiwgMHgzODcxNjVlMywgMHgxZTJiNWQzOCwgMHgwNjQ1ZTlhZiwgMHgzZmIxMWI0NywgMHgyMjNkNjZhOCwgMHgzNjEyMTRiMCwKLQkweDM4MTE4ODRjLCAweDFlZGMxOTUyLCAweDAzZWNhZGNmLCAweDNmZTEyYWNiLCAweDIwZTcwZjMyLCAweDM2ZTUwNjhhLCAweDM3YWY4MTU4LCAweDFmOGJhNGRiLAotCTB4MDE5MjE1NWYsIDB4M2ZmYjEwYzEsIDB4MWY4YmE0ZGIsIDB4MzdhZjgxNTgsIDB4Mzc0YjU0Y2UsIDB4MjAzOWY5MGUsIDB4ZmYzNmYxNzEsIDB4M2ZmZWM0MmQsCi0JMHgxZTJiNWQzOCwgMHgzODcxNjVlMywgMHgzNmU1MDY4YSwgMHgyMGU3MGYzMiwgMHhmY2RjMTM0MiwgMHgzZmVjNDNjNiwgMHgxY2M2NmU5OSwgMHgzOTJhOTY0MiwKLQkweDM2N2M5YTdkLCAweDIxOTJlMDlhLCAweGZhODI0YmZlLCAweDNmYzM5NWY5LCAweDFiNWQxMDA5LCAweDM5ZGFmNWU4LCAweDM2MTIxNGIwLCAweDIyM2Q2NmE4LAotCTB4ZjgyYTZjNmIsIDB4M2Y4NGM4ZTEsIDB4MTllZjc5NDMsIDB4M2E4MjY5YTIsIDB4MzVhNTc5M2MsIDB4MjJlNjlhYzcsIDB4ZjVkNTQ0YTgsIDB4M2YyZmYyNDksCi0JMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgMHhmMzgzYTNlMiwgMHgzZWM1MmY5ZiwgMHgxNzA4ODUzMCwgMHgzYmI2Mjc2ZCwKLQkweDM0YzYxMjM2LCAweDI0MzRmMzMyLCAweGYxMzY1ODBlLCAweDNlNDRhNWVlLCAweDE1OGY5YTc1LCAweDNjNDI0MjA5LCAweDM0NTM0ZjQwLCAweDI0ZGEwYTk5LAotCTB4ZWVlZTJkOWUsIDB4M2RhZTgxY2UsIDB4MTQxMzVjOTQsIDB4M2NjNTExZDgsIDB4MzNkZTg3ZGUsIDB4MjU3ZGI2NGIsIDB4ZWNhYmVmM2UsIDB4M2QwMmY3NTYsCi0JMHgxMjk0MDYyZSwgMHgzZDNlODJhZCwgMHgzMzY3YzA4ZiwgMHgyNjFmZWZmOSwgMHhlYTcwNjU4YiwgMHgzYzQyNDIwOSwgMHgxMTExZDI2MiwgMHgzZGFlODFjZSwKLQkweDMyZWVmZGU5LCAweDI2YzBiMTYyLCAweGU4M2M1NmNmLCAweDNiNmNhNGM0LCAweDBmOGNmY2JkLCAweDNlMTRmZGY3LCAweDMyNzQ0NDkzLCAweDI3NWZmNDUyLAotCTB4ZTYxMDg2YmQsIDB4M2E4MjY5YTIsIDB4MGUwNWMxMzUsIDB4M2U3MWU3NTgsIDB4MzFmNzk5NDcsIDB4MjdmZGIyYTYsIDB4ZTNlZGI2MjgsIDB4Mzk4M2UxZTcsCi0JMHgwYzdjNWMxZSwgMHgzZWM1MmY5ZiwgMHgzMTc5MDBkNiwgMHgyODk5ZTY0YSwgMHhlMWQ0YTJjOCwgMHgzODcxNjVlMywgMHgwYWYxMGEyMiwgMHgzZjBlYzlmNCwKLQkweDMwZjg4MDFmLCAweDI5MzQ4OTM3LCAweGRmYzYwNmYyLCAweDM3NGI1NGNlLCAweDA5NjQwODM3LCAweDNmNGVhYWZlLCAweDMwNzYxYzE3LCAweDI5Y2Q5NTc3LAotCTB4ZGRjMjk5NTgsIDB4MzYxMjE0YjAsIDB4MDdkNTkzOTUsIDB4M2Y4NGM4ZTEsIDB4MmZmMWQ5YzYsIDB4MmE2NTA1MjUsIDB4ZGJjYjBjY2UsIDB4MzRjNjEyMzYsCi0JMHgwNjQ1ZTlhZiwgMHgzZmIxMWI0NywgMHgyZjZiYmU0NCwgMHgyYWZhZDI2OSwgMHhkOWUwMTAwNywgMHgzMzY3YzA4ZiwgMHgwNGI1NDgyNCwgMHgzZmQzOWI1YSwKLQkweDJlZTNjZWJlLCAweDJiOGVmNzdjLCAweGQ4MDI0ZDVhLCAweDMxZjc5OTQ3LCAweDAzMjNlY2JlLCAweDNmZWM0M2M2LCAweDJlNWExMDZmLCAweDJjMjE2ZWFhLAotCTB4ZDYzMjZhODksIDB4MzA3NjFjMTcsIDB4MDE5MjE1NWYsIDB4M2ZmYjEwYzEsIDB4MmRjZTg4YTksIDB4MmNiMjMyNGIsIDB4ZDQ3MTA4ODQsIDB4MmVlM2NlYmUsCi0JMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgyZDQxM2NjYywgMHgyZDQxM2NjYywgMHhkMmJlYzMzNCwgMHgyZDQxM2NjYywgMHhmZTZkZWFhMSwgMHgzZmZiMTBjMSwKLQkweDJjYjIzMjRiLCAweDJkY2U4OGE5LCAweGQxMWMzMTQyLCAweDJiOGVmNzdjLCAweGZjZGMxMzQyLCAweDNmZWM0M2M2LCAweDJjMjE2ZWFhLCAweDJlNWExMDZmLAotCTB4Y2Y4OWUzZTksIDB4MjljZDk1NzcsIDB4ZmI0YWI3ZGMsIDB4M2ZkMzliNWEsIDB4MmI4ZWY3N2MsIDB4MmVlM2NlYmUsIDB4Y2UwODY2YjksIDB4MjdmZGIyYTYsCi0JMHhmOWJhMTY1MSwgMHgzZmIxMWI0NywgMHgyYWZhZDI2OSwgMHgyZjZiYmU0NCwgMHhjYzk4M2Y3MSwgMHgyNjFmZWZmOSwgMHhmODJhNmM2YiwgMHgzZjg0YzhlMSwKLQkweDJhNjUwNTI1LCAweDJmZjFkOWM2LCAweGNiMzllZGNhLCAweDI0MzRmMzMyLCAweGY2OWJmN2M5LCAweDNmNGVhYWZlLCAweDI5Y2Q5NTc3LCAweDMwNzYxYzE3LAotCTB4YzllZGViNTAsIDB4MjIzZDY2YTgsIDB4ZjUwZWY1ZGUsIDB4M2YwZWM5ZjQsIDB4MjkzNDg5MzcsIDB4MzBmODgwMWYsIDB4YzhiNGFiMzIsIDB4MjAzOWY5MGUsCi0JMHhmMzgzYTNlMiwgMHgzZWM1MmY5ZiwgMHgyODk5ZTY0YSwgMHgzMTc5MDBkNiwgMHhjNzhlOWExZCwgMHgxZTJiNWQzOCwgMHhmMWZhM2VjYiwgMHgzZTcxZTc1OCwKLQkweDI3ZmRiMmE2LCAweDMxZjc5OTQ3LCAweGM2N2MxZTE5LCAweDFjMTI0OWQ4LCAweGYwNzMwMzQzLCAweDNlMTRmZGY3LCAweDI3NWZmNDUyLCAweDMyNzQ0NDkzLAotCTB4YzU3ZDk2NWUsIDB4MTllZjc5NDMsIDB4ZWVlZTJkOWUsIDB4M2RhZTgxY2UsIDB4MjZjMGIxNjIsIDB4MzJlZWZkZTksIDB4YzQ5MzViM2MsIDB4MTdjM2E5MzEsCi0JMHhlZDZiZjlkMiwgMHgzZDNlODJhZCwgMHgyNjFmZWZmOSwgMHgzMzY3YzA4ZiwgMHhjM2JkYmRmNywgMHgxNThmOWE3NSwgMHhlYmVjYTM2YywgMHgzY2M1MTFkOCwKLQkweDI1N2RiNjRiLCAweDMzZGU4N2RlLCAweGMyZmQwOGFhLCAweDEzNTQxMGMyLCAweGVhNzA2NThiLCAweDNjNDI0MjA5LCAweDI0ZGEwYTk5LCAweDM0NTM0ZjQwLAotCTB4YzI1MTdlMzIsIDB4MTExMWQyNjIsIDB4ZThmNzdhZDAsIDB4M2JiNjI3NmQsIDB4MjQzNGYzMzIsIDB4MzRjNjEyMzYsIDB4YzFiYjVhMTIsIDB4MGVjOWE3ZjIsCi0JMHhlNzgyMWQ1YSwgMHgzYjIwZDc5ZSwgMHgyMzhlNzY3MywgMHgzNTM2Y2M1MiwgMHhjMTNhZDA2MSwgMHgwYzdjNWMxZSwgMHhlNjEwODZiZCwgMHgzYTgyNjlhMiwKLQkweDIyZTY5YWM3LCAweDM1YTU3OTNjLCAweGMwZDAwZGI3LCAweDBhMmFiYjU4LCAweGU0YTJlZmY3LCAweDM5ZGFmNWU4LCAweDIyM2Q2NmE4LCAweDM2MTIxNGIwLAotCTB4YzA3YjM3MWYsIDB4MDdkNTkzOTUsIDB4ZTMzOTkxNjcsIDB4MzkyYTk2NDIsIDB4MjE5MmUwOWEsIDB4MzY3YzlhN2QsIDB4YzAzYzZhMDcsIDB4MDU3ZGI0MDIsCi0JMHhlMWQ0YTJjOCwgMHgzODcxNjVlMywgMHgyMGU3MGYzMiwgMHgzNmU1MDY4YSwgMHhjMDEzYmMzYSwgMHgwMzIzZWNiZSwgMHhlMDc0NWIyNSwgMHgzN2FmODE1OCwKLQkweDIwMzlmOTBlLCAweDM3NGI1NGNlLCAweGMwMDEzYmQzLCAweDAwYzkwZThmLCAweGRmMThmMGNlLCAweDM2ZTUwNjhhLCAweDFmOGJhNGRiLCAweDM3YWY4MTU4LAotCTB4YzAwNGVmM2YsIDB4ZmU2ZGVhYTEsIDB4ZGRjMjk5NTgsIDB4MzYxMjE0YjAsIDB4MWVkYzE5NTIsIDB4MzgxMTg4NGMsIDB4YzAxZWQ1MzUsIDB4ZmMxMzUyMzEsCi0JMHhkYzcxODk4ZCwgMHgzNTM2Y2M1MiwgMHgxZTJiNWQzOCwgMHgzODcxNjVlMywgMHhjMDRlZTRiOSwgMHhmOWJhMTY1MSwgMHhkYjI1ZjU2NywgMHgzNDUzNGY0MCwKLQkweDFkNzk3NzViLCAweDM4Y2YxNjY5LCAweGMwOTUwZDFkLCAweGY3NjMwNzk5LCAweGQ5ZTAxMDA3LCAweDMzNjdjMDhmLCAweDFjYzY2ZTk5LCAweDM5MmE5NjQyLAotCTB4YzBmMTM2MGMsIDB4ZjUwZWY1ZGUsIDB4ZDhhMDBiYWUsIDB4MzI3NDQ0OTMsIDB4MWMxMjQ5ZDgsIDB4Mzk4M2UxZTcsIDB4YzE2MzNmOGEsIDB4ZjJiZWFmZWUsCi0JMHhkNzY2MTliNiwgMHgzMTc5MDBkNiwgMHgxYjVkMTAwOSwgMHgzOWRhZjVlOCwgMHhjMWViMDIwOSwgMHhmMDczMDM0MywgMHhkNjMyNmE4OSwgMHgzMDc2MWMxNywKLQkweDFhYTZjODJiLCAweDNhMmZjZWU4LCAweGMyODg0ZTZmLCAweGVlMmNiYmMxLCAweGQ1MDUyZDk3LCAweDJmNmJiZTQ0LCAweDE5ZWY3OTQzLCAweDNhODI2OWEyLAotCTB4YzMzYWVlMjgsIDB4ZWJlY2EzNmMsIDB4ZDNkZTkxNTYsIDB4MmU1YTEwNmYsIDB4MTkzNzJhNjMsIDB4M2FkMmMyZTcsIDB4YzQwMmEzM2MsIDB4ZTliMzgyMjMsCi0JMHhkMmJlYzMzNCwgMHgyZDQxM2NjYywgMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHhjNGRmMjg2MiwgMHhlNzgyMWQ1YSwgMHhkMWE1ZWY5MSwgMHgyYzIxNmVhYSwKLQkweDE3YzNhOTMxLCAweDNiNmNhNGM0LCAweGM1ZDAzMTE4LCAweGU1NTkzN2Q1LCAweGQwOTQ0MWJjLCAweDJhZmFkMjY5LCAweDE3MDg4NTMwLCAweDNiYjYyNzZkLAotCTB4YzZkNTY5YmUsIDB4ZTMzOTkxNjcsIDB4Y2Y4OWUzZTksIDB4MjljZDk1NzcsIDB4MTY0YzdkZGQsIDB4M2JmZDVjYzQsIDB4YzdlZTc3YjQsIDB4ZTEyM2U2YWUsCi0JMHhjZTg2ZmYyYSwgMHgyODk5ZTY0YSwgMHgxNThmOWE3NSwgMHgzYzQyNDIwOSwgMHhjOTFhZjk3NiwgMHhkZjE4ZjBjZSwgMHhjZDhiYmI2ZCwgMHgyNzVmZjQ1MiwKLQkweDE0ZDFlMjQyLCAweDNjODRkNDk2LCAweGNhNWE4NmM0LCAweGRkMTk2NTM5LCAweGNjOTgzZjcxLCAweDI2MWZlZmY5LCAweDE0MTM1Yzk0LCAweDNjYzUxMWQ4LAotCTB4Y2JhY2IwYzAsIDB4ZGIyNWY1NjcsIDB4Y2JhY2IwYzAsIDB4MjRkYTBhOTksIDB4MTM1NDEwYzIsIDB4M2QwMmY3NTYsIDB4Y2QxMTAyMTcsIDB4ZDkzZjRlOWUsCi0JMHhjYWM5MzNhZSwgMHgyMzhlNzY3MywgMHgxMjk0MDYyZSwgMHgzZDNlODJhZCwgMHhjZTg2ZmYyYSwgMHhkNzY2MTliNiwgMHhjOWVkZWI1MCwgMHgyMjNkNjZhOCwKLQkweDExZDM0NDNmLCAweDNkNzdiMTkxLCAweGQwMGUyNjNhLCAweGQ1OWFmYWRiLCAweGM5MWFmOTc2LCAweDIwZTcwZjMyLCAweDExMTFkMjYyLCAweDNkYWU4MWNlLAotCTB4ZDFhNWVmOTEsIDB4ZDNkZTkxNTYsIDB4Yzg1MDdlYTgsIDB4MWY4YmE0ZGIsIDB4MTA0ZmI4MGUsIDB4M2RlMmYxNDcsIDB4ZDM0ZGNkYjUsIDB4ZDIzMTc3NTcsCi0JMHhjNzhlOWExZCwgMHgxZTJiNWQzOCwgMHgwZjhjZmNiZCwgMHgzZTE0ZmRmNywgMHhkNTA1MmQ5NywgMHhkMDk0NDFiYywgMHhjNmQ1NjliZSwgMHgxY2M2NmU5OSwKLQkweDBlYzlhN2YyLCAweDNlNDRhNWVlLCAweGQ2Y2I3NmM5LCAweGNmMDc3ZmUxLCAweGM2MjUwYTE4LCAweDFiNWQxMDA5LCAweDBlMDVjMTM1LCAweDNlNzFlNzU4LAotCTB4ZDhhMDBiYWUsIDB4Y2Q4YmJiNmQsIDB4YzU3ZDk2NWUsIDB4MTllZjc5NDMsIDB4MGQ0MTUwMTIsIDB4M2U5Y2MwNzYsIDB4ZGE4MjQ5YjUsIDB4Y2MyMTc4MjIsCi0JMHhjNGRmMjg2MiwgMHgxODdkZTJhNiwgMHgwYzdjNWMxZSwgMHgzZWM1MmY5ZiwgMHhkYzcxODk4ZCwgMHhjYWM5MzNhZSwgMHhjNDQ5ZDg5MywgMHgxNzA4ODUzMCwKLQkweDBiYjZlY2VmLCAweDNlZWIzMzQ3LCAweGRlNmQxZjY2LCAweGM5ODM2NTgzLCAweGMzYmRiZGY3LCAweDE1OGY5YTc1LCAweDBhZjEwYTIyLCAweDNmMGVjOWY0LAotCTB4ZTA3NDViMjUsIDB4Yzg1MDdlYTgsIDB4YzMzYWVlMjgsIDB4MTQxMzVjOTQsIDB4MGEyYWJiNTgsIDB4M2YyZmYyNDksIDB4ZTI4Njg4YTUsIDB4YzczMGU5OTcsCi0JMHhjMmMxN2Q1MywgMHgxMjk0MDYyZSwgMHgwOTY0MDgzNywgMHgzZjRlYWFmZSwgMHhlNGEyZWZmNywgMHhjNjI1MGExOCwgMHhjMjUxN2UzMiwgMHgxMTExZDI2MiwKLQkweDA4OWNmODY3LCAweDNmNmFmMmUzLCAweGU2YzhkNTlkLCAweGM1MmQzZDE5LCAweGMxZWIwMjA5LCAweDBmOGNmY2JkLCAweDA3ZDU5Mzk1LCAweDNmODRjOGUxLAotCTB4ZThmNzdhZDAsIDB4YzQ0OWQ4OTMsIDB4YzE4ZTE4YTgsIDB4MGUwNWMxMzUsIDB4MDcwZGUxNzEsIDB4M2Y5YzJiZmEsIDB4ZWIyZTFkYmUsIDB4YzM3YjJiNmEsCi0JMHhjMTNhZDA2MSwgMHgwYzdjNWMxZSwgMHgwNjQ1ZTlhZiwgMHgzZmIxMWI0NywgMHhlZDZiZjlkMiwgMHhjMmMxN2Q1MywgMHhjMGYxMzYwYywgMHgwYWYxMGEyMiwKLQkweDA1N2RiNDAyLCAweDNmYzM5NWY5LCAweGVmYjA0N2YyLCAweGMyMWQwZWI5LCAweGMwYjE1NTAyLCAweDA5NjQwODM3LCAweDA0YjU0ODI0LCAweDNmZDM5YjVhLAotCTB4ZjFmYTNlY2IsIDB4YzE4ZTE4YTgsIDB4YzA3YjM3MWYsIDB4MDdkNTkzOTUsIDB4MDNlY2FkY2YsIDB4M2ZlMTJhY2IsIDB4ZjQ0OTEzMTEsIDB4YzExNGNjYjksCi0JMHhjMDRlZTRiOSwgMHgwNjQ1ZTlhZiwgMHgwMzIzZWNiZSwgMHgzZmVjNDNjNiwgMHhmNjliZjdjOSwgMHhjMGIxNTUwMiwgMHhjMDJjNjRhNiwgMHgwNGI1NDgyNCwKLQkweDAyNWIwY2FlLCAweDNmZjRlNWRmLCAweGY4ZjIxZThmLCAweGMwNjNkNDA2LCAweGMwMTNiYzNhLCAweDAzMjNlY2JlLCAweDAxOTIxNTVmLCAweDNmZmIxMGMxLAotCTB4ZmI0YWI3ZGMsIDB4YzAyYzY0YTYsIDB4YzAwNGVmM2YsIDB4MDE5MjE1NWYsIDB4MDBjOTBlOGYsIDB4M2ZmZWM0MmQsIDB4ZmRhNGYzNTIsIDB4YzAwYjFhMjEKLX07Ci0KLWNvbnN0IGludCB0d2lkVGFiNjRbNCo2ICsgMTYqNl0gPSB7Ci0JMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyZDQxM2NjYywgMHgyZDQxM2NjYywKLQkweDNiMjBkNzllLCAweDE4N2RlMmE2LCAweDE4N2RlMmE2LCAweDNiMjBkNzllLCAweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDJkNDEzY2NjLCAweDJkNDEzY2NjLAotCTB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4YzRkZjI4NjIsIDB4ZTc4MjFkNWEsCi0KLQkweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDNlYzUyZjlmLCAweDBjN2M1YzFlLAotCTB4M2ZiMTFiNDcsIDB4MDY0NWU5YWYsIDB4M2QzZTgyYWQsIDB4MTI5NDA2MmUsIDB4M2IyMGQ3OWUsIDB4MTg3ZGUyYTYsIDB4M2VjNTJmOWYsIDB4MGM3YzVjMWUsCi0JMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgMHgzZDNlODJhZCwgMHgxMjk0MDYyZSwgMHgyODk5ZTY0YSwgMHgzMTc5MDBkNiwKLQkweDJkNDEzY2NjLCAweDJkNDEzY2NjLCAweDNiMjBkNzllLCAweDE4N2RlMmE2LCAweDE4N2RlMmE2LCAweDNiMjBkNzllLCAweDIzOGU3NjczLCAweDM1MzZjYzUyLAotCTB4Mzg3MTY1ZTMsIDB4MWUyYjVkMzgsIDB4MDY0NWU5YWYsIDB4M2ZiMTFiNDcsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsCi0JMHhmMzgzYTNlMiwgMHgzZWM1MmY5ZiwgMHgwYzdjNWMxZSwgMHgzZWM1MmY5ZiwgMHgzMTc5MDBkNiwgMHgyODk5ZTY0YSwgMHhlMWQ0YTJjOCwgMHgzODcxNjVlMywKLQkweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDJkNDEzY2NjLCAweDJkNDEzY2NjLCAweGQyYmVjMzM0LCAweDJkNDEzY2NjLCAweGYzODNhM2UyLCAweDNlYzUyZjlmLAotCTB4Mjg5OWU2NGEsIDB4MzE3OTAwZDYsIDB4Yzc4ZTlhMWQsIDB4MWUyYjVkMzgsIDB4ZTc4MjFkNWEsIDB4M2IyMGQ3OWUsIDB4MjM4ZTc2NzMsIDB4MzUzNmNjNTIsCi0JMHhjMTNhZDA2MSwgMHgwYzdjNWMxZSwgMHhkYzcxODk4ZCwgMHgzNTM2Y2M1MiwgMHgxZTJiNWQzOCwgMHgzODcxNjVlMywgMHhjMDRlZTRiOSwgMHhmOWJhMTY1MSwKLQkweGQyYmVjMzM0LCAweDJkNDEzY2NjLCAweDE4N2RlMmE2LCAweDNiMjBkNzllLCAweGM0ZGYyODYyLCAweGU3ODIxZDVhLCAweGNhYzkzM2FlLCAweDIzOGU3NjczLAotCTB4MTI5NDA2MmUsIDB4M2QzZTgyYWQsIDB4Y2U4NmZmMmEsIDB4ZDc2NjE5YjYsIDB4YzRkZjI4NjIsIDB4MTg3ZGUyYTYsIDB4MGM3YzVjMWUsIDB4M2VjNTJmOWYsCi0JMHhkYzcxODk4ZCwgMHhjYWM5MzNhZSwgMHhjMTNhZDA2MSwgMHgwYzdjNWMxZSwgMHgwNjQ1ZTlhZiwgMHgzZmIxMWI0NywgMHhlZDZiZjlkMiwgMHhjMmMxN2Q1MwotfTsKLSNlbmRpZiAgLy9BUk1WNUUKLQotY29uc3QgaW50IFNob3J0V2luZG93U2luZVtGUkFNRV9MRU5fU0hPUlQvMl0gPXsKLQkweDAwYzk3ZmZmLCAweDAyNWI3ZmZhLCAweDAzZWQ3ZmYxLCAweDA1N2Y3ZmUyLCAweDA3MTE3ZmNlLCAweDA4YTI3ZmI1LCAweDBhMzM3Zjk4LCAweDBiYzQ3Zjc1LAotCTB4MGQ1NDdmNGUsIDB4MGVlNDdmMjIsIDB4MTA3MzdlZjAsIDB4MTIwMTdlYmEsIDB4MTM4ZjdlN2YsIDB4MTUxYzdlM2YsIDB4MTZhODdkZmIsIDB4MTgzMzdkYjEsCi0JMHgxOWJlN2Q2MywgMHgxYjQ3N2QwZiwgMHgxY2QwN2NiNywgMHgxZTU3N2M1YSwgMHgxZmRkN2JmOSwgMHgyMTYyN2I5MiwgMHgyMmU1N2IyNywgMHgyNDY3N2FiNywKLQkweDI1ZTg3YTQyLCAweDI3Njg3OWM5LCAweDI4ZTU3OTRhLCAweDJhNjI3OGM4LCAweDJiZGM3ODQwLCAweDJkNTU3N2I0LCAweDJlY2M3NzIzLCAweDMwNDI3NjhlLAotCTB4MzFiNTc1ZjQsIDB4MzMyNzc1NTYsIDB4MzQ5Nzc0YjMsIDB4MzYwNDc0MGIsIDB4Mzc3MDczNWYsIDB4MzhkOTcyYWYsIDB4M2E0MDcxZmEsIDB4M2JhNTcxNDEsCi0JMHgzZDA4NzA4MywgMHgzZTY4NmZjMiwgMHgzZmM2NmVmYiwgMHg0MTIxNmUzMSwgMHg0MjdhNmQ2MiwgMHg0M2QxNmM4ZiwgMHg0NTI0NmJiOCwgMHg0Njc1NmFkZCwKLQkweDQ3YzQ2OWZkLCAweDQ5MGY2OTFhLCAweDRhNTg2ODMyLCAweDRiOWU2NzQ3LCAweDRjZTE2NjU3LCAweDRlMjE2NTY0LCAweDRmNWU2NDZjLCAweDUwOTg2MzcxLAotCTB4NTFjZjYyNzIsIDB4NTMwMzYxNmYsIDB4NTQzMzYwNjgsIDB4NTU2MDVmNWUsIDB4NTY4YTVlNTAsIDB4NTdiMTVkM2UsIDB4NThkNDVjMjksIDB4NTlmNDViMTAKLX07Ci0KLWNvbnN0IGludCBMb25nV2luZG93S0JEW0ZSQU1FX0xFTl9MT05HLzJdPXsKLQkweDAwMGE3ZmZmLCAweDAwMGU3ZmZmLCAweDAwMTI3ZmZmLCAweDAwMTU3ZmZmLCAweDAwMTk3ZmZmLCAweDAwMWM3ZmZmLCAweDAwMjA3ZmZmLCAweDAwMjM3ZmZmLAotCTB4MDAyNjdmZmYsIDB4MDAyYTdmZmYsIDB4MDAyZDdmZmYsIDB4MDAzMDdmZmYsIDB4MDAzNDdmZmYsIDB4MDAzODdmZmYsIDB4MDAzYjdmZmYsIDB4MDAzZjdmZmYsCi0JMHgwMDQzN2ZmZiwgMHgwMDQ3N2ZmZiwgMHgwMDRiN2ZmZiwgMHgwMDRmN2ZmZiwgMHgwMDUzN2ZmZiwgMHgwMDU3N2ZmZiwgMHgwMDViN2ZmZiwgMHgwMDYwN2ZmZiwKLQkweDAwNjQ3ZmZmLCAweDAwNjk3ZmZmLCAweDAwNmQ3ZmZmLCAweDAwNzI3ZmZmLCAweDAwNzc3ZmZmLCAweDAwN2M3ZmZmLCAweDAwODE3ZmZmLCAweDAwODY3ZmZmLAotCTB4MDA4YjdmZmYsIDB4MDA5MTdmZmYsIDB4MDA5NjdmZmYsIDB4MDA5YzdmZmYsIDB4MDBhMTdmZmYsIDB4MDBhNzdmZmYsIDB4MDBhZDdmZmYsIDB4MDBiMzdmZmYsCi0JMHgwMGI5N2ZmZiwgMHgwMGJmN2ZmZiwgMHgwMGM2N2ZmZiwgMHgwMGNjN2ZmZiwgMHgwMGQzN2ZmZiwgMHgwMGRhN2ZmZiwgMHgwMGUwN2ZmZiwgMHgwMGU3N2ZmZiwKLQkweDAwZWU3ZmZmLCAweDAwZjU3ZmZmLCAweDAwZmQ3ZmZmLCAweDAxMDQ3ZmZmLCAweDAxMGM3ZmZmLCAweDAxMTM3ZmZmLCAweDAxMWI3ZmZmLCAweDAxMjM3ZmZmLAotCTB4MDEyYjdmZmYsIDB4MDEzMzdmZmYsIDB4MDEzYzdmZmUsIDB4MDE0NDdmZmUsIDB4MDE0ZDdmZmUsIDB4MDE1NjdmZmUsIDB4MDE1ZjdmZmUsIDB4MDE2ODdmZmUsCi0JMHgwMTcxN2ZmZSwgMHgwMTdhN2ZmZSwgMHgwMTgzN2ZmZSwgMHgwMThkN2ZmZSwgMHgwMTk3N2ZmZCwgMHgwMWExN2ZmZCwgMHgwMWFiN2ZmZCwgMHgwMWI1N2ZmZCwKLQkweDAxYmY3ZmZkLCAweDAxY2E3ZmZkLCAweDAxZDQ3ZmZkLCAweDAxZGY3ZmZjLCAweDAxZWE3ZmZjLCAweDAxZjU3ZmZjLCAweDAyMDA3ZmZjLCAweDAyMGM3ZmZjLAotCTB4MDIxNzdmZmMsIDB4MDIyMzdmZmIsIDB4MDIyZjdmZmIsIDB4MDIzYjdmZmIsIDB4MDI0NzdmZmIsIDB4MDI1MzdmZmIsIDB4MDI2MDdmZmEsIDB4MDI2ZDdmZmEsCi0JMHgwMjdhN2ZmYSwgMHgwMjg3N2ZmYSwgMHgwMjk0N2ZmOSwgMHgwMmExN2ZmOSwgMHgwMmFmN2ZmOSwgMHgwMmJjN2ZmOSwgMHgwMmNhN2ZmOCwgMHgwMmQ4N2ZmOCwKLQkweDAyZTc3ZmY4LCAweDAyZjU3ZmY3LCAweDAzMDQ3ZmY3LCAweDAzMTI3ZmY3LCAweDAzMjE3ZmY2LCAweDAzMzE3ZmY2LCAweDAzNDA3ZmY1LCAweDAzNGY3ZmY1LAotCTB4MDM1ZjdmZjUsIDB4MDM2ZjdmZjQsIDB4MDM3ZjdmZjQsIDB4MDM4ZjdmZjMsIDB4MDNhMDdmZjMsIDB4MDNiMDdmZjIsIDB4MDNjMTdmZjIsIDB4MDNkMjdmZjEsCi0JMHgwM2UzN2ZmMSwgMHgwM2Y1N2ZmMCwgMHgwNDA2N2ZmMCwgMHgwNDE4N2ZlZiwgMHgwNDJhN2ZlZiwgMHgwNDNjN2ZlZSwgMHgwNDRmN2ZlZCwgMHgwNDYxN2ZlZCwKLQkweDA0NzQ3ZmVjLCAweDA0ODc3ZmViLCAweDA0OWE3ZmViLCAweDA0YWU3ZmVhLCAweDA0YzE3ZmU5LCAweDA0ZDU3ZmU5LCAweDA0ZTk3ZmU4LCAweDA0ZmQ3ZmU3LAotCTB4MDUxMjdmZTYsIDB4MDUyNzdmZTUsIDB4MDUzYjdmZTUsIDB4MDU1MDdmZTQsIDB4MDU2NjdmZTMsIDB4MDU3YjdmZTIsIDB4MDU5MTdmZTEsIDB4MDVhNzdmZTAsCi0JMHgwNWJkN2ZkZiwgMHgwNWQzN2ZkZSwgMHgwNWVhN2ZkZCwgMHgwNjAxN2ZkYywgMHgwNjE4N2ZkYiwgMHgwNjJmN2ZkYSwgMHgwNjQ2N2ZkOSwgMHgwNjVlN2ZkNywKLQkweDA2NzY3ZmQ2LCAweDA2OGU3ZmQ1LCAweDA2YTY3ZmQ0LCAweDA2YmY3ZmQyLCAweDA2ZDg3ZmQxLCAweDA2ZjE3ZmQwLCAweDA3MGE3ZmNlLCAweDA3MjM3ZmNkLAotCTB4MDczZDdmY2MsIDB4MDc1NzdmY2EsIDB4MDc3MTdmYzksIDB4MDc4YzdmYzcsIDB4MDdhNjdmYzUsIDB4MDdjMTdmYzQsIDB4MDdkYzdmYzIsIDB4MDdmNzdmYzAsCi0JMHgwODEzN2ZiZiwgMHgwODJmN2ZiZCwgMHgwODRiN2ZiYiwgMHgwODY3N2ZiOSwgMHgwODg0N2ZiNywgMHgwOGEwN2ZiNiwgMHgwOGJkN2ZiNCwgMHgwOGRhN2ZiMiwKLQkweDA4Zjg3ZmFmLCAweDA5MTY3ZmFkLCAweDA5MzQ3ZmFiLCAweDA5NTI3ZmE5LCAweDA5NzA3ZmE3LCAweDA5OGY3ZmE1LCAweDA5YWU3ZmEyLCAweDA5Y2Q3ZmEwLAotCTB4MDllYzdmOWQsIDB4MGEwYzdmOWIsIDB4MGEyYzdmOTgsIDB4MGE0YzdmOTYsIDB4MGE2YzdmOTMsIDB4MGE4ZDdmOTEsIDB4MGFhZTdmOGUsIDB4MGFjZjdmOGIsCi0JMHgwYWYwN2Y4OCwgMHgwYjEyN2Y4NSwgMHgwYjMzN2Y4MiwgMHgwYjU1N2Y3ZiwgMHgwYjc4N2Y3YywgMHgwYjlhN2Y3OSwgMHgwYmJkN2Y3NiwgMHgwYmUwN2Y3MywKLQkweDBjMDQ3ZjZmLCAweDBjMjc3ZjZjLCAweDBjNGI3ZjY5LCAweDBjNmY3ZjY1LCAweDBjOTM3ZjYxLCAweDBjYjg3ZjVlLCAweDBjZGQ3ZjVhLCAweDBkMDI3ZjU2LAotCTB4MGQyNzdmNTMsIDB4MGQ0ZDdmNGYsIDB4MGQ3MzdmNGIsIDB4MGQ5OTdmNDcsIDB4MGRiZjdmNDMsIDB4MGRlNjdmM2UsIDB4MGUwYzdmM2EsIDB4MGUzNDdmMzYsCi0JMHgwZTViN2YzMSwgMHgwZTgzN2YyZCwgMHgwZWFhN2YyOCwgMHgwZWQzN2YyNCwgMHgwZWZiN2YxZiwgMHgwZjIzN2YxYSwgMHgwZjRjN2YxNSwgMHgwZjc1N2YxMCwKLQkweDBmOWY3ZjBiLCAweDBmYzg3ZjA2LCAweDBmZjI3ZjAxLCAweDEwMWM3ZWZiLCAweDEwNDc3ZWY2LCAweDEwNzE3ZWYwLCAweDEwOWM3ZWViLCAweDEwYzg3ZWU1LAotCTB4MTBmMzdlZGYsIDB4MTExZjdlZGEsIDB4MTE0YTdlZDQsIDB4MTE3NzdlY2UsIDB4MTFhMzdlYzcsIDB4MTFkMDdlYzEsIDB4MTFmZDdlYmIsIDB4MTIyYTdlYjQsCi0JMHgxMjU3N2VhZSwgMHgxMjg1N2VhNywgMHgxMmIzN2VhMCwgMHgxMmUxN2U5YSwgMHgxMzBmN2U5MywgMHgxMzNlN2U4YywgMHgxMzZkN2U4NCwgMHgxMzljN2U3ZCwKLQkweDEzY2M3ZTc2LCAweDEzZmI3ZTZlLCAweDE0MmI3ZTY3LCAweDE0NWI3ZTVmLCAweDE0OGM3ZTU3LCAweDE0YmM3ZTRmLCAweDE0ZWQ3ZTQ3LCAweDE1MWU3ZTNmLAotCTB4MTU1MDdlMzcsIDB4MTU4MTdlMmUsIDB4MTViMzdlMjYsIDB4MTVlNTdlMWQsIDB4MTYxODdlMTQsIDB4MTY0YTdlMGIsIDB4MTY3ZDdlMDIsIDB4MTZiMDdkZjksCi0JMHgxNmU0N2RmMCwgMHgxNzE3N2RlNiwgMHgxNzRiN2RkZCwgMHgxNzdmN2RkMywgMHgxN2IzN2RjOSwgMHgxN2U4N2RiZiwgMHgxODFkN2RiNSwgMHgxODUyN2RhYiwKLQkweDE4ODc3ZGExLCAweDE4YmM3ZDk2LCAweDE4ZjI3ZDhjLCAweDE5Mjg3ZDgxLCAweDE5NWU3ZDc2LCAweDE5OTU3ZDZiLCAweDE5Y2I3ZDYwLCAweDFhMDI3ZDU0LAotCTB4MWEzOTdkNDksIDB4MWE3MTdkM2QsIDB4MWFhODdkMzEsIDB4MWFlMDdkMjYsIDB4MWIxODdkMTksIDB4MWI1MDdkMGQsIDB4MWI4OTdkMDEsIDB4MWJjMjdjZjQsCi0JMHgxYmZiN2NlOCwgMHgxYzM0N2NkYiwgMHgxYzZkN2NjZSwgMHgxY2E3N2NjMSwgMHgxY2UxN2NiMywgMHgxZDFiN2NhNiwgMHgxZDU1N2M5OCwgMHgxZDhmN2M4YSwKLQkweDFkY2E3YzdjLCAweDFlMDU3YzZlLCAweDFlNDA3YzYwLCAweDFlN2I3YzUxLCAweDFlYjc3YzQzLCAweDFlZjM3YzM0LCAweDFmMmY3YzI1LCAweDFmNmI3YzE2LAotCTB4MWZhNzdjMDYsIDB4MWZlNDdiZjcsIDB4MjAyMTdiZTcsIDB4MjA1ZTdiZDcsIDB4MjA5YjdiYzcsIDB4MjBkODdiYjcsIDB4MjExNjdiYTYsIDB4MjE1NDdiOTYsCi0JMHgyMTkyN2I4NSwgMHgyMWQwN2I3NCwgMHgyMjBlN2I2MywgMHgyMjRkN2I1MiwgMHgyMjhjN2I0MCwgMHgyMmNiN2IyZSwgMHgyMzBhN2IxYywgMHgyMzQ5N2IwYSwKLQkweDIzODk3YWY4LCAweDIzYzg3YWU2LCAweDI0MDg3YWQzLCAweDI0NDg3YWMwLCAweDI0ODk3YWFkLCAweDI0Yzk3YTlhLCAweDI1MGE3YTg2LCAweDI1NGI3YTczLAotCTB4MjU4YzdhNWYsIDB4MjVjZDdhNGIsIDB4MjYwZTdhMzYsIDB4MjY1MDdhMjIsIDB4MjY5MTdhMGQsIDB4MjZkMzc5ZjgsIDB4MjcxNTc5ZTMsIDB4Mjc1Nzc5Y2UsCi0JMHgyNzlhNzliOCwgMHgyN2RjNzlhMywgMHgyODFmNzk4ZCwgMHgyODYyNzk3NywgMHgyOGE1Nzk2MCwgMHgyOGU4Nzk0YSwgMHgyOTJiNzkzMywgMHgyOTZmNzkxYywKLQkweDI5YjI3OTA1LCAweDI5ZjY3OGVkLCAweDJhM2E3OGQ2LCAweDJhN2U3OGJlLCAweDJhYzI3OGE2LCAweDJiMDc3ODhkLCAweDJiNGI3ODc1LCAweDJiOTA3ODVjLAotCTB4MmJkNDc4NDMsIDB4MmMxOTc4MmEsIDB4MmM1ZTc4MTAsIDB4MmNhNDc3ZjcsIDB4MmNlOTc3ZGQsIDB4MmQyZTc3YzMsIDB4MmQ3NDc3YTgsIDB4MmRiYTc3OGUsCi0JMHgyZGZmNzc3MywgMHgyZTQ1Nzc1OCwgMHgyZThiNzczZCwgMHgyZWQyNzcyMSwgMHgyZjE4NzcwNiwgMHgyZjVlNzZlYSwgMHgyZmE1NzZjZCwgMHgyZmVjNzZiMSwKLQkweDMwMzI3Njk0LCAweDMwNzk3Njc3LCAweDMwYzA3NjVhLCAweDMxMDc3NjNkLCAweDMxNGU3NjFmLCAweDMxOTY3NjAxLCAweDMxZGQ3NWUzLCAweDMyMjU3NWM1LAotCTB4MzI2Yzc1YTYsIDB4MzJiNDc1ODgsIDB4MzJmYzc1NjksIDB4MzM0NDc1NDksIDB4MzM4Yzc1MmEsIDB4MzNkNDc1MGEsIDB4MzQxYzc0ZWEsIDB4MzQ2NDc0Y2EsCi0JMHgzNGFjNzRhOSwgMHgzNGY1NzQ4OCwgMHgzNTNkNzQ2NywgMHgzNTg1NzQ0NiwgMHgzNWNlNzQyNCwgMHgzNjE3NzQwMywgMHgzNjVmNzNlMSwgMHgzNmE4NzNiZSwKLQkweDM2ZjE3MzljLCAweDM3M2E3Mzc5LCAweDM3ODM3MzU2LCAweDM3Y2M3MzMzLCAweDM4MTU3MzBmLCAweDM4NWU3MmVjLCAweDM4YTc3MmM4LCAweDM4ZjE3MmEzLAotCTB4MzkzYTcyN2YsIDB4Mzk4MzcyNWEsIDB4MzljZDcyMzUsIDB4M2ExNjcyMTAsIDB4M2E2MDcxZWEsIDB4M2FhOTcxYzQsIDB4M2FmMzcxOWUsIDB4M2IzYzcxNzgsCi0JMHgzYjg2NzE1MSwgMHgzYmQwNzEyYiwgMHgzYzE5NzEwNCwgMHgzYzYzNzBkYywgMHgzY2FkNzBiNSwgMHgzY2Y3NzA4ZCwgMHgzZDQwNzA2NSwgMHgzZDhhNzAzYywKLQkweDNkZDQ3MDE0LCAweDNlMWU2ZmViLCAweDNlNjg2ZmMyLCAweDNlYjE2Zjk4LCAweDNlZmI2ZjZmLCAweDNmNDU2ZjQ1LCAweDNmOGY2ZjFiLCAweDNmZDk2ZWYwLAotCTB4NDAyMzZlYzYsIDB4NDA2ZDZlOWIsIDB4NDBiNjZlNzAsIDB4NDEwMDZlNDQsIDB4NDE0YTZlMTksIDB4NDE5NDZkZWQsIDB4NDFkZTZkYzEsIDB4NDIyODZkOTQsCi0JMHg0MjcxNmQ2OCwgMHg0MmJiNmQzYiwgMHg0MzA1NmQwZCwgMHg0MzRmNmNlMCwgMHg0Mzk4NmNiMiwgMHg0M2UyNmM4NCwgMHg0NDJjNmM1NiwgMHg0NDc1NmMyOCwKLQkweDQ0YmY2YmY5LCAweDQ1MDg2YmNhLCAweDQ1NTI2YjliLCAweDQ1OWI2YjZiLCAweDQ1ZTU2YjNjLCAweDQ2MmU2YjBjLCAweDQ2Nzg2YWRiLCAweDQ2YzE2YWFiLAotCTB4NDcwYTZhN2EsIDB4NDc1MzZhNDksIDB4NDc5YzZhMTgsIDB4NDdlNTY5ZTcsIDB4NDgyZTY5YjUsIDB4NDg3NzY5ODMsIDB4NDhjMDY5NTEsIDB4NDkwOTY5MWUsCi0JMHg0OTUyNjhlYywgMHg0OTliNjhiOSwgMHg0OWUzNjg4NSwgMHg0YTJjNjg1MiwgMHg0YTc0NjgxZSwgMHg0YWJkNjdlYSwgMHg0YjA1NjdiNiwgMHg0YjRkNjc4MiwKLQkweDRiOTU2NzRkLCAweDRiZGU2NzE4LCAweDRjMjY2NmUzLCAweDRjNmQ2NmFlLCAweDRjYjU2Njc4LCAweDRjZmQ2NjQyLCAweDRkNDU2NjBjLCAweDRkOGM2NWQ2LAotCTB4NGRkNDY1OWYsIDB4NGUxYjY1NjgsIDB4NGU2MjY1MzEsIDB4NGVhOTY0ZmEsIDB4NGVmMDY0YzMsIDB4NGYzNzY0OGIsIDB4NGY3ZTY0NTMsIDB4NGZjNTY0MWIsCi0JMHg1MDBiNjNlMiwgMHg1MDUyNjNhYSwgMHg1MDk4NjM3MSwgMHg1MGRmNjMzOCwgMHg1MTI1NjJmZSwgMHg1MTZiNjJjNSwgMHg1MWIxNjI4YiwgMHg1MWY2NjI1MSwKLQkweDUyM2M2MjE3LCAweDUyODE2MWRjLCAweDUyYzc2MWEyLCAweDUzMGM2MTY3LCAweDUzNTE2MTJjLCAweDUzOTY2MGYxLCAweDUzZGI2MGI1LCAweDU0MjA2MDc5LAotCTB4NTQ2NDYwM2QsIDB4NTRhOTYwMDEsIDB4NTRlZDVmYzUsIDB4NTUzMTVmODgsIDB4NTU3NTVmNGIsIDB4NTViOTVmMGUsIDB4NTVmYzVlZDEsIDB4NTY0MDVlOTQsCi0JMHg1NjgzNWU1NiwgMHg1NmM3NWUxOCwgMHg1NzBhNWRkYSwgMHg1NzRkNWQ5YywgMHg1NzhmNWQ1ZSwgMHg1N2QyNWQxZiwgMHg1ODE0NWNlMCwgMHg1ODU2NWNhMSwKLQkweDU4OTk1YzYyLCAweDU4ZGE1YzIzLCAweDU5MWM1YmUzLCAweDU5NWU1YmE0LCAweDU5OWY1YjY0LCAweDU5ZTA1YjI0LCAweDVhMjE1YWUzLCAweDVhNjI1YWEzCi19OwotCi0KLS8qCi0gIGZvcm0gZmFjdG9yCi0qLwotLyogc3FydCgoKGkrKDE8PChGRl9TUVJUX0JJVFMtMikrMC41KS8yXjMxKSAqLwotY29uc3QgV29yZDMyIGZvcm1mYWNfc3FydHRhYmxlWzk2XSA9IHsKLSAgMHgwMDA0MDdmOCwgMHgwMDA0MTdiOSwgMHgwMDA0MjczZiwgMHgwMDA0MzY4YywgMHgwMDA0NDVhMSwgMHgwMDA0NTQ4MywgMHgwMDA0NjMzMiwgMHgwMDA0NzFiMCwKLSAgMHgwMDA0ODAwMCwgMHgwMDA0OGUyMiwgMHgwMDA0OWMxYSwgMHgwMDA0YTllNywgMHgwMDA0Yjc4YywgMHgwMDA0YzUwYSwgMHgwMDA0ZDI2MywgMHgwMDA0ZGY5NiwKLSAgMHgwMDA0ZWNhNywgMHgwMDA0Zjk5NSwgMHgwMDA1MDY2MiwgMHgwMDA1MTMwZSwgMHgwMDA1MWY5YywgMHgwMDA1MmMwYSwgMHgwMDA1Mzg1YiwgMHgwMDA1NDQ5MCwKLSAgMHgwMDA1NTBhOCwgMHgwMDA1NWNhNSwgMHgwMDA1Njg4OCwgMHgwMDA1NzQ1MCwgMHgwMDA1ODAwMCwgMHgwMDA1OGI5NiwgMHgwMDA1OTcxNSwgMHgwMDA1YTI3YywKLSAgMHgwMDA1YWRjYywgMHgwMDA1YjkwNiwgMHgwMDA1YzQyYiwgMHgwMDA1Y2YzOSwgMHgwMDA1ZGEzMywgMHgwMDA1ZTUxOSwgMHgwMDA1ZWZlYSwgMHgwMDA1ZmFhOCwKLSAgMHgwMDA2MDU1MiwgMHgwMDA2MGZlYSwgMHgwMDA2MWE3MCwgMHgwMDA2MjRlMywgMHgwMDA2MmY0NSwgMHgwMDA2Mzk5NiwgMHgwMDA2NDNkNSwgMHgwMDA2NGUwNCwKLSAgMHgwMDA2NTgyMywgMHgwMDA2NjIzMSwgMHgwMDA2NmMzMCwgMHgwMDA2NzYxZiwgMHgwMDA2ODAwMCwgMHgwMDA2ODlkMSwgMHgwMDA2OTM5MywgMHgwMDA2OWQ0NywKLSAgMHgwMDA2YTZlZCwgMHgwMDA2YjA4NSwgMHgwMDA2YmExMCwgMHgwMDA2YzM4ZCwgMHgwMDA2Y2NmYywgMHgwMDA2ZDY1ZiwgMHgwMDA2ZGZiNSwgMHgwMDA2ZThmZSwKLSAgMHgwMDA2ZjIzYiwgMHgwMDA2ZmI2YywgMHgwMDA3MDQ5MCwgMHgwMDA3MGRhOSwgMHgwMDA3MTZiNiwgMHgwMDA3MWZiOCwgMHgwMDA3MjhhZSwgMHgwMDA3MzE5OSwKLSAgMHgwMDA3M2E3OSwgMHgwMDA3NDM0ZSwgMHgwMDA3NGMxOSwgMHgwMDA3NTRkOSwgMHgwMDA3NWQ4ZSwgMHgwMDA3NjYzYSwgMHgwMDA3NmVkYiwgMHgwMDA3Nzc3MiwKLSAgMHgwMDA3ODAwMCwgMHgwMDA3ODg4MywgMHgwMDA3OTBmZCwgMHgwMDA3OTk2ZSwgMHgwMDA3YTFkNSwgMHgwMDA3YWEzMywgMHgwMDA3YjI4OCwgMHgwMDA3YmFkNCwKLSAgMHgwMDA3YzMxOCwgMHgwMDA3Y2I1MiwgMHgwMDA3ZDM4NCwgMHgwMDA3ZGJhZCwgMHgwMDA3ZTNjZSwgMHgwMDA3ZWJlNiwgMHgwMDA3ZjNmNiwgMHgwMDA3ZmJmZQotfTsKLQotCi0KLS8qIQotICBcbmFtZSAgICBxdWFudGl6ZXIgYW5kIGludmVyc2UgcXVhbnRpemVyIHRhYmxlcwotCi0gIFxicmllZiAgIHRoZXNlIHRhYmxlcyBhcmUgdXNlZCBmb3IgdGhlIG5vbgotICAgICAgICAgICBsaW5lYXIgcXVhbnRpemVyIGFuZCBpbnZlcnNlIHF1YW50aXplcgotCi0qLwotY29uc3QgV29yZDMyIG1UYWJfM180WzUxMl0gPSB7Ci0JMHg0YzFiZjgyOSwgMHg0YzM4ODBkZSwgMHg0YzU1MDYwMywgMHg0YzcxODc5YywKLQkweDRjOGUwNWFhLCAweDRjYWE4MDMwLCAweDRjYzZmNzJmLCAweDRjZTM2YWFiLAotCTB4NGNmZmRhYTQsIDB4NGQxYzQ3MWQsIDB4NGQzOGIwMTksIDB4NGQ1NTE1OWEsCi0JMHg0ZDcxNzdhMSwgMHg0ZDhkZDYzMSwgMHg0ZGFhMzE0YiwgMHg0ZGM2ODhmMywKLQkweDRkZTJkZDJhLCAweDRkZmYyZGYyLCAweDRlMWI3YjRkLCAweDRlMzdjNTNkLAotCTB4NGU1NDBiYzUsIDB4NGU3MDRlZTYsIDB4NGU4YzhlYTMsIDB4NGVhOGNhZmQsCi0JMHg0ZWM1MDNmNywgMHg0ZWUxMzk5MiwgMHg0ZWZkNmJkMCwgMHg0ZjE5OWFiNCwKLQkweDRmMzVjNjQwLCAweDRmNTFlZTc1LCAweDRmNmUxMzU2LCAweDRmOGEzNGU0LAotCTB4NGZhNjUzMjEsIDB4NGZjMjZlMTAsIDB4NGZkZTg1YjIsIDB4NGZmYTlhMGEsCi0JMHg1MDE2YWIxOCwgMHg1MDMyYjhlMCwgMHg1MDRlYzM2MiwgMHg1MDZhY2FhMSwKLQkweDUwODZjZWEwLCAweDUwYTJjZjVlLCAweDUwYmVjY2UwLCAweDUwZGFjNzI1LAotCTB4NTBmNmJlMzEsIDB4NTExMmIyMDUsIDB4NTEyZWEyYTMsIDB4NTE0YTkwMGQsCi0JMHg1MTY2N2E0NSwgMHg1MTgyNjE0YywgMHg1MTllNDUyNCwgMHg1MWJhMjVjZiwKLQkweDUxZDYwMzUwLCAweDUxZjFkZGE3LCAweDUyMGRiNGQ2LCAweDUyMjk4OGUwLAotCTB4NTI0NTU5YzYsIDB4NTI2MTI3ODksIDB4NTI3Y2YyMmQsIDB4NTI5OGI5YjEsCi0JMHg1MmI0N2UxOSwgMHg1MmQwM2Y2NSwgMHg1MmViZmQ5OCwgMHg1MzA3YjhiNCwKLQkweDUzMjM3MGI5LCAweDUzM2YyNWFhLCAweDUzNWFkNzg5LCAweDUzNzY4NjU2LAotCTB4NTM5MjMyMTUsIDB4NTNhZGRhYzYsIDB4NTNjOTgwNmIsIDB4NTNlNTIzMDYsCi0JMHg1NDAwYzI5OCwgMHg1NDFjNWYyNCwgMHg1NDM3ZjhhYiwgMHg1NDUzOGYyZSwKLQkweDU0NmYyMmFmLCAweDU0OGFiMzMwLCAweDU0YTY0MGIzLCAweDU0YzFjYjM4LAotCTB4NTRkZDUyYzIsIDB4NTRmOGQ3NTMsIDB4NTUxNDU4ZWIsIDB4NTUyZmQ3OGQsCi0JMHg1NTRiNTMzOSwgMHg1NTY2Y2JmMywgMHg1NTgyNDFiYiwgMHg1NTlkYjQ5MiwKLQkweDU1YjkyNDdiLCAweDU1ZDQ5MTc3LCAweDU1ZWZmYjg3LCAweDU2MGI2MmFkLAotCTB4NTYyNmM2ZWIsIDB4NTY0MjI4NDIsIDB4NTY1ZDg2YjQsIDB4NTY3OGUyNDIsCi0JMHg1Njk0M2FlZSwgMHg1NmFmOTBiOSwgMHg1NmNhZTNhNCwgMHg1NmU2MzNiMiwKLQkweDU3MDE4MGU0LCAweDU3MWNjYjNiLCAweDU3MzgxMmI4LCAweDU3NTM1NzVlLAotCTB4NTc2ZTk5MmUsIDB4NTc4OWQ4MjksIDB4NTdhNTE0NTAsIDB4NTdjMDRkYTYsCi0JMHg1N2RiODQyYiwgMHg1N2Y2YjdlMSwgMHg1ODExZThjOSwgMHg1ODJkMTZlNiwKLQkweDU4NDg0MjM4LCAweDU4NjM2YWMwLCAweDU4N2U5MDgxLCAweDU4OTliMzdjLAotCTB4NThiNGQzYjEsIDB4NThjZmYxMjMsIDB4NThlYjBiZDMsIDB4NTkwNjIzYzIsCi0JMHg1OTIxMzhmMiwgMHg1OTNjNGI2MywgMHg1OTU3NWIxOSwgMHg1OTcyNjgxMiwKLQkweDU5OGQ3MjUzLCAweDU5YTg3OWRhLCAweDU5YzM3ZWFiLCAweDU5ZGU4MGM2LAotCTB4NTlmOTgwMmQsIDB4NWExNDdjZTAsIDB4NWEyZjc2ZTIsIDB4NWE0YTZlMzQsCi0JMHg1YTY1NjJkNiwgMHg1YTgwNTRjYiwgMHg1YTliNDQxNCwgMHg1YWI2MzBiMiwKLQkweDVhZDExYWE2LCAweDVhZWMwMWYxLCAweDViMDZlNjk2LCAweDViMjFjODk1LAotCTB4NWIzY2E3ZWYsIDB4NWI1Nzg0YTYsIDB4NWI3MjVlYmMsIDB4NWI4ZDM2MzEsCi0JMHg1YmE4MGIwNiwgMHg1YmMyZGQzZSwgMHg1YmRkYWNkOSwgMHg1YmY4NzlkOCwKLQkweDVjMTM0NDNkLCAweDVjMmUwYzA5LCAweDVjNDhkMTNlLCAweDVjNjM5M2RjLAotCTB4NWM3ZTUzZTUsIDB4NWM5OTExNWEsIDB4NWNiM2NjM2MsIDB4NWNjZTg0OGQsCi0JMHg1Y2U5M2E0ZSwgMHg1ZDAzZWQ4MCwgMHg1ZDFlOWUyNCwgMHg1ZDM5NGMzYiwKLQkweDVkNTNmN2M3LCAweDVkNmVhMGM5LCAweDVkODk0NzQyLCAweDVkYTNlYjMzLAotCTB4NWRiZThjOWUsIDB4NWRkOTJiODQsIDB4NWRmM2M3ZTUsIDB4NWUwZTYxYzMsCi0JMHg1ZTI4ZjkyMCwgMHg1ZTQzOGRmYywgMHg1ZTVlMjA1OSwgMHg1ZTc4YjAzNywKLQkweDVlOTMzZDk5LCAweDVlYWRjODdlLCAweDVlYzg1MGU5LCAweDVlZTJkNmRhLAotCTB4NWVmZDVhNTMsIDB4NWYxN2RiNTQsIDB4NWYzMjU5ZTAsIDB4NWY0Y2Q1ZjYsCi0JMHg1ZjY3NGY5OSwgMHg1ZjgxYzZjOCwgMHg1ZjljM2I4NywgMHg1ZmI2YWRkNCwKLQkweDVmZDExZGIzLCAweDVmZWI4YjIzLCAweDYwMDVmNjI2LCAweDYwMjA1ZWJkLAotCTB4NjAzYWM0ZTksIDB4NjA1NTI4YWMsIDB4NjA2ZjhhMDUsIDB4NjA4OWU4ZjcsCi0JMHg2MGE0NDU4MywgMHg2MGJlOWZhOSwgMHg2MGQ4Zjc2YiwgMHg2MGYzNGNjYSwKLQkweDYxMGQ5ZmM3LCAweDYxMjdmMDYyLCAweDYxNDIzZTllLCAweDYxNWM4YTdhLAotCTB4NjE3NmQzZjksIDB4NjE5MTFiMWIsIDB4NjFhYjVmZTEsIDB4NjFjNWEyNGQsCi0JMHg2MWRmZTI1ZiwgMHg2MWZhMjAxOCwgMHg2MjE0NWI3YSwgMHg2MjJlOTQ4NSwKLQkweDYyNDhjYjNiLCAweDYyNjJmZjlkLCAweDYyN2QzMWFiLCAweDYyOTc2MTY3LAotCTB4NjJiMThlZDEsIDB4NjJjYmI5ZWIsIDB4NjJlNWUyYjYsIDB4NjMwMDA5MzMsCi0JMHg2MzFhMmQ2MiwgMHg2MzM0NGY0NSwgMHg2MzRlNmVkZCwgMHg2MzY4OGMyYiwKLQkweDYzODJhNzMwLCAweDYzOWNiZmVjLCAweDYzYjZkNjYxLCAweDYzZDBlYTkwLAotCTB4NjNlYWZjN2EsIDB4NjQwNTBjMWYsIDB4NjQxZjE5ODIsIDB4NjQzOTI0YTIsCi0JMHg2NDUzMmQ4MCwgMHg2NDZkMzQxZiwgMHg2NDg3Mzg3ZSwgMHg2NGExM2E5ZSwKLQkweDY0YmIzYTgxLCAweDY0ZDUzODI4LCAweDY0ZWYzMzkzLCAweDY1MDkyY2M0LAotCTB4NjUyMzIzYmIsIDB4NjUzZDE4NzksIDB4NjU1NzBiMDAsIDB4NjU3MGZiNTAsCi0JMHg2NThhZTk2YiwgMHg2NWE0ZDU1MCwgMHg2NWJlYmYwMSwgMHg2NWQ4YTY4MCwKLQkweDY1ZjI4YmNjLCAweDY2MGM2ZWU4LCAweDY2MjY0ZmQzLCAweDY2NDAyZThmLAotCTB4NjY1YTBiMWMsIDB4NjY3M2U1N2QsIDB4NjY4ZGJkYjAsIDB4NjZhNzkzYjgsCi0JMHg2NmMxNjc5NSwgMHg2NmRiMzk0OSwgMHg2NmY1MDhkNCwgMHg2NzBlZDYzNiwKLQkweDY3MjhhMTcyLCAweDY3NDI2YTg3LCAweDY3NWMzMTc3LCAweDY3NzVmNjQzLAotCTB4Njc4ZmI4ZWIsIDB4NjdhOTc5NzEsIDB4NjdjMzM3ZDUsIDB4NjdkY2Y0MTgsCi0JMHg2N2Y2YWUzYiwgMHg2ODEwNjYzZiwgMHg2ODJhMWMyNSwgMHg2ODQzY2ZlZCwKLQkweDY4NWQ4MTk5LCAweDY4NzczMTI5LCAweDY4OTBkZTlmLCAweDY4YWE4OWZhLAotCTB4NjhjNDMzM2QsIDB4NjhkZGRhNjcsIDB4NjhmNzdmN2EsIDB4NjkxMTIyNzcsCi0JMHg2OTJhYzM1ZSwgMHg2OTQ0NjIzMCwgMHg2OTVkZmVlZSwgMHg2OTc3OTk5YSwKLQkweDY5OTEzMjMyLCAweDY5YWFjOGJhLCAweDY5YzQ1ZDMxLCAweDY5ZGRlZjk4LAotCTB4NjlmNzdmZjAsIDB4NmExMTBlM2EsIDB4NmEyYTlhNzcsIDB4NmE0NDI0YTgsCi0JMHg2YTVkYWNjYywgMHg2YTc3MzJlNiwgMHg2YTkwYjZmNiwgMHg2YWFhMzhmZCwKLQkweDZhYzNiOGZiLCAweDZhZGQzNmYyLCAweDZhZjZiMmUyLCAweDZiMTAyY2NkLAotCTB4NmIyOWE0YjIsIDB4NmI0MzFhOTIsIDB4NmI1YzhlNmYsIDB4NmI3NjAwNGEsCi0JMHg2YjhmNzAyMiwgMHg2YmE4ZGRmOSwgMHg2YmMyNDlkMCwgMHg2YmRiYjNhNywKLQkweDZiZjUxYjgwLCAweDZjMGU4MTVhLCAweDZjMjdlNTM3LCAweDZjNDE0NzE4LAotCTB4NmM1YWE2ZmQsIDB4NmM3NDA0ZTcsIDB4NmM4ZDYwZDcsIDB4NmNhNmJhY2UsCi0JMHg2Y2MwMTJjYywgMHg2Y2Q5NjhkMiwgMHg2Y2YyYmNlMSwgMHg2ZDBjMGVmOSwKLQkweDZkMjU1ZjFkLCAweDZkM2VhZDRiLCAweDZkNTdmOTg1LCAweDZkNzE0M2NjLAotCTB4NmQ4YThjMjEsIDB4NmRhM2QyODMsIDB4NmRiZDE2ZjUsIDB4NmRkNjU5NzYsCi0JMHg2ZGVmOWEwOCwgMHg2ZTA4ZDhhYiwgMHg2ZTIyMTU2MCwgMHg2ZTNiNTAyNywKLQkweDZlNTQ4OTAyLCAweDZlNmRiZmYxLCAweDZlODZmNGY1LCAweDZlYTAyODBlLAotCTB4NmViOTU5M2UsIDB4NmVkMjg4ODUsIDB4NmVlYmI1ZTMsIDB4NmYwNGUxNWEsCi0JMHg2ZjFlMGFlYSwgMHg2ZjM3MzI5NCwgMHg2ZjUwNTg1OSwgMHg2ZjY5N2MzOSwKLQkweDZmODI5ZTM1LCAweDZmOWJiZTRlLCAweDZmYjRkYzg1LCAweDZmY2RmOGQ5LAotCTB4NmZlNzEzNGQsIDB4NzAwMDJiZTAsIDB4NzAxOTQyOTMsIDB4NzAzMjU3NjcsCi0JMHg3MDRiNmE1ZCwgMHg3MDY0N2I3NiwgMHg3MDdkOGFiMSwgMHg3MDk2OTgxMSwKLQkweDcwYWZhMzk0LCAweDcwYzhhZDNkLCAweDcwZTFiNTBjLCAweDcwZmFiYjAxLAotCTB4NzExM2JmMWQsIDB4NzEyY2MxNjEsIDB4NzE0NWMxY2UsIDB4NzE1ZWMwNjQsCi0JMHg3MTc3YmQyNCwgMHg3MTkwYjgwZiwgMHg3MWE5YjEyNCwgMHg3MWMyYTg2NiwKLQkweDcxZGI5ZGQ0LCAweDcxZjQ5MTcwLCAweDcyMGQ4MzM5LCAweDcyMjY3MzMxLAotCTB4NzIzZjYxNTksIDB4NzI1ODRkYjAsIDB4NzI3MTM4MzgsIDB4NzI4YTIwZjEsCi0JMHg3MmEzMDdkYiwgMHg3MmJiZWNmOSwgMHg3MmQ0ZDA0OSwgMHg3MmVkYjFjZSwKLQkweDczMDY5MTg3LCAweDczMWY2Zjc1LCAweDczMzg0Yjk4LCAweDczNTEyNWYzLAotCTB4NzM2OWZlODQsIDB4NzM4MmQ1NGQsIDB4NzM5YmFhNGUsIDB4NzNiNDdkODksCi0JMHg3M2NkNGVmZCwgMHg3M2U2MWVhYiwgMHg3M2ZlZWM5NCwgMHg3NDE3YjhiOCwKLQkweDc0MzA4MzE5LCAweDc0NDk0YmI2LCAweDc0NjIxMjkxLCAweDc0N2FkN2FhLAotCTB4NzQ5MzliMDIsIDB4NzRhYzVjOTgsIDB4NzRjNTFjNmYsIDB4NzRkZGRhODYsCi0JMHg3NGY2OTZkZSwgMHg3NTBmNTE3OCwgMHg3NTI4MGE1NCwgMHg3NTQwYzE3NCwKLQkweDc1NTk3NmQ3LCAweDc1NzIyYTdlLCAweDc1OGFkYzY5LCAweDc1YTM4YzliLAotCTB4NzViYzNiMTIsIDB4NzVkNGU3Y2YsIDB4NzVlZDkyZDQsIDB4NzYwNjNjMjEsCi0JMHg3NjFlZTNiNiwgMHg3NjM3ODk5NCwgMHg3NjUwMmRiYywgMHg3NjY4ZDAyZSwKLQkweDc2ODE3MGViLCAweDc2OWEwZmYzLCAweDc2YjJhZDQ3LCAweDc2Y2I0OGU3LAotCTB4NzZlM2UyZDUsIDB4NzZmYzdiMTAsIDB4NzcxNTExOWEsIDB4NzcyZGE2NzMsCi0JMHg3NzQ2Mzk5YiwgMHg3NzVlY2IxMywgMHg3Nzc3NWFkYywgMHg3NzhmZThmNiwKLQkweDc3YTg3NTYxLCAweDc3YzEwMDFmLCAweDc3ZDk4OTMwLCAweDc3ZjIxMDk1LAotCTB4NzgwYTk2NGQsIDB4NzgyMzFhNWIsIDB4NzgzYjljYmQsIDB4Nzg1NDFkNzUsCi0JMHg3ODZjOWM4NCwgMHg3ODg1MTllOSwgMHg3ODlkOTVhNiwgMHg3OGI2MGZiYiwKLQkweDc4Y2U4ODI4LCAweDc4ZTZmZWVmLCAweDc4ZmY3NDBmLCAweDc5MTdlNzhhLAotCTB4NzkzMDU5NWYsIDB4Nzk0OGM5OTAsIDB4Nzk2MTM4MWQsIDB4Nzk3OWE1MDYsCi0JMHg3OTkyMTA0YywgMHg3OWFhNzlmMCwgMHg3OWMyZTFmMSwgMHg3OWRiNDg1MiwKLQkweDc5ZjNhZDExLCAweDdhMGMxMDMxLCAweDdhMjQ3MWIwLCAweDdhM2NkMTkxLAotCTB4N2E1NTJmZDMsIDB4N2E2ZDhjNzYsIDB4N2E4NWU3N2QsIDB4N2E5ZTQwZTYsCi0JMHg3YWI2OThiMiwgMHg3YWNlZWVlMywgMHg3YWU3NDM3OCwgMHg3YWZmOTY3MywKLQkweDdiMTdlN2QyLCAweDdiMzAzNzk5LCAweDdiNDg4NWM1LCAweDdiNjBkMjU5LAotCTB4N2I3OTFkNTUsIDB4N2I5MTY2YjksIDB4N2JhOWFlODYsIDB4N2JjMWY0YmMsCi0JMHg3YmRhMzk1YywgMHg3YmYyN2M2NiwgMHg3YzBhYmRkYiwgMHg3YzIyZmRiYiwKLQkweDdjM2IzYzA3LCAweDdjNTM3OGMwLCAweDdjNmJiM2U1LCAweDdjODNlZDc4LAotCTB4N2M5YzI1NzksIDB4N2NiNDViZTksIDB4N2NjYzkwYzcsIDB4N2NlNGM0MTQsCi0JMHg3Y2ZjZjVkMiwgMHg3ZDE1MjYwMCwgMHg3ZDJkNTQ5ZiwgMHg3ZDQ1ODFiMCwKLQkweDdkNWRhZDMyLCAweDdkNzVkNzI3LCAweDdkOGRmZjhmLCAweDdkYTYyNjZhLAotCTB4N2RiZTRiYmEsIDB4N2RkNjZmN2QsIDB4N2RlZTkxYjYsIDB4N2UwNmIyNjQsCi0JMHg3ZTFlZDE4OCwgMHg3ZTM2ZWYyMiwgMHg3ZTRmMGIzNCwgMHg3ZTY3MjViZCwKLQkweDdlN2YzZWJkLCAweDdlOTc1NjM2LCAweDdlYWY2YzI4LCAweDdlYzc4MDkzLAotCTB4N2VkZjkzNzgsIDB4N2VmN2E0ZDcsIDB4N2YwZmI0YjEsIDB4N2YyN2MzMDcsCi0JMHg3ZjNmY2ZkOCwgMHg3ZjU3ZGIyNSwgMHg3ZjZmZTRlZiwgMHg3Zjg3ZWQzNiwKLQkweDdmOWZmM2ZiLCAweDdmYjdmOTNlLCAweDdmY2ZmY2ZmLCAweDdmZTdmZjQwCi19OwotCi1jb25zdCBXb3JkMzIgbVRhYl80XzNbNTEyXT17Ci0JMHgzMmNiZmQ0YSwgMHgzMmVkZGQ3MCwgMHgzMzBmYzMzOSwgMHgzMzMxYWVhMywKLQkweDMzNTM5ZmFjLCAweDMzNzU5NjUyLCAweDMzOTc5Mjk0LCAweDMzYjk5NDcwLAotCTB4MzNkYjliZTQsIDB4MzNmZGE4ZWQsIDB4MzQxZmJiOGIsIDB4MzQ0MWQzYmIsCi0JMHgzNDYzZjE3YywgMHgzNDg2MTRjYywgMHgzNGE4M2RhOCwgMHgzNGNhNmMxMCwKLQkweDM0ZWNhMDAxLCAweDM1MGVkOTc5LCAweDM1MzExODc3LCAweDM1NTM1Y2ZhLAotCTB4MzU3NWE2ZmUsIDB4MzU5N2Y2ODMsIDB4MzViYTRiODcsIDB4MzVkY2E2MDcsCi0JMHgzNWZmMDYwMywgMHgzNjIxNmI3OCwgMHgzNjQzZDY2NSwgMHgzNjY2NDZjNywKLQkweDM2ODhiYzllLCAweDM2YWIzN2U4LCAweDM2Y2RiOGEyLCAweDM2ZjAzZWNiLAotCTB4MzcxMmNhNjIsIDB4MzczNTViNjQsIDB4Mzc1N2YxZDEsIDB4Mzc3YThkYTUsCi0JMHgzNzlkMmVlMCwgMHgzN2JmZDU4MCwgMHgzN2UyODE4NCwgMHgzODA1MzJlOCwKLQkweDM4MjdlOWFkLCAweDM4NGFhNWQwLCAweDM4NmQ2NzRmLCAweDM4OTAyZTJhLAotCTB4MzhiMmZhNWQsIDB4MzhkNWNiZTksIDB4MzhmOGEyY2EsIDB4MzkxYjdlZmYsCi0JMHgzOTNlNjA4OCwgMHgzOTYxNDc2MSwgMHgzOTg0MzM4YSwgMHgzOWE3MjUwMSwKLQkweDM5Y2ExYmM0LCAweDM5ZWQxN2QxLCAweDNhMTAxOTI4LCAweDNhMzMxZmM2LAotCTB4M2E1NjJiYWEsIDB4M2E3OTNjZDIsIDB4M2E5YzUzM2QsIDB4M2FiZjZlZTksCi0JMHgzYWUyOGZkNSwgMHgzYjA1YjVmZiwgMHgzYjI4ZTE2NSwgMHgzYjRjMTIwNiwKLQkweDNiNmY0N2UwLCAweDNiOTI4MmYyLCAweDNiYjVjMzNhLCAweDNiZDkwOGI3LAotCTB4M2JmYzUzNjgsIDB4M2MxZmEzNDksIDB4M2M0MmY4NWIsIDB4M2M2NjUyOWMsCi0JMHgzYzg5YjIwOSwgMHgzY2FkMTZhMiwgMHgzY2QwODA2NSwgMHgzY2YzZWY1MSwKLQkweDNkMTc2MzY0LCAweDNkM2FkYzljLCAweDNkNWU1YWY4LCAweDNkODFkZTc3LAotCTB4M2RhNTY3MTcsIDB4M2RjOGY0ZDYsIDB4M2RlYzg3YjQsIDB4M2UxMDFmYWUsCi0JMHgzZTMzYmNjMywgMHgzZTU3NWVmMiwgMHgzZTdiMDYzYSwgMHgzZTllYjI5OCwKLQkweDNlYzI2NDBjLCAweDNlZTYxYTkzLCAweDNmMDlkNjJkLCAweDNmMmQ5NmQ4LAotCTB4M2Y1MTVjOTMsIDB4M2Y3NTI3NWIsIDB4M2Y5OGY3MzEsIDB4M2ZiY2NjMTEsCi0JMHgzZmUwYTVmYywgMHg0MDA0ODRlZiwgMHg0MDI4NjhlYSwgMHg0MDRjNTFlOSwKLQkweDQwNzAzZmVlLCAweDQwOTQzMmY1LCAweDQwYjgyYWZkLCAweDQwZGMyODA2LAotCTB4NDEwMDJhMGQsIDB4NDEyNDMxMTEsIDB4NDE0ODNkMTIsIDB4NDE2YzRlMGQsCi0JMHg0MTkwNjQwMSwgMHg0MWI0N2VlZCwgMHg0MWQ4OWVjZiwgMHg0MWZjYzNhNywKLQkweDQyMjBlZDcyLCAweDQyNDUxYzMwLCAweDQyNjk0ZmRlLCAweDQyOGQ4ODdkLAotCTB4NDJiMWM2MDksIDB4NDJkNjA4ODMsIDB4NDJmYTRmZTgsIDB4NDMxZTljMzcsCi0JMHg0MzQyZWQ3MCwgMHg0MzY3NDM5MCwgMHg0MzhiOWU5NiwgMHg0M2FmZmU4MiwKLQkweDQzZDQ2MzUxLCAweDQzZjhjZDAzLCAweDQ0MWQzYjk1LCAweDQ0NDFhZjA4LAotCTB4NDQ2NjI3NTgsIDB4NDQ4YWE0ODcsIDB4NDRhZjI2OTAsIDB4NDRkM2FkNzUsCi0JMHg0NGY4MzkzMywgMHg0NTFjYzljOCwgMHg0NTQxNWYzNSwgMHg0NTY1Zjk3NywKLQkweDQ1OGE5ODhkLCAweDQ1YWYzYzc2LCAweDQ1ZDNlNTMxLCAweDQ1Zjg5MmJjLAotCTB4NDYxZDQ1MTYsIDB4NDY0MWZjM2UsIDB4NDY2NmI4MzIsIDB4NDY4Yjc4ZjIsCi0JMHg0NmIwM2U3YywgMHg0NmQ1MDhjZiwgMHg0NmY5ZDdlOSwgMHg0NzFlYWJjYSwKLQkweDQ3NDM4NDcwLCAweDQ3Njg2MWQ5LCAweDQ3OGQ0NDA2LCAweDQ3YjIyYWYzLAotCTB4NDdkNzE2YTEsIDB4NDdmYzA3MGUsIDB4NDgyMGZjMzksIDB4NDg0NWY2MjAsCi0JMHg0ODZhZjRjMywgMHg0ODhmZjgyMCwgMHg0OGI1MDAzNSwgMHg0OGRhMGQwMywKLQkweDQ4ZmYxZTg3LCAweDQ5MjQzNGMwLCAweDQ5NDk0ZmFkLCAweDQ5NmU2ZjRkLAotCTB4NDk5MzkzOWYsIDB4NDliOGJjYTIsIDB4NDlkZGVhNTQsIDB4NGEwMzFjYjQsCi0JMHg0YTI4NTNjMSwgMHg0YTRkOGY3YSwgMHg0YTcyY2ZkZSwgMHg0YTk4MTRlYiwKLQkweDRhYmQ1ZWExLCAweDRhZTJhY2ZkLCAweDRiMDgwMDAwLCAweDRiMmQ1N2E4LAotCTB4NGI1MmIzZjMsIDB4NGI3ODE0ZTEsIDB4NGI5ZDdhNzAsIDB4NGJjMmU0OWYsCi0JMHg0YmU4NTM2ZSwgMHg0YzBkYzZkYiwgMHg0YzMzM2VlNCwgMHg0YzU4YmI4OSwKLQkweDRjN2UzY2M5LCAweDRjYTNjMmEyLCAweDRjYzk0ZDE0LCAweDRjZWVkYzFjLAotCTB4NGQxNDZmYmIsIDB4NGQzYTA3ZWYsIDB4NGQ1ZmE0YjYsIDB4NGQ4NTQ2MTEsCi0JMHg0ZGFhZWJmZCwgMHg0ZGQwOTY3OSwgMHg0ZGY2NDU4NSwgMHg0ZTFiZjkxZiwKLQkweDRlNDFiMTQ2LCAweDRlNjc2ZGZhLCAweDRlOGQyZjM4LCAweDRlYjJmNTAxLAotCTB4NGVkOGJmNTIsIDB4NGVmZThlMmIsIDB4NGYyNDYxOGEsIDB4NGY0YTM5NzAsCi0JMHg0ZjcwMTVkOSwgMHg0Zjk1ZjZjNiwgMHg0ZmJiZGMzNiwgMHg0ZmUxYzYyNiwKLQkweDUwMDdiNDk3LCAweDUwMmRhNzg3LCAweDUwNTM5ZWY1LCAweDUwNzk5YWUxLAotCTB4NTA5ZjliNDgsIDB4NTBjNWEwMmEsIDB4NTBlYmE5ODUsIDB4NTExMWI3NWEsCi0JMHg1MTM3YzlhNiwgMHg1MTVkZTA2OSwgMHg1MTgzZmJhMiwgMHg1MWFhMWI0ZiwKLQkweDUxZDAzZjcwLCAweDUxZjY2ODAzLCAweDUyMWM5NTA4LCAweDUyNDJjNjdkLAotCTB4NTI2OGZjNjIsIDB4NTI4ZjM2YjUsIDB4NTJiNTc1NzUsIDB4NTJkYmI4YTIsCi0JMHg1MzAyMDAzYSwgMHg1MzI4NGMzYywgMHg1MzRlOWNhOCwgMHg1Mzc0ZjE3YywKLQkweDUzOWI0YWI3LCAweDUzYzFhODU4LCAweDUzZTgwYTVmLCAweDU0MGU3MGNhLAotCTB4NTQzNGRiOTgsIDB4NTQ1YjRhYzgsIDB4NTQ4MWJlNWEsIDB4NTRhODM2NGIsCi0JMHg1NGNlYjI5YywgMHg1NGY1MzM0YywgMHg1NTFiYjg1OCwgMHg1NTQyNDFjMSwKLQkweDU1NjhjZjg1LCAweDU1OGY2MWEzLCAweDU1YjVmODFiLCAweDU1ZGM5MmViLAotCTB4NTYwMzMyMTIsIDB4NTYyOWQ1OTAsIDB4NTY1MDdkNjMsIDB4NTY3NzI5OGEsCi0JMHg1NjlkZGEwNSwgMHg1NmM0OGVkMywgMHg1NmViNDdmMiwgMHg1NzEyMDU2MiwKLQkweDU3MzhjNzIxLCAweDU3NWY4ZDJmLCAweDU3ODY1NzhhLCAweDU3YWQyNjMzLAotCTB4NTdkM2Y5MjcsIDB4NTdmYWQwNjYsIDB4NTgyMWFiZWYsIDB4NTg0ODhiYzAsCi0JMHg1ODZmNmZkYSwgMHg1ODk2NTgzYiwgMHg1OGJkNDRlMiwgMHg1OGU0MzVjZSwKLQkweDU5MGIyYWZmLCAweDU5MzIyNDczLCAweDU5NTkyMjI5LCAweDU5ODAyNDIwLAotCTB4NTlhNzJhNTksIDB4NTljZTM0ZDAsIDB4NTlmNTQzODcsIDB4NWExYzU2N2IsCi0JMHg1YTQzNmRhYywgMHg1YTZhODkxOSwgMHg1YTkxYThjMSwgMHg1YWI4Y2NhMywKLQkweDVhZGZmNGJlLCAweDViMDcyMTExLCAweDViMmU1MTljLCAweDViNTU4NjVlLAotCTB4NWI3Y2JmNTQsIDB4NWJhM2ZjODAsIDB4NWJjYjNkZGYsIDB4NWJmMjgzNzEsCi0JMHg1YzE5Y2QzNSwgMHg1YzQxMWIyYSwgMHg1YzY4NmQ0ZiwgMHg1YzhmYzNhNCwKLQkweDVjYjcxZTI3LCAweDVjZGU3Y2Q3LCAweDVkMDVkZmI0LCAweDVkMmQ0NmJkLAotCTB4NWQ1NGIxZjAsIDB4NWQ3YzIxNGUsIDB4NWRhMzk0ZDQsIDB4NWRjYjBjODMsCi0JMHg1ZGYyODg1OSwgMHg1ZTFhMDg1NiwgMHg1ZTQxOGM3OCwgMHg1ZTY5MTRiZSwKLQkweDVlOTBhMTI5LCAweDVlYjgzMWI3LCAweDVlZGZjNjY3LCAweDVmMDc1ZjM4LAotCTB4NWYyZWZjMjksIDB4NWY1NjlkM2EsIDB4NWY3ZTQyNmEsIDB4NWZhNWViYjcsCi0JMHg1ZmNkOTkyMSwgMHg1ZmY1NGFhOCwgMHg2MDFkMDA0YSwgMHg2MDQ0YmEwNiwKLQkweDYwNmM3N2RjLCAweDYwOTQzOWNhLCAweDYwYmJmZmQwLCAweDYwZTNjOWVlLAotCTB4NjEwYjk4MjEsIDB4NjEzMzZhNmEsIDB4NjE1YjQwYzgsIDB4NjE4MzFiMzksCi0JMHg2MWFhZjliZCwgMHg2MWQyZGM1MywgMHg2MWZhYzJmYSwgMHg2MjIyYWRiMiwKLQkweDYyNGE5Yzc5LCAweDYyNzI4ZjRmLCAweDYyOWE4NjMzLCAweDYyYzI4MTIzLAotCTB4NjJlYTgwMjAsIDB4NjMxMjgzMjksIDB4NjMzYThhM2MsIDB4NjM2Mjk1NTksCi0JMHg2MzhhYTQ3ZiwgMHg2M2IyYjdhZCwgMHg2M2RhY2VlMiwgMHg2NDAyZWExZSwKLQkweDY0MmIwOTYwLCAweDY0NTMyY2E2LCAweDY0N2I1M2YxLCAweDY0YTM3ZjNmLAotCTB4NjRjYmFlOGYsIDB4NjRmM2UxZTIsIDB4NjUxYzE5MzUsIDB4NjU0NDU0ODgsCi0JMHg2NTZjOTNkYiwgMHg2NTk0ZDcyYywgMHg2NWJkMWU3YiwgMHg2NWU1NjljNywKLQkweDY2MGRiOTBmLCAweDY2MzYwYzUzLCAweDY2NWU2MzkxLCAweDY2ODZiZWM5LAotCTB4NjZhZjFkZmEsIDB4NjZkNzgxMjMsIDB4NjZmZmU4NDQsIDB4NjcyODUzNWIsCi0JMHg2NzUwYzI2OCwgMHg2Nzc5MzU2YiwgMHg2N2ExYWM2MiwgMHg2N2NhMjc0YywKLQkweDY3ZjJhNjI5LCAweDY4MWIyOGY5LCAweDY4NDNhZmI5LCAweDY4NmMzYTZhLAotCTB4Njg5NGM5MGIsIDB4NjhiZDViOWIsIDB4NjhlNWYyMTksIDB4NjkwZThjODQsCi0JMHg2OTM3MmFkZCwgMHg2OTVmY2QyMSwgMHg2OTg4NzM1MCwgMHg2OWIxMWQ2YSwKLQkweDY5ZDljYjZkLCAweDZhMDI3ZDVhLCAweDZhMmIzMzJmLCAweDZhNTNlY2ViLAotCTB4NmE3Y2FhOGQsIDB4NmFhNTZjMTYsIDB4NmFjZTMxODQsIDB4NmFmNmZhZDYsCi0JMHg2YjFmYzgwYywgMHg2YjQ4OTkyNSwgMHg2YjcxNmUyMCwgMHg2YjlhNDZmZCwKLQkweDZiYzMyM2JiLCAweDZiZWMwNDU4LCAweDZjMTRlOGQ1LCAweDZjM2RkMTMwLAotCTB4NmM2NmJkNjksIDB4NmM4ZmFkODAsIDB4NmNiOGExNzIsIDB4NmNlMTk5NDAsCi0JMHg2ZDBhOTRlOSwgMHg2ZDMzOTQ2ZCwgMHg2ZDVjOTdjYSwgMHg2ZDg1OWVmZiwKLQkweDZkYWVhYTBkLCAweDZkZDdiOGYxLCAweDZlMDBjYmFkLCAweDZlMjllMjNlLAotCTB4NmU1MmZjYTQsIDB4NmU3YzFhZGYsIDB4NmVhNTNjZWUsIDB4NmVjZTYyY2YsCi0JMHg2ZWY3OGM4MywgMHg2ZjIwYmEwOSwgMHg2ZjQ5ZWI1ZiwgMHg2ZjczMjA4NSwKLQkweDZmOWM1OTdiLCAweDZmYzU5NjQwLCAweDZmZWVkNmQzLCAweDcwMTgxYjMzLAotCTB4NzA0MTYzNjAsIDB4NzA2YWFmNTksIDB4NzA5M2ZmMWQsIDB4NzBiZDUyYWIsCi0JMHg3MGU2YWEwNCwgMHg3MTEwMDUyNSwgMHg3MTM5NjQwZiwgMHg3MTYyYzZjMSwKLQkweDcxOGMyZDNhLCAweDcxYjU5NzdhLCAweDcxZGYwNTdmLCAweDcyMDg3NzQ5LAotCTB4NzIzMWVjZDgsIDB4NzI1YjY2MmEsIDB4NzI4NGUzM2YsIDB4NzJhZTY0MTcsCi0JMHg3MmQ3ZThiMCwgMHg3MzAxNzEwYSwgMHg3MzJhZmQyNCwgMHg3MzU0OGNmZSwKLQkweDczN2UyMDk3LCAweDczYTdiN2VlLCAweDczZDE1MzAzLCAweDczZmFmMWQ1LAotCTB4NzQyNDk0NjIsIDB4NzQ0ZTNhYWMsIDB4NzQ3N2U0YjAsIDB4NzRhMTkyNmUsCi0JMHg3NGNiNDNlNiwgMHg3NGY0ZjkxNywgMHg3NTFlYjIwMSwgMHg3NTQ4NmVhMSwKLQkweDc1NzIyZWY5LCAweDc1OWJmMzA3LCAweDc1YzViYWNhLCAweDc1ZWY4NjQyLAotCTB4NzYxOTU1NmYsIDB4NzY0MzI4NGYsIDB4NzY2Y2ZlZTIsIDB4NzY5NmQ5MjgsCi0JMHg3NmMwYjcxZiwgMHg3NmVhOThjNywgMHg3NzE0N2UyMCwgMHg3NzNlNjcyOCwKLQkweDc3Njg1M2RmLCAweDc3OTI0NDQ1LCAweDc3YmMzODU4LCAweDc3ZTYzMDE5LAotCTB4NzgxMDJiODUsIDB4NzgzYTJhOWUsIDB4Nzg2NDJkNjIsIDB4Nzg4ZTMzZDEsCi0JMHg3OGI4M2RlOSwgMHg3OGUyNGJhYiwgMHg3OTBjNWQxNSwgMHg3OTM2NzIyOCwKLQkweDc5NjA4YWUxLCAweDc5OGFhNzQyLCAweDc5YjRjNzQ4LCAweDc5ZGVlYWY0LAotCTB4N2EwOTEyNDUsIDB4N2EzMzNkM2EsIDB4N2E1ZDZiZDIsIDB4N2E4NzllMGUsCi0JMHg3YWIxZDNlYywgMHg3YWRjMGQ2YiwgMHg3YjA2NGE4YywgMHg3YjMwOGI0ZCwKLQkweDdiNWFjZmFlLCAweDdiODUxN2FlLCAweDdiYWY2MzRjLCAweDdiZDliMjg5LAotCTB4N2MwNDA1NjMsIDB4N2MyZTViZGEsIDB4N2M1OGI1ZWMsIDB4N2M4MzEzOWIsCi0JMHg3Y2FkNzRlNCwgMHg3Y2Q3ZDljNywgMHg3ZDAyNDI0NCwgMHg3ZDJjYWU1YSwKLQkweDdkNTcxZTA5LCAweDdkODE5MTRmLCAweDdkYWMwODJkLCAweDdkZDY4MmExLAotCTB4N2UwMTAwYWMsIDB4N2UyYjgyNGIsIDB4N2U1NjA3ODAsIDB4N2U4MDkwNDgsCi0JMHg3ZWFiMWNhNSwgMHg3ZWQ1YWM5NCwgMHg3ZjAwNDAxNSwgMHg3ZjJhZDcyOSwKLQkweDdmNTU3MWNkLCAweDdmODAxMDAzLCAweDdmYWFiMWM4LCAweDdmZDU1NzFkCi19OwotCi0KLWNvbnN0IFdvcmQzMiBpbnZTQkZbMjRdID0gewotICAweDNGRkQzNEZDLCAweDJEM0Y4MDAwLCAweDI0RjE4QzdFLCAweDFGRkU5QTdFLAotICAweDFDOURGMTBDLCAweDFBMUY4NTFBLCAweDE4MkZFOTk0LCAweDE2OUZDMDAwLAotICAweDE1NTQyQUFBLCAweDE0M0MzMUMyLCAweDEzNEIxQjZDLCAweDEyNzkyMEJFLAotICAweDExQkYyRkNDLCAweDExMUE3NDlFLCAweDEwODVGQzQyLCAweDBGRkZBN0JFLAotICAweDBGODU1ODE4LCAweDBGMTRFRTU2LCAweDBFQUU2QTc4LCAweDBFNEVGODg2LAotICAweDBERjY5ODgwLCAweDBEQTQ5NTY4LCAweDBENTc4NTQyLCAweDBEMTAxRDBDCi19OwotCi1jb25zdCBXb3JkMTYgcG93MnRvbWludXNOb3ZlcjE2WzE3XSA9IHsKLSAgMHg3ZmZmLCAweDdhOTMsIDB4NzU2MCwgMHg3MDY2LAotICAweDZiYTIsIDB4NjcxMiwgMHg2MmI0LCAweDVlODQsCi0gIDB4NWE4MiwgMHg1NmFjLCAweDUyZmYsIDB4NGY3YiwKLSAgMHg0YzFjLCAweDQ4ZTIsIDB4NDVjYiwgMHg0MmQ1LAotICAweDQwMDAKLX07Ci0KLWNvbnN0IFdvcmQxNiBzaWRlSW5mb1RhYkxvbmdbTUFYX1NGQl9MT05HICsgMV0gPSB7Ci0gIDksIDksIDksIDksIDksIDksIDksIDksIDksCi0gIDksIDksIDksIDksIDksIDksIDksIDksIDksCi0gIDksIDksIDksIDksIDksIDksIDksIDksIDksCi0gIDksIDksIDksIDksIDE0LCAxNCwgMTQsIDE0LAotICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCi0gIDE0LCAxNCwgMTQKLX07Ci0KLWNvbnN0IFdvcmQxNiBzaWRlSW5mb1RhYlNob3J0W01BWF9TRkJfU0hPUlQgKyAxXSA9IHsKLSAgNywgNywgNywgNywgNywgNywgNywgMTAsIDEwLAotICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEzLCAxMwotfTsKLQotY29uc3QgV29yZDMyIHNwZWNFeHBNYW50VGFibGVDb21iX2VuY1s0XVsxNF0gPQotewotICB7MHg0MDAwMDAwMCwgIDB4NTBhMjhiZTYsICAweDY1OTdmYTk1LCAgMHg0MDAwMDAwMCwKLSAgIDB4NTBhMjhiZTYsICAweDY1OTdmYTk1LCAgMHg0MDAwMDAwMCwgIDB4NTBhMjhiZTYsCi0gICAweDY1OTdmYTk1LCAgMHg0MDAwMDAwMCwgIDB4NTBhMjhiZTYsICAweDY1OTdmYTk1LAotICAgMHg0MDAwMDAwMCwgIDB4NTBhMjhiZTZ9LAotCi0gIHsweDRjMWJmODI5LCAgMHg1ZmU0NDM1ZSwgIDB4NzhkMGRmOWMsICAweDRjMWJmODI5LAotICAgMHg1ZmU0NDM1ZSwgIDB4NzhkMGRmOWMsICAweDRjMWJmODI5LCAgMHg1ZmU0NDM1ZSwKLSAgIDB4NzhkMGRmOWMsICAweDRjMWJmODI5LCAgMHg1ZmU0NDM1ZSwgIDB4NzhkMGRmOWMsCi0gICAweDRjMWJmODI5LCAgMHg1ZmU0NDM1ZX0sCi0KLSAgezB4NWE4Mjc5OWEsICAweDcyMDhmODFkLCAgMHg0N2Q2NmIwZiwgIDB4NWE4Mjc5OWEsCi0gICAweDcyMDhmODFkLCAgMHg0N2Q2NmIwZiwgIDB4NWE4Mjc5OWEsICAweDcyMDhmODFkLAotICAgMHg0N2Q2NmIwZiwgIDB4NWE4Mjc5OWEsICAweDcyMDhmODFkLCAgMHg0N2Q2NmIwZiwKLSAgIDB4NWE4Mjc5OWEsICAweDcyMDhmODFkfSwKLQotICB7MHg2YmEyN2U2NSwgIDB4NDNjZTNlNGIsICAweDU1NmUwNDI0LCAgMHg2YmEyN2U2NSwKLSAgIDB4NDNjZTNlNGIsICAweDU1NmUwNDI0LCAgMHg2YmEyN2U2NSwgIDB4NDNjZTNlNGIsCi0gICAweDU1NmUwNDI0LCAgMHg2YmEyN2U2NSwgIDB4NDNjZTNlNGIsICAweDU1NmUwNDI0LAotICAgMHg2YmEyN2U2NSwgIDB4NDNjZTNlNGJ9Ci19OwotCi1jb25zdCAgVVdvcmQ4IHNwZWNFeHBUYWJsZUNvbWJfZW5jWzRdWzE0XSA9Ci17Ci0gIHsxLCAyLCAzLCA1LCA2LCA3LCA5LCAxMCwgMTEsIDEzLCAxNCwgMTUsIDE3LCAxOH0sCi0gIHsxLCAyLCAzLCA1LCA2LCA3LCA5LCAxMCwgMTEsIDEzLCAxNCwgMTUsIDE3LCAxOH0sCi0gIHsxLCAyLCA0LCA1LCA2LCA4LCA5LCAxMCwgMTIsIDEzLCAxNCwgMTYsIDE3LCAxOH0sCi0gIHsxLCAzLCA0LCA1LCA3LCA4LCA5LCAxMSwgMTIsIDEzLCAxNSwgMTYsIDE3LCAxOX0KLX07Ci0KLWNvbnN0IFdvcmQxNiBxdWFudEJvcmRlcnNbNF1bNF0gPSB7Ci0gIC8qIHBvdygxLjAtMC40MDU0LCA0LzMpLzE2ICogcG93KDIsICgwLi4zKS80KSAqLwotICB7MHgwNDAwLCAweDBlZTcsIDB4MWM4NiwgMHgyYzBkfSwKLSAgLyogcG93KDIuMC0wLjQwNTQsIDQvMykvMTYgKiBwb3coMiwgKDAuLjMpLzQpICovCi0gIHsweDA0YzIsIDB4MTFiOSwgMHgyMWViLCAweDM0NjN9LAotICAvKiBwb3coMy4wLTAuNDA1NCwgNC8zKS8xNiAqIHBvdygyLCAoMC4uMykvNCkgKi8KLSAgezB4MDVhOCwgMHgxNTE0LCAweDI4NTYsIDB4M2U0Y30sCi0gIC8qIHBvdyg0LjAtMC40MDU0LCA0LzMpLzE2ICogcG93KDIsICgwLi4zKS80KSAqLwotICB7MHgwNmJhLCAweDE5MTEsIDB4MmZmOCwgMHg0YTE2fSwKLX07Ci0KLWNvbnN0IFdvcmQxNiBxdWFudFJlY29uWzRdWzNdID0gewotICB7MHgwODAwLCAweDE0MjksIDB4MjI5ZH0sCi0gIHsweDA5ODMsIDB4MTdmOSwgMHgyOTJhfSwKLSAgezB4MGI1MCwgMHgxYzgyLCAweDMwZjR9LAotICB7MHgwZDc0LCAweDIxZTcsIDB4M2EzN30sCi19OwotCi1jb25zdCBpbnQgc2FtcFJhdGVUYWJbTlVNX1NBTVBMRV9SQVRFU10gPSB7Ci0gICAgOTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsIDQ0MTAwLCAzMjAwMCwKLQkyNDAwMCwgMjIwNTAsIDE2MDAwLCAxMjAwMCwgMTEwMjUsICA4MDAwCi19OwotCi0KLWNvbnN0IGludAlyYXRlc1s4XSA9IHsKLQkxNjAsIDI0MCwgMzIwLCA0MDAsIDQ4MCwgNTYwLCA2NDAsIDAKLX07Ci0KLWNvbnN0IGludCBCYW5kd2l0aENvZWZUYWJbOF1bTlVNX1NBTVBMRV9SQVRFU10gPSB7Ci0JeyA3MDAwLCAgNzAwMCwgIDQ2NjYsICAzNTAwLCAgMzUwMCwgIDI4MDAsICAyODAwLCAgMjgwMCwgIDI4MDAsICAyMDAwLCAgMjAwMCwgIDIwMDB9LAotCXsxMjAwMCwgMTIwMDAsICA4MDAwLCAgNjAwMCwgIDYwMDAsICA2MDAwLCAgNDAwMCwgIDQwMDAsICA0MDAwLCAgMzAwMCwgIDMwMDAsICAzMDAwfSwKLQl7MTgwMDAsIDE4MDAwLCAxMjAwMCwgIDkwMDAsICA5MDAwLCAgOTAwMCwgIDcwMDAsICA3MDAwLCAgNzAwMCwgIDUwMDAsICA1MDAwLCAgNTAwMH0sCi0JezIwMDAwLCAyMDAwMCwgMTYwMDAsIDEyMDAwLCAxMjAwMCwgMTIwMDAsICA5MDAwLCAgOTAwMCwgIDkwMDAsICA2MDAwLCAgNjAwMCwgIDYwMDB9LAotCXsyMDAwMCwgMjAwMDAsIDE4NjY2LCAxNDAwMCwgMTQwMDAsIDE0MDAwLCAxMDAwMCwgMTAwMDAsIDEwMDAwLCAgNzAwMCwgIDcwMDAsICA3MDAwfSwKLQl7MjAwMDAsIDIwMDAwLCAyMDAwMCwgMTYwMDAsIDE2MDAwLCAxNjAwMCwgMTIwMDAsIDEyMDAwLCAxMjAwMCwgIDgwMDAsICA4MDAwLCAgODAwMH0sCi0JezIwMDAwLCAyMDAwMCwgMjAwMDAsIDIwMDAwLCAyMDAwMCwgMjAwMDAsIDE1MDAwLCAxNTAwMCwgMTUwMDAsIDEwMDAwLCAxMDAwMCwgMTAwMDB9LAotCXsyMDAwMCwgMjAwMDAsIDIwMDAwLCAyMDAwMCwgMjAwMDAsIDIwMDAwLCAyMDAwMCwgMjAwMDAsIDIwMDAwLCAyMDAwMCwgMjAwMDAsIDIwMDAwfQotfTsKLQotCi0vKiB0b3RhbCBudW1iZXIgb2Ygc2NhbGUgZmFjdG9yIGJhbmRzIGluIG9uZSB3aW5kb3cgKi8KLWNvbnN0IFVXb3JkOCBzZkJhbmRUb3RhbFNob3J0W05VTV9TQU1QTEVfUkFURVNdID0gewotICAgIDEyLCAxMiwgMTIsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUKLX07Ci0KLWNvbnN0IFVXb3JkOCBzZkJhbmRUb3RhbExvbmdbTlVNX1NBTVBMRV9SQVRFU10gPSB7Ci0gICAgNDEsIDQxLCA0NywgNDksIDQ5LCA1MSwgNDcsIDQ3LCA0MywgNDMsIDQzLCA0MAotfTsKLQotLyogc2NhbGUgZmFjdG9yIGJhbmQgdGFibGVzICovCi1jb25zdCBpbnQgc2ZCYW5kVGFiU2hvcnRPZmZzZXRbTlVNX1NBTVBMRV9SQVRFU10gPSB7MCwgMCwgMCwgMTMsIDEzLCAxMywgMjgsIDI4LCA0NCwgNDQsIDQ0LCA2MH07Ci0KLWNvbnN0IHNob3J0IHNmQmFuZFRhYlNob3J0Wzc2XSA9IHsKLQkvKiBzaG9ydCBibG9jayA2NCwgODgsIDk2IGtIeiBbMTNdICAqLwotCTAsICAgNCwgICA4LCAgMTIsICAxNiwgIDIwLCAgMjQsICAzMiwgIDQwLCAgNDgsICA2NCwgIDkyLCAxMjgsCi0KLQkvKiBzaG9ydCBibG9jayAzMiwgNDQsIDQ4IGtIeiBbMTVdICAqLwotCTAsICAgNCwgICA4LCAgMTIsICAxNiwgIDIwLCAgMjgsICAzNiwgIDQ0LCAgNTYsICA2OCwgIDgwLCAgOTYsIDExMiwgMTI4LAotCi0JLyogc2hvcnQgYmxvY2sgMjIsIDI0IGtIeiBbMTZdICAqLwotCTAsICAgNCwgICA4LCAgMTIsICAxNiwgIDIwLCAgMjQsICAyOCwgIDM2LCAgNDQsICA1MiwgIDY0LCAgNzYsICA5MiwgMTA4LCAxMjgsCi0KLQkvKiBzaG9ydCBibG9jayAxMSwgMTIsIDE2IGtIeiBbMTZdICovCi0JMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LCAgMzIsICA0MCwgIDQ4LCAgNjAsICA3MiwgIDg4LCAxMDgsIDEyOCwKLQotCS8qIHNob3J0IGJsb2NrIDgga0h6IFsxNl0gKi8KLQkwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzNiwgIDQ0LCAgNTIsICA2MCwgIDcyLCAgODgsIDEwOCwgMTI4Ci19OwotCi1jb25zdCBpbnQgc2ZCYW5kVGFiTG9uZ09mZnNldFtOVU1fU0FNUExFX1JBVEVTXSA9IHswLCAwLCA0MiwgOTAsIDkwLCAxNDAsIDE5MiwgMTkyLCAyNDAsIDI0MCwgMjQwLCAyODR9OwotCi1jb25zdCBzaG9ydCBzZkJhbmRUYWJMb25nWzMyNV0gPSB7Ci0JLyogbG9uZyBibG9jayA4OCwgOTYga0h6IFs0Ml0gICovCi0JICAwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LCAgNDAsICA0NCwgIDQ4LCAgIDUyLAotCSA1NiwgIDY0LCAgNzIsICA4MCwgIDg4LCAgOTYsIDEwOCwgMTIwLCAxMzIsIDE0NCwgMTU2LCAxNzIsIDE4OCwgIDIxMiwKLQkyNDAsIDI3NiwgMzIwLCAzODQsIDQ0OCwgNTEyLCA1NzYsIDY0MCwgNzA0LCA3NjgsIDgzMiwgODk2LCA5NjAsIDEwMjQsCi0KLQkvKiBsb25nIGJsb2NrIDY0IGtIeiBbNDhdICAqLwotCSAgMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LCAgMzIsICAzNiwgIDQwLCAgNDQsICA0OCwgIDUyLCAgNTYsICAgNjQsCi0JIDcyLCAgODAsICA4OCwgMTAwLCAxMTIsIDEyNCwgMTQwLCAxNTYsIDE3MiwgMTkyLCAyMTYsIDI0MCwgMjY4LCAzMDQsIDM0NCwgIDM4NCwKLQk0MjQsIDQ2NCwgNTA0LCA1NDQsIDU4NCwgNjI0LCA2NjQsIDcwNCwgNzQ0LCA3ODQsIDgyNCwgODY0LCA5MDQsIDk0NCwgOTg0LCAxMDI0LAotCi0JLyogbG9uZyBibG9jayA0NCwgNDgga0h6IFs1MF0gKi8KLQkgIDAsICAgNCwgICA4LCAgMTIsICAxNiwgIDIwLCAgMjQsICAyOCwgIDMyLCAgMzYsICA0MCwgIDQ4LCAgNTYsICA2NCwgIDcyLCAgIDgwLCAgODgsCi0JIDk2LCAxMDgsIDEyMCwgMTMyLCAxNDQsIDE2MCwgMTc2LCAxOTYsIDIxNiwgMjQwLCAyNjQsIDI5MiwgMzIwLCAzNTIsIDM4NCwgIDQxNiwgNDQ4LAotCTQ4MCwgNTEyLCA1NDQsIDU3NiwgNjA4LCA2NDAsIDY3MiwgNzA0LCA3MzYsIDc2OCwgODAwLCA4MzIsIDg2NCwgODk2LCA5MjgsIDEwMjQsCi0KLQkvKiBsb25nIGJsb2NrIDMyIGtIeiBbNTJdICovCi0JICAwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LCAgNDAsICA0OCwgIDU2LCAgNjQsICA3MiwgICA4MCwgIDg4LCAgOTYsCi0JMTA4LCAxMjAsIDEzMiwgMTQ0LCAxNjAsIDE3NiwgMTk2LCAyMTYsIDI0MCwgMjY0LCAyOTIsIDMyMCwgMzUyLCAzODQsIDQxNiwgIDQ0OCwgNDgwLCA1MTIsCi0JNTQ0LCA1NzYsIDYwOCwgNjQwLCA2NzIsIDcwNCwgNzM2LCA3NjgsIDgwMCwgODMyLCA4NjQsIDg5NiwgOTI4LCA5NjAsIDk5MiwgMTAyNCwKLQotCS8qIGxvbmcgYmxvY2sgMjIsIDI0IGtIeiBbNDhdICovCi0JICAwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LCAgNDAsICA0NCwgIDUyLCAgNjAsICA2OCwgICA3NiwKLQkgODQsICA5MiwgMTAwLCAxMDgsIDExNiwgMTI0LCAxMzYsIDE0OCwgMTYwLCAxNzIsIDE4OCwgMjA0LCAyMjAsIDI0MCwgMjYwLCAgMjg0LAotCTMwOCwgMzM2LCAzNjQsIDM5NiwgNDMyLCA0NjgsIDUwOCwgNTUyLCA2MDAsIDY1MiwgNzA0LCA3NjgsIDgzMiwgODk2LCA5NjAsIDEwMjQsCi0KLQkvKiBsb25nIGJsb2NrIDExLCAxMiwgMTYga0h6IFs0NF0gKi8KLQkgIDAsICAgOCwgIDE2LCAgMjQsICAzMiwgIDQwLCAgNDgsICA1NiwgIDY0LCAgNzIsICA4MCwgIDg4LCAxMDAsICAxMTIsIDEyNCwKLQkxMzYsIDE0OCwgMTYwLCAxNzIsIDE4NCwgMTk2LCAyMTIsIDIyOCwgMjQ0LCAyNjAsIDI4MCwgMzAwLCAzMjAsICAzNDQsIDM2OCwKLQkzOTYsIDQyNCwgNDU2LCA0OTIsIDUzMiwgNTcyLCA2MTYsIDY2NCwgNzE2LCA3NzIsIDgzMiwgODk2LCA5NjAsIDEwMjQsCi0KLQkvKiBsb25nIGJsb2NrIDgga0h6IFs0MV0gICovCi0JICAwLCAgMTIsICAyNCwgIDM2LCAgNDgsICA2MCwgIDcyLCAgODQsICA5NiwgMTA4LCAxMjAsIDEzMiwgIDE0NCwgMTU2LAotCTE3MiwgMTg4LCAyMDQsIDIyMCwgMjM2LCAyNTIsIDI2OCwgMjg4LCAzMDgsIDMyOCwgMzQ4LCAzNzIsICAzOTYsIDQyMCwKLQk0NDgsIDQ3NiwgNTA4LCA1NDQsIDU4MCwgNjIwLCA2NjQsIDcxMiwgNzY0LCA4MjAsIDg4MCwgOTQ0LCAxMDI0Ci19OwotCi0vKgotICB0aGVzZSB0YWJsZXMgYXJlIHVzZWQgb25seSBmb3IgY291bnRpbmcgYW5kCi0gIGFyZSBzdG9yZWQgaW4gcGFja2VkIGZvcm1hdAotKi8KLWNvbnN0IFVXb3JkMTYgaHVmZl9sdGFiMV8yWzNdWzNdWzNdWzNdPQotewotICB7Ci0gICAgewotICAgICAgezB4MGIwOSwweDA5MDcsMHgwYjA5fSwKLSAgICAgIHsweDBhMDgsMHgwNzA2LDB4MGEwOH0sCi0gICAgICB7MHgwYjA5LDB4MDkwOCwweDBiMDl9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwYTA4LDB4MDcwNiwweDBhMDd9LAotICAgICAgezB4MDcwNiwweDA1MDUsMHgwNzA2fSwKLSAgICAgIHsweDA5MDcsMHgwNzA2LDB4MGEwOH0KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDBiMDksMHgwOTA3LDB4MGIwOH0sCi0gICAgICB7MHgwOTA4LDB4MDcwNiwweDA5MDh9LAotICAgICAgezB4MGIwOSwweDA5MDcsMHgwYjA5fQotICAgIH0KLSAgfSwKLSAgewotICAgIHsKLSAgICAgIHsweDA5MDgsMHgwNzA2LDB4MDkwN30sCi0gICAgICB7MHgwNzA2LDB4MDUwNSwweDA3MDZ9LAotICAgICAgezB4MDkwNywweDA3MDYsMHgwOTA4fQotICAgIH0sCi0gICAgewotICAgICAgezB4MDcwNiwweDA1MDUsMHgwNzA2fSwKLSAgICAgIHsweDA1MDUsMHgwMTAzLDB4MDUwNX0sCi0gICAgICB7MHgwNzA2LDB4MDUwNSwweDA3MDZ9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwOTA4LDB4MDcwNiwweDA5MDd9LAotICAgICAgezB4MDcwNiwweDA1MDUsMHgwNzA2fSwKLSAgICAgIHsweDA5MDgsMHgwNzA2LDB4MDkwOH0KLSAgICB9Ci0gIH0sCi0gIHsKLSAgICB7Ci0gICAgICB7MHgwYjA5LDB4MDkwNywweDBiMDl9LAotICAgICAgezB4MDkwOCwweDA3MDYsMHgwOTA4fSwKLSAgICAgIHsweDBiMDgsMHgwOTA3LDB4MGIwOX0KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDBhMDgsMHgwNzA2LDB4MDkwN30sCi0gICAgICB7MHgwNzA2LDB4MDUwNCwweDA3MDZ9LAotICAgICAgezB4MDkwOCwweDA3MDYsMHgwYTA3fQotICAgIH0sCi0gICAgewotICAgICAgezB4MGIwOSwweDA5MDcsMHgwYjA5fSwKLSAgICAgIHsweDBhMDcsMHgwNzA2LDB4MDkwOH0sCi0gICAgICB7MHgwYjA5LDB4MDkwNywweDBiMDl9Ci0gICAgfQotICB9Ci19OwotCi0KLWNvbnN0IFVXb3JkMTYgaHVmZl9sdGFiM180WzNdWzNdWzNdWzNdPQotewotICB7Ci0gICAgewotICAgICAgezB4MDEwNCwweDA0MDUsMHgwODA4fSwKLSAgICAgIHsweDA0MDUsMHgwNTA0LDB4MDgwOH0sCi0gICAgICB7MHgwOTA5LDB4MDkwOCwweDBhMGJ9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwNDA1LDB4MDYwNSwweDA5MDh9LAotICAgICAgezB4MDYwNSwweDA2MDQsMHgwOTA4fSwKLSAgICAgIHsweDA5MDgsMHgwOTA3LDB4MGEwYX0KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDA5MDksMHgwYTA4LDB4MGQwYn0sCi0gICAgICB7MHgwOTA4LDB4MDkwOCwweDBiMGF9LAotICAgICAgezB4MGIwYiwweDBhMGEsMHgwYzBifQotICAgIH0KLSAgfSwKLSAgewotICAgIHsKLSAgICAgIHsweDA0MDQsMHgwNjA1LDB4MGEwOH0sCi0gICAgICB7MHgwNjA0LDB4MDcwNCwweDBhMDh9LAotICAgICAgezB4MGEwOCwweDBhMDgsMHgwYzBhfQotICAgIH0sCi0gICAgewotICAgICAgezB4MDUwNCwweDA3MDQsMHgwYjA4fSwKLSAgICAgIHsweDA2MDQsMHgwNzA0LDB4MGEwN30sCi0gICAgICB7MHgwOTA4LDB4MDkwNywweDBiMDl9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwOTA4LDB4MGEwOCwweDBkMGF9LAotICAgICAgezB4MDgwNywweDA5MDcsMHgwYzA5fSwKLSAgICAgIHsweDBhMGEsMHgwYjA5LDB4MGMwYX0KLSAgICB9Ci0gIH0sCi0gIHsKLSAgICB7Ci0gICAgICB7MHgwODA4LDB4MGEwOCwweDBmMGJ9LAotICAgICAgezB4MDkwOCwweDBiMDcsMHgwZjBhfSwKLSAgICAgIHsweDBkMGIsMHgwZTBhLDB4MTAwY30KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDA4MDgsMHgwYTA3LDB4MGUwYX0sCi0gICAgICB7MHgwOTA3LDB4MGEwNywweDBlMDl9LAotICAgICAgezB4MGMwYSwweDBjMDksMHgwZjBifQotICAgIH0sCi0gICAgewotICAgICAgezB4MGIwYiwweDBjMGEsMHgxMDBjfSwKLSAgICAgIHsweDBhMGEsMHgwYjA5LDB4MGYwYn0sCi0gICAgICB7MHgwYzBiLDB4MGMwYSwweDBmMGJ9Ci0gICAgfQotICB9Ci19OwotCi1jb25zdCBVV29yZDE2IGh1ZmZfbHRhYjVfNls5XVs5XT0KLXsKLSAgezB4MGQwYiwweDBjMGEsMHgwYjA5LDB4MGIwOSwweDBhMDksMHgwYjA5LDB4MGIwOSwweDBjMGEsMHgwZDBifSwKLSAgezB4MGMwYSwweDBiMDksMHgwYTA4LDB4MDkwNywweDA4MDcsMHgwOTA3LDB4MGEwOCwweDBiMDksMHgwYzBhfSwKLSAgezB4MGMwOSwweDBhMDgsMHgwOTA2LDB4MDgwNiwweDA3MDYsMHgwODA2LDB4MDkwNiwweDBhMDgsMHgwYjA5fSwKLSAgezB4MGIwOSwweDA5MDcsMHgwODA2LDB4MDUwNCwweDA0MDQsMHgwNTA0LDB4MDgwNiwweDA5MDcsMHgwYjA5fSwKLSAgezB4MGEwOSwweDA4MDcsMHgwNzA2LDB4MDQwNCwweDAxMDQsMHgwNDA0LDB4MDcwNiwweDA4MDcsMHgwYjA5fSwKLSAgezB4MGIwOSwweDA5MDcsMHgwODA2LDB4MDUwNCwweDA0MDQsMHgwNTA0LDB4MDgwNiwweDA5MDcsMHgwYjA5fSwKLSAgezB4MGIwOSwweDBhMDgsMHgwOTA2LDB4MDgwNiwweDA3MDYsMHgwODA2LDB4MDkwNiwweDBhMDgsMHgwYjA5fSwKLSAgezB4MGMwYSwweDBiMDksMHgwYTA4LDB4MDkwNywweDA4MDcsMHgwOTA3LDB4MGEwNywweDBiMDgsMHgwYzBhfSwKLSAgezB4MGQwYiwweDBjMGEsMHgwYzA5LDB4MGIwOSwweDBhMDksMHgwYTA5LDB4MGIwOSwweDBjMGEsMHgwZDBifQotfTsKLQotY29uc3QgVVdvcmQxNiBodWZmX2x0YWI3XzhbOF1bOF09Ci17Ci0gIHsweDAxMDUsMHgwMzA0LDB4MDYwNSwweDA3MDYsMHgwODA3LDB4MDkwOCwweDBhMDksMHgwYjBhfSwKLSAgezB4MDMwNCwweDA0MDMsMHgwNjA0LDB4MDcwNSwweDA4MDYsMHgwODA3LDB4MDkwNywweDA5MDh9LAotICB7MHgwNjA1LDB4MDYwNCwweDA3MDQsMHgwODA1LDB4MDgwNiwweDA5MDcsMHgwOTA3LDB4MGEwOH0sCi0gIHsweDA3MDYsMHgwNzA1LDB4MDgwNSwweDA4MDYsMHgwOTA2LDB4MDkwNywweDBhMDgsMHgwYTA4fSwKLSAgezB4MDgwNywweDA4MDYsMHgwOTA2LDB4MDkwNiwweDBhMDcsMHgwYTA3LDB4MGEwOCwweDBiMDl9LAotICB7MHgwOTA4LDB4MDgwNywweDA5MDYsMHgwOTA3LDB4MGEwNywweDBhMDgsMHgwYjA4LDB4MGIwYX0sCi0gIHsweDBhMDksMHgwOTA3LDB4MDkwNywweDBhMDgsMHgwYTA4LDB4MGIwOCwweDBjMDksMHgwYzA5fSwKLSAgezB4MGIwYSwweDBhMDgsMHgwYTA4LDB4MGEwOCwweDBiMDksMHgwYjA5LDB4MGMwOSwweDBjMGF9Ci19OwotCi1jb25zdCBVV29yZDE2IGh1ZmZfbHRhYjlfMTBbMTNdWzEzXT0KLXsKLSAgezB4MDEwNiwweDAzMDUsMHgwNjA2LDB4MDgwNiwweDA5MDcsMHgwYTA4LDB4MGEwOSwweDBiMGEsMHgwYjBhLDB4MGMwYSwweDBjMGIsMHgwZDBiLDB4MGQwY30sCi0gIHsweDAzMDUsMHgwNDA0LDB4MDYwNCwweDA3MDUsMHgwODA2LDB4MDgwNywweDA5MDcsMHgwYTA4LDB4MGEwOCwweDBhMDksMHgwYjBhLDB4MGMwYSwweDBjMGJ9LAotICB7MHgwNjA2LDB4MDYwNCwweDA3MDUsMHgwODA1LDB4MDgwNiwweDA5MDYsMHgwYTA3LDB4MGEwOCwweDBhMDgsMHgwYjA5LDB4MGMwOSwweDBjMGEsMHgwYzBhfSwKLSAgezB4MDgwNiwweDA3MDUsMHgwODA1LDB4MDkwNSwweDA5MDYsMHgwYTA3LDB4MGEwNywweDBiMDgsMHgwYjA4LDB4MGIwOSwweDBjMDksMHgwYzBhLDB4MGQwYX0sCi0gIHsweDA5MDcsMHgwODA2LDB4MDkwNiwweDA5MDYsMHgwYTA2LDB4MGEwNywweDBiMDcsMHgwYjA4LDB4MGIwOCwweDBjMDksMHgwYzA5LDB4MGMwYSwweDBkMGF9LAotICB7MHgwYTA4LDB4MDkwNywweDA5MDYsMHgwYTA3LDB4MGIwNywweDBiMDcsMHgwYjA4LDB4MGMwOCwweDBiMDgsMHgwYzA5LDB4MGMwYSwweDBkMGEsMHgwZDBifSwKLSAgezB4MGIwOSwweDA5MDcsMHgwYTA3LDB4MGIwNywweDBiMDcsMHgwYjA4LDB4MGMwOCwweDBjMDksMHgwYzA5LDB4MGMwOSwweDBkMGEsMHgwZDBhLDB4MGQwYn0sCi0gIHsweDBiMDksMHgwYTA4LDB4MGEwOCwweDBiMDgsMHgwYjA4LDB4MGMwOCwweDBjMDksMHgwZDA5LDB4MGQwOSwweDBkMGEsMHgwZDBhLDB4MGQwYiwweDBkMGJ9LAotICB7MHgwYjA5LDB4MGEwOCwweDBhMDgsMHgwYjA4LDB4MGIwOCwweDBiMDgsMHgwYzA5LDB4MGMwOSwweDBkMGEsMHgwZDBhLDB4MGUwYSwweDBkMGIsMHgwZTBifSwKLSAgezB4MGIwYSwweDBhMDksMHgwYjA5LDB4MGIwOSwweDBjMDksMHgwYzA5LDB4MGMwOSwweDBjMGEsMHgwZDBhLDB4MGQwYSwweDBlMGIsMHgwZTBiLDB4MGUwY30sCi0gIHsweDBjMGEsMHgwYjA5LDB4MGIwOSwweDBjMDksMHgwYzA5LDB4MGMwYSwweDBkMGEsMHgwZDBhLDB4MGQwYSwweDBlMGIsMHgwZTBiLDB4MGUwYiwweDBmMGN9LAotICB7MHgwYzBiLDB4MGIwYSwweDBjMDksMHgwYzBhLDB4MGMwYSwweDBkMGEsMHgwZDBhLDB4MGQwYSwweDBkMGIsMHgwZTBiLDB4MGUwYiwweDBmMGIsMHgwZjBjfSwKLSAgezB4MGQwYiwweDBjMGEsMHgwYzBhLDB4MGMwYSwweDBkMGEsMHgwZDBhLDB4MGQwYSwweDBkMGIsMHgwZTBiLDB4MGUwYywweDBlMGMsMHgwZTBjLDB4MGYwY30KLX07Ci0KLWNvbnN0IFVXb3JkMTYgaHVmZl9sdGFiMTFbMTddWzE3XT0KLXsKLSAgezB4MDAwNCwweDAwMDUsMHgwMDA2LDB4MDAwNywweDAwMDgsMHgwMDA4LDB4MDAwOSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGIsMHgwMDBiLDB4MDAwYywweDAwMGIsMHgwMDBjLDB4MDAwYywweDAwMGF9LAotICB7MHgwMDA1LDB4MDAwNCwweDAwMDUsMHgwMDA2LDB4MDAwNywweDAwMDcsMHgwMDA4LDB4MDAwOCwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBiLDB4MDAwOH0sCi0gIHsweDAwMDYsMHgwMDA1LDB4MDAwNSwweDAwMDYsMHgwMDA3LDB4MDAwNywweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDA4fSwKLSAgezB4MDAwNywweDAwMDYsMHgwMDA2LDB4MDAwNiwweDAwMDcsMHgwMDA3LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMDh9LAotICB7MHgwMDA4LDB4MDAwNywweDAwMDcsMHgwMDA3LDB4MDAwNywweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwOH0sCi0gIHsweDAwMDgsMHgwMDA3LDB4MDAwNywweDAwMDcsMHgwMDA3LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDA4fSwKLSAgezB4MDAwOSwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMDh9LAotICB7MHgwMDA5LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwOH0sCi0gIHsweDAwMGEsMHgwMDA5LDB4MDAwOCwweDAwMDgsMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGIsMHgwMDA4fSwKLSAgezB4MDAwYSwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBiLDB4MDAwYiwweDAwMDh9LAotICB7MHgwMDBiLDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBiLDB4MDAwYSwweDAwMGIsMHgwMDBiLDB4MDAwOH0sCi0gIHsweDAwMGIsMHgwMDBhLDB4MDAwOSwweDAwMDksMHgwMDBhLDB4MDAwOSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYiwweDAwMGIsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDA4fSwKLSAgezB4MDAwYiwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDBiLDB4MDAwYiwweDAwMDl9LAotICB7MHgwMDBiLDB4MDAwYSwweDAwMDksMHgwMDA5LDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYiwweDAwMGIsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDBiLDB4MDAwOX0sCi0gIHsweDAwMGIsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDA5fSwKLSAgezB4MDAwYywweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDBjLDB4MDAwYywweDAwMDl9LAotICB7MHgwMDA5LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA5LDB4MDAwNX0KLX07Ci0KLWNvbnN0IFVXb3JkMTYgaHVmZl9sdGFic2NmWzEyMV09Ci17Ci0gIDB4MDAxMiwKLSAgMHgwMDEyLAotICAweDAwMTIsCi0gIDB4MDAxMiwKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEyLAotICAweDAwMTMsCi0gIDB4MDAxMiwKLSAgMHgwMDExLAotICAweDAwMTEsCi0gIDB4MDAxMCwKLSAgMHgwMDExLAotICAweDAwMTAsCi0gIDB4MDAxMCwKLSAgMHgwMDEwLAotICAweDAwMTAsCi0gIDB4MDAwZiwKLSAgMHgwMDBmLAotICAweDAwMGUsCi0gIDB4MDAwZSwKLSAgMHgwMDBlLAotICAweDAwMGUsCi0gIDB4MDAwZSwKLSAgMHgwMDBlLAotICAweDAwMGQsCi0gIDB4MDAwZCwKLSAgMHgwMDBjLAotICAweDAwMGMsCi0gIDB4MDAwYywKLSAgMHgwMDBiLAotICAweDAwMGMsCi0gIDB4MDAwYiwKLSAgMHgwMDBhLAotICAweDAwMGEsCi0gIDB4MDAwYSwKLSAgMHgwMDA5LAotICAweDAwMDksCi0gIDB4MDAwOCwKLSAgMHgwMDA4LAotICAweDAwMDgsCi0gIDB4MDAwNywKLSAgMHgwMDA2LAotICAweDAwMDYsCi0gIDB4MDAwNSwKLSAgMHgwMDA0LAotICAweDAwMDMsCi0gIDB4MDAwMSwKLSAgMHgwMDA0LAotICAweDAwMDQsCi0gIDB4MDAwNSwKLSAgMHgwMDA2LAotICAweDAwMDYsCi0gIDB4MDAwNywKLSAgMHgwMDA3LAotICAweDAwMDgsCi0gIDB4MDAwOCwKLSAgMHgwMDA5LAotICAweDAwMDksCi0gIDB4MDAwYSwKLSAgMHgwMDBhLAotICAweDAwMGEsCi0gIDB4MDAwYiwKLSAgMHgwMDBiLAotICAweDAwMGIsCi0gIDB4MDAwYiwKLSAgMHgwMDBjLAotICAweDAwMGMsCi0gIDB4MDAwZCwKLSAgMHgwMDBkLAotICAweDAwMGQsCi0gIDB4MDAwZSwKLSAgMHgwMDBlLAotICAweDAwMTAsCi0gIDB4MDAwZiwKLSAgMHgwMDEwLAotICAweDAwMGYsCi0gIDB4MDAxMiwKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMywKLSAgMHgwMDEzLAotICAweDAwMTMsCi0gIDB4MDAxMwotfTsKLQotCi1jb25zdCBVV29yZDE2IGh1ZmZfY3RhYjFbM11bM11bM11bM109Ci17Ci0gIHsKLSAgICB7Ci0gICAgICB7MHgwN2Y4LDB4MDFmMSwweDA3ZmR9LAotICAgICAgezB4MDNmNSwweDAwNjgsMHgwM2YwfSwKLSAgICAgIHsweDA3ZjcsMHgwMWVjLDB4MDdmNX0KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDAzZjEsMHgwMDcyLDB4MDNmNH0sCi0gICAgICB7MHgwMDc0LDB4MDAxMSwweDAwNzZ9LAotICAgICAgezB4MDFlYiwweDAwNmMsMHgwM2Y2fQotICAgIH0sCi0gICAgewotICAgICAgezB4MDdmYywweDAxZTEsMHgwN2YxfSwKLSAgICAgIHsweDAxZjAsMHgwMDYxLDB4MDFmNn0sCi0gICAgICB7MHgwN2YyLDB4MDFlYSwweDA3ZmJ9Ci0gICAgfQotICB9LAotICB7Ci0gICAgewotICAgICAgezB4MDFmMiwweDAwNjksMHgwMWVkfSwKLSAgICAgIHsweDAwNzcsMHgwMDE3LDB4MDA2Zn0sCi0gICAgICB7MHgwMWU2LDB4MDA2NCwweDAxZTV9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwMDY3LDB4MDAxNSwweDAwNjJ9LAotICAgICAgezB4MDAxMiwweDAwMDAsMHgwMDE0fSwKLSAgICAgIHsweDAwNjUsMHgwMDE2LDB4MDA2ZH0KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDAxZTksMHgwMDYzLDB4MDFlNH0sCi0gICAgICB7MHgwMDZiLDB4MDAxMywweDAwNzF9LAotICAgICAgezB4MDFlMywweDAwNzAsMHgwMWYzfQotICAgIH0KLSAgfSwKLSAgewotICAgIHsKLSAgICAgIHsweDA3ZmUsMHgwMWU3LDB4MDdmM30sCi0gICAgICB7MHgwMWVmLDB4MDA2MCwweDAxZWV9LAotICAgICAgezB4MDdmMCwweDAxZTIsMHgwN2ZhfQotICAgIH0sCi0gICAgewotICAgICAgezB4MDNmMywweDAwNmEsMHgwMWU4fSwKLSAgICAgIHsweDAwNzUsMHgwMDEwLDB4MDA3M30sCi0gICAgICB7MHgwMWY0LDB4MDA2ZSwweDAzZjd9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwN2Y2LDB4MDFlMCwweDA3Zjl9LAotICAgICAgezB4MDNmMiwweDAwNjYsMHgwMWY1fSwKLSAgICAgIHsweDA3ZmYsMHgwMWY3LDB4MDdmNH0KLSAgICB9Ci0gIH0KLX07Ci0KLWNvbnN0IFVXb3JkMTYgaHVmZl9jdGFiMlszXVszXVszXVszXT0KLXsKLSAgewotICAgIHsKLSAgICAgIHsweDAxZjMsMHgwMDZmLDB4MDFmZH0sCi0gICAgICB7MHgwMGViLDB4MDAyMywweDAwZWF9LAotICAgICAgezB4MDFmNywweDAwZTgsMHgwMWZhfQotICAgIH0sCi0gICAgewotICAgICAgezB4MDBmMiwweDAwMmQsMHgwMDcwfSwKLSAgICAgIHsweDAwMjAsMHgwMDA2LDB4MDAyYn0sCi0gICAgICB7MHgwMDZlLDB4MDAyOCwweDAwZTl9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwMWY5LDB4MDA2NiwweDAwZjh9LAotICAgICAgezB4MDBlNywweDAwMWIsMHgwMGYxfSwKLSAgICAgIHsweDAxZjQsMHgwMDZiLDB4MDFmNX0KLSAgICB9Ci0gIH0sCi0gIHsKLSAgICB7Ci0gICAgICB7MHgwMGVjLDB4MDAyYSwweDAwNmN9LAotICAgICAgezB4MDAyYywweDAwMGEsMHgwMDI3fSwKLSAgICAgIHsweDAwNjcsMHgwMDFhLDB4MDBmNX0KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDAwMjQsMHgwMDA4LDB4MDAxZn0sCi0gICAgICB7MHgwMDA5LDB4MDAwMCwweDAwMDd9LAotICAgICAgezB4MDAxZCwweDAwMGIsMHgwMDMwfQotICAgIH0sCi0gICAgewotICAgICAgezB4MDBlZiwweDAwMWMsMHgwMDY0fSwKLSAgICAgIHsweDAwMWUsMHgwMDBjLDB4MDAyOX0sCi0gICAgICB7MHgwMGYzLDB4MDAyZiwweDAwZjB9Ci0gICAgfQotICB9LAotICB7Ci0gICAgewotICAgICAgezB4MDFmYywweDAwNzEsMHgwMWYyfSwKLSAgICAgIHsweDAwZjQsMHgwMDIxLDB4MDBlNn0sCi0gICAgICB7MHgwMGY3LDB4MDA2OCwweDAxZjh9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwMGVlLDB4MDAyMiwweDAwNjV9LAotICAgICAgezB4MDAzMSwweDAwMDIsMHgwMDI2fSwKLSAgICAgIHsweDAwZWQsMHgwMDI1LDB4MDA2YX0KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDAxZmIsMHgwMDcyLDB4MDFmZX0sCi0gICAgICB7MHgwMDY5LDB4MDAyZSwweDAwZjZ9LAotICAgICAgezB4MDFmZiwweDAwNmQsMHgwMWY2fQotICAgIH0KLSAgfQotfTsKLQotY29uc3QgVVdvcmQxNiBodWZmX2N0YWIzWzNdWzNdWzNdWzNdPQotewotICB7Ci0gICAgewotICAgICAgezB4MDAwMCwweDAwMDksMHgwMGVmfSwKLSAgICAgIHsweDAwMGIsMHgwMDE5LDB4MDBmMH0sCi0gICAgICB7MHgwMWViLDB4MDFlNiwweDAzZjJ9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwMDBhLDB4MDAzNSwweDAxZWZ9LAotICAgICAgezB4MDAzNCwweDAwMzcsMHgwMWU5fSwKLSAgICAgIHsweDAxZWQsMHgwMWU3LDB4MDNmM30KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDAxZWUsMHgwM2VkLDB4MWZmYX0sCi0gICAgICB7MHgwMWVjLDB4MDFmMiwweDA3Zjl9LAotICAgICAgezB4MDdmOCwweDAzZjgsMHgwZmY4fQotICAgIH0KLSAgfSwKLSAgewotICAgIHsKLSAgICAgIHsweDAwMDgsMHgwMDM4LDB4MDNmNn0sCi0gICAgICB7MHgwMDM2LDB4MDA3NSwweDAzZjF9LAotICAgICAgezB4MDNlYiwweDAzZWMsMHgwZmY0fQotICAgIH0sCi0gICAgewotICAgICAgezB4MDAxOCwweDAwNzYsMHgwN2Y0fSwKLSAgICAgIHsweDAwMzksMHgwMDc0LDB4MDNlZn0sCi0gICAgICB7MHgwMWYzLDB4MDFmNCwweDA3ZjZ9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwMWU4LDB4MDNlYSwweDFmZmN9LAotICAgICAgezB4MDBmMiwweDAxZjEsMHgwZmZifSwKLSAgICAgIHsweDAzZjUsMHgwN2YzLDB4MGZmY30KLSAgICB9Ci0gIH0sCi0gIHsKLSAgICB7Ci0gICAgICB7MHgwMGVlLDB4MDNmNywweDdmZmV9LAotICAgICAgezB4MDFmMCwweDA3ZjUsMHg3ZmZkfSwKLSAgICAgIHsweDFmZmIsMHgzZmZhLDB4ZmZmZn0KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDAwZjEsMHgwM2YwLDB4M2ZmY30sCi0gICAgICB7MHgwMWVhLDB4MDNlZSwweDNmZmJ9LAotICAgICAgezB4MGZmNiwweDBmZmEsMHg3ZmZjfQotICAgIH0sCi0gICAgewotICAgICAgezB4MDdmMiwweDBmZjUsMHhmZmZlfSwKLSAgICAgIHsweDAzZjQsMHgwN2Y3LDB4N2ZmYn0sCi0gICAgICB7MHgwZmY3LDB4MGZmOSwweDdmZmF9Ci0gICAgfQotICB9Ci19OwotCi1jb25zdCBVV29yZDE2IGh1ZmZfY3RhYjRbM11bM11bM11bM109Ci17Ci0gIHsKLSAgICB7Ci0gICAgICB7MHgwMDA3LDB4MDAxNiwweDAwZjZ9LAotICAgICAgezB4MDAxOCwweDAwMDgsMHgwMGVmfSwKLSAgICAgIHsweDAxZWYsMHgwMGYzLDB4MDdmOH0KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDAwMTksMHgwMDE3LDB4MDBlZH0sCi0gICAgICB7MHgwMDE1LDB4MDAwMSwweDAwZTJ9LAotICAgICAgezB4MDBmMCwweDAwNzAsMHgwM2YwfQotICAgIH0sCi0gICAgewotICAgICAgezB4MDFlZSwweDAwZjEsMHgwN2ZhfSwKLSAgICAgIHsweDAwZWUsMHgwMGU0LDB4MDNmMn0sCi0gICAgICB7MHgwN2Y2LDB4MDNlZiwweDA3ZmR9Ci0gICAgfQotICB9LAotICB7Ci0gICAgewotICAgICAgezB4MDAwNSwweDAwMTQsMHgwMGYyfSwKLSAgICAgIHsweDAwMDksMHgwMDA0LDB4MDBlNX0sCi0gICAgICB7MHgwMGY0LDB4MDBlOCwweDAzZjR9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwMDA2LDB4MDAwMiwweDAwZTd9LAotICAgICAgezB4MDAwMywweDAwMDAsMHgwMDZifSwKLSAgICAgIHsweDAwZTMsMHgwMDY5LDB4MDFmM30KLSAgICB9LAotICAgIHsKLSAgICAgIHsweDAwZWIsMHgwMGU2LDB4MDNmNn0sCi0gICAgICB7MHgwMDZlLDB4MDA2YSwweDAxZjR9LAotICAgICAgezB4MDNlYywweDAxZjAsMHgwM2Y5fQotICAgIH0KLSAgfSwKLSAgewotICAgIHsKLSAgICAgIHsweDAwZjUsMHgwMGVjLDB4MDdmYn0sCi0gICAgICB7MHgwMGVhLDB4MDA2ZiwweDAzZjd9LAotICAgICAgezB4MDdmOSwweDAzZjMsMHgwZmZmfQotICAgIH0sCi0gICAgewotICAgICAgezB4MDBlOSwweDAwNmQsMHgwM2Y4fSwKLSAgICAgIHsweDAwNmMsMHgwMDY4LDB4MDFmNX0sCi0gICAgICB7MHgwM2VlLDB4MDFmMiwweDA3ZjR9Ci0gICAgfSwKLSAgICB7Ci0gICAgICB7MHgwN2Y3LDB4MDNmMSwweDBmZmV9LAotICAgICAgezB4MDNlZCwweDAxZjEsMHgwN2Y1fSwKLSAgICAgIHsweDA3ZmUsMHgwM2Y1LDB4MDdmY30KLSAgICB9Ci0gIH0KLX07Ci1jb25zdCBVV29yZDE2IGh1ZmZfY3RhYjVbOV1bOV09Ci17Ci0gIHsweDFmZmYsMHgwZmY3LDB4MDdmNCwweDA3ZTgsMHgwM2YxLDB4MDdlZSwweDA3ZjksMHgwZmY4LDB4MWZmZH0sCi0gIHsweDBmZmQsMHgwN2YxLDB4MDNlOCwweDAxZTgsMHgwMGYwLDB4MDFlYywweDAzZWUsMHgwN2YyLDB4MGZmYX0sCi0gIHsweDBmZjQsMHgwM2VmLDB4MDFmMiwweDAwZTgsMHgwMDcwLDB4MDBlYywweDAxZjAsMHgwM2VhLDB4MDdmM30sCi0gIHsweDA3ZWIsMHgwMWViLDB4MDBlYSwweDAwMWEsMHgwMDA4LDB4MDAxOSwweDAwZWUsMHgwMWVmLDB4MDdlZH0sCi0gIHsweDAzZjAsMHgwMGYyLDB4MDA3MywweDAwMGIsMHgwMDAwLDB4MDAwYSwweDAwNzEsMHgwMGYzLDB4MDdlOX0sCi0gIHsweDA3ZWYsMHgwMWVlLDB4MDBlZiwweDAwMTgsMHgwMDA5LDB4MDAxYiwweDAwZWIsMHgwMWU5LDB4MDdlY30sCi0gIHsweDA3ZjYsMHgwM2ViLDB4MDFmMywweDAwZWQsMHgwMDcyLDB4MDBlOSwweDAxZjEsMHgwM2VkLDB4MDdmN30sCi0gIHsweDBmZjYsMHgwN2YwLDB4MDNlOSwweDAxZWQsMHgwMGYxLDB4MDFlYSwweDAzZWMsMHgwN2Y4LDB4MGZmOX0sCi0gIHsweDFmZmMsMHgwZmZjLDB4MGZmNSwweDA3ZWEsMHgwM2YzLDB4MDNmMiwweDA3ZjUsMHgwZmZiLDB4MWZmZX0KLX07Ci0KLWNvbnN0IFVXb3JkMTYgaHVmZl9jdGFiNls5XVs5XT0KLXsKLSAgezB4MDdmZSwweDAzZmQsMHgwMWYxLDB4MDFlYiwweDAxZjQsMHgwMWVhLDB4MDFmMCwweDAzZmMsMHgwN2ZkfSwKLSAgezB4MDNmNiwweDAxZTUsMHgwMGVhLDB4MDA2YywweDAwNzEsMHgwMDY4LDB4MDBmMCwweDAxZTYsMHgwM2Y3fSwKLSAgezB4MDFmMywweDAwZWYsMHgwMDMyLDB4MDAyNywweDAwMjgsMHgwMDI2LDB4MDAzMSwweDAwZWIsMHgwMWY3fSwKLSAgezB4MDFlOCwweDAwNmYsMHgwMDJlLDB4MDAwOCwweDAwMDQsMHgwMDA2LDB4MDAyOSwweDAwNmIsMHgwMWVlfSwKLSAgezB4MDFlZiwweDAwNzIsMHgwMDJkLDB4MDAwMiwweDAwMDAsMHgwMDAzLDB4MDAyZiwweDAwNzMsMHgwMWZhfSwKLSAgezB4MDFlNywweDAwNmUsMHgwMDJiLDB4MDAwNywweDAwMDEsMHgwMDA1LDB4MDAyYywweDAwNmQsMHgwMWVjfSwKLSAgezB4MDFmOSwweDAwZWUsMHgwMDMwLDB4MDAyNCwweDAwMmEsMHgwMDI1LDB4MDAzMywweDAwZWMsMHgwMWYyfSwKLSAgezB4MDNmOCwweDAxZTQsMHgwMGVkLDB4MDA2YSwweDAwNzAsMHgwMDY5LDB4MDA3NCwweDAwZjEsMHgwM2ZhfSwKLSAgezB4MDdmZiwweDAzZjksMHgwMWY2LDB4MDFlZCwweDAxZjgsMHgwMWU5LDB4MDFmNSwweDAzZmIsMHgwN2ZjfQotfTsKLQotY29uc3QgVVdvcmQxNiBodWZmX2N0YWI3WzhdWzhdPQotewotICB7MHgwMDAwLDB4MDAwNSwweDAwMzcsMHgwMDc0LDB4MDBmMiwweDAxZWIsMHgwM2VkLDB4MDdmN30sCi0gIHsweDAwMDQsMHgwMDBjLDB4MDAzNSwweDAwNzEsMHgwMGVjLDB4MDBlZSwweDAxZWUsMHgwMWY1fSwKLSAgezB4MDAzNiwweDAwMzQsMHgwMDcyLDB4MDBlYSwweDAwZjEsMHgwMWU5LDB4MDFmMywweDAzZjV9LAotICB7MHgwMDczLDB4MDA3MCwweDAwZWIsMHgwMGYwLDB4MDFmMSwweDAxZjAsMHgwM2VjLDB4MDNmYX0sCi0gIHsweDAwZjMsMHgwMGVkLDB4MDFlOCwweDAxZWYsMHgwM2VmLDB4MDNmMSwweDAzZjksMHgwN2ZifSwKLSAgezB4MDFlZCwweDAwZWYsMHgwMWVhLDB4MDFmMiwweDAzZjMsMHgwM2Y4LDB4MDdmOSwweDA3ZmN9LAotICB7MHgwM2VlLDB4MDFlYywweDAxZjQsMHgwM2Y0LDB4MDNmNywweDA3ZjgsMHgwZmZkLDB4MGZmZX0sCi0gIHsweDA3ZjYsMHgwM2YwLDB4MDNmMiwweDAzZjYsMHgwN2ZhLDB4MDdmZCwweDBmZmMsMHgwZmZmfQotfTsKLQotY29uc3QgVVdvcmQxNiBodWZmX2N0YWI4WzhdWzhdPQotewotICB7MHgwMDBlLDB4MDAwNSwweDAwMTAsMHgwMDMwLDB4MDA2ZiwweDAwZjEsMHgwMWZhLDB4MDNmZX0sCi0gIHsweDAwMDMsMHgwMDAwLDB4MDAwNCwweDAwMTIsMHgwMDJjLDB4MDA2YSwweDAwNzUsMHgwMGY4fSwKLSAgezB4MDAwZiwweDAwMDIsMHgwMDA2LDB4MDAxNCwweDAwMmUsMHgwMDY5LDB4MDA3MiwweDAwZjV9LAotICB7MHgwMDJmLDB4MDAxMSwweDAwMTMsMHgwMDJhLDB4MDAzMiwweDAwNmMsMHgwMGVjLDB4MDBmYX0sCi0gIHsweDAwNzEsMHgwMDJiLDB4MDAyZCwweDAwMzEsMHgwMDZkLDB4MDA3MCwweDAwZjIsMHgwMWY5fSwKLSAgezB4MDBlZiwweDAwNjgsMHgwMDMzLDB4MDA2YiwweDAwNmUsMHgwMGVlLDB4MDBmOSwweDAzZmN9LAotICB7MHgwMWY4LDB4MDA3NCwweDAwNzMsMHgwMGVkLDB4MDBmMCwweDAwZjYsMHgwMWY2LDB4MDFmZH0sCi0gIHsweDAzZmQsMHgwMGYzLDB4MDBmNCwweDAwZjcsMHgwMWY3LDB4MDFmYiwweDAxZmMsMHgwM2ZmfQotfTsKLQotY29uc3QgVVdvcmQxNiBodWZmX2N0YWI5WzEzXVsxM109Ci17Ci0gIHsweDAwMDAsMHgwMDA1LDB4MDAzNywweDAwZTcsMHgwMWRlLDB4MDNjZSwweDAzZDksMHgwN2M4LDB4MDdjZCwweDBmYzgsMHgwZmRkLDB4MWZlNCwweDFmZWN9LAotICB7MHgwMDA0LDB4MDAwYywweDAwMzUsMHgwMDcyLDB4MDBlYSwweDAwZWQsMHgwMWUyLDB4MDNkMSwweDAzZDMsMHgwM2UwLDB4MDdkOCwweDBmY2YsMHgwZmQ1fSwKLSAgezB4MDAzNiwweDAwMzQsMHgwMDcxLDB4MDBlOCwweDAwZWMsMHgwMWUxLDB4MDNjZiwweDAzZGQsMHgwM2RiLDB4MDdkMCwweDBmYzcsMHgwZmQ0LDB4MGZlNH0sCi0gIHsweDAwZTYsMHgwMDcwLDB4MDBlOSwweDAxZGQsMHgwMWUzLDB4MDNkMiwweDAzZGMsMHgwN2NjLDB4MDdjYSwweDA3ZGUsMHgwZmQ4LDB4MGZlYSwweDFmZGJ9LAotICB7MHgwMWRmLDB4MDBlYiwweDAxZGMsMHgwMWU2LDB4MDNkNSwweDAzZGUsMHgwN2NiLDB4MDdkZCwweDA3ZGMsMHgwZmNkLDB4MGZlMiwweDBmZTcsMHgxZmUxfSwKLSAgezB4MDNkMCwweDAxZTAsMHgwMWU0LDB4MDNkNiwweDA3YzUsMHgwN2QxLDB4MDdkYiwweDBmZDIsMHgwN2UwLDB4MGZkOSwweDBmZWIsMHgxZmUzLDB4MWZlOX0sCi0gIHsweDA3YzQsMHgwMWU1LDB4MDNkNywweDA3YzYsMHgwN2NmLDB4MDdkYSwweDBmY2IsMHgwZmRhLDB4MGZlMywweDBmZTksMHgxZmU2LDB4MWZmMywweDFmZjd9LAotICB7MHgwN2QzLDB4MDNkOCwweDAzZTEsMHgwN2Q0LDB4MDdkOSwweDBmZDMsMHgwZmRlLDB4MWZkZCwweDFmZDksMHgxZmUyLDB4MWZlYSwweDFmZjEsMHgxZmY2fSwKLSAgezB4MDdkMiwweDAzZDQsMHgwM2RhLDB4MDdjNywweDA3ZDcsMHgwN2UyLDB4MGZjZSwweDBmZGIsMHgxZmQ4LDB4MWZlZSwweDNmZjAsMHgxZmY0LDB4M2ZmMn0sCi0gIHsweDA3ZTEsMHgwM2RmLDB4MDdjOSwweDA3ZDYsMHgwZmNhLDB4MGZkMCwweDBmZTUsMHgwZmU2LDB4MWZlYiwweDFmZWYsMHgzZmYzLDB4M2ZmNCwweDNmZjV9LAotICB7MHgwZmUwLDB4MDdjZSwweDA3ZDUsMHgwZmM2LDB4MGZkMSwweDBmZTEsMHgxZmUwLDB4MWZlOCwweDFmZjAsMHgzZmYxLDB4M2ZmOCwweDNmZjYsMHg3ZmZjfSwKLSAgezB4MGZlOCwweDA3ZGYsMHgwZmM5LDB4MGZkNywweDBmZGMsMHgxZmRjLDB4MWZkZiwweDFmZWQsMHgxZmY1LDB4M2ZmOSwweDNmZmIsMHg3ZmZkLDB4N2ZmZX0sCi0gIHsweDFmZTcsMHgwZmNjLDB4MGZkNiwweDBmZGYsMHgxZmRlLDB4MWZkYSwweDFmZTUsMHgxZmYyLDB4M2ZmYSwweDNmZjcsMHgzZmZjLDB4M2ZmZCwweDdmZmZ9Ci19OwotCi1jb25zdCBVV29yZDE2IGh1ZmZfY3RhYjEwWzEzXVsxM109Ci17Ci0gIHsweDAwMjIsMHgwMDA4LDB4MDAxZCwweDAwMjYsMHgwMDVmLDB4MDBkMywweDAxY2YsMHgwM2QwLDB4MDNkNywweDAzZWQsMHgwN2YwLDB4MDdmNiwweDBmZmR9LAotICB7MHgwMDA3LDB4MDAwMCwweDAwMDEsMHgwMDA5LDB4MDAyMCwweDAwNTQsMHgwMDYwLDB4MDBkNSwweDAwZGMsMHgwMWQ0LDB4MDNjZCwweDAzZGUsMHgwN2U3fSwKLSAgezB4MDAxYywweDAwMDIsMHgwMDA2LDB4MDAwYywweDAwMWUsMHgwMDI4LDB4MDA1YiwweDAwY2QsMHgwMGQ5LDB4MDFjZSwweDAxZGMsMHgwM2Q5LDB4MDNmMX0sCi0gIHsweDAwMjUsMHgwMDBiLDB4MDAwYSwweDAwMGQsMHgwMDI0LDB4MDA1NywweDAwNjEsMHgwMGNjLDB4MDBkZCwweDAxY2MsMHgwMWRlLDB4MDNkMywweDAzZTd9LAotICB7MHgwMDVkLDB4MDAyMSwweDAwMWYsMHgwMDIzLDB4MDAyNywweDAwNTksMHgwMDY0LDB4MDBkOCwweDAwZGYsMHgwMWQyLDB4MDFlMiwweDAzZGQsMHgwM2VlfSwKLSAgezB4MDBkMSwweDAwNTUsMHgwMDI5LDB4MDA1NiwweDAwNTgsMHgwMDYyLDB4MDBjZSwweDAwZTAsMHgwMGUyLDB4MDFkYSwweDAzZDQsMHgwM2UzLDB4MDdlYn0sCi0gIHsweDAxYzksMHgwMDVlLDB4MDA1YSwweDAwNWMsMHgwMDYzLDB4MDBjYSwweDAwZGEsMHgwMWM3LDB4MDFjYSwweDAxZTAsMHgwM2RiLDB4MDNlOCwweDA3ZWN9LAotICB7MHgwMWUzLDB4MDBkMiwweDAwY2IsMHgwMGQwLDB4MDBkNywweDAwZGIsMHgwMWM2LDB4MDFkNSwweDAxZDgsMHgwM2NhLDB4MDNkYSwweDA3ZWEsMHgwN2YxfSwKLSAgezB4MDFlMSwweDAwZDQsMHgwMGNmLDB4MDBkNiwweDAwZGUsMHgwMGUxLDB4MDFkMCwweDAxZDYsMHgwM2QxLDB4MDNkNSwweDAzZjIsMHgwN2VlLDB4MDdmYn0sCi0gIHsweDAzZTksMHgwMWNkLDB4MDFjOCwweDAxY2IsMHgwMWQxLDB4MDFkNywweDAxZGYsMHgwM2NmLDB4MDNlMCwweDAzZWYsMHgwN2U2LDB4MDdmOCwweDBmZmF9LAotICB7MHgwM2ViLDB4MDFkZCwweDAxZDMsMHgwMWQ5LDB4MDFkYiwweDAzZDIsMHgwM2NjLDB4MDNkYywweDAzZWEsMHgwN2VkLDB4MDdmMywweDA3ZjksMHgwZmY5fSwKLSAgezB4MDdmMiwweDAzY2UsMHgwMWU0LDB4MDNjYiwweDAzZDgsMHgwM2Q2LDB4MDNlMiwweDAzZTUsMHgwN2U4LDB4MDdmNCwweDA3ZjUsMHgwN2Y3LDB4MGZmYn0sCi0gIHsweDA3ZmEsMHgwM2VjLDB4MDNkZiwweDAzZTEsMHgwM2U0LDB4MDNlNiwweDAzZjAsMHgwN2U5LDB4MDdlZiwweDBmZjgsMHgwZmZlLDB4MGZmYywweDBmZmZ9Ci19OwotCi1jb25zdCBVV29yZDE2IGh1ZmZfY3RhYjExWzE3XVsxN109Ci17Ci0gIHsweDAwMDAsMHgwMDA2LDB4MDAxOSwweDAwM2QsMHgwMDljLDB4MDBjNiwweDAxYTcsMHgwMzkwLDB4MDNjMiwweDAzZGYsMHgwN2U2LDB4MDdmMywweDBmZmIsMHgwN2VjLDB4MGZmYSwweDBmZmUsMHgwMzhlfSwKLSAgezB4MDAwNSwweDAwMDEsMHgwMDA4LDB4MDAxNCwweDAwMzcsMHgwMDQyLDB4MDA5MiwweDAwYWYsMHgwMTkxLDB4MDFhNSwweDAxYjUsMHgwMzllLDB4MDNjMCwweDAzYTIsMHgwM2NkLDB4MDdkNiwweDAwYWV9LAotICB7MHgwMDE3LDB4MDAwNywweDAwMDksMHgwMDE4LDB4MDAzOSwweDAwNDAsMHgwMDhlLDB4MDBhMywweDAwYjgsMHgwMTk5LDB4MDFhYywweDAxYzEsMHgwM2IxLDB4MDM5NiwweDAzYmUsMHgwM2NhLDB4MDA5ZH0sCi0gIHsweDAwM2MsMHgwMDE1LDB4MDAxNiwweDAwMWEsMHgwMDNiLDB4MDA0NCwweDAwOTEsMHgwMGE1LDB4MDBiZSwweDAxOTYsMHgwMWFlLDB4MDFiOSwweDAzYTEsMHgwMzkxLDB4MDNhNSwweDAzZDUsMHgwMDk0fSwKLSAgezB4MDA5YSwweDAwMzYsMHgwMDM4LDB4MDAzYSwweDAwNDEsMHgwMDhjLDB4MDA5YiwweDAwYjAsMHgwMGMzLDB4MDE5ZSwweDAxYWIsMHgwMWJjLDB4MDM5ZiwweDAzOGYsMHgwM2E5LDB4MDNjZiwweDAwOTN9LAotICB7MHgwMGJmLDB4MDAzZSwweDAwM2YsMHgwMDQzLDB4MDA0NSwweDAwOWUsMHgwMGE3LDB4MDBiOSwweDAxOTQsMHgwMWEyLDB4MDFiYSwweDAxYzMsMHgwM2E2LDB4MDNhNywweDAzYmIsMHgwM2Q0LDB4MDA5Zn0sCi0gIHsweDAxYTAsMHgwMDhmLDB4MDA4ZCwweDAwOTAsMHgwMDk4LDB4MDBhNiwweDAwYjYsMHgwMGM0LDB4MDE5ZiwweDAxYWYsMHgwMWJmLDB4MDM5OSwweDAzYmYsMHgwM2I0LDB4MDNjOSwweDAzZTcsMHgwMGE4fSwKLSAgezB4MDFiNiwweDAwYWIsMHgwMGE0LDB4MDBhYSwweDAwYjIsMHgwMGMyLDB4MDBjNSwweDAxOTgsMHgwMWE0LDB4MDFiOCwweDAzOGMsMHgwM2E0LDB4MDNjNCwweDAzYzYsMHgwM2RkLDB4MDNlOCwweDAwYWR9LAotICB7MHgwM2FmLDB4MDE5MiwweDAwYmQsMHgwMGJjLDB4MDE4ZSwweDAxOTcsMHgwMTlhLDB4MDFhMywweDAxYjEsMHgwMzhkLDB4MDM5OCwweDAzYjcsMHgwM2QzLDB4MDNkMSwweDAzZGIsMHgwN2RkLDB4MDBiNH0sCi0gIHsweDAzZGUsMHgwMWE5LDB4MDE5YiwweDAxOWMsMHgwMWExLDB4MDFhYSwweDAxYWQsMHgwMWIzLDB4MDM4YiwweDAzYjIsMHgwM2I4LDB4MDNjZSwweDAzZTEsMHgwM2UwLDB4MDdkMiwweDA3ZTUsMHgwMGI3fSwKLSAgezB4MDdlMywweDAxYmIsMHgwMWE4LDB4MDFhNiwweDAxYjAsMHgwMWIyLDB4MDFiNywweDAzOWIsMHgwMzlhLDB4MDNiYSwweDAzYjUsMHgwM2Q2LDB4MDdkNywweDAzZTQsMHgwN2Q4LDB4MDdlYSwweDAwYmF9LAotICB7MHgwN2U4LDB4MDNhMCwweDAxYmQsMHgwMWI0LDB4MDM4YSwweDAxYzQsMHgwMzkyLDB4MDNhYSwweDAzYjAsMHgwM2JjLDB4MDNkNywweDA3ZDQsMHgwN2RjLDB4MDdkYiwweDA3ZDUsMHgwN2YwLDB4MDBjMX0sCi0gIHsweDA3ZmIsMHgwM2M4LDB4MDNhMywweDAzOTUsMHgwMzlkLDB4MDNhYywweDAzYWUsMHgwM2M1LDB4MDNkOCwweDAzZTIsMHgwM2U2LDB4MDdlNCwweDA3ZTcsMHgwN2UwLDB4MDdlOSwweDA3ZjcsMHgwMTkwfSwKLSAgezB4MDdmMiwweDAzOTMsMHgwMWJlLDB4MDFjMCwweDAzOTQsMHgwMzk3LDB4MDNhZCwweDAzYzMsMHgwM2MxLDB4MDNkMiwweDA3ZGEsMHgwN2Q5LDB4MDdkZiwweDA3ZWIsMHgwN2Y0LDB4MDdmYSwweDAxOTV9LAotICB7MHgwN2Y4LDB4MDNiZCwweDAzOWMsMHgwM2FiLDB4MDNhOCwweDAzYjMsMHgwM2I5LDB4MDNkMCwweDAzZTMsMHgwM2U1LDB4MDdlMiwweDA3ZGUsMHgwN2VkLDB4MDdmMSwweDA3ZjksMHgwN2ZjLDB4MDE5M30sCi0gIHsweDBmZmQsMHgwM2RjLDB4MDNiNiwweDAzYzcsMHgwM2NjLDB4MDNjYiwweDAzZDksMHgwM2RhLDB4MDdkMywweDA3ZTEsMHgwN2VlLDB4MDdlZiwweDA3ZjUsMHgwN2Y2LDB4MGZmYywweDBmZmYsMHgwMTlkfSwKLSAgezB4MDFjMiwweDAwYjUsMHgwMGExLDB4MDA5NiwweDAwOTcsMHgwMDk1LDB4MDA5OSwweDAwYTAsMHgwMGEyLDB4MDBhYywweDAwYTksMHgwMGIxLDB4MDBiMywweDAwYmIsMHgwMGMwLDB4MDE4ZiwweDAwMDR9Ci19OwotCi1jb25zdCBVV29yZDMyIGh1ZmZfY3RhYnNjZlsxMjFdPQotewotICAweDAwMDNmZmU4LAotICAweDAwMDNmZmU2LAotICAweDAwMDNmZmU3LAotICAweDAwMDNmZmU1LAotICAweDAwMDdmZmY1LAotICAweDAwMDdmZmYxLAotICAweDAwMDdmZmVkLAotICAweDAwMDdmZmY2LAotICAweDAwMDdmZmVlLAotICAweDAwMDdmZmVmLAotICAweDAwMDdmZmYwLAotICAweDAwMDdmZmZjLAotICAweDAwMDdmZmZkLAotICAweDAwMDdmZmZmLAotICAweDAwMDdmZmZlLAotICAweDAwMDdmZmY3LAotICAweDAwMDdmZmY4LAotICAweDAwMDdmZmZiLAotICAweDAwMDdmZmY5LAotICAweDAwMDNmZmU0LAotICAweDAwMDdmZmZhLAotICAweDAwMDNmZmUzLAotICAweDAwMDFmZmVmLAotICAweDAwMDFmZmYwLAotICAweDAwMDBmZmY1LAotICAweDAwMDFmZmVlLAotICAweDAwMDBmZmYyLAotICAweDAwMDBmZmYzLAotICAweDAwMDBmZmY0LAotICAweDAwMDBmZmYxLAotICAweDAwMDA3ZmY2LAotICAweDAwMDA3ZmY3LAotICAweDAwMDAzZmY5LAotICAweDAwMDAzZmY1LAotICAweDAwMDAzZmY3LAotICAweDAwMDAzZmYzLAotICAweDAwMDAzZmY2LAotICAweDAwMDAzZmYyLAotICAweDAwMDAxZmY3LAotICAweDAwMDAxZmY1LAotICAweDAwMDAwZmY5LAotICAweDAwMDAwZmY3LAotICAweDAwMDAwZmY2LAotICAweDAwMDAwN2Y5LAotICAweDAwMDAwZmY0LAotICAweDAwMDAwN2Y4LAotICAweDAwMDAwM2Y5LAotICAweDAwMDAwM2Y3LAotICAweDAwMDAwM2Y1LAotICAweDAwMDAwMWY4LAotICAweDAwMDAwMWY3LAotICAweDAwMDAwMGZhLAotICAweDAwMDAwMGY4LAotICAweDAwMDAwMGY2LAotICAweDAwMDAwMDc5LAotICAweDAwMDAwMDNhLAotICAweDAwMDAwMDM4LAotICAweDAwMDAwMDFhLAotICAweDAwMDAwMDBiLAotICAweDAwMDAwMDA0LAotICAweDAwMDAwMDAwLAotICAweDAwMDAwMDBhLAotICAweDAwMDAwMDBjLAotICAweDAwMDAwMDFiLAotICAweDAwMDAwMDM5LAotICAweDAwMDAwMDNiLAotICAweDAwMDAwMDc4LAotICAweDAwMDAwMDdhLAotICAweDAwMDAwMGY3LAotICAweDAwMDAwMGY5LAotICAweDAwMDAwMWY2LAotICAweDAwMDAwMWY5LAotICAweDAwMDAwM2Y0LAotICAweDAwMDAwM2Y2LAotICAweDAwMDAwM2Y4LAotICAweDAwMDAwN2Y1LAotICAweDAwMDAwN2Y0LAotICAweDAwMDAwN2Y2LAotICAweDAwMDAwN2Y3LAotICAweDAwMDAwZmY1LAotICAweDAwMDAwZmY4LAotICAweDAwMDAxZmY0LAotICAweDAwMDAxZmY2LAotICAweDAwMDAxZmY4LAotICAweDAwMDAzZmY4LAotICAweDAwMDAzZmY0LAotICAweDAwMDBmZmYwLAotICAweDAwMDA3ZmY0LAotICAweDAwMDBmZmY2LAotICAweDAwMDA3ZmY1LAotICAweDAwMDNmZmUyLAotICAweDAwMDdmZmQ5LAotICAweDAwMDdmZmRhLAotICAweDAwMDdmZmRiLAotICAweDAwMDdmZmRjLAotICAweDAwMDdmZmRkLAotICAweDAwMDdmZmRlLAotICAweDAwMDdmZmQ4LAotICAweDAwMDdmZmQyLAotICAweDAwMDdmZmQzLAotICAweDAwMDdmZmQ0LAotICAweDAwMDdmZmQ1LAotICAweDAwMDdmZmQ2LAotICAweDAwMDdmZmYyLAotICAweDAwMDdmZmRmLAotICAweDAwMDdmZmU3LAotICAweDAwMDdmZmU4LAotICAweDAwMDdmZmU5LAotICAweDAwMDdmZmVhLAotICAweDAwMDdmZmViLAotICAweDAwMDdmZmU2LAotICAweDAwMDdmZmUwLAotICAweDAwMDdmZmUxLAotICAweDAwMDdmZmUyLAotICAweDAwMDdmZmUzLAotICAweDAwMDdmZmU0LAotICAweDAwMDdmZmU1LAotICAweDAwMDdmZmQ3LAotICAweDAwMDdmZmVjLAotICAweDAwMDdmZmY0LAotICAweDAwMDdmZmYzCi19OwotCi1jb25zdCBXb3JkMzIgbV9sb2cyX3RhYmxlW0lOVF9CSVRTXSA9IHsKLSAgMHgwMDAwMDAwMCwweDRhZTAwZDAwLDB4MjkzNGYwODAsMHgxNWMwMWEzZiwKLSAgMHgwYjMxZmI4MCwweDA1YWViNGUwLDB4MDJkY2YyZDAsMHgwMTZmZTUwYywKLSAgMHgwMGI4NGUyMywweDAwNWMzZTEwLDB4MDAyZTI0Y2EsMHgwMDE3MTNkNiwKLSAgMHgwMDBiOGE0NywweDAwMDVjNTNiLDB4MDAwMmUyYTMsMHgwMDAxNzE1MywKLSAgMHgwMDAwYjhhYSwweDAwMDA1YzU1LDB4MDAwMDJlMmIsMHgwMDAwMTcxNSwKLSAgMHgwMDAwMGI4YiwweDAwMDAwNWM1LDB4MDAwMDAyZTMsMHgwMDAwMDE3MSwKLSAgMHgwMDAwMDBiOSwweDAwMDAwMDVjLDB4MDAwMDAwMmUsMHgwMDAwMDAxNywKLSAgMHgwMDAwMDAwYywweDAwMDAwMDA2LDB4MDAwMDAwMDMsMHgwMDAwMDAwMQotfTsKLQotCi0vKgotICAzIGJpdCByZXNvbHV0aW9uCi0qLwotY29uc3QgV29yZDMyIHRuc0NvZWZmM1s4XSA9Ci17Ci0gIDB4ODFmMWQxZDQsCi0gIDB4OTEyNjE0N2MsCi0gIDB4YWRiOTIyZjcsCi0gIDB4ZDQzOGFmMDksCi0gIDB4MDAwMDAwMDAsCi0gIDB4Mzc4OTgwODcsCi0gIDB4NjQxMzBkZmEsCi0gIDB4N2NjYTZmZmIsCi19OwotCi1jb25zdCBXb3JkMzIgdG5zQ29lZmYzQm9yZGVyc1s4XSA9Ci17Ci0gIDB4ODAwMDAwMDAsICAvKiAtNCAqLwotICAweDg3YjgyNmRlLCAgLyogLTMgKi8KLSAgMHg5ZGYyNDE1MywgIC8qIC0yICovCi0gIDB4YmZmZmZmZTUsICAvKiAtMSAqLwotICAweGU5YzVlNTc4LCAgLyogIDAgKi8KLSAgMHgxYzdiOTBmMCwgIC8qICAxICovCi0gIDB4NGZjZTgzYWEsICAvKiAgMiAqLwotICAweDczNTJmMmM0LCAgLyogIDMgKi8KLX07Ci0KLQotLyoKLSAgNCBiaXQgcmVzb2x1dGlvbgotKi8KLQotY29uc3QgV29yZDMyIHRuc0NvZWZmNFsxNl0gPQotewotICAweDgwOGJjODRiLAotICAweDg0ZTJlNTdkLAotICAweDhkNmI0OWZiLAotICAweDk5ZGE5MjA3LAotICAweGE5YzQ1NzA3LAotICAweGJjOWRkZTc4LAotICAweGQxYzJkNGZjLAotICAweGU4N2FlNTM5LAotICAweDAwMDAwMDAwLAotICAweDFhOWNkOWMwLAotICAweDM0MGZmMjNiLAotICAweDRiM2M4YmY3LAotICAweDVmMWY1ZTgwLAotICAweDZlZDllYjg0LAotICAweDc5YmMzODgwLAotICAweDdmNGM3ZTg5Ci19OwotCi1jb25zdCBXb3JkMzIgdG5zQ29lZmY0Qm9yZGVyc1sxNl09Ci17Ci0gIDB4ODAwMDAwMDAsICAvKiAtOCAqLwotICAweDgyMmRlZmVmLCAgLyogLTcgKi8KLSAgMHg4OGE0YmZlNSwgIC8qIC02ICovCi0gIDB4OTMyYzE1OWMsICAvKiAtNSAqLwotICAweGExNjgyN2MxLCAgLyogLTQgKi8KLSAgMHhiMmRjZGUyNiwgIC8qIC0zICovCi0gIDB4YzZmMjBiOTEsICAvKiAtMiAqLwotICAweGRjZjg5YzY0LCAgLyogLTEgKi8KLSAgMHhmNDMwOGNlMSwgIC8qICAwICovCi0gIDB4MGQ2MTMwNTQsICAvKiAgMSAqLwotICAweDI3OGRkZTgwLCAgLyogIDIgKi8KLSAgMHg0MDAwMDAxYiwgIC8qICAzICovCi0gIDB4NTVhNjEyN2MsICAvKiAgNCAqLwotICAweDY3OGRkZThmLCAgLyogIDUgKi8KLSAgMHg3NGVmMGVkOCwgIC8qICA2ICovCi0gIDB4N2QzM2YwZGIgICAvKiAgNyAqLwotfTsKLQotCi1jb25zdCB1bnNpZ25lZCBjaGFyIGJpdHJldlRhYlsxNyArIDEyOV0gPQotewotLyogNjQgKi8KLTB4MDEsIDB4MDgsIDB4MDIsIDB4MDQsIDB4MDMsIDB4MGMsIDB4MDUsIDB4MGEsIDB4MDcsIDB4MGUsIDB4MGIsIDB4MGQsIDB4MDAsIDB4MDYsIDB4MDksIDB4MGYsCi0weDAwLAotCi0vKiA1MTIgKi8KLTB4MDEsIDB4NDAsIDB4MDIsIDB4MjAsIDB4MDMsIDB4NjAsIDB4MDQsIDB4MTAsIDB4MDUsIDB4NTAsIDB4MDYsIDB4MzAsIDB4MDcsIDB4NzAsIDB4MDksIDB4NDgsCi0weDBhLCAweDI4LCAweDBiLCAweDY4LCAweDBjLCAweDE4LCAweDBkLCAweDU4LCAweDBlLCAweDM4LCAweDBmLCAweDc4LCAweDExLCAweDQ0LCAweDEyLCAweDI0LAotMHgxMywgMHg2NCwgMHgxNSwgMHg1NCwgMHgxNiwgMHgzNCwgMHgxNywgMHg3NCwgMHgxOSwgMHg0YywgMHgxYSwgMHgyYywgMHgxYiwgMHg2YywgMHgxZCwgMHg1YywKLTB4MWUsIDB4M2MsIDB4MWYsIDB4N2MsIDB4MjEsIDB4NDIsIDB4MjMsIDB4NjIsIDB4MjUsIDB4NTIsIDB4MjYsIDB4MzIsIDB4MjcsIDB4NzIsIDB4MjksIDB4NGEsCi0weDJiLCAweDZhLCAweDJkLCAweDVhLCAweDJlLCAweDNhLCAweDJmLCAweDdhLCAweDMxLCAweDQ2LCAweDMzLCAweDY2LCAweDM1LCAweDU2LCAweDM3LCAweDc2LAotMHgzOSwgMHg0ZSwgMHgzYiwgMHg2ZSwgMHgzZCwgMHg1ZSwgMHgzZiwgMHg3ZSwgMHg0MywgMHg2MSwgMHg0NSwgMHg1MSwgMHg0NywgMHg3MSwgMHg0YiwgMHg2OSwKLTB4NGQsIDB4NTksIDB4NGYsIDB4NzksIDB4NTMsIDB4NjUsIDB4NTcsIDB4NzUsIDB4NWIsIDB4NmQsIDB4NWYsIDB4N2QsIDB4NjcsIDB4NzMsIDB4NmYsIDB4N2IsCi0weDAwLCAweDA4LCAweDE0LCAweDFjLCAweDIyLCAweDJhLCAweDM2LCAweDNlLCAweDQxLCAweDQ5LCAweDU1LCAweDVkLCAweDYzLCAweDZiLCAweDc3LCAweDdmLAotMHgwMCwKLX07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNlbmMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY2VuYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjE3Nzg3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY2VuYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTA1ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJYWFjZW5jLmMKLQotCUNvbnRlbnQ6CWFhYyBlbmNvZGVyIGludGVyZmFjZSBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInZvQUFDLmgiCi0jaW5jbHVkZSAidHlwZWRlZi5oIgotI2luY2x1ZGUgImFhY2VuY19jb3JlLmgiCi0jaW5jbHVkZSAiYWFjX3JvbS5oIgotI2luY2x1ZGUgImNtbk1lbW9yeS5oIgotI2luY2x1ZGUgIm1lbWFsaWduLmgiCi0KLSNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQotCi0vKioKLSogSW5pdCB0aGUgYXVkaW8gY29kZWMgbW9kdWxlIGFuZCByZXR1cm4gY29kZWMgaGFuZGxlCi0qIFxwYXJhbSBwaENvZGVjIFtPVVRdIFJldHVybiB0aGUgdmlkZW8gY29kZWMgaGFuZGxlCi0qIFxwYXJhbSB2VHlwZQlbSU5dIFRoZSBjb2RlYyB0eXBlIGlmIHRoZSBtb2R1bGUgc3VwcG9ydCBtdWx0aSBjb2RlYy4KLSogXHBhcmFtIHBVc2VyRGF0YQlbSU5dIFRoZSBpbml0IHBhcmFtLiBJdCBpcyBtZW1vcnkgb3BlcmF0b3Igb3IgYWxsb2NlZCBtZW1vcnkKLSogXHJldHZhbCBWT19FUlJfTk9ORSBTdWNjZWVkZWQuCi0qLwotVk9fVTMyIFZPX0FQSSB2b0FBQ0VuY0luaXQoVk9fSEFORExFICogcGhDb2RlYyxWT19BVURJT19DT0RJTkdUWVBFIHZUeXBlLCBWT19DT0RFQ19JTklUX1VTRVJEQVRBICpwVXNlckRhdGEpCi17Ci0JQUFDX0VOQ09ERVIqaEFhY0VuYzsKLQlpbnQgZXJyb3I7Ci0KLSNpZmRlZiBVU0VfREVBVUxUX01FTQotCVZPX01FTV9PUEVSQVRPUiB2b01lbW9wcmF0b3I7Ci0jZW5kaWYKLQlWT19NRU1fT1BFUkFUT1IgKnBNZW1PUDsKLQotI2lmZGVmIFVTRV9ERUFVTFRfTUVNCi0JaW50IGludGVyTWVtOwotICAgICAgICBpbnRlck1lbSA9IDA7Ci0jZW5kaWYKLQotICAgICAgICBVTlVTRUQodlR5cGUpOwotCi0JZXJyb3IgPSAwOwotCi0JLyogaW5pdCB0aGUgbWVtb3J5IG9wZXJhdG9yICovCi0JaWYocFVzZXJEYXRhID09IE5VTEwgfHwgcFVzZXJEYXRhLT5tZW1mbGFnICE9IFZPX0lNRl9VU0VSTUVNT1BFUkFUT1IgfHwgcFVzZXJEYXRhLT5tZW1EYXRhID09IE5VTEwgKQotCXsKLSNpZmRlZiBVU0VfREVBVUxUX01FTQotCQl2b01lbW9wcmF0b3IuQWxsb2MgPSBjbW5NZW1BbGxvYzsKLQkJdm9NZW1vcHJhdG9yLkNvcHkgPSBjbW5NZW1Db3B5OwotCQl2b01lbW9wcmF0b3IuRnJlZSA9IGNtbk1lbUZyZWU7Ci0JCXZvTWVtb3ByYXRvci5TZXQgPSBjbW5NZW1TZXQ7Ci0JCXZvTWVtb3ByYXRvci5DaGVjayA9IGNtbk1lbUNoZWNrOwotCi0JCWludGVyTWVtID0gMTsKLQotCQlwTWVtT1AgPSAmdm9NZW1vcHJhdG9yOwotI2Vsc2UKLQkJKnBoQ29kZWMgPSBOVUxMOwotCQlyZXR1cm4gVk9fRVJSX0lOVkFMSURfQVJHOwotI2VuZGlmCi0JfQotCWVsc2UKLQl7Ci0JCXBNZW1PUCA9IChWT19NRU1fT1BFUkFUT1IgKilwVXNlckRhdGEtPm1lbURhdGE7Ci0JfQotCi0JLyogaW5pdCB0aGUgYWFjIGVuY29kZXIgaGFuZGxlICovCi0JaEFhY0VuYyA9IChBQUNfRU5DT0RFUiopbWVtX21hbGxvYyhwTWVtT1AsIHNpemVvZihBQUNfRU5DT0RFUiksIDMyLCBWT19JTkRFWF9FTkNfQUFDKTsKLQlpZihOVUxMID09IGhBYWNFbmMpCi0JewotCQllcnJvciA9IDE7Ci0JfQotCi0JaWYoIWVycm9yKQotCXsKLQkJLyogaW5pdCB0aGUgYWFjIGVuY29kZXIgaW50cmEgbWVtb3J5ICovCi0JCWhBYWNFbmMtPmludGJ1ZiA9IChzaG9ydCAqKW1lbV9tYWxsb2MocE1lbU9QLCBBQUNFTkNfQkxPQ0tTSVpFKk1BWF9DSEFOTkVMUypzaXplb2Yoc2hvcnQpLCAzMiwgVk9fSU5ERVhfRU5DX0FBQyk7Ci0JCWlmKE5VTEwgPT0gaEFhY0VuYy0+aW50YnVmKQotCQl7Ci0JCQllcnJvciA9IDE7Ci0JCX0KLQl9Ci0KLQlpZiAoIWVycm9yKSB7Ci0JCS8qIGluaXQgdGhlIGFhYyBlbmNvZGVyIHBzeWNob2Fjb3VzdGljICovCi0JCWVycm9yID0gKFBzeU5ldygmaEFhY0VuYy0+cHN5S2VybmVsLCBNQVhfQ0hBTk5FTFMsIHBNZW1PUCkgfHwKLQkJCVBzeU91dE5ldygmaEFhY0VuYy0+cHN5T3V0LCBwTWVtT1ApKTsKLQl9Ci0KLQlpZiAoIWVycm9yKSB7Ci0JCS8qIGluaXQgdGhlIGFhYyBlbmNvZGVyIHF1YW50aXphdGlvbiBlbGVtZW50cyAqLwotCQllcnJvciA9IFFDT3V0TmV3KCZoQWFjRW5jLT5xY091dCxNQVhfQ0hBTk5FTFMsIHBNZW1PUCk7Ci0JfQotCi0JaWYgKCFlcnJvcikgewotCQkvKiBpbml0IHRoZSBhYWMgZW5jb2RlciBxdWFudGl6YXRpb24gc3RhdGUgKi8KLQkJZXJyb3IgPSBRQ05ldygmaEFhY0VuYy0+cWNLZXJuZWwsIHBNZW1PUCk7Ci0JfQotCi0JLyogdW5pbml0IHRoZSBhYWMgZW5jb2RlciBpZiBlcnJvciBpcyBub3plcm8gKi8KLQlpZihlcnJvcikKLQl7Ci0JCUFhY0VuY0Nsb3NlKGhBYWNFbmMsIHBNZW1PUCk7Ci0JCWlmKGhBYWNFbmMpCi0JCXsKLQkJCW1lbV9mcmVlKHBNZW1PUCwgaEFhY0VuYywgVk9fSU5ERVhfRU5DX0FBQyk7Ci0JCQloQWFjRW5jID0gTlVMTDsKLQkJfQotCQkqcGhDb2RlYyA9IE5VTEw7Ci0JCXJldHVybiBWT19FUlJfT1VUT0ZfTUVNT1JZOwotCX0KLQotCS8qIGluaXQgdGhlIGFhYyBlbmNvZGVyIG1lbW9yeSBvcGVyYXRvciAgKi8KLSNpZmRlZiBVU0VfREVBVUxUX01FTQotCWlmKGludGVyTWVtKQotCXsKLQkJaEFhY0VuYy0+dm9NZW1vcHJhdG9yLkFsbG9jID0gY21uTWVtQWxsb2M7Ci0JCWhBYWNFbmMtPnZvTWVtb3ByYXRvci5Db3B5ID0gY21uTWVtQ29weTsKLQkJaEFhY0VuYy0+dm9NZW1vcHJhdG9yLkZyZWUgPSBjbW5NZW1GcmVlOwotCQloQWFjRW5jLT52b01lbW9wcmF0b3IuU2V0ID0gY21uTWVtU2V0OwotCQloQWFjRW5jLT52b01lbW9wcmF0b3IuQ2hlY2sgPSBjbW5NZW1DaGVjazsKLQotCQlwTWVtT1AgPSAmaEFhY0VuYy0+dm9NZW1vcHJhdG9yOwotCX0KLSNlbmRpZgotCS8qIGluaXQgdGhlIGFhYyBlbmNvZGVyIGRlZmF1bHQgcGFyYW1ldGVyICAqLwotCWlmKGhBYWNFbmMtPmluaXRPSyA9PSAwKQotCXsKLQkJIEFBQ0VOQ19DT05GSUcgY29uZmlnOwotCQkgY29uZmlnLmFkdHNVc2VkID0gMTsKLQkJIGNvbmZpZy5iaXRSYXRlID0gMTI4MDAwOwotCQkgY29uZmlnLm5DaGFubmVsc0luID0gMjsKLQkJIGNvbmZpZy5uQ2hhbm5lbHNPdXQgPSAyOwotCQkgY29uZmlnLnNhbXBsZVJhdGUgPSA0NDEwMDsKLQkJIGNvbmZpZy5iYW5kV2lkdGggPSAyMDAwMDsKLQotCQkgQWFjRW5jT3BlbihoQWFjRW5jLCBjb25maWcpOwotCX0KLQotCWhBYWNFbmMtPnZvTWVtb3AgPSBwTWVtT1A7Ci0KLQkqcGhDb2RlYyA9IGhBYWNFbmM7Ci0KLQlyZXR1cm4gVk9fRVJSX05PTkU7Ci19Ci0KLS8qKgotKiBTZXQgaW5wdXQgYXVkaW8gZGF0YS4KLSogXHBhcmFtIGhDb2RlYyBbSU5dXSBUaGUgQ29kZWMgSGFuZGxlIHdoaWNoIHdhcyBjcmVhdGVkIGJ5IEluaXQgZnVuY3Rpb24uCi0qIFxwYXJhbSBwSW5wdXQgW0lOXSBUaGUgaW5wdXQgYnVmZmVyIHBhcmFtLgotKiBccGFyYW0gcE91dEJ1ZmZlciBbT1VUXSBUaGUgb3V0cHV0IGJ1ZmZlciBpbmZvLgotKiBccmV0dmFsIFZPX0VSUl9OT05FIFN1Y2NlZWRlZC4KLSovCi1WT19VMzIgVk9fQVBJIHZvQUFDRW5jU2V0SW5wdXREYXRhKFZPX0hBTkRMRSBoQ29kZWMsIFZPX0NPREVDQlVGRkVSICogcElucHV0KQotewotCUFBQ19FTkNPREVSICpoQWFjRW5jOwotCWludCAgbGVuZ3RoOwotCi0JaWYoTlVMTCA9PSBoQ29kZWMgfHwgTlVMTCA9PSBwSW5wdXQgfHwgTlVMTCA9PSBwSW5wdXQtPkJ1ZmZlcikKLQl7Ci0JCXJldHVybiBWT19FUlJfSU5WQUxJRF9BUkc7Ci0JfQotCi0JaEFhY0VuYyA9IChBQUNfRU5DT0RFUiAqKWhDb2RlYzsKLQotCS8qIGluaXQgaW5wdXQgcGNtIGJ1ZmZlciBhbmQgbGVuZ3RoKi8KLQloQWFjRW5jLT5pbmJ1ZiA9IChzaG9ydCAqKXBJbnB1dC0+QnVmZmVyOwotCWhBYWNFbmMtPmlubGVuID0gcElucHV0LT5MZW5ndGggLyBzaXplb2Yoc2hvcnQpOwotCWhBYWNFbmMtPnVzZWxlbmd0aCA9IDA7Ci0KLQloQWFjRW5jLT5lbmNidWYgPSBoQWFjRW5jLT5pbmJ1ZjsKLQloQWFjRW5jLT5lbmNsZW4gPSBoQWFjRW5jLT5pbmxlbjsKLQotCS8qIHJlYnVpbGQgaW50cmEgcGNtIGJ1ZmZlciBhbmQgbGVuZ3RoKi8KLQlpZihoQWFjRW5jLT5pbnRsZW4pCi0JewotCQlsZW5ndGggPSBtaW4oaEFhY0VuYy0+Y29uZmlnLm5DaGFubmVsc0luKkFBQ0VOQ19CTE9DS1NJWkUgLSBoQWFjRW5jLT5pbnRsZW4sIGhBYWNFbmMtPmlubGVuKTsKLQkJaEFhY0VuYy0+dm9NZW1vcC0+Q29weShWT19JTkRFWF9FTkNfQUFDLCBoQWFjRW5jLT5pbnRidWYgKyBoQWFjRW5jLT5pbnRsZW4sCi0JCQloQWFjRW5jLT5pbmJ1ZiwgbGVuZ3RoKnNpemVvZihzaG9ydCkpOwotCi0JCWhBYWNFbmMtPmVuY2J1ZiA9IGhBYWNFbmMtPmludGJ1ZjsKLQkJaEFhY0VuYy0+ZW5jbGVuID0gaEFhY0VuYy0+aW50bGVuICsgbGVuZ3RoOwotCi0JCWhBYWNFbmMtPmluYnVmICs9IGxlbmd0aDsKLQkJaEFhY0VuYy0+aW5sZW4gLT0gbGVuZ3RoOwotCX0KLQotCXJldHVybiBWT19FUlJfTk9ORTsKLX0KLQotLyoqCi0qIEdldCB0aGUgb3V0dXQgYXVkaW8gZGF0YQotKiBccGFyYW0gaENvZGVjIFtJTl1dIFRoZSBDb2RlYyBIYW5kbGUgd2hpY2ggd2FzIGNyZWF0ZWQgYnkgSW5pdCBmdW5jdGlvbi4KLSogXHBhcmFtIHBPdXRCdWZmZXIgW09VVF0gVGhlIG91dHB1dCBhdWRpbyBkYXRhCi0qIFxwYXJhbSBwT3V0SW5mbyBbT1VUXSBUaGUgZGVjIG1vZHVsZSBmaWxsZWQgYXVkaW8gZm9ybWF0IGFuZCB1c2VkIHRoZSBpbnB1dCBzaXplLgotKgkJCQkJCSBwT3V0SW5mby0+SW5wdXRVc2VkIGlzIHRvdGFsIHVzZWQgdGhlIGlucHV0IHNpemUuCi0qIFxyZXR2YWwgIFZPX0VSUl9OT05FIFN1Y2NlZWRlZC4KLSoJCQlWT19FUlJfSU5QVVRfQlVGRkVSX1NNQUxMLiBUaGUgaW5wdXQgd2FzIGZpbmlzaGVkIG9yIHRoZSBpbnB1dCBkYXRhIHdhcyBub3QgZW5vdWdodC4KLSovCi1WT19VMzIgVk9fQVBJIHZvQUFDRW5jR2V0T3V0cHV0RGF0YShWT19IQU5ETEUgaENvZGVjLCBWT19DT0RFQ0JVRkZFUiAqIHBPdXRwdXQsIFZPX0FVRElPX09VVFBVVElORk8gKiBwT3V0SW5mbykKLXsKLQlBQUNfRU5DT0RFUiogaEFhY0VuYyA9IChBQUNfRU5DT0RFUiopaENvZGVjOwotCVdvcmQxNiBudW1BbmNEYXRhQnl0ZXM9MDsKLQlXb3JkMzIgIGluYnVmbGVuOwotCWludCBsZW5ndGg7Ci0JaWYoTlVMTCA9PSBoQWFjRW5jKQotCQlyZXR1cm4gVk9fRVJSX0lOVkFMSURfQVJHOwotCi0JIGluYnVmbGVuID0gQUFDRU5DX0JMT0NLU0laRSpoQWFjRW5jLT5jb25maWcubkNoYW5uZWxzSW47Ci0KLQkgLyogY2hlY2sgdGhlIGlucHV0IHBjbSBidWZmZXIgYW5kIGxlbmd0aCovCi0JIGlmKE5VTEwgPT0gaEFhY0VuYy0+ZW5jYnVmIHx8IGhBYWNFbmMtPmVuY2xlbiA8IGluYnVmbGVuKQotCSB7Ci0JCWxlbmd0aCA9IGhBYWNFbmMtPmVuY2xlbjsKLQkJaWYoaEFhY0VuYy0+aW50bGVuID09IDApCi0JCXsKLQkJCWhBYWNFbmMtPnZvTWVtb3AtPkNvcHkoVk9fSU5ERVhfRU5DX0FBQywgaEFhY0VuYy0+aW50YnVmLAotCQkJCWhBYWNFbmMtPmVuY2J1ZiwgbGVuZ3RoKnNpemVvZihzaG9ydCkpOwotCQkJaEFhY0VuYy0+dXNlbGVuZ3RoICs9IGxlbmd0aCpzaXplb2Yoc2hvcnQpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaEFhY0VuYy0+dXNlbGVuZ3RoICs9IChsZW5ndGggLSBoQWFjRW5jLT5pbnRsZW4pKnNpemVvZihzaG9ydCk7Ci0JCX0KLQotCQloQWFjRW5jLT5pbnRsZW4gPSBsZW5ndGg7Ci0KLQkJcE91dHB1dC0+TGVuZ3RoID0gMDsKLQkJaWYocE91dEluZm8pCi0JCQlwT3V0SW5mby0+SW5wdXRVc2VkID0gaEFhY0VuYy0+dXNlbGVuZ3RoOwotCQlyZXR1cm4gVk9fRVJSX0lOUFVUX0JVRkZFUl9TTUFMTDsKLQkgfQotCi0JIC8qIGNoZWNrIHRoZSBvdXRwdXQgYWFjIGJ1ZmZlciBhbmQgbGVuZ3RoKi8KLQkgaWYoTlVMTCA9PSBwT3V0cHV0IHx8IE5VTEwgPT0gcE91dHB1dC0+QnVmZmVyIHx8IHBPdXRwdXQtPkxlbmd0aCA8ICg2MTQ0LzgpKmhBYWNFbmMtPmNvbmZpZy5uQ2hhbm5lbHNPdXQvKHNpemVvZihXb3JkMzIpKSkKLQkJIHJldHVybiBWT19FUlJfT1VUUFVUX0JVRkZFUl9TTUFMTDsKLQotCSAvKiBhYWMgZW5jb2RlciBjb3JlIGZ1bmN0aW9uICovCi0JIEFhY0VuY0VuY29kZSggaEFhY0VuYywKLQkJCShXb3JkMTYqKWhBYWNFbmMtPmVuY2J1ZiwKLQkJCU5VTEwsCi0JCQkmbnVtQW5jRGF0YUJ5dGVzLAotCQkJcE91dHB1dC0+QnVmZmVyLAotCQkJJnBPdXRwdXQtPkxlbmd0aCk7Ci0KLQkgLyogdXBkYXRlIHRoZSBpbnB1dCBwY20gYnVmZmVyIGFuZCBsZW5ndGgqLwotCSBpZihoQWFjRW5jLT5pbnRsZW4pCi0JIHsKLQkJbGVuZ3RoID0gaW5idWZsZW4gLSBoQWFjRW5jLT5pbnRsZW47Ci0JCWhBYWNFbmMtPmVuY2J1ZiA9IGhBYWNFbmMtPmluYnVmOwotCQloQWFjRW5jLT5lbmNsZW4gPSBoQWFjRW5jLT5pbmxlbjsKLQkJaEFhY0VuYy0+dXNlbGVuZ3RoICs9IGxlbmd0aCpzaXplb2Yoc2hvcnQpOwotCQloQWFjRW5jLT5pbnRsZW4gPSAwOwotCSB9Ci0JIGVsc2UKLQkgewotCQkgaEFhY0VuYy0+ZW5jYnVmID0gaEFhY0VuYy0+ZW5jYnVmICsgaW5idWZsZW47Ci0JCSBoQWFjRW5jLT5lbmNsZW4gPSBoQWFjRW5jLT5lbmNsZW4gLSBpbmJ1ZmxlbjsKLQkJIGhBYWNFbmMtPnVzZWxlbmd0aCArPSBpbmJ1ZmxlbipzaXplb2Yoc2hvcnQpOwotCSB9Ci0KLQkgLyogdXBkYXRlIHRoZSBvdXRwdXQgYWFjIGluZm9ybWF0aW9uICovCi0JaWYocE91dEluZm8pCi0JewotCQlwT3V0SW5mby0+Rm9ybWF0LkNoYW5uZWxzID0gaEFhY0VuYy0+Y29uZmlnLm5DaGFubmVsc091dDsKLQkJcE91dEluZm8tPkZvcm1hdC5TYW1wbGVSYXRlID0gaEFhY0VuYy0+Y29uZmlnLnNhbXBsZVJhdGU7Ci0JCXBPdXRJbmZvLT5Gb3JtYXQuU2FtcGxlQml0cyA9IDE2OwotCQlwT3V0SW5mby0+SW5wdXRVc2VkID0gaEFhY0VuYy0+dXNlbGVuZ3RoOwotCX0KLQotCSByZXR1cm4gVk9fRVJSX05PTkU7Ci19Ci0KLS8qKgotKiBVbmluaXQgdGhlIENvZGVjLgotKiBccGFyYW0gaENvZGVjIFtJTl1dIFRoZSBDb2RlYyBIYW5kbGUgd2hpY2ggd2FzIGNyZWF0ZWQgYnkgSW5pdCBmdW5jdGlvbi4KLSogXHJldHZhbCBWT19FUlJfTk9ORSBTdWNjZWVkZWQuCi0qLwotVk9fVTMyIFZPX0FQSSB2b0FBQ0VuY1VuaW5pdChWT19IQU5ETEUgaENvZGVjKQotewotCUFBQ19FTkNPREVSKiBoQWFjRW5jID0gKEFBQ19FTkNPREVSKiloQ29kZWM7Ci0KLQlpZihOVUxMICE9IGhBYWNFbmMpCi0JewotCQkvKiBjbG9zZSB0aGUgYWFjIGVuY29kZXIgKi8KLQkJQWFjRW5jQ2xvc2UoaEFhY0VuYywgaEFhY0VuYy0+dm9NZW1vcCk7Ci0KLQkJLyogZnJlZSB0aGUgYWFjIGVuY29kZXIgaGFuZGxlKi8KLQkJbWVtX2ZyZWUoaEFhY0VuYy0+dm9NZW1vcCwgaEFhY0VuYywgVk9fSU5ERVhfRU5DX0FBQyk7Ci0JCWhBYWNFbmMgPSBOVUxMOwotCX0KLQotCXJldHVybiBWT19FUlJfTk9ORTsKLX0KLQotLyoqCi0qIFNldCB0aGUgcGFyYW0gZm9yIHNwZWNpYWwgdGFyZ2V0LgotKiBccGFyYW0gaENvZGVjIFtJTl1dIFRoZSBDb2RlYyBIYW5kbGUgd2hpY2ggd2FzIGNyZWF0ZWQgYnkgSW5pdCBmdW5jdGlvbi4KLSogXHBhcmFtIHVQYXJhbUlEIFtJTl0gVGhlIHBhcmFtIElELgotKiBccGFyYW0gcERhdGEgW0lOXSBUaGUgcGFyYW0gdmFsdWUgZGVwZW5kIG9uIHRoZSBJRD4KLSogXHJldHZhbCBWT19FUlJfTk9ORSBTdWNjZWVkZWQuCi0qLwotVk9fVTMyIFZPX0FQSSB2b0FBQ0VuY1NldFBhcmFtKFZPX0hBTkRMRSBoQ29kZWMsIFZPX1MzMiB1UGFyYW1JRCwgVk9fUFRSIHBEYXRhKQotewotCUFBQ0VOQ19DT05GSUcgY29uZmlnOwotCUFBQ0VOQ19QQVJBTSogcEFBQ19wYXJhbTsKLQlWT19BVURJT19GT1JNQVQgKnBXQVZfRm9ybWF0OwotCUFBQ19FTkNPREVSKiBoQWFjRW5jID0gKEFBQ19FTkNPREVSKiloQ29kZWM7Ci0JaW50IHJldCwgaSwgYml0cmF0ZSwgdG1wOwotCWludCBTYW1wbGVSYXRlSWR4OwotCi0JaWYoTlVMTCA9PSBoQWFjRW5jKQotCQlyZXR1cm4gVk9fRVJSX0lOVkFMSURfQVJHOwotCi0Jc3dpdGNoKHVQYXJhbUlEKQotCXsKLQljYXNlIFZPX1BJRF9BQUNfRU5DUEFSQU06ICAvKiBpbml0IGFhYyBlbmNvZGVyIHBhcmFtZXRlciovCi0JCUFhY0luaXREZWZhdWx0Q29uZmlnKCZjb25maWcpOwotCQlpZihwRGF0YSA9PSBOVUxMKQotCQkJcmV0dXJuIFZPX0VSUl9JTlZBTElEX0FSRzsKLQkJcEFBQ19wYXJhbSA9IChBQUNFTkNfUEFSQU0qKXBEYXRhOwotCQljb25maWcuYWR0c1VzZWQgPSBwQUFDX3BhcmFtLT5hZHRzVXNlZDsKLQkJY29uZmlnLmJpdFJhdGUgPSBwQUFDX3BhcmFtLT5iaXRSYXRlOwotCQljb25maWcubkNoYW5uZWxzSW4gPSBwQUFDX3BhcmFtLT5uQ2hhbm5lbHM7Ci0JCWNvbmZpZy5uQ2hhbm5lbHNPdXQgPSBwQUFDX3BhcmFtLT5uQ2hhbm5lbHM7Ci0JCWNvbmZpZy5zYW1wbGVSYXRlID0gcEFBQ19wYXJhbS0+c2FtcGxlUmF0ZTsKLQotCQkvKiBjaGVjayB0aGUgY2hhbm5lbCAqLwotCQlpZihjb25maWcubkNoYW5uZWxzSW48IDEgIHx8IGNvbmZpZy5uQ2hhbm5lbHNJbiA+IE1BWF9DSEFOTkVMUyAgfHwKLSAgICAgICAgICAgICBjb25maWcubkNoYW5uZWxzT3V0IDwgMSB8fCBjb25maWcubkNoYW5uZWxzT3V0ID4gTUFYX0NIQU5ORUxTIHx8IGNvbmZpZy5uQ2hhbm5lbHNJbiA8IGNvbmZpZy5uQ2hhbm5lbHNPdXQpCi0JCQkgcmV0dXJuIFZPX0VSUl9BVURJT19VTlNDSEFOTkVMOwotCi0JCS8qIGNoZWNrIHRoZSBzYW1wbGVyYXRlICovCi0JCXJldCA9IC0xOwotCQlmb3IoaSA9IDA7IGkgPCBOVU1fU0FNUExFX1JBVEVTOyBpKyspCi0JCXsKLQkJCWlmKGNvbmZpZy5zYW1wbGVSYXRlID09IHNhbXBSYXRlVGFiW2ldKQotCQkJewotCQkJCXJldCA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYocmV0IDwgMCkKLQkJCXJldHVybiBWT19FUlJfQVVESU9fVU5TU0FNUExFUkFURTsKLQotCQlTYW1wbGVSYXRlSWR4ID0gaTsKLQotCQl0bXAgPSA0NDE7Ci0JCWlmKGNvbmZpZy5zYW1wbGVSYXRlJTgwMDAgPT0gMCkKLQkJCXRtcCA9NDgwOwotCQkvKiBjaGVjayB0aGUgYml0cmF0ZSAqLwotCQlpZihjb25maWcuYml0UmF0ZSE9MCAmJiAoKGNvbmZpZy5iaXRSYXRlL2NvbmZpZy5uQ2hhbm5lbHNPdXQgPCA0MDAwKSB8fAotICAgICAgICAgICAoY29uZmlnLmJpdFJhdGUvY29uZmlnLm5DaGFubmVsc091dCA+IDE2MDAwMCkgfHwKLQkJICAgKGNvbmZpZy5iaXRSYXRlID4gY29uZmlnLnNhbXBsZVJhdGUqNipjb25maWcubkNoYW5uZWxzT3V0KSkpCi0JCXsKLQkJCWNvbmZpZy5iaXRSYXRlID0gNjQwKmNvbmZpZy5zYW1wbGVSYXRlL3RtcCpjb25maWcubkNoYW5uZWxzT3V0OwotCi0JCQlpZihjb25maWcuYml0UmF0ZS9jb25maWcubkNoYW5uZWxzT3V0IDwgNDAwMCkKLQkJCQljb25maWcuYml0UmF0ZSA9IDQwMDAgKiBjb25maWcubkNoYW5uZWxzT3V0OwotCQkJZWxzZSBpZihjb25maWcuYml0UmF0ZSA+IGNvbmZpZy5zYW1wbGVSYXRlKjYqY29uZmlnLm5DaGFubmVsc091dCkKLQkJCQljb25maWcuYml0UmF0ZSA9IGNvbmZpZy5zYW1wbGVSYXRlKjYqY29uZmlnLm5DaGFubmVsc091dDsKLQkJCWVsc2UgaWYoY29uZmlnLmJpdFJhdGUvY29uZmlnLm5DaGFubmVsc091dCA+IDE2MDAwMCkKLQkJCQljb25maWcuYml0UmF0ZSA9IGNvbmZpZy5uQ2hhbm5lbHNPdXQqMTYwMDAwOwotCQl9Ci0KLQkJLyogY2hlY2sgdGhlIGJhbmR3aWR0aCAqLwotCQliaXRyYXRlID0gY29uZmlnLmJpdFJhdGUgLyBjb25maWcubkNoYW5uZWxzT3V0OwotCQliaXRyYXRlID0gYml0cmF0ZSAqIHRtcCAvIGNvbmZpZy5zYW1wbGVSYXRlOwotCi0JCWZvciAoaSA9IDA7IHJhdGVzW2ldOyBpKyspCi0JCXsKLQkJCWlmIChyYXRlc1tpXSA+PSBiaXRyYXRlKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJY29uZmlnLmJhbmRXaWR0aCA9IEJhbmR3aXRoQ29lZlRhYltpXVtTYW1wbGVSYXRlSWR4XTsKLQotCQkvKiBpbml0IGFhYyBlbmNvZGVyIGNvcmUgKi8KLQkJcmV0ID0gQWFjRW5jT3BlbihoQWFjRW5jLCBjb25maWcpOwotCQlpZihyZXQpCi0JCQlyZXR1cm4gVk9fRVJSX0FVRElPX1VOU0ZFQVRVUkU7Ci0JCWJyZWFrOwotCWNhc2UgVk9fUElEX0FVRElPX0ZPUk1BVDoJLyogaW5pdCBwY20gY2hhbm5lbCBhbmQgc2FtcGxlcmF0ZSovCi0JCUFhY0luaXREZWZhdWx0Q29uZmlnKCZjb25maWcpOwotCQlpZihwRGF0YSA9PSBOVUxMKQotCQkJcmV0dXJuIFZPX0VSUl9JTlZBTElEX0FSRzsKLQkJcFdBVl9Gb3JtYXQgPSAoVk9fQVVESU9fRk9STUFUKilwRGF0YTsKLQkJY29uZmlnLmFkdHNVc2VkID0gMTsKLQkJY29uZmlnLm5DaGFubmVsc0luID0gcFdBVl9Gb3JtYXQtPkNoYW5uZWxzOwotCQljb25maWcubkNoYW5uZWxzT3V0ID0gcFdBVl9Gb3JtYXQtPkNoYW5uZWxzOwotCQljb25maWcuc2FtcGxlUmF0ZSA9IHBXQVZfRm9ybWF0LT5TYW1wbGVSYXRlOwotCi0JCS8qIGNoZWNrIHRoZSBjaGFubmVsICovCi0JCWlmKGNvbmZpZy5uQ2hhbm5lbHNJbjwgMSAgfHwgY29uZmlnLm5DaGFubmVsc0luID4gTUFYX0NIQU5ORUxTICB8fAotICAgICAgICAgICAgIGNvbmZpZy5uQ2hhbm5lbHNPdXQgPCAxIHx8IGNvbmZpZy5uQ2hhbm5lbHNPdXQgPiBNQVhfQ0hBTk5FTFMgfHwgY29uZmlnLm5DaGFubmVsc0luIDwgY29uZmlnLm5DaGFubmVsc091dCkKLQkJCSByZXR1cm4gVk9fRVJSX0FVRElPX1VOU0NIQU5ORUw7Ci0KLQkJLyogY2hlY2sgdGhlIHNhbXBsZWJpdHMgKi8KLQkJaWYocFdBVl9Gb3JtYXQtPlNhbXBsZUJpdHMgIT0gMTYpCi0JCXsKLQkJCXJldHVybiBWT19FUlJfQVVESU9fVU5TRkVBVFVSRTsKLQkJfQotCi0JCS8qIGNoZWNrIHRoZSBzYW1wbGVyYXRlICovCi0JCXJldCA9IC0xOwotCQlmb3IoaSA9IDA7IGkgPCBOVU1fU0FNUExFX1JBVEVTOyBpKyspCi0JCXsKLQkJCWlmKGNvbmZpZy5zYW1wbGVSYXRlID09IHNhbXBSYXRlVGFiW2ldKQotCQkJewotCQkJCXJldCA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYocmV0IDwgMCkKLQkJCXJldHVybiBWT19FUlJfQVVESU9fVU5TU0FNUExFUkFURTsKLQotCQlTYW1wbGVSYXRlSWR4ID0gaTsKLQotCQkvKiB1cGRhdGUgdGhlIGJpdHJhdGVzICovCi0JCXRtcCA9IDQ0MTsKLQkJaWYoY29uZmlnLnNhbXBsZVJhdGUlODAwMCA9PSAwKQotCQkJdG1wID00ODA7Ci0KLQkJY29uZmlnLmJpdFJhdGUgPSA2NDAqY29uZmlnLnNhbXBsZVJhdGUvdG1wKmNvbmZpZy5uQ2hhbm5lbHNPdXQ7Ci0KLQkJaWYoY29uZmlnLmJpdFJhdGUvY29uZmlnLm5DaGFubmVsc091dCA8IDQwMDApCi0JCQljb25maWcuYml0UmF0ZSA9IDQwMDAgKiBjb25maWcubkNoYW5uZWxzT3V0OwotCQllbHNlIGlmKGNvbmZpZy5iaXRSYXRlID4gY29uZmlnLnNhbXBsZVJhdGUqNipjb25maWcubkNoYW5uZWxzT3V0KQotCQkJY29uZmlnLmJpdFJhdGUgPSBjb25maWcuc2FtcGxlUmF0ZSo2KmNvbmZpZy5uQ2hhbm5lbHNPdXQ7Ci0JCWVsc2UgaWYoY29uZmlnLmJpdFJhdGUvY29uZmlnLm5DaGFubmVsc091dCA+IDE2MDAwMCkKLQkJCWNvbmZpZy5iaXRSYXRlID0gY29uZmlnLm5DaGFubmVsc091dCoxNjAwMDA7Ci0KLQkJLyogY2hlY2sgdGhlIGJhbmR3aWR0aCAqLwotCQliaXRyYXRlID0gY29uZmlnLmJpdFJhdGUgLyBjb25maWcubkNoYW5uZWxzT3V0OwotCQliaXRyYXRlID0gYml0cmF0ZSAqIHRtcCAvIGNvbmZpZy5zYW1wbGVSYXRlOwotCi0JCWZvciAoaSA9IDA7IHJhdGVzW2ldOyBpKyspCi0JCXsKLQkJCWlmIChyYXRlc1tpXSA+PSBiaXRyYXRlKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJY29uZmlnLmJhbmRXaWR0aCA9IEJhbmR3aXRoQ29lZlRhYltpXVtTYW1wbGVSYXRlSWR4XTsKLQotCQkvKiBpbml0IGFhYyBlbmNvZGVyIGNvcmUgKi8KLQkJcmV0ID0gQWFjRW5jT3BlbihoQWFjRW5jLCBjb25maWcpOwotCQlpZihyZXQpCi0JCQlyZXR1cm4gVk9fRVJSX0FVRElPX1VOU0ZFQVRVUkU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBWT19FUlJfV1JPTkdfUEFSQU1fSUQ7Ci0JfQotCi0JcmV0dXJuIFZPX0VSUl9OT05FOwotfQotCi0vKioKLSogR2V0IHRoZSBwYXJhbSBmb3Igc3BlY2lhbCB0YXJnZXQuCi0qIFxwYXJhbSBoQ29kZWMgW0lOXV0gVGhlIENvZGVjIEhhbmRsZSB3aGljaCB3YXMgY3JlYXRlZCBieSBJbml0IGZ1bmN0aW9uLgotKiBccGFyYW0gdVBhcmFtSUQgW0lOXSBUaGUgcGFyYW0gSUQuCi0qIFxwYXJhbSBwRGF0YSBbSU5dIFRoZSBwYXJhbSB2YWx1ZSBkZXBlbmQgb24gdGhlIElEPgotKiBccmV0dmFsIFZPX0VSUl9OT05FIFN1Y2NlZWRlZC4KLSovCi1WT19VMzIgVk9fQVBJIHZvQUFDRW5jR2V0UGFyYW0oVk9fSEFORExFIGhDb2RlYywgVk9fUzMyIHVQYXJhbUlELCBWT19QVFIgcERhdGEpCi17Ci0gICAgICAgIFVOVVNFRChoQ29kZWMpOwotICAgICAgICBVTlVTRUQodVBhcmFtSUQpOwotICAgICAgICBVTlVTRUQocERhdGEpOwotCi0JcmV0dXJuIFZPX0VSUl9OT05FOwotfQotCi0vKioKLSAqIEdldCBhdWRpbyBjb2RlYyBBUEkgaW50ZXJmYWNlCi0gKiBccGFyYW0gcEVuY0hhbmRsZSBbb3V0XSBSZXR1cm4gdGhlIEFBQyBFbmNvZGVyIGhhbmRsZS4KLSAqIFxyZXR2YWwgVk9fRVJSX09LIFN1Y2NlZWRlZC4KLSAqLwotVk9fUzMyIFZPX0FQSSB2b0dldEFBQ0VuY0FQSShWT19BVURJT19DT0RFQ0FQSSAqIHBEZWNIYW5kbGUpCi17Ci0JaWYocERlY0hhbmRsZSA9PSBOVUxMKQotCQlyZXR1cm4gVk9fRVJSX0lOVkFMSURfQVJHOwotCi0JcERlY0hhbmRsZS0+SW5pdCA9IHZvQUFDRW5jSW5pdDsKLQlwRGVjSGFuZGxlLT5TZXRJbnB1dERhdGEgPSB2b0FBQ0VuY1NldElucHV0RGF0YTsKLQlwRGVjSGFuZGxlLT5HZXRPdXRwdXREYXRhID0gdm9BQUNFbmNHZXRPdXRwdXREYXRhOwotCXBEZWNIYW5kbGUtPlNldFBhcmFtID0gdm9BQUNFbmNTZXRQYXJhbTsKLQlwRGVjSGFuZGxlLT5HZXRQYXJhbSA9IHZvQUFDRW5jR2V0UGFyYW07Ci0JcERlY0hhbmRsZS0+VW5pbml0ID0gdm9BQUNFbmNVbmluaXQ7Ci0KLQlyZXR1cm4gVk9fRVJSX05PTkU7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNlbmNfY29yZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWFjZW5jX2NvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU0NTJkNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNlbmNfY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJYWFjZW5jX2NvcmUuYwotCi0JQ29udGVudDoJYWFjIGVuY29kZXIgY29yZSBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgInR5cGVkZWYuaCIKLSNpbmNsdWRlICJhYWNlbmNfY29yZS5oIgotI2luY2x1ZGUgImJpdGVuYy5oIgotCi0jaW5jbHVkZSAicHN5X2NvbmZpZ3VyYXRpb24uaCIKLSNpbmNsdWRlICJwc3lfbWFpbi5oIgotI2luY2x1ZGUgInFjX21haW4uaCIKLSNpbmNsdWRlICJwc3lfbWFpbi5oIgotI2luY2x1ZGUgImNoYW5uZWxfbWFwLmgiCi0jaW5jbHVkZSAiYWFjX3JvbS5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogQWFjSW5pdERlZmF1bHRDb25maWcKLSogZGVzY3JpcHRpb246ICBnaXZlcyByZWFzb25hYmxlIGRlZmF1bHQgY29uZmlndXJhdGlvbgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQWFjSW5pdERlZmF1bHRDb25maWcoQUFDRU5DX0NPTkZJRyAqY29uZmlnKQotewotICAvKiBkZWZhdWx0IGNvbmZpZ3VyYXRpb25zICovCi0gIGNvbmZpZy0+YWR0c1VzZWQgICAgICAgID0gMTsKLSAgY29uZmlnLT5uQ2hhbm5lbHNJbiAgICAgPSAyOwotICBjb25maWctPm5DaGFubmVsc091dCAgICA9IDI7Ci0gIGNvbmZpZy0+Yml0UmF0ZSAgICAgICAgID0gMTI4MDAwOwotICBjb25maWctPmJhbmRXaWR0aCAgICAgICA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBBYWNFbmNPcGVuCi0qIGRlc2NyaXB0aW9uOiAgYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgZW5jb2RlciBpbnN0YW5jZQotKiByZXR1cm5zOiAgICAgIDAgaWYgc3VjY2VzcwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVdvcmQxNiAgQWFjRW5jT3BlbiggIEFBQ19FTkNPREVSKiAgICAgIGhBYWNFbmMsICAgICAgICAvKiBwb2ludGVyIHRvIGFuIGVuY29kZXIgaGFuZGxlLCBpbml0aWFsaXplZCBvbiByZXR1cm4gKi8KLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICBBQUNFTkNfQ09ORklHICAgICBjb25maWcgICAvKiBwcmUtaW5pdGlhbGl6ZWQgY29uZmlnIHN0cnVjdCAqLwotICAgICAgICAgICAgICAgICAgICAgKQotewotICBXb3JkMzIgZXJyb3IgPSAwOwotICBXb3JkMTYgcHJvZmlsZSA9IDE7Ci0KLSAgRUxFTUVOVF9JTkZPICplbEluZm8gPSBOVUxMOwotCi0gIGlmIChoQWFjRW5jPT0wKSB7Ci0gICAgZXJyb3I9MTsKLSAgfQotCi0gIGlmICghZXJyb3IpIHsKLSAgICBoQWFjRW5jLT5jb25maWcgPSBjb25maWc7Ci0gIH0KLQotICBpZiAoIWVycm9yKSB7Ci0gICAgZXJyb3IgPSBJbml0RWxlbWVudEluZm8gKGNvbmZpZy5uQ2hhbm5lbHNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoQWFjRW5jLT5lbEluZm8pOwotICB9Ci0KLSAgaWYgKCFlcnJvcikgewotICAgIGVsSW5mbyA9ICZoQWFjRW5jLT5lbEluZm87Ci0gIH0KLQotICBpZiAoIWVycm9yKSB7Ci0gICAgLyogdXNlIG9yIG5vdCB0bnMgdG9vbCBmb3IgbG9uZyBhbmQgc2hvcnQgYmxvY2sgKi8KLQkgV29yZDE2IHRuc01hc2s9MzsKLQotCS8qIGluaXQgZW5jb2RlciBwc3ljaG9hY291c3RpYyAqLwotICAgIGVycm9yID0gcHN5TWFpbkluaXQoJmhBYWNFbmMtPnBzeUtlcm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmJpdFJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBlbEluZm8tPm5DaGFubmVsc0luRWwsCi0gICAgICAgICAgICAgICAgICAgICAgICB0bnNNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+Y29uZmlnLmJhbmRXaWR0aCk7Ci0gIH0KLQotIC8qIHVzZSBvciBub3QgYWR0cyBoZWFkZXIgKi8KLSAgaWYoIWVycm9yKSB7Ci0JICBoQWFjRW5jLT5xY091dC5xY0VsZW1lbnQuYWR0c1VzZWQgPSBjb25maWcuYWR0c1VzZWQ7Ci0gIH0KLQotICAvKiBpbml0IGVuY29kZXIgcXVhbnRpemF0aW9uICovCi0gIGlmICghZXJyb3IpIHsKLSAgICBzdHJ1Y3QgUUNfSU5JVCBxY0luaXQ7Ci0KLSAgICAvKnFjSW5pdC5jaGFubmVsTWFwcGluZyA9ICZoQWFjRW5jLT5jaGFubmVsTWFwcGluZzsqLwotICAgIHFjSW5pdC5lbEluZm8gPSAmaEFhY0VuYy0+ZWxJbmZvOwotCi0gICAgcWNJbml0Lm1heEJpdHMgPSAoV29yZDE2KSAoTUFYQklUU19DT0VGKmVsSW5mby0+bkNoYW5uZWxzSW5FbCk7Ci0gICAgcWNJbml0LmJpdFJlcyA9IHFjSW5pdC5tYXhCaXRzOwotICAgIHFjSW5pdC5hdmVyYWdlQml0cyA9IChXb3JkMTYpICgoY29uZmlnLmJpdFJhdGUgKiBGUkFNRV9MRU5fTE9ORykgLyBjb25maWcuc2FtcGxlUmF0ZSk7Ci0KLSAgICBxY0luaXQucGFkZGluZy5wYWRkaW5nUmVzdCA9IGNvbmZpZy5zYW1wbGVSYXRlOwotCi0gICAgcWNJbml0Lm1lYW5QZSA9IChXb3JkMTYpICgoMTAgKiBGUkFNRV9MRU5fTE9ORyAqIGhBYWNFbmMtPmNvbmZpZy5iYW5kV2lkdGgpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZmlnLnNhbXBsZVJhdGU+PjEpKTsKLQotICAgIHFjSW5pdC5tYXhCaXRGYWMgPSAoV29yZDE2KSAoKDEwMCAqIChNQVhCSVRTX0NPRUYtTUlOQklUU19DT0VGKSogZWxJbmZvLT5uQ2hhbm5lbHNJbkVsKS8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocWNJbml0LmF2ZXJhZ2VCaXRzP3FjSW5pdC5hdmVyYWdlQml0czoxKSk7Ci0KLSAgICBxY0luaXQuYml0cmF0ZSA9IGNvbmZpZy5iaXRSYXRlOwotCi0gICAgZXJyb3IgPSBRQ0luaXQoJmhBYWNFbmMtPnFjS2VybmVsLCAmcWNJbml0KTsKLSAgfQotCi0gIC8qIGluaXQgYml0c3RyZWFtIGVuY29kZXIgKi8KLSAgaWYgKCFlcnJvcikgewotICAgIGhBYWNFbmMtPmJzZUluaXQubkNoYW5uZWxzICAgPSBlbEluZm8tPm5DaGFubmVsc0luRWw7Ci0gICAgaEFhY0VuYy0+YnNlSW5pdC5iaXRyYXRlICAgICA9IGNvbmZpZy5iaXRSYXRlOwotICAgIGhBYWNFbmMtPmJzZUluaXQuc2FtcGxlUmF0ZSAgPSBjb25maWcuc2FtcGxlUmF0ZTsKLSAgICBoQWFjRW5jLT5ic2VJbml0LnByb2ZpbGUgICAgID0gcHJvZmlsZTsKLSAgfQotCi0gIHJldHVybiBlcnJvcjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IEFhY0VuY0VuY29kZQotKiBkZXNjcmlwdGlvbjogIGVuY29kZSBwY20gdG8gYWFjIGRhdGEgY29yZSBmdW5jdGlvbgotKiByZXR1cm5zOiAgICAgIDAgaWYgc3VjY2VzcwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVdvcmQxNiBBYWNFbmNFbmNvZGUoQUFDX0VOQ09ERVIgKmFhY0VuYywJCS8qITwgYW4gZW5jb2RlciBoYW5kbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgV29yZDE2ICp0aW1lU2lnbmFsLCAgICAgICAgIC8qITwgQkxPQ0tTSVpFKm5DaGFubmVscyBhdWRpbyBzYW1wbGVzLCBpbnRlcmxlYXZlZCAqLwotICAgICAgICAgICAgICAgICAgICBjb25zdCBVV29yZDggKmFuY0J5dGVzLCAgICAgLyohPCBwb2ludGVyIHRvIGFuY2lsbGFyeSBkYXRhIGJ5dGVzICovCi0gICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbnVtQW5jQnl0ZXMsCQkvKiE8IG51bWJlciBvZiBhbmNpbGxhcnkgRGF0YSBCeXRlcyAqLwotICAgICAgICAgICAgICAgICAgICBVV29yZDggKm91dEJ5dGVzLCAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIG91dHB1dCBidWZmZXIgKG11c3QgYmUgbGFyZ2UgTUlOQklUU19DT0VGLzgqTUFYX0NIQU5ORUxTIGJ5dGVzKSAqLwotICAgICAgICAgICAgICAgICAgICBWT19VMzIgKm51bU91dEJ5dGVzICAgICAgICAgLyohPCBudW1iZXIgb2YgYnl0ZXMgaW4gb3V0cHV0IGJ1ZmZlciBhZnRlciBwcm9jZXNzaW5nICovCi0gICAgICAgICAgICAgICAgICAgICkKLXsKLSAgRUxFTUVOVF9JTkZPICplbEluZm8gPSAmYWFjRW5jLT5lbEluZm87Ci0gIFdvcmQxNiBnbG9iVXNlZEJpdHM7Ci0gIFdvcmQxNiBhbmNEYXRhQnl0ZXMsIGFuY0RhdGFCeXRlc0xlZnQ7Ci0KLSAgYW5jRGF0YUJ5dGVzID0gYW5jRGF0YUJ5dGVzTGVmdCA9ICpudW1BbmNCeXRlczsKLQotICAvKiBpbml0IG91dHB1dCBhYWMgZGF0YSBidWZmZXIgYW5kIGxlbmd0aCAqLwotICBhYWNFbmMtPmhCaXRTdHJlYW0gPSBDcmVhdGVCaXRCdWZmZXIoJmFhY0VuYy0+Yml0U3RyZWFtLCBvdXRCeXRlcywgKm51bU91dEJ5dGVzKTsKLQotICAvKiBwc3ljaG9hY291c3RpYyBwcm9jZXNzICovCi0gIHBzeU1haW4oYWFjRW5jLT5jb25maWcubkNoYW5uZWxzT3V0LAotICAgICAgICAgIGVsSW5mbywKLSAgICAgICAgICB0aW1lU2lnbmFsLAotICAgICAgICAgICZhYWNFbmMtPnBzeUtlcm5lbC5wc3lEYXRhW2VsSW5mby0+Q2hhbm5lbEluZGV4WzBdXSwKLSAgICAgICAgICAmYWFjRW5jLT5wc3lLZXJuZWwudG5zRGF0YVtlbEluZm8tPkNoYW5uZWxJbmRleFswXV0sCi0gICAgICAgICAgJmFhY0VuYy0+cHN5S2VybmVsLnBzeUNvbmZMb25nLAotICAgICAgICAgICZhYWNFbmMtPnBzeUtlcm5lbC5wc3lDb25mU2hvcnQsCi0gICAgICAgICAgJmFhY0VuYy0+cHN5T3V0LnBzeU91dENoYW5uZWxbZWxJbmZvLT5DaGFubmVsSW5kZXhbMF1dLAotICAgICAgICAgICZhYWNFbmMtPnBzeU91dC5wc3lPdXRFbGVtZW50LAotICAgICAgICAgIGFhY0VuYy0+cHN5S2VybmVsLnBTY3JhdGNoVG5zLAotCQkgIGFhY0VuYy0+Y29uZmlnLnNhbXBsZVJhdGUpOwotCi0gIC8qIGFkanVzdCBiaXRyYXRlIGFuZCBmcmFtZSBsZW5ndGggKi8KLSAgQWRqdXN0Qml0cmF0ZSgmYWFjRW5jLT5xY0tlcm5lbCwKLSAgICAgICAgICAgICAgICBhYWNFbmMtPmNvbmZpZy5iaXRSYXRlLAotICAgICAgICAgICAgICAgIGFhY0VuYy0+Y29uZmlnLnNhbXBsZVJhdGUpOwotCi0gIC8qIHF1YW50aXphdGlvbiBhbmQgY29kaW5nIHByb2Nlc3MgKi8KLSAgUUNNYWluKCZhYWNFbmMtPnFjS2VybmVsLAotICAgICAgICAgJmFhY0VuYy0+cWNLZXJuZWwuZWxlbWVudEJpdHMsCi0gICAgICAgICAmYWFjRW5jLT5xY0tlcm5lbC5hZGpUaHIuYWRqVGhyU3RhdGVFbGVtLAotICAgICAgICAgJmFhY0VuYy0+cHN5T3V0LnBzeU91dENoYW5uZWxbZWxJbmZvLT5DaGFubmVsSW5kZXhbMF1dLAotICAgICAgICAgJmFhY0VuYy0+cHN5T3V0LnBzeU91dEVsZW1lbnQsCi0gICAgICAgICAmYWFjRW5jLT5xY091dC5xY0NoYW5uZWxbZWxJbmZvLT5DaGFubmVsSW5kZXhbMF1dLAotICAgICAgICAgJmFhY0VuYy0+cWNPdXQucWNFbGVtZW50LAotICAgICAgICAgZWxJbmZvLT5uQ2hhbm5lbHNJbkVsLAotCQkgbWluKGFuY0RhdGFCeXRlc0xlZnQsYW5jRGF0YUJ5dGVzKSk7Ci0KLSAgYW5jRGF0YUJ5dGVzTGVmdCA9IGFuY0RhdGFCeXRlc0xlZnQgLSBhbmNEYXRhQnl0ZXM7Ci0KLSAgZ2xvYlVzZWRCaXRzID0gRmluYWxpemVCaXRDb25zdW1wdGlvbigmYWFjRW5jLT5xY0tlcm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmYWFjRW5jLT5xY091dCk7Ci0KLSAgLyogd3JpdGUgYml0c3RyZWFtIHByb2Nlc3MgKi8KLSAgV3JpdGVCaXRzdHJlYW0oYWFjRW5jLT5oQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAqZWxJbmZvLAotICAgICAgICAgICAgICAgICAmYWFjRW5jLT5xY091dCwKLSAgICAgICAgICAgICAgICAgJmFhY0VuYy0+cHN5T3V0LAotICAgICAgICAgICAgICAgICAmZ2xvYlVzZWRCaXRzLAotICAgICAgICAgICAgICAgICBhbmNCeXRlcywKLQkJCQkgYWFjRW5jLT5wc3lLZXJuZWwuc2FtcGxlUmF0ZUlkeCk7Ci0KLSAgdXBkYXRlQml0cmVzKCZhYWNFbmMtPnFjS2VybmVsLAotICAgICAgICAgICAgICAgJmFhY0VuYy0+cWNPdXQpOwotCi0gIC8qIHdyaXRlIG91dCB0aGUgYml0c3RyZWFtICovCi0gICpudW1PdXRCeXRlcyA9IEdldEJpdHNBdmFpbChhYWNFbmMtPmhCaXRTdHJlYW0pID4+IDM7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6QWFjRW5jQ2xvc2UKLSogZGVzY3JpcHRpb246IGRlYWxsb2NhdGUgYW4gZW5jb2RlciBpbnN0YW5jZQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQWFjRW5jQ2xvc2UgKEFBQ19FTkNPREVSKiBoQWFjRW5jLCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCkKLXsKLSAgaWYgKGhBYWNFbmMpIHsKLSAgICBRQ0RlbGV0ZSgmaEFhY0VuYy0+cWNLZXJuZWwsIHBNZW1PUCk7Ci0KLSAgICBRQ091dERlbGV0ZSgmaEFhY0VuYy0+cWNPdXQsIHBNZW1PUCk7Ci0KLSAgICBQc3lEZWxldGUoJmhBYWNFbmMtPnBzeUtlcm5lbCwgcE1lbU9QKTsKLQotICAgIFBzeU91dERlbGV0ZSgmaEFhY0VuYy0+cHN5T3V0LCBwTWVtT1ApOwotCi0gICAgRGVsZXRlQml0QnVmZmVyKCZoQWFjRW5jLT5oQml0U3RyZWFtKTsKLQotCWlmKGhBYWNFbmMtPmludGJ1ZikKLQl7Ci0JCW1lbV9mcmVlKHBNZW1PUCwgaEFhY0VuYy0+aW50YnVmLCBWT19JTkRFWF9FTkNfQUFDKTsKLQkJaEFhY0VuYy0+aW50YnVmID0gTlVMTDsKLQl9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2Fkal90aHIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2Fkal90aHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI4YmUwZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hZGpfdGhyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjI4ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJYWRqX3Roci5jCi0KLQlDb250ZW50OglUaHJlc2hvbGQgY29tcGVuc2F0aW9uIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBJbmNsdWRlIHN5c3RlbSBoZWFkZXJzIGJlZm9yZSBsb2NhbCBoZWFkZXJzIC0gdGhlIGxvY2FsIGhlYWRlcnMKLSAqIHJlZGVmaW5lIF9faW5saW5lLCB3aGljaCBjYW4gbWVzcyB1cCBkZWZpbml0aW9ucyBpbiBsaWJjIGhlYWRlcnMgaWYKLSAqIHRoZXkgaGFwcGVuIHRvIHVzZSBfX2lubGluZS4gKi8KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJiYXNpY19vcC5oIgotI2luY2x1ZGUgIm9wZXJfMzJiLmgiCi0jaW5jbHVkZSAiYWRqX3Rocl9kYXRhLmgiCi0jaW5jbHVkZSAiYWRqX3Roci5oIgotI2luY2x1ZGUgInFjX2RhdGEuaCIKLSNpbmNsdWRlICJsaW5lX3BlLmgiCi0KLQotI2RlZmluZSAgbWluU25yTGltaXQgICAgMHg2NjY2IC8qIDEgZEIgKi8KLSNkZWZpbmUgIFBFQklUU19DT0VGCTB4MTcwYSAvKiAwLjE4KigxIDw8IDE1KSovCi0KLSNkZWZpbmUgIEhPTEVfVEhSX0xPTkcJMHgyODczCS8qIDAuMzE2KigxIDw8IDE1KSAqLwotI2RlZmluZSAgSE9MRV9USFJfU0hPUlQgMHg0MDAwICAvKiAwLjUgICooMSA8PCAxNSkgKi8KLQotI2RlZmluZSAgTVNfVEhSU1BSRUFEX0NPRUYgMHg3MzMzICAvKiAwLjkgKiAoMSA8PCAxNSkgKi8KLQotI2RlZmluZQkgTUlOX1NOUl9DT0VGCSAgIDB4NjUxZiAgLyogMy4xNiogKDEgPDwgKDE1IC0gMikpICovCi0KLS8qIHZhbHVlcyBmb3IgYXZvaWQgaG9sZSBmbGFnICovCi1lbnVtIF9hdm9pZF9ob2xlX3N0YXRlIHsKLSAgTk9fQUggICAgICAgICAgICAgID0wLAotICBBSF9JTkFDVElWRSAgICAgICAgPTEsCi0gIEFIX0FDVElWRSAgICAgICAgICA9MgotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6Yml0czJwZQotKiBkZXNjcmlwdGlvbjogY29udmVydCBmcm9tIGJpdHMgdG8gcGUKLSoJCQkgICBwZSA9IDEuMTgqZGVzaXJlZEJpdHMKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1Xb3JkMTYgYml0czJwZShjb25zdCBXb3JkMTYgYml0cykgewotICByZXR1cm4gKGJpdHMgKyAoKFBFQklUU19DT0VGICogYml0cykgPj4gMTUpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6Y2FsY1RocmVzaEV4cAotKiBkZXNjcmlwdGlvbjogbG91ZG5lc3MgY2FsY3VsYXRpb24gKHRocmVzaG9sZCB0byB0aGUgcG93ZXIgb2YgcmVkRXhwKQotKgkJCSAgIHRocihuKV4wLjI1Ci0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgY2FsY1RocmVzaEV4cChXb3JkMzIgdGhyRXhwW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IG5DaGFubmVscykKLXsKLSAgV29yZDE2IGNoLCBzZmIsIHNmYkdycDsKLSAgV29yZDMyICpwdGhyRXhwID0gTlVMTCwgKnBzZmJUaHJlOwotICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewotICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9ICZwc3lPdXRDaGFubmVsW2NoXTsKLQkgZm9yKHNmYkdycCA9IDA7IHNmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDsgc2ZiR3JwKz0gcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApCi0JICBwdGhyRXhwID0gJih0aHJFeHBbY2hdW3NmYkdycF0pOwotCSAgcHNmYlRocmUgPSBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGQgKyBzZmJHcnA7Ci0JICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0JCSpwdGhyRXhwID0gcnNxcnQocnNxcnQoKnBzZmJUaHJlLElOVF9CSVRTKSxJTlRfQklUUyk7Ci0JCXB0aHJFeHArKzsgcHNmYlRocmUrKzsKLSAgICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTphZGFwdE1pblNucgotKiBkZXNjcmlwdGlvbjogcmVkdWNlIG1pblNuciByZXF1aXJlbWVudHMgZm9yIGJhbmRzIHdpdGggcmVsYXRpdmUgbG93IGVuZXJnaWVzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYWRhcHRNaW5TbnIoUFNZX09VVF9DSEFOTkVMICAgICBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgICAgIGxvZ1NmYkVuZXJneVtNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICAgICBNSU5TTlJfQURBUFRfUEFSQU0gKm1zYVBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICBuQ2hhbm5lbHMpCi17Ci0gIFdvcmQxNiBjaCwgc2ZiLCBzZmJPZmZzOwotICBXb3JkMzIgblNmYiwgYXZnRW47Ci0gIFdvcmQxNiBsb2dfYXZnRW4gPSAwOwotICBXb3JkMzIgc3RhcnRSYXRpb194X2F2Z0VuID0gMDsKLQotCi0gIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFuID0gJnBzeU91dENoYW5uZWxbY2hdOwotCi0gICAgLyogY2FsYyBhdmVyYWdlIGVuZXJneSBwZXIgc2NhbGVmYWN0b3IgYmFuZCAqLwotICAgIGF2Z0VuID0gMDsKLSAgICBuU2ZiID0gMDsKLSAgICBmb3IgKHNmYk9mZnM9MDsgc2ZiT2Zmczxwc3lPdXRDaGFuLT5zZmJDbnQ7IHNmYk9mZnMrPXBzeU91dENoYW4tPnNmYlBlckdyb3VwKSB7Ci0gICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICAgIGF2Z0VuID0gTF9hZGQoYXZnRW4sIHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJPZmZzK3NmYl0pOwotICAgICAgICBuU2ZiID0gblNmYiArIDE7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG5TZmIgPiAwKSB7Ci0JICBhdmdFbiA9IGF2Z0VuIC8gblNmYjsKLQotICAgICAgbG9nX2F2Z0VuID0gaUxvZzQoYXZnRW4pOwotICAgICAgc3RhcnRSYXRpb194X2F2Z0VuID0gZml4bXVsKG1zYVBhcmFtLT5zdGFydFJhdGlvLCBhdmdFbik7Ci0gICAgfQotCi0KLSAgICAvKiByZWR1Y2UgbWluU25yIHJlcXVpcmVtZW50IGJ5IG1pblNucl5taW5TbnJSZWQgZGVwZW5kZW50IG9uIGF2Z0VuL3NmYkVuICovCi0gICAgZm9yIChzZmJPZmZzPTA7IHNmYk9mZnM8cHN5T3V0Q2hhbi0+c2ZiQ250OyBzZmJPZmZzKz1wc3lPdXRDaGFuLT5zZmJQZXJHcm91cCkgewotICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewotICAgICAgICBpZiAocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYk9mZnMrc2ZiXSA8IHN0YXJ0UmF0aW9feF9hdmdFbikgewotICAgICAgICAgIFdvcmQxNiBkYlJhdGlvLCBtaW5TbnJSZWQ7Ci0gICAgICAgICAgV29yZDMyIHNuclJlZDsKLSAgICAgICAgICBXb3JkMTYgbmV3TWluU25yOwotCi0gICAgICAgICAgZGJSYXRpbyA9IGxvZ19hdmdFbiAtIGxvZ1NmYkVuZXJneVtjaF1bc2ZiT2ZmcytzZmJdOwotICAgICAgICAgIGRiUmF0aW8gPSBkYlJhdGlvICsgKGRiUmF0aW8gPDwgMSk7Ci0KLSAgICAgICAgICBtaW5TbnJSZWQgPSAxMTAgLSAoKGRiUmF0aW8gKyAoZGJSYXRpbyA8PCAxKSkgPj4gMik7Ci0gICAgICAgICAgbWluU25yUmVkID0gbWF4KG1pblNuclJlZCwgMjApOyAvKiAxMTA6ICgwLjM3NShyZWRPZmZzKSsxKSo4MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzogMC4wMDM3NShyZWRSYXRpb0ZhYykqODAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA6IDAuMjUobWF4UmVkKSAqIDgwICovCi0KLSAgICAgICAgICBzbnJSZWQgPSBtaW5TbnJSZWQgKiBpTG9nNCgocHN5T3V0Q2hhbi0+c2ZiTWluU25yW3NmYk9mZnMrc2ZiXSA8PCAxNikpOwotICAgICAgICAgIC8qCi0gICAgICAgICAgICAgc25yUmVkSSBzaSBub3cgc2NhbGVkIGJ5IDgwIChtaW5TbnJSZWQpIGFuZCA0IChmZnJfaUxvZzQpCi0gICAgICAgICAgKi8KLQotICAgICAgICAgIG5ld01pblNuciA9IHJvdW5kMTYocG93Ml94eShzbnJSZWQsODAqNCkpOwotCi0gICAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiTWluU25yW3NmYk9mZnMrc2ZiXSA9IG1pbihuZXdNaW5TbnIsIG1pblNuckxpbWl0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6aW5pdEF2b2lkSG9sZUZsYWcKLSogZGVzY3JpcHRpb246IGRldGVybWluZSBiYW5kcyB3aGVyZSBhdm9pZCBob2xlIGlzIG5vdCBuZWNlc3NhcnkgcmVzcC4gcG9zc2libGUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBpbml0QXZvaWRIb2xlRmxhZyhXb3JkMTYgYWhGbGFnW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UKiBwc3lPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IG5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFIX1BBUkFNICphaFBhcmFtKQotewotICBXb3JkMTYgY2gsIHNmYiwgc2ZiR3JwLCBzaGlmdDsKLSAgV29yZDMyIHRocmVzaG9sZDsKLSAgV29yZDMyKiBwc2ZiU3ByZWFkRW47Ci0KLSAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKLSAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4gPSAmcHN5T3V0Q2hhbm5lbFtjaF07Ci0KLSAgICBpZiAocHN5T3V0Q2hhbi0+d2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKSB7Ci0gICAgICBmb3Ioc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFuLT5zZmJDbnQ7c2ZiR3JwKz0gcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApewotICAgICAgICAgcHNmYlNwcmVhZEVuID0gcHN5T3V0Q2hhbi0+c2ZiU3ByZWFkZWRFbmVyZ3kgKyBzZmJHcnA7Ci0JCSBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0JCQkqcHNmYlNwcmVhZEVuID0gKnBzZmJTcHJlYWRFbiA+PiAxOyAgLyogMC41ICovCi0JCQkrK3BzZmJTcHJlYWRFbjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGZvcihzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDtzZmJHcnArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCl7Ci0JCXBzZmJTcHJlYWRFbiA9IHBzeU91dENoYW4tPnNmYlNwcmVhZGVkRW5lcmd5ICsgc2ZiR3JwOwotICAgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICAgICAgKnBzZmJTcHJlYWRFbiA9ICgqcHNmYlNwcmVhZEVuID4+IDEpICsgKCpwc2ZiU3ByZWFkRW4gPj4gMyk7ICAvKiAwLjYzICovCi0JCSAgKytwc2ZiU3ByZWFkRW47Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiBpbmNyZWFzZSBtaW5TbnIgZm9yIGxvY2FsIHBlYWtzLCBkZWNyZWFzZSBpdCBmb3IgdmFsbGV5cyAqLwotICBpZiAoYWhQYXJhbS0+bW9kaWZ5TWluU25yKSB7Ci0gICAgZm9yKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewotICAgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuID0gJnBzeU91dENoYW5uZWxbY2hdOwotCi0gICAgICBpZiAocHN5T3V0Q2hhbi0+d2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKQotICAgICAgICB0aHJlc2hvbGQgPSBIT0xFX1RIUl9MT05HOwotICAgICAgZWxzZQotICAgICAgICB0aHJlc2hvbGQgPSBIT0xFX1RIUl9TSE9SVDsKLQotICAgICAgZm9yKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0Q2hhbi0+c2ZiQ250O3NmYkdycCs9IHBzeU91dENoYW4tPnNmYlBlckdyb3VwKXsKLSAgICAgICAgV29yZDE2ICpwc2ZiTWluU25yID0gcHN5T3V0Q2hhbi0+c2ZiTWluU25yICsgc2ZiR3JwOwotCQlmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICAgICAgV29yZDMyIHNmYkVuLCBzZmJFbm0xLCBzZmJFbnAxLCBhdmdFbjsKLQotICAgICAgICAgIGlmIChzZmIgPiAwKQotICAgICAgICAgICAgc2ZiRW5tMSA9IHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiLTFdOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNmYkVubTEgPSBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwXTsKLQotICAgICAgICAgIGlmIChzZmIgPCAocHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXAtMSkpCi0gICAgICAgICAgICBzZmJFbnAxID0gcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmIrMV07Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc2ZiRW5wMSA9IHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiXTsKLSAgICAgICAgICBhdmdFbiA9IChzZmJFbm0xICsgc2ZiRW5wMSkgPj4gMTsKLSAgICAgICAgICBzZmJFbiA9IHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiXTsKLQotICAgICAgICAgIGlmIChzZmJFbiA+IGF2Z0VuICYmIGF2Z0VuID4gMCkgewotICAgICAgICAgICAgV29yZDMyIHRtcE1pblNucjsKLSAgICAgICAgICAgIHNoaWZ0ID0gbm9ybV9sKHNmYkVuKTsKLQkJCXRtcE1pblNuciA9IERpdl8zMihMX21weV9scyhhdmdFbiwgbWluU25yTGltaXQpIDw8IHNoaWZ0LCBzZmJFbiA8PCBzaGlmdCApOwotICAgICAgICAgICAgdG1wTWluU25yID0gbWF4KHRtcE1pblNuciwgSE9MRV9USFJfTE9ORyk7Ci0gICAgICAgICAgICB0bXBNaW5TbnIgPSBtYXgodG1wTWluU25yLCB0aHJlc2hvbGQpOwotICAgICAgICAgICAgKnBzZmJNaW5TbnIgPSBtaW4oKnBzZmJNaW5TbnIsIHRtcE1pblNucik7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8qIHZhbGxleSA/ICovCi0KLSAgICAgICAgICBpZiAoKHNmYkVuIDwgKGF2Z0VuID4+IDEpKSAmJiAoc2ZiRW4gPiAwKSkgewotICAgICAgICAgICAgV29yZDMyIHRtcE1pblNucjsKLSAgICAgICAgICAgIFdvcmQzMiBtaW5TbnJFbiA9IExfbXB5X3d4KGF2Z0VuLCAqcHNmYk1pblNucik7Ci0KLSAgICAgICAgICAgIGlmKG1pblNuckVuIDwgc2ZiRW4pIHsKLQkJCSAgc2hpZnQgPSBub3JtX2woc2ZiRW4pOwotICAgICAgICAgICAgICB0bXBNaW5TbnIgPSBEaXZfMzIoIG1pblNuckVuIDw8IHNoaWZ0LCBzZmJFbjw8c2hpZnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgIHRtcE1pblNuciA9IE1BWF8xNjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRtcE1pblNuciA9IG1pbihtaW5TbnJMaW1pdCwgdG1wTWluU25yKTsKLQotICAgICAgICAgICAgKnBzZmJNaW5TbnIgPQotICAgICAgICAgICAgICAobWluKCh0bXBNaW5TbnIgPj4gIDIpLCBtdWx0KCpwc2ZiTWluU25yLCBNSU5fU05SX0NPRUYpKSA8PCAyKTsKLSAgICAgICAgICB9Ci0JCSAgcHNmYk1pblNucisrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogc3RlcmVvOiBhZGFwdCB0aGUgbWluaW11bSByZXF1aXJlbWVudHMgc2ZiTWluU25yIG9mIG1pZCBhbmQKLSAgICAgc2lkZSBjaGFubmVscyAqLwotCi0gIGlmIChuQ2hhbm5lbHMgPT0gMikgewotICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbk0gPSAmcHN5T3V0Q2hhbm5lbFswXTsKLSAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW5TID0gJnBzeU91dENoYW5uZWxbMV07Ci0gICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW5NLT5zZmJDbnQ7IHNmYisrKSB7Ci0gICAgICBpZiAocHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zTWFza1tzZmJdKSB7Ci0gICAgICAgIFdvcmQzMiBzZmJFbk0gPSBwc3lPdXRDaGFuTS0+c2ZiRW5lcmd5W3NmYl07Ci0gICAgICAgIFdvcmQzMiBzZmJFblMgPSBwc3lPdXRDaGFuUy0+c2ZiRW5lcmd5W3NmYl07Ci0gICAgICAgIFdvcmQzMiBtYXhTZmJFbiA9IG1heChzZmJFbk0sIHNmYkVuUyk7Ci0gICAgICAgIFdvcmQzMiBtYXhUaHIgPSBMX21weV93eChtYXhTZmJFbiwgcHN5T3V0Q2hhbk0tPnNmYk1pblNucltzZmJdKSA+PiAxOwotCi0gICAgICAgIGlmKG1heFRociA+PSBzZmJFbk0pIHsKLSAgICAgICAgICBwc3lPdXRDaGFuTS0+c2ZiTWluU25yW3NmYl0gPSBNQVhfMTY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgc2hpZnQgPSBub3JtX2woc2ZiRW5NKTsKLQkJICBwc3lPdXRDaGFuTS0+c2ZiTWluU25yW3NmYl0gPSBtaW4obWF4KHBzeU91dENoYW5NLT5zZmJNaW5TbnJbc2ZiXSwKLQkJCSAgcm91bmQxNihEaXZfMzIobWF4VGhyPDxzaGlmdCwgc2ZiRW5NIDw8IHNoaWZ0KSkpLCBtaW5TbnJMaW1pdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihtYXhUaHIgPj0gc2ZiRW5TKSB7Ci0gICAgICAgICAgcHN5T3V0Q2hhblMtPnNmYk1pblNucltzZmJdID0gTUFYXzE2OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotCQkgIHNoaWZ0ID0gbm9ybV9sKHNmYkVuUyk7Ci0gICAgICAgICAgcHN5T3V0Q2hhblMtPnNmYk1pblNucltzZmJdID0gbWluKG1heChwc3lPdXRDaGFuUy0+c2ZiTWluU25yW3NmYl0sCi0JCQkgIHJvdW5kMTYoRGl2XzMyKG1heFRociA8PCBzaGlmdCwgc2ZiRW5TIDw8IHNoaWZ0KSkpLCBtaW5TbnJMaW1pdCk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGlmIChzZmJFbk0gPiBwc3lPdXRDaGFuTS0+c2ZiU3ByZWFkZWRFbmVyZ3lbc2ZiXSkKLSAgICAgICAgICBwc3lPdXRDaGFuUy0+c2ZiU3ByZWFkZWRFbmVyZ3lbc2ZiXSA9IExfbXB5X2xzKHNmYkVuUywgTVNfVEhSU1BSRUFEX0NPRUYpOwotCi0gICAgICAgIGlmIChzZmJFblMgPiBwc3lPdXRDaGFuUy0+c2ZiU3ByZWFkZWRFbmVyZ3lbc2ZiXSkKLSAgICAgICAgICBwc3lPdXRDaGFuTS0+c2ZiU3ByZWFkZWRFbmVyZ3lbc2ZiXSA9IExfbXB5X2xzKHNmYkVuTSwgTVNfVEhSU1BSRUFEX0NPRUYpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyogaW5pdCBhaEZsYWcgKDA6IG5vIGFoIG5lY2Vzc2FyeSwgMTogYWggcG9zc2libGUsIDI6IGFoIGFjdGl2ZSAqLwotICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuID0gJnBzeU91dENoYW5uZWxbY2hdOwotICAgIGZvcihzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDtzZmJHcnArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCl7Ci0gICAgICBXb3JkMTYgKnBhaEZsYWcgPSBhaEZsYWdbY2hdICsgc2ZiR3JwOwotCSAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewotCi0gICAgICAgIGlmICgocHN5T3V0Q2hhbi0+c2ZiU3ByZWFkZWRFbmVyZ3lbc2ZiR3JwK3NmYl0gPiBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYl0pIHx8Ci0gICAgICAgICAgICAocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdIDw9IHBzeU91dENoYW4tPnNmYlRocmVzaG9sZFtzZmJHcnArc2ZiXSkgfHwKLSAgICAgICAgICAgIChwc3lPdXRDaGFuLT5zZmJNaW5TbnJbc2ZiR3JwK3NmYl0gPT0gTUFYXzE2KSkgewotICAgICAgICAgICpwYWhGbGFnKysgPSBOT19BSDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAqcGFoRmxhZysrID0gQUhfSU5BQ1RJVkU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGZvciAoc2ZiPXBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmI8cHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICAgICpwYWhGbGFnKysgPSBOT19BSDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6Y2FsY1BlTm9BSAotKiBkZXNjcmlwdGlvbjogc3VtIHRoZSBwZSBkYXRhIG9ubHkgZm9yIGJhbmRzIHdoZXJlIGF2b2lkIGhvbGUgaXMgaW5hY3RpdmUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBjYWxjUGVOb0FIKFdvcmQxNiAgICAgICAgICAqcGUsCi0gICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAqY29uc3RQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgKm5BY3RpdmVMaW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgUEVfREFUQSAgICAgICAgICpwZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgYWhGbGFnW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgbkNoYW5uZWxzKQotewotICBXb3JkMTYgY2gsIHNmYiwgc2ZiR3JwOwotICBpbnQgaXBlLCBpY29uc3RQYXJ0LCBpbkFjdGl2ZUxpbmVzOwotCi0gIGlwZSA9IDA7Ci0gIGljb25zdFBhcnQgPSAwOwotICBpbkFjdGl2ZUxpbmVzID0gMDsKLSAgZm9yKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewotICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9ICZwc3lPdXRDaGFubmVsW2NoXTsKLSAgICBQRV9DSEFOTkVMX0RBVEEgKnBlQ2hhbkRhdGEgPSAmcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXTsKLSAgICBmb3Ioc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFuLT5zZmJDbnQ7c2ZiR3JwKz0gcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApewotICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewotCi0gICAgICAgIGlmIChhaEZsYWdbY2hdW3NmYkdycCtzZmJdIDwgQUhfQUNUSVZFKSB7Ci0gICAgICAgICAgaXBlID0gaXBlICsgcGVDaGFuRGF0YS0+c2ZiUGVbc2ZiR3JwK3NmYl07Ci0gICAgICAgICAgaWNvbnN0UGFydCA9IGljb25zdFBhcnQgKyBwZUNoYW5EYXRhLT5zZmJDb25zdFBhcnRbc2ZiR3JwK3NmYl07Ci0gICAgICAgICAgaW5BY3RpdmVMaW5lcyA9IGluQWN0aXZlTGluZXMgKyBwZUNoYW5EYXRhLT5zZmJOQWN0aXZlTGluZXNbc2ZiR3JwK3NmYl07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAqcGUgPSBzYXR1cmF0ZShpcGUpOwotICAqY29uc3RQYXJ0ID0gc2F0dXJhdGUoaWNvbnN0UGFydCk7Ci0gICpuQWN0aXZlTGluZXMgPSBzYXR1cmF0ZShpbkFjdGl2ZUxpbmVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6cmVkdWNlVGhyZXNob2xkcwotKiBkZXNjcmlwdGlvbjogYXBwbHkgcmVkdWN0aW9uIGZvcm11bGEKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCByZWR1Y2VUaHJlc2hvbGRzKFBTWV9PVVRfQ0hBTk5FTCAgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgIGFoRmxhZ1tNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAgICAgdGhyRXhwW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiAgICAgcmVkVmFsKQotewotICBXb3JkMzIgc2ZiVGhyUmVkdWNlZDsKLSAgV29yZDMyICpwc2ZiRW4sICpwc2ZiVGhyOwotICBXb3JkMTYgY2gsIHNmYiwgc2ZiR3JwOwotCi0gIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKLSAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4gPSAmcHN5T3V0Q2hhbm5lbFtjaF07Ci0gICAgZm9yKHNmYkdycD0wOyBzZmJHcnA8cHN5T3V0Q2hhbi0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW4tPnNmYlBlckdyb3VwKSB7Ci0gCSAgcHNmYkVuICA9IHBzeU91dENoYW4tPnNmYkVuZXJneSArIHNmYkdycDsKLSAgICAgIHBzZmJUaHIgPSBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGQgKyBzZmJHcnA7Ci0JICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0KLSAgICAgICAgaWYgKCpwc2ZiRW4gPiAqcHNmYlRocikgewotICAgICAgICAgIC8qIHRocmVzaG9sZCByZWR1Y3Rpb24gZm9ybXVsYSAqLwotICAgICAgICAgIFdvcmQzMiB0bXAgPSB0aHJFeHBbY2hdW3NmYkdycCtzZmJdICsgcmVkVmFsOwotICAgICAgICAgIHRtcCA9IGZpeG11bCh0bXAsIHRtcCk7Ci0gICAgICAgICAgc2ZiVGhyUmVkdWNlZCA9IGZpeG11bCh0bXAsIHRtcCk7Ci0gICAgICAgICAgLyogYXZvaWQgaG9sZXMgKi8KLSAgICAgICAgICB0bXAgPSBMX21weV9scygqcHNmYkVuLCBwc3lPdXRDaGFuLT5zZmJNaW5TbnJbc2ZiR3JwK3NmYl0pOwotCi0gICAgICAgICAgaWYgKChzZmJUaHJSZWR1Y2VkID4gdG1wKSAmJgotICAgICAgICAgICAgICAoYWhGbGFnW2NoXVtzZmJHcnArc2ZiXSAhPSBOT19BSCkpewotICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZCA9IG1heCh0bXAsICpwc2ZiVGhyKTsKLSAgICAgICAgICAgIGFoRmxhZ1tjaF1bc2ZiR3JwK3NmYl0gPSBBSF9BQ1RJVkU7Ci0gICAgICAgICAgfQotCQkgICpwc2ZiVGhyID0gc2ZiVGhyUmVkdWNlZDsKLSAgICAgICAgfQotCi0JCXBzZmJFbisrOyAgcHNmYlRocisrOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOmNvcnJlY3RUaHJlc2gKLSogZGVzY3JpcHRpb246IGlmIHBlIGRpZmZlcmVuY2UgZGVsdGFQZSBiZXR3ZWVuIGRlc2lyZWQgcGUgYW5kIHJlYWwgcGUgaXMgc21hbGwgZW5vdWdoLAotKiAgICAgICAgICAgICB0aGUgZGlmZmVyZW5jZSBjYW4gYmUgZGlzdHJpYnV0ZWQgYW1vbmcgdGhlIHNjYWxlIGZhY3RvciBiYW5kcy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBjb3JyZWN0VGhyZXNoKFBTWV9PVVRfQ0hBTk5FTCAgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgIGFoRmxhZ1tNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFBFX0RBVEEgICAgICAgICAgKnBlRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICAgICB0aHJFeHBbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgICAgIHJlZFZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiAgICAgZGVsdGFQZSkKLXsKLSAgV29yZDE2IGNoLCBzZmIsIHNmYkdycCxzaGlmdDsKLSAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuOwotICBQRV9DSEFOTkVMX0RBVEEgKnBlQ2hhbkRhdGE7Ci0gIFdvcmQzMiBkZWx0YVNmYlBlOwotICBXb3JkMzIgbm9ybUZhY3RvcjsKLSAgV29yZDMyICpwc2ZiUGVGYWN0b3JzOwotICBXb3JkMTYgKnBzZmJOQWN0aXZlTGluZXMsICpwYWhGbGFnOwotICBXb3JkMzIgc2ZiRW4sIHNmYlRocjsKLSAgV29yZDMyIHNmYlRoclJlZHVjZWQ7Ci0KLSAgLyogZm9yIGVhY2ggc2ZiIGNhbGMgcmVsYXRpdmUgZmFjdG9ycyBmb3IgcGUgY2hhbmdlcyAqLwotICBub3JtRmFjdG9yID0gMTsKLSAgZm9yKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgewotICAgIHBzeU91dENoYW4gPSAmcHN5T3V0Q2hhbm5lbFtjaF07Ci0gICAgcGVDaGFuRGF0YSA9ICZwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdOwotICAgIGZvcihzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDtzZmJHcnArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCl7Ci0gICAgICBwc2ZiUGVGYWN0b3JzID0gcGVEYXRhLT5zZmJQZUZhY3RvcnNbY2hdICsgc2ZiR3JwOwotCSAgcHNmYk5BY3RpdmVMaW5lcyA9IHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lcyArIHNmYkdycDsKLQkgIHBhaEZsYWcgPSBhaEZsYWdbY2hdICsgc2ZiR3JwOwotCSAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgewotICAgICAgICBXb3JkMzIgcmVkVGhyRXhwID0gdGhyRXhwW2NoXVtzZmJHcnArc2ZiXSArIHJlZFZhbDsKLQotICAgICAgICBpZiAoKCgqcGFoRmxhZyA8IEFIX0FDVElWRSkgfHwgKGRlbHRhUGUgPiAwKSkgJiYgKHJlZFRockV4cCA+IDApICYmIChyZWRUaHJFeHAgPj0gKnBzZmJOQWN0aXZlTGluZXMpKSB7Ci0KLSAgICAgICAgICAqcHNmYlBlRmFjdG9ycyA9ICgqcHNmYk5BY3RpdmVMaW5lcykgKiAoMHg3ZmZmZmZmZiAvIHJlZFRockV4cCk7Ci0gICAgICAgICAgbm9ybUZhY3RvciA9IExfYWRkKG5vcm1GYWN0b3IsICpwc2ZiUGVGYWN0b3JzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAqcHNmYlBlRmFjdG9ycyA9IDA7Ci0gICAgICAgIH0KLQkJcHNmYlBlRmFjdG9ycysrOwotCQlwYWhGbGFnKys7IHBzZmJOQWN0aXZlTGluZXMrKzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIC8qIGNhbGN1bGF0ZSBuZXcgdGhyZXNob2xkcyAqLwotICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgcHN5T3V0Q2hhbiA9ICZwc3lPdXRDaGFubmVsW2NoXTsKLSAgICBwZUNoYW5EYXRhID0gJnBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF07Ci0gICAgZm9yKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0Q2hhbi0+c2ZiQ250O3NmYkdycCs9IHBzeU91dENoYW4tPnNmYlBlckdyb3VwKXsKLSAgICAgIHBzZmJQZUZhY3RvcnMgPSBwZURhdGEtPnNmYlBlRmFjdG9yc1tjaF0gKyBzZmJHcnA7Ci0JICBwc2ZiTkFjdGl2ZUxpbmVzID0gcGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzICsgc2ZiR3JwOwotCSAgcGFoRmxhZyA9IGFoRmxhZ1tjaF0gKyBzZmJHcnA7Ci0JICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICAgIC8qIHBlIGRpZmZlcmVuY2UgZm9yIHRoaXMgc2ZiICovCi0gICAgICAgIGRlbHRhU2ZiUGUgPSAqcHNmYlBlRmFjdG9ycyAqIGRlbHRhUGU7Ci0KLQkJLyogdGhyMyhuKSA9IHRocjIobikqMl5kZWx0YVNmYlBlL2IobikgKi8KLSAgICAgICAgaWYgKCpwc2ZiTkFjdGl2ZUxpbmVzID4gMCAmJiAobm9ybUZhY3RvciogKCpwc2ZiTkFjdGl2ZUxpbmVzKSkgIT0gMCkgewotICAgICAgICAgIC8qIG5ldyB0aHJlc2hvbGQgKi8KLSAgICAgICAgICBXb3JkMzIgdGhyRmFjdG9yOwotICAgICAgICAgIHNmYkVuICA9IHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiXTsKLSAgICAgICAgICBzZmJUaHIgPSBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGRbc2ZiR3JwK3NmYl07Ci0KLSAgICAgICAgICAgaWYoZGVsdGFTZmJQZSA+PSAwKXsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgIHJlZHVjZSB0aHJlc2hvbGQKLSAgICAgICAgICAgICovCi0gICAgICAgICAgICB0aHJGYWN0b3IgPSBwb3cyX3h5KExfbmVnYXRlKGRlbHRhU2ZiUGUpLCAobm9ybUZhY3RvciogKCpwc2ZiTkFjdGl2ZUxpbmVzKSkpOwotCi0gICAgICAgICAgICBzZmJUaHJSZWR1Y2VkID0gTF9tcHlfbHMoc2ZiVGhyLCByb3VuZDE2KHRockZhY3RvcikpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgIGluY3JlYXNlIHRocmVzaG9sZAotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHRockZhY3RvciA9IHBvdzJfeHkoZGVsdGFTZmJQZSwgKG5vcm1GYWN0b3IgKiAoKnBzZmJOQWN0aXZlTGluZXMpKSk7Ci0KLQotICAgICAgICAgICAgaWYodGhyRmFjdG9yID4gc2ZiVGhyKSB7Ci0gICAgICAgICAgICAgIHNoaWZ0ID0gbm9ybV9sKHRockZhY3Rvcik7Ci0JCQkgIHNmYlRoclJlZHVjZWQgPSBEaXZfMzIoIHNmYlRociA8PCBzaGlmdCwgdGhyRmFjdG9yPDxzaGlmdCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgIHNmYlRoclJlZHVjZWQgPSBNQVhfMzI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiBhdm9pZCBob2xlICovCi0gICAgICAgICAgc2ZiRW4gPSBMX21weV9scyhzZmJFbiwgcHN5T3V0Q2hhbi0+c2ZiTWluU25yW3NmYkdycCtzZmJdKTsKLQotICAgICAgICAgIGlmICgoc2ZiVGhyUmVkdWNlZCA+IHNmYkVuKSAmJgotICAgICAgICAgICAgICAoKnBhaEZsYWcgPT0gQUhfSU5BQ1RJVkUpKSB7Ci0gICAgICAgICAgICBzZmJUaHJSZWR1Y2VkID0gbWF4KHNmYkVuLCBzZmJUaHIpOwotICAgICAgICAgICAgKnBhaEZsYWcgPSBBSF9BQ1RJVkU7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiVGhyZXNob2xkW3NmYkdycCtzZmJdID0gc2ZiVGhyUmVkdWNlZDsKLSAgICAgICAgfQotCi0JCXBhaEZsYWcrKzsgcHNmYk5BY3RpdmVMaW5lcysrOyBwc2ZiUGVGYWN0b3JzKys7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6cmVkdWNlTWluU25yCi0qIGRlc2NyaXB0aW9uOiBpZiB0aGUgZGVzaXJlZCBwZSBjYW4gbm90IGJlIHJlYWNoZWQsIHJlZHVjZSBwZSBieSByZWR1Y2luZyBtaW5TbnIKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCByZWR1Y2VNaW5TbnIoUFNZX09VVF9DSEFOTkVMICBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgUEVfREFUQSAgICAgICAgICpwZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICBhaEZsYWdbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgbkNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgZGVzaXJlZFBlKQotewotICBXb3JkMTYgY2gsIHNmYiwgc2ZiU3ViV2luOwotICBXb3JkMTYgZGVsdGFQZTsKLQotICAvKiBzdGFydCBhdCBoaWdoZXN0IGZyZXEgZG93biB0byAwICovCi0gIHNmYlN1YldpbiA9IHBzeU91dENoYW5uZWxbMF0ubWF4U2ZiUGVyR3JvdXA7Ci0gIHdoaWxlIChwZURhdGEtPnBlID4gZGVzaXJlZFBlICYmIHNmYlN1YldpbiA+IDApIHsKLQotICAgIHNmYlN1YldpbiA9IHNmYlN1YldpbiAtIDE7Ci0gICAgLyogbG9vcCBvdmVyIGFsbCBzdWJ3aW5kb3dzICovCi0gICAgZm9yIChzZmI9c2ZiU3ViV2luOyBzZmI8cHN5T3V0Q2hhbm5lbFswXS5zZmJDbnQ7Ci0gICAgICAgIHNmYis9cHN5T3V0Q2hhbm5lbFswXS5zZmJQZXJHcm91cCkgewotICAgICAgLyogbG9vcCBvdmVyIGFsbCBjaGFubmVscyAqLwotCQlQRV9DSEFOTkVMX0RBVEEqIHBlQ2hhbiA9IHBlRGF0YS0+cGVDaGFubmVsRGF0YTsKLQkJUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaCA9IHBzeU91dENoYW5uZWw7Ci0JCWZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgICAgIGlmIChhaEZsYWdbY2hdW3NmYl0gIT0gTk9fQUggJiYKLSAgICAgICAgICAgIHBzeU91dENoLT5zZmJNaW5TbnJbc2ZiXSA8IG1pblNuckxpbWl0KSB7Ci0gICAgICAgICAgcHN5T3V0Q2gtPnNmYk1pblNucltzZmJdID0gbWluU25yTGltaXQ7Ci0gICAgICAgICAgcHN5T3V0Q2gtPnNmYlRocmVzaG9sZFtzZmJdID0KLSAgICAgICAgICAgIExfbXB5X2xzKHBzeU91dENoLT5zZmJFbmVyZ3lbc2ZiXSwgcHN5T3V0Q2gtPnNmYk1pblNucltzZmJdKTsKLQotICAgICAgICAgIC8qIGNhbGMgbmV3IHBlICovCi0gICAgICAgICAgZGVsdGFQZSA9ICgocGVDaGFuLT5zZmJOTGluZXM0W3NmYl0gKyAocGVDaGFuLT5zZmJOTGluZXM0W3NmYl0gPj4gMSkpID4+IDIpIC0KLSAgICAgICAgICAgICAgcGVDaGFuLT5zZmJQZVtzZmJdOwotICAgICAgICAgIHBlRGF0YS0+cGUgPSBwZURhdGEtPnBlICsgZGVsdGFQZTsKLSAgICAgICAgICBwZUNoYW4tPnBlID0gcGVDaGFuLT5wZSArIGRlbHRhUGU7Ci0gICAgICAgIH0KLQkJcGVDaGFuICs9IDE7IHBzeU91dENoICs9IDE7Ci0gICAgICB9Ci0gICAgICAvKiBzdG9wIGlmIGVub3VnaCBoYXMgYmVlbiBzYXZlZCAqLwotCi0gICAgICBpZiAocGVEYXRhLT5wZSA8PSBkZXNpcmVkUGUpCi0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTphbGxvd01vcmVIb2xlcwotKiBkZXNjcmlwdGlvbjogaWYgdGhlIGRlc2lyZWQgcGUgY2FuIG5vdCBiZSByZWFjaGVkLCBzb21lIG1vcmUgc2NhbGVmYWN0b3IgYmFuZHMKLSogICAgICAgICAgICAgIGhhdmUgdG8gYmUgcXVhbnRpemVkIHRvIHplcm8KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhbGxvd01vcmVIb2xlcyhQU1lfT1VUX0NIQU5ORUwgIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCAqcHN5T3V0RWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFX0RBVEEgICAgICAgICAqcGVEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICBhaEZsYWdbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUhfUEFSQU0gICphaFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgIGRlc2lyZWRQZSkKLXsKLSAgV29yZDE2IGNoLCBzZmI7Ci0gIFdvcmQxNiBhY3RQZSwgc2hpZnQ7Ci0KLSAgYWN0UGUgPSBwZURhdGEtPnBlOwotCi0gIC8qIGZvciBNUyBhbGxvdyBob2xlIGluIHRoZSBjaGFubmVsIHdpdGggbGVzcyBlbmVyZ3kgKi8KLQotICBpZiAobkNoYW5uZWxzPT0yICYmCi0gICAgICBwc3lPdXRDaGFubmVsWzBdLndpbmRvd1NlcXVlbmNlPT1wc3lPdXRDaGFubmVsWzFdLndpbmRvd1NlcXVlbmNlKSB7Ci0gICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuTCA9ICZwc3lPdXRDaGFubmVsWzBdOwotICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhblIgPSAmcHN5T3V0Q2hhbm5lbFsxXTsKLSAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbkwtPnNmYkNudDsgc2ZiKyspIHsKLSAgICAgIFdvcmQzMiBtaW5FbjsKLQotICAgICAgaWYgKHBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc01hc2tbc2ZiXSkgewotICAgICAgICAvKiBhbGxvdyBob2xlIGluIHNpZGUgY2hhbm5lbCA/ICovCi0gICAgICAgIG1pbkVuID0gTF9tcHlfbHMocHN5T3V0Q2hhbkwtPnNmYkVuZXJneVtzZmJdLCAobWluU25yTGltaXQgKiBwc3lPdXRDaGFuTC0+c2ZiTWluU25yW3NmYl0pID4+IDE2KTsKLQotICAgICAgICBpZiAoYWhGbGFnWzFdW3NmYl0gIT0gTk9fQUggJiYKLSAgICAgICAgICAgIG1pbkVuID4gcHN5T3V0Q2hhblItPnNmYkVuZXJneVtzZmJdKSB7Ci0gICAgICAgICAgYWhGbGFnWzFdW3NmYl0gPSBOT19BSDsKLSAgICAgICAgICBwc3lPdXRDaGFuUi0+c2ZiVGhyZXNob2xkW3NmYl0gPSBMX2FkZChwc3lPdXRDaGFuUi0+c2ZiRW5lcmd5W3NmYl0sIHBzeU91dENoYW5SLT5zZmJFbmVyZ3lbc2ZiXSk7Ci0gICAgICAgICAgYWN0UGUgPSBhY3RQZSAtIHBlRGF0YS0+cGVDaGFubmVsRGF0YVsxXS5zZmJQZVtzZmJdOwotICAgICAgICB9Ci0gICAgICAgIC8qIGFsbG93IGhvbGUgaW4gbWlkIGNoYW5uZWwgPyAqLwotICAgICAgICBlbHNlIHsKLSAgICAgICAgbWluRW4gPSBMX21weV9scyhwc3lPdXRDaGFuUi0+c2ZiRW5lcmd5W3NmYl0sIChtaW5TbnJMaW1pdCAqIHBzeU91dENoYW5SLT5zZmJNaW5TbnJbc2ZiXSkgPj4gMTYpOwotCi0gICAgICAgICAgaWYgKGFoRmxhZ1swXVtzZmJdIT0gTk9fQUggJiYKLSAgICAgICAgICAgICAgbWluRW4gPiBwc3lPdXRDaGFuTC0+c2ZiRW5lcmd5W3NmYl0pIHsKLSAgICAgICAgICAgIGFoRmxhZ1swXVtzZmJdID0gTk9fQUg7Ci0gICAgICAgICAgICBwc3lPdXRDaGFuTC0+c2ZiVGhyZXNob2xkW3NmYl0gPSBMX2FkZChwc3lPdXRDaGFuTC0+c2ZiRW5lcmd5W3NmYl0sIHBzeU91dENoYW5MLT5zZmJFbmVyZ3lbc2ZiXSk7Ci0gICAgICAgICAgICBhY3RQZSA9IGFjdFBlIC0gcGVEYXRhLT5wZUNoYW5uZWxEYXRhWzBdLnNmYlBlW3NmYl07Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFjdFBlIDwgZGVzaXJlZFBlKQotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIHN1YnNlcXVlbnRseSBlcmFzZSBiYW5kcyAqLwotICBpZiAoYWN0UGUgPiBkZXNpcmVkUGUpIHsKLSAgICBXb3JkMTYgc3RhcnRTZmJbMl07Ci0gICAgV29yZDMyIGF2Z0VuLCBtaW5FbjsKLSAgICBXb3JkMTYgYWhDbnQ7Ci0gICAgV29yZDE2IGVuSWR4OwotICAgIFdvcmQxNiBlbkRpZmY7Ci0gICAgV29yZDMyIGVuWzRdOwotICAgIFdvcmQxNiBtaW5TZmIsIG1heFNmYjsKLSAgICBGbGFnICAgZG9uZTsKLQotICAgIC8qIGRvIG5vdCBnbyBiZWxvdyBzdGFydFNmYiAqLwotICAgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7Ci0KLSAgICAgIGlmIChwc3lPdXRDaGFubmVsW2NoXS53aW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpCi0gICAgICAgIHN0YXJ0U2ZiW2NoXSA9IGFoUGFyYW0tPnN0YXJ0U2ZiTDsKLSAgICAgIGVsc2UKLSAgICAgICAgc3RhcnRTZmJbY2hdID0gYWhQYXJhbS0+c3RhcnRTZmJTOwotICAgIH0KLQotICAgIGF2Z0VuID0gMDsKLSAgICBtaW5FbiA9IE1BWF8zMjsKLSAgICBhaENudCA9IDA7Ci0gICAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKLSAgICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9ICZwc3lPdXRDaGFubmVsW2NoXTsKLSAgICAgIGZvciAoc2ZiPXN0YXJ0U2ZiW2NoXTsgc2ZiPHBzeU91dENoYW4tPnNmYkNudDsgc2ZiKyspIHsKLQotICAgICAgICBpZiAoKGFoRmxhZ1tjaF1bc2ZiXSAhPSBOT19BSCkgJiYKLSAgICAgICAgICAgIChwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiXSA+IHBzeU91dENoYW4tPnNmYlRocmVzaG9sZFtzZmJdKSkgewotICAgICAgICAgIG1pbkVuID0gbWluKG1pbkVuLCBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiXSk7Ci0gICAgICAgICAgYXZnRW4gPSBMX2FkZChhdmdFbiwgcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYl0pOwotICAgICAgICAgIGFoQ250Kys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihhaENudCkgewotICAgICAgV29yZDMyIGlhaENudDsKLSAgICAgIHNoaWZ0ID0gbm9ybV9sKGFoQ250KTsKLQkgIGlhaENudCA9IERpdl8zMiggMSA8PCBzaGlmdCwgYWhDbnQgPDwgc2hpZnQgKTsKLSAgICAgIGF2Z0VuID0gZml4bXVsKGF2Z0VuLCBpYWhDbnQpOwotICAgIH0KLQotICAgIGVuRGlmZiA9IGlMb2c0KGF2Z0VuKSAtIGlMb2c0KG1pbkVuKTsKLSAgICAvKiBjYWxjIHNvbWUgZW5lcmd5IGJvcmRlcnMgYmV0d2VlbiBtaW5FbiBhbmQgYXZnRW4gKi8KLSAgICBmb3IgKGVuSWR4PTA7IGVuSWR4PDQ7IGVuSWR4KyspIHsKLSAgICAgIFdvcmQzMiBlbkZhYzsKLSAgICAgIGVuRmFjID0gKCg2LShlbklkeCA8PCAxKSkgKiBlbkRpZmYpOwotICAgICAgZW5bZW5JZHhdID0gZml4bXVsKGF2Z0VuLCBwb3cyX3h5KExfbmVnYXRlKGVuRmFjKSw3KjQpKTsKLSAgICB9Ci0KLSAgICAvKiBzdGFydCB3aXRoIGxvd2VzdCBlbmVyZ3kgYm9yZGVyIGF0IGhpZ2hlc3Qgc2ZiICovCi0gICAgbWF4U2ZiID0gcHN5T3V0Q2hhbm5lbFswXS5zZmJDbnQgLSAxOwotICAgIG1pblNmYiA9IHN0YXJ0U2ZiWzBdOwotCi0gICAgaWYgKG5DaGFubmVscyA9PSAyKSB7Ci0gICAgICBtYXhTZmIgPSBtYXgobWF4U2ZiLCAocHN5T3V0Q2hhbm5lbFsxXS5zZmJDbnQgLSAxKSk7Ci0gICAgICBtaW5TZmIgPSBtaW4obWluU2ZiLCBzdGFydFNmYlsxXSk7Ci0gICAgfQotCi0gICAgc2ZiID0gbWF4U2ZiOwotICAgIGVuSWR4ID0gMDsKLSAgICBkb25lID0gMDsKLSAgICB3aGlsZSAoIWRvbmUpIHsKLQotICAgICAgZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKLSAgICAgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuID0gJnBzeU91dENoYW5uZWxbY2hdOwotCi0gICAgICAgIGlmIChzZmI+PXN0YXJ0U2ZiW2NoXSAmJiBzZmI8cHN5T3V0Q2hhbi0+c2ZiQ250KSB7Ci0gICAgICAgICAgLyogc2ZiIGVuZXJneSBiZWxvdyBib3JkZXIgPyAqLwotCi0gICAgICAgICAgaWYgKGFoRmxhZ1tjaF1bc2ZiXSAhPSBOT19BSCAmJiBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiXSA8IGVuW2VuSWR4XSl7Ci0gICAgICAgICAgICAvKiBhbGxvdyBob2xlICovCi0gICAgICAgICAgICBhaEZsYWdbY2hdW3NmYl0gPSBOT19BSDsKLSAgICAgICAgICAgIHBzeU91dENoYW4tPnNmYlRocmVzaG9sZFtzZmJdID0gTF9hZGQocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYl0sIHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJdKTsKLSAgICAgICAgICAgIGFjdFBlID0gYWN0UGUgLSBwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdLnNmYlBlW3NmYl07Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKGFjdFBlIDwgZGVzaXJlZFBlKSB7Ci0gICAgICAgICAgICBkb25lID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgc2ZiID0gc2ZiIC0gMTsKLQotICAgICAgaWYgKHNmYiA8IG1pblNmYikgewotICAgICAgICAvKiByZXN0YXJ0IHdpdGggbmV4dCBlbmVyZ3kgYm9yZGVyICovCi0gICAgICAgIHNmYiA9IG1heFNmYjsKLSAgICAgICAgZW5JZHggPSBlbklkeCArIDE7Ci0KLSAgICAgICAgaWYgKGVuSWR4IC0gNCA+PSAwKQotICAgICAgICAgIGRvbmUgPSAxOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTphZGFwdFRocmVzaG9sZHNUb1BlCi0qIGRlc2NyaXB0aW9uOiB0d28gZ3Vlc3NlcyBmb3IgdGhlIHJlZHVjdGlvbiB2YWx1ZSBhbmQgb25lIGZpbmFsIGNvcnJlY3Rpb24gb2YgdGhlCi0qICAgICAgICAgICAgICB0aHJlc2hvbGRzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYWRhcHRUaHJlc2hvbGRzVG9QZShQU1lfT1VUX0NIQU5ORUwgICAgIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UICAgICpwc3lPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgICAgIGxvZ1NmYkVuZXJneVtNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFX0RBVEEgICAgICAgICAgICAqcGVEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgIG5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICBkZXNpcmVkUGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFIX1BBUkFNICAgICAgICAgICAqYWhQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlOU05SX0FEQVBUX1BBUkFNICptc2FQYXJhbSkKLXsKLSAgV29yZDE2IG5vUmVkUGUsIHJlZFBlLCByZWRQZU5vQUg7Ci0gIFdvcmQxNiBjb25zdFBhcnQsIGNvbnN0UGFydE5vQUg7Ci0gIFdvcmQxNiBuQWN0aXZlTGluZXMsIG5BY3RpdmVMaW5lc05vQUg7Ci0gIFdvcmQxNiBkZXNpcmVkUGVOb0FIOwotICBXb3JkMzIgcmVkVmFsLCBhdmdUaHJFeHA7Ci0gIFdvcmQzMiBpdGVyOwotCi0gIGNhbGNUaHJlc2hFeHAocGVEYXRhLT50aHJFeHAsIHBzeU91dENoYW5uZWwsIG5DaGFubmVscyk7Ci0KLSAgYWRhcHRNaW5TbnIocHN5T3V0Q2hhbm5lbCwgbG9nU2ZiRW5lcmd5LCBtc2FQYXJhbSwgbkNoYW5uZWxzKTsKLQotICBpbml0QXZvaWRIb2xlRmxhZyhwZURhdGEtPmFoRmxhZywgcHN5T3V0Q2hhbm5lbCwgcHN5T3V0RWxlbWVudCwgbkNoYW5uZWxzLCBhaFBhcmFtKTsKLQotICBub1JlZFBlID0gcGVEYXRhLT5wZTsKLSAgY29uc3RQYXJ0ID0gcGVEYXRhLT5jb25zdFBhcnQ7Ci0gIG5BY3RpdmVMaW5lcyA9IHBlRGF0YS0+bkFjdGl2ZUxpbmVzOwotCi0gIC8qIGZpcnN0IGd1ZXNzIG9mIHJlZHVjdGlvbiB2YWx1ZSB0XjAuMjUgPSAyXigoYS1wZW4pLzQqYikgKi8KLSAgYXZnVGhyRXhwID0gcG93Ml94eSgoY29uc3RQYXJ0IC0gbm9SZWRQZSksIChuQWN0aXZlTGluZXMgPDwgMikpOwotCi0gIC8qIHIxID0gMl4oKGEtcGVyKS80KmIpIC0gdF4wLjI1ICovCi0gIHJlZFZhbCA9IHBvdzJfeHkoKGNvbnN0UGFydCAtIGRlc2lyZWRQZSksIChuQWN0aXZlTGluZXMgPDwgMikpIC0gYXZnVGhyRXhwOwotCi0gIC8qIHJlZHVjZSB0aHJlc2hvbGRzICovCi0gIHJlZHVjZVRocmVzaG9sZHMocHN5T3V0Q2hhbm5lbCwgcGVEYXRhLT5haEZsYWcsIHBlRGF0YS0+dGhyRXhwLCBuQ2hhbm5lbHMsIHJlZFZhbCk7Ci0KLSAgLyogcGUgYWZ0ZXIgZmlyc3QgZ3Vlc3MgKi8KLSAgY2FsY1NmYlBlKHBlRGF0YSwgcHN5T3V0Q2hhbm5lbCwgbkNoYW5uZWxzKTsKLSAgcmVkUGUgPSBwZURhdGEtPnBlOwotCi0gIGl0ZXIgPSAwOwotICBkbyB7Ci0gICAgLyogcGUgZm9yIGJhbmRzIHdoZXJlIGF2b2lkIGhvbGUgaXMgaW5hY3RpdmUgKi8KLSAgICBjYWxjUGVOb0FIKCZyZWRQZU5vQUgsICZjb25zdFBhcnROb0FILCAmbkFjdGl2ZUxpbmVzTm9BSCwKLSAgICAgICAgICAgICAgIHBlRGF0YSwgcGVEYXRhLT5haEZsYWcsIHBzeU91dENoYW5uZWwsIG5DaGFubmVscyk7Ci0KLSAgICBkZXNpcmVkUGVOb0FIID0gZGVzaXJlZFBlIC0ocmVkUGUgLSByZWRQZU5vQUgpOwotCi0gICAgaWYgKGRlc2lyZWRQZU5vQUggPCAwKSB7Ci0gICAgICBkZXNpcmVkUGVOb0FIID0gMDsKLSAgICB9Ci0KLSAgICAvKiBzZWNvbmQgZ3Vlc3MgKi8KLQotICAgIGlmIChuQWN0aXZlTGluZXNOb0FIID4gMCkgewotCi0JCWF2Z1RockV4cCA9IHBvdzJfeHkoKGNvbnN0UGFydE5vQUggLSByZWRQZU5vQUgpLCAobkFjdGl2ZUxpbmVzTm9BSCA8PCAyKSk7Ci0KLQkJcmVkVmFsID0gKHJlZFZhbCArIHBvdzJfeHkoKGNvbnN0UGFydE5vQUggLSBkZXNpcmVkUGVOb0FIKSwgKG5BY3RpdmVMaW5lc05vQUggPDwgMikpKSAtIGF2Z1RockV4cDsKLQotCQkvKiByZWR1Y2UgdGhyZXNob2xkcyAqLwotCQlyZWR1Y2VUaHJlc2hvbGRzKHBzeU91dENoYW5uZWwsIHBlRGF0YS0+YWhGbGFnLCBwZURhdGEtPnRockV4cCwgbkNoYW5uZWxzLCByZWRWYWwpOwotICAgIH0KLQotICAgIGNhbGNTZmJQZShwZURhdGEsIHBzeU91dENoYW5uZWwsIG5DaGFubmVscyk7Ci0gICAgcmVkUGUgPSBwZURhdGEtPnBlOwotCi0gICAgaXRlciA9IGl0ZXIrMTsKLQotICB9IHdoaWxlICgoMjAgKiBhYnNfcyhyZWRQZSAtIGRlc2lyZWRQZSkgPiBkZXNpcmVkUGUpICYmIChpdGVyIDwgMikpOwotCi0KLSAgaWYgKCgxMDAgKiByZWRQZSA8IDExNSAqIGRlc2lyZWRQZSkpIHsKLSAgICBjb3JyZWN0VGhyZXNoKHBzeU91dENoYW5uZWwsIHBlRGF0YS0+YWhGbGFnLCBwZURhdGEsIHBlRGF0YS0+dGhyRXhwLCByZWRWYWwsCi0gICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsIGRlc2lyZWRQZSAtIHJlZFBlKTsKLSAgfQotICBlbHNlIHsKLSAgICBXb3JkMTYgZGVzaXJlZFBlMTA1ID0gKDEwNSAqIGRlc2lyZWRQZSkgLyAxMDA7Ci0gICAgcmVkdWNlTWluU25yKHBzeU91dENoYW5uZWwsIHBlRGF0YSwgcGVEYXRhLT5haEZsYWcsCi0gICAgICAgICAgICAgICAgIG5DaGFubmVscywgZGVzaXJlZFBlMTA1KTsKLSAgICBhbGxvd01vcmVIb2xlcyhwc3lPdXRDaGFubmVsLCBwc3lPdXRFbGVtZW50LCBwZURhdGEsIHBlRGF0YS0+YWhGbGFnLAotICAgICAgICAgICAgICAgICAgIGFoUGFyYW0sIG5DaGFubmVscywgZGVzaXJlZFBlMTA1KTsKLSAgfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBjYWxjQml0U2F2ZQotKiBkZXNjcmlwdGlvbjogIENhbGN1bGF0ZXMgcGVyY2VudGFnZSBvZiBiaXQgc2F2ZSwgc2VlIGZpZ3VyZSBiZWxvdwotKiByZXR1cm5zOgotKiBpbnB1dDogICAgICAgIHBhcmFtZXRlcnMgYW5kIGJpdHJlcy1mdWxsbmVzcwotKiBvdXRwdXQ6ICAgICAgIHBlcmNlbnRhZ2Ugb2YgYml0IHNhdmUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQxNiBjYWxjQml0U2F2ZShXb3JkMTYgZmlsbExldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgY2xpcExvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IGNsaXBIaWdoLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbWluQml0U2F2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IG1heEJpdFNhdmUpCi17Ci0gIFdvcmQxNiBiaXRzYXZlID0gMDsKLQotICBmaWxsTGV2ZWwgPSBtYXgoZmlsbExldmVsLCBjbGlwTG93KTsKLSAgZmlsbExldmVsID0gbWluKGZpbGxMZXZlbCwgY2xpcEhpZ2gpOwotCi0gIGlmKGNsaXBIaWdoLWNsaXBMb3cpCi0gIGJpdHNhdmUgPSAobWF4Qml0U2F2ZSAtICgoKG1heEJpdFNhdmUtbWluQml0U2F2ZSkqKGZpbGxMZXZlbC1jbGlwTG93KSkvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpcEhpZ2gtY2xpcExvdykpKTsKLQotICByZXR1cm4gKGJpdHNhdmUpOwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGNhbGNCaXRTcGVuZAotKiBkZXNjcmlwdGlvbjogIENhbGN1bGF0ZXMgcGVyY2VudGFnZSBvZiBiaXQgc3BlbmQsIHNlZSBmaWd1cmUgYmVsb3cKLSogcmV0dXJuczoKLSogaW5wdXQ6ICAgICAgICBwYXJhbWV0ZXJzIGFuZCBiaXRyZXMtZnVsbG5lc3MKLSogb3V0cHV0OiAgICAgICBwZXJjZW50YWdlIG9mIGJpdCBzcGVuZAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDE2IGNhbGNCaXRTcGVuZChXb3JkMTYgZmlsbExldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IGNsaXBMb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgY2xpcEhpZ2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbWluQml0U3BlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbWF4Qml0U3BlbmQpCi17Ci0gIFdvcmQxNiBiaXRzcGVuZCA9IDE7Ci0KLSAgZmlsbExldmVsID0gbWF4KGZpbGxMZXZlbCwgY2xpcExvdyk7Ci0gIGZpbGxMZXZlbCA9IG1pbihmaWxsTGV2ZWwsIGNsaXBIaWdoKTsKLQotICBpZihjbGlwSGlnaC1jbGlwTG93KQotICBiaXRzcGVuZCA9IChtaW5CaXRTcGVuZCArICgobWF4Qml0U3BlbmQgLSBtaW5CaXRTcGVuZCkqKGZpbGxMZXZlbCAtIGNsaXBMb3cpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaXBIaWdoLWNsaXBMb3cpKSk7Ci0KLSAgcmV0dXJuIChiaXRzcGVuZCk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGFkanVzdFBlTWluTWF4KCkKLSogZGVzY3JpcHRpb246ICBhZGp1c3RzIHBlTWluIGFuZCBwZU1heCBwYXJhbWV0ZXJzIG92ZXIgdGltZQotKiByZXR1cm5zOgotKiBpbnB1dDogICAgICAgIGN1cnJlbnQgcGUsIHBlTWluLCBwZU1heAotKiBvdXRwdXQ6ICAgICAgIGFkanVzdGVkIHBlTWluL3BlTWF4Ci0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGFkanVzdFBlTWluTWF4KGNvbnN0IFdvcmQxNiBjdXJyUGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAqcGVNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAqcGVNYXgpCi17Ci0gIFdvcmQxNiBtaW5GYWNIaSwgbWF4RmFjSGksIG1pbkZhY0xvLCBtYXhGYWNMbzsKLSAgV29yZDE2IGRpZmY7Ci0gIFdvcmQxNiBtaW5EaWZmID0gZXh0cmFjdF9sKGN1cnJQZSAvIDYpOwotICBtaW5GYWNIaSA9IDMwOwotICBtYXhGYWNIaSA9IDEwMDsKLSAgbWluRmFjTG8gPSAxNDsKLSAgbWF4RmFjTG8gPSA3OwotCi0gIGRpZmYgPSBjdXJyUGUgLSAqcGVNYXggOwotCi0gIGlmIChkaWZmID4gMCkgewotICAgICpwZU1pbiA9ICpwZU1pbiArICgoZGlmZiAqIG1pbkZhY0hpKSAvIDEwMCk7Ci0gICAgKnBlTWF4ID0gKnBlTWF4ICsgKChkaWZmICogbWF4RmFjSGkpIC8gMTAwKTsKLSAgfSBlbHNlIHsKLSAgICBkaWZmID0gKnBlTWluIC0gY3VyclBlOwotCi0gICAgaWYgKGRpZmYgPiAwKSB7Ci0gICAgICAqcGVNaW4gPSAqcGVNaW4gLSAoKGRpZmYgKiBtaW5GYWNMbykgLyAxMDApOwotICAgICAgKnBlTWF4ID0gKnBlTWF4IC0gKChkaWZmICogbWF4RmFjTG8pIC8gMTAwKTsKLSAgICB9IGVsc2UgewotICAgICAgKnBlTWluID0gKnBlTWluICsgKChjdXJyUGUgLSAqcGVNaW4pICogbWluRmFjSGkgLyAxMDApOwotICAgICAgKnBlTWF4ID0gKnBlTWF4IC0gKCgqcGVNYXggLSBjdXJyUGUpICogbWF4RmFjTG8gLyAxMDApOwotICAgIH0KLSAgfQotCi0KLSAgaWYgKCgqcGVNYXggLSAqcGVNaW4pIDwgbWluRGlmZikgewotICAgIFdvcmQxNiBwYXJ0TG8sIHBhcnRIaTsKLQotICAgIHBhcnRMbyA9IG1heCgwLCAoY3VyclBlIC0gKnBlTWluKSk7Ci0gICAgcGFydEhpID0gbWF4KDAsICgqcGVNYXggLSBjdXJyUGUpKTsKLQotICAgICpwZU1heCA9IGN1cnJQZSArICgocGFydEhpICogbWluRGlmZikgLyAocGFydExvICsgcGFydEhpKSk7Ci0gICAgKnBlTWluID0gY3VyclBlIC0gKChwYXJ0TG8gKiBtaW5EaWZmKSAvIChwYXJ0TG8gKyBwYXJ0SGkpKTsKLSAgICAqcGVNaW4gPSBtYXgoMCwgKnBlTWluKTsKLSAgfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBCaXRyZXNDYWxjQml0RmFjCi0qIGRlc2NyaXB0aW9uOiAgY2FsY3VsYXRlcyBmYWN0b3Igb2Ygc3BlbmRpbmcgYml0cyBmb3Igb25lIGZyYW1lCi0qICAgICAgICAgICAgICAgIDEuMCA6IHRha2UgYWxsIGZyYW1lIGR5bnBhcnQgYml0cwotKiAgICAgICAgICAgICAgICA+MS4wIDogdGFrZSBhbGwgZnJhbWUgZHlucGFydCBiaXRzICsgYml0cmVzCi0qICAgICAgICAgICAgICAgIDwxLjAgOiBwdXQgYml0cyBpbiBiaXRyZXNlcnZvaXIKLSogIHJldHVybnM6ICAgICAgQml0RmFjKjEwMAotKiAgaW5wdXQ6ICAgICAgICBiaXRyZXMtZnVsbG5lc3MsIHBlLCBibG9ja1R5cGUsIHBhcmFtZXRlci1zZXR0aW5ncwotKiAgb3V0cHV0OgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDE2IGJpdHJlc0NhbGNCaXRGYWMoIGNvbnN0IFdvcmQxNiAgIGJpdHJlc0JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgIG1heEJpdHJlc0JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgIHBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICB3aW5kb3dTZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgYXZnQml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgbWF4Qml0RmFjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpfVEhSX1NUQVRFICpBZGpUaHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUU19FTEVNRU5UICAgKmFkalRockNoYW4pCi17Ci0gIEJSRVNfUEFSQU0gKmJyZXNQYXJhbTsKLSAgV29yZDE2IHBleDsKLSAgV29yZDE2IGZpbGxMZXZlbDsKLSAgV29yZDE2IGJpdFNhdmUsIGJpdFNwZW5kLCBiaXRyZXNGYWM7Ci0KLSAgZmlsbExldmVsID0gZXh0cmFjdF9sKCgxMDAqIGJpdHJlc0JpdHMpIC8gbWF4Qml0cmVzQml0cyk7Ci0KLSAgaWYgKHdpbmRvd1NlcXVlbmNlICE9IFNIT1JUX1dJTkRPVykKLSAgICBicmVzUGFyYW0gPSAmKEFkalRoci0+YnJlc1BhcmFtTG9uZyk7Ci0gIGVsc2UKLSAgICBicmVzUGFyYW0gPSAmKEFkalRoci0+YnJlc1BhcmFtU2hvcnQpOwotCi0gIHBleCA9IG1heChwZSwgYWRqVGhyQ2hhbi0+cGVNaW4pOwotICBwZXggPSBtaW4ocGV4LGFkalRockNoYW4tPnBlTWF4KTsKLQotICBiaXRTYXZlID0gY2FsY0JpdFNhdmUoZmlsbExldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgYnJlc1BhcmFtLT5jbGlwU2F2ZUxvdywgYnJlc1BhcmFtLT5jbGlwU2F2ZUhpZ2gsCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVzUGFyYW0tPm1pbkJpdFNhdmUsIGJyZXNQYXJhbS0+bWF4Qml0U2F2ZSk7Ci0KLSAgYml0U3BlbmQgPSBjYWxjQml0U3BlbmQoZmlsbExldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVzUGFyYW0tPmNsaXBTcGVuZExvdywgYnJlc1BhcmFtLT5jbGlwU3BlbmRIaWdoLAotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVzUGFyYW0tPm1pbkJpdFNwZW5kLCBicmVzUGFyYW0tPm1heEJpdFNwZW5kKTsKLQotICBpZihhZGpUaHJDaGFuLT5wZU1heCAhPSBhZGpUaHJDaGFuLT5wZU1pbikKLQliaXRyZXNGYWMgPSAoMTAwIC0gYml0U2F2ZSkgKyBleHRyYWN0X2woKChiaXRTcGVuZCArIGJpdFNhdmUpICogKHBleCAtIGFkalRockNoYW4tPnBlTWluKSkgLwotICAgICAgICAgICAgICAgICAgICAoYWRqVGhyQ2hhbi0+cGVNYXggLSBhZGpUaHJDaGFuLT5wZU1pbikpOwotICBlbHNlCi0JYml0cmVzRmFjID0gMHg3ZmZmOwotCi0gIGJpdHJlc0ZhYyA9IG1pbihiaXRyZXNGYWMsCi0gICAgICAgICAgICAgICAgICAgICgxMDAtMzAgKyBleHRyYWN0X2woKDEwMCAqIGJpdHJlc0JpdHMpIC8gYXZnQml0cykpKTsKLQotICBiaXRyZXNGYWMgPSBtaW4oYml0cmVzRmFjLCBtYXhCaXRGYWMpOwotCi0gIGFkanVzdFBlTWluTWF4KHBlLCAmYWRqVGhyQ2hhbi0+cGVNaW4sICZhZGpUaHJDaGFuLT5wZU1heCk7Ci0KLSAgcmV0dXJuIGJpdHJlc0ZhYzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IEFkalRockluaXQKLSogZGVzY3JpcHRpb246ICBpbml0IHRocmVzaG9sZHMgcGFyYW1ldGVyCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQWRqVGhySW5pdChBREpfVEhSX1NUQVRFICpoQWRqVGhyLAotICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiAgIG1lYW5QZSwKLSAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgICBjaEJpdHJhdGUpCi17Ci0gIEFUU19FTEVNRU5UKiBhdHNFbGVtID0gJmhBZGpUaHItPmFkalRoclN0YXRlRWxlbTsKLSAgTUlOU05SX0FEQVBUX1BBUkFNICptc2FQYXJhbSA9ICZhdHNFbGVtLT5taW5TbnJBZGFwdFBhcmFtOwotCi0gIC8qIGNvbW1vbiBmb3IgYWxsIGVsZW1lbnRzOiAqLwotICAvKiBwYXJhbWV0ZXJzIGZvciBiaXRyZXMgY29udHJvbCAqLwotICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLmNsaXBTYXZlTG93ICAgPSAgMjA7Ci0gIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcuY2xpcFNhdmVIaWdoICA9ICA5NTsKLSAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5taW5CaXRTYXZlICAgID0gIC01OwotICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLm1heEJpdFNhdmUgICAgPSAgMzA7Ci0gIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcuY2xpcFNwZW5kTG93ICA9ICAyMDsKLSAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5jbGlwU3BlbmRIaWdoID0gIDk1OwotICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLm1pbkJpdFNwZW5kICAgPSAtMTA7Ci0gIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcubWF4Qml0U3BlbmQgICA9ICA0MDsKLQotICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5jbGlwU2F2ZUxvdyAgID0gIDIwOwotICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5jbGlwU2F2ZUhpZ2ggID0gIDc1OwotICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5taW5CaXRTYXZlICAgID0gICAwOwotICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5tYXhCaXRTYXZlICAgID0gIDIwOwotICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5jbGlwU3BlbmRMb3cgID0gIDIwOwotICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5jbGlwU3BlbmRIaWdoID0gIDc1OwotICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5taW5CaXRTcGVuZCAgID0gLTU7Ci0gIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0Lm1heEJpdFNwZW5kICAgPSAgNTA7Ci0KLSAgLyogc3BlY2lmaWMgZm9yIGVhY2ggZWxlbWVudDogKi8KLQotICAvKiBwYXJhbWV0ZXJzIGZvciBiaXRyZXMgY29udHJvbCAqLwotICBhdHNFbGVtLT5wZU1pbiA9IGV4dHJhY3RfbCgoKDgwKm1lYW5QZSkgLyAxMDApKTsKLSAgYXRzRWxlbS0+cGVNYXggPSBleHRyYWN0X2woKCgxMjAqbWVhblBlKSAvIDEwMCkpOwotCi0gIC8qIGFkZGl0aW9uYWwgcGUgb2Zmc2V0IHRvIGNvcnJlY3QgcGUyYml0cyBmb3IgbG93IGJpdHJhdGVzICovCi0gIGF0c0VsZW0tPnBlT2Zmc2V0ID0gMDsKLSAgaWYgKGNoQml0cmF0ZSA8IDMyMDAwKSB7Ci0gICAgYXRzRWxlbS0+cGVPZmZzZXQgPSBtYXgoNTAsICgxMDAgLSBleHRyYWN0X2woKDEwMCAqIGNoQml0cmF0ZSkgLyAzMjAwMCkpKTsKLSAgfQotCi0gIC8qIGF2b2lkIGhvbGUgcGFyYW1ldGVycyAqLwotICBpZiAoY2hCaXRyYXRlID4gMjAwMDApIHsKLSAgICBhdHNFbGVtLT5haFBhcmFtLm1vZGlmeU1pblNuciA9IFRSVUU7Ci0gICAgYXRzRWxlbS0+YWhQYXJhbS5zdGFydFNmYkwgPSAxNTsKLSAgICBhdHNFbGVtLT5haFBhcmFtLnN0YXJ0U2ZiUyA9IDM7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgYXRzRWxlbS0+YWhQYXJhbS5tb2RpZnlNaW5TbnIgPSBGQUxTRTsKLSAgICBhdHNFbGVtLT5haFBhcmFtLnN0YXJ0U2ZiTCA9IDA7Ci0gICAgYXRzRWxlbS0+YWhQYXJhbS5zdGFydFNmYlMgPSAwOwotICB9Ci0KLSAgLyogbWluU25yIGFkYXB0YXRpb24gKi8KLSAgLyogbWF4aW11bSByZWR1Y3Rpb24gb2YgbWluU25yIGdvZXMgZG93biB0byBtaW5TbnJebWF4UmVkICovCi0gIG1zYVBhcmFtLT5tYXhSZWQgPSAweDIwMDAwMDAwOyAgICAgLyogKjAuMjVmICovCi0gIC8qIHN0YXJ0IGFkYXB0YXRpb24gb2YgbWluU25yIGZvciBhdmdFbi9zZmJFbiA+IHN0YXJ0UmF0aW8gKi8KLSAgbXNhUGFyYW0tPnN0YXJ0UmF0aW8gPSAweDBjY2NjY2NkOyAvKiAxMCAqLwotICAvKiBtYXhpbXVtIG1pblNuciByZWR1Y3Rpb24gdG8gbWluU25yXm1heFJlZCBpcyByZWFjaGVkIGZvcgotICAgICBhdmdFbi9zZmJFbiA+PSBtYXhSYXRpbyAqLwotICBtc2FQYXJhbS0+bWF4UmF0aW8gPSAgMHgwMDIwYzQ5YzsgLyogMTAwMCAqLwotICAvKiBoZWxwZXIgdmFyaWFibGVzIHRvIGludGVycG9sYXRlIG1pblNuciByZWR1Y3Rpb24gZm9yCi0gICAgIGF2Z0VuL3NmYkVuIGJldHdlZW4gc3RhcnRSYXRpbyBhbmQgbWF4UmF0aW8gKi8KLQotICBtc2FQYXJhbS0+cmVkUmF0aW9GYWMgPSAweGZiMzMzMzMzOyAvKiAtMC43NS8yMCAqLwotCi0gIG1zYVBhcmFtLT5yZWRPZmZzID0gMHgzMDAwMDAwMDsgIC8qIG1zYVBhcmFtLT5yZWRSYXRpb0ZhYyAqIDEwKmxvZzEwKG1zYVBhcmFtLT5zdGFydFJhdGlvKSAqLwotCi0KLSAgLyogcGUgY29ycmVjdGlvbiAqLwotICBhdHNFbGVtLT5wZUxhc3QgPSAwOwotICBhdHNFbGVtLT5keW5CaXRzTGFzdCA9IDA7Ci0gIGF0c0VsZW0tPnBlQ29ycmVjdGlvbkZhY3RvciA9IDEwMDsgLyogMS4wICovCi0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGNhbGNQZUNvcnJlY3Rpb24KLSogZGVzY3JpcHRpb246ICBjYWxjdWxhdGVzIHRoZSBkZXNpcmVkIHBlcmNlcHR1YWwgZW50cm9weSBmYWN0b3IKLSoJCQkJSXQgaXMgYmV0d2VlbiAwLjg1IGFuZCAxLjE1Ci0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGNhbGNQZUNvcnJlY3Rpb24oV29yZDE2ICpjb3JyZWN0aW9uRmFjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgcGVBY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBwZUxhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBiaXRzTGFzdCkKLXsKLSAgV29yZDMyIHBlQWN0MTAwID0gMTAwICogcGVBY3Q7Ci0gIFdvcmQzMiBwZUxhc3QxMDAgPSAxMDAgKiBwZUxhc3Q7Ci0gIFdvcmQxNiBwZUJpdHNMYXN0ID0gYml0czJwZShiaXRzTGFzdCk7Ci0KLSAgaWYgKChiaXRzTGFzdCA+IDApICYmCi0gICAgICAocGVBY3QxMDAgPCAoMTUwICogcGVMYXN0KSkgJiYgIChwZUFjdDEwMCA+ICg3MCAqIHBlTGFzdCkpICYmCi0gICAgICAoKDEyMCAqIHBlQml0c0xhc3QpID4gcGVMYXN0MTAwICkgJiYgKCggNjUgKiBwZUJpdHNMYXN0KSA8IHBlTGFzdDEwMCkpCi0gICAgewotICAgICAgV29yZDE2IG5ld0ZhYyA9ICgxMDAgKiBwZUxhc3QpIC8gcGVCaXRzTGFzdDsKLSAgICAgIC8qIGRlYWQgem9uZSAqLwotCi0gICAgICBpZiAobmV3RmFjIDwgMTAwKSB7Ci0gICAgICAgIG5ld0ZhYyA9IG1pbigoKDExMCAqIG5ld0ZhYykgLyAxMDApLCAxMDApOwotICAgICAgICBuZXdGYWMgPSBtYXgobmV3RmFjLCA4NSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgbmV3RmFjID0gbWF4KCgoOTAgKiBuZXdGYWMpIC8gMTAwKSwgMTAwKTsKLSAgICAgICAgbmV3RmFjID0gbWluKG5ld0ZhYywgMTE1KTsKLSAgICAgIH0KLQotICAgICAgaWYgKChuZXdGYWMgPiAxMDAgJiYgKmNvcnJlY3Rpb25GYWMgPCAxMDApIHx8Ci0gICAgICAgICAgKG5ld0ZhYyA8IDEwMCAmJiAqY29ycmVjdGlvbkZhYyA+IDEwMCkpIHsKLSAgICAgICAgKmNvcnJlY3Rpb25GYWMgPSAxMDA7Ci0gICAgICB9Ci0gICAgICAvKiBmYXN0ZXIgYWRhcHRhdGlvbiB0b3dhcmRzIDEuMCwgc2xvd2VyIGluIHRoZSBvdGhlciBkaXJlY3Rpb24gKi8KLQotICAgICAgaWYgKCgqY29ycmVjdGlvbkZhYyA8IDEwMCAmJiBuZXdGYWMgPCAqY29ycmVjdGlvbkZhYykgfHwKLSAgICAgICAgICAoKmNvcnJlY3Rpb25GYWMgPiAxMDAgJiYgbmV3RmFjID4gKmNvcnJlY3Rpb25GYWMpKQotICAgICAgICAqY29ycmVjdGlvbkZhYyA9ICg4NSAqICpjb3JyZWN0aW9uRmFjICsgMTUgKiBuZXdGYWMpIC8gMTAwOwotICAgICAgZWxzZQotICAgICAgICAqY29ycmVjdGlvbkZhYyA9ICg3MCAqICpjb3JyZWN0aW9uRmFjICsgMzAgKiBuZXdGYWMpIC8gMTAwOwotICAgICAgKmNvcnJlY3Rpb25GYWMgPSBtaW4oKmNvcnJlY3Rpb25GYWMsIDExNSk7Ci0gICAgICAqY29ycmVjdGlvbkZhYyA9IG1heCgqY29ycmVjdGlvbkZhYywgODUpOwotICAgIH0KLSAgZWxzZSB7Ci0gICAgKmNvcnJlY3Rpb25GYWMgPSAxMDA7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IEFkanVzdFRocmVzaG9sZHMKLSogZGVzY3JpcHRpb246ICBBZGp1c3QgdGhyZXNob2xkcyB0byB0aGUgZGVzaXJlZCBiaXRyYXRlCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBBZGp1c3RUaHJlc2hvbGRzKEFESl9USFJfU1RBVEUgICAqYWRqVGhyU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgQVRTX0VMRU1FTlQgICAgICpBZGpUaHJTdGF0ZUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UICpwc3lPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAqY2hCaXREaXN0cmlidXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICBsb2dTZmJFbmVyZ3lbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgc2ZiTlJlbGV2YW50TGluZXNbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UICAqcWNPRSwKLQkJCQkJICBFTEVNRU5UX0JJVFMJICAqZWxCaXRzLAotCQkJCQkgIGNvbnN0IFdvcmQxNiAgICAgbkNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgbWF4Qml0RmFjKQotewotICBQRV9EQVRBIHBlRGF0YTsKLSAgV29yZDE2IG5vUmVkUGUsIGdyYW50ZWRQZSwgZ3JhbnRlZFBlQ29ycjsKLSAgV29yZDE2IGN1cldpbmRvd1NlcXVlbmNlOwotICBXb3JkMTYgYml0RmFjdG9yOwotICBXb3JkMTYgYXZnQml0cyA9IChlbEJpdHMtPmF2ZXJhZ2VCaXRzIC0gKHFjT0UtPnN0YXRpY0JpdHNVc2VkICsgcWNPRS0+YW5jQml0c1VzZWQpKTsKLSAgV29yZDE2IGJpdHJlc0JpdHMgPSBlbEJpdHMtPmJpdFJlc0xldmVsOwotICBXb3JkMTYgbWF4Qml0cmVzQml0cyA9IGVsQml0cy0+bWF4Qml0czsKLSAgV29yZDE2IHNpZGVJbmZvQml0cyA9IChxY09FLT5zdGF0aWNCaXRzVXNlZCArIHFjT0UtPmFuY0JpdHNVc2VkKTsKLSAgV29yZDE2IGNoOwotICBtZW1zZXQoJnBlRGF0YSwgMCwgc2l6ZW9mKHBlRGF0YSkpOwotCi0gIHByZXBhcmVTZmJQZSgmcGVEYXRhLCBwc3lPdXRDaGFubmVsLCBsb2dTZmJFbmVyZ3ksIHNmYk5SZWxldmFudExpbmVzLCBuQ2hhbm5lbHMsIEFkalRoclN0YXRlRWxlbWVudC0+cGVPZmZzZXQpOwotCi0gIC8qIHBlIHdpdGhvdXQgcmVkdWN0aW9uICovCi0gIGNhbGNTZmJQZSgmcGVEYXRhLCBwc3lPdXRDaGFubmVsLCBuQ2hhbm5lbHMpOwotICBub1JlZFBlID0gcGVEYXRhLnBlOwotCi0KLSAgY3VyV2luZG93U2VxdWVuY2UgPSBMT05HX1dJTkRPVzsKLQotICBpZiAobkNoYW5uZWxzID09IDIpIHsKLQotICAgIGlmICgocHN5T3V0Q2hhbm5lbFswXS53aW5kb3dTZXF1ZW5jZSA9PSBTSE9SVF9XSU5ET1cpIHx8Ci0gICAgICAgIChwc3lPdXRDaGFubmVsWzFdLndpbmRvd1NlcXVlbmNlID09IFNIT1JUX1dJTkRPVykpIHsKLSAgICAgIGN1cldpbmRvd1NlcXVlbmNlID0gU0hPUlRfV0lORE9XOwotICAgIH0KLSAgfQotICBlbHNlIHsKLSAgICBjdXJXaW5kb3dTZXF1ZW5jZSA9IHBzeU91dENoYW5uZWxbMF0ud2luZG93U2VxdWVuY2U7Ci0gIH0KLQotCi0gIC8qIGJpdCBmYWN0b3IgKi8KLSAgYml0RmFjdG9yID0gYml0cmVzQ2FsY0JpdEZhYyhiaXRyZXNCaXRzLCBtYXhCaXRyZXNCaXRzLCBub1JlZFBlKzUqc2lkZUluZm9CaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cldpbmRvd1NlcXVlbmNlLCBhdmdCaXRzLCBtYXhCaXRGYWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRqVGhyU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50KTsKLQotICAvKiBkZXNpcmVkIHBlICovCi0gIGdyYW50ZWRQZSA9ICgoYml0RmFjdG9yICogYml0czJwZShhdmdCaXRzKSkgLyAxMDApOwotCi0gIC8qIGNvcnJlY3Rpb24gb2YgcGUgdmFsdWUgKi8KLSAgY2FsY1BlQ29ycmVjdGlvbigmKEFkalRoclN0YXRlRWxlbWVudC0+cGVDb3JyZWN0aW9uRmFjdG9yKSwKLSAgICAgICAgICAgICAgICAgICBtaW4oZ3JhbnRlZFBlLCBub1JlZFBlKSwKLSAgICAgICAgICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlTGFzdCwKLSAgICAgICAgICAgICAgICAgICBBZGpUaHJTdGF0ZUVsZW1lbnQtPmR5bkJpdHNMYXN0KTsKLSAgZ3JhbnRlZFBlQ29yciA9IChncmFudGVkUGUgKiBBZGpUaHJTdGF0ZUVsZW1lbnQtPnBlQ29ycmVjdGlvbkZhY3RvcikgLyAxMDA7Ci0KLQotICBpZiAoZ3JhbnRlZFBlQ29yciA8IG5vUmVkUGUgJiYgbm9SZWRQZSA+IHBlRGF0YS5vZmZzZXQpIHsKLSAgICAvKiBjYWxjIHRocmVzaG9sZCBuZWNlc3NhcnkgZm9yIGRlc2lyZWQgcGUgKi8KLSAgICBhZGFwdFRocmVzaG9sZHNUb1BlKHBzeU91dENoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgbG9nU2ZiRW5lcmd5LAotICAgICAgICAgICAgICAgICAgICAgICAgJnBlRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyYW50ZWRQZUNvcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmQWRqVGhyU3RhdGVFbGVtZW50LT5haFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgJkFkalRoclN0YXRlRWxlbWVudC0+bWluU25yQWRhcHRQYXJhbSk7Ci0gIH0KLQotICAvKiBjYWxjdWxhdGUgcmVsYXRpdmUgZGlzdHJpYnV0aW9uICovCi0gIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgV29yZDE2IHBlT2Zmc0RpZmYgPSBwZURhdGEucGUgLSBwZURhdGEub2Zmc2V0OwotICAgIGNoQml0RGlzdHJpYnV0aW9uW2NoXSA9IDIwMDsKLQotICAgIGlmIChwZU9mZnNEaWZmID4gMCkgewotICAgICAgV29yZDMyIHRlbXAgPSAxMDAwIC0gKG5DaGFubmVscyAqIDIwMCk7Ci0gICAgICBjaEJpdERpc3RyaWJ1dGlvbltjaF0gPSBjaEJpdERpc3RyaWJ1dGlvbltjaF0gKwotCQkgICh0ZW1wICogcGVEYXRhLnBlQ2hhbm5lbERhdGFbY2hdLnBlKSAvIHBlT2Zmc0RpZmY7Ci0gICAgfQotICB9Ci0KLSAgLyogc3RvcmUgcGUgKi8KLSAgcWNPRS0+cGUgPSBub1JlZFBlOwotCi0gIC8qIHVwZGF0ZSBsYXN0IHBlICovCi0gIEFkalRoclN0YXRlRWxlbWVudC0+cGVMYXN0ID0gZ3JhbnRlZFBlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogQWRqVGhyVXBkYXRlCi0qIGRlc2NyaXB0aW9uOiAgc2F2ZSBkeW5CaXRzVXNlZCBmb3IgY29ycmVjdGlvbiBvZiBiaXRzMnBlIHJlbGF0aW9uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBBZGpUaHJVcGRhdGUoQVRTX0VMRU1FTlQgKkFkalRoclN0YXRlRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBkeW5CaXRzVXNlZCkKLXsKLSAgQWRqVGhyU3RhdGVFbGVtZW50LT5keW5CaXRzTGFzdCA9IGR5bkJpdHNVc2VkOwotfQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvQXV0b0NvcnJlbGF0aW9uX3Y1LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL0F1dG9Db3JyZWxhdGlvbl92NS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzA1MTk3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvQXV0b0NvcnJlbGF0aW9uX3Y1LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotQC8qCi1AICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi1AICoqCi1AICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotQCAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1AICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotQCAqKgotQCAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi1AICoqCi1AICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLUAgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLUAgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1AICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLUAgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi1AICovCi0KLUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAKLUAJRmlsZToJCUF1dG9Db3JyZWxhdGlvbl92NS5zCi1ACi1ACUNvbnRlbnQ6CUF1dG9Db3JyZWxhdGlvbiBmdW5jdGlvbiBhcm12NSBhc3NlbWJsZQotQAotQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAKLQotCi0JLnNlY3Rpb24gLnRleHQKLQkuZ2xvYmFsCUF1dG9Db3JyZWxhdGlvbgotCi1BdXRvQ29ycmVsYXRpb246Ci0Jc3RtZGIgICAgIHNwISwge3I0IC0gcjExLCBscn0KLQotICBzdWIgICAgIHIxMywgcjEzLCAjMjAKLQotICBtb3YgICAgIHI1LCByMAotICBtb3YgICAgIHI3LCByMQotICBtb3YgICAgIHI5LCByMwotICBtb3YgICAgIHIyLCByMiwgbHNsICMxNgotICBtb3YgICAgIHIwLCAjMAotICBtb3YgICAgIHI0LCByMiwgYXNyICMxNgotICBtb3YgICAgIHI4LCAjMAotICBjbXAgICAgIHI0LCAjMAotICBibGUgICAgIEwxMzYKLQotCWNtcCAgICAgcjQsICM4Ci0JbW92CQkgIHIyLCAjMAotICBibHQgICAgIEwxMzMKLQotCXN1YiAgICAgcjEyLCByNCwgIzgKLUwxMzI6Ci0gIGxkciAgICAgcjYsIFtyNSwgcjJdCi0JYWRkCQkgIHIyLCByMiwgIzQKLQlzbXVsYmIgIHIzLCByNiwgcjYKLQlsZHIgICAgIHIxLCBbcjUsIHIyXQotCXNtdWx0dAlyMTAsIHI2LCByNgotCW1vdgkJICByMywgcjMsIGFzciAjOQotCXNtdWxiYglyNiwgcjEsIHIxCi0JbW92CQkgIHIxMCwgcjEwLCBhc3IgIzkKLQlxYWRkCSAgcjAsIHIwLCByMwotCXNtdWx0dAlyMTEsIHIxLCByMQotCWFkZCAgICAgcjIsIHIyLCAjNAotCXFhZGQJICByMCwgcjAsIHIxMAotCW1vdgkJICByNiwgcjYsIGFzciAjOQotCW1vdgkJICByMTEsIHIxMSwgYXNyICM5Ci0JbGRyCQkgIHIxLCBbcjUsIHIyXQotCXFhZGQJICByMCwgcjAsIHI2Ci0Jc211bGJiCXIxMCwgcjEsIHIxCi0Jc211bHR0CXI2LCByMSwgcjEKLQlxYWRkCSAgcjAsIHIwLCByMTEKLQltb3YJCSAgcjEwLCByMTAsIGFzciAjOQotCW1vdgkJICByNiwgcjYsIGFzciAjOQotCXFhZGQJICByMCwgcjAsIHIxMAotCWFkZCAgICAgcjIsIHIyLCAjNAotCWFkZCAgICAgcjgsIHI4LCAjNgotCi0JcWFkZAkgIHIwLCByMCwgcjYKLQljbXAgICAgIHI4LCByMTIKLSAgYmx0ICAgICBMMTMyCi1MMTMzOgotICBsZHJzaCAgIHI2LCBbcjUsIHIyXQotICBtdWwgICAgIHIxMCwgcjYsIHI2Ci0JYWRkICAgICByMiwgcjIsICMyCi0gIG1vdiAgICAgcjEsIHIxMCwgYXNyICM5Ci0gIHFhZGQgICAgcjAsIHIwLCByMQotTDEzNDoKLSAgYWRkICAgICByOCwgcjgsICMxCi0gIGNtcCAgICAgcjgsIHI0Ci0gIGJsdCAgICAgTDEzMwotTDEzNToKLUwxMzY6Ci0gIHN0ciAgICAgcjAsIFtyNywgIzBdCi0gIGNtcCAgICAgcjAsICMwCi0gIGJlcSAgICAgTDEzMjAKLUwxMzc6Ci0gIG1vdiAgICAgcjIsIHI5LCBsc2wgIzE2Ci0JbW92ICAgICByOCwgIzEKLSAgbW92ICAgICByMiwgcjIsIGFzciAjMTYKLSAgY21wICAgICByMiwgIzEKLSAgYmxlICAgICBMMTMxOQotTDEzODoKLUwxMzk6Ci0gIHN1YiAgICAgcjQsIHI0LCAjMQotICBtb3YgICAgIHIxNCwgIzAKLSAgbW92ICAgICByMywgIzAKLSAgY21wICAgICByNCwgIzAKLSAgYmxlICAgICBMMTMxNwotTDEzMTA6Ci0gIGNtcCAgICAgcjQsICM2Ci0gIGFkZGx0ICAgcjYsIHI1LCByOCwgbHNsICMxCi0gIGJsdCAgICAgTDEzMTQKLUwxMzExOgotICBhZGQgICAgIHI2LCByNSwgcjgsIGxzbCAjMQotICBzdWIgICAgIHIxMiwgcjQsICM2Ci0gIHN0ciAgICAgcjgsIFtyMTMsICM4XQotICBzdHIgICAgIHI3LCBbcjEzLCAjNF0KLUwxMzEyOgotICBtb3YgICAgIHIxLCByMywgbHNsICMxCi0gIGxkcnNoICAgcjcsIFtyNiwgcjFdCi0gIGxkcnNoICAgcjEwLCBbcjUsIHIxXQotICBhZGQgICAgIHI4LCByMSwgcjYKLQlhZGQgICAgIHI5LCByNSwgcjEKLQltdWwgICAgIHI3LCByMTAsIHI3Ci0gIGxkcnNoICAgcjEsIFtyOCwgIzJdCi0JbGRyc2ggICByMTAsIFtyOCwgIzRdCi0gIGFkZCAgICAgcjcsIHIxNCwgcjcsIGFzciAjOQotICBsZHJzaCAgIHIwLCBbcjksICMyXQotICBsZHJzaCAgIHIxMSwgW3I5LCAjNF0KLSAgbXVsICAgICByMSwgcjAsIHIxCi0gIGxkcnNoICAgcjE0LCBbcjgsICM2XQotICBtdWwgICAgIHIxMCwgcjExLCByMTAKLQlhZGQgICAgIHI3LCByNywgcjEsIGFzciAjOQotICBsZHJzaCAgIHI4LCBbcjgsICM4XQotCWFkZCAgICAgcjMsIHIzLCAjNQotCWxkcnNoICAgcjExLCBbcjksICM2XQotICBsZHJzaCAgIHIxLCBbcjksICM4XQotICBtdWwgICAgIHIxNCwgcjExLCByMTQKLSAgYWRkICAgICByNywgcjcsIHIxMCwgYXNyICM5Ci0gIG11bCAgICAgcjEsIHIxLCByOAotICBhZGQgICAgIHIxNCwgcjcsIHIxNCwgYXNyICM5Ci0JY21wICAgICByMywgcjEyCi0gIGFkZCAgICAgcjE0LCByMTQsIHIxLCBhc3IgIzkKLSAgYmxlICAgICBMMTMxMgotTDEzMTM6Ci0gIGxkciAgICAgcjgsIFtyMTMsICM4XQotICBsZHIgICAgIHI3LCBbcjEzLCAjNF0KLUwxMzE0OgotTDEzMTU6Ci0gIG1vdiAgICAgcjEyLCByMywgbHNsICMxCi0gIGxkcnNoICAgcjksIFtyNiwgcjEyXQotICBsZHJzaCAgIHIxMiwgW3I1LCByMTJdCi0gIGFkZCAgICAgcjMsIHIzLCAjMQotICBjbXAgICAgIHIzLCByNAotICBtdWwgICAgIHIxMiwgcjEyLCByOQotICBhZGQgICAgIHIxNCwgcjE0LCByMTIsIGFzciAjOQotICBibHQgICAgIEwxMzE1Ci1MMTMxNjoKLUwxMzE3OgotICBzdHIgICAgIHIxNCwgW3I3LCArcjgsIGxzbCAjMl0KLSAgYWRkICAgICByOCwgcjgsICMxCi0gIGNtcCAgICAgcjgsIHIyCi0gIGJsdCAgICAgTDEzOQotCi1MMTMxOToKLUwxMzIwOgotCWFkZCAgICAgcjEzLCByMTMsICMyMAotCWxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfQotCi0JQEVORFAgIEAgfEF1dG9Db3JyZWxhdGlvbnwKLQkuZW5kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL0NhbGNXaW5kb3dFbmVyZ3lfdjUucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvQ2FsY1dpbmRvd0VuZXJneV92NS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzBlOGNiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvQ2FsY1dpbmRvd0VuZXJneV92NS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLUAvKgotQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotQCAqKgotQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLUAgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLUAgKioKLUAgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotQCAqKgotQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1AICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1AICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1AICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotQCAqLwotCi1AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBACi1ACUZpbGU6CQlDYWxjV2luZG93RW5lcmd5X3Y1LnMKLUAKLUAJQ29udGVudDoJQ2FsY1dpbmRvd0VuZXJneSBmdW5jdGlvbiBhcm12NSBhc3NlbWJsZQotQAotQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAKLQotCS5zZWN0aW9uIC50ZXh0Ci0KLQkuZ2xvYmFsCUNhbGNXaW5kb3dFbmVyZ3kKLQotQ2FsY1dpbmRvd0VuZXJneToKLQlzdG1kYiAgIHNwISwge3I0IC0gcjExLCBscn0KLQlzdWIgICAgIHIxMywgcjEzLCAjMjAKLQotICBtb3YgICAgIHIzLCByMywgbHNsICMxNgotCWxkciAgICAgcjEwLCBbcjAsICMxNjhdICAgICAgICAgICAgICAgICAgICBAIHN0YXRlczAgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmlpclN0YXRlc1swXTsKLSAgbW92ICAgICByMywgcjMsIGFzciAjMTYKLQlsZHIgICAgIHIxMSwgW3IwLCAjMTcyXSAgICAgICAgICAgICAgICAgICAgQCBzdGF0ZXMxID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5paXJTdGF0ZXNbMV07Ci0KLQltb3YgICAgIHIyLCByMiwgbHNsICMxNgotCWxkciAgICAgcjEyLCBoaVBhc3NDb2VmZiAgICAgICAgICAgICAgICAgICBAIENvZWZmMCA9IGhpUGFzc0NvZWZmWzBdOwotICBtb3YgICAgIHIyLCByMiwgYXNyICMxNgotCWxkciAgICAgcjE0LCBoaVBhc3NDb2VmZiArIDQJCQkgICAgICAgICBAIENvZWZmMSA9IGhpUGFzc0NvZWZmWzFdOwotCi0JbW92CQkJcjgsICMwCQkJCQkJCSAgICAgICAgICAgICAgIEAgdz0wCi0JbW92CQkJcjUsICMwCQkJCQkJCSAgICAgICAgICAgICAgIEAgd09mZnNldCA9IDA7Ci0KLUJMT0NLX0JFR0lOOgotCW1vdgkJCXI2LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBhY2N1VUUgPSAwOwotCW1vdgkJCXI3LCAjMAkJCQkJCQkJICAgICAgICAgICAgIEAgYWNjdUZFID0gMDsKLQltb3YJCQlyNCwgIzAJCQkJCQkJICAgICAgICAgICAgICAgQCBpPTAKLQotCXN0cgkJCXI4LCBbcjEzLCAjNF0KLQlzdHIJCQlyMCwgW3IxMywgIzhdCi0Jc3RyCQkJcjMsIFtyMTMsICMxMl0KLQotRU5FUkdZX0JFRzoKLQltb3YgICAgIHI5LCByNSwgbHNsICMxCi0JbGRyc2ggICByOSwgW3IxLCByOV0JCQkJCQkJCQkJCUAgdGVtcFVuZmlsdGVyZWQgPSB0aW1lU2lnbmFsW3RpZHhdOwotCi0JYWRkCQkJcjUsIHI1LCByMgkJCQkJCQkJCQkJCUAgdGlkeCA9IHRpZHggKyBjaEluY3JlbWVudDsKLQotCXNtdWx3YglyMywgcjE0LCByOQkJCQkJCQkJCQkJCUAgYWNjdTEgPSBMX21weV9scyhDb2VmZjEsIHRlbXBVbmZpbHRlcmVkKTsKLQlzbXVsbAkJcjAsIHI4LCByMTIsIHIxMQkJCQkJCQkJCUAgYWNjdTIgPSBmaXhtdWwoIENvZWZmMCwgc3RhdGVzMSApOwotCi0JbW92CQkJcjMsIHIzLCBsc2wgIzEKLQltb3YJCQlyOCwgcjgsIGxzbCAjMQotCi0Jc3ViCQkJcjAsIHIzLCByMTAJCQkJCQkJCQkJCQlAIGFjY3UzID0gYWNjdTEgLSBzdGF0ZXMwOwotCXN1YgkJCXI4LAlyMCwgcjgJCQkJCQkJCQkJCQlAIG91dCA9IGFjY3UzIC0gYWNjdTI7Ci0KLQltb3YJCSAgcjEwLCByMwkJCQkJCQkJCQkJCQkJQCBzdGF0ZXMwID0gYWNjdTE7Ci0JbW92CQkgIHIxMSwgcjgJCQkJCQkJCQkJCQkJCUAgc3RhdGVzMSA9IG91dDsKLQotCW11bAkJICByMywgcjksIHI5Ci0JbW92ICAgICByOCwgcjgsIGFzciAjMTYKLQotCWFkZAkJICByNCwgcjQsICMxCi0JYWRkICAgICByNiwgcjYsIHIzLCBhc3IgIzcKLQotCW11bAkJICByOSwgcjgsIHI4Ci0JbGRyCQkgIHIzLCBbcjEzLCAjMTJdCi0KLQlhZGQJCSAgcjcsIHI3LCByOSwgYXNyICM3Ci0KLQljbXAgICAgIHI0LCByMwotICBibHQgICAgIEVORVJHWV9CRUcKLQotCWxkcgkJICByMCwgW3IxMywgIzhdCi0JbGRyCQkgIHI4LCBbcjEzLCAjNF0KLQotRU5FUkdZX0VORDoKLQlhZGQJCSAgcjQsIHIwLCByOCwgbHNsICMyCi0KLQlzdHIgICAgIHI2LCBbcjQsICM3Ml0KLQlhZGQJCSAgcjgsIHI4LCAjMQotICBzdHIgICAgIHI3LCBbcjQsICMxMzZdCi0KLQljbXAJCSAgcjgsICM4Ci0JYmx0CQkgIEJMT0NLX0JFR0lOCi0KLUJMT0NLX0VORDoKLQlzdHIgICAgIHIxMCwgW3IwLCAjMTY4XQotICBzdHIgICAgIHIxMSwgW3IwLCAjMTcyXQotICBtb3YgICAgIHIwLCAjMQotCi0gIGFkZCAgICAgcjEzLCByMTMsICMyMAotCWxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfQotCi1oaVBhc3NDb2VmZjoKLQkud29yZCAweGJlYzhiNDM5Ci0JLndvcmQJMHg2MDlkNDk1MgotCi0JQEVORFAKLQkuZW5kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL1ByZVBvc3RNRENUX3Y1LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL1ByZVBvc3RNRENUX3Y1LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMjFkNWYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9QcmVQb3N0TURDVF92NS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLUAvKgotQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotQCAqKgotQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLUAgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLUAgKioKLUAgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotQCAqKgotQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1AICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1AICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1AICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotQCAqLwotCi1AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBACi1ACUZpbGU6CQlQcmVQb3N0TURDVF92NS5zCi1ACi1ACUNvbnRlbnQ6CXByZW1kY3QgYW5kIHBvc3RtZGN0IGZ1bmN0aW9uIGFybXY1IGFzc2VtYmxlCi1ACi1AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAotCi0JLnNlY3Rpb24gLnRleHQKLQkuZ2xvYmFsCVByZU1EQ1QKLQotUHJlTURDVDoKLQlzdG1kYiAgICAgICBzcCEsIHtyNCAtIHIxMSwgbHJ9Ci0KLQlhZGQgICAgICAgICByOSwgcjAsIHIxLCBsc2wgIzIKLQlzdWIgICAgICAgICByMywgcjksICM4Ci0KLQltb3ZzICAgICAgICByMSwgcjEsIGFzciAjMgotCWJlcSAgICAgICAgIFByZU1EQ1RfRU5ECi0KLVByZU1EQ1RfTE9PUDoKLQlsZHIJCQkJCXI4LCBbcjJdLCAjNAotCWxkcgkJCQkJcjksIFtyMl0sICM0Ci0KLQlsZHJkCQkJCXI0LCBbcjBdCi0JbGRyZAkJCQlyNiwgW3IzXQotCi0Jc211bGwJCQkJcjE0LCByMTEsIHI0LCByOAkJCQkJQCBNVUxISUdIKHRyMSwgY29zYSkKLQlzbXVsbCAgICAJCQlyMTAsIHIxMiwgcjcsIHI4CQkJCQlAIE1VTEhJR0godGkxLCBjb3NhKQotCi0Jc211bGwJCQkJcjE0LCByOCwgcjcsIHI5CQkJCQkJQCBNVUxISUdIKHRpMSwgc2luYSkKLQlzbXVsbAkJCQlyNywgcjEwLCByNCwgcjkJCQkJCQlAIE1VTEhJR0godHIxLCBzaW5hKQotCi0JYWRkCQkJCQlyMTEsIHIxMSwgcjgJCQkJCQlAIE1VTEhJR0goY29zYSwgdHIxKSArIE1VTEhJR0goc2luYSwgdGkxKUAKLQlzdWIJCQkJCXI3LCByMTIsIHIxMAkJCQkJCUAgTVVMSElHSCh0aTEsIGNvc2EpIC0gTVVMSElHSCh0cjEsIHNpbmEpCi0KLQlsZHIJCQkJCXI4LCBbcjJdLCAjNAotCWxkcgkJCQkJcjksIFtyMl0sICM0Ci0KLQlzbXVsbAkJCQlyMTQsIHI0LCByNiwgcjgJCQkJCQlAIE1VTEhJR0godHIyLCBjb3NhKQotCXNtdWxsICAgIAkJCXIxMCwgcjEyLCByNSwgcjgJCQkJCUAgTVVMSElHSCh0aTIsIGNvc2EpCi0KLQlzbXVsbAkJCQlyMTQsIHI4LCByNSwgcjkJCQkJCQlAIE1VTEhJR0godGkyLCBzaW5hKQotCXNtdWxsCQkJCXI1LCByMTAsIHI2LCByOQkJCQkJCUAgTVVMSElHSCh0cjIsIHNpbmEpCi0KLQlhZGQJCQkJCXI4LCByOCwgcjQKLQlzdWIJCQkJCXI5LCByMTIsIHIxMAotCi0JbW92CQkJCQlyNiwgcjExCi0KLQlzdHJkCQkJCXI2LCBbcjBdCi0Jc3RyZAkJCQlyOCwgW3IzXQotCi0Jc3VicwkJCQlyMSwgcjEsICMxCi0Jc3ViCQkJCQlyMywgcjMsICM4Ci0JYWRkIAkJCQlyMCwgcjAsICM4Ci0JYm5lCQkJCQlQcmVNRENUX0xPT1AKLQotUHJlTURDVF9FTkQ6Ci0JbGRtaWEgICAgICAgc3AhLCB7cjQgLSByMTEsIHBjfQotCUBFTkRQICBAIHxQcmVNRENUfAotCi0JLnNlY3Rpb24gLnRleHQKLQkuZ2xvYmFsCVBvc3RNRENUCi0KLVBvc3RNRENUOgotCXN0bWRiICAgICAgIHNwISwge3I0IC0gcjExLCBscn0KLQotCWFkZCAgICAgICAgIHI5LCByMCwgcjEsIGxzbCAjMgotCXN1YiAgICAgICAgIHIzLCByOSwgIzgKLQotCW1vdnMgICAgICAgIHIxLCByMSwgYXNyICMyCi0JYmVxICAgICAgICAgUG9zdE1EQ1RfRU5ECi0KLVBvc3RNRENUX0xPT1A6Ci0JbGRyCQkJCQlyOCwgW3IyXSwgIzQKLQlsZHIJCQkJCXI5LCBbcjJdLCAjNAotCi0JbGRyZAkJCQlyNCwgW3IwXQotCWxkcmQJCQkJcjYsIFtyM10KLQotCXNtdWxsCQkJCXIxNCwgcjExLCByNCwgcjgJCQkJCUAgTVVMSElHSCh0cjEsIGNvc2EpCi0Jc211bGwgICAgCQkJcjEwLCByMTIsIHI1LCByOAkJCQkJQCBNVUxISUdIKHRpMSwgY29zYSkKLQotCXNtdWxsCQkJCXIxNCwgcjgsIHI1LCByOQkJCQkJCUAgTVVMSElHSCh0aTEsIHNpbmEpCi0Jc211bGwJCQkJcjUsIHIxMCwgcjQsIHI5CQkJCQkJQCBNVUxISUdIKHRyMSwgc2luYSkKLQotCWFkZAkJCQkJcjQsIHIxMSwgcjgJCQkJCQkJQCBNVUxISUdIKGNvc2EsIHRyMSkgKyBNVUxISUdIKHNpbmEsIHRpMSlACi0Jc3ViCQkJCQlyMTEsIHIxMCwgcjEyCQkJCQkJQCBNVUxISUdIKHRpMSwgY29zYSkgLSBNVUxISUdIKHRyMSwgc2luYSlACi0KLQlsZHIJCQkJCXI4LCBbcjJdLCAjNAkJCQkJCUAKLQlsZHIJCQkJCXI5LCBbcjJdLCAjNAotCi0Jc211bGwJCQkJcjE0LCByNSwgcjYsIHI4CQkJCQkJQCBNVUxISUdIKHRyMiwgY29zYSkKLQlzbXVsbCAgICAJCQlyMTAsIHIxMiwgcjcsIHI4CQkJCQlAIE1VTEhJR0godGkyLCBjb3NhKQotCi0Jc211bGwJCQkJcjE0LCByOCwgcjcsIHI5CQkJCQkJQCBNVUxISUdIKHRpMiwgc2luYSkKLQlzbXVsbAkJCQlyNywgcjEwLCByNiwgcjkJCQkJCQlAIE1VTEhJR0godHIyLCBzaW5hKQotCi0JYWRkCQkJCQlyNiwgcjgsIHI1CQkJCQkJCUAgTVVMSElHSChjb3NiLCB0cjIpICsgTVVMSElHSChzaW5iLCB0aTIpQAotCXN1YgkJCQkJcjUsIHIxMCwgcjEyCQkJCQkJQCBNVUxISUdIKHNpbmIsIHRyMikgLSBNVUxISUdIKGNvc2IsIHRpMilACi0KLQltb3YJCQkJCXI3LCByMTEKLQotCXN0cmQJCQkJcjQsIFtyMF0KLQlzdHJkCQkJCXI2LCBbcjNdCi0KLQlzdWJzCQkJCXIxLCByMSwgIzEKLQlzdWIJCQkJCXIzLCByMywgIzgKLQlhZGQgCQkJCXIwLCByMCwgIzgKLQlibmUJCQkJCVBvc3RNRENUX0xPT1AKLQotUG9zdE1EQ1RfRU5EOgotCWxkbWlhICAgICAgIHNwISwge3I0IC0gcjExLCBwY30KLQlARU5EUCAgQCB8UG9zdE1EQ1R8Ci0JLmVuZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9SNFI4Rmlyc3RfdjUucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvUjRSOEZpcnN0X3Y1LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYTRmMzEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9SNFI4Rmlyc3RfdjUucworKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi1ALyoKLUAgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLUAgKioKLUAgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci1AICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLUAgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1AICoqCi1AICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLUAgKioKLUAgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotQCAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotQCAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLUAgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotQCAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLUAgKi8KLQotQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAotQAlGaWxlOgkJUjRSOEZpcnN0X3Y1LnMKLUAKLUAJQ29udGVudDoJUmFkaXg4Rmlyc3QgYW5kIFJhZGl4NEZpcnN0IGZ1bmN0aW9uIGFybXY1IGFzc2VtYmxlCi1ACi1AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAotCi0JLnNlY3Rpb24gLnRleHQKLQkuZ2xvYmFsCVJhZGl4NEZpcnN0Ci0KLVJhZGl4NEZpcnN0OgotCXN0bWRiICAgICAgIHNwISwge3I0IC0gcjExLCBscn0KLQotCW1vdnMJCQkJcjEwLCByMQotCW1vdgkJCQkJcjExLCByMAotCWJlcQkJCQkJUmFkaXg0Rmlyc3RfRU5ECi0KLVJhZGl4NEZpcnN0X0xPT1A6Ci0JbGRyZAkJCQlyMCwgW3IxMV0KLQlsZHJkCQkJCXIyLCBbcjExLCAjOF0KLQlsZHJkCQkJCXI0LCBbcjExLCAjMTZdCi0JbGRyZAkJCQlyNiwgW3IxMSwgIzI0XQotCi0JYWRkCQkJCQlyOCwgcjAsIHIyCi0JYWRkCQkJCQlyOSwgcjEsIHIzCi0KLQlzdWIJCQkJCXIwLCByMCwgcjIKLQlzdWIJCQkJCXIxLCByMSwgcjMKLQotCWFkZAkJCQkJcjIsIHI0LCByNgotCWFkZAkJCQkJcjMsIHI1LCByNwotCi0Jc3ViCQkJCQlyNCwgcjQsIHI2Ci0Jc3ViCQkJCQlyNSwgcjUsIHI3Ci0KLQlhZGQJCQkJCXI2LCByOCwgcjIKLQlhZGQJCQkJCXI3LCByOSwgcjMKLQotCXN1YgkJCQkJcjgsIHI4LCByMgotCXN1YgkJCQkJcjksIHI5LCByMwotCi0JYWRkCQkJCQlyMiwgcjAsIHI1Ci0Jc3ViCQkJCQlyMywgcjEsIHI0Ci0KLQlzdWIJCQkJCXIwLCByMCwgcjUKLQlhZGQJCQkJCXIxLCByMSwgcjQKLQotCXN0cmQJCQkJcjYsIFtyMTFdCi0Jc3RyZAkJCQlyMiwgW3IxMSwgIzhdCi0Jc3RyZAkJCQlyOCwgW3IxMSwgIzE2XQotCXN0cmQJCQkJcjAsIFtyMTEsICMyNF0KLQotCXN1YnMJCQkJcjEwLCByMTAsICMxCi0JYWRkCQkJCQlyMTEsIHIxMSwgIzMyCi0JYm5lCQkJCQlSYWRpeDRGaXJzdF9MT09QCi0KLVJhZGl4NEZpcnN0X0VORDoKLQlsZG1pYSAgICAgICBzcCEsIHtyNCAtIHIxMSwgcGN9Ci0JQEVORFAgIEAgfFJhZGl4NEZpcnN0fAotCi0JLnNlY3Rpb24gLnRleHQKLQkuZ2xvYmFsCVJhZGl4OEZpcnN0Ci0KLVJhZGl4OEZpcnN0OgotCXN0bWRiICAgICAgIHNwISwge3I0IC0gcjExLCBscn0KLQlzdWIgICAgICAgICBzcCwgc3AsICMweDI0Ci0KLQltb3YJCQkJICByMTIsIHIxCi0JbW92CQkJCQlyMTQsIHIwCi0JY21wCQkJCQlyMTIsICMwCi0JYmVxCQkJCQlSYWRpeDhGaXJzdF9FTkQKLQotUmFkaXg4Rmlyc3RfTE9PUDoKLQlsZHJkCQkJCXIwLCBbcjE0XQotCWxkcmQJCQkJcjIsIFtyMTQsICM4XQotCWxkcmQJCQkJcjQsIFtyMTQsICMxNl0KLQlsZHJkCQkJCXI2LCBbcjE0LCAjMjRdCi0KLQlhZGQJCQkJCXI4LCByMCwgcjIJCQkJCUAgcjAgPSBidWZbMF0gKyBidWZbMl1ACi0JYWRkCQkJCQlyOSwgcjEsIHIzCQkJCQlAIGkwID0gYnVmWzFdICsgYnVmWzNdQAotCi0Jc3ViCQkJCQlyMCwgcjAsIHIyCQkJCQlAIHIxID0gYnVmWzBdIC0gYnVmWzJdQAotCXN1YgkJCQkJcjEsIHIxLCByMwkJCQkJQCBpMSA9IGJ1ZlsxXSAtIGJ1ZlszXUAKLQotCWFkZAkJCQkJcjIsIHI0LCByNgkJCQkJQAlyMiA9IGJ1Zls0XSArIGJ1Zls2XUAKLQlhZGQJCQkJCXIzLCByNSwgcjcJCQkJCUAgaTIgPSBidWZbNV0gKyBidWZbN11ACi0KLQlzdWIJCQkJCXI0LCByNCwgcjYJCQkJCUAJcjMgPSBidWZbNF0gLSBidWZbNl1ACi0Jc3ViCQkJCQlyNSwgcjUsIHI3CQkJCQlAIGkzID0gYnVmWzVdIC0gYnVmWzddQAotCi0JYWRkCQkJCQlyNiwgcjgsIHIyCQkJCQlAIHI0ID0gKHIwICsgcjIpID4+IDFACi0JYWRkCQkJCQlyNywgcjksIHIzCQkJCQlAIGk0ID0gKGkwICsgaTIpID4+IDFACi0KLQlzdWIJCQkJCXI4LCByOCwgcjIJCQkJCUAJcjUgPSAocjAgLSByMikgPj4gMUAKLQlzdWIJCQkJCXI5LCByOSwgcjMJCQkJCUAgaTUgPSAoaTAgLSBpMikgPj4gMUAKLQotCXN1YgkJCQkJcjIsIHIwLCByNQkJCQkJQCByNiA9IChyMSAtIGkzKSA+PiAxQAotCWFkZAkJCQkJcjMsIHIxLCByNAkJCQkJQCBpNiA9IChpMSArIHIzKSA+PiAxQAotCi0JYWRkCQkJCQlyMCwgcjAsIHI1CQkJCQlAIHI3ID0gKHIxICsgaTMpID4+IDFACi0Jc3ViCQkJCQlyMSwgcjEsIHI0CQkJCQlAIGk3ID0gKGkxIC0gcjMpID4+IDFACi0KLQltb3YJCQkJCXI2LCByNiwgYXNyICMxCQkJQAotCW1vdgkJCQkJcjcsIHI3LCBhc3IgIzEJCQlACi0KLQltb3YJCQkJCXI4LCByOCwgYXNyICMxCi0JbW92CQkJCQlyOSwgcjksIGFzciAjMQotCi0JbW92CQkJCQlyMiwgcjIsIGFzciAjMQotCW1vdgkJCQkJcjMsIHIzLCBhc3IgIzEKLQotCW1vdgkJCQkJcjAsIHIwLCBhc3IgIzEKLQltb3YJCQkJCXIxLCByMSwgYXNyICMxCi0KLQlzdHIJCQkJCXI2LCBbc3BdCi0Jc3RyCQkJCQlyNywgW3NwLCAjNF0KLQotCXN0cgkJCQkJcjgsIFtzcCwgIzhdCi0Jc3RyCQkJCQlyOSwgW3NwLCAjMTJdCi0KLQlzdHIJCQkJCXIyLCBbc3AsICMxNl0KLQlzdHIJCQkJCXIzLCBbc3AsICMyMF0KLQotCXN0cgkJCQkJcjAsIFtzcCwgIzI0XQotCXN0cgkJCQkJcjEsIFtzcCwgIzI4XQotCi0JbGRyZAkJCQlyMiwgW3IxNCwgIzMyXQotCWxkcmQJCQkJcjQsIFtyMTQsICM0MF0KLQlsZHJkCQkJCXI2LCBbcjE0LCAjNDhdCi0JbGRyZAkJCQlyOCwgW3IxNCwgIzU2XQotCi0JYWRkCQkJCQlyMCwgcjIsIHI0CQkJCQlAIHIwID0gYnVmWyA4XSArIGJ1ZlsxMF1ACi0JYWRkCQkJCQlyMSwgcjMsIHI1CQkJCQlAIGkwID0gYnVmWyA5XSArIGJ1ZlsxMV1ACi0KLQlzdWIJCQkJCXIyLCByMiwgcjQJCQkJCUAgcjEgPSBidWZbIDhdIC0gYnVmWzEwXUAKLQlzdWIJCQkJCXIzLCByMywgcjUJCQkJCUAgaTEgPSBidWZbIDldIC0gYnVmWzExXUAKLQotCWFkZAkJCQkJcjQsIHI2LCByOAkJCQkJQCByMiA9IGJ1ZlsxMl0gKyBidWZbMTRdQAotCWFkZAkJCQkJcjUsIHI3LCByOQkJCQkJQCBpMiA9IGJ1ZlsxM10gKyBidWZbMTVdQAotCi0Jc3ViCQkJCQlyNiwgcjYsIHI4CQkJCQlAIHIzID0gYnVmWzEyXSAtIGJ1ZlsxNF1ACi0Jc3ViCQkJCQlyNywgcjcsIHI5CQkJCQlACWkzID0gYnVmWzEzXSAtIGJ1ZlsxNV1ACi0KLQlhZGQJCQkJCXI4LCByMCwgcjQJCQkJCUAgdDAgPSAocjAgKyByMikKLQlhZGQJCQkJCXI5LCByMSwgcjUJCQkJCUAgdDEgPSAoaTAgKyBpMikKLQotCXN1YgkJCQkJcjAsIHIwLCByNAkJCQkJQCB0MiA9IChyMCAtIHIyKQotCXN1YgkJCQkJcjEsIHIxLCByNQkJCQkJQCB0MyA9IChpMCAtIGkyKQotCi0JbW92CQkJCQlyOCwgcjgsIGFzciAjMQotCWxkcgkJCQkJcjQsIFtzcF0KLQotCW1vdgkJCQkJcjksIHI5LCBhc3IgIzEKLQlsZHIJCQkJCXI1LCBbc3AsICM0XQotCi0JbW92CQkJCQlyMCwgcjAsIGFzciAjMQotCW1vdgkJCQkJcjEsIHIxLCBhc3IgIzEKLQotCWFkZAkJCQkJcjEwLCByNCwgcjgJCQkJCUAgYnVmWyAwXSA9IHI0ICsgdDBACi0JYWRkCQkJCQlyMTEsIHI1LCByOQkJCQkJQCBidWZbIDFdID0gaTQgKyB0MUAKLQotCXN1YgkJCQkJcjQsICByNCwgcjgJCQkJCUAgYnVmWyA4XSA9IHI0IC0gdDBACi0Jc3ViCQkJCQlyNSwgIHI1LCByOQkJCQkJQAlidWZbIDldID0gaTQgLSB0MUAKLQotIAlzdHJkCQkJCXIxMCwgW3IxNF0KLSAJc3RyZAkJCQlyNCwgIFtyMTQsICMzMl0KLQotIAlsZHIJCQkJCXIxMCwgW3NwLCAjOF0KLSAJbGRyCQkJCQlyMTEsIFtzcCwgIzEyXQotCi0gCWFkZAkJCQkJcjQsIHIxMCwgcjEJCQkJCUAgYnVmWyA0XSA9IHI1ICsgdDNACi0gCXN1YgkJCQkJcjUsIHIxMSwgcjAJCQkJCUAJYnVmWyA1XSA9IGk1IC0gdDJACi0KLSAJc3ViCQkJCQlyMTAsIHIxMCwgcjEJCQkJQCBidWZbMTJdID0gcjUgLSB0M0AKLSAJYWRkCQkJCQlyMTEsIHIxMSwgcjAJCQkJQCBidWZbMTNdID0gaTUgKyB0MkAKLQotIAlzdHJkCQkJCXI0LCAgW3IxNCwgIzE2XQotIAlzdHJkCQkJCXIxMCwgW3IxNCwgIzQ4XQotCi0gCXN1YgkJCQkJcjAsIHIyLCByNwkJCQkJQCByMCA9IHIxIC0gaTNACi0gCWFkZAkJCQkJcjEsIHIzLCByNgkJCQkJQCBpMCA9IGkxICsgcjNACi0KLSAgbGRyCQkJCQlyMTEsIERBVEFUYWIKLQotIAlhZGQJCQkJCXIyLCByMiwgcjcJCQkJCUAgcjIgPSByMSArIGkzQAotIAlzdWIJCQkJCXIzLCByMywgcjYJCQkJCUAgaTIgPSBpMSAtIHIzQAotCi0Jc3ViCQkJCQlyNCwgcjAsIHIxCQkJCQlAIHIwIC0gaTAKLQlhZGQJCQkJCXI1LCByMCwgcjEJCQkJCUAgcjAgKyBpMAotCi0Jc3ViCQkJCQlyMCwgcjIsIHIzCQkJCQlAIHIyIC0gaTIKLQlhZGQJCQkJCXIxLCByMiwgcjMJCQkJCUAgcjIgKyBpMgotCi0Jc211bGwJCQkJcjgsIHI2LCByNCwgcjExCi0Jc211bGwJCQkJcjksIHI3LCByNSwgcjExCi0KLQlsZHIJCQkJCXIyLCBbc3AsICMxNl0KLQlsZHIJCQkJCXIzLCBbc3AsICMyMF0KLQotCXNtdWxsCQkJCXI4LCByNCwgcjAsIHIxMQotCXNtdWxsCQkJCXI5LCByNSwgcjEsIHIxMQotCi0JbGRyCQkJCQlyMTAsIFtzcCwgIzI0XQotCWxkcgkJCQkJcjExLCBbc3AsICMyOF0KLQotCXN1YgkJCQkJcjgsIHIyLCByNgotCXN1YgkJCQkJcjksIHIzLCByNwotCi0JYWRkCQkJCQlyMiwgcjIsIHI2Ci0JYWRkCQkJCQlyMywgcjMsIHI3Ci0KLQlhZGQJCQkJCXI2LCByMTAsIHI1Ci0Jc3ViCQkJCQlyNywgcjExLCByNAotCi0Jc3ViCQkJCQlyMCwgcjEwLCByNQotCWFkZAkJCQkJcjEsIHIxMSwgcjQKLQotCXN0cmQJCQkJcjYsIFtyMTQsICM4XQotCXN0cmQJCQkJcjgsIFtyMTQsICMyNF0KLQlzdHJkCQkJCXIwLCBbcjE0LCAjNDBdCi0Jc3RyZAkJCQlyMiwgW3IxNCwgIzU2XQotCi0Jc3VicwkJCQlyMTIsIHIxMiwgIzEKLQlhZGQJCQkJCXIxNCwgcjE0LCAjNjQKLQotCWJuZQkJCQkJUmFkaXg4Rmlyc3RfTE9PUAotCi1SYWRpeDhGaXJzdF9FTkQ6Ci0JYWRkICAgICAgICAgc3AsIHNwLCAjMHgyNAotCWxkbWlhICAgICAgIHNwISwge3I0IC0gcjExLCBwY30KLQotREFUQVRhYjoKLQkud29yZCAgICAgICAweDVhODI3OTlhCi0KLQlARU5EUCAgQCB8UmFkaXg4Rmlyc3R8Ci0JLmVuZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9SYWRpeDRGRlRfdjUucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvUmFkaXg0RkZUX3Y1LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1OWI5NjcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9SYWRpeDRGRlRfdjUucworKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi1ALyoKLUAgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLUAgKioKLUAgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci1AICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLUAgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1AICoqCi1AICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLUAgKioKLUAgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotQCAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotQCAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLUAgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotQCAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLUAgKi8KLQotQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAotQAlGaWxlOgkJUmFkaXg0RkZUX3Y1LnMKLUAKLUAJQ29udGVudDoJUmFkaXg0RkZUIGFybXY1IGFzc2VtYmxlCi1ACi1AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAotCS5zZWN0aW9uIC50ZXh0Ci0JLmdsb2JhbAlSYWRpeDRGRlQKLQotUmFkaXg0RkZUOgotCXN0bWRiICAgICBzcCEsIHtyNCAtIHIxMSwgbHJ9Ci0Jc3ViICAgICAgIHNwLCBzcCwgIzMyCi0KLQltb3YJCQlyMSwgcjEsIGFzciAjMgotCWNtcCAgICAgcjEsICMwCi0JYmVxICAgICBSYWRpeDRGRlRfRU5ECi0KLVJhZGl4NEZGVF9MT09QMToKLQltb3YgICAgIHIxNCwgcjAgICAgICAgICAgCQkJCQkJCUAgeHB0ciA9IGJ1ZkAKLQltb3YJCXIxMCwgcjEgCQkJCQkJCQkJCQkJQCBpID0gbnVtQAotCW1vdiAgICAgcjksIHIyLCBsc2wgIzMgIAkJCQkJCQlAIHN0ZXAgPSAyKmJnbkAKLQljbXAgICAgIHIxMCwgIzAKLQlzdHIJCXIwLCBbc3BdCi0Jc3RyCQlyMSwgW3NwLCAjNF0KLQlzdHIJCXIyLCBbc3AsICM4XQotCXN0cgkJcjMsIFtzcCwgIzEyXQotCWJlcSAgICAgUmFkaXg0RkZUX0xPT1AxX0VORAotCi1SYWRpeDRGRlRfTE9PUDI6Ci0JbW92ICAgICByMTIsIHIzCQkJCSAgICAgICAgCQkJCUAgY3NwdHIgPSB0d2lkVGFiQAotCW1vdgkJcjExLCByMgkJCQkJCQkJCQkJCUAgaiA9IGJnbgotCWNtcCAgICAgcjExLCAjMAotCXN0cgkJcjEwLCBbc3AsICMxNl0KLQliZXEgICAgIFJhZGl4NEZGVF9MT09QMl9FTkQKLQotUmFkaXg0RkZUX0xPT1AzOgotCXN0cgkJCXIxMSwgW3NwLCAjMjBdCi0KLQlsZHJkCQlyMCwgW3IxNCwgIzBdCQkJCQkJCQkJQCByMCA9IHhwdHJbMF1AIHIxID0geHB0clsxXUAKLQlhZGQJCQlyMTQsIHIxNCwgcjkgCSAJCQkJCQkJCUAgeHB0ciArPSBzdGVwQAotCi0JbGRyZAkJcjEwLAlbcjE0LCAjMF0gIAkJCQkJIAkJCUAgcjIgPSB4cHRyWzBdQCByMyA9IHhwdHJbMV1ACi0JbGRyCQkJcjgsIFtyMTJdLCAjNAkJCQkJCQkJCUAgY29zeHNpbnggPSBjc3B0clswXUAKLQotCXNtdWx3dAlyNCwgcjEwLCByOAkJCQkJCQkJCQlAIExfbXB5X3d4KGNvc3gsIHQwKQotCXNtdWx3dAlyMywgcjExLCByOAkJCQkJCQkJCQlAIExfbXB5X3d4KGNvc3gsIHQxKQotCi0Jc21sYXdiCXIyLCByMTEsIHI4LCByNAkJCQkJCQkJQCByMiA9IExfbXB5X3d4KGNvc3gsIHQwKSArIExfbXB5X3d4KHNpbngsIHQxKUAKLQlzbXVsd2IJcjUsIHIxMCwgcjgJCQkJCQkJCQkJQCBMX21weV93eChzaW54LCB0MCkKLQotCW1vdgkJCXIxMCwgcjAsIGFzciAjMgkJCQkJCQkJQCB0MCA9IHIwID4+IDJACi0JbW92CQkJcjExLCByMSwgYXNyICMyCQkJCQkJCQlACXQxID0gcjEgPj4gMkAKLQotCXN1YgkJCXIzLCByMywgcjUJCQkJCQkJCQkJQCByMyA9IExfbXB5X3d4KGNvc3gsIHQxKSAtIExfbXB5X3d4KHNpbngsIHQwKUAKLQlhZGQgICAgIHIxNCwgcjE0LCByOSAJIAkJCQkJCQkJQCB4cHRyICs9IHN0ZXBACi0KLQlzdWIJCQlyMCwgcjEwLCByMgkJCQkJCQkJCQlAIHIwID0gdDAgLSByMkAKLQlzdWIJCQlyMSwgcjExLCByMwkJCQkJCQkJCSAgQCByMSA9IHQxIC0gcjNACi0KLQlhZGQJCQlyMiwgcjEwLCByMgkJCQkJCQkJCQlAIHIyID0gdDAgKyByMkAKLQlhZGQJCQlyMywgcjExLCByMwkJCQkJCQkJCQlAIHIzID0gdDEgKyByM0AKLQotCXN0cgkJCXIyLCBbc3AsICMyNF0KLQlzdHIJCQlyMywgW3NwLCAjMjhdCi0KLQlsZHJkCQlyMTAsIFtyMTQsICMwXQkJCQkJCQkJQCByNCA9IHhwdHJbMF1AIHI1ID0geHB0clsxXUAKLQlsZHIJCQlyOCwgW3IxMl0sICM0CQkJCQkJCQkJQCBjb3N4c2lueCA9IGNzcHRyWzFdQAotCi0Jc211bHd0CXI2LCByMTAsIHI4CQkJCQkJCQkJCUAgTF9tcHlfd3goY29zeCwgdDApCi0Jc211bHd0CXI1LCByMTEsIHI4CQkJCQkJCQkJCUAgTF9tcHlfd3goY29zeCwgdDEpCi0KLQlzbWxhd2IJcjQsIHIxMSwgcjgsIHI2CQkJCQkJCQlAIHI0ID0gTF9tcHlfd3goY29zeCwgdDApICsgTF9tcHlfd3goc2lueCwgdDEpQAotCXNtdWx3YglyNywgcjEwLCByOAkJCQkJCQkJCQlAIExfbXB5X3d4KHNpbngsIHQwKQotCi0JYWRkCQkJcjE0LCByMTQsIHI5CQkJCQkJCQkJQCB4cHRyICs9IHN0ZXBACi0Jc3ViCQkJcjUsIHI1LCByNwkJCQkJCQkJCQlAIHI1ID0gTF9tcHlfd3goY29zeCwgdDEpIC0gTF9tcHlfd3goc2lueCwgdDApQAotCi0JbGRyZAkJcjEwLCBbcjE0XQkJCQkJCQkJCQlAIHI2ID0geHB0clswXUAgcjcgPSB4cHRyWzFdQAotCWxkcgkJCXI4LCBbcjEyXSwgIzQJCQkJCQkJCQlAIGNvc3hzaW54ID0gY3NwdHJbMV1ACi0KLQlzbXVsd3QJcjIsIHIxMCwgcjgJCQkJCQkJCQkJQCBMX21weV93eChjb3N4LCB0MCkKLQlzbXVsd3QJcjcsIHIxMSwgcjgJCQkJCQkJCQkJQCBMX21weV93eChjb3N4LCB0MSkKLQotCXNtbGF3YglyNiwgcjExLCByOCwgcjIJCQkJCQkJCUAgcjQgPSBMX21weV93eChjb3N4LCB0MCkgKyBMX21weV93eChzaW54LCB0MSlACi0Jc211bHdiCXIzLCByMTAsIHI4CQkJCQkJCQkJCUAgTF9tcHlfd3goc2lueCwgdDApCi0KLQltb3YJCQlyMTAsIHI0CQkJCQkJCQkJCQkJQCB0MCA9IHI0QAotCW1vdgkJCXIxMSwgcjUJCQkJCQkJCQkJCQlAIHQxID0gcjVACi0KLQlzdWIJCQlyNywgcjcsIHIzCQkJCQkJCQkJCUAgcjUgPSBMX21weV93eChjb3N4LCB0MSkgLSBMX21weV93eChzaW54LCB0MClACi0KLQotCWFkZAkJCXI0LCAgcjEwLCByNgkJCQkJCQkJCUAJcjQgPSB0MCArIHI2QAotCXN1YgkJCXI1LCByNywgcjExCQkJCQkJCQkJCUAgcjUgPSByNyAtIHQxQAotCi0Jc3ViCQkJcjYsIHIxMCwgcjYJCQkJCQkJCQkJQCByNiA9IHQwIC0gcjZACi0JYWRkCQkJcjcsIHI3LCByMTEJCQkJCQkJCQkJQCByNyA9IHI3ICsgdDFACi0KLQlsZHIJCQlyMiwgW3NwLCAjMjRdCi0JbGRyCQkJcjMsIFtzcCwgIzI4XQotCi0JYWRkCQkJcjEwLCByMCwgcjUJCQkJCQkJCQkJQCB4cHRyWzBdID0gcjAgKyByNUAKLQlhZGQJCQlyMTEsIHIxLCByNgkJCQkJCQkJCQlAIHhwdHJbMF0gPSByMSArIHI2Ci0KLQlzdHJkCQlyMTAsIFtyMTRdCi0Jc3ViCQkJcjE0LCByMTQsIHI5CQkJCQkJCQkJQCB4cHRyIC09IHN0ZXBACi0KLQlzdWIJCQlyMTAsIHIyLCByNAkJCQkJCQkJCQlACXhwdHJbMF0gPSByMiAtIHI0QAotCXN1YgkJCXIxMSwgcjMsIHI3CQkJCQkJCQkJCUAgeHB0clsxXSA9IHIzIC0gcjdACi0KLQlzdHJkCQlyMTAsIFtyMTRdCi0Jc3ViCQkJcjE0LCByMTQsIHI5CQkJCQkJCQkJQCB4cHRyIC09IHN0ZXBACi0KLQlzdWIJCQlyMTAsIHIwLCByNQkJCQkJCQkJCQlAIHhwdHJbMF0gPSByMCAtIHI1QAotCXN1YgkJCXIxMSwgcjEsIHI2CQkJCQkJCQkJCUAgeHB0clswXSA9IHIxIC0gcjYKLQotCXN0cmQJCXIxMCwgW3IxNF0KLQlzdWIJCQlyMTQsIHIxNCwgcjkJCQkJCQkJCQlAIHhwdHIgLT0gc3RlcEAKLQotCWFkZAkJCXIxMCwgcjIsIHI0CQkJCQkJCQkJCUAJeHB0clswXSA9IHIyIC0gcjRACi0JYWRkCQkJcjExLCByMywgcjcJCQkJCQkJCQkJQCB4cHRyWzFdID0gcjMgLSByN0AKLQotCXN0cmQJCXIxMCwgW3IxNF0KLQlhZGQJCQlyMTQsIHIxNCwgIzgJCQkJCQkJCQlAIHhwdHIgKz0gMkAKLQotCWxkcgkJCXIxMSwgW3NwLCAjMjBdCi0Jc3VicwkJcjExLCByMTEsICMxCi0JYm5lCQkJUmFkaXg0RkZUX0xPT1AzCi0KLVJhZGl4NEZGVF9MT09QMl9FTkQ6Ci0JbGRyCQkJcjEwLCBbc3AsICMxNl0KLQlsZHIJCQlyMywgW3NwLCAjMTJdCi0JbGRyCQkJcjIsIFtzcCwgIzhdCi0JcnNiCQkJcjgsIHI5LCByOSwgbHNsICMyCi0Jc3ViCQkJcjEwLCByMTAsICMxCi0JYWRkCQkJcjE0LCByMTQsIHI4Ci0JY21wCQkJcjEwLCAjMAotCWJoaSAgICAgUmFkaXg0RkZUX0xPT1AyCi0KLVJhZGl4NEZGVF9MT09QMV9FTkQ6Ci0JbGRyICAgICByMCwgW3NwXQotCWxkcgkJcjEsIFtzcCwgIzRdCi0JYWRkICAgICByMywgcjMsIHI4LCBhc3IgIzEKLQltb3YgICAgIHIyLCByMiwgbHNsICMyCi0JbW92cyAgICByMSwgcjEsIGFzciAjMgotCWJuZSAgICAgUmFkaXg0RkZUX0xPT1AxCi0KLVJhZGl4NEZGVF9FTkQ6Ci0JYWRkICAgICBzcCwgc3AsICMzMgotCWxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfQotCi0JQEVORFAgIEAgfFJhZGl4NEZGVHwKLQkuZW5kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL2JhbmRfbnJnX3Y1LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL2JhbmRfbnJnX3Y1LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ODlmNmQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9iYW5kX25yZ192NS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLUAvKgotQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotQCAqKgotQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLUAgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLUAgKioKLUAgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotQCAqKgotQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1AICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1AICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1AICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotQCAqLwotCi1AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBACi1ACUZpbGU6CQliYW5kX25yZ192NS5zCi1ACi1ACUNvbnRlbnQ6CUNhbGNCYW5kRW5lcmd5IGFuZCBDYWxjQmFuZEVuZXJneU1TIGZ1bmN0aW9uIGFybXY1IGFzc2VtYmxlCi1ACi1AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAotCi0JLnNlY3Rpb24gLnRleHQKLQotCS5nbG9iYWwJQ2FsY0JhbmRFbmVyZ3kKLQotQ2FsY0JhbmRFbmVyZ3k6Ci0Jc3RtZGIgICBzcCEsIHtyNCAtIHIxMSwgbHJ9Ci0KLSAgbW92ICAgICByMiwgcjIsIGxzbCAjMTYKLQlsZHIgICAgIHIxMiwgW3IxMywgIzM2XQotCW1vdgkJCXI5LCAjMAotICBtb3YgICAgIHI1LCByMiwgYXNyICMxNgotCW1vdgkJCXI0LCAjMAotICBjbXAgICAgIHI1LCAjMAotCWJsZSAgICAgTDIxMgotCi1MMjI6Ci0gIG1vdiAgICAgcjIsIHI0LCBsc2wgIzEKLSAgbGRyc2ggICByMTAsIFtyMSwgcjJdCi0gIGFkZCAgICAgcjExLCByMSwgcjIKLSAgbGRyc2ggICByMiwgW3IxMSwgIzJdCi0JbW92ICAgICByMTQsICMwCi0gIGNtcCAgICAgcjEwLCByMgotICBiZ2UgICAgIEwyOAotCi1MMjM6Ci0JbGRyICAgICByMTEsIFtyMCwgK3IxMCwgbHNsICMyXQotICBhZGQgICAgIHIxMCwgcjEwLCAjMQotCWxkciAgICAgcjYsIFtyMCwgK3IxMCwgbHNsICMyXQotCXNtdWxsICAgcjExLCByNywgcjExLCByMTEKLQlhZGQgICAgIHIxMCwgcjEwLCAjMQotCXNtdWxsCSAgcjYsIHI4LCByNiwgcjYKLQlsZHIgICAgIHIxMSwgW3IwLCArcjEwLCBsc2wgIzJdCi0JcWFkZAkgIHIxNCwgcjE0LCByNwotCWFkZCAgICAgcjEwLCByMTAsICMxCi0Jc211bGwJICByMTEsIHI3LCByMTEsIHIxMQotCWxkciAgICAgcjYsIFtyMCwgK3IxMCwgbHNsICMyXQotCXFhZGQJICByMTQsIHIxNCwgcjgKLQlzbXVsbAkgIHI2LCByOCwgcjYsIHI2Ci0gIGFkZCAgICAgcjEwLCByMTAsICMxCi0JcWFkZAkgIHIxNCwgcjE0LCByNwotCWNtcCAgICAgcjEwLCByMgotCXFhZGQJICByMTQsIHIxNCwgcjgKLQlibHQgICAgIEwyMwotCi1MMjg6Ci0JcWFkZAkgIHIxNCwgcjE0LCByMTQKLQlzdHIgICAgIHIxNCwgW3IzLCArcjQsIGxzbCAjMl0KLQlhZGQgICAgIHI0LCByNCwgIzEKLQlxYWRkCSAgcjksIHI5LCByMTQKLQljbXAgICAgIHI0LCByNQotCi0gIGJsdCAgICAgTDIyCi0KLUwyMTI6Ci0Jc3RyICAgICByOSwgW3IxMiwgIzBdCi0JbGRtaWEgICBzcCEsIHtyNCAtIHIxMSwgcGN9Ci0KLQlARU5EUCAgOyB8Q2FsY0JhbmRFbmVyZ3l8Ci0KLQkuZ2xvYmFsCUNhbGNCYW5kRW5lcmd5TVMKLQotQ2FsY0JhbmRFbmVyZ3lNUzoKLQlzdG1kYiAgIHNwISwge3I0IC0gcjExLCBscn0KLQlzdWIgICAgIHIxMywgcjEzLCAjMjQKLQotCW1vdiAgICAgcjEyLCAjMAotICBtb3YgICAgIHIzLCByMywgbHNsICMxNgotICBtb3YgICAgIHIxNCwgIzAKLQltb3YgICAgIHIzLCByMywgYXNyICMxNgotCWNtcCAgICAgcjMsICMwCi0JbW92CQkgIHI0LCAjMAotICBibGUgICAgIEwzMTUKLQotTDMyOgotCW1vdgkJICByNSwgcjQsIGxzbCAjMQotCW1vdgkJICByNiwgIzAKLQlsZHJzaCAgIHIxMCwgW3IyLCByNV0KLQlhZGQgICAgIHI1LCByMiwgcjUKLQltb3YJCSAgcjcsICMwCi0JbGRyc2gJICByMTEsIFtyNSwgIzJdCi0JY21wICAgICByMTAsIHIxMQotICBiZ2UgICAgIEwzOQotCi0Jc3RyCQkgIHIzLCBbcjEzLCAjNF0KLQlzdHIJCSAgcjQsIFtyMTMsICM4XQotCXN0cgkJICByMTIsIFtyMTMsICMxMl0KLQlzdHIJCSAgcjE0LCBbcjEzLCAjMTZdCi0KLUwzMzoKLQlsZHIgICAgIHI4LCBbcjAsICtyMTAsIGxzbCAjMl0KLQlsZHIgICAgIHI5LCBbcjEsICtyMTAsIGxzbCAjMl0KLQltb3YJCSAgcjgsIHI4LCBhc3IgIzEKLQlhZGQJCSAgcjEwLCByMTAsICMxCi0JbW92CQkgIHI5LCByOSwgYXNyICMxCi0KLQlsZHIgICAgIHIxMiwgW3IwLCArcjEwLCBsc2wgIzJdCi0JYWRkCQkgIHI1LCByOCwgcjkKLQlsZHIgICAgIHIxNCwgW3IxLCArcjEwLCBsc2wgIzJdCi0Jc3ViCQkgIHI4LCByOCwgcjkKLQotCXNtdWxsICAgcjUsIHIzLCByNSwgcjUKLQltb3YJCSAgcjEyLCByMTIsIGFzciAjMQotCXNtdWxsICAgcjgsIHI0LCByOCwgcjgKLQltb3YJCSAgcjE0LCByMTQsIGFzciAjMQotCi0JcWFkZAkgIHI2LCByNiwgcjMKLQlhZGQJCSAgcjUsIHIxMiwgcjE0Ci0JcWFkZAkgIHI3LCByNywgcjQKLQlzdWIJCSAgcjgsIHIxMiwgcjE0Ci0KLQlzbXVsbCAgIHI1LCByMywgcjUsIHI1Ci0JYWRkCQkgIHIxMCwgcjEwLCAjMQotCXNtdWxsICAgcjgsIHI0LCByOCwgcjgKLQotCXFhZGQJICByNiwgcjYsIHIzCi0JcWFkZAkgIHI3LCByNywgcjQKLQotCWxkciAgICAgcjgsIFtyMCwgK3IxMCwgbHNsICMyXQotCWxkciAgICAgcjksIFtyMSwgK3IxMCwgbHNsICMyXQotCW1vdgkJICByOCwgcjgsIGFzciAjMQotCWFkZAkJICByMTAsIHIxMCwgIzEKLQltb3YJCSAgcjksIHI5LCBhc3IgIzEKLQotCWxkciAgICAgcjEyLCBbcjAsICtyMTAsIGxzbCAjMl0KLQlhZGQJCSAgcjUsIHI4LCByOQotCWxkciAgICAgcjE0LCBbcjEsICtyMTAsIGxzbCAjMl0KLQlzdWIJCSAgcjgsIHI4LCByOQotCi0Jc211bGwgICByNSwgcjMsIHI1LCByNQotCW1vdgkJICByMTIsIHIxMiwgYXNyICMxCi0Jc211bGwgICByOCwgcjQsIHI4LCByOAotCW1vdgkJICByMTQsIHIxNCwgYXNyICMxCi0KLQlxYWRkCSAgcjYsIHI2LCByMwotCWFkZAkJICByNSwgcjEyLCByMTQKLQlxYWRkCSAgcjcsIHI3LCByNAotCXN1YgkJICByOCwgcjEyLCByMTQKLQotCXNtdWxsICAgcjUsIHIzLCByNSwgcjUKLQlhZGQJCSAgcjEwLCByMTAsICMxCi0Jc211bGwgICByOCwgcjQsIHI4LCByOAotCi0JcWFkZAkgIHI2LCByNiwgcjMKLQlxYWRkCSAgcjcsIHI3LCByNAotCi0JY21wICAgICByMTAsIHIxMQotCi0JYmx0CQkgIEwzMwotCi0JbGRyCQkgIHIzLCBbcjEzLCAjNF0KLQlsZHIJCSAgcjQsIFtyMTMsICM4XQotCWxkcgkJICByMTIsIFtyMTMsICMxMl0KLQlsZHIJCSAgcjE0LCBbcjEzLCAjMTZdCi1MMzk6Ci0JcWFkZAkgIHI2LCByNiwgcjYKLQlxYWRkCSAgcjcsIHI3LCByNwotCi0JbGRyCQkgIHI4LCBbcjEzLCAjNjBdCi0JbGRyCQkgIHI5LCBbcjEzLCAjNjhdCi0KLQlxYWRkCSAgcjEyLCByMTIsIHI2Ci0JcWFkZAkgIHIxNCwgcjE0LCByNwotCi0Jc3RyCQkgIHI2LCBbcjgsICtyNCwgbHNsICMyXQotCXN0ciAgICAgcjcsIFtyOSwgK3I0LCBsc2wgIzJdCi0KLQlhZGQJCSAgcjQsIHI0LCAjMQotCWNtcAkJICByNCwgcjMKLQlibHQgICAgIEwzMgotCi1MMzE1OgotCWxkcgkJICByOCwgW3IxMywgIzY0XQotCWxkcgkJICByOSwgW3IxMywgIzcyXQotCXN0cgkJICByMTIsIFtyOCwgIzBdCi0Jc3RyCQkgIHIxNCwgW3I5LCAjMF0KLQotCWFkZCAgICAgcjEzLCByMTMsICMyNAotCWxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfQotCUBFTkRQICA7IHxDYWxjQmFuZEVuZXJneU1TfAotCi0JLmVuZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY3L1ByZVBvc3RNRENUX3Y3LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjcvUHJlUG9zdE1EQ1RfdjcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y2Yjg4MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjcvUHJlUG9zdE1EQ1RfdjcucworKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi1ALyoKLUAgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLUAgKioKLUAgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci1AICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLUAgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1AICoqCi1AICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLUAgKioKLUAgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotQCAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotQCAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLUAgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotQCAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLUAgKi8KLQotQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAotQAlGaWxlOgkJUHJlUG9zdE1EQ1RfdjcucwotQAotQAlDb250ZW50OglwcmVtZGN0IGFuZCBwb3N0bWRjdCBmdW5jdGlvbiBhcm12NyBhc3NlbWJsZQotQAotQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAKLQotCS5zZWN0aW9uIC50ZXh0Ci0JLmdsb2JhbAlQcmVNRENUCi0JLmZuc3RhcnQKLQotUHJlTURDVDoKLQlzdG1kYiAgICAgc3AhLCB7cjQgLSByMTEsIGxyfQotCS5zYXZlCSAge3I0IC0gcjExLCBscn0KLQlmc3RtZmRkICAgc3AhLCB7ZDggLSBkMTV9Ci0JLnZzYXZlCSAge2Q4IC0gZDE1fQotCi0JYWRkICAgICAgICAgcjksIHIwLCByMSwgbHNsICMyCi0Jc3ViICAgICAgICAgcjMsIHI5LCAjMzIKLQotCW1vdnMgICAgICAgIHIxLCByMSwgYXNyICMyCi0JYmVxICAgICAgICAgUHJlTURDVF9FTkQKLQotUHJlTURDVF9MT09QOgotCVZMRDQuSTMyCQkJe2QwLCBkMiwgZDQsIGQ2fSwgW3IyXSEJCQkJQCBjb3NhID0gKmNzcHRyKytAIHNpbmEgPSAqY3NwdHIrK0AKLQlWTEQ0LkkzMgkJCXtkMSwgZDMsIGQ1LCBkN30sIFtyMl0hCQkJCUAgY29zYiA9ICpjc3B0cisrQCBzaW5iID0gKmNzcHRyKytACi0JVkxEMi5JMzIJCQl7ZDgsIGQ5LCBkMTAsIGQxMX0sIFtyMF0JCQlAIHRyMSA9ICooYnVmMCArIDApQCB0aTIgPSAqKGJ1ZjAgKyAxKUAKLQlWTEQyLkkzMgkJCXtkMTMsIGQxNX0sIFtyM10hCQkJCQlAIHRyMiA9ICooYnVmMSAtIDEpQCB0aTEgPSAqKGJ1ZjEgKyAwKUAKLQlWTEQyLkkzMgkJCXtkMTIsIGQxNH0sIFtyM10hCQkJCQlAIHRyMiA9ICooYnVmMSAtIDEpQCB0aTEgPSAqKGJ1ZjEgKyAwKUAKLQotCVZSRVY2NC4zMgkJCVE4LCBRNwotCVZSRVY2NC4zMgkJCVE5LCBRNgotCi0KLQlWUURNVUxILlMzMgkJUTEwLCBRMCwgUTQJCQkJCQkJCUAgTVVMSElHSChjb3NhLCB0cjEpCi0JVlFETVVMSC5TMzIJCVExMSwgUTEsIFE4CQkJCQkJCQlAIE1VTEhJR0goc2luYSwgdGkxKQotCVZRRE1VTEguUzMyCQlRMTIsIFEwLCBROAkJCQkJCQkJQCBNVUxISUdIKGNvc2EsIHRpMSkKLQlWUURNVUxILlMzMgkJUTEzLCBRMSwgUTQJCQkJCQkJCUAgTVVMSElHSChzaW5hLCB0cjEpCi0KLQlWQURELlMzMgkJCVEwLCBRMTAsIFExMQkJCQkJCUAgKmJ1ZjArKyA9IE1VTEhJR0goY29zYSwgdHIxKSArIE1VTEhJR0goc2luYSwgdGkxKUAKLQlWU1VCLlMzMgkJCVExLCBRMTIsIFExMwkJCQkJCUAgKmJ1ZjArKyA9IE1VTEhJR0goY29zYSwgdGkxKSAtIE1VTEhJR0goc2luYSwgdHIxKUAKLQotCVZTVDIuSTMyCQkJe2QwLCBkMSwgZDIsIGQzfSwgW3IwXSEKLQlzdWIJCQkJCQlyMywgcjMsICMzMgotCi0JVlFETVVMSC5TMzIJCVExMCwgUTIsIFE5CQkJCQkJCQkJCUAgTVVMSElHSChjb3NiLCB0cjIpCi0JVlFETVVMSC5TMzIJCVExMSwgUTMsIFE1CQkJCQkJCQkJCUAgTVVMSElHSChzaW5iLCB0aTIpCi0JVlFETVVMSC5TMzIJCVExMiwgUTIsIFE1CQkJCQkJCQkJCUAgTVVMSElHSChjb3NiLCB0aTIpCi0JVlFETVVMSC5TMzIJCVExMywgUTMsIFE5CQkJCQkJCQkJCUAgTVVMSElHSChzaW5iLCB0cjIpCi0KLQlWQURELlMzMgkJCVEwLCBRMTAsIFExMQkJCQkJCQkJCUAgTVVMSElHSChjb3NhLCB0cjIpICsgTVVMSElHSChzaW5hLCB0aTIpQAotCVZTVUIuUzMyCQkJUTEsIFExMiwgUTEzCQkJCQkJCQkJQCBNVUxISUdIKGNvc2EsIHRpMikgLSBNVUxISUdIKHNpbmEsIHRyMilACi0KLQlWUkVWNjQuMzIJCQlRMywgUTEKLQlWUkVWNjQuMzIJCQlRMiwgUTAKLQotCVZTVDIuSTMyCQl7ZDUsIGQ3fSwgW3IzXSEKLQlWU1QyLkkzMgkJe2Q0LCBkNn0sIFtyM10hCi0KLQlzdWJzICAgICAJCXIxLCByMSwgIzQKLQlzdWIJCSAgCQlyMywgcjMsICM2NAotCWJuZSAgICAgICAJUHJlTURDVF9MT09QCi0KLVByZU1EQ1RfRU5EOgotCWZsZG1mZGQgICBzcCEsIHtkOCAtIGQxNX0KLQlsZG1pYSAgICAgc3AhLCB7cjQgLSByMTEsIHBjfQotCUBFTkRQICBAIHxQcmVNRENUfAotCS5mbmVuZAotCi0JLnNlY3Rpb24gLnRleHQKLQkuZ2xvYmFsCVBvc3RNRENUCi0JLmZuc3RhcnQKLQotUG9zdE1EQ1Q6Ci0Jc3RtZGIgICAgIHNwISwge3I0IC0gcjExLCBscn0KLQkuc2F2ZQkgIHtyNCAtIHIxMSwgbHJ9Ci0JZnN0bWZkZCAgIHNwISwge2Q4IC0gZDE1fQotCS52c2F2ZQkgIHtkOCAtIGQxNX0KLQotCWFkZCAgICAgICAgIHI5LCByMCwgcjEsIGxzbCAjMgotCXN1YiAgICAgICAgIHIzLCByOSwgIzMyCi0KLQltb3ZzICAgICAgICByMSwgcjEsIGFzciAjMgotCWJlcSAgICAgICAgIFBvc3RNRENUX0VORAotCi1Qb3N0TURDVF9MT09QOgotCVZMRDQuSTMyCQkJe2QwLCBkMiwgZDQsIGQ2fSwgW3IyXSEJCQkJQCBjb3NhID0gKmNzcHRyKytAIHNpbmEgPSAqY3NwdHIrK0AKLQlWTEQ0LkkzMgkJCXtkMSwgZDMsIGQ1LCBkN30sIFtyMl0hCQkJCUAgY29zYiA9ICpjc3B0cisrQCBzaW5iID0gKmNzcHRyKytACi0JVkxEMi5JMzIJCQl7ZDgsIGQ5LCBkMTAsIGQxMX0sIFtyMF0JCQlAIHRyMSA9ICooemJ1ZjEgKyAwKUAgdGkxID0gKih6YnVmMSArIDEpQAotCVZMRDIuSTMyCQkJe2QxMywgZDE1fSwgW3IzXSEJCQkJCQkJQCB0cjIgPSAqKHpidWYyIC0gMSlAIHRpMiA9ICooemJ1ZjIgKyAwKUAKLQlWTEQyLkkzMgkJCXtkMTIsIGQxNH0sIFtyM10hCQkJCQkJCUAgdHIyID0gKih6YnVmMiAtIDEpQCB0aTIgPSAqKHpidWYyICsgMClACi0KLQlWUkVWNjQuMzIJCQlROCwgUTYKLQlWUkVWNjQuMzIJCQlROSwgUTcKLQotCVZRRE1VTEguUzMyCQlRMTAsIFEwLCBRNAkJCQkJCQkJCQlAIE1VTEhJR0goY29zYSwgdHIxKQotCVZRRE1VTEguUzMyCQlRMTEsIFExLCBRNQkJCQkJCQkJCQlAIE1VTEhJR0goc2luYSwgdGkxKQotCVZRRE1VTEguUzMyCQlRMTIsIFEwLCBRNQkJCQkJCQkJCQlAIE1VTEhJR0goY29zYSwgdGkxKQotCVZRRE1VTEguUzMyCQlRMTMsIFExLCBRNAkJCQkJCQkJCQlAIE1VTEhJR0goc2luYSwgdHIxKQotCi0JVkFERC5TMzIJCQlRMCwgUTEwLCBRMTEJCQkJCQkJCQlAICpidWYwKysgPSBNVUxISUdIKGNvc2EsIHRyMSkgKyBNVUxISUdIKHNpbmEsIHRpMSlACi0JVlNVQi5TMzIJCQlRNSwgUTEzLCBRMTIJCQkJCQkJCQlAICpidWYxLS0gPSBNVUxISUdIKHNpbmEsIHRyMSkgLSBNVUxISUdIKGNvc2EsIHRpMSlACi0KLQlWUURNVUxILlMzMgkJUTEwLCBRMiwgUTgJCQkJCQkJCQkJQCBNVUxISUdIKGNvc2IsIHRyMikKLQlWUURNVUxILlMzMgkJUTExLCBRMywgUTkJCQkJCQkJCQkJQCBNVUxISUdIKHNpbmIsIHRpMikKLQlWUURNVUxILlMzMgkJUTEyLCBRMiwgUTkJCQkJCQkJCQkJQCBNVUxISUdIKGNvc2IsIHRpMikKLQlWUURNVUxILlMzMgkJUTEzLCBRMywgUTgJCQkJCQkJCQkJQCBNVUxISUdIKHNpbmIsIHRyMikKLQotCVZBREQuUzMyCQkJUTQsIFExMCwgUTExCQkJCQkJCQkJQCAqYnVmMS0tID0gTVVMSElHSChjb3NhLCB0cjIpICsgTVVMSElHSChzaW5hLCB0aTIpQAotCVZTVUIuUzMyCQkJUTEsIFExMywgUTEyCQkJCQkJCQkJQCAqYnVmMCsrID0gTVVMSElHSChzaW5hLCB0cjIpIC0gTVVMSElHSChjb3NhLCB0aTIpQAotCi0JVlJFVjY0LjMyCQkJUTIsIFE0Ci0JVlJFVjY0LjMyCQkJUTMsIFE1Ci0KLQlzdWIJCQkJCQlyMywgcjMsICMzMgotCVZTVDIuSTMyCQkJe2QwLCBkMSwgZDIsIGQzfSwgW3IwXSEKLQotCVZTVDIuSTMyCQkJe2Q1LCBkN30sIFtyM10hCi0JVlNUMi5JMzIJCQl7ZDQsIGQ2fSwgW3IzXSEKLQotCXN1YnMgICAgIAkJCXIxLCByMSwgIzQKLQlzdWIJCSAgCQkJcjMsIHIzLCAjNjQKLQlibmUgICAgICAgCVBvc3RNRENUX0xPT1AKLQotUG9zdE1EQ1RfRU5EOgotCWZsZG1mZGQgICBzcCEsIHtkOCAtIGQxNX0KLQlsZG1pYSAgICAgc3AhLCB7cjQgLSByMTEsIHBjfQotCi0JQEVORFAgIAkJQCB8UG9zdE1EQ1R8Ci0JLmZuZW5kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjcvUjRSOEZpcnN0X3Y3LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjcvUjRSOEZpcnN0X3Y3LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZmE2YTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY3L1I0UjhGaXJzdF92Ny5zCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLUAvKgotQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotQCAqKgotQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLUAgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLUAgKioKLUAgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotQCAqKgotQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1AICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1AICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1AICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotQCAqLwotCi1AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBACi1ACUZpbGU6CQlSNFI4Rmlyc3RfdjcucwotQAotQAlDb250ZW50OglSYWRpeDhGaXJzdCBhbmQgUmFkaXg0Rmlyc3QgZnVuY3Rpb24gYXJtdjcgYXNzZW1ibGUKLUAKLUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBACi0KLQkuc2VjdGlvbiAudGV4dAotCS5nbG9iYWwJUmFkaXg4Rmlyc3QKLQkuZm5zdGFydAotCi1SYWRpeDhGaXJzdDoKLQlzdG1kYiAgICAgCQlzcCEsIHtyNCAtIHIxMSwgbHJ9Ci0JLnNhdmUJICAJCXtyNCAtIHIxMSwgbHJ9Ci0JZnN0bWZkZCAgIAkJc3AhLCB7ZDggLSBkMTV9Ci0JLnZzYXZlCSAgCQl7ZDggLSBkMTV9Ci0KLQlsZHIgICAgICAgCQlyMywgU1FSVDFfMgotCWNtcCAgICAgICAJCXIxLCAjMAotCi0JVkRVUC5JMzIgIAkJUTE1LCByMwotCWJlcSAgICAgICAJCVJhZGl4OEZpcnN0X0VORAotCi1SYWRpeDhGaXJzdF9MT09QOgotCVZMRDEuSTMyCQkJe2QwLCBkMSwgZDIsIGQzfSwJW3IwXSEKLQlWTEQxLkkzMgkJCXtkOCwgZDksIGQxMCwgZDExfSwJW3IwXSEKLQotCVZBREQuUzMyCQkJZDQsIGQwLCBkMQkJQCByMCA9IGJ1ZlswXSArIGJ1ZlsyXUBpMCA9IGJ1ZlsxXSArIGJ1ZlszXUAKLQlWU1VCLlMzMgkJCWQ1LCBkMCwgZDEJCUAgcjEgPSBidWZbMF0gLSBidWZbMl1AaTEgPSBidWZbMV0gLSBidWZbM11ACi0JVlNVQi5TMzIJCQlkNywgZDIsIGQzCQlAIHIyID0gYnVmWzRdIC0gYnVmWzZdQGkyID0gYnVmWzVdIC0gYnVmWzddQAotCVZBREQuUzMyCQkJZDYsIGQyLCBkMwkJQCByMyA9IGJ1Zls0XSArIGJ1Zls2XUBpMyA9IGJ1Zls1XSArIGJ1Zls3XUAKLQlWUkVWNjQuSTMyCQkJZDcsIGQ3Ci0KLQlWQURELlMzMgkJCVEwLCBRMiwgUTMJCUAgcjQgPSAocjAgKyByMilAaTQgPSAoaTAgKyBpMilAaTYgPSAoaTEgKyByMylAcjcgPSAocjEgKyBpMykKLQlWU1VCLlMzMgkJCVExLCBRMiwgUTMJCUAgcjUgPSAocjAgLSByMilAaTUgPSAoaTAgLSBpMilAcjYgPSAocjEgLSBpMylAaTcgPSAoaTEgLSByMylACi0KLQlWUkVWNjQuSTMyCQkJZDMsIGQzCi0KLQlWQURELlMzMgkJCWQ0LCBkOCwgZDkJCUAgcjAgPSBidWZbIDhdICsgYnVmWzEwXUBpMCA9IGJ1ZlsgOV0gKyBidWZbMTFdQAotCVZTVUIuUzMyCQkJZDcsIGQxMCwgZDExCUAgcjEgPSBidWZbMTJdIC0gYnVmWzE0XUBpMSA9IGJ1ZlsxM10gLSBidWZbMTVdQAotCVZBREQuUzMyCQkJZDYsIGQxMCwgZDExCUAgcjIgPSBidWZbMTJdICsgYnVmWzE0XUBpMiA9IGJ1ZlsxM10gKyBidWZbMTVdQAotCVZSRVY2NC5JMzIJCQlkNywgZDcKLQlWU1VCLlMzMgkJCWQ1LCBkOCwgZDkJCUAgcjMgPSBidWZbIDhdIC0gYnVmWzEwXUBpMyA9IGJ1ZlsgOV0gLSBidWZbMTFdQAotCi0JVlRSTi4zMgkJCQlkMSwgZDMKLQotCVZBREQuUzMyCQkJUTQsIFEyLCBRMwkJQCB0MCA9IChyMCArIHIyKSA+PiAxQHQxID0gKGkwICsgaTIpID4+IDFAaTAgPSBpMSArIHIzQHIyID0gcjEgKyBpM0AKLQlWU1VCLlMzMgkJCVE1LCBRMiwgUTMJCUAgdDIgPSAocjAgLSByMikgPj4gMUB0MyA9IChpMCAtIGkyKSA+PiAxQHIwID0gcjEgLSBpM0BpMiA9IGkxIC0gcjNACi0KLQlWUkVWNjQuSTMyCQkJZDMsIGQzCi0KLQlWU0hSLlMzMgkJCWQ4LCBkOCwgIzEKLQlWU0hSLlMzMgkJCVEwLCBRMCwgIzEKLQlWUkVWNjQuSTMyCQkJZDEwLCBkMTAKLQlWVFJOLjMyCQkJCWQxMSwgZDkKLQlWU0hSLlMzMgkJCVExLCBRMSwgIzEKLQlWU0hSLlMzMgkJCWQxMCwgZDEwLCAjMQotCVZSRVY2NC5JMzIJCQlkOSwgZDkKLQotCXN1YiAgICAgICAJCQlyMCwgcjAsICMweDQwCi0KLQlWQURELlMzMgkJCWQxMiwgZDAsIGQ4Ci0JVlNVQi5TMzIJCQlkMTYsIGQwLCBkOAotCVZBREQuUzMyCQkJZDE0LCBkMiwgZDEwCi0JVlNVQi5TMzIJCQlkMTgsIGQyLCBkMTAKLQotCVZTVUIuUzMyCQkJZDQsIGQxMSwgZDkKLQlWQURELlMzMgkJCWQ1LCBkMTEsIGQ5Ci0KLQlWUkVWNjQuSTMyCQkJZDE4LCBkMTgKLQotCVZRRE1VTEguUzMyCQkJUTMsIFEyLCBRMTUKLQlWVFJOLjMyCQkJCWQxNCwgZDE4Ci0JVlRSTi4zMgkJCQlkNiwgZDcKLQlWUkVWNjQuSTMyCQkJZDE4LCBkMTgKLQotCVZTVUIuUzMyCQkJZDE1LCBkMywgZDYKLQlWUkVWNjQuSTMyCQkJZDcsIGQ3Ci0JVkFERC5TMzIJCQlkMTksIGQzLCBkNgotCVZBREQuUzMyCQkJZDEzLCBkMSwgZDcKLQlWU1VCLlMzMgkJCWQxNywgZDEsIGQ3Ci0KLQlWUkVWNjQuSTMyCQkJZDE3LCBkMTcKLQlWVFJOLjMyCQkJCWQxMywgZDE3Ci0JVlJFVjY0LkkzMgkJCWQxNywgZDE3Ci0KLQlzdWJzICAgICAgIAkJCXIxLCByMSwgIzEKLQotCVZTVDEuSTMyCQkJe2QxMiwgZDEzLCBkMTQsIGQxNX0sIFtyMF0hCi0JVlNUMS5JMzIJCQl7ZDE2LCBkMTcsIGQxOCwgZDE5fSwgW3IwXSEKLQlibmUgICAgICAgCQkJUmFkaXg4Rmlyc3RfTE9PUAotCi1SYWRpeDhGaXJzdF9FTkQ6Ci0JZmxkbWZkZCAgIHNwISwge2Q4IC0gZDE1fQotCWxkbWlhICAgICBzcCEsIHtyNCAtIHIxMSwgcGN9Ci1TUVJUMV8yOgotCS53b3JkICAgICAgMHgyZDQxM2NjZAotCi0JQEVORFAgIEAgfFJhZGl4OEZpcnN0fAotCS5mbmVuZAotCi0JLnNlY3Rpb24gLnRleHQKLQkuZ2xvYmFsCVJhZGl4NEZpcnN0Ci0JLmZuc3RhcnQKLQotUmFkaXg0Rmlyc3Q6Ci0Jc3RtZGIgICAgIAlzcCEsIHtyNCAtIHIxMSwgbHJ9Ci0JLnNhdmUJICAJe3I0IC0gcjExLCBscn0KLQlmc3RtZmRkICAgCXNwISwge2Q4IC0gZDE1fQotCS52c2F2ZQkgIAl7ZDggLSBkMTV9Ci0KLQljbXAgICAgICAgCXIxLCAjMAotCWJlcSAgICAgICAJUmFkaXg0Rmlyc3RfRU5ECi0KLVJhZGl4NEZpcnN0X0xPT1A6Ci0JVkxEMS5JMzIJCQl7ZDAsIGQxLCBkMiwgZDN9LCBbcjBdCi0KLQlWQURELlMzMgkJCWQ0LCBkMCwgZDEJCQkJCQkJQCByMCA9IGJ1ZlswXSArIGJ1ZlsyXUAgcjEgPSBidWZbMV0gKyBidWZbM11ACi0JVlNVQi5TMzIJCQlkNSwgZDAsIGQxCQkJCQkJCUAgcjIgPSBidWZbMF0gLSBidWZbMl1AIHIzID0gYnVmWzFdIC0gYnVmWzNdQAotCVZTVUIuUzMyCQkJZDcsIGQyLCBkMwkJCQkJCQlAIHI0ID0gYnVmWzRdICsgYnVmWzZdQCByNSA9IGJ1Zls1XSArIGJ1Zls3XUAKLQlWQURELlMzMgkJCWQ2LCBkMiwgZDMJCQkJCQkJQCByNiA9IGJ1Zls0XSAtIGJ1Zls2XUAgcjcgPSBidWZbNV0gLSBidWZbN11ACi0KLQlWUkVWNjQuSTMyCQlkNywgZDcJCQkJCQkJCQlACi0KLQlWQURELlMzMgkJCVE0LCBRMiwgUTMKLQlWU1VCLlMzMgkJCVE1LCBRMiwgUTMKLQotCVZSRVY2NC5JMzIJCWQxMSwgZDExCi0JVlRSTi4zMgkJCQlkOSwgZDExCi0Jc3VicyAgICAgICAJCXIxLCByMSwgIzEKLQlWUkVWNjQuSTMyCQlkMTEsIGQxMQotCVZTVDEuSTMyCQkJe2Q4LCBkOSwgZDEwLCBkMTF9LCBbcjBdIQotCi0JYm5lICAgICAgIAkJUmFkaXg0Rmlyc3RfTE9PUAotCi1SYWRpeDRGaXJzdF9FTkQ6Ci0JZmxkbWZkZCAgIAkJc3AhLCB7ZDggLSBkMTV9Ci0JbGRtaWEgICAgCQlzcCEsIHtyNCAtIHIxMSwgcGN9Ci0KLQlARU5EUCAgQCB8UmFkaXg0Rmlyc3R8Ci0JLmZuZW5kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjcvUmFkaXg0RkZUX3Y3LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjcvUmFkaXg0RkZUX3Y3LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMWJjMzAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY3L1JhZGl4NEZGVF92Ny5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLUAvKgotQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotQCAqKgotQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLUAgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLUAgKioKLUAgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotQCAqKgotQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1AICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1AICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1AICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotQCAqLwotCi1AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBACi1ACUZpbGU6CQlSYWRpeDRGRlRfdjcucwotQAotQAlDb250ZW50OglSYWRpeDRGRlQgYXJtdjcgYXNzZW1ibGUKLUAKLUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBACi0KLQkuc2VjdGlvbiAudGV4dAotCS5nbG9iYWwJUmFkaXg0RkZUCi0JLmZuc3RhcnQKLQotUmFkaXg0RkZUOgotCXN0bWRiICAgIHNwISwge3I0IC0gcjExLCBscn0KLQkuc2F2ZQkge3I0IC0gcjExLCBscn0KLQlmc3RtZmRkICBzcCEsIHtkOCAtIGQxNX0KLQkudnNhdmUJIHtkOCAtIGQxNX0KLQotCW1vdgkJCXIxLCByMSwgYXNyICMyCi0JY21wICAgICAJcjEsICMwCi0JYmVxICAgICAJUmFkaXg0RkZUX0VORAotCi1SYWRpeDRGRlRfTE9PUDE6Ci0JbW92ICAgICAJcjUsIHIyLCBsc2wgIzEKLQltb3YgICAgIAlyOCwgcjAKLQltb3YgICAgIAlyNywgcjEKLQltb3YgICAgIAlyNSwgcjUsIGxzbCAjMgotCWNtcCAgICAgCXIxLCAjMAotCXJzYmVxICAgCXIxMiwgcjUsIHI1LCBsc2wgIzIKLQliZXEgICAgIAlSYWRpeDRGRlRfTE9PUDFfRU5ECi0KLQlyc2IgICAgIAlyMTIsIHI1LCByNSwgbHNsICMyCi0KLVJhZGl4NEZGVF9MT09QMjoKLQltb3YgICAgIAlyNiwgcjMKLQltb3YgICAgIAlyNCwgcjIKLQljbXAgICAgIAlyMiwgIzAKLQliZXEgICAgIAlSYWRpeDRGRlRfTE9PUDJfRU5ECi0KLVJhZGl4NEZGVF9MT09QMzoKLQlAcjAgPSB4cHRyWzBdQAotCUByMSA9IHhwdHJbMV1ACi0JVkxEMi5JMzIJCQl7RDAsIEQxLCBEMiwgRDN9LCBbcjhdCi0JVkxEMi5JMzIJCQl7RDI4LCBEMjksIEQzMCwgRDMxfSwgW3I2XSEJCUAgY29zeCA9IGNzcHRyWzBdQCBzaW54ID0gY3NwdHJbMV1ACi0KLQlhZGQJCQkJCXI4LCByOCwgcjUJCQkJCQkJCQkJQCB4cHRyICs9IHN0ZXBACi0JVkxEMi5JMzIJCQl7RDQsIEQ1LCBENixEN30sIFtyOF0JCQkJCUAgcjIgPSB4cHRyWzBdQCByMyA9IHhwdHJbMV1ACi0KLQlWUURNVUxILlMzMgkJUTEwLCBRMiwgUTE0CQkJCQkJCQkJQCBNVUxISUdIKGNvc3gsIHQwKQotCVZRRE1VTEguUzMyCQlRMTEsIFEzLCBRMTUJCQkJCQkJCQlAIE1VTEhJR0goc2lueCwgdDEpCi0JVlFETVVMSC5TMzIJCVExMiwgUTMsIFExNAkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MSkKLQlWUURNVUxILlMzMgkJUTEzLCBRMiwgUTE1CQkJCQkJCQkJQCBNVUxISUdIKHNpbngsIHQwKQotCi0JVkFERC5TMzIJCQlRMiwgUTEwLCBRMTEJCQkJCQkJCQlAIE1VTEhJR0goY29zeCwgdDApICsgTVVMSElHSChzaW54LCB0MSkKLQlWU1VCLlMzMgkJCVEzLCBRMTIsIFExMwkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MSkgLSBNVUxISUdIKHNpbngsIHQwKQotCi0JYWRkCQkJCQlyOCwgcjgsIHI1CQkJCQkJCQkJCUAgeHB0ciArPSBzdGVwQAotCVZTSFIuUzMyCQkJUTEwLCBRMCwgIzIJCQkJCQkJCQkJQCB0MCA9IHIwID4+IDJACi0JVlNIUi5TMzIJCQlRMTEsIFExLCAjMgkJCQkJCQkJCQlAIHQxID0gcjEgPj4gMkAKLQotCVZTVUIuUzMyCQkJUTAsCVExMCwgUTIJCQkJCQkJCQkJQCByMCA9IHQwIC0gcjJACi0JVlNVQi5TMzIJCQlRMSwJUTExLCBRMwkJCQkJCQkJCQlAIHIxID0gdDEgLSByM0AKLQlWQURELlMzMgkJCVEyLCBRMTAsIFEyCQkJCQkJCQkJCUAgcjIgPSB0MCArIHIyQAotCVZBREQuUzMyCQkJUTMsIFExMSwgUTMJCQkJCQkJCQkJQCByMyA9IHQxICsgcjNACi0KLQlWTEQyLkkzMgkJCXtEOCwgRDksIEQxMCwgRDExfSwgW3I4XQotCVZMRDIuSTMyCQkJe0QyOCwgRDI5LCBEMzAsIEQzMX0sIFtyNl0hCi0JYWRkCQkJCQkJcjgsIHI4LCByNQotCi0JVlFETVVMSC5TMzIJCVExMCwgUTQsIFExNAkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MCkKLQlWUURNVUxILlMzMgkJUTExLCBRNSwgUTE1CQkJCQkJCQkJQCBNVUxISUdIKHNpbngsIHQxKQotCVZRRE1VTEguUzMyCQlRMTIsIFE1LCBRMTQJCQkJCQkJCQlAIE1VTEhJR0goY29zeCwgdDEpCi0JVlFETVVMSC5TMzIJCVExMywgUTQsIFExNQkJCQkJCQkJCUAgTVVMSElHSChzaW54LCB0MCkKLQotCVZBREQuUzMyCQkJUTgsIFExMCwgUTExCQkJCQkJCQkJQCBNVUxISUdIKGNvc3gsIHQwKSArIE1VTEhJR0goc2lueCwgdDEpCi0JVlNVQi5TMzIJCQlROSwgUTEyLCBRMTMJCQkJCQkJCQlAIE1VTEhJR0goY29zeCwgdDEpIC0gTVVMSElHSChzaW54LCB0MCkKLQotCVZMRDIuSTMyCQl7RDEyLCBEMTMsIEQxNCwgRDE1fSwgW3I4XQotCVZMRDIuSTMyCQl7RDI4LCBEMjksIEQzMCwgRDMxfSwgW3I2XSEKLQotCVZRRE1VTEguUzMyCQlRMTAsIFE2LCBRMTQJCQkJCQkJCQlAIE1VTEhJR0goY29zeCwgdDApCi0JVlFETVVMSC5TMzIJCVExMSwgUTcsIFExNQkJCQkJCQkJCUAgTVVMSElHSChzaW54LCB0MSkKLQlWUURNVUxILlMzMgkJUTEyLCBRNywgUTE0CQkJCQkJCQkJQCBNVUxISUdIKGNvc3gsIHQxKQotCVZRRE1VTEguUzMyCQlRMTMsIFE2LCBRMTUJCQkJCQkJCQlAIE1VTEhJR0goc2lueCwgdDApCi0KLQlWQURELlMzMgkJCVE2LCBRMTAsIFExMQkJCQkJCQkJCUAgTVVMSElHSChjb3N4LCB0MCkgKyBNVUxISUdIKHNpbngsIHQxKQotCVZTVUIuUzMyCQkJUTcsIFExMiwgUTEzCQkJCQkJCQkJQCBNVUxISUdIKGNvc3gsIHQxKSAtIE1VTEhJR0goc2lueCwgdDApCi0KLQlWQURELlMzMgkJCVE0LCBROCwgUTYJCQkJCQkJCQkJQCByNCA9IHQwICsgcjZACi0JVlNVQi5TMzIJCQlRNSwgUTcsIFE5CQkJCQkJCQkJCUAgcjUgPSByNyAtIHQxQAotCVZTVUIuUzMyCQkJUTYsIFE4LCBRNgkJCQkJCQkJCQlAIHI2ID0gdDAgLSByNkAKLQlWQURELlMzMgkJCVE3LCBRNywgUTkJCQkJCQkJCQkJQCByNyA9IHI3ICsgdDFACi0KLQlWQURELlMzMgkJCVE4LCBRMCwgUTUJCQkJCQkJCQkJQCB4cHRyWzBdID0gcjAgKyByNUAKLQlWQURELlMzMgkJCVE5LCBRMSwgUTYJCQkJCQkJCQkJQCB4cHRyWzFdID0gcjEgKyByNkAKLQlWU1QyLkkzMgkJCXtEMTYsIEQxNywgRDE4LCBEMTl9LCBbcjhdCi0KLQlWU1VCLlMzMgkJCVExMCwgUTIsIFE0CQkJCQkJCQkJCUAgeHB0clswXSA9IHIyIC0gcjRACi0Jc3ViCQkJCQlyOCwgcjgsIHI1CQkJCQkJCQkJCUAgeHB0ciAtPSBzdGVwQAotCVZTVUIuUzMyCQkJUTExLCBRMywgUTcJCQkJCQkJCQkJQCB4cHRyWzFdID0gcjMgLSByN0AKLQlWU1QyLkkzMgkJCXtEMjAsIEQyMSwgRDIyLCBEMjN9LCBbcjhdCi0KLQlWU1VCLlMzMgkJCVE4LCBRMCwgUTUJCQkJCQkJCQkJQCB4cHRyWzBdID0gcjAgLSByNUAKLQlzdWIJCQkJCXI4LCByOCwgcjUJCQkJCQkJCQkJQCB4cHRyIC09IHN0ZXBACi0JVlNVQi5TMzIJCQlROSwgUTEsIFE2CQkJCQkJCQkJCUAgeHB0clsxXSA9IHIxIC0gcjZACi0JVlNUMi5JMzIJCQl7RDE2LCBEMTcsIEQxOCwgRDE5fSwgW3I4XQotCi0JVkFERC5TMzIJCQlRMTAsIFEyLCBRNAkJCQkJCQkJCQlAIHhwdHJbMF0gPSByMiArIHI0QAotCXN1YgkJCQkJcjgsIHI4LCByNQkJCQkJCQkJCQlAIHhwdHIgLT0gc3RlcEAKLQlWQURELlMzMgkJCVExMSwgUTMsIFE3CQkJCQkJCQkJCUAgeHB0clsxXSA9IHIzICsgcjdACi0JVlNUMi5JMzIJCQl7RDIwLCBEMjEsIEQyMiwgRDIzfSwgW3I4XSEKLQotCXN1YnMgICAgCQkJcjQsIHI0LCAjNAotCWJuZSAgICAgCQkJUmFkaXg0RkZUX0xPT1AzCi0KLVJhZGl4NEZGVF9MT09QMl9FTkQ6Ci0JYWRkICAgICAJCQlyOCwgcjgsIHIxMgotCXN1YiAgICAJCQkJcjcsIHI3LCAjMQotCWNtcAkJCQkJcjcsICMwCi0JYmhpICAgICAJCQlSYWRpeDRGRlRfTE9PUDIKLQotUmFkaXg0RkZUX0xPT1AxX0VORDoKLQlhZGQgICAgIAkJCXIzLCByMTIsIHIzCi0JbW92ICAgICAJCQlyMiwgcjIsIGxzbCAjMgotCW1vdnMgICAgCQkJcjEsIHIxLCBhc3IgIzIKLQlibmUgICAgIAkJCVJhZGl4NEZGVF9MT09QMQotCi1SYWRpeDRGRlRfRU5EOgotCWZsZG1mZGQgICAJCQlzcCEsIHtkOCAtIGQxNX0KLQlsZG1pYSAgIAkJCXNwISwge3I0IC0gcjExLCBwY30KLQotCUBFTkRQICBAIHxSYWRpeDRGRlR8Ci0JLmZuZW5kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iYW5kX25yZy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYmFuZF9ucmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQwMzRiOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iYW5kX25yZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJYmFuZF9ucmcuYwotCi0JQ29udGVudDoJQmFuZC9MaW5lIGVuZXJneSBjYWxjdWxhdGlvbnMgZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJiYXNpY19vcC5oIgotI2luY2x1ZGUgImJhbmRfbnJnLmgiCi0KLSNpZm5kZWYgQVJNVjVFCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogQ2FsY0JhbmRFbmVyZ3kKLSogZGVzY3JpcHRpb246ICAgQ2FsYyBzZmItYmFuZHdpc2UgbWRjdC1lbmVyZ2llcyBmb3IgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQ2FsY0JhbmRFbmVyZ3koY29uc3QgV29yZDMyICptZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqYmFuZE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICBudW1CYW5kcywKLSAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpiYW5kRW5lcmd5LAotICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKmJhbmRFbmVyZ3lTdW0pCi17Ci0gIFdvcmQzMiBpLCBqOwotICBXb3JkMzIgYWNjdVN1bSA9IDA7Ci0KLSAgZm9yIChpPTA7IGk8bnVtQmFuZHM7IGkrKykgewotICAgIFdvcmQzMiBhY2N1ID0gMDsKLSAgICBmb3IgKGo9YmFuZE9mZnNldFtpXTsgajxiYW5kT2Zmc2V0W2krMV07IGorKykKLSAgICAgIGFjY3UgPSBMX2FkZChhY2N1LCBNVUxISUdIKG1kY3RTcGVjdHJ1bVtqXSwgbWRjdFNwZWN0cnVtW2pdKSk7Ci0KLQlhY2N1ID0gTF9hZGQoYWNjdSwgYWNjdSk7Ci0gICAgYWNjdVN1bSA9IExfYWRkKGFjY3VTdW0sIGFjY3UpOwotICAgIGJhbmRFbmVyZ3lbaV0gPSBhY2N1OwotICB9Ci0gICpiYW5kRW5lcmd5U3VtID0gYWNjdVN1bTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IENhbGNCYW5kRW5lcmd5TVMKLSogZGVzY3JpcHRpb246ICAgQ2FsYyBzZmItYmFuZHdpc2UgbWRjdC1lbmVyZ2llcyBmb3IgbGVmdCBhZGQgb3IgbWludXMgcmlnaHQgY2hhbm5lbAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQ2FsY0JhbmRFbmVyZ3lNUyhjb25zdCBXb3JkMzIgKm1kY3RTcGVjdHJ1bUxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyICptZGN0U3BlY3RydW1SaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKmJhbmRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICBudW1CYW5kcywKLSAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKmJhbmRFbmVyZ3lNaWQsCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpiYW5kRW5lcmd5TWlkU3VtLAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqYmFuZEVuZXJneVNpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpiYW5kRW5lcmd5U2lkZVN1bSkKLXsKLQotICBXb3JkMzIgaSwgajsKLSAgV29yZDMyIGFjY3VNaWRTdW0gPSAwOwotICBXb3JkMzIgYWNjdVNpZGVTdW0gPSAwOwotCi0KLSAgZm9yKGk9MDsgaTxudW1CYW5kczsgaSsrKSB7Ci0gICAgV29yZDMyIGFjY3VNaWQgPSAwOwotICAgIFdvcmQzMiBhY2N1U2lkZSA9IDA7Ci0gICAgZm9yIChqPWJhbmRPZmZzZXRbaV07IGo8YmFuZE9mZnNldFtpKzFdOyBqKyspIHsKLSAgICAgIFdvcmQzMiBzcGVjbSwgc3BlY3M7Ci0gICAgICBXb3JkMzIgbCwgcjsKLQotICAgICAgbCA9IG1kY3RTcGVjdHJ1bUxlZnRbal0gPj4gMTsKLSAgICAgIHIgPSBtZGN0U3BlY3RydW1SaWdodFtqXSA+PiAxOwotICAgICAgc3BlY20gPSBsICsgcjsKLSAgICAgIHNwZWNzID0gbCAtIHI7Ci0gICAgICBhY2N1TWlkID0gTF9hZGQoYWNjdU1pZCwgTVVMSElHSChzcGVjbSwgc3BlY20pKTsKLSAgICAgIGFjY3VTaWRlID0gTF9hZGQoYWNjdVNpZGUsIE1VTEhJR0goc3BlY3MsIHNwZWNzKSk7Ci0gICAgfQotCi0JYWNjdU1pZCA9IExfYWRkKGFjY3VNaWQsIGFjY3VNaWQpOwotCWFjY3VTaWRlID0gTF9hZGQoYWNjdVNpZGUsIGFjY3VTaWRlKTsKLQliYW5kRW5lcmd5TWlkW2ldID0gYWNjdU1pZDsKLSAgICBhY2N1TWlkU3VtID0gTF9hZGQoYWNjdU1pZFN1bSwgYWNjdU1pZCk7Ci0gICAgYmFuZEVuZXJneVNpZGVbaV0gPSBhY2N1U2lkZTsKLSAgICBhY2N1U2lkZVN1bSA9IExfYWRkKGFjY3VTaWRlU3VtLCBhY2N1U2lkZSk7Ci0KLSAgfQotICAqYmFuZEVuZXJneU1pZFN1bSA9IGFjY3VNaWRTdW07Ci0gICpiYW5kRW5lcmd5U2lkZVN1bSA9IGFjY3VTaWRlU3VtOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdF9jbnQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdF9jbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjViMDM1ZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRfY250LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4ODUgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQliaXRfY250LmMKLQotCUNvbnRlbnQ6CUh1ZmZtYW4gQml0Y291bnRlciAmIGNvZGVyIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYml0X2NudC5oIgotI2luY2x1ZGUgImFhY19yb20uaCIKLQotI2RlZmluZSBISV9MVEFCKGEpICgoYSk+PjgpCi0jZGVmaW5lIExPX0xUQUIoYSkgKChhKSAmIDB4ZmYpCi0KLSNkZWZpbmUgRVhQQU5EKGEpICAoKCgoV29yZDMyKSgoYSkmMHhmZjAwKSkgPDwgOCl8KFdvcmQzMikoKGEpJjB4ZmYpKQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBjb3VudDFfMl8zXzRfNV82XzdfOF85XzEwXzExCi0qIGRlc2NyaXB0aW9uOiAgY291bnRzIHRhYmxlcyAxLTExCi0qIHJldHVybnM6Ci0qIGlucHV0OiAgICAgICAgcXVhbnRpemVkIHNwZWN0cnVtCi0qIG91dHB1dDogICAgICAgYml0Q291bnQgZm9yIHRhYmxlcyAxLTExCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgY291bnQxXzJfM180XzVfNl83XzhfOV8xMF8xMShjb25zdCBXb3JkMTYgKnZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICpiaXRDb3VudCkKLXsKLSAgV29yZDMyIHQwLHQxLHQyLHQzLGk7Ci0gIFdvcmQzMiBiYzFfMixiYzNfNCxiYzVfNixiYzdfOCxiYzlfMTA7Ci0gIFdvcmQxNiBiYzExLHNjOwotCi0gIGJjMV8yPTA7Ci0gIGJjM180PTA7Ci0gIGJjNV82PTA7Ci0gIGJjN184PTA7Ci0gIGJjOV8xMD0wOwotICBiYzExPTA7Ci0gIHNjPTA7Ci0KLSAgZm9yKGk9MDtpPHdpZHRoO2krPTQpewotCi0gICAgdDA9IHZhbHVlc1tpKzBdOwotICAgIHQxPSB2YWx1ZXNbaSsxXTsKLSAgICB0Mj0gdmFsdWVzW2krMl07Ci0gICAgdDM9IHZhbHVlc1tpKzNdOwotCi0gICAgLyogMSwyICovCi0KLSAgICBiYzFfMiA9IGJjMV8yICsgRVhQQU5EKGh1ZmZfbHRhYjFfMlt0MCsxXVt0MSsxXVt0MisxXVt0MysxXSk7Ci0KLSAgICAvKiA1LDYgKi8KLSAgICBiYzVfNiA9IGJjNV82ICsgRVhQQU5EKGh1ZmZfbHRhYjVfNlt0MCs0XVt0MSs0XSk7Ci0gICAgYmM1XzYgPSBiYzVfNiArIEVYUEFORChodWZmX2x0YWI1XzZbdDIrNF1bdDMrNF0pOwotCi0gICAgdDA9QUJTKHQwKTsKLSAgICB0MT1BQlModDEpOwotICAgIHQyPUFCUyh0Mik7Ci0gICAgdDM9QUJTKHQzKTsKLQotCi0gICAgYmMzXzQgPSBiYzNfNCArIEVYUEFORChodWZmX2x0YWIzXzRbdDBdW3QxXVt0Ml1bdDNdKTsKLQotICAgIGJjN184ID0gYmM3XzggKyBFWFBBTkQoaHVmZl9sdGFiN184W3QwXVt0MV0pOwotICAgIGJjN184ID0gYmM3XzggKyBFWFBBTkQoaHVmZl9sdGFiN184W3QyXVt0M10pOwotCi0gICAgYmM5XzEwID0gYmM5XzEwICsgRVhQQU5EKGh1ZmZfbHRhYjlfMTBbdDBdW3QxXSk7Ci0gICAgYmM5XzEwID0gYmM5XzEwICsgRVhQQU5EKGh1ZmZfbHRhYjlfMTBbdDJdW3QzXSk7Ci0KLSAgICBiYzExID0gYmMxMSArIGh1ZmZfbHRhYjExW3QwXVt0MV07Ci0gICAgYmMxMSA9IGJjMTEgKyBodWZmX2x0YWIxMVt0Ml1bdDNdOwotCi0KLSAgICBzYyA9IHNjICsgKHQwPjApICsgKHQxPjApICsgKHQyPjApICsgKHQzPjApOwotICB9Ci0KLSAgYml0Q291bnRbMV09ZXh0cmFjdF9oKGJjMV8yKTsKLSAgYml0Q291bnRbMl09ZXh0cmFjdF9sKGJjMV8yKTsKLSAgYml0Q291bnRbM109ZXh0cmFjdF9oKGJjM180KSArIHNjOwotICBiaXRDb3VudFs0XT1leHRyYWN0X2woYmMzXzQpICsgc2M7Ci0gIGJpdENvdW50WzVdPWV4dHJhY3RfaChiYzVfNik7Ci0gIGJpdENvdW50WzZdPWV4dHJhY3RfbChiYzVfNik7Ci0gIGJpdENvdW50WzddPWV4dHJhY3RfaChiYzdfOCkgKyBzYzsKLSAgYml0Q291bnRbOF09ZXh0cmFjdF9sKGJjN184KSArIHNjOwotICBiaXRDb3VudFs5XT1leHRyYWN0X2goYmM5XzEwKSArIHNjOwotICBiaXRDb3VudFsxMF09ZXh0cmFjdF9sKGJjOV8xMCkgKyBzYzsKLSAgYml0Q291bnRbMTFdPWJjMTEgKyBzYzsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogY291bnQzXzRfNV82XzdfOF85XzEwXzExCi0qIGRlc2NyaXB0aW9uOiAgY291bnRzIHRhYmxlcyAzLTExCi0qIHJldHVybnM6Ci0qIGlucHV0OiAgICAgICAgcXVhbnRpemVkIHNwZWN0cnVtCi0qIG91dHB1dDogICAgICAgYml0Q291bnQgZm9yIHRhYmxlcyAzLTExCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgY291bnQzXzRfNV82XzdfOF85XzEwXzExKGNvbnN0IFdvcmQxNiAqdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICpiaXRDb3VudCkKLXsKLSAgV29yZDMyIHQwLHQxLHQyLHQzLCBpOwotICBXb3JkMzIgYmMzXzQsYmM1XzYsYmM3XzgsYmM5XzEwOwotICBXb3JkMTYgYmMxMSxzYzsKLQotICBiYzNfND0wOwotICBiYzVfNj0wOwotICBiYzdfOD0wOwotICBiYzlfMTA9MDsKLSAgYmMxMT0wOwotICBzYz0wOwotCi0gIGZvcihpPTA7aTx3aWR0aDtpKz00KXsKLQotICAgIHQwPSB2YWx1ZXNbaSswXTsKLSAgICB0MT0gdmFsdWVzW2krMV07Ci0gICAgdDI9IHZhbHVlc1tpKzJdOwotICAgIHQzPSB2YWx1ZXNbaSszXTsKLQotICAgIC8qCi0gICAgICA1LDYKLSAgICAqLwotICAgIGJjNV82ID0gYmM1XzYgKyBFWFBBTkQoaHVmZl9sdGFiNV82W3QwKzRdW3QxKzRdKTsKLSAgICBiYzVfNiA9IGJjNV82ICsgRVhQQU5EKGh1ZmZfbHRhYjVfNlt0Mis0XVt0Mys0XSk7Ci0KLSAgICB0MD1BQlModDApOwotICAgIHQxPUFCUyh0MSk7Ci0gICAgdDI9QUJTKHQyKTsKLSAgICB0Mz1BQlModDMpOwotCi0KLSAgICBiYzNfNCA9IGJjM180ICsgRVhQQU5EKGh1ZmZfbHRhYjNfNFt0MF1bdDFdW3QyXVt0M10pOwotCi0gICAgYmM3XzggPSBiYzdfOCArIEVYUEFORChodWZmX2x0YWI3XzhbdDBdW3QxXSk7Ci0gICAgYmM3XzggPSBiYzdfOCArIEVYUEFORChodWZmX2x0YWI3XzhbdDJdW3QzXSk7Ci0KLSAgICBiYzlfMTAgPSBiYzlfMTAgKyBFWFBBTkQoaHVmZl9sdGFiOV8xMFt0MF1bdDFdKTsKLSAgICBiYzlfMTAgPSBiYzlfMTAgKyBFWFBBTkQoaHVmZl9sdGFiOV8xMFt0Ml1bdDNdKTsKLQotICAgIGJjMTEgPSBiYzExICsgaHVmZl9sdGFiMTFbdDBdW3QxXTsKLSAgICBiYzExID0gYmMxMSArIGh1ZmZfbHRhYjExW3QyXVt0M107Ci0KLQotICAgIHNjID0gc2MgKyAodDA+MCkgKyAodDE+MCkgKyAodDI+MCkgKyAodDM+MCk7Ci0gIH0KLQotICBiaXRDb3VudFsxXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFsyXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFszXT1leHRyYWN0X2goYmMzXzQpICsgc2M7Ci0gIGJpdENvdW50WzRdPWV4dHJhY3RfbChiYzNfNCkgKyBzYzsKLSAgYml0Q291bnRbNV09ZXh0cmFjdF9oKGJjNV82KTsKLSAgYml0Q291bnRbNl09ZXh0cmFjdF9sKGJjNV82KTsKLSAgYml0Q291bnRbN109ZXh0cmFjdF9oKGJjN184KSArIHNjOwotICBiaXRDb3VudFs4XT1leHRyYWN0X2woYmM3XzgpICsgc2M7Ci0gIGJpdENvdW50WzldPWV4dHJhY3RfaChiYzlfMTApICsgc2M7Ci0gIGJpdENvdW50WzEwXT1leHRyYWN0X2woYmM5XzEwKSArIHNjOwotICBiaXRDb3VudFsxMV09YmMxMSArIHNjOwotCi19Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogY291bnQ1XzZfN184XzlfMTBfMTEKLSogZGVzY3JpcHRpb246ICBjb3VudHMgdGFibGVzIDUtMTEKLSogcmV0dXJuczoKLSogaW5wdXQ6ICAgICAgICBxdWFudGl6ZWQgc3BlY3RydW0KLSogb3V0cHV0OiAgICAgICBiaXRDb3VudCBmb3IgdGFibGVzIDUtMTEKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgY291bnQ1XzZfN184XzlfMTBfMTEoY29uc3QgV29yZDE2ICp2YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICpiaXRDb3VudCkKLXsKLQotICBXb3JkMzIgdDAsdDEsaTsKLSAgV29yZDMyIGJjNV82LGJjN184LGJjOV8xMDsKLSAgV29yZDE2IGJjMTEsc2M7Ci0KLSAgYmM1XzY9MDsKLSAgYmM3Xzg9MDsKLSAgYmM5XzEwPTA7Ci0gIGJjMTE9MDsKLSAgc2M9MDsKLQotICBmb3IoaT0wO2k8d2lkdGg7aSs9Mil7Ci0KLSAgICB0MCA9IHZhbHVlc1tpKzBdOwotICAgIHQxID0gdmFsdWVzW2krMV07Ci0KLSAgICBiYzVfNiA9IGJjNV82ICsgRVhQQU5EKGh1ZmZfbHRhYjVfNlt0MCs0XVt0MSs0XSk7Ci0KLSAgICB0MD1BQlModDApOwotICAgIHQxPUFCUyh0MSk7Ci0KLSAgICBiYzdfOCA9IGJjN184ICsgRVhQQU5EKGh1ZmZfbHRhYjdfOFt0MF1bdDFdKTsKLSAgICBiYzlfMTAgPSBiYzlfMTAgKyBFWFBBTkQoaHVmZl9sdGFiOV8xMFt0MF1bdDFdKTsKLSAgICBiYzExID0gYmMxMSArIGh1ZmZfbHRhYjExW3QwXVt0MV07Ci0KLQotICAgIHNjID0gc2MgKyAodDA+MCkgKyAodDE+MCk7Ci0gIH0KLSAgYml0Q291bnRbMV09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbMl09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbM109SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbNF09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbNV09ZXh0cmFjdF9oKGJjNV82KTsKLSAgYml0Q291bnRbNl09ZXh0cmFjdF9sKGJjNV82KTsKLSAgYml0Q291bnRbN109ZXh0cmFjdF9oKGJjN184KSArIHNjOwotICBiaXRDb3VudFs4XT1leHRyYWN0X2woYmM3XzgpICsgc2M7Ci0gIGJpdENvdW50WzldPWV4dHJhY3RfaChiYzlfMTApICsgc2M7Ci0gIGJpdENvdW50WzEwXT1leHRyYWN0X2woYmM5XzEwKSArIHNjOwotICBiaXRDb3VudFsxMV09YmMxMSArIHNjOwotCi19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGNvdW50N184XzlfMTBfMTEKLSogZGVzY3JpcHRpb246ICBjb3VudHMgdGFibGVzIDctMTEKLSogcmV0dXJuczoKLSogaW5wdXQ6ICAgICAgICBxdWFudGl6ZWQgc3BlY3RydW0KLSogb3V0cHV0OiAgICAgICBiaXRDb3VudCBmb3IgdGFibGVzIDctMTEKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBjb3VudDdfOF85XzEwXzExKGNvbnN0IFdvcmQxNiAqdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgKmJpdENvdW50KQotewotICBXb3JkMzIgdDAsdDEsIGk7Ci0gIFdvcmQzMiBiYzdfOCxiYzlfMTA7Ci0gIFdvcmQxNiBiYzExLHNjOwotCi0gIGJjN184PTA7Ci0gIGJjOV8xMD0wOwotICBiYzExPTA7Ci0gIHNjPTA7Ci0KLSAgZm9yKGk9MDtpPHdpZHRoO2krPTIpewotCi0gICAgdDA9QUJTKHZhbHVlc1tpKzBdKTsKLSAgICB0MT1BQlModmFsdWVzW2krMV0pOwotCi0gICAgYmM3XzggPSBiYzdfOCArIEVYUEFORChodWZmX2x0YWI3XzhbdDBdW3QxXSk7Ci0gICAgYmM5XzEwID0gYmM5XzEwICsgRVhQQU5EKGh1ZmZfbHRhYjlfMTBbdDBdW3QxXSk7Ci0gICAgYmMxMSA9IGJjMTEgKyBodWZmX2x0YWIxMVt0MF1bdDFdOwotCi0KLSAgICBzYyA9IHNjICsgKHQwPjApICsgKHQxPjApOwotICB9Ci0gIGJpdENvdW50WzFdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzJdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzNdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzRdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzVdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzZdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzddPWV4dHJhY3RfaChiYzdfOCkgKyBzYzsKLSAgYml0Q291bnRbOF09ZXh0cmFjdF9sKGJjN184KSArIHNjOwotICBiaXRDb3VudFs5XT1leHRyYWN0X2goYmM5XzEwKSArIHNjOwotICBiaXRDb3VudFsxMF09ZXh0cmFjdF9sKGJjOV8xMCkgKyBzYzsKLSAgYml0Q291bnRbMTFdPWJjMTEgKyBzYzsKLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogY291bnQ5XzEwXzExCi0qIGRlc2NyaXB0aW9uOiAgY291bnRzIHRhYmxlcyA5LTExCi0qIHJldHVybnM6Ci0qIGlucHV0OiAgICAgICAgcXVhbnRpemVkIHNwZWN0cnVtCi0qIG91dHB1dDogICAgICAgYml0Q291bnQgZm9yIHRhYmxlcyA5LTExCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGNvdW50OV8xMF8xMShjb25zdCBXb3JkMTYgKnZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAqYml0Q291bnQpCi17Ci0KLSAgV29yZDMyIHQwLHQxLGk7Ci0gIFdvcmQzMiBiYzlfMTA7Ci0gIFdvcmQxNiBiYzExLHNjOwotCi0gIGJjOV8xMD0wOwotICBiYzExPTA7Ci0gIHNjPTA7Ci0KLSAgZm9yKGk9MDtpPHdpZHRoO2krPTIpewotCi0gICAgdDA9QUJTKHZhbHVlc1tpKzBdKTsKLSAgICB0MT1BQlModmFsdWVzW2krMV0pOwotCi0KLSAgICBiYzlfMTAgKz0gRVhQQU5EKGh1ZmZfbHRhYjlfMTBbdDBdW3QxXSk7Ci0gICAgYmMxMSA9IGJjMTEgKyBodWZmX2x0YWIxMVt0MF1bdDFdOwotCi0KLSAgICBzYyA9IHNjICsgKHQwPjApICsgKHQxPjApOwotICB9Ci0gIGJpdENvdW50WzFdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzJdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzNdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzRdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzVdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzZdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzddPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzhdPUlOVkFMSURfQklUQ09VTlQ7Ci0gIGJpdENvdW50WzldPWV4dHJhY3RfaChiYzlfMTApICsgc2M7Ci0gIGJpdENvdW50WzEwXT1leHRyYWN0X2woYmM5XzEwKSArIHNjOwotICBiaXRDb3VudFsxMV09YmMxMSArIHNjOwotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBjb3VudDExCi0qIGRlc2NyaXB0aW9uOiAgY291bnRzIHRhYmxlIDExCi0qIHJldHVybnM6Ci0qIGlucHV0OiAgICAgICAgcXVhbnRpemVkIHNwZWN0cnVtCi0qIG91dHB1dDogICAgICAgYml0Q291bnQgZm9yIHRhYmxlIDExCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSBzdGF0aWMgdm9pZCBjb3VudDExKGNvbnN0IFdvcmQxNiAqdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICpiaXRDb3VudCkKLXsKLSAgV29yZDMyIHQwLHQxLGk7Ci0gIFdvcmQxNiBiYzExLHNjOwotCi0gIGJjMTE9MDsKLSAgc2M9MDsKLSAgZm9yKGk9MDtpPHdpZHRoO2krPTIpewotICAgIHQwPUFCUyh2YWx1ZXNbaSswXSk7Ci0gICAgdDE9QUJTKHZhbHVlc1tpKzFdKTsKLSAgICBiYzExID0gYmMxMSArIGh1ZmZfbHRhYjExW3QwXVt0MV07Ci0KLQotICAgIHNjID0gc2MgKyAodDA+MCkgKyAodDE+MCk7Ci0gIH0KLQotICBiaXRDb3VudFsxXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFsyXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFszXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs0XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs1XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs2XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs3XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs4XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs5XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFsxMF09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbMTFdPWJjMTEgKyBzYzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGNvdW50RXNjCi0qIGRlc2NyaXB0aW9uOiAgY291bnRzIHRhYmxlIDExICh3aXRoIEVzYykKLSogcmV0dXJuczoKLSogaW5wdXQ6ICAgICAgICBxdWFudGl6ZWQgc3BlY3RydW0KLSogb3V0cHV0OiAgICAgICBiaXRDb3VudCBmb3IgdGFibGVzIDExICh3aXRoIEVzYykKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBjb3VudEVzYyhjb25zdCBXb3JkMTYgKnZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgKmJpdENvdW50KQotewotICBXb3JkMzIgdDAsdDEsdDAwLHQwMSxpOwotICBXb3JkMTYgYmMxMSxlYyxzYzsKLQotICBiYzExPTA7Ci0gIHNjPTA7Ci0gIGVjPTA7Ci0gIGZvcihpPTA7aTx3aWR0aDtpKz0yKXsKLSAgICB0MD1BQlModmFsdWVzW2krMF0pOwotICAgIHQxPUFCUyh2YWx1ZXNbaSsxXSk7Ci0KLQotICAgIHNjID0gc2MgKyAodDA+MCkgKyAodDE+MCk7Ci0KLSAgICB0MDAgPSBtaW4odDAsMTYpOwotICAgIHQwMSA9IG1pbih0MSwxNik7Ci0gICAgYmMxMSA9IGJjMTEgKyBodWZmX2x0YWIxMVt0MDBdW3QwMV07Ci0KLQotICAgIGlmKHQwID49IDE2KXsKLSAgICAgIGVjID0gZWMgKyA1OwotICAgICAgd2hpbGUoc3ViKHQwPSh0MCA+PiAxKSwgMTYpID49IDApIHsKLSAgICAgICAgZWMgPSBlYyArIDI7Ci0gICAgICB9Ci0gICAgfQotCi0KLSAgICBpZih0MSA+PSAxNil7Ci0gICAgICBlYyA9IGVjICsgNTsKLSAgICAgIHdoaWxlKHN1Yih0MT0odDEgPj4gMSksIDE2KSA+PSAwKSB7Ci0gICAgICAgIGVjID0gZWMgKyAyOwotICAgICAgfQotICAgIH0KLSAgfQotICBiaXRDb3VudFsxXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFsyXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFszXT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs0XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs1XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs2XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs3XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs4XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFs5XT1JTlZBTElEX0JJVENPVU5UOwotICBiaXRDb3VudFsxMF09SU5WQUxJRF9CSVRDT1VOVDsKLSAgYml0Q291bnRbMTFdPWJjMTEgKyBzYyArIGVjOwotfQotCi0KLXR5cGVkZWYgdm9pZCAoKkNPVU5UX0ZVTkNUSU9OKShjb25zdCBXb3JkMTYgKnZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAqYml0Q291bnQpOwotCi1zdGF0aWMgQ09VTlRfRlVOQ1RJT04gY291bnRGdW5jVGFibGVbQ09ERV9CT09LX0VTQ19MQVYrMV0gPQotICB7Ci0KLSAgICBjb3VudDFfMl8zXzRfNV82XzdfOF85XzEwXzExLCAgLyogMCAgKi8KLSAgICBjb3VudDFfMl8zXzRfNV82XzdfOF85XzEwXzExLCAgLyogMSAgKi8KLSAgICBjb3VudDNfNF81XzZfN184XzlfMTBfMTEsICAgICAgLyogMiAgKi8KLSAgICBjb3VudDVfNl83XzhfOV8xMF8xMSwgICAgICAgICAgLyogMyAgKi8KLSAgICBjb3VudDVfNl83XzhfOV8xMF8xMSwgICAgICAgICAgLyogNCAgKi8KLSAgICBjb3VudDdfOF85XzEwXzExLCAgICAgICAgICAgICAgLyogNSAgKi8KLSAgICBjb3VudDdfOF85XzEwXzExLCAgICAgICAgICAgICAgLyogNiAgKi8KLSAgICBjb3VudDdfOF85XzEwXzExLCAgICAgICAgICAgICAgLyogNyAgKi8KLSAgICBjb3VudDlfMTBfMTEsICAgICAgICAgICAgICAgICAgLyogOCAgKi8KLSAgICBjb3VudDlfMTBfMTEsICAgICAgICAgICAgICAgICAgLyogOSAgKi8KLSAgICBjb3VudDlfMTBfMTEsICAgICAgICAgICAgICAgICAgLyogMTAgKi8KLSAgICBjb3VudDlfMTBfMTEsICAgICAgICAgICAgICAgICAgLyogMTEgKi8KLSAgICBjb3VudDlfMTBfMTEsICAgICAgICAgICAgICAgICAgLyogMTIgKi8KLSAgICBjb3VudDExLCAgICAgICAgICAgICAgICAgICAgICAgLyogMTMgKi8KLSAgICBjb3VudDExLCAgICAgICAgICAgICAgICAgICAgICAgLyogMTQgKi8KLSAgICBjb3VudDExLCAgICAgICAgICAgICAgICAgICAgICAgLyogMTUgKi8KLSAgICBjb3VudEVzYyAgICAgICAgICAgICAgICAgICAgICAgLyogMTYgKi8KLSAgfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGJpdENvdW50Ci0qIGRlc2NyaXB0aW9uOiAgY291bnQgYml0cwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1Xb3JkMTYgYml0Q291bnQoY29uc3QgV29yZDE2ICp2YWx1ZXMsCi0gICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICB3aWR0aCwKLSAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgIG1heFZhbCwKLSAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgKmJpdENvdW50KQotewotICAvKgotICAgIGNoZWNrIGlmIHdlIGNhbiB1c2UgY29kZWJvb2sgMAotICAqLwotCi0gIGlmKG1heFZhbCA9PSAwKQotICAgIGJpdENvdW50WzBdID0gMDsKLSAgZWxzZQotICAgIGJpdENvdW50WzBdID0gSU5WQUxJRF9CSVRDT1VOVDsKLQotICBtYXhWYWwgPSBtaW4obWF4VmFsLCBDT0RFX0JPT0tfRVNDX0xBVik7Ci0gIGNvdW50RnVuY1RhYmxlW21heFZhbF0odmFsdWVzLHdpZHRoLGJpdENvdW50KTsKLQotICByZXR1cm4oMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBjb2RlVmFsdWVzCi0qIGRlc2NyaXB0aW9uOiAgd3JpdGUgaHVmZnVtIGJpdHMKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotV29yZDE2IGNvZGVWYWx1ZXMoV29yZDE2ICp2YWx1ZXMsIFdvcmQxNiB3aWR0aCwgV29yZDE2IGNvZGVCb29rLCBIQU5ETEVfQklUX0JVRiBoQml0c3RyZWFtKQotewotCi0gIFdvcmQzMiBpLCB0MCwgdDEsIHQyLCB0MywgdDAwLCB0MDE7Ci0gIFVXb3JkMTYgY29kZVdvcmQsIGNvZGVMZW5ndGg7Ci0gIFdvcmQxNiBzaWduLCBzaWduTGVuZ3RoOwotCi0KLSAgc3dpdGNoIChjb2RlQm9vaykgewotICAgIGNhc2UgQ09ERV9CT09LX1pFUk9fTk86Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ09ERV9CT09LXzFfTk86Ci0gICAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz00KSB7Ci0gICAgICAgIHQwICAgICAgICAgPSB2YWx1ZXNbaSswXTsKLSAgICAgICAgdDEgICAgICAgICA9IHZhbHVlc1tpKzFdOwotICAgICAgICB0MiAgICAgICAgID0gdmFsdWVzW2krMl07Ci0gICAgICAgIHQzICAgICAgICAgPSB2YWx1ZXNbaSszXTsKLSAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjFbdDArMV1bdDErMV1bdDIrMV1bdDMrMV07Ci0gICAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKGh1ZmZfbHRhYjFfMlt0MCsxXVt0MSsxXVt0MisxXVt0MysxXSk7Ci0gICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLCBjb2RlV29yZCwgY29kZUxlbmd0aCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ09ERV9CT09LXzJfTk86Ci0gICAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz00KSB7Ci0gICAgICAgIHQwICAgICAgICAgPSB2YWx1ZXNbaSswXTsKLSAgICAgICAgdDEgICAgICAgICA9IHZhbHVlc1tpKzFdOwotICAgICAgICB0MiAgICAgICAgID0gdmFsdWVzW2krMl07Ci0gICAgICAgIHQzICAgICAgICAgPSB2YWx1ZXNbaSszXTsKLSAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjJbdDArMV1bdDErMV1bdDIrMV1bdDMrMV07Ci0gICAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKGh1ZmZfbHRhYjFfMlt0MCsxXVt0MSsxXVt0MisxXVt0MysxXSk7Ci0gICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENPREVfQk9PS18zX05POgotICAgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9NCkgewotICAgICAgICBzaWduPTA7Ci0gICAgICAgIHNpZ25MZW5ndGg9MDsKLSAgICAgICAgdDAgPSB2YWx1ZXNbaSswXTsKLQotICAgICAgICBpZih0MCAhPSAwKXsKLSAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7Ci0gICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsKLQotICAgICAgICAgIGlmKHQwIDwgMCl7Ci0gICAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgICAgdDA9LXQwOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0MSA9IHZhbHVlc1tpKzFdOwotCi0gICAgICAgIGlmKHQxICE9IDApewotICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsKLSAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOwotCi0gICAgICAgICAgaWYodDEgPCAwKXsKLSAgICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgICB0MT0tdDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHQyID0gdmFsdWVzW2krMl07Ci0KLSAgICAgICAgaWYodDIgIT0gMCl7Ci0gICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOwotICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7Ci0KLSAgICAgICAgICBpZih0MiA8IDApewotICAgICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICAgIHQyPS10MjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdDMgPSB2YWx1ZXNbaSszXTsKLSAgICAgICAgaWYodDMgIT0gMCl7Ci0gICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOwotICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7Ci0KLSAgICAgICAgICBpZih0MyA8IDApewotICAgICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICAgIHQzPS10MzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjb2RlV29yZCAgID0gaHVmZl9jdGFiM1t0MF1bdDFdW3QyXVt0M107Ci0gICAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKGh1ZmZfbHRhYjNfNFt0MF1bdDFdW3QyXVt0M10pOwotICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsKLSAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sc2lnbixzaWduTGVuZ3RoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDT0RFX0JPT0tfNF9OTzoKLSAgICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTQpIHsKLSAgICAgICAgc2lnbj0wOwotICAgICAgICBzaWduTGVuZ3RoPTA7Ci0gICAgICAgIHQwID0gdmFsdWVzW2krMF07Ci0KLSAgICAgICAgaWYodDAgIT0gMCl7Ci0gICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOwotICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7Ci0gICAgICAgICAgaWYodDAgPCAwKXsKLSAgICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgICB0MD0tdDA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHQxID0gdmFsdWVzW2krMV07Ci0KLSAgICAgICAgaWYodDEgIT0gMCl7Ci0gICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOwotICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7Ci0KLSAgICAgICAgICBpZih0MSA8IDApewotICAgICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICAgIHQxPS10MTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdDIgPSB2YWx1ZXNbaSsyXTsKLQotICAgICAgICBpZih0MiAhPSAwKXsKLSAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7Ci0gICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsKLQotICAgICAgICAgIGlmKHQyIDwgMCl7Ci0gICAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgICAgdDI9LXQyOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0MyA9IHZhbHVlc1tpKzNdOwotCi0gICAgICAgIGlmKHQzICE9IDApewotICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsKLSAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOwotCi0gICAgICAgICAgaWYodDMgPCAwKXsKLSAgICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgICB0Mz0tdDM7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvZGVXb3JkICAgPSBodWZmX2N0YWI0W3QwXVt0MV1bdDJdW3QzXTsKLSAgICAgICAgY29kZUxlbmd0aCA9IExPX0xUQUIoaHVmZl9sdGFiM180W3QwXVt0MV1bdDJdW3QzXSk7Ci0gICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwotICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxzaWduLHNpZ25MZW5ndGgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENPREVfQk9PS181X05POgotICAgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9MikgewotICAgICAgICB0MCAgICAgICAgID0gdmFsdWVzW2krMF07Ci0gICAgICAgIHQxICAgICAgICAgPSB2YWx1ZXNbaSsxXTsKLSAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjVbdDArNF1bdDErNF07Ci0gICAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKGh1ZmZfbHRhYjVfNlt0MCs0XVt0MSs0XSk7Ci0gICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENPREVfQk9PS182X05POgotICAgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9MikgewotICAgICAgICB0MCAgICAgICAgID0gdmFsdWVzW2krMF07Ci0gICAgICAgIHQxICAgICAgICAgPSB2YWx1ZXNbaSsxXTsKLSAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjZbdDArNF1bdDErNF07Ci0gICAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKGh1ZmZfbHRhYjVfNlt0MCs0XVt0MSs0XSk7Ci0gICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENPREVfQk9PS183X05POgotICAgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9Mil7Ci0gICAgICAgIHNpZ249MDsKLSAgICAgICAgc2lnbkxlbmd0aD0wOwotICAgICAgICB0MCA9IHZhbHVlc1tpKzBdOwotCi0gICAgICAgIGlmKHQwICE9IDApewotICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsKLSAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOwotCi0gICAgICAgICAgaWYodDAgPCAwKXsKLSAgICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgICB0MD0tdDA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdDEgPSB2YWx1ZXNbaSsxXTsKLQotICAgICAgICBpZih0MSAhPSAwKXsKLSAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7Ci0gICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsKLQotICAgICAgICAgIGlmKHQxIDwgMCl7Ci0gICAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgICAgdDE9LXQxOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb2RlV29yZCAgID0gaHVmZl9jdGFiN1t0MF1bdDFdOwotICAgICAgICBjb2RlTGVuZ3RoID0gSElfTFRBQihodWZmX2x0YWI3XzhbdDBdW3QxXSk7Ci0gICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwotICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxzaWduLHNpZ25MZW5ndGgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENPREVfQk9PS184X05POgotICAgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9MikgewotICAgICAgICBzaWduPTA7Ci0gICAgICAgIHNpZ25MZW5ndGg9MDsKLSAgICAgICAgdDAgPSB2YWx1ZXNbaSswXTsKLQotICAgICAgICBpZih0MCAhPSAwKXsKLSAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7Ci0gICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsKLQotICAgICAgICAgIGlmKHQwIDwgMCl7Ci0gICAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgICAgdDA9LXQwOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHQxID0gdmFsdWVzW2krMV07Ci0KLSAgICAgICAgaWYodDEgIT0gMCl7Ci0gICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOwotICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7Ci0KLSAgICAgICAgICBpZih0MSA8IDApewotICAgICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICAgIHQxPS10MTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjhbdDBdW3QxXTsKLSAgICAgICAgY29kZUxlbmd0aCA9IExPX0xUQUIoaHVmZl9sdGFiN184W3QwXVt0MV0pOwotICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsKLSAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sc2lnbixzaWduTGVuZ3RoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDT0RFX0JPT0tfOV9OTzoKLSAgICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsKLSAgICAgICAgc2lnbj0wOwotICAgICAgICBzaWduTGVuZ3RoPTA7Ci0gICAgICAgIHQwID0gdmFsdWVzW2krMF07Ci0KLSAgICAgICAgaWYodDAgIT0gMCl7Ci0gICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOwotICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7Ci0KLSAgICAgICAgICBpZih0MCA8IDApewotICAgICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICAgIHQwPS10MDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0MSA9IHZhbHVlc1tpKzFdOwotCi0gICAgICAgIGlmKHQxICE9IDApewotICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsKLSAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOwotCi0gICAgICAgICAgaWYodDEgPCAwKXsKLSAgICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgICB0MT0tdDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvZGVXb3JkICAgPSBodWZmX2N0YWI5W3QwXVt0MV07Ci0gICAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKGh1ZmZfbHRhYjlfMTBbdDBdW3QxXSk7Ci0gICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOwotICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxzaWduLHNpZ25MZW5ndGgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENPREVfQk9PS18xMF9OTzoKLSAgICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpIHsKLSAgICAgICAgc2lnbj0wOwotICAgICAgICBzaWduTGVuZ3RoPTA7Ci0gICAgICAgIHQwID0gdmFsdWVzW2krMF07Ci0KLSAgICAgICAgaWYodDAgIT0gMCl7Ci0gICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOwotICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7Ci0KLSAgICAgICAgICBpZih0MCA8IDApewotICAgICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICAgIHQwPS10MDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0MSA9IHZhbHVlc1tpKzFdOwotCi0gICAgICAgIGlmKHQxICE9IDApewotICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsKLSAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOwotCi0gICAgICAgICAgaWYodDEgPCAwKXsKLSAgICAgICAgICAgIHNpZ258PTE7Ci0gICAgICAgICAgICB0MT0tdDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvZGVXb3JkICAgPSBodWZmX2N0YWIxMFt0MF1bdDFdOwotICAgICAgICBjb2RlTGVuZ3RoID0gTE9fTFRBQihodWZmX2x0YWI5XzEwW3QwXVt0MV0pOwotICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsKLSAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sc2lnbixzaWduTGVuZ3RoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDT0RFX0JPT0tfRVNDX05POgotICAgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9MikgewotICAgICAgICBzaWduPTA7Ci0gICAgICAgIHNpZ25MZW5ndGg9MDsKLSAgICAgICAgdDAgPSB2YWx1ZXNbaSswXTsKLQotICAgICAgICBpZih0MCAhPSAwKXsKLSAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7Ci0gICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsKLQotICAgICAgICAgIGlmKHQwIDwgMCl7Ci0gICAgICAgICAgICBzaWdufD0xOwotICAgICAgICAgICAgdDA9LXQwOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHQxID0gdmFsdWVzW2krMV07Ci0KLSAgICAgICAgaWYodDEgIT0gMCl7Ci0gICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOwotICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7Ci0KLSAgICAgICAgICBpZih0MSA8IDApewotICAgICAgICAgICAgc2lnbnw9MTsKLSAgICAgICAgICAgIHQxPS10MTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdDAwID0gbWluKHQwLDE2KTsKLSAgICAgICAgdDAxID0gbWluKHQxLDE2KTsKLQotICAgICAgICBjb2RlV29yZCAgID0gaHVmZl9jdGFiMTFbdDAwXVt0MDFdOwotICAgICAgICBjb2RlTGVuZ3RoID0gaHVmZl9sdGFiMTFbdDAwXVt0MDFdOwotICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsKLSAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sc2lnbixzaWduTGVuZ3RoKTsKLQotICAgICAgICBpZih0MCA+PSAxNil7Ci0gICAgICAgICAgV29yZDE2IG4sIHA7Ci0gICAgICAgICAgbj0wOwotICAgICAgICAgIHA9dDA7Ci0gICAgICAgICAgd2hpbGUoc3ViKHA9KHAgPj4gMSksIDE2KSA+PSAwKXsKLQotICAgICAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sMSwxKTsKLSAgICAgICAgICAgIG4gPSBuICsgMTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sMCwxKTsKLSAgICAgICAgICBuID0gbiArIDQ7Ci0gICAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sKHQwIC0gKDEgPDwgbikpLG4pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYodDEgPj0gMTYpewotICAgICAgICAgIFdvcmQxNiBuLCBwOwotICAgICAgICAgIG49MDsKLSAgICAgICAgICBwPXQxOwotICAgICAgICAgIHdoaWxlKHN1YihwPShwID4+IDEpLCAxNikgPj0gMCl7Ci0KLSAgICAgICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLDEsMSk7Ci0gICAgICAgICAgICBuID0gbiArIDE7Ci0gICAgICAgICAgfQotICAgICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLDAsMSk7Ci0gICAgICAgICAgbiA9IG4gKyA0OwotICAgICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLCh0MSAtICgxIDw8IG4pKSxuKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuKDApOwotfQotCi1Xb3JkMTYgYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKFdvcmQxNiBkZWx0YSkKLXsKLSAgcmV0dXJuKGh1ZmZfbHRhYnNjZltkZWx0YStDT0RFX0JPT0tfU0NGX0xBVl0pOwotfQotCi1Xb3JkMTYgY29kZVNjYWxlZmFjdG9yRGVsdGEoV29yZDE2IGRlbHRhLCBIQU5ETEVfQklUX0JVRiBoQml0c3RyZWFtKQotewotICBXb3JkMzIgY29kZVdvcmQ7Ci0gIFdvcmQxNiBjb2RlTGVuZ3RoOwotCi0KLSAgaWYoZGVsdGEgPiBDT0RFX0JPT0tfU0NGX0xBViB8fCBkZWx0YSA8IC1DT0RFX0JPT0tfU0NGX0xBVikKLSAgICByZXR1cm4oMSk7Ci0KLSAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYnNjZltkZWx0YSArIENPREVfQk9PS19TQ0ZfTEFWXTsKLSAgY29kZUxlbmd0aCA9IGh1ZmZfbHRhYnNjZltkZWx0YSArIENPREVfQk9PS19TQ0ZfTEFWXTsKLSAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7Ci0gIHJldHVybigwKTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdGJ1ZmZlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYml0YnVmZmVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZWViZDAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYml0YnVmZmVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQliaXRidWZmZXIuYwotCi0JQ29udGVudDoJQml0IEJ1ZmZlciBNYW5hZ2VtZW50IGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYml0YnVmZmVyLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBDcmVhdGVCaXRCdWZmZXIKLSogZGVzY3JpcHRpb246ICBjcmVhdGUgYW5kIGluaXQgQml0IEJ1ZmZlciBNYW5hZ2VtZW50Ci0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUhBTkRMRV9CSVRfQlVGIENyZWF0ZUJpdEJ1ZmZlcihIQU5ETEVfQklUX0JVRiBoQml0QnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXb3JkOCAqcEJpdEJ1ZkJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBiaXRCdWZTaXplKQotewotICBhc3NlcnQoYml0QnVmU2l6ZSo4IDw9IDMyNzY4KTsKLQotICBoQml0QnVmLT5wQml0QnVmQmFzZSA9IHBCaXRCdWZCYXNlOwotICBoQml0QnVmLT5wQml0QnVmRW5kICA9IHBCaXRCdWZCYXNlICsgYml0QnVmU2l6ZSAtIDE7Ci0KLSAgaEJpdEJ1Zi0+cFdyaXRlTmV4dCAgPSBwQml0QnVmQmFzZTsKLQotICBoQml0QnVmLT5jYWNoZSAgICAgICA9IDA7Ci0KLSAgaEJpdEJ1Zi0+d0JpdFBvcyAgICAgPSAwOwotICBoQml0QnVmLT5jbnRCaXRzICAgICA9IDA7Ci0KLSAgaEJpdEJ1Zi0+c2l6ZSAgICAgICAgPSAoYml0QnVmU2l6ZSA8PCAzKTsKLSAgaEJpdEJ1Zi0+aXNWYWxpZCAgICAgPSAxOwotCi0gIHJldHVybiBoQml0QnVmOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogRGVsZXRlQml0QnVmZmVyCi0qIGRlc2NyaXB0aW9uOiAgdW5pbml0IEJpdCBCdWZmZXIgTWFuYWdlbWVudAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIERlbGV0ZUJpdEJ1ZmZlcihIQU5ETEVfQklUX0JVRiAqaEJpdEJ1ZikKLXsKLSAgaWYoKmhCaXRCdWYpCi0JKCpoQml0QnVmKS0+aXNWYWxpZCA9IDA7Ci0gICpoQml0QnVmID0gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IFJlc2V0Qml0QnVmCi0qIGRlc2NyaXB0aW9uOiAgcmVzZXQgQml0IEJ1ZmZlciBNYW5hZ2VtZW50Ci0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUmVzZXRCaXRCdWYoSEFORExFX0JJVF9CVUYgaEJpdEJ1ZiwKLSAgICAgICAgICAgICAgICAgVVdvcmQ4ICpwQml0QnVmQmFzZSwKLSAgICAgICAgICAgICAgICAgV29yZDE2ICBiaXRCdWZTaXplKQotewotICBoQml0QnVmLT5wQml0QnVmQmFzZSA9IHBCaXRCdWZCYXNlOwotICBoQml0QnVmLT5wQml0QnVmRW5kICA9IHBCaXRCdWZCYXNlICsgYml0QnVmU2l6ZSAtIDE7Ci0KLQotICBoQml0QnVmLT5wV3JpdGVOZXh0ICA9IHBCaXRCdWZCYXNlOwotCi0gIGhCaXRCdWYtPndCaXRQb3MgICAgID0gMDsKLSAgaEJpdEJ1Zi0+Y250Qml0cyAgICAgPSAwOwotCi0gIGhCaXRCdWYtPmNhY2hlCSAgID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IENvcHlCaXRCdWYKLSogZGVzY3JpcHRpb246ICBjb3B5IEJpdCBCdWZmZXIgTWFuYWdlbWVudAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIENvcHlCaXRCdWYoSEFORExFX0JJVF9CVUYgaEJpdEJ1ZlNyYywKLSAgICAgICAgICAgICAgICBIQU5ETEVfQklUX0JVRiBoQml0QnVmRHN0KQotewotICAqaEJpdEJ1ZkRzdCA9ICpoQml0QnVmU3JjOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogR2V0Qml0c0F2YWlsCi0qIGRlc2NyaXB0aW9uOiAgZ2V0IGF2YWlsYWJsZSBiaXRzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVdvcmQxNiBHZXRCaXRzQXZhaWwoSEFORExFX0JJVF9CVUYgaEJpdEJ1ZikKLXsKLSAgcmV0dXJuIGhCaXRCdWYtPmNudEJpdHM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBXcml0ZUJpdHMKLSogZGVzY3JpcHRpb246ICB3cml0ZSBiaXRzIHRvIHRoZSBidWZmZXIKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotV29yZDE2IFdyaXRlQml0cyhIQU5ETEVfQklUX0JVRiBoQml0QnVmLAotICAgICAgICAgICAgICAgICBVV29yZDMyIHdyaXRlVmFsdWUsCi0gICAgICAgICAgICAgICAgIFdvcmQxNiBub0JpdHNUb1dyaXRlKQotewotICBXb3JkMTYgd0JpdFBvczsKLQotICBhc3NlcnQobm9CaXRzVG9Xcml0ZSA8PSAoV29yZDE2KXNpemVvZihXb3JkMzIpKjgpOwotCi0gIGlmKG5vQml0c1RvV3JpdGUgPT0gMCkKLQkgIHJldHVybiBub0JpdHNUb1dyaXRlOwotCi0gIGhCaXRCdWYtPmNudEJpdHMgKz0gbm9CaXRzVG9Xcml0ZTsKLQotICB3Qml0UG9zID0gaEJpdEJ1Zi0+d0JpdFBvczsKLSAgd0JpdFBvcyArPSBub0JpdHNUb1dyaXRlOwotICB3cml0ZVZhbHVlICY9IH4oMHhmZmZmZmZmZiA8PCBub0JpdHNUb1dyaXRlKTsgLy8gTWFzayBvdXQgZXZlcnl0aGluZyBleGNlcHQgdGhlIGxvd2VzdCBub0JpdHNUb1dyaXRlIGJpdHMKLSAgd3JpdGVWYWx1ZSA8PD0gMzIgLSB3Qml0UG9zOwotICB3cml0ZVZhbHVlIHw9IGhCaXRCdWYtPmNhY2hlOwotCi0gIHdoaWxlICh3Qml0UG9zID49IDgpCi0gIHsKLQkgIFVXb3JkOCB0bXA7Ci0JICB0bXAgPSAoVVdvcmQ4KSgod3JpdGVWYWx1ZSA+PiAyNCkgJiAweEZGKTsKLQotCSAgKmhCaXRCdWYtPnBXcml0ZU5leHQrKyA9IHRtcDsKLQkgIHdyaXRlVmFsdWUgPDw9IDg7Ci0JICB3Qml0UG9zIC09IDg7Ci0gIH0KLQotICBoQml0QnVmLT53Qml0UG9zID0gd0JpdFBvczsKLSAgaEJpdEJ1Zi0+Y2FjaGUgPSB3cml0ZVZhbHVlOwotCi0gIHJldHVybiBub0JpdHNUb1dyaXRlOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYml0ZW5jLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRlbmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM4MTIwNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRlbmMuYworKysgL2Rldi9udWxsCkBAIC0xLDY5MyArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCWJpdGVuYy5jCi0KLQlDb250ZW50OglCaXRzdHJlYW0gZW5jb2RlciBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJpdGVuYy5oIgotI2luY2x1ZGUgImJpdF9jbnQuaCIKLSNpbmNsdWRlICJkeW5fYml0cy5oIgotI2luY2x1ZGUgInFjX2RhdGEuaCIKLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLQotI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCi0KLXN0YXRpYyBjb25zdCAgV29yZDE2IGdsb2JhbEdhaW5PZmZzZXQgPSAxMDA7Ci1zdGF0aWMgY29uc3QgIFdvcmQxNiBpY3NSZXNlcnZlZEJpdCAgID0gMDsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogZW5jb2RlU3BlY3RyYWxEYXRhCi0qIGRlc2NyaXB0aW9uOiAgZW5jb2RlIHNwZWN0cmFsIGRhdGEKLSogcmV0dXJuczogICAgICBzcGVjdHJhbCBiaXRzIHVzZWQKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQzMiBlbmNvZGVTcGVjdHJhbERhdGEoV29yZDE2ICAgICAgICAgICAgICpzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNUSU9OX0RBVEEgICAgICAgKnNlY3Rpb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICAgICpxdWFudFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0JJVF9CVUYgICAgICBoQml0U3RyZWFtKQotewotICBXb3JkMTYgaSxzZmI7Ci0gIFdvcmQxNiBkYmdWYWw7Ci0gIFNFQ1RJT05fSU5GTyogcHNlY3Rpb25pbmZvOwotICBkYmdWYWwgPSBHZXRCaXRzQXZhaWwoaEJpdFN0cmVhbSk7Ci0KLSAgZm9yKGk9MDsgaTxzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zOyBpKyspIHsKLSAgICBwc2VjdGlvbmluZm8gPSAmKHNlY3Rpb25EYXRhLT5zZWN0aW9uSW5mb1tpXSk7Ci0JLyoKLSAgICAgICBodWZmZW5jb2RlIHNwZWN0cmFsIGRhdGEgZm9yIHRoaXMgc2VjdGlvbgotICAgICovCi0gICAgZm9yKHNmYj1wc2VjdGlvbmluZm8tPnNmYlN0YXJ0OwotICAgICAgICBzZmI8cHNlY3Rpb25pbmZvLT5zZmJTdGFydCtwc2VjdGlvbmluZm8tPnNmYkNudDsKLSAgICAgICAgc2ZiKyspIHsKLSAgICAgIGNvZGVWYWx1ZXMocXVhbnRTcGVjdHJ1bStzZmJPZmZzZXRbc2ZiXSwKLSAgICAgICAgICAgICAgICAgc2ZiT2Zmc2V0W3NmYisxXSAtIHNmYk9mZnNldFtzZmJdLAotICAgICAgICAgICAgICAgICBwc2VjdGlvbmluZm8tPmNvZGVCb29rLAotICAgICAgICAgICAgICAgICBoQml0U3RyZWFtKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4oR2V0Qml0c0F2YWlsKGhCaXRTdHJlYW0pLWRiZ1ZhbCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOmVuY29kZUdsb2JhbEdhaW4KLSogZGVzY3JpcHRpb246IGVuY29kZXMgR2xvYmFsIEdhaW4gKGNvbW1vbiBzY2FsZSBmYWN0b3IpCi0qIHJldHVybnM6ICAgICBub25lCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGVuY29kZUdsb2JhbEdhaW4oV29yZDE2IGdsb2JhbEdhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBsb2dOb3JtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgc2NhbGVmYWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9CSVRfQlVGIGhCaXRTdHJlYW0pCi17Ci0gIFdyaXRlQml0cyhoQml0U3RyZWFtLCAoKGdsb2JhbEdhaW4gLSBzY2FsZWZhYykgKyBnbG9iYWxHYWluT2Zmc2V0LShsb2dOb3JtIDw8IDIpKSwgOCk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6ZW5jb2RlSWNzSW5mbwotKiBkZXNjcmlwdGlvbjogZW5jb2RlcyBJY3MgSW5mbwotKiByZXR1cm5zOiAgICAgbm9uZQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIGVuY29kZUljc0luZm8oV29yZDE2IGJsb2NrVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHdpbmRvd1NoYXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgZ3JvdXBpbmdNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNUSU9OX0RBVEEgKnNlY3Rpb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQklUX0JVRiAgaEJpdFN0cmVhbSkKLXsKLSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0saWNzUmVzZXJ2ZWRCaXQsMSk7Ci0gIFdyaXRlQml0cyhoQml0U3RyZWFtLGJsb2NrVHlwZSwyKTsKLSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sd2luZG93U2hhcGUsMSk7Ci0KLQotICBzd2l0Y2goYmxvY2tUeXBlKXsKLSAgICBjYXNlIExPTkdfV0lORE9XOgotICAgIGNhc2UgU1RBUlRfV0lORE9XOgotICAgIGNhc2UgU1RPUF9XSU5ET1c6Ci0gICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXAsNik7Ci0KLSAgICAgIC8qIE5vIHByZWRpY3RvciBkYXRhIHByZXNlbnQgKi8KLSAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAwLCAxKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSE9SVF9XSU5ET1c6Ci0gICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXAsNCk7Ci0KLSAgICAgIC8qCi0gICAgICBXcml0ZSBncm91cGluZyBiaXRzCi0gICAgICAqLwotICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sZ3JvdXBpbmdNYXNrLFRSQU5TX0ZBQy0xKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBlbmNvZGVTZWN0aW9uRGF0YQotKiBkZXNjcmlwdGlvbjogIGVuY29kZSBzZWN0aW9uIGRhdGEgKGNvbW1vbiBIdWZmbWFuIGNvZGVib29rcyBmb3IgYWRqYWNlbnQKLSogICAgICAgICAgICAgICBTRkIncykKLSogcmV0dXJuczogICAgICBub25lCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBXb3JkMzIgZW5jb2RlU2VjdGlvbkRhdGEoU0VDVElPTl9EQVRBICpzZWN0aW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0JJVF9CVUYgaEJpdFN0cmVhbSkKLXsKLSAgV29yZDE2IHNlY3RFc2NhcGVWYWw9MCxzZWN0TGVuQml0cz0wOwotICBXb3JkMTYgc2VjdExlbjsKLSAgV29yZDE2IGk7Ci0gIFdvcmQxNiBkYmdWYWw9R2V0Qml0c0F2YWlsKGhCaXRTdHJlYW0pOwotCi0KLQotICBzd2l0Y2goc2VjdGlvbkRhdGEtPmJsb2NrVHlwZSkKLSAgewotICAgIGNhc2UgTE9OR19XSU5ET1c6Ci0gICAgY2FzZSBTVEFSVF9XSU5ET1c6Ci0gICAgY2FzZSBTVE9QX1dJTkRPVzoKLSAgICAgIHNlY3RFc2NhcGVWYWwgPSBTRUNUX0VTQ19WQUxfTE9ORzsKLSAgICAgIHNlY3RMZW5CaXRzICAgPSBTRUNUX0JJVFNfTE9ORzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSE9SVF9XSU5ET1c6Ci0gICAgICBzZWN0RXNjYXBlVmFsID0gU0VDVF9FU0NfVkFMX1NIT1JUOwotICAgICAgc2VjdExlbkJpdHMgICA9IFNFQ1RfQklUU19TSE9SVDsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgZm9yKGk9MDtpPHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnM7aSsrKSB7Ci0gICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sc2VjdGlvbkRhdGEtPnNlY3Rpb25JbmZvW2ldLmNvZGVCb29rLDQpOwotICAgIHNlY3RMZW4gPSBzZWN0aW9uRGF0YS0+c2VjdGlvbkluZm9baV0uc2ZiQ250OwotCi0gICAgd2hpbGUoc2VjdExlbiA+PSBzZWN0RXNjYXBlVmFsKSB7Ci0KLSAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLHNlY3RFc2NhcGVWYWwsc2VjdExlbkJpdHMpOwotICAgICAgc2VjdExlbiA9IHNlY3RMZW4gLSBzZWN0RXNjYXBlVmFsOwotICAgIH0KLSAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxzZWN0TGVuLHNlY3RMZW5CaXRzKTsKLSAgfQotICByZXR1cm4oR2V0Qml0c0F2YWlsKGhCaXRTdHJlYW0pLWRiZ1ZhbCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBlbmNvZGVTY2FsZUZhY3RvckRhdGEKLSogZGVzY3JpcHRpb246ICBlbmNvZGUgRFBDTSBjb2RlZCBzY2FsZSBmYWN0b3JzCi0qIHJldHVybnM6ICAgICAgbm9uZQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDMyIGVuY29kZVNjYWxlRmFjdG9yRGF0YShVV29yZDE2ICAgICAgICAqbWF4VmFsdWVJblNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RJT05fREFUQSAgICpzZWN0aW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICpzY2FsZWZhYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9CSVRfQlVGICBoQml0U3RyZWFtKQotewotICBXb3JkMTYgaSxqLGxhc3RWYWxTY2YsZGVsdGFTY2Y7Ci0gIFdvcmQxNiBkYmdWYWwgPSBHZXRCaXRzQXZhaWwoaEJpdFN0cmVhbSk7Ci0gIFNFQ1RJT05fSU5GTyogcHNlY3Rpb25pbmZvOwotCi0gIGxhc3RWYWxTY2Y9c2NhbGVmYWNbc2VjdGlvbkRhdGEtPmZpcnN0U2NmXTsKLQotICBmb3IoaT0wO2k8c2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9ucztpKyspewotICAgIHBzZWN0aW9uaW5mbyA9ICYoc2VjdGlvbkRhdGEtPnNlY3Rpb25JbmZvW2ldKTsKLSAgICBpZiAocHNlY3Rpb25pbmZvLT5jb2RlQm9vayAhPSBDT0RFX0JPT0tfWkVST19OTyl7Ci0gICAgICBmb3IgKGo9cHNlY3Rpb25pbmZvLT5zZmJTdGFydDsKLSAgICAgICAgICAgajxwc2VjdGlvbmluZm8tPnNmYlN0YXJ0K3BzZWN0aW9uaW5mby0+c2ZiQ250OyBqKyspewotCi0gICAgICAgIGlmKG1heFZhbHVlSW5TZmJbal0gPT0gMCkgewotICAgICAgICAgIGRlbHRhU2NmID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBkZWx0YVNjZiA9IGxhc3RWYWxTY2YgLSBzY2FsZWZhY1tqXTsKLSAgICAgICAgICBsYXN0VmFsU2NmID0gc2NhbGVmYWNbal07Ci0gICAgICAgIH0KLQotICAgICAgICBpZihjb2RlU2NhbGVmYWN0b3JEZWx0YShkZWx0YVNjZixoQml0U3RyZWFtKSl7Ci0gICAgICAgICAgcmV0dXJuKDEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLSAgcmV0dXJuKEdldEJpdHNBdmFpbChoQml0U3RyZWFtKS1kYmdWYWwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTplbmNvZGVNc0luZm8KLSogZGVzY3JpcHRpb246IGVuY29kZXMgTVMtU3RlcmVvIEluZm8KLSogcmV0dXJuczogICAgIG5vbmUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgZW5jb2RlTVNJbmZvKFdvcmQxNiAgICAgICAgICBzZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgIGdycFNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgbWF4U2ZiLAotICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICBtc0RpZ2VzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAqanNGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQklUX0JVRiAgaEJpdFN0cmVhbSkKLXsKLSAgV29yZDE2IHNmYiwgc2ZiT2ZmOwotCi0KLSAgc3dpdGNoKG1zRGlnZXN0KQotICB7Ci0gICAgY2FzZSBNU19OT05FOgotICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sU0lfTVNfTUFTS19OT05FLDIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1TX0FMTDoKLSAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLFNJX01TX01BU0tfQUxMLDIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1TX1NPTUU6Ci0gICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxTSV9NU19NQVNLX1NPTUUsMik7Ci0gICAgICBmb3Ioc2ZiT2ZmID0gMDsgc2ZiT2ZmIDwgc2ZiQ250OyBzZmJPZmYrPWdycFNmYikgewotICAgICAgICBmb3Ioc2ZiPTA7IHNmYjxtYXhTZmI7IHNmYisrKSB7Ci0KLSAgICAgICAgICBpZihqc0ZsYWdzW3NmYk9mZitzZmJdICYgTVNfT04pIHsKLSAgICAgICAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLDEsMSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwwLDEpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gIH0KLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogZW5jb2RlVG5zRGF0YQotKiBkZXNjcmlwdGlvbjogIGVuY29kZSBUTlMgZGF0YSAoZmlsdGVyIG9yZGVyLCBjb2VmZnMsIC4uKQotKiByZXR1cm5zOiAgICAgIG5vbmUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgZW5jb2RlVG5zRGF0YShUTlNfSU5GTyB0bnNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYmxvY2tUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQklUX0JVRiBoQml0U3RyZWFtKSB7Ci0gIFdvcmQxNiBpLGs7Ci0gIEZsYWcgdG5zUHJlc2VudDsKLSAgV29yZDE2IG51bU9mV2luZG93czsKLSAgV29yZDE2IGNvZWZCaXRzOwotICBGbGFnIGlzU2hvcnQ7Ci0KLQotICBpZiAoYmxvY2tUeXBlPT0yKSB7Ci0gICAgaXNTaG9ydCA9IDE7Ci0gICAgbnVtT2ZXaW5kb3dzID0gVFJBTlNfRkFDOwotICB9Ci0gIGVsc2UgewotICAgIGlzU2hvcnQgPSAwOwotICAgIG51bU9mV2luZG93cyA9IDE7Ci0gIH0KLQotICB0bnNQcmVzZW50PTA7Ci0gIGZvciAoaT0wOyBpPG51bU9mV2luZG93czsgaSsrKSB7Ci0KLSAgICBpZiAodG5zSW5mby50bnNBY3RpdmVbaV0pIHsKLSAgICAgIHRuc1ByZXNlbnQ9MTsKLSAgICB9Ci0gIH0KLQotICBpZiAodG5zUHJlc2VudD09MCkgewotICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLDAsMSk7Ci0gIH0KLSAgZWxzZXsgLyogdGhlcmUgaXMgZGF0YSB0byBiZSB3cml0dGVuKi8KLSAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwxLDEpOyAvKmRhdGFfcHJlc2VudCAqLwotICAgIGZvciAoaT0wOyBpPG51bU9mV2luZG93czsgaSsrKSB7Ci0KLSAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLHRuc0luZm8udG5zQWN0aXZlW2ldLChpc1Nob3J0PzE6MikpOwotCi0gICAgICBpZiAodG5zSW5mby50bnNBY3RpdmVbaV0pIHsKLQotICAgICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwoKHRuc0luZm8uY29lZlJlc1tpXSAtIDQpPT0wPzE6MCksMSk7Ci0KLSAgICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sdG5zSW5mby5sZW5ndGhbaV0sKGlzU2hvcnQ/NDo2KSk7Ci0KLSAgICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sdG5zSW5mby5vcmRlcltpXSwoaXNTaG9ydD8zOjUpKTsKLQotICAgICAgICBpZiAodG5zSW5mby5vcmRlcltpXSl7Ci0gICAgICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIEZJTFRFUl9ESVJFQ1RJT04sIDEpOwotCi0gICAgICAgICAgaWYodG5zSW5mby5jb2VmUmVzW2ldID09IDQpIHsKLSAgICAgICAgICAgIGNvZWZCaXRzID0gMzsKLSAgICAgICAgICAgIGZvcihrPTA7IGs8dG5zSW5mby5vcmRlcltpXTsgaysrKSB7Ci0KLSAgICAgICAgICAgICAgaWYgKHRuc0luZm8uY29lZltpKlROU19NQVhfT1JERVJfU0hPUlQra10gPiAzIHx8Ci0gICAgICAgICAgICAgICAgICB0bnNJbmZvLmNvZWZbaSpUTlNfTUFYX09SREVSX1NIT1JUK2tdIDwgLTQpIHsKLSAgICAgICAgICAgICAgICBjb2VmQml0cyA9IDQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjb2VmQml0cyA9IDI7Ci0gICAgICAgICAgICBmb3Ioaz0wOyBrPHRuc0luZm8ub3JkZXJbaV07IGsrKykgewotCi0gICAgICAgICAgICAgIGlmICh0bnNJbmZvLmNvZWZbaSpUTlNfTUFYX09SREVSX1NIT1JUK2tdID4gMSB8fAotICAgICAgICAgICAgICAgICAgdG5zSW5mby5jb2VmW2kqVE5TX01BWF9PUkRFUl9TSE9SVCtrXSA8IC0yKSB7Ci0gICAgICAgICAgICAgICAgY29lZkJpdHMgPSAzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLCB0bnNJbmZvLmNvZWZSZXNbaV0gLSBjb2VmQml0cywgMSk7IC8qY29lZl9jb21wcmVzKi8KLSAgICAgICAgICBmb3IgKGs9MDsgazx0bnNJbmZvLm9yZGVyW2ldOyBrKysgKSB7Ci0gICAgICAgICAgICBzdGF0aWMgY29uc3QgV29yZDE2IHJtYXNrW10gPSB7MCwxLDMsNywxNX07Ci0KLSAgICAgICAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLHRuc0luZm8uY29lZltpKlROU19NQVhfT1JERVJfU0hPUlQra10gJiBybWFza1tjb2VmQml0c10sY29lZkJpdHMpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBlbmNvZGVHYWluQ29udHJvbERhdGEKLSogZGVzY3JpcHRpb246ICB1bnN1cHBvcnRlZAotKiByZXR1cm5zOiAgICAgIG5vbmUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgZW5jb2RlR2FpbkNvbnRyb2xEYXRhKEhBTkRMRV9CSVRfQlVGIGhCaXRTdHJlYW0pCi17Ci0gIFdyaXRlQml0cyhoQml0U3RyZWFtLDAsMSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBlbmNvZGVQdWxzZURhdGEKLSogZGVzY3JpcHRpb246ICBub3Qgc3VwcG9ydGVkIHlldCAoZHVtbXkpCi0qIHJldHVybnM6ICAgICAgbm9uZQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBlbmNvZGVQdWxzZURhdGEoSEFORExFX0JJVF9CVUYgaEJpdFN0cmVhbSkKLXsKLSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sMCwxKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogV3JpdGVJbmRpdmlkdWFsQ2hhbm5lbFN0cmVhbQotKiBkZXNjcmlwdGlvbjogIG1hbmFnZW1lbnQgb2Ygd3JpdGUgcHJvY2VzcyBvZiBpbmRpdmlkdWFsIGNoYW5uZWwgc3RyZWFtCi0qIHJldHVybnM6ICAgICAgbm9uZQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotd3JpdGVJbmRpdmlkdWFsQ2hhbm5lbFN0cmVhbShGbGFnICAgY29tbW9uV2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbWRjdFNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgd2luZG93U2hhcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBncm91cGluZ01hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgc2NmW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXb3JkMTYgKm1heFZhbHVlSW5TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBnbG9iYWxHYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgcXVhbnRTcGVjW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RJT05fREFUQSAqc2VjdGlvbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9CSVRfQlVGIGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROU19JTkZPIHRuc0luZm8pCi17Ci0gIFdvcmQxNiBsb2dOb3JtOwotCi0gIGxvZ05vcm0gPSBMT0dfTk9STV9QQ00gLSAobWRjdFNjYWxlICsgMSk7Ci0KLSAgZW5jb2RlR2xvYmFsR2FpbihnbG9iYWxHYWluLCBsb2dOb3JtLHNjZltzZWN0aW9uRGF0YS0+Zmlyc3RTY2ZdLCBoQml0U3RyZWFtKTsKLQotCi0gIGlmKCFjb21tb25XaW5kb3cpIHsKLSAgICBlbmNvZGVJY3NJbmZvKHNlY3Rpb25EYXRhLT5ibG9ja1R5cGUsIHdpbmRvd1NoYXBlLCBncm91cGluZ01hc2ssIHNlY3Rpb25EYXRhLCBoQml0U3RyZWFtKTsKLSAgfQotCi0gIGVuY29kZVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCBoQml0U3RyZWFtKTsKLQotICBlbmNvZGVTY2FsZUZhY3RvckRhdGEobWF4VmFsdWVJblNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgc2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgaEJpdFN0cmVhbSk7Ci0KLSAgZW5jb2RlUHVsc2VEYXRhKGhCaXRTdHJlYW0pOwotCi0gIGVuY29kZVRuc0RhdGEodG5zSW5mbywgc2VjdGlvbkRhdGEtPmJsb2NrVHlwZSwgaEJpdFN0cmVhbSk7Ci0KLSAgZW5jb2RlR2FpbkNvbnRyb2xEYXRhKGhCaXRTdHJlYW0pOwotCi0gIGVuY29kZVNwZWN0cmFsRGF0YShzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgIHF1YW50U3BlYywKLSAgICAgICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0pOwotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiB3cml0ZVNpbmdsZUNoYW5uZWxFbGVtZW50Ci0qIGRlc2NyaXB0aW9uOiAgd3JpdGUgc2luZ2xlIGNoYW5uZWwgZWxlbWVudCB0byBiaXRzdHJlYW0KLSogcmV0dXJuczogICAgICBub25lCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBXb3JkMTYgd3JpdGVTaW5nbGVDaGFubmVsRWxlbWVudChXb3JkMTYgaW5zdGFuY2VUYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwqIHFjT3V0Q2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQklUX0JVRiBoQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROU19JTkZPIHRuc0luZm8pCi17Ci0gIFdyaXRlQml0cyhoQml0U3RyZWFtLElEX1NDRSwzKTsKLSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0saW5zdGFuY2VUYWcsNCk7Ci0gIHdyaXRlSW5kaXZpZHVhbENoYW5uZWxTdHJlYW0oMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWwtPm1kY3RTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWwtPndpbmRvd1NoYXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbC0+Z3JvdXBpbmdNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWwtPnNjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWwtPm1heFZhbHVlSW5TZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsLT5nbG9iYWxHYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbC0+cXVhbnRTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocWNPdXRDaGFubmVsLT5zZWN0aW9uRGF0YSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnNJbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgcmV0dXJuKDApOwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IHdyaXRlQ2hhbm5lbFBhaXJFbGVtZW50Ci0qIGRlc2NyaXB0aW9uOgotKiByZXR1cm5zOiAgICAgIG5vbmUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQxNiB3cml0ZUNoYW5uZWxQYWlyRWxlbWVudChXb3JkMTYgaW5zdGFuY2VUYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBtc0RpZ2VzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG1zRmxhZ3NbTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzZmJPZmZzZXRbMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMIHFjT3V0Q2hhbm5lbFsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0JJVF9CVUYgaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5TX0lORk8gdG5zSW5mb1syXSkKLXsKLSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sSURfQ1BFLDMpOwotICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxpbnN0YW5jZVRhZyw0KTsKLSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sMSwxKTsgLyogY29tbW9uIHdpbmRvdyAqLwotCi0gIGVuY29kZUljc0luZm8ocWNPdXRDaGFubmVsWzBdLnNlY3Rpb25EYXRhLmJsb2NrVHlwZSwKLSAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMF0ud2luZG93U2hhcGUsCi0gICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzBdLmdyb3VwaW5nTWFzaywKLSAgICAgICAgICAgICAgICAmKHFjT3V0Q2hhbm5lbFswXS5zZWN0aW9uRGF0YSksCi0gICAgICAgICAgICAgICAgaEJpdFN0cmVhbSk7Ci0KLSAgZW5jb2RlTVNJbmZvKHFjT3V0Q2hhbm5lbFswXS5zZWN0aW9uRGF0YS5zZmJDbnQsCi0gICAgICAgICAgICAgICBxY091dENoYW5uZWxbMF0uc2VjdGlvbkRhdGEuc2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICBxY091dENoYW5uZWxbMF0uc2VjdGlvbkRhdGEubWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICBtc0RpZ2VzdCwKLSAgICAgICAgICAgICAgIG1zRmxhZ3MsCi0gICAgICAgICAgICAgICBoQml0U3RyZWFtKTsKLQotICB3cml0ZUluZGl2aWR1YWxDaGFubmVsU3RyZWFtKDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzBdLm1kY3RTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMF0ud2luZG93U2hhcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzBdLmdyb3VwaW5nTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJPZmZzZXRbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzBdLnNjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMF0ubWF4VmFsdWVJblNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMF0uZ2xvYmFsR2FpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMF0ucXVhbnRTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocWNPdXRDaGFubmVsWzBdLnNlY3Rpb25EYXRhKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc0luZm9bMF0pOwotCi0gIHdyaXRlSW5kaXZpZHVhbENoYW5uZWxTdHJlYW0oMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMV0ubWRjdFNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFsxXS53aW5kb3dTaGFwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMV0uZ3JvdXBpbmdNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYk9mZnNldFsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMV0uc2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFsxXS5tYXhWYWx1ZUluU2ZiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFsxXS5nbG9iYWxHYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFsxXS5xdWFudFNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihxY091dENoYW5uZWxbMV0uc2VjdGlvbkRhdGEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5zSW5mb1sxXSk7Ci0KLSAgcmV0dXJuKDApOwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IHdyaXRlRmlsbEVsZW1lbnQKLSogZGVzY3JpcHRpb246ICB3cml0ZSBmaWxsIGVsZW1lbnRzIHRvIGJpdHN0cmVhbQotKiByZXR1cm5zOiAgICAgIG5vbmUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgd3JpdGVGaWxsRWxlbWVudCggY29uc3QgVVdvcmQ4ICphbmNCeXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiB0b3RGaWxsQml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9CSVRfQlVGIGhCaXRTdHJlYW0pCi17Ci0gIFdvcmQxNiBpOwotICBXb3JkMTYgY250LGVzY19jb3VudDsKLQotICAvKgotICAgIFdyaXRlIGZpbGwgRWxlbWVudChzKToKLSAgICBhbW91bnQgb2YgYSBmaWxsIGVsZW1lbnQgY2FuIGJlIDcrWCo4IEJpdHMsIFggZWxlbWVudCBvZiBbMC4uMjcwXQotICAqLwotCi0gIHdoaWxlKHRvdEZpbGxCaXRzID49ICgzKzQpKSB7Ci0gICAgY250ID0gbWluKCgodG90RmlsbEJpdHMgLSAoMys0KSkgPj4gMyksICgoMTw8NCktMSkpOwotCi0gICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sSURfRklMLDMpOwotICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLGNudCw0KTsKLQotICAgIHRvdEZpbGxCaXRzID0gdG90RmlsbEJpdHMgLSAoMys0KTsKLQotCi0gICAgaWYgKGNudCA9PSAoMTw8NCktMSkgewotCi0gICAgICBlc2NfY291bnQgPSBtaW4oICgodG90RmlsbEJpdHMgPj4gMykgLSAoKDE8PDQpLTEpKSwgKDE8PDgpLTEpOwotICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sZXNjX2NvdW50LDgpOwotICAgICAgdG90RmlsbEJpdHMgPSAodG90RmlsbEJpdHMgLSA4KTsKLSAgICAgIGNudCA9IGNudCArIChlc2NfY291bnQgLSAxKTsKLSAgICB9Ci0KLSAgICBmb3IoaT0wO2k8Y250O2krKykgewotCi0gICAgICBpZihhbmNCeXRlcykKLSAgICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sICphbmNCeXRlcysrLDgpOwotICAgICAgZWxzZQotICAgICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwwLDgpOwotICAgICAgdG90RmlsbEJpdHMgPSB0b3RGaWxsQml0cyAtIDg7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBXcml0ZUJpdFN0cmVhbQotKiBkZXNjcmlwdGlvbjogIG1haW4gZnVuY3Rpb24gb2Ygd3JpdGUgYml0c3RlYW0gcHJvY2VzcwotKiByZXR1cm5zOiAgICAgIDAgaWYgc3VjY2VzcwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1Xb3JkMTYgV3JpdGVCaXRzdHJlYW0gKEhBTkRMRV9CSVRfQlVGIGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfSU5GTyBlbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgIFFDX09VVCAqcWNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVQgKnBzeU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpnbG9iVXNlZEJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVXb3JkOCAqYW5jQnl0ZXMsCi0JCQkJCSAgIFdvcmQxNiBzYW1waW5kZXgKLSAgICAgICAgICAgICAgICAgICAgICAgKSAvKiByZXR1cm5zIGVycm9yIGNvZGUgKi8KLXsKLSAgV29yZDE2IGJpdE1hcmtVcDsKLSAgV29yZDE2IGVsZW1lbnRVc2VkQml0czsKLSAgV29yZDE2IGZyYW1lQml0cz0wOwotCi0gIFVOVVNFRChhbmNCeXRlcyk7Ci0KLSAgLyogICBzdHJ1Y3QgYml0YnVmZmVyIGJzV3JpdGVDb3B5OyAqLwotICBiaXRNYXJrVXAgPSBHZXRCaXRzQXZhaWwoaEJpdFN0cmVhbSk7Ci0gIGlmKHFjT3V0LT5xY0VsZW1lbnQuYWR0c1VzZWQpICAvKiAgd3JpdGUgYWR0cyBoZWFkZXIqLwotICB7Ci0JICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwgMHhGRkYsIDEyKTsgLyogMTIgYml0IFN5bmN3b3JkICovCi0JICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwgMSwgMSk7IC8qIElEID09IDAgZm9yIE1QRUc0IEFBQywgMSBmb3IgTVBFRzIgQUFDICovCi0JICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwgMCwgMik7IC8qIGxheWVyID09IDAgKi8KLQkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAxLCAxKTsgLyogcHJvdGVjdGlvbiBhYnNlbnQgKi8KLQkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAxLCAyKTsgLyogcHJvZmlsZSAqLwotCSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNhbXBpbmRleCwgNCk7IC8qIHNhbXBsaW5nIHJhdGUgKi8KLQkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAwLCAxKTsgLyogcHJpdmF0ZSBiaXQgKi8KLQkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCBlbEluZm8ubkNoYW5uZWxzSW5FbCwgMyk7IC8qIGNoLiBjb25maWcgKG11c3QgYmUgPiAwKSAqLwotCQkJCQkJCQkgICAvKiBzaW1wbHkgdXNpbmcgbnVtQ2hhbm5lbHMgb25seSB3b3JrcyBmb3IKLQkJCQkJCQkJCTYgY2hhbm5lbHMgb3IgbGVzcywgZWxzZSBhIGNoYW5uZWwKLQkJCQkJCQkJCWNvbmZpZ3VyYXRpb24gc2hvdWxkIGJlIHdyaXR0ZW4gKi8KLQkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAwLCAxKTsgLyogb3JpZ2luYWwvY29weSAqLwotCSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIDAsIDEpOyAvKiBob21lICovCi0KLQkgIC8qIFZhcmlhYmxlIEFEVFMgaGVhZGVyICovCi0JICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwgMCwgMSk7IC8qIGNvcHlyLiBpZC4gYml0ICovCi0JICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwgMCwgMSk7IC8qIGNvcHlyLiBpZC4gc3RhcnQgKi8KLQkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAqZ2xvYlVzZWRCaXRzID4+IDMsIDEzKTsKLQkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAweDdGRiwgMTEpOyAvKiBidWZmZXIgZnVsbG5lc3MgKDB4N0ZGIGZvciBWQlIpICovCi0JICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwgMCwgMik7IC8qIHJhdyBkYXRhIGJsb2NrcyAoMCsxPTEpICovCi0gIH0KLQotICAqZ2xvYlVzZWRCaXRzPTA7Ci0KLSAgewotCi0gICAgV29yZDE2ICpzZmJPZmZzZXRbMl07Ci0gICAgVE5TX0lORk8gdG5zSW5mb1syXTsKLSAgICBlbGVtZW50VXNlZEJpdHMgPSAwOwotCi0gICAgc3dpdGNoIChlbEluZm8uZWxUeXBlKSB7Ci0KLSAgICAgIGNhc2UgSURfU0NFOiAgICAgIC8qIHNpbmdsZSBjaGFubmVsICovCi0gICAgICAgIHNmYk9mZnNldFswXSA9IHBzeU91dC0+cHN5T3V0Q2hhbm5lbFtlbEluZm8uQ2hhbm5lbEluZGV4WzBdXS5zZmJPZmZzZXRzOwotICAgICAgICB0bnNJbmZvWzBdID0gcHN5T3V0LT5wc3lPdXRDaGFubmVsW2VsSW5mby5DaGFubmVsSW5kZXhbMF1dLnRuc0luZm87Ci0KLSAgICAgICAgd3JpdGVTaW5nbGVDaGFubmVsRWxlbWVudChlbEluZm8uaW5zdGFuY2VUYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiT2Zmc2V0WzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY091dC0+cWNDaGFubmVsW2VsSW5mby5DaGFubmVsSW5kZXhbMF1dLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5zSW5mb1swXSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIElEX0NQRTogICAgIC8qIGNoYW5uZWwgcGFpciAqLwotICAgICAgICB7Ci0gICAgICAgICAgV29yZDE2IG1zRGlnZXN0OwotICAgICAgICAgIFdvcmQxNiAqbXNGbGFncyA9IHBzeU91dC0+cHN5T3V0RWxlbWVudC50b29sc0luZm8ubXNNYXNrOwotICAgICAgICAgIG1zRGlnZXN0ID0gcHN5T3V0LT5wc3lPdXRFbGVtZW50LnRvb2xzSW5mby5tc0RpZ2VzdDsKLSAgICAgICAgICBzZmJPZmZzZXRbMF0gPQotICAgICAgICAgICAgcHN5T3V0LT5wc3lPdXRDaGFubmVsW2VsSW5mby5DaGFubmVsSW5kZXhbMF1dLnNmYk9mZnNldHM7Ci0gICAgICAgICAgc2ZiT2Zmc2V0WzFdID0KLSAgICAgICAgICAgIHBzeU91dC0+cHN5T3V0Q2hhbm5lbFtlbEluZm8uQ2hhbm5lbEluZGV4WzFdXS5zZmJPZmZzZXRzOwotCi0gICAgICAgICAgdG5zSW5mb1swXT0KLSAgICAgICAgICAgIHBzeU91dC0+cHN5T3V0Q2hhbm5lbFtlbEluZm8uQ2hhbm5lbEluZGV4WzBdXS50bnNJbmZvOwotICAgICAgICAgIHRuc0luZm9bMV09Ci0gICAgICAgICAgICBwc3lPdXQtPnBzeU91dENoYW5uZWxbZWxJbmZvLkNoYW5uZWxJbmRleFsxXV0udG5zSW5mbzsKLSAgICAgICAgICB3cml0ZUNoYW5uZWxQYWlyRWxlbWVudChlbEluZm8uaW5zdGFuY2VUYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNEaWdlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnFjT3V0LT5xY0NoYW5uZWxbZWxJbmZvLkNoYW5uZWxJbmRleFswXV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnNJbmZvKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuKDEpOwotCi0gICAgICB9ICAgLyogc3dpdGNoICovCi0KLSAgICBlbGVtZW50VXNlZEJpdHMgPSBlbGVtZW50VXNlZEJpdHMgLSBiaXRNYXJrVXA7Ci0gICAgYml0TWFya1VwID0gR2V0Qml0c0F2YWlsKGhCaXRTdHJlYW0pOwotICAgIGZyYW1lQml0cyA9IGZyYW1lQml0cyArIGVsZW1lbnRVc2VkQml0cyArIGJpdE1hcmtVcDsKLQotICB9Ci0KLSAgd3JpdGVGaWxsRWxlbWVudChOVUxMLAotICAgICAgICAgICAgICAgICAgIHFjT3V0LT50b3RGaWxsQml0cywKLSAgICAgICAgICAgICAgICAgICBoQml0U3RyZWFtKTsKLQotICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxJRF9FTkQsMyk7Ci0KLSAgLyogYnl0ZSBhbGlnbmVtZW50ICovCi0gIFdyaXRlQml0cyhoQml0U3RyZWFtLDAsICg4IC0gKGhCaXRTdHJlYW0tPmNudEJpdHMgJiA3KSkgJiA3KTsKLQotICAqZ2xvYlVzZWRCaXRzID0gKmdsb2JVc2VkQml0cy0gYml0TWFya1VwOwotICBiaXRNYXJrVXAgPSBHZXRCaXRzQXZhaWwoaEJpdFN0cmVhbSk7Ci0gICpnbG9iVXNlZEJpdHMgPSAqZ2xvYlVzZWRCaXRzICsgYml0TWFya1VwOwotICBmcmFtZUJpdHMgPSBmcmFtZUJpdHMgKyAqZ2xvYlVzZWRCaXRzOwotCi0KLSAgaWYgKGZyYW1lQml0cyAhPSAgKHFjT3V0LT50b3RTdGF0aWNCaXRzVXNlZCtxY091dC0+dG90RHluQml0c1VzZWQgKyBxY091dC0+dG90QW5jQml0c1VzZWQgKwotICAgICAgICAgICAgICAgICAgICAgcWNPdXQtPnRvdEZpbGxCaXRzICsgcWNPdXQtPmFsaWduQml0cykpIHsKLSAgICByZXR1cm4oLTEpOwotICB9Ci0gIHJldHVybigwKTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2Jsb2NrX3N3aXRjaC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYmxvY2tfc3dpdGNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYmM3ZTcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYmxvY2tfc3dpdGNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDQgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlibG9ja19zd2l0Y2guYwotCi0JQ29udGVudDoJQmxvY2sgc3dpdGNoaW5nIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAidHlwZWRlZi5oIgotI2luY2x1ZGUgImJhc2ljX29wLmgiCi0jaW5jbHVkZSAib3Blcl8zMmIuaCIKLSNpbmNsdWRlICJwc3lfY29uc3QuaCIKLSNpbmNsdWRlICJibG9ja19zd2l0Y2guaCIKLQotCi0jZGVmaW5lIEVORVJHWV9TSElGVCAoOCAtIDEpCi0KLS8qKioqKioqKioqKioqKioqIGludGVybmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKioqKioqKioqKiovCi1zdGF0aWMgV29yZDMyCi1TcmNoTWF4V2l0aEluZGV4KGNvbnN0IFdvcmQzMiAqaW4sIFdvcmQxNiAqaW5kZXgsIFdvcmQxNiBuKTsKLQotCi1Xb3JkMzIKLUNhbGNXaW5kb3dFbmVyZ3koQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbCwKLSAgICAgICAgICAgICAgICAgV29yZDE2ICp0aW1lU2lnbmFsLAotICAgICAgICAgICAgICAgICBXb3JkMTYgY2hJbmNyZW1lbnQsCi0gICAgICAgICAgICAgICAgIFdvcmQxNiB3aW5kb3dMZW4pOwotCi0KLQotLyoqKioqKioqKioqKioqKioqKiBDb25zdGFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoKLSAgSUlSIGhpZ2ggcGFzcyBjb2VmZnMKLSovCi1jb25zdCBXb3JkMzIgaGlQYXNzQ29lZmZbQkxPQ0tfU1dJVENISU5HX0lJUl9MRU5dID0gewotICAweGJlYzhiNDM5LCAweDYwOWQ0OTUyICAvKiAtMC41MDk1ZiwgMC43NTQ4ZiAqLwotfTsKLQotc3RhdGljIGNvbnN0IFdvcmQzMiBhY2NXaW5kb3dOcmdGYWMgPSAweDI2NjY2NjY2OyAgICAgICAgICAgICAgICAgICAvKiBmYWN0b3IgZm9yIGFjY3VtdWxhdGluZyBmaWx0ZXJlZCB3aW5kb3cgZW5lcmdpZXMgMC4zICovCi1zdGF0aWMgY29uc3QgV29yZDMyIG9uZU1pbnVzQWNjV2luZG93TnJnRmFjID0gMHg1OTk5OTk5YTsJCQkvKiAwLjcgKi8KLXN0YXRpYyBjb25zdCBXb3JkMzIgaW52QXR0YWNrUmF0aW9IaWdoQnIgPSAweDBjY2NjY2NkOyAgICAgICAgICAgICAgLyogaW52ZXJ0ZWQgbG93ZXIgcmF0aW8gbGltaXQgZm9yIGF0dGFja3MgMC4xKi8KLXN0YXRpYyBjb25zdCBXb3JkMzIgaW52QXR0YWNrUmF0aW9Mb3dCciA9ICAweDA3MmIwMjBjOyAgICAgICAgICAgICAgLyogMC4wNTYgKi8KLXN0YXRpYyBjb25zdCBXb3JkMzIgbWluQXR0YWNrTnJnID0gMHgwMDAwMWU4NDsgICAgICAgICAgICAgICAgICAgICAgLyogbWluaW11bSBlbmVyZ3kgZm9yIGF0dGFja3MgMWUrNiAqLwotCi0KLS8qKioqKioqKioqKioqKioqKiogUm91dGluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogSW5pdEJsb2NrU3dpdGNoaW5nCi0qIGRlc2NyaXB0aW9uOiAgaW5pdCBCbG9jayBTd2l0Y2hpbmcgcGFyYW1ldGVyLgotKiByZXR1cm5zOiAgICAgIFRSVUUgaWYgc3VjY2VzcwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVdvcmQxNiBJbml0QmxvY2tTd2l0Y2hpbmcoQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyIGJpdFJhdGUsIGNvbnN0IFdvcmQxNiBuQ2hhbm5lbHMpCi17Ci0gIC8qIHNlbGVjdCBhdHRhY2tSYXRpbyAqLwotCi0gIGlmICgoc3ViKG5DaGFubmVscywxKT09MCAmJiBMX3N1YihiaXRSYXRlLCAyNDAwMCkgPiAwKSB8fAotICAgICAgKHN1YihuQ2hhbm5lbHMsMSk+MCAmJiBiaXRSYXRlID4gKG5DaGFubmVscyAqIDE2MDAwKSkpIHsKLSAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmludkF0dGFja1JhdGlvID0gaW52QXR0YWNrUmF0aW9IaWdoQnI7Ci0gIH0KLSAgZWxzZSAgewotICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+aW52QXR0YWNrUmF0aW8gPSBpbnZBdHRhY2tSYXRpb0xvd0JyOwotICB9Ci0KLSAgcmV0dXJuKFRSVUUpOwotfQotCi1zdGF0aWMgV29yZDE2IHN1Z2dlc3RlZEdyb3VwaW5nVGFibGVbVFJBTlNfRkFDXVtNQVhfTk9fT0ZfR1JPVVBTXSA9IHsKLSAgLyogQXR0YWNrIGluIFdpbmRvdyAwICovIHsxLCAgMywgIDMsICAxfSwKLSAgLyogQXR0YWNrIGluIFdpbmRvdyAxICovIHsxLCAgMSwgIDMsICAzfSwKLSAgLyogQXR0YWNrIGluIFdpbmRvdyAyICovIHsyLCAgMSwgIDMsICAyfSwKLSAgLyogQXR0YWNrIGluIFdpbmRvdyAzICovIHszLCAgMSwgIDMsICAxfSwKLSAgLyogQXR0YWNrIGluIFdpbmRvdyA0ICovIHszLCAgMSwgIDEsICAzfSwKLSAgLyogQXR0YWNrIGluIFdpbmRvdyA1ICovIHszLCAgMiwgIDEsICAyfSwKLSAgLyogQXR0YWNrIGluIFdpbmRvdyA2ICovIHszLCAgMywgIDEsICAxfSwKLSAgLyogQXR0YWNrIGluIFdpbmRvdyA3ICovIHszLCAgMywgIDEsICAxfQotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IEJsb2NrU3dpdGNoaW5nCi0qIGRlc2NyaXB0aW9uOiAgZGV0ZWN0IHRoaXMgZnJhbWUgd2hldGhlciB0aGVyZSBpcyBhbiBhdHRhY2sKLSogcmV0dXJuczogICAgICBUUlVFIGlmIHN1Y2Nlc3MKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1Xb3JkMTYgQmxvY2tTd2l0Y2hpbmcoQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnRpbWVTaWduYWwsCi0JCQkJCSAgV29yZDMyIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGNoSW5jcmVtZW50KQotewotICBXb3JkMzIgaSwgdzsKLSAgV29yZDMyIGVuTTEsIGVuTWF4OwotCi0gIC8qIFJlc2V0IGdyb3VwaW5nIGluZm8gKi8KLSAgZm9yIChpPTA7IGk8VFJBTlNfRkFDOyBpKyspIHsKLSAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmdyb3VwTGVuW2ldID0gMDsKLSAgfQotCi0KLSAgLyogU2VhcmNoIGZvciBwb3NpdGlvbiBhbmQgYW1wbGl0dWRlIG9mIGF0dGFjayBpbiBsYXN0IGZyYW1lICgxIHdpbmRvd3MgZGVsYXkpICovCi0gIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bWF4V2luZG93TnJnID0gU3JjaE1heFdpdGhJbmRleCggJmJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnWzBdW0JMT0NLX1NXSVRDSF9XSU5ET1dTLTFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFja0luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJMT0NLX1NXSVRDSF9XSU5ET1dTKTsKLQotICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFja0luZGV4ID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0QXR0YWNrSW5kZXg7Ci0KLSAgLyogU2V0IGdyb3VwaW5nIGluZm8gKi8KLSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ub09mR3JvdXBzID0gTUFYX05PX09GX0dST1VQUzsKLQotICBmb3IgKGk9MDsgaTxNQVhfTk9fT0ZfR1JPVVBTOyBpKyspIHsKLSAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmdyb3VwTGVuW2ldID0gc3VnZ2VzdGVkR3JvdXBpbmdUYWJsZVtibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFja0luZGV4XVtpXTsKLSAgfQotCi0gIC8qIGlmIHRoZSBzYW1wbGVyYXRlIGlzIGxlc3MgdGhhbiAxNjAwMCwgaXQgc2hvdWxkIGJlIGFsbCB0aGUgc2hvcnQgYmxvY2ssIGF2b2lkIHByZSZwb3N0IGVjaG8gKi8KLSAgaWYoc2FtcGxlUmF0ZSA+PSAxNjAwMCkgewotCSAgLyogU2F2ZSBjdXJyZW50IHdpbmRvdyBlbmVyZ3kgYXMgbGFzdCB3aW5kb3cgZW5lcmd5ICovCi0JICBmb3IgKHc9MDsgdzxCTE9DS19TV0lUQ0hfV0lORE9XUzsgdysrKSB7Ci0JCSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdbMF1bd10gPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ1sxXVt3XTsKLQkJICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMF1bd10gPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMV1bd107Ci0JICB9Ci0KLQotCSAgLyogQ2FsY3VsYXRlIHVuZmlsdGVyZWQgYW5kIGZpbHRlcmVkIGVuZXJnaWVzIGluIHN1YndpbmRvd3MgYW5kIGNvbWJpbmUgdG8gc2VnbWVudHMgKi8KLQkgIENhbGNXaW5kb3dFbmVyZ3koYmxvY2tTd2l0Y2hpbmdDb250cm9sLCB0aW1lU2lnbmFsLCBjaEluY3JlbWVudCwgQkxPQ0tfU1dJVENIX1dJTkRPV19MRU4pOwotCi0JICAvKiByZXNldCBhdHRhY2sgKi8KLQkgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrID0gRkFMU0U7Ci0KLQkgIGVuTWF4ID0gMDsKLQkgIGVuTTEgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMF1bQkxPQ0tfU1dJVENIX1dJTkRPV1MtMV07Ci0KLQkgIGZvciAodz0wOyB3PEJMT0NLX1NXSVRDSF9XSU5ET1dTOyB3KyspIHsKLQkJICBXb3JkMzIgZW5NMV9UbXAsIGFjY1dpbmRvd05yZ19UbXAsIHdpbmRvd05yZ0ZfVG1wOwotCQkgIFdvcmQxNiBlbk0xX1NoZiwgYWNjV2luZG93TnJnX1NoZiwgd2luZG93TnJnRl9TaGY7Ci0KLQkJICBhY2NXaW5kb3dOcmdfU2hmID0gbm9ybV9sKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWNjV2luZG93TnJnKTsKLQkJICBlbk0xX1NoZiA9IG5vcm1fbChlbk0xKTsKLQkJICB3aW5kb3dOcmdGX1NoZiA9IG5vcm1fbChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMV1bd10pOwotCi0JCSAgYWNjV2luZG93TnJnX1RtcCA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWNjV2luZG93TnJnIDw8IGFjY1dpbmRvd05yZ19TaGY7Ci0JCSAgZW5NMV9UbXAgPSBlbk0xIDw8IGVuTTFfU2hmOwotCQkgIHdpbmRvd05yZ0ZfVG1wID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzFdW3ddIDw8IHdpbmRvd05yZ0ZfU2hmOwotCi0JCSAgLyogYSBzbGlkaW5nIGF2ZXJhZ2Ugb2YgdGhlIHByZXZpb3VzIGVuZXJnaWVzICovCi0JCSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hY2NXaW5kb3dOcmcgPSAoZml4bXVsKG9uZU1pbnVzQWNjV2luZG93TnJnRmFjLCBhY2NXaW5kb3dOcmdfVG1wKSA+PiBhY2NXaW5kb3dOcmdfU2hmKSArCi0JCQkgIChmaXhtdWwoYWNjV2luZG93TnJnRmFjLCBlbk0xX1RtcCkgPj4gZW5NMV9TaGYpOwotCi0KLQkJICAvKiBpZiB0aGUgZW5lcmd5IHdpdGggdGhlIHJhdGlvIGlzIGJpZ2dlciB0aGFuIHRoZSBhdmVyYWdlLCBhbmQgdGhlIGF0dGFjayBhbmQgc2hvcnQgYmxvY2sgICovCi0JCSAgaWYgKChmaXhtdWwod2luZG93TnJnRl9UbXAsIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+aW52QXR0YWNrUmF0aW8pID4+IHdpbmRvd05yZ0ZfU2hmKSA+Ci0JCQkgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWNjV2luZG93TnJnICkgewotCQkJCSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2sgPSBUUlVFOwotCQkJCSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0QXR0YWNrSW5kZXggPSB3OwotCQkgIH0KLQkJICBlbk0xID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzFdW3ddOwotCQkgIGVuTWF4ID0gbWF4KGVuTWF4LCBlbk0xKTsKLQkgIH0KLQotCSAgaWYgKGVuTWF4IDwgbWluQXR0YWNrTnJnKSB7Ci0JCSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2sgPSBGQUxTRTsKLQkgIH0KLSAgfQotICBlbHNlCi0gIHsKLQkgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrID0gVFJVRTsKLSAgfQotCi0gIC8qIENoZWNrIGlmIGF0dGFjayBzcHJlYWRzIG92ZXIgZnJhbWUgYm9yZGVyICovCi0gIGlmICgoIWJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrKSAmJiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0YXR0YWNrKSkgewotCi0gICAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrSW5kZXggPT0gVFJBTlNfRkFDLTEpIHsKLSAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrID0gVFJVRTsKLSAgICB9Ci0KLSAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RhdHRhY2sgPSBGQUxTRTsKLSAgfQotICBlbHNlIHsKLSAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RhdHRhY2sgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjazsKLSAgfQotCi0gIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93U2VxdWVuY2UgPSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5uZXh0d2luZG93U2VxdWVuY2U7Ci0KLQotICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2spIHsKLSAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5leHR3aW5kb3dTZXF1ZW5jZSA9IFNIT1JUX1dJTkRPVzsKLSAgfQotICBlbHNlIHsKLSAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5leHR3aW5kb3dTZXF1ZW5jZSA9IExPTkdfV0lORE9XOwotICB9Ci0KLSAgLyogdXBkYXRlIHNob3J0IGJsb2NrIGdyb3VwICovCi0gIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5leHR3aW5kb3dTZXF1ZW5jZSA9PSBTSE9SVF9XSU5ET1cpIHsKLQotICAgIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd1NlcXVlbmNlPT0gTE9OR19XSU5ET1cpIHsKLSAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93U2VxdWVuY2UgPSBTVEFSVF9XSU5ET1c7Ci0gICAgfQotCi0gICAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93U2VxdWVuY2UgPT0gU1RPUF9XSU5ET1cpIHsKLSAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93U2VxdWVuY2UgPSBTSE9SVF9XSU5ET1c7Ci0gICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5vT2ZHcm91cHMgPSAzOwotICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ncm91cExlblswXSA9IDM7Ci0gICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmdyb3VwTGVuWzFdID0gMzsKLSAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+Z3JvdXBMZW5bMl0gPSAyOwotICAgIH0KLSAgfQotCi0gIC8qIHVwZGF0ZSBibG9jayB0eXBlICovCi0gIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5leHR3aW5kb3dTZXF1ZW5jZSA9PSBMT05HX1dJTkRPVykgewotCi0gICAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93U2VxdWVuY2UgPT0gU0hPUlRfV0lORE9XKSB7Ci0gICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm5leHR3aW5kb3dTZXF1ZW5jZSA9IFNUT1BfV0lORE9XOwotICAgIH0KLSAgfQotCi0gIHJldHVybihUUlVFKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogU3JjaE1heFdpdGhJbmRleAotKiBkZXNjcmlwdGlvbjogIHNlYXJjaCBmb3IgdGhlIGJpZ2dlc3QgdmFsdWUgaW4gYW4gYXJyYXkKLSogcmV0dXJuczogICAgICB0aGUgbWF4IHZhbHVlCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQzMiBTcmNoTWF4V2l0aEluZGV4KGNvbnN0IFdvcmQzMiBpbltdLCBXb3JkMTYgKmluZGV4LCBXb3JkMTYgbikKLXsKLSAgV29yZDMyIG1heDsKLSAgV29yZDMyIGksIGlkeDsKLQotICAvKiBTZWFyY2ggbWF4aW11bSB2YWx1ZSBpbiBhcnJheSBhbmQgcmV0dXJuIGluZGV4IGFuZCB2YWx1ZSAqLwotICBtYXggPSAwOwotICBpZHggPSAwOwotCi0gIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQotICAgIGlmIChpbltpKzFdICA+IG1heCkgewotICAgICAgbWF4ID0gaW5baSsxXTsKLSAgICAgIGlkeCA9IGk7Ci0gICAgfQotICB9Ci0gICppbmRleCA9IGlkeDsKLQotICByZXR1cm4obWF4KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IENhbGNXaW5kb3dFbmVyZ3kKLSogZGVzY3JpcHRpb246ICBjYWxjdWxhdGUgdGhlIGVuZXJneSBiZWZvcmUgaWlyLWZpbHRlciBhbmQgYWZ0ZXIgaXJyLWZpbHRlcgotKiByZXR1cm5zOiAgICAgIFRSVUUgaWYgc3VjY2VzcwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgQVJNVjVFCi1Xb3JkMzIgQ2FsY1dpbmRvd0VuZXJneShCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICp0aW1lU2lnbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGNoSW5jcmVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHdpbmRvd0xlbikKLXsKLSAgV29yZDMyIHcsIGksIHRpZHg7Ci0gIFdvcmQzMiBhY2N1VUUsIGFjY3VGRTsKLSAgV29yZDMyIHRlbXBVbmZpbHRlcmVkOwotICBXb3JkMzIgdGVtcEZpbHRlcmVkOwotICBXb3JkMzIgc3RhdGVzMCwgc3RhdGVzMTsKLSAgV29yZDMyIENvZWZmMCwgQ29lZmYxOwotCi0KLSAgc3RhdGVzMCA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+aWlyU3RhdGVzWzBdOwotICBzdGF0ZXMxID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5paXJTdGF0ZXNbMV07Ci0gIENvZWZmMCA9IGhpUGFzc0NvZWZmWzBdOwotICBDb2VmZjEgPSBoaVBhc3NDb2VmZlsxXTsKLSAgdGlkeCA9IDA7Ci0gIGZvciAodz0wOyB3IDwgQkxPQ0tfU1dJVENIX1dJTkRPV1M7IHcrKykgewotCi0gICAgYWNjdVVFID0gMDsKLSAgICBhY2N1RkUgPSAwOwotCi0gICAgZm9yKGk9MDsgaTx3aW5kb3dMZW47IGkrKykgewotCSAgV29yZDMyIGFjY3UxLCBhY2N1MiwgYWNjdTM7Ci0JICBXb3JkMzIgb3V0OwotCSAgdGVtcFVuZmlsdGVyZWQgPSB0aW1lU2lnbmFsW3RpZHhdOwotICAgICAgdGlkeCA9IHRpZHggKyBjaEluY3JlbWVudDsKLQotCSAgYWNjdTEgPSBMX21weV9scyhDb2VmZjEsIHRlbXBVbmZpbHRlcmVkKTsKLQkgIGFjY3UyID0gZml4bXVsKCBDb2VmZjAsIHN0YXRlczEgKTsKLQkgIGFjY3UzID0gYWNjdTEgLSBzdGF0ZXMwOwotCSAgb3V0ID0gYWNjdTMgLSBhY2N1MjsKLQotCSAgc3RhdGVzMCA9IGFjY3UxOwotCSAgc3RhdGVzMSA9IG91dDsKLQotICAgICAgdGVtcEZpbHRlcmVkID0gZXh0cmFjdF9oKG91dCk7Ci0gICAgICBhY2N1VUUgKz0gKHRlbXBVbmZpbHRlcmVkICogdGVtcFVuZmlsdGVyZWQpID4+IEVORVJHWV9TSElGVDsKLSAgICAgIGFjY3VGRSArPSAodGVtcEZpbHRlcmVkICogdGVtcEZpbHRlcmVkKSA+PiBFTkVSR1lfU0hJRlQ7Ci0gICAgfQotCi0gICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdbMV1bd10gPSBhY2N1VUU7Ci0gICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzFdW3ddID0gYWNjdUZFOwotCi0gIH0KLQotICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmlpclN0YXRlc1swXSA9IHN0YXRlczA7Ci0gIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+aWlyU3RhdGVzWzFdID0gc3RhdGVzMTsKLQotICByZXR1cm4oVFJVRSk7Ci19Ci0jZW5kaWYKLQotc3RhdGljIFdvcmQxNiBzeW5jaHJvbml6ZWRCbG9ja1R5cGVUYWJsZVs0XVs0XSA9IHsKLSAgLyogICAgICAgICAgICAgICAgIExPTkdfV0lORE9XICAgU1RBUlRfV0lORE9XICBTSE9SVF9XSU5ET1cgIFNUT1BfV0lORE9XICovCi0gIC8qIExPTkdfV0lORE9XICAqL3tMT05HX1dJTkRPVywgIFNUQVJUX1dJTkRPVywgU0hPUlRfV0lORE9XLCBTVE9QX1dJTkRPV30sCi0gIC8qIFNUQVJUX1dJTkRPVyAqL3tTVEFSVF9XSU5ET1csIFNUQVJUX1dJTkRPVywgU0hPUlRfV0lORE9XLCBTSE9SVF9XSU5ET1d9LAotICAvKiBTSE9SVF9XSU5ET1cgKi97U0hPUlRfV0lORE9XLCBTSE9SVF9XSU5ET1csIFNIT1JUX1dJTkRPVywgU0hPUlRfV0lORE9XfSwKLSAgLyogU1RPUF9XSU5ET1cgICove1NUT1BfV0lORE9XLCAgU0hPUlRfV0lORE9XLCBTSE9SVF9XSU5ET1csIFNUT1BfV0lORE9XfQotfTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogU3luY0Jsb2NrU3dpdGNoaW5nCi0qIGRlc2NyaXB0aW9uOiAgdXBkYXRlIGJsb2NrIHR5cGUgYW5kIGdyb3VwIHZhbHVlCi0qIHJldHVybnM6ICAgICAgVFJVRSBpZiBzdWNjZXNzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotV29yZDE2IFN5bmNCbG9ja1N3aXRjaGluZyhCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbkNoYW5uZWxzKQotewotICBXb3JkMTYgaTsKLSAgV29yZDE2IHBhdGNoVHlwZSA9IExPTkdfV0lORE9XOwotCi0KLSAgaWYgKG5DaGFubmVscyA9PSAxKSB7IC8qIE1vbm8gKi8KLSAgICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+d2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKSB7Ci0gICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ub09mR3JvdXBzID0gMTsKLSAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuWzBdID0gMTsKLQotICAgICAgZm9yIChpPTE7IGk8VFJBTlNfRkFDOyBpKyspIHsKLSAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5baV0gPSAwOwotICAgICAgfQotICAgIH0KLSAgfQotICBlbHNlIHsgLyogU3RlcmVvIGNvbW1vbiBXaW5kb3cgKi8KLSAgICBwYXRjaFR5cGUgPSBzeW5jaHJvbml6ZWRCbG9ja1R5cGVUYWJsZVtwYXRjaFR5cGVdW2Jsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPndpbmRvd1NlcXVlbmNlXTsKLSAgICBwYXRjaFR5cGUgPSBzeW5jaHJvbml6ZWRCbG9ja1R5cGVUYWJsZVtwYXRjaFR5cGVdW2Jsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT53aW5kb3dTZXF1ZW5jZV07Ci0KLSAgICAvKiBTZXQgc3luY2hyb25pemVkIEJsb2NrdHlwZSAqLwotICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPndpbmRvd1NlcXVlbmNlID0gcGF0Y2hUeXBlOwotICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT53aW5kb3dTZXF1ZW5jZSA9IHBhdGNoVHlwZTsKLQotICAgIC8qIFN5bmNocm9uaXplIGdyb3VwaW5nIGluZm8gKi8KLSAgICBpZihwYXRjaFR5cGUgIT0gU0hPUlRfV0lORE9XKSB7IC8qIExvbmcgQmxvY2tzICovCi0gICAgICAvKiBTZXQgZ3JvdXBpbmcgaW5mbyAqLwotICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bm9PZkdyb3VwcyA9IDE7Ci0gICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bm9PZkdyb3VwcyA9IDE7Ci0gICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlblswXSA9IDE7Ci0gICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+Z3JvdXBMZW5bMF0gPSAxOwotCi0gICAgICBmb3IgKGk9MTsgaTxUUkFOU19GQUM7IGkrKykgewotICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlbltpXSA9IDA7Ci0gICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ncm91cExlbltpXSA9IDA7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotCi0gICAgICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bWF4V2luZG93TnJnID4gYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPm1heFdpbmRvd05yZykgewotICAgICAgICAvKiBMZWZ0IENoYW5uZWwgd2lucyAqLwotICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bm9PZkdyb3VwcyA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPm5vT2ZHcm91cHM7Ci0gICAgICAgIGZvciAoaT0wOyBpPFRSQU5TX0ZBQzsgaSsrKSB7Ci0gICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuW2ldID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5baV07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICAvKiBSaWdodCBDaGFubmVsIHdpbnMgKi8KLSAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bm9PZkdyb3VwcyA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ub09mR3JvdXBzOwotICAgICAgICBmb3IgKGk9MDsgaTxUUkFOU19GQUM7IGkrKykgewotICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuW2ldID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuW2ldOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9IC8qZW5kaWYgTW9ubyBvciBTdGVyZW8gKi8KLQotICByZXR1cm4oVFJVRSk7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9jaGFubmVsX21hcC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvY2hhbm5lbF9tYXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY1NTJlZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9jaGFubmVsX21hcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJY2hhbm5lbF9tYXAuYwotCi0JQ29udGVudDoJY2hhbm5lbCBtYXBwaW5nIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiY2hhbm5lbF9tYXAuaCIKLSNpbmNsdWRlICJiaXRlbmMuaCIKLSNpbmNsdWRlICJwc3lfY29uc3QuaCIKLSNpbmNsdWRlICJxY19kYXRhLmgiCi0KLXN0YXRpYyBjb25zdCBXb3JkMTYgbWF4Q2hhbm5lbEJpdHMgPSBNQVhCSVRTX0NPRUY7Ci0KLXN0YXRpYyBXb3JkMTYgaW5pdEVsZW1lbnQoRUxFTUVOVF9JTkZPKiBlbEluZm8sIEVMRU1FTlRfVFlQRSBlbFR5cGUpCi17Ci0gIFdvcmQxNiBlcnJvcj0wOwotCi0gIGVsSW5mby0+ZWxUeXBlPWVsVHlwZTsKLQotICBzd2l0Y2goZWxJbmZvLT5lbFR5cGUpIHsKLQotICAgIGNhc2UgSURfU0NFOgotICAgICAgZWxJbmZvLT5uQ2hhbm5lbHNJbkVsPTE7Ci0KLSAgICAgIGVsSW5mby0+Q2hhbm5lbEluZGV4WzBdPTA7Ci0KLSAgICAgIGVsSW5mby0+aW5zdGFuY2VUYWc9MDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBJRF9DUEU6Ci0KLSAgICAgIGVsSW5mby0+bkNoYW5uZWxzSW5FbD0yOwotCi0gICAgICBlbEluZm8tPkNoYW5uZWxJbmRleFswXT0wOwotICAgICAgZWxJbmZvLT5DaGFubmVsSW5kZXhbMV09MTsKLQotICAgICAgZWxJbmZvLT5pbnN0YW5jZVRhZz0wOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgZXJyb3I9MTsKLSAgfQotCi0gIHJldHVybiBlcnJvcjsKLX0KLQotCi1Xb3JkMTYgSW5pdEVsZW1lbnRJbmZvIChXb3JkMTYgbkNoYW5uZWxzLCBFTEVNRU5UX0lORk8qIGVsSW5mbykKLXsKLSAgV29yZDE2IGVycm9yOwotICBlcnJvciA9IDA7Ci0KLSAgc3dpdGNoKG5DaGFubmVscykgewotCi0gICAgY2FzZSAxOgotICAgICAgaW5pdEVsZW1lbnQoZWxJbmZvLCBJRF9TQ0UpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDI6Ci0gICAgICBpbml0RWxlbWVudChlbEluZm8sIElEX0NQRSk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBlcnJvcj00OwotICB9Ci0KLSAgcmV0dXJuIGVycm9yOwotfQotCi0KLVdvcmQxNiBJbml0RWxlbWVudEJpdHMoRUxFTUVOVF9CSVRTICplbGVtZW50Qml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIGJpdHJhdGVUb3QsCi0gICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBhdmVyYWdlQml0c1RvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHN0YXRpY0JpdHNUb3QpCi17Ci0gIFdvcmQxNiBlcnJvcjsKLSAgZXJyb3IgPSAwOwotCi0gICBzd2l0Y2goZWxJbmZvLm5DaGFubmVsc0luRWwpIHsKLSAgICBjYXNlIDE6Ci0gICAgICBlbGVtZW50Qml0cy0+Y2hCaXRyYXRlID0gYml0cmF0ZVRvdDsKLSAgICAgIGVsZW1lbnRCaXRzLT5hdmVyYWdlQml0cyA9IGF2ZXJhZ2VCaXRzVG90IC0gc3RhdGljQml0c1RvdDsKLSAgICAgIGVsZW1lbnRCaXRzLT5tYXhCaXRzID0gbWF4Q2hhbm5lbEJpdHM7Ci0KLSAgICAgIGVsZW1lbnRCaXRzLT5tYXhCaXRSZXNCaXRzID0gbWF4Q2hhbm5lbEJpdHMgLSBhdmVyYWdlQml0c1RvdDsKLSAgICAgIGVsZW1lbnRCaXRzLT5tYXhCaXRSZXNCaXRzID0gZWxlbWVudEJpdHMtPm1heEJpdFJlc0JpdHMgLSAoZWxlbWVudEJpdHMtPm1heEJpdFJlc0JpdHMgJiA3KTsKLSAgICAgIGVsZW1lbnRCaXRzLT5iaXRSZXNMZXZlbCA9IGVsZW1lbnRCaXRzLT5tYXhCaXRSZXNCaXRzOwotICAgICAgZWxlbWVudEJpdHMtPnJlbGF0aXZlQml0cyAgPSAweDQwMDA7IC8qIDEuMGYvMiAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDI6Ci0gICAgICBlbGVtZW50Qml0cy0+Y2hCaXRyYXRlICAgPSBiaXRyYXRlVG90ID4+IDE7Ci0gICAgICBlbGVtZW50Qml0cy0+YXZlcmFnZUJpdHMgPSBhdmVyYWdlQml0c1RvdCAtIHN0YXRpY0JpdHNUb3Q7Ci0gICAgICBlbGVtZW50Qml0cy0+bWF4Qml0cyAgICAgPSBtYXhDaGFubmVsQml0cyA8PCAxOwotCi0gICAgICBlbGVtZW50Qml0cy0+bWF4Qml0UmVzQml0cyA9IChtYXhDaGFubmVsQml0cyA8PCAxKSAtIGF2ZXJhZ2VCaXRzVG90OwotICAgICAgZWxlbWVudEJpdHMtPm1heEJpdFJlc0JpdHMgPSBlbGVtZW50Qml0cy0+bWF4Qml0UmVzQml0cyAtIChlbGVtZW50Qml0cy0+bWF4Qml0UmVzQml0cyAmIDcpOwotICAgICAgZWxlbWVudEJpdHMtPmJpdFJlc0xldmVsID0gZWxlbWVudEJpdHMtPm1heEJpdFJlc0JpdHM7Ci0gICAgICBlbGVtZW50Qml0cy0+cmVsYXRpdmVCaXRzID0gMHg0MDAwOyAvKiAxLjBmLzIgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGVycm9yID0gMTsKLSAgfQotICByZXR1cm4gZXJyb3I7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9keW5fYml0cy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvZHluX2JpdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc1YjQ4Zi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9keW5fYml0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTUxICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJZHluX2JpdHMuYwotCi0JQ29udGVudDoJTm9pc2VsZXNzIGNvZGVyIG1vZHVsZSBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMT0dfVEFHICJOb2lzZWxlc3NDb2RlciIKLQotI2luY2x1ZGUgImxvZy9sb2cuaCIKLQotI2luY2x1ZGUgImFhY19yb20uaCIKLSNpbmNsdWRlICJkeW5fYml0cy5oIgotI2luY2x1ZGUgImJpdF9jbnQuaCIKLSNpbmNsdWRlICJwc3lfY29uc3QuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGJ1aWxkQml0TG9va1VwCi0qIGRlc2NyaXB0aW9uOiAgY291bnQgYml0cyB1c2luZyBhbGwgcG9zc2libGUgdGFibGVzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1idWlsZEJpdExvb2tVcChjb25zdCBXb3JkMTYgKnF1YW50U3BlY3RydW0sCi0gICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbWF4U2ZiLAotICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICpzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICBjb25zdCBVV29yZDE2ICpzZmJNYXgsCi0gICAgICAgICAgICAgICBXb3JkMTYgYml0TG9va1VwW01BWF9TRkJfTE9OR11bQ09ERV9CT09LX0VTQ19ORFggKyAxXSwKLSAgICAgICAgICAgICAgIFNFQ1RJT05fSU5GTyAqIHNlY3Rpb25JbmZvKQotewotICBXb3JkMzIgaTsKLQotICBmb3IgKGk9MDsgaTxtYXhTZmI7IGkrKykgewotICAgIFdvcmQxNiBzZmJXaWR0aCwgbWF4VmFsOwotCi0gICAgc2VjdGlvbkluZm9baV0uc2ZiQ250ID0gMTsKLSAgICBzZWN0aW9uSW5mb1tpXS5zZmJTdGFydCA9IGk7Ci0gICAgc2VjdGlvbkluZm9baV0uc2VjdGlvbkJpdHMgPSBJTlZBTElEX0JJVENPVU5UOwotICAgIHNlY3Rpb25JbmZvW2ldLmNvZGVCb29rID0gLTE7Ci0gICAgc2ZiV2lkdGggPSBzZmJPZmZzZXRbaSArIDFdIC0gc2ZiT2Zmc2V0W2ldOwotICAgIG1heFZhbCA9IHNmYk1heFtpXTsKLSAgICBiaXRDb3VudChxdWFudFNwZWN0cnVtICsgc2ZiT2Zmc2V0W2ldLCBzZmJXaWR0aCwgbWF4VmFsLCBiaXRMb29rVXBbaV0pOwotICB9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGZpbmRCZXN0Qm9vawotKiBkZXNjcmlwdGlvbjogIGVzc2VudGlhbCBoZWxwZXIgZnVuY3Rpb25zCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBXb3JkMTYKLWZpbmRCZXN0Qm9vayhjb25zdCBXb3JkMTYgKmJjLCBXb3JkMTYgKmJvb2spCi17Ci0gIFdvcmQzMiBtaW5CaXRzLCBqOwotICBtaW5CaXRzID0gSU5WQUxJRF9CSVRDT1VOVDsKLQotICBmb3IgKGo9MDsgajw9Q09ERV9CT09LX0VTQ19ORFg7IGorKykgewotCi0gICAgaWYgKGJjW2pdIDwgbWluQml0cykgewotICAgICAgbWluQml0cyA9IGJjW2pdOwotICAgICAgKmJvb2sgPSBqOwotICAgIH0KLSAgfQotICByZXR1cm4gZXh0cmFjdF9sKG1pbkJpdHMpOwotfQotCi1zdGF0aWMgV29yZDE2Ci1maW5kTWluTWVyZ2VCaXRzKGNvbnN0IFdvcmQxNiAqYmMxLCBjb25zdCBXb3JkMTYgKmJjMikKLXsKLSAgV29yZDMyIG1pbkJpdHMsIGosIHN1bTsKLSAgbWluQml0cyA9IElOVkFMSURfQklUQ09VTlQ7Ci0KLSAgZm9yIChqPTA7IGo8PUNPREVfQk9PS19FU0NfTkRYOyBqKyspIHsKLSAgICBzdW0gPSBiYzFbal0gKyBiYzJbal07Ci0gICAgaWYgKHN1bSA8IG1pbkJpdHMpIHsKLSAgICAgIG1pbkJpdHMgPSBzdW07Ci0gICAgfQotICB9Ci0gIHJldHVybiBleHRyYWN0X2wobWluQml0cyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tZXJnZUJpdExvb2tVcChXb3JkMTYgKmJjMSwgY29uc3QgV29yZDE2ICpiYzIpCi17Ci0gIFdvcmQzMiBqOwotCi0gIGZvciAoaj0wOyBqPD1DT0RFX0JPT0tfRVNDX05EWDsgaisrKSB7Ci0gICAgYmMxW2pdID0gbWluKGJjMVtqXSArIGJjMltqXSwgSU5WQUxJRF9CSVRDT1VOVCk7Ci0gIH0KLX0KLQotc3RhdGljIFdvcmQxNgotZmluZE1heE1lcmdlKGNvbnN0IFdvcmQxNiBtZXJnZUdhaW5Mb29rVXBbTUFYX1NGQl9MT05HXSwKLSAgICAgICAgICAgICBjb25zdCBTRUNUSU9OX0lORk8gKnNlY3Rpb25JbmZvLAotICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBtYXhTZmIsIFdvcmQxNiAqbWF4TmR4KQotewotICBXb3JkMzIgaSwgbWF4TWVyZ2VHYWluOwotICBtYXhNZXJnZUdhaW4gPSAwOwotCi0gIGZvciAoaT0wOyBpK3NlY3Rpb25JbmZvW2ldLnNmYkNudCA8IG1heFNmYjsgaSArPSBzZWN0aW9uSW5mb1tpXS5zZmJDbnQpIHsKLQotICAgIGlmIChtZXJnZUdhaW5Mb29rVXBbaV0gPiBtYXhNZXJnZUdhaW4pIHsKLSAgICAgIG1heE1lcmdlR2FpbiA9IG1lcmdlR2Fpbkxvb2tVcFtpXTsKLSAgICAgICptYXhOZHggPSBpOwotICAgIH0KLSAgfQotICByZXR1cm4gZXh0cmFjdF9sKG1heE1lcmdlR2Fpbik7Ci19Ci0KLQotCi1zdGF0aWMgV29yZDE2Ci1DYWxjTWVyZ2VHYWluKGNvbnN0IFNFQ1RJT05fSU5GTyAqc2VjdGlvbkluZm8sCi0gICAgICAgICAgICAgIFdvcmQxNiBiaXRMb29rVXBbTUFYX1NGQl9MT05HXVtDT0RFX0JPT0tfRVNDX05EWCArIDFdLAotICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKnNpZGVJbmZvVGFiLAotICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbmR4MSwKLSAgICAgICAgICAgICAgY29uc3QgV29yZDE2IG5keDIpCi17Ci0gIFdvcmQzMiBTcGxpdEJpdHM7Ci0gIFdvcmQzMiBNZXJnZUJpdHM7Ci0gIFdvcmQzMiBNZXJnZUdhaW47Ci0KLSAgLyoKLSAgICBCaXQgYW1vdW50IGZvciBzcGxpdHRlZCBzZWN0aW9ucwotICAqLwotICBTcGxpdEJpdHMgPSBzZWN0aW9uSW5mb1tuZHgxXS5zZWN0aW9uQml0cyArIHNlY3Rpb25JbmZvW25keDJdLnNlY3Rpb25CaXRzOwotCi0gIE1lcmdlQml0cyA9IHNpZGVJbmZvVGFiW3NlY3Rpb25JbmZvW25keDFdLnNmYkNudCArIHNlY3Rpb25JbmZvW25keDJdLnNmYkNudF0gKwotICAgICAgICAgICAgICAgICAgZmluZE1pbk1lcmdlQml0cyhiaXRMb29rVXBbbmR4MV0sIGJpdExvb2tVcFtuZHgyXSk7Ci0gIE1lcmdlR2FpbiA9IChTcGxpdEJpdHMgLSBNZXJnZUJpdHMpOwotCi0gIHJldHVybiBleHRyYWN0X2woTWVyZ2VHYWluKTsKLX0KLQotLyoKLSAgc2VjdGlvbmluZyBTdGFnZSAwOmZpbmQgbWluaW11bSBjb2Rib29rcwotKi8KLQotc3RhdGljIHZvaWQKLWdtU3RhZ2UwKFNFQ1RJT05fSU5GTyAqIHNlY3Rpb25JbmZvLAotICAgICAgICAgV29yZDE2IGJpdExvb2tVcFtNQVhfU0ZCX0xPTkddW0NPREVfQk9PS19FU0NfTkRYICsgMV0sCi0gICAgICAgICBjb25zdCBXb3JkMTYgbWF4U2ZiKQotewotICBXb3JkMzIgaTsKLQotICBmb3IgKGk9MDsgaTxtYXhTZmI7IGkrKykgewotICAgIC8qIFNpZGUtSW5mbyBiaXRzIHdpbGwgYmUgY2FsY3VsYXRlZCBpbiBTdGFnZSAxISAgKi8KLQotICAgIGlmIChzZWN0aW9uSW5mb1tpXS5zZWN0aW9uQml0cyA9PSBJTlZBTElEX0JJVENPVU5UKSB7Ci0gICAgICBzZWN0aW9uSW5mb1tpXS5zZWN0aW9uQml0cyA9IGZpbmRCZXN0Qm9vayhiaXRMb29rVXBbaV0sICYoc2VjdGlvbkluZm9baV0uY29kZUJvb2spKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoKLSAgc2VjdGlvbmluZyBTdGFnZSAxOm1lcmdlIGFsbCBjb25uZWN0ZWQgcmVnaW9ucyB3aXRoIHRoZSBzYW1lIGNvZGUgYm9vayBhbmQKLSAgY2FsY3VsYXRlIHNpZGUgaW5mbwotKi8KLQotc3RhdGljIHZvaWQKLWdtU3RhZ2UxKFNFQ1RJT05fSU5GTyAqIHNlY3Rpb25JbmZvLAotICAgICAgICAgV29yZDE2IGJpdExvb2tVcFtNQVhfU0ZCX0xPTkddW0NPREVfQk9PS19FU0NfTkRYICsgMV0sCi0gICAgICAgICBjb25zdCBXb3JkMTYgbWF4U2ZiLAotICAgICAgICAgY29uc3QgV29yZDE2ICpzaWRlSW5mb1RhYikKLXsKLSAgU0VDVElPTl9JTkZPICogc2VjdGlvbkluZm9fczsKLSAgU0VDVElPTl9JTkZPICogc2VjdGlvbkluZm9fZTsKLSAgV29yZDMyIG1lcmdlU3RhcnQsIG1lcmdlRW5kOwotICBtZXJnZVN0YXJ0ID0gMDsKLQotICBkbyB7Ci0KLSAgICBzZWN0aW9uSW5mb19zID0gc2VjdGlvbkluZm8gKyBtZXJnZVN0YXJ0OwotCWZvciAobWVyZ2VFbmQ9bWVyZ2VTdGFydCsxOyBtZXJnZUVuZDxtYXhTZmI7IG1lcmdlRW5kKyspIHsKLSAgICAgIHNlY3Rpb25JbmZvX2UgPSBzZWN0aW9uSW5mbyArIG1lcmdlRW5kOwotICAgICAgaWYgKHNlY3Rpb25JbmZvX3MtPmNvZGVCb29rICE9IHNlY3Rpb25JbmZvX2UtPmNvZGVCb29rKQotICAgICAgICBicmVhazsKLSAgICAgIHNlY3Rpb25JbmZvX3MtPnNmYkNudCArPSAxOwotICAgICAgc2VjdGlvbkluZm9fcy0+c2VjdGlvbkJpdHMgKz0gc2VjdGlvbkluZm9fZS0+c2VjdGlvbkJpdHM7Ci0KLSAgICAgIG1lcmdlQml0TG9va1VwKGJpdExvb2tVcFttZXJnZVN0YXJ0XSwgYml0TG9va1VwW21lcmdlRW5kXSk7Ci0gICAgfQotCi0gICAgc2VjdGlvbkluZm9fcy0+c2VjdGlvbkJpdHMgKz0gc2lkZUluZm9UYWJbc2VjdGlvbkluZm9fcy0+c2ZiQ250XTsKLSAgICBzZWN0aW9uSW5mb1ttZXJnZUVuZCAtIDFdLnNmYlN0YXJ0ID0gc2VjdGlvbkluZm9fcy0+c2ZiU3RhcnQ7ICAgICAgLyogc3BlZWQgdXAgcHJldiBzZWFyY2ggKi8KLQotICAgIG1lcmdlU3RhcnQgPSBtZXJnZUVuZDsKLQotCi0gIH0gd2hpbGUgKG1lcmdlU3RhcnQgLSBtYXhTZmIgPCAwKTsKLX0KLQotLyoKLSAgc2VjdGlvbmluZyBTdGFnZSAyOmdyZWVkeSBtZXJnZSBhbGdvcml0aG0sIG1lcmdlIGNvbm5lY3RlZCBzZWN0aW9ucyB3aXRoCi0gIG1heGltdW0gYml0IGdhaW4gdW50aWwgbm8gbW9yZSBnYWluIGlzIHBvc3NpYmxlCi0qLwotc3RhdGljIHZvaWQKLWdtU3RhZ2UyKFNFQ1RJT05fSU5GTyAqc2VjdGlvbkluZm8sCi0gICAgICAgICBXb3JkMTYgbWVyZ2VHYWluTG9va1VwW01BWF9TRkJfTE9OR10sCi0gICAgICAgICBXb3JkMTYgYml0TG9va1VwW01BWF9TRkJfTE9OR11bQ09ERV9CT09LX0VTQ19ORFggKyAxXSwKLSAgICAgICAgIGNvbnN0IFdvcmQxNiBtYXhTZmIsCi0gICAgICAgICBjb25zdCBXb3JkMTYgKnNpZGVJbmZvVGFiKQotewotICBXb3JkMTYgaTsKLQotICBmb3IgKGk9MDsgaStzZWN0aW9uSW5mb1tpXS5zZmJDbnQ8bWF4U2ZiOyBpKz1zZWN0aW9uSW5mb1tpXS5zZmJDbnQpIHsKLSAgICBtZXJnZUdhaW5Mb29rVXBbaV0gPSBDYWxjTWVyZ2VHYWluKHNlY3Rpb25JbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0TG9va1VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lkZUluZm9UYWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkgKyBzZWN0aW9uSW5mb1tpXS5zZmJDbnQpKTsKLSAgfQotCi0gIHdoaWxlIChUUlVFKSB7Ci0gICAgV29yZDE2IG1heE1lcmdlR2FpbiwgbWF4TmR4ID0gMCwgbWF4TmR4TmV4dCwgbWF4TmR4TGFzdDsKLQotICAgIG1heE1lcmdlR2FpbiA9IGZpbmRNYXhNZXJnZShtZXJnZUdhaW5Mb29rVXAsIHNlY3Rpb25JbmZvLCBtYXhTZmIsICZtYXhOZHgpOwotCi0KLSAgICBpZiAobWF4TWVyZ2VHYWluIDw9IDApCi0gICAgICBicmVhazsKLQotCi0gICAgbWF4TmR4TmV4dCA9IG1heE5keCArIHNlY3Rpb25JbmZvW21heE5keF0uc2ZiQ250OwotCi0gICAgc2VjdGlvbkluZm9bbWF4TmR4XS5zZmJDbnQgPSBzZWN0aW9uSW5mb1ttYXhOZHhdLnNmYkNudCArIHNlY3Rpb25JbmZvW21heE5keE5leHRdLnNmYkNudDsKLSAgICBzZWN0aW9uSW5mb1ttYXhOZHhdLnNlY3Rpb25CaXRzID0gc2VjdGlvbkluZm9bbWF4TmR4XS5zZWN0aW9uQml0cyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VjdGlvbkluZm9bbWF4TmR4TmV4dF0uc2VjdGlvbkJpdHMgLSBtYXhNZXJnZUdhaW4pOwotCi0KLSAgICBtZXJnZUJpdExvb2tVcChiaXRMb29rVXBbbWF4TmR4XSwgYml0TG9va1VwW21heE5keE5leHRdKTsKLQotCi0gICAgaWYgKG1heE5keCAhPSAwKSB7Ci0gICAgICBtYXhOZHhMYXN0ID0gc2VjdGlvbkluZm9bbWF4TmR4IC0gMV0uc2ZiU3RhcnQ7Ci0gICAgICBtZXJnZUdhaW5Mb29rVXBbbWF4TmR4TGFzdF0gPSBDYWxjTWVyZ2VHYWluKHNlY3Rpb25JbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRMb29rVXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZGVJbmZvVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhOZHhMYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhOZHgpOwotICAgIH0KLSAgICBtYXhOZHhOZXh0ID0gbWF4TmR4ICsgc2VjdGlvbkluZm9bbWF4TmR4XS5zZmJDbnQ7Ci0KLSAgICBzZWN0aW9uSW5mb1ttYXhOZHhOZXh0IC0gMV0uc2ZiU3RhcnQgPSBzZWN0aW9uSW5mb1ttYXhOZHhdLnNmYlN0YXJ0OwotCi0KLSAgICBpZiAobWF4TmR4TmV4dCAtIG1heFNmYiA8IDApIHsKLSAgICAgIG1lcmdlR2Fpbkxvb2tVcFttYXhOZHhdID0gQ2FsY01lcmdlR2FpbihzZWN0aW9uSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRMb29rVXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lkZUluZm9UYWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TmR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE5keE5leHQpOwotICAgIH0KLSAgfQotfQotCi0vKgotICBjb3VudCBiaXRzIHVzZWQgYnkgdGhlIG5vaXNlbGVzcyBjb2RlcgotKi8KLXN0YXRpYyB2b2lkCi1ub2lzZWxlc3NDb3VudGVyKFNFQ1RJT05fREFUQSAqc2VjdGlvbkRhdGEsCi0gICAgICAgICAgICAgICAgIFdvcmQxNiBtZXJnZUdhaW5Mb29rVXBbTUFYX1NGQl9MT05HXSwKLSAgICAgICAgICAgICAgICAgV29yZDE2IGJpdExvb2tVcFtNQVhfU0ZCX0xPTkddW0NPREVfQk9PS19FU0NfTkRYICsgMV0sCi0gICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqcXVhbnRTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgY29uc3QgVVdvcmQxNiAqbWF4VmFsdWVJblNmYiwKLSAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICpzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiBibG9ja1R5cGUpCi17Ci0gIFdvcmQzMiBncnBOZHgsIGk7Ci0gIGNvbnN0IFdvcmQxNiAqc2lkZUluZm9UYWIgPSBOVUxMOwotICBTRUNUSU9OX0lORk8gKnNlY3Rpb25JbmZvOwotCi0gIC8qCi0gICAgdXNlIGFwcHJvcHJpYXRlIHNpZGUgaW5mbyB0YWJsZQotICAqLwotICBzd2l0Y2ggKGJsb2NrVHlwZSkKLSAgewotICAgIGNhc2UgTE9OR19XSU5ET1c6Ci0gICAgY2FzZSBTVEFSVF9XSU5ET1c6Ci0gICAgY2FzZSBTVE9QX1dJTkRPVzoKLSAgICAgIHNpZGVJbmZvVGFiID0gc2lkZUluZm9UYWJMb25nOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSE9SVF9XSU5ET1c6Ci0gICAgICBzaWRlSW5mb1RhYiA9IHNpZGVJbmZvVGFiU2hvcnQ7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgQUxPR0UoImludmFsaWQgYmxvY2tUeXBlOiAlZCIsIGJsb2NrVHlwZSk7Ci0gICAgICByZXR1cm47Ci0gIH0KLQotCi0gIHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnMgPSAwOwotICBzZWN0aW9uRGF0YS0+aHVmZm1hbkJpdHMgPSAwOwotICBzZWN0aW9uRGF0YS0+c2lkZUluZm9CaXRzID0gMDsKLQotCi0gIGlmIChzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXAgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgLyoKLSAgICBsb29wIHRyb3VnaCBncm91cHMKLSAgKi8KLSAgZm9yIChncnBOZHg9MDsgZ3JwTmR4PHNlY3Rpb25EYXRhLT5zZmJDbnQ7IGdycE5keCs9c2VjdGlvbkRhdGEtPnNmYlBlckdyb3VwKSB7Ci0KLSAgICBzZWN0aW9uSW5mbyA9IHNlY3Rpb25EYXRhLT5zZWN0aW9uSW5mbyArIHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnM7Ci0KLSAgICBidWlsZEJpdExvb2tVcChxdWFudFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICBzZmJPZmZzZXQgKyBncnBOZHgsCi0gICAgICAgICAgICAgICAgICAgbWF4VmFsdWVJblNmYiArIGdycE5keCwKLSAgICAgICAgICAgICAgICAgICBiaXRMb29rVXAsCi0gICAgICAgICAgICAgICAgICAgc2VjdGlvbkluZm8pOwotCi0gICAgLyoKLSAgICAgICAwLlN0YWdlCi0gICAgKi8KLSAgICBnbVN0YWdlMChzZWN0aW9uSW5mbywgYml0TG9va1VwLCBzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXApOwotCi0gICAgLyoKLSAgICAgICAxLlN0YWdlCi0gICAgKi8KLSAgICBnbVN0YWdlMShzZWN0aW9uSW5mbywgYml0TG9va1VwLCBzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXAsIHNpZGVJbmZvVGFiKTsKLQotCi0gICAgLyoKLSAgICAgICAyLlN0YWdlCi0gICAgKi8KLSAgICBnbVN0YWdlMihzZWN0aW9uSW5mbywKLSAgICAgICAgICAgICBtZXJnZUdhaW5Mb29rVXAsCi0gICAgICAgICAgICAgYml0TG9va1VwLAotICAgICAgICAgICAgIHNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICBzaWRlSW5mb1RhYik7Ci0KLQotICAgIC8qCi0gICAgICAgY29tcHJlc3Mgb3V0cHV0LCBjYWxjdWxhdGUgdG90YWwgaHVmZiBhbmQgc2lkZSBiaXRzCi0gICAgKi8KLSAgICBmb3IgKGk9MDsgaTxzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXA7IGkrPXNlY3Rpb25JbmZvW2ldLnNmYkNudCkgewotICAgICAgZmluZEJlc3RCb29rKGJpdExvb2tVcFtpXSwgJihzZWN0aW9uSW5mb1tpXS5jb2RlQm9vaykpOwotICAgICAgc2VjdGlvbkluZm9baV0uc2ZiU3RhcnQgPSBzZWN0aW9uSW5mb1tpXS5zZmJTdGFydCArIGdycE5keDsKLQotICAgICAgc2VjdGlvbkRhdGEtPmh1ZmZtYW5CaXRzID0gKHNlY3Rpb25EYXRhLT5odWZmbWFuQml0cyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlY3Rpb25JbmZvW2ldLnNlY3Rpb25CaXRzIC0gc2lkZUluZm9UYWJbc2VjdGlvbkluZm9baV0uc2ZiQ250XSkpOwotICAgICAgc2VjdGlvbkRhdGEtPnNpZGVJbmZvQml0cyA9IChzZWN0aW9uRGF0YS0+c2lkZUluZm9CaXRzICsgc2lkZUluZm9UYWJbc2VjdGlvbkluZm9baV0uc2ZiQ250XSk7Ci0gICAgICBzZWN0aW9uRGF0YS0+c2VjdGlvbkluZm9bc2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9uc10gPSBzZWN0aW9uSW5mb1tpXTsKLSAgICAgIHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnMgPSBzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zICsgMTsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbm5hbWU6IHNjZkNvdW50Ci0qIHJldHVybnMgICAgIDogLS0tCi0qIGRlc2NyaXB0aW9uIDogY291bnQgYml0cyB1c2VkIGJ5IHNjYWxlZmFjdG9ycy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgc2NmQ291bnQoY29uc3QgV29yZDE2ICpzY2FsZWZhY0dhaW4sCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBVV29yZDE2ICptYXhWYWx1ZUluU2ZiLAotICAgICAgICAgICAgICAgICAgICAgU0VDVElPTl9EQVRBICogc2VjdGlvbkRhdGEpCi0KLXsKLSAgU0VDVElPTl9JTkZPICpwc2VjdGlvbkluZm87Ci0gIFNFQ1RJT05fSU5GTyAqcHNlY3Rpb25JbmZvbTsKLQotICAvKiBjb3VudGVyICovCi0gIFdvcmQzMiBpID0gMDsgLyogc2VjdGlvbiBjb3VudGVyICovCi0gIFdvcmQzMiBqID0gMDsgLyogc2ZiIGNvdW50ZXIgKi8KLSAgV29yZDMyIGsgPSAwOyAvKiBjdXJyZW50IHNlY3Rpb24gYXV4aWxpYXJ5IGNvdW50ZXIgKi8KLSAgV29yZDMyIG0gPSAwOyAvKiBvdGhlciBzZWN0aW9uIGF1eGlsaWFyeSBjb3VudGVyICovCi0gIFdvcmQzMiBuID0gMDsgLyogb3RoZXIgc2ZiIGF1eGlsaWFyeSBjb3VudGVyICovCi0KLSAgLyogZnVydGhlciB2YXJpYWJsZXMgKi8KLSAgV29yZDMyIGxhc3RWYWxTY2YgICAgID0gMDsKLSAgV29yZDMyIGRlbHRhU2NmICAgICAgID0gMDsKLSAgRmxhZyBmb3VuZCAgICAgICAgICAgID0gMDsKLSAgV29yZDMyIHNjZlNraXBDb3VudGVyID0gMDsKLQotCi0gIHNlY3Rpb25EYXRhLT5zY2FsZWZhY0JpdHMgPSAwOwotCi0KLSAgaWYgKHNjYWxlZmFjR2FpbiA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgbGFzdFZhbFNjZiA9IDA7Ci0gIHNlY3Rpb25EYXRhLT5maXJzdFNjZiA9IDA7Ci0KLSAgcHNlY3Rpb25JbmZvID0gc2VjdGlvbkRhdGEtPnNlY3Rpb25JbmZvOwotICBmb3IgKGk9MDsgaTxzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zOyBpKyspIHsKLQotICAgIGlmIChwc2VjdGlvbkluZm8tPmNvZGVCb29rICE9IENPREVfQk9PS19aRVJPX05PKSB7Ci0gICAgICBzZWN0aW9uRGF0YS0+Zmlyc3RTY2YgPSBwc2VjdGlvbkluZm8tPnNmYlN0YXJ0OwotICAgICAgbGFzdFZhbFNjZiA9IHNjYWxlZmFjR2FpbltzZWN0aW9uRGF0YS0+Zmlyc3RTY2ZdOwotICAgICAgYnJlYWs7Ci0gICAgfQotCXBzZWN0aW9uSW5mbyArPSAxOwotICB9Ci0KLSAgcHNlY3Rpb25JbmZvID0gc2VjdGlvbkRhdGEtPnNlY3Rpb25JbmZvOwotICBmb3IgKGk9MDsgaTxzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zOyBpKyssIHBzZWN0aW9uSW5mbyArPSAxKSB7Ci0KLSAgICBpZiAocHNlY3Rpb25JbmZvLT5jb2RlQm9vayAhPSBDT0RFX0JPT0tfWkVST19OTwotICAgICAgICAmJiBwc2VjdGlvbkluZm8tPmNvZGVCb29rICE9IENPREVfQk9PS19QTlNfTk8pIHsKLSAgICAgIGZvciAoaiA9IHBzZWN0aW9uSW5mby0+c2ZiU3RhcnQ7Ci0gICAgICAgICAgIGogPCAocHNlY3Rpb25JbmZvLT5zZmJTdGFydCArIHBzZWN0aW9uSW5mby0+c2ZiQ250KTsgaisrKSB7Ci0gICAgICAgIC8qIGNoZWNrIGlmIHdlIGNhbiByZXBlYXQgdGhlIGxhc3QgdmFsdWUgdG8gc2F2ZSBiaXRzICovCi0KLSAgICAgICAgaWYgKG1heFZhbHVlSW5TZmJbal0gPT0gMCkgewotICAgICAgICAgIGZvdW5kID0gMDsKLQotICAgICAgICAgIGlmIChzY2ZTa2lwQ291bnRlciA9PSAwKSB7Ci0gICAgICAgICAgICAvKiBlbmQgb2Ygc2VjdGlvbiAqLwotCi0gICAgICAgICAgICBpZiAoaiAtICgocHNlY3Rpb25JbmZvLT5zZmJTdGFydCArIHBzZWN0aW9uSW5mby0+c2ZiQ250KSAtIDEpID09IDApIHsKLSAgICAgICAgICAgICAgZm91bmQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgIGZvciAoayA9IGogKyAxOyBrIDwgcHNlY3Rpb25JbmZvLT5zZmJTdGFydCArIHBzZWN0aW9uSW5mby0+c2ZiQ250OyBrKyspIHsKLQotICAgICAgICAgICAgICAgIGlmIChtYXhWYWx1ZUluU2ZiW2tdICE9IDApIHsKLSAgICAgICAgICAgICAgICAgIGludCB0bXAgPSBMX2FicyhzY2FsZWZhY0dhaW5ba10gLSBsYXN0VmFsU2NmKTsKLQkJCQkgIGZvdW5kID0gMTsKLQotICAgICAgICAgICAgICAgICAgaWYgKCB0bXAgPCBDT0RFX0JPT0tfU0NGX0xBVikgewotICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIGJpdHMgKi8KLSAgICAgICAgICAgICAgICAgICAgZGVsdGFTY2YgPSAwOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGRvIG5vdCBzYXZlIGJpdHMgKi8KLSAgICAgICAgICAgICAgICAgICAgZGVsdGFTY2YgPSBsYXN0VmFsU2NmIC0gc2NhbGVmYWNHYWluW2pdOwotICAgICAgICAgICAgICAgICAgICBsYXN0VmFsU2NmID0gc2NhbGVmYWNHYWluW2pdOwotICAgICAgICAgICAgICAgICAgICBzY2ZTa2lwQ291bnRlciA9IDA7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogY291bnQgc2NhbGVmYWN0b3Igc2tpcCAqLwotICAgICAgICAgICAgICAgIHNjZlNraXBDb3VudGVyID0gc2NmU2tpcENvdW50ZXIgKyAxOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLQkJCXBzZWN0aW9uSW5mb20gPSBwc2VjdGlvbkluZm8gKyAxOwotICAgICAgICAgICAgLyogc2VhcmNoIGZvciB0aGUgbmV4dCBtYXhWYWx1ZUluU2ZiW10gIT0gMCBpbiBhbGwgb3RoZXIgc2VjdGlvbnMgKi8KLSAgICAgICAgICAgIGZvciAobSA9IGkgKyAxOyAobSA8IHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnMpICYmIChmb3VuZCA9PSAwKTsgbSsrKSB7Ci0KLSAgICAgICAgICAgICAgaWYgKChwc2VjdGlvbkluZm9tLT5jb2RlQm9vayAhPSBDT0RFX0JPT0tfWkVST19OTykgJiYKLSAgICAgICAgICAgICAgICAgIChwc2VjdGlvbkluZm9tLT5jb2RlQm9vayAhPSBDT0RFX0JPT0tfUE5TX05PKSkgewotICAgICAgICAgICAgICAgIGZvciAobiA9IHBzZWN0aW9uSW5mb20tPnNmYlN0YXJ0OwotICAgICAgICAgICAgICAgICAgICAgbiA8IChwc2VjdGlvbkluZm9tLT5zZmJTdGFydCArIHBzZWN0aW9uSW5mb20tPnNmYkNudCk7IG4rKykgewotCi0gICAgICAgICAgICAgICAgICBpZiAobWF4VmFsdWVJblNmYltuXSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIChhYnNfcyhzY2FsZWZhY0dhaW5bbl0gLSBsYXN0VmFsU2NmKSA8IENPREVfQk9PS19TQ0ZfTEFWKSkgewotICAgICAgICAgICAgICAgICAgICAgIGRlbHRhU2NmID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICBkZWx0YVNjZiA9IChsYXN0VmFsU2NmIC0gc2NhbGVmYWNHYWluW2pdKTsKLSAgICAgICAgICAgICAgICAgICAgICBsYXN0VmFsU2NmID0gc2NhbGVmYWNHYWluW2pdOwotICAgICAgICAgICAgICAgICAgICAgIHNjZlNraXBDb3VudGVyID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIC8qIGNvdW50IHNjYWxlZmFjdG9yIHNraXAgKi8KLSAgICAgICAgICAgICAgICAgIHNjZlNraXBDb3VudGVyID0gc2NmU2tpcENvdW50ZXIgKyAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotCi0JCQkgIHBzZWN0aW9uSW5mb20gKz0gMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZvdW5kID09IDApIHsKLSAgICAgICAgICAgICAgZGVsdGFTY2YgPSAwOwotICAgICAgICAgICAgICBzY2ZTa2lwQ291bnRlciA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgZGVsdGFTY2YgPSAwOwotICAgICAgICAgICAgc2NmU2tpcENvdW50ZXIgPSBzY2ZTa2lwQ291bnRlciAtIDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIGRlbHRhU2NmID0gbGFzdFZhbFNjZiAtIHNjYWxlZmFjR2FpbltqXTsKLSAgICAgICAgICBsYXN0VmFsU2NmID0gc2NhbGVmYWNHYWluW2pdOwotICAgICAgICB9Ci0gICAgICAgIHNlY3Rpb25EYXRhLT5zY2FsZWZhY0JpdHMgKz0gYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKGRlbHRhU2NmKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotCi10eXBlZGVmIFdvcmQxNiAoKmxvb2tVcFRhYmxlKVtDT0RFX0JPT0tfRVNDX05EWCArIDFdOwotCi0KLVdvcmQxNgotZHluQml0Q291bnQoY29uc3QgV29yZDE2ICAqcXVhbnRTcGVjdHJ1bSwKLSAgICAgICAgICAgIGNvbnN0IFVXb3JkMTYgKm1heFZhbHVlSW5TZmIsCi0gICAgICAgICAgICBjb25zdCBXb3JkMTYgICpzY2FsZWZhYywKLSAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgIGJsb2NrVHlwZSwKLSAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgIHNmYkNudCwKLSAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgIG1heFNmYlBlckdyb3VwLAotICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgc2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICBjb25zdCBXb3JkMTYgICpzZmJPZmZzZXQsCi0gICAgICAgICAgICBTRUNUSU9OX0RBVEEgICpzZWN0aW9uRGF0YSkKLXsKLSAgc2VjdGlvbkRhdGEtPmJsb2NrVHlwZSAgICAgID0gYmxvY2tUeXBlOwotICBzZWN0aW9uRGF0YS0+c2ZiQ250ICAgICAgICAgPSBzZmJDbnQ7Ci0gIHNlY3Rpb25EYXRhLT5zZmJQZXJHcm91cCAgICA9IHNmYlBlckdyb3VwOwotICBpZihzZmJQZXJHcm91cCkKLQlzZWN0aW9uRGF0YS0+bm9PZkdyb3VwcyAgID0gc2ZiQ250L3NmYlBlckdyb3VwOwotICBlbHNlCi0Jc2VjdGlvbkRhdGEtPm5vT2ZHcm91cHMgICA9IDB4N2ZmZjsKLSAgc2VjdGlvbkRhdGEtPm1heFNmYlBlckdyb3VwID0gbWF4U2ZiUGVyR3JvdXA7Ci0KLSAgbm9pc2VsZXNzQ291bnRlcihzZWN0aW9uRGF0YSwKLSAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YS0+bWVyZ2VHYWluTG9va1VwLAotICAgICAgICAgICAgICAgICAgIChsb29rVXBUYWJsZSlzZWN0aW9uRGF0YS0+Yml0TG9va1VwLAotICAgICAgICAgICAgICAgICAgIHF1YW50U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgbWF4VmFsdWVJblNmYiwKLSAgICAgICAgICAgICAgICAgICBzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgYmxvY2tUeXBlKTsKLQotICBzY2ZDb3VudChzY2FsZWZhYywKLSAgICAgICAgICAgbWF4VmFsdWVJblNmYiwKLSAgICAgICAgICAgc2VjdGlvbkRhdGEpOwotCi0KLSAgcmV0dXJuIChzZWN0aW9uRGF0YS0+aHVmZm1hbkJpdHMgKyBzZWN0aW9uRGF0YS0+c2lkZUluZm9CaXRzICsKLQkgICAgICBzZWN0aW9uRGF0YS0+c2NhbGVmYWNCaXRzKTsKLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvZ3JwX2RhdGEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2dycF9kYXRhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZmI5NWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvZ3JwX2RhdGEuYworKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCWdycF9kYXRhLmMKLQotCUNvbnRlbnQ6CVNob3J0IGJsb2NrIGdyb3VwaW5nIGZ1bmN0aW9uCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJiYXNpY19vcC5oIgotI2luY2x1ZGUgInBzeV9jb25zdC5oIgotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImdycF9kYXRhLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBncm91cFNob3J0RGF0YQotKiBkZXNjcmlwdGlvbjogIGdyb3VwIHNob3J0IGRhdGEgZm9yIG5leHQgcXVhbnRpemF0aW9uIGFuZCBjb2RpbmcKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1ncm91cFNob3J0RGF0YShXb3JkMzIgICAgICAgICptZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICBXb3JkMzIgICAgICAgICp0bXBTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgIFNGQl9USFJFU0hPTEQgKnNmYlRocmVzaG9sZCwKLSAgICAgICAgICAgICAgIFNGQl9FTkVSR1kgICAgKnNmYkVuZXJneSwKLSAgICAgICAgICAgICAgIFNGQl9FTkVSR1kgICAgKnNmYkVuZXJneU1TLAotICAgICAgICAgICAgICAgU0ZCX0VORVJHWSAgICAqc2ZiU3ByZWFkZWRFbmVyZ3ksCi0gICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICBzZmJDbnQsCi0gICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICpzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICpzZmJNaW5TbnIsCi0gICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICpncm91cGVkU2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAqbWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICpncm91cGVkU2ZiTWluU25yLAotICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgbm9PZkdyb3VwcywKLSAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgKmdyb3VwTGVuKQotewotICBXb3JkMzIgaSwgajsKLSAgV29yZDMyIGxpbmU7Ci0gIFdvcmQzMiBzZmI7Ci0gIFdvcmQzMiBncnA7Ci0gIFdvcmQzMiB3bmQ7Ci0gIFdvcmQzMiBvZmZzZXQ7Ci0gIFdvcmQzMiBoaWdoZXN0U2ZiOwotCi0gIC8qIGZvciBzaG9ydDogcmVncm91cCBhbmQgICovCi0gIC8qIGN1bXVsYXRlIGVuZXJnaWVzIHVuZCB0aHJlc2hvbGRzIGdyb3VwLXdpc2UgLiAqLwotCi0gIC8qIGNhbGN1bGF0ZSBzZmJDbnQgKi8KLSAgaGlnaGVzdFNmYiA9IDA7Ci0gIGZvciAod25kPTA7IHduZDxUUkFOU19GQUM7IHduZCsrKSB7Ci0gICAgZm9yIChzZmI9c2ZiQ250IC0gMTsgc2ZiPj1oaWdoZXN0U2ZiOyBzZmItLSkgewotICAgICAgZm9yIChsaW5lPShzZmJPZmZzZXRbc2ZiICsgMV0gLSAxKTsgbGluZT49c2ZiT2Zmc2V0W3NmYl07IGxpbmUtLSkgewotCi0gICAgICAgIGlmIChtZGN0U3BlY3RydW1bd25kKkZSQU1FX0xFTl9TSE9SVCtsaW5lXSAhPSAwKSBicmVhazsKLSAgICAgIH0KLQotICAgICAgaWYgKGxpbmUgPj0gc2ZiT2Zmc2V0W3NmYl0pIGJyZWFrOwotICAgIH0KLSAgICBoaWdoZXN0U2ZiID0gbWF4KGhpZ2hlc3RTZmIsIHNmYik7Ci0gIH0KLQotICBpZiAoaGlnaGVzdFNmYiA8IDApIHsKLSAgICBoaWdoZXN0U2ZiID0gMDsKLSAgfQotICAqbWF4U2ZiUGVyR3JvdXAgPSBoaWdoZXN0U2ZiICsgMTsKLQotICAvKiBjYWxjdWxhdGUgc2ZiT2Zmc2V0ICovCi0gIGkgPSAwOwotICBvZmZzZXQgPSAwOwotICBmb3IgKGdycCA9IDA7IGdycCA8IG5vT2ZHcm91cHM7IGdycCsrKSB7Ci0gICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJDbnQ7IHNmYisrKSB7Ci0gICAgICBncm91cGVkU2ZiT2Zmc2V0W2ldID0gb2Zmc2V0ICsgc2ZiT2Zmc2V0W3NmYl0gKiBncm91cExlbltncnBdOwotICAgICAgaSArPSAxOwotICAgIH0KLSAgICBvZmZzZXQgKz0gZ3JvdXBMZW5bZ3JwXSAqIEZSQU1FX0xFTl9TSE9SVDsKLSAgfQotICBncm91cGVkU2ZiT2Zmc2V0W2ldID0gRlJBTUVfTEVOX0xPTkc7Ci0KLSAgLyogY2FsY3VsYXRlIG1pblNuciAqLwotICBpID0gMDsKLSAgb2Zmc2V0ID0gMDsKLSAgZm9yIChncnAgPSAwOyBncnAgPCBub09mR3JvdXBzOyBncnArKykgewotICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQ250OyBzZmIrKykgewotICAgICAgZ3JvdXBlZFNmYk1pblNucltpXSA9IHNmYk1pblNucltzZmJdOwotICAgICAgaSArPSAxOwotICAgIH0KLSAgICBvZmZzZXQgKz0gZ3JvdXBMZW5bZ3JwXSAqIEZSQU1FX0xFTl9TSE9SVDsKLSAgfQotCi0KLSAgLyogc3VtIHVwIHNmYlRocmVzaG9sZHMgKi8KLSAgd25kID0gMDsKLSAgaSA9IDA7Ci0gIGZvciAoZ3JwID0gMDsgZ3JwIDwgbm9PZkdyb3VwczsgZ3JwKyspIHsKLSAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkNudDsgc2ZiKyspIHsKLSAgICAgIFdvcmQzMiB0aHJlc2ggPSBzZmJUaHJlc2hvbGQtPnNmYlNob3J0W3duZF1bc2ZiXTsKLSAgICAgIGZvciAoaj0xOyBqPGdyb3VwTGVuW2dycF07IGorKykgewotICAgICAgICB0aHJlc2ggPSBMX2FkZCh0aHJlc2gsIHNmYlRocmVzaG9sZC0+c2ZiU2hvcnRbd25kK2pdW3NmYl0pOwotICAgICAgfQotICAgICAgc2ZiVGhyZXNob2xkLT5zZmJMb25nW2ldID0gdGhyZXNoOwotICAgICAgaSArPSAxOwotICAgIH0KLSAgICB3bmQgKz0gZ3JvdXBMZW5bZ3JwXTsKLSAgfQotCi0gIC8qIHN1bSB1cCBzZmJFbmVyZ2llcyBsZWZ0L3JpZ2h0ICovCi0gIHduZCA9IDA7Ci0gIGkgPSAwOwotICBmb3IgKGdycCA9IDA7IGdycCA8IG5vT2ZHcm91cHM7IGdycCsrKSB7Ci0gICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJDbnQ7IHNmYisrKSB7Ci0gICAgICBXb3JkMzIgZW5lcmd5ID0gc2ZiRW5lcmd5LT5zZmJTaG9ydFt3bmRdW3NmYl07Ci0gICAgICBmb3IgKGo9MTsgajxncm91cExlbltncnBdOyBqKyspIHsKLSAgICAgICAgZW5lcmd5ID0gTF9hZGQoZW5lcmd5LCBzZmJFbmVyZ3ktPnNmYlNob3J0W3duZCtqXVtzZmJdKTsKLSAgICAgIH0KLSAgICAgIHNmYkVuZXJneS0+c2ZiTG9uZ1tpXSA9IGVuZXJneTsKLSAgICAgIGkgKz0gMTsKLSAgICB9Ci0gICAgd25kICs9IGdyb3VwTGVuW2dycF07Ci0gIH0KLQotICAvKiBzdW0gdXAgc2ZiRW5lcmdpZXMgbWlkL3NpZGUgKi8KLSAgd25kID0gMDsKLSAgaSA9IDA7Ci0gIGZvciAoZ3JwID0gMDsgZ3JwIDwgbm9PZkdyb3VwczsgZ3JwKyspIHsKLSAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkNudDsgc2ZiKyspIHsKLSAgICAgIFdvcmQzMiBlbmVyZ3kgPSBzZmJFbmVyZ3lNUy0+c2ZiU2hvcnRbd25kXVtzZmJdOwotICAgICAgZm9yIChqPTE7IGo8Z3JvdXBMZW5bZ3JwXTsgaisrKSB7Ci0gICAgICAgIGVuZXJneSA9IExfYWRkKGVuZXJneSwgc2ZiRW5lcmd5TVMtPnNmYlNob3J0W3duZCtqXVtzZmJdKTsKLSAgICAgIH0KLSAgICAgIHNmYkVuZXJneU1TLT5zZmJMb25nW2ldID0gZW5lcmd5OwotICAgICAgaSArPSAxOwotICAgIH0KLSAgICB3bmQgKz0gZ3JvdXBMZW5bZ3JwXTsKLSAgfQotCi0gIC8qIHN1bSB1cCBzZmJTcHJlYWRlZEVuZXJnaWVzICovCi0gIHduZCA9IDA7Ci0gIGkgPSAwOwotICBmb3IgKGdycCA9IDA7IGdycCA8IG5vT2ZHcm91cHM7IGdycCsrKSB7Ci0gICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJDbnQ7IHNmYisrKSB7Ci0gICAgICBXb3JkMzIgZW5lcmd5ID0gc2ZiU3ByZWFkZWRFbmVyZ3ktPnNmYlNob3J0W3duZF1bc2ZiXTsKLSAgICAgIGZvciAoaj0xOyBqPGdyb3VwTGVuW2dycF07IGorKykgewotICAgICAgICBlbmVyZ3kgPSBMX2FkZChlbmVyZ3ksIHNmYlNwcmVhZGVkRW5lcmd5LT5zZmJTaG9ydFt3bmQral1bc2ZiXSk7Ci0gICAgICB9Ci0gICAgICBzZmJTcHJlYWRlZEVuZXJneS0+c2ZiTG9uZ1tpXSA9IGVuZXJneTsKLSAgICAgIGkgKz0gMTsKLSAgICB9Ci0gICAgd25kICs9IGdyb3VwTGVuW2dycF07Ci0gIH0KLQotICAvKiByZS1ncm91cCBzcGVjdHJ1bSAqLwotICB3bmQgPSAwOwotICBpID0gMDsKLSAgZm9yIChncnAgPSAwOyBncnAgPCBub09mR3JvdXBzOyBncnArKykgewotICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQ250OyBzZmIrKykgewotICAgICAgZm9yIChqID0gMDsgaiA8IGdyb3VwTGVuW2dycF07IGorKykgewotICAgICAgICBXb3JkMTYgbGluZU9mZnNldCA9IEZSQU1FX0xFTl9TSE9SVCAqICh3bmQgKyBqKTsKLSAgICAgICAgZm9yIChsaW5lID0gbGluZU9mZnNldCArIHNmYk9mZnNldFtzZmJdOyBsaW5lIDwgbGluZU9mZnNldCArIHNmYk9mZnNldFtzZmIrMV07IGxpbmUrKykgewotICAgICAgICAgIHRtcFNwZWN0cnVtW2ldID0gbWRjdFNwZWN0cnVtW2xpbmVdOwotICAgICAgICAgIGkgPSBpICsgMTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICB3bmQgKz0gZ3JvdXBMZW5bZ3JwXTsKLSAgfQotCi0gIGZvcihpPTA7aTxGUkFNRV9MRU5fTE9ORztpKz00KSB7Ci0gICAgbWRjdFNwZWN0cnVtW2ldID0gdG1wU3BlY3RydW1baV07Ci0JbWRjdFNwZWN0cnVtW2krMV0gPSB0bXBTcGVjdHJ1bVtpKzFdOwotCW1kY3RTcGVjdHJ1bVtpKzJdID0gdG1wU3BlY3RydW1baSsyXTsKLQltZGN0U3BlY3RydW1baSszXSA9IHRtcFNwZWN0cnVtW2krM107Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvaW50ZXJmYWNlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9pbnRlcmZhY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBhZDQzMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9pbnRlcmZhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCWludGVyZmFjZS5jCi0KLQlDb250ZW50OglJbnRlcmZhY2UgcHN5Y2hvYWNjb3VzdGljL3F1YW50aXplciBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJhc2ljX29wLmgiCi0jaW5jbHVkZSAib3Blcl8zMmIuaCIKLSNpbmNsdWRlICJwc3lfY29uc3QuaCIKLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IEJ1aWxkSW50ZXJmYWNlCi0qIGRlc2NyaXB0aW9uOiAgdXBkYXRlIG91dHB1dCBwYXJhbWV0ZXIKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJ1aWxkSW50ZXJmYWNlKFdvcmQzMiAgICAgICAgICAgICAgICAgICpncm91cGVkTWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgICAgICAgbWRjdFNjYWxlLAotICAgICAgICAgICAgICAgICAgICBTRkJfVEhSRVNIT0xEICAgICAgICAgICAqZ3JvdXBlZFNmYlRocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgU0ZCX0VORVJHWSAgICAgICAgICAgICAgKmdyb3VwZWRTZmJFbmVyZ3ksCi0gICAgICAgICAgICAgICAgICAgIFNGQl9FTkVSR1kgICAgICAgICAgICAgICpncm91cGVkU2ZiU3ByZWFkZWRFbmVyZ3ksCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFNGQl9FTkVSR1lfU1VNICAgICBzZmJFbmVyZ3lTdW1MUiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgU0ZCX0VORVJHWV9TVU0gICAgIHNmYkVuZXJneVN1bU1TLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgICAgICAgd2luZG93U2VxdWVuY2UsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgICB3aW5kb3dTaGFwZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAgIGdyb3VwZWRTZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgICpncm91cGVkU2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgICpncm91cGVkU2ZiTWluU25yLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgICAgICAgbm9PZkdyb3VwcywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAgKmdyb3VwTGVuLAotICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgICAgICAgICAqcHN5T3V0Q2gpCi17Ci0gIFdvcmQzMiBqOwotICBXb3JkMzIgZ3JwOwotICBXb3JkMzIgbWFzazsKLSAgV29yZDE2ICp0bXBWOwotCi0gIC8qCi0gIGNvcHkgdmFsdWVzIHRvIHBzeU91dAotICAqLwotICBwc3lPdXRDaC0+bWF4U2ZiUGVyR3JvdXAgICAgPSBtYXhTZmJQZXJHcm91cDsKLSAgcHN5T3V0Q2gtPnNmYkNudCAgICAgICAgICAgID0gZ3JvdXBlZFNmYkNudDsKLSAgaWYobm9PZkdyb3VwcykKLQlwc3lPdXRDaC0+c2ZiUGVyR3JvdXAgICAgID0gZ3JvdXBlZFNmYkNudC8gbm9PZkdyb3VwczsKLSAgZWxzZQotCXBzeU91dENoLT5zZmJQZXJHcm91cCAgICAgPSAweDdmZmY7Ci0gIHBzeU91dENoLT53aW5kb3dTZXF1ZW5jZSAgICA9IHdpbmRvd1NlcXVlbmNlOwotICBwc3lPdXRDaC0+d2luZG93U2hhcGUgICAgICAgPSB3aW5kb3dTaGFwZTsKLSAgcHN5T3V0Q2gtPm1kY3RTY2FsZSAgICAgICAgID0gbWRjdFNjYWxlOwotICBwc3lPdXRDaC0+bWRjdFNwZWN0cnVtICAgICAgPSBncm91cGVkTWRjdFNwZWN0cnVtOwotICBwc3lPdXRDaC0+c2ZiRW5lcmd5ICAgICAgICAgPSBncm91cGVkU2ZiRW5lcmd5LT5zZmJMb25nOwotICBwc3lPdXRDaC0+c2ZiVGhyZXNob2xkICAgICAgPSBncm91cGVkU2ZiVGhyZXNob2xkLT5zZmJMb25nOwotICBwc3lPdXRDaC0+c2ZiU3ByZWFkZWRFbmVyZ3kgPSBncm91cGVkU2ZiU3ByZWFkZWRFbmVyZ3ktPnNmYkxvbmc7Ci0KLSAgdG1wViA9IHBzeU91dENoLT5zZmJPZmZzZXRzOwotICBmb3Ioaj0wOyBqPGdyb3VwZWRTZmJDbnQgKyAxOyBqKyspIHsKLSAgICAgICp0bXBWKysgPSBncm91cGVkU2ZiT2Zmc2V0W2pdOwotICB9Ci0KLSAgdG1wViA9IHBzeU91dENoLT5zZmJNaW5TbnI7Ci0gIGZvcihqPTA7ajxncm91cGVkU2ZiQ250OyBqKyspIHsKLQkgICp0bXBWKysgPSAgIGdyb3VwZWRTZmJNaW5TbnJbal07Ci0gIH0KLQotICAvKiBnZW5lcmF0ZSBncm91cGluZyBtYXNrICovCi0gIG1hc2sgPSAwOwotICBmb3IgKGdycCA9IDA7IGdycCA8IG5vT2ZHcm91cHM7IGdycCsrKSB7Ci0gICAgbWFzayA9IG1hc2sgPDwgMTsKLSAgICBmb3IgKGo9MTsgajxncm91cExlbltncnBdOyBqKyspIHsKLSAgICAgIG1hc2sgPSBtYXNrIDw8IDE7Ci0gICAgICBtYXNrIHw9IDE7Ci0gICAgfQotICB9Ci0gIHBzeU91dENoLT5ncm91cGluZ01hc2sgPSBtYXNrOwotCi0gIGlmICh3aW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpIHsKLSAgICBwc3lPdXRDaC0+c2ZiRW5TdW1MUiA9ICBzZmJFbmVyZ3lTdW1MUi5zZmJMb25nOwotICAgIHBzeU91dENoLT5zZmJFblN1bU1TID0gIHNmYkVuZXJneVN1bU1TLnNmYkxvbmc7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgV29yZDMyIGk7Ci0gICAgV29yZDMyIGFjY3VTdW1NUz0wOwotICAgIFdvcmQzMiBhY2N1U3VtTFI9MDsKLSAgICBjb25zdCBXb3JkMzIgKnBTdW1NUyA9IHNmYkVuZXJneVN1bU1TLnNmYlNob3J0OwotICAgIGNvbnN0IFdvcmQzMiAqcFN1bUxSID0gc2ZiRW5lcmd5U3VtTFIuc2ZiU2hvcnQ7Ci0KLSAgICBmb3IgKGk9VFJBTlNfRkFDOyBpOyBpLS0pIHsKLSAgICAgIGFjY3VTdW1MUiA9IExfYWRkKGFjY3VTdW1MUiwgKnBTdW1MUik7IHBTdW1MUisrOwotICAgICAgYWNjdVN1bU1TID0gTF9hZGQoYWNjdVN1bU1TLCAqcFN1bU1TKTsgcFN1bU1TKys7Ci0gICAgfQotICAgIHBzeU91dENoLT5zZmJFblN1bU1TID0gYWNjdVN1bU1TOwotICAgIHBzeU91dENoLT5zZmJFblN1bUxSID0gYWNjdVN1bUxSOwotICB9Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9saW5lX3BlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9saW5lX3BlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MGRjMjguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvbGluZV9wZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJbGluZV9wZS5jCi0KLQlDb250ZW50OglQZXJjZXB0dWFsIGVudHJvcGllIG1vZHVsZSBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJhc2ljX29wLmgiCi0jaW5jbHVkZSAib3Blcl8zMmIuaCIKLSNpbmNsdWRlICJ0eXBlZGVmLmgiCi0jaW5jbHVkZSAibGluZV9wZS5oIgotCi0KLXN0YXRpYyBjb25zdCBXb3JkMTYgIEMxX0kgPSAxMjsgICAgLyogbG9nKDguMCkvbG9nKDIpICo0ICAgICAgICAgKi8KLXN0YXRpYyBjb25zdCBXb3JkMzIgIEMyX0kgPSAxMDgzMDsgLyogbG9nKDIuNSkvbG9nKDIpICogMTAyNCAqIDQgKiAyICovCi1zdGF0aWMgY29uc3QgV29yZDE2ICBDM19JID0gNTczOyAgIC8qICgxLUMyL0MxKSAqMTAyNCAgICAgICAgICAgICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IHByZXBhcmVTZmJQZQotKiBkZXNjcmlwdGlvbjogIGNvbnN0YW50cyB0aGF0IGRvIG5vdCBjaGFuZ2UgZHVyaW5nIHN1Y2Nlc3NpdmUgcGUgY2FsY3VsYXRpb25zCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBwcmVwYXJlU2ZiUGUoUEVfREFUQSAqcGVEYXRhLAotICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICAgICBXb3JkMTYgbG9nU2ZiRW5lcmd5W01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgIFdvcmQxNiBzZmJOUmVsZXZhbnRMaW5lc1tNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbkNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IHBlT2Zmc2V0KQotewotICBXb3JkMzIgc2ZiR3JwLCBzZmI7Ci0gIFdvcmQzMiBjaDsKLQotICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuID0gJnBzeU91dENoYW5uZWxbY2hdOwotICAgIFBFX0NIQU5ORUxfREFUQSAqcGVDaGFuRGF0YT0mcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXTsKLSAgICBmb3Ioc2ZiR3JwPTA7c2ZiR3JwPHBzeU91dENoYW4tPnNmYkNudDsgc2ZiR3JwKz1wc3lPdXRDaGFuLT5zZmJQZXJHcm91cCl7Ci0gICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0JICAgIHBlQ2hhbkRhdGEtPnNmYk5MaW5lczRbc2ZiR3JwK3NmYl0gPSBzZmJOUmVsZXZhbnRMaW5lc1tjaF1bc2ZiR3JwK3NmYl07Ci0gICAgICAgIHNmYk5SZWxldmFudExpbmVzW2NoXVtzZmJHcnArc2ZiXSA9IHNmYk5SZWxldmFudExpbmVzW2NoXVtzZmJHcnArc2ZiXSA+PiAyOwotCSAgICBwZUNoYW5EYXRhLT5zZmJMZEVuZXJneVtzZmJHcnArc2ZiXSA9IGxvZ1NmYkVuZXJneVtjaF1bc2ZiR3JwK3NmYl07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHBlRGF0YS0+b2Zmc2V0ID0gcGVPZmZzZXQ7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGNhbGNTZmJQZQotKiBkZXNjcmlwdGlvbjogIGNvbnN0UGFydCBpcyBzZmJQZSB3aXRob3V0IHRoZSB0aHJlc2hvbGQgcGFydCBuKmxkKHRocikgb3IgbipDMypsZCh0aHIpCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBjYWxjU2ZiUGUoUEVfREFUQSAqcGVEYXRhLAotICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBuQ2hhbm5lbHMpCi17Ci0gIFdvcmQzMiBjaDsKLSAgV29yZDMyIHNmYkdycCwgc2ZiOwotICBXb3JkMzIgbkxpbmVzNDsKLSAgV29yZDMyIGxkVGhyLCBsZFJhdGlvOwotICBXb3JkMzIgcGUsIGNvbnN0UGFydCwgbkFjdGl2ZUxpbmVzOwotCi0gIHBlRGF0YS0+cGUgPSBwZURhdGEtPm9mZnNldDsKLSAgcGVEYXRhLT5jb25zdFBhcnQgPSAwOwotICBwZURhdGEtPm5BY3RpdmVMaW5lcyA9IDA7Ci0gIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKLSAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4gPSAmcHN5T3V0Q2hhbm5lbFtjaF07Ci0gICAgUEVfQ0hBTk5FTF9EQVRBICpwZUNoYW5EYXRhID0gJnBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF07Ci0gICAgY29uc3QgV29yZDMyICpzZmJFbmVyZ3kgPSBwc3lPdXRDaGFuLT5zZmJFbmVyZ3k7Ci0gICAgY29uc3QgV29yZDMyICpzZmJUaHJlc2hvbGQgPSBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGQ7Ci0KLSAgICBwZSA9IDA7Ci0gICAgY29uc3RQYXJ0ID0gMDsKLSAgICBuQWN0aXZlTGluZXMgPSAwOwotCi0gICAgZm9yKHNmYkdycD0wOyBzZmJHcnA8cHN5T3V0Q2hhbi0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW4tPnNmYlBlckdyb3VwKSB7Ci0gICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0gICAgICAgIFdvcmQzMiBucmcgPSBzZmJFbmVyZ3lbc2ZiR3JwK3NmYl07Ci0gICAgICAgIFdvcmQzMiB0aHJlcyA9IHNmYlRocmVzaG9sZFtzZmJHcnArc2ZiXTsKLSAgICAgICAgV29yZDMyIHNmYkxERW4gPSBwZUNoYW5EYXRhLT5zZmJMZEVuZXJneVtzZmJHcnArc2ZiXTsKLQotICAgICAgICBpZiAobnJnID4gdGhyZXMpIHsKLSAgICAgICAgICBsZFRociA9IGlMb2c0KHRocmVzKTsKLQotICAgICAgICAgIGxkUmF0aW8gPSBzZmJMREVuIC0gbGRUaHI7Ci0KLSAgICAgICAgICBuTGluZXM0ID0gcGVDaGFuRGF0YS0+c2ZiTkxpbmVzNFtzZmJHcnArc2ZiXTsKLQotICAgICAgICAgIC8qIHNmYlBlID0gbmwqbG9nMihlbi90aHIpKi8KLQkJICBpZiAobGRSYXRpbyA+PSBDMV9JKSB7Ci0gICAgICAgICAgICBwZUNoYW5EYXRhLT5zZmJQZVtzZmJHcnArc2ZiXSA9IChuTGluZXM0KmxkUmF0aW8gKyA4KSA+PiA0OwotICAgICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiQ29uc3RQYXJ0W3NmYkdycCtzZmJdID0gKChuTGluZXM0KnNmYkxERW4pKSA+PiA0OwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLQkJICAvKiBzZmJQZSA9IG5sKihjMiArIGMzKmxvZzIoZW4vdGhyKSkqLwotICAgICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiUGVbc2ZiR3JwK3NmYl0gPSBleHRyYWN0X2woKExfbXB5X3d4KAotICAgICAgICAgICAgICAgICAgICAoQzJfSSArIEMzX0kgKiBsZFJhdGlvICogMikgPDwgNCwgbkxpbmVzNCkgKyA0KSA+PiAzKTsKLSAgICAgICAgICAgIHBlQ2hhbkRhdGEtPnNmYkNvbnN0UGFydFtzZmJHcnArc2ZiXSA9IGV4dHJhY3RfbCgoIExfbXB5X3d4KAotICAgICAgICAgICAgICAgICAgICAoQzJfSSArIEMzX0kgKiBzZmJMREVuICogMikgPDwgNCwgbkxpbmVzNCkgKyA0KSA+PiAzKTsKLSAgICAgICAgICAgIG5MaW5lczQgPSAobkxpbmVzNCAqIEMzX0kgKyAoMTAyNDw8MSkpID4+IDEwOwotICAgICAgICAgIH0KLSAgICAgICAgICBwZUNoYW5EYXRhLT5zZmJOQWN0aXZlTGluZXNbc2ZiR3JwK3NmYl0gPSBuTGluZXM0ID4+IDI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiUGVbc2ZiR3JwK3NmYl0gPSAwOwotICAgICAgICAgIHBlQ2hhbkRhdGEtPnNmYkNvbnN0UGFydFtzZmJHcnArc2ZiXSA9IDA7Ci0gICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCtzZmJdID0gMDsKLSAgICAgICAgfQotICAgICAgICBwZSA9IHBlICsgcGVDaGFuRGF0YS0+c2ZiUGVbc2ZiR3JwK3NmYl07Ci0gICAgICAgIGNvbnN0UGFydCA9IGNvbnN0UGFydCArIHBlQ2hhbkRhdGEtPnNmYkNvbnN0UGFydFtzZmJHcnArc2ZiXTsKLSAgICAgICAgbkFjdGl2ZUxpbmVzID0gbkFjdGl2ZUxpbmVzICsgcGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCtzZmJdOwotICAgICAgfQotICAgIH0KLQotCXBlQ2hhbkRhdGEtPnBlID0gc2F0dXJhdGUocGUpOwotICAgIHBlQ2hhbkRhdGEtPmNvbnN0UGFydCA9IHNhdHVyYXRlKGNvbnN0UGFydCk7Ci0gICAgcGVDaGFuRGF0YS0+bkFjdGl2ZUxpbmVzID0gc2F0dXJhdGUobkFjdGl2ZUxpbmVzKTsKLQotCi0JcGUgKz0gcGVEYXRhLT5wZTsKLQlwZURhdGEtPnBlID0gc2F0dXJhdGUocGUpOwotICAgIGNvbnN0UGFydCArPSBwZURhdGEtPmNvbnN0UGFydDsKLQlwZURhdGEtPmNvbnN0UGFydCA9IHNhdHVyYXRlKGNvbnN0UGFydCk7Ci0gICAgbkFjdGl2ZUxpbmVzICs9IHBlRGF0YS0+bkFjdGl2ZUxpbmVzOwotCXBlRGF0YS0+bkFjdGl2ZUxpbmVzID0gc2F0dXJhdGUobkFjdGl2ZUxpbmVzKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvbWVtYWxpZ24uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL21lbWFsaWduLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMjY2ZGMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvbWVtYWxpZ24uYworKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJbWVtX2FsaWduLmMKLQotCUNvbnRlbnQ6CU1lbW9yeSBhbGxvYyBhbGlnbm1lbnRzIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlCSJtZW1hbGlnbi5oIgotI2lmZGVmIF9NU0NfVkVSCi0jaW5jbHVkZQk8c3RkZGVmLmg+Ci0jZWxzZQotI2luY2x1ZGUJPHN0ZGludC5oPgotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBtZW1fbWFsbG9jCi0qIGRlc2NyaXB0aW9uOiAgbWFsbG9jIHRoZSBhbGlnbm1lbnRzIG1lbW9yeQotKiByZXR1cm5zOiAgICAgIHRoZSBwb2ludCBvZiB0aGUgbWVtb3J5Ci0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAqCi1tZW1fbWFsbG9jKFZPX01FTV9PUEVSQVRPUiAqcE1lbW9wLCB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgY2hhciBhbGlnbm1lbnQsIHVuc2lnbmVkIGludCBDb2RlY0lEKQotewotCWludCByZXQ7Ci0JdW5zaWduZWQgY2hhciAqbWVtX3B0cjsKLQlWT19NRU1fSU5GTyBNZW1JbmZvOwotCi0JaWYgKCFhbGlnbm1lbnQpIHsKLQotCQlNZW1JbmZvLkZsYWcgPSAwOwotCQlNZW1JbmZvLlNpemUgPSBzaXplICsgMTsKLQkJcmV0ID0gcE1lbW9wLT5BbGxvYyhDb2RlY0lELCAmTWVtSW5mbyk7Ci0JCWlmKHJldCAhPSAwKQotCQkJcmV0dXJuIDA7Ci0JCW1lbV9wdHIgPSAodW5zaWduZWQgY2hhciAqKU1lbUluZm8uVkJ1ZmZlcjsKLQotCQlwTWVtb3AtPlNldChDb2RlY0lELCBtZW1fcHRyLCAwLCBzaXplICsgMSk7Ci0KLQkJKm1lbV9wdHIgPSAodW5zaWduZWQgY2hhcikxOwotCi0JCXJldHVybiAoKHZvaWQgKikobWVtX3B0cisxKSk7Ci0JfSBlbHNlIHsKLQkJdW5zaWduZWQgY2hhciAqdG1wOwotCi0JCU1lbUluZm8uRmxhZyA9IDA7Ci0JCU1lbUluZm8uU2l6ZSA9IHNpemUgKyBhbGlnbm1lbnQ7Ci0JCXJldCA9IHBNZW1vcC0+QWxsb2MoQ29kZWNJRCwgJk1lbUluZm8pOwotCQlpZihyZXQgIT0gMCkKLQkJCXJldHVybiAwOwotCi0JCXRtcCA9ICh1bnNpZ25lZCBjaGFyICopTWVtSW5mby5WQnVmZmVyOwotCi0JCXBNZW1vcC0+U2V0KENvZGVjSUQsIHRtcCwgMCwgc2l6ZSArIGFsaWdubWVudCk7Ci0KLQkJbWVtX3B0ciA9Ci0JCQkodW5zaWduZWQgY2hhciAqKSAoKGludHB0cl90KSAodG1wICsgYWxpZ25tZW50IC0gMSkgJgotCQkJCQkofigoaW50cHRyX3QpIChhbGlnbm1lbnQgLSAxKSkpKTsKLQotCQlpZiAobWVtX3B0ciA9PSB0bXApCi0JCQltZW1fcHRyICs9IGFsaWdubWVudDsKLQotCQkqKG1lbV9wdHIgLSAxKSA9ICh1bnNpZ25lZCBjaGFyKSAobWVtX3B0ciAtIHRtcCk7Ci0KLQkJcmV0dXJuICgodm9pZCAqKW1lbV9wdHIpOwotCX0KLQotCXJldHVybigwKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogbWVtX2ZyZWUKLSogZGVzY3JpcHRpb246ICBmcmVlIHRoZSBtZW1vcnkKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1tZW1fZnJlZShWT19NRU1fT1BFUkFUT1IgKnBNZW1vcCwgdm9pZCAqbWVtX3B0ciwgdW5zaWduZWQgaW50IENvZGVjSUQpCi17Ci0KLQl1bnNpZ25lZCBjaGFyICpwdHI7Ci0KLQlpZiAobWVtX3B0ciA9PSAwKQotCQlyZXR1cm47Ci0KLQlwdHIgPSBtZW1fcHRyOwotCi0JcHRyIC09ICoocHRyIC0gMSk7Ci0KLQlwTWVtb3AtPkZyZWUoQ29kZWNJRCwgcHRyKTsKLX0KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL21zX3N0ZXJlby5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvbXNfc3RlcmVvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMDI4ZGMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvbXNfc3RlcmVvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQltc19zdGVyZW8uYwotCi0JQ29udGVudDoJTVMgc3RlcmVvIHByb2Nlc3NpbmcgZnVuY3Rpb24KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJhc2ljX29wLmgiCi0jaW5jbHVkZSAib3Blcl8zMmIuaCIKLSNpbmNsdWRlICJwc3lfY29uc3QuaCIKLSNpbmNsdWRlICJtc19zdGVyZW8uaCIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogTXNTdGVyZW9Qcm9jZXNzaW5nCi0qIGRlc2NyaXB0aW9uOiAgZGV0ZWN0IHVzZSBtcyBzdGVyZW8gb3Igbm90Ci0qCQkJCWlmICgobWluKHRockxuLCB0aHJSbikqbWluKHRockxuLCB0aHJSbikpLyhlbk1uKmVuU24pKQotKgkJCQk+PSAoKHRockxuICp0aHJSbikvKGVuTG4qZW5SbikpIHRoZW4gbXMgc3RlcmVvCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBNc1N0ZXJlb1Byb2Nlc3NpbmcoV29yZDMyICAgICAgICpzZmJFbmVyZ3lMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpzZmJFbmVyZ3lSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiAqc2ZiRW5lcmd5TWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyICpzZmJFbmVyZ3lTaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICptZGN0U3BlY3RydW1MZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICptZGN0U3BlY3RydW1SaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqc2ZiVGhyZXNob2xkTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqc2ZiVGhyZXNob2xkUmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKnNmYlNwcmVhZGVkRW5MZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpzZmJTcHJlYWRlZEVuUmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgKm1zRGlnZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICptc01hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIHNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgc2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIG1heFNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICpzZmJPZmZzZXQpIHsKLSAgV29yZDMyIHNmYixzZmJvZmZzLCBqOwotICBXb3JkMzIgbXNNYXNrVHJ1ZVNvbWV3aGVyZSA9IDA7Ci0gIFdvcmQzMiBtc01hc2tGYWxzZVNvbWV3aGVyZSA9IDA7Ci0KLSAgZm9yIChzZmI9MDsgc2ZiPHNmYkNudDsgc2ZiKz1zZmJQZXJHcm91cCkgewotICAgIGZvciAoc2Zib2Zmcz0wO3NmYm9mZnM8bWF4U2ZiUGVyR3JvdXA7c2Zib2ZmcysrKSB7Ci0KLSAgICAgIFdvcmQzMiB0ZW1wOwotICAgICAgV29yZDMyIHBubHIscG5tczsKLSAgICAgIFdvcmQzMiBtaW5UaHJlc2hvbGQ7Ci0gICAgICBXb3JkMzIgdGhyTCwgdGhyUiwgbnJnTCwgbnJnUjsKLSAgICAgIFdvcmQzMiBpZHgsIHNoaWZ0OwotCi0gICAgICBpZHggPSBzZmIgKyBzZmJvZmZzOwotCi0gICAgICB0aHJMID0gc2ZiVGhyZXNob2xkTGVmdFtpZHhdOwotICAgICAgdGhyUiA9IHNmYlRocmVzaG9sZFJpZ2h0W2lkeF07Ci0gICAgICBucmdMID0gc2ZiRW5lcmd5TGVmdFtpZHhdOwotICAgICAgbnJnUiA9IHNmYkVuZXJneVJpZ2h0W2lkeF07Ci0KLSAgICAgIG1pblRocmVzaG9sZCA9IG1pbih0aHJMLCB0aHJSKTsKLQotICAgICAgbnJnTCA9IG1heChucmdMLHRockwpICsgMTsKLSAgICAgIHNoaWZ0ID0gbm9ybV9sKG5yZ0wpOwotCSAgbnJnTCA9IERpdl8zMih0aHJMIDw8IHNoaWZ0LCBucmdMIDw8IHNoaWZ0KTsKLSAgICAgIG5yZ1IgPSBtYXgobnJnUix0aHJSKSArIDE7Ci0gICAgICBzaGlmdCA9IG5vcm1fbChucmdSKTsKLQkgIG5yZ1IgPSBEaXZfMzIodGhyUiA8PCBzaGlmdCwgbnJnUiA8PCBzaGlmdCk7Ci0KLQkgIHBubHIgPSBmaXhtdWwobnJnTCwgbnJnUik7Ci0KLSAgICAgIG5yZ0wgPSBzZmJFbmVyZ3lNaWRbaWR4XTsKLSAgICAgIG5yZ1IgPSBzZmJFbmVyZ3lTaWRlW2lkeF07Ci0KLSAgICAgIG5yZ0wgPSBtYXgobnJnTCxtaW5UaHJlc2hvbGQpICsgMTsKLSAgICAgIHNoaWZ0ID0gbm9ybV9sKG5yZ0wpOwotCSAgbnJnTCA9IERpdl8zMihtaW5UaHJlc2hvbGQgPDwgc2hpZnQsIG5yZ0wgPDwgc2hpZnQpOwotCi0gICAgICBucmdSID0gbWF4KG5yZ1IsbWluVGhyZXNob2xkKSArIDE7Ci0gICAgICBzaGlmdCA9IG5vcm1fbChucmdSKTsKLQkgIG5yZ1IgPSBEaXZfMzIobWluVGhyZXNob2xkIDw8IHNoaWZ0LCBucmdSIDw8IHNoaWZ0KTsKLQotICAgICAgcG5tcyA9IGZpeG11bChucmdMLCBucmdSKTsKLQotICAgICAgdGVtcCA9IHBubXMgLSBwbmxyOwotICAgICAgaWYoIHRlbXAgPiAwICl7Ci0KLSAgICAgICAgbXNNYXNrW2lkeF0gPSAxOwotICAgICAgICBtc01hc2tUcnVlU29tZXdoZXJlID0gMTsKLQotICAgICAgICBmb3IgKGo9c2ZiT2Zmc2V0W2lkeF07IGo8c2ZiT2Zmc2V0W2lkeCsxXTsgaisrKSB7Ci0gICAgICAgICAgV29yZDMyIGxlZnQsIHJpZ2h0OwotICAgICAgICAgIGxlZnQgID0gKG1kY3RTcGVjdHJ1bUxlZnRbal0gPj4gIDEpOwotICAgICAgICAgIHJpZ2h0ID0gKG1kY3RTcGVjdHJ1bVJpZ2h0W2pdID4+IDEpOwotICAgICAgICAgIG1kY3RTcGVjdHJ1bUxlZnRbal0gPSAgbGVmdCArIHJpZ2h0OwotICAgICAgICAgIG1kY3RTcGVjdHJ1bVJpZ2h0W2pdID0gIGxlZnQgLSByaWdodDsKLSAgICAgICAgfQotCi0gICAgICAgIHNmYlRocmVzaG9sZExlZnRbaWR4XSA9IG1pblRocmVzaG9sZDsKLSAgICAgICAgc2ZiVGhyZXNob2xkUmlnaHRbaWR4XSA9IG1pblRocmVzaG9sZDsKLSAgICAgICAgc2ZiRW5lcmd5TGVmdFtpZHhdID0gc2ZiRW5lcmd5TWlkW2lkeF07Ci0gICAgICAgIHNmYkVuZXJneVJpZ2h0W2lkeF0gPSBzZmJFbmVyZ3lTaWRlW2lkeF07Ci0KLSAgICAgICAgc2ZiU3ByZWFkZWRFblJpZ2h0W2lkeF0gPSBtaW4oc2ZiU3ByZWFkZWRFbkxlZnRbaWR4XSxzZmJTcHJlYWRlZEVuUmlnaHRbaWR4XSkgPj4gMTsKLSAgICAgICAgc2ZiU3ByZWFkZWRFbkxlZnRbaWR4XSA9IHNmYlNwcmVhZGVkRW5SaWdodFtpZHhdOwotCi0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgbXNNYXNrW2lkeF0gID0gMDsKLSAgICAgICAgbXNNYXNrRmFsc2VTb21ld2hlcmUgPSAxOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoIG1zTWFza1RydWVTb21ld2hlcmUgKSB7Ci0gICAgICBpZihtc01hc2tGYWxzZVNvbWV3aGVyZSApIHsKLSAgICAgICAgKm1zRGlnZXN0ID0gU0lfTVNfTUFTS19TT01FOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgKm1zRGlnZXN0ID0gU0lfTVNfTUFTS19BTEw7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICptc0RpZ2VzdCA9IFNJX01TX01BU0tfTk9ORTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcHJlX2VjaG9fY29udHJvbC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcHJlX2VjaG9fY29udHJvbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDA2ZTExLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3ByZV9lY2hvX2NvbnRyb2wuYworKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCXByZV9lY2hvX2NvbnRyb2wuYwotCi0JQ29udGVudDoJUHJlIGVjaG8gY29udHJvbCBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJhc2ljX29wLmgiCi0jaW5jbHVkZSAib3Blcl8zMmIuaCIKLQotI2luY2x1ZGUgIm9wZXJfMzJiLmgiCi0jaW5jbHVkZSAicHJlX2VjaG9fY29udHJvbC5oIgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOkluaXRQcmVFY2hvQ29udHJvbAotKiBkZXNjcmlwdGlvbjogaW5pdCBwcmUgZWNobyBjb250cm9sIHBhcmFtZXRlcgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEluaXRQcmVFY2hvQ29udHJvbChXb3JkMzIgKnBiVGhyZXNob2xkTm0xLAotICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBudW1QYiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqcGJUaHJlc2hvbGRRdWlldCkKLXsKLSAgV29yZDE2IHBiOwotCi0gIGZvcihwYj0wOyBwYjxudW1QYjsgcGIrKykgewotICAgIHBiVGhyZXNob2xkTm0xW3BiXSA9IHBiVGhyZXNob2xkUXVpZXRbcGJdOwotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOlByZUVjaG9Db250cm9sCi0qIGRlc2NyaXB0aW9uOiB1cGRhdGUgc2hyZXNob2xkIHRvIGF2b2lkIHByZSBlY2hvCi0qCQkJICAgdGhyKG4pID0gbWF4KHJwbWluKnRocnEobiksIG1pbih0aHJxKG4pLCBycGVsZXYqdGhycTEobikpKQotKgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFByZUVjaG9Db250cm9sKFdvcmQzMiAqcGJUaHJlc2hvbGRObTEsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbnVtUGIsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgbWF4QWxsb3dlZEluY3JlYXNlRmFjdG9yLAotICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgV29yZDMyICpwYlRocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBtZGN0U2NhbGUsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbWRjdFNjYWxlbm0xKQotewotICBXb3JkMzIgaTsKLSAgV29yZDMyIHRtcFRocmVzaG9sZDEsIHRtcFRocmVzaG9sZDI7Ci0gIFdvcmQzMiBzY2FsaW5nOwotCi0gIC8qIG1heEFsbG93ZWRJbmNyZWFzZUZhY3RvciBpcyBoYXJkIGNvZGVkIHRvIDIgKi8KLSAgKHZvaWQpbWF4QWxsb3dlZEluY3JlYXNlRmFjdG9yOwotCi0gIHNjYWxpbmcgPSAoKG1kY3RTY2FsZSAtIG1kY3RTY2FsZW5tMSkgPDwgMSk7Ci0KLSAgaWYgKCBzY2FsaW5nID4gMCApIHsKLSAgICBmb3IoaSA9IDA7IGkgPCBudW1QYjsgaSsrKSB7Ci0gICAgICB0bXBUaHJlc2hvbGQxID0gcGJUaHJlc2hvbGRObTFbaV0gPj4gKHNjYWxpbmctMSk7Ci0gICAgICB0bXBUaHJlc2hvbGQyID0gTF9tcHlfbHMocGJUaHJlc2hvbGRbaV0sIG1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3Rvcik7Ci0KLSAgICAgIC8qIGNvcHkgdGhyZXNob2xkcyB0byBpbnRlcm5hbCBtZW1vcnkgKi8KLSAgICAgIHBiVGhyZXNob2xkTm0xW2ldID0gcGJUaHJlc2hvbGRbaV07Ci0KLQotICAgICAgaWYocGJUaHJlc2hvbGRbaV0gPiB0bXBUaHJlc2hvbGQxKSB7Ci0gICAgICAgIHBiVGhyZXNob2xkW2ldID0gdG1wVGhyZXNob2xkMTsKLSAgICAgIH0KLQotICAgICAgaWYodG1wVGhyZXNob2xkMiA+IHBiVGhyZXNob2xkW2ldKSB7Ci0gICAgICAgIHBiVGhyZXNob2xkW2ldID0gdG1wVGhyZXNob2xkMjsKLSAgICAgIH0KLQotICAgIH0KLSAgfQotICBlbHNlIHsKLSAgICBzY2FsaW5nID0gLXNjYWxpbmc7Ci0gICAgZm9yKGkgPSAwOyBpIDwgbnVtUGI7IGkrKykgewotCi0gICAgICB0bXBUaHJlc2hvbGQxID0gcGJUaHJlc2hvbGRObTFbaV0gPDwgMTsKLSAgICAgIHRtcFRocmVzaG9sZDIgPSBMX21weV9scyhwYlRocmVzaG9sZFtpXSwgbWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yKTsKLQotICAgICAgLyogY29weSB0aHJlc2hvbGRzIHRvIGludGVybmFsIG1lbW9yeSAqLwotICAgICAgcGJUaHJlc2hvbGRObTFbaV0gPSBwYlRocmVzaG9sZFtpXTsKLQotCi0gICAgICBpZigoKHBiVGhyZXNob2xkW2ldID4+IHNjYWxpbmcpID4gdG1wVGhyZXNob2xkMSkpIHsKLSAgICAgICAgcGJUaHJlc2hvbGRbaV0gPSB0bXBUaHJlc2hvbGQxIDw8IHNjYWxpbmc7Ci0gICAgICB9Ci0KLSAgICAgIGlmKHRtcFRocmVzaG9sZDIgPiBwYlRocmVzaG9sZFtpXSkgewotICAgICAgICBwYlRocmVzaG9sZFtpXSA9IHRtcFRocmVzaG9sZDI7Ci0gICAgICB9Ci0KLSAgICB9Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcHN5X2NvbmZpZ3VyYXRpb24uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3BzeV9jb25maWd1cmF0aW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNDBmOWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcHN5X2NvbmZpZ3VyYXRpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDUwNSArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCXBzeV9jb25maWd1cmF0aW9uLmMKLQotCUNvbnRlbnQ6CVBzeWNob2FjY291c3RpYyBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiYmFzaWNfb3AuaCIKLSNpbmNsdWRlICJvcGVyXzMyYi5oIgotI2luY2x1ZGUgInBzeV9jb25maWd1cmF0aW9uLmgiCi0jaW5jbHVkZSAiYWRqX3Roci5oIgotI2luY2x1ZGUgImFhY19yb20uaCIKLQotCi0KLSNkZWZpbmUgQkFSQ19TQ0FMRQkxMDAgLyogaW50ZWdlciBiYXJjIHZhbHVlcyBhcmUgc2NhbGVkIHdpdGggMTAwICovCi0jZGVmaW5lIExPRzJfMTAwMAkzMDEgLyogbG9nMioxMDAwICovCi0jZGVmaW5lIFBJMl8xMDAwCTE1NzEgLyogcGkvMioxMDAwKi8KLSNkZWZpbmUgQVRBTl9DT0VGMQkzNTYwIC8qIDEwMDAvMC4yODA4NzJmKi8KLSNkZWZpbmUgQVRBTl9DT0VGMgkyODEgLyogMTAwMCowLjI4MDg3MmYqLwotCi0KLXR5cGVkZWYgc3RydWN0ewotICBXb3JkMzIgc2FtcGxlUmF0ZTsKLSAgY29uc3QgVVdvcmQ4ICpwYXJhbUxvbmc7Ci0gIGNvbnN0IFVXb3JkOCAqcGFyYW1TaG9ydDsKLX1TRkJfSU5GT19UQUI7Ci0KLXN0YXRpYyBjb25zdCBXb3JkMTYgQUJTX0xFViA9IDIwOwotc3RhdGljIGNvbnN0IFdvcmQxNiBCQVJDX1RIUl9RVUlFVFtdID0gezE1LCAxMCwgIDcsICAyLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLCAgNSwgMTAsIDIwLCAzMH07Ci0KLQotCi1zdGF0aWMgY29uc3QgV29yZDE2IG1heF9iYXJrID0gMjQ7IC8qIG1heGltdW0gYmFyay12YWx1ZSAqLwotc3RhdGljIGNvbnN0IFdvcmQxNiBtYXNrTG93ICA9IDMwOyAvKiBpbiAxZEIvYmFyayAqLwotc3RhdGljIGNvbnN0IFdvcmQxNiBtYXNrSGlnaCA9IDE1OyAvKiBpbiAxKmRCL2JhcmsgKi8KLXN0YXRpYyBjb25zdCBXb3JkMTYgY19yYXRpbyAgPSAweDAwMjk7IC8qIHBvdygxMC4wZiwgLSgyOS4wZi8xMC4wZikpICovCi0KLXN0YXRpYyBjb25zdCBXb3JkMTYgbWFza0xvd1NwckVuTG9uZyA9IDMwOyAgICAgICAvKiBpbiAxZEIvYmFyayAqLwotc3RhdGljIGNvbnN0IFdvcmQxNiBtYXNrSGlnaFNwckVuTG9uZyA9IDIwOyAgICAgIC8qIGluIDFkQi9iYXJrICovCi1zdGF0aWMgY29uc3QgV29yZDE2IG1hc2tIaWdoU3ByRW5Mb25nTG93QnIgPSAxNTsgLyogaW4gMWRCL2JhcmsgKi8KLXN0YXRpYyBjb25zdCBXb3JkMTYgbWFza0xvd1NwckVuU2hvcnQgPSAyMDsgICAgICAvKiBpbiAxZEIvYmFyayAqLwotc3RhdGljIGNvbnN0IFdvcmQxNiBtYXNrSGlnaFNwckVuU2hvcnQgPSAxNTsgICAgIC8qIGluIDFkQi9iYXJrICovCi1zdGF0aWMgY29uc3QgV29yZDE2IGNfbWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yID0gMHgwMTQ4OyAgICAvKiAwLjAxICooMSA8PCAxNSkqLwotc3RhdGljIGNvbnN0IFdvcmQzMiBjX21heHNuciA9IDB4NjY2NjY2NjY7CQkgLyogdXBwZXIgbGltaXQgaXMgLTEgZEIgKi8KLXN0YXRpYyBjb25zdCBXb3JkMzIgY19taW5zbnIgPSAweDAwNjI0ZGQzOwkJIC8qIGxvd2VyIGxpbWl0IGlzIC0yNSBkQiAqLwotCi1zdGF0aWMgY29uc3QgV29yZDMyIGNfbWF4Q2xpcEVuZXJneUxvbmcgPSAweDc3MzU5NDAwOyAgLyogMi4wZTlmKi8KLXN0YXRpYyBjb25zdCBXb3JkMzIgY19tYXhDbGlwRW5lcmd5U2hvcnQgPSAweDAxZGNkNjUwOyAvKiAyLjBlOWYvKEFBQ0VOQ19UUkFOU19GQUMqQUFDRU5DX1RSQU5TX0ZBQykqLwotCi0KLVdvcmQzMiBHZXRTUkluZGV4KFdvcmQzMiBzYW1wbGVSYXRlKQotewotICAgIGlmICg5MjAxNyA8PSBzYW1wbGVSYXRlKSByZXR1cm4gMDsKLSAgICBpZiAoNzUxMzIgPD0gc2FtcGxlUmF0ZSkgcmV0dXJuIDE7Ci0gICAgaWYgKDU1NDI2IDw9IHNhbXBsZVJhdGUpIHJldHVybiAyOwotICAgIGlmICg0NjAwOSA8PSBzYW1wbGVSYXRlKSByZXR1cm4gMzsKLSAgICBpZiAoMzc1NjYgPD0gc2FtcGxlUmF0ZSkgcmV0dXJuIDQ7Ci0gICAgaWYgKDI3NzEzIDw9IHNhbXBsZVJhdGUpIHJldHVybiA1OwotICAgIGlmICgyMzAwNCA8PSBzYW1wbGVSYXRlKSByZXR1cm4gNjsKLSAgICBpZiAoMTg3ODMgPD0gc2FtcGxlUmF0ZSkgcmV0dXJuIDc7Ci0gICAgaWYgKDEzODU2IDw9IHNhbXBsZVJhdGUpIHJldHVybiA4OwotICAgIGlmICgxMTUwMiA8PSBzYW1wbGVSYXRlKSByZXR1cm4gOTsKLSAgICBpZiAoOTM5MSA8PSBzYW1wbGVSYXRlKSByZXR1cm4gMTA7Ci0KLSAgICByZXR1cm4gMTE7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBhdGFuXzEwMDAKLSogZGVzY3JpcHRpb246ICBjYWxjdWxhdGVzIDEwMDAqYXRhbih4LzEwMDApCi0qICAgICAgICAgICAgICAgYmFzZWQgb24gYXRhbiBhcHByb3ggZm9yIHggPiAwCi0qCQkJCWF0YW4oeCkgPSB4LygoZmxvYXQpMS4wZisoZmxvYXQpMC4yODA4NzJmKngqeCkgIGlmIHggPCAxCi0qCQkJCQkJPSBwaS8yIC0geC8oKGZsb2F0KTAuMjgwODcyZiAreCp4KQkgICAgaWYgeCA+PSAxCi0qIHJldHVybjogICAgICAgMTAwMCphdGFuKHgvMTAwMCkKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDE2IGF0YW5fMTAwMChXb3JkMzIgdmFsKQotewotICBXb3JkMzIgeTsKLQotCi0gIGlmKExfc3ViKHZhbCwgMTAwMCkgPCAwKSB7Ci0gICAgeSA9IGV4dHJhY3RfbCgoKDEwMDAgKiB2YWwpIC8gKDEwMDAgKyAoKHZhbCAqIHZhbCkgLyBBVEFOX0NPRUYxKSkpKTsKLSAgfQotICBlbHNlIHsKLSAgICB5ID0gUEkyXzEwMDAgLSAoKDEwMDAgKiB2YWwpIC8gKEFUQU5fQ09FRjIgKyAoKHZhbCAqIHZhbCkgLyAxMDAwKSkpOwotICB9Ci0KLSAgcmV0dXJuIGV4dHJhY3RfbCh5KTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogQmFyY0xpbmVWYWx1ZQotKiBkZXNjcmlwdGlvbjogIENhbGN1bGF0ZXMgYmFyYyB2YWx1ZSBmb3Igb25lIGZyZXF1ZW5jeSBsaW5lCi0qIHJldHVybnM6ICAgICAgYmFyYyB2YWx1ZSBvZiBsaW5lICogQkFSQ19TQ0FMRQotKiBpbnB1dDogICAgICAgIG51bWJlciBvZiBsaW5lcyBpbiB0cmFuc2Zvcm0sIGluZGV4IG9mIGxpbmUgdG8gY2hlY2ssIEZzCi0qIG91dHB1dDoKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQxNiBCYXJjTGluZVZhbHVlKFdvcmQxNiBub09mTGluZXMsIFdvcmQxNiBmZnRMaW5lLCBXb3JkMzIgc2FtcGxpbmdGcmVxKQotewotICBXb3JkMzIgY2VudGVyX2ZyZXEsIHRlbXAsIGJ2YWxGRlRMaW5lOwotCi0gIC8qIGNlbnRlciBmcmVxdWVuY3kgb2YgZmZ0IGxpbmUgKi8KLSAgY2VudGVyX2ZyZXEgPSAoZmZ0TGluZSAqIHNhbXBsaW5nRnJlcSkgLyAobm9PZkxpbmVzIDw8IDEpOwotICB0ZW1wID0gIGF0YW5fMTAwMCgoY2VudGVyX2ZyZXEgPDwgMikgLyAoMyoxMCkpOwotICBidmFsRkZUTGluZSA9Ci0gICAgKDI2NjAwICogYXRhbl8xMDAwKChjZW50ZXJfZnJlcSo3NikgLyAxMDApICsgNyp0ZW1wKnRlbXApIC8gKDIqMTAwMCoxMDAwIC8gQkFSQ19TQ0FMRSk7Ci0KLSAgcmV0dXJuIHNhdHVyYXRlKGJ2YWxGRlRMaW5lKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGluaXRUaHJRdWlldAotKiBkZXNjcmlwdGlvbjogIGluaXQgdGhyZWRob2xkIGluIHF1aWV0Ci0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGluaXRUaHJRdWlldChXb3JkMTYgIG51bVBiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqcGJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpwYkJhcmNWYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICpwYlRocmVzaG9sZFF1aWV0KSB7Ci0gIFdvcmQxNiBpOwotICBXb3JkMTYgYmFyY1RoclF1aWV0OwotCi0gIGZvcihpPTA7IGk8bnVtUGI7IGkrKykgewotICAgIFdvcmQxNiBidjEsIGJ2MjsKLQotCi0gICAgaWYgKGk+MCkKLSAgICAgIGJ2MSA9IChwYkJhcmNWYWxbaV0gKyBwYkJhcmNWYWxbaS0xXSkgPj4gMTsKLSAgICBlbHNlCi0gICAgICBidjEgPSBwYkJhcmNWYWxbaV0gPj4gMTsKLQotCi0gICAgaWYgKGkgPCAobnVtUGIgLSAxKSkKLSAgICAgIGJ2MiA9IChwYkJhcmNWYWxbaV0gKyBwYkJhcmNWYWxbaSsxXSkgPj4gMTsKLSAgICBlbHNlIHsKLSAgICAgIGJ2MiA9IHBiQmFyY1ZhbFtpXTsKLSAgICB9Ci0KLSAgICBidjEgPSBtaW4oKGJ2MSAvIEJBUkNfU0NBTEUpLCBtYXhfYmFyayk7Ci0gICAgYnYyID0gbWluKChidjIgLyBCQVJDX1NDQUxFKSwgbWF4X2JhcmspOwotCi0gICAgYmFyY1RoclF1aWV0ID0gbWluKEJBUkNfVEhSX1FVSUVUW2J2MV0sIEJBUkNfVEhSX1FVSUVUW2J2Ml0pOwotCi0KLSAgICAvKgotICAgICAgd2UgY2FsY3VsYXRlCi0gICAgICBwb3coMTAuMGYsKGZsb2F0KShiYXJjVGhyUXVpZXQgLSBBQlNfTEVWKSowLjEpKihmbG9hdClBQlNfTE9XKihwYk9mZnNldFtpKzFdIC0gcGJPZmZzZXRbaV0pOwotICAgICovCi0KLSAgICBwYlRocmVzaG9sZFF1aWV0W2ldID0gcG93Ml94eSgoKChiYXJjVGhyUXVpZXQgLSBBQlNfTEVWKSAqIDEwMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cyXzEwMDAqKDE0KzIqTE9HX05PUk1fUENNKSksIExPRzJfMTAwMCkgKiAocGJPZmZzZXRbaSsxXSAtIHBiT2Zmc2V0W2ldKTsKLSAgfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBpbml0U3ByZWFkaW5nCi0qIGRlc2NyaXB0aW9uOiAgaW5pdCBlbmVyZ3kgc3ByZWFkaW5nIHBhcmFtZXRlcgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBpbml0U3ByZWFkaW5nKFdvcmQxNiAgbnVtUGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcGJCYXJjVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcGJNYXNrTG9GYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcGJNYXNrSGlGYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcGJNYXNrTG9GYWN0b3JTcHJFbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpwYk1hc2tIaUZhY3RvclNwckVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgYml0cmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IGJsb2NrVHlwZSkKLXsKLSAgV29yZDE2IGk7Ci0gIFdvcmQxNiBtYXNrTG93U3ByRW4sIG1hc2tIaWdoU3ByRW47Ci0KLQotICBpZiAoc3ViKGJsb2NrVHlwZSwgU0hPUlRfV0lORE9XKSAhPSAwKSB7Ci0gICAgbWFza0xvd1NwckVuID0gbWFza0xvd1NwckVuTG9uZzsKLQotICAgIGlmIChiaXRyYXRlID4gMjIwMDApCi0gICAgICBtYXNrSGlnaFNwckVuID0gbWFza0hpZ2hTcHJFbkxvbmc7Ci0gICAgZWxzZQotICAgICAgbWFza0hpZ2hTcHJFbiA9IG1hc2tIaWdoU3ByRW5Mb25nTG93QnI7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgbWFza0xvd1NwckVuID0gbWFza0xvd1NwckVuU2hvcnQ7Ci0gICAgbWFza0hpZ2hTcHJFbiA9IG1hc2tIaWdoU3ByRW5TaG9ydDsKLSAgfQotCi0gIGZvcihpPTA7IGk8bnVtUGI7IGkrKykgewotCi0gICAgaWYgKGkgPiAwKSB7Ci0gICAgICBXb3JkMzIgZGJWYWw7Ci0gICAgICBXb3JkMTYgZGJhcmsgPSBwYkJhcmNWYWx1ZVtpXSAtIHBiQmFyY1ZhbHVlW2ktMV07Ci0KLSAgICAgIC8qCi0gICAgICAgIHdlIGNhbHVsYXRlIHBvdygxMC4wZiwgLTAuMSpkYlZhbC9CQVJDX1NDQUxFKQotICAgICAgKi8KLSAgICAgIGRiVmFsID0gKG1hc2tIaWdoICogZGJhcmspOwotICAgICAgcGJNYXNrSGlGYWN0b3JbaV0gPSByb3VuZDE2KHBvdzJfeHkoTF9uZWdhdGUoZGJWYWwpLCAoV29yZDMyKUxPRzJfMTAwMCkpOyAgICAgICAgICAgICAvKiAwLjMwMSBsb2cxMCgyKSAqLwotCi0gICAgICBkYlZhbCA9IChtYXNrTG93ICogZGJhcmspOwotICAgICAgcGJNYXNrTG9GYWN0b3JbaS0xXSA9IHJvdW5kMTYocG93Ml94eShMX25lZ2F0ZShkYlZhbCksKFdvcmQzMilMT0cyXzEwMDApKTsKLQotCi0gICAgICBkYlZhbCA9IChtYXNrSGlnaFNwckVuICogZGJhcmspOwotICAgICAgcGJNYXNrSGlGYWN0b3JTcHJFbltpXSA9ICByb3VuZDE2KHBvdzJfeHkoTF9uZWdhdGUoZGJWYWwpLChXb3JkMzIpTE9HMl8xMDAwKSk7Ci0gICAgICBkYlZhbCA9IChtYXNrTG93U3ByRW4gKiBkYmFyayk7Ci0gICAgICBwYk1hc2tMb0ZhY3RvclNwckVuW2ktMV0gPSByb3VuZDE2KHBvdzJfeHkoTF9uZWdhdGUoZGJWYWwpLChXb3JkMzIpTE9HMl8xMDAwKSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgcGJNYXNrSGlGYWN0b3JbaV0gPSAwOwotICAgICAgcGJNYXNrTG9GYWN0b3JbbnVtUGItMV0gPSAwOwotCi0gICAgICBwYk1hc2tIaUZhY3RvclNwckVuW2ldID0gMDsKLSAgICAgIHBiTWFza0xvRmFjdG9yU3ByRW5bbnVtUGItMV0gPSAwOwotICAgIH0KLSAgfQotCi19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGluaXRCYXJjVmFsdWVzCi0qIGRlc2NyaXB0aW9uOiAgaW5pdCBiYXJrIHZhbHVlCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGluaXRCYXJjVmFsdWVzKFdvcmQxNiAgbnVtUGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKnBiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBudW1MaW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgc2FtcGxpbmdGcmVxdWVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnBiQnZhbCkKLXsKLSAgV29yZDE2IGk7Ci0gIFdvcmQxNiBwYkJ2YWwwLCBwYkJ2YWwxOwotCi0gIHBiQnZhbDAgPSAwOwotCi0gIGZvcihpPTA7IGk8bnVtUGI7IGkrKyl7Ci0gICAgcGJCdmFsMSA9IEJhcmNMaW5lVmFsdWUobnVtTGluZXMsIHBiT2Zmc2V0W2krMV0sIHNhbXBsaW5nRnJlcXVlbmN5KTsKLSAgICBwYkJ2YWxbaV0gPSAocGJCdmFsMCArIHBiQnZhbDEpID4+IDE7Ci0gICAgcGJCdmFsMCA9IHBiQnZhbDE7Ci0gIH0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogaW5pdE1pblNucgotKiBkZXNjcmlwdGlvbjogIGNhbGN1bGF0ZSBtaW4gc25yIHBhcmFtZXRlcgotKgkJCQltaW5TbnIobikgPSAxLygyXnNmYlBlbWluKG4pL3cobikgLSAxLjUpCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGluaXRNaW5TbnIoY29uc3QgV29yZDMyICBiaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgIHNhbXBsZXJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgbnVtTGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKnBiQmFyY1ZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICBzZmJBY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAqc2ZiTWluU25yKQotewotICBXb3JkMTYgc2ZiOwotICBXb3JkMTYgYmFyY1dpZHRoOwotICBXb3JkMTYgcGVQZXJXaW5kb3c7Ci0gIFdvcmQzMiBwZVBhcnQ7Ci0gIFdvcmQzMiBzbnI7Ci0gIFdvcmQxNiBwYlZhbDAsIHBiVmFsMSwgc2hpZnQ7Ci0KLSAgLyogcmVsYXRpdmUgbnVtYmVyIG9mIGFjdGl2ZSBiYXJrcyAqLwotCi0KLSAgcGVQZXJXaW5kb3cgPSBiaXRzMnBlKGV4dHJhY3RfbCgoYml0cmF0ZSAqIG51bUxpbmVzKSAvIHNhbXBsZXJhdGUpKTsKLQotICBwYlZhbDAgPSAwOwotCi0gIGZvciAoc2ZiPTA7IHNmYjxzZmJBY3RpdmU7IHNmYisrKSB7Ci0KLSAgICBwYlZhbDEgPSAocGJCYXJjVmFsW3NmYl0gPDwgMSkgLSBwYlZhbDA7Ci0gICAgYmFyY1dpZHRoID0gcGJWYWwxIC0gcGJWYWwwOwotICAgIHBiVmFsMCA9IHBiVmFsMTsKLQotICAgIC8qIGFsbG93IGF0IGxlYXN0IDIuNCUgb2YgcGUgZm9yIGVhY2ggYWN0aXZlIGJhcmMgKi8KLQlwZVBhcnQgPSAoKHBlUGVyV2luZG93ICogMjQpICogKG1heF9iYXJrICogYmFyY1dpZHRoKSkgLwotICAgICAgICAocGJCYXJjVmFsW3NmYkFjdGl2ZS0xXSAqIChzZmJPZmZzZXRbc2ZiKzFdIC0gc2ZiT2Zmc2V0W3NmYl0pKTsKLQotCi0gICAgcGVQYXJ0ID0gbWluKHBlUGFydCwgODQwMCk7Ci0gICAgcGVQYXJ0ID0gbWF4KHBlUGFydCwgMTQwMCk7Ci0KLSAgICAvKiBtaW5TbnIobikgPSAxLygyXnNmYlBlbWluKG4pL3cobikgLSAxLjUpKi8KLQkvKiB3ZSBhZGQgYW4gb2Zmc2V0IG9mIDJeMTYgdG8gdGhlIHBvdyBmdW5jdGlvbnMgKi8KLQkvKiAweGMwMDAgPSAxLjUqKDEgPDwgMTUpKi8KLQotICAgIHNuciA9IHBvdzJfeHkoKHBlUGFydCAtIDE2KjEwMDApLDEwMDApIC0gMHgwMDAwYzAwMDsKLQotICAgIGlmKHNuciA+IDB4MDAwMDgwMDApCi0JewotCQlzaGlmdCA9IG5vcm1fbChzbnIpOwotCQlzbnIgPSBEaXZfMzIoMHgwMDAwODAwMCA8PCBzaGlmdCwgc25yIDw8IHNoaWZ0KTsKLQl9Ci0JZWxzZQotCXsKLQkJc25yID0gMHg3ZmZmZmZmZjsKLQl9Ci0KLSAgICAvKiB1cHBlciBsaW1pdCBpcyAtMSBkQiAqLwotICAgIHNuciA9IG1pbihzbnIsIGNfbWF4c25yKTsKLSAgICAvKiBsb3dlciBsaW1pdCBpcyAtMjUgZEIgKi8KLSAgICBzbnIgPSBtYXgoc25yLCBjX21pbnNucik7Ci0gICAgc2ZiTWluU25yW3NmYl0gPSByb3VuZDE2KHNucik7Ci0gIH0KLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogSW5pdFBzeUNvbmZpZ3VyYXRpb25Mb25nCi0qIGRlc2NyaXB0aW9uOiAgaW5pdCBsb25nIGJsb2NrIHBzeWNob2Fjb3VzdGljIGNvbmZpZ3VyYXRpb24KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotV29yZDE2IEluaXRQc3lDb25maWd1cmF0aW9uTG9uZyhXb3JkMzIgYml0cmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIHNhbXBsZXJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBiYW5kd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OX0xPTkcgKnBzeUNvbmYpCi17Ci0gIFdvcmQzMiBzYW1wbGVyYXRlaW5kZXg7Ci0gIFdvcmQxNiBzZmJCYXJjVmFsW01BWF9TRkJfTE9OR107Ci0gIFdvcmQxNiBzZmI7Ci0KLSAgLyoKLSAgICBpbml0IHNmYiB0YWJsZQotICAqLwotICBzYW1wbGVyYXRlaW5kZXggPSBHZXRTUkluZGV4KHNhbXBsZXJhdGUpOwotICBwc3lDb25mLT5zZmJDbnQgPSBzZkJhbmRUb3RhbExvbmdbc2FtcGxlcmF0ZWluZGV4XTsKLSAgcHN5Q29uZi0+c2ZiT2Zmc2V0ID0gc2ZCYW5kVGFiTG9uZyArIHNmQmFuZFRhYkxvbmdPZmZzZXRbc2FtcGxlcmF0ZWluZGV4XTsKLSAgcHN5Q29uZi0+c2FtcFJhdGVJZHggPSBzYW1wbGVyYXRlaW5kZXg7Ci0KLSAgLyoKLSAgICBjYWxjdWxhdGUgYmFyYyB2YWx1ZXMgZm9yIGVhY2ggcGIKLSAgKi8KLSAgaW5pdEJhcmNWYWx1ZXMocHN5Q29uZi0+c2ZiQ250LAotICAgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk9mZnNldFtwc3lDb25mLT5zZmJDbnRdLAotICAgICAgICAgICAgICAgICBzYW1wbGVyYXRlLAotICAgICAgICAgICAgICAgICBzZmJCYXJjVmFsKTsKLQotICAvKgotICAgIGluaXQgdGhyZXNob2xkcyBpbiBxdWlldAotICAqLwotICBpbml0VGhyUXVpZXQocHN5Q29uZi0+c2ZiQ250LAotICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgc2ZiQmFyY1ZhbCwKLSAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYlRocmVzaG9sZFF1aWV0KTsKLQotICAvKgotICAgIGNhbGN1bGF0ZSBzcHJlYWRpbmcgZnVuY3Rpb24KLSAgKi8KLSAgaW5pdFNwcmVhZGluZyhwc3lDb25mLT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgc2ZiQmFyY1ZhbCwKLSAgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJNYXNrTG93RmFjdG9yLAotICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1hc2tIaWdoRmFjdG9yLAotICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1hc2tMb3dGYWN0b3JTcHJFbiwKLSAgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJNYXNrSGlnaEZhY3RvclNwckVuLAotICAgICAgICAgICAgICAgIGJpdHJhdGUsCi0gICAgICAgICAgICAgICAgTE9OR19XSU5ET1cpOwotCi0gIC8qCi0gICAgaW5pdCByYXRpbwotICAqLwotICBwc3lDb25mLT5yYXRpbyA9IGNfcmF0aW87Ci0KLSAgcHN5Q29uZi0+bWF4QWxsb3dlZEluY3JlYXNlRmFjdG9yID0gMjsKLSAgcHN5Q29uZi0+bWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yID0gY19taW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3I7ICAgIC8qIDAuMDEgKigxIDw8IDE1KSovCi0KLSAgcHN5Q29uZi0+Y2xpcEVuZXJneSA9IGNfbWF4Q2xpcEVuZXJneUxvbmc7Ci0gIHBzeUNvbmYtPmxvd3Bhc3NMaW5lID0gZXh0cmFjdF9sKChiYW5kd2lkdGg8PDEpICogRlJBTUVfTEVOX0xPTkcgLyBzYW1wbGVyYXRlKTsKLQotICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeUNvbmYtPnNmYkNudDsgc2ZiKyspIHsKLSAgICBpZiAoc3ViKHBzeUNvbmYtPnNmYk9mZnNldFtzZmJdLCBwc3lDb25mLT5sb3dwYXNzTGluZSkgPj0gMCkKLSAgICAgIGJyZWFrOwotICB9Ci0gIHBzeUNvbmYtPnNmYkFjdGl2ZSA9IHNmYjsKLQotICAvKgotICAgIGNhbGN1bGF0ZSBtaW5TbnIKLSAgKi8KLSAgaW5pdE1pblNucihiaXRyYXRlLAotICAgICAgICAgICAgIHNhbXBsZXJhdGUsCi0gICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0W3BzeUNvbmYtPnNmYkNudF0sCi0gICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0LAotICAgICAgICAgICAgIHNmYkJhcmNWYWwsCi0gICAgICAgICAgICAgcHN5Q29uZi0+c2ZiQWN0aXZlLAotICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1pblNucik7Ci0KLQotICByZXR1cm4oMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBJbml0UHN5Q29uZmlndXJhdGlvblNob3J0Ci0qIGRlc2NyaXB0aW9uOiAgaW5pdCBzaG9ydCBibG9jayBwc3ljaG9hY291c3RpYyBjb25maWd1cmF0aW9uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVdvcmQxNiBJbml0UHN5Q29uZmlndXJhdGlvblNob3J0KFdvcmQzMiBiaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIHNhbXBsZXJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYmFuZHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX0NPTkZJR1VSQVRJT05fU0hPUlQgKnBzeUNvbmYpCi17Ci0gIFdvcmQzMiBzYW1wbGVyYXRlaW5kZXg7Ci0gIFdvcmQxNiBzZmJCYXJjVmFsW01BWF9TRkJfU0hPUlRdOwotICBXb3JkMTYgc2ZiOwotICAvKgotICAgIGluaXQgc2ZiIHRhYmxlCi0gICovCi0gIHNhbXBsZXJhdGVpbmRleCA9IEdldFNSSW5kZXgoc2FtcGxlcmF0ZSk7Ci0gIHBzeUNvbmYtPnNmYkNudCA9IHNmQmFuZFRvdGFsU2hvcnRbc2FtcGxlcmF0ZWluZGV4XTsKLSAgcHN5Q29uZi0+c2ZiT2Zmc2V0ID0gc2ZCYW5kVGFiU2hvcnQgKyBzZkJhbmRUYWJTaG9ydE9mZnNldFtzYW1wbGVyYXRlaW5kZXhdOwotICBwc3lDb25mLT5zYW1wUmF0ZUlkeCA9IHNhbXBsZXJhdGVpbmRleDsKLSAgLyoKLSAgICBjYWxjdWxhdGUgYmFyYyB2YWx1ZXMgZm9yIGVhY2ggcGIKLSAgKi8KLSAgaW5pdEJhcmNWYWx1ZXMocHN5Q29uZi0+c2ZiQ250LAotICAgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk9mZnNldFtwc3lDb25mLT5zZmJDbnRdLAotICAgICAgICAgICAgICAgICBzYW1wbGVyYXRlLAotICAgICAgICAgICAgICAgICBzZmJCYXJjVmFsKTsKLQotICAvKgotICAgIGluaXQgdGhyZXNob2xkcyBpbiBxdWlldAotICAqLwotICBpbml0VGhyUXVpZXQocHN5Q29uZi0+c2ZiQ250LAotICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgc2ZiQmFyY1ZhbCwKLSAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYlRocmVzaG9sZFF1aWV0KTsKLQotICAvKgotICAgIGNhbGN1bGF0ZSBzcHJlYWRpbmcgZnVuY3Rpb24KLSAgKi8KLSAgaW5pdFNwcmVhZGluZyhwc3lDb25mLT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgc2ZiQmFyY1ZhbCwKLSAgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJNYXNrTG93RmFjdG9yLAotICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1hc2tIaWdoRmFjdG9yLAotICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1hc2tMb3dGYWN0b3JTcHJFbiwKLSAgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJNYXNrSGlnaEZhY3RvclNwckVuLAotICAgICAgICAgICAgICAgIGJpdHJhdGUsCi0gICAgICAgICAgICAgICAgU0hPUlRfV0lORE9XKTsKLQotICAvKgotICAgIGluaXQgcmF0aW8KLSAgKi8KLSAgcHN5Q29uZi0+cmF0aW8gPSBjX3JhdGlvOwotCi0gIHBzeUNvbmYtPm1heEFsbG93ZWRJbmNyZWFzZUZhY3RvciA9IDI7Ci0gIHBzeUNvbmYtPm1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvciA9IGNfbWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yOwotCi0gIHBzeUNvbmYtPmNsaXBFbmVyZ3kgPSBjX21heENsaXBFbmVyZ3lTaG9ydDsKLQotICBwc3lDb25mLT5sb3dwYXNzTGluZSA9IGV4dHJhY3RfbCgoKGJhbmR3aWR0aCA8PCAxKSAqIEZSQU1FX0xFTl9TSE9SVCkgLyBzYW1wbGVyYXRlKTsKLQotICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeUNvbmYtPnNmYkNudDsgc2ZiKyspIHsKLQotICAgIGlmIChwc3lDb25mLT5zZmJPZmZzZXRbc2ZiXSA+PSBwc3lDb25mLT5sb3dwYXNzTGluZSkKLSAgICAgIGJyZWFrOwotICB9Ci0gIHBzeUNvbmYtPnNmYkFjdGl2ZSA9IHNmYjsKLQotICAvKgotICAgIGNhbGN1bGF0ZSBtaW5TbnIKLSAgKi8KLSAgaW5pdE1pblNucihiaXRyYXRlLAotICAgICAgICAgICAgIHNhbXBsZXJhdGUsCi0gICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0W3BzeUNvbmYtPnNmYkNudF0sCi0gICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0LAotICAgICAgICAgICAgIHNmYkJhcmNWYWwsCi0gICAgICAgICAgICAgcHN5Q29uZi0+c2ZiQWN0aXZlLAotICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1pblNucik7Ci0KLSAgcmV0dXJuKDApOwotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9wc3lfbWFpbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcHN5X21haW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYwNjc5Yy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9wc3lfbWFpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsODE1ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJcHN5X21haW4uYwotCi0JQ29udGVudDoJUHN5Y2hvYWNvdXN0aWMgbWFqb3IgZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJ0eXBlZGVmLmgiCi0jaW5jbHVkZSAiYmFzaWNfb3AuaCIKLSNpbmNsdWRlICJvcGVyXzMyYi5oIgotI2luY2x1ZGUgInBzeV9jb25zdC5oIgotI2luY2x1ZGUgImJsb2NrX3N3aXRjaC5oIgotI2luY2x1ZGUgInRyYW5zZm9ybS5oIgotI2luY2x1ZGUgInNwcmVhZGluZy5oIgotI2luY2x1ZGUgInByZV9lY2hvX2NvbnRyb2wuaCIKLSNpbmNsdWRlICJiYW5kX25yZy5oIgotI2luY2x1ZGUgInBzeV9jb25maWd1cmF0aW9uLmgiCi0jaW5jbHVkZSAicHN5X2RhdGEuaCIKLSNpbmNsdWRlICJtc19zdGVyZW8uaCIKLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJwc3lfbWFpbi5oIgotI2luY2x1ZGUgImdycF9kYXRhLmgiCi0jaW5jbHVkZSAidG5zX2Z1bmMuaCIKLSNpbmNsdWRlICJtZW1hbGlnbi5oIgotCi0jZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKLQotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgIHN0YXJ0ICAgICAgIHNob3J0ICAgICAgIHN0b3AgKi8KLXN0YXRpYyBXb3JkMTYgYmxvY2tUeXBlMndpbmRvd1NoYXBlW10gPSB7S0JEX1dJTkRPVyxTSU5FX1dJTkRPVyxTSU5FX1dJTkRPVyxLQkRfV0lORE9XfTsKLQotLyoKLSAgZm9yd2FyZCBkZWZpbml0aW9ucwotKi8KLXN0YXRpYyBXb3JkMTYgYWR2YW5jZVBzeWNoTG9uZyhQU1lfREFUQSogcHN5RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTlNfREFUQSogdG5zRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTl9MT05HICpoUHN5Q29uZkxvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqcFNjcmF0Y2hUbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE5TX0RBVEEgKnRuc0RhdGEyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBjaCk7Ci0KLXN0YXRpYyBXb3JkMTYgYWR2YW5jZVBzeWNoTG9uZ01TIChQU1lfREFUQSAgcHN5RGF0YVtNQVhfQ0hBTk5FTFNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBTWV9DT05GSUdVUkFUSU9OX0xPTkcgKmhQc3lDb25mTG9uZyk7Ci0KLXN0YXRpYyBXb3JkMTYgYWR2YW5jZVBzeWNoU2hvcnQoUFNZX0RBVEEqIHBzeURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROU19EQVRBKiB0bnNEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQU1lfQ09ORklHVVJBVElPTl9TSE9SVCAqaFBzeUNvbmZTaG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKnBTY3JhdGNoVG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTlNfREFUQSAqdG5zRGF0YTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBjaCk7Ci0KLXN0YXRpYyBXb3JkMTYgYWR2YW5jZVBzeWNoU2hvcnRNUyAoUFNZX0RBVEEgIHBzeURhdGFbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFNZX0NPTkZJR1VSQVRJT05fU0hPUlQgKmhQc3lDb25mU2hvcnQpOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBQc3lOZXcKLSogZGVzY3JpcHRpb246ICBhbGxvY2F0ZXMgbWVtb3J5IGZvciBwc3ljaG9hY291c3RpYwotKiByZXR1cm5zOiAgICAgIGFuIGVycm9yIGNvZGUKLSogaW5wdXQ6ICAgICAgICBwb2ludGVyIHRvIGEgcHN5Y2ggaGFuZGxlCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVdvcmQxNiBQc3lOZXcoUFNZX0tFUk5FTCAqaFBzeSwgV29yZDMyIG5DaGFuLCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCkKLXsKLSAgV29yZDE2IGk7Ci0gIFdvcmQzMiAqbWRjdFNwZWN0cnVtOwotICBXb3JkMzIgKnNjcmF0Y2hUTlM7Ci0gIFdvcmQxNiAqbWRjdERlbGF5QnVmZmVyOwotCi0gIG1kY3RTcGVjdHJ1bSA9IChXb3JkMzIgKiltZW1fbWFsbG9jKHBNZW1PUCwgbkNoYW4gKiBGUkFNRV9MRU5fTE9ORyAqIHNpemVvZihXb3JkMzIpLCAzMiwgVk9fSU5ERVhfRU5DX0FBQyk7Ci0gIGlmKE5VTEwgPT0gbWRjdFNwZWN0cnVtKQotCSAgcmV0dXJuIDE7Ci0KLSAgc2NyYXRjaFROUyA9IChXb3JkMzIgKiltZW1fbWFsbG9jKHBNZW1PUCwgbkNoYW4gKiBGUkFNRV9MRU5fTE9ORyAqIHNpemVvZihXb3JkMzIpLCAzMiwgVk9fSU5ERVhfRU5DX0FBQyk7Ci0gIGlmKE5VTEwgPT0gc2NyYXRjaFROUykKLSAgewotCSAgcmV0dXJuIDE7Ci0gIH0KLQotICBtZGN0RGVsYXlCdWZmZXIgPSAoV29yZDE2ICopbWVtX21hbGxvYyhwTWVtT1AsIG5DaGFuICogQkxPQ0tfU1dJVENISU5HX09GRlNFVCAqIHNpemVvZihXb3JkMTYpLCAzMiwgVk9fSU5ERVhfRU5DX0FBQyk7Ci0gIGlmKE5VTEwgPT0gbWRjdERlbGF5QnVmZmVyKQotICB7Ci0JICByZXR1cm4gMTsKLSAgfQotCi0gIGZvciAoaT0wOyBpPG5DaGFuOyBpKyspewotICAgIGhQc3ktPnBzeURhdGFbaV0ubWRjdERlbGF5QnVmZmVyID0gbWRjdERlbGF5QnVmZmVyICsgaSpCTE9DS19TV0lUQ0hJTkdfT0ZGU0VUOwotICAgIGhQc3ktPnBzeURhdGFbaV0ubWRjdFNwZWN0cnVtID0gbWRjdFNwZWN0cnVtICsgaSpGUkFNRV9MRU5fTE9ORzsKLSAgfQotCi0gIGhQc3ktPnBTY3JhdGNoVG5zID0gc2NyYXRjaFROUzsKLQotICByZXR1cm4gMDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogUHN5RGVsZXRlCi0qIGRlc2NyaXB0aW9uOiAgYWxsb2NhdGVzIG1lbW9yeSBmb3IgcHN5Y2hvYWNvdXN0aWMKLSogcmV0dXJuczogICAgICBhbiBlcnJvciBjb2RlCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVdvcmQxNiBQc3lEZWxldGUoUFNZX0tFUk5FTCAgKmhQc3ksIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKQotewotICBXb3JkMzIgbmNoOwotCi0gIGlmKGhQc3kpCi0gIHsKLQlpZihoUHN5LT5wc3lEYXRhWzBdLm1kY3REZWxheUJ1ZmZlcikKLQkJbWVtX2ZyZWUocE1lbU9QLCBoUHN5LT5wc3lEYXRhWzBdLm1kY3REZWxheUJ1ZmZlciwgVk9fSU5ERVhfRU5DX0FBQyk7Ci0KLSAgICBpZihoUHN5LT5wc3lEYXRhWzBdLm1kY3RTcGVjdHJ1bSkKLQkJbWVtX2ZyZWUocE1lbU9QLCBoUHN5LT5wc3lEYXRhWzBdLm1kY3RTcGVjdHJ1bSwgVk9fSU5ERVhfRU5DX0FBQyk7Ci0KLSAgICBmb3IgKG5jaD0wOyBuY2g8TUFYX0NIQU5ORUxTOyBuY2grKyl7Ci0JICBoUHN5LT5wc3lEYXRhW25jaF0ubWRjdERlbGF5QnVmZmVyID0gTlVMTDsKLQkgIGhQc3ktPnBzeURhdGFbbmNoXS5tZGN0U3BlY3RydW0gPSBOVUxMOwotCX0KLQotCWlmKGhQc3ktPnBTY3JhdGNoVG5zKQotCXsKLQkJbWVtX2ZyZWUocE1lbU9QLCBoUHN5LT5wU2NyYXRjaFRucywgVk9fSU5ERVhfRU5DX0FBQyk7Ci0JCWhQc3ktPnBTY3JhdGNoVG5zID0gTlVMTDsKLQl9Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogUHN5T3V0TmV3Ci0qIGRlc2NyaXB0aW9uOiAgYWxsb2NhdGVzIG1lbW9yeSBmb3IgcHN5T3V0IHN0cnVjCi0qIHJldHVybnM6ICAgICAgYW4gZXJyb3IgY29kZQotKiBpbnB1dDogICAgICAgIHBvaW50ZXIgdG8gYSBwc3ljaCBoYW5kbGUKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotV29yZDE2IFBzeU91dE5ldyhQU1lfT1VUICpoUHN5T3V0LCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCkKLXsKLSAgcE1lbU9QLT5TZXQoVk9fSU5ERVhfRU5DX0FBQywgaFBzeU91dCwgMCwgc2l6ZW9mKFBTWV9PVVQpKTsKLSAgLyoKLSAgICBhbGxvYyBzb21lIG1vcmUgc3R1ZmYsIHRiZAotICAqLwotICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IFBzeU91dERlbGV0ZQotKiBkZXNjcmlwdGlvbjogIGFsbG9jYXRlcyBtZW1vcnkgZm9yIHBzeWNob2Fjb3VzdGljCi0qIHJldHVybnM6ICAgICAgYW4gZXJyb3IgY29kZQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1Xb3JkMTYgUHN5T3V0RGVsZXRlKFBTWV9PVVQgKmhQc3lPdXQsIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKQotewotICBVTlVTRUQoaFBzeU91dCk7Ci0gIFVOVVNFRChwTWVtT1ApOwotCi0gIHJldHVybiAwOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBwc3lNYWluSW5pdAotKiBkZXNjcmlwdGlvbjogIGluaXRpYWxpemVzIHBzeWNob2Fjb3VzdGljCi0qIHJldHVybnM6ICAgICAgYW4gZXJyb3IgY29kZQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLVdvcmQxNiBwc3lNYWluSW5pdChQU1lfS0VSTkVMICpoUHN5LAotICAgICAgICAgICAgICAgICAgIFdvcmQzMiBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgIFdvcmQzMiBiaXRSYXRlLAotICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjaGFubmVscywKLSAgICAgICAgICAgICAgICAgICBXb3JkMTYgdG5zTWFzaywKLSAgICAgICAgICAgICAgICAgICBXb3JkMTYgYmFuZHdpZHRoKQotewotICBXb3JkMTYgY2gsIGVycjsKLSAgV29yZDMyIGNoYW5uZWxCaXRSYXRlID0gYml0UmF0ZS9jaGFubmVsczsKLQotICBlcnIgPSBJbml0UHN5Q29uZmlndXJhdGlvbkxvbmcoY2hhbm5lbEJpdFJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFuZHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihoUHN5LT5wc3lDb25mTG9uZykpOwotCi0gIGlmICghZXJyKSB7Ci0gICAgICBoUHN5LT5zYW1wbGVSYXRlSWR4ID0gaFBzeS0+cHN5Q29uZkxvbmcuc2FtcFJhdGVJZHg7Ci0JICBlcnIgPSBJbml0VG5zQ29uZmlndXJhdGlvbkxvbmcoYml0UmF0ZSwgc2FtcGxlUmF0ZSwgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoUHN5LT5wc3lDb25mTG9uZy50bnNDb25mLCAmaFBzeS0+cHN5Q29uZkxvbmcsIHRuc01hc2smMik7Ci0gIH0KLQotICBpZiAoIWVycikKLSAgICBlcnIgPSBJbml0UHN5Q29uZmlndXJhdGlvblNob3J0KGNoYW5uZWxCaXRSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmR3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoUHN5LT5wc3lDb25mU2hvcnQpOwotICBpZiAoIWVycikgewotICAgIGVyciA9IEluaXRUbnNDb25maWd1cmF0aW9uU2hvcnQoYml0UmF0ZSwgc2FtcGxlUmF0ZSwgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFBzeS0+cHN5Q29uZlNob3J0LnRuc0NvbmYsICZoUHN5LT5wc3lDb25mU2hvcnQsIHRuc01hc2smMSk7Ci0gIH0KLQotICBpZiAoIWVycikKLSAgICBmb3IoY2g9MDtjaCA8IGNoYW5uZWxzO2NoKyspewotCi0gICAgICBJbml0QmxvY2tTd2l0Y2hpbmcoJmhQc3ktPnBzeURhdGFbY2hdLmJsb2NrU3dpdGNoaW5nQ29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiaXRSYXRlLCBjaGFubmVscyk7Ci0KLSAgICAgIEluaXRQcmVFY2hvQ29udHJvbChoUHN5LT5wc3lEYXRhW2NoXS5zZmJUaHJlc2hvbGRubTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaFBzeS0+cHN5Q29uZkxvbmcuc2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3ktPnBzeUNvbmZMb25nLnNmYlRocmVzaG9sZFF1aWV0KTsKLSAgICAgIGhQc3ktPnBzeURhdGFbY2hdLm1kY3RTY2FsZW5tMSA9IDA7Ci0gICAgfQotCi0JcmV0dXJuKGVycik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBwc3lNYWluCi0qIGRlc2NyaXB0aW9uOiAgcHN5Y2hvYWNvdXN0aWMgbWFpbiBmdW5jdGlvbgotKiByZXR1cm5zOiAgICAgIGFuIGVycm9yIGNvZGUKLSoKLSogICAgVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgZW5vdWdoIGlucHV0IGRhdGEgaXMgaW4gdGhlIG1vZHVsbyBidWZmZXIuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotV29yZDE2IHBzeU1haW4oV29yZDE2ICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywKLSAgICAgICAgICAgICAgIEVMRU1FTlRfSU5GTyAgICAgICAgICAgICplbGVtSW5mbywKLSAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgICAgICAgICp0aW1lU2lnbmFsLAotICAgICAgICAgICAgICAgUFNZX0RBVEEgICAgICAgICAgICAgICAgIHBzeURhdGFbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgIFROU19EQVRBICAgICAgICAgICAgICAgICB0bnNEYXRhW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTl9MT05HICAqaFBzeUNvbmZMb25nLAotICAgICAgICAgICAgICAgUFNZX0NPTkZJR1VSQVRJT05fU0hPUlQgKmhQc3lDb25mU2hvcnQsCi0gICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAotICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UICAgICAgICAgKnBzeU91dEVsZW1lbnQsCi0gICAgICAgICAgICAgICBXb3JkMzIgICAgICAgICAgICAgICAgICAqcFNjcmF0Y2hUbnMsCi0JCQkgICBXb3JkMzIJCQkJICAgc2FtcGxlUmF0ZSkKLXsKLSAgV29yZDE2IG1heFNmYlBlckdyb3VwW01BWF9DSEFOTkVMU107Ci0gIFdvcmQxNiBtZGN0U2NhbGluZ0FycmF5W01BWF9DSEFOTkVMU107Ci0KLSAgV29yZDE2IGNoOyAgIC8qIGNvdW50cyB0aHJvdWdoIGNoYW5uZWxzICAgICAgICAgICovCi0gIFdvcmQxNiBzZmI7ICAvKiBjb3VudHMgdGhyb3VnaCBzY2FsZWZhY3RvciBiYW5kcyAqLwotICBXb3JkMTYgbGluZTsgLyogY291bnRzIHRocm91Z2ggbGluZXMgICAgICAgICAgICAgKi8KLSAgV29yZDE2IGNoYW5uZWxzOwotICBXb3JkMTYgbWF4U2NhbGU7Ci0KLSAgY2hhbm5lbHMgPSBlbGVtSW5mby0+bkNoYW5uZWxzSW5FbDsKLSAgbWF4U2NhbGUgPSAwOwotCi0gIC8qIGJsb2NrIHN3aXRjaGluZyAqLwotICBmb3IoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgQmxvY2tTd2l0Y2hpbmcoJnBzeURhdGFbY2hdLmJsb2NrU3dpdGNoaW5nQ29udHJvbCwKLSAgICAgICAgICAgICAgICAgICB0aW1lU2lnbmFsK2VsZW1JbmZvLT5DaGFubmVsSW5kZXhbY2hdLAotCQkJCSAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzKTsKLSAgfQotCi0gIC8qIHN5bmNoIGxlZnQgYW5kIHJpZ2h0IGJsb2NrIHR5cGUgKi8KLSAgU3luY0Jsb2NrU3dpdGNoaW5nKCZwc3lEYXRhWzBdLmJsb2NrU3dpdGNoaW5nQ29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICZwc3lEYXRhWzFdLmJsb2NrU3dpdGNoaW5nQ29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzKTsKLQotICAvKiB0cmFuc2Zvcm0KLSAgICAgYW5kIGdldCBtYXhTY2FsZSAobWF4IG1kY3RTY2FsaW5nKSBmb3IgYWxsIGNoYW5uZWxzICovCi0gIGZvcihjaD0wOyBjaDxjaGFubmVsczsgY2grKykgewotICAgIFRyYW5zZm9ybV9SZWFsKHBzeURhdGFbY2hdLm1kY3REZWxheUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICB0aW1lU2lnbmFsK2VsZW1JbmZvLT5DaGFubmVsSW5kZXhbY2hdLAotICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS5tZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgJihtZGN0U2NhbGluZ0FycmF5W2NoXSksCi0gICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0uYmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NlcXVlbmNlKTsKLSAgICBtYXhTY2FsZSA9IG1heChtYXhTY2FsZSwgbWRjdFNjYWxpbmdBcnJheVtjaF0pOwotICB9Ci0KLSAgLyogY29tbW9uIHNjYWxpbmcgZm9yIGFsbCBjaGFubmVscyAqLwotICBmb3IgKGNoPTA7IGNoPGNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgV29yZDE2IHNjYWxlRGlmZiA9IG1heFNjYWxlIC0gbWRjdFNjYWxpbmdBcnJheVtjaF07Ci0KLSAgICBpZiAoc2NhbGVEaWZmID4gMCkgewotICAgICAgV29yZDMyICpTcGVjdHJ1bSA9IHBzeURhdGFbY2hdLm1kY3RTcGVjdHJ1bTsKLQkgIGZvcihsaW5lPTA7IGxpbmU8RlJBTUVfTEVOX0xPTkc7IGxpbmUrKykgewotICAgICAgICAqU3BlY3RydW0gPSAoKlNwZWN0cnVtKSA+PiBzY2FsZURpZmY7Ci0JCVNwZWN0cnVtKys7Ci0gICAgICB9Ci0gICAgfQotICAgIHBzeURhdGFbY2hdLm1kY3RTY2FsZSA9IG1heFNjYWxlOwotICB9Ci0KLSAgZm9yIChjaD0wOyBjaDxjaGFubmVsczsgY2grKykgewotCi0gICAgaWYocHN5RGF0YVtjaF0uYmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NlcXVlbmNlICE9IFNIT1JUX1dJTkRPVykgewotICAgICAgLyogdXBkYXRlIGxvbmcgYmxvY2sgcGFyYW1ldGVyICovCi0JICBhZHZhbmNlUHN5Y2hMb25nKCZwc3lEYXRhW2NoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgJnRuc0RhdGFbY2hdLAotICAgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICZwc3lPdXRDaGFubmVsW2NoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2hUbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICZ0bnNEYXRhWzEgLSBjaF0sCi0gICAgICAgICAgICAgICAgICAgICAgIGNoKTsKLQotICAgICAgLyogZGV0ZXJtaW5lIG1heFNmYiAqLwotICAgICAgZm9yIChzZmI9aFBzeUNvbmZMb25nLT5zZmJDbnQtMTsgc2ZiPj0wOyBzZmItLSkgewotICAgICAgICBmb3IgKGxpbmU9aFBzeUNvbmZMb25nLT5zZmJPZmZzZXRbc2ZiKzFdIC0gMTsgbGluZT49aFBzeUNvbmZMb25nLT5zZmJPZmZzZXRbc2ZiXTsgbGluZS0tKSB7Ci0KLSAgICAgICAgICBpZiAocHN5RGF0YVtjaF0ubWRjdFNwZWN0cnVtW2xpbmVdICE9IDApIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsaW5lID49IGhQc3lDb25mTG9uZy0+c2ZiT2Zmc2V0W3NmYl0pIGJyZWFrOwotICAgICAgfQotICAgICAgbWF4U2ZiUGVyR3JvdXBbY2hdID0gc2ZiICsgMTsKLQotICAgICAgLyogQ2FsYyBiYW5kd2lzZSBlbmVyZ2llcyBmb3IgbWlkIGFuZCBzaWRlIGNoYW5uZWwKLSAgICAgICAgIERvIGl0IG9ubHkgaWYgMiBjaGFubmVscyBleGlzdCAqLwotCi0gICAgICBpZiAoY2ggPT0gMSkKLSAgICAgICAgYWR2YW5jZVBzeWNoTG9uZ01TKHBzeURhdGEsIGhQc3lDb25mTG9uZyk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgYWR2YW5jZVBzeWNoU2hvcnQoJnBzeURhdGFbY2hdLAotICAgICAgICAgICAgICAgICAgICAgICAgJnRuc0RhdGFbY2hdLAotICAgICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwc3lPdXRDaGFubmVsW2NoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoVG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgJnRuc0RhdGFbMSAtIGNoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoKTsKLQotICAgICAgLyogQ2FsYyBiYW5kd2lzZSBlbmVyZ2llcyBmb3IgbWlkIGFuZCBzaWRlIGNoYW5uZWwKLSAgICAgICAgIERvIGl0IG9ubHkgaWYgMiBjaGFubmVscyBleGlzdCAqLwotCi0gICAgICBpZiAoY2ggPT0gMSkKLSAgICAgICAgYWR2YW5jZVBzeWNoU2hvcnRNUyAocHN5RGF0YSwgaFBzeUNvbmZTaG9ydCk7Ci0gICAgfQotICB9Ci0KLSAgLyogZ3JvdXAgc2hvcnQgZGF0YSAqLwotICBmb3IoY2g9MDsgY2g8Y2hhbm5lbHM7IGNoKyspIHsKLQotICAgIGlmIChwc3lEYXRhW2NoXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2VxdWVuY2UgPT0gU0hPUlRfV0lORE9XKSB7Ci0gICAgICBncm91cFNob3J0RGF0YShwc3lEYXRhW2NoXS5tZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaFRucywKLSAgICAgICAgICAgICAgICAgICAgICZwc3lEYXRhW2NoXS5zZmJUaHJlc2hvbGQsCi0gICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVtjaF0uc2ZiRW5lcmd5LAotICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbY2hdLnNmYkVuZXJneU1TLAotICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbY2hdLnNmYlNwcmVhZGVkRW5lcmd5LAotICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiTWluU25yLAotICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudC0+Z3JvdXBlZFNmYk9mZnNldFtjaF0sCi0gICAgICAgICAgICAgICAgICAgICAmbWF4U2ZiUGVyR3JvdXBbY2hdLAotICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudC0+Z3JvdXBlZFNmYk1pblNucltjaF0sCi0gICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubm9PZkdyb3VwcywKLSAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ncm91cExlbik7Ci0gICAgfQotICB9Ci0KLQotI2lmIChNQVhfQ0hBTk5FTFM+MSkKLSAgLyoKLSAgICBzdGVyZW8gUHJvY2Vzc2luZwotICAqLwotICBpZiAoY2hhbm5lbHMgPT0gMikgewotICAgIHBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc0RpZ2VzdCA9IE1TX05PTkU7Ci0gICAgbWF4U2ZiUGVyR3JvdXBbMF0gPSBtYXhTZmJQZXJHcm91cFsxXSA9IG1heChtYXhTZmJQZXJHcm91cFswXSwgbWF4U2ZiUGVyR3JvdXBbMV0pOwotCi0KLSAgICBpZiAocHN5RGF0YVswXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKQotICAgICAgTXNTdGVyZW9Qcm9jZXNzaW5nKHBzeURhdGFbMF0uc2ZiRW5lcmd5LnNmYkxvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5zZmJFbmVyZ3kuc2ZiTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLnNmYkVuZXJneU1TLnNmYkxvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5zZmJFbmVyZ3lNUy5zZmJMb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0ubWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0ubWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0uc2ZiVGhyZXNob2xkLnNmYkxvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5zZmJUaHJlc2hvbGQuc2ZiTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLnNmYlNwcmVhZGVkRW5lcmd5LnNmYkxvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5zZmJTcHJlYWRlZEVuZXJneS5zZmJMb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgIChXb3JkMTYqKSZwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNEaWdlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKFdvcmQxNiopcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTZmJQZXJHcm91cFswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgV29yZDE2KiloUHN5Q29uZkxvbmctPnNmYk9mZnNldCk7Ci0gICAgICBlbHNlCi0gICAgICAgIE1zU3RlcmVvUHJvY2Vzc2luZyhwc3lEYXRhWzBdLnNmYkVuZXJneS5zZmJMb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5zZmJFbmVyZ3kuc2ZiTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0uc2ZiRW5lcmd5TVMuc2ZiTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0uc2ZiRW5lcmd5TVMuc2ZiTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0ubWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5tZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLnNmYlRocmVzaG9sZC5zZmJMb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5zZmJUaHJlc2hvbGQuc2ZiTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0uc2ZiU3ByZWFkZWRFbmVyZ3kuc2ZiTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0uc2ZiU3ByZWFkZWRFbmVyZ3kuc2ZiTG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChXb3JkMTYqKSZwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNEaWdlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoV29yZDE2Kilwc3lPdXRFbGVtZW50LT50b29sc0luZm8ubXNNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubm9PZkdyb3VwcypoUHN5Q29uZlNob3J0LT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTZmJQZXJHcm91cFswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBXb3JkMTYqKXBzeU91dEVsZW1lbnQtPmdyb3VwZWRTZmJPZmZzZXRbMF0pOwotICB9Ci0KLSNlbmRpZiAvKiAoTUFYX0NIQU5ORUxTPjEpICovCi0KLSAgLyoKLSAgICBidWlsZCBvdXRwdXQKLSAgKi8KLSAgZm9yKGNoPTA7Y2g8Y2hhbm5lbHM7Y2grKykgewotCi0gICAgaWYgKHBzeURhdGFbY2hdLmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpCi0gICAgICBCdWlsZEludGVyZmFjZShwc3lEYXRhW2NoXS5tZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS5tZGN0U2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVtjaF0uc2ZiVGhyZXNob2xkLAotICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbY2hdLnNmYkVuZXJneSwKLSAgICAgICAgICAgICAgICAgICAgICZwc3lEYXRhW2NoXS5zZmJTcHJlYWRlZEVuZXJneSwKLSAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLnNmYkVuZXJneVN1bSwKLSAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLnNmYkVuZXJneVN1bU1TLAotICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0uYmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgYmxvY2tUeXBlMndpbmRvd1NoYXBlW3BzeURhdGFbY2hdLmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTZXF1ZW5jZV0sCi0gICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+c2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbY2hdLAotICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZMb25nLT5zZmJNaW5TbnIsCi0gICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubm9PZkdyb3VwcywKLSAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ncm91cExlbiwKLSAgICAgICAgICAgICAgICAgICAgICZwc3lPdXRDaGFubmVsW2NoXSk7Ci0gICAgZWxzZQotICAgICAgQnVpbGRJbnRlcmZhY2UocHN5RGF0YVtjaF0ubWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0ubWRjdFNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbY2hdLnNmYlRocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgICZwc3lEYXRhW2NoXS5zZmJFbmVyZ3ksCi0gICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVtjaF0uc2ZiU3ByZWFkZWRFbmVyZ3ksCi0gICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS5zZmJFbmVyZ3lTdW0sCi0gICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS5zZmJFbmVyZ3lTdW1NUywKLSAgICAgICAgICAgICAgICAgICAgIFNIT1JUX1dJTkRPVywKLSAgICAgICAgICAgICAgICAgICAgIFNJTkVfV0lORE9XLAotICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubm9PZkdyb3VwcypoUHN5Q29uZlNob3J0LT5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LT5ncm91cGVkU2ZiT2Zmc2V0W2NoXSwKLSAgICAgICAgICAgICAgICAgICAgIG1heFNmYlBlckdyb3VwW2NoXSwKLSAgICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnQtPmdyb3VwZWRTZmJNaW5TbnJbY2hdLAotICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0uYmxvY2tTd2l0Y2hpbmdDb250cm9sLm5vT2ZHcm91cHMsCi0gICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wuZ3JvdXBMZW4sCi0gICAgICAgICAgICAgICAgICAgICAmcHN5T3V0Q2hhbm5lbFtjaF0pOwotICB9Ci0KLSAgcmV0dXJuKDApOyAvKiBubyBlcnJvciAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogYWR2YW5jZVBzeWNoTG9uZwotKiBkZXNjcmlwdGlvbjogIHBzeWNob2Fjb3VzdGljIGZvciBsb25nIGJsb2NrcwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBXb3JkMTYgYWR2YW5jZVBzeWNoTG9uZyhQU1lfREFUQSogcHN5RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTlNfREFUQSogdG5zRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTl9MT05HICpoUHN5Q29uZkxvbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqcFNjcmF0Y2hUbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE5TX0RBVEEqIHRuc0RhdGEyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBjaCkKLXsKLSAgV29yZDMyIGk7Ci0gIFdvcmQzMiBub3JtRW5lcmd5U2hpZnQgPSAocHN5RGF0YS0+bWRjdFNjYWxlICsgMSkgPDwgMTsgLyogaW4gcmVmZXJlbmNlIGNvZGUsIG1kY3Qgc3BlY3RydW0gbXVzdCBiZSBtdWx0aXBpZWQgd2l0aCAyLCBzbyArMSAqLwotICBXb3JkMzIgY2xpcEVuZXJneSA9IGhQc3lDb25mTG9uZy0+Y2xpcEVuZXJneSA+PiBub3JtRW5lcmd5U2hpZnQ7Ci0gIFdvcmQzMiAqZGF0YTAsICpkYXRhMSwgdGRhdGE7Ci0KLSAgLyogbG93IHBhc3MgKi8KLSAgZGF0YTAgPSBwc3lEYXRhLT5tZGN0U3BlY3RydW0gKyBoUHN5Q29uZkxvbmctPmxvd3Bhc3NMaW5lOwotICBmb3IoaT1oUHN5Q29uZkxvbmctPmxvd3Bhc3NMaW5lOyBpPEZSQU1FX0xFTl9MT05HOyBpKyspIHsKLSAgICAqZGF0YTArKyA9IDA7Ci0gIH0KLQotICAvKiBDYWxjIHNmYi1iYW5kd2lzZSBtZGN0LWVuZXJnaWVzIGZvciBsZWZ0IGFuZCByaWdodCBjaGFubmVsICovCi0gIENhbGNCYW5kRW5lcmd5KCBwc3lEYXRhLT5tZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+c2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgICAgcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYkxvbmcsCi0gICAgICAgICAgICAgICAgICAmcHN5RGF0YS0+c2ZiRW5lcmd5U3VtLnNmYkxvbmcpOwotCi0gIC8qCi0gICAgVE5TIGRldGVjdAotICAqLwotICBUbnNEZXRlY3QodG5zRGF0YSwKLSAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+dG5zQ29uZiwKLSAgICAgICAgICAgIHBTY3JhdGNoVG5zLAotICAgICAgICAgICAgKGNvbnN0IFdvcmQxNiopaFBzeUNvbmZMb25nLT5zZmJPZmZzZXQsCi0gICAgICAgICAgICBwc3lEYXRhLT5tZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgcHN5RGF0YS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NlcXVlbmNlLAotICAgICAgICAgICAgcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYkxvbmcpOwotCi0gIC8qICBUbnNTeW5jICovCi0gIGlmIChjaCA9PSAxKSB7Ci0gICAgVG5zU3luYyh0bnNEYXRhLAotICAgICAgICAgICAgdG5zRGF0YTIsCi0gICAgICAgICAgICBoUHN5Q29uZkxvbmctPnRuc0NvbmYsCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgcHN5RGF0YS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NlcXVlbmNlKTsKLSAgfQotCi0gIC8qICBUbnMgRW5jb2RlciAqLwotICBUbnNFbmNvZGUoJnBzeU91dENoYW5uZWwtPnRuc0luZm8sCi0gICAgICAgICAgICB0bnNEYXRhLAotICAgICAgICAgICAgaFBzeUNvbmZMb25nLT5zZmJDbnQsCi0gICAgICAgICAgICBoUHN5Q29uZkxvbmctPnRuc0NvbmYsCi0gICAgICAgICAgICBoUHN5Q29uZkxvbmctPmxvd3Bhc3NMaW5lLAotICAgICAgICAgICAgcHN5RGF0YS0+bWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgMCwKLSAgICAgICAgICAgIHBzeURhdGEtPmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTZXF1ZW5jZSk7Ci0KLSAgLyogZmlyc3QgcGFydCBvZiB0aHJlc2hvbGQgY2FsY3VsYXRpb24gKi8KLSAgZGF0YTAgPSBwc3lEYXRhLT5zZmJFbmVyZ3kuc2ZiTG9uZzsKLSAgZGF0YTEgPSBwc3lEYXRhLT5zZmJUaHJlc2hvbGQuc2ZiTG9uZzsKLSAgZm9yIChpPWhQc3lDb25mTG9uZy0+c2ZiQ250OyBpOyBpLS0pIHsKLSAgICB0ZGF0YSA9IExfbXB5X2xzKCpkYXRhMCsrLCBoUHN5Q29uZkxvbmctPnJhdGlvKTsKLSAgICAqZGF0YTErKyA9IG1pbih0ZGF0YSwgY2xpcEVuZXJneSk7Ci0gIH0KLQotICAvKiBDYWxjIHNmYi1iYW5kd2lzZSBtZGN0LWVuZXJnaWVzIGZvciBsZWZ0IGFuZCByaWdodCBjaGFubmVsIGFnYWluICovCi0gIGlmICh0bnNEYXRhLT5kYXRhUmF3LnRuc0xvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZSE9MCkgewotICAgIFdvcmQxNiB0bnNTdGFydEJhbmQgPSBoUHN5Q29uZkxvbmctPnRuc0NvbmYudG5zU3RhcnRCYW5kOwotICAgIENhbGNCYW5kRW5lcmd5KCBwc3lEYXRhLT5tZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+c2ZiT2Zmc2V0K3Ruc1N0YXJ0QmFuZCwKLSAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZMb25nLT5zZmJBY3RpdmUgLSB0bnNTdGFydEJhbmQsCi0gICAgICAgICAgICAgICAgICAgIHBzeURhdGEtPnNmYkVuZXJneS5zZmJMb25nK3Ruc1N0YXJ0QmFuZCwKLSAgICAgICAgICAgICAgICAgICAgJnBzeURhdGEtPnNmYkVuZXJneVN1bS5zZmJMb25nKTsKLQotCWRhdGEwID0gcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYkxvbmc7Ci0JdGRhdGEgPSBwc3lEYXRhLT5zZmJFbmVyZ3lTdW0uc2ZiTG9uZzsKLQlmb3IgKGk9MDsgaTx0bnNTdGFydEJhbmQ7IGkrKykKLSAgICAgIHRkYXRhICs9ICpkYXRhMCsrOwotCi0JcHN5RGF0YS0+c2ZiRW5lcmd5U3VtLnNmYkxvbmcgPSB0ZGF0YTsKLSAgfQotCi0KLSAgLyogc3ByZWFkaW5nIGVuZXJneSAqLwotICBTcHJlYWRpbmdNYXgoaFBzeUNvbmZMb25nLT5zZmJDbnQsCi0gICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYk1hc2tMb3dGYWN0b3IsCi0gICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYk1hc2tIaWdoRmFjdG9yLAotICAgICAgICAgICAgICAgcHN5RGF0YS0+c2ZiVGhyZXNob2xkLnNmYkxvbmcpOwotCi0gIC8qIHRocmVzaG9sZCBpbiBxdWlldCAqLwotICBkYXRhMCA9IHBzeURhdGEtPnNmYlRocmVzaG9sZC5zZmJMb25nOwotICBkYXRhMSA9IGhQc3lDb25mTG9uZy0+c2ZiVGhyZXNob2xkUXVpZXQ7Ci0gIGZvciAoaT1oUHN5Q29uZkxvbmctPnNmYkNudDsgaTsgaS0tKQotICB7Ci0JICAqZGF0YTAgPSBtYXgoKmRhdGEwLCAoKmRhdGExID4+IG5vcm1FbmVyZ3lTaGlmdCkpOwotCSAgZGF0YTArKzsgZGF0YTErKzsKLSAgfQotCi0gIC8qIHByZWVjaG8gY29udHJvbCAqLwotICBpZiAocHN5RGF0YS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NlcXVlbmNlID09IFNUT1BfV0lORE9XKSB7Ci0gICAgZGF0YTAgPSBwc3lEYXRhLT5zZmJUaHJlc2hvbGRubTE7Ci0JZm9yIChpPWhQc3lDb25mTG9uZy0+c2ZiQ250OyBpOyBpLS0pIHsKLSAgICAgICpkYXRhMCsrID0gTUFYXzMyOwotICAgIH0KLSAgICBwc3lEYXRhLT5tZGN0U2NhbGVubTEgPSAwOwotICB9Ci0KLSAgUHJlRWNob0NvbnRyb2woIHBzeURhdGEtPnNmYlRocmVzaG9sZG5tMSwKLSAgICAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+c2ZiQ250LAotICAgICAgICAgICAgICAgICAgaFBzeUNvbmZMb25nLT5tYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3IsCi0gICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPm1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvciwKLSAgICAgICAgICAgICAgICAgIHBzeURhdGEtPnNmYlRocmVzaG9sZC5zZmJMb25nLAotICAgICAgICAgICAgICAgICAgcHN5RGF0YS0+bWRjdFNjYWxlLAotICAgICAgICAgICAgICAgICAgcHN5RGF0YS0+bWRjdFNjYWxlbm0xKTsKLSAgcHN5RGF0YS0+bWRjdFNjYWxlbm0xID0gcHN5RGF0YS0+bWRjdFNjYWxlOwotCi0KLSAgaWYgKHBzeURhdGEtPmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTZXF1ZW5jZT09IFNUQVJUX1dJTkRPVykgewotICAgIGRhdGEwID0gcHN5RGF0YS0+c2ZiVGhyZXNob2xkbm0xOwotCWZvciAoaT1oUHN5Q29uZkxvbmctPnNmYkNudDsgaTsgaS0tKSB7Ci0gICAgICAqZGF0YTArKyA9IE1BWF8zMjsKLSAgICB9Ci0gICAgcHN5RGF0YS0+bWRjdFNjYWxlbm0xID0gMDsKLSAgfQotCi0gIC8qIGFwcGx5IHRucyBtdWx0IHRhYmxlIG9uIGNiIHRocmVzaG9sZHMgKi8KLSAgQXBwbHlUbnNNdWx0VGFibGVUb1JhdGlvcyhoUHN5Q29uZkxvbmctPnRuc0NvbmYudG5zUmF0aW9QYXRjaExvd2VzdENiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+dG5zQ29uZi50bnNTdGFydEJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNMb25nLnN1YkJsb2NrSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhLT5zZmJUaHJlc2hvbGQuc2ZiTG9uZyk7Ci0KLQotICAvKiBzcHJlYWRlZCBlbmVyZ3kgKi8KLSAgZGF0YTAgPSBwc3lEYXRhLT5zZmJTcHJlYWRlZEVuZXJneS5zZmJMb25nOwotICBkYXRhMSA9IHBzeURhdGEtPnNmYkVuZXJneS5zZmJMb25nOwotICBmb3IgKGk9aFBzeUNvbmZMb25nLT5zZmJDbnQ7IGk7IGktLSkgewotICAgIC8vcHN5RGF0YS0+c2ZiU3ByZWFkZWRFbmVyZ3kuc2ZiTG9uZ1tpXSA9IHBzeURhdGEtPnNmYkVuZXJneS5zZmJMb25nW2ldOwotCSAgKmRhdGEwKysgPSAqZGF0YTErKzsKLSAgfQotCi0gIC8qIHNwcmVhZGluZyBlbmVyZ3kgKi8KLSAgU3ByZWFkaW5nTWF4KGhQc3lDb25mTG9uZy0+c2ZiQ250LAotICAgICAgICAgICAgICAgaFBzeUNvbmZMb25nLT5zZmJNYXNrTG93RmFjdG9yU3ByRW4sCi0gICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYk1hc2tIaWdoRmFjdG9yU3ByRW4sCi0gICAgICAgICAgICAgICBwc3lEYXRhLT5zZmJTcHJlYWRlZEVuZXJneS5zZmJMb25nKTsKLQotICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGFkdmFuY2VQc3ljaExvbmdNUwotKiBkZXNjcmlwdGlvbjogICB1cGRhdGUgbWRjdC1lbmVyZ2llcyBmb3IgbGVmdCBhZGQgb3IgbWludXMgcmlnaHQgY2hhbm5lbAotKgkJCQlmb3IgbG9uZyBibG9jawotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDE2IGFkdmFuY2VQc3ljaExvbmdNUyAoUFNZX0RBVEEgcHN5RGF0YVtNQVhfQ0hBTk5FTFNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBTWV9DT05GSUdVUkFUSU9OX0xPTkcgKmhQc3lDb25mTG9uZykKLXsKLSAgQ2FsY0JhbmRFbmVyZ3lNUyhwc3lEYXRhWzBdLm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYkFjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLnNmYkVuZXJneU1TLnNmYkxvbmcsCi0gICAgICAgICAgICAgICAgICAgJnBzeURhdGFbMF0uc2ZiRW5lcmd5U3VtTVMuc2ZiTG9uZywKLSAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLnNmYkVuZXJneU1TLnNmYkxvbmcsCi0gICAgICAgICAgICAgICAgICAgJnBzeURhdGFbMV0uc2ZiRW5lcmd5U3VtTVMuc2ZiTG9uZyk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGFkdmFuY2VQc3ljaFNob3J0Ci0qIGRlc2NyaXB0aW9uOiAgcHN5Y2hvYWNvdXN0aWMgZm9yIHNob3J0IGJsb2NrcwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBXb3JkMTYgYWR2YW5jZVBzeWNoU2hvcnQoUFNZX0RBVEEqIHBzeURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROU19EQVRBKiB0bnNEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQU1lfQ09ORklHVVJBVElPTl9TSE9SVCAqaFBzeUNvbmZTaG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKnBTY3JhdGNoVG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTlNfREFUQSAqdG5zRGF0YTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBjaCkKLXsKLSAgV29yZDMyIHc7Ci0gIFdvcmQzMiBub3JtRW5lcmd5U2hpZnQgPSAocHN5RGF0YS0+bWRjdFNjYWxlICsgMSkgPDwgMTsgLyogaW4gcmVmZXJlbmNlIGNvZGUsIG1kY3Qgc3BlY3RydW0gbXVzdCBiZSBtdWx0aXBpZWQgd2l0aCAyLCBzbyArMSAqLwotICBXb3JkMzIgY2xpcEVuZXJneSA9IGhQc3lDb25mU2hvcnQtPmNsaXBFbmVyZ3kgPj4gbm9ybUVuZXJneVNoaWZ0OwotICBXb3JkMzIgd09mZnNldCA9IDA7Ci0gIFdvcmQzMiAqZGF0YTA7Ci0gIGNvbnN0IFdvcmQzMiAqZGF0YTE7Ci0KLSAgZm9yKHcgPSAwOyB3IDwgVFJBTlNfRkFDOyB3KyspIHsKLSAgICBXb3JkMzIgaSwgdGRhdGE7Ci0KLSAgICAvKiBsb3cgcGFzcyAqLwotICAgIGRhdGEwID0gcHN5RGF0YS0+bWRjdFNwZWN0cnVtICsgd09mZnNldCArIGhQc3lDb25mU2hvcnQtPmxvd3Bhc3NMaW5lOwotCWZvcihpPWhQc3lDb25mU2hvcnQtPmxvd3Bhc3NMaW5lOyBpPEZSQU1FX0xFTl9TSE9SVDsgaSsrKXsKLSAgICAgICpkYXRhMCsrID0gMDsKLSAgICB9Ci0KLSAgICAvKiBDYWxjIHNmYi1iYW5kd2lzZSBtZGN0LWVuZXJnaWVzIGZvciBsZWZ0IGFuZCByaWdodCBjaGFubmVsICovCi0gICAgQ2FsY0JhbmRFbmVyZ3koIHBzeURhdGEtPm1kY3RTcGVjdHJ1bSt3T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYkFjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYlNob3J0W3ddLAotICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YS0+c2ZiRW5lcmd5U3VtLnNmYlNob3J0W3ddKTsKLSAgICAvKgotICAgICAgIFROUwotICAgICovCi0gICAgVG5zRGV0ZWN0KHRuc0RhdGEsCi0gICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnRuc0NvbmYsCi0gICAgICAgICAgICAgIHBTY3JhdGNoVG5zLAotICAgICAgICAgICAgICAoY29uc3QgV29yZDE2KiloUHN5Q29uZlNob3J0LT5zZmJPZmZzZXQsCi0gICAgICAgICAgICAgIHBzeURhdGEtPm1kY3RTcGVjdHJ1bSt3T2Zmc2V0LAotICAgICAgICAgICAgICB3LAotICAgICAgICAgICAgICBwc3lEYXRhLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2VxdWVuY2UsCi0gICAgICAgICAgICAgIHBzeURhdGEtPnNmYkVuZXJneS5zZmJTaG9ydFt3XSk7Ci0KLSAgICAvKiAgVG5zU3luYyAqLwotICAgIGlmIChjaCA9PSAxKSB7Ci0gICAgICBUbnNTeW5jKHRuc0RhdGEsCi0gICAgICAgICAgICAgIHRuc0RhdGEyLAotICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT50bnNDb25mLAotICAgICAgICAgICAgICB3LAotICAgICAgICAgICAgICBwc3lEYXRhLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2VxdWVuY2UpOwotICAgIH0KLQotICAgIFRuc0VuY29kZSgmcHN5T3V0Q2hhbm5lbC0+dG5zSW5mbywKLSAgICAgICAgICAgICAgdG5zRGF0YSwKLSAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiQ250LAotICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT50bnNDb25mLAotICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5sb3dwYXNzTGluZSwKLSAgICAgICAgICAgICAgcHN5RGF0YS0+bWRjdFNwZWN0cnVtK3dPZmZzZXQsCi0gICAgICAgICAgICAgIHcsCi0gICAgICAgICAgICAgIHBzeURhdGEtPmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTZXF1ZW5jZSk7Ci0KLSAgICAvKiBmaXJzdCBwYXJ0IG9mIHRocmVzaG9sZCBjYWxjdWxhdGlvbiAqLwotICAgIGRhdGEwID0gcHN5RGF0YS0+c2ZiVGhyZXNob2xkLnNmYlNob3J0W3ddOwotCWRhdGExID0gcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYlNob3J0W3ddOwotCWZvciAoaT1oUHN5Q29uZlNob3J0LT5zZmJDbnQ7IGk7IGktLSkgewotICAgICAgdGRhdGEgPSBMX21weV9scygqZGF0YTErKywgaFBzeUNvbmZTaG9ydC0+cmF0aW8pOwotICAgICAgKmRhdGEwKysgPSBtaW4odGRhdGEsIGNsaXBFbmVyZ3kpOwotICAgIH0KLQotICAgIC8qIENhbGMgc2ZiLWJhbmR3aXNlIG1kY3QtZW5lcmdpZXMgZm9yIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwgYWdhaW4gKi8KLSAgICBpZiAodG5zRGF0YS0+ZGF0YVJhdy50bnNTaG9ydC5zdWJCbG9ja0luZm9bd10udG5zQWN0aXZlICE9IDApIHsKLSAgICAgIFdvcmQxNiB0bnNTdGFydEJhbmQgPSBoUHN5Q29uZlNob3J0LT50bnNDb25mLnRuc1N0YXJ0QmFuZDsKLSAgICAgIENhbGNCYW5kRW5lcmd5KCBwc3lEYXRhLT5tZGN0U3BlY3RydW0rd09mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJPZmZzZXQrdG5zU3RhcnRCYW5kLAotICAgICAgICAgICAgICAgICAgICAgIChoUHN5Q29uZlNob3J0LT5zZmJBY3RpdmUgLSB0bnNTdGFydEJhbmQpLAotICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGEtPnNmYkVuZXJneS5zZmJTaG9ydFt3XSt0bnNTdGFydEJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGEtPnNmYkVuZXJneVN1bS5zZmJTaG9ydFt3XSk7Ci0KLSAgICAgIHRkYXRhID0gcHN5RGF0YS0+c2ZiRW5lcmd5U3VtLnNmYlNob3J0W3ddOwotCSAgZGF0YTAgPSBwc3lEYXRhLT5zZmJFbmVyZ3kuc2ZiU2hvcnRbd107Ci0JICBmb3IgKGk9dG5zU3RhcnRCYW5kOyBpOyBpLS0pCi0gICAgICAgIHRkYXRhICs9ICpkYXRhMCsrOwotCi0JICBwc3lEYXRhLT5zZmJFbmVyZ3lTdW0uc2ZiU2hvcnRbd10gPSB0ZGF0YTsKLSAgICB9Ci0KLSAgICAvKiBzcHJlYWRpbmcgKi8KLSAgICBTcHJlYWRpbmdNYXgoaFBzeUNvbmZTaG9ydC0+c2ZiQ250LAotICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJNYXNrTG93RmFjdG9yLAotICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJNYXNrSGlnaEZhY3RvciwKLSAgICAgICAgICAgICAgICAgcHN5RGF0YS0+c2ZiVGhyZXNob2xkLnNmYlNob3J0W3ddKTsKLQotCi0gICAgLyogdGhyZXNob2xkIGluIHF1aWV0ICovCi0gICAgZGF0YTAgPSBwc3lEYXRhLT5zZmJUaHJlc2hvbGQuc2ZiU2hvcnRbd107Ci0JZGF0YTEgPSBoUHN5Q29uZlNob3J0LT5zZmJUaHJlc2hvbGRRdWlldDsKLQlmb3IgKGk9aFBzeUNvbmZTaG9ydC0+c2ZiQ250OyBpOyBpLS0pCi0gICAgewotCQkqZGF0YTAgPSBtYXgoKmRhdGEwLCAoKmRhdGExID4+IG5vcm1FbmVyZ3lTaGlmdCkpOwotCi0JCWRhdGEwKys7IGRhdGExKys7Ci0JfQotCi0KLSAgICAvKiBwcmVlY2hvICovCi0gICAgUHJlRWNob0NvbnRyb2woIHBzeURhdGEtPnNmYlRocmVzaG9sZG5tMSwKLSAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiQ250LAotICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5tYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPm1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgcHN5RGF0YS0+c2ZiVGhyZXNob2xkLnNmYlNob3J0W3ddLAotICAgICAgICAgICAgICAgICAgICBwc3lEYXRhLT5tZGN0U2NhbGUsCi0gICAgICAgICAgICAgICAgICAgIHc9PTAgPyBwc3lEYXRhLT5tZGN0U2NhbGVubTEgOiBwc3lEYXRhLT5tZGN0U2NhbGUpOwotCi0gICAgLyogYXBwbHkgdG5zIG11bHQgdGFibGUgb24gY2IgdGhyZXNob2xkcyAqLwotICAgIEFwcGx5VG5zTXVsdFRhYmxlVG9SYXRpb3MoIGhQc3lDb25mU2hvcnQtPnRuc0NvbmYudG5zUmF0aW9QYXRjaExvd2VzdENiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnRuc0NvbmYudG5zU3RhcnRCYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zU2hvcnQuc3ViQmxvY2tJbmZvW3ddLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGEtPnNmYlRocmVzaG9sZC5zZmJTaG9ydFt3XSk7Ci0KLSAgICAvKiBzcHJlYWRlZCBlbmVyZ3kgKi8KLSAgICBkYXRhMCA9IHBzeURhdGEtPnNmYlNwcmVhZGVkRW5lcmd5LnNmYlNob3J0W3ddOwotCWRhdGExID0gcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYlNob3J0W3ddOwotCWZvciAoaT1oUHN5Q29uZlNob3J0LT5zZmJDbnQ7IGk7IGktLSkgewotCSAgKmRhdGEwKysgPSAqZGF0YTErKzsKLSAgICB9Ci0gICAgU3ByZWFkaW5nTWF4KGhQc3lDb25mU2hvcnQtPnNmYkNudCwKLSAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiTWFza0xvd0ZhY3RvclNwckVuLAotICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJNYXNrSGlnaEZhY3RvclNwckVuLAotICAgICAgICAgICAgICAgICBwc3lEYXRhLT5zZmJTcHJlYWRlZEVuZXJneS5zZmJTaG9ydFt3XSk7Ci0KLSAgICB3T2Zmc2V0ICs9IEZSQU1FX0xFTl9TSE9SVDsKLSAgfSAvKiBmb3IgVFJBTlNfRkFDICovCi0KLSAgcHN5RGF0YS0+bWRjdFNjYWxlbm0xID0gcHN5RGF0YS0+bWRjdFNjYWxlOwotCi0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogYWR2YW5jZVBzeWNoU2hvcnRNUwotKiBkZXNjcmlwdGlvbjogICB1cGRhdGUgbWRjdC1lbmVyZ2llcyBmb3IgbGVmdCBhZGQgb3IgbWludXMgcmlnaHQgY2hhbm5lbAotKgkJCQlmb3Igc2hvcnQgYmxvY2sKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQxNiBhZHZhbmNlUHN5Y2hTaG9ydE1TIChQU1lfREFUQSBwc3lEYXRhW01BWF9DSEFOTkVMU10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBTWV9DT05GSUdVUkFUSU9OX1NIT1JUICpoUHN5Q29uZlNob3J0KQotewotICBXb3JkMzIgdywgd09mZnNldDsKLSAgd09mZnNldCA9IDA7Ci0gIGZvcih3PTA7IHc8VFJBTlNfRkFDOyB3KyspIHsKLSAgICBDYWxjQmFuZEVuZXJneU1TKHBzeURhdGFbMF0ubWRjdFNwZWN0cnVtK3dPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLm1kY3RTcGVjdHJ1bSt3T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiQWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS5zZmJFbmVyZ3lNUy5zZmJTaG9ydFt3XSwKLSAgICAgICAgICAgICAgICAgICAgICZwc3lEYXRhWzBdLnNmYkVuZXJneVN1bU1TLnNmYlNob3J0W3ddLAotICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5zZmJFbmVyZ3lNUy5zZmJTaG9ydFt3XSwKLSAgICAgICAgICAgICAgICAgICAgICZwc3lEYXRhWzFdLnNmYkVuZXJneVN1bU1TLnNmYlNob3J0W3ddKTsKLSAgICB3T2Zmc2V0ICs9IEZSQU1FX0xFTl9TSE9SVDsKLSAgfQotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcWNfbWFpbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcWNfbWFpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWQ3OGFhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3FjX21haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDU3OCArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCXFjX21haW4uYwotCi0JQ29udGVudDoJUXVhbnRpemluZyAmIGNvZGluZyBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJhc2ljX29wLmgiCi0jaW5jbHVkZSAib3Blcl8zMmIuaCIKLSNpbmNsdWRlICJxY19tYWluLmgiCi0jaW5jbHVkZSAicXVhbnRpemUuaCIKLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJhZGpfdGhyLmgiCi0jaW5jbHVkZSAic2ZfZXN0aW0uaCIKLSNpbmNsdWRlICJzdGF0X2JpdHMuaCIKLSNpbmNsdWRlICJiaXRfY250LmgiCi0jaW5jbHVkZSAiZHluX2JpdHMuaCIKLSNpbmNsdWRlICJjaGFubmVsX21hcC5oIgotI2luY2x1ZGUgIm1lbWFsaWduLmgiCi0KLSNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQotCi10eXBlZGVmIGVudW17Ci0gIEZSQU1FX0xFTl9CWVRFU19NT0RVTE8gPSAgMSwKLSAgRlJBTUVfTEVOX0JZVEVTX0lOVCAgICA9ICAyCi19RlJBTUVfTEVOX1JFU1VMVF9NT0RFOwotCi1zdGF0aWMgY29uc3QgV29yZDE2IG1heEZpbGxFbGVtQml0cyA9IDcgKyAyNzAqODsKLQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLQotc3RhdGljIFdvcmQxNiBjYWxjTWF4VmFsdWVJblNmYihXb3JkMTYgc2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHNmYk9mZnNldFtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgcXVhbnRTcGVjdHJ1bVtGUkFNRV9MRU5fTE9OR10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVXb3JkMTYgbWF4VmFsdWVbTUFYX0dST1VQRURfU0ZCXSk7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGNhbGNGcmFtZUxlbgotKiBkZXNjcmlwdGlvbjogZXN0aW1hdGUgdGhlIGZyYW1lIGxlbmd0aCBhY2NvcmRpbmcgdGhlIGJpdHJhdGVzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBXb3JkMTYgY2FsY0ZyYW1lTGVuKFdvcmQzMiBiaXRSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9MRU5fUkVTVUxUX01PREUgbW9kZSkKLXsKLQotICBXb3JkMzIgcmVzdWx0OwotICBXb3JkMzIgcXVvdDsKLQotICByZXN1bHQgPSAoRlJBTUVfTEVOX0xPTkcgPj4gMykgKiBiaXRSYXRlOwotICBxdW90ID0gcmVzdWx0IC8gc2FtcGxlUmF0ZTsKLQotCi0gIGlmIChtb2RlID09IEZSQU1FX0xFTl9CWVRFU19NT0RVTE8pIHsKLSAgICByZXN1bHQgLT0gcXVvdCAqIHNhbXBsZVJhdGU7Ci0gIH0KLSAgZWxzZSB7IC8qIEZSQU1FX0xFTl9CWVRFU19JTlQgKi8KLSAgICByZXN1bHQgPSBxdW90OwotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICBmdW5jdGlvbiBuYW1lOmZyYW1lUGFkZGluZwotKiAgZGVzY3JpcHRpb246IENhbGN1bGF0ZXMgaWYgcGFkZGluZyBpcyBuZWVkZWQgZm9yIGFjdHVhbCBmcmFtZQotKiAgcmV0dXJuczogcGFkZGluZ09uIG9yIG5vdAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDE2IGZyYW1lUGFkZGluZyhXb3JkMzIgYml0UmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICpwYWRkaW5nUmVzdCkKLXsKLSAgV29yZDE2IHBhZGRpbmdPbjsKLSAgV29yZDE2IGRpZmZlcmVuY2U7Ci0KLSAgcGFkZGluZ09uID0gMDsKLQotICBkaWZmZXJlbmNlID0gY2FsY0ZyYW1lTGVuKCBiaXRSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9MRU5fQllURVNfTU9EVUxPICk7Ci0gICpwYWRkaW5nUmVzdCA9ICpwYWRkaW5nUmVzdCAtIGRpZmZlcmVuY2U7Ci0KLQotICBpZiAoKnBhZGRpbmdSZXN0IDw9IDAgKSB7Ci0gICAgcGFkZGluZ09uID0gMTsKLSAgICAqcGFkZGluZ1Jlc3QgPSAqcGFkZGluZ1Jlc3QgKyBzYW1wbGVSYXRlOwotICB9Ci0KLSAgcmV0dXJuIHBhZGRpbmdPbjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IFFDT3V0TmV3Ci0qIGRlc2NyaXB0aW9uOiBpbml0IHFjb3V0IHBhcmFtZXRlcgotKiByZXR1cm5zOiAgICAgMCBpZiBzdWNjZXNzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1Xb3JkMTYgUUNPdXROZXcoUUNfT1VUICpoUUMsIFdvcmQxNiBuQ2hhbm5lbHMsIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKQotewotICBXb3JkMzIgaTsKLSAgV29yZDE2ICpxdWFudFNwZWM7Ci0gIFdvcmQxNiAqc2NmOwotICBVV29yZDE2ICptYXhWYWx1ZUluU2ZiOwotCi0gIHF1YW50U3BlYyA9IChXb3JkMTYgKiltZW1fbWFsbG9jKHBNZW1PUCwgbkNoYW5uZWxzICogRlJBTUVfTEVOX0xPTkcgKiBzaXplb2YoV29yZDE2KSwgMzIsIFZPX0lOREVYX0VOQ19BQUMpOwotICBpZihOVUxMID09IHF1YW50U3BlYykKLQkgIHJldHVybiAxOwotICBzY2YgPSAoV29yZDE2ICopbWVtX21hbGxvYyhwTWVtT1AsIG5DaGFubmVscyAqIE1BWF9HUk9VUEVEX1NGQiAqIHNpemVvZihXb3JkMTYpLCAzMiwgVk9fSU5ERVhfRU5DX0FBQyk7Ci0gIGlmKE5VTEwgPT0gc2NmKQotICB7Ci0JICByZXR1cm4gMTsKLSAgfQotICBtYXhWYWx1ZUluU2ZiID0gKFVXb3JkMTYgKiltZW1fbWFsbG9jKHBNZW1PUCwgbkNoYW5uZWxzICogTUFYX0dST1VQRURfU0ZCICogc2l6ZW9mKFVXb3JkMTYpLCAzMiwgVk9fSU5ERVhfRU5DX0FBQyk7Ci0gIGlmKE5VTEwgPT0gbWF4VmFsdWVJblNmYikKLSAgewotCSAgcmV0dXJuIDE7Ci0gIH0KLQotICBmb3IgKGk9MDsgaTxuQ2hhbm5lbHM7IGkrKykgewotICAgIGhRQy0+cWNDaGFubmVsW2ldLnF1YW50U3BlYyA9IHF1YW50U3BlYyArIGkqRlJBTUVfTEVOX0xPTkc7Ci0KLSAgICBoUUMtPnFjQ2hhbm5lbFtpXS5tYXhWYWx1ZUluU2ZiID0gbWF4VmFsdWVJblNmYiArIGkqTUFYX0dST1VQRURfU0ZCOwotCi0gICAgaFFDLT5xY0NoYW5uZWxbaV0uc2NmID0gc2NmICsgaSpNQVhfR1JPVVBFRF9TRkI7Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IFFDT3V0RGVsZXRlCi0qIGRlc2NyaXB0aW9uOiB1bmludCBxY291dCBwYXJhbWV0ZXIKLSogcmV0dXJuczogICAgICAwIGlmIHN1Y2Nlc3MKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFFDT3V0RGVsZXRlKFFDX09VVCogaFFDLCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCkKLXsKLSAgIFdvcmQzMiBpOwotICAgaWYoaFFDKQotICAgewotICAgICAgaWYoaFFDLT5xY0NoYW5uZWxbMF0ucXVhbnRTcGVjKQotCQkgbWVtX2ZyZWUocE1lbU9QLCBoUUMtPnFjQ2hhbm5lbFswXS5xdWFudFNwZWMsIFZPX0lOREVYX0VOQ19BQUMpOwotCi0gICAgICBpZihoUUMtPnFjQ2hhbm5lbFswXS5tYXhWYWx1ZUluU2ZiKQotCQkgIG1lbV9mcmVlKHBNZW1PUCwgaFFDLT5xY0NoYW5uZWxbMF0ubWF4VmFsdWVJblNmYiwgVk9fSU5ERVhfRU5DX0FBQyk7Ci0KLQkgIGlmKGhRQy0+cWNDaGFubmVsWzBdLnNjZikKLQkJICBtZW1fZnJlZShwTWVtT1AsIGhRQy0+cWNDaGFubmVsWzBdLnNjZiwgVk9fSU5ERVhfRU5DX0FBQyk7Ci0KLQkgIGZvciAoaT0wOyBpPE1BWF9DSEFOTkVMUzsgaSsrKSB7Ci0JCSAgaFFDLT5xY0NoYW5uZWxbaV0ucXVhbnRTcGVjID0gTlVMTDsKLQotCQkgIGhRQy0+cWNDaGFubmVsW2ldLm1heFZhbHVlSW5TZmIgPSBOVUxMOwotCi0JCSAgaFFDLT5xY0NoYW5uZWxbaV0uc2NmID0gTlVMTDsKLQkgIH0KLSAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBRQ05ldwotKiBkZXNjcmlwdGlvbjogc2V0IFFDIHRvIHplcm8KLSogcmV0dXJuczogICAgIDAgaWYgc3VjY2VzcwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVdvcmQxNiBRQ05ldyhRQ19TVEFURSAqaFFDLCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCkKLXsKLSAgcE1lbU9QLT5TZXQoVk9fSU5ERVhfRU5DX0FBQywgaFFDLDAsc2l6ZW9mKFFDX1NUQVRFKSk7Ci0KLSAgcmV0dXJuICgwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBRQ0RlbGV0ZQotKiBkZXNjcmlwdGlvbjogdW5pbnQgcWNvdXQgcGFyYW1ldGVyCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBRQ0RlbGV0ZShRQ19TVEFURSAqaFFDLCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCkKLXsKLSAgVU5VU0VEKGhRQyk7Ci0gIFVOVVNFRChwTWVtT1ApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IFFDSW5pdAotKiBkZXNjcmlwdGlvbjogaW5pdCBRRCBwYXJhbWV0ZXIKLSogcmV0dXJuczogICAgIDAgaWYgc3VjY2VzcwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVdvcmQxNiBRQ0luaXQoUUNfU1RBVEUgKmhRQywKLSAgICAgICAgICAgICAgc3RydWN0IFFDX0lOSVQgKmluaXQpCi17Ci0gIGhRQy0+bkNoYW5uZWxzICAgICAgID0gaW5pdC0+ZWxJbmZvLT5uQ2hhbm5lbHNJbkVsOwotICBoUUMtPm1heEJpdHNUb3QgICAgICA9IGluaXQtPm1heEJpdHM7Ci0gIGhRQy0+Yml0UmVzVG90ICAgICAgID0gc3ViKGluaXQtPmJpdFJlcywgaW5pdC0+YXZlcmFnZUJpdHMpOwotICBoUUMtPmF2ZXJhZ2VCaXRzVG90ICA9IGluaXQtPmF2ZXJhZ2VCaXRzOwotICBoUUMtPm1heEJpdEZhYyAgICAgICA9IGluaXQtPm1heEJpdEZhYzsKLQotICBoUUMtPnBhZGRpbmcucGFkZGluZ1Jlc3QgPSBpbml0LT5wYWRkaW5nLnBhZGRpbmdSZXN0OwotCi0gIGhRQy0+Z2xvYlN0YXRCaXRzICAgID0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciBJRF9FTkQgKi8KLQotICAvKiBjaGFubmVsIGVsZW1lbnRzIGluaXQgKi8KLSAgSW5pdEVsZW1lbnRCaXRzKCZoUUMtPmVsZW1lbnRCaXRzLAotICAgICAgICAgICAgICAgICAgKmluaXQtPmVsSW5mbywKLSAgICAgICAgICAgICAgICAgIGluaXQtPmJpdHJhdGUsCi0gICAgICAgICAgICAgICAgICBpbml0LT5hdmVyYWdlQml0cywKLSAgICAgICAgICAgICAgICAgIGhRQy0+Z2xvYlN0YXRCaXRzKTsKLQotICAvKiB0aHJlc2hvbGQgcGFyYW1ldGVyIGluaXQgKi8KLSAgQWRqVGhySW5pdCgmaFFDLT5hZGpUaHIsCi0gICAgICAgICAgICAgaW5pdC0+bWVhblBlLAotICAgICAgICAgICAgIGhRQy0+ZWxlbWVudEJpdHMuY2hCaXRyYXRlKTsKLQotICByZXR1cm4gMDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IFFDTWFpbgotKiBkZXNjcmlwdGlvbjogIHF1YW50aXphdGlvbiBhbmQgY29kaW5nIHRoZSBzcGVjdHJ1bQotKiByZXR1cm5zOiAgICAgIDAgaWYgc3VjY2VzcwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVdvcmQxNiBRQ01haW4oUUNfU1RBVEUqIGhRQywKLSAgICAgICAgICAgICAgRUxFTUVOVF9CSVRTKiBlbEJpdHMsCi0gICAgICAgICAgICAgIEFUU19FTEVNRU5UKiBhZGpUaHJTdGF0ZUVsZW1lbnQsCi0gICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLCAgLyogbWF5IGJlIG1vZGlmaWVkIGluLXBsYWNlICovCi0gICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCogcHN5T3V0RWxlbWVudCwKLSAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwgIHFjT3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLCAgICAvKiBvdXQgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqIHFjT3V0RWxlbWVudCwKLSAgICAgICAgICAgICAgV29yZDE2IG5DaGFubmVscywKLQkJCSAgV29yZDE2IGFuY2lsbGFyeURhdGFCeXRlcykKLXsKLSAgV29yZDE2IG1heENoRHluQml0c1tNQVhfQ0hBTk5FTFNdOwotICBXb3JkMTYgY2hCaXREaXN0cmlidXRpb25bTUFYX0NIQU5ORUxTXTsKLSAgV29yZDMyIGNoOwotCi0gIGlmIChlbEJpdHMtPmJpdFJlc0xldmVsIDwgMCkgewotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIGlmIChlbEJpdHMtPmJpdFJlc0xldmVsID4gZWxCaXRzLT5tYXhCaXRSZXNCaXRzKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgcWNPdXRFbGVtZW50LT5zdGF0aWNCaXRzVXNlZCA9IGNvdW50U3RhdGljQml0ZGVtYW5kKHBzeU91dENoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLAotCQkJCQkJCQkJCQkJCSAgcWNPdXRFbGVtZW50LT5hZHRzVXNlZCk7Ci0KLQotICBpZiAoYW5jaWxsYXJ5RGF0YUJ5dGVzKSB7Ci0gICAgcWNPdXRFbGVtZW50LT5hbmNCaXRzVXNlZCA9IDcgKyAoYW5jaWxsYXJ5RGF0YUJ5dGVzIDw8IDMpOwotCi0gICAgaWYgKGFuY2lsbGFyeURhdGFCeXRlcyA+PSAxNSkKLSAgICAgIHFjT3V0RWxlbWVudC0+YW5jQml0c1VzZWQgPSBxY091dEVsZW1lbnQtPmFuY0JpdHNVc2VkICsgODsKLSAgfQotICBlbHNlIHsKLSAgICBxY091dEVsZW1lbnQtPmFuY0JpdHNVc2VkID0gMDsKLSAgfQotCi0gIENhbGNGb3JtRmFjdG9yKGhRQy0+bG9nU2ZiRm9ybUZhY3RvciwgaFFDLT5zZmJOUmVsZXZhbnRMaW5lcywgaFFDLT5sb2dTZmJFbmVyZ3ksIHBzeU91dENoYW5uZWwsIG5DaGFubmVscyk7Ci0KLSAgLyphZGp1c3QgdGhyZXNob2xkcyBmb3IgdGhlIGRlc2lyZWQgYml0cmF0ZSAqLwotICBBZGp1c3RUaHJlc2hvbGRzKCZoUUMtPmFkalRociwKLSAgICAgICAgICAgICAgICAgICBhZGpUaHJTdGF0ZUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgIGNoQml0RGlzdHJpYnV0aW9uLAotICAgICAgICAgICAgICAgICAgIGhRQy0+bG9nU2ZiRW5lcmd5LAotICAgICAgICAgICAgICAgICAgIGhRQy0+c2ZiTlJlbGV2YW50TGluZXMsCi0gICAgICAgICAgICAgICAgICAgcWNPdXRFbGVtZW50LAotCQkJCSAgIGVsQml0cywKLQkJCQkgICBuQ2hhbm5lbHMsCi0JCQkJICAgaFFDLT5tYXhCaXRGYWMpOwotCi0gIC8qZXN0aW1hdGUgc2NhbGUgZmFjdG9ycyAqLwotICBFc3RpbWF0ZVNjYWxlRmFjdG9ycyhwc3lPdXRDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgIGhRQy0+bG9nU2ZiRW5lcmd5LAotICAgICAgICAgICAgICAgICAgICAgICBoUUMtPmxvZ1NmYkZvcm1GYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgIGhRQy0+c2ZiTlJlbGV2YW50TGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVscyk7Ci0KLSAgLyogY29uZGl0aW9uIHRvIHByZXZlbnQgZW1wdHkgYml0cmVzZXJ2b2lyICovCi0gIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykgewotICAgIFdvcmQzMiBtYXhEeW5CaXRzOwotICAgIG1heER5bkJpdHMgPSBlbEJpdHMtPmF2ZXJhZ2VCaXRzICsgZWxCaXRzLT5iaXRSZXNMZXZlbCAtIDc7IC8qIC03IGJlYy4gb2YgYWxpZ24gYml0cyAqLwotICAgIG1heER5bkJpdHMgPSBtYXhEeW5CaXRzIC0gcWNPdXRFbGVtZW50LT5zdGF0aWNCaXRzVXNlZCArIHFjT3V0RWxlbWVudC0+YW5jQml0c1VzZWQ7Ci0gICAgbWF4Q2hEeW5CaXRzW2NoXSA9IGV4dHJhY3RfbChjaEJpdERpc3RyaWJ1dGlvbltjaF0gKiBtYXhEeW5CaXRzIC8gMTAwMCk7Ci0gIH0KLQotICBxY091dEVsZW1lbnQtPmR5bkJpdHNVc2VkID0gMDsKLSAgZm9yIChjaCA9IDA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgV29yZDMyIGNoRHluQml0czsKLSAgICBGbGFnICAgY29uc3RyYWludHNGdWxmaWxsZWQ7Ci0gICAgV29yZDMyIGl0ZXI7Ci0gICAgaXRlciA9IDA7Ci0gICAgZG8gewotICAgICAgY29uc3RyYWludHNGdWxmaWxsZWQgPSAxOwotCi0gICAgICBRdWFudGl6ZVNwZWN0cnVtKHBzeU91dENoYW5uZWxbY2hdLnNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0ubWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLnNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS5zZmJPZmZzZXRzLAotICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS5tZGN0U3BlY3RydW0sCi0gICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0uZ2xvYmFsR2FpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS5zY2YsCi0gICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0ucXVhbnRTcGVjKTsKLQotICAgICAgaWYgKGNhbGNNYXhWYWx1ZUluU2ZiKHBzeU91dENoYW5uZWxbY2hdLnNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS5tYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS5zZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS5zZmJPZmZzZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0ucXVhbnRTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0ubWF4VmFsdWVJblNmYikgPiBNQVhfUVVBTlQpIHsKLSAgICAgICAgY29uc3RyYWludHNGdWxmaWxsZWQgPSAwOwotICAgICAgfQotCi0gICAgICBjaER5bkJpdHMgPSBkeW5CaXRDb3VudChxY091dENoYW5uZWxbY2hdLnF1YW50U3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0ubWF4VmFsdWVJblNmYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0uc2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0ud2luZG93U2VxdWVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS5zZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS5tYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLnNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0uc2ZiT2Zmc2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY091dENoYW5uZWxbY2hdLnNlY3Rpb25EYXRhKTsKLQotICAgICAgaWYgKGNoRHluQml0cyA+PSBtYXhDaER5bkJpdHNbY2hdKSB7Ci0gICAgICAgIGNvbnN0cmFpbnRzRnVsZmlsbGVkID0gMDsKLSAgICAgIH0KLQotICAgICAgaWYgKCFjb25zdHJhaW50c0Z1bGZpbGxlZCkgewotICAgICAgICBxY091dENoYW5uZWxbY2hdLmdsb2JhbEdhaW4gPSBxY091dENoYW5uZWxbY2hdLmdsb2JhbEdhaW4gKyAxOwotICAgICAgfQotCi0gICAgICBpdGVyID0gaXRlciArIDE7Ci0KLSAgICB9IHdoaWxlKCFjb25zdHJhaW50c0Z1bGZpbGxlZCk7Ci0KLSAgICBxY091dEVsZW1lbnQtPmR5bkJpdHNVc2VkID0gcWNPdXRFbGVtZW50LT5keW5CaXRzVXNlZCArIGNoRHluQml0czsKLQotICAgIHFjT3V0Q2hhbm5lbFtjaF0ubWRjdFNjYWxlICAgID0gcHN5T3V0Q2hhbm5lbFtjaF0ubWRjdFNjYWxlOwotICAgIHFjT3V0Q2hhbm5lbFtjaF0uZ3JvdXBpbmdNYXNrID0gcHN5T3V0Q2hhbm5lbFtjaF0uZ3JvdXBpbmdNYXNrOwotICAgIHFjT3V0Q2hhbm5lbFtjaF0ud2luZG93U2hhcGUgID0gcHN5T3V0Q2hhbm5lbFtjaF0ud2luZG93U2hhcGU7Ci0gIH0KLQotICAvKiBzYXZlIGR5bkJpdHNVc2VkIGZvciBjb3JyZWN0aW9uIG9mIGJpdHMycGUgcmVsYXRpb24gKi8KLSAgQWRqVGhyVXBkYXRlKGFkalRoclN0YXRlRWxlbWVudCwgcWNPdXRFbGVtZW50LT5keW5CaXRzVXNlZCk7Ci0KLSAgewotICAgIFdvcmQxNiBiaXRSZXNTcGFjZSA9IGVsQml0cy0+bWF4Qml0UmVzQml0cyAtIGVsQml0cy0+Yml0UmVzTGV2ZWw7Ci0gICAgV29yZDE2IGRlbHRhQml0UmVzID0gZWxCaXRzLT5hdmVyYWdlQml0cyAtCi0gICAgICAgICAgICAgICAgICAgICAgICAocWNPdXRFbGVtZW50LT5zdGF0aWNCaXRzVXNlZCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRFbGVtZW50LT5keW5CaXRzVXNlZCArIHFjT3V0RWxlbWVudC0+YW5jQml0c1VzZWQpOwotCi0gICAgcWNPdXRFbGVtZW50LT5maWxsQml0cyA9IG1heCgwLCAoZGVsdGFCaXRSZXMgLSBiaXRSZXNTcGFjZSkpOwotICB9Ci0KLSAgcmV0dXJuIDA7IC8qIE9LICovCi19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBjYWxjTWF4VmFsdWVJblNmYgotKiBkZXNjcmlwdGlvbjogIHNlYXJjaCB0aGUgbWF4IFNwZWN0cnVtIGluIG9uZSBzZmIKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDE2IGNhbGNNYXhWYWx1ZUluU2ZiKFdvcmQxNiBzZmJDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBtYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgc2ZiT2Zmc2V0W01BWF9HUk9VUEVEX1NGQl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBxdWFudFNwZWN0cnVtW0ZSQU1FX0xFTl9MT05HXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVdvcmQxNiBtYXhWYWx1ZVtNQVhfR1JPVVBFRF9TRkJdKQotewotICBXb3JkMTYgc2ZiT2Zmcywgc2ZiOwotICBXb3JkMTYgbWF4VmFsdWVBbGw7Ci0KLSAgbWF4VmFsdWVBbGwgPSAwOwotCi0gIGZvcihzZmJPZmZzPTA7c2ZiT2ZmczxzZmJDbnQ7c2ZiT2Zmcys9c2ZiUGVyR3JvdXApIHsKLSAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IG1heFNmYlBlckdyb3VwOyBzZmIrKykgewotICAgICAgV29yZDE2IGxpbmU7Ci0gICAgICBXb3JkMTYgbWF4VGhpc1NmYjsKLSAgICAgIG1heFRoaXNTZmIgPSAwOwotCi0gICAgICBmb3IgKGxpbmUgPSBzZmJPZmZzZXRbc2ZiT2ZmcytzZmJdOyBsaW5lIDwgc2ZiT2Zmc2V0W3NmYk9mZnMrc2ZiKzFdOyBsaW5lKyspIHsKLSAgICAgICAgV29yZDE2IGFic1ZhbDsKLSAgICAgICAgYWJzVmFsID0gYWJzX3MocXVhbnRTcGVjdHJ1bVtsaW5lXSk7Ci0gICAgICAgIG1heFRoaXNTZmIgPSBtYXgobWF4VGhpc1NmYiwgYWJzVmFsKTsKLSAgICAgIH0KLQotICAgICAgbWF4VmFsdWVbc2ZiT2ZmcytzZmJdID0gbWF4VGhpc1NmYjsKLSAgICAgIG1heFZhbHVlQWxsID0gbWF4KG1heFZhbHVlQWxsLCBtYXhUaGlzU2ZiKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG1heFZhbHVlQWxsOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogdXBkYXRlQml0cmVzCi0qIGRlc2NyaXB0aW9uOiB1cGRhdGUgYml0cmVzZXJ2b2lyCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB1cGRhdGVCaXRyZXMoUUNfU1RBVEUqIHFjS2VybmVsLAotICAgICAgICAgICAgICAgICAgUUNfT1VUKiAgIHFjT3V0KQotCi17Ci0gIEVMRU1FTlRfQklUUyAqZWxCaXRzOwotCi0gIHFjS2VybmVsLT5iaXRSZXNUb3QgPSAwOwotCi0gIGVsQml0cyA9ICZxY0tlcm5lbC0+ZWxlbWVudEJpdHM7Ci0KLQotICBpZiAoZWxCaXRzLT5hdmVyYWdlQml0cyA+IDApIHsKLSAgICAvKiBjb25zdGFudCBiaXRyYXRlICovCi0gICAgV29yZDE2IGJpdHNVc2VkOwotICAgIGJpdHNVc2VkID0gKHFjT3V0LT5xY0VsZW1lbnQuc3RhdGljQml0c1VzZWQgKyBxY091dC0+cWNFbGVtZW50LmR5bkJpdHNVc2VkKSArCi0gICAgICAgICAgICAgICAgICAgKHFjT3V0LT5xY0VsZW1lbnQuYW5jQml0c1VzZWQgKyBxY091dC0+cWNFbGVtZW50LmZpbGxCaXRzKTsKLSAgICBlbEJpdHMtPmJpdFJlc0xldmVsID0gZWxCaXRzLT5iaXRSZXNMZXZlbCArIChlbEJpdHMtPmF2ZXJhZ2VCaXRzIC0gYml0c1VzZWQpOwotICAgIHFjS2VybmVsLT5iaXRSZXNUb3QgPSBxY0tlcm5lbC0+Yml0UmVzVG90ICsgZWxCaXRzLT5iaXRSZXNMZXZlbDsKLSAgfQotICBlbHNlIHsKLSAgICAvKiB2YXJpYWJsZSBiaXRyYXRlICovCi0gICAgZWxCaXRzLT5iaXRSZXNMZXZlbCA9IGVsQml0cy0+bWF4Qml0czsKLSAgICBxY0tlcm5lbC0+Yml0UmVzVG90ID0gcWNLZXJuZWwtPm1heEJpdHNUb3Q7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBGaW5hbGl6ZUJpdENvbnN1bXB0aW9uCi0qIGRlc2NyaXB0aW9uOiBjb3VudCBiaXRzIHVzZWQKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1Xb3JkMTYgRmluYWxpemVCaXRDb25zdW1wdGlvbihRQ19TVEFURSAqcWNLZXJuZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQqIHFjT3V0KQotewotICBXb3JkMzIgbkZ1bGxGaWxsRWxlbTsKLSAgV29yZDMyIHRvdEZpbGxCaXRzOwotICBXb3JkMTYgZGlmZkJpdHM7Ci0gIFdvcmQxNiBiaXRzVXNlZDsKLQotICB0b3RGaWxsQml0cyA9IDA7Ci0KLSAgcWNPdXQtPnRvdFN0YXRpY0JpdHNVc2VkID0gcWNLZXJuZWwtPmdsb2JTdGF0Qml0czsKLSAgcWNPdXQtPnRvdFN0YXRpY0JpdHNVc2VkICs9IHFjT3V0LT5xY0VsZW1lbnQuc3RhdGljQml0c1VzZWQ7Ci0gIHFjT3V0LT50b3REeW5CaXRzVXNlZCAgICA9IHFjT3V0LT5xY0VsZW1lbnQuZHluQml0c1VzZWQ7Ci0gIHFjT3V0LT50b3RBbmNCaXRzVXNlZCAgICA9IHFjT3V0LT5xY0VsZW1lbnQuYW5jQml0c1VzZWQ7Ci0gIHFjT3V0LT50b3RGaWxsQml0cyAgICAgICA9IHFjT3V0LT5xY0VsZW1lbnQuZmlsbEJpdHM7Ci0KLSAgaWYgKHFjT3V0LT5xY0VsZW1lbnQuZmlsbEJpdHMpIHsKLSAgICB0b3RGaWxsQml0cyArPSBxY091dC0+cWNFbGVtZW50LmZpbGxCaXRzOwotICB9Ci0KLSAgbkZ1bGxGaWxsRWxlbSA9IChtYXgoKHFjT3V0LT50b3RGaWxsQml0cyAtIDEpLCAwKSAvIG1heEZpbGxFbGVtQml0cykgKiBtYXhGaWxsRWxlbUJpdHM7Ci0KLSAgcWNPdXQtPnRvdEZpbGxCaXRzID0gcWNPdXQtPnRvdEZpbGxCaXRzIC0gbkZ1bGxGaWxsRWxlbTsKLQotICAvKiBjaGVjayBmaWxsIGVsZW1lbnRzICovCi0KLSAgaWYgKHFjT3V0LT50b3RGaWxsQml0cyA+IDApIHsKLSAgICAvKiBtaW5pbXVtIEZpbGxlbGVtZW50IGNvbnRhaW5zIDcgKFRBRyArIGJ5dGUgY250KSBiaXRzICovCi0gICAgcWNPdXQtPnRvdEZpbGxCaXRzID0gbWF4KDcsIHFjT3V0LT50b3RGaWxsQml0cyk7Ci0gICAgLyogZmlsbCBlbGVtZW50IHNpemUgZXF1YWxzIG4qOCArIDcgKi8KLSAgICBxY091dC0+dG90RmlsbEJpdHMgPSBxY091dC0+dG90RmlsbEJpdHMgKyAoKDggLSAoKHFjT3V0LT50b3RGaWxsQml0cyAtIDcpICYgMHgwMDA3KSkgJiAweDAwMDcpOwotICB9Ci0KLSAgcWNPdXQtPnRvdEZpbGxCaXRzID0gcWNPdXQtPnRvdEZpbGxCaXRzICsgbkZ1bGxGaWxsRWxlbTsKLQotICAvKiBub3cgZGlzdHJpYnV0ZSBleHRyYSBmaWxsYml0cyBhbmQgYWxpZ25iaXRzIG92ZXIgY2hhbm5lbCBlbGVtZW50cyAqLwotICBxY091dC0+YWxpZ25CaXRzID0gNyAtICgocWNPdXQtPnRvdER5bkJpdHNVc2VkICsgcWNPdXQtPnRvdFN0YXRpY0JpdHNVc2VkICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0LT50b3RBbmNCaXRzVXNlZCArIHFjT3V0LT50b3RGaWxsQml0cyAtIDEpICYgMHgwMDA3KTsKLQotCi0gIGlmICggKHFjT3V0LT5hbGlnbkJpdHMgKyBxY091dC0+dG90RmlsbEJpdHMgLSB0b3RGaWxsQml0cyA9PSA4KSAmJgotICAgICAgIChxY091dC0+dG90RmlsbEJpdHMgPiA4KSkKLSAgICBxY091dC0+dG90RmlsbEJpdHMgPSBxY091dC0+dG90RmlsbEJpdHMgLSA4OwotCi0KLSAgZGlmZkJpdHMgPSBxY091dC0+YWxpZ25CaXRzICsgcWNPdXQtPnRvdEZpbGxCaXRzIC0gdG90RmlsbEJpdHM7Ci0KLSAgaWYoZGlmZkJpdHM+PTApIHsKLSAgICBxY091dC0+cWNFbGVtZW50LmZpbGxCaXRzICs9IGRpZmZCaXRzOwotICB9Ci0KLSAgYml0c1VzZWQgPSBxY091dC0+dG90RHluQml0c1VzZWQgKyBxY091dC0+dG90U3RhdGljQml0c1VzZWQgKyBxY091dC0+dG90QW5jQml0c1VzZWQ7Ci0gIGJpdHNVc2VkID0gYml0c1VzZWQgKyBxY091dC0+dG90RmlsbEJpdHMgKyBxY091dC0+YWxpZ25CaXRzOwotCi0gIGlmIChiaXRzVXNlZCA+IHFjS2VybmVsLT5tYXhCaXRzVG90KSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHJldHVybiBiaXRzVXNlZDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IEFkanVzdEJpdHJhdGUKLSogZGVzY3JpcHRpb246ICBhZGp1c3RzIGZyYW1lbGVuZ3RoIHZpYSBwYWRkaW5nIG9uIGEgZnJhbWUgdG8gZnJhbWUgYmFzaXMsCi0qICAgICAgICAgICAgICAgdG8gYWNoaWV2ZSBhIGJpdHJhdGUgdGhhdCBkZW1hbmRzIGEgbm9uIGJ5dGUgYWxpZ25lZAotKiAgICAgICAgICAgICAgIGZyYW1lbGVuZ3RoCi0qIHJldHVybjogICAgICAgZXJyb3Jjb2RlCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotV29yZDE2IEFkanVzdEJpdHJhdGUoUUNfU1RBVEUgICAgICAgICpoUUMsCi0gICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgICAgIGJpdFJhdGUsICAgIC8qIHRvdGFsIGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAgICAgc2FtcGxlUmF0ZSkgLyogb3V0cHV0IHNhbXBsaW5nIHJhdGUgKi8KLXsKLSAgV29yZDE2IHBhZGRpbmdPbjsKLSAgV29yZDE2IGZyYW1lTGVuOwotICBXb3JkMTYgY29kZUJpdHM7Ci0gIFdvcmQxNiBjb2RlQml0c0xhc3Q7Ci0KLSAgLyogRG8gd2UgbmVlZCBhIGV4dHJhIHBhZGRpbmcgYnl0ZT8gKi8KLSAgcGFkZGluZ09uID0gZnJhbWVQYWRkaW5nKGJpdFJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhRQy0+cGFkZGluZy5wYWRkaW5nUmVzdCk7Ci0KLSAgLyogZnJhbWUgbGVuZ3RoICovCi0gIGZyYW1lTGVuID0gcGFkZGluZ09uICsgY2FsY0ZyYW1lTGVuKGJpdFJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX0xFTl9CWVRFU19JTlQpOwotCi0gIGZyYW1lTGVuID0gZnJhbWVMZW4gPDwgMzsKLSAgY29kZUJpdHNMYXN0ID0gaFFDLT5hdmVyYWdlQml0c1RvdCAtIGhRQy0+Z2xvYlN0YXRCaXRzOwotICBjb2RlQml0cyAgICAgPSBmcmFtZUxlbiAtIGhRQy0+Z2xvYlN0YXRCaXRzOwotCi0gIC8qIGNhbGN1bGF0ZSBiaXRzIGZvciBldmVyeSBjaGFubmVsIGVsZW1lbnQgKi8KLSAgaWYgKGNvZGVCaXRzICE9IGNvZGVCaXRzTGFzdCkgewotICAgIFdvcmQxNiB0b3RhbEJpdHMgPSAwOwotCi0gICAgaFFDLT5lbGVtZW50Qml0cy5hdmVyYWdlQml0cyA9IChoUUMtPmVsZW1lbnRCaXRzLnJlbGF0aXZlQml0cyAqIGNvZGVCaXRzKSA+PiAxNjsgLyogcmVsYXRpdmVCaXRzIHdhcyBzY2FsZWQgZG93biBieSAyICovCi0gICAgdG90YWxCaXRzICs9IGhRQy0+ZWxlbWVudEJpdHMuYXZlcmFnZUJpdHM7Ci0KLSAgICBoUUMtPmVsZW1lbnRCaXRzLmF2ZXJhZ2VCaXRzID0gaFFDLT5lbGVtZW50Qml0cy5hdmVyYWdlQml0cyArIChjb2RlQml0cyAtIHRvdGFsQml0cyk7Ci0gIH0KLQotICBoUUMtPmF2ZXJhZ2VCaXRzVG90ID0gZnJhbWVMZW47Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9xdWFudGl6ZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcXVhbnRpemUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQwZjU1MC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9xdWFudGl6ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQ1ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJcXVhbnRpemUuYwotCi0JQ29udGVudDoJcXVhbnRpemF0aW9uIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAidHlwZWRlZi5oIgotI2luY2x1ZGUgImJhc2ljX29wLmgiCi0jaW5jbHVkZSAib3Blcl8zMmIuaCIKLSNpbmNsdWRlICJxdWFudGl6ZS5oIgotI2luY2x1ZGUgImFhY19yb20uaCIKLQotI2RlZmluZSBNQU5UX0RJR0lUUyA5Ci0jZGVmaW5lIE1BTlRfU0laRSAgICgxPDxNQU5UX0RJR0lUUykKLQotc3RhdGljIGNvbnN0IFdvcmQzMiBYUk9VTkQgPSAweDMzZTQyNWFmOyAvKiBmaW5hbCByb3VuZGluZyBjb25zdGFudCAoLTAuMDk0NmYrIDAuNWYpICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6cG93MzQKLSogZGVzY3JpcHRpb246IGNhbGN1bGF0ZSAkeF57XGZyYWN7M317NH19LCBmb3IgMC41IDwgeCA8IDEuMCQuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLV9faW5saW5lIFdvcmQzMiBwb3czNChXb3JkMzIgeCkKLXsKLSAgLyogaW5kZXggdGFibGUgdXNpbmcgTUFOVF9ESUdJVFMgYml0cywgYnV0IG1hc2sgb3V0IHRoZSBzaWduIGJpdCBhbmQgdGhlIE1TQgotICAgICB3aGljaCBpcyBhbHdheXMgb25lICovCi0gIHJldHVybiBtVGFiXzNfNFsoeCA+PiAoSU5UX0JJVFMtMi1NQU5UX0RJR0lUUykpICYgKE1BTlRfU0laRS0xKV07Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6cXVhbnRpemVTaW5nbGVMaW5lCi0qIGRlc2NyaXB0aW9uOiBxdWFudGl6ZXMgc3BlY3RydW0KLSogICAgICAgICAgICAgIHF1YVNwZWN0cnVtID0gbWRjdFNwZWN0cnVtXjMvNCoyXigtKDMvMTYpKmdhaW4pCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBXb3JkMTYgcXVhbnRpemVTaW5nbGVMaW5lKGNvbnN0IFdvcmQxNiBnYWluLCBjb25zdCBXb3JkMzIgYWJzU3BlY3RydW0pCi17Ci0gIFdvcmQzMiBlLCBtaW51c0ZpbmFsRXhwLCBmaW5hbFNoaWZ0OwotICBXb3JkMzIgeDsKLSAgV29yZDE2IHF1YSA9IDA7Ci0KLQotICBpZiAoYWJzU3BlY3RydW0pIHsKLSAgICBlID0gbm9ybV9sKGFic1NwZWN0cnVtKTsKLSAgICB4ID0gcG93MzQoYWJzU3BlY3RydW0gPDwgZSk7Ci0KLSAgICAvKiBjYWxjdWxhdGUgdGhlIGZpbmFsIGZyYWN0aW9uYWwgZXhwb25lbnQgdGltZXMgMTYgKHdhcyAzKig0KmUgKyBnYWluKSArIChJTlRfQklUUy0xKSoxNikgKi8KLSAgICBtaW51c0ZpbmFsRXhwID0gKGUgPDwgMikgKyBnYWluOwotICAgIG1pbnVzRmluYWxFeHAgPSAobWludXNGaW5hbEV4cCA8PCAxKSArIG1pbnVzRmluYWxFeHA7Ci0gICAgbWludXNGaW5hbEV4cCA9IG1pbnVzRmluYWxFeHAgKyAoKElOVF9CSVRTLTEpIDw8IDQpOwotCi0gICAgLyogc2VwYXJhdGUgdGhlIGV4cG9uZW50IGludG8gYSBzaGlmdCwgYW5kIGEgbXVsdGlwbHkgKi8KLSAgICBmaW5hbFNoaWZ0ID0gbWludXNGaW5hbEV4cCA+PiA0OwotCi0gICAgaWYgKGZpbmFsU2hpZnQgPCBJTlRfQklUUykgewotICAgICAgeCA9IExfbXB5X3d4KHgsIHBvdzJ0b21pbnVzTm92ZXIxNlttaW51c0ZpbmFsRXhwICYgMTVdKTsKLQotICAgICAgeCArPSBYUk9VTkQgPj4gKElOVF9CSVRTIC0gZmluYWxTaGlmdCk7Ci0KLSAgICAgIC8qIHNoaWZ0IGFuZCBxdWFudGl6ZSAqLwotCSAgZmluYWxTaGlmdC0tOwotCi0JICBpZihmaW5hbFNoaWZ0ID49IDApCi0JCSAgeCA+Pj0gZmluYWxTaGlmdDsKLQkgIGVsc2UKLQkJICB4IDw8PSAoLWZpbmFsU2hpZnQpOwotCi0JICBxdWEgPSBzYXR1cmF0ZSh4KTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gcXVhOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTpxdWFudGl6ZUxpbmVzCi0qIGRlc2NyaXB0aW9uOiBxdWFudGl6ZXMgc3BlY3RydW0gbGluZXMKLSogICAgICAgICAgICAgIHF1YVNwZWN0cnVtID0gbWRjdFNwZWN0cnVtXjMvNCoyXigtKDMvMTYpKmdhaW4pCi0qICBpbnB1dDogZ2xvYmFsIGdhaW4sIG51bWJlciBvZiBsaW5lcyB0byBwcm9jZXNzLCBzcGVjdHJhbCBkYXRhCi0qICBvdXRwdXQ6IHF1YW50aXplZCBzcGVjdHJ1bQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBxdWFudGl6ZUxpbmVzKGNvbnN0IFdvcmQxNiBnYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbm9PZkxpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgKm1kY3RTcGVjdHJ1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpxdWFTcGVjdHJ1bSkKLXsKLSAgV29yZDMyIGxpbmU7Ci0gIFdvcmQzMiBtID0gZ2FpbiYzOwotICBXb3JkMzIgZyA9IChnYWluID4+IDIpICsgNDsKLSAgV29yZDMyIG1kY3RTcGVMOwotICBjb25zdCBXb3JkMTYgKnBxdWF0OwotICAgIC8qIGdhaW4mMyAqLwotCi0gIHBxdWF0ID0gcXVhbnRCb3JkZXJzW21dOwotCi0gIGcgKz0gMTY7Ci0KLSAgaWYoZyA+PSAwKQotICB7Ci0JZm9yIChsaW5lPTA7IGxpbmU8bm9PZkxpbmVzOyBsaW5lKyspIHsKLQkgIFdvcmQzMiBxdWE7Ci0JICBxdWEgPSAwOwotCi0JICBtZGN0U3BlTCA9IG1kY3RTcGVjdHJ1bVtsaW5lXTsKLQotCSAgaWYgKG1kY3RTcGVMKSB7Ci0JCVdvcmQzMiBzYTsKLQkJV29yZDMyIHNhU2hmdDsKLQotICAgICAgICBzYSA9IExfYWJzKG1kY3RTcGVMKTsKLSAgICAgICAgLy9zYVNoZnQgPSBMX3NocihzYSwgMTYgKyBnKTsKLQkgICAgc2FTaGZ0ID0gc2EgPj4gZzsKLQotICAgICAgICBpZiAoc2FTaGZ0ID4gcHF1YXRbMF0pIHsKLQotICAgICAgICAgIGlmIChzYVNoZnQgPCBwcXVhdFsxXSkgewotCi0gICAgICAgICAgICBxdWEgPSBtZGN0U3BlTD4wID8gMSA6IC0xOwotCQkgIH0KLSAgICAgICAgICBlbHNlIHsKLQotICAgICAgICAgICAgaWYgKHNhU2hmdCA8IHBxdWF0WzJdKSB7Ci0KLSAgICAgICAgICAgICAgcXVhID0gbWRjdFNwZUw+MCA/IDIgOiAtMjsKLQkJCX0KLSAgICAgICAgICAgIGVsc2UgewotCi0gICAgICAgICAgICAgIGlmIChzYVNoZnQgPCBwcXVhdFszXSkgewotCi0gICAgICAgICAgICAgICAgcXVhID0gbWRjdFNwZUw+MCA/IDMgOiAtMzsKLQkJCSAgfQotICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBxdWEgPSBxdWFudGl6ZVNpbmdsZUxpbmUoZ2Fpbiwgc2EpOwotICAgICAgICAgICAgICAgIC8qIGFkanVzdCB0aGUgc2lnbi4gU2luY2UgMCA8IHF1YSA8IDEsIHRoaXMgY2Fubm90IG92ZXJmbG93LiAqLwotCi0gICAgICAgICAgICAgICAgaWYgKG1kY3RTcGVMIDwgMCkKLSAgICAgICAgICAgICAgICAgIHF1YSA9IC1xdWE7Ci0JCQkgIH0KLQkJCX0KLQkJICB9Ci0JCX0KLQkgIH0KLSAgICAgIHF1YVNwZWN0cnVtW2xpbmVdID0gcXVhIDsKLQl9Ci0gIH0KLSAgZWxzZQotICB7Ci0JZm9yIChsaW5lPTA7IGxpbmU8bm9PZkxpbmVzOyBsaW5lKyspIHsKLQkgIFdvcmQzMiBxdWE7Ci0JICBxdWEgPSAwOwotCi0JICBtZGN0U3BlTCA9IG1kY3RTcGVjdHJ1bVtsaW5lXTsKLQotCSAgaWYgKG1kY3RTcGVMKSB7Ci0JCVdvcmQzMiBzYTsKLQkJV29yZDMyIHNhU2hmdDsKLQotICAgICAgICBzYSA9IExfYWJzKG1kY3RTcGVMKTsKLSAgICAgICAgc2FTaGZ0ID0gc2EgPDwgZzsKLQotICAgICAgICBpZiAoc2FTaGZ0ID4gcHF1YXRbMF0pIHsKLQotICAgICAgICAgIGlmIChzYVNoZnQgPCBwcXVhdFsxXSkgewotCi0gICAgICAgICAgICBxdWEgPSBtZGN0U3BlTD4wID8gMSA6IC0xOwotCQkgIH0KLSAgICAgICAgICBlbHNlIHsKLQotICAgICAgICAgICAgaWYgKHNhU2hmdCA8IHBxdWF0WzJdKSB7Ci0KLSAgICAgICAgICAgICAgcXVhID0gbWRjdFNwZUw+MCA/IDIgOiAtMjsKLQkJCX0KLSAgICAgICAgICAgIGVsc2UgewotCi0gICAgICAgICAgICAgIGlmIChzYVNoZnQgPCBwcXVhdFszXSkgewotCi0gICAgICAgICAgICAgICAgcXVhID0gbWRjdFNwZUw+MCA/IDMgOiAtMzsKLQkJCSAgfQotICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBxdWEgPSBxdWFudGl6ZVNpbmdsZUxpbmUoZ2Fpbiwgc2EpOwotICAgICAgICAgICAgICAgIC8qIGFkanVzdCB0aGUgc2lnbi4gU2luY2UgMCA8IHF1YSA8IDEsIHRoaXMgY2Fubm90IG92ZXJmbG93LiAqLwotCi0gICAgICAgICAgICAgICAgaWYgKG1kY3RTcGVMIDwgMCkKLSAgICAgICAgICAgICAgICAgIHF1YSA9IC1xdWE7Ci0JCQkgIH0KLQkJCX0KLQkJICB9Ci0JCX0KLQkgIH0KLSAgICAgIHF1YVNwZWN0cnVtW2xpbmVdID0gcXVhIDsKLQl9Ci0gIH0KLQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOmlxdWFudGl6ZUxpbmVzCi0qIGRlc2NyaXB0aW9uOiBpcXVhbnRpemVzIHNwZWN0cnVtIGxpbmVzIHdpdGhvdXQgc2lnbgotKiAgICAgICAgICAgICAgbWRjdFNwZWN0cnVtID0gaXF1YVNwZWN0cnVtXjQvMyAqMl4oMC4yNSpnYWluKQotKiBpbnB1dDogZ2xvYmFsIGdhaW4sIG51bWJlciBvZiBsaW5lcyB0byBwcm9jZXNzLHF1YW50aXplZCBzcGVjdHJ1bQotKiBvdXRwdXQ6IHNwZWN0cmFsIGRhdGEKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgaXF1YW50aXplTGluZXMoY29uc3QgV29yZDE2IGdhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbm9PZkxpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICpxdWFudFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICptZGN0U3BlY3RydW0pCi17Ci0gIFdvcmQzMiAgIGlxdWFudGl6ZXJtb2Q7Ci0gIFdvcmQzMiAgIGlxdWFudGl6ZXJzaGlmdDsKLSAgV29yZDMyICAgbGluZTsKLQotICBpcXVhbnRpemVybW9kID0gZ2FpbiAmIDM7Ci0gIGlxdWFudGl6ZXJzaGlmdCA9IGdhaW4gPj4gMjsKLQotICBmb3IgKGxpbmU9MDsgbGluZTxub09mTGluZXM7IGxpbmUrKykgewotCi0gICAgaWYoIHF1YW50U3BlY3RydW1bbGluZV0gIT0gMCApIHsKLSAgICAgIFdvcmQzMiBhY2N1OwotICAgICAgV29yZDMyIGV4OwotCSAgV29yZDMyIHRhYkluZGV4OwotICAgICAgV29yZDMyIHNwZWNFeHA7Ci0gICAgICBXb3JkMzIgcyx0OwotCi0gICAgICBhY2N1ID0gcXVhbnRTcGVjdHJ1bVtsaW5lXTsKLQotICAgICAgZXggPSBub3JtX2woYWNjdSk7Ci0gICAgICBhY2N1ID0gYWNjdSA8PCBleDsKLSAgICAgIHNwZWNFeHAgPSBJTlRfQklUUy0xIC0gZXg7Ci0KLSAgICAgIHRhYkluZGV4ID0gKGFjY3UgPj4gKElOVF9CSVRTLTItTUFOVF9ESUdJVFMpKSAmICh+TUFOVF9TSVpFKTsKLQotICAgICAgLyogY2FsY3VsYXRlICJtYW50aXNzYSIgXjQvMyAqLwotICAgICAgcyA9IG1UYWJfNF8zW3RhYkluZGV4XTsKLQotICAgICAgLyogZ2V0IGFwcHJvcGVyaWF0ZSBleHBvbmVudCBtdWx0aXBsaWVyIGZvciBzcGVjRXhwXjMvNCBjb21iaW5lZCB3aXRoIHNjZk1vZCAqLwotICAgICAgdCA9IHNwZWNFeHBNYW50VGFibGVDb21iX2VuY1tpcXVhbnRpemVybW9kXVtzcGVjRXhwXTsKLQotICAgICAgLyogbXVsdGlwbHkgIm1hbnRpc3NhIiBeNC8zIHdpdGggZXhwb25lbnQgbXVsdGlwbGllciAqLwotICAgICAgYWNjdSA9IE1VTEhJR0gocywgdCk7Ci0KLSAgICAgIC8qIGdldCBhcHByb3BlcmlhdGUgZXhwb25lbnQgc2hpZnRlciAqLwotICAgICAgc3BlY0V4cCA9IHNwZWNFeHBUYWJsZUNvbWJfZW5jW2lxdWFudGl6ZXJtb2RdW3NwZWNFeHBdOwotCi0gICAgICBzcGVjRXhwICs9IGlxdWFudGl6ZXJzaGlmdCArIDE7Ci0JICBpZihzcGVjRXhwID49IDApCi0JCSAgbWRjdFNwZWN0cnVtW2xpbmVdID0gYWNjdSA8PCBzcGVjRXhwOwotCSAgZWxzZQotCQkgIG1kY3RTcGVjdHJ1bVtsaW5lXSA9IGFjY3UgPj4gKC1zcGVjRXhwKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBtZGN0U3BlY3RydW1bbGluZV0gPSAwOwotICAgIH0KLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogUXVhbnRpemVTcGVjdHJ1bQotKiBkZXNjcmlwdGlvbjogcXVhbnRpemVzIHRoZSBlbnRpcmUgc3BlY3RydW0KLSogcmV0dXJuczoKLSogaW5wdXQ6IG51bWJlciBvZiBzY2FsZWZhY3RvciBiYW5kcyB0byBiZSBxdWFudGl6ZWQsIC4uLgotKiBvdXRwdXQ6IHF1YW50aXplZCBzcGVjdHJ1bQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFF1YW50aXplU3BlY3RydW0oV29yZDE2IHNmYkNudCwKLSAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbWF4U2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHNmYlBlckdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2ZiT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqbWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBnbG9iYWxHYWluLAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2NhbGVmYWN0b3JzLAotICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcXVhbnRpemVkU3BlY3RydW0pCi17Ci0gIFdvcmQzMiBzZmJPZmZzLCBzZmI7Ci0KLSAgZm9yKHNmYk9mZnM9MDtzZmJPZmZzPHNmYkNudDtzZmJPZmZzKz1zZmJQZXJHcm91cCkgewotICAgIFdvcmQzMiBzZmJOZXh0IDsKLSAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IG1heFNmYlBlckdyb3VwOyBzZmIgPSBzZmJOZXh0KSB7Ci0gICAgICBXb3JkMTYgc2NhbGVmYWN0b3IgPSBzY2FsZWZhY3RvcnNbc2ZiT2ZmcytzZmJdOwotICAgICAgLyogY29hbGVzY2Ugc2ZicyB3aXRoIHRoZSBzYW1lIHNjYWxlZmFjdG9yICovCi0gICAgICBmb3IgKHNmYk5leHQgPSBzZmIrMTsKLSAgICAgICAgICAgc2ZiTmV4dCA8IG1heFNmYlBlckdyb3VwICYmIHNjYWxlZmFjdG9yID09IHNjYWxlZmFjdG9yc1tzZmJPZmZzK3NmYk5leHRdOwotICAgICAgICAgICBzZmJOZXh0KyspIDsKLQotICAgICAgcXVhbnRpemVMaW5lcyhnbG9iYWxHYWluIC0gc2NhbGVmYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgIHNmYk9mZnNldFtzZmJPZmZzK3NmYk5leHRdIC0gc2ZiT2Zmc2V0W3NmYk9mZnMrc2ZiXSwKLSAgICAgICAgICAgICAgICAgICAgbWRjdFNwZWN0cnVtICsgc2ZiT2Zmc2V0W3NmYk9mZnMrc2ZiXSwKLSAgICAgICAgICAgICAgICAgICAgcXVhbnRpemVkU3BlY3RydW0gKyBzZmJPZmZzZXRbc2ZiT2ZmcytzZmJdKTsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTpjYWxjU2ZiRGlzdAotKiBkZXNjcmlwdGlvbjogcXVhbnRpemVzIGFuZCByZXF1YW50aXplcyBsaW5lcyB0byBjYWxjdWxhdGUgZGlzdG9ydGlvbgotKiBpbnB1dDogIG51bWJlciBvZiBsaW5lcyB0byBiZSBxdWFudGl6ZWQsIC4uLgotKiBvdXRwdXQ6IGRpc3RvcnRpb24KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotV29yZDMyIGNhbGNTZmJEaXN0KGNvbnN0IFdvcmQzMiAqc3BlYywKLSAgICAgICAgICAgICAgICAgICBXb3JkMTYgIHNmYldpZHRoLAotICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgZ2FpbikKLXsKLSAgV29yZDMyIGxpbmU7Ci0gIFdvcmQzMiBkaXN0OwotICBXb3JkMzIgbSA9IGdhaW4mMzsKLSAgV29yZDMyIGcgPSAoZ2FpbiA+PiAyKSArIDQ7Ci0gIFdvcmQzMiBnMiA9IChnIDw8IDEpICsgMTsKLSAgY29uc3QgV29yZDE2ICpwcXVhdCwgKnJlcHF1YXQ7Ci0gICAgLyogZ2FpbiYzICovCi0KLSAgcHF1YXQgPSBxdWFudEJvcmRlcnNbbV07Ci0gIHJlcHF1YXQgPSBxdWFudFJlY29uW21dOwotCi0gIGRpc3QgPSAwOwotICBnICs9IDE2OwotICBpZihnMiA8IDAgJiYgZyA+PSAwKQotICB7Ci0JICBnMiA9IC1nMjsKLQkgIGZvcihsaW5lPTA7IGxpbmU8c2ZiV2lkdGg7IGxpbmUrKykgewotCQkgIGlmIChzcGVjW2xpbmVdKSB7Ci0JCQkgIFdvcmQzMiBkaWZmOwotCQkJICBXb3JkMzIgZGlzdFNpbmdsZTsKLQkJCSAgV29yZDMyIHNhOwotCQkJICBXb3JkMzIgc2FTaGZ0OwotCQkJICBzYSA9IExfYWJzKHNwZWNbbGluZV0pOwotCQkJICAvL3NhU2hmdCA9IHJvdW5kMTYoTF9zaHIoc2EsIGcpKTsKLQkJCSAgLy9zYVNoZnQgPSBMX3NocihzYSwgMTYrZyk7Ci0JCQkgIHNhU2hmdCA9IHNhID4+IGc7Ci0KLQkJCSAgaWYgKHNhU2hmdCA8IHBxdWF0WzBdKSB7Ci0JCQkJICBkaXN0U2luZ2xlID0gKHNhU2hmdCAqIHNhU2hmdCkgPj4gZzI7Ci0JCQkgIH0KLQkJCSAgZWxzZSB7Ci0KLQkJCQkgIGlmIChzYVNoZnQgPCBwcXVhdFsxXSkgewotCQkJCQkgIGRpZmYgPSBzYVNoZnQgLSByZXBxdWF0WzBdOwotCQkJCQkgIGRpc3RTaW5nbGUgPSAoZGlmZiAqIGRpZmYpID4+IGcyOwotCQkJCSAgfQotCQkJCSAgZWxzZSB7Ci0KLQkJCQkJICBpZiAoc2FTaGZ0IDwgcHF1YXRbMl0pIHsKLQkJCQkJCSAgZGlmZiA9IHNhU2hmdCAtIHJlcHF1YXRbMV07Ci0JCQkJCQkgIGRpc3RTaW5nbGUgPSAoZGlmZiAqIGRpZmYpID4+IGcyOwotCQkJCQkgIH0KLQkJCQkJICBlbHNlIHsKLQotCQkJCQkJICBpZiAoc2FTaGZ0IDwgcHF1YXRbM10pIHsKLQkJCQkJCQkgIGRpZmYgPSBzYVNoZnQgLSByZXBxdWF0WzJdOwotCQkJCQkJCSAgZGlzdFNpbmdsZSA9IChkaWZmICogZGlmZikgPj4gZzI7Ci0JCQkJCQkgIH0KLQkJCQkJCSAgZWxzZSB7Ci0JCQkJCQkJICBXb3JkMTYgcXVhID0gcXVhbnRpemVTaW5nbGVMaW5lKGdhaW4sIHNhKTsKLQkJCQkJCQkgIFdvcmQzMiBpcXZhbCwgZGlmZjMyOwotCQkJCQkJCSAgLyogbm93IHRoYXQgd2UgaGF2ZSBxdWFudGl6ZWQgeCwgcmUtcXVhbnRpemUgaXQuICovCi0JCQkJCQkJICBpcXVhbnRpemVMaW5lcyhnYWluLCAxLCAmcXVhLCAmaXF2YWwpOwotCQkJCQkJCSAgZGlmZjMyID0gc2EgLSBpcXZhbDsKLQkJCQkJCQkgIGRpc3RTaW5nbGUgPSBmaXhtdWwoZGlmZjMyLCBkaWZmMzIpOwotCQkJCQkJICB9Ci0JCQkJCSAgfQotCQkJCSAgfQotCQkJICB9Ci0KLQkJCSAgZGlzdCA9IExfYWRkKGRpc3QsIGRpc3RTaW5nbGUpOwotCQkgIH0KLQkgIH0KLSAgfQotICBlbHNlCi0gIHsKLQkgIGZvcihsaW5lPTA7IGxpbmU8c2ZiV2lkdGg7IGxpbmUrKykgewotCQkgIGlmIChzcGVjW2xpbmVdKSB7Ci0JCQkgIFdvcmQzMiBkaWZmOwotCQkJICBXb3JkMzIgZGlzdFNpbmdsZTsKLQkJCSAgV29yZDMyIHNhOwotCQkJICBXb3JkMzIgc2FTaGZ0OwotCQkJICBzYSA9IExfYWJzKHNwZWNbbGluZV0pOwotCQkJICAvL3NhU2hmdCA9IHJvdW5kMTYoTF9zaHIoc2EsIGcpKTsKLQkJCSAgc2FTaGZ0ID0gTF9zaHIoc2EsIGcpOwotCi0JCQkgIGlmIChzYVNoZnQgPCBwcXVhdFswXSkgewotCQkJCSAgZGlzdFNpbmdsZSA9IExfc2hsKChzYVNoZnQgKiBzYVNoZnQpLCBnMik7Ci0JCQkgIH0KLQkJCSAgZWxzZSB7Ci0KLQkJCQkgIGlmIChzYVNoZnQgPCBwcXVhdFsxXSkgewotCQkJCQkgIGRpZmYgPSBzYVNoZnQgLSByZXBxdWF0WzBdOwotCQkJCQkgIGRpc3RTaW5nbGUgPSBMX3NobCgoZGlmZiAqIGRpZmYpLCBnMik7Ci0JCQkJICB9Ci0JCQkJICBlbHNlIHsKLQotCQkJCQkgIGlmIChzYVNoZnQgPCBwcXVhdFsyXSkgewotCQkJCQkJICBkaWZmID0gc2FTaGZ0IC0gcmVwcXVhdFsxXTsKLQkJCQkJCSAgZGlzdFNpbmdsZSA9IExfc2hsKChkaWZmICogZGlmZiksIGcyKTsKLQkJCQkJICB9Ci0JCQkJCSAgZWxzZSB7Ci0KLQkJCQkJCSAgaWYgKHNhU2hmdCA8IHBxdWF0WzNdKSB7Ci0JCQkJCQkJICBkaWZmID0gc2FTaGZ0IC0gcmVwcXVhdFsyXTsKLQkJCQkJCQkgIGRpc3RTaW5nbGUgPSBMX3NobCgoZGlmZiAqIGRpZmYpLCBnMik7Ci0JCQkJCQkgIH0KLQkJCQkJCSAgZWxzZSB7Ci0JCQkJCQkJICBXb3JkMTYgcXVhID0gcXVhbnRpemVTaW5nbGVMaW5lKGdhaW4sIHNhKTsKLQkJCQkJCQkgIFdvcmQzMiBpcXZhbCwgZGlmZjMyOwotCQkJCQkJCSAgLyogbm93IHRoYXQgd2UgaGF2ZSBxdWFudGl6ZWQgeCwgcmUtcXVhbnRpemUgaXQuICovCi0JCQkJCQkJICBpcXVhbnRpemVMaW5lcyhnYWluLCAxLCAmcXVhLCAmaXF2YWwpOwotCQkJCQkJCSAgZGlmZjMyID0gc2EgLSBpcXZhbDsKLQkJCQkJCQkgIGRpc3RTaW5nbGUgPSBmaXhtdWwoZGlmZjMyLCBkaWZmMzIpOwotCQkJCQkJICB9Ci0JCQkJCSAgfQotCQkJCSAgfQotCQkJICB9Ci0JCQkgIGRpc3QgPSBMX2FkZChkaXN0LCBkaXN0U2luZ2xlKTsKLQkJICB9Ci0JICB9Ci0gIH0KLQotICByZXR1cm4gZGlzdDsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3NmX2VzdGltLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9zZl9lc3RpbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODk0N2UxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3NmX2VzdGltLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4ODIgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCUZpbGU6CQlzZl9lc3RpbS5jCi0KLQlDb250ZW50OglTY2FsZSBmYWN0b3IgZXN0aW1hdGlvbiBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJhc2ljX29wLmgiCi0jaW5jbHVkZSAib3Blcl8zMmIuaCIKLSNpbmNsdWRlICJzZl9lc3RpbS5oIgotI2luY2x1ZGUgInF1YW50aXplLmgiCi0jaW5jbHVkZSAiYml0X2NudC5oIgotI2luY2x1ZGUgImFhY19yb20uaCIKLQotc3RhdGljIGNvbnN0IFdvcmQxNiBNQVhfU0NGX0RFTFRBID0gNjA7Ci0KLS8qIQotY29uc3RhbnRzIHJlZmVyZW5jZSBpbiBjb21tZW50cwotCi0gQzAgPSA2Ljc1ZjsKLSBDMSA9IC02OS4zMzI5NWY7ICAgLTE2LzMqbG9nKE1BWF9RVUFOVCswLjUtbG9nQ29uKS9sb2coMikKLSBDMiA9IDQuMGY7Ci0gQzMgPSAyLjY2NjY2NjY2ZjsKLQotICBQRV9DMSA9IDMuMGY7ICAgICAgICBsb2coOC4wKS9sb2coMikKLSAgUEVfQzIgPSAxLjMyMTkyODFmOyAgbG9nKDIuNSkvbG9nKDIpCi0gIFBFX0MzID0gMC41NTkzNTczZjsgIDEtQzIvQzEKLQotKi8KLQotI2RlZmluZSBGRl9TUVJUX0JJVFMgICAgICAgICAgICAgICAgICAgIDcKLSNkZWZpbmUgRkZfU1FSVF9UQUJMRV9TSVpFICAgICAgICAgICAgICAoMTw8RkZfU1FSVF9CSVRTIC0gMTw8KEZGX1NRUlRfQklUUy0yKSkKLSNkZWZpbmUgQ09FRjA4XzMxCQkweDY2NjY2NjY2CQkvKiAwLjgqKDEgPDwgMzEpICovCi0jZGVmaW5lIFBFX0MxXzgJCQkyNAkJCQkvKiBQRV9DMSo4ICovCi0jZGVmaW5lIFBFX0MyXzE2CQkyMQkJCQkvKiBQRV9DMio4L1BFX0MzICovCi0jZGVmaW5lIFBFX1NDQUxFCQkweDA1OWEJCQkvKiAwLjcgKiAoMSA8PCAoMTUgLSAxIC0gMykpKi8KLQotI2RlZmluZSBTQ0FMRV9FU1RJTUFURV9DT0VGCTB4NTU1NQkJLyogKDguODU4NS8oNCpsb2cyKDEwKSkpICogKDEgPDwgMTUpKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBmb3JtZmFjX3NxcnQKLSogZGVzY3JpcHRpb246ICBjYWxjdWxhdGVzIHNxcnQoeCkvMjU2Ci0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotX19pbmxpbmUgV29yZDMyIGZvcm1mYWNfc3FydChXb3JkMzIgeCkKLXsKLQlXb3JkMzIgeTsKLQlXb3JkMzIgcHJlc2hpZnQsIHBvc3RzaGlmdDsKLQotCi0JaWYgKHg9PTApIHJldHVybiAwOwotCXByZXNoaWZ0ICA9IG5vcm1fbCh4KSAtIChJTlRfQklUUy0xLUZGX1NRUlRfQklUUyk7Ci0JcG9zdHNoaWZ0ID0gcHJlc2hpZnQgPj4gMTsKLQlwcmVzaGlmdCAgPSBwb3N0c2hpZnQgPDwgMTsKLQlwb3N0c2hpZnQgPSBwb3N0c2hpZnQgKyA4OwkgIC8qIHNxcnQvMjU2ICovCi0JaWYocHJlc2hpZnQgPj0gMCkKLQkJeSA9IHggPDwgcHJlc2hpZnQ7ICAgICAgICAvKiBub3cgMS80IDw9IHkgPCAxICovCi0JZWxzZQotCQl5ID0geCA+PiAoLXByZXNoaWZ0KTsKLQl5ID0gZm9ybWZhY19zcXJ0dGFibGVbeS0zMl07Ci0KLQlpZihwb3N0c2hpZnQgPj0gMCkKLQkJeSA9IHkgPj4gcG9zdHNoaWZ0OwotCWVsc2UKLQkJeSA9IHkgPDwgKC1wb3N0c2hpZnQpOwotCi0JcmV0dXJuIHk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBDYWxjRm9ybUZhY3RvckNoYW5uZWwKLSogZGVzY3JpcHRpb246ICBjYWxjdWxhdGUgdGhlIGZvcm0gZmFjdG9yIG9uZSBjaGFubmVsCi0qCQkJCWZmYWMobikgPSBzcXJ0KGFicyhYKGspKSArIHNxcnQoYWJzKFgoaysxKSkgKyAuLi4uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLUNhbGNGb3JtRmFjdG9yQ2hhbm5lbChXb3JkMTYgKmxvZ1NmYkZvcm1GYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzZmJOUmVsZXZhbnRMaW5lcywKLSAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmxvZ1NmYkVuZXJneSwKLSAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4pCi17Ci0JV29yZDMyIHNmYncsIHNmYncxOwotCVdvcmQzMiBpLCBqOwotCVdvcmQzMiBzZmJPZmZzLCBzZmI7Ci0KLQlzZmJ3ID0gc2ZidzEgPSAwOwotCWZvciAoc2ZiT2Zmcz0wOyBzZmJPZmZzPHBzeU91dENoYW4tPnNmYkNudDsgc2ZiT2Zmcys9cHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApewotCQlmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7Ci0JCQlpID0gc2ZiT2ZmcytzZmI7Ci0KLQkJCWlmIChwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbaV0gPiBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGRbaV0pIHsKLQkJCQlXb3JkMzIgYWNjdSwgYXZnRm9ybUZhY3RvcixpU2ZiV2lkdGg7Ci0JCQkJV29yZDMyICptZGN0U3BlYzsKLQkJCQlzZmJ3ID0gcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tpKzFdIC0gcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tpXTsKLQkJCQlpU2ZiV2lkdGggPSBpbnZTQkZbKHNmYncgPj4gMikgLSAxXTsKLQkJCQltZGN0U3BlYyA9IHBzeU91dENoYW4tPm1kY3RTcGVjdHJ1bSArIHBzeU91dENoYW4tPnNmYk9mZnNldHNbaV07Ci0JCQkJYWNjdSA9IDA7Ci0JCQkJLyogY2FsYyBzdW0gb2Ygc3FydChzcGVjKSAqLwotCQkJCWZvciAoaj1zZmJ3OyBqOyBqLS0pIHsKLQkJCQkJYWNjdSArPSBmb3JtZmFjX3NxcnQoTF9hYnMoKm1kY3RTcGVjKSk7IG1kY3RTcGVjKys7Ci0JCQkJfQotCQkJCWxvZ1NmYkZvcm1GYWN0b3JbaV0gPSBpTG9nNChhY2N1KTsKLQkJCQlsb2dTZmJFbmVyZ3lbaV0gPSBpTG9nNChwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbaV0pOwotCQkJCWF2Z0Zvcm1GYWN0b3IgPSBmaXhtdWwocnNxcnQocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W2ldLElOVF9CSVRTKSwgaVNmYldpZHRoKTsKLQkJCQlhdmdGb3JtRmFjdG9yID0gcnNxcnQoKFdvcmQzMilhdmdGb3JtRmFjdG9yLElOVF9CSVRTKSA+PiAxMDsKLQkJCQkvKiByZXN1bHQgaXMgbXVsdGlwbGllZCBieSA0ICovCi0JCQkJaWYoYXZnRm9ybUZhY3RvcikKLQkJCQkJc2ZiTlJlbGV2YW50TGluZXNbaV0gPSBhY2N1IC8gYXZnRm9ybUZhY3RvcjsKLQkJCQllbHNlCi0JCQkJCXNmYk5SZWxldmFudExpbmVzW2ldID0gMHg3ZmZmOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyogc2V0IG51bWJlciBvZiBsaW5lcyB0byB6ZXJvICovCi0JCQkJc2ZiTlJlbGV2YW50TGluZXNbaV0gPSAwOwotCQkJfQotCQl9Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGltcHJvdmVTY2YKLSogZGVzY3JpcHRpb246ICBmaW5kIGJldHRlciBzY2FsZWZhY3RvciB3aXRoIGFuYWx5c2lzIGJ5IHN5bnRoZXNpcwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBXb3JkMTYgaW1wcm92ZVNjZihXb3JkMzIgKnNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBzZmJXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgIHRocmVzaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIHNjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG1pblNjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKmRpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICptaW5TY2ZDYWxjdWxhdGVkKQotewotCVdvcmQzMiBjbnQ7Ci0JV29yZDMyIHNmYkRpc3Q7Ci0JV29yZDMyIHNjZkJlc3Q7Ci0JV29yZDMyIHRocmVzaDEyNSA9IExfYWRkKHRocmVzaCwgKHRocmVzaCA+PiAyKSk7Ci0KLQlzY2ZCZXN0ID0gc2NmOwotCi0JLyogY2FsYyByZWFsIGRpc3RvcnRpb24gKi8KLQlzZmJEaXN0ID0gY2FsY1NmYkRpc3Qoc3BlYywgc2ZiV2lkdGgsIHNjZik7Ci0JKm1pblNjZkNhbGN1bGF0ZWQgPSBzY2Y7Ci0JaWYoIXNmYkRpc3QpCi0JICByZXR1cm4gc2NmQmVzdDsKLQotCWlmIChzZmJEaXN0ID4gdGhyZXNoMTI1KSB7Ci0JCVdvcmQzMiBzY2ZFc3RpbWF0ZWQ7Ci0JCVdvcmQzMiBzZmJEaXN0QmVzdDsKLQkJc2NmRXN0aW1hdGVkID0gc2NmOwotCQlzZmJEaXN0QmVzdCA9IHNmYkRpc3Q7Ci0KLQkJY250ID0gMDsKLQkJd2hpbGUgKHNmYkRpc3QgPiB0aHJlc2gxMjUgJiYgKGNudCA8IDMpKSB7Ci0KLQkJCXNjZiA9IHNjZiArIDE7Ci0JCQlzZmJEaXN0ID0gY2FsY1NmYkRpc3Qoc3BlYywgc2ZiV2lkdGgsIHNjZik7Ci0KLQkJCWlmIChzZmJEaXN0IDwgc2ZiRGlzdEJlc3QpIHsKLQkJCQlzY2ZCZXN0ID0gc2NmOwotCQkJCXNmYkRpc3RCZXN0ID0gc2ZiRGlzdDsKLQkJCX0KLQkJCWNudCA9IGNudCArIDE7Ci0JCX0KLQkJY250ID0gMDsKLQkJc2NmID0gc2NmRXN0aW1hdGVkOwotCQlzZmJEaXN0ID0gc2ZiRGlzdEJlc3Q7Ci0JCXdoaWxlICgoc2ZiRGlzdCA+IHRocmVzaDEyNSkgJiYgKGNudCA8IDEpICYmIChzY2YgPiBtaW5TY2YpKSB7Ci0KLQkJCXNjZiA9IHNjZiAtIDE7Ci0JCQlzZmJEaXN0ID0gY2FsY1NmYkRpc3Qoc3BlYywgc2ZiV2lkdGgsIHNjZik7Ci0KLQkJCWlmIChzZmJEaXN0IDwgc2ZiRGlzdEJlc3QpIHsKLQkJCQlzY2ZCZXN0ID0gc2NmOwotCQkJCXNmYkRpc3RCZXN0ID0gc2ZiRGlzdDsKLQkJCX0KLQkJCSptaW5TY2ZDYWxjdWxhdGVkID0gc2NmOwotCQkJY250ID0gY250ICsgMTsKLQkJfQotCQkqZGlzdCA9IHNmYkRpc3RCZXN0OwotCX0KLQllbHNlIHsKLQkJV29yZDMyIHNmYkRpc3RCZXN0OwotCQlXb3JkMzIgc2ZiRGlzdEFsbG93ZWQ7Ci0JCVdvcmQzMiB0aHJlc2gwOCA9IGZpeG11bChDT0VGMDhfMzEsIHRocmVzaCk7Ci0JCXNmYkRpc3RCZXN0ID0gc2ZiRGlzdDsKLQotCQlpZiAoc2ZiRGlzdCA8IHRocmVzaDA4KQotCQkJc2ZiRGlzdEFsbG93ZWQgPSBzZmJEaXN0OwotCQllbHNlCi0JCQlzZmJEaXN0QWxsb3dlZCA9IHRocmVzaDA4OwotCQlmb3IgKGNudD0wOyBjbnQ8MzsgY250KyspIHsKLQkJCXNjZiA9IHNjZiArIDE7Ci0JCQlzZmJEaXN0ID0gY2FsY1NmYkRpc3Qoc3BlYywgc2ZiV2lkdGgsIHNjZik7Ci0KLQkJCWlmIChmaXhtdWwoQ09FRjA4XzMxLHNmYkRpc3QpIDwgc2ZiRGlzdEFsbG93ZWQpIHsKLQkJCQkqbWluU2NmQ2FsY3VsYXRlZCA9IHNjZkJlc3QgKyAxOwotCQkJCXNjZkJlc3QgPSBzY2Y7Ci0JCQkJc2ZiRGlzdEJlc3QgPSBzZmJEaXN0OwotCQkJfQotCQl9Ci0JCSpkaXN0ID0gc2ZiRGlzdEJlc3Q7Ci0JfQotCi0JLyogcmV0dXJuIGJlc3Qgc2NhbGVmYWN0b3IgKi8KLQlyZXR1cm4gc2NmQmVzdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBjb3VudFNpbmdsZVNjZkJpdHMKLSogZGVzY3JpcHRpb246ICBjb3VudCBzaW5nbGUgc2NmIGJpdHMgaW4gaHVmZnVtCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQxNiBjb3VudFNpbmdsZVNjZkJpdHMoV29yZDE2IHNjZiwgV29yZDE2IHNjZkxlZnQsIFdvcmQxNiBzY2ZSaWdodCkKLXsKLQlXb3JkMTYgc2NmQml0czsKLQotCXNjZkJpdHMgPSBiaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmTGVmdCAtIHNjZikgKwotCQliaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmIC0gc2NmUmlnaHQpOwotCi0JcmV0dXJuIHNjZkJpdHM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogY2FsY1NpbmdsZVNwZWNQZQotKiBkZXNjcmlwdGlvbjogIGxkUmF0aW8gPSBsb2cyKGVuKG4pKSAtIDAsMzc1KnNjZkdhaW4obikKLSoJCQkJbmJpdHMgPSAwLjcqbkxpbmVzKmxkUmF0aW9uIGZvciBsZFJhdGlvbiA+PSBjMQotKgkJCQluYml0cyA9IDAuNypuTGluZXMqKGMyICsgYzMqbGRSYXRpbykgZm9yIGxkUmF0aW9uIDwgYzEKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDE2IGNhbGNTaW5nbGVTcGVjUGUoV29yZDE2IHNjZiwgV29yZDE2IHNmYkNvbnN0UGVQYXJ0LCBXb3JkMTYgbkxpbmVzKQotewotCVdvcmQzMiBzcGVjUGU7Ci0JV29yZDMyIGxkUmF0aW87Ci0JV29yZDMyIHNjZjM7Ci0KLQlsZFJhdGlvID0gc2ZiQ29uc3RQZVBhcnQgPDwgMzsgLyogIChzZmJDb25zdFBlUGFydCAtMC4zNzUqc2NmKSo4ICovCi0Jc2NmMyA9IHNjZiArIHNjZiArIHNjZjsKLQlsZFJhdGlvID0gbGRSYXRpbyAtIHNjZjM7Ci0KLQlpZiAobGRSYXRpbyA8IFBFX0MxXzgpIHsKLQkJLyogMjEgOiAyKjgqUEVfQzIsIDIqUEVfQzMgfiAxKi8KLQkJbGRSYXRpbyA9IChsZFJhdGlvICsgUEVfQzJfMTYpID4+IDE7Ci0JfQotCXNwZWNQZSA9IG5MaW5lcyAqIGxkUmF0aW87Ci0Jc3BlY1BlID0gKHNwZWNQZSAqIFBFX1NDQUxFKSA+PiAxNDsKLQotCXJldHVybiBzYXR1cmF0ZShzcGVjUGUpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogY291bnRTY2ZCaXRzRGlmZgotKiBkZXNjcmlwdGlvbjogIGNvdW50IGRpZmZlcmVudCBzY2YgYml0cyB1c2VkCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQxNiBjb3VudFNjZkJpdHNEaWZmKFdvcmQxNiAqc2NmT2xkLCBXb3JkMTYgKnNjZk5ldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgc2ZiQ250LCBXb3JkMTYgc3RhcnRTZmIsIFdvcmQxNiBzdG9wU2ZiKQotewotCVdvcmQzMiBzY2ZCaXRzRGlmZjsKLQlXb3JkMzIgc2ZiLCBzZmJMYXN0OwotCVdvcmQzMiBzZmJQcmV2LCBzZmJOZXh0OwotCi0Jc2NmQml0c0RpZmYgPSAwOwotCXNmYiA9IDA7Ci0KLQkvKiBzZWFyY2ggZm9yIGZpcnN0IHJlbGV2YW50IHNmYiAqLwotCXNmYkxhc3QgPSBzdGFydFNmYjsKLQl3aGlsZSAoc2ZiTGFzdCA8IHN0b3BTZmIgJiYgc2NmT2xkW3NmYkxhc3RdID09IFZPQUFDX1NIUlRfTUlOKSB7Ci0KLQkJc2ZiTGFzdCA9IHNmYkxhc3QgKyAxOwotCX0KLQkvKiBzZWFyY2ggZm9yIHByZXZpb3VzIHJlbGV2YW50IHNmYiBhbmQgY291bnQgZGlmZiAqLwotCXNmYlByZXYgPSBzdGFydFNmYiAtIDE7Ci0Jd2hpbGUgKChzZmJQcmV2Pj0wKSAmJiBzY2ZPbGRbc2ZiUHJldl0gPT0gVk9BQUNfU0hSVF9NSU4pIHsKLQotCQlzZmJQcmV2ID0gc2ZiUHJldiAtIDE7Ci0JfQotCi0JaWYgKHNmYlByZXY+PTApIHsKLQkJc2NmQml0c0RpZmYgKz0gYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk5ld1tzZmJQcmV2XSAtIHNjZk5ld1tzZmJMYXN0XSkgLQotCQkJYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk9sZFtzZmJQcmV2XSAtIHNjZk9sZFtzZmJMYXN0XSk7Ci0JfQotCS8qIG5vdyBsb29wIHRocm91Z2ggYWxsIHNmYnMgYW5kIGNvdW50IGRpZmZzIG9mIHJlbGV2YW50IHNmYnMgKi8KLQlmb3IgKHNmYj1zZmJMYXN0KzE7IHNmYjxzdG9wU2ZiOyBzZmIrKykgewotCi0JCWlmIChzY2ZPbGRbc2ZiXSAhPSBWT0FBQ19TSFJUX01JTikgewotCQkJc2NmQml0c0RpZmYgKz0gYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk5ld1tzZmJMYXN0XSAtIHNjZk5ld1tzZmJdKSAtCi0JCQkJYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk9sZFtzZmJMYXN0XSAtIHNjZk9sZFtzZmJdKTsKLQkJCXNmYkxhc3QgPSBzZmI7Ci0JCX0KLQl9Ci0JLyogc2VhcmNoIGZvciBuZXh0IHJlbGV2YW50IHNmYiBhbmQgY291bnQgZGlmZiAqLwotCXNmYk5leHQgPSBzdG9wU2ZiOwotCXdoaWxlIChzZmJOZXh0IDwgc2ZiQ250ICYmIHNjZk9sZFtzZmJOZXh0XSA9PSBWT0FBQ19TSFJUX01JTikgewotCi0JCXNmYk5leHQgPSBzZmJOZXh0ICsgMTsKLQl9Ci0KLQlpZiAoc2ZiTmV4dCA8IHNmYkNudCkKLQkJc2NmQml0c0RpZmYgKz0gYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk5ld1tzZmJMYXN0XSAtIHNjZk5ld1tzZmJOZXh0XSkgLQotCQliaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmT2xkW3NmYkxhc3RdIC0gc2NmT2xkW3NmYk5leHRdKTsKLQotCXJldHVybiBzYXR1cmF0ZShzY2ZCaXRzRGlmZik7Ci19Ci0KLXN0YXRpYyBXb3JkMTYgY2FsY1NwZWNQZURpZmYoV29yZDE2ICpzY2ZPbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2NmTmV3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnNmYkNvbnN0UGVQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmxvZ1NmYkVuZXJneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpsb2dTZmJGb3JtRmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnNmYk5SZWxldmFudExpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgc3RhcnRTZmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzdG9wU2ZiKQotewotCVdvcmQzMiBzcGVjUGVEaWZmOwotCVdvcmQzMiBzZmI7Ci0KLQlzcGVjUGVEaWZmID0gMDsKLQotCS8qIGxvb3AgdGhyb3VnaCBhbGwgc2ZicyBhbmQgY291bnQgcGUgZGlmZmVyZW5jZSAqLwotCWZvciAoc2ZiPXN0YXJ0U2ZiOyBzZmI8c3RvcFNmYjsgc2ZiKyspIHsKLQotCi0JCWlmIChzY2ZPbGRbc2ZiXSAhPSBWT0FBQ19TSFJUX01JTikgewotCQkJV29yZDMyIGxkUmF0aW9PbGQsIGxkUmF0aW9OZXc7Ci0JCQlXb3JkMzIgc2NmMzsKLQotCi0JCQlpZiAoc2ZiQ29uc3RQZVBhcnRbc2ZiXSA9PSBNSU5fMTYpIHsKLQkJCQlzZmJDb25zdFBlUGFydFtzZmJdID0gKChsb2dTZmJFbmVyZ3lbc2ZiXSAtCi0JCQkJCWxvZ1NmYkZvcm1GYWN0b3Jbc2ZiXSkgKyAxMS04KjQrMykgPj4gMjsKLQkJCX0KLQotCi0JCQlsZFJhdGlvT2xkID0gc2ZiQ29uc3RQZVBhcnRbc2ZiXSA8PCAzOwotCQkJc2NmMyA9IHNjZk9sZFtzZmJdICsgc2NmT2xkW3NmYl0gKyBzY2ZPbGRbc2ZiXTsKLQkJCWxkUmF0aW9PbGQgPSBsZFJhdGlvT2xkIC0gc2NmMzsKLQkJCWxkUmF0aW9OZXcgPSBzZmJDb25zdFBlUGFydFtzZmJdIDw8IDM7Ci0JCQlzY2YzID0gc2NmTmV3W3NmYl0gKyBzY2ZOZXdbc2ZiXSArIHNjZk5ld1tzZmJdOwotCQkJbGRSYXRpb05ldyA9IGxkUmF0aW9OZXcgLSBzY2YzOwotCi0JCQlpZiAobGRSYXRpb09sZCA8IFBFX0MxXzgpIHsKLQkJCQkvKiAyMSA6IDIqOCpQRV9DMiwgMipQRV9DMyB+IDEqLwotCQkJCWxkUmF0aW9PbGQgPSAobGRSYXRpb09sZCArIFBFX0MyXzE2KSA+PiAxOwotCQkJfQotCi0JCQlpZiAobGRSYXRpb05ldyA8IFBFX0MxXzgpIHsKLQkJCQkvKiAyMSA6IDIqOCpQRV9DMiwgMipQRV9DMyB+IDEqLwotCQkJCWxkUmF0aW9OZXcgPSAobGRSYXRpb05ldyArIFBFX0MyXzE2KSA+PiAxOwotCQkJfQotCi0JCQlzcGVjUGVEaWZmICs9ICBzZmJOUmVsZXZhbnRMaW5lc1tzZmJdICogKGxkUmF0aW9OZXcgLSBsZFJhdGlvT2xkKTsKLQkJfQotCX0KLQotCXNwZWNQZURpZmYgPSAoc3BlY1BlRGlmZiAqIFBFX1NDQUxFKSA+PiAxNDsKLQotCXJldHVybiBzYXR1cmF0ZShzcGVjUGVEaWZmKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGFzc2ltaWxhdGVTaW5nbGVTY2YKLSogZGVzY3JpcHRpb246ICBzZWFyY2hlZCBmb3Igc2luZ2xlIHNjYWxlZmFjdG9yIGJhbmRzLCB3aGVyZSB0aGUgbnVtYmVyIG9mIGJpdHMgZ2FpbmVkCi0qCQkJCWJ5IHVzaW5nIGEgc21hbGxlciBzY2ZnYWluKG4pIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZXN0aW1hdGVkIGluY3JlYXNlZAotKgkJCQliaXQgZGVtYW5kCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYXNzaW1pbGF0ZVNpbmdsZVNjZihQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKm1pblNjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICpzZmJEaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnNmYkNvbnN0UGVQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmxvZ1NmYkVuZXJneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpsb2dTZmJGb3JtRmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnNmYk5SZWxldmFudExpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKm1pblNjZkNhbGN1bGF0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWcgICAgcmVzdGFydE9uU3VjY2VzcykKLXsKLQlXb3JkMTYgc2ZiTGFzdCwgc2ZiQWN0LCBzZmJOZXh0LCBzY2ZBY3QsIHNjZk1pbjsKLQlXb3JkMTYgKnNjZkxhc3QsICpzY2ZOZXh0OwotCVdvcmQzMiBzZmJQZU9sZCwgc2ZiUGVOZXc7Ci0JV29yZDMyIHNmYkRpc3ROZXc7Ci0JV29yZDMyIGo7Ci0JRmxhZyAgIHN1Y2Nlc3M7Ci0JV29yZDE2IGRlbHRhUGUsIGRlbHRhUGVOZXcsIGRlbHRhUGVUbXA7Ci0JV29yZDE2ICpwcmV2U2NmTGFzdCA9IHBzeU91dENoYW4tPnByZXZTY2ZMYXN0OwotCVdvcmQxNiAqcHJldlNjZk5leHQgPSBwc3lPdXRDaGFuLT5wcmV2U2NmTmV4dDsKLQlXb3JkMTYgKmRlbHRhUGVMYXN0ID0gcHN5T3V0Q2hhbi0+ZGVsdGFQZUxhc3Q7Ci0JRmxhZyAgIHVwZGF0ZU1pblNjZkNhbGN1bGF0ZWQ7Ci0KLQlzdWNjZXNzID0gMDsKLQlkZWx0YVBlID0gMDsKLQotCWZvcihqPTA7ajxwc3lPdXRDaGFuLT5zZmJDbnQ7aisrKXsKLQkJcHJldlNjZkxhc3Rbal0gPSBNQVhfMTY7Ci0JCXByZXZTY2ZOZXh0W2pdID0gTUFYXzE2OwotCQlkZWx0YVBlTGFzdFtqXSA9IE1BWF8xNjsKLQl9Ci0KLQlzZmJMYXN0ID0gLTE7Ci0Jc2ZiQWN0ID0gLTE7Ci0Jc2ZiTmV4dCA9IC0xOwotCXNjZkxhc3QgPSAwOwotCXNjZk5leHQgPSAwOwotCXNjZk1pbiA9IE1BWF8xNjsKLQlkbyB7Ci0JCS8qIHNlYXJjaCBmb3IgbmV3IHJlbGV2YW50IHNmYiAqLwotCQlzZmJOZXh0ID0gc2ZiTmV4dCArIDE7Ci0JCXdoaWxlIChzZmJOZXh0IDwgcHN5T3V0Q2hhbi0+c2ZiQ250ICYmIHNjZltzZmJOZXh0XSA9PSBNSU5fMTYpIHsKLQotCQkJc2ZiTmV4dCA9IHNmYk5leHQgKyAxOwotCQl9Ci0KLQkJaWYgKChzZmJMYXN0Pj0wKSAmJiAoc2ZiQWN0Pj0wKSAmJiBzZmJOZXh0IDwgcHN5T3V0Q2hhbi0+c2ZiQ250KSB7Ci0JCQkvKiByZWxldmFudCBzY2ZzIHRvIHRoZSBsZWZ0IGFuZCB0byB0aGUgcmlnaHQgKi8KLQkJCXNjZkFjdCAgPSBzY2Zbc2ZiQWN0XTsKLQkJCXNjZkxhc3QgPSBzY2YgKyBzZmJMYXN0OwotCQkJc2NmTmV4dCA9IHNjZiArIHNmYk5leHQ7Ci0JCQlzY2ZNaW4gID0gbWluKCpzY2ZMYXN0LCAqc2NmTmV4dCk7Ci0JCX0KLQkJZWxzZSB7Ci0KLQkJCWlmIChzZmJMYXN0ID09IC0xICYmIChzZmJBY3Q+PTApICYmIHNmYk5leHQgPCBwc3lPdXRDaGFuLT5zZmJDbnQpIHsKLQkJCQkvKiBmaXJzdCByZWxldmFudCBzY2YgKi8KLQkJCQlzY2ZBY3QgID0gc2NmW3NmYkFjdF07Ci0JCQkJc2NmTGFzdCA9ICZzY2ZBY3Q7Ci0JCQkJc2NmTmV4dCA9IHNjZiArIHNmYk5leHQ7Ci0JCQkJc2NmTWluICA9ICpzY2ZOZXh0OwotCQkJfQotCQkJZWxzZSB7Ci0KLQkJCQlpZiAoKHNmYkxhc3Q+PTApICYmIChzZmJBY3Q+PTApICYmIHNmYk5leHQgPT0gcHN5T3V0Q2hhbi0+c2ZiQ250KSB7Ci0JCQkJCS8qIGxhc3QgcmVsZXZhbnQgc2NmICovCi0JCQkJCXNjZkFjdCAgPSBzY2Zbc2ZiQWN0XTsKLQkJCQkJc2NmTGFzdCA9IHNjZiArIHNmYkxhc3Q7Ci0JCQkJCXNjZk5leHQgPSAmc2NmQWN0OwotCQkJCQlzY2ZNaW4gID0gKnNjZkxhc3Q7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKHNmYkFjdD49MCkKLQkJCXNjZk1pbiA9IG1heChzY2ZNaW4sIG1pblNjZltzZmJBY3RdKTsKLQotCQlpZiAoKHNmYkFjdCA+PSAwKSAmJgotCQkJKHNmYkxhc3Q+PTAgfHwgc2ZiTmV4dCA8IHBzeU91dENoYW4tPnNmYkNudCkgJiYKLQkJCXNjZkFjdCA+IHNjZk1pbiAmJgotCQkJKCpzY2ZMYXN0ICE9IHByZXZTY2ZMYXN0W3NmYkFjdF0gfHwKLQkJCSpzY2ZOZXh0ICE9IHByZXZTY2ZOZXh0W3NmYkFjdF0gfHwKLQkJCWRlbHRhUGUgPCBkZWx0YVBlTGFzdFtzZmJBY3RdKSkgewotCQkJc3VjY2VzcyA9IDA7Ci0KLQkJCS8qIGVzdGltYXRlIHJlcXVpcmVkIGJpdHMgZm9yIGFjdHVhbCBzY2YgKi8KLQkJCWlmIChzZmJDb25zdFBlUGFydFtzZmJBY3RdID09IE1JTl8xNikgewotCQkJCXNmYkNvbnN0UGVQYXJ0W3NmYkFjdF0gPSBsb2dTZmJFbmVyZ3lbc2ZiQWN0XSAtCi0JCQkJCWxvZ1NmYkZvcm1GYWN0b3Jbc2ZiQWN0XSArIDExLTgqNDsgLyogNCpsb2cyKDYuNzUpIC0gMzIgKi8KLQotCQkJCWlmIChzZmJDb25zdFBlUGFydFtzZmJBY3RdIDwgMCkKLQkJCQkJc2ZiQ29uc3RQZVBhcnRbc2ZiQWN0XSA9IHNmYkNvbnN0UGVQYXJ0W3NmYkFjdF0gKyAzOwotCQkJCXNmYkNvbnN0UGVQYXJ0W3NmYkFjdF0gPSBzZmJDb25zdFBlUGFydFtzZmJBY3RdID4+IDI7Ci0JCQl9Ci0KLQkJCXNmYlBlT2xkID0gY2FsY1NpbmdsZVNwZWNQZShzY2ZBY3QsIHNmYkNvbnN0UGVQYXJ0W3NmYkFjdF0sIHNmYk5SZWxldmFudExpbmVzW3NmYkFjdF0pICsKLQkJCQljb3VudFNpbmdsZVNjZkJpdHMoc2NmQWN0LCAqc2NmTGFzdCwgKnNjZk5leHQpOwotCQkJZGVsdGFQZU5ldyA9IGRlbHRhUGU7Ci0JCQl1cGRhdGVNaW5TY2ZDYWxjdWxhdGVkID0gMTsKLQkJCWRvIHsKLQkJCQlzY2ZBY3QgPSBzY2ZBY3QgLSAxOwotCQkJCS8qIGNoZWNrIG9ubHkgaWYgdGhlIHNhbWUgY2hlY2sgd2FzIG5vdCBkb25lIGJlZm9yZSAqLwotCi0JCQkJaWYgKHNjZkFjdCA8IG1pblNjZkNhbGN1bGF0ZWRbc2ZiQWN0XSkgewotCQkJCQlzZmJQZU5ldyA9IGNhbGNTaW5nbGVTcGVjUGUoc2NmQWN0LCBzZmJDb25zdFBlUGFydFtzZmJBY3RdLCBzZmJOUmVsZXZhbnRMaW5lc1tzZmJBY3RdKSArCi0JCQkJCQljb3VudFNpbmdsZVNjZkJpdHMoc2NmQWN0LCAqc2NmTGFzdCwgKnNjZk5leHQpOwotCQkJCQkvKiB1c2UgbmV3IHNjZiBpZiBubyBpbmNyZWFzZSBpbiBwZSBhbmQKLQkJCQkJcXVhbnRpemF0aW9uIGVycm9yIGlzIHNtYWxsZXIgKi8KLQkJCQkJZGVsdGFQZVRtcCA9IGRlbHRhUGUgKyBzZmJQZU5ldyAtIHNmYlBlT2xkOwotCi0JCQkJCWlmIChkZWx0YVBlVG1wIDwgMTApIHsKLQkJCQkJCXNmYkRpc3ROZXcgPSBjYWxjU2ZiRGlzdChwc3lPdXRDaGFuLT5tZGN0U3BlY3RydW0rCi0JCQkJCQkJcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tzZmJBY3RdLAotCQkJCQkJCShwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYkFjdCsxXSAtIHBzeU91dENoYW4tPnNmYk9mZnNldHNbc2ZiQWN0XSksCi0JCQkJCQkJc2NmQWN0KTsKLQkJCQkJCWlmIChzZmJEaXN0TmV3IDwgc2ZiRGlzdFtzZmJBY3RdKSB7Ci0JCQkJCQkJLyogc3VjY2VzcywgcmVwbGFjZSBzY2YgYnkgbmV3IG9uZSAqLwotCQkJCQkJCXNjZltzZmJBY3RdID0gc2NmQWN0OwotCQkJCQkJCXNmYkRpc3Rbc2ZiQWN0XSA9IHNmYkRpc3ROZXc7Ci0JCQkJCQkJZGVsdGFQZU5ldyA9IGRlbHRhUGVUbXA7Ci0JCQkJCQkJc3VjY2VzcyA9IDE7Ci0JCQkJCQl9Ci0JCQkJCQkvKiBtYXJrIGFzIGFscmVhZHkgY2hlY2tlZCAqLwotCi0JCQkJCQlpZiAodXBkYXRlTWluU2NmQ2FsY3VsYXRlZCkgewotCQkJCQkJCW1pblNjZkNhbGN1bGF0ZWRbc2ZiQWN0XSA9IHNjZkFjdDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXVwZGF0ZU1pblNjZkNhbGN1bGF0ZWQgPSAwOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9IHdoaWxlIChzY2ZBY3QgPiBzY2ZNaW4pOwotCQkJZGVsdGFQZSA9IGRlbHRhUGVOZXc7Ci0JCQkvKiBzYXZlIHBhcmFtZXRlcnMgdG8gYXZvaWQgbXVsdGlwbGUgY29tcHV0YXRpb25zIG9mIHRoZSBzYW1lIHNmYiAqLwotCQkJcHJldlNjZkxhc3Rbc2ZiQWN0XSA9ICpzY2ZMYXN0OwotCQkJcHJldlNjZk5leHRbc2ZiQWN0XSA9ICpzY2ZOZXh0OwotCQkJZGVsdGFQZUxhc3Rbc2ZiQWN0XSA9IGRlbHRhUGU7Ci0JCX0KLQotCQlpZiAoc3VjY2VzcyAmJiByZXN0YXJ0T25TdWNjZXNzKSB7Ci0JCQkvKiBzdGFydCBhZ2FpbiBhdCBmaXJzdCBzZmIgKi8KLQkJCXNmYkxhc3QgPSAtMTsKLQkJCXNmYkFjdCAgPSAtMTsKLQkJCXNmYk5leHQgPSAtMTsKLQkJCXNjZkxhc3QgPSAwOwotCQkJc2NmTmV4dCA9IDA7Ci0JCQlzY2ZNaW4gID0gTUFYXzE2OwotCQkJc3VjY2VzcyA9IDA7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBzaGlmdCBzZmJzIGZvciBuZXh0IGJhbmQgKi8KLQkJCXNmYkxhc3QgPSBzZmJBY3Q7Ci0JCQlzZmJBY3QgID0gc2ZiTmV4dDsKLQkJfQotCi0gIH0gd2hpbGUgKHNmYk5leHQgPCBwc3lPdXRDaGFuLT5zZmJDbnQpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogYXNzaW1pbGF0ZU11bHRpcGxlU2NmCi0qIGRlc2NyaXB0aW9uOiAgc2NhbGVmYWN0b3IgZGlmZmVyZW5jZSByZWR1Y3Rpb24KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhc3NpbWlsYXRlTXVsdGlwbGVTY2YoUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbWluU2NmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqc2ZiRGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnNmYkNvbnN0UGVQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbG9nU2ZiRW5lcmd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbG9nU2ZiRm9ybUZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnNmYk5SZWxldmFudExpbmVzKQotewotCVdvcmQzMiBzZmIsIHN0YXJ0U2ZiLCBzdG9wU2ZiLCBzY2ZNaW4sIHNjZk1heCwgc2NmQWN0OwotCUZsYWcgICBwb3NzaWJsZVJlZ2lvbkZvdW5kOwotCVdvcmQzMiBkZWx0YVNjZkJpdHM7Ci0JV29yZDMyIGRlbHRhU3BlY1BlOwotCVdvcmQzMiBkZWx0YVBlLCBkZWx0YVBlTmV3OwotCVdvcmQzMiBzZmJDbnQ7Ci0JV29yZDMyICpzZmJEaXN0TmV3ID0gcHN5T3V0Q2hhbi0+c2ZiRGlzdE5ldzsKLQlXb3JkMTYgKnNjZlRtcCA9IHBzeU91dENoYW4tPnByZXZTY2ZMYXN0OwotCi0JZGVsdGFQZSA9IDA7Ci0Jc2ZiQ250ID0gcHN5T3V0Q2hhbi0+c2ZiQ250OwotCi0JLyogY2FsYyBtaW4gYW5kIG1heCBzY2FsZmFjdG9ycyAqLwotCXNjZk1pbiA9IE1BWF8xNjsKLQlzY2ZNYXggPSBNSU5fMTY7Ci0JZm9yIChzZmI9MDsgc2ZiPHNmYkNudDsgc2ZiKyspIHsKLQotCQlpZiAoc2NmW3NmYl0gIT0gTUlOXzE2KSB7Ci0JCQlzY2ZNaW4gPSBtaW4oc2NmTWluLCBzY2Zbc2ZiXSk7Ci0JCQlzY2ZNYXggPSBtYXgoc2NmTWF4LCBzY2Zbc2ZiXSk7Ci0JCX0KLQl9Ci0KLQlpZiAoc2NmTWF4ICE9ICBNSU5fMTYpIHsKLQotCQlzY2ZBY3QgPSBzY2ZNYXg7Ci0KLQkJZG8gewotCQkJc2NmQWN0ID0gc2NmQWN0IC0gMTsKLQkJCWZvciAoc2ZiPTA7IHNmYjxzZmJDbnQ7IHNmYisrKSB7Ci0JCQkJc2NmVG1wW3NmYl0gPSBzY2Zbc2ZiXTsKLQkJCX0KLQkJCXN0b3BTZmIgPSAwOwotCQkJZG8gewotCQkJCXNmYiA9IHN0b3BTZmI7Ci0KLQkJCQl3aGlsZSAoc2ZiIDwgc2ZiQ250ICYmIChzY2Zbc2ZiXSA9PSBNSU5fMTYgfHwgc2NmW3NmYl0gPD0gc2NmQWN0KSkgewotCQkJCQlzZmIgPSBzZmIgKyAxOwotCQkJCX0KLQkJCQlzdGFydFNmYiA9IHNmYjsKLQkJCQlzZmIgPSBzZmIgKyAxOwotCi0JCQkJd2hpbGUgKHNmYiA8IHNmYkNudCAmJiAoc2NmW3NmYl0gPT0gTUlOXzE2IHx8IHNjZltzZmJdID4gc2NmQWN0KSkgewotCQkJCQlzZmIgPSBzZmIgKyAxOwotCQkJCX0KLQkJCQlzdG9wU2ZiID0gc2ZiOwotCi0JCQkJcG9zc2libGVSZWdpb25Gb3VuZCA9IDA7Ci0KLQkJCQlpZiAoc3RhcnRTZmIgPCBzZmJDbnQpIHsKLQkJCQkJcG9zc2libGVSZWdpb25Gb3VuZCA9IDE7Ci0JCQkJCWZvciAoc2ZiPXN0YXJ0U2ZiOyBzZmI8c3RvcFNmYjsgc2ZiKyspIHsKLQotCQkJCQkJaWYgKHNjZltzZmJdIT1NSU5fMTYpIHsKLQotCQkJCQkJCWlmIChzY2ZBY3QgPCBtaW5TY2Zbc2ZiXSkgewotCQkJCQkJCQlwb3NzaWJsZVJlZ2lvbkZvdW5kID0gMDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0KLQkJCQlpZiAocG9zc2libGVSZWdpb25Gb3VuZCkgeyAvKiByZWdpb24gZm91bmQgKi8KLQotCQkJCQkvKiByZXBsYWNlIHNjZnMgaW4gcmVnaW9uIGJ5IHNjZkFjdCAqLwotCQkJCQlmb3IgKHNmYj1zdGFydFNmYjsgc2ZiPHN0b3BTZmI7IHNmYisrKSB7Ci0KLQkJCQkJCWlmIChzY2ZUbXBbc2ZiXSE9TUlOXzE2KQotCQkJCQkJCXNjZlRtcFtzZmJdID0gc2NmQWN0OwotCQkJCQl9Ci0KLQkJCQkJLyogZXN0aW1hdGUgY2hhbmdlIGluIGJpdCBkZW1hbmQgZm9yIG5ldyBzY2ZzICovCi0JCQkJCWRlbHRhU2NmQml0cyA9IGNvdW50U2NmQml0c0RpZmYoc2NmLHNjZlRtcCxzZmJDbnQsc3RhcnRTZmIsc3RvcFNmYik7Ci0JCQkJCWRlbHRhU3BlY1BlID0gY2FsY1NwZWNQZURpZmYoc2NmLCBzY2ZUbXAsIHNmYkNvbnN0UGVQYXJ0LAotCQkJCQkJbG9nU2ZiRW5lcmd5LCBsb2dTZmJGb3JtRmFjdG9yLCBzZmJOUmVsZXZhbnRMaW5lcywKLQkJCQkJCXN0YXJ0U2ZiLCBzdG9wU2ZiKTsKLQkJCQkJZGVsdGFQZU5ldyA9IGRlbHRhUGUgKyBkZWx0YVNjZkJpdHMgKyBkZWx0YVNwZWNQZTsKLQotCi0JCQkJCWlmIChkZWx0YVBlTmV3IDwgMTApIHsKLQkJCQkJCVdvcmQzMiBkaXN0T2xkU3VtLCBkaXN0TmV3U3VtOwotCi0JCQkJCQkvKiBxdWFudGl6ZSBhbmQgY2FsYyBzdW0gb2YgbmV3IGRpc3RvcnRpb24gKi8KLQkJCQkJCWRpc3RPbGRTdW0gPSAwOwotCQkJCQkJZGlzdE5ld1N1bSA9IDA7Ci0JCQkJCQlmb3IgKHNmYj1zdGFydFNmYjsgc2ZiPHN0b3BTZmI7IHNmYisrKSB7Ci0KLQkJCQkJCQlpZiAoc2NmVG1wW3NmYl0gIT0gTUlOXzE2KSB7Ci0JCQkJCQkJCWRpc3RPbGRTdW0gPSBMX2FkZChkaXN0T2xkU3VtLCBzZmJEaXN0W3NmYl0pOwotCi0JCQkJCQkJCXNmYkRpc3ROZXdbc2ZiXSA9IGNhbGNTZmJEaXN0KHBzeU91dENoYW4tPm1kY3RTcGVjdHJ1bSArCi0JCQkJCQkJCQlwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYl0sCi0JCQkJCQkJCQkocHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tzZmIrMV0gLSBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYl0pLAotCQkJCQkJCQkJc2NmQWN0KTsKLQotCi0JCQkJCQkJCWlmIChzZmJEaXN0TmV3W3NmYl0gPiBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGRbc2ZiXSkgewotCQkJCQkJCQkJZGlzdE5ld1N1bSA9IGRpc3RPbGRTdW0gPDwgMTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWRpc3ROZXdTdW0gPSBMX2FkZChkaXN0TmV3U3VtLCBzZmJEaXN0TmV3W3NmYl0pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJaWYgKGRpc3ROZXdTdW0gPCBkaXN0T2xkU3VtKSB7Ci0JCQkJCQkJZGVsdGFQZSA9IGRlbHRhUGVOZXc7Ci0JCQkJCQkJZm9yIChzZmI9c3RhcnRTZmI7IHNmYjxzdG9wU2ZiOyBzZmIrKykgewotCi0JCQkJCQkJCWlmIChzY2Zbc2ZiXSE9TUlOXzE2KSB7Ci0JCQkJCQkJCQlzY2Zbc2ZiXSA9IHNjZkFjdDsKLQkJCQkJCQkJCXNmYkRpc3Rbc2ZiXSA9IHNmYkRpc3ROZXdbc2ZiXTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gd2hpbGUgKHN0b3BTZmIgPD0gc2ZiQ250KTsKLQkJfSB3aGlsZSAoc2NmQWN0ID4gc2NmTWluKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogRXN0aW1hdGVTY2FsZUZhY3RvcnNDaGFubmVsCi0qIGRlc2NyaXB0aW9uOiAgZXN0aW1hdGUgc2NhbGUgZmFjdG9ycyBmb3Igb25lIGNoYW5uZWwKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotRXN0aW1hdGVTY2FsZUZhY3RvcnNDaGFubmVsKFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgKnNjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgKmdsb2JhbEdhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICpsb2dTZmJFbmVyZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICpsb2dTZmJGb3JtRmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAqc2ZiTlJlbGV2YW50TGluZXMpCi17Ci0JV29yZDMyIGksIGo7Ci0JV29yZDMyIHRocmVzaCwgZW5lcmd5OwotCVdvcmQzMiBlbmVyZ3lQYXJ0LCB0aHJlc2hvbGRQYXJ0OwotCVdvcmQzMiBzY2ZJbnQsIG1pblNjZiwgbWF4U2NmLCBtYXhBbGxvd2VkU2NmLCBsYXN0U2Y7Ci0JV29yZDMyIG1heFNwZWM7Ci0JV29yZDMyICpzZmJEaXN0ID0gcHN5T3V0Q2hhbi0+c2ZiRGlzdDsKLQlXb3JkMTYgKm1pblNmTWF4UXVhbnQgPSBwc3lPdXRDaGFuLT5taW5TZk1heFF1YW50OwotCVdvcmQxNiAqbWluU2NmQ2FsY3VsYXRlZCA9IHBzeU91dENoYW4tPm1pblNjZkNhbGN1bGF0ZWQ7Ci0KLQotCWZvciAoaT0wOyBpPHBzeU91dENoYW4tPnNmYkNudDsgaSsrKSB7Ci0JCVdvcmQzMiBzYmZ3aXRoLCBzYmZTdGFydDsKLQkJV29yZDMyICptZGN0U3BlYzsKLQkJdGhyZXNoID0gcHN5T3V0Q2hhbi0+c2ZiVGhyZXNob2xkW2ldOwotCQllbmVyZ3kgPSBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbaV07Ci0KLQkJc2JmU3RhcnQgPSBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW2ldOwotCQlzYmZ3aXRoID0gcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tpKzFdIC0gc2JmU3RhcnQ7Ci0JCW1kY3RTcGVjID0gcHN5T3V0Q2hhbi0+bWRjdFNwZWN0cnVtK3NiZlN0YXJ0OwotCi0JCW1heFNwZWMgPSAwOwotCQkvKiBtYXhpbXVtIG9mIHNwZWN0cnVtICovCi0JCWZvciAoaj1zYmZ3aXRoOyBqOyBqLS0gKSB7Ci0JCQlXb3JkMzIgYWJzU3BlYyA9IExfYWJzKCptZGN0U3BlYyk7IG1kY3RTcGVjKys7Ci0JCQltYXhTcGVjIHw9IGFic1NwZWM7Ci0JCX0KLQotCQkvKiBzY2ZzIHdpdGhvdXQgZW5lcmd5IG9yIHdpdGggdGhyZXNoPmVuZXJneSBhcmUgbWFya2VkIHdpdGggTUlOXzE2ICovCi0JCXNjZltpXSA9IE1JTl8xNjsKLQkJbWluU2ZNYXhRdWFudFtpXSA9IE1JTl8xNjsKLQotCQlpZiAoKG1heFNwZWMgPiAwKSAmJiAoZW5lcmd5ID4gdGhyZXNoKSkgewotCi0JCQllbmVyZ3lQYXJ0ID0gbG9nU2ZiRm9ybUZhY3RvcltpXTsKLQkJCXRocmVzaG9sZFBhcnQgPSBpTG9nNCh0aHJlc2gpOwotCQkJLyogLTIwID0gNCpsb2cyKDYuNzUpIC0gMzIgKi8KLQkJCXNjZkludCA9ICgodGhyZXNob2xkUGFydCAtIGVuZXJneVBhcnQgLSAyMCkgKiBTQ0FMRV9FU1RJTUFURV9DT0VGKSA+PiAxNTsKLQotCQkJbWluU2ZNYXhRdWFudFtpXSA9IGlMb2c0KG1heFNwZWMpIC0gNjg7IC8qIDY4ICAtMTYvMypsb2coTUFYX1FVQU5UKzAuNS1sb2dDb24pL2xvZygyKSArIDEgKi8KLQotCi0JCQlpZiAobWluU2ZNYXhRdWFudFtpXSA+IHNjZkludCkgewotCQkJCXNjZkludCA9IG1pblNmTWF4UXVhbnRbaV07Ci0JCQl9Ci0KLQkJCS8qIGZpbmQgYmV0dGVyIHNjYWxlZmFjdG9yIHdpdGggYW5hbHlzaXMgYnkgc3ludGhlc2lzICovCi0JCQlzY2ZJbnQgPSBpbXByb3ZlU2NmKHBzeU91dENoYW4tPm1kY3RTcGVjdHJ1bStzYmZTdGFydCwKLQkJCQlzYmZ3aXRoLAotCQkJCXRocmVzaCwgc2NmSW50LCBtaW5TZk1heFF1YW50W2ldLAotCQkJCSZzZmJEaXN0W2ldLCAmbWluU2NmQ2FsY3VsYXRlZFtpXSk7Ci0KLQkJCXNjZltpXSA9IHNjZkludDsKLQkJfQotCX0KLQotCi0JLyogc2NhbGVmYWN0b3IgZGlmZmVyZWNlIHJlZHVjdGlvbiAgKi8KLQl7Ci0JCVdvcmQxNiBzZmJDb25zdFBlUGFydFtNQVhfR1JPVVBFRF9TRkJdOwotCQlmb3IoaT0wO2k8cHN5T3V0Q2hhbi0+c2ZiQ250O2krKykgewotCQkJc2ZiQ29uc3RQZVBhcnRbaV0gPSBNSU5fMTY7Ci0JCX0KLQotCQlhc3NpbWlsYXRlU2luZ2xlU2NmKHBzeU91dENoYW4sIHNjZiwKLQkJCW1pblNmTWF4UXVhbnQsIHNmYkRpc3QsIHNmYkNvbnN0UGVQYXJ0LCBsb2dTZmJFbmVyZ3ksCi0JCQlsb2dTZmJGb3JtRmFjdG9yLCBzZmJOUmVsZXZhbnRMaW5lcywgbWluU2NmQ2FsY3VsYXRlZCwgMSk7Ci0KLQkJYXNzaW1pbGF0ZU11bHRpcGxlU2NmKHBzeU91dENoYW4sIHNjZiwKLQkJCW1pblNmTWF4UXVhbnQsIHNmYkRpc3QsIHNmYkNvbnN0UGVQYXJ0LCBsb2dTZmJFbmVyZ3ksCi0JCQlsb2dTZmJGb3JtRmFjdG9yLCBzZmJOUmVsZXZhbnRMaW5lcyk7Ci0JfQotCi0JLyogZ2V0IG1heCBzY2FsZWZhYyBmb3IgZ2xvYmFsIGdhaW4gKi8KLQltYXhTY2YgPSBNSU5fMTY7Ci0JbWluU2NmID0gTUFYXzE2OwotCWZvciAoaT0wOyBpPHBzeU91dENoYW4tPnNmYkNudDsgaSsrKSB7Ci0KLQkJaWYgKG1heFNjZiA8IHNjZltpXSkgewotCQkJbWF4U2NmID0gc2NmW2ldOwotCQl9Ci0KLQkJaWYgKChzY2ZbaV0gIT0gTUlOXzE2KSAmJiAobWluU2NmID4gc2NmW2ldKSkgewotCQkJbWluU2NmID0gc2NmW2ldOwotCQl9Ci0JfQotCS8qIGxpbWl0IHNjZiBkZWx0YSAqLwotCW1heEFsbG93ZWRTY2YgPSBtaW5TY2YgKyBNQVhfU0NGX0RFTFRBOwotCWZvcihpPTA7IGk8cHN5T3V0Q2hhbi0+c2ZiQ250OyBpKyspIHsKLQotCQlpZiAoKHNjZltpXSAhPSBNSU5fMTYpICYmIChtYXhBbGxvd2VkU2NmIDwgc2NmW2ldKSkgewotCQkJc2NmW2ldID0gbWF4QWxsb3dlZFNjZjsKLQkJfQotCX0KLQkvKiBuZXcgbWF4U2NmIGlmIGFueSBzY2YgaGFzIGJlZW4gbGltaXRlZCAqLwotCi0JaWYgKG1heEFsbG93ZWRTY2YgPCBtYXhTY2YpIHsKLQkJbWF4U2NmID0gbWF4QWxsb3dlZFNjZjsKLQl9Ci0KLQkvKiBjYWxjIGxvb3Agc2NhbGVmYWN0b3JzICovCi0KLQlpZiAobWF4U2NmID4gTUlOXzE2KSB7Ci0JCSpnbG9iYWxHYWluID0gbWF4U2NmOwotCQlsYXN0U2YgPSAwOwotCi0JCWZvcihpPTA7IGk8cHN5T3V0Q2hhbi0+c2ZiQ250OyBpKyspIHsKLQotCQkJaWYgKHNjZltpXSA9PSBNSU5fMTYpIHsKLQkJCQlzY2ZbaV0gPSBsYXN0U2Y7Ci0JCQkJLyogc2V0IGJhbmQgZXhwbGljaXRlbHkgdG8gemVybyAqLwotCQkJCWZvciAoaj1wc3lPdXRDaGFuLT5zZmJPZmZzZXRzW2ldOyBqPHBzeU91dENoYW4tPnNmYk9mZnNldHNbaSsxXTsgaisrKSB7Ci0JCQkJCXBzeU91dENoYW4tPm1kY3RTcGVjdHJ1bVtqXSA9IDA7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2NmW2ldID0gbWF4U2NmIC0gc2NmW2ldOwotCQkJCWxhc3RTZiA9IHNjZltpXTsKLQkJCX0KLQkJfQotCX0KLQllbHNlewotCQkqZ2xvYmFsR2FpbiA9IDA7Ci0JCS8qIHNldCBzcGVjdHJ1bSBleHBsaWNpdGVseSB0byB6ZXJvICovCi0JCWZvcihpPTA7IGk8cHN5T3V0Q2hhbi0+c2ZiQ250OyBpKyspIHsKLQkJCXNjZltpXSA9IDA7Ci0JCQlmb3IgKGo9cHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tpXTsgajxwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW2krMV07IGorKykgewotCQkJCXBzeU91dENoYW4tPm1kY3RTcGVjdHJ1bVtqXSA9IDA7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogQ2FsY0Zvcm1GYWN0b3IKLSogZGVzY3JpcHRpb246ICBlc3RpbWF0ZSBGb3JtIGZhY3RvcnMgZm9yIGFsbCBjaGFubmVsCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotQ2FsY0Zvcm1GYWN0b3IoV29yZDE2IGxvZ1NmYkZvcm1GYWN0b3JbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgV29yZDE2IHNmYk5SZWxldmFudExpbmVzW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgIFdvcmQxNiBsb2dTZmJFbmVyZ3lbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBuQ2hhbm5lbHMpCi17Ci0JV29yZDE2IGo7Ci0KLQlmb3IgKGo9MDsgajxuQ2hhbm5lbHM7IGorKykgewotCQlDYWxjRm9ybUZhY3RvckNoYW5uZWwobG9nU2ZiRm9ybUZhY3RvcltqXSwgc2ZiTlJlbGV2YW50TGluZXNbal0sIGxvZ1NmYkVuZXJneVtqXSwgJnBzeU91dENoYW5uZWxbal0pOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBFc3RpbWF0ZVNjYWxlRmFjdG9ycwotKiBkZXNjcmlwdGlvbjogIGVzdGltYXRlIHNjYWxlIGZhY3RvcnMgZm9yIGFsbCBjaGFubmVsCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotRXN0aW1hdGVTY2FsZUZhY3RvcnMoUFNZX09VVF9DSEFOTkVMIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMICBxY091dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICBsb2dTZmJFbmVyZ3lbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgIGxvZ1NmYkZvcm1GYWN0b3JbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAotICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgIHNmYk5SZWxldmFudExpbmVzW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICBuQ2hhbm5lbHMpCi17Ci0JV29yZDE2IGo7Ci0KLQlmb3IgKGo9MDsgajxuQ2hhbm5lbHM7IGorKykgewotCQlFc3RpbWF0ZVNjYWxlRmFjdG9yc0NoYW5uZWwoJnBzeU91dENoYW5uZWxbal0sCi0JCQlxY091dENoYW5uZWxbal0uc2NmLAotCQkJJihxY091dENoYW5uZWxbal0uZ2xvYmFsR2FpbiksCi0JCQlsb2dTZmJFbmVyZ3lbal0sCi0JCQlsb2dTZmJGb3JtRmFjdG9yW2pdLAotCQkJc2ZiTlJlbGV2YW50TGluZXNbal0pOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvc3ByZWFkaW5nLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9zcHJlYWRpbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFmMmZmZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9zcHJlYWRpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlGaWxlOgkJc3ByZWFkaW5nLmMKLQotCUNvbnRlbnQ6CVNwcmVhZGluZyBvZiBlbmVyZ3kgZnVuY3Rpb24KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJhc2ljX29wLmgiCi0jaW5jbHVkZSAib3Blcl8zMmIuaCIKLSNpbmNsdWRlICJzcHJlYWRpbmcuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBTcHJlYWRpbmdNYXgKLSogZGVzY3JpcHRpb246ICBzcHJlYWRpbmcgdGhlIGVuZXJneQotKgkJCQkgaGlnaGVyIGZyZXF1ZW5jaWVzIHRocihuKSA9IG1heCh0aHIobiksIHNoKG4pKnRocihuLTEpKQotKgkJCQkgbG93ZXIgZnJlcXVlbmNpZXMgIHRocihuKSA9IG1heCh0aHIobiksIHNsKG4pKnRocihuKzEpKQotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgU3ByZWFkaW5nTWF4KGNvbnN0IFdvcmQxNiBwYkNudCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqbWFza0xvd0ZhY3RvciwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqbWFza0hpZ2hGYWN0b3IsCi0gICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKnBiU3ByZWFkZWRFbmVyZ3kpCi17Ci0gIFdvcmQzMiBpOwotCi0gIC8qIHNsb3BlIHRvIGhpZ2hlciBmcmVxdWVuY2llcyAqLwotICBmb3IgKGk9MTsgaTxwYkNudDsgaSsrKSB7Ci0gICAgcGJTcHJlYWRlZEVuZXJneVtpXSA9IG1heChwYlNwcmVhZGVkRW5lcmd5W2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMX21weV9scyhwYlNwcmVhZGVkRW5lcmd5W2ktMV0sIG1hc2tIaWdoRmFjdG9yW2ldKSk7Ci0gIH0KLSAgLyogc2xvcGUgdG8gbG93ZXIgZnJlcXVlbmNpZXMgKi8KLSAgZm9yIChpPXBiQ250IC0gMjsgaT49MDsgaS0tKSB7Ci0gICAgcGJTcHJlYWRlZEVuZXJneVtpXSA9IG1heChwYlNwcmVhZGVkRW5lcmd5W2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMX21weV9scyhwYlNwcmVhZGVkRW5lcmd5W2krMV0sIG1hc2tMb3dGYWN0b3JbaV0pKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvc3RhdF9iaXRzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9zdGF0X2JpdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJiZDhiZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9zdGF0X2JpdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCXN0YXRfYml0cy5jCi0KLQlDb250ZW50OglTdGF0aWMgYml0IGNvdW50ZXIgZnVuY3Rpb25zCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJzdGF0X2JpdHMuaCIKLSNpbmNsdWRlICJiaXRlbmMuaCIKLSNpbmNsdWRlICJ0bnMuaCIKLQotCi10eXBlZGVmIGVudW0gewotICBTSV9JRF9CSVRTICAgICAgICAgICAgICAgID0oMyksCi0gIFNJX0ZJTExfQ09VTlRfQklUUyAgICAgICAgPSg0KSwKLSAgU0lfRklMTF9FU0NfQ09VTlRfQklUUyAgICA9KDgpLAotICBTSV9GSUxMX0VYVEVOVElPTl9CSVRTICAgID0oNCksCi0gIFNJX0ZJTExfTklCQkxFX0JJVFMgICAgICAgPSg0KSwKLSAgU0lfU0NFX0JJVFMgICAgICAgICAgICAgICA9KDQpLAotICBTSV9DUEVfQklUUyAgICAgICAgICAgICAgID0oNSksCi0gIFNJX0NQRV9NU19NQVNLX0JJVFMgICAgICAgPSgyKSAsCi0gIFNJX0lDU19JTkZPX0JJVFNfTE9ORyAgICAgPSgxKzIrMSs2KzEpLAotICBTSV9JQ1NfSU5GT19CSVRTX1NIT1JUICAgID0oMSsyKzErNCs3KSwKLSAgU0lfSUNTX0JJVFMgICAgICAgICAgICAgICA9KDgrMSsxKzEpCi19IFNJX0JJVFM7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBjb3VudE1zTWFza0JpdHMKLSogZGVzY3JpcHRpb246ICAgY291bnQgbXMgc3RlcmVvIGJpdHMgZGVtYW5kCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQxNiBjb3VudE1zTWFza0JpdHMoV29yZDE2ICAgc2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgc2ZiUGVyR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICBtYXhTZmJQZXJHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBUT09MU0lORk8gKnRvb2xzSW5mbykKLXsKLSAgV29yZDE2IG1zQml0cywgc2ZiT2ZmLCBzZmI7Ci0gIG1zQml0cyA9IDA7Ci0KLQotICBzd2l0Y2godG9vbHNJbmZvLT5tc0RpZ2VzdCkgewotICAgIGNhc2UgTVNfTk9ORToKLSAgICBjYXNlIE1TX0FMTDoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNU19TT01FOgotICAgICAgZm9yKHNmYk9mZj0wOyBzZmJPZmY8c2ZiQ250OyBzZmJPZmYrPXNmYlBlckdyb3VwKQotICAgICAgICBmb3Ioc2ZiPTA7IHNmYjxtYXhTZmJQZXJHcm91cDsgc2ZiKyspCi0gICAgICAgICAgbXNCaXRzICs9IDE7Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4obXNCaXRzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiB0bnNDb3VudAotKiBkZXNjcmlwdGlvbjogICBjb3VudCB0bnMgYml0IGRlbWFuZCAgY29yZSBmdW5jdGlvbgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBXb3JkMTYgdG5zQ291bnQoVE5TX0lORk8gKnRuc0luZm8sIFdvcmQxNiBibG9ja1R5cGUpCi17Ci0KLSAgV29yZDMyIGksIGs7Ci0gIEZsYWcgdG5zUHJlc2VudDsKLSAgV29yZDMyIG51bU9mV2luZG93czsKLSAgV29yZDMyIGNvdW50OwotICBXb3JkMzIgY29lZkJpdHM7Ci0gIFdvcmQxNiAqcHRjb2VmOwotCi0gIGNvdW50ID0gMDsKLQotICBpZiAoYmxvY2tUeXBlID09IDIpCi0gICAgbnVtT2ZXaW5kb3dzID0gODsKLSAgZWxzZQotICAgIG51bU9mV2luZG93cyA9IDE7Ci0gIHRuc1ByZXNlbnQgPSAwOwotCi0gIGZvciAoaT0wOyBpPG51bU9mV2luZG93czsgaSsrKSB7Ci0KLSAgICBpZiAodG5zSW5mby0+dG5zQWN0aXZlW2ldIT0wKSB7Ci0gICAgICB0bnNQcmVzZW50ID0gMTsKLSAgICB9Ci0gIH0KLQotICBpZiAodG5zUHJlc2VudCkgewotICAgIC8qIHRoZXJlIGlzIGRhdGEgdG8gYmUgd3JpdHRlbiovCi0gICAgLypjb3VudCArPSAxOyAqLwotICAgIGZvciAoaT0wOyBpPG51bU9mV2luZG93czsgaSsrKSB7Ci0KLSAgICAgIGlmIChibG9ja1R5cGUgPT0gMikKLSAgICAgICAgY291bnQgKz0gMTsKLSAgICAgIGVsc2UKLSAgICAgICAgY291bnQgKz0gMjsKLQotICAgICAgaWYgKHRuc0luZm8tPnRuc0FjdGl2ZVtpXSkgewotICAgICAgICBjb3VudCArPSAxOwotCi0gICAgICAgIGlmIChibG9ja1R5cGUgPT0gMikgewotICAgICAgICAgIGNvdW50ICs9IDQ7Ci0gICAgICAgICAgY291bnQgKz0gMzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBjb3VudCArPSA2OwotICAgICAgICAgIGNvdW50ICs9IDU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodG5zSW5mby0+b3JkZXJbaV0pIHsKLSAgICAgICAgICBjb3VudCArPSAxOyAvKmRpcmVjdGlvbiovCi0gICAgICAgICAgY291bnQgKz0gMTsgLypjb2VmX2NvbXByZXNzaW9uICovCi0KLSAgICAgICAgICBpZiAodG5zSW5mby0+Y29lZlJlc1tpXSA9PSA0KSB7Ci0gICAgICAgICAgICBwdGNvZWYgPSB0bnNJbmZvLT5jb2VmICsgaSpUTlNfTUFYX09SREVSX1NIT1JUOwotCQkJY29lZkJpdHMgPSAzOwotICAgICAgICAgICAgZm9yKGs9MDsgazx0bnNJbmZvLT5vcmRlcltpXTsgaysrKSB7Ci0KLSAgICAgICAgICAgICAgaWYgKChwdGNvZWZba10gPiAzKSB8fCAocHRjb2VmW2tdIDwgLTQpKSB7Ci0gICAgICAgICAgICAgICAgY29lZkJpdHMgPSA0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgY29lZkJpdHMgPSAyOwotICAgICAgICAgICAgcHRjb2VmID0gdG5zSW5mby0+Y29lZiArIGkqVE5TX01BWF9PUkRFUl9TSE9SVDsKLQkJCWZvcihrPTA7IGs8dG5zSW5mby0+b3JkZXJbaV07IGsrKykgewotCi0gICAgICAgICAgICAgIGlmICgocHRjb2VmW2tdID4gMSkgfHwgKHB0Y29lZltrXSA8IC0yKSkgewotICAgICAgICAgICAgICAgIGNvZWZCaXRzID0gMzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBmb3IgKGs9MDsgazx0bnNJbmZvLT5vcmRlcltpXTsgaysrICkgewotICAgICAgICAgICAgY291bnQgKz0gY29lZkJpdHM7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGNvdW50OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBjb3VudFRuc0JpdHMKLSogZGVzY3JpcHRpb246ICAgY291bnQgdG5zIGJpdCBkZW1hbmQKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDE2IGNvdW50VG5zQml0cyhUTlNfSU5GTyAqdG5zSW5mbyxXb3JkMTYgYmxvY2tUeXBlKQotewotICByZXR1cm4odG5zQ291bnQodG5zSW5mbywgYmxvY2tUeXBlKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogY291bnRTdGF0aWNCaXRkZW1hbmQKLSogZGVzY3JpcHRpb246ICAgY291bnQgc3RhdGljIGJpdCBkZW1hbmQgaW5jbHVkZSB0bnMKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1Xb3JkMTYgY291bnRTdGF0aWNCaXRkZW1hbmQoUFNZX09VVF9DSEFOTkVMIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQgKnBzeU91dEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGNoYW5uZWxzLAotCQkJCQkJCVdvcmQxNiBhZHRzVXNlZCkKLXsKLSAgV29yZDMyIHN0YXRCaXRzOwotICBXb3JkMzIgY2g7Ci0KLSAgc3RhdEJpdHMgPSAwOwotCi0gIC8qIGlmIGFkdHMgdXNlZCwgYWRkIDU2IGJpdHMgKi8KLSAgaWYoYWR0c1VzZWQpIHN0YXRCaXRzICs9IDU2OwotCi0KLSAgc3dpdGNoIChjaGFubmVscykgewotICAgIGNhc2UgMToKLSAgICAgIHN0YXRCaXRzICs9IFNJX0lEX0JJVFMrU0lfU0NFX0JJVFMrU0lfSUNTX0JJVFM7Ci0gICAgICBzdGF0Qml0cyArPSBjb3VudFRuc0JpdHMoJihwc3lPdXRDaGFubmVsWzBdLnRuc0luZm8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbMF0ud2luZG93U2VxdWVuY2UpOwotCi0gICAgICBzd2l0Y2gocHN5T3V0Q2hhbm5lbFswXS53aW5kb3dTZXF1ZW5jZSl7Ci0gICAgICAgIGNhc2UgTE9OR19XSU5ET1c6Ci0gICAgICAgIGNhc2UgU1RBUlRfV0lORE9XOgotICAgICAgICBjYXNlIFNUT1BfV0lORE9XOgotICAgICAgICAgIHN0YXRCaXRzICs9IFNJX0lDU19JTkZPX0JJVFNfTE9ORzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTSE9SVF9XSU5ET1c6Ci0gICAgICAgICAgc3RhdEJpdHMgKz0gU0lfSUNTX0lORk9fQklUU19TSE9SVDsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIHN0YXRCaXRzICs9IFNJX0lEX0JJVFMrU0lfQ1BFX0JJVFMrMipTSV9JQ1NfQklUUzsKLQotICAgICAgc3RhdEJpdHMgKz0gU0lfQ1BFX01TX01BU0tfQklUUzsKLSAgICAgIHN0YXRCaXRzICs9IGNvdW50TXNNYXNrQml0cyhwc3lPdXRDaGFubmVsWzBdLnNmYkNudCwKLQkJCQkJCQkJICBwc3lPdXRDaGFubmVsWzBdLnNmYlBlckdyb3VwLAotCQkJCQkJCQkgIHBzeU91dENoYW5uZWxbMF0ubWF4U2ZiUGVyR3JvdXAsCi0JCQkJCQkJCSAgJnBzeU91dEVsZW1lbnQtPnRvb2xzSW5mbyk7Ci0KLSAgICAgIHN3aXRjaCAocHN5T3V0Q2hhbm5lbFswXS53aW5kb3dTZXF1ZW5jZSkgewotICAgICAgICBjYXNlIExPTkdfV0lORE9XOgotICAgICAgICBjYXNlIFNUQVJUX1dJTkRPVzoKLSAgICAgICAgY2FzZSBTVE9QX1dJTkRPVzoKLSAgICAgICAgICBzdGF0Qml0cyArPSBTSV9JQ1NfSU5GT19CSVRTX0xPTkc7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU0hPUlRfV0lORE9XOgotICAgICAgICAgIHN0YXRCaXRzICs9IFNJX0lDU19JTkZPX0JJVFNfU0hPUlQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBmb3IoY2g9MDsgY2g8MjsgY2grKykKLSAgICAgICAgc3RhdEJpdHMgKz0gY291bnRUbnNCaXRzKCYocHN5T3V0Q2hhbm5lbFtjaF0udG5zSW5mbyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS53aW5kb3dTZXF1ZW5jZSk7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiBzdGF0Qml0czsKLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvdG5zLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90bnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdjMzk3MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90bnMuYworKysgL2Rldi9udWxsCkBAIC0xLDkwNiArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCXRucy5jCi0KLQlDb250ZW50OglEZWZpbml0aW9uIFROUyB0b29scyBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgImJhc2ljX29wLmgiCi0jaW5jbHVkZSAib3Blcl8zMmIuaCIKLSNpbmNsdWRlICJhc3NlcnQuaCIKLSNpbmNsdWRlICJhYWNfcm9tLmgiCi0jaW5jbHVkZSAicHN5X2NvbnN0LmgiCi0jaW5jbHVkZSAidG5zLmgiCi0jaW5jbHVkZSAidG5zX3BhcmFtLmgiCi0jaW5jbHVkZSAicHN5X2NvbmZpZ3VyYXRpb24uaCIKLSNpbmNsdWRlICJ0bnNfZnVuYy5oIgotCi0jZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCkKLQotI2RlZmluZSBUTlNfTU9ESUZZX0JFR0lOICAgICAgICAgMjYwMCAgLyogSHogKi8KLSNkZWZpbmUgUkFUSU9fUEFUQ0hfTE9XRVJfQk9SREVSIDM4MCAgIC8qIEh6ICovCi0jZGVmaW5lIFROU19HQUlOX1RIUkVTSAkJCSAxNDEgICAvKiAxLjQxKjEwMCAqLwotI2RlZmluZSBOT1JNX0NPRUYJCQkJIDB4MDI4ZjVjMjgKLQotc3RhdGljIGNvbnN0IFdvcmQzMiBUTlNfUEFSQ09SX1RIUkVTSCA9IDB4MGNjY2NjY2Q7IC8qIDAuMSooMSA8PCAzMSkgKi8KLS8qIExpbWl0IGJhbmRzIHRvID4gMi4wIGtIeiAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IHRuc01pbkJhbmROdW1iZXJMb25nWzEyXSA9Ci17IDExLCAxMiwgMTUsIDE2LCAxNywgMjAsIDI1LCAyNiwgMjQsIDI4LCAzMCwgMzEgfTsKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCB0bnNNaW5CYW5kTnVtYmVyU2hvcnRbMTJdID0KLXsgMiwgMiwgMiwgMywgMywgNCwgNiwgNiwgOCwgMTAsIDEwLCAxMiB9OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBNYWluL0xvdyBQcm9maWxlIFROUyBQYXJhbWV0ZXJzICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgdG5zTWF4QmFuZHNMb25nTWFpbkxvd1sxMl0gPQoteyAzMSwgMzEsIDM0LCA0MCwgNDIsIDUxLCA0NiwgNDYsIDQyLCA0MiwgNDIsIDM5IH07Ci0KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCB0bnNNYXhCYW5kc1Nob3J0TWFpbkxvd1sxMl0gPQoteyA5LCA5LCAxMCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCB9OwotCi0KLXN0YXRpYyB2b2lkIENhbGNXZWlnaHRlZFNwZWN0cnVtKGNvbnN0IFdvcmQzMiBzcGVjdHJ1bVtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHdlaWdodGVkU3BlY3RydW1bXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiogc2ZiRW5lcmd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2KiBzZmJPZmZzZXQsIFdvcmQxNiBscGNTdGFydExpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbHBjU3RvcExpbmUsIFdvcmQxNiBscGNTdGFydEJhbmQsV29yZDE2IGxwY1N0b3BCYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICpwV29yazMyKTsKLQotCi0KLXZvaWQgQXV0b0NvcnJlbGF0aW9uKGNvbnN0IFdvcmQxNiBpbnB1dFtdLCBXb3JkMzIgY29ycltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzYW1wbGVzLCBXb3JkMTYgY29yckNvZWZmKTsKLXN0YXRpYyBXb3JkMTYgQXV0b1RvUGFyY29yKFdvcmQzMiB3b3JrQnVmZmVyW10sIFdvcmQzMiByZWZsQ29lZmZbXSwgV29yZDE2IG51bU9mQ29lZmYpOwotCi1zdGF0aWMgV29yZDE2IENhbGNUbnNGaWx0ZXIoY29uc3QgV29yZDE2KiBzaWduYWwsIGNvbnN0IFdvcmQzMiB3aW5kb3dbXSwgV29yZDE2IG51bU9mTGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHRuc09yZGVyLCBXb3JkMzIgcGFyY29yW10pOwotCi0KLXN0YXRpYyB2b2lkIFBhcmNvcjJJbmRleChjb25zdCBXb3JkMzIgcGFyY29yW10sIFdvcmQxNiBpbmRleFtdLCBXb3JkMTYgb3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGJpdHNQZXJDb2VmZik7Ci0KLXN0YXRpYyB2b2lkIEluZGV4MlBhcmNvcihjb25zdCBXb3JkMTYgaW5kZXhbXSwgV29yZDMyIHBhcmNvcltdLCBXb3JkMTYgb3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGJpdHNQZXJDb2VmZik7Ci0KLQotCi1zdGF0aWMgdm9pZCBBbmFseXNpc0ZpbHRlckxhdHRpY2UoY29uc3QgV29yZDMyIHNpZ25hbFtdLCBXb3JkMTYgbnVtT2ZMaW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgcGFyQ29lZmZbXSwgV29yZDE2IG9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBvdXRwdXRbXSk7Ci0KLQotLyoqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IEZyZXFUb0JhbmRXaXRoUm91bmRpbmcKLSogZGVzY3JpcHRpb246ICBSZXRyaWV2ZSBpbmRleCBvZiBuZWFyZXN0IGJhbmQgYm9yZGVyCi0qIHJldHVybnQ6CQlpbmRleAotKgotKi8KLXN0YXRpYyBXb3JkMTYgRnJlcVRvQmFuZFdpdGhSb3VuZGluZyhXb3JkMzIgZnJlcSwgICAgICAgICAgICAgICAgICAgLyohPCBmcmVxdWVuY3kgaW4gSGVydHogKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgZnMsICAgICAgICAgICAgICAgICAgICAgLyohPCBTYW1wbGluZyBmcmVxdWVuY3kgaW4gSGVydHogKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtT2ZCYW5kcywgICAgICAgICAgICAgLyohPCB0b3RhbCBudW1iZXIgb2YgYmFuZHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKmJhbmRTdGFydE9mZnNldCkgLyohPCB0YWJsZSBvZiBiYW5kIGJvcmRlcnMgKi8KLXsKLSAgV29yZDMyIGxpbmVOdW1iZXIsIGJhbmQ7Ci0gIFdvcmQzMiB0ZW1wLCBzaGlmdDsKLQotICAvKiAgYXNzZXJ0KGZyZXEgPj0gMCk7ICAqLwotICBzaGlmdCA9IG5vcm1fbChmcyk7Ci0gIGxpbmVOdW1iZXIgPSAoZXh0cmFjdF9sKGZpeG11bCgoYmFuZFN0YXJ0T2Zmc2V0W251bU9mQmFuZHNdIDw8IDIpLERpdl8zMihmcmVxIDw8IHNoaWZ0LGZzIDw8IHNoaWZ0KSkpICsgMSkgPj4gMTsKLQotICAvKiBmcmVxID4gZnMvMiAqLwotICB0ZW1wID0gbGluZU51bWJlciAtIGJhbmRTdGFydE9mZnNldFtudW1PZkJhbmRzXSA7Ci0gIGlmICh0ZW1wID49IDApCi0gICAgcmV0dXJuIG51bU9mQmFuZHM7Ci0KLSAgLyogZmluZCBiYW5kIHRoZSBsaW5lIG51bWJlciBsaWVzIGluICovCi0gIGZvciAoYmFuZD0wOyBiYW5kPG51bU9mQmFuZHM7IGJhbmQrKykgewotICAgIHRlbXAgPSBiYW5kU3RhcnRPZmZzZXRbYmFuZCArIDFdIC0gbGluZU51bWJlcjsKLSAgICBpZiAodGVtcCA+IDApIGJyZWFrOwotICB9Ci0KLSAgdGVtcCA9IChsaW5lTnVtYmVyIC0gYmFuZFN0YXJ0T2Zmc2V0W2JhbmRdKTsKLSAgdGVtcCA9ICh0ZW1wIC0gKGJhbmRTdGFydE9mZnNldFtiYW5kICsgMV0gLSBsaW5lTnVtYmVyKSk7Ci0gIGlmICggdGVtcCA+IDAgKQotICB7Ci0gICAgYmFuZCA9IGJhbmQgKyAxOwotICB9Ci0KLSAgcmV0dXJuIGV4dHJhY3RfbChiYW5kKTsKLX0KLQotCi0vKioKLSoKLSogZnVuY3Rpb24gbmFtZTogSW5pdFRuc0NvbmZpZ3VyYXRpb25Mb25nCi0qIGRlc2NyaXB0aW9uOiAgRmlsbCBUTlNfQ09ORklHIHN0cnVjdHVyZSB3aXRoIHNlbnNpYmxlIGNvbnRlbnQgZm9yIGxvbmcgYmxvY2tzCi0qIHJldHVybnM6CQkwIGlmIHN1Y2Nlc3MKLSoKLSovCi1Xb3JkMTYgSW5pdFRuc0NvbmZpZ3VyYXRpb25Mb25nKFdvcmQzMiBiaXRSYXRlLCAgICAgICAgICAvKiE8IGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIHNhbXBsZVJhdGUsICAgICAgICAgIC8qITwgU2FtcGxpbmcgZnJlcXVlbmN5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjaGFubmVscywgICAgICAgICAgICAvKiE8IG51bWJlciBvZiBjaGFubmVscyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTlNfQ09ORklHICp0QywgICAgICAgICAgICAgLyohPCBUTlMgQ29uZmlnIHN0cnVjdCAobW9kaWZpZWQpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OX0xPTkcgKnBDLCAvKiE8IHBzeSBjb25maWcgc3RydWN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBhY3RpdmUpICAgICAgICAgICAgICAvKiE8IHRucyBhY3RpdmUgZmxhZyAqLwotewotCi0gIFdvcmQzMiBiaXRyYXRlUGVyQ2hhbm5lbCBfX3VudXNlZDsKLSAgdEMtPm1heE9yZGVyICAgICA9IFROU19NQVhfT1JERVI7Ci0gIHRDLT50bnNTdGFydEZyZXEgPSAxMjc1OwotICB0Qy0+Y29lZlJlcyAgICAgID0gNDsKLQotICAvKiB0byBhdm9pZCBpbnRlZ2VyIGRpdmlzaW9uICovCi0gIGlmICggc3ViKGNoYW5uZWxzLDIpID09IDAgKSB7Ci0gICAgYml0cmF0ZVBlckNoYW5uZWwgPSBiaXRSYXRlID4+IDE7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgYml0cmF0ZVBlckNoYW5uZWwgPSBiaXRSYXRlOwotICB9Ci0KLSAgdEMtPnRuc01heFNmYiA9IHRuc01heEJhbmRzTG9uZ01haW5Mb3dbcEMtPnNhbXBSYXRlSWR4XTsKLQotICB0Qy0+dG5zQWN0aXZlID0gYWN0aXZlOwotCi0gIC8qIG5vdyBjYWxjIGJhbmQgYW5kIGxpbmUgYm9yZGVycyAqLwotICB0Qy0+dG5zU3RvcEJhbmQgPSBtaW4ocEMtPnNmYkNudCwgdEMtPnRuc01heFNmYik7Ci0gIHRDLT50bnNTdG9wTGluZSA9IHBDLT5zZmJPZmZzZXRbdEMtPnRuc1N0b3BCYW5kXTsKLQotICB0Qy0+dG5zU3RhcnRCYW5kID0gRnJlcVRvQmFuZFdpdGhSb3VuZGluZyh0Qy0+dG5zU3RhcnRGcmVxLCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+c2ZiQ250LCAoY29uc3QgV29yZDE2KilwQy0+c2ZiT2Zmc2V0KTsKLQotICB0Qy0+dG5zTW9kaWZ5QmVnaW5DYiA9IEZyZXFUb0JhbmRXaXRoUm91bmRpbmcoVE5TX01PRElGWV9CRUdJTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+c2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IFdvcmQxNiopcEMtPnNmYk9mZnNldCk7Ci0KLSAgdEMtPnRuc1JhdGlvUGF0Y2hMb3dlc3RDYiA9IEZyZXFUb0JhbmRXaXRoUm91bmRpbmcoUkFUSU9fUEFUQ0hfTE9XRVJfQk9SREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+c2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgV29yZDE2KilwQy0+c2ZiT2Zmc2V0KTsKLQotCi0gIHRDLT50bnNTdGFydExpbmUgPSBwQy0+c2ZiT2Zmc2V0W3RDLT50bnNTdGFydEJhbmRdOwotCi0gIHRDLT5scGNTdG9wQmFuZCA9IHRuc01heEJhbmRzTG9uZ01haW5Mb3dbcEMtPnNhbXBSYXRlSWR4XTsKLSAgdEMtPmxwY1N0b3BCYW5kID0gbWluKHRDLT5scGNTdG9wQmFuZCwgcEMtPnNmYkFjdGl2ZSk7Ci0KLSAgdEMtPmxwY1N0b3BMaW5lID0gcEMtPnNmYk9mZnNldFt0Qy0+bHBjU3RvcEJhbmRdOwotCi0gIHRDLT5scGNTdGFydEJhbmQgPSB0bnNNaW5CYW5kTnVtYmVyTG9uZ1twQy0+c2FtcFJhdGVJZHhdOwotCi0gIHRDLT5scGNTdGFydExpbmUgPSBwQy0+c2ZiT2Zmc2V0W3RDLT5scGNTdGFydEJhbmRdOwotCi0gIHRDLT50aHJlc2hvbGQgPSBUTlNfR0FJTl9USFJFU0g7Ci0KLQotICByZXR1cm4oMCk7Ci19Ci0KLS8qKgotKgotKiBmdW5jdGlvbiBuYW1lOiBJbml0VG5zQ29uZmlndXJhdGlvblNob3J0Ci0qIGRlc2NyaXB0aW9uOiAgRmlsbCBUTlNfQ09ORklHIHN0cnVjdHVyZSB3aXRoIHNlbnNpYmxlIGNvbnRlbnQgZm9yIHNob3J0IGJsb2NrcwotKiByZXR1cm5zOgkJMCBpZiBzdWNjZXNzCi0qCi0qLwotV29yZDE2IEluaXRUbnNDb25maWd1cmF0aW9uU2hvcnQoV29yZDMyIGJpdFJhdGUsICAgICAgICAgICAgICAvKiE8IGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBzYW1wbGVSYXRlLCAgICAgICAgICAgLyohPCBTYW1wbGluZyBmcmVxdWVuY3kgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjaGFubmVscywgICAgICAgICAgICAgLyohPCBudW1iZXIgb2YgY2hhbm5lbHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROU19DT05GSUcgKnRDLCAgICAgICAgICAgICAgLyohPCBUTlMgQ29uZmlnIHN0cnVjdCAobW9kaWZpZWQpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTl9TSE9SVCAqcEMsIC8qITwgcHN5IGNvbmZpZyBzdHJ1Y3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBhY3RpdmUpICAgICAgICAgICAgICAgLyohPCB0bnMgYWN0aXZlIGZsYWcgKi8KLXsKLSAgV29yZDMyIGJpdHJhdGVQZXJDaGFubmVsIF9fdW51c2VkOwotICB0Qy0+bWF4T3JkZXIgICAgID0gVE5TX01BWF9PUkRFUl9TSE9SVDsKLSAgdEMtPnRuc1N0YXJ0RnJlcSA9IDI3NTA7Ci0gIHRDLT5jb2VmUmVzICAgICAgPSAzOwotCi0gIC8qIHRvIGF2b2lkIGludGVnZXIgZGl2aXNpb24gKi8KLSAgaWYgKCBzdWIoY2hhbm5lbHMsMikgPT0gMCApIHsKLSAgICBiaXRyYXRlUGVyQ2hhbm5lbCA9IExfc2hyKGJpdFJhdGUsMSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgYml0cmF0ZVBlckNoYW5uZWwgPSBiaXRSYXRlOwotICB9Ci0KLSAgdEMtPnRuc01heFNmYiA9IHRuc01heEJhbmRzU2hvcnRNYWluTG93W3BDLT5zYW1wUmF0ZUlkeF07Ci0KLSAgdEMtPnRuc0FjdGl2ZSA9IGFjdGl2ZTsKLQotICAvKiBub3cgY2FsYyBiYW5kIGFuZCBsaW5lIGJvcmRlcnMgKi8KLSAgdEMtPnRuc1N0b3BCYW5kID0gbWluKHBDLT5zZmJDbnQsIHRDLT50bnNNYXhTZmIpOwotICB0Qy0+dG5zU3RvcExpbmUgPSBwQy0+c2ZiT2Zmc2V0W3RDLT50bnNTdG9wQmFuZF07Ci0KLSAgdEMtPnRuc1N0YXJ0QmFuZD1GcmVxVG9CYW5kV2l0aFJvdW5kaW5nKHRDLT50bnNTdGFydEZyZXEsIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+c2ZiQ250LCAoY29uc3QgV29yZDE2KilwQy0+c2ZiT2Zmc2V0KTsKLQotICB0Qy0+dG5zTW9kaWZ5QmVnaW5DYiA9IEZyZXFUb0JhbmRXaXRoUm91bmRpbmcoVE5TX01PRElGWV9CRUdJTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+c2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IFdvcmQxNiopcEMtPnNmYk9mZnNldCk7Ci0KLSAgdEMtPnRuc1JhdGlvUGF0Y2hMb3dlc3RDYiA9IEZyZXFUb0JhbmRXaXRoUm91bmRpbmcoUkFUSU9fUEFUQ0hfTE9XRVJfQk9SREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+c2ZiQ250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgV29yZDE2KilwQy0+c2ZiT2Zmc2V0KTsKLQotCi0gIHRDLT50bnNTdGFydExpbmUgPSBwQy0+c2ZiT2Zmc2V0W3RDLT50bnNTdGFydEJhbmRdOwotCi0gIHRDLT5scGNTdG9wQmFuZCA9IHRuc01heEJhbmRzU2hvcnRNYWluTG93W3BDLT5zYW1wUmF0ZUlkeF07Ci0KLSAgdEMtPmxwY1N0b3BCYW5kID0gbWluKHRDLT5scGNTdG9wQmFuZCwgcEMtPnNmYkFjdGl2ZSk7Ci0KLSAgdEMtPmxwY1N0b3BMaW5lID0gcEMtPnNmYk9mZnNldFt0Qy0+bHBjU3RvcEJhbmRdOwotCi0gIHRDLT5scGNTdGFydEJhbmQgPSB0bnNNaW5CYW5kTnVtYmVyU2hvcnRbcEMtPnNhbXBSYXRlSWR4XTsKLQotICB0Qy0+bHBjU3RhcnRMaW5lID0gcEMtPnNmYk9mZnNldFt0Qy0+bHBjU3RhcnRCYW5kXTsKLQotICB0Qy0+dGhyZXNob2xkID0gVE5TX0dBSU5fVEhSRVNIOwotCi0gIHJldHVybigwKTsKLX0KLQotLyoqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IFRuc0RldGVjdAotKiBkZXNjcmlwdGlvbjogIENhbGN1bGF0ZSBUTlMgZmlsdGVyIGFuZCBkZWNpZGUgb24gVE5TIHVzYWdlCi0qIHJldHVybnM6CQkwIGlmIHN1Y2Nlc3MKLSoKLSovCi1Xb3JkMzIgVG5zRGV0ZWN0KFROU19EQVRBKiB0bnNEYXRhLCAgICAgICAgLyohPCB0bnMgZGF0YSBzdHJ1Y3R1cmUgKG1vZGlmaWVkKSAqLwotICAgICAgICAgICAgICAgICBUTlNfQ09ORklHIHRDLCAgICAgICAgICAgIC8qITwgdG5zIGNvbmZpZyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICAgV29yZDMyKiBwU2NyYXRjaFRucywgICAgICAvKiE8IHBvaW50ZXIgdG8gc2NyYXRjaCBzcGFjZSAqLwotICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgc2ZiT2Zmc2V0W10sIC8qITwgc2NhbGVmYWN0b3Igc2l6ZSBhbmQgdGFibGUgKi8KLSAgICAgICAgICAgICAgICAgV29yZDMyKiBzcGVjdHJ1bSwgICAgICAgICAvKiE8IHNwZWN0cmFsIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgV29yZDE2IHN1YkJsb2NrTnVtYmVyLCAgICAvKiE8IHN1YmJsb2NrIG51bSAqLwotICAgICAgICAgICAgICAgICBXb3JkMTYgYmxvY2tUeXBlLCAgICAgICAgIC8qITwgYmxvY2t0eXBlIChsb25nIG9yIHNob3J0KSAqLwotICAgICAgICAgICAgICAgICBXb3JkMzIgKiBzZmJFbmVyZ3kpICAgICAgIC8qITwgc2ZiLXdpc2UgZW5lcmd5ICovCi17Ci0KLSAgV29yZDMyICBwcmVkaWN0aW9uR2FpbjsKLSAgV29yZDMyICB0ZW1wOwotICBXb3JkMzIqIHBXb3JrMzIgPSAmcFNjcmF0Y2hUbnNbc3ViQmxvY2tOdW1iZXIgPj4gOF07Ci0gIFdvcmQxNiogcFdlaWdodGVkU3BlY3RydW0gPSAoV29yZDE2ICopJnBTY3JhdGNoVG5zW3N1YkJsb2NrTnVtYmVyID4+IDhdOwotCi0KLSAgaWYgKHRDLnRuc0FjdGl2ZSkgewotICAgIENhbGNXZWlnaHRlZFNwZWN0cnVtKHNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBXZWlnaHRlZFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNmYkVuZXJneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdEMubHBjU3RhcnRMaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRDLmxwY1N0b3BMaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRDLmxwY1N0YXJ0QmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0Qy5scGNTdG9wQmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwV29yazMyKTsKLQotICAgIHRlbXAgPSBibG9ja1R5cGUgLSBTSE9SVF9XSU5ET1c7Ci0gICAgaWYgKCB0ZW1wICE9IDAgKSB7Ci0gICAgICAgIHByZWRpY3Rpb25HYWluID0gQ2FsY1Ruc0ZpbHRlciggJnBXZWlnaHRlZFNwZWN0cnVtW3RDLmxwY1N0YXJ0TGluZV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEMuYWNmV2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDLmxwY1N0b3BMaW5lIC0gdEMubHBjU3RhcnRMaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDLm1heE9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zTG9uZy5zdWJCbG9ja0luZm8ucGFyY29yKTsKLQotCi0gICAgICAgIHRlbXAgPSBwcmVkaWN0aW9uR2FpbiAtIHRDLnRocmVzaG9sZDsKLSAgICAgICAgaWYgKCB0ZW1wID4gMCApIHsKLSAgICAgICAgICB0bnNEYXRhLT5kYXRhUmF3LnRuc0xvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZSA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNMb25nLnN1YkJsb2NrSW5mby50bnNBY3RpdmUgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNMb25nLnN1YkJsb2NrSW5mby5wcmVkaWN0aW9uR2FpbiA9IHByZWRpY3Rpb25HYWluOwotICAgIH0KLSAgICBlbHNlewotCi0gICAgICAgIHByZWRpY3Rpb25HYWluID0gQ2FsY1Ruc0ZpbHRlciggJnBXZWlnaHRlZFNwZWN0cnVtW3RDLmxwY1N0YXJ0TGluZV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEMuYWNmV2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDLmxwY1N0b3BMaW5lIC0gdEMubHBjU3RhcnRMaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDLm1heE9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zU2hvcnQuc3ViQmxvY2tJbmZvW3N1YkJsb2NrTnVtYmVyXS5wYXJjb3IpOwotCi0gICAgICAgIHRlbXAgPSBwcmVkaWN0aW9uR2FpbiAtIHRDLnRocmVzaG9sZDsKLSAgICAgICAgaWYgKCB0ZW1wID4gMCApIHsKLSAgICAgICAgICB0bnNEYXRhLT5kYXRhUmF3LnRuc1Nob3J0LnN1YkJsb2NrSW5mb1tzdWJCbG9ja051bWJlcl0udG5zQWN0aXZlID0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICB0bnNEYXRhLT5kYXRhUmF3LnRuc1Nob3J0LnN1YkJsb2NrSW5mb1tzdWJCbG9ja051bWJlcl0udG5zQWN0aXZlID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zU2hvcnQuc3ViQmxvY2tJbmZvW3N1YkJsb2NrTnVtYmVyXS5wcmVkaWN0aW9uR2FpbiA9IHByZWRpY3Rpb25HYWluOwotICAgIH0KLQotICB9Ci0gIGVsc2V7Ci0KLSAgICB0ZW1wID0gYmxvY2tUeXBlIC0gU0hPUlRfV0lORE9XOwotICAgIGlmICggdGVtcCAhPSAwICkgewotICAgICAgICB0bnNEYXRhLT5kYXRhUmF3LnRuc0xvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZSA9IDA7Ci0gICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zTG9uZy5zdWJCbG9ja0luZm8ucHJlZGljdGlvbkdhaW4gPSAwOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNTaG9ydC5zdWJCbG9ja0luZm9bc3ViQmxvY2tOdW1iZXJdLnRuc0FjdGl2ZSA9IDA7Ci0gICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zU2hvcnQuc3ViQmxvY2tJbmZvW3N1YkJsb2NrTnVtYmVyXS5wcmVkaWN0aW9uR2FpbiA9IDA7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuKDApOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBUbnNTeW5jCi0qIGRlc2NyaXB0aW9uOiB1cGRhdGUgdG5zIHBhcmFtZXRlcgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFRuc1N5bmMoVE5TX0RBVEEgKnRuc0RhdGFEZXN0LAotICAgICAgICAgICAgIGNvbnN0IFROU19EQVRBICp0bnNEYXRhU3JjLAotICAgICAgICAgICAgIGNvbnN0IFROU19DT05GSUcgdEMsCi0gICAgICAgICAgICAgY29uc3QgV29yZDE2IHN1YkJsb2NrTnVtYmVyLAotICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBibG9ja1R5cGUpCi17Ci0gICBUTlNfU1VCQkxPQ0tfSU5GTyAqc2JJbmZvRGVzdDsKLSAgIGNvbnN0IFROU19TVUJCTE9DS19JTkZPICpzYkluZm9TcmM7Ci0gICBXb3JkMzIgaSwgdGVtcDsKLQotICAgdGVtcCA9ICBibG9ja1R5cGUgLSBTSE9SVF9XSU5ET1c7Ci0gICBpZiAoIHRlbXAgIT0gMCApIHsKLSAgICAgIHNiSW5mb0Rlc3QgPSAmdG5zRGF0YURlc3QtPmRhdGFSYXcudG5zTG9uZy5zdWJCbG9ja0luZm87Ci0gICAgICBzYkluZm9TcmMgID0gJnRuc0RhdGFTcmMtPmRhdGFSYXcudG5zTG9uZy5zdWJCbG9ja0luZm87Ci0gICB9Ci0gICBlbHNlIHsKLSAgICAgIHNiSW5mb0Rlc3QgPSAmdG5zRGF0YURlc3QtPmRhdGFSYXcudG5zU2hvcnQuc3ViQmxvY2tJbmZvW3N1YkJsb2NrTnVtYmVyXTsKLSAgICAgIHNiSW5mb1NyYyAgPSAmdG5zRGF0YVNyYy0+ZGF0YVJhdy50bnNTaG9ydC5zdWJCbG9ja0luZm9bc3ViQmxvY2tOdW1iZXJdOwotICAgfQotCi0gICBpZiAoMTAwKmFic19zKHNiSW5mb0Rlc3QtPnByZWRpY3Rpb25HYWluIC0gc2JJbmZvU3JjLT5wcmVkaWN0aW9uR2FpbikgPAotICAgICAgICgzICogc2JJbmZvRGVzdC0+cHJlZGljdGlvbkdhaW4pKSB7Ci0gICAgICBzYkluZm9EZXN0LT50bnNBY3RpdmUgPSBzYkluZm9TcmMtPnRuc0FjdGl2ZTsKLSAgICAgIGZvciAoIGk9MDsgaTwgdEMubWF4T3JkZXI7IGkrKykgewotICAgICAgICBzYkluZm9EZXN0LT5wYXJjb3JbaV0gPSBzYkluZm9TcmMtPnBhcmNvcltpXTsKLSAgICAgIH0KLSAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IFRuc0VuY29kZQotKiBkZXNjcmlwdGlvbjogZG8gVE5TIGZpbHRlcmluZwotKiByZXR1cm5zOiAgICAgMCBpZiBzdWNjZXNzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVdvcmQxNiBUbnNFbmNvZGUoVE5TX0lORk8qIHRuc0luZm8sICAgICAvKiE8IHRucyBpbmZvIHN0cnVjdHVyZSAobW9kaWZpZWQpICovCi0gICAgICAgICAgICAgICAgIFROU19EQVRBKiB0bnNEYXRhLCAgICAgLyohPCB0bnMgZGF0YSBzdHJ1Y3R1cmUgKG1vZGlmaWVkKSAqLwotICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtT2ZTZmIsICAgICAgIC8qITwgbnVtYmVyIG9mIHNjYWxlIGZhY3RvciBiYW5kcyAqLwotICAgICAgICAgICAgICAgICBUTlNfQ09ORklHIHRDLCAgICAgICAgIC8qITwgdG5zIGNvbmZpZyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICAgV29yZDE2IGxvd1Bhc3NMaW5lLCAgICAvKiE8IGxvd3Bhc3MgbGluZSAqLwotICAgICAgICAgICAgICAgICBXb3JkMzIqIHNwZWN0cnVtLCAgICAgIC8qITwgc3BlY3RyYWwgZGF0YSAobW9kaWZpZWQpICovCi0gICAgICAgICAgICAgICAgIFdvcmQxNiBzdWJCbG9ja051bWJlciwgLyohPCBzdWJibG9jayBudW0gKi8KLSAgICAgICAgICAgICAgICAgV29yZDE2IGJsb2NrVHlwZSkgICAgICAvKiE8IGJsb2NrdHlwZSAobG9uZyBvciBzaG9ydCkgKi8KLXsKLSAgV29yZDMyIGk7Ci0gIFdvcmQzMiB0ZW1wX3M7Ci0gIFdvcmQzMiB0ZW1wOwotICBUTlNfU1VCQkxPQ0tfSU5GTyAqcHN1YkJsb2NrSW5mbzsKLQotICB0ZW1wX3MgPSBibG9ja1R5cGUgLSBTSE9SVF9XSU5ET1c7Ci0gIGlmICggdGVtcF9zICE9IDApIHsKLSAgICBwc3ViQmxvY2tJbmZvID0gJnRuc0RhdGEtPmRhdGFSYXcudG5zTG9uZy5zdWJCbG9ja0luZm87Ci0JaWYgKHBzdWJCbG9ja0luZm8tPnRuc0FjdGl2ZSA9PSAwKSB7Ci0gICAgICB0bnNJbmZvLT50bnNBY3RpdmVbc3ViQmxvY2tOdW1iZXJdID0gMDsKLSAgICAgIHJldHVybigwKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0KLSAgICAgIFBhcmNvcjJJbmRleChwc3ViQmxvY2tJbmZvLT5wYXJjb3IsCi0gICAgICAgICAgICAgICAgICAgdG5zSW5mby0+Y29lZiwKLSAgICAgICAgICAgICAgICAgICB0Qy5tYXhPcmRlciwKLSAgICAgICAgICAgICAgICAgICB0Qy5jb2VmUmVzKTsKLQotICAgICAgSW5kZXgyUGFyY29yKHRuc0luZm8tPmNvZWYsCi0gICAgICAgICAgICAgICAgICAgcHN1YkJsb2NrSW5mby0+cGFyY29yLAotICAgICAgICAgICAgICAgICAgIHRDLm1heE9yZGVyLAotICAgICAgICAgICAgICAgICAgIHRDLmNvZWZSZXMpOwotCi0gICAgICBmb3IgKGk9dEMubWF4T3JkZXIgLSAxOyBpPj0wOyBpLS0pICB7Ci0gICAgICAgIHRlbXAgPSBwc3ViQmxvY2tJbmZvLT5wYXJjb3JbaV0gLSBUTlNfUEFSQ09SX1RIUkVTSDsKLSAgICAgICAgaWYgKCB0ZW1wID4gMCApCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHRlbXAgPSBwc3ViQmxvY2tJbmZvLT5wYXJjb3JbaV0gKyBUTlNfUEFSQ09SX1RIUkVTSDsKLSAgICAgICAgaWYgKCB0ZW1wIDwgMCApCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICB0bnNJbmZvLT5vcmRlcltzdWJCbG9ja051bWJlcl0gPSBpICsgMTsKLQotCi0gICAgICB0bnNJbmZvLT50bnNBY3RpdmVbc3ViQmxvY2tOdW1iZXJdID0gMTsKLSAgICAgIGZvciAoaT1zdWJCbG9ja051bWJlcisxOyBpPFRSQU5TX0ZBQzsgaSsrKSB7Ci0gICAgICAgIHRuc0luZm8tPnRuc0FjdGl2ZVtpXSA9IDA7Ci0gICAgICB9Ci0gICAgICB0bnNJbmZvLT5jb2VmUmVzW3N1YkJsb2NrTnVtYmVyXSA9IHRDLmNvZWZSZXM7Ci0gICAgICB0bnNJbmZvLT5sZW5ndGhbc3ViQmxvY2tOdW1iZXJdID0gbnVtT2ZTZmIgLSB0Qy50bnNTdGFydEJhbmQ7Ci0KLQotICAgICAgQW5hbHlzaXNGaWx0ZXJMYXR0aWNlKCYoc3BlY3RydW1bdEMudG5zU3RhcnRMaW5lXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1pbih0Qy50bnNTdG9wTGluZSxsb3dQYXNzTGluZSkgLSB0Qy50bnNTdGFydExpbmUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzdWJCbG9ja0luZm8tPnBhcmNvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnNJbmZvLT5vcmRlcltzdWJCbG9ja051bWJlcl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzcGVjdHJ1bVt0Qy50bnNTdGFydExpbmVdKSk7Ci0KLSAgICB9Ci0gIH0gICAgIC8qIGlmIChibG9ja1R5cGUhPVNIT1JUX1dJTkRPVykgKi8KLSAgZWxzZSAvKnNob3J0IGJsb2NrKi8gewotICAgIHBzdWJCbG9ja0luZm8gPSAmdG5zRGF0YS0+ZGF0YVJhdy50bnNTaG9ydC5zdWJCbG9ja0luZm9bc3ViQmxvY2tOdW1iZXJdOwotCWlmIChwc3ViQmxvY2tJbmZvLT50bnNBY3RpdmUgPT0gMCkgewotICAgICAgdG5zSW5mby0+dG5zQWN0aXZlW3N1YkJsb2NrTnVtYmVyXSA9IDA7Ci0gICAgICByZXR1cm4oMCk7Ci0gICAgfQotICAgIGVsc2UgewotCi0gICAgICBQYXJjb3IySW5kZXgocHN1YkJsb2NrSW5mby0+cGFyY29yLAotICAgICAgICAgICAgICAgICAgICZ0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyKlROU19NQVhfT1JERVJfU0hPUlRdLAotICAgICAgICAgICAgICAgICAgIHRDLm1heE9yZGVyLAotICAgICAgICAgICAgICAgICAgIHRDLmNvZWZSZXMpOwotCi0gICAgICBJbmRleDJQYXJjb3IoJnRuc0luZm8tPmNvZWZbc3ViQmxvY2tOdW1iZXIqVE5TX01BWF9PUkRFUl9TSE9SVF0sCi0gICAgICAgICAgICAgICAgICAgcHN1YkJsb2NrSW5mby0+cGFyY29yLAotICAgICAgICAgICAgICAgICAgIHRDLm1heE9yZGVyLAotICAgICAgICAgICAgICAgICAgIHRDLmNvZWZSZXMpOwotICAgICAgZm9yIChpPSh0Qy5tYXhPcmRlciAtIDEpOyBpPj0wOyBpLS0pICB7Ci0gICAgICAgIHRlbXAgPSBwc3ViQmxvY2tJbmZvLT5wYXJjb3JbaV0gLSBUTlNfUEFSQ09SX1RIUkVTSDsKLSAgICAgICAgIGlmICggdGVtcCA+IDAgKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIHRlbXAgPSBwc3ViQmxvY2tJbmZvLT5wYXJjb3JbaV0gKyBUTlNfUEFSQ09SX1RIUkVTSDsKLSAgICAgICAgaWYgKCB0ZW1wIDwgMCApCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICB0bnNJbmZvLT5vcmRlcltzdWJCbG9ja051bWJlcl0gPSBpICsgMTsKLQotICAgICAgdG5zSW5mby0+dG5zQWN0aXZlW3N1YkJsb2NrTnVtYmVyXSA9IDE7Ci0gICAgICB0bnNJbmZvLT5jb2VmUmVzW3N1YkJsb2NrTnVtYmVyXSA9IHRDLmNvZWZSZXM7Ci0gICAgICB0bnNJbmZvLT5sZW5ndGhbc3ViQmxvY2tOdW1iZXJdID0gbnVtT2ZTZmIgLSB0Qy50bnNTdGFydEJhbmQ7Ci0KLQotICAgICAgQW5hbHlzaXNGaWx0ZXJMYXR0aWNlKCYoc3BlY3RydW1bdEMudG5zU3RhcnRMaW5lXSksICh0Qy50bnNTdG9wTGluZSAtIHRDLnRuc1N0YXJ0TGluZSksCi0gICAgICAgICAgICAgICAgIHBzdWJCbG9ja0luZm8tPnBhcmNvciwKLSAgICAgICAgICAgICAgICAgdG5zSW5mby0+b3JkZXJbc3ViQmxvY2tOdW1iZXJdLAotICAgICAgICAgICAgICAgICAmKHNwZWN0cnVtW3RDLnRuc1N0YXJ0TGluZV0pKTsKLQotICAgIH0KLSAgfQotCi0gIHJldHVybigwKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogQ2FsY1dlaWdodGVkU3BlY3RydW0KLSogZGVzY3JpcHRpb246IENhbGN1bGF0ZSB3ZWlnaHRlZCBzcGVjdHJ1bSBmb3IgTFBDIGNhbGN1bGF0aW9uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIENhbGNXZWlnaHRlZFNwZWN0cnVtKGNvbnN0IFdvcmQzMiAgc3BlY3RydW1bXSwgICAgICAgICAvKiE8IGlucHV0IHNwZWN0cnVtICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgIHdlaWdodGVkU3BlY3RydW1bXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqc2ZiRW5lcmd5LCAgICAgICAgICAvKiE8IHNmYiBlbmVyZ2llcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICpzZmJPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgIGxwY1N0YXJ0TGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgbHBjU3RvcExpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgIGxwY1N0YXJ0QmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgbHBjU3RvcEJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKnBXb3JrMzIpCi17Ci0gICAgI2RlZmluZSBJTlRfQklUU19TQ0FMIDE8PChJTlRfQklUUy8yKQotCi0gICAgV29yZDMyIGksIHNmYiwgc2hpZnQ7Ci0gICAgV29yZDMyIG1heFNoaWZ0OwotICAgIFdvcmQzMiB0bXBfcywgdG1wMl9zOwotICAgIFdvcmQzMiB0bXAsIHRtcDI7Ci0gICAgV29yZDMyIG1heFdTOwotICAgIFdvcmQzMiB0bnNTZmJNZWFuW01BWF9TRkJdOyAgICAvKiBsZW5ndGggW2xwY1N0b3BCYW5kLWxwY1N0YXJ0QmFuZF0gc2hvdWxkIGJlIHN1ZmZpY2llbnQgaGVyZSAqLwotCi0gICAgbWF4V1MgPSAwOwotCi0gICAgLyogY2FsYyAxLjAqMl4tSU5UX0JJVFMvMi9zcXJ0KGVuKSAqLwotICAgIGZvciggc2ZiID0gbHBjU3RhcnRCYW5kOyBzZmIgPCBscGNTdG9wQmFuZDsgc2ZiKyspIHsKLQotICAgICAgdG1wMiA9IHNmYkVuZXJneVtzZmJdIC0gMjsKLSAgICAgIGlmKCB0bXAyID4gMCkgewotICAgICAgICB0bXAgPSByc3FydChzZmJFbmVyZ3lbc2ZiXSwgSU5UX0JJVFMpOwotCQlpZih0bXAgPiBJTlRfQklUU19TQ0FMKQotCQl7Ci0JCQlzaGlmdCA9ICBub3JtX2wodG1wKTsKLQkJCXRtcCA9IERpdl8zMiggSU5UX0JJVFNfU0NBTCA8PCBzaGlmdCwgdG1wIDw8IHNoaWZ0ICk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQl0bXAgPSAweDdmZmZmZmZmOwotCQl9Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsKLSAgICAgIH0KLSAgICAgIHRuc1NmYk1lYW5bc2ZiXSA9IHRtcDsKLSAgICB9Ci0KLSAgICAvKiBzcHJlYWQgbm9ybWFsaXplZCB2YWx1ZXMgZnJvbSBzZmJzIHRvIGxpbmVzICovCi0gICAgc2ZiID0gbHBjU3RhcnRCYW5kOwotICAgIHRtcCA9IHRuc1NmYk1lYW5bc2ZiXTsKLSAgICBmb3IgKCBpPWxwY1N0YXJ0TGluZTsgaTxscGNTdG9wTGluZTsgaSsrKXsKLSAgICAgIHRtcF9zID0gc2ZiT2Zmc2V0W3NmYiArIDFdIC0gaTsKLSAgICAgIGlmICggdG1wX3MgPT0gMCApIHsKLSAgICAgICAgc2ZiID0gc2ZiICsgMTsKLSAgICAgICAgdG1wMl9zID0gc2ZiICsgMSAtIGxwY1N0b3BCYW5kOwotICAgICAgICBpZiAodG1wMl9zIDw9IDApIHsKLSAgICAgICAgICB0bXAgPSB0bnNTZmJNZWFuW3NmYl07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHBXb3JrMzJbaV0gPSB0bXA7Ci0gICAgfQotICAgIC8qZmlsdGVyIGRvd24qLwotICAgIGZvciAoaT0obHBjU3RvcExpbmUgLSAyKTsgaT49bHBjU3RhcnRMaW5lOyBpLS0pewotICAgICAgICBwV29yazMyW2ldID0gKHBXb3JrMzJbaV0gKyBwV29yazMyW2kgKyAxXSkgPj4gMTsKLSAgICB9Ci0gICAgLyogZmlsdGVyIHVwICovCi0gICAgZm9yIChpPShscGNTdGFydExpbmUgKyAxKTsgaTxscGNTdG9wTGluZTsgaSsrKXsKLSAgICAgICBwV29yazMyW2ldID0gKHBXb3JrMzJbaV0gKyBwV29yazMyW2kgLSAxXSkgPj4gMTsKLSAgICB9Ci0KLSAgICAvKiB3ZWlnaHQgYW5kIG5vcm1hbGl6ZSAqLwotICAgIGZvciAoaT1scGNTdGFydExpbmU7IGk8bHBjU3RvcExpbmU7IGkrKyl7Ci0gICAgICBwV29yazMyW2ldID0gTVVMSElHSChwV29yazMyW2ldLCBzcGVjdHJ1bVtpXSk7Ci0gICAgICBtYXhXUyB8PSBMX2FicyhwV29yazMyW2ldKTsKLSAgICB9Ci0gICAgbWF4U2hpZnQgPSBub3JtX2wobWF4V1MpOwotCi0JbWF4U2hpZnQgPSAxNiAtIG1heFNoaWZ0OwotICAgIGlmKG1heFNoaWZ0ID49IDApCi0JewotCQlmb3IgKGk9bHBjU3RhcnRMaW5lOyBpPGxwY1N0b3BMaW5lOyBpKyspewotCQkJd2VpZ2h0ZWRTcGVjdHJ1bVtpXSA9IHBXb3JrMzJbaV0gPj4gbWF4U2hpZnQ7Ci0JCX0KLSAgICB9Ci0JZWxzZQotCXsKLQkJbWF4U2hpZnQgPSAtbWF4U2hpZnQ7Ci0JCWZvciAoaT1scGNTdGFydExpbmU7IGk8bHBjU3RvcExpbmU7IGkrKyl7Ci0JCQl3ZWlnaHRlZFNwZWN0cnVtW2ldID0gc2F0dXJhdGUocFdvcmszMltpXSA8PCBtYXhTaGlmdCk7Ci0JCX0KLQl9Ci19Ci0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbiBuYW1lOiBDYWxjVG5zRmlsdGVyCi0qIGRlc2NyaXB0aW9uOiAgTFBDIGNhbGN1bGF0aW9uIGZvciBvbmUgVE5TIGZpbHRlcgotKiByZXR1cm5zOiAgICAgIHByZWRpY3Rpb24gZ2FpbgotKiBpbnB1dDogICAgICAgIHNpZ25hbCBzcGVjdHJ1bSwgYWNmIHdpbmRvdywgbm8uIG9mIHNwZWN0cmFsIGxpbmVzLAotKiAgICAgICAgICAgICAgICBtYXguIFROUyBvcmRlciwgcHRyLiB0byByZWZsZWN0aW9uIG9jZWZmaWNpZW50cwotKiBvdXRwdXQ6ICAgICAgIHJlZmxlY3Rpb24gY29lZmZpY2llbnRzCi0qKGhhbGYpIHdpbmRvdyBzaXplIG11c3QgYmUgbGFyZ2VyIHRoYW4gdG5zT3JkZXIgISEqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBXb3JkMTYgQ2FsY1Ruc0ZpbHRlcihjb25zdCBXb3JkMTYgKnNpZ25hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgd2luZG93W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG51bU9mTGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHRuc09yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBwYXJjb3JbXSkKLXsKLSAgV29yZDMyIHBhcmNvcldvcmtCdWZmZXJbMipUTlNfTUFYX09SREVSKzFdOwotICBXb3JkMzIgcHJlZGljdGlvbkdhaW47Ci0gIFdvcmQzMiBpOwotICBXb3JkMzIgdG5zT3JkZXJQbHVzMSA9IHRuc09yZGVyICsgMTsKLQotICBVTlVTRUQod2luZG93KTsKLQotICBhc3NlcnQodG5zT3JkZXIgPD0gVE5TX01BWF9PUkRFUik7ICAgICAgLyogcmVtb3ZlIGFzc2VydHMgbGF0ZXI/IChidGcpICovCi0KLSAgZm9yKGk9MDtpPHRuc09yZGVyO2krKykgewotICAgIHBhcmNvcltpXSA9IDA7Ci0gIH0KLQotICBBdXRvQ29ycmVsYXRpb24oc2lnbmFsLCBwYXJjb3JXb3JrQnVmZmVyLCBudW1PZkxpbmVzLCB0bnNPcmRlclBsdXMxKTsKLQotICAvKiBlYXJseSByZXR1cm4gaWYgc2lnbmFsIGlzIHZlcnkgbG93OiBzaWduYWwgcHJlZGljdGlvbiBvZmYsIHdpdGggemVybyBwYXJjb3IgY29lZmZzICovCi0gIGlmIChwYXJjb3JXb3JrQnVmZmVyWzBdID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgcHJlZGljdGlvbkdhaW4gPSBBdXRvVG9QYXJjb3IocGFyY29yV29ya0J1ZmZlciwgcGFyY29yLCB0bnNPcmRlcik7Ci0KLSAgcmV0dXJuKHByZWRpY3Rpb25HYWluKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IEF1dG9Db3JyZWxhdGlvbgotKiBkZXNjcmlwdGlvbjogIGNhbGMuIGF1dG9jb3JyZWxhdGlvbiAoYWNmKQotKiByZXR1cm5zOiAgICAgIC0KLSogaW5wdXQ6ICAgICAgICBpbnB1dCB2YWx1ZXMsIG5vLiBvZiBpbnB1dCB2YWx1ZXMsIG5vLiBvZiBhY2YgdmFsdWVzCi0qIG91dHB1dDogICAgICAgYWNmIHZhbHVlcwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEFSTVY1RQotdm9pZCBBdXRvQ29ycmVsYXRpb24oY29uc3QgV29yZDE2CQkgaW5wdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgY29ycltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICBzYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICBjb3JyQ29lZmYpIHsKLSAgV29yZDMyIGksIGosIGlzYW1wbGVzOwotICBXb3JkMzIgYWNjdTsKLSAgV29yZDMyIHNjZjsKLQotICBzY2YgPSAxMCAtIDE7Ci0KLSAgaXNhbXBsZXMgPSBzYW1wbGVzOwotICAvKiBjYWxjIGZpcnN0IGNvcnJDb2VmOiAgUlswXSA9IHN1bSB7IHRbaV0gKiB0W2ldIH0gOyBpID0gMC4uTi0xICovCi0gIGFjY3UgPSAwOwotICBmb3Ioaj0wOyBqPGlzYW1wbGVzOyBqKyspIHsKLSAgICBhY2N1ID0gTF9hZGQoYWNjdSwgKChpbnB1dFtqXSAqIGlucHV0W2pdKSA+PiBzY2YpKTsKLSAgfQotICBjb3JyWzBdID0gYWNjdTsKLQotICAvKiBlYXJseSB0ZXJtaW5hdGlvbiBpZiBhbGwgY29yciBjb2VmZnMgYXJlIGxpa2VseSBnb2luZyB0byBiZSB6ZXJvICovCi0gIGlmKGNvcnJbMF0gPT0gMCkgcmV0dXJuIDsKLQotICAvKiBjYWxjIGFsbCBvdGhlciBjb3JyQ29lZjogIFJbal0gPSBzdW0geyB0W2ldICogdFtpK2pdIH0gOyBpID0gMC4uKE4tai0xKSwgaj0xLi5wICovCi0gIGZvcihpPTE7IGk8Y29yckNvZWZmOyBpKyspIHsKLSAgICBpc2FtcGxlcyA9IGlzYW1wbGVzIC0gMTsKLSAgICBhY2N1ID0gMDsKLSAgICBmb3Ioaj0wOyBqPGlzYW1wbGVzOyBqKyspIHsKLSAgICAgIGFjY3UgPSBMX2FkZChhY2N1LCAoKGlucHV0W2pdICogaW5wdXRbaitpXSkgPj4gc2NmKSk7Ci0gICAgfQotICAgIGNvcnJbaV0gPSBhY2N1OwotICB9Ci19Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IEF1dG9Ub1BhcmNvcgotKiBkZXNjcmlwdGlvbjogIGNvbnZlcnNpb24gYXV0b2NvcnJlbGF0aW9uIHRvIHJlZmxlY3Rpb24gY29lZmZpY2llbnRzCi0qIHJldHVybnM6ICAgICAgcHJlZGljdGlvbiBnYWluCi0qIGlucHV0OiAgICAgICAgPG9yZGVyKzE+IGlucHV0IHZhbHVlcywgbm8uIG9mIG91dHB1dCB2YWx1ZXMgKD1vcmRlciksCi0qICAgICAgICAgICAgICAgcHRyLiB0byB3b3JrYnVmZmVyIChyZXF1aXJlZCBzaXplOiAyKm9yZGVyKQotKiBvdXRwdXQ6ICAgICAgIDxvcmRlcj4gcmVmbGVjdGlvbiBjb2VmZmljaWVudHMKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQxNiBBdXRvVG9QYXJjb3IoV29yZDMyIHdvcmtCdWZmZXJbXSwgV29yZDMyIHJlZmxDb2VmZltdLCBXb3JkMTYgbnVtT2ZDb2VmZikgewotCi0gIFdvcmQzMiBpLCBqLCBzaGlmdDsKLSAgV29yZDMyICpwV29ya0J1ZmZlcjsgLyogdGVtcCBwb2ludGVyICovCi0gIFdvcmQzMiBwcmVkaWN0aW9uR2FpbiA9IDA7Ci0gIFdvcmQzMiBudW0sIGRlbm9tOwotICBXb3JkMzIgdGVtcCwgd29ya0J1ZmZlcjA7Ci0KLQotICBudW0gPSB3b3JrQnVmZmVyWzBdOwotICB0ZW1wID0gd29ya0J1ZmZlcltudW1PZkNvZWZmXTsKLQotICBmb3IoaT0wOyBpPG51bU9mQ29lZmYtMTsgaSsrKSB7Ci0gICAgd29ya0J1ZmZlcltpICsgbnVtT2ZDb2VmZl0gPSB3b3JrQnVmZmVyW2kgKyAxXTsKLSAgfQotICB3b3JrQnVmZmVyW2kgKyBudW1PZkNvZWZmXSA9IHRlbXA7Ci0KLSAgZm9yKGk9MDsgaTxudW1PZkNvZWZmOyBpKyspIHsKLSAgICBXb3JkMzIgcmVmYzsKLQotCi0gICAgaWYgKHdvcmtCdWZmZXJbMF0gPCBMX2Ficyh3b3JrQnVmZmVyW2kgKyBudW1PZkNvZWZmXSkpIHsKLSAgICAgIHJldHVybiAwIDsKLSAgICB9Ci0Jc2hpZnQgPSBub3JtX2wod29ya0J1ZmZlclswXSk7Ci0Jd29ya0J1ZmZlcjAgPSBEaXZfMzIoMSA8PCBzaGlmdCwgd29ya0J1ZmZlclswXSA8PCBzaGlmdCk7Ci0gICAgLyogY2FsY3VsYXRlIHJlZmMgPSAtd29ya0J1ZmZlcltudW1PZkNvZWZmK2ldIC8gd29ya0J1ZmZlclswXTsgLTEgPD0gcmVmYyA8IDEgKi8KLQlyZWZjID0gTF9uZWdhdGUoZml4bXVsKHdvcmtCdWZmZXJbbnVtT2ZDb2VmZiArIGldLCB3b3JrQnVmZmVyMCkpOwotCi0gICAgcmVmbENvZWZmW2ldID0gcmVmYzsKLQotICAgIHBXb3JrQnVmZmVyID0gJih3b3JrQnVmZmVyW251bU9mQ29lZmZdKTsKLQotICAgIGZvcihqPWk7IGo8bnVtT2ZDb2VmZjsgaisrKSB7Ci0gICAgICBXb3JkMzIgYWNjdTEsIGFjY3UyOwotICAgICAgYWNjdTEgPSBMX2FkZChwV29ya0J1ZmZlcltqXSwgZml4bXVsKHJlZmMsIHdvcmtCdWZmZXJbaiAtIGldKSk7Ci0gICAgICBhY2N1MiA9IExfYWRkKHdvcmtCdWZmZXJbaiAtIGldLCBmaXhtdWwocmVmYywgcFdvcmtCdWZmZXJbal0pKTsKLSAgICAgIHBXb3JrQnVmZmVyW2pdID0gYWNjdTE7Ci0gICAgICB3b3JrQnVmZmVyW2ogLSBpXSA9IGFjY3UyOwotICAgIH0KLSAgfQotCi0gIGRlbm9tID0gTVVMSElHSCh3b3JrQnVmZmVyWzBdLCBOT1JNX0NPRUYpOwotCi0gIGlmIChkZW5vbSAhPSAwKSB7Ci0gICAgV29yZDMyIHRlbXA7Ci0Jc2hpZnQgPSBub3JtX2woZGVub20pOwotCXRlbXAgPSBEaXZfMzIoMSA8PCBzaGlmdCwgZGVub20gPDwgc2hpZnQpOwotICAgIHByZWRpY3Rpb25HYWluID0gZml4bXVsKG51bSwgdGVtcCk7Ci0gIH0KLQotICByZXR1cm4gZXh0cmFjdF9sKHByZWRpY3Rpb25HYWluKTsKLX0KLQotCi0KLXN0YXRpYyBXb3JkMTYgU2VhcmNoMyhXb3JkMzIgcGFyY29yKQotewotICBXb3JkMzIgaW5kZXggPSAwOwotICBXb3JkMzIgaTsKLSAgV29yZDMyIHRlbXA7Ci0KLSAgZm9yIChpPTA7aTw4O2krKykgewotICAgIHRlbXAgPSBMX3N1YiggcGFyY29yLCB0bnNDb2VmZjNCb3JkZXJzW2ldKTsKLSAgICBpZiAodGVtcCA+IDApCi0gICAgICBpbmRleD1pOwotICB9Ci0gIHJldHVybiBleHRyYWN0X2woaW5kZXggLSA0KTsKLX0KLQotc3RhdGljIFdvcmQxNiBTZWFyY2g0KFdvcmQzMiBwYXJjb3IpCi17Ci0gIFdvcmQzMiBpbmRleCA9IDA7Ci0gIFdvcmQzMiBpOwotICBXb3JkMzIgdGVtcDsKLQotCi0gIGZvciAoaT0wO2k8MTY7aSsrKSB7Ci0gICAgdGVtcCA9IExfc3ViKHBhcmNvciwgdG5zQ29lZmY0Qm9yZGVyc1tpXSk7Ci0gICAgaWYgKHRlbXAgPiAwKQotICAgICAgaW5kZXg9aTsKLSAgfQotICByZXR1cm4gZXh0cmFjdF9sKGluZGV4IC0gOCk7Ci19Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb25uYW1lOiBQYXJjb3IySW5kZXgKLSogZGVzY3JpcHRpb246ICBxdWFudGl6YXRpb24gaW5kZXggZm9yIHJlZmxlY3Rpb24gY29lZmZpY2llbnRzCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIFBhcmNvcjJJbmRleChjb25zdCBXb3JkMzIgcGFyY29yW10sICAgLyohPCBwYXJjb3IgY29lZmZpY2llbnRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGluZGV4W10sICAgICAgICAgIC8qITwgcXVhbnRpemVkIGNvZWZmIGluZGljZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgb3JkZXIsICAgICAgICAgICAgLyohPCBmaWx0ZXIgb3JkZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYml0c1BlckNvZWZmKSB7ICAgLyohPCBxdWFudGl6ZXIgcmVzb2x1dGlvbiAqLwotICBXb3JkMzIgaTsKLSAgV29yZDMyIHRlbXA7Ci0KLSAgZm9yKGk9MDsgaTxvcmRlcjsgaSsrKSB7Ci0gICAgdGVtcCA9IGJpdHNQZXJDb2VmZiAtIDM7Ci0gICAgaWYgKHRlbXAgPT0gMCkgewotICAgICAgaW5kZXhbaV0gPSBTZWFyY2gzKHBhcmNvcltpXSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgaW5kZXhbaV0gPSBTZWFyY2g0KHBhcmNvcltpXSk7Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbm5hbWU6IEluZGV4MlBhcmNvcgotKiBkZXNjcmlwdGlvbjogIEludmVyc2UgcXVhbnRpemF0aW9uIGZvciByZWZsZWN0aW9uIGNvZWZmaWNpZW50cwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBJbmRleDJQYXJjb3IoY29uc3QgV29yZDE2IGluZGV4W10sICAvKiE8IHF1YW50aXplZCB2YWx1ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgcGFyY29yW10sICAgICAgIC8qITwgcHRyLiB0byByZWZsZWN0aW9uIGNvZWZmaWNpZW50cyAob3V0cHV0KSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBvcmRlciwgICAgICAgICAgLyohPCBuby4gb2YgY29lZmZpY2llbnRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGJpdHNQZXJDb2VmZikgICAvKiE8IHF1YW50aXplciByZXNvbHV0aW9uICovCi17Ci0gIFdvcmQzMiBpOwotICBXb3JkMzIgdGVtcDsKLQotICBmb3IgKGk9MDsgaTxvcmRlcjsgaSsrKSB7Ci0gICAgdGVtcCA9IGJpdHNQZXJDb2VmZiAtIDQ7Ci0gICAgaWYgKCB0ZW1wID09IDAgKSB7Ci0gICAgICAgIHBhcmNvcltpXSA9IHRuc0NvZWZmNFtpbmRleFtpXSArIDhdOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgcGFyY29yW2ldID0gdG5zQ29lZmYzW2luZGV4W2ldICsgNF07Ci0gICAgfQotICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBmdW5jdGlvbm5hbWU6IEZJUkxhdHRpY2UKLSogZGVzY3JpcHRpb246ICBpbiBwbGFjZSBsYXR0aWNlIGZpbHRlcmluZyBvZiBzcGVjdHJhbCBkYXRhCi0qIHJldHVybnM6CQlwb2ludGVyIHRvIG1vZGlmaWVkIGRhdGEKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIFdvcmQzMiBGSVJMYXR0aWNlKFdvcmQxNiBvcmRlciwgICAgICAgICAgIC8qITwgZmlsdGVyIG9yZGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIHgsICAgICAgICAgICAgICAgLyohPCBzcGVjdHJhbCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICpzdGF0ZV9wYXIsICAgICAgLyohPCBmaWx0ZXIgc3RhdGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyICpjb2VmX3BhcikgLyohPCBmaWx0ZXIgY29lZmZpY2llbnRzICovCi17Ci0gICBXb3JkMzIgaTsKLSAgIFdvcmQzMiBhY2N1LHRtcCx0bXBTYXZlOwotCi0gICB4ID0geCA+PiAxOwotICAgdG1wU2F2ZSA9IHg7Ci0KLSAgIGZvciAoaT0wOyBpPChvcmRlciAtIDEpOyBpKyspIHsKLQotICAgICB0bXAgPSBMX2FkZChmaXhtdWwoY29lZl9wYXJbaV0sIHgpLCBzdGF0ZV9wYXJbaV0pOwotICAgICB4ICAgPSBMX2FkZChmaXhtdWwoY29lZl9wYXJbaV0sIHN0YXRlX3BhcltpXSksIHgpOwotCi0gICAgIHN0YXRlX3BhcltpXSA9IHRtcFNhdmU7Ci0gICAgIHRtcFNhdmUgPSB0bXA7Ci0gIH0KLQotICAvKiBsYXN0IHN0YWdlOiBvbmx5IG5lZWQgaGFsZiBvcGVyYXRpb25zICovCi0gIGFjY3UgPSBmaXhtdWwoc3RhdGVfcGFyW29yZGVyIC0gMV0sIGNvZWZfcGFyWyhvcmRlciAtIDEpXSk7Ci0gIHN0YXRlX3Bhclsob3JkZXIgLSAxKV0gPSB0bXBTYXZlOwotCi0gIHggPSBMX2FkZChhY2N1LCB4KTsKLSAgeCA9IExfYWRkKHgsIHgpOwotCi0gIHJldHVybiB4OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb25uYW1lOiBBbmFseXNpc0ZpbHRlckxhdHRpY2UKLSogZGVzY3JpcHRpb246ICBmaWx0ZXJzIHNwZWN0cmFsIGxpbmVzIHdpdGggVE5TIGZpbHRlcgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBBbmFseXNpc0ZpbHRlckxhdHRpY2UoY29uc3QgIFdvcmQzMiBzaWduYWxbXSwgIC8qITwgaW5wdXQgc3BlY3RydW0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtT2ZMaW5lcywgICAgICAgLyohPCBuby4gb2YgbGluZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgV29yZDMyIHBhckNvZWZmW10sLyohPCBQQVJDIGNvZWZmaWNpZW50cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBvcmRlciwgICAgICAgICAgICAvKiE8IGZpbHRlciBvcmRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBvdXRwdXRbXSkgICAgICAgICAvKiE8IGZpbHRlcmVkIHNpZ25hbCB2YWx1ZXMgKi8KLXsKLQotICBXb3JkMzIgc3RhdGVfcGFyW1ROU19NQVhfT1JERVJdOwotICBXb3JkMzIgajsKLQotICBmb3IgKCBqPTA7IGo8VE5TX01BWF9PUkRFUjsgaisrICkgewotICAgIHN0YXRlX3BhcltqXSA9IDA7Ci0gIH0KLQotICBmb3Ioaj0wOyBqPG51bU9mTGluZXM7IGorKykgewotICAgIG91dHB1dFtqXSA9IEZJUkxhdHRpY2Uob3JkZXIsc2lnbmFsW2pdLHN0YXRlX3BhcixwYXJDb2VmZik7Ci0gIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9ubmFtZTogQXBwbHlUbnNNdWx0VGFibGVUb1JhdGlvcwotKiBkZXNjcmlwdGlvbjogIENoYW5nZSB0aHJlc2hvbGRzIGFjY29yZGluZyB0byB0bnMKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBBcHBseVRuc011bHRUYWJsZVRvUmF0aW9zKFdvcmQxNiBzdGFydENiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzdG9wQ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5TX1NVQkJMT0NLX0lORk8gc3ViSW5mbywgLyohPCBUTlMgc3ViYmxvY2sgaW5mbyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqdGhyZXNob2xkcykgICAgICAgIC8qITwgdGhyZXNob2xkcyAobW9kaWZpZWQpICovCi17Ci0gIFdvcmQzMiBpOwotICBpZiAoc3ViSW5mby50bnNBY3RpdmUpIHsKLSAgICBmb3IoaT1zdGFydENiOyBpPHN0b3BDYjsgaSsrKSB7Ci0gICAgICAvKiB0aHJlc2hvbGRzW2ldICogMC4yNSAqLwotICAgICAgdGhyZXNob2xkc1tpXSA9ICh0aHJlc2hvbGRzW2ldID4+IDIpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvdHJhbnNmb3JtLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90cmFuc2Zvcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRlMmI5Ni4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90cmFuc2Zvcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDY3NyArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JRmlsZToJCXRyYW5zZm9ybS5jCi0KLQlDb250ZW50OglNRENUIFRyYW5zZm9ybSBmdW5jdGlvbnNzCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJiYXNpY19vcC5oIgotI2luY2x1ZGUgInBzeV9jb25zdC5oIgotI2luY2x1ZGUgInRyYW5zZm9ybS5oIgotI2luY2x1ZGUgImFhY19yb20uaCIKLQotCi0jZGVmaW5lIExTX1RSQU5TICgoRlJBTUVfTEVOX0xPTkctRlJBTUVfTEVOX1NIT1JUKS8yKSAvKiA0NDggKi8KLSNkZWZpbmUgU1FSVDFfMiAweDVhODI3OTlhCS8qIHNxcnQoMS8yKSBpbiBRMzEgKi8KLSNkZWZpbmUgc3dhcDIocDAscDEpIFwKLQl0ID0gcDA7IHQxID0gKigmKHAwKSsxKTsJXAotCShwMCkgPSBwMTsgKigmKHAwKSsxKSA9ICooJihwMSkrMSk7CVwKLQkocDEpID0gdDsgKigmKHAxKSsxKSA9IHQxCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogU2h1ZmZsZQotKiBkZXNjcmlwdGlvbjogIFNodWZmbGUgcG9pbnRzIHByZXBhcmVkIGZ1bmN0aW9uIGZvciBmZnQKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBTaHVmZmxlKGludCAqYnVmLCBpbnQgbnVtLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBiaXRUYWIpCi17Ci0gICAgaW50ICpwYXJ0MCwgKnBhcnQxOwotCWludCBpLCBqOwotCWludCB0LCB0MTsKLQotCXBhcnQwID0gYnVmOwotICAgIHBhcnQxID0gYnVmICsgbnVtOwotCi0Jd2hpbGUgKChpID0gKmJpdFRhYisrKSAhPSAwKSB7Ci0gICAgICAgIGogPSAqYml0VGFiKys7Ci0KLSAgICAgICAgc3dhcDIocGFydDBbNCppKzBdLCBwYXJ0MFs0KmorMF0pOwotICAgICAgICBzd2FwMihwYXJ0MFs0KmkrMl0sIHBhcnQxWzQqaiswXSk7Ci0gICAgICAgIHN3YXAyKHBhcnQxWzQqaSswXSwgcGFydDBbNCpqKzJdKTsKLSAgICAgICAgc3dhcDIocGFydDFbNCppKzJdLCBwYXJ0MVs0KmorMl0pOwotICAgIH0KLQotICAgIGRvIHsKLSAgICAgICAgc3dhcDIocGFydDBbNCppKzJdLCBwYXJ0MVs0KmkrMF0pOwotICAgIH0gd2hpbGUgKChpID0gKmJpdFRhYisrKSAhPSAwKTsKLX0KLQotI2lmICFkZWZpbmVkKEFSTVY1RSkgJiYgIWRlZmluZWQoQVJNVjdOZW9uKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogUmFkaXg0Rmlyc3QKLSogZGVzY3JpcHRpb246ICBSYWRpeCA0IHBvaW50IHByZXBhcmVkIGZ1bmN0aW9uIGZvciBmZnQKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBSYWRpeDRGaXJzdChpbnQgKmJ1ZiwgaW50IG51bSkKLXsKLSAgICBpbnQgcjAsIHIxLCByMiwgcjM7Ci0JaW50IHI0LCByNSwgcjYsIHI3OwotCi0JZm9yICg7IG51bSAhPSAwOyBudW0tLSkKLQl7Ci0JCXIwID0gYnVmWzBdICsgYnVmWzJdOwotCQlyMSA9IGJ1ZlsxXSArIGJ1ZlszXTsKLQkJcjIgPSBidWZbMF0gLSBidWZbMl07Ci0JCXIzID0gYnVmWzFdIC0gYnVmWzNdOwotCQlyNCA9IGJ1Zls0XSArIGJ1Zls2XTsKLQkJcjUgPSBidWZbNV0gKyBidWZbN107Ci0JCXI2ID0gYnVmWzRdIC0gYnVmWzZdOwotCQlyNyA9IGJ1Zls1XSAtIGJ1Zls3XTsKLQotCQlidWZbMF0gPSByMCArIHI0OwotCQlidWZbMV0gPSByMSArIHI1OwotCQlidWZbNF0gPSByMCAtIHI0OwotCQlidWZbNV0gPSByMSAtIHI1OwotCQlidWZbMl0gPSByMiArIHI3OwotCQlidWZbM10gPSByMyAtIHI2OwotCQlidWZbNl0gPSByMiAtIHI3OwotCQlidWZbN10gPSByMyArIHI2OwotCi0JCWJ1ZiArPSA4OwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IFJhZGl4OEZpcnN0Ci0qIGRlc2NyaXB0aW9uOiAgUmFkaXggOCBwb2ludCBwcmVwYXJlZCBmdW5jdGlvbiBmb3IgZmZ0Ci0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgUmFkaXg4Rmlyc3QoaW50ICpidWYsIGludCBudW0pCi17Ci0gICBpbnQgcjAsIHIxLCByMiwgcjM7Ci0gICBpbnQgaTAsIGkxLCBpMiwgaTM7Ci0gICBpbnQgcjQsIHI1LCByNiwgcjc7Ci0gICBpbnQgaTQsIGk1LCBpNiwgaTc7Ci0gICBpbnQgdDAsIHQxLCB0MiwgdDM7Ci0KLQlmb3IgKCA7IG51bSAhPSAwOyBudW0tLSkKLQl7Ci0JCXIwID0gYnVmWzBdICsgYnVmWzJdOwotCQlpMCA9IGJ1ZlsxXSArIGJ1ZlszXTsKLQkJcjEgPSBidWZbMF0gLSBidWZbMl07Ci0JCWkxID0gYnVmWzFdIC0gYnVmWzNdOwotCQlyMiA9IGJ1Zls0XSArIGJ1Zls2XTsKLQkJaTIgPSBidWZbNV0gKyBidWZbN107Ci0JCXIzID0gYnVmWzRdIC0gYnVmWzZdOwotCQlpMyA9IGJ1Zls1XSAtIGJ1Zls3XTsKLQotCQlyNCA9IChyMCArIHIyKSA+PiAxOwotCQlpNCA9IChpMCArIGkyKSA+PiAxOwotCQlyNSA9IChyMCAtIHIyKSA+PiAxOwotCQlpNSA9IChpMCAtIGkyKSA+PiAxOwotCQlyNiA9IChyMSAtIGkzKSA+PiAxOwotCQlpNiA9IChpMSArIHIzKSA+PiAxOwotCQlyNyA9IChyMSArIGkzKSA+PiAxOwotCQlpNyA9IChpMSAtIHIzKSA+PiAxOwotCi0JCXIwID0gYnVmWyA4XSArIGJ1ZlsxMF07Ci0JCWkwID0gYnVmWyA5XSArIGJ1ZlsxMV07Ci0JCXIxID0gYnVmWyA4XSAtIGJ1ZlsxMF07Ci0JCWkxID0gYnVmWyA5XSAtIGJ1ZlsxMV07Ci0JCXIyID0gYnVmWzEyXSArIGJ1ZlsxNF07Ci0JCWkyID0gYnVmWzEzXSArIGJ1ZlsxNV07Ci0JCXIzID0gYnVmWzEyXSAtIGJ1ZlsxNF07Ci0JCWkzID0gYnVmWzEzXSAtIGJ1ZlsxNV07Ci0KLQkJdDAgPSAocjAgKyByMikgPj4gMTsKLQkJdDEgPSAoaTAgKyBpMikgPj4gMTsKLQkJdDIgPSAocjAgLSByMikgPj4gMTsKLQkJdDMgPSAoaTAgLSBpMikgPj4gMTsKLQotCQlidWZbIDBdID0gcjQgKyB0MDsKLQkJYnVmWyAxXSA9IGk0ICsgdDE7Ci0JCWJ1ZlsgOF0gPSByNCAtIHQwOwotCQlidWZbIDldID0gaTQgLSB0MTsKLQkJYnVmWyA0XSA9IHI1ICsgdDM7Ci0JCWJ1ZlsgNV0gPSBpNSAtIHQyOwotCQlidWZbMTJdID0gcjUgLSB0MzsKLQkJYnVmWzEzXSA9IGk1ICsgdDI7Ci0KLQkJcjAgPSByMSAtIGkzOwotCQlpMCA9IGkxICsgcjM7Ci0JCXIyID0gcjEgKyBpMzsKLQkJaTIgPSBpMSAtIHIzOwotCi0JCXQwID0gTVVMSElHSChTUVJUMV8yLCByMCAtIGkwKTsKLQkJdDEgPSBNVUxISUdIKFNRUlQxXzIsIHIwICsgaTApOwotCQl0MiA9IE1VTEhJR0goU1FSVDFfMiwgcjIgLSBpMik7Ci0JCXQzID0gTVVMSElHSChTUVJUMV8yLCByMiArIGkyKTsKLQotCQlidWZbIDZdID0gcjYgLSB0MDsKLQkJYnVmWyA3XSA9IGk2IC0gdDE7Ci0JCWJ1ZlsxNF0gPSByNiArIHQwOwotCQlidWZbMTVdID0gaTYgKyB0MTsKLQkJYnVmWyAyXSA9IHI3ICsgdDM7Ci0JCWJ1ZlsgM10gPSBpNyAtIHQyOwotCQlidWZbMTBdID0gcjcgLSB0MzsKLQkJYnVmWzExXSA9IGk3ICsgdDI7Ci0KLQkJYnVmICs9IDE2OwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IFJhZGl4NEZGVAotKiBkZXNjcmlwdGlvbjogIFJhZGl4IDQgcG9pbnQgZmZ0IGNvcmUgZnVuY3Rpb24KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBSYWRpeDRGRlQoaW50ICpidWYsIGludCBudW0sIGludCBiZ24sIGludCAqdHdpZFRhYikKLXsKLQlpbnQgcjAsIHIxLCByMiwgcjM7Ci0JaW50IHI0LCByNSwgcjYsIHI3OwotCWludCB0MCwgdDE7Ci0JaW50IHNpbngsIGNvc3g7Ci0JaW50IGksIGosIHN0ZXA7Ci0JaW50ICp4cHRyLCAqY3NwdHI7Ci0KLQlmb3IgKG51bSA+Pj0gMjsgbnVtICE9IDA7IG51bSA+Pj0gMikKLQl7Ci0JCXN0ZXAgPSAyKmJnbjsKLQkJeHB0ciA9IGJ1ZjsKLQotICAgIAlmb3IgKGkgPSBudW07IGkgIT0gMDsgaS0tKQotCQl7Ci0JCQljc3B0ciA9IHR3aWRUYWI7Ci0KLQkJCWZvciAoaiA9IGJnbjsgaiAhPSAwOyBqLS0pCi0JCQl7Ci0JCQkJcjAgPSB4cHRyWzBdOwotCQkJCXIxID0geHB0clsxXTsKLQkJCQl4cHRyICs9IHN0ZXA7Ci0KLQkJCQl0MCA9IHhwdHJbMF07Ci0JCQkJdDEgPSB4cHRyWzFdOwotCQkJCWNvc3ggPSBjc3B0clswXTsKLQkJCQlzaW54ID0gY3NwdHJbMV07Ci0JCQkJcjIgPSBNVUxISUdIKGNvc3gsIHQwKSArIE1VTEhJR0goc2lueCwgdDEpOwkJLyogY29zKmJyICsgc2luKmJpICovCi0JCQkJcjMgPSBNVUxISUdIKGNvc3gsIHQxKSAtIE1VTEhJR0goc2lueCwgdDApOwkJLyogY29zKmJpIC0gc2luKmJyICovCi0JCQkJeHB0ciArPSBzdGVwOwotCi0JCQkJdDAgPSByMCA+PiAyOwotCQkJCXQxID0gcjEgPj4gMjsKLQkJCQlyMCA9IHQwIC0gcjI7Ci0JCQkJcjEgPSB0MSAtIHIzOwotCQkJCXIyID0gdDAgKyByMjsKLQkJCQlyMyA9IHQxICsgcjM7Ci0KLQkJCQl0MCA9IHhwdHJbMF07Ci0JCQkJdDEgPSB4cHRyWzFdOwotCQkJCWNvc3ggPSBjc3B0clsyXTsKLQkJCQlzaW54ID0gY3NwdHJbM107Ci0JCQkJcjQgPSBNVUxISUdIKGNvc3gsIHQwKSArIE1VTEhJR0goc2lueCwgdDEpOwkJLyogY29zKmNyICsgc2luKmNpICovCi0JCQkJcjUgPSBNVUxISUdIKGNvc3gsIHQxKSAtIE1VTEhJR0goc2lueCwgdDApOwkJLyogY29zKmNpIC0gc2luKmNyICovCi0JCQkJeHB0ciArPSBzdGVwOwotCi0JCQkJdDAgPSB4cHRyWzBdOwotCQkJCXQxID0geHB0clsxXTsKLQkJCQljb3N4ID0gY3NwdHJbNF07Ci0JCQkJc2lueCA9IGNzcHRyWzVdOwotCQkJCXI2ID0gTVVMSElHSChjb3N4LCB0MCkgKyBNVUxISUdIKHNpbngsIHQxKTsJCS8qIGNvcypjciArIHNpbipjaSAqLwotCQkJCXI3ID0gTVVMSElHSChjb3N4LCB0MSkgLSBNVUxISUdIKHNpbngsIHQwKTsJCS8qIGNvcypjaSAtIHNpbipjciAqLwotCQkJCWNzcHRyICs9IDY7Ci0KLQkJCQl0MCA9IHI0OwotCQkJCXQxID0gcjU7Ci0JCQkJcjQgPSB0MCArIHI2OwotCQkJCXI1ID0gcjcgLSB0MTsKLQkJCQlyNiA9IHQwIC0gcjY7Ci0JCQkJcjcgPSByNyArIHQxOwotCi0JCQkJeHB0clswXSA9IHIwICsgcjU7Ci0JCQkJeHB0clsxXSA9IHIxICsgcjY7Ci0JCQkJeHB0ciAtPSBzdGVwOwotCi0JCQkJeHB0clswXSA9IHIyIC0gcjQ7Ci0JCQkJeHB0clsxXSA9IHIzIC0gcjc7Ci0JCQkJeHB0ciAtPSBzdGVwOwotCi0JCQkJeHB0clswXSA9IHIwIC0gcjU7Ci0JCQkJeHB0clsxXSA9IHIxIC0gcjY7Ci0JCQkJeHB0ciAtPSBzdGVwOwotCi0JCQkJeHB0clswXSA9IHIyICsgcjQ7Ci0JCQkJeHB0clsxXSA9IHIzICsgcjc7Ci0JCQkJeHB0ciArPSAyOwotCQkJfQotCQkJeHB0ciArPSAzKnN0ZXA7Ci0JCX0KLQkJdHdpZFRhYiArPSAzKnN0ZXA7Ci0JCWJnbiA8PD0gMjsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogUHJlTURDVAotKiBkZXNjcmlwdGlvbjogIHByZXBhcmUgTURDVCBwcm9jZXNzIGZvciBuZXh0IEZGVCBjb21wdXRlCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgUHJlTURDVChpbnQgKmJ1ZjAsIGludCBudW0sIGNvbnN0IGludCAqY3NwdHIpCi17Ci0JaW50IGk7Ci0JaW50IHRyMSwgdGkxLCB0cjIsIHRpMjsKLQlpbnQgY29zYSwgc2luYSwgY29zYiwgc2luYjsKLQlpbnQgKmJ1ZjE7Ci0KLQlidWYxID0gYnVmMCArIG51bSAtIDE7Ci0KLQlmb3IoaSA9IG51bSA+PiAyOyBpICE9IDA7IGktLSkKLQl7Ci0JCWNvc2EgPSAqY3NwdHIrKzsKLQkJc2luYSA9ICpjc3B0cisrOwotCQljb3NiID0gKmNzcHRyKys7Ci0JCXNpbmIgPSAqY3NwdHIrKzsKLQotCQl0cjEgPSAqKGJ1ZjAgKyAwKTsKLQkJdGkyID0gKihidWYwICsgMSk7Ci0JCXRyMiA9ICooYnVmMSAtIDEpOwotCQl0aTEgPSAqKGJ1ZjEgKyAwKTsKLQotCQkqYnVmMCsrID0gTVVMSElHSChjb3NhLCB0cjEpICsgTVVMSElHSChzaW5hLCB0aTEpOwotCQkqYnVmMCsrID0gTVVMSElHSChjb3NhLCB0aTEpIC0gTVVMSElHSChzaW5hLCB0cjEpOwotCi0JCSpidWYxLS0gPSBNVUxISUdIKGNvc2IsIHRpMikgLSBNVUxISUdIKHNpbmIsIHRyMik7Ci0JCSpidWYxLS0gPSBNVUxISUdIKGNvc2IsIHRyMikgKyBNVUxISUdIKHNpbmIsIHRpMik7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IFBvc3RNRENUCi0qIGRlc2NyaXB0aW9uOiAgIHBvc3QgTURDVCBwcm9jZXNzIGFmdGVyIG5leHQgRkZUIGZvciBNRENUCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgUG9zdE1EQ1QoaW50ICpidWYwLCBpbnQgbnVtLCBjb25zdCBpbnQgKmNzcHRyKQotewotCWludCBpOwotCWludCB0cjEsIHRpMSwgdHIyLCB0aTI7Ci0JaW50IGNvc2EsIHNpbmEsIGNvc2IsIHNpbmI7Ci0JaW50ICpidWYxOwotCi0JYnVmMSA9IGJ1ZjAgKyBudW0gLSAxOwotCi0JZm9yKGkgPSBudW0gPj4gMjsgaSAhPSAwOyBpLS0pCi0JewotCQljb3NhID0gKmNzcHRyKys7Ci0JCXNpbmEgPSAqY3NwdHIrKzsKLQkJY29zYiA9ICpjc3B0cisrOwotCQlzaW5iID0gKmNzcHRyKys7Ci0KLQkJdHIxID0gKihidWYwICsgMCk7Ci0JCXRpMSA9ICooYnVmMCArIDEpOwotCQl0aTIgPSAqKGJ1ZjEgKyAwKTsKLQkJdHIyID0gKihidWYxIC0gMSk7Ci0KLQkJKmJ1ZjArKyA9IE1VTEhJR0goY29zYSwgdHIxKSArIE1VTEhJR0goc2luYSwgdGkxKTsKLQkJKmJ1ZjEtLSA9IE1VTEhJR0goc2luYSwgdHIxKSAtIE1VTEhJR0goY29zYSwgdGkxKTsKLQotCQkqYnVmMCsrID0gTVVMSElHSChzaW5iLCB0cjIpIC0gTVVMSElHSChjb3NiLCB0aTIpOwotCQkqYnVmMS0tID0gTVVMSElHSChjb3NiLCB0cjIpICsgTVVMSElHSChzaW5iLCB0aTIpOwotCX0KLX0KLSNlbHNlCi12b2lkIFJhZGl4NEZpcnN0KGludCAqYnVmLCBpbnQgbnVtKTsKLXZvaWQgUmFkaXg4Rmlyc3QoaW50ICpidWYsIGludCBudW0pOwotdm9pZCBSYWRpeDRGRlQoaW50ICpidWYsIGludCBudW0sIGludCBiZ24sIGludCAqdHdpZFRhYik7Ci12b2lkIFByZU1EQ1QoaW50ICpidWYwLCBpbnQgbnVtLCBjb25zdCBpbnQgKmNzcHRyKTsKLXZvaWQgUG9zdE1EQ1QoaW50ICpidWYwLCBpbnQgbnVtLCBjb25zdCBpbnQgKmNzcHRyKTsKLSNlbmRpZgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IE1kY3RfTG9uZwotKiBkZXNjcmlwdGlvbjogIHRoZSBsb25nIGJsb2NrIG1kY3QsIGluY2x1ZGUgbG9uZ19zdGFydCBibG9jaywgZW5kX2xvbmcgYmxvY2sKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE1kY3RfTG9uZyhpbnQgKmJ1ZikKLXsKLQlQcmVNRENUKGJ1ZiwgMTAyNCwgY29zc2ludGFiICsgMTI4KTsKLQotCVNodWZmbGUoYnVmLCA1MTIsIGJpdHJldlRhYiArIDE3KTsKLQlSYWRpeDhGaXJzdChidWYsIDUxMiA+PiAzKTsKLQlSYWRpeDRGRlQoYnVmLCA1MTIgPj4gMywgOCwgKGludCAqKXR3aWRUYWI1MTIpOwotCi0JUG9zdE1EQ1QoYnVmLCAxMDI0LCBjb3NzaW50YWIgKyAxMjgpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IE1kY3RfU2hvcnQKLSogZGVzY3JpcHRpb246ICB0aGUgc2hvcnQgYmxvY2sgbWRjdAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTWRjdF9TaG9ydChpbnQgKmJ1ZikKLXsKLQlQcmVNRENUKGJ1ZiwgMTI4LCBjb3NzaW50YWIpOwotCi0JU2h1ZmZsZShidWYsIDY0LCBiaXRyZXZUYWIpOwotCVJhZGl4NEZpcnN0KGJ1ZiwgNjQgPj4gMik7Ci0JUmFkaXg0RkZUKGJ1ZiwgNjQgPj4gMiwgNCwgKGludCAqKXR3aWRUYWI2NCk7Ci0KLQlQb3N0TURDVChidWYsIDEyOCwgY29zc2ludGFiKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogc2hpZnRNZGN0RGVsYXlCdWZmZXIKLSogZGVzY3JpcHRpb246ICAgIHRoZSBtZGN0IGRlbGF5IGJ1ZmZlciBoYXMgYSBzaXplIG9mIDE2MDAsCi0qICBzbyB0aGUgY2FsY3VsYXRpb24gb2YgTE9ORyxTVE9QIG11c3QgYmUgIHNwaWx0IGluIHR3bwotKiAgcGFzc2VzIHdpdGggMTAyNCBzYW1wbGVzIGFuZCBhIG1pZCBzaGlmdCwKLSogIHRoZSBTSE9SVCB0cmFuc2Zvcm1zIGNhbiBiZSBjb21wbGV0ZWQgaW4gdGhlIGRlbGF5IGJ1ZmZlciwKLSogIGFuZCBhZnRlcndhcmRzIGEgc2hpZnQKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBzaGlmdE1kY3REZWxheUJ1ZmZlcihXb3JkMTYgKm1kY3REZWxheUJ1ZmZlciwgLyohIHN0YXJ0IG9mIG1kY3QgZGVsYXkgYnVmZmVyICovCi0JCQkJCQkJCSBXb3JkMTYgKnRpbWVTaWduYWwsICAgICAgLyohIHBvaW50ZXIgdG8gbmV3IHRpbWUgc2lnbmFsIHNhbXBsZXMsIGludGVybGVhdmVkICovCi0JCQkJCQkJCSBXb3JkMTYgY2hJbmNyZW1lbnQgICAgICAgLyohIG51bWJlciBvZiBjaGFubmVscyAqLwotCQkJCQkJCQkgKQotewotCVdvcmQzMiBpOwotCVdvcmQxNiAqc3JCdWYgPSBtZGN0RGVsYXlCdWZmZXI7Ci0JV29yZDE2ICpkc0J1ZiA9IG1kY3REZWxheUJ1ZmZlcitGUkFNRV9MRU5fTE9ORzsKLQotCWZvcihpID0gMDsgaSA8IEJMT0NLX1NXSVRDSElOR19PRkZTRVQtRlJBTUVfTEVOX0xPTkc7IGkrPSA4KQotCXsKLQkJKnNyQnVmKysgPSAqZHNCdWYrKzsJICpzckJ1ZisrID0gKmRzQnVmKys7Ci0JCSpzckJ1ZisrID0gKmRzQnVmKys7CSAqc3JCdWYrKyA9ICpkc0J1ZisrOwotCQkqc3JCdWYrKyA9ICpkc0J1ZisrOwkgKnNyQnVmKysgPSAqZHNCdWYrKzsKLQkJKnNyQnVmKysgPSAqZHNCdWYrKzsJICpzckJ1ZisrID0gKmRzQnVmKys7Ci0JfQotCi0Jc3JCdWYgPSBtZGN0RGVsYXlCdWZmZXIgKyBCTE9DS19TV0lUQ0hJTkdfT0ZGU0VULUZSQU1FX0xFTl9MT05HOwotCWRzQnVmID0gdGltZVNpZ25hbDsKLQotCWZvcihpPTA7IGk8RlJBTUVfTEVOX0xPTkc7IGkrPTgpCi0JewotCQkqc3JCdWYrKyA9ICpkc0J1ZjsgZHNCdWYgKz0gY2hJbmNyZW1lbnQ7Ci0JCSpzckJ1ZisrID0gKmRzQnVmOyBkc0J1ZiArPSBjaEluY3JlbWVudDsKLQkJKnNyQnVmKysgPSAqZHNCdWY7IGRzQnVmICs9IGNoSW5jcmVtZW50OwotCQkqc3JCdWYrKyA9ICpkc0J1ZjsgZHNCdWYgKz0gY2hJbmNyZW1lbnQ7Ci0JCSpzckJ1ZisrID0gKmRzQnVmOyBkc0J1ZiArPSBjaEluY3JlbWVudDsKLQkJKnNyQnVmKysgPSAqZHNCdWY7IGRzQnVmICs9IGNoSW5jcmVtZW50OwotCQkqc3JCdWYrKyA9ICpkc0J1ZjsgZHNCdWYgKz0gY2hJbmNyZW1lbnQ7Ci0JCSpzckJ1ZisrID0gKmRzQnVmOyBkc0J1ZiArPSBjaEluY3JlbWVudDsKLQl9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIGZ1bmN0aW9uIG5hbWU6IGdldFNjYWxlZmFjdG9yT2ZTaG9ydFZlY3RvclN0cmlkZQotKiBkZXNjcmlwdGlvbjogIENhbGN1bGF0ZSBtYXggcG9zc2libGUgc2NhbGUgZmFjdG9yIGZvciBpbnB1dCB2ZWN0b3Igb2Ygc2hvcnRzCi0qIHJldHVybnM6ICAgICAgTWF4aW11bSBzY2FsZSBmYWN0b3IKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgV29yZDE2IGdldFNjYWxlZmFjdG9yT2ZTaG9ydFZlY3RvclN0cmlkZShjb25zdCBXb3JkMTYgKnZlY3RvciwgLyohPCBQb2ludGVyIHRvIGlucHV0IHZlY3RvciAqLwotCQkJCQkJCQkJCQkJV29yZDE2IGxlbiwgICAgICAgICAgIC8qITwgTGVuZ3RoIG9mIGlucHV0IHZlY3RvciAqLwotCQkJCQkJCQkJCQkJV29yZDE2IHN0cmlkZSkgICAgICAgIC8qITwgU3RyaWRlIG9mIGlucHV0IHZlY3RvciAqLwotewotCVdvcmQxNiBtYXhWYWwgPSAwOwotCVdvcmQxNiBhYnNWYWw7Ci0JV29yZDE2IGk7Ci0KLQlmb3IoaT0wOyBpPGxlbjsgaSsrKXsKLQkJYWJzVmFsID0gYWJzX3ModmVjdG9yW2kqc3RyaWRlXSk7Ci0JCW1heFZhbCB8PSBhYnNWYWw7Ci0JfQotCi0JcmV0dXJuKCBtYXhWYWwgPyBub3JtX3MobWF4VmFsKSA6IDE1KTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogZnVuY3Rpb24gbmFtZTogVHJhbnNmb3JtX1JlYWwKLSogZGVzY3JpcHRpb246ICBDYWxjdWxhdGUgdHJhbnNmb3JtIGZpbHRlciBmb3IgaW5wdXQgdmVjdG9yIG9mIHNob3J0cwotKiByZXR1cm5zOiAgICAgIFRSVUUgaWYgc3VjY2VzcwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgVHJhbnNmb3JtX1JlYWwoV29yZDE2ICptZGN0RGVsYXlCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqdGltZVNpZ25hbCwKLSAgICAgICAgICAgICAgICAgICAgV29yZDE2IGNoSW5jcmVtZW50LAotICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKnJlYWxPdXQsCi0gICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbWRjdFNjYWxlLAotICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYmxvY2tUeXBlCi0gICAgICAgICAgICAgICAgICAgICkKLXsKLQlXb3JkMzIgaSx3OwotCVdvcmQzMiB0aW1lU2lnbmFsU2FtcGxlOwotCVdvcmQzMiB3czEsd3MyOwotCVdvcmQxNiAqZGN0SW4wLCAqZGN0SW4xOwotCVdvcmQzMiAqb3V0RGF0YTAsICpvdXREYXRhMTsKLQlXb3JkMzIgKndpblB0cjsKLQotCVdvcmQzMiBkZWxheUJ1ZmZlclNmLHRpbWVTaWduYWxTZixtaW5TZjsKLQotCXN3aXRjaChibG9ja1R5cGUpewotCi0KLQljYXNlIExPTkdfV0lORE9XOgotCQkvKgotCQl3ZSBhY2Nlc3MgQkxPQ0tfU1dJVENISU5HX09GRlNFVCAoMTYwMCApIGRlbGF5IGJ1ZmZlciBzYW1wbGVzICsgNDQ4IG5ldyB0aW1lU2lnbmFsIHNhbXBsZXMKLQkJYW5kIGdldCB0aGUgYmlnZ2VzdCBzY2FsZSBmYWN0b3IgZm9yIG5leHQgY2FsY3VsYXRlIG1vcmUgcHJlY2lzZQotCQkqLwotCQlkZWxheUJ1ZmZlclNmID0gZ2V0U2NhbGVmYWN0b3JPZlNob3J0VmVjdG9yU3RyaWRlKG1kY3REZWxheUJ1ZmZlcixCTE9DS19TV0lUQ0hJTkdfT0ZGU0VULDEpOwotCQl0aW1lU2lnbmFsU2YgID0gZ2V0U2NhbGVmYWN0b3JPZlNob3J0VmVjdG9yU3RyaWRlKHRpbWVTaWduYWwsMipGUkFNRV9MRU5fTE9ORy1CTE9DS19TV0lUQ0hJTkdfT0ZGU0VULGNoSW5jcmVtZW50KTsKLQkJbWluU2YgPSBtaW4oZGVsYXlCdWZmZXJTZix0aW1lU2lnbmFsU2YpOwotCQltaW5TZiA9IG1pbihtaW5TZiwxNCk7Ci0KLQkJZGN0SW4wID0gbWRjdERlbGF5QnVmZmVyOwotCQlkY3RJbjEgPSBtZGN0RGVsYXlCdWZmZXIgKyBGUkFNRV9MRU5fTE9ORyAtIDE7Ci0JCW91dERhdGEwID0gcmVhbE91dCArIEZSQU1FX0xFTl9MT05HLzI7Ci0KLQkJLyogYWRkIHdpbmRvd3MgYW5kIHByZSBhZGQgZm9yIG1kY3QgdG8gbGFzdCBidWZmZXIqLwotCQl3aW5QdHIgPSAoaW50ICopTG9uZ1dpbmRvd0tCRDsKLQkJZm9yKGk9MDtpPEZSQU1FX0xFTl9MT05HLzI7aSsrKXsKLQkJCXRpbWVTaWduYWxTYW1wbGUgPSAoKmRjdEluMCsrKSA8PCBtaW5TZjsKLQkJCXdzMSA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciA+PiAxNik7Ci0JCQl0aW1lU2lnbmFsU2FtcGxlID0gKCpkY3RJbjEtLSkgPDwgbWluU2Y7Ci0JCQl3czIgPSB0aW1lU2lnbmFsU2FtcGxlICogKCp3aW5QdHIgJiAweGZmZmYpOwotCQkJd2luUHRyICsrOwotCQkJLyogc2hpZnQgMiB0byBhdm9pZCBvdmVyZmxvdyBuZXh0ICovCi0JCQkqb3V0RGF0YTArKyA9ICh3czEgPj4gMikgLSAod3MyID4+IDIpOwotCQl9Ci0KLQkJc2hpZnRNZGN0RGVsYXlCdWZmZXIobWRjdERlbGF5QnVmZmVyLHRpbWVTaWduYWwsY2hJbmNyZW1lbnQpOwotCi0JCS8qIGFkZCB3aW5kb3dzIGFuZCBwcmUgYWRkIGZvciBtZGN0IHRvIG5ldyBidWZmZXIqLwotCQlkY3RJbjAgPSBtZGN0RGVsYXlCdWZmZXI7Ci0JCWRjdEluMSA9IG1kY3REZWxheUJ1ZmZlciArIEZSQU1FX0xFTl9MT05HIC0gMTsKLQkJb3V0RGF0YTAgPSByZWFsT3V0ICsgRlJBTUVfTEVOX0xPTkcvMiAtIDE7Ci0JCXdpblB0ciA9IChpbnQgKilMb25nV2luZG93S0JEOwotCQlmb3IoaT0wO2k8RlJBTUVfTEVOX0xPTkcvMjtpKyspewotCQkJdGltZVNpZ25hbFNhbXBsZSA9ICgqZGN0SW4wKyspIDw8IG1pblNmOwotCQkJd3MxID0gdGltZVNpZ25hbFNhbXBsZSAqICgqd2luUHRyICYgMHhmZmZmKTsKLQkJCXRpbWVTaWduYWxTYW1wbGUgPSAoKmRjdEluMS0tKSA8PCBtaW5TZjsKLQkJCXdzMiA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciA+PiAxNik7Ci0JCQl3aW5QdHIrKzsKLQkJCS8qIHNoaWZ0IDIgdG8gYXZvaWQgb3ZlcmZsb3cgbmV4dCAqLwotCQkJKm91dERhdGEwLS0gPSAtKCh3czEgPj4gMikgKyAod3MyID4+IDIpKTsKLQkJfQotCi0JCU1kY3RfTG9uZyhyZWFsT3V0KTsKLQkJLyogdXBkYXRlIHNjYWxlIGZhY3RvciAqLwotCQltaW5TZiA9IDE0IC0gbWluU2Y7Ci0JCSptZGN0U2NhbGU9bWluU2Y7Ci0JCWJyZWFrOwotCi0JY2FzZSBTVEFSVF9XSU5ET1c6Ci0JCS8qCi0JCXdlIGFjY2VzcyBCTE9DS19TV0lUQ0hJTkdfT0ZGU0VUICgxNjAwICkgZGVsYXkgYnVmZmVyIHNhbXBsZXMgKyBubyB0aW1lU2lnbmFsIHNhbXBsZXMKLQkJYW5kIGdldCB0aGUgYmlnZ2VzdCBzY2FsZSBmYWN0b3IgZm9yIG5leHQgY2FsY3VsYXRlIG1vcmUgcHJlY2lzZQotCQkqLwotCQltaW5TZiA9IGdldFNjYWxlZmFjdG9yT2ZTaG9ydFZlY3RvclN0cmlkZShtZGN0RGVsYXlCdWZmZXIsQkxPQ0tfU1dJVENISU5HX09GRlNFVCwxKTsKLQkJbWluU2YgPSBtaW4obWluU2YsMTQpOwotCi0JCWRjdEluMCA9IG1kY3REZWxheUJ1ZmZlcjsKLQkJZGN0SW4xID0gbWRjdERlbGF5QnVmZmVyICsgRlJBTUVfTEVOX0xPTkcgLSAxOwotCQlvdXREYXRhMCA9IHJlYWxPdXQgKyBGUkFNRV9MRU5fTE9ORy8yOwotCQl3aW5QdHIgPSAoaW50ICopTG9uZ1dpbmRvd0tCRDsKLQotCQkvKiBhZGQgd2luZG93cyBhbmQgcHJlIGFkZCBmb3IgbWRjdCB0byBsYXN0IGJ1ZmZlciovCi0JCWZvcihpPTA7aTxGUkFNRV9MRU5fTE9ORy8yO2krKyl7Ci0JCQl0aW1lU2lnbmFsU2FtcGxlID0gKCpkY3RJbjArKykgPDwgbWluU2Y7Ci0JCQl3czEgPSB0aW1lU2lnbmFsU2FtcGxlICogKCp3aW5QdHIgPj4gMTYpOwotCQkJdGltZVNpZ25hbFNhbXBsZSA9ICgqZGN0SW4xLS0pIDw8IG1pblNmOwotCQkJd3MyID0gdGltZVNpZ25hbFNhbXBsZSAqICgqd2luUHRyICYgMHhmZmZmKTsKLQkJCXdpblB0ciArKzsKLQkJCSpvdXREYXRhMCsrID0gKHdzMSA+PiAyKSAtICh3czIgPj4gMik7ICAvKiBzaGlmdCAyIHRvIGF2b2lkIG92ZXJmbG93IG5leHQgKi8KLQkJfQotCi0JCXNoaWZ0TWRjdERlbGF5QnVmZmVyKG1kY3REZWxheUJ1ZmZlcix0aW1lU2lnbmFsLGNoSW5jcmVtZW50KTsKLQotCQlvdXREYXRhMCA9IHJlYWxPdXQgKyBGUkFNRV9MRU5fTE9ORy8yIC0gMTsKLQkJZm9yKGk9MDtpPExTX1RSQU5TO2krKyl7Ci0JCQkqb3V0RGF0YTAtLSA9IC1tZGN0RGVsYXlCdWZmZXJbaV0gPDwgKDE1IC0gMiArIG1pblNmKTsKLQkJfQotCi0JCS8qIGFkZCB3aW5kb3dzIGFuZCBwcmUgYWRkIGZvciBtZGN0IHRvIG5ldyBidWZmZXIqLwotCQlkY3RJbjAgPSBtZGN0RGVsYXlCdWZmZXIgKyBMU19UUkFOUzsKLQkJZGN0SW4xID0gbWRjdERlbGF5QnVmZmVyICsgRlJBTUVfTEVOX0xPTkcgLSAxIC0gTFNfVFJBTlM7Ci0JCW91dERhdGEwID0gcmVhbE91dCArIEZSQU1FX0xFTl9MT05HLzIgLSAxIC1MU19UUkFOUzsKLQkJd2luUHRyID0gKGludCAqKVNob3J0V2luZG93U2luZTsKLQkJZm9yKGk9MDtpPEZSQU1FX0xFTl9TSE9SVC8yO2krKyl7Ci0JCQl0aW1lU2lnbmFsU2FtcGxlPSAoKmRjdEluMCsrKSA8PCBtaW5TZjsKLQkJCXdzMSA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciAmIDB4ZmZmZik7Ci0JCQl0aW1lU2lnbmFsU2FtcGxlPSAoKmRjdEluMS0tKSA8PCBtaW5TZjsKLQkJCXdzMiA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciA+PiAxNik7Ci0JCQl3aW5QdHIrKzsKLQkJCSpvdXREYXRhMC0tID0gIC0oKHdzMSA+PiAyKSArICh3czIgPj4gMikpOyAgLyogc2hpZnQgMiB0byBhdm9pZCBvdmVyZmxvdyBuZXh0ICovCi0JCX0KLQotCQlNZGN0X0xvbmcocmVhbE91dCk7Ci0JCS8qIHVwZGF0ZSBzY2FsZSBmYWN0b3IgKi8KLQkJbWluU2YgPSAxNCAtIG1pblNmOwotCQkqbWRjdFNjYWxlPSBtaW5TZjsKLQkJYnJlYWs7Ci0KLQljYXNlIFNUT1BfV0lORE9XOgotCQkvKgotCQl3ZSBhY2Nlc3MgQkxPQ0tfU1dJVENISU5HX09GRlNFVC1MU19UUkFOUyAoMTYwMC00NDggKSBkZWxheSBidWZmZXIgc2FtcGxlcyArIDQ0OCBuZXcgdGltZVNpZ25hbCBzYW1wbGVzCi0JCWFuZCBnZXQgdGhlIGJpZ2dlc3Qgc2NhbGUgZmFjdG9yIGZvciBuZXh0IGNhbGN1bGF0ZSBtb3JlIHByZWNpc2UKLQkJKi8KLQkJZGVsYXlCdWZmZXJTZiA9IGdldFNjYWxlZmFjdG9yT2ZTaG9ydFZlY3RvclN0cmlkZShtZGN0RGVsYXlCdWZmZXIrTFNfVFJBTlMsQkxPQ0tfU1dJVENISU5HX09GRlNFVC1MU19UUkFOUywxKTsKLQkJdGltZVNpZ25hbFNmICA9IGdldFNjYWxlZmFjdG9yT2ZTaG9ydFZlY3RvclN0cmlkZSh0aW1lU2lnbmFsLDIqRlJBTUVfTEVOX0xPTkctQkxPQ0tfU1dJVENISU5HX09GRlNFVCxjaEluY3JlbWVudCk7Ci0JCW1pblNmID0gbWluKGRlbGF5QnVmZmVyU2YsdGltZVNpZ25hbFNmKTsKLQkJbWluU2YgPSBtaW4obWluU2YsMTMpOwotCi0JCW91dERhdGEwID0gcmVhbE91dCArIEZSQU1FX0xFTl9MT05HLzI7Ci0JCWRjdEluMSA9IG1kY3REZWxheUJ1ZmZlciArIEZSQU1FX0xFTl9MT05HIC0gMTsKLQkJZm9yKGk9MDtpPExTX1RSQU5TO2krKyl7Ci0JCQkqb3V0RGF0YTArKyA9IC0oKmRjdEluMS0tKSA8PCAoMTUgLSAyICsgbWluU2YpOwotCQl9Ci0KLQkJLyogYWRkIHdpbmRvd3MgYW5kIHByZSBhZGQgZm9yIG1kY3QgdG8gbGFzdCBidWZmZXIqLwotCQlkY3RJbjAgPSBtZGN0RGVsYXlCdWZmZXIgKyBMU19UUkFOUzsKLQkJZGN0SW4xID0gbWRjdERlbGF5QnVmZmVyICsgRlJBTUVfTEVOX0xPTkcgLSAxIC0gTFNfVFJBTlM7Ci0JCW91dERhdGEwID0gcmVhbE91dCArIEZSQU1FX0xFTl9MT05HLzIgKyBMU19UUkFOUzsKLQkJd2luUHRyID0gKGludCAqKVNob3J0V2luZG93U2luZTsKLQkJZm9yKGk9MDtpPEZSQU1FX0xFTl9TSE9SVC8yO2krKyl7Ci0JCQl0aW1lU2lnbmFsU2FtcGxlID0gKCpkY3RJbjArKykgPDwgbWluU2Y7Ci0JCQl3czEgPSB0aW1lU2lnbmFsU2FtcGxlICogKCp3aW5QdHIgPj4gMTYpOwotCQkJdGltZVNpZ25hbFNhbXBsZT0gKCpkY3RJbjEtLSkgPDwgbWluU2Y7Ci0JCQl3czIgPSB0aW1lU2lnbmFsU2FtcGxlICogKCp3aW5QdHIgJiAweGZmZmYpOwotCQkJd2luUHRyKys7Ci0JCQkqb3V0RGF0YTArKyA9ICh3czEgPj4gMikgLSAod3MyID4+IDIpOyAgLyogc2hpZnQgMiB0byBhdm9pZCBvdmVyZmxvdyBuZXh0ICovCi0JCX0KLQotCQlzaGlmdE1kY3REZWxheUJ1ZmZlcihtZGN0RGVsYXlCdWZmZXIsdGltZVNpZ25hbCxjaEluY3JlbWVudCk7Ci0KLQkJLyogYWRkIHdpbmRvd3MgYW5kIHByZSBhZGQgZm9yIG1kY3QgdG8gbmV3IGJ1ZmZlciovCi0JCWRjdEluMCA9IG1kY3REZWxheUJ1ZmZlcjsKLQkJZGN0SW4xID0gbWRjdERlbGF5QnVmZmVyICsgRlJBTUVfTEVOX0xPTkcgLSAxOwotCQlvdXREYXRhMCA9IHJlYWxPdXQgKyBGUkFNRV9MRU5fTE9ORy8yIC0gMTsKLQkJd2luUHRyID0gKGludCAqKUxvbmdXaW5kb3dLQkQ7Ci0JCWZvcihpPTA7aTxGUkFNRV9MRU5fTE9ORy8yO2krKyl7Ci0JCQl0aW1lU2lnbmFsU2FtcGxlPSAoKmRjdEluMCsrKSA8PCBtaW5TZjsKLQkJCXdzMSA9IHRpbWVTaWduYWxTYW1wbGUgKigqd2luUHRyICYgMHhmZmZmKTsKLQkJCXRpbWVTaWduYWxTYW1wbGU9ICgqZGN0SW4xLS0pIDw8IG1pblNmOwotCQkJd3MyID0gdGltZVNpZ25hbFNhbXBsZSAqICgqd2luUHRyID4+IDE2KTsKLQkJCSpvdXREYXRhMC0tID0gIC0oKHdzMSA+PiAyKSArICh3czIgPj4gMikpOyAgLyogc2hpZnQgMiB0byBhdm9pZCBvdmVyZmxvdyBuZXh0ICovCi0JCQl3aW5QdHIrKzsKLQkJfQotCi0JCU1kY3RfTG9uZyhyZWFsT3V0KTsKLQkJbWluU2YgPSAxNCAtIG1pblNmOwotCQkqbWRjdFNjYWxlPSBtaW5TZjsgLyogdXBkYXRlIHNjYWxlIGZhY3RvciAqLwotCQlicmVhazsKLQotCWNhc2UgU0hPUlRfV0lORE9XOgotCQkvKgotCQl3ZSBhY2Nlc3MgQkxPQ0tfU1dJVENISU5HX09GRlNFVCAoMTYwMCApIGRlbGF5IGJ1ZmZlciBzYW1wbGVzICsgbm8gbmV3IHRpbWVTaWduYWwgc2FtcGxlcwotCQlhbmQgZ2V0IHRoZSBiaWdnZXN0IHNjYWxlIGZhY3RvciBmb3IgbmV4dCBjYWxjdWxhdGUgbW9yZSBwcmVjaXNlCi0JCSovCi0JCW1pblNmID0gZ2V0U2NhbGVmYWN0b3JPZlNob3J0VmVjdG9yU3RyaWRlKG1kY3REZWxheUJ1ZmZlcitUUkFOU0ZPUk1fT0ZGU0VUX1NIT1JULDkqRlJBTUVfTEVOX1NIT1JULDEpOwotCQltaW5TZiA9IG1pbihtaW5TZiwxMCk7Ci0KLQotCQlmb3Iodz0wO3c8VFJBTlNfRkFDO3crKyl7Ci0JCQlkY3RJbjAgPSBtZGN0RGVsYXlCdWZmZXIrdypGUkFNRV9MRU5fU0hPUlQrVFJBTlNGT1JNX09GRlNFVF9TSE9SVDsKLQkJCWRjdEluMSA9IG1kY3REZWxheUJ1ZmZlcit3KkZSQU1FX0xFTl9TSE9SVCtUUkFOU0ZPUk1fT0ZGU0VUX1NIT1JUICsgRlJBTUVfTEVOX1NIT1JULTE7Ci0JCQlvdXREYXRhMCA9IHJlYWxPdXQgKyBGUkFNRV9MRU5fU0hPUlQvMjsKLQkJCW91dERhdGExID0gcmVhbE91dCArIEZSQU1FX0xFTl9TSE9SVC8yIC0gMTsKLQotCQkJd2luUHRyID0gKGludCAqKVNob3J0V2luZG93U2luZTsKLQkJCWZvcihpPTA7aTxGUkFNRV9MRU5fU0hPUlQvMjtpKyspewotCQkJCXRpbWVTaWduYWxTYW1wbGU9ICpkY3RJbjAgPDwgbWluU2Y7Ci0JCQkJd3MxID0gdGltZVNpZ25hbFNhbXBsZSAqICgqd2luUHRyID4+IDE2KTsKLQkJCQl0aW1lU2lnbmFsU2FtcGxlPSAqZGN0SW4xIDw8IG1pblNmOwotCQkJCXdzMiA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciAmIDB4ZmZmZik7Ci0JCQkJKm91dERhdGEwKysgPSAod3MxID4+IDIpIC0gKHdzMiA+PiAyKTsgIC8qIHNoaWZ0IDIgdG8gYXZvaWQgb3ZlcmZsb3cgbmV4dCAqLwotCi0JCQkJdGltZVNpZ25hbFNhbXBsZT0gKihkY3RJbjAgKyBGUkFNRV9MRU5fU0hPUlQpIDw8IG1pblNmOwotCQkJCXdzMSA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciAmIDB4ZmZmZik7Ci0JCQkJdGltZVNpZ25hbFNhbXBsZT0gKihkY3RJbjEgKyBGUkFNRV9MRU5fU0hPUlQpIDw8IG1pblNmOwotCQkJCXdzMiA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciA+PiAxNik7Ci0JCQkJKm91dERhdGExLS0gPSAgLSgod3MxID4+IDIpICsgKHdzMiA+PiAyKSk7ICAvKiBzaGlmdCAyIHRvIGF2b2lkIG92ZXJmbG93IG5leHQgKi8KLQotCQkJCXdpblB0cisrOwotCQkJCWRjdEluMCsrOwotCQkJCWRjdEluMS0tOwotCQkJfQotCi0JCQlNZGN0X1Nob3J0KHJlYWxPdXQpOwotCQkJcmVhbE91dCArPSBGUkFNRV9MRU5fU0hPUlQ7Ci0JCX0KLQotCQltaW5TZiA9IDExIC0gbWluU2Y7Ci0JCSptZGN0U2NhbGUgPSBtaW5TZjsgLyogdXBkYXRlIHNjYWxlIGZhY3RvciAqLwotCi0JCXNoaWZ0TWRjdERlbGF5QnVmZmVyKG1kY3REZWxheUJ1ZmZlcix0aW1lU2lnbmFsLGNoSW5jcmVtZW50KTsKLQkJYnJlYWs7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLmJwCmluZGV4IGQyNjZkYzIuLjg4MGYxNjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQuYnAKQEAgLTQxLDcgKzQxLDcgQEAKICAgICBdLAogCiAgICAgaW5jbHVkZV9kaXJzOiBbImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSJdLAotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbInNyYyJdLAogCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItRE9TQ0xfVU5VU0VEX0FSRyh4KT0odm9pZCkoeCkiLApAQCAtNTAsNiArNTAsOCBAQAogICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKIAorICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAorCiAgICAgLy9zYW5pdGl6ZTogewogICAgIC8vICAgIG1pc2NfdW5kZWZpbmVkOiBbCiAgICAgLy8gICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCkBAIC04NSw2ICs4Nyw4IEBACiAgICAgICAgICItV2Vycm9yIiwKICAgICBdLAogCisgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCisKICAgICAvL3Nhbml0aXplOiB7CiAgICAgLy8gICAgbWlzY191bmRlZmluZWQ6IFsKICAgICAvLyAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKQEAgLTEwNiw3ICsxMTAsNiBAQAogICAgIF0sCiAgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KLQogLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiBjY190ZXN0IHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfYW1ybmJkZWNfdGVzdCIsCkBAIC0xMTQsNiArMTE3LDggQEAKIAogICAgIHNyY3M6IFsidGVzdC9hbXJuYmRlY190ZXN0LmNwcCJdLAogCisgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKKwogICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKIAogICAgIHN0YXRpY19saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL2V4cG9ydHMubGRzIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9leHBvcnRzLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjRmM2ZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9leHBvcnRzLmxkcwpAQCAtMCwwICsxLDUgQEAKK3sKKyAgICBnbG9iYWw6CisgICAgICAgIF9aMjJjcmVhdGVTb2Z0T01YQ29tcG9uZW50UEtjUEsxNk9NWF9DQUxMQkFDS1RZUEVQdlBQMTdPTVhfQ09NUE9ORU5UVFlQRTsKKyAgICBsb2NhbDogKjsKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQuYnAKaW5kZXggNmRjMmRjMS4uMTlmZDRhOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5icApAQCAtNjMsMTMgKzYzLDE1IEBACiAgICAgXSwKIAogICAgIGluY2x1ZGVfZGlyczogWyJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiXSwKLSAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJzcmMiXSwKIAogICAgIGNmbGFnczogWwogICAgICAgICAiLURPU0NMX1VOVVNFRF9BUkcoeCk9KHZvaWQpKHgpIiwKICAgICAgICAgIi1XZXJyb3IiLAogICAgIF0sCiAKKyAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKKwogICAgIC8vYWRkcmVzc2luZyBiLzI1NDA5NzQ0CiAgICAgLy9zYW5pdGl6ZTogewogICAgIC8vICAgIG1pc2NfdW5kZWZpbmVkOiBbCkBAIC0xMjYsNiArMTI4LDggQEAKIAogICAgIHNyY3M6IFsidGVzdC9hbXJuYl9lbmNfdGVzdC5jcHAiXSwKIAorICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCisKICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCiAKICAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9hbXJuYmVuYyJdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9leHBvcnRzLmxkcyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvZXhwb3J0cy5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI0ZjNmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvZXhwb3J0cy5sZHMKQEAgLTAsMCArMSw1IEBACit7CisgICAgZ2xvYmFsOgorICAgICAgICBfWjIyY3JlYXRlU29mdE9NWENvbXBvbmVudFBLY1BLMTZPTVhfQ0FMTEJBQ0tUWVBFUHZQUDE3T01YX0NPTVBPTkVOVFRZUEU7CisgICAgbG9jYWw6ICo7Cit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQW5kcm9pZC5icAppbmRleCBiOTMyY2NjLi45ZmVmZDgxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQW5kcm9pZC5icApAQCAtNDUsOCArNDUsMTEgQEAKICAgICBdLAogCiAgICAgaW5jbHVkZV9kaXJzOiBbImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSJdLAotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgInNyYyIsCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAogCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItRE9TQ0xfVU5VU0VEX0FSRyh4KT0odm9pZCkoeCkiLApAQCAtNjksNiArNzIsOCBAQAogCiAgICAgc3JjczogWyJ0ZXN0L2FtcndiZGVjX3Rlc3QuY3BwIl0sCiAKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAorCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2FtcndiZGVjIiwKICAgICAgICAgImxpYnNuZGZpbGUiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5icAppbmRleCA4OTY4OTkxLi5lYmUwOGM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5icApAQCAtNzYsNyArNzYsNyBAQAogCiAgICAgICAgICAgICBpbnN0cnVjdGlvbl9zZXQ6ICJhcm0iLAogCi0gICAgICAgICAgICBhcm12N19hX25lb246IHsKKyAgICAgICAgICAgIG5lb246IHsKICAgICAgICAgICAgICAgICBleGNsdWRlX3NyY3M6IFsKICAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL2NvbnZvbHZlX29wdC5zIiwKICAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL2Nvcl9oX3ZlY19vcHQucyIsCkBAIC0xNTksNiArMTU5LDggQEAKIAogICAgIGNmbGFnczogWyItV2Vycm9yIl0sCiAKKyAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKKwogICAgIHNhbml0aXplOiB7CiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL0FuZHJvaWQuYnAKaW5kZXggZDUyZmVkMy4uODFiM2Y2OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9BbmRyb2lkLmJwCkBAIC00LDYgKzQsOCBAQAogCiAgICAgc3JjczogWyJBTVJXQl9FX1NBTVBMRS5jIl0sCiAKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAorCiAgICAgYXJjaDogewogICAgICAgICBhcm06IHsKICAgICAgICAgICAgIGluc3RydWN0aW9uX3NldDogImFybSIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvZXhwb3J0cy5sZHMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvZXhwb3J0cy5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI0ZjNmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9leHBvcnRzLmxkcwpAQCAtMCwwICsxLDUgQEAKK3sKKyAgICBnbG9iYWw6CisgICAgICAgIF9aMjJjcmVhdGVTb2Z0T01YQ29tcG9uZW50UEtjUEsxNk9NWF9DQUxMQkFDS1RZUEVQdlBQMTdPTVhfQ09NUE9ORU5UVFlQRTsKKyAgICBsb2NhbDogKjsKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL0FuZHJvaWQuYnAKaW5kZXggMWY0MzgwMy4uY2Y1MGEwNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvQW5kcm9pZC5icApAQCAtOCw2ICs4LDEzIEBACiAgICAgc3RhdGljX2xpYnM6IFsibGliYXZjZGVjIl0sCiAgICAgc3JjczogWyJTb2Z0QVZDRGVjLmNwcCJdLAogCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCisKICAgICBpbmNsdWRlX2RpcnM6IFsKICAgICAgICAgImV4dGVybmFsL2xpYmF2Yy9kZWNvZGVyIiwKICAgICAgICAgImV4dGVybmFsL2xpYmF2Yy9jb21tb24iLApAQCAtMTYsNyArMjMsNiBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibWVkaWFfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL1NvZnRBVkNEZWMuY3BwCmluZGV4IGRhZTZlNzkuLjM5MjRmYzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9Tb2Z0QVZDRGVjLmNwcApAQCAtMTcxLDcgKzE3MSw3IEBACiBzdGF0dXNfdCBTb2Z0QVZDOjpyZXNldFBsdWdpbigpIHsKICAgICBtSXNJbkZsdXNoID0gZmFsc2U7CiAgICAgbVJlY2VpdmVkRU9TID0gZmFsc2U7Ci0gICAgbUlucHV0T2Zmc2V0ID0gMDsKKwogICAgIG1lbXNldChtVGltZVN0YW1wcywgMCwgc2l6ZW9mKG1UaW1lU3RhbXBzKSk7CiAgICAgbWVtc2V0KG1UaW1lU3RhbXBzVmFsaWQsIDAsIHNpemVvZihtVGltZVN0YW1wc1ZhbGlkKSk7CiAKQEAgLTMwNCw3ICszMDQsNiBAQAogfQogCiBzdGF0dXNfdCBTb2Z0QVZDOjpkZUluaXREZWNvZGVyKCkgewotICAgIHNpemVfdCBpOwogICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1czsKIAogICAgIGlmIChtQ29kZWNDdHgpIHsKQEAgLTMzNCw2ICszMzMsNyBAQAogICAgIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6Om9uUmVzZXQoKTsKIAogICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1JbnB1dE9mZnNldCA9IDA7CiAgICAgcmVzZXREZWNvZGVyKCk7CiAgICAgcmVzZXRQbHVnaW4oKTsKIH0KQEAgLTQ1MCw3ICs0NTAsNiBAQAogICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjX2lwOwogICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjX29wOwogICAgICAgICAgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzOwotICAgICAgICAgICAgc2l6ZV90IHNpemVZLCBzaXplVVY7CiAKICAgICAgICAgICAgIHNldERlY29kZUFyZ3MoJnNfZGVjX2lwLCAmc19kZWNfb3AsIE5VTEwsIE5VTEwsIDApOwogCkBAIC00NjUsNyArNDY0LDggQEAKICAgICAgICAgICAgIGZyZWUobUZsdXNoT3V0QnVmZmVyKTsKICAgICAgICAgICAgIG1GbHVzaE91dEJ1ZmZlciA9IE5VTEw7CiAgICAgICAgIH0KLQorICAgIH0gZWxzZSB7CisgICAgICAgIG1JbnB1dE9mZnNldCA9IDA7CiAgICAgfQogfQogCkBAIC01NjEsNyArNTYxLDYgQEAKICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY19pcDsKICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY19vcDsKICAgICAgICAgICAgIG5zZWNzX3QgdGltZURlbGF5LCB0aW1lVGFrZW47Ci0gICAgICAgICAgICBzaXplX3Qgc2l6ZVksIHNpemVVVjsKIAogICAgICAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKCZzX2RlY19pcCwgJnNfZGVjX29wLCBpbkhlYWRlciwgb3V0SGVhZGVyLCB0aW1lU3RhbXBJeCkpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiRGVjb2RlciBhcmcgc2V0dXAgZmFpbGVkIik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL2V4cG9ydHMubGRzIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9leHBvcnRzLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjRmM2ZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9leHBvcnRzLmxkcwpAQCAtMCwwICsxLDUgQEAKK3sKKyAgICBnbG9iYWw6CisgICAgICAgIF9aMjJjcmVhdGVTb2Z0T01YQ29tcG9uZW50UEtjUEsxNk9NWF9DQUxMQkFDS1RZUEVQdlBQMTdPTVhfQ09NUE9ORU5UVFlQRTsKKyAgICBsb2NhbDogKjsKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL0FuZHJvaWQuYnAKaW5kZXggNjY1MDdhNy4uY2VmZTc3YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvQW5kcm9pZC5icApAQCAtMTcsNyArMTcsNyBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCkBAIC0zMyw2ICszMywxNCBAQAogICAgICAgICB9LAogICAgIH0sCiAKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVduby11bnVzZWQtdmFyaWFibGUiLAorICAgIF0sCiAgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdLAorCisgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCisKICAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5jcHAKaW5kZXggMzJmZGJkMy4uMzc5ZDQxZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuY3BwCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+CiAjaW5jbHVkZSA8T01YX1ZpZGVvRXh0Lmg+CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvZXhwb3J0cy5sZHMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNGYzZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL2V4cG9ydHMubGRzCkBAIC0wLDAgKzEsNSBAQAoreworICAgIGdsb2JhbDoKKyAgICAgICAgX1oyMmNyZWF0ZVNvZnRPTVhDb21wb25lbnRQS2NQSzE2T01YX0NBTExCQUNLVFlQRVB2UFAxN09NWF9DT01QT05FTlRUWVBFOworICAgIGxvY2FsOiAqOworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL0FuZHJvaWQuYnAKaW5kZXggNTk1Y2ZkYi4uOWFmMDg2YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL0FuZHJvaWQuYnAKQEAgLTE4LDYgKzE4LDggQEAKIAogICAgIGNmbGFnczogWyItV2Vycm9yIl0sCiAKKyAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKKwogICAgIHNhbml0aXplOiB7CiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmNwcAppbmRleCA0YWIxYWIyLi4yYzBmMjI0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmNwcApAQCAtNDUsOSArNDUsMTEgQEAKICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpCiAgICAgOiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50KG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KSwKICAgICAgIG1GTEFDRGVjb2RlcihOVUxMKSwKLSAgICAgIG1IYXNTdHJlYW1JbmZvKGZhbHNlKSwKICAgICAgIG1JbnB1dEJ1ZmZlckNvdW50KDApLAorICAgICAgbUhhc1N0cmVhbUluZm8oZmFsc2UpLAogICAgICAgbVNpZ25hbGxlZEVycm9yKGZhbHNlKSwKKyAgICAgIG1TYXdJbnB1dEVPUyhmYWxzZSksCisgICAgICBtRmluaXNoZWREZWNvZGVyKGZhbHNlKSwKICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UoTk9ORSkgewogICAgIEFMT0dWKCJjdG9yOiIpOwogICAgIG1lbXNldCgmbVN0cmVhbUluZm8sIDAsIHNpemVvZihtU3RyZWFtSW5mbykpOwpAQCAtNTcsNiArNTksNyBAQAogCiBTb2Z0RmxhY0RlY29kZXI6On5Tb2Z0RmxhY0RlY29kZXIoKSB7CiAgICAgQUxPR1YoImR0b3I6Iik7CisgICAgZGVsZXRlIG1GTEFDRGVjb2RlcjsKIH0KIAogdm9pZCBTb2Z0RmxhY0RlY29kZXI6OmluaXRQb3J0cygpIHsKQEAgLTI5MSw3ICsyOTQsNiBAQAogfQogCiB2b2lkIFNvZnRGbGFjRGVjb2Rlcjo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIC8qIHBvcnRJbmRleCAqLykgewotICAgIEFMT0dWKCJvblF1ZXVlRmlsbGVkOiIpOwogICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSAhPSBOT05FKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0yOTksOTYgKzMwMSwxMTQgQEAKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoMCk7CiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZSgxKTsKIAotICAgIHdoaWxlICghaW5RdWV1ZS5lbXB0eSgpICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKKyAgICBBTE9HVigib25RdWV1ZUZpbGxlZCAlZC8lZDoiLCBpblF1ZXVlLmVtcHR5KCksIG91dFF1ZXVlLmVtcHR5KCkpOworICAgIHdoaWxlICgoIWluUXVldWUuZW1wdHkoKSB8fCBtU2F3SW5wdXRFT1MpICYmICFvdXRRdWV1ZS5lbXB0eSgpICYmICFtRmluaXNoZWREZWNvZGVyKSB7CiAgICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7Ci0gICAgICAgIHVpbnQ4X3QqIGluQnVmZmVyID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKLSAgICAgICAgdWludDMyX3QgaW5CdWZmZXJMZW5ndGggPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKLSAgICAgICAgYm9vbCBlbmRPZklucHV0ID0gKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpICE9IDA7CisgICAgICAgIHNob3J0ICpvdXRCdWZmZXIgPSByZWludGVycHJldF9jYXN0PHNob3J0ICo+KG91dEhlYWRlci0+cEJ1ZmZlciArIG91dEhlYWRlci0+bk9mZnNldCk7CisgICAgICAgIHNpemVfdCBvdXRCdWZmZXJTaXplID0gb3V0SGVhZGVyLT5uQWxsb2NMZW4gLSBvdXRIZWFkZXItPm5PZmZzZXQ7CisgICAgICAgIGludDY0X3QgdGltZVN0YW1wID0gMDsKIAotICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPT0gMCkgewotICAgICAgICAgICAgaWYgKGVuZE9mSW5wdXQpIHsKLSAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOwotICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOwotICAgICAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgib25RdWV1ZUZpbGxlZDogZW1wdHlJbnB1dEJ1ZmZlciByZWNlaXZlZCIpOworICAgICAgICBpZiAoIWluUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgQnVmZmVySW5mbyAqaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKKyAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKKyAgICAgICAgICAgIHVpbnQ4X3QqIGluQnVmZmVyID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgICAgIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoID0gaW5IZWFkZXItPm5GaWxsZWRMZW47CisgICAgICAgICAgICBBTE9HVigiaW5wdXQ6ICV1IGJ5dGVzIiwgaW5CdWZmZXJMZW5ndGgpOworICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigic2F3IEVPUyIpOworICAgICAgICAgICAgICAgIG1TYXdJbnB1dEVPUyA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDAgJiYgaW5IZWFkZXItPm5GaWxsZWRMZW4gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBidWZmZXIgd2FzIGVtcHR5IGFuZCBFT1M6IHNpZ25hbCBFT1Mgb24gb3V0cHV0IGFuZCByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImVtcHR5IGZpcnN0IEVPUyIpOworICAgICAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOworICAgICAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKKyAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgICAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgICAgICAgICAgICAgIG1GaW5pc2hlZERlY29kZXIgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAwICYmICEoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSkgewotICAgICAgICAgICAgQUxPR0UoIm9uUXVldWVGaWxsZWQ6IGZpcnN0IGJ1ZmZlciBzaG91bGQgaGF2ZSBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRyBzZXQiKTsKLSAgICAgICAgICAgIGluSGVhZGVyLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUc7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcpICE9IDApIHsKLSAgICAgICAgICAgIHN0YXR1c190IGRlY29kZXJFcnIgPSBtRkxBQ0RlY29kZXItPnBhcnNlTWV0YWRhdGEoaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoKTsKLSAgICAgICAgICAgIG1JbnB1dEJ1ZmZlckNvdW50Kys7CiAKLSAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyICE9IE9LICYmIGRlY29kZXJFcnIgIT0gV09VTERfQkxPQ0spIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgib25RdWV1ZUZpbGxlZDogRkxBQ0RlY29kZXIgcGFyc2VNZXRhRGF0YSByZXR1cm5zIGVycm9yICVkIiwgZGVjb2RlckVycik7CisgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMCAmJiAhKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgib25RdWV1ZUZpbGxlZDogZmlyc3QgYnVmZmVyIHNob3VsZCBoYXZlIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHIHNldCIpOworICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykgIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJyZWNlaXZlZCBjb25maWcgYnVmZmVyIG9mIHNpemUgJXUiLCBpbkJ1ZmZlckxlbmd0aCk7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZGVjb2RlckVyciA9IG1GTEFDRGVjb2Rlci0+cGFyc2VNZXRhZGF0YShpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgpOworICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlckNvdW50Kys7CisKKyAgICAgICAgICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBPSyAmJiBkZWNvZGVyRXJyICE9IFdPVUxEX0JMT0NLKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJvblF1ZXVlRmlsbGVkOiBGTEFDRGVjb2RlciBwYXJzZU1ldGFEYXRhIHJldHVybnMgZXJyb3IgJWQiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JTdHJlYW1Db3JydXB0LCBkZWNvZGVyRXJyLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworCisgICAgICAgICAgICAgICAgaWYgKGRlY29kZXJFcnIgPT0gV09VTERfQkxPQ0spIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvID0gbUZMQUNEZWNvZGVyLT5nZXRTdHJlYW1JbmZvKCk7CisgICAgICAgICAgICAgICAgbUhhc1N0cmVhbUluZm8gPSB0cnVlOworCisgICAgICAgICAgICAgICAgLy8gT25seSBzZW5kIG91dCBwb3J0IHNldHRpbmdzIGNoYW5nZWQgZXZlbnQgaWYgYm90aCBzYW1wbGUgcmF0ZQorICAgICAgICAgICAgICAgIC8vIGFuZCBudW1DaGFubmVscyBhcmUgdmFsaWQuCisgICAgICAgICAgICAgICAgaWYgKG1TdHJlYW1JbmZvLnNhbXBsZV9yYXRlICYmIG1TdHJlYW1JbmZvLmNoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJvblF1ZXVlRmlsbGVkOiBpbml0aWFsbHkgY29uZmlndXJpbmcgZGVjb2RlcjogJWQgSHosICVkIGNoYW5uZWxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLnNhbXBsZV9yYXRlLCBtU3RyZWFtSW5mby5jaGFubmVscyk7CisKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdHVzX3QgZGVjb2RlckVyciA9IG1GTEFDRGVjb2Rlci0+ZGVjb2RlT25lRnJhbWUoCisgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyLCBpbkJ1ZmZlckxlbmd0aCwgb3V0QnVmZmVyLCAmb3V0QnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJvblF1ZXVlRmlsbGVkOiBGTEFDRGVjb2RlciBkZWNvZGVPbmVGcmFtZSByZXR1cm5zIGVycm9yICVkIiwgZGVjb2RlckVycik7CiAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclN0cmVhbUNvcnJ1cHQsIGRlY29kZXJFcnIsIE5VTEwpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgbUlucHV0QnVmZmVyQ291bnQrKzsKKyAgICAgICAgICAgIHRpbWVTdGFtcCA9IGluSGVhZGVyLT5uVGltZVN0YW1wOwogICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CiAgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CiAgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOwogCi0gICAgICAgICAgICBpZiAoZGVjb2RlckVyciA9PSBXT1VMRF9CTE9DSykgeworICAgICAgICAgICAgaWYgKG91dEJ1ZmZlclNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJubyBvdXRwdXQsIHRyeWluZyBhZ2FpbiIpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbVN0cmVhbUluZm8gPSBtRkxBQ0RlY29kZXItPmdldFN0cmVhbUluZm8oKTsKLSAgICAgICAgICAgIG1IYXNTdHJlYW1JbmZvID0gdHJ1ZTsKLQotICAgICAgICAgICAgLy8gT25seSBzZW5kIG91dCBwb3J0IHNldHRpbmdzIGNoYW5nZWQgZXZlbnQgaWYgYm90aCBzYW1wbGUgcmF0ZQotICAgICAgICAgICAgLy8gYW5kIG51bUNoYW5uZWxzIGFyZSB2YWxpZC4KLSAgICAgICAgICAgIGlmIChtU3RyZWFtSW5mby5zYW1wbGVfcmF0ZSAmJiBtU3RyZWFtSW5mby5jaGFubmVscykgewotICAgICAgICAgICAgICAgIEFMT0dEKCJvblF1ZXVlRmlsbGVkOiBpbml0aWFsbHkgY29uZmlndXJpbmcgZGVjb2RlcjogJWQgSHosICVkIGNoYW5uZWxzIiwKLSAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUluZm8uc2FtcGxlX3JhdGUsIG1TdHJlYW1JbmZvLmNoYW5uZWxzKTsKLQotICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAxLCAwLCBOVUxMKTsKLSAgICAgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7CisgICAgICAgIH0gZWxzZSBpZiAobVNhd0lucHV0RU9TKSB7CisgICAgICAgICAgICBzdGF0dXNfdCBkZWNvZGVyRXJyID0gbUZMQUNEZWNvZGVyLT5kZWNvZGVPbmVGcmFtZShOVUxMLCAwLCBvdXRCdWZmZXIsICZvdXRCdWZmZXJTaXplKTsKKyAgICAgICAgICAgIG1GaW5pc2hlZERlY29kZXIgPSB0cnVlOworICAgICAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgib25RdWV1ZUZpbGxlZDogRkxBQ0RlY29kZXIgZmluaXNoIHJldHVybnMgZXJyb3IgJWQiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yU3RyZWFtQ29ycnVwdCwgZGVjb2RlckVyciwgTlVMTCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgc2hvcnQgKm91dEJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxzaG9ydCAqPihvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQpOwotICAgICAgICBzaXplX3Qgb3V0QnVmZmVyU2l6ZSA9IG91dEhlYWRlci0+bkFsbG9jTGVuIC0gb3V0SGVhZGVyLT5uT2Zmc2V0OwotCi0gICAgICAgIHN0YXR1c190IGRlY29kZXJFcnIgPSBtRkxBQ0RlY29kZXItPmRlY29kZU9uZUZyYW1lKAotICAgICAgICAgICAgICAgIGluQnVmZmVyLCBpbkJ1ZmZlckxlbmd0aCwgb3V0QnVmZmVyLCAmb3V0QnVmZmVyU2l6ZSk7Ci0gICAgICAgIGlmIChkZWNvZGVyRXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgib25RdWV1ZUZpbGxlZDogRkxBQ0RlY29kZXIgZGVjb2RlT25lRnJhbWUgcmV0dXJucyBlcnJvciAlZCIsIGRlY29kZXJFcnIpOwotICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yU3RyZWFtQ29ycnVwdCwgZGVjb2RlckVyciwgTlVMTCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtSW5wdXRCdWZmZXJDb3VudCsrOwotICAgICAgICBpbnQ2NF90IHRzID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7Ci0gICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7Ci0KLSAgICAgICAgaWYgKGVuZE9mSW5wdXQpIHsKICAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOwotICAgICAgICB9IGVsc2UgaWYgKG91dEJ1ZmZlclNpemUgPT0gMCkgewotICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CisgICAgICAgICAgICAvLyBubyBtb3JlIGlucHV0IGJ1ZmZlcnMgYXQgdGhpcyB0aW1lLCBsb29wIGFuZCBzZWUgaWYgdGhlcmUgaXMgbW9yZSBvdXRwdXQKKyAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gb3V0QnVmZmVyU2l6ZTsKLSAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gdHM7CisgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IHRpbWVTdGFtcDsKIAogICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CiAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOwpAQCAtNDA1LDkgKzQyNSwxMiBAQAogCiB2b2lkIFNvZnRGbGFjRGVjb2Rlcjo6ZHJhaW5EZWNvZGVyKCkgewogICAgIG1GTEFDRGVjb2Rlci0+Zmx1c2goKTsKKyAgICBtU2F3SW5wdXRFT1MgPSBmYWxzZTsKKyAgICBtRmluaXNoZWREZWNvZGVyID0gZmFsc2U7CiB9CiAKIHZvaWQgU29mdEZsYWNEZWNvZGVyOjpvblJlc2V0KCkgeworICAgIEFMT0dWKCJvblJlc2V0Iik7CiAgICAgZHJhaW5EZWNvZGVyKCk7CiAKICAgICBtZW1zZXQoJm1TdHJlYW1JbmZvLCAwLCBzaXplb2YobVN0cmVhbUluZm8pKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuaAppbmRleCA0YTIxYzM0Li5iNjNmN2FkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5oCkBAIC01MCwxMSArNTAsMTMgQEAKICAgICAgICAga051bU91dHB1dEJ1ZmZlcnMgID0gNCwKICAgICB9OwogCi0gICAgc3A8RkxBQ0RlY29kZXI+IG1GTEFDRGVjb2RlcjsKKyAgICBGTEFDRGVjb2RlciAqbUZMQUNEZWNvZGVyOwogICAgIEZMQUNfX1N0cmVhbU1ldGFkYXRhX1N0cmVhbUluZm8gbVN0cmVhbUluZm87Ci0gICAgYm9vbCBtSGFzU3RyZWFtSW5mbzsKICAgICBzaXplX3QgbUlucHV0QnVmZmVyQ291bnQ7CisgICAgYm9vbCBtSGFzU3RyZWFtSW5mbzsKICAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1TYXdJbnB1dEVPUzsKKyAgICBib29sIG1GaW5pc2hlZERlY29kZXI7CiAKICAgICBlbnVtIHsKICAgICAgICAgTk9ORSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9leHBvcnRzLmxkcyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9leHBvcnRzLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjRmM2ZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL2V4cG9ydHMubGRzCkBAIC0wLDAgKzEsNSBAQAoreworICAgIGdsb2JhbDoKKyAgICAgICAgX1oyMmNyZWF0ZVNvZnRPTVhDb21wb25lbnRQS2NQSzE2T01YX0NBTExCQUNLVFlQRVB2UFAxN09NWF9DT01QT05FTlRUWVBFOworICAgIGxvY2FsOiAqOworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL0FuZHJvaWQuYnAKaW5kZXggMDY2OTE3Yi4uNDZiOTc0ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL0FuZHJvaWQuYnAKQEAgLTEwLDYgKzEwLDggQEAKIAogICAgIGNmbGFnczogWyItV2Vycm9yIl0sCiAKKyAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKKwogICAgIHNhbml0aXplOiB7CiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLApAQCAtMjIsNyArMjQsNiBAQAogICAgIH0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibWVkaWFfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5jcHAKaW5kZXggNTZkMmQ2OS4uZmRjODk3NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5jcHAKQEAgLTU2LDEyICs1NiwxMyBAQAogICAgICAgbUNvbXByZXNzaW9uTGV2ZWwoRkxBQ19DT01QUkVTU0lPTl9MRVZFTF9ERUZBVUxUKSwKICAgICAgIG1FbmNvZGVyV3JpdGVEYXRhKGZhbHNlKSwKICAgICAgIG1FbmNvZGVyUmV0dXJuZWRFbmNvZGVkRGF0YShmYWxzZSksCisgICAgICBtU2F3SW5wdXRFT1MoZmFsc2UpLAorICAgICAgbVNlbnRPdXRwdXRFT1MoZmFsc2UpLAogICAgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMoMCksCi0gICAgICBtSW5wdXRCdWZmZXJQY20zMihOVUxMKQotI2lmZGVmIFdSSVRFX0ZMQUNfSEVBREVSX0lOX0ZJUlNUX0JVRkZFUgotICAgICAgLCBtSGVhZGVyT2Zmc2V0KDApCi0gICAgICAsIG1Xcm90ZUhlYWRlcihmYWxzZSkKLSNlbmRpZgorICAgICAgbUlucHV0QnVmZmVyUGNtMzIoTlVMTCksCisgICAgICBtSGVhZGVyT2Zmc2V0KDApLAorICAgICAgbUhlYWRlckNvbXBsZXRlKGZhbHNlKSwKKyAgICAgIG1Xcm90ZUhlYWRlcihmYWxzZSkKIHsKICAgICBBTE9HVigiU29mdEZsYWNFbmNvZGVyOjpTb2Z0RmxhY0VuY29kZXIobmFtZT0lcykiLCBuYW1lKTsKICAgICBpbml0UG9ydHMoKTsKQEAgLTM1NCw1NSArMzU1LDU1IEBACiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOwogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7CiAKLSAgICB3aGlsZSAoIWluUXVldWUuZW1wdHkoKSAmJiAhb3V0UXVldWUuZW1wdHkoKSkgewotICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOwotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisgICAgRkxBQ19fYm9vbCBvayA9IHRydWU7CisKKyAgICB3aGlsZSAoKCFpblF1ZXVlLmVtcHR5KCkgfHwgbVNhd0lucHV0RU9TKSAmJiAhb3V0UXVldWUuZW1wdHkoKSAmJiAhbVNlbnRPdXRwdXRFT1MpIHsKKyAgICAgICAgaWYgKCFpblF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CisKKyAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInNhdyBFT1Mgb24gYnVmZmVyIG9mIHNpemUgJXUiLCBpbkhlYWRlci0+bkZpbGxlZExlbik7CisgICAgICAgICAgICAgICAgbVNhd0lucHV0RU9TID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuID4ga01heElucHV0QnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBidWZmZXIgdG9vIGxhcmdlICglZCkuIiwgaW5IZWFkZXItPm5GaWxsZWRMZW4pOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXNzZXJ0KG1OdW1DaGFubmVscyAhPSAwKTsKKyAgICAgICAgICAgIG1FbmNvZGVyV3JpdGVEYXRhID0gdHJ1ZTsKKyAgICAgICAgICAgIG1FbmNvZGVyUmV0dXJuZWRFbmNvZGVkRGF0YSA9IGZhbHNlOworICAgICAgICAgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgPSAwOworICAgICAgICAgICAgbUN1cnJlbnRJbnB1dFRpbWVTdGFtcCA9IGluSGVhZGVyLT5uVGltZVN0YW1wOworCisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBuYklucHV0RnJhbWVzID0gaW5IZWFkZXItPm5GaWxsZWRMZW4gLyAoMiAqIG1OdW1DaGFubmVscyk7CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBuYklucHV0U2FtcGxlcyA9IGluSGVhZGVyLT5uRmlsbGVkTGVuIC8gMjsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9TMTYgKiBjb25zdCBwY20xNiA9IHJlaW50ZXJwcmV0X2Nhc3Q8T01YX1MxNiAqPihpbkhlYWRlci0+cEJ1ZmZlcik7CisKKyAgICAgICAgICAgIENIRUNLX0xFKG5iSW5wdXRTYW1wbGVzLCAyICoga01heE51bVNhbXBsZXNQZXJGcmFtZSk7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGk9MCA7IGkgPCBuYklucHV0U2FtcGxlcyA7IGkrKykgeworICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlclBjbTMyW2ldID0gKEZMQUNfX2ludDMyKSBwY20xNltpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCIgYWJvdXQgdG8gZW5jb2RlICV1IHNhbXBsZXMgcGVyIGNoYW5uZWwiLCBuYklucHV0RnJhbWVzKTsKKyAgICAgICAgICAgIG9rID0gRkxBQ19fc3RyZWFtX2VuY29kZXJfcHJvY2Vzc19pbnRlcmxlYXZlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmxhY1N0cmVhbUVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyUGNtMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJJbnB1dEZyYW1lcyAvKnNhbXBsZXMgcGVyIGNoYW5uZWwqLyApOworCisgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIGluSW5mbyA9IE5VTEw7CisgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICAgICAgaW5IZWFkZXIgPSBOVUxMOworICAgICAgICB9CiAKICAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOwogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKIAotICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgewotICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwotICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOwotCi0gICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOwotICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7Ci0KLSAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOwotICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuID4ga01heElucHV0QnVmZmVyU2l6ZSkgewotICAgICAgICAgICAgQUxPR0UoImlucHV0IGJ1ZmZlciB0b28gbGFyZ2UgKCVkKS4iLCBpbkhlYWRlci0+bkZpbGxlZExlbik7Ci0gICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0KG1OdW1DaGFubmVscyAhPSAwKTsKLSAgICAgICAgbUVuY29kZXJXcml0ZURhdGEgPSB0cnVlOwotICAgICAgICBtRW5jb2RlclJldHVybmVkRW5jb2RlZERhdGEgPSBmYWxzZTsKLSAgICAgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgPSAwOwotICAgICAgICBtQ3VycmVudElucHV0VGltZVN0YW1wID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7Ci0KLSAgICAgICAgY29uc3QgdW5zaWduZWQgbmJJbnB1dEZyYW1lcyA9IGluSGVhZGVyLT5uRmlsbGVkTGVuIC8gKDIgKiBtTnVtQ2hhbm5lbHMpOwotICAgICAgICBjb25zdCB1bnNpZ25lZCBuYklucHV0U2FtcGxlcyA9IGluSGVhZGVyLT5uRmlsbGVkTGVuIC8gMjsKLSAgICAgICAgY29uc3QgT01YX1MxNiAqIGNvbnN0IHBjbTE2ID0gcmVpbnRlcnByZXRfY2FzdDxPTVhfUzE2ICo+KGluSGVhZGVyLT5wQnVmZmVyKTsKLQotICAgICAgICBDSEVDS19MRShuYklucHV0U2FtcGxlcywgMiAqIGtNYXhOdW1TYW1wbGVzUGVyRnJhbWUpOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGk9MCA7IGkgPCBuYklucHV0U2FtcGxlcyA7IGkrKykgewotICAgICAgICAgICAgbUlucHV0QnVmZmVyUGNtMzJbaV0gPSAoRkxBQ19faW50MzIpIHBjbTE2W2ldOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCIgYWJvdXQgdG8gZW5jb2RlICV1IHNhbXBsZXMgcGVyIGNoYW5uZWwiLCBuYklucHV0RnJhbWVzKTsKLSAgICAgICAgRkxBQ19fYm9vbCBvayA9IEZMQUNfX3N0cmVhbV9lbmNvZGVyX3Byb2Nlc3NfaW50ZXJsZWF2ZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICBtRmxhY1N0cmVhbUVuY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXJQY20zMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5iSW5wdXRGcmFtZXMgLypzYW1wbGVzIHBlciBjaGFubmVsKi8gKTsKLQogICAgICAgICBpZiAob2spIHsKICAgICAgICAgICAgIGlmIChtRW5jb2RlclJldHVybmVkRW5jb2RlZERhdGEgJiYgKG1FbmNvZGVyUmV0dXJuZWROYkJ5dGVzICE9IDApKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIiBkZXF1ZXVlaW5nIGJ1ZmZlciBvbiBvdXRwdXQgcG9ydCBhZnRlciB3cml0aW5nIGRhdGEiKTsKQEAgLTQxNCw2ICs0MTUsMjEgQEAKICAgICAgICAgICAgICAgICBtRW5jb2RlclJldHVybmVkRW5jb2RlZERhdGEgPSBmYWxzZTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIiBlbmNvZGVyIHByb2Nlc3NfaW50ZXJsZWF2ZWQgcmV0dXJuZWQgd2l0aG91dCBkYXRhIHRvIHdyaXRlIik7CisgICAgICAgICAgICAgICAgaWYgKG1TYXdJbnB1dEVPUykgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiZmluaXNoaW5nIGVuY29kZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgbVNlbnRPdXRwdXRFT1MgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBGTEFDX19zdHJlYW1fZW5jb2Rlcl9maW5pc2gobUZsYWNTdHJlYW1FbmNvZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1FbmNvZGVyUmV0dXJuZWRFbmNvZGVkRGF0YSAmJiAobUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgIT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIgZGVxdWV1ZWluZyByZXNpZHVhbCBidWZmZXIgb24gb3V0cHV0IHBvcnQgYWZ0ZXIgd3JpdGluZyBkYXRhIik7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dEluZm8gPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0SGVhZGVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1FbmNvZGVyUmV0dXJuZWRFbmNvZGVkRGF0YSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR0UoIiBlcnJvciBlbmNvdW50ZXJlZCBkdXJpbmcgZW5jb2RpbmciKTsKQEAgLTQyMiwxMSArNDM4LDYgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgIGluSW5mbyA9IE5VTEw7Ci0gICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7Ci0gICAgICAgIGluSGVhZGVyID0gTlVMTDsKICAgICB9CiB9CiAKQEAgLTQzOCwxNiArNDQ5LDIyIEBACiAgICAgQUxPR1YoIlNvZnRGbGFjRW5jb2Rlcjo6b25FbmNvZGVkRmxhY0F2YWlsYWJsZShieXRlcz0lenUsIHNhbXBsZXM9JXUsIGN1cnJfZnJhbWU9JXUpIiwKICAgICAgICAgICAgIGJ5dGVzLCBzYW1wbGVzLCBjdXJyZW50X2ZyYW1lKTsKIAotI2lmZGVmIFdSSVRFX0ZMQUNfSEVBREVSX0lOX0ZJUlNUX0JVRkZFUgogICAgIGlmIChzYW1wbGVzID09IDApIHsKLSAgICAgICAgQUxPR0koIiBzYXZpbmcgJXp1IGJ5dGVzIG9mIGhlYWRlciIsIGJ5dGVzKTsKLSAgICAgICAgbWVtY3B5KG1IZWFkZXIgKyBtSGVhZGVyT2Zmc2V0LCBidWZmZXIsIGJ5dGVzKTsKLSAgICAgICAgbUhlYWRlck9mZnNldCArPSBieXRlczsvLyB3aWxsIGNvbnRhaW4gaGVhZGVyIHNpemUgd2hlbiBmaW5pc2hlZCByZWNlaXZpbmcgaGVhZGVyCisgICAgICAgIEFMT0dWKCJzYXZpbmcgJXp1IGJ5dGVzIG9mIGhlYWRlciIsIGJ5dGVzKTsKKyAgICAgICAgaWYgKG1IZWFkZXJPZmZzZXQgKyBieXRlcyA+IHNpemVvZihtSGVhZGVyKSB8fCBtSGVhZGVyQ29tcGxldGUpIHsKKyAgICAgICAgICAgIEFMT0dXKCJoZWFkZXIgaXMgdG9vIGJpZywgb3IgaGVhZGVyIGFscmVhZHkgcmVjZWl2ZWQiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkobUhlYWRlciArIG1IZWFkZXJPZmZzZXQsIGJ1ZmZlciwgYnl0ZXMpOworICAgICAgICAgICAgbUhlYWRlck9mZnNldCArPSBieXRlczsvLyB3aWxsIGNvbnRhaW4gaGVhZGVyIHNpemUgd2hlbiBmaW5pc2hlZCByZWNlaXZpbmcgaGVhZGVyCisgICAgICAgICAgICBpZiAoYnVmZmVyWzBdICYgMHg4MCkgeworICAgICAgICAgICAgICAgIG1IZWFkZXJDb21wbGV0ZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9FTkNPREVSX1dSSVRFX1NUQVRVU19PSzsKICAgICB9CiAKLSNlbmRpZgotCiAgICAgaWYgKChzYW1wbGVzID09IDApIHx8ICFtRW5jb2RlcldyaXRlRGF0YSkgewogICAgICAgICAvLyBjYWxsZWQgYnkgdGhlIGVuY29kZXIgYmVjYXVzZSB0aGVyZSdzIGhlYWRlciBkYXRhIHRvIHNhdmUsIGJ1dCBpdCdzIG5vdCB0aGUgcm9sZQogICAgICAgICAvLyBvZiB0aGlzIGNvbXBvbmVudCAodW5sZXNzIFdSSVRFX0ZMQUNfSEVBREVSX0lOX0ZJUlNUX0JVRkZFUiBpcyBkZWZpbmVkKQpAQCAtNDYwLDE2ICs0NzcsMjMgQEAKICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CiAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CiAKLSNpZmRlZiBXUklURV9GTEFDX0hFQURFUl9JTl9GSVJTVF9CVUZGRVIKLSAgICBpZiAoIW1Xcm90ZUhlYWRlcikgewotICAgICAgICBBTE9HSSgiIHdyaXRpbmcgJWQgYnl0ZXMgb2YgaGVhZGVyIG9uIG91dHB1dCBwb3J0IiwgbUhlYWRlck9mZnNldCk7CisgICAgaWYgKG1IZWFkZXJDb21wbGV0ZSAmJiAhbVdyb3RlSGVhZGVyKSB7CisgICAgICAgIEFMT0dWKCIgd3JpdGluZyAlZCBieXRlcyBvZiBoZWFkZXIgb24gb3V0cHV0IHBvcnQiLCBtSGVhZGVyT2Zmc2V0KTsKICAgICAgICAgbWVtY3B5KG91dEhlYWRlci0+cEJ1ZmZlciArIG91dEhlYWRlci0+bk9mZnNldCArIG91dEhlYWRlci0+bkZpbGxlZExlbiwKICAgICAgICAgICAgICAgICBtSGVhZGVyLCBtSGVhZGVyT2Zmc2V0KTsKICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuICs9IG1IZWFkZXJPZmZzZXQ7Ci0gICAgICAgIG91dEhlYWRlci0+bk9mZnNldCAgICArPSBtSGVhZGVyT2Zmc2V0OwogICAgICAgICBtV3JvdGVIZWFkZXIgPSB0cnVlOworICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHOworICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOworICAgICAgICBvdXRJbmZvID0gTlVMTDsKKyAgICAgICAgb3V0SGVhZGVyID0gTlVMTDsKKyAgICAgICAgLy8gZ2V0IHRoZSBuZXh0IGJ1ZmZlciBmb3IgdGhlIHJlc3Qgb2YgdGhlIGRhdGEKKyAgICAgICAgQ0hFQ0soIW91dFF1ZXVlLmVtcHR5KCkpOworICAgICAgICBvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CisgICAgICAgIG91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CiAgICAgfQotI2VuZGlmCiAKICAgICAvLyB3cml0ZSBlbmNvZGVkIGRhdGEKICAgICBBTE9HVigiIHdyaXRpbmcgJXp1IGJ5dGVzIG9mIGVuY29kZWQgZGF0YSBvbiBvdXRwdXQgcG9ydCIsIGJ5dGVzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuaAppbmRleCBmNGYwNjU1Li42NGE2YjFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5oCkBAIC0yMiwxMCArMjIsNiBAQAogCiAjaW5jbHVkZSAiRkxBQy9zdHJlYW1fZW5jb2Rlci5oIgogCi0vLyB1c2UgdGhpcyBzeW1ib2wgdG8gaGF2ZSB0aGUgZmlyc3Qgb3V0cHV0IGJ1ZmZlciBzdGFydCB3aXRoIEZMQUMgZnJhbWUgaGVhZGVyIHNvIGEgZHVtcCBvZgotLy8gYWxsIHRoZSBvdXRwdXQgYnVmZmVycyBjYW4gYmUgb3BlbmVkIGFzIGEgLmZsYWMgZmlsZQotLy8jZGVmaW5lIFdSSVRFX0ZMQUNfSEVBREVSX0lOX0ZJUlNUX0JVRkZFUgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBTb2Z0RmxhY0VuY29kZXIgOiBwdWJsaWMgU2ltcGxlU29mdE9NWENvbXBvbmVudCB7CkBAIC02Miw2ICs1OCw4IEBACiAgICAgLy8gc2hvdWxkIHRoZSBkYXRhIHJlY2VpdmVkIGJ5IHRoZSBjYWxsYmFjayBiZSB3cml0dGVuIHRvIHRoZSBvdXRwdXQgcG9ydAogICAgIGJvb2wgICAgICAgIG1FbmNvZGVyV3JpdGVEYXRhOwogICAgIGJvb2wgICAgICAgIG1FbmNvZGVyUmV0dXJuZWRFbmNvZGVkRGF0YTsKKyAgICBib29sICAgICAgICBtU2F3SW5wdXRFT1M7CisgICAgYm9vbCAgICAgICAgbVNlbnRPdXRwdXRFT1M7CiAgICAgc2l6ZV90ICAgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXM7CiAgICAgT01YX1RJQ0tTICBtQ3VycmVudElucHV0VGltZVN0YW1wOwogCkBAIC04NSwxMSArODMsMTAgQEAKICAgICAvLyBiZWZvcmUgcGFzc2luZyB0aGUgaW5wdXQgZGF0YSB0byB0aGUgZW5jb2RlcgogICAgIEZMQUNfX2ludDMyKiBtSW5wdXRCdWZmZXJQY20zMjsKIAotI2lmZGVmIFdSSVRFX0ZMQUNfSEVBREVSX0lOX0ZJUlNUX0JVRkZFUgogICAgIHVuc2lnbmVkIG1IZWFkZXJPZmZzZXQ7CisgICAgYm9vbCBtSGVhZGVyQ29tcGxldGU7CiAgICAgYm9vbCBtV3JvdGVIZWFkZXI7CiAgICAgY2hhciBtSGVhZGVyWzEyOF07Ci0jZW5kaWYKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRGbGFjRW5jb2Rlcik7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL2V4cG9ydHMubGRzIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNGYzZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvZXhwb3J0cy5sZHMKQEAgLTAsMCArMSw1IEBACit7CisgICAgZ2xvYmFsOgorICAgICAgICBfWjIyY3JlYXRlU29mdE9NWENvbXBvbmVudFBLY1BLMTZPTVhfQ0FMTEJBQ0tUWVBFUHZQUDE3T01YX0NPTVBPTkVOVFRZUEU7CisgICAgbG9jYWw6ICo7Cit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5icAppbmRleCBmZmY3MmE4Li4zZDk3ZDhjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5icApAQCAtMTMsNyArMTMsNyBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCkBAIC0yMSw2ICsyMSw4IEBACiAKICAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAogCisgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCisKICAgICBzYW5pdGl6ZTogewogICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9leHBvcnRzLmxkcyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9leHBvcnRzLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjRmM2ZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL2V4cG9ydHMubGRzCkBAIC0wLDAgKzEsNSBAQAoreworICAgIGdsb2JhbDoKKyAgICAgICAgX1oyMmNyZWF0ZVNvZnRPTVhDb21wb25lbnRQS2NQSzE2T01YX0NBTExCQUNLVFlQRVB2UFAxN09NWF9DT01QT05FTlRUWVBFOworICAgIGxvY2FsOiAqOworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9BbmRyb2lkLmJwCmluZGV4IDc1M2VlZWYuLjFjMzIwOGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvQW5kcm9pZC5icApAQCAtMTUsNiArMTUsOCBAQAogCiAgICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKIAorICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAorCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCkBAIC0yNyw3ICsyOSw3IEBACiAgICAgfSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYV9vbXgiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibG9nIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL2V4cG9ydHMubGRzIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvZXhwb3J0cy5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI0ZjNmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL2V4cG9ydHMubGRzCkBAIC0wLDAgKzEsNSBAQAoreworICAgIGdsb2JhbDoKKyAgICAgICAgX1oyMmNyZWF0ZVNvZnRPTVhDb21wb25lbnRQS2NQSzE2T01YX0NBTExCQUNLVFlQRVB2UFAxN09NWF9DT01QT05FTlRUWVBFOworICAgIGxvY2FsOiAqOworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9BbmRyb2lkLmJwCmluZGV4IDdmYTc0ZDQuLjQ1OTIwZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvQW5kcm9pZC5icApAQCAtOCw2ICs4LDE0IEBACiAgICAgc3RhdGljX2xpYnM6IFsibGliaGV2Y2RlYyJdLAogICAgIHNyY3M6IFsiU29mdEhFVkMuY3BwIl0sCiAKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVduby11bnVzZWQtdmFyaWFibGUiLAorICAgIF0sCisKKyAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKKwogICAgIGluY2x1ZGVfZGlyczogWwogICAgICAgICAiZXh0ZXJuYWwvbGliaGV2Yy9kZWNvZGVyIiwKICAgICAgICAgImV4dGVybmFsL2xpYmhldmMvY29tbW9uIiwKQEAgLTI2LDcgKzM0LDYgQEAKICAgICB9LAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5jcHAKaW5kZXggMTAzZmMyMi4uYmI3ZDM2MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvU29mdEhFVkMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmNwcApAQCAtNDgsNyArNDgsOCBAQAogICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKUlIRVZDRF9DWEFfQ01EX0NUTF9TRVRfTlVNX0NPUkVTCiAKIHN0YXRpYyBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCBrUHJvZmlsZUxldmVsc1tdID0gewotICAgIHsgT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsNTEgfSwKKyAgICB7IE9NWF9WSURFT19IRVZDUHJvZmlsZU1haW4sICAgICAgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsNTEgfSwKKyAgICB7IE9NWF9WSURFT19IRVZDUHJvZmlsZU1haW5TdGlsbCwgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsNTEgfSwKIH07CiAKIFNvZnRIRVZDOjpTb2Z0SEVWQygKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL2V4cG9ydHMubGRzIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvZXhwb3J0cy5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI0ZjNmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL2V4cG9ydHMubGRzCkBAIC0wLDAgKzEsNSBAQAoreworICAgIGdsb2JhbDoKKyAgICAgICAgX1oyMmNyZWF0ZVNvZnRPTVhDb21wb25lbnRQS2NQSzE2T01YX0NBTExCQUNLVFlQRVB2UFAxN09NWF9DT01QT05FTlRUWVBFOworICAgIGxvY2FsOiAqOworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5icAppbmRleCAxMjE2YWU1Li5jYTcwY2MyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLmJwCkBAIC01Myw2ICs1Myw4IEBACiAgICAgICAgICItV2Vycm9yIiwKICAgICBdLAogCisgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCisKICAgICBzYW5pdGl6ZTogewogICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKQEAgLTkzLDcgKzk1LDYgQEAKICAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIl0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibWVkaWFfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmNwcAppbmRleCAzOWI2N2FiLi5mZGE3MDI4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuY3BwCkBAIC0zNTMsNyArMzUzLDggQEAKICAgICBib29sIHBvcnRXaWxsUmVzZXQgPSBmYWxzZTsKICAgICBjb25zdCBib29sIGZha2VTdHJpZGUgPSB0cnVlOwogICAgIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OmhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgKLSAgICAgICAgICAgICZwb3J0V2lsbFJlc2V0LCBidWZfd2lkdGgsIGJ1Zl9oZWlnaHQsIGNyb3BTZXR0aW5nc01vZGUsIGZha2VTdHJpZGUpOworICAgICAgICAgICAgJnBvcnRXaWxsUmVzZXQsIGJ1Zl93aWR0aCwgYnVmX2hlaWdodCwKKyAgICAgICAgICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIsIGNyb3BTZXR0aW5nc01vZGUsIGZha2VTdHJpZGUpOwogICAgIGlmIChwb3J0V2lsbFJlc2V0KSB7CiAgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX0gyNjMpIHsKICAgICAgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtSGFuZGxlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvZXhwb3J0cy5sZHMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNGYzZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL2V4cG9ydHMubGRzCkBAIC0wLDAgKzEsNSBAQAoreworICAgIGdsb2JhbDoKKyAgICAgICAgX1oyMmNyZWF0ZVNvZnRPTVhDb21wb25lbnRQS2NQSzE2T01YX0NBTExCQUNLVFlQRVB2UFAxN09NWF9DT01QT05FTlRUWVBFOworICAgIGxvY2FsOiAqOworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5icAppbmRleCA2NDA3MThkLi42YmU0MDM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLmJwCkBAIC00LDggKzQsNyBAQAogCiAgICAgc3JjczogWwogICAgICAgICAic3JjL2JpdHN0cmVhbV9pby5jcHAiLAotICAgICAgICAic3JjL2NvbWJpbmVkX2VuY29kZS5jcHAiLAotICAgICAgICAic3JjL2RhdGFwYXJ0X2VuY29kZS5jcHAiLAorICAgICAgICAic3JjL2NvbWJpbmVkX2VuY29kZS5jcHAiLCAic3JjL2RhdGFwYXJ0X2VuY29kZS5jcHAiLAogICAgICAgICAic3JjL2RjdC5jcHAiLAogICAgICAgICAic3JjL2ZpbmRoYWxmcGVsLmNwcCIsCiAgICAgICAgICJzcmMvZmFzdGNvZGVtYi5jcHAiLApAQCAtMzEsNiArMzAsOCBAQAogICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKIAorICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAorCiAgICAgaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAogICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKQEAgLTgwLDcgKzgxLDcgQEAKICAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZW5jIl0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCkBAIC0xMTIsNiArMTEzLDggQEAKICAgICAgICAgIi1ET1NDTF9FWFBPUlRfUkVGPSIsCiAgICAgICAgICItRE9TQ0xfSU1QT1JUX1JFRj0iLAogICAgICAgICAiLURCWF9SQyIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKICAgICBdLAogCiAgICAgc2FuaXRpemU6IHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvZXhwb3J0cy5sZHMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNGYzZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL2V4cG9ydHMubGRzCkBAIC0wLDAgKzEsNSBAQAoreworICAgIGdsb2JhbDoKKyAgICAgICAgX1oyMmNyZWF0ZVNvZnRPTVhDb21wb25lbnRQS2NQSzE2T01YX0NBTExCQUNLVFlQRVB2UFAxN09NWF9DT01QT05FTlRUWVBFOworICAgIGxvY2FsOiAqOworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5icAppbmRleCAyNzNmYTMxLi45ZmE5YTRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLmJwCkBAIC02NSw4ICs2NSwxMSBAQAogICAgIH0sCiAKICAgICBpbmNsdWRlX2RpcnM6IFsiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIl0sCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbInNyYyJdLAotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgICAgICJzcmMiLAorICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1ET1NDTF9VTlVTRURfQVJHKHgpPSh2b2lkKSh4KSIsCkBAIC05Niw2ICs5OSw4IEBACiAKICAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAogCisgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCisKICAgICBzYW5pdGl6ZTogewogICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKQEAgLTEwNyw3ICsxMTIsNiBAQAogICAgIH0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibWVkaWFfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKQEAgLTEyOCw2ICsxMzIsOCBAQAogICAgICAgICAidGVzdC9tcDNyZWFkZXIuY3BwIiwKICAgICBdLAogCisgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKKwogICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWwogICAgICAgICAic3JjIiwKICAgICAgICAgImluY2x1ZGUiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9leHBvcnRzLmxkcyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvZXhwb3J0cy5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI0ZjNmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvZXhwb3J0cy5sZHMKQEAgLTAsMCArMSw1IEBACit7CisgICAgZ2xvYmFsOgorICAgICAgICBfWjIyY3JlYXRlU29mdE9NWENvbXBvbmVudFBLY1BLMTZPTVhfQ0FMTEJBQ0tUWVBFUHZQUDE3T01YX0NPTVBPTkVOVFRZUEU7CisgICAgbG9jYWw6ICo7Cit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5icAppbmRleCAxNWZkZGU3Li5mYjBkYjhmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5icApAQCAtOCw2ICs4LDE0IEBACiAgICAgc3RhdGljX2xpYnM6IFsibGlibXBlZzJkZWMiXSwKICAgICBzcmNzOiBbIlNvZnRNUEVHMi5jcHAiXSwKIAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLXVudXNlZC12YXJpYWJsZSIsCisgICAgXSwKKworICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAorCiAgICAgaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgICJleHRlcm5hbC9saWJtcGVnMi9kZWNvZGVyIiwKICAgICAgICAgImV4dGVybmFsL2xpYm1wZWcyL2NvbW1vbiIsCkBAIC0xNiw3ICsyNCw2IEBACiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYV9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL2V4cG9ydHMubGRzIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNGYzZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvZXhwb3J0cy5sZHMKQEAgLTAsMCArMSw1IEBACit7CisgICAgZ2xvYmFsOgorICAgICAgICBfWjIyY3JlYXRlU29mdE9NWENvbXBvbmVudFBLY1BLMTZPTVhfQ0FMTEJBQ0tUWVBFUHZQUDE3T01YX0NPTVBPTkVOVFRZUEU7CisgICAgbG9jYWw6ICo7Cit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL0FuZHJvaWQuYnAKaW5kZXggNTljMWY1ZC4uOGE5Mzk5YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLmJwCkBAIC0xNSw3ICsxNSw2IEBACiAgICAgc3RhdGljX2xpYnM6IFsibGlidnB4Il0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibWVkaWFfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKQEAgLTI0LDYgKzIzLDggQEAKIAogICAgIGNmbGFnczogWyItV2Vycm9yIl0sCiAKKyAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKKwogICAgIHNhbml0aXplOiB7CiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmNwcAppbmRleCAzNDkwMDA4Li44ZDVmM2U3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmNwcApAQCAtMzAsNyArMzAsOSBAQAogCiAvLyBPbmx5IG5lZWQgdG8gZGVjbGFyZSB0aGUgaGlnaGVzdCBzdXBwb3J0ZWQgcHJvZmlsZSBhbmQgbGV2ZWwgaGVyZS4KIHN0YXRpYyBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCBrVlA5UHJvZmlsZUxldmVsc1tdID0gewotICAgIHsgT01YX1ZJREVPX1ZQOVByb2ZpbGUwLCBPTVhfVklERU9fVlA5TGV2ZWw1ICB9LAorICAgIHsgT01YX1ZJREVPX1ZQOVByb2ZpbGUwLCBPTVhfVklERU9fVlA5TGV2ZWw1IH0sCisgICAgeyBPTVhfVklERU9fVlA5UHJvZmlsZTIsIE9NWF9WSURFT19WUDlMZXZlbDUgfSwKKyAgICB7IE9NWF9WSURFT19WUDlQcm9maWxlMkhEUiwgT01YX1ZJREVPX1ZQOUxldmVsNSB9LAogfTsKIAogU29mdFZQWDo6U29mdFZQWCgKQEAgLTc4LDYgKzgwLDEwIEBACiAgICAgcmV0dXJuIGNwdUNvcmVDb3VudDsKIH0KIAorYm9vbCBTb2Z0VlBYOjpzdXBwb3J0RGVzY3JpYmVIZHJTdGF0aWNJbmZvKCkgeworICAgIHJldHVybiB0cnVlOworfQorCiBzdGF0dXNfdCBTb2Z0VlBYOjppbml0RGVjb2RlcigpIHsKICAgICBtQ3R4ID0gbmV3IHZweF9jb2RlY19jdHhfdDsKICAgICB2cHhfY29kZWNfZXJyX3QgdnB4X2VycjsKQEAgLTE0NiwxNSArMTUyLDIxIEBACiAgICAgICAgIHVpbnQzMl90IGhlaWdodCA9IG1JbWctPmRfaDsKICAgICAgICAgb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOwogICAgICAgICBvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOwotICAgICAgICBDSEVDS19FUShtSW1nLT5mbXQsIFZQWF9JTUdfRk1UX0k0MjApOwotICAgICAgICBoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UocG9ydFdpbGxSZXNldCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIENIRUNLKG1JbWctPmZtdCA9PSBWUFhfSU1HX0ZNVF9JNDIwIHx8IG1JbWctPmZtdCA9PSBWUFhfSU1HX0ZNVF9JNDIwMTYpOworICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBvdXRwdXRDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI7CisgICAgICAgIGludDMyX3QgYnBwID0gMTsKKyAgICAgICAgaWYgKG1JbWctPmZtdCA9PSBWUFhfSU1HX0ZNVF9JNDIwMTYpIHsKKyAgICAgICAgICAgIG91dHB1dENvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjE2OworICAgICAgICAgICAgYnBwID0gMjsKKyAgICAgICAgfQorICAgICAgICBoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UocG9ydFdpbGxSZXNldCwgd2lkdGgsIGhlaWdodCwgb3V0cHV0Q29sb3JGb3JtYXQpOwogICAgICAgICBpZiAoKnBvcnRXaWxsUmVzZXQpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKICAgICAgICAgb3V0SGVhZGVyLT5uT2Zmc2V0ID0gMDsKICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSAwOwotICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAob3V0cHV0QnVmZmVyV2lkdGgoKSAqIG91dHB1dEJ1ZmZlckhlaWdodCgpICogMykgLyAyOworICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAob3V0cHV0QnVmZmVyV2lkdGgoKSAqIG91dHB1dEJ1ZmZlckhlaWdodCgpICogYnBwICogMykgLyAyOwogICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSAqKE9NWF9USUNLUyAqKW1JbWctPnVzZXJfcHJpdjsKICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlclNhZmUob3V0SGVhZGVyKSkgewogICAgICAgICAgICAgdWludDhfdCAqZHN0ID0gb3V0SGVhZGVyLT5wQnVmZmVyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oCmluZGV4IGQ2YmI5MDIuLmI2MmI1MjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmgKQEAgLTQwLDEwICs0MCwxMSBAQAogICAgIHZpcnR1YWwgdm9pZCBvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKICAgICB2aXJ0dWFsIHZvaWQgb25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpOwogICAgIHZpcnR1YWwgdm9pZCBvblJlc2V0KCk7CisgICAgdmlydHVhbCBib29sIHN1cHBvcnREZXNjcmliZUhkclN0YXRpY0luZm8oKTsKIAogcHJpdmF0ZToKICAgICBlbnVtIHsKLSAgICAgICAga051bUJ1ZmZlcnMgPSA0CisgICAgICAgIGtOdW1CdWZmZXJzID0gMTAKICAgICB9OwogCiAgICAgZW51bSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9leHBvcnRzLmxkcyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNGYzZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9leHBvcnRzLmxkcwpAQCAtMCwwICsxLDUgQEAKK3sKKyAgICBnbG9iYWw6CisgICAgICAgIF9aMjJjcmVhdGVTb2Z0T01YQ29tcG9uZW50UEtjUEsxNk9NWF9DQUxMQkFDS1RZUEVQdlBQMTdPTVhfQ09NUE9ORU5UVFlQRTsKKyAgICBsb2NhbDogKjsKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvQW5kcm9pZC5icAppbmRleCA3NDE3NzRjLi4zZDlmZWViIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL0FuZHJvaWQuYnAKQEAgLTExLDYgKzExLDEwIEBACiAgICAgICAgICJTb2Z0VlA5RW5jb2Rlci5jcHAiLAogICAgIF0sCiAKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAorCisgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCisKICAgICBpbmNsdWRlX2RpcnM6IFsKICAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCiAgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLApAQCAtMzAsNyArMzQsNiBAQAogICAgIHN0YXRpY19saWJzOiBbImxpYnZweCJdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlA5RW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlA5RW5jb2Rlci5jcHAKaW5kZXggNGM3MjkwZC4uMWVhMWM4NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQOUVuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUDlFbmNvZGVyLmNwcApAQCAtNjksNiArNjksMTMgQEAKICAgICAgICAgICAgICAgY29kZWNSZXR1cm4pOwogICAgICAgICByZXR1cm4gY29kZWNSZXR1cm47CiAgICAgfQorICAgIGNvZGVjUmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2wobUNvZGVjQ29udGV4dCwgVlA5RV9TRVRfUk9XX01ULCAxKTsKKyAgICBpZiAoY29kZWNSZXR1cm4gIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBzZXR0aW5nIFZQOUVfU0VUX1JPV19NVCB0byAxLiB2cHhfY29kZWNfY29udHJvbCgpICIKKyAgICAgICAgICAgICAgInJldHVybmVkICVkIiwgY29kZWNSZXR1cm4pOworICAgICAgICByZXR1cm4gY29kZWNSZXR1cm47CisgICAgfQorCiAgICAgLy8gRm9yIFZQOSwgd2UgYWx3YXlzIHNldCBDUFVfVVNFRCB0byA4IChiZWNhdXNlIHRoZSByZWFsdGltZSBkZWZhdWx0IGlzIDAKICAgICAvLyB3aGljaCBpcyB0b28gc2xvdykuCiAgICAgY29kZWNSZXR1cm4gPSB2cHhfY29kZWNfY29udHJvbChtQ29kZWNDb250ZXh0LCBWUDhFX1NFVF9DUFVVU0VELCA4KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL2V4cG9ydHMubGRzIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvZXhwb3J0cy5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI0ZjNmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL2V4cG9ydHMubGRzCkBAIC0wLDAgKzEsNSBAQAoreworICAgIGdsb2JhbDoKKyAgICAgICAgX1oyMmNyZWF0ZVNvZnRPTVhDb21wb25lbnRQS2NQSzE2T01YX0NBTExCQUNLVFlQRVB2UFAxN09NWF9DT01QT05FTlRUWVBFOworICAgIGxvY2FsOiAqOworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YzIwNzUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotY2NfbGlicmFyeV9zaGFyZWQgewotICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2gyNjRkZWMiLAotCi0gICAgc3JjczogWwotICAgICAgICAic291cmNlL2gyNjRic2RfdHJhbnNmb3JtLmMiLAotICAgICAgICAic291cmNlL2gyNjRic2RfdXRpbC5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX2J5dGVfc3RyZWFtLmMiLAotICAgICAgICAic291cmNlL2gyNjRic2Rfc2VxX3BhcmFtX3NldC5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX3BpY19wYXJhbV9zZXQuYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF9zbGljZV9kYXRhLmMiLAotICAgICAgICAic291cmNlL2gyNjRic2RfbWFjcm9ibG9ja19sYXllci5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX3N0cmVhbS5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX3ZsYy5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX2NhdmxjLmMiLAotICAgICAgICAic291cmNlL2gyNjRic2RfbmFsX3VuaXQuYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF9uZWlnaGJvdXIuYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF9zdG9yYWdlLmMiLAotICAgICAgICAic291cmNlL2gyNjRic2Rfc2xpY2VfZ3JvdXBfbWFwLmMiLAotICAgICAgICAic291cmNlL2gyNjRic2RfaW50cmFfcHJlZGljdGlvbi5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX2ludGVyX3ByZWRpY3Rpb24uYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF9yZWNvbnN0cnVjdC5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX2RwYi5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX2ltYWdlLmMiLAotICAgICAgICAic291cmNlL2gyNjRic2RfZGVibG9ja2luZy5jIiwKLSAgICAgICAgInNvdXJjZS9oMjY0YnNkX2NvbmNlYWwuYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF92dWkuYyIsCi0gICAgICAgICJzb3VyY2UvaDI2NGJzZF9waWNfb3JkZXJfY250LmMiLAotICAgICAgICAic291cmNlL2gyNjRic2RfZGVjb2Rlci5jIiwKLSAgICAgICAgInNvdXJjZS9IMjY0U3dEZWNBcGkuYyIsCi0gICAgICAgICJTb2Z0QVZDLmNwcCIsCi0gICAgXSwKLQotICAgIGFyY2g6IHsKLSAgICAgICAgYXJtOiB7Ci0gICAgICAgICAgICBpbnN0cnVjdGlvbl9zZXQ6ICJhcm0iLAotCi0gICAgICAgICAgICBhcm12N19hX25lb246IHsKLSAgICAgICAgICAgICAgICBjZmxhZ3M6IFsKLSAgICAgICAgICAgICAgICAgICAgIi1ESDI2NERFQ19ORU9OIiwKLSAgICAgICAgICAgICAgICAgICAgIi1ESDI2NERFQ19PTVhETCIsCi0gICAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICAgICBzcmNzOiBbCi0gICAgICAgICAgICAgICAgICAgICJzb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkV3JpdGVNYWNyb2Jsb2NrLlMiLAotICAgICAgICAgICAgICAgICAgICAic291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZENsZWFyTWJMYXllci5TIiwKLSAgICAgICAgICAgICAgICAgICAgInNvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RGaWxsUm93Ny5TIiwKLSAgICAgICAgICAgICAgICAgICAgInNvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RDb3VudExlYWRpbmdaZXJvcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgInNvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RGbHVzaEJpdHMuUyIsCi0KLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fQml0c3RyZWFtLmMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vc3JjL2FybUNPTU0uYyIsCi0KLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MuUyIsCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5TIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLlMiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MuUyIsCi0gICAgICAgICAgICAgICAgXSwKLQotICAgICAgICAgICAgICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWwotICAgICAgICAgICAgICAgICAgICAic291cmNlL2FybV9uZW9uX2FzbV9nY2MiLAotCi0gICAgICAgICAgICAgICAgICAgICJvbXhkbC9hcm1fbmVvbi9hcGkiLAotICAgICAgICAgICAgICAgICAgICAib214ZGwvYXJtX25lb24vdmMvYXBpIiwKLSAgICAgICAgICAgICAgICAgICAgIm9teGRsL2FybV9uZW9uL3ZjL200cDEwL2FwaSIsCi0gICAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgIH0sCi0gICAgICAgIH0sCi0gICAgfSwKLQotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgXSwKLQotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jIl0sCi0KLSAgICBzYW5pdGl6ZTogewotICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwotICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAgICAgXSwKLSAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCi0gICAgfSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYSIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi19Ci0KLS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLS8vIHRlc3QgdXRpbGl0eTogZGVjb2RlcgotLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotLy8jCi0vLyMgVGVzdCBhcHBsaWNhdGlvbgotLy8jCi1jY19iaW5hcnkgewotICAgIG5hbWU6ICJkZWNvZGVyIiwKLQotICAgIHNyY3M6IFsic291cmNlL0RlY1Rlc3RCZW5jaC5jIl0sCi0KLSAgICBzaGFyZWRfbGliczogWyJsaWJzdGFnZWZyaWdodF9zb2Z0X2gyNjRkZWMiXSwKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY2MWQxMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiU29mdEFWQyIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIlNvZnRBVkMuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9JT01YLmg+Ci0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgY29uc3QgQ29kZWNQcm9maWxlTGV2ZWwga1Byb2ZpbGVMZXZlbHNbXSA9IHsKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDEgIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwxYiB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMTEgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDEyIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwxMyB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMiAgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDIxIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwyMiB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMyAgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDMxIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwzMiB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsNCAgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDQxIH0sCi0gICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWw0MiB9LAotICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsNSAgfSwKLSAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDUxIH0sCi19OwotCi1Tb2Z0QVZDOjpTb2Z0QVZDKAotICAgICAgICBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCi0gICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKLSAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpCi0gICAgOiBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50KAotICAgICAgICAgICAgbmFtZSwgInZpZGVvX2RlY29kZXIuYXZjIiwgT01YX1ZJREVPX0NvZGluZ0FWQywKLSAgICAgICAgICAgIGtQcm9maWxlTGV2ZWxzLCBBUlJBWV9TSVpFKGtQcm9maWxlTGV2ZWxzKSwKLSAgICAgICAgICAgIDMyMCAvKiB3aWR0aCAqLywgMjQwIC8qIGhlaWdodCAqLywgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAotICAgICAgbUhhbmRsZShOVUxMKSwKLSAgICAgIG1JbnB1dEJ1ZmZlckNvdW50KDApLAotICAgICAgbUZpcnN0UGljdHVyZShOVUxMKSwKLSAgICAgIG1GaXJzdFBpY3R1cmVJZCgtMSksCi0gICAgICBtUGljSWQoMCksCi0gICAgICBtSGVhZGVyc0RlY29kZWQoZmFsc2UpLAotICAgICAgbUVPU1N0YXR1cyhJTlBVVF9EQVRBX0FWQUlMQUJMRSksCi0gICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpIHsKLSAgICBjb25zdCBzaXplX3Qga01pbkNvbXByZXNzaW9uUmF0aW8gPSAyOwotICAgIGNvbnN0IHNpemVfdCBrTWF4T3V0cHV0QnVmZmVyU2l6ZSA9IDIwNDggKiAyMDQ4ICogMyAvIDI7Ci0gICAgaW5pdFBvcnRzKAotICAgICAgICAgICAga051bUlucHV0QnVmZmVycywga01heE91dHB1dEJ1ZmZlclNpemUgLyBrTWluQ29tcHJlc3Npb25SYXRpbyAvKiBtaW5JbnB1dEJ1ZmZlclNpemUgKi8sCi0gICAgICAgICAgICBrTnVtT3V0cHV0QnVmZmVycywgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCBrTWluQ29tcHJlc3Npb25SYXRpbyk7Ci0KLSAgICBDSEVDS19FUShpbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOwotfQotCi1Tb2Z0QVZDOjp+U29mdEFWQygpIHsKLSAgICBIMjY0U3dEZWNSZWxlYXNlKG1IYW5kbGUpOwotICAgIG1IYW5kbGUgPSBOVUxMOwotCi0gICAgd2hpbGUgKG1QaWNUb0hlYWRlck1hcC5zaXplKCkgIT0gMCkgewotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gbVBpY1RvSGVhZGVyTWFwLmVkaXRWYWx1ZUF0KDApOwotICAgICAgICBtUGljVG9IZWFkZXJNYXAucmVtb3ZlSXRlbXNBdCgwKTsKLSAgICAgICAgZGVsZXRlIGhlYWRlcjsKLSAgICAgICAgaGVhZGVyID0gTlVMTDsKLSAgICB9Ci0gICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZShrT3V0cHV0UG9ydEluZGV4KTsKLSAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoa0lucHV0UG9ydEluZGV4KTsKLSAgICBDSEVDSyhvdXRRdWV1ZS5lbXB0eSgpKTsKLSAgICBDSEVDSyhpblF1ZXVlLmVtcHR5KCkpOwotCi0gICAgZGVsZXRlW10gbUZpcnN0UGljdHVyZTsKLX0KLQotc3RhdHVzX3QgU29mdEFWQzo6aW5pdERlY29kZXIoKSB7Ci0gICAgLy8gRm9yY2UgZGVjb2RlciB0byBvdXRwdXQgYnVmZmVycyBpbiBkaXNwbGF5IG9yZGVyLgotICAgIGlmIChIMjY0U3dEZWNJbml0KCZtSGFuZGxlLCAwKSA9PSBIMjY0U1dERUNfT0spIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLX0KLQotdm9pZCBTb2Z0QVZDOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7Ci0gICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlICE9IE5PTkUpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtRU9TU3RhdHVzID09IE9VVFBVVF9GUkFNRVNfRkxVU0hFRCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKGtJbnB1dFBvcnRJbmRleCk7Ci0gICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZShrT3V0cHV0UG9ydEluZGV4KTsKLQotICAgIGlmIChtSGVhZGVyc0RlY29kZWQpIHsKLSAgICAgICAgLy8gRGVxdWV1ZSBhbnkgYWxyZWFkeSBkZWNvZGVkIG91dHB1dCBmcmFtZXMgdG8gZnJlZSB1cCBzcGFjZQotICAgICAgICAvLyBpbiB0aGUgb3V0cHV0IHF1ZXVlLgotCi0gICAgICAgIGRyYWluQWxsT3V0cHV0QnVmZmVycyhmYWxzZSAvKiBlb3MgKi8pOwotICAgIH0KLQotICAgIEgyNjRTd0RlY1JldCByZXQgPSBIMjY0U1dERUNfUElDX1JEWTsKLSAgICBib29sIHBvcnRXaWxsUmVzZXQgPSBmYWxzZTsKLSAgICB3aGlsZSAoKG1FT1NTdGF0dXMgIT0gSU5QVVRfREFUQV9BVkFJTEFCTEUgfHwgIWluUXVldWUuZW1wdHkoKSkKLSAgICAgICAgICAgICYmIG91dFF1ZXVlLnNpemUoKSA9PSBrTnVtT3V0cHV0QnVmZmVycykgewotCi0gICAgICAgIGlmIChtRU9TU3RhdHVzID09IElOUFVUX0VPU19TRUVOKSB7Ci0gICAgICAgICAgICBkcmFpbkFsbE91dHB1dEJ1ZmZlcnModHJ1ZSAvKiBlb3MgKi8pOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQnVmZmVySW5mbyAqaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyID0gaW5JbmZvLT5tSGVhZGVyOwotICAgICAgICArK21QaWNJZDsKLQotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gbmV3IE9NWF9CVUZGRVJIRUFERVJUWVBFOwotICAgICAgICBtZW1zZXQoaGVhZGVyLCAwLCBzaXplb2YoT01YX0JVRkZFUkhFQURFUlRZUEUpKTsKLSAgICAgICAgaGVhZGVyLT5uVGltZVN0YW1wID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7Ci0gICAgICAgIGhlYWRlci0+bkZsYWdzID0gaW5IZWFkZXItPm5GbGFnczsKLSAgICAgICAgaWYgKGhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7Ci0gICAgICAgICAgICBtRU9TU3RhdHVzID0gSU5QVVRfRU9TX1NFRU47Ci0gICAgICAgIH0KLSAgICAgICAgbVBpY1RvSGVhZGVyTWFwLmFkZChtUGljSWQsIGhlYWRlcik7Ci0gICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKLQotICAgICAgICBIMjY0U3dEZWNJbnB1dCBpblBpY3R1cmU7Ci0gICAgICAgIEgyNjRTd0RlY091dHB1dCBvdXRQaWN0dXJlOwotICAgICAgICBtZW1zZXQoJmluUGljdHVyZSwgMCwgc2l6ZW9mKGluUGljdHVyZSkpOwotICAgICAgICBpblBpY3R1cmUuZGF0YUxlbiA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOwotICAgICAgICBpblBpY3R1cmUucFN0cmVhbSA9IGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQ7Ci0gICAgICAgIGluUGljdHVyZS5waWNJZCA9IG1QaWNJZDsKLSAgICAgICAgaW5QaWN0dXJlLmludHJhQ29uY2VhbG1lbnRNZXRob2QgPSAxOwotICAgICAgICBIMjY0U3dEZWNQaWN0dXJlIGRlY29kZWRQaWN0dXJlOwotCi0gICAgICAgIHdoaWxlIChpblBpY3R1cmUuZGF0YUxlbiA+IDApIHsKLSAgICAgICAgICAgIHJldCA9IEgyNjRTd0RlY0RlY29kZShtSGFuZGxlLCAmaW5QaWN0dXJlLCAmb3V0UGljdHVyZSk7Ci0gICAgICAgICAgICBpZiAocmV0ID09IEgyNjRTV0RFQ19IRFJTX1JEWV9CVUZGX05PVF9FTVBUWSB8fAotICAgICAgICAgICAgICAgIHJldCA9PSBIMjY0U1dERUNfUElDX1JEWV9CVUZGX05PVF9FTVBUWSkgewotICAgICAgICAgICAgICAgIGluUGljdHVyZS5kYXRhTGVuIC09ICh1MzIpKG91dFBpY3R1cmUucFN0cm1DdXJyUG9zIC0gaW5QaWN0dXJlLnBTdHJlYW0pOwotICAgICAgICAgICAgICAgIGluUGljdHVyZS5wU3RyZWFtID0gb3V0UGljdHVyZS5wU3RybUN1cnJQb3M7Ci0gICAgICAgICAgICAgICAgaWYgKHJldCA9PSBIMjY0U1dERUNfSERSU19SRFlfQlVGRl9OT1RfRU1QVFkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUhlYWRlcnNEZWNvZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgSDI2NFN3RGVjSW5mbyBkZWNvZGVySW5mbzsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0soSDI2NFN3RGVjR2V0SW5mbyhtSGFuZGxlLCAmZGVjb2RlckluZm8pID09IEgyNjRTV0RFQ19PSyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6Q3JvcFNldHRpbmdzTW9kZSBjcm9wU2V0dGluZ3NNb2RlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNyb3BQYXJhbXMoZGVjb2RlckluZm8pOwotICAgICAgICAgICAgICAgICAgICBoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvcnRXaWxsUmVzZXQsIGRlY29kZXJJbmZvLnBpY1dpZHRoLCBkZWNvZGVySW5mby5waWNIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcFNldHRpbmdzTW9kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocG9ydFdpbGxSZXNldCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoSDI2NFN3RGVjTmV4dFBpY3R1cmUobUhhbmRsZSwgJmRlY29kZWRQaWN0dXJlLCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gSDI2NFNXREVDX1BJQ19SRFkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGlzIG91dHB1dCBidWZmZXI7IG90aGVyd2lzZSwgaXQgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9zdCBkdXJpbmcgZHluYW1pYyBwb3J0IHJlY29uZmlndXJhdGlvbiBiZWNhdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBPcGVuTUFYIGNsaWVudCB3aWxsIGRlbGV0ZSBfYWxsXyBvdXRwdXQgYnVmZmVycwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIHByb2Nlc3MuCi0gICAgICAgICAgICAgICAgICAgICAgICBzYXZlRmlyc3RPdXRwdXRCdWZmZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZFBpY3R1cmUucGljSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKilkZWNvZGVkUGljdHVyZS5wT3V0cHV0UGljdHVyZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW5QaWN0dXJlLmRhdGFMZW4gPSAwOwotICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJEZWNvZGVyIGZhaWxlZDogJWQiLCByZXQpOwotCi0gICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJST1JfTUFMRk9STUVELCBOVUxMKTsKLQotICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOwotCi0gICAgICAgIGlmIChwb3J0V2lsbFJlc2V0KSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUZpcnN0UGljdHVyZSAmJiAhb3V0UXVldWUuZW1wdHkoKSkgewotICAgICAgICAgICAgaWYgKCFkcmFpbk9uZU91dHB1dEJ1ZmZlcihtRmlyc3RQaWN0dXJlSWQsIG1GaXJzdFBpY3R1cmUpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkRyYWluIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKLSAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlbGV0ZVtdIG1GaXJzdFBpY3R1cmU7Ci0gICAgICAgICAgICBtRmlyc3RQaWN0dXJlID0gTlVMTDsKLSAgICAgICAgICAgIG1GaXJzdFBpY3R1cmVJZCA9IC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgZHJhaW5BbGxPdXRwdXRCdWZmZXJzKGZhbHNlIC8qIGVvcyAqLyk7Ci0gICAgfQotfQotCi1Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpDcm9wU2V0dGluZ3NNb2RlIFNvZnRBVkM6OmhhbmRsZUNyb3BQYXJhbXMoCi0gICAgICAgIGNvbnN0IEgyNjRTd0RlY0luZm8mIGRlY0luZm8pIHsKLSAgICBpZiAoIWRlY0luZm8uY3JvcHBpbmdGbGFnKSB7Ci0gICAgICAgIHJldHVybiBrQ3JvcFVuU2V0OwotICAgIH0KLQotICAgIGNvbnN0IENyb3BQYXJhbXMmIGNyb3AgPSBkZWNJbmZvLmNyb3BQYXJhbXM7Ci0gICAgaWYgKG1Dcm9wTGVmdCA9PSBjcm9wLmNyb3BMZWZ0T2Zmc2V0ICYmCi0gICAgICAgIG1Dcm9wVG9wID09IGNyb3AuY3JvcFRvcE9mZnNldCAmJgotICAgICAgICBtQ3JvcFdpZHRoID09IGNyb3AuY3JvcE91dFdpZHRoICYmCi0gICAgICAgIG1Dcm9wSGVpZ2h0ID09IGNyb3AuY3JvcE91dEhlaWdodCkgewotICAgICAgICByZXR1cm4ga0Nyb3BTZXQ7Ci0gICAgfQotCi0gICAgbUNyb3BMZWZ0ID0gY3JvcC5jcm9wTGVmdE9mZnNldDsKLSAgICBtQ3JvcFRvcCA9IGNyb3AuY3JvcFRvcE9mZnNldDsKLSAgICBtQ3JvcFdpZHRoID0gY3JvcC5jcm9wT3V0V2lkdGg7Ci0gICAgbUNyb3BIZWlnaHQgPSBjcm9wLmNyb3BPdXRIZWlnaHQ7Ci0gICAgcmV0dXJuIGtDcm9wQ2hhbmdlZDsKLX0KLQotdm9pZCBTb2Z0QVZDOjpzYXZlRmlyc3RPdXRwdXRCdWZmZXIoaW50MzJfdCBwaWNJZCwgdWludDhfdCAqZGF0YSkgewotICAgIENIRUNLKG1GaXJzdFBpY3R1cmUgPT0gTlVMTCk7Ci0gICAgbUZpcnN0UGljdHVyZUlkID0gcGljSWQ7Ci0KLSAgICB1aW50MzJfdCBwaWN0dXJlU2l6ZSA9IG1XaWR0aCAqIG1IZWlnaHQgKiAzIC8gMjsKLSAgICBtRmlyc3RQaWN0dXJlID0gbmV3IHVpbnQ4X3RbcGljdHVyZVNpemVdOwotICAgIG1lbWNweShtRmlyc3RQaWN0dXJlLCBkYXRhLCBwaWN0dXJlU2l6ZSk7Ci19Ci0KLWJvb2wgU29mdEFWQzo6ZHJhaW5PbmVPdXRwdXRCdWZmZXIoaW50MzJfdCBwaWNJZCwgdWludDhfdCogZGF0YSkgewotICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoa091dHB1dFBvcnRJbmRleCk7Ci0gICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOwotICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOwotICAgIE9NWF9VMzIgZnJhbWVTaXplID0gbVdpZHRoICogbUhlaWdodCAqIDMgLyAyOwotICAgIGlmIChvdXRIZWFkZXItPm5BbGxvY0xlbiAtIG91dEhlYWRlci0+bk9mZnNldCA8IGZyYW1lU2l6ZSkgewotICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3ODMzNjE2Iik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7Ci0gICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IG1QaWNUb0hlYWRlck1hcC52YWx1ZUZvcihwaWNJZCk7Ci0gICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gaGVhZGVyLT5uVGltZVN0YW1wOwotICAgIG91dEhlYWRlci0+bkZsYWdzID0gaGVhZGVyLT5uRmxhZ3M7Ci0gICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gZnJhbWVTaXplOwotCi0gICAgdWludDhfdCAqZHN0ID0gb3V0SGVhZGVyLT5wQnVmZmVyICsgb3V0SGVhZGVyLT5uT2Zmc2V0OwotICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSBkYXRhOwotICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1UgPSBzcmNZICsgbVdpZHRoICogbUhlaWdodDsKLSAgICBjb25zdCB1aW50OF90ICpzcmNWID0gc3JjVSArIG1XaWR0aCAqIG1IZWlnaHQgLyA0OwotICAgIHNpemVfdCBzcmNZU3RyaWRlID0gbVdpZHRoOwotICAgIHNpemVfdCBzcmNVU3RyaWRlID0gbVdpZHRoIC8gMjsKLSAgICBzaXplX3Qgc3JjVlN0cmlkZSA9IHNyY1VTdHJpZGU7Ci0gICAgY29weVlWMTJGcmFtZVRvT3V0cHV0QnVmZmVyKGRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwgc3JjVlN0cmlkZSk7Ci0KLSAgICBtUGljVG9IZWFkZXJNYXAucmVtb3ZlSXRlbShwaWNJZCk7Ci0gICAgZGVsZXRlIGhlYWRlcjsKLSAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBTb2Z0QVZDOjpkcmFpbkFsbE91dHB1dEJ1ZmZlcnMoYm9vbCBlb3MpIHsKLSAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKGtPdXRwdXRQb3J0SW5kZXgpOwotICAgIEgyNjRTd0RlY1BpY3R1cmUgZGVjb2RlZFBpY3R1cmU7Ci0KLSAgICBpZiAobUhlYWRlcnNEZWNvZGVkKSB7Ci0gICAgICAgIHdoaWxlICghb3V0UXVldWUuZW1wdHkoKQotICAgICAgICAgICAgICAgICYmIEgyNjRTV0RFQ19QSUNfUkRZID09IEgyNjRTd0RlY05leHRQaWN0dXJlKAotICAgICAgICAgICAgICAgICAgICBtSGFuZGxlLCAmZGVjb2RlZFBpY3R1cmUsIGVvcyAvKiBmbHVzaCAqLykpIHsKLSAgICAgICAgICAgIGludDMyX3QgcGljSWQgPSBkZWNvZGVkUGljdHVyZS5waWNJZDsKLSAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSAodWludDhfdCAqKSBkZWNvZGVkUGljdHVyZS5wT3V0cHV0UGljdHVyZTsKLSAgICAgICAgICAgIGlmICghZHJhaW5PbmVPdXRwdXRCdWZmZXIocGljSWQsIGRhdGEpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkRyYWluIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKLSAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghZW9zKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB3aGlsZSAoIW91dFF1ZXVlLmVtcHR5KCkpIHsKLSAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOwotICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7Ci0KLSAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gMDsKLSAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKLSAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7Ci0KLSAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOwotCi0gICAgICAgIG1FT1NTdGF0dXMgPSBPVVRQVVRfRlJBTUVTX0ZMVVNIRUQ7Ci0gICAgfQotfQotCi12b2lkIFNvZnRBVkM6Om9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7Ci0gICAgaWYgKHBvcnRJbmRleCA9PSBrSW5wdXRQb3J0SW5kZXgpIHsKLSAgICAgICAgbUVPU1N0YXR1cyA9IElOUFVUX0RBVEFfQVZBSUxBQkxFOwotICAgIH0KLX0KLQotdm9pZCBTb2Z0QVZDOjpvblJlc2V0KCkgewotICAgIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6Om9uUmVzZXQoKTsKLSAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudCgKLSAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAotICAgICAgICBPTVhfUFRSIGFwcERhdGEsIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSB7Ci0gICAgcmV0dXJuIG5ldyBhbmRyb2lkOjpTb2Z0QVZDKG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWQ5ODhiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBTT0ZUX0FWQ19IXwotCi0jZGVmaW5lIFNPRlRfQVZDX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0KLSNpbmNsdWRlICJIMjY0U3dEZWNBcGkuaCIKLSNpbmNsdWRlICJiYXNldHlwZS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBTb2Z0QVZDIDogcHVibGljIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQgewotICAgIFNvZnRBVkMoY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKLSAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgflNvZnRBVkMoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKLSAgICB2aXJ0dWFsIHZvaWQgb25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpOwotICAgIHZpcnR1YWwgdm9pZCBvblJlc2V0KCk7Ci0KLXByaXZhdGU6Ci0gICAgZW51bSB7Ci0gICAgICAgIGtOdW1JbnB1dEJ1ZmZlcnMgID0gOCwKLSAgICAgICAga051bU91dHB1dEJ1ZmZlcnMgPSAyLAotICAgIH07Ci0KLSAgICBlbnVtIEVPU1N0YXR1cyB7Ci0gICAgICAgIElOUFVUX0RBVEFfQVZBSUxBQkxFLAotICAgICAgICBJTlBVVF9FT1NfU0VFTiwKLSAgICAgICAgT1VUUFVUX0ZSQU1FU19GTFVTSEVELAotICAgIH07Ci0KLSAgICB2b2lkICptSGFuZGxlOwotCi0gICAgc2l6ZV90IG1JbnB1dEJ1ZmZlckNvdW50OwotCi0gICAgdWludDhfdCAqbUZpcnN0UGljdHVyZTsKLSAgICBpbnQzMl90IG1GaXJzdFBpY3R1cmVJZDsKLQotICAgIGludDMyX3QgbVBpY0lkOyAgLy8gV2hpY2ggb3V0cHV0IHBpY3R1cmUgaXMgZm9yIHdoaWNoIGlucHV0IGJ1ZmZlcj8KLQotICAgIC8vIE9NWF9CVUZGRVJIRUFERVJUWVBFIG1heSBiZSBvdmVya2lsbCwgYnV0IGl0IGlzIGNvbnZlbmllbnQKLSAgICAvLyBmb3IgdHJhY2tpbmcgdGhlIGZvbGxvd2luZyBmaWVsZHM6IG5GbGFncywgblRpbWVTdGFtcCwgZXRjLgotICAgIEtleWVkVmVjdG9yPGludDMyX3QsIE9NWF9CVUZGRVJIRUFERVJUWVBFICo+IG1QaWNUb0hlYWRlck1hcDsKLSAgICBib29sIG1IZWFkZXJzRGVjb2RlZDsKLQotICAgIEVPU1N0YXR1cyBtRU9TU3RhdHVzOwotCi0gICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7Ci0KLSAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOwotICAgIHZvaWQgZHJhaW5BbGxPdXRwdXRCdWZmZXJzKGJvb2wgZW9zKTsKLSAgICBib29sIGRyYWluT25lT3V0cHV0QnVmZmVyKGludDMyX3QgcGljSWQsIHVpbnQ4X3QgKmRhdGEpOwotICAgIHZvaWQgc2F2ZUZpcnN0T3V0cHV0QnVmZmVyKGludDMyX3QgcGlkSWQsIHVpbnQ4X3QgKmRhdGEpOwotICAgIENyb3BTZXR0aW5nc01vZGUgaGFuZGxlQ3JvcFBhcmFtcyhjb25zdCBIMjY0U3dEZWNJbmZvJiBkZWNJbmZvKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRBVkMpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBTT0ZUX0FWQ19IXwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvaW5jL0gyNjRTd0RlY0FwaS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL2luYy9IMjY0U3dEZWNBcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgxNGU3My4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvaW5jL0gyNjRTd0RlY0FwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgSGVhZGVycwotCi0gICAgMi4gRW51bWVyYXRpb25zIHVzZWQgYXMgYSByZXR1cm4gdmFsdWUgb3IgYSBwYXJhbWV0ZXIuCi0gICAgICAgIDIuMS4gQVBJJ3MgcmV0dXJuIHZhbHVlIGVudW1lcmF0aW9ucy4KLQotICAgIDMuIFVzZXIgU3RydWN0dXJlcwotICAgICAgICAzLjEuIFN0cnVjdHVyZXMgZm9yIEgyNjRTd0RlY0RlY29kZSgpIHBhcmFtZXRlcnMuCi0gICAgICAgIDMuMi4gU3RydWN0dXJlcyBmb3IgaW5mb3JtYXRpb24gaW50ZXJjaGFuZ2Ugd2l0aAotICAgICAgICAgICAgIERFQyBBUEkgYW5kIHVzZXIgYXBwbGljYXRpb24uCi0KLSAgICA0LiBQcm90b3R5cGVzIG9mIERlY29kZXIgQVBJIGZ1bmN0aW9ucwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ0FQSV9ICi0jZGVmaW5lIEgyNjRTV0RFQ0FQSV9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBIZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4xLiBBUEkncyByZXR1cm4gdmFsdWUgZW51bWVyYXRpb25zLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIHR5cGVkZWYgZW51bQotICAgIHsKLSAgICAgICAgSDI2NFNXREVDX09LID0gMCwKLSAgICAgICAgSDI2NFNXREVDX1NUUk1fUFJPQ0VTU0VEID0gMSwKLSAgICAgICAgSDI2NFNXREVDX1BJQ19SRFksCi0gICAgICAgIEgyNjRTV0RFQ19QSUNfUkRZX0JVRkZfTk9UX0VNUFRZLAotICAgICAgICBIMjY0U1dERUNfSERSU19SRFlfQlVGRl9OT1RfRU1QVFksCi0gICAgICAgIEgyNjRTV0RFQ19QQVJBTV9FUlIgPSAtMSwKLSAgICAgICAgSDI2NFNXREVDX1NUUk1fRVJSID0gLTIsCi0gICAgICAgIEgyNjRTV0RFQ19OT1RfSU5JVElBTElaRUQgPSAtMywKLSAgICAgICAgSDI2NFNXREVDX01FTUZBSUwgPSAtNCwKLSAgICAgICAgSDI2NFNXREVDX0lOSVRGQUlMID0gLTUsCi0gICAgICAgIEgyNjRTV0RFQ19IRFJTX05PVF9SRFkgPSAtNiwKLSAgICAgICAgSDI2NFNXREVDX0VWQUxVQVRJT05fTElNSVRfRVhDRUVERUQgPSAtNwotICAgIH0gSDI2NFN3RGVjUmV0OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuMS4gU3RydWN0dXJlcyBmb3IgSDI2NFN3RGVjRGVjb2RlKCkgcGFyYW1ldGVycy4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICAvKiB0eXBlZGVmIG9mIHRoZSBEZWNvZGVyIGluc3RhbmNlICovCi0gICAgdHlwZWRlZiB2b2lkICpIMjY0U3dEZWNJbnN0OwotCi0gICAgLyogSW5wdXQgc3RydWN0dXJlICovCi0gICAgdHlwZWRlZiBzdHJ1Y3QKLSAgICB7Ci0gICAgICAgIHU4ICAqcFN0cmVhbTsgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHN0cmVhbSB0byBiZSBkZWNvZGVkICAgICAgICAgICovCi0gICAgICAgIHUzMiAgZGF0YUxlbjsgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYnl0ZXMgdG8gYmUgZGVjb2RlZCAgICAgICAgICAgICovCi0gICAgICAgIHUzMiAgcGljSWQ7ICAgICAgICAgICAgICAvKiBJZGVudGlmaWVyIGZvciB0aGUgcGljdHVyZSB0byBiZSBkZWNvZGVkICovCi0gICAgICAgIHUzMiBpbnRyYUNvbmNlYWxtZW50TWV0aG9kOyAvKiAwID0gR3JheSBjb25jZWFsbWVudCBmb3IgaW50cmEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPSBSZWZlcmVuY2UgY29uY2VhbG1lbnQgZm9yIGludHJhICovCi0KLSAgICB9IEgyNjRTd0RlY0lucHV0OwotCi0KLSAgICAvKiBPdXRwdXQgc3RydWN0dXJlICovCi0gICAgdHlwZWRlZiBzdHJ1Y3QKLSAgICB7Ci0gICAgICAgIHU4ICAqcFN0cm1DdXJyUG9zOyAgICAgIC8qIFBvaW50ZXIgdG8gc3RyZWFtIHBvc2l0aW9uIHdoZXJlIGRlY29kZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kZWQgdXAgKi8KLSAgICB9IEgyNjRTd0RlY091dHB1dDsKLQotICAgIC8qIE91dHB1dCBzdHJ1Y3R1cmUgZm9yIEgyNjRTd0RlY05leHRQaWN0dXJlICovCi0gICAgdHlwZWRlZiBzdHJ1Y3QKLSAgICB7Ci0gICAgICAgIHUzMiAqcE91dHB1dFBpY3R1cmU7ICAgIC8qIFBvaW50ZXIgdG8gdGhlIHBpY3R1cmUsIFlVViBmb3JtYXQgICAgICAgKi8KLSAgICAgICAgdTMyIHBpY0lkOyAgICAgICAgICAgICAgLyogSWRlbnRpZmllciBvZiB0aGUgcGljdHVyZSB0byBiZSBkaXNwbGF5ZWQqLwotICAgICAgICB1MzIgaXNJZHJQaWN0dXJlOyAgICAgICAvKiBGbGFnIHRvIGluZGljYXRlIGlmIHRoZSBwaWN0dXJlIGlzIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEUiBwaWN0dXJlICovCi0gICAgICAgIHUzMiBuYnJPZkVyck1CczsgICAgICAgIC8qIE51bWJlciBvZiBjb25jZWFsZWQgTUIncyBpbiB0aGUgcGljdHVyZSAgKi8KLSAgICB9IEgyNjRTd0RlY1BpY3R1cmU7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4yLiBTdHJ1Y3R1cmVzIGZvciBpbmZvcm1hdGlvbiBpbnRlcmNoYW5nZSB3aXRoIERFQyBBUEkKLSAgICAgICAgIGFuZCB1c2VyIGFwcGxpY2F0aW9uLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIHR5cGVkZWYgc3RydWN0Ci0gICAgewotICAgICAgICB1MzIgY3JvcExlZnRPZmZzZXQ7Ci0gICAgICAgIHUzMiBjcm9wT3V0V2lkdGg7Ci0gICAgICAgIHUzMiBjcm9wVG9wT2Zmc2V0OwotICAgICAgICB1MzIgY3JvcE91dEhlaWdodDsKLSAgICB9IENyb3BQYXJhbXM7Ci0KLSAgICB0eXBlZGVmIHN0cnVjdAotICAgIHsKLSAgICAgICAgdTMyIHByb2ZpbGU7Ci0gICAgICAgIHUzMiBwaWNXaWR0aDsKLSAgICAgICAgdTMyIHBpY0hlaWdodDsKLSAgICAgICAgdTMyIHZpZGVvUmFuZ2U7Ci0gICAgICAgIHUzMiBtYXRyaXhDb2VmZmljaWVudHM7Ci0gICAgICAgIHUzMiBwYXJXaWR0aDsKLSAgICAgICAgdTMyIHBhckhlaWdodDsKLSAgICAgICAgdTMyIGNyb3BwaW5nRmxhZzsKLSAgICAgICAgQ3JvcFBhcmFtcyBjcm9wUGFyYW1zOwotICAgIH0gSDI2NFN3RGVjSW5mbzsKLQotICAgIC8qIFZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICB0eXBlZGVmIHN0cnVjdAotICAgIHsKLSAgICAgICAgdTMyIG1ham9yOyAgICAvKiBEZWNvZGVyIEFQSSBtYWpvciB2ZXJzaW9uICovCi0gICAgICAgIHUzMiBtaW5vcjsgICAgLyogRG5jb2RlciBBUEkgbWlub3IgdmVyc2lvbiAqLwotICAgIH0gSDI2NFN3RGVjQXBpVmVyc2lvbjsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBQcm90b3R5cGVzIG9mIERlY29kZXIgQVBJIGZ1bmN0aW9ucwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIEgyNjRTd0RlY1JldCBIMjY0U3dEZWNEZWNvZGUoSDI2NFN3RGVjSW5zdCAgICAgIGRlY0luc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY0U3dEZWNJbnB1dCAgICAgKnBJbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRTd0RlY091dHB1dCAgICAqcE91dHB1dCk7Ci0KLSAgICBIMjY0U3dEZWNSZXQgSDI2NFN3RGVjSW5pdChIMjY0U3dEZWNJbnN0ICpkZWNJbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiAgICAgICAgICAgIG5vT3V0cHV0UmVvcmRlcmluZyk7Ci0KLSAgICBIMjY0U3dEZWNSZXQgSDI2NFN3RGVjTmV4dFBpY3R1cmUoSDI2NFN3RGVjSW5zdCAgICAgZGVjSW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NFN3RGVjUGljdHVyZSAqcE91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyICAgICAgICAgICAgICAgZW5kT2ZTdHJlYW0pOwotCi0gICAgSDI2NFN3RGVjUmV0IEgyNjRTd0RlY0dldEluZm8oSDI2NFN3RGVjSW5zdCBkZWNJbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRTd0RlY0luZm8gKnBEZWNJbmZvKTsKLQotICAgIHZvaWQgIEgyNjRTd0RlY1JlbGVhc2UoSDI2NFN3RGVjSW5zdCBkZWNJbnN0KTsKLQotICAgIEgyNjRTd0RlY0FwaVZlcnNpb24gSDI2NFN3RGVjR2V0QVBJVmVyc2lvbih2b2lkKTsKLQotICAgIC8qIGZ1bmN0aW9uIHByb3RvdHlwZSBmb3IgQVBJIHRyYWNlICovCi0gICAgdm9pZCBIMjY0U3dEZWNUcmFjZShjaGFyICopOwotCi0gICAgLyogZnVuY3Rpb24gcHJvdG90eXBlIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAqLwotICAgIHZvaWQqIEgyNjRTd0RlY01hbGxvYyh1MzIgc2l6ZSwgdTMyIG51bSk7Ci0KLSAgICAvKiBmdW5jdGlvbiBwcm90b3R5cGUgZm9yIG1lbW9yeSBmcmVlICovCi0gICAgdm9pZCBIMjY0U3dEZWNGcmVlKHZvaWQgKnB0cik7Ci0KLSAgICAvKiBmdW5jdGlvbiBwcm90b3R5cGUgZm9yIG1lbW9yeSBjb3B5ICovCi0gICAgdm9pZCBIMjY0U3dEZWNNZW1jcHkodm9pZCAqZGVzdCwgdm9pZCAqc3JjLCB1MzIgY291bnQpOwotCi0gICAgLyogZnVuY3Rpb24gcHJvdG90eXBlIGZvciBtZW1zZXQgKi8KLSAgICB2b2lkIEgyNjRTd0RlY01lbXNldCh2b2lkICpwdHIsIGkzMiB2YWx1ZSwgdTMyIGNvdW50KTsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogSDI2NFNXREVDQVBJX0ggKi8KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9pbmMvYmFzZXR5cGUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9pbmMvYmFzZXR5cGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNkNTY1My4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvaW5jL2Jhc2V0eXBlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0jaWZuZGVmIEJBU0VUWVBFX0hfSU5DTFVERUQKLSNkZWZpbmUgQkFTRVRZUEVfSF9JTkNMVURFRAotCi0KLSNpZmRlZiBfX2FybQotI2RlZmluZSBWT0xBVElMRSB2b2xhdGlsZQotI2Vsc2UKLSNkZWZpbmUgVk9MQVRJTEUKLSNlbmRpZgotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1ODsKLXR5cGVkZWYgc2lnbmVkIGNoYXIgICAgIGk4OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdTE2OwotdHlwZWRlZiBzaWduZWQgc2hvcnQgICAgaTE2OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgdTMyOwotdHlwZWRlZiBzaWduZWQgaW50ICAgICAgaTMyOwotCi0jaWYgZGVmaW5lZChWQzFTV0RFQ18xNkJJVCkgfHwgZGVmaW5lZChNUDRFTkNfQVJNMTEpCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICB1MTZ4OwotdHlwZWRlZiBzaWduZWQgc2hvcnQgICAgaTE2eDsKLSNlbHNlCi10eXBlZGVmIHVuc2lnbmVkIGludCAgICB1MTZ4OwotdHlwZWRlZiBzaWduZWQgaW50ICAgICAgaTE2eDsKLSNlbmRpZgotCi0KLSNpZm5kZWYgTlVMTAotI2lmZGVmICBfX2NwbHVzcGx1cwotI2RlZmluZSBOVUxMIDAKLSNlbHNlCi0jZGVmaW5lIE5VTEwgKCh2b2lkICopMCkKLSNlbmRpZgotI2VuZGlmCi0KLSNlbmRpZiAgLyogQkFTRVRZUEVfSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL0FSTV9ERUxJVkVSWS5UWFQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvQVJNX0RFTElWRVJZLlRYVApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNlNzBjYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvQVJNX0RFTElWRVJZLlRYVAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLVRoZSBjb250ZW50cyBvZiB0aGlzIHRyYW5zYWN0aW9uIHdhcyBjcmVhdGVkIGJ5IEhlZGxleSBGcmFuY2lzCi1vZiBBUk0gb24gMTktRmViLTIwMDguCi0KLUl0IGNvbnRhaW5zIHRoZSBBUk0gZGF0YSB2ZXJzaW9ucyBsaXN0ZWQgYmVsb3cuCi0KLVRoaXMgZGF0YSwgdW5sZXNzIG90aGVyd2lzZSBzdGF0ZWQsIGlzIEFSTSBQcm9wcmlldGFyeSBhbmQgYWNjZXNzIHRvIGl0Ci1pcyBzdWJqZWN0IHRvIHRoZSBhZ3JlZW1lbnRzIGluZGljYXRlZCBiZWxvdy4KLQotSWYgeW91IGV4cGVyaWVuY2UgcHJvYmxlbXMgd2l0aCB0aGlzIGRhdGEsIHBsZWFzZSBjb250YWN0IEFSTSBzdXBwb3J0Ci1xdW90aW5nIHRyYW5zYWN0aW9uIHJlZmVyZW5jZSA8OTc0MTM+LgotCi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi0KLS0gT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEKLSAgVmlkZW8gY29kZWNzIC0gb3B0aW1pc2VkIGNvZGUKLSAgVjYgb3B0aW1pemVkIGNvZGUgcmVsZWFzZSBmb3IgSGFudHJvIChWZXIgMS4wLjIpCi0gIGludGVybmFsIGFjY2VzcwotCi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi0KLVRoaXMgdHJhbnNhY3Rpb24gY29udGFpbnMgZGVsaXZlcmFibGVzIHdoaWNoIGFyZSBkZXNpZ25hdGVkIGFzIGJlaW5nIG9mCi1iZXRhIHJlbGVhc2Ugc3RhdHVzIChCRVQpLgotCi1CZXRhIHJlbGVhc2Ugc3RhdHVzIGhhcyBhIHBhcnRpY3VsYXIgbWVhbmluZyB0byBBUk0gb2Ygd2hpY2ggdGhlIHJlY2lwaWVudAotbXVzdCBiZSBhd2FyZS4gQmV0YSBpcyBhIHByZS1yZWxlYXNlIHN0YXR1cyBpbmRpY2F0aW5nIHRoYXQgdGhlIGRlbGl2ZXJhYmxlCi1zbyBkZXNjcmliZWQgaXMgYmVsaWV2ZWQgdG8gcm9idXN0bHkgZGVtb25zdHJhdGUgc3BlY2lmaWVkIGJlaGF2aW91ciwgdG8gYmUKLWNvbnNpc3RlbnQgYWNyb3NzIGl0cyBpbmNsdWRlZCBhc3BlY3RzIGFuZCBiZSByZWFkeSBmb3IgZ2VuZXJhbCBkZXBsb3ltZW50LgotQnV0IEJldGEgYWxzbyBpbmRpY2F0ZXMgdGhhdCBwcmUtcmVsZWFzZSByZWxpYWJpbGl0eSB0cmlhbHMgYXJlIG9uZ29pbmcgYW5kCi10aGF0IGl0IGlzIHBvc3NpYmxlIHJlc2lkdWFsIGRlZmVjdHMgb3IgZXJyb3JzIGluIG9wZXJhdGlvbiwgY29uc2lzdGVuY3kKLWFuZCBkb2N1bWVudGF0aW9uIG1heSBzdGlsbCBiZSBlbmNvdW50ZXJlZC4gVGhlIHJlY2lwaWVudCBzaG91bGQgY29uc2lkZXIKLXRoaXMgcG9zaXRpb24gd2hlbiB1c2luZyB0aGlzIEJldGEgbWF0ZXJpYWwgc3VwcGxpZWQuIEFSTSB3aWxsIG5vcm1hbGx5Ci1hdHRlbXB0IHRvIHByb3ZpZGUgZml4ZXMgb3IgYSB3b3JrLWFyb3VuZCBmb3IgZGVmZWN0cyBpZGVudGlmaWVkIGJ5IHRoZQotcmVjaXBpZW50LCBidXQgdGhlIHByb3Zpc2lvbiBvciB0aW1lbGluZXNzIG9mIHRoaXMgc3VwcG9ydCBjYW5ub3QgYmUKLWd1YXJhbnRlZWQuIEFSTSBzaGFsbCBub3QgYmUgcmVzcG9uc2libGUgZm9yIGRpcmVjdCBvciBjb25zZXF1ZW50aWFsCi1kYW1hZ2VzIGFzIGEgcmVzdWx0IG9mIGVuY291bnRlcmluZyBvbmUgb3IgbW9yZSBvZiB0aGVzZSByZXNpZHVhbCBkZWZlY3RzLgotQnkgYWNjZXB0aW5nIGEgQmV0YSByZWxlYXNlLCB0aGUgcmVjaXBpZW50IGFncmVlcyB0byB0aGVzZSBjb25zdHJhaW50cyBhbmQKLXRvIHByb3ZpZGluZyByZWFzb25hYmxlIGluZm9ybWF0aW9uIHRvIEFSTSB0byBlbmFibGUgdGhlIHJlcGxpY2F0aW9uIG9mIHRoZQotZGVmZWN0cyBpZGVudGlmaWVkIGJ5IHRoZSByZWNpcGllbnQuIFRoZSBzcGVjaWZpYyBCZXRhIHZlcnNpb24gc3VwcGxpZWQKLXdpbGwgbm90IGJlIHN1cHBvcnRlZCBhZnRlciByZWxlYXNlIG9mIGEgbGF0ZXIgb3IgaGlnaGVyIHN0YXR1cyB2ZXJzaW9uLgotSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgU3VwcG9ydCBmb3IgdGhlIEJldGEgcmVsZWFzZSBvZiB0aGUgZGVsaXZlcmFibGUKLXdpbGwgb25seSBiZSBwcm92aWRlZCBieSBBUk0gdG8gYSByZWNpcGllbnQgd2hvIGhhcyBhIGN1cnJlbnQgc3VwcG9ydCBhbmQKLW1haW50ZW5hbmNlIGNvbnRyYWN0IGZvciB0aGUgZGVsaXZlcmFibGUuCi0KLQotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQotCi1JbiBhZGRpdGlvbiB0byB0aGUgZGF0YSB2ZXJzaW9ucyBsaXN0ZWQgYWJvdmUsIHRoaXMgdHJhbnNhY3Rpb24gY29udGFpbnMKLXR3byBhZGRpdGlvbmFsIGZpbGVzIGF0IHRoZSB0b3AgbGV2ZWwuCi0KLVRoZSBmaXJzdCBpcyB0aGlzIGZpbGUsIEFSTV9ERUxJVkVSWV85NzQxMy5UWFQsIHdoaWNoIGlzIHRoZSBkZWxpdmVyeQotbm90ZS4KLQotVGhlIHNlY29uZCBpcyBBUk1fTUFOSUZFU1RfOTc0MTMuVFhUIHdoaWNoIGNvbnRhaW5zIGEgbWFuaWZlc3Qgb2YgYWxsIHRoZQotZmlsZXMgaW5jbHVkZWQgaW4gdGhpcyB0cmFuc2FjdGlvbiwgdG9nZXRoZXIgd2l0aCB0aGVpciBjaGVja3N1bXMuCi0KLVRoZSBjaGVja3N1bXMgcHJvdmlkZWQgYXJlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuCi1NRDUgTWVzc2FnZS1EaWdlc3QgQWxnb3JpdGhtLgotCi1UaGUgY2hlY2tzdW1zIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGUgaW50ZWdyaXR5IG9mIHRoaXMgZGF0YSB1c2luZyB0aGUKLSJtZDVzdW0iIHRvb2wgKHdoaWNoIGlzIHBhcnQgb2YgdGhlIEdOVSAidGV4dHV0aWxzIiBwYWNrYWdlKSBieSBydW5uaW5nOgotCi0gICUgbWQ1c3VtIC0tY2hlY2sgQVJNX01BTklGRVNUXzk3NDEzLlRYVAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvQVJNX01BTklGRVNULlRYVCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9BUk1fTUFOSUZFU1QuVFhUCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjIyMzhiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9BUk1fTUFOSUZFU1QuVFhUCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvCi0JCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvCi1lMDQ5NzkxY2ZhYjYwNjBhMDhjYmFjN2IzYWQ3NjdkNiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fcy5oCi1lZDc5OGZhY2UyNTQ5N2IyNzAzZWRlNzM2ZDZkNTJiNiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL29teHR5cGVzX3MuaAotNGVlYmQ2M2FmMDg3Mzc2ODExZDY3NDlmMDY0NmI4NjQgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX0JpdERlY19zLmgKLTQzY2Y0NmMyY2YyZmUxZjkzYzYxNWI1N2JjYmU0ODA5ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTS5oCi04ZjI0OGNlYWFjOGY2MDJlMjc3YTUyMWI2NzlkY2JiZSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fSURDVFRhYmxlLmgKLTUzZjJhZThhOTg0OTVmMDVlMjZhNGNmODYyYTdmNzUwICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9WZXJzaW9uLmgKLTNhMmY0MjBkZGY2YTFiOTUwNDcwYmQwZjVlYmQ1YzYyICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9JRENUX3MuaAotNTExYzBiYjUzNGZlMjIzNTk5ZTJjODRlZmYyNGM5ZWQgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oCi04OTcxOTMyZDU2ZWVkNmIxYWQxYmE1MDdmMGJmZjVmMCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fQml0c3RyZWFtLmgKLWY4N2ZlZGQ5Y2E0MzJmZWZhNzU3MDA4MTc2ODY0ZWY4ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtT01YLmgKLThlNDk4OTlhNDI4ODIyYzM2ZWY5ZGQ5NGUwZTA1ZjE4ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvb214dHlwZXMuaAotNjk0MjgxZDExYWY1MmY4OGU2ZjlkNGNiMjI2YWM4YTcgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2J1aWxkX3ZjLnBsCi1lNzJkOTZjMGE0MTU0NTk3NDhkZjk4MDdmM2RhZTcyZiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvZmlsZWxpc3RfdmMudHh0Ci0JCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9zcmMvCi01ZWVhZTY1OWEyOTQ3N2Y1YzUyMjk2ZDI0YWZmZmQzYyAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvc3JjL2FybUNPTU1fSURDVFRhYmxlLmMKLWQ2NGNkY2YzOGY3NzQ5ZGM3Zjc3NDY1ZTViN2QzNTZkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS9zcmMvYXJtQ09NTV9NYXNrVGFibGUuYwotCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvCi0JCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC8KLQkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy8KLWU3ZTBjMzIwOTc4NTY0YTdjOWIyYzcyMzc0OWE5OGQ2ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCi00YWRjZDBkZjA4MTk5MGJkZmM0NzI5MDQxYTJhOTE1MiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYwotODUyZTA0MDQxNDI5NjVkYzFmM2FhN2YwMGVlNTEyN2IgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucwotNzA1NDE1MWM1YmZlYTZiNWU3NGZlZWU4NmIyZDdiMDEgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKLTM4OTQ0YzVlMGJiYTAxZTMyZmYzNDljMmM4N2M3MWIyICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucwotMzJmZjRiOGJlNjJlMmYwZjNlNzY0YjgzYzFlNWUyZmQgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCi05MGIwZTZhMDRlNzY0OTAyYzBhMDkwMzY0MGMxMGIzMiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MucwotMjhhMTlhZTRmZTIyNTg2MjgwODBkNmE4OWJiNTRiOTEgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucwotOThlMTk2YjllMWZmZWJhZjkxZjYyZWE5ZDE3ZmI5N2QgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMKLTAxYmE2MGVmZjY2ZWE0OWE0ZjgzM2NlNjI3OWY4ZTJmICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKLWYzMDFkNWE5NWUwNzM1NGY1OTNlYTU3NDdjMDFjYjBhICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCi00NGM5ZWYyMWU4NDBhMTAwMzAxZjdkN2E0MTg5OTU3YyAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMKLWEzM2IwM2JiZDMzNTJkMjRlZDc0NDc2OWUxMmJiODdkICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zCi0wMGMyMGJmZGE2N2JiODYwOTZiNjE1ZmMxN2M5NGIzNSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zCi0yZGRjYWY2MGE4ZWExZTZlNmI3NzczN2Y3NjhiZmI5ZCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5zCi1jMzAwMmFhZDU2MDBmODcyYjcwYTVkN2ZlMzkxNTg0NiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMKLWEyOTAwZjJjNDdmMWM2MWQyMGJkNmMxZWRhMzNkNmQ0ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5zCi1lNGZlY2Q2NmJjNDdmMDc1MzliYzMwODkzNWU4NGExZiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLnMKLTc4ODE1YzlkZjUwYmE1MzEzMWJiMjJkMmI4MjllM2MzICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5zCi0xOTA5YWUzMTJhYzc5YTAzYTVmYWMxZDFlOGJjMDI5MSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zCi0zZDJjNDg1ODA2NTU5MjgwNjVkZTc4Mzk4NjZkOWJjNCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMKLTIzYWEyZmRmMTU1ZDRmYTZmZjc0NWVhYjZlMDFmMzJiICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5zCi05N2YyMGE5M2M0ODFkN2Y2MTczZDkxOWY0MWU0MTViZCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zCi1iZWNkNTEyZGEyMDI0MzYyODY4MTFiNmFlYzA2MWY0NyAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucwotZGQyNGE5OWFlM2NkODQyZGNhY2FmMzFkNDdkZTg4YjMgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKLWMyZDk5NWY3ODdiNmY0NGVmMTBjNzUxYzEyZDE5MzVmICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucwotMzYyOGZiZGYwY2QyMTdjMjg3YjZjY2M5NDEzNWQwNmUgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5zCi00YTUyYjNlOWUyNjhiOGE4ZjA3ODI5YmY1MDBkMDNhZiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucwotMTEyNDlmOGE5OGM1ZDRiODRjYjU1NzViMGUzN2NhOWMgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucwotMzU5OWIxMDc0MzMwOTY1YzhjYTI4NWQxNjRlZmNjZmYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLnMKLTMzMzllMDI2YzdkZTY1NWQ5NDAwOTQ5ZWI1ZTUxNDUxICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMKLWNjNGE2ZjMyZGIwYjcyYTkxZDNmMjc4ZjY4NTVkZjY5ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKLQkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL2FwaS8KLTZlNTMwZGRhYTdjMmI1N2ZmZTg4MTYyYzAyMGNiNjYyICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCi0JCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyLwotCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvCi1jZGY0MTI5MjBjMjAzN2E3MjVkMDQyMDAwMmI2NzUyZSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NsaXA4X3MucwotZGJhOTgyNGU5NTliMjFkNDAxY2FjOTI1ZTY4YTExYTYgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXJfcy5zCi1iNTU5YjcxZDVjOTQ2MjdmMTBlNjE2ZmI3MmMwY2VmYyAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMKLTRmYmE0YzQzMWE3ODNhNzhhMmViNjQ5N2E5NGFjOTY3ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCi0xZTRjM2JlOGM1ZWRkYzAwYzlmMDVlODNiY2YzMTVlZiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9ja19zLnMKLTFiMGIyOTkwYzI2NjlkZmI4N2NmNmI4MTA2MTFjMDFiICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKLTFjOWI4N2FiZjMyODNlOTU3ODE2YjM5MzdjNjgwNzAxICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMKLTRmZTFhZmNhNjU5YTkwNTVmYzExNzJlNThmNzhhNTA2ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKLTJlYTA2N2YwNDM2ZjkxYmExMzUxZWRhZjQxMWNiNGVhICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCi1hY2I5MmJlMWRiY2RiM2ViZTgyNGNiZTllMjhkMDNiZiAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGtfcy5zCi1hNmI0MWYwMWIxZGY3ZGQ2NTZlYmRiYTMwODRiZmEyYSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zCi0yOTNhNDhhNjQ4YTMwODU0NTZlNjY2NWJiNzM2NmZhZCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXJfcy5zCi1mZmU2Yjk2Yzc0ZDQ4ODFmNGQzYzhkZThjYzczNzc5NyAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSV9zLnMKLTQzN2RmYTIwNDUwODg1MGQ2MWQ0Yjg3MDkxNDQ2ZTlmICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zCi1mZjU5MTVkMTgxYmZkMmNkMmYwYmQ1ODhiZDIzMDBkYyAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDX3MucwotNjc3NWViMGM1NjFkYmFiOTY1YzYwZjg1YjA4Yzk2ZmQgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zCi1hMGQ4NWY0ZjUxN2M5NDVhNGM5MzE3YWMwMjFmMmQwOCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zCi0zODYwMjBkZWU4YjcyNWM3ZmUyNTI2ZjFmYzIxMWQ3ZCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCi0JCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL2FwaS8KLTQ2MjRlN2M4MzhlMTBhMjQ5YWJjYzNkM2Y0ZjQwNzQ4ICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKLTY1ZTEwNTdkMDRlMmNiODQ0NTU5ZGM5ZjZlMDk3OTVhICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCi0JCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9zcmMvCi1lNjI3YjMzNDZiMGRjOWFmZjE0NDQ2MDA1Y2UwZmE0MyAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvc3JjL2FybVZDX1ZlcnNpb24uYwotCQkJCSAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvYXBpLwotN2NhOTRiMWMzM2FjMDIxMWUxN2QzOGJhYWRkN2QxZGQgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS9hcm1WQy5oCi0xMmNmNzU5NmVkYmJmNjA0OGI2MjZkMTVlOGQwZWQ0OCAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvYXBpL29teFZDLmgKLTExNzI2ZTI4NmE4MTI1N2NiNDVmNTU0N2ZiNGQzNzRjICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvb214VkNfcy5oCi1hNWIyYWY2MDVjMzE5Y2QyNDkxMzE5ZTQzMDc0MTM3NyAgT1gwMDEtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvYXBpL2FybVZDQ09NTV9zLmgKLQkJCQkgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vCi0JCQkJICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy8KLTUwY2NhNjk1NGM0NDdiMDEyYWIzOWNhNzg3MmU1ZThmICBPWDAwMS1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2X3MucwotZDFjM2JjZTc3ZmM1Nzc0Yzg5OWI0NDdkMTNmMDJjZDAgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4X3MucwotZmRhYzFkMWJhZDNmZDIzYzg4MGJlYjM5YmMyZTg5YWEgIE9YMDAxLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JX3MucwotNmQ5YWRjMmJlNWJkMDMxMTU5MTAzMGQwYzZkZjc3MWMgIEFSTV9ERUxJVkVSWV85NzQxMy5UWFQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYjk3ZTIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybUNPTU0uaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogICAKLSAqIEZpbGU6IGFybUNPTU0uaAotICogQnJpZWY6IERlY2xhcmVzIENvbW1vbiBBUElzL0RhdGEgVHlwZXMgdXNlZCBhY3Jvc3MgT3Blbk1BWCBBUEkncwotICoKLSAqLwotIAotICAKLSNpZm5kZWYgX2FybUNvbW1vbl9IXwotI2RlZmluZSBfYXJtQ29tbW9uX0hfCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotCi10eXBlZGVmIHN0cnVjdAotewotICBPTVhfRjMyIFJlOyAvKiogUmVhbCBwYXJ0ICovCi0gIE9NWF9GMzIgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKLSAgICAgICAgCi19IE9NWF9GQzMyOyAvKiogc2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBjb21wbGV4IG51bWJlciAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICBPTVhfRjY0IFJlOyAvKiogUmVhbCBwYXJ0ICovCi0gIE9NWF9GNjQgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKLSAgICAgICAgCi19IE9NWF9GQzY0OyAvKiogZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBjb21wbGV4IG51bWJlciAqLwotCi0KLS8qIFVzZWQgYnkgYm90aCBJUCBhbmQgSUMgZG9tYWlucyBmb3IgOHg4IEpQRUcgYmxvY2tzLiAqLwotdHlwZWRlZiBPTVhfUzE2IEFSTV9CTE9DSzh4OFs2NF07Ci0KLQotI2luY2x1ZGUgImFybU9NWC5oIgotCi0jZGVmaW5lICBhcm1QSSAoT01YX0Y2NCkoMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIENvbXBpbGVyIGV4dGVuc2lvbnMgKi8KLSNpZmRlZiBBUk1fREVCVUcKLS8qIGRlYnVnIHZlcnNpb24gKi8KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2RlZmluZSBhcm1FcnJvcihzdHIpIHtwcmludGYoKHN0cikpOyBwcmludGYoIlxuIik7IGV4aXQoLTEpO30KLSNkZWZpbmUgYXJtV2FybihzdHIpIHtwcmludGYoKHN0cikpOyBwcmludGYoIlxuIik7fQotI2RlZmluZSBhcm1JZ25vcmUoYSkgKCh2b2lkKWEpCi0jZGVmaW5lIGFybUFzc2VydChhKSBhc3NlcnQoYSkKLSNlbHNlIAotLyogcmVsZWFzZSB2ZXJzaW9uICovCi0jZGVmaW5lIGFybUVycm9yKHN0cikgKCh2b2lkKSAoc3RyKSkKLSNkZWZpbmUgYXJtV2FybihzdHIpICAoKHZvaWQpIChzdHIpKQotI2RlZmluZSBhcm1JZ25vcmUoYSkgICgodm9pZCkgKGEpKQotI2RlZmluZSBhcm1Bc3NlcnQoYSkgICgodm9pZCkgKGEpKQotI2VuZGlmIC8qIEFSTV9ERUJVRyAqLwotCi0vKiBBcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KLQotI2RlZmluZSBhcm1NaW4oYSxiKSAgICAgICAgICAgICAoIChhKSA+IChiKSA/ICAoYik6KGEpICkKLSNkZWZpbmUgYXJtTWF4KGEsYikgICAgICAgICAgICAgKCAoYSkgPiAoYikgPyAgKGEpOihiKSApCi0jZGVmaW5lIGFybUFicyhhKSAgICAgICAgICAgICAgICggKGEpIDwgIDAgID8gLShhKTooYSkgKQotCi0vKiBBbGlnbm1lbnQgb3BlcmF0aW9uICovCi0KLSNkZWZpbmUgYXJtQWxpZ25Ub0J5dGVzKFB0cixOKSAgICAgIChQdHIgKyAoICgoTi0oaW50KVB0cikmKE4tMSkpIC8gc2l6ZW9mKCpQdHIpICkpCi0jZGVmaW5lIGFybUFsaWduVG8yQnl0ZXMoUHRyKSAgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDIpCi0jZGVmaW5lIGFybUFsaWduVG80Qnl0ZXMoUHRyKSAgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDQpCi0jZGVmaW5lIGFybUFsaWduVG84Qnl0ZXMoUHRyKSAgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDgpCi0jZGVmaW5lIGFybUFsaWduVG8xNkJ5dGVzKFB0cikgICAgICBhcm1BbGlnblRvQnl0ZXMoUHRyLDE2KQotCi0vKiBFcnJvciBhbmQgQWxpZ25tZW50IGNoZWNrICovCi0KLSNkZWZpbmUgYXJtUmV0QXJnRXJySWYoY29uZGl0aW9uLCBjb2RlKSAgaWYoY29uZGl0aW9uKSB7IHJldHVybiAoY29kZSk7IH0KLSNkZWZpbmUgYXJtUmV0RGF0YUVycklmKGNvbmRpdGlvbiwgY29kZSkgaWYoY29uZGl0aW9uKSB7IHJldHVybiAoY29kZSk7IH0KLQotI2lmbmRlZiBBTElHTk1FTlRfRE9FU05UX01BVFRFUgotI2RlZmluZSBhcm1Jc0J5dGVBbGlnbmVkKFB0cixOKSAgICAgKCgoKGludCkoUHRyKSkgJSBOKT09MCkKLSNkZWZpbmUgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLE4pICAgICgoKChpbnQpKFB0cikpICUgTikhPTApCi0jZWxzZQotI2RlZmluZSBhcm1Jc0J5dGVBbGlnbmVkKFB0cixOKSAgICAgKDEpCi0jZGVmaW5lIGFybU5vdEJ5dGVBbGlnbmVkKFB0cixOKSAgICAoMCkKLSNlbmRpZgotCi0jZGVmaW5lIGFybUlzMkJ5dGVBbGlnbmVkKFB0cikgICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciwyKQotI2RlZmluZSBhcm1JczRCeXRlQWxpZ25lZChQdHIpICAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsNCkKLSNkZWZpbmUgYXJtSXM4Qnl0ZUFsaWduZWQoUHRyKSAgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDgpCi0jZGVmaW5lIGFybUlzMTZCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciwxNikKLQotI2RlZmluZSBhcm1Ob3QyQnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDIpCi0jZGVmaW5lIGFybU5vdDRCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsNCkKLSNkZWZpbmUgYXJtTm90OEJ5dGVBbGlnbmVkKFB0cikgICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciw4KQotI2RlZmluZSBhcm1Ob3QxNkJ5dGVBbGlnbmVkKFB0cikgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDE2KQotI2RlZmluZSBhcm1Ob3QzMkJ5dGVBbGlnbmVkKFB0cikgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDMyKQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TMTZfcmVmL2FybVJvdW5kRmxvYXRUb1MzMl9yZWYvYXJtUm91bmRGbG9hdFRvUzY0Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludC9pbnQgYWZ0ZXIgcm91bmRpbmcKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2L09NWF9TMzIgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9TMTYgYXJtUm91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKTsKLU9NWF9TMzIgYXJtUm91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKTsKLU9NWF9TNjQgYXJtUm91bmRGbG9hdFRvUzY0IChPTVhfRjY0IFZhbHVlKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvUzE2X3JlZi9hcm1TYXRSb3VuZEZsb2F0VG9TMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50L2ludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYvT01YX1MzMiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1MxNiBhcm1TYXRSb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpOwotT01YX1MzMiBhcm1TYXRSb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9VMTZfcmVmL2FybVNhdFJvdW5kRmxvYXRUb1UzMgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSB1bnNpZ25lZCBzaG9ydCBpbnQvaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1UxNi9PTVhfVTMyIGZvcm1hdAotICoKLSAqLwotCi1PTVhfVTE2IGFybVNhdFJvdW5kRmxvYXRUb1UxNiAoT01YX0Y2NCBWYWx1ZSk7Ci1PTVhfVTMyIGFybVNhdFJvdW5kRmxvYXRUb1UzMiAoT01YX0Y2NCBWYWx1ZSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNpZ25DaGVjawotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ2hlY2tzIHRoZSBzaWduIG9mIGEgdmFyaWFibGU6Ci0gKiByZXR1cm5zIDEgaWYgaXQgaXMgUG9zaXRpdmUKLSAqIHJldHVybnMgMCBpZiBpdCBpcyAwCi0gKiByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JICAgIHZhciAgICAgVmFyaWFibGUgdG8gYmUgY2hlY2tlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9JTlQgLS0gICByZXR1cm5zIDEgaWYgaXQgaXMgUG9zaXRpdmUKLSAqICAgICAgICAgICAgICByZXR1cm5zIDAgaWYgaXQgaXMgMAotICogICAgICAgICAgICAgIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCi0gKi8gCi0gCi1PTVhfSU5UIGFybVNpZ25DaGVjayAoT01YX1MxNiB2YXIpOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1DbGlwCi0gKgotICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCi0gKiAKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKLSAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAotICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1MzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQotICovIAotIAotT01YX1MzMiBhcm1DbGlwICgKLSAgICAgICAgT01YX0lOVCBtaW4sCi0gICAgICAgIE9NWF9JTlQgbWF4LCAKLSAgICAgICAgT01YX1MzMiBzcmMKLSAgICAgICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtQ2xpcF9GMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKLSAqIAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAotICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCi0gKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfRjMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCi0gKi8gCi0gCi1PTVhfRjMyIGFybUNsaXBfRjMyICgKLSAgICAgICAgT01YX0YzMiBtaW4sCi0gICAgICAgIE9NWF9GMzIgbWF4LCAKLSAgICAgICAgT01YX0YzMiBzcmMKLSAgICAgICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2hpZnRTYXRfRjMyCi0gKgotICogRGVzY3JpcHRpb246IERpdmlkZXMgYSBmbG9hdCB2YWx1ZSBieSAyXnNoaWZ0IGFuZCAKLSAqIHNhdHVyYXRlcyBpdCBmb3IgdW5zaWduZWQgdmFsdWUgcmFuZ2UgZm9yIHNhdEJpdHMuCi0gKiBTZWNvbmQgcGFyYW1ldGVyIGlzIGxpa2UgInNoaWZ0aW5nIiB0aGUgY29ycmVzcG9uZGluZyAKLSAqIGludGVnZXIgdmFsdWUuIFRha2VzIGNhcmUgb2Ygcm91bmRpbmcgd2hpbGUgY2xpcHBpbmcgdGhlIGZpbmFsIAotICogdmFsdWUuCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gdiAgICAgICAgICBOdW1iZXIgdG8gYmUgb3BlcmF0ZWQgdXBvbgotICogW2luXSBzaGlmdCAgICAgIERpdmlkZXMgdGhlIGlucHV0ICJ2IiBieSAiMl5zaGlmdCIKLSAqIFtpbl0gc2F0Qml0cyAgICBGaW5hbCByYW5nZSBpcyBbMCwgMl5zYXRCaXRzKQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TMzIgLS0gICByZXR1cm5zICJzaGlmdGVkIiBzYXR1cmF0ZWQgdmFsdWUKLSAqLyAKLSAKLU9NWF9VMzIgYXJtU2hpZnRTYXRfRjMyKAotICAgICAgICBPTVhfRjMyIHYsIAotICAgICAgICBPTVhfSU5UIHNoaWZ0LCAKLSAgICAgICAgT01YX0lOVCBzYXRCaXRzCi0gICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb25zOiBhcm1Td2FwRWxlbQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBzd2FwcyB0d28gZWxlbWVudHMgYXQgdGhlIHNwZWNpZmllZCBwb2ludGVyIGxvY2F0aW9ucy4KLSAqIFRoZSBzaXplIG9mIGVhY2ggZWxlbWVudCBjb3VsZCBiZSBhbnl0aGluZyBhcyBzcGVjaWZpZWQgYnkgPGVsZW1TaXplPgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWFJlc3VsdCAtLSBFcnJvciBzdGF0dXMgZnJvbSB0aGUgZnVuY3Rpb24KLSAqLwotT01YUmVzdWx0IGFybVN3YXBFbGVtKE9NWF9VOCAqcEJ1ZjEsIE9NWF9VOCAqcEJ1ZjIsIE9NWF9JTlQgZWxlbVNpemUpOwotCi0KLS8qKgotICogRnVuY3Rpb246IGFybU1lZGlhbk9mMwotICoKLSAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgbWVkaWFuIG9mIHRocmVlIG51bWJlcnMKLSAqIAotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBmRW50cnkgICAgIEZpcnN0IGVudHJ5Ci0gKiBbaW5dIHNFbnRyeSAgICAgc2Vjb25kIGVudHJ5Ci0gKiBbaW5dIHRFbnRyeSAgICAgVGhpcmQgZW50cnkKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfUzMyIC0tICAgcmV0dXJucyB0aGUgbWVkaWFuIHZhbHVlCi0gKi8gCi0gCi1PTVhfUzMyIGFybU1lZGlhbk9mMyAoCi0gICAgT01YX1MzMiBmRW50cnksCi0gICAgT01YX1MzMiBzRW50cnksIAotICAgIE9NWF9TMzIgdEVudHJ5IAotICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUxvZ1NpemUKLSAqCi0gKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIHNpemUgb2YgYSBwb3NpdGl2ZSB2YWx1ZSBhbmQgcmV0dXJucyB0aGUgc2FtZQotICogCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHZhbHVlICAgIFBvc2l0aXZlIHZhbHVlCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1U4IC0tICAgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgcG9zaXRpdmUgdmFsdWUKLSAqLyAKLSAKLU9NWF9VOCBhcm1Mb2dTaXplICgKLSAgICBPTVhfVTE2IHZhbHVlIAotICAgICk7ICAgIAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgLyogU2F0dXJhdGluZyBBcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAotICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAKLSAqICAgIAotICoqLwotCi1PTVhfUzMyIGFybVNhdEFkZF9TMzIoCi0gICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZTEsCi0gICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZTIKLSAgICAgICAgICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzY0KCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqIAotICogICAgCi0gKiovCi0KLU9NWF9TNjQgYXJtU2F0QWRkX1M2NCgKLSAgICAgICAgICAgICAgICBPTVhfUzY0IFZhbHVlMSwKLSAgICAgICAgICAgICAgICBPTVhfUzY0IFZhbHVlMgotICAgICAgICAgICAgICAgICk7Ci0KLS8qKiBGdW5jdGlvbiA6YXJtU2F0U3ViX1MzMigpCi0gKiAKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIHN1YnN0cmFjdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0U3ViX1MzMigKLSAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZTEsCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUyCi0gICAgICAgICAgICAgICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdE1hY19TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgTXVsdGlwbGljYXRpb24gb2YgVmFsdWUxIGFuZCBWYWx1ZTIgYW5kIHN1YmVzcXVlbnQgc2F0dXJhdGVkCi0gKiAgICAgYWNjdW11bGF0aW9uIHdpdGggTWFjCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAotICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKLSAqIFtpbl0gTWFjICAgICAgICAgIEFjY3VtdWxhdG9yCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICoqLwotCi1PTVhfUzMyIGFybVNhdE1hY19TMzIoCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgTWFjLAotICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IFZhbHVlMSwKLSAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBWYWx1ZTIKLSAgICAgICAgICAgICAgICAgICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MxNlMzMl9TMzIKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgTUFDIG9wZXJhdGlvbiBvZiB0aGUgdGhyZWUgaW5wdXRzIGRlbGF5RWxlbSwgZmlsVGFwICwgbWFjCi0gKgotICogICBtYWMgPSBtYWMgKyBTYXR1cmF0ZV9pbl8zMkJpdHMoZGVsYXlFbGVtICogZmlsVGFwKQotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gZGVsYXlFbGVtICAgIEZpcnN0IDMyIGJpdCBPcGVyYW5kCi0gKiBbaW5dIGZpbFRhcCAgICAgICBTZWNvbmQgMTYgYml0IE9wZXJhbmQKLSAqIFtpbl0gbWFjICAgICAgICAgIFJlc3VsdCBvZiBNQUMgb3BlcmF0aW9uCi0gKgotICogUmV0dXJuOgotICogW291dF0gIG1hYyAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0gCi1PTVhfUzMyIGFybVNhdE1hY19TMTZTMzJfUzMyKAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBtYWMsIAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBkZWxheUVsZW0sIAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBmaWxUYXAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiByb3VuZGVkIHJpZ2h0IHNoaWZ0IG9wZXJhdGlvbiBvZiBpbnB1dCBieSB0aGUgc2NhbGVmYWN0b3IKLSAqCi0gKiAgIG91dHB1dCA9IFNhdHVyYXRlX2luXzE2Qml0cyggKCBSaWdodFNoaWZ0KCAoUm91bmQoaW5wdXQpICwgc2NhbGVGYWN0b3IgKSApCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBpbnB1dCAgICAgICBUaGUgaW5wdXQgdG8gYmUgb3BlcmF0ZWQgb24KLSAqIFtpbl0gc2NhbGVGYWN0b3IgVGhlIHNoaWZ0IG51bWJlcgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0KLQotT01YX1MxNiBhcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNigKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgaW5wdXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOVCBzY2FsZUZhY3Rvcik7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0Ci0gKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAotICogW2luXSBzaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0gCi1PTVhfUzMyIGFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMigKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU5UIHNoaWZ0Ci0gICAgICAgICAgICAgICAgICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TNjQoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAotICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKLSAqIFtpbl0gc2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotIAotT01YX1M2NCBhcm1TYXRSb3VuZExlZnRTaGlmdF9TNjQoCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzY0IFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOVCBzaGlmdAotICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzE2UzMyX1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMxNiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKLSAqICAgICBpbiBhIFMzMiBjb250YWluZXIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKLSAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotCi0KLU9NWF9TMzIgYXJtU2F0TXVsUzE2UzMyX1MzMigKLSAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBpbnB1dDEsCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgaW5wdXQyKTsKLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzMyUzMyX1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMzMiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKLSAqICAgICBpbiBhIFMzMiBjb250YWluZXIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKLSAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotCi1PTVhfUzMyIGFybVNhdE11bFMzMlMzMl9TMzIoCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgaW5wdXQxLAotICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0Mik7Ci0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtSW50RGl2QXdheUZyb21aZXJvKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6IEludGVnZXIgZGl2aXNpb24gd2l0aCByb3VuZGluZyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLiAKLSAqICAgICAgICAgICAgICAgSGFsZi1pbnRlZ2VyIHZhbHVlcyBhcmUgcm91bmRlZCBhd2F5IGZyb20gemVybwotICogICAgICAgICAgICAgICB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZC4gRm9yIGV4YW1wbGUgMy8vMiBpcyByb3VuZGVkIAotICogICAgICAgICAgICAgICB0byAyLCBhbmQgLTMvLzIgaXMgcm91bmRlZCB0byAtMi4KLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIE51bSAgICAgICAgT3BlcmFuZCAxCi0gKiBbaW5dIERlbm8gICAgICAgT3BlcmFuZCAyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbiBpbnB1dDEvL2lucHV0MgotICogICAgCi0gKiovCi0KLU9NWF9TMzIgYXJtSW50RGl2QXdheUZyb21aZXJvIChPTVhfUzMyIE51bSwgT01YX1MzMiBEZW5vKTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogRGVidWdnaW5nIG1hY3JvcwotICoKLSAqLwotCi0KLS8qCi0gKiBEZWZpbml0aW9uIG9mIG91dHB1dCBzdHJlYW0gLSBjaGFuZ2UgdG8gc3RkZXJyIGlmIG5lY2Vzc2FyeQotICovCi0jZGVmaW5lIERFQlVHX1NUUkVBTSBzdGRvdXQKLQotLyoKLSAqIERlYnVnIHByaW50ZiBtYWNyb3MsIG9uZSBmb3IgZWFjaCBhcmd1bWVudCBjb3VudC4KLSAqIEFkZCBtb3JlIGlmIG5lZWRlZC4KLSAqLwotI2lmZGVmIERFQlVHX09OCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2RlZmluZSBERUJVR19QUklOVEZfMChhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEpCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYikKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzIoYSwgYiwgYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjKQotI2RlZmluZSBERUJVR19QUklOVEZfMyhhLCBiLCBjLCBkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQpCi0jZGVmaW5lIERFQlVHX1BSSU5URl80KGEsIGIsIGMsIGQsIGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSkKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzUoYSwgYiwgYywgZCwgZSwgZikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmKQotI2RlZmluZSBERUJVR19QUklOVEZfNihhLCBiLCBjLCBkLCBlLCBmLCBnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcpCi0jZGVmaW5lIERFQlVHX1BSSU5URl83KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCkKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzgoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSkgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpKQotI2RlZmluZSBERUJVR19QUklOVEZfOShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqKSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGopCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xMChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrKSAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaykKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzExKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwpICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsKQotI2RlZmluZSBERUJVR19QUklOVEZfMTIoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSkgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0pCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xMyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuKSAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbikKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzE0KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4sIG8pICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvKQotI2Vsc2UgLyogREVCVUdfT04gKi8KLSNkZWZpbmUgREVCVUdfUFJJTlRGXzAoYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMihhLCBiLCBjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzMoYSwgYiwgYywgZCkgICAgICAgICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl80KGEsIGIsIGMsIGQsIGUpICAgICAgICAgICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfNShhLCBiLCBjLCBkLCBlLCBmKSAgICAgICAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzYoYSwgYiwgYywgZCwgZSwgZiwgZykgICAgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl83KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfOChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpKSAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzkoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaikgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xMChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrKSAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzExKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwpICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMTIoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSkgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xMyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuKSAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMTQoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbiwgbykgICAKLSNlbmRpZiAvKiBERUJVR19PTiAqLwotCi0KLS8qCi0gKiBEb21haW4gYW5kIHN1YiBkb21haW4gZGVmaW5pdGlvbnMKLSAqCi0gKiBJbiBvcmRlciB0byB0dXJuIG9uIGRlYnVnIGZvciBhbiBlbnRpcmUgZG9tYWluIG9yIHN1Yi1kb21haW4KLSAqIGF0IGNvbXBpbGUgdGltZSwgb25lIG9mIHRoZSBERUJVR19ET01BSU5fKiBiZWxvdyBtYXkgYmUgZGVmaW5lZCwKLSAqIHdoaWNoIHdpbGwgYWN0aXZhdGUgZGVidWcgaW4gYWxsIG9mIHRoZSBkZWZpbmVzIGl0IGNvbnRhaW5zLgotICovCi0KLSNpZmRlZiBERUJVR19ET01BSU5fQUMKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFQ0hBTlBBSVJFTFRfTVBFRzQKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFQ0hBTlBBSVJFTFQKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFREFUU1RSRUxUCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUZJTExFTFQKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFSVNTVEVSRU9fUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERU1TUE5TX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVNU1NURVJFT19TMzJfSQotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVQUkdDRkdFTFQKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFVE5TX1MzMl9JCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFSU5URVJMRUFWRVNQRUNUUlVNX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19FTkNPREVUTlNfUzMyX0kKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfTE9OR1RFUk1QUkVESUNUX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19MT05HVEVSTVJFQ09OU1RSVUNUX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19NRENURldEX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19NRENUSU5WX1MzMl9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfTk9JU0VMRVNTREVDT0RFCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX1FVQU5USU5WX1MzMl9JCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX1VOUEFDS0FESUZIRUFERVIKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfVU5QQUNLQURUU0ZSQU1FSEVBREVSCi0jZGVmaW5lIERFQlVHX09NWEFDTVAzX0hVRkZNQU5ERUNPREVTRkJNQlBfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDTVAzX0hVRkZNQU5ERUNPREVTRkJfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDTVAzX0hVRkZNQU5ERUNPREVfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDTVAzX01EQ1RJTlZfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDTVAzX1JFUVVBTlRJWkVTRkJfUzMyX0kKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfUkVRVUFOVElaRV9TMzJfSQotI2RlZmluZSBERUJVR19PTVhBQ01QM19TWU5USFBRTUZfUzMyX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ01QM19VTlBBQ0tGUkFNRUhFQURFUgotI2RlZmluZSBERUJVR19PTVhBQ01QM19VTlBBQ0tTQ0FMRUZBQ1RPUlNfUzgKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfVU5QQUNLU0lERUlORk8KLSNlbmRpZiAvKiBERUJVR19ET01BSU5fQUMgKi8KLQotCi0jaWZkZWYgREVCVUdfRE9NQUlOX1ZDCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfQVZFUkFHRV8xNlgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9BVkVSQUdFXzRYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfQVZFUkFHRV84WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQkxPQ0tDSFJPTUFfVThfQzFJUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQkxPQ0tMVU1BX1U4X0MxSVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUNPREVDSFJPTUFEQ0NPRUZGU1RPUEFJUkNBVkxDX1U4Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVDT0RFQ09FRkZTVE9QQUlSQ0FWTENfVTgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERVFVQU5UVFJBTlNGT1JNQUNGUk9NUEFJUl9VOF9TMTZfQzFfRExYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRVhQQU5ERlJBTUUKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HQ0hST01BX0hPUkVER0VfVThfQzFJUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdDSFJPTUFfVkVSRURHRV9VOF9DMUlSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0xVTUFfSE9SRURHRV9VOF9DMUlSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0xVTUFfVkVSRURHRV9VOF9DMUlSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfUFJFRElDVElOVFJBQ0hST01BOFg4X1U4X0MxUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1BSRURJQ1RJTlRSQV8xNlgxNl9VOF9DMVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9QUkVESUNUSU5UUkFfNFg0X1U4X0MxUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRFFVQVJfMTZYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEUVVBUl80WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRFFVQVJfOFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURfMTZYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEXzRYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEXzhYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FURF80WDQKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9UUkFOU0ZPUk1ERVFVQU5UQ0hST01BRENGUk9NUEFJUl9VOF9TMTZfQzEKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9UUkFOU0ZPUk1ERVFVQU5UTFVNQURDRlJPTVBBSVJfVThfUzE2X0MxCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNUVVBTlRfQ0hST01BREMKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9UUkFOU0ZPUk1RVUFOVF9MVU1BREMKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSEFMRl8xNlgxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9IQUxGXzhYOAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9JTlRFR0VSXzE2WDE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0lOVEVHRVJfOFg4Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9DT01QVVRFVEVYVFVSRUVSUk9SQkxPQ0tfU0FEX1U4X1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfQ09NUFVURVRFWFRVUkVFUlJPUkJMT0NLX1U4X1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfRENUOFg4QkxLRExYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVCTE9DS0NPRUZfSU5URVJfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVQQURNVl9QVk9QCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVWTENaSUdaQUdfSU5URVJfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVWTENaSUdaQUdfSU5UUkFBQ1ZMQ19TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVZMQ1pJR1pBR19JTlRSQURDVkxDX1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFTVZfVThfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVWTENaSUdaQUdfSU5URVJfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVWTENaSUdaQUdfSU5UUkFBQ1ZMQ19TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERVZMQ1pJR1pBR19JTlRSQURDVkxDX1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfRklORE1WUFJFRAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfSURDVDhYOEJMS0RMWAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfTElNSVRNVlRPUkVDVAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfTU9USU9ORVNUSU1BVElPTk1CCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNQkdSQVlfVTgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1CSE9SSVpPTlRBTF9VOAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETUJWRVJUSUNBTF9VOAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETVYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1FVQU5USU5URVJfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1FVQU5USU5UUkFfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1FVQU5USU5WSU5URVJfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1FVQU5USU5WSU5UUkFfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1RSQU5TUkVDQkxPQ0tDRU9GX0lOVEVSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9UUkFOU1JFQ0JMT0NLQ0VPRl9JTlRSQQotI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9WQyAqLwotCi0KLSNpZmRlZiBERUJVR19ET01BSU5fSUMKLS8qIFRvIGJlIGZpbGxlZCBpbiAqLwotI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9JQyAqLwotCi0KLSNpZmRlZiBERUJVR19ET01BSU5fU1AKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9ET1RQUk9EX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0JMT0NLRVhQX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0JMT0NLRVhQX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0NPUFlfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfRE9UUFJPRF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9ET1RQUk9EX1MxNl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfQ1RPQ19TQzE2X1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9DVE9DX1NDMzJfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX1JUT0NDU19TMTZTMzJfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX1JUT0NDU19TMzJfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9DX1NDMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX0NfU0MzMgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfUl9TMTZfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9SX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfQ19TQzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9DX1NDMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX1JfUzE2X1MzMgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfUl9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ0NTVE9SX1MzMlMxNl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ0NTVE9SX1MzMl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ1RPQ19TQzE2X1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DVE9DX1NDMzJfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklMVEVSTUVESUFOX1MzMl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklMVEVSTUVESUFOX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2X0lTRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNl9JU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTZfSQotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTZfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlST05FX0JJUVVBRERJUkVDVF9TMTZfSQotI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9CSVFVQURESVJFQ1RfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlST05FX0RJUkVDVF9TMTZfSQotI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9ESVJFQ1RfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlSX0JJUVVBRERJUkVDVF9TMTZfSQotI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9CSVFVQURESVJFQ1RfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlSX0RJUkVDVF9TMTZfSQotI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9ESVJFQ1RfUzE2Ci0jZW5kaWYgLyogREVCVUdfRE9NQUlOX1NQICovCi0KLQotI2lmZGVmIERFQlVHX0RPTUFJTl9JUAotI2RlZmluZSBERUJVR19PTVhJUEJNX0FERENfVThfQzFSX1NGUwotI2RlZmluZSBERUJVR19PTVhJUEJNX0NPUFlfVThfQzFSCi0jZGVmaW5lIERFQlVHX09NWElQQk1fQ09QWV9VOF9DM1IKLSNkZWZpbmUgREVCVUdfT01YSVBCTV9NSVJST1JfVThfQzFSCi0jZGVmaW5lIERFQlVHX09NWElQQk1fTVVMQ19VOF9DMVJfU0ZTCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfQ09MT1JUV0lTVFExNF9VOF9DM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19SR0I1NjVUT1lDQkNSNDIwTFNfTUNVX1UxNl9TMTZfQzNQM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19SR0I1NjVUT1lDQkNSNDIyTFNfTUNVX1UxNl9TMTZfQzNQM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19SR0I1NjVUT1lDQkNSNDQ0TFNfTUNVX1UxNl9TMTZfQzNQM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19SR0JUT1lDQkNSNDIwTFNfTUNVX1U4X1MxNl9DM1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1JHQlRPWUNCQ1I0MjJMU19NQ1VfVThfUzE2X0MzUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCVE9ZQ0JDUjQ0NExTX01DVV9VOF9TMTZfQzNQM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFJTWlJPVF9VOF9QM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFRPUkdCNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFRPUkdCNTY1X1U4X1UxNl9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwVE9SR0JMU19NQ1VfUzE2X1U4X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJSU1pDU0NST1RSR0JfVThfQzJSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJSU1pST1RfVThfUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQjU2NV9VOF9VMTZfQzJDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCTFNfTUNVX1MxNl9VOF9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0JfVThfQzJDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPWUNCQ1I0MjBST1RBVEVfVThfQzJQM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPWUNCQ1I0MjBST1RBVEVfVThfUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0NDRUT1JHQjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0NDRUT1JHQkxTX01DVV9TMTZfVThfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUlRPUkdCNTY1X1U4X1UxNl9DM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUlRPUkdCNTY1X1U4X1UxNl9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSVE9SR0JfVThfQzNSCi0jZGVmaW5lIERFQlVHX09NWElQUFBfR0VUQ0VOVFJBTE1PTUVOVF9TNjQKLSNkZWZpbmUgREVCVUdfT01YSVBQUF9HRVRTUEFUSUFMTU9NRU5UX1M2NAotI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVEdFVFNUQVRFU0laRV9TNjQKLSNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRJTklUX1M2NAotI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVFM2NFNfVThfQzFSCi0jZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5UUzY0U19VOF9DM1IKLSNlbmRpZiAvKiBERUJVR19ET01BSU5fSVAgKi8KLQotCi0jZW5kaWYgLyogX2FybUNvbW1vbl9IXyAqLwotCi0vKkVuZCBvZiBGaWxlKi8KLQotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX0JpdERlY19zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fQml0RGVjX3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU4NjZmYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fQml0RGVjX3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4NCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtQ09NTV9CaXREZWNfcy5oCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8gCi07Ly8gT3Blbk1BWCBvcHRpbWl6ZWQgYml0c3RyZWFtIGRlY29kZSBtb2R1bGUKLTsvLwotOy8vIFlvdSBtdXN0IGluY2x1ZGUgYXJtQ09NTV9zLmggYmVmb3JlIGluY2x1ZGluZyB0aGlzIGZpbGUKLTsvLwotOy8vIFRoaXMgbW9kdWxlIHByb3ZpZGVzIG1hY3JvcyB0byBwZXJmb3JtIGFzc2VtYmx5IG9wdGltaXplZCBmaXhlZCBhbmQKLTsvLyB2YXJpYWJsZSBsZW5ndGggZGVjb2RpbmcgZnJvbSBhIHJlYWQtb25seSBiaXRzdHJlYW0uIFRoZSB2YXJpYWJsZQotOy8vIGxlbmd0aCBkZWNvZGUgbW9kdWxlcyB0YWtlIGFzIGlucHV0IGEgcG9pbnRlciB0byBhIHRhYmxlIG9mIDE2LWJpdAotOy8vIGVudHJpZXMgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXQuCi07Ly8KLTsvLyBWTEQgVGFibGUgRW50cnkgZm9ybWF0Ci07Ly8KLTsvLyAgICAgICAgMTUgMTQgMTMgMTIgMTEgMTAgMDkgMDggMDcgMDYgMDUgMDQgMDMgMDIgMDEgMDAKLTsvLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotOy8vICAgICAgIHwgIExlbiAgIHwgICAgICAgICAgICAgICBTeW1ib2wgICAgICAgICAgICAgIHwgMSB8Ci07Ly8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLTsvLyAgICAgICB8ICAgICAgICAgICAgICAgIE9mZnNldCAgICAgICAgICAgICAgICAgICAgICB8IDAgfAotOy8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi07Ly8KLTsvLyBJZiB0aGUgdGFibGUgZW50cnkgaXMgYSBsZWFmIGVudHJ5IHRoZW4gYml0IDAgc2V0OgotOy8vICAgIExlbiAgICA9IE51bWJlciBvZiBiaXRzIG92ZXJyZWFkICgwIHRvIDcpCi07Ly8gICAgU3ltYm9sID0gU3ltYm9sIHBheWxvYWQgKHVuc2lnbmVkIDEyIGJpdHMpCi07Ly8KLTsvLyBJZiB0aGUgdGFibGUgZW50cnkgaXMgYW4gaW50ZXJuYWwgbm9kZSB0aGVuIGJpdCAwIGlzIGNsZWFyOgotOy8vICAgIE9mZnNldCA9IE51bWJlciBvZiAoMTYtYml0KSBoYWxmIHdvcmRzIGZyb20gdGhlIHRhYmxlCi07Ly8gICAgICAgICAgICAgc3RhcnQgdG8gdGhlIG5leHQgdGFibGUgbm9kZQotOy8vCi07Ly8gVGhlIHRhYmxlIGlzIGFjY2Vzc2VkIGJ5IHN1Y2Nlc3NpdmUgbG9va3VwIHVwIG9uIHRoZQotOy8vIG5leHQgU3RlcCBiaXRzIG9mIHRoZSBpbnB1dCBiaXRzdHJlYW0gdW50aWwgYSBsZWFmIG5vZGUKLTsvLyBpcyBvYnRhaW5lZC4gVGhlIFN0ZXAgc2l6ZXMgYXJlIHN1cHBsaWVkIHRvIHRoZSBWTEQgbWFjcm8uCi07Ly8KLTsvLyBVU0FHRToKLTsvLwotOy8vIFRvIHVzZSBhbnkgb2YgdGhlIG1hY3JvcyBpbiB0aGlzIHBhY2thZ2UsIGZpcnN0IGNhbGw6Ci07Ly8KLTsvLyAgICBNX0JEX0lOSVQgcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudCwgVG1wCi07Ly8KLTsvLyBUaGlzIGNhY2hlcyB0aGUgY3VycmVudCBiaXRzdHJlYW0gcG9zaXRpb24gYW5kIG5leHQgYXZhaWxhYmxlCi07Ly8gYml0cyBpbiByZWdpc3RlcnMgcEJpdFN0cmVhbSwgUkJpdEJ1ZmZlciwgUkJpdENvdW50LiBUaGVzZSByZWdpc3RlcnMKLTsvLyBhcmUgcmVzZXJ2ZWQgZm9yIHVzZSBieSB0aGUgYml0c3RyZWFtIGRlY29kZSBwYWNrYWdlIHVudGlsIHlvdQotOy8vIGNhbGwgTV9CRF9GSU5JLgotOy8vCi07Ly8gTmV4dCBjYWxsIHRoZSBmb2xsb3dpbmcgbWFjcm8ocykgYXMgbWFueSB0aW1lcyBhcyB5b3UgbmVlZDoKLTsvLwotOy8vICAgIE1fQkRfTE9PSzggICAgICAgLSBMb29rIGFoZWFkIGNvbnN0YW50IDE8PU48PTggIGJpdHMgaW50byB0aGUgYml0c3RyZWFtCi07Ly8gICAgTV9CRF9MT09LMTYgICAgICAtIExvb2sgYWhlYWQgY29uc3RhbnQgMTw9Tjw9MTYgYml0cyBpbnRvIHRoZSBiaXRzdHJlYW0KLTsvLyAgICBNX0JEX1JFQUQ4ICAgICAgIC0gUmVhZCBjb25zdGFudCAxPD1OPD04ICBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQotOy8vICAgIE1fQkRfUkVBRDE2ICAgICAgLSBSZWFkIGNvbnN0YW50IDE8PU48PTE2IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCi07Ly8gICAgTV9CRF9WUkVBRDggICAgICAtIFJlYWQgdmFyaWFibGUgMTw9Tjw9OCAgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KLTsvLyAgICBNX0JEX1ZSRUFEMTYgICAgIC0gUmVhZCB2YXJpYWJsZSAxPD1OPD0xNiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQotOy8vICAgIE1fQkRfVkxEICAgICAgICAgLSBQZXJmb3JtIHZhcmlhYmxlIGxlbmd0aCBkZWNvZGUgdXNpbmcgbG9va3VwIHRhYmxlCi07Ly8KLTsvLyBGaW5hbGx5IGNhbGwgdGhlIG1hY3JvOgotOy8vCi07Ly8gICAgTV9CRF9GSU5JIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0Ci07Ly8KLTsvLyBUaGlzIHdyaXRlcyB0aGUgYml0c3RyZWFtIHN0YXRlIGJhY2sgdG8gbWVtb3J5LgotOy8vCi07Ly8gVGhlIHRocmVlIGJpdHN0cmVhbSBjYWNoZSByZWdpc3RlciBuYW1lcyBhcmUgYXNzaWduZWQgdG8gdGhlIGZvbGxvd2luZyBnbG9iYWwKLTsvLyB2YXJpYWJsZXM6Ci07Ly8KLQotICAgICAgICBHQkxTICAgIHBCaXRTdHJlYW0gIDsvLyBSZWdpc3RlciBuYW1lIGZvciBwQml0U3RyZWFtCi0gICAgICAgIEdCTFMgICAgQml0QnVmZmVyICAgOy8vIFJlZ2lzdGVyIG5hbWUgZm9yIEJpdEJ1ZmZlcgotICAgICAgICBHQkxTICAgIEJpdENvdW50ICAgIDsvLyBSZWdpc3RlciBuYW1lIGZvciBCaXRDb3VudAotICAgCi07Ly8gICAgICAgIAotOy8vIFRoZXNlIHJlZ2lzdGVyIHZhcmlhYmxlcyBtdXN0IGhhdmUgYSBjZXJ0YWluIGRlZmluZWQgc3RhdGUgb24gZW50cnkgdG8gZXZlcnkgYml0c3RyZWFtCi07Ly8gbWFjcm8gKGV4Y2VwdCBNX0JEX0lOSVQpIGFuZCBvbiBleGl0IGZyb20gZXZlcnkgYml0c3RyZWFtIG1hY3JvIChleGNlcHQgTV9CRF9GSU5JKS4KLTsvLyBUaGUgc3RhdGUgbWF5IGRlcGVuZCBvbiBpbXBsZW1lbnRhdGlvbi4KLTsvLwotOy8vIEZvciB0aGUgZGVmYXVsdCAoQVJNMTEpIGltcGxlbWVudGF0aW9uIHRoZSBmb2xsb3dpbmcgaG9sZDoKLTsvLyAgICBwQml0U3RyZWFtIC0gcG9pbnRzIHRvIHRoZSBmaXJzdCBieXRlIG5vdCBoZWxkIGluIHRoZSBCaXRCdWZmZXIKLTsvLyAgICBCaXRCdWZmZXIgIC0gaXMgYSBjYWNoZSBvZiAoNCBieXRlcykgMzIgYml0cywgYml0IDMxIHRoZSBmaXJzdCBiaXQKLTsvLyAgICBCaXRDb3VudCAgIC0gaXMgb2Zmc2V0IChmcm9tIHRoZSB0b3AgYml0KSB0byB0aGUgbmV4dCB1bnVzZWQgYml0c3RyZWFtIGJpdAotOy8vICAgIDA8PUJpdENvdW50PD0xNSAoc28gQml0QnVmZmVyIGhvbGRzIGF0IGxlYXN0IDE3IHVudXNlZCBiaXRzKQotOy8vCi07Ly8KLQotICAgICAgICA7Ly8gQml0c3RyZWFtIERlY29kZSBpbml0aWFsaXNlCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5pdGlhbGlzZXMgdGhlIGJpdHN0cmVhbSBkZWNvZGUgZ2xvYmFsIHJlZ2lzdGVycyBmcm9tCi0gICAgICAgIDsvLyBiaXRzdHJlYW0gcG9pbnRlcnMuIFRoaXMgbWFjcm8gaXMgc3BsaXQgaW50byAzIHBhcnRzIHRvIGVuYWJsZQotICAgICAgICA7Ly8gc2NoZWR1bGluZy4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJHBwQml0U3RyZWFtICAgIC0gcG9pbnRlciB0byBwb2ludGVyIHRvIHRoZSBuZXh0IGJpdHN0cmVhbSBieXRlCi0gICAgICAgIDsvLyAkcEJpdE9mZnNldCAgICAgLSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYml0cyB1c2VkIGluIHRoZSBjdXJyZW50IGJ5dGUgKDAuLjcpCi0gICAgICAgIDsvLyAkUkJpdFN0cmVhbSAgICAgLSByZWdpc3RlciB0byB1c2UgZm9yIHBCaXRTdHJlYW0gKGNhbiBiZSAkcHBCaXRTdHJlYW0pCi0gICAgICAgIDsvLyAkUkJpdEJ1ZmZlciAgICAgLSByZWdpc3RlciB0byB1c2UgZm9yIEJpdEJ1ZmZlcgotICAgICAgICA7Ly8gJFJCaXRDb3VudCAgICAgIC0gcmVnaXN0ZXIgdG8gdXNlIGZvciBCaXRDb3VudCAgIChjYW4gYmUgJHBCaXRPZmZzZXQpCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkVDEsJFQyLCRUMyAgICAgLSByZWdpc3RlcnMgdGhhdCBtdXN0IGJlIHByZXNlcnZlZCBiZXR3ZWVuIGNhbGxzIHRvCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBNX0JEX0lOSVQxIGFuZCBNX0JEX0lOSVQyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfSU5JVDAgICRwcEJpdFN0cmVhbSwgJHBCaXRPZmZzZXQsICRSQml0U3RyZWFtLCAkUkJpdEJ1ZmZlciwgJFJCaXRDb3VudAotCi1wQml0U3RyZWFtICBTRVRTICIkUkJpdFN0cmVhbSIKLUJpdEJ1ZmZlciAgIFNFVFMgIiRSQml0QnVmZmVyIgotQml0Q291bnQgICAgU0VUUyAiJFJCaXRDb3VudCIgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIGxvYWQgaW5wdXRzCi0gICAgICAgIExEUiAgICAgJHBCaXRTdHJlYW0sIFskcHBCaXRTdHJlYW1dCi0gICAgICAgIExEUiAgICAgJEJpdENvdW50LCBbJHBCaXRPZmZzZXRdCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfSU5JVDEgICRUMSwgJFQyLCAkVDMKLSAgICAgICAgTERSQiAgICAkVDIsIFskcEJpdFN0cmVhbSwgIzJdCi0gICAgICAgIExEUkIgICAgJFQxLCBbJHBCaXRTdHJlYW0sICMxXQotICAgICAgICBMRFJCICAgICRCaXRCdWZmZXIsICBbJHBCaXRTdHJlYW1dLCAjMwotICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX0lOSVQyICAkVDEsICRUMiwgJFQzCi0gICAgICAgIE9SUiAgICAgJFQyLCAkVDIsICRUMSwgTFNMICM4Ci0gICAgICAgIE9SUiAgICAgJEJpdEJ1ZmZlciwgJFQyLCAkQml0QnVmZmVyLCBMU0wgIzE2Ci0gICAgICAgIE1FTkQgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIExvb2sgYWhlYWQgZml4ZWQgMTw9Tjw9OCBiaXRzIHdpdGhvdXQgY29uc3VtaW5nIGFueSBiaXRzCi0gICAgICAgIDsvLyBUaGUgbmV4dCBiaXRzIHdpbGwgYmUgcGxhY2VkIGF0IGJpdCAzMS4uMjQgb2YgZGVzdGluYXRpb24gcmVnaXN0ZXIKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gbG9vawotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9MT09LOCAgJFN5bWJvbCwgJE4KLSAgICAgICAgQVNTRVJUICAoJE4+PTEpOkxBTkQ6KCROPD04KQotICAgICAgICBNT1YgICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBMb29rIGFoZWFkIGZpeGVkIDE8PU48PTE2IGJpdHMgd2l0aG91dCBjb25zdW1pbmcgYW55IGJpdHMKLSAgICAgICAgOy8vIFRoZSBuZXh0IGJpdHMgd2lsbCBiZSBwbGFjZWQgYXQgYml0IDMxLi4xNiBvZiBkZXN0aW5hdGlvbiByZWdpc3RlcgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byBsb29rCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX0xPT0sxNiAgJFN5bWJvbCwgJE4sICRUMQotICAgICAgICBBU1NFUlQgICgkTiA+PSAxKTpMQU5EOigkTiA8PSAxNikKLSAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50Ci0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gU2tpcHMgZml4ZWQgMTw9Tjw9OCBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cwotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX1NLSVA4ICROLCAkVDEKLSAgICAgICAgQVNTRVJUICAoJE4+PTEpOkxBTkQ6KCROPD04KSAgICAgICAgCi0gICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICMoOC0kTikKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgCi0gICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gUmVhZCBmaXhlZCAxPD1OPD04IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIHJlYWQKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfUkVBRDggJFN5bWJvbCwgJE4sICRUMQotICAgICAgICBBU1NFUlQgICgkTj49MSk6TEFORDooJE48PTgpICAgICAgICAgICAgICAgIAotICAgICAgICBNT1ZTICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQgICAgICAgIAotICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjKDgtJE4pCi0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgIAotICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBNT1YgICAgICRTeW1ib2wsICRTeW1ib2wsIExTUiAjKDMyLSROKQotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIE1FTkQKLQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFJlYWQgZml4ZWQgMTw9Tjw9MTYgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gcmVhZAotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9SRUFEMTYgJFN5bWJvbCwgJE4sICRUMSwgJFQyCi0gICAgICAgIEFTU0VSVCAgKCROPj0xKTpMQU5EOigkTjw9MTYpCi0gICAgICAgIEFTU0VSVCAgJFN5bWJvbDw+JFQxCi0gICAgICAgIElGICgkTjw9OCkKLSAgICAgICAgICAgIE1fQkRfUkVBRDggICRTeW1ib2wsICROLCAkVDEKLSAgICAgICAgRUxTRSAgICAgICAgCi0gICAgICAgICAgICA7Ly8gTj44IHNvIHdlIHdpbGwgYmUgYWJsZSB0byByZWZpbGwgYXQgbGVhc3Qgb25lIGJ5dGUgICAgICAgICAgICAKLSAgICAgICAgICAgIExEUkIgICAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgICAgIAotICAgICAgICAgICAgTU9WUyAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50Ci0gICAgICAgICAgICBPUlIgICAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICMoMTYtJE4pCi0gICAgICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgICAgICAKLSAgICAgICAgICAgIE1PViAgICAgJFN5bWJvbCwgJFN5bWJvbCwgTFNSICMoMzItJE4pCi0gICAgICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFNraXAgdmFyaWFibGUgMTw9Tjw9OCBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMuIDE8PU48PTgKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9WU0tJUDggJE4sICRUMQotICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkTgotICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgIAotICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIE1FTkQgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBTa2lwIHZhcmlhYmxlIDE8PU48PTE2IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyLgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cy4gMTw9Tjw9MTYKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9WU0tJUDE2ICROLCAkVDEsICRUMgotICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkTgotICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgIAotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIFNVQkNTUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCi0gICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgTUVORCAgICAgICAgCi0KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBSZWFkIHZhcmlhYmxlIDE8PU48PTggYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIHJlYWQuIDE8PU48PTgKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfVlJFQUQ4ICRTeW1ib2wsICROLCAkVDEsICRUMgotICAgICAgICBNT1YgICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQgICAgICAgIAotICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkTgotICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgIAotICAgICAgICBSU0IgICAgICRUMiwgJE4sICMzMiAgICAgICAgCi0gICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIE1PViAgICAgJFN5bWJvbCwgJFN5bWJvbCwgTFNSICRUMgotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIE1FTkQKLQotCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gUmVhZCB2YXJpYWJsZSAxPD1OPD0xNiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gcmVhZC4gMTw9Tjw9MTYKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfVlJFQUQxNiAkU3ltYm9sLCAkTiwgJFQxLCAkVDIKLSAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50ICAgICAgICAKLSAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJE4KLSAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAKLSAgICAgICAgUlNCICAgICAkVDIsICROLCAjMzIgICAgICAgIAotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIFNVQkNTUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCi0gICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIE1PViAgICAgJFN5bWJvbCwgJFN5bWJvbCwgTFNSICRUMgotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIE1FTkQKLQotCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gRGVjb2RlIGEgY29kZSBvZiB0aGUgZm9ybSAwMDAwLi4uMDAxIHdoZXJlIHRoZXJlCi0gICAgICAgIDsvLyBhcmUgTiB6ZXJvcyBiZWZvcmUgdGhlIDEgYW5kIE48PTE1IChjb2RlIGxlbmd0aDw9MTYpCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBudW1iZXIgb2YgemVyb3MgYmVmb3JlIHRoZSBuZXh0IDEKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgID49MTYgaXMgYW4gaWxsZWdhbCBjb2RlCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9DTFoxNiAkU3ltYm9sLCAkVDEsICRUMgotICAgICAgICBNT1ZTICAgICRTeW1ib2wsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQKLSAgICAgICAgQ0xaICAgICAkU3ltYm9sLCAkU3ltYm9sICAgICAgICAgICAgICAgIAotICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkU3ltYm9sCi0gICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM3ICAgICAgICA7Ly8gbGVuZ3RoIGlzIFN5bWJvbCsxCi0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIFNVQkNTUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCi0gICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgTUVORCAgCi0KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBEZWNvZGUgYSBjb2RlIG9mIHRoZSBmb3JtIDExMTEuLi4xMTAgd2hlcmUgdGhlcmUKLSAgICAgICAgOy8vIGFyZSBOIG9uZXMgYmVmb3JlIHRoZSAwIGFuZCBOPD0xNSAoY29kZSBsZW5ndGg8PTE2KQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbnVtYmVyIG9mIHplcm9zIGJlZm9yZSB0aGUgbmV4dCAxCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICA+PTE2IGlzIGFuIGlsbGVnYWwgY29kZQotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfQ0xPMTYgJFN5bWJvbCwgJFQxLCAkVDIKLSAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50Ci0gICAgICAgIE1WTiAgICAgJFN5bWJvbCwgJFN5bWJvbAotICAgICAgICBDTFogICAgICRTeW1ib2wsICRTeW1ib2wgICAgICAgICAgICAgICAgCi0gICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICRTeW1ib2wKLSAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzcgICAgICAgIDsvLyBsZW5ndGggaXMgU3ltYm9sKzEKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCi0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgU1VCQ1NTICAkQml0Q291bnQsICRCaXRDb3VudCwgIzggICAgICAgIAotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEKLSAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBNRU5EICAKLQotCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gVmFyaWFibGUgTGVuZ3RoIERlY29kZSBtb2R1bGUKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBEZWNvZGVzIG9uZSBWTEQgU3ltYm9sIGZyb20gYSBiaXRzdHJlYW0gYW5kIHJlZmlsbCB0aGUgYml0c3RyZWFtCi0gICAgICAgIDsvLyBidWZmZXIuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRwVkxEVGFibGUgICAgICAtIHBvaW50ZXIgdG8gVkxEIGRlY29kZSB0YWJsZSBvZiAxNi1iaXQgZW50cmllcy4KLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIFRoZSBmb3JtYXQgaXMgZGVzY3JpYmVkIGFib3ZlIGF0IHRoZSBzdGFydCBvZgotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgdGhpcyBmaWxlLgotICAgICAgICA7Ly8gJFMwICAgICAgICAgICAgIC0gVGhlIG51bWJlciBvZiBiaXRzIHRvIGxvb2sgdXAgZm9yIHRoZSBmaXJzdCBzdGVwCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICAxPD0kUzA8PTgKLSAgICAgICAgOy8vICRTMSAgICAgICAgICAgICAtIFRoZSBudW1iZXIgb2YgYml0cyB0byBsb29rIHVwIGZvciBlYWNoIHN1YnNlcXVlbnQKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIHN0ZXAgMTw9JFMxPD0kUzAuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gZGVjb2RlZCBWTEQgc3ltYm9sIHZhbHVlCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfVkxEICRTeW1ib2wsICRUMSwgJFQyLCAkcFZMRFRhYmxlLCAkUzAsICRTMQotICAgICAgICBBU1NFUlQgKDE8PSRTMCk6TEFORDooJFMwPD04KQotICAgICAgICBBU1NFUlQgKDE8PSRTMSk6TEFORDooJFMxPD0kUzApCi0gICAgICAgIAotICAgICAgICA7Ly8gTm90ZSAwPD1CaXRDb3VudDw9MTUgb24gZW50cnkgYW5kIGV4aXQKLSAgICAgICAgCi0gICAgICAgIE1PVlMgICAgJFQxLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50ICAgICAgIDsvLyBsZWZ0IGFsaWduIG5leHQgYml0cwotICAgICAgICBNT1ZTICAgICRTeW1ib2wsICMoMjw8JFMwKS0yICAgICAgICAgICAgICAgICA7Ly8gY3JlYXRlIG1hc2sKLSAgICAgICAgQU5EICAgICAkU3ltYm9sLCAkU3ltYm9sLCAkVDEsIExTUiAjKDMxLSRTMCkgOy8vIDIqKG5leHQgJFMwIGJpdHMpCi0gICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAgICAgIDsvLyBDUyBpZiBidWZmZXIgY2FuIGJlIGZpbGxlZAotMDEKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAgICAgICAgOy8vIGxvYWQgcmVmaWxsIGJ5dGUKLSAgICAgICAgTERSSCAgICAkU3ltYm9sLCBbJHBWTERUYWJsZSwgJFN5bWJvbF0gICAgICAgOy8vIGxvYWQgdGFibGUgZW50cnkKLSAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzggICAgICAgICAgICAgOy8vIHJlZmlsbCBub3QgcG9zc2libGUKLSAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIyRTMCAgICAgICAgICAgOy8vIGFzc3VtZSAkUzAgYml0cyB1c2VkCi0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzggIDsvLyBtZXJnZSBpbiByZWZpbGwgYnl0ZQotICAgICAgICBNT1ZTICAgICRUMSwgJFN5bWJvbCwgTFNSICMxICAgICAgICAgICAgICAgICA7Ly8gQ1M9bGVhZiBlbnRyeQotICAgICAgICBCQ1MgICAgICVGVDAyCi0gICAgICAgIAotICAgICAgICBNT1ZTICAgICRUMSwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudCAgICAgICA7Ly8gbGVmdCBhbGlnbiBuZXh0IGJpdAotICAgICAgICBJRiAoMiokUzAtJFMxPD04KQotICAgICAgICAgICAgOy8vIENhbiBjb21iaW5lIHJlZmlsbCBjaGVjayBhbmQgLVMwK1MxIGFuZCBrZWVwICRCaXRDb3VudDw9MTUKLSAgICAgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4KygkUzAtJFMxKQotICAgICAgICBFTFNFCi0gICAgICAgICAgICA7Ly8gU2VwYXJhdGUgcmVmaWxsIGNoZWNrIGFuZCAtUzArUzEgb2Zmc2V0Ci0gICAgICAgICAgICBTVUJTICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgICAgIFNVQiAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjKCRTMC0kUzEpCi0gICAgICAgIEVORElGCi0gICAgICAgIEFERCAgICAgJFN5bWJvbCwgJFN5bWJvbCwgJFQxLCBMU1IgIygzMS0kUzEpIDsvLyBhZGQgMioobmV4dCAkUzEgYml0cykgdG8KLSAgICAgICAgQklDICAgICAkU3ltYm9sLCAkU3ltYm9sLCAjMSAgICAgICAgICAgICAgICAgOy8vICAgdGFibGUgb2Zmc2V0Ci0gICAgICAgIEIgICAgICAgJUJUMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBsb2FkIG5leHQgdGFibGUgZW50cnkKLTAyCi0gICAgICAgIDsvLyBCaXRDb3VudCByYW5nZSBub3cgZGVwZW5kIG9uIHRoZSByb3V0ZSBoZXJlCi0gICAgICAgIDsvLyBpZiAoZmlyc3Qgc3RlcCkgICAgICAgUzAgPD0gQml0Q291bnQgPD0gNytTMCAgICAgICAgPD0xNQotICAgICAgICA7Ly8gZWxzZSBpZiAoMipTMC1TMTw9OCkgIFMwIDw9IEJpdENvdW50IDw9IDcrKDIqUzAtUzEpIDw9MTUKLSAgICAgICAgOy8vIGVsc2UgICAgICAgICAgICAgICAgICBTMSA8PSBCaXRDb3VudCA8PSA3K1MxICAgICAgICA8PTE1Ci0gICAgICAgIAotICAgICAgICBTVUIgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkU3ltYm9sLCBMU1IjMTMKLSAgICAgICAgQklDICAgICAkU3ltYm9sLCAkVDEsICMweEYwMDAKLSAgICAgICAgTUVORAotICAgICAgICAKLQotICAgICAgICA7Ly8gQWRkIGFuIG9mZnNldCBudW1iZXIgb2YgYml0cwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dHMgZGVzdGluYXRpb24gYnl0ZSBhbmQgYml0IGluZGV4IHZhbHVlcyB3aGljaCBjb3JyZXNwb25kcyB0byBhbiBvZmZzZXQgbnVtYmVyIG9mIGJpdHMgCi0gICAgICAgIDsvLyBmcm9tIHRoZSBjdXJyZW50IGxvY2F0aW9uLiBUaGlzIGlzIHVzZWQgdG8gY29tcGFyZSBiaXRzdHJlYW0gcG9zaXRpb25zIHVzaW5nLiBNX0JEX0NNUC4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJE9mZnNldCAgICAgICAgIC0gT2Zmc2V0IHRvIGJlIGFkZGVkIGluIGJpdHMuCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRCeXRlSW5kZXggICAgICAtIERlc3RpbmF0aW9uIHBCaXRTdHJlYW0gcG9pbnRlciBhZnRlciBhZGRpbmcgdGhlIE9mZnNldC4gCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIHdpbGwgYmUgNCBieXRlIGFoZWFkIGFuZCBuZWVkcyB0byBzdWJ0cmFjdCBieSA0IHRvIGdldCBleGFjdCAKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgKGFzIGluIE1fQkRfRklOSSkuIEJ1dCBmb3IgdXNpbmcgd2l0aCBNX0JEX0NNUCBzdWJ0cmFjdCBpcyBub3QgbmVlZGVkLgotICAgICAgICA7Ly8gJEJpdEluZGV4ICAgICAgIC0gRGVzdGluYXRpb24gQml0Q291bnQgYWZ0ZXIgdGhlIGFkZGl0aW9uIG9mIE9mZnNldCBudW1iZXIgb2YgYml0cwotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9BREQgICRCeXRlSW5kZXgsICRCaXRJbmRleCwgJE9mZnNldAotCi0gICAgICAgIDsvLyAoJEJ5dGVJbmRleCwkQml0SW5kZXgpID0gQ3VycmVudCBwb3NpdGlvbiArICRPZmZzZXQgYml0cwotICAgICAgICBBREQgICAgICRPZmZzZXQsICRPZmZzZXQsICRCaXRDb3VudAotICAgICAgICBBTkQgICAgICRCaXRJbmRleCwgJE9mZnNldCwgIzcKLSAgICAgICAgQUREICAgICAkQnl0ZUluZGV4LCAkcEJpdFN0cmVhbSwgJE9mZnNldCwgQVNSICMzICAgICAgICAKLSAgICAgICAgTUVORAotCi0gICAgICAgIDsvLyBNb3ZlIGJpdHN0cmVhbSBwb2ludGVycyB0byB0aGUgbG9jYXRpb24gZ2l2ZW4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXRzIGRlc3RpbmF0aW9uIGJ5dGUgYW5kIGJpdCBpbmRleCB2YWx1ZXMgd2hpY2ggY29ycmVzcG9uZHMgdG8gIAotICAgICAgICA7Ly8gdGhlIGN1cnJlbnQgbG9jYXRpb24gZ2l2ZW4gKGNhbGN1bGF0ZWQgdXNpbmcgTV9CRF9BREQpLiAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAkQnl0ZUluZGV4ICAgICAgLSBEZXN0aW5hdGlvbiBwQml0U3RyZWFtIHBvaW50ZXIgYWZ0ZXIgbW92ZS4gCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIHdpbGwgYmUgNCBieXRlIGFoZWFkIGFuZCBuZWVkcyB0byBzdWJ0cmFjdCBieSA0IHRvIGdldCBleGFjdCAKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgKGFzIGluIE1fQkRfRklOSSkuCi0gICAgICAgIDsvLyAkQml0SW5kZXggICAgICAgLSBEZXN0aW5hdGlvbiBCaXRDb3VudCBhZnRlciB0aGUgbW92ZQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLiAgCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfTU9WICAkQnl0ZUluZGV4LCAkQml0SW5kZXgKLQotICAgICAgICA7Ly8gKCRwQml0U3RyZWFtLCAkT2Zmc2V0KSA9ICgkQnl0ZUluZGV4LCRCaXRJbmRleCkKLSAgICAgICAgTU9WICAgICAkQml0Q291bnQsICRCaXRJbmRleAotICAgICAgICBNT1YgICAgICRwQml0U3RyZWFtLCAkQnl0ZUluZGV4Ci0gICAgICAgIE1FTkQKLQotICAgICAgICA7Ly8gQml0c3RyZWFtIENvbXBhcmUKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBDb21wYXJlcyBiaXRzdHJlYW0gcG9zaXRpb24gd2l0aCB0aGF0IG9mIGEgZGVzdGluYXRpb24gcG9zaXRpb24uIERlc3RpbmF0aW9uIHBvc2l0aW9uIAotICAgICAgICA7Ly8gaXMgaGVsZCBpbiB0d28gaW5wdXQgcmVnaXN0ZXJzIHdoaWNoIGFyZSBjYWxjdWxhdGVkIHVzaW5nIE1fQkRfQUREIG1hY3JvCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRCeXRlSW5kZXggICAgICAtIERlc3RpbmF0aW9uIHBCaXRTdHJlYW0gcG9pbnRlciwgKDQgYnl0ZSBhaGVhZCBhcyBkZXNjcmliZWQgaW4gTV9CRF9BREQpCi0gICAgICAgIDsvLyAkQml0SW5kZXggICAgICAgLSBEZXN0aW5hdGlvbiBCaXRDb3VudAotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBGTEFHUyAgICAgICAgICAgLSBHRSBpZiBkZXN0aW5hdGlvbiBpcyByZWFjaGVkLCBMVCA9IGlzIGRlc3RpbmF0aW9uIGlzIGFoZWFkCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX0NNUCAgJEJ5dGVJbmRleCwgJEJpdEluZGV4LCAkVDEKLSAgICAgICAgCi0gICAgICAgIDsvLyBSZXR1cm4gZmxhZ3Mgc2V0IGJ5IChjdXJyZW50IHBvc2l0b24pLSgkQnl0ZUluZGV4LCRCaXRJbmRleCkKLSAgICAgICAgOy8vIHNvIEdFIG1lYW5zIHRoYXQgd2UgaGF2ZSByZWFjaGVkIHRoZSBpbmRpY2F0ZWQgcG9zaXRpb24KLQotICAgICAgICBBREQgICAgICAgICAkVDEsICRwQml0U3RyZWFtLCAkQml0Q291bnQsIExTUiAjMwotICAgICAgICBDTVAgICAgICAgICAkVDEsICRCeXRlSW5kZXgKLSAgICAgICAgQU5EICAgICAgICAgJFQxLCAkQml0Q291bnQsICM3Ci0gICAgICAgIENNUEVRICAgICAgICRUMSwgJEJpdEluZGV4ICAgICAgICAKLSAgICAgICAgTUVORAotCi0gICAgICAgIAotICAgICAgICA7Ly8gQml0c3RyZWFtIERlY29kZSBmaW5hbGlzZQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFdyaXRlcyBiYWNrIHRoZSBiaXRzdHJlYW0gc3RhdGUgdG8gdGhlIGJpdHN0cmVhbSBwb2ludGVycwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRwcEJpdFN0cmVhbSAgICAtIHBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgbmV4dCBiaXRzdHJlYW0gYnl0ZQotICAgICAgICA7Ly8gJHBCaXRPZmZzZXQgICAgIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJpdHMgdXNlZCBpbiB0aGUgY3VycmVudCBieXRlICgwLi43KQotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gdGhlc2UgcmVnaXN0ZXIgYXJlIGNvcnJ1cHRlZAotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX0ZJTkkgICRwcEJpdFN0cmVhbSwgJHBCaXRPZmZzZXQKLSAgICAgICAgCi0gICAgICAgIDsvLyBBZHZhbmNlIHBvaW50ZXIgYnkgdGhlIG51bWJlciBvZiBmcmVlIGJpdHMgaW4gdGhlIGJ1ZmZlcgotICAgICAgICBBREQgICAgICRwQml0U3RyZWFtLCAkcEJpdFN0cmVhbSwgJEJpdENvdW50LCBMU1IjMwotICAgICAgICBBTkQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjNwotICAgICAgICAKLSAgICAgICAgOy8vIE5vdyBtb3ZlIGJhY2sgMzIgYml0cyB0byByZWFjaCB0aGUgZmlyc3QgdXN1ZWQgYml0Ci0gICAgICAgIFNVQiAgICAgJHBCaXRTdHJlYW0sICRwQml0U3RyZWFtLCAjNAotICAgICAgICAKLSAgICAgICAgOy8vIFN0b3JlIG91dCBiaXRzdHJlYW0gc3RhdGUKLSAgICAgICAgU1RSICAgICAkQml0Q291bnQsIFskcEJpdE9mZnNldF0KLSAgICAgICAgU1RSICAgICAkcEJpdFN0cmVhbSwgWyRwcEJpdFN0cmVhbV0KLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgRU5ECi0gICAgICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzZiNjZkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtQ09NTV9CaXRzdHJlYW0uaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEZpbGU6IGFybUNPTU1fQml0c3RyZWFtLmgKLSAqIEJyaWVmOiBEZWNsYXJlcyBjb21tb24gQVBJJ3MvRGF0YSB0eXBlcyB1c2VkIGFjcm9zcyB0aGUgT3Blbk1heCBFbmNvZGVycy9EZWNvZGVycy4KLSAqCi0gKi8KLQotI2lmbmRlZiBfYXJtQ29kZWNfSF8KLSNkZWZpbmUgX2FybUNvZGVjX0hfCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX1U4ICAgY29kZUxlbjsKLSAgICBPTVhfVTMyCSBjb2RlV29yZDsKLX0gQVJNX1ZMQzMyOwotCi0vKiBUaGUgYWJvdmUgc2hvdWxkIGJlIHJlbmFtZWQgYXMgIkFSTV9WTEMzMiIgKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtTG9va0FoZWFkQml0cygpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBHZXQgdGhlIG5leHQgTiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSB3aXRob3V0IGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKipwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIE49MS4uLjMyCi0gKgotICogUmV0dXJucyAgVmFsdWUKLSAqLwotCi1PTVhfVTMyIGFybUxvb2tBaGVhZEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sIE9NWF9JTlQgKnBPZmZzZXQsIE9NWF9JTlQgTik7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUdldEJpdHMoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUmVhZCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCi0gKiAgICAKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBOPTEuLjMyCi0gKgotICogW291dF0gICAgKnBwQml0U3RyZWFtCi0gKiBbb3V0XSAgICAqcE9mZnNldAotICogUmV0dXJucyAgVmFsdWUKLSAqLwotCi1PTVhfVTMyIGFybUdldEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sIE9NWF9JTlQgKnBPZmZzZXQsIE9NWF9JTlQgTik7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUJ5dGVBbGlnbigpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBBbGlnbiB0aGUgcG9pbnRlciAqcHBCaXRTdHJlYW0gdG8gdGhlIG5leHQgYnl0ZSBib3VuZGFyeQotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKgotICogW291dF0gICAgKnBwQml0U3RyZWFtCi0gKiBbb3V0XSAgICAqcE9mZnNldAotICoKLSAqKi8KLSAKLU9NWFZvaWQgYXJtQnl0ZUFsaWduKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLE9NWF9JTlQgKnBPZmZzZXQpOwotCi0vKiogCi0gKiBGdW5jdGlvbjogYXJtU2tpcEJpdHMoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogU2tpcCBOIGJpdHMgZnJvbSB0aGUgdmFsdWUgYXQgKnBwQml0U3RyZWFtCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIE4KLSAqCi0gKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKgotICoqLwotCi1PTVhWb2lkIGFybVNraXBCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLE9NWF9JTlQgKnBPZmZzZXQsT01YX0lOVCBOKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVmFyaWFibGUgYml0IGxlbmd0aCBEZWNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVVuUGFja1ZMQzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFZhcmlhYmxlIGxlbmd0aCBkZWNvZGUgb2YgdmFyaWFibGUgbGVuZ3RoIHN5bWJvbCAobWF4IHNpemUgMzIgYml0cykgcmVhZCBmcm9tCi0gKiB0aGUgYml0IHN0cmVhbSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSBhdCAqcE9mZnNldCBieSB1c2luZyB0aGUgdGFibGUKLSAqIHBvaW50ZWQgYnkgcENvZGVCb29rCi0gKiAKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgcENvZGVCb29rCi0gKiAKLSAqIFtvdXRdICAgICoqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKgotICogUmV0dXJucyA6IENvZGUgQm9vayBJbmRleCBpZiBzdWNjZXNzZnVsbC4gCi0gKiAgICAgICAgIDogIkFSTV9OT19DT0RFQk9PS19JTkRFWCA9IDB4RkZGRiIgaWYgc2VhcmNoIGZhaWxzLgotICoqLwotCi0jZGVmaW5lIEFSTV9OT19DT0RFQk9PS19JTkRFWCAoT01YX1UxNikoMHhGRkZGKQotCi1PTVhfVTE2IGFybVVuUGFja1ZMQzMyKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBPZmZzZXQsCi0gICAgY29uc3QgQVJNX1ZMQzMyICpwQ29kZUJvb2sKLSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZpeGVkIGJpdCBsZW5ndGggRW5jb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1QYWNrQml0cwotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAotICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCi0gKiBbaW5dCXBPZmZzZXQJICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAKLSAqICAgICAgICAgICAgICAgICAgICAgIHRvIDcuCi0gKiBbaW5dCWNvZGVXb3JkCQlDb2RlIHdvcmQgdGhhdCBuZWVkIHRvIGJlIGluc2VydGVkIGluIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQotICogW2luXQljb2RlTGVuZ3RoCQlMZW5ndGggb2YgdGhlIGNvZGUgd29yZCB2YWxpZCByYW5nZSAxLi4uMzIKLSAqCi0gKiBbb3V0XSBwcEJpdFN0cmVhbQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKLSAqCSAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAotICoJCQkJCQkJc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdIHBCaXRPZmZzZXQJCSpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKgkJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKgkJCQkJCQkqcHBCaXRTdHJlYW0uCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YX1JFU1VMVCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotIAotT01YUmVzdWx0IGFybVBhY2tCaXRzICgKLSAgICBPTVhfVTggICoqcHBCaXRTdHJlYW0sIAotICAgIE9NWF9JTlQgKnBPZmZzZXQsCi0gICAgT01YX1UzMiBjb2RlV29yZCwgCi0gICAgT01YX0lOVCBjb2RlTGVuZ3RoIAotKTsKLSAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFZhcmlhYmxlIGJpdCBsZW5ndGggRW5jb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1QYWNrVkxDMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBhY2sgYSBWTEMgY29kZSB3b3JkIGludG8gdGhlIGJpdHN0cmVhbQotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtLgotICogW2luXQlwQml0T2Zmc2V0CSAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAKLSAqICAgICAgICAgICAgICAgICAgICAgIHRvIDcuCi0gKiBbaW5dCSBjb2RlICAgICAJCVZMQyBjb2RlIHdvcmQgdGhhdCBuZWVkIHRvIGJlIGluc2VydGVkIGluIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCi0gKgotICogW291dF0gcHBCaXRTdHJlYW0JKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCi0gKgkgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAotICoJCQkJCQlzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqCQkJCQkJY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICoJCQkJCQkqcHBCaXRTdHJlYW0uCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YX1JFU1VMVCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotIAotT01YUmVzdWx0IGFybVBhY2tWTEMzMiAoCi0gICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sIAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgQVJNX1ZMQzMyIGNvZGUgCi0pOwotCi0jZW5kaWYgICAgICAvKl9hcm1Db2RlY19IXyovCi0KLS8qRW5kIG9mIEZpbGUqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjM2ODRlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9JRENUVGFibGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICoKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtQ09NTV9JRENUVGFibGUuaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEZpbGUgICAgICAgICA6IGFybUNPTU1fSURDVFRhYmxlLmgKLSAqIERlc2NyaXB0aW9uICA6IENvbnRhaW5zIGRlY2xhcmF0aW9ucyBvZiB0YWJsZXMgZm9yIElEQ1QgY2FsY3VsYXRpb24uCi0gKgotICovCi0gIAotI2lmbmRlZiBfYXJtQ09NTV9JRENUVGFibGVfSF8KLSNkZWZpbmUgX2FybUNPTU1fSURDVFRhYmxlX0hfCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotCi0gICAgIC8qICBUYWJsZSBvZiBzKHUpKkEodSkqQSh2KS8xNiBhdCBRMTUKLSAgICAgICogIHModSk9MS4wIDAgPD0gdSA8PSA1Ci0gICAgICAqICBzKDYpPTIuMAotICAgICAgKiAgcyg3KT00LjAKLSAgICAgICogIEEoMCkgPSAyKnNxcnQoMikKLSAgICAgICogIEEodSkgPSA0KmNvcyh1KnBpLzE2KSAgZm9yICh1IT0wKQotCSAgKi8KLWV4dGVybiBjb25zdCBPTVhfVTE2IGFybUNPTU1fSURDVFByZVNjYWxlIFs2NF07Ci1leHRlcm4gY29uc3QgT01YX1UxNiBhcm1DT01NX0lEQ1RDb2VmIFs0XTsKLQotI2VuZGlmIC8qIF9hcm1DT01NX0lEQ1RUYWJsZV9IXyAqLwotCi0KLS8qIEVuZCBvZiBGaWxlICovCi0KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9JRENUX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9JRENUX3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE3ZDI0Zi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fSURDVF9zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUzICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8KLTsvLyBJRENUX3MucwotOy8vCi07Ly8gSW52ZXJzZSBEQ1QgbW9kdWxlCi07Ly8KLTsvLyAKLTsvLyBBTEdPUklUSE0gREVTQ1JJUFRJT04KLTsvLwotOy8vIFRoZSA4eDggMkQgSURDVCBpcyBwZXJmb3JtZWQgYnkgY2FsY3VsYXRpbmcgYSAxRCBJRENUIGZvciBlYWNoCi07Ly8gY29sdW1uIGFuZCB0aGVuIGEgMUQgSURDVCBmb3IgZWFjaCByb3cuCi07Ly8KLTsvLyBUaGUgOC1wb2ludCAxRCBJRENUIGlzIGRlZmluZWQgYnkKLTsvLyAgIGYoeCkgPSAoQygwKSpUKDApKmMoMCx4KSArIC4uLiArIEMoNykqVCg3KSpjKDcseCkpLzIKLTsvLwotOy8vICAgQyh1KSA9IDEvc3FydCgyKSBpZiB1PTAgb3IgMSBpZiB1IT0wCi07Ly8gICBjKHUseCkgPSBjb3MoICgyeCsxKSp1KnBpLzE2ICkKLTsvLwotOy8vIFdlIGNvbXB1dGUgdGhlIDgtcG9pbnQgMUQgSURDVCB1c2luZyB0aGUgcmV2ZXJzZSBvZgotOy8vIHRoZSBBcmFpLUFndWktTmFrYWppbWEgZmxvdyBncmFwaCB3aGljaCB3ZSBzcGxpdCBpbnRvCi07Ly8gNSBzdGFnZXMgbmFtZWQgaW4gcmV2ZXJzZSBvcmRlciB0byBpZGVudGlmeSB3aXRoIHRoZQotOy8vIGZvcndhcmQgRENULiBEaXJlY3QgaW52ZXJzaW9uIG9mIHRoZSBmb3J3YXJkIGZvcm11bGFlCi07Ly8gaW4gZmlsZSBGRENUX3MucyBnaXZlczoKLTsvLwotOy8vIElTdGFnZSA1OiAgIGoodSkgPSBUKHUpKkEodSkgIFsgQSh1KT00KkModSkqYyh1LDApIF0KLTsvLyAgICAgICAgICAgICBbIEEoMCkgPSAyKnNxcnQoMikKLTsvLyAgICAgICAgICAgICAgIEEodSkgPSA0KmNvcyh1KnBpLzE2KSAgZm9yICh1IT0wKSBdCi07Ly8KLTsvLyBJU3RhZ2UgNDogICBpMCA9IGowICAgICAgICAgICAgIGkxID0gajQKLTsvLyAgICAgICAgICAgICBpMyA9IChqMitqNikvMiAgICAgIGkyID0gKGoyLWo2KS8yCi07Ly8gICAgICAgICAgICAgaTcgPSAoajUrajMpLzIgICAgICBpNCA9IChqNS1qMykvMgotOy8vICAgICAgICAgICAgIGk1ID0gKGoxK2o3KS8yICAgICAgaTYgPSAoajEtajcpLzIKLTsvLwotOy8vIElTdGFnZSAzOiAgIGgwID0gKGkwK2kxKS8yICAgICAgaDEgPSAoaTAtaTEpLzIKLTsvLyAgICAgICAgICAgICBoMiA9IChpMipzcXJ0MiktaTMgIGgzID0gaTMKLTsvLyAgICAgICAgICAgICBoNCA9ICBjb3MocGkvOCkqaTQgKyBzaW4ocGkvOCkqaTYKLTsvLyAgICAgICAgICAgICBoNiA9IC1zaW4ocGkvOCkqaTQgKyBjb3MocGkvOCkqaTYKLTsvLyAgICAgICAgICAgICBbIFRoZSBhYm92ZSB0d28gbGluZXMgcm90YXRlIGJ5IC0ocGkvOCkgXQotOy8vICAgICAgICAgICAgIGg1ID0gKGk1LWk3KS9zcXJ0MiAgaDcgPSAoaTUraTcpLzIgCi07Ly8gICAgICAgICAgICAgCi07Ly8gSVN0YWdlIDI6ICAgZzAgPSAoaDAraDMpLzIgICAgICBnMyA9IChoMC1oMykvMgotOy8vICAgICAgICAgICAgIGcxID0gKGgxK2gyKS8yICAgICAgZzIgPSAoaDEtaDIpLzIKLTsvLyAgICAgICAgICAgICBnNyA9IGg3ICAgICAgICAgICAgIGc2ID0gaDYgLSBoNwotOy8vICAgICAgICAgICAgIGc1ID0gaDUgLSBnNiAgICAgICAgZzQgPSBoNCAtIGc1Ci07Ly8KLTsvLyBJU3RhZ2UgMTogICBmMCA9IChnMCtnNykvMiAgICAgIGY3ID0gKGcwLWc3KS8yCi07Ly8gICAgICAgICAgICAgZjEgPSAoZzErZzYpLzIgICAgICBmNiA9IChnMS1nNikvMgotOy8vICAgICAgICAgICAgIGYyID0gKGcyK2c1KS8yICAgICAgZjUgPSAoZzItZzUpLzIKLTsvLyAgICAgICAgICAgICBmMyA9IChnMytnNCkvMiAgICAgIGY0ID0gKGczLWc0KS8yCi07Ly8KLTsvLyBOb3RlIHRoYXQgbW9zdCBjb2VmZmljaWVudHMgYXJlIGhhbHZlZCAzIHRpbWVzIGR1cmluZyB0aGUKLTsvLyBhYm92ZSBjYWxjdWxhdGlvbi4gV2UgY2FuIHJlc2NhbGUgdGhlIGFsZ29yaXRobSBkaXZpZGluZwotOy8vIHRoZSBpbnB1dCBieSA4IHRvIHJlbW92ZSB0aGUgaGFsdmluZ3MuCi07Ly8KLTsvLyBJU3RhZ2UgNTogICBqKHUpID0gVCh1KSpBKHUpLzgKLTsvLwotOy8vIElTdGFnZSA0OiAgIGkwID0gajAgICAgICAgICAgICAgaTEgPSBqNAotOy8vICAgICAgICAgICAgIGkzID0gajIgKyBqNiAgICAgICAgaTIgPSBqMiAtIGo2Ci07Ly8gICAgICAgICAgICAgaTcgPSBqNSArIGozICAgICAgICBpNCA9IGo1IC0gajMKLTsvLyAgICAgICAgICAgICBpNSA9IGoxICsgajcgICAgICAgIGk2ID0gajEgLSBqNwotOy8vCi07Ly8gSVN0YWdlIDM6ICAgaDAgPSBpMCArIGkxICAgICAgICBoMSA9IGkwIC0gaTEKLTsvLyAgICAgICAgICAgICBoMiA9IChpMipzcXJ0MiktaTMgIGgzID0gaTMKLTsvLyAgICAgICAgICAgICBoNCA9IDIqKCBjb3MocGkvOCkqaTQgKyBzaW4ocGkvOCkqaTYpCi07Ly8gICAgICAgICAgICAgaDYgPSAyKigtc2luKHBpLzgpKmk0ICsgY29zKHBpLzgpKmk2KQotOy8vICAgICAgICAgICAgIGg1ID0gKGk1LWk3KSpzcXJ0MiAgaDcgPSBpNSArIGk3IAotOy8vICAgICAgICAgICAgIAotOy8vIElTdGFnZSAyOiAgIGcwID0gaDAgKyBoMyAgICAgICAgZzMgPSBoMCAtIGgzCi07Ly8gICAgICAgICAgICAgZzEgPSBoMSArIGgyICAgICAgICBnMiA9IGgxIC0gaDIKLTsvLyAgICAgICAgICAgICBnNyA9IGg3ICAgICAgICAgICAgIGc2ID0gaDYgLSBoNwotOy8vICAgICAgICAgICAgIGc1ID0gaDUgLSBnNiAgICAgICAgZzQgPSBoNCAtIGc1Ci07Ly8KLTsvLyBJU3RhZ2UgMTogICBmMCA9IGcwICsgZzcgICAgICAgIGY3ID0gZzAgLSBnNwotOy8vICAgICAgICAgICAgIGYxID0gZzEgKyBnNiAgICAgICAgZjYgPSBnMSAtIGc2Ci07Ly8gICAgICAgICAgICAgZjIgPSBnMiArIGc1ICAgICAgICBmNSA9IGcyIC0gZzUKLTsvLyAgICAgICAgICAgICBmMyA9IGczICsgZzQgICAgICAgIGY0ID0gZzMgLSBnNAotOy8vCi07Ly8gTm90ZToKLTsvLyAxLiBUaGUgc2NhbGluZyBieSBBKHUpLzggY2FuIG9mdGVuIGJlIGNvbWJpbmVkIHdpdGggaW52ZXJzZQotOy8vICAgIHF1YW50aXphdGlvbi4gVGhlIGNvbHVtbiBhbmQgcm93IHNjYWxpbmdzIGNhbiBiZSBjb21iaW5lZC4KLTsvLyAyLiBUaGUgZmxvd2dyYXBoIGluIHRoZSBBQU4gcGFwZXIgaGFzIGg0LGc2IG5lZ2F0ZWQgY29tcGFyZWQKLTsvLyAgICB0byB0aGUgYWJvdmUgY29kZSBidXQgaXMgb3RoZXJ3aXNlIGlkZW50aWNhbC4KLTsvLyAzLiBUaGUgcm90YXRpb24gYnkgLXBpLzggY2FuIGJlIHBlZm9ybWVkIHVzaW5nIHRocmVlIG11bHRpcGxpZXMKLTsvLyAgICBFZyAgYyppNCtzKmk2ID0gKGk2LWk0KSpzICsgKGMrcykqaTQKLTsvLyAgICAgICAtcyppNCtjKmk2ID0gKGk2LWk0KSpzICsgKGMtcykqaTYKLTsvLyA0LiBJZiB8VCh1KXw8PTEgdGhlbiBmcm9tIHRoZSBJRENUIGRlZmluaXRpb24sCi07Ly8gICAgfGYoeCl8IDw9ICgoMS9zcXJ0MikgKyB8YygxLHgpfCArIC4uICsgfGMoNyx4KXwpLzIKLTsvLyAgICAgICAgICAgID0gKCgxL3NxcnQyKSArIGNvcyhwaS8xNikgKyAuLi4gKyBjb3MoNypwaS8xNikpLzIKLTsvLyAgICAgICAgICAgID0gKCgxL3NxcnQyKSArIChjb3QocGkvMzIpLTEpLzIpLzIKLTsvLyAgICAgICAgICAgID0gKDEgKyBjb3MocGkvMTYpICsgY29zKDJwaS8xNikgKyBjb3MoM3BpLzE2KSkvc3FydCgyKQotOy8vICAgICAgICAgICAgPSAoYXBwcm94KTIuNjQKLTsvLyAgICBTbyB0aGUgbWF4IGdhaW4gb2YgdGhlIDJEIElEQ1QgaXMgfng3LjAgPSAzIGJpdHMuCi07Ly8gICAgVGhlIHRhYmxlIGJlbG93IHNob3dzIGlucHV0IHBhdHRlcm5zIGdlbmVyYXRpbmcgdGhlIG1heGltdW0KLTsvLyAgICB2YWx1ZSBvZiB8Zih1KXwgZm9yIGlucHV0IGluIHRoZSByYW5nZSB8VCh4KXw8PTEuIE09LTEsIFA9KzEKLTsvLyAgICBJbnB1dFBhdHRlcm4gICAgICBNYXggfGYoeCl8Ci07Ly8gICAgICBQUFBQUFBQUCAgICAgICAgfGYwfCA9ICAyLjY0Ci07Ly8gICAgICBQUFBNTU1NTSAgICAgICAgfGYxfCA9ICAyLjY0Ci07Ly8gICAgICBQUE1NTVBQUCAgICAgICAgfGYyfCA9ICAyLjY0Ci07Ly8gICAgICBQUE1NUFBNTSAgICAgICAgfGYzfCA9ICAyLjY0Ci07Ly8gICAgICBQTU1QUE1NUCAgICAgICAgfGY0fCA9ICAyLjY0Ci07Ly8gICAgICBQTU1QTU1QTSAgICAgICAgfGY1fCA9ICAyLjY0Ci07Ly8gICAgICBQTVBQTVBNUCAgICAgICAgfGY2fCA9ICAyLjY0Ci07Ly8gICAgICBQTVBNUE1QTSAgICAgICAgfGY3fCA9ICAyLjY0Ci07Ly8gICBOb3RlIHRoYXQgdGhpcyBpbnB1dCBwYXR0ZXJuIGlzIHRoZSB0cmFuc3Bvc2Ugb2YgdGhlCi07Ly8gICBjb3JyZXNwb25kaW5nIG1heCBpbnB1dCBwYXR0ZXIgZm9yIHRoZSBGRENULgotCi07Ly8gQXJndW1lbnRzCi0KLXBTcmMgICAgUk4gMCAgICA7Ly8gc291cmNlIGRhdGEgYnVmZmVyCi1TdHJpZGUgIFJOIDEgICAgOy8vIGRlc3RpbmF0aW9uIHN0cmlkZSBpbiBieXRlcwotcERlc3QgICBSTiAyICAgIDsvLyBkZXN0aW5hdGlvbiBkYXRhIGJ1ZmZlcgotcFNjYWxlICBSTiAzICAgIDsvLyBwb2ludGVyIHRvIHNjYWxpbmcgdGFibGUKLQotCi0gICAgICAgIDsvLyBEQ1QgSW52ZXJzZSBNYWNybwotICAgICAgICA7Ly8gVGhlIERDVCBjb2RlIHNob3VsZCBiZSBwYXJhbWV0cml6ZWQgYWNjb3JkaW5nCi0gICAgICAgIDsvLyB0byB0aGUgZm9sbG93aW5nIGlucHV0czoKLSAgICAgICAgOy8vICRvdXRzaXplID0gInU4IiAgOiAgOC1iaXQgdW5zaWduZWQgZGF0YSBzYXR1cmF0ZWQgKDAgdG8gKzI1NSkKLSAgICAgICAgOy8vICAgICAgICAgICAgInM5IiAgOiAxNi1iaXQgc2lnbmVkIGRhdGEgc2F0dXJhdGVkIHRvIDktYml0ICgtMjU2IHRvICsyNTUpCi0gICAgICAgIDsvLyAgICAgICAgICAgICJzMTYiIDogMTYtYml0IHNpZ25lZCBkYXRhIG5vdCBzYXR1cmF0ZWQgKG1heCBzaXplIH4rLy0xNDI3MykKLSAgICAgICAgOy8vICRpbnNjYWxlID0gInMxNiIgOiBzaWduZWQgMTYtYml0IGFhbi1zY2FsZSB0YWJsZSwgUTE1IGZvcm1hdCwgd2l0aCA0IGJ5dGUgYWxpZ25tZW50Ci0gICAgICAgIDsvLyAgICAgICAgICAgICJzMzIiIDogc2lnbmVkIDMyLWJpdCBhYW4tc2NhbGUgdGFibGUsIFEyMyBmb3JtYXQsIHdpdGggNCBieXRlIGFsaWdubWVudAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0czoKLSAgICAgICAgOy8vIHBTcmMgICA9IHIwID0gUG9pbnRlciB0byBpbnB1dCBkYXRhCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgIFJhbmdlIGlzIC0yNTYgdG8gKzI1NSAoOS1iaXQpCi0gICAgICAgIDsvLyBTdHJpZGUgPSByMSA9IFN0cmlkZSBiZXR3ZWVuIGlucHV0IGxpbmVzCi0gICAgICAgIDsvLyBwRGVzdCAgPSByMiA9IFBvaW50ZXIgdG8gb3V0cHV0IGRhdGEKLSAgICAgICAgOy8vIHBTY2FsZSA9IHIzID0gUG9pbnRlciB0byBhYW4tc2NhbGUgdGFibGUgaW4gdGhlIGZvcm1hdCBkZWZpbmVkIGJ5ICRpbnNjYWxlCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fSURDVCAgJG91dHNpemUsICRpbnNjYWxlLCAkc3RyaWRlCi0gICAgICAgIExDTEEgICAgU0hJRlQKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBJRiBBUk0xMTM2SlMKLSAgICAgICAgCi07Ly8gUkVHSVNURVIgQUxMT0NBVElPTgotOy8vIFRoaXMgaXMgaGFyZCBzaW5jZSB3ZSBoYXZlIDggdmFsdWVzLCA5IGZyZWUgcmVnaXN0ZXJzIGFuZCBlYWNoCi07Ly8gYnV0dGVyZmx5IHJlcXVpcmVzIGEgdGVtcG9yYXJ5IHJlZ2lzdGVyLiBXZSBhbHNvIHdhbnQgdG8gCi07Ly8gbWFpbnRhaW4gcmVnaXN0ZXIgb3JkZXIgc28gd2UgY2FuIHVzZSBMRE0vU1RNLiBUaGUgdGFibGUgYmVsb3cKLTsvLyBzdW1tYXJpc2VzIHRoZSByZWdpc3RlciBhbGxvY2F0aW9uIHRoYXQgbWVldHMgYWxsIHRoZXNlIGNyaXRlcmlhLgotOy8vIGE9MXN0Y29sLCBiPTJuZGNvbCwgZixnLGgsaSBhcmUgZGF0YWZsb3cgcG9pbnRzIGRlc2NyaWJlZCBhYm92ZS4KLTsvLwotOy8vIHIxICBhMDEgICAgIGcwICBoMAotOy8vIHI0ICBiMDEgZjAgIGcxICBoMSAgaTAKLTsvLyByNSAgYTIzIGYxICBnMiAgICAgIGkxCi07Ly8gcjYgIGIyMyBmMiAgZzMgIGgyICBpMgotOy8vIHI3ICBhNDUgZjMgICAgICBoMyAgaTMKLTsvLyByOCAgYjQ1IGY0ICBnNCAgaDQgIGk0Ci07Ly8gcjkgIGE2NyBmNSAgZzUgIGg1ICBpNQotOy8vIHIxMCBiNjcgZjYgIGc2ICBoNiAgaTYKLTsvLyByMTEgICAgIGY3ICBnNyAgaDcgIGk3Ci07Ly8KLXJhMDEgICAgUk4gMQotcmIwMSAgICBSTiA0Ci1yYTIzICAgIFJOIDUKLXJiMjMgICAgUk4gNgotcmE0NSAgICBSTiA3Ci1yYjQ1ICAgIFJOIDgKLXJhNjcgICAgUk4gOQotcmI2NyAgICBSTiAxMAotcnRtcCAgICBSTiAxMQotY3NQaUJ5OCBSTiAxMiAgIDsvLyBbIChTaW4ocGkvOClAUTE1KSwgKENvcyhwaS84KUBRMTUpIF0KLUxvb3BSUjIgUk4gMTQgICA7Ly8gWyBMb29wTnVtYmVyPDwxMyAsICgxL1NxcnQoMikpQFExNSBdCi07Ly8gVHJhbnNwb3NlIGFsbG9jYXRpb24KLXhmdCAgICAgUk4gcmEwMQoteGYwICAgICBSTiByYjAxCi14ZjEgICAgIFJOIHJhMjMKLXhmMiAgICAgUk4gcmIyMwoteGYzICAgICBSTiByYTQ1Ci14ZjQgICAgIFJOIHJiNDUKLXhmNSAgICAgUk4gcmE2NwoteGY2ICAgICBSTiByYjY3Ci14ZjcgICAgIFJOIHJ0bXAKLTsvLyBJU3RhZ2UgMSBhbGxvY2F0aW9uCi14ZzAgICAgIFJOIHhmdAoteGcxICAgICBSTiB4ZjAKLXhnMiAgICAgUk4geGYxCi14ZzMgICAgIFJOIHhmMgoteGd0ICAgICBSTiB4ZjMKLXhnNCAgICAgUk4geGY0Ci14ZzUgICAgIFJOIHhmNQoteGc2ICAgICBSTiB4ZjYKLXhnNyAgICAgUk4geGY3Ci07Ly8gSVN0YWdlIDIgYWxsb2NhdGlvbgoteGgwICAgICBSTiB4ZzAKLXhoMSAgICAgUk4geGcxCi14aHQgICAgIFJOIHhnMgoteGgyICAgICBSTiB4ZzMKLXhoMyAgICAgUk4geGd0Ci14aDQgICAgIFJOIHhnNAoteGg1ICAgICBSTiB4ZzUKLXhoNiAgICAgUk4geGc2Ci14aDcgICAgIFJOIHhnNwotOy8vIElTdGFnZSAzLDQgYWxsb2NhdGlvbgoteGl0ICAgICBSTiB4aDAKLXhpMCAgICAgUk4geGgxCi14aTEgICAgIFJOIHhodAoteGkyICAgICBSTiB4aDIKLXhpMyAgICAgUk4geGgzCi14aTQgICAgIFJOIHhoNAoteGk1ICAgICBSTiB4aDUKLXhpNiAgICAgUk4geGg2Ci14aTcgICAgIFJOIHhoNwotICAgICAgICAKLSAgICAgICAgTV9TVFIgICBwRGVzdCwgIHBwRGVzdAotICAgICAgICBJRiAiJHN0cmlkZSI9InMiCi0gICAgICAgICAgICBNX1NUUiAgIFN0cmlkZSwgcFN0cmlkZQotICAgICAgICBFTkRJRgotICAgICAgICBNX0FEUiAgIHBEZXN0LCAgcEJsawotICAgICAgICBMRFIgICAgIGNzUGlCeTgsID0weDMwZmM3NjQyCi0gICAgICAgIExEUiAgICAgTG9vcFJSMiwgPTB4MDAwMDVhODIKLSAgCi12Nl9pZGN0X2NvbCRfRgotICAgICAgICA7Ly8gTG9hZCBldmVuIHZhbHVlcwotICAgICAgICBMRFIgICAgIHhpNCwgW3BTcmNdLCAjNCAgOy8vIGowCi0gICAgICAgIExEUiAgICAgeGk1LCBbcFNyYywgIzQqMTYtNF0gIDsvLyBqNAotICAgICAgICBMRFIgICAgIHhpNiwgW3BTcmMsICMyKjE2LTRdICA7Ly8gajIKLSAgICAgICAgTERSICAgICB4aTcsIFtwU3JjLCAjNioxNi00XSAgOy8vIGo2Ci0gICAgICAgIAotICAgICAgICA7Ly8gU2NhbGUgRXZlbiBWYWx1ZXMKLSAgICAgICAgSUYgIiRpbnNjYWxlIj0iczE2IiA7Ly8gMTZ4MTYgbXVsCi1TSElGVCAgICAgICBTRVRBICAgIDEyCi0gICAgICAgICAgICBMRFIgICAgIHhpMCwgW3BTY2FsZV0sICM0Ci0gICAgICAgICAgICBMRFIgICAgIHhpMSwgW3BTY2FsZSwgIzQqMTYtNF0gICAgICAgIAotICAgICAgICAgICAgTERSICAgICB4aTIsIFtwU2NhbGUsICMyKjE2LTRdCi0gICAgICAgICAgICBNT1YgICAgIHhpdCwgIzE8PChTSElGVC0xKQotICAgICAgICAgICAgU01MQUJCICB4aTMsIHhpMCwgeGk0LCB4aXQKLSAgICAgICAgICAgIFNNTEFUVCAgeGk0LCB4aTAsIHhpNCwgeGl0Ci0gICAgICAgICAgICBTTUxBQkIgIHhpMCwgeGkxLCB4aTUsIHhpdAotICAgICAgICAgICAgU01MQVRUICB4aTUsIHhpMSwgeGk1LCB4aXQKLSAgICAgICAgICAgIE1PViAgICAgeGkzLCB4aTMsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGk0LCB4aTMsIHhpNCwgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBMRFIgICAgIHhpMywgW3BTY2FsZSwgIzYqMTYtNF0KLSAgICAgICAgICAgIFNNTEFCQiAgeGkxLCB4aTIsIHhpNiwgeGl0Ci0gICAgICAgICAgICBTTUxBVFQgIHhpNiwgeGkyLCB4aTYsIHhpdAotICAgICAgICAgICAgTU9WICAgICB4aTAsIHhpMCwgQVNSICNTSElGVAotICAgICAgICAgICAgUEtIQlQgICB4aTUsIHhpMCwgeGk1LCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIFNNTEFCQiAgeGkyLCB4aTMsIHhpNywgeGl0Ci0gICAgICAgICAgICBTTUxBVFQgIHhpNywgeGkzLCB4aTcsIHhpdAotICAgICAgICAgICAgTU9WICAgICB4aTEsIHhpMSwgQVNSICNTSElGVAotICAgICAgICAgICAgUEtIQlQgICB4aTYsIHhpMSwgeGk2LCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIE1PViAgICAgeGkyLCB4aTIsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGk3LCB4aTIsIHhpNywgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkaW5zY2FsZSI9InMzMiIgOy8vIDMyeDE2IG11bAotU0hJRlQgICAgICAgU0VUQSAgICAoMTIrOC0xNikKLSAgICAgICAgICAgIE1PViAgICAgeGl0LCAjMTw8KFNISUZULTEpCi0gICAgICAgICAgICBMRFIgICAgIHhpMCwgW3BTY2FsZV0sICM4Ci0gICAgICAgICAgICBMRFIgICAgIHhpMSwgW3BTY2FsZSwgIzAqMzIrNC04XQotICAgICAgICAgICAgTERSICAgICB4aTIsIFtwU2NhbGUsICM0KjMyLThdCi0gICAgICAgICAgICBMRFIgICAgIHhpMywgW3BTY2FsZSwgIzQqMzIrNC04XSAgICAgICAgICAgIAotICAgICAgICAgICAgU01MQVdCICB4aTAsIHhpMCwgeGk0LCB4aXQKLSAgICAgICAgICAgIFNNTEFXVCAgeGkxLCB4aTEsIHhpNCwgeGl0Ci0gICAgICAgICAgICBTTUxBV0IgIHhpMiwgeGkyLCB4aTUsIHhpdAotICAgICAgICAgICAgU01MQVdUICB4aTMsIHhpMywgeGk1LCB4aXQgICAgICAgICAgICAKLSAgICAgICAgICAgIE1PViAgICAgeGkwLCB4aTAsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGk0LCB4aTAsIHhpMSwgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBBU1IgI1NISUZUICAgICAgICAgICAgCi0gICAgICAgICAgICBQS0hCVCAgIHhpNSwgeGkyLCB4aTMsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgTERSICAgICB4aTAsIFtwU2NhbGUsICMyKjMyLThdCi0gICAgICAgICAgICBMRFIgICAgIHhpMSwgW3BTY2FsZSwgIzIqMzIrNC04XQotICAgICAgICAgICAgTERSICAgICB4aTIsIFtwU2NhbGUsICM2KjMyLThdCi0gICAgICAgICAgICBMRFIgICAgIHhpMywgW3BTY2FsZSwgIzYqMzIrNC04XSAgICAgICAgICAgIAotICAgICAgICAgICAgU01MQVdCICB4aTAsIHhpMCwgeGk2LCB4aXQKLSAgICAgICAgICAgIFNNTEFXVCAgeGkxLCB4aTEsIHhpNiwgeGl0Ci0gICAgICAgICAgICBTTUxBV0IgIHhpMiwgeGkyLCB4aTcsIHhpdAotICAgICAgICAgICAgU01MQVdUICB4aTMsIHhpMywgeGk3LCB4aXQgICAgICAgICAgICAKLSAgICAgICAgICAgIE1PViAgICAgeGkwLCB4aTAsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGk2LCB4aTAsIHhpMSwgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBBU1IgI1NISUZUICAgICAgICAgICAgCi0gICAgICAgICAgICBQS0hCVCAgIHhpNywgeGkyLCB4aTMsIExTTCAjKDE2LVNISUZUKQotICAgICAgICBFTkRJRgotICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBvZGQgdmFsdWVzCi0gICAgICAgIExEUiAgICAgeGkwLCBbcFNyYywgIzEqMTYtNF0gICAgICA7Ly8gajEKLSAgICAgICAgTERSICAgICB4aTEsIFtwU3JjLCAjNyoxNi00XSAgICAgIDsvLyBqNwotICAgICAgICBMRFIgICAgIHhpMiwgW3BTcmMsICM1KjE2LTRdICAgICAgOy8vIGo1Ci0gICAgICAgIExEUiAgICAgeGkzLCBbcFNyYywgIzMqMTYtNF0gICAgICA7Ly8gajMKLSAgICAgICAgCi0gICAgICAgIElGICB7VFJVRX0KLSAgICAgICAgICAgIDsvLyBzaG9ydGN1dCBpZiBvZGQgdmFsdWVzIDAKLSAgICAgICAgICAgIFRFUSAgICAgeGkwLCAjMAotICAgICAgICAgICAgVEVRRVEgICB4aTEsICMwCi0gICAgICAgICAgICBURVFFUSAgIHhpMiwgIzAKLSAgICAgICAgICAgIFRFUUVRICAgeGkzLCAjMAotICAgICAgICAgICAgQkVRICAgICB2Nk9kZFplcm8kX0YKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIDsvLyBTdG9yZSBzY2FsZWQgZXZlbiB2YWx1ZXMKLSAgICAgICAgU1RNSUEgICBwRGVzdCwge3hpNCwgeGk1LCB4aTYsIHhpN30KLSAgICAgICAgCi0gICAgICAgIDsvLyBTY2FsZSBvZGQgdmFsdWVzCi0gICAgICAgIElGICIkaW5zY2FsZSI9InMxNiIKLSAgICAgICAgICAgIDsvLyBQZXJmb3JtIEFBTiBTY2FsZQotICAgICAgICAgICAgTERSICAgICB4aTQsIFtwU2NhbGUsICMxKjE2LTRdCi0gICAgICAgICAgICBMRFIgICAgIHhpNSwgW3BTY2FsZSwgIzcqMTYtNF0gICAgICAgIAotICAgICAgICAgICAgTERSICAgICB4aTYsIFtwU2NhbGUsICM1KjE2LTRdCi0gICAgICAgICAgICBTTUxBQkIgIHhpNywgeGkwLCB4aTQsIHhpdAotICAgICAgICAgICAgU01MQVRUICB4aTAsIHhpMCwgeGk0LCB4aXQKLSAgICAgICAgICAgIFNNTEFCQiAgeGk0LCB4aTEsIHhpNSwgeGl0Ci0gICAgICAgICAgICBTTUxBVFQgIHhpMSwgeGkxLCB4aTUsIHhpdAotICAgICAgICAgICAgTU9WICAgICB4aTcsIHhpNywgQVNSICNTSElGVAotICAgICAgICAgICAgUEtIQlQgICB4aTAsIHhpNywgeGkwLCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIExEUiAgICAgeGk3LCBbcFNjYWxlLCAjMyoxNi00XQotICAgICAgICAgICAgU01MQUJCICB4aTUsIHhpMiwgeGk2LCB4aXQKLSAgICAgICAgICAgIFNNTEFUVCAgeGkyLCB4aTIsIHhpNiwgeGl0Ci0gICAgICAgICAgICBNT1YgICAgIHhpNCwgeGk0LCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpMSwgeGk0LCB4aTEsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgU01MQUJCICB4aTYsIHhpMywgeGk3LCB4aXQKLSAgICAgICAgICAgIFNNTEFUVCAgeGkzLCB4aTMsIHhpNywgeGl0Ci0gICAgICAgICAgICBNT1YgICAgIHhpNSwgeGk1LCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpMiwgeGk1LCB4aTIsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgTU9WICAgICB4aTYsIHhpNiwgQVNSICNTSElGVAotICAgICAgICAgICAgUEtIQlQgICB4aTMsIHhpNiwgeGkzLCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRpbnNjYWxlIj0iczMyIiA7Ly8gMzJ4MTYgbXVsCi0gICAgICAgICAgICBMRFIgICAgIHhpNCwgW3BTY2FsZSwgIzEqMzItOF0KLSAgICAgICAgICAgIExEUiAgICAgeGk1LCBbcFNjYWxlLCAjMSozMis0LThdCi0gICAgICAgICAgICBMRFIgICAgIHhpNiwgW3BTY2FsZSwgIzcqMzItOF0KLSAgICAgICAgICAgIExEUiAgICAgeGk3LCBbcFNjYWxlLCAjNyozMis0LThdICAgICAgICAgICAgCi0gICAgICAgICAgICBTTUxBV0IgIHhpNCwgeGk0LCB4aTAsIHhpdAotICAgICAgICAgICAgU01MQVdUICB4aTUsIHhpNSwgeGkwLCB4aXQKLSAgICAgICAgICAgIFNNTEFXQiAgeGk2LCB4aTYsIHhpMSwgeGl0Ci0gICAgICAgICAgICBTTUxBV1QgIHhpNywgeGk3LCB4aTEsIHhpdCAgICAgICAgICAgIAotICAgICAgICAgICAgTU9WICAgICB4aTQsIHhpNCwgQVNSICNTSElGVAotICAgICAgICAgICAgUEtIQlQgICB4aTAsIHhpNCwgeGk1LCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIE1PViAgICAgeGk2LCB4aTYsIEFTUiAjU0hJRlQgICAgICAgICAgICAKLSAgICAgICAgICAgIFBLSEJUICAgeGkxLCB4aTYsIHhpNywgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBMRFIgICAgIHhpNCwgW3BTY2FsZSwgIzUqMzItOF0KLSAgICAgICAgICAgIExEUiAgICAgeGk1LCBbcFNjYWxlLCAjNSozMis0LThdCi0gICAgICAgICAgICBMRFIgICAgIHhpNiwgW3BTY2FsZSwgIzMqMzItOF0KLSAgICAgICAgICAgIExEUiAgICAgeGk3LCBbcFNjYWxlLCAjMyozMis0LThdICAgICAgICAgICAgCi0gICAgICAgICAgICBTTUxBV0IgIHhpNCwgeGk0LCB4aTIsIHhpdAotICAgICAgICAgICAgU01MQVdUICB4aTUsIHhpNSwgeGkyLCB4aXQKLSAgICAgICAgICAgIFNNTEFXQiAgeGk2LCB4aTYsIHhpMywgeGl0Ci0gICAgICAgICAgICBTTUxBV1QgIHhpNywgeGk3LCB4aTMsIHhpdCAgICAgICAgICAgIAotICAgICAgICAgICAgTU9WICAgICB4aTQsIHhpNCwgQVNSICNTSElGVAotICAgICAgICAgICAgUEtIQlQgICB4aTIsIHhpNCwgeGk1LCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIE1PViAgICAgeGk2LCB4aTYsIEFTUiAjU0hJRlQgICAgICAgICAgICAKLSAgICAgICAgICAgIFBLSEJUICAgeGkzLCB4aTYsIHhpNywgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBTSEFERDE2IHhpNSwgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajErajcpLzIKLSAgICAgICAgU1NVQjE2ICB4aTYsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gajEtajcKLSAgICAgICAgU0hBREQxNiB4aTcsIHhpMiwgeGkzICAgICAgICAgICA7Ly8gKGo1K2ozKS8yCi0gICAgICAgIFNTVUIxNiAgeGk0LCB4aTIsIHhpMyAgICAgICAgICAgOy8vIGo1LWozCi0gICAgICAgIAotICAgICAgICBTU1VCMTYgIHhpMywgeGk1LCB4aTcgICAgICAgICAgIDsvLyAoaTUtaTcpLzIKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgeGkwLCB4aTYsIHhpNCwgTFNMIzE2ICAgOy8vIFtpNCxpNl0gcm93IGEKLSAgICAgICAgUEtIVEIgICB4aTEsIHhpNCwgeGk2LCBBU1IjMTYgICA7Ly8gW2k0LGk2XSByb3cgYgotICAgICAgICAKLSAgICAgICAgU01VQURYICB4aTIsIHhpMCwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YSBieSBbYyxzXQotICAgICAgICBTTVVBRFggIHhpNCwgeGkxLCBjc1BpQnk4ICAgICAgIDsvLyByb3diIGJ5IFtjLHNdCi0gICAgICAgIFNNVVNEICAgeGkwLCB4aTAsIGNzUGlCeTggICAgICAgOy8vIHJvd2EgYnkgWy1zLGNdICAgCi0gICAgICAgIFNNVVNEICAgeGk2LCB4aTEsIGNzUGlCeTggICAgICAgOy8vIHJvd2IgYnkgWy1zLGNdCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIFNNVUxCQiAgeGkxLCB4aTMsIExvb3BSUjIKLSAgICAgICAgU01VTFRCICB4aTMsIHhpMywgTG9vcFJSMgotICAgICAgICAgICAgICAgIAotICAgICAgICBQS0hUQiAgIHhoNCwgeGk0LCB4aTIsIEFTUiMxNiAgIDsvLyBoNC80Ci0gICAgICAgIFBLSFRCICAgeGg2LCB4aTYsIHhpMCwgQVNSIzE2ICAgOy8vIGg2LzQKLSAgICAgICAgU0hBREQxNiB4aDcsIHhpNSwgeGk3ICAgICAgICAgICA7Ly8gKGk1K2k3KS80Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyB4aTAseGkxLHhpMix4aTMgbm93IGZyZWUKLSAgICAgICAgOy8vIElTdGFnZSA0LDMsIHJvd3MgMnRvMyB4MS8yCi0gICAgICAgIAotICAgICAgICBNT1YgICAgIHhpMywgeGkzLCBMU0wgIzEKLSAgICAgICAgUEtIVEIgICB4aDUsIHhpMywgeGkxLCBBU1IjMTUgICA7Ly8gaDUvNAotICAgICAgICBMRFJEICAgIHhpMCwgW3BEZXN0LCAjOF0gICAgICAgIDsvLyBqMixqNiBzY2FsZWQKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIElTdGFnZSAyLCByb3dzNHRvNwotICAgICAgICBTU1VCMTYgIHhnNiwgeGg2LCB4aDcKLSAgICAgICAgU1NVQjE2ICB4ZzUsIHhoNSwgeGc2ICAgICAgICAKLSAgICAgICAgU1NVQjE2ICB4ZzQsIHhoNCwgeGc1Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIFNTVUIxNiAgeGkyLCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMi1qNikKLSAgICAgICAgU0hBREQxNiB4aTMsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoyK2o2KS8yCi0gICAgICAgIAotICAgICAgICBTTVVMQkIgIHhpMCwgeGkyLCBMb29wUlIyCi0gICAgICAgIFNNVUxUQiAgeGkyLCB4aTIsIExvb3BSUjIKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgeGkyLCB4aTIsIExTTCAjMQotICAgICAgICBQS0hUQiAgIHhoMiwgeGkyLCB4aTAsIEFTUiMxNSAgIDsvLyBpMipzcXJ0KDIpLzQKLSAgICAgICAgCi0gICAgICAgIDsvLyB4aTAsIHhpMSBub3cgZnJlZQotICAgICAgICA7Ly8gSVN0YWdlIDQsMyByb3dzIDB0bzEgeCAxLzIKLSAgICAgICAgTERSRCAgICB4aTAsIFtwRGVzdF0gICAgICAgICAgICA7Ly8gajAsIGo0IHNjYWxlZAotICAgICAgICBTU1VCMTYgIHhoMiwgeGgyLCB4aTMKLSAgICAgICAgQUREUyAgICBMb29wUlIyLCBMb29wUlIyLCAjMjw8MjkgICAgOy8vIGRvbmUgdHdvIHJvd3MKLSAgICAgICAgCi0gICAgICAgIFNIQUREMTYgeGgwLCB4aTAsIHhpMQotICAgICAgICBTSFNVQjE2IHhoMSwgeGkwLCB4aTEgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gSVN0YWdlIDIgcm93cyAwdG8zIHggMS8yCi0gICAgICAgIFNIU1VCMTYgeGcyLCB4aDEsIHhoMgotICAgICAgICBTSEFERDE2IHhnMSwgeGgxLCB4aDIKLSAgICAgICAgU0hTVUIxNiB4ZzMsIHhoMCwgeGgzCi0gICAgICAgIFNIQUREMTYgeGcwLCB4aDAsIHhoMwotICAgICAgICAKLSAgICAgICAgOy8vIElTdGFnZSAxIGFsbCByb3dzCi0gICAgICAgIFNBREQxNiAgeGYzLCB4ZzMsIHhnNAotICAgICAgICBTU1VCMTYgIHhmNCwgeGczLCB4ZzQKLSAgICAgICAgU0FERDE2ICB4ZjIsIHhnMiwgeGc1Ci0gICAgICAgIFNTVUIxNiAgeGY1LCB4ZzIsIHhnNQotICAgICAgICBTQUREMTYgIHhmMSwgeGcxLCB4ZzYKLSAgICAgICAgU1NVQjE2ICB4ZjYsIHhnMSwgeGc2Ci0gICAgICAgIFNBREQxNiAgeGYwLCB4ZzAsIHhnNwotICAgICAgICBTU1VCMTYgIHhmNywgeGcwLCB4ZzcKLSAgICAgICAgCi0gICAgICAgIDsvLyBUcmFuc3Bvc2UsIHN0b3JlIGFuZCBsb29wCi0gICAgICAgIFBLSEJUICAgcmEwMSwgeGYwLCB4ZjEsIExTTCAjMTYKLSAgICAgICAgUEtIVEIgICByYjAxLCB4ZjEsIHhmMCwgQVNSICMxNgotICAgICAgICAKLSAgICAgICAgUEtIQlQgICByYTIzLCB4ZjIsIHhmMywgTFNMICMxNgotICAgICAgICBQS0hUQiAgIHJiMjMsIHhmMywgeGYyLCBBU1IgIzE2Ci0gICAgICAgIAotICAgICAgICBQS0hCVCAgIHJhNDUsIHhmNCwgeGY1LCBMU0wgIzE2Ci0gICAgICAgIFBLSFRCICAgcmI0NSwgeGY1LCB4ZjQsIEFTUiAjMTYKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgcmE2NywgeGY2LCB4ZjcsIExTTCAjMTYKLSAgICAgICAgU1RNSUEgICBwRGVzdCEsIHtyYTAxLCByYTIzLCByYTQ1LCByYTY3fSAgICAgIAotICAgICAgICBQS0hUQiAgIHJiNjcsIHhmNywgeGY2LCBBU1IgIzE2Ci0gICAgICAgIFNUTUlBICAgcERlc3QhLCB7cmIwMSwgcmIyMywgcmI0NSwgcmI2N30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQkNDICAgICB2Nl9pZGN0X2NvbCRfRgotICAgICAgICAKLSAgICAgICAgU1VCICAgICBwU3JjLCBwRGVzdCwgIyg2NCoyKQotICAgICAgICBNX0xEUiAgIHBEZXN0LCBwcERlc3QKLSAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgotICAgICAgICAgICAgTV9MRFIgICBwU2NhbGUsIHBTdHJpZGUgCi0gICAgICAgIEVORElGCi0gICAgICAgIEIgICAgICAgdjZfaWRjdF9yb3ckX0YKLSAgICAgICAgCi12Nk9kZFplcm8kX0YKLSAgICAgICAgU1NVQjE2ICB4aTIsIHhpNiwgeGk3ICAgICAgICAgICA7Ly8gKGoyLWo2KQotICAgICAgICBTSEFERDE2IHhpMywgeGk2LCB4aTcgICAgICAgICAgIDsvLyAoajIrajYpLzIKLSAgICAgICAgCi0gICAgICAgIFNNVUxCQiAgeGkwLCB4aTIsIExvb3BSUjIKLSAgICAgICAgU01VTFRCICB4aTIsIHhpMiwgTG9vcFJSMgotICAgICAgICAKLSAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgTFNMICMxCi0gICAgICAgIFBLSFRCICAgeGgyLCB4aTIsIHhpMCwgQVNSIzE1ICAgOy8vIGkyKnNxcnQoMikvNAotICAgICAgICBTU1VCMTYgIHhoMiwgeGgyLCB4aTMKLSAgICAgICAgCi0gICAgICAgIDsvLyB4aTAsIHhpMSBub3cgZnJlZQotICAgICAgICA7Ly8gSVN0YWdlIDQsMyByb3dzIDB0bzEgeCAxLzIKLSAgICAgICAgCi0gICAgICAgIFNIQUREMTYgeGgwLCB4aTQsIHhpNQotICAgICAgICBTSFNVQjE2IHhoMSwgeGk0LCB4aTUgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gSVN0YWdlIDIgcm93cyAwdG8zIHggMS8yCi0gICAgICAgIFNIU1VCMTYgeGcyLCB4aDEsIHhoMgotICAgICAgICBTSEFERDE2IHhnMSwgeGgxLCB4aDIKLSAgICAgICAgU0hTVUIxNiB4ZzMsIHhoMCwgeGgzCi0gICAgICAgIFNIQUREMTYgeGcwLCB4aDAsIHhoMwotICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBJU3RhZ2UgMSBhbGwgcm93cwotICAgICAgICBNT1YgIHhmMywgeGczCi0gICAgICAgIE1PViAgeGY0LCB4ZzMKLSAgICAgICAgTU9WICB4ZjIsIHhnMgotICAgICAgICBNT1YgIHhmNSwgeGcyCi0gICAgICAgIE1PViAgeGYxLCB4ZzEKLSAgICAgICAgTU9WICB4ZjYsIHhnMQotICAgICAgICBNT1YgIHhmMCwgeGcwCi0gICAgICAgIE1PViAgeGY3LCB4ZzAKLSAgICAgICAgCi0gICAgICAgIDsvLyBUcmFuc3Bvc2UKLSAgICAgICAgUEtIQlQgICByYTAxLCB4ZjAsIHhmMSwgTFNMICMxNgotICAgICAgICBQS0hUQiAgIHJiMDEsIHhmMSwgeGYwLCBBU1IgIzE2Ci0gICAgICAgIAotICAgICAgICBQS0hCVCAgIHJhMjMsIHhmMiwgeGYzLCBMU0wgIzE2Ci0gICAgICAgIFBLSFRCICAgcmIyMywgeGYzLCB4ZjIsIEFTUiAjMTYKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgcmE0NSwgeGY0LCB4ZjUsIExTTCAjMTYKLSAgICAgICAgUEtIVEIgICByYjQ1LCB4ZjUsIHhmNCwgQVNSICMxNgotICAgICAgICAKLSAgICAgICAgUEtIQlQgICByYTY3LCB4ZjYsIHhmNywgTFNMICMxNgotICAgICAgICBQS0hUQiAgIHJiNjcsIHhmNywgeGY2LCBBU1IgIzE2Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIFNUTUlBICAgcERlc3QhLCB7cmEwMSwgcmEyMywgcmE0NSwgcmE2N30gICAgICAKLSAgICAgICAgQUREUyAgICBMb29wUlIyLCBMb29wUlIyLCAjMjw8MjkgICAgOy8vIGRvbmUgdHdvIHJvd3MKLSAgICAgICAgU1RNSUEgICBwRGVzdCEsIHtyYjAxLCByYjIzLCByYjQ1LCByYjY3fSAgICAgIAotICAgICAgICAKLSAgICAgICAgQkNDICAgICB2Nl9pZGN0X2NvbCRfRgotICAgICAgICBTVUIgICAgIHBTcmMsIHBEZXN0LCAjKDY0KjIpCi0gICAgICAgIE1fTERSICAgcERlc3QsIHBwRGVzdAotICAgICAgICBJRiAiJHN0cmlkZSI9InMiCi0gICAgICAgICAgICBNX0xEUiAgIHBTY2FsZSwgcFN0cmlkZSAKLSAgICAgICAgRU5ESUYKLSAgICAgICAgICAgICAgIAotICAgICAgICAKLXY2X2lkY3Rfcm93JF9GCi0gICAgICAgIDsvLyBJU3RhZ2UgNCwzLCByb3dzNHRvNyB4MS80Ci0gICAgICAgIExEUiAgICAgeGl0LCA9MHgwMDAxMDAwMSAgICAgICAgOy8vIHJvdW5kaW5nIGNvbnN0YW50Ci0gICAgICAgIExEUiAgICAgeGkwLCBbcFNyYywgIzEqMTZdICAgICAgOy8vIGoxCi0gICAgICAgIExEUiAgICAgeGkxLCBbcFNyYywgIzcqMTZdICAgICAgOy8vIDQqajcKLSAgICAgICAgTERSICAgICB4aTIsIFtwU3JjLCAjNSoxNl0gICAgICA7Ly8gajUKLSAgICAgICAgTERSICAgICB4aTMsIFtwU3JjLCAjMyoxNl0gICAgICA7Ly8gajMKLSAgICAgICAgCi0gICAgICAgIFNIQUREMTYgeGkxLCB4aTEsIHhpdCAgICAgICAgICAgOy8vIDIqajcKLSAgICAgICAgU0hBREQxNiB4aTEsIHhpMSwgeGl0ICAgICAgICAgICA7Ly8gajcgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBTSEFERDE2IHhpNSwgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajErajcpLzIKLSAgICAgICAgU1NVQjE2ICB4aTYsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gajEtajcKLSAgICAgICAgU0hBREQxNiB4aTcsIHhpMiwgeGkzICAgICAgICAgICA7Ly8gKGo1K2ozKS8yCi0gICAgICAgIFNTVUIxNiAgeGk0LCB4aTIsIHhpMyAgICAgICAgICAgOy8vIGo1LWozCi0gICAgICAgIAotICAgICAgICBTU1VCMTYgIHhpMywgeGk1LCB4aTcgICAgICAgICAgIDsvLyAoaTUtaTcpLzIKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgeGkwLCB4aTYsIHhpNCwgTFNMIzE2ICAgOy8vIFtpNCxpNl0gcm93IGEKLSAgICAgICAgUEtIVEIgICB4aTEsIHhpNCwgeGk2LCBBU1IjMTYgICA7Ly8gW2k0LGk2XSByb3cgYgotICAgICAgICAKLSAgICAgICAgU01VQURYICB4aTIsIHhpMCwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YSBieSBbYyxzXQotICAgICAgICBTTVVBRFggIHhpNCwgeGkxLCBjc1BpQnk4ICAgICAgIDsvLyByb3diIGJ5IFtjLHNdCi0gICAgICAgIFNNVVNEICAgeGkwLCB4aTAsIGNzUGlCeTggICAgICAgOy8vIHJvd2EgYnkgWy1zLGNdICAgCi0gICAgICAgIFNNVVNEICAgeGk2LCB4aTEsIGNzUGlCeTggICAgICAgOy8vIHJvd2IgYnkgWy1zLGNdCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIFNNVUxCQiAgeGkxLCB4aTMsIExvb3BSUjIKLSAgICAgICAgU01VTFRCICB4aTMsIHhpMywgTG9vcFJSMgotICAgICAgICAgICAgICAgIAotICAgICAgICBQS0hUQiAgIHhoNCwgeGk0LCB4aTIsIEFTUiMxNiAgIDsvLyBoNC80Ci0gICAgICAgIFBLSFRCICAgeGg2LCB4aTYsIHhpMCwgQVNSIzE2ICAgOy8vIGg2LzQKLSAgICAgICAgU0hBREQxNiB4aDcsIHhpNSwgeGk3ICAgICAgICAgICA7Ly8gKGk1K2k3KS80Ci0gICAgICAgIAotICAgICAgICBNT1YgICAgIHhpMywgeGkzLCBMU0wgIzEKLSAgICAgICAgUEtIVEIgICB4aDUsIHhpMywgeGkxLCBBU1IjMTUgICA7Ly8gaDUvNAotICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyB4aTAseGkxLHhpMix4aTMgbm93IGZyZWUKLSAgICAgICAgOy8vIElTdGFnZSA0LDMsIHJvd3MgMnRvMyB4MS8yCi0gICAgICAgIAotICAgICAgICBMRFIgICAgIHhpMCwgW3BTcmMsICMyKjE2XSAgICAgIDsvLyBqMgotICAgICAgICBMRFIgICAgIHhpMSwgW3BTcmMsICM2KjE2XSAgICAgIDsvLyAyKmo2Ci0gICAgICAgIAotICAgICAgICA7Ly8gSVN0YWdlIDIsIHJvd3M0dG83Ci0gICAgICAgIFNTVUIxNiAgeGc2LCB4aDYsIHhoNwotICAgICAgICBTU1VCMTYgIHhnNSwgeGg1LCB4ZzYKLSAgICAgICAgU1NVQjE2ICB4ZzQsIHhoNCwgeGc1Ci0gICAgICAgIAotICAgICAgICBTSEFERDE2IHhpMSwgeGkxLCB4aXQgICAgICAgICAgIDsvLyBqNgotICAgICAgICBTU1VCMTYgIHhpMiwgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajItajYpICAgICAgICAKLSAgICAgICAgU0hBREQxNiB4aTMsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoyK2o2KS8yCi0gICAgICAgIAotICAgICAgICBTTVVMQkIgIHhpMCwgeGkyLCBMb29wUlIyCi0gICAgICAgIFNNVUxUQiAgeGkyLCB4aTIsIExvb3BSUjIKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgeGkyLCB4aTIsIExTTCAjMQotICAgICAgICAKLSAgICAgICAgUEtIVEIgICB4aDIsIHhpMiwgeGkwLCBBU1IjMTUgICA7Ly8gaTIqc3FydCgyKS80Ci0gICAgICAgIAotICAgICAgICA7Ly8geGkwLCB4aTEgbm93IGZyZWUKLSAgICAgICAgOy8vIElTdGFnZSA0LDMgcm93cyAwdG8xIHggMS8yCi0gICAgICAgIExEUiAgICAgeGkxLCBbcFNyYywgIzQqMTZdICAgICAgOy8vIGo0Ci0gICAgICAgIExEUiAgICAgeGkwLCBbcFNyY10sICM0ICAgICAgICAgOy8vIGowCi0KLSAgICAgICAgU1NVQjE2ICB4aDIsIHhoMiwgeGkzCi0gICAgICAgIEFERFMgICAgTG9vcFJSMiwgTG9vcFJSMiwgIzI8PDI5ICAgIDsvLyBkb25lIHR3byByb3dzCi0gICAgICAgIAotICAgICAgICBBREQgICAgIHhpMCwgeGkwLCB4aXQsIExTTCAjMiAgIDsvLyBlbnN1cmUgY29ycmVjdCByb3VuZAotICAgICAgICBTSEFERDE2IHhoMCwgeGkwLCB4aTEgICAgICAgICAgIDsvLyBvZiBEQyByZXN1bHQKLSAgICAgICAgU0hTVUIxNiB4aDEsIHhpMCwgeGkxCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBJU3RhZ2UgMiByb3dzIDB0bzMgeCAxLzIKLSAgICAgICAgU0hTVUIxNiB4ZzIsIHhoMSwgeGgyCi0gICAgICAgIFNIQUREMTYgeGcxLCB4aDEsIHhoMgotICAgICAgICBTSFNVQjE2IHhnMywgeGgwLCB4aDMKLSAgICAgICAgU0hBREQxNiB4ZzAsIHhoMCwgeGgzCi0gICAgICAgIAotICAgICAgICA7Ly8gSVN0YWdlIDEgYWxsIHJvd3MKLSAgICAgICAgU0hBREQxNiB4ZjMsIHhnMywgeGc0Ci0gICAgICAgIFNIU1VCMTYgeGY0LCB4ZzMsIHhnNAotICAgICAgICBTSEFERDE2IHhmMiwgeGcyLCB4ZzUKLSAgICAgICAgU0hTVUIxNiB4ZjUsIHhnMiwgeGc1Ci0gICAgICAgIFNIQUREMTYgeGYxLCB4ZzEsIHhnNgotICAgICAgICBTSFNVQjE2IHhmNiwgeGcxLCB4ZzYKLSAgICAgICAgU0hBREQxNiB4ZjAsIHhnMCwgeGc3Ci0gICAgICAgIFNIU1VCMTYgeGY3LCB4ZzAsIHhnNwotICAgICAgICAKLSAgICAgICAgOy8vIFNhdHVyYXRlCi0gICAgICAgIElGICgiJG91dHNpemUiPSJ1OCIpCi0gICAgICAgICAgICBVU0FUMTYgIHhmMCwgIzgsIHhmMAotICAgICAgICAgICAgVVNBVDE2ICB4ZjEsICM4LCB4ZjEKLSAgICAgICAgICAgIFVTQVQxNiAgeGYyLCAjOCwgeGYyCi0gICAgICAgICAgICBVU0FUMTYgIHhmMywgIzgsIHhmMwotICAgICAgICAgICAgVVNBVDE2ICB4ZjQsICM4LCB4ZjQKLSAgICAgICAgICAgIFVTQVQxNiAgeGY1LCAjOCwgeGY1Ci0gICAgICAgICAgICBVU0FUMTYgIHhmNiwgIzgsIHhmNgotICAgICAgICAgICAgVVNBVDE2ICB4ZjcsICM4LCB4ZjcgICAgICAgIAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAoIiRvdXRzaXplIj0iczkiKQotICAgICAgICAgICAgU1NBVDE2ICB4ZjAsICM5LCB4ZjAKLSAgICAgICAgICAgIFNTQVQxNiAgeGYxLCAjOSwgeGYxCi0gICAgICAgICAgICBTU0FUMTYgIHhmMiwgIzksIHhmMgotICAgICAgICAgICAgU1NBVDE2ICB4ZjMsICM5LCB4ZjMKLSAgICAgICAgICAgIFNTQVQxNiAgeGY0LCAjOSwgeGY0Ci0gICAgICAgICAgICBTU0FUMTYgIHhmNSwgIzksIHhmNQotICAgICAgICAgICAgU1NBVDE2ICB4ZjYsICM5LCB4ZjYKLSAgICAgICAgICAgIFNTQVQxNiAgeGY3LCAjOSwgeGY3ICAgICAgICAKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIDsvLyBUcmFuc3Bvc2UgdG8gUm93LCBQYWNrIGFuZCBzdG9yZQotICAgICAgICBJRiAoIiRvdXRzaXplIj0idTgiKQotICAgICAgICAgICAgT1JSICAgICB4ZjAsIHhmMCwgeGYxLCBMU0wgIzggOy8vIFsgYjEgYjAgYTEgYTAgXQotICAgICAgICAgICAgT1JSICAgICB4ZjIsIHhmMiwgeGYzLCBMU0wgIzggOy8vIFsgYjMgYjIgYTMgYTIgXQotICAgICAgICAgICAgT1JSICAgICB4ZjQsIHhmNCwgeGY1LCBMU0wgIzggOy8vIFsgYjUgYjQgYTUgYTQgXQotICAgICAgICAgICAgT1JSICAgICB4ZjYsIHhmNiwgeGY3LCBMU0wgIzggOy8vIFsgYjcgYjYgYTcgYTYgXQotICAgICAgICAgICAgUEtIQlQgICByYTAxLCB4ZjAsIHhmMiwgTFNMICMxNgotICAgICAgICAgICAgUEtIVEIgICByYjAxLCB4ZjIsIHhmMCwgQVNSICMxNgotICAgICAgICAgICAgUEtIQlQgICByYTIzLCB4ZjQsIHhmNiwgTFNMICMxNgotICAgICAgICAgICAgUEtIVEIgICByYjIzLCB4ZjYsIHhmNCwgQVNSICMxNgotICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JhMDEsIHJhMjN9Ci0gICAgICAgICAgICBJRiAiJHN0cmlkZSI9InMiCi0gICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsIHBTY2FsZQotICAgICAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYjAxLCByYjIzfQotICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCBwU2NhbGUKLSAgICAgICAgICAgIEVMU0UgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsICMoJHN0cmlkZSkKLSAgICAgICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmIwMSwgcmIyM30KLSAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgIygkc3RyaWRlKQotICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InM5Iik6TE9SOigiJG91dHNpemUiPSJzMTYiKSAgICAgICAgCi0gICAgICAgICAgICBQS0hCVCAgIHJhMDEsIHhmMCwgeGYxLCBMU0wgIzE2Ci0gICAgICAgICAgICBQS0hUQiAgIHJiMDEsIHhmMSwgeGYwLCBBU1IgIzE2Ci0gICAgICAgIAotICAgICAgICAgICAgUEtIQlQgICByYTIzLCB4ZjIsIHhmMywgTFNMICMxNgotICAgICAgICAgICAgUEtIVEIgICByYjIzLCB4ZjMsIHhmMiwgQVNSICMxNgotICAgICAgICAgICAgCi0gICAgICAgICAgICBQS0hCVCAgIHJhNDUsIHhmNCwgeGY1LCBMU0wgIzE2Ci0gICAgICAgICAgICBQS0hUQiAgIHJiNDUsIHhmNSwgeGY0LCBBU1IgIzE2Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFBLSEJUICAgcmE2NywgeGY2LCB4ZjcsIExTTCAjMTYKLSAgICAgICAgICAgIFBLSFRCICAgcmI2NywgeGY3LCB4ZjYsIEFTUiAjMTYKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JhMDEsIHJhMjMsIHJhNDUsIHJhNjd9ICAgICAgCi0gICAgICAgICAgICBJRiAiJHN0cmlkZSI9InMiCi0gICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsIHBTY2FsZQotICAgICAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYjAxLCByYjIzLCByYjQ1LCByYjY3fSAgICAgIAotICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCBwU2NhbGUKLSAgICAgICAgICAgIEVMU0UgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsICMoJHN0cmlkZSkKLSAgICAgICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmIwMSwgcmIyMywgcmI0NSwgcmI2N30gICAgICAKLSAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgIygkc3RyaWRlKQotICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIEJDQyAgICAgdjZfaWRjdF9yb3ckX0YKLSAgICAgICAgRU5ESUYgOy8vIEFSTTExMzZKUwotCi0KLSAgICAgICAgSUYgQ29ydGV4QTgKLSAgICAgICAgCi1TcmMwICAgICAgICAgICAgRVFVICA3ICAgICAgICAgICAgICAKLVNyYzEgICAgICAgICAgICBFUVUgIDggICAgICAgICAgICAgIAotU3JjMiAgICAgICAgICAgIEVRVSAgOSAgICAgICAgICAgICAgCi1TcmMzICAgICAgICAgICAgRVFVICAxMCAgICAgICAgICAgICAgCi1TcmM0ICAgICAgICAgICAgRVFVICAxMSAgICAgICAgICAgICAgCi1TcmM1ICAgICAgICAgICAgRVFVICAxMiAgICAgICAgICAgICAgCi1TcmM2ICAgICAgICAgICAgRVFVICAxMwotU3JjNyAgICAgICAgICAgIEVRVSAgMTQKLVRtcCAgICAgICAgICAgICBFUVUgIDE1Ci0KLXFYajAgICAgICAgICAgICBRTiBTcmMwLlMxNiAKLXFYajEgICAgICAgICAgICBRTiBTcmMxLlMxNgotcVhqMiAgICAgICAgICAgIFFOIFNyYzIuUzE2Ci1xWGozICAgICAgICAgICAgUU4gU3JjMy5TMTYKLXFYajQgICAgICAgICAgICBRTiBTcmM0LlMxNgotcVhqNSAgICAgICAgICAgIFFOIFNyYzUuUzE2Ci1xWGo2ICAgICAgICAgICAgUU4gU3JjNi5TMTYKLXFYajcgICAgICAgICAgICBRTiBTcmM3LlMxNgotcVhqdCAgICAgICAgICAgIFFOIFRtcC5TMTYKLQotZFhqMGxvICAgICAgICAgIEROIChTcmMwKjIpLlMxNgotZFhqMGhpICAgICAgICAgIEROIChTcmMwKjIrMSkuUzE2Ci1kWGoxbG8gICAgICAgICAgRE4gKFNyYzEqMikuUzE2Ci1kWGoxaGkgICAgICAgICAgRE4gKFNyYzEqMisxKS5TMTYKLWRYajJsbyAgICAgICAgICBETiAoU3JjMioyKS5TMTYKLWRYajJoaSAgICAgICAgICBETiAoU3JjMioyKzEpLlMxNgotZFhqM2xvICAgICAgICAgIEROIChTcmMzKjIpLlMxNgotZFhqM2hpICAgICAgICAgIEROIChTcmMzKjIrMSkuUzE2Ci1kWGo0bG8gICAgICAgICAgRE4gKFNyYzQqMikuUzE2Ci1kWGo0aGkgICAgICAgICAgRE4gKFNyYzQqMisxKS5TMTYKLWRYajVsbyAgICAgICAgICBETiAoU3JjNSoyKS5TMTYKLWRYajVoaSAgICAgICAgICBETiAoU3JjNSoyKzEpLlMxNgotZFhqNmxvICAgICAgICAgIEROIChTcmM2KjIpLlMxNgotZFhqNmhpICAgICAgICAgIEROIChTcmM2KjIrMSkuUzE2Ci1kWGo3bG8gICAgICAgICAgRE4gKFNyYzcqMikuUzE2Ci1kWGo3aGkgICAgICAgICAgRE4gKFNyYzcqMisxKS5TMTYKLWRYanRsbyAgICAgICAgICBETiAoVG1wKjIpLlMxNgotZFhqdGhpICAgICAgICAgIEROIChUbXAqMisxKS5TMTYKLQotcVhpMCAgICAgICAgICAgIFFOIHFYajAKLXFYaTEgICAgICAgICAgICBRTiBxWGo0Ci1xWGkyICAgICAgICAgICAgUU4gcVhqMgotcVhpMyAgICAgICAgICAgIFFOIHFYajcKLXFYaTQgICAgICAgICAgICBRTiBxWGo1Ci1xWGk1ICAgICAgICAgICAgUU4gcVhqdAotcVhpNiAgICAgICAgICAgIFFOIHFYajEKLXFYaTcgICAgICAgICAgICBRTiBxWGo2Ci1xWGl0ICAgICAgICAgICAgUU4gcVhqMwotCi1kWGkwbG8gICAgICAgICAgRE4gZFhqMGxvCi1kWGkwaGkgICAgICAgICAgRE4gZFhqMGhpCi1kWGkxbG8gICAgICAgICAgRE4gZFhqNGxvCi1kWGkxaGkgICAgICAgICAgRE4gZFhqNGhpCi1kWGkybG8gICAgICAgICAgRE4gZFhqMmxvCi1kWGkyaGkgICAgICAgICAgRE4gZFhqMmhpCi1kWGkzbG8gICAgICAgICAgRE4gZFhqN2xvCi1kWGkzaGkgICAgICAgICAgRE4gZFhqN2hpCi1kWGk0bG8gICAgICAgICAgRE4gZFhqNWxvCi1kWGk0aGkgICAgICAgICAgRE4gZFhqNWhpCi1kWGk1bG8gICAgICAgICAgRE4gZFhqdGxvCi1kWGk1aGkgICAgICAgICAgRE4gZFhqdGhpCi1kWGk2bG8gICAgICAgICAgRE4gZFhqMWxvCi1kWGk2aGkgICAgICAgICAgRE4gZFhqMWhpCi1kWGk3bG8gICAgICAgICAgRE4gZFhqNmxvCi1kWGk3aGkgICAgICAgICAgRE4gZFhqNmhpCi1kWGl0bG8gICAgICAgICAgRE4gZFhqM2xvCi1kWGl0aGkgICAgICAgICAgRE4gZFhqM2hpCi0KLXFYaDAgICAgICAgICAgICBRTiBxWGl0Ci1xWGgxICAgICAgICAgICAgUU4gcVhpMAotcVhoMiAgICAgICAgICAgIFFOIHFYaTIKLXFYaDMgICAgICAgICAgICBRTiBxWGkzCi1xWGg0ICAgICAgICAgICAgUU4gcVhpNwotcVhoNSAgICAgICAgICAgIFFOIHFYaTUKLXFYaDYgICAgICAgICAgICBRTiBxWGk0Ci1xWGg3ICAgICAgICAgICAgUU4gcVhpMQotcVhodCAgICAgICAgICAgIFFOIHFYaTYKLQotZFhoMGxvICAgICAgICAgIEROIGRYaXRsbwotZFhoMGhpICAgICAgICAgIEROIGRYaXRoaQotZFhoMWxvICAgICAgICAgIEROIGRYaTBsbwotZFhoMWhpICAgICAgICAgIEROIGRYaTBoaQotZFhoMmxvICAgICAgICAgIEROIGRYaTJsbwotZFhoMmhpICAgICAgICAgIEROIGRYaTJoaQotZFhoM2xvICAgICAgICAgIEROIGRYaTNsbwotZFhoM2hpICAgICAgICAgIEROIGRYaTNoaQotZFhoNGxvICAgICAgICAgIEROIGRYaTdsbwotZFhoNGhpICAgICAgICAgIEROIGRYaTdoaQotZFhoNWxvICAgICAgICAgIEROIGRYaTVsbwotZFhoNWhpICAgICAgICAgIEROIGRYaTVoaQotZFhoNmxvICAgICAgICAgIEROIGRYaTRsbwotZFhoNmhpICAgICAgICAgIEROIGRYaTRoaQotZFhoN2xvICAgICAgICAgIEROIGRYaTFsbwotZFhoN2hpICAgICAgICAgIEROIGRYaTFoaQotZFhodGxvICAgICAgICAgIEROIGRYaTZsbwotZFhodGhpICAgICAgICAgIEROIGRYaTZoaQotCi1xWGcwICAgICAgICAgICAgUU4gcVhoMgotcVhnMSAgICAgICAgICAgIFFOIHFYaHQKLXFYZzIgICAgICAgICAgICBRTiBxWGgxCi1xWGczICAgICAgICAgICAgUU4gcVhoMAotcVhnNCAgICAgICAgICAgIFFOIHFYaDQKLXFYZzUgICAgICAgICAgICBRTiBxWGg1Ci1xWGc2ICAgICAgICAgICAgUU4gcVhoNgotcVhnNyAgICAgICAgICAgIFFOIHFYaDcKLXFYZ3QgICAgICAgICAgICBRTiBxWGgzCi0KLXFYZjAgICAgICAgICAgICBRTiBxWGc2Ci1xWGYxICAgICAgICAgICAgUU4gcVhnNQotcVhmMiAgICAgICAgICAgIFFOIHFYZzQKLXFYZjMgICAgICAgICAgICBRTiBxWGd0Ci1xWGY0ICAgICAgICAgICAgUU4gcVhnMwotcVhmNSAgICAgICAgICAgIFFOIHFYZzIKLXFYZjYgICAgICAgICAgICBRTiBxWGcxCi1xWGY3ICAgICAgICAgICAgUU4gcVhnMAotcVhmdCAgICAgICAgICAgIFFOIHFYZzcKLQotCi1xWHQwICAgICAgICAgICAgUU4gMS5TMzIKLXFYdDEgICAgICAgICAgICBRTiAyLlMzMgotcVQwbG8gICAgICAgICAgIFFOIDEuUzMyICAgICAgICAgCi1xVDBoaSAgICAgICAgICAgUU4gMi5TMzIgICAgICAgICAKLXFUMWxvICAgICAgICAgICBRTiAzLlMzMiAgICAgICAgIAotcVQxaGkgICAgICAgICAgIFFOIDQuUzMyICAgICAgICAgCi1xU2NhbGVsbyAgICAgICAgUU4gNS5TMzIgICAgICAgIDsvLyB1c2VkIHRvIHJlYWQgcG9zdCBzY2FsZSB2YWx1ZXMKLXFTY2FsZWhpICAgICAgICBRTiA2LlMzMgotcVRlbXAwICAgICAgICAgIFFOIDUuUzMyICAgICAgICAgCi1xVGVtcDEgICAgICAgICAgUU4gNi5TMzIgICAgCi0KLQotU2NhbGUxICAgICAgICAgIEVRVSA2Ci1TY2FsZTIgICAgICAgICAgRVFVIDE1Ci1xU2NhbGUxICAgICAgICAgUU4gU2NhbGUxLlMxNiAgICAgCi1xU2NhbGUyICAgICAgICAgUU4gU2NhbGUyLlMxNiAgICAgCi1kU2NhbGUxbG8gICAgICAgRE4gKFNjYWxlMSoyKS5TMTYgICAgIAotZFNjYWxlMWhpICAgICAgIEROIChTY2FsZTEqMisxKS5TMTYKLWRTY2FsZTJsbyAgICAgICBETiAoU2NhbGUyKjIpLlMxNiAgICAgCi1kU2NhbGUyaGkgICAgICAgRE4gKFNjYWxlMioyKzEpLlMxNgotCi1kQ29lZnMgICAgICAgICAgRE4gMC5TMTYgICAgICAgIDsvLyBTY2FsZSBjb2VmZmljaWVudHMgaW4gZm9ybWF0IHtbMF0gW0NdIFtTXSBbSW52U3FydDJdfQotSW52U3FydDIgICAgICAgIEROIGRDb2Vmc1swXSAgICA7Ly8gMS9zcXJ0KDIpIGluIFExNQotUyAgICAgICAgICAgICAgIEROIGRDb2Vmc1sxXSAgICA7Ly8gU2luKFBJLzgpIGluIFExNQotQyAgICAgICAgICAgICAgIEROIGRDb2Vmc1syXSAgICA7Ly8gQ29zKFBJLzgpIGluIFExNQotCi1wVGVtcCAgICAgICAgICAgUk4gMTIKLQotICAgICAgICAgICAgICAgIAotICAgICAgICBJTVBPUlQgIGFybUNPTU1fSURDVENvZWYKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFZMRDEgICAgICAgIHtxWGowLHFYajF9LCBbcFNyYyBANjRdIQotICAgICAgICBWTEQxICAgICAgICB7cVhqMixxWGozfSwgW3BTcmMgQDY0XSEKLSAgICAgICAgVkxEMSAgICAgICAge3FYajQscVhqNX0sIFtwU3JjIEA2NF0hCi0gICAgICAgIFZMRDEgICAgICAgIHtxWGo2LHFYajd9LCBbcFNyYyBANjRdIQotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgUHJlU2NhbGUgYW5kIG11bHRpcGx5IHdpdGggU3JjCi0gICAgICAgIDsvLyBJU3RhZ2UgNAotICAgICAgICAKLSAgICAgICAgSUYgIiRpbnNjYWxlIj0iczE2IiAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMTZYMTYgTXVsCi0gICAgICAgICAgICBNX0lEQ1RfUFJFU0NBTEUxNgotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgSUYgIiRpbnNjYWxlIj0iczMyIiAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMzJYMzIgLHVsCi0gICAgICAgICAgICBNX0lEQ1RfUFJFU0NBTEUzMgotICAgICAgICBFTkRJRgotCi0gICAgICAgIDsvLyBJU3RhZ2UgMwotICAgICAgICBWUVJETVVMSCAgICAgcVhpMiwgcVhpMiwgSW52U3FydDIgICAgICAgICAgICA7Ly8gaTIvc3FydCgyKQotICAgICAgICBWSEFERCAgICAgICBxWGgwLCBxWGkwLCBxWGkxICAgICAgICAgICAgICAgIDsvLyAoaTAraTEpLzIKLSAgICAgICAgVkhTVUIgICAgICAgcVhoMSwgcVhpMCwgcVhpMSAgICAgICAgICAgICAgICA7Ly8gKGkwLWkxKS8yCi0gICAgICAgIFZIQUREICAgICAgIHFYaDcsIHFYaTUsIHFYaTcgICAgICAgICAgICAgICAgOy8vIChpNStpNykvNAotICAgICAgICBWU1VCICAgICAgICBxWGg1LCBxWGk1LCBxWGk3ICAgICAgICAgICAgICAgIDsvLyAoaTUtaTcpLzIKLSAgICAgICAgVlFSRE1VTEggICAgIHFYaDUsIHFYaDUsIEludlNxcnQyICAgICAgICAgICAgOy8vIGg1L3NxcnQoMikKLSAgICAgICAgVlNVQiAgICAgICAgcVhoMiwgcVhpMiwgcVhpMyAgICAgICAgICAgICAgICA7Ly8gaDIsIGgzCi0KLSAgICAgICAgVk1VTEwgICAgICAgcVh0MCwgZFhpNGxvLCBDICAgICAgICAgICAgICAgICA7Ly8gYyppNAotICAgICAgICBWTUxBTCAgICAgICBxWHQwLCBkWGk2bG8sIFMgICAgICAgICAgICAgICAgIDsvLyBjKmk0K3MqaTYKLSAgICAgICAgVk1VTEwgICAgICAgcVh0MSwgZFhpNGhpLCBDCi0gICAgICAgIFZNTEFMICAgICAgIHFYdDEsIGRYaTZoaSwgUwotICAgICAgICBWU0hSTiAgICAgICBkWGg0bG8sIHFYdDAsICMxNiAgICAgICAgICAgICAgIDsvLyBoNAotICAgICAgICBWU0hSTiAgICAgICBkWGg0aGksIHFYdDEsICMxNgotICAgICAgICAKLSAgICAgICAgVk1VTEwgICAgICAgcVh0MCwgZFhpNmxvLCBDICAgICAgICAgICAgICAgICA7Ly8gYyppNgotICAgICAgICBWTUxTTCAgICAgICBxWHQwLCBkWGk0bG8sIFMgICAgICAgICAgICAgICAgIDsvLyAtcyppNCArIGMqaDYKLSAgICAgICAgVk1VTEwgICAgICAgcVh0MSwgZFhpNmhpLCBDCi0gICAgICAgIFZNTFNMICAgICAgIHFYdDEsIGRYaTRoaSwgUwotICAgICAgICBWU0hSTiAgICAgICBkWGg2bG8sIHFYdDAsICMxNiAgICAgICAgICAgICAgIDsvLyBoNgotICAgICAgICBWU0hSTiAgICAgICBkWGg2aGksIHFYdDEsICMxNgotICAgICAgICAKLSAgICAgICAgOy8vIElTdGFnZSAyCi0gICAgICAgIFZTVUIgICAgICAgIHFYZzYsIHFYaDYsIHFYaDcKLSAgICAgICAgVlNVQiAgICAgICAgcVhnNSwgcVhoNSwgcVhnNgotICAgICAgICBWU1VCICAgICAgICBxWGc0LCBxWGg0LCBxWGc1Ci0gICAgICAgIFZIQUREICAgICAgIHFYZzEsIHFYaDEsIHFYaDIgICAgICAgIDsvLyAoaDEraDIpLzIKLSAgICAgICAgVkhTVUIgICAgICAgcVhnMiwgcVhoMSwgcVhoMiAgICAgICAgOy8vIChoMS1oMikvMgotICAgICAgICBWSEFERCAgICAgICBxWGcwLCBxWGgwLCBxWGgzICAgICAgICA7Ly8gKGgwK2gzKS8yCi0gICAgICAgIFZIU1VCICAgICAgIHFYZzMsIHFYaDAsIHFYaDMgICAgICAgIDsvLyAoaDAtaDMpLzIKLQotICAgICAgICA7Ly8gSVN0YWdlIDEgYWxsIHJvd3MKLSAgICAgICAgVkFERCAgICAgICAgcVhmMywgcVhnMywgcVhnNCAgICAgICAgCi0gICAgICAgIFZTVUIgICAgICAgIHFYZjQsIHFYZzMsIHFYZzQgICAgICAgIAotICAgICAgICBWQUREICAgICAgICBxWGYyLCBxWGcyLCBxWGc1ICAgICAgICAKLSAgICAgICAgVlNVQiAgICAgICAgcVhmNSwgcVhnMiwgcVhnNSAgICAgICAgCi0gICAgICAgIFZBREQgICAgICAgIHFYZjEsIHFYZzEsIHFYZzYKLSAgICAgICAgVlNVQiAgICAgICAgcVhmNiwgcVhnMSwgcVhnNiAgICAgICAgCi0gICAgICAgIFZBREQgICAgICAgIHFYZjAsIHFYZzAsIHFYZzcKLSAgICAgICAgVlNVQiAgICAgICAgcVhmNywgcVhnMCwgcVhnNyAgICAgIAotCi0gICAgICAgIDsvLyBUcmFuc3Bvc2UsIHN0b3JlIGFuZCBsb29wCi1YVFIwICAgICAgICAgICAgRVFVIFNyYzUKLVhUUjEgICAgICAgICAgICBFUVUgVG1wCi1YVFIyICAgICAgICAgICAgRVFVIFNyYzYKLVhUUjMgICAgICAgICAgICBFUVUgU3JjNwotWFRSNCAgICAgICAgICAgIEVRVSBTcmMzCi1YVFI1ICAgICAgICAgICAgRVFVIFNyYzAKLVhUUjYgICAgICAgICAgICBFUVUgU3JjMQotWFRSNyAgICAgICAgICAgIEVRVSBTcmMyCi1YVFJ0ICAgICAgICAgICAgRVFVIFNyYzQKLSAgICAgICAgICAgICAgICAKLXFBMCAgICAgICAgICAgICBRTiAgWFRSMC5TMzIgIDsvLyBmb3IgWFRScG9zZQotcUExICAgICAgICAgICAgIFFOICBYVFIxLlMzMgotcUEyICAgICAgICAgICAgIFFOICBYVFIyLlMzMgotcUEzICAgICAgICAgICAgIFFOICBYVFIzLlMzMgotcUE0ICAgICAgICAgICAgIFFOICBYVFI0LlMzMgotcUE1ICAgICAgICAgICAgIFFOICBYVFI1LlMzMgotcUE2ICAgICAgICAgICAgIFFOICBYVFI2LlMzMgotcUE3ICAgICAgICAgICAgIFFOICBYVFI3LlMzMgotCi1kQjAgICAgICAgICAgICAgRE4gIFhUUjAqMisxICAgICAgOy8vIGZvciB1c2luZyBWU1dQCi1kQjEgICAgICAgICAgICAgRE4gIFhUUjEqMisxCi1kQjIgICAgICAgICAgICAgRE4gIFhUUjIqMisxCi1kQjMgICAgICAgICAgICAgRE4gIFhUUjMqMisxCi1kQjQgICAgICAgICAgICAgRE4gIFhUUjQqMgotZEI1ICAgICAgICAgICAgIEROICBYVFI1KjIKLWRCNiAgICAgICAgICAgICBETiAgWFRSNioyCi1kQjcgICAgICAgICAgICAgRE4gIFhUUjcqMgotCi0gICAgICAgICAgCi0gICAgICAgIFZUUk4gICAgICAgIHFYZjAsIHFYZjEKLSAgICAgICAgVlRSTiAgICAgICAgcVhmMiwgcVhmMwotICAgICAgICBWVFJOICAgICAgICBxWGY0LCBxWGY1Ci0gICAgICAgIFZUUk4gICAgICAgIHFYZjYsIHFYZjcKLSAgICAgICAgVlRSTiAgICAgICAgcUEwLCBxQTIKLSAgICAgICAgVlRSTiAgICAgICAgcUExLCBxQTMKLSAgICAgICAgVlRSTiAgICAgICAgcUE0LCBxQTYKLSAgICAgICAgVlRSTiAgICAgICAgcUE1LCBxQTcgICAgICAgIAotICAgICAgICBWU1dQICAgICAgICBkQjAsIGRCNAotICAgICAgICBWU1dQICAgICAgICBkQjEsIGRCNQotICAgICAgICBWU1dQICAgICAgICBkQjIsIGRCNgotICAgICAgICBWU1dQICAgICAgICBkQjMsIGRCNwotICAgICAgICAKLQotcVlqMCAgICAgICAgICAgIFFOIHFYZjAKLXFZajEgICAgICAgICAgICBRTiBxWGYxCi1xWWoyICAgICAgICAgICAgUU4gcVhmMgotcVlqMyAgICAgICAgICAgIFFOIHFYZjMKLXFZajQgICAgICAgICAgICBRTiBxWGY0Ci1xWWo1ICAgICAgICAgICAgUU4gcVhmNQotcVlqNiAgICAgICAgICAgIFFOIHFYZjYKLXFZajcgICAgICAgICAgICBRTiBxWGY3Ci1xWWp0ICAgICAgICAgICAgUU4gcVhmdAotCi1kWWowbG8gICAgICAgICAgRE4gKFhUUjAqMikuUzE2Ci1kWWowaGkgICAgICAgICAgRE4gKFhUUjAqMisxKS5TMTYKLWRZajFsbyAgICAgICAgICBETiAoWFRSMSoyKS5TMTYKLWRZajFoaSAgICAgICAgICBETiAoWFRSMSoyKzEpLlMxNgotZFlqMmxvICAgICAgICAgIEROIChYVFIyKjIpLlMxNgotZFlqMmhpICAgICAgICAgIEROIChYVFIyKjIrMSkuUzE2Ci1kWWozbG8gICAgICAgICAgRE4gKFhUUjMqMikuUzE2Ci1kWWozaGkgICAgICAgICAgRE4gKFhUUjMqMisxKS5TMTYKLWRZajRsbyAgICAgICAgICBETiAoWFRSNCoyKS5TMTYKLWRZajRoaSAgICAgICAgICBETiAoWFRSNCoyKzEpLlMxNgotZFlqNWxvICAgICAgICAgIEROIChYVFI1KjIpLlMxNgotZFlqNWhpICAgICAgICAgIEROIChYVFI1KjIrMSkuUzE2Ci1kWWo2bG8gICAgICAgICAgRE4gKFhUUjYqMikuUzE2Ci1kWWo2aGkgICAgICAgICAgRE4gKFhUUjYqMisxKS5TMTYKLWRZajdsbyAgICAgICAgICBETiAoWFRSNyoyKS5TMTYKLWRZajdoaSAgICAgICAgICBETiAoWFRSNyoyKzEpLlMxNgotZFlqdGxvICAgICAgICAgIEROIChYVFJ0KjIpLlMxNgotZFlqdGhpICAgICAgICAgIEROIChYVFJ0KjIrMSkuUzE2Ci0KLXFZaTAgICAgICAgICAgICBRTiBxWWowCi1xWWkxICAgICAgICAgICAgUU4gcVlqNAotcVlpMiAgICAgICAgICAgIFFOIHFZajIKLXFZaTMgICAgICAgICAgICBRTiBxWWo3Ci1xWWk0ICAgICAgICAgICAgUU4gcVlqNQotcVlpNSAgICAgICAgICAgIFFOIHFZanQKLXFZaTYgICAgICAgICAgICBRTiBxWWoxCi1xWWk3ICAgICAgICAgICAgUU4gcVlqNgotcVlpdCAgICAgICAgICAgIFFOIHFZajMKLQotZFlpMGxvICAgICAgICAgIEROIGRZajBsbwotZFlpMGhpICAgICAgICAgIEROIGRZajBoaQotZFlpMWxvICAgICAgICAgIEROIGRZajRsbwotZFlpMWhpICAgICAgICAgIEROIGRZajRoaQotZFlpMmxvICAgICAgICAgIEROIGRZajJsbwotZFlpMmhpICAgICAgICAgIEROIGRZajJoaQotZFlpM2xvICAgICAgICAgIEROIGRZajdsbwotZFlpM2hpICAgICAgICAgIEROIGRZajdoaQotZFlpNGxvICAgICAgICAgIEROIGRZajVsbwotZFlpNGhpICAgICAgICAgIEROIGRZajVoaQotZFlpNWxvICAgICAgICAgIEROIGRZanRsbwotZFlpNWhpICAgICAgICAgIEROIGRZanRoaQotZFlpNmxvICAgICAgICAgIEROIGRZajFsbwotZFlpNmhpICAgICAgICAgIEROIGRZajFoaQotZFlpN2xvICAgICAgICAgIEROIGRZajZsbwotZFlpN2hpICAgICAgICAgIEROIGRZajZoaQotZFlpdGxvICAgICAgICAgIEROIGRZajNsbwotZFlpdGhpICAgICAgICAgIEROIGRZajNoaQotCi1xWWgwICAgICAgICAgICAgUU4gcVlpdAotcVloMSAgICAgICAgICAgIFFOIHFZaTAKLXFZaDIgICAgICAgICAgICBRTiBxWWkyCi1xWWgzICAgICAgICAgICAgUU4gcVlpMwotcVloNCAgICAgICAgICAgIFFOIHFZaTcKLXFZaDUgICAgICAgICAgICBRTiBxWWk1Ci1xWWg2ICAgICAgICAgICAgUU4gcVlpNAotcVloNyAgICAgICAgICAgIFFOIHFZaTEKLXFZaHQgICAgICAgICAgICBRTiBxWWk2Ci0KLWRZaDBsbyAgICAgICAgICBETiBkWWl0bG8KLWRZaDBoaSAgICAgICAgICBETiBkWWl0aGkKLWRZaDFsbyAgICAgICAgICBETiBkWWkwbG8KLWRZaDFoaSAgICAgICAgICBETiBkWWkwaGkKLWRZaDJsbyAgICAgICAgICBETiBkWWkybG8KLWRZaDJoaSAgICAgICAgICBETiBkWWkyaGkKLWRZaDNsbyAgICAgICAgICBETiBkWWkzbG8KLWRZaDNoaSAgICAgICAgICBETiBkWWkzaGkKLWRZaDRsbyAgICAgICAgICBETiBkWWk3bG8KLWRZaDRoaSAgICAgICAgICBETiBkWWk3aGkKLWRZaDVsbyAgICAgICAgICBETiBkWWk1bG8KLWRZaDVoaSAgICAgICAgICBETiBkWWk1aGkKLWRZaDZsbyAgICAgICAgICBETiBkWWk0bG8KLWRZaDZoaSAgICAgICAgICBETiBkWWk0aGkKLWRZaDdsbyAgICAgICAgICBETiBkWWkxbG8KLWRZaDdoaSAgICAgICAgICBETiBkWWkxaGkKLWRZaHRsbyAgICAgICAgICBETiBkWWk2bG8KLWRZaHRoaSAgICAgICAgICBETiBkWWk2aGkKLQotcVlnMCAgICAgICAgICAgIFFOIHFZaDIKLXFZZzEgICAgICAgICAgICBRTiBxWWh0Ci1xWWcyICAgICAgICAgICAgUU4gcVloMQotcVlnMyAgICAgICAgICAgIFFOIHFZaDAKLXFZZzQgICAgICAgICAgICBRTiBxWWg0Ci1xWWc1ICAgICAgICAgICAgUU4gcVloNQotcVlnNiAgICAgICAgICAgIFFOIHFZaDYKLXFZZzcgICAgICAgICAgICBRTiBxWWg3Ci1xWWd0ICAgICAgICAgICAgUU4gcVloMwotCi1xWWYwICAgICAgICAgICAgUU4gcVlnNgotcVlmMSAgICAgICAgICAgIFFOIHFZZzUKLXFZZjIgICAgICAgICAgICBRTiBxWWc0Ci1xWWYzICAgICAgICAgICAgUU4gcVlndAotcVlmNCAgICAgICAgICAgIFFOIHFZZzMKLXFZZjUgICAgICAgICAgICBRTiBxWWcyCi1xWWY2ICAgICAgICAgICAgUU4gcVlnMQotcVlmNyAgICAgICAgICAgIFFOIHFZZzAKLXFZZnQgICAgICAgICAgICBRTiBxWWc3Ci0KLSAgICAgICAgVlJTSFIgICAgICAgcVlqNywgcVlqNywgIzIKLSAgICAgICAgVlJTSFIgICAgICAgcVlqNiwgcVlqNiwgIzEKLSAgICAgICAgCi0gICAgICAgIFZIQUREICAgICAgIHFZaTUsIHFZajEsIHFZajcgICAgICAgIDsvLyBpNSA9IChqMStqNykvMgotICAgICAgICBWU1VCICAgICAgICBxWWk2LCBxWWoxLCBxWWo3ICAgICAgICA7Ly8gaTYgPSBqMS1qNwotICAgICAgICBWSEFERCAgICAgICBxWWkzLCBxWWoyLCBxWWo2ICAgICAgICA7Ly8gaTMgPSAoajIrajYpLzIKLSAgICAgICAgVlNVQiAgICAgICAgcVlpMiwgcVlqMiwgcVlqNiAgICAgICAgOy8vIGkyID0gajItajYKLSAgICAgICAgVkhBREQgICAgICAgcVlpNywgcVlqNSwgcVlqMyAgICAgICAgOy8vIGk3ID0gKGo1K2ozKS8yCi0gICAgICAgIFZTVUIgICAgICAgIHFZaTQsIHFZajUsIHFZajMgICAgICAgIDsvLyBpNCA9IGo1LWozCi0KLSAgICAgICAgVlFSRE1VTEggICAgIHFZaTIsIHFZaTIsIEludlNxcnQyICAgIDsvLyBpMi9zcXJ0KDIpCi0gICAgICAgIDsvLyBJU3RhZ2UgNCwzIHJvd3MgMHRvMSB4IDEvMgotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgcFRlbXAsICMweDQgICAgICAgICAgICAgOy8vIGVuc3VyZSBjb3JyZWN0IHJvdW5kCi0gICAgICAgIFZEVVAgICAgICAgIHFTY2FsZTEsIHBUZW1wICAgICAgICAgICA7Ly8gb2YgREMgcmVzdWx0Ci0gICAgICAgIFZBREQgICAgICAgIHFZaTAsIHFZaTAsIHFTY2FsZTEKLSAgICAgICAgCi0gICAgICAgIFZIQUREICAgICAgIHFZaDAsIHFZaTAsIHFZaTEgICAgICAgIDsvLyAoaTAraTEpLzIKLSAgICAgICAgVkhTVUIgICAgICAgcVloMSwgcVlpMCwgcVlpMSAgICAgICAgOy8vIChpMC1pMSkvMgotCi0gICAgICAgIFZIQUREICAgICAgIHFZaDcsIHFZaTUsIHFZaTcgICAgICAgIDsvLyAoaTUraTcpLzQKLSAgICAgICAgVlNVQiAgICAgICAgcVloNSwgcVlpNSwgcVlpNyAgICAgICAgOy8vIChpNS1pNykvMgotICAgICAgICBWU1VCICAgICAgICBxWWgyLCBxWWkyLCBxWWkzICAgICAgICA7Ly8gaDIsIGgzCi0gICAgICAgIFZRUkRNVUxIICAgICBxWWg1LCBxWWg1LCBJbnZTcXJ0MiAgICA7Ly8gaDUvc3FydCgyKQotCi0gICAgICAgIFZNVUxMICAgICAgIHFYdDAsIGRZaTRsbywgQyAgICAgICAgIDsvLyBjKmk0Ci0gICAgICAgIFZNTEFMICAgICAgIHFYdDAsIGRZaTZsbywgUyAgICAgICAgIDsvLyBjKmk0K3MqaTYKLSAgICAgICAgVk1VTEwgICAgICAgcVh0MSwgZFlpNGhpLCBDCi0gICAgICAgIFZNTEFMICAgICAgIHFYdDEsIGRZaTZoaSwgUwotICAgICAgICBWU0hSTiAgICAgICBkWWg0bG8sIHFYdDAsICMxNiAgICAgICA7Ly8gaDQKLSAgICAgICAgVlNIUk4gICAgICAgZFloNGhpLCBxWHQxLCAjMTYKLSAgICAgICAgCi0gICAgICAgIFZNVUxMICAgICAgIHFYdDAsIGRZaTZsbywgQyAgICAgICAgIDsvLyBjKmk2Ci0gICAgICAgIFZNTFNMICAgICAgIHFYdDAsIGRZaTRsbywgUyAgICAgICAgIDsvLyAtcyppNCArIGMqaDYKLSAgICAgICAgVk1VTEwgICAgICAgcVh0MSwgZFlpNmhpLCBDCi0gICAgICAgIFZNTFNMICAgICAgIHFYdDEsIGRZaTRoaSwgUwotICAgICAgICBWU0hSTiAgICAgICBkWWg2bG8sIHFYdDAsICMxNiAgICAgICA7Ly8gaDYKLSAgICAgICAgVlNIUk4gICAgICAgZFloNmhpLCBxWHQxLCAjMTYKLSAgICAgICAgCi0gICAgICAgIFZTVUIgICAgICAgIHFZZzYsIHFZaDYsIHFZaDcKLSAgICAgICAgVlNVQiAgICAgICAgcVlnNSwgcVloNSwgcVlnNgotICAgICAgICBWU1VCICAgICAgICBxWWc0LCBxWWg0LCBxWWc1Ci0gICAgICAgIAotICAgICAgICA7Ly8gSVN0YWdlIDIgcm93cyAwdG8zIHggMS8yCi0gICAgICAgIFZIQUREICAgICAgIHFZZzEsIHFZaDEsIHFZaDIgICAgICAgIDsvLyAoaDEraDIpLzIKLSAgICAgICAgVkhTVUIgICAgICAgcVlnMiwgcVloMSwgcVloMiAgICAgICAgOy8vIChoMS1oMikvMgotICAgICAgICBWSEFERCAgICAgICBxWWcwLCBxWWgwLCBxWWgzICAgICAgICA7Ly8gKGgwK2gzKS8yCi0gICAgICAgIFZIU1VCICAgICAgIHFZZzMsIHFZaDAsIHFZaDMgICAgICAgIDsvLyAoaDAtaDMpLzIKLSAgICAgICAgCi0KLSAgICAgICAgOy8vIElTdGFnZSAxIGFsbCByb3dzCi0gICAgICAgIFZIQUREICAgICAgICBxWWYzLCBxWWczLCBxWWc0ICAgICAgICAKLSAgICAgICAgVkhTVUIgICAgICAgIHFZZjQsIHFZZzMsIHFZZzQgICAgICAgIAotICAgICAgICBWSEFERCAgICAgICAgcVlmMiwgcVlnMiwgcVlnNSAgICAgICAgCi0gICAgICAgIFZIU1VCICAgICAgICBxWWY1LCBxWWcyLCBxWWc1ICAgICAgICAKLSAgICAgICAgVkhBREQgICAgICAgIHFZZjEsIHFZZzEsIHFZZzYKLSAgICAgICAgVkhTVUIgICAgICAgIHFZZjYsIHFZZzEsIHFZZzYgICAgICAgIAotICAgICAgICBWSEFERCAgICAgICAgcVlmMCwgcVlnMCwgcVlnNwotICAgICAgICBWSFNVQiAgICAgICAgcVlmNywgcVlnMCwgcVlnNyAgICAgIAotCi1ZVFIwICAgICAgICAgICAgRVFVIFNyYzAKLVlUUjEgICAgICAgICAgICBFUVUgU3JjNAotWVRSMiAgICAgICAgICAgIEVRVSBTcmMxCi1ZVFIzICAgICAgICAgICAgRVFVIFNyYzIKLVlUUjQgICAgICAgICAgICBFUVUgU3JjNwotWVRSNSAgICAgICAgICAgIEVRVSBTcmM1Ci1ZVFI2ICAgICAgICAgICAgRVFVIFRtcAotWVRSNyAgICAgICAgICAgIEVRVSBTcmM2Ci1ZVFJ0ICAgICAgICAgICAgRVFVIFNyYzMKLQotcUMwICAgICAgICAgICAgIFFOICBZVFIwLlMzMiAgICAgICAgICAgICAgICA7Ly8gZm9yIFlUUnBvc2UKLXFDMSAgICAgICAgICAgICBRTiAgWVRSMS5TMzIKLXFDMiAgICAgICAgICAgICBRTiAgWVRSMi5TMzIKLXFDMyAgICAgICAgICAgICBRTiAgWVRSMy5TMzIKLXFDNCAgICAgICAgICAgICBRTiAgWVRSNC5TMzIKLXFDNSAgICAgICAgICAgICBRTiAgWVRSNS5TMzIKLXFDNiAgICAgICAgICAgICBRTiAgWVRSNi5TMzIKLXFDNyAgICAgICAgICAgICBRTiAgWVRSNy5TMzIKLQotZEQwICAgICAgICAgICAgIEROICBZVFIwKjIrMSAgICAgICAgICAgICAgICA7Ly8gZm9yIHVzaW5nIFZTV1AKLWREMSAgICAgICAgICAgICBETiAgWVRSMSoyKzEKLWREMiAgICAgICAgICAgICBETiAgWVRSMioyKzEKLWREMyAgICAgICAgICAgICBETiAgWVRSMyoyKzEKLWRENCAgICAgICAgICAgICBETiAgWVRSNCoyCi1kRDUgICAgICAgICAgICAgRE4gIFlUUjUqMgotZEQ2ICAgICAgICAgICAgIEROICBZVFI2KjIKLWRENyAgICAgICAgICAgICBETiAgWVRSNyoyCi0gICAgICAgICAgCi0gICAgICAgIFZUUk4gICAgICAgIHFZZjAsIHFZZjEKLSAgICAgICAgVlRSTiAgICAgICAgcVlmMiwgcVlmMwotICAgICAgICBWVFJOICAgICAgICBxWWY0LCBxWWY1Ci0gICAgICAgIFZUUk4gICAgICAgIHFZZjYsIHFZZjcKLSAgICAgICAgVlRSTiAgICAgICAgcUMwLCBxQzIKLSAgICAgICAgVlRSTiAgICAgICAgcUMxLCBxQzMKLSAgICAgICAgVlRSTiAgICAgICAgcUM0LCBxQzYKLSAgICAgICAgVlRSTiAgICAgICAgcUM1LCBxQzcgICAgICAgIAotICAgICAgICBWU1dQICAgICAgICBkRDAsIGRENAotICAgICAgICBWU1dQICAgICAgICBkRDEsIGRENQotICAgICAgICBWU1dQICAgICAgICBkRDIsIGRENgotICAgICAgICBWU1dQICAgICAgICBkRDMsIGRENwotCi0gICAgICAgIAotZFlmMFU4ICAgICAgICAgIEROIFlUUjAqMi5VOAotZFlmMVU4ICAgICAgICAgIEROIFlUUjEqMi5VOAotZFlmMlU4ICAgICAgICAgIEROIFlUUjIqMi5VOAotZFlmM1U4ICAgICAgICAgIEROIFlUUjMqMi5VOAotZFlmNFU4ICAgICAgICAgIEROIFlUUjQqMi5VOAotZFlmNVU4ICAgICAgICAgIEROIFlUUjUqMi5VOAotZFlmNlU4ICAgICAgICAgIEROIFlUUjYqMi5VOAotZFlmN1U4ICAgICAgICAgIEROIFlUUjcqMi5VOAotICAgICAgICAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBEbyBzYXR1cmF0aW9uIGlmIG91dHNpemUgaXMgb3RoZXIgdGhhbiBTMTYKLSAgICAgICAgOy8vCi0gICAgICAgIAotICAgICAgICBJRiAoIiRvdXRzaXplIj0idTgiKQotICAgICAgICAgICAgOy8vIE91dHB1dCByYW5nZSBbMC0yNTVdCi0gICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWYwVTgsIHFZZjAKLSAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjFVOCwgcVlmMQotICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmMlU4LCBxWWYyCi0gICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWYzVTgsIHFZZjMKLSAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjRVOCwgcVlmNAotICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmNVU4LCBxWWY1Ci0gICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWY2VTgsIHFZZjYKLSAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjdVOCwgcVlmNwotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InM5IikKLSAgICAgICAgICAgIDsvLyBPdXRwdXQgcmFuZ2UgWy0yNTYgdG8gKzI1NV0KLSAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmMCwgcVlmMCwgIzE2LTkKLSAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmMSwgcVlmMSwgIzE2LTkKLSAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmMiwgcVlmMiwgIzE2LTkKLSAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmMywgcVlmMywgIzE2LTkKLSAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmNCwgcVlmNCwgIzE2LTkKLSAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmNSwgcVlmNSwgIzE2LTkKLSAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmNiwgcVlmNiwgIzE2LTkKLSAgICAgICAgICAgIFZRU0hMICAgICAgICAgICAgcVlmNywgcVlmNywgIzE2LTkKLSAgICAgICAgICAgIAotICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWYwLCBxWWYwLCAjMTYtOQotICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWYxLCBxWWYxLCAjMTYtOQotICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWYyLCBxWWYyLCAjMTYtOQotICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWYzLCBxWWYzLCAjMTYtOQotICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWY0LCBxWWY0LCAjMTYtOQotICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWY1LCBxWWY1LCAjMTYtOQotICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWY2LCBxWWY2LCAjMTYtOQotICAgICAgICAgICAgVlNIUiAgICAgICAgICAgICBxWWY3LCBxWWY3LCAjMTYtOQotICAgICAgICBFTkRJRgotCi0gICAgICAgIDsvLyBTdG9yZSBvdXRwdXQgZGVwZW5kaW5nIG9uIHRoZSBTdHJpZGUgc2l6ZQotICAgICAgICBJRiAiJHN0cmlkZSI9InMiCi0gICAgICAgICAgICBWU1QxICAgICAgICBxWWYwLCBbcERlc3QgQDY0XSwgU3RyaWRlCi0gICAgICAgICAgICBWU1QxICAgICAgICBxWWYxLCBbcERlc3QgQDY0XSwgU3RyaWRlCi0gICAgICAgICAgICBWU1QxICAgICAgICBxWWYyLCBbcERlc3QgQDY0XSwgU3RyaWRlCi0gICAgICAgICAgICBWU1QxICAgICAgICBxWWYzLCBbcERlc3QgQDY0XSwgU3RyaWRlCi0gICAgICAgICAgICBWU1QxICAgICAgICBxWWY0LCBbcERlc3QgQDY0XSwgU3RyaWRlCi0gICAgICAgICAgICBWU1QxICAgICAgICBxWWY1LCBbcERlc3QgQDY0XSwgU3RyaWRlCi0gICAgICAgICAgICBWU1QxICAgICAgICBxWWY2LCBbcERlc3QgQDY0XSwgU3RyaWRlCi0gICAgICAgICAgICBWU1QxICAgICAgICBxWWY3LCBbcERlc3QgQDY0XSAgICAgICAgICAgIAotICAgICAgICBFTFNFCi0gICAgICAgICAgICBJRiAoIiRvdXRzaXplIj0idTgiKQotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjBVOCwgW3BEZXN0IEA2NF0sICM4Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmMVU4LCBbcERlc3QgQDY0XSwgIzgKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWYyVTgsIFtwRGVzdCBANjRdLCAjOAotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjNVOCwgW3BEZXN0IEA2NF0sICM4Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmNFU4LCBbcERlc3QgQDY0XSwgIzgKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWY1VTgsIFtwRGVzdCBANjRdLCAjOAotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjZVOCwgW3BEZXN0IEA2NF0sICM4Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmN1U4LCBbcERlc3QgQDY0XQotICAgICAgICAgICAgRUxTRQotICAgICAgICAgICAgICAgIDsvLyAoIiRvdXRzaXplIj0iczkiKSBvciAoIiRvdXRzaXplIj0iczE2IikKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWYwLCBbcERlc3QgQDY0XSwgIzE2Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMSwgW3BEZXN0IEA2NF0sICMxNgotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjIsIFtwRGVzdCBANjRdLCAjMTYKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWYzLCBbcERlc3QgQDY0XSwgIzE2Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNCwgW3BEZXN0IEA2NF0sICMxNgotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjUsIFtwRGVzdCBANjRdLCAjMTYKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWY2LCBbcERlc3QgQDY0XSwgIzE2Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNywgW3BEZXN0IEA2NF0KLSAgICAgICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBFTkRJRgotCi0KLQotICAgICAgICBFTkRJRiA7Ly8gQ29ydGV4QTgKLQotCi0KLSAgICAgICAgTUVORCAgICAgICAgCi0KLSAgICAgICAgOy8vIFNjYWxlIFRXTyBpbnB1dCByb3dzIHdpdGggVFdPIHJvd3Mgb2YgMTYgYml0IHNjYWxlIHZhbHVlcwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFRoaXMgbWFjcm8gaXMgdXNlZCBieSBNX0lEQ1RfUFJFU0NBTEUxNiB0byBwcmUtc2NhbGUgb25lIHJvdwotICAgICAgICA7Ly8gaW5wdXQgKEVpZ2h0IGlucHV0IHZhbHVlcykgd2l0aCBvbmUgcm93IG9mIHNjYWxlIHZhbHVlcy4gQWxzbyAKLSAgICAgICAgOy8vIExvYWRzIG5leHQgc2NhbGUgdmFsdWVzIGZyb20gcFNjYWxlLCBpZiAkTGFzdFJvdyBmbGFnIGlzIG5vdCBzZXQuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRkQWxvICAgICAgICAgICAtIElucHV0IEQgcmVnaXN0ZXIgd2l0aCBmaXJzdCBmb3VyIFMxNiB2YWx1ZXMgb2Ygcm93IG4KLSAgICAgICAgOy8vICRkQWhpICAgICAgICAgICAtIElucHV0IEQgcmVnaXN0ZXIgd2l0aCBuZXh0IGZvdXIgUzE2IHZhbHVlcyBvZiByb3cgbgotICAgICAgICA7Ly8gJGRCbG8gICAgICAgICAgIC0gSW5wdXQgRCByZWdpc3RlciB3aXRoIGZpcnN0IGZvdXIgUzE2IHZhbHVlcyBvZiByb3cgbisxCi0gICAgICAgIDsvLyAkZEJoaSAgICAgICAgICAgLSBJbnB1dCBEIHJlZ2lzdGVyIHdpdGggbmV4dCBmb3VyIFMxNiB2YWx1ZXMgb2Ygcm93IG4rMQotICAgICAgICA7Ly8gcFNjYWxlICAgICAgICAgIC0gUG9pbnRlciB0byBuZXh0IHJvdyBvZiBzY2FsZSB2YWx1ZXMKLSAgICAgICAgOy8vIHFUMGxvICAgICAgICAgICAtIFRlbXBvcmFyeSBzY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyBxVDBoaSAgICAgICAgICAgLSBUZW1wb3Jhcnkgc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gcVQxbG8gICAgICAgICAgIC0gVGVtcG9yYXJ5IHNjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vIHFUMWhpICAgICAgICAgICAtIFRlbXBvcmFyeSBzY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyBkU2NhbGUxbG8gICAgICAgLSBTY2FsZSB2YWx1ZSBvZiByb3cgbgotICAgICAgICA7Ly8gZFNjYWxlMWhpICAgICAgIC0gU2NhbGUgdmFsdWUgb2Ygcm93IG4KLSAgICAgICAgOy8vIGRTY2FsZTJsbyAgICAgICAtIFNjYWxlIHZhbHVlIG9mIHJvdyBuKzEKLSAgICAgICAgOy8vIGRTY2FsZTJoaSAgICAgICAtIFNjYWxlIHZhbHVlIG9mIHJvdyBuKzEKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBGbGFnCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJExhc3RSb3cgICAgICAgIC0gRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIGN1cnJlbnQgcm93IGlzIGxhc3Qgcm93Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkZEFsbyAgICAgICAgICAgLSBTY2FsZWQgb3V0cHV0IHZhbHVlcyAoZmlyc3QgZm91ciBTMTYgb2Ygcm93IG4pCi0gICAgICAgIDsvLyAkZEFoaSAgICAgICAgICAgLSBTY2FsZWQgb3V0cHV0IHZhbHVlcyAobmV4dCBmb3VyIFMxNiBvZiByb3cgbikKLSAgICAgICAgOy8vICRkQmxvICAgICAgICAgICAtIFNjYWxlZCBvdXRwdXQgdmFsdWVzIChmaXJzdCBmb3VyIFMxNiBvZiByb3cgbisxKQotICAgICAgICA7Ly8gJGRCaGkgICAgICAgICAgIC0gU2NhbGVkIG91dHB1dCB2YWx1ZXMgKG5leHQgZm91ciBTMTYgb2Ygcm93IG4rMSkKLSAgICAgICAgOy8vIHFTY2FsZTEgICAgICAgICAtIFNjYWxlIHZhbHVlcyBmb3IgbmV4dCByb3cKLSAgICAgICAgOy8vIHFTY2FsZTIgICAgICAgICAtIFNjYWxlIHZhbHVlcyBmb3IgbmV4dCByb3crMQotICAgICAgICA7Ly8gcFNjYWxlICAgICAgICAgIC0gUG9pbnRlciB0byBuZXh0IHJvdyBvZiBzY2FsZSB2YWx1ZXMKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fSURDVF9TQ0FMRTE2ICRkQWxvLCAkZEFoaSwgJGRCbG8sICRkQmhpLCAkTGFzdFJvdwotICAgICAgICBWTVVMTCAgICAgICBxVDBsbywgJGRBbG8sIGRTY2FsZTFsbwotICAgICAgICBWTVVMTCAgICAgICBxVDBoaSwgJGRBaGksIGRTY2FsZTFoaQotICAgICAgICBWTVVMTCAgICAgICBxVDFsbywgJGRCbG8sIGRTY2FsZTJsbwotICAgICAgICBWTVVMTCAgICAgICBxVDFoaSwgJGRCaGksIGRTY2FsZTJoaQotICAgICAgICBJRiAiJExhc3RSb3ciPSIwIgotICAgICAgICAgICAgVkxEMSAgICAgICAgcVNjYWxlMSwgW3BTY2FsZV0sICMxNiAgOy8vIExvYWQgc2NhbGUgZm9yIHJvdyBuKzEKLSAgICAgICAgICAgIFZMRDEgICAgICAgIHFTY2FsZTIsIFtwU2NhbGVdLCAjMTYgIDsvLyBMb2FkIHNjYWxlIGZvciByb3cgbisyCi0gICAgICAgIEVORElGCi0gICAgICAgIFZRUlNIUk4gICAgICAgJGRBbG8sIHFUMGxvLCAjMTIgICAgICAgIAotICAgICAgICBWUVJTSFJOICAgICAgICRkQWhpLCBxVDBoaSwgIzEyICAgICAgICAKLSAgICAgICAgVlFSU0hSTiAgICAgICAkZEJsbywgcVQxbG8sICMxMiAgICAgICAgCi0gICAgICAgIFZRUlNIUk4gICAgICAgJGRCaGksIHFUMWhpLCAjMTIgICAgICAgIAotICAgICAgICBNRU5ECi0KLSAgICAgICAgOy8vIFNjYWxlIDh4OCBibG9jayBpbnB1dCB2YWx1ZXMgd2l0aCAxNiBiaXQgc2NhbGUgdmFsdWVzCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gVGhpcyBtYWNybyBpcyB1c2VkIHRvIHByZS1zY2FsZSBibG9jayBvZiA4eDggaW5wdXQuCi0gICAgICAgIDsvLyBUaGlzIGFsc28gZG8gdGhlIElzdCBzdGFnZSB0cmFuc2Zvcm1hdGlvbnMgb2YgSURDVC4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gZFhqbmxvICAgICAgICAgIC0gbiB0aCBpbnB1dCBEIHJlZ2lzdGVyIHdpdGggZmlyc3QgZm91ciBTMTYgdmFsdWVzCi0gICAgICAgIDsvLyBkWGpuaGkgICAgICAgICAgLSBuIHRoIGlucHV0IEQgcmVnaXN0ZXIgd2l0aCBuZXh0IGZvdXIgUzE2IHZhbHVlcwotICAgICAgICA7Ly8gcVhqbiAgICAgICAgICAgIC0gbiB0aCBpbnB1dCBRIHJlZ2lzdGVyIHdpdGggZWlnaHQgUzE2IHZhbHVlcwotICAgICAgICA7Ly8gcFNjYWxlICAgICAgICAgIC0gUG9pbnRlciB0byBzY2FsZSB2YWx1ZXMKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIHFYaW4gICAgICAgICAgICAtIG4gdGggb3V0cHV0IFEgcmVnaXN0ZXIgd2l0aCBlaWdodCBTMTYgb3V0cHV0IHZhbHVlcyBvZiAxc3Qgc3RhZ2UKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fSURDVF9QUkVTQ0FMRTE2Ci0gICAgICAgIFZMRDEgICAgICAgIHFTY2FsZTEsIFtwU2NhbGVdLCAjMTYgICAgICA7Ly8gTG9hZCBQcmUgc2NhbGUgZm9yIHJvdyAwCi0gICAgICAgIFZMRDEgICAgICAgIHFTY2FsZTIsIFtwU2NhbGVdLCAjMTYgICAgICA7Ly8gTG9hZCBQcmUgc2NhbGUgZm9yIHJvdyAwCi0gICAgICAgIE1fSURDVF9TQ0FMRTE2IGRYajBsbywgZFhqMGhpLCBkWGoxbG8sIGRYajFoaSwgMCAgICAgICAgOy8vIFByZSBzY2FsZSByb3cgMCAmIDEKLSAgICAgICAgTV9JRENUX1NDQUxFMTYgZFhqMmxvLCBkWGoyaGksIGRYajNsbywgZFhqM2hpLCAwICAgICAgICAKLSAgICAgICAgTV9JRENUX1NDQUxFMTYgZFhqNGxvLCBkWGo0aGksIGRYajVsbywgZFhqNWhpLCAwICAgICAgICAKLSAgICAgICAgTV9JRENUX1NDQUxFMTYgZFhqNmxvLCBkWGo2aGksIGRYajdsbywgZFhqN2hpLCAxICAgICAgICAKLSAgICAgICAgVkhBREQgICAgICAgcVhpNSwgcVhqMSwgcVhqNyAgICAgICAgICAgIDsvLyAoajErajcpLzIKLSAgICAgICAgVlNVQiAgICAgICAgcVhpNiwgcVhqMSwgcVhqNyAgICAgICAgICAgIDsvLyBqMS1qNwotICAgICAgICBMRFIgICAgICAgICBwU3JjLCA9YXJtQ09NTV9JRENUQ29lZiA7Ly8gQWRkcmVzcyBvZiBEQ1QgaW52ZXJzZSBBQU4gY29uc3RhbnRzCi0gICAgICAgIFZIQUREICAgICAgIHFYaTMsIHFYajIsIHFYajYgICAgICAgICAgICA7Ly8gKGoyK2o2KS8yCi0gICAgICAgIFZTVUIgICAgICAgIHFYaTIsIHFYajIsIHFYajYgICAgICAgICAgICA7Ly8gajItajYKLSAgICAgICAgVkxEUiAgICAgICAgZENvZWZzLCBbcFNyY10gICAgICAgICAgICAgIDsvLyBMb2FkIERDVCBpbnZlcnNlIEFBTiBjb25zdGFudHMKLSAgICAgICAgVkhBREQgICAgICAgcVhpNywgcVhqNSwgcVhqMyAgICAgICAgICAgIDsvLyAoajUrajMpLzIKLSAgICAgICAgVlNVQiAgICAgICAgcVhpNCwgcVhqNSwgcVhqMyAgICAgICAgICAgIDsvLyBqNS1qMwotICAgICAgICBNRU5EICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBTY2FsZSA4eDggYmxvY2sgaW5wdXQgdmFsdWVzIHdpdGggMzIgYml0IHNjYWxlIHZhbHVlcwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBwcmUtc2NhbGUgYmxvY2sgb2YgOHg4IGlucHV0LgotICAgICAgICA7Ly8gVGhpcyBhbHNvIGRvIHRoZSBJc3Qgc3RhZ2UgdHJhbnNmb3JtYXRpb25zIG9mIElEQ1QuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIGRYam5sbyAgICAgICAgICAtIG4gdGggaW5wdXQgRCByZWdpc3RlciB3aXRoIGZpcnN0IGZvdXIgUzE2IHZhbHVlcwotICAgICAgICA7Ly8gZFhqbmhpICAgICAgICAgIC0gbiB0aCBpbnB1dCBEIHJlZ2lzdGVyIHdpdGggbmV4dCBmb3VyIFMxNiB2YWx1ZXMKLSAgICAgICAgOy8vIHFYam4gICAgICAgICAgICAtIG4gdGggaW5wdXQgUSByZWdpc3RlciB3aXRoIGVpZ2h0IFMxNiB2YWx1ZXMKLSAgICAgICAgOy8vIHBTY2FsZSAgICAgICAgICAtIFBvaW50ZXIgdG8gMzJiaXQgc2NhbGUgdmFsdWVzIGluIFEyMyBmb3JtYXQKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIGRYaW5sbyAgICAgICAgICAtIG4gdGggb3V0cHV0IEQgcmVnaXN0ZXIgd2l0aCBmaXJzdCBmb3VyIFMxNiBvdXRwdXQgdmFsdWVzIG9mIDFzdCBzdGFnZQotICAgICAgICA7Ly8gZFhpbmhpICAgICAgICAgIC0gbiB0aCBvdXRwdXQgRCByZWdpc3RlciB3aXRoIG5leHQgZm91ciBTMTYgb3V0cHV0IHZhbHVlcyBvZiAxc3Qgc3RhZ2UKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fSURDVF9QUkVTQ0FMRTMyCi1xU2NhbGUwbG8gICAgICAgUU4gMC5TMzIKLXFTY2FsZTBoaSAgICAgICBRTiAxLlMzMgotcVNjYWxlMWxvICAgICAgIFFOIDIuUzMyCi1xU2NhbGUxaGkgICAgICAgUU4gMy5TMzIKLXFTY2FsZTJsbyAgICAgICBRTiBxU2NhbGUxbG8KLXFTY2FsZTJoaSAgICAgICBRTiBxU2NhbGUxaGkKLXFTY2FsZTNsbyAgICAgICBRTiBxU2NhbGUxbG8KLXFTY2FsZTNoaSAgICAgICBRTiBxU2NhbGUxaGkKLXFTY2FsZTRsbyAgICAgICBRTiBxU2NhbGUxbG8KLXFTY2FsZTRoaSAgICAgICBRTiBxU2NhbGUxaGkKLXFTY2FsZTVsbyAgICAgICBRTiBxU2NhbGUwbG8KLXFTY2FsZTVoaSAgICAgICBRTiBxU2NhbGUwaGkKLXFTY2FsZTZsbyAgICAgICBRTiBxU2NhbGUwbG8KLXFTY2FsZTZoaSAgICAgICBRTiBxU2NhbGUwaGkKLXFTY2FsZTdsbyAgICAgICBRTiBxU2NhbGUwbG8KLXFTY2FsZTdoaSAgICAgICBRTiBxU2NhbGUwaGkKLQotcVNyYzBsbyAgICAgICAgIFFOIDQuUzMyCi1xU3JjMGhpICAgICAgICAgUU4gNS5TMzIKLXFTcmMxbG8gICAgICAgICBRTiA2LlMzMgotcVNyYzFoaSAgICAgICAgIFFOIFNyYzQuUzMyCi1xU3JjMmxvICAgICAgICAgUU4gcVNyYzBsbwotcVNyYzJoaSAgICAgICAgIFFOIHFTcmMwaGkKLXFTcmMzbG8gICAgICAgICBRTiBxU3JjMGxvCi1xU3JjM2hpICAgICAgICAgUU4gcVNyYzBoaQotcVNyYzRsbyAgICAgICAgIFFOIHFTcmMwbG8KLXFTcmM0aGkgICAgICAgICBRTiBxU3JjMGhpCi1xU3JjNWxvICAgICAgICAgUU4gcVNyYzFsbwotcVNyYzVoaSAgICAgICAgIFFOIHFTcmMxaGkKLXFTcmM2bG8gICAgICAgICBRTiBxU3JjMWxvCi1xU3JjNmhpICAgICAgICAgUU4gcVNyYzFoaQotcVNyYzdsbyAgICAgICAgIFFOIHFTcmMwbG8KLXFTcmM3aGkgICAgICAgICBRTiBxU3JjMGhpCi0KLXFSZXMxN2xvICAgICAgICBRTiBxU2NhbGUwbG8KLXFSZXMxN2hpICAgICAgICBRTiBxU2NhbGUwaGkKLXFSZXMyNmxvICAgICAgICBRTiBxU2NhbGUwbG8KLXFSZXMyNmhpICAgICAgICBRTiBxU2NhbGUwaGkKLXFSZXM1M2xvICAgICAgICBRTiBxU2NhbGUwbG8KLXFSZXM1M2hpICAgICAgICBRTiBxU2NhbGUwaGkKLQotICAgICAgICAgICAgQUREICAgICAgICAgcFRlbXAsIHBTY2FsZSwgIzQqOCo3ICAgICAgICAgICA7Ly8gQWRkcmVzcyBvZiAgcFNjYWxlWzddCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIDsvLyBSb3cgMAotICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTBsbywgcVNjYWxlMGhpfSwgW3BTY2FsZV0hCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMGxvLCBkWGowbG8sICMoMTItMSkKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMwaGksIGRYajBoaSwgIygxMi0xKSAgICAgICAgICAgIAotICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTFsbywgcVNjYWxlMWhpfSwgW3BTY2FsZV0hCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMGxvLCBxU2NhbGUwbG8sIHFTcmMwbG8KLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMwaGksIHFTY2FsZTBoaSwgcVNyYzBoaQotICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTdsbywgcVNjYWxlN2hpfSwgW3BUZW1wXSEKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMxbG8sIGRYajFsbywgIygxMi0xKQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzFoaSwgZFhqMWhpLCAjKDEyLTEpICAgICAgICAgICAgCi0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGkwbG8sIHFTcmMwbG8gICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTAKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTBoaSwgcVNyYzBoaQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzdsbywgZFhqN2xvLCAjKDEyLTEpCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjN2hpLCBkWGo3aGksICMoMTItMSkKLSAgICAgICAgICAgIFNVQiAgICAgICAgIHBUZW1wLCBwVGVtcCwgIygoMTYqMikrKDQqOCoxKSkKLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMxbG8sIHFTY2FsZTFsbywgcVNyYzFsbwotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzFoaSwgcVNjYWxlMWhpLCBxU3JjMWhpCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjN2xvLCBxU2NhbGU3bG8sIHFTcmM3bG8KLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM3aGksIHFTY2FsZTdoaSwgcVNyYzdoaQotICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTJsbywgcVNjYWxlMmhpfSwgW3BTY2FsZV0hCi0KLSAgICAgICAgICAgIDsvLyBSb3cgMSAmIDcKLSAgICAgICAgICAgIFZIQUREICAgICAgIHFSZXMxN2xvLCBxU3JjMWxvLCBxU3JjN2xvICAgICAgOy8vIChqMStqNykvMgotICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczE3aGksIHFTcmMxaGksIHFTcmM3aGkgICAgICA7Ly8gKGoxK2o3KS8yCi0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGk1bG8sIHFSZXMxN2xvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTUKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTVoaSwgcVJlczE3aGkgICAgICAgICAgICAgIAotICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczE3bG8sIHFTcmMxbG8sIHFTcmM3bG8gICAgICA7Ly8gajEtajcKLSAgICAgICAgICAgIFZTVUIgICAgICAgIHFSZXMxN2hpLCBxU3JjMWhpLCBxU3JjN2hpICAgICAgOy8vIGoxLWo3Ci0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGk2bG8sIHFSZXMxN2xvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTYKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTZoaSwgcVJlczE3aGkgICAgICAKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMybG8sIGRYajJsbywgIygxMi0xKQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzJoaSwgZFhqMmhpLCAjKDEyLTEpCi0gICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlNmxvLCBxU2NhbGU2aGl9LCBbcFRlbXBdIQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzZsbywgZFhqNmxvLCAjKDEyLTEpCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNmhpLCBkWGo2aGksICMoMTItMSkKLSAgICAgICAgICAgIFNVQiAgICAgICAgIHBUZW1wLCBwVGVtcCwgIygoMTYqMikrKDQqOCoxKSkKLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMybG8sIHFTY2FsZTJsbywgcVNyYzJsbwotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzJoaSwgcVNjYWxlMmhpLCBxU3JjMmhpCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjNmxvLCBxU2NhbGU2bG8sIHFTcmM2bG8KLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM2aGksIHFTY2FsZTZoaSwgcVNyYzZoaQotICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTNsbywgcVNjYWxlM2hpfSwgW3BTY2FsZV0hCi0KLSAgICAgICAgICAgIDsvLyBSb3cgMiAmIDYKLSAgICAgICAgICAgIFZIQUREICAgICAgIHFSZXMyNmxvLCBxU3JjMmxvLCBxU3JjNmxvICAgICAgOy8vIChqMitqNikvMgotICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczI2aGksIHFTcmMyaGksIHFTcmM2aGkgICAgICA7Ly8gKGoyK2o2KS8yCi0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGkzbG8sIHFSZXMyNmxvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTMKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTNoaSwgcVJlczI2aGkgICAgICAgICAgICAgIAotICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczI2bG8sIHFTcmMybG8sIHFTcmM2bG8gICAgICA7Ly8gajItajYKLSAgICAgICAgICAgIFZTVUIgICAgICAgIHFSZXMyNmhpLCBxU3JjMmhpLCBxU3JjNmhpICAgICAgOy8vIGoyLWo2Ci0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGkybG8sIHFSZXMyNmxvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTIKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTJoaSwgcVJlczI2aGkgICAgICAKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMzbG8sIGRYajNsbywgIygxMi0xKQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzNoaSwgZFhqM2hpLCAjKDEyLTEpCi0gICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlNWxvLCBxU2NhbGU1aGl9LCBbcFRlbXBdIQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzVsbywgZFhqNWxvLCAjKDEyLTEpCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNWhpLCBkWGo1aGksICMoMTItMSkKLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMzbG8sIHFTY2FsZTNsbywgcVNyYzNsbwotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzNoaSwgcVNjYWxlM2hpLCBxU3JjM2hpCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjNWxvLCBxU2NhbGU1bG8sIHFTcmM1bG8KLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM1aGksIHFTY2FsZTVoaSwgcVNyYzVoaQotICAgICAgICAgICAgCi0gICAgICAgICAgICA7Ly8gUm93IDMgJiA1Ci0gICAgICAgICAgICBWSEFERCAgICAgICBxUmVzNTNsbywgcVNyYzVsbywgcVNyYzNsbyAgICAgIDsvLyAoajUrajMpLzIKLSAgICAgICAgICAgIFZIQUREICAgICAgIHFSZXM1M2hpLCBxU3JjNWhpLCBxU3JjM2hpICAgICAgOy8vIChqNStqMykvMgotICAgICAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzE2KjIqMgotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpN2xvLCBxUmVzNTNsbyAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGk3Ci0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGk3aGksIHFSZXM1M2hpICAgICAgICAgICAgICAKLSAgICAgICAgICAgIFZTVUIgICAgICAgIHFSZXM1M2xvLCBxU3JjNWxvLCBxU3JjM2xvICAgICAgOy8vIGo1LWozCi0gICAgICAgICAgICBWU1VCICAgICAgICBxUmVzNTNoaSwgcVNyYzVoaSwgcVNyYzNoaSAgICAgIDsvLyBqNS1qMwotICAgICAgICAgICAgVkxEMSAgICAgICAgcVhqNCwgW3BTcmMgQDY0XQotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNGxvLCBxUmVzNTNsbyAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGk0Ci0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGk0aGksIHFSZXM1M2hpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNGxvLCBkWGo0bG8sICMoMTItMSkKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM0aGksIGRYajRoaSwgIygxMi0xKQotICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTRsbywgcVNjYWxlNGhpfSwgW3BTY2FsZV0gICAgICAgICAgICAKLSAgICAgICAgICAgIExEUiAgICAgICAgIHBTcmMsID1hcm1DT01NX0lEQ1RDb2VmICAgICA7Ly8gQWRkcmVzcyBvZiBEQ1QgaW52ZXJzZSBBQU4gY29uc3RhbnRzCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjNGxvLCBxU2NhbGU0bG8sIHFTcmM0bG8KLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM0aGksIHFTY2FsZTRoaSwgcVNyYzRoaQotICAgICAgICAgICAgVkxEUiAgICAgICAgZENvZWZzLCBbcFNyY10gICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBEQ1QgaW52ZXJzZSBBQU4gY29uc3RhbnRzCi0gICAgICAgICAgICA7Ly8gUm93IDQKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTFsbywgcVNyYzRsbyAgICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpMQotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMWhpLCBxU3JjNGhpICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1FTkQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9NYXNrVGFibGUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9NYXNrVGFibGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI0NmYxNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fTWFza1RhYmxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtQ09NTV9NYXNrVGFibGUuaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIE1hc2sgVGFibGUgdG8gbWFzayB0aGUgZW5kIG9mIGFycmF5Ci0gKi8KLSAKLQotCi0jaWZuZGVmIF9BUk1DT01NX01BU0tUQUJMRV9IXwotI2RlZmluZSBfQVJNQ09NTV9NQVNLVEFCTEVfSF8KLQotI2RlZmluZSBNYXNrVGFibGVTaXplIDcyCi0gIAotLyogTWFzayB0YWJsZSAqLwotCi1leHRlcm4gY29uc3QgT01YX1UxNiBhcm1DT01NX3FNYXNrVGFibGUxNltNYXNrVGFibGVTaXplXTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtQ09NTV9xTWFza1RhYmxlOFtNYXNrVGFibGVTaXplXTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fVmVyc2lvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2FwaS9hcm1DT01NX1ZlcnNpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNlNWIyYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fVmVyc2lvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyogR3VhcmQgdGhlIGhlYWRlciBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbi4gKi8KLSNpZm5kZWYgX19BUk1fQ09NTV9WRVJTSU9OX0hfXwotI2RlZmluZSBfX0FSTV9DT01NX1ZFUlNJT05fSF9fCi0KLQotLyogVGhlIGZvbGxvd2luZyBsaW5lIHNob3VsZCBiZSBpbiBvbXh0eXBlcy5oIGJ1dCBoYXNuJ3QgYmVlbiBhcHByb3ZlZCBieSBPcGVuTUFYIHlldCAqLwotI2RlZmluZSBPTVhfVkVSU0lPTiAxMDIKLQotLyogV2UgbmVlZCB0byBkZWZpbmUgdGhlc2UgbWFjcm9zIGluIG9yZGVyIHRvIGNvbnZlcnQgYSAjZGVmaW5lIG51bWJlciBpbnRvIGEgI2RlZmluZSBzdHJpbmcuICovCi0jZGVmaW5lIEFSTV9RVU9URShhKSAjYQotI2RlZmluZSBBUk1fSU5ESVJFQ1QoQSkgQVJNX1FVT1RFKEEpCi0KLS8qIENvbnZlcnQgdGhlIE9NWF9WRVJTSU9OIG51bWJlciBpbnRvIGEgc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQsIGZvciBleGFtcGxlLCB0byBwcmludCBpdCBvdXQuICovCi0jZGVmaW5lIEFSTV9WRVJTSU9OX1NUUklORyBBUk1fSU5ESVJFQ1QoT01YX1ZFUlNJT04pCi0KLQotLyogRGVmaW5lIHRoaXMgaW4gb3JkZXIgdG8gdHVybiBvbiBBUk0gdmVyc2lvbi9yZWxlYXNlL2J1aWxkIHN0cmluZ3MgaW4gZWFjaCBkb21haW4gKi8KLSNkZWZpbmUgQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMKLQotI2lmZGVmIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TCi0gIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214QUNfVmVyc2lvbkRlc2NyaXB0aW9uOwotICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teElDX1ZlcnNpb25EZXNjcmlwdGlvbjsKLSAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhJUF9WZXJzaW9uRGVzY3JpcHRpb247Ci0gIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214U1BfVmVyc2lvbkRlc2NyaXB0aW9uOwotICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teFZDX1ZlcnNpb25EZXNjcmlwdGlvbjsKLSNlbmRpZiAvKiBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUyAqLwotCi0KLS8qIFRoZSBmb2xsb3dpbmcgZW50cmllcyBzaG91bGQgYmUgYXV0b21hdGljYWxseSB1cGRhdGVkIGJ5IHRoZSByZWxlYXNlIHNjcmlwdCAqLwotLyogVGhleSBhcmUgdXNlZCBpbiB0aGUgQVJNIHZlcnNpb24gc3RyaW5ncyBkZWZpbmVkIGZvciBlYWNoIGRvbWFpbi4gICAgICAgICAgICAgKi8KLQotLyogVGhlIHJlbGVhc2UgdGFnIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlbGVhc2Ugb2YgdGhlIGxpYnJhcnkuIC0gdXNlZCBmb3Igc291cmNlIGFuZCBvYmplY3QgcmVsZWFzZXMgKi8KLSNkZWZpbmUgT01YX0FSTV9SRUxFQVNFX1RBRyAgInIwcDAtMDBiZXQxIgotCi0vKiBUaGUgQVJNIGFyY2hpdGVjdHVyZSB1c2VkIHRvIGJ1aWxkIGFueSBvYmplY3RzIG9yIGV4ZWN1dGFibGVzIGluIHRoaXMgcmVsZWFzZS4gKi8KLSNkZWZpbmUgT01YX0FSTV9CVUlMRF9BUkNISVRFQ1RVUkUgIkFSTSBBcmNoaXRlY3R1cmUgVjYiCi0KLS8qIFRoZSBBUk0gVG9vbGNoYWluIHVzZWQgdG8gYnVpbGQgYW55IG9iamVjdHMgb3IgZXhlY3V0YWJsZXMgaW4gdGhpcyByZWxlYXNlLiAqLwotI2RlZmluZSBPTVhfQVJNX0JVSUxEX1RPT0xDSEFJTiAgICAiQVJNIFJWQ1QgMy4xIgotCi0KLSNlbmRpZiAvKiBfX0FSTV9DT01NX1ZFUlNJT05fSF9fICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybUNPTU1fcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDczNWE5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtQ09NTV9zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTY4ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1DT01NX3MuaAotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi07Ly8gQVJNIG9wdGltaXplZCBPcGVuTUFYIGNvbW1vbiBoZWFkZXIgZmlsZQotOy8vCi0KLTsvLyBQcm90ZWN0IGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uCi0gSUYgOkxOT1Q6OkRFRjpBUk1DT01NX1NfSAotIEdCTEwgQVJNQ09NTV9TX0gKLQotICAgICAgICBSRVFVSVJFOCAgICAgICAgICAgIDsvLyBSZXF1aXJlcyA4LWJ5dGUgc3RhY2sgYWxpZ25tZW50Ci0gICAgICAgIFBSRVNFUlZFOCAgICAgICAgICAgOy8vIFByZXNlcnZlcyA4LWJ5dGUgc3RhY2sgYWxpZ25tZW50Ci0gICAgICAgIAotICAgICAgICBHQkxMICAgIEFSTV9FUlJPUkNIRUNLCi1BUk1fRVJST1JDSEVDSyAgU0VUTCB7RkFMU0V9Ci0KLTsvLyBHbG9iYWxzCi0KLSAgICAgICAgR0JMUyAgICBfUlJlZ0xpc3QgICA7Ly8gUiBzYXZlZCByZWdpc3RlciBsaXN0Ci0gICAgICAgIEdCTFMgICAgX0RSZWdMaXN0ICAgOy8vIEQgc2F2ZWQgcmVnaXN0ZXIgbGlzdAotICAgICAgICBHQkxTICAgIF9WYXJpYW50ICAgIDsvLyBTZWxlY3RlZCBwcm9jZXNzb3IgdmFyaWFudAotICAgICAgICBHQkxTICAgIF9DUFUgICAgICAgIDsvLyBDUFUgbmFtZQotICAgICAgICBHQkxTICAgIF9TdHJ1Y3QgICAgIDsvLyBTdHJ1Y3R1cmUgbmFtZQotICAgICAgICAKLSAgICAgICAgR0JMTCAgICBfSW5GdW5jICAgICA7Ly8gSW5zaWRlIGZ1bmN0aW9uIGFzc2VtYmx5IGZsYWcKLSAgICAgICAgR0JMTCAgICBfU3dMb25nICAgICA7Ly8gTG9uZyBzd2l0Y2ggZmxhZwotICAgICAgICAKLSAgICAgICAgR0JMQSAgICBfUkJ5dGVzICAgICA7Ly8gTnVtYmVyIG9mIHJlZ2lzdGVyIGJ5dGVzIG9uIHN0YWNrCi0gICAgICAgIEdCTEEgICAgX1NCeXRlcyAgICAgOy8vIE51bWJlciBvZiBzY3JhdGNoIGJ5dGVzIG9uIHN0YWNrIAotICAgICAgICBHQkxBICAgIF9BQnl0ZXMgICAgIDsvLyBTdGFjayBvZmZzZXQgb2YgbmV4dCBhcmd1bWVudAotICAgICAgICBHQkxBICAgIF9Xb3Jrc3BhY2UgIDsvLyBTdGFjayBvZmZzZXQgb2Ygc2NyYXRjaCB3b3Jrc3BhY2UKLSAgICAgICAgR0JMQSAgICBfRiAgICAgICAgICA7Ly8gRnVuY3Rpb24gbnVtYmVyCi0gICAgICAgIEdCTEEgICAgX1N0T2ZmICAgICAgOy8vIFN0cnVjdCBvZmZzZXQKLSAgICAgICAgR0JMQSAgICBfU3dOdW0gICAgICA7Ly8gU3dpdGNoIG51bWJlcgotICAgICAgICBHQkxTICAgIF8zMiAgICAgICAgIDsvLyBTdWZmaXggZm9yIDMyIGJ5dGUgYWxpZ25tbmV0Ci0gICAgICAgIEdCTFMgICAgXzE2ICAgICAgICAgOy8vIFN1ZmZpeCBmb3IgMTYgYnl0ZSBhbGlnbm1uZXQKLSAgICAgICAgCi1fSW5GdW5jICAgICAgICAgU0VUTCAgICB7RkFMU0V9Ci1fU0J5dGVzICAgICAgICAgU0VUQSAgICAwCi1fRiAgICAgICAgICAgICAgU0VUQSAgICAwCi1fU3dOdW0gICAgICAgICAgU0VUQSAgICAwCi1fMzIgICAgICAgICAgICAgU0VUUyAgICAiQUxJR04zMiIKLV8xNiAgICAgICAgICAgICBTRVRTICAgICJBTElHTjE2IgotCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi07Ly8gT3ZlcnJpZGUgdGhlIHRvb2xzIHNldHRpbmdzIG9mIHRoZSBDUFUgaWYgdGhlICNkZWZpbmUKLTsvLyBVU0VDUFUgaXMgc2V0LCBvdGhlcndpc2UgdXNlIHRoZSBDUFUgZGVmaW5lZCBieSB0aGUKLTsvLyBhc3NlbWJsZXIgc2V0dGluZ3MuCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAgICBJRiA6REVGOiBPVkVSUklERUNQVQotX0NQVSAgICAgICBTRVRTICBPVkVSUklERUNQVQotICAgICAgIEVMU0UKLV9DUFUgICAgICAgU0VUUyAgICB7Q1BVfSAgICAgICAKLSAgICAgICBFTkRJRgotCi0KLQotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotOy8vIFdvcmsgb3V0IHdoaWNoIGNvZGUgdG8gYnVpbGQKLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgICAgICBJRiA6REVGOkFSTTExMzZKUzpMT1I6OkRFRjpDb3J0ZXhBODpMT1I6OkRFRjpBUk1fR0VORVJJQwotICAgICAgICAgICAgSU5GTyAxLCJQbGVhc2Ugc3dpdGNoIHRvIHVzaW5nIE1fVkFSSUFOVFMiCi0gICAgICAgIEVORElGCi0KLSAgICAgICAgOy8vIERlZmluZSBhbmQgcmVzZXQgYWxsIG9mZmljaWFsbHkgcmVjb25nbmlzZWQgdmFyaWFudHMKLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fREVGX1ZBUklBTlRTCi0gICAgICAgIF9NX0RFRl9WQVJJQU5UIEFSTTkyNkVKUwotICAgICAgICBfTV9ERUZfVkFSSUFOVCBBUk0xMTM2SlMKLSAgICAgICAgX01fREVGX1ZBUklBTlQgQVJNMTEzNkpTX1UKLSAgICAgICAgX01fREVGX1ZBUklBTlQgQ29ydGV4QTgKLSAgICAgICAgX01fREVGX1ZBUklBTlQgQVJNN1RETUkKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fREVGX1ZBUklBTlQgJHZhcgotICAgICAgICBHQkxMICR2YXIKLSAgICAgICAgR0JMTCBfb2skdmFyCi0kdmFyICAgIFNFVEwge0ZBTFNFfQotICAgICAgICBNRU5EICAgICAgICAKLSAgICAgICAgCi0KLSAgICAgICAgOy8vIFZhcmlhbnQgZGVjbGFyYXRpb24KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBEZWZpbmUgYSBsaXN0IG9mIGNvZGUgdmFyaWFudHMgc3VwcG9ydGVkIGJ5IHRoaXMKLSAgICAgICAgOy8vIHNvdXJjZSBmaWxlLiBUaGlzIG1hY3JvIHRoZW4gY2hvb3NlcyB0aGUgbW9zdAotICAgICAgICA7Ly8gYXBwcm9wcmlhdGUgdmFyaWFudCB0byBidWlsZCBmb3IgdGhlIGN1cnJlbnRseSBjb25maWd1cmVkCi0gICAgICAgIDsvLyBjb3JlLgotICAgICAgICA7Ly8gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBNX1ZBUklBTlRTICR2MCwkdjEsJHYyLCR2MywkdjQsJHY1LCR2NiwkdjcgICAgICAgIAotICAgICAgICA7Ly8gU2V0IHRvIFRSVUUgdmFyaWFudHMgdGhhdCBhcmUgc3VwcG9ydGVkCi0gICAgICAgIF9NX0RFRl9WQVJJQU5UUwotICAgICAgICBfTV9WQVJJQU5UICR2MAotICAgICAgICBfTV9WQVJJQU5UICR2MQotICAgICAgICBfTV9WQVJJQU5UICR2MgotICAgICAgICBfTV9WQVJJQU5UICR2MwotICAgICAgICBfTV9WQVJJQU5UICR2NAotICAgICAgICBfTV9WQVJJQU5UICR2NQotICAgICAgICBfTV9WQVJJQU5UICR2NgotICAgICAgICBfTV9WQVJJQU5UICR2NwotICAgICAgICAKLSAgICAgICAgOy8vIExvb2sgZm9yIGZpcnN0IGF2YWlsYWJsZSB2YXJpYW50IHRvIG1hdGNoIGEgQ1BVCi0gICAgICAgIDsvLyBfTV9UUlkgY3B1LCB2YXJpYW50IGZhbGwgYmFjayBsaXN0Ci1fVmFyaWFudCBTRVRTICIiICAgICAgICAgICAgICAgIAotICAgICAgICBfTV9UUlkgQVJNOTI2RUotUywgICBBUk05MjZFSlMKLSAgICAgICAgX01fVFJZIEFSTTExNzZKWi1TLCAgQVJNMTEzNkpTCi0gICAgICAgIF9NX1RSWSBBUk0xMTc2SlpGLVMsIEFSTTExMzZKUwotICAgICAgICBfTV9UUlkgQVJNMTE1NlQyLVMsICBBUk0xMTM2SlMKLSAgICAgICAgX01fVFJZIEFSTTExNTZUMkYtUywgQVJNMTEzNkpTCi0gICAgICAgIF9NX1RSWSBBUk0xMTM2Si1TLCAgIEFSTTExMzZKUwotICAgICAgICBfTV9UUlkgQVJNMTEzNkpGLVMsICBBUk0xMTM2SlMKLSAgICAgICAgX01fVFJZIE1QQ29yZSwgICAgICAgQVJNMTEzNkpTCi0gICAgICAgIF9NX1RSWSBDb3J0ZXgtQTgsICAgIENvcnRleEE4LCBBUk0xMTM2SlMKLSAgICAgICAgX01fVFJZIENvcnRleC1SNCwgICAgQVJNMTEzNkpTCi0gICAgICAgIF9NX1RSWSBBUk03VERNSQotICAgICAgICAKLSAgICAgICAgOy8vIFNlbGVjdCB0aGUgY29ycmVjdCB2YXJpYW50Ci0gICAgICAgIF9NX0RFRl9WQVJJQU5UUwotICAgICAgICBJRiBfVmFyaWFudD0iIgotICAgICAgICAgICAgSU5GTyAxLCAiTm8gbWF0Y2ggZm91bmQgZm9yIENQVSAnJF9DUFUnIgotICAgICAgICBFTFNFCi0kX1ZhcmlhbnQgICBTRVRMIHtUUlVFfQotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gUmVnaXN0ZXIgYSB2YXJpYW50IGFzIGF2YWlsYWJsZQotICAgICAgICBNQUNSTwotICAgICAgICBfTV9WQVJJQU5UICR2YXIKLSAgICAgICAgSUYgIiR2YXIiPSIiCi0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiA6TE5PVDo6REVGOl9vayR2YXIKLSAgICAgICAgICAgIElORk8gMSwgIlVucmVjb2duaXplZCB2YXJpYW50ICckdmFyJyIKLSAgICAgICAgRU5ESUYKLSR2YXIgICAgU0VUTCB7VFJVRX0KLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIEZvciBhIGdpdmVuIENQVSwgc2VlIGlmIGFueSBvZiB0aGUgdmFyaWFudHMgc3VwcG9ydGluZwotICAgICAgICA7Ly8gdGhpcyBDUFUgYXJlIGF2YWlsYWJsZS4gVGhlIGZpcnN0IGF2YWlsYWJsZSB2YXJpYW50IGlzCi0gICAgICAgIDsvLyBjaG9zZW4KLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fVFJZICRjcHUsICR2MCwkdjEsJHYyLCR2MywkdjQsJHY1LCR2NiwkdjcKLSAgICAgICAgSUYgIiRjcHUiPD5fQ1BVCi0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBfTV9UUlkxICR2MAotICAgICAgICBfTV9UUlkxICR2MQotICAgICAgICBfTV9UUlkxICR2MgotICAgICAgICBfTV9UUlkxICR2MwotICAgICAgICBfTV9UUlkxICR2NAotICAgICAgICBfTV9UUlkxICR2NQotICAgICAgICBfTV9UUlkxICR2NgotICAgICAgICBfTV9UUlkxICR2NwotICAgICAgICA7Ly8gQ2hlY2sgYSBtYXRjaCB3YXMgZm91bmQKLSAgICAgICAgSUYgX1ZhcmlhbnQ9IiIKLSAgICAgICAgICAgIElORk8gMSwgIk5vIHZhcmlhbnQgbWF0Y2ggZm91bmQgZm9yIENQVSAnJF9DUFUnIgotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBfTV9UUlkxICR2YXIKLSAgICAgICAgSUYgIiR2YXIiPSIiCi0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAoX1ZhcmlhbnQ9IiIpOkxBTkQ6JHZhcgotX1ZhcmlhbnQgU0VUUyAiJHZhciIKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotOy8vIFN0cnVjdHVyZSBkZWZpbml0aW9uCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgICAgICA7Ly8gRGVjbGFyZSBhIHN0cnVjdHVyZSBvZiBnaXZlbiBuYW1lCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fU1RSVUNUICRzbmFtZQotX1N0cnVjdCBTRVRTICIkc25hbWUiCi1fU3RPZmYgIFNFVEEgMAotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gRGVjbGFyZSBhIHN0cnVjdHVyZSBmaWVsZAotICAgICAgICA7Ly8gVGhlIGZpZWxkIGlzIGNhbGxlZCAkc25hbWVfJGZuYW1lCi0gICAgICAgIDsvLyAkc2l6ZSAgID0gdGhlIHNpemUgb2YgZWFjaCBlbnRyeSwgbXVzdCBiZSBwb3dlciBvZiAyIAotICAgICAgICA7Ly8gJG51bWJlciA9IChpZiBwcm92aWRlZCkgdGhlIG51bWJlciBvZiBlbnRyaWVzIGZvciBhbiBhcnJheQotICAgICAgICBNQUNSTwotICAgICAgICBNX0ZJRUxEICRmbmFtZSwgJHNpemUsICRudW1iZXIKLSAgICAgICAgSUYgKF9TdE9mZjpBTkQ6KCRzaXplLTEpKSE9MAotX1N0T2ZmICAgICAgU0VUQSBfU3RPZmYgKyAoJHNpemUgLSAoX1N0T2ZmOkFORDooJHNpemUtMSkpKQotICAgICAgICBFTkRJRgotJF9TdHJ1Y3QuXyRmbmFtZSBFUVUgX1N0T2ZmCi0gICAgICAgIElGICIkbnVtYmVyIjw+IiIKLV9TdE9mZiAgICAgIFNFVEEgX1N0T2ZmICsgJHNpemUqJG51bWJlcgotICAgICAgICBFTFNFCi1fU3RPZmYgICAgICBTRVRBIF9TdE9mZiArICRzaXplCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBNX0VORFNUUlVDVAotc2l6ZW9mXyRfU3RydWN0IEVRVSBfU3RPZmYKLV9TdHJ1Y3QgU0VUUyAiIgotICAgICAgICBNRU5ECi0KLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi07Ly8gU3dpdGNoIGFuZCB0YWJsZSBtYWNyb3MKLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAgICAgOy8vIFN0YXJ0IGEgcmVsYXRpdmUgc3dpdGNoIHRhYmxlIHdpdGggcmVnaXN0ZXIgdG8gc3dpdGNoIG9uCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJHYgPSB0aGUgcmVnaXN0ZXIgdG8gc3dpdGNoIG9uCi0gICAgICAgIDsvLyAkcyA9IGlmIHNwZWNpZmllZCBtdXN0IGJlICJMIiB0byBpbmRpY2F0ZSBsb25nCi0gICAgICAgIDsvLyAgICAgIHRoaXMgYWxsb3dzIGEgZ3JlYXRlciByYW5nZSB0byB0aGUgY2FzZSBjb2RlCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fU1dJVENIICR2LCAkcwotICAgICAgICBBU1NFUlQgIiRzIj0iIjpMT1I6IiRzIj0iTCIKLV9Td0xvbmcgU0VUTCB7RkFMU0V9Ci0gICAgICAgIElGICIkcyI9IkwiCi1fU3dMb25nICAgICBTRVRMIHtUUlVFfQotICAgICAgICBFTkRJRgotX1N3TnVtICBTRVRBIF9Td051bSsxICAgICAgICAKLSAgICAgICAgSUYge0NPTkZJR309MTYKLSAgICAgICAgICAgIDsvLyBUaHVtYgotICAgICAgICAgICAgSUYgX1N3TG9uZwotICAgICAgICAgICAgICAgIFRCSCBbcGMsICR2LCBMU0wjMV0KLSAgICAgICAgICAgIEVMU0UKLSAgICAgICAgICAgICAgICBUQkIgW3BjLCAkdl0KLSAgICAgICAgICAgIEVORElGCi1fU3dpdGNoJF9Td051bQotICAgICAgICBFTFNFCi0gICAgICAgICAgICA7Ly8gQVJNCi0gICAgICAgICAgICBBREQgcGMsIHBjLCAkdiwgTFNMICMyCi0gICAgICAgICAgICBOT1AKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIEFkZCBhIGNhc2UgdG8gdGhlIHN3aXRjaCBzdGF0ZW1lbnQKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9DQVNFICAkbGFiZWwKLSAgICAgICAgSUYge0NPTkZJR309MTYKLSAgICAgICAgICAgIDsvLyBUaHVtYgotICAgICAgICAgICAgSUYgX1N3TG9uZwotICAgICAgICAgICAgICAgIERDVyAoJGxhYmVsIC0gX1N3aXRjaCRfU3dOdW0pLzIKLSAgICAgICAgICAgIEVMU0UKLSAgICAgICAgICAgICAgICBEQ0IgKCRsYWJlbCAtIF9Td2l0Y2gkX1N3TnVtKS8yCi0gICAgICAgICAgICBFTkRJRgotICAgICAgICBFTFNFCi0gICAgICAgICAgICA7Ly8gQVJNCi0gICAgICAgICAgICBCICAgJGxhYmVsCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBFbmQgb2Ygc3dpdGNoIHN0YXRlbWVudAotICAgICAgICBNQUNSTwotICAgICAgICBNX0VORFNXSVRDSAotICAgICAgICBBTElHTiAyCi0gICAgICAgIE1FTkQgICAgICAgCi0KLQotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi07Ly8gRGF0YSBhcmVhIGFsbG9jYXRpb24KLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgICAgIDsvLyBDb25zdGFudCB0YWJsZSBhbGxvY2F0b3IgbWFjcm8KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBDcmVhdGVzIGEgbmV3IHNlY3Rpb24gZm9yIGVhY2ggY29uc3RhbnQgdGFibGUKLSAgICAgICAgOy8vICRuYW1lIGlzIHN5bWJvbCB0aHJvdWdoIHdoaWNoIHRoZSB0YWJsZSBjYW4gYmUgYWNjZXNzZWQuCi0gICAgICAgIDsvLyAkYWxpZ24gaXMgdGhlIG9wdGlvbmFsIGFsaWdubWVudCBvZiB0aGUgdGFibGUsIGxvZzIgb2YgCi0gICAgICAgIDsvLyAgdGhlIGJ5dGUgYWxpZ25tZW50IC0gJGFsaWduPTQgaXMgMTYgYnl0ZSBhbGlnbmVkCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fVEFCTEUgICRuYW1lLCAkYWxpZ24KLSAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKLSAgICAgICAgSUYgIiRhbGlnbiI9IiIKLSAgICAgICAgICAgIEFSRUEgfC5jb25zdGRhdGF8LCBSRUFET05MWSwgREFUQQotICAgICAgICBFTFNFCi0gICAgICAgICAgICA7Ly8gQVJFQXMgaW5oZXJpdCB0aGUgYWxpZ25tZW50IG9mIHRoZSBmaXJzdCBkZWNsYXJhdGlvbi4KLSAgICAgICAgICAgIDsvLyBUaGVyZWZvcmUgZm9yIGVhY2ggYWxpZ25tZW50IHNpemUgd2UgbXVzdCBoYXZlIGFuIGFyZWEKLSAgICAgICAgICAgIDsvLyBvZiBhIGRpZmZlcmVudCBuYW1lLgotICAgICAgICAgICAgQVJFQSBjb25zdGRhdGFfYSRhbGlnbiwgUkVBRE9OTFksIERBVEEsIEFMSUdOPSRhbGlnbgotICAgICAgICAgICAgCi0gICAgICAgICAgICA7Ly8gV2UgYWxzbyBmb3JjZSBhbGlnbm1lbnQgaW5jYXNlIHdlIGFyZSB0YWdnaW5nIG9udG8KLSAgICAgICAgICAgIDsvLyBhbiBhbHJlYWR5IHN0YXJ0ZWQgYXJlYS4KLSAgICAgICAgICAgIEFMSUdOICgxPDwkYWxpZ24pCi0gICAgICAgIEVORElGCi0kbmFtZQotICAgICAgICBNRU5ECi0gICAgICAgIAotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi07Ly8gTWFjcm9zIHRvIGFsbG9jYXRlIHNwYWNlIG9uIHRoZSBzdGFjawotOy8vCi07Ly8gVGhlc2UgYWxsIGFzc3VtZSB0aGF0IHRoZSBzdGFjayBpcyA4LWJ5dGUgYWxpZ25lZAotOy8vIGF0IGVudHJ5IHRvIHRoZSBmdW5jdGlvbiwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgCi07Ly8gMzItYnl0ZSBhbGlnbm1lbnQgbWFjcm8gbmVlZHMgdG8gd29yayBpbiBhCi07Ly8gYml0IG1vcmUgb2YgYSBzcGVjaWFsIHdheS4uLgotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAgICAgCi0KLQotICAgICAgICA7Ly8gQWxsb2NhdGUgMS1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCi0gICAgICAgIDsvLyAkbmFtZSBzaXplICRzaXplIGJ5dGVzLgotICAgICAgICBNQUNSTwotICAgICAgICBNX0FMTE9DMSAgJG5hbWUsICRzaXplCi0gICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCi0kbmFtZSRfRiAgIEVRVSBfU0J5dGVzCi1fU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkKLSAgICAgICAgTUVORAotICAgICAgICAgICAgCi0gICAgICAgIDsvLyBBbGxvY2F0ZSAyLWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKLSAgICAgICAgOy8vICRuYW1lIHNpemUgJHNpemUgYnl0ZXMuCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQUxMT0MyICAkbmFtZSwgJHNpemUKLSAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKLSAgICAgICAgSUYgKF9TQnl0ZXM6QU5EOjEpIT0wCi1fU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoMiAtIChfU0J5dGVzOkFORDoxKSkKLSAgICAgICAgRU5ESUYKLSRuYW1lJF9GICAgRVFVIF9TQnl0ZXMKLV9TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKQotICAgICAgICBNRU5ECi0gICAgICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIDQtYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQotICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAkc2l6ZSBieXRlcy4KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9BTExPQzQgICRuYW1lLCAkc2l6ZQotICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYwotICAgICAgICBJRiAoX1NCeXRlczpBTkQ6MykhPTAKLV9TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg0IC0gKF9TQnl0ZXM6QU5EOjMpKQotICAgICAgICBFTkRJRgotJG5hbWUkX0YgICBFUVUgX1NCeXRlcwotX1NCeXRlcyBTRVRBIF9TQnl0ZXMgKyAoJHNpemUpCi0gICAgICAgIE1FTkQKLSAgICAgICAgICAgIAotICAgICAgICA7Ly8gQWxsb2NhdGUgOC1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCi0gICAgICAgIDsvLyAkbmFtZSBzaXplICRzaXplIGJ5dGVzLgotICAgICAgICBNQUNSTwotICAgICAgICBNX0FMTE9DOCAgJG5hbWUsICRzaXplCi0gICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCi0gICAgICAgIElGIChfU0J5dGVzOkFORDo3KSE9MAotX1NCeXRlcyAgICAgU0VUQSBfU0J5dGVzICsgKDggLSAoX1NCeXRlczpBTkQ6NykpCi0gICAgICAgIEVORElGCi0kbmFtZSRfRiAgIEVRVSBfU0J5dGVzCi1fU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkKLSAgICAgICAgTUVORCAgICAgICAgCi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBBbGxvY2F0ZSA4LWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKLSAgICAgICAgOy8vICRuYW1lIHNpemUgKCRzaXplKzE2KSBieXRlcy4KLSAgICAgICAgOy8vIFRoZSBleHRyYSAxNiBieXRlcyBhcmUgbGF0ZXIgdXNlZCB0byBhbGlnbiB0aGUgcG9pbnRlciB0byAxNiBieXRlcwotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9BTExPQzE2ICAkbmFtZSwgJHNpemUKLSAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKLSAgICAgICAgSUYgKF9TQnl0ZXM6QU5EOjcpIT0wCi1fU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoOCAtIChfU0J5dGVzOkFORDo3KSkKLSAgICAgICAgRU5ESUYKLSRuYW1lJF9GJF8xNiAgIEVRVSAoX1NCeXRlcyArIDgpCi1fU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkgKyA4Ci0gICAgICAgIE1FTkQgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIDgtYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQotICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAoJHNpemUrMzIpIGJ5dGVzLgotICAgICAgICA7Ly8gVGhlIGV4dHJhIDMyIGJ5dGVzIGFyZSBsYXRlciB1c2VkIHRvIGFsaWduIHRoZSBwb2ludGVyIHRvIDMyIGJ5dGVzCi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBNX0FMTE9DMzIgICRuYW1lLCAkc2l6ZQotICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYwotICAgICAgICBJRiAoX1NCeXRlczpBTkQ6NykhPTAKLV9TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg4IC0gKF9TQnl0ZXM6QU5EOjcpKQotICAgICAgICBFTkRJRgotJG5hbWUkX0YkXzMyICAgRVFVIChfU0J5dGVzICsgMjQpCi1fU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkgKyAyNAotICAgICAgICBNRU5EICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBBcmd1bWVudCBEZWNsYXJhdGlvbiBNYWNybwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIEFsbG9jYXRlIGFuIGFyZ3VtZW50IG5hbWUgJG5hbWUKLSAgICAgICAgOy8vIHNpemUgJHNpemUgYnl0ZXMKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9BUkcgICAgICRuYW1lLCAkc2l6ZQotICAgICAgICBBU1NFUlQgX0luRnVuYwotJG5hbWUkX0YgICAgRVFVIF9BQnl0ZXMKLV9BQnl0ZXMgU0VUQSBfQUJ5dGVzICsgKCRzaXplKQotICAgICAgICBNRU5EICAgICAgICAKLSAgICAgICAgCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLTsvLyBNYWNyb3MgdG8gYWNjZXNzIHN0YWNrZWQgdmFyaWFibGVzCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgICAgICA7Ly8gTWFjcm8gdG8gcGVyZm9ybSBhIGRhdGEgcHJvY2Vzc2luZyBvcGVyYXRpb24KLSAgICAgICAgOy8vIHdpdGggYSBjb25zdGFudCBzZWNvbmQgb3BlcmFuZAotICAgICAgICBNQUNSTwotICAgICAgICBfTV9PUEMgJG9wLCRyZCwkcm4sJGNvbnN0Ci0gICAgICAgIExDTEEgICAgX3NoCi0gICAgICAgIExDTEEgICAgX2NzdAotX3NoICAgICBTRVRBICAgIDAKLV9jc3QgICAgU0VUQSAgICAkY29uc3QKLSAgICAgICAgSUYgX2NzdD0wCi0gICAgICAgICRvcCAkcmQsICRybiwgI19jc3QKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIFdISUxFIChfY3N0OkFORDozKT0wCi1fY3N0ICAgICAgICBTRVRBIF9jc3Q+PjIKLV9zaCAgICAgICAgIFNFVEEgX3NoKzIKLSAgICAgICAgV0VORAotICAgICAgICAkb3AgJHJkLCAkcm4sICMoX2NzdDpBTkQ6MHgwMDAwMDBGRik8PF9zaAotICAgICAgICBJRiBfY3N0Pj0yNTYKLSAgICAgICAgICAgICRvcCAkcmQsICRyZCwgIyhfY3N0OkFORDoweEZGRkZGRjAwKTw8X3NoCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLQotICAgICAgICA7Ly8gTWFjcm8gdG8gcGVyZm9ybSBhIGRhdGEgYWNjZXNzIG9wZXJhdGlvbgotICAgICAgICA7Ly8gU3VjaCBhcyBMRFIgb3IgU1RSCi0gICAgICAgIDsvLyBUaGUgYWRkcmVzc2luZyBtb2RlIGlzIG1vZGlmaWVkIHN1Y2ggdGhhdAotICAgICAgICA7Ly8gMS4gSWYgbm8gYWRkcmVzcyBpcyBnaXZlbiB0aGVuIHRoZSBuYW1lIGlzIHRha2VuCi0gICAgICAgIDsvLyAgICBhcyBhIHN0YWNrIG9mZnNldAotICAgICAgICA7Ly8gMi4gSWYgdGhlIGFkZHJlc3NpbmcgbW9kZSBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGUKLSAgICAgICAgOy8vICAgIHN0YXRlIGJlaW5nIGFzc2VtYmxlZCBmb3IgKGVnIFRodW1iKSB0aGVuIGEgc3VpdGFibGUKLSAgICAgICAgOy8vICAgIGFkZHJlc3NpbmcgbW9kZSBpcyBzdWJzdGl0dXRlZC4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPbiBFbnRyeToKLSAgICAgICAgOy8vICRpID0gSW5zdHJ1Y3Rpb24gdG8gcGVyZm9ybSAoZWcgIkxEUkIiKQotICAgICAgICA7Ly8gJGEgPSBSZXF1aXJlZCBieXRlIGFsaWdubWVudAotICAgICAgICA7Ly8gJHIgPSBSZWdpc3RlcihzKSB0byB0cmFuc2ZlciAoZWcgInIxIikKLSAgICAgICAgOy8vICRhMCwkYTEsJGEyLiBBZGRyZXNzaW5nIG1vZGUgYW5kIGNvbmRpdGlvbi4gT25lIG9mOgotICAgICAgICA7Ly8gICAgIGxhYmVsIHssY2N9Ci0gICAgICAgIDsvLyAgICAgW2Jhc2VdICAgICAgICAgICAgICAgICAgICB7LCwsY2N9Ci0gICAgICAgIDsvLyAgICAgW2Jhc2UsIG9mZnNldF17IX0gICAgICAgICB7LCxjY30KLSAgICAgICAgOy8vICAgICBbYmFzZSwgb2Zmc2V0LCBzaGlmdF17IX0gIHssY2N9Ci0gICAgICAgIDsvLyAgICAgW2Jhc2VdLCBvZmZzZXQgICAgICAgICAgICB7LCxjY30KLSAgICAgICAgOy8vICAgICBbYmFzZV0sIG9mZnNldCwgc2hpZnQgICAgIHssY2N9Ci0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX0RBVEEgJGksJGEsJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIElGICIkYTAiOkxFRlQ6MT0iWyIKLSAgICAgICAgICAgIElGICIkYTEiPSIiCi0gICAgICAgICAgICAgICAgJGkkYTMgICAkciwgJGEwCi0gICAgICAgICAgICBFTFNFCi0gICAgICAgICAgICAgICAgSUYgIiRhMCI6UklHSFQ6MT0iXSIKLSAgICAgICAgICAgICAgICAgICAgSUYgIiRhMiI9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgIF9NX1BPU1RJTkQgJGkkYTMsICIkciIsICRhMCwgJGExCi0gICAgICAgICAgICAgICAgICAgIEVMU0UKLSAgICAgICAgICAgICAgICAgICAgICAgIF9NX1BPU1RJTkQgJGkkYTMsICIkciIsICRhMCwgIiRhMSwkYTIiCi0gICAgICAgICAgICAgICAgICAgIEVORElGCi0gICAgICAgICAgICAgICAgRUxTRQotICAgICAgICAgICAgICAgICAgICBJRiAiJGEyIj0iIgotICAgICAgICAgICAgICAgICAgICAgICAgX01fUFJFSU5EICAkaSRhMywgIiRyIiwgJGEwLCAkYTEKLSAgICAgICAgICAgICAgICAgICAgRUxTRQotICAgICAgICAgICAgICAgICAgICAgICAgX01fUFJFSU5EICAkaSRhMywgIiRyIiwgJGEwLCAiJGExLCRhMiIKLSAgICAgICAgICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgICAgICAgICBFTkRJRgotICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgRUxTRQotICAgICAgICAgICAgTENMQSAgICBfT2Zmc2V0Ci1fT2Zmc2V0ICAgICBTRVRBICAgIF9Xb3Jrc3BhY2UgKyAkYTAkX0YKLSAgICAgICAgICAgIEFTU0VSVCAgKF9PZmZzZXQ6QU5EOigkYS0xKSk9MAotICAgICAgICAgICAgJGkkYTEgICAkciwgW3NwLCAjX09mZnNldF0KLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIEhhbmRsZSBwb3N0IGluZGV4ZWQgbG9hZC9zdG9yZXMKLSAgICAgICAgOy8vIG9wICByZWcsIFtiYXNlXSwgb2Zmc2V0Ci0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX1BPU1RJTkQgJGksJHIsJGEwLCRhMQotICAgICAgICBMQ0xTIF9iYXNlCi0gICAgICAgIExDTFMgX29mZnNldAotICAgICAgICBJRiB7Q09ORklHfT0xNiA7Ly8gVGh1bWIKLV9iYXNlICAgICAgIFNFVFMgKCIkYTAiOkxFRlQ6KDpMRU46IiRhMCItMSkpOlJJR0hUOig6TEVOOiIkYTAiLTIpICAgOy8vIHJlbW92ZSBbXQotX29mZnNldCAgICAgU0VUUyAiJGExIgotICAgICAgICAgICAgSUYgX29mZnNldDpMRUZUOjE9IisiCi1fb2Zmc2V0ICAgICAgICAgU0VUUyBfb2Zmc2V0OlJJR0hUOig6TEVOOl9vZmZzZXQtMSkKLSAgICAgICAgICAgIEVORElGCi0gICAgICAgICAgICAkaSAgJHIsICRhMAotICAgICAgICAgICAgSUYgX29mZnNldDpMRUZUOjE9Ii0iCi1fb2Zmc2V0ICAgICAgICAgU0VUUyBfb2Zmc2V0OlJJR0hUOig6TEVOOl9vZmZzZXQtMSkKLSAgICAgICAgICAgICAgICBTVUIgJF9iYXNlLCAkX2Jhc2UsICRfb2Zmc2V0Ci0gICAgICAgICAgICBFTFNFICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEFERCAkX2Jhc2UsICRfYmFzZSwgJF9vZmZzZXQKLSAgICAgICAgICAgIEVORElGCi0gICAgICAgIEVMU0UgOy8vIEFSTQotICAgICAgICAgICAgJGkgICRyLCAkYTAsICRhMQotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gSGFuZGxlIHByZSBpbmRleGVkIGxvYWQvc3RvcmUKLSAgICAgICAgOy8vIG9wICByZWcsIFtiYXNlLCBvZmZzZXRdeyF9Ci0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX1BSRUlORCAkaSwkciwkYTAsJGExCi0gICAgICAgIExDTFMgX2Jhc2UKLSAgICAgICAgTENMUyBfb2Zmc2V0Ci0gICAgICAgIElGICh7Q09ORklHfT0xNik6TEFORDooKCIkYTEiOlJJR0hUOjIpPSJdISIpCi1fYmFzZSAgICAgICBTRVRTICIkYTAiOlJJR0hUOig6TEVOOigiJGEwIiktMSkKLV9vZmZzZXQgICAgIFNFVFMgIiRhMSI6TEVGVDooOkxFTjooIiRhMSIpLTIpCi0gICAgICAgICAgICAkaSAkciwgWyRfYmFzZSwgJF9vZmZzZXRdCi0gICAgICAgICAgICBBREQgJF9iYXNlLCAkX2Jhc2UsICRfb2Zmc2V0Ci0gICAgICAgIEVMU0UKLSAgICAgICAgICAgICRpICAkciwgJGEwLCAkYTEKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotCi0gICAgICAgIDsvLyBMb2FkIHVuc2lnbmVkIGJ5dGUgZnJvbSBzdGFjawotICAgICAgICBNQUNSTwotICAgICAgICBNX0xEUkIgICRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBfTV9EQVRBICJMRFJCIiwxLCRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBzaWduZWQgYnl0ZSBmcm9tIHN0YWNrCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fTERSU0IgJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIF9NX0RBVEEgIkxEUlNCIiwxLCRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gU3RvcmUgYnl0ZSB0byBzdGFjawotICAgICAgICBNQUNSTwotICAgICAgICBNX1NUUkIgICRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBfTV9EQVRBICJTVFJCIiwxLCRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCB1bnNpZ25lZCBoYWxmIHdvcmQgZnJvbSBzdGFjawotICAgICAgICBNQUNSTwotICAgICAgICBNX0xEUkggICRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBfTV9EQVRBICJMRFJIIiwyLCRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBzaWduZWQgaGFsZiB3b3JkIGZyb20gc3RhY2sKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9MRFJTSCAkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgX01fREFUQSAiTERSU0giLDIsJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBTdG9yZSBoYWxmIHdvcmQgdG8gc3RhY2sKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9TVFJIICAkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgX01fREFUQSAiU1RSSCIsMiwkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgTUVORAotCi0gICAgICAgIDsvLyBMb2FkIHdvcmQgZnJvbSBzdGFjawotICAgICAgICBNQUNSTwotICAgICAgICBNX0xEUiAgICRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBfTV9EQVRBICJMRFIiLDQsJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBTdG9yZSB3b3JkIHRvIHN0YWNrCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fU1RSICAgJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIF9NX0RBVEEgIlNUUiIsNCwkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgTUVORAotCi0gICAgICAgIDsvLyBMb2FkIGRvdWJsZSB3b3JkIGZyb20gc3RhY2sKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9MRFJEICAkcjAsJHIxLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBfTV9EQVRBICJMRFJEIiw4LCIkcjAsJHIxIiwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgTUVORAotICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gU3RvcmUgZG91YmxlIHdvcmQgdG8gc3RhY2sKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9TVFJEICAkcjAsJHIxLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBfTV9EQVRBICJTVFJEIiw4LCIkcjAsJHIxIiwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIEdldCBhYnNvbHV0ZSBhZGRyZXNzIG9mIHN0YWNrIGFsbG9jYXRlZCBsb2NhdGlvbgotICAgICAgICBNQUNSTwotICAgICAgICBNX0FEUiAgICRhLCAkYiwgJGNjCi0gICAgICAgIF9NX09QQyAgQUREJGNjLCAkYSwgc3AsIChfV29ya3NwYWNlICsgJGIkX0YpCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBHZXQgYWJzb2x1dGUgYWRkcmVzcyBvZiBzdGFjayBhbGxvY2F0ZWQgbG9jYXRpb24gYW5kIGFsaWduIHRoZSBhZGRyZXNzIHRvIDE2IGJ5dGVzCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQURSMTYgJGEsICRiLCAkY2MKLSAgICAgICAgICAgIF9NX09QQyAgQUREJGNjLCAkYSwgc3AsIChfV29ya3NwYWNlICsgJGIkX0YkXzE2KQotICAgICAgICAKLSAgICAgICAgICAgIDsvLyBOb3cgYWxpZ24gJGEgdG8gMTYgYnl0ZXMKLSAgICAgICAgICAgIEJJQyRjYyAgJGEsJGEsIzB4MEYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIEdldCBhYnNvbHV0ZSBhZGRyZXNzIG9mIHN0YWNrIGFsbG9jYXRlZCBsb2NhdGlvbiBhbmQgYWxpZ24gdGhlIGFkZHJlc3MgdG8gMzIgYnl0ZXMKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9BRFIzMiAkYSwgJGIsICRjYwotICAgICAgICAgICAgX01fT1BDICBBREQkY2MsICRhLCBzcCwgKF9Xb3Jrc3BhY2UgKyAkYiRfRiRfMzIpCi0gICAgICAgIAotICAgICAgICAgICAgOy8vIE5vdyBhbGlnbiAkYSB0byAzMiBieXRlcwotICAgICAgICAgICAgQklDJGNjICAkYSwkYSwjMHgxRgotICAgICAgICBNRU5ECi0KLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi07Ly8gRnVuY3Rpb24gaGVhZGVyIGFuZCBmb290ZXIgbWFjcm9zCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIEZ1bmN0aW9uIEhlYWRlciBNYWNybyAgICAKLSAgICAgICAgOy8vIEdlbmVyYXRlcyB0aGUgZnVuY3Rpb24gcHJvbG9ndWUKLSAgICAgICAgOy8vIE5vdGUgdGhhdCBmdW5jdGlvbnMgc2hvdWxkIGFsbCBiZSAic3RhY2stbW92ZXMtb25jZSIKLSAgICAgICAgOy8vIFRoZSBGTlNUQVJUIGFuZCBGTkVORCBtYWNyb3Mgc2hvdWxkIGJlIHRoZSBvbmx5IHBsYWNlcwotICAgICAgICA7Ly8gd2hlcmUgdGhlIHN0YWNrIG1vdmVzLgotICAgICAgICA7Ly8gICAgCi0gICAgICAgIDsvLyAkbmFtZSAgPSBmdW5jdGlvbiBuYW1lCi0gICAgICAgIDsvLyAkcnJlZyAgPSAiIiAgIGRvbid0IHN0YWNrIGFueSByZWdpc3RlcnMKLSAgICAgICAgOy8vICAgICAgICAgICJsciIgc3RhY2sgImxyIiBvbmx5Ci0gICAgICAgIDsvLyAgICAgICAgICAick4iIHN0YWNrIHJlZ2lzdGVycyAicjQtck4sbHIiCi0gICAgICAgIDsvLyAkZHJlZyAgPSAiIiAgIGRvbid0IHN0YWNrIGFueSBEIHJlZ2lzdGVycwotICAgICAgICA7Ly8gICAgICAgICAgImROIiBzdGFjayByZWdpc3RlcnMgImQ4LWROIgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE5vdGU6IEFSTSBBcmNoaWN0dXJlIHByb2NlZHVyZSBjYWxsIHN0YW5kYXJkIEFBUENTCi0gICAgICAgIDsvLyBzdGF0ZXMgdGhhdCByNC1yMTEsIHNwLCBkOC1kMTUgbXVzdCBiZSBwcmVzZXJ2ZWQgYnkKLSAgICAgICAgOy8vIGEgY29tcGxpYW50IGZ1bmN0aW9uLgotICAgICAgICBNQUNSTwotICAgICAgICBNX1NUQVJUICRuYW1lLCAkcnJlZywgJGRyZWcKLSAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKLSAgICAgICAgQVNTRVJUICIkbmFtZSIhPSIiCi1fSW5GdW5jIFNFVEwge1RSVUV9Ci1fUkJ5dGVzIFNFVEEgMAotX1dvcmtzcGFjZSBTRVRBIDAKLQotICAgICAgICA7Ly8gQ3JlYXRlIGFuIGFyZWEgZm9yIHRoZSBmdW5jdGlvbiAgICAgICAgCi0gICAgICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQotICAgICAgICBFWFBPUlQgICRuYW1lCi0kbmFtZSAgIEZVTkNUSU9OCi0gICAgICAgIAotICAgICAgICA7Ly8gU2F2ZSBSIHJlZ2lzdGVycwotICAgICAgICBfTV9HRVRSUkVHTElTVCAkcnJlZwotICAgICAgICBJRiBfUlJlZ0xpc3Q8PiIiCi0gICAgICAgICAgICBTVE1GRCAgIHNwISwgeyRfUlJlZ0xpc3QsIGxyfQotICAgICAgICBFTkRJRgotICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gU2F2ZSBEIHJlZ2lzdGVycwotICAgICAgICBfTV9HRVREUkVHTElTVCAgJGRyZWcgICAgICAgIAotICAgICAgICBJRiBfRFJlZ0xpc3Q8PiIiCi0gICAgICAgICAgICBWU1RNRkQgIHNwISwgeyRfRFJlZ0xpc3R9Ci0gICAgICAgIEVORElGICAgICAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBFbnN1cmUgc2l6ZSBjbGFpbWVkIG9uIHN0YWNrIGlzIDgtYnl0ZSBhbGlnbmVkCi0gICAgICAgIElGICgoX1NCeXRlczpBTkQ6NykhPTApCi1fU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoOCAtIChfU0J5dGVzOkFORDo3KSkKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIElGIChfU0J5dGVzIT0wKQotICAgICAgICAgICAgX01fT1BDIFNVQiwgc3AsIHNwLCBfU0J5dGVzCi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICAKLV9BQnl0ZXMgU0VUQSBfU0J5dGVzICsgX1JCeXRlcyAtIF9Xb3Jrc3BhY2UKLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBQcmludCBmdW5jdGlvbiBuYW1lIGlmIGRlYnVnIGVuYWJsZWQKLSAgICAgICAgTV9QUklOVEYgIiRuYW1lXG4iLAotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gV29yayBvdXQgYSBsaXN0IG9mIFIgc2F2ZWQgcmVnaXN0ZXJzCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX0dFVFJSRUdMSVNUICRycmVnCi0gICAgICAgIElGICIkcnJlZyI9IiIKLV9SUmVnTGlzdCAgIFNFVFMgIiIKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGICAgICAgICAKLSAgICAgICAgSUYgIiRycmVnIj0ibHIiOkxPUjoiJHJyZWciPSJyNCIKLV9SUmVnTGlzdCAgIFNFVFMgInI0IgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzgKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkcnJlZyI9InI1IjpMT1I6IiRycmVnIj0icjYiCi1fUlJlZ0xpc3QgICBTRVRTICJyNC1yNiIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcysxNgotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRycmVnIj0icjciOkxPUjoiJHJyZWciPSJyOCIKLV9SUmVnTGlzdCAgIFNFVFMgInI0LXI4IgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzI0Ci0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJHJyZWciPSJyOSI6TE9SOiIkcnJlZyI9InIxMCIKLV9SUmVnTGlzdCAgIFNFVFMgInI0LXIxMCIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcyszMgotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRycmVnIj0icjExIjpMT1I6IiRycmVnIj0icjEyIgotX1JSZWdMaXN0ICAgU0VUUyAicjQtcjEyIgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzQwCi0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJTkZPIDEsICJVbnJlY29nbml6ZWQgc2F2ZWQgciByZWdpc3RlciBsaW1pdCAnJHJyZWcnIgotICAgICAgICBNRU5EICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBXb3JrIG91dCBhIGxpc3Qgb2YgRCBzYXZlZCByZWdpc3RlcnMKLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fR0VURFJFR0xJU1QgJGRyZWcKLSAgICAgICAgSUYgIiRkcmVnIj0iIgotX0RSZWdMaXN0ICAgU0VUUyAiIgotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYgICAgICAgIAotICAgICAgICBJRiAiJGRyZWciPSJkOCIKLV9EUmVnTGlzdCAgIFNFVFMgImQ4IgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzgKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkZHJlZyI9ImQ5IgotX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDkiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrMTYKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkZHJlZyI9ImQxMCIKLV9EUmVnTGlzdCAgIFNFVFMgImQ4LWQxMCIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcysyNAotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRkcmVnIj0iZDExIgotX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDExIgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzMyCi0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJGRyZWciPSJkMTIiCi1fRFJlZ0xpc3QgICBTRVRTICJkOC1kMTIiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNDAKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkZHJlZyI9ImQxMyIKLV9EUmVnTGlzdCAgIFNFVFMgImQ4LWQxMyIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys0OAotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRkcmVnIj0iZDE0IgotX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDE0IgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzU2Ci0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJGRyZWciPSJkMTUiCi1fRFJlZ0xpc3QgICBTRVRTICJkOC1kMTUiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNjQKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElORk8gMSwgIlVucmVjb2duaXplZCBzYXZlZCBkIHJlZ2lzdGVyIGxpbWl0ICckZHJlZyciCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBQcm9kdWNlIGZ1bmN0aW9uIHJldHVybiBpbnN0cnVjdGlvbnMKLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fUkVUICRjYwotICAgICAgICBJRiBfRFJlZ0xpc3Q8PiIiCi0gICAgICAgICAgICBWUE9QJGNjIHskX0RSZWdMaXN0fQotICAgICAgICBFTkRJRgotICAgICAgICBJRiBfUlJlZ0xpc3Q9IiIKLSAgICAgICAgICAgIEJYJGNjIGxyCi0gICAgICAgIEVMU0UKLSAgICAgICAgICAgIExETSRjYy5GRCBzcCEsIHskX1JSZWdMaXN0LCBwY30KLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORCAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gRWFybHkgRnVuY3Rpb24gRXhpdCBNYWNybwotICAgICAgICA7Ly8gJGNjID0gY29uZGl0aW9uIHRvIGV4aXQgd2l0aAotICAgICAgICA7Ly8gKEV4YW1wbGU6IE1fRVhJVCBFUSkKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9FWElUICAkY2MKLSAgICAgICAgQVNTRVJUICBfSW5GdW5jCi0gICAgICAgIElGICBfU0J5dGVzIT0wCi0gICAgICAgICAgICA7Ly8gUmVzdG9yZSBzdGFjayBmcmFtZSBhbmQgZXhpdAotICAgICAgICAgICAgQiRjYyAgX0VuZCRfRgotICAgICAgICBFTFNFCi0gICAgICAgICAgICA7Ly8gQ2FuIHJldHVybiBkaXJlY3RseQotICAgICAgICAgICAgX01fUkVUICRjYwotICAgICAgICBFTkRJRiAgICAgICAgCi0gICAgICAgIE1FTkQgICAgICAgIAotCi0gICAgICAgIDsvLyBGdW5jdGlvbiBGb290ZXIgTWFjcm8gICAgICAgIAotICAgICAgICA7Ly8gR2VuZXJhdGVzIHRoZSBmdW5jdGlvbiBlcGlsb2d1ZQotICAgICAgICBNQUNSTwotICAgICAgICBNX0VORAotICAgICAgICBBU1NFUlQgX0luRnVuYwotX0luRnVuYyBTRVRMIHtGQUxTRX0KLV9FbmQkX0YKLQotICAgICAgICA7Ly8gUmVzdG9yZSB0aGUgc3RhY2sgcG9pbnRlciB0byBpdHMgb3JpZ2luYWwgdmFsdWUgb24gZnVuY3Rpb24gZW50cnkKLSAgICAgICAgSUYgX1NCeXRlcyE9MAotICAgICAgICAgICAgX01fT1BDIEFERCwgc3AsIHNwLCBfU0J5dGVzCi0gICAgICAgIEVORElGCi0gICAgICAgIF9NX1JFVAotICAgICAgICBFTkRGVU5DCi0KLSAgICAgICAgOy8vIFJlc2V0IHRoZSBnbG9iYWwgc3RhY2sgdHJhY2tpbmcgdmFyaWFibGVzIGJhY2sgdG8gdGhlaXIgCi0gICAgICAgIDsvLyBpbml0aWFsIHZhbHVlcywgYW5kIGluY3JlbWVudCB0aGUgZnVuY3Rpb24gY291bnQKLV9TQnl0ZXMgICAgICAgIFNFVEEgMAotX0YgICAgICAgICAgICAgU0VUQSBfRisxCi0gICAgICAgIE1FTkQKLQotICAgICAgICAgICAgICAgIAotOy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsvLyBEZWJ1ZyBNYWNyb3MKLTsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAgICAgR0JMTCAgICBERUJVR19PTgotREVCVUdfT04gU0VUTCAgIHtGQUxTRX0KLSAgICAgICAgR0JMTCAgICBERUJVR19TVEFMTFNfT04KLURFQlVHX1NUQUxMU19PTiBTRVRMIHtGQUxTRX0KLSAgICAgICAgCi0gICAgICAgIDsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgIDsvLyBEZWJ1ZyBjYWxsIHRvIHByaW50ZgotICAgICAgICA7Ly8gIE1fUFJJTlRGICRmb3JtYXQsICR2YWwwLCAkdmFsMSwgJHZhbDIKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBFeGFtcGxlczoKLSAgICAgICAgOy8vICBNX1BSSU5URiAieD0lMDh4XG4iLCByMAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFRoaXMgbWFjcm8gcHJlc2VydmVzIHRoZSB2YWx1ZSBvZiBhbGwgcmVnaXN0ZXJzIGluY2x1ZGluZyB0aGUKLSAgICAgICAgOy8vIGZsYWdzLgotICAgICAgICA7Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fUFJJTlRGICAkZm9ybWF0LCAkdmFsMCwgJHZhbDEsICR2YWwyCi0gICAgICAgIElGIERFQlVHX09OCi0gICAgICAgIAotICAgICAgICBJTVBPUlQgIHByaW50ZgotICAgICAgICBMQ0xBICAgIG5BcmdzCi1uQXJncwlTRVRBICAgIDAKLSAgICAgICAgCi0gICAgICAgIDsvLyBzYXZlIHJlZ2lzdGVycyBzbyB3ZSBkb24ndCBjb3JydXB0IHRoZW0KLSAgICAgICAgU1RNRkQgICBzcCEsIHtyMC1yMTIsIGxyfQotICAgICAgICAKLSAgICAgICAgOy8vIERyb3Agc3RhY2sgdG8gZ2l2ZSB1cyBzb21lIHdvcmtzcGFjZQotICAgICAgICBTVUIgICAgIHNwLCBzcCwgIzE2Ci0gICAgICAgIAotICAgICAgICA7Ly8gU2F2ZSByZWdpc3RlcnMgd2UgbmVlZCB0byBwcmludCB0byB0aGUgc3RhY2sKLSAgICAgICAgSUYgIiR2YWwyIiA8PiAiIgotICAgICAgICAgICAgQVNTRVJUICIkdmFsMSIgPD4gIiIKLSAgICAgICAgICAgIFNUUiAgICAkdmFsMiwgW3NwLCAjOF0KLW5BcmdzICAgICAgIFNFVEEgICBuQXJncysxCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkdmFsMSIgPD4gIiIKLSAgICAgICAgICAgIEFTU0VSVCAiJHZhbDAiIDw+ICIiCi0gICAgICAgICAgICBTVFIgICAgJHZhbDEsIFtzcCwgIzRdCi1uQXJncwkgICAgU0VUQSAgIG5BcmdzKzEKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiR2YWwwIjw+IiIKLSAgICAgICAgICAgIFNUUiAgICAkdmFsMCwgW3NwXQotbkFyZ3MJICAgIFNFVEEgICBuQXJncysxCi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICA7Ly8gTm93IHdlIGFyZSBzYWZlIHRvIGNvcnJ1cHQgcmVnaXN0ZXJzCi0gICAgICAgIEFEUiAgICAgcjAsICVGVDAwCi0gICAgICAgIElGIG5BcmdzPTEKLSAgICAgICAgICBMRFIgICByMSwgW3NwXQotICAgICAgICBFTkRJRgotICAgICAgICBJRiBuQXJncz0yCi0gICAgICAgICAgTERNSUEgc3AsIHtyMSxyMn0KLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgbkFyZ3M9MwotICAgICAgICAgIExETUlBIHNwLCB7cjEscjIscjN9Ci0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICA7Ly8gcHJpbnQgdGhlIHZhbHVlcwotICAgICAgICBNUlMgICAgIHI0LCBjcHNyICAgICAgICA7Ly8gcHJlc2VydmUgZmxhZ3MKLSAgICAgICAgQkwgICAgICBwcmludGYKLSAgICAgICAgTVNSICAgICBjcHNyX2YsIHI0ICAgICAgOy8vIHJlc3RvcmUgZmxhZ3MKLSAgICAgICAgQiAgICAgICAlRlQwMQotMDAgICAgICA7Ly8gc3RyaW5nIHRvIHByaW50Ci0gICAgICAgIERDQiAgICAgIiRmb3JtYXQiLCAwCi0gICAgICAgIEFMSUdOCi0wMSAgICAgIDsvLyBGaW5pc2hlZAotICAgICAgICBBREQgICAgIHNwLCBzcCwgIzE2Ci0gICAgICAgIDsvLyBSZXN0b3JlIHJlZ2lzdGVycwotICAgICAgICBMRE1GRAlzcCEsIHtyMC1yMTIsbHJ9Ci0KLSAgICAgICAgRU5ESUYgICA7Ly8gREVCVUdfT04KLSAgICAgICAgTUVORAotCi0KLSAgICAgICAgOy8vIFN0YWxsIFNpbXVsYXRpb24gTWFjcm8KLSAgICAgICAgOy8vIEluc2VydHMgYSBnaXZlbiBudW1iZXIgb2YgTk9QcyBmb3IgdGhlIGN1cnJlbnRseQotICAgICAgICA7Ly8gIGRlZmluZWQgcGxhdGZvcm0KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9TVEFMTCAkcGxhdDFzdGFsbCwgJHBsYXQyc3RhbGwsICRwbGF0M3N0YWxsLCAkcGxhdDRzdGFsbCwgJHBsYXQ1c3RhbGwsICRwbGF0NnN0YWxsCi0gICAgICAgIElGIERFQlVHX1NUQUxMU19PTgotICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0MXN0YWxsICAgIAotICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0MnN0YWxsICAgIAotICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0M3N0YWxsICAgIAotICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0NHN0YWxsICAgIAotICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0NXN0YWxsICAgIAotICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0NnN0YWxsICAgIAotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXRzdGFsbAotICAgICAgICBJRiAiJHBsYXRzdGFsbCIhPSIiCi0gICAgICAgICAgICBMQ0xBIF9wbGxlbgotICAgICAgICAgICAgTENMUyBfcGwKLSAgICAgICAgICAgIExDTEwgX3BsbG9nCi1fcGxsZW4gICAgICBTRVRBIDpMRU46IiRwbGF0c3RhbGwiCi1fcGwgICAgICAgICBTRVRTICIkcGxhdHN0YWxsIjpMRUZUOihfcGxsZW4gLSAyKQotICAgICAgICAgICAgSUYgOkRFRjokX3BsCi0gICAgICAgICAgICAgICAgSUYgJF9wbAotICAgICAgICAgICAgICAgICAgICBMQ0xTIF9zdAotICAgICAgICAgICAgICAgICAgICBMQ0xBIF9zdG51bQotX3N0ICAgICAgICAgICAgICAgICBTRVRTICIkcGxhdHN0YWxsIjpSSUdIVDoxICAgICAgICAKLV9zdG51bSAgICAgICAgICAgICAgU0VUQSAkX3N0Ci0gICAgICAgICAgICAgICAgICAgIFdISUxFIF9zdG51bT4wCi0JCQlNT1Ygc3AsIHNwCi1fc3RudW0gICAgICAgICAgICAgICAgICBTRVRBIF9zdG51bSAtIDEKLSAgICAgICAgICAgICAgICAgICAgV0VORAotICAgICAgICAgICAgICAgIEVORElGCi0gICAgICAgICAgICBFTkRJRgotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi07Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotOy8vIEVuZGlhbiBJbnZhcmllbmNlIE1hY3JvcwotOy8vIAotOy8vIFRoZSBpZGVhIGJlaGluZCB0aGVzZSBtYWNyb3MgaXMgdGhhdCBpZiBhbiBhcnJheSBpcwotOy8vIGxvYWRlZCBhcyB3b3JkcyB0aGVuIHRoZSBTTVVMMDAgbWFjcm8gd2lsbCBtdWx0aXBseQotOy8vIGFycmF5IGVsZW1lbnRzIDAgcmVnYXJkbGVzcyBvZiB0aGUgZW5kaWFuZXNzIG9mIHRoZQotOy8vIHN5c3RlbS4gRm9yIGxpdHRsZSBlbmRpYW4gU01VTDAwPVNNVUxCQiwgZm9yIGJpZwotOy8vIGVuZGlhbiBTTVVMMDA9U01VTFRUIGFuZCBzaW1pbGFybHkgZm9yIG90aGVyIHBhY2tlZCBvcGVyYXRpb25zLgotOy8vCi07Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIExJQkk0ICAgJGNvbWxpLCAkY29tYmksICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgSUYge0VORElBTn09ImJpZyIKLSAgICAgICAgJGNvbWJpLiRjYyAkYSwgJGIsICRjLCAkZAotICAgICAgICBFTFNFCi0gICAgICAgICRjb21saS4kY2MgJGEsICRiLCAkYywgJGQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTElCSTMgICAkY29tbGksICRjb21iaSwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIElGIHtFTkRJQU59PSJiaWciCi0gICAgICAgICRjb21iaS4kY2MgJGEsICRiLCAkYwotICAgICAgICBFTFNFCi0gICAgICAgICRjb21saS4kY2MgJGEsICRiLCAkYwotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gU01MQXh5IG1hY3JvcwotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQTAwICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFCQiwgU01MQVRULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEEwMSAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBQlQsIFNNTEFUQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBMEIgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUJCLCBTTUxBVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQTBUICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFCVCwgU01MQVRULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEExMCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBVEIsIFNNTEFCVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBMTEgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQVRULCBTTUxBQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQTFCICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFUQiwgU01MQUJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEExVCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBVFQsIFNNTEFCVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBQjAgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUJCLCBTTUxBQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUIxICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFCVCwgU01MQUJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFUMCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBVEIsIFNNTEFUVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBVDEgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQVRULCBTTUxBVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIFNNVUx4eSBtYWNyb3MKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUwwMCAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxCQiwgU01VTFRULCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTDAxICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTEJULCBTTVVMVEIsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMMEIgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMQkIsIFNNVUxUQiwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUwwVCAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxCVCwgU01VTFRULCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTDEwICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTFRCLCBTTVVMQlQsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMMTEgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMVFQsIFNNVUxCQiwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUwxQiAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxUQiwgU01VTEJCLCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTDFUICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTFRULCBTTVVMQlQsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMQjAgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMQkIsIFNNVUxCVCwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUxCMSAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxCVCwgU01VTEJCLCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTFQwICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTFRCLCBTTVVMVFQsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMVDEgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMVFQsIFNNVUxUQiwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBTTUxBV3gsIFNNVUxXeCBtYWNyb3MKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFXMCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBV0IsIFNNTEFXVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBVzEgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQVdULCBTTUxBV0IsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTFcwICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTFdCLCBTTVVMV1QsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMVzEgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMV1QsIFNNVUxXQiwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLQotICAgICAgICA7Ly8gU01MQUx4eSBtYWNyb3MKLQotCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMMDAgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxCQiwgU01MQUxUVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTDAxICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMQlQsIFNNTEFMVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUwwQiAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTEJCLCBTTUxBTFRCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMMFQgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxCVCwgU01MQUxUVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTDEwICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMVEIsIFNNTEFMQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMMTEgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxUVCwgU01MQUxCQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTDFCICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMVEIsIFNNTEFMQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUwxVCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTFRULCBTTUxBTEJULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMQjAgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxCQiwgU01MQUxCVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTEIxICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMQlQsIFNNTEFMQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUxUMCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTFRCLCBTTUxBTFRULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMVDEgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxUVCwgU01MQUxUQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICBFTkRJRiA7Ly8gQVJNQ09NTV9TX0gKLSAgICAgICAgICAgIAotICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtT01YLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL2FybU9NWC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2MwYzI2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvYXJtT01YLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybU9NWF9SZWxlYXNlVmVyc2lvbi5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogVGhpcyBmaWxlIGFsbG93cyBhIHZlcnNpb24gb2YgdGhlIE9NWCBETCBsaWJyYXJpZXMgdG8gYmUgYnVpbHQgd2hlcmUgc29tZSBvcgotICogYWxsIG9mIHRoZSBmdW5jdGlvbiBuYW1lcyBjYW4gYmUgZ2l2ZW4gYSB1c2VyIHNwZWNpZmllZCBzdWZmaXguIAotICoKLSAqIFlvdSBtaWdodCB3YW50IHRvIHVzZSBpdCB3aGVyZToKLSAqCi0gKiAtIHlvdSB3YW50IHRvIHJlbmFtZSBhIGZ1bmN0aW9uICJvdXQgb2YgdGhlIHdheSIgc28gdGhhdCB5b3UgY291bGQgcmVwbGFjZQotICogICBhIGZ1bmN0aW9uIHdpdGggYSBkaWZmZXJlbnQgdmVyc2lvbiAodGhlIG9yaWdpbmFsIHZlcnNpb24gd291bGQgc3RpbGwgYmUKLSAqICAgaW4gdGhlIGxpYnJhcnkganVzdCB3aXRoIGEgZGlmZmVyZW50IG5hbWUgLSBzbyB5b3UgY291bGQgZGVidWcgdGhlIG5ldwotICogICB2ZXJzaW9uIGJ5IGNvbXBhcmluZyBpdCB0byB0aGUgb3V0cHV0IG9mIHRoZSBvbGQpCi0gKgotICogLSB5b3Ugd2FudCB0byByZW5hbWUgYWxsIHRoZSBmdW5jdGlvbnMgdG8gdmVyc2lvbnMgd2l0aCBhIHN1ZmZpeCBzbyB0aGF0IAotICogICB5b3UgY2FuIGluY2x1ZGUgdHdvIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5IGFuZCBjaG9vc2UgYmV0d2VlbiBmdW5jdGlvbnMKLSAqICAgYXQgcnVudGltZS4KLSAqCi0gKiAgICAgZS5nLiBvbXhJUEJNX0NvcHlfVThfQzFSIGNvdWxkIGJlIHJlbmFtZWQgb214SVBCTV9Db3B5X1U4X0MxUl9Db3J0ZXhBOAotICogCi0gKi8KLQotICAKLSNpZm5kZWYgX2FybU9NWF9IXwotI2RlZmluZSBfYXJtT01YX0hfCi0KLQotLyogV2UgbmVlZCB0byBkZWZpbmUgdGhlc2UgdHdvIG1hY3JvcyBpbiBvcmRlciB0byBleHBhbmQgYW5kIGNvbmNhdGVuYXRlIHRoZSBuYW1lcyAqLwotI2RlZmluZSBPTVhDQVQyQkFSKEEsIEIpIG9teCAjIyBBICMjIEIKLSNkZWZpbmUgT01YQ0FUQkFSKEEsIEIpIE9NWENBVDJCQVIoQSwgQikKLQotLyogRGVmaW5lIHRoZSBzdWZmaXggdG8gYWRkIHRvIGFsbCBmdW5jdGlvbnMgLSB0aGUgZGVmYXVsdCBpcyBubyBzdWZmaXggKi8KLSNkZWZpbmUgQkFSRV9TVUZGSVggCi0KLQotCi0vKiBEZWZpbmUgd2hhdCBoYXBwZW5zIHRvIHRoZSBiYXJlIHN1ZmZpeC1sZXNzIGZ1bmN0aW9ucywgZG93biB0byB0aGUgc3ViLWRvbWFpbiBhY2N1cmFjeSAqLwotI2RlZmluZSBPTVhBQ0FBQ19TVUZGSVggICAgQkFSRV9TVUZGSVggICAKLSNkZWZpbmUgT01YQUNNUDNfU1VGRklYICAgIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWElDSlBfU1VGRklYICAgICBCQVJFX1NVRkZJWAotI2RlZmluZSBPTVhJUEJNX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YSVBDU19TVUZGSVggICAgIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWElQUFBfU1VGRklYICAgICBCQVJFX1NVRkZJWAotI2RlZmluZSBPTVhTUF9TVUZGSVggICAgICAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YVkNDT01NX1NVRkZJWCAgIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWFZDTTRQMTBfU1VGRklYICBCQVJFX1NVRkZJWAotI2RlZmluZSBPTVhWQ000UDJfU1VGRklYICAgQkFSRV9TVUZGSVgKLQotCi0KLQotLyogRGVmaW5lIHdoYXQgdGhlIGVhY2ggYmFyZSwgdW4tc3VmZml4ZWQgT3Blbk1BWCBBUEkgZnVuY3Rpb24gbmFtZXMgaXMgdG8gYmUgcmVuYW1lZCAqLwotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVDaGFuUGFpckVsdCAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVDaGFuUGFpckVsdCwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVEYXRTdHJFbHQgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVEYXRTdHJFbHQsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfRGVjb2RlRmlsbEVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlRmlsbEVsdCwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVJc1N0ZXJlb19TMzIgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVJc1N0ZXJlb19TMzIsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfRGVjb2RlTXNQTlNfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlTXNQTlNfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfRGVjb2RlTXNTdGVyZW9fUzMyX0kgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlTXNTdGVyZW9fUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfRGVjb2RlUHJnQ2ZnRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlUHJnQ2ZnRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZVROU19TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZVROU19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWludGVybGVhdmVTcGVjdHJ1bV9TMzIgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWludGVybGVhdmVTcGVjdHJ1bV9TMzIsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfRW5jb2RlVE5TX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRW5jb2RlVE5TX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0xvbmdUZXJtUHJlZGljdF9TMzIgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0xvbmdUZXJtUHJlZGljdF9TMzIsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfTG9uZ1Rlcm1SZWNvbnN0cnVjdF9TMzJfSSAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTG9uZ1Rlcm1SZWNvbnN0cnVjdF9TMzJfSSwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19NRENURndkX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19NRENURndkX1MzMiwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19NRENUSW52X1MzMl9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19NRENUSW52X1MzMl9TMTYsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfTm9pc2VsZXNzRGVjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTm9pc2VsZXNzRGVjb2RlLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX1F1YW50SW52X1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX1F1YW50SW52X1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX1VucGFja0FESUZIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX1VucGFja0FESUZIZWFkZXIsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfVW5wYWNrQURUU0ZyYW1lSGVhZGVyICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfVW5wYWNrQURUU0ZyYW1lSGVhZGVyLCBPTVhBQ0FBQ19TVUZGSVgpCi0KLQotI2RlZmluZSBvbXhBQ01QM19IdWZmbWFuRGVjb2RlX1MzMiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19IdWZmbWFuRGVjb2RlX1MzMiwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19IdWZmbWFuRGVjb2RlU2ZiX1MzMiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19IdWZmbWFuRGVjb2RlU2ZiX1MzMiwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19IdWZmbWFuRGVjb2RlU2ZiTWJwX1MzMiAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19IdWZmbWFuRGVjb2RlU2ZiTWJwX1MzMiwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19NRENUSW52X1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19NRENUSW52X1MzMiwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19SZVF1YW50aXplX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19SZVF1YW50aXplX1MzMl9JLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX1JlUXVhbnRpemVTZmJfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1JlUXVhbnRpemVTZmJfUzMyX0ksIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfU3ludGhQUU1GX1MzMl9TMTYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfU3ludGhQUU1GX1MzMl9TMTYsIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfVW5wYWNrRnJhbWVIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfVW5wYWNrRnJhbWVIZWFkZXIsIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfVW5wYWNrU2NhbGVGYWN0b3JzX1M4ICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfVW5wYWNrU2NhbGVGYWN0b3JzX1M4LCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX1VucGFja1NpZGVJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1VucGFja1NpZGVJbmZvLCBPTVhBQ01QM19TVUZGSVgpCi0KLSNkZWZpbmUgb214SUNKUF9Db3B5RXhwYW5kX1U4X0MzICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9Db3B5RXhwYW5kX1U4X0MzLCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RGd2RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RGd2RfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RGd2RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RGd2RfUzE2X0ksIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVEludl9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEludl9TMTYsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVEludl9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEludl9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RfTXVsdGlwbGVfUzE2ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RfTXVsdGlwbGVfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZF9TMTYsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkX1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkX1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZFRhYmxlSW5pdCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZFRhYmxlSW5pdCwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZfTXVsdGlwbGVfUzE2ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZfTXVsdGlwbGVfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludl9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludl9TMTYsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52X1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludlRhYmxlSW5pdCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludlRhYmxlSW5pdCwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRGVjb2RlSHVmZm1hbjh4OF9EaXJlY3RfUzE2X0MxICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRGVjb2RlSHVmZm1hbjh4OF9EaXJlY3RfUzE2X0MxLCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EZWNvZGVIdWZmbWFuU3BlY0dldEJ1ZlNpemVfVTggICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EZWNvZGVIdWZmbWFuU3BlY0dldEJ1ZlNpemVfVTgsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjSW5pdF9VOCAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjSW5pdF9VOCwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRW5jb2RlSHVmZm1hbjh4OF9EaXJlY3RfUzE2X1UxX0MxICAgICAgICAgT01YQ0FUQkFSKElDSlBfRW5jb2RlSHVmZm1hbjh4OF9EaXJlY3RfUzE2X1UxX0MxLCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9FbmNvZGVIdWZmbWFuU3BlY0dldEJ1ZlNpemVfVTggICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9FbmNvZGVIdWZmbWFuU3BlY0dldEJ1ZlNpemVfVTgsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjSW5pdF9VOCAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjSW5pdF9VOCwgT01YSUNKUF9TVUZGSVgpCi0KLSNkZWZpbmUgb214SVBCTV9BZGRDX1U4X0MxUl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9BZGRDX1U4X0MxUl9TZnMsIE9NWElQQk1fU1VGRklYKQotI2RlZmluZSBvbXhJUEJNX0NvcHlfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX0NvcHlfVThfQzFSLCBPTVhJUEJNX1NVRkZJWCkKLSNkZWZpbmUgb214SVBCTV9Db3B5X1U4X0MzUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9Db3B5X1U4X0MzUiwgT01YSVBCTV9TVUZGSVgpCi0jZGVmaW5lIG9teElQQk1fTWlycm9yX1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fTWlycm9yX1U4X0MxUiwgT01YSVBCTV9TVUZGSVgpCi0jZGVmaW5lIG9teElQQk1fTXVsQ19VOF9DMVJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fTXVsQ19VOF9DMVJfU2ZzLCBPTVhJUEJNX1NVRkZJWCkKLQotI2RlZmluZSBvbXhJUENTX0NvbG9yVHdpc3RRMTRfVThfQzNSICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX0NvbG9yVHdpc3RRMTRfVThfQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19CR1I1NjVUb1lDYkNyNDIwTFNfTUNVX1UxNl9TMTZfQzNQM1IgICAgICBPTVhDQVRCQVIoSVBDU19CR1I1NjVUb1lDYkNyNDIwTFNfTUNVX1UxNl9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0JHUjU2NVRvWUNiQ3I0MjJMU19NQ1VfVTE2X1MxNl9DM1AzUiAgICAgIE9NWENBVEJBUihJUENTX0JHUjU2NVRvWUNiQ3I0MjJMU19NQ1VfVTE2X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQkdSNTY1VG9ZQ2JDcjQ0NExTX01DVV9VMTZfUzE2X0MzUDNSICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSNTY1VG9ZQ2JDcjQ0NExTX01DVV9VMTZfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19CR1I4ODhUb1lDYkNyNDIwTFNfTUNVX1U4X1MxNl9DM1AzUiAgICAgICBPTVhDQVRCQVIoSVBDU19CR1I4ODhUb1lDYkNyNDIwTFNfTUNVX1U4X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQkdSODg4VG9ZQ2JDcjQyMkxTX01DVV9VOF9TMTZfQzNQM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSODg4VG9ZQ2JDcjQyMkxTX01DVV9VOF9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0JHUjg4OFRvWUNiQ3I0NDRMU19NQ1VfVThfUzE2X0MzUDNSICAgICAgIE9NWENBVEJBUihJUENTX0JHUjg4OFRvWUNiQ3I0NDRMU19NQ1VfVThfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFJzekNzY1JvdEJHUl9VOF9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFJzekNzY1JvdEJHUl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBSc3pSb3RfVThfUDNSICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBSc3pSb3RfVThfUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFRvQkdSNTY1X1U4X1UxNl9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFRvQkdSNTY1X1U4X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJSc3pDc2NSb3RCR1JfVThfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJSc3pDc2NSb3RCR1JfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0NiWUNyWTQyMlJzekNzY1JvdEJHUl9VOF9VMTZfQzJSICAgICAgICAgIE9NWENBVEJBUihJUENTX0NiWUNyWTQyMlJzekNzY1JvdEJHUl9VOF9VMTZfQzJSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlJzelJvdF9VOF9QM1IgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlJzelJvdF9VOF9QM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYllDcjQyMlRvQkdSNTY1X1U4X1UxNl9DMkMzUiAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYllDcjQyMlRvQkdSNTY1X1U4X1UxNl9DMkMzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JZQ3I0MjJUb0JHUjg4OF9VOF9DMkMzUiAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JZQ3I0MjJUb0JHUjg4OF9VOF9DMkMzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19DYllDclk0MjJUb1lDYkNyNDIwUm90YXRlX1U4X0MyUDNSICAgICAgICBPTVhDQVRCQVIoSVBDU19DYllDclk0MjJUb1lDYkNyNDIwUm90YXRlX1U4X0MyUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfUDNSICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQ0NFRvQkdSNTY1X1U4X1UxNl9DM1IgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQ0NFRvQkdSNTY1X1U4X1UxNl9DM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQ0NFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQ0NFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I4ODhfVThfQzNSICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I4ODhfVThfQzNSLCBPTVhJUENTX1NVRkZJWCkKLQotI2RlZmluZSBvbXhJUFBQX0RlYmxvY2tfSG9yRWRnZV9VOF9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0RlYmxvY2tfSG9yRWRnZV9VOF9JLCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9EZWJsb2NrX1ZlckVkZ2VfVThfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9EZWJsb2NrX1ZlckVkZ2VfVThfSSwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfRmlsdGVyRklSX1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRmlsdGVyRklSX1U4X0MxUiwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfRmlsdGVyTWVkaWFuX1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRmlsdGVyTWVkaWFuX1U4X0MxUiwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfR2V0Q2VudHJhbE1vbWVudF9TNjQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfR2V0Q2VudHJhbE1vbWVudF9TNjQsIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX0dldFNwYXRpYWxNb21lbnRfUzY0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0dldFNwYXRpYWxNb21lbnRfUzY0LCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9Nb21lbnRHZXRTdGF0ZVNpemUgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9Nb21lbnRHZXRTdGF0ZVNpemUsIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX01vbWVudEluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudEluaXQsIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX01vbWVudHNfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudHNfVThfQzFSLCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9Nb21lbnRzX1U4X0MzUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9Nb21lbnRzX1U4X0MzUiwgT01YSVBQUF9TVUZGSVgpCi0KLSNkZWZpbmUgb214U1BfQmxvY2tFeHBfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfQmxvY2tFeHBfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0Jsb2NrRXhwX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0Jsb2NrRXhwX1MzMiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9Db3B5X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9Db3B5X1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9Eb3RQcm9kX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9Eb3RQcm9kX1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9Eb3RQcm9kX1MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9Eb3RQcm9kX1MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZURndkX0NUb0NfU0MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX0NUb0NfU0MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZURndkX0NUb0NfU0MzMl9TZnMgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX0NUb0NfU0MzMl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZURndkX1JUb0NDU19TMTZTMzJfU2ZzICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX1JUb0NDU19TMTZTMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEZ3ZF9SVG9DQ1NfUzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9SVG9DQ1NfUzMyX1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRHZXRCdWZTaXplX0NfU0MxNiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRHZXRCdWZTaXplX0NfU0MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRHZXRCdWZTaXplX0NfU0MzMiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRHZXRCdWZTaXplX0NfU0MzMiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRHZXRCdWZTaXplX1JfUzE2UzMyICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRHZXRCdWZTaXplX1JfUzE2UzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfUl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfUl9TMzIsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUSW5pdF9DX1NDMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW5pdF9DX1NDMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUSW5pdF9DX1NDMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW5pdF9DX1NDMzIsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUSW5pdF9SX1MxNlMzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW5pdF9SX1MxNlMzMiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbml0X1JfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X1JfUzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEludl9DQ1NUb1JfUzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DQ1NUb1JfUzMyX1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbnZfQ0NTVG9SX1MzMlMxNl9TZnMgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ0NTVG9SX1MzMlMxNl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUSW52X0NUb0NfU0MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NUb0NfU0MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUSW52X0NUb0NfU0MzMl9TZnMgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NUb0NfU0MzMl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRmlsdGVyTWVkaWFuX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRmlsdGVyTWVkaWFuX1MzMiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GaWx0ZXJNZWRpYW5fUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GaWx0ZXJNZWRpYW5fUzMyX0ksIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNl9JU2ZzICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNl9JU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2X1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0lTZnMgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0lTZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0lJUl9CaVF1YWREaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUl9CaVF1YWREaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0lJUl9CaVF1YWREaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUl9CaVF1YWREaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlSX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlSX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9JSVJPbmVfQmlRdWFkRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJPbmVfQmlRdWFkRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9JSVJPbmVfQmlRdWFkRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJPbmVfQmlRdWFkRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0lJUk9uZV9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0lJUk9uZV9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKLQotI2RlZmluZSBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQXZlcmFnZV8xNngsIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9BdmVyYWdlXzh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9BdmVyYWdlXzh4LCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrLCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX0NvcHkxNngxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0NvcHkxNngxNiwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX0NvcHk4eDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0NvcHk4eDgsIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9FeHBhbmRGcmFtZV9JLCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fTGltaXRNVlRvUmVjdCwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX1NBRF8xNnggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX1NBRF8xNngsIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9TQURfOHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9TQURfOHgsIE9NWFZDQ09NTV9TVUZGSVgpCi0KLSNkZWZpbmUgb214VkNNNFAxMF9BdmVyYWdlXzR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9BdmVyYWdlXzR4LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9CbG9ja01hdGNoX0hhbGYsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWJsb2NrQ2hyb21hX0ksIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlYmxvY2tMdW1hX0ksIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCBPTVhDQVRCQVIoVkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfR2V0VkxDSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfR2V0VkxDSW5mbywgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQyAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX01FR2V0QnVmU2l6ZSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfTUVJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfTUVJbml0LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDgsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1NBRF80eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBRF80eCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfU0FEUXVhcl8xNnggICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEUXVhcl8xNngsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1NBRFF1YXJfNHggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBRFF1YXJfNHgsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1NBRFF1YXJfOHggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBRFF1YXJfOHgsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1NBVERfNHg0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBVERfNHg0LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCi0KLSNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDggICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDgsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4LCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRENUOHg4YmxrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRENUOHg4YmxrLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlciAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlciwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVNViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVNViwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9GaW5kTVZwcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9GaW5kTVZwcmVkLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfSURDVDh4OGJsayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfSURDVDh4OGJsaywgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX01DUmVjb25CbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX01DUmVjb25CbG9jaywgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX01FR2V0QnVmU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX01FR2V0QnVmU2l6ZSwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX01FSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX01FSW5pdCwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX1F1YW50SW50ZXJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1F1YW50SW50ZXJfSSwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX1F1YW50SW50cmFfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1F1YW50SW50cmFfSSwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1F1YW50SW52SW50ZXJfSSwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1F1YW50SW52SW50cmFfSSwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEsIE9NWFZDTTRQMl9TVUZGSVgpCi0KLQotI2VuZGlmIC8qIF9hcm1PTVhfaF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvb214dHlwZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvb214dHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEyY2IwZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL29teHR5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqCi0gKiBGaWxlOiBvbXh0eXBlcy5oCi0gKiBCcmllZjogRGVmaW5lcyBiYXNpYyBEYXRhIHR5cGVzIHVzZWQgaW4gT3Blbk1BWCB2MS4wLjIgaGVhZGVyIGZpbGVzLgotICoKLSAqIENvcHlyaWdodCCpIDIwMDUtMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICoKLSAqIFRoZXNlIG1hdGVyaWFscyBhcmUgcHJvdGVjdGVkIGJ5IGNvcHlyaWdodCBsYXdzIGFuZCBjb250YWluIG1hdGVyaWFsIAotICogcHJvcHJpZXRhcnkgdG8gdGhlIEtocm9ub3MgR3JvdXAsIEluYy4gIFlvdSBtYXkgdXNlIHRoZXNlIG1hdGVyaWFscyAKLSAqIGZvciBpbXBsZW1lbnRpbmcgS2hyb25vcyBzcGVjaWZpY2F0aW9ucywgd2l0aG91dCBhbHRlcmluZyBvciByZW1vdmluZyAKLSAqIGFueSB0cmFkZW1hcmssIGNvcHlyaWdodCBvciBvdGhlciBub3RpY2UgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbi4KLSAqIAotICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCByZXByZXNlbnRhdGlvbnMgCi0gKiBvciB3YXJyYW50aWVzLCBleHByZXNzIG9yIGltcGxpZWQsIHJlZ2FyZGluZyB0aGVzZSBtYXRlcmlhbHMsIGluY2x1ZGluZywgCi0gKiB3aXRob3V0IGxpbWl0YXRpb24sIGFueSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgCi0gKiBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2Ugb3Igbm9uLWluZnJpbmdlbWVudCBvZiBhbnkgaW50ZWxsZWN0dWFsIHByb3BlcnR5LiAKLSAqIEtocm9ub3MgR3JvdXAgbWFrZXMgbm8sIGFuZCBleHByZXNzbHkgZGlzY2xhaW1zIGFueSwgd2FycmFudGllcywgZXhwcmVzcyAKLSAqIG9yIGltcGxpZWQsIHJlZ2FyZGluZyB0aGUgY29ycmVjdG5lc3MsIGFjY3VyYWN5LCBjb21wbGV0ZW5lc3MsIHRpbWVsaW5lc3MsIAotICogYW5kIHJlbGlhYmlsaXR5IG9mIHRoZXNlIG1hdGVyaWFscy4gCi0gKgotICogVW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyB3aWxsIHRoZSBLaHJvbm9zIEdyb3VwLCBvciBhbnkgb2YgaXRzIFByb21vdGVycywgCi0gKiBDb250cmlidXRvcnMgb3IgTWVtYmVycyBvciB0aGVpciByZXNwZWN0aXZlIHBhcnRuZXJzLCBvZmZpY2VycywgZGlyZWN0b3JzLCAKLSAqIGVtcGxveWVlcywgYWdlbnRzIG9yIHJlcHJlc2VudGF0aXZlcyBiZSBsaWFibGUgZm9yIGFueSBkYW1hZ2VzLCB3aGV0aGVyIAotICogZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgZm9yIGxvc3QgcmV2ZW51ZXMsIAotICogbG9zdCBwcm9maXRzLCBvciBvdGhlcndpc2UsIGFyaXNpbmcgZnJvbSBvciBpbiBjb25uZWN0aW9uIHdpdGggdGhlc2UgCi0gKiBtYXRlcmlhbHMuCi0gKiAKLSAqIEtocm9ub3MgYW5kIE9wZW5NQVggYXJlIHRyYWRlbWFya3Mgb2YgdGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKLSAqCi0gKi8KLSAgCi0jaWZuZGVmIF9PTVhUWVBFU19IXwotI2RlZmluZSBfT01YVFlQRVNfSF8KLQotI2luY2x1ZGUgPGxpbWl0cy5oPiAKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2RlZmluZSBPTVhfSU4KLSNkZWZpbmUgT01YX09VVAotI2RlZmluZSBPTVhfSU5PVVQKLQotCi10eXBlZGVmIGVudW0gewotICAgIAotICAgIC8qIE1hbmRhdG9yeSByZXR1cm4gY29kZXMgLSB1c2UgY2FzZXMgYXJlIGV4cGxpY2l0bHkgZGVzY3JpYmVkIGZvciBlYWNoIGZ1bmN0aW9uICovCi0gICAgT01YX1N0c19Ob0VyciAgICAgICAgICAgICAgICAgICAgPSAgMCwgICAgLyogTm8gZXJyb3IsIHRoZSBmdW5jdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5ICovCi0gICAgT01YX1N0c19FcnIgICAgICAgICAgICAgICAgICAgICAgPSAtMiwgICAgLyogVW5rbm93bi91bnNwZWNpZmllZCBlcnJvciAqLyAgICAKLSAgICBPTVhfU3RzX0ludmFsaWRCaXRzdHJlYW1WYWxFcnIgICA9IC0xODIsICAvKiBJbnZhbGlkIHZhbHVlIGRldGVjdGVkIGR1cmluZyBiaXRzdHJlYW0gcHJvY2Vzc2luZyAqLyAgICAKLSAgICBPTVhfU3RzX01lbUFsbG9jRXJyICAgICAgICAgICAgICA9IC05LCAgICAvKiBOb3QgZW5vdWdoIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBvcGVyYXRpb24gKi8KLSAgICBPTVhfU3RzQUNBQUNfR2FpbkN0ckVyciAgICAJICAgICA9IC0xNTksICAvKiBBQUM6IFVuc3VwcG9ydGVkIGdhaW4gY29udHJvbCBkYXRhIGRldGVjdGVkICovCi0gICAgT01YX1N0c0FDQUFDX1ByZ051bUVyciAgICAgICAgICAgPSAtMTY3LCAgLyogQUFDOiBJbnZhbGlkIG51bWJlciBvZiBlbGVtZW50cyBmb3Igb25lIHByb2dyYW0gICAqLwotICAgIE9NWF9TdHNBQ0FBQ19Db2VmVmFsRXJyICAgICAgICAgID0gLTE2MywgIC8qIEFBQzogSW52YWxpZCBxdWFudGl6ZWQgY29lZmZpY2llbnQgdmFsdWUgICAgICAgICAgKi8gICAgIAotICAgIE9NWF9TdHNBQ0FBQ19NYXhTZmJFcnIgICAgICAgICAgID0gLTE2MiwgIC8qIEFBQzogSW52YWxpZCBtYXhTZmIgdmFsdWUgaW4gcmVsYXRpb24gdG8gbnVtU3diICovICAgIAotCU9NWF9TdHNBQ0FBQ19QbHNEYXRhRXJyCQkgICAgID0gLTE2MCwgIC8qIEFBQzogcHVsc2UgZXNjYXBlIHNlcXVlbmNlIGRhdGEgZXJyb3IgKi8KLQotICAgIC8qIE9wdGlvbmFsIHJldHVybiBjb2RlcyAtIHVzZSBjYXNlcyBhcmUgZXhwbGljaXRseSBkZXNjcmliZWQgZm9yIGVhY2ggZnVuY3Rpb24qLwotICAgIE9NWF9TdHNfQmFkQXJnRXJyICAgICAgICAgICAgICAgID0gLTUsICAgIC8qIEJhZCBBcmd1bWVudHMgKi8KLQotICAgIE9NWF9TdHNBQ0FBQ19UbnNOdW1GaWx0RXJyICAgICAgID0gLTE1NywgIC8qIEFBQzogSW52YWxpZCBudW1iZXIgb2YgVE5TIGZpbHRlcnMgICovCi0gICAgT01YX1N0c0FDQUFDX1Ruc0xlbkVyciAgICAgICAgICAgPSAtMTU2LCAgLyogQUFDOiBJbnZhbGlkIFROUyByZWdpb24gbGVuZ3RoICAqLyAgIAotICAgIE9NWF9TdHNBQ0FBQ19UbnNPcmRlckVyciAgICAgICAgID0gLTE1NSwgIC8qIEFBQzogSW52YWxpZCBvcmRlciBvZiBUTlMgZmlsdGVyICAqLyAgICAgICAgICAgICAgICAgIAotICAgIE9NWF9TdHNBQ0FBQ19UbnNDb2VmUmVzRXJyICAgICAgID0gLTE1NCwgIC8qIEFBQzogSW52YWxpZCBiaXQtcmVzb2x1dGlvbiBmb3IgVE5TIGZpbHRlciBjb2VmZmljaWVudHMgICovCi0gICAgT01YX1N0c0FDQUFDX1Ruc0NvZWZFcnIgICAgICAgICAgPSAtMTUzLCAgLyogQUFDOiBJbnZhbGlkIFROUyBmaWx0ZXIgY29lZmZpY2llbnRzICAqLyAgICAgICAgICAgICAgICAgIAotICAgIE9NWF9TdHNBQ0FBQ19UbnNEaXJlY3RFcnIgICAgICAgID0gLTE1MiwgIC8qIEFBQzogSW52YWxpZCBUTlMgZmlsdGVyIGRpcmVjdGlvbiAgKi8gIAotCi0gICAgT01YX1N0c0lDSlBfSlBFR01hcmtlckVyciAgICAgICAgPSAtMTgzLCAgLyogSlBFRyBtYXJrZXIgZW5jb3VudGVyZWQgd2l0aGluIGFuIGVudHJvcHktY29kZWQgYmxvY2s7ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSHVmZm1hbiBkZWNvZGluZyBvcGVyYXRpb24gdGVybWluYXRlZCBlYXJseS4gICAgICAgICAgICovCi0gICAgT01YX1N0c0lDSlBfSlBFR01hcmtlciAgICAgICAgICAgPSAtMTgxLCAgLyogSlBFRyBtYXJrZXIgZW5jb3VudGVyZWQ7IEh1ZmZtYW4gZGVjb2RpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGVyYXRpb24gdGVybWluYXRlZCBlYXJseS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBPTVhfU3RzSVBQUF9Db250ZXh0TWF0Y2hFcnIgICAgICA9IC0xNywgICAvKiBDb250ZXh0IHBhcmFtZXRlciBkb2Vzbid0IG1hdGNoIHRvIHRoZSBvcGVyYXRpb24gKi8KLQotICAgIE9NWF9TdHNTUF9FdmVuTWVkaWFuTWFza1NpemVFcnIgID0gLTE4MCwgIC8qIEV2ZW4gc2l6ZSBvZiB0aGUgTWVkaWFuIEZpbHRlciBtYXNrIHdhcyByZXBsYWNlZCBieSB0aGUgb2RkIG9uZSAqLwotCi0gICAgT01YX1N0c19NYXhpbXVtRW51bWVyYXRpb24gICAgICAgPSBJTlRfTUFYICAvKlBsYWNlaG9sZGVyLCBmb3JjZXMgZW51bSBvZiBzaXplIE9NWF9JTlQqLwotICAgIAotIH0gT01YUmVzdWx0OyAgICAgICAgICAvKiogUmV0dXJuIHZhbHVlIG9yIGVycm9yIHZhbHVlIHJldHVybmVkIGZyb20gYSBmdW5jdGlvbi4gSWRlbnRpY2FsIHRvIE9NWF9JTlQgKi8KLQotIAotLyogT01YX1U4ICovCi10eXBlZGVmIHVpbnQ4X3QgT01YX1U4OwotIAotLyogT01YX1M4ICovCi10eXBlZGVmIGludDhfdCBPTVhfUzg7Ci0gCi0vKiBPTVhfVTE2ICovCi10eXBlZGVmIHVpbnQxNl90IE9NWF9VMTY7Ci0KLS8qIE9NWF9TMTYgKi8KLXR5cGVkZWYgaW50MTZfdCBPTVhfUzE2OwotCi0vKiBPTVhfVTMyICovCi10eXBlZGVmIHVpbnQzMl90IE9NWF9VMzI7Ci0KLS8qIE9NWF9TMzIgKi8KLXR5cGVkZWYgaW50MzJfdCBPTVhfUzMyOwotCi0vKiBPTVhfVTY0ICYgT01YX1M2NCAqLwotI2lmIGRlZmluZWQoIF9XSU4zMiApIHx8IGRlZmluZWQgKCBfV0lONjQgKQotICAgIHR5cGVkZWYgX19pbnQ2NCBPTVhfUzY0OyAvKiogU2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCi0gICAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IE9NWF9VNjQ7IC8qKiBVbnNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLwotICAgICNkZWZpbmUgT01YX01JTl9TNjQJCQkoMHg4MDAwMDAwMDAwMDAwMDAwaTY0KQotICAgICNkZWZpbmUgT01YX01JTl9VNjQJCQkoMHgwMDAwMDAwMDAwMDAwMDAwaTY0KQotICAgICNkZWZpbmUgT01YX01BWF9TNjQJCQkoMHg3RkZGRkZGRkZGRkZGRkZGaTY0KQotICAgICNkZWZpbmUgT01YX01BWF9VNjQJCQkoMHhGRkZGRkZGRkZGRkZGRkZGaTY0KQotI2Vsc2UKLSAgICB0eXBlZGVmIGludDY0X3QgT01YX1M2NDsgLyoqIFNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLwotICAgIHR5cGVkZWYgdWludDY0X3QgT01YX1U2NDsgLyoqIFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCi0gICAgI2RlZmluZSBPTVhfTUlOX1M2NAkJCSgweDgwMDAwMDAwMDAwMDAwMDBMTCkKLSAgICAjZGVmaW5lIE9NWF9NSU5fVTY0CQkJKDB4MDAwMDAwMDAwMDAwMDAwMExMKQotICAgICNkZWZpbmUgT01YX01BWF9TNjQJCQkoMHg3RkZGRkZGRkZGRkZGRkZGTEwpCi0gICAgI2RlZmluZSBPTVhfTUFYX1U2NAkJCSgweEZGRkZGRkZGRkZGRkZGRkZMTCkKLSNlbmRpZgotCi0vKiBPTVhfU0M4ICovCi10eXBlZGVmIHN0cnVjdAotewotICBPTVhfUzggUmU7IC8qKiBSZWFsIHBhcnQgKi8KLSAgT01YX1M4IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCi0JCi19IE9NWF9TQzg7IC8qKiBTaWduZWQgOC1iaXQgY29tcGxleCBudW1iZXIgKi8KLQotCi0vKiBPTVhfU0MxNiAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgT01YX1MxNiBSZTsgLyoqIFJlYWwgcGFydCAqLwotICBPTVhfUzE2IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCi0JCi19IE9NWF9TQzE2OyAvKiogU2lnbmVkIDE2LWJpdCBjb21wbGV4IG51bWJlciAqLwotCi0KLS8qIE9NWF9TQzMyICovCi10eXBlZGVmIHN0cnVjdAotewotICBPTVhfUzMyIFJlOyAvKiogUmVhbCBwYXJ0ICovCi0gIE9NWF9TMzIgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKLQkKLX0gT01YX1NDMzI7IC8qKiBTaWduZWQgMzItYml0IGNvbXBsZXggbnVtYmVyICovCi0KLQotLyogT01YX1NDNjQgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE9NWF9TNjQgUmU7IC8qKiBSZWFsIHBhcnQgKi8KLSAgT01YX1M2NCBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQotCQotfSBPTVhfU0M2NDsgLyoqIFNpZ25lZCA2NC1iaXQgY29tcGxleCBudW1iZXIgKi8KLQotCi0vKiBPTVhfRjMyICovCi10eXBlZGVmIGZsb2F0IE9NWF9GMzI7IC8qKiBTaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50LElFRUUgNzU0ICovCi0KLQotLyogT01YX0Y2NCAqLwotdHlwZWRlZiBkb3VibGUgT01YX0Y2NDsgLyoqIERvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQsSUVFRSA3NTQgKi8KLQotCi0vKiBPTVhfSU5UICovCi10eXBlZGVmIGludCBPTVhfSU5UOyAvKiogc2lnbmVkIGludGVnZXIgY29ycmVzcG9uZGluZyB0byBtYWNoaW5lIHdvcmQgbGVuZ3RoLCBoYXMgbWF4aW11bSBzaWduZWQgdmFsdWUgSU5UX01BWCovCi0KLQotI2RlZmluZSBPTVhfTUlOX1M4ICAJICAgCSgtMTI4KQotI2RlZmluZSBPTVhfTUlOX1U4ICAJCTAKLSNkZWZpbmUgT01YX01JTl9TMTYJCSAJKC0zMjc2OCkKLSNkZWZpbmUgT01YX01JTl9VMTYJCQkwCi0jZGVmaW5lIE9NWF9NSU5fUzMyCQkJKC0yMTQ3NDgzNjQ3LTEpCi0jZGVmaW5lIE9NWF9NSU5fVTMyCQkJMAotCi0jZGVmaW5lIE9NWF9NQVhfUzgJCQkoMTI3KQotI2RlZmluZSBPTVhfTUFYX1U4CQkJKDI1NSkKLSNkZWZpbmUgT01YX01BWF9TMTYJCQkoMzI3NjcpCi0jZGVmaW5lIE9NWF9NQVhfVTE2CQkJKDB4RkZGRikKLSNkZWZpbmUgT01YX01BWF9TMzIJCQkoMjE0NzQ4MzY0NykKLSNkZWZpbmUgT01YX01BWF9VMzIJCQkoMHhGRkZGRkZGRikKLQotdHlwZWRlZiB2b2lkIE9NWFZvaWQ7Ci0KLSNpZm5kZWYgTlVMTAotI2RlZmluZSBOVUxMICgodm9pZCopMCkKLSNlbmRpZgotCi0vKiogRGVmaW5lcyB0aGUgZ2VvbWV0cmljIHBvc2l0aW9uIGFuZCBzaXplIG9mIGEgcmVjdGFuZ2xlLCAKLSAgKiB3aGVyZSB4LHkgZGVmaW5lcyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHRvcCBsZWZ0IGNvcm5lcgotICAqIG9mIHRoZSByZWN0YW5nbGUsIHdpdGggZGltZW5zaW9ucyB3aWR0aCBpbiB0aGUgeC1kaXJlY3Rpb24gCi0gICogYW5kIGhlaWdodCBpbiB0aGUgeS1kaXJlY3Rpb24gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQlPTVhfSU5UIHg7ICAgICAgLyoqIHgtY29vcmRpbmF0ZSBvZiB0b3AgbGVmdCBjb3JuZXIgb2YgcmVjdGFuZ2xlICovCi0JT01YX0lOVCB5OyAgICAgIC8qKiB5LWNvb3JkaW5hdGUgb2YgdG9wIGxlZnQgY29ybmVyIG9mIHJlY3RhbmdsZSAqLwotCU9NWF9JTlQgd2lkdGg7ICAvKiogV2lkdGggaW4gdGhlIHgtZGlyZWN0aW9uLiAqLwotCU9NWF9JTlQgaGVpZ2h0OyAvKiogSGVpZ2h0IGluIHRoZSB5LWRpcmVjdGlvbi4gKi8KLX1PTVhSZWN0OwotCi0KLS8qKiBEZWZpbmVzIHRoZSBnZW9tZXRyaWMgcG9zaXRpb24gb2YgYSBwb2ludCwgKi8KLXR5cGVkZWYgc3RydWN0IAotewotIE9NWF9JTlQgeDsgLyoqIHgtY29vcmRpbmF0ZSAqLwotIE9NWF9JTlQgeTsJLyoqIHktY29vcmRpbmF0ZSAqLwotCQotfSBPTVhQb2ludDsKLQotCi0vKiogRGVmaW5lcyB0aGUgZGltZW5zaW9ucyBvZiBhIHJlY3RhbmdsZSwgb3IgcmVnaW9uIG9mIGludGVyZXN0IGluIGFuIGltYWdlICovCi10eXBlZGVmIHN0cnVjdCAKLXsKLSBPTVhfSU5UIHdpZHRoOyAgLyoqIFdpZHRoIG9mIHRoZSByZWN0YW5nbGUsIGluIHRoZSB4LWRpcmVjdGlvbiAqLwotIE9NWF9JTlQgaGVpZ2h0OyAvKiogSGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUsIGluIHRoZSB5LWRpcmVjdGlvbiAqLwotCQotfSBPTVhTaXplOwotCi0jZW5kaWYgLyogX09NWFRZUEVTX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvYXBpL29teHR5cGVzX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvb214dHlwZXNfcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDFhMDM3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9hcGkvb214dHlwZXNfcy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teHR5cGVzX3MuaAotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLTsvLyBNYW5kYXRvcnkgcmV0dXJuIGNvZGVzIC0gdXNlIGNhc2VzIGFyZSBleHBsaWNpdGx5IGRlc2NyaWJlZCBmb3IgZWFjaCBmdW5jdGlvbiAKLU9NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICAgICAgIEVRVSAgMCAgICA7Ly8gTm8gZXJyb3IgdGhlIGZ1bmN0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgCi1PTVhfU3RzX0VyciAgICAgICAgICAgICAgICAgICAgICBFUVUgLTIgICAgOy8vIFVua25vd24vdW5zcGVjaWZpZWQgZXJyb3IgICAgIAotT01YX1N0c19JbnZhbGlkQml0c3RyZWFtVmFsRXJyICAgRVFVIC0xODIgIDsvLyBJbnZhbGlkIHZhbHVlIGRldGVjdGVkIGR1cmluZyBiaXRzdHJlYW0gcHJvY2Vzc2luZyAgICAgCi1PTVhfU3RzX01lbUFsbG9jRXJyICAgICAgICAgICAgICBFUVUgLTkgICAgOy8vIE5vdCBlbm91Z2ggbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIG9wZXJhdGlvbiAKLU9NWF9TdHNBQ0FBQ19HYWluQ3RyRXJyICAgIAkgICAgIEVRVSAtMTU5ICA7Ly8gQUFDOiBVbnN1cHBvcnRlZCBnYWluIGNvbnRyb2wgZGF0YSBkZXRlY3RlZCAKLU9NWF9TdHNBQ0FBQ19QcmdOdW1FcnIgICAgICAgICAgIEVRVSAtMTY3ICA7Ly8gQUFDOiBJbnZhbGlkIG51bWJlciBvZiBlbGVtZW50cyBmb3Igb25lIHByb2dyYW0gICAKLU9NWF9TdHNBQ0FBQ19Db2VmVmFsRXJyICAgICAgICAgIEVRVSAtMTYzICA7Ly8gQUFDOiBJbnZhbGlkIHF1YW50aXplZCBjb2VmZmljaWVudCB2YWx1ZSAgICAgICAgICAgICAgIAotT01YX1N0c0FDQUFDX01heFNmYkVyciAgICAgICAgICAgRVFVIC0xNjIgIDsvLyBBQUM6IEludmFsaWQgbWF4U2ZiIHZhbHVlIGluIHJlbGF0aW9uIHRvIG51bVN3YiAgICAgCi1PTVhfU3RzQUNBQUNfUGxzRGF0YUVycgkJICAgICBFUVUgLTE2MCAgOy8vIEFBQzogcHVsc2UgZXNjYXBlIHNlcXVlbmNlIGRhdGEgZXJyb3IgCi0KLTsvLyBPcHRpb25hbCByZXR1cm4gY29kZXMgLSB1c2UgY2FzZXMgYXJlIGV4cGxpY2l0bHkgZGVzY3JpYmVkIGZvciBlYWNoIGZ1bmN0aW9uCi1PTVhfU3RzX0JhZEFyZ0VyciAgICAgICAgICAgICAgICBFUVUgLTUgICAgOy8vIEJhZCBBcmd1bWVudHMgCi0KLU9NWF9TdHNBQ0FBQ19UbnNOdW1GaWx0RXJyICAgICAgIEVRVSAtMTU3ICA7Ly8gQUFDOiBJbnZhbGlkIG51bWJlciBvZiBUTlMgZmlsdGVycyAgCi1PTVhfU3RzQUNBQUNfVG5zTGVuRXJyICAgICAgICAgICBFUVUgLTE1NiAgOy8vIEFBQzogSW52YWxpZCBUTlMgcmVnaW9uIGxlbmd0aCAgICAgCi1PTVhfU3RzQUNBQUNfVG5zT3JkZXJFcnIgICAgICAgICBFUVUgLTE1NSAgOy8vIEFBQzogSW52YWxpZCBvcmRlciBvZiBUTlMgZmlsdGVyICAgICAgICAgICAgICAgICAgICAKLU9NWF9TdHNBQ0FBQ19UbnNDb2VmUmVzRXJyICAgICAgIEVRVSAtMTU0ICA7Ly8gQUFDOiBJbnZhbGlkIGJpdC1yZXNvbHV0aW9uIGZvciBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cyAgCi1PTVhfU3RzQUNBQUNfVG5zQ29lZkVyciAgICAgICAgICBFUVUgLTE1MyAgOy8vIEFBQzogSW52YWxpZCBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgCi1PTVhfU3RzQUNBQUNfVG5zRGlyZWN0RXJyICAgICAgICBFUVUgLTE1MiAgOy8vIEFBQzogSW52YWxpZCBUTlMgZmlsdGVyIGRpcmVjdGlvbiAgICAKLQotT01YX1N0c0lDSlBfSlBFR01hcmtlckVyciAgICAgICAgRVFVIC0xODMgIDsvLyBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZCB3aXRoaW4gYW4gZW50cm9weS1jb2RlZCBibG9jazsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBIdWZmbWFuIGRlY29kaW5nIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgCi1PTVhfU3RzSUNKUF9KUEVHTWFya2VyICAgICAgICAgICBFUVUgLTE4MSAgOy8vIEpQRUcgbWFya2VyIGVuY291bnRlcmVkOyBIdWZmbWFuIGRlY29kaW5nIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gb3BlcmF0aW9uIHRlcm1pbmF0ZWQgZWFybHkuICAgICAgICAgICAgICAgICAgICAgICAgIAotT01YX1N0c0lQUFBfQ29udGV4dE1hdGNoRXJyICAgICAgRVFVIC0xNyAgIDsvLyBDb250ZXh0IHBhcmFtZXRlciBkb2Vzbid0IG1hdGNoIHRvIHRoZSBvcGVyYXRpb24gCi0KLU9NWF9TdHNTUF9FdmVuTWVkaWFuTWFza1NpemVFcnIgIEVRVSAtMTgwICA7Ly8gRXZlbiBzaXplIG9mIHRoZSBNZWRpYW4gRmlsdGVyIG1hc2sgd2FzIHJlcGxhY2VkIGJ5IHRoZSBvZGQgb25lIAotCi1PTVhfU3RzX01heGltdW1FbnVtZXJhdGlvbiAgICAgICBFUVUgMHg3RkZGRkZGRgotCi0KLQotT01YX01JTl9TOCAgICAgIEVRVSAJICAgCSgtMTI4KQotT01YX01JTl9VOCAgCUVRVSAgICAgCTAKLU9NWF9NSU5fUzE2CQlFUVUgICAgICAJKC0zMjc2OCkKLU9NWF9NSU5fVTE2CQlFUVUJICAgICAgICAwCi0KLQotT01YX01JTl9TMzIJCUVRVQkoLTIxNDc0ODM2NDctMSkKLU9NWF9NSU5fVTMyCQlFUVUJMAotCi1PTVhfTUFYX1M4CQlFUVUJKDEyNykKLU9NWF9NQVhfVTgJCUVRVQkoMjU1KQotT01YX01BWF9TMTYJCUVRVQkoMzI3NjcpCi1PTVhfTUFYX1UxNgkJRVFVCSgweEZGRkYpCi1PTVhfTUFYX1MzMgkJRVFVCSgyMTQ3NDgzNjQ3KQotT01YX01BWF9VMzIJCUVRVQkoMHhGRkZGRkZGRikKLQotT01YX1ZDX1VQUEVSICAgIEVRVSAweDEgICAgICAgICAgICAgICAgIDsvLyBVc2VkIGJ5IHRoZSBQcmVkaWN0SW50cmEgZnVuY3Rpb25zICAgCi1PTVhfVkNfTEVGVCAgICAgRVFVIDB4MiAgICAgICAgICAgICAgICAgOy8vIFVzZWQgYnkgdGhlIFByZWRpY3RJbnRyYSBmdW5jdGlvbnMgCi1PTVhfVkNfVVBQRVJfUklHSFQgICAgRVFVIDB4NDAgICAgICAgICAgOy8vIFVzZWQgYnkgdGhlIFByZWRpY3RJbnRyYSBmdW5jdGlvbnMgICAKLQotTlVMTCAgICBFUVUgMAotCi07Ly8gU3RydWN0dXJlcwotCi0gICAgSU5DTFVERSAgICAgYXJtQ09NTV9zLmgKLQotICAgIE1fU1RSVUNUICAgIE9NWFBvaW50Ci0gICAgTV9GSUVMRCAgICAgeCwgNAotICAgIE1fRklFTEQgICAgIHksIDQKLSAgICBNX0VORFNUUlVDVAotCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2J1aWxkX3ZjLnBsIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL2J1aWxkX3ZjLnBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZDY3MmIzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9idWlsZF92Yy5wbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0jIS91c3IvYmluL3BlcmwKLSMKLSMgCi0jIEZpbGUgTmFtZTogIGJ1aWxkX3ZjLnBsCi0jIE9wZW5NQVggREw6IHYxLjAuMgotIyBSZXZpc2lvbjogICA5NjQxCi0jIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0jIAotIyAKLSMgCi0jCi0jIFRoaXMgZmlsZSBidWlsZHMgdGhlIE9wZW5NQVggREwgdmMgZG9tYWluIGxpYnJhcnkgb214VkMuby4KLSMKLQotdXNlIEZpbGU6OlNwZWM7Ci11c2Ugc3RyaWN0OwotCi1teSAoJENDLCAkQ0NfT1BUUywgJEFTLCAkQVNfT1BUUywgJExJQiwgJExJQl9PUFRTLCAkTElCX1RZUEUpOwotCi0kQ0MgICAgICAgPSAnYXJtY2MnOwotJENDX09QVFMgID0gJy0tbm9fdW5hbGlnbmVkX2FjY2VzcyAtLWNwdSBBUk0xMTM2Si1TIC1jJzsKLSRBUyAgICAgICA9ICdhcm1hc20nOwotJEFTX09QVFMgID0gJy0tbm9fdW5hbGlnbmVkX2FjY2VzcyAtLWNwdSBBUk0xMTM2Si1TJzsKLSMgJExJQiAgICAgID0gJ2FybWxpbmsnOwotIyAkTElCX09QVFMgPSAnLS1wYXJ0aWFsIC1vJzsKLSMgJExJQl9UWVBFID0gJy5vJzsKLSRMSUIgICAgICA9ICdhcm1hcic7Ci0kTElCX09QVFMgPSAnLS1jcmVhdGUgLXInOwotJExJQl9UWVBFID0gJy5hJzsKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1teSAoQGhlYWRlcmxpc3QsIEBmaWxlbGlzdCwgJGhkLCAkZmlsZSwgJG9maWxlLCAkY29tbWFuZCwgJG9iamxpc3QsICRsaWJmaWxlLCAkaCk7Ci0KLSMgRGVmaW5lIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgaW5jbHVkZWQgaGVhZGVyIGZpbGVzLgotQGhlYWRlcmxpc3QgPSBxdyhhcGkgdmMvYXBpIHZjL200cDIvYXBpIHZjL200cDEwL2FwaSk7Ci0KLSMgRGVmaW5lIHRoZSBsaXN0IG9mIHNvdXJjZSBmaWxlcyB0byBjb21waWxlLgotb3BlbihGSUxFUywgJzxmaWxlbGlzdF92Yy50eHQnKSBvciBkaWUoIkNhbid0IG9wZW4gc291cmNlIGZpbGUgbGlzdFxuIik7Ci1AZmlsZWxpc3QgPSA8RklMRVM+OwotY2xvc2UoRklMRVMpOwotCi0jIEZpeCB0aGUgZmlsZSBzZXBhcmF0b3JzIGluIHRoZSBoZWFkZXIgcGF0aHMKLWZvcmVhY2ggJGggKEBoZWFkZXJsaXN0KQotewotICAgICAgICAkaCA9IEZpbGU6OlNwZWMtPmNhbm9ucGF0aCgkaCk7Ci19Ci0KLSMgQ3JlYXRlIHRoZSBpbmNsdWRlIHBhdGggdG8gYmUgcGFzc2VkIHRvIHRoZSBjb21waWxlcgotJGhkID0gJy1JJyAuIGpvaW4oJyAtSScsIEBoZWFkZXJsaXN0KTsKLQotIyBDcmVhdGUgdGhlIGJ1aWxkIGRpcmVjdG9yaWVzICIvbGliLyIgYW5kICIvb2JqLyIgKGlmIHRoZXkgYXJlIG5vdCB0aGVyZSBhbHJlYWR5KQotbWtkaXIgIm9iaiIsIDA3NzcgaWYgKCEgLWQgIm9iaiIpOwotbWtkaXIgImxpYiIsIDA3NzcgaWYgKCEgLWQgImxpYiIpOwotCi0kb2JqbGlzdCA9ICcnOwotCi0jIENvbXBpbGUgZWFjaCBmaWxlCi1mb3JlYWNoICRmaWxlIChAZmlsZWxpc3QpCi17Ci0JbXkgJGY7Ci0JbXkgJGJhc2U7Ci0JbXkgJGV4dDsKLQlteSAkb2JqZmlsZTsKLQotCWNob21wKCRmaWxlKTsKLQkkZmlsZSA9IEZpbGU6OlNwZWMtPmNhbm9ucGF0aCgkZmlsZSk7Ci0KLQkodW5kZWYsIHVuZGVmLCAkZikgPSBGaWxlOjpTcGVjLT5zcGxpdHBhdGgoJGZpbGUpOwotCWlmKCgkYmFzZSwgJGV4dCkgPSAkZiA9fiAvKC4rKVwuKFx3KSQvKQotCXsKLQkJJG9iamZpbGUgPSBGaWxlOjpTcGVjLT5jYXRmaWxlKCdvYmonLCAkYmFzZS4nLm8nKTsKLQotCQlpZigkZXh0IGVxICdjJykKLQkJewotCQkJJG9iamxpc3QgLj0gIiRvYmpmaWxlICI7Ci0JCQkkY29tbWFuZCA9ICRDQy4nICcuJENDX09QVFMuJyAnLiRoZC4nIC1vICcuJG9iamZpbGUuJyAnLiRmaWxlOwotCQkJcHJpbnQgIiRjb21tYW5kXG4iOwotCQkJc3lzdGVtKCRjb21tYW5kKTsKLQkJfQotCQllbHNpZigkZXh0IGVxICdzJykKLQkJewotCQkJJG9iamxpc3QgLj0gIiRvYmpmaWxlICI7Ci0JCQkkY29tbWFuZCA9ICRBUy4nICcuJEFTX09QVFMuJyAnLiRoZC4nIC1vICcuJG9iamZpbGUuJyAnLiRmaWxlOwotCQkJcHJpbnQgIiRjb21tYW5kXG4iOwotCQkJc3lzdGVtKCRjb21tYW5kKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXByaW50ICJJZ25vcmluZyBmaWxlOiAkZlxuIjsKLQkJfQotCX0KLQllbHNlCi0JewotCQlkaWUgIk5vIGZpbGUgZXh0ZW5zaW9uIGZvdW5kOiAkZlxuIjsKLQl9Ci19Ci0KLSMgRG8gdGhlIGZpbmFsIGxpbmsgc3RhZ2UgdG8gY3JlYXRlIHRoZSBsaWJyYXJpZXMuCi0kbGliZmlsZSA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoJ2xpYicsICdvbXhWQycuJExJQl9UWVBFKTsKLSRjb21tYW5kID0gJExJQi4nICcuJExJQl9PUFRTLicgJy4kbGliZmlsZS4nICcuJG9iamxpc3Q7Ci1wcmludCAiJGNvbW1hbmRcbiI7Ci0oc3lzdGVtKCRjb21tYW5kKSA9PSAwKSBhbmQgcHJpbnQgIkJ1aWxkIHN1Y2Nlc3NmdWxcbiI7Ci0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9maWxlbGlzdF92Yy50eHQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvZmlsZWxpc3RfdmMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjE2MjNmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9maWxlbGlzdF92Yy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0uL2FwaS9hcm1DT01NLmgKLS4vYXBpL2FybUNPTU1fQml0RGVjX3MuaAotLi9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaAotLi9hcGkvYXJtQ09NTV9JRENUX3MuaAotLi9hcGkvYXJtQ09NTV9JRENUVGFibGUuaAotLi9hcGkvYXJtQ09NTV9NYXNrVGFibGUuaAotLi9hcGkvYXJtQ09NTV9zLmgKLS4vYXBpL2FybUNPTU1fVmVyc2lvbi5oCi0uL2FwaS9hcm1PTVhfUmVsZWFzZVZlcnNpb24uaAotLi9hcGkvb214dHlwZXMuaAotLi9hcGkvb214dHlwZXNfcy5oCi0uL3NyYy9hcm1DT01NX0lEQ1RUYWJsZS5jCi0uL3NyYy9hcm1DT01NX01hc2tUYWJsZS5jCi0uL3ZjL2FwaS9hcm1WQy5oCi0uL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oCi0uL3ZjL2FwaS9vbXhWQy5oCi0uL3ZjL2FwaS9vbXhWQ19zLmgKLS4vdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNl9zLnMKLS4vdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDhfcy5zCi0uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JX3MucwotLi92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLnMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMKLS4vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCi0uL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NsaXA4X3MucwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXJfcy5zCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkX3MucwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9ja19zLnMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9zLnMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSV9zLnMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMKLS4vdmMvc3JjL2FybVZDX1ZlcnNpb24uYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9zcmMvYXJtQ09NTS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZGJmNDEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybUNPTU0uYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlZmluZXMgQ29tbW9uIEFQSXMgdXNlZCBhY3Jvc3MgT3Blbk1BWCBBUEkncwotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgIC8qIE1pc2NlbGxhbmVvdXMgQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1MxNgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQgYWZ0ZXIgcm91bmRpbmcKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2IGZvcm1hdAotICoKLSAqLwotCi1PTVhfUzE2IGFybVJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSkKLXsKLSAgICBpZiAoVmFsdWUgPiAwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfUzE2KShWYWx1ZSArIC41KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfUzE2KShWYWx1ZSAtIC41KTsKLSAgICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1MzMgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBpbnQgYWZ0ZXIgcm91bmRpbmcKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzMyIGZvcm1hdAotICoKLSAqLwotCi1PTVhfUzMyIGFybVJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSkKLXsKLSAgICBpZiAoVmFsdWUgPiAwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfUzMyKShWYWx1ZSArIC41KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfUzMyKShWYWx1ZSAtIC41KTsKLSAgICB9Ci19Ci0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9TMTYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1MxNiBhcm1TYXRSb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgaWYgKFZhbHVlID4gMCkKLSAgICB7Ci0gICAgICAgIFZhbHVlICs9IDAuNTsKLSAgICAgICAgCi0gICAgICAgIGlmKFZhbHVlID4gKE9NWF9TMTYpT01YX01BWF9TMTYgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01BWF9TMTY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgVmFsdWUgLT0gMC41OwotCi0gICAgICAgIGlmKFZhbHVlIDwgKE9NWF9TMTYpT01YX01JTl9TMTYgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01JTl9TMTY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE9NWF9TMTYpVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1MzMgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzMyIGZvcm1hdAotICoKLSAqLwotCi1PTVhfUzMyIGFybVNhdFJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSkKLXsKLSAgICBpZiAoVmFsdWUgPiAwKQotICAgIHsKLSAgICAgICAgVmFsdWUgKz0gMC41OwotICAgICAgICAKLSAgICAgICAgaWYoVmFsdWUgPiAoT01YX1MzMilPTVhfTUFYX1MzMiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilPTVhfTUFYX1MzMjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilWYWx1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBWYWx1ZSAtPSAwLjU7Ci0KLSAgICAgICAgaWYoVmFsdWUgPCAoT01YX1MzMilPTVhfTUlOX1MzMiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilPTVhfTUlOX1MzMjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoT01YX1MzMilWYWx1ZTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvVTE2Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHVuc2lnbmVkIHNob3J0IGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9VMTYgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9VMTYgYXJtU2F0Um91bmRGbG9hdFRvVTE2IChPTVhfRjY0IFZhbHVlKQotewotICAgIFZhbHVlICs9IDAuNTsKLSAgICAKLSAgICBpZihWYWx1ZSA+IChPTVhfVTE2KU9NWF9NQVhfVTE2ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1UxNilPTVhfTUFYX1UxNjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfVTE2KVZhbHVlOwotICAgIH0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvVTMyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHVuc2lnbmVkIGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9VMzIgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9VMzIgYXJtU2F0Um91bmRGbG9hdFRvVTMyIChPTVhfRjY0IFZhbHVlKQotewotICAgIFZhbHVlICs9IDAuNTsKLSAgICAKLSAgICBpZihWYWx1ZSA+IChPTVhfVTMyKU9NWF9NQVhfVTMyICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1UzMilPTVhfTUFYX1UzMjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfVTMyKVZhbHVlOwotICAgIH0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzY0Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIDY0IGJpdCBpbnQgYWZ0ZXIgcm91bmRpbmcKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzY0IGZvcm1hdAotICoKLSAqLwotCi1PTVhfUzY0IGFybVJvdW5kRmxvYXRUb1M2NCAoT01YX0Y2NCBWYWx1ZSkKLXsKLSAgICBpZiAoVmFsdWUgPiAwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfUzY0KShWYWx1ZSArIC41KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfUzY0KShWYWx1ZSAtIC41KTsKLSAgICB9Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNpZ25DaGVjawotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ2hlY2tzIHRoZSBzaWduIG9mIGEgdmFyaWFibGU6Ci0gKiByZXR1cm5zIDEgaWYgaXQgaXMgUG9zaXRpdmUKLSAqIHJldHVybnMgMCBpZiBpdCBpcyAwCi0gKiByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JICAgIHZhciAgICAgVmFyaWFibGUgdG8gYmUgY2hlY2tlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9JTlQgLS0gICByZXR1cm5zIDEgaWYgaXQgaXMgUG9zaXRpdmUKLSAqICAgICAgICAgICAgICByZXR1cm5zIDAgaWYgaXQgaXMgMAotICogICAgICAgICAgICAgIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCi0gKi8gCi0KLU9NWF9JTlQgYXJtU2lnbkNoZWNrICgKLSAgICBPTVhfUzE2IHZhcgotKQotCi17Ci0gICAgT01YX0lOVCBTaWduOwotICAgIAotICAgIGlmICh2YXIgPCAwKQotICAgIHsKLSAgICAgICAgU2lnbiA9IC0xOwotICAgIH0KLSAgICBlbHNlIGlmICggdmFyID4gMCkKLSAgICB7Ci0gICAgICAgIFNpZ24gPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBTaWduID0gMDsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIFNpZ247Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUNsaXAKLSAqCi0gKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKLSAqIAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAotICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCi0gKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfUzMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCi0gKi8gCi0gCi1PTVhfUzMyIGFybUNsaXAgKAotICAgIE9NWF9JTlQgbWluLAotICAgIE9NWF9JTlQgbWF4LCAKLSAgICBPTVhfUzMyIHNyYyAKLSkKLSAKLXsKLSAgICBpZiAoc3JjID4gbWF4KQotICAgIHsKLSAgICAgICAgc3JjID0gbWF4OwotICAgIH0KLSAgICBlbHNlIGlmIChzcmMgPCBtaW4pCi0gICAgewotICAgICAgICBzcmMgPSBtaW47Ci0gICAgfQotICAgIAotICAgIHJldHVybiBzcmM7Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUNsaXBfRjMyCi0gKgotICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCi0gKiAKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKLSAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAotICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX0YzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQotICovIAotIAotT01YX0YzMiBhcm1DbGlwX0YzMiAoCi0gICAgT01YX0YzMiBtaW4sCi0gICAgT01YX0YzMiBtYXgsIAotICAgIE9NWF9GMzIgc3JjIAotKQotIAotewotICAgIGlmIChzcmMgPiBtYXgpCi0gICAgewotICAgICAgICBzcmMgPSBtYXg7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNyYyA8IG1pbikKLSAgICB7Ci0gICAgICAgIHNyYyA9IG1pbjsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHNyYzsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2hpZnRTYXRfRjMyCi0gKgotICogRGVzY3JpcHRpb246IERpdmlkZXMgYSBmbG9hdCB2YWx1ZSBieSAyXnNoaWZ0IGFuZCAKLSAqIHNhdHVyYXRlcyBpdCBmb3IgdW5zaWduZWQgdmFsdWUgcmFuZ2UgZm9yIHNhdEJpdHMuCi0gKiBTZWNvbmQgcGFyYW1ldGVyIGlzIGxpa2UgInNoaWZ0aW5nIiB0aGUgY29ycmVzcG9uZGluZyAKLSAqIGludGVnZXIgdmFsdWUuIFRha2VzIGNhcmUgb2Ygcm91bmRpbmcgd2hpbGUgY2xpcHBpbmcgdGhlIGZpbmFsIAotICogdmFsdWUuCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gdiAgICAgICAgICBOdW1iZXIgdG8gYmUgb3BlcmF0ZWQgdXBvbgotICogW2luXSBzaGlmdCAgICAgIERpdmlkZXMgdGhlIGlucHV0ICJ2IiBieSAiMl5zaGlmdCIKLSAqIFtpbl0gc2F0Qml0cyAgICBGaW5hbCByYW5nZSBpcyBbMCwgMl5zYXRCaXRzKQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TMzIgLS0gICByZXR1cm5zICJzaGlmdGVkIiBzYXR1cmF0ZWQgdmFsdWUKLSAqLyAKLSAKLU9NWF9VMzIgYXJtU2hpZnRTYXRfRjMyKE9NWF9GMzIgdiwgT01YX0lOVCBzaGlmdCwgT01YX0lOVCBzYXRCaXRzKSAKLXsKLSAgICBPTVhfVTMyIGFsbE9uZXMgPSAoT01YX1UzMikoLTEpOwotICAgIE9NWF9VMzIgbWF4ViA9IGFsbE9uZXMgPj4gKDMyLXNhdEJpdHMpOwotICAgIE9NWF9GMzIgdlNoaWZ0ZWQsIHZSb3VuZGVkLCBzaGlmdERpdiA9IChPTVhfRjMyKSgxIDw8IHNoaWZ0KTsKLSAgICBPTVhfVTMyIHZJbnQ7Ci0gICAgT01YX1UzMiB2SW50U2F0OwotICAgIAotICAgIGlmKHYgPD0gMCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgdlNoaWZ0ZWQgPSB2IC8gc2hpZnREaXY7Ci0gICAgdlJvdW5kZWQgPSAoT01YX0YzMikodlNoaWZ0ZWQgKyAwLjUpOwotICAgIHZJbnQgPSAoT01YX1UzMil2Um91bmRlZDsKLSAgICB2SW50U2F0ID0gdkludDsKLSAgICBpZih2SW50U2F0ID4gbWF4VikgCi0gICAgICAgIHZJbnRTYXQgPSBtYXhWOwotICAgIHJldHVybiB2SW50U2F0OwotfQotCi0vKioKLSAqIEZ1bmN0aW9uczogYXJtU3dhcEVsZW0KLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoZXNlIGZ1bmN0aW9uIHN3YXBzIHR3byBlbGVtZW50cyBhdCB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgbG9jYXRpb25zLgotICogVGhlIHNpemUgb2YgZWFjaCBlbGVtZW50IGNvdWxkIGJlIGFueXRoaW5nIGFzIHNwZWNpZmllZCBieSA8ZWxlbVNpemU+Ci0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YUmVzdWx0IC0tIEVycm9yIHN0YXR1cyBmcm9tIHRoZSBmdW5jdGlvbgotICovCi1PTVhSZXN1bHQgYXJtU3dhcEVsZW0oCi0gICAgICAgIE9NWF9VOCAqcEJ1ZjEsCi0gICAgICAgIE9NWF9VOCAqcEJ1ZjIsCi0gICAgICAgIE9NWF9JTlQgZWxlbVNpemUKLSAgICAgICApCi17Ci0gICAgT01YX0lOVCBpOwotICAgIE9NWF9VOCB0ZW1wOwotICAgIGFybVJldEFyZ0VycklmKCFwQnVmMSB8fCAhcEJ1ZjIsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAKLSAgICBmb3IoaSA9IDA7IGkgPCBlbGVtU2l6ZTsgaSsrKQotICAgIHsKLSAgICAgICAgdGVtcCA9ICoocEJ1ZjEgKyBpKTsKLSAgICAgICAgKihwQnVmMSArIGkpID0gKihwQnVmMiArIGkpOwotICAgICAgICAqKHBCdWYyICsgaSkgPSB0ZW1wOwotICAgIH0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtTWVkaWFuT2YzCi0gKgotICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBtZWRpYW4gb2YgdGhyZWUgbnVtYmVycwotICogCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIGZFbnRyeSAgICAgRmlyc3QgZW50cnkKLSAqIFtpbl0gc0VudHJ5ICAgICBzZWNvbmQgZW50cnkKLSAqIFtpbl0gdEVudHJ5ICAgICBUaGlyZCBlbnRyeQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TMzIgLS0gICByZXR1cm5zIHRoZSBtZWRpYW4gdmFsdWUKLSAqLyAKLSAKLU9NWF9TMzIgYXJtTWVkaWFuT2YzICgKLSAgICBPTVhfUzMyIGZFbnRyeSwKLSAgICBPTVhfUzMyIHNFbnRyeSwgCi0gICAgT01YX1MzMiB0RW50cnkgCi0pCi17Ci0gICAgT01YX1MzMiBhLCBiLCBjOwotICAgIAotICAgIGEgPSBhcm1NaW4gKGZFbnRyeSwgc0VudHJ5KTsKLSAgICBiID0gYXJtTWF4IChmRW50cnksIHNFbnRyeSk7Ci0gICAgYyA9IGFybU1pbiAoYiwgdEVudHJ5KTsKLSAgICByZXR1cm4gKGFybU1heCAoYSwgYykpOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Mb2dTaXplCi0gKgotICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBzaXplIG9mIGEgcG9zaXRpdmUgdmFsdWUgYW5kIHJldHVybnMgdGhlIHNhbWUKLSAqIAotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSB2YWx1ZSAgICBQb3NpdGl2ZSB2YWx1ZQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9VOCAtLSAgICAgUmV0dXJucyB0aGUgbWluaW11bSBudW1iZXIgb2YgYml0cyByZXF1aXJlZCB0byByZXByZXNlbnQgdGhlIHBvc2l0aXZlIHZhbHVlLiAKLSAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgc21hbGxlc3Qgaz49MCBzdWNoIHRoYXQgdGhhdCB2YWx1ZSBpcyBsZXNzIHRoYW4gKDE8PGspLgotICovIAotIAotT01YX1U4IGFybUxvZ1NpemUgKAotICAgIE9NWF9VMTYgdmFsdWUgCi0pCi17Ci0gICAgT01YX1U4IGk7ICAgIAotICAgIGZvciAoIGkgPSAwOyB2YWx1ZSA+IDA7IHZhbHVlID0gdmFsdWUgPj4gMSkgCi0gICAgewotICAgICAgICBpKys7Ci0gICAgfQotICAgIHJldHVybiBpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgLyogU2F0dXJhdGluZyBBcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAotICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAKLSAqICAgIAotICoqLwotIAotT01YX1MzMiBhcm1TYXRBZGRfUzMyKE9NWF9TMzIgVmFsdWUxLE9NWF9TMzIgVmFsdWUyKQotewotICAgIE9NWF9TMzIgUmVzdWx0OwotICAgIAotICAgIFJlc3VsdCA9IFZhbHVlMSArIFZhbHVlMjsKLQotICAgIGlmKCAoVmFsdWUxXlZhbHVlMikgPj0gMCkKLSAgICB7Ci0gICAgICAgIC8qU2FtZSBzaWduKi8KLSAgICAgICAgaWYoIChSZXN1bHReVmFsdWUxKSA+PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKlJlc3VsdCBoYXMgbm90IHNhdHVyYXRlZCovCi0gICAgICAgICAgICByZXR1cm4gUmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoVmFsdWUxID49IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBwb3NpdGl2ZSBzaWRlKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX01BWF9TMzI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBuZWdhdGl2ZSBzaWRlKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX01JTl9TMzI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB9Ci0gICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIFJlc3VsdDsKLSAgICB9Ci0gICAgCi19Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdEFkZF9TNjQoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TNjQgYXJtU2F0QWRkX1M2NChPTVhfUzY0IFZhbHVlMSxPTVhfUzY0IFZhbHVlMikKLXsKLSAgICBPTVhfUzY0IFJlc3VsdDsKLSAgICAKLSAgICBSZXN1bHQgPSBWYWx1ZTEgKyBWYWx1ZTI7Ci0KLSAgICBpZiggKFZhbHVlMV5WYWx1ZTIpID49IDApCi0gICAgewotICAgICAgICAvKlNhbWUgc2lnbiovCi0gICAgICAgIGlmKCAoUmVzdWx0XlZhbHVlMSkgPj0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLypSZXN1bHQgaGFzIG5vdCBzYXR1cmF0ZWQqLwotICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKFZhbHVlMSA+PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gcG9zaXRpdmUgc2lkZSovCi0gICAgICAgICAgICAgICAgUmVzdWx0ID0gT01YX01BWF9TNjQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIG5lZ2F0aXZlIHNpZGUqLwotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUlOX1M2NDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIH0KLSAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gUmVzdWx0OwotICAgIH0KLSAgICAKLX0KLQotLyoqIEZ1bmN0aW9uIDphcm1TYXRTdWJfUzMyKCkKLSAqIAotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgc3Vic3RyYWN0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAotICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAKLSAqKi8KLQotT01YX1MzMiBhcm1TYXRTdWJfUzMyKE9NWF9TMzIgVmFsdWUxLE9NWF9TMzIgVmFsdWUyKQotewotICAgIE9NWF9TMzIgUmVzdWx0OwotICAgIAotICAgIFJlc3VsdCA9IFZhbHVlMSAtIFZhbHVlMjsKLQotICAgIGlmKCAoVmFsdWUxXlZhbHVlMikgPCAwKQotICAgIHsKLSAgICAgICAgLypPcHBvc2l0ZSBzaWduKi8KLSAgICAgICAgaWYoIChSZXN1bHReVmFsdWUxKSA+PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKlJlc3VsdCBoYXMgbm90IHNhdHVyYXRlZCovCi0gICAgICAgICAgICByZXR1cm4gUmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoVmFsdWUxID49IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBwb3NpdGl2ZSBzaWRlKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX01BWF9TMzI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBuZWdhdGl2ZSBzaWRlKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gT01YX01JTl9TMzI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB9Ci0gICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIFJlc3VsdDsKLSAgICB9Ci0gICAgCi19Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdE1hY19TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgTXVsdGlwbGljYXRpb24gb2YgVmFsdWUxIGFuZCBWYWx1ZTIgYW5kIHN1YmVzcXVlbnQgc2F0dXJhdGVkCi0gKiAgICAgYWNjdW11bGF0aW9uIHdpdGggTWFjCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAotICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKLSAqIFtpbl0gTWFjICAgICAgICAgIEFjY3VtdWxhdG9yCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICoqLwotCi1PTVhfUzMyIGFybVNhdE1hY19TMzIoT01YX1MzMiBNYWMsT01YX1MxNiBWYWx1ZTEsT01YX1MxNiBWYWx1ZTIpCi17Ci0gICAgT01YX1MzMiBSZXN1bHQ7Ci0gICAgCi0gICAgUmVzdWx0ID0gKE9NWF9TMzIpKFZhbHVlMSpWYWx1ZTIpOwotICAgIFJlc3VsdCA9IGFybVNhdEFkZF9TMzIoIE1hYyAsIFJlc3VsdCApOwotCi0gICAgcmV0dXJuIFJlc3VsdDsgICAgCi19Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdE1hY19TMTZTMzJfUzMyCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIE1BQyBvcGVyYXRpb24gb2YgdGhlIHRocmVlIGlucHV0cyBkZWxheUVsZW0sIGZpbFRhcCAsIG1hYwotICoKLSAqICAgbWFjID0gbWFjICsgU2F0dXJhdGVfaW5fMzJCaXRzKGRlbGF5RWxlbSAqIGZpbFRhcCkKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIGRlbGF5RWxlbSAgICBGaXJzdCAzMiBiaXQgT3BlcmFuZAotICogW2luXSBmaWxUYXAgICAgICAgU2Vjb25kIDE2IGJpdCBPcGVyYW5kCi0gKiBbaW5dIG1hYyAgICAgICAgICBSZXN1bHQgb2YgTUFDIG9wZXJhdGlvbgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICBtYWMgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotIAotT01YX1MzMiBhcm1TYXRNYWNfUzE2UzMyX1MzMihPTVhfUzMyIG1hYywgT01YX1MzMiBkZWxheUVsZW0sIE9NWF9TMTYgZmlsVGFwICkKLXsKLSAgICAKLSAgICBPTVhfUzMyIHJlc3VsdDsKLQotICAgIHJlc3VsdCA9IGFybVNhdE11bFMxNlMzMl9TMzIoZmlsVGFwLGRlbGF5RWxlbSk7IAotCi0gICAgaWYgKCByZXN1bHQgPiBPTVhfTUFYX1MxNiApCi0gICAgewotICAgICAgICByZXN1bHQgPSBPTVhfTUFYX1MzMjsKLSAgICB9Ci0gICAgZWxzZSBpZiggcmVzdWx0IDwgT01YX01JTl9TMTYgKQotICAgIHsKLSAgICAgICAgcmVzdWx0ID0gT01YX01JTl9TMzI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGRlbGF5RWxlbSAqIGZpbFRhcDsKLSAgICB9Ci0KLSAgICBtYWMgPSBhcm1TYXRBZGRfUzMyKG1hYyxyZXN1bHQpOwotICAgIAotICAgIHJldHVybiBtYWM7Ci19Ci0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiByb3VuZGVkIHJpZ2h0IHNoaWZ0IG9wZXJhdGlvbiBvZiBpbnB1dCBieSB0aGUgc2NhbGVmYWN0b3IKLSAqCi0gKiAgIG91dHB1dCA9IFNhdHVyYXRlX2luXzE2Qml0cyggKCBSaWdodC9MZWZ0U2hpZnQoIChSb3VuZChpbnB1dCkgLCBzaGlmdCApICkKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIGlucHV0ICAgICAgIFRoZSBpbnB1dCB0byBiZSBvcGVyYXRlZCBvbgotICogW2luXSBzaGlmdCBUaGUgc2hpZnQgbnVtYmVyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLQotCi1PTVhfUzE2IGFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2KE9NWF9TMzIgaW5wdXQsIE9NWF9JTlQgc2hpZnQpCi17Ci0gICAgaW5wdXQgPSBhcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoaW5wdXQsLXNoaWZ0KTsKLQotICAgIGlmICggaW5wdXQgPiBPTVhfTUFYX1MxNiApCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01BWF9TMTY7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IDwgT01YX01JTl9TMTYpCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9TMTYpT01YX01JTl9TMTY7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgcmV0dXJuIChPTVhfUzE2KWlucHV0OwotICAgIH0KLQotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAotICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgotICogICAgIAotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAotICogW2luXSBTaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKE9NWF9TMzIgVmFsdWUsIE9NWF9JTlQgU2hpZnQpCi17Ci0gICAgT01YX0lOVCBpOwotICAgIAotICAgIGlmIChTaGlmdCA8IDApCi0gICAgewotICAgICAgICBTaGlmdCA9IC1TaGlmdDsKLSAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzMyKFZhbHVlLCAoMSA8PCAoU2hpZnQgLSAxKSkpOwotICAgICAgICBWYWx1ZSA9IFZhbHVlID4+IFNoaWZ0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgU2hpZnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzMyKFZhbHVlLCBWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFZhbHVlOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TNjQoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAotICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKLSAqIFtpbl0gc2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotIAotT01YX1M2NCBhcm1TYXRSb3VuZExlZnRTaGlmdF9TNjQoT01YX1M2NCBWYWx1ZSwgT01YX0lOVCBTaGlmdCkKLXsKLSAgICBPTVhfSU5UIGk7Ci0gICAgCi0gICAgaWYgKFNoaWZ0IDwgMCkKLSAgICB7Ci0gICAgICAgIFNoaWZ0ID0gLVNoaWZ0OwotICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TNjQoVmFsdWUsICgoT01YX1M2NCkxIDw8IChTaGlmdCAtIDEpKSk7Ci0gICAgICAgIFZhbHVlID0gVmFsdWUgPj4gU2hpZnQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBTaGlmdDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TNjQoVmFsdWUsIFZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVmFsdWU7Ci19Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdE11bFMxNlMzMl9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMTYgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCi0gKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCi0gKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLQotCi1PTVhfUzMyIGFybVNhdE11bFMxNlMzMl9TMzIoT01YX1MxNiBpbnB1dDEsT01YX1MzMiBpbnB1dDIpCi17Ci0gICAgT01YX1MxNiBoaTIsbG8xOwotICAgIE9NWF9VMTYgbG8yOwotICAgIAotICAgIE9NWF9TMzIgdGVtcDEsdGVtcDI7Ci0gICAgT01YX1MzMiByZXN1bHQ7Ci0gICAgCi0gICAgbG8xICA9IGlucHV0MTsKLQotICAgIGhpMiAgPSAoIGlucHV0MiA+PiAgMTYgKTsKLSAgICBsbzIgID0gKCAoT01YX1UzMikoIGlucHV0MiA8PCAxNiApID4+IDE2ICk7Ci0gICAgCi0gICAgdGVtcDEgPSBoaTIgKiBsbzE7Ci0gICAgdGVtcDIgPSAoIGxvMiogbG8xICkgPj4gMTY7Ci0KLSAgICByZXN1bHQgPSAgYXJtU2F0QWRkX1MzMih0ZW1wMSx0ZW1wMik7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMzJTMzJfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzMyIGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQotICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQotICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0TXVsUzMyUzMyX1MzMihPTVhfUzMyIGlucHV0MSxPTVhfUzMyIGlucHV0MikKLXsKLSAgICBPTVhfUzE2IGhpMSxoaTI7Ci0gICAgT01YX1UxNiBsbzEsbG8yOwotICAgIAotICAgIE9NWF9TMzIgdGVtcDEsdGVtcDIsdGVtcDM7Ci0gICAgT01YX1MzMiByZXN1bHQ7Ci0KLSAgICBoaTEgID0gKCBpbnB1dDEgPj4gIDE2ICk7Ci0gICAgbG8xICA9ICggKE9NWF9VMzIpKCBpbnB1dDEgPDwgMTYgKSA+PiAxNiApOwotCi0gICAgaGkyICA9ICggaW5wdXQyID4+ICAxNiApOwotICAgIGxvMiAgPSAoIChPTVhfVTMyKSggaW5wdXQyIDw8IDE2ICkgPj4gMTYgKTsKLSAgICAKLSAgICB0ZW1wMSA9ICAgaGkxICogaGkyOwotICAgIHRlbXAyID0gKCBoaTEqIGxvMiApID4+IDE2OwotICAgIHRlbXAzID0gKCBoaTIqIGxvMSApID4+IDE2OwotCi0gICAgcmVzdWx0ID0gYXJtU2F0QWRkX1MzMih0ZW1wMSx0ZW1wMik7Ci0gICAgcmVzdWx0ID0gYXJtU2F0QWRkX1MzMihyZXN1bHQsdGVtcDMpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtSW50RGl2QXdheUZyb21aZXJvKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6IEludGVnZXIgZGl2aXNpb24gd2l0aCByb3VuZGluZyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLiAKLSAqICAgICAgICAgICAgICAgSGFsZi1pbnRlZ2VyIHZhbHVlcyBhcmUgcm91bmRlZCBhd2F5IGZyb20gemVybwotICogICAgICAgICAgICAgICB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZC4gRm9yIGV4YW1wbGUgMy8vMiBpcyByb3VuZGVkIAotICogICAgICAgICAgICAgICB0byAyLCBhbmQgLTMvLzIgaXMgcm91bmRlZCB0byAtMi4KLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIE51bSAgICAgICAgT3BlcmFuZCAxCi0gKiBbaW5dIERlbm8gICAgICAgT3BlcmFuZCAyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbiBpbnB1dDEvL2lucHV0MgotICogICAgCi0gKiovCi0KLU9NWF9TMzIgYXJtSW50RGl2QXdheUZyb21aZXJvIChPTVhfUzMyIE51bSwgT01YX1MzMiBEZW5vKQotewotICAgIE9NWF9GNjQgcmVzdWx0OwotICAgIAotICAgIHJlc3VsdCA9ICgoT01YX0Y2NClOdW0pLygoT01YX0Y2NClEZW5vKTsKLSAgICAKLSAgICBpZiAocmVzdWx0ID49IDApCi0gICAgewotICAgICAgICByZXN1bHQgKz0gMC41OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXN1bHQgLT0gMC41OwotICAgIH0KLQotICAgIHJldHVybiAoT01YX1MzMikocmVzdWx0KTsKLX0KLQotCi0vKkVuZCBvZiBGaWxlKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWY1M2NhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYworKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtQ09NTV9CaXRzdHJlYW0uYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlZmluZXMgYml0c3RyZWFtIGVuY29kZSBhbmQgZGVjb2RlIGZ1bmN0aW9ucyBjb21tb24gdG8gYWxsIGNvZGVjcwotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGaXhlZCBiaXQgbGVuZ3RoIERlY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtTG9va0FoZWFkQml0cygpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBHZXQgdGhlIG5leHQgTiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSB3aXRob3V0IGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKipwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIE49MS4uLjMyCi0gKgotICogUmV0dXJucyAgVmFsdWUKLSAqLwotCi1PTVhfVTMyIGFybUxvb2tBaGVhZEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sIE9NWF9JTlQgKnBPZmZzZXQsIE9NWF9JTlQgTikKLXsKLSAgICBjb25zdCBPTVhfVTggKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07Ci0gICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKLSAgICBPTVhfVTMyIFZhbHVlOwotCi0gICAgYXJtQXNzZXJ0KE9mZnNldD49MCAmJiBPZmZzZXQ8PTcpOwotICAgIGFybUFzc2VydChOPj0xICYmIE48PTMyKTsKLQotICAgIC8qIFJlYWQgbmV4dCAzMiBiaXRzIGZyb20gc3RyZWFtICovCi0gICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA8PCAyNCApIHwgKCBwQml0U3RyZWFtWzFdIDw8IDE2KSAgfCAocEJpdFN0cmVhbVsyXSA8PCA4ICkgfCAocEJpdFN0cmVhbVszXSkgOwotICAgIFZhbHVlID0gKFZhbHVlIDw8IE9mZnNldCApIHwgKHBCaXRTdHJlYW1bNF0gPj4gKDgtT2Zmc2V0KSk7Ci0KLSAgICAvKiBSZXR1cm4gTiBiaXRzICovCi0gICAgcmV0dXJuIFZhbHVlID4+ICgzMi1OKTsKLX0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1HZXRCaXRzKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFJlYWQgTiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQotICogICAgCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgTj0xLi4zMgotICoKLSAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqIFJldHVybnMgIFZhbHVlCi0gKi8KLQotCi1PTVhfVTMyIGFybUdldEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sIE9NWF9JTlQgKnBPZmZzZXQsIE9NWF9JTlQgTikKLXsKLSAgICBjb25zdCBPTVhfVTggKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07Ci0gICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKLSAgICBPTVhfVTMyIFZhbHVlOwotICAgIAotICAgIGlmKE4gPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBhcm1Bc3NlcnQoT2Zmc2V0Pj0wICYmIE9mZnNldDw9Nyk7Ci0gICAgYXJtQXNzZXJ0KE4+PTEgJiYgTjw9MzIpOwotCi0gICAgLyogUmVhZCBuZXh0IDMyIGJpdHMgZnJvbSBzdHJlYW0gKi8KLSAgICBWYWx1ZSA9IChwQml0U3RyZWFtWzBdIDw8IDI0ICkgfCAoIHBCaXRTdHJlYW1bMV0gPDwgMTYpICB8IChwQml0U3RyZWFtWzJdIDw8IDggKSB8IChwQml0U3RyZWFtWzNdKSA7Ci0gICAgVmFsdWUgPSAoVmFsdWUgPDwgT2Zmc2V0ICkgfCAocEJpdFN0cmVhbVs0XSA+PiAoOC1PZmZzZXQpKTsKLQotICAgIC8qIEFkdmFuY2UgYml0c3RyZWFtIHBvaW50ZXIgYnkgTiBiaXRzICovCi0gICAgT2Zmc2V0ICs9IE47Ci0gICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbSArIChPZmZzZXQ+PjMpOwotICAgICpwT2Zmc2V0ID0gT2Zmc2V0ICYgNzsKLQotICAgIC8qIFJldHVybiBOIGJpdHMgKi8KLSAgICByZXR1cm4gVmFsdWUgPj4gKDMyLU4pOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1CeXRlQWxpZ24oKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQWxpZ24gdGhlIHBvaW50ZXIgKnBwQml0U3RyZWFtIHRvIHRoZSBuZXh0IGJ5dGUgYm91bmRhcnkKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICoKLSAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQotICogW291dF0gICAgKnBPZmZzZXQKLSAqCi0gKiovCi0gCi1PTVhWb2lkIGFybUJ5dGVBbGlnbihjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSxPTVhfSU5UICpwT2Zmc2V0KQotewotICAgIGlmKCpwT2Zmc2V0ID4gMCkKLSAgICB7Ci0gICAgICAgICpwcEJpdFN0cmVhbSArPSAxOwotICAgICAgICAqcE9mZnNldCA9IDA7Ci0gICAgfSAgICAKLX0KLQotLyoqIAotICogRnVuY3Rpb246IGFybVNraXBCaXRzKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFNraXAgTiBiaXRzIGZyb20gdGhlIHZhbHVlIGF0ICpwcEJpdFN0cmVhbQotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBOCi0gKgotICogW291dF0gICAgKnBwQml0U3RyZWFtCi0gKiBbb3V0XSAgICAqcE9mZnNldAotICoKLSAqKi8KLQotCi1PTVhWb2lkIGFybVNraXBCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLE9NWF9JTlQgKnBPZmZzZXQsT01YX0lOVCBOKQotewotICAgIE9NWF9JTlQgT2Zmc2V0ID0gKnBPZmZzZXQ7Ci0gICAgY29uc3QgT01YX1U4ICpwQml0U3RyZWFtID0gKnBwQml0U3RyZWFtOwotICAgCi0gICAgLyogQWR2YW5jZSBiaXRzdHJlYW0gcG9pbnRlciBieSBOIGJpdHMgKi8KLSAgICBPZmZzZXQgKz0gTjsKLSAgICAqcHBCaXRTdHJlYW0gPSBwQml0U3RyZWFtICsgKE9mZnNldD4+Myk7Ci0gICAgKnBPZmZzZXQgPSBPZmZzZXQgJiA3OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIERlY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVW5QYWNrVkxDMzIoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVmFyaWFibGUgbGVuZ3RoIGRlY29kZSBvZiB2YXJpYWJsZSBsZW5ndGggc3ltYm9sIChtYXggc2l6ZSAzMiBiaXRzKSByZWFkIGZyb20KLSAqIHRoZSBiaXQgc3RyZWFtIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIGF0ICpwT2Zmc2V0IGJ5IHVzaW5nIHRoZSB0YWJsZQotICogcG9pbnRlZCBieSBwQ29kZUJvb2sKLSAqIAotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgcENvZGVCb29rCi0gKiAKLSAqIFtvdXRdICAgICpwQml0U3RyZWFtCi0gKiBbb3V0XSAgICAqcE9mZnNldAotICoKLSAqIFJldHVybnMgOiBDb2RlIEJvb2sgSW5kZXggaWYgc3VjY2Vzc2Z1bGwuIAotICogICAgICAgICA6IEFSTV9OT19DT0RFQk9PS19JTkRFWCA9IC0xIGlmIHNlYXJjaCBmYWlscy4KLSAqKi8KLSNpZm5kZWYgQ19PUFRJTUlaRURfSU1QTEVNRU5UQVRJT04gCi0KLU9NWF9VMTYgYXJtVW5QYWNrVkxDMzIoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcE9mZnNldCwKLSAgICBjb25zdCBBUk1fVkxDMzIgKnBDb2RlQm9vawotKQoteyAgICAKLSAgICBjb25zdCBPTVhfVTggKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07Ci0gICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKLSAgICBPTVhfVTMyIFZhbHVlOwotICAgIE9NWF9JTlQgSW5kZXg7Ci0gICAgICAgIAotICAgIGFybUFzc2VydChPZmZzZXQ+PTAgJiYgT2Zmc2V0PD03KTsKLQotICAgIC8qIFJlYWQgbmV4dCAzMiBiaXRzIGZyb20gc3RyZWFtICovCi0gICAgVmFsdWUgPSAocEJpdFN0cmVhbVswXSA8PCAyNCApIHwgKCBwQml0U3RyZWFtWzFdIDw8IDE2KSAgfCAocEJpdFN0cmVhbVsyXSA8PCA4ICkgfCAocEJpdFN0cmVhbVszXSkgOwotICAgIFZhbHVlID0gKFZhbHVlIDw8IE9mZnNldCApIHwgKHBCaXRTdHJlYW1bNF0gPj4gKDgtT2Zmc2V0KSk7Ci0KLSAgICAvKiBTZWFyY2ggdGhyb3VnaCB0aGUgY29kZWJvb2sgKi8gICAgCi0gICAgZm9yIChJbmRleD0wOyBwQ29kZUJvb2stPmNvZGVMZW4gIT0gMDsgSW5kZXgrKykKLSAgICB7Ci0gICAgICAgIGlmIChwQ29kZUJvb2stPmNvZGVXb3JkID09IChWYWx1ZSA+PiAoMzIgLSBwQ29kZUJvb2stPmNvZGVMZW4pKSkKLSAgICAgICAgewotICAgICAgICAgICAgT2Zmc2V0ICAgICAgID0gT2Zmc2V0ICsgcENvZGVCb29rLT5jb2RlTGVuOwotICAgICAgICAgICAgKnBwQml0U3RyZWFtID0gcEJpdFN0cmVhbSArIChPZmZzZXQgPj4gMykgOwotICAgICAgICAgICAgKnBPZmZzZXQgICAgID0gT2Zmc2V0ICYgNzsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIEluZGV4OwotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgcENvZGVCb29rKys7Ci0gICAgfQotCi0gICAgLyogTm8gY29kZSBtYXRjaCBmb3VuZCAqLwotICAgIHJldHVybiBBUk1fTk9fQ09ERUJPT0tfSU5ERVg7Ci19Ci0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGaXhlZCBiaXQgbGVuZ3RoIEVuY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtUGFja0JpdHMKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBhY2sgYSBWTEMgY29kZSB3b3JkIGludG8gdGhlIGJpdHN0cmVhbQotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcHBCaXRTdHJlYW0gICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtLgotICogW2luXSBwT2Zmc2V0ICAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIAotICogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwCi0gKiAgICAgICAgICAgICAgICAgICAgICB0byA3LgotICogW2luXSBjb2RlV29yZCAgICAgICAgQ29kZSB3b3JkIHRoYXQgbmVlZCB0byBiZSBpbnNlcnRlZCBpbiB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KLSAqIFtpbl0gY29kZUxlbmd0aCAgICAgIExlbmd0aCBvZiB0aGUgY29kZSB3b3JkIHZhbGlkIHJhbmdlIDEuLi4zMgotICoKLSAqIFtvdXRdIHBwQml0U3RyZWFtICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YX1JFU1VMVCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotIAotT01YUmVzdWx0IGFybVBhY2tCaXRzICgKLSAgICBPTVhfVTggICoqcHBCaXRTdHJlYW0sIAotICAgIE9NWF9JTlQgKnBPZmZzZXQsCi0gICAgT01YX1UzMiBjb2RlV29yZCwgCi0gICAgT01YX0lOVCBjb2RlTGVuZ3RoIAotKQotewotICAgIE9NWF9VOCAgKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07Ci0gICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKLSAgICBPTVhfVTMyIFZhbHVlOwotICAgICAgICAKLSAgICAvKiBjaGVja2luZyBhcmd1bWVudCB2YWxpZGl0eSAqLwotICAgIGFybVJldEFyZ0VycklmKE9mZnNldCA8IDAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihPZmZzZXQgPiA3LCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoY29kZUxlbmd0aCA8IDEsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihjb2RlTGVuZ3RoID4gMzIsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIC8qIFByZXBhcmUgdGhlIGZpcnN0IGJ5dGUgKi8KLSAgICBjb2RlV29yZCA9IGNvZGVXb3JkIDw8ICgzMi1jb2RlTGVuZ3RoKTsKLSAgICBWYWx1ZSA9IChwQml0U3RyZWFtWzBdID4+ICg4LU9mZnNldCkpIDw8ICg4LU9mZnNldCk7Ci0gICAgVmFsdWUgPSBWYWx1ZSB8IChjb2RlV29yZCA+PiAoMjQrT2Zmc2V0KSk7Ci0KLSAgICAvKiBXcml0ZSBvdXQgd2hvbGUgYnl0ZXMgKi8KLSAgICB3aGlsZSAoOC1PZmZzZXQgPD0gY29kZUxlbmd0aCkKLSAgICB7Ci0gICAgICAgICpwQml0U3RyZWFtKysgPSAoT01YX1U4KVZhbHVlOwotICAgICAgICBjb2RlV29yZCAgID0gY29kZVdvcmQgIDw8ICg4LU9mZnNldCk7Ci0gICAgICAgIGNvZGVMZW5ndGggPSBjb2RlTGVuZ3RoIC0gKDgtT2Zmc2V0KTsKLSAgICAgICAgT2Zmc2V0ID0gMDsKLSAgICAgICAgVmFsdWUgPSBjb2RlV29yZCA+PiAyNDsKLSAgICB9Ci0KLSAgICAvKiBXcml0ZSBvdXQgZmluYWwgcGFydGlhbCBieXRlICovCi0gICAgKnBCaXRTdHJlYW0gID0gKE9NWF9VOClWYWx1ZTsKLSAgICAqcHBCaXRTdHJlYW0gPSBwQml0U3RyZWFtOwotICAgICpwT2Zmc2V0ID0gT2Zmc2V0ICsgY29kZUxlbmd0aDsKLSAgICAKLSAgICByZXR1cm4gIE9NWF9TdHNfTm9FcnI7Ci19Ci0gCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIEVuY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtUGFja1ZMQzMyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KLSAqIFtpbl0JcEJpdE9mZnNldAkgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIAotICogICAgICAgICAgICAgICAgICAgICAgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwCi0gKiAgICAgICAgICAgICAgICAgICAgICB0byA3LgotICogW2luXQkgY29kZSAgICAgCQlWTEMgY29kZSB3b3JkIHRoYXQgbmVlZCB0byBiZSBpbnNlcnRlZCBpbiB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQotICoKLSAqIFtvdXRdIHBwQml0U3RyZWFtCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAotICoJICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqCQkJCQkJc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdIHBCaXRPZmZzZXQJCSpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKgkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqCQkJCQkJKnBwQml0U3RyZWFtLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWF9SRVNVTFQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLSAKLU9NWFJlc3VsdCBhcm1QYWNrVkxDMzIgKAotICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLCAKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIEFSTV9WTEMzMiBjb2RlIAotKQotewotICAgIHJldHVybiAoYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIGNvZGUuY29kZVdvcmQsIGNvZGUuY29kZUxlbikpOwotfQotCi0vKkVuZCBvZiBGaWxlKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9zcmMvYXJtQ09NTV9JRENUVGFibGUuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9zcmMvYXJtQ09NTV9JRENUVGFibGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYwYjg3Zi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvc3JjL2FybUNPTU1fSURDVFRhYmxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtQ09NTV9JRENUVGFibGUuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogICAKLSAqIEZpbGU6IGFybUNPTU1fSURDVFRhYmxlLmMKLSAqIEJyaWVmOiBEZWZpbmVzIFRhYmxlcyB1c2VkIGluIElEQ1QgY29tcHV0YXRpb24KLSAqCi0gKi8KLQotI2luY2x1ZGUgImFybUNPTU1fSURDVFRhYmxlLmgiCi0KLSAgICAgLyogIFRhYmxlIG9mIHModSkqQSh1KSpBKHYpLzE2IGF0IFExNQotICAgICAgKiAgcyh1KT0xLjAgMCA8PSB1IDw9IDUKLSAgICAgICogIHMoNik9Mi4wCi0gICAgICAqICBzKDcpPTQuMAotICAgICAgKiAgQSgwKSA9IDIqc3FydCgyKQotICAgICAgKiAgQSh1KSA9IDQqY29zKHUqcGkvMTYpICBmb3IgKHUhPTApCi0JICAqLwotCSAgCi1fX2FsaWduKDQpIGNvbnN0IE9NWF9VMTYgYXJtQ09NTV9JRENUUHJlU2NhbGUgWzY0XSA9Ci17Ci0gICAgMHg0MDAwLCAweDU4YzUsIDB4NTM5ZiwgMHg0YjQyLCAweDQwMDAsIDB4MzI0OSwgMHg0NTQ2LCAweDQ2YTEsCi0gICAgMHg1OGM1LCAweDdiMjEsIDB4NzNmYywgMHg2ODYyLCAweDU4YzUsIDB4NDViZiwgMHg2MDE2LCAweDYxZjgsCi0gICAgMHg1MzlmLCAweDczZmMsIDB4NmQ0MSwgMHg2MjU0LCAweDUzOWYsIDB4NDFiMywgMHg1YTgyLCAweDVjNDgsCi0gICAgMHg0YjQyLCAweDY4NjIsIDB4NjI1NCwgMHg1ODdlLCAweDRiNDIsIDB4M2IyMSwgMHg1MTc1LCAweDUzMGQsCi0gICAgMHg0MDAwLCAweDU4YzUsIDB4NTM5ZiwgMHg0YjQyLCAweDQwMDAsIDB4MzI0OSwgMHg0NTQ2LCAweDQ2YTEsCi0gICAgMHgzMjQ5LCAweDQ1YmYsIDB4NDFiMywgMHgzYjIxLCAweDMyNDksIDB4Mjc4MiwgMHgzNjZkLCAweDM3N2UsCi0gICAgMHgyMmEzLCAweDMwMGIsIDB4MmQ0MSwgMHgyOGJhLCAweDIyYTMsIDB4MWIzNywgMHgyNTdlLCAweDI2M2EsCi0gICAgMHgxMWE4LCAweDE4N2UsIDB4MTcxMiwgMHgxNGMzLCAweDExYTgsIDB4MGRlMCwgMHgxMzFkLCAweDEzN2QgICAgCi19OwotICAgIC8qIEFib3ZlIGFycmF5IGFybUNPTU1fSURDVFByZVNjYWxlLCAgaW4gUTIzIGZvcm1hdCAqLwotY29uc3QgT01YX1UzMiBhcm1DT01NX0lEQ1RQcmVTY2FsZVUzMiBbNjRdID0KLXsKLSAgICAweDQwMDAwMCwgMHg1OGM1NDMsIDB4NTM5ZWJhLCAweDRiNDE4YywgMHg0MDAwMDAsIDB4MzI0OGQ0LCAweDQ1NDVlYSwgMHg0NmExNTcsCi0gICAgMHg1OGM1NDMsIDB4N2IyMGQ4LCAweDczZmJmYywgMHg2ODYyMTQsIDB4NThjNTQzLCAweDQ1YmYxZiwgMHg2MDE1YTUsIDB4NjFmNzhiLAotICAgIDB4NTM5ZWJhLCAweDczZmJmYywgMHg2ZDQxM2QsIDB4NjI1M2E2LCAweDUzOWViYSwgMHg0MWIzMjgsIDB4NWE4MjdhLCAweDVjNDg2OSwKLSAgICAweDRiNDE4YywgMHg2ODYyMTQsIDB4NjI1M2E2LCAweDU4N2RlMywgMHg0YjQxOGMsIDB4M2IyMGQ4LCAweDUxNzRlMCwgMHg1MzBkNjksCi0gICAgMHg0MDAwMDAsIDB4NThjNTQzLCAweDUzOWViYSwgMHg0YjQxOGMsIDB4NDAwMDAwLCAweDMyNDhkNCwgMHg0NTQ1ZWEsIDB4NDZhMTU3LAotICAgIDB4MzI0OGQ0LCAweDQ1YmYxZiwgMHg0MWIzMjgsIDB4M2IyMGQ4LCAweDMyNDhkNCwgMHgyNzgyMWQsIDB4MzY2ZDcyLCAweDM3N2U2YiwKLSAgICAweDIyYTJmNSwgMHgzMDBhZDMsIDB4MmQ0MTNkLCAweDI4YmE3MCwgMHgyMmEyZjUsIDB4MWIzNmI5LCAweDI1N2Q4NiwgMHgyNjM5OGQsCi0gICAgMHgxMWE4NTYsIDB4MTg3ZGUzLCAweDE3MTIxYSwgMHgxNGMzNWEsIDB4MTFhODU2LCAweDBkZGY5YiwgMHgxMzFjYzcsIDB4MTM3Y2EyCi19OwotICAgCi1jb25zdCBPTVhfVTE2IGFybUNPTU1fSURDVENvZWYgWzRdID0KLXsKLSAgICAweDVhODIsIC8qIEludlNxcnQyICovCi0gICAgMHgzMGZjLCAvKiBTaW5QSUJ5OCAqLwotICAgIDB4NzY0MiwgLyogQ29zUElCeTggKi8KLSAgICAweDAwMDAgICAgCi19OwotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NX01hc2tUYWJsZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3NyYy9hcm1DT01NX01hc2tUYWJsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDZhOGU1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS9zcmMvYXJtQ09NTV9NYXNrVGFibGUuYworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybUNPTU1fTWFza1RhYmxlLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBNYXNrIFRhYmxlIHRvIG1hc2sgdGhlIGVuZCBvZiBhcnJheS4KLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLQotI2RlZmluZSBNYXNrVGFibGVTaXplIDcyCi0KLWNvbnN0IE9NWF9VMTYgYXJtQ09NTV9xTWFza1RhYmxlMTZbTWFza1RhYmxlU2l6ZV0gPSAKLXsKLSAgICAgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgICAgIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgCi0gICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwgMHgwMDAwLCAKLSAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsCi0gICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGICAgIAotfTsKLQotY29uc3QgT01YX1U4IGFybUNPTU1fcU1hc2tUYWJsZThbTWFza1RhYmxlU2l6ZV0gPSAKLXsKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCi0gICAgICAgIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAotICAgICAgICAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKLSAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCi0gICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAotICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAgCi0gICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsICAKLSAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgCi0gICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYgICAgCi19OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9hcm1WQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9hcm1WQy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGJlOGI2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9hcGkvYXJtVkMuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBGaWxlOiBhcm1WaWRlby5oCi0gKiBCcmllZjogRGVjbGFyZXMgQVBJJ3MvQmFzaWMgRGF0YSB0eXBlcyB1c2VkIGFjcm9zcyB0aGUgT3Blbk1BWCBWaWRlbyBkb21haW4KLSAqCi0gKi8KLQotCi0jaWZuZGVmIF9hcm1WaWRlb19IXwotI2RlZmluZSBfYXJtVmlkZW9fSF8KLQotI2luY2x1ZGUgIm9teFZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKLQotLyoqCi0gKiBBUk0gc3BlY2lmaWMgc3RhdGUgc3RydWN0dXJlIHRvIGhvbGQgTW90aW9uIEVzdGltYXRpb24gaW5mb3JtYXRpb24uCi0gKi8KLSAKLXN0cnVjdCBtNHAyX01FU3BlYwotewotICAgIE9NWFZDTTRQMk1FUGFyYW1zIE1FUGFyYW1zOwotICAgIE9NWFZDTTRQMk1FTW9kZSAgIE1FTW9kZTsKLX07Ci0KLXN0cnVjdCBtNHAxMF9NRVNwZWMKLXsKLSAgICBPTVhWQ000UDEwTUVQYXJhbXMgTUVQYXJhbXM7Ci0gICAgT01YVkNNNFAxME1FTW9kZSAgIE1FTW9kZTsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IG00cDJfTUVTcGVjICBBUk1WQ000UDJfTUVTcGVjOwotdHlwZWRlZiBzdHJ1Y3QgbTRwMTBfTUVTcGVjIEFSTVZDTTRQMTBfTUVTcGVjOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQ29tcGFyZU1WCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBjb21wYXJpc2lvbiBvZiBtb3Rpb24gdmVjdG9ycyBhbmQgU0FEJ3MgdG8gZGVjaWRlIHRoZQotICogYmVzdCBNViBhbmQgU0FECi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgbXZYICAgICB4IGNvb3JkaW5hdGUgb2YgdGhlIGNhbmRpZGF0ZSBtb3Rpb24gdmVjdG9yCi0gKiBbaW5dICAgICBtdlkgICAgIHkgY29vcmRpbmF0ZSBvZiB0aGUgY2FuZGlkYXRlIG1vdGlvbiB2ZWN0b3IKLSAqIFtpbl0gICAgIGNhbmRTQUQgQ2FuZGlkYXRlIFNBRAotICogW2luXSAgICAgYmVzdE1WWCB4IGNvb3JkaW5hdGUgb2YgdGhlIGJlc3QgbW90aW9uIHZlY3RvcgotICogW2luXSAgICAgYmVzdE1WWSB5IGNvb3JkaW5hdGUgb2YgdGhlIGJlc3QgbW90aW9uIHZlY3RvcgotICogW2luXSAgICAgYmVzdFNBRCBiZXN0IFNBRAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9JTlQgLS0gMSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHNhZCBpcyB0aGUgYmVzdAotICogICAgICAgICAgICAwIHRvIGluZGljYXRlIHRoYXQgaXQgaXMgTk9UIHRoZSBiZXN0IFNBRAotICovCi0KLU9NWF9JTlQgYXJtVkNNNFAyX0NvbXBhcmVNViAoCi0gICAgT01YX1MxNiBtdlgsCi0gICAgT01YX1MxNiBtdlksCi0gICAgT01YX0lOVCBjYW5kU0FELAotICAgIE9NWF9TMTYgYmVzdE1WWCwKLSAgICBPTVhfUzE2IGJlc3RNVlksCi0gICAgT01YX0lOVCBiZXN0U0FEKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0FDRENQcmVkaWN0Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhZGFwdGl2ZSBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uIGZvciBhbiBpbnRyYSBibG9jay4gUHJpb3IKLSAqIHRvIHRoZSBmdW5jdGlvbiBjYWxsLCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAocHJlZERpcikgc2hvdWxkIGJlIHNlbGVjdGVkCi0gKiBhcyBzcGVjaWZpZWQgaW4gc3ViY2xhdXNlIDcuNC4zLjEgb2YgSVNPL0lFQyAxNDQ5Ni0yLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcFNyY0RzdCAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHF1YW50aXplZCBjb2VmZmljaWVudCByZXNpZHVhbHMgKFBRRikgb2YgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBibG9jawotICogW2luXSBwUHJlZEJ1ZlJvdyBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCi0gKiBbaW5dIHBQcmVkQnVmQ29sIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKLSAqIFtpbl0gY3VyUVAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgY3VycmVudCBibG9jay4gY3VyUVAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBtYXkgZXF1YWwgdG8gcHJlZFFQIGVzcGVjaWFsbHkgd2hlbiB0aGUgY3VycmVudAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrIGFuZCB0aGUgcHJlZGljdG9yIGJsb2NrIGFyZSBpbiB0aGUgc2FtZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2suCi0gKiBbaW5dIHByZWRRUCAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jawotICogW2luXSBwcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5Ci0gKiBbaW5dIEFDUHJlZEZsYWcgIGEgZmxhZyBpbmRpY2F0aW5nIGlmIEFDIHByZWRpY3Rpb24gc2hvdWxkIGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkLiBJdCBpcyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgaW4gdGhlIGJpdAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBzeW50YXggb2YgTVBFRy00Ci0gKiBbaW5dIHZpZGVvQ29tcCAgIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiBbaW5dIGZsYWcgICAgICAgIFRoaXMgZmxhZyBkZWZpbmVzIHRoZSBpZiBvbmUgd2FudHMgdG8gdXNlIHRoaXMgZnVuY3Rpb25zIHRvCi0gKiAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZSBQUUYgKHNldCAxLCBwcmVkaWN0aW9uKSBvciBRRiAoc2V0IDAsIHJlY29uc3RydWN0aW9uKQotICogW291dF0gICAgcFByZUFDUHJlZGljdCAgIHBvaW50ZXIgdG8gdGhlIHByZWRpY3RlZCBjb2VmZmljaWVudHMgYnVmZmVyLgotICogICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGxlZCBPTkxZIGlmIGl0IGlzIG5vdCBOVUxMCi0gKiBbb3V0XSAgICBwU3JjRHN0ICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcXVhbnRpemVkIGNvZWZmaWNpZW50cyAoUUYpIG9mIHRoZSBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sKLSAqIFtvdXRdICAgIHBQcmVkQnVmUm93IHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgotICogW291dF0gICAgcFByZWRCdWZDb2wgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCi0gKiBbb3V0XSAgICBwU3VtRXJyICAgICBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIHN1bSBvZiB0aGUgZGlmZmVyZW5jZQotICogICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiBwcmVkaWN0ZWQgYW5kIHVucHJlZGljdGVkIGNvZWZmaWNpZW50cwotICogICAgICAgICAgICAgICAgICAgICAgSWYgdGhpcyBpcyBOVUxMLCBkbyBub3QgdXBkYXRlCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfQUNEQ1ByZWRpY3QoCi0gICAgIE9NWF9TMTYgKiBwU3JjRHN0LAotICAgICBPTVhfUzE2ICogcFByZUFDUHJlZGljdCwKLSAgICAgT01YX1MxNiAqIHBQcmVkQnVmUm93LAotICAgICBPTVhfUzE2ICogcFByZWRCdWZDb2wsCi0gICAgIE9NWF9JTlQgY3VyUVAsCi0gICAgIE9NWF9JTlQgcHJlZFFQLAotICAgICBPTVhfSU5UIHByZWREaXIsCi0gICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKLSAgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgIHZpZGVvQ29tcCwKLSAgICAgT01YX1U4IGZsYWcsCi0gICAgIE9NWF9JTlQgKnBTdW1FcnIKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9TZXRQcmVkRGlyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBkZXRlY3RpbmcgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBibG9ja0luZGV4ICBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiBhcyBkZWZpbmVkIGluIHN1YmNsYXVzZSA2LjEuMy44LCBvZiBJU08vSUVDCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ0OTYtMi4gRnVydGhlcm1vcmUsIGluZGV4ZXMgNiB0byA5IGluZGljYXRlIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhIGJsb2NrcyBzcGF0aWFsbHkgY29ycmVzcG9uZGluZyB0byBsdW1pbmFuY2UKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3MgMCB0byAzIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suCi0gKiBbaW5dIHBDb2VmQnVmUm93IHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKLSAqIFtpbl0gcFFwQnVmICAgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBidWZmZXIKLSAqIFtvdXRdICAgIHByZWRRUCAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jawotICogW291dF0gICAgcHJlZERpciAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQotICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIHByZWRpY3QgdmVydGljYWxseQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX1NldFByZWREaXIoCi0gICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKLSAgICAgT01YX1MxNiAqcENvZWZCdWZSb3csCi0gICAgIE9NWF9TMTYgKnBDb2VmQnVmQ29sLAotICAgICBPTVhfSU5UICpwcmVkRGlyLAotICAgICBPTVhfSU5UICpwcmVkUVAsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFFwQnVmCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZyBmb3Igb25lIGludHJhIGJsb2NrLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcHBCaXRTdHJlYW0gICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0IHN0cmVhbQotICogW2luXSBwQml0T2Zmc2V0ICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LgotICogW2luXSBwUURjdEJsa0NvZWYgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudAotICogW2luXSBwcmVkRGlyICAgICAgICAgQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24sIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB6aWd6YWcgc2NhbiBwYXR0ZXJuLiBUaGlzIHRha2VzIG9uZSBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX05PTkUgICAgICAgICAgQUMgcHJlZGljdGlvbiBub3QgdXNlZC4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBIb3Jpem9udGFsIHByZWRpY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgVmVydGljYWwgcHJlZGljdGlvbi4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCi0gKiBbaW5dIHBhdHRlcm4gICAgICAgICBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBibG9jayBpcyBlbmNvZGVkCi0gKiBbaW5dIHN0YXJ0ICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggMHRoIGVsZW1lbnQKLSAqICAgICAgICAgICAgICAgICAgICAgIG9yIDFzdC4KLSAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhKAotICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAotICAgICBPTVhfVTggcHJlZERpciwKLSAgICAgT01YX1U4IHBhdHRlcm4sCi0gICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgT01YX1U4IHN0YXJ0Ci0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRyYSBjb2RlZCBibG9jay4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBwQml0U3RyZWFtICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdHN0cmVhbSBidWZmZXIKLSAqIFtpbl0gcEJpdE9mZnNldCAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLTddLgotICogW2luXSBwcmVkRGlyICAgICAgICAgQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHppZ3phZyBzY2FuIHBhdHRlcm4uIEl0IHRha2VzIG9uZSBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX05PTkUgIEFDIHByZWRpY3Rpb24gbm90IHVzZWQ7Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtIGNsYXNzaWNhbCB6aWd6YWcgc2NhbjsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgSG9yaXpvbnRhbCBwcmVkaWN0aW9uOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtIGFsdGVybmF0ZS12ZXJ0aWNhbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2NhbjsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgVmVydGljYWwgcHJlZGljdGlvbjsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGh1cyBwZXJmb3JtCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0ZS1ob3Jpem9udGFsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgotICogW2luXSB2aWRlb0NvbXAgICAgICAgdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2Ugb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCi0gKiBbaW5dIHN0YXJ0ICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggMHRoIGVsZW1lbnQKLSAqICAgICAgICAgICAgICAgICAgICAgIG9yIDFzdC4KLSAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKLSAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQotICogW291dF0gICAgcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmEoCi0gICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0gICAgIE9NWF9TMTYgKiBwRHN0LAotICAgICBPTVhfVTggcHJlZERpciwKLSAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLCAKLSAgICAgT01YX1U4ICBzdGFydAotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGZpbGxpbmcgb2YgdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBhY2NvcmRpbmcgdG8gdGhlIHJ1biwgbGV2ZWwKLSAqIGFuZCBzaWduLCBhbHNvIHVwZGF0ZXMgdGhlIGluZGV4Ci0gKiAKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBzdG9yZVJ1biAgICAgICAgU3RvcmVkIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpICAgCi0gKiBbaW5dICBzdG9yZUxldmVsICAgICAgU3RvcmVkIExldmVsIHZhbHVlIChub24temVybyB2YWx1ZSkKLSAqIFtpbl0gIHNpZ24gICAgICAgICAgICBGbGFnIGluZGljYXRpbmcgdGhlIHNpZ24gb2YgbGV2ZWwKLSAqIFtpbl0gIGxhc3QgICAgICAgICAgICBzdGF0dXMgb2YgdGhlIGxhc3QgZmxhZwotICogW2luXSAgcEluZGV4ICAgICAgICAgIHBvaW50ZXIgdG8gY29lZmZpY2llbnQgaW5kZXggaW4gOHg4IG1hdHJpeAotICogW291dF0gcEluZGV4ICAgICAgICAgIHBvaW50ZXIgdG8gdXBkYXRlZCBjb2VmZmljaWVudCBpbmRleCBpbiA4eDggCi0gKiAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4Ci0gKiBbaW5dICBwWmlnemFnVGFibGUgICAgcG9pbnRlciB0byB0aGUgemlnemFnIHRhYmxlcwotICogW291dF0gcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcigKLSAgICBPTVhfVTMyIHN0b3JlUnVuLAotICAgIE9NWF9TMTYgKiBwRHN0LAotICAgIE9NWF9TMTYgc3RvcmVMZXZlbCwKLSAgICBPTVhfVTggIHNpZ24sCi0gICAgT01YX1U4ICBsYXN0LAotICAgIE9NWF9VOCAgKiBpbmRleCwKLSAgICBjb25zdCBPTVhfVTggKiBwWmlnemFnVGFibGUKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9HZXRWTENCaXRzCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBlc2NhcGUgbW9kZSBkZWNpc2lvbiBiYXNlZCBvbiB0aGUgcnVuLCBydW4rLCBsZXZlbCwgbGV2ZWwrIGFuZCAKLSAqIGxhc3QgY29tYmluYXRpb25zLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotICoJCQkJCQkJCXRoZSBiaXQgc3RyZWFtCi0gKiBbaW5dCXBCaXRPZmZzZXQJCXBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKgkJCQkJCQkJYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3Ci0gKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCi0gKiBbaW5dIHN0YXJ0ICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggCi0gKiAgICAgICAgICAgICAgICAgICAgICAwdGggZWxlbWVudCBvciAxc3QuCi0gKiBbaW4vb3V0XSBwTGFzdCAgICAgICBwb2ludGVyIHRvIGxhc3Qgc3RhdHVzIGZsYWcKLSAqIFtpbl0gcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAgICAgIFRoZSBydW4gdmFsdWUgZnJvbSB3aGljaCBsZXZlbCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogbGFzdCA9PSAwCi0gKiBbaW5dIEluZGV4QmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAgICBBcnJheSBpbmRleCBpbiB0aGUgVkxDIHRhYmxlIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRpbmcgdG8gdGhlICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgCi0gKiBbaW5dIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDEgICAgICBUaGUgcnVuIHZhbHVlIGZyb20gd2hpY2ggbGV2ZWwgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IGxhc3QgPT0gMQotICogW2luXSBJbmRleEJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDEgICAgQXJyYXkgaW5kZXggaW4gdGhlIFZMQyB0YWJsZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50aW5nIHRvIHRoZSAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwIAotICogW2luXSBwUnVuSW5kZXhUYWJsZUwwICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dIHBWbGNUYWJsZUwwICAgICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gcFJ1bkluZGV4VGFibGVMMSAgICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQotICogW2luXSBwVmxjVGFibGVMMSAgICAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dIHBMTUFYVGFibGVMMCAgICAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gcExNQVhUYWJsZUwxICAgICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQotICogW2luXSBwUk1BWFRhYmxlTDAgICAgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSBwUk1BWFRhYmxlTDEgICAgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQotICogW291dF1wRHN0CQkJICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Ci0gKgkJCQkJCQlibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfR2V0VkxDQml0cyAoCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgICAgICAgICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLQkJCSAgT01YX1MxNiAqIHBEc3QsCi0JCQkgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKLQkJCSAgT01YX1U4ICAgIHN0YXJ0LAkJCSAgCi0JCQkgIE9NWF9VOCAgKiBwTGFzdCwKLQkJCSAgT01YX1U4ICAgIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAsCi0JCQkgIE9NWF9VOCAgICBtYXhJbmRleEZvck11bHRpcGxlRW50cmllc0wwLAotCQkJICBPTVhfVTggICAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEsCi0JCQkgIE9NWF9VOCAgICBtYXhJbmRleEZvck11bHRpcGxlRW50cmllc0wxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMCwKLQkJCSAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwWmlnemFnVGFibGUKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9QdXRWTENCaXRzCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDaGVja3MgdGhlIHR5cGUgb2YgRXNjYXBlIE1vZGUgYW5kIHB1dCBlbmNvZGVkIGJpdHMgZm9yIAotICogcXVhbnRpemVkIERDVCBjb2VmZmljaWVudHMuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQkgcHBCaXRTdHJlYW0gICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqCQkJCQkJICB0aGUgYml0IHN0cmVhbQotICogW2luXQkgcEJpdE9mZnNldCAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICogICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKLSAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KLSAqIFtpbl0gIHN0YXJ0ICAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIAotICogICAgICAgICAgICAgICAgICAgICAgICAwdGggZWxlbWVudCBvciAxc3QuCi0gKiBbaW5dICBtYXhTdG9yZVJ1bkwwICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsYXN0ID0gMAotICogW2luXSAgbWF4U3RvcmVSdW5MMSAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQotICogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGFzdCA9IDEKLSAqIFtpbl0gIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wwIAotICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAotICogICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAotICogICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKSBmb3IgbGFzdCA9IDAKLSAqIFtpbl0gIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxIAotICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAotICogICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAotICogICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKSBmb3IgbGFzdCA9IDEKLSAqIFtpbl0gIHBSdW5JbmRleFRhYmxlTDAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dICBwVmxjVGFibGVMMCAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dICBwUnVuSW5kZXhUYWJsZUwxIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQotICogW2luXSAgcFZsY1RhYmxlTDEgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMQotICogW2luXSAgcExNQVhUYWJsZUwwICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gIHBMTUFYVGFibGVMMSAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dICBwUk1BWFRhYmxlTDAgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gIHBSTUFYVGFibGVMMSAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQotICogW291dF0gcFFEY3RCbGtDb2VmICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50Ci0gKiBbb3V0XSBwcEJpdFN0cmVhbSAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAotICogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldCAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX1B1dFZMQ0JpdHMgKAotICAgICAgICAgICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKLSAgICAgICAgICAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotICAgICAgICAgICAgICBPTVhfVTggc3RhcnQsCi0gICAgICAgICAgICAgIE9NWF9VOCBtYXhTdG9yZVJ1bkwwLAotICAgICAgICAgICAgICBPTVhfVTggbWF4U3RvcmVSdW5MMSwKLSAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMCwKLSAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDAsCi0JCQkgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFppZ3phZ1RhYmxlCi0pOwotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGNhbGN1bGF0aW5nIHRoZSBWTEMgYml0cyBkZXBlbmRpbmcgb24gdGhlIGVzY2FwZSB0eXBlIGFuZCBpbnNlcnQgCi0gKiB0aGUgc2FtZSBpbiB0aGUgYml0c3RyZWFtCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQkgcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotICoJICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdCBzdHJlYW0KLSAqIFtpbl0JIHBCaXRPZmZzZXQgICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNwotICogW2luXSAgcnVuICAgICAgICAgICAgICAgIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpIHRvIGJlIGVuY29kZWQgIAotICogW2luXSAgbGV2ZWwgICAgICAgICAgICAgIExldmVsIHZhbHVlIChub24temVybyB2YWx1ZSkgdG8gYmUgZW5jb2RlZAotICogW2luXSAgcnVuUGx1cyAgICAgICAgICAgIENhbGN1bGF0ZWQgYXMgcnVuUGx1cyA9IHJ1biAtIChSTUFYICsgMSkgIAotICogW2luXSAgbGV2ZWxQbHVzICAgICAgICAgIENhbGN1bGF0ZWQgYXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxQbHVzID0gc2lnbihsZXZlbCkqW2FicyhsZXZlbCkgLSBMTUFYXQotICogW2luXSAgZk1vZGUgICAgICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyB0aGUgZXNjYXBlIG1vZGVzCi0gKiBbaW5dICBsYXN0ICAgICAgICAgICAgICAgc3RhdHVzIG9mIHRoZSBsYXN0IGZsYWcKLSAqIFtpbl0gIG1heFJ1bkZvck11bHRpcGxlRW50cmllcyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIHdpbGwgYmUgZXF1YWwgdG8gMTogCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKLSAqIFtpbl0gIHBSdW5JbmRleFRhYmxlICAgICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbgotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX3RhYmxlc19WTEMuaAotICogW2luXSAgcFZsY1RhYmxlICAgICAgICAgIFZMQyB0YWJsZSBkZWZpbmVkIGluIGFybVZDTTRQMl9IdWZmX3RhYmxlc19WTEMuaAotICogW291dF0gcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdIHBCaXRPZmZzZXQgICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlciAoCi0gICAgICAgICAgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgICAgICAgICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLSAgICAgICAgICAgICAgT01YX1UzMiBydW4sCi0gICAgICAgICAgICAgIE9NWF9TMTYgbGV2ZWwsIAotCQkJICBPTVhfVTMyIHJ1blBsdXMsCi0gICAgICAgICAgICAgIE9NWF9TMTYgbGV2ZWxQbHVzLCAKLSAgICAgICAgICAgICAgT01YX1U4ICBmTW9kZSwKLQkJCSAgT01YX1U4ICBsYXN0LAotICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllcywgCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKnBSdW5JbmRleFRhYmxlLAotICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZQotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgZXNjYXBlIG1vZGUgZGVjaXNpb24gYmFzZWQgb24gdGhlIHJ1biwgcnVuKywgbGV2ZWwsIGxldmVsKyBhbmQgCi0gKiBsYXN0IGNvbWJpbmF0aW9ucy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHJ1biAgICAgICAgICAgICBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSB0byBiZSBlbmNvZGVkICAKLSAqIFtpbl0gbGV2ZWwgICAgICAgICAgIExldmVsIHZhbHVlIChub24temVybyB2YWx1ZSkgdG8gYmUgZW5jb2RlZAotICogW2luXSBydW5QbHVzICAgICAgICAgQ2FsY3VsYXRlZCBhcyBydW5QbHVzID0gcnVuIC0gKFJNQVggKyAxKSAgCi0gKiBbaW5dIGxldmVsUGx1cyAgICAgICBDYWxjdWxhdGVkIGFzIAotICogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxQbHVzID0gc2lnbihsZXZlbCkqW2FicyhsZXZlbCkgLSBMTUFYXQotICogW2luXSBtYXhTdG9yZVJ1biAgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKLSAqIFtpbl0gbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzIAotICogICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCAKLSAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCi0gKiAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQotICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgotICogW2luXSBwUnVuSW5kZXhUYWJsZSAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKLSAqICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBSZXR1cm5zIGFuIEVzY2FwZSBtb2RlIHdoaWNoIGNhbiB0YWtlIHZhbHVlcyBmcm9tIDAgdG8gMwotICogMCAtLT4gbm8gZXNjYXBlIG1vZGUsIDEgLS0+IGVzY2FwZSB0eXBlIDEsCi0gKiAxIC0tPiBlc2NhcGUgdHlwZSAyLCAzIC0tPiBlc2NhcGUgdHlwZSAzLCBjaGVjayBzZWN0aW9uIDcuNC4xLjMKLSAqIGluIHRoZSBNUEVHIElTTyBzdGFuZGFyZC4KLSAqCi0gKi8KLQotT01YX1U4IGFybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUoCi0gICAgIE9NWF9VMzIgcnVuLAotICAgICBPTVhfVTMyIHJ1blBsdXMsCi0gICAgIE9NWF9TMTYgbGV2ZWwsCi0gICAgIE9NWF9TMTYgbGV2ZWxQbHVzLAotICAgICBPTVhfVTggIG1heFN0b3JlUnVuLAotICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllcywKLSAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotICAgICBjb25zdCBPTVhfVTggICpwUnVuSW5kZXhUYWJsZQotKTsKLQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIHNlYXJjaDsgZXN0aW1hdGVzIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICAKLSAqIEJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIHVzaW5nIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCAKLSAqIHRoZXJlZm9yZSBhIHNoaWZ0IGxlZnQgb3IgcmlnaHQgYnkgMSBiaXQgbWF5IGJlIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSAKLSAqIGlucHV0IG9yIG91dHB1dCBNVnMgd2l0aCBvdGhlciBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgCi0gKiBpbnB1dCBNVnMgcmVwcmVzZW50ZWQgdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwU3JjUmVmQnVmCQlwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgTUIgdGhhdCAKLSAqICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgICAgICAgICBwbGFuZS4KLSAqIFtpbl0JcmVmV2lkdGgJCSAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZQotICogW2luXQlwUmVmUmVjdAkJICBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWN0YW5ndWxhciBpbiByZWZlcmVuY2UgcGxhbmUuIFJlbGF0aXZlIHRvIGltYWdlIG9yaWdpbi4gCi0gKiAgICAgICAgICAgICAgICAgICAgSXQncyBub3QgbGltaXRlZCB0byB0aGUgaW1hZ2UgYm91bmRhcnksIGJ1dCBkZXBlbmRlZCBvbiB0aGUgcGFkZGluZy4gRm9yIGV4YW1wbGUsIAotICogICAgICAgICAgICAgICAgICAgIGlmIHlvdSBwYWQgNCBwaXhlbHMgb3V0c2lkZSB0aGUgaW1hZ2UgYm9yZGVyLCB0aGVuIHRoZSB2YWx1ZSBmb3IgbGVmdCBib3JkZXIgCi0gKiAgICAgICAgICAgICAgICAgICAgY2FuIGJlIC00Ci0gKiBbaW5dCXBTcmNDdXJyQnVmCQlwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgZXh0cmFjdGVkIGZyb20gb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgCi0gKiAgICAgICAgICAgICAgICAgICAgMjU2IGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LgotICogW2luXSBwQ3VyclBvaW50UG9zCXBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUKLSAqIFtpbl0gcFNyY1ByZU1WCQkgIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIHByZWRpY3RlZCBNVgotICogW2luXSBwU3JjUHJlU0FECQlwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCBieSBwU3JjUHJlTVYpCi0gKiBbaW5dIHNlYXJjaFJhbmdlCQlzZWFyY2ggcmFuZ2UgZm9yIDE2WDE2IGludGVnZXIgYmxvY2ssdGhlIHVuaXRzIG9mIGl0IGlzIGZ1bGwgcGl4ZWwsdGhlIHNlYXJjaCByYW5nZSAKLSAqICAgICAgICAgICAgICAgICAgICBpcyB0aGUgc2FtZSBpbiBhbGwgZGlyZWN0aW9ucy5JdCBpcyBpbiBpbmNsdXNpdmUgb2YgdGhlIGJvdW5kYXJ5IGFuZCBzcGVjaWZpZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cy4KLSAqIFtpbl0gcE1FU3BlYwkJCSAgdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCi0gKiAgICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyAKLSAqICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4KLSAqIFtpbl0gQmxvY2tTaXplICAgICBNYWNyb0Jsb2NrIFNpemUgaS5lIGVpdGhlciAxNngxNiBvciA4eDguCi0gKiBbb3V0XQlwRHN0TVYJCQlwb2ludGVyIHRvIGVzdGltYXRlZCBNVgotICogW291dF0JcERzdFNBRAkJCXBvaW50ZXIgdG8gbWluaW11bSBTQUQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfU3RzX05vRXJyIKhDIG5vIGVycm9yLgotICogT01YX1N0c19CYWRBcmdFcnIgqEMgYmFkIGFyZ3VtZW50cwotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcigKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgICBPTVhfSU5UIHJlZldpZHRoLAotICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNQcmVNViwKLSAgICAgY29uc3QgT01YX0lOVCAqcFNyY1ByZVNBRCwKLSAgICAgdm9pZCAqcE1FU3BlYywKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNViwKLSAgICAgT01YX0lOVCAqcERzdFNBRCwKLSAgICAgT01YX1U4IEJsb2NrU2l6ZQotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gIFJldHVybnMgdGhlIGVzdGltYXRlZCAKLSAqIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyB0aGUgaGFsZi1waXhlbCAKLSAqIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCAKLSAqIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdE1WLCBpLmUuLCB0aGUgaW5pdGlhbCBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCAKLSAqIGV4dGVybmFsbHkuICBUaGUgaW5wdXQgcGFyYW1ldGVycyBwU3JjUmVmQnVmIGFuZCBwU2VhcmNoUG9pbnRSZWZQb3Mgc2hvdWxkIGJlIAotICogc2hpZnRlZCBieSB0aGUgd2lubmluZyBNViBvZiAxNngxNiBpbnRlZ2VyIHNlYXJjaCBwcmlvciB0byBjYWxsaW5nIEJsb2NrTWF0Y2hfSGFsZl8xNngxNi4gIAotICogVGhlIGZ1bmN0aW9uIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBTcmNSZWZCdWYJCXBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSBNQiAKLSAqICAgICAgICAgICAgICAgICAgICB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIAotICogICAgICAgICAgICAgICAgICAgIHRoZQljdXJyZW50IHBsYW5lLgotICogW2luXQlyZWZXaWR0aAkJICB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lCi0gKiBbaW5dCXBSZWZSZWN0CQkgIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlCi0gKiBbaW5dCXBTcmNDdXJyQnVmCQlwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgZXh0cmFjdGVkIGZyb20gb3JpZ2luYWwgcGxhbmUgCi0gKiAgICAgICAgICAgICAgICAgICAgKGxpbmVhciBhcnJheSwgMjU2IGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqIFtpbl0JcFNlYXJjaFBvaW50UmVmUG9zCXBvc2l0aW9uIG9mIHRoZSBzdGFydGluZyBwb2ludCBmb3IgaGFsZiBwaXhlbCBzZWFyY2ggKHNwZWNpZmllZCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzKSBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLgotICogW2luXQlybmRWYWwJCQkgIHJvdW5kaW5nIGNvbnRyb2wgYml0IGZvciBoYWxmIHBpeGVsIG1vdGlvbiBlc3RpbWF0aW9uOyAKLSAqICAgICAgICAgICAgICAgICAgICAwPXJvdW5kaW5nIGNvbnRyb2wgZGlzYWJsZWQ7IDE9cm91bmRpbmcgY29udHJvbCBlbmFibGVkCi0gKiBbaW5dCXBTcmNEc3RNVgkJcG9pbnRlciB0byB0aGUgaW5pdGlhbCBNViBlc3RpbWF0ZTsgdHlwaWNhbGx5IGdlbmVyYXRlZCBkdXJpbmcgYSBwcmlvciAKLSAqICAgICAgICAgICAgICAgICAgMTZYMTYgaW50ZWdlciBzZWFyY2ggYW5kIGl0cyB1bml0IGlzIGhhbGYgcGl4ZWwuCi0gKiBbaW5dIEJsb2NrU2l6ZSAgICAgTWFjcm9CbG9jayBTaXplIGkuZSBlaXRoZXIgMTZ4MTYgb3IgOHg4LgotICogW291dF1wU3JjRHN0TVYJCXBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WCi0gKiBbb3V0XXBEc3RTQUQJCQlwb2ludGVyIHRvIG1pbmltdW0gU0FECi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1N0c19Ob0VyciCoQyBubyBlcnJvcgotICogT01YX1N0c19CYWRBcmdFcnIgqEMgYmFkIGFyZ3VtZW50cwotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZigKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgICBPTVhfSU5UIHJlZldpZHRoLAotICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAotICAgICBPTVhfSU5UIHJuZFZhbCwKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKLSAgICAgT01YX0lOVCAqcERzdFNBRCwKLSAgICAgT01YX1U4IEJsb2NrU2l6ZQotKTsKLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9QYWRNVgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgbW90aW9uIHZlY3RvciBwYWRkaW5nIGZvciBhIG1hY3JvYmxvY2suCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwU3JjRHN0TVYgICAgICAgcG9pbnRlciB0byBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBvZiB0aGUgY3VycmVudAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrCi0gKiBbaW5dIHBUcmFuc3AgICAgICAgICBwb2ludGVyIHRvIHRyYW5zcGFyZW50IHN0YXR1cyBidWZmZXIgb2YgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgbWFjcm9ibG9jawotICogW291dF0gICAgcFNyY0RzdE1WICAgICAgIHBvaW50ZXIgdG8gbW90aW9uIHZlY3RvciBidWZmZXIgaW4gd2hpY2ggdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3JzIGhhdmUgYmVlbiBwYWRkZWQKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX1BhZE1WKAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqIHBTcmNEc3RNViwKLSAgICAgT01YX1U4ICogcFRyYW5zcAotKTsKLQotLyogCi0gKiBILjI2NCBTcGVjaWZpYyBEZWNsYXJhdGlvbnMgCi0gKi8KLS8qIERlZmluZXMgKi8KLSNkZWZpbmUgQVJNX000UDEwX1FfT0ZGU0VUICAgICAgICAoMTUpCi0KLQotLyogRGVxdWFudCB0YWJsZXMgKi8KLQotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFsxNl07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfUG9zVG9WQ29sMngyWzRdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ZNYXRyaXhbNl1bM107Ci1leHRlcm4gY29uc3QgT01YX1UzMiBhcm1WQ000UDEwX01GTWF0cml4WzZdWzNdOwotCi0KLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybSB0aGUgd29yayByZXF1aXJlZCBieSB0aGUgT3Blbk1BWAotICogRGVjb2RlQ29lZmZzVG9QYWlyIGZ1bmN0aW9uIGFuZCBEZWNvZGVDaHJvbWFEQ0NvZWZmc1RvUGFpci4KLSAqIFNpbmNlIG1vc3Qgb2YgdGhlIGNvZGUgaXMgY29tbW9uIHdlIHNoYXJlIGl0IGhlcmUuCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBCaXRTdHJlYW0JCURvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlcgotICogW2luXQlwT2Zmc2V0CQkJUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKgkJCQkJCQkJdG8gYnkgKnBwQml0U3RyZWFtCi0gKiBbaW5dCXNNYXhOdW1Db2VmZglNYXhpbXVtIG51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgaW4gY3VycmVudAotICoJCQkJCQkJCWJsb2NrICg0LDE1IG9yIDE2KQotICogW2luXQluVGFibGUgICAgICAgICAgVGFibGUgbnVtYmVyICgwIHRvIDQpIGFjY29yZGluZyB0byB0aGUgZml2ZSBjb2x1bW5zCi0gKiAgICAgICAgICAgICAgICAgICAgICBvZiBUYWJsZSA5LTUgaW4gdGhlIEguMjY0IHNwZWMKLSAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKLSAqIFtvdXRdCXBPZmZzZXQJCQkqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAotICogW291dF0JcE51bUNvZWZmCQlQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4KLSAqCQkJCQkJCQl0aGlzIGJsb2NrCi0gKiBbb3V0XQlwcFBvc0NvZWZidWYJRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwKLSAqCQkJCQkJCQljb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlcgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLQotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcigKLSAgICAgY29uc3QgT01YX1U4KiogcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9TMzIqIHBPZmZzZXQsCi0gICAgIE9NWF9VOCogcE51bUNvZWZmLAotICAgICBPTVhfVTgqKnBwUG9zQ29lZmJ1ZiwKLSAgICAgT01YX0lOVCBuVGFibGUsCi0gICAgIE9NWF9JTlQgc01heE51bUNvZWZmICAgICAgICAKLSApOwotCi0vKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtIERDIHN0eWxlIGludHJhIHByZWRpY3Rpb24sIGF2ZXJhZ2luZyB1cHBlciBhbmQgbGVmdCBibG9jawotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBTcmNMZWZ0CQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgbGVmdCBjb2VmZmljaWVudHM6Ci0gKgkJCQkJCQkJcFt4LCB5XSAoeCA9IC0xLCB5ID0gMC4uMykKLSAqIFtpbl0JcFNyY0Fib3ZlCQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgYWJvdmUgY29lZmZpY2llbnRzOgotICoJCQkJCQkJCXBbeCx5XSAoeCA9IDAuLjMsIHkgPSAtMSkKLSAqIFtpbl0JbGVmdFN0ZXAJCVN0ZXAgb2YgbGVmdCBjb2VmZmljaWVudCBidWZmZXIKLSAqIFtpbl0JZHN0U3RlcAkJCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICogW2luXQlhdmFpbGFiaWxpdHkJTmVpZ2hib3JpbmcgMTZ4MTYgTUIgYXZhaWxhYmlsaXR5IGZsYWcKLSAqIFtvdXRdCXBEc3QJCQlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBOb25lCi0gKi8KLQotdm9pZCBhcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDNHg0KAotICAgICBjb25zdCBPTVhfVTgqIHBTcmNMZWZ0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKLSAgICAgT01YX1U4KiBwRHN0LAotICAgICBPTVhfSU5UIGxlZnRTdGVwLAotICAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5ICAgICAgICAKLSk7Ci0KLS8qCi0gKiBEZXNjcmlwdGlvbgotICogVW5wYWNrIGEgNHg0IGJsb2NrIG9mIGNvZWZmaWNpZW50LXJlc2lkdWFsIHBhaXIgdmFsdWVzCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBTcmMJRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpcgotICoJCQkJCQlidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCi0gKiBbb3V0XQlwcFNyYwkqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sKLSAqIFtvdXRdCXBEc3QJUG9pbnRlciB0byB1bnBhY2tlZCA0eDQgYmxvY2sKLSAqLwotCi12b2lkIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQoCi0gICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAotICAgICBPTVhfUzE2KiBwRHN0Ci0pOwotCi0vKgotICogRGVzY3JpcHRpb24KLSAqIFVucGFjayBhIDJ4MiBibG9jayBvZiBjb2VmZmljaWVudC1yZXNpZHVhbCBwYWlyIHZhbHVlcwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwU3JjCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIKLSAqCQkJCQkJYnVmZmVyIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZwotICogW291dF0JcHBTcmMJKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrCi0gKiBbb3V0XQlwRHN0CVBvaW50ZXIgdG8gdW5wYWNrZWQgNHg0IGJsb2NrCi0gKi8KLQotdm9pZCBhcm1WQ000UDEwX1VucGFja0Jsb2NrMngyKAotICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKLSAgICAgT01YX1MxNiogcERzdAotKTsKLQotLyoKLSAqIERlc2NyaXB0aW9uCi0gKiBEZWJsb2NrIG9uZSBib3VuZGFyeSBwaXhlbAotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBRMCAgICAgICAgIFBvaW50ZXIgdG8gcGl4ZWwgcTAKLSAqIFtpbl0gU3RlcCAgICAgICAgU3RlcCBiZXR3ZWVuIHBpeGVscyBxMCBhbmQgcTEKLSAqIFtpbl0gdEMwICAgICAgICAgRWRnZSB0aHJlc2hvbGQgdmFsdWUKLSAqIFtpbl0gYWxwaGEgICAgICAgYWxwaGEgdGhyZXNob2xkIHZhbHVlCi0gKiBbaW5dIGJldGEgICAgICAgIGJldGEgdGhyZXNob2xkIHZhbHVlCi0gKiBbaW5dIGJTICAgICAgICAgIGRlYmxvY2tpbmcgc3RyZW5ndGgKLSAqIFtpbl0gQ2hyb21hRmxhZyAgVHJ1ZSBmb3IgY2hyb21hIGJsb2NrcwotICogW291dF0gcFEwICAgICAgICBEZWJsb2NrZWQgcGl4ZWxzCi0gKiAKLSAqLwotCi12b2lkIGFybVZDTTRQMTBfRGVCbG9ja1BpeGVsKAotICAgIE9NWF9VOCAqcFEwLCAgICAvKiBwb2ludGVyIHRvIHRoZSBwaXhlbCBxMCAqLwotICAgIGludCBTdGVwLCAgICAgICAvKiBzdGVwIGJldHdlZW4gcGl4ZWxzIHEwIGFuZCBxMSAqLwotICAgIGludCB0QzAsICAgICAgICAvKiBlZGdlIHRocmVzaG9sZCB2YWx1ZSAqLwotICAgIGludCBhbHBoYSwgICAgICAvKiBhbHBoYSAqLwotICAgIGludCBiZXRhLCAgICAgICAvKiBiZXRhICovCi0gICAgaW50IGJTLCAgICAgICAgIC8qIGRlYmxvY2tpbmcgc3RyZW5ndGggKi8KLSAgICBpbnQgQ2hyb21hRmxhZwotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBob3Jpem9udGFsIDEvMi1wZWwgcG9zaXRpb25zCi0gKgotICogUmVtYXJrczoKLSAqCi0gKglbaW5dCXBTcmMJCQlQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAotIAkJCQkJCQkJCQkJCQlpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQotICoJW2luXQlpU3JjU3RlcAlTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgotICoJW2luXQlpRHN0U3RlcAlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCi0gKglbaW5dCWlXaWR0aAkJV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqCVtpbl0JaUhlaWdodAkJSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKglbb3V0XQlwRHN0CSAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgMS8yLXBlbCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hKAotICAgICAgICBjb25zdCBPTVhfVTgqCQlwU3JjLCAKLQkJT01YX1UzMiAJaVNyY1N0ZXAsIAotCQlPTVhfVTgqIAlwRHN0LCAKLQkJT01YX1UzMiAJaURzdFN0ZXAsIAotCQlPTVhfVTMyIAlpV2lkdGgsIAotCQlPTVhfVTMyIAlpSGVpZ2h0Ci0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB2ZXJ0aWNhbCAxLzItcGVsIHBvc2l0aW9ucyAKLSAqIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICoJW2luXQlwU3JjCQkJUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSAKLSAqCQkJCQkJCQkJCQkJaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKLSAqCVtpbl0JaVNyY1N0ZXAJU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KLSAqCVtpbl0JaURzdFN0ZXAJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgotICoJW2luXQlpV2lkdGgJCVdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKglbaW5dCWlIZWlnaHQJCUhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jawotICoJW291dF0JcERzdCAgICAJUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIDEvMi1wZWwKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hKAkKLQkgY29uc3QgT01YX1U4KiAJcFNyYywgCi0JIE9NWF9VMzIgCWlTcmNTdGVwLCAKLSAJIE9NWF9VOCogCXBEc3QsCi0gCSBPTVhfVTMyIAlpRHN0U3RlcCwgCi0gCSBPTVhfVTMyIAlpV2lkdGgsIAotIAkgT01YX1UzMiAJaUhlaWdodAotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yICgxLzIsIDEvMikgIHBvc2l0aW9ucyAKLSAqIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogIFtpbl0gICAgcFNyYyAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCi0gKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgotICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgotICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtvdXRdICAgcERzdCAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlICgxLzIsMS8yKS1wZWwKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYSggIAotICAgICAgICBjb25zdCBPTVhfVTgqICAgICBwU3JjLCAKLSAgICAgICAgT01YX1UzMiAgICAgaVNyY1N0ZXAsIAotICAgICAgICBPTVhfVTgqICAgICBwRHN0LCAKLSAgICAgICAgT01YX1UzMiAgICAgaURzdFN0ZXAsCi0gICAgICAgIE9NWF9VMzIgICAgIGlXaWR0aCwgCi0gICAgICAgIE9NWF9VMzIgICAgIGlIZWlnaHQKLSk7Ci0KLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRyYW5zZm9ybSBSZXNpZHVhbCA0eDQgQ29lZmZpY2llbnRzCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIHBTcmMJCVNvdXJjZSA0eDQgYmxvY2sKLSAqIFtvdXRdIHBEc3QJCURlc3RpbmF0aW9uIDR4NCBibG9jawotICoKLSAqLwotCi12b2lkIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQoT01YX1MxNiogcERzdCwgT01YX1MxNiAqcFNyYyk7Ci0KLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEZvcndhcmQgVHJhbnNmb3JtIFJlc2lkdWFsIDR4NCBDb2VmZmljaWVudHMKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgcFNyYwkJU291cmNlIDR4NCBibG9jawotICogW291dF0gcERzdAkJRGVzdGluYXRpb24gNHg0IGJsb2NrCi0gKgotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9Gd2RUcmFuc2Zvcm1SZXNpZHVhbDR4NChPTVhfUzE2KiBwRHN0LCBPTVhfUzE2ICpwU3JjKTsKLQotT01YX0lOVCBhcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NViAoCi0gICAgT01YX1MxNiAgbXZYLAotICAgIE9NWF9TMTYgIG12WSwKLSAgICBPTVhWQ01vdGlvblZlY3RvciBkaWZmTVYsIAotICAgIE9NWF9JTlQgY2FuZFNBRCwgCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKmJlc3RNViwgCi0gICAgT01YX1UzMiBuTGFtZGEsCi0gICAgT01YX1MzMiAqcEJlc3RDb3N0KTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNDT01NX1NBRAotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGUgdGhlIFNBRCBmb3IgTnhNIGJsb2Nrcy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFtpbl0JCXBTcmNPcmcJCVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrCi0gKiBbaW5dCQlpU3RlcE9yZwlTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIKLSAqIFtpbl0JCXBTcmNSZWYJCVBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jawotICogW2luXQkJaVN0ZXBSZWYJU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlcgotICogW2luXQkJaUhlaWdodAkJSGVpZ2h0IG9mIHRoZSBibG9jawotICogW2luXQkJaVdpZHRoCQlXaWR0aCBvZiB0aGUgYmxvY2sKLSAqIFtvdXRdCXBEc3RTQUQJCVBvaW50ZXIgb2YgcmVzdWx0IFNBRAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLU9NWFJlc3VsdCBhcm1WQ0NPTU1fU0FEKAkKLQljb25zdCBPTVhfVTgqIAlwU3JjT3JnLAotCU9NWF9VMzIgCWlTdGVwT3JnLAotCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYsCi0JT01YX1UzMiAJaVN0ZXBSZWYsCi0JT01YX1MzMioJcERzdFNBRCwKLQlPTVhfVTMyCQlpSGVpZ2h0LAotCU9NWF9VMzIJCWlXaWR0aCk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDQ09NTV9BdmVyYWdlCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIGJsb2NrcyBhbmQgc3RvcmVzIHRoZSByZXN1bHQuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKglbaW5dCXBQcmVkMAkJCVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMAotICoJW2luXQlwUHJlZDEJCQlQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEKLSAqCVtpbl0JaVByZWRTdGVwMAkgICAgU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMAotICoJW2luXQlpUHJlZFN0ZXAxCSAgICBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxCi0gKglbaW5dCWlEc3RTdGVwIAkJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCi0gKglbaW5dCWlXaWR0aAkJCVdpZHRoIG9mIHRoZSBibG9ja3MKLSAqCVtpbl0JaUhlaWdodAkJCUhlaWdodCBvZiB0aGUgYmxvY2tzCi0gKglbb3V0XQlwRHN0UHJlZAkJUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotIE9NWFJlc3VsdCBhcm1WQ0NPTU1fQXZlcmFnZSAoCi0JIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDAsCi0JIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDEsCQotCSBPTVhfVTMyCQlpUHJlZFN0ZXAwLAotCSBPTVhfVTMyCQlpUHJlZFN0ZXAxLAotCSBPTVhfVTgqCQlwRHN0UHJlZCwKLQkgT01YX1UzMgkJaURzdFN0ZXAsIAotCSBPTVhfVTMyCQlpV2lkdGgsCi0JIE9NWF9VMzIJCWlIZWlnaHQKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfU0FEUXVhcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgCi0gKiBhdmVyYWdlIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFtpbl0JCXBTcmMJCQkJUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2sKLSAqIFtpbl0JCXBTcmNSZWYwCQlQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwCi0gKiBbaW5dCQlwU3JjUmVmMQkJUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMQotICogW2luXQkJaVNyY1N0ZXAgCQlTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIKLSAqIFtpbl0JCWlSZWZTdGVwMAkJU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqIFtpbl0JCWlSZWZTdGVwMSAJU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqIFtpbl0JCWlIZWlnaHQJCQlIZWlnaHQgb2YgdGhlIGJsb2NrCi0gKiBbaW5dCQlpV2lkdGgJCQlXaWR0aCBvZiB0aGUgYmxvY2sKLSAqIFtvdXRdCXBEc3RTQUQJCQlQb2ludGVyIG9mIHJlc3VsdCBTQUQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi1PTVhSZXN1bHQgYXJtVkNNNFAxMF9TQURRdWFyKAotCWNvbnN0IE9NWF9VOCogCXBTcmMsCi0gICAgY29uc3QgT01YX1U4KiAJcFNyY1JlZjAsCi0JY29uc3QgT01YX1U4KiAJcFNyY1JlZjEsCQotICAgIE9NWF9VMzIgCWlTcmNTdGVwLAotICAgIE9NWF9VMzIJCWlSZWZTdGVwMCwKLSAgICBPTVhfVTMyCQlpUmVmU3RlcDEsCi0gICAgT01YX1UzMioJcERzdFNBRCwKLSAgICBPTVhfVTMyICAgICBpSGVpZ2h0LAotICAgIE9NWF9VMzIgICAgIGlXaWR0aAotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgY2hyb21hIGNvbXBvbmVudHMuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiAgW2luXSAgICBwU3JjICAgICAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCi0gKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgotICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgotICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgZHggICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS84IHBpeGVsIHVuaXQgKDB+NykgCi0gKiAgW2luXSAgICBkeSAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS84IHBpeGVsIHVuaXQgKDB+NykKLSAqICBbb3V0XSAgIHBEc3QgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlcgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLSBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEoCi0gICAgICAgIE9NWF9VOCAgICAgICpwU3JjLAotICAgICAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwKLSAgICAgICAgT01YX1U4ICAgICAgKnBEc3QsCi0gICAgICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLAotICAgICAgICBPTVhfVTMyICAgICBpV2lkdGgsCi0gICAgICAgIE9NWF9VMzIgICAgIGlIZWlnaHQsCi0gICAgICAgIE9NWF9VMzIgICAgIGR4LAotICAgICAgICBPTVhfVTMyICAgICBkeQotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGx1bWEgY29tcG9uZW50cy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqICBbaW5dICAgIHBTcmMgICAgICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGUgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKLSAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCi0gKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBkeCAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgdW5pdCAoMH4zKSAKLSAqICBbaW5dICAgIGR5ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgdW5pdCAoMH4zKSAKLSAqICBbb3V0XSAgIHBEc3QgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlcgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLQotIE9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEoCi0gICAgIGNvbnN0IE9NWF9VOCAgICAgKnBTcmMsCi0gICAgIE9NWF9VMzIgICAgaVNyY1N0ZXAsCi0gICAgIE9NWF9VOCAgICAgKnBEc3QsCi0gICAgIE9NWF9VMzIgICAgaURzdFN0ZXAsCi0gICAgIE9NWF9VMzIgICAgaVdpZHRoLAotICAgICBPTVhfVTMyICAgIGlIZWlnaHQsCi0gICAgIE9NWF9VMzIgICAgZHgsCi0gICAgIE9NWF9VMzIgICAgZHkKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IG9teFZDSDI2NF9EZXF1YW50VHJhbnNmb3JtQUNGcm9tUGFpcl9VOF9TMTZfQzFfREx4Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWNvbnN0cnVjdCB0aGUgNHg0IHJlc2lkdWFsIGJsb2NrIGZyb20gY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIsCi0gKiBwZXJmb3JtIGRlcXVhbnRpc2F0aW9uIGFuZCBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24gZm9yIDR4NCBibG9jayBvZgotICogcmVzaWR1YWxzIGFuZCB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgYmxvY2suCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcFNyYwkJRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24KLSAqCQkJCQkJCXBhaXIgYnVmZmVyIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZwotICogW2luXQlwREMJCQlQb2ludGVyIHRvIHRoZSBEQyBjb2VmZmljaWVudCBvZiB0aGlzIGJsb2NrLCBOVUxMCi0gKgkJCQkJCQlpZiBpdCBkb2Vzbid0IGV4aXN0Ci0gKiBbaW5dCVFQCQkJUXVhbnRpemF0aW9uIHBhcmFtZXRlcgotICogW2luXSBBQyAgICAgICAgICBGbGFnIGluZGljYXRpbmcgaWYgYXQgbGVhc3Qgb25lIG5vbi16ZXJvIGNvZWZmaWNpZW50IGV4aXN0cwotICogW291dF0JcERzdAkJcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCA0eDQgYmxvY2sgZGF0YQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1BQ0Zyb21QYWlyX1U4X1MxNl9DMV9ETHgoCi0gICAgIE9NWF9VOCAqKnBwU3JjLAotICAgICBPTVhfUzE2ICpwRHN0LAotICAgICBPTVhfSU5UIFFQLAotICAgICBPTVhfUzE2KiBwREMsCi0gICAgIGludCBBQwotKTsKLQotI2VuZGlmICAvKl9hcm1WaWRlb19IXyovCi0KLS8qRW5kIG9mIEZpbGUqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL2FybVZDQ09NTV9zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL2FybVZDQ09NTV9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZDQ2NDQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDQ09NTV9zLmgKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotOy8vIEFSTSBvcHRpbWl6ZWQgT3Blbk1BWCBBQyBoZWFkZXIgZmlsZQotOy8vIAotOy8vIEZvcm11bGEgdXNlZDoKLTsvLyBNQUNSTyBmb3IgY2FsY3VsYXRpbmcgbWVkaWFuIGZvciB0aHJlZSB2YWx1ZXMuCi0KLQotCi0gICAgSUYgOkxOT1Q6OkRFRjpBUk1WQ0NPTU1fU19ICi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICBNX1ZBUklBTlRTICAgICAgQ29ydGV4QTgsIEFSTTExMzZKUwotICAgIAotICAgIElGIEFSTTExMzZKUyA6TE9SOiBDb3J0ZXhBOCAKLSAgICAgCi0gICAgIDsvLy8qCi0gICAgIDsvLyAqIE1hY3JvOiBNX01FRElBTjMKLSAgICAgOy8vICoKLSAgICAgOy8vICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBtZWRpYW4gb2YgdGhyZWUgbnVtYmVycwotICAgICA7Ly8gKiAKLSAgICAgOy8vICogUmVtYXJrczoKLSAgICAgOy8vICoKLSAgICAgOy8vICogUGFyYW1ldGVyczoKLSAgICAgOy8vICogW2luXSB4ICAgICBGaXJzdCBlbnRyeSBmb3IgdGhlIGxpc3Qgb2YgdGhyZWUgbnVtYmVycy4KLSAgICAgOy8vICogW2luXSB5ICAgICBTZWNvbmQgZW50cnkgZm9yIHRoZSBsaXN0IG9mIHRocmVlIG51bWJlcnMuCi0gICAgIDsvLyAqICAgICAgICAgICAgSW5wdXQgdmFsdWUgbWF5IGJlIGNvcnJ1cHRlZCBhdCB0aGUgZW5kIG9mCi0gICAgIDsvLyAqICAgICAgICAgICAgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIG1hY3JvLgotICAgICA7Ly8gKiBbaW5dIHogICAgIFRoaXJkIGVudHJ5IG9mIHRoZSBsaXN0IG9mIHRocmVlIG51bWJlcnMuCi0gICAgIDsvLyAqICAgICAgICAgICAgSW5wdXQgdmFsdWUgY29ycnVwdGVkIGF0IHRoZSBlbmQgb2YgdGhlIAotICAgICA7Ly8gKiAgICAgICAgICAgIGV4ZWN1dGlvbiBvZiB0aGlzIG1hY3JvLgotICAgICA7Ly8gKiBbaW5dIHQgICAgIFRlbXBvcmFyeSBzY3JhdGNoICByZWdpc3Rlci4KLSAgICAgOy8vICogW291dF16ICAgICBNZWRpYW4gb2YgdGhlIHRocmVlIG51bWJlcnMuICAgICAgIAotICAgICA7Ly8gKi8KLSAgICAgCi0gICAgIE1BQ1JPCi0KLSAgICAgTV9NRURJQU4zICR4LCAkeSwgJHosICR0IAotICAgICAKLSAgICAgU1VCUyAgJHQsICR5LCAkejsgLy8gaWYgKHkgPCB6KQotICAgICBBRERMVCAkeiwgJHosICR0OyAvLyAgc3dhcCB5IGFuZCB6Ci0gICAgIFNVQkxUICR5LCAkeSwgJHQ7Ci0KLSAgICAgOy8vIE5vdyB6JyA8PSB5Jywgc28gdGhlcmUgYXJlIHRocmVlIGNhc2VzIGZvciB0aGUKLSAgICAgOy8vIG1lZGlhbiB2YWx1ZSwgZGVwZW5kaW5nIG9uIHguCi0KLSAgICAgOy8vIDEpIHggPD0geicgICAgICA8PSB5JyAgICAgIDogbWVkaWFuIHZhbHVlIGlzIHonCi0gICAgIDsvLyAyKSAgICAgIHonIDw9IHggPD0geScgICAgICA6IG1lZGlhbiB2YWx1ZSBpcyB4Ci0gICAgIDsvLyAzKSAgICAgIHonICAgICAgPD0geScgPD0geCA6IG1lZGlhbiB2YWx1ZSBpcyB5JwotCi0gICAgIENNUCAgICR6LCAkeDsgICAgIC8vIGlmICggeCA+IG1pbih5LHopICkKLSAgICAgTU9WTFQgJHosICR4OyAgICAgLy8gYW5zID0geCAKLQotICAgICBDTVAgICAkeCwgJHk7ICAgICAvLyBpZiAoIHggPiBtYXgoeSx6KSApCi0gICAgIE1PVkdUICR6LCAkeTsgICAgIC8vIGFucyA9IG1heCh5LHopCi0gICAgIAotICAgICBNRU5ECi0gICAgRU5ESUYgICAgICAKLSAgICAKLSAgICAKLSAgICAgICAgCi0gICAgRU5ESUYgOy8vIEFSTUFDQ09NTV9TX0gKLQotIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9vbXhWQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2FwaS9vbXhWQy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjNjYzcyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9hcGkvb214VkMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzODEgKzAsMCBAQAotLyoqCi0gKiBGaWxlOiBvbXhWQy5oCi0gKiBCcmllZjogT3Blbk1BWCBETCB2MS4wLjIgLSBWaWRlbyBDb2RpbmcgbGlicmFyeQotICoKLSAqIENvcHlyaWdodCCpIDIwMDUtMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICoKLSAqIFRoZXNlIG1hdGVyaWFscyBhcmUgcHJvdGVjdGVkIGJ5IGNvcHlyaWdodCBsYXdzIGFuZCBjb250YWluIG1hdGVyaWFsIAotICogcHJvcHJpZXRhcnkgdG8gdGhlIEtocm9ub3MgR3JvdXAsIEluYy4gIFlvdSBtYXkgdXNlIHRoZXNlIG1hdGVyaWFscyAKLSAqIGZvciBpbXBsZW1lbnRpbmcgS2hyb25vcyBzcGVjaWZpY2F0aW9ucywgd2l0aG91dCBhbHRlcmluZyBvciByZW1vdmluZyAKLSAqIGFueSB0cmFkZW1hcmssIGNvcHlyaWdodCBvciBvdGhlciBub3RpY2UgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbi4KLSAqIAotICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCByZXByZXNlbnRhdGlvbnMgCi0gKiBvciB3YXJyYW50aWVzLCBleHByZXNzIG9yIGltcGxpZWQsIHJlZ2FyZGluZyB0aGVzZSBtYXRlcmlhbHMsIGluY2x1ZGluZywgCi0gKiB3aXRob3V0IGxpbWl0YXRpb24sIGFueSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgCi0gKiBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2Ugb3Igbm9uLWluZnJpbmdlbWVudCBvZiBhbnkgaW50ZWxsZWN0dWFsIHByb3BlcnR5LiAKLSAqIEtocm9ub3MgR3JvdXAgbWFrZXMgbm8sIGFuZCBleHByZXNzbHkgZGlzY2xhaW1zIGFueSwgd2FycmFudGllcywgZXhwcmVzcyAKLSAqIG9yIGltcGxpZWQsIHJlZ2FyZGluZyB0aGUgY29ycmVjdG5lc3MsIGFjY3VyYWN5LCBjb21wbGV0ZW5lc3MsIHRpbWVsaW5lc3MsIAotICogYW5kIHJlbGlhYmlsaXR5IG9mIHRoZXNlIG1hdGVyaWFscy4gCi0gKgotICogVW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyB3aWxsIHRoZSBLaHJvbm9zIEdyb3VwLCBvciBhbnkgb2YgaXRzIFByb21vdGVycywgCi0gKiBDb250cmlidXRvcnMgb3IgTWVtYmVycyBvciB0aGVpciByZXNwZWN0aXZlIHBhcnRuZXJzLCBvZmZpY2VycywgZGlyZWN0b3JzLCAKLSAqIGVtcGxveWVlcywgYWdlbnRzIG9yIHJlcHJlc2VudGF0aXZlcyBiZSBsaWFibGUgZm9yIGFueSBkYW1hZ2VzLCB3aGV0aGVyIAotICogZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgZm9yIGxvc3QgcmV2ZW51ZXMsIAotICogbG9zdCBwcm9maXRzLCBvciBvdGhlcndpc2UsIGFyaXNpbmcgZnJvbSBvciBpbiBjb25uZWN0aW9uIHdpdGggdGhlc2UgCi0gKiBtYXRlcmlhbHMuCi0gKiAKLSAqIEtocm9ub3MgYW5kIE9wZW5NQVggYXJlIHRyYWRlbWFya3Mgb2YgdGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKLSAqCi0gKi8KLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX09NWFZDX0hfCi0jZGVmaW5lIF9PTVhWQ19IXwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0KLS8qIDYuMS4xLjEgTW90aW9uIFZlY3RvcnMgICovCi0vKiBJbiBvbXhWQywgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX1MxNiBkeDsKLSAgICBPTVhfUzE2IGR5OwotfSBPTVhWQ01vdGlvblZlY3RvcjsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQXZlcmFnZV84eCAgICg2LjEuMy4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIDh4NCwgOHg4LCBvciA4eDE2IGJsb2Nrcy4gIFRoZSAKLSAqIHJlc3VsdCBpcyByb3VuZGVkIGFjY29yZGluZyB0byAoYStiKzEpLzIuICBUaGUgYmxvY2sgYXZlcmFnZSBmdW5jdGlvbiBjYW4gCi0gKiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggaGFsZi1waXhlbCBpbnRlcnBvbGF0aW9uIHRvIG9idGFpbiBxdWFydGVyIAotICogcGl4ZWwgbW90aW9uIGVzdGltYXRlcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0xMF0sIHN1YmNsYXVzZSA4LjQuMi4yLjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBQcmVkMCAgICAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBQcmVkMSAgICAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlQcmVkU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBpUHJlZFN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaURzdFN0ZXAgICAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gCi0gKiAgIGlIZWlnaHQgICAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrcyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFByZWQgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIDgtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwUHJlZDAsIHBQcmVkMSwgb3IgCi0gKiAgICAgICAgICAgICAgcERzdFByZWQuIAotICogICAgLSAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICAtICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgaVByZWRTdGVwMSA8PSAwIG9yIGlQcmVkU3RlcDEgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgaURzdFN0ZXAgICA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgIGlIZWlnaHQgaXMgbm90IDQsIDgsIG9yIDE2LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fQXZlcmFnZV84eCAoCi0gICAgY29uc3QgT01YX1U4ICpwUHJlZDAsCi0gICAgY29uc3QgT01YX1U4ICpwUHJlZDEsCi0gICAgT01YX1UzMiBpUHJlZFN0ZXAwLAotICAgIE9NWF9VMzIgaVByZWRTdGVwMSwKLSAgICBPTVhfVTggKnBEc3RQcmVkLAotICAgIE9NWF9VMzIgaURzdFN0ZXAsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9BdmVyYWdlXzE2eCAgICg2LjEuMy4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIDE2eDE2IG9yIDE2eDggYmxvY2tzLiAgVGhlIAotICogcmVzdWx0IGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gIFRoZSBibG9jayBhdmVyYWdlIGZ1bmN0aW9uIGNhbiAKLSAqIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBoYWxmLXBpeGVsIGludGVycG9sYXRpb24gdG8gb2J0YWluIHF1YXJ0ZXIgCi0gKiBwaXhlbCBtb3Rpb24gZXN0aW1hdGVzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTEwXSwgc3ViY2xhdXNlIDguNC4yLjIuMS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFByZWQwIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwUHJlZDEgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlQcmVkU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBpUHJlZFN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrcyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFByZWQgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFByZWQwLCBwUHJlZDEsIG9yIAotICogICAgICAgICAgICAgIHBEc3RQcmVkLiAKLSAqICAgIC0gICBwRHN0UHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICAgLSAgIGlQcmVkU3RlcDAgPD0gMCBvciBpUHJlZFN0ZXAwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIC0gICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICAtICAgaURzdFN0ZXAgPD0gMCBvciBpRHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICAtICAgaUhlaWdodCBpcyBub3QgOCBvciAxNi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICgKLSAgICBjb25zdCBPTVhfVTggKnBQcmVkMCwKLSAgICBjb25zdCBPTVhfVTggKnBQcmVkMSwKLSAgICBPTVhfVTMyIGlQcmVkU3RlcDAsCi0gICAgT01YX1UzMiBpUHJlZFN0ZXAxLAotICAgIE9NWF9VOCAqcERzdFByZWQsCi0gICAgT01YX1UzMiBpRHN0U3RlcCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0V4cGFuZEZyYW1lX0kgICAoNi4xLjMuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBleHBhbmRzIGEgcmVjb25zdHJ1Y3RlZCBmcmFtZSBpbi1wbGFjZS4gIFRoZSB1bmV4cGFuZGVkIAotICogc291cmNlIGZyYW1lIHNob3VsZCBiZSBzdG9yZWQgaW4gYSBwbGFuZSBidWZmZXIgd2l0aCBzdWZmaWNpZW50IHNwYWNlIAotICogcHJlLWFsbG9jYXRlZCBmb3IgZWRnZSBleHBhbnNpb24sIGFuZCB0aGUgaW5wdXQgZnJhbWUgc2hvdWxkIGJlIGxvY2F0ZWQgaW4gCi0gKiB0aGUgcGxhbmUgYnVmZmVyIGNlbnRlci4gIFRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgdGhlIHBpeGVsIGV4cGFuc2lvbiBieSAKLSAqIHJlcGxpY2F0aW5nIHNvdXJjZSBmcmFtZSBlZGdlIHBpeGVsIGludGVuc2l0aWVzIGluIHRoZSBlbXB0eSBwaXhlbCAKLSAqIGxvY2F0aW9ucyAoZXhwYW5zaW9uIHJlZ2lvbikgYmV0d2VlbiB0aGUgc291cmNlIGZyYW1lIGVkZ2UgYW5kIHRoZSBwbGFuZSAKLSAqIGJ1ZmZlciBlZGdlLiAgVGhlIHdpZHRoL2hlaWdodCBvZiB0aGUgZXhwYW5zaW9uIHJlZ2lvbnMgb24gdGhlIAotICogaG9yaXpvbnRhbC92ZXJ0aWNhbCBlZGdlcyBpcyBjb250cm9sbGVkIGJ5IHRoZSBwYXJhbWV0ZXIgaUV4cGFuZFBlbHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RQbGFuZSAtIHBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZnJhbWUgdG8gYmUgCi0gKiAgICAgICAgICAgIGV4cGFuZGVkOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgaUZyYW1lV2lkdGggLSBmcmFtZSB3aWR0aDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBpRnJhbWVIZWlnaHQgLWZyYW1lIGhlaWdodDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBpRXhwYW5kUGVscyAtIG51bWJlciBvZiBwaXhlbHMgdG8gYmUgZXhwYW5kZWQgaW4gdGhlIGhvcml6b250YWwgYW5kIAotICogICAgICAgICAgICB2ZXJ0aWNhbCBkaXJlY3Rpb25zOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGlQbGFuZVN0ZXAgLSBkaXN0YW5jZSwgaW4gYnl0ZXMsIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIAotICogICAgICAgICAgICBpbiB0aGUgcGxhbmUgYnVmZmVyOyBtdXN0IGJlIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIAotICogICAgICAgICAgICAoaUZyYW1lV2lkdGggKyAyICogaUV4cGFuZFBlbHMpLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdFBsYW5lIC1Qb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGZyYW1lIChOT1QgdGhlIAotICogICAgICAgICAgICB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIHBsYW5lKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICAgcFNyY0RzdFBsYW5lIGlzIE5VTEwuIAotICogICAgLSAgICBwU3JjRHN0UGxhbmUgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIC0gICAgb25lIG9mIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBpcyBlaXRoZXIgZXF1YWwgdG8gemVybyBvciBpcyBhIAotICogICAgICAgICAgICAgIG5vbi1tdWx0aXBsZSBvZiA4OiBpRnJhbWVIZWlnaHQsIGlGcmFtZVdpZHRoLCBpUGxhbmVTdGVwLCBvciAKLSAqICAgICAgICAgICAgICBpRXhwYW5kUGVscy4gCi0gKiAgICAtICAgIGlQbGFuZVN0ZXAgPCAoaUZyYW1lV2lkdGggKyAyICogaUV4cGFuZFBlbHMpLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSAoCi0gICAgT01YX1U4ICpwU3JjRHN0UGxhbmUsCi0gICAgT01YX1UzMiBpRnJhbWVXaWR0aCwKLSAgICBPTVhfVTMyIGlGcmFtZUhlaWdodCwKLSAgICBPTVhfVTMyIGlFeHBhbmRQZWxzLAotICAgIE9NWF9VMzIgaVBsYW5lU3RlcAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29weTh4OCAgICg2LjEuMy4zLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSA4eDggYmxvY2sgdG8gdGhlIGN1cnJlbnQgYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBzdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIGZyYW1lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDggYW5kIG11c3QgYmUgbGFyZ2VyIHRoYW4gCi0gKiAgICAgICAgICAgIG9yIGVxdWFsIHRvIDguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICAgIGJvdW5kYXJ5OiBwU3JjLCBwRHN0IAotICogICAgLSAgICBzdGVwIDw4IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0NvcHk4eDggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBzdGVwCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db3B5MTZ4MTYgICAoNi4xLjMuMy4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29waWVzIHRoZSByZWZlcmVuY2UgMTZ4MTYgbWFjcm9ibG9jayB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIG1hY3JvYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBzdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIGZyYW1lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IGFuZCBtdXN0IGJlIGxhcmdlciAKLSAqICAgICAgICAgICAgdGhhbiBvciBlcXVhbCB0byAxNi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBtYWNyb2Jsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSAKLSAqICAgICAgICAgICAgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgICBib3VuZGFyeTogcFNyYywgcERzdCAKLSAqICAgIC0gICAgc3RlcCA8MTYgb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0NvcHkxNngxNiAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIHN0ZXAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQgICAoNi4xLjQuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgdGV4dHVyZSBlcnJvciBvZiB0aGUgYmxvY2s7IGFsc28gcmV0dXJucyBTQUQuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgc3JjU3RlcCAtIHN0ZXAgb2YgdGhlIHNvdXJjZSBwbGFuZSAKLSAqICAgcFNyY1JlZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBidWZmZXIsIGFuIDh4OCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCBhbiA4eDggYmxvY2s7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIFN1bSBvZiBBYnNvbHV0ZSBEaWZmZXJlbmNlcyAoU0FEKSB2YWx1ZSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYsIHBEc3QgYW5kIHBEc3RTQUQuIAotICogICAgLSAgICBwU3JjIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIFNyY1N0ZXAgPD0gMCBvciBzcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9JTlQgc3JjU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfSU5UICpwRHN0U0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgICAoNi4xLjQuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgdGhlIHRleHR1cmUgZXJyb3Igb2YgdGhlIGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc291cmNlIHBsYW5lLiBUaGlzIHNob3VsZCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBzcmNTdGVwIC0gc3RlcCBvZiB0aGUgc291cmNlIHBsYW5lIAotICogICBwU3JjUmVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJ1ZmZlciwgYW4gOHg4IGJsb2NrLiBUaGlzIHNob3VsZCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCBhbiA4eDggYmxvY2suIFRoaXMgc2hvdWxkIGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjLCBwU3JjUmVmLCBwRHN0LiAKLSAqICAgIC0gICAgcFNyYyBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBTcmNTdGVwIDw9IDAgb3Igc3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX0lOVCBzcmNTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKLSAgICBPTVhfUzE2ICpwRHN0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0ICAgKDYuMS40LjEuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIExpbWl0cyB0aGUgbW90aW9uIHZlY3RvciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYmxvY2svbWFjcm9ibG9jayB0byAKLSAqIHByZXZlbnQgdGhlIG1vdGlvbiBjb21wZW5zYXRlZCBibG9jay9tYWNyb2Jsb2NrIGZyb20gbW92aW5nIG91dHNpZGUgYSAKLSAqIGJvdW5kaW5nIHJlY3RhbmdsZSBhcyBzaG93biBpbiBGaWd1cmUgNi0xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjTVYgLSBwb2ludGVyIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBibG9jayAKLSAqICAgICAgICAgICAgb3IgbWFjcm9ibG9jayAKLSAqICAgcFJlY3RWT1BSZWYgLSBwb2ludGVyIHRvIHRoZSBib3VuZGluZyByZWN0YW5nbGUgCi0gKiAgIFhjb29yZCwgWWNvb3JkICAtIGNvb3JkaW5hdGVzIG9mIHRoZSBjdXJyZW50IGJsb2NrIG9yIG1hY3JvYmxvY2sgCi0gKiAgIHNpemUgLSBzaXplIG9mIHRoZSBjdXJyZW50IGJsb2NrIG9yIG1hY3JvYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gOCBvciAKLSAqICAgICAgICAgICAgMTYuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBsaW1pdGVkIG1vdGlvbiB2ZWN0b3IgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjTVYsIHBEc3RNViwgb3IgcFJlY3RWT1BSZWYuIAotICogICAgLSAgICBzaXplIGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgOCBvciAxNi4gCi0gKiAgICAtICAgIHRoZSB3aWR0aCBvciBoZWlnaHQgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBpcyBsZXNzIHRoYW4gCi0gKiAgICAgICAgIHR3aWNlIHRoZSBibG9jayBzaXplLgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0xpbWl0TVZUb1JlY3QgKAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVYsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNViwKLSAgICBjb25zdCBPTVhSZWN0ICpwUmVjdFZPUFJlZiwKLSAgICBPTVhfSU5UIFhjb29yZCwKLSAgICBPTVhfSU5UIFljb29yZCwKLSAgICBPTVhfSU5UIHNpemUKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX1NBRF8xNnggICAoNi4xLjQuMS40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgZm9yIDE2eDE2IGFuZCAxNng4IGJsb2Nrcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlciAKLSAqICAgcFNyY1JlZiAgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCi0gKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKLSAqICAgaUhlaWdodCAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAotICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY09yZywgcERzdFNBRCwgb3IgcFNyY1JlZiAKLSAqICAgIC0gICAgcFNyY09yZyBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgaVN0ZXBPcmcgIDw9IDAgb3IgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgCi0gKiAgICAtICAgIGlTdGVwUmVmIDw9IDAgb3IgaVN0ZXBSZWYgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IDggb3IgMTYgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX1NBRF8xNnggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKLSAgICBPTVhfVTMyIGlTdGVwT3JnLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKLSAgICBPTVhfVTMyIGlTdGVwUmVmLAotICAgIE9NWF9TMzIgKnBEc3RTQUQsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9TQURfOHggICAoNi4xLjQuMS41KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgZm9yIDh4MTYsIDh4OCwgOHg0IGJsb2Nrcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZyAgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIAotICogICAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgaVN0ZXBPcmcgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIgCi0gKiAgIHBTcmNSZWYgIC0gUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIAotICogICBpU3RlcFJlZiAtIFN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIgCi0gKiAgIGlIZWlnaHQgIC0gSGVpZ2h0IG9mIHRoZSBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtUG9pbnRlciBvZiByZXN1bHQgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAotICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY09yZywgcERzdFNBRCwgb3IgcFNyY1JlZiAKLSAqICAgIC0gICAgcFNyY09yZyBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBpU3RlcE9yZyAgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IAotICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IDQsIDggb3IgMTYgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX1NBRF84eCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAotICAgIE9NWF9VMzIgaVN0ZXBPcmcsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAotICAgIE9NWF9VMzIgaVN0ZXBSZWYsCi0gICAgT01YX1MzMipwRHN0U0FELAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qIDYuMi4xLjEgRGlyZWN0aW9uICAqLwotLyogVGhlIGRpcmVjdGlvbiBlbnVtZXJhdG9yIGlzIHVzZWQgd2l0aCBmdW5jdGlvbnMgdGhhdCBwZXJmb3JtIEFDL0RDIHByZWRpY3Rpb24gYW5kIHppZy16YWcgc2Nhbi4gICovCi0KLWVudW0gewotICAgIE9NWF9WQ19OT05FICAgICAgID0gMCwKLSAgICBPTVhfVkNfSE9SSVpPTlRBTCA9IDEsCi0gICAgT01YX1ZDX1ZFUlRJQ0FMICAgPSAyIAotfTsKLQotCi0KLS8qIDYuMi4xLjIgQmlsaW5lYXIgSW50ZXJwb2xhdGlvbiAgKi8KLS8qIFRoZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGVudW1lcmF0b3IgaXMgdXNlZCB3aXRoIG1vdGlvbiBlc3RpbWF0aW9uLCBtb3Rpb24gY29tcGVuc2F0aW9uLCBhbmQgcmVjb25zdHJ1Y3Rpb24gZnVuY3Rpb25zLiAgKi8KLQotZW51bSB7Ci0gICAgT01YX1ZDX0lOVEVHRVJfUElYRUwgPSAwLCAvKiBjYXNlIGEgKi8KLSAgICBPTVhfVkNfSEFMRl9QSVhFTF9YICA9IDEsIC8qIGNhc2UgYiAqLwotICAgIE9NWF9WQ19IQUxGX1BJWEVMX1kgID0gMiwgLyogY2FzZSBjICovCi0gICAgT01YX1ZDX0hBTEZfUElYRUxfWFkgPSAzICAvKiBjYXNlIGQgKi8gCi19OwotCi0KLQotLyogNi4yLjEuMyBOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSAgKi8KLS8qIE5laWdoYm9yaW5nIG1hY3JvYmxvY2sgYXZhaWxhYmlsaXR5IGlzIGluZGljYXRlZCB1c2luZyB0aGUgZm9sbG93aW5nIGZsYWdzOiAgICovCi0KLWVudW0gewotICAgIE9NWF9WQ19VUFBFUiA9IDEsICAgICAgICAvKiogYWJvdmUgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KLSAgICBPTVhfVkNfTEVGVCA9IDIsICAgICAgICAgLyoqIGxlZnQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KLSAgICBPTVhfVkNfQ0VOVEVSID0gNCwKLSAgICBPTVhfVkNfUklHSFQgPSA4LAotICAgIE9NWF9WQ19MT1dFUiA9IDE2LAotICAgIE9NWF9WQ19VUFBFUl9MRUZUID0gMzIsICAvKiogYWJvdmUtbGVmdCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLwotICAgIE9NWF9WQ19VUFBFUl9SSUdIVCA9IDY0LCAvKiogYWJvdmUtcmlnaHQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KLSAgICBPTVhfVkNfTE9XRVJfTEVGVCA9IDEyOCwKLSAgICBPTVhfVkNfTE9XRVJfUklHSFQgPSAyNTYgCi19OwotCi0KLQotLyogNi4yLjEuNCBWaWRlbyBDb21wb25lbnRzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIHZpZGVvIGNvbXBvbmVudHMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfTFVNSU5BTkNFLCAgICAvKiogTHVtaW5hbmNlIGNvbXBvbmVudCAqLwotICAgIE9NWF9WQ19DSFJPTUlOQU5DRSAgIC8qKiBjaHJvbWluYW5jZSBjb21wb25lbnQgKi8gCi19IE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50OwotCi0KLQotLyogNi4yLjEuNSBNYWNyb2Jsb2NrVHlwZXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgbWFjcm9ibG9jayB0eXBlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ19JTlRFUiAgICAgPSAwLCAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCi0gICAgT01YX1ZDX0lOVEVSX1EgICA9IDEsIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KLSAgICBPTVhfVkNfSU5URVI0ViAgID0gMiwgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLwotICAgIE9NWF9WQ19JTlRSQSAgICAgPSAzLCAvKiogSSBhbmQgUCBwaWN0dXJlLCBJLSBhbmQgUC1WT1AgKi8KLSAgICBPTVhfVkNfSU5UUkFfUSAgID0gNCwgLyoqIEkgYW5kIFAgcGljdHVyZSwgSS0gYW5kIFAtVk9QICovCi0gICAgT01YX1ZDX0lOVEVSNFZfUSA9IDUgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKEguMjYzKSovCi19IE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlOwotCi0KLQotLyogNi4yLjEuNiBDb29yZGluYXRlcyAgKi8KLS8qIENvb3JkaW5hdGVzIGFyZSByZXByZXNlbnRlZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9JTlQgeDsKLSAgICBPTVhfSU5UIHk7Ci19IE9NWFZDTTRQMkNvb3JkaW5hdGU7Ci0KLQotCi0vKiA2LjIuMS43IE1vdGlvbiBFc3RpbWF0aW9uIEFsZ29yaXRobXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgbW90aW9uIGVzdGltYXRpb24gc2VhcmNoIG1ldGhvZHMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfTTRQMl9GQVNUX1NFQVJDSCA9IDAsICAvKiogRmFzdCBtb3Rpb24gc2VhcmNoICovCi0gICAgT01YX1ZDX000UDJfRlVMTF9TRUFSQ0ggPSAxICAgLyoqIEZ1bGwgbW90aW9uIHNlYXJjaCAqLyAKLX0gT01YVkNNNFAyTUVNb2RlOwotCi0KLQotLyogNi4yLjEuOCBNb3Rpb24gRXN0aW1hdGlvbiBQYXJhbWV0ZXJzICAqLwotLyogQSBkYXRhIHN0cnVjdHVyZSBjb250YWluaW5nIGNvbnRyb2wgcGFyYW1ldGVycyBmb3IgCi0gKiBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9JTlQgc2VhcmNoRW5hYmxlOHg4OyAgICAgLyoqIGVuYWJsZXMgOHg4IHNlYXJjaCAqLwotICAgIE9NWF9JTlQgaGFsZlBlbFNlYXJjaEVuYWJsZTsgLyoqIGVuYWJsZXMgaGFsZi1wZWwgcmVzb2x1dGlvbiAqLwotICAgIE9NWF9JTlQgc2VhcmNoUmFuZ2U7ICAgICAgICAgLyoqIHNlYXJjaCByYW5nZSAqLwotICAgIE9NWF9JTlQgcm5kVmFsOyAgICAgICAgICAgICAgLyoqIHJvdW5kaW5nIGNvbnRyb2w7IDAtZGlzYWJsZWQsIDEtZW5hYmxlZCovCi19IE9NWFZDTTRQMk1FUGFyYW1zOwotCi0KLQotLyogNi4yLjEuOSBNYWNyb2Jsb2NrIEluZm9ybWF0aW9uICAgKi8KLS8qIEEgZGF0YSBzdHJ1Y3R1cmUgY29udGFpbmluZyBtYWNyb2Jsb2NrIHBhcmFtZXRlcnMgZm9yIAotICogbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zIGlzIGRlZmluZWQgYXMgZm9sbG93czogIAotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfUzMyIHNsaWNlSWQ7ICAgICAgICAgICAgICAgICAvKiBzbGljZSBudW1iZXIgKi8KLSAgICBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZSBtYlR5cGU7ICAvKiBNQiB0eXBlOiBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgT01YX1ZDX0lOVEVSNCAqLwotICAgIE9NWF9TMzIgcXA7ICAgICAgICAgICAgICAgICAgICAgIC8qIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIqLwotICAgIE9NWF9VMzIgY2JweTsgICAgICAgICAgICAgICAgICAgIC8qIENCUCBMdW1hICovCi0gICAgT01YX1UzMiBjYnBjOyAgICAgICAgICAgICAgICAgICAgLyogQ0JQIENocm9tYSAqLwotICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVjBbMl1bMl07ICAgIC8qIG1vdGlvbiB2ZWN0b3IsIHJlcHJlc2VudGVkIHVzaW5nIDEvMi1wZWwgdW5pdHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBNVjBbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjEsIGJsb2NreCA9MH4xKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBPTVhWQ01vdGlvblZlY3RvciBwTVZQcmVkWzJdWzJdOyAvKiBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24sIHJlcHJlc2VudGVkIHVzaW5nIDEvMi1wZWwgdW5pdHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBNVlByZWRbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjEsIGJsb2NreCA9IDB+MSkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgT01YX1U4IHBQcmVkRGlyWzJdWzJdOyAgICAgICAgICAgLyogQUMgcHJlZGljdGlvbiBkaXJlY3Rpb246IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgT01YX1ZDX05PTkUsIE9NWF9WQ19WRVJUSUNBTCwgT01YX1ZDX0hPUklaT05UQUwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi19IE9NWFZDTTRQMk1CSW5mbywgKk9NWFZDTTRQMk1CSW5mb1B0cjsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRmluZE1WcHJlZCAgICg2LjIuMy4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQcmVkaWN0cyBhIG1vdGlvbiB2ZWN0b3IgZm9yIHRoZSBjdXJyZW50IGJsb2NrIHVzaW5nIHRoZSBwcm9jZWR1cmUgCi0gKiBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjUuICBUaGUgcmVzdWx0aW5nIHByZWRpY3RlZCBNViBpcyAKLSAqIHJldHVybmVkIGluIHBEc3RNVlByZWQuIElmIHRoZSBwYXJhbWV0ZXIgcERzdE1WUHJlZE1FIGlmIGlzIG5vdCBOVUxMIHRoZW4gCi0gKiB0aGUgc2V0IG9mIHRocmVlIE1WIGNhbmRpZGF0ZXMgdXNlZCBmb3IgcHJlZGljdGlvbiBpcyBhbHNvIHJldHVybmVkLCAKLSAqIG90aGVyd2lzZSBwRHN0TVZQcmVkTUVpcyBOVUxMIHVwb24gcmV0dXJuLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjTVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgWSAKLSAqICAgICAgICAgICAgbWFjcm9ibG9jazsgYSB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCi0gKiAgIHBTcmNDYW5kTVYxIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDQgTVZzIGFzc29jaWF0ZWQgCi0gKiAgICAgICAgICAgIHdpdGggdGhlIE1CIGxvY2F0ZWQgdG8gdGhlIGxlZnQgb2YgdGhlIGN1cnJlbnQgTUI7IHNldCB0byBOVUxMIAotICogICAgICAgICAgICBpZiB0aGVyZSBpcyBubyBNQiB0byB0aGUgbGVmdC4gCi0gKiAgIHBTcmNDYW5kTVYyIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDQgTVZzIGFzc29jaWF0ZWQgCi0gKiAgICAgICAgICAgIHdpdGggdGhlIE1CIGxvY2F0ZWQgYWJvdmUgdGhlIGN1cnJlbnQgTUI7IHNldCB0byBOVUxMIGlmIHRoZXJlIAotICogICAgICAgICAgICBpcyBubyBNQiBsb2NhdGVkIGFib3ZlIHRoZSBjdXJyZW50IE1CLiAKLSAqICAgcFNyY0NhbmRNVjMgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKLSAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCB0byB0aGUgcmlnaHQgYW5kIGFib3ZlIHRoZSBjdXJyZW50IE1COyBzZXQgCi0gKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlcmUgaXMgbm8gTUIgbG9jYXRlZCB0byB0aGUgYWJvdmUtcmlnaHQuIAotICogICBpQmxrIC0gdGhlIGluZGV4IG9mIGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCi0gKiAgIHBEc3RNVlByZWRNRSAtIE1WIGNhbmRpZGF0ZSByZXR1cm4gYnVmZmVyOyAgaWYgc2V0IHRvIE5VTEwgdGhlbiAKLSAqICAgICAgICAgICAgcHJlZGljdGlvbiBjYW5kaWRhdGUgTVZzIGFyZSBub3QgcmV0dXJuZWQgYW5kIHBEc3RNVlByZWRNRSB3aWxsIAotICogICAgICAgICAgICBiZSBOVUxMIHVwb24gZnVuY3Rpb24gcmV0dXJuOyBpZiBwRHN0TVZQcmVkTUUgaXMgbm9uLU5VTEwgdGhlbiBpdCAKLSAqICAgICAgICAgICAgbXVzdCBwb2ludCB0byBhIGJ1ZmZlciBjb250YWluaW5nIHN1ZmZpY2llbnQgc3BhY2UgZm9yIHRocmVlIAotICogICAgICAgICAgICByZXR1cm4gTVZzLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdE1WUHJlZCAtIHBvaW50ZXIgdG8gdGhlIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yIAotICogICBwRHN0TVZQcmVkTUUgLSBpZiBub24tTlVMTCB1cG9uIGlucHV0IHRoZW4gcERzdE1WUHJlZE1FICBwb2ludHMgdXBvbiAKLSAqICAgICAgICAgICAgcmV0dXJuIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHRocmVlIG1vdGlvbiB2ZWN0b3IgY2FuZGlkYXRlcyAKLSAqICAgICAgICAgICAgdXNlZCBmb3IgcHJlZGljdGlvbiBhcyBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgCi0gKiAgICAgICAgICAgIDcuNi41LCBvdGhlcndpc2UgaWYgTlVMTCB1cG9uIGlucHV0IHRoZW4gcERzdE1WUHJlZE1FIGlzIE5VTEwgCi0gKiAgICAgICAgICAgIHVwb24gb3V0cHV0LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgIHRoZSBwb2ludGVyIHBEc3RNVlByZWQgaXMgTlVMTCAKLSAqICAgIC0gICAgdGhlIHBhcmFtZXRlciBpQmxrIGRvZXMgbm90IGZhbGwgaW50byB0aGUgcmFuZ2UgMCA8PSBpQmxrPD0zIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9GaW5kTVZwcmVkICgKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WQ3VyTUIsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNDYW5kTVYxLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjQ2FuZE1WMiwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0NhbmRNVjMsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNVlByZWQsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNVlByZWRNRSwKLSAgICBPTVhfSU5UIGlCbGsKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0lEQ1Q4eDhibGsgICAoNi4yLjMuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgYSAyRCBpbnZlcnNlIERDVCBmb3IgYSBzaW5nbGUgOHg4IGJsb2NrLCBhcyBkZWZpbmVkIGluIAotICogW0lTTzE0NDk2LTJdLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIElEQ1QgaW5wdXQgYnVmZmVyOyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIEFjY29yZGluZyB0byAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTJdLCB0aGUgaW5wdXQgY29lZmZpY2llbnQgdmFsdWVzIHNob3VsZCBsaWUgd2l0aGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgSURDVCBvdXRwdXQgYnVmZmVyOyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9JRENUOHg4YmxrICgKLSAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01FR2V0QnVmU2l6ZSAgICg2LjIuNC4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiAKLSAqIHN0cnVjdHVyZSBmb3IgdGhlIGZvbGxvd2luZyBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnM6IAotICogQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCwgQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LCBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAotICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAyTUVNb2RlIAotICogICBwTUVQYXJhbXMgLSBtb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU2l6ZSAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIHNwZWNpZmljYXRpb24gCi0gKiAgICAgICAgICAgIHN0cnVjdHVyZSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKLSAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSAKLSAqICAgICAgICAgcGFyYW1ldGVyIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX01FR2V0QnVmU2l6ZSAoCi0gICAgT01YVkNNNFAyTUVNb2RlIE1FbW9kZSwKLSAgICBjb25zdCBPTVhWQ000UDJNRVBhcmFtcyAqcE1FUGFyYW1zLAotICAgIE9NWF9VMzIgKnBTaXplCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NRUluaXQgICAoNi4yLjQuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogSW5pdGlhbGl6ZXMgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSByZXF1aXJlZCBmb3IgdGhlIAotICogZm9sbG93aW5nIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogIEJsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIAotICogQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LCBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiBNZW1vcnkgZm9yIHRoZSAKLSAqIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICpwTUVTcGVjIG11c3QgYmUgYWxsb2NhdGVkIHByaW9yIHRvIGNhbGxpbmcgdGhlIAotICogZnVuY3Rpb24sIGFuZCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIEZvbGxvd2luZyAKLSAqIGluaXRpYWxpemF0aW9uIGJ5IHRoaXMgZnVuY3Rpb24sIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3RydWN0dXJlICpwTUVTcGVjIAotICogc2hvdWxkIGNvbnRhaW4gYW4gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gb2YgYWxsIG1vdGlvbiAKLSAqIGVzdGltYXRpb24gcGFyYW1ldGVycyByZWNlaXZlZCB2aWEgdGhlIHN0cnVjdHVyZSBwTUVQYXJhbXMsIGZvciBleGFtcGxlICAKLSAqIHJuZFZhbCwgc2VhcmNoUmFuZ2UsIGV0Yy4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSAKLSAqIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIGNhbiBiZSBkZXRlcm1pbmVkIHVzaW5nIHRoZSBmdW5jdGlvbiAKLSAqIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCi0gKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDJNRU1vZGUgCi0gKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB1bmluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCi0gKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgCi0gKiAgICAgICAgIHBhcmFtZXRlciBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9NRUluaXQgKAotICAgIE9NWFZDTTRQMk1FTW9kZSBNRW1vZGUsCi0gICAgY29uc3QgT01YVkNNNFAyTUVQYXJhbXMqcE1FUGFyYW1zLAotICAgIHZvaWQgKnBNRVNwZWMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiAgICg2LjIuNC4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIHNlYXJjaDsgZXN0aW1hdGVzIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgCi0gKiBtaW5pbXVtIFNBRC4gQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgCi0gKiBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgCi0gKiByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIAotICogZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IGlucHV0IE1WcyByZXByZXNlbnRlZCAKLSAqIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIE1CIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gCi0gKiAgICAgICAgICAgIHRoZSBjdXJyZW50IHBsYW5lLiAKLSAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAotICogICBwUmVmUmVjdCAtIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSBwbGFuZSByZWN0YW5nbGU7IGNvb3JkaW5hdGVzIAotICogICAgICAgICAgICBhcmUgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBvcmlnaW4uICBSZWN0YW5nbGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJpZXMgbWF5IGV4dGVuZCBiZXlvbmQgaW1hZ2UgYm91bmRhcmllcyBpZiB0aGUgaW1hZ2UgaGFzIAotICogICAgICAgICAgICBiZWVuIHBhZGRlZC4gIEZvciBleGFtcGxlLCBpZiBwYWRkaW5nIGV4dGVuZHMgNCBwaXhlbHMgYmV5b25kIAotICogICAgICAgICAgICBmcmFtZSBib3JkZXIsIHRoZW4gdGhlIHZhbHVlIGZvciB0aGUgbGVmdCBib3JkZXIgY291bGQgYmUgc2V0IHRvIAotICogICAgICAgICAgICAtNC4gCi0gKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAotICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDI1NiAKLSAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAotICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNi4gCi0gKiAgIHBDdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAotICogICBwU3JjUHJlTVYgLSBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyAKLSAqICAgICAgICAgICAgcHJlZGljdGVkIE1WIAotICogICBwU3JjUHJlU0FEIC0gcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgCi0gKiAgICAgICAgICAgIGJ5IHBTcmNQcmVNVik7IG1heSBiZSBzZXQgdG8gTlVMTCBpZiB1bmF2YWlsYWJsZS4gCi0gKiAgIHBNRVNwZWMgLSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IAotICogICAgICAgICAgICBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCi0gKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgZnVuY3Rpb24uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKLSAqICAgICAgICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwQ3VyclBvaW50UG9zLCBwRHN0TVYsIHBEc3RTQUQgb3IgCi0gKiAgICAgICAgICAgICAgcE1FU3BlYywgb3IgCi0gKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yKnBTcmNQcmVNViwKLSAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAotICAgIHZvaWQgKnBNRVNwZWMsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IqcERzdE1WLAotICAgIE9NWF9JTlQgKnBEc3RTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDggICAoNi4yLjQuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYW4gOHg4IGJsb2NrIHNlYXJjaDsgZXN0aW1hdGVzIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgCi0gKiBtaW5pbXVtIFNBRC4gIEJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIAotICogdXNpbmcgaGFsZi1waXhlbCB1bml0cywgYW5kIHRoZXJlZm9yZSBhIHNoaWZ0IGxlZnQgb3IgcmlnaHQgYnkgMSBiaXQgbWF5IGJlIAotICogcmVxdWlyZWQsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2ggdGhlIGlucHV0IG9yIG91dHB1dCBNVnMgd2l0aCBvdGhlciAKLSAqIGZ1bmN0aW9ucyB0aGF0IGVpdGhlciBnZW5lcmF0ZSBvdXRwdXQgTVZzIG9yIGV4cGVjdCBpbnB1dCBNVnMgcmVwcmVzZW50ZWQgCi0gKiB1c2luZyBpbnRlZ2VyIHBpeGVsIHVuaXRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCA4eDggYmxvY2sgCi0gKiAgICAgICAgICAgIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKLSAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAotICogICBwUmVmUmVjdCAtIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSBwbGFuZSByZWN0YW5nbGU7IGNvb3JkaW5hdGVzIAotICogICAgICAgICAgICBhcmUgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBvcmlnaW4uICBSZWN0YW5nbGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJpZXMgbWF5IGV4dGVuZCBiZXlvbmQgaW1hZ2UgYm91bmRhcmllcyBpZiB0aGUgaW1hZ2UgaGFzIAotICogICAgICAgICAgICBiZWVuIHBhZGRlZC4gCi0gKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAotICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDEyOCAKLSAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAotICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNiBieXRlcy4gCi0gKiAgIHBDdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKLSAqICAgcFNyY1ByZU1WIC0gcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gCi0gKiAgICAgICAgICAgIHByZWRpY3RlZCBNViAKLSAqICAgcFNyY1ByZVNBRCAtIHBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIAotICogICAgICAgICAgICBieSBwU3JjUHJlTVYpOyBtYXkgYmUgc2V0IHRvIE5VTEwgaWYgdW5hdmFpbGFibGUuIAotICogICBwTUVTcGVjIC0gdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyAKLSAqICAgICAgICAgICAgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAotICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nIGZ1bmN0aW9uLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY1JlZkJ1ZiwgCi0gKiAgICAgICAgICAgICAgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcEN1cnJQb2ludFBvcywgcERzdE1WLCBwRHN0U0FEIG9yIAotICogICAgICAgICAgICAgIHBNRVNwZWMsIG9yIAotICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgOC1ieXRlIGFsaWduZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICBPTVhfSU5UIHJlZldpZHRoLAotICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAotICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCi0gICAgdm9pZCAqcE1FU3BlYywKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAotICAgIE9NWF9JTlQgKnBEc3RTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiAgICg2LjIuNC4yLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiAgUmV0dXJucyB0aGUgCi0gKiBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gCi0gKiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIAotICogcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIAotICogdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIAotICogcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIAotICogMTZ4MTYgaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfMTZ4MTYuIFRoZSBmdW5jdGlvbiAKLSAqIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgbWFjcm9ibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZS4gCi0gKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKLSAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSAKLSAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCi0gKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMjU2IAotICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCi0gKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKLSAqICAgcFNlYXJjaFBvaW50UmVmUG9zIC0gcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIAotICogICAgICAgICAgICBzZWFyY2ggKHNwZWNpZmllZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzKSBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZSwgaS5lLiwgdGhlIHJlZmVyZW5jZSBwb3NpdGlvbiBwb2ludGVkIHRvIGJ5IHRoZSAKLSAqICAgICAgICAgICAgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IuIAotICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCi0gKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgCi0gKiAgICAgICAgICAgIGR1cmluZyBhIHByaW9yIDE2WDE2IGludGVnZXIgc2VhcmNoOyBzcGVjaWZpZWQgaW4gdGVybXMgb2YgCi0gKiAgICAgICAgICAgIGhhbGYtcGl4ZWwgdW5pdHMuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKLSAqICAgICAgICAgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcFNlYXJjaFBvaW50UmVmUG9zLCBwU3JjRHN0TVYuCi0gKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQsIG9yIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICBPTVhfSU5UIHJlZldpZHRoLAotICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAotICAgIE9NWF9JTlQgcm5kVmFsLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCi0gICAgT01YX0lOVCAqcERzdFNBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCAgICg2LjIuNC4yLjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhbiA4eDggYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uIFJldHVybnMgdGhlIAotICogZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICBUaGlzIGZ1bmN0aW9uIAotICogZXN0aW1hdGVzIHRoZSBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciAKLSAqIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdE1WLCBpLmUuLCAKLSAqIHRoZSBpbml0aWFsIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgaW5wdXQgcGFyYW1ldGVycyAKLSAqIHBTcmNSZWZCdWYgYW5kIHBTZWFyY2hQb2ludFJlZlBvcyBzaG91bGQgYmUgc2hpZnRlZCBieSB0aGUgd2lubmluZyBNViBvZiAKLSAqIDh4OCBpbnRlZ2VyIHNlYXJjaCBwcmlvciB0byBjYWxsaW5nIEJsb2NrTWF0Y2hfSGFsZl84eDguIFRoZSBmdW5jdGlvbiAKLSAqIEJsb2NrTWF0Y2hfSW50ZWdlcl84eDggbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIGJsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IDh4OCBibG9jayAKLSAqICAgICAgICAgICAgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAotICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCi0gKiAgIHBSZWZSZWN0IC0gcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUgCi0gKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAotICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDEyOCAKLSAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCi0gKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKLSAqICAgcFNlYXJjaFBvaW50UmVmUG9zIC0gcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIAotICogICAgICAgICAgICBzZWFyY2ggKHNwZWNpZmllZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzKSBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZS4gCi0gKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKLSAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbCBNViBlc3RpbWF0ZTsgdHlwaWNhbGx5IGdlbmVyYXRlZCAKLSAqICAgICAgICAgICAgZHVyaW5nIGEgcHJpb3IgOHg4IGludGVnZXIgc2VhcmNoLCBzcGVjaWZpZWQgaW4gdGVybXMgb2YgCi0gKiAgICAgICAgICAgIGhhbGYtcGl4ZWwgdW5pdHMuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY1JlZkJ1ZiwgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcFNlYXJjaFBvaW50UmVmUG9zLCBwU3JjRHN0TVYKLSAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBTZWFyY2hQb2ludFJlZlBvcywKLSAgICBPTVhfSU5UIHJuZFZhbCwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAotICAgIE9NWF9JTlQgKnBEc3RTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiAgICg2LjIuNC4zLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBtb3Rpb24gc2VhcmNoIGZvciBhIDE2eDE2IG1hY3JvYmxvY2suICBTZWxlY3RzIGJlc3QgbW90aW9uIHNlYXJjaCAKLSAqIHN0cmF0ZWd5IGZyb20gYW1vbmcgaW50ZXItMU1WLCBpbnRlci00TVYsIGFuZCBpbnRyYSBtb2Rlcy4gIFN1cHBvcnRzIAotICogaW50ZWdlciBhbmQgaGFsZiBwaXhlbCByZXNvbHV0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY3VycmVudCBNQiBpbiB0aGUgCi0gKiAgICAgICAgICAgIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICAKLSAqICAgICAgICAgICAgVGhlIGZ1bmN0aW9uIGRvZXMgbm90IGV4cGVjdCBzb3VyY2UgZGF0YSBvdXRzaWRlIHRoZSByZWdpb24gCi0gKiAgICAgICAgICAgIGJvdW5kZWQgYnkgdGhlIE1CIHRvIGJlIGF2YWlsYWJsZTsgZm9yIGV4YW1wbGUgaXQgaXMgbm90IAotICogICAgICAgICAgICBuZWNlc3NhcnkgZm9yIHRoZSBjYWxsZXIgdG8gZ3VhcmFudGVlIHRoZSBhdmFpbGFiaWxpdHkgb2YgCi0gKiAgICAgICAgICAgIHBTcmNDdXJyQnVmWy1TcmNDdXJyU3RlcF0sIGkuZS4sIHRoZSByb3cgb2YgcGl4ZWxzIGFib3ZlIHRoZSBNQiAKLSAqICAgICAgICAgICAgdG8gYmUgcHJvY2Vzc2VkLiAKLSAqICAgc3JjQ3VyclN0ZXAgLSB3aWR0aCBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSwgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBwbGFuZSBsb2NhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBzcmNSZWZTdGVwIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lLCBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBSZWZSZWN0IC0gcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUsIHNwZWNpZmllZCByZWxhdGl2ZSB0byAKLSAqICAgICAgICAgICAgdGhlIGltYWdlIG9yaWdpbiAKLSAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiAKLSAqICAgICAgICAgICAgc3RydWN0dXJlOyBtdXN0IGJlIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKLSAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIAotICogICBwTUJJbmZvIC0gYXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBuZWFyYnkgTUJzOiAKLSAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMF0gLSBwb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzFdIC0gcG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzJdIC0gcG9pbnRlciB0byB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgIHBNQkluZm9bM10gLSBwb2ludGVyIHRvIHRvcC1yaWdodCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgdG8gTlVMTCBpZiB0aGUgCi0gKiAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24ndCBleGlzdC4gIEZvciBlYWNoIE1CLCB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSAKLSAqICAgICAgICAgICAgbWVtYmVycyBhcmUgdXNlZDogICAgCi0gKiAgICAgICAgICAgIC0gICBtYlR5cGUgLSBtYWNyb2Jsb2NrIHR5cGUsIGVpdGhlciBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgCi0gKiAgICAgICAgICAgICAgICBPTVhfVkNfSU5URVI0ViAKLSAqICAgICAgICAgICAgLSAgIHBNVjBbMl1bMl0gLSBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIAotICogICAgICAgICAgICAgICAgaW4gMS8yIHBpeGVsIHVuaXRzIAotICogICAgICAgICAgICAtICAgc2xpY2VJRCAtIG51bWJlciBvZiB0aGUgc2xpY2UgdG8gd2hpY2ggdGhlIE1CIGJlbG9uZ3MgCi0gKiAgIHBTcmNEc3RNQkN1cnIgLSBwb2ludGVyIHRvIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgTUIuICAKLSAqICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBzZXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCi0gKiAgICAgICAgICAgIGZ1bmN0aW9uOiBzbGljZUlEIC0gdGhlIG51bWJlciBvZiB0aGUgc2xpY2UgdGhlIHRvIHdoaWNoIHRoZSAKLSAqICAgICAgICAgICAgY3VycmVudCBNQiBiZWxvbmdzLiAgVGhlIHN0cnVjdHVyZSBlbGVtZW50cyBjYnB5IGFuZCBjYnBjIGFyZSAKLSAqICAgICAgICAgICAgaWdub3JlZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RNQkN1cnIgLSBwb2ludGVyIHRvIHVwZGF0ZWQgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgTUIgYWZ0ZXIgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLiAgVGhlIAotICogICAgICAgICAgICBmb2xsb3dpbmcgc3RydWN0dXJlIG1lbWJlcnMgYXJlIHVwZGF0ZWQgYnkgdGhlIE1FIGZ1bmN0aW9uOiAgIAotICogICAgICAgICAgICAgIC0gIG1iVHlwZSAtIG1hY3JvYmxvY2sgdHlwZTogT01YX1ZDX0lOVFJBLCBPTVhfVkNfSU5URVIsIG9yIAotICogICAgICAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWLiAKLSAqICAgICAgICAgICAgICAtICBwTVYwWzJdWzJdIC0gZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3JzOyByZXByZXNlbnRlZCBpbiAKLSAqICAgICAgICAgICAgICAgICB0ZXJtcyBvZiAxLzIgcGVsIHVuaXRzLiAKLSAqICAgICAgICAgICAgICAtICBwTVZQcmVkWzJdWzJdIC0gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3JzOyByZXByZXNlbnRlZCAKLSAqICAgICAgICAgICAgICAgICBpbiB0ZXJtcyBvZiAxLzIgcGVsIHVuaXRzLiAKLSAqICAgICAgICAgICAgVGhlIHN0cnVjdHVyZSBtZW1iZXJzIGNicHkgYW5kIGNicGMgYXJlIG5vdCB1cGRhdGVkIGJ5IHRoZSBmdW5jdGlvbi4gCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIHRoZSBtaW5pbXVtIFNBRCBmb3IgSU5URVIxViwgb3Igc3VtIG9mIG1pbmltdW0gU0FEcyAKLSAqICAgICAgICAgICAgZm9yIElOVEVSNFYgCi0gKiAgIHBEc3RCbG9ja1NBRCAtIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgU0FEIHZhbHVlcyBmb3IgZWFjaCBvZiB0aGUgZm91ciAKLSAqICAgICAgICAgICAgOHg4IGx1bWEgYmxvY2tzIGluIHRoZSBNQi4gIFRoZSBibG9jayBTQURzIGFyZSBpbiBzY2FuIG9yZGVyIGZvciAKLSAqICAgICAgICAgICAgZWFjaCBNQi4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNDdXJyQnVmLCAKLSAqICAgICAgICAgICAgICBwU3JjUmVmQnVmLCBwUmVmUmVjdCwgcEN1cnJQb2ludFBvcywgcE1CSW50ZXIsIHBNQkludHJhLCAKLSAqICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLCBvciBwRHN0U0FELiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgIE9NWF9TMzIgc3JjQ3VyclN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgIE9NWF9TMzIgc3JjUmVmU3RlcCwKLSAgICBjb25zdCBPTVhSZWN0KnBSZWZSZWN0LAotICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgdm9pZCAqcE1FU3BlYywKLSAgICBjb25zdCBPTVhWQ000UDJNQkluZm9QdHIgKnBNQkluZm8sCi0gICAgT01YVkNNNFAyTUJJbmZvICpwU3JjRHN0TUJDdXJyLAotICAgIE9NWF9VMTYgKnBEc3RTQUQsCi0gICAgT01YX1UxNiAqcERzdEJsb2NrU0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EQ1Q4eDhibGsgICAoNi4yLjQuNC4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgYSAyRCBmb3J3YXJkIERDVCBmb3IgYSBzaW5nbGUgOHg4IGJsb2NrLCBhcyBkZWZpbmVkIGluIAotICogW0lTTzE0NDk2LTJdLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIGlucHV0IGJ1ZmZlcjsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBJbnB1dCB2YWx1ZXMgKHBpeGVsIAotICogICAgICAgICAgICBpbnRlbnNpdGllcykgYXJlIHZhbGlkIGluIHRoZSByYW5nZSBbLTI1NSwyNTVdLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBvdXRwdXQgYnVmZmVyOyBtdXN0IAotICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIHJldHVybmVkIGlmOgotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRENUOHg4YmxrICgKLSAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW50cmFfSSAgICg2LjIuNC40LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBxdWFudGl6YXRpb24gb24gaW50cmEgYmxvY2sgY29lZmZpY2llbnRzLiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIAotICogYml0c19wZXJfcGl4ZWwgPT0gOC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IGludHJhIGJsb2NrIGNvZWZmaWNpZW50czsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkuIAotICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uLCAKLSAqICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNSwgYXMgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSAKLSAqICAgICAgICAgICAgNi4xLjMuOC4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCi0gKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAocXVhbnRpemVkKSBpbnRlcmJsb2NrIGNvZWZmaWNpZW50cy4gIAotICogICAgICAgICAgICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTEsIEFDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKLSAqICAgICAgICAgICAgaW50ZXJ2YWwgWy0xMjcsIDEyN10sIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCi0gKiAgICAgICAgICAgIGludGVydmFsIFsxLCAyNTRdLiAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0wLCBBQyBjb2VmZmljaWVudHMgCi0gKiAgICAgICAgICAgIGFyZSBzYXR1cmF0ZWQgb24gdGhlIGludGVydmFsIFstMjA0NywgMjA0N10uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBibG9ja0luZGV4IDwgMCBvciBibG9ja0luZGV4ID49IDEwIAotICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnRyYV9JICgKLSAgICBPTVhfUzE2ICpwU3JjRHN0LAotICAgIE9NWF9VOCBRUCwKLSAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludGVyX0kgICAoNi4yLjQuNC4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgcXVhbnRpemF0aW9uIG9uIGFuIGludGVyIGNvZWZmaWNpZW50IGJsb2NrOyBzdXBwb3J0cyAKLSAqIGJpdHNfcGVyX3BpeGVsID09IDguIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBpbnRlciBibG9jayBjb2VmZmljaWVudHM7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsIGFuZCAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKHF1YW50aXplZCkgaW50ZXJibG9jayBjb2VmZmljaWVudHMuICAKLSAqICAgICAgICAgICAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLCBBQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCi0gKiAgICAgICAgICAgIGludGVydmFsIFstMTI3LCAxMjddLCBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAotICogICAgICAgICAgICBpbnRlcnZhbCBbMSwgMjU0XS4gIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MCwgQUMgY29lZmZpY2llbnRzIAotICogICAgICAgICAgICBhcmUgc2F0dXJhdGVkIG9uIHRoZSBpbnRlcnZhbCBbLTIwNDcsIDIwNDddLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW50ZXJfSSAoCi0gICAgT01YX1MxNiAqcFNyY0RzdCwKLSAgICBPTVhfVTggUVAsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAgICg2LjIuNC40LjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBRdWFudGl6ZXMgdGhlIERDVCBjb2VmZmljaWVudHMsIGltcGxlbWVudHMgaW50cmEgYmxvY2sgQUMvREMgY29lZmZpY2llbnQgCi0gKiBwcmVkaWN0aW9uLCBhbmQgcmVjb25zdHJ1Y3RzIHRoZSBjdXJyZW50IGludHJhIGJsb2NrIHRleHR1cmUgZm9yIHByZWRpY3Rpb24gCi0gKiBvbiB0aGUgbmV4dCBmcmFtZS4gIFF1YW50aXplZCByb3cgYW5kIGNvbHVtbiBjb2VmZmljaWVudHMgYXJlIHJldHVybmVkIGluIAotICogdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgYnVmZmVycy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHBpeGVscyBvZiBjdXJyZW50IGludHJhIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gCi0gKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlciBjb250YWluaW5nIAotICogICAgICAgICAgICAoKG51bV9tYl9wZXJfcm93ICogMiArIDEpICogOCkgZWxlbWVudHMgb2YgdHlwZSBPTVhfUzE2LiAKLSAqICAgICAgICAgICAgQ29lZmZpY2llbnRzIGFyZSBvcmdhbml6ZWQgaW50byBibG9ja3Mgb2YgZWlnaHQgYXMgZGVzY3JpYmVkIAotICogICAgICAgICAgICBiZWxvdyAoSW50ZXJuYWwgUHJlZGljdGlvbiBDb2VmZmljaWVudCBVcGRhdGUgUHJvY2VkdXJlcykuICBUaGUgCi0gKiAgICAgICAgICAgIERDIGNvZWZmaWNpZW50IGlzIGZpcnN0LCBhbmQgdGhlIHJlbWFpbmluZyBidWZmZXIgbG9jYXRpb25zIAotICogICAgICAgICAgICBjb250YWluIHRoZSBxdWFudGl6ZWQgQUMgY29lZmZpY2llbnRzLiBFYWNoIGdyb3VwIG9mIGVpZ2h0IHJvdyAKLSAqICAgICAgICAgICAgYnVmZmVyIGVsZW1lbnRzIGNvbWJpbmVkIHdpdGggb25lIGVsZW1lbnQgZWlnaHQgZWxlbWVudHMgYWhlYWQgCi0gKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCBwcmVkaWN0b3JzIG9mIHRoZSBuZWlnaGJvcmluZyBibG9jayAKLSAqICAgICAgICAgICAgdGhhdCBpcyBzcGF0aWFsbHkgYWJvdmUgb3IgdG8gdGhlIGxlZnQgb2YgdGhlIGJsb2NrIGN1cnJlbnRseSB0byAKLSAqICAgICAgICAgICAgYmUgZGVjb2RlZC4gQSBuZWdhdGl2ZS12YWx1ZWQgREMgY29lZmZpY2llbnQgaW5kaWNhdGVzIHRoYXQgdGhpcyAKLSAqICAgICAgICAgICAgbmVpZ2hib3JpbmcgYmxvY2sgaXMgbm90IElOVFJBLWNvZGVkIG9yIG91dCBvZiBib3VuZHMsIGFuZCAKLSAqICAgICAgICAgICAgdGhlcmVmb3JlIHRoZSBBQyBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBpbnZhbGlkLiAgUG9pbnRlciBtdXN0IAotICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgcHJlZGljdGlvbiBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyIAotICogICAgICAgICAgICBjb250YWluaW5nIDE2IGVsZW1lbnRzIG9mIHR5cGUgT01YX1MxNi4gQ29lZmZpY2llbnRzIGFyZSAKLSAqICAgICAgICAgICAgb3JnYW5pemVkIGFzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDYuMi4yLjUuICBQb2ludGVyIG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFN1bUVyciAtIHBvaW50ZXIgdG8gYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgQUMgcHJlZGljdGlvbiBpcyAKLSAqICAgICAgICAgICAgcmVxdWlyZWQ7IEFDIHByZWRpY3Rpb24gaXMgZW5hYmxlZCBpZiAqcFN1bUVyciA+PTAsIGJ1dCB0aGUgCi0gKiAgICAgICAgICAgIHZhbHVlIGlzIG5vdCB1c2VkIGZvciBjb2VmZmljaWVudCBwcmVkaWN0aW9uLCBpLmUuLCB0aGUgc3VtIG9mIAotICogICAgICAgICAgICBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBzdGFydHMgZnJvbSAwIGZvciBlYWNoIGNhbGwgdG8gdGhpcyAKLSAqICAgICAgICAgICAgZnVuY3Rpb24uICBPdGhlcndpc2UgQUMgcHJlZGljdGlvbiBpcyBkaXNhYmxlZCBpZiAqcFN1bUVyciA8IDAgLiAKLSAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiwgYXMgCi0gKiAgICAgICAgICAgIGRlZmluZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNi4xLjMuOC4gCi0gKiAgIGN1clFwIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgbWFjcm9ibG9jayB0byB3aGljaCB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgYmxvY2sgYmVsb25ncyAKLSAqICAgcFFwQnVmIC0gcG9pbnRlciB0byBhIDItZWxlbWVudCBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcjsgcFFwQnVmWzBdIAotICogICAgICAgICAgICBjb250YWlucyB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBhc3NvY2lhdGVkIHdpdGggdGhlIDh4OCAKLSAqICAgICAgICAgICAgYmxvY2sgbGVmdCBvZiB0aGUgY3VycmVudCBibG9jayAoUVBhKSwgYW5kIHBRcEJ1ZlsxXSBjb250YWlucyAKLSAqICAgICAgICAgICAgdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSA4eDggYmxvY2sgYWJvdmUgCi0gKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGJsb2NrIChRUGMpLiAgSW4gdGhlIGV2ZW50IHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgCi0gKiAgICAgICAgICAgIGJsb2NrIGlzIG91dHNpZGUgb2YgdGhlIFZPUCBib3VuZCwgdGhlIFFwIHZhbHVlIHdpbGwgbm90IGFmZmVjdCAKLSAqICAgICAgICAgICAgdGhlIGludHJhIHByZWRpY3Rpb24gcHJvY2VzcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgCi0gKiAgICAgICAgICAgIHN1Yi1jbGF1c2UgNy40LjMuMywgIEFkYXB0aXZlIEFDIENvZWZmaWNpZW50IFByZWRpY3Rpb24uICAKLSAqICAgc3JjU3RlcCAtIHdpZHRoIG9mIHRoZSBzb3VyY2UgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGRzdFN0ZXAgLSB3aWR0aCBvZiB0aGUgcmVjb25zdHJ1Y3RlZCBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSAKLSAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgMTYuIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAotICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IGJ1ZmZlcjsgcERzdFswXSBjb250YWlucyAKLSAqICAgICAgICAgICAgdGhlIHByZWRpY3RlZCBEQyBjb2VmZmljaWVudDsgdGhlIHJlbWFpbmluZyBlbnRyaWVzIGNvbnRhaW4gdGhlIAotICogICAgICAgICAgICBxdWFudGl6ZWQgQUMgY29lZmZpY2llbnRzICh3aXRob3V0IHByZWRpY3Rpb24pLiAgVGhlIHBvaW50ZXIgCi0gKiAgICAgICAgICAgIHBEc3RtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFJlYyAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgdGV4dHVyZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIAotICogICAgICAgICAgICA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlciAKLSAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgCi0gKiAgIHBQcmVBQ1ByZWRpY3QgLSBpZiBwcmVkaWN0aW9uIGlzIGVuYWJsZWQsIHRoZSBwYXJhbWV0ZXIgcG9pbnRzIHRvIHRoZSAKLSAqICAgICAgICAgICAgc3RhcnQgb2YgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBjb2VmZmljaWVudCBkaWZmZXJlbmNlcyBmb3IgCi0gKiAgICAgICAgICAgIFZMQyBlbmNvZGluZy4gVGhlIGVudHJ5IHBQcmVBQ1ByZWRpY3RbMF1pbmRpY2F0ZXMgcHJlZGljdGlvbiAKLSAqICAgICAgICAgICAgZGlyZWN0aW9uIGZvciB0aGUgY3VycmVudCBibG9jayBhbmQgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgIHZhbHVlczogT01YX1ZDX05PTkUgKHByZWRpY3Rpb24gZGlzYWJsZWQpLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCi0gKiAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gIFRoZSBlbnRyaWVzIAotICogICAgICAgICAgICBwUHJlQUNQcmVkaWN0WzFdLXBQcmVBQ1ByZWRpY3RbN11jb250YWluIHByZWRpY3RlZCBBQyAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnRzLiAgSWYgcHJlZGljdGlvbiBpcyBkaXNhYmxlZCAoKnBTdW1FcnI8MCkgdGhlbiB0aGUgCi0gKiAgICAgICAgICAgIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyIGFyZSB1bmRlZmluZWQgdXBvbiByZXR1cm4gZnJvbSB0aGUgCi0gKiAgICAgICAgICAgIGZ1bmN0aW9uIAotICogICBwU3VtRXJyIC0gcG9pbnRlciB0byB0aGUgdmFsdWUgb2YgdGhlIGFjY3VtdWxhdGVkIEFDIGNvZWZmaWNpZW50IGVycm9ycywgCi0gKiAgICAgICAgICAgIGkuZS4sIHN1bSBvZiB0aGUgYWJzb2x1dGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBwcmVkaWN0ZWQgYW5kIAotICogICAgICAgICAgICB1bnByZWRpY3RlZCBBQyBjb2VmZmljaWVudHMgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QsIHBSZWMsIAotICogICAgICAgICBwQ29lZkJ1ZlJvdywgcENvZWZCdWZDb2wsIHBRcEJ1ZiwgcFByZUFDUHJlZGljdCwgcFN1bUVyci4gCi0gKiAgICAtICAgIGJsb2NrSW5kZXggPCAwIG9yIGJsb2NrSW5kZXggPj0gMTA7IAotICogICAgLSAgICBjdXJRUCA8PSAwIG9yIGN1clFQID49IDMyLiAKLSAqICAgIC0gICAgc3JjU3RlcCwgb3IgZHN0U3RlcCA8PSAwIG9yIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQ6IC4gCi0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZDogCi0gKiAgICAgICAgIHBTcmMsIHBSZWMuICAKLSAqCi0gKiAgTm90ZTogVGhlIGNvZWZmaWNpZW50IGJ1ZmZlcnMgbXVzdCBiZSB1cGRhdGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgCi0gKiAgICAgICAgdXBkYXRlIHByb2NlZHVyZXMgZGVmaW5lZCBpbiBzZWN0aW9uIGluIDYuMi4yLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9VOCAqcFJlYywKLSAgICBPTVhfUzE2ICpwUHJlZEJ1ZlJvdywKLSAgICBPTVhfUzE2ICpwUHJlZEJ1ZkNvbCwKLSAgICBPTVhfUzE2ICpwUHJlQUNQcmVkaWN0LAotICAgIE9NWF9JTlQgKnBTdW1FcnIsCi0gICAgT01YX0lOVCBibG9ja0luZGV4LAotICAgIE9NWF9VOCBjdXJRcCwKLSAgICBjb25zdCBPTVhfVTggKnBRcEJ1ZiwKLSAgICBPTVhfSU5UIHNyY1N0ZXAsCi0gICAgT01YX0lOVCBkc3RTdGVwLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIgICAoNi4yLjQuNC41KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogSW1wbGVtZW50cyBEQ1QsIGFuZCBxdWFudGl6ZXMgdGhlIERDVCBjb2VmZmljaWVudHMgb2YgdGhlIGludGVyIGJsb2NrIAotICogd2hpbGUgcmVjb25zdHJ1Y3RpbmcgdGhlIHRleHR1cmUgcmVzaWR1YWwuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciAKLSAqIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtcG9pbnRlciB0byB0aGUgcmVzaWR1YWxzIHRvIGJlIGVuY29kZWQ7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiAKLSAqICAgICAgICAgICAgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlci4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgCi0gKiAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsIGFuZCAKLSAqICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudHMgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBSZWMgLSBwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIHRleHR1cmUgcmVzaWR1YWxzOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIGVpdGhlciBOVUxMIG9yIAotICogICAgICAgICBub3QgMTYtYnl0ZSBhbGlnbmVkOiAKLSAqICAgICAgICAgICAgLSBwU3JjIAotICogICAgICAgICAgICAtIHBEc3QKLSAqICAgICAgICAgICAgLSBwUmVjCi0gKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAoCi0gICAgY29uc3QgT01YX1MxNiAqcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9TMTYgKnBSZWMsCi0gICAgT01YX1U4IFFQLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAoNi4yLjQuNS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgemlnemFnIHNjYW4gYW5kIFZMQyBlbmNvZGluZyBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIGZvciBvbmUgCi0gKiBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIHByb3ZpZGVkIAotICogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCi0gKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAiSW50cmEgREMgCi0gKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nIi4gIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4gCi0gKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCi0gKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgdGhlIHppZ3phZyAKLSAqICAgICAgICAgICAgc2NhbiBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAotICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbi4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb24uICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKLSAqICAgICAgICAgICAgZW5jb2RlZCAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKLSAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2UpIG9mIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwgc28gCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKLSAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZi4gCi0gKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCi0gKiAgICAtICAgIFByZWREaXIgaXMgbm90IG9uZSBvZjogT01YX1ZDX05PTkUsIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKLSAqICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAKLSAqICAgIC0gICAgVmlkZW9Db21wIGlzIG5vdCBvbmUgY29tcG9uZW50IG9mIGVudW0gT01YVkNNNFAyVmlkZW9Db21wb25lbnQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAoCi0gICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCi0gICAgT01YX1U4IHByZWREaXIsCi0gICAgT01YX1U4IHBhdHRlcm4sCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAoNi4yLjQuNS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgemlnemFnIHNjYW4gYW5kIFZMQyBlbmNvZGluZyBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIGZvciBvbmUgCi0gKiBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIHByb3ZpZGVkIAotICogaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCi0gKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCi0gKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LiAKLSAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKLSAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB0aGUgemlnemFnIAotICogICAgICAgICAgICBzY2FuIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZC4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbi4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKLSAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAotICogICAgICAgICAgICBlbmNvZGVkIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLCBzbyAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAotICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmLiAKLSAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKLSAqICAgIC0gICAgUHJlZERpciBpcyBub3Qgb25lIG9mOiBPTVhfVkNfTk9ORSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAotICogICAgICAgICBPTVhfVkNfVkVSVElDQUwuIAotICogICAgLSAgICBWaWRlb0NvbXAgaXMgbm90IG9uZSBjb21wb25lbnQgb2YgZW51bSBPTVhWQ000UDJWaWRlb0NvbXBvbmVudC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICgKLSAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKLSAgICBPTVhfVTggcHJlZERpciwKLSAgICBPTVhfVTggcGF0dGVybiwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciAgICg2LjIuNC41LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZW5jb2RpbmcgZm9yIG9uZSBpbnRlciBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKLSAqICAgICAgICAgICAgc3RyZWFtIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNyAKLSAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKLSAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAotICogICAgICAgICAgICBlbmNvZGVkIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkIHNvIHRoYXQgCi0gKiAgICAgICAgICAgIGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzIAotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzOiBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCAKLSAqICAgICAgICAgICAgICBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYgCi0gKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciAoCi0gICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCi0gICAgT01YX1U4IHBhdHRlcm4sCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVNViAgICg2LjIuNC41LjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQcmVkaWN0cyBhIG1vdGlvbiB2ZWN0b3IgZm9yIHRoZSBjdXJyZW50IG1hY3JvYmxvY2ssIGVuY29kZXMgdGhlIAotICogZGlmZmVyZW5jZSwgYW5kIHdyaXRlcyB0aGUgb3V0cHV0IHRvIHRoZSBzdHJlYW0gYnVmZmVyLiBUaGUgaW5wdXQgTVZzIAotICogcE1WQ3VyTUIsIHBTcmNNVkxlZnRNQiwgcFNyY01WVXBwZXJNQiwgYW5kIHBTcmNNVlVwcGVyUmlnaHRNQiBzaG91bGQgbGllIAotICogd2l0aGluIHRoZSByYW5nZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnB1dCBwYXJhbWV0ZXIgZmNvZGVGb3J3YXJkLCBhcyAKLSAqIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMy4gIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSAKLSAqIHN1cGVyc2V0IG9mIHRoZSBmdW5jdGlvbmFsaXR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZnVuY3Rpb24gCi0gKiBvbXhWQ000UDJfRmluZE1WcHJlZC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gaW5kZXggb2YgdGhlIGZpcnN0IGZyZWUgKG5leHQgYXZhaWxhYmxlKSBiaXQgaW4gdGhlIHN0cmVhbSAKLSAqICAgICAgICAgICAgYnVmZmVyIHJlZmVyZW5jZWQgYnkgKnBwQml0U3RyZWFtLCB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA3LiAKLSAqICAgcE1WQ3VyTUIgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgbW90aW9uIHZlY3RvcjsgYSB2YWx1ZSBvZiAKLSAqICAgICAgICAgICAgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAotICogICBwU3JjTVZMZWZ0TUIgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgbGVmdCBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgCi0gKiAgICAgICAgICAgIHZhbHVlIG9mICBOVUxMaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKLSAqICAgcFNyY01WVXBwZXJNQiAtIHBvaW50ZXIgdG8gc291cmNlIHVwcGVyIG1hY3JvYmxvY2sgbW90aW9uIHZlY3RvcjsgYSAKLSAqICAgICAgICAgICAgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAotICogICBwU3JjTVZVcHBlclJpZ2h0TUIgLSBwb2ludGVyIHRvIHNvdXJjZSB1cHBlciByaWdodCBNQiBtb3Rpb24gdmVjdG9yOyBhIAotICogICAgICAgICAgICB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCi0gKiAgIGZjb2RlRm9yd2FyZCAtIGFuIGludGVnZXIgd2l0aCB2YWx1ZXMgZnJvbSAxIHRvIDc7IHVzZWQgaW4gZW5jb2RpbmcgCi0gKiAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3JzIHJlbGF0ZWQgdG8gc2VhcmNoIHJhbmdlLCBhcyBkZXNjcmliZWQgaW4gCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4zLiAKLSAqICAgTUJUeXBlIC0gbWFjcm8gYmxvY2sgdHlwZSwgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNSAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSB1cGRhdGVkIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSAKLSAqICAgICAgICAgICAgYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gdXBkYXRlZCBpbmRleCBvZiB0aGUgbmV4dCBhdmFpbGFibGUgYml0IHBvc2l0aW9uIGluIHN0cmVhbSAKLSAqICAgICAgICAgICAgYnVmZmVyIHJlZmVyZW5jZWQgYnkgKnBwQml0U3RyZWFtIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgCi0gKiAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwTVZDdXJNQiAKLSAqICAgIC0gICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCi0gKiAgICAtICAgIGZjb2RlRm9yd2FyZCA8PSAwLCBvciBmY29kZUZvcndhcmQgPiA3LCBvciBNQlR5cGUgPCAwLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlTVYgKAotICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVkN1ck1CLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yKnBTcmNNVkxlZnRNQiwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WVXBwZXJNQiwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WVXBwZXJSaWdodE1CLAotICAgIE9NWF9JTlQgZmNvZGVGb3J3YXJkLAotICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIE1CVHlwZQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCAgICg2LjIuNS4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBEZWNvZGVzIGFuZCBwYWRzIHRoZSBmb3VyIG1vdGlvbiB2ZWN0b3JzIGFzc29jaWF0ZWQgd2l0aCBhIG5vbi1pbnRyYSBQLVZPUCAKLSAqIG1hY3JvYmxvY2suICBGb3IgbWFjcm9ibG9ja3Mgb2YgdHlwZSBPTVhfVkNfSU5URVI0ViwgdGhlIG91dHB1dCBNViBpcyAKLSAqIHBhZGRlZCBhcyBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjEuNi4gT3RoZXJ3aXNlLCBmb3IgCi0gKiBtYWNyb2Jsb2NrcyBvZiB0eXBlcyBvdGhlciB0aGFuIE9NWF9WQ19JTlRFUjRWLCB0aGUgZGVjb2RlZCBNViBpcyBjb3BpZWQgdG8gCi0gKiBhbGwgZm91ciBvdXRwdXQgTVYgYnVmZmVyIGVudHJpZXMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCi0gKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gWzAtN10uIAotICogICBwU3JjTVZMZWZ0TUIsIHBTcmNNVlVwcGVyTUIsIGFuZCBwU3JjTVZVcHBlclJpZ2h0TUIgLSBwb2ludGVycyB0byB0aGUgCi0gKiAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3IgYnVmZmVycyBvZiB0aGUgbWFjcm9ibG9ja3Mgc3BlY2lhbGx5IGF0IHRoZSBsZWZ0LCAKLSAqICAgICAgICAgICAgdXBwZXIsIGFuZCB1cHBlci1yaWdodCBzaWRlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2ssIAotICogICAgICAgICAgICByZXNwZWN0aXZlbHk7IGEgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuICBOb3RlOiAKLSAqICAgICAgICAgICAgQW55IG5laWdoYm9yaG9vZCBtYWNyb2Jsb2NrIG91dHNpZGUgdGhlIGN1cnJlbnQgVk9QIG9yIHZpZGVvIAotICogICAgICAgICAgICBwYWNrZXQgb3Igb3V0c2lkZSB0aGUgY3VycmVudCBHT0IgKHdoZW4gc2hvcnRfdmlkZW9faGVhZGVyIGlzIAotICogICAgICAgICAgICAgMSApIGZvciB3aGljaCBnb2JfaGVhZGVyX2VtcHR5IGlzICAwICBpcyB0cmVhdGVkIGFzIAotICogICAgICAgICAgICB0cmFuc3BhcmVudCwgYWNjb3JkaW5nIHRvIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi41LiAKLSAqICAgZmNvZGVGb3J3YXJkIC0gYSBjb2RlIGVxdWFsIHRvIHZvcF9mY29kZV9mb3J3YXJkIGluIE1QRUctNCBiaXQgc3RyZWFtIAotICogICAgICAgICAgICBzeW50YXggCi0gKiAgIE1CVHlwZSAtIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIElmIE1CVHlwZSBpcyBub3QgZXF1YWwgdG8gCi0gKiAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWLCB0aGUgZGVzdGluYXRpb24gbW90aW9uIHZlY3RvciBidWZmZXIgaXMgc3RpbGwgCi0gKiAgICAgICAgICAgIGZpbGxlZCB3aXRoIHRoZSBzYW1lIGRlY29kZWQgdmVjdG9yLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAotICogICBwRHN0TVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGZvciB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgbWFjcm9ibG9jazsgY29udGFpbnMgZm91ciBkZWNvZGVkIG1vdGlvbiB2ZWN0b3JzIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdE1WQ3VyTUIgCi0gKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KLSAqICAgIC0gICAgZmNvZGVGb3J3YXJkIGV4Y2VlZHMgKDAsN10KLSAqICAgIC0gICAgTUJUeXBlIGxlc3MgdGhhbiB6ZXJvCi0gKiAgICAtICAgIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvciAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WTGVmdE1CLAotICAgIE9NWFZDTW90aW9uVmVjdG9yKnBTcmNNVlVwcGVyTUIsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVlVwcGVyUmlnaHRNQiwKLSAgICBPTVhWQ01vdGlvblZlY3RvcipwRHN0TVZDdXJNQiwKLSAgICBPTVhfSU5UIGZjb2RlRm9yd2FyZCwKLSAgICBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZSBNQlR5cGUKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgKDYuMi41LjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIAotICogZm9yIG9uZSBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIAotICogcHJvdmlkZWQgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCi0gKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCi0gKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIAotICogICAgICAgICAgICBiaXRzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGJ5dGUgcmVmZXJlbmNlZCAKLSAqICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiAgVGhlIHBhcmFtZXRlciAqcEJpdE9mZnNldCBpcyB2YWxpZCBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLTddLiAKLSAqICAgICAgICAgICAgQml0IFBvc2l0aW9uIGluIG9uZSBieXRlOiAgfE1vc3QgICAgICBMZWFzdHwgCi0gKiAgICAgICAgICAgICAgICAgICAgKnBCaXRPZmZzZXQgICAgICAgIHwwIDEgMiAzIDQgNSA2IDd8IAotICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb247IHVzZWQgdG8gc2VsZWN0IHRoZSB6aWd6YWcgc2NhbiAKLSAqICAgICAgICAgICAgcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX05PTkUgLSBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkOyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbjsgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuOyAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbjsgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQgc3VjaCAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHN1Y2ggdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdAotICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCi0gKiAgICAtICAgIHByZURpciBleGNlZWRzIFswLDJdCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkIAotICogICAgT01YX1N0c19FcnIgLSBpZjoKLSAqICAgIC0gICAgSW4gRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIGRjX3NpemUgPiAxMiAKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIG1hcmsgYml0cyBlcXVhbHMgemVybyAKLSAqICAgIC0gICAgSWxsZWdhbCBzdHJlYW0gZW5jb3VudGVyZWQ7IGNvZGUgY2Fubm90IGJlIGxvY2F0ZWQgaW4gVkxDIHRhYmxlIAotICogICAgLSAgICBGb3JiaWRkZW4gY29kZSBlbmNvdW50ZXJlZCBpbiB0aGUgVkxDIEZMQyB0YWJsZS4gCi0gKiAgICAtICAgIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfVTggcHJlZERpciwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICg2LjIuNS4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyAKLSAqIGZvciBvbmUgaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSAKLSAqIHByb3ZpZGVkIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAotICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIEludHJhIERDIAotICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZy4gIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSAKLSAqICAgICAgICAgICAgYml0c3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBieXRlIHJlZmVyZW5jZWQgCi0gKiAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgdmFsaWQgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMC03XS4gQml0IFBvc2l0aW9uIGluIG9uZSBieXRlOiAgfE1vc3QgTGVhc3R8ICpwQml0T2Zmc2V0IAotICogICAgICAgICAgICB8MCAxIDIgMyA0IDUgNiA3fCAKLSAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uOyB1c2VkIHRvIHNlbGVjdCB0aGUgemlnemFnIHNjYW4gCi0gKiAgICAgICAgICAgIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogT01YX1ZDX05PTkUgLSBBQyAKLSAqICAgICAgICAgICAgcHJlZGljdGlvbiBub3QgdXNlZDsgcGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb247IHBlcmZvcm1zIAotICogICAgICAgICAgICBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW47IE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIAotICogICAgICAgICAgICBwcmVkaWN0aW9uOyBwZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKLSAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc3VjaCB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0LCAKLSAqICAgICAgICAgICAgICBvciBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10sIHByZURpciBleGNlZWRzIFswLDJdLCBvciBwRHN0IGlzIAotICogICAgICAgICAgICAgIG5vdCA0LWJ5dGUgYWxpZ25lZCAKLSAqICAgIE9NWF9TdHNfRXJyIEluIERlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBkY19zaXplID4gMTIgQXQgbGVhc3Qgb25lIG9mIAotICogICAgICAgICAgICAgIG1hcmsgYml0cyBlcXVhbHMgemVybyBJbGxlZ2FsIHN0cmVhbSBlbmNvdW50ZXJlZDsgY29kZSBjYW5ub3QgCi0gKiAgICAgICAgICAgICAgYmUgbG9jYXRlZCBpbiBWTEMgdGFibGUgRm9yYmlkZGVuIGNvZGUgZW5jb3VudGVyZWQgaW4gdGhlIFZMQyAKLSAqICAgICAgICAgICAgICBGTEMgdGFibGUgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9VOCBwcmVkRGlyLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyICAgKDYuMi41LjIuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludGVyLWNvZGVkIGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgaW4gdGhlIGN1cnJlbnQgc3RyZWFtIAotICogICAgICAgICAgICBieXRlIHJlZmVyZW5jZWQgYnkgKnBwQml0U3RyZWFtLiBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIAotICogICAgICAgICAgICB2YWxpZCB3aXRoaW4gdGhlIHJhbmdlIFswLTddLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBkZWNvZGluZyBzdWNoIHRoYXQgaXQgcG9pbnRzIAotICogICAgICAgICAgICB0byB0aGUgbmV4dCBhdmFpbGFibGUgYml0IGluIHRoZSBzdHJlYW0gYnl0ZSByZWZlcmVuY2VkIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudCBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdAotICogICAgLSAgICBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZAotICogICAgLSAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KLSAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yLCBpZjoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG1hcmsgYml0IGlzIGVxdWFsIHRvIHplcm8gCi0gKiAgICAtICAgIEVuY291bnRlcmVkIGFuIGlsbGVnYWwgc3RyZWFtIGNvZGUgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFZMQyB0YWJsZSAKLSAqICAgIC0gICAgRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBjb2RlIGluIHRoZSBWTEMgRkxDIHRhYmxlIAotICogICAgLSAgICBUaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlciAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JICAgKDYuMi41LjMuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHRoZSBzZWNvbmQgaW52ZXJzZSBxdWFudGl6YXRpb24gbW9kZSBvbiBhbiBpbnRyYS9pbnRlciBjb2RlZCAKLSAqIGJsb2NrLiBTdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBjbGlwcGVkIHRvIAotICogdGhlIHJhbmdlIFstMjA0OCwgMjA0N10uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCAocXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkgCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBUYWtlcyBvbmUgb2YgdGhlIAotICogICAgICAgICAgICBmb2xsb3dpbmcgZmxhZ3M6IE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSAoaW50cmEgCi0gKiAgICAgICAgICAgIHZlcnNpb24gb25seSkuIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXIgCi0gKiAgICAgICAgICAgIChpbnRyYSB2ZXJzaW9uIG9ubHkpLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAoZGVxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIAotICogICAgICAgICAgICAgIHRydWU6IAotICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwgCi0gKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0zMSAKLSAqICAgIC0gICAgdmlkZW9Db21wIGlzIG5laXRoZXIgT01YX1ZDX0xVTUlOQU5DRSBub3IgT01YX1ZDX0NIUk9NSU5BTkNFLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JICgKLSAgICBPTVhfUzE2ICpwU3JjRHN0LAotICAgIE9NWF9JTlQgUVAsCi0gICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JICAgKDYuMi41LjMuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHRoZSBzZWNvbmQgaW52ZXJzZSBxdWFudGl6YXRpb24gbW9kZSBvbiBhbiBpbnRyYS9pbnRlciBjb2RlZCAKLSAqIGJsb2NrLiBTdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBjbGlwcGVkIHRvIAotICogdGhlIHJhbmdlIFstMjA0OCwgMjA0N10uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCAocXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkgCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBUYWtlcyBvbmUgb2YgdGhlIAotICogICAgICAgICAgICBmb2xsb3dpbmcgZmxhZ3M6IE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSAoaW50cmEgCi0gKiAgICAgICAgICAgIHZlcnNpb24gb25seSkuIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXIgCi0gKiAgICAgICAgICAgIChpbnRyYSB2ZXJzaW9uIG9ubHkpLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAoZGVxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIAotICogICAgICAgICAgICAgIHRydWU6IAotICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwgCi0gKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0zMSAKLSAqICAgIC0gICAgdmlkZW9Db21wIGlzIG5laXRoZXIgT01YX1ZDX0xVTUlOQU5DRSBub3IgT01YX1ZDX0NIUk9NSU5BTkNFLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JICgKLSAgICBPTVhfUzE2ICpwU3JjRHN0LAotICAgIE9NWF9JTlQgUVAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSAgICg2LjIuNS40LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBEZWNvZGVzIHRoZSBJTlRSQSBibG9jayBjb2VmZmljaWVudHMuIEludmVyc2UgcXVhbnRpemF0aW9uLCBpbnZlcnNlbHkgCi0gKiB6aWd6YWcgcG9zaXRpb25pbmcsIGFuZCBJRENULCB3aXRoIGFwcHJvcHJpYXRlIGNsaXBwaW5nIG9uIGVhY2ggc3RlcCwgYXJlIAotICogcGVyZm9ybWVkIG9uIHRoZSBjb2VmZmljaWVudHMuIFRoZSByZXN1bHRzIGFyZSB0aGVuIHBsYWNlZCBpbiB0aGUgb3V0cHV0IAotICogZnJhbWUvcGxhbmUgb24gYSBwaXhlbCBiYXNpcy4gIE5vdGU6IFRoaXMgZnVuY3Rpb24gd2lsbCBiZSB1c2VkIG9ubHkgd2hlbiAKLSAqIGF0IGxlYXN0IG9uZSBub24temVybyBBQyBjb2VmZmljaWVudCBvZiBjdXJyZW50IGJsb2NrIGV4aXN0cyBpbiB0aGUgYml0IAotICogc3RyZWFtLiBUaGUgREMgb25seSBjb25kaXRpb24gd2lsbCBiZSBoYW5kbGVkIGluIGFub3RoZXIgZnVuY3Rpb24uIAotICoKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAotICogICAgICAgICAgICBzdHJlYW0gYnVmZmVyLiBUaGVyZSBpcyBubyBib3VuZGFyeSBjaGVjayBmb3IgdGhlIGJpdCBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ1ZmZlci4gCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gWzAtN10uIAotICogICBzdGVwIC0gd2lkdGggb2YgdGhlIGRlc3RpbmF0aW9uIHBsYW5lIAotICogICBwQ29lZkJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiAKLSAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcENvZWZCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIGN1clFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgbWFjcm9ibG9jayB3aGljaCB0aGUgY3VycmVudCBibG9jayAKLSAqICAgICAgICAgICAgYmVsb25ncyB0byAKLSAqICAgcFFQQnVmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBidWZmZXIgCi0gKiAgIGJsb2NrSW5kZXggLSBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQgcG9zaXRpb24gYXMgCi0gKiAgICAgICAgICAgIGRlZmluZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNi4xLjMuOCwgRmlndXJlIDYtNS4gCi0gKiAgIGludHJhRENWTEMgLSBhIGNvZGUgZGV0ZXJtaW5lZCBieSBpbnRyYV9kY192bGNfdGhyIGFuZCBRUC4gVGhpcyBhbGxvd3MgYSAKLSAqICAgICAgICAgICAgbWVjaGFuaXNtIHRvIHN3aXRjaCBiZXR3ZWVuIHR3byBWTEMgZm9yIGNvZGluZyBvZiBJbnRyYSBEQyAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnRzIGFzIHBlciBbSVNPMTQ0OTYtMl0sIFRhYmxlIDYtMjEuIAotICogICBBQ1ByZWRGbGFnIC0gYSBmbGFnIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyAob2YgbHVtaW5hbmNlKSBpbmRpY2F0aW5nIGlmIAotICogICAgICAgICAgICB0aGUgYWMgY29lZmZpY2llbnRzIG9mIHRoZSBmaXJzdCByb3cgb3IgZmlyc3QgY29sdW1uIGFyZSAKLSAqICAgICAgICAgICAgZGlmZmVyZW50aWFsbHkgY29kZWQgZm9yIGludHJhIGNvZGVkIG1hY3JvYmxvY2suIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAotICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSBkZXN0aW5hdGlvbiBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIAotICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwQ29lZkJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlci4gCi0gKiAgIHBDb2VmQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyICBOb3RlOiAKLSAqICAgICAgICAgICAgVGhlIGNvZWZmaWNpZW50IGJ1ZmZlcnMgbXVzdCBiZSB1cGRhdGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgCi0gKiAgICAgICAgICAgIHVwZGF0ZSBwcm9jZWR1cmUgZGVmaW5lZCBpbiBzZWN0aW9uIDYuMi4yLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwQ29lZkJ1ZlJvdywgcENvZWZCdWZDb2wsIAotICogICAgICAgICBwUVBCdWYsIHBEc3QuIAotICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddIAotICogICAgLSAgICBjdXJRUCBleGNlZWRzICgxLCAzMSkKLSAqICAgIC0gICAgYmxvY2tJbmRleCBleGNlZWRzIFswLDVdCi0gKiAgICAtICAgIHN0ZXAgaXMgbm90IHRoZSBtdWx0aXBsZSBvZiA4Ci0gKiAgICAtICAgIGEgcG9pbnRlciBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgd2FzIHZpb2xhdGVkLiAKLSAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yLiBSZWZlciB0byBPTVhfU3RzX0VyciBvZiBEZWNvZGVWTENaaWd6YWdfSW50cmEuICAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIHN0ZXAsCi0gICAgT01YX1MxNiAqcENvZWZCdWZSb3csCi0gICAgT01YX1MxNiAqcENvZWZCdWZDb2wsCi0gICAgT01YX1U4IGN1clFQLAotICAgIGNvbnN0IE9NWF9VOCAqcFFQQnVmLAotICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKLSAgICBPTVhfSU5UIGludHJhRENWTEMsCi0gICAgT01YX0lOVCBBQ1ByZWRGbGFnLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyICAgKDYuMi41LjQuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIERlY29kZXMgdGhlIElOVEVSIGJsb2NrIGNvZWZmaWNpZW50cy4gVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIAotICogcXVhbnRpemF0aW9uLCBpbnZlcnNlIHppZ3phZyBwb3NpdGlvbmluZywgYW5kIElEQ1QgKHdpdGggYXBwcm9wcmlhdGUgCi0gKiBjbGlwcGluZyBvbiBlYWNoIHN0ZXApIG9uIHRoZSBjb2VmZmljaWVudHMuIFRoZSByZXN1bHRzIChyZXNpZHVhbHMpIGFyZSAKLSAqIHBsYWNlZCBpbiBhIGNvbnRpZ3VvdXMgYXJyYXkgb2YgNjQgZWxlbWVudHMuIEZvciBJTlRFUiBibG9jaywgdGhlIG91dHB1dCAKLSAqIGJ1ZmZlciBob2xkcyB0aGUgcmVzaWR1YWxzIGZvciBmdXJ0aGVyIHJlY29uc3RydWN0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAotICogICAgICAgICAgICBzdHJlYW0gYnVmZmVyLiBUaGVyZSBpcyBubyBib3VuZGFyeSBjaGVjayBmb3IgdGhlIGJpdCBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ1ZmZlci4gCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gWzAtN10gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKLSAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZWNvZGVkIHJlc2lkdWFsIGJ1ZmZlciAoYSBjb250aWd1b3VzIGFycmF5IG9mIDY0IAotICogICAgICAgICAgICBlbGVtZW50cyBvZiBPTVhfUzE2IGRhdGEgdHlwZSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE51bGw6IAotICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0ICwgcERzdCAKLSAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQotICogICAgLSAgICBRUCA8PSAwLiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkIAotICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IuIFJlZmVyIHRvIE9NWF9TdHNfRXJyIG9mIERlY29kZVZMQ1ppZ3phZ19JbnRlciAuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfSU5UIFFQLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhICAgKDYuMi41LjQuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGFkYXB0aXZlIERDL0FDIGNvZWZmaWNpZW50IHByZWRpY3Rpb24gZm9yIGFuIGludHJhIGJsb2NrLiAgUHJpb3IgCi0gKiB0byB0aGUgZnVuY3Rpb24gY2FsbCwgcHJlZGljdGlvbiBkaXJlY3Rpb24gKHByZWREaXIpIHNob3VsZCBiZSBzZWxlY3RlZCBhcyAKLSAqIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMy4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50IHJlc2lkdWFscyAoUFFGKSBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSAKLSAqICAgICAgICAgICAgc2F0dXJhdGVkIHRvIHRoZSByYW5nZSBbLTIwNDgsIDIwNDddLiAKLSAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gCi0gKiAgICAgICAgICAgIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgY3VyUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBjdXJRUCBtYXkgZXF1YWwgdG8gCi0gKiAgICAgICAgICAgIHByZWRRUCBlc3BlY2lhbGx5IHdoZW4gdGhlIGN1cnJlbnQgYmxvY2sgYW5kIHRoZSBwcmVkaWN0b3IgYmxvY2sgCi0gKiAgICAgICAgICAgIGFyZSBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLiAKLSAqICAgcHJlZFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrIAotICogICBwcmVkRGlyIC0gaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUgb2YgdGhlIAotICogICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOiBPTVhfVkNfSE9SSVpPTlRBTCAtIHByZWRpY3QgaG9yaXpvbnRhbGx5IAotICogICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwgLSBwcmVkaWN0IHZlcnRpY2FsbHkgCi0gKiAgIEFDUHJlZEZsYWcgLSBhIGZsYWcgaW5kaWNhdGluZyBpZiBBQyBwcmVkaWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQuIEl0IAotICogICAgICAgICAgICBpcyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgaW4gdGhlIGJpdCBzdHJlYW0gc3ludGF4IG9mIE1QRUctNCAKLSAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSBvciBjaHJvbWluYW5jZSkgb2YgdGhlIAotICogICAgICAgICAgICBjdXJyZW50IGJsb2NrIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyAoUUYpIG9mIHRoZSBjdXJyZW50IGJsb2NrIAotICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlciAKLSAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgIE5vdGU6IAotICogICAgICAgICAgICBCdWZmZXIgdXBkYXRlOiBVcGRhdGUgdGhlIEFDIHByZWRpY3Rpb24gYnVmZmVyIChib3RoIHJvdyBhbmQgCi0gKiAgICAgICAgICAgIGNvbHVtbiBidWZmZXIpLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6Ci0gKiAgICAgICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICAgIHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbC4gCi0gKiAgICAgICAgLSAgICBjdXJRUCA8PSAwLCAKLSAqICAgICAgICAtICAgIHByZWRRUCA8PSAwLCAKLSAqICAgICAgICAtICAgIGN1clFQID4zMSwgCi0gKiAgICAgICAgLSAgICBwcmVkUVAgPiAzMSwgCi0gKiAgICAgICAgLSAgICBwcmVEaXIgZXhjZWVkcyBbMSwyXQotICogICAgICAgIC0gICAgcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSAoCi0gICAgT01YX1MxNiAqcFNyY0RzdCwKLSAgICBPTVhfUzE2ICpwUHJlZEJ1ZlJvdywKLSAgICBPTVhfUzE2ICpwUHJlZEJ1ZkNvbCwKLSAgICBPTVhfSU5UIGN1clFQLAotICAgIE9NWF9JTlQgcHJlZFFQLAotICAgIE9NWF9JTlQgcHJlZERpciwKLSAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCi0gICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgICAoNi4yLjUuNS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgbW90aW9uIGNvbXBlbnNhdGlvbiBwcmVkaWN0aW9uIGZvciBhbiA4eDggYmxvY2sgdXNpbmcgCi0gKiBpbnRlcnBvbGF0aW9uIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuIAotICogICBzcmNTdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGRzdFN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgCi0gKiAgICAgICAgICAgIGRlc3RpbmF0aW9uIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBwU3JjUmVzaWR1ZSAtIHBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgMTYtYml0IHByZWRpY3Rpb24gCi0gKiAgICAgICAgICAgIHJlc2lkdWFsczsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIElmIHRoZSBwb2ludGVyIGlzIE5VTEwsIHRoZW4gCi0gKiAgICAgICAgICAgIG5vIHByZWRpY3Rpb24gaXMgZG9uZSwgb25seSBtb3Rpb24gY29tcGVuc2F0aW9uLCBpLmUuLCB0aGUgYmxvY2sgCi0gKiAgICAgICAgICAgIGlzIG1vdmVkIHdpdGggaW50ZXJwb2xhdGlvbi4gCi0gKiAgIHByZWRpY3RUeXBlIC0gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiB0eXBlLCBhcyBkZWZpbmVkIGluIHNlY3Rpb24gCi0gKiAgICAgICAgICAgIDYuMi4xLjIuIAotICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuICBJZiAKLSAqICAgICAgICAgICAgcHJlZGljdGlvbiByZXNpZHVhbHMgYXJlIGFkZGVkIHRoZW4gb3V0cHV0IGludGVuc2l0aWVzIGFyZSAKLSAqICAgICAgICAgICAgY2xpcHBlZCB0byB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgICBwRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHBTcmNSZXNpZHVlIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgb3IgcERzdC4gCi0gKiAgICAtICAgIGVpdGhlciBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIGludmFsaWQgdHlwZSBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgcHJlZGljdFR5cGUuIAotICogICAgLSAgICB0aGUgcGFyYW1ldGVyIHJuZFZhbCBpcyBub3QgZXF1YWwgZWl0aGVyIHRvIDAgb3IgMS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX01DUmVjb25CbG9jayAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9JTlQgc3JjU3RlcCwKLSAgICBjb25zdCBPTVhfUzE2ICpwU3JjUmVzaWR1ZSwKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBkc3RTdGVwLAotICAgIE9NWF9JTlQgcHJlZGljdFR5cGUsCi0gICAgT01YX0lOVCBybmRWYWwKLSk7Ci0KLQotCi0vKiA2LjMuMS4xIEludHJhIDE2eDE2IFByZWRpY3Rpb24gTW9kZXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgaW50cmFfMTZ4MTYgbWFjcm9ibG9jayBwcmVkaWN0aW9uIG1vZGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDXzE2WDE2X1ZFUlQgPSAwLCAgLyoqIEludHJhXzE2eDE2X1ZlcnRpY2FsICovCi0gICAgT01YX1ZDXzE2WDE2X0hPUiA9IDEsICAgLyoqIEludHJhXzE2eDE2X0hvcml6b250YWwgKi8KLSAgICBPTVhfVkNfMTZYMTZfREMgPSAyLCAgICAvKiogSW50cmFfMTZ4MTZfREMgKi8KLSAgICBPTVhfVkNfMTZYMTZfUExBTkUgPSAzICAvKiogSW50cmFfMTZ4MTZfUGxhbmUgKi8gCi19IE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGU7Ci0KLQotCi0vKiA2LjMuMS4yIEludHJhIDR4NCBQcmVkaWN0aW9uIE1vZGVzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIGludHJhXzR4NCBtYWNyb2Jsb2NrIHByZWRpY3Rpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfNFg0X1ZFUlQgPSAwLCAgICAgLyoqIEludHJhXzR4NF9WZXJ0aWNhbCAqLwotICAgIE9NWF9WQ180WDRfSE9SID0gMSwgICAgICAvKiogSW50cmFfNHg0X0hvcml6b250YWwgKi8KLSAgICBPTVhfVkNfNFg0X0RDID0gMiwgICAgICAgLyoqIEludHJhXzR4NF9EQyAqLwotICAgIE9NWF9WQ180WDRfRElBR19ETCA9IDMsICAvKiogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fTGVmdCAqLwotICAgIE9NWF9WQ180WDRfRElBR19EUiA9IDQsICAvKiogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fUmlnaHQgKi8KLSAgICBPTVhfVkNfNFg0X1ZSID0gNSwgICAgICAgLyoqIEludHJhXzR4NF9WZXJ0aWNhbF9SaWdodCAqLwotICAgIE9NWF9WQ180WDRfSEQgPSA2LCAgICAgICAvKiogSW50cmFfNHg0X0hvcml6b250YWxfRG93biAqLwotICAgIE9NWF9WQ180WDRfVkwgPSA3LCAgICAgICAvKiogSW50cmFfNHg0X1ZlcnRpY2FsX0xlZnQgKi8KLSAgICBPTVhfVkNfNFg0X0hVID0gOCAgICAgICAgLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsX1VwICovIAotfSBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZTsKLQotCi0KLS8qIDYuMy4xLjMgQ2hyb21hIFByZWRpY3Rpb24gTW9kZXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgaW50cmEgY2hyb21hIHByZWRpY3Rpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfQ0hST01BX0RDID0gMCwgICAgLyoqIEludHJhX0Nocm9tYV9EQyAqLwotICAgIE9NWF9WQ19DSFJPTUFfSE9SID0gMSwgICAvKiogSW50cmFfQ2hyb21hX0hvcml6b250YWwgKi8KLSAgICBPTVhfVkNfQ0hST01BX1ZFUlQgPSAyLCAgLyoqIEludHJhX0Nocm9tYV9WZXJ0aWNhbCAqLwotICAgIE9NWF9WQ19DSFJPTUFfUExBTkUgPSAzICAvKiogSW50cmFfQ2hyb21hX1BsYW5lICovIAotfSBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZTsKLQotCi0KLS8qIDYuMy4xLjQgTW90aW9uIEVzdGltYXRpb24gTW9kZXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgSC4yNjQgbW90aW9uIGVzdGltYXRpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfTTRQMTBfRkFTVF9TRUFSQ0ggPSAwLCAvKiogRmFzdCBtb3Rpb24gc2VhcmNoICovCi0gICAgT01YX1ZDX000UDEwX0ZVTExfU0VBUkNIID0gMSAgLyoqIEZ1bGwgbW90aW9uIHNlYXJjaCAqLyAKLX0gT01YVkNNNFAxME1FTW9kZTsKLQotCi0KLS8qIDYuMy4xLjUgTWFjcm9ibG9jayBUeXBlcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBILjI2NCBtYWNyb2Jsb2NrIHR5cGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDX1BfMTZ4MTYgID0gMCwgLyogZGVmaW5lZCBieSBbSVNPMTQ0OTYtMTBdICovCi0gICAgT01YX1ZDX1BfMTZ4OCAgPSAxLAotICAgIE9NWF9WQ19QXzh4MTYgID0gMiwKLSAgICBPTVhfVkNfUF84eDggID0gMywKLSAgICBPTVhfVkNfUFJFRjBfOHg4ICA9IDQsCi0gICAgT01YX1ZDX0lOVEVSX1NLSVAgID0gNSwKLSAgICBPTVhfVkNfSU5UUkFfNHg0ICA9IDgsCi0gICAgT01YX1ZDX0lOVFJBXzE2eDE2ICA9IDksCi0gICAgT01YX1ZDX0lOVFJBX1BDTSA9IDEwIAotfSBPTVhWQ000UDEwTWFjcm9ibG9ja1R5cGU7Ci0KLQotCi0vKiA2LjMuMS42IFN1Yi1NYWNyb2Jsb2NrIFR5cGVzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIEguMjY0IHN1Yi1tYWNyb2Jsb2NrIHR5cGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDX1NVQl9QXzh4OCA9IDAsIC8qIGRlZmluZWQgYnkgW0lTTzE0NDk2LTEwXSAqLwotICAgIE9NWF9WQ19TVUJfUF84eDQgPSAxLAotICAgIE9NWF9WQ19TVUJfUF80eDggPSAyLAotICAgIE9NWF9WQ19TVUJfUF80eDQgPSAzIAotfSBPTVhWQ000UDEwU3ViTWFjcm9ibG9ja1R5cGU7Ci0KLQotCi0vKiA2LjMuMS43IFZhcmlhYmxlIExlbmd0aCBDb2RpbmcgKFZMQykgSW5mb3JtYXRpb24gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfVTggdVRyYWlsaW5nX09uZXM7ICAgICAgLyogVHJhaWxpbmcgb25lczsgMyBhdCBtb3N0ICovCi0gICAgT01YX1U4IHVUcmFpbGluZ19PbmVfU2lnbnM7IC8qIFRyYWlsaW5nIG9uZXMgc2lnbmFsICovCi0gICAgT01YX1U4IHVOdW1Db2VmZnM7ICAgICAgICAgIC8qIFRvdGFsIG51bWJlciBvZiBub24temVybyBjb2VmcywgaW5jbHVkaW5nIHRyYWlsaW5nIG9uZXMgKi8KLSAgICBPTVhfVTggdVRvdGFsWmVyb3M7ICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIHplcm8gY29lZnMgKi8KLSAgICBPTVhfUzE2IGlMZXZlbHNbMTZdOyAgICAgICAgLyogTGV2ZWxzIG9mIG5vbi16ZXJvIGNvZWZzLCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIgKi8KLSAgICBPTVhfVTggdVJ1bnNbMTZdOyAgICAgICAgICAgLyogUnVucyBmb3IgbGV2ZWxzIGFuZCB0cmFpbGluZyBvbmVzLCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIgKi8KLX0gT01YVkNNNFAxMFZMQ0luZm87Ci0KLQotCi0vKiA2LjMuMS44IE1hY3JvYmxvY2sgSW5mb3JtYXRpb24gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfUzMyIHNsaWNlSWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzbGljZSBudW1iZXIgKi8KLSAgICBPTVhWQ000UDEwTWFjcm9ibG9ja1R5cGUgbWJUeXBlOyAgICAgICAgICAvKiBNQiB0eXBlICovCi0gICAgT01YVkNNNFAxMFN1Yk1hY3JvYmxvY2tUeXBlIHN1Yk1CVHlwZVs0XTsgLyogc3ViLWJsb2NrIHR5cGUgKi8KLSAgICBPTVhfUzMyIHFweTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBxcCBmb3IgbHVtYSAqLwotICAgIE9NWF9TMzIgcXBjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHFwIGZvciBjaHJvbWEgKi8KLSAgICBPTVhfVTMyIGNicHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDQlAgTHVtYSAqLwotICAgIE9NWF9VMzIgY2JwYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENCUCBDaHJvbWEgKi8KLSAgICBPTVhWQ01vdGlvblZlY3RvciBwTVYwWzRdWzRdOyAvKiBtb3Rpb24gdmVjdG9yLCByZXByZXNlbnRlZCB1c2luZyAxLzQtcGVsIHVuaXRzLCBwTVYwW2Jsb2NreV1bYmxvY2t4XSAoYmxvY2t5ID0gMH4zLCBibG9ja3ggPTB+MykgKi8KLSAgICBPTVhWQ01vdGlvblZlY3RvciBwTVZQcmVkWzRdWzRdOyAvKiBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24sIFJlcHJlc2VudGVkIHVzaW5nIDEvNC1wZWwgdW5pdHMsIHBNVlByZWRbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjMsIGJsb2NreCA9IDB+MykgKi8KLSAgICBPTVhfVTggcFJlZkwwSWR4WzRdOyAgICAgICAgICAgICAgICAgICAgICAvKiByZWZlcmVuY2UgcGljdHVyZSBpbmRpY2VzICovCi0gICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSBJbnRyYTE2eDE2UHJlZE1vZGU7IC8qIGJlc3QgaW50cmEgMTZ4MTYgcHJlZGljdGlvbiBtb2RlICovCi0gICAgT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUgcEludHJhNHg0UHJlZE1vZGVbMTZdOyAvKiBiZXN0IGludHJhIDR4NCBwcmVkaWN0aW9uIG1vZGUgZm9yIGVhY2ggYmxvY2ssIHBNVjAgaW5kZXhlZCBhcyBhYm92ZSAqLwotfSBPTVhWQ000UDEwTUJJbmZvLCAqT01YVkNNNFAxME1CSW5mb1B0cjsKLQotCi0KLS8qIDYuMy4xLjkgTW90aW9uIEVzdGltYXRpb24gUGFyYW1ldGVycyAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9TMzIgYmxvY2tTcGxpdEVuYWJsZTh4ODsgLyogZW5hYmxlcyAxNng4LCA4eDE2LCA4eDggKi8KLSAgICBPTVhfUzMyIGJsb2NrU3BsaXRFbmFibGU0eDQ7IC8qIGVuYWJsZSBzcGxpdHRpbmcgb2YgOHg0LCA0eDgsIDR4NCBibG9ja3MgKi8KLSAgICBPTVhfUzMyIGhhbGZTZWFyY2hFbmFibGU7Ci0gICAgT01YX1MzMiBxdWFydGVyU2VhcmNoRW5hYmxlOwotICAgIE9NWF9TMzIgaW50cmFFbmFibGU0eDQ7ICAgICAgLyogMT1lbmFibGUsIDA9ZGlzYWJsZSAqLwotICAgIE9NWF9TMzIgc2VhcmNoUmFuZ2UxNngxNjsgICAgLyogaW50ZWdlciBwaXhlbCB1bml0cyAqLwotICAgIE9NWF9TMzIgc2VhcmNoUmFuZ2U4eDg7Ci0gICAgT01YX1MzMiBzZWFyY2hSYW5nZTR4NDsKLX0gT01YVkNNNFAxME1FUGFyYW1zOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCAgICg2LjMuMy4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtIEludHJhXzR4NCBwcmVkaWN0aW9uIGZvciBsdW1hIHNhbXBsZXMuIElmIHRoZSB1cHBlci1yaWdodCBibG9jayBpcyAKLSAqIG5vdCBhdmFpbGFibGUsIHRoZW4gZHVwbGljYXRpb24gd29yayBzaG91bGQgYmUgaGFuZGxlZCBpbnNpZGUgdGhlIGZ1bmN0aW9uLiAKLSAqIFVzZXJzIG5lZWQgbm90IGRlZmluZSB0aGVtIG91dHNpZGUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNMZWZ0IC0gIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA0IGxlZnQgcGl4ZWxzOiAKLSAqICAgICAgICAgICAgICAgICAgcFt4LCB5XSAoeCA9IC0xLCB5ID0gMC4uMykgCi0gKiAgIHBTcmNBYm92ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA4IGFib3ZlIHBpeGVsczogCi0gKiAgICAgICAgICAgICAgICAgIHBbeCx5XSAoeCA9IDAuLjcsIHkgPS0xKTsgCi0gKiAgICAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCi0gKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIHByZWRNb2RlIC0gSW50cmFfNHg0IHByZWRpY3Rpb24gbW9kZS4gCi0gKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIDR4NCBibG9jayBhdmFpbGFiaWxpdHkgZmxhZywgcmVmZXIgdG8gCi0gKiAgICAgICAgICAgICAiTmVpZ2hib3JpbmcgTWFjcm9ibG9jayBBdmFpbGFiaWxpdHkiIC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIHBEc3QgaXMgTlVMTC4gCi0gKiAgICBkc3RTdGVwIDwgNCwgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAotICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKLSAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX1VQUEVSIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0RJQUdfREwsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LCAtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfRElBR19EUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKLSAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCi0gKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVlIsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCi0gKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAotICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hELCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAotICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKLSAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WTCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfVVBQRVIgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hVLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKLSAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIAotICoKLSAqIE5vdGU6IAotICogICAgIHBTcmNBYm92ZSwgcFNyY0Fib3ZlLCBwU3JjQWJvdmVMZWZ0IG1heSBiZSBpbnZhbGlkIHBvaW50ZXJzIGlmIAotICogICAgIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gYXMgaW1wbGllZCBpbiBwcmVkTW9kZS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNMZWZ0LAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlTGVmdCwKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBsZWZ0U3RlcCwKLSAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUgcHJlZE1vZGUsCi0gICAgT01YX1MzMiBhdmFpbGFiaWxpdHkKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgICAoNi4zLjMuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybSBJbnRyYV8xNngxNiBwcmVkaWN0aW9uIGZvciBsdW1hIHNhbXBsZXMuIElmIHRoZSB1cHBlci1yaWdodCBibG9jayAKLSAqIGlzIG5vdCBhdmFpbGFibGUsIHRoZW4gZHVwbGljYXRpb24gd29yayBzaG91bGQgYmUgaGFuZGxlZCBpbnNpZGUgdGhlIAotICogZnVuY3Rpb24uIFVzZXJzIG5lZWQgbm90IGRlZmluZSB0aGVtIG91dHNpZGUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNMZWZ0IC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGxlZnQgcGl4ZWxzOiBwW3gsIHldICh4ID0gLTEsIHkgPSAKLSAqICAgICAgICAgICAgMC4uMTUpIAotICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgYWJvdmUgcGl4ZWxzOiBwW3gseV0gKHggPSAwLi4xNSwgCi0gKiAgICAgICAgICAgIHk9IC0xKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCi0gKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcHJlZE1vZGUgLSBJbnRyYV8xNngxNiBwcmVkaWN0aW9uIG1vZGUsIHBsZWFzZSByZWZlciB0byBzZWN0aW9uIDMuNC4xLiAKLSAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgMTZ4MTYgTUIgYXZhaWxhYmlsaXR5IGZsYWcuIFJlZmVyIHRvIAotICogICAgICAgICAgICAgICAgICBzZWN0aW9uIDMuNC40LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgcERzdCBpcyBOVUxMLiAKLSAqICAgIGRzdFN0ZXAgPCAxNi4gb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAotICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUgCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMTUpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4xNSkgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfUExBTkUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCi0gKiAgICAgICAgICAgICAgcFt4LC0xXSh4ID0gMC4uMTUpLCBvciBwWy0xLHldICh5ID0gMC4uMTUpLCBvciBwWy0xLC0xXSBpcyBub3QgCi0gKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCi0gKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgCi0gKgotICogTm90ZTogCi0gKiAgICAgcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlcnMgaWYgCi0gKiAgICAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBpbXBsaWVkIGluIHByZWRNb2RlLiAKLSAqIE5vdGU6IAotICogICAgIE9NWF9WQ19VUFBFUl9SSUdIVCBpcyBub3QgdXNlZCBpbiBpbnRyYV8xNngxNiBsdW1hIHByZWRpY3Rpb24uIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNMZWZ0LAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlTGVmdCwKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBsZWZ0U3RlcCwKLSAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSBwcmVkTW9kZSwKLSAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggICAoNi4zLjMuMS4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW50cmEgcHJlZGljdGlvbiBmb3IgY2hyb21hIHNhbXBsZXMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNMZWZ0IC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggbGVmdCBwaXhlbHM6IHBbeCwgeV0gKHggPSAtMSwgeT0gCi0gKiAgICAgICAgICAgIDAuLjcpLiAKLSAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggYWJvdmUgcGl4ZWxzOiBwW3gseV0gKHggPSAwLi43LCB5IAotICogICAgICAgICAgICA9IC0xKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCi0gKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIHByZWRNb2RlIC0gSW50cmEgY2hyb21hIHByZWRpY3Rpb24gbW9kZSwgcGxlYXNlIHJlZmVyIHRvIHNlY3Rpb24gMy40LjMuIAotICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyBjaHJvbWEgYmxvY2sgYXZhaWxhYmlsaXR5IGZsYWcsIHBsZWFzZSByZWZlciAKLSAqICAgICAgICAgICAgdG8gICJOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSIuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIGFueSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgcERzdCBpcyBOVUxMLiAKLSAqICAgIGRzdFN0ZXAgPCA4IG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCi0gKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi43KSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ19DSFJPTUFfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjcpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9QTEFORSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKLSAqICAgICAgICAgICAgICBwW3gsLTFdKHggPSAwLi43KSwgb3IgcFstMSx5XSAoeSA9IDAuLjcpLCBvciBwWy0xLC0xXSBpcyBub3QgCi0gKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCi0gKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkuICAKLSAqCi0gKiAgTm90ZTogcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlciBpZiAKLSAqICB0aGV5IGFyZSBub3QgdXNlZCBieSBpbnRyYSBwcmVkaWN0aW9uIGltcGxpZWQgaW4gcHJlZE1vZGUuIAotICoKLSAqICBOb3RlOiBPTVhfVkNfVVBQRVJfUklHSFQgaXMgbm90IHVzZWQgaW4gaW50cmEgY2hyb21hIHByZWRpY3Rpb24uIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjTGVmdCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgbGVmdFN0ZXAsCi0gICAgT01YX0lOVCBkc3RTdGVwLAotICAgIE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlIHByZWRNb2RlLAotICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hICAgKDYuMy4zLjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHF1YXJ0ZXItcGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgaW50ZXIgbHVtYSBNQi4gSXQgaXMgYXNzdW1lZCB0aGF0IAotICogdGhlIGZyYW1lIGlzIGFscmVhZHkgcGFkZGVkIHdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIgCi0gKiAgIHNyY1N0ZXAgLSByZWZlcmVuY2UgZnJhbWUgc3RlcCwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiByb2kud2lkdGggCi0gKiAgIGRzdFN0ZXAgLSBkZXN0aW5hdGlvbiBmcmFtZSBzdGVwLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAotICogICAgICAgICAgICByb2kud2lkdGggCi0gKiAgIGR4IC0gRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQgaW4gMS80IHBpeGVsIAotICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10gCi0gKiAgIGR5IC0gRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgeSBjb21wb25lbnQgaW4gMS80IHBpeGVsIAotICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10gCi0gKiAgIHJvaSAtIERpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247IHRoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgCi0gKiAgICAgICAgICAgIHJvaS5oZWlnaHQgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZnJhbWUgYnVmZmVyOiAKLSAqICAgICAgICAgIGlmIHJvaS53aWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKiAgICAgICAgICBpZiByb2kud2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICogICAgICAgICAgaWYgcm9pLndpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgc3JjU3RlcCBvciBkc3RTdGVwIDwgcm9pLndpZHRoLiAKLSAqICAgIGR4IG9yIGR5IGlzIG91dCBvZiByYW5nZSBbMCwzXS4gCi0gKiAgICByb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBvdXQgb2YgcmFuZ2UgezQsIDgsIDE2fS4gCi0gKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgYnV0IHBEc3QgaXMgbm90IDQgYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA4IG9yIDE2LCBidXQgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuIAotICogICAgc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX1MzMiBzcmNTdGVwLAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfUzMyIGRzdFN0ZXAsCi0gICAgT01YX1MzMiBkeCwKLSAgICBPTVhfUzMyIGR5LAotICAgIE9NWFNpemUgcm9pCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgICAoNi4zLjMuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgMS84LXBpeGVsIGludGVycG9sYXRpb24gZm9yIGludGVyIGNocm9tYSBNQi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIgCi0gKiAgIHNyY1N0ZXAgLVJlZmVyZW5jZSBmcmFtZSBzdGVwIGluIGJ5dGVzIAotICogICBkc3RTdGVwIC1EZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCi0gKiAgICAgICAgICAgIHJvaS53aWR0aC4gCi0gKiAgIGR4IC1GcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgCi0gKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XSAKLSAqICAgZHkgLUZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgCi0gKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XSAKLSAqICAgcm9pIC1EaW1lbnNpb24gb2YgdGhlIGludGVycG9sYXRpb24gcmVnaW9uOyB0aGUgcGFyYW1ldGVycyByb2kud2lkdGggYW5kIAotICogICAgICAgICAgICByb2kuaGVpZ2h0IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDIsIDQsIG9yIDguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXI6Ci0gKiAgICAgICAgIGlmIHJvaS53aWR0aD09MiwgIDItYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKiAgICAgICAgIGlmIHJvaS53aWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKiAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgPCA4LiAKLSAqICAgIGR4IG9yIGR5IGlzIG91dCBvZiByYW5nZSBbMC03XS4gCi0gKiAgICByb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBvdXQgb2YgcmFuZ2UgezIsNCw4fS4gCi0gKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gMiwgYnV0IHBEc3QgaXMgbm90IDItYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDgsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCi0gKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9TMzIgc3JjU3RlcCwKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX1MzMiBkc3RTdGVwLAotICAgIE9NWF9TMzIgZHgsCi0gICAgT01YX1MzMiBkeSwKLSAgICBPTVhTaXplIHJvaQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSAgICg2LjMuMy4zLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiBmb3VyIHZlcnRpY2FsIGVkZ2VzIG9mIHRoZSBsdW1hIAotICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC1TdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBBbHBoYSAtQXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBhbHBoYSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKLSAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIAotICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgcEJldGEgLUFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAotICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLUFycmF5IG9mIHNpemUgMTYgb2YgVGhyZXNob2xkcyAoVEMwKSAodmFsdWVzIGZvciB0aGUgbGVmdCAKLSAqICAgICAgICAgICAgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIpOyBtdXN0IAotICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5Li4gIFBlciBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IAotICogICAgICAgICAgICBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC1BcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIAotICogICAgICAgICAgICBvcmRlcik7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIAotICogICAgICAgICAgICBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBFaXRoZXIgb2YgdGhlIHBvaW50ZXJzIGluIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMgCi0gKiAgICAgICAgICAgICAgaXMgTlVMTC4gCi0gKiAgICBFaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAotICogICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV1pcyBvdXRzaWRlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICByYW5nZSBbMCwyNV0uIAotICogICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgKHBCU1tpXT09NCAmJiAKLSAqICAgICAgICAgICAgICBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICgKLSAgICBPTVhfVTggKnBTcmNEc3QsCi0gICAgT01YX1MzMiBzcmNkc3RTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAotICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCi0gICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKLSAgICBjb25zdCBPTVhfVTggKnBCUwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSAgICg2LjMuMy4zLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiBmb3VyIGhvcml6b250YWwgZWRnZXMgb2YgdGhlIGx1bWEgCi0gKiBtYWNyb2Jsb2NrICgxNngxNikuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHNyY2RzdFN0ZXAgLSBzdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBBbHBoYSAtIGFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYWxwaGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCi0gKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgCi0gKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgcEJldGEgLSBhcnJheSBvZiBzaXplIDIgb2YgYmV0YSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYmV0YSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIAotICogICAgICAgICAgICBpcyBmb3IgdGhlIGludGVybmFsIGhvcml6b250YWwgZWRnZSkuIFBlciBbSVNPMTQ0OTYtMTBdIGJldGEgCi0gKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgMTYgY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgdG9wIAotICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgYmxvY2sgCi0gKiAgICAgICAgICAgIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgW0lTTzE0NDk2IDEwXSAKLSAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayAKLSAqICAgICAgICAgICAgb3JkZXIpOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSAKLSAqICAgICAgICAgICAgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciwgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAotICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKLSAqICAgIC0gICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgLSAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgIC0gICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XSBpcyAKLSAqICAgICAgICAgb3V0c2lkZSBvZiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCi0gKiAgICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JICgKLSAgICBPTVhfVTggKnBTcmNEc3QsCi0gICAgT01YX1MzMiBzcmNkc3RTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAotICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCi0gICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKLSAgICBjb25zdCBPTVhfVTggKnBCUwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JICAgKDYuMy4zLjMuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgdmVydGljYWwgZWRnZXMgb2YgdGhlIGNocm9tYSAKLSAqIG1hY3JvYmxvY2sgKDh4OCkuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBwQWxwaGEgLSBBcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgYWxwaGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyBmb3IgCi0gKiAgICAgICAgICAgIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSAKLSAqICAgICAgICAgICAgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAotICogICBwQmV0YSAtIEFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAotICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLSBBcnJheSBvZiBzaXplIDggY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgbGVmdCAKLSAqICAgICAgICAgICAgdmVydGljYWwgZWRnZSBvZiBlYWNoIDR4MiBjaHJvbWEgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIAotICogICAgICAgICAgICBibG9jayBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLSBBcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKHZhbHVlcyBmb3IgZWFjaCAyeDIgY2hyb21hIAotICogICAgICAgICAgICBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIpLiBUaGlzIHBhcmFtZXRlciBpcyB0aGUgCi0gKiAgICAgICAgICAgIHNhbWUgYXMgdGhlIHBCUyBwYXJhbWV0ZXIgcGFzc2VkIGludG8gRmlsdGVyRGVibG9ja0x1bWFfVmVyRWRnZTsgCi0gKiAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSAKLSAqICAgICAgICAgICAgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIAotICogICAgICAgICAgICBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNCBieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAotICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBwVGhyZXNob2xkcyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgIC0gICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjddIGlzIG91dHNpZGUgCi0gKiAgICAgICAgIG9mIHRoZSByYW5nZSBbMCwyNV0uIAotICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCi0gKiAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKLSAqICAgIC0gICAgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSAoCi0gICAgT01YX1U4ICpwU3JjRHN0LAotICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKLSAgICBjb25zdCBPTVhfVTggKnBCZXRhLAotICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCi0gICAgY29uc3QgT01YX1U4ICpwQlMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSAgICg2LjMuMy4zLjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiB0aGUgaG9yaXpvbnRhbCBlZGdlcyBvZiB0aGUgY2hyb21hIAotICogbWFjcm9ibG9jayAoOHg4KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC0gYXJyYXkgc3RlcDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBwQWxwaGEgLSBhcnJheSBvZiBzaXplIDIgY29udGFpbmluZyBhbHBoYSB0aHJlc2hvbGRzOyB0aGUgZmlyc3QgZWxlbWVudCAKLSAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSAKLSAqICAgICAgICAgICAgc2Vjb25kIGVsZW1lbnQgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgaW50ZXJuYWwgaG9yaXpvbnRhbCAKLSAqICAgICAgICAgICAgZWRnZS4gIFBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC0gYXJyYXkgb2Ygc2l6ZSAyIGNvbnRhaW5pbmcgYmV0YSB0aHJlc2hvbGRzOyB0aGUgZmlyc3QgZWxlbWVudCAKLSAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSAKLSAqICAgICAgICAgICAgc2Vjb25kIGVsZW1lbnQgY29udGFpbnMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGludGVybmFsIAotICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UuICBQZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLSBhcnJheSBvZiBzaXplIDggY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgdG9wIAotICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2Ugb2YgZWFjaCAyeDQgY2hyb21hIGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIAotICogICAgICAgICAgICBibG9jayBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2IGNvbnRhaW5pbmcgQlMgcGFyYW1ldGVycyBmb3IgZWFjaCAyeDIgY2hyb21hIAotICogICAgICAgICAgICBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcjsgdmFsaWQgaW4gdGhlIHJhbmdlIAotICogICAgICAgICAgICBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciAKLSAqICAgICAgICAgICAgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAKLSAqICAgICAgICAgICAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqIAotICogICAgT01YX1N0c19CYWRBcmdFcnIsIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBwVGhyZXNob2xkcyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgIC0gICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjddIGlzIG91dHNpZGUgCi0gKiAgICAgICAgIG9mIHRoZSByYW5nZSBbMCwyNV0uIAotICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKLSAqICAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4KLSAqICAgIC0gICAgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSAoCi0gICAgT01YX1U4ICpwU3JjRHN0LAotICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKLSAgICBjb25zdCBPTVhfVTggKnBCZXRhLAotICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCi0gICAgY29uc3QgT01YX1U4ICpwQlMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JICAgKDYuMy4zLjMuNSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgdGhlIGhvcml6b250YWwgYW5kIAotICogdmVydGljYWwgZWRnZXMgb2YgYSBsdW1hIG1hY3JvYmxvY2sgKDE2eDE2KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtIGltYWdlIHdpZHRoOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwQWxwaGEgLSBwb2ludGVyIHRvIGEgMngyIHRhYmxlIG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyAKLSAqICAgICAgICAgICAgZm9sbG93czoge2V4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIAotICogICAgICAgICAgICBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgcEJldGEgLSBwb2ludGVyIHRvIGEgMngyIHRhYmxlIG9mIGJldGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IAotICogICAgICAgICAgICB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgCi0gKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgW0lTTzE0NDk2LTEwXSAKLSAqICAgICAgICAgICAgYmV0YSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLSBwb2ludGVyIHRvIGEgMTZ4MiB0YWJsZSBvZiB0aHJlc2hvbGQgKFRDMCksIG9yZ2FuaXplZCBhcyAKLSAqICAgICAgICAgICAgZm9sbG93czoge3ZhbHVlcyBmb3IgdGhlIGxlZnQgb3IgYWJvdmUgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgCi0gKiAgICAgICAgICAgIGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIG9yZGVyIGFuZCB0aGVuIGluIGhvcml6b250YWwgYmxvY2sgCi0gKiAgICAgICAgICAgIG9yZGVyfTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIFtJU08xNDQ5Ni0xMF0gCi0gKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLSBwb2ludGVyIHRvIGEgMTZ4MiB0YWJsZSBvZiBCUyBwYXJhbWV0ZXJzIGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgCi0gKiAgICAgICAgICAgIG9yZGVyIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzOyB2YWxpZCBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IAotICogICAgICAgICAgICBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IAotICogICAgICAgICAgICA0LiBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAotICogICAgLSAgICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAotICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcyBvciBwQlMuIAotICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEFscGhhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAotICogICAgICAgICAgICAgIFswLDI1NV0uIAotICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQmV0YVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgICBbMCwxOF0uIAotICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4zMV1pcyBvdXRzaWRlIG9mIAotICogICAgICAgICAgICAgIHRoZSByYW5nZSBbMCwyNV0uIAotICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKLSAqICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKLSAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JICgKLSAgICBPTVhfVTggKnBTcmNEc3QsCi0gICAgT01YX1MzMiBzcmNkc3RTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAotICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCi0gICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKLSAgICBjb25zdCBPTVhfVTggKnBCUwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSAgICg2LjMuMy4zLjYpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NraW5nIGZpbHRlcmluZyBvbiBhbGwgZWRnZXMgb2YgdGhlIGNocm9tYSAKLSAqIG1hY3JvYmxvY2sgKDE2eDE2KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC0gc3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIHBBbHBoYSAtIHBvaW50ZXIgdG8gYSAyeDIgYXJyYXkgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIAotICogICAgICAgICAgICBmb2xsb3dzOiB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgCi0gKiAgICAgICAgICAgIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAotICogICBwQmV0YSAtIHBvaW50ZXIgdG8gYSAyeDIgYXJyYXkgb2YgQmV0YSBUaHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogCi0gKiAgICAgICAgICAgIHsgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgCi0gKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgW0lTTzE0NDk2LTEwXSAKLSAqICAgICAgICAgICAgYmV0YSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLSBhcnJheSBvZiBzaXplIDh4MiBvZiBUaHJlc2hvbGRzIChUQzApICh2YWx1ZXMgZm9yIHRoZSBsZWZ0IAotICogICAgICAgICAgICBvciBhYm92ZSBlZGdlIG9mIGVhY2ggNHgyIG9yIDJ4NCBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgCi0gKiAgICAgICAgICAgIGJsb2NrIG9yZGVyIGFuZCB0aGVuIGluIGhvcml6b250YWwgYmxvY2sgb3JkZXIpOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiBQZXIgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTZ4MiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIG9yZGVyIAotICogICAgICAgICAgICBmb3IgdmVydGljYWwgZWRnZXMgYW5kIHRoZW4gaG9yaXpvbnRhbCBlZGdlcyk7IHZhbGlkIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgCi0gKiAgICAgICAgICAgIG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gCi0gKiAgICAgICAgICAgIDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKLSAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCi0gKiAgICAtICAgcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQWxwaGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCi0gKiAgICAgICAgICAgICAgWzAsMjU1XS4gCi0gKiAgICAtICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEJldGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCi0gKiAgICAgICAgICAgICAgWzAsMThdLiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV1pcyBvdXRzaWRlIG9mIAotICogICAgICAgICAgICAgIHRoZSByYW5nZSBbMCwyNV0uIAotICogICAgLSAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00ICBmb3IgaT49NCwgb3IgCi0gKiAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKLSAqICAgIC0gICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JICgKLSAgICBPTVhfVTggKnBTcmNEc3QsCi0gICAgT01YX1MzMiBzcmNkc3RTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAotICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCi0gICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKLSAgICBjb25zdCBPTVhfVTggKnBCUwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgICAoNi4zLjQuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgcmFzdGVyIHNjYW4gZm9yIGEgMngyIGJsb2NrIG9mIAotICogQ2hyb21hRENMZXZlbC4gIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiB0aGUgcGFja2VkIHBvc2l0aW9uLWNvZWZmaWNpZW50IAotICogYnVmZmVyIGFyZSBzdG9yZWQgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyLCBpLmUuLCB0aGUgZmlyc3QgYnVmZmVyIGVsZW1lbnQgCi0gKiBjb250YWlucyB0aGUgbGFzdCBub24temVybyBwb3N0aW9uLWNvZWZmaWNpZW50IHBhaXIgb2YgdGhlIGJsb2NrLiBXaXRoaW4gCi0gKiBlYWNoIHBvc2l0aW9uLWNvZWZmaWNpZW50IHBhaXIsIHRoZSBwb3NpdGlvbiBlbnRyeSBpbmRpY2F0ZXMgdGhlIAotICogcmFzdGVyLXNjYW4gcG9zaXRpb24gb2YgdGhlIGNvZWZmaWNpZW50LCB3aGlsZSB0aGUgY29lZmZpY2llbnQgZW50cnkgCi0gKiBjb250YWlucyB0aGUgY29lZmZpY2llbnQgdmFsdWUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwT2Zmc2V0IC0gUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW07IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAotICogICBwT2Zmc2V0IC0gKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCi0gKiAgIHBOdW1Db2VmZiAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGlzIGJsb2NrIAotICogICBwcFBvc0NvZWZCdWYgLSBEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbCAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIuICBCdWZmZXIgcG9zaXRpb24gCi0gKiAgICAgICAgICAgICgqcHBQb3NDb2VmQnVmKSBpcyB1cGRhdGVkIHVwb24gcmV0dXJuLCB1bmxlc3MgdGhlcmUgYXJlIG9ubHkgCi0gKiAgICAgICAgICAgIHplcm8gY29lZmZpY2llbnRzIGluIHRoZSBjdXJyZW50bHkgZGVjb2RlZCBibG9jay4gIEluIHRoaXMgY2FzZSAKLSAqICAgICAgICAgICAgdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBieXBhc3MgdGhlIHRyYW5zZm9ybS9kZXF1YW50aXphdGlvbiBvZiAKLSAqICAgICAgICAgICAgdGhlIGVtcHR5IGJsb2Nrcy4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICoKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcHBCaXRTdHJlYW0gb3IgcE9mZnNldCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcHBQb3NDb2VmQnVmIG9yIHBOdW1Db2VmZiBpcyBOVUxMLiAKLSAqICAgIE9NWF9TdHNfRXJyIC0gaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGFuIGlsbGVnYWwgY29kZSBpcyBlbmNvdW50ZXJlZCBpbiB0aGUgYml0c3RyZWFtIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX1MzMipwT2Zmc2V0LAotICAgIE9NWF9VOCAqcE51bUNvZWZmLAotICAgIE9NWF9VOCAqKnBwUG9zQ29lZmJ1ZgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDICAgKDYuMy40LjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciA0eDQgYmxvY2sgb2YgCi0gKiBJbnRyYTE2eDE2RENMZXZlbCwgSW50cmExNngxNkFDTGV2ZWwsIEx1bWFMZXZlbCwgYW5kIENocm9tYUFDTGV2ZWwuIEludmVyc2UgCi0gKiBmaWVsZCBzY2FuIGlzIG5vdCBzdXBwb3J0ZWQuIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiB0aGUgcGFja2VkIAotICogcG9zaXRpb24tY29lZmZpY2llbnQgYnVmZmVyIGFyZSBzdG9yZWQgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyLCBpLmUuLCB0aGUgCi0gKiBmaXJzdCBidWZmZXIgZWxlbWVudCBjb250YWlucyB0aGUgbGFzdCBub24temVybyBwb3N0aW9uLWNvZWZmaWNpZW50IHBhaXIgb2YgCi0gKiB0aGUgYmxvY2suIFdpdGhpbiBlYWNoIHBvc2l0aW9uLWNvZWZmaWNpZW50IHBhaXIsIHRoZSBwb3NpdGlvbiBlbnRyeSAKLSAqIGluZGljYXRlcyB0aGUgcmFzdGVyLXNjYW4gcG9zaXRpb24gb2YgdGhlIGNvZWZmaWNpZW50LCB3aGlsZSB0aGUgCi0gKiBjb2VmZmljaWVudCBlbnRyeSBjb250YWlucyB0aGUgY29lZmZpY2llbnQgdmFsdWUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC1Eb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBPZmZzZXQgLSBQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddLiAKLSAqICAgc01heE51bUNvZWZmIC0gTWF4aW11bSB0aGUgbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpbiBjdXJyZW50IAotICogICAgICAgICAgICBibG9jayAKLSAqICAgc1ZMQ1NlbGVjdCAtIFZMQyB0YWJsZSBzZWxlY3Rvciwgb2J0YWluZWQgZnJvbSB0aGUgbnVtYmVyIG9mIG5vbi16ZXJvIAotICogICAgICAgICAgICBjb2VmZmljaWVudHMgY29udGFpbmVkIGluIHRoZSBhYm92ZSBhbmQgbGVmdCA0eDQgYmxvY2tzLiAgSXQgaXMgCi0gKiAgICAgICAgICAgIGVxdWl2YWxlbnQgdG8gdGhlIHZhcmlhYmxlIG5DIGRlc2NyaWJlZCBpbiBILjI2NCBzdGFuZGFyZCB0YWJsZSAKLSAqICAgICAgICAgICAgOSA1LCBleGNlcHQgaXRzIHZhbHVlIGNhbiB0IGJlIGxlc3MgdGhhbiB6ZXJvLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQuICAKLSAqICAgICAgICAgICAgQnVmZmVyIHBvc2l0aW9uICgqcHBQb3NDb2VmQnVmKSBpcyB1cGRhdGVkIHVwb24gcmV0dXJuLCB1bmxlc3MgCi0gKiAgICAgICAgICAgIHRoZXJlIGFyZSBvbmx5IHplcm8gY29lZmZpY2llbnRzIGluIHRoZSBjdXJyZW50bHkgZGVjb2RlZCBibG9jay4gCi0gKiAgICAgICAgICAgICBJbiB0aGlzIGNhc2UgdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBieXBhc3MgdGhlIAotICogICAgICAgICAgICB0cmFuc2Zvcm0vZGVxdWFudGl6YXRpb24gb2YgdGhlIGVtcHR5IGJsb2Nrcy4gCi0gKiAgIHBPZmZzZXQgLSAqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKLSAqICAgcE51bUNvZWZmIC0gUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluIHRoaXMgYmxvY2sgCi0gKiAgIHBwUG9zQ29lZkJ1ZiAtIERvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsIAotICogICAgICAgICAgICBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBwQml0U3RyZWFtIG9yIHBPZmZzZXQgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBwUG9zQ29lZkJ1ZiBvciBwTnVtQ29lZmYgaXMgTlVMTC4gCi0gKiAgICAtICAgIHNNYXhOdW1Db2VmZiBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDE1IG9yIDE2LiAKLSAqICAgIC0gICAgc1ZMQ1NlbGVjdCBpcyBsZXNzIHRoYW4gMC4gCi0gKgotICogICAgT01YX1N0c19FcnIgLSBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYW4gaWxsZWdhbCBjb2RlIGlzIGVuY291bnRlcmVkIGluIHRoZSBiaXRzdHJlYW0gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQyAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX1MzMiAqcE9mZnNldCwKLSAgICBPTVhfVTggKnBOdW1Db2VmZiwKLSAgICBPTVhfVTggKipwcFBvc0NvZWZidWYsCi0gICAgT01YX0lOVCBzVkxDU2VsZWN0LAotICAgIE9NWF9JTlQgc01heE51bUNvZWZmCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyICAgKDYuMy40LjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFJlY29uc3RydWN0cyB0aGUgNHg0IEx1bWFEQyBibG9jayBmcm9tIHRoZSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIAotICogYnVmZmVyLCBwZXJmb3JtcyBpbnRlZ2VyIGludmVyc2UsIGFuZCBkZXF1YW50aXphdGlvbiBmb3IgNHg0IEx1bWFEQyAKLSAqIGNvZWZmaWNpZW50cywgYW5kIHVwZGF0ZXMgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gdGhlIG5leHQgbm9uLWVtcHR5IAotICogYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwU3JjIC0gRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCi0gKiAgICAgICAgICAgIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZyAKLSAqICAgUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyIFFwWSAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBTcmMgLSAqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBMdW1hREMgY29lZmZpY2llbnRzIGJ1ZmZlcjsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuIAotICogICAgLSAgICBRUCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX0lOVCBRUAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyICAgKDYuMy40LjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFJlY29uc3RydWN0IHRoZSAyeDIgQ2hyb21hREMgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwgCi0gKiBwZXJmb3JtIGludGVnZXIgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiwgYW5kIGRlcXVhbnRpemF0aW9uIGZvciAyeDIgY2hyb21hIAotICogREMgY29lZmZpY2llbnRzLCBhbmQgdXBkYXRlIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIG5leHQgbm9uLWVtcHR5IAotICogYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwU3JjIC0gRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCi0gKiAgICAgICAgICAgIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZyAKLSAqICAgUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyIFFwQyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBTcmMgLSAqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDJ4MiBDaHJvbWFEQyBjb2VmZmljaWVudHMgYnVmZmVyOyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIFFQIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyICgKLSAgICBjb25zdCBPTVhfVTggKipwcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9JTlQgUVAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCAgICg2LjMuNC4yLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWNvbnN0cnVjdCB0aGUgNHg0IHJlc2lkdWFsIGJsb2NrIGZyb20gY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIsIAotICogcGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW50ZWdlciBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uIGZvciA0eDQgYmxvY2sgb2YgCi0gKiByZXNpZHVhbHMgd2l0aCBwcmV2aW91cyBpbnRyYSBwcmVkaWN0aW9uIG9yIG1vdGlvbiBjb21wZW5zYXRpb24gZGF0YSwgYW5kIAotICogdXBkYXRlIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIG5leHQgbm9uLWVtcHR5IGJsb2NrLiBJZiBwREMgPT0gTlVMTCwgCi0gKiB0aGVyZSByZSAxNiBub24temVybyBBQyBjb2VmZmljaWVudHMgYXQgbW9zdCBpbiB0aGUgcGFja2VkIGJ1ZmZlciBzdGFydGluZyAKLSAqIGZyb20gNHg0IGJsb2NrIHBvc2l0aW9uIDA7IElmIHBEQyAhPSBOVUxMLCB0aGVyZSByZSAxNSBub24temVybyBBQyAKLSAqIGNvZWZmaWNpZW50cyBhdCBtb3N0IGluIHRoZSBwYWNrZXQgYnVmZmVyIHN0YXJ0aW5nIGZyb20gNHg0IGJsb2NrIHBvc2l0aW9uIAotICogMS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKLSAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAotICogICBwUHJlZCAtIFBvaW50ZXIgdG8gdGhlIHByZWRpY3RlZCA0eDQgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkgCi0gKiAgIHByZWRTdGVwIC0gUHJlZGljdGVkIGZyYW1lIHN0ZXAgc2l6ZSBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCi0gKiAgIGRzdFN0ZXAgLSBEZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgcERDIC0gUG9pbnRlciB0byB0aGUgREMgY29lZmZpY2llbnQgb2YgdGhpcyBibG9jaywgTlVMTCBpZiBpdCBkb2Vzbid0IAotICogICAgICAgICAgICBleGlzdCAKLSAqICAgUVAgLSBRUCBRdWFudGl6YXRpb24gcGFyYW1ldGVyLiAgSXQgc2hvdWxkIGJlIFFwQyBpbiBjaHJvbWEgNHg0IGJsb2NrIAotICogICAgICAgICAgICBkZWNvZGluZywgb3RoZXJ3aXNlIGl0IHNob3VsZCBiZSBRcFkuIAotICogICBBQyAtIEZsYWcgaW5kaWNhdGluZyBpZiBhdCBsZWFzdCBvbmUgbm9uLXplcm8gQUMgY29lZmZpY2llbnQgZXhpc3RzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCA0eDQgYmxvY2sgZGF0YTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgCi0gKiAgICAgICAgICAgIDQtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwUHJlZCBvciBwRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBwUHJlZCBvciBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHByZWRTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgICAtICAgIEFDICE9MCBhbmQgUXAgaXMgbm90IGluIHRoZSByYW5nZSBvZiBbMC01MV0gb3IgcHBTcmMgPT0gTlVMTC4gCi0gKiAgICAtICAgIEFDID09MCAmJiBwREMgPT1OVUxMLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICgKLSAgICBjb25zdCBPTVhfVTggKipwcFNyYywKLSAgICBjb25zdCBPTVhfVTggKnBQcmVkLAotICAgIGNvbnN0IE9NWF9TMTYgKnBEQywKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBwcmVkU3RlcCwKLSAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgT01YX0lOVCBRUCwKLSAgICBPTVhfSU5UIEFDCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplICAgKDYuMy41LjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIAotICogc3RydWN0dXJlIGZvciB0aGUgb214VkNNNFAxMCBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnMgQmxvY2tNYXRjaF9JbnRlZ2VyIAotICogYW5kIE1vdGlvbkVzdGltYXRpb25NQi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKLSAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMTBNRU1vZGUgCi0gKiAgIHBNRVBhcmFtcyAtbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNpemUgLSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBtb3Rpb24gCi0gKiAgICAgICAgICAgIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcE1FUGFyYW1zIG9yIHBTaXplIGlzIE5VTEwuIAotICogICAgLSAgICBhbiBpbnZhbGlkIE1FTW9kZSBpcyBzcGVjaWZpZWQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfTUVHZXRCdWZTaXplICgKLSAgICBPTVhWQ000UDEwTUVNb2RlIE1FbW9kZSwKLSAgICBjb25zdCBPTVhWQ000UDEwTUVQYXJhbXMgKnBNRVBhcmFtcywKLSAgICBPTVhfVTMyICpwU2l6ZQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01FSW5pdCAgICg2LjMuNS4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBJbml0aWFsaXplcyB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIHJlcXVpcmVkIGZvciB0aGUgCi0gKiBvbXhWQ000UDEwIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogIEJsb2NrTWF0Y2hfSW50ZWdlciBhbmQgCi0gKiBNb3Rpb25Fc3RpbWF0aW9uTUIuIE1lbW9yeSBmb3IgdGhlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICpwTUVTcGVjIG11c3QgYmUgCi0gKiBhbGxvY2F0ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGUgZnVuY3Rpb24sIGFuZCBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIGNhbiAKLSAqIGJlIGRldGVybWluZWQgdXNpbmcgdGhlIGZ1bmN0aW9uIG9teFZDTTRQMTBfTUVHZXRCdWZTaXplLiBGb2xsb3dpbmcgCi0gKiBpbml0aWFsaXphdGlvbiBieSB0aGlzIGZ1bmN0aW9uLCB0aGUgdmVuZG9yLXNwZWNpZmljIHN0cnVjdHVyZSAqcE1FU3BlYyAKLSAqIHNob3VsZCBjb250YWluIGFuIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIHJlcHJlc2VudGF0aW9uIG9mIGFsbCBtb3Rpb24gCi0gKiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgcmVjZWl2ZWQgdmlhIHRoZSBzdHJ1Y3R1cmUgcE1FUGFyYW1zLCBmb3IgZXhhbXBsZSAgCi0gKiBzZWFyY2hSYW5nZTE2eDE2LCBzZWFyY2hSYW5nZTh4OCwgZXRjLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAotICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAxME1FTW9kZSAKLSAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHVuaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwTUVQYXJhbXMgb3IgcFNpemUgaXMgTlVMTC4gCi0gKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCi0gKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciBvbmUgb2YgdGhlIHNlYXJjaCByYW5nZXMgCi0gKiAgICAgICAgIChlLmcuLCAgcE1CUGFyYW1zID5zZWFyY2hSYW5nZTh4OCwgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZTE2eDE2LCBldGMuKSAKLSAqICAgIC0gICAgZWl0aGVyIGluIGlzb2xhdGlvbiBvciBpbiBjb21iaW5hdGlvbiwgb25lIG9yIG1vcmUgb2YgdGhlIGVuYWJsZXMgb3IgCi0gKiAgICAgICAgIHNlYXJjaCByYW5nZXMgaW4gdGhlIHN0cnVjdHVyZSAqcE1FUGFyYW1zIHdlcmUgY29uZmlndXJlZCBzdWNoIAotICogICAgICAgICB0aGF0IHRoZSByZXF1ZXN0ZWQgYmVoYXZpb3IgZmFpbHMgdG8gY29tcGx5IHdpdGggW0lTTzE0NDk2LTEwXS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9NRUluaXQgKAotICAgIE9NWFZDTTRQMTBNRU1vZGUgTUVtb2RlLAotICAgIGNvbnN0IE9NWFZDTTRQMTBNRVBhcmFtcyAqcE1FUGFyYW1zLAotICAgIHZvaWQgKnBNRVNwZWMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgICAoNi4zLjUuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW50ZWdlciBibG9jayBtYXRjaC4gIFJldHVybnMgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY3VycmVudCBibG9jazoKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmU6IAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSwgZXhwcmVzc2VkIGluIHRlcm1zIAotICogICAgICAgICAgICBvZiBpbnRlZ2VyIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKLSAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lLCBleHByZXNzZWQgaW4gdGVybXMgCi0gKiAgICAgICAgICAgIG9mIGludGVnZXIgcGl4ZWxzIAotICogICBwUmVmUmVjdCAtIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSByZWN0YW5nbGUgaW5zaWRlIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIHBpY3R1cmUgcGxhbmUgCi0gKiAgIG5DdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKLSAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaywgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGludGVnZXIgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBpQmxvY2tIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2ssIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiAKLSAqICAgICAgICAgICAgaW50ZWdlciBwaXhlbHM7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yOyB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCi0gKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVY7IHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCwgZXhwcmVzc2VkIGluIHRlcm1zIAotICogICAgICAgICAgICBvZiAxLzQtcGVsIHVuaXRzIAotICogICBwTVZDYW5kaWRhdGUgLSBDYW5kaWRhdGUgTVY7IHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgbW90aW9uIHNlYXJjaCwgCi0gKiAgICAgICAgICAgIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVscyAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0QmVzdE1WIC0gQmVzdCBNViByZXN1bHRpbmcgZnJvbSBpbnRlZ2VyIHNlYXJjaCwgZXhwcmVzc2VkIGluIHRlcm1zIAotICogICAgICAgICAgICBvZiAxLzQtcGVsIHVuaXRzIAotICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAotICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGFyZSBOVUxMOgotICogICAgICAgICBwU3JjT3JnWSwgcFNyY1JlZlksIHBSZWZSZWN0LCBwTVZQcmVkLCBwTVZDYW5kaWRhdGUsIG9yIHBNRVNwZWMuIAotICogICAgLSAgICBFaXRoZXIgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnWSwKLSAgICBPTVhfUzMyIG5TcmNPcmdTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZlksCi0gICAgT01YX1MzMiBuU3JjUmVmU3RlcCwKLSAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKLSAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAotICAgIE9NWF9VMzIgbkxhbWRhLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZDYW5kaWRhdGUsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBCZXN0TVYsCi0gICAgT01YX1MzMiAqcEJlc3RDb3N0LAotICAgIHZvaWQgKnBNRVNwZWMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgICAoNi4zLjUuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSBoYWxmLXBlbCBibG9jayBtYXRjaCB1c2luZyByZXN1bHRzIGZyb20gYSBwcmlvciBpbnRlZ2VyIHNlYXJjaC4gCi0gKiAgUmV0dXJucyB0aGUgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgdGhlIAotICogaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgcmVzb2x1dGlvbiBtb3Rpb24gCi0gKiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RCZXN0TVYsIGkuZS4sIHRoZSBpbml0aWFsIAotICogaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBmdW5jdGlvbiAKLSAqIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyIG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZToKLSAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmU6ICAKLSAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKLSAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKLSAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgblNyY09yZ1N0ZXAgLSBTdHJpZGUgb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgaUJsb2NrV2lkdGguIAotICogICBuU3JjUmVmU3RlcCAtIFN0cmlkZSBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzIAotICogICBpQmxvY2tXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAotICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBpQmxvY2tIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIG5MYW1kYSAtIExhbWRhIGZhY3RvciwgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0IAotICogICBwTVZQcmVkIC0gUHJlZGljdGVkIE1WLCByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzOyB1c2VkIHRvIAotICogICAgICAgICAgICBjb21wdXRlIG1vdGlvbiBjb3N0IAotICogICBwU3JjRHN0QmVzdE1WIC0gVGhlIGJlc3QgTVYgcmVzdWx0aW5nIGZyb20gYSBwcmlvciBpbnRlZ2VyIHNlYXJjaCwgCi0gKiAgICAgICAgICAgIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIHRoZSBoYWxmLXBlbCBzZWFyY2gsIGV4cHJlc3NlZCBpbiAKLSAqICAgICAgICAgICAgdGVybXMgb2YgMS80LXBlbCB1bml0cyAKLSAqICAgcEJlc3RDb3N0IC0gTW90aW9uIGNvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WOyBjb21wdXRlZCBhcyAKLSAqICAgICAgICAgICAgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBhbnkgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjT3JnWSwgcFNyY1JlZlksIAotICogICAgICAgICAgICAgIHBTcmNEc3RCZXN0TVYsIHBNVlByZWQsIHBCZXN0Q29zdCAKLSAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSBlcXVhbCB0byB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnWSwKLSAgICBPTVhfUzMyIG5TcmNPcmdTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZlksCi0gICAgT01YX1MzMiBuU3JjUmVmU3RlcCwKLSAgICBPTVhfVTggaUJsb2NrV2lkdGgsCi0gICAgT01YX1U4IGlCbG9ja0hlaWdodCwKLSAgICBPTVhfVTMyIG5MYW1kYSwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WUHJlZCwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdEJlc3RNViwKLSAgICBPTVhfUzMyICpwQmVzdENvc3QKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIgICAoNi4zLjUuMi4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSBxdWFydGVyLXBlbCBibG9jayBtYXRjaCB1c2luZyByZXN1bHRzIGZyb20gYSBwcmlvciBoYWxmLXBlbCAKLSAqIHNlYXJjaC4gIFJldHVybnMgdGhlIGJlc3QgTVYgYW5kIGFzc29jaWF0ZWQgY29zdC4gIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIAotICogdGhlIHF1YXJ0ZXItcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBoYWxmLXBlbCByZXNvbHV0aW9uIAotICogbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdEJlc3RNViwgaS5lLiwgdGhlIAotICogaW5pdGlhbCBoYWxmLXBlbCBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBmdW5jdGlvbiAKLSAqIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmIG1heSBiZSB1c2VkIGZvciBoYWxmLXBlbCBtb3Rpb24gZXN0aW1hdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZ1kgLSBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU6Ci0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwU3JjUmVmWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBibG9jayBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlOgotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCi0gKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHMgCi0gKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yLCB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCi0gKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVYsIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHM7IHVzZWQgdG8gCi0gKiAgICAgICAgICAgIGNvbXB1dGUgbW90aW9uIGNvc3QgCi0gKiAgIHBTcmNEc3RCZXN0TVYgLSBUaGUgYmVzdCBNViByZXN1bHRpbmcgZnJvbSBhIHByaW9yIGhhbGYtcGVsIHNlYXJjaCwgCi0gKiAgICAgICAgICAgIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNCBwZWwgdW5pdHMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIHRoZSBxdWFydGVyLXBlbCBzZWFyY2gsIGV4cHJlc3NlZCAKLSAqICAgICAgICAgICAgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0cyAKLSAqICAgcEJlc3RDb3N0IC0gTW90aW9uIGNvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WOyBjb21wdXRlZCBhcyAKLSAqICAgICAgICAgICAgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjT3JnWSwgcFNyY1JlZlksIHBTcmNEc3RCZXN0TVYsIHBNVlByZWQsIHBCZXN0Q29zdCAKLSAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSBlcXVhbCB0byB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnWSwKLSAgICBPTVhfUzMyIG5TcmNPcmdTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZlksCi0gICAgT01YX1MzMiBuU3JjUmVmU3RlcCwKLSAgICBPTVhfVTggaUJsb2NrV2lkdGgsCi0gICAgT01YX1U4IGlCbG9ja0hlaWdodCwKLSAgICBPTVhfVTMyIG5MYW1kYSwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WUHJlZCwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdEJlc3RNViwKLSAgICBPTVhfUzMyICpwQmVzdENvc3QKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAoNi4zLjUuMy4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gYW5kIHNlbGVjdHMgYmVzdCBtb3Rpb24gZXN0aW1hdGlvbiAKLSAqIHN0cmF0ZWd5IGZyb20gdGhlIHNldCBvZiBtb2RlcyBzdXBwb3J0ZWQgaW4gYmFzZWxpbmUgcHJvZmlsZSBbSVNPMTQ0OTYtMTBdLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjQ3VyckJ1ZiAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZTsgCi0gKiAgICAgICAgICAgIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICogICBwU3JjUmVmQnVmTGlzdCAtIFBvaW50ZXIgdG8gYW4gYXJyYXkgd2l0aCAxNiBlbnRyaWVzLiAgRWFjaCBlbnRyeSBwb2ludHMgCi0gKiAgICAgICAgICAgIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgTUIgaW4gYSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIHBpY3R1cmUuICBUaGUgYXJyYXkgaXMgZmlsbGVkIGZyb20gbG93LXRvLWhpZ2ggd2l0aCB2YWxpZCAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIGZyYW1lIHBvaW50ZXJzOyB0aGUgdW51c2VkIGhpZ2ggZW50cmllcyBzaG91bGQgYmUgc2V0IAotICogICAgICAgICAgICB0byBOVUxMLiAgT3JkZXJpbmcgb2YgdGhlIHJlZmVyZW5jZSBmcmFtZXMgc2hvdWxkIGZvbGxvdyAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBzdWJjbGF1c2UgOC4yLjQgIERlY29kaW5nIFByb2Nlc3MgZm9yIFJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgUGljdHVyZSBMaXN0cy4gICBUaGUgZW50cmllcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHBTcmNSZWNCdWYgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgTUIgaW4gdGhlIAotICogICAgICAgICAgICByZWNvbnN0cnVjdGVkIHBpY3R1cmU7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgU3JjQ3VyclN0ZXAgLSBXaWR0aCBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIFNyY1JlZlN0ZXAgLSBXaWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBTcmNSZWNTdGVwIC0gV2lkdGggb2YgdGhlIHJlY29uc3RydWN0ZWQgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBSZWZSZWN0IC0gUG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHJlY3RhbmdsZTsgcmVsYXRpdmUgdG8gdGhlIAotICogICAgICAgICAgICBpbWFnZSBvcmlnaW4uIAotICogICBwQ3VyclBvaW50UG9zIC0gUG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZS4gCi0gKiAgIExhbWJkYSAtIExhZ3JhbmdlIGZhY3RvciBmb3IgY29tcHV0aW5nIHRoZSBjb3N0IGZ1bmN0aW9uIAotICogICBwTUVTcGVjIC0gUG9pbnRlciB0byB0aGUgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IG11c3QgCi0gKiAgICAgICAgICAgIGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIHByaW9yIHRvIGNhbGxpbmcgdGhpcyAKLSAqICAgICAgICAgICAgZnVuY3Rpb24uIAotICogICBwTUJJbnRlciAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGZvdXIgYWRqYWNlbnQgdHlwZSBJTlRFUiBNQnMgKExlZnQsIFRvcCwgCi0gKiAgICAgICAgICAgIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCAKLSAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGUgY29ycmVzcG9uZGluZyBNQiBkb2VzbiB0IGV4aXN0IG9yIGlzIG5vdCBvZiB0eXBlIAotICogICAgICAgICAgICBJTlRFUi4gCi0gKiAgICAgICAgICAgIC0gIHBNQkludGVyWzBdIC0gUG9pbnRlciB0byBsZWZ0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICBwTUJJbnRlclsxXSAtIFBvaW50ZXIgdG8gdG9wIE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICBwTUJJbnRlclsyXSAtIFBvaW50ZXIgdG8gdG9wLWxlZnQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gIHBNQkludGVyWzNdIC0gUG9pbnRlciB0byB0b3AtcmlnaHQgTUIgaW5mb3JtYXRpb24gCi0gKiAgIHBNQkludHJhIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBhZGphY2VudCB0eXBlIElOVFJBIE1CcyAoTGVmdCwgVG9wLCAKLSAqICAgICAgICAgICAgVG9wLUxlZnQsIFRvcC1SaWdodCkuIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIAotICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZSBjb3JyZXNwb25kaW5nIE1CIGRvZXNuIHQgZXhpc3Qgb3IgaXMgbm90IG9mIHR5cGUgCi0gKiAgICAgICAgICAgIElOVFJBLiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50cmFbMF0gLSBQb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gIHBNQkludHJhWzFdIC0gUG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gIHBNQkludHJhWzJdIC0gUG9pbnRlciB0byB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50cmFbM10gLSBQb2ludGVyIHRvIHRvcC1yaWdodCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgcFNyY0RzdE1CQ3VyciAtIFBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIAotICogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIHNldCBwcmlvciB0byBjYWxsaW5nIHRoZSAKLSAqICAgICAgICAgICAgZnVuY3Rpb246ICBzbGljZUlEIC0gdGhlIG51bWJlciBvZiB0aGUgc2xpY2UgdGhlIHRvIHdoaWNoIHRoZSAKLSAqICAgICAgICAgICAgY3VycmVudCBNQiBiZWxvbmdzLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdENvc3QgLSBQb2ludGVyIHRvIHRoZSBtaW5pbXVtIG1vdGlvbiBjb3N0IGZvciB0aGUgY3VycmVudCBNQi4gCi0gKiAgIHBEc3RCbG9ja1NBRCAtIFBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIFNBRHMgZm9yIGVhY2ggb2YgdGhlIHNpeHRlZW4gbHVtYSAKLSAqICAgICAgICAgICAgNHg0IGJsb2NrcyBpbiBlYWNoIE1CLiAgVGhlIGJsb2NrIFNBRHMgYXJlIGluIHNjYW4gb3JkZXIgZm9yIAotICogICAgICAgICAgICBlYWNoIE1CLiAgRm9yIGltcGxlbWVudGF0aW9ucyB0aGF0IGNhbm5vdCBjb21wdXRlIHRoZSBTQUQgdmFsdWVzIAotICogICAgICAgICAgICBpbmRpdmlkdWFsbHksIHRoZSBtYXhpbXVtIHBvc3NpYmxlIHZhbHVlICgweGZmZmYpIGlzIHJldHVybmVkIAotICogICAgICAgICAgICBmb3IgZWFjaCBvZiB0aGUgMTYgYmxvY2sgU0FEIGVudHJpZXMuIAotICogICBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byB1cGRhdGVkIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIE1CIGFmdGVyIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZC4gIFRoZSAKLSAqICAgICAgICAgICAgZm9sbG93aW5nIGZpZWxkcyBhcmUgdXBkYXRlZCBieSB0aGUgTUUgZnVuY3Rpb24uICAgVGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgcGFyYW1ldGVyIHNldCBxdWFudGlmaWVzIHRoZSBNQi1sZXZlbCBNRSBzZWFyY2ggcmVzdWx0czogCi0gKiAgICAgICAgICAgIC0gIE1iVHlwZSAKLSAqICAgICAgICAgICAgLSAgc3ViTUJUeXBlWzRdIAotICogICAgICAgICAgICAtICBwTVYwWzRdWzRdIAotICogICAgICAgICAgICAtICBwTVZQcmVkWzRdWzRdIAotICogICAgICAgICAgICAtICBwUmVmTDBJZHhbNF0gCi0gKiAgICAgICAgICAgIC0gIEludHJhMTZ4MTZQcmVkTW9kZSAKLSAqICAgICAgICAgICAgLSAgcEludHJhNHg0UHJlZE1vZGVbNF1bNF0gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNDdXJyQnVmLCAKLSAqICAgICAgICAgICBwU3JjUmVmQnVmTGlzdCwgcFNyY1JlY0J1ZiwgcFJlZlJlY3QsIHBDdXJyUG9pbnRQb3MsIHBNRVNwZWMsIAotICogICAgICAgICAgIHBNQkludGVyLCBwTUJJbnRyYSxwU3JjRHN0TUJDdXJyLCBwRHN0Q29zdCwgcFNyY1JlZkJ1Zkxpc3RbMF0gCi0gKiAgICAtICAgIFNyY1JlZlN0ZXAsIFNyY1JlY1N0ZXAgYXJlIG5vdCBtdWx0aXBsZXMgb2YgMTYgCi0gKiAgICAtICAgIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgT01YX1MzMiBTcmNDdXJyU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWZMaXN0WzE1XSwKLSAgICBPTVhfUzMyIFNyY1JlZlN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVjQnVmLAotICAgIE9NWF9TMzIgU3JjUmVjU3RlcCwKLSAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgIE9NWF9VMzIgTGFtYmRhLAotICAgIHZvaWQgKnBNRVNwZWMsCi0gICAgY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50ZXIsCi0gICAgY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50cmEsCi0gICAgT01YVkNNNFAxME1CSW5mb1B0ciBwU3JjRHN0TUJDdXJyLAotICAgIE9NWF9JTlQgKnBEc3RDb3N0LAotICAgIE9NWF9VMTYgKnBEc3RCbG9ja1NBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRF80eCAgICg2LjMuNS40LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgNHg4IGFuZCA0eDQgYmxvY2tzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnIC1Qb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIGlTdGVwT3JnIC1TdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgcFNyY1JlZiAtUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIAotICogICBpU3RlcFJlZiAtU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKLSAqICAgaUhlaWdodCAtSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtUG9pbnRlciBvZiByZXN1bHQgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNPcmcsIHBTcmNSZWYsIG9yIHBEc3RTQUQgCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAotICogICAgLSAgICBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TQURfNHggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKLSAgICBPTVhfVTMyIGlTdGVwT3JnLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKLSAgICBPTVhfVTMyIGlTdGVwUmVmLAotICAgIE9NWF9TMzIgKnBEc3RTQUQsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl80eCAgICg2LjMuNS40LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSBhdmVyYWdlIAotICogb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKSBmb3IgNHg4IG9yIDR4NCBibG9ja3MuICBSb3VuZGluZyAKLSAqIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBjb252ZW50aW9uIChhK2IrMSk+PjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtIFBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmMCwgCi0gKiAgICAgICAgICAgICAgcFNyY1JlZjEsIHBEc3RTQUQuIAotICogICAgLSAgICBpU3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzR4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYxLAotICAgIE9NWF9VMzIgaVNyY1N0ZXAsCi0gICAgT01YX1UzMiBpUmVmU3RlcDAsCi0gICAgT01YX1UzMiBpUmVmU3RlcDEsCi0gICAgT01YX1UzMiAqcERzdFNBRCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzh4ICAgKDYuMy41LjQuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCi0gKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciA4eDE2LCA4eDgsIG9yIDh4NCBibG9ja3MuICAKLSAqIFJvdW5kaW5nIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBjb252ZW50aW9uIChhK2IrMSk+PjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBwU3JjUmVmMCAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBTcmNSZWYxIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgaVJlZlN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgaVJlZlN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtIFBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKLSAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCi0gKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfOHggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjEsCi0gICAgT01YX1UzMiBpU3JjU3RlcCwKLSAgICBPTVhfVTMyIGlSZWZTdGVwMCwKLSAgICBPTVhfVTMyIGlSZWZTdGVwMSwKLSAgICBPTVhfVTMyICpwRHN0U0FELAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4ICAgKDYuMy41LjQuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCi0gKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciAxNngxNiBvciAxNng4IGJsb2Nrcy4gIAotICogUm91bmRpbmcgaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IAotICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgOCBvciAxNiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtUG9pbnRlciBvZiByZXN1bHQgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2LiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmMCwgCi0gKiAgICAgICAgICAgICAgcFNyY1JlZjEsIHBEc3RTQUQuIAotICogICAgLSAgICBpU3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl8xNnggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjEsCi0gICAgT01YX1UzMiBpU3JjU3RlcCwKLSAgICBPTVhfVTMyIGlSZWZTdGVwMCwKLSAgICBPTVhfVTMyIGlSZWZTdGVwMSwKLSAgICBPTVhfVTMyICpwRHN0U0FELAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBVERfNHg0ICAgKDYuMy41LjQuNSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgc3VtIG9mIGFic29sdXRlIHRyYW5zZm9ybSBkaWZmZXJlbmNlcyAoU0FURCkgCi0gKiBmb3IgYSA0eDQgYmxvY2sgYnkgYXBwbHlpbmcgYSBIYWRhbWFyZCB0cmFuc2Zvcm0gdG8gdGhlIGRpZmZlcmVuY2UgYmxvY2sgCi0gKiBhbmQgdGhlbiBjYWxjdWxhdGluZyB0aGUgc3VtIG9mIGFic29sdXRlIGNvZWZmaWNpZW50IHZhbHVlcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5IAotICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCi0gKiAgIHBTcmNSZWYgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkgCi0gKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIHRoZSByZXN1bHRpbmcgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNPcmcsIHBTcmNSZWYsIG9yIHBEc3RTQUQgZWl0aGVyIHBTcmNPcmcgCi0gKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlTdGVwT3JnIDw9IDAgb3IgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfU0FURF80eDQgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKLSAgICBPTVhfVTMyIGlTdGVwT3JnLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKLSAgICBPTVhfVTMyIGlTdGVwUmVmLAotICAgIE9NWF9VMzIgKnBEc3RTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAgICg2LjMuNS41LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIHR3byBob3Jpem9udGFsIDEvMi1wZWwgcG9zaXRpb25zIAotICogKC0xLzIsMCkgYW5kICgxLzIsIDApIC0gYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgaW4gCi0gKiAgICAgICAgICAgIHRoZSByZWNvbnN0cnVjdGlvbiBmcmFtZSBwbGFuZS4gCi0gKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gCi0gKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyOyBtdXN0IGJlIGEgCi0gKiAgICAgICAgICAgIG11bHRpcGxlIG9mIGlXaWR0aC4gCi0gKiAgIGlXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byA0LCA4LCBvciAxNiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdExlZnQgLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSBsZWZ0IC1wZWwgcG9zaXRpb24gCi0gKiAgICAgICAgICAgICgtMS8yLCAwKSAKLSAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBEc3RSaWdodCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIHJpZ2h0IC1wZWwgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uICgxLzIsIDApIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICAgcFNyYywgcERzdExlZnQsIG9yIHBEc3RSaWdodCAKLSAqICAgIC0gICAgaVdpZHRoIG9yIGlIZWlnaHQgaGF2ZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNiAKLSAqICAgIC0gICAgaVdpZHRoPT00IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVdpZHRoPT04IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVdpZHRoPT0xNiBidXQgcERzdExlZnQgYW5kL29yIHBEc3RSaWdodCBpcy9hcmUgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBhbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9VMzIgaVNyY1N0ZXAsCi0gICAgT01YX1U4ICpwRHN0TGVmdCwKLSAgICBPTVhfVTggKnBEc3RSaWdodCwKLSAgICBPTVhfVTMyIGlEc3RTdGVwLAotICAgIE9NWF9VMzIgaVdpZHRoLAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hICAgKDYuMy41LjUuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdHdvIHZlcnRpY2FsIDEvMi1wZWwgcG9zaXRpb25zIC0gCi0gKiAoMCwgLTEvMikgYW5kICgwLCAxLzIpIC0gYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZSAKLSAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAKLSAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiAoaW50ZXJwb2xhdGlvbikgYnVmZmVyOyBtdXN0IGJlIGEgCi0gKiAgICAgICAgICAgIG11bHRpcGxlIG9mIGlXaWR0aC4gCi0gKiAgIGlXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RVcCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIC1wZWwgcG9zaXRpb24gYWJvdmUgCi0gKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGZ1bGwtcGVsIHBvc2l0aW9uICgwLCAtMS8yKSAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwRHN0RG93biAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIC1wZWwgcG9zaXRpb24gYmVsb3cgCi0gKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGZ1bGwtcGVsIHBvc2l0aW9uICgwLCAxLzIpIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgcFNyYywgcERzdFVwLCBvciBwRHN0RG93biAKLSAqICAgIC0gICAgaVdpZHRoIG9yIGlIZWlnaHQgaGF2ZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNiAKLSAqICAgIC0gICAgaVdpZHRoPT00IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVdpZHRoPT04IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVdpZHRoPT0xNiBidXQgcERzdFVwIGFuZC9vciBwRHN0RG93biBpcy9hcmUgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfVTMyIGlTcmNTdGVwLAotICAgIE9NWF9VOCAqcERzdFVwLAotICAgIE9NWF9VOCAqcERzdERvd24sCi0gICAgT01YX1UzMiBpRHN0U3RlcCwKLSAgICBPTVhfVTMyIGlXaWR0aCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9BdmVyYWdlXzR4ICAgKDYuMy41LjUuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gNHg0LCA0eDggYmxvY2tzLiAgVGhlIHJlc3VsdCAKLSAqIGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFByZWQwIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwUHJlZDEgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlQcmVkU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrczsgbXVzdCBiZSBlaXRoZXIgNCBvciA4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFByZWQgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgcFByZWQwLCBwUHJlZDEsIG9yIHBEc3RQcmVkIAotICogICAgLSAgICBwRHN0UHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgaVByZWRTdGVwMSA8PSAwIG9yIGlQcmVkU3RlcDEgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgaURzdFN0ZXAgPD0gMCBvciBpRHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCBvciA4IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfQXZlcmFnZV80eCAoCi0gICAgY29uc3QgT01YX1U4ICpwUHJlZDAsCi0gICAgY29uc3QgT01YX1U4ICpwUHJlZDEsCi0gICAgT01YX1UzMiBpUHJlZFN0ZXAwLAotICAgIE9NWF9VMzIgaVByZWRTdGVwMSwKLSAgICBPTVhfVTggKnBEc3RQcmVkLAotICAgIE9NWF9VMzIgaURzdFN0ZXAsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMgICAoNi4zLjUuNi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyAyeDIgSGFkYW1hcmQgdHJhbnNmb3JtIG9mIGNocm9tYSBEQyBjb2VmZmljaWVudHMgCi0gKiBhbmQgdGhlbiBxdWFudGl6ZXMgdGhlIGNvZWZmaWNpZW50cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIDJ4MiBhcnJheSBvZiBjaHJvbWEgREMgY29lZmZpY2llbnRzLiAgOC1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAotICogICBiSW50cmEgLSBJbmRpY2F0ZSB3aGV0aGVyIHRoaXMgaXMgYW4gSU5UUkEgYmxvY2suIDEtSU5UUkEsIDAtSU5URVIgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRyYW5zZm9ybWVkIGFuZCBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgOC1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgICBwU3JjRHN0IAotICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDICgKLSAgICBPTVhfUzE2ICpwU3JjRHN0LAotICAgIE9NWF9VMzIgaVFQLAotICAgIE9NWF9VOCBiSW50cmEKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMgICAoNi4zLjUuNi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIDR4NCBIYWRhbWFyZCB0cmFuc2Zvcm0gb2YgbHVtYSBEQyBjb2VmZmljaWVudHMgCi0gKiBhbmQgdGhlbiBxdWFudGl6ZXMgdGhlIGNvZWZmaWNpZW50cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIDR4NCBhcnJheSBvZiBsdW1hIERDIGNvZWZmaWNpZW50cy4gIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRyYW5zZm9ybWVkIGFuZCBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0IAotICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDE2LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMgKAotICAgIE9NWF9TMTYgKnBTcmNEc3QsCi0gICAgT01YX1UzMiBpUVAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQyAgICg2LjMuNS42LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgNHg0IEhhZGFtYXJkIHRyYW5zZm9ybSBhbmQgdGhlbiBkZXF1YW50aXplcyAKLSAqIHRoZSBjb2VmZmljaWVudHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSA0eDQgYXJyYXkgb2YgdGhlIDR4NCBIYWRhbWFyZC10cmFuc2Zvcm1lZCBhbmQgCi0gKiAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudHMuICAxNiBieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIGludmVyc2UtdHJhbnNmb3JtZWQgYW5kIGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIAotICogICAgICAgICAgICAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjIAotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMgKAotICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfVTMyIGlRUAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgICAoNi4zLjUuNi40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIDJ4MiBIYWRhbWFyZCB0cmFuc2Zvcm0gYW5kIHRoZW4gZGVxdWFudGl6ZXMgCi0gKiB0aGUgY29lZmZpY2llbnRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgMngyIGFycmF5IG9mIHRoZSAyeDIgSGFkYW1hcmQtdHJhbnNmb3JtZWQgYW5kIAotICogICAgICAgICAgICBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgOCBieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIGludmVyc2UtdHJhbnNmb3JtZWQgYW5kIGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIAotICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgCi0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDICgKLSAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX1UzMiBpUVAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCAgICg2LjMuNS43LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgYW4gNHg0IGludGVnZXIgdHJhbnNmb3JtYXRpb24gdG8gcHJvZHVjZSAKLSAqIHRoZSBkaWZmZXJlbmNlIHNpZ25hbCBhbmQgdGhlbiBhZGRzIHRoZSBkaWZmZXJlbmNlIHRvIHRoZSBwcmVkaWN0aW9uIHRvIGdldCAKLSAqIHRoZSByZWNvbnN0cnVjdGVkIHNpZ25hbC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY1ByZWQgLSBQb2ludGVyIHRvIHByZWRpY3Rpb24gc2lnbmFsLiAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBEZXF1YW50Q29lZmYgLSBQb2ludGVyIHRvIHRoZSB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMuICA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlTcmNQcmVkU3RlcCAtIFN0ZXAgb2YgdGhlIHByZWRpY3Rpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGlEc3RSZWNvblN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiByZWNvbnN0cnVjdGlvbiBidWZmZXI7IG11c3QgYmUgYSAKLSAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGJBQyAtIEluZGljYXRlIHdoZXRoZXIgdGhlcmUgaXMgQUMgY29lZmZpY2llbnRzIGluIHRoZSBjb2VmZmljaWVudHMgCi0gKiAgICAgICAgICAgIG1hdHJpeC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RSZWNvbiAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gcmVjb25zdHJ1Y3Rpb24gYnVmZmVyLiAgNC1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgIHBTcmNQcmVkLCBwRGVxdWFudENvZWZmLCBwRHN0UmVjb24gCi0gKiAgICAtICAgIHBTcmNQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpU3JjUHJlZFN0ZXAgb3IgaURzdFJlY29uU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgIC0gICAgcERlcXVhbnRDb2VmZiBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUHJlZCwKLSAgICBjb25zdCBPTVhfUzE2ICpwRGVxdWFudENvZWZmLAotICAgIE9NWF9VOCAqcERzdFJlY29uLAotICAgIE9NWF9VMzIgaVNyY1ByZWRTdGVwLAotICAgIE9NWF9VMzIgaURzdFJlY29uU3RlcCwKLSAgICBPTVhfVTggYkFDCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgICAoNi4zLjUuOC4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBzdWJ0cmFjdHMgdGhlIHByZWRpY3Rpb24gc2lnbmFsIGZyb20gdGhlIG9yaWdpbmFsIHNpZ25hbCB0byAKLSAqIHByb2R1Y2UgdGhlIGRpZmZlcmVuY2Ugc2lnbmFsIGFuZCB0aGVuIHBlcmZvcm1zIGEgNHg0IGludGVnZXIgdHJhbnNmb3JtIGFuZCAKLSAqIHF1YW50aXphdGlvbi4gVGhlIHF1YW50aXplZCB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMgYXJlIHN0b3JlZCBhcyAKLSAqIHBEc3RRdWFudENvZWZmLiBUaGlzIGZ1bmN0aW9uIGNhbiBhbHNvIG91dHB1dCBkZXF1YW50aXplZCBjb2VmZmljaWVudHMgb3IgCi0gKiB1bnF1YW50aXplZCBEQyBjb2VmZmljaWVudHMgb3B0aW9uYWxseSBieSBzZXR0aW5nIHRoZSBwb2ludGVycyAKLSAqIHBEc3REZVF1YW50Q29lZmYsIHBEQ0NvZWZmLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnIC0gUG9pbnRlciB0byBvcmlnaW5hbCBzaWduYWwuIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwU3JjUHJlZCAtIFBvaW50ZXIgdG8gcHJlZGljdGlvbiBzaWduYWwuIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpU3JjT3JnU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIHNpZ25hbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAKLSAqICAgICAgICAgICAgNC4gCi0gKiAgIGlTcmNQcmVkU3RlcCAtIFN0ZXAgb2YgdGhlIHByZWRpY3Rpb24gc2lnbmFsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIAotICogICAgICAgICAgICBvZiA0LiAKLSAqICAgcE51bUNvZWZmIC1OdW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGFmdGVyIHF1YW50aXphdGlvbi4gSWYgdGhpcyAKLSAqICAgICAgICAgICAgcGFyYW1ldGVyIGlzIG5vdCByZXF1aXJlZCwgaXQgaXMgc2V0IHRvIE5VTEwuIAotICogICBuVGhyZXNoU0FEIC0gWmVyby1ibG9jayBlYXJseSBkZXRlY3Rpb24gdGhyZXNob2xkLiBJZiB0aGlzIHBhcmFtZXRlciBpcyAKLSAqICAgICAgICAgICAgbm90IHJlcXVpcmVkLCBpdCBpcyBzZXQgdG8gMC4gCi0gKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCi0gKiAgIGJJbnRyYSAtIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYW4gSU5UUkEgYmxvY2ssIGVpdGhlciAxLUlOVFJBIG9yIAotICogICAgICAgICAgICAwLUlOVEVSIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0UXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMuICAKLSAqICAgICAgICAgICAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBEc3REZVF1YW50Q29lZmYgLSBQb2ludGVyIHRvIHRoZSBkZXF1YW50aXplZCB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMgCi0gKiAgICAgICAgICAgIGlmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBlcXVhbCB0byBOVUxMLiAgOC1ieXRlIGFsaWdubWVudCAKLSAqICAgICAgICAgICAgcmVxdWlyZWQuIAotICogICBwRENDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHVucXVhbnRpemVkIERDIGNvZWZmaWNpZW50IGlmIHRoaXMgcGFyYW1ldGVyIAotICogICAgICAgICAgICBpcyBub3QgZXF1YWwgdG8gTlVMTC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgcFNyY09yZywgcFNyY1ByZWQsIHBOdW1Db2VmZiwgcERzdFF1YW50Q29lZmYsIAotICogICAgICAgICAgICBwRHN0RGVRdWFudENvZWZmLCBwRENDb2VmZiAKLSAqICAgIC0gICAgcFNyY09yZyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgcFNyY1ByZWQgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlTcmNPcmdTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIGlTcmNQcmVkU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBwRHN0UXVhbnRDb2VmZiBvciBwRHN0RGVRdWFudENvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUHJlZCwKLSAgICBPTVhfVTMyIGlTcmNPcmdTdGVwLAotICAgIE9NWF9VMzIgaVNyY1ByZWRTdGVwLAotICAgIE9NWF9TMTYgKnBEc3RRdWFudENvZWZmLAotICAgIE9NWF9TMTYgKnBEc3REZVF1YW50Q29lZmYsCi0gICAgT01YX1MxNiAqcERDQ29lZmYsCi0gICAgT01YX1M4ICpwTnVtQ29lZmYsCi0gICAgT01YX1UzMiBuVGhyZXNoU0FELAotICAgIE9NWF9VMzIgaVFQLAotICAgIE9NWF9VOCBiSW50cmEKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9HZXRWTENJbmZvICAgKDYuMy41LjkuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gZXh0cmFjdHMgcnVuLWxlbmd0aCBlbmNvZGluZyAoUkxFKSBpbmZvcm1hdGlvbiBmcm9tIHRoZSAKLSAqIGNvZWZmaWNpZW50IG1hdHJpeC4gIFRoZSByZXN1bHRzIGFyZSByZXR1cm5lZCBpbiBhbiBPTVhWQ000UDEwVkxDSW5mbyAKLSAqIHN0cnVjdHVyZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0NvZWZmIC0gcG9pbnRlciB0byB0aGUgdHJhbnNmb3JtIGNvZWZmaWNpZW50IG1hdHJpeC4gIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcFNjYW5NYXRyaXggLSBwb2ludGVyIHRvIHRoZSBzY2FuIG9yZGVyIGRlZmluaXRpb24gbWF0cml4LiAgRm9yIGEgbHVtYSAKLSAqICAgICAgICAgICAgYmxvY2sgdGhlIHNjYW4gbWF0cml4IHNob3VsZCBmb2xsb3cgW0lTTzE0NDk2LTEwXSBzZWN0aW9uIDguNS40LCAKLSAqICAgICAgICAgICAgYW5kIHNob3VsZCBjb250YWluIHRoZSB2YWx1ZXMgMCwgMSwgNCwgOCwgNSwgMiwgMywgNiwgOSwgMTIsIDEzLCAKLSAqICAgICAgICAgICAgMTAsIDcsIDExLCAxNCwgMTUuICBGb3IgYSBjaHJvbWEgYmxvY2ssIHRoZSBzY2FuIG1hdHJpeCBzaG91bGQgCi0gKiAgICAgICAgICAgIGNvbnRhaW4gdGhlIHZhbHVlcyAwLCAxLCAyLCAzLiAKLSAqICAgYkFDIC0gaW5kaWNhdGVzIHByZXNlbmNlIG9mIGEgREMgY29lZmZpY2llbnQ7IDAgPSBEQyBjb2VmZmljaWVudCAKLSAqICAgICAgICAgICAgcHJlc2VudCwgMT0gREMgY29lZmZpY2llbnQgYWJzZW50LiAKLSAqICAgTWF4TnVtQ29lZiAtIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBjb250YWluZWQgaW4gdGhlIAotICogICAgICAgICAgICB0cmFuc2Zvcm0gY29lZmZpY2llbnQgbWF0cml4LCBwU3JjQ29lZmYuIFRoZSB2YWx1ZSBzaG91bGQgYmUgMTYgCi0gKiAgICAgICAgICAgIGZvciBibG9ja3Mgb2YgdHlwZSBMVU1BREMsIExVTUFBQywgTFVNQUxFVkVMLCBhbmQgQ0hST01BQUMuIFRoZSAKLSAqICAgICAgICAgICAgdmFsdWUgc2hvdWxkIGJlIDQgZm9yIGJsb2NrcyBvZiB0eXBlIENIUk9NQURDLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFZMQ0luZm8gLSBwb2ludGVyIHRvIHN0cnVjdHVyZSB0aGF0IHN0b3JlcyBpbmZvcm1hdGlvbiBmb3IgCi0gKiAgICAgICAgICAgIHJ1bi1sZW5ndGggY29kaW5nLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICBwU3JjQ29lZmYsIHBTY2FuTWF0cml4LCBwRHN0VkxDSW5mbyAKLSAqICAgIC0gICAgcFNyY0NvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0dldFZMQ0luZm8gKAotICAgIGNvbnN0IE9NWF9TMTYgKnBTcmNDb2VmZiwKLSAgICBjb25zdCBPTVhfVTggKnBTY2FuTWF0cml4LAotICAgIE9NWF9VOCBiQUMsCi0gICAgT01YX1UzMiBNYXhOdW1Db2VmLAotICAgIE9NWFZDTTRQMTBWTENJbmZvKnBEc3RWTENJbmZvCi0pOwotCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qKiBlbmQgb2YgI2RlZmluZSBfT01YVkNfSF8gKi8KLQotLyoqIEVPRiAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvYXBpL29teFZDX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9hcGkvb214VkNfcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTk3NGQ1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9hcGkvb214VkNfcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLTsvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07Ly8gQ29weXJpZ2h0IChjKSAxOTk5LTIwMDUgVGhlIEtocm9ub3MgR3JvdXAgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkCi07Ly8KLTsvLwotOy8vCi07Ly8KLTsvLwotOy8vCi07Ly8KLTsvLwotOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotOy8qKiA9PT09PT09PT09PT09PT0gU3RydWN0dXJlIERlZmluaXRpb24gZm9yIFNhbXBsZSBHZW5lcmF0aW9uID09PT09PT09PT09PT09ICovCi07LyoqIHRyYW5zcGFyZW50IHN0YXR1cyAqLwotCi07ZW51bSB7Ci1PTVhfVklERU9fVFJBTlNQQVJFTlQJRVFVIDA7CS8qKiBXaG9sbHkgdHJhbnNwYXJlbnQgKi8KLU9NWF9WSURFT19QQVJUSUFMCQlFUVUgMTsJLyoqIFBhcnRpYWxseSB0cmFuc3BhcmVudCAqLwotT01YX1ZJREVPX09QQVFVRQkJRVFVIDI7CS8qKiBPcGFxdWUgKi8KLTt9Ci0KLTsvKiogZGlyZWN0aW9uICovCi07ZW51bSB7Ci1PTVhfVklERU9fTk9ORQkJCUVRVSAwOwotT01YX1ZJREVPX0hPUklaT05UQUwJRVFVIDE7Ci1PTVhfVklERU9fVkVSVElDQUwJCUVRVSAyOwotO30KLQotOy8qKiBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIHR5cGUgKi8KLTtlbnVtIHsKLU9NWF9WSURFT19JTlRFR0VSX1BJWEVMIEVRVSAwOwkvKiogY2FzZSChsGGhsSAqLwotT01YX1ZJREVPX0hBTEZfUElYRUxfWCAgRVFVIDE7CS8qKiBjYXNlIKGwYqGxICovCi1PTVhfVklERU9fSEFMRl9QSVhFTF9ZICBFUVUgMjsJLyoqIGNhc2UgobBjobEgKi8KLU9NWF9WSURFT19IQUxGX1BJWEVMX1hZIEVRVSAzOwkvKiogY2FzZSChsGShsSAqLwotO30KLQotO2VudW0gewotT01YX1VQUEVSICAJCQkJRVFVIDE7CQkJLyoqIHNldCBpZiB0aGUgYWJvdmUgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KLU9NWF9MRUZUICAgCQkJCUVRVSAyOwkJCS8qKiBzZXQgaWYgdGhlIGxlZnQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KLU9NWF9DRU5URVIgCQkJCUVRVSA0OwotT01YX1JJR0hUCQkJCUVRVSA4OwotT01YX0xPV0VSICAJCQkJRVFVCTE2OwotT01YX1VQUEVSX0xFRlQgIAkJRVFVIDMyOwkJLyoqIHNldCBpZiB0aGUgYWJvdmUtbGVmdCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLwotT01YX1VQUEVSX1JJR0hUIAkJRVFVIDY0OwkJLyoqIHNldCBpZiB0aGUgYWJvdmUtcmlnaHQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KLU9NWF9MT1dFUl9MRUZUICAJCUVRVSAxMjg7Ci1PTVhfTE9XRVJfUklHSFQgCQlFUVUgMjU2Ci07fQotCi07ZW51bSB7Ci1PTVhfVklERU9fTFVNSU5BTkNFICAJRVFVIDA7CS8qKiBMdW1pbmFuY2UgY29tcG9uZW50ICovCi1PTVhfVklERU9fQ0hST01JTkFOQ0UgIAlFUVUgMTsJLyoqIGNocm9taW5hbmNlIGNvbXBvbmVudCAqLwotT01YX1ZJREVPX0FMUEhBICAJCUVRVSAyOwkJCS8qKiBBbHBoYSBjb21wb25lbnQgKi8KLTt9Ci0KLTtlbnVtIHsKLU9NWF9WSURFT19JTlRFUgkJCUVRVSAwOwkvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCi1PTVhfVklERU9fSU5URVJfUQkJRVFVIDE7CS8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KLU9NWF9WSURFT19JTlRFUjRWCQlFUVUgMjsJLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLwotT01YX1ZJREVPX0lOVFJBCQkJRVFVIDM7CS8qKiBJIGFuZCBQIHBpY3R1cmU7IEktIGFuZCBQLVZPUCAqLwotT01YX1ZJREVPX0lOVFJBX1EJCUVRVSA0OwkvKiogSSBhbmQgUCBwaWN0dXJlOyBJLSBhbmQgUC1WT1AgKi8KLU9NWF9WSURFT19JTlRFUjRWX1EJCUVRVSA1OwkvKiogUCBwaWN0dXJlIG9yIFAtVk9QIChILjI2MykqLwotT01YX1ZJREVPX0RJUkVDVAkJRVFVIDY7CS8qKiBCIHBpY3R1cmUgb3IgQi1WT1AgKE1QRUctNCBvbmx5KSAqLwotT01YX1ZJREVPX0lOVEVSUE9MQVRFCUVRVSA3OwkvKiogQiBwaWN0dXJlIG9yIEItVk9QICovCi1PTVhfVklERU9fQkFDS1dBUkQJCUVRVSA4OwkvKiogQiBwaWN0dXJlIG9yIEItVk9QICovCi1PTVhfVklERU9fRk9SV0FSRAkJRVFVIDk7CS8qKiBCIHBpY3R1cmUgb3IgQi1WT1AgKi8KLU9NWF9WSURFT19OT1RDT0RFRAkJRVFVIDEwOwkvKiogQiBwaWN0dXJlIG9yIEItVk9QICovCi07fQotCi07ZW51bSB7Ci1PTVhfMTZYMTZfVkVSVCAJCQlFUVUgMDsJCS8qKiBJbnRyYV8xNngxNl9WZXJ0aWNhbCAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YXzE2WDE2X0hPUiAJCQlFUVUgMTsJCS8qKiBJbnRyYV8xNngxNl9Ib3Jpem9udGFsIChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfMTZYMTZfREMgCQkJRVFVIDI7CQkvKiogSW50cmFfMTZ4MTZfREMgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF8xNlgxNl9QTEFORSAJCUVRVSAzOwkvKiogSW50cmFfMTZ4MTZfUGxhbmUgKHByZWRpY3Rpb24gbW9kZSkgKi8KLTt9Ci0KLTtlbnVtIHsKLU9NWF80eDRfVkVSVCAJCQlFUVUgMDsJCS8qKiBJbnRyYV80eDRfVmVydGljYWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF80eDRfSE9SICAJCQlFUVUgMTsJCS8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbCAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YXzR4NF9EQyAgIAkJCUVRVSAyOwkJLyoqIEludHJhXzR4NF9EQyAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YXzR4NF9ESUFHX0RMIAkJRVFVIDM7CS8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9MZWZ0IChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfNHg0X0RJQUdfRFIgCQlFUVUgNDsJLyoqIEludHJhXzR4NF9EaWFnb25hbF9Eb3duX1JpZ2h0IChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfNHg0X1ZSIAkJCQlFUVUgNTsJCQkvKiogSW50cmFfNHg0X1ZlcnRpY2FsX1JpZ2h0IChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfNHg0X0hEIAkJCQlFUVUgNjsJCQkvKiogSW50cmFfNHg0X0hvcml6b250YWxfRG93biAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YXzR4NF9WTCAJCQkJRVFVIDc7CQkJLyoqIEludHJhXzR4NF9WZXJ0aWNhbF9MZWZ0IChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfNHg0X0hVIAkJCQlFUVUgODsJCQkvKiogSW50cmFfNHg0X0hvcml6b250YWxfVXAgKHByZWRpY3Rpb24gbW9kZSkgKi8KLTt9Ci0KLTtlbnVtIHsKLU9NWF9DSFJPTUFfREMgCQkJRVFVIDA7CQkvKiogSW50cmFfQ2hyb21hX0RDIChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfQ0hST01BX0hPUiAJCQlFUVUgMTsJCS8qKiBJbnRyYV9DaHJvbWFfSG9yaXpvbnRhbCAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YX0NIUk9NQV9WRVJUIAkJRVFVIDI7CS8qKiBJbnRyYV9DaHJvbWFfVmVydGljYWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF9DSFJPTUFfUExBTkUgCQlFUVUgMzsJLyoqIEludHJhX0Nocm9tYV9QbGFuZSAocHJlZGljdGlvbiBtb2RlKSAqLwotO30KLQotO3R5cGVkZWYJc3RydWN0IHsJCi14CUVRVQkwOwoteQlFUVUJNDsKLTt9T01YQ29vcmRpbmF0ZTsKLQotO3R5cGVkZWYgc3RydWN0IHsKLWR4CUVRVQkwOwotZHkJRVFVCTI7Ci07fU9NWE1vdGlvblZlY3RvcjsKLQotO3R5cGVkZWYgc3RydWN0IHsKLXh4CQlFUVUJMDsKLXl5CQlFUVUJNDsKLXdpZHRoCUVRVQk4OwotaGVpZ2h0CUVRVQkxMjsKLTt9T01YaVJlY3Q7Ci0KLTt0eXBlZGVmIGVudW0gewotT01YX1ZDX0lOVEVSICAgICAgICAgRVFVIDA7ICAgICAgICAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCi1PTVhfVkNfSU5URVJfUSAgICAgICBFUVUgMTsgICAgICAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLwotT01YX1ZDX0lOVEVSNFYgICAgICAgRVFVIDI7ICAgICAgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KLU9NWF9WQ19JTlRSQSAgICAgICAgIEVRVSAzOyAgICAgICAgLyoqIEkgYW5kIFAgcGljdHVyZSwgSS0gYW5kIFAtVk9QICovCi1PTVhfVkNfSU5UUkFfUSAgICAgICBFUVUgNDsgICAgICAgLyoqIEkgYW5kIFAgcGljdHVyZSwgSS0gYW5kIFAtVk9QICovCi1PTVhfVkNfSU5URVI0Vl9RICAgICBFUVUgNTsgICAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAoSC4yNjMpKi8KLTt9IE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlOwotCi07ZW51bSB7Ci1PTVhfVkNfTk9ORSAgICAgICAgICBFUVUgMAotT01YX1ZDX0hPUklaT05UQUwgICAgRVFVIDEKLU9NWF9WQ19WRVJUSUNBTCAgICAgIEVRVSAyIAotO307Ci0KLQotCUVORAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNl9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NjNhNzAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTZfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLSA7LyoqCi0gOyAqIEZ1bmN0aW9uOiBvbXhWQ0NPTU1fQ29weTE2eDE2Ci0gOyAqCi0gOyAqIERlc2NyaXB0aW9uOgotIDsgKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSAxNngxNiBibG9jayB0byB0aGUgY3VycmVudCBibG9jay4KLSA7ICogUGFyYW1ldGVyczoKLSA7ICogW2luXSBwU3JjICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDE2LWJ5dGUgYm91bmRhcnkuCi0gOyAqIFtpbl0gc3RlcCAgICAgICAgIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgZnJhbWUsIGluIGJ5dGVzOwotIDsgKiAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiBhbmQgbXVzdCBiZSBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byAxNi4KLSA7ICogW291dF0gcERzdCAgICAgICAgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4KLSA7ICogUmV0dXJuIFZhbHVlOgotIDsgKiBPTVhfU3RzX05vRXJyICAgICAtIG5vIGVycm9yCi0gOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSA7ICogICAgICAgICAgICAgICAgICAgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6ICBwU3JjLCBwRHN0Ci0gOyAqICAgICAgICAgICAgICAgICAgIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhbiAxNi1ieXRlIGJvdW5kYXJ5OiAgcFNyYywgcERzdAotIDsgKiAgICAgICAgICAgICAgICAgICAtIHN0ZXAgPDE2IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuICAKLSA7ICovCi0KLSAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAKLSAgICAgCi0gICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0gICAgIAotCi0KLQotICAgICBJRiBBUk0xMTM2SlMKLQotOy8vSW5wdXQgQXJndW1lbnRzCi1wU3JjICAgIFJOIDAgICAgICAgIAotcERzdCAgICBSTiAxICAgICAgICAKLXN0ZXAgICAgUk4gMgotCi07Ly9Mb2NhbCBWYXJpYWJsZXMKLUNvdW50ICAgUk4gMTQKLVgwICAgICAgUk4gMgotWDEgICAgICBSTiA0Ci0KLVJldHVybiAgUk4gMAotICAgICAKLSAgICAgTV9TVEFSVCBvbXhWQ0NPTU1fQ29weTE2eDE2LHI1Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFNVQiAgIENvdW50LHN0ZXAsIzggICAgICAgICAgICAgICAgIDsvL0NvdW50PXN0ZXAtOAotICAgICAgICBMRFJEICBYMCxbcFNyY10sIzggICAgICAgICAgICAgICAgICA7Ly9wU3JjIGFmdGVyIGxvYWRpbmcgcFNyYz1wU3JjKzgKLSAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50ICAgICAgICAgICAgICAgOy8vcFNyYyBhZnRlciBsb2FkaW5nIHBTcmM9cFNyYytzdGVwCi0gICAgICAgIAotICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZwotICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4IAotICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50Ci0gICAgICAgIAotICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZwotICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4Ci0gICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKLSAgICAgICAgCi0gICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCi0gICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMCxbcFNyY10sIzgKLSAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAotICAgICAgICAKLSAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKLSAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOAotICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50Ci0gICAgICAgIAotICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZwotICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4Ci0gICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKLSAgICAgICAKLSAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKLSAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOAotICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50Ci0KLSAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKLSAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOAotICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50Ci0gICAgICAgIAotICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZwotICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMCxbcFNyY10sIzggCi0gICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKLSAgICAgICAgCi0gICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCi0gICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMCxbcFNyY10sIzggCi0gICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKLQotICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZwotICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4IAotICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50Ci0KLSAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKLSAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOCAKLSAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAotCi0gICAgICAgIDsvLyBsb2FkaW5nIDE2IGJ5dGVzIGFuZCBzdG9yaW5nCi0gICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMCxbcFNyY10sIzggCi0gICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKLQotICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZwotICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4IAotICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50Ci0KLSAgICAgICAgOy8vIGxvYWRpbmcgMTYgYnl0ZXMgYW5kIHN0b3JpbmcKLSAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgwLFtwU3JjXSwjOCAKLSAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAotICAgICAgIAotICAgICAgICA7Ly8gbG9hZGluZyAxNiBieXRlcyBhbmQgc3RvcmluZwotICAgICAgICBTVFJEICBYMCxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDAsW3BTcmNdLCM4IAotICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDEsW3BTcmNdLENvdW50Ci0KLSAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIE1PViAgIFJldHVybiwjT01YX1N0c19Ob0VycgotICAgICAgICBTVFJEICBYMSxbcERzdF0sIzggICAgICAgICAgICAgICAKLQotICAgICAgIAotICAgICAgICBNX0VORAotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgRU5ECi0gICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5Mzg3M2MuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4X3MucworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLSA7LyoqCi0gOyAqIEZ1bmN0aW9uOiBvbXhWQ0NPTU1fQ29weTh4OAotIDsgKgotIDsgKiBEZXNjcmlwdGlvbjoKLSA7ICogQ29waWVzIHRoZSByZWZlcmVuY2UgOHg4IGJsb2NrIHRvIHRoZSBjdXJyZW50IGJsb2NrLgotIDsgKiBQYXJhbWV0ZXJzOgotIDsgKiBbaW5dIHBTcmMgICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LgotIDsgKiBbaW5dIHN0ZXAgICAgICAgICAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0cyBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgcmVmZXJlbmNlIGZyYW1lLCBpbiBieXRlczsKLSA7ICogICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCBhbmQgbXVzdCBiZSBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byA4LgotIDsgKiBbb3V0XSBwRHN0ICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LgotIDsgKiBSZXR1cm4gVmFsdWU6Ci0gOyAqIE9NWF9TdHNfTm9FcnIgICAgIC0gbm8gZXJyb3IKLSA7ICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotIDsgKiAgICAgICAgICAgICAgICAgICAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogIHBTcmMsIHBEc3QKLSA7ICogICAgICAgICAgICAgICAgICAgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeTogIHBTcmMsIHBEc3QKLSA7ICogICAgICAgICAgICAgICAgICAgLSBzdGVwIDw4IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gIAotIDsgKi8KLQotICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgIAotICAgICAKLSAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLSAgICAgCi0KLQotCi0gICAgIElGIEFSTTExMzZKUwotCi07Ly9JbnB1dCBBcmd1bWVudHMKLXBTcmMgICAgUk4gMCAgICAgICAgCi1wRHN0ICAgIFJOIDEgICAgICAgIAotc3RlcCAgICBSTiAyCi0KLTsvL0xvY2FsIFZhcmlhYmxlcwotQ291bnQgICBSTiAxNAotWDAgICAgICBSTiAyCi1YMSAgICAgIFJOIDQKLVJldHVybiAgUk4gMAotICAgICBNX1NUQVJUIG9teFZDQ09NTV9Db3B5OHg4LHI1Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1PViAgIENvdW50LHN0ZXAgICAgICAgICAgICAgICAgIDsvL0NvdW50PXN0ZXAgCi0gICAgICAgIAotICAgICAgICBMRFJEICBYMCxbcFNyY10sQ291bnQgICAgICAgICAgICA7Ly9wU3JjIGFmdGVyIGxvYWRpbmcgOiBwU3JjPXBTcmMrc3RlcAotICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKLSAgICAgICAgCi0gICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMCxbcFNyY10sQ291bnQgCi0gICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKLSAgICAgICAgCi0gICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMCxbcFNyY10sQ291bnQKLSAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIExEUkQgIFgxLFtwU3JjXSxDb3VudAotICAgICAgICAKLSAgICAgICAgU1RSRCAgWDAsW3BEc3RdLCM4ICAgICAgICAgICAgICAKLSAgICAgICAgTERSRCAgWDAsW3BTcmNdLENvdW50Ci0gICAgICAgIFNUUkQgIFgxLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBMRFJEICBYMSxbcFNyY10sQ291bnQKLSAgICAgICAgCi0gICAgICAgIFNUUkQgIFgwLFtwRHN0XSwjOCAgICAgICAgICAgICAgIAotICAgICAgICBNT1YgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKLSAgICAgICAgU1RSRCAgWDEsW3BEc3RdLCM4ICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgTV9FTkQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIEVORAotICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVkMjI3MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotOy8vIERlc2NyaXB0aW9uOgotOy8vIFRoaXMgZnVuY3Rpb24gd2lsbCBFeHBhbmQgRnJhbWUgYm91bmRhcnkgcGl4ZWxzIGludG8gUGxhbmUKLTsvLyAKLTsvLyAKLQotOy8vIEluY2x1ZGUgc3RhbmRhcmQgaGVhZGVycwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLTsvLyBJbXBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tIG90aGVyIGZpbGVzCi07Ly8gKEZvciBleGFtcGxlIHRhYmxlcykKLSAgICAKLSAgCi07Ly8gU2V0IGRlYnVnZ2luZyBsZXZlbCAgICAgICAgCi1ERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KLQotCi0gICAgCi0KLQotCi0gICAgICAgIAotOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQotICAgIAotICAgIElGICBBUk0xMTM2SlMKLSAgICAKLTsvL0lucHV0IFJlZ2lzdGVycwotCi1wU3JjRHN0UGxhbmUgICAgUk4gIDAKLWlGcmFtZVdpZHRoICAgICBSTiAgMQotaUZyYW1lSGVpZ2h0ICAgIFJOICAyICAgIAotaUV4cGFuZFBlbHMgICAgIFJOICAzCi0KLQotOy8vT3V0cHV0IFJlZ2lzdGVycwotCi1yZXN1bHQgICAgICAgICAgUk4gIDAKLQotOy8vTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKLQotaVBsYW5lU3RlcCAgICAgIFJOICA0Ci1wVG9wICAgICAgICAgICAgUk4gIDUKLXBCb3R0b20gICAgICAgICBSTiAgNgotcEJvdHRvbUluZGV4ICAgIFJOICA3Ci14ICAgICAgICAgICAgICAgUk4gIDgKLXkgICAgICAgICAgICAgICBSTiAgOQotdGVtcFRvcCAgICAgICAgIFJOICAxMAotdGVtcEJvdCAgICAgICAgIFJOICAxMQotQ29sU3RlcCAgICAgICAgIFJOICAxMgotcExlZnQgICAgICAgICAgIFJOICA1Ci1wUmlnaHQgICAgICAgICAgUk4gIDYKLXBSaWdodEluZGV4ICAgICBSTiAgNwotdGVtcExlZnQxICAgICAgIFJOICAxMAotdGVtcFJpZ2h0MSAgICAgIFJOICAxMQotdGVtcExlZnQyICAgICAgIFJOICAxNAotdGVtcFJpZ2h0MiAgICAgIFJOICAyCi1pbmRleFkgICAgICAgICAgUk4gIDE0Ci1Sb3dTdGVwICAgICAgICAgUk4gIDEyCi1leHBhbmRUbzRieXRlcyAgUk4gIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNvcHkgYSBieXRlIHRvIDQgYnl0ZXMgb2YgYSB3b3JkCi0gICAgCi0gICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JLHIxMQotICAgICAgICAKLSAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKLSAgICAgICAgTV9BUkcgICBpUGxhbmVTdGVwT25TdGFjaywgNAotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKLSAgICAgICAgTV9MRFIgICBpUGxhbmVTdGVwLCBpUGxhbmVTdGVwT25TdGFjawotICAgICAgICAKLSAgICAgICAgTVVMICAgICBwVG9wLGlFeHBhbmRQZWxzLGlQbGFuZVN0ZXAKLSAgICAgICAgTUxBICAgICBwQm90dG9tLGlGcmFtZUhlaWdodCxpUGxhbmVTdGVwLHBTcmNEc3RQbGFuZQotICAgICAgICBTVUIgICAgIHgsaUZyYW1lV2lkdGgsIzQKLSAgICAgICAgTU9WICAgICBpbmRleFkscFRvcAotICAgICAgICBBREQgICAgIENvbFN0ZXAsaW5kZXhZLCM0Ci0gICAgICAgIFNVQiAgICAgcEJvdHRvbUluZGV4LHBCb3R0b20saVBsYW5lU3RlcAotICAgICAgICBTVUIgICAgIHBUb3AscFNyY0RzdFBsYW5lLHBUb3AKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBBREQgICAgIHBUb3AscFRvcCx4Ci0gICAgICAgIEFERCAgICAgcEJvdHRvbSxwQm90dG9tLHgKLQotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOy8vIFRoZSBmb2xsb3dpbmcgaW1wcm92ZXMgdXBvbiB0aGUgQyBpbXBsbWVudGF0aW9uCi0gICAgICAgIDsvLyBUaGUgeCBhbmQgeSBsb29wcyBhcmUgaW50ZXJjaGFuZ2VkOiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgdmFsdWVzIG9mCi0gICAgICAgIDsvLyBwU3JjRHN0UGxhbmUgW3hdIGFuZCBwU3JjRHN0UGxhbmUgWyhpRnJhbWVIZWlnaHQgLSAxKSAqIGlQbGFuZVN0ZXAgKyB4XSAKLSAgICAgICAgOy8vIHdoaWNoIGRlcGVuZCBvbmx5IG9uIGxvb3AgdmFyaWFibGUgJ3gnIGFyZSBsb2FkZWQgb25jZSBhbmQgdXNlZCBpbiAKLSAgICAgICAgOy8vIG11bHRpcGxlIHN0b3JlcyBpbiB0aGUgJ1knIGxvb3AKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgOy8vIHhsb29wCi1FeHBhbmRGcmFtZVRvcEJvdFhsb29wCi0gICAgICAgIAotICAgICAgICBMRFIgICAgIHRlbXBUb3AsW3BTcmNEc3RQbGFuZSx4XQotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOy8vIHBTcmNEc3RQbGFuZSBbKGlGcmFtZUhlaWdodCAtIDEpICogaVBsYW5lU3RlcCArIHhdIGlzIHNpbXBsaWZpZWQgYXM6Ci0gICAgICAgIDsvLyBwU3JjRHN0UGxhbmUgKyAoaUZyYW1lSGVpZ2h0ICogaVBsYW5lU3RlcCkgLSBpUGxhbmVTdGVwICsgeCA9PQotICAgICAgICA7Ly8gcEJvdHRvbSAtIGlQbGFuZVN0ZXAgKyB4ID09IHBCb3R0b21JbmRleCBbeF0KLSAgICAgICAgOy8vIFRoZSB2YWx1ZSBvZiBwQm90dG9tSW5kZXggaXMgY2FsY3VsYXRlZCBhYm92ZSB0aGlzICd4JyBsb29wCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBMRFIgICAgIHRlbXBCb3QsW3BCb3R0b21JbmRleCx4XQotICAgICAgICAKLSAgICAgICAgOy8vIHlsb29wCi0gICAgICAgIE1PViAgICAgeSxpRXhwYW5kUGVscwotCi1FeHBhbmRGcmFtZVRvcEJvdFlsb29wICAgICAgICAKLSAgICAgICAgU1VCUyAgICB5LHksIzEKLSAgICAgICAgTV9TVFIgICB0ZW1wVG9wLFtwVG9wXSxpUGxhbmVTdGVwCi0gICAgICAgIE1fU1RSICAgdGVtcEJvdCxbcEJvdHRvbV0saVBsYW5lU3RlcAotICAgICAgICBCR1QgICAgIEV4cGFuZEZyYW1lVG9wQm90WWxvb3AKLSAgICAgICAgCi0gICAgICAgIFNVQlMgICAgeCx4LCM0Ci0gICAgICAgIFNVQiAgICAgcFRvcCxwVG9wLENvbFN0ZXAKLSAgICAgICAgU1VCICAgICBwQm90dG9tLHBCb3R0b20sQ29sU3RlcAotICAgICAgICBCR0UgICAgIEV4cGFuZEZyYW1lVG9wQm90WGxvb3AKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8geSBsb29wCi0gICAgICAgIDsvLyBUaGUgcHJvZHVjdCBpcyBhbHJlYWR5IGNhbGN1bGF0ZWQgYWJvdmUgOiBSZXVzZQotICAgICAgICA7Ly9NVUwgICAgIGluZGV4WSxpRXhwYW5kUGVscyxpUGxhbmVTdGVwICAgICAgCi0gICAgICAKLSAgICAgICAgU1VCICAgICBwU3JjRHN0UGxhbmUscFNyY0RzdFBsYW5lLGluZGV4WQotICAgICAgICBTVUIgICAgIHBMZWZ0LHBTcmNEc3RQbGFuZSxpRXhwYW5kUGVscyAgICAgICAgICAgICAgICAgIDsvLyBwTGVmdC0+cG9pbnRzIHRvIHRoZSB0b3AgbGVmdCBvZiB0aGUgZXhwYW5kZWQgYmxvY2sKLSAgICAgICAgQUREICAgICBwUmlnaHQscFNyY0RzdFBsYW5lLGlGcmFtZVdpZHRoCi0gICAgICAgIFNVQiAgICAgcFJpZ2h0SW5kZXgscFJpZ2h0LCMxIAotICAgICAgICAKLSAgICAgICAgQUREICAgICB5LGlGcmFtZUhlaWdodCxpRXhwYW5kUGVscyxMU0wgIzEKLSAgICAgICAgTERSICAgICBleHBhbmRUbzRieXRlcyw9MHgwMTAxMDEwMQotICAgICAgICAKLSAgICAgICAgUlNCICAgICBSb3dTdGVwLGlFeHBhbmRQZWxzLGlQbGFuZVN0ZXAsTFNMICMxCi0KLSAgICAgICAgOy8vIFRoZSBZIExvb3AgaXMgdW5yb2xsZWQgdHdpY2UKLUV4cGFuZEZyYW1lTGVmdFJpZ2h0WWxvb3AgIAotICAgICAgICBMRFJCICAgIHRlbXBMZWZ0MixbcFNyY0RzdFBsYW5lLGlQbGFuZVN0ZXBdICAgICAgICAgICAgIDsvLyBQcmVMb2FkIHRoZSB2YWx1ZXMKLSAgICAgICAgTERSQiAgICB0ZW1wUmlnaHQyLFtwUmlnaHRJbmRleCxpUGxhbmVTdGVwXQotICAgICAgICBNX0xEUkIgIHRlbXBMZWZ0MSxbcFNyY0RzdFBsYW5lXSxpUGxhbmVTdGVwLExTTCAjMSAgICAgIDsvLyBQcmVMb2FkIHRoZSB2YWx1ZXMKLSAgICAgICAgTV9MRFJCICB0ZW1wUmlnaHQxLFtwUmlnaHRJbmRleF0saVBsYW5lU3RlcCxMU0wgIzEKLSAgICAgICAgICAgICAgCi0gICAgICAgIFNVQiAgICAgeCxpRXhwYW5kUGVscywjNAotICAgICAgICBNVUwgICAgIHRlbXBMZWZ0Mix0ZW1wTGVmdDIsZXhwYW5kVG80Ynl0ZXMgICAgICAgICAgICAgIDsvLyBDb3B5IHRoZSBzaW5nbGUgYnl0ZSB0byA0IGJ5dGVzCi0gICAgICAgIE1VTCAgICAgdGVtcFJpZ2h0Mix0ZW1wUmlnaHQyLGV4cGFuZFRvNGJ5dGVzCi0gICAgICAgIE1VTCAgICAgdGVtcExlZnQxLHRlbXBMZWZ0MSxleHBhbmRUbzRieXRlcyAgICAgICAgICAgICAgOy8vIENvcHkgdGhlIHNpbmdsZSBieXRlIHRvIDQgYnl0ZXMKLSAgICAgICAgTVVMICAgICB0ZW1wUmlnaHQxLHRlbXBSaWdodDEsZXhwYW5kVG80Ynl0ZXMKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8geCBsb29wCi1FeHBhbmRGcmFtZUxlZnRSaWdodFhsb29wICAgICAgICAKLSAgICAgICAgU1VCUyAgICB4LHgsIzQKLSAgICAgICAgU1RSICAgICB0ZW1wTGVmdDIsW3BMZWZ0LGlQbGFuZVN0ZXBdICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHRoZSA0IGJ5dGVzIGF0IG9uZSBnbwotICAgICAgICBTVFIgICAgIHRlbXBSaWdodDIsW3BSaWdodCxpUGxhbmVTdGVwXQotICAgICAgICBTVFIgICAgIHRlbXBMZWZ0MSxbcExlZnRdLCM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgdGhlIDQgYnl0ZXMgYXQgb25lIGdvCi0gICAgICAgIFNUUiAgICAgdGVtcFJpZ2h0MSxbcFJpZ2h0XSwjNAotICAgICAgICBCR0UgICAgIEV4cGFuZEZyYW1lTGVmdFJpZ2h0WGxvb3AKLSAgICAgICAgCi0gICAgICAgIFNVQlMgICAgeSx5LCMyCi0gICAgICAgIEFERCAgICAgcExlZnQscExlZnQsUm93U3RlcAotICAgICAgICBBREQgICAgIHBSaWdodCxwUmlnaHQsUm93U3RlcAotICAgICAgICBCR1QgICAgIEV4cGFuZEZyYW1lTGVmdFJpZ2h0WWxvb3AKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKLSAgICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgcmVzdWx0LCNPTVhfU3RzX05vRXJyICAKLUVuZCAgICAgICAgICAgICAKLSAgICAgIAotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAotICAgICAgICAKLSAgICAgICAgTV9FTkQKLSAgICAgICAgCi0gICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTICAgICAgICAKLSAKLSAgICAgICAgICAgIAotICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQzZDg2Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIAotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIAotICogSGVhZGVyIGZpbGUgZm9yIG9wdGltaXplZCBILjI2NCBDQUxWQyB0YWJsZXMKLSAqIAotICovCi0gCi0jaWZuZGVmIEFSTVZDTTRQMTBfQ0FWTENUQUJMRVNfSAotI2RlZmluZSBBUk1WQ000UDEwX0NBVkxDVEFCTEVTX0gKLSAgCi0vKiBDQVZMQyB0YWJsZXMgKi8KLQotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgKmFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzWzE4XTsKLWV4dGVybiBjb25zdCBPTVhfVTE2ICphcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzWzE1XTsKLWV4dGVybiBjb25zdCBPTVhfVTE2ICphcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc1szXTsKLWV4dGVybiBjb25zdCBPTVhfVTE2ICphcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzWzE1XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9aaWdaYWdfNHg0WzE2XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9aaWdaYWdfMngyWzRdOwotZXh0ZXJuIGNvbnN0IE9NWF9TOCBhcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWxbN107Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5OGYwYWMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucworKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0KLTsvLyBGdW5jdGlvbnM6Ci07Ly8gICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ248QUxJR05NRU5UPl91bnNhZmUgIAotOy8vCi07Ly8gSW1wbGVtZW50cyBBdmVyYWdlIG9mIDR4NCB3aXRoIGVxdWF0aW9uIGMgPSAoYStiKzEpPj4xLgotOy8vIEZpcnN0IG9wZXJhbmQgd2lsbCBiZSBhdCBvZmZzZXQgQUxJR05NRU5UIGZyb20gYWxpZ25lZCBhZGRyZXNzCi07Ly8gU2Vjb25kIG9wZXJhbmQgd2lsbCBiZSBhdCBhbGlnbmVkIGxvY2F0aW9uIGFuZCB3aWxsIGJlIHVzZWQgYXMgb3V0cHV0LgotOy8vIGRlc3RpbmF0aW9uIHBvaW50ZWQgYnkgKHBEc3QpIGZvciB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uLgotOy8vIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gY29weSA0IGJ5dGVzIGluIGhvcml6b250YWwgZGlyZWN0aW9uIAotOy8vCi07Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KLTsvLyByMCxyMSxyMixyMyB3aGVyZSByMiBjb250YWluaW5ncyBhbGlnbmVkIG1lbW9yeSBwb2ludGVyIGFuZCByMyBzdGVwIHNpemUKLTsvLwotOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgotOy8vIHI0LHI1LHI2LHI4LHI5LHIxNAotOy8vCi07Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgotOy8vIHI3LHIxMCxyMTEscjEyCi07Ly8KLTsvLyBPdXRwdXQgcmVnaXN0ZXJzCi07Ly8gcjIgLSBwb2ludGVyIHRvIHRoZSBhbGlnbmVkIGxvY2F0aW9uCi07Ly8gcjMgLSBzdGVwIHNpemUgdG8gdGhpcyBhbGlnbmVkIGxvY2F0aW9uCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMl91bnNhZmUKLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZQotCi1ERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi1wUHJlZDAgICAgICAgICAgUk4gMAotaVByZWRTdGVwMCAgICAgIFJOIDEKLXBQcmVkMSAgICAgICAgICBSTiAyCi1pUHJlZFN0ZXAxICAgICAgUk4gMwotcERzdFByZWQgICAgICAgIFJOIDIKLWlEc3RTdGVwICAgICAgICBSTiAzCi0KLTsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKLWlQcmVkQTAgICAgICAgICBSTiAxMAotaVByZWRBMSAgICAgICAgIFJOIDExCi1pUHJlZEIwICAgICAgICAgUk4gMTIKLWlQcmVkQjEgICAgICAgICBSTiAxNAotVGVtcDEgICAgICAgICAgIFJOIDQKLVRlbXAyICAgICAgICAgICBSTiA1Ci1SZXN1bHRBICAgICAgICAgUk4gNQotUmVzdWx0QiAgICAgICAgIFJOIDQKLXIweDgwODA4MDgwICAgICBSTiA3Ci0KLSAgICBJRiBBUk0xMTM2SlMKLSAgICAgICAgCi0gICAgICAgIDsvLyBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYXZlcmFnZSBvZiA0eDQgYmxvY2sgCi0gICAgICAgIDsvLyBwUHJlZDAgaXMgYXQgYWxpZ25tZW50IG9mZnNldCAwIGFuZCBwUHJlZDEgaXMgYWxpZ25tZW50IDQKLQotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlLCByNgotCi0gICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgcjB4ODA4MDgwODAsID0weDgwODA4MDgwCi0KLSAgICAgICAgOy8vIDFzdCBsb2FkCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKLQotICAgICAgICA7Ly8gKGErYisxKS8yID0gKGErMjU2LSgyNTUtYikpLzIgPSAoYS0oMjU1LWIpKS8yICsgMTI4Ci0gICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMQotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCi0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gMm5kIGxvYWQKLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIwLCBbcFByZWQxXQotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQotCi0gICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxCi0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAgICAgICAgIAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAgICAgICAgIAotRW5kMAotICAgICAgICBNX0VORAotCi0gICAgICAgIDsvLyBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYXZlcmFnZSBvZiA0eDQgYmxvY2sgCi0gICAgICAgIDsvLyBwUHJlZDAgaXMgYXQgYWxpZ25tZW50IG9mZnNldCAyIGFuZCBwUHJlZDEgaXMgYWxpZ25tZW50IDQKLQotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlLCByNgotCi0gICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgcjB4ODA4MDgwODAsID0weDgwODA4MDgwCi0KLSAgICAgICAgOy8vIDFzdCBsb2FkCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAxLCBbcFByZWQwLCAjNF0KLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIwLCBbcFByZWQxXQotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQotICAgICAgICBNX0xEUiAgICAgICBUZW1wMiwgW3BQcmVkMCwgIzRdCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCi0gICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMSAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIExTUiAjMTYKLSAgICAgICAgT1JSICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgVGVtcDEsIExTTCAjMTYgICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBMU1IgIzE2Ci0gICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIFRlbXAyLCBMU0wgIzE2Ci0KLSAgICAgICAgOy8vIChhK2IrMSkvMiA9IChhKzI1Ni0oMjU1LWIpKS8yID0gKGEtKDI1NS1iKSkvMiArIDEyOAotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCi0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gMm5kIGxvYWQKLSAgICAgICAgTERSICAgICAgICAgVGVtcDEsIFtwUHJlZDAsICM0XQotICAgICAgICBNX0xEUiAgICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KLSAgICAgICAgTERSICAgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KLSAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwUHJlZDAsICM0XQotICAgICAgICBNX0xEUiAgICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCi0gICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMQotICAgICAgICBNT1YgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBMU1IgIzE2Ci0gICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIFRlbXAxLCBMU0wgIzE2ICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgTFNSICMxNgotICAgICAgICBPUlIgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBUZW1wMiwgTFNMICMxNgotCi0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MCAgICAgICAgCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgICAgICAgICAgCi1FbmQyCi0gICAgICAgIE1fRU5ECi0KLQotICAgICAgICA7Ly8gVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIGF2ZXJhZ2Ugb2YgNHg0IGJsb2NrIAotICAgICAgICA7Ly8gcFByZWQwIGlzIGF0IGFsaWdubWVudCBvZmZzZXQgMyBhbmQgcFByZWQxIGlzIGFsaWdubWVudCA0Ci0KLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZSwgcjYKLQotICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIHIweDgwODA4MDgwLCA9MHg4MDgwODA4MAotCi0gICAgICAgIDsvLyAxc3QgbG9hZAotICAgICAgICBMRFIgICAgICAgICBUZW1wMSwgW3BQcmVkMCwgIzRdCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KLSAgICAgICAgTERSICAgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KLSAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwUHJlZDAsICM0XQotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAotCi0gICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMQotICAgICAgICBNT1YgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBMU1IgIzI0Ci0gICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIFRlbXAxLCBMU0wgIzggICAgICAgICAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIExTUiAjMjQKLSAgICAgICAgT1JSICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgVGVtcDIsIExTTCAjOAotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCi0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gMm5kIGxvYWQKLSAgICAgICAgTERSICAgICAgICAgVGVtcDEsIFtwUHJlZDAsICM0XQotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCi0gICAgICAgIExEUiAgICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFByZWQwLCAjNF0KLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKLQotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCi0gICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEKLSAgICAgICAgTU9WICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgTFNSICMyNAotICAgICAgICBPUlIgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBUZW1wMSwgTFNMICM4ICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgTFNSICMyNAotICAgICAgICBPUlIgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBUZW1wMiwgTFNMICM4Ci0KLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwICAgICAgICAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgICAgICAgICAKLUVuZDMKLSAgICAgICAgTV9FTkQKLQotICAgIEVORElGCi0gICAgCi0gICAgRU5ECi0gICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjg0YzhkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfQ0FWTENUYWJsZXMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogCi0gKiBPcHRpbWl6ZWQgQ0FWTEMgdGFibGVzIGZvciBILjI2NAotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotCi0jaW5jbHVkZSAiYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oIgotCi0vKiA0eDQgRGVaaWdaYWcgdGFibGUgKi8KLQotY29uc3QgT01YX1U4IGFybVZDTTRQMTBfWmlnWmFnXzR4NFsxNl0gPQotewotICAgIDAsIDEsIDQsIDgsIDUsIDIsIDMsIDYsIDksIDEyLCAxMywgMTAsIDcsIDExLCAxNCwgMTUKLX07Ci0KLS8qIDJ4MiBEZVppZ1phZyB0YWJsZSAqLwotCi1jb25zdCBPTVhfVTggYXJtVkNNNFAxMF9aaWdaYWdfMngyWzRdID0KLXsKLSAgICAwLCAxLCAyLCAzCi19OwotCi0KLS8qCi0gKiBTdWZmaXggVG8gTGV2ZWwgdGFibGUKLSAqIFdlIGluY3JlbWVudCB0aGUgc3VmZml4IGxlbmd0aCBpZiAKLSAqICgoTGV2ZWxDb2RlPj4xKSsxKT4oMzw8KFN1ZmZpeExlbmd0aC0xKSkgJiYgU3VmZml4TGVuZ3RoPDYKLSAqIChMZXZlbENvZGU+PjEpPj0oMzw8KFN1ZmZpeExlbmd0aC0xKSkgICAgJiYgU3VmZml4TGVuZ3RoPDYKLSAqICBMZXZlbENvZGUgICAgPj0gMzw8U3VmZml4TGVuZ3RoICAgICAgICAgJiYgU3VmZml4TGVuZ3RoPDYKLSAqIChMZXZlbENvZGUrMikgPj0gKDM8PFN1ZmZpeExlbmd0aCkrMiAgICAgJiYgU3VmZml4TGVuZ3RoPDYKLSAqLwotY29uc3QgT01YX1M4IGFybVZDTTRQMTBfU3VmZml4VG9MZXZlbFs3XSA9Ci17Ci0gICAgKDM8PDEpKzIsICAgICAgIC8qIFN1ZmZpeExlbmd0aD0xICovCi0gICAgKDM8PDEpKzIsICAgICAgIC8qIFN1ZmZpeExlbmd0aD0xICovCi0gICAgKDM8PDIpKzIsICAgICAgIC8qIFN1ZmZpeExlbmd0aD0yICovCi0gICAgKDM8PDMpKzIsICAgICAgIC8qIFN1ZmZpeExlbmd0aD0zICovCi0gICAgKDM8PDQpKzIsICAgICAgIC8qIFN1ZmZpeExlbmd0aD00ICovCi0gICAgKDM8PDUpKzIsICAgICAgIC8qIFN1ZmZpeExlbmd0aD01ICovCi0gICAgLTEgICAgICAgICAgICAgIC8qIFN1ZmZpeExlbmd0aD02IC0gbmV2ZXIgaW5jcmVtZW50ICovCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18wWzEzMl0gPSB7Ci0gICAgMHgwMDIwLCAweDAxMDAsIDB4MjAxNSwgMHgyMDE1LCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsCi0gICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsCi0gICAgMHgwMDI4LCAweDAwZjAsIDB4MDBmOCwgMHgwMDI3LCAweDAwMzAsIDB4MDBkOCwgMHgwMGUwLCAweDAwZTgsCi0gICAgMHgwMDM4LCAweDAwYTAsIDB4MDBjOCwgMHgwMGQwLCAweDAwNDAsIDB4MDA2OCwgMHgwMDkwLCAweDAwOTgsCi0gICAgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwgMHgwMDYwLCAweDI3ZmYsIDB4MjdmZiwgMHgyMDZiLCAweDIwNmIsCi0gICAgMHgwMDgxLCAweDAwODUsIDB4MDA4MywgMHgwMDc5LCAweDAwODcsIDB4MDA3ZCwgMHgwMDdiLCAweDAwNzEsCi0gICAgMHgwMDdmLCAweDAwNzUsIDB4MDA3MywgMHgwMDY5LCAweDAwNzAsIDB4MDA3OCwgMHgwMDgwLCAweDAwODgsCi0gICAgMHgyMDc3LCAweDIwNzcsIDB4MjA2ZCwgMHgyMDZkLCAweDIwNjMsIDB4MjA2MywgMHgyMDYxLCAweDIwNjEsCi0gICAgMHgyMDZmLCAweDIwNmYsIDB4MjA2NSwgMHgyMDY1LCAweDIwNWIsIDB4MjA1YiwgMHgyMDU5LCAweDIwNTksCi0gICAgMHgwMDY3LCAweDAwNWQsIDB4MDA1MywgMHgwMDUxLCAweDAwNWYsIDB4MDA1NSwgMHgwMDRiLCAweDAwNDksCi0gICAgMHgwMGE4LCAweDAwYjAsIDB4MDBiOCwgMHgwMGMwLCAweDIwNDEsIDB4MjA0MSwgMHgyMDRkLCAweDIwNGQsCi0gICAgMHgyMDQzLCAweDIwNDMsIDB4MjAzOSwgMHgyMDM5LCAweDIwNTcsIDB4MjA1NywgMHgyMDQ1LCAweDIwNDUsCi0gICAgMHgyMDNiLCAweDIwM2IsIDB4MjAzMSwgMHgyMDMxLCAweDIwNGYsIDB4MjA0ZiwgMHgyMDNkLCAweDIwM2QsCi0gICAgMHgyMDMzLCAweDIwMzMsIDB4MjAyOSwgMHgyMDI5LCAweDAwNDcsIDB4MDAzNSwgMHgwMDJiLCAweDAwMjEsCi0gICAgMHgyMDNmLCAweDIwM2YsIDB4MjAyZCwgMHgyMDJkLCAweDIwMjMsIDB4MjAyMywgMHgyMDE5LCAweDIwMTksCi0gICAgMHgwMDM3LCAweDAwMjUsIDB4MDAxYiwgMHgwMDExLCAweDIwMmYsIDB4MjAyZiwgMHgyMDFkLCAweDIwMWQsCi0gICAgMHgwMDEzLCAweDAwMDksIDB4MjAxZiwgMHgyMDFmCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18xWzEyOF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwZTgsIDB4MDBmMCwgMHgwMGY4LCAweDAwMjcsIDB4MDAxZiwgMHgyMDE1LCAweDIwMTUsCi0gICAgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsCi0gICAgMHgwMDI4LCAweDAwZDAsIDB4MDBkOCwgMHgwMGUwLCAweDAwMzAsIDB4MDA5OCwgMHgwMGMwLCAweDAwYzgsCi0gICAgMHgwMDM4LCAweDAwNjAsIDB4MDA4OCwgMHgwMDkwLCAweDAwNDAsIDB4MDA0OCwgMHgwMDUwLCAweDAwNTgsCi0gICAgMHgyN2ZmLCAweDI3ZmYsIDB4MjA3ZiwgMHgyMDdmLCAweDAwODcsIDB4MDA4NSwgMHgwMDgzLCAweDAwODEsCi0gICAgMHgwMDdiLCAweDAwNzksIDB4MDA3ZCwgMHgwMDczLCAweDIwNzUsIDB4MjA3NSwgMHgyMDcxLCAweDIwNzEsCi0gICAgMHgwMDY4LCAweDAwNzAsIDB4MDA3OCwgMHgwMDgwLCAweDIwNzcsIDB4MjA3NywgMHgyMDZkLCAweDIwNmQsCi0gICAgMHgyMDZiLCAweDIwNmIsIDB4MjA2OSwgMHgyMDY5LCAweDIwNmYsIDB4MjA2ZiwgMHgyMDY1LCAweDIwNjUsCi0gICAgMHgyMDYzLCAweDIwNjMsIDB4MjA2MSwgMHgyMDYxLCAweDAwNTksIDB4MDA1ZCwgMHgwMDViLCAweDAwNTEsCi0gICAgMHgwMDY3LCAweDAwNTUsIDB4MDA1MywgMHgwMDQ5LCAweDAwYTAsIDB4MDBhOCwgMHgwMGIwLCAweDAwYjgsCi0gICAgMHgyMDVmLCAweDIwNWYsIDB4MjA0ZCwgMHgyMDRkLCAweDIwNGIsIDB4MjA0YiwgMHgyMDQxLCAweDIwNDEsCi0gICAgMHgyMDU3LCAweDIwNTcsIDB4MjA0NSwgMHgyMDQ1LCAweDIwNDMsIDB4MjA0MywgMHgyMDM5LCAweDIwMzksCi0gICAgMHgyMDRmLCAweDIwNGYsIDB4MjAzZCwgMHgyMDNkLCAweDIwM2IsIDB4MjAzYiwgMHgyMDMxLCAweDIwMzEsCi0gICAgMHgwMDI5LCAweDAwMzUsIDB4MDAzMywgMHgwMDIxLCAweDIwNDcsIDB4MjA0NywgMHgyMDJkLCAweDIwMmQsCi0gICAgMHgyMDJiLCAweDIwMmIsIDB4MjAxOSwgMHgyMDE5LCAweDAwM2YsIDB4MDAyNSwgMHgwMDIzLCAweDAwMTEsCi0gICAgMHgwMDM3LCAweDAwMWQsIDB4MDAxYiwgMHgwMDA5LCAweDIwMmYsIDB4MjAyZiwgMHgyMDEzLCAweDIwMTMKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzJbMTEyXSA9IHsKLSAgICAweDAwMjAsIDB4MDA4OCwgMHgwMGIwLCAweDAwYjgsIDB4MDBjMCwgMHgwMGM4LCAweDAwZDAsIDB4MDBkOCwKLSAgICAweDAwM2YsIDB4MDAzNywgMHgwMDJmLCAweDAwMjcsIDB4MDAxZiwgMHgwMDE1LCAweDAwMGIsIDB4MDAwMSwKLSAgICAweDAwMjgsIDB4MDA1MCwgMHgwMDc4LCAweDAwODAsIDB4MDAzMCwgMHgwMDM4LCAweDAwNDAsIDB4MDA0OCwKLSAgICAweDA3ZmYsIDB4MDA4MSwgMHgwMDg3LCAweDAwODUsIDB4MDA4MywgMHgwMDc5LCAweDAwN2YsIDB4MDA3ZCwKLSAgICAweDAwN2IsIDB4MDA3MSwgMHgwMDc3LCAweDAwNzUsIDB4MDA3MywgMHgwMDY5LCAweDIwNmIsIDB4MjA2YiwKLSAgICAweDAwNTgsIDB4MDA2MCwgMHgwMDY4LCAweDAwNzAsIDB4MjA2MSwgMHgyMDYxLCAweDIwNmQsIDB4MjA2ZCwKLSAgICAweDIwNjMsIDB4MjA2MywgMHgyMDU5LCAweDIwNTksIDB4MjA2ZiwgMHgyMDZmLCAweDIwNjUsIDB4MjA2NSwKLSAgICAweDIwNWIsIDB4MjA1YiwgMHgyMDUxLCAweDIwNTEsIDB4MDA2NywgMHgwMDVkLCAweDAwNTMsIDB4MDA0OSwKLSAgICAweDAwNWYsIDB4MDA1NSwgMHgwMDRiLCAweDAwNDEsIDB4MDA5MCwgMHgwMDk4LCAweDAwYTAsIDB4MDBhOCwKLSAgICAweDIwMzksIDB4MjAzOSwgMHgyMDMxLCAweDIwMzEsIDB4MjA0ZCwgMHgyMDRkLCAweDIwMjksIDB4MjAyOSwKLSAgICAweDIwNTcsIDB4MjA1NywgMHgyMDQ1LCAweDIwNDUsIDB4MjA0MywgMHgyMDQzLCAweDIwMjEsIDB4MjAyMSwKLSAgICAweDAwMTksIDB4MDAzZCwgMHgwMDNiLCAweDAwMTEsIDB4MDA0ZiwgMHgwMDM1LCAweDAwMzMsIDB4MDAwOSwKLSAgICAweDIwMmIsIDB4MjAyYiwgMHgyMDJkLCAweDIwMmQsIDB4MjAyMywgMHgyMDIzLCAweDIwMjUsIDB4MjAyNSwKLSAgICAweDIwMWIsIDB4MjAxYiwgMHgyMDQ3LCAweDIwNDcsIDB4MjAxZCwgMHgyMDFkLCAweDIwMTMsIDB4MjAxMwotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfM1s4MF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMjgsIDB4MDAzMCwgMHgwMDM4LCAweDAwNDAsIDB4MDA0OCwgMHgwMDUwLCAweDAwNTgsCi0gICAgMHgwMDYwLCAweDAwNjgsIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MDA4OCwgMHgwMDkwLCAweDAwOTgsCi0gICAgMHgwMDA5LCAweDAwMGIsIDB4MDdmZiwgMHgwMDAxLCAweDAwMTEsIDB4MDAxMywgMHgwMDE1LCAweDA3ZmYsCi0gICAgMHgwMDE5LCAweDAwMWIsIDB4MDAxZCwgMHgwMDFmLCAweDAwMjEsIDB4MDAyMywgMHgwMDI1LCAweDAwMjcsCi0gICAgMHgwMDI5LCAweDAwMmIsIDB4MDAyZCwgMHgwMDJmLCAweDAwMzEsIDB4MDAzMywgMHgwMDM1LCAweDAwMzcsCi0gICAgMHgwMDM5LCAweDAwM2IsIDB4MDAzZCwgMHgwMDNmLCAweDAwNDEsIDB4MDA0MywgMHgwMDQ1LCAweDAwNDcsCi0gICAgMHgwMDQ5LCAweDAwNGIsIDB4MDA0ZCwgMHgwMDRmLCAweDAwNTEsIDB4MDA1MywgMHgwMDU1LCAweDAwNTcsCi0gICAgMHgwMDU5LCAweDAwNWIsIDB4MDA1ZCwgMHgwMDVmLCAweDAwNjEsIDB4MDA2MywgMHgwMDY1LCAweDAwNjcsCi0gICAgMHgwMDY5LCAweDAwNmIsIDB4MDA2ZCwgMHgwMDZmLCAweDAwNzEsIDB4MDA3MywgMHgwMDc1LCAweDAwNzcsCi0gICAgMHgwMDc5LCAweDAwN2IsIDB4MDA3ZCwgMHgwMDdmLCAweDAwODEsIDB4MDA4MywgMHgwMDg1LCAweDAwODcKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzRbMzJdID0gewotICAgIDB4MDAyMCwgMHgwMDM4LCAweDIwMTUsIDB4MjAxNSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLAotICAgIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLAotICAgIDB4MDAyOCwgMHgwMDMwLCAweDAwMjEsIDB4MDAxOSwgMHgyMDI3LCAweDIwMjcsIDB4MDAyNSwgMHgwMDIzLAotICAgIDB4MjAxZCwgMHgyMDFkLCAweDIwMWIsIDB4MjAxYiwgMHgwMDExLCAweDAwMWYsIDB4MDAxMywgMHgwMDA5Ci19OwotCi1jb25zdCBPTVhfVTE2ICogYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNbMThdID0gewotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzAsIC8qIG5DPTAgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18wLCAvKiBuQz0xICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMSwgLyogbkM9MiAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzEsIC8qIG5DPTMgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18yLCAvKiBuQz00ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMiwgLyogbkM9NSAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzIsIC8qIG5DPTYgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18yLCAvKiBuQz03ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9OCAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTkgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xMCAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTExICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTIgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xMyAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTE0ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTUgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xNiAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzQgIC8qIG5DPS0xICovCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzBbNDBdID0gewotICAgIDB4MDAyMCwgMHgwMDQ4LCAweDAwMDksIDB4MDAwNywgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLAotICAgIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLAotICAgIDB4MDAyOCwgMHgwMDQwLCAweDAwMTEsIDB4MDAwZiwgMHgwMDMwLCAweDAwMzgsIDB4MDAxOSwgMHgwMDE3LAotICAgIDB4MjdmZiwgMHgyN2ZmLCAweDIwMWYsIDB4MjAxZiwgMHgyMDFkLCAweDIwMWQsIDB4MjAxYiwgMHgyMDFiLAotICAgIDB4MjAxNSwgMHgyMDE1LCAweDIwMTMsIDB4MjAxMywgMHgyMDBkLCAweDIwMGQsIDB4MjAwYiwgMHgyMDBiCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzFbMjRdID0gewotICAgIDB4MDAyMCwgMHgwMDI4LCAweDAwMTEsIDB4MDAwZiwgMHgwMDBkLCAweDAwMGIsIDB4MjAwOSwgMHgyMDA5LAotICAgIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsIDB4MjAwMSwgMHgyMDAxLAotICAgIDB4MDAxZCwgMHgwMDFiLCAweDAwMTksIDB4MDAxNywgMHgyMDE1LCAweDIwMTUsIDB4MjAxMywgMHgyMDEzCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzJbMjRdID0gewotICAgIDB4MDAyMCwgMHgwMDI4LCAweDAwMTEsIDB4MDAwYiwgMHgwMDA5LCAweDAwMDEsIDB4MjAwZiwgMHgyMDBmLAotICAgIDB4MjAwZCwgMHgyMDBkLCAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLAotICAgIDB4MDAxYiwgMHgwMDE3LCAweDIwMTksIDB4MjAxOSwgMHgyMDE1LCAweDIwMTUsIDB4MjAxMywgMHgyMDEzCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzNbMjRdID0gewotICAgIDB4MDAyMCwgMHgwMDI4LCAweDAwMTMsIDB4MDAwZiwgMHgwMDA3LCAweDAwMDUsIDB4MjAxMSwgMHgyMDExLAotICAgIDB4MjAwZCwgMHgyMDBkLCAweDIwMGIsIDB4MjAwYiwgMHgyMDA5LCAweDIwMDksIDB4MjAwMywgMHgyMDAzLAotICAgIDB4MjAxOSwgMHgyMDE5LCAweDIwMTcsIDB4MjAxNywgMHgyMDE1LCAweDIwMTUsIDB4MjAwMSwgMHgyMDAxCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzRbMjBdID0gewotICAgIDB4MDAyMCwgMHgwMDE1LCAweDAwMTEsIDB4MDAwNSwgMHgwMDAzLCAweDAwMDEsIDB4MjAwZiwgMHgyMDBmLAotICAgIDB4MjAwZCwgMHgyMDBkLCAweDIwMGIsIDB4MjAwYiwgMHgyMDA5LCAweDIwMDksIDB4MjAwNywgMHgyMDA3LAotICAgIDB4MjAxNywgMHgyMDE3LCAweDIwMTMsIDB4MjAxMwotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc181WzIwXSA9IHsKLSAgICAweDAwMjAsIDB4MDAxMSwgMHgyMDEzLCAweDIwMTMsIDB4MjAwZiwgMHgyMDBmLCAweDIwMGQsIDB4MjAwZCwKLSAgICAweDIwMGIsIDB4MjAwYiwgMHgyMDA5LCAweDIwMDksIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwKLSAgICAweDAwMTUsIDB4MDAwMSwgMHgyMDAzLCAweDIwMDMKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNlsyMF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMGYsIDB4MjAxMSwgMHgyMDExLCAweDIwMGQsIDB4MjAwZCwgMHgyMDA5LCAweDIwMDksCi0gICAgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsCi0gICAgMHgwMDEzLCAweDAwMDEsIDB4MjAwMywgMHgyMDAzCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzdbMjBdID0gewotICAgIDB4MDAyMCwgMHgwMDAzLCAweDIwMGYsIDB4MjAwZiwgMHgyMDBkLCAweDIwMGQsIDB4MjAwNywgMHgyMDA3LAotICAgIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LAotICAgIDB4MDAxMSwgMHgwMDAxLCAweDIwMDUsIDB4MjAwNQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc184WzIwXSA9IHsKLSAgICAweDAwMjAsIDB4MDAwNSwgMHgyMDBiLCAweDIwMGIsIDB4NDAwZCwgMHg0MDBkLCAweDQwMGQsIDB4NDAwZCwKLSAgICAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywKLSAgICAweDAwMDMsIDB4MDAwMSwgMHgyMDBmLCAweDIwMGYKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfOVsyMF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMGQsIDB4MjAwNSwgMHgyMDA1LCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsCi0gICAgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsCi0gICAgMHgyMDAzLCAweDIwMDMsIDB4MjAwMSwgMHgyMDAxCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEwWzE2XSA9IHsKLSAgICAweDAwMDEsIDB4MDAwMywgMHgyMDA1LCAweDIwMDUsIDB4MjAwNywgMHgyMDA3LCAweDIwMGIsIDB4MjAwYiwKLSAgICAweDYwMDksIDB4NjAwOSwgMHg2MDA5LCAweDYwMDksIDB4NjAwOSwgMHg2MDA5LCAweDYwMDksIDB4NjAwOQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMVsxNl0gPSB7Ci0gICAgMHgwMDAxLCAweDAwMDMsIDB4MjAwOSwgMHgyMDA5LCAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsCi0gICAgMHg2MDA3LCAweDYwMDcsIDB4NjAwNywgMHg2MDA3LCAweDYwMDcsIDB4NjAwNywgMHg2MDA3LCAweDYwMDcKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTJbMTZdID0gewotICAgIDB4MjAwMSwgMHgyMDAxLCAweDIwMDMsIDB4MjAwMywgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LAotICAgIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1Ci19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEzWzE2XSA9IHsKLSAgICAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywKLSAgICAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xNFsxNl0gPSB7Ci0gICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsCi0gICAgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMKLX07Ci0KLWNvbnN0IE9NWF9VMTYgKiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzWzE1XSA9IHsKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzAsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xLAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMiwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzMsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc180LAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNSwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzYsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc183LAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfOCwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzksCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMCwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzExLAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTIsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMywKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzE0Ci19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18wWzE2XSA9IHsKLSAgICAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywKLSAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMVsxNl0gPSB7Ci0gICAgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsCi0gICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzJbMTZdID0gewotICAgIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLAotICAgIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxCi19OwotCi1jb25zdCBPTVhfVTE2ICogYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNbM10gPSB7Ci0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMCwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18xLAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzIKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMFs4XSA9IHsKLSAgICAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18xWzhdID0gewotICAgIDB4MjAwNSwgMHgyMDA1LCAweDIwMDMsIDB4MjAwMywgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzJbOF0gPSB7Ci0gICAgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfM1s4XSA9IHsKLSAgICAweDAwMDksIDB4MDAwNywgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLCAweDIwMDEsIDB4MjAwMQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc180WzhdID0gewotICAgIDB4MDAwYiwgMHgwMDA5LCAweDAwMDcsIDB4MDAwNSwgMHgyMDAzLCAweDIwMDMsIDB4MjAwMSwgMHgyMDAxCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzVbOF0gPSB7Ci0gICAgMHgwMDAzLCAweDAwMDUsIDB4MDAwOSwgMHgwMDA3LCAweDAwMGQsIDB4MDAwYiwgMHgyMDAxLCAweDIwMDEKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNlsyNF0gPSB7Ci0gICAgMHgwMDEwLCAweDAwMGQsIDB4MDAwYiwgMHgwMDA5LCAweDAwMDcsIDB4MDAwNSwgMHgwMDAzLCAweDAwMDEsCi0gICAgMHgwMDE4LCAweDAwMTEsIDB4MjAwZiwgMHgyMDBmLCAweDAwMjAsIDB4MDAxNSwgMHgyMDEzLCAweDIwMTMsCi0gICAgMHgwMDI4LCAweDAwMTksIDB4MjAxNywgMHgyMDE3LCAweDA3ZmYsIDB4MDAxZCwgMHgyMDFiLCAweDIwMWIKLX07Ci0KLS8qIFRhYmxlcyA3IHRvIDE0IGFyZSBkdXBsaWNhdGVzIG9mIHRhYmxlIDYgKi8KLQotY29uc3QgT01YX1UxNiAqIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNbMTVdID0gewotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMCwgIC8qIFplcm9zTGVmdD0xICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18xLAotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMiwKLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzMsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc180LAotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNSwgIC8qIFplcm9zTGVmdD02ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTcgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9OCAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD05ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTEwICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTExICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTEyICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTEzICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTE0ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182ICAgLyogWmVyb3NMZWZ0PTE1ICovCi19OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZGNiOTIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotCi0KLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDg1MjMzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzgwICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLQotCi0gICAgSUYgIEFSTTExMzZKUwotCi1NQVNLXzEgIEVRVSAweDAxMDEwMTAxCi0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotCi1wUTAgICAgICAgIFJOIDAKLVN0ZXBBcmcgICAgUk4gMQotdEMwQXJnICAgICBSTiAyCi1hbHBoYSAgICAgIFJOIDYKLQotYmV0YSAgICAgICBSTiAxNAotYlMgICAgICAgICBSTiAxNAotdEMwICAgICAgICBSTiAxNAotcHRDMCAgICAgICBSTiAxCi0KLTsvLyBEZWNsYXJlIExvY2FsL1RlbXBvcmFyeSB2YXJpYWJsZXMKLQotOy8vIFBpeGVscwotcF8wICAgICBSTiAzIAotcF8xICAgICBSTiA1ICAKLXBfMiAgICAgUk4gNCAgCi1wXzMgICAgIFJOIDIgIAotcV8wICAgICBSTiA4ICAKLXFfMSAgICAgUk4gOSAgCi1xXzIgICAgIFJOIDEwIAotcV8zICAgICBSTiAxMiAKLQotCi07Ly8gRmlsdGVyaW5nCi0KLWFwMHEwICAgUk4gMSAgCi1maWx0ICAgIFJOIDIKLSAgICAgICAgCi1tMDAgICAgIFJOIDcKLW0wMSAgICAgUk4gMTEKLQotYXBmbGcgICBSTiAwIAotYXFmbGcgICBSTiA2Ci0KLXRDICAgICAgUk4gMQotCi0KLTsvL0RlY2xhcmF0aW9ucyBmb3IgYlNMVDQga2VybmVsCi0KLXBvcyAgICAgUk4gNwotbmVnICAgICBSTiAxMgotCi1QMGEgICAgIFJOIDEgICAKLVAxYSAgICAgUk4gOCAgIAotUTBhICAgICBSTiA3ICAKLVExYSAgICAgUk4gNCAgIAotCi11MSAgICAgIFJOIDMgICAKLW1heCAgICAgUk4gMTIKLW1pbiAgICAgUk4gMiAgIAotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi07Ly9EZWNsYXJhdGlvbnMgZm9yIGJTR0U0IGtlcm5lbAotCi1xXzNiICAgIFJOIDkgICAKLXBfM2IgICAgUk4gMAotYXBxZmxnICBSTiAxMgotCi1QMGIgICAgIFJOIDYKLVAxYiAgICAgUk4gNyAKLVAyYiAgICAgUk4gMQotCi1RMGIgICAgIFJOIDkgCi1RMWIgICAgIFJOIDAgCi1RMmIgICAgIFJOIDIKLQotOy8vIE1pc2NlbGxhbm91cwotCi1hICAgICAgIFJOIDAKLXQwICAgICAgUk4gMyAKLXQxICAgICAgUk4gMTIKLXQyICAgICAgUk4gNwotdDMgICAgICBSTiAxMQotdDQgICAgICBSTiA0ICAgCi10NSAgICAgIFJOIDEgICAKLXQ4ICAgICAgUk4gNiAgIAotdDkgICAgICBSTiAxNCAgCi10MTAgICAgIFJOIDUgICAKLXQxMSAgICAgUk4gOSAgIAotCi07Ly8gUmVnaXN0ZXIgdXNhZ2UgZm9yIC0gYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZSgpCi07Ly8KLTsvLyBJbnB1dHMgLSAzLDQsNSw4LDksMTAgLSBJbnB1dCBQaXhlbHMgKHAwLXAyLHEwLXEyKQotOy8vICAgICAgICAtIDIgLSBmaWx0LCAwIC0gYXBmbGcsIDYgLSBhcWZsZwotOy8vICAgICAgICAtIDExIC0gbTAxLCA3IC0gdEMwCi07Ly8gICAgICAgICAKLTsvLyBPdXRwdXRzIC0gMSw4LDcsMTEgLSBPdXRwdXQgUGl4ZWxzKFAwYSxQMWEsUTBhLFExYSkKLTsvLwotOy8vIFJlZ2lzdGVycyBDb3JydXB0ZWQgLSAwLTMsNS0xMiwxNAotCi0KLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlLCBscgotCi0gICAgICAgIDsvLyBTaW5jZSBiZXRhIDw9IDE4IGFuZCBhbHBoYSA8PSAyNTUgd2Uga25vdwotICAgICAgICA7Ly8gLTI1NCA8PSBwMC1xMCA8PSAyNTQKLSAgICAgICAgOy8vICAtMTcgPD0gcTEtcTAgPD0gMTcKLSAgICAgICAgOy8vICAtMTcgPD0gcDEtcDAgPD0gMTcKLQotICAgICAgICA7Ly8gZGVsdGEgPSBDbGlwMyggLXRDLCB0QywgKCgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCk+PjMpKQotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyAgICBDYWxjdWxhdGUgQSA9ICgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCk+PjMKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgID0gKDQqcTAgLSA0KnAwICsgcDEgLSBxMSArIDQpPj4zCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICA9ICgocDEtcDApIC0gKHExLXEwKSAtIDMqKHAwLXEwKSArIDQpPj4zCi0gICAgICAgIAotICAgICAgICBVU1VCOCAgIHQxLCBwXzEsIHBfMAotICAgICAgICBNVUwgICAgIHRDMCwgdDIsIG0wMQotICAgICAgICAKLSAgICAgICAgVVNVQjggICB0MiwgcV8xLCBxXzAKLSAgICAgICAgU1NVQjggICB0MSwgdDEsIHQyCi0KLSAgICAgICAgVVNVQjggICB0MiwgcF8wLCBxXzAKLSAgICAgICAgQU5EICAgICB0MiwgdDIsIG0wMQotICAgICAgICBTSFNVQjggIHQxLCB0MSwgdDIKLSAgICAgICAgVUhTVUI4ICB0NSwgcF8wLCBxXzAKLSAgICAgICAgU1NVQjggICB0MSwgdDEsIHQyCi0gICAgICAgIFNIU1VCOCAgdDEsIHQxLCB0NQotICAgICAgICBNT1YgICAgIG0wMCwgIzAKLSAgICAgICAgU0FERDggICB0MSwgdDEsIG0wMQotICAgICAgICBTSFNVQjggIHQxLCB0MSwgdDUKLSAgICAgICAgCi0gICAgICAgIDsvLyB0QyA9IHRDMAotICAgICAgICA7Ly8gaWYgKGFwIDwgYmV0YSkgdEMrKzsKLSAgICAgICAgOy8vIGlmIChhcSA8IGJldGEpIHRDKys7Ci0gICAgICAgIFVTVUI4ICAgdDUsIGZpbHQsIG0wMSAgIAotICAgICAgICBTRUwgICAgIHRDMCwgdEMwLCBtMDAKLSAgICAgICAgVVFBREQ4ICB0QywgdEMwLCBhcGZsZwotICAgICAgICBTU1VCOCAgIHQxLCB0MSwgbTAwCi0gICAgICAgIFVRQUREOCAgdEMsIHRDLCBhcWZsZwotCi0gICAgICAgIDsvLyBTcGxpdCBpbnRvIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBwYXJ0IGFuZCBjbGlwIAotICAgICAgICBTRUwgICAgIHBvcywgdDEsIG0wMAotICAgICAgICBVU1VCOCAgIG5lZywgcG9zLCB0MQotICAgICAgICBVU1VCOCAgIHQzLCBwb3MsIHRDCi0gICAgICAgIFNFTCAgICAgcG9zLCB0QywgcG9zCi0gICAgICAgIFVTVUI4ICAgdDMsIG5lZywgdEMKLSAgICAgICAgU0VMICAgICBuZWcsIHRDLCBuZWcKLSAgICAgICAgCi0gICAgICAgIDsvL1JlbG9hZCBtMDEKLSAgICAgICAgTERSICAgICBtMDEsPU1BU0tfMQotCi0gICAgICAgIFVRQUREOCAgUDBhLCBwXzAsIHBvcwotICAgICAgICBVUVNVQjggIFEwYSwgcV8wLCBwb3MKLSAgICAgICAgVVFTVUI4ICBQMGEsIFAwYSwgbmVnCi0gICAgICAgIFVRQUREOCAgUTBhLCBRMGEsIG5lZwotICAgICAgICAKLSAgICAgICAgOy8vIENob29zZSB0byBzdG9yZSB0aGUgZmlsdGVyZWQKLSAgICAgICAgOy8vIHZhbHVlIG9yIHRoZSBvcmlnaW5hbCBwaXhlbAotICAgICAgICBVU1VCOCAgIHQxLCBmaWx0LCBtMDEgICAgCi0gICAgICAgIFNFTCAgICAgUDBhLCBQMGEsIHBfMAotICAgICAgICBTRUwgICAgIFEwYSwgUTBhLCBxXzAKLSAgICAKLSAgICAgICAgOy8vIGRlbHRhID0gKHAyICsgKChwMCtxMCsxKT4+MSkgLSAocDE8PDEpKT4+MTsKLSAgICAgICAgOy8vIHUxID0gKHAwICsgcTAgKyAxKT4+MQotICAgICAgICA7Ly8gdTEgPSAoIChxXzAgLSBwXzAnKT4+MSApIF4gMHg4MAotICAgICAgICBNVk4gICAgIHBfMCwgcF8wCi0gICAgICAgIFVIU1VCOCAgdTEsIHFfMCwgcF8wIAotICAgICAgICBVUUFERDggIG1heCwgcF8xLCB0QzAKLSAgICAgICAgRU9SICAgICB1MSwgdTEsIG0wMSAsTFNMICM3Ci0gICAgCi0gICAgICAgIDsvLyBDYWxjdWxhdGUgQSA9IChwMit1MSk+PjEgCi0gICAgICAgIDsvLyBUaGVuIGRlbHRhID0gQ2xpcDMoIC10QzAsIHRDMCwgQSAtIHAxKQotCi0gICAgICAgIDsvLyBDbGlwIFAxCi0gICAgICAgIFVIQUREOCAgUDFhLCBwXzIsIHUxCi0gICAgICAgIFVRU1VCOCAgbWluLCBwXzEsIHRDMAotICAgICAgICBVU1VCOCAgIHQ0LCBQMWEsIG1heAotICAgICAgICBTRUwgICAgIFAxYSwgbWF4LCBQMWEKLSAgICAgICAgVVNVQjggICB0NCwgUDFhLCBtaW4KLSAgICAgICAgU0VMICAgICBQMWEsIFAxYSwgbWluCi0KLSAgICAgICAgOy8vIENsaXAgUTEKLSAgICAgICAgVUhBREQ4ICBRMWEsIHFfMiwgdTEKLSAgICAgICAgVVFBREQ4ICBtYXgsIHFfMSwgdEMwCi0gICAgICAgIFVRU1VCOCAgbWluLCBxXzEsIHRDMAotICAgICAgICBVU1VCOCAgIHQwLCBRMWEsIG1heAotICAgICAgICBTRUwgICAgIFExYSwgbWF4LCBRMWEKLSAgICAgICAgVVNVQjggICB0MCwgUTFhLCBtaW4KLSAgICAgICAgU0VMICAgICBRMWEsIFExYSwgbWluCi0gICAgICAgIAotICAgICAgICA7Ly8gQ2hvb3NlIHRvIHN0b3JlIHRoZSBmaWx0ZXJlZAotICAgICAgICA7Ly8gdmFsdWUgb3IgdGhlIG9yaWdpbmFsIHBpeGVsCi0gICAgICAgIFVTVUI4ICAgdDAsIGFwZmxnLCBtMDEKLSAgICAgICAgU0VMICAgICBQMWEsIFAxYSwgcF8xCi0gICAgICAgIFVTVUI4ICAgdDAsIGFxZmxnLCBtMDEKLSAgICAgICAgU0VMICAgICB0MywgUTFhLCBxXzEKLSAgICAgICAgCi0gICAgICAgIE1fRU5ECi0KLTsvLyBSZWdpc3RlciB1c2FnZSBmb3IgLSBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlKCkKLTsvLwotOy8vIElucHV0cyAtIDMsNCw1LDgsOSwxMCAtIElucHV0IFBpeGVscyAocDAtcDIscTAtcTIpCi07Ly8gICAgICAgIC0gMiAtIGZpbHQsIDAgLSBhcGZsZyxhcWZsZwotOy8vICAgICAgICAtIDEgLSBhcDBxMCwgNiAtIGFscGhhCi07Ly8gICAgICAgIC0gNyAtIG0wMCwgMTEgLSBtMDEKLTsvLyAgICAgICAgIAotOy8vIE91dHB1dHMgLSA2LDcsMSw5LDAsMiAtIE91dHB1dCBQaXhlbHMoUDBiLFAxYixQMmIsIFEwYixRMWIsUTJiKQotOy8vIAotOy8vIFJlZ2lzdGVycyBDb3JydXB0ZWQgLSAwLTMsNS0xMiwxNAotCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZSwgbHIKLSAgICAKLSAgICAgICAgOy8vIGFwZmxnID0gYXBmbGcgJiYgfHAwLXEwfDwoKGFscGhhPj4yKSsyKSAKLSAgICAgICAgOy8vIGFwZmxnID0gYXFmbGcgJiYgfHAwLXEwfDwoKGFscGhhPj4yKSsyKSAKLQotICAgICAgICBNX0FSRyAgIHBEdW1teSw0Ci0gICAgICAgIE1fQVJHICAgcFFfMyw0Ci0gICAgICAgIE1fQVJHICAgcFBfMyw0Ci0gICAgICAgIAotICAgICAgICBVSEFERDggIGFscGhhLCBhbHBoYSwgbTAwCi0gICAgICAgIFVTVUI4ICAgdDksIHBfMiwgcF8wICAgIDsvL3Q5ID0gZHAycDAKLSAgICAgICAgVUhBREQ4ICBhbHBoYSwgYWxwaGEsIG0wMAotICAgICAgICBBREQgICAgIGFscGhhLCBhbHBoYSwgbTAxLCBMU0wgIzEgICAgICAgIAotICAgICAgICBVU1VCOCAgIGFwMHEwLCBhcDBxMCwgYWxwaGEKLSAgICAgICAgU0VMICAgICBhcHFmbGcsIG0wMCwgYXBmbGcKLQotICAgICAgICA7Ly8gUDAgPSAocDIgKyAyKnAxICsgMipwMCArIDIqcTAgKyBxMSArIDQpPj4zIAotICAgICAgICA7Ly8gICAgPSAoKHAyLXAwKSArIDIqKHAxLXAwKSArIChxMS1xMCkgKyAzKihxMC1wMCkgKyA4KnAwICsgNCk+PjMKLSAgICAgICAgOy8vICAgID0gcDAgKyAoKChwMi1wMCkgKyAyKihwMS1wMCkgKyAocTEtcTApIC0gMyoocDAtcTApICsgNCk+PjMpCi0KLSAgICAgICAgOy8vIFAxID0gKHAyICsgcDEgKyBxMCArIHAwICsgMik+PjIKLSAgICAgICAgOy8vICAgID0gcDAgKyAoKChwMi1wMCkgKyAocDEtcDApIC0gKHAwLXEwKSArIDIpPj4yKQotICAgICAgICAKLSAgICAgICAgOy8vIFAyID0gKDIqcDMgKyAzKnAyICsgcDEgKyBwMCArIHEwICsgNCk+PjMKLSAgICAgICAgOy8vICAgID0gKDIqKHAzLXAwKSArIDMqKHAyLXAwKSArIChwMS1wMCkgLSAocDAtcTApICsgOCpwMCArIDQpPj4zCi0gICAgICAgIDsvLyAgICA9IHAwICsgKCgocDMtcDApICsgKHAyLXAwKSArIHQyICsgMik+PjIpCi0KLSAgICAgICAgOy8vIENvbXB1dGUgUDBiCi0gICAgICAgIFVTVUI4ICAgdDIsIHBfMCwgcV8wICAgICAgICAgCi0gICAgICAgIFNTVUI4ICAgdDUsIHQ5LCB0MiAgICAgICAgICAgCi0KLSAgICAgICAgVVNVQjggICB0OCwgcV8xLCBxXzAgICAgICAgICAKLSAgICAgICAgU0hBREQ4ICB0OCwgdDUsIHQ4Ci0KLSAgICAgICAgVVNVQjggICB0OSwgcF8xLCBwXzAgICAgICAgICAKLSAgICAgICAgU0FERDggICB0OCwgdDgsIHQ5Ci0gICAgICAgIFNIU1VCOCAgdDgsIHQ4LCB0MgotICAgICAgICBTSEFERDggIHQ1LCB0NSwgdDkKLSAgICAgICAgU0hBREQ4ICB0OCwgdDgsIG0wMQotICAgICAgICBTSEFERDggIHQ5LCB0NSwgbTAxCi0gICAgICAgIFNBREQ4ICAgUDBiLCBwXzAsIHQ4ICAgICAgICAgCi0gICAgICAgIDsvLyBQMGIgcmVhZHkKLSAgICAgICAgCi0gICAgICAgIDsvLyBDb21wdXRlIFAxYgotICAgICAgICBNX0xEUiAgIHBfM2IsIHBQXzMKLSAgICAgICAgU0FERDggICBQMWIsIHBfMCwgdDkgICAgICAgICAKLSAgICAgICAgOy8vIFAxYiByZWFkeQotICAgICAgICAKLSAgICAgICAgOy8vIENvbXB1dGUgUDJiCi0gICAgICAgIFVTVUI4ICAgdDksIHBfMiwgcF8wICAgICAgICAgCi0gICAgICAgIFNBREQ4ICAgdDUsIHQ1LCB0OQotICAgICAgICBVSFNVQjggIHQ5LCBwXzNiLCBwXzAgICAgICAgIAotICAgICAgICBFT1IgICAgIGEsIHBfM2IsIHBfMCAgICAgICAgIAotICAgICAgICBBTkQgICAgIGEsIGEsIG0wMQotICAgICAgICBTSEFERDggIHQ1LCB0NSwgYQotICAgICAgICBVSEFERDggIGEsIHBfMCwgcV8xCi0gICAgICAgIFNBREQ4ICAgdDUsIHQ1LCBtMDEKLSAgICAgICAgU0hBREQ4ICB0NSwgdDUsIHQ5Ci0gICAgICAgIE1WTiAgICAgdDksIHBfMQotICAgICAgICBTQUREOCAgIFAyYiwgcF8wLCB0NSAgICAgICAgIAotICAgICAgICA7Ly8gUDJiIHJlYWR5Ci0gICAgICAgIAotICAgICAgICBVSFNVQjggIGEsIGEsIHQ5Ci0gICAgICAgIE9SUiAgICAgdDksIGFwcWZsZywgbTAxCi0gICAgICAgIFVTVUI4ICAgdDksIGFwcWZsZywgdDkKLQotICAgICAgICBFT1IgICAgIGEsIGEsIG0wMSwgTFNMICM3Ci0gICAgICAgIFNFTCAgICAgUDBiLCBQMGIsIGEKLSAgICAgICAgU0VMICAgICBQMWIsIFAxYiwgcF8xCi0gICAgICAgIFNFTCAgICAgUDJiLCBQMmIsIHBfMgotCi0gICAgICAgIFVTVUI4ICAgdDQsIGZpbHQsIG0wMQotICAgICAgICBTRUwgICAgIFAwYiwgUDBiLCBwXzAKLQotICAgICAgICAKLSAgICAgICAgOy8vIFEwID0gKHEyICsgMipxMSArIDIqcTAgKyAyKnAwICsgcDEgKyA0KT4+MyAKLSAgICAgICAgOy8vICAgID0gKChxMi1xMCkgKyAyKihxMS1xMCkgKyAocDEtcDApICsgMyoocDAtcTApICsgOCpxMCArIDQpPj4zCi0gICAgICAgIDsvLyAgICA9IHEwICsgKCgocTItcTApICsgMioocTEtcTApICsgKHAxLXAwKSArIDMqKHAwLXEwKSArIDQpPj4zKQotCi0gICAgICAgIDsvLyBRMSA9IChxMiArIHExICsgcDAgKyBxMCArIDIpPj4yCi0gICAgICAgIDsvLyAgICA9IHEwICsgKCgocTItcTApICsgKHExLXEwKSArIChwMC1xMCkgKyAyKT4+MikKLQotICAgICAgICA7Ly8gUTIgPSAoMipxMyArIDMqcTIgKyBxMSArIHEwICsgcDAgKyA0KT4+MwotICAgICAgICA7Ly8gICAgPSAoMioocTMtcTApICsgMyoocTItcTApICsgKHExLXEwKSArIChwMC1xMCkgKyA4KnEwICsgNCk+PjMKLSAgICAgICAgOy8vICAgID0gcTAgKyAoKChxMy1xMCkgKyAocTItcTApICsgdDIgKyAyKT4+MikKLQotCi0gICAgICAgIDsvLyBDb21wdXRlIFEwYiBRMWIKLSAgICAgICAgVVNVQjggICB0NCwgcV8yLCBxXzAgICAgICAgICAgIAotICAgICAgICBVU1VCOCAgIGEsIHBfMCwgcV8wCi0gICAgICAgIFVTVUI4ICAgdDksIHBfMSwgcF8wCi0gICAgICAgIFNBREQ4ICAgdDAsIHQ0LCBhCi0gICAgICAgIFNIQUREOCAgdDksIHQwLCB0OQotICAgICAgICBVSEFERDggIHQxMCwgcV8wLCBwXzEKLSAgICAgICAgU0FERDggICB0OSwgdDksIGEKLSAgICAgICAgVVNVQjggICBhLCBxXzEsIHFfMAotICAgICAgICBTSEFERDggIHQ5LCB0OSwgYQotICAgICAgICBTSEFERDggIHQwLCB0MCwgYQotICAgICAgICBTSEFERDggIHQ5LCB0OSwgbTAxCi0gICAgICAgIFNIQUREOCAgYSwgdDAsIG0wMQotICAgICAgICBTQUREOCAgIHQ5LCBxXzAsIHQ5ICAgICAgICAgICAgCi0gICAgICAgIDsvLyBRMGIgcmVhZHkgLSB0OQotICAgICAgICAKLSAgICAgICAgTU9WICAgICB0NCwgIzAKLSAgICAgICAgVUhBREQ4ICBhcHFmbGcsIGFwcWZsZywgdDQKLSAgICAgICAgCi0gICAgICAgIFNBREQ4ICAgUTFiLCBxXzAsIGEgCi0gICAgICAgIDsvLyBRMWIgcmVhZHkKLSAgICAgICAKLSAgICAgICAgVVNVQjggICB0NCwgYXBxZmxnLCBtMDEKLSAgICAgICAgU0VMICAgICBRMWIsIFExYiwgcV8xCi0gICAgICAgIE1WTiAgICAgdDExLCBxXzEKLSAgICAgICAgVUhTVUI4ICB0MTAsIHQxMCwgdDExCi0gICAgICAgIE1fTERSICAgcV8zYiwgcFFfMwotICAgICAgICBFT1IgICAgIHQxMCwgdDEwLCBtMDEsIExTTCAjNwotICAgICAgICBTRUwgICAgIHQ5LCB0OSwgdDEwICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gQ29tcHV0ZSBRMmIKLSAgICAgICAgVVNVQjggICB0NCwgcV8yLCBxXzAKLSAgICAgICAgU0FERDggICB0NCwgdDAsIHQ0Ci0gICAgICAgIEVPUiAgICAgdDAsIHFfM2IsIHFfMCAKLSAgICAgICAgQU5EICAgICB0MCwgdDAsIG0wMQotICAgICAgICBTSEFERDggIHQ0LCB0NCwgdDAKLSAgICAgICAgVUhTVUI4ICB0MTAsIHFfM2IsIHFfMAotICAgICAgICBTQUREOCAgIHQ0LCB0NCwgbTAxCi0gICAgICAgIFNIQUREOCAgdDQsIHQ0LCB0MTAKLQotICAgICAgICBVU1VCOCAgIHQxMCwgZmlsdCwgbTAxCi0gICAgICAgIFNFTCAgICAgUTBiLCB0OSwgcV8wCi0KLSAgICAgICAgU0FERDggICB0NCwgcV8wLCB0NCAgICAgICAgICAgIAotICAgICAgICA7Ly8gUTJiIHJlYWR5IC0gdDQKLQotICAgICAgICBVU1VCOCAgIHQxMCwgYXBxZmxnLCBtMDEKLSAgICAgICAgU0VMICAgICBRMmIsIHQ0LCBxXzIKLQotICAgICAgICBNX0VORAotICAgIAotICAgIEVORElGCi0KLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzYzOGJmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKLSAgICAgICAgCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlcwotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlcwotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXMKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXMKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfU3VmZml4VG9MZXZlbAotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9aaWdaYWdfNHg0Ci0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1ppZ1phZ18yeDIKLSAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0gICAgICAgIAotOy8vREVCVUdfT04gICAgU0VUTCB7VFJVRX0KLSAgICAgICAgCi1MQVNUX0NPRUZGICAgICAgICAgICAgICAgRVFVIDB4MjAgICAgICAgIDsvLyBFbmQgb2YgYmxvY2sgZmxhZwotVFdPX0JZVEVfQ09FRkYgICAgICAgICAgIEVRVSAweDEwCi0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotCi1wcEJpdFN0cmVhbSAgICAgUk4gMAotcE9mZnNldCAgICAgICAgIFJOIDEKLXBOdW1Db2VmZiAgICAgICBSTiAyCi1wcFBvc0NvZWZidWYgICAgUk4gMwotbkMgICAgICAgICAgICAgIFJOIDQgOy8vIG51bWJlciBvZiBjb2VmZnMgb3IgMTcgZm9yIGNocm9tYQotc01heE51bUNvZWZmICAgIFJOIDUKLQotOy8vIERlY2xhcmUgaW5uZXIgbG9vcCByZWdpc3RlcnMKLQotOy8vIExldmVsIGxvb3AKLUNvdW50ICAgICAgICAgICBSTiAwCi1UcmFpbGluZ09uZXMgICAgUk4gMQotcExldmVsICAgICAgICAgIFJOIDIKLUxldmVsU3VmZml4ICAgICBSTiAzCi1TdWZmaXhMZW5ndGggICAgUk4gNAotVG90YWxDb2VmZiAgICAgIFJOIDUKLQotcFZMRFRhYmxlICAgICAgIFJOIDYKLVN5bWJvbCAgICAgICAgICBSTiA3Ci1UMSAgICAgICAgICAgICAgUk4gOAotVDIgICAgICAgICAgICAgIFJOIDkKLVJCaXRTdHJlYW0gICAgICBSTiAxMAotUkJpdEJ1ZmZlciAgICAgIFJOIDExCi1SQml0Q291bnQgICAgICAgUk4gMTIKLWxyICAgICAgICAgICAgICBSTiAxNAotCi07Ly8gUnVuIGxvb3AKLUNvdW50ICAgICAgICAgICBSTiAwCi1aZXJvc0xlZnQgICAgICAgUk4gMQotcExldmVsICAgICAgICAgIFJOIDIKLXBwUnVuVGFibGUgICAgICBSTiAzCi1wUnVuICAgICAgICAgICAgUk4gNAotVG90YWxDb2VmZiAgICAgIFJOIDUKLQotcFZMRFRhYmxlICAgICAgIFJOIDYKLVN5bWJvbCAgICAgICAgICBSTiA3Ci1UMSAgICAgICAgICAgICAgUk4gOAotVDIgICAgICAgICAgICAgIFJOIDkKLVJCaXRTdHJlYW0gICAgICBSTiAxMAotUkJpdEJ1ZmZlciAgICAgIFJOIDExCi1SQml0Q291bnQgICAgICAgUk4gMTIKLWxyICAgICAgICAgICAgICBSTiAxNAotCi07Ly8gRmlsbCBpbiBjb2VmZmljaWVudHMgbG9vcAotcFBvc0NvZWZidWYgICAgIFJOIDAKLXRlbXAgICAgICAgICAgICBSTiAxCi1wTGV2ZWwgICAgICAgICAgUk4gMgotcHBQb3NDb2VmYnVmICAgIFJOIDMKLXBSdW4gICAgICAgICAgICBSTiA0Ci1Ub3RhbENvZWZmICAgICAgUk4gNQotcFppZ1phZyAgICAgICAgIFJOIDYKLQotVDEgICAgICAgICAgICAgIFJOIDgKLVQyICAgICAgICAgICAgICBSTiA5Ci1SQml0U3RyZWFtICAgICAgUk4gMTAKLVJCaXRCdWZmZXIgICAgICBSTiAxMQotUkJpdENvdW50ICAgICAgIFJOIDEyCi1Db2VmZk51bSAgICAgICAgUk4gMTQKLQotCi0KLSAgICBJRiBBUk0xMTM2SlMKLSAgICAgICAgCi0gICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCi0gICAgICAgIE1fQUxMT0M0IHBwcEJpdFN0cmVhbSwgNAotICAgICAgICBNX0FMTE9DNCBwcE9mZnNldCwgNAotICAgICAgICBNX0FMTE9DNCBwcHBQb3NDb2VmYnVmLCA0Ci0gICAgICAgIE1fQUxMT0M0IHBwTGV2ZWwsIDE2KjIKLSAgICAgICAgTV9BTExPQzQgcHBSdW4sIDE2Ci0gICAgICAgIAotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIsIHIxMQotICAgICAgICAKLSAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKLSAgICAgICAgTV9BUkcgICBwTkMsIDQKLSAgICAgICAgTV9BUkcgICBwU01heE51bUNvZWZmLDQKLSAgICAgICAgCi0gICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAgICAKLSAgICAgICAgTV9CRF9JTklUMCBwcEJpdFN0cmVhbSwgcE9mZnNldCwgUkJpdFN0cmVhbSwgUkJpdEJ1ZmZlciwgUkJpdENvdW50Ci0gICAgICAgIExEUiAgICAgICAgcFZMRFRhYmxlLCA9YXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXMKLSAgICAgICAgTV9MRFIgICAgICBuQywgcE5DCi0gICAgICAgIAotICAgICAgICBNX0JEX0lOSVQxIFQxLCBUMiwgbHIKLSAgICAgICAgTERSICAgICBwVkxEVGFibGUsIFtwVkxEVGFibGUsIG5DLCBMU0wgIzJdICA7Ly8gRmluZCBWTEQgdGFibGUgICAgCi0gICAgICAgIAotICAgICAgICBNX0JEX0lOSVQyIFQxLCBUMiwgbHIKLQotICAgICAgICA7Ly8gRGVjb2RlIFN5bWJvbCA9IFRvdGFsQ29lZmYqNCArIFRyYWlsaW5nT25lcwotICAgICAgICBNX0JEX1ZMRCAgU3ltYm9sLCBUMSwgVDIsIHBWTERUYWJsZSwgNCwgMgotICAgIAotICAgICAgICBNT1ZTICAgIFRvdGFsQ29lZmYsIFN5bWJvbCwgTFNSICMyICAgIAotICAgICAgICBTVFJCICAgIFRvdGFsQ29lZmYsIFtwTnVtQ29lZmZdICAgIAotICAgICAgICBNX1BSSU5URiAiVG90YWxDb2VmZj0lZFxuIiwgVG90YWxDb2VmZgotICAgICAgICBCRVEuVyAgIEVuZE5vRXJyb3IgICAgICAgICAgICAgICAgICA7Ly8gRmluaXNoZWQgaWYgbm8gY29lZmZpY2llbnRzCi0KLSAgICAgICAgQ01QICAgICBTeW1ib2wsICMxNyo0Ci0gICAgICAgIEJHRS5XICAgRW5kQmFkU3ltYm9sICAgICAgICAgICAgICAgIDsvLyBFcnJvciBpZiBiYWQgc3ltYm9sCi0gICAgICAgIAotICAgICAgICA7Ly8gU2F2ZSBiaXRzdHJlYW0gcG9pbnRlcnMKLSAgICAgICAgTV9TVFIgICBwcEJpdFN0cmVhbSwgIHBwcEJpdFN0cmVhbQotICAgICAgICBNX1NUUiAgIHBPZmZzZXQsICAgICAgcHBPZmZzZXQKLSAgICAgICAgTV9TVFIgICBwcFBvc0NvZWZidWYsIHBwcFBvc0NvZWZidWYgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gRGVjb2RlIFRyYWlsaW5nIE9uZXMKLSAgICAgICAgQU5EUyAgICBUcmFpbGluZ09uZXMsIFN5bWJvbCwgIzMKLSAgICAgICAgTV9BRFIgICBwTGV2ZWwsIHBwTGV2ZWwgICAgICAgICAgICAKLSAgICAgICAgTV9QUklOVEYgIlRyYWlsaW5nT25lcz0lZFxuIiwgVHJhaWxpbmdPbmVzCi0gICAgICAgIEJFUSAgICAgVHJhaWxpbmdPbmVzRG9uZSAgICAKLSAgICAgICAgTU9WICAgICBDb3VudCwgVHJhaWxpbmdPbmVzCi1UcmFpbGluZ09uZXNMb29wICAgIAotICAgICAgICBNX0JEX1JFQUQ4IFN5bWJvbCwgMSwgVDEKLSAgICAgICAgU1VCUyAgICBDb3VudCwgQ291bnQsICMxCi0gICAgICAgIE1PViAgICAgVDEsICMxCi0gICAgICAgIFNVQiAgICAgVDEsIFQxLCBTeW1ib2wsIExTTCAjMQotICAgICAgICBNX1BSSU5URiAiTGV2ZWw9JWRcbiIsIFQxCi0gICAgICAgIFNUUkggICAgVDEsIFtwTGV2ZWxdLCAjMgotICAgICAgICBCR1QgICAgIFRyYWlsaW5nT25lc0xvb3AKLVRyYWlsaW5nT25lc0RvbmUgICAgCi0gICAgCi0gICAgICAgIDsvLyBEZWNvZGUgbGV2ZWwgdmFsdWVzICAgIAotICAgICAgICBTVUJTICAgIENvdW50LCBUb3RhbENvZWZmLCBUcmFpbGluZ09uZXMgICAgIDsvLyBOdW1iZXIgb2YgbGV2ZWxzIHRvIHJlYWQKLSAgICAgICAgQkVRICAgICBEZWNvZGVSdW5zICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTm9uZSBsZWZ0Ci0gICAgICAgIAotICAgICAgICBNT1YgICAgIFN1ZmZpeExlbmd0aCwgIzEKLSAgICAgICAgQ01QICAgICBUb3RhbENvZWZmLCAjMTAKLSAgICAgICAgTU9WTEUgICBTdWZmaXhMZW5ndGgsICMwCi0gICAgICAgIENNUCAgICAgVHJhaWxpbmdPbmVzLCAjMyAgICA7Ly8gaWYgKFRyYWlsaW5nT25lczwzKQotICAgICAgICBNT1ZMVCAgIFRyYWlsaW5nT25lcywgIzQgICAgOy8vIHRoZW4gVHJhaWxpbmdPbmVzID0gKzQKLSAgICAgICAgTU9WR0UgICBUcmFpbGluZ09uZXMsICMyICAgIDsvLyBlbHNlIFRyYWlsaW5nT25lcyA9ICsyCi0gICAgICAgIE1PVkdFICAgU3VmZml4TGVuZ3RoLCAjMCAgICA7Ly8gICAgICBTdWZmaXhMZW5ndGggPSAwCi0gICAgICAgIAotTGV2ZWxMb29wCi0gICAgICAgIE1fQkRfQ0xaMTYgU3ltYm9sLCBUMSwgVDIgICA7Ly8gU3ltYm9sPUxldmVsUHJlZml4Ci0gICAgICAgIENNUCAgICAgU3ltYm9sLCMxNgotICAgICAgICBCR0UgICAgIEVuZEJhZFN5bWJvbAotICAgICAgICAKLSAgICAgICAgTU9WUyAgICBsciwgU3VmZml4TGVuZ3RoICAgIDsvLyBpZiBMZXZlbFN1ZmZpeFNpemU9PTAKLSAgICAgICAgVEVRRVEgICBTeW1ib2wsICMxNCAgICAgICAgIDsvLyAgIGFuZCAgTGV2ZWxQcmVmaXg9PTE0Ci0gICAgICAgIE1PVkVRICAgbHIsICM0ICAgICAgICAgICAgICA7Ly8gICB0aGVuIExldmVsU3VmZml4U2l6ZT00Ci0gICAgICAgIFRFUSAgICAgU3ltYm9sLCAjMTUgICAgICAgICA7Ly8gaWYgTGV2ZWxTdWZmaXhTaXplPT0xNQotICAgICAgICBNT1ZFUSAgIGxyLCAjMTIgICAgICAgICAgICAgOy8vICAgdGhlbiBMZXZlbFN1ZmZpeFNpemU9MTIKLSAgICAgICAgCi0gICAgICAgIFRFUUVRICAgU3VmZml4TGVuZ3RoLCMwCi0gICAgICAgIEFEREVRICAgU3ltYm9sLFN5bWJvbCwjMTUKLSAgICAgICAgCi0gICAgICAgIFRFUSAgICAgbHIsICMwICAgICAgICAgICAgICA7Ly8gaWYgTGV2ZWxTdWZmaXhTaXplPT0wCi0gICAgICAgIEJFUSAgICAgTGV2ZWxDb2RlUmVhZCAgICAgICA7Ly8gTGV2ZWxDb2RlID0gTGV2ZWxQcmVmaXgKLSAgICAgICAgCi0gICAgICAgIE1fQkRfVlJFQUQxNiBMZXZlbFN1ZmZpeCwgbHIsIFQxLCBUMiAgOy8vIFJlYWQgTGV2ZWwgU3VmZml4Ci0gICAgICAgIAotICAgICAgICBNT1YgICAgIFN5bWJvbCwgU3ltYm9sLCBMU0wgU3VmZml4TGVuZ3RoCi0gICAgICAgIEFERCAgICAgU3ltYm9sLCBMZXZlbFN1ZmZpeCwgU3ltYm9sCi0gICAgICAgICAgICAgCi1MZXZlbENvZGVSZWFkICAgICAgICAKLSAgICAgICAgOy8vIFN5bWJvbCA9IExldmVsQ29kZQotICAgICAgICBBREQgICAgIFN5bWJvbCwgU3ltYm9sLCBUcmFpbGluZ09uZXMgOy8vICs0IGlmIGxldmVsIGNhbm5vdCBiZSArLy0xLCArMiBvL3cKLSAgICAgICAgTU9WICAgICBUcmFpbGluZ09uZXMsICMyCi0gICAgICAgIE1PVlMgICAgVDEsIFN5bWJvbCwgTFNSICMxCi0gICAgICAgIFJTQkNTICAgVDEsIFQxLCAjMCAgICAgICAgICAgICAgICAgIDsvLyBJZiBTeW1ib2wgb2RkIHRoZW4gbmVnYXRlCi0gICAgICAgIE1fUFJJTlRGICJMZXZlbD0lZFxuIiwgVDEKLSAgICAgICAgU1RSSCAgICBUMSwgW3BMZXZlbF0sICMyICAgICAgICAgICAgOy8vIFN0b3JlIGxldmVsLgotICAgICAgICAKLSAgICAgICAgTERSICAgICBUMiwgPWFybVZDTTRQMTBfU3VmZml4VG9MZXZlbAotICAgICAgICBMRFJTQiAgIFQxLCBbVDIsIFN1ZmZpeExlbmd0aF0gICAgICA7Ly8gRmluZCBpbmNyZW1lbnQgbGV2ZWwgICAgICAgIAotICAgICAgICBURVEgICAgIFN1ZmZpeExlbmd0aCwgIzAKLSAgICAgICAgTU9WRVEgICBTdWZmaXhMZW5ndGgsICMxCi0gICAgICAgIENNUCAgICAgU3ltYm9sLCBUMQotICAgICAgICBBRERDUyAgIFN1ZmZpeExlbmd0aCwgU3VmZml4TGVuZ3RoLCAjMSAgICAgICAgCi0gICAgICAgIFNVQlMgICAgQ291bnQsIENvdW50LCAjMSAgICAgICAgCi0gICAgICAgIEJHVCAgICAgTGV2ZWxMb29wCi0gICAgICAgIAotRGVjb2RlUnVucyAgICAgICAgCi0gICAgICAgIDsvLyBGaW5kIG51bWJlciBvZiB6ZXJvcwotICAgICAgICBNX0xEUiAgIFQxLCBwU01heE51bUNvZWZmICAgICAgICAgICA7Ly8gc01heE51bUNvZWZmCi0gICAgICAgIFNVQiAgICAgQ291bnQsIFRvdGFsQ29lZmYsICMxICAgICAgIDsvLyBOdW1iZXIgb2YgcnVucyBleGNsdWRpbmcgbGFzdAotICAgICAgICBTVUJTICAgIFplcm9zTGVmdCwgVDEsIFRvdGFsQ29lZmYgICA7Ly8gTWF4aW11bSBudW1iZXIgb2YgemVyb3MgdGhlcmUgY291bGQgYmUKLSAgICAgICAgTV9BRFIgICBwUnVuLCBwcFJ1bgotICAgICAgICBNT1YgICAgIENvZWZmTnVtLFRvdGFsQ29lZmYKLSAgICAgICAgU1VCICAgICBDb2VmZk51bSxDb2VmZk51bSwjMQotICAgICAgICBCRVEgICAgIE5vWmVyb3NMZWZ0Ci0gICAgICAgIAotICAgICAgICA7Ly8gVW5wYWNrIG51bWJlciBvZiB6ZXJvcyBmcm9tIGJpdHN0cmVhbQotICAgICAgICBURVEgICAgIFQxLCAjNCAgICAgICAgCi0gICAgICAgIExEUkVRICAgcFZMRFRhYmxlLCA9KGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzLTQpCi0gICAgICAgIExEUk5FICAgcFZMRFRhYmxlLCA9KGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXMtNCkKLSAgICAgICAgTERSICAgICBwVkxEVGFibGUsIFtwVkxEVGFibGUsIFRvdGFsQ29lZmYsIExTTCAjMl0KLSAgICAgICAgCi0gICAgICAgIE1fQkRfVkxEICBTeW1ib2wsIFQxLCBUMiwgcFZMRFRhYmxlLCA0LCAyIDsvLyBTeW1ib2wgPSBaZXJvc0xlZnQKLSAgICAgICAgQ01QICAgICBTeW1ib2wsIzE2Ci0gICAgICAgIEJHRSAgICAgRW5kQmFkU3ltYm9sCi0KLSAgICAgICAgTERSICAgICBwcFJ1blRhYmxlLCA9KGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXMtNCkKLSAgICAgICAgTV9BRFIgICBwUnVuLCBwcFJ1bgotICAgICAgICBNT1ZTICAgIFplcm9zTGVmdCwgU3ltYm9sCi0KLSAgICAgICAgQUREICAgICBDb2VmZk51bSxDb2VmZk51bSxaZXJvc0xlZnQgICAgICAgIAotCi0gICAgICAgIEJFUSAgICAgTm9aZXJvc0xlZnQKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWNvZGUgcnVucyB3aGlsZSB6ZXJvcyBhcmUgbGVmdCBhbmQgbW9yZSB0aGFuIG9uZSBjb2VmZmljaWVudAotUnVuTG9vcCAKLSAgICAgICAgU1VCUyAgICBDb3VudCwgQ291bnQsICMxCi0gICAgICAgIExEUiAgICAgcFZMRFRhYmxlLCBbcHBSdW5UYWJsZSwgWmVyb3NMZWZ0LCBMU0wjMl0KLSAgICAgICAgQkxUICAgICBMYXN0UnVuCi0gICAgICAgIE1fQkRfVkxEICBTeW1ib2wsIFQxLCBUMiwgcFZMRFRhYmxlLCAzLCAyIDsvLyBTeW1ib2wgPSBSdW4KLSAgICAgICAgQ01QICAgICBTeW1ib2wsIzE1ICAgICAgICAgCi0gICAgICAgIEJHRSAgICAgRW5kQmFkU3ltYm9sICAgICAgICAKLQotICAgICAgICBTVUJTICAgIFplcm9zTGVmdCwgWmVyb3NMZWZ0LCBTeW1ib2wKLSAgICAgICAgTV9QUklOVEYgIlJ1bj0lZFxuIiwgU3ltYm9sCi0gICAgICAgIFNUUkIgICAgU3ltYm9sLCBbcFJ1bl0sICMxCi0gICAgICAgIEJHVCAgICAgUnVuTG9vcAotICAgICAgICAKLSAgICAgICAgOy8vIERlY29kZSBydW5zIHdoaWxlIG5vIHplcm9zIGFyZSBsZWZ0Ci1Ob1plcm9zTGVmdCAKLSAgICAgICAgU1VCUyAgICBDb3VudCwgQ291bnQsICMxCi0gICAgICAgIE1fUFJJTlRGICJSdW49JWRcbiIsIFplcm9zTGVmdAotICAgICAgICBTVFJHRUIgIFplcm9zTGVmdCwgW3BSdW5dLCAjMQotICAgICAgICBCR1QgICAgIE5vWmVyb3NMZWZ0Ci0KLUxhc3RSdW4gICAgICAgIAotICAgICAgICA7Ly8gRmluYWwgcnVuIGxlbmd0aCBpcyByZW1haW5pbmcgemVyb3MKLSAgICAgICAgTV9QUklOVEYgIkxhc3RSdW49JWRcbiIsIFplcm9zTGVmdAotICAgICAgICBTVFJCICAgIFplcm9zTGVmdCwgW3BSdW5dLCAjMSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gV3JpdGUgY29lZmZpY2llbnRzIHRvIG91dHB1dCBhcnJheQotICAgICAgICBNX0xEUiAgIFQxLCBwU01heE51bUNvZWZmICAgICAgICAgICAgICAgICAgICA7Ly8gc01heE51bUNvZWZmCi0gICAgICAgIFRFUSAgICAgVDEsICMxNQotICAgICAgICBBRERFUSAgIENvZWZmTnVtLENvZWZmTnVtLCMxCi0gICAgICAgIAotCi0gICAgICAgIFNVQiAgICAgcFJ1bixwUnVuLFRvdGFsQ29lZmYKLSAgICAgICAgU1VCICAgICBwTGV2ZWwscExldmVsLFRvdGFsQ29lZmYgIAotICAgICAgICBTVUIgICAgIHBMZXZlbCxwTGV2ZWwsVG90YWxDb2VmZiAgIAotCi0gICAgICAgIE1fTERSICAgcHBQb3NDb2VmYnVmLCBwcHBQb3NDb2VmYnVmCi0gICAgICAgIExEUiAgICAgcFBvc0NvZWZidWYsIFtwcFBvc0NvZWZidWZdCi0gICAgICAgIFRFUSAgICAgVDEsICM0Ci0gICAgICAgIExEUkVRICAgcFppZ1phZywgPWFybVZDTTRQMTBfWmlnWmFnXzJ4MgotICAgICAgICBMRFJORSAgIHBaaWdaYWcsID1hcm1WQ000UDEwX1ppZ1phZ180eDQKLQotICAgICAgICAKLSAgICAgICAgCi1PdXRwdXRMb29wCi0gICAgICAgIAotICAgICAgICBMRFJCICAgIFQyLCBbcFJ1bl0sIzEKLSAgICAgICAgTERSQiAgICBUMSwgW3BaaWdaYWcsIENvZWZmTnVtXQotICAgICAgICBTVUIgICAgIENvZWZmTnVtLCBDb2VmZk51bSwgIzEgICAgICA7Ly8gU2tpcCBOb24gemVybwotICAgICAgICBTVUIgICAgIENvZWZmTnVtLCBDb2VmZk51bSwgVDIgICAgICA7Ly8gU2tpcCBaZXJvIHJ1bgotICAgICAgICAKLSAgICAgICAgTERSU0ggICBUMiwgW3BMZXZlbF0sIzIKLSAgICAgICAgCi0gICAgICAgIFNVQlMgICAgVG90YWxDb2VmZiwgVG90YWxDb2VmZiwgIzEgICAgICAgCi0gICAgICAgIE9SUkVRICAgVDEsIFQxLCAjTEFTVF9DT0VGRgotICAgICAgICAKLSAgICAgICAgQUREICAgICB0ZW1wLCBUMiwgIzEyOAotICAgICAgICBDTVAgICAgIHRlbXAsICMyNTYKLSAgICAgICAgT1JSQ1MgICBUMSwgVDEsICNUV09fQllURV9DT0VGRgotCi0gICAgICAgIAotICAgICAgICBURVEgICAgIFRvdGFsQ29lZmYsICMwICAgICAgICAgICAgICA7Ly8gUHJlc2VydmVzIGNhcnJ5ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1fUFJJTlRGICJPdXRwdXQ9JTAyeCAlMDR4XG4iLCBUMSwgVDIKLSAgICAgICAgU1RSQiAgICBUMSwgW3BQb3NDb2VmYnVmXSwgIzEKLSAgICAgICAgU1RSQiAgICBUMiwgW3BQb3NDb2VmYnVmXSwgIzEKLSAgICAgICAgTU9WICAgICBUMiwgVDIsIExTUiAjOAotICAgICAgICBTVFJDU0IgIFQyLCBbcFBvc0NvZWZidWZdLCAjMSAgICAgICAgICAgICAgICAKLSAgICAgICAgQk5FICAgICBPdXRwdXRMb29wCi0gICAgICAgIAotICAgICAgICA7Ly8gRmluaXNoZWQKLSAgICAgICAgU1RSICAgICBwUG9zQ29lZmJ1ZiwgW3BwUG9zQ29lZmJ1Zl0KLSAgICAgICAgTV9MRFIgICBwcEJpdFN0cmVhbSwgcHBwQml0U3RyZWFtCi0gICAgICAgIE1fTERSICAgcE9mZnNldCwgcHBPZmZzZXQKLSAgICAgICAgQiAgICAgICBFbmROb0Vycm9yCi0gICAgICAgICAgICAKLUVuZEJhZFN5bWJvbAotICAgICAgICBNT1YgICAgIHIwLCAjT01YX1N0c19FcnIKLSAgICAgICAgQiAgICAgICBFbmQgICAgCi0gICAgICAgIAotRW5kTm9FcnJvcgotICAgICAgICA7Ly8gRmluaXNoZWQgcmVhZGluZyBmcm9tIHRoZSBiaXRzdHJlYW0gICAgICAgICAgICAgICAgCi0gICAgICAgIE1fQkRfRklOSSBwcEJpdFN0cmVhbSwgcE9mZnNldAotICAgICAgICAKLSAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKLSAgICAgICAgTU9WICAgICByMCwgI09NWF9TdHNfTm9FcnIgICAgCi1FbmQKLSAgICAgICAgTV9FTkQKLSAgICAKLSAgICBFTkRJRgotICAgIAotICAgIEVORAotICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmUwN2I1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucworKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgCi0KLSAgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgIAotICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfUVBEaXZUYWJsZQotICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKLSAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NAotICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfUG9zVG9WQ29sMngyCi0gICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9WTWF0cml4IAotICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZQotICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfVk1hdHJpeFUxNgotICAgICAgICAgCi07Ly8gRGVmaW5lIHRoZSBwcm9jZXNzb3IgdmFyaWFudHMgc3VwcG9ydGVkIGJ5IHRoaXMgZmlsZQotICAgICAgICAgCi0gICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotICAgICAgICAgICAKLSAgICAgICAgIAotOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQotCi0gICAgCi0gICAgSUYgQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4Ci0gICAgICAgICAgIAotIAotICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NAotICAgICAgICAgRENCICAwLCAyLCAwLCAyCi0gICAgICAgICBEQ0IgIDIsIDEsIDIsIDEKLSAgICAgICAgIERDQiAgMCwgMiwgMCwgMgotICAgICAgICAgRENCICAyLCAxLCAyLCAxCi0KLQotICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1Bvc1RvVkNvbDJ4MgotICAgICAgICAgRENCICAwLCAyCi0gICAgICAgICBEQ0IgIDIsIDEKLQotCi0gICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfVk1hdHJpeAotICAgICAgICAgRENCICAxMCwgMTYsIDEzCi0gICAgICAgICBEQ0IgIDExLCAxOCwgMTQKLSAgICAgICAgIERDQiAgMTMsIDIwLCAxNgotICAgICAgICAgRENCICAxNCwgMjMsIDE4Ci0gICAgICAgICBEQ0IgIDE2LCAyNSwgMjAKLSAgICAgICAgIERDQiAgMTgsIDI5LCAyMwotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gWyhJTlQpKFFQLzYpXSwKLTsvLyBmb3IgdmFsdWVzIG9mIFFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9RUERpdlRhYmxlCi0gICAgICAgICBEQ0IgIDAsICAwLCAgMCwgIDAsICAwLCAgMAotICAgICAgICAgRENCICAxLCAgMSwgIDEsICAxLCAgMSwgIDEKLSAgICAgICAgIERDQiAgMiwgIDIsICAyLCAgMiwgIDIsICAyCi0gICAgICAgICBEQ0IgIDMsICAzLCAgMywgIDMsICAzLCAgMwotICAgICAgICAgRENCICA0LCAgNCwgIDQsICA0LCAgNCwgIDQKLSAgICAgICAgIERDQiAgNSwgIDUsICA1LCAgNSwgIDUsICA1Ci0gICAgICAgICBEQ0IgIDYsICA2LCAgNiwgIDYsICA2LCAgNgotICAgICAgICAgRENCICA3LCAgNywgIDcsICA3LCAgNywgIDcKLSAgICAgICAgIERDQiAgOCwgIDgsICA4LCAgOCwgIDgsICA4Ci0gICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBjb250YWlucyBhcm1WQ000UDEwX1ZNYXRyaXhbUVAlNl1bMF0gZW50aXJlcywKLTsvLyBmb3IgdmFsdWVzIG9mIFFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQotICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgZXZhbHVhdGVzIHRoZSBtb2R1bHVzIGV4cHJlc3Npb24gW1FQJTZdKjYsCi07Ly8gZm9yIHZhbHVlcyBvZiBRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZQotICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgICAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBpbnZpZHVhbCBieXRlIHZhbHVlcyBzdG9yZWQgYXMKLTsvLyBoYWxmd29yZHMuIFRoaXMgYXZvaWRzIHVucGFja2luZyBpbnNpZGUgdGhlIGZ1bmN0aW9uCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1ZNYXRyaXhVMTYKLSAgICAgICAgIERDVyAxMCwgMTYsIDEzIAotICAgICAgICAgRENXIDExLCAxOCwgMTQKLSAgICAgICAgIERDVyAxMywgMjAsIDE2Ci0gICAgICAgICBEQ1cgMTQsIDIzLCAxOAotICAgICAgICAgRENXIDE2LCAyNSwgMjAKLSAgICAgICAgIERDVyAxOCwgMjksIDIzIAotICAgICAgICAgCi0gICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0FSTTExMzZKUyAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIAotICAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZTEyM2QuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKLQotREVCVUdfT04gICAgU0VUTCB7RkFMU0V9Ci0KLSAgICBJRiBBUk0xMTM2SlMgCi0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotcFNyYyAgICAgICAgICAgIFJOIDAKLXNyY1N0ZXAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgUk4gOAotaUhlaWdodCAgICAgICAgIFJOIDkKLQotOy8vIERlY2xhcmUgaW5uZXIgbG9vcCByZWdpc3RlcnMKLXggICAgICAgICAgICAgICBSTiA3Ci14MCAgICAgICAgICAgICAgUk4gNwoteDEgICAgICAgICAgICAgIFJOIDEwCi14MiAgICAgICAgICAgICAgUk4gMTEKLVNjcmF0Y2ggICAgICAgICBSTiAxMgotCi07Ly8gRnVuY3Rpb246IAotOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQotOy8vCi07Ly8gSW1wbGVtZW50cyBjb3B5IGZyb20gYW4gYXJiaXRyYXJ5IGFsaWduZWQgc291cmNlIG1lbW9yeSBsb2NhdGlvbiAocFNyYykgdG8gYSA0IGJ5dGUgYWxpZ25lZAotOy8vIGRlc3RpbmF0aW9uIHBvaW50ZWQgYnkgKHBEc3QpIGZvciBob3Jpem9udGFsIGludGVycG9sYXRpb24uCi07Ly8gVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBjb3B5IDkgYnl0ZXMgaW4gaG9yaXpvbnRhbCBkaXJlY3Rpb24uIAotOy8vCi07Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KLTsvLyByMCxyMSxyOCxyOSB3aGVyZSByOCBjb250YWluaW5ncyBhbGlnbmVkIG1lbW9yeSBwb2ludGVyIGFuZCByOSBubyByb3dzIHRvIGNvcHkKLTsvLwotOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgotOy8vIHIyLHIzLHI0LHI1LHI2Ci07Ly8KLTsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCi07Ly8gcjcscjgscjkscjEwLHIxMSxyMTIKLTsvLwotOy8vIE91dHB1dCByZWdpc3RlcnMKLTsvLyByMCAtIHBvaW50ZXIgdG8gdGhlIG5ldyBhbGlnbmVkIGxvY2F0aW9uIHdoaWNoIHdpbGwgYmUgdXNlZCBhcyBwU3JjCi07Ly8gcjEgLSBzdGVwIHNpemUgdG8gdGhpcyBhbGlnbmVkIGxvY2F0aW9uCi0KLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBDb3B5IHBEc3QgdG8gc2NyYXRjaAotICAgICAgICBNT1YgICAgIFNjcmF0Y2gsIHBEc3QKLQotU3RhcnRBbGlnbmVkU3RhY2tDb3B5Ci0gICAgICAgIEFORCAgICAgeCwgcFNyYywgIzMKLSAgICAgICAgQklDICAgICBwU3JjLCBwU3JjLCAjMwotICAgICAgICAKLSAgICAgICAgTV9TV0lUQ0ggeAotICAgICAgICBNX0NBU0UgICBDb3B5MHRvQWxpZ25lZAotICAgICAgICBNX0NBU0UgICBDb3B5MXRvQWxpZ25lZAotICAgICAgICBNX0NBU0UgICBDb3B5MnRvQWxpZ25lZAotICAgICAgICBNX0NBU0UgICBDb3B5M3RvQWxpZ25lZAotICAgICAgICBNX0VORFNXSVRDSAotCi1Db3B5MHRvQWxpZ25lZCAgCi0gICAgICAgIExETSAgICAgcFNyYywge3gwLCB4MSwgeDJ9Ci0gICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEKLSAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCi0gICAgICAgIAotICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCi0KLSAgICAgICAgU1RNICAgICBwRHN0ISwge3gwLCB4MSwgeDJ9ICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdwotICAgICAgICBCR1QgICAgIENvcHkwdG9BbGlnbmVkCi0gICAgICAgIEIgICAgICAgQ29weUVuZCAgCi0gICAgICAKLUNvcHkxdG9BbGlnbmVkICAgICAgICAKLSAgICAgICAgTERNICAgICBwU3JjLCB7eDAsIHgxLCB4Mn0KLSAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMQotICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAKLSAgICAgICAgCi0gICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKLQotICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICM4Ci0gICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMyNAotICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNSICM4Ci0gICAgICAgIE9SUiAgICAgeDEsIHgxLCB4MiwgTFNMICMyNAotICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICM4Ci0gICAgICAgIFNUTSAgICAgcERzdCEsIHt4MCwgeDEsIHgyfSAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKLSAgICAgICAgQkdUICAgICBDb3B5MXRvQWxpZ25lZAotICAgICAgICBCICAgICAgIENvcHlFbmQgIAotCi1Db3B5MnRvQWxpZ25lZCAgICAgICAgCi0gICAgICAgIExETSAgICAgcFNyYywge3gwLCB4MSwgeDJ9Ci0gICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEKLSAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCi0gICAgICAgIAotICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCi0KLSAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjMTYKLSAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzE2Ci0gICAgICAgIE1PViAgICAgeDEsIHgxLCBMU1IgIzE2Ci0gICAgICAgIE9SUiAgICAgeDEsIHgxLCB4MiwgTFNMICMxNgotICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMxNgotICAgICAgICBTVE0gICAgIHBEc3QhLCB7eDAsIHgxLCB4Mn0gICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93Ci0gICAgICAgIEJHVCAgICAgQ29weTJ0b0FsaWduZWQKLSAgICAgICAgQiAgICAgICBDb3B5RW5kICAKLQotQ29weTN0b0FsaWduZWQgICAgICAgIAotICAgICAgICBMRE0gICAgIHBTcmMsIHt4MCwgeDEsIHgyfQotICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCi0gICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcAotICAgICAgICAKLSAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAotCi0gICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzI0Ci0gICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICM4Ci0gICAgICAgIE1PViAgICAgeDEsIHgxLCBMU1IgIzI0Ci0gICAgICAgIE9SUiAgICAgeDEsIHgxLCB4MiwgTFNMICM4Ci0gICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzI0Ci0gICAgICAgIFNUTSAgICAgcERzdCEsIHt4MCwgeDEsIHgyfSAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKLSAgICAgICAgQkdUICAgICBDb3B5M3RvQWxpZ25lZAotCi1Db3B5RW5kICAKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgcFNyYywgU2NyYXRjaAotICAgICAgICBNT1YgICAgIHNyY1N0ZXAsICMxMgotCi0gICAgICAgIE1fRU5ECi0gICAgCi0KLTsvLyBGdW5jdGlvbjoKLTsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKLTsvLwotOy8vIEltcGxlbWVudHMgY29weSBmcm9tIGFuIGFyYml0cmFyeSBhbGlnbmVkIHNvdXJjZSBtZW1vcnkgbG9jYXRpb24gKHBTcmMpIHRvIGFuIGFsaWduZWQKLTsvLyBkZXN0aW5hdGlvbiBwb2ludGVkIGJ5IChwRHN0KSBmb3IgdmVydGljYWwgaW50ZXJwb2xhdGlvbi4KLTsvLyBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGNvcHkgNCBieXRlcyBpbiBob3Jpem9udGFsIGRpcmVjdGlvbiAKLTsvLwotOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCi07Ly8gcjAscjEscjgscjkgd2hlcmUgcjggY29udGFpbmluZ3MgYWxpZ25lZCBtZW1vcnkgcG9pbnRlciBhbmQgcjkgbm8gb2Ygcm93cyB0byBjb3B5Ci07Ly8KLTsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KLTsvLyByMixyMyxyNCxyNSxyNgotOy8vCi07Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgotOy8vIHI3LHI4LHI5LHIxMCxyMTEscjEyCi07Ly8KLTsvLyBPdXRwdXQgcmVnaXN0ZXJzCi07Ly8gcjAgLSBwb2ludGVyIHRvIHRoZSBuZXcgYWxpZ25lZCBsb2NhdGlvbiB3aGljaCB3aWxsIGJlIHVzZWQgYXMgcFNyYwotOy8vIHIxIC0gc3RlcCBzaXplIHRvIHRoaXMgYWxpZ25lZCBsb2NhdGlvbgotCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZSAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gQ29weSBwU3JjIHRvIHN0YWNrCi1TdGFydFZBbGlnbmVkU3RhY2tDb3B5Ci0gICAgICAgIEFORCAgICAgeCwgcFNyYywgIzMKLSAgICAgICAgQklDICAgICBwU3JjLCBwU3JjLCAjMyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1fU1dJVENIIHgKLSAgICAgICAgTV9DQVNFICAgQ29weTB0b1ZBbGlnbmVkCi0gICAgICAgIE1fQ0FTRSAgIENvcHkxdG9WQWxpZ25lZAotICAgICAgICBNX0NBU0UgICBDb3B5MnRvVkFsaWduZWQKLSAgICAgICAgTV9DQVNFICAgQ29weTN0b1ZBbGlnbmVkCi0gICAgICAgIE1fRU5EU1dJVENICi0gICAgICAgIAotQ29weTB0b1ZBbGlnbmVkICAKLSAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEKLSAgICAgICAgCi0gICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKLQotICAgICAgICBTVFIgICAgIHgwLCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdwotICAgICAgICBCR1QgICAgIENvcHkwdG9WQWxpZ25lZAotICAgICAgICBCICAgICAgIENvcHlWRW5kICAKLSAgICAgIAotQ29weTF0b1ZBbGlnbmVkICAgICAgICAKLSAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCi0KLSAgICAgICAgTU9WICAgICB4MSwgeDEsIExTTCAjMjQKLSAgICAgICAgT1JSICAgICB4MCwgeDEsIHgwLCBMU1IgIzgKLSAgICAgICAgU1RSICAgICB4MCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKLSAgICAgICAgQkdUICAgICBDb3B5MXRvVkFsaWduZWQKLSAgICAgICAgQiAgICAgICBDb3B5VkVuZCAgCi0KLUNvcHkydG9WQWxpZ25lZCAgICAgICAgCi0gICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAotCi0gICAgICAgIE1PViAgICAgeDEsIHgxLCBMU0wgIzE2Ci0gICAgICAgIE9SUiAgICAgeDAsIHgxLCB4MCwgTFNSICMxNgotICAgICAgICBTVFIgICAgIHgwLCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdwotICAgICAgICBCR1QgICAgIENvcHkydG9WQWxpZ25lZAotICAgICAgICBCICAgICAgIENvcHlWRW5kICAKLQotQ29weTN0b1ZBbGlnbmVkICAgICAgICAKLSAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCi0KLSAgICAgICAgTU9WICAgICB4MSwgeDEsIExTTCAjOAotICAgICAgICBPUlIgICAgIHgwLCB4MSwgeDAsIExTUiAjMjQKLSAgICAgICAgU1RSICAgICB4MCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKLSAgICAgICAgQkdUICAgICBDb3B5M3RvVkFsaWduZWQKLQotQ29weVZFbmQgIAotCi0gICAgICAgIFNVQiAgICAgcFNyYywgcERzdCwgIzI4Ci0gICAgICAgIE1PViAgICAgc3JjU3RlcCwgIzQKLQotICAgICAgICBNX0VORAotCi0KLSAgICBFTkRJRgotCi0gICAgRU5ECi0gICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWE4OWZkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi07Ly8gRnVuY3Rpb246Ci07Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlIAotOy8vCi07Ly8gSW1wbGVtZW50cyBjb3B5IGZyb20gYW4gYXJiaXRyYXJ5IGFsaWduZWQgc291cmNlIG1lbW9yeSBsb2NhdGlvbiAocFNyYykgdG8gYW4gYWxpZ25lZAotOy8vIGRlc3RpbmF0aW9uIHBvaW50ZWQgYnkgKHBEc3QpCi07Ly8KLTsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KLTsvLyByMSxyMyxyNCxyNSxyNixyNyxyMTAscjExLHIxNAotOy8vCi07Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgotOy8vIHIwLHIyLHI4LHI5LHIxMgotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlCi0gICAgICAgIAotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi1wU3JjICAgICAgICAgICAgUk4gMAotc3JjU3RlcCAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICBSTiAyCi1kc3RTdGVwICAgICAgICAgUk4gMwotCi07Ly8gRGVjbGFyZSBvdGhlciBpbnRlcm1lZGlhdGUgcmVnaXN0ZXJzCi14MCAgICAgICAgICAgICAgUk4gNAoteDEgICAgICAgICAgICAgIFJOIDUKLXgyICAgICAgICAgICAgICBSTiA4Ci14MyAgICAgICAgICAgICAgUk4gOQotVGVtcCAgICAgICAgICAgIFJOIDEyCi0KLSAgICBJRiBBUk0xMTM2SlMKLQotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlLCByNgotCi1Db3B5NHg0U3RhcnQKLSAgICAgICAgOy8vIERvIENvcHkgYW5kIGJyYW5jaCB0byBFbmRPZkludGVycG9sYXRpb24KLSAgICAgICAgQU5EICAgICBUZW1wLCBwU3JjLCAjMwotICAgICAgICBCSUMgICAgIHBTcmMsIHBTcmMsICMzICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgTV9TV0lUQ0ggVGVtcAotICAgICAgICBNX0NBU0UgIENvcHk0eDRBbGlnbjAKLSAgICAgICAgTV9DQVNFICBDb3B5NHg0QWxpZ24xCi0gICAgICAgIE1fQ0FTRSAgQ29weTR4NEFsaWduMgotICAgICAgICBNX0NBU0UgIENvcHk0eDRBbGlnbjMKLSAgICAgICAgTV9FTkRTV0lUQ0gKLQotQ29weTR4NEFsaWduMAotICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTV9MRFIgICB4MSwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTV9TVFIgICB4MSwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIE1fTERSICAgeDMsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgTV9TVFIgICB4MywgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIEIgICAgICAgQ29weTR4NEVuZCAgCi0KLUNvcHk0eDRBbGlnbjEKLSAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTERSICAgICB4MywgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjOAotICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMjQKLSAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzgKLSAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzI0Ci0gICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICM4Ci0gICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMyNAotICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjOAotICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjMjQKLSAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIEIgICAgICAgQ29weTR4NEVuZCAgCi0gICAgICAKLUNvcHk0eDRBbGlnbjIKLSAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTERSICAgICB4MywgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjMTYKLSAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzE2Ci0gICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMxNgotICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjMTYKLSAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAKLQotICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMxNgotICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMTYKLSAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzE2Ci0gICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICMxNgotICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgIAotICAgICAgICBCICAgICAgIENvcHk0eDRFbmQgIAotCi1Db3B5NHg0QWxpZ24zIAotICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBMRFIgICAgIHgzLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDIsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMyNAotICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjOAotICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMjQKLSAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzgKLSAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwCi0KLSAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTERSICAgICB4MywgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjMjQKLSAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzgKLSAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzI0Ci0gICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICM4Ci0gICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBCICAgICAgIENvcHk0eDRFbmQgIAotCi1Db3B5NHg0RW5kCi0gICAgICAgIE1fRU5ECi0KLSAgICBFTkRJRgotCi0gICAgRU5ECi0gICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4YjY3ZWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JEaWFnQ29weV91bnNhZmUKLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckRpYWdDb3B5X3Vuc2FmZQotCi07Ly8gRnVuY3Rpb25zOiAKLTsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlIGFuZAotOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUgCi07Ly8KLTsvLyBJbXBsZW1lbnRzIHJlLWFycmFuZ2VtZW50IG9mIGRhdGEgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyIHRvIGEgYnVmZmVyIHBvaW50ZWQgYnkgcEJ1Zi4KLTsvLyBUaGlzIHdpbGwgZG8gdGhlIGNvbnZlcnRpb24gb2YgZGF0YSBmcm9tIDE2IGJpdCB0byA4IGJpdCBhbmQgaXQgYWxzbwotOy8vIHJlbW92ZSBvZmZzZXQgYW5kIGNoZWNrIGZvciBzYXR1cmF0aW9uLgotOy8vCi07Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KLTsvLyByMCxyMSxyNyB3aGVyZSByMCBpcyBpbnB1dCBwb2ludGVyIGFuZCByMiBpdHMgc3RlcCBzaXplLCByNyBpcyBvdXRwdXQgcG9pbnRlcgotOy8vCi07Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCi07Ly8gcjQscjUscjYscjgscjkscjE0Ci07Ly8KLTsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCi07Ly8gcjcscjEwLHIxMSxyMTIKLTsvLwotOy8vIE91dHB1dCByZWdpc3RlcnMKLTsvLyByMCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGxvY2F0aW9uCi07Ly8gcjEgLSBzdGVwIHNpemUgdG8gdGhpcyBkZXN0aW5hdGlvbiBsb2NhdGlvbgotCi0KLURFQlVHX09OICAgIFNFVEwge0ZBTFNFfQotICAgICAgICAKLU1BU0sgICAgICAgICAgICBFUVUgMHg4MDgwODA4MCAgOy8vIE1hc2sgaXMgdXNlZCB0byBpbXBsZW1lbnQgKGErYisxKS8yCi0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotCi1wU3JjMCAgICAgICAgICAgUk4gMAotc3JjU3RlcDAgICAgICAgIFJOIDEKLQotOy8vIERlY2xhcmUgb3RoZXIgaW50ZXJtZWRpYXRlIHJlZ2lzdGVycwotVGVtcDEgICAgICAgICAgIFJOIDQKLVRlbXAyICAgICAgICAgICBSTiA1Ci1UZW1wMyAgICAgICAgICAgUk4gMTAKLVRlbXA0ICAgICAgICAgICBSTiAxMQotcEJ1ZiAgICAgICAgICAgIFJOIDcKLXIweDBmZTAwZmUwICAgICBSTiA2Ci1yMHgwMGZmMDBmZiAgICAgUk4gMTIKLUNvdW50ICAgICAgICAgICBSTiAxNAotVmFsdWVBMCAgICAgICAgIFJOIDEwCi1WYWx1ZUExICAgICAgICAgUk4gMTEKLQotICAgIElGIEFSTTExMzZKUwotCi0KLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZSwgcjYKLQotICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgCi0gICAgICAgIE1PViAgICAgICAgIENvdW50LCAjNCAgIAotICAgICAgICBMRFIgICAgICAgICByMHgwZmUwMGZlMCwgPTB4MGZlMDBmZTAKLSAgICAgICAgTERSICAgICAgICAgcjB4MDBmZjAwZmYsID0weDAwZmYwMGZmICAgICAgICAKLUxvb3BTdGFydDEKLSAgICAgICAgTERSICAgICAgICAgVGVtcDQsIFtwU3JjMCwgIzEyXQotICAgICAgICBMRFIgICAgICAgICBUZW1wMywgW3BTcmMwLCAjOF0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BTcmMwLCAjNF0KLSAgICAgICAgTV9MRFIgICAgICAgVGVtcDEsIFtwU3JjMF0sIHNyY1N0ZXAwICAgICAgICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgVGVtcDQsIFRlbXA0LCByMHgwZmUwMGZlMCAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXAzLCBUZW1wMywgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wMiwgVGVtcDIsIHIweDBmZTAwZmUwICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgVGVtcDEsIFRlbXAxLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCi0gICAgICAgIFVTQVQxNiAgICAgIFRlbXA0LCAjMTMsIFRlbXA0Ci0gICAgICAgIFVTQVQxNiAgICAgIFRlbXAzLCAjMTMsIFRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDIsICMxMywgVGVtcDIKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDEsICMxMywgVGVtcDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgIFRlbXA0LCByMHgwMGZmMDBmZiwgVGVtcDQsIExTUiAjNSAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wMywgcjB4MDBmZjAwZmYsIFRlbXAzLCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDIsIHIweDAwZmYwMGZmLCBUZW1wMiwgTFNSICM1ICAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgIFRlbXAxLCByMHgwMGZmMDBmZiwgVGVtcDEsIExTUiAjNSAgICAgICAgIAotICAgICAgICBPUlIgICAgICAgICBWYWx1ZUExLCBUZW1wMywgVGVtcDQsIExTTCAjOCAgICAgICAgICAgICAKLSAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMCwgVGVtcDEsIFRlbXAyLCBMU0wgIzggICAgICAgICAgICAgCi0gICAgICAgIFNVQlMgICAgICAgIENvdW50LCBDb3VudCwgIzEgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFNUUkQgICAgICAgIFZhbHVlQTAsIFtwQnVmXSwgIzggCi0gICAgICAgIEJHVCAgICAgICAgIExvb3BTdGFydDEKLUVuZDEKLSAgICAgICAgU1VCICAgICAgICBwU3JjMCwgcEJ1ZiwgIzMyCi0gICAgICAgIE1PViAgICAgICAgc3JjU3RlcDAsICM4Ci0KLSAgICAgICAgTV9FTkQKLQotCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUsIHI2Ci0gICAgICAgIAotICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIHIweDBmZTAwZmUwLCA9MHgwZmUwMGZlMAotICAgICAgICBMRFIgICAgICAgICByMHgwMGZmMDBmZiwgPTB4MDBmZjAwZmYKLSAgICAgICAgTU9WICAgICAgICAgQ291bnQsICMyCi0KLUxvb3BTdGFydCAgICAKLSAgICAgICAgTERSICAgICAgICAgVGVtcDQsIFtwU3JjMCwgIzEyXQotICAgICAgICBMRFIgICAgICAgICBUZW1wMywgW3BTcmMwLCAjOF0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BTcmMwLCAjNF0KLSAgICAgICAgTV9MRFIgICAgICAgVGVtcDEsIFtwU3JjMF0sIHNyY1N0ZXAwCi0gICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wNCwgVGVtcDQsIHIweDBmZTAwZmUwICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgVGVtcDMsIFRlbXAzLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXAyLCBUZW1wMiwgcjB4MGZlMDBmZTAgICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wMSwgVGVtcDEsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFVTQVQxNiAgICAgIFRlbXA0LCAjMTMsIFRlbXA0Ci0gICAgICAgIFVTQVQxNiAgICAgIFRlbXAzLCAjMTMsIFRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDIsICMxMywgVGVtcDIKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDEsICMxMywgVGVtcDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDQsIHIweDAwZmYwMGZmLCBUZW1wNCwgTFNSICM1ICAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgIFRlbXAzLCByMHgwMGZmMDBmZiwgVGVtcDMsIExTUiAjNSAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wMiwgcjB4MDBmZjAwZmYsIFRlbXAyLCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDEsIHIweDAwZmYwMGZmLCBUZW1wMSwgTFNSICM1ICAgICAgICAgCi0gICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTEsIFRlbXAzLCBUZW1wNCwgTFNMICM4ICAgICAgICA7Ly8gW2QyIGMyIGQwIGMwXSAgICAgICAgICAgICAKLSAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMCwgVGVtcDEsIFRlbXAyLCBMU0wgIzggICAgICAgIDsvLyBbYjIgYTIgYjAgYTBdICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICBQS0hCVCAgICAgICBUZW1wMSwgVmFsdWVBMCwgVmFsdWVBMSwgTFNMICMxNiAgICAgOy8vIFtkMCBjMCBiMCBhMF0KLQotICAgICAgICBTVFIgICAgICAgICBUZW1wMSwgW3BCdWZdLCAjOCAKLSAgICAgICAgUEtIVEIgICAgICAgVGVtcDIsIFZhbHVlQTEsIFZhbHVlQTAsIEFTUiAjMTYgICAgIDsvLyBbZDIgYzIgYjIgYTJdCi0gICAgICAgIFNUUiAgICAgICAgIFRlbXAyLCBbcEJ1Zl0sICMtNCAgCi0KLSAgICAgICAgTERSICAgICAgICAgVGVtcDQsIFtwU3JjMCwgIzEyXQotICAgICAgICBMRFIgICAgICAgICBUZW1wMywgW3BTcmMwLCAjOF0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BTcmMwLCAjNF0KLSAgICAgICAgTV9MRFIgICAgICAgVGVtcDEsIFtwU3JjMF0sIHNyY1N0ZXAwCi0gICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wNCwgVGVtcDQsIHIweDBmZTAwZmUwICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgVGVtcDMsIFRlbXAzLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXAyLCBUZW1wMiwgcjB4MGZlMDBmZTAgICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wMSwgVGVtcDEsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFVTQVQxNiAgICAgIFRlbXA0LCAjMTMsIFRlbXA0Ci0gICAgICAgIFVTQVQxNiAgICAgIFRlbXAzLCAjMTMsIFRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDIsICMxMywgVGVtcDIKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDEsICMxMywgVGVtcDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDQsIHIweDAwZmYwMGZmLCBUZW1wNCwgTFNSICM1ICAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgIFRlbXAzLCByMHgwMGZmMDBmZiwgVGVtcDMsIExTUiAjNSAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wMiwgcjB4MDBmZjAwZmYsIFRlbXAyLCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDEsIHIweDAwZmYwMGZmLCBUZW1wMSwgTFNSICM1ICAgICAgICAgCi0gICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTEsIFRlbXAzLCBUZW1wNCwgTFNMICM4ICAgICAgICA7Ly8gW2QyIGMyIGQwIGMwXSAgICAgICAgICAgICAKLSAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMCwgVGVtcDEsIFRlbXAyLCBMU0wgIzggICAgICAgIDsvLyBbYjIgYTIgYjAgYTBdICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICBQS0hCVCAgICAgICBUZW1wMSwgVmFsdWVBMCwgVmFsdWVBMSwgTFNMICMxNiAgICAgOy8vIFtkMCBjMCBiMCBhMF0KLSAgICAgICAgU1VCUyAgICAgICAgQ291bnQsIENvdW50LCAjMQotICAgICAgICBTVFIgICAgICAgICBUZW1wMSwgW3BCdWZdLCAjOCAKLSAgICAgICAgUEtIVEIgICAgICAgVGVtcDIsIFZhbHVlQTEsIFZhbHVlQTAsIEFTUiAjMTYgICAgIDsvLyBbZDIgYzIgYjIgYTJdCi0gICAgICAgIFNUUiAgICAgICAgIFRlbXAyLCBbcEJ1Zl0sICM0ICAKLSAgICAgICAgCi0gICAgICAgIEJHVCAgICAgICAgIExvb3BTdGFydAotRW5kMgotICAgICAgICBTVUIgICAgICAgICBwU3JjMCwgcEJ1ZiwgIzMyLTgKLSAgICAgICAgTU9WICAgICAgICAgc3JjU3RlcDAsICM0Ci0KLSAgICAgICAgTV9FTkQKLQotICAgIEVORElGCi0gICAgCi0gICAgRU5ECi0gICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyM2VhY2UuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCi0KLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotCi0KLSAgICBJRiBBUk0xMTM2SlMgCi0KLQotICAgICAgICBNX0FMTE9DOCBwcERzdEFyZ3MsIDgKLSAgICAgICAgTV9BTExPQzggcFRlbXBSZXN1bHQxLCA4Ci0gICAgICAgIE1fQUxMT0M4IHBUZW1wUmVzdWx0MiwgOAotICAgICAgICBNX0FMTE9DNCBwcFNyYywgNAotICAgICAgICBNX0FMTE9DNCBwcERzdCwgNAotICAgICAgICBNX0FMTE9DNCBwRHN0U3RlcCwgNAotICAgICAgICBNX0FMTE9DNCBwU3JjU3RlcCwgNAotICAgICAgICBNX0FMTE9DNCBwQ291bnRlciwgNAotCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgOy8vIEZ1bmN0aW9uOiAKLSAgICAgICAgOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbXBsZW1lbnRzIGRpYWdvbmFsIGludGVycG9sYXRpb24gZm9yIGEgYmxvY2sgb2Ygc2l6ZSA0eDQuIElucHV0IGFuZCBvdXRwdXQgc2hvdWxkIAotICAgICAgICA7Ly8gYmUgYWxpZ25lZC4gCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KLSAgICAgICAgOy8vIHIwLHIxLHIyLHIzLCByOCB3aGVyZSByMCxyMiAgaW5wdXQgcG9pbnRlciBhbmQgcjEscjMgc3RlcCBzaXplLCByOCBpbnRlcm1lZGlhdGUtYnVmIHBvaW50ZXIKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KLSAgICAgICAgOy8vIHIwLHIxLHIyLHIzLHI0LHI1LHI2LHIxNAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KLSAgICAgICAgOy8vIHI3LHI4LHI5LHIxMCxyMTEscjEyCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT3V0cHV0IHJlZ2lzdGVycwotICAgICAgICA7Ly8gTm9uZS4gRnVuY3Rpb24gd2lsbCBwcmVzZXJ2ZSByMC1yMwotCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlLCByNgotICAgICAgICAKLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotcFNyYyAgICAgICAgICAgIFJOIDAKLXNyY1N0ZXAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgUk4gMgotZHN0U3RlcCAgICAgICAgIFJOIDMKLQotOy8vIERlY2xhcmUgaW5uZXIgbG9vcCByZWdpc3RlcnMKLUFjYzAgICAgICAgICAgICBSTiA0Ci1BY2MxICAgICAgICAgICAgUk4gNQotQWNjMiAgICAgICAgICAgIFJOIDYKLUFjYzMgICAgICAgICAgICBSTiA3Ci0KLVZhbEEgICAgICAgICAgICBSTiA0Ci1WYWxCICAgICAgICAgICAgUk4gNQotVmFsQyAgICAgICAgICAgIFJOIDYKLVZhbEQgICAgICAgICAgICBSTiA3Ci1WYWxFICAgICAgICAgICAgUk4gOAotVmFsRiAgICAgICAgICAgIFJOIDkKLVZhbEcgICAgICAgICAgICBSTiAxMgotVmFsSCAgICAgICAgICAgIFJOIDE0Ci1WYWxJICAgICAgICAgICAgUk4gMQotCi1UZW1wMSAgICAgICAgICAgUk4gMwotVGVtcDIgICAgICAgICAgIFJOIDEKLVRlbXAzICAgICAgICAgICBSTiAxMgotVGVtcDQgICAgICAgICAgIFJOIDcKLVRlbXA1ICAgICAgICAgICBSTiA1Ci1yMHgwZmUwMGZlMCAgICAgUk4gMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCAoMTYqMjU1IC0gMTYpIDAgKDE2KjI1NSAtIDE2KV0KLXIweDAwZmYwMGZmICAgICBSTiAxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFswIDI1NSAwIDI1NV0gd2hlcmUgMjU1IGlzIG9mZnNldAotQ291bnRlciAgICAgICAgIFJOIDExCi1wSW50ZXJCdWYgICAgICAgUk4gOAotCi1WYWxDQSAgICAgICAgICAgUk4gOAotVmFsREIgICAgICAgICAgIFJOIDkKLVZhbEdFICAgICAgICAgICBSTiAxMAotVmFsSEYgICAgICAgICAgIFJOIDExCi1yMHgwMDE0MDAwMSAgICAgUk4gMTIKLXIweDAwMTRmZmZiICAgICBSTiAxNAotCi1yMHgwMDAxZmMwMCAgICAgUk4gMTEKLQotQWNjeCAgICAgICAgICAgIFJOIDgKLUFjY3kgICAgICAgICAgICBSTiA5Ci1UZW1wNiAgICAgICAgICAgUk4gMTQKLQotICAgICAgICBNX1NUUkQgICAgICBwRHN0LCBkc3RTdGVwLCBwcERzdEFyZ3MKLQotICAgICAgICBNT1YgICAgICAgICBwRHN0LCBwSW50ZXJCdWYgICAgICAgICAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIGRzdFN0ZXAsICMxNgotCi0gICAgICAgIDsvLyBTZXQgdXAgY291bnRlciBvZiBmb3JtYXQsIFswXSAgWzBdICBbMSAoaGVpZ2h0KV0gIFs4ICh3aWR0aCldICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsICM0Ci0gICAgICAgIE1fU1RSICAgICAgIGRzdFN0ZXAsIHBEc3RTdGVwICAgICAgICAKLSAgICAgICAgTV9TVFIgICAgICAgc3JjU3RlcCwgcFNyY1N0ZXAgICAgICAgIAotICAgICAgICBMRFIgICAgICAgICByMHgwMGZmMDBmZiwgPTB4MDBmZjAwZmYgICAgICAgICAgICAgICA7Ly8gWzAgMjU1IDAgMjU1XSAyNTUgaXMgb2Zmc2V0IHRvIGF2b2lkIG5lZ2F0aXZlIHJlc3VsdHMgCi0KLUhlaWdodExvb3AKLU5leHRUd29Sb3dzTG9vcAotICAgICAgICBMRFIgICAgIFZhbEQsIFtwU3JjLCBzcmNTdGVwXSAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCByb3cgMSBbZDEgYzEgYjEgYTFdCi0gICAgICAgIExEUiAgICAgVmFsQSwgW3BTcmNdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHJvdyAwIFtkMCBjMCBiMCBhMF0KLSAgICAgICAgTERSICAgICBWYWxILCBbcFNyYywgc3JjU3RlcF0gICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtoMSBnMSBmMSBlMV0gICAgICAgIAotICAgICAgICBMRFIgICAgIFZhbEUsIFtwU3JjXSwgIzQgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2gwIGcwIGYwIGUwXQotICAgICAgICBMRFJCICAgIFRlbXAyLCBbcFNyYywgc3JjU3RlcF0gICAgICAgICAgICAgICAgICA7Ly8gTG9hZCByb3cgMSBbbDEgazEgajEgaTFdCi0gICAgICAgIExEUkIgICAgVGVtcDEsIFtwU3JjXSwgIy04ICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHJvdyAwIFtsMCBrMCBqMCBpMF0KLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgVmFsQiwgVmFsQSwgVmFsRCwgTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBbYjEgYTEgYjAgYTBdCi0gICAgICAgIFBLSFRCICAgVmFsRCwgVmFsRCwgVmFsQSwgQVNSICMxNiAgICAgICAgICAgICAgIDsvLyBbZDEgYzEgZDAgYzBdCi0gICAgICAgIFVYVEFCMTYgVmFsQSwgcjB4MDBmZjAwZmYsIFZhbEIgICAgICAgICAgICAgICAgIDsvLyBbMDAgYTEgMDAgYTBdICsgWzAgMjU1IDAgMjU1XQotICAgICAgICBVWFRBQjE2IFZhbEMsIHIweDAwZmYwMGZmLCBWYWxEICAgICAgICAgICAgICAgICA7Ly8gWzAwIGMxIDAwIGMwXSArIFswIDI1NSAwIDI1NV0KLSAgICAgICAgUEtIQlQgICBWYWxJLCBUZW1wMSwgVGVtcDIsIExTTCAjMTYgICAgICAgICAgICAgOy8vIFswMCBpMSAwMCBpMF0gICAgICAgICAgICAKLSAgICAgICAgUEtIQlQgICBWYWxGLCBWYWxFLCBWYWxILCBMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFtmMSBlMSBmMCBlMF0KLSAgICAgICAgUEtIVEIgICBWYWxILCBWYWxILCBWYWxFLCBBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFtoMSBnMSBoMCBnMF0KLSAgICAgICAgVVhUQUIxNiBWYWxFLCByMHgwMGZmMDBmZiwgVmFsRiAgICAgICAgICAgICAgICAgOy8vIFswMCBlMSAwMCBlMF0gKyBbMCAyNTUgMCAyNTVdCi0KLSAgICAgICAgOy8vIENhbGN1bGF0ZSBBY2MwCi0gICAgICAgIDsvLyBBY2MwID0gYSAtIDUqYiArIDIwKmMgKyAyMCpkIC0gNSplICsgZgotICAgICAgICBVWFRBQjE2IFRlbXAxLCBWYWxDLCBWYWxELCBST1IgIzgKLSAgICAgICAgVVhUQUIxNiBUZW1wMywgVmFsRSwgVmFsQiwgUk9SICM4Ci0gICAgICAgIFJTQiAgICAgVGVtcDEsIFRlbXAzLCBUZW1wMSwgTFNMICMyICAgICAgICAgICAgICAgIAotICAgICAgICBVWFRBQjE2IEFjYzAsIFZhbEEsIFZhbEYsIFJPUiAjOAotICAgICAgICBBREQgICAgIFRlbXAxLCBUZW1wMSwgVGVtcDEsIExTTCAjMiAgICAgICAgCi0gICAgICAgIEFERCAgICAgQWNjMCwgQWNjMCwgVGVtcDEgICAgICAgCi0KLSAgICAgICAgOy8vIENhbGN1bGF0ZSBBY2MxCi0gICAgICAgIDsvLyBBY2MxID0gYiAtIDUqYyArIDIwKmQgKyAyMCplIC0gNSpmICsgZwotICAgICAgICBVWFRBQjE2IFRlbXAxLCBWYWxFLCBWYWxELCBST1IgIzgKLSAgICAgICAgVVhUQUIxNiBUZW1wMywgVmFsQywgVmFsRiwgUk9SICM4Ci0gICAgICAgIFJTQiAgICAgVGVtcDEsIFRlbXAzLCBUZW1wMSwgTFNMICMyICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgVmFsRywgcjB4MDBmZjAwZmYsIFZhbEggICAgICAgICAgICAgICAgIDsvLyBbMDAgZzEgMDAgZzBdICsgWzAgMjU1IDAgMjU1XQotICAgICAgICBBREQgICAgIFRlbXAxLCBUZW1wMSwgVGVtcDEsIExTTCAjMiAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgQWNjMSwgVmFsRywgVmFsQiwgUk9SICM4Ci0gICAgICAgIEFERCAgICAgQWNjMSwgQWNjMSwgVGVtcDEgICAgICAgIAotCi0gICAgICAgIFVYVEFCMTYgQWNjMiwgVmFsQywgVmFsSCwgUk9SICM4ICAgICAgICAKLSAgICAgICAgQUREICAgICBWYWxJLCByMHgwMGZmMDBmZiwgVmFsSSAgICAgICAgICAgICAgICAgOy8vIFswMCBpMSAwMCBpMF0gKyBbMCAyNTUgMCAyNTVdICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBDYWxjdWxhdGUgQWNjMgotICAgICAgICA7Ly8gQWNjMiA9IGMgLSA1KmQgKyAyMCplICsgMjAqZiAtIDUqZyArIGgKLSAgICAgICAgVVhUQUIxNiBUZW1wMSwgVmFsRywgVmFsRCwgUk9SICM4Ci0gICAgICAgIFVYVEFCMTYgQWNjMywgVmFsSSwgVmFsRCwgUk9SICM4Ci0gICAgICAgIFVYVEFCMTYgVGVtcDIsIFZhbEUsIFZhbEYsIFJPUiAjOAotICAgICAgICAKLSAgICAgICAgUlNCICAgICBUZW1wMSwgVGVtcDEsIFRlbXAyLCBMU0wgIzIgICAgICAgIAotICAgICAgICBVWFRBQjE2IFRlbXAyLCBWYWxHLCBWYWxGLCBST1IgIzgKLSAgICAgICAgQUREICAgICBUZW1wMSwgVGVtcDEsIFRlbXAxLCBMU0wgIzIgICAgICAgIAotICAgICAgICBBREQgICAgIEFjYzIsIEFjYzIsIFRlbXAxICAgICAgICAKLQotICAgICAgICA7Ly8gQ2FsY3VsYXRlIEFjYzMKLSAgICAgICAgOy8vIEFjYzMgPSBkIC0gNSplICsgMjAqZiArIDIwKmcgLSA1KmggKyBpCi0gICAgICAgIFVYVEFCMTYgVGVtcDEsIFZhbEUsIFZhbEgsIFJPUiAjOAotICAgICAgICBSU0IgICAgIFRlbXAxLCBUZW1wMSwgVGVtcDIsIExTTCAjMgotICAgICAgICBBREQgICAgIFRlbXAxLCBUZW1wMSwgVGVtcDEsIExTTCAjMiAgICAgICAgCi0gICAgICAgIEFERCAgICAgQWNjMywgQWNjMywgVGVtcDEKLSAgICAgICAgCi0gICAgICAgIE1fTERSICAgZHN0U3RlcCwgcERzdFN0ZXAgICAgICAgIAotICAgICAgICBNX0xEUiAgIHNyY1N0ZXAsIHBTcmNTdGVwCi0KLSAgICAgICAgOy8vIElmIENvdW50ZXIgaXMgZXZlbiBzdG9yZSBBY2MwLUFjYzMgaW4gYSB0ZW1wb3JhcnkgYnVmZmVyCi0gICAgICAgIDsvLyBJZiBDb3VudGVyIGlzIG9mZiBzdG9yZSBBY2MwLUFjYzMgYW5kIHByZXZpb3VzIEFjYzAtQWNjMyBpbiBhIGludGVybWVkaWF0ZSBidWYgCi0gICAgICAgIEFORFMgICAgICAgIFRlbXAzLCBDb3VudGVyLCAjMQotICAgICAgICBCRVEgICAgICAgICBOb1Byb2Nlc3NpbmcgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFBhY2tpbmcgcHJldmlvdXMgYW5kIGN1cnJlbnQgQWNjMC1BY2MzIHZhbHVlcwotICAgICAgICBNX0xEUkQgICAgICBBY2N4LCBBY2N5LCBwVGVtcFJlc3VsdDEKLSAgICAgICAgUEtIQlQgICAgICAgVGVtcDYsIEFjY3gsIEFjYzAsIExTTCAjMTYgICAgICAgICAgOy8vWzAgYTIgMCBhMF0gPSBbMCBhMyAwIGEyXSBbMCBhMSAwIGEwXQotICAgICAgICBQS0hUQiAgICAgICBBY2MwLCBBY2MwLCBBY2N4LCBBU1IgIzE2ICAgICAgICAgICA7Ly9bMCBhMyAwIGExXSA9IFswIGExIDAgYTBdIFswIGEzIDAgYTJdIAotICAgICAgICBTVFIgICAgICAgICBBY2MwLCBbcERzdCwgZHN0U3RlcF0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU1RSICAgICAgICAgVGVtcDYsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFBLSEJUICAgICAgIFRlbXA2LCBBY2N5LCBBY2MxLCBMU0wgIzE2ICAgICAgICAgIDsvL1swIGIyIDAgYjBdID0gWzAgYjMgMCBiMl0gWzAgYjEgMCBiMF0KLSAgICAgICAgUEtIVEIgICAgICAgQWNjMSwgQWNjMSwgQWNjeSwgQVNSICMxNiAgICAgICAgICAgIDsvL1swIGIzIDAgYjFdID0gWzAgYjEgMCBiMF0gWzAgYjMgMCBiMl0KLSAgICAgICAgTV9MRFJEICAgICAgQWNjeCwgQWNjeSwgcFRlbXBSZXN1bHQyCi0gICAgICAgIFNUUiAgICAgICAgIEFjYzEsIFtwRHN0LCBkc3RTdGVwXSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBTVFIgICAgICAgICBUZW1wNiwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgICAgIFRlbXA2LCBBY2N4LCBBY2MyLCBMU0wgIzE2ICAgICAgICAgIDsvL1swIGMyIDAgYzBdID0gWzAgYzMgMCBjMl0gWzAgYzEgMCBjMF0KLSAgICAgICAgUEtIVEIgICAgICAgQWNjMiwgQWNjMiwgQWNjeCwgQVNSICMxNiAgICAgICAgICAgIDsvL1swIGMzIDAgYzFdID0gWzAgYzEgMCBjMF0gWzAgYzMgMCBjMl0KLSAgICAgICAgU1RSICAgICAgICAgQWNjMiwgW3BEc3QsIGRzdFN0ZXBdICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFNUUiAgICAgICAgIFRlbXA2LCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgIAotICAgICAgICBQS0hCVCAgICAgICBUZW1wNiwgQWNjeSwgQWNjMywgTFNMICMxNiAgICAgICAgICA7Ly9bMCBkMiAwIGQwXSA9IFswIGQzIDAgZDJdIFswIGQxIDAgZDBdCi0gICAgICAgIFBLSFRCICAgICAgIEFjYzMsIEFjYzMsIEFjY3ksIEFTUiAjMTYgICAgICAgICAgICA7Ly9bMCBkMyAwIGQxXSA9IFswIGQxIDAgZDBdIFswIGQzIDAgZDJdCi0gICAgICAgIFNUUiAgICAgICAgIEFjYzMsIFtwRHN0LCBkc3RTdGVwXSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBTVFIgICAgICAgICBUZW1wNiwgW3BEc3RdLCAjLTEyCi0gICAgICAgIEFERCAgICAgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgQWZ0ZXJTdG9yZQotCi1Ob1Byb2Nlc3NpbmcKLSAgICAgICAgTV9TVFJEICAgICAgQWNjMCwgQWNjMSwgcFRlbXBSZXN1bHQxCi0gICAgICAgIE1fU1RSRCAgICAgIEFjYzIsIEFjYzMsIHBUZW1wUmVzdWx0MgotQWZ0ZXJTdG9yZQotICAgICAgICBTVUJTICAgICAgICBDb3VudGVyLCBDb3VudGVyLCAjMSAgICAgICAgICAgICAgICA7Ly8gTG9vcCB0aWxsIGhlaWdodCBpcyAxMAotICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgQlBMICAgICAgICAgSGVpZ2h0TG9vcAotCi0gICAgICAgIFNUUiAgICAgICAgIEFjYzAsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgIDsvL1swIGExIDAgYTBdCi0gICAgICAgIFNUUiAgICAgICAgIEFjYzEsIFtwRHN0XSwgIzQKLSAgICAgICAgU1RSICAgICAgICAgQWNjMiwgW3BEc3RdLCAjNAotICAgICAgICBTVFIgICAgICAgICBBY2MzLCBbcERzdF0sICMtMTIKLSAgICAgICAgCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uIHVzaW5nIG11bHRpcGxpY2F0aW9uCi0gICAgICAgIDsvLwotICAgIAotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzIKLSAgICAgICAgTU9WICAgICAgICAgc3JjU3RlcCwgIzE2Ci0gICAgICAgIE1fTERSRCAgICAgIHBEc3QsIGRzdFN0ZXAsIHBwRHN0QXJncwotCi0gICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsICM0Ci0gICAgICAgIExEUiAgICAgICAgIHIweDAwMTRmZmZiLCA9MHgwMDE0ZmZmYgotICAgICAgICBMRFIgICAgICAgICByMHgwMDE0MDAwMSwgPTB4MDAxNDAwMDEKLQotSGVpZ2h0TG9vcDEKLSAgICAgICAgTV9TVFIgICAgICAgQ291bnRlciwgcENvdW50ZXIKLQotICAgICAgICBNX0xEUiAgICAgICBWYWxDQSwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgOy8vIExvYWQgIFswIGMgMCBhXQotICAgICAgICBNX0xEUiAgICAgICBWYWxEQiwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgOy8vIExvYWQgIFswIGQgMCBiXQotICAgICAgICBNX0xEUiAgICAgICBWYWxHRSwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgOy8vIExvYWQgIFswIGcgMCBlXQotICAgICAgICBNX0xEUiAgICAgICBWYWxIRiwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgOy8vIExvYWQgIFswIGggMCBmXQotCi0KLSAgICAgICAgOy8vIEFjYzAgPSBzbXVhZCAoWzAgMjAgMCAxXSwgYWRkKFswIGMgMCBhXSArIFswIGQgMCBmXSkpIC0gKDUgKiAoYiArIGUpKSAKLSAgICAgICAgOy8vIEFjYzEgPSBzbXVhZCAoWzAgMjAgMCAxXSwgYWRkKFswIGUgMCBnXSArIFswIGQgMCBiXSkpIC0gKDUgKiAoYyArIGYpKSAKLSAgICAgICAgOy8vIEFjYzIgPSBzbXVhZCAoWzAgMSAwIDIwXSwgYWRkKFswIGMgMCBlXSArIFswIGggMCBmXSkpIC0gKDUgKiAoZCArIGcpKSAKLSAgICAgICAgOy8vIEFjYzMgPSBzbXVhZCAoWzAgMjAgMCAxXSwgYWRkKFswIGQgMCBmXSArIFswIGkgMCBnXSkpIC0gKDUgKiAoZSArIGgpKSAKLQotICAgICAgICBTTVVBRCAgICAgICBBY2MwLCBWYWxDQSwgcjB4MDAxNDAwMDEgICAgICAgICAgICA7Ly8gQWNjMCAgPSBbMCBjIDAgYV0gKiBbMCAyMCAwIDFdCi0gICAgICAgIFNNVUFEICAgICAgIEFjYzEsIFZhbERCLCByMHgwMDE0MDAwMSAgICAgICAgICAgIDsvLyBBY2MxICA9IFswIGMgMCBhXSAqIFswIDIwIDAgMV0KLSAgICAgICAgU01VQURYICAgICAgQWNjMiwgVmFsR0UsIHIweDAwMTRmZmZiICAgICAgICAgICAgOy8vIEFjYzIgID0gWzAgZyAwIGVdICogWzAgMjAgMCAtNV0KLSAgICAgICAgU01VQUQgICAgICAgQWNjMywgVmFsR0UsIHIweDAwMTRmZmZiICAgICAgICAgICAgOy8vIEFjYzMgID0gWzAgZyAwIGVdICogWzAgMjAgMCAtNV0KLQotICAgICAgICBTTUxBRCAgICAgICBBY2MwLCBWYWxEQiwgcjB4MDAxNGZmZmIsIEFjYzAgICAgICA7Ly8gQWNjMCArPSBbMCBkIDAgYl0gKiBbMCAyMCAwIC01XQotICAgICAgICBTTUxBRFggICAgICBBY2MxLCBWYWxHRSwgcjB4MDAxNDAwMDEsIEFjYzEgICAgICA7Ly8gQWNjMSArPSBbMCBnIDAgZV0gKiBbMCAyMCAwIDFdCi0gICAgICAgIFNNTEFEWCAgICAgIEFjYzIsIFZhbEhGLCByMHgwMDE0MDAwMSwgQWNjMiAgICAgIDsvLyBBY2MyICs9IFswIGggMCBmXSAqIFswIDIwIDAgMV0KLSAgICAgICAgU01MQURYICAgICAgQWNjMywgVmFsSEYsIHIweDAwMTRmZmZiLCBBY2MzICAgICAgOy8vIEFjYzMgKz0gWzAgaCAwIGZdICogWzAgMjAgMCAtNV0KLQotICAgICAgICBTTUxBQkIgICAgICBBY2MwLCBWYWxHRSwgcjB4MDAxNGZmZmIsIEFjYzAgICAgICA7Ly8gQWNjMCArPSBbMCBnIDAgZV0gKiBbMCAwIDAgLTVdCi0gICAgICAgIFNNTEFUQiAgICAgIEFjYzEsIFZhbENBLCByMHgwMDE0ZmZmYiwgQWNjMSAgICAgIDsvLyBBY2MxICs9IFswIGQgMCBiXSAqIFswIDAgMCAtNV0KLSAgICAgICAgU01MQVRCICAgICAgQWNjMiwgVmFsQ0EsIHIweDAwMTQwMDAxLCBBY2MyICAgICAgOy8vIEFjYzIgKz0gWzAgYyAwIGFdICogWzAgMCAwIDFdCi0gICAgICAgIFNNTEFUQiAgICAgIEFjYzMsIFZhbERCLCByMHgwMDE0MDAwMSwgQWNjMyAgICAgIDsvLyBBY2MzICs9IFswIGMgMCBhXSAqIFswIDAgMCAxXQotCi0gICAgICAgIExEUkggICAgICAgIFZhbENBLCBbcFNyY10sICM0ICAgICAgICAgICAgICAgICAgIDsvLyA4ID0gc3JjU3RlcCAtIDE2Ci0gICAgICAgIFNNTEFCQiAgICAgIEFjYzAsIFZhbEhGLCByMHgwMDE0MDAwMSwgQWNjMCAgICAgIDsvLyBBY2MwICs9IFswIGggMCBmXSAqIFswIDAgMCAxXSAgICAgICAgCi0gICAgICAgIFNNTEFCQiAgICAgIEFjYzEsIFZhbEhGLCByMHgwMDE0ZmZmYiwgQWNjMSAgICAgIDsvLyBBY2MxICs9IFswIGggMCBmXSAqIFswIDAgMCAtNV0KLSAgICAgICAgU01MQVRCICAgICAgQWNjMiwgVmFsREIsIHIweDAwMTRmZmZiLCBBY2MyICAgICAgOy8vIEFjYzIgKz0gWzAgZCAwIGJdICogWzAgMCAwIC01XSAgICAgICAgCi0gICAgICAgIFNNTEFCQiAgICAgIEFjYzMsIFZhbENBLCByMHgwMDE0MDAwMSwgQWNjMyAgICAgIDsvLyBBY2MzICs9IFswIGQgMCBiXSAqIFswIDAgMCAxXQotICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgcjB4MDAwMWZjMDAsID0weDAwMDFmYzAwICAgICAgICAgICAgOy8vICgweGZmICogMTYgKiAzMikgLSA1MTIKLSAgICAgICAgU1VCICAgICAgICAgQWNjMCwgQWNjMCwgcjB4MDAwMWZjMDAgICAgICAgIAotICAgICAgICBTVUIgICAgICAgICBBY2MxLCBBY2MxLCByMHgwMDAxZmMwMCAgICAgICAgCi0gICAgICAgIFNVQiAgICAgICAgIEFjYzIsIEFjYzIsIHIweDAwMDFmYzAwICAgICAgICAKLSAgICAgICAgU1VCICAgICAgICAgQWNjMywgQWNjMywgcjB4MDAwMWZjMDAgICAgICAgIAotCi0gICAgICAgIFVTQVQgICAgICAgIEFjYzAsICMxOCwgQWNjMAotICAgICAgICBVU0FUICAgICAgICBBY2MxLCAjMTgsIEFjYzEKLSAgICAgICAgVVNBVCAgICAgICAgQWNjMiwgIzE4LCBBY2MyCi0gICAgICAgIFVTQVQgICAgICAgIEFjYzMsICMxOCwgQWNjMwotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgQWNjMCwgQWNjMCwgTFNSICMxMAotICAgICAgICBNX1NUUkIgICAgICBBY2MwLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgTU9WICAgICAgICAgQWNjMSwgQWNjMSwgTFNSICMxMAotICAgICAgICBNX1NUUkIgICAgICBBY2MxLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgTU9WICAgICAgICAgQWNjMiwgQWNjMiwgTFNSICMxMAotICAgICAgICBNX1NUUkIgICAgICBBY2MyLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgTU9WICAgICAgICAgQWNjMywgQWNjMywgTFNSICMxMAotICAgICAgICBNX1NUUkIgICAgICBBY2MzLCBbcERzdF0sIGRzdFN0ZXAKLQotCi0gICAgICAgIE1fTERSICAgICAgIENvdW50ZXIsIHBDb3VudGVyCi0gICAgICAgIFNVQiAgICAgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMgotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzIKLSAgICAgICAgQUREICAgICAgICAgcERzdCwgcERzdCwgIzEKLSAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzEKLSAgICAgICAgQkdUICAgICAgICAgSGVpZ2h0TG9vcDEKLUVuZAotICAgICAgICBTVUIgICAgICAgICBwRHN0LCBwRHN0LCAjNAotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMTYKLQotICAgICAgICBNX0VORAotICAgIAotICAgIEVORElGCi0gICAgCi0gICAgRU5ECi0gICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlN2M1YzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0KLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQotCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAKLSAgICAKLSAgICAKLQotICAgIElGIEFSTTExMzZKUyAKLSAgICAgICAgCi0gICAgICAgIE1fQUxMT0M4IHBwRHN0QXJncywgOAotICAgICAgICBNX0FMTE9DNCBwcFNyYywgNAotICAgICAgICBNX0FMTE9DNCBwcERzdCwgNAotICAgICAgICBNX0FMTE9DNCBwQ291bnRlciwgNAotCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgOy8vIEZ1bmN0aW9uOgotICAgICAgICA7Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIEltcGxlbWVudHMgZGlhZ29uYWwgaW50ZXJwb2xhdGlvbiBmb3IgYSBibG9jayBvZiBzaXplIDR4NC4gSW5wdXQgYW5kIG91dHB1dCBzaG91bGQgCi0gICAgICAgIDsvLyBiZSBhbGlnbmVkLiAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgotICAgICAgICA7Ly8gcjAscjEscjIscjMsIHI4IHdoZXJlIHIwLHIyICBpbnB1dCBwb2ludGVyIGFuZCByMSxyMyBzdGVwIHNpemUsIHI4IGludGVybWVkaWF0ZS1idWYgcG9pbnRlcgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgotICAgICAgICA7Ly8gcjAscjEscjIscjMscjQscjUscjYscjE0Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgotICAgICAgICA7Ly8gcjcscjgscjkscjEwLHIxMSxyMTIKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXQgcmVnaXN0ZXJzCi0gICAgICAgIDsvLyBOb25lLiBGdW5jdGlvbiB3aWxsIHByZXNlcnZlIHIwLXIzCi0KLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUsIHI2Ci0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotcFNyYyAgICAgICAgICAgIFJOIDAKLXNyY1N0ZXAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgUk4gMgotZHN0U3RlcCAgICAgICAgIFJOIDMKLQotOy8vIERlY2xhcmUgaW5uZXIgbG9vcCByZWdpc3RlcnMKLVZhbEEgICAgICAgICAgICBSTiA1Ci1WYWxBMCAgICAgICAgICAgUk4gNAotVmFsQTEgICAgICAgICAgIFJOIDUKLVZhbEFGMCAgICAgICAgICBSTiA0Ci1WYWxBRjEgICAgICAgICAgUk4gNQotCi1WYWxCICAgICAgICAgICAgUk4gMTEKLQotVmFsQyAgICAgICAgICAgIFJOIDUKLVZhbEMwICAgICAgICAgICBSTiA0Ci1WYWxDMSAgICAgICAgICAgUk4gNQotVmFsQ0QwICAgICAgICAgIFJOIDEyCi1WYWxDRDEgICAgICAgICAgUk4gMTQKLVZhbENGMCAgICAgICAgICBSTiA0Ci1WYWxDRjEgICAgICAgICAgUk4gNQotCi1WYWxEICAgICAgICAgICAgUk4gMTAKLQotVmFsRSAgICAgICAgICAgIFJOIDcKLVZhbEUwICAgICAgICAgICBSTiA2Ci1WYWxFMSAgICAgICAgICAgUk4gNwotVmFsRUIwICAgICAgICAgIFJOIDEwCi1WYWxFQjEgICAgICAgICAgUk4gMTEKLVZhbEVEMCAgICAgICAgICBSTiA2Ci1WYWxFRDEgICAgICAgICAgUk4gNwotCi1WYWxGICAgICAgICAgICAgUk4gMTAKLQotVmFsRyAgICAgICAgICAgIFJOIDE0Ci1WYWxHMCAgICAgICAgICAgUk4gMTIKLVZhbEcxICAgICAgICAgICBSTiAxNAotVmFsR0IwICAgICAgICAgIFJOIDEyCi1WYWxHQjEgICAgICAgICAgUk4gMTQKLQotQWNjMCAgICAgICAgICAgIFJOIDQKLUFjYzEgICAgICAgICAgICBSTiA1Ci1BY2MyICAgICAgICAgICAgUk4gNgotQWNjMyAgICAgICAgICAgIFJOIDcKLQotVGVtcCAgICAgICAgICAgIFJOIDcKLVN0ZXAgICAgICAgICAgICBSTiA2Ci0KLXBJbnRlckJ1ZiAgICAgICBSTiA4Ci1Db3VudGVyICAgICAgICAgUk4gOAotcjB4MDBmZjAwZmYgICAgIFJOIDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFswIDI1NSAwIDI1NV0gd2hlcmUgMjU1IGlzIG9mZnNldAotcjB4MDAwMWZjMDAgICAgIFJOIDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFswICgxNioyNTUgLSAxNikgMCAoMTYqMjU1IC0gMTYpXQotCi0gICAgCi07Ly8gRGVjbGFyZSBpbm5lciBsb29wIHJlZ2lzdGVycwotVmFsQ0EgICAgICAgICAgIFJOIDgKLVZhbERCICAgICAgICAgICBSTiA5Ci1WYWxHRSAgICAgICAgICAgUk4gMTAKLVZhbEhGICAgICAgICAgICBSTiAxMQotcjB4MDAxNDAwMDEgICAgIFJOIDEyCi1yMHgwMDE0ZmZmYiAgICAgUk4gMTQKLQotcjB4MDAwMDAyMDAgICAgIFJOIDEyCi1yMHgwMDAwMDBmZiAgICAgUk4gMTIKLSAgICAgICAgCi0gICAgICAgIE1fU1RSRCAgICAgIHBEc3QsIGRzdFN0ZXAsIHBwRHN0QXJncwotICAgICAgICBNT1YgICAgICAgICBwRHN0LCBwSW50ZXJCdWYgICAgICAgICAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIGRzdFN0ZXAsICMyNAotCi0gICAgICAgIDsvLyBTZXQgdXAgY291bnRlciBvZiBmb3JtYXQsIFswXSAgWzBdICBbMSAoaGVpZ2h0KV0gIFs4ICh3aWR0aCldICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsICMxCi0gICAgICAgIE1PViAgICAgICAgIFRlbXAsICM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgQ291bnRlciwgVGVtcCwgQ291bnRlciwgTFNMICM4ICAgICAgICA7Ly8gWzAgMCBIIFddICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICByMHgwMGZmMDBmZiwgPTB4MDBmZjAwZmYgICAgICAgICAgICAgICAgOy8vIFswIDI1NSAwIDI1NV0gMjU1IGlzIG9mZnNldCB0byBhdm9pZCBuZWdhdGl2ZSByZXN1bHRzIAotV2lkdGhMb29wCi0gICAgICAgIE1fU1RSICAgICAgIHBTcmMsIHBwU3JjCi0gICAgICAgIE1fU1RSICAgICAgIHBEc3QsIHBwRHN0Ci1IZWlnaHRMb29wCi1Ud29Sb3dzTG9vcAotICAgICAgICBNX0xEUiAgICAgICBWYWxDLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtjMyBjMiBjMSBjMF0KLSAgICAgICAgTV9MRFIgICAgICAgVmFsRCwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbZDMgZDIgZDEgZDBdCi0gICAgICAgIE1fTERSICAgICAgIFZhbEUsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2UzIGUyIGUxIGUwXSAgICAgICAgCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMiAgICAgICAgICAgICAgICAKLSAgICAgICAgVVhUQUIxNiAgICAgVmFsQzAsIHIweDAwZmYwMGZmLCBWYWxDICAgICAgICAgICAgICAgIDsvLyBbMCBjMiAwIGMwXSArIFswIDI1NSAwIDI1NV0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsQzEsIHIweDAwZmYwMGZmLCBWYWxDLCBST1IgIzggICAgICAgIDsvLyBbMCBjMyAwIGMxXSArIFswIDI1NSAwIDI1NV0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBWYWxCLCBbcFNyY10gICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtiMyBiMiBiMSBiMF0gICAgICAgIAotICAgICAgICBVWFRBQjE2ICAgICBWYWxFMCwgcjB4MDBmZjAwZmYsIFZhbEUgICAgICAgICAgICAgICAgOy8vIFswIGUyIDAgZTBdICsgWzAgMjU1IDAgMjU1XQotICAgICAgICBVWFRBQjE2ICAgICBWYWxFMSwgcjB4MDBmZjAwZmYsIFZhbEUsIFJPUiAjOCAgICAgICAgOy8vIFswIGUzIDAgZTFdICsgWzAgMjU1IDAgMjU1XSAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbENEMCwgVmFsQzAsIFZhbEQgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgYzIgMCBjMF0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZDIgMCBkMF0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsQ0QxLCBWYWxDMSwgVmFsRCwgUk9SICM4ICAgICAgICAgICAgIDsvLyBbMCBjMyAwIGMxXSArIFswIDI1NSAwIDI1NV0gKyBbMCBkMyAwIGQxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEVCMCwgVmFsRTAsIFZhbEIgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgZTIgMCBlMF0gKyBbMCAyNTUgMCAyNTVdICsgWzAgYjIgMCBiMF0KLSAgICAgICAgUlNCICAgICAgICAgVmFsQ0QwLCBWYWxFQjAsIFZhbENEMCwgTFNMICMyICAgICAgICAgIDsvLyA0KihPZmYrQytEKSAtIChPZmYrQitFKQotICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgVmFsRCwgW3BTcmMsIHNyY1N0ZXAsIExTTCAjMV0gICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbZDMgZDIgZDEgZDBdCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEVCMSwgVmFsRTEsIFZhbEIsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgZTMgMCBlMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgYjMgMCBiMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBSU0IgICAgICAgICBWYWxDRDEsIFZhbEVCMSwgVmFsQ0QxLCBMU0wgIzIgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBVWFRBQjE2ICAgICBWYWxFRDAsIFZhbEUwLCBWYWxEICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGUyIDAgZTBdICsgWzAgMjU1IDAgMjU1XSArIFswIGQyIDAgZDBdCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEVEMSwgVmFsRTEsIFZhbEQsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgZTMgMCBlMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZDMgMCBkMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIFZhbEYsIFtwU3JjLCBzcmNTdGVwLCBMU0wgIzJdICAgICAgICAgICA7Ly8gTG9hZCAgW2YzIGYyIGYxIGYwXQotICAgICAgICBNX0xEUiAgICAgICBWYWxCLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtiMyBiMiBiMSBiMF0gICAgICAgICAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIFZhbENEMCwgVmFsQ0QwLCBWYWxDRDAsIExTTCAjMiAgICAgICAgICA7Ly8gNSAqIFs0KihPZmYrQytEKSAtIChPZmYrQitFKV0KLSAgICAgICAgQUREICAgICAgICAgVmFsQ0QxLCBWYWxDRDEsIFZhbENEMSwgTFNMICMyICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVhUQUIxNiAgICAgVmFsQ0YxLCBWYWxDMSwgVmFsRiwgUk9SICM4ICAgICAgICAgICAgIDsvLyBbMCBjMyAwIGMxXSArIFswIDI1NSAwIDI1NV0gKyBbMCBmMyAwIGYxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbENGMCwgVmFsQzAsIFZhbEYgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgYzIgMCBjMF0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZjIgMCBmMF0gICAgICAgIAotICAgICAgICBSU0IgICAgICAgICBWYWxFRDEsIFZhbENGMSwgVmFsRUQxLCBMU0wgIzIgICAgICAgIAotICAgICAgICAKLSAgICAgICAgU1VCICAgICAgICAgVmFsQSwgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIExEUiAgICAgICAgIFZhbEEsIFtWYWxBXSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2EzIGEyIGExIGEwXQotICAgICAgICBSU0IgICAgICAgICBWYWxFRDAsIFZhbENGMCwgVmFsRUQwLCBMU0wgIzIgICAgICAgICAgOy8vIDQqKE9mZitFK0QpIC0gKE9mZitDK0YpICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgVmFsRUQxLCBWYWxFRDEsIFZhbEVEMSwgTFNMICMyICAgICAgICAgIAotICAgICAgICBBREQgICAgICAgICBWYWxFRDAsIFZhbEVEMCwgVmFsRUQwLCBMU0wgIzIgICAgICAgICAgOy8vIDUgKiBbNCooT2ZmK0UrRCkgLSAoT2ZmK0MrRildCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEEwLCByMHgwMGZmMDBmZiwgVmFsQSAgICAgICAgICAgICAgICA7Ly8gWzAgYTIgMCBhMF0gKyBbMCAyNTUgMCAyNTVdCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEExLCByMHgwMGZmMDBmZiwgVmFsQSwgUk9SICM4ICAgICAgICA7Ly8gWzAgYTMgMCBhMV0gKyBbMCAyNTUgMCAyNTVdCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEFGMCwgVmFsQTAsIFZhbEYgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgYTIgMCBhMF0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZjIgMCBmMF0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsQUYxLCBWYWxBMSwgVmFsRiwgUk9SICM4ICAgICAgICAgICAgIDsvLyBbMCBhMyAwIGExXSArIFswIDI1NSAwIDI1NV0gKyBbMCBmMyAwIGYxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgQWNjMSwgVmFsQ0QxLCBWYWxBRjEgICAgICAgIAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgVmFsRywgW3BTcmMsIHNyY1N0ZXAsIExTTCAjMl0gICAgICAgICAgIDsvLyBMb2FkICBbZzMgZzIgZzEgZzBdCi0gICAgICAgIEFERCAgICAgICAgIEFjYzAsIFZhbENEMCwgVmFsQUYwICAgICAgICAgICAgICAgICAgICA7Ly8gQWNjMCA9IDE2Kk9mZiArIChBK0YpICsgMjAqKEMrRCkgLSA1KihCK0UpICAgICAgICAKLSAgICAgICAgU1RSICAgICAgICAgQWNjMSwgW3BEc3QsICM0XSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSByZXN1bHQgJiBhZGp1c3QgcG9pbnRlcgotICAgICAgICBNX1NUUiAgICAgICBBY2MwLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHJlc3VsdCAmIGFkanVzdCBwb2ludGVyCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEcwLCByMHgwMGZmMDBmZiwgVmFsRyAgICAgICAgICAgICAgICA7Ly8gWzAgZzIgMCBnMF0gKyBbMCAyNTUgMCAyNTVdCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEcxLCByMHgwMGZmMDBmZiwgVmFsRywgUk9SICM4ICAgICAgICA7Ly8gWzAgZzMgMCBnMV0gKyBbMCAyNTUgMCAyNTVdCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEdCMCwgVmFsRzAsIFZhbEIgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgZzIgMCBnMF0gKyBbMCAyNTUgMCAyNTVdICsgWzAgYjIgMCBiMF0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsR0IxLCBWYWxHMSwgVmFsQiwgUk9SICM4ICAgICAgICAgICAgIDsvLyBbMCBnMyAwIGcxXSArIFswIDI1NSAwIDI1NV0gKyBbMCBiMyAwIGIxXSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBBREQgICAgICAgICBBY2MyLCBWYWxFRDAsIFZhbEdCMCAgICAgICAgICAgICAgICAgICAgOy8vIEFjYzIgPSAxNipPZmYgKyAoQitHKSArIDIwKihEK0UpIC0gNSooQytGKQotICAgICAgICBBREQgICAgICAgICBBY2MzLCBWYWxFRDEsIFZhbEdCMSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBTVFIgICAgICAgICBBY2MzLCBbcERzdCwgIzRdICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHJlc3VsdCAmIGFkanVzdCBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIE1fU1RSICAgICAgIEFjYzIsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcmVzdWx0ICYgYWRqdXN0IHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzEgPDwgOCAgICAgICAgICAgICAgIDsvLyBMb29wIHRpbGwgaGVpZ2h0IGlzIDEwCi0gICAgICAgIEFERCAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBCUEwgICAgICAgICBIZWlnaHRMb29wCi0gICAgICAgIAotICAgICAgICBNX0xEUiAgICAgICBwU3JjLCBwcFNyYwotICAgICAgICBNX0xEUiAgICAgICBwRHN0LCBwcERzdAotICAgICAgICBBRERTICAgICAgICBDb3VudGVyLCBDb3VudGVyLCAjKDEgPDwgOCktNCAgICAgICAgICAgOy8vIExvb3AgdGlsbCB3aWR0aCBpcyAxMgotICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjLCAjNAotICAgICAgICBBREQgICAgICAgICBwRHN0LCBwRHN0LCAjOAotICAgICAgICBBREQgICAgICAgICBDb3VudGVyLCBDb3VudGVyLCAjMTw8OAotICAgICAgICBCUEwgICAgICAgICBXaWR0aExvb3AKLSAgICAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBIb3Jpem9udGFsIGludGVycG9sYXRpb24gdXNpbmcgbXVsdGlwbGljYXRpb24KLSAgICAgICAgOy8vCi0gICAgCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBEc3QsICMyNAotICAgICAgICBNT1YgICAgICAgICBzcmNTdGVwLCAjMjQKLSAgICAgICAgTV9MRFJEICAgICAgcERzdCwgZHN0U3RlcCwgcHBEc3RBcmdzCi0KLSAgICAgICAgTU9WICAgICAgICAgQ291bnRlciwgIzQKLSAgICAgICAgTERSICAgICAgICAgcjB4MDAxNGZmZmIsID0weDAwMTRmZmZiCi0gICAgICAgIExEUiAgICAgICAgIHIweDAwMTQwMDAxLCA9MHgwMDE0MDAwMQotCi1IZWlnaHRMb29wMQotICAgICAgICBNX1NUUiAgICAgICBDb3VudGVyLCBwQ291bnRlcgotCi0KLSAgICAgICAgTERSICAgICAgICAgVmFsQ0EsIFtwU3JjXSwgIzQgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFswIGMgMCBhXQotICAgICAgICBMRFIgICAgICAgICBWYWxEQiwgW3BTcmNdLCAjNCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgWzAgZCAwIGJdCi0gICAgICAgIExEUiAgICAgICAgIFZhbEdFLCBbcFNyY10sICM0ICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbMCBnIDAgZV0KLSAgICAgICAgTERSICAgICAgICAgVmFsSEYsIFtwU3JjXSwgIzQgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFswIGggMCBmXQotCi0gICAgICAgIDsvLyBBY2MwID0gc211YWQgKFswIDIwIDAgMV0sIGFkZChbMCBjIDAgYV0gKyBbMCBkIDAgZl0pKSAtICg1ICogKGIgKyBlKSkgCi0gICAgICAgIDsvLyBBY2MxID0gc211YWQgKFswIDIwIDAgMV0sIGFkZChbMCBlIDAgZ10gKyBbMCBkIDAgYl0pKSAtICg1ICogKGMgKyBmKSkgCi0gICAgICAgIDsvLyBBY2MyID0gc211YWQgKFswIDEgMCAyMF0sIGFkZChbMCBjIDAgZV0gKyBbMCBoIDAgZl0pKSAtICg1ICogKGQgKyBnKSkgCi0gICAgICAgIDsvLyBBY2MzID0gc211YWQgKFswIDIwIDAgMV0sIGFkZChbMCBkIDAgZl0gKyBbMCBpIDAgZ10pKSAtICg1ICogKGUgKyBoKSkgCi0gICAgICAgIFNNVUFEICAgICAgIEFjYzAsIFZhbENBLCByMHgwMDE0MDAwMSAgICAgICAgICAgIDsvLyBBY2MwICA9IFswIGMgMCBhXSAqIFswIDIwIDAgMV0KLSAgICAgICAgU01VQUQgICAgICAgQWNjMSwgVmFsREIsIHIweDAwMTQwMDAxICAgICAgICAgICAgOy8vIEFjYzEgID0gWzAgYyAwIGFdICogWzAgMjAgMCAxXQotICAgICAgICBTTVVBRFggICAgICBBY2MyLCBWYWxHRSwgcjB4MDAxNGZmZmIgICAgICAgICAgICA7Ly8gQWNjMiAgPSBbMCBnIDAgZV0gKiBbMCAyMCAwIC01XQotICAgICAgICBTTVVBRCAgICAgICBBY2MzLCBWYWxHRSwgcjB4MDAxNGZmZmIgICAgICAgICAgICA7Ly8gQWNjMyAgPSBbMCBnIDAgZV0gKiBbMCAyMCAwIC01XQotCi0gICAgICAgIFNNTEFEICAgICAgIEFjYzAsIFZhbERCLCByMHgwMDE0ZmZmYiwgQWNjMCAgICAgIDsvLyBBY2MwICs9IFswIGQgMCBiXSAqIFswIDIwIDAgLTVdCi0gICAgICAgIFNNTEFEWCAgICAgIEFjYzEsIFZhbEdFLCByMHgwMDE0MDAwMSwgQWNjMSAgICAgIDsvLyBBY2MxICs9IFswIGcgMCBlXSAqIFswIDIwIDAgMV0KLSAgICAgICAgU01MQURYICAgICAgQWNjMiwgVmFsSEYsIHIweDAwMTQwMDAxLCBBY2MyICAgICAgOy8vIEFjYzIgKz0gWzAgaCAwIGZdICogWzAgMjAgMCAxXQotICAgICAgICBTTUxBRFggICAgICBBY2MzLCBWYWxIRiwgcjB4MDAxNGZmZmIsIEFjYzMgICAgICA7Ly8gQWNjMyArPSBbMCBoIDAgZl0gKiBbMCAyMCAwIC01XQotCi0gICAgICAgIFNNTEFCQiAgICAgIEFjYzAsIFZhbEdFLCByMHgwMDE0ZmZmYiwgQWNjMCAgICAgIDsvLyBBY2MwICs9IFswIGcgMCBlXSAqIFswIDAgMCAtNV0KLSAgICAgICAgU01MQVRCICAgICAgQWNjMSwgVmFsQ0EsIHIweDAwMTRmZmZiLCBBY2MxICAgICAgOy8vIEFjYzEgKz0gWzAgZCAwIGJdICogWzAgMCAwIC01XQotICAgICAgICBTTUxBVEIgICAgICBBY2MyLCBWYWxDQSwgcjB4MDAxNDAwMDEsIEFjYzIgICAgICA7Ly8gQWNjMiArPSBbMCBjIDAgYV0gKiBbMCAwIDAgMV0KLSAgICAgICAgU01MQVRCICAgICAgQWNjMywgVmFsREIsIHIweDAwMTQwMDAxLCBBY2MzICAgICAgOy8vIEFjYzMgKz0gWzAgYyAwIGFdICogWzAgMCAwIDFdCi0KLSAgICAgICAgTERSSCAgICAgICAgVmFsQ0EsIFtwU3JjXSwgIzggICAgICAgICAgICAgICAgICAgOy8vIDggPSBzcmNTdGVwIC0gMTYKLSAgICAgICAgU01MQUJCICAgICAgQWNjMCwgVmFsSEYsIHIweDAwMTQwMDAxLCBBY2MwICAgICAgOy8vIEFjYzAgKz0gWzAgaCAwIGZdICogWzAgMCAwIDFdICAgICAgICAKLSAgICAgICAgU01MQUJCICAgICAgQWNjMSwgVmFsSEYsIHIweDAwMTRmZmZiLCBBY2MxICAgICAgOy8vIEFjYzEgKz0gWzAgaCAwIGZdICogWzAgMCAwIC01XQotICAgICAgICBTTUxBVEIgICAgICBBY2MyLCBWYWxEQiwgcjB4MDAxNGZmZmIsIEFjYzIgICAgICA7Ly8gQWNjMiArPSBbMCBkIDAgYl0gKiBbMCAwIDAgLTVdICAgICAgICAKLSAgICAgICAgU01MQUJCICAgICAgQWNjMywgVmFsQ0EsIHIweDAwMTQwMDAxLCBBY2MzICAgICAgOy8vIEFjYzMgKz0gWzAgZCAwIGJdICogWzAgMCAwIDFdCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICByMHgwMDAxZmMwMCwgPTB4MDAwMWZjMDAgICAgICAgICAgICA7Ly8gKDB4ZmYgKiAxNiAqIDMyKSAtIDUxMgotICAgICAgICBTVUIgICAgICAgICBBY2MwLCBBY2MwLCByMHgwMDAxZmMwMCAgICAgICAgCi0gICAgICAgIFNVQiAgICAgICAgIEFjYzEsIEFjYzEsIHIweDAwMDFmYzAwICAgICAgICAKLSAgICAgICAgU1VCICAgICAgICAgQWNjMiwgQWNjMiwgcjB4MDAwMWZjMDAgICAgICAgIAotICAgICAgICBTVUIgICAgICAgICBBY2MzLCBBY2MzLCByMHgwMDAxZmMwMCAgICAgICAgCi0KLSAgICAgICAgVVNBVCAgICAgICAgQWNjMCwgIzE4LCBBY2MwCi0gICAgICAgIFVTQVQgICAgICAgIEFjYzEsICMxOCwgQWNjMQotICAgICAgICBVU0FUICAgICAgICBBY2MyLCAjMTgsIEFjYzIKLSAgICAgICAgVVNBVCAgICAgICAgQWNjMywgIzE4LCBBY2MzCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBBY2MwLCBBY2MwLCBMU1IgIzEwCi0gICAgICAgIE1PViAgICAgICAgIEFjYzEsIEFjYzEsIExTUiAjMTAKLSAgICAgICAgTU9WICAgICAgICAgQWNjMiwgQWNjMiwgTFNSICMxMAotICAgICAgICBNT1YgICAgICAgICBBY2MzLCBBY2MzLCBMU1IgIzEwCi0KLSAgICAgICAgTV9MRFIgICAgICAgQ291bnRlciwgcENvdW50ZXIgICAgICAgIAotICAgICAgICBPUlIgICAgICAgICBBY2MwLCBBY2MwLCBBY2MxLCBMU0wgIzgKLSAgICAgICAgT1JSICAgICAgICAgQWNjMiwgQWNjMiwgQWNjMywgTFNMICM4Ci0gICAgICAgIFNVQlMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICMxCi0gICAgICAgIE9SUiAgICAgICAgIEFjYzAsIEFjYzAsIEFjYzIsIExTTCAjMTYKLSAgICAgICAgTV9TVFIgICAgICAgQWNjMCwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIEJHVCAgICAgICAgIEhlaWdodExvb3AxCi1FbmQKLSAgICAgICAgU1VCICAgICAgICAgcERzdCwgcERzdCwgZHN0U3RlcCwgTFNMICMyCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMgotCi0gICAgICAgIE1fRU5ECi0gICAgCi0gICAgRU5ESUYKLSAgICAKLSAgICBFTkQKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYWY3NWEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0gICAgICAgIAotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKLQotREVCVUdfT04gICAgU0VUTCB7RkFMU0V9Ci0KLQotICAgIElGIEFSTTExMzZKUwotCi07Ly8gRnVuY3Rpb246IAotOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQotOy8vCi07Ly8gSW1wbGVtZW50cyBob3Jpem9udGFsIGludGVycG9sYXRpb24gZm9yIGEgYmxvY2sgb2Ygc2l6ZSA0eDQuIElucHV0IGFuZCBvdXRwdXQgc2hvdWxkIAotOy8vIGJlIGFsaWduZWQuIAotOy8vCi07Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KLTsvLyByMCxyMSxyMixyMyB3aGVyZSByMCxyMiAgaW5wdXQgcG9pbnRlciBhbmQgcjEscjMgY29ycmVzcG9uZGluZyBzdGVwIHNpemUKLTsvLwotOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgotOy8vIHIwLHIxLHIyLHIzLHI0LHI1LHI2LHIxNAotOy8vCi07Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgotOy8vIHI3LHI4LHI5LHIxMCxyMTEscjEyCi07Ly8KLTsvLyBPdXRwdXQgcmVnaXN0ZXJzCi07Ly8gTm9uZS4gRnVuY3Rpb24gd2lsbCBwcmVzZXJ2ZSByMC1yMwotCi0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotcFNyYyAgICAgICAgICAgIFJOIDAKLXNyY1N0ZXAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgUk4gMgotZHN0U3RlcCAgICAgICAgIFJOIDMKLQotOy8vIERlY2xhcmUgaW5uZXIgbG9vcCByZWdpc3RlcnMKLUFjYzAgICAgICAgICAgICBSTiA0Ci1BY2MxICAgICAgICAgICAgUk4gNQotQWNjMiAgICAgICAgICAgIFJOIDYKLUFjYzMgICAgICAgICAgICBSTiA3Ci0KLVZhbEEgICAgICAgICAgICBSTiA0Ci1WYWxCICAgICAgICAgICAgUk4gNQotVmFsQyAgICAgICAgICAgIFJOIDYKLVZhbEQgICAgICAgICAgICBSTiA3Ci1WYWxFICAgICAgICAgICAgUk4gOAotVmFsRiAgICAgICAgICAgIFJOIDkKLVZhbEcgICAgICAgICAgICBSTiAxMgotVmFsSCAgICAgICAgICAgIFJOIDE0Ci1WYWxJICAgICAgICAgICAgUk4gMQotCi1UZW1wMSAgICAgICAgICAgUk4gMwotVGVtcDIgICAgICAgICAgIFJOIDEKLVRlbXAzICAgICAgICAgICBSTiAxMgotVGVtcDQgICAgICAgICAgIFJOIDcKLVRlbXA1ICAgICAgICAgICBSTiA1Ci1yMHgwZmUwMGZlMCAgICAgUk4gMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCAoMTYqMjU1IC0gMTYpIDAgKDE2KjI1NSAtIDE2KV0KLXIweDAwZmYwMGZmICAgICBSTiAxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFswIDI1NSAwIDI1NV0gd2hlcmUgMjU1IGlzIG9mZnNldAotQ291bnRlciAgICAgICAgIFJOIDExCi0KLUhlaWdodCAgICAgICAgICBSTiAzCi0KLSAgICAgICAgTV9BTExPQzQgcERzdFN0ZXAsIDQKLSAgICAgICAgTV9BTExPQzQgcFNyY1N0ZXAsIDQKLQotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUsIHI2Ci0gICAgICAgIAotICAgICAgICBNT1YgICAgIENvdW50ZXIsICMyCi0gICAgICAgIE1fU1RSICAgZHN0U3RlcCwgcERzdFN0ZXAgICAgICAgIAotICAgICAgICBNX1NUUiAgIHNyY1N0ZXAsIHBTcmNTdGVwICAgICAgICAKLSAgICAgICAgTERSICAgICByMHgwMGZmMDBmZiwgPTB4MDBmZjAwZmYgICAgICAgICAgICAgICA7Ly8gWzAgMjU1IDAgMjU1XSAyNTUgaXMgb2Zmc2V0IHRvIGF2b2lkIG5lZ2F0aXZlIHJlc3VsdHMgCi0KLU5leHRUd29Sb3dzTG9vcAotICAgICAgICBMRFIgICAgIFZhbEQsIFtwU3JjLCBzcmNTdGVwXSAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCByb3cgMSBbZDEgYzEgYjEgYTFdCi0gICAgICAgIExEUiAgICAgVmFsQSwgW3BTcmNdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHJvdyAwIFtkMCBjMCBiMCBhMF0KLSAgICAgICAgTERSICAgICBWYWxILCBbcFNyYywgc3JjU3RlcF0gICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtoMSBnMSBmMSBlMV0gICAgICAgIAotICAgICAgICBMRFIgICAgIFZhbEUsIFtwU3JjXSwgIzQgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2gwIGcwIGYwIGUwXQotICAgICAgICBMRFJCICAgIFRlbXAyLCBbcFNyYywgc3JjU3RlcF0gICAgICAgICAgICAgICAgICA7Ly8gTG9hZCByb3cgMSBbbDEgazEgajEgaTFdCi0gICAgICAgIExEUkIgICAgVGVtcDEsIFtwU3JjXSwgIy04ICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHJvdyAwIFtsMCBrMCBqMCBpMF0KLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgVmFsQiwgVmFsQSwgVmFsRCwgTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBbYjEgYTEgYjAgYTBdCi0gICAgICAgIFBLSFRCICAgVmFsRCwgVmFsRCwgVmFsQSwgQVNSICMxNiAgICAgICAgICAgICAgIDsvLyBbZDEgYzEgZDAgYzBdCi0gICAgICAgIFVYVEFCMTYgVmFsQSwgcjB4MDBmZjAwZmYsIFZhbEIgICAgICAgICAgICAgICAgIDsvLyBbMDAgYTEgMDAgYTBdICsgWzAgMjU1IDAgMjU1XQotICAgICAgICBVWFRBQjE2IFZhbEMsIHIweDAwZmYwMGZmLCBWYWxEICAgICAgICAgICAgICAgICA7Ly8gWzAwIGMxIDAwIGMwXSArIFswIDI1NSAwIDI1NV0KLSAgICAgICAgUEtIQlQgICBWYWxJLCBUZW1wMSwgVGVtcDIsIExTTCAjMTYgICAgICAgICAgICAgOy8vIFswMCBpMSAwMCBpMF0gICAgICAgICAgICAKLSAgICAgICAgUEtIQlQgICBWYWxGLCBWYWxFLCBWYWxILCBMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFtmMSBlMSBmMCBlMF0KLSAgICAgICAgUEtIVEIgICBWYWxILCBWYWxILCBWYWxFLCBBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFtoMSBnMSBoMCBnMF0KLSAgICAgICAgVVhUQUIxNiBWYWxFLCByMHgwMGZmMDBmZiwgVmFsRiAgICAgICAgICAgICAgICAgOy8vIFswMCBlMSAwMCBlMF0gKyBbMCAyNTUgMCAyNTVdCi0KLSAgICAgICAgOy8vIENhbGN1bGF0ZSBBY2MwCi0gICAgICAgIDsvLyBBY2MwID0gYSAtIDUqYiArIDIwKmMgKyAyMCpkIC0gNSplICsgZgotICAgICAgICBVWFRBQjE2IFRlbXAxLCBWYWxDLCBWYWxELCBST1IgIzgKLSAgICAgICAgVVhUQUIxNiBUZW1wMywgVmFsRSwgVmFsQiwgUk9SICM4Ci0gICAgICAgIFJTQiAgICAgVGVtcDEsIFRlbXAzLCBUZW1wMSwgTFNMICMyICAgICAgICAgICAgICAgIAotICAgICAgICBVWFRBQjE2IEFjYzAsIFZhbEEsIFZhbEYsIFJPUiAjOAotICAgICAgICBBREQgICAgIFRlbXAxLCBUZW1wMSwgVGVtcDEsIExTTCAjMiAgICAgICAgCi0gICAgICAgIEFERCAgICAgQWNjMCwgQWNjMCwgVGVtcDEgICAgICAgCi0KLSAgICAgICAgOy8vIENhbGN1bGF0ZSBBY2MxCi0gICAgICAgIDsvLyBBY2MxID0gYiAtIDUqYyArIDIwKmQgKyAyMCplIC0gNSpmICsgZwotICAgICAgICBVWFRBQjE2IFRlbXAxLCBWYWxFLCBWYWxELCBST1IgIzgKLSAgICAgICAgVVhUQUIxNiBUZW1wMywgVmFsQywgVmFsRiwgUk9SICM4Ci0gICAgICAgIFJTQiAgICAgVGVtcDEsIFRlbXAzLCBUZW1wMSwgTFNMICMyICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgVmFsRywgcjB4MDBmZjAwZmYsIFZhbEggICAgICAgICAgICAgICAgIDsvLyBbMDAgZzEgMDAgZzBdICsgWzAgMjU1IDAgMjU1XQotICAgICAgICBBREQgICAgIFRlbXAxLCBUZW1wMSwgVGVtcDEsIExTTCAjMiAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgQWNjMSwgVmFsRywgVmFsQiwgUk9SICM4Ci0gICAgICAgIEFERCAgICAgQWNjMSwgQWNjMSwgVGVtcDEgICAgICAgIAotCi0gICAgICAgIExEUiAgICAgcjB4MGZlMDBmZTAsID0weDBmZTAwZmUwICAgICAgICAgICAgICAgIDsvLyAweDBmZTAwZmUwID0gKDE2ICogT2Zmc2V0KSAtIDE2IHdoZXJlIE9mZnNldCBpcyAyNTUgICAgICAgIAotICAgICAgICBVWFRBQjE2IEFjYzIsIFZhbEMsIFZhbEgsIFJPUiAjOCAgICAgICAgCi0gICAgICAgIEFERCAgICAgVmFsSSwgcjB4MDBmZjAwZmYsIFZhbEkgICAgICAgICAgICAgICAgIDsvLyBbMDAgaTEgMDAgaTBdICsgWzAgMjU1IDAgMjU1XSAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgQWNjMCwgQWNjMCwgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBVUVNVQjE2IEFjYzEsIEFjYzEsIHIweDBmZTAwZmUwCi0gICAgICAgIFVTQVQxNiAgQWNjMCwgIzEzLCBBY2MwCi0gICAgICAgIFVTQVQxNiAgQWNjMSwgIzEzLCBBY2MxICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBDYWxjdWxhdGUgQWNjMgotICAgICAgICA7Ly8gQWNjMiA9IGMgLSA1KmQgKyAyMCplICsgMjAqZiAtIDUqZyArIGgKLSAgICAgICAgVVhUQUIxNiBUZW1wMSwgVmFsRywgVmFsRCwgUk9SICM4Ci0gICAgICAgIFVYVEFCMTYgQWNjMywgVmFsSSwgVmFsRCwgUk9SICM4Ci0gICAgICAgIFVYVEFCMTYgVGVtcDIsIFZhbEUsIFZhbEYsIFJPUiAjOAotICAgICAgICBBTkQgICAgIEFjYzEsIHIweDAwZmYwMGZmLCBBY2MxLCBMU1IgIzUKLSAgICAgICAgQU5EICAgICBBY2MwLCByMHgwMGZmMDBmZiwgQWNjMCwgTFNSICM1Ci0gICAgICAgIE9SUiAgICAgQWNjMCwgQWNjMCwgQWNjMSwgTFNMICM4ICAgICAgICAKLSAgICAgICAgUlNCICAgICBUZW1wNSwgVGVtcDEsIFRlbXAyLCBMU0wgIzIgICAgICAgIAotICAgICAgICBVWFRBQjE2IFRlbXAyLCBWYWxHLCBWYWxGLCBST1IgIzgKLSAgICAgICAgQUREICAgICBUZW1wNSwgVGVtcDUsIFRlbXA1LCBMU0wgIzIgICAgICAgIAotICAgICAgICBBREQgICAgIEFjYzIsIEFjYzIsIFRlbXA1ICAgICAgICAKLQotICAgICAgICA7Ly8gQ2FsY3VsYXRlIEFjYzMKLSAgICAgICAgOy8vIEFjYzMgPSBkIC0gNSplICsgMjAqZiArIDIwKmcgLSA1KmggKyBpCi0gICAgICAgIFVYVEFCMTYgVGVtcDUsIFZhbEUsIFZhbEgsIFJPUiAjOAotICAgICAgICBSU0IgICAgIFRlbXA1LCBUZW1wNSwgVGVtcDIsIExTTCAjMgotICAgICAgICBMRFIgICAgIHIweDBmZTAwZmUwLCA9MHgwZmUwMGZlMAotICAgICAgICBBREQgICAgIFRlbXA1LCBUZW1wNSwgVGVtcDUsIExTTCAjMiAgICAgICAgCi0gICAgICAgIEFERCAgICAgQWNjMywgQWNjMywgVGVtcDUKLSAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgQWNjMywgQWNjMywgcjB4MGZlMDBmZTAgICAgICAgIAotICAgICAgICBVUVNVQjE2IEFjYzIsIEFjYzIsIHIweDBmZTAwZmUwICAgICAgICAKLSAgICAgICAgVVNBVDE2ICBBY2MzLCAjMTMsIEFjYzMKLSAgICAgICAgVVNBVDE2ICBBY2MyLCAjMTMsIEFjYzIgICAgICAgIAotCi0gICAgICAgIE1fTERSICAgZHN0U3RlcCwgcERzdFN0ZXAKLSAgICAgICAgQU5EICAgICBBY2MzLCByMHgwMGZmMDBmZiwgQWNjMywgTFNSICM1Ci0gICAgICAgIEFORCAgICAgQWNjMiwgcjB4MDBmZjAwZmYsIEFjYzIsIExTUiAjNQotICAgICAgICBPUlIgICAgIEFjYzIsIEFjYzIsIEFjYzMsIExTTCAjOAotICAgICAgICAKLSAgICAgICAgU1VCUyAgICBDb3VudGVyLCBDb3VudGVyLCAjMQotICAgICAgICBNX0xEUiAgIHNyY1N0ZXAsIHBTcmNTdGVwCi0gICAgICAgIFBLSEJUICAgQWNjMSwgQWNjMCwgQWNjMiwgTFNMICMxNiAgIAotICAgICAgICBNX1NUUiAgIEFjYzEsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcmVzdWx0MQotICAgICAgICBQS0hUQiAgIEFjYzIsIEFjYzIsIEFjYzAsIEFTUiAjMTYgICAKLSAgICAgICAgTV9TVFIgICBBY2MyLCBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHJlc3VsdDIKLSAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgCi0gICAgICAgIEJHVCAgICAgTmV4dFR3b1Jvd3NMb29wCi1FbmQKLSAgICAgICAgU1VCICAgICBwRHN0LCBwRHN0LCBkc3RTdGVwLCBMU0wgIzIKLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzIKLQotICAgICAgICBNX0VORAotICAgIAotICAgIEVORElGCi0KLSAgICBFTkQKLSAgICAKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA2Y2JmMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucworKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0gICAgICAgCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQotCi0KLSAgICAKLSAgICBJRiBBUk0xMTM2SlMKLSAgICAKLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotCi0gICAgICAgIDsvLyBGdW5jdGlvbjogCi0gICAgICAgIDsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUgIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIEltcGxlbWVudHMgdmVydGljYWwgaW50ZXJwb2xhdGlvbiBmb3IgYSBibG9jayBvZiBzaXplIDR4NC4gSW5wdXQgYW5kIG91dHB1dCBzaG91bGQgCi0gICAgICAgIDsvLyBiZSBhbGlnbmVkLiAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgotICAgICAgICA7Ly8gcjAscjEscjIscjMgd2hlcmUgcjAscjIgIGlucHV0IHBvaW50ZXIgYW5kIHIxLHIzIGNvcnJlc3BvbmRpbmcgc3RlcCBzaXplCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCi0gICAgICAgIDsvLyByMCxyMSxyMixyMyxyNCxyNSxyNixyMTQKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCi0gICAgICAgIDsvLyByNyxyOCxyOSxyMTAscjExLHIxMgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dCByZWdpc3RlcnMKLSAgICAgICAgOy8vIE5vbmUuIEZ1bmN0aW9uIHdpbGwgcHJlc2VydmUgcjAtcjMKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZSwgcjYKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi1wU3JjICAgICAgICAgICAgUk4gMAotc3JjU3RlcCAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICBSTiAyCi1kc3RTdGVwICAgICAgICAgUk4gMwotCi07Ly8gRGVjbGFyZSBpbm5lciBsb29wIHJlZ2lzdGVycwotVmFsQSAgICAgICAgICAgIFJOIDUKLVZhbEEwICAgICAgICAgICBSTiA0Ci1WYWxBMSAgICAgICAgICAgUk4gNQotVmFsQUYwICAgICAgICAgIFJOIDQKLVZhbEFGMSAgICAgICAgICBSTiA1Ci0KLVZhbEIgICAgICAgICAgICBSTiAxMQotCi1WYWxDICAgICAgICAgICAgUk4gNQotVmFsQzAgICAgICAgICAgIFJOIDQKLVZhbEMxICAgICAgICAgICBSTiA1Ci1WYWxDRDAgICAgICAgICAgUk4gMTIKLVZhbENEMSAgICAgICAgICBSTiAxNAotVmFsQ0YwICAgICAgICAgIFJOIDQKLVZhbENGMSAgICAgICAgICBSTiA1Ci0KLVZhbEQgICAgICAgICAgICBSTiAxMAotCi1WYWxFICAgICAgICAgICAgUk4gNwotVmFsRTAgICAgICAgICAgIFJOIDYKLVZhbEUxICAgICAgICAgICBSTiA3Ci1WYWxFQjAgICAgICAgICAgUk4gMTAKLVZhbEVCMSAgICAgICAgICBSTiAxMQotVmFsRUQwICAgICAgICAgIFJOIDYKLVZhbEVEMSAgICAgICAgICBSTiA3Ci0KLVZhbEYgICAgICAgICAgICBSTiAxMAotCi1WYWxHICAgICAgICAgICAgUk4gMTQKLVZhbEcwICAgICAgICAgICBSTiAxMgotVmFsRzEgICAgICAgICAgIFJOIDE0Ci1WYWxHQjAgICAgICAgICAgUk4gMTIKLVZhbEdCMSAgICAgICAgICBSTiAxNAotCi1BY2MwICAgICAgICAgICAgUk4gNAotQWNjMSAgICAgICAgICAgIFJOIDUKLUFjYzIgICAgICAgICAgICBSTiA2Ci1BY2MzICAgICAgICAgICAgUk4gNwotCi1UZW1wICAgICAgICAgICAgUk4gNwotSGVpZ2h0ICAgICAgICAgIFJOIDMKLVN0ZXAgICAgICAgICAgICBSTiA2Ci0KLUNvdW50ZXIgICAgICAgICBSTiA4Ci1yMHgwMGZmMDBmZiAgICAgUk4gOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgMjU1IDAgMjU1XSB3aGVyZSAyNTUgaXMgb2Zmc2V0Ci1yMHgwZmUwMGZlMCAgICAgUk4gMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgKDE2KjI1NSAtIDE2KSAwICgxNioyNTUgLSAxNildCi0KLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIHIweDAwZmYwMGZmLCA9MHgwMGZmMDBmZiAgICAgICAgICAgICAgICA7Ly8gWzAgMjU1IDAgMjU1XSAyNTUgaXMgb2Zmc2V0IHRvIGF2b2lkIG5lZ2F0aXZlIHJlc3VsdHMgCi0gICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsICMyCi0gICAgICAgIAotVHdvUm93c0xvb3AKLSAgICAgICAgTV9MRFIgICAgICAgVmFsQywgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkICBbYzMgYzIgYzEgYzBdCi0gICAgICAgIE1fTERSICAgICAgIFZhbEQsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2QzIGQyIGQxIGQwXQotICAgICAgICBNX0xEUiAgICAgICBWYWxFLCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtlMyBlMiBlMSBlMF0gICAgICAgIAotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzIgICAgICAgICAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIFZhbEIsIFtwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2IzIGIyIGIxIGIwXSAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEMwLCByMHgwMGZmMDBmZiwgVmFsQyAgICAgICAgICAgICAgICA7Ly8gWzAgYzIgMCBjMF0gKyBbMCAyNTUgMCAyNTVdCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEMxLCByMHgwMGZmMDBmZiwgVmFsQywgUk9SICM4ICAgICAgICA7Ly8gWzAgYzMgMCBjMV0gKyBbMCAyNTUgMCAyNTVdICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEUwLCByMHgwMGZmMDBmZiwgVmFsRSAgICAgICAgICAgICAgICA7Ly8gWzAgZTIgMCBlMF0gKyBbMCAyNTUgMCAyNTVdCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEUxLCByMHgwMGZmMDBmZiwgVmFsRSwgUk9SICM4ICAgICAgICA7Ly8gWzAgZTMgMCBlMV0gKyBbMCAyNTUgMCAyNTVdICAgICAgICAKLSAgICAgICAgVVhUQUIxNiAgICAgVmFsQ0QwLCBWYWxDMCwgVmFsRCAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBjMiAwIGMwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBkMiAwIGQwXQotICAgICAgICBVWFRBQjE2ICAgICBWYWxDRDEsIFZhbEMxLCBWYWxELCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGMzIDAgYzFdICsgWzAgMjU1IDAgMjU1XSArIFswIGQzIDAgZDFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVhUQUIxNiAgICAgVmFsRUIwLCBWYWxFMCwgVmFsQiAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBlMiAwIGUwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBiMiAwIGIwXQotICAgICAgICBSU0IgICAgICAgICBWYWxDRDAsIFZhbEVCMCwgVmFsQ0QwLCBMU0wgIzIgICAgICAgICAgOy8vIDQqKE9mZitDK0QpIC0gKE9mZitCK0UpCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBWYWxELCBbcFNyYywgc3JjU3RlcCwgTFNMICMxXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgIFtkMyBkMiBkMSBkMF0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsRUIxLCBWYWxFMSwgVmFsQiwgUk9SICM4ICAgICAgICAgICAgIDsvLyBbMCBlMyAwIGUxXSArIFswIDI1NSAwIDI1NV0gKyBbMCBiMyAwIGIxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFJTQiAgICAgICAgIFZhbENEMSwgVmFsRUIxLCBWYWxDRDEsIExTTCAjMiAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAotICAgICAgICBVWFRBQjE2ICAgICBWYWxFRDAsIFZhbEUwLCBWYWxEICAgICAgICAgICAgICAgICAgICAgOy8vIFswIGUyIDAgZTBdICsgWzAgMjU1IDAgMjU1XSArIFswIGQyIDAgZDBdCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEVEMSwgVmFsRTEsIFZhbEQsIFJPUiAjOCAgICAgICAgICAgICA7Ly8gWzAgZTMgMCBlMV0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZDMgMCBkMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgVmFsRiwgW3BTcmMsIHNyY1N0ZXAsIExTTCAjMl0gICAgICAgICAgIDsvLyBMb2FkICBbZjMgZjIgZjEgZjBdCi0gICAgICAgIE1fTERSICAgICAgIFZhbEIsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2IzIGIyIGIxIGIwXSAgICAgICAgICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgVmFsQ0QwLCBWYWxDRDAsIFZhbENEMCwgTFNMICMyICAgICAgICAgIDsvLyA1ICogWzQqKE9mZitDK0QpIC0gKE9mZitCK0UpXQotICAgICAgICBBREQgICAgICAgICBWYWxDRDEsIFZhbENEMSwgVmFsQ0QxLCBMU0wgIzIgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBVWFRBQjE2ICAgICBWYWxDRjEsIFZhbEMxLCBWYWxGLCBST1IgIzggICAgICAgICAgICAgOy8vIFswIGMzIDAgYzFdICsgWzAgMjU1IDAgMjU1XSArIFswIGYzIDAgZjFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVhUQUIxNiAgICAgVmFsQ0YwLCBWYWxDMCwgVmFsRiAgICAgICAgICAgICAgICAgICAgIDsvLyBbMCBjMiAwIGMwXSArIFswIDI1NSAwIDI1NV0gKyBbMCBmMiAwIGYwXQotICAgICAgICBSU0IgICAgICAgICBWYWxFRDEsIFZhbENGMSwgVmFsRUQxLCBMU0wgIzIgICAgICAgIAotICAgICAgICAKLSAgICAgICAgU1VCICAgICAgICAgVmFsQSwgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIExEUiAgICAgICAgIFZhbEEsIFtWYWxBXSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCAgW2EzIGEyIGExIGEwXQotICAgICAgICBSU0IgICAgICAgICBWYWxFRDAsIFZhbENGMCwgVmFsRUQwLCBMU0wgIzIgICAgICAgICAgOy8vIDQqKE9mZitFK0QpIC0gKE9mZitDK0YpICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgVmFsRUQxLCBWYWxFRDEsIFZhbEVEMSwgTFNMICMyICAgICAgICAgIAotICAgICAgICBBREQgICAgICAgICBWYWxFRDAsIFZhbEVEMCwgVmFsRUQwLCBMU0wgIzIgICAgICAgICAgOy8vIDUgKiBbNCooT2ZmK0UrRCkgLSAoT2ZmK0MrRildCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEEwLCByMHgwMGZmMDBmZiwgVmFsQSAgICAgICAgICAgICAgICA7Ly8gWzAgYTIgMCBhMF0gKyBbMCAyNTUgMCAyNTVdCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEExLCByMHgwMGZmMDBmZiwgVmFsQSwgUk9SICM4ICAgICAgICA7Ly8gWzAgYTMgMCBhMV0gKyBbMCAyNTUgMCAyNTVdCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEFGMCwgVmFsQTAsIFZhbEYgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgYTIgMCBhMF0gKyBbMCAyNTUgMCAyNTVdICsgWzAgZjIgMCBmMF0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsQUYxLCBWYWxBMSwgVmFsRiwgUk9SICM4ICAgICAgICAgICAgIDsvLyBbMCBhMyAwIGExXSArIFswIDI1NSAwIDI1NV0gKyBbMCBmMyAwIGYxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICByMHgwZmUwMGZlMCwgPTB4MGZlMDBmZTAgICAgICAgICAgICAgICAgOy8vIFswIDI1NSAwIDI1NV0gMjU1IGlzIG9mZnNldCB0byBhdm9pZCBuZWdhdGl2ZSByZXN1bHRzIAotICAgICAgICBBREQgICAgICAgICBBY2MxLCBWYWxDRDEsIFZhbEFGMSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBWYWxHLCBbcFNyYywgc3JjU3RlcCwgTFNMICMyXSAgICAgICAgICAgOy8vIExvYWQgIFtnMyBnMiBnMSBnMF0KLSAgICAgICAgQUREICAgICAgICAgQWNjMCwgVmFsQ0QwLCBWYWxBRjAgICAgICAgICAgICAgICAgICAgIDsvLyBBY2MwID0gMTYqT2ZmICsgKEErRikgKyAyMCooQytEKSAtIDUqKEIrRSkgICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBBY2MxLCBBY2MxLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgOy8vIEFjYzEgLT0gKDE2Kk9mZiAtIDE2KQotICAgICAgICBVUVNVQjE2ICAgICBBY2MwLCBBY2MwLCByMHgwZmUwMGZlMCAgICAgICAgCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEcwLCByMHgwMGZmMDBmZiwgVmFsRyAgICAgICAgICAgICAgICA7Ly8gWzAgZzIgMCBnMF0gKyBbMCAyNTUgMCAyNTVdCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEcxLCByMHgwMGZmMDBmZiwgVmFsRywgUk9SICM4ICAgICAgICA7Ly8gWzAgZzMgMCBnMV0gKyBbMCAyNTUgMCAyNTVdCi0gICAgICAgIFVYVEFCMTYgICAgIFZhbEdCMCwgVmFsRzAsIFZhbEIgICAgICAgICAgICAgICAgICAgICA7Ly8gWzAgZzIgMCBnMF0gKyBbMCAyNTUgMCAyNTVdICsgWzAgYjIgMCBiMF0KLSAgICAgICAgVVhUQUIxNiAgICAgVmFsR0IxLCBWYWxHMSwgVmFsQiwgUk9SICM4ICAgICAgICAgICAgIDsvLyBbMCBnMyAwIGcxXSArIFswIDI1NSAwIDI1NV0gKyBbMCBiMyAwIGIxXSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBBREQgICAgICAgICBBY2MyLCBWYWxFRDAsIFZhbEdCMCAgICAgICAgICAgICAgICAgICAgOy8vIEFjYzIgPSAxNipPZmYgKyAoQitHKSArIDIwKihEK0UpIC0gNSooQytGKQotICAgICAgICBBREQgICAgICAgICBBY2MzLCBWYWxFRDEsIFZhbEdCMSAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIEFjYzMsIEFjYzMsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICA7Ly8gQWNjMyAtPSAoMTYqT2ZmIC0gMTYpCi0gICAgICAgIFVRU1VCMTYgICAgIEFjYzIsIEFjYzIsIHIweDBmZTAwZmUwICAgICAgICAKLSAgICAgICAgVVNBVDE2ICAgICAgQWNjMSwgIzEzLCBBY2MxICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTYXR1cmF0ZSB0byA4KzUgPSAxMyBiaXRzCi0gICAgICAgIFVTQVQxNiAgICAgIEFjYzAsICMxMywgQWNjMAotICAgICAgICBVU0FUMTYgICAgICBBY2MzLCAjMTMsIEFjYzMgICAgICAgIAotICAgICAgICBVU0FUMTYgICAgICBBY2MyLCAjMTMsIEFjYzIKLSAgICAgICAgQU5EICAgICAgICAgQWNjMSwgcjB4MDBmZjAwZmYsIEFjYzEsIExTUiAjNSAgICAgICAgIDsvLyBbMCBhMyAwIGExXQotICAgICAgICBBTkQgICAgICAgICBBY2MwLCByMHgwMGZmMDBmZiwgQWNjMCwgTFNSICM1ICAgICAgICAgOy8vIFswIGEyIDAgYTBdCi0gICAgICAgIE9SUiAgICAgICAgIEFjYzAsIEFjYzAsIEFjYzEsIExTTCAjOCAgICAgICAgICAgICAgICA7Ly8gW2EzIGEyIGExIGEwXQotICAgICAgICBBTkQgICAgICAgICBBY2MzLCByMHgwMGZmMDBmZiwgQWNjMywgTFNSICM1ICAgICAgICAgOy8vIFswIGIzIDAgYjFdCi0gICAgICAgIEFORCAgICAgICAgIEFjYzIsIHIweDAwZmYwMGZmLCBBY2MyLCBMU1IgIzUgICAgICAgICA7Ly8gWzAgYjIgMCBiMF0KLSAgICAgICAgCi0gICAgICAgIE1fU1RSICAgICAgIEFjYzAsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcmVzdWx0ICYgYWRqdXN0IHBvaW50ZXIKLSAgICAgICAgT1JSICAgICAgICAgQWNjMiwgQWNjMiwgQWNjMywgTFNMICM4ICAgICAgICAgICAgICAgIDsvLyBbYjMgYjIgYjEgYjBdICAgICAgICAKLSAgICAgICAgTV9TVFIgICAgICAgQWNjMiwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSByZXN1bHQgJiBhZGp1c3QgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgCi0gICAgICAgIFNVQlMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICMxCi0gICAgICAgIEJHVCAgICAgICAgIFR3b1Jvd3NMb29wCi1FbmQKLSAgICAgICAgU1VCICAgICBwRHN0LCBwRHN0LCBkc3RTdGVwLCBMU0wgIzIKLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzIKLQotICAgICAgICBNX0VORAotICAgIAotICAgIEVORElGCi0gICAgCi0gICAgRU5ECi0gICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWJmNjdjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLSAgICAgICAgCi0gICAgSUYgQVJNMTEzNkpTCi0KLTsvLyBpbnB1dCByZWdpc3RlcnMKLQotcFNyYyAgICAgICAgICAgICAgICAgUk4gMAotaVNyY1N0ZXAgICAgICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgICAgICAgUk4gMgotaURzdFN0ZXAgICAgICAgICAgICAgUk4gMwotaVdpZHRoICAgICAgICAgICAgICAgUk4gNAotaUhlaWdodCAgICAgICAgICAgICAgUk4gNQotZHggICAgICAgICAgICAgICAgICAgUk4gNgotZHkgICAgICAgICAgICAgICAgICAgUk4gNwotCi0KLTsvLyBsb2NhbCB2YXJpYWJsZSByZWdpc3RlcnMKLXRlbXAgICAgICAgICAgICAgICAgIFJOIDExCi1yMHgyMCAgICAgICAgICAgICAgICBSTiAxMgotdG1wMHgyMCAgICAgICAgICAgICAgUk4gMTQKLXJldHVybiAgICAgICAgICAgICAgIFJOIDAKLWR4UGx1c2R5ICAgICAgICAgICAgIFJOIDEwCi1FaWdodE1pbnVzZHggICAgICAgICBSTiA4IAotRWlnaHRNaW51c2R5ICAgICAgICAgUk4gOQotZHhFaWdodE1pbnVzZHggICAgICAgUk4gOAotQkFDb2VmZiAgICAgICAgICAgICAgUk4gNgotRENDb2VmZiAgICAgICAgICAgICAgUk4gNwotICAgICAgICAgICAgICAgICAgICAgCi1pRHN0U3RlcHgyTWludXNXaWR0aCBSTiA4Ci1pU3JjU3RlcHgyTWludXNXaWR0aCBSTiA5Ci1pU3JjU3RlcDEgICAgICAgICAgICBSTiAxMAotCi1wU3JjMSAgICAgICAgICAgICAgICBSTiAxCi1wU3JjMiAgICAgICAgICAgICAgICBSTiA4Ci1wRHN0MSAgICAgICAgICAgICAgICBSTiA4Ci1wRHN0MiAgICAgICAgICAgICAgICBSTiAxMgotICAgICAgICAgICAgICAgICAgICAgCi1waXgwMCAgICAgICAgICAgICAgICBSTiA4Ci1waXgwMSAgICAgICAgICAgICAgICBSTiA5Ci1waXgxMCAgICAgICAgICAgICAgICBSTiAxMAotcGl4MTEgICAgICAgICAgICAgICAgUk4gMTEKLQotT3V0MDEwMCAgICAgICAgICAgICAgUk4gOCAgCi1PdXQxMTEwICAgICAgICAgICAgICBSTiAxMCAKLQoteDAwICAgICAgICAgICAgICAgICAgUk4gOAoteDAxICAgICAgICAgICAgICAgICAgUk4gMTAKLXgwMiAgICAgICAgICAgICAgICAgIFJOIDEyCi14MTAgICAgICAgICAgICAgICAgICBSTiA5Ci14MTEgICAgICAgICAgICAgICAgICBSTiAxMQoteDEyICAgICAgICAgICAgICAgICAgUk4gMTQKLXgyMCAgICAgICAgICAgICAgICAgIFJOIDEwCi14MjEgICAgICAgICAgICAgICAgICBSTiAxMgoteDIyICAgICAgICAgICAgICAgICAgUk4gMTQKLSAgICAgICAgICAgICAgICAgICAgIAoteDAxeDAwICAgICAgICAgICAgICAgUk4gOCAgCi14MDJ4MDEgICAgICAgICAgICAgICBSTiAxMCAKLXgxMXgxMCAgICAgICAgICAgICAgIFJOIDkgIAoteDEyeDExICAgICAgICAgICAgICAgUk4gMTEgCi14MjF4MjAgICAgICAgICAgICAgICBSTiAxMCAKLXgyMngyMSAgICAgICAgICAgICAgIFJOIDEyIAotICAgICAgICAgICAgICAgICAgICAgCi1PdXRSb3cwMCAgICAgICAgICAgICBSTiAxMgotT3V0Um93MDEgICAgICAgICAgICAgUk4gMTQKLU91dFJvdzEwICAgICAgICAgICAgIFJOIDEwCi1PdXRSb3cxMSAgICAgICAgICAgICBSTiAxMgotICAgICAgICAgICAgICAgICAgICAgCi1PdXRSb3cwMTAwICAgICAgICAgICBSTiAxMgotT3V0Um93MTExMCAgICAgICAgICAgUk4gMTIKLSAgICAgICAgICAgICAgICAgICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9hc20gc3RhcnRzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hLCByMTEKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCi0gICAgICAgIE1fQVJHICAgV2lkdGgsICAgICAgNAotICAgICAgICBNX0FSRyAgIEhlaWdodCwgICAgIDQKLSAgICAgICAgTV9BUkcgICBEeCwgICAgICAgICA0Ci0gICAgICAgIE1fQVJHICAgRHksICAgICAgICAgNAotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQKLSAgICAgICAgCi0gICAgICAgIE1fTERSICAgaVdpZHRoLCAgV2lkdGggIAotICAgICAgICBNX0xEUiAgIGlIZWlnaHQsIEhlaWdodCAgCi0gICAgICAgIE1fTERSICAgZHgsICAgICAgRHggCi0gICAgICAgIE1fTERSICAgZHksICAgICAgRHkKLSAgICAgICAgCi0gICAgICAgIDsvLyBFaWdodE1pbnVzZHggPSA4IC0gZHgKLSAgICAgICAgOy8vIEVpZ2h0TWludXNkeSA9IDggLSBkeQotICAgICAgICAKLSAgICAgICAgOy8vIEFDb2VmZiA9IEVpZ2h0TWludXNkeCAqIEVpZ2h0TWludXNkeQotICAgICAgICA7Ly8gQkNvZWZmID0gZHggKiBFaWdodE1pbnVzZHkKLSAgICAgICAgOy8vIENDb2VmZiA9IEVpZ2h0TWludXNkeCAqIGR5Ci0gICAgICAgIDsvLyBEQ29lZmYgPSBkeCAqIGR5Ci0gICAgICAgIAotICAgICAgICBBREQgICAgIHBTcmMxLCBwU3JjLCBpU3JjU3RlcAotICAgICAgICBTVUIgICAgIHRlbXAsIGlXaWR0aCwgIzEKLSAgICAgICAgUlNCICAgICBFaWdodE1pbnVzZHgsIGR4LCAjOCAKLSAgICAgICAgUlNCICAgICBFaWdodE1pbnVzZHksIGR5LCAjOAotICAgICAgICBDTU4gICAgIGR4LGR5Ci0gICAgICAgIEFERCAgICAgZHhFaWdodE1pbnVzZHgsIEVpZ2h0TWludXNkeCwgZHgsIExTTCAjMTYKLSAgICAgICAgT1JSICAgICBpV2lkdGgsIGlXaWR0aCwgdGVtcCwgTFNMICMxNgotICAgICAgICAKLSAgICAgICAgOy8vIFBhY2tlZCBDb2VmZnMuCi0gICAgICAgIAotICAgICAgICBNVUwgICAgIEJBQ29lZmYsIGR4RWlnaHRNaW51c2R4LCBFaWdodE1pbnVzZHkKLSAgICAgICAgTVVMICAgICBEQ0NvZWZmLCBkeEVpZ2h0TWludXNkeCwgZHkgICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBDaGVja2luZyBlaXRoZXIgb2YgZHggYW5kIGR5IGJlaW5nIG5vbi16ZXJvCi0gICAgICAgIAotICAgICAgICBCRVEgICAgIE1WSXNaZXJvCi0gICAgICAgIAotOy8vIFBpeGVsIGxheW91dDoKLTsvLwotOy8vICAgeDAwIHgwMSB4MDIKLTsvLyAgIHgxMCB4MTEgeDEyCi07Ly8gICB4MjAgeDIxIHgyMgotCi07Ly8gSWYgZnJhY3Rpb25sIG12IGlzIG5vdCAoMCwgMCkKLSAgICAgICAgCi1PdXRlckxvb3BNVklzTm90WmVybwotCi1Jbm5lckxvb3BNVklzTm90WmVybwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTERSQiAgICB4MDAsIFtwU3JjLCAgIyswXSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBMRFJCICAgIHgxMCwgW3BTcmMxLCAjKzBdICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIExEUkIgICAgeDAxLCBbcFNyYywgICMrMV0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBMRFJCICAgIHgxMSwgW3BTcmMxLCAjKzFdICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTERSQiAgICB4MDIsIFtwU3JjLCAgIysyXSEgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTERSQiAgICB4MTIsIFtwU3JjMSwgIysyXSEgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgT1JSICAgICB4MDF4MDAsIHgwMCwgeDAxLCBMU0wgIzE2ICAgICAgICAKLSAgICAgICAgICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAgICAgICAgIE9SUiAgICAgeDAyeDAxLCB4MDEsIHgwMiwgTFNMICMxNiAgICAgICAgCi0gICAgICAgICAgICAgICAgTU9WICAgICByMHgyMCwgICMzMgotICAgICAgICAgICAgICAgIE9SUiAgICAgeDExeDEwLCB4MTAsIHgxMSwgTFNMICMxNiAgICAKLSAgICAgICAgICAgICAgICBPUlIgICAgIHgxMngxMSwgeDExLCB4MTIsIExTTCAjMTYgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFNNTEFEICAgeDAxeDAwLCB4MDF4MDAsIEJBQ29lZmYsIHIweDIwCi0gICAgICAgICAgICAgICAgU01MQUQgICB4MDJ4MDEsIHgwMngwMSwgQkFDb2VmZiwgcjB4MjAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgOy8vIGlXaWR0aCBwYWNrZWQgd2l0aCBNU0IgKHRvcCAxNiBiaXRzKSAKLSAgICAgICAgICAgICAgICA7Ly8gYXMgaW5uZXIgbG9vcCBjb3VudGVyIHZhbHVlIGkuZSAKLSAgICAgICAgICAgICAgICA7Ly8gKGlXaWR0aCAtMSkgYW5kIExTQiAobG93ZXIgMTYgYml0cykKLSAgICAgICAgICAgICAgICA7Ly8gYXMgb3JpZ2luYWwgd2lkdGgKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTVUJTICAgIGlXaWR0aCwgaVdpZHRoLCAjMTw8MTcKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTTUxBRCAgIE91dFJvdzAwLCB4MTF4MTAsIERDQ29lZmYsIHgwMXgwMCAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFNNTEFEICAgT3V0Um93MDEsIHgxMngxMSwgRENDb2VmZiwgeDAyeDAxICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgUlNCICAgICBwU3JjMiwgcFNyYywgcFNyYzEsIExTTCAjMQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIE1PViAgICAgT3V0Um93MDAsIE91dFJvdzAwLCBMU1IgIzYKLSAgICAgICAgICAgICAgICBNT1YgICAgIE91dFJvdzAxLCBPdXRSb3cwMSwgTFNSICM2Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTERSQiAgICB4MjAsW3BTcmMyLCAjLTJdCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgT1JSICAgICBPdXRSb3cwMTAwLCBPdXRSb3cwMCwgT3V0Um93MDEsIExTTCAjOAotICAgICAgICAgICAgICAgIFNUUkggICAgT3V0Um93MDEwMCwgW3BEc3RdLCAjMgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIExEUkIgICAgeDIxLFtwU3JjMiwgIy0xXQotICAgICAgICAgICAgICAgIExEUkIgICAgeDIyLFtwU3JjMiwgIyswXQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEFERCAgICAgcERzdDEsIHBEc3QsIGlEc3RTdGVwCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgT1JSICAgICB4MjF4MjAsIHgyMCwgeDIxLCBMU0wgIzE2Ci0gICAgICAgICAgICAgICAgT1JSICAgICB4MjJ4MjEsIHgyMSwgeDIyLCBMU0wgIzE2ICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBNT1YgICAgIHRtcDB4MjAsICMzMgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIDsvLyBSZXVzaW5nIHRoZSBwYWNrZWQgZGF0YSB4MTF4MTAgYW5kIHgxMngxMQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFNNTEFEICAgeDExeDEwLCAgeDExeDEwLCAgQkFDb2VmZiwgdG1wMHgyMAotICAgICAgICAgICAgICAgIFNNTEFEICAgeDEyeDExLCAgeDEyeDExLCAgQkFDb2VmZiwgdG1wMHgyMAotICAgICAgICAgICAgICAgIFNNTEFEICAgT3V0Um93MTAsIHgyMXgyMCwgRENDb2VmZiwgeDExeDEwICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU01MQUQgICBPdXRSb3cxMSwgeDIyeDIxLCBEQ0NvZWZmLCB4MTJ4MTEKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBNT1YgICAgIE91dFJvdzEwLCBPdXRSb3cxMCwgTFNSICM2Ci0gICAgICAgICAgICAgICAgTU9WICAgICBPdXRSb3cxMSwgT3V0Um93MTEsIExTUiAjNgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBPUlIgICAgIE91dFJvdzExMTAsIE91dFJvdzEwLCBPdXRSb3cxMSwgTFNMICM4Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU1RSSCAgICBPdXRSb3cxMTEwLCBbcERzdDEsICMtMl0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBCR1QgICAgIElubmVyTG9vcE1WSXNOb3RaZXJvCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMgotICAgICAgICAgICAgICAgIEFERCAgICAgaVdpZHRoLCBpV2lkdGgsICMxPDwxNgotICAgICAgICAgICAgICAgIFJTQiAgICAgaURzdFN0ZXB4Mk1pbnVzV2lkdGgsIGlXaWR0aCwgaURzdFN0ZXAsIExTTCAjMQotICAgICAgICAgICAgICAgIFNVQiAgICAgaVNyY1N0ZXAxLCBwU3JjMSwgcFNyYwotICAgICAgICAgICAgICAgIFNVQiAgICAgdGVtcCwgaVdpZHRoLCAjMQotICAgICAgICAgICAgICAgIFJTQiAgICAgaVNyY1N0ZXB4Mk1pbnVzV2lkdGgsIGlXaWR0aCwgaVNyY1N0ZXAxLCBMU0wgIzEKLSAgICAgICAgICAgICAgICBBREQgICAgIHBEc3QsIHBEc3QsIGlEc3RTdGVweDJNaW51c1dpZHRoCi0gICAgICAgICAgICAgICAgQUREICAgICBwU3JjMSwgcFNyYzEsIGlTcmNTdGVweDJNaW51c1dpZHRoCi0gICAgICAgICAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBpU3JjU3RlcHgyTWludXNXaWR0aAotICAgICAgICAgICAgICAgIE9SUiAgICAgaVdpZHRoLCBpV2lkdGgsIHRlbXAsIExTTCAjMTYKLSAgICAgICAgICAgICAgICBCR1QgICAgIE91dGVyTG9vcE1WSXNOb3RaZXJvCi0gICAgICAgICAgICAgICAgTU9WICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgotICAgICAgICAgICAgICAgIE1fRVhJVAotCi07Ly8gSWYgZnJhY3Rpb25sIG12IGlzICgwLCAwKQotCi1NVklzWmVybwotICAgICAgICAgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz00Ci1PdXRlckxvb3BNVklzWmVybwotCi1Jbm5lckxvb3BNVklzWmVybwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBMRFJCICAgIHBpeDAwLCBbcFNyY10sICAjKzEKLSAgICAgICAgICAgICAgICBMRFJCICAgIHBpeDAxLCBbcFNyY10sICAjKzEKLSAgICAgICAgICAgICAgICBMRFJCICAgIHBpeDEwLCBbcFNyYzFdLCAjKzEKLSAgICAgICAgICAgICAgICBMRFJCICAgIHBpeDExLCBbcFNyYzFdLCAjKzEKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBBREQgICAgIHBEc3QyLCAgcERzdCwgaURzdFN0ZXAKLSAgICAgICAgICAgICAgICBTVUJTICAgIGlXaWR0aCwgaVdpZHRoLCAjMTw8MTcgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgT1JSICAgICBPdXQwMTAwLCBwaXgwMCwgcGl4MDEsIExTTCAjOCAKLSAgICAgICAgICAgICAgICBPUlIgICAgIE91dDExMTAsIHBpeDEwLCBwaXgxMSwgTFNMICM4Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU1RSSCAgICBPdXQwMTAwLCBbcERzdF0sICAjMgotICAgICAgICAgICAgICAgIFNUUkggICAgT3V0MTExMCwgW3BEc3QyXSwgIzIKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBCR1QgICAgIElubmVyTG9vcE1WSXNaZXJvCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMgotICAgICAgICAgICAgICAgIEFERCAgICAgaVdpZHRoLCBpV2lkdGgsICMxPDwxNgotICAgICAgICAgICAgICAgIFJTQiAgICAgaURzdFN0ZXB4Mk1pbnVzV2lkdGgsIGlXaWR0aCwgaURzdFN0ZXAsIExTTCAjMQotICAgICAgICAgICAgICAgIFNVQiAgICAgaVNyY1N0ZXAxLCBwU3JjMSwgcFNyYwotICAgICAgICAgICAgICAgIFNVQiAgICAgdGVtcCwgaVdpZHRoLCAjMQotICAgICAgICAgICAgICAgIFJTQiAgICAgaVNyY1N0ZXB4Mk1pbnVzV2lkdGgsIGlXaWR0aCwgaVNyY1N0ZXAxLCBMU0wgIzEKLSAgICAgICAgICAgICAgICBBREQgICAgIHBEc3QsIHBEc3QsIGlEc3RTdGVweDJNaW51c1dpZHRoCi0gICAgICAgICAgICAgICAgQUREICAgICBwU3JjMSwgcFNyYzEsIGlTcmNTdGVweDJNaW51c1dpZHRoCi0gICAgICAgICAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBpU3JjU3RlcHgyTWludXNXaWR0aAotICAgICAgICAgICAgICAgIE9SUiAgICAgaVdpZHRoLCBpV2lkdGgsIHRlbXAsIExTTCAjMTYKLSAgICAgICAgICAgICAgICBCR1QgICAgIE91dGVyTG9vcE1WSXNaZXJvCi0gICAgICAgICAgICAgICAgTU9WICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgotICAgICAgICAgICAgICAgIE1fRU5ECi0KLSAgICAgICAgRU5ESUYgOy8vIEFSTTExMzZKUwotCi0gICAgICAgIAotICAgICAgICBFTkQKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9hc20gZW5kcwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzOGM3MTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1F1YW50VGFibGVzX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vIERlc2NyaXB0aW9uOgotOy8vIFRoaXMgZmlsZSBjb250YWlucyBxdWFudGl6YXRpb24gdGFibGVzCi07Ly8gCi07Ly8gCi0KLSAgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgIAotICAgICAgICAgCi0gICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9NRk1hdHJpeFFQTW9kVGFibGUKLSAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1FQRGl2SW50cmFUYWJsZQotICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfUVBEaXZQbHVzT25lVGFibGUgIAotICAgICAgICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgY29udGFpbnMgYXJtVkNNNFAxMF9NRk1hdHJpeCBbaVFQICUgNl1bMF0gZW50aXJlcywKLTsvLyBmb3IgdmFsdWVzIG9mIGlRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX01GTWF0cml4UVBNb2RUYWJsZQotICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgICAgICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIEFSTV9NNFAxMF9RX09GRlNFVCArIDEgKyAoaVFQIC8gNikgdmFsdWVzLAotOy8vIGZvciB2YWx1ZXMgb2YgaVFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1FQRGl2UGx1c09uZVRhYmxlCi0gICAgICAgICBEQ0IgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNgotICAgICAgICAgRENCIDE3LCAxNywgMTcsIDE3LCAxNywgMTcKLSAgICAgICAgIERDQiAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4Ci0gICAgICAgICBEQ0IgMTksIDE5LCAxOSwgMTksIDE5LCAxOQotICAgICAgICAgRENCIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAKLSAgICAgICAgIERDQiAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxCi0gICAgICAgICBEQ0IgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMgotICAgICAgICAgRENCIDIzLCAyMywgMjMsIDIzLCAyMywgMjMKLSAgICAgICAgIERDQiAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0Ci0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgY29udGFpbnMgKDEgPDwgUWJpdHNQbHVzT25lKSAvIDMgVmFsdWVzIChJbnRyYSBjYXNlKSAsCi07Ly8gZm9yIHZhbHVlcyBvZiBpUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIAotICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1FQRGl2SW50cmFUYWJsZSwgMgotICAgICAgICAgRENEIDIxODQ1LCAyMTg0NSwgMjE4NDUsIDIxODQ1LCAyMTg0NSwgMjE4NDUKLSAgICAgICAgIERDRCA0MzY5MCwgNDM2OTAsIDQzNjkwLCA0MzY5MCwgNDM2OTAsIDQzNjkwCi0gICAgICAgICBEQ0QgODczODEsIDg3MzgxLCA4NzM4MSwgODczODEsIDg3MzgxLCA4NzM4MQotICAgICAgICAgRENEIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIKLSAgICAgICAgIERDRCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1Ci0gICAgICAgICBEQ0QgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MAotICAgICAgICAgRENEIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEKLSAgICAgICAgIERDRCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyCi0gICAgICAgICBEQ0QgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSwgNTU5MjQwNSAgICAgICAgICAgICAgICAKLSAgICAgICAgIAotICAgICAgICAgCi0gICAgICAgICBFTkQKLSAgICAgICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MzcyZTEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucworKysgL2Rldi9udWxsCkBAIC0xLDQyMSArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotOy8vIERlc2NyaXB0aW9uOgotOy8vIFRyYW5zZm9ybSBSZXNpZHVhbCA0eDQgQ29lZmZpY2llbnRzCi07Ly8gCi07Ly8gCi0KLSAgICAgICAgCi07Ly8gSW5jbHVkZSBzdGFuZGFyZCBoZWFkZXJzCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLSAgICAgICAgCi07Ly8gSW1wb3J0IHN5bWJvbHMgcmVxdWlyZWQgZnJvbSBvdGhlciBmaWxlcwotOy8vIChGb3IgZXhhbXBsZSB0YWJsZXMpCi0gICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi07Ly8gU2V0IGRlYnVnZ2luZyBsZXZlbCAgICAgICAgCi07Ly9ERUJVR19PTiAgICBTRVRMIHtUUlVFfQotCi0KLQotOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQotICAgIAotICAgIElGICBBUk0xMTM2SlMgCi0gICAgCi07Ly9JbnB1dCBSZWdpc3RlcnMKLXBEc3QgICAgICAgICAgICAgICAgUk4gIDAKLXBTcmMgICAgICAgICAgICAgICAgUk4gIDEKLQotOy8vT3V0cHV0IFJlZ2lzdGVycwotCi0KLTsvL0xvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCi0KLTsvLyBQYWNrZWQgSW5wdXQgcGl4ZWxzCi1pbjAwICAgICAgICAgICAgICAgIFJOICAyICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbMF0gJiBTcmNbMV0gCi1pbjAyICAgICAgICAgICAgICAgIFJOICAzICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbMl0gJiBTcmNbM10KLWluMTAgICAgICAgICAgICAgICAgUk4gIDQgICAgICAgICAgICAgICAgICAgOy8vIFNyY1s0XSAmIFNyY1s1XQotaW4xMiAgICAgICAgICAgICAgICBSTiAgNSAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzZdICYgU3JjWzddCi1pbjIwICAgICAgICAgICAgICAgIFJOICA2ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbOF0gJiBTcmNbOV0KLWluMjIgICAgICAgICAgICAgICAgUk4gIDcgICAgICAgICAgICAgICAgICAgOy8vIFNyY1sxMF0gJiBTcmNbMTFdCi1pbjMwICAgICAgICAgICAgICAgIFJOICA4ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbMTJdICYgU3JjWzEzXQotaW4zMiAgICAgICAgICAgICAgICBSTiAgOSAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzE0XSAmIFNyY1sxNV0KLQotOy8vIFRyYW5zcG9zZSBmb3IgUm93IG9wZXJhdGlvbnMgKFJvd3MgdG8gY29scykKLXRyUm93MDAgICAgICAgICAgICAgUk4gIDIKLXRyUm93MTAgICAgICAgICAgICAgUk4gIDEwCi10clJvdzAyICAgICAgICAgICAgIFJOICAzCi10clJvdzEyICAgICAgICAgICAgIFJOICA1Ci10clJvdzIwICAgICAgICAgICAgIFJOICAxMQotdHJSb3czMCAgICAgICAgICAgICBSTiAgMTIKLXRyUm93MzIgICAgICAgICAgICAgUk4gIDE0Ci10clJvdzIyICAgICAgICAgICAgIFJOICA3Ci0KLTsvLyBJbnRlcm1lZGlhdGUgY2FsY3VsYXRpb25zCi1lMCAgICAgICAgICAgICAgICAgIFJOICA0ICAgICAgICAgICAgICAgICAgIAotZTEgICAgICAgICAgICAgICAgICBSTiAgNgotZTIgICAgICAgICAgICAgICAgICBSTiAgOAotZTMgICAgICAgICAgICAgICAgICBSTiAgOQotY29uc3RaZXJvICAgICAgICAgICBSTiAgMQotCi07Ly8gUm93IG9wZXJhdGVkIHBpeGVscwotcm93T3AwMCAgICAgICAgICAgICBSTiAgMgotcm93T3AxMCAgICAgICAgICAgICBSTiAgMTAKLXJvd09wMjAgICAgICAgICAgICAgUk4gIDExCi1yb3dPcDMwICAgICAgICAgICAgIFJOICAxMgotcm93T3AwMiAgICAgICAgICAgICBSTiAgMwotcm93T3AxMiAgICAgICAgICAgICBSTiAgNQotcm93T3AyMiAgICAgICAgICAgICBSTiAgNwotcm93T3AzMiAgICAgICAgICAgICBSTiAgMTQKLQotOy8vIFRyYW5zcG9zZSBmb3IgY29sdWxtbiBvcGVyYXRpb25zCi10ckNvbDAwICAgICAgICAgICAgIFJOICAyICAgICAgICAgICAgICAgICAgIAotdHJDb2wwMiAgICAgICAgICAgICBSTiAgMyAgICAgICAgICAgICAgICAgICAKLXRyQ29sMTAgICAgICAgICAgICAgUk4gIDQgICAgICAgICAgICAgICAgICAgCi10ckNvbDEyICAgICAgICAgICAgIFJOICA1ICAgICAgICAgICAgICAgICAgIAotdHJDb2wyMCAgICAgICAgICAgICBSTiAgNiAgICAgICAgICAgICAgICAgICAKLXRyQ29sMjIgICAgICAgICAgICAgUk4gIDcgICAgICAgICAgICAgICAgICAgCi10ckNvbDMwICAgICAgICAgICAgIFJOICA4ICAgICAgICAgICAgICAgICAgIAotdHJDb2wzMiAgICAgICAgICAgICBSTiAgOSAgCi0KLTsvLyBJbnRlcm1lZGlhdGUgY2FsY3VsYXRpb25zCi1nMCAgICAgICAgICAgICAgICAgIFJOICAxMAotZzEgICAgICAgICAgICAgICAgICBSTiAgMTEKLWcyICAgICAgICAgICAgICAgICAgUk4gIDEyCi1nMyAgICAgICAgICAgICAgICAgIFJOICAxNCAgIAotCi07Ly8gQ29sb3VtbiBvcGVyYXRlZCBwaXhlbHMKLWNvbE9wMDAgICAgICAgICAgICAgUk4gIDIgICAgICAgICAgICAgICAgICAgCi1jb2xPcDAyICAgICAgICAgICAgIFJOICAzICAgICAgICAgICAgICAgICAgIAotY29sT3AxMCAgICAgICAgICAgICBSTiAgNCAgICAgICAgICAgICAgICAgICAKLWNvbE9wMTIgICAgICAgICAgICAgUk4gIDUgICAgICAgICAgICAgICAgICAgCi1jb2xPcDIwICAgICAgICAgICAgIFJOICA2ICAgICAgICAgICAgICAgICAgIAotY29sT3AyMiAgICAgICAgICAgICBSTiAgNyAgICAgICAgICAgICAgICAgICAKLWNvbE9wMzAgICAgICAgICAgICAgUk4gIDggICAgICAgICAgICAgICAgICAgCi1jb2xPcDMyICAgICAgICAgICAgIFJOICA5ICAKLQotCi10ZW1wMSAgICAgICAgICAgICAgIFJOICAxMCAgICAgICAgICAgICAgICAgIDsvLyBUZW1wb3Jhcnkgc2NyYXRjaCB2YXJhaWJsZXMKLWNvbnN0MSAgICAgICAgICAgICAgUk4gIDExICAgICAgCi1jb25zdDIgICAgICAgICAgICAgIFJOICAxMgotbWFzayAgICAgICAgICAgICAgICBSTiAgMTQKLQotOy8vIE91dHB1dCBwaXhlbHMKLW91dDAwICAgICAgICAgICAgICAgUk4gIDIgICAgICAgICAgICAgICAgICAgCi1vdXQwMiAgICAgICAgICAgICAgIFJOICAzICAgICAgICAgICAgICAgICAgIAotb3V0MTAgICAgICAgICAgICAgICBSTiAgNCAgICAgICAgICAgICAgICAgICAKLW91dDEyICAgICAgICAgICAgICAgUk4gIDUgICAgICAgICAgICAgICAgICAgCi1vdXQyMCAgICAgICAgICAgICAgIFJOICA2ICAgICAgICAgICAgICAgICAgIAotb3V0MjIgICAgICAgICAgICAgICBSTiAgNyAgICAgICAgICAgICAgICAgICAKLW91dDMwICAgICAgICAgICAgICAgUk4gIDggICAgICAgICAgICAgICAgICAgCi1vdXQzMiAgICAgICAgICAgICAgIFJOICA5ICAKLSAgICAgIAotICAgICAgIAotICAgICAgIAotICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCi0gICAgICAgIAotCi0gICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQscjExCi0gICAgICAgIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDsvLyBUaGUgc3RyYXRlZ3kgdXNlZCBpbiBpbXBsZW1lbnRpbmcgdGhlIHRyYW5zZm9ybSBpcyBhcyBmb2xsb3dzOioKLSAgICAgICAgOy8vIExvYWQgdGhlIDR4NCBibG9jayBpbnRvIDggcmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCi0gICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIDR4NCBtYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAotICAgICAgICA7Ly8gUGVyZm9ybSB0aGUgcm93IG9wZXJhdGlvbnMgKG9uIGNvbHVtbnMpIHVzaW5nIFNJTUQgICAgICAgICAgICAqICAKLSAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgNHg0IHJlc3VsdCBtYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCi0gICAgICAgIDsvLyBQZXJmb3JtIHRoZSBjb2xvdW1uIG9wZXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgICAgOy8vIFN0b3JlIHRoZSA0eDQgYmxvY2sgYXQgb25lIGdvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgICAgICA7Ly8gTG9hZCBhbGwgdGhlIDR4NCBwaXhlbHMKLSAgICAgICAgCi0gICAgICAgIExETUlBICAgcFNyYyx7aW4wMCxpbjAyLGluMTAsaW4xMixpbjIwLGluMjIsaW4zMCxpbjMyfQotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgIGNvbnN0WmVybywjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVXNlZCB0byByaWdodCBzaGlmdCBieSAxIAotICAgICAgICA7TERSICAgICAgIGNvbnN0WmVybyw9MHgwMDAwMDAwMCAgCi0gICAgICAgIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIG1hdHJpeCBpbm9yZGVyIHRvIHBlcmZvcm0gcm93IG9wcyBhcyBjb2xvdW1uIG9wcwotICAgICAgICA7Ly8gSW5wdXQ6ICAgaW5bXVtdID0gb3JpZ2luYWwgbWF0cml4Ci0gICAgICAgIDsvLyBPdXRwdXQ6ICB0clJvd1tdW109IHRyYW5zcG9zZWQgbWF0cml4Ci0gICAgICAgIDsvLyBTdGVwMTogT2J0YWluIHRoZSBMTCBwYXJ0IG9mIHRoZSB0cmFuc3Bvc2VkIG1hdHJpeAotICAgICAgICA7Ly8gU3RlcDI6IE9idGFpbiB0aGUgSEwgcGFydAotICAgICAgICA7Ly8gc3RlcDM6IE9idGFpbiB0aGUgTEggcGFydAotICAgICAgICA7Ly8gU3RlcDQ6IE9idGFpbiB0aGUgSEggcGFydAotICAgICAgICA7Ly8KLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIAotICAgICAgICA7Ly8gTEwgMngyIHRyYW5zcG9zZWQgbWF0cml4IAotICAgICAgICA7Ly8gICBkMCBkMSAtIC0KLSAgICAgICAgOy8vICAgZDQgZDUgLSAtCi0gICAgICAgIDsvLyAgIC0gIC0gIC0gLQotICAgICAgICA7Ly8gICAtICAtICAtIC0KLSAgICAgICAgCi0gICAgICAgIFBLSFRCICAgdHJSb3cxMCxpbjEwLGluMDAsQVNSICMxNiAgICAgICAgICAgICAgIDsvLyBbNSA0XSA9IFtmNTpmMV0gICAgCi0gICAgICAgIFBLSEJUICAgdHJSb3cwMCxpbjAwLGluMTAsTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBbMSAwXSA9IFtmNDpmMF0gIAotICAgICAgICAKLSAgICAgICAgOy8vIEhMIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAgCi0gICAgICAgIDsvLyAgICAtICAgLSAgIC0gLQotICAgICAgICA7Ly8gICAgLSAgIC0gICAtIC0KLSAgICAgICAgOy8vICAgIGQ4ICBkOSAgLSAtCi0gICAgICAgIDsvLyAgIGQxMiBkMTMgIC0gLQotICAgICAgICAKLSAgICAgICAgIAotICAgICAgICAgUEtIVEIgICB0clJvdzMwLGluMTIsaW4wMixBU1IgIzE2ICAgICAgICAgICAgICA7Ly8gWzEzIDEyXSA9IFs3IDNdCi0gICAgICAgICBQS0hCVCAgIHRyUm93MjAsaW4wMixpbjEyLExTTCAjMTYgICAgICAgICAgICAgIDsvLyBbOSA4XSA9IFs2IDJdIAotICAgICAgICAKLSAgICAgICAgOy8vIExIIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAKLSAgICAgICAgOy8vICAgLSAtIGQyIGQzIAotICAgICAgICA7Ly8gICAtIC0gZDYgZDcgCi0gICAgICAgIDsvLyAgIC0gLSAtICAtCi0gICAgICAgIDsvLyAgIC0gLSAtICAtCi0gICAgICAgIAotICAgICAgICBQS0hCVCAgIHRyUm93MDIsaW4yMCxpbjMwLExTTCAjMTYgICAgICAgICAgICAgICA7Ly8gWzMgMl0gPSBbZjEyOmY4XSAgCi0gICAgICAgIFBLSFRCICAgdHJSb3cxMixpbjMwLGluMjAsQVNSICMxNiAgICAgICAgICAgICAgIDsvLyBbNyA2XSA9IFtmMTM6ZjldIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgCi0gICAgICAgIDsvLyBISCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggIAotICAgICAgICA7Ly8gICAgLSAtICAgLSAgIC0KLSAgICAgICAgOy8vICAgIC0gLSAgIC0gICAtCi0gICAgICAgIDsvLyAgICAtIC0gIGQxMCBkMTEKLSAgICAgICAgOy8vICAgIC0gLSAgZDE0IGQxNQotICAgICAgICAKLSAgICAgICAgUEtIVEIgICB0clJvdzMyLGluMzIsaW4yMixBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFsxNSAxNF0gPSBbMTUgMTFdCi0gICAgICAgIFBLSEJUICAgdHJSb3cyMixpbjIyLGluMzIsTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBbMTEgMTBdID0gWzE0IDEwXQotICAgICAgIAotICAgICAgICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gICAgICAgIDsvLyBSb3cgT3BlcmF0aW9ucyAoUGVyZm9ybWVkIG9uIGNvbHVtbnMpCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBTSU1EIG9wZXJhdGlvbnMgb24gZmlyc3QgdHdvIGNvbHVtbnModHdvIHJvd3Mgb2YgdGhlIG9yaWdpbmFsIG1hdHJpeCkKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBTQUREMTYgICAgICBlMCwgdHJSb3cwMCx0clJvdzIwICAgICAgICAgICAgICAgICAgIDsvLyAgZTAgPSBkMCArIGQyIAotICAgICAgICBTU1VCMTYgICAgZTEsIHRyUm93MDAsdHJSb3cyMCAgICAgICAgICAgICAgICAgICA7Ly8gIGUxID0gZDAgLSBkMiAgCi0gICAgICAgIFNIQUREMTYgICBlMiwgdHJSb3cxMCxjb25zdFplcm8gICAgICAgICAgICAgICAgIDsvLyAoZjE+PjEpIGNvbnN0WmVybyBpcyBhIHJlZ2lzdGVyIGhvbGRpbmcgMAotICAgICAgICBTSEFERDE2ICAgZTMsIHRyUm93MzAsY29uc3RaZXJvICAgICAgICAgICAgICAgICA7Ly8gIGF2b2lkIHBpcGVsaW5lIHN0YWxscyBmb3IgZTIgYW5kIGUzCi0gICAgICAgIFNTVUIxNiAgICBlMiwgZTIsIHRyUm93MzAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTIgPSAoZDE+PjEpIC0gZDMgIAotICAgICAgICBTQUREMTYgICAgZTMsIGUzLCB0clJvdzEwICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUzID0gZDEgKyAoZDM+PjEpICAKLSAgICAgICAgU0FERDE2ICAgIHJvd09wMDAsIGUwLCBlMyAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMCA9IGUwICsgZTMgIAotICAgICAgICBTQUREMTYgICAgcm93T3AxMCwgZTEsIGUyICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYxID0gZTEgKyBlMiAgCi0gICAgICAgIFNTVUIxNiAgICByb3dPcDIwLCBlMSwgZTIgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjIgPSBlMSAtIGUyICAKLSAgICAgICAgU1NVQjE2ICAgIHJvd09wMzAsIGUwLCBlMyAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMyA9IGUwIC0gZTMKLSAgICAgICAgCi0gICAgICAgIDsvLyBTSU1EIG9wZXJhdGlvbnMgb24gbmV4dCB0d28gY29sdW1ucyhuZXh0IHR3byByb3dzIG9mIHRoZSBvcmlnaW5hbCBtYXRyaXgpCi0gICAgICAgIAotICAgICAgICBTQUREMTYgICAgICBlMCwgdHJSb3cwMix0clJvdzIyCi0gICAgICAgIFNTVUIxNiAgICBlMSwgdHJSb3cwMix0clJvdzIyCi0gICAgICAgIFNIQUREMTYgICBlMiwgdHJSb3cxMixjb25zdFplcm8gICAgICAgICAgICAgICAgIDsvLyhmMT4+MSkgY29uc3RaZXJvIGlzIGEgcmVnaXN0ZXIgaG9sZGluZyAwCi0gICAgICAgIFNIQUREMTYgICBlMywgdHJSb3czMixjb25zdFplcm8KLSAgICAgICAgU1NVQjE2ICAgIGUyLCBlMiwgdHJSb3czMgotICAgICAgICBTQUREMTYgICAgZTMsIGUzLCB0clJvdzEyCi0gICAgICAgIFNBREQxNiAgICByb3dPcDAyLCBlMCwgZTMKLSAgICAgICAgU0FERDE2ICAgIHJvd09wMTIsIGUxLCBlMgotICAgICAgICBTU1VCMTYgICAgcm93T3AyMiwgZTEsIGUyCi0gICAgICAgIFNTVUIxNiAgICByb3dPcDMyLCBlMCwgZTMKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgcmVzdWx0YW50IG1hdHJpeAotICAgICAgICA7Ly8gSW5wdXQ6ICByb3dPcFtdW10KLSAgICAgICAgOy8vIE91dHB1dDogdHJDb2xbXVtdIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgCi0gICAgICAgIDsvLyBMTCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggCi0gICAgICAgIDsvLyAgIGQwIGQxIC0gLQotICAgICAgICA7Ly8gICBkNCBkNSAtIC0KLSAgICAgICAgOy8vICAgLSAgLSAgLSAtCi0gICAgICAgIDsvLyAgIC0gIC0gIC0gLQotICAgICAgICAKLSAgICAgICAgUEtIVEIgICB0ckNvbDEwLHJvd09wMTAscm93T3AwMCxBU1IgIzE2ICAgICAgICAgICA7Ly8gWzUgNF0gPSBbZjU6ZjFdCi0gICAgICAgIFBLSEJUICAgdHJDb2wwMCxyb3dPcDAwLHJvd09wMTAsTFNMICMxNiAgICAgICAgICAgOy8vIFsxIDBdID0gW2Y0OmYwXSAgCi0gICAgICAgIAotICAgICAgICA7Ly8gSEwgMngyIHRyYW5zcG9zZWQgbWF0cml4ICAKLSAgICAgICAgOy8vICAgIC0gICAtICAgLSAtCi0gICAgICAgIDsvLyAgICAtICAgLSAgIC0gLQotICAgICAgICA7Ly8gICAgZDggIGQ5ICAtIC0KLSAgICAgICAgOy8vICAgZDEyIGQxMyAgLSAtCi0gICAgICAgIAotICAgICAgICAgCi0gICAgICAgICBQS0hUQiAgIHRyQ29sMzAscm93T3AxMixyb3dPcDAyLEFTUiAjMTYgICAgICAgICAgOy8vIFsxMyAxMl0gPSBbNyAzXQotICAgICAgICAgUEtIQlQgICB0ckNvbDIwLHJvd09wMDIscm93T3AxMixMU0wgIzE2ICAgICAgICAgIDsvLyBbOSA4XSA9IFs2IDJdIAotICAgICAgICAKLSAgICAgICAgOy8vIExIIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAKLSAgICAgICAgOy8vICAgLSAtIGQyIGQzIAotICAgICAgICA7Ly8gICAtIC0gZDYgZDcgCi0gICAgICAgIDsvLyAgIC0gLSAtICAtCi0gICAgICAgIDsvLyAgIC0gLSAtICAtCi0gICAgICAgIAotICAgICAgICBQS0hCVCAgIHRyQ29sMDIscm93T3AyMCxyb3dPcDMwLExTTCAjMTYgICAgICAgICAgIDsvLyBbMyAyXSA9IFtmMTI6ZjhdICAKLSAgICAgICAgUEtIVEIgICB0ckNvbDEyLHJvd09wMzAscm93T3AyMCxBU1IgIzE2ICAgICAgICAgICA7Ly8gWzcgNl0gPSBbZjEzOmY5XSAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgIAotICAgICAgICA7Ly8gSEggMngyIHRyYW5zcG9zZWQgbWF0cml4ICAKLSAgICAgICAgOy8vICAgIC0gLSAgIC0gICAtCi0gICAgICAgIDsvLyAgICAtIC0gICAtICAgLQotICAgICAgICA7Ly8gICAgLSAtICBkMTAgZDExCi0gICAgICAgIDsvLyAgICAtIC0gIGQxNCBkMTUKLSAgICAgICAgCi0gICAgICAgIFBLSFRCICAgdHJDb2wzMixyb3dPcDMyLHJvd09wMjIsQVNSICMxNiAgICAgICAgICAgIDsvLyBbMTUgMTRdID0gWzE1IDExXQotICAgICAgICBQS0hCVCAgIHRyQ29sMjIscm93T3AyMixyb3dPcDMyLExTTCAjMTYgICAgICAgICAgICA7Ly8gWzExIDEwXSA9IFsxNCAxMF0KLSAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICAgICAgICA7Ly8gQ29sb3VtbiBPcGVyYXRpb25zIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gU0lNRCBvcGVyYXRpb25zIG9uIGZpcnN0IHR3byBjb2x1bW5zCi0gICAgICAgIAotICAgICAgICAgIAotICAgICAgICBTQUREMTYgICAgICBnMCwgdHJDb2wwMCx0ckNvbDIwCi0gICAgICAgIFNTVUIxNiAgICBnMSwgdHJDb2wwMCx0ckNvbDIwCi0gICAgICAgIFNIQUREMTYgICBnMiwgdHJDb2wxMCxjb25zdFplcm8gICAgICAgICAgICAgICAgICAgICA7Ly8gKGYxPj4xKSBjb25zdFplcm8gaXMgYSByZWdpc3RlciBob2xkaW5nIDAKLSAgICAgICAgU0hBREQxNiAgIGczLCB0ckNvbDMwLGNvbnN0WmVybwotICAgICAgICBTU1VCMTYgICAgZzIsIGcyLCB0ckNvbDMwCi0gICAgICAgIFNBREQxNiAgICBnMywgZzMsIHRyQ29sMTAKLSAgICAgICAgU0FERDE2ICAgIGNvbE9wMDAsIGcwLCBnMwotICAgICAgICBTQUREMTYgICAgY29sT3AxMCwgZzEsIGcyCi0gICAgICAgIFNTVUIxNiAgICBjb2xPcDIwLCBnMSwgZzIKLSAgICAgICAgU1NVQjE2ICAgIGNvbE9wMzAsIGcwLCBnMwotICAgICAgICAKLSAgICAgICAgOy8vIFNJTUQgb3BlcmF0aW9ucyBvbiBuZXh0IHR3byBjb2x1bW5zCi0gICAgICAgIAotICAgICAgICBTQUREMTYgICAgICBnMCwgdHJDb2wwMix0ckNvbDIyCi0gICAgICAgIFNTVUIxNiAgICBnMSwgdHJDb2wwMix0ckNvbDIyCi0gICAgICAgIFNIQUREMTYgICBnMiwgdHJDb2wxMixjb25zdFplcm8gICAgICAgICAgICAgICAgICAgICA7Ly8gKGYxPj4xKSBjb25zdFplcm8gaXMgYSByZWdpc3RlciBob2xkaW5nIDAKLSAgICAgICAgU0hBREQxNiAgIGczLCB0ckNvbDMyLGNvbnN0WmVybwotICAgICAgICBTU1VCMTYgICAgZzIsIGcyLCB0ckNvbDMyCi0gICAgICAgIFNBREQxNiAgICBnMywgZzMsIHRyQ29sMTIKLSAgICAgICAgU0FERDE2ICAgIGNvbE9wMDIsIGcwLCBnMwotICAgICAgICBTQUREMTYgICAgY29sT3AxMiwgZzEsIGcyCi0gICAgICAgIFNTVUIxNiAgICBjb2xPcDIyLCBnMSwgZzIKLSAgICAgICAgU1NVQjE2ICAgIGNvbE9wMzIsIGcwLCBnMwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICA7Ly8gQ2FsY3VsYXRlIGZpbmFsIHZhbHVlIChjb2xPcFtpXVtqXSArIDMyKT4+NgotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIAotICAgICAgICA7Ly8gY29uc3QxOiBTZXJ2ZXMgZHVhbCBwdXJwb3NlIAotICAgICAgICA7Ly8gKDEpIEFkZCAjMzIgdG8gYm90aCB0aGUgbG93ZXIgYW5kIGhpZ2hlciAxNmJpdHMgb2YgdGhlIFNJTUQgcmVzdWx0IAotICAgICAgICA7Ly8gKDIpIENvbnZlcnQgdGhlIGxvd2VyIDE2IGJpdCB2YWx1ZSB0byBhbiB1bnNpZ25lZCBudW1iZXIgKEFkZCAzMjc2OCkKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgY29uc3QxLCA9MHgwMDIwODAyMCAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgbWFzaywgPTB4ZmZmZjAzZmYgICAgICAgICAgICAgICAgICAgICAgIDsvLyBVc2VkIHRvIG1hc2sgdGhlIGRvd24gc2hpZnRlZCA2IGJpdHMgIAotICAgICAgICAKLSAgICAgICAgOy8vIGNvbnN0MigjNTEyKTogdXNlZCB0byBjb252ZXJ0IHRoZSBsb3dlciAxNmJpdCBudW1iZXIgYmFjayB0byBzaWduZWQgdmFsdWUgCi0gICAgICAKLSAgICAgICAgTU9WICAgICBjb25zdDIsIzB4MjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNvbnN0MiA9IDJeOQotICAgICAgICAKLSAgICAgICAgOy8vIEZpcnN0IFJvdyAKLSAgICAgICAgCi0gICAgICAgIFNBREQxNiAgICBjb2xPcDAwLCBjb2xPcDAwLCBjb25zdDEKLSAgICAgICAgU0FERDE2ICAgIGNvbE9wMDIsIGNvbE9wMDIsIGNvbnN0MQotICAgICAgICBBTkQgICAgIGNvbE9wMDAsIG1hc2ssIGNvbE9wMDAsIEFTUiAjNgotICAgICAgICBBTkQgICAgIGNvbE9wMDIsIG1hc2ssIGNvbE9wMDIsIEFTUiAjNgotICAgICAgICBTU1VCMTYgIG91dDAwLGNvbE9wMDAsY29uc3QyCi0gICAgICAgIFNTVUIxNiAgb3V0MDIsY29sT3AwMixjb25zdDIgICAgCi0gICAgICAgIAotCi0gICAgICAgIDsvLyBTZWNvbmQgUm93Ci0gICAgICAgIAotICAgICAgICBTQUREMTYgICAgY29sT3AxMCwgY29sT3AxMCwgY29uc3QxCi0gICAgICAgIFNBREQxNiAgICBjb2xPcDEyLCBjb2xPcDEyLCBjb25zdDEKLSAgICAgICAgQU5EICAgICBjb2xPcDEwLCBtYXNrLCBjb2xPcDEwLCBBU1IgIzYKLSAgICAgICAgQU5EICAgICBjb2xPcDEyLCBtYXNrLCBjb2xPcDEyLCBBU1IgIzYKLSAgICAgICAgU1NVQjE2ICBvdXQxMCxjb2xPcDEwLGNvbnN0MgotICAgICAgICBTU1VCMTYgIG91dDEyLGNvbE9wMTIsY29uc3QyICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBUaGlyZCBSb3cKLSAgICAgICAgCi0gICAgICAgIFNBREQxNiAgICBjb2xPcDIwLCBjb2xPcDIwLCBjb25zdDEKLSAgICAgICAgU0FERDE2ICAgIGNvbE9wMjIsIGNvbE9wMjIsIGNvbnN0MQotICAgICAgICBBTkQgICAgIGNvbE9wMjAsIG1hc2ssIGNvbE9wMjAsIEFTUiAjNgotICAgICAgICBBTkQgICAgIGNvbE9wMjIsIG1hc2ssIGNvbE9wMjIsIEFTUiAjNgotICAgICAgICBTU1VCMTYgIG91dDIwLGNvbE9wMjAsY29uc3QyCi0gICAgICAgIFNTVUIxNiAgb3V0MjIsY29sT3AyMixjb25zdDIKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gRm91cnRoIFJvdyAgIAotICAgICAgICAKLSAgICAgICAgU0FERDE2ICAgIGNvbE9wMzAsIGNvbE9wMzAsIGNvbnN0MQotICAgICAgICBTQUREMTYgICAgY29sT3AzMiwgY29sT3AzMiwgY29uc3QxCi0gICAgICAgIEFORCAgICAgY29sT3AzMCwgbWFzaywgY29sT3AzMCwgQVNSICM2Ci0gICAgICAgIEFORCAgICAgY29sT3AzMiwgbWFzaywgY29sT3AzMiwgQVNSICM2Ci0gICAgICAgIFNTVUIxNiAgb3V0MzAsY29sT3AzMCxjb25zdDIKLSAgICAgICAgU1NVQjE2ICBvdXQzMixjb2xPcDMyLGNvbnN0MgotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDsvLyBTdG9yZSBhbGwgdGhlIDR4NCBwaXhlbHMKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAKLSAgICAgICAgU1RNSUEgICBwRHN0LHtvdXQwMCxvdXQwMixvdXQxMCxvdXQxMixvdXQyMCxvdXQyMixvdXQzMCxvdXQzMn0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgCi0gICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCi0gICAgICAgIAotRW5kICAgICAgICAgICAgICAgIAotCi0gICAgICAgIAotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAotICAgICAgICBNX0VORAotICAgICAgICAKLSAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTICAgIAotICAgIAotICAgIAotCi0KLQotCi0KLTsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKLSAgICAKLSAgICAgICAgICAgIAotICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMmI0ZjMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucworKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIAotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotOy8vIERlZmluZSB0aGUgcHJvY2Vzc29yIHZhcmlhbnRzIHN1cHBvcnRlZCBieSB0aGlzIGZpbGUKLQotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIElGIEFSTTExMzZKUwotICAgICAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gSW5wdXQgQXJndW1lbnRzIGFuZCB0aGVpciBzY29wZS91c2FnZQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBwU3JjICAgICAgICAgICBSTiAwICAgIDsvLyBQZXJzaXN0ZW50IHZhcmlhYmxlCi1wRHN0ICAgICAgICAgICAgUk4gMSAgICA7Ly8gUGVyc2lzdGVudCB2YXJpYWJsZQotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFZhcmlhYmxlcyBhbmQgdGhlaXIgc2NvcGUvdXNhZ2UKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wU3JjICAgICAgICAgICAgUk4gMiAgICA7Ly8gUGVyc2lzdGVudCB2YXJpYWJsZXMKLUZsYWcgICAgICAgICAgICBSTiAzICAgIAotVmFsdWUgICAgICAgICAgIFJOIDQgICAgCi1WYWx1ZTIgICAgICAgICAgUk4gNSAgICAKLXN0ck9mZnNldCAgICAgICBSTiA2ICAgIAotY3N0T2Zmc2V0ICAgICAgIFJOIDcgICAgCi0KLSAgICAgICAgCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NCwgcjcKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgcFNyYywgW3BwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgcFNyYwotICAgICAgICBNT1YgICAgIGNzdE9mZnNldCwgIzMxICAgICAgICAgICAgICAgICAgICAgIDsvLyBUbyBiZSB1c2VkIGluIHRoZSBsb29wLCB0byBjb21wdXRlIG9mZnNldAotICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOyBGaXJzdGx5LCBmaWxsIGFsbCB0aGUgY29lZmZpY2llbnQgdmFsdWVzIG9uIHRoZSA8cERzdD4gYnVmZmVyIGJ5IHplcm8KLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIFZhbHVlLCAgIzAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEluaXRpYWxpemUgdGhlIHplcm8gdmFsdWUKLSAgICAgICAgTU9WICAgICAgVmFsdWUyLCAjMCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6ZSB0aGUgemVybyB2YWx1ZQotICAgICAgICBMRFJCICAgICBGbGFnLCAgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgIDsvLyBQcmVsb2FkIDxGbGFnPiBiZWZvcmUgPHVucGFja0xvb3A+Ci0gICAgICAgIAotICAgICAgICBTVFJEICAgICBWYWx1ZSwgW3BEc3QsICMwXSAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzBdICA9IHBEc3RbMV0gID0gcERzdFsyXSAgPSBwRHN0WzNdICA9IDAKLSAgICAgICAgU1RSRCAgICAgVmFsdWUsIFtwRHN0LCAjOF0gICAgICAgICAgICAgICAgICA7Ly8gcERzdFs0XSAgPSBwRHN0WzVdICA9IHBEc3RbNl0gID0gcERzdFs3XSAgPSAwCi0gICAgICAgIFNUUkQgICAgIFZhbHVlLCBbcERzdCwgIzE2XSAgICAgICAgICAgICAgICAgOy8vIHBEc3RbOF0gID0gcERzdFs5XSAgPSBwRHN0WzEwXSA9IHBEc3RbMTFdID0gMAotICAgICAgICBTVFJEICAgICBWYWx1ZSwgW3BEc3QsICMyNF0gICAgICAgICAgICAgICAgIDsvLyBwRHN0WzEyXSA9IHBEc3RbMTNdID0gcERzdFsxNF0gPSBwRHN0WzE1XSA9IDAKLSAgICAgICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOy8vIFRoZSBsb29wIGJlbG93IHBhcnNlcyBhbmQgdW5wYWNrcyB0aGUgaW5wdXQgc3RyZWFtLiBUaGUgQy1tb2RlbCBoYXMgCi0gICAgICAgIDsvLyBhIHNvbWV3aGF0IGNvbXBsaWNhdGVkIGxvZ2ljIGZvciBzaWduIGV4dGVuc2lvbi4gIEJ1dCBpbiB0aGUgdjYgdmVyc2lvbiwKLSAgICAgICAgOy8vIHRoYXQgY2FuIGJlIGVhc2lseSB0YWtlbiBjYXJlIGJ5IGxvYWRpbmcgdGhlIGRhdGEgZnJvbSA8cFNyYz4gc3RyZWFtIGFzIAotICAgICAgICA7Ly8gU0lHTkVEIGJ5dGUvaGFsZndvcmQuIFNvLCBiYXNlZCBvbiB0aGUgZmlyc3QgVFNUIGluc3RydWN0aW9uLCA4LWJpdHMgb3IgCi0gICAgICAgIDsvLyAxNi1iaXRzIGFyZSByZWFkLgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE5leHQsIHRvIGNvbXB1dGUgdGhlIG9mZnNldCwgd2hlcmUgdGhlIHVucGFja2VkIHZhbHVlIG5lZWRzIHRvIGJlIHN0b3JlZCwKLSAgICAgICAgOy8vIHdlIG1vZGlmeSB0aGUgY29tcHV0YXRpb24gdG8gcGVyZm9ybSBbKEZsYWcgJiAxNSkgPCAxXSBhcyBbKEZsYWcgPCAxKSAmIDMxXQotICAgICAgICA7Ly8gVGhpcyByZXN1bHRzIGluIGEgc2F2aW5nIG9mIG9uZSBjeWNsZS4KLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLXVucGFja0xvb3AKLSAgICAgICAgVFNUICAgICAgRmxhZywgICMweDEwICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXB1dGluZyAoRmxhZyAmIDB4MTApCi0gICAgICAgIExEUlNCTkUgIFZhbHVlMixbcFNyYywjMV0gICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIGJ5dGUgd2lzZSB0byBhdm9pZCB1bmFsaWduZWQgYWNjZXNzICAgCi0gICAgICAgIExEUkJORSAgIFZhbHVlLCBbcFNyY10sICMyICAgICAgICAgICAgICAgICAgIAotICAgICAgICBBTkQgICAgICBzdHJPZmZzZXQsIGNzdE9mZnNldCwgRmxhZywgTFNMICMxICA7Ly8gc3RyT2Zmc2V0ID0gKEZsYWcgJiAxNSkgPCAxOwotICAgICAgICBMRFJTQkVRICBWYWx1ZSwgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgICA7Ly8gVmFsdWUgPSAoT01YX1U4KSAgKnBTcmMrKwotICAgICAgICBPUlJORSAgICBWYWx1ZSxWYWx1ZSxWYWx1ZTIsIExTTCAjOCAgICAgICAgICA7Ly8gVmFsdWUgPSAoT01YX1UxNikgKnBTcmMrKwotICAgICAgICAKLSAgICAgICAgVFNUICAgICAgRmxhZywgICMweDIwICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXB1dGluZyAoRmxhZyAmIDB4MjApIHRvIGNoZWNrLCBpZiB3ZSdyZSBkb25lCi0gICAgICAgIExEUkJFUSAgIEZsYWcsICBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgIDsvLyBGbGFnICA9IChPTVhfVTgpICpwU3JjKyssIGZvciBuZXh0IGl0ZXJhdGlvbgotICAgICAgICBTVFJIICAgICBWYWx1ZSwgW3BEc3QsIHN0ck9mZnNldF0gICAgICAgICAgICA7Ly8gU3RvcmUgPFZhbHVlPiBhdCBvZmZzZXQgPHN0ck9mZnNldD4KLSAgICAgICAgQkVRICAgICAgdW5wYWNrTG9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byB0aGUgbG9vcCBiZWdpbm5pbmcKLSAgICAgICAgCi0gICAgICAgIFNUUiAgICAgIHBTcmMsIFtwcFNyY10gICAgICAgICAgICAgICAgICAgICAgIDsvLyBVcGRhdGUgdGhlIGJpdHN0cmVhbSBwb2ludGVyCi0gICAgICAgIE1fRU5ECi0gICAgCi0gICAgRU5ESUYKLSAgICAKLSAgICAKLSAgICAKLSAgICBFTkQKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRhZGVhOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGludHJhIGNocm9tYSBkZWJsb2NrCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgZGVibG9ja2luZyBmaWx0ZXJpbmcgb24gYWxsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgbWFjcm9ibG9jayAoMTZ4MTYpLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyY0RzdCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2suIE11c3QgYmUgOC1ieXRlIGFsaWduZWQuCi0gKiBbaW5dCXNyY2RzdFN0ZXAgICAgICBTdGVwIG9mIHRoZSBhcnJheXMKLSAqIFtpbl0JcEFscGhhICAgICAgICAgIHBvaW50ZXIgdG8gYSAyeDIgYXJyYXkgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgZXh0ZXJuYWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCAgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0KLSAqIFtpbl0JcEJldGEJCQlwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIGJldGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgZXh0ZXJuYWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgIGhvcml6b250YWwgZWRnZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwgIGhvcml6b250YWwgZWRnZSB9Ci0gKiBbaW5dCXBUaHJlc2hvbGRzCQlBQXJyYXkgb2Ygc2l6ZSAgOHgyIG9mIFRocmVzaG9sZHMgKFRDMCkgKHZhbHVlcyBmb3IgdGhlIGxlZnQgb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDIgb3IgMng0IGJsb2NrLCBhcnJhbmdlZCBpbiAgdmVydGljYWwgYmxvY2sgb3JkZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluICBob3Jpem9udGFsIGJsb2NrIG9yZGVyKQotICogW2luXQlwQlMJCQkJYXJyYXkgb2Ygc2l6ZSAxNngyIG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgb3JkZXIgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXMpOwotICogICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjFdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuCi0gKiBbb3V0XQlwU3JjRHN0CQlwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCi0gKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKLSAqICAgLSBFaXRoZXIgb2YgdGhlIHBvaW50ZXJzIGluIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUcmVzaG9sZHMsIG9yIHBCUyBpcyBOVUxMLgotICogICAtIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLgotICogICAtIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLgotICogICAtIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIChwQlNbaV09PTQgJiYgcEJTW2leMV0hPTQpIGZvciAwPD1pPD0zLgotICogICAtIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4KLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSgKLQlPTVhfVTgqIHBTcmNEc3QsIAotCU9NWF9TMzIgc3JjZHN0U3RlcCwgCi0JY29uc3QgT01YX1U4KiBwQWxwaGEsIAotCWNvbnN0IE9NWF9VOCogcEJldGEsIAotCWNvbnN0IE9NWF9VOCogcFRocmVzaG9sZHMsCi0gICAgY29uc3QgT01YX1U4ICpwQlMKLSkKLXsKLSAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOwotICAgIAotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0RzdCksICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoc3JjZHN0U3RlcCAmIDcsICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBBbHBoYSA9PSBOVUxMLCAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHMgPT0gTlVMTCwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwVGhyZXNob2xkcyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQlMgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBCUyksICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSgKLSAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIHBCUyk7Ci0KLSAgICBhcm1SZXRBcmdFcnJJZihlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciwgZXJyb3JDb2RlKQotICAgIAotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0koCi0gICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSsyLCBwQmV0YSsyLCBwVGhyZXNob2xkcys4LCBwQlMrMTYpOwotCi0gICAgcmV0dXJuIGVycm9yQ29kZTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjQ3ZGMyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBsdW1hIGRlYmxvY2sKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0gCi0KLS8qKgotICogRnVuY3Rpb246IG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBkZWJsb2NrIGZpbHRlcmluZyB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgZWRnZXMgb2YgYSBsdW1hIG1hY3JvYmxvY2sKLSAqKDE2eDE2KS4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBTcmNEc3QgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrLiBNdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLgotICogW2luXQlzcmNkc3RTdGVwICAgICAgaW1hZ2Ugd2lkdGgKLSAqIFtpbl0JcEFscGhhICAgICAgICAgIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgZXh0ZXJuYWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCBob3Jpem9udGFsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0KLSAqIFtpbl0JcEJldGEJCQlwb2ludGVyIHRvIGEgMngyIHRhYmxlIG9mIGJldGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgZXh0ZXJuYWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgIGhvcml6b250YWwgZWRnZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwgIGhvcml6b250YWwgZWRnZSB9Ci0gKiBbaW5dCXBUaHJlc2hvbGRzCQlwb2ludGVyIHRvIGEgMTZ4MiB0YWJsZSBvZiB0aHJlc2hvbGQgKFRDMCksIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IHZhbHVlcyBmb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlICBsZWZ0IG9yIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIGFycmFuZ2VkIGluICB2ZXJ0aWNhbCBibG9jayBvcmRlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbiBob3Jpem9udGFsIGJsb2NrIG9yZGVyKQotICogW2luXQlwQlMJCQkJIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIEJTIHBhcmFtZXRlcnMgYXJyYW5nZWQgaW4gc2NhbiBibG9jayBvcmRlciBmb3IgdmVydGljYWwgZWRnZXMgYW5kIHRoZW4gaG9yaXpvbnRhbCBlZGdlczsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4xXT09IDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLgotICogW291dF0JcFNyY0RzdAkJcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKLSAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cwotICogICAgLSBFaXRoZXIgb2YgdGhlIHBvaW50ZXJzIGluIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUcmVzaG9sZHMgb3IgcEJTIGlzIE5VTEwuCi0gKiAgICAtIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLgotICogICAgLSBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDgKLSAqICAgIC0gcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgKHBCU1tpXT09NCAmJiBwQlNbaV4xXSE9NCkgZm9yIDA8PWk8PTMuCi0uCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0koCi0JT01YX1U4KiBwU3JjRHN0LCAKLQlPTVhfUzMyIHNyY2RzdFN0ZXAsIAotCWNvbnN0IE9NWF9VOCogcEFscGhhLCAKLQljb25zdCBPTVhfVTgqIHBCZXRhLCAKLQljb25zdCBPTVhfVTgqIHBUaHJlc2hvbGRzLCAKLQljb25zdCBPTVhfVTggKnBCUwotKQotewotICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7Ci0gICAgCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoc3JjZHN0U3RlcCAmIDcsICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7ICAgIAotICAgIGFybVJldEFyZ0VycklmKHBBbHBoYSA9PSBOVUxMLCAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCZXRhID09IE5VTEwsICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzID09IE5VTEwsICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwVGhyZXNob2xkcyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQlMgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBCUyksICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0koCi0gICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBwQlMpOwotCi0gICAgYXJtUmV0QXJnRXJySWYoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIsIGVycm9yQ29kZSkKLSAgICAKLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSgKLSAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhKzIsIHBCZXRhKzIsIHBUaHJlc2hvbGRzKzE2LCBwQlMrMTYpOwotCi0gICAgcmV0dXJuIGVycm9yQ29kZTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2Q2NWNhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGRlY29kZSBjb2VmZmljaWVudHMgbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHJhc3RlciBzY2FuIGZvciAyeDIgYmxvY2sgb2YgCi0gKiBDaHJvbWFEQ0xldmVsLiBUaGUgZGVjb2RlZCBjb2VmZmljaWVudHMgaW4gcGFja2VkIHBvc2l0aW9uLWNvZWZmaWNpZW50IAotICogYnVmZmVyIGFyZSBzdG9yZWQgaW4gaW5jcmVhc2luZyByYXN0ZXIgc2NhbiBvcmRlciwgbmFtZWx5IHBvc2l0aW9uIG9yZGVyLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBCaXRTdHJlYW0JCURvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtCi0gKgkJCQkJCQkJYnVmZmVyCi0gKiBbaW5dCXBPZmZzZXQJCQlQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIAotICoJCQkJCQkJCXBvaW50ZWQgdG8gYnkgKnBwQml0U3RyZWFtCi0gKiBbb3V0XQlwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCi0gKiBbb3V0XQlwT2Zmc2V0CQkJKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKLSAqIFtvdXRdCXBOdW1Db2VmZgkJUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzCi0gKgkJCQkJCQkJaW4gdGhpcyBibG9jawotICogW291dF0JcHBQb3NDb2VmYnVmCURvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsCi0gKgkJCQkJCQkJY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICgKLSAgICAgY29uc3QgT01YX1U4KiogcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9TMzIqIHBPZmZzZXQsCi0gICAgIE9NWF9VOCogcE51bUNvZWZmLAotICAgICBPTVhfVTgqKiBwcFBvc0NvZWZidWYgICAgICAgIAotICkKLQotewotICAgIHJldHVybiBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcihwcEJpdFN0cmVhbSwgcE9mZnNldCwgcE51bUNvZWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcFBvc0NvZWZidWYsIDE3LCA0KTsKLQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY5NzA2Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGRlY29kZSBjb2VmZmljaWVudHMgbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3IgNHg0IGJsb2NrIG9mIAotICogSW50cmExNngxNkRDTGV2ZWwsIEludHJhMTZ4MTZBQ0xldmVsLEx1bWFMZXZlbCwgYW5kIENocm9tYUFDTGV2ZWwuIAotICogSW52ZXJzZSBmaWVsZCBzY2FuIGlzIG5vdCBzdXBwb3J0ZWQuIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiBwYWNrZWQgCi0gKiBwb3NpdGlvbi1jb2VmZmljaWVudCBidWZmZXIgYXJlIHN0b3JlZCBpbiBpbmNyZWFzaW5nIHppZ3phZyBvcmRlciBpbnN0ZWFkIAotICogb2YgcG9zaXRpb24gb3JkZXIuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyCi0gKiBbaW5dCXBPZmZzZXQJCQlQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0KLSAqIFtpbl0Jc01heE51bUNvZWZmCU1heGltdW0gbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpbiBjdXJyZW50Ci0gKgkJCQkJCQkJYmxvY2sKLSAqIFtpbl0Jc1ZMQ1NlbGVjdAkJVkxDIHRhYmxlIHNlbGVjdG9yLCBvYnRhaW5lZCBmcm9tIG51bWJlciBvZiBub24temVybwotICoJCQkJCQkJCUFDIGNvZWZmaWNpZW50cyBvZiBhYm92ZSBhbmQgbGVmdCA0eDQgYmxvY2tzLiBJdCBpcyAKLSAqCQkJCQkJCQllcXVpdmFsZW50IHRvIHRoZSB2YXJpYWJsZSBuQyBkZXNjcmliZWQgaW4gSC4yNjQgc3RhbmRhcmQgCi0gKgkJCQkJCQkJdGFibGUgOS01LCBleGNlcHQgaXRzIHZhbHVlIGNhbqGvdCBiZSBsZXNzIHRoYW4gemVyby4KLSAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKLSAqIFtvdXRdCXBPZmZzZXQJCQkqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAotICogW291dF0JcE51bUNvZWZmCQlQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4KLSAqCQkJCQkJCQl0aGlzIGJsb2NrCi0gKiBbb3V0XQlwcFBvc0NvZWZidWYJRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwKLSAqCQkJCQkJCQljb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlcgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMoCi0gICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfUzMyKiBwT2Zmc2V0LAotICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKLSAgICAgT01YX1U4KipwcFBvc0NvZWZidWYsCi0gICAgIE9NWF9JTlQgc1ZMQ1NlbGVjdCwKLSAgICAgT01YX0lOVCBzTWF4TnVtQ29lZmYgICAgICAgIAotICkKLXsKLSAgICByZXR1cm4gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIHBOdW1Db2VmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBQb3NDb2VmYnVmLCBzVkxDU2VsZWN0LCBzTWF4TnVtQ29lZmYpOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxODdmMmIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MucworKysgL2Rldi9udWxsCkBAIC0xLDQ5NCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDcgQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vCi07Ly8gRGVzY3JpcHRpb246Ci07Ly8gSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSBhbmQgdHJhbnNmb3JtIG1vZHVsZQotOy8vIAotOy8vIAotCi0gICAgICAgIAotCi07Ly8gSW5jbHVkZSBzdGFuZGFyZCBoZWFkZXJzCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLTsvLyBJbXBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tIG90aGVyIGZpbGVzCi07Ly8gKEZvciBleGFtcGxlIHRhYmxlcykKLSAgICAKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfUVBEaXZUYWJsZQotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9WTWF0cml4VTE2Ci0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1FQTW9kdWxvVGFibGUgCi0gICAgICAgIAotICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTLCBBUk0xMTM2SlNfVQotICAgICAgICAKLTsvLyBTZXQgZGVidWdnaW5nIGxldmVsICAgICAgICAKLTsvL0RFQlVHX09OICAgIFNFVEwge1RSVUV9Ci0KLQotOy8vIFN0YXRpYyBGdW5jdGlvbjogYXJtVkNNNFAxMF9EZXF1YW50THVtYUFDNHg0Ci0KLTsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKLSAgICAKLSAgICBJRiAgQVJNMTEzNkpTIAotICAgIAotOy8vSW5wdXQgUmVnaXN0ZXJzCi1wU3JjRHN0ICAgICAgIFJOICAwCi1RUCAgICAgICAgICAgIFJOICAxCi0KLQotOy8vT3V0cHV0IFJlZ2lzdGVycwotCi0KLTsvL0xvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCi1wUVBkaXYgICAgICAgICAgUk4gIDQKLXBRUG1vZCAgICAgICAgICBSTiAgNQotcFZSb3cgICAgICAgICAgIFJOICAyCi1RUG1vZCAgICAgICAgICAgUk4gIDYKLXNoaWZ0ICAgICAgICAgICBSTiAgMwotcm93THVtYTAxICAgICAgIFJOICAxCi1yb3dMdW1hMjMgICAgICAgUk4gIDQKLQotU3JjRHN0MDAgICAgICAgIFJOICA1Ci1TcmNEc3QwMiAgICAgICAgUk4gIDYKLVNyY0RzdDEwICAgICAgICBSTiAgNwotU3JjRHN0MTIgICAgICAgIFJOICA4Ci1TcmNEc3QyMCAgICAgICAgUk4gIDkKLVNyY0RzdDIyICAgICAgICBSTiAgMTAKLVNyY0RzdDMwICAgICAgICBSTiAgMTEKLVNyY0RzdDMyICAgICAgICBSTiAgMTIKLQotdGVtcDEgICAgICAgICAgIFJOICAyCi10ZW1wMiAgICAgICAgICAgUk4gIDMKLXRlbXAzICAgICAgICAgICBSTiAgMTQKLSAgICAKLSAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0RlcXVhbnRMdW1hQUM0eDQscjExCi0gICAgICAgICAKLSAgICAgICAgTERSICAgIHBRUG1vZCw9YXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCi0gICAgICAgIExEUiAgICBwUVBkaXYsPWFybVZDTTRQMTBfUVBEaXZUYWJsZSAgICAgICAgCi0gICAgICAgIExEUiAgICBwVlJvdyw9YXJtVkNNNFAxMF9WTWF0cml4VTE2Ci0gICAgICAgICAKLSAgICAgICAgTERSU0IgIFFQbW9kLFtwUVBtb2QsUVBdICAgICAgICAgICAgICAgICAgICA7Ly8gKFFQJTYpICogNgotICAgICAgICBMRFJTQiAgc2hpZnQsW3BRUGRpdixRUF0gICAgICAgICAgICAgICAgICAgIDsvLyBTaGlmdCA9IFFQIC8gNgotICAgICAgICAgICAgICAgIAotICAgICAgICBMRFJIICAgIHJvd0x1bWEwMSxbcFZSb3csUVBtb2RdISAgICAgICAgICAgICA7Ly8gcm93THVtYTAxID0gWzAwfDBhXQotICAgICAgICBMRFJIICAgIHRlbXAzLFtwVlJvdywjMl0gICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDMgICAgID0gWzAwfDBiXSAgIAotICAgICAgICBMRFJIICAgIHJvd0x1bWEyMyxbcFZSb3csIzRdICAgICAgICAgICAgICAgICA7Ly8gcm93THVtYTIzID0gWzAwfDBjXSAKLSAgICAgICAgT1JSICAgICByb3dMdW1hMDEscm93THVtYTAxLHRlbXAzLExTTCAjMTYgICAgOy8vIHJvd0x1bWEwMSA9IFswYnwwYV0gICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIGFsbCB0aGUgMTYgJ3NyYycgdmFsdWVzCi0gICAgICAgIExETUlBICAgcFNyY0RzdCx7U3JjRHN0MDAsU3JjRHN0MDIsU3JjRHN0MTAsU3JjRHN0MTIsU3JjRHN0MjAsU3JjRHN0MjIsU3JjRHN0MzAsU3JjRHN0MzJ9Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJ1NoaWZ0JyByYW5nZXMgYmV0d2VlbiBbMCw4XSAKLSAgICAgICAgOy8vIFNvIHdlIGNhbiBzaGlmdCB0aGUgcGFja2VkIHJvd0x1bWEgdmFsdWVzIFswYnwwYV0gd2l0aCBhIHNpbmdsZSBMU0wgb3BlcmF0aW9uCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgCi0gICAgICAgIExTTCAgICByb3dMdW1hMDEscm93THVtYTAxLHNoaWZ0Ci0gICAgICAgIExTTCAgICByb3dMdW1hMjMscm93THVtYTIzLHNoaWZ0Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFRoZSBpZGVhIGlzIHRvIHVucm9sbCB0aGUgTG9vcCBjb21wbGV0ZWx5Ci0gICAgICAgIDsvLyBBbGwgdGhlIDE2IHNyYyB2YWx1ZXMgYXJlIGxvYWRlZCBhdCBvbmNlIGludG8gOCByZWdpc3RlcnMgOiBTcmNEc3Q8eT48eD4gKGFib3ZlKQotICAgICAgICA7Ly8gMDw9IGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0W2ldIDw9MiBmb3IgYW55ICdpPDE2JyAKLSAgICAgICAgOy8vIFNvIHRoZSBvbmx5IHZhbHVlcyBvZiBwVlJvd1tpXSB0aGF0IG5lZWQgdG8gYmUgbG9hZGVkIGFyZSBmb3IgaT0wLDEsMgotICAgICAgICA7Ly8gVGhlc2UgMyB2YWx1ZXMgYXJlIGxvYWRlZCBpbnRvIHJvd0x1bWEwMSBhbmQgcm93THVtYTIzIChhYm92ZSkKLSAgICAgICAgOy8vIFdlIGZpcnN0IGNhbGN1bGF0ZSBwVlJvd1thcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFtpXV0pIDw8IFNoaWZ0IHdoaWNoIGZpdHMgaW50byAxNiBiaXRzIChhYm92ZSkKLSAgICAgICAgOy8vIFRoZW4gdGhlIHByb2R1Y3QgcFNyY0RzdFtpXSAqIChwVlJvd1thcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFtpXV0gPDwgU2hpZnQpIGlzIGNhbGN1bGF0ZWQKLSAgICAgICAgOy8vIEhlcmUgd2UgaW50ZXJsZWF2ZSB0aGUgUEtIQlQgb3BlcmF0aW9ucyBmb3IgdmFyaW91cyByb3dzICB0byBhdm9pZGUgcGlwZWxpbmUgc3RhbGxzCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIFdlIHRoZW4gcGFjayB0aGUgdHdvIDE2IGJpdCBtdWx0aXBsaWNhdGlvbiByZXN1bHQgaW50byBhIHdvcmQgYW5kIHN0b3JlIGF0IG9uZSBnbwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBSb3cgMQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFNNVUxUQiAgdGVtcDEsU3JjRHN0MDAscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxXSAqIChwVlJvd1syXTw8U2hpZnQpIAotICAgICAgICBTTVVMQkIgIFNyY0RzdDAwLFNyY0RzdDAwLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMF0gKiAocFZSb3dbMF08PFNoaWZ0KSAgCi0gICAgICAgIAotICAgICAgICBTTVVMVEIgIHRlbXAyLFNyY0RzdDAyLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbM10gKiAocFZSb3dbMl08PFNoaWZ0KSAKLSAgICAgICAgU01VTEJCICBTcmNEc3QwMixTcmNEc3QwMixyb3dMdW1hMDEgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzJdICogKHBWUm93WzBdPDxTaGlmdCkKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgU3JjRHN0MDAsU3JjRHN0MDAsdGVtcDEsTFNMICMxNiAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgZmlyc3QgdHdvIHByb2R1Y3QgdmFsdWVzCi0gICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gUm93IDIKLSAgICAgICAgU01VTFRUICB0ZW1wMSxTcmNEc3QxMCxyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzVdICogKHBWUm93WzFdPDxTaGlmdCkKLSAgICAgICAgU01VTEJCICBTcmNEc3QxMCxTcmNEc3QxMCxyb3dMdW1hMjMgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzRdICogKHBWUm93WzJdPDxTaGlmdCkKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgU3JjRHN0MDIsU3JjRHN0MDIsdGVtcDIsTFNMICMxNiAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgbmV4dCB0d28gcHJvZHVjdCB2YWx1ZXMKLSAgICAgICAgU01VTFRUICB0ZW1wMixTcmNEc3QxMixyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzddICogKHBWUm93WzFdPDxTaGlmdCkKLSAgICAgICAgU01VTEJCICBTcmNEc3QxMixTcmNEc3QxMixyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzZdICogKHBWUm93WzJdPDxTaGlmdCkKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgU3JjRHN0MTAsU3JjRHN0MTAsdGVtcDEsTFNMICMxNiAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgbmV4dCB0d28gcHJvZHVjdCB2YWx1ZXMKLSAgICAgICAgCi0gICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIFJvdyAzICAgIAotICAgICAgICAKLSAgICAgICAgU01VTFRCICB0ZW1wMSxTcmNEc3QyMCxyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzldICogKHBWUm93WzJdPDxTaGlmdCkgICAgICAgICAKLSAgICAgICAgU01VTEJCICBTcmNEc3QyMCxTcmNEc3QyMCxyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzhdICogKHBWUm93WzBdPDxTaGlmdCkgIAotICAgICAgIAotICAgICAgICBQS0hCVCAgIFNyY0RzdDEyLFNyY0RzdDEyLHRlbXAyLExTTCAjMTYgICAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgbmV4dCB0d28gcHJvZHVjdCB2YWx1ZXMKLSAgICAgICAgU01VTFRCICB0ZW1wMixTcmNEc3QyMixyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzExXSAqIChwVlJvd1syXTw8U2hpZnQpIAotICAgICAgICBTTVVMQkIgIFNyY0RzdDIyLFNyY0RzdDIyLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTBdICogKHBWUm93WzBdPDxTaGlmdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBQS0hCVCAgIFNyY0RzdDIwLFNyY0RzdDIwLHRlbXAxLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIG5leHQgdHdvIHByb2R1Y3QgdmFsdWVzCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gUm93IDQgICAKLSAgICAgICAgCi0gICAgICAgIFNNVUxUVCAgdGVtcDEsU3JjRHN0MzAscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxM10gKiAocFZSb3dbMV08PFNoaWZ0KQotICAgICAgICBTTVVMQkIgIFNyY0RzdDMwLFNyY0RzdDMwLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTJdICogKHBWUm93WzJdPDxTaGlmdCkKLSAgICAgICAgCi0gICAgICAgIFNNVUxUVCAgdGVtcDMsU3JjRHN0MzIscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxNV0gKiAocFZSb3dbMV08PFNoaWZ0KQotICAgICAgICBTTVVMQkIgIFNyY0RzdDMyLFNyY0RzdDMyLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTRdICogKHBWUm93WzJdPDxTaGlmdCkKLSAgICAgICAKLSAgICAgICAgUEtIQlQgICBTcmNEc3QyMixTcmNEc3QyMix0ZW1wMixMU0wgIzE2ICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSByZW1haW5pbmcgcHJvZHVjdCB2YWx1ZXMKLSAgICAgICAgUEtIQlQgICBTcmNEc3QzMCxTcmNEc3QzMCx0ZW1wMSxMU0wgIzE2Ci0gICAgICAgIFBLSEJUICAgU3JjRHN0MzIsU3JjRHN0MzIsdGVtcDMsTFNMICMxNgotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFNUTUlBICAgcFNyY0RzdCx7U3JjRHN0MDAsU3JjRHN0MDIsU3JjRHN0MTAsU3JjRHN0MTIsU3JjRHN0MjAsU3JjRHN0MjIsU3JjRHN0MzAsU3JjRHN0MzJ9Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKLSAgICAgICAgICAKLSAgICAgICAgICAgCi0gICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIHRhaWwKLSAgICAgICAgTV9FTkQKLSAgICAgICAgCi0gICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTICAgICAgICAKLSAKLQotOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQotICAgIAotICAgIElGICBBUk0xMTM2SlNfVQotICAgIAotOy8vSW5wdXQgUmVnaXN0ZXJzCi1wU3JjRHN0ICAgICAgIFJOICAwCi1RUCAgICAgICAgICAgIFJOICAxCi0KLQotOy8vT3V0cHV0IFJlZ2lzdGVycwotCi0KLTsvL0xvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCi1wUVBkaXYgICAgICAgICAgUk4gIDQKLXBRUG1vZCAgICAgICAgICBSTiAgNQotcFZSb3cgICAgICAgICAgIFJOICAyCi1RUG1vZCAgICAgICAgICAgUk4gIDYKLXNoaWZ0ICAgICAgICAgICBSTiAgMwotcm93THVtYTAxICAgICAgIFJOICAxCi1yb3dMdW1hMjMgICAgICAgUk4gIDQKLQotU3JjRHN0MDAgICAgICAgIFJOICA1Ci1TcmNEc3QwMiAgICAgICAgUk4gIDYKLVNyY0RzdDEwICAgICAgICBSTiAgNwotU3JjRHN0MTIgICAgICAgIFJOICA4Ci1TcmNEc3QyMCAgICAgICAgUk4gIDkKLVNyY0RzdDIyICAgICAgICBSTiAgMTAKLVNyY0RzdDMwICAgICAgICBSTiAgMTEKLVNyY0RzdDMyICAgICAgICBSTiAgMTIKLQotdGVtcDEgICAgICAgICAgIFJOICAyCi10ZW1wMiAgICAgICAgICAgUk4gIDMKLXRlbXAzICAgICAgICAgICBSTiAgMTQKLSAgICAKLSAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0RlcXVhbnRMdW1hQUM0eDQscjExCi0gICAgICAgICAKLSAgICAgICAgTERSICAgIHBRUG1vZCw9YXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCi0gICAgICAgIExEUiAgICBwUVBkaXYsPWFybVZDTTRQMTBfUVBEaXZUYWJsZSAgICAgICAgCi0gICAgICAgIExEUiAgICBwVlJvdyw9YXJtVkNNNFAxMF9WTWF0cml4VTE2Ci0gICAgICAgICAKLSAgICAgICAgTERSU0IgIFFQbW9kLFtwUVBtb2QsUVBdICAgICAgICAgICAgICAgICAgICA7Ly8gKFFQJTYpICogNgotICAgICAgICBMRFJTQiAgc2hpZnQsW3BRUGRpdixRUF0gICAgICAgICAgICAgICAgICAgIDsvLyBTaGlmdCA9IFFQIC8gNgotICAgICAgICAgICAgICAgIAotICAgICAgICBMRFIgICAgcm93THVtYTAxLFtwVlJvdyxRUG1vZF0hICAgICAgICAgICAgIDsvLyByb3dMdW1hMDEgPSBbMGJ8MGFdCi0gICAgICAgIExEUiAgICByb3dMdW1hMjMsW3BWUm93LCM0XSAgICAgICAgICAgICAgICAgOy8vIHJvd0x1bWEyMyA9IFswZHwwY10gICAgCi0KLSAgICAgICAgOy8vIExvYWQgYWxsIHRoZSAxNiAnc3JjJyB2YWx1ZXMKLSAgICAgICAgTERNSUEgICBwU3JjRHN0LHtTcmNEc3QwMCxTcmNEc3QwMixTcmNEc3QxMCxTcmNEc3QxMixTcmNEc3QyMCxTcmNEc3QyMixTcmNEc3QzMCxTcmNEc3QzMn0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAnU2hpZnQnIHJhbmdlcyBiZXR3ZWVuIFswLDhdIAotICAgICAgICA7Ly8gU28gd2UgY2FuIHNoaWZ0IHRoZSBwYWNrZWQgcm93THVtYSB2YWx1ZXMgWzBifDBhXSB3aXRoIGEgc2luZ2xlIExTTCBvcGVyYXRpb24KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAKLSAgICAgICAgTFNMICAgIHJvd0x1bWEwMSxyb3dMdW1hMDEsc2hpZnQKLSAgICAgICAgTFNMICAgIHJvd0x1bWEyMyxyb3dMdW1hMjMsc2hpZnQKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gVGhlIGlkZWEgaXMgdG8gdW5yb2xsIHRoZSBMb29wIGNvbXBsZXRlbHkKLSAgICAgICAgOy8vIEFsbCB0aGUgMTYgc3JjIHZhbHVlcyBhcmUgbG9hZGVkIGF0IG9uY2UgaW50byA4IHJlZ2lzdGVycyA6IFNyY0RzdDx5Pjx4PiAoYWJvdmUpCi0gICAgICAgIDsvLyAwPD0gYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbaV0gPD0yIGZvciBhbnkgJ2k8MTYnIAotICAgICAgICA7Ly8gU28gdGhlIG9ubHkgdmFsdWVzIG9mIHBWUm93W2ldIHRoYXQgbmVlZCB0byBiZSBsb2FkZWQgYXJlIGZvciBpPTAsMSwyCi0gICAgICAgIDsvLyBUaGVzZSAzIHZhbHVlcyBhcmUgbG9hZGVkIGludG8gcm93THVtYTAxIGFuZCByb3dMdW1hMjMgKGFib3ZlKQotICAgICAgICA7Ly8gV2UgZmlyc3QgY2FsY3VsYXRlIHBWUm93W2FybVZDTTRQMTBfUG9zVG9WQ29sNHg0W2ldXSkgPDwgU2hpZnQgd2hpY2ggZml0cyBpbnRvIDE2IGJpdHMgKGFib3ZlKQotICAgICAgICA7Ly8gVGhlbiB0aGUgcHJvZHVjdCBwU3JjRHN0W2ldICogKHBWUm93W2FybVZDTTRQMTBfUG9zVG9WQ29sNHg0W2ldXSA8PCBTaGlmdCkgaXMgY2FsY3VsYXRlZAotICAgICAgICA7Ly8gSGVyZSB3ZSBpbnRlcmxlYXZlIHRoZSBQS0hCVCBvcGVyYXRpb25zIGZvciB2YXJpb3VzIHJvd3MgIHRvIGF2b2lkZSBwaXBlbGluZSBzdGFsbHMKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gV2UgdGhlbiBwYWNrIHRoZSB0d28gMTYgYml0IG11bHRpcGxpY2F0aW9uIHJlc3VsdCBpbnRvIGEgd29yZCBhbmQgc3RvcmUgYXQgb25lIGdvCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFJvdyAxCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgU01VTFRCICB0ZW1wMSxTcmNEc3QwMCxyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzFdICogKHBWUm93WzJdPDxTaGlmdCkgCi0gICAgICAgIFNNVUxCQiAgU3JjRHN0MDAsU3JjRHN0MDAscm93THVtYTAxICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFswXSAqIChwVlJvd1swXTw8U2hpZnQpICAKLSAgICAgICAgCi0gICAgICAgIFNNVUxUQiAgdGVtcDIsU3JjRHN0MDIscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFszXSAqIChwVlJvd1syXTw8U2hpZnQpIAotICAgICAgICBTTVVMQkIgIFNyY0RzdDAyLFNyY0RzdDAyLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMl0gKiAocFZSb3dbMF08PFNoaWZ0KQotICAgICAgICAKLSAgICAgICAgUEtIQlQgICBTcmNEc3QwMCxTcmNEc3QwMCx0ZW1wMSxMU0wgIzE2ICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSBmaXJzdCB0d28gcHJvZHVjdCB2YWx1ZXMKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBSb3cgMgotICAgICAgICBTTVVMVFQgIHRlbXAxLFNyY0RzdDEwLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbNV0gKiAocFZSb3dbMV08PFNoaWZ0KQotICAgICAgICBTTVVMQkIgIFNyY0RzdDEwLFNyY0RzdDEwLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbNF0gKiAocFZSb3dbMl08PFNoaWZ0KQotICAgICAgICAKLSAgICAgICAgUEtIQlQgICBTcmNEc3QwMixTcmNEc3QwMix0ZW1wMixMU0wgIzE2ICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSBuZXh0IHR3byBwcm9kdWN0IHZhbHVlcwotICAgICAgICBTTVVMVFQgIHRlbXAyLFNyY0RzdDEyLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbN10gKiAocFZSb3dbMV08PFNoaWZ0KQotICAgICAgICBTTVVMQkIgIFNyY0RzdDEyLFNyY0RzdDEyLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbNl0gKiAocFZSb3dbMl08PFNoaWZ0KQotICAgICAgICAKLSAgICAgICAgUEtIQlQgICBTcmNEc3QxMCxTcmNEc3QxMCx0ZW1wMSxMU0wgIzE2ICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSBuZXh0IHR3byBwcm9kdWN0IHZhbHVlcwotICAgICAgICAKLSAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gUm93IDMgICAgCi0gICAgICAgIAotICAgICAgICBTTVVMVEIgIHRlbXAxLFNyY0RzdDIwLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbOV0gKiAocFZSb3dbMl08PFNoaWZ0KSAgICAgICAgIAotICAgICAgICBTTVVMQkIgIFNyY0RzdDIwLFNyY0RzdDIwLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbOF0gKiAocFZSb3dbMF08PFNoaWZ0KSAgCi0gICAgICAgCi0gICAgICAgIFBLSEJUICAgU3JjRHN0MTIsU3JjRHN0MTIsdGVtcDIsTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSBuZXh0IHR3byBwcm9kdWN0IHZhbHVlcwotICAgICAgICBTTVVMVEIgIHRlbXAyLFNyY0RzdDIyLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTFdICogKHBWUm93WzJdPDxTaGlmdCkgCi0gICAgICAgIFNNVUxCQiAgU3JjRHN0MjIsU3JjRHN0MjIscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxMF0gKiAocFZSb3dbMF08PFNoaWZ0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFBLSEJUICAgU3JjRHN0MjAsU3JjRHN0MjAsdGVtcDEsTFNMICMxNiAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgbmV4dCB0d28gcHJvZHVjdCB2YWx1ZXMKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBSb3cgNCAgIAotICAgICAgICAKLSAgICAgICAgU01VTFRUICB0ZW1wMSxTcmNEc3QzMCxyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzEzXSAqIChwVlJvd1sxXTw8U2hpZnQpCi0gICAgICAgIFNNVUxCQiAgU3JjRHN0MzAsU3JjRHN0MzAscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxMl0gKiAocFZSb3dbMl08PFNoaWZ0KQotICAgICAgICAKLSAgICAgICAgU01VTFRUICB0ZW1wMyxTcmNEc3QzMixyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzE1XSAqIChwVlJvd1sxXTw8U2hpZnQpCi0gICAgICAgIFNNVUxCQiAgU3JjRHN0MzIsU3JjRHN0MzIscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxNF0gKiAocFZSb3dbMl08PFNoaWZ0KQotICAgICAgIAotICAgICAgICBQS0hCVCAgIFNyY0RzdDIyLFNyY0RzdDIyLHRlbXAyLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIHJlbWFpbmluZyBwcm9kdWN0IHZhbHVlcwotICAgICAgICBQS0hCVCAgIFNyY0RzdDMwLFNyY0RzdDMwLHRlbXAxLExTTCAjMTYKLSAgICAgICAgUEtIQlQgICBTcmNEc3QzMixTcmNEc3QzMix0ZW1wMyxMU0wgIzE2Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgU1RNSUEgICBwU3JjRHN0LHtTcmNEc3QwMCxTcmNEc3QwMixTcmNEc3QxMCxTcmNEc3QxMixTcmNEc3QyMCxTcmNEc3QyMixTcmNEc3QzMCxTcmNEc3QzMn0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQotICAgICAgICAgIAotICAgICAgICAgICAKLSAgICAgIAotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAotICAgICAgICBNX0VORAotICAgICAgICAKLSAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9BUk0xMTM2SlNfVSAgICAgICAgCi0KLQotCi0KLQotOy8vIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICAgICAgICAgICAgCi0gICAgCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0gICAgCi0gICAgSUYgIEFSTTExMzZKUwotICAgIAotOy8vSW5wdXQgUmVnaXN0ZXJzCi1wcFNyYyAgICAgICBSTiAgMAotcFByZWQgICAgICAgUk4gIDEKLXBEQyAgICAgICAgIFJOICAyCi1wRHN0ICAgICAgICBSTiAgMwotICAgCi0KLTsvL091dHB1dCBSZWdpc3RlcnMKLXJlc3VsdCAgICAgIFJOICAwCi0KLTsvL0xvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCi1wRGVsdGEgICAgICBSTiAgNAotcERlbHRhVG1wICAgUk4gIDYKLUFDICAgICAgICAgIFJOICA1ICAgICAgICAgICAgICAgICAgIDsvL0xvYWQgZnJvbSBzdGFjawotcFByZWRUZW1wICAgUk4gIDcKLXBEQ1RlbXAgICAgIFJOICA4Ci1wRHN0VGVtcCAgICBSTiAgOQotcERlbHRhQXJnMSAgUk4gIDEKLXBEZWx0YUFyZzAgIFJOICAwCi1RUCAgICAgICAgICBSTiAgMSAgICAgICAgICAgICAgICAgICA7Ly9Mb2FkIGZyb20gc3RhY2sKLURDdmFsICAgICAgIFJOICAxMCAgCi1EQ3ZhbENvcHkgICBSTiAgMTEKLXByZWRzdGVwICAgIFJOICAxCi1kc3RTdGVwICAgICBSTiAgMTAKLXljb3VudGVyICAgIFJOICAwCi1QcmVkVmFsMSAgICBSTiAgMwotUHJlZFZhbDIgICAgUk4gIDUKLURlbHRhVmFsMSAgIFJOICAyCi1EZWx0YVZhbDIgICBSTiAgMTEKLVByZWRWYWwgICAgIFJOICA4Ci10bXBEZWx0YVZhbCBSTiAgNgotc3VtMSAgICAgICAgUk4gIDEyCi1zdW0yICAgICAgICBSTiAgMTQKLSAgICAKLSAgICAKLSAgICAgICAgICAgCi0gICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KLSAgICAgICAgTV9BTExPQzggcEJ1ZmZlciwgMzIKLSAgICAgICAgICAgICAgIAotCi0gICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQscjExCi0gICAgICAgIAotICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cwotICAgICAgICBNX0FSRyAgIHByZWRTdGVwT25TdGFjaywgNAotICAgICAgICBNX0FSRyAgIGRzdFN0ZXBPblN0YWNrLDQKLSAgICAgICAgTV9BUkcgICBRUE9uU3RhY2ssIDQKLSAgICAgICAgTV9BUkcgICBBQ09uU3RhY2ssNAotICAKLSAgICAgICAgCi0gICAgICAgIE1fQURSICAgcERlbHRhLHBCdWZmZXIgCi0gICAgICAgIE1fTERSICAgQUMsQUNPblN0YWNrIAotICAgICAgICAKLSAgICAgICAgIAotICAgICAgICA7Ly8gU2F2ZSByZWdpc3RlcnMgcjEscjIscjMgYmVmb3JlIGZ1bmN0aW9uIGNhbGwgICAgCi0gICAgICAgIE1PViAgICAgcFByZWRUZW1wLHBQcmVkCi0gICAgICAgIE1PViAgICAgcERDVGVtcCxwREMKLSAgICAgICAgTU9WICAgICBwRHN0VGVtcCxwRHN0Ci0gICAgICAgIAotICAgICAgICBDTVAgICAgIEFDLCMwCi0gICAgICAgIEJFUSAgICAgRENjYXNlCi0gICAgICAgIE1PViAgICAgcERlbHRhQXJnMSxwRGVsdGEgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IHVwIHIxIGZvciBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0Ci0gICAgCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAotICAgIAotICAgICAgICBNX0xEUiAgIFFQLFFQT25TdGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCB1cCByMSBmb3IgRGVxdWFudEx1bWFBQzR4NAotICAgICAgICBNT1YgICAgIHBEZWx0YUFyZzAscERlbHRhICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCB1cCByMCBmb3IgRGVxdWFudEx1bWFBQzR4NAotCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9EZXF1YW50THVtYUFDNHg0Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgQ01QICAgICBwRENUZW1wLCMwCi0gICAgICAgIExEUlNITkUgREN2YWwsW3BEQ1RlbXBdCi0gICAgICAgIE1PViAgICAgcERlbHRhQXJnMCxwRGVsdGEgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IHVwIHIwIGZvciBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0Ci0gICAgICAgIE1PViAgICAgcERlbHRhQXJnMSxwRGVsdGEgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IHVwIHIxIGZvciBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0Ci0gICAgICAgIFNUUkhORSAgREN2YWwsW3BEZWx0YV0KLSAgICAgICAgCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NAotICAgICAgICBCICAgICAgIE91dERDY2FzZSAKLSAgICAgICAgCi0KLURDY2FzZQotICAgICAgICBMRFJTSCAgIERDdmFsLFtwRENUZW1wXSAKLSAgICAgICAgQUREICAgICBEQ3ZhbCxEQ3ZhbCwjMzIgCi0gICAgICAgIEFTUiAgICAgREN2YWwsREN2YWwsIzYKLSAgICAgICAgUEtIQlQgICBEQ3ZhbCxEQ3ZhbCxEQ3ZhbCxMU0wgIzE2ICAgICAgICAgICAgICAgICAgOy8vIER1cGxpY2F0aW5nIHRoZSBMb3dlciBoYWxmd29yZAotICAgICAgICBNT1YgICAgIERDdmFsQ29weSwgREN2YWwgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTmVlZGVkIGZvciBTVFJECi0gICAgICAgIFNUUkQgICAgREN2YWwsIFtwRGVsdGEsICMwXSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRGVsdGFbMF0gID0gcERlbHRhWzFdICA9IHBEZWx0YVsyXSAgPSBwRGVsdGFbM10gPSBEQ3ZhbAotICAgICAgICBTVFJEICAgIERDdmFsLCBbcERlbHRhLCAjOF0gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERlbHRhWzRdICA9IHBEZWx0YVs1XSAgPSBwRGVsdGFbNl0gID0gcERlbHRhWzddID0gREN2YWwKLSAgICAgICAgU1RSRCAgICBEQ3ZhbCwgW3BEZWx0YSwgIzE2XSAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBEZWx0YVs4XSAgPSBwRGVsdGFbOV0gID0gcERlbHRhWzEwXSA9IHBEZWx0YVsxMV0gPSBEQ3ZhbAotICAgICAgICBTVFJEICAgIERDdmFsLCBbcERlbHRhLCAjMjRdICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgCi1PdXREQ2Nhc2UgICAgICAKLSAgICAgICAgTV9MRFIgICBwcmVkc3RlcCxwcmVkU3RlcE9uU3RhY2sKLSAgICAgICAgTV9MRFIgICBkc3RTdGVwLGRzdFN0ZXBPblN0YWNrCi0gICAgICAgIAotICAgICAgICBMRE1JQSAgIHBEZWx0YSEse3RtcERlbHRhVmFsLERlbHRhVmFsMn0gICAgICAgICAgICAgOy8vIFByZSBsb2FkCi0gICAgICAgIE1PViAgICAgeWNvdW50ZXIsIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ291bnRlciBmb3IgdGhlIFByZWRQbHVzRGVsdGFMb29wCi0gICAgICAgIExEUiAgICAgUHJlZFZhbCxbcFByZWRUZW1wXSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUHJlIGxvYWQKLQotUHJlZFBsdXNEZWx0YUxvb3AKLSAgICAgICAgCi0gICAgICAgCi0gICAgICAgIFNVQlMgICAgeWNvdW50ZXIseWNvdW50ZXIsIzEKLSAgICAgICAgQUREICAgICBwUHJlZFRlbXAscFByZWRUZW1wLHByZWRzdGVwICAgICAgICAgICAgICAgIDsvLyBJbmNyZW1lbnQgcFByZWQgcHRyCi0gICAgICAgIAotICAgICAgICBQS0hCVCAgIERlbHRhVmFsMSx0bXBEZWx0YVZhbCxEZWx0YVZhbDIsTFNMICMxNiAgICAgOy8vIERlbHRhdmFsMSA9IFtDIEFdICAgCi0gICAgICAgIFBLSFRCICAgRGVsdGFWYWwyLERlbHRhVmFsMix0bXBEZWx0YVZhbCxBU1IgIzE2ICAgICA7Ly8gRGVsdGFWYWwyID0gW0QgQl0KLSAgICAgICAgCi0gICAgICAgIFVYVEIxNiAgUHJlZFZhbDEsUHJlZFZhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUHJlZFZhbDEgPSBbMGMwYV0KLSAgICAgICAgVVhUQjE2ICBQcmVkVmFsMixQcmVkVmFsLFJPUiAjOCAgICAgICAgICAgICAgICAgICAgIDsvLyBQcmVkVmFsMiA9IFswZDBiXQotICAgICAgICAKLSAgICAgICAgTERSR1QgICBQcmVkVmFsLFtwUHJlZFRlbXBdICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQcmUgbG9hZAotICAgICAgICAKLSAgICAgICAgUUFERDE2ICBzdW0yLERlbHRhVmFsMixQcmVkVmFsMiAgICAgICAgICAgICAgICAgICAgIDsvLyBBZGQgYW5kIHNhdHVyYXRlIHRvIDE2IGJpdHMKLSAgICAgICAgUUFERDE2ICBzdW0xLERlbHRhVmFsMSxQcmVkVmFsMQotICAgICAgICAKLSAgICAgICAgVVNBVDE2ICBzdW0yLCM4LHN1bTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBhcm1DbGlwKDAsMjU1LHN1bTIpCi0gICAgICAgIFVTQVQxNiAgc3VtMSwjOCxzdW0xCi0gICAgICAgIAotICAgICAgICBMRE1HVElBICAgcERlbHRhISx7dG1wRGVsdGFWYWwsRGVsdGFWYWwyfSAgICAgICAgICAgOy8vIFByZSBsb2FkCi0gICAgICAgICAgCi0gICAgICAgIE9SUiAgICAgc3VtMSxzdW0xLHN1bTIsTFNMICM4ICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtMSA9IFtkY2JhXQotICAgICAgICBTVFIgICAgIHN1bTEsW3BEc3RUZW1wXQotICAgICAgICAKLSAgICAgICAgQUREICAgICBwRHN0VGVtcCxwRHN0VGVtcCxkc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBJbmNyZW1lbnQgcERzdCBwdHIKLSAgICAgICAgQkdUICAgICBQcmVkUGx1c0RlbHRhTG9vcCAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKLSAgICAgICAgTU9WICAgICByZXN1bHQsI09NWF9TdHNfTm9FcnIKLSAgICAgICAgCi1FbmQgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCi0gICAgICAgIAotICAgICAgICBNX0VORAotICAgICAgICAKLSAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9BUk0xMTM2SlMgICAKLSAgICAKLSAgICAKLTsvLyBGdW5jdGlvbjogb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCAgICAgICAgICAgIAotICAgIAotOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQotICAgIAotICAgIAotICAgICAgICAgCi0gICAgICAgICAgICAKLSAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTQwNDE4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLQotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0gICAgICAgIAotICAgICAgICBJRiBBUk0xMTM2SlMKLSAgICAgICAgCi1NQVNLXzAgICAgICBFUVUgMHgwMDAwMDAwMCAgIAotTUFTS18xICAgICAgRVFVIDB4MDEwMTAxMDEKLUxPT1BfQ09VTlQgIEVRVSAweDUwMDAwMDAwCi0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotCi1wU3JjRHN0ICAgICBSTiAwCi1zcmNkc3RTdGVwICBSTiAxCi1wQWxwaGFBcmcgICBSTiAyCi1wQmV0YUFyZyAgICBSTiAzCi0KLXBUaHJlc2hvbGRzIFJOIDYKLXBCUyAgICAgICAgIFJOIDkKLXBRMCAgICAgICAgIFJOIDAKLWJTICAgICAgICAgIFJOIDEwCi0KLWFscGhhICAgICAgIFJOIDYKLWFscGhhMCAgICAgIFJOIDYKLWFscGhhMSAgICAgIFJOIDgKLQotYmV0YSAgICAgICAgUk4gNwotYmV0YTAgICAgICAgUk4gNwotYmV0YTEgICAgICAgUk4gOQotCi07Ly8gRGVjbGFyZSBMb2NhbC9UZW1wb3JhcnkgdmFyaWFibGVzCi0KLTsvLyBQaXhlbHMKLXBfMCAgICAgICAgIFJOIDMgIAotcF8xICAgICAgICAgUk4gNSAgCi1xXzAgICAgICAgICBSTiA4ICAKLXFfMSAgICAgICAgIFJOIDkgIAotCi07Ly8gRmlsdGVyaW5nCi0KLWRwMHEwICAgICAgIFJOIDEyCi1kcDFwMCAgICAgICBSTiAxMgotZHExcTAgICAgICAgUk4gMTIKLQotYXAwcTAgICAgICAgUk4gNCAgCi1maWx0ICAgICAgICBSTiAyCi0gICAgICAgIAotbTAwICAgICAgICAgUk4gMTQKLW0wMSAgICAgICAgIFJOIDExCi0gICAgICAgICAgICAKLXBRMCAgICAgICAgIFJOIDAKLVN0ZXAgICAgICAgIFJOIDEKLSAgICAgICAgICAgIAotOy8vIE91dHB1dAotICAgICAgICAgICAgCi1QXzAgICAgICAgICBSTiA2Ci1RXzAgICAgICAgICBSTiA3IAotCi07Ly9EZWNsYXJhdGlvbnMgZm9yIGJTTFQ0IGtlcm5lbAotCi10QyAgICAgICAgICBSTiAxMgotdEMwICAgICAgICAgUk4gNQotdEMxICAgICAgICAgUk4gMTIKLXBvcyAgICAgICAgIFJOIDUKLW5lZyAgICAgICAgIFJOIDkKLQotOy8vRGVjbGFyYXRpb25zIGZvciBiU0dFNCBrZXJuZWwKLQotCi07Ly8gTWlzY2VsbGFub3VzCi1YWSAgICAgICAgICBSTiA4Ci0KLWEgICAgICAgICAgIFJOIDEwCi10MSAgICAgICAgICBSTiAxMAotdDIgICAgICAgICAgUk4gMTIKLXQzICAgICAgICAgIFJOIDE0Ci10NCAgICAgICAgICBSTiA2Ci10NSAgICAgICAgICBSTiA1Ci0KLSAgICAgICAgCi0gICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgCi0gICAgICAgIE1fQUxMT0M0IHBwVGhyZXNob2xkcyw0Ci0gICAgICAgIE1fQUxMT0M4IHBBbHBoYUJldGEwLDgKLSAgICAgICAgTV9BTExPQzggcEFscGhhQmV0YTEsOAotICAgICAgICBNX0FMTE9DOCBwWFlCUyw0Ci0gICAgICAgIE1fQUxMT0M0IHBwQlMsNAotICAgICAgICAKLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0ksIHIxMQotICAgICAgICAKLSAgICAgICAgOy8vSW5wdXQgYXJndW1lbnRzIG9uIHRoZSBzdGFjawotICAgICAgICBNX0FSRyAgIHBwVGhyZXNob2xkc0FyZywgNAotICAgICAgICBNX0FSRyAgIHBwQlNBcmcsIDQKLSAgICAgICAgCi0gICAgICAgIExEUkIgICAgYWxwaGExLCBbcEFscGhhQXJnLCMxXQotICAgICAgICBMRFJCICAgIGJldGExLCAgW3BCZXRhQXJnLCMxXQotICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHNBcmcKLSAgICAgICAgTERSICAgICBhLD1NQVNLXzEKLSAgICAgICAgTERSQiAgICBiZXRhMCwgIFtwQmV0YUFyZ10KLSAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIExEUkIgICAgYWxwaGEwLCBbcEFscGhhQXJnXQotCi0gICAgICAgIE1VTCAgICAgYWxwaGExLCBhbHBoYTEsIGEKLSAgICAgICAgTVVMICAgICBiZXRhMSwgYmV0YTEsIGEKLSAgICAgICAgTVVMICAgICBhbHBoYTAsIGFscGhhMCwgYQotICAgICAgICBNVUwgICAgIGJldGEwLCBiZXRhMCwgYQotCi0gICAgICAgIE1fU1RSRCAgYWxwaGExLCBiZXRhMSwgcEFscGhhQmV0YTEKLSAgICAgICAgTV9MRFIgICBwQlMsIHBwQlNBcmcKLSAgICAgICAgTV9TVFJEICBhbHBoYTAsIGJldGEwLCBwQWxwaGFCZXRhMAotCi0gICAgICAgIExEUiAgICAgWFksPUxPT1BfQ09VTlQKLSAgICAgICAgTV9TVFJEICBYWSwgcEJTLCBwWFlCUwotCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQotTG9vcFkKLUxvb3BYCi07Ly8tLS0tLS0tLS0tLS0tLS1Mb2FkIFBpeGVscy0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgTERSSCAgICBiUywgW3BCU10sICMyCi0gICAgICAgIAotICAgICAgICBNX1NUUiAgIHBCUywgcHBCUwotICAgICAgICBNX0xEUiAgIHBfMSwgW3BRMF0sc3JjZHN0U3RlcAotCi0gICAgICAgIENNUCAgICAgYlMsICMwCi0gICAgICAgIAotICAgICAgICBNX0xEUiAgIHBfMCwgW3BRMF0sc3JjZHN0U3RlcAotICAgICAgICBNX0xEUiAgIHFfMCwgW3BRMF0sc3JjZHN0U3RlcAotICAgICAgICBNX0xEUiAgIHFfMSwgW3BRMF0KLSAgICAgICAgTERSICAgICBtMDEsID1NQVNLXzEgICAgICAgICAgICAgICAgOy8vICAwMTAxMDEwMSBtYXNrIAotICAgICAgICBCRVEgICAgIE5vRmlsdGVyQlMwCi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBwXzAgPSBbcjNwMCByMnAwIHIxcDAgcjBwMF0KLSAgICAgICAgOy8vIHBfMSA9IFtyM3AxIHIycDEgcjFwMSByMHAxXQotICAgICAgICA7Ly8gcV8wID0gW3IzcTAgcjJxMCByMXEwIHIwcTBdCi0gICAgICAgIDsvLyBxXzEgPSBbcjNxMSByMnExIHIxcTEgcjBxMV0KLQotOy8vLS0tLS0tLS0tLS0tLS1GaWx0ZXJpbmcgRGVjaXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBNT1YgICAgIG0wMCwgI01BU0tfMCAgICAgICAgICAgICAgICA7Ly8gIDAwMDAwMDAwIG1hc2sgCi0KLSAgICAgICAgTU9WICAgICBmaWx0LCBtMDEKLSAgICAgICAgVFNUICAgICBiUywgIzB4ZmYwMAotICAgICAgICBNT1ZFUSAgIGZpbHQsIGZpbHQsIExTUiAjMTYKLSAgICAgICAgVFNUICAgICBiUywgIzB4ZmYKLSAgICAgICAgTU9WRVEgICBmaWx0LCBmaWx0LCBMU0wgIzE2Ci0gICAgICAgIFRTVCAgICAgYlMsICM0Ci0KLSAgICAgICAgCi0gICAgICAgIDsvLyBDaGVjayB8cDAtcTB8PEFscGhhIAotICAgICAgICBVU1VCOCAgIGRwMHEwLCBwXzAsIHFfMCAKLSAgICAgICAgVVNVQjggICBhLCBxXzAsIHBfMAotICAgICAgICBTRUwgICAgIGFwMHEwLCBhLCBkcDBxMAotICAgICAgICBVU1VCOCAgIGEsIGFwMHEwLCBhbHBoYQotICAgICAgICBTRUwgICAgIGZpbHQsIG0wMCwgZmlsdAotICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gQ2hlY2sgfHAxLXAwfDxCZXRhIAotICAgICAgICBVU1VCOCAgIGRwMXAwLCBwXzEsIHBfMAotICAgICAgICBVU1VCOCAgIGEsIHBfMCwgcF8xCi0gICAgICAgIFNFTCAgICAgYSwgYSwgZHAxcDAKLSAgICAgICAgVVNVQjggICBhLCBhLCBiZXRhCi0gICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0Ci0KLSAgICAgICAgOy8vIENoZWNrIHxxMS1xMHw8QmV0YSAKLSAgICAgICAgVVNVQjggICBkcTFxMCwgcV8xLCBxXzAKLSAgICAgICAgVVNVQjggICBhLCBxXzAsIHFfMQotICAgICAgICBTRUwgICAgIGEsIGEsIGRxMXEwCi0gICAgICAgIFVTVUI4ICAgYSwgYSwgYmV0YQotICAgICAgICBTRUwgICAgIGZpbHQsIG0wMCwgZmlsdAotCi0gICAgICAgIEJFUSAgICAgYlNMVDQgICAgICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLUZpbHRlci0tLS0tLS0tLS0tLS0tLS0tLS0tCi1iU0dFNCAgICAgICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLWJTR0U0IEV4ZWN1dGlvbi0tLS0tLS0tLS0tLS0tLQotICAgICAgICBDTVAgICAgIGZpbHQsICMwCi0KLSAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0KLSAgICAgICAgOy8vIENvbXB1dGUgUDBiCi0gICAgICAgIFVIQUREOCAgdDEsIHBfMCwgcV8xCi0gICAgICAgIEJFUSAgICAgTm9GaWx0ZXJGaWx0MAotICAgICAgICBNVk4gICAgIHQyLCBwXzEKLSAgICAgICAgVUhTVUI4ICB0MSwgdDEsIHQyCi0gICAgICAgIFVTVUI4ICAgdDIsIGZpbHQsIG0wMQotICAgICAgICBFT1IgICAgIHQxLCB0MSwgbTAxLCBMU0wgIzcKLQotICAgICAgICBBREQgICAgIHBUaHJlc2hvbGRzLHBUaHJlc2hvbGRzLCAjMgotICAgICAgICAKLSAgICAgICAgOy8vIENvbXB1dGUgUTBiIAotICAgICAgICBVSEFERDggIHQyLCBxXzAsIHBfMQotICAgICAgICBNVk4gICAgIHQzLCBxXzEKLSAgICAgICAgVUhTVUI4ICB0MiwgdDIsIHQzCi0gICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotICAgICAgICBTRUwgICAgIFBfMCwgdDEsIHBfMAotICAgICAgICBFT1IgICAgIHQyLCB0MiwgbTAxLCBMU0wgIzcKLSAgICAgICAgU0VMICAgICBRXzAsIHQyLCBxXzAKLQotICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzEKLSAgICAgICAgQiAgICAgICBTdG9yZVJlc3VsdEFuZEV4aXQKLQotOy8vLS0tLS0tLS0tLSBFeGl0IG9mIExvb3BYIC0tLS0tLS0tLS0tLS0tCi07Ly8tLS0tIGZvciB0aGUgY2FzZSBvZiBubyBmaWx0ZXJpbmcgLS0tLS0KLQotTm9GaWx0ZXJGaWx0MAotTm9GaWx0ZXJCUzAKLSAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQotICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwCi0gICAgICAgIEFERCAgICAgcFEwLCBwUTAsICM0Ci0gICAgICAgIEFERCAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjMgotCi0gICAgICAgIDsvLyBMb2FkIGNvdW50ZXIgZm9yIExvb3BYCi0gICAgICAgIE1fTERSRCAgWFksIHBCUywgcFhZQlMKLSAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGEwCi0KLSAgICAgICAgOy8vIEFsaWduIHRoZSBwb2ludGVyCi0gICAgICAgIEFERFMgICAgWFksIFhZLCBYWQotICAgICAgICBNX1NUUiAgIFhZLCBwWFlCUwotICAgICAgICBCQ0MgICAgIExvb3BZCi0gICAgICAgIEIgICAgICAgRXhpdExvb3BZCi0gICAgICAgIAotYlNMVDQgICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tYlNMVDQgRXhlY3V0aW9uLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotICAgICAgICBDTVAgICAgIGZpbHQsICMwCi0gICAgICAgIAotICAgICAgICA7Ly8gU2luY2UgYmV0YSA8PSAxOCBhbmQgYWxwaGEgPD0gMjU1IHdlIGtub3cKLSAgICAgICAgOy8vIC0yNTQgPD0gcDAtcTAgPD0gMjU0Ci0gICAgICAgIDsvLyAgLTE3IDw9IHExLXEwIDw9IDE3Ci0gICAgICAgIDsvLyAgLTE3IDw9IHAxLXAwIDw9IDE3Ci0KLSAgICAgICAgOy8vIGRlbHRhID0gQ2xpcDMoIC10QywgdEMsICgoKChxMC1wMCk8PDIpICsgKHAxLXExKSArIDQpPj4zKSkKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gICAgQ2FsY3VsYXRlIEEgPSAoKChxMC1wMCk8PDIpICsgKHAxLXExKSArIDQpPj4zCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICA9ICg0KnEwIC0gNCpwMCArIHAxIC0gcTEgKyA0KT4+MwotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgPSAoKHAxLXAwKSAtIChxMS1xMCkgLSAzKihwMC1xMCkgKyA0KT4+MwotCi0gICAgICAgIFVTVUI4ICAgdDEsIHBfMSwgcF8wCi0gICAgICAgIFVTVUI4ICAgdDIsIHFfMSwgcV8wCi0gICAgICAgIEJFUSAgICAgTm9GaWx0ZXJGaWx0MAotICAgICAgICAKLSAgICAgICAgTERSQiAgICB0QzAsIFtwVGhyZXNob2xkc10sIzEKLSAgICAgICAgU1NVQjggICB0MSwgdDEsIHQyCi0gICAgICAgIExEUkIgICAgdEMxLCBbcFRocmVzaG9sZHNdLCMxCi0gICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotICAgICAgICBVSFNVQjggIHQ0LCBwXzAsIHFfMAotICAgICAgICBPUlIgICAgIHRDLCB0QzAsIHRDMSwgTFNMICMxNgotICAgICAgICBVU1VCOCAgIHQ1LCBwXzAsIHFfMAotICAgICAgICBBTkQgICAgIHQ1LCB0NSwgbTAxCi0gICAgICAgIFNIU1VCOCAgdDEsIHQxLCB0NQotICAgICAgICBPUlIgICAgIHRDLCB0QywgTFNMICM4ICAgICAgICAKLSAgICAgICAgU1NVQjggICB0MSwgdDEsIHQ1Ci0gICAgICAgIFNIU1VCOCAgdDEsIHQxLCB0NAotICAgICAgICBVUUFERDggIHRDLCB0QywgbTAxCi0gICAgICAgIFNBREQ4ICAgdDEsIHQxLCBtMDEKLSAgICAgICAgVVNVQjggICB0NSwgZmlsdCwgbTAxICAgCi0gICAgICAgIFNIU1VCOCAgdDEsIHQxLCB0NAotICAgICAgICBTRUwgICAgIHRDLCB0QywgbTAwCi0KLSAgICAgICAgOy8vIFNwbGl0IGludG8gcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHBhcnQgYW5kIGNsaXAgCi0KLSAgICAgICAgU1NVQjggICB0MSwgdDEsIG0wMAotICAgICAgICBTRUwgICAgIHBvcywgdDEsIG0wMAotICAgICAgICBVU1VCOCAgIG5lZywgcG9zLCB0MQotICAgICAgICBVU1VCOCAgIHQzLCBwb3MsIHRDCi0gICAgICAgIFNFTCAgICAgcG9zLCB0QywgcG9zCi0gICAgICAgIFVTVUI4ICAgdDMsIG5lZywgdEMKLSAgICAgICAgU0VMICAgICBuZWcsIHRDLCBuZWcKLSAgICAgICAgVVFBREQ4ICBQXzAsIHBfMCwgcG9zCi0gICAgICAgIFVRU1VCOCAgUV8wLCBxXzAsIHBvcwotICAgICAgICBVUVNVQjggIFBfMCwgUF8wLCBuZWcKLSAgICAgICAgVVFBREQ4ICBRXzAsIFFfMCwgbmVnCi0gICAgICAgIAotICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzEKLQotICAgICAgICA7Ly8gQ2hvb3NlIHRvIHN0b3JlIHRoZSBmaWx0ZXJlZAotICAgICAgICA7Ly8gdmFsdWUgb3IgdGhlIG9yaWdpbmFsIHBpeGVsCi0gICAgICAgIFVTVUI4ICAgdDEsIGZpbHQsIG0wMSAgICAKLSAgICAgICAgU0VMICAgICBQXzAsIFBfMCwgcF8wCi0gICAgICAgIFNFTCAgICAgUV8wLCBRXzAsIHFfMAotICAgIAotU3RvcmVSZXN1bHRBbmRFeGl0Ci0KLSAgICAgICAgOy8vLS0tLS0tLS0tU3RvcmUgcmVzdWx0LS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgOy8vIFBfMCA9IFtyMHAwIHIxcDAgcjJwMCByM3AwXQotICAgICAgICA7Ly8gUV8wID0gW3IwcTAgcjFxMCByMnEwIHIzcTBdCi0KLSAgICAgICAgTV9TVFIgICBQXzAsIFtwUTBdLCBzcmNkc3RTdGVwCi0gICAgICAgIFNUUiAgICAgUV8wLCBbcFEwXSwgIzQKLQotICAgICAgICBNX0xEUkQgIFhZLCBwQlMsIHBYWUJTCi0gICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGEwCi0KLSAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMxCi0KLSAgICAgICAgQUREUyAgICBYWSwgWFksIFhZCi0gICAgICAgIE1fU1RSICAgWFksIHBYWUJTCi0gICAgICAgIEJDQyAgICAgTG9vcFgKLQotOy8vLS0tLS0tLS0gQ29tbW9uIEV4aXQgb2YgTG9vcFkgLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOy8vIEFsaWduIHRoZSBwb2ludGVycyAKLQotRXhpdExvb3BZCi0gICAgICAgIEFERCAgICAgcEJTLCBwQlMsICM0Ci0gICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGExCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTAsICM4Ci0gICAgICAgIEFERCAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMgotICAgICAgICBNX1NUUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMAotCi0gICAgICAgIEJORSAgICAgTG9vcFkKLSAgICAgICAgTU9WICAgICByMCwgI09NWF9TdHNfTm9FcnIKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS1FbmQgRmlsdGVyLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgTV9FTkQKLQotICAgIEVORElGICAgICAgICAKLQotICAgICAgICBFTkQKLSAgICAgICAgCi0gICAgICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYzkzNjkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucworKysgL2Rldi9udWxsCkBAIC0xLDQ1MSArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLQotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0KLSAgICAgICAgSUYgQVJNMTEzNkpTCi0gICAgICAgIAotICAgICAgICAKLU1BU0tfMCAgICAgIEVRVSAweDAwMDAwMDAwICAgCi1NQVNLXzEgICAgICBFUVUgMHgwMTAxMDEwMQotTUFTS18yICAgICAgRVFVIDB4MDAwMGZmMDAKLUxPT1BfQ09VTlQgIEVRVSAweDUwMDAwMDAwCi0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotCi1wU3JjRHN0ICAgICBSTiAwCi1zcmNkc3RTdGVwICBSTiAxCi1wQWxwaGFBcmcgICBSTiAyCi1wQmV0YUFyZyAgICBSTiAzCi0KLXBUaHJlc2hvbGRzIFJOIDYKLXBCUyAgICAgICAgIFJOIDkKLXBRMCAgICAgICAgIFJOIDAKLWJTICAgICAgICAgIFJOIDIKLWJTVGVtcCAgICAgIFJOIDEwCi0KLWFscGhhICAgICAgIFJOIDYKLWFscGhhMCAgICAgIFJOIDYKLWFscGhhMSAgICAgIFJOIDgKLQotYmV0YSAgICAgICAgUk4gNwotYmV0YTAgICAgICAgUk4gNwotYmV0YTEgICAgICAgUk4gOQotCi07Ly8gRGVjbGFyZSBMb2NhbC9UZW1wb3JhcnkgdmFyaWFibGVzCi0KLTsvLyBQaXhlbHMKLXBfMCAgICAgICAgIFJOIDMgIAotcF8xICAgICAgICAgUk4gNSAgCi1xXzAgICAgICAgICBSTiA4ICAKLXFfMSAgICAgICAgIFJOIDkgIAotCi07Ly8gVW5wYWNraW5nCi1tYXNrICAgICAgICBSTiAxMSAKLQotcm93MCAgICAgICAgUk4gMgotcm93MSAgICAgICAgUk4gNAotcm93MiAgICAgICAgUk4gNQotcm93MyAgICAgICAgUk4gMwotCi1yb3c0ICAgICAgICBSTiA4Ci1yb3c1ICAgICAgICBSTiA5Ci1yb3c2ICAgICAgICBSTiAxMAotcm93NyAgICAgICAgUk4gMTIKLQotdHVucGswICAgICAgUk4gMgotdHVucGsyICAgICAgUk4gMTAKLXR1bnBrMyAgICAgIFJOIDEyCi0KLXR1bnBrNCAgICAgIFJOIDQKLXR1bnBrNSAgICAgIFJOIDUKLXR1bnBrNiAgICAgIFJOIDE0Ci10dW5wazcgICAgICBSTiAyIAotCi07Ly8gRmlsdGVyaW5nCi0KLWRwMHEwICAgICAgIFJOIDEyCi1kcDFwMCAgICAgICBSTiAxMgotZHExcTAgICAgICAgUk4gMTIKLQotYXAwcTAgICAgICAgUk4gNCAgCi1maWx0ICAgICAgICBSTiAyCi0gICAgICAgIAotbTAwICAgICAgICAgUk4gMTQKLW0wMSAgICAgICAgIFJOIDExCi0gICAgICAgICAgICAKLXBRMCAgICAgICAgIFJOIDAKLVN0ZXAgICAgICAgIFJOIDEKLSAgICAgICAgICAgIAotOy8vIE91dHB1dAotICAgICAgICAgICAgCi1QXzAgICAgICAgICBSTiA2Ci1RXzAgICAgICAgICBSTiA3IAotCi07Ly9EZWNsYXJhdGlvbnMgZm9yIGJTTFQ0IGtlcm5lbAotCi10QyAgICAgICAgICBSTiAxMgotdEMwICAgICAgICAgUk4gNQotdEMxICAgICAgICAgUk4gMTIKLXBvcyAgICAgICAgIFJOIDUKLW5lZyAgICAgICAgIFJOIDkKLQotOy8vRGVjbGFyYXRpb25zIGZvciBiU0dFNCBrZXJuZWwKLQotCi07Ly8gTWlzY2VsbGFub3VzCi1YWSAgICAgICAgICBSTiA4Ci0KLWEgICAgICAgICAgIFJOIDEwCi10MSAgICAgICAgICBSTiAxMAotdDIgICAgICAgICAgUk4gMTIKLXQzICAgICAgICAgIFJOIDE0Ci10NCAgICAgICAgICBSTiA2Ci10NSAgICAgICAgICBSTiA1Ci0KLQotICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IAotICAgICAgICBNX0FMTE9DNCBwcFRocmVzaG9sZHMsNAotICAgICAgICBNX0FMTE9DOCBwQWxwaGFCZXRhMCw4Ci0gICAgICAgIE1fQUxMT0M4IHBBbHBoYUJldGExLDgKLSAgICAgICAgTV9BTExPQzggcFhZQlMsNAotICAgICAgICBNX0FMTE9DNCBwcEJTLDQKLSAgICAgICAgCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLCByMTEKLSAgICAgICAgCi0gICAgICAgIDsvL0lucHV0IGFyZ3VtZW50cyBvbiB0aGUgc3RhY2sKLSAgICAgICAgTV9BUkcgICBwcFRocmVzaG9sZHNBcmcsIDQKLSAgICAgICAgTV9BUkcgICBwcEJTQXJnLCA0Ci0gICAgICAgIAotICAgICAgICBMRFJCICAgIGFscGhhMSwgW3BBbHBoYUFyZywjMV0KLSAgICAgICAgTERSQiAgICBiZXRhMSwgIFtwQmV0YUFyZywjMV0KLSAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzQXJnCi0gICAgICAgIExEUiAgICAgYSw9TUFTS18xCi0gICAgICAgIExEUkIgICAgYmV0YTAsICBbcEJldGFBcmddCi0gICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotICAgICAgICBMRFJCICAgIGFscGhhMCwgW3BBbHBoYUFyZ10KLQotICAgICAgICBNVUwgICAgIGFscGhhMSwgYWxwaGExLCBhCi0gICAgICAgIE1VTCAgICAgYmV0YTEsIGJldGExLCBhCi0gICAgICAgIE1VTCAgICAgYWxwaGEwLCBhbHBoYTAsIGEKLSAgICAgICAgTVVMICAgICBiZXRhMCwgYmV0YTAsIGEKLQotICAgICAgICBNX1NUUkQgIGFscGhhMSwgYmV0YTEsIHBBbHBoYUJldGExCi0gICAgICAgIE1fTERSICAgcEJTLCBwcEJTQXJnCi0gICAgICAgIE1fU1RSRCAgYWxwaGEwLCBiZXRhMCwgcEFscGhhQmV0YTAKLQotICAgICAgICBMRFIgICAgIFhZLD1MT09QX0NPVU5UCi0gICAgICAgIE1fU1RSRCAgWFksIHBCUywgcFhZQlMKLSAgICAgICAgCi0gICAgICAgIAotTG9vcFkKLUxvb3BYCi07Ly8tLS0tLS0tLS0tLS0tLS1Mb2FkIFBpeGVscy0tLS0tLS0tLS0tLS0tLS0tLS0KLQotOy8vLS0tLS0tLS0tLS0tLS0tLVBhY2sgcTAtcTEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBMRFJIICAgIGJTLCBbcEJTXSwgIzgKLSAgICAgICAgTERSICAgICBtYXNrLCA9TUFTS18yCi0KLSAgICAgICAgTV9MRFJIICByb3c0LCBbcFEwXSwgc3JjZHN0U3RlcAotICAgICAgICBDTVAgICAgIGJTLCAjMAotICAgICAgICBNX1NUUiAgIHBCUywgcHBCUwotICAgICAgICBNX0xEUkggIHJvdzUsIFtwUTBdLCBzcmNkc3RTdGVwCi0gICAgICAgIEJFUS5XICAgTm9GaWx0ZXJCUzAKLSAgICAgICAgTERSSCAgICByb3c2LCBbcFEwXQotICAgICAgICBMRFJIICAgIHJvdzcsIFtwUTAsIHNyY2RzdFN0ZXBdCi0KLSAgICAgICAgOy8vIHJvdzQgPSBbMCAwIHIwcTAgcjBxMV0KLSAgICAgICAgOy8vIHJvdzUgPSBbMCAwIHIxcTAgcjFxMV0KLSAgICAgICAgOy8vIHJvdzYgPSBbMCAwIHIycTAgcjJxMV0KLSAgICAgICAgOy8vIHJvdzcgPSBbMCAwIHIzcTAgcjNxMV0KLQotICAgICAgICBBTkQgICAgIHR1bnBrNCwgbWFzaywgcm93NAotICAgICAgICBBTkQgICAgIHR1bnBrNSwgbWFzaywgcm93NCwgTFNMIzgKLSAgICAgICAgVVhUQUIgICB0dW5wazQsIHR1bnBrNCwgcm93NSwgUk9SIzgKLSAgICAgICAgVVhUQUIgICB0dW5wazUsIHR1bnBrNSwgcm93NQotICAgICAgICBBTkQgICAgIHR1bnBrNiwgbWFzaywgcm93NgotICAgICAgICBBTkQgICAgIHR1bnBrNywgbWFzaywgcm93NiwgTFNMIzgKLSAgICAgICAgVVhUQUIgICB0dW5wazYsIHR1bnBrNiwgcm93NywgUk9SIzgKLSAgICAgICAgVVhUQUIgICB0dW5wazcsIHR1bnBrNywgcm93NwotCi0gICAgICAgIDsvLyB0dW5wazQgPSBbMCAwIHIwcTAgcjFxMF0KLSAgICAgICAgOy8vIHR1bnBrNSA9IFswIDAgcjBxMSByMXExXQotICAgICAgICA7Ly8gdHVucGs2ID0gWzAgMCByMnEwIHIzcTBdCi0gICAgICAgIDsvLyB0dW5wazcgPSBbMCAwIHIycTEgcjNxMV0KLQotICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzEKLSAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgIzIKLQotICAgICAgICBQS0hCVCAgIHFfMSwgdHVucGs2LCB0dW5wazQsIExTTCMxNgotICAgICAgICBQS0hCVCAgIHFfMCwgdHVucGs3LCB0dW5wazUsIExTTCMxNgotCi0gICAgICAgIDsvLyBxXzAgPSBbcjBxMCByMXEwIHIycTAgcjNxMF0KLSAgICAgICAgOy8vIHFfMSA9IFtyMHExIHIxcTEgcjJxMSByM3ExXQotCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS1QYWNrIHAwLXAxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBNX0xEUkggIHJvdzAsIFtwUTBdLCBzcmNkc3RTdGVwICAgICAgICAgIAotICAgICAgICBNX0xEUkggIHJvdzEsIFtwUTBdLCBzcmNkc3RTdGVwICAgICAgICAgIAotICAgICAgICBMRFJIICAgIHJvdzIsIFtwUTBdCi0gICAgICAgIExEUkggICAgcm93MywgW3BRMCwgc3JjZHN0U3RlcF0KLSAgICAgICAgCi0gICAgICAgIDsvLyByb3cwID0gWzAgMCByMHAwIHIwcDFdCi0gICAgICAgIDsvLyByb3cxID0gWzAgMCByMXAwIHIxcDFdCi0gICAgICAgIDsvLyByb3cyID0gWzAgMCByMnAwIHIycDFdCi0gICAgICAgIDsvLyByb3czID0gWzAgMCByM3AwIHIzcDFdCi0KLSAgICAgICAgQU5EICAgICB0dW5wazIsIG1hc2ssIHJvdzAKLSAgICAgICAgQU5EICAgICB0dW5wazYsIG1hc2ssIHJvdzAsIExTTCM4Ci0gICAgICAgIFVYVEFCICAgdHVucGsyLCB0dW5wazIsIHJvdzEsIFJPUiM4Ci0gICAgICAgIFVYVEFCICAgdHVucGs2LCB0dW5wazYsIHJvdzEKLQotICAgICAgICBBTkQgICAgIHR1bnBrMCwgbWFzaywgcm93MgotICAgICAgICBBTkQgICAgIHR1bnBrMywgbWFzaywgcm93MiwgTFNMIzgKLSAgICAgICAgVVhUQUIgICB0dW5wazAsIHR1bnBrMCwgcm93MywgUk9SIzgKLSAgICAgICAgVVhUQUIgICB0dW5wazMsIHR1bnBrMywgcm93MwotCi0gICAgICAgIDsvLyB0dW5wazIgPSBbMCAwIHIwcDAgcjFwMF0KLSAgICAgICAgOy8vIHR1bnBrNiA9IFswIDAgcjBwMSByMXAxXQotICAgICAgICA7Ly8gdHVucGswID0gWzAgMCByMnAwIHIzcDBdCi0gICAgICAgIDsvLyB0dW5wazMgPSBbMCAwIHIycDEgcjNwMV0KLQotICAgICAgICBQS0hCVCAgIHBfMCwgdHVucGswLCB0dW5wazIsIExTTCMxNgotICAgICAgICBNX0xEUiAgIGJTVGVtcCwgcHBCUwotICAgICAgICBQS0hCVCAgIHBfMSwgdHVucGszLCB0dW5wazYsIExTTCMxNgotCi0gICAgICAgIDsvLyBwXzAgPSBbcjBwMCByMXAwIHIycDAgcjNwMF0KLSAgICAgICAgOy8vIHBfMSA9IFtyMHAxIHIxcDEgcjJwMSByM3AxXQotCi07Ly8tLS0tLS0tLS0tLS0tLUZpbHRlcmluZyBEZWNpc2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIFVTVUI4ICAgZHAwcTAsIHBfMCwgcV8wIAotICAgICAgICBMRFIgICAgIG0wMSwgPU1BU0tfMQotICAgICAgICBMRFJIICAgIGJTVGVtcCwgW2JTVGVtcCAsIy04XQotICAgICAgICBNT1YgICAgIG0wMCwgI01BU0tfMCAgICAgICAgICAgICAgICA7Ly8gIDAwMDAwMDAwIG1hc2sgCi0gICAgICAgIAotICAgICAgICBNT1YgICAgIGZpbHQsIG0wMQotICAgICAgICBUU1QgICAgIGJTVGVtcCwgIzB4ZmYwMAotICAgICAgICBNT1ZFUSAgIGZpbHQsIGZpbHQsIExTTCAjMTYKLSAgICAgICAgVFNUICAgICBiU1RlbXAsICMweGZmCi0gICAgICAgIE1PVkVRICAgZmlsdCwgZmlsdCwgTFNSICMxNgotICAgICAgICBUU1QgICAgIGJTVGVtcCwgIzQKLQotICAgICAgICA7Ly8gQ2hlY2sgfHAwLXEwfDxBbHBoYSAKLSAgICAgICAgVVNVQjggICBhLCBxXzAsIHBfMAotICAgICAgICBTRUwgICAgIGFwMHEwLCBhLCBkcDBxMAotICAgICAgICBVU1VCOCAgIGEsIGFwMHEwLCBhbHBoYQotICAgICAgICBTRUwgICAgIGZpbHQsIG0wMCwgZmlsdAotICAgICAgICAKLSAgICAgICAgOy8vIENoZWNrIHxwMS1wMHw8QmV0YSAKLSAgICAgICAgVVNVQjggICBkcDFwMCwgcF8xLCBwXzAKLSAgICAgICAgVVNVQjggICBhLCBwXzAsIHBfMQotICAgICAgICBTRUwgICAgIGEsIGEsIGRwMXAwCi0gICAgICAgIFVTVUI4ICAgYSwgYSwgYmV0YQotICAgICAgICBTRUwgICAgIGZpbHQsIG0wMCwgZmlsdAotCi0gICAgICAgIDsvLyBDaGVjayB8cTEtcTB8PEJldGEgCi0gICAgICAgIFVTVUI4ICAgZHExcTAsIHFfMSwgcV8wCi0gICAgICAgIFVTVUI4ICAgYSwgcV8wLCBxXzEKLSAgICAgICAgU0VMICAgICBhLCBhLCBkcTFxMAotICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKLSAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKLQotICAgICAgICBCRVEgICAgIGJTTFQ0ICAgICAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS1GaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQotYlNHRTQgICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS1iU0dFNCBFeGVjdXRpb24tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgQ01QICAgICBmaWx0LCAjMAotCi0gICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotCi0gICAgICAgIDsvLyBDb21wdXRlIFAwYgotICAgICAgICBVSEFERDggIHQxLCBwXzAsIHFfMQotICAgICAgICBCRVEgICAgIE5vRmlsdGVyRmlsdDAKLSAgICAgICAgTVZOICAgICB0MiwgcF8xCi0gICAgICAgIFVIU1VCOCAgdDEsIHQxLCB0MgotICAgICAgICBVU1VCOCAgIHQyLCBmaWx0LCBtMDEKLSAgICAgICAgRU9SICAgICB0MSwgdDEsIG0wMSwgTFNMICM3Ci0KLSAgICAgICAgQUREICAgICBwVGhyZXNob2xkcyxwVGhyZXNob2xkcywgIzQKLSAgICAgICAgCi0gICAgICAgIDsvLyBDb21wdXRlIFEwYiAKLSAgICAgICAgVUhBREQ4ICB0MiwgcV8wLCBwXzEKLSAgICAgICAgTVZOICAgICB0MywgcV8xCi0gICAgICAgIFVIU1VCOCAgdDIsIHQyLCB0MwotICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLSAgICAgICAgU0VMICAgICBQXzAsIHQxLCBwXzAKLSAgICAgICAgRU9SICAgICB0MiwgdDIsIG0wMSwgTFNMICM3Ci0gICAgICAgIFNFTCAgICAgUV8wLCB0MiwgcV8wCi0KLSAgICAgICAgQiAgICAgICBTdG9yZVJlc3VsdEFuZEV4aXQKLQotOy8vLS0tLS0tLS0tLSBFeGl0IG9mIExvb3BYIC0tLS0tLS0tLS0tLS0tCi07Ly8tLS0tIGZvciB0aGUgY2FzZSBvZiBubyBmaWx0ZXJpbmcgLS0tLS0KLQotTm9GaWx0ZXJGaWx0MAotICAgICAgICBBREQgICAgIHBRMCwgcFEwLCAjMgotTm9GaWx0ZXJCUzAKLSAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQotICAgICAgICBBREQgICAgIHBRMCwgcFEwLCAjNAotICAgICAgICBBREQgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzQKLSAgICAgICAgOy8vIExvYWQgY291bnRlciBmb3IgTG9vcFgKLSAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUwotICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLSAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTEKLQotICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXIKLSAgICAgICAgQUREUyAgICBYWSwgWFksIFhZCi0gICAgICAgIE1fU1RSICAgWFksIHBYWUJTCi0gICAgICAgIEJDQyAgICAgTG9vcFkKLSAgICAgICAgQiAgICAgICBFeGl0TG9vcFkKLSAgICAgICAgCi1iU0xUNCAgICAgICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLWJTTFQ0IEV4ZWN1dGlvbi0tLS0tLS0tLS0tLS0tLQotICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLSAgICAgICAgQ01QICAgICBmaWx0LCAjMAotICAgICAgICAKLQotICAgICAgICA7Ly8gU2luY2UgYmV0YSA8PSAxOCBhbmQgYWxwaGEgPD0gMjU1IHdlIGtub3cKLSAgICAgICAgOy8vIC0yNTQgPD0gcDAtcTAgPD0gMjU0Ci0gICAgICAgIDsvLyAgLTE3IDw9IHExLXEwIDw9IDE3Ci0gICAgICAgIDsvLyAgLTE3IDw9IHAxLXAwIDw9IDE3Ci0KLSAgICAgICAgOy8vIGRlbHRhID0gQ2xpcDMoIC10QywgdEMsICgoKChxMC1wMCk8PDIpICsgKHAxLXExKSArIDQpPj4zKSkKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gICAgQ2FsY3VsYXRlIEEgPSAoKChxMC1wMCk8PDIpICsgKHAxLXExKSArIDQpPj4zCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICA9ICg0KnEwIC0gNCpwMCArIHAxIC0gcTEgKyA0KT4+MwotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgPSAoKHAxLXAwKSAtIChxMS1xMCkgLSAzKihwMC1xMCkgKyA0KT4+MwotCi0gICAgICAgIFVTVUI4ICAgdDEsIHBfMSwgcF8wCi0gICAgICAgIFVTVUI4ICAgdDIsIHFfMSwgcV8wCi0gICAgICAgIEJFUSAgICAgTm9GaWx0ZXJGaWx0MAotICAgICAgICAKLSAgICAgICAgTERSQiAgICB0QzAsIFtwVGhyZXNob2xkc10sICMxCi0gICAgICAgIFNTVUI4ICAgdDEsIHQxLCB0MgotICAgICAgICBMRFJCICAgIHRDMSwgW3BUaHJlc2hvbGRzXSwgIzMKLSAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIFVIU1VCOCAgdDQsIHBfMCwgcV8wCi0gICAgICAgIE9SUiAgICAgdEMsIHRDMSwgdEMwLCBMU0wgIzE2Ci0gICAgICAgIFVTVUI4ICAgdDUsIHBfMCwgcV8wCi0gICAgICAgIEFORCAgICAgdDUsIHQ1LCBtMDEKLSAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ1Ci0gICAgICAgIE9SUiAgICAgdEMsIHRDLCBMU0wgIzggICAgICAgIAotICAgICAgICBTU1VCOCAgIHQxLCB0MSwgdDUKLSAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ0Ci0gICAgICAgIFVRQUREOCAgdEMsIHRDLCBtMDEKLSAgICAgICAgU0FERDggICB0MSwgdDEsIG0wMQotICAgICAgICBVU1VCOCAgIHQ1LCBmaWx0LCBtMDEgICAKLSAgICAgICAgU0hTVUI4ICB0MSwgdDEsIHQ0Ci0gICAgICAgIFNFTCAgICAgdEMsIHRDLCBtMDAKLQotICAgICAgICA7Ly8gU3BsaXQgaW50byBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgcGFydCBhbmQgY2xpcCAKLQotICAgICAgICBTU1VCOCAgIHQxLCB0MSwgbTAwCi0gICAgICAgIFNFTCAgICAgcG9zLCB0MSwgbTAwCi0gICAgICAgIFVTVUI4ICAgbmVnLCBwb3MsIHQxCi0gICAgICAgIFVTVUI4ICAgdDMsIHBvcywgdEMKLSAgICAgICAgU0VMICAgICBwb3MsIHRDLCBwb3MKLSAgICAgICAgVVNVQjggICB0MywgbmVnLCB0QwotICAgICAgICBTRUwgICAgIG5lZywgdEMsIG5lZwotICAgICAgICBVUUFERDggIFBfMCwgcF8wLCBwb3MKLSAgICAgICAgVVFTVUI4ICBRXzAsIHFfMCwgcG9zCi0gICAgICAgIFVRU1VCOCAgUF8wLCBQXzAsIG5lZwotICAgICAgICBVUUFERDggIFFfMCwgUV8wLCBuZWcKLSAgICAgICAgCi0gICAgICAgIDsvLyBDaG9vc2UgdG8gc3RvcmUgdGhlIGZpbHRlcmVkCi0gICAgICAgIDsvLyB2YWx1ZSBvciB0aGUgb3JpZ2luYWwgcGl4ZWwKLSAgICAgICAgVVNVQjggICB0MSwgZmlsdCwgbTAxICAgIAotICAgICAgICBTRUwgICAgIFBfMCwgUF8wLCBwXzAKLSAgICAgICAgU0VMICAgICBRXzAsIFFfMCwgcV8wCi0gICAgCi1TdG9yZVJlc3VsdEFuZEV4aXQKLQotICAgICAgICA7Ly8tLS0tLS0tLS1TdG9yZSByZXN1bHQtLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICA7Ly8gUF8wID0gW3IwcDAgcjFwMCByMnAwIHIzcDBdCi0gICAgICAgIDsvLyBRXzAgPSBbcjBxMCByMXEwIHIycTAgcjNxMF0KLQotICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzEKLSAgICAgICAgQUREICAgICAgICBwUTAsIHBRMCwgIzEgICAgICAKLSAKLSAgICAgICAgTU9WICAgICB0MSwgUV8wLCBMU1IgIzI0Ci0gICAgICAgIFNUUkIgICAgdDEsIFtwUTAsICMxXQotICAgICAgICBNT1YgICAgIHQxLCBQXzAsIExTUiAjMjQKLSAgICAgICAgTV9TVFJCICB0MSwgW3BRMF0sIHNyY2RzdFN0ZXAKLQotICAgICAgICBNT1YgICAgIHQxLCBRXzAsIExTUiAjMTYKLSAgICAgICAgU1RSQiAgICB0MSwgW3BRMCwgIzFdCi0gICAgICAgIE1PViAgICAgdDEsIFBfMCwgTFNSICMxNgotICAgICAgICBNX1NUUkIgIHQxLCBbcFEwXSwgc3JjZHN0U3RlcAotCi0gICAgICAgIE1PViAgICAgdDEsIFBfMCwgTFNSICM4Ci0gICAgICAgIFNUUkIgICAgdDEsIFtwUTBdCi0gICAgICAgIFNUUkIgICAgUF8wLCBbcFEwLCBzcmNkc3RTdGVwXQotICAgICAgICBNT1YgICAgIHQxLCBRXzAsIExTUiAjOAotICAgICAgICBTVFJCICAgIHQxLCBbcFEwLCAjMV0hCi0gICAgICAgIFNUUkIgICAgUV8wLCBbcFEwLCBzcmNkc3RTdGVwXQotCi0gICAgICAgIE1fTERSRCAgWFksIHBCUywgcFhZQlMKLSAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTEKLQotICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzEKLSAgICAgICAgQUREICAgICBwUTAsIHBRMCwgIzQKLQotICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKLSAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKLSAgICAgICAgQkNDICAgICBMb29wWAotCi07Ly8tLS0tLS0tLSBDb21tb24gRXhpdCBvZiBMb29wWSAtLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXJzIAotCi1FeGl0TG9vcFkKLQotICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLSAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgIzgKLSAgICAgICAgQUREICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMyCi0gICAgICAgIFNVQiAgICAgcEJTLCBwQlMsICMxNCAKLSAgICAgICAgU1VCICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICM2Ci0gICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotCi0gICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGEwCi0KLSAgICAgICAgQk5FICAgICBMb29wWQotICAgICAgICBNT1YgICAgIHIwLCAjT01YX1N0c19Ob0VycgotOy8vLS0tLS0tLS0tLS0tLS0tLS1FbmQgRmlsdGVyLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBNX0VORAotCi0gICAgICAgIEVORElGICAgICAgICAKLQotICAgICAgICBFTkQKLSAgICAgICAgCi0gICAgICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRmYmZhNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucworKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0KLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKLSAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCi0KLSAgICAKLQotICAgIElGIEFSTTExMzZKUwotCi0KLU1BU0tfMCAgICAgIEVRVSAweDAwMDAwMDAwICAgCi1NQVNLXzEgICAgICBFUVUgMHgwMTAxMDEwMQotTUFTS18yICAgICAgRVFVIDB4ZmYwMGZmMDAKLUxPT1BfQ09VTlQgIEVRVSAweDExMTEwMDAwCi0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotCi1wU3JjRHN0ICAgICBSTiAwCi1zcmNkc3RTdGVwICBSTiAxCi1wQWxwaGFBcmcgICBSTiAyCi1wQmV0YUFyZyAgICBSTiAzCi0KLXBUaHJlc2hvbGRzIFJOIDE0Ci1wQlMgICAgICAgICBSTiA5Ci1wUTAgICAgICAgICBSTiAwCi1iUyAgICAgICAgICBSTiAyCi0KLWFscGhhICAgICAgIFJOIDYKLWFscGhhMCAgICAgIFJOIDYKLWFscGhhMSAgICAgIFJOIDgKLQotYmV0YSAgICAgICAgUk4gNwotYmV0YTAgICAgICAgUk4gNwotYmV0YTEgICAgICAgUk4gOQotCi07Ly8gRGVjbGFyZSBMb2NhbC9UZW1wb3JhcnkgdmFyaWFibGVzCi0KLTsvLyBQaXhlbHMKLXBfMCAgICAgICAgIFJOIDMgIAotcF8xICAgICAgICAgUk4gNSAgCi1wXzIgICAgICAgICBSTiA0ICAKLXBfMyAgICAgICAgIFJOIDIgIAotcV8wICAgICAgICAgUk4gOCAgCi1xXzEgICAgICAgICBSTiA5ICAKLXFfMiAgICAgICAgIFJOIDEwIAotcV8zICAgICAgICAgUk4gMTIgCi0KLTsvLyBGaWx0ZXJpbmcKLQotZHAwcTAgICAgICAgUk4gMTIKLWRwMXAwICAgICAgIFJOIDEyCi1kcTFxMCAgICAgICBSTiAxMgotZHAycDAgICAgICAgUk4gMTIKLWRxMnEwICAgICAgIFJOIDEyCi0gICAgICAgICAgICAKLWFwMHEwICAgICAgIFJOIDEgIAotZmlsdCAgICAgICAgUk4gMgotICAgICAgICAKLW0wMCAgICAgICAgIFJOIDE0Ci1tMDEgICAgICAgICBSTiAxMQotICAgICAgICAgICAgCi1hcGZsZyAgICAgICBSTiAwIAotYXFmbGcgICAgICAgUk4gNgotYXBxZmxnICAgICAgUk4gMAotICAgICAgICAgICAgCi0KLTsvL0RlY2xhcmF0aW9ucyBmb3IgYlNMVDQga2VybmVsCi0KLXRDMCAgICAgICAgIFJOIDcKLXB0QzAgICAgICAgIFJOIDEKLQotcFEwYSAgICAgICAgUk4gMCAgICAKLVN0ZXBhICAgICAgIFJOIDEgICAgCi1tYXNrYSAgICAgICBSTiAxNAotICAgICAgICAgICAgCi1QMGEgICAgICAgICBSTiAxCi1QMWEgICAgICAgICBSTiA4Ci1RMGEgICAgICAgICBSTiA3Ci1RMWEgICAgICAgICBSTiAxMQotICAgICAgICAgICAgCi07Ly9EZWNsYXJhdGlvbnMgZm9yIGJTR0U0IGtlcm5lbAotCi1wUTBiICAgICAgICBSTiAwCi1TdGVwYiAgICAgICBSTiAxCi1tYXNrYiAgICAgICBSTiAxNAotICAgICAgICAgICAgCi1QMGIgICAgICAgICBSTiA2Ci1QMWIgICAgICAgICBSTiA3Ci1QMmIgICAgICAgICBSTiAxCi1QM2IgICAgICAgICBSTiAzCi0gICAgICAgICAgICAKLVEwYiAgICAgICAgIFJOIDkgCi1RMWIgICAgICAgICBSTiAwICAgCi1RMmIgICAgICAgICBSTiAyIAotUTNiICAgICAgICAgUk4gMyAKLQotOy8vIE1pc2NlbGxhbm91cwotWFkgICAgICAgICAgUk4gOAotdDAgICAgICAgICAgUk4gMyAKLXQxICAgICAgICAgIFJOIDEyCi10MiAgICAgICAgICBSTiAxNAotdDcgICAgICAgICAgUk4gNwotdDQgICAgICAgICAgUk4gNAotdDUgICAgICAgICAgUk4gMSAgCi10OCAgICAgICAgICBSTiA2ICAKLWEgICAgICAgICAgIFJOIDAKLQotICAgICAgICAgICAgCi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgCi0gICAgICAgIE1fQUxMT0M0IHBwVGhyZXNob2xkcyw0Ci0gICAgICAgIE1fQUxMT0M0IHBRXzMsNAotICAgICAgICBNX0FMTE9DNCBwUF8zLDQKLSAgICAgICAgTV9BTExPQzggcEFscGhhQmV0YTAsOAotICAgICAgICBNX0FMTE9DOCBwQWxwaGFCZXRhMSw4Ci0gICAgICAgIE1fQUxMT0M4IHBYWUJTLDQKLSAgICAgICAgTV9BTExPQzQgcHBCUyw0Ci0gICAgICAgIE1fQUxMT0M4IHBwUTBTdGVwLDQKLSAgICAgICAgTV9BTExPQzQgcFN0ZXAsNAotICAgICAgICAKLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLCByMTEKLSAgICAgICAgCi0gICAgICAgIDsvL0lucHV0IGFyZ3VtZW50cyBvbiB0aGUgc3RhY2sKLSAgICAgICAgTV9BUkcgICBwcFRocmVzaG9sZHNBcmcsIDQKLSAgICAgICAgTV9BUkcgICBwcEJTQXJnLCA0Ci0KLSAgICAgICAgTERSICAgICB0NCw9TUFTS18xCi0KLSAgICAgICAgTERSQiAgICBhbHBoYTAsIFtwQWxwaGFBcmddCi0gICAgICAgIExEUkIgICAgYmV0YTAsICBbcEJldGFBcmddCi0gICAgICAgIExEUkIgICAgYWxwaGExLCBbcEFscGhhQXJnLCMxXQotICAgICAgICBMRFJCICAgIGJldGExLCAgW3BCZXRhQXJnLCMxXQotCi0gICAgICAgIE1VTCAgICAgYWxwaGEwLCBhbHBoYTAsIHQ0Ci0gICAgICAgIE1VTCAgICAgYmV0YTAsIGJldGEwLCB0NAotICAgICAgICBNVUwgICAgIGFscGhhMSwgYWxwaGExLCB0NAotICAgICAgICBNVUwgICAgIGJldGExLCBiZXRhMSwgdDQKLQotICAgICAgICBNX1NUUkQgIGFscGhhMCwgYmV0YTAsIHBBbHBoYUJldGEwCi0gICAgICAgIE1fU1RSRCAgYWxwaGExLCBiZXRhMSwgcEFscGhhQmV0YTEKLQotICAgICAgICBMRFIgICAgIFhZLD1MT09QX0NPVU5UCi0gICAgICAgIE1fTERSICAgcEJTLCBwcEJTQXJnCi0gICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkc0FyZwotICAgICAgICBNX1NUUiAgIHNyY2RzdFN0ZXAsIHBTdGVwCi0gICAgICAgIE1fU1RSRCAgWFksIHBCUywgcFhZQlMKLSAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMyCi0gICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotTG9vcFkKLUxvb3BYCi07Ly8tLS0tLS0tLS0tLS0tLS1Mb2FkIFBpeGVscy0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgTV9TVFIgICBwUTAsIHBwUTBTdGVwCi0gICAgICAgIE1fTERSICAgcF8zLCBbcFEwXSwgc3JjZHN0U3RlcAotICAgICAgICBNX0xEUiAgIHBfMiwgW3BRMF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgTV9TVFIgICBwXzMsIHBQXzMKLSAgICAgICAgTERSQiAgICBiUywgW3BCU10sICMxCi0gICAgICAgIE1fU1RSICAgcEJTLCBwcEJTCi0gICAgICAgIE1fTERSICAgcF8xLCBbcFEwXSwgc3JjZHN0U3RlcAotICAgICAgICBDTVAgICAgIGJTLCAjMAotICAgICAgICBNX0xEUiAgIHBfMCwgW3BRMF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgTV9MRFIgICBxXzAsIFtwUTBdLCBzcmNkc3RTdGVwCi0gICAgICAgIE1fTERSICAgcV8xLCBbcFEwXSwgc3JjZHN0U3RlcAotICAgICAgICBNX0xEUiAgIHFfMiwgW3BRMF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgTV9MRFIgICBxXzMsIFtwUTBdLCBzcmNkc3RTdGVwCi0gICAgICAgIEJFUSAgICAgTm9GaWx0ZXJCUzAKLSAgICAgICAgQ01QICAgICBiUywgIzQKLSAgICAgICAgTV9TVFIgICBxXzMsIHBRXzMKLQotOy8vLS0tLS0tLS0tLS0tLS1GaWx0ZXJpbmcgRGVjaXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBMRFIgICAgIG0wMSwgPU1BU0tfMSAgICAgICAgICAgICAgICA7Ly8gIDAxMDEwMTAxIG1hc2sgCi0gICAgICAgIE1PViAgICAgbTAwLCAjTUFTS18wICAgICAgICAgICAgICAgIDsvLyAgMDAwMDAwMDAgbWFzayAKLQotICAgICAgICA7Ly8gQ2hlY2sgfHAwLXEwfDxBbHBoYSAKLSAgICAgICAgVVNVQjggICBkcDBxMCwgcF8wLCBxXzAgCi0gICAgICAgIFVTVUI4ICAgYSwgcV8wLCBwXzAKLSAgICAgICAgU0VMICAgICBhcDBxMCwgYSwgZHAwcTAKLSAgICAgICAgVVNVQjggICBhLCBhcDBxMCwgYWxwaGEKLSAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIG0wMQotICAgICAgICAKLSAgICAgICAgOy8vIENoZWNrIHxwMS1wMHw8QmV0YSAKLSAgICAgICAgVVNVQjggICBkcDFwMCwgcF8xLCBwXzAKLSAgICAgICAgVVNVQjggICBhLCBwXzAsIHBfMQotICAgICAgICBTRUwgICAgIGEsIGEsIGRwMXAwCi0gICAgICAgIFVTVUI4ICAgYSwgYSwgYmV0YQotICAgICAgICBTRUwgICAgIGZpbHQsIG0wMCwgZmlsdAotCi0gICAgICAgIDsvLyBDaGVjayB8cTEtcTB8PEJldGEgCi0gICAgICAgIFVTVUI4ICAgZHExcTAsIHFfMSwgcV8wCi0gICAgICAgIFVTVUI4ICAgYSwgcV8wLCBxXzEKLSAgICAgICAgU0VMICAgICBhLCBhLCBkcTFxMAotICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKLSAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKLQotICAgICAgICA7Ly8gQ2hlY2sgYXA8QmV0YSAKLSAgICAgICAgVVNVQjggICBkcDJwMCwgcF8yLCBwXzAKLSAgICAgICAgVVNVQjggICBhLCBwXzAsIHBfMgotICAgICAgICBTRUwgICAgIGEsIGEsIGRwMnAwCi0gICAgICAgIFVTVUI4ICAgYSwgYSwgYmV0YQotICAgICAgICBTRUwgICAgIGFwZmxnLCBtMDAsIGZpbHQgICAgICAgICAgICA7Ly8gYXBmbGcgPSBmaWx0ICYmIChhcDxiZXRhKQotCi0gICAgICAgIDsvLyBDaGVjayBhcTxCZXRhIAotICAgICAgICBVU1VCOCAgIGRxMnEwLCBxXzIsIHFfMAotICAgICAgICBVU1VCOCAgIHQyLCBxXzAsIHFfMgotICAgICAgICBTRUwgICAgIHQyLCB0MiwgZHEycTAKLSAgICAgICAgVVNVQjggICB0MiwgdDIsIGJldGEKLSAgICAgICAgTU9WICAgICB0NywjMAotCi0gICAgICAgIEJMVCAgICAgYlNMVDQgICAgICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLUZpbHRlci0tLS0tLS0tLS0tLS0tLS0tLS0tCi1iU0dFNCAgICAgICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLWJTR0U0IEV4ZWN1dGlvbi0tLS0tLS0tLS0tLS0tLQotICAgICAgICBTRUwgICAgIHQxLCB0NywgZmlsdCAgICAgICAgICAgIDsvLyBhcWZsZyA9IGZpbHQgJiYgKGFxPGJldGEpIAotICAgICAgICBDTVAgICAgIGZpbHQsICMwCi0gICAgICAgIE9SUiAgICAgYXBxZmxnLCBhcGZsZywgdDEsIExTTCAjMQotICAgICAgICBNX0xEUkQgIHBRMCwgc3JjZHN0U3RlcCwgcHBRMFN0ZXAsIEVRCi0gICAgICAgIEJFUSAgICAgTm9GaWx0ZXJGaWx0MAotCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQotICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tU3RvcmUgcmVzdWx0LS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotICAgICAgICBNT1YgICAgIHBfMiwgUTFiCi0gICAgICAgIE1PViAgICAgcF8xLCBQMmIKLSAgICAgICAgTV9MRFJEICBwUTBiLCBTdGVwYiwgcHBRMFN0ZXAKLSAgICAgICAgQUREICAgICBwVGhyZXNob2xkcywgIzEKLSAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCi0gICAgICAgIE1fU1RSICAgcF8xLCBbcFEwYiwgU3RlcGJdIQotICAgICAgICBNX1NUUiAgIFAxYiwgW3BRMGIsIFN0ZXBiXSEKLSAgICAgICAgTV9TVFIgICBQMGIsIFtwUTBiLCBTdGVwYl0hCi0gICAgICAgIE1fU1RSICAgUTBiLCBbcFEwYiwgU3RlcGJdIQotICAgICAgICBTVFIgICAgIHBfMiwgW3BRMGIsIFN0ZXBiXQotICAgICAgICBTVFIgICAgIFEyYiwgW3BRMGIsIFN0ZXBiLCBMU0wgIzFdCi0KLQotICAgICAgICBNX0xEUkQgIFhZLCBwQlMsIHBYWUJTCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTBiLCBTdGVwYiwgTFNMICMyCi0gICAgICAgIEFERCAgICAgcFEwLCBwUTAsICM0Ci0gICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGEwCi0gICAgICAgIEFERFMgICAgWFksIFhZLCBYWQotICAgICAgICBNX1NUUiAgIFhZLCBwWFlCUwotICAgICAgICBCQ0MgICAgIExvb3BYCi0gICAgICAgIEIgICAgICAgRXhpdExvb3BZCi0KLTsvLy0tLS0tLS0tLS0gRXhpdCBvZiBMb29wWCAtLS0tLS0tLS0tLS0tLQotOy8vLS0tLSBmb3IgdGhlIGNhc2Ugb2Ygbm8gZmlsdGVyaW5nIC0tLS0tCi0KLU5vRmlsdGVyQlMwCi0gICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMwotTm9GaWx0ZXJGaWx0MAotICAgICAgICBBREQgICAgIHBRMCwgcFEwLCAjNAotICAgICAgICA7Ly8gTG9hZCBjb3VudGVyIGZvciBMb29wWAotICAgICAgICBNX0xEUkQgIFhZLCBwQlMsIHBYWUJTCi0gICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMAotCi0gICAgICAgIDsvLyBBbGlnbiB0aGUgcG9pbnRlcnMKLSAgICAgICAgQUREUyAgICBYWSwgWFksIFhZCi0gICAgICAgIEFERCAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjMQotICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLSAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKLSAgICAgICAgQkNDICAgICBMb29wWAotICAgICAgICBCICAgICAgIEV4aXRMb29wWQotCi1iU0xUNCAgICAgICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLWJTTFQ0IEV4ZWN1dGlvbi0tLS0tLS0tLS0tLS0tLQotICAgICAgICBTRUwgICAgIGFxZmxnLCB0NywgZmlsdCAgICAgICAgICAgIDsvLyBhcWZsZyA9IGZpbHQgJiYgKGFxPGJldGEpIAotICAgICAgICBNX0xEUiAgIHB0QzAsIHBwVGhyZXNob2xkcwotICAgICAgICBDTVAgICAgIGZpbHQsICMwCi0gICAgICAgIE1fTERSRCAgcFEwLCBzcmNkc3RTdGVwLCBwcFEwU3RlcCwgRVEKLSAgICAgICAgQkVRICAgICBOb0ZpbHRlckZpbHQwCi0gICAgICAgIAotICAgICAgICBMRFJCICAgIHRDMCwgW3B0QzBdLCAjMQotICAgICAgICBNX1NUUiAgIHB0QzAsIHBwVGhyZXNob2xkcwotCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQotCi0gICAgICAgIDsvLy0tLS0tLS0tLVN0b3JlIHJlc3VsdC0tLS0tLS0tLS0tLS0tLQotICAgICAgICBNT1YgICAgIHBfMiwgUDBhCi0gICAgICAgIE1fTERSRCAgcFEwYSwgU3RlcGEsIHBwUTBTdGVwCi0gICAgICAgIE1fU1RSICAgUDFhLCBbcFEwYSwgU3RlcGEsIExTTCAjMV0hCi0gICAgICAgIE1fU1RSICAgcF8yLCBbcFEwYSwgU3RlcGFdIQotICAgICAgICBNX1NUUiAgIFEwYSwgW3BRMGEsIFN0ZXBhXSEKLSAgICAgICAgU1RSICAgICBRMWEsIFtwUTBhLCBTdGVwYV0KLSAgICAgICAKLSAgICAgICAgOy8vIExvYWQgY291bnRlcgotICAgICAgICBNX0xEUkQgIFhZLCBwQlMsIHBYWUJTCi0gICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGEwCi0KLSAgICAgICAgU1VCICAgICBwUTAsIHBRMGEsIFN0ZXBhLCBMU0wgIzIKLSAgICAgICAgQUREICAgICBwUTAsIHBRMCwgIzQKLQotICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKLSAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKLSAgICAgICAgQkNDICAgICBMb29wWAotICAgICAgICAKLTsvLy0tLS0tLS0tIENvbW1vbiBFeGl0IG9mIExvb3BZIC0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsvLyBBbGlnbiB0aGUgcG9pbnRlcnMgCi1FeGl0TG9vcFkKLSAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTEKLSAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgIzE2Ci0gICAgICAgIEFERCAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMgotICAgICAgICBNX1NUUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMAotCi0gICAgICAgIEJORSAgICAgTG9vcFkKLSAgICAgICAgTU9WICAgICByMCwgI09NWF9TdHNfTm9FcnIKLTsvLy0tLS0tLS0tLS0tLS0tLS0tRW5kIEZpbHRlci0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIE1fRU5ECi0KLSAgICBFTkRJRiAgICAgICAgCi0gICAgICAgIAotCi0gICAgICAgIEVORAotICAgICAgICAKLSAgICAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWRmMjdiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNTY0ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLQotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0gICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQotICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKLSAgICAgICAgCi0gICAgCi0gICAgSUYgQVJNMTEzNkpTCi0KLU1BU0tfMCAgICAgIEVRVSAweDAwMDAwMDAwICAgCi1NQVNLXzEgICAgICBFUVUgMHgwMTAxMDEwMQotTUFTS18yICAgICAgRVFVIDB4ZmYwMGZmMDAKLUxPT1BfQ09VTlQgIEVRVSAweDExMTEwMDAwCi0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotCi1wU3JjRHN0ICAgICBSTiAwCi1zcmNkc3RTdGVwICBSTiAxCi1wQWxwaGFBcmcgICBSTiAyCi1wQmV0YUFyZyAgICBSTiAzCi0KLXBUaHJlc2hvbGRzIFJOIDE0Ci1wQlMgICAgICAgICBSTiA5Ci1wUTAgICAgICAgICBSTiAwCi1iUyAgICAgICAgICBSTiAyCi0KLWFscGhhICAgICAgIFJOIDYKLWFscGhhMCAgICAgIFJOIDYKLWFscGhhMSAgICAgIFJOIDgKLQotYmV0YSAgICAgICAgUk4gNwotYmV0YTAgICAgICAgUk4gNwotYmV0YTEgICAgICAgUk4gOQotCi07Ly8gRGVjbGFyZSBMb2NhbC9UZW1wb3JhcnkgdmFyaWFibGVzCi0KLTsvLyBQaXhlbHMKLXBfMCAgICAgICAgIFJOIDMgIAotcF8xICAgICAgICAgUk4gNSAgCi1wXzIgICAgICAgICBSTiA0ICAKLXBfMyAgICAgICAgIFJOIDIgIAotcV8wICAgICAgICAgUk4gOCAgCi1xXzEgICAgICAgICBSTiA5ICAKLXFfMiAgICAgICAgIFJOIDEwIAotcV8zICAgICAgICAgUk4gMTIgCi0KLTsvLyBVbnBhY2tpbmcKLW1hc2sgICAgICAgIFJOIDExIAotCi1yb3cwICAgICAgICBSTiAyCi1yb3cxICAgICAgICBSTiA0Ci1yb3cyICAgICAgICBSTiA1Ci1yb3czICAgICAgICBSTiAzCi0KLXJvdzQgICAgICAgIFJOIDgKLXJvdzUgICAgICAgIFJOIDkKLXJvdzYgICAgICAgIFJOIDEwCi1yb3c3ICAgICAgICBSTiAxMgotcm93OCAgICAgICAgUk4gMTQKLXJvdzkgICAgICAgIFJOIDcKLSAgICAgICAgICAgIAotdHVucGswICAgICAgUk4gOAotdHVucGsxICAgICAgUk4gOQotdHVucGsyICAgICAgUk4gMTAKLXR1bnBrMyAgICAgIFJOIDEyCi10dW5wazQgICAgICBSTiAwCi0KLXR1bnBrNSAgICAgIFJOIDEKLXR1bnBrNiAgICAgIFJOIDE0Ci10dW5wazcgICAgICBSTiAyIAotdHVucGs4ICAgICAgUk4gNSAKLXR1bnBrOSAgICAgIFJOIDYgCi0gCi0KLTsvLyBGaWx0ZXJpbmcKLQotZHAwcTAgICAgICAgUk4gMTIKLWRwMXAwICAgICAgIFJOIDEyCi1kcTFxMCAgICAgICBSTiAxMgotZHAycDAgICAgICAgUk4gMTIKLWRxMnEwICAgICAgIFJOIDEyCi0gICAgICAgICAgICAKLWFwMHEwICAgICAgIFJOIDEgIAotZmlsdCAgICAgICAgUk4gMgotICAgICAgICAKLW0wMCAgICAgICAgIFJOIDE0Ci1tMDEgICAgICAgICBSTiAxMQotICAgICAgICAgICAgCi1hcGZsZyAgICAgICBSTiAwIAotYXFmbGcgICAgICAgUk4gNgotYXBxZmxnICAgICAgUk4gMAotICAgICAgICAgICAgCi0KLTsvL0RlY2xhcmF0aW9ucyBmb3IgYlNMVDQga2VybmVsCi0KLXRDMCAgICAgICAgIFJOIDcKLXB0QzAgICAgICAgIFJOIDEKLQotcFEwYSAgICAgICAgUk4gMCAgICAKLVN0ZXBhICAgICAgIFJOIDEgICAgCi1tYXNrYSAgICAgICBSTiAxNAotICAgICAgICAgICAgCi1QMGEgICAgICAgICBSTiAxCi1QMWEgICAgICAgICBSTiA4Ci1RMGEgICAgICAgICBSTiA3Ci1RMWEgICAgICAgICBSTiAxMQotICAgICAgICAgICAgCi07Ly9EZWNsYXJhdGlvbnMgZm9yIGJTR0U0IGtlcm5lbAotCi1wUTBiICAgICAgICBSTiAwCi1TdGVwYiAgICAgICBSTiAxCi1tYXNrYiAgICAgICBSTiAxNAotICAgICAgICAgICAgCi1QMGIgICAgICAgICBSTiA2Ci1QMWIgICAgICAgICBSTiA3Ci1QMmIgICAgICAgICBSTiAxCi1QM2IgICAgICAgICBSTiAzCi0gICAgICAgICAgICAKLVEwYiAgICAgICAgIFJOIDkgCi1RMWIgICAgICAgICBSTiAwICAgCi1RMmIgICAgICAgICBSTiAyIAotUTNiICAgICAgICAgUk4gMyAKLQotOy8vIE1pc2NlbGxhbm91cwotWFkgICAgICAgICAgUk4gOAotdDAgICAgICAgICAgUk4gMyAKLXQxICAgICAgICAgIFJOIDEyCi10MiAgICAgICAgICBSTiAxNAotdDcgICAgICAgICAgUk4gNwotdDQgICAgICAgICAgUk4gNAotdDUgICAgICAgICAgUk4gMSAgCi10OCAgICAgICAgICBSTiA2ICAKLWEgICAgICAgICAgIFJOIDAKLQotICAgICAgICAgICAgCi0KLSAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSAKLSAgICAgICAgTV9BTExPQzQgcHBUaHJlc2hvbGRzLDQKLSAgICAgICAgTV9BTExPQzQgcFFfMyw0Ci0gICAgICAgIE1fQUxMT0M0IHBQXzMsNAotICAgICAgICBNX0FMTE9DOCBwQWxwaGFCZXRhMCw4Ci0gICAgICAgIE1fQUxMT0M4IHBBbHBoYUJldGExLDgKLSAgICAgICAgTV9BTExPQzggcFhZQlMsNAotICAgICAgICBNX0FMTE9DNCBwcEJTLDQKLSAgICAgICAgTV9BTExPQzggcHBRMFN0ZXAsNAotICAgICAgICBNX0FMTE9DNCBwU3RlcCw0Ci0gICAgICAgIAotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0ksIHIxMQotICAgICAgICAKLSAgICAgICAgOy8vSW5wdXQgYXJndW1lbnRzIG9uIHRoZSBzdGFjawotICAgICAgICBNX0FSRyAgIHBwVGhyZXNob2xkc0FyZywgNAotICAgICAgICBNX0FSRyAgIHBwQlNBcmcsIDQKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgdDQsPU1BU0tfMQotCi0gICAgICAgIExEUkIgICAgYWxwaGEwLCBbcEFscGhhQXJnXQotICAgICAgICBMRFJCICAgIGJldGEwLCAgW3BCZXRhQXJnXQotICAgICAgICBMRFJCICAgIGFscGhhMSwgW3BBbHBoYUFyZywjMV0KLSAgICAgICAgTERSQiAgICBiZXRhMSwgIFtwQmV0YUFyZywjMV0KLQotICAgICAgICBNVUwgICAgIGFscGhhMCwgYWxwaGEwLCB0NAotICAgICAgICBNVUwgICAgIGJldGEwLCBiZXRhMCwgdDQKLSAgICAgICAgTVVMICAgICBhbHBoYTEsIGFscGhhMSwgdDQKLSAgICAgICAgTVVMICAgICBiZXRhMSwgYmV0YTEsIHQ0Ci0KLSAgICAgICAgTV9TVFJEICBhbHBoYTAsIGJldGEwLCBwQWxwaGFCZXRhMAotICAgICAgICBNX1NUUkQgIGFscGhhMSwgYmV0YTEsIHBBbHBoYUJldGExCi0KLSAgICAgICAgTERSICAgICBYWSw9TE9PUF9DT1VOVAotICAgICAgICBNX0xEUiAgIHBCUywgcHBCU0FyZwotICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHNBcmcKLSAgICAgICAgTV9TVFIgICBzcmNkc3RTdGVwLCBwU3RlcAotICAgICAgICBNX1NUUkQgIFhZLCBwQlMsIHBYWUJTCi0gICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotICAgICAgICAKLSAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgIzQKLUxvb3BZCi07Ly8tLS0tLS0tLS0tLS0tLS1Mb2FkIFBpeGVscy0tLS0tLS0tLS0tLS0tLS0tLS0KLQotOy8vLS0tLS0tLS0tLS0tLS0tLVBhY2sgcDAtcDMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBMRFIgICAgIG1hc2ssID1NQVNLXzIKLSAgICAgICAgCi0gICAgICAgIE1fTERSICAgcm93MCwgW3BRMF0sIHNyY2RzdFN0ZXAgICAgICAgICAgCi0gICAgICAgIE1fTERSICAgcm93MSwgW3BRMF0sIHNyY2RzdFN0ZXAgICAgICAgICAgCi0gICAgICAgIExEUiAgICAgcm93MiwgW3BRMF0KLSAgICAgICAgTERSICAgICByb3czLCBbcFEwLCBzcmNkc3RTdGVwXQotICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzEKLSAgICAgICAgCi0gICAgICAgIDsvLyByb3cwID0gW3IwcDAgcjBwMSByMHAyIHIwcDNdCi0gICAgICAgIDsvLyByb3cxID0gW3IxcDAgcjFwMSByMXAyIHIxcDNdCi0gICAgICAgIDsvLyByb3cyID0gW3IycDAgcjJwMSByMnAyIHIycDNdCi0gICAgICAgIDsvLyByb3czID0gW3IzcDAgcjNwMSByM3AyIHIzcDNdCi0KLSAgICAgICAgQU5EICAgICB0dW5wazAsIG1hc2ssIHJvdzAKLSAgICAgICAgQU5EICAgICB0dW5wazYsIG1hc2ssIHJvdzAsIExTTCM4Ci0gICAgICAgIFVYVEFCMTYgdHVucGswLCB0dW5wazAsIHJvdzEsIFJPUiM4Ci0gICAgICAgIFVYVEFCMTYgdHVucGs2LCB0dW5wazYsIHJvdzEKLSAgICAgICAgQU5EICAgICB0dW5wazIsIG1hc2ssIHJvdzIKLSAgICAgICAgQU5EICAgICB0dW5wazMsIG1hc2ssIHJvdzIsIExTTCM4Ci0gICAgICAgIFVYVEFCMTYgdHVucGsyLCB0dW5wazIsIHJvdzMsIFJPUiM4Ci0gICAgICAgIFVYVEFCMTYgdHVucGszLCB0dW5wazMsIHJvdzMKLQotICAgICAgICA7Ly8gdHVucGswID0gW3IwcDAgcjFwMCByMHAyIHIxcDJdCi0gICAgICAgIDsvLyB0dW5wazYgPSBbcjBwMSByMXAxIHIwcDMgcjFwM10KLSAgICAgICAgOy8vIHR1bnBrMiA9IFtyMnAwIHIzcDAgcjJwMiByM3AyXQotICAgICAgICA7Ly8gdHVucGszID0gW3IycDEgcjNwMSByMnAzIHIzcDNdCi0KLSAgICAgICAgUEtIVEIgICBwXzAsIHR1bnBrMCwgdHVucGsyLCBBU1IjMTYKLSAgICAgICAgUEtIVEIgICBwXzEsIHR1bnBrNiwgdHVucGszLCBBU1IjMTYKLSAgICAgICAgUEtIQlQgICBwXzIsIHR1bnBrMiwgdHVucGswLCBMU0wjMTYKLSAgICAgICAgUEtIQlQgICBwXzMsIHR1bnBrMywgdHVucGs2LCBMU0wjMTYKLQotCi0gICAgICAgIDsvLyBwXzAgPSBbcjBwMCByMXAwIHIycDAgcjNwMF0KLSAgICAgICAgOy8vIHBfMSA9IFtyMHAxIHIxcDEgcjJwMSByM3AxXQotICAgICAgICA7Ly8gcF8yID0gW3IwcDIgcjFwMiByMnAxIHIzcDJdCi0gICAgICAgIDsvLyBwXzMgPSBbcjBwMyByMXAzIHIycDMgcjNwM10KLQotICAgICAgICBNX1NUUiAgIHBfMywgcFBfMwotCi07Ly8tLS0tLS0tLS0tLS0tLS0tUGFjayBxMC1xMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Mb29wWAotICAgICAgICBMRFJCICAgIGJTLCBbcEJTXSwgIzQKLSAgICAgICAgTV9TVFIgICBwUTAsIHBwUTBTdGVwCi0gICAgICAgIExEUiAgICAgbWFzaywgPU1BU0tfMgotICAgICAgICBDTVAgICAgIGJTLCAjMAotICAgICAgICBNX1NUUiAgIHBCUywgcHBCUwotCi0gICAgICAgIExEUiAgICAgcm93NCwgW3BRMCwgIzRdIQotICAgICAgICBCRVEuVyAgIE5vRmlsdGVyQlMwCi0gICAgICAgIE1fTERSICAgcm93NSwgW3BRMCwgc3JjZHN0U3RlcF0hCi0gICAgICAgIE1fTERSICAgcm93NiwgW3BRMCwgc3JjZHN0U3RlcF0hCi0gICAgICAgIE1fTERSICAgcm93NywgW3BRMCwgc3JjZHN0U3RlcF0KLQotICAgICAgICA7Ly8gcm93NCA9IFtyMHEzIHIwcTIgcjBxMSByMHEwXQotICAgICAgICA7Ly8gcm93NSA9IFtyMXEzIHIxcTIgcjFxMSByMXEwXQotICAgICAgICA7Ly8gcm93NiA9IFtyMnEzIHIycTIgcjJxMSByMnEwXQotICAgICAgICA7Ly8gcm93NyA9IFtyM3EzIHIzcTIgcjNxMSByM3EwXQotICAgIAotICAgICAgICBBTkQgICAgIHR1bnBrNCwgbWFzaywgcm93NAotICAgICAgICBDTVAgICAgIGJTLCAjNAotICAgICAgICBBTkQgICAgIHR1bnBrNSwgbWFzaywgcm93NCwgTFNMIzgKLSAgICAgICAgVVhUQUIxNiB0dW5wazQsIHR1bnBrNCwgcm93NSwgUk9SIzgKLSAgICAgICAgVVhUQUIxNiB0dW5wazUsIHR1bnBrNSwgcm93NQotICAgICAgICBBTkQgICAgIHR1bnBrNiwgbWFzaywgcm93NgotICAgICAgICBBTkQgICAgIHR1bnBrNywgbWFzaywgcm93NiwgTFNMIzgKLSAgICAgICAgVVhUQUIxNiB0dW5wazYsIHR1bnBrNiwgcm93NywgUk9SIzgKLSAgICAgICAgVVhUQUIxNiB0dW5wazcsIHR1bnBrNywgcm93NwotCi0gICAgICAgIDsvLyB0dW5wazQgPSBbcjBxMCByMXEwIHIwcTIgcjFxMl0KLSAgICAgICAgOy8vIHR1bnBrNSA9IFtyMHExIHIxcTEgcjBxMyByMXEzXQotICAgICAgICA7Ly8gdHVucGs2ID0gW3IycTAgcjNxMCByMnEyIHIzcTJdCi0gICAgICAgIDsvLyB0dW5wazcgPSBbcjJxMSByM3ExIHIycTMgcjNxM10KLQotICAgICAgICBQS0hUQiAgIHFfMywgdHVucGs0LCB0dW5wazYsIEFTUiMxNgotICAgICAgICBQS0hUQiAgIHFfMiwgdHVucGs1LCB0dW5wazcsIEFTUiMxNgotICAgICAgICBQS0hCVCAgIHFfMSwgdHVucGs2LCB0dW5wazQsIExTTCMxNgotICAgICAgICBNX1NUUiAgIHFfMywgcFFfMwotICAgICAgICBQS0hCVCAgIHFfMCwgdHVucGs3LCB0dW5wazUsIExTTCMxNgotCi0KLSAgICAgICAgOy8vIHFfMCA9IFtyMHEwIHIxcTAgcjJxMCByM3EwXQotICAgICAgICA7Ly8gcV8xID0gW3IwcTEgcjFxMSByMnExIHIzcTFdCi0gICAgICAgIDsvLyBxXzIgPSBbcjBxMiByMXEyIHIycTEgcjNxMl0KLSAgICAgICAgOy8vIHFfMyA9IFtyMHEzIHIxcTMgcjJxMyByM3EzXQotCi0KLTsvLy0tLS0tLS0tLS0tLS0tRmlsdGVyaW5nIERlY2lzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgTERSICAgICBtMDEsID1NQVNLXzEgICAgICAgICAgICAgICAgOy8vICAwMTAxMDEwMSBtYXNrIAotICAgICAgICBNT1YgICAgIG0wMCwgI01BU0tfMCAgICAgICAgICAgICAgICA7Ly8gIDAwMDAwMDAwIG1hc2sgCi0KLSAgICAgICAgOy8vIENoZWNrIHxwMC1xMHw8QWxwaGEgCi0gICAgICAgIFVTVUI4ICAgZHAwcTAsIHBfMCwgcV8wIAotICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcF8wCi0gICAgICAgIFNFTCAgICAgYXAwcTAsIGEsIGRwMHEwCi0gICAgICAgIFVTVUI4ICAgYSwgYXAwcTAsIGFscGhhCi0gICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBtMDEKLSAgICAgICAgCi0gICAgICAgIDsvLyBDaGVjayB8cDEtcDB8PEJldGEgCi0gICAgICAgIFVTVUI4ICAgZHAxcDAsIHBfMSwgcF8wCi0gICAgICAgIFVTVUI4ICAgYSwgcF8wLCBwXzEKLSAgICAgICAgU0VMICAgICBhLCBhLCBkcDFwMAotICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKLSAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKLQotICAgICAgICA7Ly8gQ2hlY2sgfHExLXEwfDxCZXRhIAotICAgICAgICBVU1VCOCAgIGRxMXEwLCBxXzEsIHFfMAotICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcV8xCi0gICAgICAgIFNFTCAgICAgYSwgYSwgZHExcTAKLSAgICAgICAgVVNVQjggICBhLCBhLCBiZXRhCi0gICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0Ci0KLSAgICAgICAgOy8vIENoZWNrIGFwPEJldGEgCi0gICAgICAgIFVTVUI4ICAgZHAycDAsIHBfMiwgcF8wCi0gICAgICAgIFVTVUI4ICAgYSwgcF8wLCBwXzIKLSAgICAgICAgU0VMICAgICBhLCBhLCBkcDJwMAotICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKLSAgICAgICAgU0VMICAgICBhcGZsZywgbTAwLCBmaWx0ICAgICAgICAgICAgOy8vIGFwZmxnID0gZmlsdCAmJiAoYXA8YmV0YSkKLQotICAgICAgICA7Ly8gQ2hlY2sgYXE8QmV0YSAKLSAgICAgICAgVVNVQjggICBkcTJxMCwgcV8yLCBxXzAKLSAgICAgICAgVVNVQjggICB0MiwgcV8wLCBxXzIKLSAgICAgICAgU0VMICAgICB0MiwgdDIsIGRxMnEwCi0gICAgICAgIFVTVUI4ICAgdDIsIHQyLCBiZXRhCi0gICAgICAgIE1PViAgICAgdDcsIzAKLSAgICAgICAgCi0KLSAgICAgICAgQkxUICAgICBiU0xUNCAgICAgICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tRmlsdGVyLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWJTR0U0ICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tYlNHRTQgRXhlY3V0aW9uLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIFNFTCAgICAgdDEsIHQ3LCBmaWx0ICAgICAgICAgICAgOy8vIGFxZmxnID0gZmlsdCAmJiAoYXE8YmV0YSkgCi0gICAgICAgIENNUCAgICAgZmlsdCwgIzAKLSAgICAgICAgT1JSICAgICBhcHFmbGcsIGFwZmxnLCB0MSwgTFNMICMxCi0gICAgICAgIE1fTERSRCAgcFEwLCBzcmNkc3RTdGVwLCBwcFEwU3RlcCwgRVEKLSAgICAgICAgQkVRICAgICBOb0ZpbHRlckZpbHQwCi0KLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCi0gICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS1TdG9yZSByZXN1bHQtLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBMRFIgICAgIG1hc2tiLD1NQVNLXzIKLQotICAgICAgICA7Ly8gUDBiID0gW3IwcDAgcjFwMCByMnAwIHIzcDBdCi0gICAgICAgIDsvLyBQMWIgPSBbcjBwMSByMXAxIHIycDEgcjNwMV0KLSAgICAgICAgOy8vIFAyYiA9IFtyMHAyIHIxcDIgcjJwMiByM3AyXQotICAgICAgICA7Ly8gUDNiID0gW3IwcDMgcjFwMyByMnAzIHIzcDNdCi0KLSAgICAgICAgTV9MRFIgICBQM2IsIHBQXzMgICAKLSAgICAgICAgTV9TVFIgICBRMGIsIHBQXzMgICAKLQotICAgICAgICA7Ly8tLS0tLS1QYWNrIHAwLXAzLS0tLS0tCi0gICAgICAgIEFORCAgICAgdHVucGswLCBtYXNrYiwgUDBiCi0gICAgICAgIEFORCAgICAgdHVucGsyLCBtYXNrYiwgUDBiLCBMU0wjOAotICAgICAgICBVWFRBQjE2IHR1bnBrMCwgdHVucGswLCBQMWIsIFJPUiM4Ci0gICAgICAgIFVYVEFCMTYgdHVucGsyLCB0dW5wazIsIFAxYgotCi0gICAgICAgIEFORCAgICAgdHVucGszLCBtYXNrYiwgUDJiCi0gICAgICAgIEFORCAgICAgdHVucGs4LCBtYXNrYiwgUDJiLCBMU0wjOAotICAgICAgICBVWFRBQjE2IHR1bnBrMywgdHVucGszLCBQM2IsIFJPUiM4Ci0gICAgICAgIFVYVEFCMTYgdHVucGs4LCB0dW5wazgsIFAzYgotCi0gICAgICAgIDsvLyB0dW5wazAgPSBbcjBwMCByMHAxIHIycDAgcjJwMV0KLSAgICAgICAgOy8vIHR1bnBrMiA9IFtyMXAwIHIxcDEgcjNwMCByM3AxXQotICAgICAgICA7Ly8gdHVucGszID0gW3IwcDIgcjBwMyByMnAyIHIycDNdCi0gICAgICAgIDsvLyB0dW5wazggPSBbcjFwMiByMXAzIHIzcDIgcjNwM10KLQotICAgICAgICBNT1YgICAgIHBfMiwgUTFiCi0gICAgICAgIE1fTERSRCAgcFEwYiwgU3RlcGIsIHBwUTBTdGVwCi0KLSAgICAgICAgUEtIVEIgICByb3c5LCB0dW5wazAsIHR1bnBrMywgQVNSIzE2Ci0gICAgICAgIFBLSEJUICAgcm93NywgdHVucGszLCB0dW5wazAsIExTTCMxNgotICAgICAgICBQS0hUQiAgIHJvdzMsIHR1bnBrMiwgdHVucGs4LCBBU1IjMTYKLSAgICAgICAgUEtIQlQgICByb3c2LCB0dW5wazgsIHR1bnBrMiwgTFNMIzE2Ci0KLSAgICAgICAgOy8vIHJvdzkgPSBbcjBwMCByMHAxIHIwcDIgcjBwM10KLSAgICAgICAgOy8vIHJvdzMgPSBbcjFwMCByMXAxIHIxcDIgcjFwM10KLSAgICAgICAgOy8vIHJvdzcgPSBbcjJwMCByMnAxIHIycDIgcjJwM10KLSAgICAgICAgOy8vIHJvdzYgPSBbcjNwMCByM3AxIHIzcDIgcjNwM10KLQotICAgICAgICBNX1NUUiAgIHJvdzksIFtwUTBiXSwgU3RlcGIKLSAgICAgICAgU1RSICAgICByb3c3LCBbcFEwYiwgU3RlcGJdCi0gICAgICAgIFNUUiAgICAgcm93NiwgW3BRMGIsIFN0ZXBiLCBMU0wgIzFdCi0gICAgICAgIFNUUiAgICAgcm93MywgW3BRMGJdLCAjNAotICAgICAgICAKLSAgICAgICAgTV9MRFIgICBRM2IsIHBRXzMKLQotICAgICAgICA7Ly8gUTBiID0gW3IwcTAgcjFxMCByMnEwIHIzcTBdCi0gICAgICAgIDsvLyBRMWIgPSBbcjBxMSByMXExIHIycTEgcjNxMV0KLSAgICAgICAgOy8vIFEyYiA9IFtyMHEyIHIxcTIgcjJxMiByM3EyXQotICAgICAgICA7Ly8gUTNiID0gW3IwcTMgcjFxMyByMnEzIHIzcTNdCi0KLSAgICAgICAgOy8vLS0tLS0tUGFjayBxMC1xMy0tLS0tLQotICAgICAgICBBTkQgICAgIHR1bnBrMCwgbWFza2IsIHBfMgotICAgICAgICBBTkQgICAgIHR1bnBrMiwgbWFza2IsIHBfMiwgTFNMIzgKLSAgICAgICAgVVhUQUIxNiB0dW5wazAsIHR1bnBrMCwgUTBiLCBST1IjOAotICAgICAgICBVWFRBQjE2IHR1bnBrMiwgdHVucGsyLCBRMGIKLQotICAgICAgICBBTkQgICAgIHR1bnBrMywgbWFza2IsIFEzYgotICAgICAgICBBTkQgICAgIHR1bnBrOCwgbWFza2IsIFEzYiwgTFNMIzgKLSAgICAgICAgVVhUQUIxNiB0dW5wazMsIHR1bnBrMywgUTJiLCBST1IjOAotICAgICAgICBVWFRBQjE2IHR1bnBrOCwgdHVucGs4LCBRMmIKLQotICAgICAgICA7Ly8gdHVucGswID0gW3IwcTEgcjBxMCByMnExIHIycTBdCi0gICAgICAgIDsvLyB0dW5wazIgPSBbcjFxMSByMXEwIHIzcTEgcjNxMF0KLSAgICAgICAgOy8vIHR1bnBrMyA9IFtyMHEzIHIwcTIgcjJxMyByMnEyXQotICAgICAgICA7Ly8gdHVucGs4ID0gW3IxcTMgcjFxMiByM3EzIHIzcTJdCi0KLSAgICAgICAgUEtIVEIgICByb3c4LCB0dW5wazMsIHR1bnBrMCwgQVNSIzE2Ci0gICAgICAgIFBLSEJUICAgcm93NywgdHVucGswLCB0dW5wazMsIExTTCMxNgotICAgICAgICBQS0hUQiAgIHJvdzQsIHR1bnBrOCwgdHVucGsyLCBBU1IjMTYKLSAgICAgICAgUEtIQlQgICByb3c2LCB0dW5wazIsIHR1bnBrOCwgTFNMIzE2Ci0KLSAgICAgICAgOy8vIHJvdzggPSBbcjBxMCByMHExIHIwcTIgcjBxM10KLSAgICAgICAgOy8vIHJvdzQgPSBbcjFxMCByMXExIHIxcTIgcjFxM10KLSAgICAgICAgOy8vIHJvdzcgPSBbcjJxMCByMnExIHIycTIgcjJxM10KLSAgICAgICAgOy8vIHJvdzYgPSBbcjNxMCByM3ExIHIzcTIgcjNxM10KLQotICAgICAgICBTVFIgICAgIHJvdzQsIFtwUTBiXQotICAgICAgICBTVFIgICAgIHJvdzcsIFtwUTBiLCBTdGVwYl0KLSAgICAgICAgU1RSICAgICByb3c2LCBbcFEwYiwgU3RlcGIsIExTTCAjMV0KLQotICAgICAgICBTVUIgICAgIHBRMCwgcFEwYiwgU3RlcGIKLSAgICAgICAgTU9WICAgICBwXzEsIFEyYgotCi0gICAgICAgIFNUUiAgICAgcm93OCwgW3BRMF0KLQotICAgICAgICBNX0xEUkQgIFhZLCBwQlMsIHBYWUJTCi0gICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMQotCi0gICAgICAgIEFERFMgICAgWFksIFhZLCBYWQotICAgICAgICBBREQgICAgIHBUaHJlc2hvbGRzLCAjNAotICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLSAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKLSAgICAgICAgQkNDICAgICBMb29wWAotICAgICAgICBCICAgICAgIEV4aXRMb29wWQotCi07Ly8tLS0tLS0tLS0tIEV4aXQgb2YgTG9vcFggLS0tLS0tLS0tLS0tLS0KLTsvLy0tLS0gZm9yIHRoZSBjYXNlIG9mIG5vIGZpbHRlcmluZyAtLS0tLQotCi1Ob0ZpbHRlckZpbHQwCi0gICAgICAgIEFERCAgICAgcFEwLCBwUTAsICM0Ci1Ob0ZpbHRlckJTMAotICAgICAgICA7Ly8gTG9hZCBjb3VudGVyIGZvciBMb29wWAotICAgICAgICBNX0xEUkQgIFhZLCBwQlMsIHBYWUJTCi0gICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMQotCi0gICAgICAgIDsvLyBBbGlnbiB0aGUgcG9pbnRlcgotICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKLSAgICAgICAgQUREICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICM0Ci0gICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotICAgICAgICBNX1NUUiAgIFhZLCBwWFlCUwotICAgICAgICBCQ0MgICAgIExvb3BZCi0gICAgICAgIEIgICAgICAgRXhpdExvb3BZCi0gICAgICAgIAotYlNMVDQgICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS1iU0xUNCBFeGVjdXRpb24tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgU0VMICAgICBhcWZsZywgdDcsIGZpbHQgICAgICAgICAgICA7Ly8gYXFmbGcgPSBmaWx0ICYmIChhcTxiZXRhKSAKLSAgICAgICAgTV9MRFIgICBwdEMwLCBwcFRocmVzaG9sZHMKLSAgICAgICAgQ01QICAgICBmaWx0LCAjMAotICAgICAgICBNX0xEUkQgIHBRMCwgc3JjZHN0U3RlcCwgcHBRMFN0ZXAsIEVRCi0gICAgICAgIEJFUSAgICAgTm9GaWx0ZXJGaWx0MAotICAgICAgICAKLSAgICAgICAgTERSQiAgICB0QzAsIFtwdEMwXSwgIzQKLSAgICAgICAgTV9TVFIgICBwdEMwLCBwcFRocmVzaG9sZHMKLQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKLQotICAgICAgICA7Ly8tLS0tLS0tLS1TdG9yZSByZXN1bHQtLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOy8vLS0tLS0tLS1QYWNrIHAxLHAwLHExLHEwLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICA7Ly9Mb2FkIGRlc3RpbmF0aW9uIHBvaW50ZXIKLSAgICAgICAgTERSICAgICBtYXNrYSw9TUFTS18yCi0gICAgICAgIE1fU1RSICAgUTBhLCBwUF8zCi0gICAgICAgIE1PViAgICAgcF8xLCBxXzIKLQotICAgICAgICA7Ly8gUDFhID0gW3IwcDEgcjFwMSByMnAxIHIzcDFdCi0gICAgICAgIDsvLyBQMGEgPSBbcjBwMCByMXAwIHIycDAgcjNwMF0KLSAgICAgICAgOy8vIFEwYSA9IFtyMHEwIHIxcTAgcjJxMCByM3EwXQotICAgICAgICA7Ly8gUTFhID0gW3IwcTEgcjFxMSByMnExIHIzcTFdCi0KLSAgICAgICAgQU5EICAgICB0dW5wazEsIG1hc2thLCBQMGEKLSAgICAgICAgQU5EICAgICB0dW5wazIsIG1hc2thLCBQMGEsIExTTCM4Ci0gICAgICAgIFVYVEFCMTYgdHVucGsxLCB0dW5wazEsIFAxYSwgUk9SIzgKLSAgICAgICAgVVhUQUIxNiB0dW5wazIsIHR1bnBrMiwgUDFhCi0KLSAgICAgICAgTV9MRFJEICBwUTBhLCBTdGVwYSwgcHBRMFN0ZXAKLQotICAgICAgICBBTkQgICAgIHR1bnBrOSwgbWFza2EsIFExYQotICAgICAgICBBTkQgICAgIHR1bnBrMywgbWFza2EsIFExYSwgTFNMIzgKLSAgICAgICAgVVhUQUIxNiB0dW5wazksIHR1bnBrOSwgUTBhLCBST1IjOAotICAgICAgICBVWFRBQjE2IHR1bnBrMywgdHVucGszLCBRMGEKLQotICAgICAgICA7Ly8gdHVucGsxID0gW3IwcDAgcjBwMSByMnAwIHIycDFdCi0gICAgICAgIDsvLyB0dW5wazIgPSBbcjFwMCByMXAxIHIzcDAgcjNwMV0KLSAgICAgICAgOy8vIHR1bnBrOSA9IFtyMHExIHIwcTAgcjJxMSByMnEwXQotICAgICAgICA7Ly8gdHVucGszID0gW3IxcTEgcjFxMCByM3ExIHIzcTBdCi0KLSAgICAgICAgTU9WICAgICB0NCwgdHVucGsxLCBMU1IgIzE2Ci0gICAgICAgIE1PViAgICAgdDAsIHR1bnBrOSwgTFNSICMxNgotCi0gICAgICAgIFNUUkggICAgdDQsW3BRMGEsICMyXSEgICAgICAgICAgOy8vU3RvcmVzIFtyMHAwIHIwcDFdCi0gICAgICAgIFNUUkggICAgdDAsW3BRMGEsICMyXSAgICAgICAgICAgOy8vU3RvcmVzIFtyMHEwIHIwcTFdCi0KLSAgICAgICAgTU9WICAgICB0NCwgdHVucGsyLCBMU1IgIzE2Ci0gICAgICAgIE1PViAgICAgdDAsIHR1bnBrMywgTFNSICMxNgotCi0gICAgICAgIE1fU1RSSCAgdDQsW3BRMGEsIFN0ZXBhXSEgICAgICAgOy8vU3RvcmVzIFtyMXAwIHIxcDFdCi0gICAgICAgIFNUUkggICAgdDAsW3BRMGEsICMyXSAgICAgICAgICAgOy8vU3RvcmVzIFtyMXEwIHIxcTFdCi0gICAgICAgIAotICAgICAgICBNX1NUUkggIHR1bnBrMSxbcFEwYSwgU3RlcGFdISAgIDsvL1N0b3JlcyBbcjJwMCByMnAxXQotICAgICAgICBTVFJIICAgIHR1bnBrMixbcFEwYSwgU3RlcGFdICAgIDsvL1N0b3JlcyBbcjNwMCByM3AxXQotICAgICAgICBTVFJIICAgIHR1bnBrOSxbcFEwYSwgIzJdISAgICAgICAgOy8vU3RvcmVzIFtyMnEwIHIycTFdCi0gICAgICAgIFNUUkggICAgdHVucGszLFtwUTBhLCBTdGVwYV0gICAgOy8vU3RvcmVzIFtyM3EwIHIzcTFdCi0KLSAgICAgICAgU1VCICAgICBwUTAsIHBRMGEsIFN0ZXBhLCBMU0wgIzEKLQotICAgICAgICA7Ly8gTG9hZCBjb3VudGVyCi0gICAgICAgIE1fTERSRCAgWFksIHBCUywgcFhZQlMKLQotICAgICAgICA7Ly8gUmVsb2FkIFBpeGVscwotICAgICAgICBNX0xEUiAgIHBfMCwgcFFfMwotICAgICAgICBNT1YgICAgIHBfMiwgUTFhCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGExCi0KLSAgICAgICAgQUREUyAgICBYWSwgWFksIFhZCi0gICAgICAgIE1fU1RSICAgWFksIHBYWUJTCi0gICAgICAgIEJDQyAgICAgTG9vcFgKLSAgICAgICAgCi07Ly8tLS0tLS0tLSBDb21tb24gRXhpdCBvZiBMb29wWSAtLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7Ly8gQWxpZ24gdGhlIHBvaW50ZXJzIAotICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKLUV4aXRMb29wWQotICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCAjMTYKLSAgICAgICAgQUREICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMyCi0gICAgICAgIFNVQiAgICAgcEJTLCBwQlMsICMxNQotICAgICAgICBTVUIgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzE1Ci0gICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcwotCi0gICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGEwCi0KLSAgICAgICAgQk5FICAgICBMb29wWQotICAgICAgICBNT1YgICAgIHIwLCAjT01YX1N0c19Ob0VycgotCi0gICAgICAgIE1fRU5ECi07Ly8tLS0tLS0tLS0tLS0tLS0tLUVuZCBGaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRU5ESUYgICAgICAgIAotICAgICAgICAKLSAgICAgICAgRU5ECi0gICAgICAgIAotICAgICAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZDE4NWYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgMS84IFBpeGVsIGludGVycG9sYXRpb24gZm9yIENocm9tYSBCbG9jawotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0KLS8qKgotICogRnVuY3Rpb246IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEsCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyAxLzgtcGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgaW50ZXIgY2hyb21hIE1CLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyYwlQb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlcgotICogW2luXQlzcmNTdGVwIFJlZmVyZW5jZSBmcmFtZSBzdGVwIGluIGJ5dGUKLSAqIFtpbl0JZHN0U3RlcCBEZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGUuIE11c3QgYmUgbXVsdGlwbGUgb2Ygcm9pLndpZHRoLgotICogW2luXQlkeAkJRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQKLSAqCQkJCQkJaW4gMS84IHBpeGVsIHVuaXQ7dmFsaWQgaW4gdGhlIHJhbmdlIFswLDddCi0gKiBbaW5dCWR5CQlGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQKLSAqCQkJCQkJaW4gMS84IHBpeGVsIHVuaXQ7dmFsaWQgaW4gdGhlIHJhbmdlIFswLDddCi0gKiBbaW5dCXJvaQkJRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjt0aGUgcGFyYW1ldGVycyByb2kud2lkdGggYW5kIHJvaS5oZWlnaHQgbXVzdAotICogICAgICAgICAgICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDIsIDQsIG9yIDguCi0gKiBbb3V0XQlwRHN0CVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlci4KLSAqICAgICAgICAgICAgICAgICAgIGlmIHJvaS53aWR0aD09MiwgIDItYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQKLSAqICAgICAgICAgICAgICAgICAgIGlmIHJvaS53aWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQKLSAqICAgICAgICAgICAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuCi0gKiBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE9NWF9TdHNfQmFkQXJnRXJyOgotICoJcFNyYyBvciBwRHN0IGlzIE5VTEwuCi0gKglzcmNTdGVwIG9yIGRzdFN0ZXAgPCA4LgotICoJZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLTddLgotICoJcm9pLndpZHRoIG9yIHJvaS5oZWlnaHQgaXMgb3V0IG9mIHJhbmdlIHsyLDQsOH0uCi0gKglyb2kud2lkdGggaXMgZXF1YWwgdG8gMiwgYnV0IHBEc3QgaXMgbm90IDItYnl0ZSBhbGlnbmVkLgotICoJcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIGJ1dCBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4KLSAqCXJvaS53aWR0aCBpcyBlcXVhbCB0byA4LCBidXQgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuCi0gKglzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4KLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgKAotICAgICBjb25zdCBPTVhfVTgqIHBTcmMsCi0gICAgIE9NWF9TMzIgc3JjU3RlcCwKLSAgICAgT01YX1U4KiBwRHN0LAotICAgICBPTVhfUzMyIGRzdFN0ZXAsCi0gICAgIE9NWF9TMzIgZHgsCi0gICAgIE9NWF9TMzIgZHksCi0gICAgIE9NWFNpemUgcm9pCi0gKQotewotICAgIHJldHVybiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYSAKLSAgICAgICAgKChPTVhfVTgqKXBTcmMsIHNyY1N0ZXAsIHBEc3QsIGRzdFN0ZXAsIHJvaS53aWR0aCwgcm9pLmhlaWdodCwgZHgsIGR5KTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IzYjRlMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucworKysgL2Rldi9udWxsCkBAIC0xLDQ0MCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotOy8vIEZ1bmN0aW9uOgotOy8vICAgICBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYQotOy8vCi07Ly8gVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hIGluIHY2IGFzc2VtYmx5LgotOy8vIFBlcmZvcm1zIHF1YXJ0ZXIgcGVsIGludGVycG9sYXRpb24gb2YgaW50ZXIgbHVtYSBNQi4KLTsvLyBJdCdzIGFzc3VtZWQgdGhhdCB0aGUgZnJhbWUgaXMgYWxyZWFkeSBwYWRkZWQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCi07Ly8gUGFyYW1ldGVyczoKLTsvLyBbaW5dICAgIHBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyCi07Ly8gW2luXSAgICBzcmNTdGVwICAgICBSZWZlcmVuY2UgZnJhbWUgc3RlcCBpbiBieXRlCi07Ly8gW2luXSAgICBkc3RTdGVwICAgICBEZXN0aW5hdGlvbiBmcmFtZSBzdGVwIGluIGJ5dGUuIE11c3QgYmUgbXVsdGlwbGUgb2Ygcm9pLndpZHRoCi07Ly8gW2luXSAgICBkeCAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yCi07Ly8gICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10KLTsvLyBbaW5dICAgIGR5ICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yCi07Ly8gICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10KLTsvLyBbaW5dICAgIHJvaSAgICAgICAgIERpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247dGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCByb2kuaGVpZ2h0IG11c3QKLTsvLyAgICAgICAgICAgICAgICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuCi07Ly8gW291dF0gICBwRHN0ICAgICAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXIuCi07Ly8gICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZAotOy8vICAgICAgICAgICAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQKLTsvLyAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZAotOy8vCi07Ly8gUmV0dXJuIFZhbHVlOgotOy8vIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4KLTsvLyBJdCBpcyBhc3N1ZWQgdGhhdCBmb2xsb3dpbmcgY2FzZXMgYXJlIHNhdGlzZmllZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uOgotOy8vICBwU3JjIG9yIHBEc3QgaXMgbm90IE5VTEwuCi07Ly8gIHNyY1N0ZXAgb3IgZHN0U3RlcCA+PSByb2kud2lkdGguCi07Ly8gICAgIGR4IG9yIGR5IGlzIGluIHRoZSByYW5nZSBbMC0zXS4KLTsvLyAgICAgcm9pLndpZHRoIG9yIHJvaS5oZWlnaHQgaXMgbm90IG91dCBvZiByYW5nZSB7NCwgOCwgMTZ9LgotOy8vICAgICBJZiByb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgRHN0IGlzIDQgYnl0ZSBhbGlnbmVkLgotOy8vICAgICBJZiByb2kud2lkdGggaXMgZXF1YWwgdG8gOCwgcERzdCBpcyA4IGJ5dGUgYWxpZ25lZC4KLTsvLyAgICAgSWYgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDE2LCBwRHN0IGlzIDE2IGJ5dGUgYWxpZ25lZC4KLTsvLyAgICAgc3JjU3RlcCBhbmQgZHN0U3RlcCBpcyBtdWx0aXBsZSBvZiA4LgotOy8vCi07Ly8KLQotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLQotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0gICAgICAgIEVYUE9SVCBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYQotICAgICAgICAKLSAgICBJRiBBUk0xMTM2SlMKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduM191bnNhZmUKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZQotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlCi0gICAgRU5ESUYKLQotICAgIElGIEFSTTExMzZKUwotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQotICAgIEVORElGCi0gICAgCi0gICAgCi0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotcFNyYyAgICAgICAgICAgIFJOIDAKLXNyY1N0ZXAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgUk4gMgotZHN0U3RlcCAgICAgICAgIFJOIDMKLWlIZWlnaHQgICAgICAgICBSTiA0Ci1pV2lkdGggICAgICAgICAgUk4gNQotCi07Ly8gRGVjbGFyZSBvdGhlciBpbnRlcm1lZGlhdGUgcmVnaXN0ZXJzCi1pZHggICAgICAgICAgICAgUk4gNgotaWR5ICAgICAgICAgICAgIFJOIDcKLWluZGV4ICAgICAgICAgICBSTiA2Ci1UZW1wICAgICAgICAgICAgUk4gMTIKLXBBcmdzICAgICAgICAgICBSTiAxMQotCi0KLSAgICAgICAgOy8vIEVuZCBvZiBDb3J0ZXhBOAotICAgICAgICAgICAgICAgICAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgIAotICAgIElGIEFSTTExMzZKUwotCi0KLSAgICAgICAgTV9BTExPQzQgcHBEc3QsIDgKLSAgICAgICAgTV9BTExPQzQgcHBTcmMsIDgKLSAgICAgICAgTV9BTExPQzQgcHBBcmdzLCAxNgotICAgICAgICBNX0FMTE9DNCBwQnVmZmVyLCAxMjAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMTIwID0gMTJ4MTAKLSAgICAgICAgTV9BTExPQzggcEludGVyQnVmLCAxMjAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDEyMCA9IDEyKjUqMgotICAgICAgICBNX0FMTE9DOCBwVGVtcEJ1ZiwgMzIgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMzIgPSAgOCo0Ci0gICAgICAgIAotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIDsvLyBJbnRlcnBvbGF0aW9uIG9mIGx1bWEgaXMgaW1wbGVtZW50ZWQgYnkgcHJvY2Vzc2luZyBibG9jayBvZiBwaXhlbHMsIHNpemUgNHg0IGF0IGEgdGltZS4KLSAgICAgICAgOy8vIERlcGVuZGluZyBvbiB0aGUgdmFsdWVzIG9mIG1vdGlvbiB2ZWN0b3IgZnJhY3Rpb25hbCBwYXJ0cyAoZHgsZHkpLCBvbmUgb3V0IG9mIDE2IGNhc2VzIHdpbGwgYmUgcHJvY2Vzc2VkLgotICAgICAgICA7Ly8gUmVnaXN0ZXJzIHI0LCByNSwgcjYgdG8gYmUgcHJlc2VydmVkIGJ5IGludGVybmFsIHVuc2FmZSBmdW5jdGlvbnMKLSAgICAgICAgOy8vIHI0IC0gaUhlaWdodAotICAgICAgICA7Ly8gcjUgLSBpV2lkdGgKLSAgICAgICAgOy8vIHI2IC0gaW5kZXgKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSwgcjExCi0KLTsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKLWlkeCAgICAgICAgICAgICBSTiA2Ci1pZHkgICAgICAgICAgICAgUk4gNwotaW5kZXggICAgICAgICAgIFJOIDYKLVRlbXAgICAgICAgICAgICBSTiAxMgotcEFyZ3MgICAgICAgICAgIFJOIDExCi0KLXBCdWYgICAgICAgICAgICBSTiA4Ci1IZWlnaHQgICAgICAgICAgUk4gOSAKLWJ1ZlN0ZXAgICAgICAgICBSTiA5Ci0gICAgICAgIAotICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cwotICAgICAgICBNX0FSRyAgIHB0cmlkeCwgNAotICAgICAgICBNX0FSRyAgIHB0cmlkeSwgNCAgICAgICAgCi0gICAgICAgIE1fQVJHICAgcHRyV2lkdGgsIDQKLSAgICAgICAgTV9BUkcgICBwdHJIZWlnaHQsIDQgICAgICAgIAotCi0gICAgICAgIDsvLyBMb2FkIHN0cnVjdHVyZSBlbGVtZW50cyBvZiByb2kgCi0gICAgICAgIE1fTERSICAgaWR4LCBwdHJpZHgKLSAgICAgICAgTV9MRFIgICBpZHksIHB0cmlkeQotICAgICAgICBNX0xEUiAgIGlXaWR0aCwgcHRyV2lkdGgKLSAgICAgICAgTV9MRFIgICBpSGVpZ2h0LCBwdHJIZWlnaHQKLSAgICAgICAgCi0gICAgICAgIE1fUFJJTlRGICJyb2kud2lkdGggJWRcbiIsIGlXaWR0aAotICAgICAgICBNX1BSSU5URiAicm9pLmhlaWdodCAlZFxuIiwgaUhlaWdodAotCi0gICAgICAgIEFERCAgICAgaW5kZXgsIGlkeCwgaWR5LCBMU0wgIzIgICAgICAgICAgICAgICAgIDsvLyAgW2luZGV4XSA9IFtpZHldW2lkeF0KLSAgICAgICAgTV9BRFIgICBwQXJncywgcHBBcmdzCi0KLUludGVycG9sYXRlTHVtYQotQmxvY2s0eDRXaWR0aExvb3AKLUJsb2NrNHg0SGVpZ2h0TG9vcAotCi0gICAgICAgIFNUTSAgICAgcEFyZ3MsIHtwU3JjLHNyY1N0ZXAscERzdCxkc3RTdGVwfSAKLSAgICAgICAgTV9BRFIgICBwQnVmLCBwQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgOy8vIHN3aXRjaCB0YWJsZSB1c2luZyBtb3Rpb24gdmVjdG9yIGFzIGluZGV4Ci0gICAgICAgIE1fU1dJVENIIGluZGV4LCBMCi0gICAgICAgIE1fQ0FTRSAgQ2FzZV8wCi0gICAgICAgIE1fQ0FTRSAgQ2FzZV8xCi0gICAgICAgIE1fQ0FTRSAgQ2FzZV8yCi0gICAgICAgIE1fQ0FTRSAgQ2FzZV8zCi0gICAgICAgIE1fQ0FTRSAgQ2FzZV80Ci0gICAgICAgIE1fQ0FTRSAgQ2FzZV81Ci0gICAgICAgIE1fQ0FTRSAgQ2FzZV82Ci0gICAgICAgIE1fQ0FTRSAgQ2FzZV83Ci0gICAgICAgIE1fQ0FTRSAgQ2FzZV84Ci0gICAgICAgIE1fQ0FTRSAgQ2FzZV85Ci0gICAgICAgIE1fQ0FTRSAgQ2FzZV9hCi0gICAgICAgIE1fQ0FTRSAgQ2FzZV9iCi0gICAgICAgIE1fQ0FTRSAgQ2FzZV9jCi0gICAgICAgIE1fQ0FTRSAgQ2FzZV9kCi0gICAgICAgIE1fQ0FTRSAgQ2FzZV9lCi0gICAgICAgIE1fQ0FTRSAgQ2FzZV9mCi0gICAgICAgIE1fRU5EU1dJVENICi0KLUNhc2VfMAotICAgICAgICA7Ly8gQ2FzZSBHCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIDAgXG4iCi0KLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5NHg0X3Vuc2FmZQotICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAotCi1DYXNlXzEKLSAgICAgICAgOy8vIENhc2UgYQotICAgICAgICBNX1BSSU5URiAiQ2FzZSAxIFxuIgotCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKLSAgICAgICAgTU9WICAgICBIZWlnaHQsICM0Ci0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24yX3Vuc2FmZQotICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAotQ2FzZV8yCi0gICAgICAgIDsvLyBDYXNlIGIKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgMiBcbiIKLSAgICAgICAgCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKLSAgICAgICAgTU9WICAgICBIZWlnaHQsICM0Ci0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZSAgICAgICAgCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlXzMKLSAgICAgICAgOy8vIENhc2UgYwotICAgICAgICBNX1BSSU5URiAiQ2FzZSAzIFxuIgotCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKLSAgICAgICAgTU9WICAgICBIZWlnaHQsICM0Ci0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZQotICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAotQ2FzZV80Ci0gICAgICAgIDsvLyBDYXNlIGQKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgNCBcbiIKLQotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCi0KLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKLUNhc2VfNQotICAgICAgICA7Ly8gQ2FzZSBlCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIDUgXG4iCi0KLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgotICAgICAgICBNT1YgICAgIEhlaWdodCwgIzQKLSAgICAgICAgTV9BRFIgICBwRHN0LCBwVGVtcEJ1ZgotICAgICAgICBNT1YgICAgIGRzdFN0ZXAsICM0Ci0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQotICAgICAgICBNX0FEUiAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgTERNICAgICBwQXJncywge3BTcmMsIHNyY1N0ZXAsIHBEc3QsIGRzdFN0ZXB9Ci0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIE1fQURSICAgcEJ1ZiwgcEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCi0gICAgICAgIE1fQURSICAgcFNyYywgcFRlbXBCdWYKLSAgICAgICAgTU9WICAgICBzcmNTdGVwLCAjNAotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQotICAgICAgICAKLQotICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAotQ2FzZV82Ci0gICAgICAgIDsvLyBDYXNlIGYKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgNiBcbiIKLQotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsICMyCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCi0gICAgICAgIE1fQURSICAgcEJ1ZiwgcEludGVyQnVmCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCi0gICAgICAgIE1fQURSICAgaWR5LCBwVGVtcEJ1ZgotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckRpYWdDb3B5X3Vuc2FmZSAgICAKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKLUNhc2VfNwotICAgICAgICA7Ly8gQ2FzZSBnCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIDcgXG4iCi0gICAgICAgIAotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsICMyCi0gICAgICAgIE1PViAgICAgSGVpZ2h0LCAjNAotICAgICAgICBNX0FEUiAgIHBEc3QsIHBUZW1wQnVmCi0gICAgICAgIE1PViAgICAgZHN0U3RlcCwgIzQKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCi0gICAgICAgIE1fQURSICAgcEFyZ3MsIHBwQXJncwotICAgICAgICBMRE0gICAgIHBBcmdzLCB7cFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcH0KLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCAjMQotICAgICAgICBNX0FEUiAgIHBCdWYsIHBCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgTU9WICAgICBIZWlnaHQsICM5Ci0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQotICAgICAgICBNX0FEUiAgIHBTcmMsIHBUZW1wQnVmCi0gICAgICAgIE1PViAgICAgc3JjU3RlcCwgIzQKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKLQotICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAotQ2FzZV84Ci0gICAgICAgIDsvLyBDYXNlIGgKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgOCBcbiIKLQotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlXzkKLSAgICAgICAgOy8vIENhc2UgaQotICAgICAgICBNX1BSSU5URiAiQ2FzZSA5IFxuIgotCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgTU9WICAgICBIZWlnaHQsICM5Ci0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKLSAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgTV9BRFIgICBwQnVmLCBwSW50ZXJCdWYKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKLSAgICAgICAgTV9BRFIgICBpZHksIHBUZW1wQnVmCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlICAgIAotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24yX3Vuc2FmZQotICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAotQ2FzZV9hCi0gICAgICAgIDsvLyBDYXNlIGoKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgYSBcbiIKLQotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsICMyCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCi0gICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIE1fQURSICAgcEJ1ZiwgcEludGVyQnVmCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlX2IKLSAgICAgICAgOy8vIENhc2UgawotICAgICAgICBNX1BSSU5URiAiQ2FzZSBiIFxuIgotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsICMyCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCi0gICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIE1fQURSICAgcEJ1ZiwgcEludGVyQnVmCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCi0gICAgICAgIE1fQURSICAgaWR5LCBwVGVtcEJ1ZgotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZSAgICAKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduM191bnNhZmUKLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKLUNhc2VfYwotICAgICAgICA7Ly8gQ2FzZSBuCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIGMgXG4iCi0KLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgTU9WICAgICBIZWlnaHQsICM5Ci0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQotICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAgICAgICAgICAgICAgICAgICAgICA7Ly8gVXBkYXRlIHBTcmMgdG8gb25lIHJvdyBkb3duCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlX2QKLSAgICAgICAgOy8vIENhc2UgcAotICAgICAgICBNX1BSSU5URiAiQ2FzZSBkIFxuIgotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsICMyCi0gICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcAotICAgICAgICBNT1YgICAgIEhlaWdodCwgIzQKLSAgICAgICAgTV9BRFIgICBwRHN0LCBwVGVtcEJ1ZgotICAgICAgICBNT1YgICAgIGRzdFN0ZXAsICM0Ci0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQotICAgICAgICBNX0FEUiAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgTERNICAgICBwQXJncywge3BTcmMsIHNyY1N0ZXAsIHBEc3QsIGRzdFN0ZXB9Ci0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIE1fQURSICAgcEJ1ZiwgcEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCi0gICAgICAgIE1fQURSICAgcFNyYywgcFRlbXBCdWYKLSAgICAgICAgTU9WICAgICBzcmNTdGVwLCAjNAotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQotICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAotQ2FzZV9lCi0gICAgICAgIDsvLyBDYXNlIHEKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgZSBcbiIKLSAgICAgICAgCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgTU9WICAgICBIZWlnaHQsICM5Ci0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKLSAgICAgICAgTV9BRFIgICBwQnVmLCBwSW50ZXJCdWYKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKLSAgICAgICAgTV9BRFIgICBpZHksIHBUZW1wQnVmCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlCi0gICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgIzQgICAgCi0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCi0KLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKLUNhc2VfZgotICAgICAgICA7Ly8gQ2FzZSByCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIGYgXG4iCi0gICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKLSAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCi0gICAgICAgIE1PViAgICAgSGVpZ2h0LCAjNAotICAgICAgICBNX0FEUiAgIHBEc3QsIHBUZW1wQnVmCi0gICAgICAgIE1PViAgICAgZHN0U3RlcCwgIzQKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCi0gICAgICAgIE1fQURSICAgcEFyZ3MsIHBwQXJncwotICAgICAgICBMRE0gICAgIHBBcmdzLCB7cFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcH0KLSAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCAjMQotICAgICAgICBNX0FEUiAgIHBCdWYsIHBCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgTU9WICAgICBIZWlnaHQsICM5Ci0gICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQotICAgICAgICBNX0FEUiAgIHBTcmMsIHBUZW1wQnVmCi0gICAgICAgIE1PViAgICAgc3JjU3RlcCwgIzQKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKLQotQmxvY2s0eDRMb29wRW5kCi0KLSAgICAgICAgOy8vIFdpZHRoIExvb3AKLSAgICAgICAgU1VCUyAgICBpV2lkdGgsIGlXaWR0aCwgIzQKLSAgICAgICAgTV9BRFIgICBwQXJncywgcHBBcmdzCi0gICAgICAgIExETSAgICAgcEFyZ3MsIHtwU3JjLHNyY1N0ZXAscERzdCxkc3RTdGVwfSAgOy8vIExvYWQgYXJndW1lbnRzCi0gICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgIzQgICAgICAKLSAgICAgICAgQUREICAgICBwRHN0LCBwRHN0LCAjNAotICAgICAgICBCR1QgICAgIEJsb2NrNHg0V2lkdGhMb29wCi0KLSAgICAgICAgOy8vIEhlaWdodCBMb29wCi0gICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzQKLSAgICAgICAgTV9MRFIgICBpV2lkdGgsIHB0cldpZHRoCi0gICAgICAgIE1fQURSICAgcEFyZ3MsIHBwQXJncwotICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMiAgICAgIAotICAgICAgICBBREQgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMgotICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIGlXaWR0aAotICAgICAgICBTVUIgICAgIHBEc3QsIHBEc3QsIGlXaWR0aAotICAgICAgICBCR1QgICAgIEJsb2NrNHg0SGVpZ2h0TG9vcAotCi1FbmRPZkludGVycG9sYXRpb24KLSAgICAgICAgTU9WICAgICByMCwgIzAKLSAgICAgICAgTV9FTkQKLQotICAgIEVORElGCi0gICAgICAgICAgICAgICAgICAgIAotCi0gICAgRU5ECi0gICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5YjRjZjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNTA4ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAKLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfcEluZGV4VGFibGU4eDgKLSAgICAgICAgCi07Ly8gRGVmaW5lIHRoZSBwcm9jZXNzb3IgdmFyaWFudHMgc3VwcG9ydGVkIGJ5IHRoaXMgZmlsZQotICAgICAgICAgCi0gICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotICAgICAKLSAgICAgQVJFQSB0YWJsZSwgREFUQSAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGZvciBpbXBsZW1lbnRpbmcgc3dpdGNoIGNhc2Ugb2YgQyBpbiBhc20gYnkKLTsvLyB0aGUgbWVodG9kIG9mIHR3byBsZXZlbHMgb2YgaW5kZXhpbmcuCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBNX1RBQkxFIGFybVZDTTRQMTBfcEluZGV4VGFibGU4eDgKLSAgICBEQ0QgIE9NWF9WQ19DSFJPTUFfREMsICAgICBPTVhfVkNfQ0hST01BX0hPUiAKLSAgICBEQ0QgIE9NWF9WQ19DSFJPTUFfVkVSVCwgICBPTVhfVkNfQ0hST01BX1BMQU5FICAKLSAgICAKLSAgICBNX1RBQkxFIGFybVZDTTRQMTBfTXVsdGlwbGllclRhYmxlQ2hyb21hOHg4LDEKLSAgICBEQ1cgICAzLCAyLCAxLDQgCi0gICAgRENXICAtMywtMiwtMSwwCi0gICAgRENXICAgMSwgMiwgMyw0Ci0gICAgCi0gICAgSUYgQVJNMTEzNkpTCi0gIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBDb25zdGFudHMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKLQotQkxLX1NJWkUgICAgICAgIEVRVSAweDgKLU1VTF9DT05TVDAgICAgICBFUVUgMHgwMTAxMDEwMQotTUFTS19DT05TVCAgICAgIEVRVSAweDAwRkYwMEZGCi1NVUxfQ09OU1QxICAgICAgRVFVIDB4ODA4MDgwODAKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBTY3JhdGNoIHZhcmlhYmxlCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoteSAgICAgICAgICAgICAgIFJOIDEyICAgCi1wYyAgICAgICAgICAgICAgUk4gMTUgICAKLXJldHVybiAgICAgICAgICBSTiAwICAgIAotcFNyY0xlZnQyICAgICAgIFJOIDEgICAgCi1wRHN0MiAgICAgICAgICAgUk4gMiAgICAKLXN1bTEgICAgICAgICAgICBSTiA2ICAgIAotc3VtMiAgICAgICAgICAgIFJOIDcgICAgCi1wVGFibGUgICAgICAgICAgUk4gOSAgICAKLWRzdFN0ZXB4MiAgICAgICBSTiAxMSAgIAotbGVmdFN0ZXB4MiAgICAgIFJOIDE0ICAgCi1vdXRlckNvdW50ICAgICAgUk4gMTQgICAKLXIweDAxMDEwMTAxICAgICBSTiAxMCAgIAotcjB4MDBGRjAwRkYgICAgIFJOIDExICAgCi0KLXRWYWwwICAgICAgICAgICBSTiAwICAgIAotdFZhbDEgICAgICAgICAgIFJOIDEgICAgCi10VmFsMiAgICAgICAgICAgUk4gMiAgICAKLXRWYWwzICAgICAgICAgICBSTiAzICAgIAotdFZhbDQgICAgICAgICAgIFJOIDQgICAgCi10VmFsNSAgICAgICAgICAgUk4gNSAgICAKLXRWYWw2ICAgICAgICAgICBSTiA2ICAgIAotdFZhbDcgICAgICAgICAgIFJOIDcgICAgCi10VmFsOCAgICAgICAgICAgUk4gOCAgICAKLXRWYWw5ICAgICAgICAgICBSTiA5ICAgIAotdFZhbDEwICAgICAgICAgIFJOIDEwICAgCi10VmFsMTEgICAgICAgICAgUk4gMTEgICAKLXRWYWwxMiAgICAgICAgICBSTiAxMiAgIAotdFZhbDE0ICAgICAgICAgIFJOIDE0ICAgCi0KLWIgICAgICAgICAgICAgICBSTiAxNCAgIAotYyAgICAgICAgICAgICAgIFJOIDEyICAgCi0KLXAycDAgICAgICAgICAgICBSTiAwICAgIAotcDNwMSAgICAgICAgICAgIFJOIDEgICAgCi1wNnA0ICAgICAgICAgICAgUk4gMiAgICAKLXA3cDUgICAgICAgICAgICBSTiA0ICAgIAotCi1wcDJwcDAgICAgICAgICAgUk4gNiAgICAKLXBwM3BwMSAgICAgICAgICBSTiA3ICAgIAotcHA2cHA0ICAgICAgICAgIFJOIDggICAgCi1wcDdwcDUgICAgICAgICAgUk4gOSAgICAKLQotcDMyMTAgICAgICAgICAgIFJOIDEwICAgCi1wNzY1NCAgICAgICAgICAgUk4gMTAgICAKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBJbnB1dCBBcmd1bWVudHMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wU3JjTGVmdCAgICAgICAgUk4gMCAgICA7Ly8gaW5wdXQgcG9pbnRlcgotcFNyY0Fib3ZlICAgICAgIFJOIDEgICAgOy8vIGlucHV0IHBvaW50ZXIKLXBTcmNBYm92ZUxlZnQgICBSTiAyICAgIDsvLyBpbnB1dCBwb2ludGVyCi1wRHN0ICAgICAgICAgICAgUk4gMyAgICA7Ly8gb3V0cHV0IHBvaW50ZXIKLWxlZnRTdGVwICAgICAgICBSTiA0ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotZHN0U3RlcCAgICAgICAgIFJOIDUgICAgOy8vIGlucHV0IHZhcmlhYmxlCi1wcmVkTW9kZSAgICAgICAgUk4gNiAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLWF2YWlsYWJpbGl0eSAgICBSTiA3ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCBzdGFydHMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4LCByMTEKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCi0gICAgICAgIE1fQVJHICAgIExlZnRTdGVwLCAgICAgNAotICAgICAgICBNX0FSRyAgICBEc3RTdGVwLCAgICAgIDQKLSAgICAgICAgTV9BUkcgICAgUHJlZE1vZGUsICAgICA0Ci0gICAgICAgIE1fQVJHICAgIEF2YWlsYWJpbGl0eSwgNAotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgIHBUYWJsZSw9YXJtVkNNNFAxMF9wSW5kZXhUYWJsZTh4OCAgIDsvLyBMb2FkIGluZGV4IHRhYmxlIGZvciBzd2l0Y2ggY2FzZQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCi0gICAgICAgIE1fTERSICAgIHByZWRNb2RlLCBQcmVkTW9kZSAgICAgICAgICAgICAgICAgIDsvLyBBcmcgcHJlZE1vZGUgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAotICAgICAgICBNX0xEUiAgICBsZWZ0U3RlcCwgTGVmdFN0ZXAgICAgICAgICAgICAgICAgICA7Ly8gQXJnIGxlZnRTdGVwIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKLSAgICAgICAgTV9MRFIgICAgZHN0U3RlcCwgIERzdFN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIEFyZyBkc3RTdGVwIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAgICAgICAgIAotICAgICAgICBNX0xEUiAgICBhdmFpbGFiaWxpdHksIEF2YWlsYWJpbGl0eSAgICAgICAgICA7Ly8gQXJnIGF2YWlsYWJpbGl0eSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICB5LCAjQkxLX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gT3V0ZXIgTG9vcCBDb3VudAotICAgICAgICBMRFIgICAgICBwYywgW3BUYWJsZSwgcHJlZE1vZGUsIExTTCAjMl0gICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBjYXNlIGJhc2VkIG9uIHByZU1vZGUKLQotT01YX1ZDX0NIUk9NQV9EQwotICAgICAgICBBTkQgICAgICBhdmFpbGFiaWxpdHksIGF2YWlsYWJpbGl0eSwjKE9NWF9WQ19VUFBFUiArIE9NWF9WQ19MRUZUKQotICAgICAgICBDTVAgICAgICBhdmFpbGFiaWxpdHksICMoT01YX1ZDX1VQUEVSICsgT01YX1ZDX0xFRlQpIDsvLyBpZihhdmFpbGFiaWxpdHkgJiAoI09NWF9WQ19VUFBFUiB8ICNPTVhfVkNfTEVGVCkpCi0gICAgICAgIExEUiAgICAgIHIweDAxMDEwMTAxLCA9TVVMX0NPTlNUMAotICAgICAgICBCTkUgICAgICBUU1RfVVBQRVIgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSnVtcCB0byBVcHBlciBpZiBub3QgYm90aAotICAgICAgICBMRE0gICAgICBwU3JjQWJvdmUse3RWYWw4LHRWYWw5fSAgICAgICAgICAgICA7Ly8gdFZhbCA4IHRvIDkgPSBwU3JjQWJvdmVbMCB0byA3XQotICAgICAgICAKLSAgICAgICAgQUREICAgICAgbGVmdFN0ZXB4MiwgbGVmdFN0ZXAsbGVmdFN0ZXAgICAgICAgOy8vIGxlZnRTdGVweDIgPSAyICogbGVmdFN0ZXAKLSAgICAgICAgQUREICAgICAgcFNyY0xlZnQyLCBwU3JjTGVmdCwgbGVmdFN0ZXAgICAgICAgOy8vIHBTcmNMZWZ0MiA9IHBTcmNMZWZ0ICsgbGVmdFN0ZXAKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgCi0gICAgICAgIFVYVEIxNiAgIHRWYWw3LCB0VmFsOCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0KLSAgICAgICAgVVhUQjE2ICAgdFZhbDgsIHRWYWw4LCBST1IgIzggICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsxLCAzXQotICAgICAgICBVQUREMTYgICBzdW0xLCB0VmFsNywgdFZhbDggICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdICsgcFNyY0Fib3ZlWzEsIDNdCi0gICAgICAgIAotICAgICAgICBVWFRCMTYgICB0VmFsNywgdFZhbDkgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzQsIDZdCi0gICAgICAgIFVYVEIxNiAgIHRWYWw5LCB0VmFsOSwgUk9SICM4ICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNSwgN10KLSAgICAgICAgVUFERDE2ICAgc3VtMiwgdFZhbDcsIHRWYWw5ICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXSArIHBTcmNBYm92ZVs0LCA2XQotICAgICAgICBBREQgICAgICBzdW0xLCBzdW0xLCBzdW0xLCBMU1IgIzE2ICAgICAgICAgICA7Ly8gc3VtKHBTcmNBYm92ZVswXSB0byBwU3JjQWJvdmVbM10pCi0gICAgICAgIEFERCAgICAgIHN1bTIsIHN1bTIsIHN1bTIsIExTUiAjMTYgICAgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzRdIHRvIHBTcmNBYm92ZVs3XSkKLSAgICAgICAgVVhUSCAgICAgc3VtMSwgc3VtMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHVwc3VtMSAoQ2xlYXIgdGhlIHRvcCBqdW5rIGJpdHMpCi0gICAgICAgIFVYVEggICAgIHN1bTIsIHN1bTIgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB1cHN1bTIgKENsZWFyIHRoZSB0b3AganVuayBiaXRzKQotICAgICAgICAKLSAgICAgICAgTV9MRFJCICAgdFZhbDgsIFtwU3JjTGVmdF0sICArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw4ID0gcFNyY0xlZnRbMF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDksIFtwU3JjTGVmdDJdLCArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw5ID0gcFNyY0xlZnRbMV0KLSAgICAgICAgTV9MRFJCICAgdFZhbDQsIFtwU3JjTGVmdF0sICArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw0ID0gcFNyY0xlZnRbMl0KLSAgICAgICAgTV9MRFJCICAgdFZhbDEyLFtwU3JjTGVmdDJdLCArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWwxMj0gcFNyY0xlZnRbM10KLSAgICAgICAgQUREICAgICAgdFZhbDIsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHRWYWwxNCA9IHRWYWw4ICsgdFZhbDkKLSAgICAgICAgCi0gICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzRdCi0gICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzVdCi0gICAgICAgIEFERCAgICAgIHRWYWwxNCwgdFZhbDQsIHRWYWwxMiAgICAgICAgICAgICAgIDsvLyB0VmFsMTQgPSB0VmFsNCArIHRWYWwxMgotICAgICAgICAKLSAgICAgICAgTERSQiAgICAgdFZhbDQsIFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICAgOy8vIHRWYWw0ID0gcFNyY0xlZnRbNl0KLSAgICAgICAgTERSQiAgICAgdFZhbDEyLFtwU3JjTGVmdDJdICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxMj0gcFNyY0xlZnRbN10KLSAgICAgICAgQUREICAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gdFZhbDggKyB0VmFsOQotICAgICAgICBBREQgICAgICB0VmFsMiwgdFZhbDIsIHRWYWwxNCAgICAgICAgICAgICAgICA7Ly8gbGVmdHN1bTEgID0gc3VtKHBTcmNMZWZ0WzBdIHRvIHBTcmNMZWZ0WzNdKQotICAgICAgICBBREQgICAgICB0VmFsNCwgdFZhbDQsIHRWYWwxMiAgICAgICAgICAgICAgICA7Ly8gdFZhbDQgPSB0VmFsNCArIHRWYWwxMgotICAgICAgICBBREQgICAgICB0VmFsMTQsIHRWYWw4LCB0VmFsNCAgICAgICAgICAgICAgICA7Ly8gbGVmdHN1bTIgID0gc3VtKHBTcmNMZWZ0WzRdIHRvIHBTcmNMZWZ0WzddKQotICAgICAgICBBREQgICAgICB0VmFsOCwgdFZhbDE0LCAjMiAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSBsZWZ0c3VtMiArIDIKLSAgICAgICAgQUREICAgICAgdFZhbDksIHN1bTIsICAgIzIgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gdXBzdW0yICsgMgotICAgICAgICBBREQgICAgICBzdW0xLCAgc3VtMSwgdFZhbDIgICAgICAgICAgICAgICAgICA7Ly8gc3VtMSA9IHVwc3VtMSArIGxlZnRzdW0xCi0gICAgICAgIEFERCAgICAgIHN1bTIsICBzdW0yLCB0VmFsMTQgICAgICAgICAgICAgICAgIDsvLyBzdW0yID0gdXBzdW0yICsgbGVmdHN1bTIKLSAgICAgICAgQUREICAgICAgc3VtMSwgc3VtMSwgIzQgICAgICAgICAgICAgICAgICAgICAgOy8vIChzdW0xICsgNCkKLSAgICAgICAgQUREICAgICAgc3VtMiwgc3VtMiwgIzQgICAgICAgICAgICAgICAgICAgICAgOy8vIChzdW0yICsgNCkKLSAgICAgICAgTU9WICAgICAgc3VtMSwgIHN1bTEsICBMU1IgIzMgICAgICAgICAgICAgICAgOy8vIChzdW0xICsgNCk+PjMKLSAgICAgICAgTU9WICAgICAgdFZhbDksIHRWYWw5LCBMU1IgIzIgICAgICAgICAgICAgICAgOy8vICh0VmFsOSArIDIpPj4yCi0gICAgICAgIE1PViAgICAgIHRWYWw4LCB0VmFsOCwgTFNSICMyICAgICAgICAgICAgICAgIDsvLyAodFZhbDggKyAyKT4+MgotICAgICAgICBNT1YgICAgICBzdW0yLCAgc3VtMiwgIExTUiAjMyAgICAgICAgICAgICAgICA7Ly8gKHN1bTIgKyA0KT4+MwotICAgICAgICAKLSAgICAgICAgTVVMICAgICAgdFZhbDAsIHN1bTEsIHIweDAxMDEwMTAxICAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgTVVMICAgICAgdFZhbDEsIHRWYWw5LHIweDAxMDEwMTAxICAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgTVVMICAgICAgdFZhbDgsIHRWYWw4LHIweDAxMDEwMTAxICAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgTVVMICAgICAgdFZhbDksIHN1bTIsIHIweDAxMDEwMTAxICAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgCi0gICAgICAgIE1fU1RSRCAgIHRWYWwwLCB0VmFsMSwgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzAgdG8gN10gICA9IHRWYWwgMCB0byAxCi0gICAgICAgIE1fU1RSRCAgIHRWYWwwLCB0VmFsMSwgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzggdG8gMTVdICA9IHRWYWwgMCB0byAxCi0gICAgICAgIE1fU1RSRCAgIHRWYWwwLCB0VmFsMSwgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzE2IHRvIDIzXSA9IHRWYWwgMCB0byAxCi0gICAgICAgIE1fU1RSRCAgIHRWYWwwLCB0VmFsMSwgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzI0IHRvIDMxXSA9IHRWYWwgMCB0byAxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgTV9TVFJEICAgdFZhbDgsIHRWYWw5LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMzIgdG8gMzldID0gdFZhbCA4IHRvIDkKLSAgICAgICAgTV9TVFJEICAgdFZhbDgsIHRWYWw5LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNDAgdG8gNDddID0gdFZhbCA4IHRvIDkKLSAgICAgICAgTV9TVFJEICAgdFZhbDgsIHRWYWw5LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNDggdG8gNTVdID0gdFZhbCA4IHRvIDkKLSAgICAgICAgTV9TVFJEICAgdFZhbDgsIHRWYWw5LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNTYgdG8gNjNdID0gdFZhbCA4IHRvIDkKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VYSVQKLSAgICAgICAgCi1UU1RfVVBQRVIKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zCi0gICAgICAgIAotICAgICAgICBDTVAgICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfVVBQRVIgICAgICAgICA7Ly8gaWYoYXZhaWxhYmlsaXR5ICYgI09NWF9WQ19VUFBFUikKLSAgICAgICAgCi0gICAgICAgIEJORSAgICAgIFRTVF9MRUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBKdW1wIHRvIExlZnQgaWYgbm90IHVwcGVyCi0gICAgICAgIExETSAgICAgIHBTcmNBYm92ZSx7dFZhbDgsdFZhbDl9ICAgICAgICAgICAgIDsvLyB0VmFsIDggdG8gOSA9IHBTcmNBYm92ZVswIHRvIDddCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MwotICAgICAgICAKLSAgICAgICAgVVhUQjE2ICAgdFZhbDcsIHRWYWw4ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXQotICAgICAgICBVWFRCMTYgICB0VmFsOCwgdFZhbDgsIFJPUiAjOCAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzEsIDNdCi0gICAgICAgIFVBREQxNiAgIHN1bTEsICB0VmFsNywgdFZhbDggICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0gKyBwU3JjQWJvdmVbMSwgM10KLSAgICAgICAgCi0gICAgICAgIFVYVEIxNiAgIHRWYWw3LCB0VmFsOSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNCwgNl0KLSAgICAgICAgVVhUQjE2ICAgdFZhbDksIHRWYWw5LCBST1IgIzggICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs1LCA3XQotICAgICAgICBVQUREMTYgICBzdW0yLCAgdFZhbDcsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdICsgcFNyY0Fib3ZlWzQsIDZdCi0gICAgICAgIAotICAgICAgICBBREQgICAgICBzdW0xLCBzdW0xLCBzdW0xLCBMU1IgIzE2ICAgICAgICAgICA7Ly8gc3VtKHBTcmNBYm92ZVswXSB0byBwU3JjQWJvdmVbM10pCi0gICAgICAgIEFERCAgICAgIHN1bTIsIHN1bTIsIHN1bTIsIExTUiAjMTYgICAgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzRdIHRvIHBTcmNBYm92ZVs3XSkKLSAgICAgICAgCi0gICAgICAgIFVYVEggICAgIHN1bTEsIHN1bTEgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB1cHN1bTEgKENsZWFyIHRoZSB0b3AganVuayBiaXRzKQotICAgICAgICBVWFRIICAgICBzdW0yLCBzdW0yICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdXBzdW0yIChDbGVhciB0aGUgdG9wIGp1bmsgYml0cykKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgIHN1bTEsIHN1bTEsICMyICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0xICsgMgotICAgICAgICBBREQgICAgICBzdW0yLCBzdW0yLCAjMiAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtMiArIDIKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIHN1bTEsIHN1bTEsIExTUiAjMiAgICAgICAgICAgICAgICAgIDsvLyAoc3VtMSArIDIpPj4yCi0gICAgICAgIE1PViAgICAgIHN1bTIsIHN1bTIsIExTUiAjMiAgICAgICAgICAgICAgICAgIDsvLyAoc3VtMiArIDIpPj4yCi0gICAgICAgIAotICAgICAgICBNVUwgICAgICBzdW0xLCBzdW0xLHIweDAxMDEwMTAxICAgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICBNVUwgICAgICBzdW0yLCBzdW0yLHIweDAxMDEwMTAxICAgICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICAKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMCB0byA3XSAgID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbOCB0byAxNV0gID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMTYgdG8gMjNdID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMjQgdG8gMzFdID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMzIgdG8gMzldID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNDAgdG8gNDddID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNDggdG8gNTVdID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNTYgdG8gNjNdID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VYSVQKLSAgICAgICAgCi1UU1RfTEVGVCAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTMgICAgICAgCi0gICAgICAgIAotICAgICAgICBDTVAgICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfTEVGVAotICAgICAgICBCTkUgICAgICBUU1RfQ09VTlQwCi0gICAgICAgIEFERCAgICAgIGxlZnRTdGVweDIsIGxlZnRTdGVwLGxlZnRTdGVwICAgICAgIDsvLyBsZWZ0U3RlcHgyID0gMiAqIGxlZnRTdGVwCi0gICAgICAgIEFERCAgICAgIHBTcmNMZWZ0MiwgcFNyY0xlZnQsIGxlZnRTdGVwICAgICAgIDsvLyBwU3JjTGVmdDIgPSBwU3JjTGVmdCArIGxlZnRTdGVwCi0gICAgICAgIAotICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFswXQotICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFsxXQotICAgICAgICBNX0xEUkIgICB0VmFsNCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDQgPSBwU3JjTGVmdFsyXQotICAgICAgICBNX0xEUkIgICB0VmFsMTIsW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDEyPSBwU3JjTGVmdFszXQotICAgICAgICAKLSAgICAgICAgQUREICAgICAgdFZhbDYsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHRWYWw2ID0gdFZhbDggKyB0VmFsOQotICAgICAgICAKLSAgICAgICAgTV9MRFJCICAgdFZhbDgsIFtwU3JjTGVmdF0sICArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw4ID0gcFNyY0xlZnRbNF0KLSAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw0LCB0VmFsMTIgICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gdFZhbDQgKyB0VmFsMTIKLSAgICAgICAgTV9MRFJCICAgdFZhbDksIFtwU3JjTGVmdDJdLCArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw5ID0gcFNyY0xlZnRbNV0KLSAgICAgICAgTV9MRFJCICAgdFZhbDQsIFtwU3JjTGVmdF0sICArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw0ID0gcFNyY0xlZnRbNl0KLSAgICAgICAgTV9MRFJCICAgdFZhbDEyLFtwU3JjTGVmdDJdLCArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWwxMj0gcFNyY0xlZnRbN10KLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgIHRWYWw4LCB0VmFsOCwgdFZhbDkgICAgICAgICAgICAgICAgIDsvLyB0VmFsOCA9IHRWYWw4ICsgdFZhbDkKLSAgICAgICAgQUREICAgICAgc3VtMSwgIHRWYWw2LCB0VmFsNyAgICAgICAgICAgICAgICAgOy8vIHN1bTEgID0gc3VtKHBTcmNMZWZ0WzBdIHRvIHBTcmNMZWZ0WzNdKQotICAgICAgICBBREQgICAgICB0VmFsNCwgdFZhbDQsIHRWYWwxMiAgICAgICAgICAgICAgICA7Ly8gdFZhbDQgPSB0VmFsNCArIHRWYWwxMgotICAgICAgICBBREQgICAgICBzdW0yLCAgdFZhbDgsIHRWYWw0ICAgICAgICAgICAgICAgICA7Ly8gc3VtMiAgPSBzdW0ocFNyY0xlZnRbNF0gdG8gcFNyY0xlZnRbN10pCi0gICAgICAgIAotICAgICAgICBBREQgICAgICBzdW0xLCBzdW0xLCAjMiAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtMSArIDIKLSAgICAgICAgQUREICAgICAgc3VtMiwgc3VtMiwgIzIgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bTIgKyAyCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICBzdW0xLCBzdW0xLCBMU1IgIzIgICAgICAgICAgICAgICAgICA7Ly8gKHN1bTEgKyAyKT4+MgotICAgICAgICBNT1YgICAgICBzdW0yLCBzdW0yLCBMU1IgIzIgICAgICAgICAgICAgICAgICA7Ly8gKHN1bTIgKyAyKT4+MgotICAgICAgICAKLSAgICAgICAgTVVMICAgICAgdFZhbDYsIHN1bTEscjB4MDEwMTAxMDEgICAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgTVVMICAgICAgdFZhbDgsIHN1bTIscjB4MDEwMTAxMDEgICAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIE1PViAgICAgIHRWYWw3LHRWYWw2ICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsNyA9IHN1bTEKLSAgICAgICAgTU9WICAgICAgdFZhbDksdFZhbDggICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw5ID0gc3VtMgotICAgICAgICAKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMCB0byA3XSAgID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbOCB0byAxNV0gID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMTYgdG8gMjNdID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMjQgdG8gMzFdID0gdFZhbCA2IHRvIDcKLSAgICAgICAgCi0gICAgICAgIE1fU1RSRCAgIHRWYWw4LCB0VmFsOSwgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzMyIHRvIDM5XSA9IHRWYWwgOCB0byA5Ci0gICAgICAgIE1fU1RSRCAgIHRWYWw4LCB0VmFsOSwgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzQwIHRvIDQ3XSA9IHRWYWwgOCB0byA5Ci0gICAgICAgIE1fU1RSRCAgIHRWYWw4LCB0VmFsOSwgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzQ4IHRvIDU1XSA9IHRWYWwgOCB0byA5Ci0gICAgICAgIE1fU1RSRCAgIHRWYWw4LCB0VmFsOSwgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzU2IHRvIDYzXSA9IHRWYWwgOCB0byA5Ci0gICAgICAgIAotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQotCi1UU1RfQ09VTlQwCi0gICAgICAgIExEUiAgICAgIHN1bTEsID1NVUxfQ09OU1QxICAgICAgICAgICAgICAgICAgOy8vIHN1bTEgPSAweDgwODA4MDgwIGlmKGNvdW50ID09IDApCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MgotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgdFZhbDcsIHN1bTEgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gc3VtMQotICAgICAgICAKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMCB0byA3XSAgID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbOCB0byAxNV0gID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMTYgdG8gMjNdID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMjQgdG8gMzFdID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbMzIgdG8gMzldID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNDAgdG8gNDddID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNDggdG8gNTVdID0gdFZhbCA2IHRvIDcKLSAgICAgICAgTV9TVFJEICAgdFZhbDYsIHRWYWw3LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgOy8vIHBEc3RbNTYgdG8gNjNdID0gdFZhbCA2IHRvIDcKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCi0KLU9NWF9WQ19DSFJPTUFfSE9SCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MiAKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgIHBTcmNMZWZ0MiwgcFNyY0xlZnQsIGxlZnRTdGVwICAgICAgIDsvLyBwU3JjTGVmdDIgPSBwU3JjTGVmdCArIGxlZnRTdGVwCi0gICAgICAgIEFERCAgICAgIGxlZnRTdGVweDIsIGxlZnRTdGVwLCBsZWZ0U3RlcCAgICAgIDsvLyBsZWZ0U3RlcHgyID0gbGVmdFN0ZXAgKiAyCi0gICAgICAgIEFERCAgICAgIHBEc3QyLCBwRHN0LCBkc3RTdGVwICAgICAgICAgICAgICAgIDsvLyBwRHN0MiA9IHBEc3QgKyBkc3RTdGVwCi0gICAgICAgIEFERCAgICAgIGRzdFN0ZXB4MiwgZHN0U3RlcCwgZHN0U3RlcCAgICAgICAgIDsvLyBkb3VibGUgZHN0U3RlcAotICAgICAgICBTVUIgICAgICBkc3RTdGVweDIsIGRzdFN0ZXB4MiwgIzQgICAgICAgICAgICA7Ly8gZG91YmxlIGRzdFN0ZXAgIG1pbnVzIDQKLSAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsID1NVUxfQ09OU1QwICAgICAgICAgICAgOy8vIENvbnN0IHRvIHJlcGVhdCB0aGUgYnl0ZSBpbiByZWcgNCB0aW1lcwotICAgICAgICBNX0xEUkIgICB0VmFsNiwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVweDIgICAgICA7Ly8gdFZhbDYgPSBwU3JjTGVmdFswXQotICAgICAgICBNX0xEUkIgICB0VmFsNywgW3BTcmNMZWZ0Ml0sK2xlZnRTdGVweDIgICAgICA7Ly8gdFZhbDcgPSBwU3JjTGVmdFsxXQotICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVweDIgICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFsyXQotICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sK2xlZnRTdGVweDIgICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFszXQotICAgICAgICBNVUwgICAgICB0VmFsNiwgdFZhbDYsIHIweDAxMDEwMTAxICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICBNVUwgICAgICB0VmFsNywgdFZhbDcsIHIweDAxMDEwMTAxICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICBNVUwgICAgICB0VmFsOCwgdFZhbDgsIHIweDAxMDEwMTAxICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICBNVUwgICAgICB0VmFsOSwgdFZhbDksIHIweDAxMDEwMTAxICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICBTVFIgICAgICB0VmFsNiwgW3BEc3RdLCAgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFswIHRvIDNdIAotICAgICAgICBTVFIgICAgICB0VmFsNywgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0MlswIHRvIDNdCi0gICAgICAgIE1fU1RSICAgIHRWYWw2LCBbcERzdF0sICBkc3RTdGVweDIgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzQgdG8gN10KLSAgICAgICAgTV9TVFIgICAgdFZhbDcsIFtwRHN0Ml0sIGRzdFN0ZXB4MiAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbNCB0byA3XQotICAgICAgICBTVFIgICAgICB0VmFsOCwgW3BEc3RdLCAgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFswIHRvIDNdCi0gICAgICAgIFNUUiAgICAgIHRWYWw5LCBbcERzdDJdLCAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzAgdG8gM10KLSAgICAgICAgTV9TVFIgICAgdFZhbDgsIFtwRHN0XSwgIGRzdFN0ZXB4MiAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbNCB0byA3XQotICAgICAgICBNX1NUUiAgICB0VmFsOSwgW3BEc3QyXSwgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0Mls0IHRvIDddCi0gICAgICAgIE1fTERSQiAgIHRWYWw2LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXB4MiAgICAgIDsvLyB0VmFsNiA9IHBTcmNMZWZ0WzRdCi0gICAgICAgIE1fTERSQiAgIHRWYWw3LCBbcFNyY0xlZnQyXSwrbGVmdFN0ZXB4MiAgICAgIDsvLyB0VmFsNyA9IHBTcmNMZWZ0WzVdCi0gICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXB4MiAgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzZdCi0gICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwrbGVmdFN0ZXB4MiAgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzddCi0gICAgICAgIE1VTCAgICAgIHRWYWw2LCB0VmFsNiwgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIE1VTCAgICAgIHRWYWw3LCB0VmFsNywgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIE1VTCAgICAgIHRWYWw4LCB0VmFsOCwgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIE1VTCAgICAgIHRWYWw5LCB0VmFsOSwgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIFNUUiAgICAgIHRWYWw2LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzAgdG8gM10gCi0gICAgICAgIFNUUiAgICAgIHRWYWw3LCBbcERzdDJdLCAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzAgdG8gM10KLSAgICAgICAgTV9TVFIgICAgdFZhbDYsIFtwRHN0XSwgIGRzdFN0ZXB4MiAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbNCB0byA3XQotICAgICAgICBNX1NUUiAgICB0VmFsNywgW3BEc3QyXSwgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0Mls0IHRvIDddCi0gICAgICAgIFNUUiAgICAgIHRWYWw4LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzAgdG8gM10KLSAgICAgICAgU1RSICAgICAgdFZhbDksIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbMCB0byAzXQotICAgICAgICBNX1NUUiAgICB0VmFsOCwgW3BEc3RdLCAgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFs0IHRvIDddCi0gICAgICAgIE1fU1RSICAgIHRWYWw5LCBbcERzdDJdLCBkc3RTdGVweDIgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzQgdG8gN10KLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VYSVQKLSAgICAgICAgCi1PTVhfVkNfQ0hST01BX1ZFUlQKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz00ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIExETUlBICAgIHBTcmNBYm92ZSwge3RWYWw2LHRWYWw3fSAgICAgICAgICAgIDsvLyB0VmFsIDYgdG8gNyA9IHBTcmNBYm92ZVswIHRvIDddCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgCi0gICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzAgdG8gN10gICA9IHRWYWwgNiB0byA3Ci0gICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzggdG8gMTVdICA9IHRWYWwgNiB0byA3Ci0gICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzE2IHRvIDIzXSA9IHRWYWwgNiB0byA3Ci0gICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzI0IHRvIDMxXSA9IHRWYWwgNiB0byA3Ci0gICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzMyIHRvIDM5XSA9IHRWYWwgNiB0byA3Ci0gICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzQwIHRvIDQ3XSA9IHRWYWwgNiB0byA3Ci0gICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzQ4IHRvIDU1XSA9IHRWYWwgNiB0byA3Ci0gICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzU2IHRvIDYzXSA9IHRWYWwgNiB0byA3Ci0KLSAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCi0gICAgICAgIAotT01YX1ZDX0NIUk9NQV9QTEFORQotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTMKLSAgICAgICAgCi0gICAgICAgIFJTQiAgICAgIHRWYWwxNCwgbGVmdFN0ZXAsIGxlZnRTdGVwLCBMU0wgIzMgIDsvLyA3KmxlZnRTdGVwCi0gICAgICAgIExEUkIgICAgIHRWYWw3LCBbcFNyY0Fib3ZlLCAjKzddICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbN10KLSAgICAgICAgTERSQiAgICAgdFZhbDYsIFtwU3JjTGVmdCwgK3RWYWwxNF0gICAgICAgICAgOy8vIHBTcmNMZWZ0WzcqbGVmdFN0ZXBdCi0gICAgICAgIExEUkIgICAgIHRWYWw4LCBbcFNyY0Fib3ZlTGVmdF0gICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVMZWZ0WzBdCi0gICAgICAgIExEUkIgICAgIHRWYWw5LCBbcFNyY0Fib3ZlLCAjKzYgXSAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNl0KLSAgICAgICAgTERSQiAgICAgdFZhbDEwLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswXQotICAgICAgICBBREQgICAgICB0VmFsMiwgdFZhbDcsIHRWYWw2ICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzddICsgcFNyY0xlZnRbNypsZWZ0U3RlcF0KLSAgICAgICAgU1VCICAgICAgdFZhbDYsIHRWYWw2LCB0VmFsOCAgICAgICAgICAgICAgICAgOy8vIFYwID0gcFNyY0xlZnRbNypsZWZ0U3RlcF0gLSBwU3JjQWJvdmVMZWZ0WzBdCi0gICAgICAgIFNVQiAgICAgIHRWYWw3LCB0VmFsNywgdFZhbDggICAgICAgICAgICAgICAgIDsvLyBIMCA9IHBTcmNBYm92ZVs3XSAtIHBTcmNBYm92ZUxlZnRbMF0gICAgICAgIAotICAgICAgICBMU0wgICAgICB0VmFsMiwgdFZhbDIsICM0ICAgICAgICAgICAgICAgICAgICA7Ly8gYSA9IDE2ICogKHBTcmNBYm92ZVsxNV0gKyBwU3JjTGVmdFsxNSpsU10pCi0gICAgICAgIEFERCAgICAgIHRWYWwyLCB0VmFsMiwgIzE2ICAgICAgICAgICAgICAgICAgIDsvLyBhICsgMTYKLSAgICAgICAgU1VCICAgICAgdFZhbDksIHRWYWw5LHRWYWwxMCAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs2XSAtIHBTcmNBYm92ZVswXQotICAgICAgICBMRFJCICAgICB0VmFsOCwgW3BTcmNBYm92ZSwjKzVdICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzVdCi0gICAgICAgIExEUkIgICAgIHRWYWwxMCxbcFNyY0Fib3ZlLCMrMV0gICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMV0KLSAgICAgICAgQUREICAgICAgdFZhbDksIHRWYWw5LCB0VmFsOSwgTFNMICMxICAgICAgICAgOy8vIEgxID0gMyAqIChwU3JjQWJvdmVbNl0gLSBwU3JjQWJvdmVbMF0pCi0gICAgICAgIEFERCAgICAgIHRWYWw3LCB0VmFsOSwgdFZhbDcsIExTTCAjMiAgICAgICAgIDsvLyBIID0gSDEgKyBIMAotICAgICAgICBTVUIgICAgICB0VmFsOCwgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzVdIC0gcFNyY0Fib3ZlWzFdCi0gICAgICAgIExEUkIgICAgIHRWYWw5LCBbcFNyY0Fib3ZlLCMrNF0gICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNF0KLSAgICAgICAgTERSQiAgICAgdFZhbDEwLFtwU3JjQWJvdmUsIysyXSAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsyXQotICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDcsIHRWYWw4LCBMU0wgIzEgICAgICAgICA7Ly8gSCA9IEggKyBIMgotICAgICAgICBTVUIgICAgICB0VmFsMTEsIHRWYWwxNCxsZWZ0U3RlcCAgICAgICAgICAgICA7Ly8gNipsZWZ0U3RlcAotICAgICAgICBBREQgICAgICB0VmFsMTEsIHBTcmNMZWZ0LCB0VmFsMTEgICAgICAgICAgICA7Ly8gcFNyY0xlZnQgKyA2KmxlZnRTdGVwCi0gICAgICAgIE1PViAgICAgIHRWYWwxMiwgcFNyY0xlZnQgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdAotICAgICAgICBTVUIgICAgICB0VmFsOSwgdFZhbDksIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzRdIC0gcFNyY0Fib3ZlWzJdCi0gICAgICAgIEFERCAgICAgIHRWYWw3LCB0VmFsNywgdFZhbDkgICAgICAgICAgICAgICAgIDsvLyBIID0gSCArIEgzCi0gICAgICAgIE1fTERSQiAgIHRWYWw4LCBbdFZhbDExXSwtbGVmdFN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs2KmxlZnRTdGVwXQotICAgICAgICBNX0xEUkIgICB0VmFsMTAsW3RWYWwxMl0sK2xlZnRTdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMF0KLSAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw3LCB0VmFsNywgTFNMICM0ICAgICAgICAgOy8vIDE3ICogSAotICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDcsICMxNiAgICAgICAgICAgICAgICAgICA7Ly8gMTcgKiBIICsgMTYKLSAgICAgICAgU1VCICAgICAgdFZhbDgsIHRWYWw4LCB0VmFsMTAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzYqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbMF0KLSAgICAgICAgQVNSICAgICAgYiwgdFZhbDcsICM1ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGIgPSAoMTcgKiBIICsgMTYpID4+IDUKLSAgICAgICAgQUREICAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOCwgTFNMICMxICAgICAgICAgOy8vIFYxID0gMyAqIChwU3JjTGVmdFs2KmxlZnRTdGVwXSAtIHBTcmNMZWZ0WzBdKQotICAgICAgICBBREQgICAgICB0VmFsNiwgdFZhbDgsIHRWYWw2LCBMU0wgIzIgICAgICAgICA7Ly8gViA9IFYwICtWMQotICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3RWYWwxMV0sLWxlZnRTdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNSpsZWZ0U3RlcF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDEwLFt0VmFsMTJdLCtsZWZ0U3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0W2xlZnRTdGVwXQotICAgICAgICBBREQgICAgICB0VmFsNywgYiwgYiwgTFNMICMxICAgICAgICAgICAgICAgICA7Ly8gMypiCi0gICAgICAgIFNVQiAgICAgIHRWYWwyLCB0VmFsMiwgdFZhbDcgICAgICAgICAgICAgICAgIDsvLyBhICsgMTYgLSAzKmIKLSAgICAgICAgU1VCICAgICAgdFZhbDcsIHRWYWw4LCB0VmFsMTAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzUqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbbGVmdFN0ZXBdCi0gICAgICAgIE1fTERSQiAgIHRWYWw4LCBbdFZhbDExXSwtbGVmdFN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs0KmxlZnRTdGVwXQotICAgICAgICBNX0xEUkIgICB0VmFsMTAsW3RWYWwxMl0sK2xlZnRTdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMipsZWZ0U3RlcF0gICAgICAgIAotICAgICAgICBBREQgICAgICB0VmFsNiwgdFZhbDYsIHRWYWw3LCBMU0wgIzEgICAgICAgICA7Ly8gViA9IFYgKyBWMgotICAgICAgICBMRFIgICAgICByMHgwMEZGMDBGRiwgPU1BU0tfQ09OU1QgICAgICAgICAgICA7Ly8gcjB4MDBGRjAwRkYgPSAweDAwRkYwMEZGCi0gICAgICAgIFNVQiAgICAgIHRWYWw3LCB0VmFsOCwgdFZhbDEwICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs0KmxlZnRTdGVwXSAtIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCi0gICAgICAgIEFERCAgICAgIHRWYWw2LCB0VmFsNiwgdFZhbDcgICAgICAgICAgICAgICAgIDsvLyBWID0gViArIFY3Ci0gICAgICAgIFNVQiAgICAgIGRzdFN0ZXAsIGRzdFN0ZXAsICM0ICAgICAgICAgICAgICAgIDsvLyBkc3RTdGVwIC0gNAotICAgICAgICBBREQgICAgICB0VmFsNiwgdFZhbDYsIHRWYWw2LCBMU0wgIzQgICAgICAgICA7Ly8gMTcqVgotICAgICAgICBBREQgICAgICB0VmFsNiwgdFZhbDYsICMxNiAgICAgICAgICAgICAgICAgICA7Ly8gMTcqViArIDE2Ci0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgQVNSICAgICAgYywgdFZhbDYsICM1ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGMgPSAoMTcqViArIDE2KT4+NQotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgIHRWYWw2LCBjLCBjLCBMU0wgIzEgICAgICAgICAgICAgICAgIDsvLyAzKmMKLSAgICAgICAgVVhUSCAgICAgYywgYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIG9ubHkgaW4gaGFsZiB3b3JkCi0gICAgICAgIFNVQiAgICAgIHRWYWw2LCB0VmFsMiwgdFZhbDYgICAgICAgICAgICAgICAgIDsvLyBhIC0gMypiIC0gMypjICsgMTYKLSAgICAgICAgT1JSICAgICAgYywgYywgYywgTFNMICMxNiAgICAgICAgICAgICAgICAgICAgOy8vIGMgYwotICAgICAgICBBREQgICAgICB0VmFsNywgYiwgYiAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMmIKLSAgICAgICAgQUREICAgICAgdFZhbDIsIHRWYWw2LCB0VmFsNyAgICAgICAgICAgICAgICAgOy8vIHBwMiA9IGQgKyAyKmIKLSAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw3LCBiICAgICAgICAgICAgICAgICAgICAgOy8vIDNiCi0gICAgICAgIE9SUiAgICAgIHAycDAsICAgdFZhbDYsICB0VmFsMiwgIExTTCAjMTYgICAgIDsvLyBwMnAwICAgPSBwYWNrIHtwMiwgcDB9Ci0gICAgICAgIFVYVEggICAgIGIsIGIKLSAgICAgICAgVVhUSCAgICAgdFZhbDcsIHRWYWw3Ci0gICAgICAgIE9SUiAgICAgIGIsIGIsIGIsIExTTCAjMTYgICAgICAgICAgICAgICAgICAgIDsvLyB7YixifQotICAgICAgICBPUlIgICAgICB0VmFsNywgdFZhbDcsIHRWYWw3LCBMU0wgIzE2ICAgICAgICA7Ly8gezNiLDNifQotICAgICAgICBTQUREMTYgICBwM3AxLCAgIHAycDAsIGIgICAgICAgICAgICAgICAgICAgICA7Ly8gcDNwMSAgID0gcDJwMCArIHtiLGJ9Ci0gICAgICAgIFNBREQxNiAgIHA2cDQsICAgcDNwMSwgdFZhbDcgICAgICAgICAgICAgICAgIDsvLyBwNnA0ICAgPSBwM3AxICsgezNiLDNifQotICAgICAgICBTQUREMTYgICBwN3A1LCAgIHA2cDQsIGIgICAgICAgICAgICAgICAgICAgICA7Ly8gcDdwNSAgID0gcDZwNCArIHtiLGJ9Ci0gICAgICAgIE1PViAgICAgIG91dGVyQ291bnQsICNCTEtfU0laRSAgICAgICAgICAgICAgIDsvLyBPdXRlciBMb29wIENvdW50ICAgICAgICAKLSAgICAgICAgCi1MT09QX1BMQU5FICAgICAgICAKLQotICAgICAgICBVU0FUMTYgICBwN3A1LCAgICMxMywgcDdwNSAgICAgICAgICAgICAgICAgICAgOy8vIGNsaXAxMyhwNykgY2xpcDEzKHA1KQotICAgICAgICBVU0FUMTYgICBwNnA0LCAgICMxMywgcDZwNCAgICAgICAgICAgICAgICAgICAgOy8vIGNsaXAxMyhwNikgY2xpcDEzKHA0KQotICAgICAgICBVU0FUMTYgICBwM3AxLCAgICMxMywgcDNwMSAgICAgICAgICAgICAgICAgICAgOy8vIGNsaXAxMyhwMykgY2xpcDEzKHAxKQotICAgICAgICBVU0FUMTYgICBwMnAwLCAgICMxMywgcDJwMCAgICAgICAgICAgICAgICAgICAgOy8vIGNsaXAxMyhwMikgY2xpcDEzKHAwKQotICAgICAgICAKLSAgICAgICAgQU5EICAgICAgcHA3cHA1LCByMHgwMEZGMDBGRiwgcDdwNSwgQVNSICM1ICAgIDsvLyBjbGlwOChwNykgY2xpcDgocDUpCi0gICAgICAgIEFORCAgICAgIHBwNnBwNCwgcjB4MDBGRjAwRkYsIHA2cDQsIEFTUiAjNSAgICA7Ly8gY2xpcDgocDYpIGNsaXA4KHA0KQotICAgICAgICBBTkQgICAgICBwcDNwcDEsIHIweDAwRkYwMEZGLCBwM3AxLCBBU1IgIzUgICAgOy8vIGNsaXA4KHAzKSBjbGlwOChwMSkKLSAgICAgICAgQU5EICAgICAgcHAycHAwLCByMHgwMEZGMDBGRiwgcDJwMCwgQVNSICM1ICAgIDsvLyBjbGlwOChwMikgY2xpcDgocDApCi0gICAgICAgIAotICAgICAgICBTVUJTICAgICBvdXRlckNvdW50LCBvdXRlckNvdW50LCAjMSAgICAgICAgICAgOy8vIG91dGVyQ291bnQtLQotICAgICAgCi0gICAgICAgIE9SUiAgICAgIHAzMjEwLCBwcDJwcDAsIHBwM3BwMSwgTFNMICM4ICAgICAgICA7Ly8gcGFjayB7cDMscDIsIHAxLCBwMH0KLSAgICAgICAgU1RSICAgICAgcDMyMTAsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7cERzdFswXSB0byBwRHN0WzNdfSAgCi0gICAgICAgIAotICAgICAgICBPUlIgICAgICBwNzY1NCwgcHA2cHA0LCBwcDdwcDUsIExTTCAjOCAgICAgICAgOy8vIHBhY2sge3A3LHA2LCBwNSwgcDR9Ci0gICAgICAgIE1fU1RSICAgIHA3NjU0LCBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3BEc3RbNF0gdG8gcERzdFs3XX0KLQotICAgICAgICBTQUREMTYgICBwN3A1LCAgIHA3cDUsICAgYyAgICAgICAgICAgICAgICAgICAgOy8vIHtwNyArIGN9LCB7cDUgKyBjfQotICAgICAgICBTQUREMTYgICBwNnA0LCAgIHA2cDQsICAgYyAgICAgICAgICAgICAgICAgICAgOy8vIHtwNiArIGN9LCB7cDQgKyBjfQotICAgICAgICBTQUREMTYgICBwM3AxLCAgIHAzcDEsICAgYyAgICAgICAgICAgICAgICAgICAgOy8vIHtwMyArIGN9LCB7cDEgKyBjfQotICAgICAgICBTQUREMTYgICBwMnAwLCAgIHAycDAsICAgYyAgICAgICAgICAgICAgICAgICAgOy8vIHtwMiArIGN9LCB7cDAgKyBjfQotICAgICAgCi0gICAgICAgIEJORSAgICAgIExPT1BfUExBTkUgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9vcCBmb3IgOCB0aW1lcwotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRU5ECi0gICAgICAgIAotICAgICAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIEVORAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggZW5kcwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMGNiYTcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTUgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMgICAgCi0gIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgZm9yIGltcGxlbWVudGluZyBzd2l0Y2ggY2FzZSBvZiBDIGluIGFzbSBieQotOy8vIHRoZSBtZWh0b2Qgb2YgdHdvIGxldmVscyBvZiBpbmRleGluZy4KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTE2eDE2Ci0gICAgRENEICBPTVhfVkNfMTZYMTZfVkVSVCwgT01YX1ZDXzE2WDE2X0hPUiAKLSAgICBEQ0QgIE9NWF9WQ18xNlgxNl9EQywgICBPTVhfVkNfMTZYMTZfUExBTkUKLSAgICAKLSAgICBJRiBBUk0xMTM2SlMKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBDb25zdGFudHMgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCi1CTEtfU0laRSAgICAgICAgRVFVIDB4MTAKLU1VTF9DT05TVDAgICAgICBFUVUgMHgwMTAxMDEwMQotTVVMX0NPTlNUMSAgICAgIEVRVSAweDAwMDYwMDA0Ci1NVUxfQ09OU1QyICAgICAgRVFVIDB4MDAwNzAwMDUKLU1VTF9DT05TVDMgICAgICBFUVUgMHgwMDAzMDAwMQotTUFTS19DT05TVCAgICAgIEVRVSAweDAwRkYwMEZGCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gU2NyYXRjaCB2YXJpYWJsZQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXkgICAgICAgICAgICAgICBSTiAxMiAgIAotcGMgICAgICAgICAgICAgIFJOIDE1ICAgCi0KLXJldHVybiAgICAgICAgICBSTiAwICAgIAotaW5uZXJDb3VudCAgICAgIFJOIDAgICAgCi1vdXRlckNvdW50ICAgICAgUk4gMSAgICAKLXBTcmNMZWZ0MiAgICAgICBSTiAxICAgIAotcERzdDIgICAgICAgICAgIFJOIDIgICAgCi1zdW0gICAgICAgICAgICAgUk4gNiAgICAKLXBUYWJsZSAgICAgICAgICBSTiA5ICAgIAotdGVtcDEgICAgICAgICAgIFJOIDEwICAgCi10ZW1wMiAgICAgICAgICAgUk4gMTIgICAKLWNNdWwxICAgICAgICAgICBSTiAxMSAgIAotY011bDIgICAgICAgICAgIFJOIDEyICAgCi1jb3VudCAgICAgICAgICAgUk4gMTIgICAKLWRzdFN0ZXB4MiAgICAgICBSTiAxMSAgIAotbGVmdFN0ZXB4MiAgICAgIFJOIDE0ICAgCi1yMHgwMTAxMDEwMSAgICAgUk4gMTAgICAKLXIweDAwRkYwMEZGICAgICBSTiAxMQotCi10VmFsMCAgICAgICAgICAgUk4gMCAgICAKLXRWYWwxICAgICAgICAgICBSTiAxICAgIAotdFZhbDIgICAgICAgICAgIFJOIDIgICAgCi10VmFsMyAgICAgICAgICAgUk4gMyAgICAKLXRWYWw0ICAgICAgICAgICBSTiA0ICAgIAotdFZhbDUgICAgICAgICAgIFJOIDUgICAgCi10VmFsNiAgICAgICAgICAgUk4gNiAgICAKLXRWYWw3ICAgICAgICAgICBSTiA3ICAgIAotdFZhbDggICAgICAgICAgIFJOIDggICAgCi10VmFsOSAgICAgICAgICAgUk4gOSAgICAKLXRWYWwxMCAgICAgICAgICBSTiAxMCAgIAotdFZhbDExICAgICAgICAgIFJOIDExICAgCi10VmFsMTIgICAgICAgICAgUk4gMTIgICAKLXRWYWwxNCAgICAgICAgICBSTiAxNCAgIAotCi1iICAgICAgICAgICAgICAgUk4gMTIgICAKLWMgICAgICAgICAgICAgICBSTiAxNCAgIAotCi1wMnAwICAgICAgICAgICAgUk4gMCAgICAKLXAzcDEgICAgICAgICAgICBSTiAxICAgIAotcDZwNCAgICAgICAgICAgIFJOIDIgICAgCi1wN3A1ICAgICAgICAgICAgUk4gNCAgICAKLXAxMHA4ICAgICAgICAgICBSTiA2ICAgIAotcDExcDkgICAgICAgICAgIFJOIDcgICAgCi1wMTRwMTIgICAgICAgICAgUk4gOCAgICAKLXAxNXAxMyAgICAgICAgICBSTiA5ICAgIAotCi1wMzIxMCAgICAgICAgICAgUk4gMTAgICAKLXA3NjU0ICAgICAgICAgICBSTiAxMCAgIAotcDExMTA5OCAgICAgICAgIFJOIDEwICAgCi1wMTUxNDEzMTIgICAgICAgUk4gMTAgICAKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBTcmNMZWZ0ICAgICAgICBSTiAwICAgIDsvLyBpbnB1dCBwb2ludGVyCi1wU3JjQWJvdmUgICAgICAgUk4gMSAgICA7Ly8gaW5wdXQgcG9pbnRlcgotcFNyY0Fib3ZlTGVmdCAgIFJOIDIgICAgOy8vIGlucHV0IHBvaW50ZXIKLXBEc3QgICAgICAgICAgICBSTiAzICAgIDsvLyBvdXRwdXQgcG9pbnRlcgotbGVmdFN0ZXAgICAgICAgIFJOIDQgICAgOy8vIGlucHV0IHZhcmlhYmxlCi1kc3RTdGVwICAgICAgICAgUk4gNSAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLXByZWRNb2RlICAgICAgICBSTiA2ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotYXZhaWxhYmlsaXR5ICAgIFJOIDcgICAgOy8vIGlucHV0IHZhcmlhYmxlCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgc3RhcnRzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LCByMTEKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCi0gICAgICAgIE1fQVJHICAgIExlZnRTdGVwLCAgICAgNAotICAgICAgICBNX0FSRyAgICBEc3RTdGVwLCAgICAgIDQKLSAgICAgICAgTV9BUkcgICAgUHJlZE1vZGUsICAgICA0Ci0gICAgICAgIE1fQVJHICAgIEF2YWlsYWJpbGl0eSwgNAotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgIHBUYWJsZSw9YXJtVkNNNFAxMF9wSW5kZXhUYWJsZTE2eDE2IDsvLyBMb2FkIGluZGV4IHRhYmxlIGZvciBzd2l0Y2ggY2FzZQotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKLSAgICAgICAgTV9MRFIgICAgcHJlZE1vZGUsIFByZWRNb2RlICAgICAgICAgICAgICAgICAgOy8vIEFyZyBwcmVkTW9kZSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCi0gICAgICAgIE1fTERSICAgIGxlZnRTdGVwLCBMZWZ0U3RlcCAgICAgICAgICAgICAgICAgIDsvLyBBcmcgbGVmdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAotICAgICAgICBNX0xEUiAgICBkc3RTdGVwLCAgRHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gQXJnIGRzdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnICAgICAgICAgCi0gICAgICAgIE1fTERSICAgIGF2YWlsYWJpbGl0eSwgQXZhaWxhYmlsaXR5ICAgICAgICAgIDsvLyBBcmcgYXZhaWxhYmlsaXR5IGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZwotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgeSwgI0JMS19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE91dGVyIExvb3AgQ291bnQKLSAgICAgICAgTERSICAgICAgcGMsIFtwVGFibGUsIHByZWRNb2RlLCBMU0wgIzJdICAgICAgOy8vIEJyYW5jaCB0byB0aGUgY2FzZSBiYXNlZCBvbiBwcmVNb2RlCi0gICAgICAgIAotT01YX1ZDXzE2WDE2X1ZFUlQKLSAgICAgICAgTERNICAgICAgcFNyY0Fib3ZlLCB7dFZhbDYsdFZhbDcsdFZhbDgsdFZhbDl9Oy8vIHRWYWwgNiB0byA5ID0gcFNyY0Fib3ZlWzAgdG8gMTVdCi0gICAgICAgIEFERCAgICAgIGRzdFN0ZXB4MiwgZHN0U3RlcCwgZHN0U3RlcCAgICAgICAgIDsvLyBkb3VibGUgZHN0U3RlcAotICAgICAgICBBREQgICAgICBwRHN0MiwgcERzdCwgZHN0U3RlcCAgICAgICAgICAgICAgICA7Ly8gcERzdDItIHBEc3QgYWR2YW5jZWQgYnkgZHN0U3RlcAotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTIgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdGFsbCBvdXRzaWRlIHRoZSBsb29wCi0KLUxPT1BfVkVSVAotICAgICAgICBTVE0gICAgICBwRHN0LCB7dFZhbDYsdFZhbDcsdFZhbDgsdFZhbDl9ICAgICA7Ly8gcERzdFswIHRvIDE1XSA9IHRWYWwgNiB0byA5Ci0gICAgICAgIFNVQlMgICAgIHksIHksICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB5LS0KLSAgICAgICAgQUREICAgICAgcERzdCwgcERzdCwgZHN0U3RlcHgyICAgICAgICAgICAgICAgOy8vIHBEc3QgYWR2YW5jZWQgYnkgZHN0U3RlcAotICAgICAgICBTVE0gICAgICBwRHN0Miwge3RWYWw2LHRWYWw3LHRWYWw4LHRWYWw5fSAgICA7Ly8gcERzdDJbMTYgdG8gMzFdID0gdFZhbCA2IHRvIDkKLSAgICAgICAgQUREICAgICAgcERzdDIsIHBEc3QyLCBkc3RTdGVweDIgICAgICAgICAgICAgOy8vIHBEc3QgYWR2YW5jZWQgYnkgZHN0U3RlcAotICAgICAgICBCTkUgICAgICBMT09QX1ZFUlQgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9vcCBmb3IgOCB0aW1lcwotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRVhJVAotCi0gICAgICAgIAotT01YX1ZDXzE2WDE2X0hPUgotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTYgCi0gICAgICAgICAgICAgICAKLSAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsID1NVUxfQ09OU1QwICAgICAgICAgICAgOy8vIENvbnN0IHRvIHJlcGVhdCB0aGUgYnl0ZSBpbiByZWcgNCB0aW1lcwotICAgICAgICBNT1YgICAgICB5LCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gT3V0ZXIgTG9vcCBDb3VudAotICAgICAgICBNX0xEUkIgICB0VmFsNiwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVwICAgICAgICA7Ly8gdFZhbDYgPSBwU3JjTGVmdFswIHRvIDNdCi0gICAgICAgIEFERCAgICAgIHBEc3QyLCBwRHN0LCBkc3RTdGVwICAgICAgICAgICAgICAgIDsvLyBwRHN0Mi0gcERzdCBhZHZhbmNlZCBieSBkc3RTdGVwCi0gICAgICAgIE1fTERSQiAgIHRWYWw3LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXAgICAgICAgIDsvLyB0VmFsMSA9IHBTcmNMZWZ0WzQgdG8gN10KLSAgICAgICAgQUREICAgICAgZHN0U3RlcHgyLCBkc3RTdGVwLCBkc3RTdGVwICAgICAgICAgOy8vIGRvdWJsZSBkc3RTdGVwCi0gICAgICAgIFNVQiAgICAgIGRzdFN0ZXB4MiwgZHN0U3RlcHgyLCAjMTIgICAgICAgICAgIDsvLyBkb3VibGUgZHN0U3RlcCAgbWludXMgMTIKLSAgICAgICAKLUxPT1BfSE9SICAgICAgICAKLSAgICAgICAgTV9MRFJCICAgdFZhbDgsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcCAgICAgICAgOy8vIHRWYWw4ID0gcFNyY0xlZnRbMCB0byAzXQotICAgICAgICBNVUwgICAgICB0VmFsNiwgdFZhbDYsIHIweDAxMDEwMTAxICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVwICAgICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFs0IHRvIDddCi0gICAgICAgIE1VTCAgICAgIHRWYWw3LCB0VmFsNywgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIFNVQlMgICAgIHksIHksICMxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB5LS0KLSAgICAgICAgU1RSICAgICAgdFZhbDYsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdFswIHRvIDNdIAotICAgICAgICBTVFIgICAgICB0VmFsNywgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0MlswIHRvIDNdCi0gICAgICAgIFNUUiAgICAgIHRWYWw2LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3RbNCB0byA3XQotICAgICAgICBTVFIgICAgICB0VmFsNywgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0Mls0IHRvIDddCi0gICAgICAgIE1VTCAgICAgIHRWYWw4LCB0VmFsOCwgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIFNUUiAgICAgIHRWYWw2LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3RbOCB0byAxMV0KLSAgICAgICAgU1RSICAgICAgdFZhbDcsIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbOCB0byAxMV0KLSAgICAgICAgTVVMICAgICAgdFZhbDksIHRWYWw5LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgTV9TVFIgICAgdFZhbDYsIFtwRHN0XSwgZHN0U3RlcHgyICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdFsxMiB0byAxNV0KLSAgICAgICAgTV9TVFIgICAgdFZhbDcsIFtwRHN0Ml0sIGRzdFN0ZXB4MiAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbMTIgdG8gMTVdCi0gICAgICAgIFNUUiAgICAgIHRWYWw4LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3RbMCB0byAzXSAKLSAgICAgICAgU1RSICAgICAgdFZhbDksIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbMCB0byAzXQotICAgICAgICBTVFIgICAgICB0VmFsOCwgW3BEc3RdLCAgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0WzQgdG8gN10KLSAgICAgICAgU1RSICAgICAgdFZhbDksIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbNCB0byA3XQotICAgICAgICBTVFIgICAgICB0VmFsOCwgW3BEc3RdLCAgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0WzggdG8gMTFdCi0gICAgICAgIFNUUiAgICAgIHRWYWw5LCBbcERzdDJdLCAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzggdG8gMTFdCi0gICAgICAgIE1fU1RSICAgIHRWYWw4LCBbcERzdF0sIGRzdFN0ZXB4MiAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3RbMTIgdG8gMTVdCi0gICAgICAgIE1fTERSQiAgIHRWYWw2LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXAgICAgICAgIDsvLyB0VmFsNiA9IHBTcmNMZWZ0WzAgdG8gM10KLSAgICAgICAgTV9TVFIgICAgdFZhbDksIFtwRHN0Ml0sIGRzdFN0ZXB4MiAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbMTIgdG8gMTVdCi0gICAgICAgIE1fTERSQiAgIHRWYWw3LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXAgICAgICAgIDsvLyB0VmFsNyA9IHBTcmNMZWZ0WzQgdG8gN10KLSAgICAgICAgQk5FICAgICAgTE9PUF9IT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvb3AgZm9yIDMgdGltZXMKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VYSVQKLSAgICAgICAgCi1PTVhfVkNfMTZYMTZfREMKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0yCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICBjb3VudCwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY291bnQgPSAwCi0gICAgICAgIFRTVCAgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19VUFBFUiAgICAgICAgIDsvLyBpZihhdmFpbGFiaWxpdHkgJiAjT01YX1ZDX1VQUEVSKQotICAgICAgICBCRVEgICAgICBUU1RfTEVGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSnVtcCB0byBMZWZ0IGlmIG5vdCB1cHBlcgotICAgICAgICBMRE0gICAgICBwU3JjQWJvdmUse3RWYWw4LHRWYWw5LHRWYWwxMCx0VmFsMTF9Oy8vIHRWYWwgOCB0byAxMSA9IHBTcmNBYm92ZVswIHRvIDE1XQotICAgICAgICBBREQgICAgICBjb3VudCwgY291bnQsICMxICAgICAgICAgICAgICAgICAgICA7Ly8gaWYgdXBwZXIgaW5jIGNvdW50IGJ5IDEKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0yCi0gICAgICAgIAotICAgICAgICBVWFRCMTYgICB0VmFsMiwgdFZhbDggICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdCi0gICAgICAgIFVYVEIxNiAgIHRWYWw2LCB0VmFsOSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNCwgNl0KLSAgICAgICAgVUFERDE2ICAgdFZhbDIsIHRWYWwyLCB0VmFsNiAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXSArIHBTcmNBYm92ZVs0LCA2XQotICAgICAgICBVWFRCMTYgICB0VmFsOCwgdFZhbDgsIFJPUiAjOCAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzEsIDNdCi0gICAgICAgIFVYVEIxNiAgIHRWYWw5LCB0VmFsOSwgUk9SICM4ICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNSwgN10KLSAgICAgICAgVUFERDE2ICAgdFZhbDgsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsxLCAzXSArIHBTcmNBYm92ZVs1LCA3XQotICAgICAgICBVQUREMTYgICB0VmFsMiwgdFZhbDIsIHRWYWw4ICAgICAgICAgICAgICAgICA7Ly8gc3VtKHBTcmNBYm92ZVswXSB0byBwU3JjQWJvdmVbN10pCi0gICAgICAgIAotICAgICAgICBVWFRCMTYgICB0VmFsOCwgdFZhbDEwICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzgsIDEwXQotICAgICAgICBVWFRCMTYgICB0VmFsOSwgdFZhbDExICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzEyLCAxNF0KLSAgICAgICAgVUFERDE2ICAgdFZhbDgsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs4LCAxMF0gKyBwU3JjQWJvdmVbMTIsIDE0XQotICAgICAgICBVWFRCMTYgICB0VmFsMTAsIHRWYWwxMCwgUk9SICM4ICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzksIDExXQotICAgICAgICBVWFRCMTYgICB0VmFsMTEsIHRWYWwxMSwgUk9SICM4ICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzEzLCAxNV0KLSAgICAgICAgVUFERDE2ICAgdFZhbDEwLCB0VmFsMTAsIHRWYWwxMSAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs5LCAxMV0gKyBwU3JjQWJvdmVbMTMsIDE1XQotICAgICAgICBVQUREMTYgICB0VmFsOCwgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gc3VtKHBTcmNBYm92ZVs4XSB0byBwU3JjQWJvdmVbMTVdKQotICAgICAgICAKLSAgICAgICAgVUFERDE2ICAgdFZhbDIsIHRWYWwyLCB0VmFsOCAgICAgICAgICAgICAgICAgOy8vIHN1bShwU3JjQWJvdmVbMF0gdG8gcFNyY0Fib3ZlWzE1XSkKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBBREQgICAgICB0VmFsMiwgdFZhbDIsIHRWYWwyLCBMU1IgIzE2ICAgICAgICA7Ly8gc3VtKHBTcmNBYm92ZVswXSB0byBwU3JjQWJvdmVbMTVdKQotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgCi0gICAgICAgIFVYVEggICAgIHN1bSwgdFZhbDIgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeHRyYWN0IHRoZSBsb3dlciBoYWxmIGZvciByZXN1bHQKLSAgICAgICAgCi1UU1RfTEVGVCAgICAgICAgCi0gICAgICAgIFRTVCAgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19MRUZUCi0gICAgICAgIEJFUSAgICAgIFRTVF9DT1VOVAotICAgICAgICBBREQgICAgICBsZWZ0U3RlcHgyLCBsZWZ0U3RlcCxsZWZ0U3RlcCAgICAgICA7Ly8gbGVmdFN0ZXB4MiA9IDIgKiBsZWZ0U3RlcAotICAgICAgICBBREQgICAgICBwU3JjTGVmdDIsIHBTcmNMZWZ0LCBsZWZ0U3RlcCAgICAgICA7Ly8gcFNyY0xlZnQyID0gcFNyY0xlZnQgKyBsZWZ0U3RlcAotICAgICAgICAKLSAgICAgICAgTV9MRFJCICAgdFZhbDgsIFtwU3JjTGVmdF0sICArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw4ID0gcFNyY0xlZnRbMF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDksIFtwU3JjTGVmdDJdLCArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw5ID0gcFNyY0xlZnRbMV0KLSAgICAgICAgTV9MRFJCICAgdFZhbDEwLCBbcFNyY0xlZnRdLCArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWwxMD0gcFNyY0xlZnRbMl0KLSAgICAgICAgTV9MRFJCICAgdFZhbDExLCBbcFNyY0xlZnQyXSwrbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWwxMT0gcFNyY0xlZnRbM10KLSAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gdFZhbDggKyB0VmFsOQotICAgICAgICBBREQgICAgICBjb3VudCwgY291bnQsICMxICAgICAgICAgICAgICAgICAgICA7Ly8gSW5jIENvdW50ZXIgaWYgTGVmdCBpcyBhdmFpbGFibGUKLSAgICAgICAgQUREICAgICAgdFZhbDYsIHRWYWwxMCwgdFZhbDExICAgICAgICAgICAgICAgOy8vIHRWYWw2ID0gdFZhbDEwICsgdFZhbDExCi0gICAgICAgIAotICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFswXQotICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFsxXQotICAgICAgICBNX0xEUkIgICB0VmFsMTAsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDEwPSBwU3JjTGVmdFsyXQotICAgICAgICBNX0xEUkIgICB0VmFsMTEsIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDExPSBwU3JjTGVmdFszXQotICAgICAgICBBREQgICAgICBzdW0sIHRWYWw3LCB0VmFsNiAgICAgICAgICAgICAgICAgICA7Ly8gc3VtID0gdFZhbDggKyB0VmFsMTAKLSAgICAgICAgQUREICAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gdFZhbDggKyB0VmFsOQotICAgICAgICBBREQgICAgICB0VmFsMTAsIHRWYWwxMCwgdFZhbDExICAgICAgICAgICAgICA7Ly8gdFZhbDEwPSB0VmFsMTAgKyB0VmFsMTEKLSAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw4LCB0VmFsMTAgICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gdFZhbDggKyB0VmFsMTAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFswXQotICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFsxXQotICAgICAgICBNX0xEUkIgICB0VmFsMTAsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDEwPSBwU3JjTGVmdFsyXQotICAgICAgICBNX0xEUkIgICB0VmFsMTEsIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDExPSBwU3JjTGVmdFszXQotICAgICAgICBBREQgICAgICBzdW0sIHN1bSwgdFZhbDcgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtID0gc3VtICsgdFZhbDcKLSAgICAgICAgQUREICAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gdFZhbDggKyB0VmFsOQotICAgICAgICBBREQgICAgICB0VmFsMTAsIHRWYWwxMCwgdFZhbDExICAgICAgICAgICAgICA7Ly8gdFZhbDEwPSB0VmFsMTAgKyB0VmFsMTEKLSAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw4LCB0VmFsMTAgICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gdFZhbDggKyB0VmFsMTAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFswXQotICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFsxXQotICAgICAgICBNX0xEUkIgICB0VmFsMTAsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDEwPSBwU3JjTGVmdFsyXQotICAgICAgICBNX0xEUkIgICB0VmFsMTEsIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDExPSBwU3JjTGVmdFszXQotICAgICAgICBBREQgICAgICBzdW0sIHN1bSwgdFZhbDcgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtID0gc3VtICsgdFZhbDcKLSAgICAgICAgQUREICAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gdFZhbDggKyB0VmFsOQotICAgICAgICBBREQgICAgICB0VmFsMTAsIHRWYWwxMCwgdFZhbDExICAgICAgICAgICAgICA7Ly8gdFZhbDEwPSB0VmFsMTAgKyB0VmFsMTEKLSAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw4LCB0VmFsMTAgICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gdFZhbDggKyB0VmFsMTAKLSAgICAgICAgQUREICAgICAgc3VtLCBzdW0sIHRWYWw3ICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSA9IHN1bSArIHRWYWw3Ci0KLVRTVF9DT1VOVCAgICAgICAgCi0gICAgICAgIENNUCAgICAgIGNvdW50LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpZihjb3VudCA9PSAwKQotICAgICAgICBNT1ZFUSAgICBzdW0sICMxMjggICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtID0gMTI4IGlmKGNvdW50ID09IDApCi0gICAgICAgIEJFUSAgICAgIFRTVF9DT1VOVDAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpZihjb3VudCA9PSAwKQotICAgICAgICBDTVAgICAgICBjb3VudCwgIzEgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gaWYoY291bnQgPT0gMSkKLSAgICAgICAgQURERVEgICAgc3VtLCBzdW0sICM4ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSArPSA4IGlmKGNvdW50ID09IDEpCi0gICAgICAgIEFERE5FICAgIHN1bSwgc3VtLCB0VmFsMiAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gPSBzdW1sZWZ0ICsgc3VtdXBwZXIKLSAgICAgICAgQURETkUgICAgc3VtLCBzdW0sICMxNiAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSArPSAxNiBpZihjb3VudCA9PSAyKQotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgCi0gICAgICAgIFVYVEggICAgIHN1bSwgc3VtICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gb25seSBieXRlIHJlc3QgY2xlYXJlZAotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgCi0gICAgICAgIExTUkVRICAgIHN1bSwgc3VtLCAjNCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gPj4gNCBpZihjb3VudCA9PSAxKQotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgCi0gICAgICAgIExTUk5FICAgIHN1bSwgc3VtLCAjNSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gPj4gNSBpZihjb3VudCA9PSAyKQotCi1UU1RfQ09VTlQwCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgT1JSICAgICAgc3VtLCBzdW0sIHN1bSwgTFNMICM4ICAgICAgICAgICAgICAgOy8vIHN1bSByZXBsaWNhdGVkIGluIHR3byBoYWxmd29yZAotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgCi0gICAgICAgIE9SUiAgICAgIHRWYWw2LCBzdW0sIHN1bSwgTFNMICMxNiAgICAgICAgICAgIDsvLyBzdW0gIHJlcGxpY2F0ZWQgaW4gYWxsIGJ5dGVzCi0gICAgICAgIENQWSAgICAgIHRWYWw3LCB0VmFsNiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMSA9IHRWYWwwCi0gICAgICAgIENQWSAgICAgIHRWYWw4LCB0VmFsNiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMiA9IHRWYWwwCi0gICAgICAgIENQWSAgICAgIHRWYWw5LCB0VmFsNiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMyA9IHRWYWwwCi0gICAgICAgIEFERCAgICAgIGRzdFN0ZXB4MiwgZHN0U3RlcCwgZHN0U3RlcCAgICAgICAgIDsvLyBkb3VibGUgZHN0U3RlcAotICAgICAgICBBREQgICAgICBwRHN0MiwgcERzdCwgZHN0U3RlcCAgICAgICAgICAgICAgICA7Ly8gcERzdDItIHBEc3QgYWR2YW5jZWQgYnkgZHN0U3RlcAotICAgICAgICBNT1YgICAgICB5LCAjQkxLX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gT3V0ZXIgTG9vcCBDb3VudAotICAgICAgICAKLUxPT1BfREMgICAgICAgIAotICAgICAgICBTVE0gICAgICBwRHN0LCB7dFZhbDYsdFZhbDcsdFZhbDgsdFZhbDl9ICAgICA7Ly8gcERzdFswIHRvIDE1XSA9IHRWYWwgNiB0byA5Ci0gICAgICAgIFNVQlMgICAgIHksIHksICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB5LS0KLSAgICAgICAgQUREICAgICAgcERzdCwgcERzdCwgZHN0U3RlcHgyICAgICAgICAgICAgICAgOy8vIHBEc3QgYWR2YW5jZWQgYnkgZHN0U3RlcAotICAgICAgICBTVE0gICAgICBwRHN0Miwge3RWYWw2LHRWYWw3LHRWYWw4LHRWYWw5fSAgICA7Ly8gcERzdDJbMTYgdG8gMzFdID0gdFZhbCA2IHRvIDkKLSAgICAgICAgQUREICAgICAgcERzdDIsIHBEc3QyLCBkc3RTdGVweDIgICAgICAgICAgICAgOy8vIHBEc3QgYWR2YW5jZWQgYnkgZHN0U3RlcAotICAgICAgICBCTkUgICAgICBMT09QX0RDICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9vcCBmb3IgOCB0aW1lcwotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VYSVQKLQotT01YX1ZDXzE2WDE2X1BMQU5FCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MwotICAgICAgICBSU0IgICAgICB0VmFsMTQsIGxlZnRTdGVwLCBsZWZ0U3RlcCwgTFNMICM0ICA7Ly8gdFZhbDE0ID0gMTUqbGVmdFN0ZXAKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0yCi0gICAgICAgIExEUkIgICAgIHRWYWwxMCwgW3BTcmNMZWZ0LCAgdFZhbDE0XSAgICAgICAgIDsvLyB0VmFsMTAgPSBwU3JjTGVmdFsxNSpsZWZ0U3RlcF0KLSAgICAgICAgTERSQiAgICAgdFZhbDExLCBbcFNyY0Fib3ZlTGVmdF0gICAgICAgICAgICAgOy8vIHRWYWwxMSA9IHBTcmNBYm92ZUxlZnRbMF0KLSAgICAgICAgTERSQiAgICAgdFZhbDEyLCBbcFNyY0Fib3ZlLCAjMTVdCi0KLSAgICAgICAgQUREICAgICAgdFZhbDIsICB0VmFsMTIsICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWwyICA9IHBTcmNBYm92ZVsxNV0gKyBwU3JjTGVmdFsxNSpsZWZ0U3RlcF0KLSAgICAgICAgU1VCICAgICAgdFZhbDEwLCB0VmFsMTAsICB0VmFsMTEgICAgICAgICAgICAgOy8vIHRWYWwxMCA9IFYwID0gcFNyY0xlZnRbMTUqbGVmdFN0ZXBdIC0gcFNyY0Fib3ZlTGVmdFswXQotICAgICAgICBTVUIgICAgICB0VmFsMTEsIHRWYWwxMiwgIHRWYWwxMSAgICAgICAgICAgICA7Ly8gdFZhbDExID0gSDAgPSBwU3JjQWJvdmVbMTVdIC0gcFNyY0Fib3ZlTGVmdFswXQotICAgICAgICBNT1YgICAgICB0VmFsMiwgIHRWYWwyLCAgIExTTCAjNCAgICAgICAgICAgICA7Ly8gdFZhbDIgID0gYSA9IDE2ICogKHBTcmNBYm92ZVsxNV0gKyBwU3JjTGVmdFsxNSpsZWZ0U3RlcF0pCi0KLSAgICAgICAgTU9WICAgICB0VmFsMTEsIHRWYWwxMSwgTFNMICMzICAgICAgICAgICAgICA7Ly8gOCpbMTVdLVstMV0KLSAgICAgICAgTERSQiAgICB0VmFsNiwgW3BTcmNBYm92ZSwgIzBdCi0gICAgICAgIExEUkIgICAgdFZhbDcsIFtwU3JjQWJvdmUsICMxNF0KLSAgICAgICAgU1VCICAgICB0VmFsOCwgdFZhbDcsIHRWYWw2Ci0gICAgICAgIFJTQiAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOCwgTFNMICMzICAgICAgICAgOy8vIDcqWzE0XS1bMF0KLSAgICAgICAgQUREICAgICB0VmFsMTEsIHRWYWwxMSwgdFZhbDgKLSAgICAgICAgTERSQiAgICB0VmFsNiwgW3BTcmNBYm92ZSwgIzFdCi0gICAgICAgIExEUkIgICAgdFZhbDcsIFtwU3JjQWJvdmUsICMxM10KLSAgICAgICAgU1VCICAgICB0VmFsOCwgdFZhbDcsIHRWYWw2Ci0gICAgICAgIEFERCAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOAotICAgICAgICBBREQgICAgIHRWYWw4LCB0VmFsOCwgdFZhbDgsIExTTCAjMSAgICAgICAgIDsvLyA2KlsxM10tWzFdCi0gICAgICAgIEFERCAgICAgdFZhbDExLCB0VmFsMTEsIHRWYWw4Ci0gICAgICAgIExEUkIgICAgdFZhbDYsIFtwU3JjQWJvdmUsICMyXQotICAgICAgICBMRFJCICAgIHRWYWw3LCBbcFNyY0Fib3ZlLCAjMTJdCi0gICAgICAgIFNVQiAgICAgdFZhbDgsIHRWYWw3LCB0VmFsNgotICAgICAgICBBREQgICAgIHRWYWw4LCB0VmFsOCwgdFZhbDgsIExTTCAjMiAgICAgICAgIDsvLyA1KlsxMl0tWzJdCi0gICAgICAgIEFERCAgICAgdFZhbDExLCB0VmFsMTEsIHRWYWw4Ci0gICAgICAgIExEUkIgICAgdFZhbDYsIFtwU3JjQWJvdmUsICMzXQotICAgICAgICBMRFJCICAgIHRWYWw3LCBbcFNyY0Fib3ZlLCAjMTFdCi0gICAgICAgIFNVQiAgICAgdFZhbDgsIHRWYWw3LCB0VmFsNgotICAgICAgICBBREQgICAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOCwgTFNMICMyICAgICAgIDsvLyArIDQqWzExXS1bM10KLSAgICAgICAgTERSQiAgICB0VmFsNiwgW3BTcmNBYm92ZSwgIzRdCi0gICAgICAgIExEUkIgICAgdFZhbDcsIFtwU3JjQWJvdmUsICMxMF0KLSAgICAgICAgU1VCICAgICB0VmFsOCwgdFZhbDcsIHRWYWw2Ci0gICAgICAgIEFERCAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOCwgTFNMICMxICAgICAgICAgOy8vIDMqWzEwXS1bNF0KLSAgICAgICAgQUREICAgICB0VmFsMTEsIHRWYWwxMSwgdFZhbDgKLSAgICAgICAgTERSQiAgICB0VmFsNiwgW3BTcmNBYm92ZSwgIzVdCi0gICAgICAgIExEUkIgICAgdFZhbDcsIFtwU3JjQWJvdmUsICM5XQotICAgICAgICBTVUIgICAgIHRWYWw4LCB0VmFsNywgdFZhbDYKLSAgICAgICAgQUREICAgICB0VmFsMTEsIHRWYWwxMSwgdFZhbDgsIExTTCAjMSAgICAgICA7Ly8gKyAyKls5XS1bNV0KLSAgICAgICAgTERSQiAgICB0VmFsNiwgW3BTcmNBYm92ZSwgIzZdCi0gICAgICAgIExEUkIgICAgdFZhbDcsIFtwU3JjQWJvdmUsICM4XQotICAgICAgICBTVUIgICAgIHRWYWw4LCB0VmFsNywgdFZhbDYgICAgICAgICAgICAgICAgIDsvLyAxKls4XS1bNl0KLSAgICAgICAgQUREICAgICB0VmFsNywgdFZhbDExLCB0VmFsOAotCi0gICAgICAgIEFERCAgICAgIHRWYWwyLCAgdFZhbDIsICAgIzE2ICAgICAgICAgICAgICAgIDsvLyB0VmFsMiAgPSBhICsgMTYKLSAgICAgICAgTU9WICAgICAgdFZhbDEsICBwU3JjTGVmdCAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw0ICA9IHBTcmNMZWZ0Ci0gICAgICAgIFNVQiAgICAgIHRWYWw5LCAgdFZhbDE0LCAgIGxlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsOSAgPSAxNCpsZWZ0U3RlcAotICAgICAgICBBREQgICAgICB0VmFsOSwgIHBTcmNMZWZ0LCB0VmFsOSAgICAgICAgICAgICA7Ly8gdFZhbDkgID0gcFNyY0xlZnQgKyAxNCpsZWZ0U3RlcAotICAgICAgICAKLSAgICAgICAgTV9MRFJCICAgdFZhbDgsICBbdFZhbDldLCAtbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWw4ICA9IHBTcmNMZWZ0WzE0KmxlZnRTdGVwXQotICAgICAgICBNX0xEUkIgICB0VmFsMTEsIFt0VmFsMV0sICtsZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDExID0gcFNyY0xlZnRbMF0KLSAgICAgICAgQUREICAgICAgdFZhbDcsICB0VmFsNywgIHRWYWw3LCAgTFNMICMyICAgICAgOy8vIHRWYWw3ICA9IDUgKiBICi0gICAgICAgIEFERCAgICAgIHRWYWw3LCAgdFZhbDcsICAjMzIgICAgICAgICAgICAgICAgIDsvLyB0VmFsNyAgPSA1ICogSCArIDMyCi0gICAgICAgIFNVQiAgICAgIHRWYWw4LCAgdFZhbDgsICB0VmFsMTEgICAgICAgICAgICAgIDsvLyB0VmFsOCAgPSBwU3JjTGVmdFsxNCpsZWZ0U3RlcF0gLSBwU3JjTGVmdFswXQotICAgICAgICBBU1IgICAgICB0VmFsMTIsIHRWYWw3LCAgIzYgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEyID0gYiA9ICg1ICogSCArIDMyKSA+PiA2Ci0gICAgICAgIAotICAgICAgICBSU0IgICAgICB0VmFsOCwgIHRWYWw4LCAgdFZhbDgsICBMU0wgIzMgICAgICA7Ly8gdFZhbDggID0gVjEgPSA3KiAocFNyY0xlZnRbMTQqbGVmdFN0ZXBdLXBTcmNMZWZ0WzBdKQotICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw4LCAgdFZhbDEwLCBMU0wgIzMgICAgICA7Ly8gdFZhbDYgID0gViA9IFYwICtWMQotICAgICAgICBNX0xEUkIgICB0VmFsOCwgIFt0VmFsOV0sIC1sZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDggID0gcFNyY0xlZnRbMTMqbGVmdFN0ZXBdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3RWYWwxXSwgK2xlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsMTAgPSBwU3JjTGVmdFtsZWZ0U3RlcF0KLSAgICAgICAgUlNCICAgICAgdFZhbDcsICB0VmFsMTIsICB0VmFsMTIsICBMU0wgIzMgICAgOy8vIHRWYWw3ICA9IDcqYgotICAgICAgICBTVUIgICAgICB0VmFsMiwgIHRWYWwyLCAgIHRWYWw3ICAgICAgICAgICAgICA7Ly8gdFZhbDIgID0gYSArIDE2IC0gNypiCi0gICAgICAgIFNVQiAgICAgIHRWYWw3LCAgdFZhbDgsICAgdFZhbDEwICAgICAgICAgICAgIDsvLyB0VmFsNyAgPSBwU3JjTGVmdFsxMypsZWZ0U3RlcF0gLSBwU3JjTGVmdFtsZWZ0U3RlcF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDgsICBbdFZhbDldLCAtbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWw4ICA9IHBTcmNMZWZ0WzEyKmxTXQotICAgICAgICBBREQgICAgICB0VmFsNywgIHRWYWw3LCAgIHRWYWw3ICAgICAgICAgICAgICA7Ly8gdFZhbDcgID0gMiAqIChwU3JjTGVmdFsxMypsZWZ0U3RlcF0gLSBwU3JjTGVmdFtsZWZ0U3RlcF0pCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3RWYWwxXSwgK2xlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsMTAgPSBwU3JjTGVmdFsyKmxlZnRTdGVwXSAgICAgICAgCi0gICAgICAgIEFERCAgICAgIHRWYWw3LCAgdFZhbDcsICAgdFZhbDcsICBMU0wgIzEgICAgIDsvLyB0VmFsNyAgPSA2ICogKHBTcmNMZWZ0WzEzKmxlZnRTdGVwXSAtIHBTcmNMZWZ0W2xlZnRTdGVwXSkKLSAgICAgICAgQUREICAgICAgdFZhbDYsICB0VmFsNiwgICB0VmFsNyAgICAgICAgICAgICAgOy8vIHRWYWw2ICA9IFYgPSBWICsgVjIKLSAgICAgICAgU1VCICAgICAgdFZhbDcsICB0VmFsOCwgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWw3ICA9IHBTcmNMZWZ0WzEyKmxlZnRTdGVwXSAtIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCi0gICAgICAgIE1fTERSQiAgIHRWYWw4LCAgW3RWYWw5XSwgLWxlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsOCAgPSBwU3JjTGVmdFsxMSpsZWZ0U3RlcF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDEwLCBbdFZhbDFdLCArbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWwxMCA9IHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCi0gICAgICAgIEFERCAgICAgIHRWYWw3LCAgdFZhbDcsICAgdFZhbDcsICBMU0wgIzIgICAgIDsvLyB0VmFsNyAgPSA1ICogKHBTcmNMZWZ0WzEyKmxlZnRTdGVwXSAtIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdKQotICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgIHRWYWw3ICAgICAgICAgICAgICA7Ly8gdFZhbDYgID0gViA9IFYgKyBWMwotICAgICAgICBTVUIgICAgICB0VmFsNywgIHRWYWw4LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDcgID0gcFNyY0xlZnRbMTEqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbMypsZWZ0U3RlcF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDgsICBbdFZhbDldLCAtbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWw4ICA9IHBTcmNMZWZ0WzEwKmxlZnRTdGVwXQotICAgICAgICBNX0xEUkIgICB0VmFsMTAsIFt0VmFsMV0sICtsZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDEwID0gcFNyY0xlZnRbNCpsZWZ0U3RlcF0KLSAgICAgICAgQUREICAgICAgdFZhbDYsICB0VmFsNiwgICB0VmFsNywgIExTTCAjMiAgICAgOy8vIHRWYWw2ICA9IFYgPSBWICsgVjQKLSAgICAgICAgU1VCICAgICAgZHN0U3RlcCwgZHN0U3RlcCwgIzE2ICAgICAgICAgICAgICAgOy8vIHRWYWw1ICA9IGRzdFN0ZXAgLSAxNgotICAgICAgICBTVUIgICAgICB0VmFsNywgIHRWYWw4LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDcgID0gcFNyY0xlZnRbMTAqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbNCpsZWZ0U3RlcF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDgsICBbdFZhbDldLCAtbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWw4ICA9IHBTcmNMZWZ0WzkqbGVmdFN0ZXBdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3RWYWwxXSwgK2xlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsMTAgPSBwU3JjTGVmdFs1KmxlZnRTdGVwXQotICAgICAgICBBREQgICAgICB0VmFsNywgIHRWYWw3LCAgIHRWYWw3LCAgTFNMICMxICAgICA7Ly8gdFZhbDcgID0gMyAqIChwU3JjTGVmdFsxMCpsZWZ0U3RlcF0gLSBwU3JjTGVmdFs0KmxlZnRTdGVwXSkKLSAgICAgICAgQUREICAgICAgdFZhbDYsICB0VmFsNiwgICB0VmFsNyAgICAgICAgICAgICAgOy8vIHRWYWw2ICA9IFYgPSBWICsgVjUKLSAgICAgICAgU1VCICAgICAgdFZhbDcsICB0VmFsOCwgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWw3ICA9IHBTcmNMZWZ0WzkqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbNSpsZWZ0U3RlcF0KLSAgICAgICAgTV9MRFJCICAgdFZhbDgsICBbdFZhbDldLCAtbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWw4ICA9IHBTcmNMZWZ0WzgqbGVmdFN0ZXBdCi0gICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3RWYWwxXSwgK2xlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsMTAgPSBwU3JjTGVmdFs2KmxlZnRTdGVwXQotICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgIHRWYWw3LCAgTFNMICMxICAgICA7Ly8gdFZhbDYgID0gViA9IFYgKyBWNgotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgU1VCICAgICAgdFZhbDcsICB0VmFsOCwgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWw3ICA9IHBTcmNMZWZ0WzgqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbNipsZWZ0U3RlcF0KLSAgICAgICAgQUREICAgICAgdFZhbDYsICB0VmFsNiwgICB0VmFsNyAgICAgICAgICAgICAgOy8vIHRWYWw2ICA9IFYgPSBWICsgVjcKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIEFERCAgICAgIHRWYWw2LCAgdFZhbDYsICAgdFZhbDYsICBMU0wgIzIgICAgIDsvLyB0VmFsNiAgPSA1KlYKLSAgICAgICAgQUREICAgICAgdFZhbDYsICB0VmFsNiwgICAjMzIgICAgICAgICAgICAgICAgOy8vIHRWYWw2ICA9IDUqViArIDMyCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICBBU1IgICAgICB0VmFsMTQsIHRWYWw2LCAgICM2ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDE0ID0gYyA9ICg1KlYgKyAzMik+PjYKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIFJTQiAgICAgIHRWYWw2LCAgdFZhbDE0LCAgdFZhbDE0LCBMU0wgIzMgICAgIDsvLyB0VmFsNiAgPSA3KmMKLSAgICAgICAgVVhUSCAgICAgdFZhbDE0LCB0VmFsMTQgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxNCA9IENsZWFyZWQgdGhlIHVwcGVyIGhhbGYgd29yZAotICAgICAgICBBREQgICAgICB0VmFsMTAsIHRWYWwxMiwgIHRWYWwxMiAgICAgICAgICAgICA7Ly8gdFZhbDEwID0gMipiCi0gICAgICAgIE9SUiAgICAgIHRWYWwxNCwgdFZhbDE0LCAgdFZhbDE0LCBMU0wgIzE2ICAgIDsvLyB0VmFsMTQgPSB7YyAgLCAgY30KLSAgICAgICAgU1VCICAgICAgdFZhbDYsICB0VmFsMiwgICB0VmFsNiAgICAgICAgICAgICAgOy8vIHRWYWw2ICA9IGQgPSBhIC0gNypiIC0gNypjICsgMTYKLSAgICAgICAgQUREICAgICAgdFZhbDEsICB0VmFsNiwgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWwxICA9IHBwMiA9IGQgKyAyKmIKLSAgICAgICAgQUREICAgICAgdFZhbDEwLCB0VmFsMTAsICB0VmFsMTIgICAgICAgICAgICAgOy8vIHRWYWwxMCA9MypiCi0gICAgICAgIE9SUiAgICAgIHRWYWwwLCAgdFZhbDYsICAgdFZhbDEsICBMU0wgIzE2ICAgIDsvLyB0dmFsMCAgPSBwMnAwICAgPSBwYWNrIHtwMiwgcDB9Ci0gICAgICAgIFVYVEggICAgIHRWYWwxMiwgdFZhbDEyICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTIgPSBDbGVhcmVkIHRoZSB1cHBlciBoYWxmIHdvcmQKLSAgICAgICAgVVhUSCAgICAgdFZhbDEwLCB0VmFsMTAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxMiA9IENsZWFyZWQgdGhlIHVwcGVyIGhhbGYgd29yZAotICAgICAgICBPUlIgICAgICB0VmFsMTIsIHRWYWwxMiwgIHRWYWwxMiwgTFNMICMxNiAgICA7Ly8gdFZhbDEyID0ge2IgICwgIGJ9Ci0gICAgICAgIE9SUiAgICAgIHRWYWwxMCwgdFZhbDEwLCAgdFZhbDEwLCBMU0wgIzE2ICAgIDsvLyB0VmFsMTAgPSB7M2IgLCAzYn0KLSAgICAgICAgU0FERDE2ICAgdFZhbDEsICB0VmFsMCwgICB0VmFsMTIgICAgICAgICAgICAgOy8vIHRWYWwxICA9IHAzcDEgICA9IHAycDAgICArIHtiLGJ9Ci0gICAgICAgIFNBREQxNiAgIHRWYWwyLCAgdFZhbDEsICAgdFZhbDEwICAgICAgICAgICAgIDsvLyB0VmFsMiAgPSBwNnA0ICAgPSBwM3AxICAgKyB7M2IsM2J9Ci0gICAgICAgIFNBREQxNiAgIHRWYWw0LCAgdFZhbDIsICAgdFZhbDEyICAgICAgICAgICAgIDsvLyB0VmFsNCAgPSBwN3A1ICAgPSBwNnA0ICAgKyB7YixifQotICAgICAgICBTQUREMTYgICB0VmFsNiwgIHRWYWw0LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDYgID0gcDEwcDggID0gcDdwNSAgICsgezNiLDNifQotICAgICAgICBTQUREMTYgICB0VmFsNywgIHRWYWw2LCAgIHRWYWwxMiAgICAgICAgICAgICA7Ly8gdFZhbDcgID0gcDExcDkgID0gcDEwcDggICsge2IsYn0KLSAgICAgICAgU0FERDE2ICAgdFZhbDgsICB0VmFsNywgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWw4ICA9IHAxNHAxMiA9IHAxMXA5ICArIHszYiwzYn0KLSAgICAgICAgU0FERDE2ICAgdFZhbDksICB0VmFsOCwgICB0VmFsMTIgICAgICAgICAgICAgOy8vIHRWYWw5ICA9IHAxNXAxMyA9IHAxNHAxMiArIHtiLGJ9Ci0gICAgICAgIExEUiAgICAgIHIweDAwRkYwMEZGLCAgICAgPU1BU0tfQ09OU1QgICAgICAgIDsvLyByMHgwMEZGMDBGRiA9IDB4MDBGRjAwRkYKLSAgICAgICAgCi1MT09QX1BMQU5FICAgICAgICAKLQotICAgICAgICBVU0FUMTYgICB0ZW1wMiwgIzEzLCBwM3AxCi0gICAgICAgIFVTQVQxNiAgIHRlbXAxLCAjMTMsIHAycDAKLSAgICAgICAgU0FERDE2ICAgcDNwMSwgICBwM3AxLCAgIGMgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBTQUREMTYgICBwMnAwLCAgIHAycDAsICAgYyAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEFORCAgICAgIHRlbXAyLCByMHgwMEZGMDBGRiwgdGVtcDIsIEFTUiAjNQotICAgICAgICBBTkQgICAgICB0ZW1wMSwgcjB4MDBGRjAwRkYsIHRlbXAxLCBBU1IgIzUKLSAgICAgICAgT1JSICAgICAgdGVtcDEsIHRlbXAxLCB0ZW1wMiwgTFNMICM4Ci0gICAgICAgIFNUUiAgICAgIHRlbXAxLCBbcERzdF0sICM0Ci0gICAgICAgIAotICAgICAgICBVU0FUMTYgICB0ZW1wMiwgIzEzLCBwN3A1Ci0gICAgICAgIFVTQVQxNiAgIHRlbXAxLCAjMTMsIHA2cDQKLSAgICAgICAgU0FERDE2ICAgcDdwNSwgICBwN3A1LCAgIGMgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBTQUREMTYgICBwNnA0LCAgIHA2cDQsICAgYyAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEFORCAgICAgIHRlbXAyLCByMHgwMEZGMDBGRiwgdGVtcDIsIEFTUiAjNQotICAgICAgICBBTkQgICAgICB0ZW1wMSwgcjB4MDBGRjAwRkYsIHRlbXAxLCBBU1IgIzUKLSAgICAgICAgT1JSICAgICAgdGVtcDEsIHRlbXAxLCB0ZW1wMiwgTFNMICM4Ci0gICAgICAgIFNUUiAgICAgIHRlbXAxLCBbcERzdF0sICM0Ci0gICAgICAgIAotICAgICAgICBVU0FUMTYgICB0ZW1wMiwgIzEzLCBwMTFwOQotICAgICAgICBVU0FUMTYgICB0ZW1wMSwgIzEzLCBwMTBwOAotICAgICAgICBTQUREMTYgICBwMTFwOSwgIHAxMXA5LCAgYyAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFNBREQxNiAgIHAxMHA4LCAgcDEwcDgsICBjICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgdGVtcDIsIHIweDAwRkYwMEZGLCB0ZW1wMiwgQVNSICM1Ci0gICAgICAgIEFORCAgICAgIHRlbXAxLCByMHgwMEZGMDBGRiwgdGVtcDEsIEFTUiAjNQotICAgICAgICBPUlIgICAgICB0ZW1wMSwgdGVtcDEsIHRlbXAyLCBMU0wgIzgKLSAgICAgICAgU1RSICAgICAgdGVtcDEsIFtwRHN0XSwgIzQKLSAgICAgICAgCi0gICAgICAgIFVTQVQxNiAgIHRlbXAyLCAjMTMsIHAxNXAxMwotICAgICAgICBVU0FUMTYgICB0ZW1wMSwgIzEzLCBwMTRwMTIKLSAgICAgICAgU0FERDE2ICAgcDE1cDEzLCBwMTVwMTMsIGMgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBTQUREMTYgICBwMTRwMTIsIHAxNHAxMiwgYyAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEFORCAgICAgIHRlbXAyLCByMHgwMEZGMDBGRiwgdGVtcDIsIEFTUiAjNQotICAgICAgICBBTkQgICAgICB0ZW1wMSwgcjB4MDBGRjAwRkYsIHRlbXAxLCBBU1IgIzUKLSAgICAgICAgT1JSICAgICAgdGVtcDEsIHRlbXAxLCB0ZW1wMiwgTFNMICM4Ci0gICAgICAgIFNUUiAgICAgIHRlbXAxLCBbcERzdF0sICM0Ci0gICAgICAgIAotICAgICAgICBBRERTICAgICByMHgwMEZGMDBGRiwgcjB4MDBGRjAwRkYsICMxPDwyOCAgICAgOy8vIExvb3AgY291bnRlciB2YWx1ZSBpbiB0b3AgNCBiaXRzCi0gICAgICAgIAotICAgICAgICBBREQgICAgICBwRHN0LCBwRHN0LCBkc3RTdGVwICAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgQkNDICAgICAgTE9PUF9QTEFORSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb29wIGZvciAxNiB0aW1lcwotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRU5ECi0gICAgICAgIAotICAgICAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTCi0KLSAgICAgICAgICAgIAotICAgICAgICBFTkQKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiBlbmRzCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEyMTM5Zi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ODEgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIAotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotOy8vIERlZmluZSB0aGUgcHJvY2Vzc29yIHZhcmlhbnRzIHN1cHBvcnRlZCBieSB0aGlzIGZpbGUKLSAgICAgICAgIAotICAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLSAgICAgICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBmb3IgaW1wbGVtZW50aW5nIHN3aXRjaCBjYXNlIG9mIEMgaW4gYXNtIGJ5Ci07Ly8gdGhlIG1laHRvZCBvZiB0d28gbGV2ZWxzIG9mIGluZGV4aW5nLgotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgTV9UQUJMRSBhcm1WQ000UDEwX3BTd2l0Y2hUYWJsZTR4NAotICAgIERDRCAgT01YX1ZDXzR4NF9WRVJULCAgICAgT01YX1ZDXzR4NF9IT1IgCi0gICAgRENEICBPTVhfVkNfNHg0X0RDLCAgICAgICBPTVhfVkNfNHg0X0RJQUdfREwKLSAgICBEQ0QgIE9NWF9WQ180eDRfRElBR19EUiwgIE9NWF9WQ180eDRfVlIKLSAgICBEQ0QgIE9NWF9WQ180eDRfSEQsICAgICAgIE9NWF9WQ180eDRfVkwKLSAgICBEQ0QgIE9NWF9WQ180eDRfSFUgICAKLSAgICAKLSAgICBJRiBBUk0xMTM2SlMKLSAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIENvbnN0YW50cwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIAotQkxLX1NJWkUgICAgICAgICAgICAgIEVRVSAweDgKLU1VTF9DT05TVDAgICAgICAgICAgICBFUVUgMHgwMTAxMDEwMQotQUREX0NPTlNUMSAgICAgICAgICAgIEVRVSAweDgwODA4MDgwCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gU2NyYXRjaCB2YXJpYWJsZQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXJldHVybiAgICAgICAgICBSTiAwCi1wVGFibGUgICAgICAgICAgUk4gOQotcGMgICAgICAgICAgICAgIFJOIDE1Ci1yMHgwMTAxMDEwMSAgICAgUk4gMQotcjB4ODA4MDgwODAgICAgIFJOIDAKLQotdFZhbDAgICAgICAgICAgIFJOIDAKLXRWYWwxICAgICAgICAgICBSTiAxCi10VmFsMiAgICAgICAgICAgUk4gMgotdFZhbDQgICAgICAgICAgIFJOIDQKLXRWYWw2ICAgICAgICAgICBSTiA2Ci10VmFsNyAgICAgICAgICAgUk4gNwotdFZhbDggICAgICAgICAgIFJOIDgKLXRWYWw5ICAgICAgICAgICBSTiA5Ci10VmFsMTAgICAgICAgICAgUk4gMTAKLXRWYWwxMSAgICAgICAgICBSTiAxMQotdFZhbDEyICAgICAgICAgIFJOIDEyCi10VmFsMTQgICAgICAgICAgUk4gMTQKLQotT3V0MCAgICAgICAgICAgIFJOIDYKLU91dDEgICAgICAgICAgICBSTiA3Ci1PdXQyICAgICAgICAgICAgUk4gOAotT3V0MyAgICAgICAgICAgIFJOIDkKLQotTGVmdDAgICAgICAgICAgIFJOIDYKLUxlZnQxICAgICAgICAgICBSTiA3Ci1MZWZ0MiAgICAgICAgICAgUk4gOAotTGVmdDMgICAgICAgICAgIFJOIDkKLQotQWJvdmUwMTIzICAgICAgIFJOIDEyCi1BYm92ZTQ1NjcgICAgICAgUk4gMTQKLQotQWJvdmVMZWZ0ICAgICAgIFJOIDEwCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wU3JjTGVmdCAgICAgICAgUk4gMCAgICA7Ly8gaW5wdXQgcG9pbnRlcgotcFNyY0Fib3ZlICAgICAgIFJOIDEgICAgOy8vIGlucHV0IHBvaW50ZXIKLXBTcmNBYm92ZUxlZnQgICBSTiAyICAgIDsvLyBpbnB1dCBwb2ludGVyCi1wRHN0ICAgICAgICAgICAgUk4gMyAgICA7Ly8gb3V0cHV0IHBvaW50ZXIKLWxlZnRTdGVwICAgICAgICBSTiA0ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotZHN0U3RlcCAgICAgICAgIFJOIDUgICAgOy8vIGlucHV0IHZhcmlhYmxlCi1wcmVkTW9kZSAgICAgICAgUk4gNiAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLWF2YWlsYWJpbGl0eSAgICBSTiA3ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCBzdGFydHMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0LCByMTEKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCi0gICAgICAgIE1fQVJHICAgIExlZnRTdGVwLCAgICAgNAotICAgICAgICBNX0FSRyAgICBEc3RTdGVwLCAgICAgIDQKLSAgICAgICAgTV9BUkcgICAgUHJlZE1vZGUsICAgICA0Ci0gICAgICAgIE1fQVJHICAgIEF2YWlsYWJpbGl0eSwgNAotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgIHBUYWJsZSw9YXJtVkNNNFAxMF9wU3dpdGNoVGFibGU0eDQgIDsvLyBMb2FkIGluZGV4IHRhYmxlIGZvciBzd2l0Y2ggY2FzZQotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKLSAgICAgICAgTV9MRFIgICAgcHJlZE1vZGUsIFByZWRNb2RlICAgICAgICAgICAgICAgICAgOy8vIEFyZyBwcmVkTW9kZSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCi0gICAgICAgIE1fTERSICAgIGxlZnRTdGVwLCBMZWZ0U3RlcCAgICAgICAgICAgICAgICAgIDsvLyBBcmcgbGVmdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAotICAgICAgICBNX0xEUiAgICBkc3RTdGVwLCAgRHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gQXJnIGRzdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnICAgICAgICAgCi0gICAgICAgIE1fTERSICAgIGF2YWlsYWJpbGl0eSwgQXZhaWxhYmlsaXR5ICAgICAgICAgIDsvLyBBcmcgYXZhaWxhYmlsaXR5IGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgIHBjLCBbcFRhYmxlLCBwcmVkTW9kZSwgTFNMICMyXSAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGNhc2UgYmFzZWQgb24gcHJlTW9kZQotCi1PTVhfVkNfNHg0X1ZFUlQKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgIEFib3ZlMDEyMywgIFtwU3JjQWJvdmVdICAgICAgICAgICAgIDsvLyBBYm92ZTAxMjMgPSBwU3JjQWJvdmVbMCB0byAzXQotICAgICAgICBNX1NUUiAgICBBYm92ZTAxMjMsICBbcERzdF0sICBkc3RTdGVwICAgICAgICA7Ly8gcERzdFswICB0byAzXSAgPSBBYm92ZTAxMjMKLSAgICAgICAgTV9TVFIgICAgQWJvdmUwMTIzLCAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgOy8vIHBEc3RbNCAgdG8gN10gID0gQWJvdmUwMTIzCi0gICAgICAgIE1fU1RSICAgIEFib3ZlMDEyMywgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgIDsvLyBwRHN0WzggIHRvIDExXSA9IEFib3ZlMDEyMwotICAgICAgICBTVFIgICAgICBBYm92ZTAxMjMsICBbcERzdF0gICAgICAgICAgICAgICAgICA7Ly8gcERzdFsxMiB0byAxNV0gPSBBYm92ZTAxMjMKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQotCi1PTVhfVkNfNHg0X0hPUgotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTYgCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgID1NVUxfQ09OU1QwICAgICAgICAgICA7Ly8gQ29uc3QgdG8gcmVwZWF0IHRoZSBieXRlIGluIHJlZyA0IHRpbWVzCi0gICAgICAgIE1fTERSQiAgIExlZnQwLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MCA9IHBTcmNMZWZ0WzBdCi0gICAgICAgIE1fTERSQiAgIExlZnQxLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MSA9IHBTcmNMZWZ0WzFdCi0gICAgICAgIE1fTERSQiAgIExlZnQyLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MiA9IHBTcmNMZWZ0WzJdCi0gICAgICAgIExEUkIgICAgIExlZnQzLCAgW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgIDsvLyBMZWZ0MyA9IHBTcmNMZWZ0WzNdCi0gICAgICAgIE1VTCAgICAgIE91dDAsICAgTGVmdDAsICAgcjB4MDEwMTAxMDEgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIE1VTCAgICAgIE91dDEsICAgTGVmdDEsICAgcjB4MDEwMTAxMDEgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIE1VTCAgICAgIE91dDIsICAgTGVmdDIsICAgcjB4MDEwMTAxMDEgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIE1VTCAgICAgIE91dDMsICAgTGVmdDMsICAgcjB4MDEwMTAxMDEgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbMCAgdG8gMyBdIAotICAgICAgICBNX1NUUiAgICBPdXQxLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDF9IGF0IHBEc3QgWzQgIHRvIDcgXQotICAgICAgICBNX1NUUiAgICBPdXQyLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDJ9IGF0IHBEc3QgWzggIHRvIDExXQotICAgICAgICBTVFIgICAgICBPdXQzLCAgIFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDN9IGF0IHBEc3QgWzEyIHRvIDE1XQotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQotICAgICAgICAKLU9NWF9WQ180eDRfREMKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz02Ci0gICAgICAgIAotICAgICAgICBBTkQgICAgICBhdmFpbGFiaWxpdHksICBhdmFpbGFiaWxpdHksICAjKE9NWF9WQ19VUFBFUiArIE9NWF9WQ19MRUZUKQotICAgICAgICBDTVAgICAgICBhdmFpbGFiaWxpdHksICAjKE9NWF9WQ19VUFBFUiArIE9NWF9WQ19MRUZUKQotICAgICAgICBCTkUgICAgICBVcHBlck9yTGVmdE9yTm9uZUF2YWlsYWJsZSAgICAgICAgICA7Ly8gSnVtcCB0byBVcHBlciBpZiBub3QgYm90aAotICAgICAgICBMRFIgICAgICBBYm92ZTAxMjMsICBbcFNyY0Fib3ZlXSAgICAgICAgICAgICA7Ly8gQWJvdmUwMTIzICA9IHBTcmNBYm92ZVswIHRvIDNdCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgVVhUQjE2ICAgdFZhbDcsICBBYm92ZTAxMjMgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXQotICAgICAgICBVWFRCMTYgICB0VmFsNiwgIEFib3ZlMDEyMywgIFJPUiAjOCAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzEsIDNdCi0gICAgICAgIFVBREQxNiAgIHRWYWwxMSwgdFZhbDYsICAgdFZhbDcgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0gKyBwU3JjQWJvdmVbMSwgM10KLSAgICAgICAgTV9MRFJCICAgTGVmdDAsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQwID0gcFNyY0xlZnRbMF0KLSAgICAgICAgTV9MRFJCICAgTGVmdDEsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQxID0gcFNyY0xlZnRbMV0KLSAgICAgICAgQUREICAgICAgdFZhbDExLCB0VmFsMTEsICBMU1IgIzE2ICAgICAgICAgICAgOy8vIHN1bShwU3JjQWJvdmVbMF0gdG8gcFNyY0Fib3ZlWzNdKQotICAgICAgICBNX0xEUkIgICBMZWZ0MiwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDIgPSBwU3JjTGVmdFsyXQotICAgICAgICBMRFJCICAgICBMZWZ0MywgIFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICA7Ly8gTGVmdDMgPSBwU3JjTGVmdFszXQotICAgICAgICBVWFRIICAgICB0VmFsMTEsIHRWYWwxMSAgICAgICAgICAgICAgICAgICAgICA7Ly8gdXBzdW0xIChDbGVhciB0aGUgdG9wIGp1bmsgYml0cykKLSAgICAgICAgQUREICAgICAgdFZhbDYsICBMZWZ0MCwgIExlZnQxICAgICAgICAgICAgICAgOy8vIHRWYWw2ID0gTGVmdDAgKyBMZWZ0MQotICAgICAgICBBREQgICAgICB0VmFsNywgIExlZnQyLCAgTGVmdDMgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSBMZWZ0MiArIExlZnQzCi0gICAgICAgIEFERCAgICAgIHRWYWw2LCAgdFZhbDYsICB0VmFsNyAgICAgICAgICAgICAgIDsvLyB0VmFsNiA9IHRWYWw2ICsgdFZhbDcKLSAgICAgICAgQUREICAgICAgT3V0MCwgICB0VmFsNiwgIHRWYWwxMSAgICAgICAgICAgICAgOy8vIE91dDAgID0gdFZhbDYgKyB0VmFsMTEgICAKLSAgICAgICAgQUREICAgICAgT3V0MCwgICBPdXQwLCAgICM0ICAgICAgICAgICAgICAgICAgOy8vIE91dDAgID0gT3V0MCArIDQKLSAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsICAgPU1VTF9DT05TVDAgICAgICAgICAgOy8vIDB4MDEwMTAxMDEKLSAgICAgICAgTU9WICAgICAgT3V0MCwgICBPdXQwLCAgTFNSICMzICAgICAgICAgICAgICAgOy8vIE91dDAgPSAoT3V0MCArIDQpPj4zCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgTVVMICAgICAgT3V0MCwgICBPdXQwLCAgcjB4MDEwMTAxMDEgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgotICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzAgIHRvIDMgXQotICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzQgIHRvIDcgXQotICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzggIHRvIDExXQotICAgICAgICBTVFIgICAgICBPdXQwLCAgIFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzEyIHRvIDE1XQotICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKLSAgICAgICAgCi1VcHBlck9yTGVmdE9yTm9uZUF2YWlsYWJsZQotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MwotICAgICAgICAKLSAgICAgICAgQ01QICAgICAgYXZhaWxhYmlsaXR5LCAgI09NWF9WQ19VUFBFUiAgICAgICAgOy8vIGlmKGF2YWlsYWJpbGl0eSAmICNPTVhfVkNfVVBQRVIpCi0gICAgICAgIEJORSAgICAgIExlZnRPck5vbmVBdmFpbGFibGUgICAgICAgICAgICAgICAgIDsvLyBKdW1wIHRvIExlZnQgaWYgbm90IHVwcGVyCi0gICAgICAgIExEUiAgICAgIEFib3ZlMDEyMywgIFtwU3JjQWJvdmVdICAgICAgICAgICAgIDsvLyBBYm92ZTAxMjMgID0gcFNyY0Fib3ZlWzAgdG8gM10KLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zCi0gICAgICAgIAotICAgICAgICBVWFRCMTYgICB0VmFsNywgIEFib3ZlMDEyMyAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdCi0gICAgICAgIFVYVEIxNiAgIHRWYWw2LCAgQWJvdmUwMTIzLCAgUk9SICM4ICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMSwgM10KLSAgICAgICAgVUFERDE2ICAgT3V0MCwgICB0VmFsNiwgIHRWYWw3ICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXSArIHBTcmNBYm92ZVsxLCAzXQotICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgICA9TVVMX0NPTlNUMCAgICAgICAgICA7Ly8gMHgwMTAxMDEwMQotICAgICAgICBBREQgICAgICBPdXQwLCAgIE91dDAsICAgTFNSICMxNiAgICAgICAgICAgICA7Ly8gc3VtKHBTcmNBYm92ZVswXSB0byBwU3JjQWJvdmVbM10pCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgVVhUSCAgICAgT3V0MCwgICBPdXQwICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHVwc3VtMSAoQ2xlYXIgdGhlIHRvcCBqdW5rIGJpdHMpCi0gICAgICAgIEFERCAgICAgIE91dDAsICAgT3V0MCwgICAjMiAgICAgICAgICAgICAgICAgIDsvLyBPdXQwICA9IE91dDAgKyAyCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgT3V0MCwgICBPdXQwLCAgIExTUiAjMiAgICAgICAgICAgICAgOy8vIE91dDAgID0gKE91dDAgKyAyKT4+MgotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgCi0gICAgICAgIE1VTCAgICAgIE91dDAsICAgT3V0MCwgICByMHgwMTAxMDEwMSAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFswICB0byAzIF0KLSAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbNCAgdG8gNyBdIAotICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFs4ICB0byAxMV0KLSAgICAgICAgU1RSICAgICAgT3V0MCwgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbMTIgdG8gMTVdCi0gICAgICAgIAotICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKLSAgICAgICAgCi1MZWZ0T3JOb25lQXZhaWxhYmxlICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTMKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgIHIweDAxMDEwMTAxLCAgID1NVUxfQ09OU1QwICAgICAgICAgIDsvLyAweDAxMDEwMTAxCi0gICAgICAgIENNUCAgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19MRUZUCi0gICAgICAgIEJORSAgICAgIE5vbmVBdmFpbGFibGUKLSAgICAgICAgTV9MRFJCICAgTGVmdDAsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQwID0gcFNyY0xlZnRbMF0KLSAgICAgICAgTV9MRFJCICAgTGVmdDEsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQxID0gcFNyY0xlZnRbMV0KLSAgICAgICAgTV9MRFJCICAgTGVmdDIsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQyID0gcFNyY0xlZnRbMl0KLSAgICAgICAgTERSQiAgICAgTGVmdDMsICBbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgOy8vIExlZnQzID0gcFNyY0xlZnRbM10KLSAgICAgICAgQUREICAgICAgT3V0MCwgICBMZWZ0MCwgIExlZnQxICAgICAgICAgICAgICAgOy8vIE91dDAgID0gTGVmdDAgKyBMZWZ0MQotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgIE91dDEsICAgTGVmdDIsICBMZWZ0MyAgICAgICAgICAgICAgIDsvLyBPdXQxICA9IExlZnQyICsgTGVmdDMKLSAgICAgICAgQUREICAgICAgT3V0MCwgICBPdXQwLCAgIE91dDEgICAgICAgICAgICAgICAgOy8vIE91dDAgID0gT3V0MCAgKyBPdXQxCi0gICAgICAgIEFERCAgICAgIE91dDAsICAgT3V0MCwgICAjMiAgICAgICAgICAgICAgICAgIDsvLyBPdXQwICA9IE91dDAgKyAyCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgT3V0MCwgICBPdXQwLCAgIExTUiAjMiAgICAgICAgICAgICAgOy8vIE91dDAgID0gKE91dDAgKyAyKT4+MgotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgCi0gICAgICAgIE1VTCAgICAgIE91dDAsICAgT3V0MCwgICByMHgwMTAxMDEwMSAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzAgIHRvIDMgXQotICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzQgIHRvIDcgXSAKLSAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFs4ICB0byAxMV0KLSAgICAgICAgU1RSICAgICAgT3V0MCwgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFsxMiB0byAxNV0KLSAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCi0KLU5vbmVBdmFpbGFibGUKLSAgICAgICAgTU9WICAgICAgT3V0MCwgICAjMTI4ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE91dDAgPSAxMjggaWYoY291bnQgPT0gMCkKLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz01Ci0gICAgICAgIAotICAgICAgICBNVUwgICAgICBPdXQwLCAgIE91dDAsICByMHgwMTAxMDEwMSAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcwotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFswICB0byAzIF0KLSAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFs0ICB0byA3IF0gCi0gICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbOCAgdG8gMTFdCi0gICAgICAgIFNUUiAgICAgIE91dDAsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbMTIgdG8gMTVdCi0gICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQotICAgICAgICAKLU9NWF9WQ180eDRfRElBR19ETAotICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsvLyBmID0gKGErMipiK2MrMik+PjIKLSAgICAgICAgOy8vIENhbGN1bGF0ZSBhczoKLSAgICAgICAgOy8vIGQgPSAoYSArIGMgKT4+MQotICAgICAgICA7Ly8gZSA9IChkIC0gYicpPj4xCi0gICAgICAgIDsvLyBmID0gZSArIDEyOAotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zCi0gICAgICAgIAotICAgICAgICBUU1QgICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfVVBQRVJfUklHSFQgICAgICAgICAgICAgICAgICAKLSAgICAgICAgTERNSUEgICAgcFNyY0Fib3ZlLCAge0Fib3ZlMDEyMywgQWJvdmU0NTY3fSAgOy8vIEFib3ZlMDEyMywgQWJvdmU0NTY3ID0gcFNyY0Fib3ZlWzAgdG8gN10KLSAgICAgICAgTERSICAgICAgcjB4ODA4MDgwODAsICA9QUREX0NPTlNUMSAgICAgICAgICAgOy8vIDB4ODA4MDgwODAKLSAgICAgICAgQk5FICAgICAgRExVcHBlclJpZ2h0QXZhaWxhYmxlCi0gICAgICAgIExEUiAgICAgIHIweDAxMDEwMTAxLCAgPU1VTF9DT05TVDAgICAgICAgICAgIDsvLyAweDAxMDEwMTAxCi0gICAgICAgIE1PViAgICAgIHRWYWw3LCAgQWJvdmUwMTIzLCAgTFNSICMyNCAgICAgICAgIDsvLyB7MDAsICAwMCwgIDAwLCAgVTMgfQotICAgICAgICBNT1YgICAgICB0VmFsMTEsIHRWYWw3LCAgTFNMICMyNCAgICAgICAgICAgICA7Ly8ge1UzLCAgMDAsICAwMCwgIDAwIH0KLSAgICAgICAgTVVMICAgICAgT3V0MywgICB0VmFsNywgIHIweDAxMDEwMTAxICAgICAgICAgOy8vIHtVMywgIFUzLCAgVTMsICBVMyB9IAotICAgICAgICBNT1YgICAgICB0VmFsOCwgIEFib3ZlMDEyMywgIExTUiAjMTYgICAgICAgICA7Ly8gezAwLCAgMDAsICBVMywgIFUyIH0KLSAgICAgICAgTU9WICAgICAgdFZhbDEwLCBBYm92ZTAxMjMsICBMU1IgIzggICAgICAgICAgOy8vIHswMCwgIFUzLCAgVTIsICBVMSB9Ci0gICAgICAgIE1WTiAgICAgIHRWYWwxMCwgdFZhbDEwICAgICAgICAgICAgICAgICAgICAgIDsvLyB7MDAnLCBVMycsIFUyJywgVTEnfQotICAgICAgICBVSEFERDggICB0VmFsOCwgIHRWYWw4LCAgQWJvdmUwMTIzICAgICAgICAgICA7Ly8ge3h4LCAgeHgsICBkMSwgIGQwIH0KLSAgICAgICAgVUhBREQ4ICAgdFZhbDYsICBBYm92ZTAxMjMsICB0VmFsOSAgICAgICAgICAgOy8vIHt4eCwgIGQyLCAgeHgsICB4eCB9Ci0gICAgICAgIFVIU1VCOCAgIHRWYWw4LCAgdFZhbDgsICB0VmFsMTAgICAgICAgICAgICAgIDsvLyB7eHgsICB4eCwgIGUxLCAgZTAgfQotICAgICAgICBVSFNVQjggICB0VmFsNiwgIHRWYWw2LCAgdFZhbDEwICAgICAgICAgICAgICA7Ly8ge3h4LCAgZTIsICB4eCwgIHh4IH0KLSAgICAgICAgVUFERDggICAgdFZhbDgsICB0VmFsOCwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHt4eCwgIHh4LCAgZjEsICBmMCB9Ci0gICAgICAgIFVBREQ4ICAgIHRWYWw2LCAgdFZhbDYsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB7eHgsICBmMiwgIHh4LCAgeHggfQotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgIHRWYWw2LCAgdFZhbDgsICB0VmFsNiAgICAgICAgICAgICAgIDsvLyB7eHgsICBmMiwgIGYxLCAgZjAgfQotICAgICAgICBCSUMgICAgICB0VmFsNiwgIHRWYWw2LCAgIzB4RkYwMDAwMDAgICAgICAgICA7Ly8gezAwLCAgZjIsICBmMSwgIGYwIH0KLSAgICAgICAgT1JSICAgICAgT3V0MCwgICB0VmFsNiwgIHRWYWwxMSAgICAgICAgICAgICAgOy8vIHtVMywgIGYyLCAgZjEsICBmMCB9Ci0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQotICAgICAgICAKLSAgICAgICAgUEtIVEIgICAgT3V0MSwgICBPdXQzLCAgIE91dDAsICBBU1IgIzggICAgICAgOy8vIHtVMywgIFUzLCAgZjIsICBmMSB9Ci0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgUEtIVEIgICAgT3V0MiwgICBPdXQzLCAgIE91dDEsICBBU1IgIzggICAgICAgOy8vIHtVMywgIFUzLCAgVTMsICBmMiB9Ci0gICAgICAgIAotICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge2YzIHRvIGYwfSBhdCBwRHN0WzMgIHRvIDAgXQotICAgICAgICBNX1NUUiAgICBPdXQxLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge2Y0IHRvIGYxfSBhdCBwRHN0WzcgIHRvIDQgXQotICAgICAgICBNX1NUUiAgICBPdXQyLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge2Y1IHRvIGYyfSBhdCBwRHN0WzExIHRvIDggXQotICAgICAgICBTVFIgICAgICBPdXQzLCAgIFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge2Y2IHRvIGYzfSBhdCBwRFN0WzE1IHRvIDEyXQotICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKLQotRExVcHBlclJpZ2h0QXZhaWxhYmxlICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIHRWYWw4LCAgQWJvdmUwMTIzLCAgTFNSICMyNCAgICAgICAgIDsvLyB7MDAsICAwMCwgIDAwLCAgVTMgfQotICAgICAgICBNT1YgICAgICB0VmFsOSwgIEFib3ZlMDEyMywgIExTUiAjMTYgICAgICAgICA7Ly8gezAwLCAgMDAsICBVMywgIFUyIH0KLSAgICAgICAgTU9WICAgICAgdFZhbDEwLCBBYm92ZTAxMjMsICBMU1IgIzggICAgICAgICAgOy8vIHswMCwgIFUzLCAgVTIsICBVMSB9Ci0gICAgICAgIE9SUiAgICAgIHRWYWw4LCAgdFZhbDgsICBBYm92ZTQ1NjcsIExTTCAjOCAgIDsvLyB7VTYsICBVNSwgIFU0LCAgVTMgfQotICAgICAgICBPUlIgICAgICB0VmFsMTAsIHRWYWwxMCwgQWJvdmU0NTY3LCBMU0wgIzI0ICA7Ly8ge1U0LCAgVTMsICBVMiwgIFUxIH0KLSAgICAgICAgUEtIQlQgICAgdFZhbDksICB0VmFsOSwgIEFib3ZlNDU2NywgTFNMICMxNiAgOy8vIHtVNSwgIFU0LCAgVTMsICBVMiB9Ci0gICAgICAgIE1WTiAgICAgIHRWYWwxLCAgdFZhbDggICAgICAgICAgICAgICAgICAgICAgIDsvLyB7VTYnLCBVNScsIFU0JywgVTMnfQotICAgICAgICBNVk4gICAgICB0VmFsMTAsIHRWYWwxMCAgICAgICAgICAgICAgICAgICAgICA7Ly8ge1U0JywgVTMnLCBVMicsIFUxJ30KLSAgICAgICAgTVZOICAgICAgdFZhbDIsICBBYm92ZTQ1NjcgICAgICAgICAgICAgICAgICAgOy8vIHtVNycsIFU2JywgVTUnLCBVNCd9Ci0gICAgICAgIFVIQUREOCAgIHRWYWw2LCAgQWJvdmUwMTIzLCAgdFZhbDkgICAgICAgICAgIDsvLyB7ZDMsICBkMiwgIGQxLCAgZDAgfQotICAgICAgICBVSEFERDggICB0VmFsOSwgIHRWYWw5LCAgQWJvdmU0NTY3ICAgICAgICAgICA7Ly8ge2Q1LCAgZDQsICBkMywgIGQyIH0KLSAgICAgICAgVUhBREQ4ICAgdFZhbDgsICBBYm92ZTQ1NjcsICB0VmFsOCAgICAgICAgICAgOy8vIHtkNiwgIHh4LCAgeHgsICB4eCB9Ci0gICAgICAgIFVIU1VCOCAgIHRWYWw2LCAgdFZhbDYsICB0VmFsMTAgICAgICAgICAgICAgIDsvLyB7ZTMsICBlMiwgIGUxLCAgZTAgfQotICAgICAgICBVSFNVQjggICB0VmFsMTIsIHRWYWw5LCAgdFZhbDEgICAgICAgICAgICAgICA7Ly8ge2U1LCAgZTQsICBlMywgIGUyIH0KLSAgICAgICAgVUhTVUI4ICAgdFZhbDgsICB0VmFsOCwgIHRWYWwyICAgICAgICAgICAgICAgOy8vIHtlNiwgIHh4LCAgeHgsICB4eCB9Ci0gICAgICAgIFVBREQ4ICAgIE91dDAsICAgdFZhbDYsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB7ZjMsICBmMiwgIGYxLCAgZjAgfQotICAgICAgICBVQUREOCAgICB0VmFsOSwgIHRWYWw4LCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8ge2Y2LCAgeHgsICB4eCwgIHh4IH0KLSAgICAgICAgVUFERDggICAgT3V0MiwgICB0VmFsMTIsIHIweDgwODA4MDgwICAgICAgICAgOy8vIHtmNSwgIGY0LCAgZjMsICBmMiB9Ci0gICAgICAgIE1PViAgICAgIHRWYWw3LCAgT3V0MCwgICBMU1IgIzggICAgICAgICAgICAgIDsvLyB7MDAsICBmMywgIGYyLCAgZjEgfQotICAgICAgICBBTkQgICAgICB0VmFsOSwgIHRWYWw5LCAgIzB4RkYwMDAwMDAgICAgICAgICA7Ly8ge2Y2LCAgMDAsICAwMCwgIDAwIH0KLSAgICAgICAgUEtIQlQgICAgT3V0MSwgICB0VmFsNywgIE91dDIsICBMU0wgIzggICAgICAgOy8vIHtmNCwgIGYzLCAgZjIsICBmMSB9Ci0gICAgICAgIE9SUiAgICAgIE91dDMsICAgdFZhbDksICBPdXQyLCAgTFNSICM4ICAgICAgIDsvLyB7ZjYsICBmNSwgIGY0LCAgZjMgfQotICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge2YzIHRvIGYwfSBhdCBwRHN0WzMgIHRvIDAgXQotICAgICAgICBNX1NUUiAgICBPdXQxLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge2Y0IHRvIGYxfSBhdCBwRHN0WzcgIHRvIDQgXQotICAgICAgICBNX1NUUiAgICBPdXQyLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge2Y1IHRvIGYyfSBhdCBwRHN0WzExIHRvIDggXQotICAgICAgICBTVFIgICAgICBPdXQzLCAgIFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge2Y2IHRvIGYzfSBhdCBwRFN0WzE1IHRvIDEyXQotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQotICAgICAgICAKLQotT01YX1ZDXzR4NF9ESUFHX0RSCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAotICAgICAgICAKLSAgICAgICAgTV9MRFJCICAgTGVmdDAsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQwID0gcFNyY0xlZnRbMF0KLSAgICAgICAgTV9MRFJCICAgTGVmdDEsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQxID0gcFNyY0xlZnRbMV0KLSAgICAgICAgTV9MRFJCICAgTGVmdDIsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQyID0gcFNyY0xlZnRbMl0KLSAgICAgICAgTERSQiAgICAgTGVmdDMsICBbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgOy8vIExlZnQzID0gcFNyY0xlZnRbM10KLSAgICAgICAgTERSQiAgICAgQWJvdmVMZWZ0LCBbcFNyY0Fib3ZlTGVmdF0gICAgICAgICAgOy8vIEFib3ZlTGVmdCA9IHBTcmNBYm92ZUxlZnRbMF0KLSAgICAgICAgT1JSICAgICAgdFZhbDcsICBMZWZ0MSwgIExlZnQwLCAgTFNMICM4ICAgICAgOy8vIHRWYWw3ID0gMDAgMDAgTDAgTDEKLSAgICAgICAgTERSICAgICAgQWJvdmUwMTIzLCAgW3BTcmNBYm92ZV0gICAgICAgICAgICAgOy8vIEFib3ZlMDEyMyA9IFUzIFUyIFUxIFUwCi0gICAgICAgIExEUiAgICAgIHIweDgwODA4MDgwLCA9QUREX0NPTlNUMSAgICAgICAgICAgIDsvLyAweDgwODA4MDgwCi0gICAgICAgIE9SUiAgICAgIHRWYWw4LCAgTGVmdDMsICBMZWZ0MiwgIExTTCAjOCAgICAgIDsvLyB0VmFsOCA9IDAwIDAwIEwyIEwzCi0gICAgICAgIFBLSEJUICAgIHRWYWw3LCAgdFZhbDgsICB0VmFsNywgIExTTCAjMTYgICAgIDsvLyB0VmFsNyA9IEwwIEwxIEwyIEwzCi0gICAgICAgIE1PViAgICAgIHRWYWw4LCAgQWJvdmUwMTIzLCAgTFNMICM4ICAgICAgICAgIDsvLyB0VmFsOCA9IFUyIFUxIFUwIDAwCi0gICAgICAgIE1PViAgICAgIHRWYWw5LCAgdFZhbDcsICBMU1IgIzggICAgICAgICAgICAgIDsvLyB0VmFsOSA9IDAwIEwwIEwxIEwyCi0gICAgICAgIE9SUiAgICAgIHRWYWw4LCAgdFZhbDgsICBBYm92ZUxlZnQgICAgICAgICAgIDsvLyB0VmFsOCA9IFUyIFUxIFUwIFVMCi0gICAgICAgIE9SUiAgICAgIHRWYWw5LCAgdFZhbDksICBBYm92ZUxlZnQsIExTTCAjMjQgIDsvLyB0VmFsOSA9IFVMIEwwIEwxIEwyCi0gICAgICAgIE1PViAgICAgIHRWYWwxMCwgQWJvdmUwMTIzLCAgTFNMICMyNCAgICAgICAgIDsvLyB0VmFsMTA9IFUwIDAwIDAwIDAwCi0gICAgICAgIFVYVEIgICAgIHRWYWwxMSwgdFZhbDcsICBST1IgIzI0ICAgICAgICAgICAgIDsvLyB0VmFsMTE9IDAwIDAwIDAwIEwwCi0gICAgICAgIE9SUiAgICAgIHRWYWwxMCwgdFZhbDEwLCB0VmFsOSwgIExTUiAjOCAgICAgIDsvLyB0VmFsMTA9IFUwIFVMIEwwIEwxCi0gICAgICAgIE9SUiAgICAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOCwgIExTTCAjOCAgICAgIDsvLyB0VmFsMTE9IFUxIFUwIFVMIEwwCi0gICAgICAgIFVIQUREOCAgIHRWYWwxMSwgQWJvdmUwMTIzLCAgdFZhbDExICAgICAgICAgIDsvLyB0VmFsMTE9IGQxIGQwIGRMIGcwCi0gICAgICAgIFVIQUREOCAgIHRWYWwxMCwgdFZhbDcsICB0VmFsMTAgICAgICAgICAgICAgIDsvLyB0VmFsMTA9IGcwIGcxIGcyIGczCi0gICAgICAgIE1WTiAgICAgIHRWYWw4LCAgdFZhbDggICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsOCA9IFUyJ1UxJ1UwJ1VMJwotICAgICAgICBNVk4gICAgICB0VmFsOSwgIHRWYWw5ICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDkgPSBVTCdMMCdMMSdMMicKLSAgICAgICAgVUhTVUI4ICAgdFZhbDExLCB0VmFsMTEsIHRWYWw4ICAgICAgICAgICAgICAgOy8vIHRWYWwxMT0gZTEgZTAgZUwgaDAKLSAgICAgICAgVUhTVUI4ICAgdFZhbDEwLCB0VmFsMTAsIHRWYWw5ICAgICAgICAgICAgICAgOy8vIHRWYWwxMD0gaDAgaDEgaDIgaDMKLSAgICAgICAgVUFERDggICAgT3V0MywgICB0VmFsMTAsIHIweDgwODA4MDgwICAgICAgICAgOy8vIE91dDMgID0gaTAgaTEgaTIgaTMKLSAgICAgICAgVUFERDggICAgT3V0MCwgICB0VmFsMTEsIHIweDgwODA4MDgwICAgICAgICAgOy8vIE91dDAgID0gZjEgZjAgZkwgaTAKLSAgICAgICAgVVhUSCAgICAgdFZhbDExLCBPdXQzLCAgIFJPUiAjOCAgICAgICAgICAgICAgOy8vIHRWYWwxMT0gMDAgMDAgaTEgaTIKLSAgICAgICAgTU9WICAgICAgdFZhbDcsICBPdXQwLCAgIExTTCAjOCAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gZjAgZkwgaTAgMDAKLSAgICAgICAgT1JSICAgICAgT3V0MSwgICB0VmFsNywgIHRWYWwxMSwgIExTUiAjOCAgICAgOy8vIE91dDEgID0gZjAgZkwgaTAgaTEKLSAgICAgICAgUEtIQlQgICAgT3V0MiwgICB0VmFsMTEsIE91dDAsICAgIExTTCAjMTYgICAgOy8vIE91dDIgID0gZkwgaTAgaTEgaTIKLSAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmMSB0byBpMH0gYXQgcERzdFszICB0byAwIF0KLSAgICAgICAgTV9TVFIgICAgT3V0MSwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmMCB0byBpMX0gYXQgcERzdFs3ICB0byA0IF0KLSAgICAgICAgTV9TVFIgICAgT3V0MiwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmTCB0byBpMn0gYXQgcERzdFsxMSB0byA4IF0KLSAgICAgICAgU1RSICAgICAgT3V0MywgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtpMCB0byBpM30gYXQgcERzdFsxNSB0byAxMl0gCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQotCi1PTVhfVkNfNHg0X1ZSCi0KLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgIEFib3ZlMDEyMywgIFtwU3JjQWJvdmVdICAgICAgICAgICAgIDsvLyBBYm92ZTAxMjMgPSBVMyBVMiBVMSBVMAotICAgICAgICBMRFJCICAgICBBYm92ZUxlZnQsICBbcFNyY0Fib3ZlTGVmdF0gICAgICAgICA7Ly8gQWJvdmVMZWZ0ID0gMDAgMDAgMDAgVUwKLSAgICAgICAgTV9MRFJCICAgTGVmdDAsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQwICAgICA9IDAwIDAwIDAwIEwwCi0gICAgICAgIE1fTERSQiAgIExlZnQxLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MSAgICAgPSAwMCAwMCAwMCBMMQotICAgICAgICBMRFJCICAgICBMZWZ0MiwgIFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICA7Ly8gTGVmdDIgICAgID0gMDAgMDAgMDAgTDIKLSAgICAgICAgTU9WICAgICAgdFZhbDAsICBBYm92ZTAxMjMsICBMU0wgIzggICAgICAgICAgOy8vIHRWYWwwICAgICA9IFUyIFUxIFUwIDAwCi0gICAgICAgIE1PViAgICAgIHRWYWw5LCAgQWJvdmUwMTIzICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsOSAgICAgPSBVMyBVMiBVMSBVMCAKLSAgICAgICAgT1JSICAgICAgdFZhbDE0LCB0VmFsMCwgICBBYm92ZUxlZnQgICAgICAgICAgOy8vIHRWYWwxNCAgICA9IFUyIFUxIFUwIFVMCi0gICAgICAgIE1WTiAgICAgIHRWYWwxMSwgdFZhbDE0ICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTEgICAgPSBVMidVMSdVMCdVTCcKLSAgICAgICAgTU9WICAgICAgdFZhbDIsICB0VmFsMTQsICBMU0wgIzggICAgICAgICAgICAgOy8vIHRWYWwyICAgICA9IFUxIFUwIFVMIDAwCi0gICAgICAgIFVIU1VCOCAgIHRWYWwxLCAgQWJvdmUwMTIzLCAgdFZhbDExICAgICAgICAgIDsvLyB0VmFsMSAgICAgPSBkMiBkMSBkMCBkTAotICAgICAgICBVSEFERDggICB0VmFsMTAsIEFib3ZlTGVmdCwgTGVmdDEgICAgICAgICAgICA7Ly8gdFZhbDEwICAgID0gMDAgMDAgMDAgajEgICAgICAgCi0gICAgICAgIE1WTiAgICAgIHRWYWw0LCAgTGVmdDAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsNCAgICAgPSAwMCAwMCAwMCBMMCcKLSAgICAgICAgVUhTVUI4ICAgdFZhbDQsICB0VmFsMTAsICB0VmFsNCAgICAgICAgICAgICAgOy8vIHRWYWw0ICAgICA9IDAwIDAwIDAwIGsxCi0gICAgICAgIE9SUiAgICAgIHRWYWwxMiwgdFZhbDAsICAgTGVmdDAgICAgICAgICAgICAgIDsvLyB0VmFsMTIgICAgPSBVMiBVMSBVMCBMMAotICAgICAgICBPUlIgICAgICB0VmFsMTQsIHRWYWwyLCAgIExlZnQwICAgICAgICAgICAgICA7Ly8gdFZhbDE0ICAgID0gVTEgVTAgVUwgTDAKLSAgICAgICAgTERSICAgICAgcjB4ODA4MDgwODAsICA9QUREX0NPTlNUMSAgICAgICAgICAgOy8vIDB4ODA4MDgwODAKLSAgICAgICAgVUhBREQ4ICAgdFZhbDEwLCB0VmFsOSwgICB0VmFsMTQgICAgICAgICAgICAgOy8vIHRWYWwxMCAgICA9IGczIGcyIGcxIGcwCi0gICAgICAgIFVBREQ4ICAgIE91dDAsICAgdFZhbDEsICAgcjB4ODA4MDgwODAgICAgICAgIDsvLyBPdXQwICAgICAgPSBlMiBlMSBlMCBlTAotICAgICAgICBVSFNVQjggICB0VmFsMTAsIHRWYWwxMCwgIHRWYWwxMSAgICAgICAgICAgICA7Ly8gdFZhbDEwICAgID0gaDMgaDIgaDEgaDAKLSAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtlMiB0byBlTH0gYXQgcERzdFszICB0byAwIF0KLSAgICAgICAgTU9WICAgICAgdFZhbDEsICB0VmFsMTQsICBMU0wgIzggICAgICAgICAgICAgOy8vIHRWYWwxICAgICA9IFUwIFVMIEwwIDAwCi0gICAgICAgIE1PViAgICAgIHRWYWw2LCAgT3V0MCwgICAgTFNMICM4ICAgICAgICAgICAgIDsvLyB0VmFsNiAgICAgPSBlMSBlMCBlTCAwMAotICAgICAgICBPUlIgICAgICB0VmFsMiwgIHRWYWwyLCAgIExlZnQxICAgICAgICAgICAgICA7Ly8gdFZhbDIgICAgID0gVTEgVTAgVUwgTDEKLSAgICAgICAgVUFERDggICAgdFZhbDQsICB0VmFsNCwgICByMHg4MDgwODA4MCAgICAgICAgOy8vIHRWYWw0ICAgICA9IDAwIDAwIDAwIGwxICAgICAgICAKLSAgICAgICAgVUFERDggICAgT3V0MSwgICB0VmFsMTAsICByMHg4MDgwODA4MCAgICAgICAgOy8vIE91dDEgICAgICA9IGkzIGkyIGkxIGkwCi0gICAgICAgIE1WTiAgICAgIHRWYWwyLCAgdFZhbDIgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTQgICAgPSBVMSdVMCdVTCdMMScKLSAgICAgICAgT1JSICAgICAgdFZhbDEsICB0VmFsMSwgICBMZWZ0MiAgICAgICAgICAgICAgOy8vIHRWYWwxICAgICA9IFUwIFVMIEwwIEwyCi0gICAgICAgIE9SUiAgICAgIE91dDIsICAgdFZhbDYsICAgdFZhbDQgICAgICAgICAgICAgIDsvLyBPdXQyICAgICAgPSBlMSBlMCBlTCBsMQotICAgICAgICBVSEFERDggICB0VmFsMSwgIHRWYWwxLCAgIHRWYWwxMiAgICAgICAgICAgICA7Ly8gdFZhbDEgICAgID0gZzIgZzEgZzAgajIKLSAgICAgICAgTV9TVFIgICAgT3V0MSwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtpMyB0byBpMH0gYXQgcERzdFs3ICB0byA0IF0KLSAgICAgICAgTV9TVFIgICAgT3V0MiwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtlMSB0byBsMX0gYXQgcERzdFsxMSB0byA4IF0KLSAgICAgICAgVUhTVUI4ICAgdFZhbDksICB0VmFsMSwgICB0VmFsMiAgICAgICAgICAgICAgOy8vIHRWYWw5ICAgICA9IGgyIGgxIGgwIGsyCi0gICAgICAgIFVBREQ4ICAgIE91dDMsICAgdFZhbDksICAgcjB4ODA4MDgwODAgICAgICAgIDsvLyBPdXQzICAgICAgPSBpMiBpMSBpMCBsMgotICAgICAgICBTVFIgICAgICBPdXQzLCAgIFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge2kyIHRvIGwyfSBhdCBwRHN0WzE1IHRvIDEyXSAKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCi0gICAgICAgIAotT01YX1ZDXzR4NF9IRAotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgIEFib3ZlMDEyMywgIFtwU3JjQWJvdmVdICAgICAgICAgICAgIDsvLyBBYm92ZTAxMjMgPSBVMyBVMiBVMSBVMAotICAgICAgICBMRFJCICAgICBBYm92ZUxlZnQsICBbcFNyY0Fib3ZlTGVmdF0gICAgICAgICA7Ly8gQWJvdmVMZWZ0ID0gMDAgMDAgMDAgVUwKLSAgICAgICAgTV9MRFJCICAgTGVmdDAsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQwID0gMDAgMDAgMDAgTDAKLSAgICAgICAgTV9MRFJCICAgTGVmdDEsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQxID0gMDAgMDAgMDAgTDEKLSAgICAgICAgTV9MRFJCICAgTGVmdDIsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQyID0gMDAgMDAgMDAgTDIKLSAgICAgICAgTERSQiAgICAgTGVmdDMsICBbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgOy8vIExlZnQzID0gMDAgMDAgMDAgTDMKLSAgICAgICAgTERSICAgICAgcjB4ODA4MDgwODAsICA9QUREX0NPTlNUMSAgICAgICAgICAgOy8vIDB4ODA4MDgwODAKLSAgICAgICAgT1JSICAgICAgdFZhbDIsICBBYm92ZUxlZnQsIEFib3ZlMDEyMywgTFNMICM4Oy8vIHRWYWwyID0gVTIgVTEgVTAgVUwKLSAgICAgICAgTVZOICAgICAgdFZhbDEsICBMZWZ0MCAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxID0gMDAgMDAgMDAgTDAnCi0gICAgICAgIE9SUiAgICAgIHRWYWw0LCAgTGVmdDAsICB0VmFsMiwgIExTTCAjOCAgICAgIDsvLyB0VmFsNCA9IFUxIFUwIFVMIEwwCi0gICAgICAgIE1WTiAgICAgIHRWYWwyLCAgdFZhbDIgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMiA9IFUyJ1UxJ1UwJ1VMJwotICAgICAgICBVSEFERDggICB0VmFsNCwgIHRWYWw0LCAgQWJvdmUwMTIzICAgICAgICAgICA7Ly8gdFZhbDQgPSBnMyBnMiBnMSBnMAotICAgICAgICBVSFNVQjggICB0VmFsMSwgIEFib3ZlTGVmdCwgIHRWYWwxICAgICAgICAgICA7Ly8gdFZhbDEgPSAwMCAwMCAwMCBkTAotICAgICAgICBVSFNVQjggICB0VmFsNCwgIHRWYWw0LCAgdFZhbDIgICAgICAgICAgICAgICA7Ly8gdFZhbDQgPSBoMyBoMiBoMSBoMAotICAgICAgICBVQUREOCAgICB0VmFsMSwgIHRWYWwxLCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gdFZhbDEgPSAwMCAwMCAwMCBlTAotICAgICAgICBVQUREOCAgICB0VmFsNCwgIHRWYWw0LCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gdFZhbDQgPSBpMyBpMiBpMSBpMAotICAgICAgICBPUlIgICAgICB0VmFsMiwgIExlZnQwLCAgQWJvdmVMZWZ0LCAgTFNMICMxNiA7Ly8gdFZhbDIgPSAwMCBVTCAwMCBMMAotICAgICAgICBNT1YgICAgICB0VmFsNCwgIHRWYWw0LCAgTFNMICM4ICAgICAgICAgICAgICA7Ly8gdFZhbDQgPSBpMiBpMSBpMCAwMAotICAgICAgICBPUlIgICAgICB0VmFsMTEsIExlZnQxLCAgTGVmdDAsICBMU0wgIzE2ICAgICA7Ly8gdFZhbDExPSAwMCBMMCAwMCBMMQotICAgICAgICBPUlIgICAgICB0VmFsNywgIExlZnQyLCAgTGVmdDEsICBMU0wgIzE2ICAgICA7Ly8gdFZhbDcgPSAwMCBMMSAwMCBMMgotICAgICAgICBPUlIgICAgICB0VmFsMTAsIExlZnQzLCAgTGVmdDIsICBMU0wgIzE2ICAgICA7Ly8gdFZhbDEwPSAwMCBMMiAwMCBMMwotICAgICAgICBPUlIgICAgICBPdXQwLCAgIHRWYWw0LCAgdFZhbDEgICAgICAgICAgICAgICA7Ly8gT3V0MCAgPSBpMiBpMSBpMCBlTAotICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9ICBhdCBwRHN0IFswICB0byAzIF0gCi0gICAgICAgIE1PViAgICAgIHRWYWw0LCAgT3V0MCwgICBMU0wgIzE2ICAgICAgICAgICAgIDsvLyB0VmFsNCA9IGkxIGkwIDAwIDAwCi0gICAgICAgIFVIQUREOCAgIHRWYWwyLCAgdFZhbDIsICB0VmFsNyAgICAgICAgICAgICAgIDsvLyB0VmFsMiA9IDAwIGoxIDAwIGoyCi0gICAgICAgIFVIQUREOCAgIHRWYWw2LCAgdFZhbDExLCB0VmFsMTAgICAgICAgICAgICAgIDsvLyB0VmFsMTE9IDAwIGoyIDAwIGozCi0gICAgICAgIE1WTiAgICAgIHRWYWwxMiwgdFZhbDExICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTI9IDAwIEwwJzAwIEwxJwotICAgICAgICBNVk4gICAgICB0VmFsMTQsIHRWYWw3ICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDE0PSAwMCBMMScwMCBMMicKLSAgICAgICAgVUhTVUI4ICAgdFZhbDIsICB0VmFsMiwgIHRWYWwxMiAgICAgICAgICAgICAgOy8vIHRWYWwyID0gMDAgazEgMDAgazIKLSAgICAgICAgVUhTVUI4ICAgdFZhbDgsICB0VmFsNywgIHRWYWwxMiAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gMDAgZDEgMDAgZDIKLSAgICAgICAgVUhTVUI4ICAgdFZhbDExLCB0VmFsNiwgIHRWYWwxNCAgICAgICAgICAgICAgOy8vIHRWYWwxMT0gMDAgazIgMDAgazMKLSAgICAgICAgVUhTVUI4ICAgdFZhbDksICB0VmFsMTAsIHRWYWwxNCAgICAgICAgICAgICAgOy8vIHRWYWw5ID0gMDAgZDIgMDAgZDMKLSAgICAgICAgVUFERDggICAgdFZhbDIsICB0VmFsMiwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWwyID0gMDAgbDEgMDAgbDIKLSAgICAgICAgVUFERDggICAgdFZhbDgsICB0VmFsOCwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWw4ID0gMDAgZTEgMDAgZTIKLSAgICAgICAgVUFERDggICAgdFZhbDExLCB0VmFsMTEsIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWwxMT0gMDAgbDIgMDAgbDMKLSAgICAgICAgVUFERDggICAgdFZhbDksICB0VmFsOSwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWw5ID0gMDAgZTIgMDAgZTMKLSAgICAgICAgT1JSICAgICAgT3V0MiwgICB0VmFsOCwgIHRWYWwyLCAgTFNMICM4ICAgICAgOy8vIE91dDIgID0gbDEgZTEgbDIgZTIKLSAgICAgICAgT1JSICAgICAgT3V0MywgICB0VmFsOSwgIHRWYWwxMSwgTFNMICM4ICAgICAgOy8vIE91dDMgID0gbDIgZTIgbDMgZTMKLSAgICAgICAgUEtIVEIgICAgT3V0MSwgICB0VmFsNCwgIE91dDIsICAgQVNSICMxNiAgICAgOy8vIE91dDEgID0gaTEgaTAgbDEgZTEKLSAgICAgICAgTV9TVFIgICAgT3V0MSwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQxfSAgYXQgcERzdCBbNCAgdG8gNyBdCi0gICAgICAgIE1fU1RSICAgIE91dDIsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0Mn0gIGF0IHBEc3QgWzggIHRvIDExXQotICAgICAgICBTVFIgICAgICBPdXQzLCAgIFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDN9ICBhdCBwRHN0IFsxMiB0byAxNV0KLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCi0gICAgICAgIAotT01YX1ZDXzR4NF9WTAotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTMKLSAgICAgICAgCi0gICAgICAgIExETUlBICAgIHBTcmNBYm92ZSwge0Fib3ZlMDEyMywgQWJvdmU0NTY3fSAgIDsvLyBBYm92ZTAxMjMsIEFib3ZlNDU2NyA9IHBTcmNBYm92ZVswIHRvIDddCi0gICAgICAgIFRTVCAgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19VUFBFUl9SSUdIVAotICAgICAgICBMRFIgICAgICByMHg4MDgwODA4MCwgID1BRERfQ09OU1QxICAgICAgICAgICA7Ly8gMHg4MDgwODA4MAotICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgID1NVUxfQ09OU1QwICAgICAgICAgICA7Ly8gMHgwMTAxMDEwMQotICAgICAgICBNT1YgICAgICB0VmFsMTEsIEFib3ZlMDEyMywgIExTUiAjMjQgICAgICAgICA7Ly8gdFZhbDExPSAwMCAwMCAwMCBVMwotICAgICAgICBNVUxFUSAgICBBYm92ZTQ1NjcsIHRWYWwxMSwgcjB4MDEwMTAxMDEgICAgICA7Ly8gQWJvdmU0NTY3ID0gVTMgVTMgVTMgVTMKLSAgICAgICAgTU9WICAgICAgdFZhbDksICBBYm92ZTAxMjMsICBMU1IgIzggICAgICAgICAgOy8vIHRWYWw5ID0gMDAgVTMgVTIgVTEKLSAgICAgICAgTVZOICAgICAgdFZhbDEwLCBBYm92ZTAxMjMgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxMD0gVTMnVTInVTEnVTAnCi0gICAgICAgIE9SUiAgICAgIHRWYWwyLCAgdFZhbDksICBBYm92ZTQ1NjcsICBMU0wgIzI0IDsvLyB0VmFsMiA9IFU0IFUzIFUyIFUxCi0gICAgICAgIFVIU1VCOCAgIHRWYWw4LCAgdFZhbDIsICB0VmFsMTAgICAgICAgICAgICAgIDsvLyB0VmFsOCA9IGQ0IGQzIGQyIGQxCi0gICAgICAgIFVBREQ4ICAgIE91dDAsICAgdFZhbDgsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyBPdXQwID0gZTQgZTMgZTIgZTEKLSAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSAgYXQgcERzdCBbMCAgdG8gMyBdCi0gICAgICAgIE1PViAgICAgIHRWYWw5LCAgdFZhbDksICBMU1IgIzggICAgICAgICAgICAgIDsvLyB0VmFsOSA9IDAwIDAwIFUzIFUyCi0gICAgICAgIE1PViAgICAgIHRWYWwxMCwgQWJvdmU0NTY3LCAgTFNMICM4ICAgICAgICAgIDsvLyB0VmFsMTA9IFU2IFU1IFU0IDAwCi0gICAgICAgIFBLSEJUICAgIHRWYWw5LCAgdFZhbDksICBBYm92ZTQ1NjcsIExTTCAjMTYgIDsvLyB0VmFsOSA9IFU1IFU0IFUzIFUyCi0gICAgICAgIE9SUiAgICAgIHRWYWwxMCwgdFZhbDEwLCB0VmFsMTEgICAgICAgICAgICAgIDsvLyB0VmFsMTA9IFU2IFU1IFU0IFUzCi0gICAgICAgIFVIQUREOCAgIHRWYWwxMSwgdFZhbDksICBBYm92ZTAxMjMgICAgICAgICAgIDsvLyB0VmFsMTE9IGc1IGc0IGczIGcyCi0gICAgICAgIFVIQUREOCAgIHRWYWwxNCwgdFZhbDIsICB0VmFsMTAgICAgICAgICAgICAgIDsvLyB0VmFsMTQ9IGc2IGc1IGc0IGczCi0gICAgICAgIE1WTiAgICAgIHRWYWw4LCAgdFZhbDIgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsOCA9IFU0J1UzJ1UyJ1UxJwotICAgICAgICBNVk4gICAgICB0VmFsNywgIHRWYWw5ICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSBVNSdVNCdVMydVMicKLSAgICAgICAgVUhTVUI4ICAgdFZhbDEyLCB0VmFsOSwgIHRWYWw4ICAgICAgICAgICAgICAgOy8vIHRWYWwxMj0gZDUgZDQgZDMgZDIKLSAgICAgICAgVUhTVUI4ICAgdFZhbDExLCB0VmFsMTEsIHRWYWw4ICAgICAgICAgICAgICAgOy8vIHRWYWwxMT0gaDUgaDQgaDMgaDIKLSAgICAgICAgVUhTVUI4ICAgdFZhbDIsICB0VmFsMTQsIHRWYWw3ICAgICAgICAgICAgICAgOy8vIHRWYWwyID0gaDYgaDUgaDQgaDMKLSAgICAgICAgVUFERDggICAgT3V0MSwgICB0VmFsMTEsIHIweDgwODA4MDgwICAgICAgICAgOy8vIE91dDEgID0gaTUgaTQgaTMgaTIKLSAgICAgICAgVUFERDggICAgT3V0MiwgICB0VmFsMTIsIHIweDgwODA4MDgwICAgICAgICAgOy8vIE91dDIgID0gZTUgZTQgZTMgZTIKLSAgICAgICAgVUFERDggICAgT3V0MywgICB0VmFsMiwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIE91dDMgID0gaTYgaTUgaTQgaTMKLSAgICAgICAgTV9TVFIgICAgT3V0MSwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQxfSBhdCBwRHN0IFs0ICB0byA3IF0KLSAgICAgICAgTV9TVFIgICAgT3V0MiwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQyfSBhdCBwRHN0IFs4ICB0byAxMV0KLSAgICAgICAgTV9TVFIgICAgT3V0MywgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQzfSBhdCBwRHN0IFsxMiB0byAxNV0KLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKLSAgICAgICAgCi1PTVhfVkNfNHg0X0hVCi0gICAgICAgIAotICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MgotICAgICAgICAKLSAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsICA9TVVMX0NPTlNUMCAgICAgICAgICAgOy8vIDB4MDEwMTAxMDEKLSAgICAgICAgTV9MRFJCICAgTGVmdDAsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQwID0gcFNyY0xlZnRbMF0KLSAgICAgICAgTV9MRFJCICAgTGVmdDEsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQxID0gcFNyY0xlZnRbMV0KLSAgICAgICAgTV9MRFJCICAgTGVmdDIsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQyID0gcFNyY0xlZnRbMl0KLSAgICAgICAgTERSQiAgICAgTGVmdDMsICBbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgOy8vIExlZnQzID0gcFNyY0xlZnRbM10KLSAgICAgICAgTU9WICAgICAgcjB4ODA4MDgwODAsICByMHgwMTAxMDEwMSwgTFNMICM3ICAgOy8vIDB4ODA4MDgwODAKLSAgICAgICAgT1JSICAgICAgdFZhbDYsICBMZWZ0MCwgIExlZnQxLCAgTFNMICMxNiAgICAgOy8vIHRWYWw2ID0gMDAgTDEgMDAgTDAKLSAgICAgICAgT1JSICAgICAgdFZhbDcsICBMZWZ0MSwgIExlZnQyLCAgTFNMICMxNiAgICAgOy8vIHRWYWw3ID0gMDAgTDIgMDAgTDEKLSAgICAgICAgT1JSICAgICAgdFZhbDExLCBMZWZ0MiwgIExlZnQzLCAgTFNMICMxNiAgICAgOy8vIHRWYWwxMT0gMDAgTDMgMDAgTDIKLSAgICAgICAgTVVMICAgICAgT3V0MywgICBMZWZ0MywgIHIweDAxMDEwMTAxICAgICAgICAgOy8vIE91dDMgID0gTDMgTDMgTDMgTDMKLSAgICAgICAgTVZOICAgICAgdFZhbDgsICB0VmFsNyAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gMDAgTDInMDAgTDEnCi0gICAgICAgIE1WTiAgICAgIHRWYWwxMCwgdFZhbDExICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTA9IDAwIEwzJzAwIEwyJwotICAgICAgICBVSEFERDggICB0VmFsNCwgIHRWYWw2LCAgdFZhbDExICAgICAgICAgICAgICA7Ly8gdFZhbDQgPSAwMCBnMyAwMCBnMgotICAgICAgICBVWFRCMTYgICB0VmFsMTIsIE91dDMgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEyPSAwMCBMMyAwMCBMMwotICAgICAgICBVSFNVQjggICB0VmFsNCwgIHRWYWw0LCAgdFZhbDggICAgICAgICAgICAgICA7Ly8gdFZhbDQgPSAwMCBoMyAwMCBoMgotICAgICAgICBVSFNVQjggICB0VmFsNiwgIHRWYWw2LCAgdFZhbDggICAgICAgICAgICAgICA7Ly8gdFZhbDYgPSAwMCBkMiAwMCBkMQotICAgICAgICBVSFNVQjggICB0VmFsMTEsIHRWYWwxMSwgdFZhbDggICAgICAgICAgICAgICA7Ly8gdFZhbDExPSAwMCBkMyAwMCBkMgotICAgICAgICBVSEFERDggICB0VmFsMTIsIHRWYWwxMiwgdFZhbDcgICAgICAgICAgICAgICA7Ly8gdFZhbDEyPSAwMCBnNCAwMCBnMwotICAgICAgICBVQUREOCAgICB0VmFsNCwgIHRWYWw0LCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gdFZhbDQgPSAwMCBpMyAwMCBpMgotICAgICAgICBVSFNVQjggICB0VmFsMTIsIHRWYWwxMiwgdFZhbDEwICAgICAgICAgICAgICA7Ly8gdFZhbDEyPSAwMCBoNCAwMCBoMwotICAgICAgICBVQUREOCAgICB0VmFsOCwgIHRWYWw2LCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gdFZhbDggPSAwMCBlMiAwMCBlMQotICAgICAgICBVQUREOCAgICB0VmFsMTEsIHRWYWwxMSwgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gdFZhbDExPSAwMCBlMyAwMCBlMgotICAgICAgICBVQUREOCAgICB0VmFsMTIsIHRWYWwxMiwgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gdFZhbDEyPSAwMCBpNCAwMCBpMwotICAgICAgICBPUlIgICAgICBPdXQwLCAgIHRWYWw4LCAgdFZhbDQsICBMU0wgIzggICAgICA7Ly8gT3V0MCAgPSBpMyBlMiBpMiBlMQotICAgICAgICBPUlIgICAgICBPdXQxLCAgIHRWYWwxMSwgdFZhbDEyLCBMU0wgIzggICAgICA7Ly8gT3V0MSAgPSBpNCBlMyBpMyBlMgotICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9ICBhdCBwRHN0IFswICB0byAzIF0KLSAgICAgICAgUEtIVEIgICAgT3V0MiwgICBPdXQzLCAgIE91dDEsICAgQVNSICMxNiAgICAgOy8vIE91dDIgID0gTDMgTDMgaTQgZTMKLSAgICAgICAgTV9TVFIgICAgT3V0MSwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQxfSAgYXQgcERzdCBbNCAgdG8gNyBdCi0gICAgICAgIE1fU1RSICAgIE91dDIsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0Mn0gIGF0IHBEc3QgWzggIHRvIDExXQotICAgICAgICBTVFIgICAgICBPdXQzLCAgIFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDN9ICBhdCBwRHN0IFsxMiB0byAxNV0KLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FTkQKLQotICAgICAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgRU5ECi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCBlbmRzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4M2Q3ZjAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucworKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICA5NjQxCi07Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIAotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9RUERpdlRhYmxlCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCi0gICAgICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLSAgICAKLQotICAgIElGIEFSTTExMzZKUwotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcHBTcmMgICAgICAgUk4gMAotcERzdCAgICAgICAgUk4gMQotUVAgICAgICAgICAgUk4gMgotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFNjcmF0Y2ggdmFyaWFibGUgZm9yIFVucGFjazJ4MiAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wU3JjICAgICAgICBSTiA5Ci1WYWx1ZSAgICAgICBSTiA0Ci1WYWx1ZTIgICAgICBSTiA1Ci1GbGFnICAgICAgICBSTiA2Ci1zdHJPZmZzZXQgICBSTiA3Ci1jc3RPZmZzZXQgICBSTiA4Ci0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gU2NyYXRjaCB2YXJpYWJsZQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXIwdzAgICAgICAgIFJOICAzCi1yMHcxICAgICAgICBSTiAgNAotCi1jMHcwICAgICAgICBSTiAgNQotYzF3MCAgICAgICAgUk4gIDYKLQotcmV0dXJuICAgICAgUk4gIDAKLXBRUERpdlRhYmxlIFJOICA1Ci1wUVBNb2RUYWJsZSAgICBSTiAgNgotU2hpZnQgICAgICAgIFJOICA5Ci1TY2FsZSAgICAgICAgUk4gIDIKLQotVGVtcDEgICAgICAgUk4gIDMKLVRlbXAyICAgICAgIFJOICA0Ci1UZW1wMyAgICAgICBSTiAgNwotVGVtcDQgICAgICAgUk4gIDgKLQotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciwgcjkKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBMRFIgICAgIHBTcmMsIFtwcFNyY10gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBwU3JjCi0gICAgICAgIE1PViAgICAgY3N0T2Zmc2V0LCAjMzEgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUbyBiZSB1c2VkIGluIHRoZSBsb29wLCB0byBjb21wdXRlIG9mZnNldAotICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOy8vIEZpcnN0bHksIGZpbGwgYWxsIHRoZSBjb2VmZmljaWVudCB2YWx1ZXMgb24gdGhlIDxwRHN0PiBidWZmZXIgYnkgemVybwotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgVmFsdWUsICAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEluaXRpYWxpemUgdGhlIHplcm8gdmFsdWUKLSAgICAgICAgTU9WICAgICAgVmFsdWUyLCAgIzAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEluaXRpYWxpemUgdGhlIHplcm8gdmFsdWUKLSAgICAgICAgTERSQiAgICAgRmxhZywgIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICAgOy8vIFByZWxvYWQgPEZsYWc+IGJlZm9yZSA8dW5wYWNrTG9vcD4KLSAgICAgICAgU1RSRCAgICAgVmFsdWUsIFtwRHN0LCAjMF0gICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMF0gID0gcERzdFsxXSAgPSBwRHN0WzJdICA9IHBEc3RbM10gID0gMAotICAgICAgICAKLQotdW5wYWNrTG9vcAotICAgICAgICBUU1QgICAgICBGbGFnLCAgIzB4MTAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcHV0aW5nIChGbGFnICYgMHgxMCkKLSAgICAgICAgTERSU0JORSAgVmFsdWUyLFtwU3JjLCMxXSAgICAgICAgICAgICAgICAgIAotICAgICAgICBMRFJCTkUgICBWYWx1ZSwgW3BTcmNdLCAjMiAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBieXRlIHdpc2UgdG8gYXZvaWQgdW5hbGlnbmVkIGFjY2VzcwotICAgICAgICBBTkQgICAgICBzdHJPZmZzZXQsIGNzdE9mZnNldCwgRmxhZywgTFNMICMxICA7Ly8gc3RyT2Zmc2V0ID0gKEZsYWcgJiAxNSkgPCAxOwotICAgICAgICBMRFJTQkVRICBWYWx1ZSwgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgICA7Ly8gVmFsdWUgPSAoT01YX1U4KSAgKnBTcmMrKwotICAgICAgICBPUlJORSAgICBWYWx1ZSxWYWx1ZSxWYWx1ZTIsIExTTCAjOCAgICAgICAgICA7Ly8gVmFsdWUgPSAoT01YX1UxNikgKnBTcmMrKwotICAgICAgICAKLSAgICAgICAgVFNUICAgICAgRmxhZywgICMweDIwICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXB1dGluZyAoRmxhZyAmIDB4MjApIHRvIGNoZWNrLCBpZiB3ZSdyZSBkb25lCi0gICAgICAgIExEUkJFUSAgIEZsYWcsICBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgIDsvLyBGbGFnICA9IChPTVhfVTgpICpwU3JjKyssIGZvciBuZXh0IGl0ZXJhdGlvbgotICAgICAgICBTVFJIICAgICBWYWx1ZSwgW3BEc3QsIHN0ck9mZnNldF0gICAgICAgICAgICA7Ly8gU3RvcmUgPFZhbHVlPiBhdCBvZmZzZXQgPHN0ck9mZnNldD4KLSAgICAgICAgQkVRICAgICAgdW5wYWNrTG9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byB0aGUgbG9vcCBiZWdpbm5pbmcKLSAgICAgICAgCi0gICAgICAgIExETUlBICAgIHBEc3QsIHtyMHcwLCByMHcxfSAgICAgICAgICAgICAgICAgIDsvLyByMHcwID0gfGMxfGMwfCAmIHIwdzEgPSB8YzN8YzJ8Ci0KLQotICAgICAgICBTVFIgICAgICBwU3JjLCBbcHBTcmNdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVXBkYXRlIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgotICAgICAgICAKLSAgICAgICAgTERSICAgICAgcFFQRGl2VGFibGUsID1hcm1WQ000UDEwX1FQRGl2VGFibGUgOy8vIFFQIERpdmlzaW9uIGxvb2stdXAtdGFibGUgYmFzZSBwb2ludGVyCi0gICAgICAgIExEUiAgICAgIHBRUE1vZFRhYmxlLCA9YXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZSA7Ly8gUVAgTW9kdWxvIGxvb2stdXAtdGFibGUgYmFzZSBwb2ludGVyCi0gICAgICAgIAotICAgICAgICBTQUREU1VCWCByMHcwLCByMHcwLCAgcjB3MCAgICAgICAgICAgICAgICAgICA7Ly8gWyBjMDArYzAxLCBjMDAtYzAxIF0KLSAgICAgICAgU0FERFNVQlggcjB3MSwgcjB3MSwgIHIwdzEgICAgICAgICAgICAgICAgICAgOy8vIFsgYzEwK2MxMSwgYzEwLWMxMSBdCi0gICAgICAgIAotICAgICAgICBMRFJTQiAgICBTaGlmdCwgW3BRUERpdlRhYmxlLCBRUF0gICAgICAgICAgICA7Ly8gU2hpZnQgPSBwUVBEaXZUYWJsZVtRUF0KLSAgICAgICAgTERSU0IgICAgU2NhbGUsIFtwUVBNb2RUYWJsZSwgUVBdICAgICAgICAgICAgOy8vIFNjYWxlID0gcFFQTW9kVGFibGVbUVBdCi0gICAgICAgIAotICAgICAgICBTQUREMTYgICBjMHcwLCByMHcwLCByMHcxICAgICAgICAgICAgICAgICAgICA7Ly8gWyBkMDArZDEwLCBkMDErZDExIF0KLSAgICAgICAgU1NVQjE2ICAgYzF3MCwgcjB3MCwgcjB3MSAgICAgICAgICAgICAgICAgICAgOy8vIFsgZDAwLWQxMCwgZDAxLWQxMSBdCi0gICAgICAgIAotICAgICAgICBMU0wgICAgICBTY2FsZSwgU2NhbGUsIFNoaWZ0ICAgICAgICAgICAgICAgICA7Ly8gU2NhbGUgPSBTY2FsZSA8PCBTaGlmdAotICAgICAgICAKLSAgICAgICAgU01VTFRCICAgVGVtcDIsIGMwdzAsICBTY2FsZSAgICAgICAgICAgICAgICAgOy8vIFRlbXAyID0gVChjMHcwKSAqIFNjYWxlCi0gICAgICAgIFNNVUxUQiAgIFRlbXA0LCBjMXcwLCAgU2NhbGUgICAgICAgICAgICAgICAgIDsvLyBUZW1wNCA9IFQoYzF3MCkgKiBTY2FsZQotICAgICAgICBTTVVMQkIgICBUZW1wMSwgYzB3MCwgIFNjYWxlICAgICAgICAgICAgICAgICA7Ly8gVGVtcDEgPSBCKGMwdzApICogU2NhbGUKLSAgICAgICAgU01VTEJCICAgVGVtcDMsIGMxdzAsICBTY2FsZSAgICAgICAgICAgICAgICAgOy8vIFRlbXAzID0gQihjMXcwKSAqIFNjYWxlCi0gICAgICAgIE1PViAgICAgIFRlbXAyLCBUZW1wMiwgQVNSICMxICAgICAgICAgICAgICAgIDsvLyBUZW1wMiA9IFRlbXAyID4+IDEgJiBUZW1wMSA9IChUZW1wMSA+PiAxKSA8PCAxNgotICAgICAgICBNT1YgICAgICBUZW1wNCwgVGVtcDQsIEFTUiAjMSAgICAgICAgICAgICAgICA7Ly8gVGVtcDQgPSBUZW1wNCA+PiAxICYgVGVtcDMgPSAoVGVtcDMgPj4gMSkgPDwgMTYKLSAgICAgICAgUEtIQlQgICAgYzB3MCwgIFRlbXAyLCBUZW1wMSwgTFNMICMxNSAgICAgICAgOy8vIGMwdzAgID0gfCBUZW1wMSB8IFRlbXAyIHwKLSAgICAgICAgUEtIQlQgICAgYzF3MCwgIFRlbXA0LCBUZW1wMywgTFNMICMxNSAgICAgICAgOy8vIGMxdzAgID0gfCBUZW1wMyB8IFRlbXA0IHwKLSAgICAgICAgU1RNSUEgICAgcERzdCwge2MwdzAsIGMxdzB9ICAgICAgICAgICAgICAgICAgOy8vIFN0b3JpbmcgYWxsIHRoZSBjb2VmZmljaWVudHMgYXQgb25jZQotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRU5ECi0gICAgICAgIAotICAgIEVORElGIDsvLyBBUk0xMTM2SlMKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NzRjZDEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ODMgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi07Ly8gRGVzY3JpcHRpb246Ci07Ly8gSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSBhbmQgdHJhbnNmb3JtIG1vZHVsZQotOy8vIAotOy8vIAotCi07Ly8gSW5jbHVkZSBzdGFuZGFyZCBoZWFkZXJzCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLTsvLyBJbXBvcnQvRXhwb3J0IHN5bWJvbHMgcmVxdWlyZWQgZnJvbS90byBvdGhlciBmaWxlcwotOy8vIChGb3IgZXhhbXBsZSB0YWJsZXMpCi0gICAgICAgIAotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NCAKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfUVBEaXZUYWJsZQotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotOy8vIFNldCBkZWJ1Z2dpbmcgbGV2ZWwgICAgICAgIAotOy8vREVCVUdfT04gICAgU0VUTCB7VFJVRX0KLQotCi07Ly8gU3RhdGljIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKLSAgICAKLQotOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQotICAgIAotICAgIElGICBBUk0xMTM2SlMgCi0KLQotOy8vSW5wdXQgUmVnaXN0ZXJzCi1wRGF0YSAgICAgICAgICAgICAgIFJOICAwCi1RUCAgICAgICAgICAgICAgICAgIFJOICAxCi0KLTsvL091dHB1dCBSZWdpc3RlcnMKLQotCi07Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycwotCi07Ly8gUGFja2VkIElucHV0IHBpeGVscwotaW4wMCAgICAgICAgICAgICAgICBSTiAgMiAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzBdICYgU3JjWzFdIAotaW4wMiAgICAgICAgICAgICAgICBSTiAgMyAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzJdICYgU3JjWzNdCi1pbjEwICAgICAgICAgICAgICAgIFJOICA0ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbNF0gJiBTcmNbNV0KLWluMTIgICAgICAgICAgICAgICAgUk4gIDUgICAgICAgICAgICAgICAgICAgOy8vIFNyY1s2XSAmIFNyY1s3XQotaW4yMCAgICAgICAgICAgICAgICBSTiAgNiAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzhdICYgU3JjWzldCi1pbjIyICAgICAgICAgICAgICAgIFJOICA3ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbMTBdICYgU3JjWzExXQotaW4zMCAgICAgICAgICAgICAgICBSTiAgOCAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzEyXSAmIFNyY1sxM10KLWluMzIgICAgICAgICAgICAgICAgUk4gIDkgICAgICAgICAgICAgICAgICAgOy8vIFNyY1sxNF0gJiBTcmNbMTVdCi0KLTsvLyBUcmFuc3Bvc2UgZm9yIFJvdyBvcGVyYXRpb25zIChSb3dzIHRvIGNvbHMpCi10clJvdzAwICAgICAgICAgICAgIFJOICAyCi10clJvdzEwICAgICAgICAgICAgIFJOICAxMAotdHJSb3cwMiAgICAgICAgICAgICBSTiAgMwotdHJSb3cxMiAgICAgICAgICAgICBSTiAgNQotdHJSb3cyMCAgICAgICAgICAgICBSTiAgMTEKLXRyUm93MzAgICAgICAgICAgICAgUk4gIDEyCi10clJvdzMyICAgICAgICAgICAgIFJOICAxNAotdHJSb3cyMiAgICAgICAgICAgICBSTiAgNwotCi07Ly8gSW50ZXJtZWRpYXRlIGNhbGN1bGF0aW9ucwotcm93U3VtMSAgICAgICAgICAgICBSTiAgNAotcm93U3VtMiAgICAgICAgICAgICBSTiAgNgotcm93RGlmZjEgICAgICAgICAgICBSTiAgOAotcm93RGlmZjIgICAgICAgICAgICBSTiAgOQotCi0KLTsvLyBSb3cgb3BlcmF0ZWQgcGl4ZWxzCi1yb3dPcDAwICAgICAgICAgICAgIFJOICAyCi1yb3dPcDEwICAgICAgICAgICAgIFJOICAxMAotcm93T3AyMCAgICAgICAgICAgICBSTiAgMTEKLXJvd09wMzAgICAgICAgICAgICAgUk4gIDEyCi1yb3dPcDAyICAgICAgICAgICAgIFJOICAzCi1yb3dPcDEyICAgICAgICAgICAgIFJOICA1Ci1yb3dPcDIyICAgICAgICAgICAgIFJOICA3Ci1yb3dPcDMyICAgICAgICAgICAgIFJOICAxNAotCi07Ly8gVHJhbnNwb3NlIGZvciBjb2x1bG1uIG9wZXJhdGlvbnMKLXRyQ29sMDAgICAgICAgICAgICAgUk4gIDIgICAgICAgICAgICAgICAgICAgCi10ckNvbDAyICAgICAgICAgICAgIFJOICAzICAgICAgICAgICAgICAgICAgIAotdHJDb2wxMCAgICAgICAgICAgICBSTiAgNCAgICAgICAgICAgICAgICAgICAKLXRyQ29sMTIgICAgICAgICAgICAgUk4gIDUgICAgICAgICAgICAgICAgICAgCi10ckNvbDIwICAgICAgICAgICAgIFJOICA2ICAgICAgICAgICAgICAgICAgIAotdHJDb2wyMiAgICAgICAgICAgICBSTiAgNyAgICAgICAgICAgICAgICAgICAKLXRyQ29sMzAgICAgICAgICAgICAgUk4gIDggICAgICAgICAgICAgICAgICAgCi10ckNvbDMyICAgICAgICAgICAgIFJOICA5ICAKLQotOy8vIEludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMKLWNvbFN1bTEgICAgICAgICAgICAgUk4gIDEwCi1jb2xTdW0yICAgICAgICAgICAgIFJOICAxMQotY29sRGlmZjEgICAgICAgICAgICBSTiAgMTIKLWNvbERpZmYyICAgICAgICAgICAgUk4gIDE0Ci0KLQotOy8vIENvbG91bW4gb3BlcmF0ZWQgcGl4ZWxzCi1jb2xPcDAwICAgICAgICAgICAgIFJOICAyICAgICAgICAgICAgICAgICAgIAotY29sT3AwMiAgICAgICAgICAgICBSTiAgMyAgICAgICAgICAgICAgICAgICAKLWNvbE9wMTAgICAgICAgICAgICAgUk4gIDQgICAgICAgICAgICAgICAgICAgCi1jb2xPcDEyICAgICAgICAgICAgIFJOICA1ICAgICAgICAgICAgICAgICAgIAotY29sT3AyMCAgICAgICAgICAgICBSTiAgNiAgICAgICAgICAgICAgICAgICAKLWNvbE9wMjIgICAgICAgICAgICAgUk4gIDcgICAgICAgICAgICAgICAgICAgCi1jb2xPcDMwICAgICAgICAgICAgIFJOICA4ICAgICAgICAgICAgICAgICAgIAotY29sT3AzMiAgICAgICAgICAgICBSTiAgOSAgCi0KLTsvLyBUZW1wb3Jhcnkgc2NyYXRjaCB2YXJhaWJsZXMKLXBRUERpdlRhYmxlICAgICAgICAgUk4gIDAKLXBRUE1vZFRhYmxlICAgICAgICAgUk4gIDExCi1TaGlmdCAgICAgICAgICAgICAgIFJOICAxMAotU2NhbGUgICAgICAgICAgICAgICBSTiAgMTQKLVJvdW5kICAgICAgICAgICAgICAgUk4gIDAKLQotdGVtcDEgICAgICAgICAgICAgICBSTiAgMTAKLXRlbXAyICAgICAgICAgICAgICAgIFJOICAxMQotdGVtcDMgICAgICAgICAgICAgICBSTiAgMTIKLXRlbXA0ICAgICAgICAgICAgICAgUk4gIDEKLQotCi0KLTsvLyBJbnZUcmFuc2Zvcm1lZCBhbmQgRGVxdWFudGl6ZWQgcGl4ZWxzCi1vdXQwMCAgICAgICAgICAgICAgIFJOICAyICAgICAgICAgICAgICAgICAgIAotb3V0MDIgICAgICAgICAgICAgICBSTiAgMyAgICAgICAgICAgICAgICAgICAKLW91dDEwICAgICAgICAgICAgICAgUk4gIDQgICAgICAgICAgICAgICAgICAgCi1vdXQxMiAgICAgICAgICAgICAgIFJOICA1ICAgICAgICAgICAgICAgICAgIAotb3V0MjAgICAgICAgICAgICAgICBSTiAgNiAgICAgICAgICAgICAgICAgICAKLW91dDIyICAgICAgICAgICAgICAgUk4gIDcgICAgICAgICAgICAgICAgICAgCi1vdXQzMCAgICAgICAgICAgICAgIFJOICA4ICAgICAgICAgICAgICAgICAgIAotb3V0MzIgICAgICAgICAgICAgICBSTiAgOSAgCi0gICAgICAKLSAgICAgICAgCi0KLSAgICAgICAKLSAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgotICAgICAgICBNX0FMTE9DNCAgICBwRGF0YU9uU3RhY2ssIDQKLQotICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQscjExCi0gICAgICAgIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDsvLyBUaGUgc3RyYXRlZ3kgdXNlZCBpbiBpbXBsZW1lbnRpbmcgdGhlIHRyYW5zZm9ybSBpcyBhcyBmb2xsb3dzOioKLSAgICAgICAgOy8vIExvYWQgdGhlIDR4NCBibG9jayBpbnRvIDggcmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCi0gICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIDR4NCBtYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAotICAgICAgICA7Ly8gUGVyZm9ybSB0aGUgcm93IG9wZXJhdGlvbnMgKG9uIGNvbHVtbnMpIHVzaW5nIFNJTUQgICAgICAgICAgICAqICAKLSAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgNHg0IHJlc3VsdCBtYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCi0gICAgICAgIDsvLyBQZXJmb3JtIHRoZSBjb2xvdW1uIG9wZXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgICAgOy8vIFN0b3JlIHRoZSA0eDQgYmxvY2sgYXQgb25lIGdvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgICAgICA7Ly8gTG9hZCBhbGwgdGhlIDR4NCBwaXhlbHMKLSAgICAgICAgCi0gICAgICAgIExETUlBICAgcERhdGEse2luMDAsaW4wMixpbjEwLGluMTIsaW4yMCxpbjIyLGluMzAsaW4zMn0KLSAgICAgICAgCi0gICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSBtYXRyaXggaW5vcmRlciB0byBwZXJmb3JtIHJvdyBvcHMgYXMgY29sb3VtbiBvcHMKLSAgICAgICAgOy8vIElucHV0OiAgIGluW11bXSA9IG9yaWdpbmFsIG1hdHJpeAotICAgICAgICA7Ly8gT3V0cHV0OiAgdHJSb3dbXVtdPSB0cmFuc3Bvc2VkIG1hdHJpeAotICAgICAgICA7Ly8gU3RlcDE6IE9idGFpbiB0aGUgTEwgcGFydCBvZiB0aGUgdHJhbnNwb3NlZCBtYXRyaXgKLSAgICAgICAgOy8vIFN0ZXAyOiBPYnRhaW4gdGhlIEhMIHBhcnQKLSAgICAgICAgOy8vIHN0ZXAzOiBPYnRhaW4gdGhlIExIIHBhcnQKLSAgICAgICAgOy8vIFN0ZXA0OiBPYnRhaW4gdGhlIEhIIHBhcnQKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIAotICAgICAgICA7Ly8gTEwgMngyIHRyYW5zcG9zZWQgbWF0cml4IAotICAgICAgICA7Ly8gICBkMCBkMSAtIC0KLSAgICAgICAgOy8vICAgZDQgZDUgLSAtCi0gICAgICAgIDsvLyAgIC0gIC0gIC0gLQotICAgICAgICA7Ly8gICAtICAtICAtIC0KLSAgICAgICAgCi0gICAgICAgIFBLSFRCICAgdHJSb3cxMCxpbjEwLGluMDAsQVNSICMxNiAgICAgICAgICAgICAgIDsvLyBbNSA0XSA9IFtmNTpmMV0gICAgCi0gICAgICAgIFBLSEJUICAgdHJSb3cwMCxpbjAwLGluMTAsTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBbMSAwXSA9IFtmNDpmMF0gIAotICAgICAgICAKLSAgICAgICAgOy8vIEhMIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAgCi0gICAgICAgIDsvLyAgICAtICAgLSAgIC0gLQotICAgICAgICA7Ly8gICAgLSAgIC0gICAtIC0KLSAgICAgICAgOy8vICAgIGQ4ICBkOSAgLSAtCi0gICAgICAgIDsvLyAgIGQxMiBkMTMgIC0gLQotICAgICAgICAKLSAgICAgICAgIAotICAgICAgICAgUEtIVEIgICB0clJvdzMwLGluMTIsaW4wMixBU1IgIzE2ICAgICAgICAgICAgICA7Ly8gWzEzIDEyXSA9IFs3IDNdCi0gICAgICAgICBQS0hCVCAgIHRyUm93MjAsaW4wMixpbjEyLExTTCAjMTYgICAgICAgICAgICAgIDsvLyBbOSA4XSA9IFs2IDJdIAotICAgICAgICAKLSAgICAgICAgOy8vIExIIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAKLSAgICAgICAgOy8vICAgLSAtIGQyIGQzIAotICAgICAgICA7Ly8gICAtIC0gZDYgZDcgCi0gICAgICAgIDsvLyAgIC0gLSAtICAtCi0gICAgICAgIDsvLyAgIC0gLSAtICAtCi0gICAgICAgIAotICAgICAgICBQS0hCVCAgIHRyUm93MDIsaW4yMCxpbjMwLExTTCAjMTYgICAgICAgICAgICAgICA7Ly8gWzMgMl0gPSBbZjEyOmY4XSAgCi0gICAgICAgIFBLSFRCICAgdHJSb3cxMixpbjMwLGluMjAsQVNSICMxNiAgICAgICAgICAgICAgIDsvLyBbNyA2XSA9IFtmMTM6ZjldIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgCi0gICAgICAgIDsvLyBISCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggIAotICAgICAgICA7Ly8gICAgLSAtICAgLSAgIC0KLSAgICAgICAgOy8vICAgIC0gLSAgIC0gICAtCi0gICAgICAgIDsvLyAgICAtIC0gIGQxMCBkMTEKLSAgICAgICAgOy8vICAgIC0gLSAgZDE0IGQxNQotICAgICAgICAKLSAgICAgICAgUEtIVEIgICB0clJvdzMyLGluMzIsaW4yMixBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFsxNSAxNF0gPSBbMTUgMTFdCi0gICAgICAgIFBLSEJUICAgdHJSb3cyMixpbjIyLGluMzIsTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBbMTEgMTBdID0gWzE0IDEwXQotICAgICAgIAotICAgICAgICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gICAgICAgIDsvLyBSb3cgT3BlcmF0aW9ucyAoUGVyZm9ybWVkIG9uIGNvbHVtbnMpCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBTSU1EIG9wZXJhdGlvbnMgb24gZmlyc3QgdHdvIGNvbHVtbnModHdvIHJvd3Mgb2YgdGhlIG9yaWdpbmFsIG1hdHJpeCkKLSAgICAgICAgCi0gICAgICAgIFNBREQxNiAgICAgIHJvd1N1bTEsdHJSb3cwMCx0clJvdzEwICAgICAgICAgICAgICAgIDsvLyAoYzArYzEpCi0gICAgICAgIFNBREQxNiAgICAgIHJvd1N1bTIsdHJSb3cyMCx0clJvdzMwICAgICAgICAgICAgICAgIDsvLyAoYzIrYzMpCi0gICAgICAgIFNTVUIxNiAgICAgIHJvd0RpZmYxLHRyUm93MDAsdHJSb3cxMCAgICAgICAgICAgICAgIDsvLyAoYzAtYzEpCi0gICAgICAgIFNTVUIxNiAgICAgIHJvd0RpZmYyLHRyUm93MjAsdHJSb3czMCAgICAgICAgICAgICAgIDsvLyAoYzItYzMpCi0gICAgICAgIFNBREQxNiAgICAgIHJvd09wMDAscm93U3VtMSxyb3dTdW0yICAgICAgICAgICAgICAgIDsvLyAoYzArYzErYzIrYzMpCi0gICAgICAgIFNTVUIxNiAgICAgIHJvd09wMTAscm93U3VtMSxyb3dTdW0yICAgICAgICAgICAgICAgIDsvLyAoYzArYzEtYzItYzMpCi0gICAgICAgIFNTVUIxNiAgICAgIHJvd09wMjAscm93RGlmZjEscm93RGlmZjIgICAgICAgICAgICAgIDsvLyAoYzAtYzEtYzIrYzMpCi0gICAgICAgIFNBREQxNiAgICAgIHJvd09wMzAscm93RGlmZjEscm93RGlmZjIgICAgICAgICAgICAgIDsvLyAoYzAtYzErYzItYzMpCi0gICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gU0lNRCBvcGVyYXRpb25zIG9uIG5leHQgdHdvIGNvbHVtbnMobmV4dCB0d28gcm93cyBvZiB0aGUgb3JpZ2luYWwgbWF0cml4KQotICAgICAgICAKLSAgICAgICAgU0FERDE2ICAgICAgcm93U3VtMSx0clJvdzAyLHRyUm93MTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMSkKLSAgICAgICAgU0FERDE2ICAgICAgcm93U3VtMix0clJvdzIyLHRyUm93MzIgICAgICAgICAgICAgICAgOy8vIChjMitjMykKLSAgICAgICAgU1NVQjE2ICAgICAgcm93RGlmZjEsdHJSb3cwMix0clJvdzEyICAgICAgICAgICAgICAgOy8vIChjMC1jMSkKLSAgICAgICAgU1NVQjE2ICAgICAgcm93RGlmZjIsdHJSb3cyMix0clJvdzMyICAgICAgICAgICAgICAgOy8vIChjMi1jMykKLSAgICAgICAgU0FERDE2ICAgICAgcm93T3AwMixyb3dTdW0xLHJvd1N1bTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMStjMitjMykKLSAgICAgICAgU1NVQjE2ICAgICAgcm93T3AxMixyb3dTdW0xLHJvd1N1bTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMS1jMi1jMykKLSAgICAgICAgU1NVQjE2ICAgICAgcm93T3AyMixyb3dEaWZmMSxyb3dEaWZmMiAgICAgICAgICAgICAgOy8vIChjMC1jMS1jMitjMykKLSAgICAgICAgU0FERDE2ICAgICAgcm93T3AzMixyb3dEaWZmMSxyb3dEaWZmMiAgICAgICAgICAgICAgOy8vIChjMC1jMStjMi1jMykKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIHJlc3VsdGFudCBtYXRyaXgKLSAgICAgICAgOy8vIElucHV0OiAgcm93T3BbXVtdCi0gICAgICAgIDsvLyBPdXRwdXQ6IHRyQ29sW11bXSAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIAotICAgICAgICA7Ly8gTEwgMngyIHRyYW5zcG9zZWQgbWF0cml4IAotICAgICAgICA7Ly8gICBkMCBkMSAtIC0KLSAgICAgICAgOy8vICAgZDQgZDUgLSAtCi0gICAgICAgIDsvLyAgIC0gIC0gIC0gLQotICAgICAgICA7Ly8gICAtICAtICAtIC0KLSAgICAgICAgCi0gICAgICAgIFBLSFRCICAgdHJDb2wxMCxyb3dPcDEwLHJvd09wMDAsQVNSICMxNiAgICAgICAgICAgOy8vIFs1IDRdID0gW2Y1OmYxXQotICAgICAgICBQS0hCVCAgIHRyQ29sMDAscm93T3AwMCxyb3dPcDEwLExTTCAjMTYgICAgICAgICAgIDsvLyBbMSAwXSA9IFtmNDpmMF0gIAotICAgICAgICAKLSAgICAgICAgOy8vIEhMIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAgCi0gICAgICAgIDsvLyAgICAtICAgLSAgIC0gLQotICAgICAgICA7Ly8gICAgLSAgIC0gICAtIC0KLSAgICAgICAgOy8vICAgIGQ4ICBkOSAgLSAtCi0gICAgICAgIDsvLyAgIGQxMiBkMTMgIC0gLQotICAgICAgICAKLSAgICAgICAgIAotICAgICAgICAgUEtIVEIgICB0ckNvbDMwLHJvd09wMTIscm93T3AwMixBU1IgIzE2ICAgICAgICAgIDsvLyBbMTMgMTJdID0gWzcgM10KLSAgICAgICAgIFBLSEJUICAgdHJDb2wyMCxyb3dPcDAyLHJvd09wMTIsTFNMICMxNiAgICAgICAgICA7Ly8gWzkgOF0gPSBbNiAyXSAKLSAgICAgICAgCi0gICAgICAgIDsvLyBMSCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggCi0gICAgICAgIDsvLyAgIC0gLSBkMiBkMyAKLSAgICAgICAgOy8vICAgLSAtIGQ2IGQ3IAotICAgICAgICA7Ly8gICAtIC0gLSAgLQotICAgICAgICA7Ly8gICAtIC0gLSAgLQotICAgICAgICAKLSAgICAgICAgUEtIQlQgICB0ckNvbDAyLHJvd09wMjAscm93T3AzMCxMU0wgIzE2ICAgICAgICAgICA7Ly8gWzMgMl0gPSBbZjEyOmY4XSAgCi0gICAgICAgIFBLSFRCICAgdHJDb2wxMixyb3dPcDMwLHJvd09wMjAsQVNSICMxNiAgICAgICAgICAgOy8vIFs3IDZdID0gW2YxMzpmOV0gCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgOy8vIEhIIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAgCi0gICAgICAgIDsvLyAgICAtIC0gICAtICAgLQotICAgICAgICA7Ly8gICAgLSAtICAgLSAgIC0KLSAgICAgICAgOy8vICAgIC0gLSAgZDEwIGQxMQotICAgICAgICA7Ly8gICAgLSAtICBkMTQgZDE1Ci0gICAgICAgIAotICAgICAgICBQS0hUQiAgIHRyQ29sMzIscm93T3AzMixyb3dPcDIyLEFTUiAjMTYgICAgICAgICAgICA7Ly8gWzE1IDE0XSA9IFsxNSAxMV0KLSAgICAgICAgUEtIQlQgICB0ckNvbDIyLHJvd09wMjIscm93T3AzMixMU0wgIzE2ICAgICAgICAgICAgOy8vIFsxMSAxMF0gPSBbMTQgMTBdCi0gICAgICAgCi0gICAgICAgIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgICAgICAgOy8vIENvbG91bW4gT3BlcmF0aW9ucyAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7Ly8gU3RvcmUgcERhdGEoUk4wKSBvbiBzdGFjayBhbmQgcmVzdG9yZSBpdCBvbmx5IGF0IHRoZSBmaW5hbCBzdG9yZSBiYWNrCi0gICAgICAgIDsvLyBUaGlzIGZyZWVzIHVwIGEgcmVnaXN0ZXIgKFJOMCkgd2hpY2ggaXMgdXNlZCB0byByZWR1Y2UgbnVtYmVyIG9mIGludGVybWVkaWF0ZSBzdGFsbHMgCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIE1fU1RSICAgICAgIHBEYXRhLHBEYXRhT25TdGFjawotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBTSU1EIG9wZXJhdGlvbnMgb24gZmlyc3QgdHdvIGNvbHVtbnModHdvIHJvd3Mgb2YgdGhlIG9yaWdpbmFsIG1hdHJpeCkKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgU0FERDE2ICAgICAgY29sU3VtMSx0ckNvbDAwLHRyQ29sMTAgICAgICAgICAgICAgICAgOy8vIChjMCtjMSkKLSAgICAgICAgU0FERDE2ICAgICAgY29sU3VtMix0ckNvbDIwLHRyQ29sMzAgICAgICAgICAgICAgICAgOy8vIChjMitjMykKLSAgICAgICAgU1NVQjE2ICAgICAgY29sRGlmZjEsdHJDb2wwMCx0ckNvbDEwICAgICAgICAgICAgICAgOy8vIChjMC1jMSkKLSAgICAgICAgU1NVQjE2ICAgICAgY29sRGlmZjIsdHJDb2wyMCx0ckNvbDMwICAgICAgICAgICAgICAgOy8vIChjMi1jMykKLSAgICAgICAgU0FERDE2ICAgICAgY29sT3AwMCxjb2xTdW0xLGNvbFN1bTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMStjMitjMykKLSAgICAgICAgU1NVQjE2ICAgICAgY29sT3AxMCxjb2xTdW0xLGNvbFN1bTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMS1jMi1jMykKLSAgICAgICAgU1NVQjE2ICAgICAgY29sT3AyMCxjb2xEaWZmMSxjb2xEaWZmMiAgICAgICAgICAgICAgOy8vIChjMC1jMS1jMitjMykKLSAgICAgICAgU0FERDE2ICAgICAgY29sT3AzMCxjb2xEaWZmMSxjb2xEaWZmMiAgICAgICAgICAgICAgOy8vIChjMC1jMStjMi1jMykKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBTSU1EIG9wZXJhdGlvbnMgb24gbmV4dCB0d28gY29sdW1ucyhuZXh0IHR3byByb3dzIG9mIHRoZSBvcmlnaW5hbCBtYXRyaXgpCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBwUVBEaXZUYWJsZSwgPWFybVZDTTRQMTBfUVBEaXZUYWJsZSAgICA7Ly8gUVAgRGl2aXNpb24gbG9vay11cC10YWJsZSBiYXNlIHBvaW50ZXIKLSAgICAgICAgU0FERDE2ICAgICAgY29sU3VtMSx0ckNvbDAyLHRyQ29sMTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMSkKLSAgICAgICAgU0FERDE2ICAgICAgY29sU3VtMix0ckNvbDIyLHRyQ29sMzIgICAgICAgICAgICAgICAgOy8vIChjMitjMykKLSAgICAgICAgU1NVQjE2ICAgICAgY29sRGlmZjEsdHJDb2wwMix0ckNvbDEyICAgICAgICAgICAgICAgOy8vIChjMC1jMSkKLSAgICAgICAgU1NVQjE2ICAgICAgY29sRGlmZjIsdHJDb2wyMix0ckNvbDMyICAgICAgICAgICAgICAgOy8vIChjMi1jMykKLSAgICAgICAgU0FERDE2ICAgICAgY29sT3AwMixjb2xTdW0xLGNvbFN1bTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMStjMitjMykKLSAgICAgICAgU1NVQjE2ICAgICAgY29sT3AxMixjb2xTdW0xLGNvbFN1bTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMS1jMi1jMykKLSAgICAgICAgTERSICAgICAgICAgcFFQTW9kVGFibGUsID1hcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlIDsvLyBRUCBNb2R1bG8gbG9vay11cC10YWJsZSBiYXNlIHBvaW50ZXIKLSAgICAgICAgTERSU0IgICAgICAgU2hpZnQsIFtwUVBEaXZUYWJsZSwgUVBdICAgICAgICAgICAgICAgOy8vIFNoaWZ0ID0gcFFQRGl2VGFibGVbUVBdCi0gICAgICAgIFNTVUIxNiAgICAgIGNvbE9wMjIsY29sRGlmZjEsY29sRGlmZjIgICAgICAgICAgICAgIDsvLyAoYzAtYzEtYzIrYzMpCi0gICAgICAgIFNBREQxNiAgICAgIGNvbE9wMzIsY29sRGlmZjEsY29sRGlmZjIgICAgICAgICAgICAgIDsvLyAoYzAtYzErYzItYzMpCi0gICAgICAgIAotICAgICAgICAgICAgICAgCi0gICAgICAgIExEUlNCICAgICAgIFNjYWxlLCBbcFFQTW9kVGFibGUsIFFQXSAgICAgICAgICAgICAgIDsvLyBTY2FsZSA9IHBRUE1vZFRhYmxlW1FQXSAKLSAgICAgICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyA8RGVxdWFudGl6ZT4gaW1wcm92ZXMgb24gdGhlIGMtcmVmZXJlbmNlIGNvZGUKLSAgICAgICAgOy8vIEJvdGggdGhlICBjYXNlcyBpLmUuLCBTaGlmdD49MCBhbmQgU2hpZnQ8MCBjYXNlcyBhcmUgY292ZXJlZCB0b2dldGhlcgotICAgICAgICA7Ly8gV2UgZG8gbm90IHN1YnRyYWN0IDIgZnJvbSBTaGlmdCBhcyBpbiBDIHJlZmVyZW5jZSwgaW5zdGVhZCBwZXJmb3JtIGEKLSAgICAgICAgOy8vIFNjYWxlIDw8IFNoaWZ0IG9uY2UgaW4gdGhlIGJlZ2lubmluZyBhbmQgZG8gYSByaWdodCBzaGlmdCBieSBhIAotICAgICAgICA7Ly8gY29uc3RhbnQgMiBhZnRlciB0aGUgTXVsdGlwbGljYXRpb24uIFRoZSB2YWx1ZSBvZiBSb3VuZCB3b3VsZCBiZSAyIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBCeSBkb2luZyB0aGlzIHdlIGF2aW9kIHRoZSBCcmFuY2hlcyByZXF1aXJlZCBhbmQgYWxzbyAKLSAgICAgICAgOy8vIHJlZHVjZSB0aGUgY29kZSBzaXplIHN1YnN0YW50aWFsbHkKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBSb3VuZCwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFJvdW5kID0gMgotICAgICAgICBMU0wgICAgICAgICBTY2FsZSwgU2NhbGUsIFNoaWZ0ICAgICAgICAgICAgICAgICAgICAgOy8vIFNjYWxlID0gU2NhbGUgPDwgU2hpZnQKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBSb3cgMQotICAgICAgICBTTUxBQkIgIHRlbXAxLCBjb2xPcDAwLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAxID0gQihjMHcwKSAqIFNjYWxlICsgUm91bmQKLSAgICAgICAgU01MQUJCICB0ZW1wMywgY29sT3AwMiwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMyA9IEIoYzF3MCkgKiBTY2FsZSArIFJvdW5kCi0gICAgICAgIFNNTEFUQiAgdGVtcDIsIGNvbE9wMDAsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDIgPSBUKGMwdzApICogU2NhbGUgKyBSb3VuZAotICAgICAgICBTTUxBVEIgIHRlbXA0LCBjb2xPcDAyLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXA0ID0gVChjMXcwKSAqIFNjYWxlICsgUm91bmQKLSAgICAgICAgCi0gICAgICAgIEFTUiAgICAgdGVtcDEsIHRlbXAxLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVtcDEgPSBUZW1wMSA+PiAyCi0gICAgICAgIEFTUiAgICAgdGVtcDMsIHRlbXAzLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVtcDMgPSBUZW1wMyA+PiAyCi0gICAgICAgIFBLSEJUICAgb3V0MDAsICB0ZW1wMSwgdGVtcDIsIExTTCAjMTQgICAgICAgICAgICAgICA7Ly8gYzB3MCAgPSB8IFRlbXAyIHwgVGVtcDEgfAotICAgICAgICBQS0hCVCAgIG91dDAyLCAgdGVtcDMsIHRlbXA0LCBMU0wgIzE0ICAgICAgICAgICAgICAgOy8vIGMxdzAgID0gfCBUZW1wMiB8IFRlbXAxIHwKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gUm93IDIKLSAgICAgICAgU01MQUJCICB0ZW1wMSwgY29sT3AxMCwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMSA9IEIoYzB3MCkgKiBTY2FsZSArIFJvdW5kCi0gICAgICAgIFNNTEFCQiAgdGVtcDMsIGNvbE9wMTIsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDMgPSBCKGMxdzApICogU2NhbGUgKyBSb3VuZAotICAgICAgICBTTUxBVEIgIHRlbXAyLCBjb2xPcDEwLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAyID0gVChjMHcwKSAqIFNjYWxlICsgUm91bmQKLSAgICAgICAgU01MQVRCICB0ZW1wNCwgY29sT3AxMiwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wNCA9IFQoYzF3MCkgKiBTY2FsZSArIFJvdW5kCi0gICAgICAgIAotICAgICAgICBBU1IgICAgIHRlbXAxLCB0ZW1wMSwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlbXAxID0gVGVtcDEgPj4gMgotICAgICAgICBBU1IgICAgIHRlbXAzLCB0ZW1wMywgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlbXAzID0gVGVtcDMgPj4gMgotICAgICAgICBQS0hCVCAgIG91dDEwLCAgdGVtcDEsIHRlbXAyLCBMU0wgIzE0ICAgICAgICAgICAgICAgOy8vIGMwdzAgID0gfCBUZW1wMiB8IFRlbXAxIHwKLSAgICAgICAgUEtIQlQgICBvdXQxMiwgIHRlbXAzLCB0ZW1wNCwgTFNMICMxNCAgICAgICAgICAgICAgIDsvLyBjMXcwICA9IHwgVGVtcDIgfCBUZW1wMSB8Ci0gICAgICAgIAotICAgICAgICA7Ly8gUm93IDMKLSAgICAgICAgU01MQUJCICB0ZW1wMSwgY29sT3AyMCwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMSA9IEIoYzB3MCkgKiBTY2FsZSArIFJvdW5kCi0gICAgICAgIFNNTEFCQiAgdGVtcDMsIGNvbE9wMjIsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDMgPSBCKGMxdzApICogU2NhbGUgKyBSb3VuZAotICAgICAgICBTTUxBVEIgIHRlbXAyLCBjb2xPcDIwLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAyID0gVChjMHcwKSAqIFNjYWxlICsgUm91bmQKLSAgICAgICAgU01MQVRCICB0ZW1wNCwgY29sT3AyMiwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wNCA9IFQoYzF3MCkgKiBTY2FsZSArIFJvdW5kCi0gICAgICAgIAotICAgICAgICBBU1IgICAgIHRlbXAxLCB0ZW1wMSwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlbXAxID0gVGVtcDEgPj4gMiAKLSAgICAgICAgQVNSICAgICB0ZW1wMywgdGVtcDMsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZW1wMyA9IFRlbXAzID4+IDIKLSAgICAgICAgUEtIQlQgICBvdXQyMCwgIHRlbXAxLCB0ZW1wMiwgTFNMICMxNCAgICAgICAgICAgICAgIDsvLyBjMHcwICA9IHwgVGVtcDIgfCBUZW1wMSB8Ci0gICAgICAgIFBLSEJUICAgb3V0MjIsICB0ZW1wMywgdGVtcDQsIExTTCAjMTQgICAgICAgICAgICAgICA7Ly8gYzF3MCAgPSB8IFRlbXAyIHwgVGVtcDEgfAotICAgICAgICAKLSAgICAgICAgOy8vIFJvdyA0Ci0gICAgICAgIFNNTEFCQiAgdGVtcDEsIGNvbE9wMzAsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDEgPSBCKGMwdzApICogU2NhbGUgKyBSb3VuZAotICAgICAgICBTTUxBQkIgIHRlbXAzLCBjb2xPcDMyLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAzID0gQihjMXcwKSAqIFNjYWxlICsgUm91bmQKLSAgICAgICAgU01MQVRCICB0ZW1wMiwgY29sT3AzMCwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMiA9IFQoYzB3MCkgKiBTY2FsZSArIFJvdW5kCi0gICAgICAgIFNNTEFUQiAgdGVtcDQsIGNvbE9wMzIsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDQgPSBUKGMxdzApICogU2NhbGUgKyBSb3VuZAotICAgICAgICAKLSAgICAgICAgTV9MRFIgICBwRGF0YSxwRGF0YU9uU3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBSZXN0b3JlIHBEYXRhIHBvaW50ZXIgZnJvbSBzdGFjawotICAgICAgICBBU1IgICAgIHRlbXAxLCB0ZW1wMSwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlbXAxID0gVGVtcDEgPj4gMgotICAgICAgICBBU1IgICAgIHRlbXAzLCB0ZW1wMywgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlbXAzID0gVGVtcDMgPj4gMgotICAgICAgICBQS0hCVCAgIG91dDMwLCAgdGVtcDEsIHRlbXAyLCBMU0wgIzE0ICAgICAgICAgICAgICAgOy8vIGMwdzAgID0gfCBUZW1wMiB8IFRlbXAxIHwKLSAgICAgICAgUEtIQlQgICBvdXQzMiwgIHRlbXAzLCB0ZW1wNCwgTFNMICMxNCAgICAgICAgICAgICAgIDsvLyBjMXcwICA9IHwgVGVtcDIgfCBUZW1wMSB8Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vIFN0b3JlIGFsbCB0aGUgNHg0IHBpeGVscwotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLXN0b3JlX2NvZWZmCi0gICAgICAgIAotICAgICAgICBTVE1JQSAgIHBEYXRhLHtvdXQwMCxvdXQwMixvdXQxMCxvdXQxMixvdXQyMCxvdXQyMixvdXQzMCxvdXQzMn0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgCi0gICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCi0gICAgICAgIAotICAgICAgIAotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAotICAgICAgICBNX0VORCAgICAgICAgCi0gICAgICAgIAotICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9BUk0xMTM2SlMgICAgICAgIAotICAgIAotCi07Ly8gU3RhdGljIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKLQotOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQotICAgIAotICAgICAgICAKLQotCi07Ly8gRnVuY3Rpb246IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyCi0gICAgCi07Ly9JbnB1dCBSZWdpc3RlcnMKLXBwU3JjICAgICAgICAgICAgICAgUk4gIDAKLXBEc3QgICAgICAgICAgICAgICAgUk4gIDEKLVFQUjIgICAgICAgICAgICAgICAgUk4gIDIKLQotOy8vT3V0cHV0IFJlZ2lzdGVycwotcmVzdWx0ICAgICAgICAgICAgICBSTiAgMAotCi07Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycwotcERzdFI0ICAgICAgICAgICAgICBSTiAgNAotcERzdFIwICAgICAgICAgICAgICBSTiAgMAotUVBSMSAgICAgICAgICAgICAgICBSTiAgMQotUVBSNSAgICAgICAgICAgICAgICBSTiAgNQotCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0gICAgCi0gICAgSUYgQVJNMTEzNkpTCi0gICAgICAgCi0gICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KLSAgICAgICAgCi0KLSAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIscjUKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgcERzdFI0LHBEc3QgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNhdmluZyByZWdpc3RlciByMQotICAgICAgICBNT1YgICAgIFFQUjUsUVBSMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTYXZpbmcgcmVnaXN0ZXIgcjIKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0Ci0gICAgICAgIAotICAgICAgICBNT1YgICAgIHBEc3RSMCxwRHN0UjQgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXR0aW5nIHVwIHJlZ2lzdGVyIHIwCi0gICAgICAgIE1PViAgICAgUVBSMSxRUFI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldHRpbmcgdXAgcmVnaXN0ZXIgcjEKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAKLSAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKLSAgICAgICAgTU9WICAgICByZXN1bHQsI09NWF9TdHNfTm9FcnIgICAgICAgIAotICAgICAgIAotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAotICAgICAgICBNX0VORAotICAgICAgICAKLSAgICAgICAgICAgIAotICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9BUk0xMTM2SlMgIAotICAgIAotCi0gICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU5ZTc1Mi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqCi0gKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzLmgKLSAqIERlc2NyaXB0aW9uOiBEZWNsYXJlcyBUYWJsZXMgdXNlZCBmb3IgSHVmZmZtYW4gY29kaW5nIGFuZCBkZWNvZGluZyAKLSAqICAgICAgICAgICAgICBpbiBNUDRQMiBjb2RlYy4KLSAqCi0gKi8KLSAKLSNpZm5kZWYgX09NWEhVRkZUQUJfSF8KLSNkZWZpbmUgX09NWEhVRkZUQUJfSF8KLQotCi1leHRlcm4gY29uc3QgT01YX1UxNiBhcm1WQ000UDJfSW50cmFWbGNMMEwxWzIwMF07Ci0KLQotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX0ludGVyVmxjTDBMMVsyMDBdOwotCi1leHRlcm4gY29uc3QgT01YX1UxNiBhcm1WQ000UDJfYUludHJhRENMdW1hQ2hyb21hSW5kZXhbNjRdOwotLy9leHRlcm4gY29uc3QgT01YX1UxNiBhcm1WQ000UDJfYUludHJhRENDaHJvbWFJbmRleFszMl07Ci1leHRlcm4gY29uc3QgT01YX1UxNiBhcm1WQ000UDJfYVZsY01WRFsxMjRdOwotCi1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTDFMTUFYWzczXTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMMVJNQVhbMzVdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMEwxTE1BWFs1M107Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTDFSTUFYWzQwXQotCi0jZW5kaWYgLyogX09NWEhVRkZUQUJfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NmJhMDQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqCi0gKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuaAotICogRGVzY3JpcHRpb246IERlY2xhcmVzIFRhYmxlcyB1c2VkIGZvciBaaWd6YWcgc2NhbiBpbiBNUDRQMiBjb2RlYy4KLSAqCi0gKi8KLSAKLSNpZm5kZWYgX09NWFpJR1pBR1RBQl9ICi0jZGVmaW5lIF9PTVhaSUdaQUdUQUJfSAotCi1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiBbMTkyXTsKLS8vZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUhvcml6b250YWxaaWd6YWdTY2FuIFs2NF07Ci0vL2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FWZXJ0aWNhbFppZ3phZ1NjYW4gWzY0XTsKLQotI2VuZGlmIC8qIF9PTVhaSUdaQUdUQUJfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MWQ0NDEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOyAvKioKLTsgKiAKLTsgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfQ2xpcDhfcy5zCi07ICogT3Blbk1BWCBETDogdjEuMC4yCi07ICogUmV2aXNpb246ICAgOTY0MQotOyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07ICogCi07ICogCi07ICogCi07ICoKLTsgKiBEZXNjcmlwdGlvbjogCi07ICogQ29udGFpbnMgbW9kdWxlIGZvciBDbGlwcGluZyAxNiBiaXQgdmFsdWUgdG8gWzAsMjU1XSBSYW5nZQotOyAqLyAKLQotICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgIAotCi0gICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0gICAgICAgIAotICAgICAKLSAgICAgIElGIEFSTTExMzZKUwotIAotOy8vSW5wdXQgQXJndW1lbnRzCi0KLXBTcmMgICAgICAgICAgICAgICAgIFJOIDAKLXBEc3QgICAgICAgICAgICAgICAgIFJOIDEKLXN0ZXAgICAgICAgICAgICAgICAgIFJOIDIKLQotOy8vIExvY2FsIHZhcmlhYmxlcwotCi14MCAgICAgICAgICAgICAgICAgICBSTiAzCi14MSAgICAgICAgICAgICAgICAgICBSTiA0Ci14MiAgICAgICAgICAgICAgICAgICBSTiA1Ci14MyAgICAgICAgICAgICAgICAgICBSTiA2Ci0KLUNvdW50ICAgICAgICAgICAgICAgIFJOIDE0Ci0gICAgIAotICAgICAgICAKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDJfQ2xpcDgscjYKLSAgICAgICAKLQotICAgICAgICBNT1YgICAgICAgICAgQ291bnQsIzgKLWxvb3AKLQotICAgICAgICBMRE1JQSAgICAgICAgcFNyYyEse3gwLCB4MX0KLSAgICAgICAgU1VCUyAgICAgICAgIENvdW50LENvdW50LCAjMSAgICAgICAgICA7Ly8gY291bnQgZG93bgotICAgICAgICBMRE1JQSAgICAgICAgcFNyYyEse3gyLCB4M30KLSAgICAgICAgVVNBVDE2ICAgICAgIHgwLCAjOCwgeDAgICAgICAgICAgICAgICAgIDsvLyBjbGlwIHR3byBzYW1wbGVzIHRvIFswLDI1NV0KLSAgICAgICAgVVNBVDE2ICAgICAgIHgxLCAjOCwgeDEgICAgICAgICAgICAgICAgIDsvLyBjbGlwIHR3byBzYW1wbGVzIHRvIFswLDI1NV0KLSAgICAgICAgU1RSQiAgICAgICAgIHgwLCBbcERzdF0KLSAgICAgICAgTU9WICAgICAgICAgIHgwLCB4MCwgTFNSICMxNgotICAgICAgICBTVFJCICAgICAgICAgeDAsIFtwRHN0LCMxXQotICAgICAgICBTVFJCICAgICAgICAgeDEsIFtwRHN0LCMyXQotICAgICAgICBNT1YgICAgICAgICAgeDEsIHgxLCBMU1IgIzE2Ci0gICAgICAgIFNUUkIgICAgICAgICB4MSwgW3BEc3QsIzNdCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIFVTQVQxNiAgICAgICB4MiwgIzgsIHgyICAgICAgICAgICAgICAgICA7Ly8gY2xpcCB0d28gc2FtcGxlcyB0byBbMCwyNTVdCi0gICAgICAgIFVTQVQxNiAgICAgICB4MywgIzgsIHgzICAgICAgICAgICAgICAgICA7Ly8gY2xpcCB0d28gc2FtcGxlcyB0byBbMCwyNTVdCi0gICAgICAgIFNUUkIgICAgICAgICB4MiwgW3BEc3QsIzRdCi0gICAgICAgIE1PViAgICAgICAgICB4MiwgeDIsIExTUiAjMTYKLSAgICAgICAgU1RSQiAgICAgICAgIHgyLCBbcERzdCwjNV0KLSAgICAgICAgU1RSQiAgICAgICAgIHgzLCBbcERzdCwjNl0KLSAgICAgICAgTU9WICAgICAgICAgIHgzLCB4MywgTFNSICMxNgotICAgICAgICBTVFJCICAgICAgICAgeDMsIFtwRHN0LCM3XQotICAgICAgICBBREQgICAgICAgICAgcERzdCxwRHN0LHN0ZXAgICAgICAgICAgICAgOy8vIEluY3JlbWVudCBwRHN0IGJ5IHN0ZXAgdmFsdWUKLSAgICAgICAgIAotICAgICAgICBCR1QgICAgICAgICAgbG9vcCAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbnRpbnVlIGxvb3AgdW50aWwgQ291bnQgcmVhY2hlcyA2NCAKLQotICAgICAgICBNX0VORAotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZmNWJlZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDEyICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07LyoqCi07ICogCi07ICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zCi07ICogT3Blbk1BWCBETDogdjEuMC4yCi07ICogUmV2aXNpb246ICAgOTY0MQotOyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07ICogCi07ICogCi07ICogCi07ICoKLTsgKiBEZXNjcmlwdGlvbjogCi07ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKLTsgKiBmb3IgaW50ZXIsIGludHJhIGJsb2NrLgotOyAqCi07ICoKLTsgKgotOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZQotOyAqCi07ICogRGVzY3JpcHRpb246Ci07ICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIAotOyAqCi07ICogCi07ICoKLTsgKiAKLTsgKi8KLQotCi0gICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKLQotCi0gICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0gICAgIAotCi0KLQotICAgICBJRiBBUk0xMTM2SlMKLSAgICAgCi0gICAgICAgIAotCi0KLQotOy8vSW5wdXQgQXJndW1lbnRzCi0KLXBwQml0U3RyZWFtICAgICAgICAgIFJOIDAKLXBCaXRPZmZzZXQgICAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICAgICAgIFJOIDIKLXNob3J0VmlkZW9IZWFkZXIgICAgIFJOIDMKLQotCi07Ly9Mb2NhbCBWYXJpYWJsZXMKLQotUmV0dXJuICAgICAgICAgICAgICAgUk4gMAotCi1wVmxjVGFibGVMMEwxICAgICAgICBSTiA0Ci1wTE1BWFRhYmxlTDBMMSAgICAgICBSTiA0Ci1wUk1BWFRhYmxlTDBMMSAgICAgICBSTiA0Ci1wWmlnemFnVGFibGUgICAgICAgICBSTiA0Ci0KLWZ0eXBlICAgICAgICAgICAgICAgIFJOIDAKLXRlbXAzICAgICAgICAgICAgICAgIFJOIDQKLXRlbXAgICAgICAgICAgICAgICAgIFJOIDUKLUNvdW50ICAgICAgICAgICAgICAgIFJOIDYKLUVzY2FwZSAgICAgICAgICAgICAgIFJOIDUKLQotOy8vIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyCi16aWd6YWcgICAgICAgICAgICAgICBSTiAwCi1zdG9yZUxldmVsICAgICAgICAgICBSTiAxCi10ZW1wMiAgICAgICAgICAgICAgICBSTiA0Ci10ZW1wMSAgICAgICAgICAgICAgICBSTiA1Ci1zaWduICAgICAgICAgICAgICAgICBSTiA1Ci1MYXN0ICAgICAgICAgICAgICAgICBSTiA3Ci1zdG9yZVJ1biAgICAgICAgICAgICBSTiAxNAotCi0KLXBhY2tSZXRJbmRleCAgICAgICAgIFJOIDUKLQotCi1tYXJrZXJiaXQgICAgICAgICAgICBSTiA1Ci0KLTsvLyBTY3JhdGNoIFJlZ2lzdGVycwotCi1SQml0U3RyZWFtICAgICAgICAgICBSTiA4Ci1SQml0QnVmZmVyICAgICAgICAgICBSTiA5Ci1SQml0Q291bnQgICAgICAgICAgICBSTiAxMAotCi1UMSAgICAgICAgICAgICAgICAgICBSTiAxMQotVDIgICAgICAgICAgICAgICAgICAgUk4gMTIKLUxSICAgICAgICAgICAgICAgICAgIFJOIDE0ICAgICAgICAKLSAgICAgICAgCi0KLQotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBwQml0U3RyZWFtLDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwT2Zmc2V0LDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBMaW5rUmVnaXN0ZXIsNCAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUKLQotICAgICAgICA7Ly8gZ2V0IHRoZSB0YWJsZSBhZGRyZXNzZXMgZnJvbSBzdGFjayAgICAgICAKLSAgICAgICAgTV9BUkcgICAgICAgICAgIHBwVmxjVGFibGVMMEwxLDQKLSAgICAgICAgTV9BUkcgICAgICAgICAgIHBwTE1BWFRhYmxlTDBMMSw0Ci0gICAgICAgIE1fQVJHICAgICAgICAgICBwcFJNQVhUYWJsZUwwTDEsNAotICAgICAgICBNX0FSRyAgICAgICAgICAgcHBaaWd6YWdUYWJsZSw0Ci0gICAgICAgIAotICAgICAgICA7Ly8gU3RvcmUgQUxMIHplcm9zIGF0IHBEc3QKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6ZSBDb3VudCB0byB6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgICAgIExhc3QsIzAKLSAgICAgICAgTV9TVFIgICAgICAgICAgIExSLHBMaW5rUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBMaW5rIFJlZ2lzdGVyIG9uIFN0YWNrCi0gICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wMiwjMAotICAgICAgICBNT1YgICAgICAgICAgICAgTFIsIzAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gSW5pdGlhbGl6ZSB0aGUgTWFjcm8gYW5kIFN0b3JlIGFsbCB6ZXJvcyB0byBwRHN0IAotICAKLSAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgTV9CRF9JTklUMCAgICAgIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBSQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQgIAotICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9Ci0gICAgICAgIE1fQkRfSU5JVDEgICAgICBUMSwgVDIsIFQyCi0gICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KLSAgICAgICAgTV9CRF9JTklUMiAgICAgIFQxLCBUMiwgVDIKLSAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQotICAgICAgICBNX1NUUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHBwQml0c3RyZWFtIG9uIHN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9Ci0gICAgICAgIE1fU1RSICAgICAgICAgICBwQml0T2Zmc2V0LHBwT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcEJpdE9mZnNldCBvbiBzdGFjawotICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9Ci0gICAgICAgIAotICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9Ci0gICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KLSAKLSAgICAgICAgCi0gICAgICAgIFNVQiAgICAgICAgICAgICBwRHN0LHBEc3QsIzEyOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUmVzdG9yZSBwRHN0Ci0KLSAgICAgICAgOy8vIFRoZSBhcm1WQ000UDJfR2V0VkxDQml0cyBiZWdpbnMKLQotZ2V0VkxDYml0cwotICAgICAgICAKLSAgICAgICAgTV9CRF9MT09LOCAgICAgIEVzY2FwZSw3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIEVzY2FwZSBWYWx1ZQotICAgICAgICBMU1IgICAgICAgICAgICAgRXNjYXBlLEVzY2FwZSwjMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBDTVAgICAgICAgICAgICAgRXNjYXBlLCMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNoZWNrIGZvciBlc2NhcGUgbW9kZQotICAgICAgICBNT1ZORSAgICAgICAgICAgZnR5cGUsIzAKLSAgICAgICAgQk5FICAgICAgICAgICAgIG5vdEVzY2FwZW1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggaWYgbm90IGluIEVzY2FwZSBtb2RlIDMKLQotICAgICAgICBNX0JEX1ZTS0lQOCAgICAgIzcsVDEKLSAgICAgICAgQ01QICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBzaG9ydFZpZGVvSGVhZGVyIGZsYWcgdG8ga25vdyB0aGUgdHlwZSBvZiBFc2NhcGUgbW9kZQotICAgICAgICBCRVEgICAgICAgICAgICAgZW5kRmlsbFZMRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIEVzY2FwZSBNb2RlIDQKLQotICAgICAgICBNX0JEX1JFQUQ4ICAgICAgTGFzdCwxLFQxCi0gICAgICAgIE1fQkRfUkVBRDggICAgICBzdG9yZVJ1biw2LFQxCi0gICAgICAgIE1fQkRfUkVBRDggICAgICBzdG9yZUxldmVsLDgsVDEKLQotICAgICAgICAgICAKLSAgICAgICAgOy8vIENoZWNrIHdoZXRoZXIgdGhlIFJlc2VydmVkIHZhbHVlcyBmb3IgTGV2ZWwgYXJlIHVzZWQgYW5kIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlIGlmIGl0IGlzIHNvCi0KLSAgICAgICAgVEVRICAgICAgICAgICAgIHN0b3JlTGV2ZWwsIzAKLSAgICAgICAgVEVRTkUgICAgICAgICAgIHN0b3JlTGV2ZWwsIzEyOCAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IKLQotICAgICAgICBBREQgICAgICAgICAgICAgdGVtcDIsc3RvcmVSdW4sQ291bnQKLSAgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAyLCM2NAotICAgICAgICBCR0UgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGVycm9yIGlmIENvdW50K3N0b3JlUnVuID49IDY0Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgYWRkcmVzcyBvZiB6aWd6YWdUYWJsZQotICAgICAgICAKLSAgICAgICAgTV9MRFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkaW5nIHRoZSBBZGRyZXNzIG9mIFppZ3phZyB0YWJsZQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcgotICAgICAgICAgICAgICAgIAotICAgICAgICBTWFRCICAgICAgICAgICAgc3RvcmVMZXZlbCxzdG9yZUxldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNpZ24gRXh0ZW5kIHN0b3JlTGV2ZWwgdG8gMzIgYml0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gVG8gUmVmbGVjdCBSdW5sZW5ndGgKLQotICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsc3RvcmVSdW4KLSAgICAgICAgTERSQiAgICAgICAgICAgIHppZ3phZyxbcFppZ3phZ1RhYmxlLENvdW50XQotICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsIzEKLSAgICAgICAgU1RSSCAgICAgICAgICAgIHN0b3JlTGV2ZWwsW3BEc3QsemlnemFnXSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSBMZXZlbAotICAgICAgICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgICAgIEV4aXRPawotICAgICAgIAotICAgICAgICAKLQotZW5kRmlsbFZMRAotICAgICAgICAKLSAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBGdHlwZSggRXNjYXBlIE1vZGUpIHZhbHVlIGJhc2VkIG9uIHRoZSB0d28gc3VjY2Vzc2l2ZSBiaXRzIGluIHRoZSBiaXRzdHJlYW0KLSAgICAgCi0gICAgICAgIE1fQkRfUkVBRDggICAgICB0ZW1wMSwxLFQxICAgICAgICAgICAKLSAgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwICAgIAotICAgICAgICBNT1ZFUSAgICAgICAgICAgZnR5cGUsIzEKLSAgICAgICAgQkVRICAgICAgICAgICAgIG5vdEVzY2FwZW1vZGUKLSAgICAgICAgTV9CRF9SRUFEOCAgICAgIHRlbXAxLDEsVDEKLSAgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMxCi0gICAgICAgIE1PVkVRICAgICAgICAgICBmdHlwZSwjMwotICAgICAgICBNT1ZORSAgICAgICAgICAgZnR5cGUsIzIKLSAgICAgICAgCi0KLW5vdEVzY2FwZW1vZGUKLQotICAgICAgICA7Ly8gTG9hZCBvcHRpbWl6ZWQgcGFja2VkIFZMQyB0YWJsZSB3aXRoIGxhc3Q9MCBhbmQgTGFzdD0xCi0gICAgICAgIAotICAgICAgICBNX0xEUiAgICAgICAgICAgcFZsY1RhYmxlTDBMMSxwcFZsY1RhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgQ29tYmluZWQgVkxDIFRhYmxlCi0gICAgICAgICAgICAgICAgCi0gICAgICAgCi0gICAgICAgIENNUCAgICAgICAgICAgICBmdHlwZSwjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgZnR5cGUgPj0zIGdldCBwZXJmb3JtIEZpeGVkIExlbmd0aCBEZWNvZGluZyAoRXNjYXBlIE1vZGUgMykKLSAgICAgICAgQkdFICAgICAgICAgICAgIEVzY2FwZU1vZGUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFbHNlIGNvbnRpbnVlIG5vcm1hbCBWTEMgRGVjb2RpbmcKLSAgICAgICAgCi0gICAgICAgIDsvLyBWYXJpYWJsZSBsZW5naCBkZWNvZGluZywgImFybVVuUGFja1ZMQzMyIiAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNX0JEX1ZMRCAgICAgICAgcGFja1JldEluZGV4LFQxLFQyLHBWbGNUYWJsZUwwTDEsNCwyCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgICAgIHRlbXAzLD0weEZGRgotICAgICAgICAKLSAgICAgICAgQ01QICAgICAgICAgICAgIHBhY2tSZXRJbmRleCx0ZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBmb3IgaW52YWxpZCBzeW1ib2wKLSAgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpZiBpbnZhbGlkIHN5bWJvbCBvY2N1cnMgZXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UKLSAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgICAgICBMYXN0LHBhY2tSZXRJbmRleCwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gR2V0IExhc3QgZnJvbSBwYWNrZWQgSW5kZXgKLSAgICAgICAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgCi0KLSAgICAgICAgTFNSICAgICAgICAgICAgIHN0b3JlUnVuLHBhY2tSZXRJbmRleCwjNyAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBHZXQgUnVuIFZhbHVlIGZyb20gUGFja2VkIGluZGV4Ci0gICAgICAgIEFORCAgICAgICAgICAgICBzdG9yZUxldmVsLHBhY2tSZXRJbmRleCwjMHg3YyAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmVMZXZlbD1wYWNrUmV0SW5kZXhbMi02XSxzdG9yZUxldmVsWzAtMV09MCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAKLSAgICAgICAgTV9MRFIgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLHBwTE1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIExNQVggdGFibGUKLSAgICAgICAgICAgICAgCi0gICAgICAgCi0gICAgICAgIExTUiAgICAgICAgICAgICBzdG9yZUxldmVsLHN0b3JlTGV2ZWwsIzIgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTGV2ZWwgdmFsdWUKLQotICAgICAgICBDTVAgICAgICAgICAgICAgZnR5cGUsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQk5FICAgICAgICAgICAgIGZ0eXBlMgotICAgICAgICAKLSAgICAgICAgOy8vIGZ0eXBlPT0xOyBFc2NhcGUgbW9kZSA9MQotICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgICAgdGVtcDEsIHBMTUFYVGFibGVMMEwxLCBMYXN0LCBMU0wjNCAgICAgICAgICAgICAgOy8vIElmIHRoZSBMYXN0PTEgYWRkIDMyIHRvIHRhYmxlIGFkZHJlc3MKLSAgICAgICAgTERSQiAgICAgICAgICAgIHRlbXAxLFt0ZW1wMSxzdG9yZVJ1bl0KLQotICAgICAgIAotICAgICAgICBBREQgICAgICAgICAgICAgc3RvcmVMZXZlbCx0ZW1wMSxzdG9yZUxldmVsICAgICAgICAgICAgICAgICAgICAgCi0KLWZ0eXBlMgotCi0gICAgICAgIDsvLyBmdHlwZSA9MjsgRXNjYXBlIG1vZGUgPTIKLSAgICAgICAgCi0gICAgICAgIE1fTERSICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSxwcFJNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBSTUFYIFRhYmxlIAotICAgICAgICAgICAgICAgIAotICAgICAgICBDTVAgICAgICAgICAgICAgZnR5cGUsIzIKLSAgICAgICAgQk5FICAgICAgICAgICAgIEZpbGxWTERMMQotICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgICAgIHRlbXAxLCBwUk1BWFRhYmxlTDBMMSwgTGFzdCwgTFNMIzQgICAgICAgICAgICAgICA7Ly8gSWYgTGFzdD0xIGFkZCAzMiB0byB0YWJsZSBhZGRyZXNzCi0gICAgICAgIFNVQiAgICAgICAgICAgICB0ZW1wMixzdG9yZUxldmVsLCMxCi0gICAgICAgIExEUkIgICAgICAgICAgICB0ZW1wMSxbdGVtcDEsdGVtcDJdCi0KLSAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgICAgIHN0b3JlUnVuLHN0b3JlUnVuLCMxCi0gICAgICAgIEFERCAgICAgICAgICAgICBzdG9yZVJ1bix0ZW1wMQotICAgICAgICAKLUZpbGxWTERMMSAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyCi0KLSAgICAgICAgTV9MRFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgYWRkcmVzcyBvZiB6aWd6YWdUYWJsZSAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgTV9CRF9SRUFEOCAgICAgIHNpZ24sMSxUMQotCi0gICAgICAgIENNUCAgICAgICAgICAgICBzaWduLCMxCi0gICAgICAgIFJTQkVRICAgICAgICAgICBzdG9yZUxldmVsLHN0b3JlTGV2ZWwsIzAKLSAKLSAgICAgICAgQUREICAgICAgICAgICAgIHRlbXAxLHN0b3JlUnVuLENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIFJ1biArIENvdW50IGV4Y2VlZHMgNjMKLSAgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCM2NAotICAgICAgICBCR0UgICAgICAgICAgICAgRXhpdEVycm9yCi0KLSAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIFRvIFJlZmxlY3QgUnVubGVuZ2h0Ci0KLSAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LHN0b3JlUnVuCi0gCi1zdG9yZUxldmVsTDEKLSAgICAgICAgCi0gICAgICAgIExEUkIgICAgICAgICAgICB6aWd6YWcsW3BaaWd6YWdUYWJsZSxDb3VudF0KLSAgICAgICAgQ01QICAgICAgICAgICAgIExhc3QsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiB0aGUgTGV2ZWwgdmFsIGlzIExhc3Qgbm9uIHplcm8gdmFsCi0gICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCwjMQotICAgICAgICBMU1IgICAgICAgICAgICAgTGFzdCxMYXN0LCMxCi0gICAgICAgIFNUUkggICAgICAgICAgICBzdG9yZUxldmVsLFtwRHN0LHppZ3phZ10gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgCi0gICAgICAgIEJORSAgICAgICAgICAgICBlbmQKLSAgICAgICAgCi0gICAgICAgIEIgICAgICAgICAgICAgICBFeGl0T2sKLSAKLQotCi0gICAgICAgIDsvLyBGaXhlZCBMZW5naCBEZWNvZGluZyBFc2NhcGUgTW9kZSAzCi0KLUVzY2FwZU1vZGUzCi0KLSAgICAgICAgTV9CRF9SRUFEOCAgICAgIExhc3QsMSxUMQotICAgICAgICBNX0JEX1JFQUQ4ICAgICAgc3RvcmVSdW4sNixUMQotICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgICAgIHRlbXAyLHN0b3JlUnVuLENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBSdW4gKyBDb3VudCBleGNlZWRzIDYzCi0gICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMiwjNjQKLSAgICAgICAgQkdFICAgICAgICAgICAgIEV4aXRFcnJvcgotCi0gICAgICAgIE1fQkRfUkVBRDggICAgICBtYXJrZXJiaXQsMSxUMQotICAgICAgICBURVEgICAgICAgICAgICAgbWFya2VyYml0LCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIG1hcmtlciBiaXQgaXMgemVybwotICAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yCi0gICAgICAgIAotICAgICAgICBNX0JEX1JFQUQxNiAgICAgc3RvcmVMZXZlbCwxMixUMQotCi0gICAgICAgIFRTVCAgICAgICAgICAgICBzdG9yZUxldmVsLCMweDgwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVzdCBpZiB0aGUgbGV2ZWwgaXMgbmVnYXRpdmUKLSAgICAgICAgU1VCTkUgICAgICAgICAgIHN0b3JlTGV2ZWwsc3RvcmVMZXZlbCwjNDA5NgotICAgICAgICBDTVAgICAgICAgICAgICAgc3RvcmVMZXZlbCwjMAotICAgICAgICBDTVBORSAgICAgICAgICAgc3RvcmVMZXZlbCwjLTIwNDgKLSAgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBMZXZlbD09MCBvciAgLTIwNDggCi0KLSAgICAgICAgTV9MRFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIGFkZHJlc3Mgb2YgemlnemFnVGFibGUKLSAgICAgICAgICAgICAgCi0gICAgICAgIE1fQkRfUkVBRDggICAgICBtYXJrZXJiaXQsMSxUMQotICAgICAgICAgICAKLQotICAgICAgICA7Ly8gYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIgKCBTaWduIG5vdCB1c2VkIGFzIHN0b3JlTGV2ZWwgaXMgcHJlcHJvY2Vzc2VkKQotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAKLQotICAgICAgICA7Ly8gVG8gUmVmbGVjdCBSdW4gTGVuZ3RoCi0KLSAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LHN0b3JlUnVuCi0KLQotIAotc3RvcmVMZXZlbExhc3QKLSAgICAgICAgCi0gICAgICAgIExEUkIgICAgICAgICAgICB6aWd6YWcsW3BaaWd6YWdUYWJsZSxDb3VudF0KLSAgICAgICAgQ01QICAgICAgICAgICAgIExhc3QsIzEKLSAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LCMxCi0gICAgICAgIFNUUkggICAgICAgICAgICBzdG9yZUxldmVsLFtwRHN0LHppZ3phZ10gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICBCTkUgICAgICAgICAgICAgZW5kIAotICAgICAgCi0gICAgICAgIEIgICAgICAgICAgICAgICBFeGl0T2sKLSAgICAgICAgCi1lbmQKLQotICAgICAgICBDTVAgICAgICAgICAgICAgQ291bnQsIzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vUnVuIHRoZSBMb29wIHVudGlsbCBDb3VudCByZWFjaGVzIDY0Ci0KLSAgICAgICAgQkxUICAgICAgICAgICAgIGdldFZMQ2JpdHMKLQotICAgICAgICAKLUV4aXRPawotICAgICAgICA7Ly8gRXhpdCBXaGVuIFZMQyBEZWNvZGluZyBpcyBkb25lIFN1Y2Nlc3NmdWxseSAKLSAgIAotICAgICAgICA7Ly8gTG9hZGluZyBwcEJpdFN0cmVhbSBhbmQgcEJpdE9mZnNldCBmcm9tIHN0YWNrCi0gICAgICAgIAotICAgICAgICBDTVAgICAgICAgICAgICAgTGFzdCwjMQotICAgICAgICBNX0xEUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtCi0gICAgICAgIE1fTERSICAgICAgICAgICBwQml0T2Zmc2V0LHBwT2Zmc2V0Ci0KLSAgICAgICAgOy8vRW5kaW5nIHRoZSBtYWNybwotCi0gICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0Ci0gICAgICAgICAgICAgCi0gICAgICAgIE1PVkVRICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTU9WTkUgICAgICAgICAgIFJldHVybiwjT01YX1N0c19FcnIKLSAgICAgICAgTV9MRFIgICAgICAgICAgIExSLHBMaW5rUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgdGhlIExpbmsgUmVnaXN0ZXIgQmFjawotICAgICAgICBCICAgICAgICAgICAgICAgZXhpdDIKLQotRXhpdEVycm9yCi0gICAgICAgIDsvLyBFeGl0IFdoZW4gYW4gRXJyb3Igb2NjdXJzIAotCi0gICAgICAgIE1fTERSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0KLSAgICAgICAgTV9MRFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBPZmZzZXQKLSAgICAgICAgOy8vRW5kaW5nIHRoZSBtYWNybwotCi0gICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0Ci0gICAgICAgIE1fTERSICAgICAgICAgICBMUixwTGlua1JlZ2lzdGVyCi0gICAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfRXJyCi0KLWV4aXQyCi0gICAgICAgCi0KLSAgICAgICAgTV9FTkQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZDg2ZWQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYworKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0gLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKLSAqIERlc2NyaXB0aW9uOiBDb250YWlucyBhbGwgdGhlIEh1ZmZtYW4gdGFibGVzIHVzZWQgaW4gTVBFRzQgY29kZWMKLSAqCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotCi0KLQotCi0vLyBDb250YWlucyBvcHRpbWl6ZWQgYW5kIFBhY2tlZCBWTEMgdGFibGVzIHdpdGggTGFzdD0wIGFuZCBMYXN0PTEKLQotLy8gICAgICAgICAgICAgIG9wdGltaXplZCBQYWNrZWQgVkxDIHRhYmxlIEVudHJ5IEZvcm1hdCAKLS8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIAotLy8gICAgICAgIDE1IDE0IDEzIDEyIDExIDEwIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyIDAxIDAwCi0vLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotLy8gICAgICAgfCAgTGVuICAgfCAgICAgICBSdW4gICAgICAgfCAgICAgTGV2ZWwgICAgfEwgfCAxIHwKLS8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0vLyAgICAgICB8ICAgICAgICAgICAgICAgIE9mZnNldCAgICAgICAgICAgICAgICAgICAgICB8IDAgfAotLy8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLS8vIElmIHRoZSB0YWJsZSBlbnRyeSBpcyBhIGxlYWYgZW50cnkgdGhlbiBiaXQgMCBzZXQ6Ci0vLyAgICBMZW4gICAgPSBOdW1iZXIgb2YgYml0cyBvdmVycmVhZCAgKDAgdG8gNykgIDMgYml0cwotLy8gICAgUnVuICAgID0gUnVuTGVuZ3RoIG9mIHRoZSBTeW1ib2wgICgwIHRvIDYzKSA2IGJpdHMKLS8vICAgIExldmVsICA9IExldmVsIG9mIHRoZSBTeW1ib2wgICAgICAoMCB0byAzMSkgNSBiaXRzCi0vLyAgICBMICAgICAgPSBMYXN0IFZhbHVlIG9mIHRoZSBTeW1ib2wgKDAgb3IgMSkgIDEgYml0Ci0vLwotLy8gSWYgdGhlIHRhYmxlIGVudHJ5IGlzIGFuIGludGVybmFsIG5vZGUgdGhlbiBiaXQgMCBpcyBjbGVhcjoKLS8vICAgIE9mZnNldCA9IE51bWJlciBvZiAoMTYtYml0KSBoYWxmIHdvcmRzIGZyb20gdGhlIHRhYmxlCi0vLyAgICAgICAgICAgICBzdGFydCB0byB0aGUgbmV4dCB0YWJsZSBub2RlCi0vLwotLy8gVGhlIHRhYmxlIGlzIGFjY2Vzc2VkIGJ5IHN1Y2Nlc3NpdmUgbG9va3VwIHVwIG9uIHRoZQotLy8gbmV4dCBTdGVwIGJpdHMgb2YgdGhlIGlucHV0IGJpdHN0cmVhbSB1bnRpbCBhIGxlYWYgbm9kZQotLy8gaXMgb2J0YWluZWQuIFRoZSBTdGVwIHNpemVzIGFyZSBzdXBwbGllZCB0byB0aGUgVkxEIG1hY3JvLgotCi0vLyBUaGUgVkxDIHRhYmxlcyB1c2VkIGZvciBJbnRyYSBhbmQgbm9uIGludGEgY29lZmZpY2llbnRzIGluIG5vbiBFc2NhcGUgbW9kZQotLy8gY29udGFpbnMgc3ltYm9scyB3aXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEuCi0vLyBJZiBhIHN5bWJvbCBpcyBub3QgZm91bmQgaW4gdGhlIHRhYmxlIGl0IHdpbGwgYmUgY29kZWQgYXMgMHhGRkYKLSAKLQotY29uc3QgT01YX1UxNiBhcm1WQ000UDJfSW50ZXJWbGNMMEwxWzIwMF0gPSB7Ci0gICAgMHgwMDIwLCAweDAxMDgsIDB4MDE0OCwgMHgwMTcwLCAweDAxNzgsIDB4MDE4MCwgMHgwMTg4LCAweDFiMDksCi0gICAgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDIxMDksIDB4MjEwOSwgMHgwMjA5LCAweDAwMTEsCi0gICAgMHgwMDI4LCAweDAwNjAsIDB4MDBiOCwgMHgwMGUwLCAweDAwMzAsIDB4MDA0OCwgMHgwMDUwLCAweDAwNTgsCi0gICAgMHgzZmZmLCAweDNmZmYsIDB4MDAzOCwgMHgwMDQwLCAweDIxMTUsIDB4MjExNSwgMHgyMDFkLCAweDIwMWQsCi0gICAgMHgyMDU5LCAweDIwNTksIDB4MjA1MSwgMHgyMDUxLCAweDFjMGQsIDB4MWIwZCwgMHgxYTBkLCAweDE5MGQsCi0gICAgMHgwOTExLCAweDA4MTEsIDB4MDcxMSwgMHgwNjExLCAweDA1MTEsIDB4MDMxOSwgMHgwMjE5LCAweDAxMjEsCi0gICAgMHgwMDY4LCAweDAwOTAsIDB4M2ZmZiwgMHgzZmZmLCAweDAwNzAsIDB4MDA3OCwgMHgwMDgwLCAweDAwODgsCi0gICAgMHgyMDYxLCAweDIwNjEsIDB4MjEyOSwgMHgyMTI5LCAweDM3MDksIDB4MzcwOSwgMHgzODA5LCAweDM4MDksCi0gICAgMHgzZDBkLCAweDNkMGQsIDB4M2UwZCwgMHgzZTBkLCAweDNmMGQsIDB4M2YwZCwgMHgyMDBkLCAweDIwMGQsCi0gICAgMHgwMDk4LCAweDAwYTAsIDB4MDBhOCwgMHgwMGIwLCAweDAxMzEsIDB4MDIyMSwgMHgwNDE5LCAweDA1MTksCi0gICAgMHgwNjE5LCAweDBhMTEsIDB4MTkwOSwgMHgxYTA5LCAweDIxMGQsIDB4MjIwZCwgMHgyMzBkLCAweDI0MGQsCi0gICAgMHgyNTBkLCAweDI2MGQsIDB4MjcwZCwgMHgyODBkLCAweDAwYzAsIDB4MDBjOCwgMHgwMGQwLCAweDAwZDgsCi0gICAgMHgwMDQ5LCAweDAwNDEsIDB4MzgwZCwgMHgzODBkLCAweDM3MGQsIDB4MzcwZCwgMHgzNjBkLCAweDM2MGQsCi0gICAgMHgzNTBkLCAweDM1MGQsIDB4MzQwZCwgMHgzNDBkLCAweDMzMGQsIDB4MzMwZCwgMHgzMjBkLCAweDMyMGQsCi0gICAgMHgwMGU4LCAweDAwZjAsIDB4MDBmOCwgMHgwMTAwLCAweDMxMGQsIDB4MzEwZCwgMHgyMDE1LCAweDIwMTUsCi0gICAgMHgzNjA5LCAweDM2MDksIDB4MzUwOSwgMHgzNTA5LCAweDM0MDksIDB4MzQwOSwgMHgzMzA5LCAweDMzMDksCi0gICAgMHgzMjA5LCAweDMyMDksIDB4MzEwOSwgMHgzMTA5LCAweDAxMTAsIDB4MDEzMCwgMHgwMTM4LCAweDAxNDAsCi0gICAgMHgwMTE4LCAweDAxMjAsIDB4MDEyOCwgMHgxMDBkLCAweDMwMDksIDB4MzAwOSwgMHgyZjA5LCAweDJmMDksCi0gICAgMHgyNDExLCAweDI0MTEsIDB4MjMxMSwgMHgyMzExLCAweDIwMzksIDB4MjAzOSwgMHgyMDMxLCAweDIwMzEsCi0gICAgMHgwZjBkLCAweDBlMGQsIDB4MGQwZCwgMHgwYzBkLCAweDBiMGQsIDB4MGEwZCwgMHgwOTBkLCAweDBlMDksCi0gICAgMHgwZDA5LCAweDAyMTEsIDB4MDExOSwgMHgwMDI5LCAweDAxNTAsIDB4MDE1OCwgMHgwMTYwLCAweDAxNjgsCi0gICAgMHgyODBkLCAweDI4MGQsIDB4MjcwZCwgMHgyNzBkLCAweDI2MGQsIDB4MjYwZCwgMHgyNTBkLCAweDI1MGQsCi0gICAgMHgyYzA5LCAweDJjMDksIDB4Yjc1OSwgMHhiNzU5LCAweDJhMDksIDB4MmEwOSwgMHgyMDIxLCAweDIwMjEsCi0gICAgMHgwNDBkLCAweDAzMGQsIDB4MGIzNSwgMHgwMTBkLCAweDA5MDksIDB4MDgwOSwgMHgwNzA5LCAweDA2MDksCi0gICAgMHgwMTExLCAweDAwMTksIDB4MjUwOSwgMHgyNTA5LCAweDI0MDksIDB4MjQwOSwgMHgyMzA5LCAweDIzMDkKLX07Ci0KLQotY29uc3QgT01YX1UxNiBhcm1WQ000UDJfSW50cmFWbGNMMEwxWzIwMF0gPSB7Ci0gICAgMHgwMDIwLCAweDAxMDgsIDB4MDE0OCwgMHgwMTcwLCAweDAxNzgsIDB4MDE4MCwgMHgwMTg4LCAweDBmMDksCi0gICAgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDIwMTEsIDB4MjAxMSwgMHgwMTA5LCAweDAwMTksCi0gICAgMHgwMDI4LCAweDAwNjAsIDB4MDBiOCwgMHgwMGUwLCAweDAwMzAsIDB4MDA0OCwgMHgwMDUwLCAweDAwNTgsCi0gICAgMHgzZmZmLCAweDNmZmYsIDB4MDAzOCwgMHgwMDQwLCAweDIwM2QsIDB4MjAzZCwgMHgyMDM1LCAweDIwMzUsCi0gICAgMHgyMGIxLCAweDIwYjEsIDB4MjBhOSwgMHgyMGE5LCAweDAyMTUsIDB4MDExZCwgMHgwMDJkLCAweDBkMDksCi0gICAgMHgwNTE5LCAweDA4MTEsIDB4MDQxOSwgMHgwMzIxLCAweDAyMjEsIDB4MDEzOSwgMHgwMGExLCAweDAwOTksCi0gICAgMHgwMDY4LCAweDAwOTAsIDB4M2ZmZiwgMHgzZmZmLCAweDAwNzAsIDB4MDA3OCwgMHgwMDgwLCAweDAwODgsCi0gICAgMHgyMGI5LCAweDIwYjksIDB4MjBjMSwgMHgyMGMxLCAweDIxNDEsIDB4MjE0MSwgMHgyOTExLCAweDI5MTEsCi0gICAgMHgyMzE1LCAweDIzMTUsIDB4MjQxNSwgMHgyNDE1LCAweDJmMGQsIDB4MmYwZCwgMHgzMDBkLCAweDMwMGQsCi0gICAgMHgwMDk4LCAweDAwYTAsIDB4MDBhOCwgMHgwMGIwLCAweDAwYzksIDB4MDBkMSwgMHgwMGQ5LCAweDAxNDksCi0gICAgMHgwNjE5LCAweDAxNTEsIDB4MDIyOSwgMHgwNzE5LCAweDBlMDksIDB4MDA0NSwgMHgwNTE1LCAweDA2MTUsCi0gICAgMHgxMTBkLCAweDEyMGQsIDB4MTMwZCwgMHgxNDBkLCAweDAwYzAsIDB4MDBjOCwgMHgwMGQwLCAweDAwZDgsCi0gICAgMHgwMDkxLCAweDAwODksIDB4MmUwZCwgMHgyZTBkLCAweDJkMGQsIDB4MmQwZCwgMHgyYzBkLCAweDJjMGQsCi0gICAgMHgyYjBkLCAweDJiMGQsIDB4MmEwZCwgMHgyYTBkLCAweDIxMTUsIDB4MjExNSwgMHgyMDI1LCAweDIwMjUsCi0gICAgMHgwMGU4LCAweDAwZjAsIDB4MDBmOCwgMHgwMTAwLCAweDJjMDksIDB4MmMwOSwgMHgyYjA5LCAweDJiMDksCi0gICAgMHgyNzExLCAweDI3MTEsIDB4MjYxMSwgMHgyNjExLCAweDI1MTEsIDB4MjUxMSwgMHgyMzE5LCAweDIzMTksCi0gICAgMHgyMjE5LCAweDIyMTksIDB4MjEzMSwgMHgyMTMxLCAweDAxMTAsIDB4MDEzMCwgMHgwMTM4LCAweDAxNDAsCi0gICAgMHgwMTE4LCAweDAxMjAsIDB4MDEyOCwgMHgwODBkLCAweDIxMjksIDB4MjEyOSwgMHgyMDgxLCAweDIwODEsCi0gICAgMHgyNDExLCAweDI0MTEsIDB4MjA3OSwgMHgyMDc5LCAweDIwNzEsIDB4MjA3MSwgMHgyMDY5LCAweDIwNjksCi0gICAgMHgxYmI1LCAweDA2MGQsIDB4MDAxZCwgMHhkM2Y5LCAweDA5MDksIDB4MDgwOSwgMHgwOTBkLCAweDAzMTEsCi0gICAgMHgwMTIxLCAweDAwNjEsIDB4MDA1OSwgMHgwMDUxLCAweDAxNTAsIDB4MDE1OCwgMHgwMTYwLCAweDAxNjgsCi0gICAgMHgyNDBkLCAweDI0MGQsIDB4MjMwZCwgMHgyMzBkLCAweDI2MDksIDB4MjYwOSwgMHgyNTBkLCAweDI1MGQsCi0gICAgMHgyNzA5LCAweDI3MDksIDB4MjIxMSwgMHgyMjExLCAweDIxMTksIDB4MjExOSwgMHgyMDQ5LCAweDIwNDksCi0gICAgMHgwMDE1LCAweDA1MDksIDB4MDIwZCwgMHgwMTBkLCAweDA0MDksIDB4MDMwOSwgMHgwMDQxLCAweDAwMzksCi0gICAgMHgwMTExLCAweDAwMzEsIDB4MjIwOSwgMHgyMjA5LCAweDIwMjksIDB4MjAyOSwgMHgyMDIxLCAweDIwMjEKLX07Ci0KLWNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX2FJbnRyYURDTHVtYUNocm9tYUluZGV4WzY0XSA9IHsKLSAgICAweDAwMjAsIDB4MDAwYiwgMHgyMDA5LCAweDIwMDksIDB4MjAwNywgMHgyMDA3LCAweDIwMDEsIDB4MjAwMSwKLSAgICAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywKLSAgICAweDAwMjgsIDB4MDAwZiwgMHgyMDBkLCAweDIwMGQsIDB4MDAzMCwgMHgwMDEzLCAweDIwMTEsIDB4MjAxMSwKLSAgICAweDAwMzgsIDB4MDAxNywgMHgyMDE1LCAweDIwMTUsIDB4M2ZmZiwgMHgzZmZmLCAweDIwMTksIDB4MjAxOSwKLQotCTB4MDAyMCwgMHgwMDA5LCAweDIwMDcsIDB4MjAwNywgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LAotICAgIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLAotICAgIDB4MDAyOCwgMHgwMDBkLCAweDIwMGIsIDB4MjAwYiwgMHgwMDMwLCAweDAwMTEsIDB4MjAwZiwgMHgyMDBmLAotICAgIDB4MDAzOCwgMHgwMDE1LCAweDIwMTMsIDB4MjAxMywgMHgxZmZmLCAweDAwMTksIDB4MjAxNywgMHgyMDE3Ci19OwotCi0KLWNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX2FWbGNNVkRbMTI0XSA9IHsKLSAgICAweDAwMTAsIDB4MDBmMCwgMHgwMDQzLCAweDAwM2YsIDB4NDA0MSwgMHg0MDQxLCAweDQwNDEsIDB4NDA0MSwKLSAgICAweDAwMTgsIDB4MDBkOCwgMHgwMDQ3LCAweDAwM2IsIDB4MDAyMCwgMHgwMDgwLCAweDAwYTgsIDB4MDBkMCwKLSAgICAweDAwMjgsIDB4MDA0OCwgMHgwMDcwLCAweDAwNzgsIDB4MWZmZiwgMHgwMDMwLCAweDAwMzgsIDB4MDA0MCwKLSAgICAweDAwODEsIDB4MDAwMSwgMHgwMDdmLCAweDAwMDMsIDB4MjA3ZCwgMHgyMDdkLCAweDIwMDUsIDB4MjAwNSwKLSAgICAweDIwN2IsIDB4MjA3YiwgMHgyMDA3LCAweDIwMDcsIDB4MDA1MCwgMHgwMDU4LCAweDAwNjAsIDB4MDA2OCwKLSAgICAweDIwNzksIDB4MjA3OSwgMHgyMDA5LCAweDIwMDksIDB4MjA3NywgMHgyMDc3LCAweDIwMGIsIDB4MjAwYiwKLSAgICAweDIwNzUsIDB4MjA3NSwgMHgyMDBkLCAweDIwMGQsIDB4MjA3MywgMHgyMDczLCAweDIwMGYsIDB4MjAwZiwKLSAgICAweDAwNzEsIDB4MDAxMSwgMHgwMDZmLCAweDAwMTMsIDB4MDA2ZCwgMHgwMDE1LCAweDAwNmIsIDB4MDAxNywKLSAgICAweDAwODgsIDB4MDA5MCwgMHgwMDk4LCAweDAwYTAsIDB4MDA2OSwgMHgwMDE5LCAweDAwNjcsIDB4MDAxYiwKLSAgICAweDAwNjUsIDB4MDAxZCwgMHgwMDYzLCAweDAwMWYsIDB4MDA2MSwgMHgwMDIxLCAweDAwNWYsIDB4MDAyMywKLSAgICAweDAwNWQsIDB4MDAyNSwgMHgwMDViLCAweDAwMjcsIDB4MDBiMCwgMHgwMGI4LCAweDAwYzAsIDB4MDBjOCwKLSAgICAweDAwNTksIDB4MDAyOSwgMHgwMDU3LCAweDAwMmIsIDB4MjA1NSwgMHgyMDU1LCAweDIwMmQsIDB4MjAyZCwKLSAgICAweDIwNTMsIDB4MjA1MywgMHgyMDJmLCAweDIwMmYsIDB4MjA1MSwgMHgyMDUxLCAweDIwMzEsIDB4MjAzMSwKLSAgICAweDIwNGYsIDB4MjA0ZiwgMHgyMDMzLCAweDIwMzMsIDB4MDBlMCwgMHgwMGU4LCAweDAwNDksIDB4MDAzOSwKLSAgICAweDIwNGQsIDB4MjA0ZCwgMHgyMDM1LCAweDIwMzUsIDB4MjA0YiwgMHgyMDRiLCAweDIwMzcsIDB4MjAzNywKLSAgICAweDIwNDUsIDB4MjA0NSwgMHgyMDNkLCAweDIwM2QKLX07Ci0KLS8qIExNQVggdGFibGUgZm9yIG5vbiBJbnRlciAoTGFzdCA9PSAwIGFuZCBMYXN0PTEpCi0gICBMZXZlbCAtIDEgSW5kZXhlZAotICAgcGFkZGVkIGFybVZDTTRQMl9JbnRlckwwTDFMTUFYWzI3LTMxXSB3aXRoIHplcm9zIHRvIGFjZXNzIGVudHJpZXMgZm9yIExhc3Q9MSBlZmZlY3RpdmVseQotCi0qLwotY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTDFMTUFYWzczXSA9IAotewotICAgMTIsICA2LCAgNCwgIDMsICAzLCAgMywgIDMsICAyLCAKLSAgICAyLCAgMiwgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwKLSAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKLSAgICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwKLSAgICAzLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0JMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0JMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0JMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0JMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0JMQotfTsKLQotLyogUk1BWCB0YWJsZSBmb3Igbm9uIEludGVyIChMYXN0ID09IDAgYW5kIExhc3Q9MSkKLSAgIExldmVsIC0gMSBJbmRleGVkIAotIHBhZGRlZCBhcm1WQ000UDJfSW50ZXJMMEwxUk1BWFsxMi0zMV0gd2l0aCB6ZXJvcyB0byBhY2Nlc3MgZW50cmllcyBmb3IgTGFzdD0xIHRhYmxlIGVmZmVjdGl2ZWx5ICovCi0KLQotY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTDFSTUFYWzM1XSA9IAotewotICAgMjYsIDEwLCAgNiwgIDIsICAxLCAgMSwgICAKLSAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCi0JMCwJMCwJMCwJMCwJMCwJMCwKLQkwLAkwLAkwLAkwLAkwLAkwLAotCTAsCTAsCTAsCTAsCi0gICAgMCwgIDAsICAwLCAgMCwgIDQwLCAgMSwgIDAKLX07Ci0KLS8qIExNQVggdGFibGUgZm9yIG5vbiBJbnRyYSAoTGFzdCA9PSAwIGFuZCBMYXN0PTEpCi0gICBMZXZlbCAtIDEgSW5kZXhlZAotICAgcGFkZGVkIGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYWzE1LTMxXSB3aXRoIHplcm9zIHRvIGFjZXNzIGVudHJpZXMgZm9yIExhc3Q9MSBlZmZlY3RpdmVseQotCi0qLwotY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYWzUzXSA9IAotewotICAgMjcsIDEwLCAgNSwgIDQsICAzLCAgMywgIDMsICAKLSAgICAzLCAgMiwgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwJMCwKLQkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAotCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCi0KLQk4LCAgMywgIDIsICAyLCAgMiwgIDIsICAyLCAgMSwgCi0JMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0JMSwgIDEsICAxLCAgMSwgIDEKLX07Ci0KLQotLyogUk1BWCB0YWJsZSBmb3Igbm9uIEludGVyIChMYXN0ID09IDAgYW5kIExhc3Q9MSkKLSAgIExldmVsIC0gMSBJbmRleGVkIAotIHBhZGRlZCBhcm1WQ000UDJfSW50cmFMMEwxUk1BWFsyNy0zMV0gd2l0aCB6ZXJvcyB0byBhY2Nlc3MgZW50cmllcyBmb3IgTGFzdD0xIHRhYmxlIGVmZmVjdGl2ZWx5ICovCi0KLQotY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTDFSTUFYWzQwXSA9Ci17Ci0gICAxNCwgIDksICA3LCAgMywgIDIsICAxLAkxLCAgCi0gICAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAJMCwgIAotICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAKLSAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAotCTAsCTAsCTAsCTAsCi0JCi0JMjAsICA2LCAgMSwgIDAsICAwLCAgMCwgIDAsICAwCi0KLX07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDczOWE1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotIC8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRmlsZTogICAgICAgIGFybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKLSAqIERlc2NyaXB0aW9uOiBDb250YWlucyBhbGwgdGhlIExvb2t1cCB0YWJsZXMgdXNlZCBpbiBNUEVHNCBjb2RlYwotICoKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLQotICAgIC8qICogVGFibGUgRW50cmllcyBjb250YWluIERjIFNjYWxlciB2YWx1ZXMKLSAgICAgICAqIGFybVZDTTRQMl9EQ1NjYWxlcltpXT0gOCAgICAgICAgICAgZm9yIGk9MSAgdG8gIDQgYW5kIGk9MzMgdG8gMzYKLSAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gMippICAgICAgICAgZm9yIGk9NSAgdG8gIDgKLSAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gaSs4ICAgICAgICAgZm9yIGk9OSAgdG8gIDI1Ci0gICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IDIqaS0xNiAgICAgIGZvciBpPTI2IHRvICAzMQotICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSAoaS0zMisxMykvMiBmb3IgaT0zNyB0byAgNTkKLSAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gaS02LTMyICAgICAgZm9yIGk9NjAgdG8gIDYzCi0gICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IDI1NSAgICAgICAgIGZvciBpPTAgYW5kIGk9MzIKLSAgICAgICAqLwotICAgICAgIAotY29uc3QgT01YX1U4IGFybVZDTTRQMl9EQ1NjYWxlcls2NF09ewotCTB4ZmYsIDB4OCwgIDB4OCwgIDB4OCwgIDB4OCwgIDB4YSwgIDB4YywgIDB4ZSwgIAotICAgIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIAotICAgIDB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsCi0gICAgMHgyMCwgMHgyMiwgMHgyNCwgMHgyNiwgMHgyOCwgMHgyYSwgMHgyYywgMHgyZSwKLSAgICAweGZmLCAweDgsICAweDgsICAweDgsICAweDgsICAweDksICAweDksICAweGEsICAKLSAgICAweGEsICAweGIsICAweGIsICAweGMsICAweGMsICAweGQsICAweGQsICAweGUsICAKLSAgICAweGUsICAweGYsICAweGYsICAweDEwLCAweDEwLCAweDExLCAweDExLCAweDEyLCAKLSAgICAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAweDE4LCAweDE5LAotCi19OwotCi0gICAgICAgICAgICAgIAotICAgICAvKiAgVGFibGUgRW50cmllcyBDb250YWluIHJlY2lwcm9jYWwgb2YgMSB0byA2MwotICAgICAgKiAgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzE2W2ldPXJvdW5kKDMyNzY3L2kpCi0gICAgICAqICBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMTZbMF09IDAKLSAgICAgICovCi0KLWNvbnN0IE9NWF9TMTYgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzE2WzY0XT17Ci0JMHgwMDAwLDB4N2ZmZiwweDQwMDAsMHgyYWFhLDB4MjAwMCwweDE5OTksMHgxNTU1LDB4MTI0OSwKLSAgICAweDEwMDAsMHgwZTM5LDB4MGNjZCwweDBiYTMsMHgwYWFiLDB4MDlkOSwweDA5MjUsMHgwODg4LAotICAgIDB4MDgwMCwweDA3ODcsMHgwNzFjLDB4MDZiZCwweDA2NjYsMHgwNjE4LDB4MDVkMSwweDA1OTEsCi0gICAgMHgwNTU1LDB4MDUxZiwweDA0ZWMsMHgwNGJlLDB4MDQ5MiwweDA0NmEsMHgwNDQ0LDB4MDQyMSwKLSAgICAweDA0MDAsMHgwM2UxLDB4MDNjNCwweDAzYTgsMHgwMzhlLDB4MDM3NiwweDAzNWUsMHgwMzQ4LAotICAgIDB4MDMzMywweDAzMWYsMHgwMzBjLDB4MDJmYSwweDAyZTksMHgwMmQ4LDB4MDJjOCwweDAyYjksCi0gICAgMHgwMmFiLDB4MDI5ZCwweDAyOGYsMHgwMjgyLDB4MDI3NiwweDAyNmEsMHgwMjVmLDB4MDI1NCwKLSAgICAweDAyNDksMHgwMjNmLDB4MDIzNSwweDAyMmIsMHgwMjIyLDB4MDIxOSwweDAyMTEsMHgwMjA4Ci0JICAgCi19OwotICAgICAKLSAgICAgIC8qIFRhYmxlIEVudHJpZXMgQ29udGFpbiByZWNpcHJvY2FsIG9mIDEgdG8gNjMKLSAgICAgICAqIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MzMltpXT1yb3VuZCgxMzEwNzEvaSkKLSAgICAgICAqIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MzMlswXT0gMAotICAgICAgICovCi0KLWNvbnN0IE9NWF9TMzIgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyWzY0XT17Ci0JMHgwMDAwMDAwMCwweDAwMDFmZmZmLDB4MDAwMTAwMDAsMHgwMDAwYWFhYSwgMHgwMDAwODAwMCwgMHgwMDAwNjY2NiwgMHgwMDAwNTU1NSwgMHgwMDAwNDkyNCwKLSAgICAweDAwMDA0MDAwLDB4MDAwMDM4ZTMsMHgwMDAwMzMzMywweDAwMDAyZThjLCAweDAwMDAyYWFiLCAweDAwMDAyNzYyLCAweDAwMDAyNDkyLCAweDAwMDAyMjIyLAotICAgIDB4MDAwMDIwMDAsMHgwMDAwMWUxZSwweDAwMDAxYzcyLDB4MDAwMDFhZjIsIDB4MDAwMDE5OWEsIDB4MDAwMDE4NjEsIDB4MDAwMDE3NDYsIDB4MDAwMDE2NDMsCi0gICAgMHgwMDAwMTU1NSwweDAwMDAxNDdiLDB4MDAwMDEzYjEsMHgwMDAwMTJmNiwgMHgwMDAwMTI0OSwgMHgwMDAwMTFhOCwgMHgwMDAwMTExMSwgMHgwMDAwMTA4NCwKLSAgICAweDAwMDAxMDAwLDB4MDAwMDBmODQsMHgwMDAwMGYwZiwweDAwMDAwZWExLCAweDAwMDAwZTM5LCAweDAwMDAwZGQ2LCAweDAwMDAwZDc5LCAweDAwMDAwZDIxLAotICAgIDB4MDAwMDBjY2QsMHgwMDAwMGM3ZCwweDAwMDAwYzMxLDB4MDAwMDBiZTgsIDB4MDAwMDBiYTMsIDB4MDAwMDBiNjEsIDB4MDAwMDBiMjEsIDB4MDAwMDBhZTUsCi0gICAgMHgwMDAwMGFhYiwweDAwMDAwYTczLDB4MDAwMDBhM2QsMHgwMDAwMGEwYSwgMHgwMDAwMDlkOSwgMHgwMDAwMDlhOSwgMHgwMDAwMDk3YiwgMHgwMDAwMDk0ZiwKLSAgICAweDAwMDAwOTI1LDB4MDAwMDA4ZmIsMHgwMDAwMDhkNCwweDAwMDAwOGFlLCAweDAwMDAwODg5LCAweDAwMDAwODY1LCAweDAwMDAwODQyLCAweDAwMDAwODIwCi0JCi19OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZDEzZDEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyX3MucworKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAyX1NldFByZWREaXJfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotOyAqKgotOyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfU2V0UHJlZERpcgotOyAqCi07ICogRGVzY3JpcHRpb246Ci07ICogUGVyZm9ybXMgZGV0ZWN0aW5nIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbgotOyAqCi07ICogUmVtYXJrczoKLTsgKgotOyAqIFBhcmFtZXRlcnM6Ci07ICogW2luXSBibG9ja0luZGV4ICBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gYXMgZGVmaW5lZCBpbiBzdWJjbGF1c2UgNi4xLjMuOCwgb2YgSVNPL0lFQwotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQ5Ni0yLiBGdXJ0aGVybW9yZSwgaW5kZXhlcyA2IHRvIDkgaW5kaWNhdGUgdGhlCi07ICogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhIGJsb2NrcyBzcGF0aWFsbHkgY29ycmVzcG9uZGluZyB0byBsdW1pbmFuY2UKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzIDAgdG8gMyBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLgotOyAqIFtpbl0gcENvZWZCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgotOyAqIFtpbl0gcFFwQnVmICAgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBidWZmZXIKLTsgKiBbb3V0XXByZWRRUCAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jawotOyAqIFtvdXRdcHJlZERpciAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKLTsgKiAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotOyAqICAgICAgICAgICAgICAgICAgT01YX1ZDX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKLTsgKiAgICAgICAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTCAgICAgIHByZWRpY3QgdmVydGljYWxseQotOyAqCi07ICogUmV0dXJuIFZhbHVlOgotOyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotOyAqCi07ICovCi0KLSAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICBJTkNMVURFIG9teFZDX3MuaAotCi0KLSAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0KLSAgICAgICBJRiBBUk0xMTM2SlMKLSAKLTsvLyBJbnB1dCBBcmd1bWVudHMKLUJsb2NrSW5kZXggICAgICAgICBSTiAwCi1wQ29lZkJ1ZlJvdyAgICAgICAgUk4gMQotcENvZWZCdWZDb2wgICAgICAgIFJOIDIKLXByZWREaXIgICAgICAgICAgICBSTiAzCi1wcmVkUVAgICAgICAgICAgICAgUk4gNAotcFFwQnVmICAgICAgICAgICAgIFJOIDUKLQotOy8vIExvY2FsIFZhcmlhYmxlcwotCi1SZXR1cm4gICAgICAgICAgICAgUk4gMAotYmxvY2tEQ0xlZnQgICAgICAgIFJOIDYgIAotYmxvY2tEQ1RvcCAgICAgICAgIFJOIDcKLWJsb2NrRENUb3BMZWZ0ICAgICBSTiA4Ci10ZW1wMSAgICAgICAgICAgICAgUk4gOQotdGVtcDIgICAgICAgICAgICAgIFJOIDE0Ci0KLSAgICAgICBNX1NUQVJUICAgIGFybVZDTTRQMl9TZXRQcmVkRGlyLHI5Ci0KLSAgICAgICBNX0FSRyAgICAgICBwcHJlZFFQLDQKLSAgICAgICBNX0FSRyAgICAgICBwcFFwQnVmLDQKLSAgICAKLSAgICAgICBMRFJIICAgICAgICBibG9ja0RDVG9wTGVmdCxbcENvZWZCdWZSb3csIy0xNl0KLSAgICAgICBMRFJIICAgICAgICBibG9ja0RDTGVmdCxbcENvZWZCdWZDb2xdCi0gICAgICAgCi0gICAgICAgVEVRICAgICAgICAgQmxvY2tJbmRleCwjMwotICAgICAgIExEUkVRSCAgICAgIGJsb2NrRENUb3AsW3BDb2VmQnVmQ29sLCMtMTZdCi0gICAgICAgTERSTkVIICAgICAgYmxvY2tEQ1RvcCxbcENvZWZCdWZSb3ddCi0gICAgICAgICAgICAgCi0gICAgICAgU1VCUyAgICAgICAgdGVtcDEsYmxvY2tEQ0xlZnQsYmxvY2tEQ1RvcExlZnQKLSAgICAgICBSU0JMVCAgICAgICB0ZW1wMSx0ZW1wMSwjMAotICAgICAgIFNVQlMgICAgICAgIHRlbXAyLGJsb2NrRENUb3BMZWZ0LGJsb2NrRENUb3AKLSAgICAgICBSU0JMVCAgICAgICB0ZW1wMix0ZW1wMiwjMAotICAgICAgCi0gICAgICAgTV9MRFIgICAgICAgcFFwQnVmLHBwUXBCdWYKLSAgICAgICBNX0xEUiAgICAgICBwcmVkUVAscHByZWRRUAotICAgICAgIENNUCAgICAgICAgIHRlbXAxLHRlbXAyCi0gICAgICAgTU9WICAgICAgICAgdGVtcDIsI09NWF9WQ19WRVJUSUNBTAotICAgICAgIExEUkxUQiAgICAgIHRlbXAxLFtwUXBCdWYsIzFdCi0gICAgICAgU1RSTFQgICAgICAgdGVtcDIsW3ByZWREaXJdCi0gICAgICAgU1RSTFQgICAgICAgdGVtcDEsW3ByZWRRUF0KLSAgICAgICBNT1YgICAgICAgICB0ZW1wMiwjT01YX1ZDX0hPUklaT05UQUwgICAgICAgICAgIAotICAgICAgIExEUkdFQiAgICAgIHRlbXAxLFtwUXBCdWZdCi0gICAgICAgU1RSR0UgICAgICAgdGVtcDIsW3ByZWREaXJdCi0gICAgICAgTU9WICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCi0gICAgICAgU1RSR0UgICAgICAgdGVtcDEsW3ByZWRRUF0gCi0KLSAgICAgICAgIAotICAgIAotICAgICAgIE1fRU5ECi0gCi0gICAgICAgRU5ESUYKLQotICAgICAgIEVORCAgICAKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NDc1NTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5jCi0gKiBEZXNjcmlwdGlvbjogQ29udGFpbnMgdGhlIHppZ3phZyB0YWJsZXMKLSAqCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0KLS8qIENvbnRhaW5zIERvdWJsZSB0aGUgdmFsdWVzIGluIHRoZSByZWZlcmVuY2UgWmlnemFnIFRhYmxlCi0gKiBDb250YWlucyBDbGFzc2ljYWwsVmV0aWNhbCBhbmQgSG9yaXpvbnRhbCBaaWd6YWdzY2FuIHRhYmxlcyBpbiBvbmUgYXJyYXkgIAotICovCi0KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gWzE5Ml0gPSAKLXsKLSAgICAgMCwgIDIsICAxNiwgMzIsICAxOCwgIDQsICA2LCAyMCwKLSAgICAzNCwgNDgsIDY0LCA1MCwgMzYsIDIyLCAgOCwgIDEwLAotICAgIDI0LCAzOCwgNTIsIDY2LCA4MCwgOTYsIDgyLCA2OCwKLSAgICA1NCwgNDAsIDI2LCAgMTIsICAxNCwgMjgsIDQyLCA1NiwgCi0gICAgNzAsIDg0LCA5OCwgMTEyLCAxMTQsIDEwMCwgODYsIDcyLAotICAgIDU4LCA0NCwgMzAsIDQ2LCA2MCwgNzQsIDg4LCAxMDIsCi0gICAgMTE2LCAxMTgsIDEwNCwgOTAsIDc2LCA2MiwgNzgsIDkyLAotICAgIDEwNiwgMTIwLCAxMjIsIDEwNCwgOTQsIDExMCwgMTI0LCAxMjYsCi0KLQkwLCAgMTYsIDMyLCA0OCwgIDIsICAxOCwgIDQsIDIwLAotICAgIDM0LCA1MCwgNjQsIDgwLCA5NiwgMTEyLCAxMTQsIDk4LAotICAgIDgyLCA2NiwgNTIsIDM2LCAgNiwgMjIsICA4LCAyNCwKLSAgICAzOCwgNTQsIDY4LCA4NCwgMTAwLCAxMTYsIDcwLCA4NiwKLSAgICAxMDIsIDExOCwgNDAsIDU2LCAgMTAsIDI2LCAgMTIsIDI4LAotICAgIDQyLCA1OCwgNzIsIDg4LCAxMDQsIDEyMCwgNzQsIDkwLCAKLSAgICAxMDYsIDEyMiwgNDQsIDYwLCAgMTQsIDMwLCA0NiwgNjIsCi0gICAgNzYsIDkyLCAxMDgsIDEyNCwgNzgsIDk0LCAxMTAsIDEyNiwKLQotICAgIDAsICAyLCAgNCwgIDYsICAxNiwgIDE4LCAzMiwgMzQsCi0gICAgMjAsIDIyLCAgOCwgIDEwLCAgMTIsICAxNCwgMzAsIDI4LAotICAgIDI2LCAyNCwgMzgsIDM2LCA0OCwgNTAsIDY0LCA2NiwKLSAgICA1MiwgNTQsIDQwLCA0MiwgNDQsIDQ2LCA1NiwgNTgsCi0gICAgNjAsIDYyLCA2OCwgNzAsIDgwLCA4MiwgOTYsIDk4LAotICAgIDg0LCA4NiwgNzIsIDc0LCA3NiwgNzgsIDg4LCA5MCwgCi0gICAgOTIsIDk0LCAxMDAsIDEwMiwgMTEyLCAxMTQsIDExNiwgMTE4LAotICAgIDEwNCwgMTA2LCAxMDgsIDExMCwgMTIwLCAxMjIsIDEyNCwgMTI2Ci0KLQotfTsKLQotCi0KLQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjc3NzJhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOiAKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludGVyIHJlY29uc3RydWN0aW9uCi0gKiAKLSAqLwotIAotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0KLS8qKgotICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIERlY29kZXMgdGhlIElOVEVSIGJsb2NrIGNvZWZmaWNpZW50cy4gSW52ZXJzZSBxdWFudGl6YXRpb24sIGludmVyc2VseSB6aWd6YWcKLSAqIHBvc2l0aW9uaW5nIGFuZCBJRENULCB3aXRoIGFwcHJvcHJpYXRlIGNsaXBwaW5nIG9uIGVhY2ggc3RlcCwgYXJlIHBlcmZvcm1lZAotICogb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgKHJlc2lkdWFscykgYXJlIHBsYWNlZCBpbiBhIGNvbnRpZ3VvdXMgYXJyYXkKLSAqIG9mIDY0IGVsZW1lbnRzLiBGb3IgSU5URVIgYmxvY2ssIHRoZSBvdXRwdXQgYnVmZmVyIGhvbGRzIHRoZSByZXNpZHVhbHMgZm9yCi0gKiBmdXJ0aGVyIHJlY29uc3RydWN0aW9uLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotICoJCQkJCQkJCXRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkKLSAqCQkJCQkJCQljaGVjayBmb3IgdGhlIGJpdCBzdHJlYW0gYnVmZmVyLgotICogW2luXQlwQml0T2Zmc2V0CQlwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICoJCQkJCQkJCXRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluCi0gKgkJCQkJCQkJWzAtN10KLSAqIFtpbl0JUVAJCQkJcXVhbnRpemF0aW9uIHBhcmFtZXRlcgotICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgIGEgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBpbmRpY2F0ZXMgdXNpbmcgcXVhbnRpemF0aW9uIG1ldGhvZCBkZWZpbmVkIGluIHNob3J0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvIGhlYWRlciBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBpbmRpY2F0ZXMgbm9ybWFpbCBxdWFudGl6YXRpb24gbWV0aG9kLgotICogW291dF0gcHBCaXRTdHJlYW0gCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdIHBEc3QJCQlwb2ludGVyIHRvIHRoZSBkZWNvZGVkIHJlc2lkdWFsIGJ1ZmZlciAoYSBjb250aWd1b3VzIGFycmF5IG9mIDY0IGVsZW1lbnRzIG9mCi0gKiAgICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IGRhdGEgdHlwZSkuIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgotICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCi0gKiAgIC0gQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTnVsbDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCAsIHBEc3QKLSAqICAgLSBBdCBsZWFzdCBvbmUgb2YgdGhlIGJlbG93IGNhc2U6Ci0gKiAgIC0gKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSwgUVAgPD0gMDsKLSAqCSAtIHBEc3Qgbm90IDE2LWJ5dGUgYWxpZ25lZAotICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyKAotICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotICAgICBPTVhfUzE2ICogcERzdCwKLSAgICAgT01YX0lOVCBRUCwKLSAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pCi17Ci0gICAgLyogNjQgZWxlbWVudHMgYXJlIG5lZWRlZCBidXQgdG8gYWxpZ24gaXQgdG8gMTYgYnl0ZXMgbmVlZAotICAgIDE1IG1vcmUgZWxlbWVudHMgb2YgcGFkZGluZyAqLwotICAgIE9NWF9TMTYgdGVtcEJ1Zls3OV07Ci0gICAgT01YX1MxNiAqcFRlbXBCdWYxOwotICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7Ci0gICAgLyogQWxpZ25pbmcgdGhlIGxvY2FsIGJ1ZmZlcnMgKi8KLSAgICBwVGVtcEJ1ZjEgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmKTsKLSAgICAKLSAgICAKLSAgICAvKiBWTEQgYW5kIHppZ3phZyAqLwotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wQnVmMSxzaG9ydFZpZGVvSGVhZGVyKTsKLSAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICAKLSAgICAvKiBEZXF1YW50aXphdGlvbiAqLwotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9RdWFudEludkludGVyX0koCi0gICAgIHBUZW1wQnVmMSwKLSAgICAgUVApOwotICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIAotICAgIC8qIEludmVyc2UgdHJhbnNmb3JtICovCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0lEQ1Q4eDhibGsocFRlbXBCdWYxLCBwRHN0KTsKLSAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLQkgICAgCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNGZjMDcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246IAotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50cmEgcmVjb25zdHJ1Y3Rpb24KLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYQotICoKLSAqIERlc2NyaXB0aW9uOgotICogRGVjb2RlcyB0aGUgSU5UUkEgYmxvY2sgY29lZmZpY2llbnRzLiBJbnZlcnNlIHF1YW50aXphdGlvbiwgaW52ZXJzZWx5IHppZ3phZwotICogcG9zaXRpb25pbmcsIGFuZCBJRENULCB3aXRoIGFwcHJvcHJpYXRlIGNsaXBwaW5nIG9uIGVhY2ggc3RlcCwgYXJlIHBlcmZvcm1lZAotICogb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgYXJlIHRoZW4gcGxhY2VkIGluIHRoZSBvdXRwdXQgZnJhbWUvcGxhbmUgb24KLSAqIGEgcGl4ZWwgYmFzaXMuIEZvciBJTlRSQSBibG9jaywgdGhlIG91dHB1dCB2YWx1ZXMgYXJlIGNsaXBwZWQgdG8gWzAsIDI1NV0gYW5kCi0gKiB3cml0dGVuIHRvIGNvcnJlc3BvbmRpbmcgYmxvY2sgYnVmZmVyIHdpdGhpbiB0aGUgZGVzdGluYXRpb24gcGxhbmUuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKgkJCQkJCQkJdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiBUaGVyZSBpcyBubyBib3VuZGFyeQotICoJCQkJCQkJCWNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSBidWZmZXIuCi0gKiBbaW5dCXBCaXRPZmZzZXQJCXBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKgkJCQkJCQkJdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KLSAqCQkJCQkJCQlbMC03XS4KLSAqIFtpbl0Jc3RlcAkJCXdpZHRoIG9mIHRoZSBkZXN0aW5hdGlvbiBwbGFuZQotICogW2luL291dF0JcENvZWZCdWZSb3cJCVtpbl0gIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgW291dF0gdXBkYXRlZCBjb2VmZmljaWVudCByd28gYnVmZmVyCi0gKiBbaW4vb3V0XQlwQ29lZkJ1ZkNvbAkJW2luXSAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgotICogICAgICAgICAgICAgICAgICAgICAgICBbb3V0XSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKLSAqIFtpbl0JY3VyUVAJCQlxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHdoaWNoCi0gKgkJCQkJCQkJdGhlIGN1cnJlbnQgYmxvY2sgYmVsb25ncyB0bwotICogW2luXQlwUXBCdWYJCSBQb2ludGVyIHRvIGEgMi1lbGVtZW50IFFQIGFycmF5LiBwUXBCdWZbMF0gaG9sZHMgdGhlIFFQIG9mIHRoZSA4eDggYmxvY2sgbGVmdCB0bwotICogICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgYmxvY2soUVBhKS4gcFFwQnVmWzFdIGhvbGRzIHRoZSBRUCBvZiB0aGUgOHg4IGJsb2NrIGp1c3QgYWJvdmUgdGhlCi0gKiAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJsb2NrKFFQYykuCi0gKiAgICAgICAgICAgICAgICAgICBOb3RlLCBpbiBjYXNlIHRoZSBjb3JyZXNwb25kaW5nIGJsb2NrIGlzIG91dCBvZiBWT1AgYm91bmQsIHRoZSBRUCB2YWx1ZSB3aWxsIGhhdmUKLSAqICAgICAgICAgICAgICAgICAgIG5vIGVmZmVjdCB0byB0aGUgaW50cmEtcHJlZGljdGlvbiBwcm9jZXNzLiBSZWZlciB0byBzdWJjbGF1c2UgICI3LjQuMy4zIEFkYXB0aXZlCi0gKiAgICAgICAgICAgICAgICAgICBhYyBjb2VmZmljaWVudCBwcmVkaWN0aW9uIiBvZiBJU08vSUVDIDE0NDk2LTIoTVBFRzQgUGFydDIpIGZvciBhY2N1cmF0ZSBkZXNjcmlwdGlvbi4KLSAqIFtpbl0JYmxvY2tJbmRleAkJYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kCi0gKgkJCQkJCQkJcG9zaXRpb24gYXMgZGVmaW5lZCBpbiBzdWJjbGF1c2UgNi4xLjMuOCwKLSAqCQkJCQkJCQlGaWd1cmUgNi01IG9mIElTTy9JRUMgMTQ0OTYtMi4gCi0gKiBbaW5dCWludHJhRENWTEMJCWEgY29kZSBkZXRlcm1pbmVkIGJ5IGludHJhX2RjX3ZsY190aHIgYW5kIFFQLgotICoJCQkJCQkJCVRoaXMgYWxsb3dzIGEgbWVjaGFuaXNtIHRvIHN3aXRjaCBiZXR3ZWVuIHR3byBWTEMKLSAqCQkJCQkJCQlmb3IgY29kaW5nIG9mIEludHJhIERDIGNvZWZmaWNpZW50cyBhcyBwZXIgVGFibGUKLSAqCQkJCQkJCQk2LTIxIG9mIElTTy9JRUMgMTQ0OTYtMi4gCi0gKiBbaW5dCUFDUHJlZEZsYWcJCWEgZmxhZyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgKG9mIGx1bWluYW5jZSkgaW5kaWNhdGluZwotICoJCQkJCQkJCWlmIHRoZSBhYyBjb2VmZmljaWVudHMgb2YgdGhlIGZpcnN0IHJvdyBvciBmaXJzdAotICoJCQkJCQkJCWNvbHVtbiBhcmUgZGlmZmVyZW50aWFsbHkgY29kZWQgZm9yIGludHJhIGNvZGVkCi0gKgkJCQkJCQkJbWFjcm9ibG9jay4KLSAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciAgICBhIGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwKLSAqCQkJCQkJCWFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9ubGluZWFyIGludHJhIERDIG1vZGUuCi0gKiBbb3V0XQlwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzCi0gKgkJCQkJCQkJZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQotICoJCQkJCQkJCWluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgotICogW291dF0JcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqCQkJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKgkJCQkJCQkJKnBwQml0U3RyZWFtCi0gKiBbb3V0XQlwRHN0CQkJcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIGRlc3RpbmF0aW9uIHBsYW5lLgotICoJCQkJCQkJCXBEc3Qgc2hvdWxkIGJlIDE2LWJ5dGUgYWxpZ25lZC4KLSAqIFtvdXRdCXBDb2VmQnVmUm93CQlwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIuCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCi0gKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKLSAqICAgLQlBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29lZkJ1ZlJvdywgcENvZWZCdWZDb2wsIHBRUEJ1ZiwgcERzdC4KLSAqICAgICAgb3IKLSAqICAgLSAgQXQgbGVhc3Qgb25lIG9mIHRoZSBiZWxvdyBjYXNlOiAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddLCBjdXJRUCBleGNlZWRzICgxLCAzMSksCi0gKiAgICAgIGJsb2NrSW5kZXggZXhjZWVkcyBbMCw5XSwgc3RlcCBpcyBub3QgdGhlIG11bHRpcGxlIG9mIDgsIGludHJhRENWTEMgaXMgemVybyB3aGlsZQotICogICAgICBibG9ja0luZGV4IGdyZWF0ZXIgdGhhbiA1LgotICogICAgICBvcgotICogICAtCXBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZAotICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEoCi0gICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICAgT01YX1U4ICpwRHN0LAotICAgICBPTVhfSU5UIHN0ZXAsCi0gICAgIE9NWF9TMTYgKnBDb2VmQnVmUm93LAotICAgICBPTVhfUzE2ICpwQ29lZkJ1ZkNvbCwKLSAgICAgT01YX1U4IGN1clFQLAotICAgICBjb25zdCBPTVhfVTggKnBRUEJ1ZiwKLSAgICAgT01YX0lOVCBibG9ja0luZGV4LAotICAgICBPTVhfSU5UIGludHJhRENWTEMsCi0gICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKLQkgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0gKQotewotICAgIE9NWF9TMTYgdGVtcEJ1ZjFbNzldLCB0ZW1wQnVmMls3OV07Ci0gICAgT01YX1MxNiAqcFRlbXBCdWYxLCAqcFRlbXBCdWYyOwotICAgIE9NWF9JTlQgcHJlZERpciwgcHJlZEFDRGlyOwotICAgIE9NWF9JTlQgIHByZWRRUDsKLSAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXA7Ci0gICAgT01YUmVzdWx0IGVycm9yQ29kZTsKLSAgICAKLSAgICAKLSAgICAvKiBBbGlnbmluZyB0aGUgbG9jYWwgYnVmZmVycyAqLwotICAgIHBUZW1wQnVmMSA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYxKTsKLSAgICBwVGVtcEJ1ZjIgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmMik7Ci0gICAgCi0gICAgLyogU2V0dGluZyB0aGUgQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24gYW5kIHByZWRpY3Rpb24gZGlyZWN0aW9uICovCi0gICAgYXJtVkNNNFAyX1NldFByZWREaXIoCi0gICAgICAgIGJsb2NrSW5kZXgsCi0gICAgICAgIHBDb2VmQnVmUm93LAotICAgICAgICBwQ29lZkJ1ZkNvbCwKLSAgICAgICAgJnByZWREaXIsCi0gICAgICAgICZwcmVkUVAsCi0gICAgICAgIHBRUEJ1Zik7Ci0KLSAgICBwcmVkQUNEaXIgPSBwcmVkRGlyOwotCi0gICAgCi0gICAgaWYgKEFDUHJlZEZsYWcgPT0gMCkKLSAgICB7Ci0gICAgICAgIHByZWRBQ0RpciA9IE9NWF9WQ19OT05FOwotICAgIH0KLQotICAgIC8qIFNldHRpbmcgdGhlIHZpZGVvQ29tcCAqLwotICAgIGlmIChibG9ja0luZGV4IDw9IDMpCi0gICAgewotICAgICAgICB2aWRlb0NvbXAgPSBPTVhfVkNfTFVNSU5BTkNFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB2aWRlb0NvbXAgPSBPTVhfVkNfQ0hST01JTkFOQ0U7Ci0gICAgfQotICAgIAotCi0gICAgLyogVkxEIGFuZCB6aWd6YWcgKi8KLSAgICBpZiAoaW50cmFEQ1ZMQyA9PSAxKQotICAgIHsKLSAgICAgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDKAotICAgICAgICAgICAgcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICBwQml0T2Zmc2V0LAotICAgICAgICAgICAgcFRlbXBCdWYxLAotICAgICAgICAgICAgcHJlZEFDRGlyLAotICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgICAgICAgIHZpZGVvQ29tcCk7Ci0gICAgICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMoCi0gICAgICAgICAgICBwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICBwVGVtcEJ1ZjEsCi0gICAgICAgICAgICBwcmVkQUNEaXIsCi0gICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyKTsKLSAgICAgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgfQotCi0gICAgLyogQUMgREMgcHJlZGljdGlvbiAqLwotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEoCi0gICAgICAgIHBUZW1wQnVmMSwKLSAgICAgICAgcENvZWZCdWZSb3csCi0gICAgICAgIHBDb2VmQnVmQ29sLAotICAgICAgICBjdXJRUCwKLSAgICAgICAgcHJlZFFQLAotICAgICAgICBwcmVkRGlyLAotICAgICAgICBBQ1ByZWRGbGFnLAotICAgICAgICB2aWRlb0NvbXApOwotICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIAotICAgIC8qIERlcXVhbnRpemF0aW9uICovCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAyX1F1YW50SW52SW50cmFfSSgKLSAgICAgcFRlbXBCdWYxLAotICAgICBjdXJRUCwKLSAgICAgdmlkZW9Db21wLAotICAgICBzaG9ydFZpZGVvSGVhZGVyKTsKLSAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICAKLSAgICAvKiBJbnZlcnNlIHRyYW5zZm9ybSAqLwotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9JRENUOHg4YmxrIChwVGVtcEJ1ZjEsIHBUZW1wQnVmMik7Ci0gICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgCi0gICAgLyogUGxhY2luZyB0aGUgbGluZWFyIGFycmF5IGludG8gdGhlIGRlc3RpbmF0aW9uIHBsYW5lIGFuZCBjbGlwcGluZwotICAgICAgIGl0IHRvIDAgdG8gMjU1ICovCi0gICAgCi0JYXJtVkNNNFAyX0NsaXA4KHBUZW1wQnVmMixwRHN0LHN0ZXApOwotCQotCQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1Bfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWEwMWQ3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsgKioqKioqKioqKgotOyAqIAotOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucwotOyAqIE9wZW5NQVggREw6IHYxLjAuMgotOyAqIFJldmlzaW9uOiAgIDk2NDEKLTsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOyAqIAotOyAqIAotOyAqIAotOyAqIAotOyAqKgotOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUAotOyAqCi07ICogRGVzY3JpcHRpb246Ci07ICogRGVjb2RlcyBhbmQgcGFkcyBmb3VyIG1vdGlvbiB2ZWN0b3JzIG9mIHRoZSBub24taW50cmEgbWFjcm9ibG9jayBpbiBQLVZPUC4KLTsgKiBUaGUgbW90aW9uIHZlY3RvciBwYWRkaW5nIHByb2Nlc3MgaXMgc3BlY2lmaWVkIGluIHN1YmNsYXVzZSA3LjYuMS42IG9mCi07ICogSVNPL0lFQyAxNDQ5Ni0yLgotOyAqCi07ICogUmVtYXJrczoKLTsgKgotOyAqCi07ICogUGFyYW1ldGVyczoKLTsgKiBbaW5dICAgIHBwQml0U3RyZWFtICAgICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0IHN0cmVhbSBidWZmZXIKLTsgKiBbaW5dICAgIHBCaXRPZmZzZXQgICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluCi07ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAtN10uCi07ICogW2luXSAgICBwU3JjTVZMZWZ0TUIgICAgICAgcG9pbnRlcnMgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVycyBvZiB0aGUKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tzIHNwZWNpYWxseSBhdCB0aGUgbGVmdCBzaWRlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sKLTsgKiAgICAgICAgICAgICAgICAgICAgIHJlc3BlY3RpdmVseS4KLTsgKiBbaW5dICAgIHBTcmNNVlVwcGVyTUIgICAgICBwb2ludGVycyB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXJzIG9mIHRoZQotOyAqICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja3Mgc3BlY2lhbGx5IGF0IHRoZSB1cHBlciBzaWRlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sKLTsgKiAgICAgICAgICAgICAgICAgICAgIHJlc3BlY3RpdmVseS4KLTsgKiBbaW5dICAgIHBTcmNNVlVwcGVyUmlnaHRNQiBwb2ludGVycyB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXJzIG9mIHRoZQotOyAqICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja3Mgc3BlY2lhbGx5IGF0IHRoZSB1cHBlci1yaWdodCBzaWRlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sKLTsgKiAgICAgICAgICAgICAgICAgICAgIHJlc3BlY3RpdmVseS4KLTsgKiBbaW5dICAgIGZjb2RlRm9yd2FyZCAgICAgICBhIGNvZGUgZXF1YWwgdG8gdm9wX2Zjb2RlX2ZvcndhcmQgaW4gTVBFRy00Ci07ICogICAgICAgICAgICAgICAgICAgICBiaXQgc3RyZWFtIHN5bnRheAotOyAqIFtpbl0gICAgTUJUeXBlICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4gSWYgTUJUeXBlCi07ICogICAgICAgICAgICAgICAgICAgICBpcyBub3QgZXF1YWwgdG8gT01YX1ZDX0lOVEVSNFYsIHRoZSBkZXN0aW5hdGlvbgotOyAqICAgICAgICAgICAgICAgICAgICAgbW90aW9uIHZlY3RvciBidWZmZXIgaXMgc3RpbGwgZmlsbGVkIHdpdGggdGhlCi07ICogICAgICAgICAgICAgICAgICAgICBzYW1lIGRlY29kZWQgdmVjdG9yLgotOyAqIFtvdXRdICAgcHBCaXRTdHJlYW0gICAgICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwKLTsgKiAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAotOyAqICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlcgotOyAqIFtvdXRdICAgcEJpdE9mZnNldCAgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi07ICogICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci07ICogICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0KLTsgKiBbb3V0XSAgIHBEc3RNVkN1ck1CICAgICAgICAgcG9pbnRlciB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXIgb2YgdGhlIGN1cnJlbnQKLTsgKiAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2sgd2hpY2ggY29udGFpbnMgZm91ciBkZWNvZGVkIG1vdGlvbiB2ZWN0b3JzCi07ICoKLTsgKiBSZXR1cm4gVmFsdWU6Ci07ICogT01YX1N0c19Ob0VyciAtbm8gZXJyb3IKLTsgKiAKLTsgKiAgICAgICAgICAgICAgICAgICAgIAotOyAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCi07ICoKLTsgKgotICAgICAKLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAotICAgICAgICBJTkNMVURFIG9teFZDX3MuaAotICAgICAgICAKLSAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgSUYgQVJNMTEzNkpTCi0KLTsvL0lucHV0IEFyZ3VtZW50cwotCi1wcEJpdFN0cmVhbSAgICAgICAgICAgUk4gMAotcEJpdE9mZnNldCAgICAgICAgICAgIFJOIDEKLXBTcmNNVkxlZnRNQiAgICAgICAgICBSTiAyCi1wU3JjTVZVcHBlck1CICAgICAgICAgUk4gMwotcFNyY01WVXBwZXJSaWdodE1CICAgIFJOIDQKLXBEc3RNVkN1ck1CICAgICAgICAgICBSTiA1Ci1mY29kZUZvcndhcmQgICAgICAgICAgUk4gNgotTUJUeXBlICAgICAgICAgICAgICAgIFJOIDcKLQotOy8vTG9jYWwgVmFyaWFibGVzCi0KLXplcm8gICAgICAgICAgICAgICAgICBSTiA0Ci1vbmUgICAgICAgICAgICAgICAgICAgUk4gNAotc2NhbGVGYWN0b3IgICAgICAgICAgIFJOIDEKLQotCi1SZXR1cm4gICAgICAgICAgICAgICAgUk4gMAotCi1WbGNNVkQgICAgICAgICAgICAgICAgUk4gMAotaW5kZXggICAgICAgICAgICAgICAgIFJOIDQKLUNvdW50ICAgICAgICAgICAgICAgICBSTiA3Ci0KLW12SG9yRGF0YSAgICAgICAgICAgICBSTiA0Ci1tdkhvclJlc2lkdWFsICAgICAgICAgUk4gMAotCi1tdlZlckRhdGEgICAgICAgICAgICAgUk4gNCAgICAgICAgICAgICAKLW12VmVyUmVzaWR1YWwgICAgICAgICBSTiAwCi0KLXRlbXAgICAgICAgICAgICAgICAgICBSTiAxCi0KLXRlbXAxICAgICAgICAgICAgICAgICBSTiAzCi1IaWdoICAgICAgICAgICAgICAgICAgUk4gNAotTG93ICAgICAgICAgICAgICAgICAgIFJOIDIKLVJhbmdlICAgICAgICAgICAgICAgICBSTiAxCi0KLUJsa0NvdW50ICAgICAgICAgICAgICBSTiAxNAotCi1kaWZmTVZkeCAgICAgICAgICAgICAgUk4gMAotZGlmZk1WZHkgICAgICAgICAgICAgIFJOIDEKLQotOy8vIFNjcmF0Y2ggUmVnaXN0ZXJzCi0KLVJCaXRTdHJlYW0gICAgICAgICAgICBSTiA4Ci1SQml0Q291bnQgICAgICAgICAgICAgUk4gOQotUkJpdEJ1ZmZlciAgICAgICAgICAgIFJOIDEwCi0KLVQxICAgICAgICAgICAgICAgICAgICBSTiAxMQotVDIgICAgICAgICAgICAgICAgICAgIFJOIDEyCi1MUiAgICAgICAgICAgICAgICAgICAgUk4gMTQKLQotICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYVZsY01WRAotICAgICAgIElNUE9SVCAgICAgICAgICBvbXhWQ000UDJfRmluZE1WcHJlZAotCi0gICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSAgICAgICAgCi0gICAgICAgCi0gICAgICAgTV9BTExPQzQgICAgICAgIHBwRHN0TVZDdXJNQiw0Ci0gICAgICAgTV9BTExPQzQgICAgICAgIHBEc3RNVlByZWRNRSw0Ci0gICAgICAgTV9BTExPQzQgICAgICAgIHBCbGtDb3VudCw0Ci0gICAgICAgCi0gICAgICAgTV9BTExPQzQgICAgICAgIHBwcEJpdFN0cmVhbSw0Ci0gICAgICAgTV9BTExPQzQgICAgICAgIHBwQml0T2Zmc2V0LDQKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcHBTcmNNVkxlZnRNQiw0Ci0gICAgICAgTV9BTExPQzQgICAgICAgIHBwU3JjTVZVcHBlck1CLDQKLSAgICAgICAKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcGRpZmZNVmR4LDQKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcGRpZmZNVmR5LDQKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcEhpZ2gsNAotICAgICAgIAotICAgICAgICAgICAgICAKLQotCi0gICAgICAgTV9TVEFSVCAgIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QLHIxMQotICAgICAgIAotICAgICAgIE1fQVJHICAgICAgICAgICBwU3JjTVZVcHBlclJpZ2h0TUJvblN0YWNrLDQgICAgICAgICAgIDsvLyBwb2ludGVyIHRvICBwU3JjTVZVcHBlclJpZ2h0TUIgb24gc3RhY2sKLSAgICAgICBNX0FSRyAgICAgICAgICAgcERzdE1WQ3VyTUJvblN0YWNrLDQgICAgICAgICAgICAgICAgICA7Ly8gcG9pbnRlciB0byBwRHN0TVZDdXJNQiBvbiBzdGFjawotICAgICAgIE1fQVJHICAgICAgICAgICBmY29kZUZvcndhcmRvblN0YWNrLDQgICAgICAgICAgICAgICAgIDsvLyBwb2ludGVyIHRvIGZjb2RlRm9yd2FyZCBvbiBzdGFjayAKLSAgICAgICBNX0FSRyAgICAgICAgICAgTUJUeXBlb25TdGFjayw0ICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcG9pbnRlciB0byBNQlR5cGUgb24gc3RhY2sKLQotICAgICAgCi0gICAgICAgCi0gICAgICAgCi0gICAgICAgCi0gICAgICAgOy8vIEluaXRpYWxpemluZyB0aGUgQml0U3RyZWFtIE1hY3JvCi0KLSAgICAgICBNX0JEX0lOSVQwICAgICAgcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIFJCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudAotICAgICAgIE1fTERSICAgICAgICAgICBNQlR5cGUsTUJUeXBlb25TdGFjayAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIE1CVHlwZSBmcm9tIHN0YWNrCi0gICAgICAgTV9MRFIgICAgICAgICAgIHBEc3RNVkN1ck1CLHBEc3RNVkN1ck1Cb25TdGFjayAgICAgICAgOy8vIExvYWQgcERzdE1WQ3VyTUIgZnJvbSBzdGFjawotICAgICAgIE1PViAgICAgICAgICAgICB6ZXJvLCMwCi0KLSAgICAgICBURVEgICAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5UUkEgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRSQQotICAgICAgIFRFUU5FICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRSQV9RICAgICAgICAgICAgICAgIDsvLyBjaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVFJBX1EKLSAgICAgICBTVFJFUSAgICAgICAgICAgemVybyxbcERzdE1WQ3VyTUJdCi0gICAgICAgTV9CRF9JTklUMSAgICAgIFQxLCBUMiwgVDIKLSAgICAgICBTVFJFUSAgICAgICAgICAgemVybyxbcERzdE1WQ3VyTUIsIzRdCi0gICAgICAgTV9CRF9JTklUMiAgICAgIFQxLCBUMiwgVDIKLSAgICAgICBTVFJFUSAgICAgICAgICAgemVybyxbcERzdE1WQ3VyTUIsIzRdCi0gICAgICAgTU9WRVEgICAgICAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgotICAgICAgIE1PViAgICAgICAgICAgICBCbGtDb3VudCwjMAotICAgICAgIFNUUkVRICAgICAgICAgICB6ZXJvLFtwRHN0TVZDdXJNQiwjNF0KLSAgICAgICAKLSAgICAgICBCRVEgICAgICAgICAgICAgRXhpdE9LCi0KLSAgICAgICBURVEgICAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVI0ViAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRFUjRWCi0gICAgICAgVEVRTkUgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSNFZfUSAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5URVI0Vl9RCi0gICAgICAgTU9WRVEgICAgICAgICAgIENvdW50LCM0Ci0KLSAgICAgICBURVEgICAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVIgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRFUgotICAgICAgIFRFUU5FICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUl9RICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVEVSX1EKLSAgICAgICBNT1ZFUSAgICAgICAgICAgQ291bnQsIzEKLSAgICAgICAKLSAgICAgICBNX0xEUiAgICAgICAgICAgZmNvZGVGb3J3YXJkLGZjb2RlRm9yd2FyZG9uU3RhY2sgICAgICA7Ly8gTG9hZCBmY29kZUZvcndhcmQgIGZyb20gc3RhY2sKLQotICAgICAgIDsvLyBTdG9yaW5nIHRoZSB2YWx1ZXMgdGVtcG9yYXJpbHkgb24gc3RhY2sKLQotICAgICAgIE1fU1RSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0gICAgICAgICAgICAgIAotICAgICAgIE1fU1RSICAgICAgICAgICBwQml0T2Zmc2V0LHBwQml0T2Zmc2V0Ci0gICAgICAgICAgICAKLQotICAgICAgIFNVQiAgICAgICAgICAgICB0ZW1wLGZjb2RlRm9yd2FyZCwjMSAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPWZjb2RlRm9yd2FyZC0xCi0gICAgICAgTU9WICAgICAgICAgICAgIG9uZSwjMQotICAgICAgIE1fU1RSICAgICAgICAgICBwU3JjTVZMZWZ0TUIscHBTcmNNVkxlZnRNQgotICAgICAgIExTTCAgICAgICAgICAgICBzY2FsZUZhY3RvcixvbmUsdGVtcCAgICAgICAgICAgICAgICAgIDsvLyBzY2FsZUZhY3Rvcj0xPDwoZmNvZGVGb3J3YXJkLTEpCi0gICAgICAgTV9TVFIgICAgICAgICAgIHBTcmNNVlVwcGVyTUIscHBTcmNNVlVwcGVyTUIKLSAgICAgICBMU0wgICAgICAgICAgICAgc2NhbGVGYWN0b3Isc2NhbGVGYWN0b3IsIzUgICAgICAgICAgICAKLSAgICAgICBNX1NUUiAgICAgICAgICAgc2NhbGVGYWN0b3IscEhpZ2ggICAgICAgICAgICAgICAgICAgICA7Ly8gW3BIaWdoXT0zMipzY2FsZUZhY3RvcgotICAgICAgICAgICAgICAKLSAgICAgICA7Ly8gVkxEIERlY29kaW5nCi0KLQotTG9vcAotCi0gICAgICAgTERSICAgICAgICAgICAgIFZsY01WRCwgPWFybVZDTTRQMl9hVmxjTVZEICAgICAgICA7Ly8gTG9hZCB0aGUgb3B0aW1pemVkIE1WRCBWTEMgdGFibGUKLQotICAgICAgIDsvLyBIb3Jpem9udGFsIERhdGEgYW5kIFJlc2lkdWFsIGNhbGN1bGF0aW9uCi0KLSAgICAgICBMRFIgICAgICAgICAgICAgdGVtcCw9MHhGRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICBNX0JEX1ZMRCAgICAgICAgaW5kZXgsVDEsVDIsVmxjTVZELDMsMiAgICAgICAgICAgICAgICA7Ly8gdmFyaWFibGUgbGVuZ2h0IGRlY29kaW5nIHVzaW5nIHRoZSBtYWNybwotICAgICAgCi0gICAgICAgVEVRICAgICAgICAgICAgIGluZGV4LHRlbXAKLSAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIEVycm9yIE1lc3NhZ2UgaWYgdGhlIGRlY29kZWQgc3ltYm9sIGlzIGFuIGludmFsaWVkIHN5bWJvbCAKLSAgICAgICAKLSAgICAgICBTVUIgICAgICAgICAgICAgbXZIb3JEYXRhLGluZGV4LCMzMiAgICAgICAgICAgICAgICAgICA7Ly8gbXZIb3JEYXRhPWluZGV4LTMyICAgICAgICAgICAgIAotICAgICAgIE1PViAgICAgICAgICAgICBtdkhvclJlc2lkdWFsLCMxICAgICAgICAgICAgICAgICAgICAgIDsvLyBtdkhvclJlc2lkdWFsPTEKLSAgICAgICBDTVAgICAgICAgICAgICAgZmNvZGVGb3J3YXJkLCMxCi0gICAgICAgVEVRTkUgICAgICAgICAgIG12SG9yRGF0YSwjMAotICAgICAgIE1PVkVRICAgICAgICAgICBkaWZmTVZkeCxtdkhvckRhdGEgICAgICAgICAgICAgICAgICAgIDsvLyBpZiBzY2FsZUZhY3Rvcj0xKGZjb2RlRm9yd2FyZD0xKSBvciBtdkhvckRhdGE9MCBkaWZmTVZkeD1tdkhvckRhdGEgICAgICAgICAKLSAgICAgICBCRVEgICAgICAgICAgICAgVmVydGljYWxEYXRhCi0gICAgICAgCi0gICAgICAgU1VCICAgICAgICAgICAgIHRlbXAsZmNvZGVGb3J3YXJkLCMxCi0gICAgICAgTV9CRF9WUkVBRDggICAgIG12SG9yUmVzaWR1YWwsdGVtcCxUMSxUMiAgICAgICAgICAgICAgOy8vIGdldCBtdkhvclJlc2lkdWFsIGZyb20gYml0c3RyZWFtIGlmIGZjb2RlRm9yd2FyZD4xIGFuZCBtdkhvckRhdGEhPTAgICAgICAgICAgICAgIAotICAgICAgIAotICAgICAgIENNUCAgICAgICAgICAgICBtdkhvckRhdGEsIzAKLSAgICAgICBSU0JMVCAgICAgICAgICAgbXZIb3JEYXRhLG12SG9yRGF0YSwjMCAgICAgICAgICAgICAgICA7Ly8gbXZIb3JEYXRhPWFicyhtdkhvckRhdGEpCi0gICAgICAgU1VCICAgICAgICAgICAgIG12SG9yUmVzaWR1YWwsbXZIb3JSZXNpZHVhbCxmY29kZUZvcndhcmQKLSAgICAgICBTTUxBQkIgICAgICAgICAgZGlmZk1WZHgsbXZIb3JEYXRhLGZjb2RlRm9yd2FyZCxtdkhvclJlc2lkdWFsIDsvLyBkaWZmTVZkeD1hYnMobXZIb3JEYXRhKSpmY29kZUZvcndhcmQrbXZIb3JSZXNpZHVhbC1mY29kZUZvcndhcmQKLSAgICAgICBBREQgICAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsIzEKLSAgICAgICBSU0JMVCAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsIzAKLSAgICAgICAKLSAgICAgICA7Ly8gVmVydGljYWwgRGF0YSBhbmQgUmVzaWR1YWwgY2FsY3VsYXRpb24KLQotVmVydGljYWxEYXRhCi0KLSAgICAgICBNX1NUUiAgICAgICAgICAgZGlmZk1WZHgscGRpZmZNVmR4ICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgdGhlIGRpZmZNVmR4IG9uIHN0YWNrCi0gICAgICAgTERSICAgICAgICAgICAgIFZsY01WRCwgPWFybVZDTTRQMl9hVmxjTVZEICAgICAgICA7Ly8gTG9hZGluZyB0aGUgYWRkcmVzcyBvZiBvcHRpbWl6ZWQgVkxDIHRhYmxlcwotCi0gICAgICAgTERSICAgICAgICAgICAgIHRlbXAsPTB4RkZGCi0gICAgICAgTV9CRF9WTEQgICAgICAgIGluZGV4LFQxLFQyLFZsY01WRCwzLDIgICAgICAgICAgICAgICAgOy8vIFZMQyBkZWNvZGluZyB1c2luZyB0aGUgbWFjcm8KLSAgICAgICAKLSAgICAgICBURVEgICAgICAgICAgICAgaW5kZXgsdGVtcAotICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gRXJyb3IgTWVzc2FnZSBpZiBhbiBJbnZhbGllZCBTeW1ib2wgb2NjdXJzCi0gICAgICAgCi0gICAgICAgU1VCICAgICAgICAgICAgIG12VmVyRGF0YSxpbmRleCwjMzIgICAgICAgICAgICAgICAgICAgOy8vIG12VmVyRGF0YT1pbmRleC0zMiAgICAgICAgICAgICAKLSAgICAgICBNT1YgICAgICAgICAgICAgbXZWZXJSZXNpZHVhbCwjMSAgICAgCi0gICAgICAgQ01QICAgICAgICAgICAgIGZjb2RlRm9yd2FyZCwjMQotICAgICAgIFRFUU5FICAgICAgICAgICBtdlZlckRhdGEsIzAKLSAgICAgICBNT1ZFUSAgICAgICAgICAgZGlmZk1WZHksbXZWZXJEYXRhICAgICAgICAgICAgICAgICAgICA7Ly8gZGlmZk1WZHkgPSBtdlZlckRhdGEgaWYgc2NhbGVGYWN0b3I9MShmY29kZUZvcndhcmQ9MSkgb3IgbXZWZXJEYXRhPTAKLSAgICAgICBCRVEgICAgICAgICAgICAgRmluZE1WUHJlZAotCi0gICAgICAgU1VCICAgICAgICAgICAgIHRlbXAsZmNvZGVGb3J3YXJkLCMxCi0gICAgICAgTV9CRF9WUkVBRDggICAgIG12VmVyUmVzaWR1YWwsdGVtcCxUMSxUMiAgICAgICAgICAgICAgOy8vIEdldCBtdlZlclJlc2lkdWFsIGZyb20gYml0IHN0cmVhbSBpZiBmY29kZUZvcndhcmQ+MSBhbmQgbW5WZXJEYXRhIT0wCi0gICAgICAgICAgICAgCi0KLSAgICAgICBDTVAgICAgICAgICAgICAgbXZWZXJEYXRhLCMwCi0gICAgICAgUlNCTFQgICAgICAgICAgIG12VmVyRGF0YSxtdlZlckRhdGEsIzAKLSAgICAgICBTVUIgICAgICAgICAgICAgbXZWZXJSZXNpZHVhbCxtdlZlclJlc2lkdWFsLGZjb2RlRm9yd2FyZAotICAgICAgIFNNTEFCQiAgICAgICAgICBkaWZmTVZkeSxtdlZlckRhdGEsZmNvZGVGb3J3YXJkLG12VmVyUmVzaWR1YWwgOy8vIGRpZmZNVmR5PWFicyhtdlZlckRhdGEpKmZjb2RlRm9yd2FyZCttdlZlclJlc2lkdWFsLWZjb2RlRm9yd2FyZAotICAgICAgIEFERCAgICAgICAgICAgICBkaWZmTVZkeSxkaWZmTVZkeSwjMQotICAgICAgIFJTQkxUICAgICAgICAgICBkaWZmTVZkeSxkaWZmTVZkeSwjMAotCi0gICAgICAgOy8vQ2FsbGluZyB0aGUgRnVuY3Rpb24gb214VkNNNFAyX0ZpbmRNVnByZWQKLSAgICAgICAgCi1GaW5kTVZQcmVkCi0KLSAgICAgICBNX1NUUiAgICAgICAgICAgZGlmZk1WZHkscGRpZmZNVmR5Ci0gICAgICAgQUREICAgICAgICAgICAgIHRlbXAscERzdE1WQ3VyTUIsQmxrQ291bnQsTFNMICMyICAgICAgOy8vIHRlbXA9cERzdE1WQ3VyTUJbQmxrQ291bnRdCi0gICAgICAgTV9TVFIgICAgICAgICAgIHRlbXAscHBEc3RNVkN1ck1CICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHRlbXAgb24gc3RhY2sgZm9yIHBhc3NpbmcgYXMgYW4gYXJndW1lbnQgdG8gRmluZE1WUHJlZAotICAgICAgIAotICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wLCMwCi0gICAgICAgTV9TVFIgICAgICAgICAgIHRlbXAscERzdE1WUHJlZE1FICAgICAgICAgICAgICAgICAgICAgOy8vIFBhc3MgcERzdE1WUHJlZE1FPU5VTEwgYXMgYW4gYXJndW1lbnQgICAgICAgICAKLSAgICAgICBNX1NUUiAgICAgICAgICAgQmxrQ291bnQscEJsa0NvdW50ICAgICAgICAgICAgICAgICAgICA7Ly8gUGFzc3MgQmxrQ291bnQgYXMgQXJndW1lbnQgdGhyb3VnaCBzdGFjawotCi0gICAgICAgTU9WICAgICAgICAgICAgIHRlbXAscFNyY01WTGVmdE1CICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAgKFJOIDEpPXBTcmNNVkxlZnRNQgotICAgICAgIE1fTERSICAgICAgICAgICBwU3JjTVZVcHBlclJpZ2h0TUIscFNyY01WVXBwZXJSaWdodE1Cb25TdGFjawotICAgICAgIE1PViAgICAgICAgICAgICBwU3JjTVZMZWZ0TUIscFNyY01WVXBwZXJNQiAgICAgICAgICAgIDsvLyBwU3JjTVZMZWZ0TUIgKCBSTiAyKSA9IHBTcmNNVlVwcGVyTUIKLSAgICAgICBNT1YgICAgICAgICAgICAgcHBCaXRTdHJlYW0scERzdE1WQ3VyTUIgICAgICAgICAgICAgICA7Ly8gcHBCaXRTdHJlYW0gICggUk4gMCkgPSBwRHN0TVZDdXJNQgotICAgICAgIE1PViAgICAgICAgICAgICBwU3JjTVZVcHBlck1CLHBTcmNNVlVwcGVyUmlnaHRNQiAgICAgIDsvLyBwU3JjTVZVcHBlck1CKCBSTiAzKSA9IHBTcmNNVlVwcGVyUmlnaHRNQiAgICAgIAotICAgICAgIEJMICAgICAgICAgICAgICBvbXhWQ000UDJfRmluZE1WcHJlZCAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBzdWJyb3V0aW5lIG9teFZDTTRQMl9GaW5kTVZwcmVkCi0KLSAgICAgICA7Ly8gU3RvcmUgSG9yaXpvbnRhbCBNb3Rpb24gVmVjdG9yCi0gICAgIAotICAgICAgIE1fTERSICAgICAgICAgICBCbGtDb3VudCxwQmxrQ291bnQgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIEJsa0NvdW50IGZyb20gc3RhY2sKLSAgICAgICBNX0xEUiAgICAgICAgICAgSGlnaCxwSGlnaCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSGlnaD0zMipzY2FsZUZhY3RvcgotICAgICAgIExTTCAgICAgICAgICAgICB0ZW1wMSxCbGtDb3VudCwjMiAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPUJsa0NvdW50KjQKLSAgICAgICBNX0xEUiAgICAgICAgICAgZGlmZk1WZHgscGRpZmZNVmR4ICAgICAgICAgICAgICAgICAgICA7Ly8gTGFhZCBkaWZmTVZkeAotICAgICAgIAotICAgICAgIExEUlNIICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQix0ZW1wMV0gICAgICAgICAgICAgIDsvLyB0ZW1wPXBEc3RNVkN1ck1CW0Jsa0NvdW50XQotICAgICAgIAotICAgICAgIAotICAgICAgIFJTQiAgICAgICAgICAgICBMb3csSGlnaCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb3cgPSAtMzIqc2NhbGVGYWN0b3IKLSAgICAgICBBREQgICAgICAgICAgICAgZGlmZk1WZHgsdGVtcCxkaWZmTVZkeCAgICAgICAgICAgICAgICA7Ly8gZGlmZk1WZHg9cERzdE1WQ3VyTUJbQmxrQ291bnRdK2RpZmZNVmR4Ci0gICAgICAgQUREICAgICAgICAgICAgIFJhbmdlLEhpZ2gsSGlnaCAgICAgICAgICAgICAgICAgICAgICAgOy8vIFJhbmdlPTY0KlNjYWxlRmFjdG9yCi0gICAgICAgU1VCICAgICAgICAgICAgIEhpZ2gsSGlnaCwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEhpZ2g9IDMyKnNjYWxlRmFjdG9yLTEKLQotICAgICAgIENNUCAgICAgICAgICAgICBkaWZmTVZkeCxMb3cgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBkaWZmTVZkeDxMb3cgICAgICAgICAgCi0gICAgICAgQURETFQgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LFJhbmdlICAgICAgICAgICAgICAgOy8vIGRpZmZNVmR4Kz1SYW5nZQotICAgICAgICAKLSAgICAgICBDTVAgICAgICAgICAgICAgZGlmZk1WZHgsSGlnaCAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICBTVUJHVCAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsUmFuZ2UgICAgICAgICAgICAgICA7Ly8gSWYgZGlmZk1WZHggPiBIaWdoIGRpZmZNVmR4LT1SYW5nZQotICAgICAgIFNUUkggICAgICAgICAgICBkaWZmTVZkeCxbcERzdE1WQ3VyTUIsdGVtcDFdCi0KLSAgICAgICA7Ly8gU3RvcmUgVmVydGljYWwKLQotICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wMSx0ZW1wMSwjMiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wMT00KkJsa0NvdW50KzIKLSAgICAgICBNX0xEUiAgICAgICAgICAgZGlmZk1WZHgscGRpZmZNVmR5ICAgICAgICAgICAgICAgICAgICA7Ly8gTGFhZCBkaWZmTVZkeQotICAgICAgIExEUlNIICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQix0ZW1wMV0gICAgICAgICAgICAgIDsvLyB0ZW1wPXBEc3RNVkN1ck1CW0Jsa0NvdW50XS5kaWZmTVZkeQotICAgICAgIEFERCAgICAgICAgICAgICBCbGtDb3VudCxCbGtDb3VudCwjMSAgICAgICAgICAgICAgICAgIDsvLyBCbGtDb3VudD1CbGtDb3VudCsxCi0gICAgICAgQUREICAgICAgICAgICAgIGRpZmZNVmR4LHRlbXAsZGlmZk1WZHggICAgICAgICAgICAgICAgCi0gICAgICAgQ01QICAgICAgICAgICAgIGRpZmZNVmR4LExvdwotICAgICAgIEFERExUICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCxSYW5nZSAgICAgICAgICAgICAgIDsvLyBJZiBkaWZmTVZkeTxMb3cgIGRpZmZNVmR5Kz1SYW5nZSAgICAgICAgICAgICAgICAKLSAgICAgICBDTVAgICAgICAgICAgICAgZGlmZk1WZHgsSGlnaAotICAgICAgIFNVQkdUICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCxSYW5nZSAgICAgICAgICAgICAgIDsvLyBJZiBkaWZmTVZkeSA+IEhpZ2ggZGlmZk1WZHktPVJhbmdlCi0gICAgICAgU1RSSCAgICAgICAgICAgIGRpZmZNVmR4LFtwRHN0TVZDdXJNQix0ZW1wMV0gICAgCi0gICAgICAgCi0gICAgICAgQ01QICAgICAgICAgICAgIEJsa0NvdW50LENvdW50Ci0gICAgICAgTV9MRFIgICAgICAgICAgIHBTcmNNVkxlZnRNQixwcFNyY01WTGVmdE1CCi0gICAgICAgTV9MRFIgICAgICAgICAgIHBTcmNNVlVwcGVyTUIscHBTcmNNVlVwcGVyTUIKLQotICAgICAgIEJMVCAgICAgICAgICAgICBMb29wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBCbGtDb3VudDxDb3VudCBDb250aW51ZSB0aGUgTG9vcAotCi0KLSAgICAgICA7Ly8gSWYgTUJUeXBlPU9NWF9WQ19JTlRFUiBvciBNQnR5cGU9T01YX1ZDX0lOVEVSX1EgY29weSBwRHN0TVZDdXJNQlswXSB0bwotICAgICAgIDsvLyBwRHN0TVZDdXJNQlsxXSwgcERzdE1WQ3VyTUJbMl0sIHBEc3RNVkN1ck1CWzNdIAotCi0gICAgICAgTV9MRFIgICAgICAgICAgIE1CVHlwZSxNQlR5cGVvblN0YWNrCi0KLSAgICAgICBURVEgICAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICBURVFORSAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVJfUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICBMRFJFUSAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUJdCi0gICAgICAgTV9MRFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbQotICAgICAgIFNUUkVRICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQiwjNF0KLSAgICAgICAKLSAgICAgICBTVFJFUSAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUIsIzhdCi0gICAgICAgU1RSRVEgICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLCMxMl0KLSAgICAgICAKLSAgICAgICAKLSAgICAgICBNX0xEUiAgICAgICAgICAgcEJpdE9mZnNldCxwcEJpdE9mZnNldAotICAgICAgIDsvL0VuZGluZyB0aGUgbWFjcm8KLSAgICAgICBNX0JEX0ZJTkkgICAgICAgcHBCaXRTdHJlYW0scEJpdE9mZnNldCAgICAgICAgICAgICAgICAgOy8vIEZpbmlzaGluZyB0aGUgTWFjcm8gICAgICAgCi0KLSAgICAgICAKLSAgICAgICBNT1YgICAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCi0gICAgICAgQiAgICAgICAgICAgICAgIEV4aXRPSwotIAotRXhpdEVycm9yCi0KLSAgICAgICBNX0xEUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtCi0gICAgICAgTV9MRFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBCaXRPZmZzZXQKLSAgICAgICA7Ly9FbmRpbmcgdGhlIG1hY3JvCi0gICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQKLSAgICAgICAKLSAgICAgICBNT1YgICAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX0VycgotCi1FeGl0T0sgICAgICAgICAgICAgCi0KLSAgICAgICBNX0VORAotICAgICAgIEVORElGCi0gICAgICAgRU5ECi0KLQotICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZTMzZDguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXJfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07LyoqCi07ICogCi07ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMKLTsgKiBPcGVuTUFYIERMOiB2MS4wLjIKLTsgKiBSZXZpc2lvbjogICA5NjQxCi07ICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsgKiAKLTsgKiAKLTsgKiAKLTsgKgotOyAqIERlc2NyaXB0aW9uOiAKLTsgKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBkZWNvZGluZwotOyAqIGZvciBpbnRlciBibG9jay4KLTsgKgotOyAqCi07ICoKLTsgKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcgotOyAqCi07ICogRGVzY3JpcHRpb246Ci07ICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50ZXIgY29kZWQgYmxvY2suCi07ICoKLTsgKiBSZW1hcmtzOgotOyAqCi07ICogUGFyYW1ldGVyczoKLTsgKiBbaW5dICAgIHBwQml0U3RyZWFtICAgICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLTsgKiAgICAgICAgICAgICAgICAgICAgdGhlIGJpdHN0cmVhbSBidWZmZXIKLTsgKiBbaW5dICAgIHBCaXRPZmZzZXQgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi07ICogICAgICAgICAgICAgICAgICAgIHRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluICAgIFswLTddLgotOyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciAgICAgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7Ci07ICogICAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCi07ICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KLTsgKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzCi07ICogICAgICAgICAgICAgICAgICAgIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUKLTsgKiAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCi07ICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLTsgKiAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotOyAqICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0KLTsgKiBbb3V0XSAgICBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKLTsgKiAgICAgICAgICAgICAgICAgICAgYmxvY2suIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkCi07ICoKLTsgKiBSZXR1cm4gVmFsdWU6Ci07ICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCi07ICogICAtQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdCwgb3IKLTsgKiAgIC1wRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQsIG9yCi07ICogICAtKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XS4KLTsgKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgotOyAqICAgLUF0IGxlYXN0IG9uZSBtYXJrIGJpdCBpcyBlcXVhbCB0byB6ZXJvCi07ICogICAtRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBzdHJlYW0gY29kZSB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgVkxDIHRhYmxlCi07ICogICAtRW5jb3VudGVyZWQgYW5kIGlsbGVnYWwgY29kZSBpbiB0aGUgVkxDIEZMQyB0YWJsZQotOyAqICAgLVRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NAotOyAqCi07ICovCi0KLQotICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCi0KLQotICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotICAgICAKLQotCi0KLSAgICAgSUYgQVJNMTEzNkpTCi0gICAgIAotICAgICAgICA7Ly8gSW1wb3J0IHZhcmlvdXMgdGFibGVzIG5lZWRlZCBmb3IgdGhlIGZ1bmN0aW9uCi0KLSAgICAgICAgCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50ZXJWbGNMMEwxICAgICAgICAgICAgIDsvLyBDb250YWlucyBvcHRpbWl6ZWQgYW5kIHBhY2tlZCBWTEMgVGFibGVzIGZvciBib3RoIExhc3QgPTEgYW5kIGxhc3Q9MAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFBhY2tlZCBpbiBSdW46TGV2ZWw6TGFzdCBmb3JtYXQKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwwTDFMTUFYICAgICAgICAgICAgOy8vIENvbnRhaW5zIExNQVggdGFibGUgZW50cmllcyB3aXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwwTDFSTUFYICAgICAgICAgICAgOy8vIENvbnRhaW5zIFJNQVggdGFibGUgZW50cmllcyB3aXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiAgICAgOy8vIGNvbnRhaW5zIGNsYXNzaWNhbCBaaWd6YWcgdGFibGUgZW50cmllcyB3aXRoIGRvdWJsZSB0aGUgb3JpZ2luYWwgdmFsdWVzCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZQotCi0KLQotOy8vSW5wdXQgQXJndW1lbnRzCi0KLXBwQml0U3RyZWFtICAgICAgICAgIFJOIDAKLXBCaXRPZmZzZXQgICAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICAgICAgIFJOIDIKLXNob3J0VmlkZW9IZWFkZXIgICAgIFJOIDMKLQotOy8vTG9jYWwgVmFyaWFibGVzCi0KLVJldHVybiAgICAgICAgICAgICAgIFJOIDAKLQotcFZsY1RhYmxlTDBMMSAgICAgICAgUk4gNAotcExNQVhUYWJsZUwwTDEgICAgICAgUk4gNAotcFJNQVhUYWJsZUwwTDEgICAgICAgUk4gNAotcFppZ3phZ1RhYmxlICAgICAgICAgUk4gNAotQ291bnQgICAgICAgICAgICAgICAgUk4gNgotCi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgdG8gc3RvcmUgdGhlIFZMQyxaaWd6YWcsTE1BWCBhbmQgUk1BWCB0YWJsZXMKLSAgICAgCi0gICAgICAgIAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBWbGNUYWJsZUwwTDEsNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBMTUFYVGFibGVMMEwxLDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwUk1BWFRhYmxlTDBMMSw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFppZ3phZ1RhYmxlLDQKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIscjEyCi0KLSAgICAgICAgCi0KLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgICAgICBwWmlnemFnVGFibGUsID1hcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgICAgOy8vIExvYWQgemlnemFnIHRhYmxlCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwWmlnemFnVGFibGUscHBaaWd6YWdUYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSB6aWd6YWcgdGFibGUgb24gc3RhY2sgdG8gcGFzcyBhcyBhcmd1bWVudCB0byB1bnNhZmUgZnVuY3Rpb24KLSAgICAgICAgTERSICAgICAgICAgICAgIHBWbGNUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50ZXJWbGNMMEwxICAgICAgICAgICAgICA7Ly8gTG9hZCBvcHRpbWl6ZWQgVkxDIHRhYmxlIHdpdGggYm90aCBMPTAgYW5kIEw9MSBlbnRyaWVzCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwVmxjVGFibGVMMEwxLHBwVmxjVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBvcHRpbWl6ZWQgVkxDIHRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKLSAgICAgICAgTERSICAgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludGVyTDBMMUxNQVggICAgICAgICAgICA7Ly8gTG9hZCBJbnRlcmxlYXZlZCBMPTAgYW5kIEw9MSBMTUFYIFRhYmxlcwotICAgICAgICBNX1NUUiAgICAgICAgICAgcExNQVhUYWJsZUwwTDEscHBMTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgTE1BWCB0YWJsZSBhZGRyZXNzIG9uIHN0YWNrCi0gICAgICAgIExEUiAgICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRlckwwTDFSTUFYICAgICAgICAgICAgOy8vIExvYWQgSW50ZXJsZWF2ZWQgTD0wIGFuZCBMPTEgUk1BWCBUYWJsZXMKLSAgICAgICAgTU9WICAgICAgICAgICAgIENvdW50LCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHNldCBzdGFydD0wCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSxwcFJNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSBSTUFYIHRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICBCTCAgICAgICAgICAgICAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUgICAgICAgICAgICAgICAgIDsvLyBjYWxsIFVuc2FmZSBGdW5jdGlvbiBmb3IgVkxDIFppZ3phZyBEZWNvZGluZwotICAgICAgICAgCi0gICAgICAgCi0KLSAgICAgICAgTV9FTkQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ1OTQwYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucworKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8qKgotOyAqIAotOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMKLTsgKiBPcGVuTUFYIERMOiB2MS4wLjIKLTsgKiBSZXZpc2lvbjogICA5NjQxCi07ICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsgKiAKLTsgKiAKLTsgKiAKLTsgKgotOyAqIERlc2NyaXB0aW9uOiAKLTsgKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBkZWNvZGluZwotOyAqIGZvciBpbnRlciBibG9jay4KLTsgKgotOyAqCi07ICoKLTsgKiBGdW5jdGlvbjogb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcgotOyAqCi07ICogRGVzY3JpcHRpb246Ci07ICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50cmEgY29kZWQgYmxvY2suCi07ICoKLTsgKiBSZW1hcmtzOgotOyAqCi07ICogUGFyYW1ldGVyczoKLTsgKiBbaW5dICAgIHBwQml0U3RyZWFtICAgICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLTsgKiAgICAgICAgICAgICAgICAgICAgdGhlIGJpdHN0cmVhbSBidWZmZXIKLTsgKiBbaW5dICAgIHBCaXRPZmZzZXQgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi07ICogICAgICAgICAgICAgICAgICAgIHRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluICAgIFswLTddLgotOyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciAgICAgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7Ci07ICogICAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCi07ICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KLTsgKiBbb3V0XSAgICBwcEJpdFN0cmVhbSAgICAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzCi07ICogICAgICAgICAgICAgICAgICAgIGRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUKLTsgKiAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCi07ICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLTsgKiAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotOyAqICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0KLTsgKiBbb3V0XSAgICBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKLTsgKiAgICAgICAgICAgICAgICAgICAgYmxvY2suIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkCi07ICoKLTsgKiBSZXR1cm4gVmFsdWU6Ci07ICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCi07ICogICAtQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdCwgb3IKLTsgKiAgIC1wRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQsIG9yCi07ICogICAtKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XS4KLTsgKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgotOyAqICAgLUF0IGxlYXN0IG9uZSBtYXJrIGJpdCBpcyBlcXVhbCB0byB6ZXJvCi07ICogICAtRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBzdHJlYW0gY29kZSB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgVkxDIHRhYmxlCi07ICogICAtRW5jb3VudGVyZWQgYW5kIGlsbGVnYWwgY29kZSBpbiB0aGUgVkxDIEZMQyB0YWJsZQotOyAqICAgLVRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NAotOyAqCi07ICovCi0KLQotICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCi0KLQotICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotICAgICAKLQotCi0KLSAgICAgSUYgQVJNMTEzNkpTCi0gICAgIAotICAgICAgICA7Ly8gSW1wb3J0IHZhcmlvdXMgdGFibGVzIG5lZWRlZCBmb3IgdGhlIGZ1bmN0aW9uCi0KLSAgICAgICAgCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50cmFWbGNMMEwxICAgICAgICAgICAgIDsvLyBDb250YWlucyBvcHRpbWl6ZWQgYW5kIHBhY2tlZCBWTEMgVGFibGVzIGZvciBib3RoIExhc3QgPTEgYW5kIGxhc3Q9MAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFBhY2tlZCBpbiBSdW46TGV2ZWw6TGFzdCBmb3JtYXQKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYICAgICAgICAgICAgOy8vIENvbnRhaW5zIExNQVggdGFibGUgZW50cmllcyB3aXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwwTDFSTUFYICAgICAgICAgICAgOy8vIENvbnRhaW5zIFJNQVggdGFibGUgZW50cmllcyB3aXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiAgICAgOy8vIGNvbnRhaW5zIGNsYXNzaWNhbCBaaWd6YWcgdGFibGUgZW50cmllcyB3aXRoIGRvdWJsZSB0aGUgb3JpZ2luYWwgdmFsdWVzCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZQotCi07Ly9JbnB1dCBBcmd1bWVudHMKLQotcHBCaXRTdHJlYW0gICAgICAgICAgUk4gMAotcEJpdE9mZnNldCAgICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgICAgICAgUk4gMgotUHJlZERpciAgICAgICAgICAgICAgUk4gMwotc2hvcnRWaWRlb0hlYWRlciAgICAgUk4gMwotCi07Ly9Mb2NhbCBWYXJpYWJsZXMKLQotUmV0dXJuICAgICAgICAgICAgICAgUk4gMAotCi1wVmxjVGFibGVMMEwxICAgICAgICBSTiA0Ci1wTE1BWFRhYmxlTDBMMSAgICAgICBSTiA0Ci1wUk1BWFRhYmxlTDBMMSAgICAgICBSTiA0Ci1wWmlnemFnVGFibGUgICAgICAgICBSTiA0Ci1Db3VudCAgICAgICAgICAgICAgICBSTiA2Ci0KLQotICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSB0byBzdG9yZSBvcHRpbWl6ZWQgVkxDLFppZ3phZywgUk1BWCwgTE1BWCBUYWJsZSBBZGRyZXNzZXMgCi0gICAgIAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBWbGNUYWJsZUwwTDEsNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBMTUFYVGFibGVMMEwxLDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwUk1BWFRhYmxlTDBMMSw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFppZ3phZ1RhYmxlLDQKLQotICAgICAgICAKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMscjEyCi0KLSAgICAgICAgTV9BUkcgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXJvblN0YWNrLDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwb2ludGVyIHRvIElucHV0IEFyZ3VtZW50IG9uIHN0YWNrICAgICAgICAgICAKLQotICAgICAgICBMRFIgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCA9YXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICA7Ly8gTG9hZCBBZGRyZXNzIG9mIHRoZSBaaWd6YWcgdGFibGUgICAgCi0gICAgICAgIEFERCAgICAgICAgICAgICBwWmlnemFnVGFibGUsIHBaaWd6YWdUYWJsZSwgUHJlZERpciwgTFNMICM2ICAgICAgICAgICA7Ly8gTG9hZGluZyBEaWZmZXJlbnQgdHlwZSBvZiB6aWd6YWcgdGFibGVzIGJhc2VkIG9uIFByZWREaXIKLSAgICAgICAKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBaaWd6YWcgdGFibGUgYWRkcmVzcyBvbiBzdGFjawotICAgICAgICBMRFIgICAgICAgICAgICAgcFZsY1RhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYVZsY0wwTDEgICAgICAgICAgICA7Ly8gTG9hZCBvcHRpbWl6ZWQgcGFja2VkIFZMQyBUYWJsZSB3aXRoIGJvdGggTD0wIGFuZCBMPTEgZW50cmllcwotICAgICAgICBNX1NUUiAgICAgICAgICAgcFZsY1RhYmxlTDBMMSxwcFZsY1RhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIFZMQyBUYWJsZSBhZGRyZXNzIG9uIHN0YWNrCi0gICAgICAgIExEUiAgICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYUwwTDFMTUFYICAgICAgICAgIDsvLyBMb2FkIExNQVggVGFibGUKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLHBwTE1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBMTUFYIFRhYmxlIGFkZHJlc3Mgb24gU3RhY2sKLSAgICAgICAgTERSICAgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhTDBMMVJNQVggICAgICAgICAgOy8vIExvYWQgUk1BWCBUYWJsZQotICAgICAgICBNT1YgICAgICAgICAgICAgQ291bnQsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCBTdGFydD0wICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSxwcFJNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgUk1BWCBUYWJsZSBhZGRyZXNzIG9uIHN0YWNrCi0gICAgICAgICAgICAgIAotCi0gICAgICAgCi0gICAgICAgIE1fTERSICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLHNob3J0VmlkZW9IZWFkZXJvblN0YWNrICAgICAgICAgICAgICA7Ly8gZ2V0IHRoZSBJbnB1dCBBcmd1bWVudCBmcm9tIHN0YWNrCi0KLSAgICAgICAgQkwgICAgICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlICAgICAgICAgICAgICAgOy8vIENhbGwgVW5zYWZlIEZ1bmN0aW9uCi0KLQotCi0gICAgICAgIAotICAgICAgICBNX0VORAotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjZhNjJiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07LyoqCi07ICogCi07ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDX3MucwotOyAqIE9wZW5NQVggREw6IHYxLjAuMgotOyAqIFJldmlzaW9uOiAgIDk2NDEKLTsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOyAqIAotOyAqIAotOyAqIAotOyAqCi07ICogRGVzY3JpcHRpb246IAotOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCi07ICogZm9yIGludGVyIGJsb2NrLgotOyAqCi07ICoKLTsgKgotOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyCi07ICoKLTsgKiBEZXNjcmlwdGlvbjoKLTsgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRyYSBjb2RlZCBibG9jay4KLTsgKgotOyAqIFJlbWFya3M6Ci07ICoKLTsgKiBQYXJhbWV0ZXJzOgotOyAqIFtpbl0gICAgcHBCaXRTdHJlYW0gICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotOyAqICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgotOyAqIFtpbl0gICAgcEJpdE9mZnNldCAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLTsgKiAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gICAgWzAtN10uCi07ICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgICBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgotOyAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKLTsgKiAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQotOyAqICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKLTsgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotOyAqICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci07ICogICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQotOyAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAotOyAqICAgICAgICAgICAgICAgICAgICBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQKLTsgKgotOyAqIFJldHVybiBWYWx1ZToKLTsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKLTsgKiAgIC1BdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0LCBvcgotOyAqICAgLXBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IKLTsgKiAgIC0qcEJpdE9mZnNldCBleGNlZWRzIFswLDddLgotOyAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCi07ICogICAtQXQgbGVhc3Qgb25lIG1hcmsgYml0IGlzIGVxdWFsIHRvIHplcm8KLTsgKiAgIC1FbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIHN0cmVhbSBjb2RlIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBWTEMgdGFibGUKLTsgKiAgIC1FbmNvdW50ZXJlZCBhbmQgaWxsZWdhbCBjb2RlIGluIHRoZSBWTEMgRkxDIHRhYmxlCi07ICogICAtVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0Ci07ICoKLTsgKi8KLQotCi0gICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKLQotCi0gICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0gICAgIAotICAgICAgCi0KLQotICAgICAgSUYgQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4Ci0KLSAgICAgCi0gICAgICAgIDsvLyBJbXBvcnQgdmFyaW91cyB0YWJsZXMgbmVlZGVkIGZvciB0aGUgZnVuY3Rpb24KLQotICAgICAgICAKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRyYVZsY0wwTDEgICAgICAgICAgICAgOy8vIENvbnRhaW5zIG9wdGltaXplZCBhbmQgcGFja2VkIFZMQyBUYWJsZXMgZm9yIGJvdGggTGFzdCA9MSBhbmQgbGFzdD0wCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUGFja2VkIGluIFJ1bjpMZXZlbDpMYXN0IGZvcm1hdAotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMUxNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgTE1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMVJNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgUk1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICA7Ly8gY29udGFpbnMgQ0xhc3NpY2FsLCBIb3Jpem9udGFsLCBWZXJ0aWNhbCBaaWd6YWcgdGFibGUgZW50cmllcyB3aXRoIGRvdWJsZSB0aGUgb3JpZ2luYWwgdmFsdWVzCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYUludHJhRENMdW1hQ2hyb21hSW5kZXggIDsvLyBDb250YWlucyBPcHRpbWl6ZWQgRENMdW1hIGFuZCBEQ0Nocm9tYSBJbmRleCB0YWJsZSBFbnRyaWVzCi0gICAgICAgIAotCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZQotCi07Ly9JbnB1dCBBcmd1bWVudHMKLQotcHBCaXRTdHJlYW0gICAgICAgICAgUk4gMAotcEJpdE9mZnNldCAgICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgICAgICAgUk4gMgotUHJlZERpciAgICAgICAgICAgICAgUk4gMwotc2hvcnRWaWRlb0hlYWRlciAgICAgUk4gMwotdmlkZW9Db21wICAgICAgICAgICAgUk4gNQotOy8vTG9jYWwgVmFyaWFibGVzCi0KLVJldHVybiAgICAgICAgICAgICAgIFJOIDAKLQotcERDTHVtYUNocm9tYUluZGV4ICAgUk4gNAotcERDQ2hyb21hSW5kZXggICAgICAgUk4gNwotcFZsY1RhYmxlTDBMMSAgICAgICAgUk4gNAotcExNQVhUYWJsZUwwTDEgICAgICAgUk4gNAotcFJNQVhUYWJsZUwwTDEgICAgICAgUk4gNAotcFppZ3phZ1RhYmxlICAgICAgICAgUk4gNAotQ291bnQgICAgICAgICAgICAgICAgUk4gNgotRENWYWx1ZVNpemUgICAgICAgICAgUk4gNgotcG93T2ZTaXplICAgICAgICAgICAgUk4gNwotdGVtcDEgICAgICAgICAgICAgICAgUk4gNQotCi0KLTsvLyBTY3JhdGNoIFJlZ2lzdGVycwotCi1SQml0U3RyZWFtICAgICAgICAgICBSTiA4Ci1SQml0QnVmZmVyICAgICAgICAgICBSTiA5Ci1SQml0Q291bnQgICAgICAgICAgICBSTiAxMAotCi1UMSAgICAgICAgICAgICAgICAgICBSTiAxMQotVDIgICAgICAgICAgICAgICAgICAgUk4gMTIKLURDVmFsICAgICAgICAgICAgICAgIFJOIDE0Ci0KLSAgICAgICAgCi0gICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgdG8gc3RvcmUgb3B0aW1pemVkIFZMQyxaaWd6YWcsIFJNQVgsIExNQVggVGFibGUgQWRkcmVzc2VzIAotICAgICAKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwVmxjVGFibGVMMEwxLDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwTE1BWFRhYmxlTDBMMSw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFJNQVhUYWJsZUwwTDEsNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBaaWd6YWdUYWJsZSw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwRENDb2VmZiw0Ci0gICAgICAgIAotCi0gICAgICAgIAotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyxyMTIKLQotICAgICAgICBNX0FSRyAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2ssNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUG9pbnRlciB0byBhcmd1bWVudCBvbiBzdGFjayAgCi0gICAgICAgIE1fQVJHICAgICAgICAgICB2aWRlb0NvbXBvbnN0YWNrLDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQb2ludGVyIHRvIGFyZ3VtZW50IG9uIHN0YWNrCi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWNvZGUgREMgQ29lZmZpY2llbnQKLQotICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgICAgIHBEQ0x1bWFDaHJvbWFJbmRleCwgPWFybVZDTTRQMl9hSW50cmFEQ0x1bWFDaHJvbWFJbmRleCA7Ly8gTG9hZCBPcHRpbWl6ZWQgVkxDIFRhYmxlIGZvciBMdW1pbmFuY2UgYW5kIENocm9taW5hbmNlCi0KLSAgICAgICAgOy8vIEluaXRpYWxpemluZyB0aGUgQml0c3RyZWFtIE1hY3JvCi0KLSAgICAgICAgTV9CRF9JTklUMCAgICAgIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBSQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQKLSAgICAgICAgTV9MRFIgICAgICAgICAgIHZpZGVvQ29tcCx2aWRlb0NvbXBvbnN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIE1fQkRfSU5JVDEgICAgICBUMSwgVDIsIFQyCi0gICAgICAgIEFERCAgICAgICAgICAgICBwRENMdW1hQ2hyb21hSW5kZXgscERDTHVtYUNocm9tYUluZGV4LHZpZGVvQ29tcCwgTFNMICM2ICAgICAgICAgICAgIAotICAgICAgICBNX0JEX0lOSVQyICAgICAgVDEsIFQyLCBUMgotICAgIAotICAgICAgICAKLSAgICAgICAgTV9CRF9WTEQgICAgICAgIERDVmFsdWVTaXplLFQxLFQyLHBEQ0x1bWFDaHJvbWFJbmRleCw0LDIgICAgICAgICAgICAgICAgICAgIDsvLyBWTEMgRGVjb2RlIHVzaW5nIG9wdGltaXplZCBMdW1pbmFuY2UgYW5kIENocm9taW5hbmNlIFZMQyBUYWJsZQotCi0gICAgCi0gICAgICAgCi0KLURlY29kZURDCi0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIENNUCAgICAgICAgICAgICBEQ1ZhbHVlU2l6ZSwjMTIgICAgIAotICAgICAgICBCR1QgICAgICAgICAgICAgRXhpdEVycm9yCi0gICAgICAgIAotICAgICAgICBDTVAgICAgICAgICAgICAgRENWYWx1ZVNpemUsIzAKLSAgICAgICAgTU9WRVEgICAgICAgICAgIERDVmFsLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBEQ1ZhbHVlU2l6ZSBpcyB6ZXJvIHRoZW4gREMgY29lZmYgPTAKLSAgICAgICAgQkVRICAgICAgICAgICAgIEFDRGVjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gcGVyZm9ybSBBQyBDb2VmZiBEZWNvZGluZwotICAgICAgICAKLSAgICAgICAgTV9CRF9WUkVBRDE2ICAgIERDVmFsLERDVmFsdWVTaXplLFQxLFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBHZXQgREMgVmFsdWUgRnJvbSBCaXQgc3RyZWFtCi0gICAgICAgICAKLQotICAgICAgICBNT1YgICAgICAgICAgICAgcG93T2ZTaXplLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIExTTCAgICAgICAgICAgICBwb3dPZlNpemUsRENWYWx1ZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcG93T2ZTaXplPXBvdygyLERDVmFsdWVTaXplKQotICAgICAgICBDTVAgICAgICAgICAgICAgRENWYWwscG93T2ZTaXplLExTUiAjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgRENWYWwgd2l0aCBwb3dPZlNpemUvMiAKLSAgICAgICAgQURETFQgICAgICAgICAgIERDVmFsLERDVmFsLCMxCi0gICAgICAgIFNVQkxUICAgICAgICAgICBEQ1ZhbCxEQ1ZhbCxwb3dPZlNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgTGVzc3RoYW4gcG93T2ZTaXplLzIgRENWYWw9RENWYWwtcG93T2ZTaXplKzEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFbHNlIERDVmFsPSBmZXRjaGJpdHMgZnJvbSBiaXQgc3RyZWFtCi0KLUNoZWNrRENWYWx1ZVNpemUKLSAgICAgICAgCi0gICAgICAgIENNUCAgICAgICAgICAgICBEQ1ZhbHVlU2l6ZSwjOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgRENWYWx1ZVNpemUgZ3JlYXRlciB0aGFuIDggY2hlY2sgbWFya2VyIGJpdAotCi0gICAgICAgIEJMRSAgICAgICAgICAgICBBQ0RlY29kZQotCi0gICAgICAgIE1fQkRfUkVBRDggICAgICB0ZW1wMSwxLFQxCi0gICAgICAgIFRFUSAgICAgICAgICAgICB0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgTWFya2VyIGJpdCBpcyB6ZXJvIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlCi0gICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IKLQotICAgICAgICAKLQotICAgICAgICA7Ly8gRGVjb2RlIEFDIENvZWZmaWNpZW50Ci0KLUFDRGVjb2RlCi0KLSAgICAgICAgTV9TVFIgICAgICAgICAgIERDVmFsLHBEQ0NvZWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIERlY29kZWQgREMgQ29lZmYgb24gU3RhY2sKLSAgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlcm1pbmF0aW5nIHRoZSBCaXQgc3RyZWFtIE1hY3JvCi0gICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSwgPWFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiAgICAgICAgICA7Ly8gTG9hZCBaaWd6YWcgdGFsYmUgYWRkcmVzcyAgIAotICAgICAgICBBREQgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCBwWmlnemFnVGFibGUsIFByZWREaXIsIExTTCAjNiAgICAgICAgICAgICAgICA7Ly8gTW9kaWZ5IHRoZSBaaWd6YWcgdGFibGUgYWRyZXNzIGJhc2VkIG9uIFByZWREaXIgICAgICAgICAgICAgICAgCi0gICAgICAgCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwWmlnemFnVGFibGUscHBaaWd6YWdUYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSB6aWd6YWcgdGFibGUgb24gc3RhY2sKLSAgICAgICAgTERSICAgICAgICAgICAgIHBWbGNUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFWbGNMMEwxICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBPcHRpbWl6ZWQgVkxDIFRhYmxlIFdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MSBFbnRyaWVzCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwVmxjVGFibGVMMEwxLHBwVmxjVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBPcHRpbWl6ZWQgVkxDIFRhYmxlIG9uIHN0YWNrCi0gICAgICAgIExEUiAgICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYUwwTDFMTUFYICAgICAgICAgICAgICAgOy8vIExvYWQgTE1BWCBUYWJsZQotICAgICAgICBNX1NUUiAgICAgICAgICAgcExNQVhUYWJsZUwwTDEscHBMTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgTE1BWCB0YWJsZSBvbiBzdGFjawotICAgICAgICBMRFIgICAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFMMEwxUk1BWCAgICAgICAgICAgICAgIDsvLyBMb2FkIFJNQVggVGFibGUKLSAgICAgICAgTU9WICAgICAgICAgICAgIENvdW50LCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCBTdGFydCA9MSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNX1NUUiAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEscHBSTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgUk1BWCBUYWJsZSBvbiBTdGFjawotICAgICAgICAKLSAgICAgICAKLSAgICAgICAgTV9MRFIgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2sgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgdGhlIElucHV0IEFyZ3VtZW50IEZyb20gU3RhY2sKLSAgICAgICAgCi0gICAgICAgIEJMICAgICAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZSAgICAgICAgICAgICAgICAgICAgOy8vIENhbGwgdGhlIFVuc2FmZSBGdW5jdGlvbgotCi0gICAgICAgIE1fTERSICAgICAgICAgICBEQ1ZhbCxwRENDb2VmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBHZXQgdGhlIERlY29kZWQgREMgVmFsdWUgRnJvbSBTdGFjawotICAgICAgICBTVFJIICAgICAgICAgICAgRENWYWwsW3BEc3RdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgdGhlIERDIFZhbHVlIAotICAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9LCi0gICAgICAgIAotICAgICAgICAgICAgICAKLQotRXhpdEVycm9yCi0gCi0gICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZXJtaW5hdGluZyB0aGUgQml0IFN0cmVhbSBNYWNybyBpbiBjYXNlIG9mIGFuIEVycm9yCi0gICAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfRXJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gRXJyb3IgTWVzc2FnZSAKLUV4aXRPSwotICAgICAgCi0gICAgICAgIE1fRU5ECi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmFjZDUxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMl9GaW5kTVZwcmVkX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDk2NDEKLTsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLTsvLyBGdW5jdGlvbjoKLTsvLyAgICAgb214VkNNNFAyX0ZpbmRNVnByZWQKLTsvLwotICAgICAgICA7Ly8gSW5jbHVkZSBoZWFkZXJzCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgSU5DTFVERSBhcm1WQ0NPTU1fcy5oCi0KLSAgICAgICAgOy8vIERlZmluZSBjcHUgdmFyaWFudHMKLSAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBJRiBBUk0xMTM2SlMKLSAgICAgICAgCi0gICAgICAgIE1fVEFCTEUgYXJtVkNNNFAyX3BCbGtJbmRleFRhYmxlCi0gICAgICAgIERDRCAgT01YVkNCbGswLCBPTVhWQ0JsazEKLSAgICAgICAgRENEICBPTVhWQ0JsazIsIE9NWFZDQmxrMwotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLXBTcmNNVkN1ck1CICAgICAgICAgICAgUk4gMAotcFNyY0NhbmRNVjEgICAgICAgICAgICBSTiAxCi1wU3JjQ2FuZE1WMiAgICAgICAgICAgIFJOIDIKLXBTcmNDYW5kTVYzICAgICAgICAgICAgUk4gMwotcERzdE1WUHJlZCAgICAgICAgICAgICBSTiA0Ci1wRHN0TVZQcmVkTUUgICAgICAgICAgIFJOIDUKLWlCbGsgICAgICAgICAgICAgICAgICAgUk4gNgotCi1wVGFibGUgICAgICAgICAgICAgICAgIFJOIDQKLUNhbmRNViAgICAgICAgICAgICAgICAgUk4gMTIKLQotcENhbmRNVjEgICAgICAgICAgICAgICBSTiA3Ci1wQ2FuZE1WMiAgICAgICAgICAgICAgIFJOIDgKLXBDYW5kTVYzICAgICAgICAgICAgICAgUk4gOQotCi1DYW5kTVYxZHggICAgICAgICAgICAgIFJOIDAgCi1DYW5kTVYxZHkgICAgICAgICAgICAgIFJOIDEgCi1DYW5kTVYyZHggICAgICAgICAgICAgIFJOIDIKLUNhbmRNVjJkeSAgICAgICAgICAgICAgUk4gMwotQ2FuZE1WM2R4ICAgICAgICAgICAgICBSTiAxMAotQ2FuZE1WM2R5ICAgICAgICAgICAgICBSTiAxMQotCi10ZW1wICAgICAgICAgICAgICAgICAgIFJOIDE0Ci0KLXplcm8gICAgICAgICAgICAgICAgICAgUk4gMTQKLXJldHVybiAgICAgICAgICAgICAgICAgUk4gMAotICAgICAgICAKLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBNYWluIHJvdXRpbmUKLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgCi0KLSAgICAgICAgTV9BTExPQzQgTVYsIDQKLSAgICAgICAgCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIgCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAyX0ZpbmRNVnByZWQsIHIxMQotICAgICAgICAKLSAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKLSAgICAgICAgTV9BUkcgICBwcERzdE1WUHJlZCwgIDQKLSAgICAgICAgTV9BUkcgICBwcERzdE1WUHJlZE1FLCA0Ci0gICAgICAgIE1fQVJHICAgQmxrLCA0Ci0gICAgICAgIAotICAgICAgICBNX0FEUiBDYW5kTVYsIE1WCi0gICAgICAgIE1PViAgIHplcm8sICMwCi0gICAgICAgIE1fTERSIGlCbGssIEJsawotICAgICAgICAKLSAgICAgICAgOy8vIFNldCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlc2UKLSAgICAgICAgOy8vIHRvIGJlIHVzZWQgaWYgcFNyY0NhbmRNVlsxfDJ8M10gPT0gTlVMTAotICAgICAgICBNT1YgICBwQ2FuZE1WMSwgQ2FuZE1WCi0gICAgICAgIE1PViAgIHBDYW5kTVYyLCBDYW5kTVYKLSAgICAgICAgTU9WICAgcENhbmRNVjMsIENhbmRNVgotICAgIAotICAgICAgICBTVFIgICB6ZXJvLCBbQ2FuZE1WXQotCi0gICAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGNhc2UgYmFzZWQgb24gYmxrIG51bWJlcgotICAgICAgICBNX1NXSVRDSCBpQmxrCi0gICAgICAgIE1fQ0FTRSAgIE9NWFZDQmxrMCAgICAgIDsvLyBpQmxrPTAKLSAgICAgICAgTV9DQVNFICAgT01YVkNCbGsxICAgICAgOy8vIGlCbGs9MAotICAgICAgICBNX0NBU0UgICBPTVhWQ0JsazIgICAgICA7Ly8gaUJsaz0wCi0gICAgICAgIE1fQ0FTRSAgIE9NWFZDQmxrMyAgICAgIDsvLyBpQmxrPTAKLSAgICAgICAgTV9FTkRTV0lUQ0gKLSAgICAgICAgCi1PTVhWQ0JsazAKLSAgICAgICAgQ01QICAgcFNyY0NhbmRNVjEsICMwCi0gICAgICAgIEFERE5FIHBDYW5kTVYxLCBwU3JjQ2FuZE1WMSwgIzQKLSAgICAgICAgCi0gICAgICAgIENNUCAgIHBTcmNDYW5kTVYyLCAjMAotICAgICAgICBBRERORSBwQ2FuZE1WMiwgcFNyY0NhbmRNVjIsICM4Ci0KLSAgICAgICAgQ01QICAgcFNyY0NhbmRNVjMsICMwCi0gICAgICAgIEFERE5FIHBDYW5kTVYzLCBwU3JjQ2FuZE1WMywgIzgKLSAgICAgICAgQ01QRVEgcFNyY0NhbmRNVjEsICMwCi0gICAgCi0gICAgICAgIE1PVkVRIHBDYW5kTVYzLCBwQ2FuZE1WMgotICAgICAgICBNT1ZFUSBwQ2FuZE1WMSwgcENhbmRNVjIKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgQ01QICAgcFNyY0NhbmRNVjEsICMwCi0gICAgICAgIENNUEVRIHBTcmNDYW5kTVYyLCAjMAotICAgIAotICAgICAgICBNT1ZFUSBwQ2FuZE1WMSwgcENhbmRNVjMKLSAgICAgICAgTU9WRVEgcENhbmRNVjIsIHBDYW5kTVYzCi0gICAgICAgIAotICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMiwgIzAKLSAgICAgICAgQ01QRVEgcFNyY0NhbmRNVjMsICMwCi0gICAgCi0gICAgICAgIE1PVkVRIHBDYW5kTVYyLCBwQ2FuZE1WMQotICAgICAgICBNT1ZFUSBwQ2FuZE1WMywgcENhbmRNVjEKLSAgICAgICAgCi0gICAgICAgIEIgICAgIEJsa0VuZAotICAgIAotT01YVkNCbGsxCi0gICAgICAgIE1PViAgIHBDYW5kTVYxLCBwU3JjTVZDdXJNQgotICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMywgIzAKLSAgICAgICAgQURETkUgcENhbmRNVjMsIHBTcmNDYW5kTVYzLCAjOAotICAgICAgICAKLSAgICAgICAgQ01QICAgcFNyY0NhbmRNVjIsICMwCi0gICAgICAgIEFERE5FIHBDYW5kTVYyLCBwU3JjQ2FuZE1WMiwgIzEyCi0gICAgCi0gICAgICAgIENNUEVRIHBTcmNDYW5kTVYzLCAjMAotICAgIAotICAgICAgICBNT1ZFUSBwQ2FuZE1WMiwgcENhbmRNVjEKLSAgICAgICAgTU9WRVEgcENhbmRNVjMsIHBDYW5kTVYxCi0gICAgICAgICAgICAKLSAgICAgICAgQiAgICAgQmxrRW5kCi0KLU9NWFZDQmxrMgotICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMSwgIzAKLSAgICAgICAgTU9WICAgcENhbmRNVjIsIHBTcmNNVkN1ck1CCi0gICAgICAgIEFERCAgIHBDYW5kTVYzLCBwU3JjTVZDdXJNQiwgIzQKLSAgICAgICAgQURETkUgcENhbmRNVjEsIHBTcmNDYW5kTVYxLCAjMTIKLSAgICAgICAgQiAgICAgQmxrRW5kCi0KLU9NWFZDQmxrMwotICAgICAgICBBREQgICBwQ2FuZE1WMSwgcFNyY01WQ3VyTUIsICM4Ci0gICAgICAgIE1PViAgIHBDYW5kTVYyLCBwU3JjTVZDdXJNQgotICAgICAgICBBREQgICBwQ2FuZE1WMywgcFNyY01WQ3VyTUIsICM0Ci0gICAgCi1CbGtFbmQKLQotICAgICAgICA7Ly8gVXNpbmcgdGhlIHRyYW5zcGVyYW5jeSBpbmZvLCB6ZXJvCi0gICAgICAgIDsvLyBvdXQgdGhlIGNhbmRpZGF0ZSBNViBpZiBuZWNjZXNhcnkKLSAgICAgICAgTERSU0ggQ2FuZE1WMWR4LCBbcENhbmRNVjFdLCAjMgotICAgICAgICBMRFJTSCBDYW5kTVYyZHgsIFtwQ2FuZE1WMl0sICMyCi0gICAgICAgIExEUlNIIENhbmRNVjNkeCwgW3BDYW5kTVYzXSwgIzIKLSAgICAKLSAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKLSAgICAgICAgTV9MRFIgcERzdE1WUHJlZE1FLCBwcERzdE1WUHJlZE1FCi0KLSAgICAgICAgTERSU0ggQ2FuZE1WMWR5LCBbcENhbmRNVjFdCi0gICAgICAgIExEUlNIIENhbmRNVjJkeSwgW3BDYW5kTVYyXQotICAgICAgICBMRFJTSCBDYW5kTVYzZHksIFtwQ2FuZE1WM10KLQotICAgICAgICBDTVAgcERzdE1WUHJlZE1FLCAjMCAgICAgICAgCi0KLSAgICAgICAgOy8vIFN0b3JlIHRoZSBjYW5kaWRhdGUgTVYncyBpbnRvIHRoZSBwRHN0TVZQcmVkTUUsIAotICAgICAgICA7Ly8gdGhlc2UgY2FuIGJlIHVzZWQgaW4gdGhlIGZhc3QgYWxnb3JpdGhtIGlmIGltcGxlbWVudGVkIAotCi0gICAgICAgIFNUUkhORSBDYW5kTVYxZHgsIFtwRHN0TVZQcmVkTUVdLCAjMgotICAgICAgICBTVFJITkUgQ2FuZE1WMWR5LCBbcERzdE1WUHJlZE1FXSwgIzIgICAgICAgIAotICAgICAgICBTVFJITkUgQ2FuZE1WMmR4LCBbcERzdE1WUHJlZE1FXSwgIzIKLSAgICAgICAgU1RSSE5FIENhbmRNVjJkeSwgW3BEc3RNVlByZWRNRV0sICMyCi0gICAgICAgIFNUUkhORSBDYW5kTVYzZHgsIFtwRHN0TVZQcmVkTUVdLCAjMgotICAgICAgICBTVFJITkUgQ2FuZE1WM2R5LCBbcERzdE1WUHJlZE1FXQotICAgICAgICAgICAKLSAgICAgICAgOyBGaW5kIHRoZSBtZWRpYW4gb2YgdGhlIDMgY2FuZGlkYXRlIE1WJ3MKLSAgICAgICAgTV9NRURJQU4zIENhbmRNVjFkeCwgQ2FuZE1WMmR4LCBDYW5kTVYzZHgsIHRlbXAKLQotICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjawotICAgICAgICBNX0xEUiBwRHN0TVZQcmVkLCBwcERzdE1WUHJlZAotCi0gICAgICAgIE1fTUVESUFOMyBDYW5kTVYxZHksIENhbmRNVjJkeSwgQ2FuZE1WM2R5LCB0ZW1wCi0gICAgCi0gICAgICAgIFNUUkggQ2FuZE1WM2R4LCBbcERzdE1WUHJlZF0sICMyCi0gICAgICAgIFNUUkggQ2FuZE1WM2R5LCBbcERzdE1WUHJlZF0KLQotICAgICAgICBNT1YgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgIAotICAgICAgICBNX0VORAotICAgIEVORElGIDsvLyBBUk0xMTM2SlMgOkxPUjogQ29ydGV4QTgKLSAgICAKLSAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGtfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGY5MWZiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAyX0lEQ1Q4eDhibGtfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotOy8vIEZ1bmN0aW9uOgotOy8vICAgICBvbXhWQ000UDJfSURDVDh4OGJsawotOy8vCi0gICAgICAgIDsvLyBJbmNsdWRlIGhlYWRlcnMKLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi0gICAgICAgIDsvLyBEZWZpbmUgY3B1IHZhcmlhbnRzCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgICAgSU5DTFVERSBhcm1DT01NX0lEQ1Rfcy5oICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIElNUE9SVCBhcm1DT01NX0lEQ1RQcmVTY2FsZQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIEZ1bmN0aW9uIHByb3RvdHlwZQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICAgICBPTVhSZXN1bHQKLSAgICAgICAgOy8vICAgICBvbXhWQ000UDJfSURDVDh4OGJsayhjb25zdCBPTVhfUzE2KiBwU3JjLAotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzE2KiBwRHN0KQotICAgICAgICA7Ly8gICAgCi0gICAgICAgIAotICAgIElGIEFSTTExMzZKUyA6TE9SOiBDb3J0ZXhBOAotICAgICAgICBNX0FMTE9DNCAgcHBEZXN0LCA0Ci0gICAgICAgIE1fQUxMT0M0ICBwU3RyaWRlLCA0Ci0gICAgICAgIE1fQUxMT0M4ICBwQmxrLCAyKjgqOAotICAgIEVORElGCi0gICAgCi0gICAgSUYgQVJNMTEzNkpTCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAyX0lEQ1Q4eDhibGssIHIxMQotICAgIEVORElGCi0gICAgCi0gICAgICAgIAotICAgIElGIEFSTTExMzZKUyA6TE9SOiBDb3J0ZXhBOAotICAgICAgICAKLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotcFNyYyAgICAgICAgICAgIFJOIDAKLXBEc3QgICAgICAgICAgICBSTiAxCi0KLTsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKLVJlc3VsdCAgICAgICAgICBSTiAwCi0KLTsvLyBQcm90b3R5cGUgZm9yIG1hY3JvIE1fSURDVAotOy8vIHBTcmMgICAgICAgICAgICBSTiAwICA7Ly8gc291cmNlIGRhdGEgYnVmZmVyCi07Ly8gU3RyaWRlICAgICAgICAgIFJOIDEgIDsvLyBkZXN0aW5hdGlvbiBzdHJpZGUgaW4gYnl0ZXMKLTsvLyBwRGVzdCAgICAgICAgICAgUk4gMiAgOy8vIGRlc3RpbmF0aW9uIGRhdGEgYnVmZmVyCi07Ly8gcFNjYWxlICAgICAgICAgIFJOIDMgIDsvLyBwb2ludGVyIHRvIHNjYWxpbmcgdGFibGUKLQotcFNyYyAgICBSTiAwICAgIAotU3RyaWRlICBSTiAxICAgIAotcERlc3QgICBSTiAyICAgIAotcFNjYWxlICBSTiAzICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBwRGVzdCwgcERzdAotICAgICAgICBMRFIgICAgICAgICBwU2NhbGUsID1hcm1DT01NX0lEQ1RQcmVTY2FsZSAgICAgICAgCi0gICAgICAgIE1fSURDVCAgICAgIHM5LCBzMTYsIDE2ICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIFJlc3VsdCwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FTkQgICAgICAgCi0gICAgRU5ESUYgIAotICAgICAgICA7Ly8gQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4Ci0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFjNmZmOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9ja19zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw3MjcgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLTsvLyBEZXNjcmlwdGlvbjoKLTsvLwotOy8vCi0KLTsvLyBJbmNsdWRlIHN0YW5kYXJkIGhlYWRlcnMKLSAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLQotOy8vIEltcG9ydCBzeW1ib2xzIHJlcXVpcmVkIGZyb20gb3RoZXIgZmlsZXMKLQotICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsvLyBBUk0xMTM2SlMgaW1wbGVtZW50YXRpb24KLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICBJRiAgQVJNMTEzNkpTCi0gICAgCi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07Ly8gTUFDUk8gREVGSU5JVElPTlMKLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICA7Ly8gRGVzY3JpcHRpb246Ci0gICAgOy8vCi0gICAgOy8vICAgZGVzdFtqXSA9ICh4W2pdICsgeVtqXSArIHJvdW5kKSA+PiAxLCAgIGo9MC4uMwotICAgIDsvLwotICAgIDsvLyBTaW1pbGFyIHRvIFVIQUREOCBpbnN0cnVjdGlvbiwgYnV0IHdpdGggYSByb3VuZGluZyB2YWx1ZSBvZiAxIGFkZGVkIHRvCi0gICAgOy8vIGVhY2ggc3VtIGJlZm9yZSBkaXZpZGluZyBieSB0d28sIGlmIHJvdW5kIGlzIDEKLSAgICA7Ly8KLSAgICA7Ly8gU3ludGF4OgotICAgIDsvLyBNX1VIQUREOFIgICAkZGVzdCwgJHgsICR5LCAkcm91bmQsICRtYXNrCi0gICAgOy8vCi0gICAgOy8vIElucHV0czoKLSAgICA7Ly8gJHggICAgICAgIGZvdXIgcGFja2VkIGJ5dGVzLCAgIHhbM10gOiAgeFsyXSAgOiAgeFsxXSAgOiAgeFswXQotICAgIDsvLyAkeSAgICAgICAgZm91ciBwYWNrZWQgYnl0ZXMsICAgeVszXSA6ICB5WzJdICA6ICB5WzFdICA6ICB5WzBdCi0gICAgOy8vICRyb3VuZCAgICAwIGlmIG5vIHJvdW5kaW5nIHRvIGJlIGFkZGVkLCAxIGlmIHJvdW5kaW5nIHRvIGJlIGRvbmUKLSAgICA7Ly8gJG1hc2sgICAgIHNvbWUgcmVnaXN0ZXIgc2V0IHRvIDB4ODA4MDgwODAKLSAgICA7Ly8KLSAgICA7Ly8gT3V0cHV0czoKLSAgICA7Ly8gJGRlc3QgICAgIGZvdXIgcGFja2VkIGJ5dGVzLCAgIHpbM10gOiAgelsyXSAgOiAgelsxXSAgOiAgelswXQotCi0gICAgTUFDUk8KLSAgICBNX1VIQUREOFIgICAkZGVzdCwgJHgsICR5LCAkcm91bmQsICRtYXNrCi0gICAgSUYgJHJvdW5kID0gMQotICAgICAgICBJRiAgJGRlc3QgLz0gJHkKLSAgICAgICAgICAgIE1WTiAgICAgICAgICRkZXN0LCAkeAotICAgICAgICAgICAgVUhTVUI4ICAgICAgJGRlc3QsICR5LCAkZGVzdAotICAgICAgICAgICAgRU9SICAgICAgICAgJGRlc3QsICRkZXN0LCAkbWFzawotICAgICAgICBFTFNFCi0gICAgICAgICAgICBNVk4gICAgICAgICAkZGVzdCwgJHkKLSAgICAgICAgICAgIFVIU1VCOCAgICAgICRkZXN0LCAkeCwgJGRlc3QKLSAgICAgICAgICAgIEVPUiAgICAgICAgICRkZXN0LCAkZGVzdCwgJG1hc2sKLSAgICAgICAgRU5ESUYKLSAgICBFTFNFCi0gICAgICAgIFVIQUREOCAgICAgICRkZXN0LCAkeCwgJHkKLSAgICBFTkRJRgotICAgIE1FTkQKLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICA7Ly8gRGVzY3JpcHRpb246Ci0gICAgOy8vIExvYWQgOCBieXRlcyBmcm9tICRwU3JjIChhbGlnbmVkIG9yIHVuYWxpZ25lZCBsb2NhdGlvbnMpCi0gICAgOy8vCi0gICAgOy8vIFN5bnRheDoKLSAgICA7Ly8gTV9MT0FEX1ggICAgJHBTcmMsICRzcmNTdGVwLCAkb3V0MCwgJG91dDEsICRzY3JhdGNoLCAkb2Zmc2V0Ci0gICAgOy8vIAotICAgIDsvLyBJbnB1dHM6Ci0gICAgOy8vICRwU3JjICAgICAgIDQgYnl0ZSBhbGlnbmVkIHNvdXJjZSBwb2ludGVyIHRvIGFuIGFkZHJlc3MganVzdCBsZXNzIHRoYW4gCi0gICAgOy8vICAgICAgICAgICAgIG9yIGVxdWFsIHRvIHRoZSBkYXRhIGxvY2F0aW9uCi0gICAgOy8vICRzcmNTdGVwICAgIFRoZSBzdHJpZGUgb24gc291cmNlCi0gICAgOy8vICRzY3JhdGNoICAgIEEgc2NyYXRjaCByZWdpc3RlciwgdXNlZCBpbnRlcm5hbGx5IGZvciB0ZW1wIGNhbGN1bGF0aW9ucwotICAgIDsvLyAkb2Zmc2V0ICAgICBEaWZmZXJlbmNlIG9mIHNvdXJjZSBkYXRhIGxvY2F0aW9uIHRvIHRoZSBzb3VyY2UgcG9pbnRlcgotICAgIDsvLyAgICAgICAgICAgICBVc2Ugd2hlbiAkb2Zmc2V0ICE9IDAgKHVuYWxpZ25lZCBsb2FkKQotICAgIDsvLwotICAgIDsvLyBPdXRwdXRzOgotICAgIDsvLyAkcFNyYyAgICAgICBJbiBjYXNlIHRoZSBtYWNybyBhY2NlcHRzIHN0cmlkZSwgaXQgaW5jcmVtZW50cyB0aGUgcFNyYyBieSAKLSAgICA7Ly8gICAgICAgICAgICAgdGhhdCB2YWx1ZSwgZWxzZSB1bmNoYW5nZWQKLSAgICA7Ly8gJG91dDAgICAgICAgZm91ciBwYWNrZWQgYnl0ZXMsICAgelszXSA6ICB6WzJdICA6ICB6WzFdICA6ICB6WzBdCi0gICAgOy8vICRvdXQxICAgICAgIGZvdXIgcGFja2VkIGJ5dGVzLCAgIHpbN10gOiAgels2XSAgOiAgels1XSAgOiAgels0XQotICAgIDsvLwotICAgIDsvLyBOb3RlOiB7JG91dDAsICRvdXQxLCAkc2NyYXRjaH0gc2hvdWxkIGJlIHJlZ2lzdGVycyB3aXRoIGFzY2VuZGluZwotICAgIDsvLyByZWdpc3RlciBudW1iZXJpbmcuIEluIGNhc2Ugb2Zmc2V0IGlzIDAsICRzY3JhdGNoIGlzIG5vdCBtb2RpZmllZC4KLQotICAgIE1BQ1JPCi0gICAgTV9MT0FEX1ggICAgJHBTcmMsICRzcmNTdGVwLCAkb3V0MCwgJG91dDEsICRzY3JhdGNoLCAkb2Zmc2V0Ci0gICAgICAgIElGICRvZmZzZXQgPSAwCi0gICAgICAgICAgICBMRE0gICAgICAgICAkcFNyYywgeyRvdXQwLCAkb3V0MX0KLSAgICAgICAgICAgIEFERCAgICAgICAgICRwU3JjLCAkcFNyYywgJHNyY1N0ZXAKLSAgICAgICAgRUxTRQotICAgICAgICAgICAgTERNICAgICAgICAgJHBTcmMsIHskb3V0MCwgJG91dDEsICRzY3JhdGNofSAKLSAgICAgICAgICAgIEFERCAgICAgICAgICRwU3JjLCAkcFNyYywgJHNyY1N0ZXAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgTU9WICAgICAgICAgJG91dDAsICRvdXQwLCBMU1IgIzggKiAkb2Zmc2V0Ci0gICAgICAgICAgICBPUlIgICAgICAgICAkb3V0MCwgJG91dDAsICRvdXQxLCBMU0wgIygzMiAtIDggKiAoJG9mZnNldCkpCi0gICAgICAgICAgICBNT1YgICAgICAgICAkb3V0MSwgJG91dDEsIExTUiAjOCAqICRvZmZzZXQKLSAgICAgICAgICAgIE9SUiAgICAgICAgICRvdXQxLCAkb3V0MSwgJHNjcmF0Y2gsIExTTCAjKDMyIC0gOCAqICgkb2Zmc2V0KSkKLSAgICAgICAgRU5ESUYKLSAgICBNRU5ECi0KLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICA7Ly8gRGVzY3JpcHRpb246Ci0gICAgOy8vIExvYWRzIHRocmVlIHdvcmRzIGZvciBYIGludGVycG9sYXRpb24sIHVwZGF0ZSBwb2ludGVyIHRvIG5leHQgcm93LiBGb3IgCi0gICAgOy8vIFggaW50ZXJwb2xhdGlvbiwgZ2l2ZW4gYSB0cnVuY2F0ZWQtNGJ5dGVBbGlnbmVkIHNvdXJjZSBwb2ludGVyLCAKLSAgICA7Ly8gaW52YXJpYWJseSB0aHJlZSBjb250aW5vdXMgd29yZHMgYXJlIHJlcXVpcmVkIGZyb20gdGhlcmUgdG8gZ2V0IHRoZQotICAgIDsvLyBuaW5lIGJ5dGVzIGZyb20gdGhlIHNvdXJjZSBwb2ludGVyIGZvciBmaWx0ZXJpbmcuIAotICAgIDsvLwotICAgIDsvLyBTeW50YXg6Ci0gICAgOy8vIE1fTE9BRF9YSU5UICRwU3JjLCAkc3JjU3RlcCwgJG9mZnNldCwgJHdvcmQwLCAkd29yZDEsICR3b3JkMiwgJHdvcmQzCi0gICAgOy8vIAotICAgIDsvLyBJbnB1dHM6Ci0gICAgOy8vICRwU3JjICAgICAgIDQgYnl0ZSBhbGlnbmVkIHNvdXJjZSBwb2ludGVyIHRvIGFuIGFkZHJlc3MganVzdCBsZXNzIHRoYW4gCi0gICAgOy8vICAgICAgICAgICAgIG9yIGVxdWFsIHRvIHRoZSBkYXRhIGxvY2F0aW9uCi0gICAgOy8vCi0gICAgOy8vICRzcmNTdGVwICAgIFRoZSBzdHJpZGUgb24gc291cmNlCi0gICAgOy8vCi0gICAgOy8vICRvZmZzZXQgICAgIERpZmZlcmVuY2Ugb2Ygc291cmNlIGRhdGEgbG9jYXRpb24gdG8gdGhlIHNvdXJjZSBwb2ludGVyCi0gICAgOy8vICAgICAgICAgICAgIFVzZSB3aGVuICRvZmZzZXQgIT0gMCAodW5hbGlnbmVkIGxvYWQpCi0gICAgOy8vCi0gICAgOy8vIE91dHB1dHM6Ci0gICAgOy8vICRwU3JjICAgICAgIEluY3JlbWVudGVkIGJ5ICRzcmNTdGVwCi0gICAgOy8vCi0gICAgOy8vICR3b3JkMCwgJHdvcmQxLCAkd29yZDIsICR3b3JkMwotICAgIDsvLyAgICAgICAgICAgICBUaHJlZSBvZiB0aGVzZSBhcmUgb3V0cHV0cyBiYXNlZCBvbiB0aGUgJG9mZnNldCBwYXJhbWV0ZXIuIAotICAgIDsvLyAgICAgICAgICAgICBUaGUgb3V0cHV0cyBhcmUgc3BlY2lmaWNhbGx5IGdlbmVyYXRlZCB0byBiZSBwcm9jZXNzZWQgYnkgCi0gICAgOy8vICAgICAgICAgICAgIHRoZSBNX0VYVF9YSU5UIG1hY3JvLiBGb2xsb3dpbmcgaXMgdGhlIGlsbHVzdHJhdGlvbiB0byBzaG93IAotICAgIDsvLyAgICAgICAgICAgICBob3cgdGhlIG5pbmUgYnl0ZXMgYXJlIHNwYW5uZWQgZm9yIGRpZmZlcmVudCBvZmZzZXRzIGZyb20gCi0gICAgOy8vICAgICAgICAgICAgIG5vdFRydW5jYXRlZEZvckFsaWdubWVudFNvdXJjZVBvaW50ZXIuCi0gICAgOy8vCi0gICAgOy8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7Ly8gICAgICAgICAgICAgfCBPZmZzZXQgfCBBbGlnbmVkIFB0ciB8IHdvcmQwIHwgd29yZDEgfCB3b3JkMiB8IHdvcmQzIHwKLSAgICA7Ly8gICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKLSAgICA7Ly8gICAgICAgICAgICAgfCAgICAwICAgfCAgICAgICAwICAgICB8IDAxMjMgIHwgNDU2NyAgfCA4eHh4ICB8ICAgICAgIHwKLSAgICA7Ly8gICAgICAgICAgICAgfCAgICAxICAgfCAgICAgIC0xICAgICB8IHgwMTIgIHwgMzQ1NiAgfCA3OHh4ICB8ICAgICAgIHwKLSAgICA7Ly8gICAgICAgICAgICAgfCAgICAyICAgfCAgICAgIC0yICAgICB8IHh4MDEgIHwgMjM0NSAgfCA2Nzh4ICB8ICAgICAgIHwKLSAgICA7Ly8gICAgICAgICAgICAgfCAgICAzICAgfCAgICAgIC0zICAgICB8IHh4eDAgIHwgICAgICAgfCAxMjM0ICB8IDU2NzggIHwKLSAgICA7Ly8gICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsvLyAKLSAgICA7Ly8gICAgICAgICAgICAgd2hlcmUgdGhlIG51bWJlcmluZyAoMC04KSBpcyB0byBkZXNpZ25hdGUgdGhlIDkgYnl0ZXMgZnJvbQotICAgIDsvLyAgICAgICAgICAgICBzdGFydCBvZiBhIHBhcnRpY3VsYXIgcm93LiBUaGUgaWxsdXN0cmF0aW9uIGRvZXNuJ3QgdGFrZSBpbiAKLSAgICA7Ly8gICAgICAgICAgICAgYWNjb3VudCB0aGUgcG9zaXRpb25pbmcgb2YgYnl0ZXMgd2l0aCBpbiB0aGUgd29yZCBhbmQgdGhlIAotICAgIDsvLyAgICAgICAgICAgICBtYWNybyBjb21iaW5hdGlvbiB3aXRoIE1fRVhUX1hJTlQgd2lsbCB3b3JrIG9ubHkgaW4gbGl0dGxlIAotICAgIDsvLyAgICAgICAgICAgICBlbmRpYW4gZW52aXJvbnMKLSAgICA7Ly8gCi0gICAgOy8vIE5vdGU6IHskd29yZDAsICR3b3JkMSwgJHdvcmQyLCAkd29yZDN9IHNob3VsZCBiZSByZWdpc3RlcnMgd2l0aCBhc2NlbmRpbmcKLSAgICA7Ly8gcmVnaXN0ZXIgbnVtYmVyaW5nCi0KLSAgICBNQUNSTwotICAgIE1fTE9BRF9YSU5UICRwU3JjLCAkc3JjU3RlcCwgJG9mZnNldCwgJHdvcmQwLCAkd29yZDEsICR3b3JkMiwgJHdvcmQzCi0gICAgICAgIElGICRvZmZzZXQgLz0gMwotICAgICAgICAgICAgTERNICAgICAgICAgJHBTcmMsIHskd29yZDAsICR3b3JkMSwgJHdvcmQyfQotICAgICAgICBFTFNFCi0gICAgICAgICAgICBMRE0gICAgICAgICAkcFNyYywgeyR3b3JkMCwgJHdvcmQyLCAkd29yZDN9Ci0gICAgICAgIEVORElGCi0gICAgICAgIEFERCAgICAgICAgICRwU3JjLCAkcFNyYywgJHNyY1N0ZXAKLSAgICBNRU5ECi0KLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICA7Ly8gRGVzY3JpcHRpb246Ci0gICAgOy8vIEV4dHJhY3QgZm91ciByZWdpc3RlcnMgb2YgZm91ciBwaXhlbHMgZm9yIFggaW50ZXJwb2xhdGlvbiAKLSAgICA7Ly8gCi0gICAgOy8vIFN5bnRheDoKLSAgICA7Ly8gTV9FWFRfWElOVCAkb2Zmc2V0LCAkd29yZDAsICR3b3JkMSwgJHdvcmQyLCAkd29yZDMKLSAgICA7Ly8gCi0gICAgOy8vIElucHV0czoKLSAgICA7Ly8gJG9mZnNldCAgICAgRGlmZmVyZW5jZSBvZiBzb3VyY2UgZGF0YSBsb2NhdGlvbiB0byB0aGUgc291cmNlIHBvaW50ZXIKLSAgICA7Ly8gICAgICAgICAgICAgVXNlIHdoZW4gJG9mZnNldCAhPSAwICh1bmFsaWduZWQgbG9hZCkKLSAgICA7Ly8gCi0gICAgOy8vICR3b3JkMCwgJHdvcmQxLCAkd29yZDIsICR3b3JkMwotICAgIDsvLyAgICAgICAgICAgICBUaHJlZSBvZiB0aGVzZSBhcmUgaW5wdXRzIGJhc2VkIG9uIHRoZSAkb2Zmc2V0IHBhcmFtZXRlci4gCi0gICAgOy8vICAgICAgICAgICAgIFRoZSBpbnB1dHMgYXJlIHNwZWNpZmljYWxseSBzZWxlY3RlZCB0byBiZSBwcm9jZXNzZWQgYnkgCi0gICAgOy8vICAgICAgICAgICAgIHRoZSBNX0VYVF9YSU5UIG1hY3JvLgotICAgIDsvLwotICAgIDsvLyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOy8vICAgICAgICAgICAgIHwgT2Zmc2V0IHwgQWxpZ25lZCBQdHIgfCB3b3JkMCB8IHdvcmQxIHwgd29yZDIgfCB3b3JkMyB8Ci0gICAgOy8vICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Ci0gICAgOy8vICAgICAgICAgICAgIHwgICAgMCAgIHwgICAgICAgMCAgICAgfCAwMTIzICB8IDQ1NjcgIHwgOHh4eCAgfCB5eXl5ICB8Ci0gICAgOy8vICAgICAgICAgICAgIHwgICAgMSAgIHwgICAgICAtMSAgICAgfCB4MDEyICB8IDM0NTYgIHwgNzh4eCAgfCB5eXl5ICB8Ci0gICAgOy8vICAgICAgICAgICAgIHwgICAgMiAgIHwgICAgICAtMiAgICAgfCB4eDAxICB8IDIzNDUgIHwgNjc4eCAgfCB5eXl5ICB8Ci0gICAgOy8vICAgICAgICAgICAgIHwgICAgMyAgIHwgICAgICAtMyAgICAgfCB4eHgwICB8IHl5eXkgIHwgMTIzNCAgfCA1Njc4ICB8Ci0gICAgOy8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7Ly8gCi0gICAgOy8vIE91dHB1dHM6Ci0gICAgOy8vICR3b3JkMCwgJHdvcmQxLCAkd29yZDIsICR3b3JkMwotICAgIDsvLyAgICAgICAgICAgICBCeXRlcyBmcm9tIHRoZSBvcmlnaW5hbCBzb3VyY2UgcG9pbnRlciAobm90IHRydW5jYXRlZCBmb3IKLSAgICA7Ly8gICAgICAgICAgICAgNCBieXRlIGFsaWdubWVudCkgYXMgc2hvd24gaW4gdGhlIHRhYmxlLiAKLSAgICA7Ly8gICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7Ly8gICAgICAgICAgICAgfCB3b3JkMCB8IHdvcmQxIHwgd29yZDIgfCB3b3JkMyB8Ci0gICAgOy8vICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAotICAgIDsvLyAgICAgICAgICAgICB8IDAxMjMgIHwgNDU2NyAgfCAxMjM0ICB8IDU2NzggIHwKLSAgICA7Ly8gICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7Ly8KLSAgICA7Ly8gTm90ZTogeyR3b3JkMCwgJHdvcmQxLCAkd29yZDIsICR3b3JkM30gc2hvdWxkIGJlIHJlZ2lzdGVycyB3aXRoIGFzY2VuZGluZwotICAgIDsvLyByZWdpc3RlciBudW1iZXJpbmcKLQotICAgIE1BQ1JPCi0gICAgTV9FWFRfWElOVCAkb2Zmc2V0LCAkd29yZDAsICR3b3JkMSwgJHdvcmQyLCAkd29yZDMKLSAgICAgICAgSUYgJG9mZnNldCA9IDAKLSAgICAgICAgICAgIDsgJHdvcmQwIGFuZCAkd29yZDEgYXJlIG9rCi0gICAgICAgICAgICA7ICR3b3JkMiwgJHdvcmQzIGFyZSBqdXN0IDggc2hpZnRlZCB2ZXJzaW9ucwotICAgICAgICAgICAgTU9WICAgICAgICAgJHdvcmQzLCAkd29yZDEsIExTUiAjOAotICAgICAgICAgICAgT1JSICAgICAgICAgJHdvcmQzLCAkd29yZDMsICR3b3JkMiwgTFNMICMyNAotICAgICAgICAgICAgTU9WICAgICAgICAgJHdvcmQyLCAkd29yZDAsIExTUiAjOAotICAgICAgICAgICAgT1JSICAgICAgICAgJHdvcmQyLCAkd29yZDIsICR3b3JkMSwgTFNMICMyNAotICAgICAgICBFTElGICRvZmZzZXQgPSAzCi0gICAgICAgICAgICA7ICR3b3JkMiBhbmQgJHdvcmQzIGFyZSBvayAodGFrZW4gY2FyZSB3aGlsZSBsb2FkaW5nIGl0c2VsZikKLSAgICAgICAgICAgIDsgc2V0ICR3b3JkMCAmICR3b3JkMQotICAgICAgICAgICAgTU9WICAgICAgICAgJHdvcmQwLCAkd29yZDAsIExTUiAjMjQKLSAgICAgICAgICAgIE9SUiAgICAgICAgICR3b3JkMCwgJHdvcmQwLCAkd29yZDIsIExTTCAjOAotICAgICAgICAgICAgTU9WICAgICAgICAgJHdvcmQxLCAkd29yZDIsIExTUiAjMjQKLSAgICAgICAgICAgIE9SUiAgICAgICAgICR3b3JkMSwgJHdvcmQxLCAkd29yZDMsIExTTCAjOAotICAgICAgICBFTFNFCi0gICAgICAgICAgICBNT1YgICAgICAgICAkd29yZDAsICR3b3JkMCwgTFNSICM4ICogJG9mZnNldAotICAgICAgICAgICAgT1JSICAgICAgICAgJHdvcmQwLCAkd29yZDAsICR3b3JkMSwgTFNMICMoMzIgLSA4ICogKCRvZmZzZXQpKQotICAgICAgICAgICAgTU9WICAgICAgICAgJHdvcmQxLCAkd29yZDEsIExTUiAjOCAqICRvZmZzZXQKLSAgICAgICAgICAgIE9SUiAgICAgICAgICR3b3JkMSwgJHdvcmQxLCAkd29yZDIsIExTTCAjKDMyIC0gOCAqICgkb2Zmc2V0KSkKLQotICAgICAgICAgICAgTU9WICAgICAgICAgJHdvcmQzLCAkd29yZDEsIExTUiAjOAotICAgICAgICAgICAgT1JSICAgICAgICAgJHdvcmQzLCAkd29yZDMsICR3b3JkMiwgTFNMICMoMzIgLSA4ICogKCgkb2Zmc2V0KSsxKSkKLSAgICAgICAgICAgIE1PViAgICAgICAgICR3b3JkMiwgJHdvcmQwLCBMU1IgIzgKLSAgICAgICAgICAgIE9SUiAgICAgICAgICR3b3JkMiwgJHdvcmQyLCAkd29yZDEsIExTTCAjMjQKLSAgICAgICAgRU5ESUYKLSAgICBNRU5ECi0KLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICA7Ly8gRGVzY3JpcHRpb246Ci0gICAgOy8vIENvbXB1dGVzIGhhbGYtc3VtIGFuZCB4b3Igb2YgdHdvIGlucHV0cyBhbmQgcHV0cyB0aGVtIGluIHRoZSBpbnB1dCAKLSAgICA7Ly8gcmVnaXN0ZXJzIGluIHRoYXQgb3JkZXIKLSAgICA7Ly8KLSAgICA7Ly8gU3ludGF4OgotICAgIDsvLyBNX0hTVU1fWE9SICAgICAgJHYwLCAkdjEsICR0bXAKLSAgICA7Ly8gCi0gICAgOy8vIElucHV0czoKLSAgICA7Ly8gJHYwICAgICAgICAgYSwgZmlyc3QgaW5wdXQKLSAgICA7Ly8gJHYxICAgICAgICAgYiwgc2Vjb25kIGlucHV0Ci0gICAgOy8vICR0bXAgICAgICAgIHNjcmF0Y2ggcmVnaXN0ZXIKLSAgICA7Ly8gCi0gICAgOy8vIE91dHB1dHM6Ci0gICAgOy8vICR2MCAgICAgICAgIChhICsgYikvMgotICAgIDsvLyAkdjEgICAgICAgICBhIF4gYgotCi0gICAgTUFDUk8KLSAgICBNX0hTVU1fWE9SICAgICAgJHYwLCAkdjEsICR0bXAKLSAgICAgICAgVUhBREQ4ICAgICAgJHRtcCwgJHYwLCAkdjEgICAgIDsvLyBzMCA9IGEgKyBiCi0gICAgICAgIEVPUiAgICAgICAgICR2MSwgJHYwLCAkdjEgICAgICA7Ly8gbDAgPSBhIF4gYgotICAgICAgICBNT1YgICAgICAgICAkdjAsICR0bXAgICAgICAgICAgOy8vIHMwCi0gICAgTUVORAotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIDsvLyBEZXNjcmlwdGlvbjoKLSAgICA7Ly8gQ2FsY3VsYXRlcyBhdmVyYWdlIG9mIDQgdmFsdWVzIChhLGIsYyxkKSBmb3IgSGFsZlBpeGVsWFkgcHJlZGljdCB0eXBlIGluIAotICAgIDsvLyBtY1JlY29uQmxvY2sgbW9kdWxlLiBWZXJ5IHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiAKLSAgICA7Ly8gTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWFkgZG9uZSBoZXJlLiBVc2VzICJ0bXAiIGFzIHNjcmF0Y2ggcmVnaXN0ZXIgYW5kIAotICAgIDsvLyAieU1hc2siIGZvciBtYXNrIHZhcmlhYmxlICIweDEwMTAxMDF4IiBzZXQgaW4gaXQuIEluIHlNYXNrIDQgbHNicyBhcmUgCi0gICAgOy8vIG5vdCBzaWduaWZpY2FudCBhbmQgYXJlIHVzZWQgYnkgdGhlIGNhbGxlZSBmb3Igcm93IGNvdW50ZXIgKHkpCi0gICAgOy8vCi0gICAgOy8vIFNvbWUgcG9pbnRzIHRvIG5vdGUgYXJlOgotICAgIDsvLyAxLiBJbnB1dCBpcyBwYWlyIG9mIHBhaXItYXZlcmFnZXMgYW5kIFhvcnMKLSAgICA7Ly8gMi4gJHN1bTEgYW5kICRsc2IxIGFyZSBub3QgbW9kaWZpZWQgYW5kIGhlbmNlIGNhbiBiZSByZXVzZWQgaW4gYW5vdGhlciAKLSAgICA7Ly8gICAgcnVubmluZyBhdmVyYWdlCi0gICAgOy8vIDMuIE91dHB1dCBpcyBpbiB0aGUgZmlyc3QgYXJndW1lbnQKLSAgICA7Ly8KLSAgICA7Ly8gU3ludGF4OgotICAgIDsvLyBNX0FWRzQgICAgICAgICAkc3VtMCwgJGxzYjAsICRzdW0xLCAkbHNiMSwgJHJuZFZhbAotICAgIDsvLyAKLSAgICA7Ly8gSW5wdXRzOgotICAgIDsvLyAkc3VtMCAgICAgICAoYSArIGIpID4+IDEsIHdoZXJlIGEgYW5kIGIgYXJlIDFzdCBhbmQgMm5kIGlucHV0cyB0byBiZSBhdmVyYWdlZAotICAgIDsvLyAkbHNiMCAgICAgICAoYSBeIGIpCi0gICAgOy8vICRzdW0xICAgICAgIChjICsgZCkgPj4gMS4gTm90IG1vZGlmaWVkCi0gICAgOy8vICRsc2IxICAgICAgIChjIF4gZCkgICAgICAgTm90IG1vZGlmaWVkCi0gICAgOy8vICRybmRWYWwgICAgIEFzc2VtYmxlciBWYXJpYWJsZS4gMCBmb3Igcm91bmRpbmcsIDEgZm9yIG5vIHJvdW5kaW5nCi0gICAgOy8vIAotICAgIDsvLyBPdXRwdXRzOgotICAgIDsvLyAkc3VtMCAgICAgICAoYSArIGIgKyBjICsgZCArIDEpIC8gNCA6IElmIG5vIHJvdW5kaW5nCi0gICAgOy8vICAgICAgICAgICAgIChhICsgYiArIGMgKyBkICsgMikgLyA0IDogSWYgcm91bmRpbmcKLQotICAgIE1BQ1JPCi0gICAgTV9BVkc0ICAgICAgICAgICRzdW0wLCAkbHNiMCwgJHN1bTEsICRsc2IxLCAkcm5kVmFsCi0gICAgICAgIExDTFMgT1AxCi0gICAgICAgIExDTFMgT1AyCi0gICAgICAgIElGICRybmRWYWwgPSAwIDsvLyByb3VuZGluZyBjYXNlCi1PUDEgU0VUUyAiQU5EIgotT1AyIFNFVFMgIk9SUiIKLSAgICAgICAgRUxTRSAgICAgICAgICAgOy8vIE5vdCByb3VuZGluZyBjYXNlCi1PUDEgU0VUUyAiT1JSIgotT1AyIFNFVFMgIkFORCIKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIExDTFMgbHNiMgotICAgICAgICBMQ0xTIHN1bTIKLSAgICAgICAgTENMUyBkZXN0Ci0gICAgCi1sc2IyICBTRVRTICJ0bXAiCi1zdW0yICBTRVRTICIkbHNiMCIKLWRlc3QgIFNFVFMgIiRzdW0wIgotCi0gICAgICAgICRPUDEgICAgICAgICRsc2IwLCAkbHNiMCwgJGxzYjEgICAgICAgICAgOy8vIGUwID0gZTAgJiBlMQotICAgICAgICBFT1IgICAgICAgICAkbHNiMiwgJHN1bTAsICRzdW0xICAgICAgICAgIDsvLyBlMiA9IHMwIF4gczEKLSAgICAgICAgJE9QMiAgICAgICAgJGxzYjIsICRsc2IyLCAkbHNiMCAgICAgICAgICA7Ly8gZTIgPSBlMiB8IGUwCi0gICAgICAgIEFORCAgICAgICAgICRsc2IyLCAkbHNiMiwgeU1hc2ssIExTUiAjIDQgOy8vIGUyID0gZTIgJiBtYXNrCi0gICAgICAgIFVIQUREOCAgICAgICRzdW0yLCAkc3VtMCwgJHN1bTEgICAgICAgICAgOy8vIHMyID0gKHMwICsgczEpLzIKLSAgICAgICAgVUFERDggICAgICAgJGRlc3QsICRzdW0yLCAkbHNiMiAgICAgICAgICA7Ly8gZGVzdCA9ICBzMiArIGUyCi0gICAgTUVORAotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOy8vIE1vdGlvbiBjb21wZW5zYXRpb24gaGFuZGxlciBtYWNyb3MKLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICA7Ly8gRGVzY3JpcHRpb246Ci0gICAgOy8vIEltcGxlbWVudCBtb3Rpb24gY29tcGVuc2F0aW9uIHJvdXRpbmVzIHVzaW5nIHRoZSBuYW1lZCByZWdpc3RlcnMgaW4gCi0gICAgOy8vIGNhbGxlZSBmdW5jdGlvbi4gRWFjaCBvZiB0aGUgZm9sbG93aW5nIDQgaW1wbGVtZW50IHRoZSA0IHByZWRpY3QgdHlwZQotICAgIDsvLyBFYWNoIGhhbmRsZXMgOCBjYXNlcyBlYWNoIGllIGFsbCB0aGUgY29tYmluYXRpb25zIG9mIDQgdHlwZXMgb2Ygc291cmNlIAotICAgIDsvLyBhbGlnbm1lbnQgb2Zmc2V0cyBhbmQgMiB0eXBlcyBvZiByb3VuZGluZyBmbGFnCi0gICAgOy8vCi0gICAgOy8vIFN5bnRheDoKLSAgICA7Ly8gTV9NQ1JFQ09OQkxPQ0tfSW50ZWdlclBpeGVsICRybmRWYWwsICRvZmZzZXQKLSAgICA7Ly8gTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWCAgICRybmRWYWwsICRvZmZzZXQKLSAgICA7Ly8gTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWSAgICRybmRWYWwsICRvZmZzZXQKLSAgICA7Ly8gTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWFkgICRybmRWYWwsICRvZmZzZXQKLSAgICA7Ly8gCi0gICAgOy8vIElucHV0czoKLSAgICA7Ly8gJHJuZFZhbCAgICAgQXNzZW1ibGVyIFZhcmlhYmxlLiAwIGZvciByb3VuZGluZywgMSBmb3Igbm8gcm91bmRpbmcKLSAgICA7Ly8gJG9mZnNldCAgICAgJHBTcmMgTU9EIDQgdmFsdWUuIE9mZnNldCBmcm9tIDQgYnl0ZSBhbGlnbmVkIGxvY2F0aW9uLgotICAgIDsvLyAKLSAgICA7Ly8gT3V0cHV0czoKLSAgICA7Ly8gT3V0cHV0cyBjb21lIGluIHRoZSBuYW1lZCByZWdpc3RlcnMgb2YgdGhlIGNhbGxlZSBmdW5jdGlvbnMKLSAgICA7Ly8gVGhlIG1hY3JvIGxvYWRzIHRoZSBkYXRhIGZyb20gdGhlIHNvdXJjZSBwb2ludGVyLCBwcm9jZXNzZXMgaXQgYW5kIAotICAgIDsvLyBzdG9yZXMgaW4gdGhlIGRlc3RpbmF0aW9uIHBvaW50ZXIuIERvZXMgdGhlIHdob2xlIHByZWRpY3Rpb24gY3ljbGUKLSAgICA7Ly8gb2YgTW90aW9uIENvbXBlbnNhdGlvbiByb3V0aW5lIGZvciBhIHBhcnRpY3VsYXIgcHJlZGljdFR5cGUKLSAgICA7Ly8gQWZ0ZXIgdGhpcyBvbmx5IHJlc2lkdWUgYWRkaXRpb24gdG8gdGhlIHByZWRpY3RlZCB2YWx1ZXMgcmVtYWluCi0KLSAgICBNQUNSTwotICAgIE1fTUNSRUNPTkJMT0NLX0ludGVnZXJQaXhlbCAkcm5kVmFsLCAkb2Zmc2V0Ci0gICAgOy8vIEFsZ29yaXRobWljIERlc2NyaXB0aW9uOgotICAgIDsvLyBUaGlzIGhhbmRsZXMgbW90aW9uIGNvbXBlbnNhdGlvbiBmb3IgSW50ZWdlclBpeGVsIHByZWRpY3RUeXBlLiBCb3RoCi0gICAgOy8vIHJvdW5kaW5nIGNhc2VzIGFyZSBoYW5kbGVkIGJ5IHRoZSBzYW1lIGNvZGUgYmFzZS4gSXQgaXMganVzdCBhIGNvcHkKLSAgICA7Ly8gZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24uIFR3byBsaW5lcyBhcmUgZG9uZSBwZXIgbG9vcCB0byByZWR1Y2UgCi0gICAgOy8vIHN0YWxscy4gTG9vcCBoYXMgYmVlbiBzb2Z0d2FyZSBwaXBlbGluZWQgYXMgd2VsbCBmb3IgdGhhdCBwdXJwb3NlLgotICAgIDsvLyAKLSAgICA7Ly8gTV9MT0FEX1ggbG9hZHMgYSB3aG9sZSByb3cgaW4gdHdvIHJlZ2lzdGVycyBhbmQgdGhlbiB0aGV5IGFyZSBzdG9yZWQKLSAgICAKLUNhc2VJbnRlZ2VyUGl4ZWxSbmQwT2Zmc2V0JG9mZnNldAotQ2FzZUludGVnZXJQaXhlbFJuZDFPZmZzZXQkb2Zmc2V0Ci0gICAgTV9MT0FEX1ggICAgcFNyYywgc3JjU3RlcCwgdG1wMSwgdG1wMiwgdG1wMywgJG9mZnNldAotICAgIE1fTE9BRF9YICAgIHBTcmMsIHNyY1N0ZXAsIHRtcDMsIHRtcDQsIHRtcDUsICRvZmZzZXQKLVlsb29wSW50ZWdlclBpeGVsT2Zmc2V0JG9mZnNldAotICAgIFNVQlMgICAgICAgIHksIHksICMyCi0gICAgU1RSRCAgICAgICAgdG1wMSwgdG1wMiwgW3BEc3RdLCBkc3RTdGVwCi0gICAgU1RSRCAgICAgICAgdG1wMywgdG1wNCwgW3BEc3RdLCBkc3RTdGVwCi0gICAgTV9MT0FEX1ggICAgcFNyYywgc3JjU3RlcCwgdG1wMSwgdG1wMiwgdG1wMywgJG9mZnNldAotICAgIE1fTE9BRF9YICAgIHBTcmMsIHNyY1N0ZXAsIHRtcDMsIHRtcDQsIHRtcDUsICRvZmZzZXQKLSAgICBCR1QgICAgICAgICBZbG9vcEludGVnZXJQaXhlbE9mZnNldCRvZmZzZXQKLQotICAgIEIgICAgICAgICAgIFN3aXRjaFByZWRpY3RUeXBlRW5kCi0gICAgTUVORAotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIE1BQ1JPCi0gICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWCAkcm5kVmFsLCAkb2Zmc2V0Ci0gICAgOy8vIEFsZ29yaXRobWljIERlc2NyaXB0aW9uOgotICAgIDsvLyBUaGlzIGhhbmRsZXMgbW90aW9uIGNvbXBlbnNhdGlvbiBmb3IgSGFsZlBpeGVsWCBwcmVkaWN0VHlwZS4gVGhlIHR3bwotICAgIDsvLyByb3VuZGluZyBjYXNlcyBhcmUgaGFuZGxlZCBieSB0aGUgZGlmZmVyZW50IGNvZGUgYmFzZSBhbmQgc3Bhbm5lZCBieSAKLSAgICA7Ly8gZGlmZmVyZW50IG1hY3JvIGNhbGxzLiBMb29wIGhhcyBiZWVuIHNvZnR3YXJlIHBpcGVsaW5lZCB0byByZWR1Y2UgCi0gICAgOy8vIHN0YWxscy4KLSAgICA7Ly8gCi0gICAgOy8vIEZpbHRlcmluZyBpbnZvbHZlcyBhdmVyYWdpbmcgYSBwaXhlbCB3aXRoIHRoZSBuZXh0IGhvcml6b250YWwgcGl4ZWwuCi0gICAgOy8vIE1fTE9BRF9YSU5UIGFuZCBNX0VYVF9YSU5UIGNvbWJpbmF0aW9uIGdlbmVyYXRlIDQgcmVnaXN0ZXJzLCAyIHdpdGggCi0gICAgOy8vIGFsbCBwaXhlbHMgaW4gYSByb3cgd2l0aCA0IHBpeGVsIGluIGVhY2ggcmVnaXN0ZXIgYW5kIGFub3RoZXIgMgotICAgIDsvLyByZWdpc3RlcnMgd2l0aCBwaXhlbHMgY29ycmVzcG9uZGluZyB0byBvbmUgaG9yaXpvbnRhbGx5IHNoaWZ0ZWQgcGl4ZWwKLSAgICA7Ly8gY29ycmVzcG9uZGluZyB0byB0aGUgaW5pdGlhbCByb3cgcGl4ZWxzLiBUaGVzZSBhcmUgc2V0IG9mIHBhY2tlZCAKLSAgICA7Ly8gcmVnaXN0ZXJzIGFwcHJvcHJpYXRlIHRvIGRvIDQgbGFuZSBTSU1ELgotICAgIDsvLyBBZnRlciB0aGF0IE1fVUhBREQ4UiBtYWNybyBkb2VzIHRoZSBhdmVyYWdpbmcgdGFraW5nIGNhcmUgb2YgdGhlIAotICAgIDsvLyByb3VuZGluZyBhcyByZXF1aXJlZAotICAgIAotQ2FzZUhhbGZQaXhlbFhSbmQkcm5kVmFsLk9mZnNldCRvZmZzZXQKLSAgICBJRiAkcm5kVmFsID0gMAotICAgICAgICBMRFIgbWFzaywgPTB4ODA4MDgwODAKLSAgICBFTkRJRgotCi0gICAgTV9MT0FEX1hJTlQgcFNyYywgc3JjU3RlcCwgJG9mZnNldCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNAotWWxvb3BIYWxmUGl4ZWxYUm5kJHJuZFZhbC5PZmZzZXQkb2Zmc2V0Ci0gICAgU1VCUyAgICAgICAgeSwgeSwgIzEKLSAgICBNX0VYVF9YSU5UICAkb2Zmc2V0LCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0Ci0gICAgTV9VSEFERDhSICAgdG1wNSwgdG1wMSwgdG1wMywgKDEtJHJuZFZhbCksIG1hc2sKLSAgICBNX1VIQUREOFIgICB0bXA2LCB0bXAyLCB0bXA0LCAoMS0kcm5kVmFsKSwgbWFzawotICAgIFNUUkQgICAgICAgIHRtcDUsIHRtcDYsIFtwRHN0XSwgZHN0U3RlcAotICAgIE1fTE9BRF9YSU5UIHBTcmMsIHNyY1N0ZXAsICRvZmZzZXQsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQKLSAgICBCR1QgICAgICAgICBZbG9vcEhhbGZQaXhlbFhSbmQkcm5kVmFsLk9mZnNldCRvZmZzZXQKLQotICAgIEIgICAgICAgICAgIFN3aXRjaFByZWRpY3RUeXBlRW5kCi0gICAgTUVORAotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIE1BQ1JPCi0gICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWSAkcm5kVmFsLCAkb2Zmc2V0Ci0gICAgOy8vIEFsZ29yaXRobWljIERlc2NyaXB0aW9uOgotICAgIDsvLyBUaGlzIGhhbmRsZXMgbW90aW9uIGNvbXBlbnNhdGlvbiBmb3IgSGFsZlBpeGVsWSBwcmVkaWN0VHlwZS4gVGhlIHR3bwotICAgIDsvLyByb3VuZGluZyBjYXNlcyBhcmUgaGFuZGxlZCBieSB0aGUgZGlmZmVyZW50IGNvZGUgYmFzZSBhbmQgc3Bhbm5lZCBieSAKLSAgICA7Ly8gZGlmZmVyZW50IG1hY3JvIGNhbGxzLiBQcmVMb2FkaW5nIGlzIHVzZWQgdG8gYXZvaWQgcmVsb2FkIG9mIHNhbWUgZGF0YS4gCi0gICAgOy8vIAotICAgIDsvLyBGaWx0ZXJpbmcgaW52b2x2ZXMgYXZlcmFnaW5nIGEgcGl4ZWwgd2l0aCB0aGUgbmV4dCB2ZXJ0aWNhbCBwaXhlbC4KLSAgICA7Ly8gTV9MT0FEX1ggZ2VuZXJhdGVzIDIgcmVnaXN0ZXJzIHdpdGggYWxsIHBpeGVscyBpbiBhIHJvdyB3aXRoIDQgcGl4ZWwgaW4gCi0gICAgOy8vIGVhY2ggcmVnaXN0ZXIuIFRoZXNlIGFyZSBzZXQgb2YgcGFja2VkIHJlZ2lzdGVycyBhcHByb3ByaWF0ZSB0byBkbyAKLSAgICA7Ly8gNCBsYW5lIFNJTUQuIEFmdGVyIHRoYXQgTV9VSEFERDhSIG1hY3JvIGRvZXMgdGhlIGF2ZXJhZ2luZyB0YWtpbmcgY2FyZSAKLSAgICA7Ly8gb2YgdGhlIHJvdW5kaW5nIGFzIHJlcXVpcmVkCi0gICAgCi1DYXNlSGFsZlBpeGVsWVJuZCRybmRWYWwuT2Zmc2V0JG9mZnNldAotICAgIElGICRybmRWYWwgPSAwCi0gICAgICAgIExEUiBtYXNrLCA9MHg4MDgwODA4MAotICAgIEVORElGCi0KLSAgICBNX0xPQURfWCAgICBwU3JjLCBzcmNTdGVwLCB0bXAxLCB0bXAyLCB0bXA1LCAkb2Zmc2V0IDsvLyBQcmUtbG9hZAotWWxvb3BIYWxmUGl4ZWxZUm5kJHJuZFZhbC5PZmZzZXQkb2Zmc2V0Ci0gICAgU1VCUyAgICAgICAgeSwgeSwgIzIKLSAgICA7Ly8gUHJvY2Vzc2luZyBvbmUgbGluZQotICAgIE1fTE9BRF9YICAgIHBTcmMsIHNyY1N0ZXAsIHRtcDMsIHRtcDQsIHRtcDUsICRvZmZzZXQKLSAgICBNX1VIQUREOFIgICB0bXAxLCB0bXAxLCB0bXAzLCAoMS0kcm5kVmFsKSwgbWFzawotICAgIE1fVUhBREQ4UiAgIHRtcDIsIHRtcDIsIHRtcDQsICgxLSRybmRWYWwpLCBtYXNrCi0gICAgU1RSRCAgICAgICAgdG1wMSwgdG1wMiwgW3BEc3RdLCBkc3RTdGVwCi0gICAgOy8vIFByb2Nlc3NpbmcgYW5vdGhlciBsaW5lCi0gICAgTV9MT0FEX1ggICAgcFNyYywgc3JjU3RlcCwgdG1wMSwgdG1wMiwgdG1wNSwgJG9mZnNldAotICAgIE1fVUhBREQ4UiAgIHRtcDMsIHRtcDMsIHRtcDEsICgxLSRybmRWYWwpLCBtYXNrCi0gICAgTV9VSEFERDhSICAgdG1wNCwgdG1wNCwgdG1wMiwgKDEtJHJuZFZhbCksIG1hc2sKLSAgICBTVFJEICAgICAgICB0bXAzLCB0bXA0LCBbcERzdF0sIGRzdFN0ZXAKLQotICAgIEJHVCAgICAgICAgIFlsb29wSGFsZlBpeGVsWVJuZCRybmRWYWwuT2Zmc2V0JG9mZnNldAotCi0gICAgQiAgICAgICAgICAgU3dpdGNoUHJlZGljdFR5cGVFbmQKLSAgICBNRU5ECi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgTUFDUk8KLSAgICBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYWSAkcm5kVmFsLCAkb2Zmc2V0Ci0gICAgOy8vIEFsZ29yaXRobWljIERlc2NyaXB0aW9uOgotICAgIDsvLyBUaGlzIGhhbmRsZXMgbW90aW9uIGNvbXBlbnNhdGlvbiBmb3IgSGFsZlBpeGVsWFkgcHJlZGljdFR5cGUuIFRoZSB0d28KLSAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYXJlIGhhbmRsZWQgYnkgdGhlIGRpZmZlcmVudCBjb2RlIGJhc2UgYW5kIHNwYW5uZWQgYnkgCi0gICAgOy8vIGRpZmZlcmVudCBtYWNybyBjYWxscy4gUHJlTG9hZGluZyBpcyB1c2VkIHRvIGF2b2lkIHJlbG9hZCBvZiBzYW1lIGRhdGEuIAotICAgIDsvLyAKLSAgICA7Ly8gRmlsdGVyaW5nIGludm9sdmVzIGF2ZXJhZ2luZyBhIHBpeGVsIHdpdGggdGhlIG5leHQgdmVydGljYWwsIGhvcml6b250YWwgCi0gICAgOy8vIGFuZCByaWdodC1kb3duIGRpYWdvbmFsIHBpeGVscy4gSnVzdCBhcyBpbiBIYWxmUGl4ZWxYIGNhc2UsIE1fTE9BRF9YSU5UCi0gICAgOy8vIGFuZCBNX0VYVF9YSU5UIGNvbWJpbmF0aW9uIGdlbmVyYXRlcyA0IHJlZ2lzdGVycyB3aXRoIGEgcm93IGFuZCBpdHMKLSAgICA7Ly8gMSBwaXhlbCByaWdodCBzaGlmdGVkIHZlcnNpb24sIHdpdGggNCBwaXhlbHMgaW4gb25lIHJlZ2lzdGVyLiBBbm90aGVyIAotICAgIDsvLyBjYWxsIG9mIHRoYXQgbWFjcm8tY29tYmluYXRpb24gZ2V0cyBhbm90aGVyIHJvdy4gVGhlbiBNX0hTVU1fWE9SIGlzIAotICAgIDsvLyBjYWxsZWQgdG8gZ2V0IG11dHVhbCBoYWxmLXN1bSBhbmQgeG9yIGNvbWJpbmF0aW9ucyBvZiBhIHJvdyB3aXRoIGl0cwotICAgIDsvLyBzaGlmdGVkIHZlcnNpb24gYXMgdGhleSBhcmUgaW5wdXRzIHRvIHRoZSBNX0FWRzQgbWFjcm8gd2hpY2ggY29tcHV0ZXMKLSAgICA7Ly8gdGhlIDQgZWxlbWVudCBhdmVyYWdlIHdpdGggcm91bmRpbmcuIE5vdGUgdGhhdCBpdCBpcyB0aGUgaGFsZi1zdW0veG9yIAotICAgIDsvLyB2YWx1ZXMgdGhhdCBhcmUgcHJlc2VydmVkIGZvciBuZXh0IHJvdyBhcyB0aGV5IGNhbiBiZSByZS11c2VkIGluIHRoZSAKLSAgICA7Ly8gbmV4dCBjYWxsIHRvIHRoZSBNX0FWRzQgYW5kIHNhdmVzIHJlY29tcHV0YXRpb24uCi0gICAgOy8vIER1ZSB0byBsYWNrIG9mIHJlZ2lzdGVyLCB0aGUgcm93IGNvdW50ZXIgYW5kIGEgbWFza2luZyB2YWx1ZSByZXF1aXJlZCAKLSAgICA7Ly8gaW4gTV9BVkc0IGFyZSBwYWNrZWQgaW50byBhIHNpbmdsZSByZWdpc3RlciB5TWFzayB3aGVyZSB0aGUgbGFzdCBuaWJibGUKLSAgICA7Ly8gaG9sZHMgdGhlIHJvdyBjb3VudGVyIHZhbHVlcyBhbmQgcmVzdCBob2xkcyB0aGUgbWFza2luZyB2YXJpYWJsZSBsZWZ0IAotICAgIDsvLyBzaGlmdGVkIGJ5IDQKLSAgICAKLUNhc2VIYWxmUGl4ZWxYWVJuZCRybmRWYWwuT2Zmc2V0JG9mZnNldAotICAgIExEUiAgICAgICAgIHlNYXNrLCA9KCgweDAxMDEwMTAxIDw8IDQpICsgOCkKLQotICAgIE1fTE9BRF9YSU5UIHBTcmMsIHNyY1N0ZXAsICRvZmZzZXQsIHQwMCwgdDAxLCB0MTAsIHQxMSA7Ly8gTG9hZCBhLCBhJywgYiwgYicKLSAgICBNX0VYVF9YSU5UICAkb2Zmc2V0LCB0MDAsIHQwMSwgdDEwLCB0MTEKLSAgICBNX0hTVU1fWE9SICB0MDAsIHQxMCwgdG1wICAgICAgICAgICAgICAgOy8vIHMwLCBsMAotICAgIE1fSFNVTV9YT1IgIHQwMSwgdDExLCB0bXAgICAgICAgICAgICAgICA7Ly8gczAnLCBsMCcKLQotWWxvb3BIYWxmUGl4ZWxYWVJuZCRybmRWYWwuT2Zmc2V0JG9mZnNldAotICAgIDsvLyBQcm9jZXNzc2luZyBvbmUgbGluZQotICAgIDsvLyB0MDAsIHQwMSwgdDEwLCB0MTEgcmVxdWlyZWQgZnJvbSBwcmV2aW91cyBsb29wCi0gICAgTV9MT0FEX1hJTlQgcFNyYywgc3JjU3RlcCwgJG9mZnNldCwgdDIwLCB0MjEsIHQzMCwgdDMxIDsvLyBMb2FkIGMsIGMnLCBkLCBkJwotICAgIFNVQiAgICAgICAgIHlNYXNrLCB5TWFzaywgIzIKLSAgICBNX0VYVF9YSU5UICAkb2Zmc2V0LCB0MjAsIHQyMSwgdDMwLCB0MzEKLSAgICBNX0hTVU1fWE9SICB0MjAsIHQzMCwgdG1wICAgICAgICAgICAgICAgOy8vIHMxLCBsMQotICAgIE1fSFNVTV9YT1IgIHQyMSwgdDMxLCB0bXAgICAgICAgICAgICAgICA7Ly8gczEnLCBsMScKLSAgICBNX0FWRzQgICAgICB0MDAsIHQxMCwgdDIwLCB0MzAsICRybmRWYWwgOy8vIHMwLCBsMCwgczEsIGwxCi0gICAgTV9BVkc0ICAgICAgdDAxLCB0MTEsIHQyMSwgdDMxLCAkcm5kVmFsIDsvLyBzMCcsIGwwJywgczEnLCBsMScKLSAgICBTVFJEICAgICAgICB0MDAsIHQwMSwgW3BEc3RdLCBkc3RTdGVwICAgOy8vIHN0b3JlIHRoZSBhdmVyYWdlCi0gICAgCi0gICAgOy8vIFByb2Nlc3NzaW5nIGFub3RoZXIgbGluZQotICAgIDsvLyB0MjAsIHQyMSwgdDMwLCB0MzEgcmVxdWlyZWQgZnJvbSBhYm92ZQotICAgIE1fTE9BRF9YSU5UIHBTcmMsIHNyY1N0ZXAsICRvZmZzZXQsIHQwMCwgdDAxLCB0MTAsIHQxMSA7Ly8gTG9hZCBhLCBhJywgYiwgYicKLSAgICBUU1QgICAgICAgICB5TWFzaywgIzcKLSAgICBNX0VYVF9YSU5UICAkb2Zmc2V0LCB0MDAsIHQwMSwgdDEwLCB0MTEKLSAgICBNX0hTVU1fWE9SICB0MDAsIHQxMCwgdG1wCi0gICAgTV9IU1VNX1hPUiAgdDAxLCB0MTEsIHRtcAotICAgIE1fQVZHNCAgICAgIHQyMCwgdDMwLCB0MDAsIHQxMCwgJHJuZFZhbAotICAgIE1fQVZHNCAgICAgIHQyMSwgdDMxLCB0MDEsIHQxMSwgJHJuZFZhbAotICAgIFNUUkQgICAgICAgIHQyMCwgdDIxLCBbcERzdF0sIGRzdFN0ZXAKLQotICAgIEJHVCAgICAgICAgIFlsb29wSGFsZlBpeGVsWFlSbmQkcm5kVmFsLk9mZnNldCRvZmZzZXQKLQotICAgIElGICRvZmZzZXQvPTMgOkxPUjogJHJuZFZhbC89MQotICAgICAgICBCICAgICAgICAgICBTd2l0Y2hQcmVkaWN0VHlwZUVuZAotICAgIEVORElGCi0gICAgTUVORAotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOy8vIE1vdGlvbiBjb21wZW5zYXRpb24gaGFuZGxlciBtYWNyb3MgZW5kIGhlcmUKLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICA7Ly8gRGVzY3JpcHRpb246Ci0gICAgOy8vIFBvcHVsYXRlcyBhbGwgNCBraW5kcyBvZiBvZmZzZXRzICJjYXNlcyIgZm9yIGVhY2ggcHJlZGljdFR5cGUgYW5kIHJuZFZhbAotICAgIDsvLyBjb21iaW5hdGlvbiBpbiB0aGUgInN3aXRjaCIgdG8gcHJlZGljdGlvbiBwcm9jZXNzaW5nIGNvZGUgc2VnbWVudAotICAgIDsvLwotICAgIDsvLyBTeW50YXg6Ci0gICAgOy8vIE1fQ0FTRV9PRkZTRVQgJHJuZCwgJHByZWRpY3RUeXBlCi0gICAgOy8vIAotICAgIDsvLyBJbnB1dHM6Ci0gICAgOy8vICRybmQgICAgICAgICAgICAwIGZvciByb3VuZGluZywgMSBmb3Igbm8gcm91bmRpbmcKLSAgICA7Ly8gJHByZWRpY3RUeXBlICAgIFRoZSBwcmVkaWN0aW9uIG1vZGUKLSAgICA7Ly8gCi0gICAgOy8vIE91dHB1dHM6Ci0gICAgOy8vIFBvcHVsYXRlZCBsaXN0IG9mICJNX0NBU0UicyBmb3IgdGhlICJNX1NXSVRDSCIgbWFjcm8KLQotICAgIE1BQ1JPCi0gICAgTV9DQVNFX09GRlNFVCAkcm5kLCAkcHJlZGljdFR5cGUKLSAgICAgICAgTV9DQVNFICAgICAgQ2FzZSRwcmVkaWN0VHlwZS5SbmQkcm5kLk9mZnNldDAKLSAgICAgICAgTV9DQVNFICAgICAgQ2FzZSRwcmVkaWN0VHlwZS5SbmQkcm5kLk9mZnNldDEKLSAgICAgICAgTV9DQVNFICAgICAgQ2FzZSRwcmVkaWN0VHlwZS5SbmQkcm5kLk9mZnNldDIKLSAgICAgICAgTV9DQVNFICAgICAgQ2FzZSRwcmVkaWN0VHlwZS5SbmQkcm5kLk9mZnNldDMKLSAgICBNRU5ECi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgOy8vIERlc2NyaXB0aW9uOgotICAgIDsvLyBQb3B1bGF0ZXMgYWxsIDIga2luZHMgb2Ygcm91bmRpbmcgImNhc2VzIiBmb3IgZWFjaCBwcmVkaWN0VHlwZSBpbiB0aGUgCi0gICAgOy8vICJzd2l0Y2giIHRvIHByZWRpY3Rpb24gcHJvY2Vzc2luZyBjb2RlIHNlZ21lbnQKLSAgICA7Ly8KLSAgICA7Ly8gU3ludGF4OgotICAgIDsvLyBNX0NBU0VfT0ZGU0VUICRwcmVkaWN0VHlwZQotICAgIDsvLyAKLSAgICA7Ly8gSW5wdXRzOgotICAgIDsvLyAkcHJlZGljdFR5cGUgICAgVGhlIHByZWRpY3Rpb24gbW9kZQotICAgIDsvLyAKLSAgICA7Ly8gT3V0cHV0czoKLSAgICA7Ly8gUG9wdWxhdGVkIGxpc3Qgb2YgIk1fQ0FTRV9PRkZTRVQiIG1hY3JvcwotCi0gICAgTUFDUk8KLSAgICBNX0NBU0VfTUNSRUNPTkJMT0NLICRwcmVkaWN0VHlwZQotICAgICAgICBNX0NBU0VfT0ZGU0VUICAwLCAkcHJlZGljdFR5cGUgOy8vIDAgZm9yIHJvdW5kaW5nCi0gICAgICAgIE1fQ0FTRV9PRkZTRVQgIDEsICRwcmVkaWN0VHlwZSA7Ly8gMSBmb3Igbm8gcm91bmRpbmcKLSAgICBNRU5ECi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgOy8vIERlc2NyaXB0aW9uOgotICAgIDsvLyBQb3B1bGF0ZXMgYWxsIDgga2luZHMgb2Ygcm91bmRpbmcgYW5kIG9mZnNldCBjb21iaW5hdGlvbnMgaGFuZGxpbmcgbWFjcm9zIAotICAgIDsvLyBmb3IgdGhlIHNwZWNpZmllZCBwcmVkaWN0VHlwZS4gSW4gY2FzZSBvZiAiSW50ZWdlclBpeGVsIiBwcmVkaWN0VHlwZSwgCi0gICAgOy8vIHJvdW5kaW5nIGlzIG5vdCByZXF1aXJlZCBzbyBzYW1lIGNvZGUgc2VnbWVudCBoYW5kbGVzIGJvdGggY2FzZXMKLSAgICA7Ly8KLSAgICA7Ly8gU3ludGF4OgotICAgIDsvLyBNX01DUkVDT05CTE9DSyAgICAkcHJlZGljdFR5cGUKLSAgICA7Ly8gCi0gICAgOy8vIElucHV0czoKLSAgICA7Ly8gJHByZWRpY3RUeXBlICAgIFRoZSBwcmVkaWN0aW9uIG1vZGUKLSAgICA7Ly8gCi0gICAgOy8vIE91dHB1dHM6Ci0gICAgOy8vIFBvcHVsYXRlZCBsaXN0IG9mICJNX01DUkVDT05CTE9DS188cHJlZGljdFR5cGU+IiBtYWNyb3MgZm9yIHNwZWNpZmllZCAKLSAgICA7Ly8gcHJlZGljdFR5cGUuIEVhY2ggCi0gICAgOy8vICAgICAgICAgICAgICAgICBNX01DUkVDT05CTE9DS188cHJlZGljdFR5cGU+ICRybmQsICRvZmZzZXQgCi0gICAgOy8vIGlzIGFuIGNvZGUgc2VnbWVudCAoc3RhcnRpbmcgd2l0aCBhIGxhYmVsIGluZGljYXRpbmcgdGhlIHByZWRpY3RUeXBlLCAKLSAgICA7Ly8gcm91bmRpbmcgYW5kIG9mZnNldCBjb21iaW5hdGlvbikKLSAgICA7Ly8gRm91ciBjYWxscyBvZiB0aGlzIG1hY3JvIHdpdGggdGhlIDQgcHJlZGljdGlvbiBtb2RlcyBwb3B1bGF0ZSBhbGwgdGhlIDMyIAotICAgIDsvLyBoYW5kbGVycwotCi0gICAgTUFDUk8KLSAgICBNX01DUkVDT05CTE9DSyAkcHJlZGljdFR5cGUKLSAgICAgICAgTV9NQ1JFQ09OQkxPQ0tfJHByZWRpY3RUeXBlIDAsIDAKLSAgICAgICAgTV9NQ1JFQ09OQkxPQ0tfJHByZWRpY3RUeXBlIDAsIDEKLSAgICAgICAgTV9NQ1JFQ09OQkxPQ0tfJHByZWRpY3RUeXBlIDAsIDIKLSAgICAgICAgTV9NQ1JFQ09OQkxPQ0tfJHByZWRpY3RUeXBlIDAsIDMKLSAgICBJRiAiJHByZWRpY3RUeXBlIiAvPSAiSW50ZWdlclBpeGVsIiA7Ly8gSWYgbm90IEludGVnZXJQaXhlbCB0aGVuIHJvdW5kaW5nIG1ha2VzIGEgZGlmZmVyZW5jZQotICAgICAgICBNX01DUkVDT05CTE9DS18kcHJlZGljdFR5cGUgMSwgMAotICAgICAgICBNX01DUkVDT05CTE9DS18kcHJlZGljdFR5cGUgMSwgMQotICAgICAgICBNX01DUkVDT05CTE9DS18kcHJlZGljdFR5cGUgMSwgMgotICAgICAgICBNX01DUkVDT05CTE9DS18kcHJlZGljdFR5cGUgMSwgMwotICAgIEVORElGCi0gICAgTUVORAotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOy8vIElucHV0L091dHB1dCBSZWdpc3RlcnMKLXBTcmMgICAgICAgICAgICAgICAgICBSTiAwCi1zcmNTdGVwICAgICAgICAgICAgICAgUk4gMQotYXJnX3BTcmNSZXNpZHVlICAgICAgIFJOIDIKLXBTcmNSZXNpZHVlICAgICAgICAgICBSTiAxMgotcERzdCAgICAgICAgICAgICAgICAgIFJOIDMKLWRzdFN0ZXAgICAgICAgICAgICAgICBSTiAyCi1wcmVkaWN0VHlwZSAgICAgICAgICAgUk4gMTAKLXJuZFZhbCAgICAgICAgICAgICAgICBSTiAxMQotbWFzayAgICAgICAgICAgICAgICAgIFJOIDExCi0KLTsvLyBMb2NhbCBTY3JhdGNoIFJlZ2lzdGVycwotemVybyAgICAgICAgICAgICAgICAgIFJOIDEyCi15ICAgICAgICAgICAgICAgICAgICAgUk4gMTQKLQotdG1wMSAgICAgICAgICAgICAgICAgIFJOIDQKLXRtcDIgICAgICAgICAgICAgICAgICBSTiA1Ci10bXAzICAgICAgICAgICAgICAgICAgUk4gNgotdG1wNCAgICAgICAgICAgICAgICAgIFJOIDcKLXRtcDUgICAgICAgICAgICAgICAgICBSTiA4Ci10bXA2ICAgICAgICAgICAgICAgICAgUk4gOQotdG1wNyAgICAgICAgICAgICAgICAgIFJOIDEwCi10bXA4ICAgICAgICAgICAgICAgICAgUk4gMTEKLXRtcDkgICAgICAgICAgICAgICAgICBSTiAxMgotCi10MDAgICAgICAgICAgICAgICAgICAgUk4gNAotdDAxICAgICAgICAgICAgICAgICAgIFJOIDUKLXQxMCAgICAgICAgICAgICAgICAgICBSTiA2Ci10MTEgICAgICAgICAgICAgICAgICAgUk4gNwotdDIwICAgICAgICAgICAgICAgICAgIFJOIDgKLXQyMSAgICAgICAgICAgICAgICAgICBSTiA5Ci10MzAgICAgICAgICAgICAgICAgICAgUk4gMTAKLXQzMSAgICAgICAgICAgICAgICAgICBSTiAxMQotdG1wICAgICAgICAgICAgICAgICAgIFJOIDEyCi0KLXlNYXNrICAgICAgICAgICAgICAgICBSTiAxNAotCi1kc3QgICAgICAgICAgICAgICAgICAgUk4gMQotcmV0dXJuICAgICAgICAgICAgICAgIFJOIDAKLQotICAgIDsvLyBBbGxvY2F0ZSBtZW1vcnkgb24gc3RhY2sKLSAgICBNX0FMTE9DNCAgICBTdGtfcERzdCwgICAgICAgICAgIDQKLSAgICBNX0FMTE9DNCAgICBTdGtfcFNyY1Jlc2lkdWUsICAgIDQKLSAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgTV9TVEFSVCAgICAgb214VkNNNFAyX01DUmVjb25CbG9jaywgcjExCi0gICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKLSAgICBNX0FSRyAgICAgICBBcmdfZHN0U3RlcCwgICAgICAgIDQKLSAgICBNX0FSRyAgICAgICBBcmdfcHJlZGljdFR5cGUsICAgIDQKLSAgICBNX0FSRyAgICAgICBBcmdfcm5kVmFsLCAgICAgICAgIDQKLSAgICA7Ly8gU2F2ZSBvbiBzdGFjawotICAgIE1fU1RSICAgICAgIHBEc3QsIFN0a19wRHN0Ci0gICAgTV9TVFIgICAgICAgYXJnX3BTcmNSZXNpZHVlLCBTdGtfcFNyY1Jlc2lkdWUKLSAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjawotICAgIE1fTERSICAgICAgIGRzdFN0ZXAsIEFyZ19kc3RTdGVwCi0gICAgTV9MRFIgICAgICAgcHJlZGljdFR5cGUsIEFyZ19wcmVkaWN0VHlwZQotICAgIE1fTERSICAgICAgIHJuZFZhbCwgQXJnX3JuZFZhbAotICAgIAotICAgIE1PViAgICAgICAgIHksICM4Ci0gICAgCi0gICAgQU5EICAgICAgICAgdG1wMSwgcFNyYywgIzMKLSAgICBPUlIgICAgICAgICBwcmVkaWN0VHlwZSwgdG1wMSwgcHJlZGljdFR5cGUsIExTTCAjMwotICAgIE9SUiAgICAgICAgIHByZWRpY3RUeXBlLCBwcmVkaWN0VHlwZSwgcm5kVmFsLCBMU0wgIzIKLSAgICA7Ly8gVHJ1bmNhdGluZyBzb3VyY2UgcG9pbnRlciB0byBhbGlnbiB0byA0IGJ5dGUgbG9jYXRpb24KLSAgICBCSUMgICAgICAgICBwU3JjLCBwU3JjLCAjMwotCi0gICAgOy8vIEltcGxlbWVudGF0aW9uIHRha2VzIGNhcmUgb2YgYWxsIGNvbWJpbmF0aW9ucyBvZiBkaWZmZXJlbnQgCi0gICAgOy8vIHByZWRpY3RUeXBlcywgcm91bmRpbmcgY2FzZXMgYW5kIHNvdXJjZSBwb2ludGVyIG9mZnNldHMgdG8gYWxpZ25tZW50IAotICAgIDsvLyBvZiA0IGJ5dGVzIGluIGRpZmZlcmVudCBjb2RlIGJhc2VzIHVubGVzcyBvbmUgb2YgdGhlc2UgcGFyYW1ldGVyIHdhc24ndCAKLSAgICA7Ly8gbWFraW5nIGFueSBkaWZmZXJlbmNlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbi4gQmVsb3cgTV9DQVNFX01DUkVDT05CTE9DSwotICAgIDsvLyBtYWNyb3MgYnJhbmNoIGludG8gOCBNX0NBU0UgbWFjcm9zIGZvciBhbGwgY29tYmluYXRpb25zIG9mIHRoZSAyIAotICAgIDsvLyByb3VuZGluZyBjYXNlcyBhbmQgNCBvZmZzZXRzIG9mIHRoZSBwU3JjIHBvaW50ZXIgdG8gdGhlIDQgYnl0ZSAKLSAgICA7Ly8gYWxpZ25tZW50LiAKLSAgICBNX1NXSVRDSCAgICBwcmVkaWN0VHlwZQotICAgICAgICBNX0NBU0VfTUNSRUNPTkJMT0NLIEludGVnZXJQaXhlbAotICAgICAgICBNX0NBU0VfTUNSRUNPTkJMT0NLIEhhbGZQaXhlbFgKLSAgICAgICAgTV9DQVNFX01DUkVDT05CTE9DSyBIYWxmUGl4ZWxZCi0gICAgICAgIE1fQ0FTRV9NQ1JFQ09OQkxPQ0sgSGFsZlBpeGVsWFkKLSAgICBNX0VORFNXSVRDSAotCi0gICAgOy8vIFRoZSBNX01DUkVDT05CTE9DSyBtYWNyb3MgcG9wdWxhdGUgdGhlIGNvZGUgYmFzZXMgYnkgY2FsbGluZyBhbGwgOCAKLSAgICA7Ly8gcGFydGljdWxhciBtYWNyb3MgKDQgaW4gY2FzZSBvZiBJbnRlZ2VyUGl4ZWwgYXMgcm91bmRpbmcgbWFrZXMgbm8gCi0gICAgOy8vIGRpZmZlcmVuY2UgdGhlcmUpIHRvIGdlbmVyYXRlIHRoZSBjb2RlIGZvciBhbGwgY2FzZXMgb2Ygcm91bmRpbmcgYW5kIAotICAgIDsvLyBvZmZzZXRzLiBMVE9SRyBpcyB1c2VkIHRvIHNlZ21lbnQgdGhlIGNvZGUgYXMgY29kZSBzaXplIGJsb2F0ZWQgYmV5b25kIAotICAgIDsvLyA0S0IuCi0gICAgTV9NQ1JFQ09OQkxPQ0sgSW50ZWdlclBpeGVsCi0gICAgTV9NQ1JFQ09OQkxPQ0sgSGFsZlBpeGVsWAotICAgIExUT1JHCi0gICAgTV9NQ1JFQ09OQkxPQ0sgSGFsZlBpeGVsWQotICAgIE1fTUNSRUNPTkJMT0NLIEhhbGZQaXhlbFhZCi1Td2l0Y2hQcmVkaWN0VHlwZUVuZAotCi0gICAgOy8vIFJlc2lkdWUgQWRkaXRpb24KLSAgICA7Ly8gVGhpcyBpcyBkb25lIGluIDIgbGFuZSBTSU1EIHRob3VnaCBsb2FkcyBhcmUgZnVydGhlciBvcHRpbWl6ZWQgYW5kCi0gICAgOy8vIDQgYnl0ZXMgYXJlIGxvYWRlZCBpbiBjYXNlIG9mIGRlc3RpbmF0aW9uIGJ1ZmZlci4gQWxnb3JpdGhtaWMgCi0gICAgOy8vIGRldGFpbHMgYXJlIGluIGlubGluZWQgY29tbWVudHMKLSAgICBNX0xEUiAgICAgICBwU3JjUmVzaWR1ZSwgU3RrX3BTcmNSZXNpZHVlCi0gICAgQ01QICAgICAgICAgcFNyY1Jlc2lkdWUsICMwCi0gICAgQkVRICAgICAgICAgcFNyY1Jlc2lkdWVDb25kaXRpb25FbmQKLXBTcmNSZXNpZHVlTm90TnVsbCAgICAKLSAgICBNX0xEUiAgICAgICBwRHN0LCBTdGtfcERzdAotICAgIE1PViAgICAgICAgIHksICM4Ci0gICAgU1VCICAgICAgICAgZHN0U3RlcCwgZHN0U3RlcCwgIzQKLVlsb29wX3BTcmNSZXNpZHVlTm90TnVsbAotICAgIFNVQlMgICAgICAgIHksIHksICMxCi0gICAgTERSICAgICAgICAgZHN0LCBbcERzdF0gICAgICAgICAgICAgICAgOy8vIGRzdCA9IFtkY2JhXQotICAgIExETUlBICAgICAgIHBTcmNSZXNpZHVlISwge3RtcDEsIHRtcDJ9IDsvLyB0bXAxPVtEQ10gdG1wMj1bQkFdCi0gICAgUEtIQlQgICAgICAgdG1wMywgdG1wMSwgdG1wMiwgTFNMICMxNiAgOy8vIERlbHRhdmFsMSA9IFtDIEFdCi0gICAgUEtIVEIgICAgICAgdG1wNCwgdG1wMiwgdG1wMSwgQVNSICMxNiAgOy8vIERlbHRhVmFsMiA9IFtEIEJdCi0gICAgVVhUQjE2ICAgICAgdG1wMSwgZHN0ICAgICAgICAgICAgICAgICAgOy8vIHRtcDEgPSBbMGMwYV0KLSAgICBVWFRCMTYgICAgICB0bXAyLCBkc3QsIFJPUiAjOCAgICAgICAgICA7Ly8gdG1wMiA9IFswZDBiXQotICAgIFFBREQxNiAgICAgIHRtcDEsIHRtcDEsIHRtcDMgICAgICAgICAgIDsvLyBBZGQgYW5kIHNhdHVyYXRlIHRvIDE2IGJpdHMKLSAgICBRQUREMTYgICAgICB0bXAyLCB0bXAyLCB0bXA0Ci0gICAgVVNBVDE2ICAgICAgdG1wMSwgIzgsIHRtcDEKLSAgICBVU0FUMTYgICAgICB0bXAyLCAjOCwgdG1wMiAgICAgICAgICAgICA7Ly8gYXJtQ2xpcCgwLCAyNTUsIHRtcDIpCi0gICAgT1JSICAgICAgICAgdG1wMSwgdG1wMSwgdG1wMiwgTFNMICM4ICAgOy8vIHRtcDEgPSBbZGNiYV0KLSAgICBTVFIgICAgICAgICB0bXAxLCBbcERzdF0sICM0Ci0gICAgCi0gICAgTERSICAgICAgICAgZHN0LCBbcERzdF0KLSAgICBMRE1JQSAgICAgICBwU3JjUmVzaWR1ZSEsIHt0bXAxLCB0bXAyfQotICAgIFBLSEJUICAgICAgIHRtcDMsIHRtcDEsIHRtcDIsIExTTCAjMTYKLSAgICBQS0hUQiAgICAgICB0bXA0LCB0bXAyLCB0bXAxLCBBU1IgIzE2Ci0gICAgVVhUQjE2ICAgICAgdG1wMSwgZHN0Ci0gICAgVVhUQjE2ICAgICAgdG1wMiwgZHN0LCBST1IgIzgKLSAgICBRQUREMTYgICAgICB0bXAxLCB0bXAxLCB0bXAzCi0gICAgUUFERDE2ICAgICAgdG1wMiwgdG1wMiwgdG1wNAotICAgIFVTQVQxNiAgICAgIHRtcDEsICM4LCB0bXAxCi0gICAgVVNBVDE2ICAgICAgdG1wMiwgIzgsIHRtcDIKLSAgICBPUlIgICAgICAgICB0bXAxLCB0bXAxLCB0bXAyLCBMU0wgIzgKLSAgICBTVFIgICAgICAgICB0bXAxLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAKLSAgICBCR1QgICAgICAgICBZbG9vcF9wU3JjUmVzaWR1ZU5vdE51bGwKLXBTcmNSZXNpZHVlQ29uZGl0aW9uRW5kCi0KLSAgICBNT1YgICAgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0KLSAgICBNX0VORAotICAgIEVORElGIDsvLyBBUk0xMTM2SlMKLQotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOy8vIENvcnRleEE4IGltcGxlbWVudGF0aW9uCi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgRU5ECi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07Ly8gb214VkNNNFAyX01DUmVjb25CbG9jayBlbmRzCi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNmM4MWQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07ICoqKioqKioqKioKLTsgKiAKLTsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucwotOyAqIE9wZW5NQVggREw6IHYxLjAuMgotOyAqIFJldmlzaW9uOiAgIDk2NDEKLTsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotOyAqIAotOyAqIAotOyAqIAotOyAqIAotOyAqIERlc2NyaXB0aW9uOgotOyAqIENvbnRhaW5zIG1vZHVsZSBmb3IgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbgotOyAqCi07ICogCi07ICogRnVuY3Rpb246IG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEKLTsgKgotOyAqIERlc2NyaXB0aW9uOgotOyAqIFBlcmZvcm1zIGFkYXB0aXZlIERDL0FDIGNvZWZmaWNpZW50IHByZWRpY3Rpb24gZm9yIGFuIGludHJhIGJsb2NrLiBQcmlvcgotOyAqIHRvIHRoZSBmdW5jdGlvbiBjYWxsLCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAocHJlZERpcikgc2hvdWxkIGJlIHNlbGVjdGVkCi07ICogYXMgc3BlY2lmaWVkIGluIHN1YmNsYXVzZSA3LjQuMy4xIG9mIElTTy9JRUMgMTQ0OTYtMi4KLTsgKgotOyAqIFJlbWFya3M6Ci07ICoKLTsgKiBQYXJhbWV0ZXJzOgotOyAqIFtpbl0gIHBTcmNEc3QgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIAotOyAqICAgICAgICAgICAgICAgICAgICBxdWFudGl6ZWQgY29lZmZpY2llbnQgcmVzaWR1YWxzIChQUUYpIG9mIHRoZSBjdXJyZW50IAotOyAqICAgICAgICAgICAgICAgICAgICBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiBUaGUgCi07ICogICAgICAgICAgICAgICAgICAgIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCB0byB0aGUgcmFuZ2UgCi07ICogICAgICAgICAgICAgICAgICAgIFstMjA0OCwgMjA0N10uCi07ICogW2luXSAgcFByZWRCdWZSb3cgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZAotOyAqICAgICAgICAgICAgICAgICAgICBvbiBhIDQtYnl0ZSBib3VuZGFyeS4KLTsgKiBbaW5dICBwUHJlZEJ1ZkNvbCAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcjsgbXVzdCBiZSAKLTsgKiAgICAgICAgICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4KLTsgKiBbaW5dICBjdXJRUCAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgY3VycmVudCBibG9jay4gY3VyUVAgbWF5IAotOyAqICAgICAgICAgICAgICAgICAgICBlcXVhbCB0byBwcmVkUVAgZXNwZWNpYWxseSB3aGVuIHRoZSBjdXJyZW50IGJsb2NrIGFuZCAKLTsgKiAgICAgICAgICAgICAgICAgICAgdGhlIHByZWRpY3RvciBibG9jayBhcmUgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4KLTsgKiBbaW5dICBwcmVkUVAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCi07ICogW2luXSAgcHJlZERpciAgICAgIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lCi07ICogICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotOyAqICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQotOyAqICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICAgIHByZWRpY3QgdmVydGljYWxseQotOyAqIFtpbl0gIEFDUHJlZEZsYWcgICBhIGZsYWcgaW5kaWNhdGluZyBpZiBBQyBwcmVkaWN0aW9uIHNob3VsZCBiZQotOyAqICAgICAgICAgICAgICAgICAgICBwZXJmb3JtZWQuIEl0IGlzIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyBpbiB0aGUgYml0Ci07ICogICAgICAgICAgICAgICAgICAgIHN0cmVhbSBzeW50YXggb2YgTVBFRy00Ci07ICogW2luXSAgdmlkZW9Db21wICAgIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlIG9yCi07ICogICAgICAgICAgICAgICAgICAgIGFscGhhKSBvZiB0aGUgY3VycmVudCBibG9jawotOyAqIFtvdXRdIHBTcmNEc3QgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMKLTsgKiAgICAgICAgICAgICAgICAgICAgdGhlIHF1YW50aXplZCBjb2VmZmljaWVudHMgKFFGKSBvZiB0aGUgY3VycmVudAotOyAqICAgICAgICAgICAgICAgICAgICBibG9jawotOyAqIFtvdXRdIHBQcmVkQnVmUm93ICBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKLTsgKiBbb3V0XSBwUHJlZEJ1ZkNvbCAgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCi07ICogUmV0dXJuIFZhbHVlOgotOyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgotOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50cyAKLTsgKiAtIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sLgotOyAqIC0gQXQgbGVhc3Qgb25lIHRoZSBmb2xsb3dpbmcgY2FzZXM6IGN1clFQIDw9IDAsIHByZWRRUCA8PSAwLCBjdXJRUCA+MzEsIAotOyAqICAgcHJlZFFQID4gMzEsIHByZURpciBleGNlZWRzIFsxLDJdLgotOyAqIC0gQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVycyBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wgaXMgbm90IAotOyAqICAgNC1ieXRlIGFsaWduZWQuCi07ICoKLTsgKioqKioqKioqCi0gICAgIAotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0gICAgICAgCi0gICAgICAgICAgICAgCi0KLSAgICAgICBJTVBPUlQgICAgICAgIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MzMgotICAgICAgIElNUE9SVCAgICAgICAgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzE2Ci0gICAgICAgSU1QT1JUICAgICAgICBhcm1WQ000UDJfRENTY2FsZXIKLSAgICAgICAKLQotCi0gICAgICAgIElGIEFSTTExMzZKUwotCi0KLTsvLyBJbnB1dCBBcmd1bWVudHMKLQotcFNyY0RzdCAgICAgICAgICBSTiAwCi1wUHJlZEJ1ZlJvdyAgICAgIFJOIDEKLXBQcmVkQnVmQ29sICAgICAgUk4gMgotY3VyUVAgICAgICAgICAgICBSTiAzCi1RUCAgICAgICAgICAgICAgIFJOIDMKLXByZWRRUCAgICAgICAgICAgUk4gNAotcHJlZERpciAgICAgICAgICBSTiA1Ci1BQ1ByZWRGbGFnICAgICAgIFJOIDYKLXZpZGVvQ29tcCAgICAgICAgUk4gNyAgCi0KLTsvLyBMb2NhbCBWYXJpYWJsZXMKLQotdGVtcDIgICAgICAgICAgICBSTiA1Ci1uZWdDdXJRUCAgICAgICAgIFJOIDcKLW5lZ2RjU2NhbGVyICAgICAgUk4gNwotdGVtcFByZWQgICAgICAgICBSTiA4Ci0KLWRjU2NhbGVyICAgICAgICAgUk4gNAotQ29lZmZUYWJsZSAgICAgICBSTiA5Ci1hYnNDb2VmZkRDICAgICAgIFJOIDkKLXRlbXAzICAgICAgICAgICAgUk4gNgotYWJzQ29lZmZBQyAgICAgICBSTiA2Ci0KLXNob3J0VmlkZW9IZWFkZXIgUk4gOQotcHJlZENvZWZmVGFibGUgICBSTiAxMAotQ291bnQgICAgICAgICAgICBSTiAxMAotdGVtcDEgICAgICAgICAgICBSTiAxMgotaW5kZXggICAgICAgICAgICBSTiAxMgotUmVtICAgICAgICAgICAgICBSTiAxNAotdGVtcCAgICAgICAgICAgICBSTiAxMQotUmV0dXJuICAgICAgICAgICBSTiAwCi0KLSAgICAgICAKLQotICAgICAgIE1fU1RBUlQgICBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLHIxMgotICAgICAgIAotICAgICAgIDsvLyBBc3NpZ25pbmcgcG9pbnRlcnMgdG8gSW5wdXQgYXJndW1lbnRzIG9uIFN0YWNrCi0gICAgCi0gICAgICAgTV9BUkcgICAgICAgICAgIHByZWRRUG9uU3RhY2ssNCAgCi0gICAgICAgTV9BUkcgICAgICAgICAgIHByZWREaXJvblN0YWNrLDQKLSAgICAgICBNX0FSRyAgICAgICAgICAgQUNQcmVkRmxhZ29uU3RhY2ssNAotICAgICAgIE1fQVJHICAgICAgICAgICB2aWRlb0NvbXBvblN0YWNrLDQKLSAgICAgICAKLSAgICAgICA7Ly8gREMgUHJlZGljdGlvbgotCi0gICAgICAgTV9MRFIgICAgICAgICAgIHZpZGVvQ29tcCx2aWRlb0NvbXBvblN0YWNrICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgdmlkZW9Db21wIEZyb20gU3RhY2sgICAgICAgICAgICAgICAKLSAgICAgICAKLSAgICAgICBNX0xEUiAgICAgICAgICAgcHJlZERpcixwcmVkRGlyb25TdGFjayAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBQcmVkaWN0aW9uIGRpcmVjdGlvbgotICAgICAgIAotICAgICAgIDsvLyBkY1NjYWxlciBDYWxjdWxhdGlvbgotCi0gICAgICAgTERSICAgICAgICAgICAgIGluZGV4LCA9YXJtVkNNNFAyX0RDU2NhbGVyCi0gICAgICAgQUREICAgICAgICAgICAgIGluZGV4LGluZGV4LHZpZGVvQ29tcCxMU0wgIzUKLSAgICAgICBMRFJCICAgICAgICAgICAgZGNTY2FsZXIsW2luZGV4LFFQXQotICAgICAgICAgICAKLSAgICAKLWNhbERDVmFsCi0gICAgICAKLSAgICAgICAKLSAgICAgICBMRFIgICAgICAgICAgICAgcHJlZENvZWZmVGFibGUsID1hcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMTYgICA7Ly8gTG9hZGluZyB0aGUgdGFibGUgd2l0aCBlbnRyaWVzIDMyNzY3LygxIHRvIDYzKSAKLSAgICAgIAotICAgICAgIENNUCAgICAgICAgICAgICBwcmVkRGlyLCMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiB0aGUgUHJlZGljdGlvbiBkaXJlY3Rpb24gaXMgdmVydGljYWwKLQotICAgICAgIDsvLyBDYXVsdWNhdGUgdGVtcCBwcmVkIGJ5IHBlcmZvcm1pbmcgRGl2aXNpb24KLSAgICAgICAgICAgIAotICAgICAgIExEUkVRU0ggICAgICAgICBhYnNDb2VmZkRDLFtwUHJlZEJ1ZlJvd10gICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiB2ZXRpY2FsIGxvYWQgdGhlIGNvZWZmIGZyb20gUm93IFByZWRpY3Rpb24gQnVmZmVyCi0gICAgICAgTERSTkVTSCAgICAgICAgIGFic0NvZWZmREMsW3BQcmVkQnVmQ29sXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIGhvcml6b250YWwgbG9hZCB0aGUgY29lZmYgZnJvbSBjb2x1bW4gUHJlZGljdGlvbiBCdWZmZXIKLSAgICAgICAKLSAgICAgICBSU0IgICAgICAgICAgICAgbmVnZGNTY2FsZXIsZGNTY2FsZXIsIzAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gbmVnZGNTY2FsZXI9LWRjU2NhbGVyICAKLSAgICAgICAKLSAgICAgICBNT1YgICAgICAgICAgICAgdGVtcDEsYWJzQ29lZmZEQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDE9cHJlZGljdGlvbiBjb2VmZgotICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMAotICAgICAgIFJTQkxUICAgICAgICAgICBhYnNDb2VmZkRDLHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL2Fic0NvZWZmREM9YWJzKHRlbXAxKQotICAgICAgIAotICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wLGRjU2NhbGVyLGRjU2NhbGVyCi0gICAgICAgTERSSCAgICAgICAgICAgIHRlbXAsW3ByZWRDb2VmZlRhYmxlLHRlbXBdICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgdmFsdWUgZnJvbSBjb2VmZiB0YWJsZSBmb3IgcGVyZm9ybWluZyBkaXZpc2lvbiB1c2luZyBtdWx0aXBsaWNhdGlvbgotICAgICAgIAotICAgICAgIFNNVUxCQiAgICAgICAgICB0ZW1wUHJlZCx0ZW1wLGFic0NvZWZmREMgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wUHJlZD1wUHJlZEJ1ZlJvdyhDb2wpWzBdKjMyNzY3L2RjU2NhbGVyCi0gICAgICAgQUREICAgICAgICAgICAgIHRlbXAzLGRjU2NhbGVyLCMxCi0gICAgICAgTFNSICAgICAgICAgICAgIHRlbXBQcmVkLHRlbXBQcmVkLCMxNSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXBQcmVkPXBQcmVkQnVmUm93KENvbClbMF0vZGNTY2FsZXIgICAgICAgICAgCi0gICAgICAgTFNSICAgICAgICAgICAgIHRlbXAzLHRlbXAzLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAzPXJvdW5kKGRjU2NhbGVyLzIpCi0gICAgICAgCi0gICAgICAgTUxBICAgICAgICAgICAgIFJlbSxuZWdkY1NjYWxlcix0ZW1wUHJlZCxhYnNDb2VmZkRDICAgICAgICAgICAgOy8vIFJlbSA9IHBQcmVkQnVmUm93KENvbClbMF0tdGVtcFByZWQqZGNTY2FsZXIgICAgICAKLSAgICAgICAKLSAgICAgICAKLSAgICAgICBMRFJIICAgICAgICAgICAgdGVtcCxbcFByZWRCdWZDb2xdCi0gICAgICAgQ01QICAgICAgICAgICAgIFJlbSx0ZW1wMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgQURER0UgICAgICAgICAgIHRlbXBQcmVkLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIFJlbT49cm91bmQoZGNTY2FsZXIvMik7dGVtcFByZWQ9dGVtcFByZWQrMQotICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMAotICAgICAgIFJTQkxUICAgICAgICAgICB0ZW1wUHJlZCx0ZW1wUHJlZCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7LyBpZiBwUHJlZEJ1ZlJvdyhDb2wpWzBdPDA7IHRlbXBQcmVkPS10ZW1wUHJlZAotICAgICAgICAgICAgIAotICAgICAgIAotICAgICAgIFNUUkggICAgICAgICAgICB0ZW1wLFtwUHJlZEJ1ZlJvdywjLTE2XSAgICAgIAotCi0gICAgICAgTERSSCAgICAgICAgICAgIHRlbXAsW3BTcmNEc3RdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9cFNyY0RzdFswXQotICAgICAgIE1fTERSICAgICAgICAgICBBQ1ByZWRGbGFnLEFDUHJlZEZsYWdvblN0YWNrCi0gICAgICAgQUREICAgICAgICAgICAgIHRlbXAsdGVtcCx0ZW1wUHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9cFNyY0RzdFswXSt0ZW1wUHJlZAotICAgICAgIFNTQVQxNiAgICAgICAgICB0ZW1wLCMxMix0ZW1wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjbGlwIHRlbXAgdG8gWy0yMDQ4LDIwNDddCi0gICAgICAgCi0gICAgICAgU01VTEJCICAgICAgICAgIHRlbXAxLHRlbXAsZGNTY2FsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAxPWNsaXBwZWQocFNyY0RzdFswXSkqZGNTY2FsZXIgICAgICAgICAgIAotICAgICAgIE1fTERSICAgICAgICAgICBwcmVkUVAscHJlZFFQb25TdGFjawotICAgICAgIFNUUkggICAgICAgICAgICB0ZW1wLFtwU3JjRHN0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIENNUCAgICAgICAgICAgICBBQ1ByZWRGbGFnLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiB0aGUgQUMgcHJlZGljdGlvbiBmbGFnIGlzIHNldCBvciBub3QKLSAgICAgICBTVFJIICAgICAgICAgICAgdGVtcDEsW3BQcmVkQnVmQ29sXSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgdGVtcDEgdG8gcFByZWRCdWZDb2wKLSAKLSAgICAgICA7Ly8gQUMgUHJlZGljdGlvbgotCi0gICAgICAgICAgICAgIAotICAgICAgIEJORSAgICAgICAgICAgICBFeGl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBub3Qgc2V0IEV4aXQKLSAgICAgICAKLSAgICAgICBMRFIgICAgICAgICAgICAgcHJlZENvZWZmVGFibGUsID1hcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMzIgICA7Ly8gTG9hZGluZyB0aGUgdGFibGUgd2l0aCBlbnRyaWVzIDB4MWZmZmYvKDEgdG8gNjMpCi0gICAgICAgTU9WICAgICAgICAgICAgIHRlbXAxLCM0Ci0gICAgICAgTVVMICAgICAgICAgICAgIHRlbXAxLGN1clFQLHRlbXAxCi0gICAgICAgQ01QICAgICAgICAgICAgIHByZWREaXIsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIHRoZSBQcmVkaWN0aW9uIGRpcmVjdGlvbgotICAgICAgIFJTQiAgICAgICAgICAgICBuZWdDdXJRUCxjdXJRUCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICBMRFIgICAgICAgICAgICAgQ29lZmZUYWJsZSxbcHJlZENvZWZmVGFibGUsdGVtcDFdICAgICAgICAgICAgICA7Ly8gQ29lZmZUYWJsZT0weDFmZmZmL2N1clFQCi0gICAgICAgQUREICAgICAgICAgICAgIGN1clFQLGN1clFQLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGN1clFQPWN1clFQKzEKLSAgICAgICBMU1IgICAgICAgICAgICAgY3VyUVAsY3VyUVAsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY3VyUVA9cm91bmQoY3VyUVAvMikgICAgICAgICAgICAgICAgCi0gICAgICAgTU9WICAgICAgICAgICAgIENvdW50LCMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEluaXRpYWxpemluZyB0aGUgTG9vcCBDb3VudAotICAgICAgIEJORSAgICAgICAgICAgICBIb3Jpem9udGFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiB0aGUgUHJlZGljdGlvbiBkaXJlY3Rpb24gaXMgaG9yaXpvbnRhbCBicmFuY2ggdG8gSG9yaXpvbnRhbAotCi0gICAgICAgCi0KLWxvb3AxICAgICAgIAotICAgICAgIDsvLyBDYWxjdWxhdGUgdGVtcFByZWQKLSAgICAgICAKLSAgICAgICBMRFJTSCAgICAgICAgICAgYWJzQ29lZmZBQyxbcFByZWRCdWZSb3csQ291bnRdICAgICAgICAgICAgICAgICA7Ly8gYWJzQ29lZmZBQz1wUHJlZEJ1ZlJvd1tpXSwgMT08aTw9NwotICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wMSxhYnNDb2VmZkFDCi0gICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNvbXBhcmUgcFByZWRCdWZSb3dbaV0gd2l0aCB6ZXJvLCAxPTxpPD03Ci0gICAgICAgUlNCTFQgICAgICAgICAgIGFic0NvZWZmQUMsdGVtcDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGFic0NvZWZmQUM9IGFicyhwUHJlZEJ1ZlJvd1tpXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgU01VTEJCICAgICAgICAgIGFic0NvZWZmQUMsYWJzQ29lZmZBQyxwcmVkUVAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAxPXBQcmVkQnVmUm93W2ldKnByZWRRUAotICAgICAgIE1VTCAgICAgICAgICAgICB0ZW1wUHJlZCxhYnNDb2VmZkFDLENvZWZmVGFibGUgICAgICAgICAgICAgICAgIDsvLyB0ZW1wUHJlZD1wUHJlZEJ1ZlJvd1tpXSpwcmVkUVAqMHgxZmZmZi9jdXJRUAotICAgICAgIExTUiAgICAgICAgICAgICB0ZW1wUHJlZCx0ZW1wUHJlZCwjMTcgICAgICAgICAgCi0gICAgICAgICAgICAgCi0gICAgICAgTUxBICAgICAgICAgICAgIFJlbSxuZWdDdXJRUCx0ZW1wUHJlZCxhYnNDb2VmZkFDICAgICAgICAgICAgICAgOy8vIFJlbT1hYnMocFByZWRCdWZSb3dbaV0pLXRlbXBQcmVkKmN1clFQCi0gICAgICAgTERSSCAgICAgICAgICAgIHRlbXAsW3BTcmNEc3QsQ291bnRdICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9cFNyY0RzdFtpXSwxPD1pPDgKLSAgICAgICAKLSAgICAgICBDTVAgICAgICAgICAgICAgUmVtLGN1clFQCi0gICAgICAgQURER0UgICAgICAgICAgIHRlbXBQcmVkLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGlmIFJlbT49cm91bmQoY3VyUVAvMik7IHRlbXBQcmVkPXRlbXBQcmVkKzEKLSAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzAKLSAgICAgICBSU0JMVCAgICAgICAgICAgdGVtcFByZWQsdGVtcFByZWQsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gaWYgcFByZWRCdWZSb3dbaV08MCA7IHRlbXBQcmVkPS10ZW1wUHJlZAotICAgICAgICAgICAgICAKLSAgICAgICA7Ly8gVXBkYXRlIHNvdXJjZSBhbmQgUm93IFByZWRpY3Rpb24gYnVmZmVycwotICAgICAgIAotICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wLHRlbXAsdGVtcFByZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPXRlbXBQcmVkK3BTcmNEc3RbaV0KLSAgICAgICBTU0FUMTYgICAgICAgICAgdGVtcCwjMTIsdGVtcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2xpcCB0ZW1wIHRvIFstMjA0OCwyMDQ3XQotICAgICAgIFNUUkggICAgICAgICAgICB0ZW1wLFtwU3JjRHN0LENvdW50XQotICAgICAgIFNUUkggICAgICAgICAgICB0ZW1wLFtwUHJlZEJ1ZlJvdyxDb3VudF0gICAgICAgICAgICAgICAgICAgICAgIDsvLyBwUHJlZEJ1ZlJvd1tpXT10ZW1wCi0gICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LCMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGk9aSsxCi0gICAgICAgQ01QICAgICAgICAgICAgIENvdW50LCMxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNvbXBhcmUgaWYgaT04Ci0gICAgICAgQkxUICAgICAgICAgICAgIGxvb3AxCi0gICAgICAgQiAgICAgICAgICAgICAgIEV4aXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBleGl0Ci0KLUhvcml6b250YWwKLQotICAgICAgIE1PViAgICAgICAgICAgICBDb3VudCwjMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbml0aWFsaXppbmcgaT04Ci0KLWxvb3AyICAKLSAgICAgCi0gICAgICAgTFNSICAgICAgICAgICAgIHRlbXAyLENvdW50LCMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAyPWk+PjMKLSAgICAgICAKLSAgICAgICA7Ly8gQ2FsY3VsYXRlIHRlbXBQcmVkCi0gICAgICAgCi0gICAgICAgTERSSCAgICAgICAgICAgIGFic0NvZWZmQUMsW3BQcmVkQnVmQ29sLHRlbXAyXSAgICAgICAgICAgICAgICAgOy8vIGFic0NvZWZBQz1wUHJlZEJ1ZkNvbFtpPj4zXSAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgTU9WICAgICAgICAgICAgIHRlbXAxLGFic0NvZWZmQUMKLSAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY29tcGFyZSBwUHJlZEJ1ZlJvd1tpXSB3aXRoIHplcm8sIDE9PGk8PTcKLSAgICAgICBSU0JMVCAgICAgICAgICAgYWJzQ29lZmZBQyx0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gYWJzQ29lZmZBQz1hYnMocFByZWRCdWZDb2xbaT4+M10pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIFNNVUxCQiAgICAgICAgICBhYnNDb2VmZkFDLGFic0NvZWZmQUMscHJlZFFQICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wMT1wUHJlZEJ1ZkNvbFtpPj4zXSpwcmVkUVAKLSAgICAgICBNVUwgICAgICAgICAgICAgdGVtcFByZWQsYWJzQ29lZmZBQyxDb2VmZlRhYmxlICAgICAgICAgICAgICAgICA7Ly8gdGVtcFByZWQ9cFByZWRCdWZDb2xbaT4+M10qcHJlZFFQKjB4MWZmZmYvY3VyUVAKLSAgICAgICBMU1IgICAgICAgICAgICAgdGVtcFByZWQsdGVtcFByZWQsIzE3ICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcFByZWQ9cFByZWRCdWZDb2xbaT4+M10qcHJlZFFQL2N1clFQCi0gICAgICAgCi0gICAgICAgTUxBICAgICAgICAgICAgIFJlbSxuZWdDdXJRUCx0ZW1wUHJlZCxhYnNDb2VmZkFDCi0gICAgICAgTERSSCAgICAgICAgICAgIHRlbXAsW3BTcmNEc3QsQ291bnRdICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9cFNyY0RzdFtpXQotICAgICAgIAotICAgICAgIENNUCAgICAgICAgICAgICBSZW0sY3VyUVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb21wYXJlIFJlbSB3aXRoIHJvdW5kKGN1clFQLzIpCi0gICAgICAgQURER0UgICAgICAgICAgIHRlbXBQcmVkLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXBQcmVkPXRlbXBQcmVkKzEgaWYgUmVtPj1yb3VuZChjdXJRUC8yKQotICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMAotICAgICAgIFJTQkxUICAgICAgICAgICB0ZW1wUHJlZCx0ZW1wUHJlZCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpZiBwUHJlZEJ1ZkNvbFtpPj4zIDwwIHRlbXBQcmVkPS10ZW1wUHJlZAotICAgICAgIAotICAgICAgIDsvLyBVcGRhdGUgc291cmNlIGFuZCBSb3cgUHJlZGljdGlvbiBidWZmZXJzCi0gICAgICAgCi0gICAgICAgQUREICAgICAgICAgICAgIHRlbXAsdGVtcCx0ZW1wUHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9cFNyY0RzdFtpXSt0ZW1wUHJlZAotICAgICAgIFNTQVQxNiAgICAgICAgICB0ZW1wLCMxMix0ZW1wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDbGlwIHRlbXAgdG8gWy0yMDQ4LDIwNDddCi0gICAgICAgU1RSSCAgICAgICAgICAgIHRlbXAsW3BTcmNEc3QsQ291bnRdICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMF09IGNsaXBwZWQgdmFsdWUKLSAgICAgICBTVFJIICAgICAgICAgICAgdGVtcCxbcFByZWRCdWZDb2wsdGVtcDJdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFByZWRCdWZDb2xbaT4+M109dGVtcAotICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCwjMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpPWkrOAotICAgICAgIENNUCAgICAgICAgICAgICBDb3VudCwjMTI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjb21wYXJlIGkgd2l0aCA2NAotICAgICAgIEJMVCAgICAgICAgICAgICBsb29wMgotCi0gICAgICAgICAgICAgCi1FeGl0Ci0gIAotICAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIgCi0KLSAgICAgICBNX0VORAotICAgICAgIEVORElGCi0gICAgICAgRU5ECi0KLQotICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NzE2MGYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07LyoqCi07ICogCi07ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSV9zLnMKLTsgKiBPcGVuTUFYIERMOiB2MS4wLjIKLTsgKiBSZXZpc2lvbjogICA5NjQxCi07ICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLTsgKiAKLTsgKiAKLTsgKiAKLTsgKgotOyAqIERlc2NyaXB0aW9uOiAKLTsgKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRlciByZWNvbnN0cnVjdGlvbgotOyAqIAotOyAqCi07ICoKLTsgKgotOyAqCi07ICogRnVuY3Rpb246IG9teFZDTTRQMl9RdWFudEludkludGVyX0kKLTsgKgotOyAqIERlc2NyaXB0aW9uOgotOyAqIFBlcmZvcm1zIGludmVyc2UgcXVhbnRpemF0aW9uIG9uIGludHJhL2ludGVyIGNvZGVkIGJsb2NrLgotOyAqIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgYml0c19wZXJfcGl4ZWwgPSA4LiBNaXNtYXRjaCBjb250cm9sCi07ICogaXMgcGVyZm9ybWVkIGZvciB0aGUgZmlyc3QgTVBFRy00IG1vZGUgaW52ZXJzZSBxdWFudGl6YXRpb24gbWV0aG9kLgotOyAqIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBjbGlwcGVkIHRvIHRoZSByYW5nZTogWy0yMDQ4LCAyMDQ3XS4KLTsgKiBNaXNtYXRjaCBjb250cm9sIGlzIHBlcmZvcm1lZCBmb3IgdGhlIGZpcnN0IGludmVyc2UgcXVhbnRpemF0aW9uIG1ldGhvZC4KLTsgKgotOyAqIFJlbWFya3M6Ci07ICoKLTsgKiBQYXJhbWV0ZXJzOgotOyAqIFtpbl0gcFNyY0RzdCAgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCAocXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuCi07ICogW2luXSBRUCAgICAgICAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpc2VyX3NjYWxlKQotOyAqIFtpbl0gdmlkZW9Db21wICAgICAgKEludHJhIHZlcnNpb24gb25seS4pIFZpZGVvIGNvbXBvbmVudCB0eXBlIG9mIHRoZQotOyAqICAgICAgICAgICAgICAgICAgY3VycmVudCBibG9jay4gVGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3M6Ci07ICogICAgICAgICAgICAgICAgICBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UsCi07ICogICAgICAgICAgICAgICAgICBPTVhfVkNfQUxQSEEuCi07ICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGEgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLAotOyAqICAgICAgICAgICAgICAgICAgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub25saW5lYXIgaW50cmEgREMgbW9kZS4KLTsgKiBbb3V0XSAgICBwU3JjRHN0ICAgICAgcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2suICBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4KLTsgKgotOyAqIFJldHVybiBWYWx1ZToKLTsgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKLTsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKLTsgKiAgICAtIElmIHBTcmNEc3QgaXMgTlVMTCBvciBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLgotOyAqICAgICAgb3IKLTsgKiAgICAtIElmIFFQIDw9IDAuCi07ICogICAgICBvcgotOyAqICAgIC0gdmlkZW9Db21wIGlzIG5vbmUgb2YgT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIGFuZCBPTVhfVkNfQUxQSEEuCi07ICoKLTsgKi8KLQotICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLQotICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKLQotICAgICAgICAgCi0KLSAgICAgSUYgQVJNMTEzNkpTCi0KLTsvL0lucHV0IEFyZ3VtZW50cwotcFNyY0RzdCAgICAgICAgICAgIFJOIDAKLVFQICAgICAgICAgICAgICAgICBSTiAxCi0KLTsvL0xvY2FsIFZhcmlhYmxlcwotUmV0dXJuICAgICAgICAgICAgIFJOIDAKLUNvdW50ICAgICAgICAgICAgICBSTiA0ICAgICAgCi10ZW1wVmFsMjEgICAgICAgICAgUk4gMgotdGVtcFZhbDQzICAgICAgICAgIFJOIDMKLVFQMSAgICAgICAgICAgICAgICBSTiA1Ci1YMiAgICAgICAgICAgICAgICAgUk4gNgotWDMgICAgICAgICAgICAgICAgIFJOIDE0Ci1SZXN1bHQxICAgICAgICAgICAgUk4gOAotUmVzdWx0MiAgICAgICAgICAgIFJOIDkKLXR3byAgICAgICAgICAgICAgICBSTiA3Ci0KLSAgICBNX1NUQVJUIG9teFZDTTRQMl9RdWFudEludkludGVyX0kscjkKLSAgICAgICAKLSAgICAgICAgTU9WICAgICAgQ291bnQsIzY0Ci0gICAgICAgIFRTVCAgICAgIFFQLCMxCi0gICAgICAgIExEUkQgICAgIHRlbXBWYWwyMSxbcFNyY0RzdF0gICAgICA7Ly8gTG9hZHMgZmlyc3QgdHdvIHZhbHVlcyBvZiBwU3JjRHN0IHRvIHRlbXBWYWwyMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBuZXh0IHR3byB2YWx1ZXMgdG8gdGVtcFZhbDQzCi0gICAgICAgIFNVQkVRICAgIFFQMSxRUCwjMSAgICAgICAgICAgICAgICA7Ly8gUVAxPVFQIGlmIFFQIGlzIG9kZCAsIFFQMT1RUC0xIGlmIFFQIGlzIGV2ZW4KLSAgICAgICAgTU9WTkUgICAgUVAxLFFQCi0gICAgICAgIE1PViAgICAgIHR3bywjMgotICAgICAgICAKLSAgICAgICAgCi0KLUxvb3AKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBTTVVMQkIgICBYMix0ZW1wVmFsMjEsdHdvICAgICAgICAgOy8vIFgyPSBmaXJzdCB2YWwobG93ZXIgMTYgYml0cyBvZiB0YW1wVmFsMjEpKjIKLSAgICAgICAgQ01QICAgICAgWDIsIzAKLSAgICAgICAgCi0gICAgICAgIFJTQkxUICAgIFgyLFgyLCMwICAgICAgICAgICAgICAgICA7Ly8gWDI9YWJzb2x1dGV2YWwoZmlyc3QgdmFsKQotICAgICAgICBTTUxBQkJORSBYMixRUCxYMixRUDEgICAgICAgICAgICAgOy8vIFgyPTIqYWJzdmFsKGZpcnN0IHZhbCkqUVArUVAgaWYgUVAgaXMgb2RkIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFgyPTIqYWJzdmFsKGZpcnN0IHZhbCkqUVArUVAtMSBpZiBRUCBpcyBldmVuIAotICAgICAgICBTTVVMVEIgICBYMyx0ZW1wVmFsMjEsdHdvICAgICAgICAgOy8vIFgzPSBzZWNvbmQgdmFsKHRvcCAxNiBiaXRzIG9mIHRhbXBWYWwyMSkqMgotICAgICAgICBSU0JMVCAgICBYMixYMiwjMAotICAgICAgICAKLSAgICAgICAgQ01QICAgICAgWDMsIzAKLSAgICAgICAgICAgICAgIAotICAgICAgICBSU0JMVCAgICBYMyxYMywjMAotICAgICAgICBTTUxBQkJORSBYMyxRUCxYMyxRUDEKLSAgICAgICAgCi0gICAgICAgIFJTQkxUICAgIFgzLFgzLCMwCi0gICAgICAgIFBLSEJUICAgIFJlc3VsdDEsWDIsWDMsTFNMICMxNiAgICA7Ly8gUmVzdWx0MVswLTE1XT1YMlswLTE1XSxSZXN1bHQxWzE2LTMxXT1YM1sxNi0zMV0KLSAgICAgICAgU01VTEJCICAgWDIsdGVtcFZhbDQzLHR3byAgICAgICAgIDsvLyBYMj0gZmlyc3QgdmFsKGxvd2VyIDE2IGJpdHMgb2YgdGFtcFZhbDQzKSoyCi0gICAgICAgIFNTQVQxNiAgIFJlc3VsdDEsIzEyLFJlc3VsdDEgICAgICA7Ly8gY2xpcCB0byByYW5nZSBbLTIwNDgsMjA0N10KLSAgICAgICAgQ01QICAgICAgWDIsIzAKLSAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAKLSAgICAgICAgUlNCTEUgICAgWDIsWDIsIzAKLSAgICAgICAgU01MQUJCTkUgWDIsUVAsWDIsUVAxCi0gICAgICAgIFNNVUxUQiAgIFgzLHRlbXBWYWw0Myx0d28gICAgICAgICA7Ly8gWDI9IGZpcnN0IHZhbCh0b3AgMTYgYml0cyBvZiB0YW1wVmFsMjEpKjIKLSAgICAgICAgUlNCTFQgICAgWDIsWDIsIzAKLSAgICAgICAgQ01QICAgICAgWDMsIzAKLSAgICAgICAgCi0gICAgICAgIExEUkQgICAgIHRlbXBWYWwyMSxbcFNyY0RzdCwjOF0gICA7Ly8gTG9hZCBuZXh0IGZvdXIgVmFsdWVzIHRvIHRlbXBWYWwyMSx0ZW1wVmFsNDMKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgUlNCTFQgICAgWDMsWDMsIzAKLSAgICAgICAgU01MQUJCTkUgWDMsUVAsWDMsUVAxCi0gICAgICAgIFJTQkxUICAgIFgzLFgzLCMwCi0gICAgICAgIFBLSEJUICAgIFJlc3VsdDIsWDIsWDMsTFNMICMxNiAgICA7Ly8gUmVzdWx0MlswLTE1XT1YMlswLTE1XSxSZXN1bHQyWzE2LTMxXT1YM1swLTE1XQotICAgICAgICBTU0FUMTYgICBSZXN1bHQyLCMxMixSZXN1bHQyICAgICAgOy8vIGNsaXAgdG8gcmFuZ2UgWy0yMDQ4LDIwNDddCi0gICAgICAgIAotICAgICAgICBTVUJTICAgICBDb3VudCxDb3VudCwjNCAgICAgICAgICAgOy8vIERlY3JlbWVudCBDb3VudCBieSA0IGFuZCBjb250aW51ZSBpZiBpdCBoYXMgbm90IHJlYWNoZWQgMCAgICAgICAgIAotICAgICAgICBTVFJEICAgICBSZXN1bHQxLFtwU3JjRHN0XSwjOCAgICAgOy8vIFN0b3JlIERvdWJsZSB3b3JkcyBhbmQgaW5jcmVtZW50IHRoZSBwb2ludGVyIHRvIHBvaW50IHRoZSBuZXh0IHN0b3JlIGFkZHJlc3MKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgCi0gICAgICAgIEJHVCAgICAgIExvb3AKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgotICAgICAgICAKLSAgICAgICAgTV9FTkQKLSAgICAgICAgRU5ESUYgICAgICAgIAotICAgICAgICBFTkQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDgyZGE0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucworKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8qKgotOyAqIAotOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zCi07ICogT3Blbk1BWCBETDogdjEuMC4yCi07ICogUmV2aXNpb246ICAgOTY0MQotOyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07ICogCi07ICogCi07ICogCi07ICoKLTsgKiBEZXNjcmlwdGlvbjogCi07ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50ZXIgcmVjb25zdHJ1Y3Rpb24KLTsgKiAKLTsgKgotOyAqCi07ICoKLTsgKgotOyAqIAotOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JCi07ICoKLTsgKiBEZXNjcmlwdGlvbjoKLTsgKiBQZXJmb3JtcyBpbnZlcnNlIHF1YW50aXphdGlvbiBvbiBpbnRyYS9pbnRlciBjb2RlZCBibG9jay4KLTsgKiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gTWlzbWF0Y2ggY29udHJvbAotOyAqIGlzIHBlcmZvcm1lZCBmb3IgdGhlIGZpcnN0IE1QRUctNCBtb2RlIGludmVyc2UgcXVhbnRpemF0aW9uIG1ldGhvZC4KLTsgKiBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgY2xpcHBlZCB0byB0aGUgcmFuZ2U6IFstMjA0OCwgMjA0N10uCi07ICogTWlzbWF0Y2ggY29udHJvbCBpcyBwZXJmb3JtZWQgZm9yIHRoZSBmaXJzdCBpbnZlcnNlIHF1YW50aXphdGlvbiBtZXRob2QuCi07ICoKLTsgKiBSZW1hcmtzOgotOyAqCi07ICogUGFyYW1ldGVyczoKLTsgKiBbaW5dICAgIHBTcmNEc3QgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4KLTsgKiBbaW5dICAgIFFQICAgICAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpc2VyX3NjYWxlKQotOyAqIFtpbl0gICAgdmlkZW9Db21wICAgICAgICAgIChJbnRyYSB2ZXJzaW9uIG9ubHkuKSBWaWRlbyBjb21wb25lbnQgdHlwZSBvZiB0aGUKLTsgKiAgICAgICAgICAgICAgICAgICAgY3VycmVudCBibG9jay4gVGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3M6Ci07ICogICAgICAgICAgICAgICAgICAgIE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSwKLTsgKiAgICAgICAgICAgICAgICAgICAgT01YX1ZDX0FMUEhBLgotOyAqIFtpbl0gICAgc2hvcnRWaWRlb0hlYWRlciAgYSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOwotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLAotOyAqICAgICAgICAgICAgICAgICAgICBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbmxpbmVhciBpbnRyYSBEQyBtb2RlLgotOyAqIFtvdXRdICAgIHBTcmNEc3QgICAgICAgIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAoZGVxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrLiAgTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuCi07ICoKLTsgKiBSZXR1cm4gVmFsdWU6Ci07ICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCi07ICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCi07ICogICAgLSAgICBJZiBwU3JjRHN0IGlzIE5VTEwgb3IgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4KLTsgKiAgICAgIG9yCi07ICogICAgLSBJZiBRUCA8PSAwLgotOyAqICAgICAgb3IKLTsgKiAgICAtIHZpZGVvQ29tcCBpcyBub25lIG9mIE9NWF9WQ19MVU1JTkFOQ0UsIE9NWF9WQ19DSFJPTUlOQU5DRSBhbmQgT01YX1ZDX0FMUEhBLgotOyAqCi0gCi0KLSAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAKLSAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0gICAKLSAgIAotICAgSU1QT1JUICAgICAgICBhcm1WQ000UDJfRENTY2FsZXIKLSAKLSAgICAgICAgIAotCi0gICAgIElGIEFSTTExMzZKUwotCi07Ly9JbnB1dCBBcmd1bWVudHMKLXBTcmNEc3QgICAgICAgICAgICBSTiAwCi1RUCAgICAgICAgICAgICAgICAgUk4gMQotdmlkZW9Db21wICAgICAgICAgIFJOIDIKLXNob3J0VmlkZW9IZWFkZXIgICBSTiAzCi0KLTsvL0xvY2FsIFZhcmlhYmxlcwotUmV0dXJuICAgICAgICAgICAgIFJOIDAKLWRjU2NhbGVyICAgICAgICAgICBSTiA0Ci10ZW1wICAgICAgICAgICAgICAgUk4gMTIKLWluZGV4ICAgICAgICAgICAgICBSTiA2Ci0gICAgICAKLXRlbXBWYWwyMSAgICAgICAgICBSTiA0Ci10ZW1wVmFsNDMgICAgICAgICAgUk4gNQotUVAxICAgICAgICAgICAgICAgIFJOIDYKLVgyICAgICAgICAgICAgICAgICBSTiA3Ci1YMyAgICAgICAgICAgICAgICAgUk4gMTQKLVJlc3VsdDEgICAgICAgICAgICBSTiA4Ci1SZXN1bHQyICAgICAgICAgICAgUk4gOQotdHdvICAgICAgICAgICAgICAgIFJOIDEwCi1Db3VudCAgICAgICAgICAgICAgUk4gMTEKLQotCi0KLSAgIAotICAgIE1fU1RBUlQgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSxyMTEKLQotCi0gICAgICAgIAotICAgICAgICA7Ly8gUGVyZm9ybSBJbnZlcnNlIFF1YW50aXphdGlvbiBmb3IgREMgY29lZmZpY2llbnQKLQotICAgICAgICBURVEgICAgICAgc2hvcnRWaWRlb0hlYWRlciwjMCAgICAgIDsvLyBUZXN0IGlmIHNob3J0IFZpZGVvIEhlYWRlciBmbGFnID0wICAgICAgICAgICAgIAotICAgICAgICBNT1ZORSAgICAgZGNTY2FsZXIsIzggICAgICAgICAgICAgIDsvLyBpZiBzaG9ydFZpZGVvSGVhZGVyIGlzIG5vbiB6ZXJvIGRjU2NhbGVyPTgKLSAgICAgICAgQk5FICAgICAgIGNhbERDVmFsCi0gICAgICAgIExEUiAgICAgICBpbmRleCwgPWFybVZDTTRQMl9EQ1NjYWxlcgotICAgICAgQUREICAgICAgIGluZGV4LGluZGV4LHZpZGVvQ29tcCxMU0wgIzUKLSAgICAgIExEUkIgICAgICBkY1NjYWxlcixbaW5kZXgsUVBdCi0KLQotICAgICAgICA7Ly9NX0NhbERDU2NhbGFyICBzaG9ydFZpZGVvSGVhZGVyLHZpZGVvQ29tcCwgUVAKLQotY2FsRENWYWwKLQotICAgICAgICBMRFJIICAgICB0ZW1wLFtwU3JjRHN0XQotICAgICAgICBTTVVMQkIgICB0ZW1wLHRlbXAsZGNTY2FsZXIgICAgICAgOy8vIGRjQ29lZmYgPSBkY1NjYWxlciAqIFF1YW50aXplZCBEQyBjb2VmZmljaWVudChmcm9tIG1lbW9yeSkKLSAgICAgICAgU1NBVCAgICAgdGVtcCwjMTIsdGVtcCAgICAgICAgICAgIDsvLyBTYXR1cmF0aW5nIHRvIDEyIGJpdHMKLSAgICAgICAgCi0KLSAgICAgICAgTU9WICAgICAgQ291bnQsIzY0Ci0gICAgICAgIFRTVCAgICAgIFFQLCMxCi0gICAgICAgIExEUkQgICAgIHRlbXBWYWwyMSxbcFNyY0RzdF0gICAgICA7Ly8gTG9hZHMgZmlyc3QgdHdvIHZhbHVlcyBvZiBwU3JjRHN0IHRvIHRlbXBWYWwyMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBuZXh0IHR3byB2YWx1ZXMgdG8gdGVtcFZhbDQzCi0gICAgICAgIFNVQkVRICAgIFFQMSxRUCwjMSAgICAgICAgICAgICAgICA7Ly8gUVAxPVFQIGlmIFFQIGlzIG9kZCAsIFFQMT1RUC0xIGlmIFFQIGlzIGV2ZW4KLSAgICAgICAgTU9WTkUgICAgUVAxLFFQCi0gICAgICAgIE1PViAgICAgIHR3bywjMgotCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0KLUxvb3AKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBTTVVMQkIgICBYMix0ZW1wVmFsMjEsdHdvICAgICAgICAgOy8vIFgyPSBmaXJzdCB2YWwobG93ZXIgMTYgYml0cyBvZiB0YW1wVmFsMjEpKjIKLSAgICAgICAgQ01QICAgICAgWDIsIzAKLSAgICAgICAgCi0gICAgICAgIFJTQkxUICAgIFgyLFgyLCMwICAgICAgICAgICAgICAgICA7Ly8gWDI9YWJzb2x1dGV2YWwoZmlyc3QgdmFsKQotICAgICAgICBTTUxBQkJORSBYMixRUCxYMixRUDEgICAgICAgICAgICAgOy8vIFgyPTIqYWJzdmFsKGZpcnN0IHZhbCkqUVArUVAgaWYgUVAgaXMgb2RkIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFgyPTIqYWJzdmFsKGZpcnN0IHZhbCkqUVArUVAtMSBpZiBRUCBpcyBldmVuIAotICAgICAgICBTTVVMVEIgICBYMyx0ZW1wVmFsMjEsdHdvICAgICAgICAgOy8vIFgzPSBzZWNvbmQgdmFsKHRvcCAxNiBiaXRzIG9mIHRhbXBWYWwyMSkqMgotICAgICAgICBSU0JMVCAgICBYMixYMiwjMAotICAgICAgICAKLSAgICAgICAgQ01QICAgICAgWDMsIzAKLSAgICAgICAgICAgICAgIAotICAgICAgICBSU0JMVCAgICBYMyxYMywjMAotICAgICAgICBTTUxBQkJORSBYMyxRUCxYMyxRUDEKLSAgICAgICAgCi0gICAgICAgIFJTQkxUICAgIFgzLFgzLCMwCi0gICAgICAgIFBLSEJUICAgIFJlc3VsdDEsWDIsWDMsTFNMICMxNiAgICA7Ly8gUmVzdWx0MVswLTE1XT1YMlswLTE1XSxSZXN1bHQxWzE2LTMxXT1YM1sxNi0zMV0KLSAgICAgICAgU01VTEJCICAgWDIsdGVtcFZhbDQzLHR3byAgICAgICAgIDsvLyBYMj0gZmlyc3QgdmFsKGxvd2VyIDE2IGJpdHMgb2YgdGFtcFZhbDQzKSoyCi0gICAgICAgIFNTQVQxNiAgIFJlc3VsdDEsIzEyLFJlc3VsdDEgICAgICA7Ly8gY2xpcCB0byByYW5nZSBbLTIwNDgsMjA0N10KLSAgICAgICAgQ01QICAgICAgWDIsIzAKLSAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAKLSAgICAgICAgUlNCTEUgICAgWDIsWDIsIzAKLSAgICAgICAgU01MQUJCTkUgWDIsUVAsWDIsUVAxCi0gICAgICAgIFNNVUxUQiAgIFgzLHRlbXBWYWw0Myx0d28gICAgICAgICA7Ly8gWDI9IGZpcnN0IHZhbCh0b3AgMTYgYml0cyBvZiB0YW1wVmFsMjEpKjIKLSAgICAgICAgUlNCTFQgICAgWDIsWDIsIzAKLSAgICAgICAgQ01QICAgICAgWDMsIzAKLSAgICAgICAgCi0gICAgICAgIExEUkQgICAgIHRlbXBWYWwyMSxbcFNyY0RzdCwjOF0gICA7Ly8gTG9hZCBuZXh0IGZvdXIgVmFsdWVzIHRvIHRlbXBWYWwyMSx0ZW1wVmFsNDMKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgUlNCTFQgICAgWDMsWDMsIzAKLSAgICAgICAgU01MQUJCTkUgWDMsUVAsWDMsUVAxCi0gICAgICAgIFJTQkxUICAgIFgzLFgzLCMwCi0gICAgICAgIFBLSEJUICAgIFJlc3VsdDIsWDIsWDMsTFNMICMxNiAgICA7Ly8gUmVzdWx0MlswLTE1XT1YMlswLTE1XSxSZXN1bHQyWzE2LTMxXT1YM1sxNi0zMV0KLSAgICAgICAgU1NBVDE2ICAgUmVzdWx0MiwjMTIsUmVzdWx0MiAgICAgIDsvLyBjbGlwIHRvIHJhbmdlIFstMjA0OCwyMDQ3XQotICAgICAgICAKLSAgICAgICAgU1VCUyAgICAgQ291bnQsQ291bnQsIzQgICAgICAgICAgIDsvLyBEZWNyZW1lbnQgQ291bnQgYnkgNCBhbmQgY29udGludWUgaWYgaXQgaGFzIG5vdCByZWFjaGVkIDAgICAgICAgICAKLSAgICAgICAgU1RSRCAgICAgUmVzdWx0MSxbcFNyY0RzdF0sIzggICAgIDsvLyBTdG9yZSBEb3VibGUgd29yZHMgYW5kIGluY3JlbWVudCB0aGUgcG9pbnRlciB0byBwb2ludCB0aGUgbmV4dCBzdG9yZSBhZGRyZXNzCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgIAotICAgICAgICBCR1QgICAgICBMb29wCi0KLSAgICAgICAgU1VCICAgICAgcFNyY0RzdCxwU3JjRHN0LCMxMjgKLSAgICAgICAgCi0gICAgICAgIDsvLyBTdG9yaW5nIHRoZSBJbnZlcnNlIFF1YW50aXplZCBEQyBjb2VmZmljaWVudAotCi0gICAgICAgIFNUUkggICAgIHRlbXAsW3BTcmNEc3RdLCMyCi0gICAgICAgIAotICAKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgotICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNX0VORAotICAgICAgICBFTkRJRiAgICAgICAgCi0gICAgICAgIEVORAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvc3JjL2FybVZDX1ZlcnNpb24uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDkzNjgxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1DT01NX1ZlcnNpb24uaCIKLQotI2lmZGVmIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TCi1jb25zdCBjaGFyICogY29uc3Qgb214VkNfVmVyc2lvbkRlc2NyaXB0aW9uID0gIkFSTSBPcGVuTUFYIERMIHYiIEFSTV9WRVJTSU9OX1NUUklORyAiICAgUmVsPSIgT01YX0FSTV9SRUxFQVNFX1RBRyAiICAgQXJjaD0iIE9NWF9BUk1fQlVJTERfQVJDSElURUNUVVJFICIgICBUb29scz0iICBPTVhfQVJNX0JVSUxEX1RPT0xDSEFJTiA7Ci0jZW5kaWYgLyogQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9BUk1fREVMSVZFUlkuVFhUIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL0FSTV9ERUxJVkVSWS5UWFQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMmQ3MGEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL0FSTV9ERUxJVkVSWS5UWFQKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi1UaGUgY29udGVudHMgb2YgdGhpcyB0cmFuc2FjdGlvbiB3YXMgY3JlYXRlZCBieSBIZWRsZXkgRnJhbmNpcwotb2YgQVJNIG9uIDE5LUZlYi0yMDA4LgotCi1JdCBjb250YWlucyB0aGUgQVJNIGRhdGEgdmVyc2lvbnMgbGlzdGVkIGJlbG93LgotCi1UaGlzIGRhdGEsIHVubGVzcyBvdGhlcndpc2Ugc3RhdGVkLCBpcyBBUk0gUHJvcHJpZXRhcnkgYW5kIGFjY2VzcyB0byBpdAotaXMgc3ViamVjdCB0byB0aGUgYWdyZWVtZW50cyBpbmRpY2F0ZWQgYmVsb3cuCi0KLUlmIHlvdSBleHBlcmllbmNlIHByb2JsZW1zIHdpdGggdGhpcyBkYXRhLCBwbGVhc2UgY29udGFjdCBBUk0gc3VwcG9ydAotcXVvdGluZyB0cmFuc2FjdGlvbiByZWZlcmVuY2UgPDk3NDE0Pi4KLQotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQotCi0tIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxCi0gIFZpZGVvIGNvZGVjcyAtIG9wdGltaXNlZCBjb2RlCi0gIFY3IGNvZGUgcmVsZWFzZSBmb3IgSGFudHJvIChWZXIgMS4wLjIpCi0gIGludGVybmFsIGFjY2VzcwotCi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi0KLVRoaXMgdHJhbnNhY3Rpb24gY29udGFpbnMgZGVsaXZlcmFibGVzIHdoaWNoIGFyZSBkZXNpZ25hdGVkIGFzIGJlaW5nIG9mCi1iZXRhIHJlbGVhc2Ugc3RhdHVzIChCRVQpLgotCi1CZXRhIHJlbGVhc2Ugc3RhdHVzIGhhcyBhIHBhcnRpY3VsYXIgbWVhbmluZyB0byBBUk0gb2Ygd2hpY2ggdGhlIHJlY2lwaWVudAotbXVzdCBiZSBhd2FyZS4gQmV0YSBpcyBhIHByZS1yZWxlYXNlIHN0YXR1cyBpbmRpY2F0aW5nIHRoYXQgdGhlIGRlbGl2ZXJhYmxlCi1zbyBkZXNjcmliZWQgaXMgYmVsaWV2ZWQgdG8gcm9idXN0bHkgZGVtb25zdHJhdGUgc3BlY2lmaWVkIGJlaGF2aW91ciwgdG8gYmUKLWNvbnNpc3RlbnQgYWNyb3NzIGl0cyBpbmNsdWRlZCBhc3BlY3RzIGFuZCBiZSByZWFkeSBmb3IgZ2VuZXJhbCBkZXBsb3ltZW50LgotQnV0IEJldGEgYWxzbyBpbmRpY2F0ZXMgdGhhdCBwcmUtcmVsZWFzZSByZWxpYWJpbGl0eSB0cmlhbHMgYXJlIG9uZ29pbmcgYW5kCi10aGF0IGl0IGlzIHBvc3NpYmxlIHJlc2lkdWFsIGRlZmVjdHMgb3IgZXJyb3JzIGluIG9wZXJhdGlvbiwgY29uc2lzdGVuY3kKLWFuZCBkb2N1bWVudGF0aW9uIG1heSBzdGlsbCBiZSBlbmNvdW50ZXJlZC4gVGhlIHJlY2lwaWVudCBzaG91bGQgY29uc2lkZXIKLXRoaXMgcG9zaXRpb24gd2hlbiB1c2luZyB0aGlzIEJldGEgbWF0ZXJpYWwgc3VwcGxpZWQuIEFSTSB3aWxsIG5vcm1hbGx5Ci1hdHRlbXB0IHRvIHByb3ZpZGUgZml4ZXMgb3IgYSB3b3JrLWFyb3VuZCBmb3IgZGVmZWN0cyBpZGVudGlmaWVkIGJ5IHRoZQotcmVjaXBpZW50LCBidXQgdGhlIHByb3Zpc2lvbiBvciB0aW1lbGluZXNzIG9mIHRoaXMgc3VwcG9ydCBjYW5ub3QgYmUKLWd1YXJhbnRlZWQuIEFSTSBzaGFsbCBub3QgYmUgcmVzcG9uc2libGUgZm9yIGRpcmVjdCBvciBjb25zZXF1ZW50aWFsCi1kYW1hZ2VzIGFzIGEgcmVzdWx0IG9mIGVuY291bnRlcmluZyBvbmUgb3IgbW9yZSBvZiB0aGVzZSByZXNpZHVhbCBkZWZlY3RzLgotQnkgYWNjZXB0aW5nIGEgQmV0YSByZWxlYXNlLCB0aGUgcmVjaXBpZW50IGFncmVlcyB0byB0aGVzZSBjb25zdHJhaW50cyBhbmQKLXRvIHByb3ZpZGluZyByZWFzb25hYmxlIGluZm9ybWF0aW9uIHRvIEFSTSB0byBlbmFibGUgdGhlIHJlcGxpY2F0aW9uIG9mIHRoZQotZGVmZWN0cyBpZGVudGlmaWVkIGJ5IHRoZSByZWNpcGllbnQuIFRoZSBzcGVjaWZpYyBCZXRhIHZlcnNpb24gc3VwcGxpZWQKLXdpbGwgbm90IGJlIHN1cHBvcnRlZCBhZnRlciByZWxlYXNlIG9mIGEgbGF0ZXIgb3IgaGlnaGVyIHN0YXR1cyB2ZXJzaW9uLgotSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgU3VwcG9ydCBmb3IgdGhlIEJldGEgcmVsZWFzZSBvZiB0aGUgZGVsaXZlcmFibGUKLXdpbGwgb25seSBiZSBwcm92aWRlZCBieSBBUk0gdG8gYSByZWNpcGllbnQgd2hvIGhhcyBhIGN1cnJlbnQgc3VwcG9ydCBhbmQKLW1haW50ZW5hbmNlIGNvbnRyYWN0IGZvciB0aGUgZGVsaXZlcmFibGUuCi0KLQotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQotCi1JbiBhZGRpdGlvbiB0byB0aGUgZGF0YSB2ZXJzaW9ucyBsaXN0ZWQgYWJvdmUsIHRoaXMgdHJhbnNhY3Rpb24gY29udGFpbnMKLXR3byBhZGRpdGlvbmFsIGZpbGVzIGF0IHRoZSB0b3AgbGV2ZWwuCi0KLVRoZSBmaXJzdCBpcyB0aGlzIGZpbGUsIEFSTV9ERUxJVkVSWV85NzQxNC5UWFQsIHdoaWNoIGlzIHRoZSBkZWxpdmVyeQotbm90ZS4KLQotVGhlIHNlY29uZCBpcyBBUk1fTUFOSUZFU1RfOTc0MTQuVFhUIHdoaWNoIGNvbnRhaW5zIGEgbWFuaWZlc3Qgb2YgYWxsIHRoZQotZmlsZXMgaW5jbHVkZWQgaW4gdGhpcyB0cmFuc2FjdGlvbiwgdG9nZXRoZXIgd2l0aCB0aGVpciBjaGVja3N1bXMuCi0KLVRoZSBjaGVja3N1bXMgcHJvdmlkZWQgYXJlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuCi1NRDUgTWVzc2FnZS1EaWdlc3QgQWxnb3JpdGhtLgotCi1UaGUgY2hlY2tzdW1zIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGUgaW50ZWdyaXR5IG9mIHRoaXMgZGF0YSB1c2luZyB0aGUKLSJtZDVzdW0iIHRvb2wgKHdoaWNoIGlzIHBhcnQgb2YgdGhlIEdOVSAidGV4dHV0aWxzIiBwYWNrYWdlKSBieSBydW5uaW5nOgotCi0gICUgbWQ1c3VtIC0tY2hlY2sgQVJNX01BTklGRVNUXzk3NDE0LlRYVAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vQVJNX01BTklGRVNULlRYVCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9BUk1fTUFOSUZFU1QuVFhUCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzEwZjY3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9BUk1fTUFOSUZFU1QuVFhUCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvCi0JCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvCi1lMDQ5NzkxY2ZhYjYwNjBhMDhjYmFjN2IzYWQ3NjdkNiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fcy5oCi1lZDc5OGZhY2UyNTQ5N2IyNzAzZWRlNzM2ZDZkNTJiNiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL29teHR5cGVzX3MuaAotNGVlYmQ2M2FmMDg3Mzc2ODExZDY3NDlmMDY0NmI4NjQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX0JpdERlY19zLmgKLTQzY2Y0NmMyY2YyZmUxZjkzYzYxNWI1N2JjYmU0ODA5ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTS5oCi04ZjI0OGNlYWFjOGY2MDJlMjc3YTUyMWI2NzlkY2JiZSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fSURDVFRhYmxlLmgKLThhYzVmYTgwZWE5OGUzOTFmNTczMGEzNzUyODBiNWJkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9WZXJzaW9uLmgKLTNhMmY0MjBkZGY2YTFiOTUwNDcwYmQwZjVlYmQ1YzYyICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9JRENUX3MuaAotNTExYzBiYjUzNGZlMjIzNTk5ZTJjODRlZmYyNGM5ZWQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oCi04OTcxOTMyZDU2ZWVkNmIxYWQxYmE1MDdmMGJmZjVmMCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fQml0c3RyZWFtLmgKLWY4N2ZlZGQ5Y2E0MzJmZWZhNzU3MDA4MTc2ODY0ZWY4ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtT01YLmgKLThlNDk4OTlhNDI4ODIyYzM2ZWY5ZGQ5NGUwZTA1ZjE4ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvb214dHlwZXMuaAotMzIzMDA4YjcyZTlmMDQwOTlhOGNiNDJlOTlhMWZhY2UgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2J1aWxkX3ZjLnBsCi1lNzJkOTZjMGE0MTU0NTk3NDhkZjk4MDdmM2RhZTcyZiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvZmlsZWxpc3RfdmMudHh0Ci0JCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9zcmMvCi01ZWVhZTY1OWEyOTQ3N2Y1YzUyMjk2ZDI0YWZmZmQzYyAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvc3JjL2FybUNPTU1fSURDVFRhYmxlLmMKLWQ2NGNkY2YzOGY3NzQ5ZGM3Zjc3NDY1ZTViN2QzNTZkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9zcmMvYXJtQ09NTV9NYXNrVGFibGUuYwotCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvCi0JCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC8KLQkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy8KLWU3ZTBjMzIwOTc4NTY0YTdjOWIyYzcyMzc0OWE5OGQ2ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCi00YWRjZDBkZjA4MTk5MGJkZmM0NzI5MDQxYTJhOTE1MiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYwotODUyZTA0MDQxNDI5NjVkYzFmM2FhN2YwMGVlNTEyN2IgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucwotNzA1NDE1MWM1YmZlYTZiNWU3NGZlZWU4NmIyZDdiMDEgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKLTVmNzIxM2E0ZjM3NjI3YjNjNThmNjI5NGJhNDc3ZTMwICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucwotMzJmZjRiOGJlNjJlMmYwZjNlNzY0YjgzYzFlNWUyZmQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCi1kMDY2ZTNjODFkODI2MTZmMzdlYzE4MTBlYTQ5ZTdiNyAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MucwotZmU2MjlhM2U5ZDU1Mzk1YTYwOThiZGYyNDMxYjVmMDIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucwotNWIxM2ZiOTU0Yjc2NzlkZTIwMDc2YmI2YTdmNGVlMWQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMKLTAxYmE2MGVmZjY2ZWE0OWE0ZjgzM2NlNjI3OWY4ZTJmICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKLWZhMTA3MmNmMWQxN2U5NjY2YzlmMWUyMTVmYTMwMmIxICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCi1kYjM4N2I5ZTY2ZDMyNzg3ZjQ3ZWY5Y2YwMzQ3ZGEyYSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMKLWVhNTM3ZTRlMmFkMDNhMTk0MDk4MTA1NWZhM2FjZTAxICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zCi0yOWE0MjgzODg1Yjk0NzNhMzU1MGE4MWVmZjI1NTlkMiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zCi0yZGRjYWY2MGE4ZWExZTZlNmI3NzczN2Y3NjhiZmI5ZCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5zCi1jMzAwMmFhZDU2MDBmODcyYjcwYTVkN2ZlMzkxNTg0NiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMKLWEyOTAwZjJjNDdmMWM2MWQyMGJkNmMxZWRhMzNkNmQ0ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5zCi1jOTIxZGY3MzM5N2EzMmM5NDdkYzk5NmJhNjg1ODU1MyAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLnMKLTM3NjllMTRmMmZjM2Y1MTRkMDI1ZmU2YWI3M2ZmNjdhICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5zCi1jMDI5ZDFjZWJlYTBhMDllMWQyMzVhMzdlMjE1NTAwMiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zCi0wNzZhMDMzZjgxNjE3NTBhNjg1NzU2ZjlmNTFmMDRjOSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMKLWM1YjVkMjI4NDI4MjJlNmU1ZTMxMDk0ODgyY2JlYjQ2ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5zCi1mNmJkZjZkOTE0YTRhMTQ3OWY1MjQ5NTFhMzQwOTg0NiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zCi1lYmViMDcxM2E5YjJlYTI1OTg2MzYwZWYyNjIxMzhjNCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucwotNzhlZDllYTIwMGZhYTdiZTY2NTQ0NWE3MTM4NTlhZjEgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKLWMyZDk5NWY3ODdiNmY0NGVmMTBjNzUxYzEyZDE5MzVmICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucwotNDBiZWQ2NzlhOWY2ZTBkM2VmZTIxNmI3ZDRhOWNmNDUgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5zCi00YTUyYjNlOWUyNjhiOGE4ZjA3ODI5YmY1MDBkMDNhZiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucwotMTEyNDlmOGE5OGM1ZDRiODRjYjU1NzViMGUzN2NhOWMgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucwotMjUxM2I2MDU1OWJhNzFhZTQ5NWM2MDUzZmI3NzlmYTkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLnMKLTJmYjFlZTE3YzM2ZTNjMTQ2OWMxNzBmNmRhYzExYmYxICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMKLWNjNGE2ZjMyZGIwYjcyYTkxZDNmMjc4ZjY4NTVkZjY5ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKLQkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL2FwaS8KLTZlNTMwZGRhYTdjMmI1N2ZmZTg4MTYyYzAyMGNiNjYyICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCi0JCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyLwotCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvCi1iZWM2ZGUzNDhiMTEzNDM4NDk4ODY3Yjg2OTAwMTYyMiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NsaXA4X3MucwotZGJhOTgyNGU5NTliMjFkNDAxY2FjOTI1ZTY4YTExYTYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXJfcy5zCi1kZmE3ZTViNTgwMjdiZTM1NDJkZGEwNTkzYjc3YjJkMyAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMKLTRmYmE0YzQzMWE3ODNhNzhhMmViNjQ5N2E5NGFjOTY3ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCi0zOTk5MTk2MTE3OWNhMDNiNjM4MWI2ZTY1M2IxZjE0YiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9ja19zLnMKLTFiMGIyOTkwYzI2NjlkZmI4N2NmNmI4MTA2MTFjMDFiICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKLTFjOWI4N2FiZjMyODNlOTU3ODE2YjM5MzdjNjgwNzAxICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMKLTRmZTFhZmNhNjU5YTkwNTVmYzExNzJlNThmNzhhNTA2ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKLTJlYTA2N2YwNDM2ZjkxYmExMzUxZWRhZjQxMWNiNGVhICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCi02Y2UzNjNhYWRjOWQ2NWMzMDhiNDBjY2E4OTAyZTRmNiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGtfcy5zCi1iZjIxMmY3ODY3NzJhZWQyYmM3MDVkMjJmZjRlNzRmNSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zCi0yOTNhNDhhNjQ4YTMwODU0NTZlNjY2NWJiNzM2NmZhZCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXJfcy5zCi0yYmI0N2VkOWM5ZTI1YzU3MDljNmQ5YjRhZDM5YTM4YSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSV9zLnMKLTQzN2RmYTIwNDUwODg1MGQ2MWQ0Yjg3MDkxNDQ2ZTlmICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zCi1iYzk3Nzg4OThkZDQxMTAxZGMwZmIwMTM5ZWFmODNjYyAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDX3MucwotZmMxOTFlZWFlNDNmOGNlNzM1ZGJkMzExY2M3YmNiOGQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zCi1hMGQ4NWY0ZjUxN2M5NDVhNGM5MzE3YWMwMjFmMmQwOCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zCi0zODYwMjBkZWU4YjcyNWM3ZmUyNTI2ZjFmYzIxMWQ3ZCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCi0JCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL2FwaS8KLTQ2MjRlN2M4MzhlMTBhMjQ5YWJjYzNkM2Y0ZjQwNzQ4ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKLTY1ZTEwNTdkMDRlMmNiODQ0NTU5ZGM5ZjZlMDk3OTVhICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCi0JCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9zcmMvCi1lNjI3YjMzNDZiMGRjOWFmZjE0NDQ2MDA1Y2UwZmE0MyAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvc3JjL2FybVZDX1ZlcnNpb24uYwotCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvYXBpLwotN2NhOTRiMWMzM2FjMDIxMWUxN2QzOGJhYWRkN2QxZGQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS9hcm1WQy5oCi0xMmNmNzU5NmVkYmJmNjA0OGI2MjZkMTVlOGQwZWQ0OCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvYXBpL29teFZDLmgKLTExNzI2ZTI4NmE4MTI1N2NiNDVmNTU0N2ZiNGQzNzRjICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvb214VkNfcy5oCi1hNWIyYWY2MDVjMzE5Y2QyNDkxMzE5ZTQzMDc0MTM3NyAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvYXBpL2FybVZDQ09NTV9zLmgKLQkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vCi0JCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy8KLTFmODExODdiNDg0ODdhOGVhNmRiYzMyNzY0OGUzZTRmICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2X3MucwotOTM2ZDNmMjAzOGE2Zjg2MTNlYzI1ZTUwY2M2MDFmZTggIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4X3MucwotOGY2NzA4YTI0OTEzMDk2MmUwYmM1YzA0NGFjNmRkOTMgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JX3MucwotYWFiNzcxMzQxNDQyOGU5NWRlMGJhNzk5YTI2NzliMzYgIEFSTV9ERUxJVkVSWV85NzQxNC5UWFQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5OTI4ODUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybUNPTU0uaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICAxMjI5MAotICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAgIAotICogRmlsZTogYXJtQ09NTS5oCi0gKiBCcmllZjogRGVjbGFyZXMgQ29tbW9uIEFQSXMvRGF0YSBUeXBlcyB1c2VkIGFjcm9zcyBPcGVuTUFYIEFQSSdzCi0gKgotICovCi0gCi0gIAotI2lmbmRlZiBfYXJtQ29tbW9uX0hfCi0jZGVmaW5lIF9hcm1Db21tb25fSF8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE9NWF9GMzIgUmU7IC8qKiBSZWFsIHBhcnQgKi8KLSAgT01YX0YzMiBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQotICAgICAgICAKLX0gT01YX0ZDMzI7IC8qKiBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGNvbXBsZXggbnVtYmVyICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE9NWF9GNjQgUmU7IC8qKiBSZWFsIHBhcnQgKi8KLSAgT01YX0Y2NCBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQotICAgICAgICAKLX0gT01YX0ZDNjQ7IC8qKiBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGNvbXBsZXggbnVtYmVyICovCi0KLQotLyogVXNlZCBieSBib3RoIElQIGFuZCBJQyBkb21haW5zIGZvciA4eDggSlBFRyBibG9ja3MuICovCi10eXBlZGVmIE9NWF9TMTYgQVJNX0JMT0NLOHg4WzY0XTsKLQotCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSNkZWZpbmUgIGFybVBJIChPTVhfRjY0KSgzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQ29tcGlsZXIgZXh0ZW5zaW9ucyAqLwotI2lmZGVmIEFSTV9ERUJVRwotLyogZGVidWcgdmVyc2lvbiAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jZGVmaW5lIGFybUVycm9yKHN0cikge3ByaW50Zigoc3RyKSk7IHByaW50ZigiXG4iKTsgZXhpdCgtMSk7fQotI2RlZmluZSBhcm1XYXJuKHN0cikge3ByaW50Zigoc3RyKSk7IHByaW50ZigiXG4iKTt9Ci0jZGVmaW5lIGFybUlnbm9yZShhKSAoKHZvaWQpYSkKLSNkZWZpbmUgYXJtQXNzZXJ0KGEpIGFzc2VydChhKQotI2Vsc2UgCi0vKiByZWxlYXNlIHZlcnNpb24gKi8KLSNkZWZpbmUgYXJtRXJyb3Ioc3RyKSAoKHZvaWQpIChzdHIpKQotI2RlZmluZSBhcm1XYXJuKHN0cikgICgodm9pZCkgKHN0cikpCi0jZGVmaW5lIGFybUlnbm9yZShhKSAgKCh2b2lkKSAoYSkpCi0jZGVmaW5lIGFybUFzc2VydChhKSAgKCh2b2lkKSAoYSkpCi0jZW5kaWYgLyogQVJNX0RFQlVHICovCi0KLS8qIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLwotCi0jZGVmaW5lIGFybU1pbihhLGIpICAgICAgICAgICAgICggKGEpID4gKGIpID8gIChiKTooYSkgKQotI2RlZmluZSBhcm1NYXgoYSxiKSAgICAgICAgICAgICAoIChhKSA+IChiKSA/ICAoYSk6KGIpICkKLSNkZWZpbmUgYXJtQWJzKGEpICAgICAgICAgICAgICAgKCAoYSkgPCAgMCAgPyAtKGEpOihhKSApCi0KLS8qIEFsaWdubWVudCBvcGVyYXRpb24gKi8KLQotI2RlZmluZSBhcm1BbGlnblRvQnl0ZXMoUHRyLE4pICAgICAgKFB0ciArICggKChOLShpbnRwdHJfdClQdHIpJihOLTEpKSAvIHNpemVvZigqUHRyKSApKQotI2RlZmluZSBhcm1BbGlnblRvMkJ5dGVzKFB0cikgICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciwyKQotI2RlZmluZSBhcm1BbGlnblRvNEJ5dGVzKFB0cikgICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciw0KQotI2RlZmluZSBhcm1BbGlnblRvOEJ5dGVzKFB0cikgICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciw4KQotI2RlZmluZSBhcm1BbGlnblRvMTZCeXRlcyhQdHIpICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciwxNikKLQotLyogRXJyb3IgYW5kIEFsaWdubWVudCBjaGVjayAqLwotCi0jZGVmaW5lIGFybVJldEFyZ0VycklmKGNvbmRpdGlvbiwgY29kZSkgIGlmKGNvbmRpdGlvbikgeyByZXR1cm4gKGNvZGUpOyB9Ci0jZGVmaW5lIGFybVJldERhdGFFcnJJZihjb25kaXRpb24sIGNvZGUpIGlmKGNvbmRpdGlvbikgeyByZXR1cm4gKGNvZGUpOyB9Ci0KLSNpZm5kZWYgQUxJR05NRU5UX0RPRVNOVF9NQVRURVIKLSNkZWZpbmUgYXJtSXNCeXRlQWxpZ25lZChQdHIsTikgICAgICgoKChpbnRwdHJfdCkoUHRyKSkgJSBOKT09MCkKLSNkZWZpbmUgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLE4pICAgICgoKChpbnRwdHJfdCkoUHRyKSkgJSBOKSE9MCkKLSNlbHNlCi0jZGVmaW5lIGFybUlzQnl0ZUFsaWduZWQoUHRyLE4pICAgICAoMSkKLSNkZWZpbmUgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLE4pICAgICgwKQotI2VuZGlmCi0KLSNkZWZpbmUgYXJtSXMyQnl0ZUFsaWduZWQoUHRyKSAgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDIpCi0jZGVmaW5lIGFybUlzNEJ5dGVBbGlnbmVkKFB0cikgICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciw0KQotI2RlZmluZSBhcm1JczhCeXRlQWxpZ25lZChQdHIpICAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsOCkKLSNkZWZpbmUgYXJtSXMxNkJ5dGVBbGlnbmVkKFB0cikgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDE2KQotCi0jZGVmaW5lIGFybU5vdDJCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsMikKLSNkZWZpbmUgYXJtTm90NEJ5dGVBbGlnbmVkKFB0cikgICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciw0KQotI2RlZmluZSBhcm1Ob3Q4Qnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDgpCi0jZGVmaW5lIGFybU5vdDE2Qnl0ZUFsaWduZWQoUHRyKSAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsMTYpCi0jZGVmaW5lIGFybU5vdDMyQnl0ZUFsaWduZWQoUHRyKSAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsMzIpCi0KLS8qKgotICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1MxNl9yZWYvYXJtUm91bmRGbG9hdFRvUzMyX3JlZi9hcm1Sb3VuZEZsb2F0VG9TNjQKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50L2ludCBhZnRlciByb3VuZGluZwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYvT01YX1MzMiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1MxNiBhcm1Sb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpOwotT01YX1MzMiBhcm1Sb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpOwotT01YX1M2NCBhcm1Sb3VuZEZsb2F0VG9TNjQgKE9NWF9GNjQgVmFsdWUpOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9TMTZfcmVmL2FybVNhdFJvdW5kRmxvYXRUb1MzMgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQvaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNi9PTVhfUzMyIGZvcm1hdAotICoKLSAqLwotCi1PTVhfUzE2IGFybVNhdFJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSk7Ci1PTVhfUzMyIGFybVNhdFJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1UxNl9yZWYvYXJtU2F0Um91bmRGbG9hdFRvVTMyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHVuc2lnbmVkIHNob3J0IGludC9pbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfVTE2L09NWF9VMzIgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9VMTYgYXJtU2F0Um91bmRGbG9hdFRvVTE2IChPTVhfRjY0IFZhbHVlKTsKLU9NWF9VMzIgYXJtU2F0Um91bmRGbG9hdFRvVTMyIChPTVhfRjY0IFZhbHVlKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2lnbkNoZWNrCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDaGVja3MgdGhlIHNpZ24gb2YgYSB2YXJpYWJsZToKLSAqIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQotICogcmV0dXJucyAwIGlmIGl0IGlzIDAKLSAqIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQkgICAgdmFyICAgICBWYXJpYWJsZSB0byBiZSBjaGVja2VkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX0lOVCAtLSAgIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQotICogICAgICAgICAgICAgIHJldHVybnMgMCBpZiBpdCBpcyAwCi0gKiAgICAgICAgICAgICAgcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKLSAqLyAKLSAKLU9NWF9JTlQgYXJtU2lnbkNoZWNrIChPTVhfUzE2IHZhcik7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUNsaXAKLSAqCi0gKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKLSAqIAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAotICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCi0gKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfUzMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCi0gKi8gCi0gCi1PTVhfUzMyIGFybUNsaXAgKAotICAgICAgICBPTVhfSU5UIG1pbiwKLSAgICAgICAgT01YX0lOVCBtYXgsIAotICAgICAgICBPTVhfUzMyIHNyYwotICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1DbGlwX0YzMgotICoKLSAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQotICogCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCi0gKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKLSAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9GMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKLSAqLyAKLSAKLU9NWF9GMzIgYXJtQ2xpcF9GMzIgKAotICAgICAgICBPTVhfRjMyIG1pbiwKLSAgICAgICAgT01YX0YzMiBtYXgsIAotICAgICAgICBPTVhfRjMyIHNyYwotICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TaGlmdFNhdF9GMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjogRGl2aWRlcyBhIGZsb2F0IHZhbHVlIGJ5IDJec2hpZnQgYW5kIAotICogc2F0dXJhdGVzIGl0IGZvciB1bnNpZ25lZCB2YWx1ZSByYW5nZSBmb3Igc2F0Qml0cy4KLSAqIFNlY29uZCBwYXJhbWV0ZXIgaXMgbGlrZSAic2hpZnRpbmciIHRoZSBjb3JyZXNwb25kaW5nIAotICogaW50ZWdlciB2YWx1ZS4gVGFrZXMgY2FyZSBvZiByb3VuZGluZyB3aGlsZSBjbGlwcGluZyB0aGUgZmluYWwgCi0gKiB2YWx1ZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSB2ICAgICAgICAgIE51bWJlciB0byBiZSBvcGVyYXRlZCB1cG9uCi0gKiBbaW5dIHNoaWZ0ICAgICAgRGl2aWRlcyB0aGUgaW5wdXQgInYiIGJ5ICIyXnNoaWZ0IgotICogW2luXSBzYXRCaXRzICAgIEZpbmFsIHJhbmdlIGlzIFswLCAyXnNhdEJpdHMpCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1MzMiAtLSAgIHJldHVybnMgInNoaWZ0ZWQiIHNhdHVyYXRlZCB2YWx1ZQotICovIAotIAotT01YX1UzMiBhcm1TaGlmdFNhdF9GMzIoCi0gICAgICAgIE9NWF9GMzIgdiwgCi0gICAgICAgIE9NWF9JTlQgc2hpZnQsIAotICAgICAgICBPTVhfSU5UIHNhdEJpdHMKLSAgICAgICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbnM6IGFybVN3YXBFbGVtCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHN3YXBzIHR3byBlbGVtZW50cyBhdCB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgbG9jYXRpb25zLgotICogVGhlIHNpemUgb2YgZWFjaCBlbGVtZW50IGNvdWxkIGJlIGFueXRoaW5nIGFzIHNwZWNpZmllZCBieSA8ZWxlbVNpemU+Ci0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YUmVzdWx0IC0tIEVycm9yIHN0YXR1cyBmcm9tIHRoZSBmdW5jdGlvbgotICovCi1PTVhSZXN1bHQgYXJtU3dhcEVsZW0oT01YX1U4ICpwQnVmMSwgT01YX1U4ICpwQnVmMiwgT01YX0lOVCBlbGVtU2l6ZSk7Ci0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtTWVkaWFuT2YzCi0gKgotICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBtZWRpYW4gb2YgdGhyZWUgbnVtYmVycwotICogCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIGZFbnRyeSAgICAgRmlyc3QgZW50cnkKLSAqIFtpbl0gc0VudHJ5ICAgICBzZWNvbmQgZW50cnkKLSAqIFtpbl0gdEVudHJ5ICAgICBUaGlyZCBlbnRyeQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TMzIgLS0gICByZXR1cm5zIHRoZSBtZWRpYW4gdmFsdWUKLSAqLyAKLSAKLU9NWF9TMzIgYXJtTWVkaWFuT2YzICgKLSAgICBPTVhfUzMyIGZFbnRyeSwKLSAgICBPTVhfUzMyIHNFbnRyeSwgCi0gICAgT01YX1MzMiB0RW50cnkgCi0gICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtTG9nU2l6ZQotICoKLSAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgc2l6ZSBvZiBhIHBvc2l0aXZlIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBzYW1lCi0gKiAKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gdmFsdWUgICAgUG9zaXRpdmUgdmFsdWUKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfVTggLS0gICByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBwb3NpdGl2ZSB2YWx1ZQotICovIAotIAotT01YX1U4IGFybUxvZ1NpemUgKAotICAgIE9NWF9VMTYgdmFsdWUgCi0gICAgKTsgICAgCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAvKiBTYXR1cmF0aW5nIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqIAotICogICAgCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0QWRkX1MzMigKLSAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMSwKLSAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMgotICAgICAgICAgICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdEFkZF9TNjQoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogCi0gKiAgICAKLSAqKi8KLQotT01YX1M2NCBhcm1TYXRBZGRfUzY0KAotICAgICAgICAgICAgICAgIE9NWF9TNjQgVmFsdWUxLAotICAgICAgICAgICAgICAgIE9NWF9TNjQgVmFsdWUyCi0gICAgICAgICAgICAgICAgKTsKLQotLyoqIEZ1bmN0aW9uIDphcm1TYXRTdWJfUzMyKCkKLSAqIAotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgc3Vic3RyYWN0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAotICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAKLSAqKi8KLQotT01YX1MzMiBhcm1TYXRTdWJfUzMyKAotICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMSwKLSAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZTIKLSAgICAgICAgICAgICAgICAgICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBNdWx0aXBsaWNhdGlvbiBvZiBWYWx1ZTEgYW5kIFZhbHVlMiBhbmQgc3ViZXNxdWVudCBzYXR1cmF0ZWQKLSAqICAgICBhY2N1bXVsYXRpb24gd2l0aCBNYWMKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICogW2luXSBNYWMgICAgICAgICAgQWNjdW11bGF0b3IKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0TWFjX1MzMigKLSAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBNYWMsCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgVmFsdWUxLAotICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IFZhbHVlMgotICAgICAgICAgICAgICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzE2UzMyX1MzMgotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBNQUMgb3BlcmF0aW9uIG9mIHRoZSB0aHJlZSBpbnB1dHMgZGVsYXlFbGVtLCBmaWxUYXAgLCBtYWMKLSAqCi0gKiAgIG1hYyA9IG1hYyArIFNhdHVyYXRlX2luXzMyQml0cyhkZWxheUVsZW0gKiBmaWxUYXApCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBkZWxheUVsZW0gICAgRmlyc3QgMzIgYml0IE9wZXJhbmQKLSAqIFtpbl0gZmlsVGFwICAgICAgIFNlY29uZCAxNiBiaXQgT3BlcmFuZAotICogW2luXSBtYWMgICAgICAgICAgUmVzdWx0IG9mIE1BQyBvcGVyYXRpb24KLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgbWFjICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TMzIgYXJtU2F0TWFjX1MxNlMzMl9TMzIoCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIG1hYywgCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGRlbGF5RWxlbSwgCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IGZpbFRhcCApOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNgotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJvdW5kZWQgcmlnaHQgc2hpZnQgb3BlcmF0aW9uIG9mIGlucHV0IGJ5IHRoZSBzY2FsZWZhY3RvcgotICoKLSAqICAgb3V0cHV0ID0gU2F0dXJhdGVfaW5fMTZCaXRzKCAoIFJpZ2h0U2hpZnQoIChSb3VuZChpbnB1dCkgLCBzY2FsZUZhY3RvciApICkKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIGlucHV0ICAgICAgIFRoZSBpbnB1dCB0byBiZSBvcGVyYXRlZCBvbgotICogW2luXSBzY2FsZUZhY3RvciBUaGUgc2hpZnQgbnVtYmVyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLQotCi1PTVhfUzE2IGFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2KAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU5UIHNjYWxlRmFjdG9yKTsKLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKLSAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCi0gKiBbaW5dIHNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLSAKLU9NWF9TMzIgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTlQgc2hpZnQKLSAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NCgpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0Ci0gKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAotICogW2luXSBzaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0gCi1PTVhfUzY0IGFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TNjQgVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU5UIHNoaWZ0Ci0gICAgICAgICAgICAgICAgICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMTZTMzJfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzE2IGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQotICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQotICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0KLQotT01YX1MzMiBhcm1TYXRNdWxTMTZTMzJfUzMyKAotICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IGlucHV0MSwKLSAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dDIpOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMzJTMzJfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzMyIGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQotICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQotICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0TXVsUzMyUzMyX1MzMigKLSAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dDEsCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgaW5wdXQyKTsKLQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1JbnREaXZBd2F5RnJvbVplcm8oKQotICoKLSAqIERlc2NyaXB0aW9uIDogSW50ZWdlciBkaXZpc2lvbiB3aXRoIHJvdW5kaW5nIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuIAotICogICAgICAgICAgICAgICBIYWxmLWludGVnZXIgdmFsdWVzIGFyZSByb3VuZGVkIGF3YXkgZnJvbSB6ZXJvCi0gKiAgICAgICAgICAgICAgIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLiBGb3IgZXhhbXBsZSAzLy8yIGlzIHJvdW5kZWQgCi0gKiAgICAgICAgICAgICAgIHRvIDIsIGFuZCAtMy8vMiBpcyByb3VuZGVkIHRvIC0yLgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gTnVtICAgICAgICBPcGVyYW5kIDEKLSAqIFtpbl0gRGVubyAgICAgICBPcGVyYW5kIDIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uIGlucHV0MS8vaW5wdXQyCi0gKiAgICAKLSAqKi8KLQotT01YX1MzMiBhcm1JbnREaXZBd2F5RnJvbVplcm8gKE9NWF9TMzIgTnVtLCBPTVhfUzMyIERlbm8pOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBEZWJ1Z2dpbmcgbWFjcm9zCi0gKgotICovCi0KLQotLyoKLSAqIERlZmluaXRpb24gb2Ygb3V0cHV0IHN0cmVhbSAtIGNoYW5nZSB0byBzdGRlcnIgaWYgbmVjZXNzYXJ5Ci0gKi8KLSNkZWZpbmUgREVCVUdfU1RSRUFNIHN0ZG91dAotCi0vKgotICogRGVidWcgcHJpbnRmIG1hY3Jvcywgb25lIGZvciBlYWNoIGFyZ3VtZW50IGNvdW50LgotICogQWRkIG1vcmUgaWYgbmVlZGVkLgotICovCi0jaWZkZWYgREVCVUdfT04KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jZGVmaW5lIERFQlVHX1BSSU5URl8wKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSkKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEoYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiKQotI2RlZmluZSBERUJVR19QUklOVEZfMihhLCBiLCBjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMpCi0jZGVmaW5lIERFQlVHX1BSSU5URl8zKGEsIGIsIGMsIGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCkKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzQoYSwgYiwgYywgZCwgZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlKQotI2RlZmluZSBERUJVR19QUklOVEZfNShhLCBiLCBjLCBkLCBlLCBmKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYpCi0jZGVmaW5lIERFQlVHX1BSSU5URl82KGEsIGIsIGMsIGQsIGUsIGYsIGcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZykKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzcoYSwgYiwgYywgZCwgZSwgZiwgZywgaCkgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKQotI2RlZmluZSBERUJVR19QUklOVEZfOChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpKSAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGkpCi0jZGVmaW5lIERFQlVHX1BSSU5URl85KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGopICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaikKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEwKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGspICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrKQotI2RlZmluZSBERUJVR19QUklOVEZfMTEoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCkgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwpCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xMihhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtKSAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSkKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEzKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4pICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuKQotI2RlZmluZSBERUJVR19QUklOVEZfMTQoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbiwgbykgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4sIG8pCi0jZWxzZSAvKiBERUJVR19PTiAqLwotI2RlZmluZSBERUJVR19QUklOVEZfMChhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEoYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8yKGEsIGIsIGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMyhhLCBiLCBjLCBkKSAgICAgICAgICAgICAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzQoYSwgYiwgYywgZCwgZSkgICAgICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl81KGEsIGIsIGMsIGQsIGUsIGYpICAgICAgICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfNihhLCBiLCBjLCBkLCBlLCBmLCBnKSAgICAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzcoYSwgYiwgYywgZCwgZSwgZiwgZywgaCkgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl84KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGkpICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfOShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqKSAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEwKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGspICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMTEoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCkgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xMihhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtKSAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzEzKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4pICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xNChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvKSAgIAotI2VuZGlmIC8qIERFQlVHX09OICovCi0KLQotLyoKLSAqIERvbWFpbiBhbmQgc3ViIGRvbWFpbiBkZWZpbml0aW9ucwotICoKLSAqIEluIG9yZGVyIHRvIHR1cm4gb24gZGVidWcgZm9yIGFuIGVudGlyZSBkb21haW4gb3Igc3ViLWRvbWFpbgotICogYXQgY29tcGlsZSB0aW1lLCBvbmUgb2YgdGhlIERFQlVHX0RPTUFJTl8qIGJlbG93IG1heSBiZSBkZWZpbmVkLAotICogd2hpY2ggd2lsbCBhY3RpdmF0ZSBkZWJ1ZyBpbiBhbGwgb2YgdGhlIGRlZmluZXMgaXQgY29udGFpbnMuCi0gKi8KLQotI2lmZGVmIERFQlVHX0RPTUFJTl9BQwotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVDSEFOUEFJUkVMVF9NUEVHNAotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVDSEFOUEFJUkVMVAotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVEQVRTVFJFTFQKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFRklMTEVMVAotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVJU1NURVJFT19TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFTVNQTlNfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERU1TU1RFUkVPX1MzMl9JCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERVBSR0NGR0VMVAotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVUTlNfUzMyX0kKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVJTlRFUkxFQVZFU1BFQ1RSVU1fUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0VOQ09ERVROU19TMzJfSQotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19MT05HVEVSTVBSRURJQ1RfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0xPTkdURVJNUkVDT05TVFJVQ1RfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX01EQ1RGV0RfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX01EQ1RJTlZfUzMyX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19OT0lTRUxFU1NERUNPREUKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfUVVBTlRJTlZfUzMyX0kKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfVU5QQUNLQURJRkhFQURFUgotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19VTlBBQ0tBRFRTRlJBTUVIRUFERVIKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfSFVGRk1BTkRFQ09ERVNGQk1CUF9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfSFVGRk1BTkRFQ09ERVNGQl9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfSFVGRk1BTkRFQ09ERV9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfTURDVElOVl9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfUkVRVUFOVElaRVNGQl9TMzJfSQotI2RlZmluZSBERUJVR19PTVhBQ01QM19SRVFVQU5USVpFX1MzMl9JCi0jZGVmaW5lIERFQlVHX09NWEFDTVAzX1NZTlRIUFFNRl9TMzJfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDTVAzX1VOUEFDS0ZSQU1FSEVBREVSCi0jZGVmaW5lIERFQlVHX09NWEFDTVAzX1VOUEFDS1NDQUxFRkFDVE9SU19TOAotI2RlZmluZSBERUJVR19PTVhBQ01QM19VTlBBQ0tTSURFSU5GTwotI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9BQyAqLwotCi0KLSNpZmRlZiBERUJVR19ET01BSU5fVkMKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9BVkVSQUdFXzE2WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0FWRVJBR0VfNFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9BVkVSQUdFXzhYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVCTE9DS0NIUk9NQV9VOF9DMUlSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVCTE9DS0xVTUFfVThfQzFJUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQ09ERUNIUk9NQURDQ09FRkZTVE9QQUlSQ0FWTENfVTgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUNPREVDT0VGRlNUT1BBSVJDQVZMQ19VOAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFUVVBTlRUUkFOU0ZPUk1BQ0ZST01QQUlSX1U4X1MxNl9DMV9ETFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9FWFBBTkRGUkFNRQotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdDSFJPTUFfSE9SRURHRV9VOF9DMUlSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0NIUk9NQV9WRVJFREdFX1U4X0MxSVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HTFVNQV9IT1JFREdFX1U4X0MxSVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HTFVNQV9WRVJFREdFX1U4X0MxSVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9QUkVESUNUSU5UUkFDSFJPTUE4WDhfVThfQzFSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfUFJFRElDVElOVFJBXzE2WDE2X1U4X0MxUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1BSRURJQ1RJTlRSQV80WDRfVThfQzFSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEUVVBUl8xNlgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURRVUFSXzRYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEUVVBUl84WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRF8xNlgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURfNFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURfOFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQVREXzRYNAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STURFUVVBTlRDSFJPTUFEQ0ZST01QQUlSX1U4X1MxNl9DMQotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STURFUVVBTlRMVU1BRENGUk9NUEFJUl9VOF9TMTZfQzEKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9UUkFOU0ZPUk1RVUFOVF9DSFJPTUFEQwotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STVFVQU5UX0xVTUFEQwotI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9IQUxGXzE2WDE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0hBTEZfOFg4Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0lOVEVHRVJfMTZYMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSU5URUdFUl84WDgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0NPTVBVVEVURVhUVVJFRVJST1JCTE9DS19TQURfVThfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9DT01QVVRFVEVYVFVSRUVSUk9SQkxPQ0tfVThfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9EQ1Q4WDhCTEtETFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERUJMT0NLQ09FRl9JTlRFUl9TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVBBRE1WX1BWT1AKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVZMQ1pJR1pBR19JTlRFUl9TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVZMQ1pJR1pBR19JTlRSQUFDVkxDX1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFVkxDWklHWkFHX0lOVFJBRENWTENfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVNVl9VOF9TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERVZMQ1pJR1pBR19JTlRFUl9TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERVZMQ1pJR1pBR19JTlRSQUFDVkxDX1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFVkxDWklHWkFHX0lOVFJBRENWTENfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9GSU5ETVZQUkVECi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9JRENUOFg4QkxLRExYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9MSU1JVE1WVE9SRUNUCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9NT1RJT05FU1RJTUFUSU9OTUIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1CR1JBWV9VOAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETUJIT1JJWk9OVEFMX1U4Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNQlZFUlRJQ0FMX1U4Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNVgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlRFUl9TMTZfSQotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlRSQV9TMTZfSQotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlZJTlRFUl9TMTZfSQotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUVVBTlRJTlZJTlRSQV9TMTZfSQotI2RlZmluZSBERUJVR19PTVhWQ000UDJfVFJBTlNSRUNCTE9DS0NFT0ZfSU5URVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1RSQU5TUkVDQkxPQ0tDRU9GX0lOVFJBCi0jZW5kaWYgLyogREVCVUdfRE9NQUlOX1ZDICovCi0KLQotI2lmZGVmIERFQlVHX0RPTUFJTl9JQwotLyogVG8gYmUgZmlsbGVkIGluICovCi0jZW5kaWYgLyogREVCVUdfRE9NQUlOX0lDICovCi0KLQotI2lmZGVmIERFQlVHX0RPTUFJTl9TUAotI2RlZmluZSBERUJVR19PTVhBQ1NQX0RPVFBST0RfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfQkxPQ0tFWFBfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfQkxPQ0tFWFBfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfQ09QWV9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9ET1RQUk9EX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0RPVFBST0RfUzE2X1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9DVE9DX1NDMTZfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX0NUT0NfU0MzMl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfUlRPQ0NTX1MxNlMzMl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfUlRPQ0NTX1MzMl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX0NfU0MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfQ19TQzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9SX1MxNl9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX1JfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9DX1NDMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX0NfU0MzMgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfUl9TMTZfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9SX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DQ1NUT1JfUzMyUzE2X1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DQ1NUT1JfUzMyX1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DVE9DX1NDMTZfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NUT0NfU0MzMl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSUxURVJNRURJQU5fUzMyX0kKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSUxURVJNRURJQU5fUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTZfSVNGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2X1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2X0lTRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfQklRVUFERElSRUNUX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlST05FX0JJUVVBRERJUkVDVF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfRElSRUNUX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlST05FX0RJUkVDVF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfQklRVUFERElSRUNUX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlSX0JJUVVBRERJUkVDVF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfRElSRUNUX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlSX0RJUkVDVF9TMTYKLSNlbmRpZiAvKiBERUJVR19ET01BSU5fU1AgKi8KLQotCi0jaWZkZWYgREVCVUdfRE9NQUlOX0lQCi0jZGVmaW5lIERFQlVHX09NWElQQk1fQUREQ19VOF9DMVJfU0ZTCi0jZGVmaW5lIERFQlVHX09NWElQQk1fQ09QWV9VOF9DMVIKLSNkZWZpbmUgREVCVUdfT01YSVBCTV9DT1BZX1U4X0MzUgotI2RlZmluZSBERUJVR19PTVhJUEJNX01JUlJPUl9VOF9DMVIKLSNkZWZpbmUgREVCVUdfT01YSVBCTV9NVUxDX1U4X0MxUl9TRlMKLSNkZWZpbmUgREVCVUdfT01YSVBDU19DT0xPUlRXSVNUUTE0X1U4X0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1JHQjU2NVRPWUNCQ1I0MjBMU19NQ1VfVTE2X1MxNl9DM1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1JHQjU2NVRPWUNCQ1I0MjJMU19NQ1VfVTE2X1MxNl9DM1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1JHQjU2NVRPWUNCQ1I0NDRMU19NQ1VfVTE2X1MxNl9DM1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1JHQlRPWUNCQ1I0MjBMU19NQ1VfVThfUzE2X0MzUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCVE9ZQ0JDUjQyMkxTX01DVV9VOF9TMTZfQzNQM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19SR0JUT1lDQkNSNDQ0TFNfTUNVX1U4X1MxNl9DM1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwUlNaUk9UX1U4X1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwVE9SR0I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwVE9SR0I1NjVfVThfVTE2X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBUT1JHQkxTX01DVV9TMTZfVThfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlJTWkNTQ1JPVFJHQl9VOF9DMlIKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlJTWlJPVF9VOF9QM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCNTY1X1U4X1UxNl9DMkMzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0JMU19NQ1VfUzE2X1U4X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQl9VOF9DMkMzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9ZQ0JDUjQyMFJPVEFURV9VOF9DMlAzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9ZQ0JDUjQyMFJPVEFURV9VOF9QM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQ0NFRPUkdCNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQ0NFRPUkdCTFNfTUNVX1MxNl9VOF9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSVE9SR0I1NjVfVThfVTE2X0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSVE9SR0I1NjVfVThfVTE2X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1JUT1JHQl9VOF9DM1IKLSNkZWZpbmUgREVCVUdfT01YSVBQUF9HRVRDRU5UUkFMTU9NRU5UX1M2NAotI2RlZmluZSBERUJVR19PTVhJUFBQX0dFVFNQQVRJQUxNT01FTlRfUzY0Ci0jZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5UR0VUU1RBVEVTSVpFX1M2NAotI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVElOSVRfUzY0Ci0jZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5UUzY0U19VOF9DMVIKLSNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRTNjRTX1U4X0MzUgotI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9JUCAqLwotCi0KLSNlbmRpZiAvKiBfYXJtQ29tbW9uX0hfICovCi0KLS8qRW5kIG9mIEZpbGUqLwotCi0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fQml0RGVjX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9CaXREZWNfcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjM0NGUzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9CaXREZWNfcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjg0ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1DT01NX0JpdERlY19zLmgKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vIAotOy8vIE9wZW5NQVggb3B0aW1pemVkIGJpdHN0cmVhbSBkZWNvZGUgbW9kdWxlCi07Ly8KLTsvLyBZb3UgbXVzdCBpbmNsdWRlIGFybUNPTU1fcy5oIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBmaWxlCi07Ly8KLTsvLyBUaGlzIG1vZHVsZSBwcm92aWRlcyBtYWNyb3MgdG8gcGVyZm9ybSBhc3NlbWJseSBvcHRpbWl6ZWQgZml4ZWQgYW5kCi07Ly8gdmFyaWFibGUgbGVuZ3RoIGRlY29kaW5nIGZyb20gYSByZWFkLW9ubHkgYml0c3RyZWFtLiBUaGUgdmFyaWFibGUKLTsvLyBsZW5ndGggZGVjb2RlIG1vZHVsZXMgdGFrZSBhcyBpbnB1dCBhIHBvaW50ZXIgdG8gYSB0YWJsZSBvZiAxNi1iaXQKLTsvLyBlbnRyaWVzIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0LgotOy8vCi07Ly8gVkxEIFRhYmxlIEVudHJ5IGZvcm1hdAotOy8vCi07Ly8gICAgICAgIDE1IDE0IDEzIDEyIDExIDEwIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyIDAxIDAwCi07Ly8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLTsvLyAgICAgICB8ICBMZW4gICB8ICAgICAgICAgICAgICAgU3ltYm9sICAgICAgICAgICAgICB8IDEgfAotOy8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi07Ly8gICAgICAgfCAgICAgICAgICAgICAgICBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgfCAwIHwKLTsvLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotOy8vCi07Ly8gSWYgdGhlIHRhYmxlIGVudHJ5IGlzIGEgbGVhZiBlbnRyeSB0aGVuIGJpdCAwIHNldDoKLTsvLyAgICBMZW4gICAgPSBOdW1iZXIgb2YgYml0cyBvdmVycmVhZCAoMCB0byA3KQotOy8vICAgIFN5bWJvbCA9IFN5bWJvbCBwYXlsb2FkICh1bnNpZ25lZCAxMiBiaXRzKQotOy8vCi07Ly8gSWYgdGhlIHRhYmxlIGVudHJ5IGlzIGFuIGludGVybmFsIG5vZGUgdGhlbiBiaXQgMCBpcyBjbGVhcjoKLTsvLyAgICBPZmZzZXQgPSBOdW1iZXIgb2YgKDE2LWJpdCkgaGFsZiB3b3JkcyBmcm9tIHRoZSB0YWJsZQotOy8vICAgICAgICAgICAgIHN0YXJ0IHRvIHRoZSBuZXh0IHRhYmxlIG5vZGUKLTsvLwotOy8vIFRoZSB0YWJsZSBpcyBhY2Nlc3NlZCBieSBzdWNjZXNzaXZlIGxvb2t1cCB1cCBvbiB0aGUKLTsvLyBuZXh0IFN0ZXAgYml0cyBvZiB0aGUgaW5wdXQgYml0c3RyZWFtIHVudGlsIGEgbGVhZiBub2RlCi07Ly8gaXMgb2J0YWluZWQuIFRoZSBTdGVwIHNpemVzIGFyZSBzdXBwbGllZCB0byB0aGUgVkxEIG1hY3JvLgotOy8vCi07Ly8gVVNBR0U6Ci07Ly8KLTsvLyBUbyB1c2UgYW55IG9mIHRoZSBtYWNyb3MgaW4gdGhpcyBwYWNrYWdlLCBmaXJzdCBjYWxsOgotOy8vCi07Ly8gICAgTV9CRF9JTklUIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQsIFRtcAotOy8vCi07Ly8gVGhpcyBjYWNoZXMgdGhlIGN1cnJlbnQgYml0c3RyZWFtIHBvc2l0aW9uIGFuZCBuZXh0IGF2YWlsYWJsZQotOy8vIGJpdHMgaW4gcmVnaXN0ZXJzIHBCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudC4gVGhlc2UgcmVnaXN0ZXJzCi07Ly8gYXJlIHJlc2VydmVkIGZvciB1c2UgYnkgdGhlIGJpdHN0cmVhbSBkZWNvZGUgcGFja2FnZSB1bnRpbCB5b3UKLTsvLyBjYWxsIE1fQkRfRklOSS4KLTsvLwotOy8vIE5leHQgY2FsbCB0aGUgZm9sbG93aW5nIG1hY3JvKHMpIGFzIG1hbnkgdGltZXMgYXMgeW91IG5lZWQ6Ci07Ly8KLTsvLyAgICBNX0JEX0xPT0s4ICAgICAgIC0gTG9vayBhaGVhZCBjb25zdGFudCAxPD1OPD04ICBiaXRzIGludG8gdGhlIGJpdHN0cmVhbQotOy8vICAgIE1fQkRfTE9PSzE2ICAgICAgLSBMb29rIGFoZWFkIGNvbnN0YW50IDE8PU48PTE2IGJpdHMgaW50byB0aGUgYml0c3RyZWFtCi07Ly8gICAgTV9CRF9SRUFEOCAgICAgICAtIFJlYWQgY29uc3RhbnQgMTw9Tjw9OCAgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KLTsvLyAgICBNX0JEX1JFQUQxNiAgICAgIC0gUmVhZCBjb25zdGFudCAxPD1OPD0xNiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQotOy8vICAgIE1fQkRfVlJFQUQ4ICAgICAgLSBSZWFkIHZhcmlhYmxlIDE8PU48PTggIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCi07Ly8gICAgTV9CRF9WUkVBRDE2ICAgICAtIFJlYWQgdmFyaWFibGUgMTw9Tjw9MTYgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KLTsvLyAgICBNX0JEX1ZMRCAgICAgICAgIC0gUGVyZm9ybSB2YXJpYWJsZSBsZW5ndGggZGVjb2RlIHVzaW5nIGxvb2t1cCB0YWJsZQotOy8vCi07Ly8gRmluYWxseSBjYWxsIHRoZSBtYWNybzoKLTsvLwotOy8vICAgIE1fQkRfRklOSSBwcEJpdFN0cmVhbSwgcEJpdE9mZnNldAotOy8vCi07Ly8gVGhpcyB3cml0ZXMgdGhlIGJpdHN0cmVhbSBzdGF0ZSBiYWNrIHRvIG1lbW9yeS4KLTsvLwotOy8vIFRoZSB0aHJlZSBiaXRzdHJlYW0gY2FjaGUgcmVnaXN0ZXIgbmFtZXMgYXJlIGFzc2lnbmVkIHRvIHRoZSBmb2xsb3dpbmcgZ2xvYmFsCi07Ly8gdmFyaWFibGVzOgotOy8vCi0KLSAgICAgICAgR0JMUyAgICBwQml0U3RyZWFtICA7Ly8gUmVnaXN0ZXIgbmFtZSBmb3IgcEJpdFN0cmVhbQotICAgICAgICBHQkxTICAgIEJpdEJ1ZmZlciAgIDsvLyBSZWdpc3RlciBuYW1lIGZvciBCaXRCdWZmZXIKLSAgICAgICAgR0JMUyAgICBCaXRDb3VudCAgICA7Ly8gUmVnaXN0ZXIgbmFtZSBmb3IgQml0Q291bnQKLSAgIAotOy8vICAgICAgICAKLTsvLyBUaGVzZSByZWdpc3RlciB2YXJpYWJsZXMgbXVzdCBoYXZlIGEgY2VydGFpbiBkZWZpbmVkIHN0YXRlIG9uIGVudHJ5IHRvIGV2ZXJ5IGJpdHN0cmVhbQotOy8vIG1hY3JvIChleGNlcHQgTV9CRF9JTklUKSBhbmQgb24gZXhpdCBmcm9tIGV2ZXJ5IGJpdHN0cmVhbSBtYWNybyAoZXhjZXB0IE1fQkRfRklOSSkuCi07Ly8gVGhlIHN0YXRlIG1heSBkZXBlbmQgb24gaW1wbGVtZW50YXRpb24uCi07Ly8KLTsvLyBGb3IgdGhlIGRlZmF1bHQgKEFSTTExKSBpbXBsZW1lbnRhdGlvbiB0aGUgZm9sbG93aW5nIGhvbGQ6Ci07Ly8gICAgcEJpdFN0cmVhbSAtIHBvaW50cyB0byB0aGUgZmlyc3QgYnl0ZSBub3QgaGVsZCBpbiB0aGUgQml0QnVmZmVyCi07Ly8gICAgQml0QnVmZmVyICAtIGlzIGEgY2FjaGUgb2YgKDQgYnl0ZXMpIDMyIGJpdHMsIGJpdCAzMSB0aGUgZmlyc3QgYml0Ci07Ly8gICAgQml0Q291bnQgICAtIGlzIG9mZnNldCAoZnJvbSB0aGUgdG9wIGJpdCkgdG8gdGhlIG5leHQgdW51c2VkIGJpdHN0cmVhbSBiaXQKLTsvLyAgICAwPD1CaXRDb3VudDw9MTUgKHNvIEJpdEJ1ZmZlciBob2xkcyBhdCBsZWFzdCAxNyB1bnVzZWQgYml0cykKLTsvLwotOy8vCi0KLSAgICAgICAgOy8vIEJpdHN0cmVhbSBEZWNvZGUgaW5pdGlhbGlzZQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIEluaXRpYWxpc2VzIHRoZSBiaXRzdHJlYW0gZGVjb2RlIGdsb2JhbCByZWdpc3RlcnMgZnJvbQotICAgICAgICA7Ly8gYml0c3RyZWFtIHBvaW50ZXJzLiBUaGlzIG1hY3JvIGlzIHNwbGl0IGludG8gMyBwYXJ0cyB0byBlbmFibGUKLSAgICAgICAgOy8vIHNjaGVkdWxpbmcuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRwcEJpdFN0cmVhbSAgICAtIHBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgbmV4dCBiaXRzdHJlYW0gYnl0ZQotICAgICAgICA7Ly8gJHBCaXRPZmZzZXQgICAgIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJpdHMgdXNlZCBpbiB0aGUgY3VycmVudCBieXRlICgwLi43KQotICAgICAgICA7Ly8gJFJCaXRTdHJlYW0gICAgIC0gcmVnaXN0ZXIgdG8gdXNlIGZvciBwQml0U3RyZWFtIChjYW4gYmUgJHBwQml0U3RyZWFtKQotICAgICAgICA7Ly8gJFJCaXRCdWZmZXIgICAgIC0gcmVnaXN0ZXIgdG8gdXNlIGZvciBCaXRCdWZmZXIKLSAgICAgICAgOy8vICRSQml0Q291bnQgICAgICAtIHJlZ2lzdGVyIHRvIHVzZSBmb3IgQml0Q291bnQgICAoY2FuIGJlICRwQml0T2Zmc2V0KQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFQxLCRUMiwkVDMgICAgIC0gcmVnaXN0ZXJzIHRoYXQgbXVzdCBiZSBwcmVzZXJ2ZWQgYmV0d2VlbiBjYWxscyB0bwotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgTV9CRF9JTklUMSBhbmQgTV9CRF9JTklUMgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX0lOSVQwICAkcHBCaXRTdHJlYW0sICRwQml0T2Zmc2V0LCAkUkJpdFN0cmVhbSwgJFJCaXRCdWZmZXIsICRSQml0Q291bnQKLQotcEJpdFN0cmVhbSAgU0VUUyAiJFJCaXRTdHJlYW0iCi1CaXRCdWZmZXIgICBTRVRTICIkUkJpdEJ1ZmZlciIKLUJpdENvdW50ICAgIFNFVFMgIiRSQml0Q291bnQiICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBsb2FkIGlucHV0cwotICAgICAgICBMRFIgICAgICRwQml0U3RyZWFtLCBbJHBwQml0U3RyZWFtXQotICAgICAgICBMRFIgICAgICRCaXRDb3VudCwgWyRwQml0T2Zmc2V0XQotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX0lOSVQxICAkVDEsICRUMiwgJFQzCi0gICAgICAgIExEUkIgICAgJFQyLCBbJHBCaXRTdHJlYW0sICMyXQotICAgICAgICBMRFJCICAgICRUMSwgWyRwQml0U3RyZWFtLCAjMV0KLSAgICAgICAgTERSQiAgICAkQml0QnVmZmVyLCAgWyRwQml0U3RyZWFtXSwgIzMKLSAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9JTklUMiAgJFQxLCAkVDIsICRUMwotICAgICAgICBPUlIgICAgICRUMiwgJFQyLCAkVDEsIExTTCAjOAotICAgICAgICBPUlIgICAgICRCaXRCdWZmZXIsICRUMiwgJEJpdEJ1ZmZlciwgTFNMICMxNgotICAgICAgICBNRU5EICAgIAotICAgICAgICAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBMb29rIGFoZWFkIGZpeGVkIDE8PU48PTggYml0cyB3aXRob3V0IGNvbnN1bWluZyBhbnkgYml0cwotICAgICAgICA7Ly8gVGhlIG5leHQgYml0cyB3aWxsIGJlIHBsYWNlZCBhdCBiaXQgMzEuLjI0IG9mIGRlc3RpbmF0aW9uIHJlZ2lzdGVyCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIGxvb2sKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfTE9PSzggICRTeW1ib2wsICROCi0gICAgICAgIEFTU0VSVCAgKCROPj0xKTpMQU5EOigkTjw9OCkKLSAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50Ci0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gTG9vayBhaGVhZCBmaXhlZCAxPD1OPD0xNiBiaXRzIHdpdGhvdXQgY29uc3VtaW5nIGFueSBiaXRzCi0gICAgICAgIDsvLyBUaGUgbmV4dCBiaXRzIHdpbGwgYmUgcGxhY2VkIGF0IGJpdCAzMS4uMTYgb2YgZGVzdGluYXRpb24gcmVnaXN0ZXIKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gbG9vawotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9MT09LMTYgICRTeW1ib2wsICROLCAkVDEKLSAgICAgICAgQVNTRVJUICAoJE4gPj0gMSk6TEFORDooJE4gPD0gMTYpCi0gICAgICAgIE1PViAgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudAotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFNraXBzIGZpeGVkIDE8PU48PTggYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9TS0lQOCAkTiwgJFQxCi0gICAgICAgIEFTU0VSVCAgKCROPj0xKTpMQU5EOigkTjw9OCkgICAgICAgIAotICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjKDgtJE4pCi0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgIAotICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFJlYWQgZml4ZWQgMTw9Tjw9OCBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byByZWFkCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX1JFQUQ4ICRTeW1ib2wsICROLCAkVDEKLSAgICAgICAgQVNTRVJUICAoJE4+PTEpOkxBTkQ6KCROPD04KSAgICAgICAgICAgICAgICAKLSAgICAgICAgTU9WUyAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50ICAgICAgICAKLSAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIyg4LSROKQotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAKLSAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkU3ltYm9sLCBMU1IgIygzMi0kTikKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBNRU5ECi0KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBSZWFkIGZpeGVkIDE8PU48PTE2IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIHJlYWQKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfUkVBRDE2ICRTeW1ib2wsICROLCAkVDEsICRUMgotICAgICAgICBBU1NFUlQgICgkTj49MSk6TEFORDooJE48PTE2KQotICAgICAgICBBU1NFUlQgICRTeW1ib2w8PiRUMQotICAgICAgICBJRiAoJE48PTgpCi0gICAgICAgICAgICBNX0JEX1JFQUQ4ICAkU3ltYm9sLCAkTiwgJFQxCi0gICAgICAgIEVMU0UgICAgICAgIAotICAgICAgICAgICAgOy8vIE4+OCBzbyB3ZSB3aWxsIGJlIGFibGUgdG8gcmVmaWxsIGF0IGxlYXN0IG9uZSBieXRlICAgICAgICAgICAgCi0gICAgICAgICAgICBMRFJCICAgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgICAgICAKLSAgICAgICAgICAgIE1PVlMgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudAotICAgICAgICAgICAgT1JSICAgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOCAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjKDE2LSROKQotICAgICAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAgICAgCi0gICAgICAgICAgICBNT1YgICAgICRTeW1ib2wsICRTeW1ib2wsIExTUiAjKDMyLSROKQotICAgICAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBTa2lwIHZhcmlhYmxlIDE8PU48PTggYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzLiAxPD1OPD04Ci0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfVlNLSVA4ICROLCAkVDEKLSAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJE4KLSAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAKLSAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBNRU5EICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gU2tpcCB2YXJpYWJsZSAxPD1OPD0xNiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMuIDE8PU48PTE2Ci0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfVlNLSVAxNiAkTiwgJFQxLCAkVDIKLSAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJE4KLSAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBTVUJDU1MgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgCi0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQotICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIE1FTkQgICAgICAgIAotCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gUmVhZCB2YXJpYWJsZSAxPD1OPD04IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyLgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byByZWFkLiAxPD1OPD04Ci0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX1ZSRUFEOCAkU3ltYm9sLCAkTiwgJFQxLCAkVDIKLSAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50ICAgICAgICAKLSAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJE4KLSAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAKLSAgICAgICAgUlNCICAgICAkVDIsICROLCAjMzIgICAgICAgIAotICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBNT1YgICAgICRTeW1ib2wsICRTeW1ib2wsIExTUiAkVDIKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBNRU5ECi0KLQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFJlYWQgdmFyaWFibGUgMTw9Tjw9MTYgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIHJlYWQuIDE8PU48PTE2Ci0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX1ZSRUFEMTYgJFN5bWJvbCwgJE4sICRUMSwgJFQyCi0gICAgICAgIE1PViAgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudCAgICAgICAgCi0gICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICROCi0gICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgCi0gICAgICAgIFJTQiAgICAgJFQyLCAkTiwgIzMyICAgICAgICAKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBTVUJDU1MgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgCi0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQotICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBNT1YgICAgICRTeW1ib2wsICRTeW1ib2wsIExTUiAkVDIKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBNRU5ECi0KLQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIERlY29kZSBhIGNvZGUgb2YgdGhlIGZvcm0gMDAwMC4uLjAwMSB3aGVyZSB0aGVyZQotICAgICAgICA7Ly8gYXJlIE4gemVyb3MgYmVmb3JlIHRoZSAxIGFuZCBOPD0xNSAoY29kZSBsZW5ndGg8PTE2KQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKLSAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCi0gICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbnVtYmVyIG9mIHplcm9zIGJlZm9yZSB0aGUgbmV4dCAxCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICA+PTE2IGlzIGFuIGlsbGVnYWwgY29kZQotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfQ0xaMTYgJFN5bWJvbCwgJFQxLCAkVDIKLSAgICAgICAgTU9WUyAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50Ci0gICAgICAgIENMWiAgICAgJFN5bWJvbCwgJFN5bWJvbCAgICAgICAgICAgICAgICAKLSAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJFN5bWJvbAotICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjNyAgICAgICAgOy8vIGxlbmd0aCBpcyBTeW1ib2wrMQotICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEKLSAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAotICAgICAgICBTVUJDU1MgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgCi0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQotICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIE1FTkQgIAotCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gRGVjb2RlIGEgY29kZSBvZiB0aGUgZm9ybSAxMTExLi4uMTEwIHdoZXJlIHRoZXJlCi0gICAgICAgIDsvLyBhcmUgTiBvbmVzIGJlZm9yZSB0aGUgMCBhbmQgTjw9MTUgKGNvZGUgbGVuZ3RoPD0xNikKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLyAKLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG51bWJlciBvZiB6ZXJvcyBiZWZvcmUgdGhlIG5leHQgMQotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgPj0xNiBpcyBhbiBpbGxlZ2FsIGNvZGUKLSAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX0NMTzE2ICRTeW1ib2wsICRUMSwgJFQyCi0gICAgICAgIE1PViAgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudAotICAgICAgICBNVk4gICAgICRTeW1ib2wsICRTeW1ib2wKLSAgICAgICAgQ0xaICAgICAkU3ltYm9sLCAkU3ltYm9sICAgICAgICAgICAgICAgIAotICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkU3ltYm9sCi0gICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM3ICAgICAgICA7Ly8gbGVuZ3RoIGlzIFN5bWJvbCsxCi0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4Ci0gICAgICAgIFNVQkNTUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAKLSAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCi0gICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKLSAgICAgICAgTUVORCAgCi0KLQotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFZhcmlhYmxlIExlbmd0aCBEZWNvZGUgbW9kdWxlCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gRGVjb2RlcyBvbmUgVkxEIFN5bWJvbCBmcm9tIGEgYml0c3RyZWFtIGFuZCByZWZpbGwgdGhlIGJpdHN0cmVhbQotICAgICAgICA7Ly8gYnVmZmVyLgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkcFZMRFRhYmxlICAgICAgLSBwb2ludGVyIHRvIFZMRCBkZWNvZGUgdGFibGUgb2YgMTYtYml0IGVudHJpZXMuCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBUaGUgZm9ybWF0IGlzIGRlc2NyaWJlZCBhYm92ZSBhdCB0aGUgc3RhcnQgb2YKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIHRoaXMgZmlsZS4KLSAgICAgICAgOy8vICRTMCAgICAgICAgICAgICAtIFRoZSBudW1iZXIgb2YgYml0cyB0byBsb29rIHVwIGZvciB0aGUgZmlyc3Qgc3RlcAotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgMTw9JFMwPD04Ci0gICAgICAgIDsvLyAkUzEgICAgICAgICAgICAgLSBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gbG9vayB1cCBmb3IgZWFjaCBzdWJzZXF1ZW50Ci0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBzdGVwIDE8PSRTMTw9JFMwLgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIGRlY29kZWQgVkxEIHN5bWJvbCB2YWx1ZQotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX1ZMRCAkU3ltYm9sLCAkVDEsICRUMiwgJHBWTERUYWJsZSwgJFMwLCAkUzEKLSAgICAgICAgQVNTRVJUICgxPD0kUzApOkxBTkQ6KCRTMDw9OCkKLSAgICAgICAgQVNTRVJUICgxPD0kUzEpOkxBTkQ6KCRTMTw9JFMwKQotICAgICAgICAKLSAgICAgICAgOy8vIE5vdGUgMDw9Qml0Q291bnQ8PTE1IG9uIGVudHJ5IGFuZCBleGl0Ci0gICAgICAgIAotICAgICAgICBNT1ZTICAgICRUMSwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudCAgICAgICA7Ly8gbGVmdCBhbGlnbiBuZXh0IGJpdHMKLSAgICAgICAgTU9WUyAgICAkU3ltYm9sLCAjKDI8PCRTMCktMiAgICAgICAgICAgICAgICAgOy8vIGNyZWF0ZSBtYXNrCi0gICAgICAgIEFORCAgICAgJFN5bWJvbCwgJFN5bWJvbCwgJFQxLCBMU1IgIygzMS0kUzApIDsvLyAyKihuZXh0ICRTMCBiaXRzKQotICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgICAgICA7Ly8gQ1MgaWYgYnVmZmVyIGNhbiBiZSBmaWxsZWQKLTAxCi0gICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgICAgICAgIDsvLyBsb2FkIHJlZmlsbCBieXRlCi0gICAgICAgIExEUkggICAgJFN5bWJvbCwgWyRwVkxEVGFibGUsICRTeW1ib2xdICAgICAgIDsvLyBsb2FkIHRhYmxlIGVudHJ5Ci0gICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAgICAgIDsvLyByZWZpbGwgbm90IHBvc3NpYmxlCi0gICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICMkUzAgICAgICAgICAgIDsvLyBhc3N1bWUgJFMwIGJpdHMgdXNlZAotICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4ICA7Ly8gbWVyZ2UgaW4gcmVmaWxsIGJ5dGUKLSAgICAgICAgTU9WUyAgICAkVDEsICRTeW1ib2wsIExTUiAjMSAgICAgICAgICAgICAgICAgOy8vIENTPWxlYWYgZW50cnkKLSAgICAgICAgQkNTICAgICAlRlQwMgotICAgICAgICAKLSAgICAgICAgTU9WUyAgICAkVDEsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQgICAgICAgOy8vIGxlZnQgYWxpZ24gbmV4dCBiaXQKLSAgICAgICAgSUYgKDIqJFMwLSRTMTw9OCkKLSAgICAgICAgICAgIDsvLyBDYW4gY29tYmluZSByZWZpbGwgY2hlY2sgYW5kIC1TMCtTMSBhbmQga2VlcCAkQml0Q291bnQ8PTE1Ci0gICAgICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCsoJFMwLSRTMSkKLSAgICAgICAgRUxTRQotICAgICAgICAgICAgOy8vIFNlcGFyYXRlIHJlZmlsbCBjaGVjayBhbmQgLVMwK1MxIG9mZnNldAotICAgICAgICAgICAgU1VCUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4Ci0gICAgICAgICAgICBTVUIgICAkQml0Q291bnQsICRCaXRDb3VudCwgIygkUzAtJFMxKQotICAgICAgICBFTkRJRgotICAgICAgICBBREQgICAgICRTeW1ib2wsICRTeW1ib2wsICRUMSwgTFNSICMoMzEtJFMxKSA7Ly8gYWRkIDIqKG5leHQgJFMxIGJpdHMpIHRvCi0gICAgICAgIEJJQyAgICAgJFN5bWJvbCwgJFN5bWJvbCwgIzEgICAgICAgICAgICAgICAgIDsvLyAgIHRhYmxlIG9mZnNldAotICAgICAgICBCICAgICAgICVCVDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gbG9hZCBuZXh0IHRhYmxlIGVudHJ5Ci0wMgotICAgICAgICA7Ly8gQml0Q291bnQgcmFuZ2Ugbm93IGRlcGVuZCBvbiB0aGUgcm91dGUgaGVyZQotICAgICAgICA7Ly8gaWYgKGZpcnN0IHN0ZXApICAgICAgIFMwIDw9IEJpdENvdW50IDw9IDcrUzAgICAgICAgIDw9MTUKLSAgICAgICAgOy8vIGVsc2UgaWYgKDIqUzAtUzE8PTgpICBTMCA8PSBCaXRDb3VudCA8PSA3KygyKlMwLVMxKSA8PTE1Ci0gICAgICAgIDsvLyBlbHNlICAgICAgICAgICAgICAgICAgUzEgPD0gQml0Q291bnQgPD0gNytTMSAgICAgICAgPD0xNQotICAgICAgICAKLSAgICAgICAgU1VCICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJFN5bWJvbCwgTFNSIzEzCi0gICAgICAgIEJJQyAgICAgJFN5bWJvbCwgJFQxLCAjMHhGMDAwCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0KLSAgICAgICAgOy8vIEFkZCBhbiBvZmZzZXQgbnVtYmVyIG9mIGJpdHMKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXRzIGRlc3RpbmF0aW9uIGJ5dGUgYW5kIGJpdCBpbmRleCB2YWx1ZXMgd2hpY2ggY29ycmVzcG9uZHMgdG8gYW4gb2Zmc2V0IG51bWJlciBvZiBiaXRzIAotICAgICAgICA7Ly8gZnJvbSB0aGUgY3VycmVudCBsb2NhdGlvbi4gVGhpcyBpcyB1c2VkIHRvIGNvbXBhcmUgYml0c3RyZWFtIHBvc2l0aW9ucyB1c2luZy4gTV9CRF9DTVAuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRPZmZzZXQgICAgICAgICAtIE9mZnNldCB0byBiZSBhZGRlZCBpbiBiaXRzLgotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkQnl0ZUluZGV4ICAgICAgLSBEZXN0aW5hdGlvbiBwQml0U3RyZWFtIHBvaW50ZXIgYWZ0ZXIgYWRkaW5nIHRoZSBPZmZzZXQuIAotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSB3aWxsIGJlIDQgYnl0ZSBhaGVhZCBhbmQgbmVlZHMgdG8gc3VidHJhY3QgYnkgNCB0byBnZXQgZXhhY3QgCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBwb2ludGVyIChhcyBpbiBNX0JEX0ZJTkkpLiBCdXQgZm9yIHVzaW5nIHdpdGggTV9CRF9DTVAgc3VidHJhY3QgaXMgbm90IG5lZWRlZC4KLSAgICAgICAgOy8vICRCaXRJbmRleCAgICAgICAtIERlc3RpbmF0aW9uIEJpdENvdW50IGFmdGVyIHRoZSBhZGRpdGlvbiBvZiBPZmZzZXQgbnVtYmVyIG9mIGJpdHMKLSAgICAgICAgOy8vCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQkRfQUREICAkQnl0ZUluZGV4LCAkQml0SW5kZXgsICRPZmZzZXQKLQotICAgICAgICA7Ly8gKCRCeXRlSW5kZXgsJEJpdEluZGV4KSA9IEN1cnJlbnQgcG9zaXRpb24gKyAkT2Zmc2V0IGJpdHMKLSAgICAgICAgQUREICAgICAkT2Zmc2V0LCAkT2Zmc2V0LCAkQml0Q291bnQKLSAgICAgICAgQU5EICAgICAkQml0SW5kZXgsICRPZmZzZXQsICM3Ci0gICAgICAgIEFERCAgICAgJEJ5dGVJbmRleCwgJHBCaXRTdHJlYW0sICRPZmZzZXQsIEFTUiAjMyAgICAgICAgCi0gICAgICAgIE1FTkQKLQotICAgICAgICA7Ly8gTW92ZSBiaXRzdHJlYW0gcG9pbnRlcnMgdG8gdGhlIGxvY2F0aW9uIGdpdmVuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT3V0cHV0cyBkZXN0aW5hdGlvbiBieXRlIGFuZCBiaXQgaW5kZXggdmFsdWVzIHdoaWNoIGNvcnJlc3BvbmRzIHRvICAKLSAgICAgICAgOy8vIHRoZSBjdXJyZW50IGxvY2F0aW9uIGdpdmVuIChjYWxjdWxhdGVkIHVzaW5nIE1fQkRfQUREKS4gCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8gJEJ5dGVJbmRleCAgICAgIC0gRGVzdGluYXRpb24gcEJpdFN0cmVhbSBwb2ludGVyIGFmdGVyIG1vdmUuIAotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSB3aWxsIGJlIDQgYnl0ZSBhaGVhZCBhbmQgbmVlZHMgdG8gc3VidHJhY3QgYnkgNCB0byBnZXQgZXhhY3QgCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBwb2ludGVyIChhcyBpbiBNX0JEX0ZJTkkpLgotICAgICAgICA7Ly8gJEJpdEluZGV4ICAgICAgIC0gRGVzdGluYXRpb24gQml0Q291bnQgYWZ0ZXIgdGhlIG1vdmUKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4gIAotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0JEX01PViAgJEJ5dGVJbmRleCwgJEJpdEluZGV4Ci0KLSAgICAgICAgOy8vICgkcEJpdFN0cmVhbSwgJE9mZnNldCkgPSAoJEJ5dGVJbmRleCwkQml0SW5kZXgpCi0gICAgICAgIE1PViAgICAgJEJpdENvdW50LCAkQml0SW5kZXgKLSAgICAgICAgTU9WICAgICAkcEJpdFN0cmVhbSwgJEJ5dGVJbmRleAotICAgICAgICBNRU5ECi0KLSAgICAgICAgOy8vIEJpdHN0cmVhbSBDb21wYXJlCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gQ29tcGFyZXMgYml0c3RyZWFtIHBvc2l0aW9uIHdpdGggdGhhdCBvZiBhIGRlc3RpbmF0aW9uIHBvc2l0aW9uLiBEZXN0aW5hdGlvbiBwb3NpdGlvbiAKLSAgICAgICAgOy8vIGlzIGhlbGQgaW4gdHdvIGlucHV0IHJlZ2lzdGVycyB3aGljaCBhcmUgY2FsY3VsYXRlZCB1c2luZyBNX0JEX0FERCBtYWNybwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkQnl0ZUluZGV4ICAgICAgLSBEZXN0aW5hdGlvbiBwQml0U3RyZWFtIHBvaW50ZXIsICg0IGJ5dGUgYWhlYWQgYXMgZGVzY3JpYmVkIGluIE1fQkRfQUREKQotICAgICAgICA7Ly8gJEJpdEluZGV4ICAgICAgIC0gRGVzdGluYXRpb24gQml0Q291bnQKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gRkxBR1MgICAgICAgICAgIC0gR0UgaWYgZGVzdGluYXRpb24gaXMgcmVhY2hlZCwgTFQgPSBpcyBkZXN0aW5hdGlvbiBpcyBhaGVhZAotICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9DTVAgICRCeXRlSW5kZXgsICRCaXRJbmRleCwgJFQxCi0gICAgICAgIAotICAgICAgICA7Ly8gUmV0dXJuIGZsYWdzIHNldCBieSAoY3VycmVudCBwb3NpdG9uKS0oJEJ5dGVJbmRleCwkQml0SW5kZXgpCi0gICAgICAgIDsvLyBzbyBHRSBtZWFucyB0aGF0IHdlIGhhdmUgcmVhY2hlZCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uCi0KLSAgICAgICAgQUREICAgICAgICAgJFQxLCAkcEJpdFN0cmVhbSwgJEJpdENvdW50LCBMU1IgIzMKLSAgICAgICAgQ01QICAgICAgICAgJFQxLCAkQnl0ZUluZGV4Ci0gICAgICAgIEFORCAgICAgICAgICRUMSwgJEJpdENvdW50LCAjNwotICAgICAgICBDTVBFUSAgICAgICAkVDEsICRCaXRJbmRleCAgICAgICAgCi0gICAgICAgIE1FTkQKLQotICAgICAgICAKLSAgICAgICAgOy8vIEJpdHN0cmVhbSBEZWNvZGUgZmluYWxpc2UKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBXcml0ZXMgYmFjayB0aGUgYml0c3RyZWFtIHN0YXRlIHRvIHRoZSBiaXRzdHJlYW0gcG9pbnRlcnMKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCi0gICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgotICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkcHBCaXRTdHJlYW0gICAgLSBwb2ludGVyIHRvIHBvaW50ZXIgdG8gdGhlIG5leHQgYml0c3RyZWFtIGJ5dGUKLSAgICAgICAgOy8vICRwQml0T2Zmc2V0ICAgICAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgaW4gdGhlIGN1cnJlbnQgYnl0ZSAoMC4uNykKLSAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAotICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IHRoZXNlIHJlZ2lzdGVyIGFyZSBjb3JydXB0ZWQKLSAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAotICAgICAgICA7Ly8KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9CRF9GSU5JICAkcHBCaXRTdHJlYW0sICRwQml0T2Zmc2V0Ci0gICAgICAgIAotICAgICAgICA7Ly8gQWR2YW5jZSBwb2ludGVyIGJ5IHRoZSBudW1iZXIgb2YgZnJlZSBiaXRzIGluIHRoZSBidWZmZXIKLSAgICAgICAgQUREICAgICAkcEJpdFN0cmVhbSwgJHBCaXRTdHJlYW0sICRCaXRDb3VudCwgTFNSIzMKLSAgICAgICAgQU5EICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzcKLSAgICAgICAgCi0gICAgICAgIDsvLyBOb3cgbW92ZSBiYWNrIDMyIGJpdHMgdG8gcmVhY2ggdGhlIGZpcnN0IHVzdWVkIGJpdAotICAgICAgICBTVUIgICAgICRwQml0U3RyZWFtLCAkcEJpdFN0cmVhbSwgIzQKLSAgICAgICAgCi0gICAgICAgIDsvLyBTdG9yZSBvdXQgYml0c3RyZWFtIHN0YXRlCi0gICAgICAgIFNUUiAgICAgJEJpdENvdW50LCBbJHBCaXRPZmZzZXRdCi0gICAgICAgIFNUUiAgICAgJHBCaXRTdHJlYW0sIFskcHBCaXRTdHJlYW1dCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIEVORAotICAgICAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMwZWYzNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fQml0c3RyZWFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybUNPTU1fQml0c3RyZWFtLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEZpbGU6IGFybUNPTU1fQml0c3RyZWFtLmgKLSAqIEJyaWVmOiBEZWNsYXJlcyBjb21tb24gQVBJJ3MvRGF0YSB0eXBlcyB1c2VkIGFjcm9zcyB0aGUgT3Blbk1heCBFbmNvZGVycy9EZWNvZGVycy4KLSAqCi0gKi8KLQotI2lmbmRlZiBfYXJtQ29kZWNfSF8KLSNkZWZpbmUgX2FybUNvZGVjX0hfCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX1U4ICAgY29kZUxlbjsKLSAgICBPTVhfVTMyCSBjb2RlV29yZDsKLX0gQVJNX1ZMQzMyOwotCi0vKiBUaGUgYWJvdmUgc2hvdWxkIGJlIHJlbmFtZWQgYXMgIkFSTV9WTEMzMiIgKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtTG9va0FoZWFkQml0cygpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBHZXQgdGhlIG5leHQgTiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSB3aXRob3V0IGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKipwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIE49MS4uLjMyCi0gKgotICogUmV0dXJucyAgVmFsdWUKLSAqLwotCi1PTVhfVTMyIGFybUxvb2tBaGVhZEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sIE9NWF9JTlQgKnBPZmZzZXQsIE9NWF9JTlQgTik7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUdldEJpdHMoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUmVhZCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCi0gKiAgICAKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBOPTEuLjMyCi0gKgotICogW291dF0gICAgKnBwQml0U3RyZWFtCi0gKiBbb3V0XSAgICAqcE9mZnNldAotICogUmV0dXJucyAgVmFsdWUKLSAqLwotCi1PTVhfVTMyIGFybUdldEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sIE9NWF9JTlQgKnBPZmZzZXQsIE9NWF9JTlQgTik7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUJ5dGVBbGlnbigpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBBbGlnbiB0aGUgcG9pbnRlciAqcHBCaXRTdHJlYW0gdG8gdGhlIG5leHQgYnl0ZSBib3VuZGFyeQotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKgotICogW291dF0gICAgKnBwQml0U3RyZWFtCi0gKiBbb3V0XSAgICAqcE9mZnNldAotICoKLSAqKi8KLSAKLU9NWFZvaWQgYXJtQnl0ZUFsaWduKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLE9NWF9JTlQgKnBPZmZzZXQpOwotCi0vKiogCi0gKiBGdW5jdGlvbjogYXJtU2tpcEJpdHMoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogU2tpcCBOIGJpdHMgZnJvbSB0aGUgdmFsdWUgYXQgKnBwQml0U3RyZWFtCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIE4KLSAqCi0gKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKgotICoqLwotCi1PTVhWb2lkIGFybVNraXBCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLE9NWF9JTlQgKnBPZmZzZXQsT01YX0lOVCBOKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVmFyaWFibGUgYml0IGxlbmd0aCBEZWNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVVuUGFja1ZMQzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFZhcmlhYmxlIGxlbmd0aCBkZWNvZGUgb2YgdmFyaWFibGUgbGVuZ3RoIHN5bWJvbCAobWF4IHNpemUgMzIgYml0cykgcmVhZCBmcm9tCi0gKiB0aGUgYml0IHN0cmVhbSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSBhdCAqcE9mZnNldCBieSB1c2luZyB0aGUgdGFibGUKLSAqIHBvaW50ZWQgYnkgcENvZGVCb29rCi0gKiAKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgcENvZGVCb29rCi0gKiAKLSAqIFtvdXRdICAgICoqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKgotICogUmV0dXJucyA6IENvZGUgQm9vayBJbmRleCBpZiBzdWNjZXNzZnVsbC4gCi0gKiAgICAgICAgIDogIkFSTV9OT19DT0RFQk9PS19JTkRFWCA9IDB4RkZGRiIgaWYgc2VhcmNoIGZhaWxzLgotICoqLwotCi0jZGVmaW5lIEFSTV9OT19DT0RFQk9PS19JTkRFWCAoT01YX1UxNikoMHhGRkZGKQotCi1PTVhfVTE2IGFybVVuUGFja1ZMQzMyKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBPZmZzZXQsCi0gICAgY29uc3QgQVJNX1ZMQzMyICpwQ29kZUJvb2sKLSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZpeGVkIGJpdCBsZW5ndGggRW5jb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1QYWNrQml0cwotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAotICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCi0gKiBbaW5dCXBPZmZzZXQJICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAKLSAqICAgICAgICAgICAgICAgICAgICAgIHRvIDcuCi0gKiBbaW5dCWNvZGVXb3JkCQlDb2RlIHdvcmQgdGhhdCBuZWVkIHRvIGJlIGluc2VydGVkIGluIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQotICogW2luXQljb2RlTGVuZ3RoCQlMZW5ndGggb2YgdGhlIGNvZGUgd29yZCB2YWxpZCByYW5nZSAxLi4uMzIKLSAqCi0gKiBbb3V0XSBwcEJpdFN0cmVhbQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKLSAqCSAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAotICoJCQkJCQkJc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdIHBCaXRPZmZzZXQJCSpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKgkJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKgkJCQkJCQkqcHBCaXRTdHJlYW0uCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YX1JFU1VMVCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotIAotT01YUmVzdWx0IGFybVBhY2tCaXRzICgKLSAgICBPTVhfVTggICoqcHBCaXRTdHJlYW0sIAotICAgIE9NWF9JTlQgKnBPZmZzZXQsCi0gICAgT01YX1UzMiBjb2RlV29yZCwgCi0gICAgT01YX0lOVCBjb2RlTGVuZ3RoIAotKTsKLSAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFZhcmlhYmxlIGJpdCBsZW5ndGggRW5jb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1QYWNrVkxDMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBhY2sgYSBWTEMgY29kZSB3b3JkIGludG8gdGhlIGJpdHN0cmVhbQotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtLgotICogW2luXQlwQml0T2Zmc2V0CSAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAKLSAqICAgICAgICAgICAgICAgICAgICAgIHRvIDcuCi0gKiBbaW5dCSBjb2RlICAgICAJCVZMQyBjb2RlIHdvcmQgdGhhdCBuZWVkIHRvIGJlIGluc2VydGVkIGluIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCi0gKgotICogW291dF0gcHBCaXRTdHJlYW0JKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCi0gKgkgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAotICoJCQkJCQlzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqCQkJCQkJY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICoJCQkJCQkqcHBCaXRTdHJlYW0uCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YX1JFU1VMVCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotIAotT01YUmVzdWx0IGFybVBhY2tWTEMzMiAoCi0gICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sIAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgQVJNX1ZMQzMyIGNvZGUgCi0pOwotCi0jZW5kaWYgICAgICAvKl9hcm1Db2RlY19IXyovCi0KLS8qRW5kIG9mIEZpbGUqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzYxZjYxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9JRENUVGFibGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICoKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtQ09NTV9JRENUVGFibGUuaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICAxMjI5MAotICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRmlsZSAgICAgICAgIDogYXJtQ09NTV9JRENUVGFibGUuaAotICogRGVzY3JpcHRpb24gIDogQ29udGFpbnMgZGVjbGFyYXRpb25zIG9mIHRhYmxlcyBmb3IgSURDVCBjYWxjdWxhdGlvbi4KLSAqCi0gKi8KLSAgCi0jaWZuZGVmIF9hcm1DT01NX0lEQ1RUYWJsZV9IXwotI2RlZmluZSBfYXJtQ09NTV9JRENUVGFibGVfSF8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0KLSAgICAgLyogIFRhYmxlIG9mIHModSkqQSh1KSpBKHYpLzE2IGF0IFExNQotICAgICAgKiAgcyh1KT0xLjAgMCA8PSB1IDw9IDUKLSAgICAgICogIHMoNik9Mi4wCi0gICAgICAqICBzKDcpPTQuMAotICAgICAgKiAgQSgwKSA9IDIqc3FydCgyKQotICAgICAgKiAgQSh1KSA9IDQqY29zKHUqcGkvMTYpICBmb3IgKHUhPTApCi0JICAqLwotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtQ09NTV9JRENUUHJlU2NhbGUgWzY0XTsKLWV4dGVybiBjb25zdCBPTVhfVTE2IGFybUNPTU1fSURDVENvZWYgWzRdOwotCi0jZW5kaWYgLyogX2FybUNPTU1fSURDVFRhYmxlX0hfICovCi0KLQotLyogRW5kIG9mIEZpbGUgKi8KLQotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0lEQ1Rfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0lEQ1Rfcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTMwMjIzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9JRENUX3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NTkgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA0IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLwotOy8vIElEQ1Rfcy5zCi07Ly8KLTsvLyBJbnZlcnNlIERDVCBtb2R1bGUKLTsvLwotOy8vIAotOy8vIEFMR09SSVRITSBERVNDUklQVElPTgotOy8vCi07Ly8gVGhlIDh4OCAyRCBJRENUIGlzIHBlcmZvcm1lZCBieSBjYWxjdWxhdGluZyBhIDFEIElEQ1QgZm9yIGVhY2gKLTsvLyBjb2x1bW4gYW5kIHRoZW4gYSAxRCBJRENUIGZvciBlYWNoIHJvdy4KLTsvLwotOy8vIFRoZSA4LXBvaW50IDFEIElEQ1QgaXMgZGVmaW5lZCBieQotOy8vICAgZih4KSA9IChDKDApKlQoMCkqYygwLHgpICsgLi4uICsgQyg3KSpUKDcpKmMoNyx4KSkvMgotOy8vCi07Ly8gICBDKHUpID0gMS9zcXJ0KDIpIGlmIHU9MCBvciAxIGlmIHUhPTAKLTsvLyAgIGModSx4KSA9IGNvcyggKDJ4KzEpKnUqcGkvMTYgKQotOy8vCi07Ly8gV2UgY29tcHV0ZSB0aGUgOC1wb2ludCAxRCBJRENUIHVzaW5nIHRoZSByZXZlcnNlIG9mCi07Ly8gdGhlIEFyYWktQWd1aS1OYWthamltYSBmbG93IGdyYXBoIHdoaWNoIHdlIHNwbGl0IGludG8KLTsvLyA1IHN0YWdlcyBuYW1lZCBpbiByZXZlcnNlIG9yZGVyIHRvIGlkZW50aWZ5IHdpdGggdGhlCi07Ly8gZm9yd2FyZCBEQ1QuIERpcmVjdCBpbnZlcnNpb24gb2YgdGhlIGZvcndhcmQgZm9ybXVsYWUKLTsvLyBpbiBmaWxlIEZEQ1Rfcy5zIGdpdmVzOgotOy8vCi07Ly8gSVN0YWdlIDU6ICAgaih1KSA9IFQodSkqQSh1KSAgWyBBKHUpPTQqQyh1KSpjKHUsMCkgXQotOy8vICAgICAgICAgICAgIFsgQSgwKSA9IDIqc3FydCgyKQotOy8vICAgICAgICAgICAgICAgQSh1KSA9IDQqY29zKHUqcGkvMTYpICBmb3IgKHUhPTApIF0KLTsvLwotOy8vIElTdGFnZSA0OiAgIGkwID0gajAgICAgICAgICAgICAgaTEgPSBqNAotOy8vICAgICAgICAgICAgIGkzID0gKGoyK2o2KS8yICAgICAgaTIgPSAoajItajYpLzIKLTsvLyAgICAgICAgICAgICBpNyA9IChqNStqMykvMiAgICAgIGk0ID0gKGo1LWozKS8yCi07Ly8gICAgICAgICAgICAgaTUgPSAoajErajcpLzIgICAgICBpNiA9IChqMS1qNykvMgotOy8vCi07Ly8gSVN0YWdlIDM6ICAgaDAgPSAoaTAraTEpLzIgICAgICBoMSA9IChpMC1pMSkvMgotOy8vICAgICAgICAgICAgIGgyID0gKGkyKnNxcnQyKS1pMyAgaDMgPSBpMwotOy8vICAgICAgICAgICAgIGg0ID0gIGNvcyhwaS84KSppNCArIHNpbihwaS84KSppNgotOy8vICAgICAgICAgICAgIGg2ID0gLXNpbihwaS84KSppNCArIGNvcyhwaS84KSppNgotOy8vICAgICAgICAgICAgIFsgVGhlIGFib3ZlIHR3byBsaW5lcyByb3RhdGUgYnkgLShwaS84KSBdCi07Ly8gICAgICAgICAgICAgaDUgPSAoaTUtaTcpL3NxcnQyICBoNyA9IChpNStpNykvMiAKLTsvLyAgICAgICAgICAgICAKLTsvLyBJU3RhZ2UgMjogICBnMCA9IChoMCtoMykvMiAgICAgIGczID0gKGgwLWgzKS8yCi07Ly8gICAgICAgICAgICAgZzEgPSAoaDEraDIpLzIgICAgICBnMiA9IChoMS1oMikvMgotOy8vICAgICAgICAgICAgIGc3ID0gaDcgICAgICAgICAgICAgZzYgPSBoNiAtIGg3Ci07Ly8gICAgICAgICAgICAgZzUgPSBoNSAtIGc2ICAgICAgICBnNCA9IGg0IC0gZzUKLTsvLwotOy8vIElTdGFnZSAxOiAgIGYwID0gKGcwK2c3KS8yICAgICAgZjcgPSAoZzAtZzcpLzIKLTsvLyAgICAgICAgICAgICBmMSA9IChnMStnNikvMiAgICAgIGY2ID0gKGcxLWc2KS8yCi07Ly8gICAgICAgICAgICAgZjIgPSAoZzIrZzUpLzIgICAgICBmNSA9IChnMi1nNSkvMgotOy8vICAgICAgICAgICAgIGYzID0gKGczK2c0KS8yICAgICAgZjQgPSAoZzMtZzQpLzIKLTsvLwotOy8vIE5vdGUgdGhhdCBtb3N0IGNvZWZmaWNpZW50cyBhcmUgaGFsdmVkIDMgdGltZXMgZHVyaW5nIHRoZQotOy8vIGFib3ZlIGNhbGN1bGF0aW9uLiBXZSBjYW4gcmVzY2FsZSB0aGUgYWxnb3JpdGhtIGRpdmlkaW5nCi07Ly8gdGhlIGlucHV0IGJ5IDggdG8gcmVtb3ZlIHRoZSBoYWx2aW5ncy4KLTsvLwotOy8vIElTdGFnZSA1OiAgIGoodSkgPSBUKHUpKkEodSkvOAotOy8vCi07Ly8gSVN0YWdlIDQ6ICAgaTAgPSBqMCAgICAgICAgICAgICBpMSA9IGo0Ci07Ly8gICAgICAgICAgICAgaTMgPSBqMiArIGo2ICAgICAgICBpMiA9IGoyIC0gajYKLTsvLyAgICAgICAgICAgICBpNyA9IGo1ICsgajMgICAgICAgIGk0ID0gajUgLSBqMwotOy8vICAgICAgICAgICAgIGk1ID0gajEgKyBqNyAgICAgICAgaTYgPSBqMSAtIGo3Ci07Ly8KLTsvLyBJU3RhZ2UgMzogICBoMCA9IGkwICsgaTEgICAgICAgIGgxID0gaTAgLSBpMQotOy8vICAgICAgICAgICAgIGgyID0gKGkyKnNxcnQyKS1pMyAgaDMgPSBpMwotOy8vICAgICAgICAgICAgIGg0ID0gMiooIGNvcyhwaS84KSppNCArIHNpbihwaS84KSppNikKLTsvLyAgICAgICAgICAgICBoNiA9IDIqKC1zaW4ocGkvOCkqaTQgKyBjb3MocGkvOCkqaTYpCi07Ly8gICAgICAgICAgICAgaDUgPSAoaTUtaTcpKnNxcnQyICBoNyA9IGk1ICsgaTcgCi07Ly8gICAgICAgICAgICAgCi07Ly8gSVN0YWdlIDI6ICAgZzAgPSBoMCArIGgzICAgICAgICBnMyA9IGgwIC0gaDMKLTsvLyAgICAgICAgICAgICBnMSA9IGgxICsgaDIgICAgICAgIGcyID0gaDEgLSBoMgotOy8vICAgICAgICAgICAgIGc3ID0gaDcgICAgICAgICAgICAgZzYgPSBoNiAtIGg3Ci07Ly8gICAgICAgICAgICAgZzUgPSBoNSAtIGc2ICAgICAgICBnNCA9IGg0IC0gZzUKLTsvLwotOy8vIElTdGFnZSAxOiAgIGYwID0gZzAgKyBnNyAgICAgICAgZjcgPSBnMCAtIGc3Ci07Ly8gICAgICAgICAgICAgZjEgPSBnMSArIGc2ICAgICAgICBmNiA9IGcxIC0gZzYKLTsvLyAgICAgICAgICAgICBmMiA9IGcyICsgZzUgICAgICAgIGY1ID0gZzIgLSBnNQotOy8vICAgICAgICAgICAgIGYzID0gZzMgKyBnNCAgICAgICAgZjQgPSBnMyAtIGc0Ci07Ly8KLTsvLyBOb3RlOgotOy8vIDEuIFRoZSBzY2FsaW5nIGJ5IEEodSkvOCBjYW4gb2Z0ZW4gYmUgY29tYmluZWQgd2l0aCBpbnZlcnNlCi07Ly8gICAgcXVhbnRpemF0aW9uLiBUaGUgY29sdW1uIGFuZCByb3cgc2NhbGluZ3MgY2FuIGJlIGNvbWJpbmVkLgotOy8vIDIuIFRoZSBmbG93Z3JhcGggaW4gdGhlIEFBTiBwYXBlciBoYXMgaDQsZzYgbmVnYXRlZCBjb21wYXJlZAotOy8vICAgIHRvIHRoZSBhYm92ZSBjb2RlIGJ1dCBpcyBvdGhlcndpc2UgaWRlbnRpY2FsLgotOy8vIDMuIFRoZSByb3RhdGlvbiBieSAtcGkvOCBjYW4gYmUgcGVmb3JtZWQgdXNpbmcgdGhyZWUgbXVsdGlwbGllcwotOy8vICAgIEVnICBjKmk0K3MqaTYgPSAoaTYtaTQpKnMgKyAoYytzKSppNAotOy8vICAgICAgIC1zKmk0K2MqaTYgPSAoaTYtaTQpKnMgKyAoYy1zKSppNgotOy8vIDQuIElmIHxUKHUpfDw9MSB0aGVuIGZyb20gdGhlIElEQ1QgZGVmaW5pdGlvbiwKLTsvLyAgICB8Zih4KXwgPD0gKCgxL3NxcnQyKSArIHxjKDEseCl8ICsgLi4gKyB8Yyg3LHgpfCkvMgotOy8vICAgICAgICAgICAgPSAoKDEvc3FydDIpICsgY29zKHBpLzE2KSArIC4uLiArIGNvcyg3KnBpLzE2KSkvMgotOy8vICAgICAgICAgICAgPSAoKDEvc3FydDIpICsgKGNvdChwaS8zMiktMSkvMikvMgotOy8vICAgICAgICAgICAgPSAoMSArIGNvcyhwaS8xNikgKyBjb3MoMnBpLzE2KSArIGNvcygzcGkvMTYpKS9zcXJ0KDIpCi07Ly8gICAgICAgICAgICA9IChhcHByb3gpMi42NAotOy8vICAgIFNvIHRoZSBtYXggZ2FpbiBvZiB0aGUgMkQgSURDVCBpcyB+eDcuMCA9IDMgYml0cy4KLTsvLyAgICBUaGUgdGFibGUgYmVsb3cgc2hvd3MgaW5wdXQgcGF0dGVybnMgZ2VuZXJhdGluZyB0aGUgbWF4aW11bQotOy8vICAgIHZhbHVlIG9mIHxmKHUpfCBmb3IgaW5wdXQgaW4gdGhlIHJhbmdlIHxUKHgpfDw9MS4gTT0tMSwgUD0rMQotOy8vICAgIElucHV0UGF0dGVybiAgICAgIE1heCB8Zih4KXwKLTsvLyAgICAgIFBQUFBQUFBQICAgICAgICB8ZjB8ID0gIDIuNjQKLTsvLyAgICAgIFBQUE1NTU1NICAgICAgICB8ZjF8ID0gIDIuNjQKLTsvLyAgICAgIFBQTU1NUFBQICAgICAgICB8ZjJ8ID0gIDIuNjQKLTsvLyAgICAgIFBQTU1QUE1NICAgICAgICB8ZjN8ID0gIDIuNjQKLTsvLyAgICAgIFBNTVBQTU1QICAgICAgICB8ZjR8ID0gIDIuNjQKLTsvLyAgICAgIFBNTVBNTVBNICAgICAgICB8ZjV8ID0gIDIuNjQKLTsvLyAgICAgIFBNUFBNUE1QICAgICAgICB8ZjZ8ID0gIDIuNjQKLTsvLyAgICAgIFBNUE1QTVBNICAgICAgICB8Zjd8ID0gIDIuNjQKLTsvLyAgIE5vdGUgdGhhdCB0aGlzIGlucHV0IHBhdHRlcm4gaXMgdGhlIHRyYW5zcG9zZSBvZiB0aGUKLTsvLyAgIGNvcnJlc3BvbmRpbmcgbWF4IGlucHV0IHBhdHRlciBmb3IgdGhlIEZEQ1QuCi0KLTsvLyBBcmd1bWVudHMKLQotcFNyYyAgICBSTiAwICAgIDsvLyBzb3VyY2UgZGF0YSBidWZmZXIKLVN0cmlkZSAgUk4gMSAgICA7Ly8gZGVzdGluYXRpb24gc3RyaWRlIGluIGJ5dGVzCi1wRGVzdCAgIFJOIDIgICAgOy8vIGRlc3RpbmF0aW9uIGRhdGEgYnVmZmVyCi1wU2NhbGUgIFJOIDMgICAgOy8vIHBvaW50ZXIgdG8gc2NhbGluZyB0YWJsZQotCi0KLSAgICAgICAgOy8vIERDVCBJbnZlcnNlIE1hY3JvCi0gICAgICAgIDsvLyBUaGUgRENUIGNvZGUgc2hvdWxkIGJlIHBhcmFtZXRyaXplZCBhY2NvcmRpbmcKLSAgICAgICAgOy8vIHRvIHRoZSBmb2xsb3dpbmcgaW5wdXRzOgotICAgICAgICA7Ly8gJG91dHNpemUgPSAidTgiICA6ICA4LWJpdCB1bnNpZ25lZCBkYXRhIHNhdHVyYXRlZCAoMCB0byArMjU1KQotICAgICAgICA7Ly8gICAgICAgICAgICAiczkiICA6IDE2LWJpdCBzaWduZWQgZGF0YSBzYXR1cmF0ZWQgdG8gOS1iaXQgKC0yNTYgdG8gKzI1NSkKLSAgICAgICAgOy8vICAgICAgICAgICAgInMxNiIgOiAxNi1iaXQgc2lnbmVkIGRhdGEgbm90IHNhdHVyYXRlZCAobWF4IHNpemUgfisvLTE0MjczKQotICAgICAgICA7Ly8gJGluc2NhbGUgPSAiczE2IiA6IHNpZ25lZCAxNi1iaXQgYWFuLXNjYWxlIHRhYmxlLCBRMTUgZm9ybWF0LCB3aXRoIDQgYnl0ZSBhbGlnbm1lbnQKLSAgICAgICAgOy8vICAgICAgICAgICAgInMzMiIgOiBzaWduZWQgMzItYml0IGFhbi1zY2FsZSB0YWJsZSwgUTIzIGZvcm1hdCwgd2l0aCA0IGJ5dGUgYWxpZ25tZW50Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXRzOgotICAgICAgICA7Ly8gcFNyYyAgID0gcjAgPSBQb2ludGVyIHRvIGlucHV0IGRhdGEKLSAgICAgICAgOy8vICAgICAgICAgICAgICAgUmFuZ2UgaXMgLTI1NiB0byArMjU1ICg5LWJpdCkKLSAgICAgICAgOy8vIFN0cmlkZSA9IHIxID0gU3RyaWRlIGJldHdlZW4gaW5wdXQgbGluZXMKLSAgICAgICAgOy8vIHBEZXN0ICA9IHIyID0gUG9pbnRlciB0byBvdXRwdXQgZGF0YQotICAgICAgICA7Ly8gcFNjYWxlID0gcjMgPSBQb2ludGVyIHRvIGFhbi1zY2FsZSB0YWJsZSBpbiB0aGUgZm9ybWF0IGRlZmluZWQgYnkgJGluc2NhbGUKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9JRENUICAkb3V0c2l6ZSwgJGluc2NhbGUsICRzdHJpZGUKLSAgICAgICAgTENMQSAgICBTSElGVAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIElGIEFSTTExMzZKUwotICAgICAgICAKLTsvLyBSRUdJU1RFUiBBTExPQ0FUSU9OCi07Ly8gVGhpcyBpcyBoYXJkIHNpbmNlIHdlIGhhdmUgOCB2YWx1ZXMsIDkgZnJlZSByZWdpc3RlcnMgYW5kIGVhY2gKLTsvLyBidXR0ZXJmbHkgcmVxdWlyZXMgYSB0ZW1wb3JhcnkgcmVnaXN0ZXIuIFdlIGFsc28gd2FudCB0byAKLTsvLyBtYWludGFpbiByZWdpc3RlciBvcmRlciBzbyB3ZSBjYW4gdXNlIExETS9TVE0uIFRoZSB0YWJsZSBiZWxvdwotOy8vIHN1bW1hcmlzZXMgdGhlIHJlZ2lzdGVyIGFsbG9jYXRpb24gdGhhdCBtZWV0cyBhbGwgdGhlc2UgY3JpdGVyaWEuCi07Ly8gYT0xc3Rjb2wsIGI9Mm5kY29sLCBmLGcsaCxpIGFyZSBkYXRhZmxvdyBwb2ludHMgZGVzY3JpYmVkIGFib3ZlLgotOy8vCi07Ly8gcjEgIGEwMSAgICAgZzAgIGgwCi07Ly8gcjQgIGIwMSBmMCAgZzEgIGgxICBpMAotOy8vIHI1ICBhMjMgZjEgIGcyICAgICAgaTEKLTsvLyByNiAgYjIzIGYyICBnMyAgaDIgIGkyCi07Ly8gcjcgIGE0NSBmMyAgICAgIGgzICBpMwotOy8vIHI4ICBiNDUgZjQgIGc0ICBoNCAgaTQKLTsvLyByOSAgYTY3IGY1ICBnNSAgaDUgIGk1Ci07Ly8gcjEwIGI2NyBmNiAgZzYgIGg2ICBpNgotOy8vIHIxMSAgICAgZjcgIGc3ICBoNyAgaTcKLTsvLwotcmEwMSAgICBSTiAxCi1yYjAxICAgIFJOIDQKLXJhMjMgICAgUk4gNQotcmIyMyAgICBSTiA2Ci1yYTQ1ICAgIFJOIDcKLXJiNDUgICAgUk4gOAotcmE2NyAgICBSTiA5Ci1yYjY3ICAgIFJOIDEwCi1ydG1wICAgIFJOIDExCi1jc1BpQnk4IFJOIDEyICAgOy8vIFsgKFNpbihwaS84KUBRMTUpLCAoQ29zKHBpLzgpQFExNSkgXQotTG9vcFJSMiBSTiAxNCAgIDsvLyBbIExvb3BOdW1iZXI8PDEzICwgKDEvU3FydCgyKSlAUTE1IF0KLTsvLyBUcmFuc3Bvc2UgYWxsb2NhdGlvbgoteGZ0ICAgICBSTiByYTAxCi14ZjAgICAgIFJOIHJiMDEKLXhmMSAgICAgUk4gcmEyMwoteGYyICAgICBSTiByYjIzCi14ZjMgICAgIFJOIHJhNDUKLXhmNCAgICAgUk4gcmI0NQoteGY1ICAgICBSTiByYTY3Ci14ZjYgICAgIFJOIHJiNjcKLXhmNyAgICAgUk4gcnRtcAotOy8vIElTdGFnZSAxIGFsbG9jYXRpb24KLXhnMCAgICAgUk4geGZ0Ci14ZzEgICAgIFJOIHhmMAoteGcyICAgICBSTiB4ZjEKLXhnMyAgICAgUk4geGYyCi14Z3QgICAgIFJOIHhmMwoteGc0ICAgICBSTiB4ZjQKLXhnNSAgICAgUk4geGY1Ci14ZzYgICAgIFJOIHhmNgoteGc3ICAgICBSTiB4ZjcKLTsvLyBJU3RhZ2UgMiBhbGxvY2F0aW9uCi14aDAgICAgIFJOIHhnMAoteGgxICAgICBSTiB4ZzEKLXhodCAgICAgUk4geGcyCi14aDIgICAgIFJOIHhnMwoteGgzICAgICBSTiB4Z3QKLXhoNCAgICAgUk4geGc0Ci14aDUgICAgIFJOIHhnNQoteGg2ICAgICBSTiB4ZzYKLXhoNyAgICAgUk4geGc3Ci07Ly8gSVN0YWdlIDMsNCBhbGxvY2F0aW9uCi14aXQgICAgIFJOIHhoMAoteGkwICAgICBSTiB4aDEKLXhpMSAgICAgUk4geGh0Ci14aTIgICAgIFJOIHhoMgoteGkzICAgICBSTiB4aDMKLXhpNCAgICAgUk4geGg0Ci14aTUgICAgIFJOIHhoNQoteGk2ICAgICBSTiB4aDYKLXhpNyAgICAgUk4geGg3Ci0gICAgICAgIAotICAgICAgICBNX1NUUiAgIHBEZXN0LCAgcHBEZXN0Ci0gICAgICAgIElGICIkc3RyaWRlIj0icyIKLSAgICAgICAgICAgIE1fU1RSICAgU3RyaWRlLCBwU3RyaWRlCi0gICAgICAgIEVORElGCi0gICAgICAgIE1fQURSICAgcERlc3QsICBwQmxrCi0gICAgICAgIExEUiAgICAgY3NQaUJ5OCwgPTB4MzBmYzc2NDIKLSAgICAgICAgTERSICAgICBMb29wUlIyLCA9MHgwMDAwNWE4MgotICAKLXY2X2lkY3RfY29sJF9GCi0gICAgICAgIDsvLyBMb2FkIGV2ZW4gdmFsdWVzCi0gICAgICAgIExEUiAgICAgeGk0LCBbcFNyY10sICM0ICA7Ly8gajAKLSAgICAgICAgTERSICAgICB4aTUsIFtwU3JjLCAjNCoxNi00XSAgOy8vIGo0Ci0gICAgICAgIExEUiAgICAgeGk2LCBbcFNyYywgIzIqMTYtNF0gIDsvLyBqMgotICAgICAgICBMRFIgICAgIHhpNywgW3BTcmMsICM2KjE2LTRdICA7Ly8gajYKLSAgICAgICAgCi0gICAgICAgIDsvLyBTY2FsZSBFdmVuIFZhbHVlcwotICAgICAgICBJRiAiJGluc2NhbGUiPSJzMTYiIDsvLyAxNngxNiBtdWwKLVNISUZUICAgICAgIFNFVEEgICAgMTIKLSAgICAgICAgICAgIExEUiAgICAgeGkwLCBbcFNjYWxlXSwgIzQKLSAgICAgICAgICAgIExEUiAgICAgeGkxLCBbcFNjYWxlLCAjNCoxNi00XSAgICAgICAgCi0gICAgICAgICAgICBMRFIgICAgIHhpMiwgW3BTY2FsZSwgIzIqMTYtNF0KLSAgICAgICAgICAgIE1PViAgICAgeGl0LCAjMTw8KFNISUZULTEpCi0gICAgICAgICAgICBTTUxBQkIgIHhpMywgeGkwLCB4aTQsIHhpdAotICAgICAgICAgICAgU01MQVRUICB4aTQsIHhpMCwgeGk0LCB4aXQKLSAgICAgICAgICAgIFNNTEFCQiAgeGkwLCB4aTEsIHhpNSwgeGl0Ci0gICAgICAgICAgICBTTUxBVFQgIHhpNSwgeGkxLCB4aTUsIHhpdAotICAgICAgICAgICAgTU9WICAgICB4aTMsIHhpMywgQVNSICNTSElGVAotICAgICAgICAgICAgUEtIQlQgICB4aTQsIHhpMywgeGk0LCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIExEUiAgICAgeGkzLCBbcFNjYWxlLCAjNioxNi00XQotICAgICAgICAgICAgU01MQUJCICB4aTEsIHhpMiwgeGk2LCB4aXQKLSAgICAgICAgICAgIFNNTEFUVCAgeGk2LCB4aTIsIHhpNiwgeGl0Ci0gICAgICAgICAgICBNT1YgICAgIHhpMCwgeGkwLCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpNSwgeGkwLCB4aTUsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgU01MQUJCICB4aTIsIHhpMywgeGk3LCB4aXQKLSAgICAgICAgICAgIFNNTEFUVCAgeGk3LCB4aTMsIHhpNywgeGl0Ci0gICAgICAgICAgICBNT1YgICAgIHhpMSwgeGkxLCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpNiwgeGkxLCB4aTYsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgQVNSICNTSElGVAotICAgICAgICAgICAgUEtIQlQgICB4aTcsIHhpMiwgeGk3LCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRpbnNjYWxlIj0iczMyIiA7Ly8gMzJ4MTYgbXVsCi1TSElGVCAgICAgICBTRVRBICAgICgxMis4LTE2KQotICAgICAgICAgICAgTU9WICAgICB4aXQsICMxPDwoU0hJRlQtMSkKLSAgICAgICAgICAgIExEUiAgICAgeGkwLCBbcFNjYWxlXSwgIzgKLSAgICAgICAgICAgIExEUiAgICAgeGkxLCBbcFNjYWxlLCAjMCozMis0LThdCi0gICAgICAgICAgICBMRFIgICAgIHhpMiwgW3BTY2FsZSwgIzQqMzItOF0KLSAgICAgICAgICAgIExEUiAgICAgeGkzLCBbcFNjYWxlLCAjNCozMis0LThdICAgICAgICAgICAgCi0gICAgICAgICAgICBTTUxBV0IgIHhpMCwgeGkwLCB4aTQsIHhpdAotICAgICAgICAgICAgU01MQVdUICB4aTEsIHhpMSwgeGk0LCB4aXQKLSAgICAgICAgICAgIFNNTEFXQiAgeGkyLCB4aTIsIHhpNSwgeGl0Ci0gICAgICAgICAgICBTTUxBV1QgIHhpMywgeGkzLCB4aTUsIHhpdCAgICAgICAgICAgIAotICAgICAgICAgICAgTU9WICAgICB4aTAsIHhpMCwgQVNSICNTSElGVAotICAgICAgICAgICAgUEtIQlQgICB4aTQsIHhpMCwgeGkxLCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIE1PViAgICAgeGkyLCB4aTIsIEFTUiAjU0hJRlQgICAgICAgICAgICAKLSAgICAgICAgICAgIFBLSEJUICAgeGk1LCB4aTIsIHhpMywgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBMRFIgICAgIHhpMCwgW3BTY2FsZSwgIzIqMzItOF0KLSAgICAgICAgICAgIExEUiAgICAgeGkxLCBbcFNjYWxlLCAjMiozMis0LThdCi0gICAgICAgICAgICBMRFIgICAgIHhpMiwgW3BTY2FsZSwgIzYqMzItOF0KLSAgICAgICAgICAgIExEUiAgICAgeGkzLCBbcFNjYWxlLCAjNiozMis0LThdICAgICAgICAgICAgCi0gICAgICAgICAgICBTTUxBV0IgIHhpMCwgeGkwLCB4aTYsIHhpdAotICAgICAgICAgICAgU01MQVdUICB4aTEsIHhpMSwgeGk2LCB4aXQKLSAgICAgICAgICAgIFNNTEFXQiAgeGkyLCB4aTIsIHhpNywgeGl0Ci0gICAgICAgICAgICBTTUxBV1QgIHhpMywgeGkzLCB4aTcsIHhpdCAgICAgICAgICAgIAotICAgICAgICAgICAgTU9WICAgICB4aTAsIHhpMCwgQVNSICNTSElGVAotICAgICAgICAgICAgUEtIQlQgICB4aTYsIHhpMCwgeGkxLCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIE1PViAgICAgeGkyLCB4aTIsIEFTUiAjU0hJRlQgICAgICAgICAgICAKLSAgICAgICAgICAgIFBLSEJUICAgeGk3LCB4aTIsIHhpMywgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgIEVORElGCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIG9kZCB2YWx1ZXMKLSAgICAgICAgTERSICAgICB4aTAsIFtwU3JjLCAjMSoxNi00XSAgICAgIDsvLyBqMQotICAgICAgICBMRFIgICAgIHhpMSwgW3BTcmMsICM3KjE2LTRdICAgICAgOy8vIGo3Ci0gICAgICAgIExEUiAgICAgeGkyLCBbcFNyYywgIzUqMTYtNF0gICAgICA7Ly8gajUKLSAgICAgICAgTERSICAgICB4aTMsIFtwU3JjLCAjMyoxNi00XSAgICAgIDsvLyBqMwotICAgICAgICAKLSAgICAgICAgSUYgIHtUUlVFfQotICAgICAgICAgICAgOy8vIHNob3J0Y3V0IGlmIG9kZCB2YWx1ZXMgMAotICAgICAgICAgICAgVEVRICAgICB4aTAsICMwCi0gICAgICAgICAgICBURVFFUSAgIHhpMSwgIzAKLSAgICAgICAgICAgIFRFUUVRICAgeGkyLCAjMAotICAgICAgICAgICAgVEVRRVEgICB4aTMsICMwCi0gICAgICAgICAgICBCRVEgICAgIHY2T2RkWmVybyRfRgotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgOy8vIFN0b3JlIHNjYWxlZCBldmVuIHZhbHVlcwotICAgICAgICBTVE1JQSAgIHBEZXN0LCB7eGk0LCB4aTUsIHhpNiwgeGk3fQotICAgICAgICAKLSAgICAgICAgOy8vIFNjYWxlIG9kZCB2YWx1ZXMKLSAgICAgICAgSUYgIiRpbnNjYWxlIj0iczE2IgotICAgICAgICAgICAgOy8vIFBlcmZvcm0gQUFOIFNjYWxlCi0gICAgICAgICAgICBMRFIgICAgIHhpNCwgW3BTY2FsZSwgIzEqMTYtNF0KLSAgICAgICAgICAgIExEUiAgICAgeGk1LCBbcFNjYWxlLCAjNyoxNi00XSAgICAgICAgCi0gICAgICAgICAgICBMRFIgICAgIHhpNiwgW3BTY2FsZSwgIzUqMTYtNF0KLSAgICAgICAgICAgIFNNTEFCQiAgeGk3LCB4aTAsIHhpNCwgeGl0Ci0gICAgICAgICAgICBTTUxBVFQgIHhpMCwgeGkwLCB4aTQsIHhpdAotICAgICAgICAgICAgU01MQUJCICB4aTQsIHhpMSwgeGk1LCB4aXQKLSAgICAgICAgICAgIFNNTEFUVCAgeGkxLCB4aTEsIHhpNSwgeGl0Ci0gICAgICAgICAgICBNT1YgICAgIHhpNywgeGk3LCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpMCwgeGk3LCB4aTAsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgTERSICAgICB4aTcsIFtwU2NhbGUsICMzKjE2LTRdCi0gICAgICAgICAgICBTTUxBQkIgIHhpNSwgeGkyLCB4aTYsIHhpdAotICAgICAgICAgICAgU01MQVRUICB4aTIsIHhpMiwgeGk2LCB4aXQKLSAgICAgICAgICAgIE1PViAgICAgeGk0LCB4aTQsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGkxLCB4aTQsIHhpMSwgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBTTUxBQkIgIHhpNiwgeGkzLCB4aTcsIHhpdAotICAgICAgICAgICAgU01MQVRUICB4aTMsIHhpMywgeGk3LCB4aXQKLSAgICAgICAgICAgIE1PViAgICAgeGk1LCB4aTUsIEFTUiAjU0hJRlQKLSAgICAgICAgICAgIFBLSEJUICAgeGkyLCB4aTUsIHhpMiwgTFNMICMoMTYtU0hJRlQpCi0gICAgICAgICAgICBNT1YgICAgIHhpNiwgeGk2LCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpMywgeGk2LCB4aTMsIExTTCAjKDE2LVNISUZUKQotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJGluc2NhbGUiPSJzMzIiIDsvLyAzMngxNiBtdWwKLSAgICAgICAgICAgIExEUiAgICAgeGk0LCBbcFNjYWxlLCAjMSozMi04XQotICAgICAgICAgICAgTERSICAgICB4aTUsIFtwU2NhbGUsICMxKjMyKzQtOF0KLSAgICAgICAgICAgIExEUiAgICAgeGk2LCBbcFNjYWxlLCAjNyozMi04XQotICAgICAgICAgICAgTERSICAgICB4aTcsIFtwU2NhbGUsICM3KjMyKzQtOF0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNNTEFXQiAgeGk0LCB4aTQsIHhpMCwgeGl0Ci0gICAgICAgICAgICBTTUxBV1QgIHhpNSwgeGk1LCB4aTAsIHhpdAotICAgICAgICAgICAgU01MQVdCICB4aTYsIHhpNiwgeGkxLCB4aXQKLSAgICAgICAgICAgIFNNTEFXVCAgeGk3LCB4aTcsIHhpMSwgeGl0ICAgICAgICAgICAgCi0gICAgICAgICAgICBNT1YgICAgIHhpNCwgeGk0LCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpMCwgeGk0LCB4aTUsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgTU9WICAgICB4aTYsIHhpNiwgQVNSICNTSElGVCAgICAgICAgICAgIAotICAgICAgICAgICAgUEtIQlQgICB4aTEsIHhpNiwgeGk3LCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgICAgIExEUiAgICAgeGk0LCBbcFNjYWxlLCAjNSozMi04XQotICAgICAgICAgICAgTERSICAgICB4aTUsIFtwU2NhbGUsICM1KjMyKzQtOF0KLSAgICAgICAgICAgIExEUiAgICAgeGk2LCBbcFNjYWxlLCAjMyozMi04XQotICAgICAgICAgICAgTERSICAgICB4aTcsIFtwU2NhbGUsICMzKjMyKzQtOF0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNNTEFXQiAgeGk0LCB4aTQsIHhpMiwgeGl0Ci0gICAgICAgICAgICBTTUxBV1QgIHhpNSwgeGk1LCB4aTIsIHhpdAotICAgICAgICAgICAgU01MQVdCICB4aTYsIHhpNiwgeGkzLCB4aXQKLSAgICAgICAgICAgIFNNTEFXVCAgeGk3LCB4aTcsIHhpMywgeGl0ICAgICAgICAgICAgCi0gICAgICAgICAgICBNT1YgICAgIHhpNCwgeGk0LCBBU1IgI1NISUZUCi0gICAgICAgICAgICBQS0hCVCAgIHhpMiwgeGk0LCB4aTUsIExTTCAjKDE2LVNISUZUKQotICAgICAgICAgICAgTU9WICAgICB4aTYsIHhpNiwgQVNSICNTSElGVCAgICAgICAgICAgIAotICAgICAgICAgICAgUEtIQlQgICB4aTMsIHhpNiwgeGk3LCBMU0wgIygxNi1TSElGVCkKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgeGl0LCA9MHgwMDAxMDAwMSAgICAgICAgOy8vIHJvdW5kaW5nIGNvbnN0YW50Ci0gICAgICAgIFNBREQxNiB4aTUsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoxK2o3KS8yCi0gICAgICAgIFNIQUREMTYgeGk1LCB4aTUsIHhpdAotICAgICAgICAKLSAgICAgICAgU1NVQjE2ICB4aTYsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gajEtajcKLSAgICAgICAgU0FERDE2IHhpNywgeGkyLCB4aTMgICAgICAgICAgIDsvLyAoajUrajMpLzIKLSAgICAgICAgU0hBREQxNiB4aTcsIHhpNywgeGl0Ci0gICAgICAgIAotICAgICAgICBTU1VCMTYgIHhpNCwgeGkyLCB4aTMgICAgICAgICAgIDsvLyBqNS1qMwotICAgICAgICAKLSAgICAgICAgU1NVQjE2ICB4aTMsIHhpNSwgeGk3ICAgICAgICAgICA7Ly8gKGk1LWk3KS8yCi0gICAgICAgIAotICAgICAgICBQS0hCVCAgIHhpMCwgeGk2LCB4aTQsIExTTCMxNiAgIDsvLyBbaTQsaTZdIHJvdyBhCi0gICAgICAgIFBLSFRCICAgeGkxLCB4aTQsIHhpNiwgQVNSIzE2ICAgOy8vIFtpNCxpNl0gcm93IGIKLSAgICAgICAgCi0gICAgICAgIFNNVUFEWCAgeGkyLCB4aTAsIGNzUGlCeTggICAgICAgOy8vIHJvd2EgYnkgW2Msc10KLSAgICAgICAgU01VQURYICB4aTQsIHhpMSwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YiBieSBbYyxzXQotICAgICAgICBTTVVTRCAgIHhpMCwgeGkwLCBjc1BpQnk4ICAgICAgIDsvLyByb3dhIGJ5IFstcyxjXSAgIAotICAgICAgICBTTVVTRCAgIHhpNiwgeGkxLCBjc1BpQnk4ICAgICAgIDsvLyByb3diIGJ5IFstcyxjXQotICAgICAgICAgICAgICAgIAotICAgICAgICBTTVVMQkIgIHhpMSwgeGkzLCBMb29wUlIyCi0gICAgICAgIFNNVUxUQiAgeGkzLCB4aTMsIExvb3BSUjIKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgUEtIVEIgICB4aDQsIHhpNCwgeGkyLCBBU1IjMTYgICA7Ly8gaDQvNAotICAgICAgICBQS0hUQiAgIHhoNiwgeGk2LCB4aTAsIEFTUiMxNiAgIDsvLyBoNi80Ci0gICAgICAgIFNIQUREMTYgeGg3LCB4aTUsIHhpNyAgICAgICAgICAgOy8vIChpNStpNykvNAotICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8geGkwLHhpMSx4aTIseGkzIG5vdyBmcmVlCi0gICAgICAgIDsvLyBJU3RhZ2UgNCwzLCByb3dzIDJ0bzMgeDEvMgotICAgICAgICAKLSAgICAgICAgTU9WICAgICB4aTMsIHhpMywgTFNMICMxCi0gICAgICAgIFBLSFRCICAgeGg1LCB4aTMsIHhpMSwgQVNSIzE1ICAgOy8vIGg1LzQKLSAgICAgICAgTERSRCAgICB4aTAsIFtwRGVzdCwgIzhdICAgICAgICA7Ly8gajIsajYgc2NhbGVkCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBJU3RhZ2UgMiwgcm93czR0bzcKLSAgICAgICAgU1NVQjE2ICB4ZzYsIHhoNiwgeGg3Ci0gICAgICAgIFNTVUIxNiAgeGc1LCB4aDUsIHhnNiAgICAgICAgCi0gICAgICAgIFNTVUIxNiAgeGc0LCB4aDQsIHhnNQotICAgICAgICAgICAgICAgIAotICAgICAgICBTU1VCMTYgIHhpMiwgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajItajYpCi0gICAgICAgIAotICAgICAgICBTSEFERDE2IHhpMywgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajIrajYpLzIKLSAgICAgICAgCi0gICAgICAgIFNNVUxCQiAgeGkwLCB4aTIsIExvb3BSUjIKLSAgICAgICAgU01VTFRCICB4aTIsIHhpMiwgTG9vcFJSMgotICAgICAgICAKLSAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgTFNMICMxCi0gICAgICAgIFBLSFRCICAgeGgyLCB4aTIsIHhpMCwgQVNSIzE1ICAgOy8vIGkyKnNxcnQoMikvNAotICAgICAgICAKLSAgICAgICAgOy8vIHhpMCwgeGkxIG5vdyBmcmVlCi0gICAgICAgIDsvLyBJU3RhZ2UgNCwzIHJvd3MgMHRvMSB4IDEvMgotICAgICAgICBMRFJEICAgIHhpMCwgW3BEZXN0XSAgICAgICAgICAgIDsvLyBqMCwgajQgc2NhbGVkCi0gICAgICAgIFNTVUIxNiAgeGgyLCB4aDIsIHhpMwotICAgICAgICBBRERTICAgIExvb3BSUjIsIExvb3BSUjIsICMyPDwyOSAgICA7Ly8gZG9uZSB0d28gcm93cwotICAgICAgICAKLSAgICAgICAgU0hBREQxNiB4aDAsIHhpMCwgeGkxCi0gICAgICAgIFNIU1VCMTYgeGgxLCB4aTAsIHhpMSAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBJU3RhZ2UgMiByb3dzIDB0bzMgeCAxLzIKLSAgICAgICAgU0hTVUIxNiB4ZzIsIHhoMSwgeGgyCi0gICAgICAgIFNIQUREMTYgeGcxLCB4aDEsIHhoMgotICAgICAgICBTSFNVQjE2IHhnMywgeGgwLCB4aDMKLSAgICAgICAgU0hBREQxNiB4ZzAsIHhoMCwgeGgzCi0gICAgICAgIAotICAgICAgICA7Ly8gSVN0YWdlIDEgYWxsIHJvd3MKLSAgICAgICAgU0FERDE2ICB4ZjMsIHhnMywgeGc0Ci0gICAgICAgIFNTVUIxNiAgeGY0LCB4ZzMsIHhnNAotICAgICAgICBTQUREMTYgIHhmMiwgeGcyLCB4ZzUKLSAgICAgICAgU1NVQjE2ICB4ZjUsIHhnMiwgeGc1Ci0gICAgICAgIFNBREQxNiAgeGYxLCB4ZzEsIHhnNgotICAgICAgICBTU1VCMTYgIHhmNiwgeGcxLCB4ZzYKLSAgICAgICAgU0FERDE2ICB4ZjAsIHhnMCwgeGc3Ci0gICAgICAgIFNTVUIxNiAgeGY3LCB4ZzAsIHhnNwotICAgICAgICAKLSAgICAgICAgOy8vIFRyYW5zcG9zZSwgc3RvcmUgYW5kIGxvb3AKLSAgICAgICAgUEtIQlQgICByYTAxLCB4ZjAsIHhmMSwgTFNMICMxNgotICAgICAgICBQS0hUQiAgIHJiMDEsIHhmMSwgeGYwLCBBU1IgIzE2Ci0gICAgICAgIAotICAgICAgICBQS0hCVCAgIHJhMjMsIHhmMiwgeGYzLCBMU0wgIzE2Ci0gICAgICAgIFBLSFRCICAgcmIyMywgeGYzLCB4ZjIsIEFTUiAjMTYKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgcmE0NSwgeGY0LCB4ZjUsIExTTCAjMTYKLSAgICAgICAgUEtIVEIgICByYjQ1LCB4ZjUsIHhmNCwgQVNSICMxNgotICAgICAgICAKLSAgICAgICAgUEtIQlQgICByYTY3LCB4ZjYsIHhmNywgTFNMICMxNgotICAgICAgICBTVE1JQSAgIHBEZXN0ISwge3JhMDEsIHJhMjMsIHJhNDUsIHJhNjd9ICAgICAgCi0gICAgICAgIFBLSFRCICAgcmI2NywgeGY3LCB4ZjYsIEFTUiAjMTYKLSAgICAgICAgU1RNSUEgICBwRGVzdCEsIHtyYjAxLCByYjIzLCByYjQ1LCByYjY3fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBCQ0MgICAgIHY2X2lkY3RfY29sJF9GCi0gICAgICAgIAotICAgICAgICBTVUIgICAgIHBTcmMsIHBEZXN0LCAjKDY0KjIpCi0gICAgICAgIE1fTERSICAgcERlc3QsIHBwRGVzdAotICAgICAgICBJRiAiJHN0cmlkZSI9InMiCi0gICAgICAgICAgICBNX0xEUiAgIHBTY2FsZSwgcFN0cmlkZSAKLSAgICAgICAgRU5ESUYKLSAgICAgICAgQiAgICAgICB2Nl9pZGN0X3JvdyRfRgotICAgICAgICAKLXY2T2RkWmVybyRfRgotICAgICAgICBTU1VCMTYgIHhpMiwgeGk2LCB4aTcgICAgICAgICAgIDsvLyAoajItajYpCi0gICAgICAgIFNIQUREMTYgeGkzLCB4aTYsIHhpNyAgICAgICAgICAgOy8vIChqMitqNikvMgotICAgICAgICAKLSAgICAgICAgU01VTEJCICB4aTAsIHhpMiwgTG9vcFJSMgotICAgICAgICBTTVVMVEIgIHhpMiwgeGkyLCBMb29wUlIyCi0gICAgICAgIAotICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBMU0wgIzEKLSAgICAgICAgUEtIVEIgICB4aDIsIHhpMiwgeGkwLCBBU1IjMTUgICA7Ly8gaTIqc3FydCgyKS80Ci0gICAgICAgIFNTVUIxNiAgeGgyLCB4aDIsIHhpMwotICAgICAgICAKLSAgICAgICAgOy8vIHhpMCwgeGkxIG5vdyBmcmVlCi0gICAgICAgIDsvLyBJU3RhZ2UgNCwzIHJvd3MgMHRvMSB4IDEvMgotICAgICAgICAKLSAgICAgICAgU0hBREQxNiB4aDAsIHhpNCwgeGk1Ci0gICAgICAgIFNIU1VCMTYgeGgxLCB4aTQsIHhpNSAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBJU3RhZ2UgMiByb3dzIDB0bzMgeCAxLzIKLSAgICAgICAgU0hTVUIxNiB4ZzIsIHhoMSwgeGgyCi0gICAgICAgIFNIQUREMTYgeGcxLCB4aDEsIHhoMgotICAgICAgICBTSFNVQjE2IHhnMywgeGgwLCB4aDMKLSAgICAgICAgU0hBREQxNiB4ZzAsIHhoMCwgeGgzCi0gICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIElTdGFnZSAxIGFsbCByb3dzCi0gICAgICAgIE1PViAgeGYzLCB4ZzMKLSAgICAgICAgTU9WICB4ZjQsIHhnMwotICAgICAgICBNT1YgIHhmMiwgeGcyCi0gICAgICAgIE1PViAgeGY1LCB4ZzIKLSAgICAgICAgTU9WICB4ZjEsIHhnMQotICAgICAgICBNT1YgIHhmNiwgeGcxCi0gICAgICAgIE1PViAgeGYwLCB4ZzAKLSAgICAgICAgTU9WICB4ZjcsIHhnMAotICAgICAgICAKLSAgICAgICAgOy8vIFRyYW5zcG9zZQotICAgICAgICBQS0hCVCAgIHJhMDEsIHhmMCwgeGYxLCBMU0wgIzE2Ci0gICAgICAgIFBLSFRCICAgcmIwMSwgeGYxLCB4ZjAsIEFTUiAjMTYKLSAgICAgICAgCi0gICAgICAgIFBLSEJUICAgcmEyMywgeGYyLCB4ZjMsIExTTCAjMTYKLSAgICAgICAgUEtIVEIgICByYjIzLCB4ZjMsIHhmMiwgQVNSICMxNgotICAgICAgICAKLSAgICAgICAgUEtIQlQgICByYTQ1LCB4ZjQsIHhmNSwgTFNMICMxNgotICAgICAgICBQS0hUQiAgIHJiNDUsIHhmNSwgeGY0LCBBU1IgIzE2Ci0gICAgICAgIAotICAgICAgICBQS0hCVCAgIHJhNjcsIHhmNiwgeGY3LCBMU0wgIzE2Ci0gICAgICAgIFBLSFRCICAgcmI2NywgeGY3LCB4ZjYsIEFTUiAjMTYKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgU1RNSUEgICBwRGVzdCEsIHtyYTAxLCByYTIzLCByYTQ1LCByYTY3fSAgICAgIAotICAgICAgICBBRERTICAgIExvb3BSUjIsIExvb3BSUjIsICMyPDwyOSAgICA7Ly8gZG9uZSB0d28gcm93cwotICAgICAgICBTVE1JQSAgIHBEZXN0ISwge3JiMDEsIHJiMjMsIHJiNDUsIHJiNjd9ICAgICAgCi0gICAgICAgIAotICAgICAgICBCQ0MgICAgIHY2X2lkY3RfY29sJF9GCi0gICAgICAgIFNVQiAgICAgcFNyYywgcERlc3QsICMoNjQqMikKLSAgICAgICAgTV9MRFIgICBwRGVzdCwgcHBEZXN0Ci0gICAgICAgIElGICIkc3RyaWRlIj0icyIKLSAgICAgICAgICAgIE1fTERSICAgcFNjYWxlLCBwU3RyaWRlIAotICAgICAgICBFTkRJRgotICAgICAgICAgICAgICAgCi0gICAgICAgIAotdjZfaWRjdF9yb3ckX0YKLSAgICAgICAgOy8vIElTdGFnZSA0LDMsIHJvd3M0dG83IHgxLzQKLSAgICAgICAgTERSICAgICB4aXQsID0weDAwMDEwMDAxICAgICAgICA7Ly8gcm91bmRpbmcgY29uc3RhbnQKLSAgICAgICAgTERSICAgICB4aTAsIFtwU3JjLCAjMSoxNl0gICAgICA7Ly8gajEKLSAgICAgICAgTERSICAgICB4aTEsIFtwU3JjLCAjNyoxNl0gICAgICA7Ly8gNCpqNwotICAgICAgICBMRFIgICAgIHhpMiwgW3BTcmMsICM1KjE2XSAgICAgIDsvLyBqNQotICAgICAgICBMRFIgICAgIHhpMywgW3BTcmMsICMzKjE2XSAgICAgIDsvLyBqMwotICAgICAgICAKLSAgICAgICAgU0hBREQxNiB4aTEsIHhpMSwgeGl0ICAgICAgICAgICA7Ly8gMipqNwotICAgICAgICBTSEFERDE2IHhpMSwgeGkxLCB4aXQgICAgICAgICAgIDsvLyBqNyAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFNIQUREMTYgeGk1LCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMStqNykvMgotICAgICAgICBTU1VCMTYgIHhpNiwgeGkwLCB4aTEgICAgICAgICAgIDsvLyBqMS1qNwotICAgICAgICBTSEFERDE2IHhpNywgeGkyLCB4aTMgICAgICAgICAgIDsvLyAoajUrajMpLzIKLSAgICAgICAgU1NVQjE2ICB4aTQsIHhpMiwgeGkzICAgICAgICAgICA7Ly8gajUtajMKLSAgICAgICAgCi0gICAgICAgIFNTVUIxNiAgeGkzLCB4aTUsIHhpNyAgICAgICAgICAgOy8vIChpNS1pNykvMgotICAgICAgICAKLSAgICAgICAgUEtIQlQgICB4aTAsIHhpNiwgeGk0LCBMU0wjMTYgICA7Ly8gW2k0LGk2XSByb3cgYQotICAgICAgICBQS0hUQiAgIHhpMSwgeGk0LCB4aTYsIEFTUiMxNiAgIDsvLyBbaTQsaTZdIHJvdyBiCi0gICAgICAgIAotICAgICAgICBTTVVBRFggIHhpMiwgeGkwLCBjc1BpQnk4ICAgICAgIDsvLyByb3dhIGJ5IFtjLHNdCi0gICAgICAgIFNNVUFEWCAgeGk0LCB4aTEsIGNzUGlCeTggICAgICAgOy8vIHJvd2IgYnkgW2Msc10KLSAgICAgICAgU01VU0QgICB4aTAsIHhpMCwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YSBieSBbLXMsY10gICAKLSAgICAgICAgU01VU0QgICB4aTYsIHhpMSwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YiBieSBbLXMsY10KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgU01VTEJCICB4aTEsIHhpMywgTG9vcFJSMgotICAgICAgICBTTVVMVEIgIHhpMywgeGkzLCBMb29wUlIyCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIFBLSFRCICAgeGg0LCB4aTQsIHhpMiwgQVNSIzE2ICAgOy8vIGg0LzQKLSAgICAgICAgUEtIVEIgICB4aDYsIHhpNiwgeGkwLCBBU1IjMTYgICA7Ly8gaDYvNAotICAgICAgICBTSEFERDE2IHhoNywgeGk1LCB4aTcgICAgICAgICAgIDsvLyAoaTUraTcpLzQKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgeGkzLCB4aTMsIExTTCAjMQotICAgICAgICBQS0hUQiAgIHhoNSwgeGkzLCB4aTEsIEFTUiMxNSAgIDsvLyBoNS80Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIHhpMCx4aTEseGkyLHhpMyBub3cgZnJlZQotICAgICAgICA7Ly8gSVN0YWdlIDQsMywgcm93cyAydG8zIHgxLzIKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgeGkwLCBbcFNyYywgIzIqMTZdICAgICAgOy8vIGoyCi0gICAgICAgIExEUiAgICAgeGkxLCBbcFNyYywgIzYqMTZdICAgICAgOy8vIDIqajYKLSAgICAgICAgCi0gICAgICAgIDsvLyBJU3RhZ2UgMiwgcm93czR0bzcKLSAgICAgICAgU1NVQjE2ICB4ZzYsIHhoNiwgeGg3Ci0gICAgICAgIFNTVUIxNiAgeGc1LCB4aDUsIHhnNgotICAgICAgICBTU1VCMTYgIHhnNCwgeGg0LCB4ZzUKLSAgICAgICAgCi0gICAgICAgIFNIQUREMTYgeGkxLCB4aTEsIHhpdCAgICAgICAgICAgOy8vIGo2Ci0gICAgICAgIFNTVUIxNiAgeGkyLCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMi1qNikgICAgICAgIAotICAgICAgICBTSEFERDE2IHhpMywgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajIrajYpLzIKLSAgICAgICAgCi0gICAgICAgIFNNVUxCQiAgeGkwLCB4aTIsIExvb3BSUjIKLSAgICAgICAgU01VTFRCICB4aTIsIHhpMiwgTG9vcFJSMgotICAgICAgICAKLSAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgTFNMICMxCi0gICAgICAgIAotICAgICAgICBQS0hUQiAgIHhoMiwgeGkyLCB4aTAsIEFTUiMxNSAgIDsvLyBpMipzcXJ0KDIpLzQKLSAgICAgICAgCi0gICAgICAgIDsvLyB4aTAsIHhpMSBub3cgZnJlZQotICAgICAgICA7Ly8gSVN0YWdlIDQsMyByb3dzIDB0bzEgeCAxLzIKLSAgICAgICAgTERSICAgICB4aTEsIFtwU3JjLCAjNCoxNl0gICAgICA7Ly8gajQKLSAgICAgICAgTERSICAgICB4aTAsIFtwU3JjXSwgIzQgICAgICAgICA7Ly8gajAKLQotICAgICAgICBTU1VCMTYgIHhoMiwgeGgyLCB4aTMKLSAgICAgICAgQUREUyAgICBMb29wUlIyLCBMb29wUlIyLCAjMjw8MjkgICAgOy8vIGRvbmUgdHdvIHJvd3MKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgeGkwLCB4aTAsIHhpdCwgTFNMICMyICAgOy8vIGVuc3VyZSBjb3JyZWN0IHJvdW5kCi0gICAgICAgIFNIQUREMTYgeGgwLCB4aTAsIHhpMSAgICAgICAgICAgOy8vIG9mIERDIHJlc3VsdAotICAgICAgICBTSFNVQjE2IHhoMSwgeGkwLCB4aTEKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIElTdGFnZSAyIHJvd3MgMHRvMyB4IDEvMgotICAgICAgICBTSFNVQjE2IHhnMiwgeGgxLCB4aDIKLSAgICAgICAgU0hBREQxNiB4ZzEsIHhoMSwgeGgyCi0gICAgICAgIFNIU1VCMTYgeGczLCB4aDAsIHhoMwotICAgICAgICBTSEFERDE2IHhnMCwgeGgwLCB4aDMKLSAgICAgICAgCi0gICAgICAgIDsvLyBJU3RhZ2UgMSBhbGwgcm93cwotICAgICAgICBTSEFERDE2IHhmMywgeGczLCB4ZzQKLSAgICAgICAgU0hTVUIxNiB4ZjQsIHhnMywgeGc0Ci0gICAgICAgIFNIQUREMTYgeGYyLCB4ZzIsIHhnNQotICAgICAgICBTSFNVQjE2IHhmNSwgeGcyLCB4ZzUKLSAgICAgICAgU0hBREQxNiB4ZjEsIHhnMSwgeGc2Ci0gICAgICAgIFNIU1VCMTYgeGY2LCB4ZzEsIHhnNgotICAgICAgICBTSEFERDE2IHhmMCwgeGcwLCB4ZzcKLSAgICAgICAgU0hTVUIxNiB4ZjcsIHhnMCwgeGc3Ci0gICAgICAgIAotICAgICAgICA7Ly8gU2F0dXJhdGUKLSAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InU4IikKLSAgICAgICAgICAgIFVTQVQxNiAgeGYwLCAjOCwgeGYwCi0gICAgICAgICAgICBVU0FUMTYgIHhmMSwgIzgsIHhmMQotICAgICAgICAgICAgVVNBVDE2ICB4ZjIsICM4LCB4ZjIKLSAgICAgICAgICAgIFVTQVQxNiAgeGYzLCAjOCwgeGYzCi0gICAgICAgICAgICBVU0FUMTYgIHhmNCwgIzgsIHhmNAotICAgICAgICAgICAgVVNBVDE2ICB4ZjUsICM4LCB4ZjUKLSAgICAgICAgICAgIFVTQVQxNiAgeGY2LCAjOCwgeGY2Ci0gICAgICAgICAgICBVU0FUMTYgIHhmNywgIzgsIHhmNyAgICAgICAgCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICgiJG91dHNpemUiPSJzOSIpCi0gICAgICAgICAgICBTU0FUMTYgIHhmMCwgIzksIHhmMAotICAgICAgICAgICAgU1NBVDE2ICB4ZjEsICM5LCB4ZjEKLSAgICAgICAgICAgIFNTQVQxNiAgeGYyLCAjOSwgeGYyCi0gICAgICAgICAgICBTU0FUMTYgIHhmMywgIzksIHhmMwotICAgICAgICAgICAgU1NBVDE2ICB4ZjQsICM5LCB4ZjQKLSAgICAgICAgICAgIFNTQVQxNiAgeGY1LCAjOSwgeGY1Ci0gICAgICAgICAgICBTU0FUMTYgIHhmNiwgIzksIHhmNgotICAgICAgICAgICAgU1NBVDE2ICB4ZjcsICM5LCB4ZjcgICAgICAgIAotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgOy8vIFRyYW5zcG9zZSB0byBSb3csIFBhY2sgYW5kIHN0b3JlCi0gICAgICAgIElGICgiJG91dHNpemUiPSJ1OCIpCi0gICAgICAgICAgICBPUlIgICAgIHhmMCwgeGYwLCB4ZjEsIExTTCAjOCA7Ly8gWyBiMSBiMCBhMSBhMCBdCi0gICAgICAgICAgICBPUlIgICAgIHhmMiwgeGYyLCB4ZjMsIExTTCAjOCA7Ly8gWyBiMyBiMiBhMyBhMiBdCi0gICAgICAgICAgICBPUlIgICAgIHhmNCwgeGY0LCB4ZjUsIExTTCAjOCA7Ly8gWyBiNSBiNCBhNSBhNCBdCi0gICAgICAgICAgICBPUlIgICAgIHhmNiwgeGY2LCB4ZjcsIExTTCAjOCA7Ly8gWyBiNyBiNiBhNyBhNiBdCi0gICAgICAgICAgICBQS0hCVCAgIHJhMDEsIHhmMCwgeGYyLCBMU0wgIzE2Ci0gICAgICAgICAgICBQS0hUQiAgIHJiMDEsIHhmMiwgeGYwLCBBU1IgIzE2Ci0gICAgICAgICAgICBQS0hCVCAgIHJhMjMsIHhmNCwgeGY2LCBMU0wgIzE2Ci0gICAgICAgICAgICBQS0hUQiAgIHJiMjMsIHhmNiwgeGY0LCBBU1IgIzE2Ci0gICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmEwMSwgcmEyM30KLSAgICAgICAgICAgIElGICIkc3RyaWRlIj0icyIKLSAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgcFNjYWxlCi0gICAgICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JiMDEsIHJiMjN9Ci0gICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsIHBTY2FsZQotICAgICAgICAgICAgRUxTRSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgIygkc3RyaWRlKQotICAgICAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYjAxLCByYjIzfQotICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCAjKCRzdHJpZGUpCi0gICAgICAgICAgICBFTkRJRgotICAgICAgICBFTkRJRgotICAgICAgICBJRiAoIiRvdXRzaXplIj0iczkiKTpMT1I6KCIkb3V0c2l6ZSI9InMxNiIpICAgICAgICAKLSAgICAgICAgICAgIFBLSEJUICAgcmEwMSwgeGYwLCB4ZjEsIExTTCAjMTYKLSAgICAgICAgICAgIFBLSFRCICAgcmIwMSwgeGYxLCB4ZjAsIEFTUiAjMTYKLSAgICAgICAgCi0gICAgICAgICAgICBQS0hCVCAgIHJhMjMsIHhmMiwgeGYzLCBMU0wgIzE2Ci0gICAgICAgICAgICBQS0hUQiAgIHJiMjMsIHhmMywgeGYyLCBBU1IgIzE2Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFBLSEJUICAgcmE0NSwgeGY0LCB4ZjUsIExTTCAjMTYKLSAgICAgICAgICAgIFBLSFRCICAgcmI0NSwgeGY1LCB4ZjQsIEFTUiAjMTYKLSAgICAgICAgICAgIAotICAgICAgICAgICAgUEtIQlQgICByYTY3LCB4ZjYsIHhmNywgTFNMICMxNgotICAgICAgICAgICAgUEtIVEIgICByYjY3LCB4ZjcsIHhmNiwgQVNSICMxNgotICAgICAgICAgICAgCi0gICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmEwMSwgcmEyMywgcmE0NSwgcmE2N30gICAgICAKLSAgICAgICAgICAgIElGICIkc3RyaWRlIj0icyIKLSAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgcFNjYWxlCi0gICAgICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JiMDEsIHJiMjMsIHJiNDUsIHJiNjd9ICAgICAgCi0gICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsIHBTY2FsZQotICAgICAgICAgICAgRUxTRSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgIygkc3RyaWRlKQotICAgICAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYjAxLCByYjIzLCByYjQ1LCByYjY3fSAgICAgIAotICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCAjKCRzdHJpZGUpCi0gICAgICAgICAgICBFTkRJRgotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgQkNDICAgICB2Nl9pZGN0X3JvdyRfRgotICAgICAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTCi0KLQotICAgICAgICBJRiBDb3J0ZXhBOAotICAgICAgICAKLVNyYzAgICAgICAgICAgICBFUVUgIDcgICAgICAgICAgICAgIAotU3JjMSAgICAgICAgICAgIEVRVSAgOCAgICAgICAgICAgICAgCi1TcmMyICAgICAgICAgICAgRVFVICA5ICAgICAgICAgICAgICAKLVNyYzMgICAgICAgICAgICBFUVUgIDEwICAgICAgICAgICAgICAKLVNyYzQgICAgICAgICAgICBFUVUgIDExICAgICAgICAgICAgICAKLVNyYzUgICAgICAgICAgICBFUVUgIDEyICAgICAgICAgICAgICAKLVNyYzYgICAgICAgICAgICBFUVUgIDEzCi1TcmM3ICAgICAgICAgICAgRVFVICAxNAotVG1wICAgICAgICAgICAgIEVRVSAgMTUKLQotcVhqMCAgICAgICAgICAgIFFOIFNyYzAuUzE2IAotcVhqMSAgICAgICAgICAgIFFOIFNyYzEuUzE2Ci1xWGoyICAgICAgICAgICAgUU4gU3JjMi5TMTYKLXFYajMgICAgICAgICAgICBRTiBTcmMzLlMxNgotcVhqNCAgICAgICAgICAgIFFOIFNyYzQuUzE2Ci1xWGo1ICAgICAgICAgICAgUU4gU3JjNS5TMTYKLXFYajYgICAgICAgICAgICBRTiBTcmM2LlMxNgotcVhqNyAgICAgICAgICAgIFFOIFNyYzcuUzE2Ci1xWGp0ICAgICAgICAgICAgUU4gVG1wLlMxNgotCi1kWGowbG8gICAgICAgICAgRE4gKFNyYzAqMikuUzE2Ci1kWGowaGkgICAgICAgICAgRE4gKFNyYzAqMisxKS5TMTYKLWRYajFsbyAgICAgICAgICBETiAoU3JjMSoyKS5TMTYKLWRYajFoaSAgICAgICAgICBETiAoU3JjMSoyKzEpLlMxNgotZFhqMmxvICAgICAgICAgIEROIChTcmMyKjIpLlMxNgotZFhqMmhpICAgICAgICAgIEROIChTcmMyKjIrMSkuUzE2Ci1kWGozbG8gICAgICAgICAgRE4gKFNyYzMqMikuUzE2Ci1kWGozaGkgICAgICAgICAgRE4gKFNyYzMqMisxKS5TMTYKLWRYajRsbyAgICAgICAgICBETiAoU3JjNCoyKS5TMTYKLWRYajRoaSAgICAgICAgICBETiAoU3JjNCoyKzEpLlMxNgotZFhqNWxvICAgICAgICAgIEROIChTcmM1KjIpLlMxNgotZFhqNWhpICAgICAgICAgIEROIChTcmM1KjIrMSkuUzE2Ci1kWGo2bG8gICAgICAgICAgRE4gKFNyYzYqMikuUzE2Ci1kWGo2aGkgICAgICAgICAgRE4gKFNyYzYqMisxKS5TMTYKLWRYajdsbyAgICAgICAgICBETiAoU3JjNyoyKS5TMTYKLWRYajdoaSAgICAgICAgICBETiAoU3JjNyoyKzEpLlMxNgotZFhqdGxvICAgICAgICAgIEROIChUbXAqMikuUzE2Ci1kWGp0aGkgICAgICAgICAgRE4gKFRtcCoyKzEpLlMxNgotCi1xWGkwICAgICAgICAgICAgUU4gcVhqMAotcVhpMSAgICAgICAgICAgIFFOIHFYajQKLXFYaTIgICAgICAgICAgICBRTiBxWGoyCi1xWGkzICAgICAgICAgICAgUU4gcVhqNwotcVhpNCAgICAgICAgICAgIFFOIHFYajUKLXFYaTUgICAgICAgICAgICBRTiBxWGp0Ci1xWGk2ICAgICAgICAgICAgUU4gcVhqMQotcVhpNyAgICAgICAgICAgIFFOIHFYajYKLXFYaXQgICAgICAgICAgICBRTiBxWGozCi0KLWRYaTBsbyAgICAgICAgICBETiBkWGowbG8KLWRYaTBoaSAgICAgICAgICBETiBkWGowaGkKLWRYaTFsbyAgICAgICAgICBETiBkWGo0bG8KLWRYaTFoaSAgICAgICAgICBETiBkWGo0aGkKLWRYaTJsbyAgICAgICAgICBETiBkWGoybG8KLWRYaTJoaSAgICAgICAgICBETiBkWGoyaGkKLWRYaTNsbyAgICAgICAgICBETiBkWGo3bG8KLWRYaTNoaSAgICAgICAgICBETiBkWGo3aGkKLWRYaTRsbyAgICAgICAgICBETiBkWGo1bG8KLWRYaTRoaSAgICAgICAgICBETiBkWGo1aGkKLWRYaTVsbyAgICAgICAgICBETiBkWGp0bG8KLWRYaTVoaSAgICAgICAgICBETiBkWGp0aGkKLWRYaTZsbyAgICAgICAgICBETiBkWGoxbG8KLWRYaTZoaSAgICAgICAgICBETiBkWGoxaGkKLWRYaTdsbyAgICAgICAgICBETiBkWGo2bG8KLWRYaTdoaSAgICAgICAgICBETiBkWGo2aGkKLWRYaXRsbyAgICAgICAgICBETiBkWGozbG8KLWRYaXRoaSAgICAgICAgICBETiBkWGozaGkKLQotcVhoMCAgICAgICAgICAgIFFOIHFYaXQKLXFYaDEgICAgICAgICAgICBRTiBxWGkwCi1xWGgyICAgICAgICAgICAgUU4gcVhpMgotcVhoMyAgICAgICAgICAgIFFOIHFYaTMKLXFYaDQgICAgICAgICAgICBRTiBxWGk3Ci1xWGg1ICAgICAgICAgICAgUU4gcVhpNQotcVhoNiAgICAgICAgICAgIFFOIHFYaTQKLXFYaDcgICAgICAgICAgICBRTiBxWGkxCi1xWGh0ICAgICAgICAgICAgUU4gcVhpNgotCi1kWGgwbG8gICAgICAgICAgRE4gZFhpdGxvCi1kWGgwaGkgICAgICAgICAgRE4gZFhpdGhpCi1kWGgxbG8gICAgICAgICAgRE4gZFhpMGxvCi1kWGgxaGkgICAgICAgICAgRE4gZFhpMGhpCi1kWGgybG8gICAgICAgICAgRE4gZFhpMmxvCi1kWGgyaGkgICAgICAgICAgRE4gZFhpMmhpCi1kWGgzbG8gICAgICAgICAgRE4gZFhpM2xvCi1kWGgzaGkgICAgICAgICAgRE4gZFhpM2hpCi1kWGg0bG8gICAgICAgICAgRE4gZFhpN2xvCi1kWGg0aGkgICAgICAgICAgRE4gZFhpN2hpCi1kWGg1bG8gICAgICAgICAgRE4gZFhpNWxvCi1kWGg1aGkgICAgICAgICAgRE4gZFhpNWhpCi1kWGg2bG8gICAgICAgICAgRE4gZFhpNGxvCi1kWGg2aGkgICAgICAgICAgRE4gZFhpNGhpCi1kWGg3bG8gICAgICAgICAgRE4gZFhpMWxvCi1kWGg3aGkgICAgICAgICAgRE4gZFhpMWhpCi1kWGh0bG8gICAgICAgICAgRE4gZFhpNmxvCi1kWGh0aGkgICAgICAgICAgRE4gZFhpNmhpCi0KLXFYZzAgICAgICAgICAgICBRTiBxWGgyCi1xWGcxICAgICAgICAgICAgUU4gcVhodAotcVhnMiAgICAgICAgICAgIFFOIHFYaDEKLXFYZzMgICAgICAgICAgICBRTiBxWGgwCi1xWGc0ICAgICAgICAgICAgUU4gcVhoNAotcVhnNSAgICAgICAgICAgIFFOIHFYaDUKLXFYZzYgICAgICAgICAgICBRTiBxWGg2Ci1xWGc3ICAgICAgICAgICAgUU4gcVhoNwotcVhndCAgICAgICAgICAgIFFOIHFYaDMKLQotcVhmMCAgICAgICAgICAgIFFOIHFYZzYKLXFYZjEgICAgICAgICAgICBRTiBxWGc1Ci1xWGYyICAgICAgICAgICAgUU4gcVhnNAotcVhmMyAgICAgICAgICAgIFFOIHFYZ3QKLXFYZjQgICAgICAgICAgICBRTiBxWGczCi1xWGY1ICAgICAgICAgICAgUU4gcVhnMgotcVhmNiAgICAgICAgICAgIFFOIHFYZzEKLXFYZjcgICAgICAgICAgICBRTiBxWGcwCi1xWGZ0ICAgICAgICAgICAgUU4gcVhnNwotCi0KLXFYdDAgICAgICAgICAgICBRTiAxLlMzMgotcVh0MSAgICAgICAgICAgIFFOIDIuUzMyCi1xVDBsbyAgICAgICAgICAgUU4gMS5TMzIgICAgICAgICAKLXFUMGhpICAgICAgICAgICBRTiAyLlMzMiAgICAgICAgIAotcVQxbG8gICAgICAgICAgIFFOIDMuUzMyICAgICAgICAgCi1xVDFoaSAgICAgICAgICAgUU4gNC5TMzIgICAgICAgICAKLXFTY2FsZWxvICAgICAgICBRTiA1LlMzMiAgICAgICAgOy8vIHVzZWQgdG8gcmVhZCBwb3N0IHNjYWxlIHZhbHVlcwotcVNjYWxlaGkgICAgICAgIFFOIDYuUzMyCi1xVGVtcDAgICAgICAgICAgUU4gNS5TMzIgICAgICAgICAKLXFUZW1wMSAgICAgICAgICBRTiA2LlMzMiAgICAKLQotCi1TY2FsZTEgICAgICAgICAgRVFVIDYKLVNjYWxlMiAgICAgICAgICBFUVUgMTUKLXFTY2FsZTEgICAgICAgICBRTiBTY2FsZTEuUzE2ICAgICAKLXFTY2FsZTIgICAgICAgICBRTiBTY2FsZTIuUzE2ICAgICAKLWRTY2FsZTFsbyAgICAgICBETiAoU2NhbGUxKjIpLlMxNiAgICAgCi1kU2NhbGUxaGkgICAgICAgRE4gKFNjYWxlMSoyKzEpLlMxNgotZFNjYWxlMmxvICAgICAgIEROIChTY2FsZTIqMikuUzE2ICAgICAKLWRTY2FsZTJoaSAgICAgICBETiAoU2NhbGUyKjIrMSkuUzE2Ci0KLWRDb2VmcyAgICAgICAgICBETiAwLlMxNiAgICAgICAgOy8vIFNjYWxlIGNvZWZmaWNpZW50cyBpbiBmb3JtYXQge1swXSBbQ10gW1NdIFtJbnZTcXJ0Ml19Ci1JbnZTcXJ0MiAgICAgICAgRE4gZENvZWZzWzBdICAgIDsvLyAxL3NxcnQoMikgaW4gUTE1Ci1TICAgICAgICAgICAgICAgRE4gZENvZWZzWzFdICAgIDsvLyBTaW4oUEkvOCkgaW4gUTE1Ci1DICAgICAgICAgICAgICAgRE4gZENvZWZzWzJdICAgIDsvLyBDb3MoUEkvOCkgaW4gUTE1Ci0KLXBUZW1wICAgICAgICAgICBSTiAxMgotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIElNUE9SVCAgYXJtQ09NTV9JRENUQ29lZgotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVkxEMSAgICAgICAge3FYajAscVhqMX0sIFtwU3JjIEA2NF0hCi0gICAgICAgIFZMRDEgICAgICAgIHtxWGoyLHFYajN9LCBbcFNyYyBANjRdIQotICAgICAgICBWTEQxICAgICAgICB7cVhqNCxxWGo1fSwgW3BTcmMgQDY0XSEKLSAgICAgICAgVkxEMSAgICAgICAge3FYajYscVhqN30sIFtwU3JjIEA2NF0hCi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBQcmVTY2FsZSBhbmQgbXVsdGlwbHkgd2l0aCBTcmMKLSAgICAgICAgOy8vIElTdGFnZSA0Ci0gICAgICAgIAotICAgICAgICBJRiAiJGluc2NhbGUiPSJzMTYiICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAxNlgxNiBNdWwKLSAgICAgICAgICAgIE1fSURDVF9QUkVTQ0FMRTE2Ci0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBJRiAiJGluc2NhbGUiPSJzMzIiICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAzMlgzMiAsdWwKLSAgICAgICAgICAgIE1fSURDVF9QUkVTQ0FMRTMyCi0gICAgICAgIEVORElGCi0KLSAgICAgICAgOy8vIElTdGFnZSAzCi0gICAgICAgIFZRRE1VTEggICAgIHFYaTIsIHFYaTIsIEludlNxcnQyICAgICAgICAgICAgOy8vIGkyL3NxcnQoMikKLSAgICAgICAgVkhBREQgICAgICAgcVhoMCwgcVhpMCwgcVhpMSAgICAgICAgICAgICAgICA7Ly8gKGkwK2kxKS8yCi0gICAgICAgIFZIU1VCICAgICAgIHFYaDEsIHFYaTAsIHFYaTEgICAgICAgICAgICAgICAgOy8vIChpMC1pMSkvMgotICAgICAgICBWSEFERCAgICAgICBxWGg3LCBxWGk1LCBxWGk3ICAgICAgICAgICAgICAgIDsvLyAoaTUraTcpLzQKLSAgICAgICAgVlNVQiAgICAgICAgcVhoNSwgcVhpNSwgcVhpNyAgICAgICAgICAgICAgICA7Ly8gKGk1LWk3KS8yCi0gICAgICAgIFZRRE1VTEggICAgIHFYaDUsIHFYaDUsIEludlNxcnQyICAgICAgICAgICAgOy8vIGg1L3NxcnQoMikKLSAgICAgICAgVlNVQiAgICAgICAgcVhoMiwgcVhpMiwgcVhpMyAgICAgICAgICAgICAgICA7Ly8gaDIsIGgzCi0KLSAgICAgICAgVk1VTEwgICAgICAgcVh0MCwgZFhpNGxvLCBDICAgICAgICAgICAgICAgICA7Ly8gYyppNAotICAgICAgICBWTUxBTCAgICAgICBxWHQwLCBkWGk2bG8sIFMgICAgICAgICAgICAgICAgIDsvLyBjKmk0K3MqaTYKLSAgICAgICAgVk1VTEwgICAgICAgcVh0MSwgZFhpNGhpLCBDCi0gICAgICAgIFZNTEFMICAgICAgIHFYdDEsIGRYaTZoaSwgUwotICAgICAgICBWU0hSTiAgICAgICBkWGg0bG8sIHFYdDAsICMxNiAgICAgICAgICAgICAgIDsvLyBoNAotICAgICAgICBWU0hSTiAgICAgICBkWGg0aGksIHFYdDEsICMxNgotICAgICAgICAKLSAgICAgICAgVk1VTEwgICAgICAgcVh0MCwgZFhpNmxvLCBDICAgICAgICAgICAgICAgICA7Ly8gYyppNgotICAgICAgICBWTUxTTCAgICAgICBxWHQwLCBkWGk0bG8sIFMgICAgICAgICAgICAgICAgIDsvLyAtcyppNCArIGMqaDYKLSAgICAgICAgVk1VTEwgICAgICAgcVh0MSwgZFhpNmhpLCBDCi0gICAgICAgIFZNTFNMICAgICAgIHFYdDEsIGRYaTRoaSwgUwotICAgICAgICBWU0hSTiAgICAgICBkWGg2bG8sIHFYdDAsICMxNiAgICAgICAgICAgICAgIDsvLyBoNgotICAgICAgICBWU0hSTiAgICAgICBkWGg2aGksIHFYdDEsICMxNgotICAgICAgICAKLSAgICAgICAgOy8vIElTdGFnZSAyCi0gICAgICAgIFZTVUIgICAgICAgIHFYZzYsIHFYaDYsIHFYaDcKLSAgICAgICAgVlNVQiAgICAgICAgcVhnNSwgcVhoNSwgcVhnNgotICAgICAgICBWU1VCICAgICAgICBxWGc0LCBxWGg0LCBxWGc1Ci0gICAgICAgIFZIQUREICAgICAgIHFYZzEsIHFYaDEsIHFYaDIgICAgICAgIDsvLyAoaDEraDIpLzIKLSAgICAgICAgVkhTVUIgICAgICAgcVhnMiwgcVhoMSwgcVhoMiAgICAgICAgOy8vIChoMS1oMikvMgotICAgICAgICBWSEFERCAgICAgICBxWGcwLCBxWGgwLCBxWGgzICAgICAgICA7Ly8gKGgwK2gzKS8yCi0gICAgICAgIFZIU1VCICAgICAgIHFYZzMsIHFYaDAsIHFYaDMgICAgICAgIDsvLyAoaDAtaDMpLzIKLQotICAgICAgICA7Ly8gSVN0YWdlIDEgYWxsIHJvd3MKLSAgICAgICAgVkFERCAgICAgICAgcVhmMywgcVhnMywgcVhnNCAgICAgICAgCi0gICAgICAgIFZTVUIgICAgICAgIHFYZjQsIHFYZzMsIHFYZzQgICAgICAgIAotICAgICAgICBWQUREICAgICAgICBxWGYyLCBxWGcyLCBxWGc1ICAgICAgICAKLSAgICAgICAgVlNVQiAgICAgICAgcVhmNSwgcVhnMiwgcVhnNSAgICAgICAgCi0gICAgICAgIFZBREQgICAgICAgIHFYZjEsIHFYZzEsIHFYZzYKLSAgICAgICAgVlNVQiAgICAgICAgcVhmNiwgcVhnMSwgcVhnNiAgICAgICAgCi0gICAgICAgIFZBREQgICAgICAgIHFYZjAsIHFYZzAsIHFYZzcKLSAgICAgICAgVlNVQiAgICAgICAgcVhmNywgcVhnMCwgcVhnNyAgICAgIAotCi0gICAgICAgIDsvLyBUcmFuc3Bvc2UsIHN0b3JlIGFuZCBsb29wCi1YVFIwICAgICAgICAgICAgRVFVIFNyYzUKLVhUUjEgICAgICAgICAgICBFUVUgVG1wCi1YVFIyICAgICAgICAgICAgRVFVIFNyYzYKLVhUUjMgICAgICAgICAgICBFUVUgU3JjNwotWFRSNCAgICAgICAgICAgIEVRVSBTcmMzCi1YVFI1ICAgICAgICAgICAgRVFVIFNyYzAKLVhUUjYgICAgICAgICAgICBFUVUgU3JjMQotWFRSNyAgICAgICAgICAgIEVRVSBTcmMyCi1YVFJ0ICAgICAgICAgICAgRVFVIFNyYzQKLSAgICAgICAgICAgICAgICAKLXFBMCAgICAgICAgICAgICBRTiAgWFRSMC5TMzIgIDsvLyBmb3IgWFRScG9zZQotcUExICAgICAgICAgICAgIFFOICBYVFIxLlMzMgotcUEyICAgICAgICAgICAgIFFOICBYVFIyLlMzMgotcUEzICAgICAgICAgICAgIFFOICBYVFIzLlMzMgotcUE0ICAgICAgICAgICAgIFFOICBYVFI0LlMzMgotcUE1ICAgICAgICAgICAgIFFOICBYVFI1LlMzMgotcUE2ICAgICAgICAgICAgIFFOICBYVFI2LlMzMgotcUE3ICAgICAgICAgICAgIFFOICBYVFI3LlMzMgotCi1kQjAgICAgICAgICAgICAgRE4gIFhUUjAqMisxICAgICAgOy8vIGZvciB1c2luZyBWU1dQCi1kQjEgICAgICAgICAgICAgRE4gIFhUUjEqMisxCi1kQjIgICAgICAgICAgICAgRE4gIFhUUjIqMisxCi1kQjMgICAgICAgICAgICAgRE4gIFhUUjMqMisxCi1kQjQgICAgICAgICAgICAgRE4gIFhUUjQqMgotZEI1ICAgICAgICAgICAgIEROICBYVFI1KjIKLWRCNiAgICAgICAgICAgICBETiAgWFRSNioyCi1kQjcgICAgICAgICAgICAgRE4gIFhUUjcqMgotCi0gICAgICAgICAgCi0gICAgICAgIFZUUk4gICAgICAgIHFYZjAsIHFYZjEKLSAgICAgICAgVlRSTiAgICAgICAgcVhmMiwgcVhmMwotICAgICAgICBWVFJOICAgICAgICBxWGY0LCBxWGY1Ci0gICAgICAgIFZUUk4gICAgICAgIHFYZjYsIHFYZjcKLSAgICAgICAgVlRSTiAgICAgICAgcUEwLCBxQTIKLSAgICAgICAgVlRSTiAgICAgICAgcUExLCBxQTMKLSAgICAgICAgVlRSTiAgICAgICAgcUE0LCBxQTYKLSAgICAgICAgVlRSTiAgICAgICAgcUE1LCBxQTcgICAgICAgIAotICAgICAgICBWU1dQICAgICAgICBkQjAsIGRCNAotICAgICAgICBWU1dQICAgICAgICBkQjEsIGRCNQotICAgICAgICBWU1dQICAgICAgICBkQjIsIGRCNgotICAgICAgICBWU1dQICAgICAgICBkQjMsIGRCNwotICAgICAgICAKLQotcVlqMCAgICAgICAgICAgIFFOIHFYZjAKLXFZajEgICAgICAgICAgICBRTiBxWGYxCi1xWWoyICAgICAgICAgICAgUU4gcVhmMgotcVlqMyAgICAgICAgICAgIFFOIHFYZjMKLXFZajQgICAgICAgICAgICBRTiBxWGY0Ci1xWWo1ICAgICAgICAgICAgUU4gcVhmNQotcVlqNiAgICAgICAgICAgIFFOIHFYZjYKLXFZajcgICAgICAgICAgICBRTiBxWGY3Ci1xWWp0ICAgICAgICAgICAgUU4gcVhmdAotCi1kWWowbG8gICAgICAgICAgRE4gKFhUUjAqMikuUzE2Ci1kWWowaGkgICAgICAgICAgRE4gKFhUUjAqMisxKS5TMTYKLWRZajFsbyAgICAgICAgICBETiAoWFRSMSoyKS5TMTYKLWRZajFoaSAgICAgICAgICBETiAoWFRSMSoyKzEpLlMxNgotZFlqMmxvICAgICAgICAgIEROIChYVFIyKjIpLlMxNgotZFlqMmhpICAgICAgICAgIEROIChYVFIyKjIrMSkuUzE2Ci1kWWozbG8gICAgICAgICAgRE4gKFhUUjMqMikuUzE2Ci1kWWozaGkgICAgICAgICAgRE4gKFhUUjMqMisxKS5TMTYKLWRZajRsbyAgICAgICAgICBETiAoWFRSNCoyKS5TMTYKLWRZajRoaSAgICAgICAgICBETiAoWFRSNCoyKzEpLlMxNgotZFlqNWxvICAgICAgICAgIEROIChYVFI1KjIpLlMxNgotZFlqNWhpICAgICAgICAgIEROIChYVFI1KjIrMSkuUzE2Ci1kWWo2bG8gICAgICAgICAgRE4gKFhUUjYqMikuUzE2Ci1kWWo2aGkgICAgICAgICAgRE4gKFhUUjYqMisxKS5TMTYKLWRZajdsbyAgICAgICAgICBETiAoWFRSNyoyKS5TMTYKLWRZajdoaSAgICAgICAgICBETiAoWFRSNyoyKzEpLlMxNgotZFlqdGxvICAgICAgICAgIEROIChYVFJ0KjIpLlMxNgotZFlqdGhpICAgICAgICAgIEROIChYVFJ0KjIrMSkuUzE2Ci0KLXFZaTAgICAgICAgICAgICBRTiBxWWowCi1xWWkxICAgICAgICAgICAgUU4gcVlqNAotcVlpMiAgICAgICAgICAgIFFOIHFZajIKLXFZaTMgICAgICAgICAgICBRTiBxWWo3Ci1xWWk0ICAgICAgICAgICAgUU4gcVlqNQotcVlpNSAgICAgICAgICAgIFFOIHFZanQKLXFZaTYgICAgICAgICAgICBRTiBxWWoxCi1xWWk3ICAgICAgICAgICAgUU4gcVlqNgotcVlpdCAgICAgICAgICAgIFFOIHFZajMKLQotZFlpMGxvICAgICAgICAgIEROIGRZajBsbwotZFlpMGhpICAgICAgICAgIEROIGRZajBoaQotZFlpMWxvICAgICAgICAgIEROIGRZajRsbwotZFlpMWhpICAgICAgICAgIEROIGRZajRoaQotZFlpMmxvICAgICAgICAgIEROIGRZajJsbwotZFlpMmhpICAgICAgICAgIEROIGRZajJoaQotZFlpM2xvICAgICAgICAgIEROIGRZajdsbwotZFlpM2hpICAgICAgICAgIEROIGRZajdoaQotZFlpNGxvICAgICAgICAgIEROIGRZajVsbwotZFlpNGhpICAgICAgICAgIEROIGRZajVoaQotZFlpNWxvICAgICAgICAgIEROIGRZanRsbwotZFlpNWhpICAgICAgICAgIEROIGRZanRoaQotZFlpNmxvICAgICAgICAgIEROIGRZajFsbwotZFlpNmhpICAgICAgICAgIEROIGRZajFoaQotZFlpN2xvICAgICAgICAgIEROIGRZajZsbwotZFlpN2hpICAgICAgICAgIEROIGRZajZoaQotZFlpdGxvICAgICAgICAgIEROIGRZajNsbwotZFlpdGhpICAgICAgICAgIEROIGRZajNoaQotCi1xWWgwICAgICAgICAgICAgUU4gcVlpdAotcVloMSAgICAgICAgICAgIFFOIHFZaTAKLXFZaDIgICAgICAgICAgICBRTiBxWWkyCi1xWWgzICAgICAgICAgICAgUU4gcVlpMwotcVloNCAgICAgICAgICAgIFFOIHFZaTcKLXFZaDUgICAgICAgICAgICBRTiBxWWk1Ci1xWWg2ICAgICAgICAgICAgUU4gcVlpNAotcVloNyAgICAgICAgICAgIFFOIHFZaTEKLXFZaHQgICAgICAgICAgICBRTiBxWWk2Ci0KLWRZaDBsbyAgICAgICAgICBETiBkWWl0bG8KLWRZaDBoaSAgICAgICAgICBETiBkWWl0aGkKLWRZaDFsbyAgICAgICAgICBETiBkWWkwbG8KLWRZaDFoaSAgICAgICAgICBETiBkWWkwaGkKLWRZaDJsbyAgICAgICAgICBETiBkWWkybG8KLWRZaDJoaSAgICAgICAgICBETiBkWWkyaGkKLWRZaDNsbyAgICAgICAgICBETiBkWWkzbG8KLWRZaDNoaSAgICAgICAgICBETiBkWWkzaGkKLWRZaDRsbyAgICAgICAgICBETiBkWWk3bG8KLWRZaDRoaSAgICAgICAgICBETiBkWWk3aGkKLWRZaDVsbyAgICAgICAgICBETiBkWWk1bG8KLWRZaDVoaSAgICAgICAgICBETiBkWWk1aGkKLWRZaDZsbyAgICAgICAgICBETiBkWWk0bG8KLWRZaDZoaSAgICAgICAgICBETiBkWWk0aGkKLWRZaDdsbyAgICAgICAgICBETiBkWWkxbG8KLWRZaDdoaSAgICAgICAgICBETiBkWWkxaGkKLWRZaHRsbyAgICAgICAgICBETiBkWWk2bG8KLWRZaHRoaSAgICAgICAgICBETiBkWWk2aGkKLQotcVlnMCAgICAgICAgICAgIFFOIHFZaDIKLXFZZzEgICAgICAgICAgICBRTiBxWWh0Ci1xWWcyICAgICAgICAgICAgUU4gcVloMQotcVlnMyAgICAgICAgICAgIFFOIHFZaDAKLXFZZzQgICAgICAgICAgICBRTiBxWWg0Ci1xWWc1ICAgICAgICAgICAgUU4gcVloNQotcVlnNiAgICAgICAgICAgIFFOIHFZaDYKLXFZZzcgICAgICAgICAgICBRTiBxWWg3Ci1xWWd0ICAgICAgICAgICAgUU4gcVloMwotCi1xWWYwICAgICAgICAgICAgUU4gcVlnNgotcVlmMSAgICAgICAgICAgIFFOIHFZZzUKLXFZZjIgICAgICAgICAgICBRTiBxWWc0Ci1xWWYzICAgICAgICAgICAgUU4gcVlndAotcVlmNCAgICAgICAgICAgIFFOIHFZZzMKLXFZZjUgICAgICAgICAgICBRTiBxWWcyCi1xWWY2ICAgICAgICAgICAgUU4gcVlnMQotcVlmNyAgICAgICAgICAgIFFOIHFZZzAKLXFZZnQgICAgICAgICAgICBRTiBxWWc3Ci0KLSAgICAgICAgVlJTSFIgICAgICAgcVlqNywgcVlqNywgIzIKLSAgICAgICAgVlJTSFIgICAgICAgcVlqNiwgcVlqNiwgIzEKLSAgICAgICAgCi0gICAgICAgIFZIQUREICAgICAgIHFZaTUsIHFZajEsIHFZajcgICAgICAgIDsvLyBpNSA9IChqMStqNykvMgotICAgICAgICBWU1VCICAgICAgICBxWWk2LCBxWWoxLCBxWWo3ICAgICAgICA7Ly8gaTYgPSBqMS1qNwotICAgICAgICBWSEFERCAgICAgICBxWWkzLCBxWWoyLCBxWWo2ICAgICAgICA7Ly8gaTMgPSAoajIrajYpLzIKLSAgICAgICAgVlNVQiAgICAgICAgcVlpMiwgcVlqMiwgcVlqNiAgICAgICAgOy8vIGkyID0gajItajYKLSAgICAgICAgVkhBREQgICAgICAgcVlpNywgcVlqNSwgcVlqMyAgICAgICAgOy8vIGk3ID0gKGo1K2ozKS8yCi0gICAgICAgIFZTVUIgICAgICAgIHFZaTQsIHFZajUsIHFZajMgICAgICAgIDsvLyBpNCA9IGo1LWozCi0KLSAgICAgICAgVlFETVVMSCAgICAgcVlpMiwgcVlpMiwgSW52U3FydDIgICAgOy8vIGkyL3NxcnQoMikKLSAgICAgICAgOy8vIElTdGFnZSA0LDMgcm93cyAwdG8xIHggMS8yCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBwVGVtcCwgIzB4NCAgICAgICAgICAgICA7Ly8gZW5zdXJlIGNvcnJlY3Qgcm91bmQKLSAgICAgICAgVkRVUCAgICAgICAgcVNjYWxlMSwgcFRlbXAgICAgICAgICAgIDsvLyBvZiBEQyByZXN1bHQKLSAgICAgICAgVkFERCAgICAgICAgcVlpMCwgcVlpMCwgcVNjYWxlMQotICAgICAgICAKLSAgICAgICAgVkhBREQgICAgICAgcVloMCwgcVlpMCwgcVlpMSAgICAgICAgOy8vIChpMCtpMSkvMgotICAgICAgICBWSFNVQiAgICAgICBxWWgxLCBxWWkwLCBxWWkxICAgICAgICA7Ly8gKGkwLWkxKS8yCi0KLSAgICAgICAgVkhBREQgICAgICAgcVloNywgcVlpNSwgcVlpNyAgICAgICAgOy8vIChpNStpNykvNAotICAgICAgICBWU1VCICAgICAgICBxWWg1LCBxWWk1LCBxWWk3ICAgICAgICA7Ly8gKGk1LWk3KS8yCi0gICAgICAgIFZTVUIgICAgICAgIHFZaDIsIHFZaTIsIHFZaTMgICAgICAgIDsvLyBoMiwgaDMKLSAgICAgICAgVlFETVVMSCAgICAgcVloNSwgcVloNSwgSW52U3FydDIgICAgOy8vIGg1L3NxcnQoMikKLQotICAgICAgICBWTVVMTCAgICAgICBxWHQwLCBkWWk0bG8sIEMgICAgICAgICA7Ly8gYyppNAotICAgICAgICBWTUxBTCAgICAgICBxWHQwLCBkWWk2bG8sIFMgICAgICAgICA7Ly8gYyppNCtzKmk2Ci0gICAgICAgIFZNVUxMICAgICAgIHFYdDEsIGRZaTRoaSwgQwotICAgICAgICBWTUxBTCAgICAgICBxWHQxLCBkWWk2aGksIFMKLSAgICAgICAgVlNIUk4gICAgICAgZFloNGxvLCBxWHQwLCAjMTYgICAgICAgOy8vIGg0Ci0gICAgICAgIFZTSFJOICAgICAgIGRZaDRoaSwgcVh0MSwgIzE2Ci0gICAgICAgIAotICAgICAgICBWTVVMTCAgICAgICBxWHQwLCBkWWk2bG8sIEMgICAgICAgICA7Ly8gYyppNgotICAgICAgICBWTUxTTCAgICAgICBxWHQwLCBkWWk0bG8sIFMgICAgICAgICA7Ly8gLXMqaTQgKyBjKmg2Ci0gICAgICAgIFZNVUxMICAgICAgIHFYdDEsIGRZaTZoaSwgQwotICAgICAgICBWTUxTTCAgICAgICBxWHQxLCBkWWk0aGksIFMKLSAgICAgICAgVlNIUk4gICAgICAgZFloNmxvLCBxWHQwLCAjMTYgICAgICAgOy8vIGg2Ci0gICAgICAgIFZTSFJOICAgICAgIGRZaDZoaSwgcVh0MSwgIzE2Ci0gICAgICAgIAotICAgICAgICBWU1VCICAgICAgICBxWWc2LCBxWWg2LCBxWWg3Ci0gICAgICAgIFZTVUIgICAgICAgIHFZZzUsIHFZaDUsIHFZZzYKLSAgICAgICAgVlNVQiAgICAgICAgcVlnNCwgcVloNCwgcVlnNQotICAgICAgICAKLSAgICAgICAgOy8vIElTdGFnZSAyIHJvd3MgMHRvMyB4IDEvMgotICAgICAgICBWSEFERCAgICAgICBxWWcxLCBxWWgxLCBxWWgyICAgICAgICA7Ly8gKGgxK2gyKS8yCi0gICAgICAgIFZIU1VCICAgICAgIHFZZzIsIHFZaDEsIHFZaDIgICAgICAgIDsvLyAoaDEtaDIpLzIKLSAgICAgICAgVkhBREQgICAgICAgcVlnMCwgcVloMCwgcVloMyAgICAgICAgOy8vIChoMCtoMykvMgotICAgICAgICBWSFNVQiAgICAgICBxWWczLCBxWWgwLCBxWWgzICAgICAgICA7Ly8gKGgwLWgzKS8yCi0gICAgICAgIAotCi0gICAgICAgIDsvLyBJU3RhZ2UgMSBhbGwgcm93cwotICAgICAgICBWSEFERCAgICAgICAgcVlmMywgcVlnMywgcVlnNCAgICAgICAgCi0gICAgICAgIFZIU1VCICAgICAgICBxWWY0LCBxWWczLCBxWWc0ICAgICAgICAKLSAgICAgICAgVkhBREQgICAgICAgIHFZZjIsIHFZZzIsIHFZZzUgICAgICAgIAotICAgICAgICBWSFNVQiAgICAgICAgcVlmNSwgcVlnMiwgcVlnNSAgICAgICAgCi0gICAgICAgIFZIQUREICAgICAgICBxWWYxLCBxWWcxLCBxWWc2Ci0gICAgICAgIFZIU1VCICAgICAgICBxWWY2LCBxWWcxLCBxWWc2ICAgICAgICAKLSAgICAgICAgVkhBREQgICAgICAgIHFZZjAsIHFZZzAsIHFZZzcKLSAgICAgICAgVkhTVUIgICAgICAgIHFZZjcsIHFZZzAsIHFZZzcgICAgICAKLQotWVRSMCAgICAgICAgICAgIEVRVSBTcmMwCi1ZVFIxICAgICAgICAgICAgRVFVIFNyYzQKLVlUUjIgICAgICAgICAgICBFUVUgU3JjMQotWVRSMyAgICAgICAgICAgIEVRVSBTcmMyCi1ZVFI0ICAgICAgICAgICAgRVFVIFNyYzcKLVlUUjUgICAgICAgICAgICBFUVUgU3JjNQotWVRSNiAgICAgICAgICAgIEVRVSBUbXAKLVlUUjcgICAgICAgICAgICBFUVUgU3JjNgotWVRSdCAgICAgICAgICAgIEVRVSBTcmMzCi0KLXFDMCAgICAgICAgICAgICBRTiAgWVRSMC5TMzIgICAgICAgICAgICAgICAgOy8vIGZvciBZVFJwb3NlCi1xQzEgICAgICAgICAgICAgUU4gIFlUUjEuUzMyCi1xQzIgICAgICAgICAgICAgUU4gIFlUUjIuUzMyCi1xQzMgICAgICAgICAgICAgUU4gIFlUUjMuUzMyCi1xQzQgICAgICAgICAgICAgUU4gIFlUUjQuUzMyCi1xQzUgICAgICAgICAgICAgUU4gIFlUUjUuUzMyCi1xQzYgICAgICAgICAgICAgUU4gIFlUUjYuUzMyCi1xQzcgICAgICAgICAgICAgUU4gIFlUUjcuUzMyCi0KLWREMCAgICAgICAgICAgICBETiAgWVRSMCoyKzEgICAgICAgICAgICAgICAgOy8vIGZvciB1c2luZyBWU1dQCi1kRDEgICAgICAgICAgICAgRE4gIFlUUjEqMisxCi1kRDIgICAgICAgICAgICAgRE4gIFlUUjIqMisxCi1kRDMgICAgICAgICAgICAgRE4gIFlUUjMqMisxCi1kRDQgICAgICAgICAgICAgRE4gIFlUUjQqMgotZEQ1ICAgICAgICAgICAgIEROICBZVFI1KjIKLWRENiAgICAgICAgICAgICBETiAgWVRSNioyCi1kRDcgICAgICAgICAgICAgRE4gIFlUUjcqMgotICAgICAgICAgIAotICAgICAgICBWVFJOICAgICAgICBxWWYwLCBxWWYxCi0gICAgICAgIFZUUk4gICAgICAgIHFZZjIsIHFZZjMKLSAgICAgICAgVlRSTiAgICAgICAgcVlmNCwgcVlmNQotICAgICAgICBWVFJOICAgICAgICBxWWY2LCBxWWY3Ci0gICAgICAgIFZUUk4gICAgICAgIHFDMCwgcUMyCi0gICAgICAgIFZUUk4gICAgICAgIHFDMSwgcUMzCi0gICAgICAgIFZUUk4gICAgICAgIHFDNCwgcUM2Ci0gICAgICAgIFZUUk4gICAgICAgIHFDNSwgcUM3ICAgICAgICAKLSAgICAgICAgVlNXUCAgICAgICAgZEQwLCBkRDQKLSAgICAgICAgVlNXUCAgICAgICAgZEQxLCBkRDUKLSAgICAgICAgVlNXUCAgICAgICAgZEQyLCBkRDYKLSAgICAgICAgVlNXUCAgICAgICAgZEQzLCBkRDcKLQotICAgICAgICAKLWRZZjBVOCAgICAgICAgICBETiBZVFIwKjIuVTgKLWRZZjFVOCAgICAgICAgICBETiBZVFIxKjIuVTgKLWRZZjJVOCAgICAgICAgICBETiBZVFIyKjIuVTgKLWRZZjNVOCAgICAgICAgICBETiBZVFIzKjIuVTgKLWRZZjRVOCAgICAgICAgICBETiBZVFI0KjIuVTgKLWRZZjVVOCAgICAgICAgICBETiBZVFI1KjIuVTgKLWRZZjZVOCAgICAgICAgICBETiBZVFI2KjIuVTgKLWRZZjdVOCAgICAgICAgICBETiBZVFI3KjIuVTgKLSAgICAgICAgCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gRG8gc2F0dXJhdGlvbiBpZiBvdXRzaXplIGlzIG90aGVyIHRoYW4gUzE2Ci0gICAgICAgIDsvLwotICAgICAgICAKLSAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InU4IikKLSAgICAgICAgICAgIDsvLyBPdXRwdXQgcmFuZ2UgWzAtMjU1XQotICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmMFU4LCBxWWYwCi0gICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWYxVTgsIHFZZjEKLSAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjJVOCwgcVlmMgotICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmM1U4LCBxWWYzCi0gICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWY0VTgsIHFZZjQKLSAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjVVOCwgcVlmNQotICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmNlU4LCBxWWY2Ci0gICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWY3VTgsIHFZZjcKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIElGICgiJG91dHNpemUiPSJzOSIpCi0gICAgICAgICAgICA7Ly8gT3V0cHV0IHJhbmdlIFstMjU2IHRvICsyNTVdCi0gICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjAsIHFZZjAsICMxNi05Ci0gICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjEsIHFZZjEsICMxNi05Ci0gICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjIsIHFZZjIsICMxNi05Ci0gICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjMsIHFZZjMsICMxNi05Ci0gICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjQsIHFZZjQsICMxNi05Ci0gICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjUsIHFZZjUsICMxNi05Ci0gICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjYsIHFZZjYsICMxNi05Ci0gICAgICAgICAgICBWUVNITCAgICAgICAgICAgIHFZZjcsIHFZZjcsICMxNi05Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmMCwgcVlmMCwgIzE2LTkKLSAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmMSwgcVlmMSwgIzE2LTkKLSAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmMiwgcVlmMiwgIzE2LTkKLSAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmMywgcVlmMywgIzE2LTkKLSAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmNCwgcVlmNCwgIzE2LTkKLSAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmNSwgcVlmNSwgIzE2LTkKLSAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmNiwgcVlmNiwgIzE2LTkKLSAgICAgICAgICAgIFZTSFIgICAgICAgICAgICAgcVlmNywgcVlmNywgIzE2LTkKLSAgICAgICAgRU5ESUYKLQotICAgICAgICA7Ly8gU3RvcmUgb3V0cHV0IGRlcGVuZGluZyBvbiB0aGUgU3RyaWRlIHNpemUKLSAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgotICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMCwgW3BEZXN0IEA2NF0sIFN0cmlkZQotICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMSwgW3BEZXN0IEA2NF0sIFN0cmlkZQotICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMiwgW3BEZXN0IEA2NF0sIFN0cmlkZQotICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMywgW3BEZXN0IEA2NF0sIFN0cmlkZQotICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNCwgW3BEZXN0IEA2NF0sIFN0cmlkZQotICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNSwgW3BEZXN0IEA2NF0sIFN0cmlkZQotICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNiwgW3BEZXN0IEA2NF0sIFN0cmlkZQotICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNywgW3BEZXN0IEA2NF0gICAgICAgICAgICAKLSAgICAgICAgRUxTRQotICAgICAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InU4IikKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWYwVTgsIFtwRGVzdCBANjRdLCAjOAotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjFVOCwgW3BEZXN0IEA2NF0sICM4Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmMlU4LCBbcERlc3QgQDY0XSwgIzgKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWYzVTgsIFtwRGVzdCBANjRdLCAjOAotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjRVOCwgW3BEZXN0IEA2NF0sICM4Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmNVU4LCBbcERlc3QgQDY0XSwgIzgKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWY2VTgsIFtwRGVzdCBANjRdLCAjOAotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjdVOCwgW3BEZXN0IEA2NF0KLSAgICAgICAgICAgIEVMU0UKLSAgICAgICAgICAgICAgICA7Ly8gKCIkb3V0c2l6ZSI9InM5Iikgb3IgKCIkb3V0c2l6ZSI9InMxNiIpCi0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMCwgW3BEZXN0IEA2NF0sICMxNgotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjEsIFtwRGVzdCBANjRdLCAjMTYKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWYyLCBbcERlc3QgQDY0XSwgIzE2Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMywgW3BEZXN0IEA2NF0sICMxNgotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjQsIFtwRGVzdCBANjRdLCAjMTYKLSAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWY1LCBbcERlc3QgQDY0XSwgIzE2Ci0gICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNiwgW3BEZXN0IEA2NF0sICMxNgotICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjcsIFtwRGVzdCBANjRdCi0gICAgICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgRU5ESUYKLQotCi0KLSAgICAgICAgRU5ESUYgOy8vIENvcnRleEE4Ci0KLQotCi0gICAgICAgIE1FTkQgICAgICAgIAotCi0gICAgICAgIDsvLyBTY2FsZSBUV08gaW5wdXQgcm93cyB3aXRoIFRXTyByb3dzIG9mIDE2IGJpdCBzY2FsZSB2YWx1ZXMKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBUaGlzIG1hY3JvIGlzIHVzZWQgYnkgTV9JRENUX1BSRVNDQUxFMTYgdG8gcHJlLXNjYWxlIG9uZSByb3cKLSAgICAgICAgOy8vIGlucHV0IChFaWdodCBpbnB1dCB2YWx1ZXMpIHdpdGggb25lIHJvdyBvZiBzY2FsZSB2YWx1ZXMuIEFsc28gCi0gICAgICAgIDsvLyBMb2FkcyBuZXh0IHNjYWxlIHZhbHVlcyBmcm9tIHBTY2FsZSwgaWYgJExhc3RSb3cgZmxhZyBpcyBub3Qgc2V0LgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyAkZEFsbyAgICAgICAgICAgLSBJbnB1dCBEIHJlZ2lzdGVyIHdpdGggZmlyc3QgZm91ciBTMTYgdmFsdWVzIG9mIHJvdyBuCi0gICAgICAgIDsvLyAkZEFoaSAgICAgICAgICAgLSBJbnB1dCBEIHJlZ2lzdGVyIHdpdGggbmV4dCBmb3VyIFMxNiB2YWx1ZXMgb2Ygcm93IG4KLSAgICAgICAgOy8vICRkQmxvICAgICAgICAgICAtIElucHV0IEQgcmVnaXN0ZXIgd2l0aCBmaXJzdCBmb3VyIFMxNiB2YWx1ZXMgb2Ygcm93IG4rMQotICAgICAgICA7Ly8gJGRCaGkgICAgICAgICAgIC0gSW5wdXQgRCByZWdpc3RlciB3aXRoIG5leHQgZm91ciBTMTYgdmFsdWVzIG9mIHJvdyBuKzEKLSAgICAgICAgOy8vIHBTY2FsZSAgICAgICAgICAtIFBvaW50ZXIgdG8gbmV4dCByb3cgb2Ygc2NhbGUgdmFsdWVzCi0gICAgICAgIDsvLyBxVDBsbyAgICAgICAgICAgLSBUZW1wb3Jhcnkgc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gcVQwaGkgICAgICAgICAgIC0gVGVtcG9yYXJ5IHNjcmF0Y2ggcmVnaXN0ZXIKLSAgICAgICAgOy8vIHFUMWxvICAgICAgICAgICAtIFRlbXBvcmFyeSBzY3JhdGNoIHJlZ2lzdGVyCi0gICAgICAgIDsvLyBxVDFoaSAgICAgICAgICAgLSBUZW1wb3Jhcnkgc2NyYXRjaCByZWdpc3RlcgotICAgICAgICA7Ly8gZFNjYWxlMWxvICAgICAgIC0gU2NhbGUgdmFsdWUgb2Ygcm93IG4KLSAgICAgICAgOy8vIGRTY2FsZTFoaSAgICAgICAtIFNjYWxlIHZhbHVlIG9mIHJvdyBuCi0gICAgICAgIDsvLyBkU2NhbGUybG8gICAgICAgLSBTY2FsZSB2YWx1ZSBvZiByb3cgbisxCi0gICAgICAgIDsvLyBkU2NhbGUyaGkgICAgICAgLSBTY2FsZSB2YWx1ZSBvZiByb3cgbisxCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgRmxhZwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICRMYXN0Um93ICAgICAgICAtIEZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBjdXJyZW50IHJvdyBpcyBsYXN0IHJvdwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gJGRBbG8gICAgICAgICAgIC0gU2NhbGVkIG91dHB1dCB2YWx1ZXMgKGZpcnN0IGZvdXIgUzE2IG9mIHJvdyBuKQotICAgICAgICA7Ly8gJGRBaGkgICAgICAgICAgIC0gU2NhbGVkIG91dHB1dCB2YWx1ZXMgKG5leHQgZm91ciBTMTYgb2Ygcm93IG4pCi0gICAgICAgIDsvLyAkZEJsbyAgICAgICAgICAgLSBTY2FsZWQgb3V0cHV0IHZhbHVlcyAoZmlyc3QgZm91ciBTMTYgb2Ygcm93IG4rMSkKLSAgICAgICAgOy8vICRkQmhpICAgICAgICAgICAtIFNjYWxlZCBvdXRwdXQgdmFsdWVzIChuZXh0IGZvdXIgUzE2IG9mIHJvdyBuKzEpCi0gICAgICAgIDsvLyBxU2NhbGUxICAgICAgICAgLSBTY2FsZSB2YWx1ZXMgZm9yIG5leHQgcm93Ci0gICAgICAgIDsvLyBxU2NhbGUyICAgICAgICAgLSBTY2FsZSB2YWx1ZXMgZm9yIG5leHQgcm93KzEKLSAgICAgICAgOy8vIHBTY2FsZSAgICAgICAgICAtIFBvaW50ZXIgdG8gbmV4dCByb3cgb2Ygc2NhbGUgdmFsdWVzCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0lEQ1RfU0NBTEUxNiAkZEFsbywgJGRBaGksICRkQmxvLCAkZEJoaSwgJExhc3RSb3cKLSAgICAgICAgVk1VTEwgICAgICAgcVQwbG8sICRkQWxvLCBkU2NhbGUxbG8KLSAgICAgICAgVk1VTEwgICAgICAgcVQwaGksICRkQWhpLCBkU2NhbGUxaGkKLSAgICAgICAgVk1VTEwgICAgICAgcVQxbG8sICRkQmxvLCBkU2NhbGUybG8KLSAgICAgICAgVk1VTEwgICAgICAgcVQxaGksICRkQmhpLCBkU2NhbGUyaGkKLSAgICAgICAgSUYgIiRMYXN0Um93Ij0iMCIKLSAgICAgICAgICAgIFZMRDEgICAgICAgIHFTY2FsZTEsIFtwU2NhbGVdLCAjMTYgIDsvLyBMb2FkIHNjYWxlIGZvciByb3cgbisxCi0gICAgICAgICAgICBWTEQxICAgICAgICBxU2NhbGUyLCBbcFNjYWxlXSwgIzE2ICA7Ly8gTG9hZCBzY2FsZSBmb3Igcm93IG4rMgotICAgICAgICBFTkRJRgotICAgICAgICBWUVJTSFJOICAgICAgICRkQWxvLCBxVDBsbywgIzEyICAgICAgICAKLSAgICAgICAgVlFSU0hSTiAgICAgICAkZEFoaSwgcVQwaGksICMxMiAgICAgICAgCi0gICAgICAgIFZRUlNIUk4gICAgICAgJGRCbG8sIHFUMWxvLCAjMTIgICAgICAgIAotICAgICAgICBWUVJTSFJOICAgICAgICRkQmhpLCBxVDFoaSwgIzEyICAgICAgICAKLSAgICAgICAgTUVORAotCi0gICAgICAgIDsvLyBTY2FsZSA4eDggYmxvY2sgaW5wdXQgdmFsdWVzIHdpdGggMTYgYml0IHNjYWxlIHZhbHVlcwotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBwcmUtc2NhbGUgYmxvY2sgb2YgOHg4IGlucHV0LgotICAgICAgICA7Ly8gVGhpcyBhbHNvIGRvIHRoZSBJc3Qgc3RhZ2UgdHJhbnNmb3JtYXRpb25zIG9mIElEQ1QuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIGRYam5sbyAgICAgICAgICAtIG4gdGggaW5wdXQgRCByZWdpc3RlciB3aXRoIGZpcnN0IGZvdXIgUzE2IHZhbHVlcwotICAgICAgICA7Ly8gZFhqbmhpICAgICAgICAgIC0gbiB0aCBpbnB1dCBEIHJlZ2lzdGVyIHdpdGggbmV4dCBmb3VyIFMxNiB2YWx1ZXMKLSAgICAgICAgOy8vIHFYam4gICAgICAgICAgICAtIG4gdGggaW5wdXQgUSByZWdpc3RlciB3aXRoIGVpZ2h0IFMxNiB2YWx1ZXMKLSAgICAgICAgOy8vIHBTY2FsZSAgICAgICAgICAtIFBvaW50ZXIgdG8gc2NhbGUgdmFsdWVzCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBxWGluICAgICAgICAgICAgLSBuIHRoIG91dHB1dCBRIHJlZ2lzdGVyIHdpdGggZWlnaHQgUzE2IG91dHB1dCB2YWx1ZXMgb2YgMXN0IHN0YWdlCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0lEQ1RfUFJFU0NBTEUxNgotICAgICAgICBWTEQxICAgICAgICBxU2NhbGUxLCBbcFNjYWxlXSwgIzE2ICAgICAgOy8vIExvYWQgUHJlIHNjYWxlIGZvciByb3cgMAotICAgICAgICBWTEQxICAgICAgICBxU2NhbGUyLCBbcFNjYWxlXSwgIzE2ICAgICAgOy8vIExvYWQgUHJlIHNjYWxlIGZvciByb3cgMAotICAgICAgICBNX0lEQ1RfU0NBTEUxNiBkWGowbG8sIGRYajBoaSwgZFhqMWxvLCBkWGoxaGksIDAgICAgICAgIDsvLyBQcmUgc2NhbGUgcm93IDAgJiAxCi0gICAgICAgIE1fSURDVF9TQ0FMRTE2IGRYajJsbywgZFhqMmhpLCBkWGozbG8sIGRYajNoaSwgMCAgICAgICAgCi0gICAgICAgIE1fSURDVF9TQ0FMRTE2IGRYajRsbywgZFhqNGhpLCBkWGo1bG8sIGRYajVoaSwgMCAgICAgICAgCi0gICAgICAgIE1fSURDVF9TQ0FMRTE2IGRYajZsbywgZFhqNmhpLCBkWGo3bG8sIGRYajdoaSwgMSAgICAgICAgCi0gICAgICAgIFZIQUREICAgICAgIHFYaTUsIHFYajEsIHFYajcgICAgICAgICAgICA7Ly8gKGoxK2o3KS8yCi0gICAgICAgIFZTVUIgICAgICAgIHFYaTYsIHFYajEsIHFYajcgICAgICAgICAgICA7Ly8gajEtajcKLSAgICAgICAgTERSICAgICAgICAgcFNyYywgPWFybUNPTU1fSURDVENvZWYgOy8vIEFkZHJlc3Mgb2YgRENUIGludmVyc2UgQUFOIGNvbnN0YW50cwotICAgICAgICBWSEFERCAgICAgICBxWGkzLCBxWGoyLCBxWGo2ICAgICAgICAgICAgOy8vIChqMitqNikvMgotICAgICAgICBWU1VCICAgICAgICBxWGkyLCBxWGoyLCBxWGo2ICAgICAgICAgICAgOy8vIGoyLWo2Ci0gICAgICAgIFZMRFIgICAgICAgIGRDb2VmcywgW3BTcmNdICAgICAgICAgICAgICA7Ly8gTG9hZCBEQ1QgaW52ZXJzZSBBQU4gY29uc3RhbnRzCi0gICAgICAgIFZIQUREICAgICAgIHFYaTcsIHFYajUsIHFYajMgICAgICAgICAgICA7Ly8gKGo1K2ozKS8yCi0gICAgICAgIFZTVUIgICAgICAgIHFYaTQsIHFYajUsIHFYajMgICAgICAgICAgICA7Ly8gajUtajMKLSAgICAgICAgTUVORCAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gU2NhbGUgOHg4IGJsb2NrIGlucHV0IHZhbHVlcyB3aXRoIDMyIGJpdCBzY2FsZSB2YWx1ZXMKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gcHJlLXNjYWxlIGJsb2NrIG9mIDh4OCBpbnB1dC4KLSAgICAgICAgOy8vIFRoaXMgYWxzbyBkbyB0aGUgSXN0IHN0YWdlIHRyYW5zZm9ybWF0aW9ucyBvZiBJRENULgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBkWGpubG8gICAgICAgICAgLSBuIHRoIGlucHV0IEQgcmVnaXN0ZXIgd2l0aCBmaXJzdCBmb3VyIFMxNiB2YWx1ZXMKLSAgICAgICAgOy8vIGRYam5oaSAgICAgICAgICAtIG4gdGggaW5wdXQgRCByZWdpc3RlciB3aXRoIG5leHQgZm91ciBTMTYgdmFsdWVzCi0gICAgICAgIDsvLyBxWGpuICAgICAgICAgICAgLSBuIHRoIGlucHV0IFEgcmVnaXN0ZXIgd2l0aCBlaWdodCBTMTYgdmFsdWVzCi0gICAgICAgIDsvLyBwU2NhbGUgICAgICAgICAgLSBQb2ludGVyIHRvIDMyYml0IHNjYWxlIHZhbHVlcyBpbiBRMjMgZm9ybWF0Ci0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBkWGlubG8gICAgICAgICAgLSBuIHRoIG91dHB1dCBEIHJlZ2lzdGVyIHdpdGggZmlyc3QgZm91ciBTMTYgb3V0cHV0IHZhbHVlcyBvZiAxc3Qgc3RhZ2UKLSAgICAgICAgOy8vIGRYaW5oaSAgICAgICAgICAtIG4gdGggb3V0cHV0IEQgcmVnaXN0ZXIgd2l0aCBuZXh0IGZvdXIgUzE2IG91dHB1dCB2YWx1ZXMgb2YgMXN0IHN0YWdlCi0gICAgICAgIDsvLwotICAgICAgICBNQUNSTwotICAgICAgICBNX0lEQ1RfUFJFU0NBTEUzMgotcVNjYWxlMGxvICAgICAgIFFOIDAuUzMyCi1xU2NhbGUwaGkgICAgICAgUU4gMS5TMzIKLXFTY2FsZTFsbyAgICAgICBRTiAyLlMzMgotcVNjYWxlMWhpICAgICAgIFFOIDMuUzMyCi1xU2NhbGUybG8gICAgICAgUU4gcVNjYWxlMWxvCi1xU2NhbGUyaGkgICAgICAgUU4gcVNjYWxlMWhpCi1xU2NhbGUzbG8gICAgICAgUU4gcVNjYWxlMWxvCi1xU2NhbGUzaGkgICAgICAgUU4gcVNjYWxlMWhpCi1xU2NhbGU0bG8gICAgICAgUU4gcVNjYWxlMWxvCi1xU2NhbGU0aGkgICAgICAgUU4gcVNjYWxlMWhpCi1xU2NhbGU1bG8gICAgICAgUU4gcVNjYWxlMGxvCi1xU2NhbGU1aGkgICAgICAgUU4gcVNjYWxlMGhpCi1xU2NhbGU2bG8gICAgICAgUU4gcVNjYWxlMGxvCi1xU2NhbGU2aGkgICAgICAgUU4gcVNjYWxlMGhpCi1xU2NhbGU3bG8gICAgICAgUU4gcVNjYWxlMGxvCi1xU2NhbGU3aGkgICAgICAgUU4gcVNjYWxlMGhpCi0KLXFTcmMwbG8gICAgICAgICBRTiA0LlMzMgotcVNyYzBoaSAgICAgICAgIFFOIDUuUzMyCi1xU3JjMWxvICAgICAgICAgUU4gNi5TMzIKLXFTcmMxaGkgICAgICAgICBRTiBTcmM0LlMzMgotcVNyYzJsbyAgICAgICAgIFFOIHFTcmMwbG8KLXFTcmMyaGkgICAgICAgICBRTiBxU3JjMGhpCi1xU3JjM2xvICAgICAgICAgUU4gcVNyYzBsbwotcVNyYzNoaSAgICAgICAgIFFOIHFTcmMwaGkKLXFTcmM0bG8gICAgICAgICBRTiBxU3JjMGxvCi1xU3JjNGhpICAgICAgICAgUU4gcVNyYzBoaQotcVNyYzVsbyAgICAgICAgIFFOIHFTcmMxbG8KLXFTcmM1aGkgICAgICAgICBRTiBxU3JjMWhpCi1xU3JjNmxvICAgICAgICAgUU4gcVNyYzFsbwotcVNyYzZoaSAgICAgICAgIFFOIHFTcmMxaGkKLXFTcmM3bG8gICAgICAgICBRTiBxU3JjMGxvCi1xU3JjN2hpICAgICAgICAgUU4gcVNyYzBoaQotCi1xUmVzMTdsbyAgICAgICAgUU4gcVNjYWxlMGxvCi1xUmVzMTdoaSAgICAgICAgUU4gcVNjYWxlMGhpCi1xUmVzMjZsbyAgICAgICAgUU4gcVNjYWxlMGxvCi1xUmVzMjZoaSAgICAgICAgUU4gcVNjYWxlMGhpCi1xUmVzNTNsbyAgICAgICAgUU4gcVNjYWxlMGxvCi1xUmVzNTNoaSAgICAgICAgUU4gcVNjYWxlMGhpCi0KLSAgICAgICAgICAgIEFERCAgICAgICAgIHBUZW1wLCBwU2NhbGUsICM0KjgqNyAgICAgICAgICAgOy8vIEFkZHJlc3Mgb2YgIHBTY2FsZVs3XQotICAgICAgICAgICAgCi0gICAgICAgICAgICA7Ly8gUm93IDAKLSAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGUwbG8sIHFTY2FsZTBoaX0sIFtwU2NhbGVdIQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzBsbywgZFhqMGxvLCAjKDEyLTEpCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMGhpLCBkWGowaGksICMoMTItMSkgICAgICAgICAgICAKLSAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGUxbG8sIHFTY2FsZTFoaX0sIFtwU2NhbGVdIQotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzBsbywgcVNjYWxlMGxvLCBxU3JjMGxvCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMGhpLCBxU2NhbGUwaGksIHFTcmMwaGkKLSAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGU3bG8sIHFTY2FsZTdoaX0sIFtwVGVtcF0hCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMWxvLCBkWGoxbG8sICMoMTItMSkKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMxaGksIGRYajFoaSwgIygxMi0xKSAgICAgICAgICAgIAotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMGxvLCBxU3JjMGxvICAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGkwCi0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGkwaGksIHFTcmMwaGkKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM3bG8sIGRYajdsbywgIygxMi0xKQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzdoaSwgZFhqN2hpLCAjKDEyLTEpCi0gICAgICAgICAgICBTVUIgICAgICAgICBwVGVtcCwgcFRlbXAsICMoKDE2KjIpKyg0KjgqMSkpCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMWxvLCBxU2NhbGUxbG8sIHFTcmMxbG8KLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMxaGksIHFTY2FsZTFoaSwgcVNyYzFoaQotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzdsbywgcVNjYWxlN2xvLCBxU3JjN2xvCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjN2hpLCBxU2NhbGU3aGksIHFTcmM3aGkKLSAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGUybG8sIHFTY2FsZTJoaX0sIFtwU2NhbGVdIQotCi0gICAgICAgICAgICA7Ly8gUm93IDEgJiA3Ci0gICAgICAgICAgICBWSEFERCAgICAgICBxUmVzMTdsbywgcVNyYzFsbywgcVNyYzdsbyAgICAgIDsvLyAoajErajcpLzIKLSAgICAgICAgICAgIFZIQUREICAgICAgIHFSZXMxN2hpLCBxU3JjMWhpLCBxU3JjN2hpICAgICAgOy8vIChqMStqNykvMgotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNWxvLCBxUmVzMTdsbyAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGk1Ci0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGk1aGksIHFSZXMxN2hpICAgICAgICAgICAgICAKLSAgICAgICAgICAgIFZTVUIgICAgICAgIHFSZXMxN2xvLCBxU3JjMWxvLCBxU3JjN2xvICAgICAgOy8vIGoxLWo3Ci0gICAgICAgICAgICBWU1VCICAgICAgICBxUmVzMTdoaSwgcVNyYzFoaSwgcVNyYzdoaSAgICAgIDsvLyBqMS1qNwotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNmxvLCBxUmVzMTdsbyAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGk2Ci0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGk2aGksIHFSZXMxN2hpICAgICAgCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMmxvLCBkWGoybG8sICMoMTItMSkKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMyaGksIGRYajJoaSwgIygxMi0xKQotICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTZsbywgcVNjYWxlNmhpfSwgW3BUZW1wXSEKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM2bG8sIGRYajZsbywgIygxMi0xKQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzZoaSwgZFhqNmhpLCAjKDEyLTEpCi0gICAgICAgICAgICBTVUIgICAgICAgICBwVGVtcCwgcFRlbXAsICMoKDE2KjIpKyg0KjgqMSkpCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMmxvLCBxU2NhbGUybG8sIHFTcmMybG8KLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMyaGksIHFTY2FsZTJoaSwgcVNyYzJoaQotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzZsbywgcVNjYWxlNmxvLCBxU3JjNmxvCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjNmhpLCBxU2NhbGU2aGksIHFTcmM2aGkKLSAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGUzbG8sIHFTY2FsZTNoaX0sIFtwU2NhbGVdIQotCi0gICAgICAgICAgICA7Ly8gUm93IDIgJiA2Ci0gICAgICAgICAgICBWSEFERCAgICAgICBxUmVzMjZsbywgcVNyYzJsbywgcVNyYzZsbyAgICAgIDsvLyAoajIrajYpLzIKLSAgICAgICAgICAgIFZIQUREICAgICAgIHFSZXMyNmhpLCBxU3JjMmhpLCBxU3JjNmhpICAgICAgOy8vIChqMitqNikvMgotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpM2xvLCBxUmVzMjZsbyAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGkzCi0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGkzaGksIHFSZXMyNmhpICAgICAgICAgICAgICAKLSAgICAgICAgICAgIFZTVUIgICAgICAgIHFSZXMyNmxvLCBxU3JjMmxvLCBxU3JjNmxvICAgICAgOy8vIGoyLWo2Ci0gICAgICAgICAgICBWU1VCICAgICAgICBxUmVzMjZoaSwgcVNyYzJoaSwgcVNyYzZoaSAgICAgIDsvLyBqMi1qNgotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMmxvLCBxUmVzMjZsbyAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGkyCi0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGkyaGksIHFSZXMyNmhpICAgICAgCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjM2xvLCBkWGozbG8sICMoMTItMSkKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMzaGksIGRYajNoaSwgIygxMi0xKQotICAgICAgICAgICAgVkxEMSAgICAgICAge3FTY2FsZTVsbywgcVNjYWxlNWhpfSwgW3BUZW1wXSEKLSAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM1bG8sIGRYajVsbywgIygxMi0xKQotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzVoaSwgZFhqNWhpLCAjKDEyLTEpCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjM2xvLCBxU2NhbGUzbG8sIHFTcmMzbG8KLSAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMzaGksIHFTY2FsZTNoaSwgcVNyYzNoaQotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzVsbywgcVNjYWxlNWxvLCBxU3JjNWxvCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjNWhpLCBxU2NhbGU1aGksIHFTcmM1aGkKLSAgICAgICAgICAgIAotICAgICAgICAgICAgOy8vIFJvdyAzICYgNQotICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczUzbG8sIHFTcmM1bG8sIHFTcmMzbG8gICAgICA7Ly8gKGo1K2ozKS8yCi0gICAgICAgICAgICBWSEFERCAgICAgICBxUmVzNTNoaSwgcVNyYzVoaSwgcVNyYzNoaSAgICAgIDsvLyAoajUrajMpLzIKLSAgICAgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMxNioyKjIKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTdsbywgcVJlczUzbG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpNwotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpN2hpLCBxUmVzNTNoaSAgICAgICAgICAgICAgCi0gICAgICAgICAgICBWU1VCICAgICAgICBxUmVzNTNsbywgcVNyYzVsbywgcVNyYzNsbyAgICAgIDsvLyBqNS1qMwotICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczUzaGksIHFTcmM1aGksIHFTcmMzaGkgICAgICA7Ly8gajUtajMKLSAgICAgICAgICAgIFZMRDEgICAgICAgIHFYajQsIFtwU3JjIEA2NF0KLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTRsbywgcVJlczUzbG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpNAotICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNGhpLCBxUmVzNTNoaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzRsbywgZFhqNGxvLCAjKDEyLTEpCi0gICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNGhpLCBkWGo0aGksICMoMTItMSkKLSAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGU0bG8sIHFTY2FsZTRoaX0sIFtwU2NhbGVdICAgICAgICAgICAgCi0gICAgICAgICAgICBMRFIgICAgICAgICBwU3JjLCA9YXJtQ09NTV9JRENUQ29lZiAgICAgOy8vIEFkZHJlc3Mgb2YgRENUIGludmVyc2UgQUFOIGNvbnN0YW50cwotICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzRsbywgcVNjYWxlNGxvLCBxU3JjNGxvCi0gICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjNGhpLCBxU2NhbGU0aGksIHFTcmM0aGkKLSAgICAgICAgICAgIFZMRFIgICAgICAgIGRDb2VmcywgW3BTcmNdICAgICAgICAgICAgICAgICAgOy8vIExvYWQgRENUIGludmVyc2UgQUFOIGNvbnN0YW50cwotICAgICAgICAgICAgOy8vIFJvdyA0Ci0gICAgICAgICAgICBWTU9WTiAgICAgICBkWGkxbG8sIHFTcmM0bG8gICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTEKLSAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTFoaSwgcVNyYzRoaSAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNRU5ECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fTWFza1RhYmxlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fTWFza1RhYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZmM4MzUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybUNPTU1fTWFza1RhYmxlLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIE1hc2sgVGFibGUgdG8gbWFzayB0aGUgZW5kIG9mIGFycmF5Ci0gKi8KLSAKLQotCi0jaWZuZGVmIF9BUk1DT01NX01BU0tUQUJMRV9IXwotI2RlZmluZSBfQVJNQ09NTV9NQVNLVEFCTEVfSF8KLQotI2RlZmluZSBNYXNrVGFibGVTaXplIDcyCi0gIAotLyogTWFzayB0YWJsZSAqLwotCi1leHRlcm4gY29uc3QgT01YX1UxNiBhcm1DT01NX3FNYXNrVGFibGUxNltNYXNrVGFibGVTaXplXTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtQ09NTV9xTWFza1RhYmxlOFtNYXNrVGFibGVTaXplXTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fVmVyc2lvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX1ZlcnNpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFiM2UxZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fVmVyc2lvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyogR3VhcmQgdGhlIGhlYWRlciBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbi4gKi8KLSNpZm5kZWYgX19BUk1fQ09NTV9WRVJTSU9OX0hfXwotI2RlZmluZSBfX0FSTV9DT01NX1ZFUlNJT05fSF9fCi0KLQotLyogVGhlIGZvbGxvd2luZyBsaW5lIHNob3VsZCBiZSBpbiBvbXh0eXBlcy5oIGJ1dCBoYXNuJ3QgYmVlbiBhcHByb3ZlZCBieSBPcGVuTUFYIHlldCAqLwotI2RlZmluZSBPTVhfVkVSU0lPTiAxMDIKLQotLyogV2UgbmVlZCB0byBkZWZpbmUgdGhlc2UgbWFjcm9zIGluIG9yZGVyIHRvIGNvbnZlcnQgYSAjZGVmaW5lIG51bWJlciBpbnRvIGEgI2RlZmluZSBzdHJpbmcuICovCi0jZGVmaW5lIEFSTV9RVU9URShhKSAjYQotI2RlZmluZSBBUk1fSU5ESVJFQ1QoQSkgQVJNX1FVT1RFKEEpCi0KLS8qIENvbnZlcnQgdGhlIE9NWF9WRVJTSU9OIG51bWJlciBpbnRvIGEgc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQsIGZvciBleGFtcGxlLCB0byBwcmludCBpdCBvdXQuICovCi0jZGVmaW5lIEFSTV9WRVJTSU9OX1NUUklORyBBUk1fSU5ESVJFQ1QoT01YX1ZFUlNJT04pCi0KLQotLyogRGVmaW5lIHRoaXMgaW4gb3JkZXIgdG8gdHVybiBvbiBBUk0gdmVyc2lvbi9yZWxlYXNlL2J1aWxkIHN0cmluZ3MgaW4gZWFjaCBkb21haW4gKi8KLSNkZWZpbmUgQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMKLQotI2lmZGVmIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TCi0gIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214QUNfVmVyc2lvbkRlc2NyaXB0aW9uOwotICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teElDX1ZlcnNpb25EZXNjcmlwdGlvbjsKLSAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhJUF9WZXJzaW9uRGVzY3JpcHRpb247Ci0gIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214U1BfVmVyc2lvbkRlc2NyaXB0aW9uOwotICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teFZDX1ZlcnNpb25EZXNjcmlwdGlvbjsKLSNlbmRpZiAvKiBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUyAqLwotCi0KLS8qIFRoZSBmb2xsb3dpbmcgZW50cmllcyBzaG91bGQgYmUgYXV0b21hdGljYWxseSB1cGRhdGVkIGJ5IHRoZSByZWxlYXNlIHNjcmlwdCAqLwotLyogVGhleSBhcmUgdXNlZCBpbiB0aGUgQVJNIHZlcnNpb24gc3RyaW5ncyBkZWZpbmVkIGZvciBlYWNoIGRvbWFpbi4gICAgICAgICAgICAgKi8KLQotLyogVGhlIHJlbGVhc2UgdGFnIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlbGVhc2Ugb2YgdGhlIGxpYnJhcnkuIC0gdXNlZCBmb3Igc291cmNlIGFuZCBvYmplY3QgcmVsZWFzZXMgKi8KLSNkZWZpbmUgT01YX0FSTV9SRUxFQVNFX1RBRyAgInIxcDAtMDBiZXQwIgotCi0vKiBUaGUgQVJNIGFyY2hpdGVjdHVyZSB1c2VkIHRvIGJ1aWxkIGFueSBvYmplY3RzIG9yIGV4ZWN1dGFibGVzIGluIHRoaXMgcmVsZWFzZS4gKi8KLSNkZWZpbmUgT01YX0FSTV9CVUlMRF9BUkNISVRFQ1RVUkUgIkFSTSBBcmNoaXRlY3R1cmUgVjcgd2l0aCBORU9OIgotCi0vKiBUaGUgQVJNIFRvb2xjaGFpbiB1c2VkIHRvIGJ1aWxkIGFueSBvYmplY3RzIG9yIGV4ZWN1dGFibGVzIGluIHRoaXMgcmVsZWFzZS4gKi8KLSNkZWZpbmUgT01YX0FSTV9CVUlMRF9UT09MQ0hBSU4gICAgIkFSTSBSVkNUIDMuMSIKLQotCi0jZW5kaWYgLyogX19BUk1fQ09NTV9WRVJTSU9OX0hfXyAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIxZDJkMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE3MSArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtQ09NTV9zLmgKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi07Ly8gQVJNIG9wdGltaXplZCBPcGVuTUFYIGNvbW1vbiBoZWFkZXIgZmlsZQotOy8vCi0KLTsvLyBQcm90ZWN0IGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uCi0gSUYgOkxOT1Q6OkRFRjpBUk1DT01NX1NfSAotIEdCTEwgQVJNQ09NTV9TX0gKLQotICAgICAgICBSRVFVSVJFOCAgICAgICAgICAgIDsvLyBSZXF1aXJlcyA4LWJ5dGUgc3RhY2sgYWxpZ25tZW50Ci0gICAgICAgIFBSRVNFUlZFOCAgICAgICAgICAgOy8vIFByZXNlcnZlcyA4LWJ5dGUgc3RhY2sgYWxpZ25tZW50Ci0gICAgICAgIAotICAgICAgICBHQkxMICAgIEFSTV9FUlJPUkNIRUNLCi1BUk1fRVJST1JDSEVDSyAgU0VUTCB7RkFMU0V9Ci0KLTsvLyBHbG9iYWxzCi0KLSAgICAgICAgR0JMUyAgICBfUlJlZ0xpc3QgICA7Ly8gUiBzYXZlZCByZWdpc3RlciBsaXN0Ci0gICAgICAgIEdCTFMgICAgX0RSZWdMaXN0ICAgOy8vIEQgc2F2ZWQgcmVnaXN0ZXIgbGlzdAotICAgICAgICBHQkxTICAgIF9WYXJpYW50ICAgIDsvLyBTZWxlY3RlZCBwcm9jZXNzb3IgdmFyaWFudAotICAgICAgICBHQkxTICAgIF9DUFUgICAgICAgIDsvLyBDUFUgbmFtZQotICAgICAgICBHQkxTICAgIF9TdHJ1Y3QgICAgIDsvLyBTdHJ1Y3R1cmUgbmFtZQotICAgICAgICAKLSAgICAgICAgR0JMTCAgICBfSW5GdW5jICAgICA7Ly8gSW5zaWRlIGZ1bmN0aW9uIGFzc2VtYmx5IGZsYWcKLSAgICAgICAgR0JMTCAgICBfU3dMb25nICAgICA7Ly8gTG9uZyBzd2l0Y2ggZmxhZwotICAgICAgICAKLSAgICAgICAgR0JMQSAgICBfUkJ5dGVzICAgICA7Ly8gTnVtYmVyIG9mIHJlZ2lzdGVyIGJ5dGVzIG9uIHN0YWNrCi0gICAgICAgIEdCTEEgICAgX1NCeXRlcyAgICAgOy8vIE51bWJlciBvZiBzY3JhdGNoIGJ5dGVzIG9uIHN0YWNrIAotICAgICAgICBHQkxBICAgIF9BQnl0ZXMgICAgIDsvLyBTdGFjayBvZmZzZXQgb2YgbmV4dCBhcmd1bWVudAotICAgICAgICBHQkxBICAgIF9Xb3Jrc3BhY2UgIDsvLyBTdGFjayBvZmZzZXQgb2Ygc2NyYXRjaCB3b3Jrc3BhY2UKLSAgICAgICAgR0JMQSAgICBfRiAgICAgICAgICA7Ly8gRnVuY3Rpb24gbnVtYmVyCi0gICAgICAgIEdCTEEgICAgX1N0T2ZmICAgICAgOy8vIFN0cnVjdCBvZmZzZXQKLSAgICAgICAgR0JMQSAgICBfU3dOdW0gICAgICA7Ly8gU3dpdGNoIG51bWJlcgotICAgICAgICBHQkxTICAgIF8zMiAgICAgICAgIDsvLyBTdWZmaXggZm9yIDMyIGJ5dGUgYWxpZ25tbmV0Ci0gICAgICAgIEdCTFMgICAgXzE2ICAgICAgICAgOy8vIFN1ZmZpeCBmb3IgMTYgYnl0ZSBhbGlnbm1uZXQKLSAgICAgICAgCi1fSW5GdW5jICAgICAgICAgU0VUTCAgICB7RkFMU0V9Ci1fU0J5dGVzICAgICAgICAgU0VUQSAgICAwCi1fRiAgICAgICAgICAgICAgU0VUQSAgICAwCi1fU3dOdW0gICAgICAgICAgU0VUQSAgICAwCi1fMzIgICAgICAgICAgICAgU0VUUyAgICAiQUxJR04zMiIKLV8xNiAgICAgICAgICAgICBTRVRTICAgICJBTElHTjE2IgotCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi07Ly8gT3ZlcnJpZGUgdGhlIHRvb2xzIHNldHRpbmdzIG9mIHRoZSBDUFUgaWYgdGhlICNkZWZpbmUKLTsvLyBVU0VDUFUgaXMgc2V0LCBvdGhlcndpc2UgdXNlIHRoZSBDUFUgZGVmaW5lZCBieSB0aGUKLTsvLyBhc3NlbWJsZXIgc2V0dGluZ3MuCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAgICBJRiA6REVGOiBPVkVSUklERUNQVQotX0NQVSAgICAgICBTRVRTICBPVkVSUklERUNQVQotICAgICAgIEVMU0UKLV9DUFUgICAgICAgU0VUUyAgICB7Q1BVfSAgICAgICAKLSAgICAgICBFTkRJRgotCi0KLQotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotOy8vIFdvcmsgb3V0IHdoaWNoIGNvZGUgdG8gYnVpbGQKLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgICAgICBJRiA6REVGOkFSTTExMzZKUzpMT1I6OkRFRjpDb3J0ZXhBODpMT1I6OkRFRjpBUk1fR0VORVJJQwotICAgICAgICAgICAgSU5GTyAxLCJQbGVhc2Ugc3dpdGNoIHRvIHVzaW5nIE1fVkFSSUFOVFMiCi0gICAgICAgIEVORElGCi0KLSAgICAgICAgOy8vIERlZmluZSBhbmQgcmVzZXQgYWxsIG9mZmljaWFsbHkgcmVjb25nbmlzZWQgdmFyaWFudHMKLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fREVGX1ZBUklBTlRTCi0gICAgICAgIF9NX0RFRl9WQVJJQU5UIEFSTTkyNkVKUwotICAgICAgICBfTV9ERUZfVkFSSUFOVCBBUk0xMTM2SlMKLSAgICAgICAgX01fREVGX1ZBUklBTlQgQVJNMTEzNkpTX1UKLSAgICAgICAgX01fREVGX1ZBUklBTlQgQ29ydGV4QTgKLSAgICAgICAgX01fREVGX1ZBUklBTlQgQVJNN1RETUkKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fREVGX1ZBUklBTlQgJHZhcgotICAgICAgICBHQkxMICR2YXIKLSAgICAgICAgR0JMTCBfb2skdmFyCi0kdmFyICAgIFNFVEwge0ZBTFNFfQotICAgICAgICBNRU5EICAgICAgICAKLSAgICAgICAgCi0KLSAgICAgICAgOy8vIFZhcmlhbnQgZGVjbGFyYXRpb24KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBEZWZpbmUgYSBsaXN0IG9mIGNvZGUgdmFyaWFudHMgc3VwcG9ydGVkIGJ5IHRoaXMKLSAgICAgICAgOy8vIHNvdXJjZSBmaWxlLiBUaGlzIG1hY3JvIHRoZW4gY2hvb3NlcyB0aGUgbW9zdAotICAgICAgICA7Ly8gYXBwcm9wcmlhdGUgdmFyaWFudCB0byBidWlsZCBmb3IgdGhlIGN1cnJlbnRseSBjb25maWd1cmVkCi0gICAgICAgIDsvLyBjb3JlLgotICAgICAgICA7Ly8gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBNX1ZBUklBTlRTICR2MCwkdjEsJHYyLCR2MywkdjQsJHY1LCR2NiwkdjcgICAgICAgIAotICAgICAgICA7Ly8gU2V0IHRvIFRSVUUgdmFyaWFudHMgdGhhdCBhcmUgc3VwcG9ydGVkCi0gICAgICAgIF9NX0RFRl9WQVJJQU5UUwotICAgICAgICBfTV9WQVJJQU5UICR2MAotICAgICAgICBfTV9WQVJJQU5UICR2MQotICAgICAgICBfTV9WQVJJQU5UICR2MgotICAgICAgICBfTV9WQVJJQU5UICR2MwotICAgICAgICBfTV9WQVJJQU5UICR2NAotICAgICAgICBfTV9WQVJJQU5UICR2NQotICAgICAgICBfTV9WQVJJQU5UICR2NgotICAgICAgICBfTV9WQVJJQU5UICR2NwotICAgICAgICAKLSAgICAgICAgOy8vIExvb2sgZm9yIGZpcnN0IGF2YWlsYWJsZSB2YXJpYW50IHRvIG1hdGNoIGEgQ1BVCi0gICAgICAgIDsvLyBfTV9UUlkgY3B1LCB2YXJpYW50IGZhbGwgYmFjayBsaXN0Ci1fVmFyaWFudCBTRVRTICIiICAgICAgICAgICAgICAgIAotICAgICAgICBfTV9UUlkgQVJNOTI2RUotUywgICBBUk05MjZFSlMKLSAgICAgICAgX01fVFJZIEFSTTExNzZKWi1TLCAgQVJNMTEzNkpTCi0gICAgICAgIF9NX1RSWSBBUk0xMTc2SlpGLVMsIEFSTTExMzZKUwotICAgICAgICBfTV9UUlkgQVJNMTE1NlQyLVMsICBBUk0xMTM2SlMKLSAgICAgICAgX01fVFJZIEFSTTExNTZUMkYtUywgQVJNMTEzNkpTCi0gICAgICAgIF9NX1RSWSBBUk0xMTM2Si1TLCAgIEFSTTExMzZKUwotICAgICAgICBfTV9UUlkgQVJNMTEzNkpGLVMsICBBUk0xMTM2SlMKLSAgICAgICAgX01fVFJZIE1QQ29yZSwgICAgICAgQVJNMTEzNkpTCi0gICAgICAgIF9NX1RSWSBmYWxjb24tdmZwLCBBUk0xMTM2SlMKLSAgICAgICAgX01fVFJZIGZhbGNvbi1mdWxsLW5lb24sIENvcnRleEE4Ci0gICAgICAgIF9NX1RSWSBDb3J0ZXgtQThOb05lb24sIEFSTTExMzZKUwotICAgICAgICBfTV9UUlkgQ29ydGV4LUE4LCAgICBDb3J0ZXhBOCwgQVJNMTEzNkpTCi0gICAgICAgIF9NX1RSWSBDb3J0ZXgtUjQsICAgIEFSTTExMzZKUwotICAgICAgICBfTV9UUlkgQVJNN1RETUkKLSAgICAgICAgCi0gICAgICAgIDsvLyBTZWxlY3QgdGhlIGNvcnJlY3QgdmFyaWFudAotICAgICAgICBfTV9ERUZfVkFSSUFOVFMKLSAgICAgICAgSUYgX1ZhcmlhbnQ9IiIKLSAgICAgICAgICAgIElORk8gMSwgIk5vIG1hdGNoIGZvdW5kIGZvciBDUFUgJyRfQ1BVJyIKLSAgICAgICAgRUxTRQotJF9WYXJpYW50ICAgU0VUTCB7VFJVRX0KLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIFJlZ2lzdGVyIGEgdmFyaWFudCBhcyBhdmFpbGFibGUKLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fVkFSSUFOVCAkdmFyCi0gICAgICAgIElGICIkdmFyIj0iIgotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgOkxOT1Q6OkRFRjpfb2skdmFyCi0gICAgICAgICAgICBJTkZPIDEsICJVbnJlY29nbml6ZWQgdmFyaWFudCAnJHZhciciCi0gICAgICAgIEVORElGCi0kdmFyICAgIFNFVEwge1RSVUV9Ci0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBGb3IgYSBnaXZlbiBDUFUsIHNlZSBpZiBhbnkgb2YgdGhlIHZhcmlhbnRzIHN1cHBvcnRpbmcKLSAgICAgICAgOy8vIHRoaXMgQ1BVIGFyZSBhdmFpbGFibGUuIFRoZSBmaXJzdCBhdmFpbGFibGUgdmFyaWFudCBpcwotICAgICAgICA7Ly8gY2hvc2VuCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX1RSWSAkY3B1LCAkdjAsJHYxLCR2MiwkdjMsJHY0LCR2NSwkdjYsJHY3Ci0gICAgICAgIElGICIkY3B1Ijw+X0NQVQotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgX01fVFJZMSAkdjAKLSAgICAgICAgX01fVFJZMSAkdjEKLSAgICAgICAgX01fVFJZMSAkdjIKLSAgICAgICAgX01fVFJZMSAkdjMKLSAgICAgICAgX01fVFJZMSAkdjQKLSAgICAgICAgX01fVFJZMSAkdjUKLSAgICAgICAgX01fVFJZMSAkdjYKLSAgICAgICAgX01fVFJZMSAkdjcKLSAgICAgICAgOy8vIENoZWNrIGEgbWF0Y2ggd2FzIGZvdW5kCi0gICAgICAgIElGIF9WYXJpYW50PSIiCi0gICAgICAgICAgICBJTkZPIDEsICJObyB2YXJpYW50IG1hdGNoIGZvdW5kIGZvciBDUFUgJyRfQ1BVJyIKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fVFJZMSAkdmFyCi0gICAgICAgIElGICIkdmFyIj0iIgotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgKF9WYXJpYW50PSIiKTpMQU5EOiR2YXIKLV9WYXJpYW50IFNFVFMgIiR2YXIiCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLTsvLyBTdHJ1Y3R1cmUgZGVmaW5pdGlvbgotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAgICAgOy8vIERlY2xhcmUgYSBzdHJ1Y3R1cmUgb2YgZ2l2ZW4gbmFtZQotICAgICAgICBNQUNSTwotICAgICAgICBNX1NUUlVDVCAkc25hbWUKLV9TdHJ1Y3QgU0VUUyAiJHNuYW1lIgotX1N0T2ZmICBTRVRBIDAKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIERlY2xhcmUgYSBzdHJ1Y3R1cmUgZmllbGQKLSAgICAgICAgOy8vIFRoZSBmaWVsZCBpcyBjYWxsZWQgJHNuYW1lXyRmbmFtZQotICAgICAgICA7Ly8gJHNpemUgICA9IHRoZSBzaXplIG9mIGVhY2ggZW50cnksIG11c3QgYmUgcG93ZXIgb2YgMiAKLSAgICAgICAgOy8vICRudW1iZXIgPSAoaWYgcHJvdmlkZWQpIHRoZSBudW1iZXIgb2YgZW50cmllcyBmb3IgYW4gYXJyYXkKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9GSUVMRCAkZm5hbWUsICRzaXplLCAkbnVtYmVyCi0gICAgICAgIElGIChfU3RPZmY6QU5EOigkc2l6ZS0xKSkhPTAKLV9TdE9mZiAgICAgIFNFVEEgX1N0T2ZmICsgKCRzaXplIC0gKF9TdE9mZjpBTkQ6KCRzaXplLTEpKSkKLSAgICAgICAgRU5ESUYKLSRfU3RydWN0Ll8kZm5hbWUgRVFVIF9TdE9mZgotICAgICAgICBJRiAiJG51bWJlciI8PiIiCi1fU3RPZmYgICAgICBTRVRBIF9TdE9mZiArICRzaXplKiRudW1iZXIKLSAgICAgICAgRUxTRQotX1N0T2ZmICAgICAgU0VUQSBfU3RPZmYgKyAkc2l6ZQotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9FTkRTVFJVQ1QKLXNpemVvZl8kX1N0cnVjdCBFUVUgX1N0T2ZmCi1fU3RydWN0IFNFVFMgIiIKLSAgICAgICAgTUVORAotCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotOy8vIFN3aXRjaCBhbmQgdGFibGUgbWFjcm9zCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgICAgIDsvLyBTdGFydCBhIHJlbGF0aXZlIHN3aXRjaCB0YWJsZSB3aXRoIHJlZ2lzdGVyIHRvIHN3aXRjaCBvbgotICAgICAgICA7Ly8KLSAgICAgICAgOy8vICR2ID0gdGhlIHJlZ2lzdGVyIHRvIHN3aXRjaCBvbgotICAgICAgICA7Ly8gJHMgPSBpZiBzcGVjaWZpZWQgbXVzdCBiZSAiTCIgdG8gaW5kaWNhdGUgbG9uZwotICAgICAgICA7Ly8gICAgICB0aGlzIGFsbG93cyBhIGdyZWF0ZXIgcmFuZ2UgdG8gdGhlIGNhc2UgY29kZQotICAgICAgICBNQUNSTwotICAgICAgICBNX1NXSVRDSCAkdiwgJHMKLSAgICAgICAgQVNTRVJUICIkcyI9IiI6TE9SOiIkcyI9IkwiCi1fU3dMb25nIFNFVEwge0ZBTFNFfQotICAgICAgICBJRiAiJHMiPSJMIgotX1N3TG9uZyAgICAgU0VUTCB7VFJVRX0KLSAgICAgICAgRU5ESUYKLV9Td051bSAgU0VUQSBfU3dOdW0rMSAgICAgICAgCi0gICAgICAgIElGIHtDT05GSUd9PTE2Ci0gICAgICAgICAgICA7Ly8gVGh1bWIKLSAgICAgICAgICAgIElGIF9Td0xvbmcKLSAgICAgICAgICAgICAgICBUQkggW3BjLCAkdiwgTFNMIzFdCi0gICAgICAgICAgICBFTFNFCi0gICAgICAgICAgICAgICAgVEJCIFtwYywgJHZdCi0gICAgICAgICAgICBFTkRJRgotX1N3aXRjaCRfU3dOdW0KLSAgICAgICAgRUxTRQotICAgICAgICAgICAgOy8vIEFSTQotICAgICAgICAgICAgQUREIHBjLCBwYywgJHYsIExTTCAjMgotICAgICAgICAgICAgTk9QCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBBZGQgYSBjYXNlIHRvIHRoZSBzd2l0Y2ggc3RhdGVtZW50Ci0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQ0FTRSAgJGxhYmVsCi0gICAgICAgIElGIHtDT05GSUd9PTE2Ci0gICAgICAgICAgICA7Ly8gVGh1bWIKLSAgICAgICAgICAgIElGIF9Td0xvbmcKLSAgICAgICAgICAgICAgICBEQ1cgKCRsYWJlbCAtIF9Td2l0Y2gkX1N3TnVtKS8yCi0gICAgICAgICAgICBFTFNFCi0gICAgICAgICAgICAgICAgRENCICgkbGFiZWwgLSBfU3dpdGNoJF9Td051bSkvMgotICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgRUxTRQotICAgICAgICAgICAgOy8vIEFSTQotICAgICAgICAgICAgQiAgICRsYWJlbAotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gRW5kIG9mIHN3aXRjaCBzdGF0ZW1lbnQKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9FTkRTV0lUQ0gKLSAgICAgICAgQUxJR04gMgotICAgICAgICBNRU5EICAgICAgIAotCi0KLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotOy8vIERhdGEgYXJlYSBhbGxvY2F0aW9uCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgICAgICA7Ly8gQ29uc3RhbnQgdGFibGUgYWxsb2NhdG9yIG1hY3JvCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gQ3JlYXRlcyBhIG5ldyBzZWN0aW9uIGZvciBlYWNoIGNvbnN0YW50IHRhYmxlCi0gICAgICAgIDsvLyAkbmFtZSBpcyBzeW1ib2wgdGhyb3VnaCB3aGljaCB0aGUgdGFibGUgY2FuIGJlIGFjY2Vzc2VkLgotICAgICAgICA7Ly8gJGFsaWduIGlzIHRoZSBvcHRpb25hbCBhbGlnbm1lbnQgb2YgdGhlIHRhYmxlLCBsb2cyIG9mIAotICAgICAgICA7Ly8gIHRoZSBieXRlIGFsaWdubWVudCAtICRhbGlnbj00IGlzIDE2IGJ5dGUgYWxpZ25lZAotICAgICAgICBNQUNSTwotICAgICAgICBNX1RBQkxFICAkbmFtZSwgJGFsaWduCi0gICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCi0gICAgICAgIElGICIkYWxpZ24iPSIiCi0gICAgICAgICAgICBBUkVBIHwuY29uc3RkYXRhfCwgUkVBRE9OTFksIERBVEEKLSAgICAgICAgRUxTRQotICAgICAgICAgICAgOy8vIEFSRUFzIGluaGVyaXQgdGhlIGFsaWdubWVudCBvZiB0aGUgZmlyc3QgZGVjbGFyYXRpb24uCi0gICAgICAgICAgICA7Ly8gVGhlcmVmb3JlIGZvciBlYWNoIGFsaWdubWVudCBzaXplIHdlIG11c3QgaGF2ZSBhbiBhcmVhCi0gICAgICAgICAgICA7Ly8gb2YgYSBkaWZmZXJlbnQgbmFtZS4KLSAgICAgICAgICAgIEFSRUEgY29uc3RkYXRhX2EkYWxpZ24sIFJFQURPTkxZLCBEQVRBLCBBTElHTj0kYWxpZ24KLSAgICAgICAgICAgIAotICAgICAgICAgICAgOy8vIFdlIGFsc28gZm9yY2UgYWxpZ25tZW50IGluY2FzZSB3ZSBhcmUgdGFnZ2luZyBvbnRvCi0gICAgICAgICAgICA7Ly8gYW4gYWxyZWFkeSBzdGFydGVkIGFyZWEuCi0gICAgICAgICAgICBBTElHTiAoMTw8JGFsaWduKQotICAgICAgICBFTkRJRgotJG5hbWUKLSAgICAgICAgTUVORAotICAgICAgICAKLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotOy8vIE1hY3JvcyB0byBhbGxvY2F0ZSBzcGFjZSBvbiB0aGUgc3RhY2sKLTsvLwotOy8vIFRoZXNlIGFsbCBhc3N1bWUgdGhhdCB0aGUgc3RhY2sgaXMgOC1ieXRlIGFsaWduZWQKLTsvLyBhdCBlbnRyeSB0byB0aGUgZnVuY3Rpb24sIHdoaWNoIG1lYW5zIHRoYXQgdGhlIAotOy8vIDMyLWJ5dGUgYWxpZ25tZW50IG1hY3JvIG5lZWRzIHRvIHdvcmsgaW4gYQotOy8vIGJpdCBtb3JlIG9mIGEgc3BlY2lhbCB3YXkuLi4KLTsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgICAgIAotCi0KLSAgICAgICAgOy8vIEFsbG9jYXRlIDEtYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQotICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAkc2l6ZSBieXRlcy4KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9BTExPQzEgICRuYW1lLCAkc2l6ZQotICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYwotJG5hbWUkX0YgICBFUVUgX1NCeXRlcwotX1NCeXRlcyBTRVRBIF9TQnl0ZXMgKyAoJHNpemUpCi0gICAgICAgIE1FTkQKLSAgICAgICAgICAgIAotICAgICAgICA7Ly8gQWxsb2NhdGUgMi1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCi0gICAgICAgIDsvLyAkbmFtZSBzaXplICRzaXplIGJ5dGVzLgotICAgICAgICBNQUNSTwotICAgICAgICBNX0FMTE9DMiAgJG5hbWUsICRzaXplCi0gICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCi0gICAgICAgIElGIChfU0J5dGVzOkFORDoxKSE9MAotX1NCeXRlcyAgICAgU0VUQSBfU0J5dGVzICsgKDIgLSAoX1NCeXRlczpBTkQ6MSkpCi0gICAgICAgIEVORElGCi0kbmFtZSRfRiAgIEVRVSBfU0J5dGVzCi1fU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkKLSAgICAgICAgTUVORAotICAgICAgICAgICAgCi0gICAgICAgIDsvLyBBbGxvY2F0ZSA0LWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKLSAgICAgICAgOy8vICRuYW1lIHNpemUgJHNpemUgYnl0ZXMuCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQUxMT0M0ICAkbmFtZSwgJHNpemUKLSAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKLSAgICAgICAgSUYgKF9TQnl0ZXM6QU5EOjMpIT0wCi1fU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoNCAtIChfU0J5dGVzOkFORDozKSkKLSAgICAgICAgRU5ESUYKLSRuYW1lJF9GICAgRVFVIF9TQnl0ZXMKLV9TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKQotICAgICAgICBNRU5ECi0gICAgICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIDgtYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQotICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAkc2l6ZSBieXRlcy4KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9BTExPQzggICRuYW1lLCAkc2l6ZQotICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYwotICAgICAgICBJRiAoX1NCeXRlczpBTkQ6NykhPTAKLV9TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg4IC0gKF9TQnl0ZXM6QU5EOjcpKQotICAgICAgICBFTkRJRgotJG5hbWUkX0YgICBFUVUgX1NCeXRlcwotX1NCeXRlcyBTRVRBIF9TQnl0ZXMgKyAoJHNpemUpCi0gICAgICAgIE1FTkQgICAgICAgIAotCi0gICAgICAgIAotICAgICAgICA7Ly8gQWxsb2NhdGUgOC1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCi0gICAgICAgIDsvLyAkbmFtZSBzaXplICgkc2l6ZSsxNikgYnl0ZXMuCi0gICAgICAgIDsvLyBUaGUgZXh0cmEgMTYgYnl0ZXMgYXJlIGxhdGVyIHVzZWQgdG8gYWxpZ24gdGhlIHBvaW50ZXIgdG8gMTYgYnl0ZXMKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQUxMT0MxNiAgJG5hbWUsICRzaXplCi0gICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCi0gICAgICAgIElGIChfU0J5dGVzOkFORDo3KSE9MAotX1NCeXRlcyAgICAgU0VUQSBfU0J5dGVzICsgKDggLSAoX1NCeXRlczpBTkQ6NykpCi0gICAgICAgIEVORElGCi0kbmFtZSRfRiRfMTYgICBFUVUgKF9TQnl0ZXMgKyA4KQotX1NCeXRlcyBTRVRBIF9TQnl0ZXMgKyAoJHNpemUpICsgOAotICAgICAgICBNRU5EICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBBbGxvY2F0ZSA4LWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKLSAgICAgICAgOy8vICRuYW1lIHNpemUgKCRzaXplKzMyKSBieXRlcy4KLSAgICAgICAgOy8vIFRoZSBleHRyYSAzMiBieXRlcyBhcmUgbGF0ZXIgdXNlZCB0byBhbGlnbiB0aGUgcG9pbnRlciB0byAzMiBieXRlcwotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9BTExPQzMyICAkbmFtZSwgJHNpemUKLSAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKLSAgICAgICAgSUYgKF9TQnl0ZXM6QU5EOjcpIT0wCi1fU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoOCAtIChfU0J5dGVzOkFORDo3KSkKLSAgICAgICAgRU5ESUYKLSRuYW1lJF9GJF8zMiAgIEVRVSAoX1NCeXRlcyArIDI0KQotX1NCeXRlcyBTRVRBIF9TQnl0ZXMgKyAoJHNpemUpICsgMjQKLSAgICAgICAgTUVORCAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gQXJndW1lbnQgRGVjbGFyYXRpb24gTWFjcm8KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBBbGxvY2F0ZSBhbiBhcmd1bWVudCBuYW1lICRuYW1lCi0gICAgICAgIDsvLyBzaXplICRzaXplIGJ5dGVzCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQVJHICAgICAkbmFtZSwgJHNpemUKLSAgICAgICAgQVNTRVJUIF9JbkZ1bmMKLSRuYW1lJF9GICAgIEVRVSBfQUJ5dGVzCi1fQUJ5dGVzIFNFVEEgX0FCeXRlcyArICgkc2l6ZSkKLSAgICAgICAgTUVORCAgICAgICAgCi0gICAgICAgIAotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi07Ly8gTWFjcm9zIHRvIGFjY2VzcyBzdGFja2VkIHZhcmlhYmxlcwotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAgICAgOy8vIE1hY3JvIHRvIHBlcmZvcm0gYSBkYXRhIHByb2Nlc3Npbmcgb3BlcmF0aW9uCi0gICAgICAgIDsvLyB3aXRoIGEgY29uc3RhbnQgc2Vjb25kIG9wZXJhbmQKLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fT1BDICRvcCwkcmQsJHJuLCRjb25zdAotICAgICAgICBMQ0xBICAgIF9zaAotICAgICAgICBMQ0xBICAgIF9jc3QKLV9zaCAgICAgU0VUQSAgICAwCi1fY3N0ICAgIFNFVEEgICAgJGNvbnN0Ci0gICAgICAgIElGIF9jc3Q9MAotICAgICAgICAkb3AgJHJkLCAkcm4sICNfY3N0Ci0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBXSElMRSAoX2NzdDpBTkQ6Myk9MAotX2NzdCAgICAgICAgU0VUQSBfY3N0Pj4yCi1fc2ggICAgICAgICBTRVRBIF9zaCsyCi0gICAgICAgIFdFTkQKLSAgICAgICAgJG9wICRyZCwgJHJuLCAjKF9jc3Q6QU5EOjB4MDAwMDAwRkYpPDxfc2gKLSAgICAgICAgSUYgX2NzdD49MjU2Ci0gICAgICAgICAgICAkb3AgJHJkLCAkcmQsICMoX2NzdDpBTkQ6MHhGRkZGRkYwMCk8PF9zaAotICAgICAgICBFTkRJRgotICAgICAgICBNRU5ECi0KLSAgICAgICAgOy8vIE1hY3JvIHRvIHBlcmZvcm0gYSBkYXRhIGFjY2VzcyBvcGVyYXRpb24KLSAgICAgICAgOy8vIFN1Y2ggYXMgTERSIG9yIFNUUgotICAgICAgICA7Ly8gVGhlIGFkZHJlc3NpbmcgbW9kZSBpcyBtb2RpZmllZCBzdWNoIHRoYXQKLSAgICAgICAgOy8vIDEuIElmIG5vIGFkZHJlc3MgaXMgZ2l2ZW4gdGhlbiB0aGUgbmFtZSBpcyB0YWtlbgotICAgICAgICA7Ly8gICAgYXMgYSBzdGFjayBvZmZzZXQKLSAgICAgICAgOy8vIDIuIElmIHRoZSBhZGRyZXNzaW5nIG1vZGUgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhlCi0gICAgICAgIDsvLyAgICBzdGF0ZSBiZWluZyBhc3NlbWJsZWQgZm9yIChlZyBUaHVtYikgdGhlbiBhIHN1aXRhYmxlCi0gICAgICAgIDsvLyAgICBhZGRyZXNzaW5nIG1vZGUgaXMgc3Vic3RpdHV0ZWQuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gT24gRW50cnk6Ci0gICAgICAgIDsvLyAkaSA9IEluc3RydWN0aW9uIHRvIHBlcmZvcm0gKGVnICJMRFJCIikKLSAgICAgICAgOy8vICRhID0gUmVxdWlyZWQgYnl0ZSBhbGlnbm1lbnQKLSAgICAgICAgOy8vICRyID0gUmVnaXN0ZXIocykgdG8gdHJhbnNmZXIgKGVnICJyMSIpCi0gICAgICAgIDsvLyAkYTAsJGExLCRhMi4gQWRkcmVzc2luZyBtb2RlIGFuZCBjb25kaXRpb24uIE9uZSBvZjoKLSAgICAgICAgOy8vICAgICBsYWJlbCB7LGNjfQotICAgICAgICA7Ly8gICAgIFtiYXNlXSAgICAgICAgICAgICAgICAgICAgeywsLGNjfQotICAgICAgICA7Ly8gICAgIFtiYXNlLCBvZmZzZXRdeyF9ICAgICAgICAgeywsY2N9Ci0gICAgICAgIDsvLyAgICAgW2Jhc2UsIG9mZnNldCwgc2hpZnRdeyF9ICB7LGNjfQotICAgICAgICA7Ly8gICAgIFtiYXNlXSwgb2Zmc2V0ICAgICAgICAgICAgeywsY2N9Ci0gICAgICAgIDsvLyAgICAgW2Jhc2VdLCBvZmZzZXQsIHNoaWZ0ICAgICB7LGNjfQotICAgICAgICBNQUNSTwotICAgICAgICBfTV9EQVRBICRpLCRhLCRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBJRiAiJGEwIjpMRUZUOjE9IlsiCi0gICAgICAgICAgICBJRiAiJGExIj0iIgotICAgICAgICAgICAgICAgICRpJGEzICAgJHIsICRhMAotICAgICAgICAgICAgRUxTRQotICAgICAgICAgICAgICAgIElGICIkYTAiOlJJR0hUOjE9Il0iCi0gICAgICAgICAgICAgICAgICAgIElGICIkYTIiPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICBfTV9QT1NUSU5EICRpJGEzLCAiJHIiLCAkYTAsICRhMQotICAgICAgICAgICAgICAgICAgICBFTFNFCi0gICAgICAgICAgICAgICAgICAgICAgICBfTV9QT1NUSU5EICRpJGEzLCAiJHIiLCAkYTAsICIkYTEsJGEyIgotICAgICAgICAgICAgICAgICAgICBFTkRJRgotICAgICAgICAgICAgICAgIEVMU0UKLSAgICAgICAgICAgICAgICAgICAgSUYgIiRhMiI9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgIF9NX1BSRUlORCAgJGkkYTMsICIkciIsICRhMCwgJGExCi0gICAgICAgICAgICAgICAgICAgIEVMU0UKLSAgICAgICAgICAgICAgICAgICAgICAgIF9NX1BSRUlORCAgJGkkYTMsICIkciIsICRhMCwgIiRhMSwkYTIiCi0gICAgICAgICAgICAgICAgICAgIEVORElGCi0gICAgICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgICAgIEVORElGCi0gICAgICAgIEVMU0UKLSAgICAgICAgICAgIExDTEEgICAgX09mZnNldAotX09mZnNldCAgICAgU0VUQSAgICBfV29ya3NwYWNlICsgJGEwJF9GCi0gICAgICAgICAgICBBU1NFUlQgIChfT2Zmc2V0OkFORDooJGEtMSkpPTAKLSAgICAgICAgICAgICRpJGExICAgJHIsIFtzcCwgI19PZmZzZXRdCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBIYW5kbGUgcG9zdCBpbmRleGVkIGxvYWQvc3RvcmVzCi0gICAgICAgIDsvLyBvcCAgcmVnLCBbYmFzZV0sIG9mZnNldAotICAgICAgICBNQUNSTwotICAgICAgICBfTV9QT1NUSU5EICRpLCRyLCRhMCwkYTEKLSAgICAgICAgTENMUyBfYmFzZQotICAgICAgICBMQ0xTIF9vZmZzZXQKLSAgICAgICAgSUYge0NPTkZJR309MTYgOy8vIFRodW1iCi1fYmFzZSAgICAgICBTRVRTICgiJGEwIjpMRUZUOig6TEVOOiIkYTAiLTEpKTpSSUdIVDooOkxFTjoiJGEwIi0yKSAgIDsvLyByZW1vdmUgW10KLV9vZmZzZXQgICAgIFNFVFMgIiRhMSIKLSAgICAgICAgICAgIElGIF9vZmZzZXQ6TEVGVDoxPSIrIgotX29mZnNldCAgICAgICAgIFNFVFMgX29mZnNldDpSSUdIVDooOkxFTjpfb2Zmc2V0LTEpCi0gICAgICAgICAgICBFTkRJRgotICAgICAgICAgICAgJGkgICRyLCAkYTAKLSAgICAgICAgICAgIElGIF9vZmZzZXQ6TEVGVDoxPSItIgotX29mZnNldCAgICAgICAgIFNFVFMgX29mZnNldDpSSUdIVDooOkxFTjpfb2Zmc2V0LTEpCi0gICAgICAgICAgICAgICAgU1VCICRfYmFzZSwgJF9iYXNlLCAkX29mZnNldAotICAgICAgICAgICAgRUxTRSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBBREQgJF9iYXNlLCAkX2Jhc2UsICRfb2Zmc2V0Ci0gICAgICAgICAgICBFTkRJRgotICAgICAgICBFTFNFIDsvLyBBUk0KLSAgICAgICAgICAgICRpICAkciwgJGEwLCAkYTEKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIEhhbmRsZSBwcmUgaW5kZXhlZCBsb2FkL3N0b3JlCi0gICAgICAgIDsvLyBvcCAgcmVnLCBbYmFzZSwgb2Zmc2V0XXshfQotICAgICAgICBNQUNSTwotICAgICAgICBfTV9QUkVJTkQgJGksJHIsJGEwLCRhMQotICAgICAgICBMQ0xTIF9iYXNlCi0gICAgICAgIExDTFMgX29mZnNldAotICAgICAgICBJRiAoe0NPTkZJR309MTYpOkxBTkQ6KCgiJGExIjpSSUdIVDoyKT0iXSEiKQotX2Jhc2UgICAgICAgU0VUUyAiJGEwIjpSSUdIVDooOkxFTjooIiRhMCIpLTEpCi1fb2Zmc2V0ICAgICBTRVRTICIkYTEiOkxFRlQ6KDpMRU46KCIkYTEiKS0yKQotICAgICAgICAgICAgJGkgJHIsIFskX2Jhc2UsICRfb2Zmc2V0XQotICAgICAgICAgICAgQUREICRfYmFzZSwgJF9iYXNlLCAkX29mZnNldAotICAgICAgICBFTFNFCi0gICAgICAgICAgICAkaSAgJHIsICRhMCwgJGExCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLQotICAgICAgICA7Ly8gTG9hZCB1bnNpZ25lZCBieXRlIGZyb20gc3RhY2sKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9MRFJCICAkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgX01fREFUQSAiTERSQiIsMSwkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgc2lnbmVkIGJ5dGUgZnJvbSBzdGFjawotICAgICAgICBNQUNSTwotICAgICAgICBNX0xEUlNCICRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBfTV9EQVRBICJMRFJTQiIsMSwkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIFN0b3JlIGJ5dGUgdG8gc3RhY2sKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9TVFJCICAkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgX01fREFUQSAiU1RSQiIsMSwkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgdW5zaWduZWQgaGFsZiB3b3JkIGZyb20gc3RhY2sKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9MRFJIICAkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgX01fREFUQSAiTERSSCIsMiwkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgc2lnbmVkIGhhbGYgd29yZCBmcm9tIHN0YWNrCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fTERSU0ggJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIF9NX0RBVEEgIkxEUlNIIiwyLCRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gU3RvcmUgaGFsZiB3b3JkIHRvIHN0YWNrCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fU1RSSCAgJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIF9NX0RBVEEgIlNUUkgiLDIsJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIE1FTkQKLQotICAgICAgICA7Ly8gTG9hZCB3b3JkIGZyb20gc3RhY2sKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9MRFIgICAkciwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgX01fREFUQSAiTERSIiw0LCRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gU3RvcmUgd29yZCB0byBzdGFjawotICAgICAgICBNQUNSTwotICAgICAgICBNX1NUUiAgICRyLCRhMCwkYTEsJGEyLCRhMwotICAgICAgICBfTV9EQVRBICJTVFIiLDQsJHIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIE1FTkQKLQotICAgICAgICA7Ly8gTG9hZCBkb3VibGUgd29yZCBmcm9tIHN0YWNrCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fTERSRCAgJHIwLCRyMSwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgX01fREFUQSAiTERSRCIsOCwiJHIwLCRyMSIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIE1FTkQKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIFN0b3JlIGRvdWJsZSB3b3JkIHRvIHN0YWNrCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fU1RSRCAgJHIwLCRyMSwkYTAsJGExLCRhMiwkYTMKLSAgICAgICAgX01fREFUQSAiU1RSRCIsOCwiJHIwLCRyMSIsJGEwLCRhMSwkYTIsJGEzCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBHZXQgYWJzb2x1dGUgYWRkcmVzcyBvZiBzdGFjayBhbGxvY2F0ZWQgbG9jYXRpb24KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9BRFIgICAkYSwgJGIsICRjYwotICAgICAgICBfTV9PUEMgIEFERCRjYywgJGEsIHNwLCAoX1dvcmtzcGFjZSArICRiJF9GKQotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gR2V0IGFic29sdXRlIGFkZHJlc3Mgb2Ygc3RhY2sgYWxsb2NhdGVkIGxvY2F0aW9uIGFuZCBhbGlnbiB0aGUgYWRkcmVzcyB0byAxNiBieXRlcwotICAgICAgICBNQUNSTwotICAgICAgICBNX0FEUjE2ICRhLCAkYiwgJGNjCi0gICAgICAgICAgICBfTV9PUEMgIEFERCRjYywgJGEsIHNwLCAoX1dvcmtzcGFjZSArICRiJF9GJF8xNikKLSAgICAgICAgCi0gICAgICAgICAgICA7Ly8gTm93IGFsaWduICRhIHRvIDE2IGJ5dGVzCi0gICAgICAgICAgICBCSUMkY2MgICRhLCRhLCMweDBGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBHZXQgYWJzb2x1dGUgYWRkcmVzcyBvZiBzdGFjayBhbGxvY2F0ZWQgbG9jYXRpb24gYW5kIGFsaWduIHRoZSBhZGRyZXNzIHRvIDMyIGJ5dGVzCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fQURSMzIgJGEsICRiLCAkY2MKLSAgICAgICAgICAgIF9NX09QQyAgQUREJGNjLCAkYSwgc3AsIChfV29ya3NwYWNlICsgJGIkX0YkXzMyKQotICAgICAgICAKLSAgICAgICAgICAgIDsvLyBOb3cgYWxpZ24gJGEgdG8gMzIgYnl0ZXMKLSAgICAgICAgICAgIEJJQyRjYyAgJGEsJGEsIzB4MUYKLSAgICAgICAgTUVORAotCi07Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotOy8vIEZ1bmN0aW9uIGhlYWRlciBhbmQgZm9vdGVyIG1hY3JvcwotOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBGdW5jdGlvbiBIZWFkZXIgTWFjcm8gICAgCi0gICAgICAgIDsvLyBHZW5lcmF0ZXMgdGhlIGZ1bmN0aW9uIHByb2xvZ3VlCi0gICAgICAgIDsvLyBOb3RlIHRoYXQgZnVuY3Rpb25zIHNob3VsZCBhbGwgYmUgInN0YWNrLW1vdmVzLW9uY2UiCi0gICAgICAgIDsvLyBUaGUgRk5TVEFSVCBhbmQgRk5FTkQgbWFjcm9zIHNob3VsZCBiZSB0aGUgb25seSBwbGFjZXMKLSAgICAgICAgOy8vIHdoZXJlIHRoZSBzdGFjayBtb3Zlcy4KLSAgICAgICAgOy8vICAgIAotICAgICAgICA7Ly8gJG5hbWUgID0gZnVuY3Rpb24gbmFtZQotICAgICAgICA7Ly8gJHJyZWcgID0gIiIgICBkb24ndCBzdGFjayBhbnkgcmVnaXN0ZXJzCi0gICAgICAgIDsvLyAgICAgICAgICAibHIiIHN0YWNrICJsciIgb25seQotICAgICAgICA7Ly8gICAgICAgICAgInJOIiBzdGFjayByZWdpc3RlcnMgInI0LXJOLGxyIgotICAgICAgICA7Ly8gJGRyZWcgID0gIiIgICBkb24ndCBzdGFjayBhbnkgRCByZWdpc3RlcnMKLSAgICAgICAgOy8vICAgICAgICAgICJkTiIgc3RhY2sgcmVnaXN0ZXJzICJkOC1kTiIKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBOb3RlOiBBUk0gQXJjaGljdHVyZSBwcm9jZWR1cmUgY2FsbCBzdGFuZGFyZCBBQVBDUwotICAgICAgICA7Ly8gc3RhdGVzIHRoYXQgcjQtcjExLCBzcCwgZDgtZDE1IG11c3QgYmUgcHJlc2VydmVkIGJ5Ci0gICAgICAgIDsvLyBhIGNvbXBsaWFudCBmdW5jdGlvbi4KLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9TVEFSVCAkbmFtZSwgJHJyZWcsICRkcmVnCi0gICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCi0gICAgICAgIEFTU0VSVCAiJG5hbWUiIT0iIgotX0luRnVuYyBTRVRMIHtUUlVFfQotX1JCeXRlcyBTRVRBIDAKLV9Xb3Jrc3BhY2UgU0VUQSAwCi0KLSAgICAgICAgOy8vIENyZWF0ZSBhbiBhcmVhIGZvciB0aGUgZnVuY3Rpb24gICAgICAgIAotICAgICAgICBBUkVBICAgIHwudGV4dHwsIENPREUKLSAgICAgICAgRVhQT1JUICAkbmFtZQotJG5hbWUgICBGVU5DVElPTgotICAgICAgICAKLSAgICAgICAgOy8vIFNhdmUgUiByZWdpc3RlcnMKLSAgICAgICAgX01fR0VUUlJFR0xJU1QgJHJyZWcKLSAgICAgICAgSUYgX1JSZWdMaXN0PD4iIgotICAgICAgICAgICAgU1RNRkQgICBzcCEsIHskX1JSZWdMaXN0LCBscn0KLSAgICAgICAgRU5ESUYKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIFNhdmUgRCByZWdpc3RlcnMKLSAgICAgICAgX01fR0VURFJFR0xJU1QgICRkcmVnICAgICAgICAKLSAgICAgICAgSUYgX0RSZWdMaXN0PD4iIgotICAgICAgICAgICAgVlNUTUZEICBzcCEsIHskX0RSZWdMaXN0fQotICAgICAgICBFTkRJRiAgICAgICAgICAgIAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gRW5zdXJlIHNpemUgY2xhaW1lZCBvbiBzdGFjayBpcyA4LWJ5dGUgYWxpZ25lZAotICAgICAgICBJRiAoKF9TQnl0ZXM6QU5EOjcpIT0wKQotX1NCeXRlcyAgICAgU0VUQSBfU0J5dGVzICsgKDggLSAoX1NCeXRlczpBTkQ6NykpCi0gICAgICAgIEVORElGCi0gICAgICAgIAotICAgICAgICBJRiAoX1NCeXRlcyE9MCkKLSAgICAgICAgICAgIF9NX09QQyBTVUIsIHNwLCBzcCwgX1NCeXRlcwotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgCi1fQUJ5dGVzIFNFVEEgX1NCeXRlcyArIF9SQnl0ZXMgLSBfV29ya3NwYWNlCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gUHJpbnQgZnVuY3Rpb24gbmFtZSBpZiBkZWJ1ZyBlbmFibGVkCi0gICAgICAgIE1fUFJJTlRGICIkbmFtZVxuIiwKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIFdvcmsgb3V0IGEgbGlzdCBvZiBSIHNhdmVkIHJlZ2lzdGVycwotICAgICAgICBNQUNSTwotICAgICAgICBfTV9HRVRSUkVHTElTVCAkcnJlZwotICAgICAgICBJRiAiJHJyZWciPSIiCi1fUlJlZ0xpc3QgICBTRVRTICIiCi0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRiAgICAgICAgCi0gICAgICAgIElGICIkcnJlZyI9ImxyIjpMT1I6IiRycmVnIj0icjQiCi1fUlJlZ0xpc3QgICBTRVRTICJyNCIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys4Ci0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJHJyZWciPSJyNSI6TE9SOiIkcnJlZyI9InI2IgotX1JSZWdMaXN0ICAgU0VUUyAicjQtcjYiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrMTYKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkcnJlZyI9InI3IjpMT1I6IiRycmVnIj0icjgiCi1fUlJlZ0xpc3QgICBTRVRTICJyNC1yOCIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcysyNAotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRycmVnIj0icjkiOkxPUjoiJHJyZWciPSJyMTAiCi1fUlJlZ0xpc3QgICBTRVRTICJyNC1yMTAiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrMzIKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkcnJlZyI9InIxMSI6TE9SOiIkcnJlZyI9InIxMiIKLV9SUmVnTGlzdCAgIFNFVFMgInI0LXIxMiIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys0MAotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSU5GTyAxLCAiVW5yZWNvZ25pemVkIHNhdmVkIHIgcmVnaXN0ZXIgbGltaXQgJyRycmVnJyIKLSAgICAgICAgTUVORCAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gV29yayBvdXQgYSBsaXN0IG9mIEQgc2F2ZWQgcmVnaXN0ZXJzCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX0dFVERSRUdMSVNUICRkcmVnCi0gICAgICAgIElGICIkZHJlZyI9IiIKLV9EUmVnTGlzdCAgIFNFVFMgIiIKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGICAgICAgICAKLSAgICAgICAgSUYgIiRkcmVnIj0iZDgiCi1fRFJlZ0xpc3QgICBTRVRTICJkOCIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys4Ci0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJGRyZWciPSJkOSIKLV9EUmVnTGlzdCAgIFNFVFMgImQ4LWQ5IgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzE2Ci0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJGRyZWciPSJkMTAiCi1fRFJlZ0xpc3QgICBTRVRTICJkOC1kMTAiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrMjQKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkZHJlZyI9ImQxMSIKLV9EUmVnTGlzdCAgIFNFVFMgImQ4LWQxMSIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcyszMgotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRkcmVnIj0iZDEyIgotX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDEyIgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzQwCi0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJGRyZWciPSJkMTMiCi1fRFJlZ0xpc3QgICBTRVRTICJkOC1kMTMiCi1fUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNDgKLSAgICAgICAgICAgIE1FWElUCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkZHJlZyI9ImQxNCIKLV9EUmVnTGlzdCAgIFNFVFMgImQ4LWQxNCIKLV9SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys1NgotICAgICAgICAgICAgTUVYSVQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgIiRkcmVnIj0iZDE1IgotX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDE1IgotX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzY0Ci0gICAgICAgICAgICBNRVhJVAotICAgICAgICBFTkRJRgotICAgICAgICBJTkZPIDEsICJVbnJlY29nbml6ZWQgc2F2ZWQgZCByZWdpc3RlciBsaW1pdCAnJGRyZWcnIgotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gUHJvZHVjZSBmdW5jdGlvbiByZXR1cm4gaW5zdHJ1Y3Rpb25zCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIF9NX1JFVCAkY2MKLSAgICAgICAgSUYgX0RSZWdMaXN0PD4iIgotICAgICAgICAgICAgVlBPUCRjYyB7JF9EUmVnTGlzdH0KLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgX1JSZWdMaXN0PSIiCi0gICAgICAgICAgICBCWCRjYyBscgotICAgICAgICBFTFNFCi0gICAgICAgICAgICBMRE0kY2MuRkQgc3AhLCB7JF9SUmVnTGlzdCwgcGN9Ci0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIEVhcmx5IEZ1bmN0aW9uIEV4aXQgTWFjcm8KLSAgICAgICAgOy8vICRjYyA9IGNvbmRpdGlvbiB0byBleGl0IHdpdGgKLSAgICAgICAgOy8vIChFeGFtcGxlOiBNX0VYSVQgRVEpCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fRVhJVCAgJGNjCi0gICAgICAgIEFTU0VSVCAgX0luRnVuYwotICAgICAgICBJRiAgX1NCeXRlcyE9MAotICAgICAgICAgICAgOy8vIFJlc3RvcmUgc3RhY2sgZnJhbWUgYW5kIGV4aXQKLSAgICAgICAgICAgIEIkY2MgIF9FbmQkX0YKLSAgICAgICAgRUxTRQotICAgICAgICAgICAgOy8vIENhbiByZXR1cm4gZGlyZWN0bHkKLSAgICAgICAgICAgIF9NX1JFVCAkY2MKLSAgICAgICAgRU5ESUYgICAgICAgIAotICAgICAgICBNRU5EICAgICAgICAKLQotICAgICAgICA7Ly8gRnVuY3Rpb24gRm9vdGVyIE1hY3JvICAgICAgICAKLSAgICAgICAgOy8vIEdlbmVyYXRlcyB0aGUgZnVuY3Rpb24gZXBpbG9ndWUKLSAgICAgICAgTUFDUk8KLSAgICAgICAgTV9FTkQKLSAgICAgICAgQVNTRVJUIF9JbkZ1bmMKLV9JbkZ1bmMgU0VUTCB7RkFMU0V9Ci1fRW5kJF9GCi0KLSAgICAgICAgOy8vIFJlc3RvcmUgdGhlIHN0YWNrIHBvaW50ZXIgdG8gaXRzIG9yaWdpbmFsIHZhbHVlIG9uIGZ1bmN0aW9uIGVudHJ5Ci0gICAgICAgIElGIF9TQnl0ZXMhPTAKLSAgICAgICAgICAgIF9NX09QQyBBREQsIHNwLCBzcCwgX1NCeXRlcwotICAgICAgICBFTkRJRgotICAgICAgICBfTV9SRVQKLSAgICAgICAgRU5ERlVOQwotCi0gICAgICAgIDsvLyBSZXNldCB0aGUgZ2xvYmFsIHN0YWNrIHRyYWNraW5nIHZhcmlhYmxlcyBiYWNrIHRvIHRoZWlyIAotICAgICAgICA7Ly8gaW5pdGlhbCB2YWx1ZXMsIGFuZCBpbmNyZW1lbnQgdGhlIGZ1bmN0aW9uIGNvdW50Ci1fU0J5dGVzICAgICAgICBTRVRBIDAKLV9GICAgICAgICAgICAgIFNFVEEgX0YrMQotICAgICAgICBNRU5ECi0KLSAgICAgICAgICAgICAgICAKLTsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci07Ly8gRGVidWcgTWFjcm9zCi07Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgICAgIEdCTEwgICAgREVCVUdfT04KLURFQlVHX09OIFNFVEwgICB7RkFMU0V9Ci0gICAgICAgIEdCTEwgICAgREVCVUdfU1RBTExTX09OCi1ERUJVR19TVEFMTFNfT04gU0VUTCB7RkFMU0V9Ci0gICAgICAgIAotICAgICAgICA7Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICA7Ly8gRGVidWcgY2FsbCB0byBwcmludGYKLSAgICAgICAgOy8vICBNX1BSSU5URiAkZm9ybWF0LCAkdmFsMCwgJHZhbDEsICR2YWwyCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gRXhhbXBsZXM6Ci0gICAgICAgIDsvLyAgTV9QUklOVEYgIng9JTA4eFxuIiwgcjAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBUaGlzIG1hY3JvIHByZXNlcnZlcyB0aGUgdmFsdWUgb2YgYWxsIHJlZ2lzdGVycyBpbmNsdWRpbmcgdGhlCi0gICAgICAgIDsvLyBmbGFncy4KLSAgICAgICAgOy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgICAgICBNQUNSTwotICAgICAgICBNX1BSSU5URiAgJGZvcm1hdCwgJHZhbDAsICR2YWwxLCAkdmFsMgotICAgICAgICBJRiBERUJVR19PTgotICAgICAgICAKLSAgICAgICAgSU1QT1JUICBwcmludGYKLSAgICAgICAgTENMQSAgICBuQXJncwotbkFyZ3MJU0VUQSAgICAwCi0gICAgICAgIAotICAgICAgICA7Ly8gc2F2ZSByZWdpc3RlcnMgc28gd2UgZG9uJ3QgY29ycnVwdCB0aGVtCi0gICAgICAgIFNUTUZEICAgc3AhLCB7cjAtcjEyLCBscn0KLSAgICAgICAgCi0gICAgICAgIDsvLyBEcm9wIHN0YWNrIHRvIGdpdmUgdXMgc29tZSB3b3Jrc3BhY2UKLSAgICAgICAgU1VCICAgICBzcCwgc3AsICMxNgotICAgICAgICAKLSAgICAgICAgOy8vIFNhdmUgcmVnaXN0ZXJzIHdlIG5lZWQgdG8gcHJpbnQgdG8gdGhlIHN0YWNrCi0gICAgICAgIElGICIkdmFsMiIgPD4gIiIKLSAgICAgICAgICAgIEFTU0VSVCAiJHZhbDEiIDw+ICIiCi0gICAgICAgICAgICBTVFIgICAgJHZhbDIsIFtzcCwgIzhdCi1uQXJncyAgICAgICBTRVRBICAgbkFyZ3MrMQotICAgICAgICBFTkRJRgotICAgICAgICBJRiAiJHZhbDEiIDw+ICIiCi0gICAgICAgICAgICBBU1NFUlQgIiR2YWwwIiA8PiAiIgotICAgICAgICAgICAgU1RSICAgICR2YWwxLCBbc3AsICM0XQotbkFyZ3MJICAgIFNFVEEgICBuQXJncysxCi0gICAgICAgIEVORElGCi0gICAgICAgIElGICIkdmFsMCI8PiIiCi0gICAgICAgICAgICBTVFIgICAgJHZhbDAsIFtzcF0KLW5BcmdzCSAgICBTRVRBICAgbkFyZ3MrMQotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgOy8vIE5vdyB3ZSBhcmUgc2FmZSB0byBjb3JydXB0IHJlZ2lzdGVycwotICAgICAgICBBRFIgICAgIHIwLCAlRlQwMAotICAgICAgICBJRiBuQXJncz0xCi0gICAgICAgICAgTERSICAgcjEsIFtzcF0KLSAgICAgICAgRU5ESUYKLSAgICAgICAgSUYgbkFyZ3M9MgotICAgICAgICAgIExETUlBIHNwLCB7cjEscjJ9Ci0gICAgICAgIEVORElGCi0gICAgICAgIElGIG5BcmdzPTMKLSAgICAgICAgICBMRE1JQSBzcCwge3IxLHIyLHIzfQotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgOy8vIHByaW50IHRoZSB2YWx1ZXMKLSAgICAgICAgTVJTICAgICByNCwgY3BzciAgICAgICAgOy8vIHByZXNlcnZlIGZsYWdzCi0gICAgICAgIEJMICAgICAgcHJpbnRmCi0gICAgICAgIE1TUiAgICAgY3Bzcl9mLCByNCAgICAgIDsvLyByZXN0b3JlIGZsYWdzCi0gICAgICAgIEIgICAgICAgJUZUMDEKLTAwICAgICAgOy8vIHN0cmluZyB0byBwcmludAotICAgICAgICBEQ0IgICAgICIkZm9ybWF0IiwgMAotICAgICAgICBBTElHTgotMDEgICAgICA7Ly8gRmluaXNoZWQKLSAgICAgICAgQUREICAgICBzcCwgc3AsICMxNgotICAgICAgICA7Ly8gUmVzdG9yZSByZWdpc3RlcnMKLSAgICAgICAgTERNRkQJc3AhLCB7cjAtcjEyLGxyfQotCi0gICAgICAgIEVORElGICAgOy8vIERFQlVHX09OCi0gICAgICAgIE1FTkQKLQotCi0gICAgICAgIDsvLyBTdGFsbCBTaW11bGF0aW9uIE1hY3JvCi0gICAgICAgIDsvLyBJbnNlcnRzIGEgZ2l2ZW4gbnVtYmVyIG9mIE5PUHMgZm9yIHRoZSBjdXJyZW50bHkKLSAgICAgICAgOy8vICBkZWZpbmVkIHBsYXRmb3JtCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIE1fU1RBTEwgJHBsYXQxc3RhbGwsICRwbGF0MnN0YWxsLCAkcGxhdDNzdGFsbCwgJHBsYXQ0c3RhbGwsICRwbGF0NXN0YWxsLCAkcGxhdDZzdGFsbAotICAgICAgICBJRiBERUJVR19TVEFMTFNfT04KLSAgICAgICAgICAgIF9NX1NUQUxMX1NVQiAkcGxhdDFzdGFsbCAgICAKLSAgICAgICAgICAgIF9NX1NUQUxMX1NVQiAkcGxhdDJzdGFsbCAgICAKLSAgICAgICAgICAgIF9NX1NUQUxMX1NVQiAkcGxhdDNzdGFsbCAgICAKLSAgICAgICAgICAgIF9NX1NUQUxMX1NVQiAkcGxhdDRzdGFsbCAgICAKLSAgICAgICAgICAgIF9NX1NUQUxMX1NVQiAkcGxhdDVzdGFsbCAgICAKLSAgICAgICAgICAgIF9NX1NUQUxMX1NVQiAkcGxhdDZzdGFsbCAgICAKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgX01fU1RBTExfU1VCICRwbGF0c3RhbGwKLSAgICAgICAgSUYgIiRwbGF0c3RhbGwiIT0iIgotICAgICAgICAgICAgTENMQSBfcGxsZW4KLSAgICAgICAgICAgIExDTFMgX3BsCi0gICAgICAgICAgICBMQ0xMIF9wbGxvZwotX3BsbGVuICAgICAgU0VUQSA6TEVOOiIkcGxhdHN0YWxsIgotX3BsICAgICAgICAgU0VUUyAiJHBsYXRzdGFsbCI6TEVGVDooX3BsbGVuIC0gMikKLSAgICAgICAgICAgIElGIDpERUY6JF9wbAotICAgICAgICAgICAgICAgIElGICRfcGwKLSAgICAgICAgICAgICAgICAgICAgTENMUyBfc3QKLSAgICAgICAgICAgICAgICAgICAgTENMQSBfc3RudW0KLV9zdCAgICAgICAgICAgICAgICAgU0VUUyAiJHBsYXRzdGFsbCI6UklHSFQ6MSAgICAgICAgCi1fc3RudW0gICAgICAgICAgICAgIFNFVEEgJF9zdAotICAgICAgICAgICAgICAgICAgICBXSElMRSBfc3RudW0+MAotCQkJTU9WIHNwLCBzcAotX3N0bnVtICAgICAgICAgICAgICAgICAgU0VUQSBfc3RudW0gLSAxCi0gICAgICAgICAgICAgICAgICAgIFdFTkQKLSAgICAgICAgICAgICAgICBFTkRJRgotICAgICAgICAgICAgRU5ESUYKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotOy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTsvLyBFbmRpYW4gSW52YXJpZW5jZSBNYWNyb3MKLTsvLyAKLTsvLyBUaGUgaWRlYSBiZWhpbmQgdGhlc2UgbWFjcm9zIGlzIHRoYXQgaWYgYW4gYXJyYXkgaXMKLTsvLyBsb2FkZWQgYXMgd29yZHMgdGhlbiB0aGUgU01VTDAwIG1hY3JvIHdpbGwgbXVsdGlwbHkKLTsvLyBhcnJheSBlbGVtZW50cyAwIHJlZ2FyZGxlc3Mgb2YgdGhlIGVuZGlhbmVzcyBvZiB0aGUKLTsvLyBzeXN0ZW0uIEZvciBsaXR0bGUgZW5kaWFuIFNNVUwwMD1TTVVMQkIsIGZvciBiaWcKLTsvLyBlbmRpYW4gU01VTDAwPVNNVUxUVCBhbmQgc2ltaWxhcmx5IGZvciBvdGhlciBwYWNrZWQgb3BlcmF0aW9ucy4KLTsvLwotOy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgICAgICBNQUNSTwotICAgICAgICBMSUJJNCAgICRjb21saSwgJGNvbWJpLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIElGIHtFTkRJQU59PSJiaWciCi0gICAgICAgICRjb21iaS4kY2MgJGEsICRiLCAkYywgJGQKLSAgICAgICAgRUxTRQotICAgICAgICAkY29tbGkuJGNjICRhLCAkYiwgJGMsICRkCi0gICAgICAgIEVORElGCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIExJQkkzICAgJGNvbWxpLCAkY29tYmksICRhLCAkYiwgJGMsICRjYwotICAgICAgICBJRiB7RU5ESUFOfT0iYmlnIgotICAgICAgICAkY29tYmkuJGNjICRhLCAkYiwgJGMKLSAgICAgICAgRUxTRQotICAgICAgICAkY29tbGkuJGNjICRhLCAkYiwgJGMKLSAgICAgICAgRU5ESUYKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgOy8vIFNNTEF4eSBtYWNyb3MKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEEwMCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBQkIsIFNNTEFUVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBMDEgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUJULCBTTUxBVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQTBCICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFCQiwgU01MQVRCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEEwVCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBQlQsIFNNTEFUVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBMTAgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQVRCLCBTTUxBQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQTExICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFUVCwgU01MQUJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEExQiAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBVEIsIFNNTEFCQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBMVQgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQVRULCBTTUxBQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUIwICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFCQiwgU01MQUJULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFCMSAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBQlQsIFNNTEFCQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBVDAgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQVRCLCBTTUxBVFQsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQVQxICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFUVCwgU01MQVRCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIDsvLyBTTVVMeHkgbWFjcm9zCi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMMDAgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMQkIsIFNNVUxUVCwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUwwMSAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxCVCwgU01VTFRCLCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTDBCICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTEJCLCBTTVVMVEIsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMMFQgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMQlQsIFNNVUxUVCwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUwxMCAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxUQiwgU01VTEJULCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTDExICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTFRULCBTTVVMQkIsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMMUIgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMVEIsIFNNVUxCQiwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUwxVCAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxUVCwgU01VTEJULCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTEIwICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTEJCLCBTTVVMQlQsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTVVMQjEgICRhLCAkYiwgJGMsICRjYwotICAgICAgICBMSUJJMyBTTVVMQlQsIFNNVUxCQiwgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUxUMCAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxUQiwgU01VTFRULCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTFQxICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTFRULCBTTVVMVEIsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICA7Ly8gU01MQVd4LCBTTVVMV3ggbWFjcm9zCi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBVzAgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQVdCLCBTTUxBV1QsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQVcxICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFXVCwgU01MQVdCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNVUxXMCAgJGEsICRiLCAkYywgJGNjCi0gICAgICAgIExJQkkzIFNNVUxXQiwgU01VTFdULCAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01VTFcxICAkYSwgJGIsICRjLCAkY2MKLSAgICAgICAgTElCSTMgU01VTFdULCBTTVVMV0IsICRhLCAkYiwgJGMsICRjYwotICAgICAgICBNRU5ECi0KLSAgICAgICAgOy8vIFNNTEFMeHkgbWFjcm9zCi0KLQotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTDAwICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMQkIsIFNNTEFMVFQsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUwwMSAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTEJULCBTTUxBTFRCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMMEIgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxCQiwgU01MQUxUQiwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTDBUICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMQlQsIFNNTEFMVFQsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUwxMCAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTFRCLCBTTUxBTEJULCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLQotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTDExICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMVFQsIFNNTEFMQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUwxQiAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTFRCLCBTTUxBTEJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMMVQgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxUVCwgU01MQUxCVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTEIwICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMQkIsIFNNTEFMQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgICAgICAgTUFDUk8KLSAgICAgICAgU01MQUxCMSAgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBMSUJJNCBTTUxBTEJULCBTTUxBTEJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIE1FTkQKLSAgICAgICAgCi0gICAgICAgIE1BQ1JPCi0gICAgICAgIFNNTEFMVDAgICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTElCSTQgU01MQUxUQiwgU01MQUxUVCwgJGEsICRiLCAkYywgJGQsICRjYwotICAgICAgICBNRU5ECi0gICAgICAgIAotICAgICAgICBNQUNSTwotICAgICAgICBTTUxBTFQxICAkYSwgJGIsICRjLCAkZCwgJGNjCi0gICAgICAgIExJQkk0IFNNTEFMVFQsIFNNTEFMVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKLSAgICAgICAgTUVORAotICAgICAgICAKLSAgRU5ESUYgOy8vIEFSTUNPTU1fU19ICi0gICAgICAgICAgICAKLSAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybU9NWC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1PTVguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAzYWJkOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybU9NWC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIAotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1PTVhfUmVsZWFzZVZlcnNpb24uaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICAxMjI5MAotICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogVGhpcyBmaWxlIGFsbG93cyBhIHZlcnNpb24gb2YgdGhlIE9NWCBETCBsaWJyYXJpZXMgdG8gYmUgYnVpbHQgd2hlcmUgc29tZSBvcgotICogYWxsIG9mIHRoZSBmdW5jdGlvbiBuYW1lcyBjYW4gYmUgZ2l2ZW4gYSB1c2VyIHNwZWNpZmllZCBzdWZmaXguIAotICoKLSAqIFlvdSBtaWdodCB3YW50IHRvIHVzZSBpdCB3aGVyZToKLSAqCi0gKiAtIHlvdSB3YW50IHRvIHJlbmFtZSBhIGZ1bmN0aW9uICJvdXQgb2YgdGhlIHdheSIgc28gdGhhdCB5b3UgY291bGQgcmVwbGFjZQotICogICBhIGZ1bmN0aW9uIHdpdGggYSBkaWZmZXJlbnQgdmVyc2lvbiAodGhlIG9yaWdpbmFsIHZlcnNpb24gd291bGQgc3RpbGwgYmUKLSAqICAgaW4gdGhlIGxpYnJhcnkganVzdCB3aXRoIGEgZGlmZmVyZW50IG5hbWUgLSBzbyB5b3UgY291bGQgZGVidWcgdGhlIG5ldwotICogICB2ZXJzaW9uIGJ5IGNvbXBhcmluZyBpdCB0byB0aGUgb3V0cHV0IG9mIHRoZSBvbGQpCi0gKgotICogLSB5b3Ugd2FudCB0byByZW5hbWUgYWxsIHRoZSBmdW5jdGlvbnMgdG8gdmVyc2lvbnMgd2l0aCBhIHN1ZmZpeCBzbyB0aGF0IAotICogICB5b3UgY2FuIGluY2x1ZGUgdHdvIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5IGFuZCBjaG9vc2UgYmV0d2VlbiBmdW5jdGlvbnMKLSAqICAgYXQgcnVudGltZS4KLSAqCi0gKiAgICAgZS5nLiBvbXhJUEJNX0NvcHlfVThfQzFSIGNvdWxkIGJlIHJlbmFtZWQgb214SVBCTV9Db3B5X1U4X0MxUl9Db3J0ZXhBOAotICogCi0gKi8KLQotICAKLSNpZm5kZWYgX2FybU9NWF9IXwotI2RlZmluZSBfYXJtT01YX0hfCi0KLQotLyogV2UgbmVlZCB0byBkZWZpbmUgdGhlc2UgdHdvIG1hY3JvcyBpbiBvcmRlciB0byBleHBhbmQgYW5kIGNvbmNhdGVuYXRlIHRoZSBuYW1lcyAqLwotI2RlZmluZSBPTVhDQVQyQkFSKEEsIEIpIG9teCAjIyBBICMjIEIKLSNkZWZpbmUgT01YQ0FUQkFSKEEsIEIpIE9NWENBVDJCQVIoQSwgQikKLQotLyogRGVmaW5lIHRoZSBzdWZmaXggdG8gYWRkIHRvIGFsbCBmdW5jdGlvbnMgLSB0aGUgZGVmYXVsdCBpcyBubyBzdWZmaXggKi8KLSNkZWZpbmUgQkFSRV9TVUZGSVggCi0KLQotCi0vKiBEZWZpbmUgd2hhdCBoYXBwZW5zIHRvIHRoZSBiYXJlIHN1ZmZpeC1sZXNzIGZ1bmN0aW9ucywgZG93biB0byB0aGUgc3ViLWRvbWFpbiBhY2N1cmFjeSAqLwotI2RlZmluZSBPTVhBQ0FBQ19TVUZGSVggICAgQkFSRV9TVUZGSVggICAKLSNkZWZpbmUgT01YQUNNUDNfU1VGRklYICAgIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWElDSlBfU1VGRklYICAgICBCQVJFX1NVRkZJWAotI2RlZmluZSBPTVhJUEJNX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YSVBDU19TVUZGSVggICAgIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWElQUFBfU1VGRklYICAgICBCQVJFX1NVRkZJWAotI2RlZmluZSBPTVhTUF9TVUZGSVggICAgICAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YVkNDT01NX1NVRkZJWCAgIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWFZDTTRQMTBfU1VGRklYICBCQVJFX1NVRkZJWAotI2RlZmluZSBPTVhWQ000UDJfU1VGRklYICAgQkFSRV9TVUZGSVgKLQotCi0KLQotLyogRGVmaW5lIHdoYXQgdGhlIGVhY2ggYmFyZSwgdW4tc3VmZml4ZWQgT3Blbk1BWCBBUEkgZnVuY3Rpb24gbmFtZXMgaXMgdG8gYmUgcmVuYW1lZCAqLwotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVDaGFuUGFpckVsdCAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVDaGFuUGFpckVsdCwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVEYXRTdHJFbHQgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVEYXRTdHJFbHQsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfRGVjb2RlRmlsbEVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlRmlsbEVsdCwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVJc1N0ZXJlb19TMzIgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVJc1N0ZXJlb19TMzIsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfRGVjb2RlTXNQTlNfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlTXNQTlNfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfRGVjb2RlTXNTdGVyZW9fUzMyX0kgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlTXNTdGVyZW9fUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfRGVjb2RlUHJnQ2ZnRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlUHJnQ2ZnRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZVROU19TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZVROU19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWludGVybGVhdmVTcGVjdHJ1bV9TMzIgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWludGVybGVhdmVTcGVjdHJ1bV9TMzIsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfRW5jb2RlVE5TX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRW5jb2RlVE5TX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0xvbmdUZXJtUHJlZGljdF9TMzIgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0xvbmdUZXJtUHJlZGljdF9TMzIsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfTG9uZ1Rlcm1SZWNvbnN0cnVjdF9TMzJfSSAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTG9uZ1Rlcm1SZWNvbnN0cnVjdF9TMzJfSSwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19NRENURndkX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19NRENURndkX1MzMiwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19NRENUSW52X1MzMl9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19NRENUSW52X1MzMl9TMTYsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfTm9pc2VsZXNzRGVjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTm9pc2VsZXNzRGVjb2RlLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX1F1YW50SW52X1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX1F1YW50SW52X1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX1VucGFja0FESUZIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX1VucGFja0FESUZIZWFkZXIsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfVW5wYWNrQURUU0ZyYW1lSGVhZGVyICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfVW5wYWNrQURUU0ZyYW1lSGVhZGVyLCBPTVhBQ0FBQ19TVUZGSVgpCi0KLQotI2RlZmluZSBvbXhBQ01QM19IdWZmbWFuRGVjb2RlX1MzMiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19IdWZmbWFuRGVjb2RlX1MzMiwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19IdWZmbWFuRGVjb2RlU2ZiX1MzMiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19IdWZmbWFuRGVjb2RlU2ZiX1MzMiwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19IdWZmbWFuRGVjb2RlU2ZiTWJwX1MzMiAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19IdWZmbWFuRGVjb2RlU2ZiTWJwX1MzMiwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19NRENUSW52X1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19NRENUSW52X1MzMiwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19SZVF1YW50aXplX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19SZVF1YW50aXplX1MzMl9JLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX1JlUXVhbnRpemVTZmJfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1JlUXVhbnRpemVTZmJfUzMyX0ksIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfU3ludGhQUU1GX1MzMl9TMTYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfU3ludGhQUU1GX1MzMl9TMTYsIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfVW5wYWNrRnJhbWVIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfVW5wYWNrRnJhbWVIZWFkZXIsIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfVW5wYWNrU2NhbGVGYWN0b3JzX1M4ICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfVW5wYWNrU2NhbGVGYWN0b3JzX1M4LCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX1VucGFja1NpZGVJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1VucGFja1NpZGVJbmZvLCBPTVhBQ01QM19TVUZGSVgpCi0KLSNkZWZpbmUgb214SUNKUF9Db3B5RXhwYW5kX1U4X0MzICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9Db3B5RXhwYW5kX1U4X0MzLCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RGd2RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RGd2RfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RGd2RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RGd2RfUzE2X0ksIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVEludl9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEludl9TMTYsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVEludl9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEludl9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RfTXVsdGlwbGVfUzE2ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RfTXVsdGlwbGVfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZF9TMTYsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkX1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkX1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZFRhYmxlSW5pdCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZFRhYmxlSW5pdCwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZfTXVsdGlwbGVfUzE2ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZfTXVsdGlwbGVfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludl9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludl9TMTYsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52X1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludlRhYmxlSW5pdCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludlRhYmxlSW5pdCwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRGVjb2RlSHVmZm1hbjh4OF9EaXJlY3RfUzE2X0MxICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRGVjb2RlSHVmZm1hbjh4OF9EaXJlY3RfUzE2X0MxLCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EZWNvZGVIdWZmbWFuU3BlY0dldEJ1ZlNpemVfVTggICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EZWNvZGVIdWZmbWFuU3BlY0dldEJ1ZlNpemVfVTgsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjSW5pdF9VOCAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjSW5pdF9VOCwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRW5jb2RlSHVmZm1hbjh4OF9EaXJlY3RfUzE2X1UxX0MxICAgICAgICAgT01YQ0FUQkFSKElDSlBfRW5jb2RlSHVmZm1hbjh4OF9EaXJlY3RfUzE2X1UxX0MxLCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9FbmNvZGVIdWZmbWFuU3BlY0dldEJ1ZlNpemVfVTggICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9FbmNvZGVIdWZmbWFuU3BlY0dldEJ1ZlNpemVfVTgsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjSW5pdF9VOCAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjSW5pdF9VOCwgT01YSUNKUF9TVUZGSVgpCi0KLSNkZWZpbmUgb214SVBCTV9BZGRDX1U4X0MxUl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9BZGRDX1U4X0MxUl9TZnMsIE9NWElQQk1fU1VGRklYKQotI2RlZmluZSBvbXhJUEJNX0NvcHlfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX0NvcHlfVThfQzFSLCBPTVhJUEJNX1NVRkZJWCkKLSNkZWZpbmUgb214SVBCTV9Db3B5X1U4X0MzUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9Db3B5X1U4X0MzUiwgT01YSVBCTV9TVUZGSVgpCi0jZGVmaW5lIG9teElQQk1fTWlycm9yX1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fTWlycm9yX1U4X0MxUiwgT01YSVBCTV9TVUZGSVgpCi0jZGVmaW5lIG9teElQQk1fTXVsQ19VOF9DMVJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fTXVsQ19VOF9DMVJfU2ZzLCBPTVhJUEJNX1NVRkZJWCkKLQotI2RlZmluZSBvbXhJUENTX0NvbG9yVHdpc3RRMTRfVThfQzNSICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX0NvbG9yVHdpc3RRMTRfVThfQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19CR1I1NjVUb1lDYkNyNDIwTFNfTUNVX1UxNl9TMTZfQzNQM1IgICAgICBPTVhDQVRCQVIoSVBDU19CR1I1NjVUb1lDYkNyNDIwTFNfTUNVX1UxNl9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0JHUjU2NVRvWUNiQ3I0MjJMU19NQ1VfVTE2X1MxNl9DM1AzUiAgICAgIE9NWENBVEJBUihJUENTX0JHUjU2NVRvWUNiQ3I0MjJMU19NQ1VfVTE2X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQkdSNTY1VG9ZQ2JDcjQ0NExTX01DVV9VMTZfUzE2X0MzUDNSICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSNTY1VG9ZQ2JDcjQ0NExTX01DVV9VMTZfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19CR1I4ODhUb1lDYkNyNDIwTFNfTUNVX1U4X1MxNl9DM1AzUiAgICAgICBPTVhDQVRCQVIoSVBDU19CR1I4ODhUb1lDYkNyNDIwTFNfTUNVX1U4X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQkdSODg4VG9ZQ2JDcjQyMkxTX01DVV9VOF9TMTZfQzNQM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSODg4VG9ZQ2JDcjQyMkxTX01DVV9VOF9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0JHUjg4OFRvWUNiQ3I0NDRMU19NQ1VfVThfUzE2X0MzUDNSICAgICAgIE9NWENBVEJBUihJUENTX0JHUjg4OFRvWUNiQ3I0NDRMU19NQ1VfVThfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFJzekNzY1JvdEJHUl9VOF9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFJzekNzY1JvdEJHUl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBSc3pSb3RfVThfUDNSICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBSc3pSb3RfVThfUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFRvQkdSNTY1X1U4X1UxNl9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFRvQkdSNTY1X1U4X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJSc3pDc2NSb3RCR1JfVThfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJSc3pDc2NSb3RCR1JfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0NiWUNyWTQyMlJzekNzY1JvdEJHUl9VOF9VMTZfQzJSICAgICAgICAgIE9NWENBVEJBUihJUENTX0NiWUNyWTQyMlJzekNzY1JvdEJHUl9VOF9VMTZfQzJSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlJzelJvdF9VOF9QM1IgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlJzelJvdF9VOF9QM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYllDcjQyMlRvQkdSNTY1X1U4X1UxNl9DMkMzUiAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYllDcjQyMlRvQkdSNTY1X1U4X1UxNl9DMkMzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JZQ3I0MjJUb0JHUjg4OF9VOF9DMkMzUiAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JZQ3I0MjJUb0JHUjg4OF9VOF9DMkMzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19DYllDclk0MjJUb1lDYkNyNDIwUm90YXRlX1U4X0MyUDNSICAgICAgICBPTVhDQVRCQVIoSVBDU19DYllDclk0MjJUb1lDYkNyNDIwUm90YXRlX1U4X0MyUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfUDNSICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQ0NFRvQkdSNTY1X1U4X1UxNl9DM1IgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQ0NFRvQkdSNTY1X1U4X1UxNl9DM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQ0NFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQ0NFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I4ODhfVThfQzNSICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I4ODhfVThfQzNSLCBPTVhJUENTX1NVRkZJWCkKLQotI2RlZmluZSBvbXhJUFBQX0RlYmxvY2tfSG9yRWRnZV9VOF9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0RlYmxvY2tfSG9yRWRnZV9VOF9JLCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9EZWJsb2NrX1ZlckVkZ2VfVThfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9EZWJsb2NrX1ZlckVkZ2VfVThfSSwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfRmlsdGVyRklSX1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRmlsdGVyRklSX1U4X0MxUiwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfRmlsdGVyTWVkaWFuX1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRmlsdGVyTWVkaWFuX1U4X0MxUiwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfR2V0Q2VudHJhbE1vbWVudF9TNjQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfR2V0Q2VudHJhbE1vbWVudF9TNjQsIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX0dldFNwYXRpYWxNb21lbnRfUzY0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0dldFNwYXRpYWxNb21lbnRfUzY0LCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9Nb21lbnRHZXRTdGF0ZVNpemUgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9Nb21lbnRHZXRTdGF0ZVNpemUsIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX01vbWVudEluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudEluaXQsIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX01vbWVudHNfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudHNfVThfQzFSLCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9Nb21lbnRzX1U4X0MzUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9Nb21lbnRzX1U4X0MzUiwgT01YSVBQUF9TVUZGSVgpCi0KLSNkZWZpbmUgb214U1BfQmxvY2tFeHBfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfQmxvY2tFeHBfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0Jsb2NrRXhwX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0Jsb2NrRXhwX1MzMiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9Db3B5X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9Db3B5X1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9Eb3RQcm9kX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9Eb3RQcm9kX1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9Eb3RQcm9kX1MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9Eb3RQcm9kX1MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZURndkX0NUb0NfU0MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX0NUb0NfU0MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZURndkX0NUb0NfU0MzMl9TZnMgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX0NUb0NfU0MzMl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZURndkX1JUb0NDU19TMTZTMzJfU2ZzICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX1JUb0NDU19TMTZTMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEZ3ZF9SVG9DQ1NfUzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9SVG9DQ1NfUzMyX1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRHZXRCdWZTaXplX0NfU0MxNiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRHZXRCdWZTaXplX0NfU0MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRHZXRCdWZTaXplX0NfU0MzMiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRHZXRCdWZTaXplX0NfU0MzMiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRHZXRCdWZTaXplX1JfUzE2UzMyICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRHZXRCdWZTaXplX1JfUzE2UzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfUl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfUl9TMzIsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUSW5pdF9DX1NDMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW5pdF9DX1NDMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUSW5pdF9DX1NDMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW5pdF9DX1NDMzIsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUSW5pdF9SX1MxNlMzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW5pdF9SX1MxNlMzMiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbml0X1JfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X1JfUzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEludl9DQ1NUb1JfUzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DQ1NUb1JfUzMyX1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbnZfQ0NTVG9SX1MzMlMxNl9TZnMgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ0NTVG9SX1MzMlMxNl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUSW52X0NUb0NfU0MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NUb0NfU0MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUSW52X0NUb0NfU0MzMl9TZnMgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NUb0NfU0MzMl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRmlsdGVyTWVkaWFuX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRmlsdGVyTWVkaWFuX1MzMiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GaWx0ZXJNZWRpYW5fUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GaWx0ZXJNZWRpYW5fUzMyX0ksIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNl9JU2ZzICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNl9JU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2X1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0lTZnMgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0lTZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0lJUl9CaVF1YWREaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUl9CaVF1YWREaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0lJUl9CaVF1YWREaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUl9CaVF1YWREaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlSX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlSX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9JSVJPbmVfQmlRdWFkRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJPbmVfQmlRdWFkRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9JSVJPbmVfQmlRdWFkRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJPbmVfQmlRdWFkRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0lJUk9uZV9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0lJUk9uZV9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKLQotI2RlZmluZSBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQXZlcmFnZV8xNngsIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9BdmVyYWdlXzh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9BdmVyYWdlXzh4LCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrLCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX0NvcHkxNngxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0NvcHkxNngxNiwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX0NvcHk4eDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0NvcHk4eDgsIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9FeHBhbmRGcmFtZV9JLCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fTGltaXRNVlRvUmVjdCwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX1NBRF8xNnggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX1NBRF8xNngsIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9TQURfOHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9TQURfOHgsIE9NWFZDQ09NTV9TVUZGSVgpCi0KLSNkZWZpbmUgb214VkNNNFAxMF9BdmVyYWdlXzR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9BdmVyYWdlXzR4LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9CbG9ja01hdGNoX0hhbGYsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWJsb2NrQ2hyb21hX0ksIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlYmxvY2tMdW1hX0ksIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCBPTVhDQVRCQVIoVkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfR2V0VkxDSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfR2V0VkxDSW5mbywgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQyAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX01FR2V0QnVmU2l6ZSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfTUVJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfTUVJbml0LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDgsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1NBRF80eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBRF80eCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfU0FEUXVhcl8xNnggICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEUXVhcl8xNngsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1NBRFF1YXJfNHggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBRFF1YXJfNHgsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1NBRFF1YXJfOHggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBRFF1YXJfOHgsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1NBVERfNHg0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBVERfNHg0LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCi0KLSNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDggICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDgsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4LCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRENUOHg4YmxrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRENUOHg4YmxrLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlciAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlciwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVNViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVNViwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9GaW5kTVZwcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9GaW5kTVZwcmVkLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfSURDVDh4OGJsayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfSURDVDh4OGJsaywgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX01DUmVjb25CbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX01DUmVjb25CbG9jaywgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX01FR2V0QnVmU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX01FR2V0QnVmU2l6ZSwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX01FSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX01FSW5pdCwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX1F1YW50SW50ZXJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1F1YW50SW50ZXJfSSwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX1F1YW50SW50cmFfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1F1YW50SW50cmFfSSwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1F1YW50SW52SW50ZXJfSSwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1F1YW50SW52SW50cmFfSSwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEsIE9NWFZDTTRQMl9TVUZGSVgpCi0KLQotI2VuZGlmIC8qIF9hcm1PTVhfaF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvb214dHlwZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvb214dHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEyY2IwZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL29teHR5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqCi0gKiBGaWxlOiBvbXh0eXBlcy5oCi0gKiBCcmllZjogRGVmaW5lcyBiYXNpYyBEYXRhIHR5cGVzIHVzZWQgaW4gT3Blbk1BWCB2MS4wLjIgaGVhZGVyIGZpbGVzLgotICoKLSAqIENvcHlyaWdodCCpIDIwMDUtMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICoKLSAqIFRoZXNlIG1hdGVyaWFscyBhcmUgcHJvdGVjdGVkIGJ5IGNvcHlyaWdodCBsYXdzIGFuZCBjb250YWluIG1hdGVyaWFsIAotICogcHJvcHJpZXRhcnkgdG8gdGhlIEtocm9ub3MgR3JvdXAsIEluYy4gIFlvdSBtYXkgdXNlIHRoZXNlIG1hdGVyaWFscyAKLSAqIGZvciBpbXBsZW1lbnRpbmcgS2hyb25vcyBzcGVjaWZpY2F0aW9ucywgd2l0aG91dCBhbHRlcmluZyBvciByZW1vdmluZyAKLSAqIGFueSB0cmFkZW1hcmssIGNvcHlyaWdodCBvciBvdGhlciBub3RpY2UgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbi4KLSAqIAotICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCByZXByZXNlbnRhdGlvbnMgCi0gKiBvciB3YXJyYW50aWVzLCBleHByZXNzIG9yIGltcGxpZWQsIHJlZ2FyZGluZyB0aGVzZSBtYXRlcmlhbHMsIGluY2x1ZGluZywgCi0gKiB3aXRob3V0IGxpbWl0YXRpb24sIGFueSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgCi0gKiBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2Ugb3Igbm9uLWluZnJpbmdlbWVudCBvZiBhbnkgaW50ZWxsZWN0dWFsIHByb3BlcnR5LiAKLSAqIEtocm9ub3MgR3JvdXAgbWFrZXMgbm8sIGFuZCBleHByZXNzbHkgZGlzY2xhaW1zIGFueSwgd2FycmFudGllcywgZXhwcmVzcyAKLSAqIG9yIGltcGxpZWQsIHJlZ2FyZGluZyB0aGUgY29ycmVjdG5lc3MsIGFjY3VyYWN5LCBjb21wbGV0ZW5lc3MsIHRpbWVsaW5lc3MsIAotICogYW5kIHJlbGlhYmlsaXR5IG9mIHRoZXNlIG1hdGVyaWFscy4gCi0gKgotICogVW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyB3aWxsIHRoZSBLaHJvbm9zIEdyb3VwLCBvciBhbnkgb2YgaXRzIFByb21vdGVycywgCi0gKiBDb250cmlidXRvcnMgb3IgTWVtYmVycyBvciB0aGVpciByZXNwZWN0aXZlIHBhcnRuZXJzLCBvZmZpY2VycywgZGlyZWN0b3JzLCAKLSAqIGVtcGxveWVlcywgYWdlbnRzIG9yIHJlcHJlc2VudGF0aXZlcyBiZSBsaWFibGUgZm9yIGFueSBkYW1hZ2VzLCB3aGV0aGVyIAotICogZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgZm9yIGxvc3QgcmV2ZW51ZXMsIAotICogbG9zdCBwcm9maXRzLCBvciBvdGhlcndpc2UsIGFyaXNpbmcgZnJvbSBvciBpbiBjb25uZWN0aW9uIHdpdGggdGhlc2UgCi0gKiBtYXRlcmlhbHMuCi0gKiAKLSAqIEtocm9ub3MgYW5kIE9wZW5NQVggYXJlIHRyYWRlbWFya3Mgb2YgdGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKLSAqCi0gKi8KLSAgCi0jaWZuZGVmIF9PTVhUWVBFU19IXwotI2RlZmluZSBfT01YVFlQRVNfSF8KLQotI2luY2x1ZGUgPGxpbWl0cy5oPiAKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2RlZmluZSBPTVhfSU4KLSNkZWZpbmUgT01YX09VVAotI2RlZmluZSBPTVhfSU5PVVQKLQotCi10eXBlZGVmIGVudW0gewotICAgIAotICAgIC8qIE1hbmRhdG9yeSByZXR1cm4gY29kZXMgLSB1c2UgY2FzZXMgYXJlIGV4cGxpY2l0bHkgZGVzY3JpYmVkIGZvciBlYWNoIGZ1bmN0aW9uICovCi0gICAgT01YX1N0c19Ob0VyciAgICAgICAgICAgICAgICAgICAgPSAgMCwgICAgLyogTm8gZXJyb3IsIHRoZSBmdW5jdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5ICovCi0gICAgT01YX1N0c19FcnIgICAgICAgICAgICAgICAgICAgICAgPSAtMiwgICAgLyogVW5rbm93bi91bnNwZWNpZmllZCBlcnJvciAqLyAgICAKLSAgICBPTVhfU3RzX0ludmFsaWRCaXRzdHJlYW1WYWxFcnIgICA9IC0xODIsICAvKiBJbnZhbGlkIHZhbHVlIGRldGVjdGVkIGR1cmluZyBiaXRzdHJlYW0gcHJvY2Vzc2luZyAqLyAgICAKLSAgICBPTVhfU3RzX01lbUFsbG9jRXJyICAgICAgICAgICAgICA9IC05LCAgICAvKiBOb3QgZW5vdWdoIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBvcGVyYXRpb24gKi8KLSAgICBPTVhfU3RzQUNBQUNfR2FpbkN0ckVyciAgICAJICAgICA9IC0xNTksICAvKiBBQUM6IFVuc3VwcG9ydGVkIGdhaW4gY29udHJvbCBkYXRhIGRldGVjdGVkICovCi0gICAgT01YX1N0c0FDQUFDX1ByZ051bUVyciAgICAgICAgICAgPSAtMTY3LCAgLyogQUFDOiBJbnZhbGlkIG51bWJlciBvZiBlbGVtZW50cyBmb3Igb25lIHByb2dyYW0gICAqLwotICAgIE9NWF9TdHNBQ0FBQ19Db2VmVmFsRXJyICAgICAgICAgID0gLTE2MywgIC8qIEFBQzogSW52YWxpZCBxdWFudGl6ZWQgY29lZmZpY2llbnQgdmFsdWUgICAgICAgICAgKi8gICAgIAotICAgIE9NWF9TdHNBQ0FBQ19NYXhTZmJFcnIgICAgICAgICAgID0gLTE2MiwgIC8qIEFBQzogSW52YWxpZCBtYXhTZmIgdmFsdWUgaW4gcmVsYXRpb24gdG8gbnVtU3diICovICAgIAotCU9NWF9TdHNBQ0FBQ19QbHNEYXRhRXJyCQkgICAgID0gLTE2MCwgIC8qIEFBQzogcHVsc2UgZXNjYXBlIHNlcXVlbmNlIGRhdGEgZXJyb3IgKi8KLQotICAgIC8qIE9wdGlvbmFsIHJldHVybiBjb2RlcyAtIHVzZSBjYXNlcyBhcmUgZXhwbGljaXRseSBkZXNjcmliZWQgZm9yIGVhY2ggZnVuY3Rpb24qLwotICAgIE9NWF9TdHNfQmFkQXJnRXJyICAgICAgICAgICAgICAgID0gLTUsICAgIC8qIEJhZCBBcmd1bWVudHMgKi8KLQotICAgIE9NWF9TdHNBQ0FBQ19UbnNOdW1GaWx0RXJyICAgICAgID0gLTE1NywgIC8qIEFBQzogSW52YWxpZCBudW1iZXIgb2YgVE5TIGZpbHRlcnMgICovCi0gICAgT01YX1N0c0FDQUFDX1Ruc0xlbkVyciAgICAgICAgICAgPSAtMTU2LCAgLyogQUFDOiBJbnZhbGlkIFROUyByZWdpb24gbGVuZ3RoICAqLyAgIAotICAgIE9NWF9TdHNBQ0FBQ19UbnNPcmRlckVyciAgICAgICAgID0gLTE1NSwgIC8qIEFBQzogSW52YWxpZCBvcmRlciBvZiBUTlMgZmlsdGVyICAqLyAgICAgICAgICAgICAgICAgIAotICAgIE9NWF9TdHNBQ0FBQ19UbnNDb2VmUmVzRXJyICAgICAgID0gLTE1NCwgIC8qIEFBQzogSW52YWxpZCBiaXQtcmVzb2x1dGlvbiBmb3IgVE5TIGZpbHRlciBjb2VmZmljaWVudHMgICovCi0gICAgT01YX1N0c0FDQUFDX1Ruc0NvZWZFcnIgICAgICAgICAgPSAtMTUzLCAgLyogQUFDOiBJbnZhbGlkIFROUyBmaWx0ZXIgY29lZmZpY2llbnRzICAqLyAgICAgICAgICAgICAgICAgIAotICAgIE9NWF9TdHNBQ0FBQ19UbnNEaXJlY3RFcnIgICAgICAgID0gLTE1MiwgIC8qIEFBQzogSW52YWxpZCBUTlMgZmlsdGVyIGRpcmVjdGlvbiAgKi8gIAotCi0gICAgT01YX1N0c0lDSlBfSlBFR01hcmtlckVyciAgICAgICAgPSAtMTgzLCAgLyogSlBFRyBtYXJrZXIgZW5jb3VudGVyZWQgd2l0aGluIGFuIGVudHJvcHktY29kZWQgYmxvY2s7ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSHVmZm1hbiBkZWNvZGluZyBvcGVyYXRpb24gdGVybWluYXRlZCBlYXJseS4gICAgICAgICAgICovCi0gICAgT01YX1N0c0lDSlBfSlBFR01hcmtlciAgICAgICAgICAgPSAtMTgxLCAgLyogSlBFRyBtYXJrZXIgZW5jb3VudGVyZWQ7IEh1ZmZtYW4gZGVjb2RpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGVyYXRpb24gdGVybWluYXRlZCBlYXJseS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBPTVhfU3RzSVBQUF9Db250ZXh0TWF0Y2hFcnIgICAgICA9IC0xNywgICAvKiBDb250ZXh0IHBhcmFtZXRlciBkb2Vzbid0IG1hdGNoIHRvIHRoZSBvcGVyYXRpb24gKi8KLQotICAgIE9NWF9TdHNTUF9FdmVuTWVkaWFuTWFza1NpemVFcnIgID0gLTE4MCwgIC8qIEV2ZW4gc2l6ZSBvZiB0aGUgTWVkaWFuIEZpbHRlciBtYXNrIHdhcyByZXBsYWNlZCBieSB0aGUgb2RkIG9uZSAqLwotCi0gICAgT01YX1N0c19NYXhpbXVtRW51bWVyYXRpb24gICAgICAgPSBJTlRfTUFYICAvKlBsYWNlaG9sZGVyLCBmb3JjZXMgZW51bSBvZiBzaXplIE9NWF9JTlQqLwotICAgIAotIH0gT01YUmVzdWx0OyAgICAgICAgICAvKiogUmV0dXJuIHZhbHVlIG9yIGVycm9yIHZhbHVlIHJldHVybmVkIGZyb20gYSBmdW5jdGlvbi4gSWRlbnRpY2FsIHRvIE9NWF9JTlQgKi8KLQotIAotLyogT01YX1U4ICovCi10eXBlZGVmIHVpbnQ4X3QgT01YX1U4OwotIAotLyogT01YX1M4ICovCi10eXBlZGVmIGludDhfdCBPTVhfUzg7Ci0gCi0vKiBPTVhfVTE2ICovCi10eXBlZGVmIHVpbnQxNl90IE9NWF9VMTY7Ci0KLS8qIE9NWF9TMTYgKi8KLXR5cGVkZWYgaW50MTZfdCBPTVhfUzE2OwotCi0vKiBPTVhfVTMyICovCi10eXBlZGVmIHVpbnQzMl90IE9NWF9VMzI7Ci0KLS8qIE9NWF9TMzIgKi8KLXR5cGVkZWYgaW50MzJfdCBPTVhfUzMyOwotCi0vKiBPTVhfVTY0ICYgT01YX1M2NCAqLwotI2lmIGRlZmluZWQoIF9XSU4zMiApIHx8IGRlZmluZWQgKCBfV0lONjQgKQotICAgIHR5cGVkZWYgX19pbnQ2NCBPTVhfUzY0OyAvKiogU2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCi0gICAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IE9NWF9VNjQ7IC8qKiBVbnNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLwotICAgICNkZWZpbmUgT01YX01JTl9TNjQJCQkoMHg4MDAwMDAwMDAwMDAwMDAwaTY0KQotICAgICNkZWZpbmUgT01YX01JTl9VNjQJCQkoMHgwMDAwMDAwMDAwMDAwMDAwaTY0KQotICAgICNkZWZpbmUgT01YX01BWF9TNjQJCQkoMHg3RkZGRkZGRkZGRkZGRkZGaTY0KQotICAgICNkZWZpbmUgT01YX01BWF9VNjQJCQkoMHhGRkZGRkZGRkZGRkZGRkZGaTY0KQotI2Vsc2UKLSAgICB0eXBlZGVmIGludDY0X3QgT01YX1M2NDsgLyoqIFNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLwotICAgIHR5cGVkZWYgdWludDY0X3QgT01YX1U2NDsgLyoqIFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCi0gICAgI2RlZmluZSBPTVhfTUlOX1M2NAkJCSgweDgwMDAwMDAwMDAwMDAwMDBMTCkKLSAgICAjZGVmaW5lIE9NWF9NSU5fVTY0CQkJKDB4MDAwMDAwMDAwMDAwMDAwMExMKQotICAgICNkZWZpbmUgT01YX01BWF9TNjQJCQkoMHg3RkZGRkZGRkZGRkZGRkZGTEwpCi0gICAgI2RlZmluZSBPTVhfTUFYX1U2NAkJCSgweEZGRkZGRkZGRkZGRkZGRkZMTCkKLSNlbmRpZgotCi0vKiBPTVhfU0M4ICovCi10eXBlZGVmIHN0cnVjdAotewotICBPTVhfUzggUmU7IC8qKiBSZWFsIHBhcnQgKi8KLSAgT01YX1M4IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCi0JCi19IE9NWF9TQzg7IC8qKiBTaWduZWQgOC1iaXQgY29tcGxleCBudW1iZXIgKi8KLQotCi0vKiBPTVhfU0MxNiAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgT01YX1MxNiBSZTsgLyoqIFJlYWwgcGFydCAqLwotICBPTVhfUzE2IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCi0JCi19IE9NWF9TQzE2OyAvKiogU2lnbmVkIDE2LWJpdCBjb21wbGV4IG51bWJlciAqLwotCi0KLS8qIE9NWF9TQzMyICovCi10eXBlZGVmIHN0cnVjdAotewotICBPTVhfUzMyIFJlOyAvKiogUmVhbCBwYXJ0ICovCi0gIE9NWF9TMzIgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKLQkKLX0gT01YX1NDMzI7IC8qKiBTaWduZWQgMzItYml0IGNvbXBsZXggbnVtYmVyICovCi0KLQotLyogT01YX1NDNjQgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE9NWF9TNjQgUmU7IC8qKiBSZWFsIHBhcnQgKi8KLSAgT01YX1M2NCBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQotCQotfSBPTVhfU0M2NDsgLyoqIFNpZ25lZCA2NC1iaXQgY29tcGxleCBudW1iZXIgKi8KLQotCi0vKiBPTVhfRjMyICovCi10eXBlZGVmIGZsb2F0IE9NWF9GMzI7IC8qKiBTaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50LElFRUUgNzU0ICovCi0KLQotLyogT01YX0Y2NCAqLwotdHlwZWRlZiBkb3VibGUgT01YX0Y2NDsgLyoqIERvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQsSUVFRSA3NTQgKi8KLQotCi0vKiBPTVhfSU5UICovCi10eXBlZGVmIGludCBPTVhfSU5UOyAvKiogc2lnbmVkIGludGVnZXIgY29ycmVzcG9uZGluZyB0byBtYWNoaW5lIHdvcmQgbGVuZ3RoLCBoYXMgbWF4aW11bSBzaWduZWQgdmFsdWUgSU5UX01BWCovCi0KLQotI2RlZmluZSBPTVhfTUlOX1M4ICAJICAgCSgtMTI4KQotI2RlZmluZSBPTVhfTUlOX1U4ICAJCTAKLSNkZWZpbmUgT01YX01JTl9TMTYJCSAJKC0zMjc2OCkKLSNkZWZpbmUgT01YX01JTl9VMTYJCQkwCi0jZGVmaW5lIE9NWF9NSU5fUzMyCQkJKC0yMTQ3NDgzNjQ3LTEpCi0jZGVmaW5lIE9NWF9NSU5fVTMyCQkJMAotCi0jZGVmaW5lIE9NWF9NQVhfUzgJCQkoMTI3KQotI2RlZmluZSBPTVhfTUFYX1U4CQkJKDI1NSkKLSNkZWZpbmUgT01YX01BWF9TMTYJCQkoMzI3NjcpCi0jZGVmaW5lIE9NWF9NQVhfVTE2CQkJKDB4RkZGRikKLSNkZWZpbmUgT01YX01BWF9TMzIJCQkoMjE0NzQ4MzY0NykKLSNkZWZpbmUgT01YX01BWF9VMzIJCQkoMHhGRkZGRkZGRikKLQotdHlwZWRlZiB2b2lkIE9NWFZvaWQ7Ci0KLSNpZm5kZWYgTlVMTAotI2RlZmluZSBOVUxMICgodm9pZCopMCkKLSNlbmRpZgotCi0vKiogRGVmaW5lcyB0aGUgZ2VvbWV0cmljIHBvc2l0aW9uIGFuZCBzaXplIG9mIGEgcmVjdGFuZ2xlLCAKLSAgKiB3aGVyZSB4LHkgZGVmaW5lcyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHRvcCBsZWZ0IGNvcm5lcgotICAqIG9mIHRoZSByZWN0YW5nbGUsIHdpdGggZGltZW5zaW9ucyB3aWR0aCBpbiB0aGUgeC1kaXJlY3Rpb24gCi0gICogYW5kIGhlaWdodCBpbiB0aGUgeS1kaXJlY3Rpb24gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQlPTVhfSU5UIHg7ICAgICAgLyoqIHgtY29vcmRpbmF0ZSBvZiB0b3AgbGVmdCBjb3JuZXIgb2YgcmVjdGFuZ2xlICovCi0JT01YX0lOVCB5OyAgICAgIC8qKiB5LWNvb3JkaW5hdGUgb2YgdG9wIGxlZnQgY29ybmVyIG9mIHJlY3RhbmdsZSAqLwotCU9NWF9JTlQgd2lkdGg7ICAvKiogV2lkdGggaW4gdGhlIHgtZGlyZWN0aW9uLiAqLwotCU9NWF9JTlQgaGVpZ2h0OyAvKiogSGVpZ2h0IGluIHRoZSB5LWRpcmVjdGlvbi4gKi8KLX1PTVhSZWN0OwotCi0KLS8qKiBEZWZpbmVzIHRoZSBnZW9tZXRyaWMgcG9zaXRpb24gb2YgYSBwb2ludCwgKi8KLXR5cGVkZWYgc3RydWN0IAotewotIE9NWF9JTlQgeDsgLyoqIHgtY29vcmRpbmF0ZSAqLwotIE9NWF9JTlQgeTsJLyoqIHktY29vcmRpbmF0ZSAqLwotCQotfSBPTVhQb2ludDsKLQotCi0vKiogRGVmaW5lcyB0aGUgZGltZW5zaW9ucyBvZiBhIHJlY3RhbmdsZSwgb3IgcmVnaW9uIG9mIGludGVyZXN0IGluIGFuIGltYWdlICovCi10eXBlZGVmIHN0cnVjdCAKLXsKLSBPTVhfSU5UIHdpZHRoOyAgLyoqIFdpZHRoIG9mIHRoZSByZWN0YW5nbGUsIGluIHRoZSB4LWRpcmVjdGlvbiAqLwotIE9NWF9JTlQgaGVpZ2h0OyAvKiogSGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUsIGluIHRoZSB5LWRpcmVjdGlvbiAqLwotCQotfSBPTVhTaXplOwotCi0jZW5kaWYgLyogX09NWFRZUEVTX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL29teHR5cGVzX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvb214dHlwZXNfcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTc0MmM3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvb214dHlwZXNfcy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teHR5cGVzX3MuaAotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotOy8vIE1hbmRhdG9yeSByZXR1cm4gY29kZXMgLSB1c2UgY2FzZXMgYXJlIGV4cGxpY2l0bHkgZGVzY3JpYmVkIGZvciBlYWNoIGZ1bmN0aW9uIAotT01YX1N0c19Ob0VyciAgICAgICAgICAgICAgICAgICAgRVFVICAwICAgIDsvLyBObyBlcnJvciB0aGUgZnVuY3Rpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAKLU9NWF9TdHNfRXJyICAgICAgICAgICAgICAgICAgICAgIEVRVSAtMiAgICA7Ly8gVW5rbm93bi91bnNwZWNpZmllZCBlcnJvciAgICAgCi1PTVhfU3RzX0ludmFsaWRCaXRzdHJlYW1WYWxFcnIgICBFUVUgLTE4MiAgOy8vIEludmFsaWQgdmFsdWUgZGV0ZWN0ZWQgZHVyaW5nIGJpdHN0cmVhbSBwcm9jZXNzaW5nICAgICAKLU9NWF9TdHNfTWVtQWxsb2NFcnIgICAgICAgICAgICAgIEVRVSAtOSAgICA7Ly8gTm90IGVub3VnaCBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgb3BlcmF0aW9uIAotT01YX1N0c0FDQUFDX0dhaW5DdHJFcnIgICAgCSAgICAgRVFVIC0xNTkgIDsvLyBBQUM6IFVuc3VwcG9ydGVkIGdhaW4gY29udHJvbCBkYXRhIGRldGVjdGVkIAotT01YX1N0c0FDQUFDX1ByZ051bUVyciAgICAgICAgICAgRVFVIC0xNjcgIDsvLyBBQUM6IEludmFsaWQgbnVtYmVyIG9mIGVsZW1lbnRzIGZvciBvbmUgcHJvZ3JhbSAgIAotT01YX1N0c0FDQUFDX0NvZWZWYWxFcnIgICAgICAgICAgRVFVIC0xNjMgIDsvLyBBQUM6IEludmFsaWQgcXVhbnRpemVkIGNvZWZmaWNpZW50IHZhbHVlICAgICAgICAgICAgICAgCi1PTVhfU3RzQUNBQUNfTWF4U2ZiRXJyICAgICAgICAgICBFUVUgLTE2MiAgOy8vIEFBQzogSW52YWxpZCBtYXhTZmIgdmFsdWUgaW4gcmVsYXRpb24gdG8gbnVtU3diICAgICAKLU9NWF9TdHNBQ0FBQ19QbHNEYXRhRXJyCQkgICAgIEVRVSAtMTYwICA7Ly8gQUFDOiBwdWxzZSBlc2NhcGUgc2VxdWVuY2UgZGF0YSBlcnJvciAKLQotOy8vIE9wdGlvbmFsIHJldHVybiBjb2RlcyAtIHVzZSBjYXNlcyBhcmUgZXhwbGljaXRseSBkZXNjcmliZWQgZm9yIGVhY2ggZnVuY3Rpb24KLU9NWF9TdHNfQmFkQXJnRXJyICAgICAgICAgICAgICAgIEVRVSAtNSAgICA7Ly8gQmFkIEFyZ3VtZW50cyAKLQotT01YX1N0c0FDQUFDX1Ruc051bUZpbHRFcnIgICAgICAgRVFVIC0xNTcgIDsvLyBBQUM6IEludmFsaWQgbnVtYmVyIG9mIFROUyBmaWx0ZXJzICAKLU9NWF9TdHNBQ0FBQ19UbnNMZW5FcnIgICAgICAgICAgIEVRVSAtMTU2ICA7Ly8gQUFDOiBJbnZhbGlkIFROUyByZWdpb24gbGVuZ3RoICAgICAKLU9NWF9TdHNBQ0FBQ19UbnNPcmRlckVyciAgICAgICAgIEVRVSAtMTU1ICA7Ly8gQUFDOiBJbnZhbGlkIG9yZGVyIG9mIFROUyBmaWx0ZXIgICAgICAgICAgICAgICAgICAgIAotT01YX1N0c0FDQUFDX1Ruc0NvZWZSZXNFcnIgICAgICAgRVFVIC0xNTQgIDsvLyBBQUM6IEludmFsaWQgYml0LXJlc29sdXRpb24gZm9yIFROUyBmaWx0ZXIgY29lZmZpY2llbnRzICAKLU9NWF9TdHNBQ0FBQ19UbnNDb2VmRXJyICAgICAgICAgIEVRVSAtMTUzICA7Ly8gQUFDOiBJbnZhbGlkIFROUyBmaWx0ZXIgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAKLU9NWF9TdHNBQ0FBQ19UbnNEaXJlY3RFcnIgICAgICAgIEVRVSAtMTUyICA7Ly8gQUFDOiBJbnZhbGlkIFROUyBmaWx0ZXIgZGlyZWN0aW9uICAgIAotCi1PTVhfU3RzSUNKUF9KUEVHTWFya2VyRXJyICAgICAgICBFUVUgLTE4MyAgOy8vIEpQRUcgbWFya2VyIGVuY291bnRlcmVkIHdpdGhpbiBhbiBlbnRyb3B5LWNvZGVkIGJsb2NrOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEh1ZmZtYW4gZGVjb2Rpbmcgb3BlcmF0aW9uIHRlcm1pbmF0ZWQgZWFybHkuICAgICAgICAgICAKLU9NWF9TdHNJQ0pQX0pQRUdNYXJrZXIgICAgICAgICAgIEVRVSAtMTgxICA7Ly8gSlBFRyBtYXJrZXIgZW5jb3VudGVyZWQ7IEh1ZmZtYW4gZGVjb2RpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBvcGVyYXRpb24gdGVybWluYXRlZCBlYXJseS4gICAgICAgICAgICAgICAgICAgICAgICAgCi1PTVhfU3RzSVBQUF9Db250ZXh0TWF0Y2hFcnIgICAgICBFUVUgLTE3ICAgOy8vIENvbnRleHQgcGFyYW1ldGVyIGRvZXNuJ3QgbWF0Y2ggdG8gdGhlIG9wZXJhdGlvbiAKLQotT01YX1N0c1NQX0V2ZW5NZWRpYW5NYXNrU2l6ZUVyciAgRVFVIC0xODAgIDsvLyBFdmVuIHNpemUgb2YgdGhlIE1lZGlhbiBGaWx0ZXIgbWFzayB3YXMgcmVwbGFjZWQgYnkgdGhlIG9kZCBvbmUgCi0KLU9NWF9TdHNfTWF4aW11bUVudW1lcmF0aW9uICAgICAgIEVRVSAweDdGRkZGRkZGCi0KLQotCi1PTVhfTUlOX1M4ICAgICAgRVFVIAkgICAJKC0xMjgpCi1PTVhfTUlOX1U4ICAJRVFVICAgICAJMAotT01YX01JTl9TMTYJCUVRVSAgICAgIAkoLTMyNzY4KQotT01YX01JTl9VMTYJCUVRVQkgICAgICAgIDAKLQotCi1PTVhfTUlOX1MzMgkJRVFVCSgtMjE0NzQ4MzY0Ny0xKQotT01YX01JTl9VMzIJCUVRVQkwCi0KLU9NWF9NQVhfUzgJCUVRVQkoMTI3KQotT01YX01BWF9VOAkJRVFVCSgyNTUpCi1PTVhfTUFYX1MxNgkJRVFVCSgzMjc2NykKLU9NWF9NQVhfVTE2CQlFUVUJKDB4RkZGRikKLU9NWF9NQVhfUzMyCQlFUVUJKDIxNDc0ODM2NDcpCi1PTVhfTUFYX1UzMgkJRVFVCSgweEZGRkZGRkZGKQotCi1PTVhfVkNfVVBQRVIgICAgRVFVIDB4MSAgICAgICAgICAgICAgICAgOy8vIFVzZWQgYnkgdGhlIFByZWRpY3RJbnRyYSBmdW5jdGlvbnMgICAKLU9NWF9WQ19MRUZUICAgICBFUVUgMHgyICAgICAgICAgICAgICAgICA7Ly8gVXNlZCBieSB0aGUgUHJlZGljdEludHJhIGZ1bmN0aW9ucyAKLU9NWF9WQ19VUFBFUl9SSUdIVCAgICBFUVUgMHg0MCAgICAgICAgICA7Ly8gVXNlZCBieSB0aGUgUHJlZGljdEludHJhIGZ1bmN0aW9ucyAgIAotCi1OVUxMICAgIEVRVSAwCi0KLTsvLyBTdHJ1Y3R1cmVzCi0KLSAgICBJTkNMVURFICAgICBhcm1DT01NX3MuaAotCi0gICAgTV9TVFJVQ1QgICAgT01YUG9pbnQKLSAgICBNX0ZJRUxEICAgICB4LCA0Ci0gICAgTV9GSUVMRCAgICAgeSwgNAotICAgIE1fRU5EU1RSVUNUCi0KLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYnVpbGRfdmMucGwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYnVpbGRfdmMucGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZhMjA2YzAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2J1aWxkX3ZjLnBsCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLSMhL3Vzci9iaW4vcGVybAotIwotIyAKLSMgRmlsZSBOYW1lOiAgYnVpbGRfdmMucGwKLSMgT3Blbk1BWCBETDogdjEuMC4yCi0jIFJldmlzaW9uOiAgIDEyMjkwCi0jIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotIyAKLSMgCi0jIAotIwotIyBUaGlzIGZpbGUgYnVpbGRzIHRoZSBPcGVuTUFYIERMIHZjIGRvbWFpbiBsaWJyYXJ5IG9teFZDLm8uCi0jCi0KLXVzZSBGaWxlOjpTcGVjOwotdXNlIHN0cmljdDsKLQotbXkgKCRDQywgJENDX09QVFMsICRBUywgJEFTX09QVFMsICRMSUIsICRMSUJfT1BUUywgJExJQl9UWVBFKTsKLQotJENDICAgICAgID0gJ2FybWNjJzsKLSRDQ19PUFRTICA9ICctLW5vX3VuYWxpZ25lZF9hY2Nlc3MgLS1jcHUgQ29ydGV4LUE4IC1jJzsKLSRBUyAgICAgICA9ICdhcm1hc20nOwotJEFTX09QVFMgID0gJy0tbm9fdW5hbGlnbmVkX2FjY2VzcyAtLWNwdSBDb3J0ZXgtQTgnOwotIyAkTElCICAgICAgPSAnYXJtbGluayc7Ci0jICRMSUJfT1BUUyA9ICctLXBhcnRpYWwgLW8nOwotIyAkTElCX1RZUEUgPSAnLm8nOwotJExJQiAgICAgID0gJ2FybWFyJzsKLSRMSUJfT1BUUyA9ICctLWNyZWF0ZSAtcic7Ci0kTElCX1RZUEUgPSAnLmEnOwotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW15IChAaGVhZGVybGlzdCwgQGZpbGVsaXN0LCAkaGQsICRmaWxlLCAkb2ZpbGUsICRjb21tYW5kLCAkb2JqbGlzdCwgJGxpYmZpbGUsICRoKTsKLQotIyBEZWZpbmUgdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgY29udGFpbmluZyBpbmNsdWRlZCBoZWFkZXIgZmlsZXMuCi1AaGVhZGVybGlzdCA9IHF3KGFwaSB2Yy9hcGkgdmMvbTRwMi9hcGkgdmMvbTRwMTAvYXBpKTsKLQotIyBEZWZpbmUgdGhlIGxpc3Qgb2Ygc291cmNlIGZpbGVzIHRvIGNvbXBpbGUuCi1vcGVuKEZJTEVTLCAnPGZpbGVsaXN0X3ZjLnR4dCcpIG9yIGRpZSgiQ2FuJ3Qgb3BlbiBzb3VyY2UgZmlsZSBsaXN0XG4iKTsKLUBmaWxlbGlzdCA9IDxGSUxFUz47Ci1jbG9zZShGSUxFUyk7Ci0KLSMgRml4IHRoZSBmaWxlIHNlcGFyYXRvcnMgaW4gdGhlIGhlYWRlciBwYXRocwotZm9yZWFjaCAkaCAoQGhlYWRlcmxpc3QpCi17Ci0gICAgICAgICRoID0gRmlsZTo6U3BlYy0+Y2Fub25wYXRoKCRoKTsKLX0KLQotIyBDcmVhdGUgdGhlIGluY2x1ZGUgcGF0aCB0byBiZSBwYXNzZWQgdG8gdGhlIGNvbXBpbGVyCi0kaGQgPSAnLUknIC4gam9pbignIC1JJywgQGhlYWRlcmxpc3QpOwotCi0jIENyZWF0ZSB0aGUgYnVpbGQgZGlyZWN0b3JpZXMgIi9saWIvIiBhbmQgIi9vYmovIiAoaWYgdGhleSBhcmUgbm90IHRoZXJlIGFscmVhZHkpCi1ta2RpciAib2JqIiwgMDc3NyBpZiAoISAtZCAib2JqIik7Ci1ta2RpciAibGliIiwgMDc3NyBpZiAoISAtZCAibGliIik7Ci0KLSRvYmpsaXN0ID0gJyc7Ci0KLSMgQ29tcGlsZSBlYWNoIGZpbGUKLWZvcmVhY2ggJGZpbGUgKEBmaWxlbGlzdCkKLXsKLQlteSAkZjsKLQlteSAkYmFzZTsKLQlteSAkZXh0OwotCW15ICRvYmpmaWxlOwotCi0JY2hvbXAoJGZpbGUpOwotCSRmaWxlID0gRmlsZTo6U3BlYy0+Y2Fub25wYXRoKCRmaWxlKTsKLQotCSh1bmRlZiwgdW5kZWYsICRmKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCgkZmlsZSk7Ci0gICAgJGY9fnMvW1xuXGZccl0vL2c7ICMgUmVtb3ZlIGFueSBlbmQtb2YtbGluZSBjaGFyYWN0ZXJzCi0KLQlpZigoJGJhc2UsICRleHQpID0gJGYgPX4gLyguKylcLihcdykkLykKLQl7Ci0JCSRvYmpmaWxlID0gRmlsZTo6U3BlYy0+Y2F0ZmlsZSgnb2JqJywgJGJhc2UuJy5vJyk7Ci0KLQkJaWYoJGV4dCBlcSAnYycpCi0JCXsKLQkJCSRvYmpsaXN0IC49ICIkb2JqZmlsZSAiOwotCQkJJGNvbW1hbmQgPSAkQ0MuJyAnLiRDQ19PUFRTLicgJy4kaGQuJyAtbyAnLiRvYmpmaWxlLicgJy4kZmlsZTsKLQkJCXByaW50ICIkY29tbWFuZFxuIjsKLQkJCXN5c3RlbSgkY29tbWFuZCk7Ci0JCX0KLQkJZWxzaWYoJGV4dCBlcSAncycpCi0JCXsKLQkJCSRvYmpsaXN0IC49ICIkb2JqZmlsZSAiOwotCQkJJGNvbW1hbmQgPSAkQVMuJyAnLiRBU19PUFRTLicgJy4kaGQuJyAtbyAnLiRvYmpmaWxlLicgJy4kZmlsZTsKLQkJCXByaW50ICIkY29tbWFuZFxuIjsKLQkJCXN5c3RlbSgkY29tbWFuZCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwcmludCAiSWdub3JpbmcgZmlsZTogJGZcbiI7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJZGllICJObyBmaWxlIGV4dGVuc2lvbiBmb3VuZDogJGZcbiI7Ci0JfQotfQotCi0jIERvIHRoZSBmaW5hbCBsaW5rIHN0YWdlIHRvIGNyZWF0ZSB0aGUgbGlicmFyaWVzLgotJGxpYmZpbGUgPSBGaWxlOjpTcGVjLT5jYXRmaWxlKCdsaWInLCAnb214VkMnLiRMSUJfVFlQRSk7Ci0kY29tbWFuZCA9ICRMSUIuJyAnLiRMSUJfT1BUUy4nICcuJGxpYmZpbGUuJyAnLiRvYmpsaXN0OwotcHJpbnQgIiRjb21tYW5kXG4iOwotKHN5c3RlbSgkY29tbWFuZCkgPT0gMCkgYW5kIHByaW50ICJCdWlsZCBzdWNjZXNzZnVsXG4iOwotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vZmlsZWxpc3RfdmMudHh0IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2ZpbGVsaXN0X3ZjLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRiOGVlYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vZmlsZWxpc3RfdmMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLi9hcGkvYXJtQ09NTS5oCi0uL2FwaS9hcm1DT01NX0JpdERlY19zLmgKLS4vYXBpL2FybUNPTU1fQml0c3RyZWFtLmgKLS4vYXBpL2FybUNPTU1fSURDVF9zLmgKLS4vYXBpL2FybUNPTU1fSURDVFRhYmxlLmgKLS4vYXBpL2FybUNPTU1fTWFza1RhYmxlLmgKLS4vYXBpL2FybUNPTU1fcy5oCi0uL2FwaS9hcm1DT01NX1ZlcnNpb24uaAotLi9hcGkvYXJtT01YX1JlbGVhc2VWZXJzaW9uLmgKLS4vYXBpL29teHR5cGVzLmgKLS4vYXBpL29teHR5cGVzX3MuaAotLi9zcmMvYXJtQ09NTV9JRENUVGFibGUuYwotLi9zcmMvYXJtQ09NTV9NYXNrVGFibGUuYwotLi92Yy9hcGkvYXJtVkMuaAotLi92Yy9hcGkvYXJtVkNDT01NX3MuaAotLi92Yy9hcGkvb214VkMuaAotLi92Yy9hcGkvb214VkNfcy5oCi0uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTZfcy5zCi0uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4X3MucwotLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMKLS4vdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLnMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5zCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MucwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucwotLi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKLS4vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaAotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucwotLi92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThkYmY0MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU0uYworKysgL2Rldi9udWxsCkBAIC0xLDk1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtQ09NTS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVmaW5lcyBDb21tb24gQVBJcyB1c2VkIGFjcm9zcyBPcGVuTUFYIEFQSSdzCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgLyogTWlzY2VsbGFuZW91cyBBcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzE2Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludCBhZnRlciByb3VuZGluZwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9TMTYgYXJtUm91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKQotewotICAgIGlmIChWYWx1ZSA+IDApCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9TMTYpKFZhbHVlICsgLjUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9TMTYpKFZhbHVlIC0gLjUpOwotICAgIH0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzMyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIGludCBhZnRlciByb3VuZGluZwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMzIgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9TMzIgYXJtUm91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKQotewotICAgIGlmIChWYWx1ZSA+IDApCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9TMzIpKFZhbHVlICsgLjUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9TMzIpKFZhbHVlIC0gLjUpOwotICAgIH0KLX0KLS8qKgotICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1MxNgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2IGZvcm1hdAotICoKLSAqLwotCi1PTVhfUzE2IGFybVNhdFJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSkKLXsKLSAgICBpZiAoVmFsdWUgPiAwKQotICAgIHsKLSAgICAgICAgVmFsdWUgKz0gMC41OwotICAgICAgICAKLSAgICAgICAgaWYoVmFsdWUgPiAoT01YX1MxNilPTVhfTUFYX1MxNiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUFYX1MxNjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilWYWx1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBWYWx1ZSAtPSAwLjU7Ci0KLSAgICAgICAgaWYoVmFsdWUgPCAoT01YX1MxNilPTVhfTUlOX1MxNiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUlOX1MxNjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilWYWx1ZTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvUzMyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMzIgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9TMzIgYXJtU2F0Um91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKQotewotICAgIGlmIChWYWx1ZSA+IDApCi0gICAgewotICAgICAgICBWYWx1ZSArPSAwLjU7Ci0gICAgICAgIAotICAgICAgICBpZihWYWx1ZSA+IChPTVhfUzMyKU9NWF9NQVhfUzMyICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKU9NWF9NQVhfUzMyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKVZhbHVlOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIFZhbHVlIC09IDAuNTsKLQotICAgICAgICBpZihWYWx1ZSA8IChPTVhfUzMyKU9NWF9NSU5fUzMyICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKU9NWF9NSU5fUzMyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKVZhbHVlOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9VMTYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgdW5zaWduZWQgc2hvcnQgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1UxNiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1UxNiBhcm1TYXRSb3VuZEZsb2F0VG9VMTYgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgVmFsdWUgKz0gMC41OwotICAgIAotICAgIGlmKFZhbHVlID4gKE9NWF9VMTYpT01YX01BWF9VMTYgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfVTE2KU9NWF9NQVhfVTE2OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9VMTYpVmFsdWU7Ci0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9VMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgdW5zaWduZWQgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1UzMiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1UzMiBhcm1TYXRSb3VuZEZsb2F0VG9VMzIgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgVmFsdWUgKz0gMC41OwotICAgIAotICAgIGlmKFZhbHVlID4gKE9NWF9VMzIpT01YX01BWF9VMzIgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfVTMyKU9NWF9NQVhfVTMyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9VMzIpVmFsdWU7Ci0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TNjQKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgNjQgYml0IGludCBhZnRlciByb3VuZGluZwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TNjQgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9TNjQgYXJtUm91bmRGbG9hdFRvUzY0IChPTVhfRjY0IFZhbHVlKQotewotICAgIGlmIChWYWx1ZSA+IDApCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9TNjQpKFZhbHVlICsgLjUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9TNjQpKFZhbHVlIC0gLjUpOwotICAgIH0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2lnbkNoZWNrCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDaGVja3MgdGhlIHNpZ24gb2YgYSB2YXJpYWJsZToKLSAqIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQotICogcmV0dXJucyAwIGlmIGl0IGlzIDAKLSAqIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQkgICAgdmFyICAgICBWYXJpYWJsZSB0byBiZSBjaGVja2VkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX0lOVCAtLSAgIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQotICogICAgICAgICAgICAgIHJldHVybnMgMCBpZiBpdCBpcyAwCi0gKiAgICAgICAgICAgICAgcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKLSAqLyAKLQotT01YX0lOVCBhcm1TaWduQ2hlY2sgKAotICAgIE9NWF9TMTYgdmFyCi0pCi0KLXsKLSAgICBPTVhfSU5UIFNpZ247Ci0gICAgCi0gICAgaWYgKHZhciA8IDApCi0gICAgewotICAgICAgICBTaWduID0gLTE7Ci0gICAgfQotICAgIGVsc2UgaWYgKCB2YXIgPiAwKQotICAgIHsKLSAgICAgICAgU2lnbiA9IDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIFNpZ24gPSAwOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gU2lnbjsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtQ2xpcAotICoKLSAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQotICogCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCi0gKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKLSAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKLSAqLyAKLSAKLU9NWF9TMzIgYXJtQ2xpcCAoCi0gICAgT01YX0lOVCBtaW4sCi0gICAgT01YX0lOVCBtYXgsIAotICAgIE9NWF9TMzIgc3JjIAotKQotIAotewotICAgIGlmIChzcmMgPiBtYXgpCi0gICAgewotICAgICAgICBzcmMgPSBtYXg7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNyYyA8IG1pbikKLSAgICB7Ci0gICAgICAgIHNyYyA9IG1pbjsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHNyYzsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtQ2xpcF9GMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKLSAqIAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAotICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCi0gKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfRjMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCi0gKi8gCi0gCi1PTVhfRjMyIGFybUNsaXBfRjMyICgKLSAgICBPTVhfRjMyIG1pbiwKLSAgICBPTVhfRjMyIG1heCwgCi0gICAgT01YX0YzMiBzcmMgCi0pCi0gCi17Ci0gICAgaWYgKHNyYyA+IG1heCkKLSAgICB7Ci0gICAgICAgIHNyYyA9IG1heDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3JjIDwgbWluKQotICAgIHsKLSAgICAgICAgc3JjID0gbWluOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3JjOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TaGlmdFNhdF9GMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjogRGl2aWRlcyBhIGZsb2F0IHZhbHVlIGJ5IDJec2hpZnQgYW5kIAotICogc2F0dXJhdGVzIGl0IGZvciB1bnNpZ25lZCB2YWx1ZSByYW5nZSBmb3Igc2F0Qml0cy4KLSAqIFNlY29uZCBwYXJhbWV0ZXIgaXMgbGlrZSAic2hpZnRpbmciIHRoZSBjb3JyZXNwb25kaW5nIAotICogaW50ZWdlciB2YWx1ZS4gVGFrZXMgY2FyZSBvZiByb3VuZGluZyB3aGlsZSBjbGlwcGluZyB0aGUgZmluYWwgCi0gKiB2YWx1ZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSB2ICAgICAgICAgIE51bWJlciB0byBiZSBvcGVyYXRlZCB1cG9uCi0gKiBbaW5dIHNoaWZ0ICAgICAgRGl2aWRlcyB0aGUgaW5wdXQgInYiIGJ5ICIyXnNoaWZ0IgotICogW2luXSBzYXRCaXRzICAgIEZpbmFsIHJhbmdlIGlzIFswLCAyXnNhdEJpdHMpCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1MzMiAtLSAgIHJldHVybnMgInNoaWZ0ZWQiIHNhdHVyYXRlZCB2YWx1ZQotICovIAotIAotT01YX1UzMiBhcm1TaGlmdFNhdF9GMzIoT01YX0YzMiB2LCBPTVhfSU5UIHNoaWZ0LCBPTVhfSU5UIHNhdEJpdHMpIAotewotICAgIE9NWF9VMzIgYWxsT25lcyA9IChPTVhfVTMyKSgtMSk7Ci0gICAgT01YX1UzMiBtYXhWID0gYWxsT25lcyA+PiAoMzItc2F0Qml0cyk7Ci0gICAgT01YX0YzMiB2U2hpZnRlZCwgdlJvdW5kZWQsIHNoaWZ0RGl2ID0gKE9NWF9GMzIpKDEgPDwgc2hpZnQpOwotICAgIE9NWF9VMzIgdkludDsKLSAgICBPTVhfVTMyIHZJbnRTYXQ7Ci0gICAgCi0gICAgaWYodiA8PSAwKQotICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICB2U2hpZnRlZCA9IHYgLyBzaGlmdERpdjsKLSAgICB2Um91bmRlZCA9IChPTVhfRjMyKSh2U2hpZnRlZCArIDAuNSk7Ci0gICAgdkludCA9IChPTVhfVTMyKXZSb3VuZGVkOwotICAgIHZJbnRTYXQgPSB2SW50OwotICAgIGlmKHZJbnRTYXQgPiBtYXhWKSAKLSAgICAgICAgdkludFNhdCA9IG1heFY7Ci0gICAgcmV0dXJuIHZJbnRTYXQ7Ci19Ci0KLS8qKgotICogRnVuY3Rpb25zOiBhcm1Td2FwRWxlbQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhlc2UgZnVuY3Rpb24gc3dhcHMgdHdvIGVsZW1lbnRzIGF0IHRoZSBzcGVjaWZpZWQgcG9pbnRlciBsb2NhdGlvbnMuCi0gKiBUaGUgc2l6ZSBvZiBlYWNoIGVsZW1lbnQgY291bGQgYmUgYW55dGhpbmcgYXMgc3BlY2lmaWVkIGJ5IDxlbGVtU2l6ZT4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhSZXN1bHQgLS0gRXJyb3Igc3RhdHVzIGZyb20gdGhlIGZ1bmN0aW9uCi0gKi8KLU9NWFJlc3VsdCBhcm1Td2FwRWxlbSgKLSAgICAgICAgT01YX1U4ICpwQnVmMSwKLSAgICAgICAgT01YX1U4ICpwQnVmMiwKLSAgICAgICAgT01YX0lOVCBlbGVtU2l6ZQotICAgICAgICkKLXsKLSAgICBPTVhfSU5UIGk7Ci0gICAgT01YX1U4IHRlbXA7Ci0gICAgYXJtUmV0QXJnRXJySWYoIXBCdWYxIHx8ICFwQnVmMiwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIAotICAgIGZvcihpID0gMDsgaSA8IGVsZW1TaXplOyBpKyspCi0gICAgewotICAgICAgICB0ZW1wID0gKihwQnVmMSArIGkpOwotICAgICAgICAqKHBCdWYxICsgaSkgPSAqKHBCdWYyICsgaSk7Ci0gICAgICAgICoocEJ1ZjIgKyBpKSA9IHRlbXA7Ci0gICAgfQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1NZWRpYW5PZjMKLSAqCi0gKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIG1lZGlhbiBvZiB0aHJlZSBudW1iZXJzCi0gKiAKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gZkVudHJ5ICAgICBGaXJzdCBlbnRyeQotICogW2luXSBzRW50cnkgICAgIHNlY29uZCBlbnRyeQotICogW2luXSB0RW50cnkgICAgIFRoaXJkIGVudHJ5Ci0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1MzMiAtLSAgIHJldHVybnMgdGhlIG1lZGlhbiB2YWx1ZQotICovIAotIAotT01YX1MzMiBhcm1NZWRpYW5PZjMgKAotICAgIE9NWF9TMzIgZkVudHJ5LAotICAgIE9NWF9TMzIgc0VudHJ5LCAKLSAgICBPTVhfUzMyIHRFbnRyeSAKLSkKLXsKLSAgICBPTVhfUzMyIGEsIGIsIGM7Ci0gICAgCi0gICAgYSA9IGFybU1pbiAoZkVudHJ5LCBzRW50cnkpOwotICAgIGIgPSBhcm1NYXggKGZFbnRyeSwgc0VudHJ5KTsKLSAgICBjID0gYXJtTWluIChiLCB0RW50cnkpOwotICAgIHJldHVybiAoYXJtTWF4IChhLCBjKSk7Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUxvZ1NpemUKLSAqCi0gKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIHNpemUgb2YgYSBwb3NpdGl2ZSB2YWx1ZSBhbmQgcmV0dXJucyB0aGUgc2FtZQotICogCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHZhbHVlICAgIFBvc2l0aXZlIHZhbHVlCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1U4IC0tICAgICBSZXR1cm5zIHRoZSBtaW5pbXVtIG51bWJlciBvZiBiaXRzIHJlcXVpcmVkIHRvIHJlcHJlc2VudCB0aGUgcG9zaXRpdmUgdmFsdWUuIAotICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBzbWFsbGVzdCBrPj0wIHN1Y2ggdGhhdCB0aGF0IHZhbHVlIGlzIGxlc3MgdGhhbiAoMTw8aykuCi0gKi8gCi0gCi1PTVhfVTggYXJtTG9nU2l6ZSAoCi0gICAgT01YX1UxNiB2YWx1ZSAKLSkKLXsKLSAgICBPTVhfVTggaTsgICAgCi0gICAgZm9yICggaSA9IDA7IHZhbHVlID4gMDsgdmFsdWUgPSB2YWx1ZSA+PiAxKSAKLSAgICB7Ci0gICAgICAgIGkrKzsKLSAgICB9Ci0gICAgcmV0dXJuIGk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAvKiBTYXR1cmF0aW5nIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqIAotICogICAgCi0gKiovCi0gCi1PTVhfUzMyIGFybVNhdEFkZF9TMzIoT01YX1MzMiBWYWx1ZTEsT01YX1MzMiBWYWx1ZTIpCi17Ci0gICAgT01YX1MzMiBSZXN1bHQ7Ci0gICAgCi0gICAgUmVzdWx0ID0gVmFsdWUxICsgVmFsdWUyOwotCi0gICAgaWYoIChWYWx1ZTFeVmFsdWUyKSA+PSAwKQotICAgIHsKLSAgICAgICAgLypTYW1lIHNpZ24qLwotICAgICAgICBpZiggKFJlc3VsdF5WYWx1ZTEpID49IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBub3Qgc2F0dXJhdGVkKi8KLSAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihWYWx1ZTEgPj0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIHBvc2l0aXZlIHNpZGUqLwotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUFYX1MzMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIG5lZ2F0aXZlIHNpZGUqLwotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUlOX1MzMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIH0KLSAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gUmVzdWx0OwotICAgIH0KLSAgICAKLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1M2NCgpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAotICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAKLSAqICAgIAotICoqLwotIAotT01YX1M2NCBhcm1TYXRBZGRfUzY0KE9NWF9TNjQgVmFsdWUxLE9NWF9TNjQgVmFsdWUyKQotewotICAgIE9NWF9TNjQgUmVzdWx0OwotICAgIAotICAgIFJlc3VsdCA9IFZhbHVlMSArIFZhbHVlMjsKLQotICAgIGlmKCAoVmFsdWUxXlZhbHVlMikgPj0gMCkKLSAgICB7Ci0gICAgICAgIC8qU2FtZSBzaWduKi8KLSAgICAgICAgaWYoIChSZXN1bHReVmFsdWUxKSA+PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKlJlc3VsdCBoYXMgbm90IHNhdHVyYXRlZCovCi0gICAgICAgICAgICByZXR1cm4gUmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoVmFsdWUxID49IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBwb3NpdGl2ZSBzaWRlKi8KLSAgICAgICAgICAgICAgICBSZXN1bHQgPSBPTVhfTUFYX1M2NDsKLSAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gbmVnYXRpdmUgc2lkZSovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NSU5fUzY0OwotICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgfQotICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgfQotICAgIAotfQotCi0vKiogRnVuY3Rpb24gOmFybVNhdFN1Yl9TMzIoKQotICogCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBzdWJzdHJhY3Rpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqIAotICoqLwotCi1PTVhfUzMyIGFybVNhdFN1Yl9TMzIoT01YX1MzMiBWYWx1ZTEsT01YX1MzMiBWYWx1ZTIpCi17Ci0gICAgT01YX1MzMiBSZXN1bHQ7Ci0gICAgCi0gICAgUmVzdWx0ID0gVmFsdWUxIC0gVmFsdWUyOwotCi0gICAgaWYoIChWYWx1ZTFeVmFsdWUyKSA8IDApCi0gICAgewotICAgICAgICAvKk9wcG9zaXRlIHNpZ24qLwotICAgICAgICBpZiggKFJlc3VsdF5WYWx1ZTEpID49IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBub3Qgc2F0dXJhdGVkKi8KLSAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihWYWx1ZTEgPj0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIHBvc2l0aXZlIHNpZGUqLwotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUFYX1MzMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIG5lZ2F0aXZlIHNpZGUqLwotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUlOX1MzMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIH0KLSAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gUmVzdWx0OwotICAgIH0KLSAgICAKLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBNdWx0aXBsaWNhdGlvbiBvZiBWYWx1ZTEgYW5kIFZhbHVlMiBhbmQgc3ViZXNxdWVudCBzYXR1cmF0ZWQKLSAqICAgICBhY2N1bXVsYXRpb24gd2l0aCBNYWMKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICogW2luXSBNYWMgICAgICAgICAgQWNjdW11bGF0b3IKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0TWFjX1MzMihPTVhfUzMyIE1hYyxPTVhfUzE2IFZhbHVlMSxPTVhfUzE2IFZhbHVlMikKLXsKLSAgICBPTVhfUzMyIFJlc3VsdDsKLSAgICAKLSAgICBSZXN1bHQgPSAoT01YX1MzMikoVmFsdWUxKlZhbHVlMik7Ci0gICAgUmVzdWx0ID0gYXJtU2F0QWRkX1MzMiggTWFjICwgUmVzdWx0ICk7Ci0KLSAgICByZXR1cm4gUmVzdWx0OyAgICAKLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MxNlMzMl9TMzIKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgTUFDIG9wZXJhdGlvbiBvZiB0aGUgdGhyZWUgaW5wdXRzIGRlbGF5RWxlbSwgZmlsVGFwICwgbWFjCi0gKgotICogICBtYWMgPSBtYWMgKyBTYXR1cmF0ZV9pbl8zMkJpdHMoZGVsYXlFbGVtICogZmlsVGFwKQotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gZGVsYXlFbGVtICAgIEZpcnN0IDMyIGJpdCBPcGVyYW5kCi0gKiBbaW5dIGZpbFRhcCAgICAgICBTZWNvbmQgMTYgYml0IE9wZXJhbmQKLSAqIFtpbl0gbWFjICAgICAgICAgIFJlc3VsdCBvZiBNQUMgb3BlcmF0aW9uCi0gKgotICogUmV0dXJuOgotICogW291dF0gIG1hYyAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0gCi1PTVhfUzMyIGFybVNhdE1hY19TMTZTMzJfUzMyKE9NWF9TMzIgbWFjLCBPTVhfUzMyIGRlbGF5RWxlbSwgT01YX1MxNiBmaWxUYXAgKQotewotICAgIAotICAgIE9NWF9TMzIgcmVzdWx0OwotCi0gICAgcmVzdWx0ID0gYXJtU2F0TXVsUzE2UzMyX1MzMihmaWxUYXAsZGVsYXlFbGVtKTsgCi0KLSAgICBpZiAoIHJlc3VsdCA+IE9NWF9NQVhfUzE2ICkKLSAgICB7Ci0gICAgICAgIHJlc3VsdCA9IE9NWF9NQVhfUzMyOwotICAgIH0KLSAgICBlbHNlIGlmKCByZXN1bHQgPCBPTVhfTUlOX1MxNiApCi0gICAgewotICAgICAgICByZXN1bHQgPSBPTVhfTUlOX1MzMjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZGVsYXlFbGVtICogZmlsVGFwOwotICAgIH0KLQotICAgIG1hYyA9IGFybVNhdEFkZF9TMzIobWFjLHJlc3VsdCk7Ci0gICAgCi0gICAgcmV0dXJuIG1hYzsKLX0KLQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNgotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJvdW5kZWQgcmlnaHQgc2hpZnQgb3BlcmF0aW9uIG9mIGlucHV0IGJ5IHRoZSBzY2FsZWZhY3RvcgotICoKLSAqICAgb3V0cHV0ID0gU2F0dXJhdGVfaW5fMTZCaXRzKCAoIFJpZ2h0L0xlZnRTaGlmdCggKFJvdW5kKGlucHV0KSAsIHNoaWZ0ICkgKQotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gaW5wdXQgICAgICAgVGhlIGlucHV0IHRvIGJlIG9wZXJhdGVkIG9uCi0gKiBbaW5dIHNoaWZ0IFRoZSBzaGlmdCBudW1iZXIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotCi0KLU9NWF9TMTYgYXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYoT01YX1MzMiBpbnB1dCwgT01YX0lOVCBzaGlmdCkKLXsKLSAgICBpbnB1dCA9IGFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMihpbnB1dCwtc2hpZnQpOwotCi0gICAgaWYgKCBpbnB1dCA+IE9NWF9NQVhfUzE2ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUFYX1MxNjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgPCBPTVhfTUlOX1MxNikKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUlOX1MxNjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICByZXR1cm4gKE9NWF9TMTYpaW5wdXQ7Ci0gICAgfQotCi19Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0Ci0gKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCi0gKiAgICAgCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCi0gKiBbaW5dIFNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLQotT01YX1MzMiBhcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoT01YX1MzMiBWYWx1ZSwgT01YX0lOVCBTaGlmdCkKLXsKLSAgICBPTVhfSU5UIGk7Ci0gICAgCi0gICAgaWYgKFNoaWZ0IDwgMCkKLSAgICB7Ci0gICAgICAgIFNoaWZ0ID0gLVNoaWZ0OwotICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TMzIoVmFsdWUsICgxIDw8IChTaGlmdCAtIDEpKSk7Ci0gICAgICAgIFZhbHVlID0gVmFsdWUgPj4gU2hpZnQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBTaGlmdDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TMzIoVmFsdWUsIFZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVmFsdWU7Ci19Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NCgpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0Ci0gKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAotICogW2luXSBzaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0gCi1PTVhfUzY0IGFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NChPTVhfUzY0IFZhbHVlLCBPTVhfSU5UIFNoaWZ0KQotewotICAgIE9NWF9JTlQgaTsKLSAgICAKLSAgICBpZiAoU2hpZnQgPCAwKQotICAgIHsKLSAgICAgICAgU2hpZnQgPSAtU2hpZnQ7Ci0gICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1M2NChWYWx1ZSwgKChPTVhfUzY0KTEgPDwgKFNoaWZ0IC0gMSkpKTsKLSAgICAgICAgVmFsdWUgPSBWYWx1ZSA+PiBTaGlmdDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFNoaWZ0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1M2NChWYWx1ZSwgVmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBWYWx1ZTsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzE2UzMyX1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMxNiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKLSAqICAgICBpbiBhIFMzMiBjb250YWluZXIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKLSAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotCi0KLU9NWF9TMzIgYXJtU2F0TXVsUzE2UzMyX1MzMihPTVhfUzE2IGlucHV0MSxPTVhfUzMyIGlucHV0MikKLXsKLSAgICBPTVhfUzE2IGhpMixsbzE7Ci0gICAgT01YX1UxNiBsbzI7Ci0gICAgCi0gICAgT01YX1MzMiB0ZW1wMSx0ZW1wMjsKLSAgICBPTVhfUzMyIHJlc3VsdDsKLSAgICAKLSAgICBsbzEgID0gaW5wdXQxOwotCi0gICAgaGkyICA9ICggaW5wdXQyID4+ICAxNiApOwotICAgIGxvMiAgPSAoIChPTVhfVTMyKSggaW5wdXQyIDw8IDE2ICkgPj4gMTYgKTsKLSAgICAKLSAgICB0ZW1wMSA9IGhpMiAqIGxvMTsKLSAgICB0ZW1wMiA9ICggbG8yKiBsbzEgKSA+PiAxNjsKLQotICAgIHJlc3VsdCA9ICBhcm1TYXRBZGRfUzMyKHRlbXAxLHRlbXAyKTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdE11bFMzMlMzMl9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMzIgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCi0gKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCi0gKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLQotT01YX1MzMiBhcm1TYXRNdWxTMzJTMzJfUzMyKE9NWF9TMzIgaW5wdXQxLE9NWF9TMzIgaW5wdXQyKQotewotICAgIE9NWF9TMTYgaGkxLGhpMjsKLSAgICBPTVhfVTE2IGxvMSxsbzI7Ci0gICAgCi0gICAgT01YX1MzMiB0ZW1wMSx0ZW1wMix0ZW1wMzsKLSAgICBPTVhfUzMyIHJlc3VsdDsKLQotICAgIGhpMSAgPSAoIGlucHV0MSA+PiAgMTYgKTsKLSAgICBsbzEgID0gKCAoT01YX1UzMikoIGlucHV0MSA8PCAxNiApID4+IDE2ICk7Ci0KLSAgICBoaTIgID0gKCBpbnB1dDIgPj4gIDE2ICk7Ci0gICAgbG8yICA9ICggKE9NWF9VMzIpKCBpbnB1dDIgPDwgMTYgKSA+PiAxNiApOwotICAgIAotICAgIHRlbXAxID0gICBoaTEgKiBoaTI7Ci0gICAgdGVtcDIgPSAoIGhpMSogbG8yICkgPj4gMTY7Ci0gICAgdGVtcDMgPSAoIGhpMiogbG8xICkgPj4gMTY7Ci0KLSAgICByZXN1bHQgPSBhcm1TYXRBZGRfUzMyKHRlbXAxLHRlbXAyKTsKLSAgICByZXN1bHQgPSBhcm1TYXRBZGRfUzMyKHJlc3VsdCx0ZW1wMyk7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1JbnREaXZBd2F5RnJvbVplcm8oKQotICoKLSAqIERlc2NyaXB0aW9uIDogSW50ZWdlciBkaXZpc2lvbiB3aXRoIHJvdW5kaW5nIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuIAotICogICAgICAgICAgICAgICBIYWxmLWludGVnZXIgdmFsdWVzIGFyZSByb3VuZGVkIGF3YXkgZnJvbSB6ZXJvCi0gKiAgICAgICAgICAgICAgIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLiBGb3IgZXhhbXBsZSAzLy8yIGlzIHJvdW5kZWQgCi0gKiAgICAgICAgICAgICAgIHRvIDIsIGFuZCAtMy8vMiBpcyByb3VuZGVkIHRvIC0yLgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gTnVtICAgICAgICBPcGVyYW5kIDEKLSAqIFtpbl0gRGVubyAgICAgICBPcGVyYW5kIDIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uIGlucHV0MS8vaW5wdXQyCi0gKiAgICAKLSAqKi8KLQotT01YX1MzMiBhcm1JbnREaXZBd2F5RnJvbVplcm8gKE9NWF9TMzIgTnVtLCBPTVhfUzMyIERlbm8pCi17Ci0gICAgT01YX0Y2NCByZXN1bHQ7Ci0gICAgCi0gICAgcmVzdWx0ID0gKChPTVhfRjY0KU51bSkvKChPTVhfRjY0KURlbm8pOwotICAgIAotICAgIGlmIChyZXN1bHQgPj0gMCkKLSAgICB7Ci0gICAgICAgIHJlc3VsdCArPSAwLjU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJlc3VsdCAtPSAwLjU7Ci0gICAgfQotCi0gICAgcmV0dXJuIChPTVhfUzMyKShyZXN1bHQpOwotfQotCi0KLS8qRW5kIG9mIEZpbGUqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fQml0c3RyZWFtLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fQml0c3RyZWFtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZjUzY2EuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1DT01NX0JpdHN0cmVhbS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVmaW5lcyBiaXRzdHJlYW0gZW5jb2RlIGFuZCBkZWNvZGUgZnVuY3Rpb25zIGNvbW1vbiB0byBhbGwgY29kZWNzCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZpeGVkIGJpdCBsZW5ndGggRGVjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Mb29rQWhlYWRCaXRzKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEdldCB0aGUgbmV4dCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtIHdpdGhvdXQgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgTj0xLi4uMzIKLSAqCi0gKiBSZXR1cm5zICBWYWx1ZQotICovCi0KLU9NWF9VMzIgYXJtTG9va0FoZWFkQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKQotewotICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKLSAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OwotICAgIE9NWF9VMzIgVmFsdWU7Ci0KLSAgICBhcm1Bc3NlcnQoT2Zmc2V0Pj0wICYmIE9mZnNldDw9Nyk7Ci0gICAgYXJtQXNzZXJ0KE4+PTEgJiYgTjw9MzIpOwotCi0gICAgLyogUmVhZCBuZXh0IDMyIGJpdHMgZnJvbSBzdHJlYW0gKi8KLSAgICBWYWx1ZSA9IChwQml0U3RyZWFtWzBdIDw8IDI0ICkgfCAoIHBCaXRTdHJlYW1bMV0gPDwgMTYpICB8IChwQml0U3RyZWFtWzJdIDw8IDggKSB8IChwQml0U3RyZWFtWzNdKSA7Ci0gICAgVmFsdWUgPSAoVmFsdWUgPDwgT2Zmc2V0ICkgfCAocEJpdFN0cmVhbVs0XSA+PiAoOC1PZmZzZXQpKTsKLQotICAgIC8qIFJldHVybiBOIGJpdHMgKi8KLSAgICByZXR1cm4gVmFsdWUgPj4gKDMyLU4pOwotfQotCi0KLS8qKgotICogRnVuY3Rpb246IGFybUdldEJpdHMoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUmVhZCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCi0gKiAgICAKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBOPTEuLjMyCi0gKgotICogW291dF0gICAgKnBwQml0U3RyZWFtCi0gKiBbb3V0XSAgICAqcE9mZnNldAotICogUmV0dXJucyAgVmFsdWUKLSAqLwotCi0KLU9NWF9VMzIgYXJtR2V0Qml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKQotewotICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKLSAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OwotICAgIE9NWF9VMzIgVmFsdWU7Ci0gICAgCi0gICAgaWYoTiA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGFybUFzc2VydChPZmZzZXQ+PTAgJiYgT2Zmc2V0PD03KTsKLSAgICBhcm1Bc3NlcnQoTj49MSAmJiBOPD0zMik7Ci0KLSAgICAvKiBSZWFkIG5leHQgMzIgYml0cyBmcm9tIHN0cmVhbSAqLwotICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPDwgMjQgKSB8ICggcEJpdFN0cmVhbVsxXSA8PCAxNikgIHwgKHBCaXRTdHJlYW1bMl0gPDwgOCApIHwgKHBCaXRTdHJlYW1bM10pIDsKLSAgICBWYWx1ZSA9IChWYWx1ZSA8PCBPZmZzZXQgKSB8IChwQml0U3RyZWFtWzRdID4+ICg4LU9mZnNldCkpOwotCi0gICAgLyogQWR2YW5jZSBiaXRzdHJlYW0gcG9pbnRlciBieSBOIGJpdHMgKi8KLSAgICBPZmZzZXQgKz0gTjsKLSAgICAqcHBCaXRTdHJlYW0gPSBwQml0U3RyZWFtICsgKE9mZnNldD4+Myk7Ci0gICAgKnBPZmZzZXQgPSBPZmZzZXQgJiA3OwotCi0gICAgLyogUmV0dXJuIE4gYml0cyAqLwotICAgIHJldHVybiBWYWx1ZSA+PiAoMzItTik7Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUJ5dGVBbGlnbigpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBBbGlnbiB0aGUgcG9pbnRlciAqcHBCaXRTdHJlYW0gdG8gdGhlIG5leHQgYnl0ZSBib3VuZGFyeQotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKgotICogW291dF0gICAgKnBwQml0U3RyZWFtCi0gKiBbb3V0XSAgICAqcE9mZnNldAotICoKLSAqKi8KLSAKLU9NWFZvaWQgYXJtQnl0ZUFsaWduKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLE9NWF9JTlQgKnBPZmZzZXQpCi17Ci0gICAgaWYoKnBPZmZzZXQgPiAwKQotICAgIHsKLSAgICAgICAgKnBwQml0U3RyZWFtICs9IDE7Ci0gICAgICAgICpwT2Zmc2V0ID0gMDsKLSAgICB9ICAgIAotfQotCi0vKiogCi0gKiBGdW5jdGlvbjogYXJtU2tpcEJpdHMoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogU2tpcCBOIGJpdHMgZnJvbSB0aGUgdmFsdWUgYXQgKnBwQml0U3RyZWFtCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIE4KLSAqCi0gKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKgotICoqLwotCi0KLU9NWFZvaWQgYXJtU2tpcEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCxPTVhfSU5UIE4pCi17Ci0gICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKLSAgICBjb25zdCBPTVhfVTggKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07Ci0gICAKLSAgICAvKiBBZHZhbmNlIGJpdHN0cmVhbSBwb2ludGVyIGJ5IE4gYml0cyAqLwotICAgIE9mZnNldCArPSBOOwotICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW0gKyAoT2Zmc2V0Pj4zKTsKLSAgICAqcE9mZnNldCA9IE9mZnNldCAmIDc7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFZhcmlhYmxlIGJpdCBsZW5ndGggRGVjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1VblBhY2tWTEMzMigpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBWYXJpYWJsZSBsZW5ndGggZGVjb2RlIG9mIHZhcmlhYmxlIGxlbmd0aCBzeW1ib2wgKG1heCBzaXplIDMyIGJpdHMpIHJlYWQgZnJvbQotICogdGhlIGJpdCBzdHJlYW0gcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gYXQgKnBPZmZzZXQgYnkgdXNpbmcgdGhlIHRhYmxlCi0gKiBwb2ludGVkIGJ5IHBDb2RlQm9vawotICogCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKnBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBwQ29kZUJvb2sKLSAqIAotICogW291dF0gICAgKnBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKgotICogUmV0dXJucyA6IENvZGUgQm9vayBJbmRleCBpZiBzdWNjZXNzZnVsbC4gCi0gKiAgICAgICAgIDogQVJNX05PX0NPREVCT09LX0lOREVYID0gLTEgaWYgc2VhcmNoIGZhaWxzLgotICoqLwotI2lmbmRlZiBDX09QVElNSVpFRF9JTVBMRU1FTlRBVElPTiAKLQotT01YX1UxNiBhcm1VblBhY2tWTEMzMigKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwT2Zmc2V0LAotICAgIGNvbnN0IEFSTV9WTEMzMiAqcENvZGVCb29rCi0pCi17ICAgIAotICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKLSAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OwotICAgIE9NWF9VMzIgVmFsdWU7Ci0gICAgT01YX0lOVCBJbmRleDsKLSAgICAgICAgCi0gICAgYXJtQXNzZXJ0KE9mZnNldD49MCAmJiBPZmZzZXQ8PTcpOwotCi0gICAgLyogUmVhZCBuZXh0IDMyIGJpdHMgZnJvbSBzdHJlYW0gKi8KLSAgICBWYWx1ZSA9IChwQml0U3RyZWFtWzBdIDw8IDI0ICkgfCAoIHBCaXRTdHJlYW1bMV0gPDwgMTYpICB8IChwQml0U3RyZWFtWzJdIDw8IDggKSB8IChwQml0U3RyZWFtWzNdKSA7Ci0gICAgVmFsdWUgPSAoVmFsdWUgPDwgT2Zmc2V0ICkgfCAocEJpdFN0cmVhbVs0XSA+PiAoOC1PZmZzZXQpKTsKLQotICAgIC8qIFNlYXJjaCB0aHJvdWdoIHRoZSBjb2RlYm9vayAqLyAgICAKLSAgICBmb3IgKEluZGV4PTA7IHBDb2RlQm9vay0+Y29kZUxlbiAhPSAwOyBJbmRleCsrKQotICAgIHsKLSAgICAgICAgaWYgKHBDb2RlQm9vay0+Y29kZVdvcmQgPT0gKFZhbHVlID4+ICgzMiAtIHBDb2RlQm9vay0+Y29kZUxlbikpKQotICAgICAgICB7Ci0gICAgICAgICAgICBPZmZzZXQgICAgICAgPSBPZmZzZXQgKyBwQ29kZUJvb2stPmNvZGVMZW47Ci0gICAgICAgICAgICAqcHBCaXRTdHJlYW0gPSBwQml0U3RyZWFtICsgKE9mZnNldCA+PiAzKSA7Ci0gICAgICAgICAgICAqcE9mZnNldCAgICAgPSBPZmZzZXQgJiA3OwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gSW5kZXg7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgICBwQ29kZUJvb2srKzsKLSAgICB9Ci0KLSAgICAvKiBObyBjb2RlIG1hdGNoIGZvdW5kICovCi0gICAgcmV0dXJuIEFSTV9OT19DT0RFQk9PS19JTkRFWDsKLX0KLQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZpeGVkIGJpdCBsZW5ndGggRW5jb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1QYWNrQml0cwotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAotICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCi0gKiBbaW5dIHBPZmZzZXQgICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAKLSAqICAgICAgICAgICAgICAgICAgICAgIHRvIDcuCi0gKiBbaW5dIGNvZGVXb3JkICAgICAgICBDb2RlIHdvcmQgdGhhdCBuZWVkIHRvIGJlIGluc2VydGVkIGluIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQotICogW2luXSBjb2RlTGVuZ3RoICAgICAgTGVuZ3RoIG9mIHRoZSBjb2RlIHdvcmQgdmFsaWQgcmFuZ2UgMS4uLjMyCi0gKgotICogW291dF0gcHBCaXRTdHJlYW0gICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdIHBCaXRPZmZzZXQgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0gCi1PTVhSZXN1bHQgYXJtUGFja0JpdHMgKAotICAgIE9NWF9VOCAgKipwcEJpdFN0cmVhbSwgCi0gICAgT01YX0lOVCAqcE9mZnNldCwKLSAgICBPTVhfVTMyIGNvZGVXb3JkLCAKLSAgICBPTVhfSU5UIGNvZGVMZW5ndGggCi0pCi17Ci0gICAgT01YX1U4ICAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKLSAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OwotICAgIE9NWF9VMzIgVmFsdWU7Ci0gICAgICAgIAotICAgIC8qIGNoZWNraW5nIGFyZ3VtZW50IHZhbGlkaXR5ICovCi0gICAgYXJtUmV0QXJnRXJySWYoT2Zmc2V0IDwgMCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKE9mZnNldCA+IDcsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihjb2RlTGVuZ3RoIDwgMSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGNvZGVMZW5ndGggPiAzMiwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgLyogUHJlcGFyZSB0aGUgZmlyc3QgYnl0ZSAqLwotICAgIGNvZGVXb3JkID0gY29kZVdvcmQgPDwgKDMyLWNvZGVMZW5ndGgpOwotICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPj4gKDgtT2Zmc2V0KSkgPDwgKDgtT2Zmc2V0KTsKLSAgICBWYWx1ZSA9IFZhbHVlIHwgKGNvZGVXb3JkID4+ICgyNCtPZmZzZXQpKTsKLQotICAgIC8qIFdyaXRlIG91dCB3aG9sZSBieXRlcyAqLwotICAgIHdoaWxlICg4LU9mZnNldCA8PSBjb2RlTGVuZ3RoKQotICAgIHsKLSAgICAgICAgKnBCaXRTdHJlYW0rKyA9IChPTVhfVTgpVmFsdWU7Ci0gICAgICAgIGNvZGVXb3JkICAgPSBjb2RlV29yZCAgPDwgKDgtT2Zmc2V0KTsKLSAgICAgICAgY29kZUxlbmd0aCA9IGNvZGVMZW5ndGggLSAoOC1PZmZzZXQpOwotICAgICAgICBPZmZzZXQgPSAwOwotICAgICAgICBWYWx1ZSA9IGNvZGVXb3JkID4+IDI0OwotICAgIH0KLQotICAgIC8qIFdyaXRlIG91dCBmaW5hbCBwYXJ0aWFsIGJ5dGUgKi8KLSAgICAqcEJpdFN0cmVhbSAgPSAoT01YX1U4KVZhbHVlOwotICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW07Ci0gICAgKnBPZmZzZXQgPSBPZmZzZXQgKyBjb2RlTGVuZ3RoOwotICAgIAotICAgIHJldHVybiAgT01YX1N0c19Ob0VycjsKLX0KLSAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFZhcmlhYmxlIGJpdCBsZW5ndGggRW5jb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1QYWNrVkxDMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBhY2sgYSBWTEMgY29kZSB3b3JkIGludG8gdGhlIGJpdHN0cmVhbQotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtLgotICogW2luXQlwQml0T2Zmc2V0CSAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAKLSAqICAgICAgICAgICAgICAgICAgICAgIHRvIDcuCi0gKiBbaW5dCSBjb2RlICAgICAJCVZMQyBjb2RlIHdvcmQgdGhhdCBuZWVkIHRvIGJlIGluc2VydGVkIGluIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCi0gKgotICogW291dF0gcHBCaXRTdHJlYW0JKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCi0gKgkgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAotICoJCQkJCQlzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqCQkJCQkJY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICoJCQkJCQkqcHBCaXRTdHJlYW0uCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YX1JFU1VMVCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotIAotT01YUmVzdWx0IGFybVBhY2tWTEMzMiAoCi0gICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sIAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgQVJNX1ZMQzMyIGNvZGUgCi0pCi17Ci0gICAgcmV0dXJuIChhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgY29kZS5jb2RlV29yZCwgY29kZS5jb2RlTGVuKSk7Ci19Ci0KLS8qRW5kIG9mIEZpbGUqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX0lEQ1RUYWJsZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX0lEQ1RUYWJsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWQ0YzY3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9JRENUVGFibGUuYworKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1DT01NX0lEQ1RUYWJsZS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDEyMjkwCi0gKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLSAqIAotICogCi0gKiAKLSAqICAgCi0gKiBGaWxlOiBhcm1DT01NX0lEQ1RUYWJsZS5jCi0gKiBCcmllZjogRGVmaW5lcyBUYWJsZXMgdXNlZCBpbiBJRENUIGNvbXB1dGF0aW9uCi0gKgotICovCi0KLSNpbmNsdWRlICJhcm1DT01NX0lEQ1RUYWJsZS5oIgotCi0gICAgIC8qICBUYWJsZSBvZiBzKHUpKkEodSkqQSh2KS8xNiBhdCBRMTUKLSAgICAgICogIHModSk9MS4wIDAgPD0gdSA8PSA1Ci0gICAgICAqICBzKDYpPTIuMAotICAgICAgKiAgcyg3KT00LjAKLSAgICAgICogIEEoMCkgPSAyKnNxcnQoMikKLSAgICAgICogIEEodSkgPSA0KmNvcyh1KnBpLzE2KSAgZm9yICh1IT0wKQotCSAgKi8KLQkgIAotX19hbGlnbig0KSBjb25zdCBPTVhfVTE2IGFybUNPTU1fSURDVFByZVNjYWxlIFs2NF0gPQotewotICAgIDB4NDAwMCwgMHg1OGM1LCAweDUzOWYsIDB4NGI0MiwgMHg0MDAwLCAweDMyNDksIDB4NDU0NiwgMHg0NmExLAotICAgIDB4NThjNSwgMHg3YjIxLCAweDczZmMsIDB4Njg2MiwgMHg1OGM1LCAweDQ1YmYsIDB4NjAxNiwgMHg2MWY4LAotICAgIDB4NTM5ZiwgMHg3M2ZjLCAweDZkNDEsIDB4NjI1NCwgMHg1MzlmLCAweDQxYjMsIDB4NWE4MiwgMHg1YzQ4LAotICAgIDB4NGI0MiwgMHg2ODYyLCAweDYyNTQsIDB4NTg3ZSwgMHg0YjQyLCAweDNiMjEsIDB4NTE3NSwgMHg1MzBkLAotICAgIDB4NDAwMCwgMHg1OGM1LCAweDUzOWYsIDB4NGI0MiwgMHg0MDAwLCAweDMyNDksIDB4NDU0NiwgMHg0NmExLAotICAgIDB4MzI0OSwgMHg0NWJmLCAweDQxYjMsIDB4M2IyMSwgMHgzMjQ5LCAweDI3ODIsIDB4MzY2ZCwgMHgzNzdlLAotICAgIDB4MjJhMywgMHgzMDBiLCAweDJkNDEsIDB4MjhiYSwgMHgyMmEzLCAweDFiMzcsIDB4MjU3ZSwgMHgyNjNhLAotICAgIDB4MTFhOCwgMHgxODdlLCAweDE3MTIsIDB4MTRjMywgMHgxMWE4LCAweDBkZTAsIDB4MTMxZCwgMHgxMzdkICAgIAotfTsKLSAgICAvKiBBYm92ZSBhcnJheSBhcm1DT01NX0lEQ1RQcmVTY2FsZSwgIGluIFEyMyBmb3JtYXQgKi8KLWNvbnN0IE9NWF9VMzIgYXJtQ09NTV9JRENUUHJlU2NhbGVVMzIgWzY0XSA9Ci17Ci0gICAgMHg0MDAwMDAsIDB4NThjNTQzLCAweDUzOWViYSwgMHg0YjQxOGMsIDB4NDAwMDAwLCAweDMyNDhkNCwgMHg0NTQ1ZWEsIDB4NDZhMTU3LAotICAgIDB4NThjNTQzLCAweDdiMjBkOCwgMHg3M2ZiZmMsIDB4Njg2MjE0LCAweDU4YzU0MywgMHg0NWJmMWYsIDB4NjAxNWE1LCAweDYxZjc4YiwKLSAgICAweDUzOWViYSwgMHg3M2ZiZmMsIDB4NmQ0MTNkLCAweDYyNTNhNiwgMHg1MzllYmEsIDB4NDFiMzI4LCAweDVhODI3YSwgMHg1YzQ4NjksCi0gICAgMHg0YjQxOGMsIDB4Njg2MjE0LCAweDYyNTNhNiwgMHg1ODdkZTMsIDB4NGI0MThjLCAweDNiMjBkOCwgMHg1MTc0ZTAsIDB4NTMwZDY5LAotICAgIDB4NDAwMDAwLCAweDU4YzU0MywgMHg1MzllYmEsIDB4NGI0MThjLCAweDQwMDAwMCwgMHgzMjQ4ZDQsIDB4NDU0NWVhLCAweDQ2YTE1NywKLSAgICAweDMyNDhkNCwgMHg0NWJmMWYsIDB4NDFiMzI4LCAweDNiMjBkOCwgMHgzMjQ4ZDQsIDB4Mjc4MjFkLCAweDM2NmQ3MiwgMHgzNzdlNmIsCi0gICAgMHgyMmEyZjUsIDB4MzAwYWQzLCAweDJkNDEzZCwgMHgyOGJhNzAsIDB4MjJhMmY1LCAweDFiMzZiOSwgMHgyNTdkODYsIDB4MjYzOThkLAotICAgIDB4MTFhODU2LCAweDE4N2RlMywgMHgxNzEyMWEsIDB4MTRjMzVhLCAweDExYTg1NiwgMHgwZGRmOWIsIDB4MTMxY2M3LCAweDEzN2NhMgotfTsKLSAgIAotY29uc3QgT01YX1UxNiBhcm1DT01NX0lEQ1RDb2VmIFs0XSA9Ci17Ci0gICAgMHg1YTgyLCAvKiBJbnZTcXJ0MiAqLwotICAgIDB4MzBmYywgLyogU2luUElCeTggKi8KLSAgICAweDc2NDIsIC8qIENvc1BJQnk4ICovCi0gICAgMHgwMDAwICAgIAotfTsKLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9NYXNrVGFibGUuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9NYXNrVGFibGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE2OWExNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fTWFza1RhYmxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1DT01NX01hc2tUYWJsZS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDEyMjkwCi0gKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBNYXNrIFRhYmxlIHRvIG1hc2sgdGhlIGVuZCBvZiBhcnJheS4KLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLQotI2RlZmluZSBNYXNrVGFibGVTaXplIDcyCi0KLWNvbnN0IE9NWF9VMTYgYXJtQ09NTV9xTWFza1RhYmxlMTZbTWFza1RhYmxlU2l6ZV0gPSAKLXsKLSAgICAgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgICAgIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgCi0gICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwgMHgwMDAwLCAKLSAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsCi0gICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGICAgIAotfTsKLQotY29uc3QgT01YX1U4IGFybUNPTU1fcU1hc2tUYWJsZThbTWFza1RhYmxlU2l6ZV0gPSAKLXsKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCi0gICAgICAgIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAotICAgICAgICAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKLSAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCi0gICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAotICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAgCi0gICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsICAKLSAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgCi0gICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYgICAgCi19OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9hcm1WQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9hcm1WQy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDM3YTVkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvYXJtVkMuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEZpbGU6IGFybVZpZGVvLmgKLSAqIEJyaWVmOiBEZWNsYXJlcyBBUEkncy9CYXNpYyBEYXRhIHR5cGVzIHVzZWQgYWNyb3NzIHRoZSBPcGVuTUFYIFZpZGVvIGRvbWFpbgotICoKLSAqLwotCi0KLSNpZm5kZWYgX2FybVZpZGVvX0hfCi0jZGVmaW5lIF9hcm1WaWRlb19IXwotCi0jaW5jbHVkZSAib214VkMuaCIKLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotCi0vKioKLSAqIEFSTSBzcGVjaWZpYyBzdGF0ZSBzdHJ1Y3R1cmUgdG8gaG9sZCBNb3Rpb24gRXN0aW1hdGlvbiBpbmZvcm1hdGlvbi4KLSAqLwotIAotc3RydWN0IG00cDJfTUVTcGVjCi17Ci0gICAgT01YVkNNNFAyTUVQYXJhbXMgTUVQYXJhbXM7Ci0gICAgT01YVkNNNFAyTUVNb2RlICAgTUVNb2RlOwotfTsKLQotc3RydWN0IG00cDEwX01FU3BlYwotewotICAgIE9NWFZDTTRQMTBNRVBhcmFtcyBNRVBhcmFtczsKLSAgICBPTVhWQ000UDEwTUVNb2RlICAgTUVNb2RlOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgbTRwMl9NRVNwZWMgIEFSTVZDTTRQMl9NRVNwZWM7Ci10eXBlZGVmIHN0cnVjdCBtNHAxMF9NRVNwZWMgQVJNVkNNNFAxMF9NRVNwZWM7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9Db21wYXJlTVYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGNvbXBhcmlzaW9uIG9mIG1vdGlvbiB2ZWN0b3JzIGFuZCBTQUQncyB0byBkZWNpZGUgdGhlCi0gKiBiZXN0IE1WIGFuZCBTQUQKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICBtdlggICAgIHggY29vcmRpbmF0ZSBvZiB0aGUgY2FuZGlkYXRlIG1vdGlvbiB2ZWN0b3IKLSAqIFtpbl0gICAgIG12WSAgICAgeSBjb29yZGluYXRlIG9mIHRoZSBjYW5kaWRhdGUgbW90aW9uIHZlY3RvcgotICogW2luXSAgICAgY2FuZFNBRCBDYW5kaWRhdGUgU0FECi0gKiBbaW5dICAgICBiZXN0TVZYIHggY29vcmRpbmF0ZSBvZiB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yCi0gKiBbaW5dICAgICBiZXN0TVZZIHkgY29vcmRpbmF0ZSBvZiB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yCi0gKiBbaW5dICAgICBiZXN0U0FEIGJlc3QgU0FECi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX0lOVCAtLSAxIHRvIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgc2FkIGlzIHRoZSBiZXN0Ci0gKiAgICAgICAgICAgIDAgdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyBOT1QgdGhlIGJlc3QgU0FECi0gKi8KLQotT01YX0lOVCBhcm1WQ000UDJfQ29tcGFyZU1WICgKLSAgICBPTVhfUzE2IG12WCwKLSAgICBPTVhfUzE2IG12WSwKLSAgICBPTVhfSU5UIGNhbmRTQUQsCi0gICAgT01YX1MxNiBiZXN0TVZYLAotICAgIE9NWF9TMTYgYmVzdE1WWSwKLSAgICBPTVhfSU5UIGJlc3RTQUQpOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQUNEQ1ByZWRpY3QKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGFkYXB0aXZlIERDL0FDIGNvZWZmaWNpZW50IHByZWRpY3Rpb24gZm9yIGFuIGludHJhIGJsb2NrLiBQcmlvcgotICogdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHByZWRpY3Rpb24gZGlyZWN0aW9uIChwcmVkRGlyKSBzaG91bGQgYmUgc2VsZWN0ZWQKLSAqIGFzIHNwZWNpZmllZCBpbiBzdWJjbGF1c2UgNy40LjMuMSBvZiBJU08vSUVDIDE0NDk2LTIuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwU3JjRHN0ICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcXVhbnRpemVkIGNvZWZmaWNpZW50IHJlc2lkdWFscyAoUFFGKSBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJsb2NrCi0gKiBbaW5dIHBQcmVkQnVmUm93IHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKLSAqIFtpbl0gcFByZWRCdWZDb2wgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgotICogW2luXSBjdXJRUCAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBjdXJRUAotICogICAgICAgICAgICAgICAgICAgICAgICAgIG1heSBlcXVhbCB0byBwcmVkUVAgZXNwZWNpYWxseSB3aGVuIHRoZSBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgYW5kIHRoZSBwcmVkaWN0b3IgYmxvY2sgYXJlIGluIHRoZSBzYW1lCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jay4KLSAqIFtpbl0gcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCi0gKiBbaW5dIHByZWREaXIgICAgIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKLSAqIFtpbl0gQUNQcmVkRmxhZyAgYSBmbGFnIGluZGljYXRpbmcgaWYgQUMgcHJlZGljdGlvbiBzaG91bGQgYmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtZWQuIEl0IGlzIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyBpbiB0aGUgYml0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIHN5bnRheCBvZiBNUEVHLTQKLSAqIFtpbl0gdmlkZW9Db21wICAgdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2Ugb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSkgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqIFtpbl0gZmxhZyAgICAgICAgVGhpcyBmbGFnIGRlZmluZXMgdGhlIGlmIG9uZSB3YW50cyB0byB1c2UgdGhpcyBmdW5jdGlvbnMgdG8KLSAqICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlIFBRRiAoc2V0IDEsIHByZWRpY3Rpb24pIG9yIFFGIChzZXQgMCwgcmVjb25zdHJ1Y3Rpb24pCi0gKiBbb3V0XSAgICBwUHJlQUNQcmVkaWN0ICAgcG9pbnRlciB0byB0aGUgcHJlZGljdGVkIGNvZWZmaWNpZW50cyBidWZmZXIuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsbGVkIE9OTFkgaWYgaXQgaXMgbm90IE5VTEwKLSAqIFtvdXRdICAgIHBTcmNEc3QgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucwotICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBxdWFudGl6ZWQgY29lZmZpY2llbnRzIChRRikgb2YgdGhlIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jawotICogW291dF0gICAgcFByZWRCdWZSb3cgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyCi0gKiBbb3V0XSAgICBwUHJlZEJ1ZkNvbCBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKLSAqIFtvdXRdICAgIHBTdW1FcnIgICAgIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgc3VtIG9mIHRoZSBkaWZmZXJlbmNlCi0gKiAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIHByZWRpY3RlZCBhbmQgdW5wcmVkaWN0ZWQgY29lZmZpY2llbnRzCi0gKiAgICAgICAgICAgICAgICAgICAgICBJZiB0aGlzIGlzIE5VTEwsIGRvIG5vdCB1cGRhdGUKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9BQ0RDUHJlZGljdCgKLSAgICAgT01YX1MxNiAqIHBTcmNEc3QsCi0gICAgIE9NWF9TMTYgKiBwUHJlQUNQcmVkaWN0LAotICAgICBPTVhfUzE2ICogcFByZWRCdWZSb3csCi0gICAgIE9NWF9TMTYgKiBwUHJlZEJ1ZkNvbCwKLSAgICAgT01YX0lOVCBjdXJRUCwKLSAgICAgT01YX0lOVCBwcmVkUVAsCi0gICAgIE9NWF9JTlQgcHJlZERpciwKLSAgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAotICAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCAgdmlkZW9Db21wLAotICAgICBPTVhfVTggZmxhZywKLSAgICAgT01YX0lOVCAqcFN1bUVycgotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX1NldFByZWREaXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGRldGVjdGluZyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIGJsb2NrSW5kZXggIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIGFzIGRlZmluZWQgaW4gc3ViY2xhdXNlIDYuMS4zLjgsIG9mIElTTy9JRUMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQ5Ni0yLiBGdXJ0aGVybW9yZSwgaW5kZXhlcyA2IHRvIDkgaW5kaWNhdGUgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgYmxvY2tzIHNwYXRpYWxseSBjb3JyZXNwb25kaW5nIHRvIGx1bWluYW5jZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrcyAwIHRvIDMgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4KLSAqIFtpbl0gcENvZWZCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgotICogW2luXSBwUXBCdWYgICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcgotICogW291dF0gICAgcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCi0gKiBbb3V0XSAgICBwcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5Ci0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfU2V0UHJlZERpcigKLSAgICAgT01YX0lOVCBibG9ja0luZGV4LAotICAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKLSAgICAgT01YX1MxNiAqcENvZWZCdWZDb2wsCi0gICAgIE9NWF9JTlQgKnByZWREaXIsCi0gICAgIE9NWF9JTlQgKnByZWRRUCwKLSAgICAgY29uc3QgT01YX1U4ICpwUXBCdWYKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nIGZvciBvbmUgaW50cmEgYmxvY2suCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtCi0gKiBbaW5dIHBCaXRPZmZzZXQgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuCi0gKiBbaW5dIHBRRGN0QmxrQ29lZiAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50Ci0gKiBbaW5dIHByZWREaXIgICAgICAgICBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHppZ3phZyBzY2FuIHBhdHRlcm4uIFRoaXMgdGFrZXMgb25lIG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fTk9ORSAgICAgICAgICBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW4uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIEhvcml6b250YWwgcHJlZGljdGlvbi4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBWZXJ0aWNhbCBwcmVkaWN0aW9uLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KLSAqIFtpbl0gcGF0dGVybiAgICAgICAgIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGJsb2NrIGlzIGVuY29kZWQKLSAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAwdGggZWxlbWVudAotICogICAgICAgICAgICAgICAgICAgICAgb3IgMXN0LgotICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEoCi0gICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCi0gICAgIE9NWF9VOCBwcmVkRGlyLAotICAgICBPTVhfVTggcGF0dGVybiwKLSAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotICAgICBPTVhfVTggc3RhcnQKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludHJhIGNvZGVkIGJsb2NrLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcHBCaXRTdHJlYW0gICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgotICogW2luXSBwQml0T2Zmc2V0ICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAtN10uCi0gKiBbaW5dIHByZWREaXIgICAgICAgICBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgemlnemFnIHNjYW4gcGF0dGVybi4gSXQgdGFrZXMgb25lIG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fTk9ORSAgQUMgcHJlZGljdGlvbiBub3QgdXNlZDsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm0gY2xhc3NpY2FsIHppZ3phZyBzY2FuOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBIb3Jpem9udGFsIHByZWRpY3Rpb247Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm0gYWx0ZXJuYXRlLXZlcnRpY2FsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBWZXJ0aWNhbCBwcmVkaWN0aW9uOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHVzIHBlcmZvcm0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRlLWhvcml6b250YWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCi0gKiBbaW5dIHZpZGVvQ29tcCAgICAgICB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSBvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSkgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KLSAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAwdGggZWxlbWVudAotICogICAgICAgICAgICAgICAgICAgICAgb3IgMXN0LgotICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgotICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCi0gKiBbb3V0XSAgICBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYSgKLSAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLSAgICAgT01YX1MxNiAqIHBEc3QsCi0gICAgIE9NWF9VOCBwcmVkRGlyLAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsIAotICAgICBPTVhfVTggIHN0YXJ0Ci0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgZmlsbGluZyBvZiB0aGUgY29lZmZpY2llbnQgYnVmZmVyIGFjY29yZGluZyB0byB0aGUgcnVuLCBsZXZlbAotICogYW5kIHNpZ24sIGFsc28gdXBkYXRlcyB0aGUgaW5kZXgKLSAqIAotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIHN0b3JlUnVuICAgICAgICBTdG9yZWQgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgICAKLSAqIFtpbl0gIHN0b3JlTGV2ZWwgICAgICBTdG9yZWQgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKQotICogW2luXSAgc2lnbiAgICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyB0aGUgc2lnbiBvZiBsZXZlbAotICogW2luXSAgbGFzdCAgICAgICAgICAgIHN0YXR1cyBvZiB0aGUgbGFzdCBmbGFnCi0gKiBbaW5dICBwSW5kZXggICAgICAgICAgcG9pbnRlciB0byBjb2VmZmljaWVudCBpbmRleCBpbiA4eDggbWF0cml4Ci0gKiBbb3V0XSBwSW5kZXggICAgICAgICAgcG9pbnRlciB0byB1cGRhdGVkIGNvZWZmaWNpZW50IGluZGV4IGluIDh4OCAKLSAqICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXgKLSAqIFtpbl0gIHBaaWd6YWdUYWJsZSAgICBwb2ludGVyIHRvIHRoZSB6aWd6YWcgdGFibGVzCi0gKiBbb3V0XSBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICBibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyKAotICAgIE9NWF9VMzIgc3RvcmVSdW4sCi0gICAgT01YX1MxNiAqIHBEc3QsCi0gICAgT01YX1MxNiBzdG9yZUxldmVsLAotICAgIE9NWF9VOCAgc2lnbiwKLSAgICBPTVhfVTggIGxhc3QsCi0gICAgT01YX1U4ICAqIGluZGV4LAotICAgIGNvbnN0IE9NWF9VOCAqIHBaaWd6YWdUYWJsZQotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0dldFZMQ0JpdHMKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGVzY2FwZSBtb2RlIGRlY2lzaW9uIGJhc2VkIG9uIHRoZSBydW4sIHJ1bissIGxldmVsLCBsZXZlbCsgYW5kIAotICogbGFzdCBjb21iaW5hdGlvbnMuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKgkJCQkJCQkJdGhlIGJpdCBzdHJlYW0KLSAqIFtpbl0JcEJpdE9mZnNldAkJcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqCQkJCQkJCQlieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKLSAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KLSAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAKLSAqICAgICAgICAgICAgICAgICAgICAgIDB0aCBlbGVtZW50IG9yIDFzdC4KLSAqIFtpbi9vdXRdIHBMYXN0ICAgICAgIHBvaW50ZXIgdG8gbGFzdCBzdGF0dXMgZmxhZwotICogW2luXSBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwICAgICAgVGhlIHJ1biB2YWx1ZSBmcm9tIHdoaWNoIGxldmVsIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiBsYXN0ID09IDAKLSAqIFtpbl0gSW5kZXhCZWdpblNpbmdsZUxldmVsRW50cmllc0wwICAgIEFycmF5IGluZGV4IGluIHRoZSBWTEMgdGFibGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGluZyB0byB0aGUgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAKLSAqIFtpbl0gcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMSAgICAgIFRoZSBydW4gdmFsdWUgZnJvbSB3aGljaCBsZXZlbCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogbGFzdCA9PSAxCi0gKiBbaW5dIEluZGV4QmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMSAgICBBcnJheSBpbmRleCBpbiB0aGUgVkxDIHRhYmxlIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRpbmcgdG8gdGhlICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgCi0gKiBbaW5dIHBSdW5JbmRleFRhYmxlTDAgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gcFZsY1RhYmxlTDAgICAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMAotICogW2luXSBwUnVuSW5kZXhUYWJsZUwxICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dIHBWbGNUYWJsZUwxICAgICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gcExNQVhUYWJsZUwwICAgICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSBwTE1BWFRhYmxlTDEgICAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dIHBSTUFYVGFibGVMMCAgICAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dIHBSTUFYVGFibGVMMSAgICAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbb3V0XXBEc3QJCQkgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKLSAqCQkJCQkJCWJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9HZXRWTENCaXRzICgKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotCQkJICBPTVhfUzE2ICogcERzdCwKLQkJCSAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotCQkJICBPTVhfVTggICAgc3RhcnQsCQkJICAKLQkJCSAgT01YX1U4ICAqIHBMYXN0LAotCQkJICBPTVhfVTggICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCwKLQkJCSAgT01YX1U4ICAgIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDAsCi0JCQkgIE9NWF9VOCAgICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSwKLQkJCSAgT01YX1U4ICAgIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwwLAotCQkJICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBaaWd6YWdUYWJsZQotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX1B1dFZMQ0JpdHMKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENoZWNrcyB0aGUgdHlwZSBvZiBFc2NhcGUgTW9kZSBhbmQgcHV0IGVuY29kZWQgYml0cyBmb3IgCi0gKiBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCSBwcEJpdFN0cmVhbSAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotICoJCQkJCQkgIHRoZSBiaXQgc3RyZWFtCi0gKiBbaW5dCSBwQml0T2Zmc2V0ICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNwotICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgotICogW2luXSAgc3RhcnQgICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIDB0aCBlbGVtZW50IG9yIDFzdC4KLSAqIFtpbl0gIG1heFN0b3JlUnVuTDAgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGxhc3QgPSAwCi0gKiBbaW5dICBtYXhTdG9yZVJ1bkwxICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsYXN0ID0gMQotICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpIGZvciBsYXN0ID0gMAotICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpIGZvciBsYXN0ID0gMQotICogW2luXSAgcFJ1bkluZGV4VGFibGVMMCBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gIHBWbGNUYWJsZUwwICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gIHBSdW5JbmRleFRhYmxlTDEgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dICBwVmxjVGFibGVMMSAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dICBwTE1BWFRhYmxlTDAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSAgcExNQVhUYWJsZUwxICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gIHBSTUFYVGFibGVMMCAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSAgcFJNQVhUYWJsZUwxICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbb3V0XSBwUURjdEJsa0NvZWYgICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQKLSAqIFtvdXRdIHBwQml0U3RyZWFtICAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfUHV0VkxDQml0cyAoCi0gICAgICAgICAgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgICAgICAgICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAotICAgICAgICAgICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgICAgICAgICAgIE9NWF9VOCBzdGFydCwKLSAgICAgICAgICAgICAgT01YX1U4IG1heFN0b3JlUnVuTDAsCi0gICAgICAgICAgICAgIE9NWF9VOCBtYXhTdG9yZVJ1bkwxLAotICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wwLAotICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMCwKLQkJCSAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwWmlnemFnVGFibGUKLSk7Ci0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgY2FsY3VsYXRpbmcgdGhlIFZMQyBiaXRzIGRlcGVuZGluZyBvbiB0aGUgZXNjYXBlIHR5cGUgYW5kIGluc2VydCAKLSAqIHRoZSBzYW1lIGluIHRoZSBiaXRzdHJlYW0KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCSBwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKgkgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0IHN0cmVhbQotICogW2luXQkgcEJpdE9mZnNldCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3Ci0gKiBbaW5dICBydW4gICAgICAgICAgICAgICAgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgdG8gYmUgZW5jb2RlZCAgCi0gKiBbaW5dICBsZXZlbCAgICAgICAgICAgICAgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKSB0byBiZSBlbmNvZGVkCi0gKiBbaW5dICBydW5QbHVzICAgICAgICAgICAgQ2FsY3VsYXRlZCBhcyBydW5QbHVzID0gcnVuIC0gKFJNQVggKyAxKSAgCi0gKiBbaW5dICBsZXZlbFBsdXMgICAgICAgICAgQ2FsY3VsYXRlZCBhcyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFBsdXMgPSBzaWduKGxldmVsKSpbYWJzKGxldmVsKSAtIExNQVhdCi0gKiBbaW5dICBmTW9kZSAgICAgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIHRoZSBlc2NhcGUgbW9kZXMKLSAqIFtpbl0gIGxhc3QgICAgICAgICAgICAgICBzdGF0dXMgb2YgdGhlIGxhc3QgZmxhZwotICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgd2lsbCBiZSBlcXVhbCB0byAxOiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQotICogW2luXSAgcFJ1bkluZGV4VGFibGUgICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfdGFibGVzX1ZMQy5oCi0gKiBbaW5dICBwVmxjVGFibGUgICAgICAgICAgVkxDIHRhYmxlIGRlZmluZWQgaW4gYXJtVkNNNFAyX0h1ZmZfdGFibGVzX1ZMQy5oCi0gKiBbb3V0XSBwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldCAgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9GaWxsVkxDQnVmZmVyICgKLSAgICAgICAgICAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotICAgICAgICAgICAgICBPTVhfVTMyIHJ1biwKLSAgICAgICAgICAgICAgT01YX1MxNiBsZXZlbCwgCi0JCQkgIE9NWF9VMzIgcnVuUGx1cywKLSAgICAgICAgICAgICAgT01YX1MxNiBsZXZlbFBsdXMsIAotICAgICAgICAgICAgICBPTVhfVTggIGZNb2RlLAotCQkJICBPTVhfVTggIGxhc3QsCi0gICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzLCAKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqcFJ1bkluZGV4VGFibGUsCi0gICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBlc2NhcGUgbW9kZSBkZWNpc2lvbiBiYXNlZCBvbiB0aGUgcnVuLCBydW4rLCBsZXZlbCwgbGV2ZWwrIGFuZCAKLSAqIGxhc3QgY29tYmluYXRpb25zLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcnVuICAgICAgICAgICAgIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpIHRvIGJlIGVuY29kZWQgIAotICogW2luXSBsZXZlbCAgICAgICAgICAgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKSB0byBiZSBlbmNvZGVkCi0gKiBbaW5dIHJ1blBsdXMgICAgICAgICBDYWxjdWxhdGVkIGFzIHJ1blBsdXMgPSBydW4gLSAoUk1BWCArIDEpICAKLSAqIFtpbl0gbGV2ZWxQbHVzICAgICAgIENhbGN1bGF0ZWQgYXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFBsdXMgPSBzaWduKGxldmVsKSpbYWJzKGxldmVsKSAtIExNQVhdCi0gKiBbaW5dIG1heFN0b3JlUnVuICAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQotICogW2luXSBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAotICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKLSAqICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCi0gKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCi0gKiBbaW5dIHBSdW5JbmRleFRhYmxlICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwotICogICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAKLSAqIFJldHVybiBWYWx1ZToKLSAqIFJldHVybnMgYW4gRXNjYXBlIG1vZGUgd2hpY2ggY2FuIHRha2UgdmFsdWVzIGZyb20gMCB0byAzCi0gKiAwIC0tPiBubyBlc2NhcGUgbW9kZSwgMSAtLT4gZXNjYXBlIHR5cGUgMSwKLSAqIDEgLS0+IGVzY2FwZSB0eXBlIDIsIDMgLS0+IGVzY2FwZSB0eXBlIDMsIGNoZWNrIHNlY3Rpb24gNy40LjEuMwotICogaW4gdGhlIE1QRUcgSVNPIHN0YW5kYXJkLgotICoKLSAqLwotCi1PTVhfVTggYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZSgKLSAgICAgT01YX1UzMiBydW4sCi0gICAgIE9NWF9VMzIgcnVuUGx1cywKLSAgICAgT01YX1MxNiBsZXZlbCwKLSAgICAgT01YX1MxNiBsZXZlbFBsdXMsCi0gICAgIE9NWF9VOCAgbWF4U3RvcmVSdW4sCi0gICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzLAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgIGNvbnN0IE9NWF9VOCAgKnBSdW5JbmRleFRhYmxlCi0pOwotCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIAotICogQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgaGFsZi1waXhlbCB1bml0cywgYW5kIAotICogdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgcmVxdWlyZWQsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2ggdGhlIAotICogaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIGZ1bmN0aW9ucyB0aGF0IGVpdGhlciBnZW5lcmF0ZSBvdXRwdXQgTVZzIG9yIGV4cGVjdCAKLSAqIGlucHV0IE1WcyByZXByZXNlbnRlZCB1c2luZyBpbnRlZ2VyIHBpeGVsIHVuaXRzLiAKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBTcmNSZWZCdWYJCXBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSBNQiB0aGF0IAotICogICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICAgICAgICAgIHBsYW5lLgotICogW2luXQlyZWZXaWR0aAkJICB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lCi0gKiBbaW5dCXBSZWZSZWN0CQkgIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlY3Rhbmd1bGFyIGluIHJlZmVyZW5jZSBwbGFuZS4gUmVsYXRpdmUgdG8gaW1hZ2Ugb3JpZ2luLiAKLSAqICAgICAgICAgICAgICAgICAgICBJdCdzIG5vdCBsaW1pdGVkIHRvIHRoZSBpbWFnZSBib3VuZGFyeSwgYnV0IGRlcGVuZGVkIG9uIHRoZSBwYWRkaW5nLiBGb3IgZXhhbXBsZSwgCi0gKiAgICAgICAgICAgICAgICAgICAgaWYgeW91IHBhZCA0IHBpeGVscyBvdXRzaWRlIHRoZSBpbWFnZSBib3JkZXIsIHRoZW4gdGhlIHZhbHVlIGZvciBsZWZ0IGJvcmRlciAKLSAqICAgICAgICAgICAgICAgICAgICBjYW4gYmUgLTQKLSAqIFtpbl0JcFNyY0N1cnJCdWYJCXBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAKLSAqICAgICAgICAgICAgICAgICAgICAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCi0gKiBbaW5dIHBDdXJyUG9pbnRQb3MJcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZQotICogW2luXSBwU3JjUHJlTVYJCSAgcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gcHJlZGljdGVkIE1WCi0gKiBbaW5dIHBTcmNQcmVTQUQJCXBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIGJ5IHBTcmNQcmVNVikKLSAqIFtpbl0gc2VhcmNoUmFuZ2UJCXNlYXJjaCByYW5nZSBmb3IgMTZYMTYgaW50ZWdlciBibG9jayx0aGUgdW5pdHMgb2YgaXQgaXMgZnVsbCBwaXhlbCx0aGUgc2VhcmNoIHJhbmdlIAotICogICAgICAgICAgICAgICAgICAgIGlzIHRoZSBzYW1lIGluIGFsbCBkaXJlY3Rpb25zLkl0IGlzIGluIGluY2x1c2l2ZSBvZiB0aGUgYm91bmRhcnkgYW5kIHNwZWNpZmllZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzLgotICogW2luXSBwTUVTcGVjCQkJICB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKLSAqICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nIAotICogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLgotICogW2luXSBCbG9ja1NpemUgICAgIE1hY3JvQmxvY2sgU2l6ZSBpLmUgZWl0aGVyIDE2eDE2IG9yIDh4OC4KLSAqIFtvdXRdCXBEc3RNVgkJCXBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WCi0gKiBbb3V0XQlwRHN0U0FECQkJcG9pbnRlciB0byBtaW5pbXVtIFNBRAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgqEMgbm8gZXJyb3IuCi0gKiBPTVhfU3RzX0JhZEFyZ0VyciCoQyBiYWQgYXJndW1lbnRzCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyKAotICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAotICAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAotICAgICB2b2lkICpwTUVTcGVjLAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAotICAgICBPTVhfSU5UICpwRHN0U0FELAotICAgICBPTVhfVTggQmxvY2tTaXplCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiAgUmV0dXJucyB0aGUgZXN0aW1hdGVkIAotICogbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIHRoZSBoYWxmLXBpeGVsIAotICogbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIAotICogYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIHRoZSBpbml0aWFsIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIAotICogZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIHBTcmNSZWZCdWYgYW5kIHBTZWFyY2hQb2ludFJlZlBvcyBzaG91bGQgYmUgCi0gKiBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIDE2eDE2IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzE2eDE2LiAgCi0gKiBUaGUgZnVuY3Rpb24gQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyY1JlZkJ1ZgkJcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIAotICogICAgICAgICAgICAgICAgICAgIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgdGhlCWN1cnJlbnQgcGxhbmUuCi0gKiBbaW5dCXJlZldpZHRoCQkgIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUKLSAqIFtpbl0JcFJlZlJlY3QJCSAgcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUKLSAqIFtpbl0JcFNyY0N1cnJCdWYJCXBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAKLSAqICAgICAgICAgICAgICAgICAgICAobGluZWFyIGFycmF5LCAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogW2luXQlwU2VhcmNoUG9pbnRSZWZQb3MJcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIHNlYXJjaCAoc3BlY2lmaWVkIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuCi0gKiBbaW5dCXJuZFZhbAkJCSAgcm91bmRpbmcgY29udHJvbCBiaXQgZm9yIGhhbGYgcGl4ZWwgbW90aW9uIGVzdGltYXRpb247IAotICogICAgICAgICAgICAgICAgICAgIDA9cm91bmRpbmcgY29udHJvbCBkaXNhYmxlZDsgMT1yb3VuZGluZyBjb250cm9sIGVuYWJsZWQKLSAqIFtpbl0JcFNyY0RzdE1WCQlwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIGR1cmluZyBhIHByaW9yIAotICogICAgICAgICAgICAgICAgICAxNlgxNiBpbnRlZ2VyIHNlYXJjaCBhbmQgaXRzIHVuaXQgaXMgaGFsZiBwaXhlbC4KLSAqIFtpbl0gQmxvY2tTaXplICAgICBNYWNyb0Jsb2NrIFNpemUgaS5lIGVpdGhlciAxNngxNiBvciA4eDguCi0gKiBbb3V0XXBTcmNEc3RNVgkJcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKLSAqIFtvdXRdcERzdFNBRAkJCXBvaW50ZXIgdG8gbWluaW11bSBTQUQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfU3RzX05vRXJyIKhDIG5vIGVycm9yCi0gKiBPTVhfU3RzX0JhZEFyZ0VyciCoQyBiYWQgYXJndW1lbnRzCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmKAotICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCi0gICAgIE9NWF9JTlQgcm5kVmFsLAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAotICAgICBPTVhfSU5UICpwRHN0U0FELAotICAgICBPTVhfVTggQmxvY2tTaXplCi0pOwotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX1BhZE1WCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBtb3Rpb24gdmVjdG9yIHBhZGRpbmcgZm9yIGEgbWFjcm9ibG9jay4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBTcmNEc3RNViAgICAgICBwb2ludGVyIHRvIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIG9mIHRoZSBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2sKLSAqIFtpbl0gcFRyYW5zcCAgICAgICAgIHBvaW50ZXIgdG8gdHJhbnNwYXJlbnQgc3RhdHVzIGJ1ZmZlciBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrCi0gKiBbb3V0XSAgICBwU3JjRHN0TVYgICAgICAgcG9pbnRlciB0byBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpbiB3aGljaCB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uIHZlY3RvcnMgaGF2ZSBiZWVuIHBhZGRlZAotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfUGFkTVYoCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICogcFNyY0RzdE1WLAotICAgICBPTVhfVTggKiBwVHJhbnNwCi0pOwotCi0vKiAKLSAqIEguMjY0IFNwZWNpZmljIERlY2xhcmF0aW9ucyAKLSAqLwotLyogRGVmaW5lcyAqLwotI2RlZmluZSBBUk1fTTRQMTBfUV9PRkZTRVQgICAgICAgICgxNSkKLQotCi0vKiBEZXF1YW50IHRhYmxlcyAqLwotCi1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0WzE2XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDJbNF07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfVk1hdHJpeFs2XVszXTsKLWV4dGVybiBjb25zdCBPTVhfVTMyIGFybVZDTTRQMTBfTUZNYXRyaXhbNl1bM107Ci0KLQotLyoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtIHRoZSB3b3JrIHJlcXVpcmVkIGJ5IHRoZSBPcGVuTUFYCi0gKiBEZWNvZGVDb2VmZnNUb1BhaXIgZnVuY3Rpb24gYW5kIERlY29kZUNocm9tYURDQ29lZmZzVG9QYWlyLgotICogU2luY2UgbW9zdCBvZiB0aGUgY29kZSBpcyBjb21tb24gd2Ugc2hhcmUgaXQgaGVyZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyCi0gKiBbaW5dCXBPZmZzZXQJCQlQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0KLSAqIFtpbl0Jc01heE51bUNvZWZmCU1heGltdW0gbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpbiBjdXJyZW50Ci0gKgkJCQkJCQkJYmxvY2sgKDQsMTUgb3IgMTYpCi0gKiBbaW5dCW5UYWJsZSAgICAgICAgICBUYWJsZSBudW1iZXIgKDAgdG8gNCkgYWNjb3JkaW5nIHRvIHRoZSBmaXZlIGNvbHVtbnMKLSAqICAgICAgICAgICAgICAgICAgICAgIG9mIFRhYmxlIDktNSBpbiB0aGUgSC4yNjQgc3BlYwotICogW291dF0JcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAotICogW291dF0JcE9mZnNldAkJCSpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCi0gKiBbb3V0XQlwTnVtQ29lZmYJCVBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbgotICoJCQkJCQkJCXRoaXMgYmxvY2sKLSAqIFtvdXRdCXBwUG9zQ29lZmJ1ZglEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbAotICoJCQkJCQkJCWNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKAotICAgICBjb25zdCBPTVhfVTgqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX1MzMiogcE9mZnNldCwKLSAgICAgT01YX1U4KiBwTnVtQ29lZmYsCi0gICAgIE9NWF9VOCoqcHBQb3NDb2VmYnVmLAotICAgICBPTVhfSU5UIG5UYWJsZSwKLSAgICAgT01YX0lOVCBzTWF4TnVtQ29lZmYgICAgICAgIAotICk7Ci0KLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm0gREMgc3R5bGUgaW50cmEgcHJlZGljdGlvbiwgYXZlcmFnaW5nIHVwcGVyIGFuZCBsZWZ0IGJsb2NrCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyY0xlZnQJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBsZWZ0IGNvZWZmaWNpZW50czoKLSAqCQkJCQkJCQlwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKQotICogW2luXQlwU3JjQWJvdmUJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBhYm92ZSBjb2VmZmljaWVudHM6Ci0gKgkJCQkJCQkJcFt4LHldICh4ID0gMC4uMywgeSA9IC0xKQotICogW2luXQlsZWZ0U3RlcAkJU3RlcCBvZiBsZWZ0IGNvZWZmaWNpZW50IGJ1ZmZlcgotICogW2luXQlkc3RTdGVwCQkJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCi0gKiBbaW5dCWF2YWlsYWJpbGl0eQlOZWlnaGJvcmluZyAxNngxNiBNQiBhdmFpbGFiaWxpdHkgZmxhZwotICogW291dF0JcERzdAkJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE5vbmUKLSAqLwotCi12b2lkIGFybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQoCi0gICAgIGNvbnN0IE9NWF9VOCogcFNyY0xlZnQsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAotICAgICBPTVhfVTgqIHBEc3QsCi0gICAgIE9NWF9JTlQgbGVmdFN0ZXAsCi0gICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkgICAgICAgIAotKTsKLQotLyoKLSAqIERlc2NyaXB0aW9uCi0gKiBVbnBhY2sgYSA0eDQgYmxvY2sgb2YgY29lZmZpY2llbnQtcmVzaWR1YWwgcGFpciB2YWx1ZXMKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcFNyYwlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyCi0gKgkJCQkJCWJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKLSAqIFtvdXRdCXBwU3JjCSpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jawotICogW291dF0JcERzdAlQb2ludGVyIHRvIHVucGFja2VkIDR4NCBibG9jawotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NCgKLSAgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCi0gICAgIE9NWF9TMTYqIHBEc3QKLSk7Ci0KLS8qCi0gKiBEZXNjcmlwdGlvbgotICogVW5wYWNrIGEgMngyIGJsb2NrIG9mIGNvZWZmaWNpZW50LXJlc2lkdWFsIHBhaXIgdmFsdWVzCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBTcmMJRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpcgotICoJCQkJCQlidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCi0gKiBbb3V0XQlwcFNyYwkqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sKLSAqIFtvdXRdCXBEc3QJUG9pbnRlciB0byB1bnBhY2tlZCA0eDQgYmxvY2sKLSAqLwotCi12b2lkIGFybVZDTTRQMTBfVW5wYWNrQmxvY2syeDIoCi0gICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAotICAgICBPTVhfUzE2KiBwRHN0Ci0pOwotCi0vKgotICogRGVzY3JpcHRpb24KLSAqIERlYmxvY2sgb25lIGJvdW5kYXJ5IHBpeGVsCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFEwICAgICAgICAgUG9pbnRlciB0byBwaXhlbCBxMAotICogW2luXSBTdGVwICAgICAgICBTdGVwIGJldHdlZW4gcGl4ZWxzIHEwIGFuZCBxMQotICogW2luXSB0QzAgICAgICAgICBFZGdlIHRocmVzaG9sZCB2YWx1ZQotICogW2luXSBhbHBoYSAgICAgICBhbHBoYSB0aHJlc2hvbGQgdmFsdWUKLSAqIFtpbl0gYmV0YSAgICAgICAgYmV0YSB0aHJlc2hvbGQgdmFsdWUKLSAqIFtpbl0gYlMgICAgICAgICAgZGVibG9ja2luZyBzdHJlbmd0aAotICogW2luXSBDaHJvbWFGbGFnICBUcnVlIGZvciBjaHJvbWEgYmxvY2tzCi0gKiBbb3V0XSBwUTAgICAgICAgIERlYmxvY2tlZCBwaXhlbHMKLSAqIAotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwoCi0gICAgT01YX1U4ICpwUTAsICAgIC8qIHBvaW50ZXIgdG8gdGhlIHBpeGVsIHEwICovCi0gICAgaW50IFN0ZXAsICAgICAgIC8qIHN0ZXAgYmV0d2VlbiBwaXhlbHMgcTAgYW5kIHExICovCi0gICAgaW50IHRDMCwgICAgICAgIC8qIGVkZ2UgdGhyZXNob2xkIHZhbHVlICovCi0gICAgaW50IGFscGhhLCAgICAgIC8qIGFscGhhICovCi0gICAgaW50IGJldGEsICAgICAgIC8qIGJldGEgKi8KLSAgICBpbnQgYlMsICAgICAgICAgLyogZGVibG9ja2luZyBzdHJlbmd0aCAqLwotICAgIGludCBDaHJvbWFGbGFnCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGhvcml6b250YWwgMS8yLXBlbCBwb3NpdGlvbnMKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqCVtpbl0JcFNyYwkJCVBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCi0gCQkJCQkJCQkJCQkJCWluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCi0gKglbaW5dCWlTcmNTdGVwCVN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gKglbaW5dCWlEc3RTdGVwCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KLSAqCVtpbl0JaVdpZHRoCQlXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jawotICoJW2luXQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqCVtvdXRdCXBEc3QJICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAxLzItcGVsIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEoCi0gICAgICAgIGNvbnN0IE9NWF9VOCoJCXBTcmMsIAotCQlPTVhfVTMyIAlpU3JjU3RlcCwgCi0JCU9NWF9VOCogCXBEc3QsIAotCQlPTVhfVTMyIAlpRHN0U3RlcCwgCi0JCU9NWF9VMzIgCWlXaWR0aCwgCi0JCU9NWF9VMzIgCWlIZWlnaHQKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIHZlcnRpY2FsIDEvMi1wZWwgcG9zaXRpb25zIAotICogYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uCi0gKgotICogUmVtYXJrczoKLSAqCi0gKglbaW5dCXBTcmMJCQlQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAotICoJCQkJCQkJCQkJCQlpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQotICoJW2luXQlpU3JjU3RlcAlTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgotICoJW2luXQlpRHN0U3RlcAlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCi0gKglbaW5dCWlXaWR0aAkJV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqCVtpbl0JaUhlaWdodAkJSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKglbb3V0XQlwRHN0ICAgIAlQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgMS8yLXBlbAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEoCQotCSBjb25zdCBPTVhfVTgqIAlwU3JjLCAKLQkgT01YX1UzMiAJaVNyY1N0ZXAsIAotIAkgT01YX1U4KiAJcERzdCwKLSAJIE9NWF9VMzIgCWlEc3RTdGVwLCAKLSAJIE9NWF9VMzIgCWlXaWR0aCwgCi0gCSBPTVhfVTMyIAlpSGVpZ2h0Ci0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYQotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgKDEvMiwgMS8yKSAgcG9zaXRpb25zIAotICogYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiAgW2luXSAgICBwU3JjICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAotICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKLSAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCi0gKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW291dF0gICBwRHN0ICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgKDEvMiwxLzIpLXBlbAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hKCAgCi0gICAgICAgIGNvbnN0IE9NWF9VOCogICAgIHBTcmMsIAotICAgICAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwgCi0gICAgICAgIE9NWF9VOCogICAgIHBEc3QsIAotICAgICAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwKLSAgICAgICAgT01YX1UzMiAgICAgaVdpZHRoLCAKLSAgICAgICAgT01YX1UzMiAgICAgaUhlaWdodAotKTsKLQotLyoKLSAqIERlc2NyaXB0aW9uOgotICogVHJhbnNmb3JtIFJlc2lkdWFsIDR4NCBDb2VmZmljaWVudHMKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgcFNyYwkJU291cmNlIDR4NCBibG9jawotICogW291dF0gcERzdAkJRGVzdGluYXRpb24gNHg0IGJsb2NrCi0gKgotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NChPTVhfUzE2KiBwRHN0LCBPTVhfUzE2ICpwU3JjKTsKLQotLyoKLSAqIERlc2NyaXB0aW9uOgotICogRm9yd2FyZCBUcmFuc2Zvcm0gUmVzaWR1YWwgNHg0IENvZWZmaWNpZW50cwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBwU3JjCQlTb3VyY2UgNHg0IGJsb2NrCi0gKiBbb3V0XSBwRHN0CQlEZXN0aW5hdGlvbiA0eDQgYmxvY2sKLSAqCi0gKi8KLQotdm9pZCBhcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0KE9NWF9TMTYqIHBEc3QsIE9NWF9TMTYgKnBTcmMpOwotCi1PTVhfSU5UIGFybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WICgKLSAgICBPTVhfUzE2ICBtdlgsCi0gICAgT01YX1MxNiAgbXZZLAotICAgIE9NWFZDTW90aW9uVmVjdG9yIGRpZmZNViwgCi0gICAgT01YX0lOVCBjYW5kU0FELCAKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqYmVzdE1WLCAKLSAgICBPTVhfVTMyIG5MYW1kYSwKLSAgICBPTVhfUzMyICpwQmVzdENvc3QpOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ0NPTU1fU0FECi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZSB0aGUgU0FEIGZvciBOeE0gYmxvY2tzLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogW2luXQkJcFNyY09yZwkJUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2sKLSAqIFtpbl0JCWlTdGVwT3JnCVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcgotICogW2luXQkJcFNyY1JlZgkJUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrCi0gKiBbaW5dCQlpU3RlcFJlZglTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyCi0gKiBbaW5dCQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGJsb2NrCi0gKiBbaW5dCQlpV2lkdGgJCVdpZHRoIG9mIHRoZSBibG9jawotICogW291dF0JcERzdFNBRAkJUG9pbnRlciBvZiByZXN1bHQgU0FECi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotT01YUmVzdWx0IGFybVZDQ09NTV9TQUQoCQotCWNvbnN0IE9NWF9VOCogCXBTcmNPcmcsCi0JT01YX1UzMiAJaVN0ZXBPcmcsCi0JY29uc3QgT01YX1U4KiAJcFNyY1JlZiwKLQlPTVhfVTMyIAlpU3RlcFJlZiwKLQlPTVhfUzMyKglwRHN0U0FELAotCU9NWF9VMzIJCWlIZWlnaHQsCi0JT01YX1UzMgkJaVdpZHRoKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNDT01NX0F2ZXJhZ2UKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gYmxvY2tzIGFuZCBzdG9yZXMgdGhlIHJlc3VsdC4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqCVtpbl0JcFByZWQwCQkJUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwCi0gKglbaW5dCXBQcmVkMQkJCVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMQotICoJW2luXQlpUHJlZFN0ZXAwCSAgICBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwCi0gKglbaW5dCWlQcmVkU3RlcDEJICAgIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEKLSAqCVtpbl0JaURzdFN0ZXAgCQlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLSAqCVtpbl0JaVdpZHRoCQkJV2lkdGggb2YgdGhlIGJsb2NrcwotICoJW2luXQlpSGVpZ2h0CQkJSGVpZ2h0IG9mIHRoZSBibG9ja3MKLSAqCVtvdXRdCXBEc3RQcmVkCQlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi0gT01YUmVzdWx0IGFybVZDQ09NTV9BdmVyYWdlICgKLQkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMCwKLQkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMSwJCi0JIE9NWF9VMzIJCWlQcmVkU3RlcDAsCi0JIE9NWF9VMzIJCWlQcmVkU3RlcDEsCi0JIE9NWF9VOCoJCXBEc3RQcmVkLAotCSBPTVhfVTMyCQlpRHN0U3RlcCwgCi0JIE9NWF9VMzIJCWlXaWR0aCwKLQkgT01YX1UzMgkJaUhlaWdodAotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9TQURRdWFyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSAKLSAqIGF2ZXJhZ2Ugb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKQotICoKLSAqIFJlbWFya3M6Ci0gKgotICogW2luXQkJcFNyYwkJCQlQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jawotICogW2luXQkJcFNyY1JlZjAJCVBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAKLSAqIFtpbl0JCXBTcmNSZWYxCQlQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxCi0gKiBbaW5dCQlpU3JjU3RlcCAJCVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcgotICogW2luXQkJaVJlZlN0ZXAwCQlTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogW2luXQkJaVJlZlN0ZXAxIAlTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogW2luXQkJaUhlaWdodAkJCUhlaWdodCBvZiB0aGUgYmxvY2sKLSAqIFtpbl0JCWlXaWR0aAkJCVdpZHRoIG9mIHRoZSBibG9jawotICogW291dF0JcERzdFNBRAkJCVBvaW50ZXIgb2YgcmVzdWx0IFNBRAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLU9NWFJlc3VsdCBhcm1WQ000UDEwX1NBRFF1YXIoCi0JY29uc3QgT01YX1U4KiAJcFNyYywKLSAgICBjb25zdCBPTVhfVTgqIAlwU3JjUmVmMCwKLQljb25zdCBPTVhfVTgqIAlwU3JjUmVmMSwJCi0gICAgT01YX1UzMiAJaVNyY1N0ZXAsCi0gICAgT01YX1UzMgkJaVJlZlN0ZXAwLAotICAgIE9NWF9VMzIJCWlSZWZTdGVwMSwKLSAgICBPTVhfVTMyKglwRHN0U0FELAotICAgIE9NWF9VMzIgICAgIGlIZWlnaHQsCi0gICAgT01YX1UzMiAgICAgaVdpZHRoCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBjaHJvbWEgY29tcG9uZW50cy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqICBbaW5dICAgIHBTcmMgICAgICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGUgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKLSAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCi0gKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBkeCAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgdW5pdCAoMH43KSAKLSAqICBbaW5dICAgIGR5ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgdW5pdCAoMH43KQotICogIFtvdXRdICAgcERzdCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotIE9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYSgKLSAgICAgICAgT01YX1U4ICAgICAgKnBTcmMsCi0gICAgICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLAotICAgICAgICBPTVhfVTggICAgICAqcERzdCwKLSAgICAgICAgT01YX1UzMiAgICAgaURzdFN0ZXAsCi0gICAgICAgIE9NWF9VMzIgICAgIGlXaWR0aCwKLSAgICAgICAgT01YX1UzMiAgICAgaUhlaWdodCwKLSAgICAgICAgT01YX1UzMiAgICAgZHgsCi0gICAgICAgIE9NWF9VMzIgICAgIGR5Ci0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgbHVtYSBjb21wb25lbnRzLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogIFtpbl0gICAgcFNyYyAgICAgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZSBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQotICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbaW5dICAgIGR4ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0ICgwfjMpIAotICogIFtpbl0gICAgZHkgICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0ICgwfjMpIAotICogIFtvdXRdICAgcERzdCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotCi0gT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYSgKLSAgICAgY29uc3QgT01YX1U4ICAgICAqcFNyYywKLSAgICAgT01YX1UzMiAgICBpU3JjU3RlcCwKLSAgICAgT01YX1U4ICAgICAqcERzdCwKLSAgICAgT01YX1UzMiAgICBpRHN0U3RlcCwKLSAgICAgT01YX1UzMiAgICBpV2lkdGgsCi0gICAgIE9NWF9VMzIgICAgaUhlaWdodCwKLSAgICAgT01YX1UzMiAgICBkeCwKLSAgICAgT01YX1UzMiAgICBkeQotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogb214VkNIMjY0X0RlcXVhbnRUcmFuc2Zvcm1BQ0Zyb21QYWlyX1U4X1MxNl9DMV9ETHgKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFJlY29uc3RydWN0IHRoZSA0eDQgcmVzaWR1YWwgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwKLSAqIHBlcmZvcm0gZGVxdWFudGlzYXRpb24gYW5kIGludGVnZXIgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiBmb3IgNHg0IGJsb2NrIG9mCi0gKiByZXNpZHVhbHMgYW5kIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSBibG9jay4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwU3JjCQlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbgotICoJCQkJCQkJcGFpciBidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCi0gKiBbaW5dCXBEQwkJCVBvaW50ZXIgdG8gdGhlIERDIGNvZWZmaWNpZW50IG9mIHRoaXMgYmxvY2ssIE5VTEwKLSAqCQkJCQkJCWlmIGl0IGRvZXNuJ3QgZXhpc3QKLSAqIFtpbl0JUVAJCQlRdWFudGl6YXRpb24gcGFyYW1ldGVyCi0gKiBbaW5dIEFDICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyBpZiBhdCBsZWFzdCBvbmUgbm9uLXplcm8gY29lZmZpY2llbnQgZXhpc3RzCi0gKiBbb3V0XQlwRHN0CQlwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBibG9jayBkYXRhCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybUFDRnJvbVBhaXJfVThfUzE2X0MxX0RMeCgKLSAgICAgT01YX1U4ICoqcHBTcmMsCi0gICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgIE9NWF9JTlQgUVAsCi0gICAgIE9NWF9TMTYqIHBEQywKLSAgICAgaW50IEFDCi0pOwotCi0jZW5kaWYgIC8qX2FybVZpZGVvX0hfKi8KLQotLypFbmQgb2YgRmlsZSovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvYXJtVkNDT01NX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvYXJtVkNDT01NX3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZjMmEzYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL2FybVZDQ09NTV9zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNDT01NX3MuaAotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLTsvLyBBUk0gb3B0aW1pemVkIE9wZW5NQVggQUMgaGVhZGVyIGZpbGUKLTsvLyAKLTsvLyBGb3JtdWxhIHVzZWQ6Ci07Ly8gTUFDUk8gZm9yIGNhbGN1bGF0aW5nIG1lZGlhbiBmb3IgdGhyZWUgdmFsdWVzLgotCi0KLQotICAgIElGIDpMTk9UOjpERUY6QVJNVkNDT01NX1NfSAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgTV9WQVJJQU5UUyAgICAgIENvcnRleEE4LCBBUk0xMTM2SlMKLSAgICAKLSAgICBJRiBBUk0xMTM2SlMgOkxPUjogQ29ydGV4QTggCi0gICAgIAotICAgICA7Ly8vKgotICAgICA7Ly8gKiBNYWNybzogTV9NRURJQU4zCi0gICAgIDsvLyAqCi0gICAgIDsvLyAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgbWVkaWFuIG9mIHRocmVlIG51bWJlcnMKLSAgICAgOy8vICogCi0gICAgIDsvLyAqIFJlbWFya3M6Ci0gICAgIDsvLyAqCi0gICAgIDsvLyAqIFBhcmFtZXRlcnM6Ci0gICAgIDsvLyAqIFtpbl0geCAgICAgRmlyc3QgZW50cnkgZm9yIHRoZSBsaXN0IG9mIHRocmVlIG51bWJlcnMuCi0gICAgIDsvLyAqIFtpbl0geSAgICAgU2Vjb25kIGVudHJ5IGZvciB0aGUgbGlzdCBvZiB0aHJlZSBudW1iZXJzLgotICAgICA7Ly8gKiAgICAgICAgICAgIElucHV0IHZhbHVlIG1heSBiZSBjb3JydXB0ZWQgYXQgdGhlIGVuZCBvZgotICAgICA7Ly8gKiAgICAgICAgICAgIHRoZSBleGVjdXRpb24gb2YgdGhpcyBtYWNyby4KLSAgICAgOy8vICogW2luXSB6ICAgICBUaGlyZCBlbnRyeSBvZiB0aGUgbGlzdCBvZiB0aHJlZSBudW1iZXJzLgotICAgICA7Ly8gKiAgICAgICAgICAgIElucHV0IHZhbHVlIGNvcnJ1cHRlZCBhdCB0aGUgZW5kIG9mIHRoZSAKLSAgICAgOy8vICogICAgICAgICAgICBleGVjdXRpb24gb2YgdGhpcyBtYWNyby4KLSAgICAgOy8vICogW2luXSB0ICAgICBUZW1wb3Jhcnkgc2NyYXRjaCAgcmVnaXN0ZXIuCi0gICAgIDsvLyAqIFtvdXRdeiAgICAgTWVkaWFuIG9mIHRoZSB0aHJlZSBudW1iZXJzLiAgICAgICAKLSAgICAgOy8vICovCi0gICAgIAotICAgICBNQUNSTwotCi0gICAgIE1fTUVESUFOMyAkeCwgJHksICR6LCAkdCAKLSAgICAgCi0gICAgIFNVQlMgICR0LCAkeSwgJHo7IC8vIGlmICh5IDwgeikKLSAgICAgQURETFQgJHosICR6LCAkdDsgLy8gIHN3YXAgeSBhbmQgegotICAgICBTVUJMVCAkeSwgJHksICR0OwotCi0gICAgIDsvLyBOb3cgeicgPD0geScsIHNvIHRoZXJlIGFyZSB0aHJlZSBjYXNlcyBmb3IgdGhlCi0gICAgIDsvLyBtZWRpYW4gdmFsdWUsIGRlcGVuZGluZyBvbiB4LgotCi0gICAgIDsvLyAxKSB4IDw9IHonICAgICAgPD0geScgICAgICA6IG1lZGlhbiB2YWx1ZSBpcyB6JwotICAgICA7Ly8gMikgICAgICB6JyA8PSB4IDw9IHknICAgICAgOiBtZWRpYW4gdmFsdWUgaXMgeAotICAgICA7Ly8gMykgICAgICB6JyAgICAgIDw9IHknIDw9IHggOiBtZWRpYW4gdmFsdWUgaXMgeScKLQotICAgICBDTVAgICAkeiwgJHg7ICAgICAvLyBpZiAoIHggPiBtaW4oeSx6KSApCi0gICAgIE1PVkxUICR6LCAkeDsgICAgIC8vIGFucyA9IHggCi0KLSAgICAgQ01QICAgJHgsICR5OyAgICAgLy8gaWYgKCB4ID4gbWF4KHkseikgKQotICAgICBNT1ZHVCAkeiwgJHk7ICAgICAvLyBhbnMgPSBtYXgoeSx6KQotICAgICAKLSAgICAgTUVORAotICAgIEVORElGICAgICAgCi0gICAgCi0gICAgCi0gICAgICAgIAotICAgIEVORElGIDsvLyBBUk1BQ0NPTU1fU19ICi0KLSBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvb214VkMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvb214VkMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IzY2M3Mi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL29teFZDLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MzgxICswLDAgQEAKLS8qKgotICogRmlsZTogb214VkMuaAotICogQnJpZWY6IE9wZW5NQVggREwgdjEuMC4yIC0gVmlkZW8gQ29kaW5nIGxpYnJhcnkKLSAqCi0gKiBDb3B5cmlnaHQgqSAyMDA1LTIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqCi0gKiBUaGVzZSBtYXRlcmlhbHMgYXJlIHByb3RlY3RlZCBieSBjb3B5cmlnaHQgbGF3cyBhbmQgY29udGFpbiBtYXRlcmlhbCAKLSAqIHByb3ByaWV0YXJ5IHRvIHRoZSBLaHJvbm9zIEdyb3VwLCBJbmMuICBZb3UgbWF5IHVzZSB0aGVzZSBtYXRlcmlhbHMgCi0gKiBmb3IgaW1wbGVtZW50aW5nIEtocm9ub3Mgc3BlY2lmaWNhdGlvbnMsIHdpdGhvdXQgYWx0ZXJpbmcgb3IgcmVtb3ZpbmcgCi0gKiBhbnkgdHJhZGVtYXJrLCBjb3B5cmlnaHQgb3Igb3RoZXIgbm90aWNlIGZyb20gdGhlIHNwZWNpZmljYXRpb24uCi0gKiAKLSAqIEtocm9ub3MgR3JvdXAgbWFrZXMgbm8sIGFuZCBleHByZXNzbHkgZGlzY2xhaW1zIGFueSwgcmVwcmVzZW50YXRpb25zIAotICogb3Igd2FycmFudGllcywgZXhwcmVzcyBvciBpbXBsaWVkLCByZWdhcmRpbmcgdGhlc2UgbWF0ZXJpYWxzLCBpbmNsdWRpbmcsIAotICogd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIAotICogZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIG9yIG5vbi1pbmZyaW5nZW1lbnQgb2YgYW55IGludGVsbGVjdHVhbCBwcm9wZXJ0eS4gCi0gKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHdhcnJhbnRpZXMsIGV4cHJlc3MgCi0gKiBvciBpbXBsaWVkLCByZWdhcmRpbmcgdGhlIGNvcnJlY3RuZXNzLCBhY2N1cmFjeSwgY29tcGxldGVuZXNzLCB0aW1lbGluZXNzLCAKLSAqIGFuZCByZWxpYWJpbGl0eSBvZiB0aGVzZSBtYXRlcmlhbHMuIAotICoKLSAqIFVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgd2lsbCB0aGUgS2hyb25vcyBHcm91cCwgb3IgYW55IG9mIGl0cyBQcm9tb3RlcnMsIAotICogQ29udHJpYnV0b3JzIG9yIE1lbWJlcnMgb3IgdGhlaXIgcmVzcGVjdGl2ZSBwYXJ0bmVycywgb2ZmaWNlcnMsIGRpcmVjdG9ycywgCi0gKiBlbXBsb3llZXMsIGFnZW50cyBvciByZXByZXNlbnRhdGl2ZXMgYmUgbGlhYmxlIGZvciBhbnkgZGFtYWdlcywgd2hldGhlciAKLSAqIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIGZvciBsb3N0IHJldmVudWVzLCAKLSAqIGxvc3QgcHJvZml0cywgb3Igb3RoZXJ3aXNlLCBhcmlzaW5nIGZyb20gb3IgaW4gY29ubmVjdGlvbiB3aXRoIHRoZXNlIAotICogbWF0ZXJpYWxzLgotICogCi0gKiBLaHJvbm9zIGFuZCBPcGVuTUFYIGFyZSB0cmFkZW1hcmtzIG9mIHRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCi0gKgotICovCi0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9PTVhWQ19IXwotI2RlZmluZSBfT01YVkNfSF8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi0vKiA2LjEuMS4xIE1vdGlvbiBWZWN0b3JzICAqLwotLyogSW4gb214VkMsIG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9TMTYgZHg7Ci0gICAgT01YX1MxNiBkeTsKLX0gT01YVkNNb3Rpb25WZWN0b3I7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0F2ZXJhZ2VfOHggICAoNi4xLjMuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byA4eDQsIDh4OCwgb3IgOHgxNiBibG9ja3MuICBUaGUgCi0gKiByZXN1bHQgaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAgVGhlIGJsb2NrIGF2ZXJhZ2UgZnVuY3Rpb24gY2FuIAotICogYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGhhbGYtcGl4ZWwgaW50ZXJwb2xhdGlvbiB0byBvYnRhaW4gcXVhcnRlciAKLSAqIHBpeGVsIG1vdGlvbiBlc3RpbWF0ZXMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMTBdLCBzdWJjbGF1c2UgOC40LjIuMi4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwUHJlZDAgICAgIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwUHJlZDEgICAgIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpUHJlZFN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlEc3RTdGVwICAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIAotICogICBpSGVpZ2h0ICAgIC0gSGVpZ2h0IG9mIHRoZSBibG9ja3MgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RQcmVkIC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiA4LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFByZWQwLCBwUHJlZDEsIG9yIAotICogICAgICAgICAgICAgIHBEc3RQcmVkLiAKLSAqICAgIC0gICBwRHN0UHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICAgLSAgIGlQcmVkU3RlcDAgPD0gMCBvciBpUHJlZFN0ZXAwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgIGlEc3RTdGVwICAgPD0gMCBvciBpRHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICBpSGVpZ2h0IGlzIG5vdCA0LCA4LCBvciAxNi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0F2ZXJhZ2VfOHggKAotICAgIGNvbnN0IE9NWF9VOCAqcFByZWQwLAotICAgIGNvbnN0IE9NWF9VOCAqcFByZWQxLAotICAgIE9NWF9VMzIgaVByZWRTdGVwMCwKLSAgICBPTVhfVTMyIGlQcmVkU3RlcDEsCi0gICAgT01YX1U4ICpwRHN0UHJlZCwKLSAgICBPTVhfVTMyIGlEc3RTdGVwLAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggICAoNi4xLjMuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byAxNngxNiBvciAxNng4IGJsb2Nrcy4gIFRoZSAKLSAqIHJlc3VsdCBpcyByb3VuZGVkIGFjY29yZGluZyB0byAoYStiKzEpLzIuICBUaGUgYmxvY2sgYXZlcmFnZSBmdW5jdGlvbiBjYW4gCi0gKiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggaGFsZi1waXhlbCBpbnRlcnBvbGF0aW9uIHRvIG9idGFpbiBxdWFydGVyIAotICogcGl4ZWwgbW90aW9uIGVzdGltYXRlcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0xMF0sIHN1YmNsYXVzZSA4LjQuMi4yLjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBQcmVkMCAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFByZWQxIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpUHJlZFN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyIAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9ja3MgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RQcmVkIC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAxNi1ieXRlIGFsaWduZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBQcmVkMCwgcFByZWQxLCBvciAKLSAqICAgICAgICAgICAgICBwRHN0UHJlZC4gCi0gKiAgICAtICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIC0gICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICAtICAgaVByZWRTdGVwMSA8PSAwIG9yIGlQcmVkU3RlcDEgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgLSAgIGlEc3RTdGVwIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgLSAgIGlIZWlnaHQgaXMgbm90IDggb3IgMTYuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9BdmVyYWdlXzE2eCAoCi0gICAgY29uc3QgT01YX1U4ICpwUHJlZDAsCi0gICAgY29uc3QgT01YX1U4ICpwUHJlZDEsCi0gICAgT01YX1UzMiBpUHJlZFN0ZXAwLAotICAgIE9NWF9VMzIgaVByZWRTdGVwMSwKLSAgICBPTVhfVTggKnBEc3RQcmVkLAotICAgIE9NWF9VMzIgaURzdFN0ZXAsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JICAgKDYuMS4zLjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gZXhwYW5kcyBhIHJlY29uc3RydWN0ZWQgZnJhbWUgaW4tcGxhY2UuICBUaGUgdW5leHBhbmRlZCAKLSAqIHNvdXJjZSBmcmFtZSBzaG91bGQgYmUgc3RvcmVkIGluIGEgcGxhbmUgYnVmZmVyIHdpdGggc3VmZmljaWVudCBzcGFjZSAKLSAqIHByZS1hbGxvY2F0ZWQgZm9yIGVkZ2UgZXhwYW5zaW9uLCBhbmQgdGhlIGlucHV0IGZyYW1lIHNob3VsZCBiZSBsb2NhdGVkIGluIAotICogdGhlIHBsYW5lIGJ1ZmZlciBjZW50ZXIuICBUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIHRoZSBwaXhlbCBleHBhbnNpb24gYnkgCi0gKiByZXBsaWNhdGluZyBzb3VyY2UgZnJhbWUgZWRnZSBwaXhlbCBpbnRlbnNpdGllcyBpbiB0aGUgZW1wdHkgcGl4ZWwgCi0gKiBsb2NhdGlvbnMgKGV4cGFuc2lvbiByZWdpb24pIGJldHdlZW4gdGhlIHNvdXJjZSBmcmFtZSBlZGdlIGFuZCB0aGUgcGxhbmUgCi0gKiBidWZmZXIgZWRnZS4gIFRoZSB3aWR0aC9oZWlnaHQgb2YgdGhlIGV4cGFuc2lvbiByZWdpb25zIG9uIHRoZSAKLSAqIGhvcml6b250YWwvdmVydGljYWwgZWRnZXMgaXMgY29udHJvbGxlZCBieSB0aGUgcGFyYW1ldGVyIGlFeHBhbmRQZWxzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0UGxhbmUgLSBwb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGZyYW1lIHRvIGJlIAotICogICAgICAgICAgICBleHBhbmRlZDsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIGlGcmFtZVdpZHRoIC0gZnJhbWUgd2lkdGg7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgaUZyYW1lSGVpZ2h0IC1mcmFtZSBoZWlnaHQ7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgaUV4cGFuZFBlbHMgLSBudW1iZXIgb2YgcGl4ZWxzIHRvIGJlIGV4cGFuZGVkIGluIHRoZSBob3Jpem9udGFsIGFuZCAKLSAqICAgICAgICAgICAgdmVydGljYWwgZGlyZWN0aW9uczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBpUGxhbmVTdGVwIC0gZGlzdGFuY2UsIGluIGJ5dGVzLCBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyAKLSAqICAgICAgICAgICAgaW4gdGhlIHBsYW5lIGJ1ZmZlcjsgbXVzdCBiZSBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byAKLSAqICAgICAgICAgICAgKGlGcmFtZVdpZHRoICsgMiAqIGlFeHBhbmRQZWxzKS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RQbGFuZSAtUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmcmFtZSAoTk9UIHRoZSAKLSAqICAgICAgICAgICAgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBwbGFuZSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgIHBTcmNEc3RQbGFuZSBpcyBOVUxMLiAKLSAqICAgIC0gICAgcFNyY0RzdFBsYW5lIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICAtICAgIG9uZSBvZiB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgaXMgZWl0aGVyIGVxdWFsIHRvIHplcm8gb3IgaXMgYSAKLSAqICAgICAgICAgICAgICBub24tbXVsdGlwbGUgb2YgODogaUZyYW1lSGVpZ2h0LCBpRnJhbWVXaWR0aCwgaVBsYW5lU3RlcCwgb3IgCi0gKiAgICAgICAgICAgICAgaUV4cGFuZFBlbHMuIAotICogICAgLSAgICBpUGxhbmVTdGVwIDwgKGlGcmFtZVdpZHRoICsgMiAqIGlFeHBhbmRQZWxzKS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0V4cGFuZEZyYW1lX0kgKAotICAgIE9NWF9VOCAqcFNyY0RzdFBsYW5lLAotICAgIE9NWF9VMzIgaUZyYW1lV2lkdGgsCi0gICAgT01YX1UzMiBpRnJhbWVIZWlnaHQsCi0gICAgT01YX1UzMiBpRXhwYW5kUGVscywKLSAgICBPTVhfVTMyIGlQbGFuZVN0ZXAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvcHk4eDggICAoNi4xLjMuMy4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29waWVzIHRoZSByZWZlcmVuY2UgOHg4IGJsb2NrIHRvIHRoZSBjdXJyZW50IGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgc3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0cyBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBmcmFtZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4IGFuZCBtdXN0IGJlIGxhcmdlciB0aGFuIAotICogICAgICAgICAgICBvciBlcXVhbCB0byA4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgICBib3VuZGFyeTogcFNyYywgcERzdCAKLSAqICAgIC0gICAgc3RlcCA8OCBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9Db3B5OHg4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgc3RlcAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29weTE2eDE2ICAgKDYuMS4zLjMuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDE2eDE2IG1hY3JvYmxvY2sgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBtYWNyb2Jsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgc3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0cyBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBmcmFtZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiBhbmQgbXVzdCBiZSBsYXJnZXIgCi0gKiAgICAgICAgICAgIHRoYW4gb3IgZXF1YWwgdG8gMTYuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gbWFjcm9ibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgCi0gKiAgICAgICAgICAgIDE2LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QgCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgICAgYm91bmRhcnk6IHBTcmMsIHBEc3QgCi0gKiAgICAtICAgIHN0ZXAgPDE2IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9Db3B5MTZ4MTYgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBzdGVwCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEICAgKDYuMS40LjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIHRleHR1cmUgZXJyb3Igb2YgdGhlIGJsb2NrOyBhbHNvIHJldHVybnMgU0FELiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc291cmNlIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHNyY1N0ZXAgLSBzdGVwIG9mIHRoZSBzb3VyY2UgcGxhbmUgCi0gKiAgIHBTcmNSZWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYnVmZmVyLCBhbiA4eDggYmxvY2s7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgYW4gOHg4IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIHRoZSBTdW0gb2YgQWJzb2x1dGUgRGlmZmVyZW5jZXMgKFNBRCkgdmFsdWUgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCi0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmLCBwRHN0IGFuZCBwRHN0U0FELiAKLSAqICAgIC0gICAgcFNyYyBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBTcmNTdGVwIDw9IDAgb3Igc3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfSU5UIHNyY1N0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX0lOVCAqcERzdFNBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrICAgKDYuMS40LjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIHRoZSB0ZXh0dXJlIGVycm9yIG9mIHRoZSBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBwbGFuZS4gVGhpcyBzaG91bGQgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgc3JjU3RlcCAtIHN0ZXAgb2YgdGhlIHNvdXJjZSBwbGFuZSAKLSAqICAgcFNyY1JlZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBidWZmZXIsIGFuIDh4OCBibG9jay4gVGhpcyBzaG91bGQgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgYW4gOHg4IGJsb2NrLiBUaGlzIHNob3VsZCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyYywgcFNyY1JlZiwgcERzdC4gCi0gKiAgICAtICAgIHBTcmMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgU3JjU3RlcCA8PSAwIG9yIHNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jayAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9JTlQgc3JjU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCi0gICAgT01YX1MxNiAqcERzdAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdCAgICg2LjEuNC4xLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBMaW1pdHMgdGhlIG1vdGlvbiB2ZWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGJsb2NrL21hY3JvYmxvY2sgdG8gCi0gKiBwcmV2ZW50IHRoZSBtb3Rpb24gY29tcGVuc2F0ZWQgYmxvY2svbWFjcm9ibG9jayBmcm9tIG1vdmluZyBvdXRzaWRlIGEgCi0gKiBib3VuZGluZyByZWN0YW5nbGUgYXMgc2hvd24gaW4gRmlndXJlIDYtMS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY01WIC0gcG9pbnRlciB0byB0aGUgbW90aW9uIHZlY3RvciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYmxvY2sgCi0gKiAgICAgICAgICAgIG9yIG1hY3JvYmxvY2sgCi0gKiAgIHBSZWN0Vk9QUmVmIC0gcG9pbnRlciB0byB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIAotICogICBYY29vcmQsIFljb29yZCAgLSBjb29yZGluYXRlcyBvZiB0aGUgY3VycmVudCBibG9jayBvciBtYWNyb2Jsb2NrIAotICogICBzaXplIC0gc2l6ZSBvZiB0aGUgY3VycmVudCBibG9jayBvciBtYWNyb2Jsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIDggb3IgCi0gKiAgICAgICAgICAgIDE2LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdE1WIC0gcG9pbnRlciB0byB0aGUgbGltaXRlZCBtb3Rpb24gdmVjdG9yIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAotICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY01WLCBwRHN0TVYsIG9yIHBSZWN0Vk9QUmVmLiAKLSAqICAgIC0gICAgc2l6ZSBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYuIAotICogICAgLSAgICB0aGUgd2lkdGggb3IgaGVpZ2h0IG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUgaXMgbGVzcyB0aGFuIAotICogICAgICAgICB0d2ljZSB0aGUgYmxvY2sgc2l6ZS4KLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0ICgKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCi0gICAgY29uc3QgT01YUmVjdCAqcFJlY3RWT1BSZWYsCi0gICAgT01YX0lOVCBYY29vcmQsCi0gICAgT01YX0lOVCBZY29vcmQsCi0gICAgT01YX0lOVCBzaXplCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9TQURfMTZ4ICAgKDYuMS40LjEuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciAxNngxNiBhbmQgMTZ4OCBibG9ja3MuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgaVN0ZXBPcmcgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIgCi0gKiAgIHBTcmNSZWYgIC0gUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIAotICogICBpU3RlcFJlZiAtIFN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIgCi0gKiAgIGlIZWlnaHQgIC0gSGVpZ2h0IG9mIHRoZSBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtIFBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNPcmcsIHBEc3RTQUQsIG9yIHBTcmNSZWYgCi0gKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIGlTdGVwT3JnICA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAotICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCA4IG9yIDE2IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9TQURfMTZ4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCi0gICAgT01YX1UzMiBpU3RlcE9yZywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCi0gICAgT01YX1UzMiBpU3RlcFJlZiwKLSAgICBPTVhfUzMyICpwRHN0U0FELAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fU0FEXzh4ICAgKDYuMS40LjEuNSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciA4eDE2LCA4eDgsIDh4NCBibG9ja3MuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmcgIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDgtYnl0ZSAKLSAqICAgICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyIAotICogICBwU3JjUmVmICAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKLSAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAotICogICBpSGVpZ2h0ICAtIEhlaWdodCBvZiB0aGUgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNPcmcsIHBEc3RTQUQsIG9yIHBTcmNSZWYgCi0gKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgaVN0ZXBPcmcgIDw9IDAgb3IgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKLSAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCA0LCA4IG9yIDE2IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9TQURfOHggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKLSAgICBPTVhfVTMyIGlTdGVwT3JnLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKLSAgICBPTVhfVTMyIGlTdGVwUmVmLAotICAgIE9NWF9TMzIqcERzdFNBRCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKiA2LjIuMS4xIERpcmVjdGlvbiAgKi8KLS8qIFRoZSBkaXJlY3Rpb24gZW51bWVyYXRvciBpcyB1c2VkIHdpdGggZnVuY3Rpb25zIHRoYXQgcGVyZm9ybSBBQy9EQyBwcmVkaWN0aW9uIGFuZCB6aWctemFnIHNjYW4uICAqLwotCi1lbnVtIHsKLSAgICBPTVhfVkNfTk9ORSAgICAgICA9IDAsCi0gICAgT01YX1ZDX0hPUklaT05UQUwgPSAxLAotICAgIE9NWF9WQ19WRVJUSUNBTCAgID0gMiAKLX07Ci0KLQotCi0vKiA2LjIuMS4yIEJpbGluZWFyIEludGVycG9sYXRpb24gICovCi0vKiBUaGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBlbnVtZXJhdG9yIGlzIHVzZWQgd2l0aCBtb3Rpb24gZXN0aW1hdGlvbiwgbW90aW9uIGNvbXBlbnNhdGlvbiwgYW5kIHJlY29uc3RydWN0aW9uIGZ1bmN0aW9ucy4gICovCi0KLWVudW0gewotICAgIE9NWF9WQ19JTlRFR0VSX1BJWEVMID0gMCwgLyogY2FzZSBhICovCi0gICAgT01YX1ZDX0hBTEZfUElYRUxfWCAgPSAxLCAvKiBjYXNlIGIgKi8KLSAgICBPTVhfVkNfSEFMRl9QSVhFTF9ZICA9IDIsIC8qIGNhc2UgYyAqLwotICAgIE9NWF9WQ19IQUxGX1BJWEVMX1hZID0gMyAgLyogY2FzZSBkICovIAotfTsKLQotCi0KLS8qIDYuMi4xLjMgTmVpZ2hib3JpbmcgTWFjcm9ibG9jayBBdmFpbGFiaWxpdHkgICovCi0vKiBOZWlnaGJvcmluZyBtYWNyb2Jsb2NrIGF2YWlsYWJpbGl0eSBpcyBpbmRpY2F0ZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBmbGFnczogICAqLwotCi1lbnVtIHsKLSAgICBPTVhfVkNfVVBQRVIgPSAxLCAgICAgICAgLyoqIGFib3ZlIG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCi0gICAgT01YX1ZDX0xFRlQgPSAyLCAgICAgICAgIC8qKiBsZWZ0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCi0gICAgT01YX1ZDX0NFTlRFUiA9IDQsCi0gICAgT01YX1ZDX1JJR0hUID0gOCwKLSAgICBPTVhfVkNfTE9XRVIgPSAxNiwKLSAgICBPTVhfVkNfVVBQRVJfTEVGVCA9IDMyLCAgLyoqIGFib3ZlLWxlZnQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KLSAgICBPTVhfVkNfVVBQRVJfUklHSFQgPSA2NCwgLyoqIGFib3ZlLXJpZ2h0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCi0gICAgT01YX1ZDX0xPV0VSX0xFRlQgPSAxMjgsCi0gICAgT01YX1ZDX0xPV0VSX1JJR0hUID0gMjU2IAotfTsKLQotCi0KLS8qIDYuMi4xLjQgVmlkZW8gQ29tcG9uZW50cyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyB2aWRlbyBjb21wb25lbnRzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDX0xVTUlOQU5DRSwgICAgLyoqIEx1bWluYW5jZSBjb21wb25lbnQgKi8KLSAgICBPTVhfVkNfQ0hST01JTkFOQ0UgICAvKiogY2hyb21pbmFuY2UgY29tcG9uZW50ICovIAotfSBPTVhWQ000UDJWaWRlb0NvbXBvbmVudDsKLQotCi0KLS8qIDYuMi4xLjUgTWFjcm9ibG9ja1R5cGVzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIG1hY3JvYmxvY2sgdHlwZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfSU5URVIgICAgID0gMCwgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLwotICAgIE9NWF9WQ19JTlRFUl9RICAgPSAxLCAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCi0gICAgT01YX1ZDX0lOVEVSNFYgICA9IDIsIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KLSAgICBPTVhfVkNfSU5UUkEgICAgID0gMywgLyoqIEkgYW5kIFAgcGljdHVyZSwgSS0gYW5kIFAtVk9QICovCi0gICAgT01YX1ZDX0lOVFJBX1EgICA9IDQsIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLwotICAgIE9NWF9WQ19JTlRFUjRWX1EgPSA1ICAvKiogUCBwaWN0dXJlIG9yIFAtVk9QIChILjI2MykqLwotfSBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZTsKLQotCi0KLS8qIDYuMi4xLjYgQ29vcmRpbmF0ZXMgICovCi0vKiBDb29yZGluYXRlcyBhcmUgcmVwcmVzZW50ZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfSU5UIHg7Ci0gICAgT01YX0lOVCB5OwotfSBPTVhWQ000UDJDb29yZGluYXRlOwotCi0KLQotLyogNi4yLjEuNyBNb3Rpb24gRXN0aW1hdGlvbiBBbGdvcml0aG1zICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIG1vdGlvbiBlc3RpbWF0aW9uIHNlYXJjaCBtZXRob2RzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDX000UDJfRkFTVF9TRUFSQ0ggPSAwLCAgLyoqIEZhc3QgbW90aW9uIHNlYXJjaCAqLwotICAgIE9NWF9WQ19NNFAyX0ZVTExfU0VBUkNIID0gMSAgIC8qKiBGdWxsIG1vdGlvbiBzZWFyY2ggKi8gCi19IE9NWFZDTTRQMk1FTW9kZTsKLQotCi0KLS8qIDYuMi4xLjggTW90aW9uIEVzdGltYXRpb24gUGFyYW1ldGVycyAgKi8KLS8qIEEgZGF0YSBzdHJ1Y3R1cmUgY29udGFpbmluZyBjb250cm9sIHBhcmFtZXRlcnMgZm9yIAotICogbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zIGlzIGRlZmluZWQgYXMgZm9sbG93czogIAotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfSU5UIHNlYXJjaEVuYWJsZTh4ODsgICAgIC8qKiBlbmFibGVzIDh4OCBzZWFyY2ggKi8KLSAgICBPTVhfSU5UIGhhbGZQZWxTZWFyY2hFbmFibGU7IC8qKiBlbmFibGVzIGhhbGYtcGVsIHJlc29sdXRpb24gKi8KLSAgICBPTVhfSU5UIHNlYXJjaFJhbmdlOyAgICAgICAgIC8qKiBzZWFyY2ggcmFuZ2UgKi8KLSAgICBPTVhfSU5UIHJuZFZhbDsgICAgICAgICAgICAgIC8qKiByb3VuZGluZyBjb250cm9sOyAwLWRpc2FibGVkLCAxLWVuYWJsZWQqLwotfSBPTVhWQ000UDJNRVBhcmFtczsKLQotCi0KLS8qIDYuMi4xLjkgTWFjcm9ibG9jayBJbmZvcm1hdGlvbiAgICovCi0vKiBBIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgbWFjcm9ibG9jayBwYXJhbWV0ZXJzIGZvciAKLSAqIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9ucyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAKLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX1MzMiBzbGljZUlkOyAgICAgICAgICAgICAgICAgLyogc2xpY2UgbnVtYmVyICovCi0gICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgbWJUeXBlOyAgLyogTUIgdHlwZTogT01YX1ZDX0lOVFJBLCBPTVhfVkNfSU5URVIsIG9yIE9NWF9WQ19JTlRFUjQgKi8KLSAgICBPTVhfUzMyIHFwOyAgICAgICAgICAgICAgICAgICAgICAvKiBxdWFudGl6YXRpb24gcGFyYW1ldGVyKi8KLSAgICBPTVhfVTMyIGNicHk7ICAgICAgICAgICAgICAgICAgICAvKiBDQlAgTHVtYSAqLwotICAgIE9NWF9VMzIgY2JwYzsgICAgICAgICAgICAgICAgICAgIC8qIENCUCBDaHJvbWEgKi8KLSAgICBPTVhWQ01vdGlvblZlY3RvciBwTVYwWzJdWzJdOyAgICAvKiBtb3Rpb24gdmVjdG9yLCByZXByZXNlbnRlZCB1c2luZyAxLzItcGVsIHVuaXRzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwTVYwW2Jsb2NreV1bYmxvY2t4XSAoYmxvY2t5ID0gMH4xLCBibG9ja3ggPTB+MSkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WUHJlZFsyXVsyXTsgLyogbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uLCByZXByZXNlbnRlZCB1c2luZyAxLzItcGVsIHVuaXRzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwTVZQcmVkW2Jsb2NreV1bYmxvY2t4XSAoYmxvY2t5ID0gMH4xLCBibG9ja3ggPSAwfjEpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIE9NWF9VOCBwUHJlZERpclsyXVsyXTsgICAgICAgICAgIC8qIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uOiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIE9NWF9WQ19OT05FLCBPTVhfVkNfVkVSVElDQUwsIE9NWF9WQ19IT1JJWk9OVEFMIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotfSBPTVhWQ000UDJNQkluZm8sICpPTVhWQ000UDJNQkluZm9QdHI7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0ZpbmRNVnByZWQgICAoNi4yLjMuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUHJlZGljdHMgYSBtb3Rpb24gdmVjdG9yIGZvciB0aGUgY3VycmVudCBibG9jayB1c2luZyB0aGUgcHJvY2VkdXJlIAotICogc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi41LiAgVGhlIHJlc3VsdGluZyBwcmVkaWN0ZWQgTVYgaXMgCi0gKiByZXR1cm5lZCBpbiBwRHN0TVZQcmVkLiBJZiB0aGUgcGFyYW1ldGVyIHBEc3RNVlByZWRNRSBpZiBpcyBub3QgTlVMTCB0aGVuIAotICogdGhlIHNldCBvZiB0aHJlZSBNViBjYW5kaWRhdGVzIHVzZWQgZm9yIHByZWRpY3Rpb24gaXMgYWxzbyByZXR1cm5lZCwgCi0gKiBvdGhlcndpc2UgcERzdE1WUHJlZE1FaXMgTlVMTCB1cG9uIHJldHVybi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY01WQ3VyTUIgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IFkgCi0gKiAgICAgICAgICAgIG1hY3JvYmxvY2s7IGEgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAotICogICBwU3JjQ2FuZE1WMSAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAotICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIHRvIHRoZSBsZWZ0IG9mIHRoZSBjdXJyZW50IE1COyBzZXQgdG8gTlVMTCAKLSAqICAgICAgICAgICAgaWYgdGhlcmUgaXMgbm8gTUIgdG8gdGhlIGxlZnQuIAotICogICBwU3JjQ2FuZE1WMiAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAotICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIGFib3ZlIHRoZSBjdXJyZW50IE1COyBzZXQgdG8gTlVMTCBpZiB0aGVyZSAKLSAqICAgICAgICAgICAgaXMgbm8gTUIgbG9jYXRlZCBhYm92ZSB0aGUgY3VycmVudCBNQi4gCi0gKiAgIHBTcmNDYW5kTVYzIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDQgTVZzIGFzc29jaWF0ZWQgCi0gKiAgICAgICAgICAgIHdpdGggdGhlIE1CIGxvY2F0ZWQgdG8gdGhlIHJpZ2h0IGFuZCBhYm92ZSB0aGUgY3VycmVudCBNQjsgc2V0IAotICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZXJlIGlzIG5vIE1CIGxvY2F0ZWQgdG8gdGhlIGFib3ZlLXJpZ2h0LiAKLSAqICAgaUJsayAtIHRoZSBpbmRleCBvZiBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAotICogICBwRHN0TVZQcmVkTUUgLSBNViBjYW5kaWRhdGUgcmV0dXJuIGJ1ZmZlcjsgIGlmIHNldCB0byBOVUxMIHRoZW4gCi0gKiAgICAgICAgICAgIHByZWRpY3Rpb24gY2FuZGlkYXRlIE1WcyBhcmUgbm90IHJldHVybmVkIGFuZCBwRHN0TVZQcmVkTUUgd2lsbCAKLSAqICAgICAgICAgICAgYmUgTlVMTCB1cG9uIGZ1bmN0aW9uIHJldHVybjsgaWYgcERzdE1WUHJlZE1FIGlzIG5vbi1OVUxMIHRoZW4gaXQgCi0gKiAgICAgICAgICAgIG11c3QgcG9pbnQgdG8gYSBidWZmZXIgY29udGFpbmluZyBzdWZmaWNpZW50IHNwYWNlIGZvciB0aHJlZSAKLSAqICAgICAgICAgICAgcmV0dXJuIE1Wcy4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RNVlByZWQgLSBwb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvciAKLSAqICAgcERzdE1WUHJlZE1FIC0gaWYgbm9uLU5VTEwgdXBvbiBpbnB1dCB0aGVuIHBEc3RNVlByZWRNRSAgcG9pbnRzIHVwb24gCi0gKiAgICAgICAgICAgIHJldHVybiB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSB0aHJlZSBtb3Rpb24gdmVjdG9yIGNhbmRpZGF0ZXMgCi0gKiAgICAgICAgICAgIHVzZWQgZm9yIHByZWRpY3Rpb24gYXMgc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIAotICogICAgICAgICAgICA3LjYuNSwgb3RoZXJ3aXNlIGlmIE5VTEwgdXBvbiBpbnB1dCB0aGVuIHBEc3RNVlByZWRNRSBpcyBOVUxMIAotICogICAgICAgICAgICB1cG9uIG91dHB1dC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgICB0aGUgcG9pbnRlciBwRHN0TVZQcmVkIGlzIE5VTEwgCi0gKiAgICAtICAgIHRoZSBwYXJhbWV0ZXIgaUJsayBkb2VzIG5vdCBmYWxsIGludG8gdGhlIHJhbmdlIDAgPD0gaUJsazw9MyAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRmluZE1WcHJlZCAoCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVkN1ck1CLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjQ2FuZE1WMSwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0NhbmRNVjIsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNDYW5kTVYzLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVZQcmVkLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVZQcmVkTUUsCi0gICAgT01YX0lOVCBpQmxrCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9JRENUOHg4YmxrICAgKDYuMi4zLjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIGEgMkQgaW52ZXJzZSBEQ1QgZm9yIGEgc2luZ2xlIDh4OCBibG9jaywgYXMgZGVmaW5lZCBpbiAKLSAqIFtJU08xNDQ5Ni0yXS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBJRENUIGlucHV0IGJ1ZmZlcjsgCi0gKiAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBBY2NvcmRpbmcgdG8gCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0yXSwgdGhlIGlucHV0IGNvZWZmaWNpZW50IHZhbHVlcyBzaG91bGQgbGllIHdpdGhpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFstMjA0OCwgMjA0N10uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIElEQ1Qgb3V0cHV0IGJ1ZmZlcjsgCi0gKiAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfSURDVDh4OGJsayAoCi0gICAgY29uc3QgT01YX1MxNiAqcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUgICAoNi4yLjQuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gCi0gKiBzdHJ1Y3R1cmUgZm9yIHRoZSBmb2xsb3dpbmcgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAKLSAqIEJsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiwgYW5kIE1vdGlvbkVzdGltYXRpb25NQi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKLSAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMk1FTW9kZSAKLSAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNpemUgLSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIAotICogICAgICAgICAgICBzdHJ1Y3R1cmUgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCi0gKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgCi0gKiAgICAgICAgIHBhcmFtZXRlciBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9NRUdldEJ1ZlNpemUgKAotICAgIE9NWFZDTTRQMk1FTW9kZSBNRW1vZGUsCi0gICAgY29uc3QgT01YVkNNNFAyTUVQYXJhbXMgKnBNRVBhcmFtcywKLSAgICBPTVhfVTMyICpwU2l6ZQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUVJbml0ICAgKDYuMi40LjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEluaXRpYWxpemVzIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgcmVxdWlyZWQgZm9yIHRoZSAKLSAqIGZvbGxvd2luZyBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnM6ICBCbG9ja01hdGNoX0ludGVnZXJfOHg4LCAKLSAqIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiwgYW5kIE1vdGlvbkVzdGltYXRpb25NQi4gTWVtb3J5IGZvciB0aGUgCi0gKiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAqcE1FU3BlYyBtdXN0IGJlIGFsbG9jYXRlZCBwcmlvciB0byBjYWxsaW5nIHRoZSAKLSAqIGZ1bmN0aW9uLCBhbmQgc2hvdWxkIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBGb2xsb3dpbmcgCi0gKiBpbml0aWFsaXphdGlvbiBieSB0aGlzIGZ1bmN0aW9uLCB0aGUgdmVuZG9yLXNwZWNpZmljIHN0cnVjdHVyZSAqcE1FU3BlYyAKLSAqIHNob3VsZCBjb250YWluIGFuIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIHJlcHJlc2VudGF0aW9uIG9mIGFsbCBtb3Rpb24gCi0gKiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgcmVjZWl2ZWQgdmlhIHRoZSBzdHJ1Y3R1cmUgcE1FUGFyYW1zLCBmb3IgZXhhbXBsZSAgCi0gKiBybmRWYWwsIHNlYXJjaFJhbmdlLCBldGMuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgCi0gKiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSBjYW4gYmUgZGV0ZXJtaW5lZCB1c2luZyB0aGUgZnVuY3Rpb24gCi0gKiBvbXhWQ000UDJfTUVHZXRCdWZTaXplLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAotICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAyTUVNb2RlIAotICogICBwTUVQYXJhbXMgLSBtb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgdW5pbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAotICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAotICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIAotICogICAgICAgICBwYXJhbWV0ZXIgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfTUVJbml0ICgKLSAgICBPTVhWQ000UDJNRU1vZGUgTUVtb2RlLAotICAgIGNvbnN0IE9NWFZDTTRQMk1FUGFyYW1zKnBNRVBhcmFtcywKLSAgICB2b2lkICpwTUVTcGVjCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgICAoNi4yLjQuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBzZWFyY2g7IGVzdGltYXRlcyBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIAotICogbWluaW11bSBTQUQuIEJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIHVzaW5nIAotICogaGFsZi1waXhlbCB1bml0cywgYW5kIHRoZXJlZm9yZSBhIHNoaWZ0IGxlZnQgb3IgcmlnaHQgYnkgMSBiaXQgbWF5IGJlIAotICogcmVxdWlyZWQsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2ggdGhlIGlucHV0IG9yIG91dHB1dCBNVnMgd2l0aCBvdGhlciAKLSAqIGZ1bmN0aW9ucyB0aGF0IGVpdGhlciBnZW5lcmF0ZSBvdXRwdXQgTVZzIG9yIGV4cGVjdCBpbnB1dCBNVnMgcmVwcmVzZW50ZWQgCi0gKiB1c2luZyBpbnRlZ2VyIHBpeGVsIHVuaXRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBNQiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIAotICogICAgICAgICAgICB0aGUgY3VycmVudCBwbGFuZS4gCi0gKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKLSAqICAgcFJlZlJlY3QgLSBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcGxhbmUgcmVjdGFuZ2xlOyBjb29yZGluYXRlcyAKLSAqICAgICAgICAgICAgYXJlIHNwZWNpZmllZCByZWxhdGl2ZSB0byB0aGUgaW1hZ2Ugb3JpZ2luLiAgUmVjdGFuZ2xlIAotICogICAgICAgICAgICBib3VuZGFyaWVzIG1heSBleHRlbmQgYmV5b25kIGltYWdlIGJvdW5kYXJpZXMgaWYgdGhlIGltYWdlIGhhcyAKLSAqICAgICAgICAgICAgYmVlbiBwYWRkZWQuICBGb3IgZXhhbXBsZSwgaWYgcGFkZGluZyBleHRlbmRzIDQgcGl4ZWxzIGJleW9uZCAKLSAqICAgICAgICAgICAgZnJhbWUgYm9yZGVyLCB0aGVuIHRoZSB2YWx1ZSBmb3IgdGhlIGxlZnQgYm9yZGVyIGNvdWxkIGJlIHNldCB0byAKLSAqICAgICAgICAgICAgLTQuIAotICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKLSAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAyNTYgCi0gKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKLSAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAotICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKLSAqICAgcFNyY1ByZU1WIC0gcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gCi0gKiAgICAgICAgICAgIHByZWRpY3RlZCBNViAKLSAqICAgcFNyY1ByZVNBRCAtIHBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIAotICogICAgICAgICAgICBieSBwU3JjUHJlTVYpOyBtYXkgYmUgc2V0IHRvIE5VTEwgaWYgdW5hdmFpbGFibGUuIAotICogICBwTUVTcGVjIC0gdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyAKLSAqICAgICAgICAgICAgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAotICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nIGZ1bmN0aW9uLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY1JlZkJ1ZiwgCi0gKiAgICAgICAgICAgICAgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcEN1cnJQb2ludFBvcywgcERzdE1WLCBwRHN0U0FEIG9yIAotICogICAgICAgICAgICAgIHBNRVNwZWMsIG9yIAotICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICBPTVhfSU5UIHJlZldpZHRoLAotICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvcipwU3JjUHJlTVYsCi0gICAgY29uc3QgT01YX0lOVCAqcFNyY1ByZVNBRCwKLSAgICB2b2lkICpwTUVTcGVjLAotICAgIE9NWFZDTW90aW9uVmVjdG9yKnBEc3RNViwKLSAgICBPTVhfSU5UICpwRHN0U0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4ICAgKDYuMi40LjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGFuIDh4OCBibG9jayBzZWFyY2g7IGVzdGltYXRlcyBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIAotICogbWluaW11bSBTQUQuICBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCAKLSAqIHVzaW5nIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSAKLSAqIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgCi0gKiBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgaW5wdXQgTVZzIHJlcHJlc2VudGVkIAotICogdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgOHg4IGJsb2NrIAotICogICAgICAgICAgICBpbiB0aGUgY3VycmVudCBwbGFuZS4gCi0gKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKLSAqICAgcFJlZlJlY3QgLSBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcGxhbmUgcmVjdGFuZ2xlOyBjb29yZGluYXRlcyAKLSAqICAgICAgICAgICAgYXJlIHNwZWNpZmllZCByZWxhdGl2ZSB0byB0aGUgaW1hZ2Ugb3JpZ2luLiAgUmVjdGFuZ2xlIAotICogICAgICAgICAgICBib3VuZGFyaWVzIG1heSBleHRlbmQgYmV5b25kIGltYWdlIGJvdW5kYXJpZXMgaWYgdGhlIGltYWdlIGhhcyAKLSAqICAgICAgICAgICAgYmVlbiBwYWRkZWQuIAotICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKLSAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAxMjggCi0gKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKLSAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYgYnl0ZXMuIAotICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCi0gKiAgIHBTcmNQcmVNViAtIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIAotICogICAgICAgICAgICBwcmVkaWN0ZWQgTVYgCi0gKiAgIHBTcmNQcmVTQUQgLSBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCAKLSAqICAgICAgICAgICAgYnkgcFNyY1ByZU1WKTsgbWF5IGJlIHNldCB0byBOVUxMIGlmIHVuYXZhaWxhYmxlLiAKLSAqICAgcE1FU3BlYyAtIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgCi0gKiAgICAgICAgICAgIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKLSAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyBmdW5jdGlvbi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAotICogICAgICAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBDdXJyUG9pbnRQb3MsIHBEc3RNViwgcERzdFNBRCBvciAKLSAqICAgICAgICAgICAgICBwTUVTcGVjLCBvciAKLSAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNQcmVNViwKLSAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAotICAgIHZvaWQgKnBNRVNwZWMsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNViwKLSAgICBPTVhfSU5UICpwRHN0U0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYgICAoNi4yLjQuMi4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gIFJldHVybnMgdGhlIAotICogZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICBUaGlzIGZ1bmN0aW9uIAotICogZXN0aW1hdGVzIHRoZSBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciAKLSAqIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdE1WLCBpLmUuLCAKLSAqIHRoZSBpbml0aWFsIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgaW5wdXQgcGFyYW1ldGVycyAKLSAqIHBTcmNSZWZCdWYgYW5kIHBTZWFyY2hQb2ludFJlZlBvcyBzaG91bGQgYmUgc2hpZnRlZCBieSB0aGUgd2lubmluZyBNViBvZiAKLSAqIDE2eDE2IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzE2eDE2LiBUaGUgZnVuY3Rpb24gCi0gKiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIG1hY3JvYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAotICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCi0gKiAgIHBSZWZSZWN0IC0gcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUgCi0gKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAotICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDI1NiAKLSAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAotICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNi4gCi0gKiAgIHBTZWFyY2hQb2ludFJlZlBvcyAtIHBvc2l0aW9uIG9mIHRoZSBzdGFydGluZyBwb2ludCBmb3IgaGFsZiBwaXhlbCAKLSAqICAgICAgICAgICAgc2VhcmNoIChzcGVjaWZpZWQgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGxhbmUsIGkuZS4sIHRoZSByZWZlcmVuY2UgcG9zaXRpb24gcG9pbnRlZCB0byBieSB0aGUgCi0gKiAgICAgICAgICAgIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yLiAKLSAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAotICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIAotICogICAgICAgICAgICBkdXJpbmcgYSBwcmlvciAxNlgxNiBpbnRlZ2VyIHNlYXJjaDsgc3BlY2lmaWVkIGluIHRlcm1zIG9mIAotICogICAgICAgICAgICBoYWxmLXBpeGVsIHVuaXRzLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY1JlZkJ1ZiwgCi0gKiAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBTZWFyY2hQb2ludFJlZlBvcywgcFNyY0RzdE1WLgotICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCBvciAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBTZWFyY2hQb2ludFJlZlBvcywKLSAgICBPTVhfSU5UIHJuZFZhbCwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAotICAgIE9NWF9JTlQgKnBEc3RTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDggICAoNi4yLjQuMi40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYW4gOHg4IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiBSZXR1cm5zIHRoZSAKLSAqIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiAKLSAqIGVzdGltYXRlcyB0aGUgaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgCi0gKiByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgCi0gKiB0aGUgaW5pdGlhbCBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgCi0gKiBwU3JjUmVmQnVmIGFuZCBwU2VhcmNoUG9pbnRSZWZQb3Mgc2hvdWxkIGJlIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgCi0gKiA4eDggaW50ZWdlciBzZWFyY2ggcHJpb3IgdG8gY2FsbGluZyBCbG9ja01hdGNoX0hhbGZfOHg4LiBUaGUgZnVuY3Rpb24gCi0gKiBCbG9ja01hdGNoX0ludGVnZXJfOHg4IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCA4eDggYmxvY2sgCi0gKiAgICAgICAgICAgIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKLSAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAotICogICBwUmVmUmVjdCAtIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlIAotICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKLSAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAxMjggCi0gKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAotICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNi4gCi0gKiAgIHBTZWFyY2hQb2ludFJlZlBvcyAtIHBvc2l0aW9uIG9mIHRoZSBzdGFydGluZyBwb2ludCBmb3IgaGFsZiBwaXhlbCAKLSAqICAgICAgICAgICAgc2VhcmNoIChzcGVjaWZpZWQgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cykgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGxhbmUuIAotICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCi0gKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWwgTVYgZXN0aW1hdGU7IHR5cGljYWxseSBnZW5lcmF0ZWQgCi0gKiAgICAgICAgICAgIGR1cmluZyBhIHByaW9yIDh4OCBpbnRlZ2VyIHNlYXJjaCwgc3BlY2lmaWVkIGluIHRlcm1zIG9mIAotICogICAgICAgICAgICBoYWxmLXBpeGVsIHVuaXRzLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNSZWZCdWYsIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBTZWFyY2hQb2ludFJlZlBvcywgcFNyY0RzdE1WCi0gKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCi0gICAgT01YX0lOVCBybmRWYWwsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKLSAgICBPTVhfSU5UICpwRHN0U0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAoNi4yLjQuMy4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgbW90aW9uIHNlYXJjaCBmb3IgYSAxNngxNiBtYWNyb2Jsb2NrLiAgU2VsZWN0cyBiZXN0IG1vdGlvbiBzZWFyY2ggCi0gKiBzdHJhdGVneSBmcm9tIGFtb25nIGludGVyLTFNViwgaW50ZXItNE1WLCBhbmQgaW50cmEgbW9kZXMuICBTdXBwb3J0cyAKLSAqIGludGVnZXIgYW5kIGhhbGYgcGl4ZWwgcmVzb2x1dGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGN1cnJlbnQgTUIgaW4gdGhlIAotICogICAgICAgICAgICBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgCi0gKiAgICAgICAgICAgIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCBleHBlY3Qgc291cmNlIGRhdGEgb3V0c2lkZSB0aGUgcmVnaW9uIAotICogICAgICAgICAgICBib3VuZGVkIGJ5IHRoZSBNQiB0byBiZSBhdmFpbGFibGU7IGZvciBleGFtcGxlIGl0IGlzIG5vdCAKLSAqICAgICAgICAgICAgbmVjZXNzYXJ5IGZvciB0aGUgY2FsbGVyIHRvIGd1YXJhbnRlZSB0aGUgYXZhaWxhYmlsaXR5IG9mIAotICogICAgICAgICAgICBwU3JjQ3VyckJ1ZlstU3JjQ3VyclN0ZXBdLCBpLmUuLCB0aGUgcm93IG9mIHBpeGVscyBhYm92ZSB0aGUgTUIgCi0gKiAgICAgICAgICAgIHRvIGJlIHByb2Nlc3NlZC4gCi0gKiAgIHNyY0N1cnJTdGVwIC0gd2lkdGggb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUsIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgcGxhbmUgbG9jYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgc3JjUmVmU3RlcCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSwgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwUmVmUmVjdCAtIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlLCBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gCi0gKiAgICAgICAgICAgIHRoZSBpbWFnZSBvcmlnaW4gCi0gKiAgIHBDdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gCi0gKiAgICAgICAgICAgIHN0cnVjdHVyZTsgbXVzdCBiZSBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCi0gKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAKLSAqICAgcE1CSW5mbyAtIGFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGZvdXIgbmVhcmJ5IE1CczogCi0gKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzBdIC0gcG9pbnRlciB0byBsZWZ0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICAgcE1CSW5mb1sxXSAtIHBvaW50ZXIgdG8gdG9wIE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICAgcE1CSW5mb1syXSAtIHBvaW50ZXIgdG8gdG9wLWxlZnQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzNdIC0gcG9pbnRlciB0byB0b3AtcmlnaHQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIHRvIE5VTEwgaWYgdGhlIAotICogICAgICAgICAgICBjb3JyZXNwb25kaW5nIE1CIGRvZXNuJ3QgZXhpc3QuICBGb3IgZWFjaCBNQiwgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgCi0gKiAgICAgICAgICAgIG1lbWJlcnMgYXJlIHVzZWQ6ICAgIAotICogICAgICAgICAgICAtICAgbWJUeXBlIC0gbWFjcm9ibG9jayB0eXBlLCBlaXRoZXIgT01YX1ZDX0lOVFJBLCBPTVhfVkNfSU5URVIsIG9yIAotICogICAgICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYgCi0gKiAgICAgICAgICAgIC0gICBwTVYwWzJdWzJdIC0gZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3JzOyByZXByZXNlbnRlZCAKLSAqICAgICAgICAgICAgICAgIGluIDEvMiBwaXhlbCB1bml0cyAKLSAqICAgICAgICAgICAgLSAgIHNsaWNlSUQgLSBudW1iZXIgb2YgdGhlIHNsaWNlIHRvIHdoaWNoIHRoZSBNQiBiZWxvbmdzIAotICogICBwU3JjRHN0TUJDdXJyIC0gcG9pbnRlciB0byBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IE1CLiAgCi0gKiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZW50cmllcyBzaG91bGQgYmUgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhlIAotICogICAgICAgICAgICBmdW5jdGlvbjogc2xpY2VJRCAtIHRoZSBudW1iZXIgb2YgdGhlIHNsaWNlIHRoZSB0byB3aGljaCB0aGUgCi0gKiAgICAgICAgICAgIGN1cnJlbnQgTUIgYmVsb25ncy4gIFRoZSBzdHJ1Y3R1cmUgZWxlbWVudHMgY2JweSBhbmQgY2JwYyBhcmUgCi0gKiAgICAgICAgICAgIGlnbm9yZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0TUJDdXJyIC0gcG9pbnRlciB0byB1cGRhdGVkIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIE1CIGFmdGVyIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZC4gIFRoZSAKLSAqICAgICAgICAgICAgZm9sbG93aW5nIHN0cnVjdHVyZSBtZW1iZXJzIGFyZSB1cGRhdGVkIGJ5IHRoZSBNRSBmdW5jdGlvbjogICAKLSAqICAgICAgICAgICAgICAtICBtYlR5cGUgLSBtYWNyb2Jsb2NrIHR5cGU6IE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciAKLSAqICAgICAgICAgICAgICAgICBPTVhfVkNfSU5URVI0Vi4gCi0gKiAgICAgICAgICAgICAgLSAgcE1WMFsyXVsyXSAtIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yczsgcmVwcmVzZW50ZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgdGVybXMgb2YgMS8yIHBlbCB1bml0cy4gCi0gKiAgICAgICAgICAgICAgLSAgcE1WUHJlZFsyXVsyXSAtIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yczsgcmVwcmVzZW50ZWQgCi0gKiAgICAgICAgICAgICAgICAgaW4gdGVybXMgb2YgMS8yIHBlbCB1bml0cy4gCi0gKiAgICAgICAgICAgIFRoZSBzdHJ1Y3R1cmUgbWVtYmVycyBjYnB5IGFuZCBjYnBjIGFyZSBub3QgdXBkYXRlZCBieSB0aGUgZnVuY3Rpb24uIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgbWluaW11bSBTQUQgZm9yIElOVEVSMVYsIG9yIHN1bSBvZiBtaW5pbXVtIFNBRHMgCi0gKiAgICAgICAgICAgIGZvciBJTlRFUjRWIAotICogICBwRHN0QmxvY2tTQUQgLSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIFNBRCB2YWx1ZXMgZm9yIGVhY2ggb2YgdGhlIGZvdXIgCi0gKiAgICAgICAgICAgIDh4OCBsdW1hIGJsb2NrcyBpbiB0aGUgTUIuICBUaGUgYmxvY2sgU0FEcyBhcmUgaW4gc2NhbiBvcmRlciBmb3IgCi0gKiAgICAgICAgICAgIGVhY2ggTUIuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAotICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjQ3VyckJ1ZiwgCi0gKiAgICAgICAgICAgICAgcFNyY1JlZkJ1ZiwgcFJlZlJlY3QsIHBDdXJyUG9pbnRQb3MsIHBNQkludGVyLCBwTUJJbnRyYSwgCi0gKiAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyciwgb3IgcERzdFNBRC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICBPTVhfUzMyIHNyY0N1cnJTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICBPTVhfUzMyIHNyY1JlZlN0ZXAsCi0gICAgY29uc3QgT01YUmVjdCpwUmVmUmVjdCwKLSAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgIHZvaWQgKnBNRVNwZWMsCi0gICAgY29uc3QgT01YVkNNNFAyTUJJbmZvUHRyICpwTUJJbmZvLAotICAgIE9NWFZDTTRQMk1CSW5mbyAqcFNyY0RzdE1CQ3VyciwKLSAgICBPTVhfVTE2ICpwRHN0U0FELAotICAgIE9NWF9VMTYgKnBEc3RCbG9ja1NBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRENUOHg4YmxrICAgKDYuMi40LjQuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIGEgMkQgZm9yd2FyZCBEQ1QgZm9yIGEgc2luZ2xlIDh4OCBibG9jaywgYXMgZGVmaW5lZCBpbiAKLSAqIFtJU08xNDQ5Ni0yXS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBpbnB1dCBidWZmZXI7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgSW5wdXQgdmFsdWVzIChwaXhlbCAKLSAqICAgICAgICAgICAgaW50ZW5zaXRpZXMpIGFyZSB2YWxpZCBpbiB0aGUgcmFuZ2UgWy0yNTUsMjU1XS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgb3V0cHV0IGJ1ZmZlcjsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCByZXR1cm5lZCBpZjoKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RDVDh4OGJsayAoCi0gICAgY29uc3QgT01YX1MxNiAqcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludHJhX0kgICAoNi4yLjQuNC4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgcXVhbnRpemF0aW9uIG9uIGludHJhIGJsb2NrIGNvZWZmaWNpZW50cy4gVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyAKLSAqIGJpdHNfcGVyX3BpeGVsID09IDguIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBpbnRyYSBibG9jayBjb2VmZmljaWVudHM7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpLiAKLSAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiwgCi0gKiAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDUsIGFzIGRlZmluZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgCi0gKiAgICAgICAgICAgIDYuMS4zLjguIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAotICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKHF1YW50aXplZCkgaW50ZXJibG9jayBjb2VmZmljaWVudHMuICAKLSAqICAgICAgICAgICAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLCBBQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCi0gKiAgICAgICAgICAgIGludGVydmFsIFstMTI3LCAxMjddLCBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAotICogICAgICAgICAgICBpbnRlcnZhbCBbMSwgMjU0XS4gIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MCwgQUMgY29lZmZpY2llbnRzIAotICogICAgICAgICAgICBhcmUgc2F0dXJhdGVkIG9uIHRoZSBpbnRlcnZhbCBbLTIwNDcsIDIwNDddLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgYmxvY2tJbmRleCA8IDAgb3IgYmxvY2tJbmRleCA+PSAxMCAKLSAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW50cmFfSSAoCi0gICAgT01YX1MxNiAqcFNyY0RzdCwKLSAgICBPTVhfVTggUVAsCi0gICAgT01YX0lOVCBibG9ja0luZGV4LAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICAgKDYuMi40LjQuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHF1YW50aXphdGlvbiBvbiBhbiBpbnRlciBjb2VmZmljaWVudCBibG9jazsgc3VwcG9ydHMgCi0gKiBiaXRzX3Blcl9waXhlbCA9PSA4LiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgaW50ZXIgYmxvY2sgY29lZmZpY2llbnRzOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLCBhbmQgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChxdWFudGl6ZWQpIGludGVyYmxvY2sgY29lZmZpY2llbnRzLiAgCi0gKiAgICAgICAgICAgIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MSwgQUMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAotICogICAgICAgICAgICBpbnRlcnZhbCBbLTEyNywgMTI3XSwgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKLSAqICAgICAgICAgICAgaW50ZXJ2YWwgWzEsIDI1NF0uICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTAsIEFDIGNvZWZmaWNpZW50cyAKLSAqICAgICAgICAgICAgYXJlIHNhdHVyYXRlZCBvbiB0aGUgaW50ZXJ2YWwgWy0yMDQ3LCAyMDQ3XS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludGVyX0kgKAotICAgIE9NWF9TMTYgKnBTcmNEc3QsCi0gICAgT01YX1U4IFFQLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEgICAoNi4yLjQuNC40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUXVhbnRpemVzIHRoZSBEQ1QgY29lZmZpY2llbnRzLCBpbXBsZW1lbnRzIGludHJhIGJsb2NrIEFDL0RDIGNvZWZmaWNpZW50IAotICogcHJlZGljdGlvbiwgYW5kIHJlY29uc3RydWN0cyB0aGUgY3VycmVudCBpbnRyYSBibG9jayB0ZXh0dXJlIGZvciBwcmVkaWN0aW9uIAotICogb24gdGhlIG5leHQgZnJhbWUuICBRdWFudGl6ZWQgcm93IGFuZCBjb2x1bW4gY29lZmZpY2llbnRzIGFyZSByZXR1cm5lZCBpbiAKLSAqIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGJ1ZmZlcnMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBwaXhlbHMgb2YgY3VycmVudCBpbnRyYSBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIAotICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIgY29udGFpbmluZyAKLSAqICAgICAgICAgICAgKChudW1fbWJfcGVyX3JvdyAqIDIgKyAxKSAqIDgpIGVsZW1lbnRzIG9mIHR5cGUgT01YX1MxNi4gCi0gKiAgICAgICAgICAgIENvZWZmaWNpZW50cyBhcmUgb3JnYW5pemVkIGludG8gYmxvY2tzIG9mIGVpZ2h0IGFzIGRlc2NyaWJlZCAKLSAqICAgICAgICAgICAgYmVsb3cgKEludGVybmFsIFByZWRpY3Rpb24gQ29lZmZpY2llbnQgVXBkYXRlIFByb2NlZHVyZXMpLiAgVGhlIAotICogICAgICAgICAgICBEQyBjb2VmZmljaWVudCBpcyBmaXJzdCwgYW5kIHRoZSByZW1haW5pbmcgYnVmZmVyIGxvY2F0aW9ucyAKLSAqICAgICAgICAgICAgY29udGFpbiB0aGUgcXVhbnRpemVkIEFDIGNvZWZmaWNpZW50cy4gRWFjaCBncm91cCBvZiBlaWdodCByb3cgCi0gKiAgICAgICAgICAgIGJ1ZmZlciBlbGVtZW50cyBjb21iaW5lZCB3aXRoIG9uZSBlbGVtZW50IGVpZ2h0IGVsZW1lbnRzIGFoZWFkIAotICogICAgICAgICAgICBjb250YWlucyB0aGUgY29lZmZpY2llbnQgcHJlZGljdG9ycyBvZiB0aGUgbmVpZ2hib3JpbmcgYmxvY2sgCi0gKiAgICAgICAgICAgIHRoYXQgaXMgc3BhdGlhbGx5IGFib3ZlIG9yIHRvIHRoZSBsZWZ0IG9mIHRoZSBibG9jayBjdXJyZW50bHkgdG8gCi0gKiAgICAgICAgICAgIGJlIGRlY29kZWQuIEEgbmVnYXRpdmUtdmFsdWVkIERDIGNvZWZmaWNpZW50IGluZGljYXRlcyB0aGF0IHRoaXMgCi0gKiAgICAgICAgICAgIG5laWdoYm9yaW5nIGJsb2NrIGlzIG5vdCBJTlRSQS1jb2RlZCBvciBvdXQgb2YgYm91bmRzLCBhbmQgCi0gKiAgICAgICAgICAgIHRoZXJlZm9yZSB0aGUgQUMgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgaW52YWxpZC4gIFBvaW50ZXIgbXVzdCAKLSAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHByZWRpY3Rpb24gY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAKLSAqICAgICAgICAgICAgY29udGFpbmluZyAxNiBlbGVtZW50cyBvZiB0eXBlIE9NWF9TMTYuIENvZWZmaWNpZW50cyBhcmUgCi0gKiAgICAgICAgICAgIG9yZ2FuaXplZCBhcyBkZXNjcmliZWQgaW4gc2VjdGlvbiA2LjIuMi41LiAgUG9pbnRlciBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBTdW1FcnIgLSBwb2ludGVyIHRvIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IEFDIHByZWRpY3Rpb24gaXMgCi0gKiAgICAgICAgICAgIHJlcXVpcmVkOyBBQyBwcmVkaWN0aW9uIGlzIGVuYWJsZWQgaWYgKnBTdW1FcnIgPj0wLCBidXQgdGhlIAotICogICAgICAgICAgICB2YWx1ZSBpcyBub3QgdXNlZCBmb3IgY29lZmZpY2llbnQgcHJlZGljdGlvbiwgaS5lLiwgdGhlIHN1bSBvZiAKLSAqICAgICAgICAgICAgYWJzb2x1dGUgZGlmZmVyZW5jZXMgc3RhcnRzIGZyb20gMCBmb3IgZWFjaCBjYWxsIHRvIHRoaXMgCi0gKiAgICAgICAgICAgIGZ1bmN0aW9uLiAgT3RoZXJ3aXNlIEFDIHByZWRpY3Rpb24gaXMgZGlzYWJsZWQgaWYgKnBTdW1FcnIgPCAwIC4gCi0gKiAgIGJsb2NrSW5kZXggLSBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQgcG9zaXRpb24sIGFzIAotICogICAgICAgICAgICBkZWZpbmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDYuMS4zLjguIAotICogICBjdXJRcCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIG1hY3JvYmxvY2sgdG8gd2hpY2ggdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIGJsb2NrIGJlbG9uZ3MgCi0gKiAgIHBRcEJ1ZiAtIHBvaW50ZXIgdG8gYSAyLWVsZW1lbnQgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBidWZmZXI7IHBRcEJ1ZlswXSAKLSAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSA4eDggCi0gKiAgICAgICAgICAgIGJsb2NrIGxlZnQgb2YgdGhlIGN1cnJlbnQgYmxvY2sgKFFQYSksIGFuZCBwUXBCdWZbMV0gY29udGFpbnMgCi0gKiAgICAgICAgICAgIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgOHg4IGJsb2NrIGFib3ZlIAotICogICAgICAgICAgICB0aGUgY3VycmVudCBibG9jayAoUVBjKS4gIEluIHRoZSBldmVudCB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIAotICogICAgICAgICAgICBibG9jayBpcyBvdXRzaWRlIG9mIHRoZSBWT1AgYm91bmQsIHRoZSBRcCB2YWx1ZSB3aWxsIG5vdCBhZmZlY3QgCi0gKiAgICAgICAgICAgIHRoZSBpbnRyYSBwcmVkaWN0aW9uIHByb2Nlc3MsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIAotICogICAgICAgICAgICBzdWItY2xhdXNlIDcuNC4zLjMsICBBZGFwdGl2ZSBBQyBDb2VmZmljaWVudCBQcmVkaWN0aW9uLiAgCi0gKiAgIHNyY1N0ZXAgLSB3aWR0aCBvZiB0aGUgc291cmNlIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBkc3RTdGVwIC0gd2lkdGggb2YgdGhlIHJlY29uc3RydWN0ZWQgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgCi0gKiAgICAgICAgICAgIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKLSAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCBidWZmZXI7IHBEc3RbMF0gY29udGFpbnMgCi0gKiAgICAgICAgICAgIHRoZSBwcmVkaWN0ZWQgREMgY29lZmZpY2llbnQ7IHRoZSByZW1haW5pbmcgZW50cmllcyBjb250YWluIHRoZSAKLSAqICAgICAgICAgICAgcXVhbnRpemVkIEFDIGNvZWZmaWNpZW50cyAod2l0aG91dCBwcmVkaWN0aW9uKS4gIFRoZSBwb2ludGVyIAotICogICAgICAgICAgICBwRHN0bXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBSZWMgLSBwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIHRleHR1cmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiAKLSAqICAgICAgICAgICAgOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIgCi0gKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyIAotICogICBwUHJlQUNQcmVkaWN0IC0gaWYgcHJlZGljdGlvbiBpcyBlbmFibGVkLCB0aGUgcGFyYW1ldGVyIHBvaW50cyB0byB0aGUgCi0gKiAgICAgICAgICAgIHN0YXJ0IG9mIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgY29lZmZpY2llbnQgZGlmZmVyZW5jZXMgZm9yIAotICogICAgICAgICAgICBWTEMgZW5jb2RpbmcuIFRoZSBlbnRyeSBwUHJlQUNQcmVkaWN0WzBdaW5kaWNhdGVzIHByZWRpY3Rpb24gCi0gKiAgICAgICAgICAgIGRpcmVjdGlvbiBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgYW5kIHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICB2YWx1ZXM6IE9NWF9WQ19OT05FIChwcmVkaWN0aW9uIGRpc2FibGVkKSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAotICogICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwuICBUaGUgZW50cmllcyAKLSAqICAgICAgICAgICAgcFByZUFDUHJlZGljdFsxXS1wUHJlQUNQcmVkaWN0WzddY29udGFpbiBwcmVkaWN0ZWQgQUMgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50cy4gIElmIHByZWRpY3Rpb24gaXMgZGlzYWJsZWQgKCpwU3VtRXJyPDApIHRoZW4gdGhlIAotICogICAgICAgICAgICBjb250ZW50cyBvZiB0aGlzIGJ1ZmZlciBhcmUgdW5kZWZpbmVkIHVwb24gcmV0dXJuIGZyb20gdGhlIAotICogICAgICAgICAgICBmdW5jdGlvbiAKLSAqICAgcFN1bUVyciAtIHBvaW50ZXIgdG8gdGhlIHZhbHVlIG9mIHRoZSBhY2N1bXVsYXRlZCBBQyBjb2VmZmljaWVudCBlcnJvcnMsIAotICogICAgICAgICAgICBpLmUuLCBzdW0gb2YgdGhlIGFic29sdXRlIGRpZmZlcmVuY2VzIGJldHdlZW4gcHJlZGljdGVkIGFuZCAKLSAqICAgICAgICAgICAgdW5wcmVkaWN0ZWQgQUMgY29lZmZpY2llbnRzIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0LCBwUmVjLCAKLSAqICAgICAgICAgcENvZWZCdWZSb3csIHBDb2VmQnVmQ29sLCBwUXBCdWYsIHBQcmVBQ1ByZWRpY3QsIHBTdW1FcnIuIAotICogICAgLSAgICBibG9ja0luZGV4IDwgMCBvciBibG9ja0luZGV4ID49IDEwOyAKLSAqICAgIC0gICAgY3VyUVAgPD0gMCBvciBjdXJRUCA+PSAzMi4gCi0gKiAgICAtICAgIHNyY1N0ZXAsIG9yIGRzdFN0ZXAgPD0gMCBvciBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkOiAuIAotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgOC1ieXRlIGFsaWduZWQ6IAotICogICAgICAgICBwU3JjLCBwUmVjLiAgCi0gKgotICogIE5vdGU6IFRoZSBjb2VmZmljaWVudCBidWZmZXJzIG11c3QgYmUgdXBkYXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIAotICogICAgICAgIHVwZGF0ZSBwcm9jZWR1cmVzIGRlZmluZWQgaW4gc2VjdGlvbiBpbiA2LjIuMi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfVTggKnBSZWMsCi0gICAgT01YX1MxNiAqcFByZWRCdWZSb3csCi0gICAgT01YX1MxNiAqcFByZWRCdWZDb2wsCi0gICAgT01YX1MxNiAqcFByZUFDUHJlZGljdCwKLSAgICBPTVhfSU5UICpwU3VtRXJyLAotICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKLSAgICBPTVhfVTggY3VyUXAsCi0gICAgY29uc3QgT01YX1U4ICpwUXBCdWYsCi0gICAgT01YX0lOVCBzcmNTdGVwLAotICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyICAgKDYuMi40LjQuNSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEltcGxlbWVudHMgRENULCBhbmQgcXVhbnRpemVzIHRoZSBEQ1QgY29lZmZpY2llbnRzIG9mIHRoZSBpbnRlciBibG9jayAKLSAqIHdoaWxlIHJlY29uc3RydWN0aW5nIHRoZSB0ZXh0dXJlIHJlc2lkdWFsLiBUaGVyZSBpcyBubyBib3VuZGFyeSBjaGVjayBmb3IgCi0gKiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLXBvaW50ZXIgdG8gdGhlIHJlc2lkdWFscyB0byBiZSBlbmNvZGVkOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gCi0gKiAgICAgICAgICAgIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIuIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IAotICogICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLCBhbmQgCi0gKiAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnRzIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBwUmVjIC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCB0ZXh0dXJlIHJlc2lkdWFsczsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBlaXRoZXIgTlVMTCBvciAKLSAqICAgICAgICAgbm90IDE2LWJ5dGUgYWxpZ25lZDogCi0gKiAgICAgICAgICAgIC0gcFNyYyAKLSAqICAgICAgICAgICAgLSBwRHN0Ci0gKiAgICAgICAgICAgIC0gcFJlYwotICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIgKAotICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfUzE2ICpwUmVjLAotICAgIE9NWF9VOCBRUCwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICAgKDYuMi40LjUuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHppZ3phZyBzY2FuIGFuZCBWTEMgZW5jb2Rpbmcgb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyBmb3Igb25lIAotICogaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSBwcm92aWRlZCAKLSAqIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAotICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIkludHJhIERDIAotICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZyIuICAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuIAotICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAotICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24sIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHRoZSB6aWd6YWcgCi0gKiAgICAgICAgICAgIHNjYW4gcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX05PTkUgLSBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb24uICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAotICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCi0gKiAgICAgICAgICAgIGVuY29kZWQgCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlKSBvZiB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsIHNvIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgCi0gKiAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYuIAotICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAotICogICAgLSAgICBQcmVkRGlyIGlzIG5vdCBvbmUgb2Y6IE9NWF9WQ19OT05FLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCi0gKiAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gCi0gKiAgICAtICAgIFZpZGVvQ29tcCBpcyBub3Qgb25lIGNvbXBvbmVudCBvZiBlbnVtIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMgKAotICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAotICAgIE9NWF9VOCBwcmVkRGlyLAotICAgIE9NWF9VOCBwYXR0ZXJuLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKLSAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgKDYuMi40LjUuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHppZ3phZyBzY2FuIGFuZCBWTEMgZW5jb2Rpbmcgb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyBmb3Igb25lIAotICogaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSBwcm92aWRlZCAKLSAqIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAotICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIEludHJhIERDIAotICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZy4gIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4gCi0gKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCi0gKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgdGhlIHppZ3phZyAKLSAqICAgICAgICAgICAgc2NhbiBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAotICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbi4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb24uICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKLSAqICAgICAgICAgICAgZW5jb2RlZCAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwgc28gCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKLSAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZi4gCi0gKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCi0gKiAgICAtICAgIFByZWREaXIgaXMgbm90IG9uZSBvZjogT01YX1ZDX05PTkUsIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKLSAqICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAKLSAqICAgIC0gICAgVmlkZW9Db21wIGlzIG5vdCBvbmUgY29tcG9uZW50IG9mIGVudW0gT01YVkNNNFAyVmlkZW9Db21wb25lbnQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAoCi0gICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCi0gICAgT01YX1U4IHByZWREaXIsCi0gICAgT01YX1U4IHBhdHRlcm4sCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIgICAoNi4yLjQuNS4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nIGZvciBvbmUgaW50ZXIgYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCi0gKiAgICAgICAgICAgIHN0cmVhbSAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcgCi0gKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCi0gKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKLSAqICAgICAgICAgICAgZW5jb2RlZCAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCBzbyB0aGF0IAotICogICAgICAgICAgICBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50cyAKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVyczogaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgCi0gKiAgICAgICAgICAgICAgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmIAotICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIgKAotICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAotICAgIE9NWF9VOCBwYXR0ZXJuLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlTVYgICAoNi4yLjQuNS40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUHJlZGljdHMgYSBtb3Rpb24gdmVjdG9yIGZvciB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLCBlbmNvZGVzIHRoZSAKLSAqIGRpZmZlcmVuY2UsIGFuZCB3cml0ZXMgdGhlIG91dHB1dCB0byB0aGUgc3RyZWFtIGJ1ZmZlci4gVGhlIGlucHV0IE1WcyAKLSAqIHBNVkN1ck1CLCBwU3JjTVZMZWZ0TUIsIHBTcmNNVlVwcGVyTUIsIGFuZCBwU3JjTVZVcHBlclJpZ2h0TUIgc2hvdWxkIGxpZSAKLSAqIHdpdGhpbiB0aGUgcmFuZ2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5wdXQgcGFyYW1ldGVyIGZjb2RlRm9yd2FyZCwgYXMgCi0gKiBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjMuICBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgCi0gKiBzdXBlcnNldCBvZiB0aGUgZnVuY3Rpb25hbGl0eSBhc3NvY2lhdGVkIHdpdGggdGhlIGZ1bmN0aW9uIAotICogb214VkNNNFAyX0ZpbmRNVnByZWQuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIGluZGV4IG9mIHRoZSBmaXJzdCBmcmVlIChuZXh0IGF2YWlsYWJsZSkgYml0IGluIHRoZSBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ1ZmZlciByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbSwgdmFsaWQgaW4gdGhlIHJhbmdlIDAgdG8gNy4gCi0gKiAgIHBNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgdmFsdWUgb2YgCi0gKiAgICAgICAgICAgIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKLSAqICAgcFNyY01WTGVmdE1CIC0gcG9pbnRlciB0byB0aGUgc291cmNlIGxlZnQgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIAotICogICAgICAgICAgICB2YWx1ZSBvZiAgTlVMTGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCi0gKiAgIHBTcmNNVlVwcGVyTUIgLSBwb2ludGVyIHRvIHNvdXJjZSB1cHBlciBtYWNyb2Jsb2NrIG1vdGlvbiB2ZWN0b3I7IGEgCi0gKiAgICAgICAgICAgIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKLSAqICAgcFNyY01WVXBwZXJSaWdodE1CIC0gcG9pbnRlciB0byBzb3VyY2UgdXBwZXIgcmlnaHQgTUIgbW90aW9uIHZlY3RvcjsgYSAKLSAqICAgICAgICAgICAgdmFsdWUgb2YgTlVMTCBpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAotICogICBmY29kZUZvcndhcmQgLSBhbiBpbnRlZ2VyIHdpdGggdmFsdWVzIGZyb20gMSB0byA3OyB1c2VkIGluIGVuY29kaW5nIAotICogICAgICAgICAgICBtb3Rpb24gdmVjdG9ycyByZWxhdGVkIHRvIHNlYXJjaCByYW5nZSwgYXMgZGVzY3JpYmVkIGluIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMy4gCi0gKiAgIE1CVHlwZSAtIG1hY3JvIGJsb2NrIHR5cGUsIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDUgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gdXBkYXRlZCBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIHVwZGF0ZWQgaW5kZXggb2YgdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBwb3NpdGlvbiBpbiBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ1ZmZlciByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAotICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcE1WQ3VyTUIgCi0gKiAgICAtICAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAotICogICAgLSAgICBmY29kZUZvcndhcmQgPD0gMCwgb3IgZmNvZGVGb3J3YXJkID4gNywgb3IgTUJUeXBlIDwgMC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZU1WICgKLSAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZDdXJNQiwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvcipwU3JjTVZMZWZ0TUIsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVlVwcGVyTUIsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVlVwcGVyUmlnaHRNQiwKLSAgICBPTVhfSU5UIGZjb2RlRm9yd2FyZCwKLSAgICBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZSBNQlR5cGUKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AgICAoNi4yLjUuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogRGVjb2RlcyBhbmQgcGFkcyB0aGUgZm91ciBtb3Rpb24gdmVjdG9ycyBhc3NvY2lhdGVkIHdpdGggYSBub24taW50cmEgUC1WT1AgCi0gKiBtYWNyb2Jsb2NrLiAgRm9yIG1hY3JvYmxvY2tzIG9mIHR5cGUgT01YX1ZDX0lOVEVSNFYsIHRoZSBvdXRwdXQgTVYgaXMgCi0gKiBwYWRkZWQgYXMgc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4xLjYuIE90aGVyd2lzZSwgZm9yIAotICogbWFjcm9ibG9ja3Mgb2YgdHlwZXMgb3RoZXIgdGhhbiBPTVhfVkNfSU5URVI0ViwgdGhlIGRlY29kZWQgTVYgaXMgY29waWVkIHRvIAotICogYWxsIGZvdXIgb3V0cHV0IE1WIGJ1ZmZlciBlbnRyaWVzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAotICogICAgICAgICAgICBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddLiAKLSAqICAgcFNyY01WTGVmdE1CLCBwU3JjTVZVcHBlck1CLCBhbmQgcFNyY01WVXBwZXJSaWdodE1CIC0gcG9pbnRlcnMgdG8gdGhlIAotICogICAgICAgICAgICBtb3Rpb24gdmVjdG9yIGJ1ZmZlcnMgb2YgdGhlIG1hY3JvYmxvY2tzIHNwZWNpYWxseSBhdCB0aGUgbGVmdCwgCi0gKiAgICAgICAgICAgIHVwcGVyLCBhbmQgdXBwZXItcmlnaHQgc2lkZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLCAKLSAqICAgICAgICAgICAgcmVzcGVjdGl2ZWx5OyBhIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAgTm90ZTogCi0gKiAgICAgICAgICAgIEFueSBuZWlnaGJvcmhvb2QgbWFjcm9ibG9jayBvdXRzaWRlIHRoZSBjdXJyZW50IFZPUCBvciB2aWRlbyAKLSAqICAgICAgICAgICAgcGFja2V0IG9yIG91dHNpZGUgdGhlIGN1cnJlbnQgR09CICh3aGVuIHNob3J0X3ZpZGVvX2hlYWRlciBpcyAKLSAqICAgICAgICAgICAgIDEgKSBmb3Igd2hpY2ggZ29iX2hlYWRlcl9lbXB0eSBpcyAgMCAgaXMgdHJlYXRlZCBhcyAKLSAqICAgICAgICAgICAgdHJhbnNwYXJlbnQsIGFjY29yZGluZyB0byBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuNS4gCi0gKiAgIGZjb2RlRm9yd2FyZCAtIGEgY29kZSBlcXVhbCB0byB2b3BfZmNvZGVfZm9yd2FyZCBpbiBNUEVHLTQgYml0IHN0cmVhbSAKLSAqICAgICAgICAgICAgc3ludGF4IAotICogICBNQlR5cGUgLSB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLiBJZiBNQlR5cGUgaXMgbm90IGVxdWFsIHRvIAotICogICAgICAgICAgICBPTVhfVkNfSU5URVI0ViwgdGhlIGRlc3RpbmF0aW9uIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIGlzIHN0aWxsIAotICogICAgICAgICAgICBmaWxsZWQgd2l0aCB0aGUgc2FtZSBkZWNvZGVkIHZlY3Rvci4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdE1WQ3VyTUIgLSBwb2ludGVyIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBmb3IgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIG1hY3JvYmxvY2s7IGNvbnRhaW5zIGZvdXIgZGVjb2RlZCBtb3Rpb24gdmVjdG9ycyAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3RNVkN1ck1CIAotICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCi0gKiAgICAtICAgIGZjb2RlRm9yd2FyZCBleGNlZWRzICgwLDddCi0gKiAgICAtICAgIE1CVHlwZSBsZXNzIHRoYW4gemVybwotICogICAgLSAgICBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNVkxlZnRNQiwKLSAgICBPTVhWQ01vdGlvblZlY3RvcipwU3JjTVZVcHBlck1CLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlclJpZ2h0TUIsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IqcERzdE1WQ3VyTUIsCi0gICAgT01YX0lOVCBmY29kZUZvcndhcmQsCi0gICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgTUJUeXBlCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICg2LjIuNS4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyAKLSAqIGZvciBvbmUgaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSAKLSAqIHByb3ZpZGVkIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAotICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIEludHJhIERDIAotICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZy4gIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSAKLSAqICAgICAgICAgICAgYml0c3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBieXRlIHJlZmVyZW5jZWQgCi0gKiAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgdmFsaWQgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMC03XS4gCi0gKiAgICAgICAgICAgIEJpdCBQb3NpdGlvbiBpbiBvbmUgYnl0ZTogIHxNb3N0ICAgICAgTGVhc3R8IAotICogICAgICAgICAgICAgICAgICAgICpwQml0T2Zmc2V0ICAgICAgICB8MCAxIDIgMyA0IDUgNiA3fCAKLSAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uOyB1c2VkIHRvIHNlbGVjdCB0aGUgemlnemFnIHNjYW4gCi0gKiAgICAgICAgICAgIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZDsgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb247IAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2NhbjsgCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb247IAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKLSAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSBvciBjaHJvbWluYW5jZSkgb2YgdGhlIAotICogICAgICAgICAgICBjdXJyZW50IGJsb2NrIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzdWNoIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudCBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QKLSAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQotICogICAgLSAgICBwcmVEaXIgZXhjZWVkcyBbMCwyXQotICogICAgLSAgICBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZCAKLSAqICAgIE9NWF9TdHNfRXJyIC0gaWY6Ci0gKiAgICAtICAgIEluIERlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBkY19zaXplID4gMTIgCi0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiBtYXJrIGJpdHMgZXF1YWxzIHplcm8gCi0gKiAgICAtICAgIElsbGVnYWwgc3RyZWFtIGVuY291bnRlcmVkOyBjb2RlIGNhbm5vdCBiZSBsb2NhdGVkIGluIFZMQyB0YWJsZSAKLSAqICAgIC0gICAgRm9yYmlkZGVuIGNvZGUgZW5jb3VudGVyZWQgaW4gdGhlIFZMQyBGTEMgdGFibGUuIAotICogICAgLSAgICBUaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX1U4IHByZWREaXIsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAoNi4yLjUuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgCi0gKiBmb3Igb25lIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgCi0gKiBwcm92aWRlZCBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKLSAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKLSAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgCi0gKiAgICAgICAgICAgIGJpdHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgYnl0ZSByZWZlcmVuY2VkIAotICogICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uICBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIHZhbGlkIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAtN10uIEJpdCBQb3NpdGlvbiBpbiBvbmUgYnl0ZTogIHxNb3N0IExlYXN0fCAqcEJpdE9mZnNldCAKLSAqICAgICAgICAgICAgfDAgMSAyIDMgNCA1IDYgN3wgCi0gKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjsgdXNlZCB0byBzZWxlY3QgdGhlIHppZ3phZyBzY2FuIAotICogICAgICAgICAgICBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IE9NWF9WQ19OT05FIC0gQUMgCi0gKiAgICAgICAgICAgIHByZWRpY3Rpb24gbm90IHVzZWQ7IHBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uOyBwZXJmb3JtcyAKLSAqICAgICAgICAgICAgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuOyBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCAKLSAqICAgICAgICAgICAgcHJlZGljdGlvbjsgcGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQgc3VjaCAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHN1Y2ggdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdCwgCi0gKiAgICAgICAgICAgICAgb3IgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddLCBwcmVEaXIgZXhjZWVkcyBbMCwyXSwgb3IgcERzdCBpcyAKLSAqICAgICAgICAgICAgICBub3QgNC1ieXRlIGFsaWduZWQgCi0gKiAgICBPTVhfU3RzX0VyciBJbiBEZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgZGNfc2l6ZSA+IDEyIEF0IGxlYXN0IG9uZSBvZiAKLSAqICAgICAgICAgICAgICBtYXJrIGJpdHMgZXF1YWxzIHplcm8gSWxsZWdhbCBzdHJlYW0gZW5jb3VudGVyZWQ7IGNvZGUgY2Fubm90IAotICogICAgICAgICAgICAgIGJlIGxvY2F0ZWQgaW4gVkxDIHRhYmxlIEZvcmJpZGRlbiBjb2RlIGVuY291bnRlcmVkIGluIHRoZSBWTEMgCi0gKiAgICAgICAgICAgICAgRkxDIHRhYmxlIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfVTggcHJlZERpciwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlciAgICg2LjIuNS4yLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRlci1jb2RlZCBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgbmV4dCBhdmFpbGFibGUgYml0IGluIHRoZSBjdXJyZW50IHN0cmVhbSAKLSAqICAgICAgICAgICAgYnl0ZSByZWZlcmVuY2VkIGJ5ICpwcEJpdFN0cmVhbS4gVGhlIHBhcmFtZXRlciAqcEJpdE9mZnNldCBpcyAKLSAqICAgICAgICAgICAgdmFsaWQgd2l0aGluIHRoZSByYW5nZSBbMC03XS4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQgc3VjaCAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZGVjb2Rpbmcgc3VjaCB0aGF0IGl0IHBvaW50cyAKLSAqICAgICAgICAgICAgdG8gdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBpbiB0aGUgc3RyZWFtIGJ5dGUgcmVmZXJlbmNlZCBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QKLSAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQKLSAqICAgIC0gICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCi0gKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvciwgaWY6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBtYXJrIGJpdCBpcyBlcXVhbCB0byB6ZXJvIAotICogICAgLSAgICBFbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIHN0cmVhbSBjb2RlIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBWTEMgdGFibGUgCi0gKiAgICAtICAgIEVuY291bnRlcmVkIGFuIGlsbGVnYWwgY29kZSBpbiB0aGUgVkxDIEZMQyB0YWJsZSAKLSAqICAgIC0gICAgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSAgICg2LjIuNS4zLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyB0aGUgc2Vjb25kIGludmVyc2UgcXVhbnRpemF0aW9uIG1vZGUgb24gYW4gaW50cmEvaW50ZXIgY29kZWQgCi0gKiBibG9jay4gU3VwcG9ydHMgYml0c19wZXJfcGl4ZWwgPSA4LiBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgY2xpcHBlZCB0byAKLSAqIHRoZSByYW5nZSBbLTIwNDgsIDIwNDddLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgKHF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpIAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSBvZiB0aGUgY3VycmVudCBibG9jay4gVGFrZXMgb25lIG9mIHRoZSAKLSAqICAgICAgICAgICAgZm9sbG93aW5nIGZsYWdzOiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgKGludHJhIAotICogICAgICAgICAgICB2ZXJzaW9uIG9ubHkpLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyIAotICogICAgICAgICAgICAoaW50cmEgdmVyc2lvbiBvbmx5KS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jayAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyAKLSAqICAgICAgICAgICAgICB0cnVlOiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMIAotICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49MzEgCi0gKiAgICAtICAgIHZpZGVvQ29tcCBpcyBuZWl0aGVyIE9NWF9WQ19MVU1JTkFOQ0Ugbm9yIE9NWF9WQ19DSFJPTUlOQU5DRS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSAoCi0gICAgT01YX1MxNiAqcFNyY0RzdCwKLSAgICBPTVhfSU5UIFFQLAotICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcCwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSAgICg2LjIuNS4zLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyB0aGUgc2Vjb25kIGludmVyc2UgcXVhbnRpemF0aW9uIG1vZGUgb24gYW4gaW50cmEvaW50ZXIgY29kZWQgCi0gKiBibG9jay4gU3VwcG9ydHMgYml0c19wZXJfcGl4ZWwgPSA4LiBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgY2xpcHBlZCB0byAKLSAqIHRoZSByYW5nZSBbLTIwNDgsIDIwNDddLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgKHF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpIAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSBvZiB0aGUgY3VycmVudCBibG9jay4gVGFrZXMgb25lIG9mIHRoZSAKLSAqICAgICAgICAgICAgZm9sbG93aW5nIGZsYWdzOiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgKGludHJhIAotICogICAgICAgICAgICB2ZXJzaW9uIG9ubHkpLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyIAotICogICAgICAgICAgICAoaW50cmEgdmVyc2lvbiBvbmx5KS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jayAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyAKLSAqICAgICAgICAgICAgICB0cnVlOiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMIAotICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49MzEgCi0gKiAgICAtICAgIHZpZGVvQ29tcCBpcyBuZWl0aGVyIE9NWF9WQ19MVU1JTkFOQ0Ugbm9yIE9NWF9WQ19DSFJPTUlOQU5DRS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSAoCi0gICAgT01YX1MxNiAqcFNyY0RzdCwKLSAgICBPTVhfSU5UIFFQCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgICAoNi4yLjUuNC4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogRGVjb2RlcyB0aGUgSU5UUkEgYmxvY2sgY29lZmZpY2llbnRzLiBJbnZlcnNlIHF1YW50aXphdGlvbiwgaW52ZXJzZWx5IAotICogemlnemFnIHBvc2l0aW9uaW5nLCBhbmQgSURDVCwgd2l0aCBhcHByb3ByaWF0ZSBjbGlwcGluZyBvbiBlYWNoIHN0ZXAsIGFyZSAKLSAqIHBlcmZvcm1lZCBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyBhcmUgdGhlbiBwbGFjZWQgaW4gdGhlIG91dHB1dCAKLSAqIGZyYW1lL3BsYW5lIG9uIGEgcGl4ZWwgYmFzaXMuICBOb3RlOiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCBvbmx5IHdoZW4gCi0gKiBhdCBsZWFzdCBvbmUgbm9uLXplcm8gQUMgY29lZmZpY2llbnQgb2YgY3VycmVudCBibG9jayBleGlzdHMgaW4gdGhlIGJpdCAKLSAqIHN0cmVhbS4gVGhlIERDIG9ubHkgY29uZGl0aW9uIHdpbGwgYmUgaGFuZGxlZCBpbiBhbm90aGVyIGZ1bmN0aW9uLiAKLSAqCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKLSAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIAotICogICAgICAgICAgICBidWZmZXIuIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddLiAKLSAqICAgc3RlcCAtIHdpZHRoIG9mIHRoZSBkZXN0aW5hdGlvbiBwbGFuZSAKLSAqICAgcENvZWZCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gCi0gKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBDb2VmQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBjdXJRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIG1hY3JvYmxvY2sgd2hpY2ggdGhlIGN1cnJlbnQgYmxvY2sgCi0gKiAgICAgICAgICAgIGJlbG9uZ3MgdG8gCi0gKiAgIHBRUEJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyIAotICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uIGFzIAotICogICAgICAgICAgICBkZWZpbmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDYuMS4zLjgsIEZpZ3VyZSA2LTUuIAotICogICBpbnRyYURDVkxDIC0gYSBjb2RlIGRldGVybWluZWQgYnkgaW50cmFfZGNfdmxjX3RociBhbmQgUVAuIFRoaXMgYWxsb3dzIGEgCi0gKiAgICAgICAgICAgIG1lY2hhbmlzbSB0byBzd2l0Y2ggYmV0d2VlbiB0d28gVkxDIGZvciBjb2Rpbmcgb2YgSW50cmEgREMgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyBhcyBwZXIgW0lTTzE0NDk2LTJdLCBUYWJsZSA2LTIxLiAKLSAqICAgQUNQcmVkRmxhZyAtIGEgZmxhZyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgKG9mIGx1bWluYW5jZSkgaW5kaWNhdGluZyBpZiAKLSAqICAgICAgICAgICAgdGhlIGFjIGNvZWZmaWNpZW50cyBvZiB0aGUgZmlyc3Qgcm93IG9yIGZpcnN0IGNvbHVtbiBhcmUgCi0gKiAgICAgICAgICAgIGRpZmZlcmVudGlhbGx5IGNvZGVkIGZvciBpbnRyYSBjb2RlZCBtYWNyb2Jsb2NrLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKLSAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgZGVzdGluYXRpb24gcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiAKLSAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcENvZWZCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIuIAotICogICBwQ29lZkJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAgTm90ZTogCi0gKiAgICAgICAgICAgIFRoZSBjb2VmZmljaWVudCBidWZmZXJzIG11c3QgYmUgdXBkYXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIAotICogICAgICAgICAgICB1cGRhdGUgcHJvY2VkdXJlIGRlZmluZWQgaW4gc2VjdGlvbiA2LjIuMi4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcENvZWZCdWZSb3csIHBDb2VmQnVmQ29sLCAKLSAqICAgICAgICAgcFFQQnVmLCBwRHN0LiAKLSAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSAKLSAqICAgIC0gICAgY3VyUVAgZXhjZWVkcyAoMSwgMzEpCi0gKiAgICAtICAgIGJsb2NrSW5kZXggZXhjZWVkcyBbMCw1XQotICogICAgLSAgICBzdGVwIGlzIG5vdCB0aGUgbXVsdGlwbGUgb2YgOAotICogICAgLSAgICBhIHBvaW50ZXIgYWxpZ25tZW50IHJlcXVpcmVtZW50IHdhcyB2aW9sYXRlZC4gCi0gKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvci4gUmVmZXIgdG8gT01YX1N0c19FcnIgb2YgRGVjb2RlVkxDWmlnemFnX0ludHJhLiAgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBzdGVwLAotICAgIE9NWF9TMTYgKnBDb2VmQnVmUm93LAotICAgIE9NWF9TMTYgKnBDb2VmQnVmQ29sLAotICAgIE9NWF9VOCBjdXJRUCwKLSAgICBjb25zdCBPTVhfVTggKnBRUEJ1ZiwKLSAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCi0gICAgT01YX0lOVCBpbnRyYURDVkxDLAotICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAgICg2LjIuNS40LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBEZWNvZGVzIHRoZSBJTlRFUiBibG9jayBjb2VmZmljaWVudHMuIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSAKLSAqIHF1YW50aXphdGlvbiwgaW52ZXJzZSB6aWd6YWcgcG9zaXRpb25pbmcsIGFuZCBJRENUICh3aXRoIGFwcHJvcHJpYXRlIAotICogY2xpcHBpbmcgb24gZWFjaCBzdGVwKSBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyAocmVzaWR1YWxzKSBhcmUgCi0gKiBwbGFjZWQgaW4gYSBjb250aWd1b3VzIGFycmF5IG9mIDY0IGVsZW1lbnRzLiBGb3IgSU5URVIgYmxvY2ssIHRoZSBvdXRwdXQgCi0gKiBidWZmZXIgaG9sZHMgdGhlIHJlc2lkdWFscyBmb3IgZnVydGhlciByZWNvbnN0cnVjdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKLSAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIAotICogICAgICAgICAgICBidWZmZXIuIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluIFswLTddIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCi0gKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVjb2RlZCByZXNpZHVhbCBidWZmZXIgKGEgY29udGlndW91cyBhcnJheSBvZiA2NCAKLSAqICAgICAgICAgICAgZWxlbWVudHMgb2YgT01YX1MxNiBkYXRhIHR5cGUpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOdWxsOiAKLSAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCAsIHBEc3QgCi0gKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KLSAqICAgIC0gICAgUVAgPD0gMC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCAKLSAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yLiBSZWZlciB0byBPTVhfU3RzX0VyciBvZiBEZWNvZGVWTENaaWd6YWdfSW50ZXIgLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX0lOVCBRUCwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSAgICg2LjIuNS40LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhZGFwdGl2ZSBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uIGZvciBhbiBpbnRyYSBibG9jay4gIFByaW9yIAotICogdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHByZWRpY3Rpb24gZGlyZWN0aW9uIChwcmVkRGlyKSBzaG91bGQgYmUgc2VsZWN0ZWQgYXMgCi0gKiBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjMuMS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgcXVhbnRpemVkIAotICogICAgICAgICAgICBjb2VmZmljaWVudCByZXNpZHVhbHMgKFBRRikgb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgCi0gKiAgICAgICAgICAgIHNhdHVyYXRlZCB0byB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCi0gKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIAotICogICAgICAgICAgICBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIGN1clFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgY3VycmVudCBibG9jay4gY3VyUVAgbWF5IGVxdWFsIHRvIAotICogICAgICAgICAgICBwcmVkUVAgZXNwZWNpYWxseSB3aGVuIHRoZSBjdXJyZW50IGJsb2NrIGFuZCB0aGUgcHJlZGljdG9yIGJsb2NrIAotICogICAgICAgICAgICBhcmUgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4gCi0gKiAgIHByZWRRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jayAKLSAqICAgcHJlZERpciAtIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lIG9mIHRoZSAKLSAqICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczogT01YX1ZDX0hPUklaT05UQUwgLSBwcmVkaWN0IGhvcml6b250YWxseSAKLSAqICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMIC0gcHJlZGljdCB2ZXJ0aWNhbGx5IAotICogICBBQ1ByZWRGbGFnIC0gYSBmbGFnIGluZGljYXRpbmcgaWYgQUMgcHJlZGljdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkLiBJdCAKLSAqICAgICAgICAgICAgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQgc3RyZWFtIHN5bnRheCBvZiBNUEVHLTQgCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKLSAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgcXVhbnRpemVkIAotICogICAgICAgICAgICBjb2VmZmljaWVudHMgKFFGKSBvZiB0aGUgY3VycmVudCBibG9jayAKLSAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IHJvdyBidWZmZXIgCi0gKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyICBOb3RlOiAKLSAqICAgICAgICAgICAgQnVmZmVyIHVwZGF0ZTogVXBkYXRlIHRoZSBBQyBwcmVkaWN0aW9uIGJ1ZmZlciAoYm90aCByb3cgYW5kIAotICogICAgICAgICAgICBjb2x1bW4gYnVmZmVyKS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMsIGlmOgotICogICAgICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgICBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wuIAotICogICAgICAgIC0gICAgY3VyUVAgPD0gMCwgCi0gKiAgICAgICAgLSAgICBwcmVkUVAgPD0gMCwgCi0gKiAgICAgICAgLSAgICBjdXJRUCA+MzEsIAotICogICAgICAgIC0gICAgcHJlZFFQID4gMzEsIAotICogICAgICAgIC0gICAgcHJlRGlyIGV4Y2VlZHMgWzEsMl0KLSAqICAgICAgICAtICAgIHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEgKAotICAgIE9NWF9TMTYgKnBTcmNEc3QsCi0gICAgT01YX1MxNiAqcFByZWRCdWZSb3csCi0gICAgT01YX1MxNiAqcFByZWRCdWZDb2wsCi0gICAgT01YX0lOVCBjdXJRUCwKLSAgICBPTVhfSU5UIHByZWRRUCwKLSAgICBPTVhfSU5UIHByZWREaXIsCi0gICAgT01YX0lOVCBBQ1ByZWRGbGFnLAotICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrICAgKDYuMi41LjUuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIG1vdGlvbiBjb21wZW5zYXRpb24gcHJlZGljdGlvbiBmb3IgYW4gOHg4IGJsb2NrIHVzaW5nIAotICogaW50ZXJwb2xhdGlvbiBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjIuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLiAKLSAqICAgc3JjU3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBkc3RTdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIAotICogICAgICAgICAgICBkZXN0aW5hdGlvbiBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgcFNyY1Jlc2lkdWUgLSBwb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDE2LWJpdCBwcmVkaWN0aW9uIAotICogICAgICAgICAgICByZXNpZHVhbHM7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiBJZiB0aGUgcG9pbnRlciBpcyBOVUxMLCB0aGVuIAotICogICAgICAgICAgICBubyBwcmVkaWN0aW9uIGlzIGRvbmUsIG9ubHkgbW90aW9uIGNvbXBlbnNhdGlvbiwgaS5lLiwgdGhlIGJsb2NrIAotICogICAgICAgICAgICBpcyBtb3ZlZCB3aXRoIGludGVycG9sYXRpb24uIAotICogICBwcmVkaWN0VHlwZSAtIGJpbGluZWFyIGludGVycG9sYXRpb24gdHlwZSwgYXMgZGVmaW5lZCBpbiBzZWN0aW9uIAotICogICAgICAgICAgICA2LjIuMS4yLiAKLSAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAgSWYgCi0gKiAgICAgICAgICAgIHByZWRpY3Rpb24gcmVzaWR1YWxzIGFyZSBhZGRlZCB0aGVuIG91dHB1dCBpbnRlbnNpdGllcyBhcmUgCi0gKiAgICAgICAgICAgIGNsaXBwZWQgdG8gdGhlIHJhbmdlIFswLDI1NV0uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwU3JjUmVzaWR1ZSBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjIG9yIHBEc3QuIAotICogICAgLSAgICBlaXRoZXIgc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBpbnZhbGlkIHR5cGUgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIHByZWRpY3RUeXBlLiAKLSAqICAgIC0gICAgdGhlIHBhcmFtZXRlciBybmRWYWwgaXMgbm90IGVxdWFsIGVpdGhlciB0byAwIG9yIDEuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfSU5UIHNyY1N0ZXAsCi0gICAgY29uc3QgT01YX1MxNiAqcFNyY1Jlc2lkdWUsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICBPTVhfSU5UIHByZWRpY3RUeXBlLAotICAgIE9NWF9JTlQgcm5kVmFsCi0pOwotCi0KLQotLyogNi4zLjEuMSBJbnRyYSAxNngxNiBQcmVkaWN0aW9uIE1vZGVzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIGludHJhXzE2eDE2IG1hY3JvYmxvY2sgcHJlZGljdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ18xNlgxNl9WRVJUID0gMCwgIC8qKiBJbnRyYV8xNngxNl9WZXJ0aWNhbCAqLwotICAgIE9NWF9WQ18xNlgxNl9IT1IgPSAxLCAgIC8qKiBJbnRyYV8xNngxNl9Ib3Jpem9udGFsICovCi0gICAgT01YX1ZDXzE2WDE2X0RDID0gMiwgICAgLyoqIEludHJhXzE2eDE2X0RDICovCi0gICAgT01YX1ZDXzE2WDE2X1BMQU5FID0gMyAgLyoqIEludHJhXzE2eDE2X1BsYW5lICovIAotfSBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlOwotCi0KLQotLyogNi4zLjEuMiBJbnRyYSA0eDQgUHJlZGljdGlvbiBNb2RlcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBpbnRyYV80eDQgbWFjcm9ibG9jayBwcmVkaWN0aW9uIG1vZGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDXzRYNF9WRVJUID0gMCwgICAgIC8qKiBJbnRyYV80eDRfVmVydGljYWwgKi8KLSAgICBPTVhfVkNfNFg0X0hPUiA9IDEsICAgICAgLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsICovCi0gICAgT01YX1ZDXzRYNF9EQyA9IDIsICAgICAgIC8qKiBJbnRyYV80eDRfREMgKi8KLSAgICBPTVhfVkNfNFg0X0RJQUdfREwgPSAzLCAgLyoqIEludHJhXzR4NF9EaWFnb25hbF9Eb3duX0xlZnQgKi8KLSAgICBPTVhfVkNfNFg0X0RJQUdfRFIgPSA0LCAgLyoqIEludHJhXzR4NF9EaWFnb25hbF9Eb3duX1JpZ2h0ICovCi0gICAgT01YX1ZDXzRYNF9WUiA9IDUsICAgICAgIC8qKiBJbnRyYV80eDRfVmVydGljYWxfUmlnaHQgKi8KLSAgICBPTVhfVkNfNFg0X0hEID0gNiwgICAgICAgLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsX0Rvd24gKi8KLSAgICBPTVhfVkNfNFg0X1ZMID0gNywgICAgICAgLyoqIEludHJhXzR4NF9WZXJ0aWNhbF9MZWZ0ICovCi0gICAgT01YX1ZDXzRYNF9IVSA9IDggICAgICAgIC8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9VcCAqLyAKLX0gT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGU7Ci0KLQotCi0vKiA2LjMuMS4zIENocm9tYSBQcmVkaWN0aW9uIE1vZGVzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIGludHJhIGNocm9tYSBwcmVkaWN0aW9uIG1vZGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDX0NIUk9NQV9EQyA9IDAsICAgIC8qKiBJbnRyYV9DaHJvbWFfREMgKi8KLSAgICBPTVhfVkNfQ0hST01BX0hPUiA9IDEsICAgLyoqIEludHJhX0Nocm9tYV9Ib3Jpem9udGFsICovCi0gICAgT01YX1ZDX0NIUk9NQV9WRVJUID0gMiwgIC8qKiBJbnRyYV9DaHJvbWFfVmVydGljYWwgKi8KLSAgICBPTVhfVkNfQ0hST01BX1BMQU5FID0gMyAgLyoqIEludHJhX0Nocm9tYV9QbGFuZSAqLyAKLX0gT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGU7Ci0KLQotCi0vKiA2LjMuMS40IE1vdGlvbiBFc3RpbWF0aW9uIE1vZGVzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIEguMjY0IG1vdGlvbiBlc3RpbWF0aW9uIG1vZGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDX000UDEwX0ZBU1RfU0VBUkNIID0gMCwgLyoqIEZhc3QgbW90aW9uIHNlYXJjaCAqLwotICAgIE9NWF9WQ19NNFAxMF9GVUxMX1NFQVJDSCA9IDEgIC8qKiBGdWxsIG1vdGlvbiBzZWFyY2ggKi8gCi19IE9NWFZDTTRQMTBNRU1vZGU7Ci0KLQotCi0vKiA2LjMuMS41IE1hY3JvYmxvY2sgVHlwZXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgSC4yNjQgbWFjcm9ibG9jayB0eXBlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ19QXzE2eDE2ICA9IDAsIC8qIGRlZmluZWQgYnkgW0lTTzE0NDk2LTEwXSAqLwotICAgIE9NWF9WQ19QXzE2eDggID0gMSwKLSAgICBPTVhfVkNfUF84eDE2ICA9IDIsCi0gICAgT01YX1ZDX1BfOHg4ICA9IDMsCi0gICAgT01YX1ZDX1BSRUYwXzh4OCAgPSA0LAotICAgIE9NWF9WQ19JTlRFUl9TS0lQICA9IDUsCi0gICAgT01YX1ZDX0lOVFJBXzR4NCAgPSA4LAotICAgIE9NWF9WQ19JTlRSQV8xNngxNiAgPSA5LAotICAgIE9NWF9WQ19JTlRSQV9QQ00gPSAxMCAKLX0gT01YVkNNNFAxME1hY3JvYmxvY2tUeXBlOwotCi0KLQotLyogNi4zLjEuNiBTdWItTWFjcm9ibG9jayBUeXBlcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBILjI2NCBzdWItbWFjcm9ibG9jayB0eXBlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ19TVUJfUF84eDggPSAwLCAvKiBkZWZpbmVkIGJ5IFtJU08xNDQ5Ni0xMF0gKi8KLSAgICBPTVhfVkNfU1VCX1BfOHg0ID0gMSwKLSAgICBPTVhfVkNfU1VCX1BfNHg4ID0gMiwKLSAgICBPTVhfVkNfU1VCX1BfNHg0ID0gMyAKLX0gT01YVkNNNFAxMFN1Yk1hY3JvYmxvY2tUeXBlOwotCi0KLQotLyogNi4zLjEuNyBWYXJpYWJsZSBMZW5ndGggQ29kaW5nIChWTEMpIEluZm9ybWF0aW9uICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX1U4IHVUcmFpbGluZ19PbmVzOyAgICAgIC8qIFRyYWlsaW5nIG9uZXM7IDMgYXQgbW9zdCAqLwotICAgIE9NWF9VOCB1VHJhaWxpbmdfT25lX1NpZ25zOyAvKiBUcmFpbGluZyBvbmVzIHNpZ25hbCAqLwotICAgIE9NWF9VOCB1TnVtQ29lZmZzOyAgICAgICAgICAvKiBUb3RhbCBudW1iZXIgb2Ygbm9uLXplcm8gY29lZnMsIGluY2x1ZGluZyB0cmFpbGluZyBvbmVzICovCi0gICAgT01YX1U4IHVUb3RhbFplcm9zOyAgICAgICAgIC8qIFRvdGFsIG51bWJlciBvZiB6ZXJvIGNvZWZzICovCi0gICAgT01YX1MxNiBpTGV2ZWxzWzE2XTsgICAgICAgIC8qIExldmVscyBvZiBub24temVybyBjb2VmcywgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyICovCi0gICAgT01YX1U4IHVSdW5zWzE2XTsgICAgICAgICAgIC8qIFJ1bnMgZm9yIGxldmVscyBhbmQgdHJhaWxpbmcgb25lcywgaW4gcmV2ZXJzZSB6aWctemFnIG9yZGVyICovCi19IE9NWFZDTTRQMTBWTENJbmZvOwotCi0KLQotLyogNi4zLjEuOCBNYWNyb2Jsb2NrIEluZm9ybWF0aW9uICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX1MzMiBzbGljZUlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2xpY2UgbnVtYmVyICovCi0gICAgT01YVkNNNFAxME1hY3JvYmxvY2tUeXBlIG1iVHlwZTsgICAgICAgICAgLyogTUIgdHlwZSAqLwotICAgIE9NWFZDTTRQMTBTdWJNYWNyb2Jsb2NrVHlwZSBzdWJNQlR5cGVbNF07IC8qIHN1Yi1ibG9jayB0eXBlICovCi0gICAgT01YX1MzMiBxcHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcXAgZm9yIGx1bWEgKi8KLSAgICBPTVhfUzMyIHFwYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBxcCBmb3IgY2hyb21hICovCi0gICAgT01YX1UzMiBjYnB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ0JQIEx1bWEgKi8KLSAgICBPTVhfVTMyIGNicGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDQlAgQ2hyb21hICovCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WMFs0XVs0XTsgLyogbW90aW9uIHZlY3RvciwgcmVwcmVzZW50ZWQgdXNpbmcgMS80LXBlbCB1bml0cywgcE1WMFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MywgYmxvY2t4ID0wfjMpICovCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WUHJlZFs0XVs0XTsgLyogbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uLCBSZXByZXNlbnRlZCB1c2luZyAxLzQtcGVsIHVuaXRzLCBwTVZQcmVkW2Jsb2NreV1bYmxvY2t4XSAoYmxvY2t5ID0gMH4zLCBibG9ja3ggPSAwfjMpICovCi0gICAgT01YX1U4IHBSZWZMMElkeFs0XTsgICAgICAgICAgICAgICAgICAgICAgLyogcmVmZXJlbmNlIHBpY3R1cmUgaW5kaWNlcyAqLwotICAgIE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUgSW50cmExNngxNlByZWRNb2RlOyAvKiBiZXN0IGludHJhIDE2eDE2IHByZWRpY3Rpb24gbW9kZSAqLwotICAgIE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlIHBJbnRyYTR4NFByZWRNb2RlWzE2XTsgLyogYmVzdCBpbnRyYSA0eDQgcHJlZGljdGlvbiBtb2RlIGZvciBlYWNoIGJsb2NrLCBwTVYwIGluZGV4ZWQgYXMgYWJvdmUgKi8KLX0gT01YVkNNNFAxME1CSW5mbywgKk9NWFZDTTRQMTBNQkluZm9QdHI7Ci0KLQotCi0vKiA2LjMuMS45IE1vdGlvbiBFc3RpbWF0aW9uIFBhcmFtZXRlcnMgICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfUzMyIGJsb2NrU3BsaXRFbmFibGU4eDg7IC8qIGVuYWJsZXMgMTZ4OCwgOHgxNiwgOHg4ICovCi0gICAgT01YX1MzMiBibG9ja1NwbGl0RW5hYmxlNHg0OyAvKiBlbmFibGUgc3BsaXR0aW5nIG9mIDh4NCwgNHg4LCA0eDQgYmxvY2tzICovCi0gICAgT01YX1MzMiBoYWxmU2VhcmNoRW5hYmxlOwotICAgIE9NWF9TMzIgcXVhcnRlclNlYXJjaEVuYWJsZTsKLSAgICBPTVhfUzMyIGludHJhRW5hYmxlNHg0OyAgICAgIC8qIDE9ZW5hYmxlLCAwPWRpc2FibGUgKi8KLSAgICBPTVhfUzMyIHNlYXJjaFJhbmdlMTZ4MTY7ICAgIC8qIGludGVnZXIgcGl4ZWwgdW5pdHMgKi8KLSAgICBPTVhfUzMyIHNlYXJjaFJhbmdlOHg4OwotICAgIE9NWF9TMzIgc2VhcmNoUmFuZ2U0eDQ7Ci19IE9NWFZDTTRQMTBNRVBhcmFtczsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgICAoNi4zLjMuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybSBJbnRyYV80eDQgcHJlZGljdGlvbiBmb3IgbHVtYSBzYW1wbGVzLiBJZiB0aGUgdXBwZXItcmlnaHQgYmxvY2sgaXMgCi0gKiBub3QgYXZhaWxhYmxlLCB0aGVuIGR1cGxpY2F0aW9uIHdvcmsgc2hvdWxkIGJlIGhhbmRsZWQgaW5zaWRlIHRoZSBmdW5jdGlvbi4gCi0gKiBVc2VycyBuZWVkIG5vdCBkZWZpbmUgdGhlbSBvdXRzaWRlLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjTGVmdCAtICBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgNCBsZWZ0IHBpeGVsczogCi0gKiAgICAgICAgICAgICAgICAgIHBbeCwgeV0gKHggPSAtMSwgeSA9IDAuLjMpIAotICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBhYm92ZSBwaXhlbHM6IAotICogICAgICAgICAgICAgICAgICBwW3gseV0gKHggPSAwLi43LCB5ID0tMSk7IAotICogICAgICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICBwU3JjQWJvdmVMZWZ0IC0gUG9pbnRlciB0byB0aGUgYWJvdmUgbGVmdCBwaXhlbHM6IHBbeCx5XSAoeCA9IC0xLCB5ID0gLTEpIAotICogICBsZWZ0U3RlcCAtIFN0ZXAgb2YgbGVmdCBwaXhlbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBwcmVkTW9kZSAtIEludHJhXzR4NCBwcmVkaWN0aW9uIG1vZGUuIAotICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyA0eDQgYmxvY2sgYXZhaWxhYmlsaXR5IGZsYWcsIHJlZmVyIHRvIAotICogICAgICAgICAgICAgIk5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5IiAuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBwRHN0IGlzIE5VTEwuIAotICogICAgZHN0U3RlcCA8IDQsIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgICBsZWZ0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCi0gKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19VUFBFUiAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9ESUFHX0RMLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwgLTFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0RJQUdfRFIsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCi0gKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAotICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZSLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAotICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKLSAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9IRCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKLSAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCi0gKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVkwsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX1VQUEVSIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9IVSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUiwgYnV0IHBTcmNBYm92ZSBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19MRUZULCBidXQgcFNyY0xlZnQgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVJfTEVGVCwgYnV0IHBTcmNBYm92ZUxlZnQgaXMgTlVMTC4gCi0gKiAgICBlaXRoZXIgcFNyY0Fib3ZlIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICAKLSAqCi0gKiBOb3RlOiAKLSAqICAgICBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVycyBpZiAKLSAqICAgICB0aGV5IGFyZSBub3QgdXNlZCBieSBpbnRyYSBwcmVkaWN0aW9uIGFzIGltcGxpZWQgaW4gcHJlZE1vZGUuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjTGVmdCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgbGVmdFN0ZXAsCi0gICAgT01YX0lOVCBkc3RTdGVwLAotICAgIE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlIHByZWRNb2RlLAotICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2ICAgKDYuMy4zLjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm0gSW50cmFfMTZ4MTYgcHJlZGljdGlvbiBmb3IgbHVtYSBzYW1wbGVzLiBJZiB0aGUgdXBwZXItcmlnaHQgYmxvY2sgCi0gKiBpcyBub3QgYXZhaWxhYmxlLCB0aGVuIGR1cGxpY2F0aW9uIHdvcmsgc2hvdWxkIGJlIGhhbmRsZWQgaW5zaWRlIHRoZSAKLSAqIGZ1bmN0aW9uLiBVc2VycyBuZWVkIG5vdCBkZWZpbmUgdGhlbSBvdXRzaWRlLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBsZWZ0IHBpeGVsczogcFt4LCB5XSAoeCA9IC0xLCB5ID0gCi0gKiAgICAgICAgICAgIDAuLjE1KSAKLSAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGFib3ZlIHBpeGVsczogcFt4LHldICh4ID0gMC4uMTUsIAotICogICAgICAgICAgICB5PSAtMSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBwU3JjQWJvdmVMZWZ0IC0gUG9pbnRlciB0byB0aGUgYWJvdmUgbGVmdCBwaXhlbHM6IHBbeCx5XSAoeCA9IC0xLCB5ID0gLTEpIAotICogICBsZWZ0U3RlcCAtIFN0ZXAgb2YgbGVmdCBwaXhlbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHByZWRNb2RlIC0gSW50cmFfMTZ4MTYgcHJlZGljdGlvbiBtb2RlLCBwbGVhc2UgcmVmZXIgdG8gc2VjdGlvbiAzLjQuMS4gCi0gKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIDE2eDE2IE1CIGF2YWlsYWJpbGl0eSBmbGFnLiBSZWZlciB0byAKLSAqICAgICAgICAgICAgICAgICAgc2VjdGlvbiAzLjQuNC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIHBEc3QgaXMgTlVMTC4gCi0gKiAgICBkc3RTdGVwIDwgMTYuIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKLSAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjE1KSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMTUpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X1BMQU5FLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAotICogICAgICAgICAgICAgIHBbeCwtMV0oeCA9IDAuLjE1KSwgb3IgcFstMSx5XSAoeSA9IDAuLjE1KSwgb3IgcFstMSwtMV0gaXMgbm90IAotICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAotICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIAotICoKLSAqIE5vdGU6IAotICogICAgIHBTcmNBYm92ZSwgcFNyY0Fib3ZlLCBwU3JjQWJvdmVMZWZ0IG1heSBiZSBpbnZhbGlkIHBvaW50ZXJzIGlmIAotICogICAgIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gaW1wbGllZCBpbiBwcmVkTW9kZS4gCi0gKiBOb3RlOiAKLSAqICAgICBPTVhfVkNfVVBQRVJfUklHSFQgaXMgbm90IHVzZWQgaW4gaW50cmFfMTZ4MTYgbHVtYSBwcmVkaWN0aW9uLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjTGVmdCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZUxlZnQsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgbGVmdFN0ZXAsCi0gICAgT01YX0lOVCBkc3RTdGVwLAotICAgIE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUgcHJlZE1vZGUsCi0gICAgT01YX1MzMiBhdmFpbGFiaWxpdHkKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4ICAgKDYuMy4zLjEuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGludHJhIHByZWRpY3Rpb24gZm9yIGNocm9tYSBzYW1wbGVzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA4IGxlZnQgcGl4ZWxzOiBwW3gsIHldICh4ID0gLTEsIHk9IAotICogICAgICAgICAgICAwLi43KS4gCi0gKiAgIHBTcmNBYm92ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA4IGFib3ZlIHBpeGVsczogcFt4LHldICh4ID0gMC4uNywgeSAKLSAqICAgICAgICAgICAgPSAtMSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwU3JjQWJvdmVMZWZ0IC0gUG9pbnRlciB0byB0aGUgYWJvdmUgbGVmdCBwaXhlbHM6IHBbeCx5XSAoeCA9IC0xLCB5ID0gLTEpIAotICogICBsZWZ0U3RlcCAtIFN0ZXAgb2YgbGVmdCBwaXhlbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBwcmVkTW9kZSAtIEludHJhIGNocm9tYSBwcmVkaWN0aW9uIG1vZGUsIHBsZWFzZSByZWZlciB0byBzZWN0aW9uIDMuNC4zLiAKLSAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgY2hyb21hIGJsb2NrIGF2YWlsYWJpbGl0eSBmbGFnLCBwbGVhc2UgcmVmZXIgCi0gKiAgICAgICAgICAgIHRvICAiTmVpZ2hib3JpbmcgTWFjcm9ibG9jayBBdmFpbGFiaWxpdHkiLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIHBEc3QgaXMgTlVMTC4gCi0gKiAgICBkc3RTdGVwIDwgOCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAotICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ19DSFJPTUFfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uNykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi43KSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ19DSFJPTUFfUExBTkUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCi0gKiAgICAgICAgICAgICAgcFt4LC0xXSh4ID0gMC4uNyksIG9yIHBbLTEseV0gKHkgPSAwLi43KSwgb3IgcFstMSwtMV0gaXMgbm90IAotICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAotICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAgCi0gKgotICogIE5vdGU6IHBTcmNBYm92ZSwgcFNyY0Fib3ZlLCBwU3JjQWJvdmVMZWZ0IG1heSBiZSBpbnZhbGlkIHBvaW50ZXIgaWYgCi0gKiAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBpbXBsaWVkIGluIHByZWRNb2RlLiAKLSAqCi0gKiAgTm90ZTogT01YX1ZDX1VQUEVSX1JJR0hUIGlzIG5vdCB1c2VkIGluIGludHJhIGNocm9tYSBwcmVkaWN0aW9uLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0xlZnQsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIGxlZnRTdGVwLAotICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZSBwcmVkTW9kZSwKLSAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSAgICg2LjMuMy4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBxdWFydGVyLXBpeGVsIGludGVycG9sYXRpb24gZm9yIGludGVyIGx1bWEgTUIuIEl0IGlzIGFzc3VtZWQgdGhhdCAKLSAqIHRoZSBmcmFtZSBpcyBhbHJlYWR5IHBhZGRlZCB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyIAotICogICBzcmNTdGVwIC0gcmVmZXJlbmNlIGZyYW1lIHN0ZXAsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2Ygcm9pLndpZHRoIAotICogICBkc3RTdGVwIC0gZGVzdGluYXRpb24gZnJhbWUgc3RlcCwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAKLSAqICAgICAgICAgICAgcm9pLndpZHRoIAotICogICBkeCAtIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvNCBwaXhlbCAKLSAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDNdIAotICogICBkeSAtIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIHkgY29tcG9uZW50IGluIDEvNCBwaXhlbCAKLSAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDNdIAotICogICByb2kgLSBEaW1lbnNpb24gb2YgdGhlIGludGVycG9sYXRpb24gcmVnaW9uOyB0aGUgcGFyYW1ldGVycyByb2kud2lkdGggYW5kIAotICogICAgICAgICAgICByb2kuaGVpZ2h0IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlcjogCi0gKiAgICAgICAgICBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICogICAgICAgICAgaWYgcm9pLndpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqICAgICAgICAgIGlmIHJvaS53aWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCA8IHJvaS53aWR0aC4gCi0gKiAgICBkeCBvciBkeSBpcyBvdXQgb2YgcmFuZ2UgWzAsM10uIAotICogICAgcm9pLndpZHRoIG9yIHJvaS5oZWlnaHQgaXMgb3V0IG9mIHJhbmdlIHs0LCA4LCAxNn0uIAotICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIGJ1dCBwRHN0IGlzIG5vdCA0IGJ5dGUgYWxpZ25lZC4gCi0gKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gOCBvciAxNiwgYnV0IHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9TMzIgc3JjU3RlcCwKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX1MzMiBkc3RTdGVwLAotICAgIE9NWF9TMzIgZHgsCi0gICAgT01YX1MzMiBkeSwKLSAgICBPTVhTaXplIHJvaQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICAgKDYuMy4zLjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIDEvOC1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBjaHJvbWEgTUIuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLVBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyIAotICogICBzcmNTdGVwIC1SZWZlcmVuY2UgZnJhbWUgc3RlcCBpbiBieXRlcyAKLSAqICAgZHN0U3RlcCAtRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAotICogICAgICAgICAgICByb2kud2lkdGguIAotICogICBkeCAtRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQgaW4gMS84IHBpeGVsIAotICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10gCi0gKiAgIGR5IC1GcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQgaW4gMS84IHBpeGVsIAotICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10gCi0gKiAgIHJvaSAtRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjsgdGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCAKLSAqICAgICAgICAgICAgcm9pLmhlaWdodCBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciAyLCA0LCBvciA4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZnJhbWUgYnVmZmVyOgotICogICAgICAgICBpZiByb2kud2lkdGg9PTIsICAyLWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICogICAgICAgICBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICogICAgICAgICBpZiByb2kud2lkdGg9PTgsIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgc3JjU3RlcCBvciBkc3RTdGVwIDwgOC4gCi0gKiAgICBkeCBvciBkeSBpcyBvdXQgb2YgcmFuZ2UgWzAtN10uIAotICogICAgcm9pLndpZHRoIG9yIHJvaS5oZWlnaHQgaXMgb3V0IG9mIHJhbmdlIHsyLDQsOH0uIAotICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDIsIGJ1dCBwRHN0IGlzIG5vdCAyLWJ5dGUgYWxpZ25lZC4gCi0gKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgYnV0IHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA4LCBidXQgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuIAotICogICAgc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfUzMyIHNyY1N0ZXAsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9TMzIgZHN0U3RlcCwKLSAgICBPTVhfUzMyIGR4LAotICAgIE9NWF9TMzIgZHksCi0gICAgT01YU2l6ZSByb2kKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kgICAoNi4zLjMuMy4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciB2ZXJ0aWNhbCBlZGdlcyBvZiB0aGUgbHVtYSAKLSAqIG1hY3JvYmxvY2sgKDE2eDE2KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtU3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwQWxwaGEgLUFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYWxwaGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCi0gKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC1BcnJheSBvZiBzaXplIDIgb2YgYmV0YSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYmV0YSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKLSAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSB2YWx1ZXMgCi0gKiAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC1BcnJheSBvZiBzaXplIDE2IG9mIFRocmVzaG9sZHMgKFRDMCkgKHZhbHVlcyBmb3IgdGhlIGxlZnQgCi0gKiAgICAgICAgICAgIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIG9yZGVyKTsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4uICBQZXIgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCAKLSAqICAgICAgICAgICAgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtQXJyYXkgb2Ygc2l6ZSAxNiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayAKLSAqICAgICAgICAgICAgb3JkZXIpOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSAKLSAqICAgICAgICAgICAgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgRWl0aGVyIG9mIHRoZSBwb2ludGVycyBpbiBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTIAotICogICAgICAgICAgICAgIGlzIE5VTEwuIAotICogICAgRWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICBwU3JjRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICogICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAotICogICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMTVdaXMgb3V0c2lkZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIChwQlNbaV09PTQgJiYgCi0gKiAgICAgICAgICAgICAgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSAoCi0gICAgT01YX1U4ICpwU3JjRHN0LAotICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKLSAgICBjb25zdCBPTVhfVTggKnBCZXRhLAotICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCi0gICAgY29uc3QgT01YX1U4ICpwQlMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kgICAoNi4zLjMuMy4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciBob3Jpem9udGFsIGVkZ2VzIG9mIHRoZSBsdW1hIAotICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC0gc3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwQWxwaGEgLSBhcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGFscGhhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAotICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIGhvcml6b250YWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIAotICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC0gYXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSAKLSAqICAgICAgICAgICAgaXMgZm9yIHRoZSBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UpLiBQZXIgW0lTTzE0NDk2LTEwXSBiZXRhIAotICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLSBhcnJheSBvZiBzaXplIDE2IGNvbnRhaW5pbmcgdGhyZXNob2xkcywgVEMwLCBmb3IgdGhlIHRvcCAKLSAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIAotICogICAgICAgICAgICBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIFtJU08xNDQ5NiAxMF0gCi0gKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIGhvcml6b250YWwgYmxvY2sgCi0gKiAgICAgICAgICAgIG9yZGVyKTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgCi0gKiAgICAgICAgICAgIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqIAotICogICAgT01YX1N0c19CYWRBcmdFcnIsIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKLSAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCi0gKiAgICAtICAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIC0gICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgICAtICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAotICogICAgLSAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi4xNV0gaXMgCi0gKiAgICAgICAgIG91dHNpZGUgb2YgdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAotICogICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSAoCi0gICAgT01YX1U4ICpwU3JjRHN0LAotICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKLSAgICBjb25zdCBPTVhfVTggKnBCZXRhLAotICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCi0gICAgY29uc3QgT01YX1U4ICpwQlMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSAgICg2LjMuMy4zLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiBmb3VyIHZlcnRpY2FsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCi0gKiBtYWNyb2Jsb2NrICg4eDgpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHNyY2RzdFN0ZXAgLSBTdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgcEFscGhhIC0gQXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIGFscGhhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgZm9yIAotICogICAgICAgICAgICBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgCi0gKiAgICAgICAgICAgIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgcEJldGEgLSBBcnJheSBvZiBzaXplIDIgb2YgYmV0YSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYmV0YSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKLSAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSB2YWx1ZXMgCi0gKiAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC0gQXJyYXkgb2Ygc2l6ZSA4IGNvbnRhaW5pbmcgdGhyZXNob2xkcywgVEMwLCBmb3IgdGhlIGxlZnQgCi0gKiAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2Ugb2YgZWFjaCA0eDIgY2hyb21hIGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCAKLSAqICAgICAgICAgICAgYmxvY2sgb3JkZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC0gQXJyYXkgb2Ygc2l6ZSAxNiBvZiBCUyBwYXJhbWV0ZXJzICh2YWx1ZXMgZm9yIGVhY2ggMngyIGNocm9tYSAKLSAqICAgICAgICAgICAgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIG9yZGVyKS4gVGhpcyBwYXJhbWV0ZXIgaXMgdGhlIAotICogICAgICAgICAgICBzYW1lIGFzIHRoZSBwQlMgcGFyYW1ldGVyIHBhc3NlZCBpbnRvIEZpbHRlckRlYmxvY2tMdW1hX1ZlckVkZ2U7IAotICogICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgCi0gKiAgICAgICAgICAgIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCAKLSAqICAgICAgICAgICAgb25seSBpZiBwQlNbaV4zXT09IDQuICBNdXN0IGJlIDQgYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKLSAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgcFRocmVzaG9sZHMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgICAtICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAotICogICAgLSAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi43XSBpcyBvdXRzaWRlIAotICogICAgICAgICBvZiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAotICogICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCi0gKiAgICAtICAgIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgKAotICAgIE9NWF9VOCAqcFNyY0RzdCwKLSAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCi0gICAgY29uc3QgT01YX1U4ICpwQmV0YSwKLSAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAotICAgIGNvbnN0IE9NWF9VOCAqcEJTCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kgICAoNi4zLjMuMy40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gdGhlIGhvcml6b250YWwgZWRnZXMgb2YgdGhlIGNocm9tYSAKLSAqIG1hY3JvYmxvY2sgKDh4OCkuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtIGFycmF5IHN0ZXA7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgcEFscGhhIC0gYXJyYXkgb2Ygc2l6ZSAyIGNvbnRhaW5pbmcgYWxwaGEgdGhyZXNob2xkczsgdGhlIGZpcnN0IGVsZW1lbnQgCi0gKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGFuZCB0aGUgCi0gKiAgICAgICAgICAgIHNlY29uZCBlbGVtZW50IGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIGludGVybmFsIGhvcml6b250YWwgCi0gKiAgICAgICAgICAgIGVkZ2UuICBQZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgCi0gKiAgICAgICAgICAgIFswLDI1NV0uIAotICogICBwQmV0YSAtIGFycmF5IG9mIHNpemUgMiBjb250YWluaW5nIGJldGEgdGhyZXNob2xkczsgdGhlIGZpcnN0IGVsZW1lbnQgCi0gKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGFuZCB0aGUgCi0gKiAgICAgICAgICAgIHNlY29uZCBlbGVtZW50IGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIHRoZSBpbnRlcm5hbCAKLSAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLiAgUGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSA4IGNvbnRhaW5pbmcgdGhyZXNob2xkcywgVEMwLCBmb3IgdGhlIHRvcCAKLSAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlIG9mIGVhY2ggMng0IGNocm9tYSBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCAKLSAqICAgICAgICAgICAgYmxvY2sgb3JkZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNiBjb250YWluaW5nIEJTIHBhcmFtZXRlcnMgZm9yIGVhY2ggMngyIGNocm9tYSAKLSAqICAgICAgICAgICAgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgYmxvY2sgb3JkZXI7IHZhbGlkIGluIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgCi0gKiAgICAgICAgICAgIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gCi0gKiAgICAgICAgICAgIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyLCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBhbnkgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgcFRocmVzaG9sZHMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgICAtICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAotICogICAgLSAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi43XSBpcyBvdXRzaWRlIAotICogICAgICAgICBvZiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCi0gKiAgICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuCi0gKiAgICAtICAgIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kgKAotICAgIE9NWF9VOCAqcFNyY0RzdCwKLSAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCi0gICAgY29uc3QgT01YX1U4ICpwQmV0YSwKLSAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAotICAgIGNvbnN0IE9NWF9VOCAqcEJTCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSAgICg2LjMuMy4zLjUpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIHRoZSBob3Jpem9udGFsIGFuZCAKLSAqIHZlcnRpY2FsIGVkZ2VzIG9mIGEgbHVtYSBtYWNyb2Jsb2NrICgxNngxNikuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHNyY2RzdFN0ZXAgLSBpbWFnZSB3aWR0aDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcEFscGhhIC0gcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgCi0gKiAgICAgICAgICAgIGZvbGxvd3M6IHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCAKLSAqICAgICAgICAgICAgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC0gcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBiZXRhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiAKLSAqICAgICAgICAgICAge2V4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsIAotICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIFtJU08xNDQ5Ni0xMF0gCi0gKiAgICAgICAgICAgIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC0gcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgdGhyZXNob2xkIChUQzApLCBvcmdhbml6ZWQgYXMgCi0gKiAgICAgICAgICAgIGZvbGxvd3M6IHt2YWx1ZXMgZm9yIHRoZSBsZWZ0IG9yIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIAotICogICAgICAgICAgICBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlciBhbmQgdGhlbiBpbiBob3Jpem9udGFsIGJsb2NrIAotICogICAgICAgICAgICBvcmRlcn07IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciBbSVNPMTQ0OTYtMTBdIAotICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC0gcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgQlMgcGFyYW1ldGVycyBhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIAotICogICAgICAgICAgICBvcmRlciBmb3IgdmVydGljYWwgZWRnZXMgYW5kIHRoZW4gaG9yaXpvbnRhbCBlZGdlczsgdmFsaWQgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSAKLSAqICAgICAgICAgICAgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSAKLSAqICAgICAgICAgICAgNC4gTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKLSAqICAgIC0gICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCwgcEFscGhhLCAKLSAqICAgICAgICAgICAgICBwQmV0YSwgcFRocmVzaG9sZHMgb3IgcEJTLiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBBbHBoYVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgICBbMCwyNTVdLiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEJldGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCi0gKiAgICAgICAgICAgICAgWzAsMThdLiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMzFdaXMgb3V0c2lkZSBvZiAKLSAqICAgICAgICAgICAgICB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCi0gKiAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCi0gKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSAoCi0gICAgT01YX1U4ICpwU3JjRHN0LAotICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKLSAgICBjb25zdCBPTVhfVTggKnBCZXRhLAotICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCi0gICAgY29uc3QgT01YX1U4ICpwQlMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kgICAoNi4zLjMuMy42KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9ja2luZyBmaWx0ZXJpbmcgb24gYWxsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCi0gKiBtYWNyb2Jsb2NrICgxNngxNikuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtIHN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBwQWxwaGEgLSBwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyAKLSAqICAgICAgICAgICAgZm9sbG93czoge2V4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIAotICogICAgICAgICAgICBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgcEJldGEgLSBwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIEJldGEgVGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IAotICogICAgICAgICAgICB7IGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsIAotICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIFtJU08xNDQ5Ni0xMF0gCi0gKiAgICAgICAgICAgIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSA4eDIgb2YgVGhyZXNob2xkcyAoVEMwKSAodmFsdWVzIGZvciB0aGUgbGVmdCAKLSAqICAgICAgICAgICAgb3IgYWJvdmUgZWRnZSBvZiBlYWNoIDR4MiBvciAyeDQgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIAotICogICAgICAgICAgICBibG9jayBvcmRlciBhbmQgdGhlbiBpbiBob3Jpem9udGFsIGJsb2NrIG9yZGVyKTsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gUGVyIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2eDIgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gc2NhbiBibG9jayBvcmRlciAKLSAqICAgICAgICAgICAgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXMpOyB2YWxpZCBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IAotICogICAgICAgICAgICBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IAotICogICAgICAgICAgICA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCi0gKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAotICogICAgLSAgIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEFscGhhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAotICogICAgICAgICAgICAgIFswLDI1NV0uIAotICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBCZXRhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAotICogICAgICAgICAgICAgIFswLDE4XS4gCi0gKiAgICAtICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMTVdaXMgb3V0c2lkZSBvZiAKLSAqICAgICAgICAgICAgICB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIC0gICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCAgZm9yIGk+PTQsIG9yIAotICogICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCi0gKiAgICAtICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSSAoCi0gICAgT01YX1U4ICpwU3JjRHN0LAotICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBBbHBoYSwKLSAgICBjb25zdCBPTVhfVTggKnBCZXRhLAotICAgIGNvbnN0IE9NWF9VOCAqcFRocmVzaG9sZHMsCi0gICAgY29uc3QgT01YX1U4ICpwQlMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICAgKDYuMy40LjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHJhc3RlciBzY2FuIGZvciBhIDJ4MiBibG9jayBvZiAKLSAqIENocm9tYURDTGV2ZWwuICBUaGUgZGVjb2RlZCBjb2VmZmljaWVudHMgaW4gdGhlIHBhY2tlZCBwb3NpdGlvbi1jb2VmZmljaWVudCAKLSAqIGJ1ZmZlciBhcmUgc3RvcmVkIGluIHJldmVyc2UgemlnLXphZyBvcmRlciwgaS5lLiwgdGhlIGZpcnN0IGJ1ZmZlciBlbGVtZW50IAotICogY29udGFpbnMgdGhlIGxhc3Qgbm9uLXplcm8gcG9zdGlvbi1jb2VmZmljaWVudCBwYWlyIG9mIHRoZSBibG9jay4gV2l0aGluIAotICogZWFjaCBwb3NpdGlvbi1jb2VmZmljaWVudCBwYWlyLCB0aGUgcG9zaXRpb24gZW50cnkgaW5kaWNhdGVzIHRoZSAKLSAqIHJhc3Rlci1zY2FuIHBvc2l0aW9uIG9mIHRoZSBjb2VmZmljaWVudCwgd2hpbGUgdGhlIGNvZWZmaWNpZW50IGVudHJ5IAotICogY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHZhbHVlLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIERvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcE9mZnNldCAtIFBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKLSAqICAgcE9mZnNldCAtICpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAotICogICBwTnVtQ29lZmYgLSBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4gdGhpcyBibG9jayAKLSAqICAgcHBQb3NDb2VmQnVmIC0gRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLiAgQnVmZmVyIHBvc2l0aW9uIAotICogICAgICAgICAgICAoKnBwUG9zQ29lZkJ1ZikgaXMgdXBkYXRlZCB1cG9uIHJldHVybiwgdW5sZXNzIHRoZXJlIGFyZSBvbmx5IAotICogICAgICAgICAgICB6ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGUgY3VycmVudGx5IGRlY29kZWQgYmxvY2suICBJbiB0aGlzIGNhc2UgCi0gKiAgICAgICAgICAgIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gYnlwYXNzIHRoZSB0cmFuc2Zvcm0vZGVxdWFudGl6YXRpb24gb2YgCi0gKiAgICAgICAgICAgIHRoZSBlbXB0eSBibG9ja3MuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqCi0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBwQml0U3RyZWFtIG9yIHBPZmZzZXQgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBwUG9zQ29lZkJ1ZiBvciBwTnVtQ29lZmYgaXMgTlVMTC4gCi0gKiAgICBPTVhfU3RzX0VyciAtIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAotICogICAgLSAgICBhbiBpbGxlZ2FsIGNvZGUgaXMgZW5jb3VudGVyZWQgaW4gdGhlIGJpdHN0cmVhbSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9TMzIqcE9mZnNldCwKLSAgICBPTVhfVTggKnBOdW1Db2VmZiwKLSAgICBPTVhfVTggKipwcFBvc0NvZWZidWYKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQyAgICg2LjMuNC4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3IgNHg0IGJsb2NrIG9mIAotICogSW50cmExNngxNkRDTGV2ZWwsIEludHJhMTZ4MTZBQ0xldmVsLCBMdW1hTGV2ZWwsIGFuZCBDaHJvbWFBQ0xldmVsLiBJbnZlcnNlIAotICogZmllbGQgc2NhbiBpcyBub3Qgc3VwcG9ydGVkLiBUaGUgZGVjb2RlZCBjb2VmZmljaWVudHMgaW4gdGhlIHBhY2tlZCAKLSAqIHBvc2l0aW9uLWNvZWZmaWNpZW50IGJ1ZmZlciBhcmUgc3RvcmVkIGluIHJldmVyc2UgemlnLXphZyBvcmRlciwgaS5lLiwgdGhlIAotICogZmlyc3QgYnVmZmVyIGVsZW1lbnQgY29udGFpbnMgdGhlIGxhc3Qgbm9uLXplcm8gcG9zdGlvbi1jb2VmZmljaWVudCBwYWlyIG9mIAotICogdGhlIGJsb2NrLiBXaXRoaW4gZWFjaCBwb3NpdGlvbi1jb2VmZmljaWVudCBwYWlyLCB0aGUgcG9zaXRpb24gZW50cnkgCi0gKiBpbmRpY2F0ZXMgdGhlIHJhc3Rlci1zY2FuIHBvc2l0aW9uIG9mIHRoZSBjb2VmZmljaWVudCwgd2hpbGUgdGhlIAotICogY29lZmZpY2llbnQgZW50cnkgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHZhbHVlLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwT2Zmc2V0IC0gUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW07IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XS4gCi0gKiAgIHNNYXhOdW1Db2VmZiAtIE1heGltdW0gdGhlIG51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgaW4gY3VycmVudCAKLSAqICAgICAgICAgICAgYmxvY2sgCi0gKiAgIHNWTENTZWxlY3QgLSBWTEMgdGFibGUgc2VsZWN0b3IsIG9idGFpbmVkIGZyb20gdGhlIG51bWJlciBvZiBub24temVybyAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnRzIGNvbnRhaW5lZCBpbiB0aGUgYWJvdmUgYW5kIGxlZnQgNHg0IGJsb2Nrcy4gIEl0IGlzIAotICogICAgICAgICAgICBlcXVpdmFsZW50IHRvIHRoZSB2YXJpYWJsZSBuQyBkZXNjcmliZWQgaW4gSC4yNjQgc3RhbmRhcmQgdGFibGUgCi0gKiAgICAgICAgICAgIDkgNSwgZXhjZXB0IGl0cyB2YWx1ZSBjYW4gdCBiZSBsZXNzIHRoYW4gemVyby4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkLiAgCi0gKiAgICAgICAgICAgIEJ1ZmZlciBwb3NpdGlvbiAoKnBwUG9zQ29lZkJ1ZikgaXMgdXBkYXRlZCB1cG9uIHJldHVybiwgdW5sZXNzIAotICogICAgICAgICAgICB0aGVyZSBhcmUgb25seSB6ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGUgY3VycmVudGx5IGRlY29kZWQgYmxvY2suIAotICogICAgICAgICAgICAgSW4gdGhpcyBjYXNlIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gYnlwYXNzIHRoZSAKLSAqICAgICAgICAgICAgdHJhbnNmb3JtL2RlcXVhbnRpemF0aW9uIG9mIHRoZSBlbXB0eSBibG9ja3MuIAotICogICBwT2Zmc2V0IC0gKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCi0gKiAgIHBOdW1Db2VmZiAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGlzIGJsb2NrIAotICogICBwcFBvc0NvZWZCdWYgLSBEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbCAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwcEJpdFN0cmVhbSBvciBwT2Zmc2V0IGlzIE5VTEwuIAotICogICAgLSAgICBwcFBvc0NvZWZCdWYgb3IgcE51bUNvZWZmIGlzIE5VTEwuIAotICogICAgLSAgICBzTWF4TnVtQ29lZmYgaXMgbm90IGVxdWFsIHRvIGVpdGhlciAxNSBvciAxNi4gCi0gKiAgICAtICAgIHNWTENTZWxlY3QgaXMgbGVzcyB0aGFuIDAuIAotICoKLSAqICAgIE9NWF9TdHNfRXJyIC0gaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGFuIGlsbGVnYWwgY29kZSBpcyBlbmNvdW50ZXJlZCBpbiB0aGUgYml0c3RyZWFtIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9TMzIgKnBPZmZzZXQsCi0gICAgT01YX1U4ICpwTnVtQ29lZmYsCi0gICAgT01YX1U4ICoqcHBQb3NDb2VmYnVmLAotICAgIE9NWF9JTlQgc1ZMQ1NlbGVjdCwKLSAgICBPTVhfSU5UIHNNYXhOdW1Db2VmZgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciAgICg2LjMuNC4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWNvbnN0cnVjdHMgdGhlIDR4NCBMdW1hREMgYmxvY2sgZnJvbSB0aGUgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciAKLSAqIGJ1ZmZlciwgcGVyZm9ybXMgaW50ZWdlciBpbnZlcnNlLCBhbmQgZGVxdWFudGl6YXRpb24gZm9yIDR4NCBMdW1hREMgCi0gKiBjb2VmZmljaWVudHMsIGFuZCB1cGRhdGVzIHRoZSBwYWlyIGJ1ZmZlciBwb2ludGVyIHRvIHRoZSBuZXh0IG5vbi1lbXB0eSAKLSAqIGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAotICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCi0gKiAgIFFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlciBRcFkgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwU3JjIC0gKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrIAotICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCA0eDQgTHVtYURDIGNvZWZmaWNpZW50cyBidWZmZXI7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgUVAgaXMgbm90IGluIHRoZSByYW5nZSBvZiBbMC01MV0uIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyICgKLSAgICBjb25zdCBPTVhfVTggKipwcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9JTlQgUVAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciAgICg2LjMuNC4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWNvbnN0cnVjdCB0aGUgMngyIENocm9tYURDIGJsb2NrIGZyb20gY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIsIAotICogcGVyZm9ybSBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24sIGFuZCBkZXF1YW50aXphdGlvbiBmb3IgMngyIGNocm9tYSAKLSAqIERDIGNvZWZmaWNpZW50cywgYW5kIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSAKLSAqIGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAotICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCi0gKiAgIFFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlciBRcEMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwU3JjIC0gKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrIAotICogICBwRHN0IC0gUG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCAyeDIgQ2hyb21hREMgY29lZmZpY2llbnRzIGJ1ZmZlcjsgCi0gKiAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBRUCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfSU5UIFFQCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgICAoNi4zLjQuMi4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUmVjb25zdHJ1Y3QgdGhlIDR4NCByZXNpZHVhbCBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLCAKLSAqIHBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludGVnZXIgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiBmb3IgNHg0IGJsb2NrIG9mIAotICogcmVzaWR1YWxzIHdpdGggcHJldmlvdXMgaW50cmEgcHJlZGljdGlvbiBvciBtb3Rpb24gY29tcGVuc2F0aW9uIGRhdGEsIGFuZCAKLSAqIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSBibG9jay4gSWYgcERDID09IE5VTEwsIAotICogdGhlcmUgcmUgMTYgbm9uLXplcm8gQUMgY29lZmZpY2llbnRzIGF0IG1vc3QgaW4gdGhlIHBhY2tlZCBidWZmZXIgc3RhcnRpbmcgCi0gKiBmcm9tIDR4NCBibG9jayBwb3NpdGlvbiAwOyBJZiBwREMgIT0gTlVMTCwgdGhlcmUgcmUgMTUgbm9uLXplcm8gQUMgCi0gKiBjb2VmZmljaWVudHMgYXQgbW9zdCBpbiB0aGUgcGFja2V0IGJ1ZmZlciBzdGFydGluZyBmcm9tIDR4NCBibG9jayBwb3NpdGlvbiAKLSAqIDEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwU3JjIC0gRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCi0gKiAgICAgICAgICAgIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZyAKLSAqICAgcFByZWQgLSBQb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgNHg0IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5IAotICogICBwcmVkU3RlcCAtIFByZWRpY3RlZCBmcmFtZSBzdGVwIHNpemUgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAotICogICBkc3RTdGVwIC0gRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCi0gKiAgIHBEQyAtIFBvaW50ZXIgdG8gdGhlIERDIGNvZWZmaWNpZW50IG9mIHRoaXMgYmxvY2ssIE5VTEwgaWYgaXQgZG9lc24ndCAKLSAqICAgICAgICAgICAgZXhpc3QgCi0gKiAgIFFQIC0gUVAgUXVhbnRpemF0aW9uIHBhcmFtZXRlci4gIEl0IHNob3VsZCBiZSBRcEMgaW4gY2hyb21hIDR4NCBibG9jayAKLSAqICAgICAgICAgICAgZGVjb2RpbmcsIG90aGVyd2lzZSBpdCBzaG91bGQgYmUgUXBZLiAKLSAqICAgQUMgLSBGbGFnIGluZGljYXRpbmcgaWYgYXQgbGVhc3Qgb25lIG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50IGV4aXN0cyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IGJsb2NrIGRhdGE7IG11c3QgYmUgYWxpZ25lZCBvbiBhIAotICogICAgICAgICAgICA0LWJ5dGUgYm91bmRhcnkgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcFByZWQgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcFByZWQgb3IgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwcmVkU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAotICogICAgLSAgICBBQyAhPTAgYW5kIFFwIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdIG9yIHBwU3JjID09IE5VTEwuIAotICogICAgLSAgICBBQyA9PTAgJiYgcERDID09TlVMTC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCi0gICAgY29uc3QgT01YX1U4ICpwUHJlZCwKLSAgICBjb25zdCBPTVhfUzE2ICpwREMsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgcHJlZFN0ZXAsCi0gICAgT01YX0lOVCBkc3RTdGVwLAotICAgIE9NWF9JTlQgUVAsCi0gICAgT01YX0lOVCBBQwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZSAgICg2LjMuNS4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiAKLSAqIHN0cnVjdHVyZSBmb3IgdGhlIG9teFZDTTRQMTAgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zIEJsb2NrTWF0Y2hfSW50ZWdlciAKLSAqIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCi0gKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDEwTUVNb2RlIAotICogICBwTUVQYXJhbXMgLW1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTaXplIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgbW90aW9uIAotICogICAgICAgICAgICBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBNRVBhcmFtcyBvciBwU2l6ZSBpcyBOVUxMLiAKLSAqICAgIC0gICAgYW4gaW52YWxpZCBNRU1vZGUgaXMgc3BlY2lmaWVkLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZSAoCi0gICAgT01YVkNNNFAxME1FTW9kZSBNRW1vZGUsCi0gICAgY29uc3QgT01YVkNNNFAxME1FUGFyYW1zICpwTUVQYXJhbXMsCi0gICAgT01YX1UzMiAqcFNpemUKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9NRUluaXQgICAoNi4zLjUuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogSW5pdGlhbGl6ZXMgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSByZXF1aXJlZCBmb3IgdGhlIAotICogb214VkNNNFAxMCBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnM6ICBCbG9ja01hdGNoX0ludGVnZXIgYW5kIAotICogTW90aW9uRXN0aW1hdGlvbk1CLiBNZW1vcnkgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAqcE1FU3BlYyBtdXN0IGJlIAotICogYWxsb2NhdGVkIHByaW9yIHRvIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLCBhbmQgc2hvdWxkIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSBjYW4gCi0gKiBiZSBkZXRlcm1pbmVkIHVzaW5nIHRoZSBmdW5jdGlvbiBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZS4gRm9sbG93aW5nIAotICogaW5pdGlhbGl6YXRpb24gYnkgdGhpcyBmdW5jdGlvbiwgdGhlIHZlbmRvci1zcGVjaWZpYyBzdHJ1Y3R1cmUgKnBNRVNwZWMgCi0gKiBzaG91bGQgY29udGFpbiBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiBhbGwgbW90aW9uIAotICogZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIHJlY2VpdmVkIHZpYSB0aGUgc3RydWN0dXJlIHBNRVBhcmFtcywgZm9yIGV4YW1wbGUgIAotICogc2VhcmNoUmFuZ2UxNngxNiwgc2VhcmNoUmFuZ2U4eDgsIGV0Yy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKLSAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMTBNRU1vZGUgCi0gKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB1bmluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcE1FUGFyYW1zIG9yIHBTaXplIGlzIE5VTEwuIAotICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAotICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3Igb25lIG9mIHRoZSBzZWFyY2ggcmFuZ2VzIAotICogICAgICAgICAoZS5nLiwgIHBNQlBhcmFtcyA+c2VhcmNoUmFuZ2U4eDgsIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UxNngxNiwgZXRjLikgCi0gKiAgICAtICAgIGVpdGhlciBpbiBpc29sYXRpb24gb3IgaW4gY29tYmluYXRpb24sIG9uZSBvciBtb3JlIG9mIHRoZSBlbmFibGVzIG9yIAotICogICAgICAgICBzZWFyY2ggcmFuZ2VzIGluIHRoZSBzdHJ1Y3R1cmUgKnBNRVBhcmFtcyB3ZXJlIGNvbmZpZ3VyZWQgc3VjaCAKLSAqICAgICAgICAgdGhhdCB0aGUgcmVxdWVzdGVkIGJlaGF2aW9yIGZhaWxzIHRvIGNvbXBseSB3aXRoIFtJU08xNDQ5Ni0xMF0uIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfTUVJbml0ICgKLSAgICBPTVhWQ000UDEwTUVNb2RlIE1FbW9kZSwKLSAgICBjb25zdCBPTVhWQ000UDEwTUVQYXJhbXMgKnBNRVBhcmFtcywKLSAgICB2b2lkICpwTUVTcGVjCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICAgKDYuMy41LjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGludGVnZXIgYmxvY2sgbWF0Y2guICBSZXR1cm5zIGJlc3QgTVYgYW5kIGFzc29jaWF0ZWQgY29zdC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZ1kgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2s6Ci0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwU3JjUmVmWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBibG9jayBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlOiAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgblNyY09yZ1N0ZXAgLSBTdHJpZGUgb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKLSAqICAgICAgICAgICAgb2YgaW50ZWdlciBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCi0gKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSwgZXhwcmVzc2VkIGluIHRlcm1zIAotICogICAgICAgICAgICBvZiBpbnRlZ2VyIHBpeGVscyAKLSAqICAgcFJlZlJlY3QgLSBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlIGluc2lkZSB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBwaWN0dXJlIHBsYW5lIAotICogICBuQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCi0gKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2ssIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrLCBleHByZXNzZWQgaW4gdGVybXMgb2YgCi0gKiAgICAgICAgICAgIGludGVnZXIgcGl4ZWxzOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIG5MYW1kYSAtIExhbWRhIGZhY3RvcjsgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0IAotICogICBwTVZQcmVkIC0gUHJlZGljdGVkIE1WOyB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKLSAqICAgICAgICAgICAgb2YgMS80LXBlbCB1bml0cyAKLSAqICAgcE1WQ2FuZGlkYXRlIC0gQ2FuZGlkYXRlIE1WOyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIG1vdGlvbiBzZWFyY2gsIAotICogICAgICAgICAgICBleHByZXNzZWQgaW4gdGVybXMgb2YgaW50ZWdlciBwaXhlbHMgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gaW50ZWdlciBzZWFyY2gsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKLSAqICAgICAgICAgICAgb2YgMS80LXBlbCB1bml0cyAKLSAqICAgcEJlc3RDb3N0IC0gTW90aW9uIGNvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WOyBjb21wdXRlZCBhcyAKLSAqICAgICAgICAgICAgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBhbnkgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBhcmUgTlVMTDoKLSAqICAgICAgICAgcFNyY09yZ1ksIHBTcmNSZWZZLCBwUmVmUmVjdCwgcE1WUHJlZCwgcE1WQ2FuZGlkYXRlLCBvciBwTUVTcGVjLiAKLSAqICAgIC0gICAgRWl0aGVyIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZ1ksCi0gICAgT01YX1MzMiBuU3JjT3JnU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZZLAotICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsCi0gICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICBPTVhfVTggaUJsb2NrV2lkdGgsCi0gICAgT01YX1U4IGlCbG9ja0hlaWdodCwKLSAgICBPTVhfVTMyIG5MYW1kYSwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WUHJlZCwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WQ2FuZGlkYXRlLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwQmVzdE1WLAotICAgIE9NWF9TMzIgKnBCZXN0Q29zdCwKLSAgICB2b2lkICpwTUVTcGVjCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmICAgKDYuMy41LjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgaGFsZi1wZWwgYmxvY2sgbWF0Y2ggdXNpbmcgcmVzdWx0cyBmcm9tIGEgcHJpb3IgaW50ZWdlciBzZWFyY2guIAotICogIFJldHVybnMgdGhlIGJlc3QgTVYgYW5kIGFzc29jaWF0ZWQgY29zdC4gIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIHRoZSAKLSAqIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIHJlc29sdXRpb24gbW90aW9uIAotICogdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0QmVzdE1WLCBpLmUuLCB0aGUgaW5pdGlhbCAKLSAqIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgZnVuY3Rpb24gCi0gKiBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZ1kgLSBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU6Ci0gKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwU3JjUmVmWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBibG9jayBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlOiAgCi0gKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCi0gKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCi0gKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKLSAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVscyAKLSAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAotICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3IsIHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKLSAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNViwgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0czsgdXNlZCB0byAKLSAqICAgICAgICAgICAgY29tcHV0ZSBtb3Rpb24gY29zdCAKLSAqICAgcFNyY0RzdEJlc3RNViAtIFRoZSBiZXN0IE1WIHJlc3VsdGluZyBmcm9tIGEgcHJpb3IgaW50ZWdlciBzZWFyY2gsIAotICogICAgICAgICAgICByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0QmVzdE1WIC0gQmVzdCBNViByZXN1bHRpbmcgZnJvbSB0aGUgaGFsZi1wZWwgc2VhcmNoLCBleHByZXNzZWQgaW4gCi0gKiAgICAgICAgICAgIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHMgCi0gKiAgIHBCZXN0Q29zdCAtIE1vdGlvbiBjb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNVjsgY29tcHV0ZWQgYXMgCi0gKiAgICAgICAgICAgIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY09yZ1ksIHBTcmNSZWZZLCAKLSAqICAgICAgICAgICAgICBwU3JjRHN0QmVzdE1WLCBwTVZQcmVkLCBwQmVzdENvc3QgCi0gKiAgICAtICAgIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgZXF1YWwgdG8gdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZ1ksCi0gICAgT01YX1MzMiBuU3JjT3JnU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZZLAotICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsCi0gICAgT01YX1U4IGlCbG9ja1dpZHRoLAotICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsCi0gICAgT01YX1UzMiBuTGFtZGEsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RCZXN0TVYsCi0gICAgT01YX1MzMiAqcEJlc3RDb3N0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyICAgKDYuMy41LjIuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgcXVhcnRlci1wZWwgYmxvY2sgbWF0Y2ggdXNpbmcgcmVzdWx0cyBmcm9tIGEgcHJpb3IgaGFsZi1wZWwgCi0gKiBzZWFyY2guICBSZXR1cm5zIHRoZSBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyAKLSAqIHRoZSBxdWFydGVyLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaGFsZi1wZWwgcmVzb2x1dGlvbiAKLSAqIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RCZXN0TVYsIGkuZS4sIHRoZSAKLSAqIGluaXRpYWwgaGFsZi1wZWwgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgZnVuY3Rpb24gCi0gKiBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiBtYXkgYmUgdXNlZCBmb3IgaGFsZi1wZWwgbW90aW9uIGVzdGltYXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOgotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZToKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgblNyY09yZ1N0ZXAgLSBTdHJpZGUgb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgaUJsb2NrV2lkdGguIAotICogICBuU3JjUmVmU3RlcCAtIFN0cmlkZSBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzIAotICogICBpQmxvY2tXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAotICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBpQmxvY2tIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIG5MYW1kYSAtIExhbWRhIGZhY3RvciwgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0IAotICogICBwTVZQcmVkIC0gUHJlZGljdGVkIE1WLCByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzOyB1c2VkIHRvIAotICogICAgICAgICAgICBjb21wdXRlIG1vdGlvbiBjb3N0IAotICogICBwU3JjRHN0QmVzdE1WIC0gVGhlIGJlc3QgTVYgcmVzdWx0aW5nIGZyb20gYSBwcmlvciBoYWxmLXBlbCBzZWFyY2gsIAotICogICAgICAgICAgICByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQgcGVsIHVuaXRzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0QmVzdE1WIC0gQmVzdCBNViByZXN1bHRpbmcgZnJvbSB0aGUgcXVhcnRlci1wZWwgc2VhcmNoLCBleHByZXNzZWQgCi0gKiAgICAgICAgICAgIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHMgCi0gKiAgIHBCZXN0Q29zdCAtIE1vdGlvbiBjb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNVjsgY29tcHV0ZWQgYXMgCi0gKiAgICAgICAgICAgIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY09yZ1ksIHBTcmNSZWZZLCBwU3JjRHN0QmVzdE1WLCBwTVZQcmVkLCBwQmVzdENvc3QgCi0gKiAgICAtICAgIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgZXF1YWwgdG8gdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9CbG9ja01hdGNoX1F1YXJ0ZXIgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZ1ksCi0gICAgT01YX1MzMiBuU3JjT3JnU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZZLAotICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsCi0gICAgT01YX1U4IGlCbG9ja1dpZHRoLAotICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsCi0gICAgT01YX1UzMiBuTGFtZGEsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RCZXN0TVYsCi0gICAgT01YX1MzMiAqcEJlc3RDb3N0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CICAgKDYuMy41LjMuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGFuZCBzZWxlY3RzIGJlc3QgbW90aW9uIGVzdGltYXRpb24gCi0gKiBzdHJhdGVneSBmcm9tIHRoZSBzZXQgb2YgbW9kZXMgc3VwcG9ydGVkIGluIGJhc2VsaW5lIHByb2ZpbGUgW0lTTzE0NDk2LTEwXS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0N1cnJCdWYgLSBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU7IAotICogICAgICAgICAgICAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqICAgcFNyY1JlZkJ1Zkxpc3QgLSBQb2ludGVyIHRvIGFuIGFycmF5IHdpdGggMTYgZW50cmllcy4gIEVhY2ggZW50cnkgcG9pbnRzIAotICogICAgICAgICAgICB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIE1CIGluIGEgcmVmZXJlbmNlIAotICogICAgICAgICAgICBwaWN0dXJlLiAgVGhlIGFycmF5IGlzIGZpbGxlZCBmcm9tIGxvdy10by1oaWdoIHdpdGggdmFsaWQgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBmcmFtZSBwb2ludGVyczsgdGhlIHVudXNlZCBoaWdoIGVudHJpZXMgc2hvdWxkIGJlIHNldCAKLSAqICAgICAgICAgICAgdG8gTlVMTC4gIE9yZGVyaW5nIG9mIHRoZSByZWZlcmVuY2UgZnJhbWVzIHNob3VsZCBmb2xsb3cgCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gc3ViY2xhdXNlIDguMi40ICBEZWNvZGluZyBQcm9jZXNzIGZvciBSZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIFBpY3R1cmUgTGlzdHMuICAgVGhlIGVudHJpZXMgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAotICogICBwU3JjUmVjQnVmIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIE1CIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZCBwaWN0dXJlOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIFNyY0N1cnJTdGVwIC0gV2lkdGggb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBTcmNSZWZTdGVwIC0gV2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgU3JjUmVjU3RlcCAtIFdpZHRoIG9mIHRoZSByZWNvbnN0cnVjdGVkIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwUmVmUmVjdCAtIFBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSByZWN0YW5nbGU7IHJlbGF0aXZlIHRvIHRoZSAKLSAqICAgICAgICAgICAgaW1hZ2Ugb3JpZ2luLiAKLSAqICAgcEN1cnJQb2ludFBvcyAtIFBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAotICogICBMYW1iZGEgLSBMYWdyYW5nZSBmYWN0b3IgZm9yIGNvbXB1dGluZyB0aGUgY29zdCBmdW5jdGlvbiAKLSAqICAgcE1FU3BlYyAtIFBvaW50ZXIgdG8gdGhlIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyBtdXN0IAotICogICAgICAgICAgICBoYXZlIGJlZW4gYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBwcmlvciB0byBjYWxsaW5nIHRoaXMgCi0gKiAgICAgICAgICAgIGZ1bmN0aW9uLiAKLSAqICAgcE1CSW50ZXIgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIGFkamFjZW50IHR5cGUgSU5URVIgTUJzIChMZWZ0LCBUb3AsIAotICogICAgICAgICAgICBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgCi0gKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24gdCBleGlzdCBvciBpcyBub3Qgb2YgdHlwZSAKLSAqICAgICAgICAgICAgSU5URVIuIAotICogICAgICAgICAgICAtICBwTUJJbnRlclswXSAtIFBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbMV0gLSBQb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbMl0gLSBQb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICBwTUJJbnRlclszXSAtIFBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAotICogICBwTUJJbnRyYSAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGZvdXIgYWRqYWNlbnQgdHlwZSBJTlRSQSBNQnMgKExlZnQsIFRvcCwgCi0gKiAgICAgICAgICAgIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCAKLSAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGUgY29ycmVzcG9uZGluZyBNQiBkb2VzbiB0IGV4aXN0IG9yIGlzIG5vdCBvZiB0eXBlIAotICogICAgICAgICAgICBJTlRSQS4gCi0gKiAgICAgICAgICAgIC0gIHBNQkludHJhWzBdIC0gUG9pbnRlciB0byBsZWZ0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICBwTUJJbnRyYVsxXSAtIFBvaW50ZXIgdG8gdG9wIE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICBwTUJJbnRyYVsyXSAtIFBvaW50ZXIgdG8gdG9wLWxlZnQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gIHBNQkludHJhWzNdIC0gUG9pbnRlciB0byB0b3AtcmlnaHQgTUIgaW5mb3JtYXRpb24gCi0gKiAgIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgTUIuICAKLSAqICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBzZXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCi0gKiAgICAgICAgICAgIGZ1bmN0aW9uOiAgc2xpY2VJRCAtIHRoZSBudW1iZXIgb2YgdGhlIHNsaWNlIHRoZSB0byB3aGljaCB0aGUgCi0gKiAgICAgICAgICAgIGN1cnJlbnQgTUIgYmVsb25ncy4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RDb3N0IC0gUG9pbnRlciB0byB0aGUgbWluaW11bSBtb3Rpb24gY29zdCBmb3IgdGhlIGN1cnJlbnQgTUIuIAotICogICBwRHN0QmxvY2tTQUQgLSBQb2ludGVyIHRvIHRoZSBhcnJheSBvZiBTQURzIGZvciBlYWNoIG9mIHRoZSBzaXh0ZWVuIGx1bWEgCi0gKiAgICAgICAgICAgIDR4NCBibG9ja3MgaW4gZWFjaCBNQi4gIFRoZSBibG9jayBTQURzIGFyZSBpbiBzY2FuIG9yZGVyIGZvciAKLSAqICAgICAgICAgICAgZWFjaCBNQi4gIEZvciBpbXBsZW1lbnRhdGlvbnMgdGhhdCBjYW5ub3QgY29tcHV0ZSB0aGUgU0FEIHZhbHVlcyAKLSAqICAgICAgICAgICAgaW5kaXZpZHVhbGx5LCB0aGUgbWF4aW11bSBwb3NzaWJsZSB2YWx1ZSAoMHhmZmZmKSBpcyByZXR1cm5lZCAKLSAqICAgICAgICAgICAgZm9yIGVhY2ggb2YgdGhlIDE2IGJsb2NrIFNBRCBlbnRyaWVzLiAKLSAqICAgcFNyY0RzdE1CQ3VyciAtIFBvaW50ZXIgdG8gdXBkYXRlZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBNQiBhZnRlciBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuICBUaGUgCi0gKiAgICAgICAgICAgIGZvbGxvd2luZyBmaWVsZHMgYXJlIHVwZGF0ZWQgYnkgdGhlIE1FIGZ1bmN0aW9uLiAgIFRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgIHBhcmFtZXRlciBzZXQgcXVhbnRpZmllcyB0aGUgTUItbGV2ZWwgTUUgc2VhcmNoIHJlc3VsdHM6IAotICogICAgICAgICAgICAtICBNYlR5cGUgCi0gKiAgICAgICAgICAgIC0gIHN1Yk1CVHlwZVs0XSAKLSAqICAgICAgICAgICAgLSAgcE1WMFs0XVs0XSAKLSAqICAgICAgICAgICAgLSAgcE1WUHJlZFs0XVs0XSAKLSAqICAgICAgICAgICAgLSAgcFJlZkwwSWR4WzRdIAotICogICAgICAgICAgICAtICBJbnRyYTE2eDE2UHJlZE1vZGUgCi0gKiAgICAgICAgICAgIC0gIHBJbnRyYTR4NFByZWRNb2RlWzRdWzRdIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjQ3VyckJ1ZiwgCi0gKiAgICAgICAgICAgcFNyY1JlZkJ1Zkxpc3QsIHBTcmNSZWNCdWYsIHBSZWZSZWN0LCBwQ3VyclBvaW50UG9zLCBwTUVTcGVjLCAKLSAqICAgICAgICAgICBwTUJJbnRlciwgcE1CSW50cmEscFNyY0RzdE1CQ3VyciwgcERzdENvc3QsIHBTcmNSZWZCdWZMaXN0WzBdIAotICogICAgLSAgICBTcmNSZWZTdGVwLCBTcmNSZWNTdGVwIGFyZSBub3QgbXVsdGlwbGVzIG9mIDE2IAotICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgIE9NWF9TMzIgU3JjQ3VyclN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmTGlzdFsxNV0sCi0gICAgT01YX1MzMiBTcmNSZWZTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlY0J1ZiwKLSAgICBPTVhfUzMyIFNyY1JlY1N0ZXAsCi0gICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICBPTVhfVTMyIExhbWJkYSwKLSAgICB2b2lkICpwTUVTcGVjLAotICAgIGNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludGVyLAotICAgIGNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludHJhLAotICAgIE9NWFZDTTRQMTBNQkluZm9QdHIgcFNyY0RzdE1CQ3VyciwKLSAgICBPTVhfSU5UICpwRHN0Q29zdCwKLSAgICBPTVhfVTE2ICpwRHN0QmxvY2tTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURfNHggICAoNi4zLjUuNC4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgZm9yIDR4OCBhbmQgNHg0IGJsb2Nrcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZyAtUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBpU3RlcE9yZyAtU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIHBTcmNSZWYgLVBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKLSAqICAgaVN0ZXBSZWYgLVN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXIgCi0gKiAgIGlIZWlnaHQgLUhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjT3JnLCBwU3JjUmVmLCBvciBwRHN0U0FEIAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCBvciA4LiAKLSAqICAgIC0gICAgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEXzR4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCi0gICAgT01YX1UzMiBpU3RlcE9yZywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCi0gICAgT01YX1UzMiBpU3RlcFJlZiwKLSAgICBPTVhfUzMyICpwRHN0U0FELAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfNHggICAoNi4zLjUuNC4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKLSAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDR4OCBvciA0eDQgYmxvY2tzLiAgUm91bmRpbmcgCi0gKiBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBwU3JjUmVmMCAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBTcmNSZWYxIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgaVJlZlN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgaVJlZlN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAotICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKLSAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl80eCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMSwKLSAgICBPTVhfVTMyIGlTcmNTdGVwLAotICAgIE9NWF9VMzIgaVJlZlN0ZXAwLAotICAgIE9NWF9VMzIgaVJlZlN0ZXAxLAotICAgIE9NWF9VMzIgKnBEc3RTQUQsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl84eCAgICg2LjMuNS40LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSBhdmVyYWdlIAotICogb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKSBmb3IgOHgxNiwgOHg4LCBvciA4eDQgYmxvY2tzLiAgCi0gKiBSb3VuZGluZyBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmMCwgCi0gKiAgICAgICAgICAgICAgcFNyY1JlZjEsIHBEc3RTQUQuIAotICogICAgLSAgICBpU3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzh4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYxLAotICAgIE9NWF9VMzIgaVNyY1N0ZXAsCi0gICAgT01YX1UzMiBpUmVmU3RlcDAsCi0gICAgT01YX1UzMiBpUmVmU3RlcDEsCi0gICAgT01YX1UzMiAqcERzdFNBRCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzE2eCAgICg2LjMuNS40LjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSBhdmVyYWdlIAotICogb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKSBmb3IgMTZ4MTYgb3IgMTZ4OCBibG9ja3MuICAKLSAqIFJvdW5kaW5nIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBjb252ZW50aW9uIChhK2IrMSk+PjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBwU3JjUmVmMCAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBTcmNSZWYxIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiAKLSAqICAgaVJlZlN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgaVJlZlN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLVBvaW50ZXIgb2YgcmVzdWx0IFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgOCBvciAxNi4gCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAotICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKLSAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYxLAotICAgIE9NWF9VMzIgaVNyY1N0ZXAsCi0gICAgT01YX1UzMiBpUmVmU3RlcDAsCi0gICAgT01YX1UzMiBpUmVmU3RlcDEsCi0gICAgT01YX1UzMiAqcERzdFNBRCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQVREXzR4NCAgICg2LjMuNS40LjUpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHN1bSBvZiBhYnNvbHV0ZSB0cmFuc2Zvcm0gZGlmZmVyZW5jZXMgKFNBVEQpIAotICogZm9yIGEgNHg0IGJsb2NrIGJ5IGFwcGx5aW5nIGEgSGFkYW1hcmQgdHJhbnNmb3JtIHRvIHRoZSBkaWZmZXJlbmNlIGJsb2NrIAotICogYW5kIHRoZW4gY2FsY3VsYXRpbmcgdGhlIHN1bSBvZiBhYnNvbHV0ZSBjb2VmZmljaWVudCB2YWx1ZXMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeSAKLSAqICAgaVN0ZXBPcmcgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAotICogICBwU3JjUmVmIC0gUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5IAotICogICBpU3RlcFJlZiAtIFN0ZXAgb2YgdGhlIHJlZmVyZW5jZSBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgcmVzdWx0aW5nIFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjT3JnLCBwU3JjUmVmLCBvciBwRHN0U0FEIGVpdGhlciBwU3JjT3JnIAotICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpU3RlcE9yZyA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIGlTdGVwUmVmIDw9IDAgb3IgaVN0ZXBSZWYgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1NBVERfNHg0ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCi0gICAgT01YX1UzMiBpU3RlcE9yZywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCi0gICAgT01YX1UzMiBpU3RlcFJlZiwKLSAgICBPTVhfVTMyICpwRHN0U0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgICAoNi4zLjUuNS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB0d28gaG9yaXpvbnRhbCAxLzItcGVsIHBvc2l0aW9ucyAKLSAqICgtMS8yLDApIGFuZCAoMS8yLCAwKSAtIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIGluIAotICogICAgICAgICAgICB0aGUgcmVjb25zdHJ1Y3Rpb24gZnJhbWUgcGxhbmUuIAotICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuIAotICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlcjsgbXVzdCBiZSBhIAotICogICAgICAgICAgICBtdWx0aXBsZSBvZiBpV2lkdGguIAotICogICBpV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gNCwgOCwgb3IgMTYgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RMZWZ0IC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgbGVmdCAtcGVsIHBvc2l0aW9uIAotICogICAgICAgICAgICAoLTEvMiwgMCkgCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwRHN0UmlnaHQgLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSByaWdodCAtcGVsIAotICogICAgICAgICAgICBwb3NpdGlvbiAoMS8yLCAwKSAKLSAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgIHBTcmMsIHBEc3RMZWZ0LCBvciBwRHN0UmlnaHQgCi0gKiAgICAtICAgIGlXaWR0aCBvciBpSGVpZ2h0IGhhdmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYgCi0gKiAgICAtICAgIGlXaWR0aD09NCBidXQgcERzdExlZnQgYW5kL29yIHBEc3RSaWdodCBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlXaWR0aD09OCBidXQgcERzdExlZnQgYW5kL29yIHBEc3RSaWdodCBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlXaWR0aD09MTYgYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgYW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfVTMyIGlTcmNTdGVwLAotICAgIE9NWF9VOCAqcERzdExlZnQsCi0gICAgT01YX1U4ICpwRHN0UmlnaHQsCi0gICAgT01YX1UzMiBpRHN0U3RlcCwKLSAgICBPTVhfVTMyIGlXaWR0aCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSAgICg2LjMuNS41LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIHR3byB2ZXJ0aWNhbCAxLzItcGVsIHBvc2l0aW9ucyAtIAotICogKDAsIC0xLzIpIGFuZCAoMCwgMS8yKSAtIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUgCi0gKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gCi0gKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gKGludGVycG9sYXRpb24pIGJ1ZmZlcjsgbXVzdCBiZSBhIAotICogICAgICAgICAgICBtdWx0aXBsZSBvZiBpV2lkdGguIAotICogICBpV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0VXAgLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAtcGVsIHBvc2l0aW9uIGFib3ZlIAotICogICAgICAgICAgICB0aGUgY3VycmVudCBmdWxsLXBlbCBwb3NpdGlvbiAoMCwgLTEvMikgCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcERzdERvd24gLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAtcGVsIHBvc2l0aW9uIGJlbG93IAotICogICAgICAgICAgICB0aGUgY3VycmVudCBmdWxsLXBlbCBwb3NpdGlvbiAoMCwgMS8yKSAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgIHBTcmMsIHBEc3RVcCwgb3IgcERzdERvd24gCi0gKiAgICAtICAgIGlXaWR0aCBvciBpSGVpZ2h0IGhhdmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYgCi0gKiAgICAtICAgIGlXaWR0aD09NCBidXQgcERzdFVwIGFuZC9vciBwRHN0RG93biBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlXaWR0aD09OCBidXQgcERzdFVwIGFuZC9vciBwRHN0RG93biBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlXaWR0aD09MTYgYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX1UzMiBpU3JjU3RlcCwKLSAgICBPTVhfVTggKnBEc3RVcCwKLSAgICBPTVhfVTggKnBEc3REb3duLAotICAgIE9NWF9VMzIgaURzdFN0ZXAsCi0gICAgT01YX1UzMiBpV2lkdGgsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfQXZlcmFnZV80eCAgICg2LjMuNS41LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIDR4NCwgNHg4IGJsb2Nrcy4gIFRoZSByZXN1bHQgCi0gKiBpcyByb3VuZGVkIGFjY29yZGluZyB0byAoYStiKzEpLzIuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBQcmVkMCAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFByZWQxIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpUHJlZFN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMDsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBpUHJlZFN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMTsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9ja3M7IG11c3QgYmUgZWl0aGVyIDQgb3IgOC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RQcmVkIC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgIHBQcmVkMCwgcFByZWQxLCBvciBwRHN0UHJlZCAKLSAqICAgIC0gICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlQcmVkU3RlcDAgPD0gMCBvciBpUHJlZFN0ZXAwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIGlEc3RTdGVwIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggKAotICAgIGNvbnN0IE9NWF9VOCAqcFByZWQwLAotICAgIGNvbnN0IE9NWF9VOCAqcFByZWQxLAotICAgIE9NWF9VMzIgaVByZWRTdGVwMCwKLSAgICBPTVhfVTMyIGlQcmVkU3RlcDEsCi0gICAgT01YX1U4ICpwRHN0UHJlZCwKLSAgICBPTVhfVTMyIGlEc3RTdGVwLAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDICAgKDYuMy41LjYuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgMngyIEhhZGFtYXJkIHRyYW5zZm9ybSBvZiBjaHJvbWEgREMgY29lZmZpY2llbnRzIAotICogYW5kIHRoZW4gcXVhbnRpemVzIHRoZSBjb2VmZmljaWVudHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSAyeDIgYXJyYXkgb2YgY2hyb21hIERDIGNvZWZmaWNpZW50cy4gIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKLSAqICAgYkludHJhIC0gSW5kaWNhdGUgd2hldGhlciB0aGlzIGlzIGFuIElOVFJBIGJsb2NrLiAxLUlOVFJBLCAwLUlOVEVSIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0cmFuc2Zvcm1lZCBhbmQgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICAgcFNyY0RzdCAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAoCi0gICAgT01YX1MxNiAqcFNyY0RzdCwKLSAgICBPTVhfVTMyIGlRUCwKLSAgICBPTVhfVTggYkludHJhCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDICAgKDYuMy41LjYuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSA0eDQgSGFkYW1hcmQgdHJhbnNmb3JtIG9mIGx1bWEgREMgY29lZmZpY2llbnRzIAotICogYW5kIHRoZW4gcXVhbnRpemVzIHRoZSBjb2VmZmljaWVudHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSA0eDQgYXJyYXkgb2YgbHVtYSBEQyBjb2VmZmljaWVudHMuICAxNi1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0cmFuc2Zvcm1lZCBhbmQgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgYWxpZ25lZCBvbiBhbiAxNi1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDICgKLSAgICBPTVhfUzE2ICpwU3JjRHN0LAotICAgIE9NWF9VMzIgaVFQCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMgICAoNi4zLjUuNi4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIDR4NCBIYWRhbWFyZCB0cmFuc2Zvcm0gYW5kIHRoZW4gZGVxdWFudGl6ZXMgCi0gKiB0aGUgY29lZmZpY2llbnRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgNHg0IGFycmF5IG9mIHRoZSA0eDQgSGFkYW1hcmQtdHJhbnNmb3JtZWQgYW5kIAotICogICAgICAgICAgICBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgMTYgYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gUG9pbnRlciB0byBpbnZlcnNlLXRyYW5zZm9ybWVkIGFuZCBkZXF1YW50aXplZCBjb2VmZmljaWVudHMuICAKLSAqICAgICAgICAgICAgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyAKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDICgKLSAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX1UzMiBpUVAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDICAgKDYuMy41LjYuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSAyeDIgSGFkYW1hcmQgdHJhbnNmb3JtIGFuZCB0aGVuIGRlcXVhbnRpemVzIAotICogdGhlIGNvZWZmaWNpZW50cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIDJ4MiBhcnJheSBvZiB0aGUgMngyIEhhZGFtYXJkLXRyYW5zZm9ybWVkIGFuZCAKLSAqICAgICAgICAgICAgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDggYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gUG9pbnRlciB0byBpbnZlcnNlLXRyYW5zZm9ybWVkIGFuZCBkZXF1YW50aXplZCBjb2VmZmljaWVudHMuICAKLSAqICAgICAgICAgICAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjIAotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQyAoCi0gICAgY29uc3QgT01YX1MxNiAqcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9VMzIgaVFQCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQgICAoNi4zLjUuNy4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIGFuIDR4NCBpbnRlZ2VyIHRyYW5zZm9ybWF0aW9uIHRvIHByb2R1Y2UgCi0gKiB0aGUgZGlmZmVyZW5jZSBzaWduYWwgYW5kIHRoZW4gYWRkcyB0aGUgZGlmZmVyZW5jZSB0byB0aGUgcHJlZGljdGlvbiB0byBnZXQgCi0gKiB0aGUgcmVjb25zdHJ1Y3RlZCBzaWduYWwuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNQcmVkIC0gUG9pbnRlciB0byBwcmVkaWN0aW9uIHNpZ25hbC4gIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwRGVxdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzLiAgOC1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpU3JjUHJlZFN0ZXAgLSBTdGVwIG9mIHRoZSBwcmVkaWN0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBpRHN0UmVjb25TdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gcmVjb25zdHJ1Y3Rpb24gYnVmZmVyOyBtdXN0IGJlIGEgCi0gKiAgICAgICAgICAgIG11bHRpcGxlIG9mIDQuIAotICogICBiQUMgLSBJbmRpY2F0ZSB3aGV0aGVyIHRoZXJlIGlzIEFDIGNvZWZmaWNpZW50cyBpbiB0aGUgY29lZmZpY2llbnRzIAotICogICAgICAgICAgICBtYXRyaXguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0UmVjb24gLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIHJlY29uc3RydWN0aW9uIGJ1ZmZlci4gIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICBwU3JjUHJlZCwgcERlcXVhbnRDb2VmZiwgcERzdFJlY29uIAotICogICAgLSAgICBwU3JjUHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVNyY1ByZWRTdGVwIG9yIGlEc3RSZWNvblN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgICAtICAgIHBEZXF1YW50Q29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1ByZWQsCi0gICAgY29uc3QgT01YX1MxNiAqcERlcXVhbnRDb2VmZiwKLSAgICBPTVhfVTggKnBEc3RSZWNvbiwKLSAgICBPTVhfVTMyIGlTcmNQcmVkU3RlcCwKLSAgICBPTVhfVTMyIGlEc3RSZWNvblN0ZXAsCi0gICAgT01YX1U4IGJBQwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsICAgKDYuMy41LjguMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gc3VidHJhY3RzIHRoZSBwcmVkaWN0aW9uIHNpZ25hbCBmcm9tIHRoZSBvcmlnaW5hbCBzaWduYWwgdG8gCi0gKiBwcm9kdWNlIHRoZSBkaWZmZXJlbmNlIHNpZ25hbCBhbmQgdGhlbiBwZXJmb3JtcyBhIDR4NCBpbnRlZ2VyIHRyYW5zZm9ybSBhbmQgCi0gKiBxdWFudGl6YXRpb24uIFRoZSBxdWFudGl6ZWQgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzIGFyZSBzdG9yZWQgYXMgCi0gKiBwRHN0UXVhbnRDb2VmZi4gVGhpcyBmdW5jdGlvbiBjYW4gYWxzbyBvdXRwdXQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzIG9yIAotICogdW5xdWFudGl6ZWQgREMgY29lZmZpY2llbnRzIG9wdGlvbmFsbHkgYnkgc2V0dGluZyB0aGUgcG9pbnRlcnMgCi0gKiBwRHN0RGVRdWFudENvZWZmLCBwRENDb2VmZi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZyAtIFBvaW50ZXIgdG8gb3JpZ2luYWwgc2lnbmFsLiA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcFNyY1ByZWQgLSBQb2ludGVyIHRvIHByZWRpY3Rpb24gc2lnbmFsLiA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVNyY09yZ1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBzaWduYWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCi0gKiAgICAgICAgICAgIDQuIAotICogICBpU3JjUHJlZFN0ZXAgLSBTdGVwIG9mIHRoZSBwcmVkaWN0aW9uIHNpZ25hbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSAKLSAqICAgICAgICAgICAgb2YgNC4gCi0gKiAgIHBOdW1Db2VmZiAtTnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBhZnRlciBxdWFudGl6YXRpb24uIElmIHRoaXMgCi0gKiAgICAgICAgICAgIHBhcmFtZXRlciBpcyBub3QgcmVxdWlyZWQsIGl0IGlzIHNldCB0byBOVUxMLiAKLSAqICAgblRocmVzaFNBRCAtIFplcm8tYmxvY2sgZWFybHkgZGV0ZWN0aW9uIHRocmVzaG9sZC4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgCi0gKiAgICAgICAgICAgIG5vdCByZXF1aXJlZCwgaXQgaXMgc2V0IHRvIDAuIAotICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAotICogICBiSW50cmEgLSBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGFuIElOVFJBIGJsb2NrLCBlaXRoZXIgMS1JTlRSQSBvciAKLSAqICAgICAgICAgICAgMC1JTlRFUiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFF1YW50Q29lZmYgLSBQb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzLiAgCi0gKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwRHN0RGVRdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgZGVxdWFudGl6ZWQgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzIAotICogICAgICAgICAgICBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgZXF1YWwgdG8gTlVMTC4gIDgtYnl0ZSBhbGlnbm1lbnQgCi0gKiAgICAgICAgICAgIHJlcXVpcmVkLiAKLSAqICAgcERDQ29lZmYgLSBQb2ludGVyIHRvIHRoZSB1bnF1YW50aXplZCBEQyBjb2VmZmljaWVudCBpZiB0aGlzIHBhcmFtZXRlciAKLSAqICAgICAgICAgICAgaXMgbm90IGVxdWFsIHRvIE5VTEwuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgIHBTcmNPcmcsIHBTcmNQcmVkLCBwTnVtQ29lZmYsIHBEc3RRdWFudENvZWZmLCAKLSAqICAgICAgICAgICAgcERzdERlUXVhbnRDb2VmZiwgcERDQ29lZmYgCi0gKiAgICAtICAgIHBTcmNPcmcgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIHBTcmNQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpU3JjT3JnU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBpU3JjUHJlZFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgcERzdFF1YW50Q29lZmYgb3IgcERzdERlUXVhbnRDb2VmZiBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1ByZWQsCi0gICAgT01YX1UzMiBpU3JjT3JnU3RlcCwKLSAgICBPTVhfVTMyIGlTcmNQcmVkU3RlcCwKLSAgICBPTVhfUzE2ICpwRHN0UXVhbnRDb2VmZiwKLSAgICBPTVhfUzE2ICpwRHN0RGVRdWFudENvZWZmLAotICAgIE9NWF9TMTYgKnBEQ0NvZWZmLAotICAgIE9NWF9TOCAqcE51bUNvZWZmLAotICAgIE9NWF9VMzIgblRocmVzaFNBRCwKLSAgICBPTVhfVTMyIGlRUCwKLSAgICBPTVhfVTggYkludHJhCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfR2V0VkxDSW5mbyAgICg2LjMuNS45LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzIHJ1bi1sZW5ndGggZW5jb2RpbmcgKFJMRSkgaW5mb3JtYXRpb24gZnJvbSB0aGUgCi0gKiBjb2VmZmljaWVudCBtYXRyaXguICBUaGUgcmVzdWx0cyBhcmUgcmV0dXJuZWQgaW4gYW4gT01YVkNNNFAxMFZMQ0luZm8gCi0gKiBzdHJ1Y3R1cmUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNDb2VmZiAtIHBvaW50ZXIgdG8gdGhlIHRyYW5zZm9ybSBjb2VmZmljaWVudCBtYXRyaXguICA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBTY2FuTWF0cml4IC0gcG9pbnRlciB0byB0aGUgc2NhbiBvcmRlciBkZWZpbml0aW9uIG1hdHJpeC4gIEZvciBhIGx1bWEgCi0gKiAgICAgICAgICAgIGJsb2NrIHRoZSBzY2FuIG1hdHJpeCBzaG91bGQgZm9sbG93IFtJU08xNDQ5Ni0xMF0gc2VjdGlvbiA4LjUuNCwgCi0gKiAgICAgICAgICAgIGFuZCBzaG91bGQgY29udGFpbiB0aGUgdmFsdWVzIDAsIDEsIDQsIDgsIDUsIDIsIDMsIDYsIDksIDEyLCAxMywgCi0gKiAgICAgICAgICAgIDEwLCA3LCAxMSwgMTQsIDE1LiAgRm9yIGEgY2hyb21hIGJsb2NrLCB0aGUgc2NhbiBtYXRyaXggc2hvdWxkIAotICogICAgICAgICAgICBjb250YWluIHRoZSB2YWx1ZXMgMCwgMSwgMiwgMy4gCi0gKiAgIGJBQyAtIGluZGljYXRlcyBwcmVzZW5jZSBvZiBhIERDIGNvZWZmaWNpZW50OyAwID0gREMgY29lZmZpY2llbnQgCi0gKiAgICAgICAgICAgIHByZXNlbnQsIDE9IERDIGNvZWZmaWNpZW50IGFic2VudC4gCi0gKiAgIE1heE51bUNvZWYgLSBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgY29udGFpbmVkIGluIHRoZSAKLSAqICAgICAgICAgICAgdHJhbnNmb3JtIGNvZWZmaWNpZW50IG1hdHJpeCwgcFNyY0NvZWZmLiBUaGUgdmFsdWUgc2hvdWxkIGJlIDE2IAotICogICAgICAgICAgICBmb3IgYmxvY2tzIG9mIHR5cGUgTFVNQURDLCBMVU1BQUMsIExVTUFMRVZFTCwgYW5kIENIUk9NQUFDLiBUaGUgCi0gKiAgICAgICAgICAgIHZhbHVlIHNob3VsZCBiZSA0IGZvciBibG9ja3Mgb2YgdHlwZSBDSFJPTUFEQy4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RWTENJbmZvIC0gcG9pbnRlciB0byBzdHJ1Y3R1cmUgdGhhdCBzdG9yZXMgaW5mb3JtYXRpb24gZm9yIAotICogICAgICAgICAgICBydW4tbGVuZ3RoIGNvZGluZy4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgcFNyY0NvZWZmLCBwU2Nhbk1hdHJpeCwgcERzdFZMQ0luZm8gCi0gKiAgICAtICAgIHBTcmNDb2VmZiBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9HZXRWTENJbmZvICgKLSAgICBjb25zdCBPTVhfUzE2ICpwU3JjQ29lZmYsCi0gICAgY29uc3QgT01YX1U4ICpwU2Nhbk1hdHJpeCwKLSAgICBPTVhfVTggYkFDLAotICAgIE9NWF9VMzIgTWF4TnVtQ29lZiwKLSAgICBPTVhWQ000UDEwVkxDSW5mbypwRHN0VkxDSW5mbwotKTsKLQotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiogZW5kIG9mICNkZWZpbmUgX09NWFZDX0hfICovCi0KLS8qKiBFT0YgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9vbXhWQ19zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL29teFZDX3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlmMzA0MC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL29teFZDX3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi07LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOy8vIENvcHlyaWdodCAoYykgMTk5OS0yMDA1IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAotOy8vCi07Ly8KLTsvLwotOy8vCi07Ly8KLTsvLwotOy8vCi07Ly8KLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLTsvKiogPT09PT09PT09PT09PT09IFN0cnVjdHVyZSBEZWZpbml0aW9uIGZvciBTYW1wbGUgR2VuZXJhdGlvbiA9PT09PT09PT09PT09PSAqLwotOy8qKiB0cmFuc3BhcmVudCBzdGF0dXMgKi8KLQotO2VudW0gewotT01YX1ZJREVPX1RSQU5TUEFSRU5UCUVRVSAwOwkvKiogV2hvbGx5IHRyYW5zcGFyZW50ICovCi1PTVhfVklERU9fUEFSVElBTAkJRVFVIDE7CS8qKiBQYXJ0aWFsbHkgdHJhbnNwYXJlbnQgKi8KLU9NWF9WSURFT19PUEFRVUUJCUVRVSAyOwkvKiogT3BhcXVlICovCi07fQotCi07LyoqIGRpcmVjdGlvbiAqLwotO2VudW0gewotT01YX1ZJREVPX05PTkUJCQlFUVUgMDsKLU9NWF9WSURFT19IT1JJWk9OVEFMCUVRVSAxOwotT01YX1ZJREVPX1ZFUlRJQ0FMCQlFUVUgMjsKLTt9Ci0KLTsvKiogYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiB0eXBlICovCi07ZW51bSB7Ci1PTVhfVklERU9fSU5URUdFUl9QSVhFTCBFUVUgMDsJLyoqIGNhc2UgYSAqLwotT01YX1ZJREVPX0hBTEZfUElYRUxfWCAgRVFVIDE7CS8qKiBjYXNlIGIgKi8KLU9NWF9WSURFT19IQUxGX1BJWEVMX1kgIEVRVSAyOwkvKiogY2FzZSBjICovCi1PTVhfVklERU9fSEFMRl9QSVhFTF9YWSBFUVUgMzsJLyoqIGNhc2UgZCAqLwotO30KLQotO2VudW0gewotT01YX1VQUEVSICAJCQkJRVFVIDE7CQkvKiogc2V0IGlmIHRoZSBhYm92ZSBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLwotT01YX0xFRlQgICAJCQkJRVFVIDI7CQkvKiogc2V0IGlmIHRoZSBsZWZ0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCi1PTVhfQ0VOVEVSIAkJCQlFUVUgNDsKLU9NWF9SSUdIVAkJCQlFUVUgODsKLU9NWF9MT1dFUiAgCQkJCUVRVQkxNjsKLU9NWF9VUFBFUl9MRUZUICAJCUVRVSAzMjsJCS8qKiBzZXQgaWYgdGhlIGFib3ZlLWxlZnQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KLU9NWF9VUFBFUl9SSUdIVCAJCUVRVSA2NDsJCS8qKiBzZXQgaWYgdGhlIGFib3ZlLXJpZ2h0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCi1PTVhfTE9XRVJfTEVGVCAgCQlFUVUgMTI4OwotT01YX0xPV0VSX1JJR0hUIAkJRVFVIDI1NgotO30KLQotO2VudW0gewotT01YX1ZJREVPX0xVTUlOQU5DRSAgCUVRVSAwOwkvKiogTHVtaW5hbmNlIGNvbXBvbmVudCAqLwotT01YX1ZJREVPX0NIUk9NSU5BTkNFICAJRVFVIDE7CS8qKiBjaHJvbWluYW5jZSBjb21wb25lbnQgKi8KLU9NWF9WSURFT19BTFBIQSAgCQlFUVUgMjsJLyoqIEFscGhhIGNvbXBvbmVudCAqLwotO30KLQotO2VudW0gewotT01YX1ZJREVPX0lOVEVSCQkJRVFVIDA7CS8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KLU9NWF9WSURFT19JTlRFUl9RCQlFUVUgMTsJLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLwotT01YX1ZJREVPX0lOVEVSNFYJCUVRVSAyOwkvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCi1PTVhfVklERU9fSU5UUkEJCQlFUVUgMzsJLyoqIEkgYW5kIFAgcGljdHVyZTsgSS0gYW5kIFAtVk9QICovCi1PTVhfVklERU9fSU5UUkFfUQkJRVFVIDQ7CS8qKiBJIGFuZCBQIHBpY3R1cmU7IEktIGFuZCBQLVZPUCAqLwotT01YX1ZJREVPX0lOVEVSNFZfUQkJRVFVIDU7CS8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKEguMjYzKSovCi1PTVhfVklERU9fRElSRUNUCQlFUVUgNjsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAoTVBFRy00IG9ubHkpICovCi1PTVhfVklERU9fSU5URVJQT0xBVEUJRVFVIDc7CS8qKiBCIHBpY3R1cmUgb3IgQi1WT1AgKi8KLU9NWF9WSURFT19CQUNLV0FSRAkJRVFVIDg7CS8qKiBCIHBpY3R1cmUgb3IgQi1WT1AgKi8KLU9NWF9WSURFT19GT1JXQVJECQlFUVUgOTsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAqLwotT01YX1ZJREVPX05PVENPREVECQlFUVUgMTA7CS8qKiBCIHBpY3R1cmUgb3IgQi1WT1AgKi8KLTt9Ci0KLTtlbnVtIHsKLU9NWF8xNlgxNl9WRVJUIAkJCUVRVSAwOwkJLyoqIEludHJhXzE2eDE2X1ZlcnRpY2FsIChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfMTZYMTZfSE9SIAkJCUVRVSAxOwkJLyoqIEludHJhXzE2eDE2X0hvcml6b250YWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF8xNlgxNl9EQyAJCQlFUVUgMjsJCS8qKiBJbnRyYV8xNngxNl9EQyAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YXzE2WDE2X1BMQU5FIAkJRVFVIDM7CS8qKiBJbnRyYV8xNngxNl9QbGFuZSAocHJlZGljdGlvbiBtb2RlKSAqLwotO30KLQotO2VudW0gewotT01YXzR4NF9WRVJUIAkJCUVRVSAwOwkJLyoqIEludHJhXzR4NF9WZXJ0aWNhbCAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YXzR4NF9IT1IgIAkJCUVRVSAxOwkJLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsIChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfNHg0X0RDICAgCQkJRVFVIDI7CQkvKiogSW50cmFfNHg0X0RDIChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfNHg0X0RJQUdfREwgCQlFUVUgMzsJLyoqIEludHJhXzR4NF9EaWFnb25hbF9Eb3duX0xlZnQgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF80eDRfRElBR19EUiAJCUVRVSA0OwkvKiogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fUmlnaHQgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF80eDRfVlIgCQkJCUVRVSA1OwkJCS8qKiBJbnRyYV80eDRfVmVydGljYWxfUmlnaHQgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF80eDRfSEQgCQkJCUVRVSA2OwkJCS8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9Eb3duIChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfNHg0X1ZMIAkJCQlFUVUgNzsJCQkvKiogSW50cmFfNHg0X1ZlcnRpY2FsX0xlZnQgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF80eDRfSFUgCQkJCUVRVSA4OwkJCS8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9VcCAocHJlZGljdGlvbiBtb2RlKSAqLwotO30KLQotO2VudW0gewotT01YX0NIUk9NQV9EQyAJCQlFUVUgMDsJCS8qKiBJbnRyYV9DaHJvbWFfREMgKHByZWRpY3Rpb24gbW9kZSkgKi8KLU9NWF9DSFJPTUFfSE9SIAkJCUVRVSAxOwkJLyoqIEludHJhX0Nocm9tYV9Ib3Jpem9udGFsIChwcmVkaWN0aW9uIG1vZGUpICovCi1PTVhfQ0hST01BX1ZFUlQgCQlFUVUgMjsJLyoqIEludHJhX0Nocm9tYV9WZXJ0aWNhbCAocHJlZGljdGlvbiBtb2RlKSAqLwotT01YX0NIUk9NQV9QTEFORSAJCUVRVSAzOwkvKiogSW50cmFfQ2hyb21hX1BsYW5lIChwcmVkaWN0aW9uIG1vZGUpICovCi07fQotCi07dHlwZWRlZglzdHJ1Y3QgewkKLXgJRVFVCTA7Ci15CUVRVQk0OwotO31PTVhDb29yZGluYXRlOwotCi07dHlwZWRlZiBzdHJ1Y3QgewotZHgJRVFVCTA7Ci1keQlFUVUJMjsKLTt9T01YTW90aW9uVmVjdG9yOwotCi07dHlwZWRlZiBzdHJ1Y3QgewoteHgJCUVRVQkwOwoteXkJCUVRVQk0Owotd2lkdGgJRVFVCTg7Ci1oZWlnaHQJRVFVCTEyOwotO31PTVhpUmVjdDsKLQotO3R5cGVkZWYgZW51bSB7Ci1PTVhfVkNfSU5URVIgICAgICAgICBFUVUgMDsgICAgICAgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KLU9NWF9WQ19JTlRFUl9RICAgICAgIEVRVSAxOyAgICAgICAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCi1PTVhfVkNfSU5URVI0ViAgICAgICBFUVUgMjsgICAgICAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLwotT01YX1ZDX0lOVFJBICAgICAgICAgRVFVIDM7ICAgICAgICAvKiogSSBhbmQgUCBwaWN0dXJlLCBJLSBhbmQgUC1WT1AgKi8KLU9NWF9WQ19JTlRSQV9RICAgICAgIEVRVSA0OyAgICAgICAvKiogSSBhbmQgUCBwaWN0dXJlLCBJLSBhbmQgUC1WT1AgKi8KLU9NWF9WQ19JTlRFUjRWX1EgICAgIEVRVSA1OyAgICAvKiogUCBwaWN0dXJlIG9yIFAtVk9QIChILjI2MykqLwotO30gT01YVkNNNFAyTWFjcm9ibG9ja1R5cGU7Ci0KLTtlbnVtIHsKLU9NWF9WQ19OT05FICAgICAgICAgIEVRVSAwCi1PTVhfVkNfSE9SSVpPTlRBTCAgICBFUVUgMQotT01YX1ZDX1ZFUlRJQ0FMICAgICAgRVFVIDIgCi07fTsKLQotCi0JRU5ECi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2X3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk2ZDU5ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNl9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0gOy8qKgotIDsgKiBGdW5jdGlvbjogb214VkNDT01NX0NvcHkxNngxNgotIDsgKgotIDsgKiBEZXNjcmlwdGlvbjoKLSA7ICogQ29waWVzIHRoZSByZWZlcmVuY2UgMTZ4MTYgYmxvY2sgdG8gdGhlIGN1cnJlbnQgYmxvY2suCi0gOyAqIFBhcmFtZXRlcnM6Ci0gOyAqIFtpbl0gcFNyYyAgICAgICAgIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiAxNi1ieXRlIGJvdW5kYXJ5LgotIDsgKiBbaW5dIHN0ZXAgICAgICAgICAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0cyBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgcmVmZXJlbmNlIGZyYW1lLCBpbiBieXRlczsKLSA7ICogICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgYW5kIG11c3QgYmUgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gMTYuCi0gOyAqIFtvdXRdIHBEc3QgICAgICAgIC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCi0gOyAqIFJldHVybiBWYWx1ZToKLSA7ICogT01YX1N0c19Ob0VyciAgICAgLSBubyBlcnJvcgotIDsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gOyAqICAgICAgICAgICAgICAgICAgIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAgcFNyYywgcERzdAotIDsgKiAgICAgICAgICAgICAgICAgICAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYW4gMTYtYnl0ZSBib3VuZGFyeTogIHBTcmMsIHBEc3QKLSA7ICogICAgICAgICAgICAgICAgICAgLSBzdGVwIDwxNiBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAgCi0gOyAqLwotCi0gICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgCi0gICAgIAotICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0gICAgIAotICAgICBJRiBDb3J0ZXhBOAotICAgICAKLSAgICAgCi0gOy8vSW5wdXQgQXJndW1lbnRzCi1wU3JjICAgIFJOIDAgICAgICAgIAotcERzdCAgICBSTiAxICAgICAgICAKLXN0ZXAgICAgUk4gMgotCi07Ly9Mb2NhbCBWYXJpYWJsZXMKLVJldHVybiAgUk4gMAotOy8vIE5lb24gUmVnaXN0ZXJzCi0KLVgwICAgICAgRE4gRDAuUzggCi1YMSAgICAgIEROIEQxLlM4IAotWDIgICAgICBETiBEMi5TOAotWDMgICAgICBETiBEMy5TOAotWDQgICAgICBETiBENC5TOAotWDUgICAgICBETiBENS5TOAotWDYgICAgICBETiBENi5TOAotWDcgICAgICBETiBENy5TOCAKLSAKLSAgICAgTV9TVEFSVCBvbXhWQ0NPTU1fQ29weTE2eDE2Ci0gICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZMRDEgIHtYMCxYMX0sW3BTcmNAMTI4XSxzdGVwICAgICAgIDsvLyBMb2FkIDE2IGJ5dGVzIGZyb20gMTYgYnl0ZSBhbGlnbmVkIHBTcmMgYW5kIHBTcmM9cFNyYyArIHN0ZXAgYWZ0ZXIgbG9hZGluZwotICAgICAgICBWTEQxICB7WDIsWDN9LFtwU3JjQDEyOF0sc3RlcAotICAgICAgICBWTEQxICB7WDQsWDV9LFtwU3JjQDEyOF0sc3RlcAotICAgICAgICBWTEQxICB7WDYsWDd9LFtwU3JjQDEyOF0sc3RlcAotICAgICAgICAKLSAgICAgICAgVlNUMSAge1gwLFgxLFgyLFgzfSxbcERzdEAxMjhdISAgICAgOy8vIFN0b3JlIDMyIGJ5dGVzIHRvIDE2IGJ5dGUgYWxpZ25lZCBwRHN0ICAgCi0gICAgICAgIFZTVDEgIHtYNCxYNSxYNixYN30sW3BEc3RAMTI4XSEgICAgICAgIAotICAgICAgICAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgVkxEMSAge1gwLFgxfSxbcFNyY0AxMjhdLHN0ZXAKLSAgICAgICAgVkxEMSAge1gyLFgzfSxbcFNyY0AxMjhdLHN0ZXAKLSAgICAgICAgVkxEMSAge1g0LFg1fSxbcFNyY0AxMjhdLHN0ZXAKLSAgICAgICAgVkxEMSAge1g2LFg3fSxbcFNyY0AxMjhdLHN0ZXAKLSAgICAgICAgCi0gICAgICAgIFZTVDEgIHtYMCxYMSxYMixYM30sW3BEc3RAMTI4XSEKLSAgICAgICAgVlNUMSAge1g0LFg1LFg2LFg3fSxbcERzdEAxMjhdIQotICAgICAgICAgCi0gICAgICAKLSAgICAgICAgVkxEMSAge1gwLFgxfSxbcFNyY0AxMjhdLHN0ZXAKLSAgICAgICAgVkxEMSAge1gyLFgzfSxbcFNyY0AxMjhdLHN0ZXAKLSAgICAgICAgVkxEMSAge1g0LFg1fSxbcFNyY0AxMjhdLHN0ZXAKLSAgICAgICAgVkxEMSAge1g2LFg3fSxbcFNyY0AxMjhdLHN0ZXAKLSAgICAgICAgCi0gICAgICAgIFZTVDEgIHtYMCxYMSxYMixYM30sW3BEc3RAMTI4XSEgICAgICAgICAgICAgIAotICAgICAgICBWU1QxICB7WDQsWDUsWDYsWDd9LFtwRHN0QDEyOF0hICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWTEQxICB7WDAsWDF9LFtwU3JjQDEyOF0sc3RlcAotICAgICAgICBWTEQxICB7WDIsWDN9LFtwU3JjQDEyOF0sc3RlcAotICAgICAgICBWTEQxICB7WDQsWDV9LFtwU3JjQDEyOF0sc3RlcAotICAgICAgICBWTEQxICB7WDYsWDd9LFtwU3JjQDEyOF0sc3RlcAotICAgICAgICAKLSAgICAgICAgVlNUMSAge1gwLFgxLFgyLFgzfSxbcERzdEAxMjhdIQotICAgICAgICBWU1QxICB7WDQsWDUsWDYsWDd9LFtwRHN0QDEyOF0hCi0KLSAgICAgICAgCi0gICAgICAgIE1PViAgIFJldHVybiwjT01YX1N0c19Ob0VycgotCi0gICAgIAotICAgICAgICAKLSAgICAgICAgTV9FTkQKLSAgICAgICAgRU5ESUYKLQotCi0KLSAgICAgICAgCi0gICAgICAgIEVORAotICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDhfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjllNWVmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0gOy8qKgotIDsgKiBGdW5jdGlvbjogb214VkNDT01NX0NvcHk4eDgKLSA7ICoKLSA7ICogRGVzY3JpcHRpb246Ci0gOyAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDh4OCBibG9jayB0byB0aGUgY3VycmVudCBibG9jay4KLSA7ICogUGFyYW1ldGVyczoKLSA7ICogW2luXSBwU3JjICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4KLSA7ICogW2luXSBzdGVwICAgICAgICAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSBmcmFtZSwgaW4gYnl0ZXM7Ci0gOyAqICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDggYW5kIG11c3QgYmUgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gOC4KLSA7ICogW291dF0gcERzdCAgICAgICAgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4KLSA7ICogUmV0dXJuIFZhbHVlOgotIDsgKiBPTVhfU3RzX05vRXJyICAgICAtIG5vIGVycm9yCi0gOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSA7ICogICAgICAgICAgICAgICAgICAgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6ICBwU3JjLCBwRHN0Ci0gOyAqICAgICAgICAgICAgICAgICAgIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnk6ICBwU3JjLCBwRHN0Ci0gOyAqICAgICAgICAgICAgICAgICAgIC0gc3RlcCA8OCBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguICAKLSA7ICovCi0KLSAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAKLSAgICAgCi0gICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLSAgICAgCi0gICAgIElGIENvcnRleEE4Ci0gICAgIAotICAgICAKLSA7Ly9JbnB1dCBBcmd1bWVudHMKLXBTcmMgICAgUk4gMCAgICAgICAgCi1wRHN0ICAgIFJOIDEgICAgICAgIAotc3RlcCAgICBSTiAyCi0KLTsvL0xvY2FsIFZhcmlhYmxlcwotQ291bnQgICBSTiAzCi1SZXR1cm4gIFJOIDAKLTsvLyBOZW9uIFJlZ2lzdGVycwotCi1YMCAgICAgIEROIEQwLlM4IAotWDEgICAgICBETiBEMS5TOAotWDIgICAgICBETiBEMi5TOAotWDMgICAgICBETiBEMy5TOAotICAgICBNX1NUQVJUIG9teFZDQ09NTV9Db3B5OHg4Ci0gICAgICAgIAotICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWTEQxICB7WDB9LFtwU3JjXSxzdGVwICAgICAgICAgICAgOy8vIExvYWQgOCBieXRlcyBmcm9tIDggYnl0ZSBhbGlnbmVkIHBTcmMsIHBTcmM9cFNyYytzdGVwIGFmdGVyIGxvYWQKLSAgICAgICAgVkxEMSAge1gxfSxbcFNyY10sc3RlcAotICAgICAgICBWTEQxICB7WDJ9LFtwU3JjXSxzdGVwCi0gICAgICAgIFZMRDEgIHtYM30sW3BTcmNdLHN0ZXAKLSAgICAgICAgCi0gICAgICAgIFZTVDEgIHtYMCxYMX0sW3BEc3RdISAgICAgICAgICAgIDsvLyBTdG9yZSAxNiBieXRlcyB0byA4IGJ5dGUgYWxpZ25lZCBwRHN0ICAKLSAgICAgICAgVlNUMSAge1gyLFgzfSxbcERzdF0hICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZMRDEgIHtYMH0sW3BTcmNdLHN0ZXAKLSAgICAgICAgVkxEMSAge1gxfSxbcFNyY10sc3RlcAotICAgICAgICBWTEQxICB7WDJ9LFtwU3JjXSxzdGVwCi0gICAgICAgIFZMRDEgIHtYM30sW3BTcmNdLHN0ZXAKLSAgICAgICAgCi0gICAgICAgIFZTVDEgIHtYMCxYMX0sW3BEc3RdISAgICAgICAgICAgICAgCi0gICAgICAgIFZTVDEgIHtYMixYM30sW3BEc3RdISAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgTU9WICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCi0gICAgICAgICAgICAgCi0gICAgICAgIE1fRU5ECi0gICAgICAgIEVORElGCi0KLQotCi0gICAgICAgIAotICAgICAgICBFTkQKLSAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNmI2NjkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JX3MucworKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotOy8vIERlc2NyaXB0aW9uOgotOy8vIFRoaXMgZnVuY3Rpb24gd2lsbCBFeHBhbmQgRnJhbWUgYm91bmRhcnkgcGl4ZWxzIGludG8gUGxhbmUKLTsvLyAKLTsvLyAKLQotOy8vIEluY2x1ZGUgc3RhbmRhcmQgaGVhZGVycwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLQotOy8vIEltcG9ydCBzeW1ib2xzIHJlcXVpcmVkIGZyb20gb3RoZXIgZmlsZXMKLTsvLyAoRm9yIGV4YW1wbGUgdGFibGVzKQotICAgIAotICAKLTsvLyBTZXQgZGVidWdnaW5nIGxldmVsICAgICAgICAKLURFQlVHX09OICAgIFNFVEwge0ZBTFNFfQotCi0KLSAgICAKLSAgICBJRiBDb3J0ZXhBOAotICAgIAotICAgICAgICBNX1NUQVJUIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JLHIxMQotCi07Ly9JbnB1dCByZWdpc3RlcnMKLQotcFNyY0RzdFBsYW5lICAgIFJOICAwCi1pRnJhbWVXaWR0aCAgICAgUk4gIDEKLWlGcmFtZUhlaWdodCAgICBSTiAgMiAgICAKLWlFeHBhbmRQZWxzICAgICBSTiAgMwotaVBsYW5lU3RlcCAgICAgIFJOICA0Ci1wVG9wICAgICAgICAgICAgUk4gIDUKLXBCb3QgICAgICAgICAgICBSTiAgNgotcERzdFRvcCAgICAgICAgIFJOICA3Ci1wRHN0Qm90ICAgICAgICAgUk4gIDgKLXBMZWZ0ICAgICAgICAgICBSTiAgNQotcFJpZ2h0ICAgICAgICAgIFJOICA2Ci1wRHN0TGVmdCAgICAgICAgUk4gIDkKLXBEc3RSaWdodCAgICAgICBSTiAgMTAKLU9mZnNldCAgICAgICAgICBSTiAgMTEKLVRlbXAgICAgICAgICAgICBSTiAgMTQKLUNvdW50ZXIgICAgICAgICBSTiAgMTIKLVRtcCAgICAgICAgICAgICBSTiAgNwotOy8vT3V0cHV0IHJlZ2lzdGVycwotCi1yZXN1bHQgICAgICAgICAgUk4gIDAKLTsvLyBOZW9uIHJlZ2lzdGVycwotcURhdGEwICAgICAgICAgIFFOICAwLlU4Ci1xRGF0YTEgICAgICAgICAgUU4gIDEuVTgKLWREYXRhMCAgICAgICAgICBETiAgMC5VOAotZERhdGExICAgICAgICAgIEROICAxLlU4Ci1kRGF0YTIgICAgICAgICAgRE4gIDIuVTgKLWREYXRhMyAgICAgICAgICBETiAgMy5VOAotCi0gICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCi0gICAgICAgIE1fQVJHICAgICAgIHBQbGFuZVN0ZXAsIDQKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCi0gICAgICAgIE1fTERSICAgICAgIGlQbGFuZVN0ZXAsIHBQbGFuZVN0ZXAKLSAgICAgICAgCi0gICAgICAgIFNVQiAgICAgICAgIHBUb3AsIHBTcmNEc3RQbGFuZSwgIzAgICAgICAgICAgICAgIDsvLyBUb3Agcm93IHBvaW50ZXIgb2YgdGhlIGZyYW1lCi0gICAgICAgIE1VTCAgICAgICAgIE9mZnNldCwgaUV4cGFuZFBlbHMsIGlQbGFuZVN0ZXAgICAgIDsvLyBFKlN0ZXAgICAgICAgIAotICAgICAgICBTVUIgICAgICAgICBUZW1wLCBpRnJhbWVIZWlnaHQsICMxICAgICAgICAgICAgICA7Ly8gSC0xCi0gICAgICAgIE1VTCAgICAgICAgIFRlbXAsIGlQbGFuZVN0ZXAsIFRlbXAgICAgICAgICAgICAgIDsvLyAoSC0xKSpTdGVwCi0gICAgICAgIEFERCAgICAgICAgIHBCb3QsIFRlbXAsIHBTcmNEc3RQbGFuZSAgICAgICAgICAgIDsvLyBCUHRyID0gVFB0ciArIChILTEpKlN0ZXAKLSAgICAgICAgTU9WICAgICAgICAgVGVtcCwgaUZyYW1lV2lkdGggICAgICAgICAgICAgICAgICAgOy8vIE91dGVyIGxvb3AgY291bnRlcgotICAgICAgICAKLSAgICAgICAgOy8vIENoZWNrIGlmIHBTcmNEc3RQbGFuZSBhbmQgaVBsYW5lU3RlcCBhcmUgMTYgYnl0ZSBhbGlnbmVkCi0gICAgICAgIFRTVCAgICAgICAgIHBTcmNEc3RQbGFuZSwgIzB4ZgotICAgICAgICBUU1RFUSAgICAgICBpUGxhbmVTdGVwLCAjMHhmICAgICAgICAKLSAgICAgICAgQk5FICAgICAgICAgSG9yOExvb3AwMAotICAgICAgICAKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBDb3B5IHRvcCBhbmQgYm90dG9tIHJlZ2lvbiBvZiB0aGUgcGxhbmUgYXMgZm9sbG93cwotICAgICAgICA7Ly8gdG9wIHJlZ2lvbiA9IHRvcCByb3cgZWxlbWVudHMgZnJvbSB0aGUgZnJhbWUKLSAgICAgICAgOy8vIGJvdHRvbSByZWdpb24gPSBsYXN0IHJvdyBlbGVtZW50cyBmcm9tIHRoZSBmcmFtZQotICAgICAgICA7Ly8KLQotICAgICAgICA7Ly8gQ2FzZSBmb3IgMTYgYnl0ZSBhbGlnbm1lbnQKLUhvcjE2TG9vcDAwCi0gICAgICAgIFNVQiAgICAgICAgIHBEc3RUb3AsIHBUb3AsIE9mZnNldAotICAgICAgICBWTEQxICAgICAgICBxRGF0YTAsIFtwVG9wIEAxMjhdIQotICAgICAgICBNT1YgICAgICAgICBDb3VudGVyLCBpRXhwYW5kUGVscyAgICAgICAgICAgICAgICA7Ly8gSW5uZXIgbG9vcCBjb3VudGVyCi0gICAgICAgIEFERCAgICAgICAgIHBEc3RCb3QsIHBCb3QsIGlQbGFuZVN0ZXAKLSAgICAgICAgVkxEMSAgICAgICAgcURhdGExLCBbcEJvdCBAMTI4XSEKLVZlcjE2TG9vcDAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBAMTI4XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEAxMjhdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDEyOF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBAMTI4XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEAxMjhdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDEyOF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBAMTI4XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEAxMjhdLCBpUGxhbmVTdGVwCi0gICAgICAgIFNVQlMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICM4Ci0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDEyOF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBAMTI4XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEAxMjhdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDEyOF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBAMTI4XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEAxMjhdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDEyOF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBAMTI4XSwgaVBsYW5lU3RlcCAgICAgICAgCi0gICAgICAgIEJHVCAgICAgICAgIFZlcjE2TG9vcDAKLQotICAgICAgICBTVUJTICAgICAgICBUZW1wLCBUZW1wLCAjMTYKLSAgICAgICAgQkdUICAgICAgICAgSG9yMTZMb29wMDAKLSAgICAgICAgQiAgICAgICAgICAgRW5kQWxpZ25lZExvb3AKLSAgICAgICAgCi0gICAgICAgIDsvLyBDYXNlIGZvciA4IGJ5dGUgYWxpZ25tZW50Ci1Ib3I4TG9vcDAwCi0gICAgICAgIFNVQiAgICAgICAgIHBEc3RUb3AsIHBUb3AsIE9mZnNldAotICAgICAgICBWTEQxICAgICAgICBxRGF0YTAsIFtwVG9wIEA2NF0hCi0gICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsIGlFeHBhbmRQZWxzICAgICAgICAgICAgICAgIDsvLyBJbm5lciBsb29wIGNvdW50ZXIKLSAgICAgICAgQUREICAgICAgICAgcERzdEJvdCwgcEJvdCwgaVBsYW5lU3RlcAotICAgICAgICBWTEQxICAgICAgICBxRGF0YTEsIFtwQm90IEA2NF0hCi1WZXI4TG9vcDAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBANjRdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDY0XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEA2NF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBANjRdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDY0XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEA2NF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBANjRdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDY0XSwgaVBsYW5lU3RlcAotICAgICAgICBTVUJTICAgICAgICBDb3VudGVyLCBDb3VudGVyLCAjOAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEA2NF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBANjRdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDY0XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEA2NF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBANjRdLCBpUGxhbmVTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDY0XSwgaVBsYW5lU3RlcAotICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEA2NF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBANjRdLCBpUGxhbmVTdGVwICAgICAgICAKLSAgICAgICAgQkdUICAgICAgICAgVmVyOExvb3AwCi0KLSAgICAgICAgU1VCUyAgICAgICAgVGVtcCwgVGVtcCwgIzE2Ci0gICAgICAgIEJHVCAgICAgICAgIEhvcjhMb29wMDAKLQotRW5kQWxpZ25lZExvb3AKLSAgICAgICAgQUREICAgICAgICAgVGVtcCwgcFNyY0RzdFBsYW5lLCBpRnJhbWVXaWR0aAotICAgICAgICBTVUIgICAgICAgICBwRHN0UmlnaHQsIFRlbXAsIE9mZnNldAotICAgICAgICBTVUIgICAgICAgICBwUmlnaHQsIFRlbXAsICMxCi0gICAgICAgIFNVQiAgICAgICAgIHBEc3RMZWZ0LCBwU3JjRHN0UGxhbmUsIE9mZnNldCAgICAKLSAgICAgICAgU1VCICAgICAgICAgcERzdExlZnQsIHBEc3RMZWZ0LCBpRXhwYW5kUGVscyAgICAKLSAgICAgICAgQUREICAgICAgICAgcExlZnQsIHBTcmNEc3RQbGFuZSwgIzAKLSAgICAgICAgCi0gICAgICAgIFZMRDEgICAgICAgIHtkRGF0YTAgW119LCBbcExlZnRdLCBpUGxhbmVTdGVwICAgICAgICA7Ly8gVG9wLUxlZnQgY29ybmVyIHBpeGVsIGZyb20gZnJhbWUgZHVwbGljYXRlZCBpbiBkRGF0YTAKLSAgICAgICAgU1VCICAgICAgICAgT2Zmc2V0LCBpUGxhbmVTdGVwLCBpRXhwYW5kUGVscwotICAgICAgICBWTEQxICAgICAgICB7ZERhdGExIFtdfSwgW3BSaWdodF0sIGlQbGFuZVN0ZXAgICAgICAgOy8vIFRvcC1SaWdodCBjb3JuZXIgcGl4ZWwgZnJvbSBmcmFtZSBkdXBsaWNhdGVkIGluIGREYXRhMQotICAgICAgICBNT1YgICAgICAgICBUZW1wLCBpRXhwYW5kUGVscwotCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gQ29weSB0b3AtbGVmdCBhbmQgdG9wLXJpZ2h0IHJlZ2lvbiBvZiB0aGUgcGxhbmUgYXMgZm9sbG93cwotICAgICAgICA7Ly8gdG9wLWxlZnQgcmVnaW9uID0gdG9wLWxlZnQgY29ybmVyIHBpeGVsIGZyb20gdGhlIGZyYW1lCi0gICAgICAgIDsvLyB0b3AtcmlnaHQgcmVnaW9uID0gdG9wLXJpZ2h0IGNvcm5lciBwaXhlbCBmcm9tIHRoZSBmcmFtZQotICAgICAgICA7Ly8KLUhvckxvb3AxMQotICAgICAgICBNT1YgICAgICAgICBDb3VudGVyLCBpRXhwYW5kUGVscwotVmVyTG9vcDEKLSAgICAgICAgVlNUMSAgICAgICAgZERhdGEwLCBbcERzdExlZnRdLCAjOAotICAgICAgICBTVUJTICAgICAgICBDb3VudGVyLCBDb3VudGVyLCAjOAotICAgICAgICBWU1QxICAgICAgICBkRGF0YTEsIFtwRHN0UmlnaHRdLCAjOCAgICAgICAgCi0gICAgICAgIEJHVCAgICAgICAgIFZlckxvb3AxCi0KLSAgICAgICAgU1VCUyAgICAgICAgVGVtcCwgVGVtcCwgIzEKLSAgICAgICAgQUREICAgICAgICAgcERzdExlZnQsIHBEc3RMZWZ0LCBPZmZzZXQKLSAgICAgICAgQUREICAgICAgICAgcERzdFJpZ2h0LCBwRHN0UmlnaHQsIE9mZnNldAotICAgICAgICBCUEwgICAgICAgICBIb3JMb29wMTEKLQotICAgICAgICBTVUIgICAgICAgICBpRnJhbWVIZWlnaHQsIGlGcmFtZUhlaWdodCwgIzEKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBDb3B5IGxlZnQgYW5kIHJpZ2h0IHJlZ2lvbiBvZiB0aGUgcGxhbmUgYXMgZm9sbG93cwotICAgICAgICA7Ly8gTGVmdCByZWdpb24gPSBjb3B5IHRoZSByb3cgd2l0aCBsZWZ0IHN0YXJ0IHBpeGVsIGZyb20gdGhlIGZyYW1lCi0gICAgICAgIDsvLyBSaWdodCByZWdpb24gPSBjb3B5IHRoZSByb3cgd2l0aCByaWdodCBlbmQgcGl4ZWwgZnJvbSB0aGUgZnJhbWUKLSAgICAgICAgOy8vCi1Ib3JMb29wMjIKLSAgICAgICAgVkxEMSAgICAgICAge2REYXRhMCBbXX0sIFtwTGVmdF0sIGlQbGFuZVN0ZXAKLSAgICAgICAgTU9WICAgICAgICAgQ291bnRlciwgaUV4cGFuZFBlbHMKLSAgICAgICAgVkxEMSAgICAgICAge2REYXRhMSBbXX0sIFtwUmlnaHRdLCBpUGxhbmVTdGVwCi1WZXJMb29wMgotICAgICAgICBWU1QxICAgICAgICBkRGF0YTAsIFtwRHN0TGVmdF0sICM4Ci0gICAgICAgIFNVQlMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICM4Ci0gICAgICAgIFZTVDEgICAgICAgIGREYXRhMSwgW3BEc3RSaWdodF0sICM4ICAgICAgICAKLSAgICAgICAgQkdUICAgICAgICAgVmVyTG9vcDIKLQotICAgICAgICBTVUJTICAgICAgICBpRnJhbWVIZWlnaHQsIGlGcmFtZUhlaWdodCwgIzEKLSAgICAgICAgQUREICAgICAgICAgcERzdExlZnQsIHBEc3RMZWZ0LCBPZmZzZXQKLSAgICAgICAgQUREICAgICAgICAgcERzdFJpZ2h0LCBwRHN0UmlnaHQsIE9mZnNldAotICAgICAgICBCR1QgICAgICAgICBIb3JMb29wMjIKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgVGVtcCwgaUV4cGFuZFBlbHMKLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBDb3B5IGJvdHRvbS1sZWZ0IGFuZCBib3R0b20tcmlnaHQgcmVnaW9uIG9mIHRoZSBwbGFuZSBhcyBmb2xsb3dzCi0gICAgICAgIDsvLyBib3R0b20tbGVmdCByZWdpb24gPSBib3R0b20tbGVmdCBjb3JuZXIgcGl4ZWwgZnJvbSB0aGUgZnJhbWUKLSAgICAgICAgOy8vIGJvdHRvbS1yaWdodCByZWdpb24gPSBib3R0b20tcmlnaHQgY29ybmVyIHBpeGVsIGZyb20gdGhlIGZyYW1lCi0gICAgICAgIDsvLwotSG9yTG9vcDMzCi0gICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsIGlFeHBhbmRQZWxzCi1WZXJMb29wMwotICAgICAgICBWU1QxICAgICAgICBkRGF0YTAsIFtwRHN0TGVmdF0sICM4Ci0gICAgICAgIFNVQlMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICM4Ci0gICAgICAgIFZTVDEgICAgICAgIGREYXRhMSwgW3BEc3RSaWdodF0sICM4ICAgICAgICAKLSAgICAgICAgQkdUICAgICAgICAgVmVyTG9vcDMKLQotICAgICAgICBTVUJTICAgICAgICBUZW1wLCBUZW1wLCAjMQotICAgICAgICBBREQgICAgICAgICBwRHN0TGVmdCwgcERzdExlZnQsIE9mZnNldAotICAgICAgICBBREQgICAgICAgICBwRHN0UmlnaHQsIHBEc3RSaWdodCwgT2Zmc2V0Ci0gICAgICAgIEJHVCAgICAgICAgIEhvckxvb3AzMwotRW5kCi0gICAgICAgIE1PViAgICAgICAgIHIwLCAjT01YX1N0c19Ob0VycgotICAgICAgICAKLSAgICAgICAgTV9FTkQgICAgCi0gICAgCi0gICAgRU5ESUYKLQotCi0KLSAgICAgICAgCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0gICAgCi0gCi0gICAgICAgICAgICAKLSAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZGU5YTcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDEyMjkwCi0gKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIAotICogSGVhZGVyIGZpbGUgZm9yIG9wdGltaXplZCBILjI2NCBDQUxWQyB0YWJsZXMKLSAqIAotICovCi0gCi0jaWZuZGVmIEFSTVZDTTRQMTBfQ0FWTENUQUJMRVNfSAotI2RlZmluZSBBUk1WQ000UDEwX0NBVkxDVEFCTEVTX0gKLSAgCi0vKiBDQVZMQyB0YWJsZXMgKi8KLQotZXh0ZXJuIGNvbnN0IE9NWF9VMTYgKmFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzWzE4XTsKLWV4dGVybiBjb25zdCBPTVhfVTE2ICphcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzWzE1XTsKLWV4dGVybiBjb25zdCBPTVhfVTE2ICphcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc1szXTsKLWV4dGVybiBjb25zdCBPTVhfVTE2ICphcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzWzE1XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9aaWdaYWdfNHg0WzE2XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9aaWdaYWdfMngyWzRdOwotZXh0ZXJuIGNvbnN0IE9NWF9TOCBhcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWxbN107Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmM2ViOWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucworKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLQotOy8vIEZ1bmN0aW9uczoKLTsvLyAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjxBTElHTk1FTlQ+X3Vuc2FmZSAgCi07Ly8KLTsvLyBJbXBsZW1lbnRzIEF2ZXJhZ2Ugb2YgNHg0IHdpdGggZXF1YXRpb24gYyA9IChhK2IrMSk+PjEuCi07Ly8gRmlyc3Qgb3BlcmFuZCB3aWxsIGJlIGF0IG9mZnNldCBBTElHTk1FTlQgZnJvbSBhbGlnbmVkIGFkZHJlc3MKLTsvLyBTZWNvbmQgb3BlcmFuZCB3aWxsIGJlIGF0IGFsaWduZWQgbG9jYXRpb24gYW5kIHdpbGwgYmUgdXNlZCBhcyBvdXRwdXQuCi07Ly8gZGVzdGluYXRpb24gcG9pbnRlZCBieSAocERzdCkgZm9yIHZlcnRpY2FsIGludGVycG9sYXRpb24uCi07Ly8gVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBjb3B5IDQgYnl0ZXMgaW4gaG9yaXpvbnRhbCBkaXJlY3Rpb24gCi07Ly8KLTsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgotOy8vIHIwLHIxLHIyLHIzIHdoZXJlIHIyIGNvbnRhaW5pbmdzIGFsaWduZWQgbWVtb3J5IHBvaW50ZXIgYW5kIHIzIHN0ZXAgc2l6ZQotOy8vCi07Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCi07Ly8gcjQscjUscjYscjgscjkscjE0Ci07Ly8KLTsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCi07Ly8gcjcscjEwLHIxMSxyMTIKLTsvLwotOy8vIE91dHB1dCByZWdpc3RlcnMKLTsvLyByMiAtIHBvaW50ZXIgdG8gdGhlIGFsaWduZWQgbG9jYXRpb24KLTsvLyByMyAtIHN0ZXAgc2l6ZSB0byB0aGlzIGFsaWduZWQgbG9jYXRpb24KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24yX3Vuc2FmZQotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjNfdW5zYWZlCi0KLURFQlVHX09OICAgIFNFVEwge0ZBTFNFfQotCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLXBQcmVkMCAgICAgICAgICBSTiAwCi1pUHJlZFN0ZXAwICAgICAgUk4gMQotcFByZWQxICAgICAgICAgIFJOIDIKLWlQcmVkU3RlcDEgICAgICBSTiAzCi1wRHN0UHJlZCAgICAgICAgUk4gMgotaURzdFN0ZXAgICAgICAgIFJOIDMKLQotOy8vIERlY2xhcmUgb3RoZXIgaW50ZXJtZWRpYXRlIHJlZ2lzdGVycwotaVByZWRBMCAgICAgICAgIFJOIDEwCi1pUHJlZEExICAgICAgICAgUk4gMTEKLWlQcmVkQjAgICAgICAgICBSTiAxMgotaVByZWRCMSAgICAgICAgIFJOIDE0Ci1UZW1wMSAgICAgICAgICAgUk4gNAotVGVtcDIgICAgICAgICAgIFJOIDUKLVJlc3VsdEEgICAgICAgICBSTiA1Ci1SZXN1bHRCICAgICAgICAgUk4gNAotcjB4ODA4MDgwODAgICAgIFJOIDcKLQotICAgIElGIEFSTTExMzZKUwotICAgICAgICAKLSAgICAgICAgOy8vIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBhdmVyYWdlIG9mIDR4NCBibG9jayAKLSAgICAgICAgOy8vIHBQcmVkMCBpcyBhdCBhbGlnbm1lbnQgb2Zmc2V0IDAgYW5kIHBQcmVkMSBpcyBhbGlnbm1lbnQgNAotCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUsIHI2Ci0KLSAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgICAgIAotICAgICAgICBMRFIgICAgICAgICByMHg4MDgwODA4MCwgPTB4ODA4MDgwODAKLQotICAgICAgICA7Ly8gMXN0IGxvYWQKLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAotCi0gICAgICAgIDsvLyAoYStiKzEpLzIgPSAoYSsyNTYtKDI1NS1iKSkvMiA9IChhLSgyNTUtYikpLzIgKyAxMjgKLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxCi0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyAybmQgbG9hZAotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCi0KLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCi0gICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEKLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MCAgICAgICAgCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgICAgICAgICAgCi1FbmQwCi0gICAgICAgIE1fRU5ECi0KLSAgICAgICAgOy8vIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBhdmVyYWdlIG9mIDR4NCBibG9jayAKLSAgICAgICAgOy8vIHBQcmVkMCBpcyBhdCBhbGlnbm1lbnQgb2Zmc2V0IDIgYW5kIHBQcmVkMSBpcyBhbGlnbm1lbnQgNAotCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMl91bnNhZmUsIHI2Ci0KLSAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgICAgIAotICAgICAgICBMRFIgICAgICAgICByMHg4MDgwODA4MCwgPTB4ODA4MDgwODAKLQotICAgICAgICA7Ly8gMXN0IGxvYWQKLSAgICAgICAgTERSICAgICAgICAgVGVtcDEsIFtwUHJlZDAsICM0XQotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCi0gICAgICAgIE1fTERSICAgICAgIFRlbXAyLCBbcFByZWQwLCAjNF0KLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgTFNSICMxNgotICAgICAgICBPUlIgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBUZW1wMSwgTFNMICMxNiAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIExTUiAjMTYKLSAgICAgICAgT1JSICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgVGVtcDIsIExTTCAjMTYKLQotICAgICAgICA7Ly8gKGErYisxKS8yID0gKGErMjU2LSgyNTUtYikpLzIgPSAoYS0oMjU1LWIpKS8yICsgMTI4Ci0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyAybmQgbG9hZAotICAgICAgICBMRFIgICAgICAgICBUZW1wMSwgW3BQcmVkMCwgIzRdCi0gICAgICAgIE1fTERSICAgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBpUHJlZEIwLCBbcFByZWQxXQotICAgICAgICBMRFIgICAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQotICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BQcmVkMCwgIzRdCi0gICAgICAgIE1fTERSICAgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxCi0gICAgICAgIE1PViAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIExTUiAjMTYKLSAgICAgICAgT1JSICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgVGVtcDEsIExTTCAjMTYgICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBMU1IgIzE2Ci0gICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIFRlbXAyLCBMU0wgIzE2Ci0KLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwICAgICAgICAKLSAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgICAgICAgICAKLUVuZDIKLSAgICAgICAgTV9FTkQKLQotCi0gICAgICAgIDsvLyBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYXZlcmFnZSBvZiA0eDQgYmxvY2sgCi0gICAgICAgIDsvLyBwUHJlZDAgaXMgYXQgYWxpZ25tZW50IG9mZnNldCAzIGFuZCBwUHJlZDEgaXMgYWxpZ25tZW50IDQKLQotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjNfdW5zYWZlLCByNgotCi0gICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgcjB4ODA4MDgwODAsID0weDgwODA4MDgwCi0KLSAgICAgICAgOy8vIDFzdCBsb2FkCi0gICAgICAgIExEUiAgICAgICAgIFRlbXAxLCBbcFByZWQwLCAjNF0KLSAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBpUHJlZEIwLCBbcFByZWQxXQotICAgICAgICBMRFIgICAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQotICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BQcmVkMCwgIzRdCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCi0KLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAotICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxCi0gICAgICAgIE1PViAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIExTUiAjMjQKLSAgICAgICAgT1JSICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgVGVtcDEsIExTTCAjOCAgICAgICAgICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgTFNSICMyNAotICAgICAgICBPUlIgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBUZW1wMiwgTFNMICM4Ci0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKLSAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQotICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyAybmQgbG9hZAotICAgICAgICBMRFIgICAgICAgICBUZW1wMSwgW3BQcmVkMCwgIzRdCi0gICAgICAgIE1fTERSICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KLSAgICAgICAgTERSICAgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KLSAgICAgICAgTERSICAgICAgICAgVGVtcDIsIFtwUHJlZDAsICM0XQotICAgICAgICBNX0xEUiAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAotCi0gICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjAsIGlQcmVkQjAKLSAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMQotICAgICAgICBNT1YgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBMU1IgIzI0Ci0gICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIFRlbXAxLCBMU0wgIzggICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBMU1IgIzI0Ci0gICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIFRlbXAyLCBMU0wgIzgKLQotICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCi0gICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKLSAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAgICAgICAgIAotICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCi0gICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCi0gICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAgICAgICAgIAotRW5kMwotICAgICAgICBNX0VORAotCi0gICAgRU5ESUYKLSAgICAKLSAgICBFTkQKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNGJkOWUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDEyMjkwCi0gKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIAotICogT3B0aW1pemVkIENBVkxDIHRhYmxlcyBmb3IgSC4yNjQKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLQotI2luY2x1ZGUgImFybVZDTTRQMTBfQ0FWTENUYWJsZXMuaCIKLQotLyogNHg0IERlWmlnWmFnIHRhYmxlICovCi0KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ180eDRbMTZdID0KLXsKLSAgICAwLCAxLCA0LCA4LCA1LCAyLCAzLCA2LCA5LCAxMiwgMTMsIDEwLCA3LCAxMSwgMTQsIDE1Ci19OwotCi0vKiAyeDIgRGVaaWdaYWcgdGFibGUgKi8KLQotY29uc3QgT01YX1U4IGFybVZDTTRQMTBfWmlnWmFnXzJ4Mls0XSA9Ci17Ci0gICAgMCwgMSwgMiwgMwotfTsKLQotCi0vKgotICogU3VmZml4IFRvIExldmVsIHRhYmxlCi0gKiBXZSBpbmNyZW1lbnQgdGhlIHN1ZmZpeCBsZW5ndGggaWYgCi0gKiAoKExldmVsQ29kZT4+MSkrMSk+KDM8PChTdWZmaXhMZW5ndGgtMSkpICYmIFN1ZmZpeExlbmd0aDw2Ci0gKiAoTGV2ZWxDb2RlPj4xKT49KDM8PChTdWZmaXhMZW5ndGgtMSkpICAgICYmIFN1ZmZpeExlbmd0aDw2Ci0gKiAgTGV2ZWxDb2RlICAgID49IDM8PFN1ZmZpeExlbmd0aCAgICAgICAgICYmIFN1ZmZpeExlbmd0aDw2Ci0gKiAoTGV2ZWxDb2RlKzIpID49ICgzPDxTdWZmaXhMZW5ndGgpKzIgICAgICYmIFN1ZmZpeExlbmd0aDw2Ci0gKi8KLWNvbnN0IE9NWF9TOCBhcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWxbN10gPQotewotICAgICgzPDwxKSsyLCAgICAgICAvKiBTdWZmaXhMZW5ndGg9MSAqLwotICAgICgzPDwxKSsyLCAgICAgICAvKiBTdWZmaXhMZW5ndGg9MSAqLwotICAgICgzPDwyKSsyLCAgICAgICAvKiBTdWZmaXhMZW5ndGg9MiAqLwotICAgICgzPDwzKSsyLCAgICAgICAvKiBTdWZmaXhMZW5ndGg9MyAqLwotICAgICgzPDw0KSsyLCAgICAgICAvKiBTdWZmaXhMZW5ndGg9NCAqLwotICAgICgzPDw1KSsyLCAgICAgICAvKiBTdWZmaXhMZW5ndGg9NSAqLwotICAgIC0xICAgICAgICAgICAgICAvKiBTdWZmaXhMZW5ndGg9NiAtIG5ldmVyIGluY3JlbWVudCAqLwotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMFsxMzJdID0gewotICAgIDB4MDAyMCwgMHgwMTAwLCAweDIwMTUsIDB4MjAxNSwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLAotICAgIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLAotICAgIDB4MDAyOCwgMHgwMGYwLCAweDAwZjgsIDB4MDAyNywgMHgwMDMwLCAweDAwZDgsIDB4MDBlMCwgMHgwMGU4LAotICAgIDB4MDAzOCwgMHgwMGEwLCAweDAwYzgsIDB4MDBkMCwgMHgwMDQwLCAweDAwNjgsIDB4MDA5MCwgMHgwMDk4LAotICAgIDB4MDA0OCwgMHgwMDUwLCAweDAwNTgsIDB4MDA2MCwgMHgyN2ZmLCAweDI3ZmYsIDB4MjA2YiwgMHgyMDZiLAotICAgIDB4MDA4MSwgMHgwMDg1LCAweDAwODMsIDB4MDA3OSwgMHgwMDg3LCAweDAwN2QsIDB4MDA3YiwgMHgwMDcxLAotICAgIDB4MDA3ZiwgMHgwMDc1LCAweDAwNzMsIDB4MDA2OSwgMHgwMDcwLCAweDAwNzgsIDB4MDA4MCwgMHgwMDg4LAotICAgIDB4MjA3NywgMHgyMDc3LCAweDIwNmQsIDB4MjA2ZCwgMHgyMDYzLCAweDIwNjMsIDB4MjA2MSwgMHgyMDYxLAotICAgIDB4MjA2ZiwgMHgyMDZmLCAweDIwNjUsIDB4MjA2NSwgMHgyMDViLCAweDIwNWIsIDB4MjA1OSwgMHgyMDU5LAotICAgIDB4MDA2NywgMHgwMDVkLCAweDAwNTMsIDB4MDA1MSwgMHgwMDVmLCAweDAwNTUsIDB4MDA0YiwgMHgwMDQ5LAotICAgIDB4MDBhOCwgMHgwMGIwLCAweDAwYjgsIDB4MDBjMCwgMHgyMDQxLCAweDIwNDEsIDB4MjA0ZCwgMHgyMDRkLAotICAgIDB4MjA0MywgMHgyMDQzLCAweDIwMzksIDB4MjAzOSwgMHgyMDU3LCAweDIwNTcsIDB4MjA0NSwgMHgyMDQ1LAotICAgIDB4MjAzYiwgMHgyMDNiLCAweDIwMzEsIDB4MjAzMSwgMHgyMDRmLCAweDIwNGYsIDB4MjAzZCwgMHgyMDNkLAotICAgIDB4MjAzMywgMHgyMDMzLCAweDIwMjksIDB4MjAyOSwgMHgwMDQ3LCAweDAwMzUsIDB4MDAyYiwgMHgwMDIxLAotICAgIDB4MjAzZiwgMHgyMDNmLCAweDIwMmQsIDB4MjAyZCwgMHgyMDIzLCAweDIwMjMsIDB4MjAxOSwgMHgyMDE5LAotICAgIDB4MDAzNywgMHgwMDI1LCAweDAwMWIsIDB4MDAxMSwgMHgyMDJmLCAweDIwMmYsIDB4MjAxZCwgMHgyMDFkLAotICAgIDB4MDAxMywgMHgwMDA5LCAweDIwMWYsIDB4MjAxZgotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMVsxMjhdID0gewotICAgIDB4MDAyMCwgMHgwMGU4LCAweDAwZjAsIDB4MDBmOCwgMHgwMDI3LCAweDAwMWYsIDB4MjAxNSwgMHgyMDE1LAotICAgIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLAotICAgIDB4MDAyOCwgMHgwMGQwLCAweDAwZDgsIDB4MDBlMCwgMHgwMDMwLCAweDAwOTgsIDB4MDBjMCwgMHgwMGM4LAotICAgIDB4MDAzOCwgMHgwMDYwLCAweDAwODgsIDB4MDA5MCwgMHgwMDQwLCAweDAwNDgsIDB4MDA1MCwgMHgwMDU4LAotICAgIDB4MjdmZiwgMHgyN2ZmLCAweDIwN2YsIDB4MjA3ZiwgMHgwMDg3LCAweDAwODUsIDB4MDA4MywgMHgwMDgxLAotICAgIDB4MDA3YiwgMHgwMDc5LCAweDAwN2QsIDB4MDA3MywgMHgyMDc1LCAweDIwNzUsIDB4MjA3MSwgMHgyMDcxLAotICAgIDB4MDA2OCwgMHgwMDcwLCAweDAwNzgsIDB4MDA4MCwgMHgyMDc3LCAweDIwNzcsIDB4MjA2ZCwgMHgyMDZkLAotICAgIDB4MjA2YiwgMHgyMDZiLCAweDIwNjksIDB4MjA2OSwgMHgyMDZmLCAweDIwNmYsIDB4MjA2NSwgMHgyMDY1LAotICAgIDB4MjA2MywgMHgyMDYzLCAweDIwNjEsIDB4MjA2MSwgMHgwMDU5LCAweDAwNWQsIDB4MDA1YiwgMHgwMDUxLAotICAgIDB4MDA2NywgMHgwMDU1LCAweDAwNTMsIDB4MDA0OSwgMHgwMGEwLCAweDAwYTgsIDB4MDBiMCwgMHgwMGI4LAotICAgIDB4MjA1ZiwgMHgyMDVmLCAweDIwNGQsIDB4MjA0ZCwgMHgyMDRiLCAweDIwNGIsIDB4MjA0MSwgMHgyMDQxLAotICAgIDB4MjA1NywgMHgyMDU3LCAweDIwNDUsIDB4MjA0NSwgMHgyMDQzLCAweDIwNDMsIDB4MjAzOSwgMHgyMDM5LAotICAgIDB4MjA0ZiwgMHgyMDRmLCAweDIwM2QsIDB4MjAzZCwgMHgyMDNiLCAweDIwM2IsIDB4MjAzMSwgMHgyMDMxLAotICAgIDB4MDAyOSwgMHgwMDM1LCAweDAwMzMsIDB4MDAyMSwgMHgyMDQ3LCAweDIwNDcsIDB4MjAyZCwgMHgyMDJkLAotICAgIDB4MjAyYiwgMHgyMDJiLCAweDIwMTksIDB4MjAxOSwgMHgwMDNmLCAweDAwMjUsIDB4MDAyMywgMHgwMDExLAotICAgIDB4MDAzNywgMHgwMDFkLCAweDAwMWIsIDB4MDAwOSwgMHgyMDJmLCAweDIwMmYsIDB4MjAxMywgMHgyMDEzCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18yWzExMl0gPSB7Ci0gICAgMHgwMDIwLCAweDAwODgsIDB4MDBiMCwgMHgwMGI4LCAweDAwYzAsIDB4MDBjOCwgMHgwMGQwLCAweDAwZDgsCi0gICAgMHgwMDNmLCAweDAwMzcsIDB4MDAyZiwgMHgwMDI3LCAweDAwMWYsIDB4MDAxNSwgMHgwMDBiLCAweDAwMDEsCi0gICAgMHgwMDI4LCAweDAwNTAsIDB4MDA3OCwgMHgwMDgwLCAweDAwMzAsIDB4MDAzOCwgMHgwMDQwLCAweDAwNDgsCi0gICAgMHgwN2ZmLCAweDAwODEsIDB4MDA4NywgMHgwMDg1LCAweDAwODMsIDB4MDA3OSwgMHgwMDdmLCAweDAwN2QsCi0gICAgMHgwMDdiLCAweDAwNzEsIDB4MDA3NywgMHgwMDc1LCAweDAwNzMsIDB4MDA2OSwgMHgyMDZiLCAweDIwNmIsCi0gICAgMHgwMDU4LCAweDAwNjAsIDB4MDA2OCwgMHgwMDcwLCAweDIwNjEsIDB4MjA2MSwgMHgyMDZkLCAweDIwNmQsCi0gICAgMHgyMDYzLCAweDIwNjMsIDB4MjA1OSwgMHgyMDU5LCAweDIwNmYsIDB4MjA2ZiwgMHgyMDY1LCAweDIwNjUsCi0gICAgMHgyMDViLCAweDIwNWIsIDB4MjA1MSwgMHgyMDUxLCAweDAwNjcsIDB4MDA1ZCwgMHgwMDUzLCAweDAwNDksCi0gICAgMHgwMDVmLCAweDAwNTUsIDB4MDA0YiwgMHgwMDQxLCAweDAwOTAsIDB4MDA5OCwgMHgwMGEwLCAweDAwYTgsCi0gICAgMHgyMDM5LCAweDIwMzksIDB4MjAzMSwgMHgyMDMxLCAweDIwNGQsIDB4MjA0ZCwgMHgyMDI5LCAweDIwMjksCi0gICAgMHgyMDU3LCAweDIwNTcsIDB4MjA0NSwgMHgyMDQ1LCAweDIwNDMsIDB4MjA0MywgMHgyMDIxLCAweDIwMjEsCi0gICAgMHgwMDE5LCAweDAwM2QsIDB4MDAzYiwgMHgwMDExLCAweDAwNGYsIDB4MDAzNSwgMHgwMDMzLCAweDAwMDksCi0gICAgMHgyMDJiLCAweDIwMmIsIDB4MjAyZCwgMHgyMDJkLCAweDIwMjMsIDB4MjAyMywgMHgyMDI1LCAweDIwMjUsCi0gICAgMHgyMDFiLCAweDIwMWIsIDB4MjA0NywgMHgyMDQ3LCAweDIwMWQsIDB4MjAxZCwgMHgyMDEzLCAweDIwMTMKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzNbODBdID0gewotICAgIDB4MDAyMCwgMHgwMDI4LCAweDAwMzAsIDB4MDAzOCwgMHgwMDQwLCAweDAwNDgsIDB4MDA1MCwgMHgwMDU4LAotICAgIDB4MDA2MCwgMHgwMDY4LCAweDAwNzAsIDB4MDA3OCwgMHgwMDgwLCAweDAwODgsIDB4MDA5MCwgMHgwMDk4LAotICAgIDB4MDAwOSwgMHgwMDBiLCAweDA3ZmYsIDB4MDAwMSwgMHgwMDExLCAweDAwMTMsIDB4MDAxNSwgMHgwN2ZmLAotICAgIDB4MDAxOSwgMHgwMDFiLCAweDAwMWQsIDB4MDAxZiwgMHgwMDIxLCAweDAwMjMsIDB4MDAyNSwgMHgwMDI3LAotICAgIDB4MDAyOSwgMHgwMDJiLCAweDAwMmQsIDB4MDAyZiwgMHgwMDMxLCAweDAwMzMsIDB4MDAzNSwgMHgwMDM3LAotICAgIDB4MDAzOSwgMHgwMDNiLCAweDAwM2QsIDB4MDAzZiwgMHgwMDQxLCAweDAwNDMsIDB4MDA0NSwgMHgwMDQ3LAotICAgIDB4MDA0OSwgMHgwMDRiLCAweDAwNGQsIDB4MDA0ZiwgMHgwMDUxLCAweDAwNTMsIDB4MDA1NSwgMHgwMDU3LAotICAgIDB4MDA1OSwgMHgwMDViLCAweDAwNWQsIDB4MDA1ZiwgMHgwMDYxLCAweDAwNjMsIDB4MDA2NSwgMHgwMDY3LAotICAgIDB4MDA2OSwgMHgwMDZiLCAweDAwNmQsIDB4MDA2ZiwgMHgwMDcxLCAweDAwNzMsIDB4MDA3NSwgMHgwMDc3LAotICAgIDB4MDA3OSwgMHgwMDdiLCAweDAwN2QsIDB4MDA3ZiwgMHgwMDgxLCAweDAwODMsIDB4MDA4NSwgMHgwMDg3Ci19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc180WzMyXSA9IHsKLSAgICAweDAwMjAsIDB4MDAzOCwgMHgyMDE1LCAweDIwMTUsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwKLSAgICAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwKLSAgICAweDAwMjgsIDB4MDAzMCwgMHgwMDIxLCAweDAwMTksIDB4MjAyNywgMHgyMDI3LCAweDAwMjUsIDB4MDAyMywKLSAgICAweDIwMWQsIDB4MjAxZCwgMHgyMDFiLCAweDIwMWIsIDB4MDAxMSwgMHgwMDFmLCAweDAwMTMsIDB4MDAwOQotfTsKLQotY29uc3QgT01YX1UxNiAqIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzWzE4XSA9IHsKLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18wLCAvKiBuQz0wICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMCwgLyogbkM9MSAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzEsIC8qIG5DPTIgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18xLCAvKiBuQz0zICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMiwgLyogbkM9NCAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzIsIC8qIG5DPTUgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18yLCAvKiBuQz02ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMiwgLyogbkM9NyAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTggKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz05ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTAgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xMSAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTEyICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTMgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xNCAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTE1ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTYgKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc180ICAvKiBuQz0tMSAqLwotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18wWzQwXSA9IHsKLSAgICAweDAwMjAsIDB4MDA0OCwgMHgwMDA5LCAweDAwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDIwMDMsIDB4MjAwMywKLSAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwKLSAgICAweDAwMjgsIDB4MDA0MCwgMHgwMDExLCAweDAwMGYsIDB4MDAzMCwgMHgwMDM4LCAweDAwMTksIDB4MDAxNywKLSAgICAweDI3ZmYsIDB4MjdmZiwgMHgyMDFmLCAweDIwMWYsIDB4MjAxZCwgMHgyMDFkLCAweDIwMWIsIDB4MjAxYiwKLSAgICAweDIwMTUsIDB4MjAxNSwgMHgyMDEzLCAweDIwMTMsIDB4MjAwZCwgMHgyMDBkLCAweDIwMGIsIDB4MjAwYgotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xWzI0XSA9IHsKLSAgICAweDAwMjAsIDB4MDAyOCwgMHgwMDExLCAweDAwMGYsIDB4MDAwZCwgMHgwMDBiLCAweDIwMDksIDB4MjAwOSwKLSAgICAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLCAweDIwMDEsIDB4MjAwMSwKLSAgICAweDAwMWQsIDB4MDAxYiwgMHgwMDE5LCAweDAwMTcsIDB4MjAxNSwgMHgyMDE1LCAweDIwMTMsIDB4MjAxMwotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18yWzI0XSA9IHsKLSAgICAweDAwMjAsIDB4MDAyOCwgMHgwMDExLCAweDAwMGIsIDB4MDAwOSwgMHgwMDAxLCAweDIwMGYsIDB4MjAwZiwKLSAgICAweDIwMGQsIDB4MjAwZCwgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDIwMDMsIDB4MjAwMywKLSAgICAweDAwMWIsIDB4MDAxNywgMHgyMDE5LCAweDIwMTksIDB4MjAxNSwgMHgyMDE1LCAweDIwMTMsIDB4MjAxMwotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18zWzI0XSA9IHsKLSAgICAweDAwMjAsIDB4MDAyOCwgMHgwMDEzLCAweDAwMGYsIDB4MDAwNywgMHgwMDA1LCAweDIwMTEsIDB4MjAxMSwKLSAgICAweDIwMGQsIDB4MjAwZCwgMHgyMDBiLCAweDIwMGIsIDB4MjAwOSwgMHgyMDA5LCAweDIwMDMsIDB4MjAwMywKLSAgICAweDIwMTksIDB4MjAxOSwgMHgyMDE3LCAweDIwMTcsIDB4MjAxNSwgMHgyMDE1LCAweDIwMDEsIDB4MjAwMQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc180WzIwXSA9IHsKLSAgICAweDAwMjAsIDB4MDAxNSwgMHgwMDExLCAweDAwMDUsIDB4MDAwMywgMHgwMDAxLCAweDIwMGYsIDB4MjAwZiwKLSAgICAweDIwMGQsIDB4MjAwZCwgMHgyMDBiLCAweDIwMGIsIDB4MjAwOSwgMHgyMDA5LCAweDIwMDcsIDB4MjAwNywKLSAgICAweDIwMTcsIDB4MjAxNywgMHgyMDEzLCAweDIwMTMKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNVsyMF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMTEsIDB4MjAxMywgMHgyMDEzLCAweDIwMGYsIDB4MjAwZiwgMHgyMDBkLCAweDIwMGQsCi0gICAgMHgyMDBiLCAweDIwMGIsIDB4MjAwOSwgMHgyMDA5LCAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsCi0gICAgMHgwMDE1LCAweDAwMDEsIDB4MjAwMywgMHgyMDAzCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzZbMjBdID0gewotICAgIDB4MDAyMCwgMHgwMDBmLCAweDIwMTEsIDB4MjAxMSwgMHgyMDBkLCAweDIwMGQsIDB4MjAwOSwgMHgyMDA5LAotICAgIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLAotICAgIDB4MDAxMywgMHgwMDAxLCAweDIwMDMsIDB4MjAwMwotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc183WzIwXSA9IHsKLSAgICAweDAwMjAsIDB4MDAwMywgMHgyMDBmLCAweDIwMGYsIDB4MjAwZCwgMHgyMDBkLCAweDIwMDcsIDB4MjAwNywKLSAgICAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwKLSAgICAweDAwMTEsIDB4MDAwMSwgMHgyMDA1LCAweDIwMDUKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfOFsyMF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMDUsIDB4MjAwYiwgMHgyMDBiLCAweDQwMGQsIDB4NDAwZCwgMHg0MDBkLCAweDQwMGQsCi0gICAgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsCi0gICAgMHgwMDAzLCAweDAwMDEsIDB4MjAwZiwgMHgyMDBmCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzlbMjBdID0gewotICAgIDB4MDAyMCwgMHgwMDBkLCAweDIwMDUsIDB4MjAwNSwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLAotICAgIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LAotICAgIDB4MjAwMywgMHgyMDAzLCAweDIwMDEsIDB4MjAwMQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMFsxNl0gPSB7Ci0gICAgMHgwMDAxLCAweDAwMDMsIDB4MjAwNSwgMHgyMDA1LCAweDIwMDcsIDB4MjAwNywgMHgyMDBiLCAweDIwMGIsCi0gICAgMHg2MDA5LCAweDYwMDksIDB4NjAwOSwgMHg2MDA5LCAweDYwMDksIDB4NjAwOSwgMHg2MDA5LCAweDYwMDkKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTFbMTZdID0gewotICAgIDB4MDAwMSwgMHgwMDAzLCAweDIwMDksIDB4MjAwOSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LAotICAgIDB4NjAwNywgMHg2MDA3LCAweDYwMDcsIDB4NjAwNywgMHg2MDA3LCAweDYwMDcsIDB4NjAwNywgMHg2MDA3Ci19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEyWzE2XSA9IHsKLSAgICAweDIwMDEsIDB4MjAwMSwgMHgyMDAzLCAweDIwMDMsIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywKLSAgICAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xM1sxNl0gPSB7Ci0gICAgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsCi0gICAgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTRbMTZdID0gewotICAgIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLAotICAgIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzCi19OwotCi1jb25zdCBPTVhfVTE2ICogYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc1sxNV0gPSB7Ci0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18wLAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMSwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzIsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18zLAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNCwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzUsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc182LAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNywKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzgsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc185LAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTAsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMSwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEyLAotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTMsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xNAotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMFsxNl0gPSB7Ci0gICAgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsCi0gICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzFbMTZdID0gewotICAgIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLAotICAgIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18yWzE2XSA9IHsKLSAgICAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywKLSAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMQotfTsKLQotY29uc3QgT01YX1UxNiAqIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzWzNdID0gewotICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzAsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMSwKLSAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18yCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzBbOF0gPSB7Ci0gICAgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMVs4XSA9IHsKLSAgICAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18yWzhdID0gewotICAgIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsIDB4MjAwMSwgMHgyMDAxCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzNbOF0gPSB7Ci0gICAgMHgwMDA5LCAweDAwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEKLX07Ci0KLXN0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNFs4XSA9IHsKLSAgICAweDAwMGIsIDB4MDAwOSwgMHgwMDA3LCAweDAwMDUsIDB4MjAwMywgMHgyMDAzLCAweDIwMDEsIDB4MjAwMQotfTsKLQotc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc181WzhdID0gewotICAgIDB4MDAwMywgMHgwMDA1LCAweDAwMDksIDB4MDAwNywgMHgwMDBkLCAweDAwMGIsIDB4MjAwMSwgMHgyMDAxCi19OwotCi1zdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzZbMjRdID0gewotICAgIDB4MDAxMCwgMHgwMDBkLCAweDAwMGIsIDB4MDAwOSwgMHgwMDA3LCAweDAwMDUsIDB4MDAwMywgMHgwMDAxLAotICAgIDB4MDAxOCwgMHgwMDExLCAweDIwMGYsIDB4MjAwZiwgMHgwMDIwLCAweDAwMTUsIDB4MjAxMywgMHgyMDEzLAotICAgIDB4MDAyOCwgMHgwMDE5LCAweDIwMTcsIDB4MjAxNywgMHgwN2ZmLCAweDAwMWQsIDB4MjAxYiwgMHgyMDFiCi19OwotCi0vKiBUYWJsZXMgNyB0byAxNCBhcmUgZHVwbGljYXRlcyBvZiB0YWJsZSA2ICovCi0KLWNvbnN0IE9NWF9VMTYgKiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzWzE1XSA9IHsKLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzAsICAvKiBaZXJvc0xlZnQ9MSAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMSwKLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzIsCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18zLAotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNCwKLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzUsICAvKiBaZXJvc0xlZnQ9NiAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD03ICovCi0gICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTggKi8KLSAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9OSAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD0xMCAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD0xMSAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD0xMiAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD0xMyAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD0xNCAqLwotICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiAgIC8qIFplcm9zTGVmdD0xNSAqLwotfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzgxM2QzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLQotCi0gICAgSUYgIENvcnRleEE4Ci0gICAgICAgIAotcEFscGhhICAgICAgUk4gMgotcEJldGEgICAgICAgUk4gMwotCi1wVGhyZXNob2xkcyBSTiA1Ci1wQlMgICAgICAgICBSTiA0Ci1iUzMyMTAgICAgICBSTiA2Ci0KLTsvLyBQaXhlbHMKLWRQXzAgICAgICAgIEROIEQ0LlU4Ci1kUF8xICAgICAgICBETiBENS5VOCAgCi1kUF8yICAgICAgICBETiBENi5VOCAgCi1kUF8zICAgICAgICBETiBENy5VOCAgCi1kUV8wICAgICAgICBETiBEOC5VOCAgCi1kUV8xICAgICAgICBETiBEOS5VOCAgCi1kUV8yICAgICAgICBETiBEMTAuVTggCi1kUV8zICAgICAgICBETiBEMTEuVTggCi0KLQotOy8vIEZpbHRlcmluZyBEZWNpc2lvbgotZEFscGhhICAgICAgRE4gRDAuVTgKLWRCZXRhICAgICAgIEROIEQyLlU4Ci0KLWRGaWx0ICAgICAgIEROIEQxNi5VOAotZEFxZmxnICAgICAgRE4gRDEyLlU4Ci1kQXBmbGcgICAgICBETiBEMTcuVTggCi0KLWRBcDBxMCAgICAgIEROIEQxMy5VOAotCi07Ly8gYlNMVDQKLWRUQzMyMTAgICAgIEROIEQxOC5VOCAgIAotZFRDcyAgICAgICAgRE4gRDMxLlM4Ci1kVEMgICAgICAgICBETiBEMzEuVTgKLQotZE1hc2tfMCAgICAgRE4gRDE0LlU4Ci1kTWFza18xICAgICBETiBEMTUuVTggICAgCi1kTWFza180ICAgICBETiBEMjYuVTE2Ci0KLWRUZW1wICAgICAgIEROIEQyOC5VOAotZER1bW15ICAgICAgRE4gRDE3LlU4Ci0KLTsvLyBDb21wdXRpbmcgUDAsUTAKLXFEcTBwMCAgICAgIFFOIFExMC5TMTYKLXFEcDFxMSAgICAgIFFOIFExMS5TMTYKLXFEZWx0YSAgICAgIFFOIFExMC5TMTYgIDsgcmV1c2UgcURxMHAwCi1kRGVsdGEgICAgICBETiBEMjAuUzgKLQotCi07Ly8gQ29tcHV0aW5nIFAxLFExCi1xUF8wbiAgICAgICBRTiBRMTQuUzE2Ci1xUV8wbiAgICAgICBRTiBRMTIuUzE2Ci0KLWRRXzBuICAgICAgIEROIEQyNC5VOAotZFBfMG4gICAgICAgRE4gRDI5LlU4Ci0KLTsvLyBiU0dFNAotCi1kSFNwMHExICAgICBETiBEMTMuVTgKLWRIU3EwcDEgICAgIEROIEQzMS5VOCAgIAotCi1kQlMzMjEwICAgICBETiBEMjguVTE2Ci0KLWRQXzB0ICAgICAgIEROIEQxMy5VOCAgIDtkSFNwMHExICAgICAgICAKLWRRXzB0ICAgICAgIEROIEQzMS5VOCAgIDtUZW1wMSAgICAgICAgCi0KLWRQXzBuICAgICAgIEROIEQyOS5VOAotZFFfMG4gICAgICAgRE4gRDI0LlU4ICAgO1RlbXAyICAgICAgICAKLQotOy8vIFJlZ2lzdGVyIHVzYWdlIGZvciAtIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKLTsvLwotOy8vIElucHV0cyAtIFBpeGVscyAgICAgICAgICAgICAtIHAwLXAzOiBENC1ENywgcTAtcTM6IEQ4LUQxMQotOy8vICAgICAgICAtIEZpbHRlciBtYXNrcyAgICAgICAtIGZpbHQ6IEQxNiwgYXFmbGc6IEQxMiwgYXBmbGc6IEQxNwotOy8vICAgICAgICAtIEFkZGl0aW9uYWwgUGFyYW1zICAtIHBUaHJlc2hvbGRzOiByNQotOy8vICAgICAgICAgCi07Ly8gT3V0cHV0cyAtIFBpeGVscyAgICAgICAgICAgIC0gUDAtUDE6IEQyOS1EMzAsIFEwLVExOiBEMjQtRDI1Ci07Ly8gICAgICAgICAtIEFkZGl0aW9uYWwgUGFyYW1zIC0gcFRocmVzaG9sZHM6IHI1Ci0KLTsvLyBSZWdpc3RlcnMgQ29ycnVwdGVkICAgICAgICAgLSBEMTgtRDMxCi0KLQotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTTFQ0X3Vuc2FmZQotCi0gICAgICAgIAotICAgICAgICA7ZFRDMzIxMCAtMTgKLSAgICAgICAgO2RUZW1wLTI4Ci0KLSAgICAgICAgVkxEMSAgICAgICAgZDE4LlUzMlswXSwgW3BUaHJlc2hvbGRzXSEgO2hlcmUKLQotICAgICAgICA7Ly8gZGVsdGEgPSAoKChxMC1wMCk8PDIpICsgKHAxLXExKSArIDQpID4+IDM7Ci0gICAgICAgIDsvLyBkRGVsdGEgPSAocURwMXExID4+IDIgKyBxRHEwcDAgKyAxKT4+IDEKLQotICAgICAgICA7Ly8gcURwMXExLTExCi0gICAgICAgIDsvLyBxRHEwcDAtMTAKLSAgICAgICAgVlNVQkwgICAgICAgcURwMXExLCBkUF8xLCBkUV8xICAgICAgCi0gICAgICAgIFZNT1YgICAgICAgIGRUZW1wLCBkVEMzMjEwCi0gICAgICAgIFZTVUJMICAgICAgIHFEcTBwMCwgZFFfMCwgZFBfMCAgICAgIAotICAgICAgICBWU0hSICAgICAgICBxRHAxcTEsIHFEcDFxMSwgIzIgICAgICAKLSAgICAgICAgVlpJUC44ICAgICAgZFRDMzIxMCwgZFRlbXAKLSAgICAKLSAgICAgICAgOy8vIHFEZWx0YS1xRHEwcDAtMTAKLQotICAgICAgICA7Ly8gZFRDID0gZFRDMDEgKyAoZEFwbGcgJiAxKSArIChkQXFmbGcgJiAxKQotCi0gICAgICAgIDsvLyBkVEMzMjEwLTE4Ci0gICAgICAgIDsvLyBkVGVtcC0yOAotICAgICAgICA7Ly8gZFRDLTMxCi0gICAgICAgIFZCSUYgICAgICAgIGRUQzMyMTAsIGRNYXNrXzAsIGRGaWx0Ci0gICAgICAgIFZSSEFERCAgICAgIHFEZWx0YSwgcURwMXExLCBxRHEwcDAgIAotICAgICAgICBWQUREICAgICAgICBkVEMsIGRUQzMyMTAsIGRNYXNrXzEKLSAgICAgICAgVlFNT1ZOICAgICAgZERlbHRhLCBxRGVsdGEKLSAgICAgICAgOy8vIGREZWx0YS1kMjAKLQotICAgICAgICA7Ly8gZERlbHRhID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgcTAgLSBkZWx0YSk7Ci0gICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFdCi0gICAgICAgIFZNSU4gICAgICAgIGREZWx0YSwgZERlbHRhLCBkVENzCi0gICAgICAgIFZORUcgICAgICAgIGRUQ3MsIGRUQ3MKLSAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFdCi0gICAgICAgIDsxCi0gICAgICAgIFZNQVggICAgICAgIGREZWx0YSwgZERlbHRhLCBkVENzCi0KLSAgICAgICAgOy8vIGRQXzBuIC0gMjkKLSAgICAgICAgOy8vIGRRXzBuIC0gMjQKLQotICAgICAgICA7Ly8gcFEwWy0xKlN0ZXBdID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgZFBfMCAtIGRlbHRhKTsKLSAgICAgICAgOy8vIHBRMFswKlN0ZXBdID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgZFFfMCAtIGRlbHRhKTsKLQotICAgICAgICA7Ly8gZFBfMG4gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBkUF8wIC0gZERlbHRhKTsKLSAgICAgICAgOy8vIGRRXzBuID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgZFBfMCAtIGREZWx0YSk7Ci0gICAgICAgIAotICAgICAgICA7Ly8gcVBfMG4gLSAxNAotICAgICAgICA7Ly8gcVFfMG4gLSAxMgotICAgICAgICAKLSAgICAgICAgVk1PVkwgICAgICAgcVBfMG4sIGRQXzAKLSAgICAgICAgVk1PVkwgICAgICAgcVFfMG4sIGRRXzAKLQotICAgICAgICA7MQotICAgICAgICBWQUREVyAgICAgICBxUF8wbiwgcVBfMG4sIGREZWx0YQotICAgICAgICBWU1VCVyAgICAgICBxUV8wbiwgcVFfMG4sIGREZWx0YQotICAgICAgICAKLSAgICAgICAgVlFNT1ZVTiAgICAgZFBfMG4sIHFQXzBuCi0gICAgICAgIFZRTU9WVU4gICAgIGRRXzBuLCBxUV8wbgotCi0gICAgICAgIE1fRU5ECi0KLTsvLyBSZWdpc3RlciB1c2FnZSBmb3IgLSBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlKCkKLTsvLwotOy8vIElucHV0cyAtIFBpeGVscyAgICAgICAgICAgICAtIHAwLXAzOiBENC1ENywgcTAtcTM6IEQ4LUQxMQotOy8vICAgICAgICAtIEZpbHRlciBtYXNrcyAgICAgICAtIGZpbHQ6IEQxNiwgYXFmbGc6IEQxMiwgYXBmbGc6IEQxNwotOy8vICAgICAgICAtIEFkZGl0aW9uYWwgUGFyYW1zICAtIGFscGhhOiBEMCwgZE1hc2tfMTogRDE1Ci07Ly8gICAgICAgICAKLTsvLyBPdXRwdXRzIC0gUGl4ZWxzICAgICAgICAgICAgLSBQMC1QMjogRDI5LUQzMSwgUTAtUTI6IEQyNCxEMjUsRDI4Ci0KLTsvLyBSZWdpc3RlcnMgQ29ycnVwdGVkICAgICAgICAgLSBEMTgtRDMxCi0KLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0dFNF91bnNhZmUKLSAgICAKLSAgICAgICAgO2RIU3EwcDEgLSAzMQotICAgICAgICA7ZEhTcDBxMSAtIDEzCi0gICAgICAgIFZIQUREICAgICAgIGRIU3AwcTEsIGRQXzAsIGRRXzEgICAgIAotICAgICAgICBWSEFERCAgICAgICBkSFNxMHAxLCBkUV8wLCBkUF8xICAgICAgICAgCi0KLSAgICAgICAgOy8vIFByZXBhcmUgdGhlIGJTIG1hc2sKLQotICAgICAgICA7Ly8gZEhTcDBxMS0xMwotICAgICAgICA7Ly8gZFBfMHQtZEhTcDBxMS0xMwotICAgICAgICA7Ly8gZEhTcTBwMS0zMQotICAgICAgICA7Ly8gZFFfMHQtVGVtcDEtMzEKLSAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV0KLSAgICAgICAgQUREICAgICAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjNAotICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV0KLQotICAgICAgICBWUkhBREQgICAgICBkUF8wdCwgZEhTcDBxMSwgZFBfMSAgICAKLSAgICAgICAgVlJIQUREICAgICAgZFFfMHQsIGRIU3EwcDEsIGRRXzEKLSAgICAgICAgCi0gICAgICAgIE1fRU5ECi0gICAgICAgIAotICAgICAgICBFTkRJRiAgCi0KLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2MwMWRkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDEwICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotCi0KLSAgICBJRiAgQ29ydGV4QTgKLSAgICAgICAgCi1wVGhyZXNob2xkcyBSTiA1Ci0KLTsvLyBQaXhlbHMKLWRQXzAgICAgICAgIEROIEQ0LlU4Ci1kUF8xICAgICAgICBETiBENS5VOCAgCi1kUF8yICAgICAgICBETiBENi5VOCAgCi1kUF8zICAgICAgICBETiBENy5VOCAgCi1kUV8wICAgICAgICBETiBEOC5VOCAgCi1kUV8xICAgICAgICBETiBEOS5VOCAgCi1kUV8yICAgICAgICBETiBEMTAuVTggCi1kUV8zICAgICAgICBETiBEMTEuVTggCi0KLQotOy8vIEZpbHRlcmluZyBEZWNpc2lvbgotZEFscGhhICAgICAgRE4gRDAuVTgKLQotZEZpbHQgICAgICAgRE4gRDE2LlU4Ci1kQXFmbGcgICAgICBETiBEMTIuVTgKLWRBcGZsZyAgICAgIEROIEQxNy5VOCAKLQotZEFwMHEwICAgICAgRE4gRDEzLlU4Ci0KLTsvLyBiU0xUNAotZFRDMCAgICAgICAgRE4gRDE4LlU4ICAgCi1kVEMxICAgICAgICBETiBEMTkuVTggICAKLWRUQzAxICAgICAgIEROIEQxOC5VOCAgIAotCi1kVENzICAgICAgICBETiBEMzEuUzgKLWRUQyAgICAgICAgIEROIEQzMS5VOAotCi1kTWFza18wICAgICBETiBEMTQuVTgKLWRNYXNrXzEgICAgIEROIEQxNS5VOCAgICAKLQotZFRlbXAgICAgICAgRE4gRDE5LlU4Ci0KLTsvLyBDb21wdXRpbmcgUDAsUTAKLXFEcTBwMCAgICAgIFFOIFExMC5TMTYKLXFEcDFxMSAgICAgIFFOIFExMS5TMTYKLXFEZWx0YSAgICAgIFFOIFExMC5TMTYgIDsgcmV1c2UgcURxMHAwCi1kRGVsdGEgICAgICBETiBEMjAuUzgKLQotCi07Ly8gQ29tcHV0aW5nIFAxLFExCi1kUnAwcTAgICAgICBETiBEMjQuVTgKLQotZE1heFAgICAgICAgRE4gRDIzLlU4Ci1kTWluUCAgICAgICBETiBEMjIuVTgKLQotZE1heFEgICAgICAgRE4gRDE5LlU4Ci1kTWluUSAgICAgICBETiBEMjEuVTgKLQotZERlbHRhUCAgICAgRE4gRDI2LlU4Ci1kRGVsdGFRICAgICBETiBEMjcuVTgKLQotcVBfMG4gICAgICAgUU4gUTE0LlMxNgotcVFfMG4gICAgICAgUU4gUTEyLlMxNgotCi1kUV8wbiAgICAgICBETiBEMjQuVTgKLWRRXzFuICAgICAgIEROIEQyNS5VOAotZFBfMG4gICAgICAgRE4gRDI5LlU4Ci1kUF8xbiAgICAgICBETiBEMzAuVTgKLQotOy8vIGJTR0U0Ci0KLXFTcDBxMCAgICAgIFFOIFExMC5VMTYKLQotcVNwMnExICAgICAgUU4gUTExLlUxNgotcVNwMHEwcDEgICAgUU4gUTEyLlUxNgotcVNwM3AyICAgICAgUU4gUTEzLlUxNgotZEhTcDBxMSAgICAgRE4gRDI4LlU4Ci0KLXFTcTJwMSAgICAgIFFOIFExMS5VMTYKLXFTcDBxMHExICAgIFFOIFExMi5VMTYKLXFTcTNxMiAgICAgIFFOIFExMy5VMTYgIDshIQotZEhTcTBwMSAgICAgRE4gRDI4LlU4ICAgOyEhCi0KLXFUZW1wMSAgICAgIFFOIFExMS5VMTYgIDshITtxU3AycTEgCi1xVGVtcDIgICAgICBRTiBRMTIuVTE2ICA7ISE7cVNwMHEwcDEgICAgICAgIAotCi1kUF8wdCAgICAgICBETiBEMjguVTggICA7ISE7ZEhTcDBxMSAgICAgICAgCi1kUV8wdCAgICAgICBETiBEMjIuVTggICA7ISE7VGVtcDEgICAgICAgIAotCi1kUF8wbiAgICAgICBETiBEMjkuVTgKLWRQXzFuICAgICAgIEROIEQzMC5VOAotZFBfMm4gICAgICAgRE4gRDMxLlU4Ci0KLWRRXzBuICAgICAgIEROIEQyNC5VOCAgIDshITtUZW1wMiAgICAgICAgCi1kUV8xbiAgICAgICBETiBEMjUuVTggICA7ISE7VGVtcDIgICAgICAgIAotZFFfMm4gICAgICAgRE4gRDI4LlU4ICAgOyEhO2RRXzB0ICAgICAgICAKLQotOy8vIFJlZ2lzdGVyIHVzYWdlIGZvciAtIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKLTsvLwotOy8vIElucHV0cyAtIFBpeGVscyAgICAgICAgICAgICAtIHAwLXAzOiBENC1ENywgcTAtcTM6IEQ4LUQxMQotOy8vICAgICAgICAtIEZpbHRlciBtYXNrcyAgICAgICAtIGZpbHQ6IEQxNiwgYXFmbGc6IEQxMiwgYXBmbGc6IEQxNwotOy8vICAgICAgICAtIEFkZGl0aW9uYWwgUGFyYW1zICAtIHBUaHJlc2hvbGRzOiByNQotOy8vICAgICAgICAgCi07Ly8gT3V0cHV0cyAtIFBpeGVscyAgICAgICAgICAgIC0gUDAtUDE6IEQyOS1EMzAsIFEwLVExOiBEMjQtRDI1Ci07Ly8gICAgICAgICAtIEFkZGl0aW9uYWwgUGFyYW1zIC0gcFRocmVzaG9sZHM6IHI1Ci0KLTsvLyBSZWdpc3RlcnMgQ29ycnVwdGVkICAgICAgICAgLSBEMTgtRDMxCi0KLQotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKLQotICAgICAgICAKLSAgICAgICAgOy8vIHFEcTBwMC0xMAotICAgICAgICBWU1VCTCAgICAgICBxRHAxcTEsIGRQXzEsIGRRXzEgICAgICAKLSAgICAgICAgVkxEMSAgICAgICAge2RUQzBbXX0sIFtwVGhyZXNob2xkc10hCi0gICAgICAgIDsvLyBxRHAxcTEtMTEKLSAgICAgICAgVlNVQkwgICAgICAgcURxMHAwLCBkUV8wLCBkUF8wICAgICAgCi0gICAgICAgIFZMRDEgICAgICAgIHtkVEMxW119LCBbcFRocmVzaG9sZHNdIQotCi0gICAgICAgIDsvLyBkUnAwcTAtMjQKLSAgICAgICAgVlNIUiAgICAgICAgcURwMXExLCBxRHAxcTEsICMyICAgICAgCi0gICAgCi0gICAgICAgIDsvLyBkVEMwMSA9IChkVEMxIDw8IDQpIHwgZFRDMAotICAgICAgICA7Ly8gZFRDMDEtMTgKLSAgICAgICAgVkVYVCAgICAgICAgZFRDMDEsIGRUQzAsIGRUQzEsICM0Ci0gICAgICAgIDsvLyBkVGVtcC0xOQotICAgICAgICBWQU5EICAgICAgICBkVGVtcCwgZEFwZmxnLCBkTWFza18xCi0gICAgICAgIAotICAgICAgICBWQklGICAgICAgICBkVEMwMSwgZE1hc2tfMCwgZEZpbHQKLSAgICAKLQotICAgICAgICA7Ly8gZGVsdGEgPSAoKChxMC1wMCk8PDIpICsgKHAxLXExKSArIDQpID4+IDM7Ci0gICAgICAgIDsvLyBkRGVsdGEgPSAocURwMXExID4+IDIgKyBxRHEwcDAgKyAxKT4+IDEKLQotICAgICAgICA7Ly8gcURlbHRhLXFEcTBwMC0xMAotICAgICAgICBWUkhBREQgICAgICBxRGVsdGEsIHFEcDFxMSwgcURxMHAwICAKLSAgICAgICAgVlJIQUREICAgICAgZFJwMHEwLCBkUF8wLCBkUV8wICAgICAgCi0gICAgICAgIFZBREQgICAgICAgIGRUQywgZFRDMDEsIGRUZW1wCi0KLSAgICAgICAgOy8vIGRUQyA9IGRUQzAxICsgKGRBcGxnICYgMSkgKyAoZEFxZmxnICYgMSkKLSAgICAgICAgCi0gICAgICAgIFZBTkQgICAgICAgIGRUZW1wLCBkQXFmbGcsIGRNYXNrXzEKLSAgICAgICAgVlFBREQgICAgICAgZE1heFAsIGRQXzEsIGRUQzAxICAgICAgCi0gICAgICAgIFZRTU9WTiAgICAgIGREZWx0YSwgcURlbHRhCi0gICAgICAgIFZBREQgICAgICAgIGRUQywgZFRDLCBkVGVtcAotCi0gICAgICAgIDsvLyBkTWF4UCA9IFFBREQoZFBfMSwgZFRDMDEpCi0gICAgICAgIDsvLyBkTWluUCA9IFFTVUIoZFBfMSwgZFRDMDEpCi0gCi0gICAgICAgIDsvLyBkTWF4UC1kMjMKLSAgICAgICAgOy8vIGRNaW5QLWQyMgotICAgICAgICBWUVNVQiAgICAgICBkTWluUCwgZFBfMSwgZFRDMDEgICAgICAKLQotICAgICAgICA7Ly8gZERlbHRhLWQyMAotCi0gICAgICAgIDsvLyBkTWF4USA9IFFBREQoZFFfMSwgZFRDMDEpCi0gICAgICAgIDsvLyBkTWluUSA9IFFTVUIoZFFfMSwgZFRDMDEpCi0gCi0gICAgICAgIDsvLyBkTWF4US0xOQotICAgICAgICA7Ly8gZE1pblEtMjEKLSAgICAgICAgVlFBREQgICAgICAgZE1heFEsIGRRXzEsIGRUQzAxCi0gICAgICAgIFZIQUREICAgICAgIGREZWx0YVAsIGRScDBxMCwgZFBfMiAgIAotICAgICAgICBWTUlOICAgICAgICBkRGVsdGEsIGREZWx0YSwgZFRDcwotCi0gICAgICAgIDsvLyBkRGVsdGEgPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBxMCAtIGRlbHRhKTsKLSAgICAgICAgVk5FRyAgICAgICAgZFRDcywgZFRDcwotICAgICAgICAKLSAgICAgICAgVlFTVUIgICAgICAgZE1pblEsIGRRXzEsIGRUQzAxCi0KLSAgICAgICAgOy8vIGRlbHRhID0gKHAyICsgKChwMCtxMCsxKT4+MSkgLSAocDE8PDEpKT4+MTsKLSAgICAgICAgOy8vIGRlbHRhID0gYXJtQ2xpcCgtdEMwLCB0QzAsIGRlbHRhKTsKLSAgICAgICAgOy8vIHBRMFstMipTdGVwXSA9IChPTVhfVTgpKHAxICsgZGVsdGEpOwotCi0gICAgICAgIDsvLyBkRGVsdGFQID0gKGRQXzIgKyBkUnAwcTApPj4xOwotICAgICAgICA7Ly8gZFBfMW4gPSBhcm1DbGlwKGRQXzEgLSBkVEMwMSwgZFBfMSArIGRUQzAxLCBkRGVsdGFQKTsKLSAgICAgICAgOy8vIGRQXzFuID0gYXJtQ2xpcChNaW5QLCBNYXhQLCBkRGVsdGFQKTsKLSAgICAgICAgCi0gICAgICAgIDsvLyBkZWx0YSA9IChxMiArICgocDArcTArMSk+PjEpIC0gKHExPDwxKSk+PjE7Ci0gICAgICAgIDsvLyBkZWx0YSA9IGFybUNsaXAoLXRDMCwgdEMwLCBkZWx0YSk7Ci0gICAgICAgIDsvLyBwUTBbMSpTdGVwXSA9IChPTVhfVTgpKHExICsgZGVsdGEpOwotCi0gICAgICAgIDsvLyBkRGVsdGFRID0gKGRRXzIgKyBkUnAwcTApPj4xOwotICAgICAgICA7Ly8gZFFfMW4gPSBhcm1DbGlwKGRRXzEgLSBkVEMwMSwgZFFfMSArIGRUQzAxLCBkRGVsdGFRKTsKLSAgICAgICAgOy8vIGRRXzFuID0gYXJtQ2xpcChNaW5RLCBNYXhRLCBkRGVsdGFRKTsKLSAgICAgICAgCi0gICAgICAgIDsvLyBkRGVsdGFQLTI2Ci0gICAgICAgIFZIQUREICAgICAgIGREZWx0YVEsIGRScDBxMCwgZFFfMiAgIAotCi0gICAgICAgIDsvLyBkRGVsdGFRLTI3Ci0gICAgICAgIAotICAgICAgICA7Ly8gZFBfMG4gLSAyOQotICAgICAgICA7Ly8gZFBfMW4gLSAzMAotICAgICAgICA7Ly8gZFFfMG4gLSAyNAotICAgICAgICA7Ly8gZFFfMW4gLSAyNQotICAgICAgICAKLSAgICAgICAgOy8vIGRlbHRhID0gKHEyICsgKChwMCtxMCsxKT4+MSkgLSAocTE8PDEpKT4+MTsKLSAgICAgICAgOy8vIGREZWx0YVEgPSAoZFFfMiArIGRScDBxMCk+PjE7Ci0KLSAgICAgICAgVk1BWCAgICAgICAgZFBfMW4sIGREZWx0YVAsIGRNaW5QICAgCi0gICAgICAgIFZNQVggICAgICAgIGREZWx0YSwgZERlbHRhLCBkVENzCi0KLSAgICAgICAgOy8vIHBRMFstMSpTdGVwXSA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIGRQXzAgLSBkZWx0YSk7Ci0gICAgICAgIDsvLyBwUTBbMCpTdGVwXSA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIGRRXzAgLSBkZWx0YSk7Ci0KLSAgICAgICAgOy8vIGRQXzBuID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgZFBfMCAtIGREZWx0YSk7Ci0gICAgICAgIDsvLyBkUV8wbiA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIGRQXzAgLSBkRGVsdGEpOwotICAgICAgICAKLSAgICAgICAgOy8vIHFQXzBuIC0gMTQKLSAgICAgICAgOy8vIHFRXzBuIC0gMTIKLSAgICAgICAgCi0gICAgICAgIFZNT1ZMICAgICAgIHFQXzBuLCBkUF8wCi0gICAgICAgIFZNT1ZMICAgICAgIHFRXzBuLCBkUV8wCi0KLSAgICAgICAgVkFERFcgICAgICAgcVBfMG4sIHFQXzBuLCBkRGVsdGEKLSAgICAgICAgVlNVQlcgICAgICAgcVFfMG4sIHFRXzBuLCBkRGVsdGEKLSAgICAgICAgCi0gICAgICAgIFZRTU9WVU4gICAgIGRQXzBuLCBxUF8wbgotICAgICAgICBWUU1PVlVOICAgICBkUV8wbiwgcVFfMG4KLSAgICAgICAgCi0gICAgICAgIFZNQVggICAgICAgIGRRXzFuLCBkRGVsdGFRLCBkTWluUQotCi0gICAgICAgIFZNSU4gICAgICAgIGRQXzFuLCBkUF8xbiwgZE1heFAKLSAgICAgICAgVk1JTiAgICAgICAgZFFfMW4sIGRRXzFuLCBkTWF4UQotICAgICAgICBWQklGICAgICAgICBkUF8wbiwgZFBfMCwgZEZpbHQgICAgICAKLQotICAgICAgICBWQklGICAgICAgICBkUF8xbiwgZFBfMSwgZEFwZmxnCi0gICAgICAgIFZCSUYgICAgICAgIGRRXzBuLCBkUV8wLCBkRmlsdCAgCi0gICAgICAgIFZCSUYgICAgICAgIGRRXzFuLCBkUV8xLCBkQXFmbGcKLQotICAgICAgICBNX0VORAotCi07Ly8gUmVnaXN0ZXIgdXNhZ2UgZm9yIC0gYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZSgpCi07Ly8KLTsvLyBJbnB1dHMgLSBQaXhlbHMgICAgICAgICAgICAgLSBwMC1wMzogRDQtRDcsIHEwLXEzOiBEOC1EMTEKLTsvLyAgICAgICAgLSBGaWx0ZXIgbWFza3MgICAgICAgLSBmaWx0OiBEMTYsIGFxZmxnOiBEMTIsIGFwZmxnOiBEMTcKLTsvLyAgICAgICAgLSBBZGRpdGlvbmFsIFBhcmFtcyAgLSBhbHBoYTogRDAsIGRNYXNrXzE6IEQxNQotOy8vICAgICAgICAgCi07Ly8gT3V0cHV0cyAtIFBpeGVscyAgICAgICAgICAgIC0gUDAtUDI6IEQyOS1EMzEsIFEwLVEyOiBEMjQsRDI1LEQyOAotCi07Ly8gUmVnaXN0ZXJzIENvcnJ1cHRlZCAgICAgICAgIC0gRDE4LUQzMQotCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQotICAgIAotCi0gICAgICAgIDsvLyBhcDxiZXRhICYmIGFybUFicyhwMC1xMCk8KChhbHBoYT4+MikrMikgICAgICAgIAotICAgICAgICA7Ly8gYXE8YmV0YSAmJiBhcm1BYnMocDAtcTApPCgoYWxwaGE+PjIpKzIpICAgICAgICAKLQotICAgICAgICA7Ly8gKCBkQXBmbGcgJiBkQXAwcTAgPCAoZEFscGhhID4+IDIgKyAyKSApCi0gICAgICAgIDsvLyAoIGRBcWZsZyAmIGRBcDBxMCA8IChkQWxwaGEgPj4gMiArIDIpICkKLQotICAgICAgICA7Ly8gKCBkQXBmbGcgPSBkQXBmbGcgJiBkQXAwcTAgPCAoZFRlbXAgKyBkTWFza18xICsgZE1hc2tfMSkgKQotICAgICAgICA7Ly8gKCBkQXFmbGcgPSBkQXFmbGcgJiBkQXAwcTAgPCAoZFRlbXAgKyBkTWFza18xICsgZE1hc2tfMSkgKQotCi0gICAgICAgIDsvLyBQIEZpbHRlcgotCi0gICAgICAgIFZTSFIgICAgICAgIGRUZW1wLCBkQWxwaGEsICMyCi0gICAgICAgIFZBREQgICAgICAgIGRUZW1wLCBkVGVtcCwgZE1hc2tfMQotCi0gICAgICAgIDsvLyBxU3AwcTAtMTAKLSAgICAgICAgVkFEREwgICAgICAgcVNwMHEwLCBkUV8wLCBkUF8wICAgICAgCi0gICAgICAgIFZBREQgICAgICAgIGRUZW1wLCBkVGVtcCwgZE1hc2tfMQotCi0gICAgICAgIDsvLyBxU3AycTEtMTEKLSAgICAgICAgOy8vIHFTcDBxMHAxLTEyCi0gICAgICAgIFZBRERMICAgICAgIHFTcDJxMSwgZFBfMiwgZFFfMSAgICAgIAotICAgICAgICBWQUREVyAgICAgICBxU3AwcTBwMSwgcVNwMHEwLCBkUF8xICAKLQotICAgICAgICBWQ0dUICAgICAgICBkVGVtcCwgZFRlbXAsIGRBcDBxMAotICAgICAgICBWU0hSICAgICAgICBxU3AycTEsICMxICAgICAgICAgICAgICAKLQotICAgICAgICA7Ly8gcFEwWy0xKlN0ZXBdID0gKE9NWF9VOCkoKHAyICsgMipwMSArIDIqcDAgKyAyKnEwICsgcTEgKyA0KT4+Myk7Ci0gICAgICAgIDsvLyBwUTBbLTEqU3RlcF0gPSAoICggKHAwICsgcTAgKyBwMSkgKyAocDIgKyBxMSk+PjEgKSA+PiAxICsgMSApID4+IDEKLQotICAgICAgICA7Ly8gZFBfMG4gPSAoICggKHFTcDBxMCArIGRQXzEpICsgcVNwMnExPj4xICkgPj4gMSArIDEgKSA+PiAxCi0gICAgICAgIDsvLyBkUF8wbiA9ICggKCBxU3AwcTBwMSArIHFTcDJxMT4+MSApID4+IDEgKyAxICkgPj4gMQotICAgICAgICA7Ly8gZFBfMG4gPSAoIHFUZW1wMSArIDEgKSA+PiAxCi0gICAgICAgIAotICAgICAgICA7Ly8gcFEwWy0yKlN0ZXBdID0gKE9NWF9VOCkoKHAyICsgcDEgKyBwMCArIHEwICsgMik+PjIpOwotICAgICAgICAKLSAgICAgICAgOy8vIGRQXzFuID0gKE9NWF9VOCkoKGRQXzIgKyBxU3AwcTBwMSArIDIpPj4yKTsKLSAgICAgICAgOy8vIGRQXzFuID0gKE9NWF9VOCkoKHFUZW1wMiArIDIpPj4yKTsKLSAgICAgICAgCi0gICAgICAgIDsvLyBwUTBbLTMqU3RlcF0gPSAoT01YX1U4KSgoMipwMyArIDMqcDIgKyBwMSArIHAwICsgcTAgKyA0KT4+Myk7Ci0gICAgICAgIDsvLyBwUTBbLTMqU3RlcF0gPSAoT01YX1U4KSgoIChwMyArIHAyKSArIChwMSArIHAwICsgcTAgKyBwMikgPj4gMSArIDIpPj4yKTsKLQotICAgICAgICA7Ly8gZFBfMm4gPSAoT01YX1U4KSgoIHFTcDNwMiArIChkUF8yICsgcVNwMHEwcDEpID4+IDEgKyAyKSA+PiAyKTsKLSAgICAgICAgOy8vIGRQXzJuID0gKE9NWF9VOCkoKCBxU3AzcDIgKyBxVGVtcDIgPj4gMSArIDIpID4+IDIpOwotCi0gICAgICAgIDsvLyBxVGVtcDEtcVNwMnExLTExCi0gICAgICAgIDsvLyBxVGVtcDItcVNwMHEwcDEtMTIKLSAgICAgICAgVkhBREQgICAgICAgcVRlbXAxLCBxU3AwcTBwMSwgcVNwMnExCi0gICAgICAgIFZBRERXICAgICAgIHFUZW1wMiwgcVNwMHEwcDEsIGRQXzIgIAotICAgICAgICAKLSAgICAgICAgOy8vIHFTcDNwMi0xMwotICAgICAgICBWQURETCAgICAgICBxU3AzcDIsIGRQXzMsIGRQXzIgICAgICAKLQotICAgICAgICBWQU5EICAgICAgICBkQXBmbGcsIGRBcGZsZywgZFRlbXAKLSAgICAgICAgVkhBREQgICAgICAgZEhTcDBxMSwgZFBfMCwgZFFfMSAgICAgCi0gICAgICAgIFZTUkEgICAgICAgIHFTcDNwMiwgcVRlbXAyLCAjMSAgICAgIAotICAgICAgICA7Ly8gZEhTcDBxMS0yOAotICAgICAgICBWQU5EICAgICAgICBkQXFmbGcsIGRBcWZsZywgZFRlbXAKLQotICAgICAgICA7Ly8gZFBfMG4tMjkKLSAgICAgICAgOy8vIGRQXzB0LWRIU3AwcTEtMjgKLSAgICAgICAgVlFSU0hSTiAgICAgZFBfMG4sIHFUZW1wMSwgIzEKLSAgICAgICAgVlJIQUREICAgICAgZFBfMHQsIGRIU3AwcTEsIGRQXzEgICAgCi0KLSAgICAgICAgOy8vIGRQXzFuLTMwCi0gICAgICAgIFZRUlNIUk4gICAgIGRQXzFuLCBxVGVtcDIsICMyCi0gICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxU3EycDEsIGRRXzIsIGRQXzEgICAgICAgICAgCi0gICAgICAgIFZBRERXICAgICAgIHFTcDBxMHExLCBxU3AwcTAsIGRRXzEgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZCSUYgICAgICAgIGRQXzBuLCBkUF8wdCwgZEFwZmxnICAgIAotCi0gICAgICAgIDsvLyBRIEZpbHRlcgotCi0gICAgICAgIDsvLyBwUTBbMCpTdGVwXSA9IChPTVhfVTgpKChxMiArIDIqcTEgKyAyKnEwICsgMipwMCArIHAxICsgNCk+PjMpOwotICAgICAgICA7Ly8gcFEwWzAqU3RlcF0gPSAoICggKHAwICsgcTAgKyBxMSkgKyAocTIgKyBwMSk+PjEgKSA+PiAxICsgMSApID4+IDEKLQotICAgICAgICA7Ly8gZFFfMG4gPSAoICggKHFTcDBxMCArIGRRXzEpICsgcVNxMnAxPj4xICkgPj4gMSArIDEgKSA+PiAxCi0gICAgICAgIDsvLyBkUV8wbiA9ICggKCBxU3AwcTBxMSArIHFTcTJwMT4+MSApID4+IDEgKyAxICkgPj4gMQotICAgICAgICA7Ly8gZFFfMG4gPSAoIHFUZW1wMSArIDEgKSA+PiAxCi0gICAgICAgIAotICAgICAgICA7Ly8gcFEwWzEqU3RlcF0gPSAoT01YX1U4KSgocTIgKyBxMSArIHEwICsgcTAgKyAyKT4+Mik7Ci0gICAgICAgIAotICAgICAgICA7Ly8gZFFfMW4gPSAoT01YX1U4KSgoZFFfMiArIHFTcDBxMHExICsgMik+PjIpOwotICAgICAgICA7Ly8gZFFfMW4gPSAoT01YX1U4KSgocVRlbXAyICsgMik+PjIpOwotICAgICAgICAKLSAgICAgICAgOy8vIHBRMFsyKlN0ZXBdID0gKE9NWF9VOCkoKDIqcTMgKyAzKnEyICsgcTEgKyBxMCArIHAwICsgNCk+PjMpOwotICAgICAgICA7Ly8gcFEwWzIqU3RlcF0gPSAoT01YX1U4KSgoIChxMyArIHEyKSArIChxMSArIHAwICsgcTAgKyBxMikgPj4gMSArIDIpPj4yKTsKLQotICAgICAgICA7Ly8gZFFfMm4gPSAoT01YX1U4KSgoIHFTcTNxMiArIChkUV8yICsgcVNwMHEwcTEpID4+IDEgKyAyKSA+PiAyKTsKLSAgICAgICAgOy8vIGRRXzJuID0gKE9NWF9VOCkoKCBxU3EzcTIgKyBxVGVtcDIgPj4gMSArIDIpID4+IDIpOwotCi0gICAgICAgIDsvLyBxVGVtcDEtcVNwMnExLTExCi0gICAgICAgIDsvLyBxVGVtcDItcVNwMHEwcDEtMTIKLSAgICAgICAgOy8vIHFTcTJwMS0xMQotICAgICAgICA7Ly8gcVNwMHEwcTEtMTIKLQotCi0gICAgICAgIDsvLyBxVGVtcDItcVNwMHEwcDEtMTIKLSAgICAgICAgOy8vIHFUZW1wMS1xU3EycDEtMTEKLSAgICAgICAgOy8vIHFTcTNxMi0xMwotICAgICAgICA7Ly8gZFBfMm4tMzEKLSAgICAgICAgCi0gICAgICAgIFZRUlNIUk4gICAgIGRQXzJuLCBxU3AzcDIsICMyCi0gICAgICAgIFZBRERMICAgICAgIHFTcTNxMiwgZFFfMywgZFFfMiAgICAgICAgICAKLQotICAgICAgICBWU0hSICAgICAgICBxU3EycDEsICMxICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgVkhBREQgICAgICAgcVRlbXAxLCBxU3AwcTBxMSwgcVNxMnAxCi0gICAgICAgIFZBRERXICAgICAgIHFUZW1wMiwgcVNwMHEwcTEsIGRRXzIgICAgICAKLQotICAgICAgICA7Ly8gZEhTcTBwMS0yOAotICAgICAgICBWSEFERCAgICAgICBkSFNxMHAxLCBkUV8wLCBkUF8xICAgICAgICAgCi0KLSAgICAgICAgVkJJRiAgICAgICAgZFBfMG4sIGRQXzAsIGRGaWx0Ci0gICAgICAgIFZCSUYgICAgICAgIGRQXzFuLCBkUF8xLCBkQXBmbGcKLQotICAgICAgICBWU1JBICAgICAgICBxU3EzcTIsIHFUZW1wMiwgIzEgICAgICAgICAgCi0KLSAgICAgICAgOy8vIGRRXzEtVGVtcDItMjUKLSAgICAgICAgOy8vIGRRXzAtVGVtcDItMjQKLSAgICAgICAgVlFSU0hSTiAgICAgZFFfMW4sIHFUZW1wMiwgIzIKLSAgICAgICAgVlFSU0hSTiAgICAgZFFfMG4sIHFUZW1wMSwgIzEKLQotICAgICAgICA7Ly8gZFFfMHQtVGVtcDEtMjIKLSAgICAgICAgVlJIQUREICAgICAgZFFfMHQsIGRIU3EwcDEsIGRRXzEKLSAgICAgICAgVkJJRiAgICAgICAgZFFfMW4sIGRRXzEsIGRBcWZsZyAgICAgICAgIAotCi0gICAgICAgIFZCSUYgICAgICAgIGRQXzJuLCBkUF8yLCBkQXBmbGcgICAgICAgIAotICAgICAgICBWQklGICAgICAgICBkUV8wbiwgZFFfMHQsIGRBcWZsZyAgICAgICAgCi0gICAgICAgIFZRUlNIUk4gICAgIGRRXzJuLCBxU3EzcTIsICMyCi0gICAgICAgIFZCSUYgICAgICAgIGRRXzBuLCBkUV8wLCBkRmlsdAotICAgICAgICBWQklGICAgICAgICBkUV8ybiwgZFFfMiwgZEFxZmxnICAgICAgIAotCi0gICAgICAgIE1fRU5ECi0gICAgICAgIAotICAgIEVORElGICAKLQotCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUzYTBkNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucworKysgL2Rldi9udWxsCkBAIC0xLDMzOSArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKLSAgICAgICAgCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlcwotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlcwotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXMKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXMKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfU3VmZml4VG9MZXZlbAotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9aaWdaYWdfNHg0Ci0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1ppZ1phZ18yeDIKLSAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0gICAgICAgIAotOy8vREVCVUdfT04gICAgU0VUTCB7VFJVRX0KLSAgICAgICAgCi1MQVNUX0NPRUZGICAgICAgICAgICAgICAgRVFVIDB4MjAgICAgICAgIDsvLyBFbmQgb2YgYmxvY2sgZmxhZwotVFdPX0JZVEVfQ09FRkYgICAgICAgICAgIEVRVSAweDEwCi0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotCi1wcEJpdFN0cmVhbSAgICAgUk4gMAotcE9mZnNldCAgICAgICAgIFJOIDEKLXBOdW1Db2VmZiAgICAgICBSTiAyCi1wcFBvc0NvZWZidWYgICAgUk4gMwotbkMgICAgICAgICAgICAgIFJOIDQgOy8vIG51bWJlciBvZiBjb2VmZnMgb3IgMTcgZm9yIGNocm9tYQotc01heE51bUNvZWZmICAgIFJOIDUKLQotOy8vIERlY2xhcmUgaW5uZXIgbG9vcCByZWdpc3RlcnMKLQotOy8vIExldmVsIGxvb3AKLUNvdW50ICAgICAgICAgICBSTiAwCi1UcmFpbGluZ09uZXMgICAgUk4gMQotcExldmVsICAgICAgICAgIFJOIDIKLUxldmVsU3VmZml4ICAgICBSTiAzCi1TdWZmaXhMZW5ndGggICAgUk4gNAotVG90YWxDb2VmZiAgICAgIFJOIDUKLQotcFZMRFRhYmxlICAgICAgIFJOIDYKLVN5bWJvbCAgICAgICAgICBSTiA3Ci1UMSAgICAgICAgICAgICAgUk4gOAotVDIgICAgICAgICAgICAgIFJOIDkKLVJCaXRTdHJlYW0gICAgICBSTiAxMAotUkJpdEJ1ZmZlciAgICAgIFJOIDExCi1SQml0Q291bnQgICAgICAgUk4gMTIKLWxyICAgICAgICAgICAgICBSTiAxNAotCi07Ly8gUnVuIGxvb3AKLUNvdW50ICAgICAgICAgICBSTiAwCi1aZXJvc0xlZnQgICAgICAgUk4gMQotcExldmVsICAgICAgICAgIFJOIDIKLXBwUnVuVGFibGUgICAgICBSTiAzCi1wUnVuICAgICAgICAgICAgUk4gNAotVG90YWxDb2VmZiAgICAgIFJOIDUKLQotcFZMRFRhYmxlICAgICAgIFJOIDYKLVN5bWJvbCAgICAgICAgICBSTiA3Ci1UMSAgICAgICAgICAgICAgUk4gOAotVDIgICAgICAgICAgICAgIFJOIDkKLVJCaXRTdHJlYW0gICAgICBSTiAxMAotUkJpdEJ1ZmZlciAgICAgIFJOIDExCi1SQml0Q291bnQgICAgICAgUk4gMTIKLWxyICAgICAgICAgICAgICBSTiAxNAotCi07Ly8gRmlsbCBpbiBjb2VmZmljaWVudHMgbG9vcAotcFBvc0NvZWZidWYgICAgIFJOIDAKLXRlbXAgICAgICAgICAgICBSTiAxCi1wTGV2ZWwgICAgICAgICAgUk4gMgotcHBQb3NDb2VmYnVmICAgIFJOIDMKLXBSdW4gICAgICAgICAgICBSTiA0Ci1Ub3RhbENvZWZmICAgICAgUk4gNQotcFppZ1phZyAgICAgICAgIFJOIDYKLQotVDEgICAgICAgICAgICAgIFJOIDgKLVQyICAgICAgICAgICAgICBSTiA5Ci1SQml0U3RyZWFtICAgICAgUk4gMTAKLVJCaXRCdWZmZXIgICAgICBSTiAxMQotUkJpdENvdW50ICAgICAgIFJOIDEyCi1Db2VmZk51bSAgICAgICAgUk4gMTQKLQotCi0KLSAgICBJRiBBUk0xMTM2SlMKLSAgICAgICAgCi0gICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCi0gICAgICAgIE1fQUxMT0M0IHBwcEJpdFN0cmVhbSwgNAotICAgICAgICBNX0FMTE9DNCBwcE9mZnNldCwgNAotICAgICAgICBNX0FMTE9DNCBwcHBQb3NDb2VmYnVmLCA0Ci0gICAgICAgIE1fQUxMT0M0IHBwTGV2ZWwsIDE2KjIKLSAgICAgICAgTV9BTExPQzQgcHBSdW4sIDE2Ci0gICAgICAgIAotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIsIHIxMQotICAgICAgICAKLSAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKLSAgICAgICAgTV9BUkcgICBwTkMsIDQKLSAgICAgICAgTV9BUkcgICBwU01heE51bUNvZWZmLDQKLSAgICAgICAgCi0gICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAgICAKLSAgICAgICAgTV9CRF9JTklUMCBwcEJpdFN0cmVhbSwgcE9mZnNldCwgUkJpdFN0cmVhbSwgUkJpdEJ1ZmZlciwgUkJpdENvdW50Ci0gICAgICAgIExEUiAgICAgICAgcFZMRFRhYmxlLCA9YXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXMKLSAgICAgICAgTV9MRFIgICAgICBuQywgcE5DCi0gICAgICAgIAotICAgICAgICBNX0JEX0lOSVQxIFQxLCBUMiwgbHIKLSAgICAgICAgTERSICAgICBwVkxEVGFibGUsIFtwVkxEVGFibGUsIG5DLCBMU0wgIzJdICA7Ly8gRmluZCBWTEQgdGFibGUgICAgCi0gICAgICAgIAotICAgICAgICBNX0JEX0lOSVQyIFQxLCBUMiwgbHIKLQotICAgICAgICA7Ly8gRGVjb2RlIFN5bWJvbCA9IFRvdGFsQ29lZmYqNCArIFRyYWlsaW5nT25lcwotICAgICAgICBNX0JEX1ZMRCAgU3ltYm9sLCBUMSwgVDIsIHBWTERUYWJsZSwgNCwgMgotICAgIAotICAgICAgICBNT1ZTICAgIFRvdGFsQ29lZmYsIFN5bWJvbCwgTFNSICMyICAgIAotICAgICAgICBTVFJCICAgIFRvdGFsQ29lZmYsIFtwTnVtQ29lZmZdICAgIAotICAgICAgICBNX1BSSU5URiAiVG90YWxDb2VmZj0lZFxuIiwgVG90YWxDb2VmZgotICAgICAgICBCRVEuVyAgIEVuZE5vRXJyb3IgICAgICAgICAgICAgICAgICA7Ly8gRmluaXNoZWQgaWYgbm8gY29lZmZpY2llbnRzCi0KLSAgICAgICAgQ01QICAgICBTeW1ib2wsICMxNyo0Ci0gICAgICAgIEJHRS5XICAgRW5kQmFkU3ltYm9sICAgICAgICAgICAgICAgIDsvLyBFcnJvciBpZiBiYWQgc3ltYm9sCi0gICAgICAgIAotICAgICAgICA7Ly8gU2F2ZSBiaXRzdHJlYW0gcG9pbnRlcnMKLSAgICAgICAgTV9TVFIgICBwcEJpdFN0cmVhbSwgIHBwcEJpdFN0cmVhbQotICAgICAgICBNX1NUUiAgIHBPZmZzZXQsICAgICAgcHBPZmZzZXQKLSAgICAgICAgTV9TVFIgICBwcFBvc0NvZWZidWYsIHBwcFBvc0NvZWZidWYgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gRGVjb2RlIFRyYWlsaW5nIE9uZXMKLSAgICAgICAgQU5EUyAgICBUcmFpbGluZ09uZXMsIFN5bWJvbCwgIzMKLSAgICAgICAgTV9BRFIgICBwTGV2ZWwsIHBwTGV2ZWwgICAgICAgICAgICAKLSAgICAgICAgTV9QUklOVEYgIlRyYWlsaW5nT25lcz0lZFxuIiwgVHJhaWxpbmdPbmVzCi0gICAgICAgIEJFUSAgICAgVHJhaWxpbmdPbmVzRG9uZSAgICAKLSAgICAgICAgTU9WICAgICBDb3VudCwgVHJhaWxpbmdPbmVzCi1UcmFpbGluZ09uZXNMb29wICAgIAotICAgICAgICBNX0JEX1JFQUQ4IFN5bWJvbCwgMSwgVDEKLSAgICAgICAgU1VCUyAgICBDb3VudCwgQ291bnQsICMxCi0gICAgICAgIE1PViAgICAgVDEsICMxCi0gICAgICAgIFNVQiAgICAgVDEsIFQxLCBTeW1ib2wsIExTTCAjMQotICAgICAgICBNX1BSSU5URiAiTGV2ZWw9JWRcbiIsIFQxCi0gICAgICAgIFNUUkggICAgVDEsIFtwTGV2ZWxdLCAjMgotICAgICAgICBCR1QgICAgIFRyYWlsaW5nT25lc0xvb3AKLVRyYWlsaW5nT25lc0RvbmUgICAgCi0gICAgCi0gICAgICAgIDsvLyBEZWNvZGUgbGV2ZWwgdmFsdWVzICAgIAotICAgICAgICBTVUJTICAgIENvdW50LCBUb3RhbENvZWZmLCBUcmFpbGluZ09uZXMgICAgIDsvLyBOdW1iZXIgb2YgbGV2ZWxzIHRvIHJlYWQKLSAgICAgICAgQkVRICAgICBEZWNvZGVSdW5zICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTm9uZSBsZWZ0Ci0gICAgICAgIAotICAgICAgICBNT1YgICAgIFN1ZmZpeExlbmd0aCwgIzEKLSAgICAgICAgQ01QICAgICBUb3RhbENvZWZmLCAjMTAKLSAgICAgICAgTU9WTEUgICBTdWZmaXhMZW5ndGgsICMwCi0gICAgICAgIENNUCAgICAgVHJhaWxpbmdPbmVzLCAjMyAgICA7Ly8gaWYgKFRyYWlsaW5nT25lczwzKQotICAgICAgICBNT1ZMVCAgIFRyYWlsaW5nT25lcywgIzQgICAgOy8vIHRoZW4gVHJhaWxpbmdPbmVzID0gKzQKLSAgICAgICAgTU9WR0UgICBUcmFpbGluZ09uZXMsICMyICAgIDsvLyBlbHNlIFRyYWlsaW5nT25lcyA9ICsyCi0gICAgICAgIE1PVkdFICAgU3VmZml4TGVuZ3RoLCAjMCAgICA7Ly8gICAgICBTdWZmaXhMZW5ndGggPSAwCi0gICAgICAgIAotTGV2ZWxMb29wCi0gICAgICAgIE1fQkRfQ0xaMTYgU3ltYm9sLCBUMSwgVDIgICA7Ly8gU3ltYm9sPUxldmVsUHJlZml4Ci0gICAgICAgIENNUCAgICAgU3ltYm9sLCMxNgotICAgICAgICBCR0UgICAgIEVuZEJhZFN5bWJvbAotICAgICAgICAKLSAgICAgICAgTU9WUyAgICBsciwgU3VmZml4TGVuZ3RoICAgIDsvLyBpZiBMZXZlbFN1ZmZpeFNpemU9PTAKLSAgICAgICAgVEVRRVEgICBTeW1ib2wsICMxNCAgICAgICAgIDsvLyAgIGFuZCAgTGV2ZWxQcmVmaXg9PTE0Ci0gICAgICAgIE1PVkVRICAgbHIsICM0ICAgICAgICAgICAgICA7Ly8gICB0aGVuIExldmVsU3VmZml4U2l6ZT00Ci0gICAgICAgIFRFUSAgICAgU3ltYm9sLCAjMTUgICAgICAgICA7Ly8gaWYgTGV2ZWxTdWZmaXhTaXplPT0xNQotICAgICAgICBNT1ZFUSAgIGxyLCAjMTIgICAgICAgICAgICAgOy8vICAgdGhlbiBMZXZlbFN1ZmZpeFNpemU9MTIKLSAgICAgICAgCi0gICAgICAgIFRFUUVRICAgU3VmZml4TGVuZ3RoLCMwCi0gICAgICAgIEFEREVRICAgU3ltYm9sLFN5bWJvbCwjMTUKLSAgICAgICAgCi0gICAgICAgIFRFUSAgICAgbHIsICMwICAgICAgICAgICAgICA7Ly8gaWYgTGV2ZWxTdWZmaXhTaXplPT0wCi0gICAgICAgIEJFUSAgICAgTGV2ZWxDb2RlUmVhZCAgICAgICA7Ly8gTGV2ZWxDb2RlID0gTGV2ZWxQcmVmaXgKLSAgICAgICAgCi0gICAgICAgIE1fQkRfVlJFQUQxNiBMZXZlbFN1ZmZpeCwgbHIsIFQxLCBUMiAgOy8vIFJlYWQgTGV2ZWwgU3VmZml4Ci0gICAgICAgIAotICAgICAgICBNT1YgICAgIFN5bWJvbCwgU3ltYm9sLCBMU0wgU3VmZml4TGVuZ3RoCi0gICAgICAgIEFERCAgICAgU3ltYm9sLCBMZXZlbFN1ZmZpeCwgU3ltYm9sCi0gICAgICAgICAgICAgCi1MZXZlbENvZGVSZWFkICAgICAgICAKLSAgICAgICAgOy8vIFN5bWJvbCA9IExldmVsQ29kZQotICAgICAgICBBREQgICAgIFN5bWJvbCwgU3ltYm9sLCBUcmFpbGluZ09uZXMgOy8vICs0IGlmIGxldmVsIGNhbm5vdCBiZSArLy0xLCArMiBvL3cKLSAgICAgICAgTU9WICAgICBUcmFpbGluZ09uZXMsICMyCi0gICAgICAgIE1PVlMgICAgVDEsIFN5bWJvbCwgTFNSICMxCi0gICAgICAgIFJTQkNTICAgVDEsIFQxLCAjMCAgICAgICAgICAgICAgICAgIDsvLyBJZiBTeW1ib2wgb2RkIHRoZW4gbmVnYXRlCi0gICAgICAgIE1fUFJJTlRGICJMZXZlbD0lZFxuIiwgVDEKLSAgICAgICAgU1RSSCAgICBUMSwgW3BMZXZlbF0sICMyICAgICAgICAgICAgOy8vIFN0b3JlIGxldmVsLgotICAgICAgICAKLSAgICAgICAgTERSICAgICBUMiwgPWFybVZDTTRQMTBfU3VmZml4VG9MZXZlbAotICAgICAgICBMRFJTQiAgIFQxLCBbVDIsIFN1ZmZpeExlbmd0aF0gICAgICA7Ly8gRmluZCBpbmNyZW1lbnQgbGV2ZWwgICAgICAgIAotICAgICAgICBURVEgICAgIFN1ZmZpeExlbmd0aCwgIzAKLSAgICAgICAgTU9WRVEgICBTdWZmaXhMZW5ndGgsICMxCi0gICAgICAgIENNUCAgICAgU3ltYm9sLCBUMQotICAgICAgICBBRERDUyAgIFN1ZmZpeExlbmd0aCwgU3VmZml4TGVuZ3RoLCAjMSAgICAgICAgCi0gICAgICAgIFNVQlMgICAgQ291bnQsIENvdW50LCAjMSAgICAgICAgCi0gICAgICAgIEJHVCAgICAgTGV2ZWxMb29wCi0gICAgICAgIAotRGVjb2RlUnVucyAgICAgICAgCi0gICAgICAgIDsvLyBGaW5kIG51bWJlciBvZiB6ZXJvcwotICAgICAgICBNX0xEUiAgIFQxLCBwU01heE51bUNvZWZmICAgICAgICAgICA7Ly8gc01heE51bUNvZWZmCi0gICAgICAgIFNVQiAgICAgQ291bnQsIFRvdGFsQ29lZmYsICMxICAgICAgIDsvLyBOdW1iZXIgb2YgcnVucyBleGNsdWRpbmcgbGFzdAotICAgICAgICBTVUJTICAgIFplcm9zTGVmdCwgVDEsIFRvdGFsQ29lZmYgICA7Ly8gTWF4aW11bSBudW1iZXIgb2YgemVyb3MgdGhlcmUgY291bGQgYmUKLSAgICAgICAgTV9BRFIgICBwUnVuLCBwcFJ1bgotICAgICAgICBNT1YgICAgIENvZWZmTnVtLFRvdGFsQ29lZmYKLSAgICAgICAgU1VCICAgICBDb2VmZk51bSxDb2VmZk51bSwjMQotICAgICAgICBCRVEgICAgIE5vWmVyb3NMZWZ0Ci0gICAgICAgIAotICAgICAgICA7Ly8gVW5wYWNrIG51bWJlciBvZiB6ZXJvcyBmcm9tIGJpdHN0cmVhbQotICAgICAgICBURVEgICAgIFQxLCAjNCAgICAgICAgCi0gICAgICAgIExEUkVRICAgcFZMRFRhYmxlLCA9KGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzLTQpCi0gICAgICAgIExEUk5FICAgcFZMRFRhYmxlLCA9KGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXMtNCkKLSAgICAgICAgTERSICAgICBwVkxEVGFibGUsIFtwVkxEVGFibGUsIFRvdGFsQ29lZmYsIExTTCAjMl0KLSAgICAgICAgCi0gICAgICAgIE1fQkRfVkxEICBTeW1ib2wsIFQxLCBUMiwgcFZMRFRhYmxlLCA0LCAyIDsvLyBTeW1ib2wgPSBaZXJvc0xlZnQKLSAgICAgICAgQ01QICAgICBTeW1ib2wsIzE2Ci0gICAgICAgIEJHRSAgICAgRW5kQmFkU3ltYm9sCi0KLSAgICAgICAgTERSICAgICBwcFJ1blRhYmxlLCA9KGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXMtNCkKLSAgICAgICAgTV9BRFIgICBwUnVuLCBwcFJ1bgotICAgICAgICBNT1ZTICAgIFplcm9zTGVmdCwgU3ltYm9sCi0KLSAgICAgICAgQUREICAgICBDb2VmZk51bSxDb2VmZk51bSxaZXJvc0xlZnQgICAgICAgIAotCi0gICAgICAgIEJFUSAgICAgTm9aZXJvc0xlZnQKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWNvZGUgcnVucyB3aGlsZSB6ZXJvcyBhcmUgbGVmdCBhbmQgbW9yZSB0aGFuIG9uZSBjb2VmZmljaWVudAotUnVuTG9vcCAKLSAgICAgICAgU1VCUyAgICBDb3VudCwgQ291bnQsICMxCi0gICAgICAgIExEUiAgICAgcFZMRFRhYmxlLCBbcHBSdW5UYWJsZSwgWmVyb3NMZWZ0LCBMU0wjMl0KLSAgICAgICAgQkxUICAgICBMYXN0UnVuCi0gICAgICAgIE1fQkRfVkxEICBTeW1ib2wsIFQxLCBUMiwgcFZMRFRhYmxlLCAzLCAyIDsvLyBTeW1ib2wgPSBSdW4KLSAgICAgICAgQ01QICAgICBTeW1ib2wsIzE1ICAgICAgICAgCi0gICAgICAgIEJHRSAgICAgRW5kQmFkU3ltYm9sICAgICAgICAKLQotICAgICAgICBTVUJTICAgIFplcm9zTGVmdCwgWmVyb3NMZWZ0LCBTeW1ib2wKLSAgICAgICAgTV9QUklOVEYgIlJ1bj0lZFxuIiwgU3ltYm9sCi0gICAgICAgIFNUUkIgICAgU3ltYm9sLCBbcFJ1bl0sICMxCi0gICAgICAgIEJHVCAgICAgUnVuTG9vcAotICAgICAgICAKLSAgICAgICAgOy8vIERlY29kZSBydW5zIHdoaWxlIG5vIHplcm9zIGFyZSBsZWZ0Ci1Ob1plcm9zTGVmdCAKLSAgICAgICAgU1VCUyAgICBDb3VudCwgQ291bnQsICMxCi0gICAgICAgIE1fUFJJTlRGICJSdW49JWRcbiIsIFplcm9zTGVmdAotICAgICAgICBTVFJHRUIgIFplcm9zTGVmdCwgW3BSdW5dLCAjMQotICAgICAgICBCR1QgICAgIE5vWmVyb3NMZWZ0Ci0KLUxhc3RSdW4gICAgICAgIAotICAgICAgICA7Ly8gRmluYWwgcnVuIGxlbmd0aCBpcyByZW1haW5pbmcgemVyb3MKLSAgICAgICAgTV9QUklOVEYgIkxhc3RSdW49JWRcbiIsIFplcm9zTGVmdAotICAgICAgICBTVFJCICAgIFplcm9zTGVmdCwgW3BSdW5dLCAjMSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gV3JpdGUgY29lZmZpY2llbnRzIHRvIG91dHB1dCBhcnJheQotICAgICAgICBNX0xEUiAgIFQxLCBwU01heE51bUNvZWZmICAgICAgICAgICAgICAgICAgICA7Ly8gc01heE51bUNvZWZmCi0gICAgICAgIFRFUSAgICAgVDEsICMxNQotICAgICAgICBBRERFUSAgIENvZWZmTnVtLENvZWZmTnVtLCMxCi0gICAgICAgIAotCi0gICAgICAgIFNVQiAgICAgcFJ1bixwUnVuLFRvdGFsQ29lZmYKLSAgICAgICAgU1VCICAgICBwTGV2ZWwscExldmVsLFRvdGFsQ29lZmYgIAotICAgICAgICBTVUIgICAgIHBMZXZlbCxwTGV2ZWwsVG90YWxDb2VmZiAgIAotCi0gICAgICAgIE1fTERSICAgcHBQb3NDb2VmYnVmLCBwcHBQb3NDb2VmYnVmCi0gICAgICAgIExEUiAgICAgcFBvc0NvZWZidWYsIFtwcFBvc0NvZWZidWZdCi0gICAgICAgIFRFUSAgICAgVDEsICM0Ci0gICAgICAgIExEUkVRICAgcFppZ1phZywgPWFybVZDTTRQMTBfWmlnWmFnXzJ4MgotICAgICAgICBMRFJORSAgIHBaaWdaYWcsID1hcm1WQ000UDEwX1ppZ1phZ180eDQKLQotICAgICAgICAKLSAgICAgICAgCi1PdXRwdXRMb29wCi0gICAgICAgIAotICAgICAgICBMRFJCICAgIFQyLCBbcFJ1bl0sIzEKLSAgICAgICAgTERSQiAgICBUMSwgW3BaaWdaYWcsIENvZWZmTnVtXQotICAgICAgICBTVUIgICAgIENvZWZmTnVtLCBDb2VmZk51bSwgIzEgICAgICA7Ly8gU2tpcCBOb24gemVybwotICAgICAgICBTVUIgICAgIENvZWZmTnVtLCBDb2VmZk51bSwgVDIgICAgICA7Ly8gU2tpcCBaZXJvIHJ1bgotICAgICAgICAKLSAgICAgICAgTERSU0ggICBUMiwgW3BMZXZlbF0sIzIKLSAgICAgICAgCi0gICAgICAgIFNVQlMgICAgVG90YWxDb2VmZiwgVG90YWxDb2VmZiwgIzEgICAgICAgCi0gICAgICAgIE9SUkVRICAgVDEsIFQxLCAjTEFTVF9DT0VGRgotICAgICAgICAKLSAgICAgICAgQUREICAgICB0ZW1wLCBUMiwgIzEyOAotICAgICAgICBDTVAgICAgIHRlbXAsICMyNTYKLSAgICAgICAgT1JSQ1MgICBUMSwgVDEsICNUV09fQllURV9DT0VGRgotCi0gICAgICAgIAotICAgICAgICBURVEgICAgIFRvdGFsQ29lZmYsICMwICAgICAgICAgICAgICA7Ly8gUHJlc2VydmVzIGNhcnJ5ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1fUFJJTlRGICJPdXRwdXQ9JTAyeCAlMDR4XG4iLCBUMSwgVDIKLSAgICAgICAgU1RSQiAgICBUMSwgW3BQb3NDb2VmYnVmXSwgIzEKLSAgICAgICAgU1RSQiAgICBUMiwgW3BQb3NDb2VmYnVmXSwgIzEKLSAgICAgICAgTU9WICAgICBUMiwgVDIsIExTUiAjOAotICAgICAgICBTVFJDU0IgIFQyLCBbcFBvc0NvZWZidWZdLCAjMSAgICAgICAgICAgICAgICAKLSAgICAgICAgQk5FICAgICBPdXRwdXRMb29wCi0gICAgICAgIAotICAgICAgICA7Ly8gRmluaXNoZWQKLSAgICAgICAgU1RSICAgICBwUG9zQ29lZmJ1ZiwgW3BwUG9zQ29lZmJ1Zl0KLSAgICAgICAgTV9MRFIgICBwcEJpdFN0cmVhbSwgcHBwQml0U3RyZWFtCi0gICAgICAgIE1fTERSICAgcE9mZnNldCwgcHBPZmZzZXQKLSAgICAgICAgQiAgICAgICBFbmROb0Vycm9yCi0gICAgICAgICAgICAKLUVuZEJhZFN5bWJvbAotICAgICAgICBNT1YgICAgIHIwLCAjT01YX1N0c19FcnIKLSAgICAgICAgQiAgICAgICBFbmQgICAgCi0gICAgICAgIAotRW5kTm9FcnJvcgotICAgICAgICA7Ly8gRmluaXNoZWQgcmVhZGluZyBmcm9tIHRoZSBiaXRzdHJlYW0gICAgICAgICAgICAgICAgCi0gICAgICAgIE1fQkRfRklOSSBwcEJpdFN0cmVhbSwgcE9mZnNldAotICAgICAgICAKLSAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKLSAgICAgICAgTU9WICAgICByMCwgI09NWF9TdHNfTm9FcnIgICAgCi1FbmQKLSAgICAgICAgTV9FTkQKLSAgICAKLSAgICBFTkRJRgotICAgIAotICAgIEVORAotICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2U4Yzg5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucworKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICAKLQotICAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgCi0gICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9RUERpdlRhYmxlCi0gICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQotICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0Ci0gICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDIKLSAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXggCi0gICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCi0gICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9WTWF0cml4VTE2Ci0gICAgICAgICAKLTsvLyBEZWZpbmUgdGhlIHByb2Nlc3NvciB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBmaWxlCi0gICAgICAgICAKLSAgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLSAgICAgICAgICAgCi0gICAgICAgICAKLTsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKLQotICAgIAotICAgIElGIENvcnRleEE4Ci0gICAgICAgICAgIAotIAotICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NAotICAgICAgICAgRENCICAwLCAyLCAwLCAyCi0gICAgICAgICBEQ0IgIDIsIDEsIDIsIDEKLSAgICAgICAgIERDQiAgMCwgMiwgMCwgMgotICAgICAgICAgRENCICAyLCAxLCAyLCAxCi0KLQotICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1Bvc1RvVkNvbDJ4MgotICAgICAgICAgRENCICAwLCAyCi0gICAgICAgICBEQ0IgIDIsIDEKLQotCi0gICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfVk1hdHJpeAotICAgICAgICAgRENCICAxMCwgMTYsIDEzCi0gICAgICAgICBEQ0IgIDExLCAxOCwgMTQKLSAgICAgICAgIERDQiAgMTMsIDIwLCAxNgotICAgICAgICAgRENCICAxNCwgMjMsIDE4Ci0gICAgICAgICBEQ0IgIDE2LCAyNSwgMjAKLSAgICAgICAgIERDQiAgMTgsIDI5LCAyMwotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gWyhJTlQpKFFQLzYpXSwKLTsvLyBmb3IgdmFsdWVzIG9mIFFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9RUERpdlRhYmxlCi0gICAgICAgICBEQ0IgIDAsICAwLCAgMCwgIDAsICAwLCAgMAotICAgICAgICAgRENCICAxLCAgMSwgIDEsICAxLCAgMSwgIDEKLSAgICAgICAgIERDQiAgMiwgIDIsICAyLCAgMiwgIDIsICAyCi0gICAgICAgICBEQ0IgIDMsICAzLCAgMywgIDMsICAzLCAgMwotICAgICAgICAgRENCICA0LCAgNCwgIDQsICA0LCAgNCwgIDQKLSAgICAgICAgIERDQiAgNSwgIDUsICA1LCAgNSwgIDUsICA1Ci0gICAgICAgICBEQ0IgIDYsICA2LCAgNiwgIDYsICA2LCAgNgotICAgICAgICAgRENCICA3LCAgNywgIDcsICA3LCAgNywgIDcKLSAgICAgICAgIERDQiAgOCwgIDgsICA4LCAgOCwgIDgsICA4Ci0gICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBjb250YWlucyBhcm1WQ000UDEwX1ZNYXRyaXhbUVAlNl1bMF0gZW50aXJlcywKLTsvLyBmb3IgdmFsdWVzIG9mIFFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQotICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgZXZhbHVhdGVzIHRoZSBtb2R1bHVzIGV4cHJlc3Npb24gW1FQJTZdKjYsCi07Ly8gZm9yIHZhbHVlcyBvZiBRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZQotICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgICAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBpbnZpZHVhbCBieXRlIHZhbHVlcyBzdG9yZWQgYXMKLTsvLyBoYWxmd29yZHMuIFRoaXMgYXZvaWRzIHVucGFja2luZyBpbnNpZGUgdGhlIGZ1bmN0aW9uCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1ZNYXRyaXhVMTYKLSAgICAgICAgIERDVyAxMCwgMTYsIDEzIAotICAgICAgICAgRENXIDExLCAxOCwgMTQKLSAgICAgICAgIERDVyAxMywgMjAsIDE2Ci0gICAgICAgICBEQ1cgMTQsIDIzLCAxOAotICAgICAgICAgRENXIDE2LCAyNSwgMjAKLSAgICAgICAgIERDVyAxOCwgMjksIDIzIAotICAgICAgICAgCi0gICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0FSTTExMzZKUyAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIAotICAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYjNlMjIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQotCi1ERUJVR19PTiAgICBTRVRMIHtGQUxTRX0KLQotICAgIElGIEFSTTExMzZKUyAKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi1wU3JjICAgICAgICAgICAgUk4gMAotc3JjU3RlcCAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICBSTiA4Ci1pSGVpZ2h0ICAgICAgICAgUk4gOQotCi07Ly8gRGVjbGFyZSBpbm5lciBsb29wIHJlZ2lzdGVycwoteCAgICAgICAgICAgICAgIFJOIDcKLXgwICAgICAgICAgICAgICBSTiA3Ci14MSAgICAgICAgICAgICAgUk4gMTAKLXgyICAgICAgICAgICAgICBSTiAxMQotU2NyYXRjaCAgICAgICAgIFJOIDEyCi0KLTsvLyBGdW5jdGlvbjogCi07Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCi07Ly8KLTsvLyBJbXBsZW1lbnRzIGNvcHkgZnJvbSBhbiBhcmJpdHJhcnkgYWxpZ25lZCBzb3VyY2UgbWVtb3J5IGxvY2F0aW9uIChwU3JjKSB0byBhIDQgYnl0ZSBhbGlnbmVkCi07Ly8gZGVzdGluYXRpb24gcG9pbnRlZCBieSAocERzdCkgZm9yIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbi4KLTsvLyBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGNvcHkgOSBieXRlcyBpbiBob3Jpem9udGFsIGRpcmVjdGlvbi4gCi07Ly8KLTsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgotOy8vIHIwLHIxLHI4LHI5IHdoZXJlIHI4IGNvbnRhaW5pbmdzIGFsaWduZWQgbWVtb3J5IHBvaW50ZXIgYW5kIHI5IG5vIHJvd3MgdG8gY29weQotOy8vCi07Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCi07Ly8gcjIscjMscjQscjUscjYKLTsvLwotOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KLTsvLyByNyxyOCxyOSxyMTAscjExLHIxMgotOy8vCi07Ly8gT3V0cHV0IHJlZ2lzdGVycwotOy8vIHIwIC0gcG9pbnRlciB0byB0aGUgbmV3IGFsaWduZWQgbG9jYXRpb24gd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHBTcmMKLTsvLyByMSAtIHN0ZXAgc2l6ZSB0byB0aGlzIGFsaWduZWQgbG9jYXRpb24KLQotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIENvcHkgcERzdCB0byBzY3JhdGNoCi0gICAgICAgIE1PViAgICAgU2NyYXRjaCwgcERzdAotCi1TdGFydEFsaWduZWRTdGFja0NvcHkKLSAgICAgICAgQU5EICAgICB4LCBwU3JjLCAjMwotICAgICAgICBCSUMgICAgIHBTcmMsIHBTcmMsICMzCi0gICAgICAgIAotICAgICAgICBNX1NXSVRDSCB4Ci0gICAgICAgIE1fQ0FTRSAgIENvcHkwdG9BbGlnbmVkCi0gICAgICAgIE1fQ0FTRSAgIENvcHkxdG9BbGlnbmVkCi0gICAgICAgIE1fQ0FTRSAgIENvcHkydG9BbGlnbmVkCi0gICAgICAgIE1fQ0FTRSAgIENvcHkzdG9BbGlnbmVkCi0gICAgICAgIE1fRU5EU1dJVENICi0KLUNvcHkwdG9BbGlnbmVkICAKLSAgICAgICAgTERNICAgICBwU3JjLCB7eDAsIHgxLCB4Mn0KLSAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMQotICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAKLSAgICAgICAgCi0gICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKLQotICAgICAgICBTVE0gICAgIHBEc3QhLCB7eDAsIHgxLCB4Mn0gICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93Ci0gICAgICAgIEJHVCAgICAgQ29weTB0b0FsaWduZWQKLSAgICAgICAgQiAgICAgICBDb3B5RW5kICAKLSAgICAgIAotQ29weTF0b0FsaWduZWQgICAgICAgIAotICAgICAgICBMRE0gICAgIHBTcmMsIHt4MCwgeDEsIHgyfQotICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCi0gICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcAotICAgICAgICAKLSAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAotCi0gICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzgKLSAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzI0Ci0gICAgICAgIE1PViAgICAgeDEsIHgxLCBMU1IgIzgKLSAgICAgICAgT1JSICAgICB4MSwgeDEsIHgyLCBMU0wgIzI0Ci0gICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzgKLSAgICAgICAgU1RNICAgICBwRHN0ISwge3gwLCB4MSwgeDJ9ICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdwotICAgICAgICBCR1QgICAgIENvcHkxdG9BbGlnbmVkCi0gICAgICAgIEIgICAgICAgQ29weUVuZCAgCi0KLUNvcHkydG9BbGlnbmVkICAgICAgICAKLSAgICAgICAgTERNICAgICBwU3JjLCB7eDAsIHgxLCB4Mn0KLSAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMQotICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAKLSAgICAgICAgCi0gICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKLQotICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICMxNgotICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMTYKLSAgICAgICAgTU9WICAgICB4MSwgeDEsIExTUiAjMTYKLSAgICAgICAgT1JSICAgICB4MSwgeDEsIHgyLCBMU0wgIzE2Ci0gICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzE2Ci0gICAgICAgIFNUTSAgICAgcERzdCEsIHt4MCwgeDEsIHgyfSAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKLSAgICAgICAgQkdUICAgICBDb3B5MnRvQWxpZ25lZAotICAgICAgICBCICAgICAgIENvcHlFbmQgIAotCi1Db3B5M3RvQWxpZ25lZCAgICAgICAgCi0gICAgICAgIExETSAgICAgcFNyYywge3gwLCB4MSwgeDJ9Ci0gICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEKLSAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCi0gICAgICAgIAotICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCi0KLSAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjMjQKLSAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzgKLSAgICAgICAgTU9WICAgICB4MSwgeDEsIExTUiAjMjQKLSAgICAgICAgT1JSICAgICB4MSwgeDEsIHgyLCBMU0wgIzgKLSAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMjQKLSAgICAgICAgU1RNICAgICBwRHN0ISwge3gwLCB4MSwgeDJ9ICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdwotICAgICAgICBCR1QgICAgIENvcHkzdG9BbGlnbmVkCi0KLUNvcHlFbmQgIAotICAgICAgICAKLSAgICAgICAgTU9WICAgICBwU3JjLCBTY3JhdGNoCi0gICAgICAgIE1PViAgICAgc3JjU3RlcCwgIzEyCi0KLSAgICAgICAgTV9FTkQKLSAgICAKLQotOy8vIEZ1bmN0aW9uOgotOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQotOy8vCi07Ly8gSW1wbGVtZW50cyBjb3B5IGZyb20gYW4gYXJiaXRyYXJ5IGFsaWduZWQgc291cmNlIG1lbW9yeSBsb2NhdGlvbiAocFNyYykgdG8gYW4gYWxpZ25lZAotOy8vIGRlc3RpbmF0aW9uIHBvaW50ZWQgYnkgKHBEc3QpIGZvciB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uLgotOy8vIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gY29weSA0IGJ5dGVzIGluIGhvcml6b250YWwgZGlyZWN0aW9uIAotOy8vCi07Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KLTsvLyByMCxyMSxyOCxyOSB3aGVyZSByOCBjb250YWluaW5ncyBhbGlnbmVkIG1lbW9yeSBwb2ludGVyIGFuZCByOSBubyBvZiByb3dzIHRvIGNvcHkKLTsvLwotOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgotOy8vIHIyLHIzLHI0LHI1LHI2Ci07Ly8KLTsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCi07Ly8gcjcscjgscjkscjEwLHIxMSxyMTIKLTsvLwotOy8vIE91dHB1dCByZWdpc3RlcnMKLTsvLyByMCAtIHBvaW50ZXIgdG8gdGhlIG5ldyBhbGlnbmVkIGxvY2F0aW9uIHdoaWNoIHdpbGwgYmUgdXNlZCBhcyBwU3JjCi07Ly8gcjEgLSBzdGVwIHNpemUgdG8gdGhpcyBhbGlnbmVkIGxvY2F0aW9uCi0KLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBDb3B5IHBTcmMgdG8gc3RhY2sKLVN0YXJ0VkFsaWduZWRTdGFja0NvcHkKLSAgICAgICAgQU5EICAgICB4LCBwU3JjLCAjMwotICAgICAgICBCSUMgICAgIHBTcmMsIHBTcmMsICMzICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgTV9TV0lUQ0ggeAotICAgICAgICBNX0NBU0UgICBDb3B5MHRvVkFsaWduZWQKLSAgICAgICAgTV9DQVNFICAgQ29weTF0b1ZBbGlnbmVkCi0gICAgICAgIE1fQ0FTRSAgIENvcHkydG9WQWxpZ25lZAotICAgICAgICBNX0NBU0UgICBDb3B5M3RvVkFsaWduZWQKLSAgICAgICAgTV9FTkRTV0lUQ0gKLSAgICAgICAgCi1Db3B5MHRvVkFsaWduZWQgIAotICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMQotICAgICAgICAKLSAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAotCi0gICAgICAgIFNUUiAgICAgeDAsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93Ci0gICAgICAgIEJHVCAgICAgQ29weTB0b1ZBbGlnbmVkCi0gICAgICAgIEIgICAgICAgQ29weVZFbmQgIAotICAgICAgCi1Db3B5MXRvVkFsaWduZWQgICAgICAgIAotICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKLQotICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNMICMyNAotICAgICAgICBPUlIgICAgIHgwLCB4MSwgeDAsIExTUiAjOAotICAgICAgICBTVFIgICAgIHgwLCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdwotICAgICAgICBCR1QgICAgIENvcHkxdG9WQWxpZ25lZAotICAgICAgICBCICAgICAgIENvcHlWRW5kICAKLQotQ29weTJ0b1ZBbGlnbmVkICAgICAgICAKLSAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCi0KLSAgICAgICAgTU9WICAgICB4MSwgeDEsIExTTCAjMTYKLSAgICAgICAgT1JSICAgICB4MCwgeDEsIHgwLCBMU1IgIzE2Ci0gICAgICAgIFNUUiAgICAgeDAsIFtwRHN0XSwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93Ci0gICAgICAgIEJHVCAgICAgQ29weTJ0b1ZBbGlnbmVkCi0gICAgICAgIEIgICAgICAgQ29weVZFbmQgIAotCi1Db3B5M3RvVkFsaWduZWQgICAgICAgIAotICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKLQotICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNMICM4Ci0gICAgICAgIE9SUiAgICAgeDAsIHgxLCB4MCwgTFNSICMyNAotICAgICAgICBTVFIgICAgIHgwLCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdwotICAgICAgICBCR1QgICAgIENvcHkzdG9WQWxpZ25lZAotCi1Db3B5VkVuZCAgCi0KLSAgICAgICAgU1VCICAgICBwU3JjLCBwRHN0LCAjMjgKLSAgICAgICAgTU9WICAgICBzcmNTdGVwLCAjNAotCi0gICAgICAgIE1fRU5ECi0KLQotICAgIEVORElGCi0KLSAgICBFTkQKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MTViZWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotOy8vIEZ1bmN0aW9uOgotOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5NHg0X3Vuc2FmZSAKLTsvLwotOy8vIEltcGxlbWVudHMgY29weSBmcm9tIGFuIGFyYml0cmFyeSBhbGlnbmVkIHNvdXJjZSBtZW1vcnkgbG9jYXRpb24gKHBTcmMpIHRvIGFuIGFsaWduZWQKLTsvLyBkZXN0aW5hdGlvbiBwb2ludGVkIGJ5IChwRHN0KQotOy8vCi07Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCi07Ly8gcjEscjMscjQscjUscjYscjcscjEwLHIxMSxyMTQKLTsvLwotOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KLTsvLyByMCxyMixyOCxyOSxyMTIKLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5NHg0X3Vuc2FmZQotICAgICAgICAKLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotcFNyYyAgICAgICAgICAgIFJOIDAKLXNyY1N0ZXAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgUk4gMgotZHN0U3RlcCAgICAgICAgIFJOIDMKLQotOy8vIERlY2xhcmUgb3RoZXIgaW50ZXJtZWRpYXRlIHJlZ2lzdGVycwoteDAgICAgICAgICAgICAgIFJOIDQKLXgxICAgICAgICAgICAgICBSTiA1Ci14MiAgICAgICAgICAgICAgUk4gOAoteDMgICAgICAgICAgICAgIFJOIDkKLVRlbXAgICAgICAgICAgICBSTiAxMgotCi0gICAgSUYgQVJNMTEzNkpTCi0KLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5NHg0X3Vuc2FmZSwgcjYKLQotQ29weTR4NFN0YXJ0Ci0gICAgICAgIDsvLyBEbyBDb3B5IGFuZCBicmFuY2ggdG8gRW5kT2ZJbnRlcnBvbGF0aW9uCi0gICAgICAgIEFORCAgICAgVGVtcCwgcFNyYywgIzMKLSAgICAgICAgQklDICAgICBwU3JjLCBwU3JjLCAjMyAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgIE1fU1dJVENIIFRlbXAKLSAgICAgICAgTV9DQVNFICBDb3B5NHg0QWxpZ24wCi0gICAgICAgIE1fQ0FTRSAgQ29weTR4NEFsaWduMQotICAgICAgICBNX0NBU0UgIENvcHk0eDRBbGlnbjIKLSAgICAgICAgTV9DQVNFICBDb3B5NHg0QWxpZ24zCi0gICAgICAgIE1fRU5EU1dJVENICi0KLUNvcHk0eDRBbGlnbjAKLSAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIE1fTERSICAgeDEsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIE1fU1RSICAgeDEsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBNX0xEUiAgIHgzLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIE1fU1RSICAgeDMsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBCICAgICAgIENvcHk0eDRFbmQgIAotCi1Db3B5NHg0QWxpZ24xCi0gICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzgKLSAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzI0Ci0gICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICM4Ci0gICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICMyNAotICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCi0gICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgTERSICAgICB4MywgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjOAotICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMjQKLSAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzgKLSAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzI0Ci0gICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBCICAgICAgIENvcHk0eDRFbmQgIAotICAgICAgCi1Db3B5NHg0QWxpZ24yCi0gICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzE2Ci0gICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMxNgotICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMTYKLSAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzE2Ci0gICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgCi0KLSAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTERSICAgICB4MywgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjMTYKLSAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzE2Ci0gICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMxNgotICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjMTYKLSAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAKLSAgICAgICAgQiAgICAgICBDb3B5NHg0RW5kICAKLQotQ29weTR4NEFsaWduMyAKLSAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTERSICAgICB4MywgW3BTcmMsICM0XQotICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjMjQKLSAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzgKLSAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzI0Ci0gICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICM4Ci0gICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcAotCi0gICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KLSAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzI0Ci0gICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICM4Ci0gICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMyNAotICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjOAotICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgQiAgICAgICBDb3B5NHg0RW5kICAKLQotQ29weTR4NEVuZAotICAgICAgICBNX0VORAotCi0gICAgRU5ESUYKLQotICAgIEVORAotICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWE3MzI2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucworKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JEaWFnQ29weV91bnNhZmUKLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckRpYWdDb3B5X3Vuc2FmZQotCi07Ly8gRnVuY3Rpb25zOiAKLTsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlIGFuZAotOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUgCi07Ly8KLTsvLyBJbXBsZW1lbnRzIHJlLWFycmFuZ2VtZW50IG9mIGRhdGEgZnJvbSB0ZW1wb3JhcnkgYnVmZmVyIHRvIGEgYnVmZmVyIHBvaW50ZWQgYnkgcEJ1Zi4KLTsvLyBUaGlzIHdpbGwgZG8gdGhlIGNvbnZlcnRpb24gb2YgZGF0YSBmcm9tIDE2IGJpdCB0byA4IGJpdCBhbmQgaXQgYWxzbwotOy8vIHJlbW92ZSBvZmZzZXQgYW5kIGNoZWNrIGZvciBzYXR1cmF0aW9uLgotOy8vCi07Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KLTsvLyByMCxyMSxyNyB3aGVyZSByMCBpcyBpbnB1dCBwb2ludGVyIGFuZCByMiBpdHMgc3RlcCBzaXplLCByNyBpcyBvdXRwdXQgcG9pbnRlcgotOy8vCi07Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCi07Ly8gcjQscjUscjYscjgscjkscjE0Ci07Ly8KLTsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCi07Ly8gcjcscjEwLHIxMSxyMTIKLTsvLwotOy8vIE91dHB1dCByZWdpc3RlcnMKLTsvLyByMCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGxvY2F0aW9uCi07Ly8gcjEgLSBzdGVwIHNpemUgdG8gdGhpcyBkZXN0aW5hdGlvbiBsb2NhdGlvbgotCi0KLURFQlVHX09OICAgIFNFVEwge0ZBTFNFfQotICAgICAgICAKLU1BU0sgICAgICAgICAgICBFUVUgMHg4MDgwODA4MCAgOy8vIE1hc2sgaXMgdXNlZCB0byBpbXBsZW1lbnQgKGErYisxKS8yCi0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotCi1wU3JjMCAgICAgICAgICAgUk4gMAotc3JjU3RlcDAgICAgICAgIFJOIDEKLQotOy8vIERlY2xhcmUgb3RoZXIgaW50ZXJtZWRpYXRlIHJlZ2lzdGVycwotVGVtcDEgICAgICAgICAgIFJOIDQKLVRlbXAyICAgICAgICAgICBSTiA1Ci1UZW1wMyAgICAgICAgICAgUk4gMTAKLVRlbXA0ICAgICAgICAgICBSTiAxMQotcEJ1ZiAgICAgICAgICAgIFJOIDcKLXIweDBmZTAwZmUwICAgICBSTiA2Ci1yMHgwMGZmMDBmZiAgICAgUk4gMTIKLUNvdW50ICAgICAgICAgICBSTiAxNAotVmFsdWVBMCAgICAgICAgIFJOIDEwCi1WYWx1ZUExICAgICAgICAgUk4gMTEKLQotICAgIElGIEFSTTExMzZKUwotCi0KLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZSwgcjYKLQotICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgCi0gICAgICAgIE1PViAgICAgICAgIENvdW50LCAjNCAgIAotICAgICAgICBMRFIgICAgICAgICByMHgwZmUwMGZlMCwgPTB4MGZlMDBmZTAKLSAgICAgICAgTERSICAgICAgICAgcjB4MDBmZjAwZmYsID0weDAwZmYwMGZmICAgICAgICAKLUxvb3BTdGFydDEKLSAgICAgICAgTERSICAgICAgICAgVGVtcDQsIFtwU3JjMCwgIzEyXQotICAgICAgICBMRFIgICAgICAgICBUZW1wMywgW3BTcmMwLCAjOF0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BTcmMwLCAjNF0KLSAgICAgICAgTV9MRFIgICAgICAgVGVtcDEsIFtwU3JjMF0sIHNyY1N0ZXAwICAgICAgICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgVGVtcDQsIFRlbXA0LCByMHgwZmUwMGZlMCAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXAzLCBUZW1wMywgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wMiwgVGVtcDIsIHIweDBmZTAwZmUwICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgVGVtcDEsIFRlbXAxLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCi0gICAgICAgIFVTQVQxNiAgICAgIFRlbXA0LCAjMTMsIFRlbXA0Ci0gICAgICAgIFVTQVQxNiAgICAgIFRlbXAzLCAjMTMsIFRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDIsICMxMywgVGVtcDIKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDEsICMxMywgVGVtcDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgIFRlbXA0LCByMHgwMGZmMDBmZiwgVGVtcDQsIExTUiAjNSAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wMywgcjB4MDBmZjAwZmYsIFRlbXAzLCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDIsIHIweDAwZmYwMGZmLCBUZW1wMiwgTFNSICM1ICAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgIFRlbXAxLCByMHgwMGZmMDBmZiwgVGVtcDEsIExTUiAjNSAgICAgICAgIAotICAgICAgICBPUlIgICAgICAgICBWYWx1ZUExLCBUZW1wMywgVGVtcDQsIExTTCAjOCAgICAgICAgICAgICAKLSAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMCwgVGVtcDEsIFRlbXAyLCBMU0wgIzggICAgICAgICAgICAgCi0gICAgICAgIFNVQlMgICAgICAgIENvdW50LCBDb3VudCwgIzEgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFNUUkQgICAgICAgIFZhbHVlQTAsIFtwQnVmXSwgIzggCi0gICAgICAgIEJHVCAgICAgICAgIExvb3BTdGFydDEKLUVuZDEKLSAgICAgICAgU1VCICAgICAgICBwU3JjMCwgcEJ1ZiwgIzMyCi0gICAgICAgIE1PViAgICAgICAgc3JjU3RlcDAsICM4Ci0KLSAgICAgICAgTV9FTkQKLQotCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUsIHI2Ci0gICAgICAgIAotICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIHIweDBmZTAwZmUwLCA9MHgwZmUwMGZlMAotICAgICAgICBMRFIgICAgICAgICByMHgwMGZmMDBmZiwgPTB4MDBmZjAwZmYKLSAgICAgICAgTU9WICAgICAgICAgQ291bnQsICMyCi0KLUxvb3BTdGFydCAgICAKLSAgICAgICAgTERSICAgICAgICAgVGVtcDQsIFtwU3JjMCwgIzEyXQotICAgICAgICBMRFIgICAgICAgICBUZW1wMywgW3BTcmMwLCAjOF0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BTcmMwLCAjNF0KLSAgICAgICAgTV9MRFIgICAgICAgVGVtcDEsIFtwU3JjMF0sIHNyY1N0ZXAwCi0gICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wNCwgVGVtcDQsIHIweDBmZTAwZmUwICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgVGVtcDMsIFRlbXAzLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXAyLCBUZW1wMiwgcjB4MGZlMDBmZTAgICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wMSwgVGVtcDEsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFVTQVQxNiAgICAgIFRlbXA0LCAjMTMsIFRlbXA0Ci0gICAgICAgIFVTQVQxNiAgICAgIFRlbXAzLCAjMTMsIFRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDIsICMxMywgVGVtcDIKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDEsICMxMywgVGVtcDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDQsIHIweDAwZmYwMGZmLCBUZW1wNCwgTFNSICM1ICAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgIFRlbXAzLCByMHgwMGZmMDBmZiwgVGVtcDMsIExTUiAjNSAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wMiwgcjB4MDBmZjAwZmYsIFRlbXAyLCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDEsIHIweDAwZmYwMGZmLCBUZW1wMSwgTFNSICM1ICAgICAgICAgCi0gICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTEsIFRlbXAzLCBUZW1wNCwgTFNMICM4ICAgICAgICA7Ly8gW2QyIGMyIGQwIGMwXSAgICAgICAgICAgICAKLSAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMCwgVGVtcDEsIFRlbXAyLCBMU0wgIzggICAgICAgIDsvLyBbYjIgYTIgYjAgYTBdICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICBQS0hCVCAgICAgICBUZW1wMSwgVmFsdWVBMCwgVmFsdWVBMSwgTFNMICMxNiAgICAgOy8vIFtkMCBjMCBiMCBhMF0KLQotICAgICAgICBTVFIgICAgICAgICBUZW1wMSwgW3BCdWZdLCAjOCAKLSAgICAgICAgUEtIVEIgICAgICAgVGVtcDIsIFZhbHVlQTEsIFZhbHVlQTAsIEFTUiAjMTYgICAgIDsvLyBbZDIgYzIgYjIgYTJdCi0gICAgICAgIFNUUiAgICAgICAgIFRlbXAyLCBbcEJ1Zl0sICMtNCAgCi0KLSAgICAgICAgTERSICAgICAgICAgVGVtcDQsIFtwU3JjMCwgIzEyXQotICAgICAgICBMRFIgICAgICAgICBUZW1wMywgW3BTcmMwLCAjOF0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BTcmMwLCAjNF0KLSAgICAgICAgTV9MRFIgICAgICAgVGVtcDEsIFtwU3JjMF0sIHNyY1N0ZXAwCi0gICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wNCwgVGVtcDQsIHIweDBmZTAwZmUwICAgICAgICAKLSAgICAgICAgVVFTVUIxNiAgICAgVGVtcDMsIFRlbXAzLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCi0gICAgICAgIFVRU1VCMTYgICAgIFRlbXAyLCBUZW1wMiwgcjB4MGZlMDBmZTAgICAgICAgIAotICAgICAgICBVUVNVQjE2ICAgICBUZW1wMSwgVGVtcDEsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFVTQVQxNiAgICAgIFRlbXA0LCAjMTMsIFRlbXA0Ci0gICAgICAgIFVTQVQxNiAgICAgIFRlbXAzLCAjMTMsIFRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDIsICMxMywgVGVtcDIKLSAgICAgICAgVVNBVDE2ICAgICAgVGVtcDEsICMxMywgVGVtcDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDQsIHIweDAwZmYwMGZmLCBUZW1wNCwgTFNSICM1ICAgICAgICAgCi0gICAgICAgIEFORCAgICAgICAgIFRlbXAzLCByMHgwMGZmMDBmZiwgVGVtcDMsIExTUiAjNSAgICAgICAgIAotICAgICAgICBBTkQgICAgICAgICBUZW1wMiwgcjB4MDBmZjAwZmYsIFRlbXAyLCBMU1IgIzUgICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgVGVtcDEsIHIweDAwZmYwMGZmLCBUZW1wMSwgTFNSICM1ICAgICAgICAgCi0gICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTEsIFRlbXAzLCBUZW1wNCwgTFNMICM4ICAgICAgICA7Ly8gW2QyIGMyIGQwIGMwXSAgICAgICAgICAgICAKLSAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMCwgVGVtcDEsIFRlbXAyLCBMU0wgIzggICAgICAgIDsvLyBbYjIgYTIgYjAgYTBdICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICBQS0hCVCAgICAgICBUZW1wMSwgVmFsdWVBMCwgVmFsdWVBMSwgTFNMICMxNiAgICAgOy8vIFtkMCBjMCBiMCBhMF0KLSAgICAgICAgU1VCUyAgICAgICAgQ291bnQsIENvdW50LCAjMQotICAgICAgICBTVFIgICAgICAgICBUZW1wMSwgW3BCdWZdLCAjOCAKLSAgICAgICAgUEtIVEIgICAgICAgVGVtcDIsIFZhbHVlQTEsIFZhbHVlQTAsIEFTUiAjMTYgICAgIDsvLyBbZDIgYzIgYjIgYTJdCi0gICAgICAgIFNUUiAgICAgICAgIFRlbXAyLCBbcEJ1Zl0sICM0ICAKLSAgICAgICAgCi0gICAgICAgIEJHVCAgICAgICAgIExvb3BTdGFydAotRW5kMgotICAgICAgICBTVUIgICAgICAgICBwU3JjMCwgcEJ1ZiwgIzMyLTgKLSAgICAgICAgTU9WICAgICAgICAgc3JjU3RlcDAsICM0Ci0KLSAgICAgICAgTV9FTkQKLQotICAgIEVORElGCi0gICAgCi0gICAgRU5ECi0gICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkODY3ODIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKLQotICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0KLSAgICBJRiBDb3J0ZXhBOAotCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlLCByMTEKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi1wU3JjICAgICAgICAgICAgUk4gMAotc3JjU3RlcCAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICBSTiAyCi1kc3RTdGVwICAgICAgICAgUk4gMwotCi07Ly8gRGVjbGFyZSBOZW9uIHJlZ2lzdGVycwotZENvZWZmNSAgICAgICAgIEROIDMwLlMxNgotZENvZWZmMjAgICAgICAgIEROIDMxLlMxNgotcUNvZWZmNSAgICAgICAgIFFOIDE0LlMzMgotcUNvZWZmMjAgICAgICAgIFFOIDE1LlMzMgotICAgICAgICAKLXFTcmMwMSAgICAgICAgICBRTiAwLlU4Ci1kU3JjMCAgICAgICAgICAgRE4gMC5VOAotZFNyYzEgICAgICAgICAgIEROIDEuVTggICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi1kU3JjYiAgICAgICAgICAgRE4gNC5VOAotZFNyY2MgICAgICAgICAgIEROIDIuVTgKLWRTcmNkICAgICAgICAgICBETiAzLlU4Ci1kU3JjZSAgICAgICAgICAgRE4gNS5VOAotZFNyY2YgICAgICAgICAgIEROIDEuVTgKLQotcVNyY2IgICAgICAgICAgIFFOIDIuUzE2Ci1xU3JjYyAgICAgICAgICAgUU4gMS5TMTYKLWRTcmNCICAgICAgICAgICBETiA0LlMxNgotZFNyY0MgICAgICAgICAgIEROIDIuUzE2Ci0KLXFSZXMwICAgICAgICAgICBRTiA1LlMxNgotcVJlczEgICAgICAgICAgIFFOIDYuUzE2Ci1xUmVzMiAgICAgICAgICAgUU4gNy5TMTYKLXFSZXMzICAgICAgICAgICBRTiA4LlMxNgotcVJlczQgICAgICAgICAgIFFOIDkuUzE2Ci1xUmVzNSAgICAgICAgICAgUU4gMTAuUzE2Ci1xUmVzNiAgICAgICAgICAgUU4gMTEuUzE2Ci1xUmVzNyAgICAgICAgICAgUU4gMTIuUzE2Ci1xUmVzOCAgICAgICAgICAgUU4gMTMuUzE2Ci0gICAgCi1kUmVzMCAgICAgICAgICAgRE4gMTAuUzE2Ci1kUmVzMSAgICAgICAgICAgRE4gMTIuUzE2Ci1kUmVzMiAgICAgICAgICAgRE4gMTQuUzE2Ci1kUmVzMyAgICAgICAgICAgRE4gMTYuUzE2Ci1kUmVzNCAgICAgICAgICAgRE4gMTguUzE2Ci1kUmVzNSAgICAgICAgICAgRE4gMjAuUzE2Ci1kUmVzNiAgICAgICAgICAgRE4gMjIuUzE2Ci1kUmVzNyAgICAgICAgICAgRE4gMjQuUzE2Ci1kUmVzOCAgICAgICAgICAgRE4gMjYuUzE2Ci0gICAgCi1xQWNjMDEgICAgICAgICAgUU4gNS5TMzIKLXFBY2MyMyAgICAgICAgICBRTiA2LlMzMgotcUFjYzQ1ICAgICAgICAgIFFOIDIuUzMyCi1xQWNjNjcgICAgICAgICAgUU4gMy5TMzIKLXFTdW1CRSAgICAgICAgICBRTiAwLlMzMgotcVN1bUNEICAgICAgICAgIFFOIDEuUzMyCi0KLWRUZW1wQWNjMCAgICAgICBETiAwLlUxNgotZFRlbXBBY2MxICAgICAgIEROIDIuVTE2Ci1kVGVtcEFjYzIgICAgICAgRE4gNC5VMTYKLWRUZW1wQWNjMyAgICAgICBETiA2LlUxNgotCi1xVEFjYzAgICAgICAgICAgUU4gMC5VMTYKLXFUQWNjMSAgICAgICAgICBRTiAxLlUxNgotcVRBY2MyICAgICAgICAgIFFOIDIuVTE2Ci1xVEFjYzMgICAgICAgICAgUU4gMy5VMTYKLQotZEFjYzAgICAgICAgICAgIEROIDAuVTgKLWRBY2MxICAgICAgICAgICBETiAyLlU4Ci1kQWNjMiAgICAgICAgICAgRE4gNC5VOAotZEFjYzMgICAgICAgICAgIEROIDYuVTgKLQotZFRtcDAgICAgICAgICAgIEROIDguUzE2Ci1kVG1wMSAgICAgICAgICAgRE4gOS5TMTYKLXFUbXAwICAgICAgICAgICBRTiA0LlMzMgotCi0gICAgICAgIFZMRDEgICAgICAgIHFTcmMwMSwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uXQotICAgICAgICBWTU9WICAgICAgICBkQ29lZmYyMCwgIzIwCi0gICAgICAgIFZNT1YgICAgICAgIGRDb2VmZjUsICM1Ci0KLSAgICAgICAgOy8vIFJvdzAKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmMwLCBkU3JjMSwgIzEgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNjLCBkU3JjMCwgZFNyYzEsICMyCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNkLCBkU3JjMCwgZFNyYzEsICMzCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjMCwgZFNyYzEsICM0Ci0gICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjMCwgZFNyYzEsICM1ICAgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQotICAgICAgICBWQURETCAgICAgICBxU3JjYywgZFNyY2MsIGRTcmNkICAgICAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVNyY2IsIGRTcmNiLCBkU3JjZSAgICAgICAgIDsvLyBiK2UgICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxUmVzMCwgZFNyYzAsIGRTcmNmICAgICAgICAgOy8vIEFjYz1hK2YKLSAgICAgICAgVkxEMSAgICAgICAgcVNyYzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi5dCi0gICAgICAgIFZNTEEgICAgICAgIGRSZXMwLCBkU3JjQywgZENvZWZmMjAgICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi07ICAgICAgICBWTUxTICAgICAgICBkUmVzMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCi0gICAgICAgIFZNVUwgICAgICAgIGRUbXAwLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKLSAgICAgICAgCi0gICAgICAgIDsvLyBSb3cxCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjMCwgZFNyYzEsICMxICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQotICAgICAgICBWRVhUICAgICAgICBkU3JjYywgZFNyYzAsIGRTcmMxLCAjMgotICAgICAgICBWRVhUICAgICAgICBkU3JjZCwgZFNyYzAsIGRTcmMxLCAjMwotICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyYzAsIGRTcmMxLCAjNAotICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyYzAsIGRTcmMxLCAjNSAgICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KLSAgICAgICAgVkFEREwgICAgICAgcVNyY2MsIGRTcmNjLCBkU3JjZCAgICAgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFTcmNiLCBkU3JjYiwgZFNyY2UgICAgICAgICA7Ly8gYitlICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVJlczEsIGRTcmMwLCBkU3JjZiAgICAgICAgIDsvLyBBY2M9YStmCi0gICAgICAgIFZMRDEgICAgICAgIHFTcmMwMSwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uXQotICAgICAgICAKLSAgICAgICAgVlNVQiAgICAgICAgZFJlczAsIGRSZXMwLCBkVG1wMCA7Ly8gVGVSaQotICAgICAgICAKLSAgICAgICAgVk1MQSAgICAgICAgZFJlczEsIGRTcmNDLCBkQ29lZmYyMCAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLTsgICAgICAgIFZNTFMgICAgICAgIGRSZXMxLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKLSAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQotCi0gICAgICAgIDsvLyBSb3cyCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjMCwgZFNyYzEsICMxICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQotICAgICAgICBWRVhUICAgICAgICBkU3JjYywgZFNyYzAsIGRTcmMxLCAjMgotICAgICAgICBWRVhUICAgICAgICBkU3JjZCwgZFNyYzAsIGRTcmMxLCAjMwotICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyYzAsIGRTcmMxLCAjNAotICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyYzAsIGRTcmMxLCAjNSAgICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KLSAgICAgICAgVkFEREwgICAgICAgcVNyY2MsIGRTcmNjLCBkU3JjZCAgICAgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFTcmNiLCBkU3JjYiwgZFNyY2UgICAgICAgICA7Ly8gYitlICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVJlczIsIGRTcmMwLCBkU3JjZiAgICAgICAgIDsvLyBBY2M9YStmCi0gICAgICAgIFZMRDEgICAgICAgIHFTcmMwMSwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uXQotICAgICAgICAKLSAgICAgICAgVlNVQiAgICAgICAgZFJlczEsIGRSZXMxLCBkVG1wMAotCi0gICAgICAgIFZNTEEgICAgICAgIGRSZXMyLCBkU3JjQywgZENvZWZmMjAgICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi07ICAgICAgICBWTUxTICAgICAgICBkUmVzMiwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCi0gICAgICAgIFZNVUwgICAgICAgIGRUbXAwLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKLQotICAgICAgICA7Ly8gUm93MwotICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyYzAsIGRTcmMxLCAjMSAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2MsIGRTcmMwLCBkU3JjMSwgIzIKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2QsIGRTcmMwLCBkU3JjMSwgIzMKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmMwLCBkU3JjMSwgIzQKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmMwLCBkU3JjMSwgIzUgICAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCi0gICAgICAgIFZBRERMICAgICAgIHFTcmNjLCBkU3JjYywgZFNyY2QgICAgICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxU3JjYiwgZFNyY2IsIGRTcmNlICAgICAgICAgOy8vIGIrZSAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFSZXMzLCBkU3JjMCwgZFNyY2YgICAgICAgICA7Ly8gQWNjPWErZgotICAgICAgICBWTEQxICAgICAgICBxU3JjMDEsIFtwU3JjXSwgc3JjU3RlcCAgICAgOy8vIFthMCBhMSBhMiBhMyAuLl0KLQotICAgICAgICBWU1VCICAgICAgICBkUmVzMiwgZFJlczIsIGRUbXAwCi0KLSAgICAgICAgVk1MQSAgICAgICAgZFJlczMsIGRTcmNDLCBkQ29lZmYyMCAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLTsgICAgICAgIFZNTFMgICAgICAgIGRSZXMzLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKLSAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQotCi0gICAgICAgIDsvLyBSb3c0Ci0gICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjMCwgZFNyYzEsICMxICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQotICAgICAgICBWRVhUICAgICAgICBkU3JjYywgZFNyYzAsIGRTcmMxLCAjMgotICAgICAgICBWRVhUICAgICAgICBkU3JjZCwgZFNyYzAsIGRTcmMxLCAjMwotICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyYzAsIGRTcmMxLCAjNAotICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyYzAsIGRTcmMxLCAjNSAgICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KLSAgICAgICAgVkFEREwgICAgICAgcVNyY2MsIGRTcmNjLCBkU3JjZCAgICAgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFTcmNiLCBkU3JjYiwgZFNyY2UgICAgICAgICA7Ly8gYitlICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVJlczQsIGRTcmMwLCBkU3JjZiAgICAgICAgIDsvLyBBY2M9YStmCi0gICAgICAgIFZMRDEgICAgICAgIHFTcmMwMSwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uXQotCi0gICAgICAgIFZTVUIgICAgICAgIGRSZXMzLCBkUmVzMywgZFRtcDAKLQotICAgICAgICBWTUxBICAgICAgICBkUmVzNCwgZFNyY0MsIGRDb2VmZjIwICAgICAgOy8vIEFjYyArPSAyMCooYytkKQotOyAgICAgICAgVk1MUyAgICAgICAgZFJlczQsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQotICAgICAgICBWTVVMICAgICAgICBkVG1wMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCi0KLSAgICAgICAgOy8vIFJvdzUKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmMwLCBkU3JjMSwgIzEgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNjLCBkU3JjMCwgZFNyYzEsICMyCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNkLCBkU3JjMCwgZFNyYzEsICMzCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjMCwgZFNyYzEsICM0Ci0gICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjMCwgZFNyYzEsICM1ICAgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQotICAgICAgICBWQURETCAgICAgICBxU3JjYywgZFNyY2MsIGRTcmNkICAgICAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVNyY2IsIGRTcmNiLCBkU3JjZSAgICAgICAgIDsvLyBiK2UgICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxUmVzNSwgZFNyYzAsIGRTcmNmICAgICAgICAgOy8vIEFjYz1hK2YKLSAgICAgICAgVkxEMSAgICAgICAgcVNyYzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi5dCi0KLSAgICAgICAgVlNVQiAgICAgICAgZFJlczQsIGRSZXM0LCBkVG1wMAotCi0gICAgICAgIFZNTEEgICAgICAgIGRSZXM1LCBkU3JjQywgZENvZWZmMjAgICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi07ICAgICAgICBWTUxTICAgICAgICBkUmVzNSwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCi0gICAgICAgIFZNVUwgICAgICAgIGRUbXAwLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKLQotICAgICAgICA7Ly8gUm93NgotICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyYzAsIGRTcmMxLCAjMSAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2MsIGRTcmMwLCBkU3JjMSwgIzIKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2QsIGRTcmMwLCBkU3JjMSwgIzMKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmMwLCBkU3JjMSwgIzQKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmMwLCBkU3JjMSwgIzUgICAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCi0gICAgICAgIFZBRERMICAgICAgIHFTcmNjLCBkU3JjYywgZFNyY2QgICAgICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxU3JjYiwgZFNyY2IsIGRTcmNlICAgICAgICAgOy8vIGIrZSAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFSZXM2LCBkU3JjMCwgZFNyY2YgICAgICAgICA7Ly8gQWNjPWErZgotICAgICAgICBWTEQxICAgICAgICBxU3JjMDEsIFtwU3JjXSwgc3JjU3RlcCAgICAgOy8vIFthMCBhMSBhMiBhMyAuLl0KLQotICAgICAgICBWU1VCICAgICAgICBkUmVzNSwgZFJlczUsIGRUbXAwCi0KLSAgICAgICAgVk1MQSAgICAgICAgZFJlczYsIGRTcmNDLCBkQ29lZmYyMCAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLTsgICAgICAgIFZNTFMgICAgICAgIGRSZXM2LCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKLSAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQotCi0gICAgICAgIDsvLyBSb3c3Ci0gICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjMCwgZFNyYzEsICMxICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQotICAgICAgICBWRVhUICAgICAgICBkU3JjYywgZFNyYzAsIGRTcmMxLCAjMgotICAgICAgICBWRVhUICAgICAgICBkU3JjZCwgZFNyYzAsIGRTcmMxLCAjMwotICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyYzAsIGRTcmMxLCAjNAotICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyYzAsIGRTcmMxLCAjNSAgICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KLSAgICAgICAgVkFEREwgICAgICAgcVNyY2MsIGRTcmNjLCBkU3JjZCAgICAgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFTcmNiLCBkU3JjYiwgZFNyY2UgICAgICAgICA7Ly8gYitlICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVJlczcsIGRTcmMwLCBkU3JjZiAgICAgICAgIDsvLyBBY2M9YStmCi0gICAgICAgIFZMRDEgICAgICAgIHFTcmMwMSwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uXQotCi0gICAgICAgIFZTVUIgICAgICAgIGRSZXM2LCBkUmVzNiwgZFRtcDAKLQotICAgICAgICBWTUxBICAgICAgICBkUmVzNywgZFNyY0MsIGRDb2VmZjIwICAgICAgOy8vIEFjYyArPSAyMCooYytkKQotOyAgICAgICAgVk1MUyAgICAgICAgZFJlczcsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQotICAgICAgICBWTVVMICAgICAgICBkVG1wMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCi0KLSAgICAgICAgOy8vIFJvdzgKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmMwLCBkU3JjMSwgIzEgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNjLCBkU3JjMCwgZFNyYzEsICMyCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNkLCBkU3JjMCwgZFNyYzEsICMzCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjMCwgZFNyYzEsICM0Ci0gICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjMCwgZFNyYzEsICM1ICAgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQotICAgICAgICBWQURETCAgICAgICBxU3JjYywgZFNyY2MsIGRTcmNkICAgICAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVNyY2IsIGRTcmNiLCBkU3JjZSAgICAgICAgIDsvLyBiK2UgICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxUmVzOCwgZFNyYzAsIGRTcmNmICAgICAgICAgOy8vIEFjYz1hK2YKLQotICAgICAgICBWU1VCICAgICAgICBkUmVzNywgZFJlczcsIGRUbXAwCi0KLSAgICAgICAgVk1MQSAgICAgICAgZFJlczgsIGRTcmNDLCBkQ29lZmYyMCAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLTsgICAgICAgIFZNTFMgICAgICAgIGRSZXM4LCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKLSAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQotCi0gICAgICAgIFZNT1YgICAgICAgIHFDb2VmZjIwLCAjMjAKLSAgICAgICAgVk1PViAgICAgICAgcUNvZWZmNSwgIzUKLQotICAgICAgICA7Ly8gQ29sMAotICAgICAgICBWQURETCAgICAgICBxQWNjMDEsIGRSZXMwLCBkUmVzNSAgICAgICAgOy8vIEFjYyA9IGErZgotICAgICAgICBWQURETCAgICAgICBxU3VtQ0QsIGRSZXMyLCBkUmVzMyAgICAgICAgOy8vIGMrZAotICAgICAgICBWQURETCAgICAgICBxU3VtQkUsIGRSZXMxLCBkUmVzNCAgICAgICAgOy8vIGIrZQotCi0gICAgICAgIFZTVUIgICAgICAgIGRSZXM4LCBkUmVzOCwgZFRtcDAKLQotICAgICAgICBWTUxBICAgICAgICBxQWNjMDEsIHFTdW1DRCwgcUNvZWZmMjAgICAgOy8vIEFjYyArPSAyMCooYytkKQotOyAgICAgICAgVk1MUyAgICAgICAgcUFjYzAxLCBxU3VtQkUsIHFDb2VmZjUgICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkgICAgICAgIAotICAgICAgICBWTVVMICAgICAgICBxVG1wMCwgcVN1bUJFLCBxQ29lZmY1ICAgICA7Ly8gQWNjIC09IDIwKihiK2UpICAgICAgICAKLQotICAgICAgICA7Ly8gQ29sMQotICAgICAgICBWQURETCAgICAgICBxQWNjMjMsIGRSZXMxLCBkUmVzNiAgICAgICAgOy8vIEFjYyA9IGErZgotICAgICAgICBWQURETCAgICAgICBxU3VtQ0QsIGRSZXMzLCBkUmVzNCAgICAgICAgOy8vIGMrZAotICAgICAgICBWQURETCAgICAgICBxU3VtQkUsIGRSZXMyLCBkUmVzNSAgICAgICAgOy8vIGIrZQotICAgICAgICBWTUxBICAgICAgICBxQWNjMjMsIHFTdW1DRCwgcUNvZWZmMjAgICAgOy8vIEFjYyArPSAyMCooYytkKQotCi0gICAgICAgIFZTVUIgICAgICAgIHFBY2MwMSwgcUFjYzAxLCBxVG1wMAotCi07ICAgICAgICBWTUxTICAgICAgICBxQWNjMjMsIHFTdW1CRSwgcUNvZWZmNSAgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCi0gICAgICAgIFZNVUwgICAgICAgIHFUbXAwLCBxU3VtQkUsIHFDb2VmZjUgICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkgICAgICAgIAotCi0gICAgICAgIDsvLyBDb2wyCi0gICAgICAgIFZBRERMICAgICAgIHFBY2M0NSwgZFJlczIsIGRSZXM3ICAgICAgICA7Ly8gQWNjID0gYStmCi0gICAgICAgIFZBRERMICAgICAgIHFTdW1DRCwgZFJlczQsIGRSZXM1ICAgICAgICA7Ly8gYytkCi0gICAgICAgIFZBRERMICAgICAgIHFTdW1CRSwgZFJlczMsIGRSZXM2ICAgICAgICA7Ly8gYitlCi0gICAgICAgIFZNTEEgICAgICAgIHFBY2M0NSwgcVN1bUNELCBxQ29lZmYyMCAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi0KLSAgICAgICAgVlNVQiAgICAgICAgcUFjYzIzLCBxQWNjMjMsIHFUbXAwCi0KLTsgICAgICAgIFZNTFMgICAgICAgIHFBY2M0NSwgcVN1bUJFLCBxQ29lZmY1ICAgICA7Ly8gQWNjIC09IDIwKihiK2UpICAgICAgICAKLSAgICAgICAgVk1VTCAgICAgICAgcVRtcDAsIHFTdW1CRSwgcUNvZWZmNSAgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gQ29sMwotICAgICAgICBWQURETCAgICAgICBxQWNjNjcsIGRSZXMzLCBkUmVzOCAgICAgICAgOy8vIEFjYyA9IGErZgotICAgICAgICBWQURETCAgICAgICBxU3VtQ0QsIGRSZXM1LCBkUmVzNiAgICAgICAgOy8vIGMrZAotICAgICAgICBWQURETCAgICAgICBxU3VtQkUsIGRSZXM0LCBkUmVzNyAgICAgICAgOy8vIGIrZQotICAgICAgICBWTUxBICAgICAgICBxQWNjNjcsIHFTdW1DRCwgcUNvZWZmMjAgICAgOy8vIEFjYyArPSAyMCooYytkKQotCi0gICAgICAgIFZTVUIgICAgICAgIHFBY2M0NSwgcUFjYzQ1LCBxVG1wMAotCi0gICAgICAgIFZNTFMgICAgICAgIHFBY2M2NywgcVN1bUJFLCBxQ29lZmY1ICAgICA7Ly8gQWNjIC09IDIwKihiK2UpICAgICAgICAKLQotICAgICAgICBWUVJTSFJVTiAgICBkVGVtcEFjYzAsIHFBY2MwMSwgIzEwCi0gICAgICAgIFZRUlNIUlVOICAgIGRUZW1wQWNjMSwgcUFjYzIzLCAjMTAKLSAgICAgICAgVlFSU0hSVU4gICAgZFRlbXBBY2MyLCBxQWNjNDUsICMxMAotICAgICAgICBWUVJTSFJVTiAgICBkVGVtcEFjYzMsIHFBY2M2NywgIzEwCi0gICAgICAgIAotICAgICAgICBWUU1PVk4gICAgICBkQWNjMCwgcVRBY2MwCi0gICAgICAgIFZRTU9WTiAgICAgIGRBY2MxLCBxVEFjYzEKLSAgICAgICAgVlFNT1ZOICAgICAgZEFjYzIsIHFUQWNjMgotICAgICAgICBWUU1PVk4gICAgICBkQWNjMywgcVRBY2MzCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIE1fRU5ECi0gICAgCi0gICAgRU5ESUYKLQotCi0gICAgCi0gICAgRU5ECi0gICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYzk1MzQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLQotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCi0KLSAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotCi0gICAgSUYgQ29ydGV4QTgKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUsIHIxMQotCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLXBTcmMgICAgICAgICAgICBSTiAwCi1zcmNTdGVwICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgIFJOIDIKLWRzdFN0ZXAgICAgICAgICBSTiAzCi0KLTsvLyBEZWNsYXJlIE5lb24gcmVnaXN0ZXJzCi1kVENvZWZmNSAgICAgICAgRE4gMzAuVTgKLWRUQ29lZmYyMCAgICAgICBETiAzMS5VOAotZENvZWZmNSAgICAgICAgIEROIDMwLlMxNgotZENvZWZmMjAgICAgICAgIEROIDMxLlMxNgotCi1xU3JjQTAxICAgICAgICAgUU4gMC5VOAotcVNyY0IyMyAgICAgICAgIFFOIDEuVTgKLXFTcmNDNDUgICAgICAgICBRTiAyLlU4Ci1xU3JjRDY3ICAgICAgICAgUU4gMy5VOAotcVNyY0U4OSAgICAgICAgIFFOIDQuVTgKLXFTcmNGMTAxMSAgICAgICBRTiA1LlU4Ci1xU3JjRzEyMTMgICAgICAgUU4gNi5VOAotcVNyY0gxNDE1ICAgICAgIFFOIDcuVTgKLXFTcmNJMTYxNyAgICAgICBRTiA4LlU4Ci0KLWRTcmNBMCAgICAgICAgICBETiAwLlU4Ci1kU3JjQjIgICAgICAgICAgRE4gMi5VOAotZFNyY0M0ICAgICAgICAgIEROIDQuVTgKLWRTcmNENiAgICAgICAgICBETiA2LlU4Ci1kU3JjRTggICAgICAgICAgRE4gOC5VOAotZFNyY0YxMCAgICAgICAgIEROIDEwLlU4Ci1kU3JjRzEyICAgICAgICAgRE4gMTIuVTgKLWRTcmNIMTQgICAgICAgICBETiAxNC5VOAotZFNyY0kxNiAgICAgICAgIEROIDE2LlU4Ci0KLWRTcmNBMSAgICAgICAgICBETiAxLlU4Ci1kU3JjQjMgICAgICAgICAgRE4gMy5VOAotZFNyY0M1ICAgICAgICAgIEROIDUuVTgKLWRTcmNENyAgICAgICAgICBETiA3LlU4Ci1kU3JjRTkgICAgICAgICAgRE4gOS5VOAotZFNyY0YxMSAgICAgICAgIEROIDExLlU4Ci1kU3JjRzEzICAgICAgICAgRE4gMTMuVTgKLWRTcmNIMTUgICAgICAgICBETiAxNS5VOAotZFNyY0kxNyAgICAgICAgIEROIDE3LlU4Ci0KLXFUZW1wUDAxICAgICAgICBRTiA5LlMxNgotcVRlbXBRMDEgICAgICAgIFFOIDEwLlMxNgotcVRlbXBSMDEgICAgICAgIFFOIDExLlMxNgotcVRlbXBTMDEgICAgICAgIFFOIDEyLlMxNgotCi1xVGVtcFAyMyAgICAgICAgUU4gMC5TMTYKLXFUZW1wUTIzICAgICAgICBRTiAxLlMxNgotcVRlbXBSMjMgICAgICAgIFFOIDIuUzE2Ci1xVGVtcFMyMyAgICAgICAgUU4gMy5TMTYKLQotZFRlbXBQMCAgICAgICAgIEROIDE4LlMxNgotZFRlbXBQMSAgICAgICAgIEROIDE5LlMxNgotZFRlbXBQMiAgICAgICAgIEROIDAuUzE2Ci0KLWRUZW1wUTAgICAgICAgICBETiAyMC5TMTYKLWRUZW1wUTEgICAgICAgICBETiAyMS5TMTYKLWRUZW1wUTIgICAgICAgICBETiAyLlMxNgotCi1kVGVtcFIwICAgICAgICAgRE4gMjIuUzE2Ci1kVGVtcFIxICAgICAgICAgRE4gMjMuUzE2Ci1kVGVtcFIyICAgICAgICAgRE4gNC5TMTYKLQotZFRlbXBTMCAgICAgICAgIEROIDI0LlMxNgotZFRlbXBTMSAgICAgICAgIEROIDI1LlMxNgotZFRlbXBTMiAgICAgICAgIEROIDYuUzE2Ci0gCi1kVGVtcEIwICAgICAgICAgRE4gMjYuUzE2Ci1kVGVtcEMwICAgICAgICAgRE4gMjcuUzE2Ci1kVGVtcEQwICAgICAgICAgRE4gMjguUzE2Ci1kVGVtcEYwICAgICAgICAgRE4gMjkuUzE2Ci0KLWRUZW1wQWNjMCAgICAgICBETiAwLlUxNgotZFRlbXBBY2MxICAgICAgIEROIDIuVTE2Ci1kVGVtcEFjYzIgICAgICAgRE4gNC5VMTYKLWRUZW1wQWNjMyAgICAgICBETiA2LlUxNgotCi1kQWNjMCAgICAgICAgICAgRE4gMC5VOAotZEFjYzEgICAgICAgICAgIEROIDIuVTgKLWRBY2MyICAgICAgICAgICBETiA0LlU4Ci1kQWNjMyAgICAgICAgICAgRE4gNi5VOAotCi1xQWNjMCAgICAgICAgICAgUU4gMC5TMzIKLXFBY2MxICAgICAgICAgICBRTiAxLlMzMgotcUFjYzIgICAgICAgICAgIFFOIDIuUzMyCi1xQWNjMyAgICAgICAgICAgUU4gMy5TMzIKLQotcVRBY2MwICAgICAgICAgIFFOIDAuVTE2Ci1xVEFjYzEgICAgICAgICAgUU4gMS5VMTYKLXFUQWNjMiAgICAgICAgICBRTiAyLlUxNgotcVRBY2MzICAgICAgICAgIFFOIDMuVTE2ICAgICAgICAgICAgICAgIAotCi1xVG1wICAgICAgICAgICAgUU4gNC5TMTYKLWRUbXAgICAgICAgICAgICBETiA4LlMxNgotCi0gICAgICAgIFZMRDEgICAgICAgIHFTcmNBMDEsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgOy8vIFthMCBhMSBhMiBhMyAuLiBhMTVdICAgCi0gICAgICAgIEFERCAgICAgICAgIHIxMiwgcFNyYywgc3JjU3RlcCwgTFNMICMyCi0gICAgICAgIFZNT1YgICAgICAgIGRUQ29lZmY1LCAjNQotICAgICAgICBWTU9WICAgICAgICBkVENvZWZmMjAsICMyMAotICAgICAgICBWTEQxICAgICAgICBxU3JjRjEwMTEsIFtyMTJdLCBzcmNTdGVwCi0gICAgICAgIFZMRDEgICAgICAgIHFTcmNCMjMsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLiBiMTVdCi0gICAgICAgIAotICAgICAgICBWTEQxICAgICAgICBxU3JjRzEyMTMsIFtyMTJdLCBzcmNTdGVwCi0gICAgICAgIFZBRERMICAgICAgIHFUZW1wUDAxLCBkU3JjQTAsIGRTcmNGMTAgICAgICAgICAgIAotICAgICAgICBWTEQxICAgICAgICBxU3JjQzQ1LCBbcFNyY10sIHNyY1N0ZXAgICAgICAgICAgICAgICAgIDsvLyBbYzAgYzEgYzIgYzMgLi4gYzE1XQotICAgICAgICBWQURETCAgICAgICBxVGVtcFAyMywgZFNyY0ExLCBkU3JjRjExICAgCi0gICAgICAgIFZMRDEgICAgICAgIHFTcmNENjcsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBWQURETCAgICAgICBxVGVtcFEwMSwgZFNyY0IyLCBkU3JjRzEyICAgICAgICAgICAgICAgICAgIAotICAgICAgICBWTEQxICAgICAgICBxU3JjRTg5LCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgCi0gICAgICAgIDsvL3QwCi0gICAgICAgIFZNTEFMICAgICAgIHFUZW1wUDAxLCBkU3JjQzQsIGRUQ29lZmYyMAotICAgICAgICAKLSAgICAgICAgVkxEMSAgICAgICAgcVNyY0gxNDE1LCBbcjEyXSwgc3JjU3RlcAotCi0gICAgICAgIFZNTEFMICAgICAgIHFUZW1wUDIzLCBkU3JjQzUsIGRUQ29lZmYyMAotICAgICAgICAKLSAgICAgICAgVkxEMSAgICAgICAgcVNyY0kxNjE3LCBbcjEyXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgOy8vIFtpMCBpMSBpMiBpMyAuLiBdCi0gICAgICAgIAotICAgICAgICBWTUxBTCAgICAgICBxVGVtcFAwMSwgZFNyY0Q2LCBkVENvZWZmMjAKLSAgICAgICAgVk1MQUwgICAgICAgcVRlbXBRMDEsIGRTcmNENiwgZFRDb2VmZjIwCi0gICAgICAgIFZNTFNMICAgICAgIHFUZW1wUDIzLCBkU3JjQjMsIGRUQ29lZmY1Ci0gICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxVGVtcFIwMSwgZFNyY0M0LCBkU3JjSDE0ICAgCi0gICAgICAgIAotICAgICAgICBWTUxTTCAgICAgICBxVGVtcFAwMSwgZFNyY0IyLCBkVENvZWZmNQotCi0gICAgICAgIFZBRERMICAgICAgIHFUZW1wUTIzLCBkU3JjQjMsIGRTcmNHMTMgICAKLQotICAgICAgICBWTUxBTCAgICAgICBxVGVtcFAyMywgZFNyY0Q3LCBkVENvZWZmMjAKLSAgICAgICAgVk1MQUwgICAgICAgcVRlbXBRMDEsIGRTcmNFOCwgZFRDb2VmZjIwCi0KLSAgICAgICAgVk1MU0wgICAgICAgcVRlbXBQMDEsIGRTcmNFOCwgZFRDb2VmZjUKLSAgICAgICAgVk1MQUwgICAgICAgcVRlbXBRMjMsIGRTcmNENywgZFRDb2VmZjIwCi0KLSAgICAgICAgVk1MU0wgICAgICAgcVRlbXBQMjMsIGRTcmNFOSwgZFRDb2VmZjUKLQotICAgICAgICA7Ly90MQotCi0gICAgICAgIFZNTEFMICAgICAgIHFUZW1wUjAxLCBkU3JjRTgsIGRUQ29lZmYyMAotICAgICAgICBWTUxTTCAgICAgICBxVGVtcFEwMSwgZFNyY0M0LCBkVENvZWZmNQotICAgICAgICBWTUxTTCAgICAgICBxVGVtcFEyMywgZFNyY0M1LCBkVENvZWZmNQotICAgICAgICBWQURETCAgICAgICBxVGVtcFIyMywgZFNyY0M1LCBkU3JjSDE1ICAgCi0KLSAgICAgICAgVk1MQUwgICAgICAgcVRlbXBSMDEsIGRTcmNGMTAsIGRUQ29lZmYyMAotICAgICAgICBWTUxTTCAgICAgICBxVGVtcFEwMSwgZFNyY0YxMCwgZFRDb2VmZjUKLSAgICAgICAgVk1MQUwgICAgICAgcVRlbXBRMjMsIGRTcmNFOSwgZFRDb2VmZjIwCi0gICAgICAgIFZNTEFMICAgICAgIHFUZW1wUjIzLCBkU3JjRTksIGRUQ29lZmYyMAotICAgICAgICBWQURETCAgICAgICBxVGVtcFMwMSwgZFNyY0Q2LCBkU3JjSTE2ICAgCi0KLQotICAgICAgICBWTUxTTCAgICAgICBxVGVtcFIwMSwgZFNyY0Q2LCBkVENvZWZmNQotICAgICAgICBWTUxTTCAgICAgICBxVGVtcFEyMywgZFNyY0YxMSwgZFRDb2VmZjUKLSAgICAgICAgVk1MU0wgICAgICAgcVRlbXBSMjMsIGRTcmNENywgZFRDb2VmZjUKLQotICAgICAgICA7Ly90MgotICAgICAgICBWQURETCAgICAgICBxVGVtcFMyMywgZFNyY0Q3LCBkU3JjSTE3ICAgCi0gICAgICAgIFZNTEFMICAgICAgIHFUZW1wUzAxLCBkU3JjRjEwLCBkVENvZWZmMjAKLSAgICAgICAgVk1MU0wgICAgICAgcVRlbXBSMDEsIGRTcmNHMTIsIGRUQ29lZmY1Ci0gICAgICAgIFZNTFNMICAgICAgIHFUZW1wUjIzLCBkU3JjRzEzLCBkVENvZWZmNQotCi0gICAgICAgIFZNTEFMICAgICAgIHFUZW1wUzIzLCBkU3JjRjExLCBkVENvZWZmMjAKLSAgICAgICAgVk1MQUwgICAgICAgcVRlbXBTMDEsIGRTcmNHMTIsIGRUQ29lZmYyMAotICAgICAgICBWRVhUICAgICAgICBkVGVtcEIwLCBkVGVtcFAwLCBkVGVtcFAxLCAjMQotICAgICAgICBWTUxBTCAgICAgICBxVGVtcFIyMywgZFNyY0YxMSwgZFRDb2VmZjIwCi0KLQotICAgICAgICA7Ly90MwotICAgICAgICBWTUxBTCAgICAgICBxVGVtcFMyMywgZFNyY0cxMywgZFRDb2VmZjIwCi0gICAgICAgIFZNTFNMICAgICAgIHFUZW1wUzAxLCBkU3JjRTgsIGRUQ29lZmY1Ci0gICAgICAgIFZFWFQgICAgICAgIGRUZW1wQzAsIGRUZW1wUDAsIGRUZW1wUDEsICMyCi0gICAgICAgIFZNT1YgICAgICAgIGRDb2VmZjIwLCAjMjAKLSAgICAgICAgVk1MU0wgICAgICAgcVRlbXBTMjMsIGRTcmNFOSwgZFRDb2VmZjUKLSAgICAgICAgVk1MU0wgICAgICAgcVRlbXBTMDEsIGRTcmNIMTQsIGRUQ29lZmY1Ci0gICAgICAgIFZFWFQgICAgICAgIGRUZW1wRjAsIGRUZW1wUDEsIGRUZW1wUDIsICMxCi0gICAgICAgIFZFWFQgICAgICAgIGRUZW1wRDAsIGRUZW1wUDAsIGRUZW1wUDEsICMzCi0gICAgICAgIFZNTFNMICAgICAgIHFUZW1wUzIzLCBkU3JjSDE1LCBkVENvZWZmNQotICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcUFjYzAsIGRUZW1wUDAsIGRUZW1wRjAKLSAgICAgICAgVkFERCAgICAgICAgZFRlbXBDMCwgZFRlbXBDMCwgZFRlbXBEMAotICAgICAgICA7Ly9oIAotICAgICAgICBWTU9WICAgICAgICBkQ29lZmY1LCAjNQotICAgICAgICAKLSAgICAgICAgOy8vIHJlczAKLSAgICAgICAgVkFERCAgICAgICAgZFRlbXBCMCwgZFRlbXBCMCwgZFRlbXBQMQotICAgICAgICBWTUxBTCAgICAgICBxQWNjMCwgZFRlbXBDMCwgZENvZWZmMjAKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBDMCwgZFRlbXBRMCwgZFRlbXBRMSwgIzIKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBEMCwgZFRlbXBRMCwgZFRlbXBRMSwgIzMKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBGMCwgZFRlbXBRMSwgZFRlbXBRMiwgIzEKLSAgICAgICAgVk1MU0wgICAgICAgcUFjYzAsIGRUZW1wQjAsIGRDb2VmZjUKLQotICAgICAgICA7Ly8gcmVzMQotICAgICAgICBWRVhUICAgICAgICBkVGVtcEIwLCBkVGVtcFEwLCBkVGVtcFExLCAjMQotICAgICAgICBWQURETCAgICAgICBxQWNjMSwgZFRlbXBRMCwgZFRlbXBGMAotICAgICAgICBWQUREICAgICAgICBkVGVtcEMwLCBkVGVtcEMwLCBkVGVtcEQwCi0gICAgICAgIFZBREQgICAgICAgIGRUZW1wQjAsIGRUZW1wQjAsIGRUZW1wUTEKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBEMCwgZFRlbXBSMCwgZFRlbXBSMSwgIzMKLSAgICAgICAgVk1MQUwgICAgICAgcUFjYzEsIGRUZW1wQzAsIGRDb2VmZjIwCi0gICAgICAgIFZFWFQgICAgICAgIGRUZW1wRjAsIGRUZW1wUjEsIGRUZW1wUjIsICMxCi0gICAgICAgIFZFWFQgICAgICAgIGRUZW1wQzAsIGRUZW1wUjAsIGRUZW1wUjEsICMyCi0gICAgICAgIFZFWFQgICAgICAgIGRUbXAsIGRUZW1wUjAsIGRUZW1wUjEsICMxCi0gICAgICAgIFZBRERMICAgICAgIHFBY2MyLCBkVGVtcFIwLCBkVGVtcEYwCi0gICAgICAgIFZNTFNMICAgICAgIHFBY2MxLCBkVGVtcEIwLCBkQ29lZmY1Ci07ICAgICAgICBWRVhUICAgICAgICBkVGVtcEIwLCBkVGVtcFIwLCBkVGVtcFIxLCAjMQotICAgICAgICBWQUREICAgICAgICBkVGVtcEMwLCBkVGVtcEMwLCBkVGVtcEQwCi0gICAgICAgIAotICAgICAgICA7Ly8gcmVzMgotICAgICAgICBWQUREICAgICAgICBkVGVtcEIwLCBkVG1wLCBkVGVtcFIxCi0gICAgICAgIFZFWFQgICAgICAgIGRUZW1wRDAsIGRUZW1wUzAsIGRUZW1wUzEsICMzCi0gICAgICAgIFZNTEFMICAgICAgIHFBY2MyLCBkVGVtcEMwLCBkQ29lZmYyMAotOyAgICAgICAgVkFERCAgICAgICAgZFRlbXBCMCwgZFRlbXBCMCwgZFRlbXBSMQotICAgICAgICAKLSAgICAgICAgOy8vIHJlczMKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBDMCwgZFRlbXBTMCwgZFRlbXBTMSwgIzIKLSAgICAgICAgVkVYVCAgICAgICAgZFRlbXBGMCwgZFRlbXBTMSwgZFRlbXBTMiwgIzEKLSAgICAgICAgVkFERCAgICAgICAgZFRlbXBDMCwgZFRlbXBDMCwgZFRlbXBEMAotICAgICAgICBWRVhUICAgICAgICBkVG1wLCBkVGVtcFMwLCBkVGVtcFMxLCAjMQotICAgICAgICBWQURETCAgICAgICBxQWNjMywgZFRlbXBTMCwgZFRlbXBGMAotICAgICAgICBWTUxTTCAgICAgICBxQWNjMiwgZFRlbXBCMCwgZENvZWZmNQotICAgICAgICBWTUxBTCAgICAgICBxQWNjMywgZFRlbXBDMCwgZENvZWZmMjAKLSAgICAgICAgVkFERCAgICAgICAgZFRtcCwgZFRtcCwgZFRlbXBTMQotICAgICAgICBWTUxTTCAgICAgICBxQWNjMywgZFRtcCwgZENvZWZmNQotICAgICAgICAgICAgICAgIAotICAgICAgICBWUVJTSFJVTiAgICBkVGVtcEFjYzAsIHFBY2MwLCAjMTAKLSAgICAgICAgVlFSU0hSVU4gICAgZFRlbXBBY2MxLCBxQWNjMSwgIzEwCi0gICAgICAgIFZRUlNIUlVOICAgIGRUZW1wQWNjMiwgcUFjYzIsICMxMAotICAgICAgICBWUVJTSFJVTiAgICBkVGVtcEFjYzMsIHFBY2MzLCAjMTAKLQotICAgICAgICBWUU1PVk4gICAgICBkQWNjMCwgcVRBY2MwCi0gICAgICAgIFZRTU9WTiAgICAgIGRBY2MxLCBxVEFjYzEKLSAgICAgICAgVlFNT1ZOICAgICAgZEFjYzIsIHFUQWNjMgotICAgICAgICBWUU1PVk4gICAgICBkQWNjMywgcVRBY2MzCi0gICAgICAgIAotICAgICAgICBNX0VORAotICAgIAotICAgIEVORElGCi0gICAgCi0gICAgCi0gICAgCi0KLSAgICAKLSAgICBFTkQKLSAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMWMzNDUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0KLSAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotICAgICAgICAKLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCi0KLURFQlVHX09OICAgIFNFVEwge0ZBTFNFfQotCi0gICAgSUYgQ29ydGV4QTgKLSAgICAgICAgCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUsIHIxMQotCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLXBTcmMgICAgICAgICAgICBSTiAwCi1zcmNTdGVwICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgIFJOIDIKLWRzdFN0ZXAgICAgICAgICBSTiAzCi0KLTsvLyBEZWNsYXJlIE5lb24gcmVnaXN0ZXJzCi1kQ29lZmY1ICAgICAgICAgRE4gMzAuUzE2Ci1kQ29lZmYyMCAgICAgICAgRE4gMzEuUzE2Ci0KLXFTcmNBMDEgICAgICAgICBRTiAxMS5VOAotcVNyY0IwMSAgICAgICAgIFFOIDEyLlU4Ci1xU3JjQzAxICAgICAgICAgUU4gMTMuVTgKLXFTcmNEMDEgICAgICAgICBRTiAxNC5VOAotCi1kU3JjQTAgICAgICAgICAgRE4gMjIuVTgKLWRTcmNBMSAgICAgICAgICBETiAyMy5VOAotZFNyY0IwICAgICAgICAgIEROIDI0LlU4Ci1kU3JjQjEgICAgICAgICAgRE4gMjUuVTgKLWRTcmNDMCAgICAgICAgICBETiAyNi5VOAotZFNyY0MxICAgICAgICAgIEROIDI3LlU4Ci1kU3JjRDAgICAgICAgICAgRE4gMjguVTgKLWRTcmNEMSAgICAgICAgICBETiAyOS5VOAotCi1kU3JjYiAgICAgICAgICAgRE4gMTIuVTgKLWRTcmNlICAgICAgICAgICBETiAxMy5VOAotZFNyY2YgICAgICAgICAgIEROIDEwLlU4Ci0KLWRTcmMwYyAgICAgICAgICBETiAxNC5VOAotZFNyYzFjICAgICAgICAgIEROIDE2LlU4Ci1kU3JjMmMgICAgICAgICAgRE4gMTguVTgKLWRTcmMzYyAgICAgICAgICBETiAyMC5VOAotICAgICAgICAgICAgICAgICAgIAotZFNyYzBkICAgICAgICAgIEROIDE1LlU4Ci1kU3JjMWQgICAgICAgICAgRE4gMTcuVTgKLWRTcmMyZCAgICAgICAgICBETiAxOS5VOAotZFNyYzNkICAgICAgICAgIEROIDIxLlU4Ci0KLXFUZW1wMDEgICAgICAgICBRTiA0LlMxNgotcVRlbXAyMyAgICAgICAgIFFOIDYuUzE2Ci1kVGVtcDAgICAgICAgICAgRE4gOC5TMTYKLWRUZW1wMiAgICAgICAgICBETiAxMi5TMTYKLQotcVJlczAxICAgICAgICAgIFFOIDExLlMxNgotcVJlczIzICAgICAgICAgIFFOIDEyLlMxNgotcVJlczQ1ICAgICAgICAgIFFOIDEzLlMxNgotcVJlczY3ICAgICAgICAgIFFOIDE0LlMxNgotCi1kUmVzMCAgICAgICAgICAgRE4gMjIuUzE2Ci1kUmVzMiAgICAgICAgICAgRE4gMjQuUzE2Ci1kUmVzNCAgICAgICAgICAgRE4gMjYuUzE2Ci1kUmVzNiAgICAgICAgICAgRE4gMjguUzE2Ci0KLWRBY2MwICAgICAgICAgICBETiAyMi5VOAotZEFjYzIgICAgICAgICAgIEROIDI0LlU4Ci1kQWNjNCAgICAgICAgICAgRE4gMjYuVTgKLWRBY2M2ICAgICAgICAgICBETiAyOC5VOAotCi1kUmVzdWx0MCAgICAgICAgRE4gMjIuVTMyCi1kUmVzdWx0MiAgICAgICAgRE4gMjQuVTMyCi1kUmVzdWx0NCAgICAgICAgRE4gMjYuVTMyCi1kUmVzdWx0NiAgICAgICAgRE4gMjguVTMyCi0KLSAgICAgICAgVkxEMSAgICAgICAgcVNyY0EwMSwgW3BTcmNdLCBzcmNTdGVwICAgIDsvLyBMb2FkIEEgcmVnaXN0ZXIgW2EwIGExIGEyIGEzIC4uXQotICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjQTAsIGRTcmNBMSwgIzUgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQotICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyY0EwLCBkU3JjQTEsICMxICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KLTsgICAgICAgIFZMRDEgICAgICAgIHFTcmNCMDEsIFtwU3JjXSwgc3JjU3RlcCAgICA7Ly8gTG9hZCBCIHJlZ2lzdGVyIFthMCBhMSBhMiBhMyAuLl0KLSAgICAgICAgVkVYVCAgICAgICAgZFNyYzBjLCBkU3JjQTAsIGRTcmNBMSwgIzIKLSAgICAgICAgVkVYVCAgICAgICAgZFNyYzBkLCBkU3JjQTAsIGRTcmNBMSwgIzMKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmNBMCwgZFNyY0ExLCAjNAotICAgICAgICBWQURETCAgICAgICBxUmVzMDEsIGRTcmNBMCwgZFNyY2YgICAgICAgOy8vIEFjYz1hK2YKLSAgICAgICAgVkFEREwgICAgICAgcVRlbXAwMSwgZFNyYzBjLCBkU3JjMGQgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFUZW1wMjMsIGRTcmNiLCBkU3JjZSAgICAgICA7Ly8gYitlCi0gICAgICAgIAotICAgICAgICBWTEQxICAgICAgICBxU3JjQjAxLCBbcFNyY10sIHNyY1N0ZXAgICAgOy8vIExvYWQgQiByZWdpc3RlciBbYTAgYTEgYTIgYTMgLi5dCi07ICAgICAgICBWTEQxICAgICAgICBxU3JjQzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgOy8vIExvYWQgQyByZWdpc3RlciBbYTAgYTEgYTIgYTMgLi5dICAgICAgICAgICAKLSAgICAgICAgVk1MQSAgICAgICAgZFJlczAsIGRUZW1wMCwgZENvZWZmMjAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLTsgICAgICAgIFZNTFMgICAgICAgIGRSZXMwLCBkVGVtcDIsIGRDb2VmZjUgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKLSAgICAgICAgVk1VTCAgICAgICAgZFRlbXAwLCBkVGVtcDIsIGRDb2VmZjUgOy8vIFRlUmkKLSAgICAgICAgCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjQjAsIGRTcmNCMSwgIzUgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQotICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyY0IwLCBkU3JjQjEsICMxICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KLSAgICAgICAgVkVYVCAgICAgICAgZFNyYzFjLCBkU3JjQjAsIGRTcmNCMSwgIzIKLSAgICAgICAgVkVYVCAgICAgICAgZFNyYzFkLCBkU3JjQjAsIGRTcmNCMSwgIzMKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmNCMCwgZFNyY0IxLCAjNAotICAgICAgICBWQURETCAgICAgICBxUmVzMjMsIGRTcmNCMCwgZFNyY2YgICAgICAgOy8vIEFjYz1hK2YKLQotICAgICAgICBWU1VCICAgICAgICBkUmVzMCwgZFJlczAsIGRUZW1wMCAgICA7Ly8gVGVSaQotCi0gICAgICAgIFZBRERMICAgICAgIHFUZW1wMDEsIGRTcmMxYywgZFNyYzFkICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxVGVtcDIzLCBkU3JjYiwgZFNyY2UgICAgICAgOy8vIGIrZQotICAgICAgICAKLSAgICAgICAgVkxEMSAgICAgICAgcVNyY0MwMSwgW3BTcmNdLCBzcmNTdGVwICAgIDsvLyBMb2FkIEMgcmVnaXN0ZXIgW2EwIGExIGEyIGEzIC4uXSAgICAgICAgICAgCi07ICAgICAgICBWTEQxICAgICAgICBxU3JjRDAxLCBbcFNyY10sIHNyY1N0ZXAgICAgOy8vIExvYWQgRCByZWdpc3RlciBbYTAgYTEgYTIgYTMgLi5dICAKLSAgICAgICAgCi0gICAgICAgIFZNTEEgICAgICAgIGRSZXMyLCBkVGVtcDAsIGRDb2VmZjIwICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi07ICAgICAgICBWTUxTICAgICAgICBkUmVzMiwgZFRlbXAyLCBkQ29lZmY1ICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCi0gICAgICAgIFZNVUwgICAgICAgIGRUZW1wMCwgZFRlbXAyLCBkQ29lZmY1IDsvLyBUZVJpCi0KLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmNDMCwgZFNyY0MxLCAjNSAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjQzAsIGRTcmNDMSwgIzEgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQotICAgICAgICBWRVhUICAgICAgICBkU3JjMmMsIGRTcmNDMCwgZFNyY0MxLCAjMgotICAgICAgICBWRVhUICAgICAgICBkU3JjMmQsIGRTcmNDMCwgZFNyY0MxLCAjMwotICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyY0MwLCBkU3JjQzEsICM0Ci0gICAgICAgIFZBRERMICAgICAgIHFSZXM0NSwgZFNyY0MwLCBkU3JjZiAgICAgICA7Ly8gQWNjPWErZgotICAgICAgICAKLSAgICAgICAgVlNVQiAgICAgICAgZFJlczIsIGRSZXMyLCBkVGVtcDAgIDsvLyBUZVJpCi0gICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxVGVtcDAxLCBkU3JjMmMsIGRTcmMyZCAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKLSAgICAgICAgVkFEREwgICAgICAgcVRlbXAyMywgZFNyY2IsIGRTcmNlICAgICAgIDsvLyBiK2UKLQotICAgICAgICBWTEQxICAgICAgICBxU3JjRDAxLCBbcFNyY10sIHNyY1N0ZXAgICAgOy8vIExvYWQgRCByZWdpc3RlciBbYTAgYTEgYTIgYTMgLi5dICAKLQotICAgICAgICBWTUxBICAgICAgICBkUmVzNCwgZFRlbXAwLCBkQ29lZmYyMCAgICAgOy8vIEFjYyArPSAyMCooYytkKQotOyAgICAgICAgVk1MUyAgICAgICAgZFJlczQsIGRUZW1wMiwgZENvZWZmNSAgICAgIDsvLyBBY2MgLT0gNSooYitlKQotICAgICAgICBWTVVMICAgICAgICBkVGVtcDAsIGRUZW1wMiwgZENvZWZmNSAgICAgIDsvLyBBY2MgLT0gNSooYitlKSBUZVJpCi0gICAgICAgIAotCi0gICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjRDAsIGRTcmNEMSwgIzUgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQotICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyY0QwLCBkU3JjRDEsICMxICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KLSAgICAgICAgVkVYVCAgICAgICAgZFNyYzNjLCBkU3JjRDAsIGRTcmNEMSwgIzIKLSAgICAgICAgVkVYVCAgICAgICAgZFNyYzNkLCBkU3JjRDAsIGRTcmNEMSwgIzMKLSAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmNEMCwgZFNyY0QxLCAjNAotICAgICAgICBWQURETCAgICAgICBxUmVzNjcsIGRTcmNEMCwgZFNyY2YgICAgICAgOy8vIEFjYz1hK2YKLQotICAgICAgICBWU1VCICAgICAgICBkUmVzNCwgZFJlczQsIGRUZW1wMCA7Ly8gVGVSaQotCi0gICAgICAgIFZBRERMICAgICAgIHFUZW1wMDEsIGRTcmMzYywgZFNyYzNkICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAotICAgICAgICBWQURETCAgICAgICBxVGVtcDIzLCBkU3JjYiwgZFNyY2UgICAgICAgOy8vIGIrZQotICAgICAgICBWTUxBICAgICAgICBkUmVzNiwgZFRlbXAwLCBkQ29lZmYyMCAgICAgOy8vIEFjYyArPSAyMCooYytkKQotICAgICAgICBWTUxTICAgICAgICBkUmVzNiwgZFRlbXAyLCBkQ29lZmY1ICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCi0KLSAgICAgICAgVlFSU0hSVU4gICAgZEFjYzAsIHFSZXMwMSwgIzUgICAgICAgICAgIDsvLyBBY2MgPSBTYXQgKChBY2MgKyAxNikgLyAzMikKLSAgICAgICAgVlFSU0hSVU4gICAgZEFjYzIsIHFSZXMyMywgIzUgICAgICAgICAgIDsvLyBBY2MgPSBTYXQgKChBY2MgKyAxNikgLyAzMikKLSAgICAgICAgVlFSU0hSVU4gICAgZEFjYzQsIHFSZXM0NSwgIzUgICAgICAgICAgIDsvLyBBY2MgPSBTYXQgKChBY2MgKyAxNikgLyAzMikKLSAgICAgICAgVlFSU0hSVU4gICAgZEFjYzYsIHFSZXM2NywgIzUgICAgICAgICAgIDsvLyBBY2MgPSBTYXQgKChBY2MgKyAxNikgLyAzMikKLSAgICAgICAgCi0gICAgICAgIE1fRU5ECi0gICAgCi0gICAgRU5ESUYKLQotCi0gICAgRU5ECi0gICAgCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MTRkNDcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLSAgICAgICAKLSAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCi0KLSAgICBJRiBDb3J0ZXhBOAotICAgICAgICAKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZSwgcjExCi0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotcFNyYyAgICAgICAgICAgIFJOIDAKLXNyY1N0ZXAgICAgICAgICBSTiAxCi1wRHN0ICAgICAgICAgICAgUk4gMgotZHN0U3RlcCAgICAgICAgIFJOIDMKLQotVGVtcCAgICAgICAgICAgIFJOIDEyCi0KLTsvLyBEZWNsYXJlIE5lb24gcmVnaXN0ZXJzCi1kQ29lZmY1ICAgICAgICAgRE4gMzAuUzE2Ci1kQ29lZmYyMCAgICAgICAgRE4gMzEuUzE2Ci0KLWRTcmMwICAgICAgICAgICBETiA3LlU4Ci1kU3JjMSAgICAgICAgICAgRE4gOC5VOAotZFNyYzIgICAgICAgICAgIEROIDkuVTgKLWRTcmMzICAgICAgICAgICBETiAxMC5VOAotZFNyYzQgICAgICAgICAgIEROIDExLlU4Ci1kU3JjNSAgICAgICAgICAgRE4gMTIuVTgKLWRTcmM2ICAgICAgICAgICBETiAxMy5VOAotZFNyYzcgICAgICAgICAgIEROIDE0LlU4Ci1kU3JjOCAgICAgICAgICAgRE4gMTUuVTgKLQotcVN1bUJFMDEgICAgICAgIFFOIDguUzE2Ci1xU3VtQ0QwMSAgICAgICAgUU4gOS5TMTYKLWRTdW1CRTAgICAgICAgICBETiAxNi5TMTYKLWRTdW1DRDAgICAgICAgICBETiAxOC5TMTYKLQotcUFjYzAxICAgICAgICAgIFFOIDAuUzE2Ci1xQWNjMjMgICAgICAgICAgUU4gMS5TMTYKLXFBY2M0NSAgICAgICAgICBRTiAyLlMxNgotcUFjYzY3ICAgICAgICAgIFFOIDMuUzE2Ci0KLWRSZXMwICAgICAgICAgICBETiAwLlMxNgotZFJlczEgICAgICAgICAgIEROIDIuUzE2Ci1kUmVzMiAgICAgICAgICAgRE4gNC5TMTYKLWRSZXMzICAgICAgICAgICBETiA2LlMxNgotCi1kQWNjMCAgICAgICAgICAgRE4gMC5VOAotZEFjYzEgICAgICAgICAgIEROIDIuVTgKLWRBY2MyICAgICAgICAgICBETiA0LlU4Ci1kQWNjMyAgICAgICAgICAgRE4gNi5VOCAgICAgICAgCi0gICAgICAgIAotCi1kVG1wMCAgICAgICAgICAgRE4gMjAuUzE2Ci1kVG1wMSAgICAgICAgICAgRE4gMjEuUzE2Ci1kVG1wMiAgICAgICAgICAgRE4gMjIuUzE2Ci1kVG1wMyAgICAgICAgICAgRE4gMjMuUzE2Ci0KLQotICAgICAgICBWTEQxICAgICAgICBkU3JjMCwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uIF0gCi0gICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMgotICAgICAgICBWTEQxICAgICAgICBkU3JjMSwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uIF0KLSAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAotICAgICAgICBWTEQxICAgICAgICBkU3JjNSwgW1RlbXBdLCBzcmNTdGVwICAgICAgICAKLSAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAotICAgICAgICBWTEQxICAgICAgICBkU3JjMiwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2MwIGMxIGMyIGMzIC4uIF0KLSAgICAgICAgVkFEREwgICAgICAgcUFjYzAxLCBkU3JjMCwgZFNyYzUgICAgICAgOy8vIEFjYyA9IGErZgotICAgICAgICBWTEQxICAgICAgICBkU3JjMywgW3BTcmNdLCBzcmNTdGVwCi0gICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKLSAgICAgICAgVkxEMSAgICAgICAgZFNyYzYsIFtUZW1wXSwgc3JjU3RlcCA7Ly8gVGVSaQotICAgICAgICAKLSAgICAgICAgVkxEMSAgICAgICAgZFNyYzQsIFtwU3JjXSwgc3JjU3RlcAotICAgICAgICBWTEQxICAgICAgICBkU3JjNywgW1RlbXBdLCBzcmNTdGVwIDsvLyBUZVJpCi0gICAgICAgIFZBRERMICAgICAgIHFTdW1CRTAxLCBkU3JjMSwgZFNyYzQgICAgIDsvLyBiK2UKLSAgICAgICAgVkFEREwgICAgICAgcVN1bUNEMDEsIGRTcmMyLCBkU3JjMyAgICAgOy8vIGMrZCAgICAgICAgCi0gICAgICAgIFZMRDEgICAgICAgIGRTcmM4LCBbVGVtcF0sIHNyY1N0ZXAgOy8vIFRlUmkKLSAgICAgICAgVk1MUyAgICAgICAgZFJlczAsIGRTdW1CRTAsIGRDb2VmZjUgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCi07ICAgICAgICBWTUxBICAgICAgICBkUmVzMCwgZFN1bUNEMCwgZENvZWZmMjAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi0gICAgICAgIFZNVUwgICAgICAgIGRUbXAwLCBkU3VtQ0QwLCBkQ29lZmYyMCAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLSAgICAgICAgCi07ICAgICAgICBWTEQxICAgICAgICBkU3JjNiwgW1RlbXBdLCBzcmNTdGVwCi0gICAgICAgIFZBRERMICAgICAgIHFTdW1CRTAxLCBkU3JjMiwgZFNyYzUgICAgIDsvLyBiK2UKLSAgICAgICAgVkFEREwgICAgICAgcVN1bUNEMDEsIGRTcmMzLCBkU3JjNCAgICAgOy8vIGMrZAotICAgICAgICBWQURETCAgICAgICBxQWNjMjMsIGRTcmMxLCBkU3JjNiAgICAgICA7Ly8gQWNjID0gYStmCi0gICAgICAgIFZNTFMgICAgICAgIGRSZXMxLCBkU3VtQkUwLCBkQ29lZmY1ICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkKLTsgICAgICAgIFZNTEEgICAgICAgIGRSZXMxLCBkU3VtQ0QwLCBkQ29lZmYyMCAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKLSAgICAgICAgVk1VTCAgICAgICAgZFRtcDEsIGRTdW1DRDAsIGRDb2VmZjIwICAgOy8vIEFjYyArPSAyMCooYytkKQotCi07ICAgICAgICBWTEQxICAgICAgICBkU3JjNywgW1RlbXBdLCBzcmNTdGVwCi0gICAgICAgIFZBRERMICAgICAgIHFTdW1CRTAxLCBkU3JjMywgZFNyYzYgICAgIDsvLyBiK2UKLSAgICAgICAgVkFEREwgICAgICAgcVN1bUNEMDEsIGRTcmM0LCBkU3JjNSAgICAgOy8vIGMrZAotICAgICAgICBWQURETCAgICAgICBxQWNjNDUsIGRTcmMyLCBkU3JjNyAgICAgICA7Ly8gQWNjID0gYStmCi0gICAgICAgIFZNTFMgICAgICAgIGRSZXMyLCBkU3VtQkUwLCBkQ29lZmY1ICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkgICAgICAgIAotOyAgICAgICAgVk1MQSAgICAgICAgZFJlczIsIGRTdW1DRDAsIGRDb2VmZjIwICAgOy8vIEFjYyArPSAyMCooYytkKQotICAgICAgICBWTVVMICAgICAgICBkVG1wMiwgZFN1bUNEMCwgZENvZWZmMjAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi0KLTsgICAgICAgIFZMRDEgICAgICAgIGRTcmM4LCBbVGVtcF0sIHNyY1N0ZXAgICAgIDsvLyBbaTAgaTEgaTIgaTMgLi4gXSAgICAgICAgCi0gICAgICAgIFZBRERMICAgICAgIHFTdW1CRTAxLCBkU3JjNCwgZFNyYzcgICAgIDsvLyBiK2UKLSAgICAgICAgVkFEREwgICAgICAgcUFjYzY3LCBkU3JjMywgZFNyYzggICAgICAgOy8vIEFjYyA9IGErZgotICAgICAgICBWQURETCAgICAgICBxU3VtQ0QwMSwgZFNyYzUsIGRTcmM2ICAgICA7Ly8gYytkCi0gICAgICAgIFZNTFMgICAgICAgIGRSZXMzLCBkU3VtQkUwLCBkQ29lZmY1ICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkgICAgICAgIAotICAgICAgICBWQUREICAgICAgICBkUmVzMCwgZFJlczAsIGRUbXAwCi0gICAgICAgIFZBREQgICAgICAgIGRSZXMxLCBkUmVzMSwgZFRtcDEKLSAgICAgICAgVkFERCAgICAgICAgZFJlczIsIGRSZXMyLCBkVG1wMgotICAgICAgICBWTUxBICAgICAgICBkUmVzMywgZFN1bUNEMCwgZENvZWZmMjAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi07ICAgICAgICBWTVVMICAgICAgICBkVG1wMywgZFN1bUNEMCwgZENvZWZmMjAgICA7Ly8gQWNjICs9IDIwKihjK2QpCi07ICAgICAgICBWQUREICAgICAgICBkUmVzMywgZFJlczMsIGRUbXAzCi0KLSAgICAgICAgVlFSU0hSVU4gICAgZEFjYzAsIHFBY2MwMSwgIzUgICAgICAgIAotICAgICAgICBWUVJTSFJVTiAgICBkQWNjMSwgcUFjYzIzLCAjNSAgICAgICAgCi0gICAgICAgIFZRUlNIUlVOICAgIGRBY2MyLCBxQWNjNDUsICM1ICAgICAgICAKLSAgICAgICAgVlFSU0hSVU4gICAgZEFjYzMsIHFBY2M2NywgIzUgICAgICAgIAotCi0gICAgICAgIE1fRU5ECi0gICAgCi0gICAgRU5ESUYKLQotICAgIAotICAgIAotICAgIEVORAotICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZiOTU2NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MucworKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgOTY0MQotOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLSAgICAgICAgCi0KLSAgICBJRiBDb3J0ZXhBOAotCi0gICAgTV9UQUJMRSBhcm1WQ000UDEwX1dpZHRoQnJhbmNoVGFibGVNVklzTm90WmVybyAgICAgIAotICAgIAotICAgIERDRCAgIFdpZHRoSXMyTVZJc05vdFplcm8sIFdpZHRoSXMyTVZJc05vdFplcm8KLSAgICBEQ0QgICBXaWR0aElzNE1WSXNOb3RaZXJvLCBXaWR0aElzNE1WSXNOb3RaZXJvCi0gICAgRENEICAgV2lkdGhJczhNVklzTm90WmVybwotICAgIAotICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9XaWR0aEJyYW5jaFRhYmxlTVZJc1plcm8gICAgICAKLSAgICAKLSAgICBEQ0QgICBXaWR0aElzMk1WSXNaZXJvLCBXaWR0aElzMk1WSXNaZXJvCi0gICAgRENEICAgV2lkdGhJczRNVklzWmVybywgV2lkdGhJczRNVklzWmVybwotICAgIERDRCAgIFdpZHRoSXM4TVZJc1plcm8KLSAgICAKLSAgICAKLTsvLyBpbnB1dCByZWdpc3RlcnMKLQotcFNyYyAgICAgICAgICAgICAgICAgUk4gMAotaVNyY1N0ZXAgICAgICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgICAgICAgUk4gMgotaURzdFN0ZXAgICAgICAgICAgICAgUk4gMwotaVdpZHRoICAgICAgICAgICAgICAgUk4gNAotaUhlaWdodCAgICAgICAgICAgICAgUk4gNQotZHggICAgICAgICAgICAgICAgICAgUk4gNgotZHkgICAgICAgICAgICAgICAgICAgUk4gNwotCi07Ly8gbG9jYWwgdmFyaWFibGUgcmVnaXN0ZXJzCi1wYyAgICAgICAgICAgICAgICAgICBSTiAxNQotcmV0dXJuICAgICAgICAgICAgICAgUk4gMAotRWlnaHRNaW51c2R4ICAgICAgICAgUk4gOCAKLUVpZ2h0TWludXNkeSAgICAgICAgIFJOIDkKLQotQUNvZWZmICAgICAgICAgICAgICAgUk4gMTIKLUJDb2VmZiAgICAgICAgICAgICAgIFJOIDkKLUNDb2VmZiAgICAgICAgICAgICAgIFJOIDgKLURDb2VmZiAgICAgICAgICAgICAgIFJOIDYKLQotcFRhYmxlICAgICAgICAgICAgICAgUk4gMTEKLQotU3RlcDEgICAgICAgICAgICAgICAgUk4gMTAKLVNyY1N0ZXBNaW51czEgICAgICAgIFJOIDE0Ci0KLWRBQ29lZmYgICAgICAgICAgICAgIEROIEQxMi5VOAotZEJDb2VmZiAgICAgICAgICAgICAgRE4gRDEzLlU4Ci1kQ0NvZWZmICAgICAgICAgICAgICBETiBEMTQuVTgKLWREQ29lZmYgICAgICAgICAgICAgIEROIEQxNS5VOAotCi1kUm93MGEgICAgICAgICAgICAgICBETiBEMC5VOAotZFJvdzBiICAgICAgICAgICAgICAgRE4gRDEuVTgKLWRSb3cxYSAgICAgICAgICAgICAgIEROIEQyLlU4Ci1kUm93MWIgICAgICAgICAgICAgICBETiBEMy5VOAotCi1xUm93MGEgICAgICAgICAgICAgICBRTiBRMi5TMTYKLXFSb3cwYiAgICAgICAgICAgICAgIFFOIFEzLlMxNgotCi07Ly9kSW5kZXggICAgICAgICAgICAgICBETiAgICBEMTYuVTggICAgICAgICAgICAgICAgIAotcVJvdzFhICAgICAgICAgICAgICAgUU4gUTExLlMxNgotcVJvdzFiICAgICAgICAgICAgICAgUU4gUTEyLlMxNgotCi1kUm93MmEgICAgICAgICAgICAgICBETiBEMTYuVTgKLWRSb3cyYiAgICAgICAgICAgICAgIEROIEQxNy5VOAotZFJvdzNhICAgICAgICAgICAgICAgRE4gRDE4LlU4Ci1kUm93M2IgICAgICAgICAgICAgICBETiBEMTkuVTgKLQotcU91dFJvdzIgICAgICAgICAgICAgUU4gUTExLlUxNgotcU91dFJvdzMgICAgICAgICAgICAgUU4gUTEyLlUxNgotZE91dFJvdzIgICAgICAgICAgICAgRE4gRDIwLlU4Ci1kT3V0Um93MyAgICAgICAgICAgICBETiBEMjEuVTgKLWRPdXRSb3cyVTY0ICAgICAgICAgIEROIEQyMC5VNjQKLWRPdXRSb3czVTY0ICAgICAgICAgIEROIEQyMS5VNjQKLQotcU91dFJvdzAgICAgICAgICAgICAgUU4gUTIuVTE2Ci1xT3V0Um93MSAgICAgICAgICAgICBRTiBRMy5VMTYKLWRPdXRSb3cwICAgICAgICAgICAgIEROIEQ4LlU4Ci1kT3V0Um93MSAgICAgICAgICAgICBETiBEOS5VOAotCi1kT3V0Um93MFU2NCAgICAgICAgICBETiBEOC5VNjQKLWRPdXRSb3cxVTY0ICAgICAgICAgIEROIEQ5LlU2NAotCi1kT3V0Um93MFUzMiAgICAgICAgICBETiBEOC5VMzIKLWRPdXRSb3cxVTMyICAgICAgICAgIEROIEQ5LlUzMgotCi1kT3V0Um93MFUxNiAgICAgICAgICBETiBEOC5VMTYKLWRPdXRSb3cxVTE2ICAgICAgICAgIEROIEQ5LlUxNgotCi0KLWRPdXQwVTY0ICAgICAgICAgICAgIEROIEQwLlU2NAotZE91dDFVNjQgICAgICAgICAgICAgRE4gRDEuVTY0Ci0KLWRPdXQwMFUzMiAgICAgICAgICAgIEROIEQwLlUzMgotZE91dDAxVTMyICAgICAgICAgICAgRE4gRDEuVTMyCi1kT3V0MTBVMzIgICAgICAgICAgICBETiBEMi5VMzIKLWRPdXQxMVUzMiAgICAgICAgICAgIEROIEQzLlUzMgotCi1kT3V0MFUxNiAgICAgICAgICAgICBETiBEMC5VMTYKLWRPdXQxVTE2ICAgICAgICAgICAgIEROIEQxLlUxNgotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX2FzbSBzdGFydHMKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEsIHIxMSwgZDE1Ci0gICAgICAgIAotICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cwotICAgICAgICBNX0FSRyAgIFdpZHRoLCAgICAgIDQKLSAgICAgICAgTV9BUkcgICBIZWlnaHQsICAgICA0Ci0gICAgICAgIE1fQVJHICAgRHgsICAgICAgICAgNAotICAgICAgICBNX0FSRyAgIER5LCAgICAgICAgIDQKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCi0gICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz00Ci0gICAgICAgIAotICAgICAgICBNX0xEUkQgICBkeCwgZHksIER4Ci0gICAgICAgIE1fTERSRCAgIGlXaWR0aCwgaUhlaWdodCwgV2lkdGgKLSAgICAgICAgCi0gICAgICAgIDsvLyBFaWdodE1pbnVzZHggPSA4IC0gZHgKLSAgICAgICAgOy8vIEVpZ2h0TWludXNkeSA9IDggLSBkeQotICAgICAgICAKLSAgICAgICAgOy8vIEFDb2VmZiA9IEVpZ2h0TWludXNkeCAqIEVpZ2h0TWludXNkeQotICAgICAgICA7Ly8gQkNvZWZmID0gZHggKiBFaWdodE1pbnVzZHkKLSAgICAgICAgOy8vIENDb2VmZiA9IEVpZ2h0TWludXNkeCAqIGR5Ci0gICAgICAgIDsvLyBEQ29lZmYgPSBkeCAqIGR5Ci0gICAgICAgIAotICAgICAgICBSU0IgICAgIEVpZ2h0TWludXNkeCwgZHgsICM4IAotICAgICAgICBSU0IgICAgIEVpZ2h0TWludXNkeSwgZHksICM4Ci0gICAgICAgIENNTiAgICAgZHgsZHkKLSAgICAgICAgTU9WICAgICBTdGVwMSwgIzEKLSAgICAgICAgTERSRVEgICBwVGFibGUsID1hcm1WQ000UDEwX1dpZHRoQnJhbmNoVGFibGVNVklzWmVybwotICAgICAgICBTVUIgICAgIFNyY1N0ZXBNaW51czEsIGlTcmNTdGVwLCBTdGVwMQotICAgICAgICBMRFJORSAgIHBUYWJsZSwgPWFybVZDTTRQMTBfV2lkdGhCcmFuY2hUYWJsZU1WSXNOb3RaZXJvCi0gICAgICAgIAotICAgICAgICBWTEQxICAgIGRSb3cwYSwgW3BTcmNdLCBTdGVwMSAgICAgICAgICAgICAgICAgICA7Ly8gMGEKLSAgICAgICAgCi0gICAgICAgIFNNVUxCQiAgQUNvZWZmLCBFaWdodE1pbnVzZHgsIEVpZ2h0TWludXNkeQotICAgICAgICBTTVVMQkIgIEJDb2VmZiwgZHgsIEVpZ2h0TWludXNkeQotICAgICAgICBWTEQxICAgIGRSb3cwYiwgW3BTcmNdLCBTcmNTdGVwTWludXMxICAgICAgICAgICA7Ly8gMGIKLSAgICAgICAgU01VTEJCICBDQ29lZmYsIEVpZ2h0TWludXNkeCwgZHkKLSAgICAgICAgU01VTEJCICBEQ29lZmYsIGR4LCBkeQotICAgICAgICAKLSAgICAgICAgVkRVUCAgICBkQUNvZWZmLCBBQ29lZmYKLSAgICAgICAgVkRVUCAgICBkQkNvZWZmLCBCQ29lZmYKLSAgICAgICAgVkRVUCAgICBkQ0NvZWZmLCBDQ29lZmYKLSAgICAgICAgVkRVUCAgICBkRENvZWZmLCBEQ29lZmYKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgcGMsIFtwVGFibGUsIGlXaWR0aCwgTFNMICMxXSAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGNhc2UgYmFzZWQgb24gaVdpZHRoCi0gICAgICAgIAotOy8vIFBpeGVsIGxheW91dDoKLTsvLwotOy8vICAgeDAwIHgwMSB4MDIKLTsvLyAgIHgxMCB4MTEgeDEyCi07Ly8gICB4MjAgeDIxIHgyMgotCi07Ly8gSWYgZnJhY3Rpb25sIG12IGlzIG5vdCAoMCwgMCkKLVdpZHRoSXM4TVZJc05vdFplcm8KLQotICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MWEsIFtwU3JjXSwgU3RlcDEgICAgICAgICAgICA7Ly8gMWEKLSAgICAgICAgICAgICAgICBWTVVMTCAgcVJvdzBhLCBkUm93MGEsIGRBQ29lZmYKLSAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzFiLCBbcFNyY10sIFNyY1N0ZXBNaW51czEgICAgOy8vIDFiCi0gICAgICAgICAgICAgICAgVk1VTEwgIHFSb3cwYiwgZFJvdzFhLCBkQUNvZWZmCi0gICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cyYSwgW3BTcmNdLCBTdGVwMSAgICAgICAgICAgIDsvLyAyYQotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGEsIGRSb3cwYiwgZEJDb2VmZgotICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MmIsIFtwU3JjXSwgU3JjU3RlcE1pbnVzMSAgICA7Ly8gMmIKLSAgICAgICAgICAgICAgICBWTVVMTCAgcVJvdzFhLCBkUm93MmEsIGRBQ29lZmYKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBiLCBkUm93MWIsIGRCQ29lZmYKLSAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzNhLCBbcFNyY10sIFN0ZXAxICAgICAgICAgICAgOy8vIDNhCi0gICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYSwgZFJvdzFhLCBkQ0NvZWZmCi0gICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cxYSwgZFJvdzJiLCBkQkNvZWZmCi0gICAgICAgICAgICAgICAgVk1VTEwgIHFSb3cxYiwgZFJvdzNhLCBkQUNvZWZmCi0gICAgICAgICAgICAgICAgVkxEMSAgIGRSb3czYiwgW3BTcmNdLCBTcmNTdGVwTWludXMxICAgIDsvLyAzYgotICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGIsIGRSb3cyYSwgZENDb2VmZgotICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MGEsIFtwU3JjXSwgU3RlcDEgICAgICAgICAgICA7Ly8gMGEKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzFiLCBkUm93M2IsIGRCQ29lZmYKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzFhLCBkUm93M2EsIGRDQ29lZmYKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBhLCBkUm93MWIsIGREQ29lZmYKLSAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzBiLCBbcFNyY10sIFNyY1N0ZXBNaW51czEgICAgOy8vIDBiCi0gICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cxYiwgZFJvdzBhLCBkQ0NvZWZmCi0gICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYiwgZFJvdzJiLCBkRENvZWZmCi0gICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cxYSwgZFJvdzNiLCBkRENvZWZmCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU1VCUyAgIGlIZWlnaHQsIGlIZWlnaHQsICM0Ci0gICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cxYiwgZFJvdzBiLCBkRENvZWZmCi0KLSAgICAgICAgICAgICAgICBWUVJTSFJOIGRPdXRSb3cwLCBxT3V0Um93MCwgIzYKLSAgICAgICAgICAgICAgICBWUVJTSFJOIGRPdXRSb3cxLCBxT3V0Um93MSwgIzYKLSAgICAgICAgICAgICAgICBWUVJTSFJOIGRPdXRSb3cyLCBxT3V0Um93MiwgIzYKLSAgICAgICAgICAgICAgICBWU1QxICAgZE91dFJvdzBVNjQsIFtwRHN0XSwgaURzdFN0ZXAKLSAgICAgICAgICAgICAgICBWUVJTSFJOIGRPdXRSb3czLCBxT3V0Um93MywgIzYKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBWU1QxICAgZE91dFJvdzFVNjQsIFtwRHN0XSwgaURzdFN0ZXAgIAotICAgICAgICAgICAgICAgIFZTVDEgICBkT3V0Um93MlU2NCwgW3BEc3RdLCBpRHN0U3RlcAotICAgICAgICAgICAgICAgIFZTVDEgICBkT3V0Um93M1U2NCwgW3BEc3RdLCBpRHN0U3RlcCAgCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICBCR1QgICAgIFdpZHRoSXM4TVZJc05vdFplcm8KLSAgICAgICAgICAgICAgICBNT1YgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCi0gICAgICAgICAgICAgICAgTV9FWElUCi0KLVdpZHRoSXM0TVZJc05vdFplcm8KLQotICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MWEsIFtwU3JjXSwgU3RlcDEKLSAgICAgICAgICAgICAgICBWTVVMTCAgcVJvdzBhLCBkUm93MGEsIGRBQ29lZmYKLSAgICAgICAgICAgICAgICBWTVVMTCAgcVJvdzBiLCBkUm93MWEsIGRBQ29lZmYKLSAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzFiLCBbcFNyY10sIFNyY1N0ZXBNaW51czEKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBhLCBkUm93MGIsIGRCQ29lZmYKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBiLCBkUm93MWIsIGRCQ29lZmYKLSAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzBhLCBbcFNyY10sIFN0ZXAxCi0gICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYSwgZFJvdzFhLCBkQ0NvZWZmCi0gICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYiwgZFJvdzBhLCBkQ0NvZWZmCi0gICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cwYiwgW3BTcmNdLCBTcmNTdGVwTWludXMxCi0gICAgICAgICAgICAgICAgU1VCUyAgIGlIZWlnaHQsIGlIZWlnaHQsICMyCi0gICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYiwgZFJvdzBiLCBkRENvZWZmCi0gICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYSwgZFJvdzFiLCBkRENvZWZmCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVlFSU0hSTiBkT3V0Um93MSwgcU91dFJvdzEsICM2Ci0gICAgICAgICAgICAgICAgVlFSU0hSTiBkT3V0Um93MCwgcU91dFJvdzAsICM2Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVlNUMSAgIGRPdXRSb3cwVTMyWzBdLCBbcERzdF0sIGlEc3RTdGVwCi0gICAgICAgICAgICAgICAgVlNUMSAgIGRPdXRSb3cxVTMyWzBdLCBbcERzdF0sIGlEc3RTdGVwICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBCR1QgICAgIFdpZHRoSXM0TVZJc05vdFplcm8KLSAgICAgICAgICAgICAgICBNT1YgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCi0gICAgICAgICAgICAgICAgTV9FWElUCi0KLVdpZHRoSXMyTVZJc05vdFplcm8KLQotICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MWEsIFtwU3JjXSwgU3RlcDEKLSAgICAgICAgICAgICAgICBWTVVMTCAgcVJvdzBhLCBkUm93MGEsIGRBQ29lZmYKLSAgICAgICAgICAgICAgICBWTVVMTCAgcVJvdzBiLCBkUm93MWEsIGRBQ29lZmYKLSAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzFiLCBbcFNyY10sIFNyY1N0ZXBNaW51czEKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBhLCBkUm93MGIsIGRCQ29lZmYKLSAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBiLCBkUm93MWIsIGRCQ29lZmYKLSAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzBhLCBbcFNyY10sIFN0ZXAxCi0gICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYSwgZFJvdzFhLCBkQ0NvZWZmCi0gICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYiwgZFJvdzBhLCBkQ0NvZWZmCi0gICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cwYiwgW3BTcmNdLCBTcmNTdGVwTWludXMxCi0gICAgICAgICAgICAgICAgU1VCUyAgIGlIZWlnaHQsIGlIZWlnaHQsICMyCi0gICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYiwgZFJvdzBiLCBkRENvZWZmCi0gICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYSwgZFJvdzFiLCBkRENvZWZmCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVlFSU0hSTiBkT3V0Um93MSwgcU91dFJvdzEsICM2Ci0gICAgICAgICAgICAgICAgVlFSU0hSTiBkT3V0Um93MCwgcU91dFJvdzAsICM2Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVlNUMSAgIGRPdXRSb3cwVTE2WzBdLCBbcERzdF0sIGlEc3RTdGVwCi0gICAgICAgICAgICAgICAgVlNUMSAgIGRPdXRSb3cxVTE2WzBdLCBbcERzdF0sIGlEc3RTdGVwICAKLQotICAgICAgICAgICAgICAgIEJHVCAgICAgV2lkdGhJczJNVklzTm90WmVybyAKLSAgICAgICAgICAgICAgICBNT1YgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCi0gICAgICAgICAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotOy8vIElmIGZyYWN0aW9ubCBtdiBpcyAoMCwgMCkKLVdpZHRoSXM4TVZJc1plcm8KLSAgICAgICAgICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIGlTcmNTdGVwCi0KLVdpZHRoSXM4TG9vcE1WSXNaZXJvCi0gICAgICAgICAgICAgICAgVkxEMSAgICBkUm93MGEsIFtwU3JjXSwgaVNyY1N0ZXAKLSAgICAgICAgICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMyCi0gICAgICAgICAgICAgICAgVkxEMSAgICBkUm93MGIsIFtwU3JjXSwgaVNyY1N0ZXAKLSAgICAgICAgICAgICAgICBWU1QxICAgIGRPdXQwVTY0LCBbcERzdF0sIGlEc3RTdGVwCi0gICAgICAgICAgICAgICAgVlNUMSAgICBkT3V0MVU2NCwgW3BEc3RdLCBpRHN0U3RlcAotICAgICAgICAgICAgICAgIEJHVCAgICAgV2lkdGhJczhMb29wTVZJc1plcm8KLQotICAgICAgICAgICAgICAgIE1PViAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgICAgICAgICBNX0VYSVQKLQotV2lkdGhJczRNVklzWmVybyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBWTEQxICAgIGRSb3cwYiwgW3BTcmNdLCBpU3JjU3RlcAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzIKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBWU1QxICAgIGRPdXQwMFUzMlswXSwgW3BEc3RdLCBpRHN0U3RlcAotICAgICAgICAgICAgICAgIFZMRDEgICAgZFJvdzBhLCBbcFNyY10sIGlTcmNTdGVwCi0gICAgICAgICAgICAgICAgVlNUMSAgICBkT3V0MDFVMzJbMF0sIFtwRHN0XSwgaURzdFN0ZXAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBCR1QgICAgIFdpZHRoSXM0TVZJc1plcm8gCi0gICAgICAgICAgICAgICAgTU9WICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgotICAgICAgICAgICAgICAgIE1fRVhJVAotICAgICAgICAgICAgICAgIAotV2lkdGhJczJNVklzWmVybyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBWTEQxICAgIGRSb3cwYiwgW3BTcmNdLCBpU3JjU3RlcAotICAgICAgICAgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzIKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBWU1QxICAgIGRPdXQwVTE2WzBdLCBbcERzdF0sIGlEc3RTdGVwCi0gICAgICAgICAgICAgICAgVkxEMSAgICBkUm93MGEsIFtwU3JjXSwgaVNyY1N0ZXAKLSAgICAgICAgICAgICAgICBWU1QxICAgIGRPdXQxVTE2WzBdLCBbcERzdF0sIGlEc3RTdGVwCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQkdUICAgICBXaWR0aElzMk1WSXNaZXJvIAotICAgICAgICAgICAgICAgIE1PViAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIE1fRU5ECi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICBFTkRJRiA7Ly8gQ29ydGV4QTgKLSAgICAgICAgCi0gICAgICAgIEVORAotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX2FzbSBlbmRzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNkMzNhNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLyBEZXNjcmlwdGlvbjoKLTsvLyBUaGlzIGZpbGUgY29udGFpbnMgcXVhbnRpemF0aW9uIHRhYmxlcwotOy8vIAotOy8vIAotCi0gICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAKLSAgICAgICAgIAotICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfTUZNYXRyaXhRUE1vZFRhYmxlCi0gICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9RUERpdkludHJhVGFibGUKLSAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1FQRGl2UGx1c09uZVRhYmxlICAKLSAgICAgICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIGFybVZDTTRQMTBfTUZNYXRyaXggW2lRUCAlIDZdWzBdIGVudGlyZXMsCi07Ly8gZm9yIHZhbHVlcyBvZiBpUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9NRk1hdHJpeFFQTW9kVGFibGUKLSAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAgICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBjb250YWlucyBBUk1fTTRQMTBfUV9PRkZTRVQgKyAxICsgKGlRUCAvIDYpIHZhbHVlcywKLTsvLyBmb3IgdmFsdWVzIG9mIGlRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9RUERpdlBsdXNPbmVUYWJsZQotICAgICAgICAgRENCIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYKLSAgICAgICAgIERDQiAxNywgMTcsIDE3LCAxNywgMTcsIDE3Ci0gICAgICAgICBEQ0IgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOAotICAgICAgICAgRENCIDE5LCAxOSwgMTksIDE5LCAxOSwgMTkKLSAgICAgICAgIERDQiAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwCi0gICAgICAgICBEQ0IgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMQotICAgICAgICAgRENCIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIKLSAgICAgICAgIERDQiAyMywgMjMsIDIzLCAyMywgMjMsIDIzCi0gICAgICAgICBEQ0IgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNAotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zICgxIDw8IFFiaXRzUGx1c09uZSkgLyAzIFZhbHVlcyAoSW50cmEgY2FzZSkgLAotOy8vIGZvciB2YWx1ZXMgb2YgaVFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAKLSAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9RUERpdkludHJhVGFibGUsIDIKLSAgICAgICAgIERDRCAyMTg0NSwgMjE4NDUsIDIxODQ1LCAyMTg0NSwgMjE4NDUsIDIxODQ1Ci0gICAgICAgICBEQ0QgNDM2OTAsIDQzNjkwLCA0MzY5MCwgNDM2OTAsIDQzNjkwLCA0MzY5MAotICAgICAgICAgRENEIDg3MzgxLCA4NzM4MSwgODczODEsIDg3MzgxLCA4NzM4MSwgODczODEKLSAgICAgICAgIERDRCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyCi0gICAgICAgICBEQ0QgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNQotICAgICAgICAgRENEIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAKLSAgICAgICAgIERDRCAxMzk4MTAxLCAxMzk4MTAxLCAxMzk4MTAxLCAxMzk4MTAxLCAxMzk4MTAxLCAxMzk4MTAxCi0gICAgICAgICBEQ0QgMjc5NjIwMiwgMjc5NjIwMiwgMjc5NjIwMiwgMjc5NjIwMiwgMjc5NjIwMiwgMjc5NjIwMgotICAgICAgICAgRENEIDU1OTI0MDUsIDU1OTI0MDUsIDU1OTI0MDUsIDU1OTI0MDUsIDU1OTI0MDUsIDU1OTI0MDUgICAgICAgICAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgIAotICAgICAgICAgRU5ECi0gICAgICAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTE2ZTQ5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotOy8vIERlc2NyaXB0aW9uOgotOy8vIFRyYW5zZm9ybSBSZXNpZHVhbCA0eDQgQ29lZmZpY2llbnRzCi07Ly8gCi07Ly8gCi0KLSAgICAgICAgCi07Ly8gSW5jbHVkZSBzdGFuZGFyZCBoZWFkZXJzCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotICAgICAgICAKLTsvLyBJbXBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tIG90aGVyIGZpbGVzCi07Ly8gKEZvciBleGFtcGxlIHRhYmxlcykKLSAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLTsvLyBTZXQgZGVidWdnaW5nIGxldmVsICAgICAgICAKLTsvL0RFQlVHX09OICAgIFNFVEwge1RSVUV9Ci0KLQotCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0gICAgCi0gICAgCi0gICAgCi0KLQotCi0KLQotOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQotICAgIAotICAgIElGICBDb3J0ZXhBOAotCi07Ly8gQVJNIFJlZ2lzdGVycwotICAgIAotOy8vSW5wdXQgUmVnaXN0ZXJzCi1wRHN0ICAgICAgICAgICAgICAgIFJOICAwCi1wU3JjICAgICAgICAgICAgICAgIFJOICAxCi0KLQotOy8vIE5lb24gUmVnaXN0ZXJzCi0gICAgICAKLTsvLyBQYWNrZWQgSW5wdXQgcGl4ZWxzCi1kSW4wICAgICAgICAgICAgICAgIEROICBEMC5TMTYgICAgICAgCi1kSW4xICAgICAgICAgICAgICAgIEROICBEMS5TMTYgICAgICAgCi1kSW4yICAgICAgICAgICAgICAgIEROICBEMi5TMTYgICAgICAgCi1kSW4zICAgICAgICAgICAgICAgIEROICBEMy5TMTYKLQotOy8vIEludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMgICAgICAgCi1kWmVybyAgICAgICAgICAgICAgIEROICBENC5TMTYKLWRlMCAgICAgICAgICAgICAgICAgRE4gIEQ1LlMxNgotZGUxICAgICAgICAgICAgICAgICBETiAgRDYuUzE2Ci1kZTIgICAgICAgICAgICAgICAgIEROICBENy5TMTYKLWRlMyAgICAgICAgICAgICAgICAgRE4gIEQ4LlMxNgotZEluMVJTICAgICAgICAgICAgICBETiAgRDcuUzE2Ci1kSW4zUlMgICAgICAgICAgICAgIEROICBEOC5TMTYKLWRmMCAgICAgICAgICAgICAgICAgRE4gIEQwLlMxNgotZGYxICAgICAgICAgICAgICAgICBETiAgRDEuUzE2Ci1kZjIgICAgICAgICAgICAgICAgIEROICBEMi5TMTYKLWRmMyAgICAgICAgICAgICAgICAgRE4gIEQzLlMxNgotcWYwMSAgICAgICAgICAgICAgICBRTiAgUTAuMzIKLXFmMjMgICAgICAgICAgICAgICAgUU4gIFExLjMyCi1kZzAgICAgICAgICAgICAgICAgIEROICBENS5TMTYKLWRnMSAgICAgICAgICAgICAgICAgRE4gIEQ2LlMxNgotZGcyICAgICAgICAgICAgICAgICBETiAgRDcuUzE2Ci1kZzMgICAgICAgICAgICAgICAgIEROICBEOC5TMTYKLWRmMVJTICAgICAgICAgICAgICAgRE4gIEQ3LlMxNgotZGYzUlMgICAgICAgICAgICAgICBETiAgRDguUzE2Ci0KLTsvLyBPdXRwdXQgcGl4ZWxzCi1kaDAgICAgICAgICAgICAgICAgIEROICBEMC5TMTYKLWRoMSAgICAgICAgICAgICAgICAgRE4gIEQxLlMxNgotZGgyICAgICAgICAgICAgICAgICBETiAgRDIuUzE2Ci1kaDMgICAgICAgICAgICAgICAgIEROICBEMy5TMTYKLQotICAgICAgIAotICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgcmVxdWlyZWQgYnkgdGhlIGZ1bmN0aW9uCi0gICAgICAgIAotCi0gICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQsICxkOAotICAgICAgICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICA7Ly8gVGhlIHN0cmF0ZWd5IHVzZWQgaW4gaW1wbGVtZW50aW5nIHRoZSB0cmFuc2Zvcm0gaXMgYXMgZm9sbG93czoqCi0gICAgICAgIDsvLyBMb2FkIHRoZSA0eDQgYmxvY2sgaW50byA4IHJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAotICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSA0eDQgbWF0cml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKLSAgICAgICAgOy8vIFBlcmZvcm0gdGhlIHJvdyBvcGVyYXRpb25zIChvbiBjb2x1bW5zKSB1c2luZyBTSU1EICAgICAgICAgICAgKiAgCi0gICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIDR4NCByZXN1bHQgbWF0cml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAotICAgICAgICA7Ly8gUGVyZm9ybSB0aGUgY29sb3VtbiBvcGVyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICAgIDsvLyBTdG9yZSB0aGUgNHg0IGJsb2NrIGF0IG9uZSBnbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgICAgOy8vIExvYWQgYWxsIHRoZSA0eDQgcGl4ZWxzIGluIHRyYW5zcG9zZWQgZm9ybQotICAgICAgICAKLSAgICAgICAgVkxENCAgICB7ZEluMCxkSW4xLGRJbjIsZEluM30sW3BTcmNdCi0gICAgICAgIAotICAgICAgICBWTU9WICAgIGRaZXJvLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFVzZWQgdG8gcmlnaHQgc2hpZnQgYnkgMSAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgICAgICAgOy8vIFJvdyBPcGVyYXRpb25zIChQZXJmb3JtZWQgb24gY29sdW1ucykKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgVkFERCAgICAgICAgZGUwLGRJbjAsZEluMiAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMCA9IGQwICsgZDIgCi0gICAgICAgIFZTVUIgICAgICAgIGRlMSxkSW4wLGRJbjIgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUxID0gZDAgLSBkMiAKLSAgICAgICAgVkhBREQgICAgICAgZEluMVJTLGRJbjEsZFplcm8gICAgICAgICAgICAgICAgICAgOy8vIChmMT4+MSkgY29uc3RaZXJvIGlzIGEgcmVnaXN0ZXIgaG9sZGluZyAwCi0gICAgICAgIFZIQUREICAgICAgIGRJbjNSUyxkSW4zLGRaZXJvCi0gICAgICAgIFZTVUIgICAgICAgIGRlMixkSW4xUlMsZEluMyAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTIgPSAoZDE+PjEpIC0gZDMgCi0gICAgICAgIFZBREQgICAgICAgIGRlMyxkSW4xLGRJbjNSUyAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTMgPSBkMSArIChkMz4+MSkgCi0gICAgICAgIFZBREQgICAgICAgIGRmMCxkZTAsZGUzICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjAgPSBlMCArIGUzCi0gICAgICAgIFZBREQgICAgICAgIGRmMSxkZTEsZGUyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjEgPSBlMSArIGUyCi0gICAgICAgIFZTVUIgICAgICAgIGRmMixkZTEsZGUyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjIgPSBlMSAtIGUyCi0gICAgICAgIFZTVUIgICAgICAgIGRmMyxkZTAsZGUzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjMgPSBlMCAtIGUzCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSByZXN1bHRhbnQgbWF0cml4Ci0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAKLSAgICAgICAgVlRSTiAgICBkZjAsZGYxCi0gICAgICAgIFZUUk4gICAgZGYyLGRmMwotICAgICAgICBWVFJOICAgIHFmMDEscWYyMyAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgICAgICAgOy8vIENvbG91bW4gT3BlcmF0aW9ucyAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgVkFERCAgICAgICAgZGcwLGRmMCxkZjIgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMCA9IGQwICsgZDIgCi0gICAgICAgIFZTVUIgICAgICAgIGRnMSxkZjAsZGYyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTEgPSBkMCAtIGQyIAotICAgICAgICBWSEFERCAgICAgICBkZjFSUyxkZjEsZFplcm8gICAgICAgICAgICAgICAgICAgICA7Ly8gKGYxPj4xKSBjb25zdFplcm8gaXMgYSByZWdpc3RlciBob2xkaW5nIDAKLSAgICAgICAgVkhBREQgICAgICAgZGYzUlMsZGYzLGRaZXJvCi0gICAgICAgIFZTVUIgICAgICAgIGRnMixkZjFSUyxkZjMgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTIgPSAoZDE+PjEpIC0gZDMgCi0gICAgICAgIFZBREQgICAgICAgIGRnMyxkZjEsZGYzUlMgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUzID0gZDEgKyAoZDM+PjEpIAotICAgICAgICBWQUREICAgICAgICBkaDAsZGcwLGRnMyAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYwID0gZTAgKyBlMwotICAgICAgICBWQUREICAgICAgICBkaDEsZGcxLGRnMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYxID0gZTEgKyBlMgotICAgICAgICBWU1VCICAgICAgICBkaDIsZGcxLGRnMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYyID0gZTEgLSBlMgotICAgICAgICBWU1VCICAgICAgICBkaDMsZGcwLGRnMyAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYzID0gZTAgLSBlMwotICAgICAgICAKLSAgICAgICAgICAgICAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICA7Ly8gQ2FsY3VsYXRlIGZpbmFsIHZhbHVlIChjb2xPcFtpXVtqXSArIDMyKT4+NgotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIAotICAgICAgICBWUlNIUiAgICAgICBkaDAsIzYKLSAgICAgICAgVlJTSFIgICAgICAgZGgxLCM2Ci0gICAgICAgIFZSU0hSICAgICAgIGRoMiwjNgotICAgICAgICBWUlNIUiAgICAgICBkaDMsIzYKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vIFN0b3JlIGFsbCB0aGUgNHg0IHBpeGVscwotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIAotICAgICAgICBWU1QxICAge2RoMCxkaDEsZGgyLGRoM30sW3BEc3RdCi0gICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCi0gICAgICAgIAotRW5kICAgICAgICAgICAgICAgIAotCi0gICAgICAgIAotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAotICAgICAgICBNX0VORAotICAgICAgICAKLSAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQ29ydGV4QTggICAgICAgICAgICAKLSAgICAgICAgICAgIAotICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNGM3ZDUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucworKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi07Ly8gRGVmaW5lIHRoZSBwcm9jZXNzb3IgdmFyaWFudHMgc3VwcG9ydGVkIGJ5IHRoaXMgZmlsZQotCi0gICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0gICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgSUYgQVJNMTEzNkpTCi0gICAgICAgIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBJbnB1dCBBcmd1bWVudHMgYW5kIHRoZWlyIHNjb3BlL3VzYWdlCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcHBTcmMgICAgICAgICAgIFJOIDAgICAgOy8vIFBlcnNpc3RlbnQgdmFyaWFibGUKLXBEc3QgICAgICAgICAgICBSTiAxICAgIDsvLyBQZXJzaXN0ZW50IHZhcmlhYmxlCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVmFyaWFibGVzIGFuZCB0aGVpciBzY29wZS91c2FnZQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBTcmMgICAgICAgICAgICBSTiAyICAgIDsvLyBQZXJzaXN0ZW50IHZhcmlhYmxlcwotRmxhZyAgICAgICAgICAgIFJOIDMgICAgCi1WYWx1ZSAgICAgICAgICAgUk4gNCAgICAKLVZhbHVlMiAgICAgICAgICBSTiA1ICAgIAotc3RyT2Zmc2V0ICAgICAgIFJOIDYgICAgCi1jc3RPZmZzZXQgICAgICAgUk4gNyAgICAKLQotICAgICAgICAKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0LCByNwotICAgICAgICAKLSAgICAgICAgTERSICAgICBwU3JjLCBbcHBTcmNdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBwU3JjCi0gICAgICAgIE1PViAgICAgY3N0T2Zmc2V0LCAjMzEgICAgICAgICAgICAgICAgICAgICAgOy8vIFRvIGJlIHVzZWQgaW4gdGhlIGxvb3AsIHRvIGNvbXB1dGUgb2Zmc2V0Ci0gICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7IEZpcnN0bHksIGZpbGwgYWxsIHRoZSBjb2VmZmljaWVudCB2YWx1ZXMgb24gdGhlIDxwRHN0PiBidWZmZXIgYnkgemVybwotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgVmFsdWUsICAjMCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6ZSB0aGUgemVybyB2YWx1ZQotICAgICAgICBNT1YgICAgICBWYWx1ZTIsICMwICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbml0aWFsaXplIHRoZSB6ZXJvIHZhbHVlCi0gICAgICAgIExEUkIgICAgIEZsYWcsICBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgOy8vIFByZWxvYWQgPEZsYWc+IGJlZm9yZSA8dW5wYWNrTG9vcD4KLSAgICAgICAgCi0gICAgICAgIFNUUkQgICAgIFZhbHVlLCBbcERzdCwgIzBdICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMF0gID0gcERzdFsxXSAgPSBwRHN0WzJdICA9IHBEc3RbM10gID0gMAotICAgICAgICBTVFJEICAgICBWYWx1ZSwgW3BEc3QsICM4XSAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzRdICA9IHBEc3RbNV0gID0gcERzdFs2XSAgPSBwRHN0WzddICA9IDAKLSAgICAgICAgU1RSRCAgICAgVmFsdWUsIFtwRHN0LCAjMTZdICAgICAgICAgICAgICAgICA7Ly8gcERzdFs4XSAgPSBwRHN0WzldICA9IHBEc3RbMTBdID0gcERzdFsxMV0gPSAwCi0gICAgICAgIFNUUkQgICAgIFZhbHVlLCBbcERzdCwgIzI0XSAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMTJdID0gcERzdFsxM10gPSBwRHN0WzE0XSA9IHBEc3RbMTVdID0gMAotICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7Ly8gVGhlIGxvb3AgYmVsb3cgcGFyc2VzIGFuZCB1bnBhY2tzIHRoZSBpbnB1dCBzdHJlYW0uIFRoZSBDLW1vZGVsIGhhcyAKLSAgICAgICAgOy8vIGEgc29tZXdoYXQgY29tcGxpY2F0ZWQgbG9naWMgZm9yIHNpZ24gZXh0ZW5zaW9uLiAgQnV0IGluIHRoZSB2NiB2ZXJzaW9uLAotICAgICAgICA7Ly8gdGhhdCBjYW4gYmUgZWFzaWx5IHRha2VuIGNhcmUgYnkgbG9hZGluZyB0aGUgZGF0YSBmcm9tIDxwU3JjPiBzdHJlYW0gYXMgCi0gICAgICAgIDsvLyBTSUdORUQgYnl0ZS9oYWxmd29yZC4gU28sIGJhc2VkIG9uIHRoZSBmaXJzdCBUU1QgaW5zdHJ1Y3Rpb24sIDgtYml0cyBvciAKLSAgICAgICAgOy8vIDE2LWJpdHMgYXJlIHJlYWQuCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gTmV4dCwgdG8gY29tcHV0ZSB0aGUgb2Zmc2V0LCB3aGVyZSB0aGUgdW5wYWNrZWQgdmFsdWUgbmVlZHMgdG8gYmUgc3RvcmVkLAotICAgICAgICA7Ly8gd2UgbW9kaWZ5IHRoZSBjb21wdXRhdGlvbiB0byBwZXJmb3JtIFsoRmxhZyAmIDE1KSA8IDFdIGFzIFsoRmxhZyA8IDEpICYgMzFdCi0gICAgICAgIDsvLyBUaGlzIHJlc3VsdHMgaW4gYSBzYXZpbmcgb2Ygb25lIGN5Y2xlLgotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotdW5wYWNrTG9vcAotICAgICAgICBUU1QgICAgICBGbGFnLCAgIzB4MTAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcHV0aW5nIChGbGFnICYgMHgxMCkKLSAgICAgICAgTERSU0JORSAgVmFsdWUyLFtwU3JjLCMxXSAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgYnl0ZSB3aXNlIHRvIGF2b2lkIHVuYWxpZ25lZCBhY2Nlc3MgICAKLSAgICAgICAgTERSQk5FICAgVmFsdWUsIFtwU3JjXSwgIzIgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEFORCAgICAgIHN0ck9mZnNldCwgY3N0T2Zmc2V0LCBGbGFnLCBMU0wgIzEgIDsvLyBzdHJPZmZzZXQgPSAoRmxhZyAmIDE1KSA8IDE7Ci0gICAgICAgIExEUlNCRVEgIFZhbHVlLCBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgIDsvLyBWYWx1ZSA9IChPTVhfVTgpICAqcFNyYysrCi0gICAgICAgIE9SUk5FICAgIFZhbHVlLFZhbHVlLFZhbHVlMiwgTFNMICM4ICAgICAgICAgIDsvLyBWYWx1ZSA9IChPTVhfVTE2KSAqcFNyYysrCi0gICAgICAgIAotICAgICAgICBUU1QgICAgICBGbGFnLCAgIzB4MjAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcHV0aW5nIChGbGFnICYgMHgyMCkgdG8gY2hlY2ssIGlmIHdlJ3JlIGRvbmUKLSAgICAgICAgTERSQkVRICAgRmxhZywgIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICAgOy8vIEZsYWcgID0gKE9NWF9VOCkgKnBTcmMrKywgZm9yIG5leHQgaXRlcmF0aW9uCi0gICAgICAgIFNUUkggICAgIFZhbHVlLCBbcERzdCwgc3RyT2Zmc2V0XSAgICAgICAgICAgIDsvLyBTdG9yZSA8VmFsdWU+IGF0IG9mZnNldCA8c3RyT2Zmc2V0PgotICAgICAgICBCRVEgICAgICB1bnBhY2tMb29wICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBsb29wIGJlZ2lubmluZwotICAgICAgICAKLSAgICAgICAgU1RSICAgICAgcFNyYywgW3BwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIFVwZGF0ZSB0aGUgYml0c3RyZWFtIHBvaW50ZXIKLSAgICAgICAgTV9FTkQKLSAgICAKLSAgICBFTkRJRgotICAgIAotICAgIAotICAgIAotICAgIEVORAotICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTY0NDhkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDEyMjkwCi0gKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBpbnRyYSBjaHJvbWEgZGVibG9jawotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGRlYmxvY2tpbmcgZmlsdGVyaW5nIG9uIGFsbCBlZGdlcyBvZiB0aGUgY2hyb21hIG1hY3JvYmxvY2sgKDE2eDE2KS4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBTcmNEc3QgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrLiBNdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLgotICogW2luXQlzcmNkc3RTdGVwICAgICAgU3RlcCBvZiB0aGUgYXJyYXlzCi0gKiBbaW5dCXBBbHBoYSAgICAgICAgICBwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IGV4dGVybmFsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9Ci0gKiBbaW5dCXBCZXRhCQkJcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBiZXRhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IGV4dGVybmFsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsICBob3Jpem9udGFsIGVkZ2UsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsICBob3Jpem9udGFsIGVkZ2UgfQotICogW2luXQlwVGhyZXNob2xkcwkJQUFycmF5IG9mIHNpemUgIDh4MiBvZiBUaHJlc2hvbGRzIChUQzApICh2YWx1ZXMgZm9yIHRoZSBsZWZ0IG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm92ZSBlZGdlIG9mIGVhY2ggNHgyIG9yIDJ4NCBibG9jaywgYXJyYW5nZWQgaW4gIHZlcnRpY2FsIGJsb2NrIG9yZGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbiAgaG9yaXpvbnRhbCBibG9jayBvcmRlcikKLSAqIFtpbl0JcEJTCQkJCWFycmF5IG9mIHNpemUgMTZ4MiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIG9yZGVyIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzKTsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4xXT09IDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLgotICogW291dF0JcFNyY0RzdAkJcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jawotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgotICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCi0gKiAgIC0gRWl0aGVyIG9mIHRoZSBwb2ludGVycyBpbiBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVHJlc2hvbGRzLCBvciBwQlMgaXMgTlVMTC4KLSAqICAgLSBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4KLSAqICAgLSBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4KLSAqICAgLSBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAocEJTW2ldPT00ICYmIHBCU1tpXjFdIT00KSBmb3IgMDw9aTw9My4KLSAqICAgLSBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0koCi0JT01YX1U4KiBwU3JjRHN0LCAKLQlPTVhfUzMyIHNyY2RzdFN0ZXAsIAotCWNvbnN0IE9NWF9VOCogcEFscGhhLCAKLQljb25zdCBPTVhfVTgqIHBCZXRhLCAKLQljb25zdCBPTVhfVTgqIHBUaHJlc2hvbGRzLAotICAgIGNvbnN0IE9NWF9VOCAqcEJTCi0pCi17Ci0gICAgT01YUmVzdWx0IGVycm9yQ29kZTsKLSAgICAKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiA3LCAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJldGEgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzID09IE5VTEwsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0koCi0gICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBwQlMpOwotCi0gICAgYXJtUmV0QXJnRXJySWYoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIsIGVycm9yQ29kZSkKLSAgICAKLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JKAotICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGErMiwgcEJldGErMiwgcFRocmVzaG9sZHMrOCwgcEJTKzE2KTsKLQotICAgIHJldHVybiBlcnJvckNvZGU7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I4OWJlNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDEyMjkwCi0gKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBsdW1hIGRlYmxvY2sKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0gCi0KLS8qKgotICogRnVuY3Rpb246IG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBkZWJsb2NrIGZpbHRlcmluZyB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgZWRnZXMgb2YgYSBsdW1hIG1hY3JvYmxvY2sKLSAqKDE2eDE2KS4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBTcmNEc3QgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrLiBNdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLgotICogW2luXQlzcmNkc3RTdGVwICAgICAgaW1hZ2Ugd2lkdGgKLSAqIFtpbl0JcEFscGhhICAgICAgICAgIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgZXh0ZXJuYWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCBob3Jpem9udGFsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0KLSAqIFtpbl0JcEJldGEJCQlwb2ludGVyIHRvIGEgMngyIHRhYmxlIG9mIGJldGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgZXh0ZXJuYWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgIGhvcml6b250YWwgZWRnZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwgIGhvcml6b250YWwgZWRnZSB9Ci0gKiBbaW5dCXBUaHJlc2hvbGRzCQlwb2ludGVyIHRvIGEgMTZ4MiB0YWJsZSBvZiB0aHJlc2hvbGQgKFRDMCksIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IHZhbHVlcyBmb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlICBsZWZ0IG9yIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIGFycmFuZ2VkIGluICB2ZXJ0aWNhbCBibG9jayBvcmRlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbiBob3Jpem9udGFsIGJsb2NrIG9yZGVyKQotICogW2luXQlwQlMJCQkJIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIEJTIHBhcmFtZXRlcnMgYXJyYW5nZWQgaW4gc2NhbiBibG9jayBvcmRlciBmb3IgdmVydGljYWwgZWRnZXMgYW5kIHRoZW4gaG9yaXpvbnRhbCBlZGdlczsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4xXT09IDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLgotICogW291dF0JcFNyY0RzdAkJcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKLSAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cwotICogICAgLSBFaXRoZXIgb2YgdGhlIHBvaW50ZXJzIGluIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUcmVzaG9sZHMgb3IgcEJTIGlzIE5VTEwuCi0gKiAgICAtIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLgotICogICAgLSBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDgKLSAqICAgIC0gcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgKHBCU1tpXT09NCAmJiBwQlNbaV4xXSE9NCkgZm9yIDA8PWk8PTMuCi0uCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0koCi0JT01YX1U4KiBwU3JjRHN0LCAKLQlPTVhfUzMyIHNyY2RzdFN0ZXAsIAotCWNvbnN0IE9NWF9VOCogcEFscGhhLCAKLQljb25zdCBPTVhfVTgqIHBCZXRhLCAKLQljb25zdCBPTVhfVTgqIHBUaHJlc2hvbGRzLCAKLQljb25zdCBPTVhfVTggKnBCUwotKQotewotICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7Ci0gICAgCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoc3JjZHN0U3RlcCAmIDcsICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7ICAgIAotICAgIGFybVJldEFyZ0VycklmKHBBbHBoYSA9PSBOVUxMLCAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCZXRhID09IE5VTEwsICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzID09IE5VTEwsICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwVGhyZXNob2xkcyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQlMgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBCUyksICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0koCi0gICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBwQlMpOwotCi0gICAgYXJtUmV0QXJnRXJySWYoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIsIGVycm9yQ29kZSkKLSAgICAKLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSgKLSAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhKzIsIHBCZXRhKzIsIHBUaHJlc2hvbGRzKzE2LCBwQlMrMTYpOwotCi0gICAgcmV0dXJuIGVycm9yQ29kZTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTBmMzQ4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICAxMjI5MAotICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgZGVjb2RlIGNvZWZmaWNpZW50cyBtb2R1bGUKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246IG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQwotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgcmFzdGVyIHNjYW4gZm9yIDJ4MiBibG9jayBvZiAKLSAqIENocm9tYURDTGV2ZWwuIFRoZSBkZWNvZGVkIGNvZWZmaWNpZW50cyBpbiBwYWNrZWQgcG9zaXRpb24tY29lZmZpY2llbnQgCi0gKiBidWZmZXIgYXJlIHN0b3JlZCBpbiBpbmNyZWFzaW5nIHJhc3RlciBzY2FuIG9yZGVyLCBuYW1lbHkgcG9zaXRpb24gb3JkZXIuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0KLSAqCQkJCQkJCQlidWZmZXIKLSAqIFtpbl0JcE9mZnNldAkJCVBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCi0gKgkJCQkJCQkJcG9pbnRlZCB0byBieSAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKLSAqIFtvdXRdCXBPZmZzZXQJCQkqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAotICogW291dF0JcE51bUNvZWZmCQlQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMKLSAqCQkJCQkJCQlpbiB0aGlzIGJsb2NrCi0gKiBbb3V0XQlwcFBvc0NvZWZidWYJRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwKLSAqCQkJCQkJCQljb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlcgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgKAotICAgICBjb25zdCBPTVhfVTgqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX1MzMiogcE9mZnNldCwKLSAgICAgT01YX1U4KiBwTnVtQ29lZmYsCi0gICAgIE9NWF9VOCoqIHBwUG9zQ29lZmJ1ZiAgICAgICAgCi0gKQotCi17Ci0gICAgcmV0dXJuIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBwTnVtQ29lZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwUG9zQ29lZmJ1ZiwgMTcsIDQpOwotCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTc4YjRjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDEyMjkwCi0gKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBkZWNvZGUgY29lZmZpY2llbnRzIG1vZHVsZQotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQwotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIDR4NCBibG9jayBvZiAKLSAqIEludHJhMTZ4MTZEQ0xldmVsLCBJbnRyYTE2eDE2QUNMZXZlbCxMdW1hTGV2ZWwsIGFuZCBDaHJvbWFBQ0xldmVsLiAKLSAqIEludmVyc2UgZmllbGQgc2NhbiBpcyBub3Qgc3VwcG9ydGVkLiBUaGUgZGVjb2RlZCBjb2VmZmljaWVudHMgaW4gcGFja2VkIAotICogcG9zaXRpb24tY29lZmZpY2llbnQgYnVmZmVyIGFyZSBzdG9yZWQgaW4gaW5jcmVhc2luZyB6aWd6YWcgb3JkZXIgaW5zdGVhZCAKLSAqIG9mIHBvc2l0aW9uIG9yZGVyLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBCaXRTdHJlYW0JCURvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlcgotICogW2luXQlwT2Zmc2V0CQkJUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKgkJCQkJCQkJdG8gYnkgKnBwQml0U3RyZWFtCi0gKiBbaW5dCXNNYXhOdW1Db2VmZglNYXhpbXVtIG51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgaW4gY3VycmVudAotICoJCQkJCQkJCWJsb2NrCi0gKiBbaW5dCXNWTENTZWxlY3QJCVZMQyB0YWJsZSBzZWxlY3Rvciwgb2J0YWluZWQgZnJvbSBudW1iZXIgb2Ygbm9uLXplcm8KLSAqCQkJCQkJCQlBQyBjb2VmZmljaWVudHMgb2YgYWJvdmUgYW5kIGxlZnQgNHg0IGJsb2Nrcy4gSXQgaXMgCi0gKgkJCQkJCQkJZXF1aXZhbGVudCB0byB0aGUgdmFyaWFibGUgbkMgZGVzY3JpYmVkIGluIEguMjY0IHN0YW5kYXJkIAotICoJCQkJCQkJCXRhYmxlIDktNSwgZXhjZXB0IGl0cyB2YWx1ZSBjYW6hr3QgYmUgbGVzcyB0aGFuIHplcm8uCi0gKiBbb3V0XQlwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCi0gKiBbb3V0XQlwT2Zmc2V0CQkJKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKLSAqIFtvdXRdCXBOdW1Db2VmZgkJUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluCi0gKgkJCQkJCQkJdGhpcyBibG9jawotICogW291dF0JcHBQb3NDb2VmYnVmCURvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsCi0gKgkJCQkJCQkJY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDKAotICAgICBjb25zdCBPTVhfVTgqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX1MzMiogcE9mZnNldCwKLSAgICAgT01YX1U4KiBwTnVtQ29lZmYsCi0gICAgIE9NWF9VOCoqcHBQb3NDb2VmYnVmLAotICAgICBPTVhfSU5UIHNWTENTZWxlY3QsCi0gICAgIE9NWF9JTlQgc01heE51bUNvZWZmICAgICAgICAKLSApCi17Ci0gICAgcmV0dXJuIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBwTnVtQ29lZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwUG9zQ29lZmJ1Ziwgc1ZMQ1NlbGVjdCwgc01heE51bUNvZWZmKTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGRfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Nzg3OTgyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTAgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGRfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotOy8vIERlc2NyaXB0aW9uOgotOy8vIEguMjY0IGludmVyc2UgcXVhbnRpemUgYW5kIHRyYW5zZm9ybSBtb2R1bGUKLTsvLyAKLTsvLyAKLQotICAgICAgICAKLQotOy8vIEluY2x1ZGUgc3RhbmRhcmQgaGVhZGVycwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi07Ly8gSW1wb3J0IHN5bWJvbHMgcmVxdWlyZWQgZnJvbSBvdGhlciBmaWxlcwotOy8vIChGb3IgZXhhbXBsZSB0YWJsZXMpCi0gICAgCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0Ci0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0Ci0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1FQRGl2VGFibGUKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVk1hdHJpeFUxNgotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlIAotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotICAgICAgICAKLTsvLyBTZXQgZGVidWdnaW5nIGxldmVsICAgICAgICAKLTsvL0RFQlVHX09OICAgIFNFVEwge1RSVUV9Ci0KLQotOy8vIFN0YXRpYyBGdW5jdGlvbjogYXJtVkNNNFAxMF9EZXF1YW50THVtYUFDNHg0Ci0KLTsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKLSAgICAKLSAKLQotOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQotICAgIAotCi0KLQotCi0KLTsvLyBGdW5jdGlvbjogb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCAgICAgICAgICAgIAotICAgIAotOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQotICAgIAotICAgIAotICAgIAotOy8vIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICAgICAgICAgICAgCi0gICAgCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0gICAgCi0gICAgSUYgIENvcnRleEE4Ci0gICAgCi0KLTsvLyBBUk0gUmVnaXN0ZXJzCi0KLTsvL0lucHV0IFJlZ2lzdGVycwotcHBTcmMgICAgICAgUk4gIDAKLXBQcmVkICAgICAgIFJOICAxCi1wREMgICAgICAgICBSTiAgMgotcERzdCAgICAgICAgUk4gIDMKLSAgIAotCi07Ly9PdXRwdXQgUmVnaXN0ZXJzCi1yZXN1bHQgICAgICBSTiAgMAotCi07Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycwotCi07Ly9SZWdpc3RlcnMgdXNlZCBpbiBhcm1WQ000UDEwX0RlcXVhbnRMdW1hQUM0eDQKLXBRUGRpdiAgICAgIFJOICAxMAotcFFQbW9kICAgICAgUk4gIDExCi1wVlJvdyAgICAgICBSTiAgMgotUVBtb2QgICAgICAgUk4gIDEyCi1zaGlmdCAgICAgICBSTiAgMTQKLWluZGV4MCAgICAgIFJOICAxIAotaW5kZXgxICAgICAgUk4gIDEwIAotCi07Ly9SZWdpc3RlcnMgdXNlZCBpbiBEZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZAotcERlbHRhICAgICAgUk4gIDQKLXBEZWx0YVRtcCAgIFJOICA2Ci1BQyAgICAgICAgICBSTiAgNSAgICAgICAgICAgICAgICAgICA7Ly9Mb2FkIGZyb20gc3RhY2sKLXBQcmVkVGVtcCAgIFJOICA3Ci1wRENUZW1wICAgICBSTiAgOAotcERzdFRlbXAgICAgUk4gIDkKLXBEZWx0YUFyZzEgIFJOICAxCi1wRGVsdGFBcmcwICBSTiAgMAotUVAgICAgICAgICAgUk4gIDEgICAgICAgICAgICAgICAgICAgOy8vTG9hZCBmcm9tIHN0YWNrCi1EQ3ZhbCAgICAgICBSTiAgMTAgIAotcHJlZHN0ZXAgICAgUk4gIDEKLWRzdFN0ZXAgICAgIFJOICAxMAotUHJlZFZhbDEgICAgUk4gIDMKLVByZWRWYWwyICAgIFJOICA1Ci0KLQotCi0KLTsvLyBOZW9uIFJlZ2lzdGVycwotCi07Ly8gUmVnaXN0ZXJzIHVzZWQgaW4gYXJtVkNNNFAxMF9EZXF1YW50THVtYUFDNHg0Ci0KLWRWbWF0cml4ICAgICAgICAgICAgRE4gIEQ2LjggIAotZGluZGV4Um93MCAgICAgICAgICBETiAgRDcuMzIgCi1kaW5kZXhSb3cxICAgICAgICAgIEROICBEOS4zMiAKLWRCeXRlSW5kZXhSb3cwICAgICAgRE4gIEQ3LjgKLWRCeXRlSW5kZXhSb3cxICAgICAgRE4gIEQ5LjgKLWRWUm93MCAgICAgICAgICAgICAgRE4gIEQ4LjggIAotZFZSb3cxICAgICAgICAgICAgICBETiAgRDQuOAotZFZSb3cwVTE2ICAgICAgICAgICBETiAgRDguVTE2Ci1kVlJvdzFVMTYgICAgICAgICAgIEROICBENC5VMTYKLWRWUm93MlUxNiAgICAgICAgICAgRE4gIEQ4LlUxNgotZFZSb3czVTE2ICAgICAgICAgICBETiAgRDQuVTE2Ci0KLWRTaGlmdCAgICAgICAgICAgICAgRE4gIEQ1LlUxNgotZFNyY1JvdzAgICAgICAgICAgICBETiAgRDAuSTE2Ci1kU3JjUm93MSAgICAgICAgICAgIEROICBEMS5JMTYKLWRTcmNSb3cyICAgICAgICAgICAgRE4gIEQyLkkxNiAgICAKLWRTcmNSb3czICAgICAgICAgICAgRE4gIEQzLkkxNgotZERxbnRSb3cwICAgICAgICAgICBETiAgRDAuSTE2ICAKLWREcW50Um93MSAgICAgICAgICAgRE4gIEQxLkkxNiAKLWREcW50Um93MiAgICAgICAgICAgRE4gIEQyLkkxNiAKLWREcW50Um93MyAgICAgICAgICAgRE4gIEQzLkkxNiAgCi0KLTsvLyBSZWdpc3RlcnMgdXNlZCBpbiBUcmFuc2Zvcm1SZXNpZHVhbDR4NAotCi07Ly8gUGFja2VkIElucHV0IHBpeGVscwotZEluMCAgICAgICAgICAgICAgICBETiAgRDAuUzE2ICAgICAgIAotZEluMSAgICAgICAgICAgICAgICBETiAgRDEuUzE2ICAgICAgIAotZEluMiAgICAgICAgICAgICAgICBETiAgRDIuUzE2ICAgICAgIAotZEluMyAgICAgICAgICAgICAgICBETiAgRDMuUzE2Ci1xSW4wMSAgICAgICAgICAgICAgIFFOICBRMC4zMgotcUluMjMgICAgICAgICAgICAgICBRTiAgUTEuMzIKLQotOy8vIEludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMgICAgICAgCi1kWmVybyAgICAgICAgICAgICAgIEROICBENC5TMTYKLWRlMCAgICAgICAgICAgICAgICAgRE4gIEQ1LlMxNgotZGUxICAgICAgICAgICAgICAgICBETiAgRDYuUzE2Ci1kZTIgICAgICAgICAgICAgICAgIEROICBENy5TMTYKLWRlMyAgICAgICAgICAgICAgICAgRE4gIEQ4LlMxNgotZEluMVJTICAgICAgICAgICAgICBETiAgRDcuUzE2Ci1kSW4zUlMgICAgICAgICAgICAgIEROICBEOC5TMTYKLWRmMCAgICAgICAgICAgICAgICAgRE4gIEQwLlMxNgotZGYxICAgICAgICAgICAgICAgICBETiAgRDEuUzE2Ci1kZjIgICAgICAgICAgICAgICAgIEROICBEMi5TMTYKLWRmMyAgICAgICAgICAgICAgICAgRE4gIEQzLlMxNgotcWYwMSAgICAgICAgICAgICAgICBRTiAgUTAuMzIKLXFmMjMgICAgICAgICAgICAgICAgUU4gIFExLjMyCi1kZzAgICAgICAgICAgICAgICAgIEROICBENS5TMTYKLWRnMSAgICAgICAgICAgICAgICAgRE4gIEQ2LlMxNgotZGcyICAgICAgICAgICAgICAgICBETiAgRDcuUzE2Ci1kZzMgICAgICAgICAgICAgICAgIEROICBEOC5TMTYKLWRmMVJTICAgICAgICAgICAgICAgRE4gIEQ3LlMxNgotZGYzUlMgICAgICAgICAgICAgICBETiAgRDguUzE2Ci0KLTsvLyBPdXRwdXQgcGl4ZWxzCi1kaDAgICAgICAgICAgICAgICAgIEROICBEMC5TMTYKLWRoMSAgICAgICAgICAgICAgICAgRE4gIEQxLlMxNgotZGgyICAgICAgICAgICAgICAgICBETiAgRDIuUzE2Ci1kaDMgICAgICAgICAgICAgICAgIEROICBEMy5TMTYgCi0KLTsvLyBSZWdpc3RlcnMgdXNlZCBpbiBEZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZAotCi1kRGVsdGFSb3cwICAgICAgICAgIEROICBEMC5TMTYKLWREZWx0YVJvdzEgICAgICAgICAgRE4gIEQxLlMxNgotZERlbHRhUm93MiAgICAgICAgICBETiAgRDIuUzE2Ci1kRGVsdGFSb3czICAgICAgICAgIEROICBEMy5TMTYKLXFEZWx0YVJvdzAxICAgICAgICAgUU4gIFEwLlMxNgotcURlbHRhUm93MjMgICAgICAgICBRTiAgUTEuUzE2Ci0KLWRQcmVkVmFsUm93MDEgICAgICAgRE4gIEQ0LlU4Ci1kUHJlZFZhbFJvdzIzICAgICAgIEROICBENS5VOAotCi1xU3VtUm93MDEgICAgICAgICAgIFFOICBRMy5TMTYKLXFTdW1Sb3cyMyAgICAgICAgICAgUU4gIFE0LlMxNgotZERzdFJvdzAxICAgICAgICAgICBETiAgRDAuVTgKLWREc3RSb3cyMyAgICAgICAgICAgRE4gIEQxLlU4Ci1kRHN0Um93MCAgICAgICAgICAgIEROICBEMC4zMlswXQotZERzdFJvdzEgICAgICAgICAgICBETiAgRDAuMzJbMV0KLWREc3RSb3cyICAgICAgICAgICAgRE4gIEQxLjMyWzBdCi1kRHN0Um93MyAgICAgICAgICAgIEROICBEMS4zMlsxXQotICAgIAotICAgICAgICAgICAKLSAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgotICAgICAgICBNX0FMTE9DOCBwQnVmZmVyLCAzMgotICAgICAgICAgICAgICAgCi0KLSAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCxyMTEsZDkKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCi0gICAgICAgIE1fQVJHICAgcHJlZFN0ZXBPblN0YWNrLCA0Ci0gICAgICAgIE1fQVJHICAgZHN0U3RlcE9uU3RhY2ssNAotICAgICAgICBNX0FSRyAgIFFQT25TdGFjaywgNAotICAgICAgICBNX0FSRyAgIEFDT25TdGFjayw0Ci0gIAotICAgICAgICAKLSAgICAgICAgTV9BRFIgICBwRGVsdGEscEJ1ZmZlciAKLSAgICAgICAgTV9MRFIgICBBQyxBQ09uU3RhY2sgCi0gICAgICAgIAotICAgICAgICAgCi0gICAgICAgIDsvLyBTYXZlIHJlZ2lzdGVycyByMSxyMixyMyBiZWZvcmUgZnVuY3Rpb24gY2FsbCAgICAKLSAgICAgICAgTU9WICAgICBwUHJlZFRlbXAscFByZWQKLSAgICAgICAgTU9WICAgICBwRENUZW1wLHBEQwotICAgICAgICBNT1YgICAgIHBEc3RUZW1wLHBEc3QKLSAgICAgICAgCi0gICAgICAgIENNUCAgICAgQUMsIzAKLSAgICAgICAgQkVRICAgICBEQ2Nhc2UKLSAgICAgICAgTU9WICAgICBwRGVsdGFBcmcxLHBEZWx0YSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgdXAgcjEgZm9yIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKLSAgICAKLSAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0Ci0gICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsvLyBhcm1WQ000UDEwX0RlcXVhbnRMdW1hQUM0eDQgOiBzdGF0aWMgZnVuY3Rpb24gaW5saW5lZAotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLSAgICAgICAgOy8vQkwgICAgICBhcm1WQ000UDEwX0RlcXVhbnRMdW1hQUM0eDQKLSAgICAgICAgTV9MRFIgICBRUCxRUE9uU3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgdXAgcjEgZm9yIGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NAotICAgICAgICAgICAgICAgIAotICAgICAgICBMRFIgICAgcFFQbW9kLD1hcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKLSAgICAgICAgTERSICAgIHBRUGRpdiw9YXJtVkNNNFAxMF9RUERpdlRhYmxlICAgICAgICAKLSAgICAgICAgTERSICAgIHBWUm93LD1hcm1WQ000UDEwX1ZNYXRyaXhVMTYKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBMRFJTQiAgUVBtb2QsW3BRUG1vZCxRUF0gICAgICAgICAgICAgICAgICAgIDsvLyAoUVAlNikgKiA2Ci0gICAgICAgIExEUlNCICBzaGlmdCxbcFFQZGl2LFFQXSAgICAgICAgICAgICAgICAgICAgOy8vIFNoaWZ0ID0gUVAgLyA2Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIExEUiAgICBpbmRleDEsPTB4MDMwMjA1MDQgCi0gICAgICAgIExEUiAgICBpbmRleDAsPTB4MDUwNDAxMDAgICAgICAgICAgICAgICAgICAgOy8vIEluZGV4ZXMgaW50byBkVm1hdHJpeAotICAgICAgICBBREQgICAgcFZSb3cscFZSb3csUVBtb2QKLSAgICAgICAgVkRVUCAgIGRpbmRleFJvdzAsaW5kZXgwIAotICAgICAgICBWRFVQICAgZGluZGV4Um93MSxpbmRleDEKLSAgICAgICAgVkRVUCAgIGRTaGlmdCxzaGlmdCAKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIGFsbCA0eDQgcFZSb3dbXSB2YWx1ZXMKLSAgICAgICAgVkxEMSAgIGRWbWF0cml4LFtwVlJvd10gICAgICAgICAgICAgICAgICAgICA7Ly8gZFZtYXRyaXggPSBbMGR8MGN8MGJ8MGFdCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgVlRCTCAgIGRWUm93MCxkVm1hdHJpeCxkQnl0ZUluZGV4Um93MCAgICAgICA7Ly8gcm93MCA9IHJvdzIgPSBbcFZSb3dbMl0gfCBwVlJvd1swXSB8IHBWUm93WzJdIHwgcFZSb3dbMF1dCi0gICAgICAgIFZUQkwgICBkVlJvdzEsZFZtYXRyaXgsZEJ5dGVJbmRleFJvdzEgICAgICAgOy8vIHJvdzEgPSByb3czID0gW3BWUm93WzFdIHwgcFZSb3dbMl0gfCBwVlJvd1sxXSB8IHBWUm93WzJdXQotICAgICAgICBDTVAgICAgIHBEQ1RlbXAsIzAKLSAgICAgICAgOy8vIExvYWQgYWxsIHRoZSA0eDQgJ3NyYycgdmFsdWVzICAKLSAgICAgICAgVkxEMSAgIHsgZFNyY1JvdzAsZFNyY1JvdzEsZFNyY1JvdzIsZFNyY1JvdzMgfSxbcERlbHRhXSAKLSAgICAgICAgCi0gICAgICAgIFZTSEwgICBkVlJvdzBVMTYsZFZSb3cwVTE2LGRTaGlmdCAKLSAgICAgICAgVlNITCAgIGRWUm93MVUxNixkVlJvdzFVMTYsZFNoaWZ0IAotICAgICAgICBMRFJTSE5FIERDdmFsLFtwRENUZW1wXQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBNdWx0aXBseSBzcmNbXSB3aXRoIHBWUm93W10KLSAgICAgICAgVk1VTCAgICBkRHFudFJvdzAsZFNyY1JvdzAsZFZSb3cwVTE2Ci0gICAgICAgIFZNVUwgICAgZERxbnRSb3cxLGRTcmNSb3cxLGRWUm93MVUxNgotICAgICAgICBWTVVMICAgIGREcW50Um93MixkU3JjUm93MixkVlJvdzJVMTYKLSAgICAgICAgVk1VTCAgICBkRHFudFJvdzMsZFNyY1JvdzMsZFZSb3czVTE2Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOy8vIFRyYW5zZm9ybVJlc2lkdWFsNHg0IDogSW5saW5lZCB0byBhdm9pZCBMb2FkL1N0b3JlcwotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vQkwgICAgICBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0Ci0gICAgICAgIDsvL1NUUkhORSAgREN2YWwsW3BEZWx0YV0KLSAgICAgICAgVk1PVk5FICAgIGRJbjBbMF0sREN2YWwKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgaW5wdXQgcGl4ZWxzIDogcGVyZm9ybSBSb3cgb3BzIGFzIENvbCBvcHMKLSAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgCi0gICAgICAgIFZUUk4gICAgZEluMCxkSW4xCi0gICAgICAgIFZUUk4gICAgZEluMixkSW4zCi0gICAgICAgIFZUUk4gICAgcUluMDEscUluMjMgCi0gICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZNT1YgICAgZFplcm8sIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVXNlZCB0byByaWdodCBzaGlmdCBieSAxIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gICAgICAgIDsvLyBSb3cgT3BlcmF0aW9ucyAoUGVyZm9ybWVkIG9uIGNvbHVtbnMpCi0gICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgVkFERCAgICAgICAgZGUwLGRJbjAsZEluMiAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMCA9IGQwICsgZDIgCi0gICAgICAgIFZTVUIgICAgICAgIGRlMSxkSW4wLGRJbjIgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUxID0gZDAgLSBkMiAKLSAgICAgICAgVkhBREQgICAgICAgZEluMVJTLGRJbjEsZFplcm8gICAgICAgICAgICAgICAgICAgOy8vIChmMT4+MSkgY29uc3RaZXJvIGlzIGEgcmVnaXN0ZXIgaG9sZGluZyAwCi0gICAgICAgIFZIQUREICAgICAgIGRJbjNSUyxkSW4zLGRaZXJvCi0gICAgICAgIFZTVUIgICAgICAgIGRlMixkSW4xUlMsZEluMyAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTIgPSAoZDE+PjEpIC0gZDMgCi0gICAgICAgIFZBREQgICAgICAgIGRlMyxkSW4xLGRJbjNSUyAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTMgPSBkMSArIChkMz4+MSkgCi0gICAgICAgIFZBREQgICAgICAgIGRmMCxkZTAsZGUzICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjAgPSBlMCArIGUzCi0gICAgICAgIFZBREQgICAgICAgIGRmMSxkZTEsZGUyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjEgPSBlMSArIGUyCi0gICAgICAgIFZTVUIgICAgICAgIGRmMixkZTEsZGUyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjIgPSBlMSAtIGUyCi0gICAgICAgIFZTVUIgICAgICAgIGRmMyxkZTAsZGUzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjMgPSBlMCAtIGUzCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIHJlc3VsdGFudCBtYXRyaXgKLSAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgCi0gICAgICAgIFZUUk4gICAgZGYwLGRmMQotICAgICAgICBWVFJOICAgIGRmMixkZjMKLSAgICAgICAgVlRSTiAgICBxZjAxLHFmMjMgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgICAgICAgOy8vIENvbG91bW4gT3BlcmF0aW9ucyAKLSAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWQUREICAgICAgICBkZzAsZGYwLGRmMiAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUwID0gZDAgKyBkMiAKLSAgICAgICAgVlNVQiAgICAgICAgZGcxLGRmMCxkZjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMSA9IGQwIC0gZDIgCi0gICAgICAgIFZIQUREICAgICAgIGRmMVJTLGRmMSxkWmVybyAgICAgICAgICAgICAgICAgICAgIDsvLyAoZjE+PjEpIGNvbnN0WmVybyBpcyBhIHJlZ2lzdGVyIGhvbGRpbmcgMAotICAgICAgICBWSEFERCAgICAgICBkZjNSUyxkZjMsZFplcm8KLSAgICAgICAgVlNVQiAgICAgICAgZGcyLGRmMVJTLGRmMyAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMiA9IChkMT4+MSkgLSBkMyAKLSAgICAgICAgVkFERCAgICAgICAgZGczLGRmMSxkZjNSUyAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTMgPSBkMSArIChkMz4+MSkgCi0gICAgICAgIFZBREQgICAgICAgIGRoMCxkZzAsZGczICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjAgPSBlMCArIGUzCi0gICAgICAgIFZBREQgICAgICAgIGRoMSxkZzEsZGcyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjEgPSBlMSArIGUyCi0gICAgICAgIFZTVUIgICAgICAgIGRoMixkZzEsZGcyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjIgPSBlMSAtIGUyCi0gICAgICAgIFZTVUIgICAgICAgIGRoMyxkZzAsZGczICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjMgPSBlMCAtIGUzCi0gICAgICAgIAotICAgICAgICAgICAgIAotICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vIENhbGN1bGF0ZSBmaW5hbCB2YWx1ZSAoY29sT3BbaV1bal0gKyAzMik+PjYKLSAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIAotICAgICAgICBWUlNIUiAgICAgICBkaDAsIzYKLSAgICAgICAgVlJTSFIgICAgICAgZGgxLCM2Ci0gICAgICAgIFZSU0hSICAgICAgIGRoMiwjNgotICAgICAgICBWUlNIUiAgICAgICBkaDMsIzYKLSAgICAgICAgCi0gICAgICAgICAgICAgICAKLSAgICAgICAgQiAgICAgICBPdXREQ2Nhc2UgCi0gICAgICAgIAotCi1EQ2Nhc2UKLSAgICAgICAgOy8vIENhbGN1bGF0ZSB0aGUgVHJhbnNmb3JtZWQgREN2YWx1ZSA6IChEQ3ZhbCszMik+PjYKLSAgICAgICAgTERSU0ggICBEQ3ZhbCxbcERDVGVtcF0gCi0gICAgICAgIEFERCAgICAgREN2YWwsREN2YWwsIzMyIAotICAgICAgICBBU1IgICAgIERDdmFsLERDdmFsLCM2Ci0gICAgICAgIAotICAgICAgICBWRFVQICAgIGREZWx0YVJvdzAsIERDdmFsICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERlbHRhWzBdICA9IHBEZWx0YVsxXSAgPSBwRGVsdGFbMl0gID0gcERlbHRhWzNdID0gREN2YWwKLSAgICAgICAgVkRVUCAgICBkRGVsdGFSb3cxLCBEQ3ZhbCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRGVsdGFbNF0gID0gcERlbHRhWzVdICA9IHBEZWx0YVs2XSAgPSBwRGVsdGFbN10gPSBEQ3ZhbAotICAgICAgICBWRFVQICAgIGREZWx0YVJvdzIsIERDdmFsICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBEZWx0YVs4XSAgPSBwRGVsdGFbOV0gID0gcERlbHRhWzEwXSA9IHBEZWx0YVsxMV0gPSBEQ3ZhbAotICAgICAgICBWRFVQICAgIGREZWx0YVJvdzMsIERDdmFsCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLU91dERDY2FzZSAgICAgIAotICAgICAgICBNX0xEUiAgIHByZWRzdGVwLHByZWRTdGVwT25TdGFjawotICAgICAgICBNX0xEUiAgIGRzdFN0ZXAsZHN0U3RlcE9uU3RhY2sKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgUHJlZFZhbDEsW3BQcmVkVGVtcF0scHJlZHN0ZXAKLSAgICAgICAgTERSICAgICBQcmVkVmFsMixbcFByZWRUZW1wXSxwcmVkc3RlcAotICAgICAgICBWTU9WICAgIGRQcmVkVmFsUm93MDEsUHJlZFZhbDEsUHJlZFZhbDIKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgUHJlZFZhbDEsW3BQcmVkVGVtcF0scHJlZHN0ZXAKLSAgICAgICAgTERSICAgICBQcmVkVmFsMixbcFByZWRUZW1wXQotICAgICAgICBWTU9WICAgIGRQcmVkVmFsUm93MjMsUHJlZFZhbDEsUHJlZFZhbDIKLSAKLSAgICAgICAgCi0gICAgICAgIFZBRERXICAgcVN1bVJvdzAxLHFEZWx0YVJvdzAxLGRQcmVkVmFsUm93MDEKLSAgICAgICAgVkFERFcgICBxU3VtUm93MjMscURlbHRhUm93MjMsZFByZWRWYWxSb3cyMwotICAgICAgICBWUU1PVlVOIGREc3RSb3cwMSxxU3VtUm93MDEKLSAgICAgICAgVlFNT1ZVTiBkRHN0Um93MjMscVN1bVJvdzIzCi0gICAgICAgIAotIAotICAgICAgICBWU1QxICAgIGREc3RSb3cwLFtwRHN0VGVtcF0sZHN0U3RlcAotICAgICAgICBWU1QxICAgIGREc3RSb3cxLFtwRHN0VGVtcF0sZHN0U3RlcAotICAgICAgICBWU1QxICAgIGREc3RSb3cyLFtwRHN0VGVtcF0sZHN0U3RlcAotICAgICAgICBWU1QxICAgIGREc3RSb3czLFtwRHN0VGVtcF0KLSAgICAgICAgCi0gICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCi0gICAgICAgIE1PViAgICAgcmVzdWx0LCNPTVhfU3RzX05vRXJyCi0gICAgICAgIAotRW5kICAgICAgICAgICAgICAgIAotCi0gICAgICAgIAotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAotICAgICAgICAKLSAgICAgICAgTV9FTkQKLSAgICAgICAgCi0gICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQ09SVEVYQTggICAKLSAgICAKLSAgICAgICAgIAotICAgICAgICAgICAgCi0gICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA5OWRjYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLQotICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0KLSAgICAgICAgSUYgQ29ydGV4QTgKLQotICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZQotICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTTFQ0X3Vuc2FmZQotICAgICAgICAKLUxPT1BfQ09VTlQgIEVRVSAweDQwMDAwMDAwCi1NQVNLXzMgICAgICBFUVUgMHgwMzAzMDMwMwotTUFTS180ICAgICAgRVFVIDB4MDQwNDA0MDQKLQotOy8vIEZ1bmN0aW9uIGFyZ3VtZW50cwotCi1wU3JjRHN0ICAgICBSTiAwCi1zcmNkc3RTdGVwICBSTiAxCi1wQWxwaGEgICAgICBSTiAyCi1wQmV0YSAgICAgICBSTiAzCi0KLXBUaHJlc2hvbGRzIFJOIDUKLXBCUyAgICAgICAgIFJOIDQKLWJTMzIxMCAgICAgIFJOIDYKLQotOy8vIExvb3AgCi0KLVhZICAgICAgICAgIFJOIDcKLQotOy8vIFBpeGVscwotZFBfMCAgICAgICAgRE4gRDQuVTgKLWRQXzEgICAgICAgIEROIEQ1LlU4ICAKLWRQXzIgICAgICAgIEROIEQ2LlU4ICAKLWRRXzAgICAgICAgIEROIEQ4LlU4ICAKLWRRXzEgICAgICAgIEROIEQ5LlU4ICAKLWRRXzIgICAgICAgIEROIEQxMC5VOCAKLQotOy8vIEZpbHRlcmluZyBEZWNpc2lvbgotZEFscGhhICAgICAgRE4gRDAuVTgKLWRCZXRhICAgICAgIEROIEQyLlU4Ci0KLWRGaWx0ICAgICAgIEROIEQxNi5VOAotZEFxZmxnICAgICAgRE4gRDEyLlU4Ci1kQXBmbGcgICAgICBETiBEMTcuVTggCi0KLWRBcDBxMCAgICAgIEROIEQxMy5VOAotZEFwMXAwICAgICAgRE4gRDEyLlU4Ci1kQXExcTAgICAgICBETiBEMTguVTgKLWRBcDJwMCAgICAgIEROIEQxOS5VOAotZEFxMnEwICAgICAgRE4gRDE3LlU4Ci0KLXFCUzMyMTAgICAgIFFOIFExMy5VMTYKLWRCUzMyMTAgICAgIEROIEQyNgotZE1hc2tfYnMgICAgRE4gRDI3Ci1kRmlsdF9icyAgICBETiBEMjYuVTE2Ci0KLTsvLyBiU0xUNAotZE1hc2tfMCAgICAgRE4gRDE0LlU4Ci1kTWFza18xICAgICBETiBEMTUuVTggICAgCi1kTWFza180ICAgICBETiBEMS5VMTYKLQotTWFza180ICAgICAgUk4gOAotTWFza18zICAgICAgUk4gOQotCi1kVGVtcCAgICAgICBETiBEMTkuVTgKLQotOy8vIFJlc3VsdAotZFBfMHQgICAgICAgRE4gRDEzLlU4ICAgCi1kUV8wdCAgICAgICBETiBEMzEuVTggICAKLQotZFBfMG4gICAgICAgRE4gRDI5LlU4Ci1kUV8wbiAgICAgICBETiBEMjQuVTgKLQotICAgICAgICAKLSAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0ksIHI5LCBkMTUKLSAgICAgICAgCi0gICAgICAgIDsvL0FyZ3VtZW50cyBvbiB0aGUgc3RhY2sKLSAgICAgICAgTV9BUkcgICBwcFRocmVzaG9sZHMsIDQKLSAgICAgICAgTV9BUkcgICBwcEJTLCA0Ci0gICAgICAgIAotICAgICAgICA7Ly8gZDAtZEFscGhhXzAKLSAgICAgICAgOy8vIGQyLWRCZXRhXzAKLQotICAgICAgICA7bG9hZCBhbHBoYTEsYmV0YTEgc29tZXdoZXJlIHRvIGF2b2lkIG1vcmUgbG9hZHMKLSAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV0hCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMSA7PwotICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwCi0gICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXSEgCi0gICAgICAgIAotICAgICAgICBNX0xEUiAgICAgICBwQlMsIHBwQlMKLSAgICAgICAgTV9MRFIgICAgICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcyAKLQotICAgICAgICBMRFIgICAgICAgICBNYXNrXzMsID1NQVNLXzMKLSAgICAgICAgTERSICAgICAgICAgTWFza180LCA9TUFTS180Ci0KLSAgICAgICAgVk1PViAgICAgICAgZE1hc2tfMCwgIzAgICAgIAotICAgICAgICBWTU9WICAgICAgICBkTWFza18xLCAjMSAgICAgCi0gICAgICAgIFZNT1YgICAgICAgIGRNYXNrXzQsICM0ICAgICAKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgIFhZLCA9TE9PUF9DT1VOVAotCi0gICAgICAgIDsvLyBwMC1wMyAtIGQ0LWQ3Ci0gICAgICAgIDsvLyBxMC1xMyAtIGQ4LWQxMQotTG9vcFkgICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBiUzMyMTAsIFtwQlNdLCAjOAotICAgICAgICAKLSAgICAgICAgVkxEMSAgICAgICAgZFBfMiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCi0gICAgICAgIDsxCi0gICAgICAgIFZMRDEgICAgICAgIGRQXzEsIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAotICAgICAgICBDTVAgICAgICAgICBiUzMyMTAsICMwCi0gICAgICAgIFZMRDEgICAgICAgIGRQXzAsIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAotICAgICAgICA7MQotICAgICAgICBWTEQxICAgICAgICBkUV8wLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgVkFCRCAgICAgICAgZEFwMnAwLCBkUF8yLCBkUF8wCi0gICAgICAgIFZMRDEgICAgICAgIGRRXzEsIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAotICAgICAgICBWQUJEICAgICAgICBkQXAwcTAsIGRQXzAsIGRRXzAKLSAgICAgICAgVkxEMSAgICAgICAgZFFfMiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCi0gICAgICAgIEJFUSAgICAgICAgIE5vRmlsdGVyQlMwCi0KLSAgICAgICAgVkFCRCAgICAgICAgZEFwMXAwLCBkUF8xLCBkUF8wCi0gICAgICAgIFZBQkQgICAgICAgIGRBcTFxMCwgZFFfMSwgZFFfMAotCi0gICAgICAgIFZDR1QgICAgICAgIGRGaWx0LCBkQWxwaGEsIGRBcDBxMAotICAgICAgICBWTU9WLlUzMiAgICBkQlMzMjEwWzBdLCBiUzMyMTAKLSAgICAgICAgVk1BWCAgICAgICAgZEFwMXAwLCBkQXExcTAsIGRBcDFwMAotICAgICAgICBWTU9WTCAgICAgICBxQlMzMjEwLCBkQlMzMjEwLlU4Ci0gICAgICAgIFZBQkQgICAgICAgIGRBcTJxMCwgZFFfMiwgZFFfMAotICAgICAgICBWQ0dUICAgICAgICBkTWFza19icy5TMTYsIGRCUzMyMTAuUzE2LCAjMAotCi0gICAgICAgIFZDR1QgICAgICAgIGRBcDFwMCwgZEJldGEsIGRBcDFwMCAKLSAgICAgICAgVkNHVCAgICAgICAgZEFwMnAwLCBkQmV0YSwgZEFwMnAwCi0gICAgICAgIAotICAgICAgICBWQU5EICAgICAgICBkRmlsdCwgZE1hc2tfYnMuVTgKLQotICAgICAgICBUU1QgICAgICAgICBiUzMyMTAsIE1hc2tfMwotCi0gICAgICAgIFZDR1QgICAgICAgIGRBcTJxMCwgZEJldGEsIGRBcTJxMAotICAgICAgICBWQU5EICAgICAgICBkRmlsdCwgZEZpbHQsIGRBcDFwMAotCi0gICAgICAgIFZBTkQgICAgICAgIGRBcWZsZywgZEZpbHQsIGRBcTJxMAotICAgICAgICBWQU5EICAgICAgICBkQXBmbGcsIGRGaWx0LCBkQXAycDAKLSAgICAgICAgCi0gICAgICAgIDsvLyBiUyA8IDQgRmlsdGVyaW5nCi0gICAgICAgIEJMTkUgICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTTFQ0X3Vuc2FmZQotCi0gICAgICAgIFRTVCAgICAgICAgIGJTMzIxMCwgTWFza180ICAgICAgICAKLQotICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzIKLSAgICAgICAgVlRTVCAgICAgICAgZEZpbHRfYnMsIGRGaWx0X2JzLCBkTWFza180Ci0KLSAgICAgICAgOy8vIGJTID09IDQgRmlsdGVyaW5nCi0gICAgICAgIEJMTkUgICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVkJJVCAgICAgICAgZFBfMG4sIGRQXzB0LCBkRmlsdF9icwotICAgICAgICBWQklUICAgICAgICBkUV8wbiwgZFFfMHQsIGRGaWx0X2JzCi0gICAgICAgIAotICAgICAgICBWQklGICAgICAgICBkUF8wbiwgZFBfMCwgZEZpbHQgICAgICAKLSAgICAgICAgVkJJRiAgICAgICAgZFFfMG4sIGRRXzAsIGRGaWx0ICAKLQotICAgICAgICA7Ly8gUmVzdWx0IFN0b3JhZ2UKLSAgICAgICAgVlNUMSAgICAgICAgZFBfMG4sIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAotICAgICAgICBBRERTICAgICAgICBYWSwgWFksIFhZCi0gICAgICAgIFZTVDEgICAgICAgIGRRXzBuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKLQotICAgICAgICBCTkUgICAgICAgICBMb29wWSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICAgICByMCwgI09NWF9TdHNfTm9FcnIKLQotICAgICAgICBNX0VYSVQKLSAgICAgICAgCi1Ob0ZpbHRlckJTMAotCi0gICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFdCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMQotICAgICAgICBBRERTICAgICAgICBYWSwgWFksIFhZCi0gICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXQotICAgICAgICBBREQgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICM0Ci0gICAgICAgIEJORSAgICAgICAgIExvb3BZICAgICAgICAKLQotICAgICAgICBNT1YgICAgICAgICByMCwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FTkQKLSAgICAgICAgCi0gICAgICAgIEVORElGCi0gICAgICAgIAotCi0gICAgICAgIEVORAotICAgICAgICAKLSAgICAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyMTUyYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0KLSAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotCi0gICAgICAgIElGIENvcnRleEE4Ci0KLSAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0dFNF91bnNhZmUKLSAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0xUNF91bnNhZmUKLSAgICAgICAgCi1MT09QX0NPVU5UICBFUVUgMHg0MDAwMDAwMAotTUFTS18zICAgICAgRVFVIDB4MDMwMzAzMDMKLU1BU0tfNCAgICAgIEVRVSAweDA0MDQwNDA0Ci0KLTsvLyBGdW5jdGlvbiBhcmd1bWVudHMKLQotcFNyY0RzdCAgICAgUk4gMAotc3JjZHN0U3RlcCAgUk4gMQotcEFscGhhICAgICAgUk4gMgotcEJldGEgICAgICAgUk4gMwotCi1wVGhyZXNob2xkcyBSTiA1Ci1wQlMgICAgICAgICBSTiA0Ci1iUzMyMTAgICAgICBSTiA2Ci1wU3JjRHN0X1AgICBSTiAxMAotcFNyY0RzdF9RICAgUk4gMTIKLQotcFRtcCAgICAgICAgUk4gMTAKLXBUbXAyICAgICAgIFJOIDEyCi1zdGVwICAgICAgICBSTiAxNAotCi07Ly8gTG9vcCAKLQotWFkgICAgICAgICAgUk4gNwotCi07Ly8gUm93cyBpbnB1dAotZFJvdzAgICAgICAgRE4gRDcuVTgKLWRSb3cxICAgICAgIEROIEQ4LlU4ICAKLWRSb3cyICAgICAgIEROIEQ1LlU4ICAKLWRSb3czICAgICAgIEROIEQxMC5VOCAgCi1kUm93NCAgICAgICBETiBENi5VOCAgCi1kUm93NSAgICAgICBETiBEOS5VOCAgCi1kUm93NiAgICAgICBETiBENC5VOCAKLWRSb3c3ICAgICAgIEROIEQxMS5VOCAKLQotCi07Ly8gUGl4ZWxzCi1kUF8wICAgICAgICBETiBENC5VOAotZFBfMSAgICAgICAgRE4gRDUuVTggIAotZFBfMiAgICAgICAgRE4gRDYuVTggIAotZFFfMCAgICAgICAgRE4gRDguVTggIAotZFFfMSAgICAgICAgRE4gRDkuVTggIAotZFFfMiAgICAgICAgRE4gRDEwLlU4IAotCi07Ly8gRmlsdGVyaW5nIERlY2lzaW9uCi1kQWxwaGEgICAgICBETiBEMC5VOAotZEJldGEgICAgICAgRE4gRDIuVTgKLQotZEZpbHQgICAgICAgRE4gRDE2LlU4Ci1kQXFmbGcgICAgICBETiBEMTIuVTgKLWRBcGZsZyAgICAgIEROIEQxNy5VOCAKLQotZEFwMHEwICAgICAgRE4gRDEzLlU4Ci1kQXAxcDAgICAgICBETiBEMTIuVTgKLWRBcTFxMCAgICAgIEROIEQxOC5VOAotZEFwMnAwICAgICAgRE4gRDE5LlU4Ci1kQXEycTAgICAgICBETiBEMTcuVTgKLQotcUJTMzIxMCAgICAgUU4gUTEzLlUxNgotZEJTMzIxMCAgICAgRE4gRDI2Ci1kTWFza19icyAgICBETiBEMjcKLWRGaWx0X2JzICAgIEROIEQyNi5VMTYKLQotOy8vIGJTTFQ0Ci1kTWFza18wICAgICBETiBEMTQuVTgKLWRNYXNrXzEgICAgIEROIEQxNS5VOCAgICAKLWRNYXNrXzQgICAgIEROIEQxLlUxNgotCi1NYXNrXzQgICAgICBSTiA4Ci1NYXNrXzMgICAgICBSTiA5Ci0KLWRUZW1wICAgICAgIEROIEQxOS5VOAotCi07Ly8gUmVzdWx0Ci1kUF8wdCAgICAgICBETiBEMTMuVTggICAKLWRRXzB0ICAgICAgIEROIEQzMS5VOCAgIAotCi1kUF8wbiAgICAgICBETiBEMjkuVTgKLWRRXzBuICAgICAgIEROIEQyNC5VOAotCi0gICAgICAgIAotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSwgcjEyLCBkMTUKLSAgICAgICAgCi0gICAgICAgIDsvL0FyZ3VtZW50cyBvbiB0aGUgc3RhY2sKLSAgICAgICAgTV9BUkcgICBwcFRocmVzaG9sZHMsIDQKLSAgICAgICAgTV9BUkcgICBwcEJTLCA0Ci0gICAgICAgIAotICAgICAgICA7Ly8gZDAtZEFscGhhXzAKLSAgICAgICAgOy8vIGQyLWRCZXRhXzAKLQotICAgICAgICA7bG9hZCBhbHBoYTEsYmV0YTEgc29tZXdoZXJlIHRvIGF2b2lkIG1vcmUgbG9hZHMKLSAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV0hCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsICM0Ci0gICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXSEgCi0gICAgICAgIAotICAgICAgICBNX0xEUiAgICAgICBwQlMsIHBwQlMKLSAgICAgICAgTV9MRFIgICAgICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcyAKLQotICAgICAgICBMRFIgICAgICAgICBNYXNrXzQsID1NQVNLXzQKLSAgICAgICAgTERSICAgICAgICAgTWFza18zLCA9TUFTS18zCi0KLSAgICAgICAgO2RNYXNrXzAtMTQKLSAgICAgICAgO2RNYXNrXzEtMTUKLSAgICAgICAgO2RNYXNrXzQtMTkKLQotICAgICAgICBWTU9WICAgICAgICBkTWFza18wLCAjMCAgICAgCi0gICAgICAgIFZNT1YgICAgICAgIGRNYXNrXzEsICMxICAgICAKLSAgICAgICAgVk1PViAgICAgICAgZE1hc2tfNCwgIzQgICAgIAotICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgWFksID1MT09QX0NPVU5UCi0KLSAgICAgICAgOy8vIHAwLXAzIC0gZDQtZDcKLSAgICAgICAgOy8vIHEwLXEzIC0gZDgtZDExCi0KLQotTG9vcFkgICAgICAgIAotICAgICAgICBMRFIgICAgICAgICBiUzMyMTAsIFtwQlNdLCAjOAotICAgICAgICBBREQgICAgICAgICBwVG1wLCBwU3JjRHN0LCBzcmNkc3RTdGVwCi0gICAgICAgIEFERCAgICAgICAgIHN0ZXAsIHNyY2RzdFN0ZXAsIHNyY2RzdFN0ZXAKLSAgICAgICAgCi0gICAgICAgIDsxCi0gICAgICAgIFZMRDEgICAgICAgIGRSb3cwLCBbcFNyY0RzdF0sIHN0ZXAKLSAgICAgICAgOzEKLSAgICAgICAgVkxEMSAgICAgICAgZFJvdzEsIFtwVG1wXSwgc3RlcAotICAgICAgICBWTEQxICAgICAgICBkUm93MiwgW3BTcmNEc3RdLCBzdGVwCi0gICAgICAgIFZMRDEgICAgICAgIGRSb3czLCBbcFRtcF0sIHN0ZXAKLSAgICAgICAgVkxEMSAgICAgICAgZFJvdzQsIFtwU3JjRHN0XSwgc3RlcAotICAgICAgICBWTEQxICAgICAgICBkUm93NSwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZMRDEgICAgICAgIGRSb3c2LCBbcFNyY0RzdF0sIHN0ZXAKLSAgICAgICAgVkxEMSAgICAgICAgZFJvdzcsIFtwVG1wXSwgc3RlcAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBkUm93MCA9IFtxM3IwIHEycjAgcTFyMCBxMHIwIHAwcjAgcDFyMCBwMnIwIHAzcjBdCi0gICAgICAgIDsvLyBkUm93MSA9IFtxM3IxIHEycjEgcTFyMSBxMHIxIHAwcjEgcDFyMSBwMnIxIHAzcjFdCi0gICAgICAgIDsvLyBkUm93MiA9IFtxM3IyIHEycjIgcTFyMiBxMHIyIHAwcjIgcDFyMiBwMnIyIHAzcjJdCi0gICAgICAgIDsvLyBkUm93MyA9IFtxM3IzIHEycjMgcTFyMyBxMHIzIHAwcjMgcDFyMyBwMnIzIHAzcjNdCi0gICAgICAgIDsvLyBkUm93NCA9IFtxM3I0IHEycjQgcTFyNCBxMHI0IHAwcjQgcDFyNCBwMnI0IHAzcjRdCi0gICAgICAgIDsvLyBkUm93NSA9IFtxM3I1IHEycjUgcTFyNSBxMHI1IHAwcjUgcDFyNSBwMnI1IHAzcjVdCi0gICAgICAgIDsvLyBkUm93NiA9IFtxM3I2IHEycjYgcTFyNiBxMHI2IHAwcjYgcDFyNiBwMnI2IHAzcjZdCi0gICAgICAgIDsvLyBkUm93NyA9IFtxM3I3IHEycjcgcTFyNyBxMHI3IHAwcjcgcDFyNyBwMnI3IHAzcjddCi0KLSAgICAgICAgOy8vIDh4OCBUcmFuc3Bvc2UKLSAgICAgICAgVlpJUC44ICAgICAgZFJvdzAsIGRSb3cxCi0gICAgICAgIFZaSVAuOCAgICAgIGRSb3cyLCBkUm93MwotICAgICAgICBWWklQLjggICAgICBkUm93NCwgZFJvdzUKLSAgICAgICAgVlpJUC44ICAgICAgZFJvdzYsIGRSb3c3Ci0KLSAgICAgICAgVlpJUC4xNiAgICAgZFJvdzAsIGRSb3cyCi0gICAgICAgIFZaSVAuMTYgICAgIGRSb3cxLCBkUm93MwotICAgICAgICBWWklQLjE2ICAgICBkUm93NCwgZFJvdzYKLSAgICAgICAgVlpJUC4xNiAgICAgZFJvdzUsIGRSb3c3Ci0KLSAgICAgICAgVlpJUC4zMiAgICAgZFJvdzAsIGRSb3c0Ci0gICAgICAgIFZaSVAuMzIgICAgIGRSb3cyLCBkUm93NgotICAgICAgICBWWklQLjMyICAgICBkUm93MywgZFJvdzcKLSAgICAgICAgVlpJUC4zMiAgICAgZFJvdzEsIGRSb3c1Ci0KLQotICAgICAgICA7UmVhbGlnbiB0aGUgcG9pbnRlcnMKLQotICAgICAgICBDTVAgICAgICAgICBiUzMyMTAsICMwCi0gICAgICAgIFZBQkQgICAgICAgIGRBcDJwMCwgZFBfMiwgZFBfMAotICAgICAgICBWQUJEICAgICAgICBkQXAwcTAsIGRQXzAsIGRRXzAKLSAgICAgICAgQkVRICAgICAgICAgTm9GaWx0ZXJCUzAKLQotICAgICAgICBWQUJEICAgICAgICBkQXAxcDAsIGRQXzEsIGRQXzAKLSAgICAgICAgVkFCRCAgICAgICAgZEFxMXEwLCBkUV8xLCBkUV8wCi0KLSAgICAgICAgVk1PVi5VMzIgICAgZEJTMzIxMFswXSwgYlMzMjEwCi0gICAgICAgIFZDR1QgICAgICAgIGRGaWx0LCBkQWxwaGEsIGRBcDBxMAotICAgICAgICBWTUFYICAgICAgICBkQXAxcDAsIGRBcTFxMCwgZEFwMXAwCi0gICAgICAgIFZNT1ZMICAgICAgIHFCUzMyMTAsIGRCUzMyMTAuVTgKLSAgICAgICAgVkFCRCAgICAgICAgZEFxMnEwLCBkUV8yLCBkUV8wCi0gICAgICAgIFZDR1QgICAgICAgIGRNYXNrX2JzLlMxNiwgZEJTMzIxMC5TMTYsICMwCi0KLSAgICAgICAgVkNHVCAgICAgICAgZEFwMXAwLCBkQmV0YSwgZEFwMXAwCi0gICAgICAgIFZDR1QgICAgICAgIGRBcDJwMCwgZEJldGEsIGRBcDJwMAotICAgICAgICBWQU5EICAgICAgICBkRmlsdCwgZE1hc2tfYnMuVTgKLQotICAgICAgICBUU1QgICAgICAgICBiUzMyMTAsIE1hc2tfMwotCi0gICAgICAgIFZDR1QgICAgICAgIGRBcTJxMCwgZEJldGEsIGRBcTJxMAotICAgICAgICBWQU5EICAgICAgICBkRmlsdCwgZEZpbHQsIGRBcDFwMAotCi0gICAgICAgIFZBTkQgICAgICAgIGRBcWZsZywgZEZpbHQsIGRBcTJxMAotICAgICAgICBWQU5EICAgICAgICBkQXBmbGcsIGRGaWx0LCBkQXAycDAKLQotICAgICAgICA7Ly8gYlMgPCA0IEZpbHRlcmluZwotICAgICAgICBCTE5FICAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0xUNF91bnNhZmUKLQotICAgICAgICBUU1QgICAgICAgICBiUzMyMTAsIE1hc2tfNCAgICAgICAgCi0KLSAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMzCi0gICAgICAgIFZUU1QgICAgICAgIGRGaWx0X2JzLCBkRmlsdF9icywgZE1hc2tfNAotCi0gICAgICAgIDsvLyBiUyA9PSA0IEZpbHRlcmluZwotICAgICAgICBCTE5FICAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0dFNF91bnNhZmUKLQotICAgICAgICBWQklUICAgICAgICBkUF8wbiwgZFBfMHQsIGRGaWx0X2JzCi0gICAgICAgIFZCSVQgICAgICAgIGRRXzBuLCBkUV8wdCwgZEZpbHRfYnMKLQotICAgICAgICA7Ly8gUmVzdWx0IFN0b3JhZ2UKLSAgICAgICAgQUREICAgICAgICAgcFNyY0RzdF9QLCBwU3JjRHN0LCAjMwotICAgICAgICBWQklGICAgICAgICBkUF8wbiwgZFBfMCwgZEZpbHQgICAgICAKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIHBUbXAyLCBwU3JjRHN0X1AsIHNyY2RzdFN0ZXAKLSAgICAgICAgQUREICAgICAgICAgc3RlcCwgc3JjZHN0U3RlcCwgc3JjZHN0U3RlcAotICAgICAgICBWQklGICAgICAgICBkUV8wbiwgZFFfMCwgZEZpbHQgIAotCi0gICAgICAgIEFERFMgICAgICAgIFhZLCBYWSwgWFkKLSAgICAgICAgCi0gICAgICAgIFZTVDEgICAgICAgIHtkUF8wblswXX0sIFtwU3JjRHN0X1BdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHtkUF8wblsxXX0sIFtwVG1wMl0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAge2RQXzBuWzJdfSwgW3BTcmNEc3RfUF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAge2RQXzBuWzNdfSwgW3BUbXAyXSwgc3RlcAotICAgICAgICBWU1QxICAgICAgICB7ZFBfMG5bNF19LCBbcFNyY0RzdF9QXSwgc3RlcAotICAgICAgICBWU1QxICAgICAgICB7ZFBfMG5bNV19LCBbcFRtcDJdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHtkUF8wbls2XX0sIFtwU3JjRHN0X1BdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHtkUF8wbls3XX0sIFtwVG1wMl0sIHN0ZXAKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIHBTcmNEc3RfUSwgcFNyY0RzdCwgIzQKLSAgICAgICAgQUREICAgICAgICAgcFRtcCwgcFNyY0RzdF9RLCBzcmNkc3RTdGVwCi0gICAgICAgIAotICAgICAgICBWU1QxICAgICAgICB7ZFFfMG5bMF19LCBbcFNyY0RzdF9RXSwgc3RlcAotICAgICAgICBWU1QxICAgICAgICB7ZFFfMG5bMV19LCBbcFRtcF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAge2RRXzBuWzJdfSwgW3BTcmNEc3RfUV0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAge2RRXzBuWzNdfSwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHtkUV8wbls0XX0sIFtwU3JjRHN0X1FdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgICAgIHtkUV8wbls1XX0sIFtwVG1wXSwgc3RlcAotICAgICAgICBWU1QxICAgICAgICB7ZFFfMG5bNl19LCBbcFNyY0RzdF9RXSwgc3RlcAotICAgICAgICBWU1QxICAgICAgICB7ZFFfMG5bN119LCBbcFRtcF0sIHN0ZXAKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsICM0Ci0KLSAgICAgICAgQk5FICAgICAgICAgTG9vcFkgICAgICAgIAotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgcjAsICNPTVhfU3RzX05vRXJyCi0gICAgICAgIAotICAgICAgICBNX0VYSVQKLSAgICAgICAgCi1Ob0ZpbHRlckJTMAotICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXQotICAgICAgICBBREQgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCAjNAotICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzMKLSAgICAgICAgQUREUyAgICAgICAgWFksIFhZLCBYWQotICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV0KLSAgICAgICAgQUREICAgICAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjNAotICAgICAgICBCTkUgICAgICAgICBMb29wWSAgICAgICAgCi0KLSAgICAgICAgTU9WICAgICAgICAgcjAsICNPTVhfU3RzX05vRXJyCi0KLSAgICAgICAgTV9FTkQKLSAgICAgICAgCi0gICAgICAgIEVORElGCi0KLQotICAgICAgICBFTkQKLSAgICAgICAgCi0gICAgICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY3ODY3MC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucworKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLQotICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0KLSAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCi0gICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQotCi0gICAgICAgIElGIENvcnRleEE4Ci0KLUxPT1BfQ09VTlQgIEVRVSAweDU1MDAwMDAwCi0KLQotOy8vIEZ1bmN0aW9uIGFyZ3VtZW50cwotCi1wU3JjRHN0ICAgICBSTiAwCi1zcmNkc3RTdGVwICBSTiAxCi1wQWxwaGEgICAgICBSTiAyCi1wQmV0YSAgICAgICBSTiAzCi0KLXBUaHJlc2hvbGRzIFJOIDUKLXBCUyAgICAgICAgIFJOIDQKLWJTMTAgICAgICAgIFJOIDEyCi0KLXBBbHBoYV8wICAgIFJOIDIKLXBCZXRhXzAgICAgIFJOIDMKLQotcEFscGhhXzEgICAgUk4gNwotcEJldGFfMSAgICAgUk4gOAotCi0KLQotOy8vIExvb3AgCi0KLVhZICAgICAgICAgIFJOIDkKLQotcFRtcCAgICAgICAgUk4gNgotc3RlcCAgICAgICAgUk4gMTAKLQotOy8vIFBpeGVscwotZFBfMCAgICAgICAgRE4gRDQuVTgKLWRQXzEgICAgICAgIEROIEQ1LlU4ICAKLWRQXzIgICAgICAgIEROIEQ2LlU4ICAKLWRQXzMgICAgICAgIEROIEQ3LlU4ICAKLWRRXzAgICAgICAgIEROIEQ4LlU4ICAKLWRRXzEgICAgICAgIEROIEQ5LlU4ICAKLWRRXzIgICAgICAgIEROIEQxMC5VOCAKLWRRXzMgICAgICAgIEROIEQxMS5VOCAKLQotCi07Ly8gRmlsdGVyaW5nIERlY2lzaW9uCi1kQWxwaGEgICAgICBETiBEMC5VOAotZEJldGEgICAgICAgRE4gRDIuVTgKLQotZEZpbHQgICAgICAgRE4gRDE2LlU4Ci1kQXFmbGcgICAgICBETiBEMTIuVTgKLWRBcGZsZyAgICAgIEROIEQxNy5VOCAKLQotZEFwMHEwICAgICAgRE4gRDEzLlU4Ci1kQXAxcDAgICAgICBETiBEMTIuVTgKLWRBcTFxMCAgICAgIEROIEQxOC5VOAotZEFwMnAwICAgICAgRE4gRDE5LlU4Ci1kQXEycTAgICAgICBETiBEMTcuVTgKLQotOy8vIGJTTFQ0Ci1kVEMwICAgICAgICBETiBEMTguVTggICAKLWRUQzEgICAgICAgIEROIEQxOS5VOCAgIAotZFRDMDEgICAgICAgRE4gRDE4LlU4ICAgCi0KLWRUQ3MgICAgICAgIEROIEQzMS5TOAotZFRDICAgICAgICAgRE4gRDMxLlU4Ci0KLWRNYXNrXzAgICAgIEROIEQxNC5VOAotZE1hc2tfMSAgICAgRE4gRDE1LlU4ICAgIAotCi1NYXNrXzAgICAgICBSTiAxMQotCi1kVGVtcCAgICAgICBETiBEMTkuVTgKLQotOy8vIENvbXB1dGluZyBQMCxRMAotcURxMHAwICAgICAgUU4gUTEwLlMxNgotcURwMXExICAgICAgUU4gUTExLlMxNgotcURlbHRhICAgICAgUU4gUTEwLlMxNiAgOyByZXVzZSBxRHEwcDAKLWREZWx0YSAgICAgIEROIEQyMC5TOAotCi0KLTsvLyBDb21wdXRpbmcgUDEsUTEKLWRScDBxMCAgICAgIEROIEQyNC5VOAotCi1kTWF4UCAgICAgICBETiBEMjMuVTgKLWRNaW5QICAgICAgIEROIEQyMi5VOAotCi1kTWF4USAgICAgICBETiBEMTkuVTgKLWRNaW5RICAgICAgIEROIEQyMS5VOAotCi1kRGVsdGFQICAgICBETiBEMjYuVTgKLWREZWx0YVEgICAgIEROIEQyNy5VOAotCi1xUF8wbiAgICAgICBRTiBRMTQuUzE2Ci1xUV8wbiAgICAgICBRTiBRMTIuUzE2Ci0KLWRRXzBuICAgICAgIEROIEQyNC5VOAotZFFfMW4gICAgICAgRE4gRDI1LlU4Ci1kUF8wbiAgICAgICBETiBEMjkuVTgKLWRQXzFuICAgICAgIEROIEQzMC5VOAotCi07Ly8gYlNHRTQKLQotcVNwMHEwICAgICAgUU4gUTEwLlUxNgotCi1xU3AycTEgICAgICBRTiBRMTEuVTE2Ci1xU3AwcTBwMSAgICBRTiBRMTIuVTE2Ci1xU3AzcDIgICAgICBRTiBRMTMuVTE2Ci1kSFNwMHExICAgICBETiBEMjguVTgKLQotcVNxMnAxICAgICAgUU4gUTExLlUxNgotcVNwMHEwcTEgICAgUU4gUTEyLlUxNgotcVNxM3EyICAgICAgUU4gUTEzLlUxNiAgOyEhCi1kSFNxMHAxICAgICBETiBEMjguVTggICA7ISEKLQotcVRlbXAxICAgICAgUU4gUTExLlUxNiAgOyEhO3FTcDJxMSAKLXFUZW1wMiAgICAgIFFOIFExMi5VMTYgIDshITtxU3AwcTBwMSAgICAgICAgCi0KLWRQXzB0ICAgICAgIEROIEQyOC5VOCAgIDshITtkSFNwMHExICAgICAgICAKLWRRXzB0ICAgICAgIEROIEQyMi5VOCAgIDshITtUZW1wMSAgICAgICAgCi0KLWRQXzBuICAgICAgIEROIEQyOS5VOAotZFBfMW4gICAgICAgRE4gRDMwLlU4Ci1kUF8ybiAgICAgICBETiBEMzEuVTgKLQotZFFfMG4gICAgICAgRE4gRDI0LlU4ICAgOyEhO1RlbXAyICAgICAgICAKLWRRXzFuICAgICAgIEROIEQyNS5VOCAgIDshITtUZW1wMiAgICAgICAgCi1kUV8ybiAgICAgICBETiBEMjguVTggICA7ISE7ZFFfMHQgICAgICAgIAotCi0gICAgICAgIAotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0ksIHIxMSwgZDE1Ci0gICAgICAgIAotICAgICAgICA7Ly9Bcmd1bWVudHMgb24gdGhlIHN0YWNrCi0gICAgICAgIE1fQVJHICAgcHBUaHJlc2hvbGRzLCA0Ci0gICAgICAgIE1fQVJHICAgcHBCUywgNAotICAgICAgICAKLSAgICAgICAgOy8vIGQwLWRBbHBoYV8wCi0gICAgICAgIDsvLyBkMi1kQmV0YV8wCi0KLSAgICAgICAgQUREICAgICAgICAgcEFscGhhXzEsIHBBbHBoYV8wLCAjMQotICAgICAgICBBREQgICAgICAgICBwQmV0YV8xLCBwQmV0YV8wLCAjMQotICAgICAgICAKLSAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV8wXQotICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzIKLSAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFfMF0gCi0gICAgICAgIAotICAgICAgICBNX0xEUiAgICAgICBwQlMsIHBwQlMKLSAgICAgICAgTV9MRFIgICAgICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcyAKLQotICAgICAgICBNT1YgICAgICAgICBNYXNrXzAsIzAKLQotICAgICAgICA7ZE1hc2tfMC0xNAotICAgICAgICA7ZE1hc2tfMS0xNQotCi0gICAgICAgIFZNT1YgICAgICAgIGRNYXNrXzAsICMwICAgICAKLSAgICAgICAgVk1PViAgICAgICAgZE1hc2tfMSwgIzEgICAgIAotICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgc3RlcCwgc3JjZHN0U3RlcCwgc3JjZHN0U3RlcAotCi0gICAgICAgIExEUiAgICAgICAgIFhZLD1MT09QX0NPVU5UCi0KLSAgICAgICAgOy8vIHAwLXAzIC0gZDQtZDcKLSAgICAgICAgOy8vIHEwLXEzIC0gZDgtZDExCi1Mb29wWSAgICAgICAgCi1Mb29wWCAgICAgICAgCi0gICAgICAgIExEUkggICAgICAgIGJTMTAsIFtwQlNdLCAjMgotICAgICAgICBBREQgICAgICAgICBwVG1wLCBwU3JjRHN0LCBzcmNkc3RTdGVwCi0gICAgICAgIENNUCAgICAgICAgIGJTMTAsICMwCi0gICAgICAgIEJFUSAgICAgICAgIE5vRmlsdGVyQlMwCi0KLSAgICAgICAgVkxEMSAgICAgICAgZFBfMywgW3BTcmNEc3RdLCBzdGVwCi0gICAgICAgIFZMRDEgICAgICAgIGRQXzIsIFtwVG1wXSwgc3RlcAotICAgICAgICBWTEQxICAgICAgICBkUF8xLCBbcFNyY0RzdF0sIHN0ZXAKLSAgICAgICAgVkxEMSAgICAgICAgZFBfMCwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZMRDEgICAgICAgIGRRXzAsIFtwU3JjRHN0XSwgc3RlcAotICAgICAgICBWQUJEICAgICAgICBkQXAxcDAsIGRQXzAsIGRQXzEKLSAgICAgICAgVkxEMSAgICAgICAgZFFfMSwgW3BUbXBdCi0gICAgICAgIFZBQkQgICAgICAgIGRBcDBxMCwgZFFfMCwgZFBfMAotICAgICAgICBWTEQxICAgICAgICBkUV8yLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgCi0gICAgICAgIFZBQkQgICAgICAgIGRBcTFxMCwgZFFfMSwgZFFfMAotICAgICAgICBWQUJEICAgICAgICBkQXAycDAsIGRQXzIsIGRQXzAKLSAgICAgICAgVkNHVCAgICAgICAgZEZpbHQsIGRBbHBoYSwgZEFwMHEwCi0KLSAgICAgICAgVFNUICAgICAgICAgYlMxMCwgIzB4ZmYKLSAgICAgICAgVk1BWCAgICAgICAgZEFwMXAwLCBkQXExcTAsIGRBcDFwMAotICAgICAgICBWQUJEICAgICAgICBkQXEycTAsIGRRXzIsIGRRXzAKLQotICAgICAgICBWTU9WRVEuVTMyICBkRmlsdFswXSwgTWFza18wCi0gICAgICAgIFRTVCAgICAgICAgIGJTMTAsICMweGZmMDAKLQotICAgICAgICBWQ0dUICAgICAgICBkQXAycDAsIGRCZXRhLCBkQXAycDAKLSAgICAgICAgVkNHVCAgICAgICAgZEFwMXAwLCBkQmV0YSwgZEFwMXAwCi0KLSAgICAgICAgVk1PVkVRLlUzMiAgZEZpbHRbMV0sIE1hc2tfMAotCi0gICAgICAgIFZDR1QgICAgICAgIGRBcTJxMCwgZEJldGEsIGRBcTJxMAotICAgICAgICBWTEQxICAgICAgICBkUV8zLCBbcFNyY0RzdF0KLSAgICAgICAgVkFORCAgICAgICAgZEZpbHQsIGRGaWx0LCBkQXAxcDAKLSAgICAgICAgVFNUICAgICAgICAgYlMxMCwgIzQgCi0KLSAgICAgICAgVkFORCAgICAgICAgZEFxZmxnLCBkRmlsdCwgZEFxMnEwCi0gICAgICAgIFZBTkQgICAgICAgIGRBcGZsZywgZEZpbHQsIGRBcDJwMAotICAgIAotICAgICAgICBCTkUgICAgICAgICBiU0dFNCAgICAgICAgCi1iU0xUNAotICAgICAgICA7Ly8gYlMgPCA0IEZpbHRlcmluZwotICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzIKLSAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcAotCi0gICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKLQotICAgICAgICA7Ly8gUmVzdWx0IFN0b3JhZ2UKLSAgICAgICAgVlNUMSAgICAgICAgZFBfMW4sIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUF8wbiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCi0gICAgICAgIFNVQiAgICAgICAgIHBUbXAsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMgotICAgICAgICBWU1QxICAgICAgICBkUV8wbiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCi0gICAgICAgIEFERFMgICAgICAgIFhZLCBYWSwgWFkKLSAgICAgICAgVlNUMSAgICAgICAgZFFfMW4sIFtwU3JjRHN0XQotICAgICAgICBBREQgICAgICAgICBwU3JjRHN0LCBwVG1wLCAjOAotCi0gICAgICAgIEJDQyAgICAgICAgIExvb3BYCi0gICAgICAgIEIgICAgICAgICAgIEV4aXRMb29wWSAgICAgICAgCi0KLU5vRmlsdGVyQlMwCi0gICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsICM4Ci0gICAgICAgIEFERFMgICAgICAgIFhZLCBYWSwgWFkKLSAgICAgICAgQUREICAgICAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjMgotICAgICAgICBCQ0MgICAgICAgICBMb29wWAotICAgICAgICBCICAgICAgICAgICBFeGl0TG9vcFkgICAgICAgIAotYlNHRTQgICAgICAgIAotICAgICAgICA7Ly8gYlMgPj0gNCBGaWx0ZXJpbmcKLSAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMyCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMQotICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCi0KLSAgICAgICAgOy8vIFJlc3VsdCBTdG9yYWdlCi0gICAgICAgIFZTVDEgICAgICAgIGRQXzJuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFBfMW4sIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUF8wbiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCi0gICAgICAgIFNVQiAgICAgICAgIHBUbXAsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMgotICAgICAgICBWU1QxICAgICAgICBkUV8wbiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCi0gICAgICAgIEFERFMgICAgICAgIFhZLFhZLFhZCi0gICAgICAgIFZTVDEgICAgICAgIGRRXzFuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKLSAgICAgICAgQUREICAgICAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjMgotICAgICAgICBWU1QxICAgICAgICBkUV8ybiwgW3BTcmNEc3RdCi0gICAgICAgIAotICAgICAgICBBREQgICAgICAgICBwU3JjRHN0LCBwVG1wLCAjOAotICAgICAgICBCQ0MgICAgICAgICBMb29wWAotCi1FeGl0TG9vcFkgICAgICAgIAotCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsICMxNgotICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXzFdCi0gICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMiAKLSAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFfMV0KLSAgICAgICAgQk5FICAgICAgICAgTG9vcFkKLQotICAgICAgICBNT1YgICAgICAgICByMCwgI09NWF9TdHNfTm9FcnIKLQotICAgICAgICBNX0VORAotICAgICAgICAKLSAgICBFTkRJRgotICAgIAotCi0gICAgICAgIAotCi0gICAgICAgIEVORAotICAgICAgICAKLSAgICAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmExMzRlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDUwICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi0gICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLQotICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKLSAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCi0gICAgICAgIAotICAgICAgICBJRiBDb3J0ZXhBOAotCi1MT09QX0NPVU5UICBFUVUgMHgxMTAwMDAwMAotCi0KLTsvLyBGdW5jdGlvbiBhcmd1bWVudHMKLQotcFNyY0RzdCAgICAgUk4gMAotc3JjZHN0U3RlcCAgUk4gMQotcEFscGhhICAgICAgUk4gMgotcEJldGEgICAgICAgUk4gMwotCi1wVGhyZXNob2xkcyBSTiA1Ci1wQlMgICAgICAgICBSTiA0Ci1iUzEwICAgICAgICBSTiAxMgotCi1wQWxwaGFfMCAgICBSTiAyCi1wQmV0YV8wICAgICBSTiAzCi0KLXBBbHBoYV8xICAgIFJOIDcKLXBCZXRhXzEgICAgIFJOIDgKLQotcFRtcCAgICAgICAgUk4gMTAKLXBUbXBTdGVwICAgIFJOIDExCi0KLTsvLyBMb29wIAotCi1YWSAgICAgICAgICBSTiA5Ci0KLTsvLyBSb3dzIGlucHV0Ci1kUm93MCAgICAgICBETiBENy5VOAotZFJvdzEgICAgICAgRE4gRDguVTggIAotZFJvdzIgICAgICAgRE4gRDUuVTggIAotZFJvdzMgICAgICAgRE4gRDEwLlU4ICAKLWRSb3c0ICAgICAgIEROIEQ2LlU4ICAKLWRSb3c1ICAgICAgIEROIEQ5LlU4ICAKLWRSb3c2ICAgICAgIEROIEQ0LlU4IAotZFJvdzcgICAgICAgRE4gRDExLlU4IAotCi07Ly8gZFJvdzAgLSBkUF8zLCBkUm93MSAtIGRRXzAsIGRSb3cyIC0gZFBfMSwgZFJvdzMgLSBkUV8yCi07Ly8gZFJvdzQgLSBkUF8yLCBkUm93NSAtIGRRXzEsIGRSb3c2IC0gZFBfMCwgZFJvdzcgLSBkUV8zCi0KLTsvLyBSb3dzIG91dHB1dAotZFJvd24wICAgICAgRE4gRDcuVTgKLWRSb3duMSAgICAgIEROIEQyNC5VOAotZFJvd24yICAgICAgRE4gRDMwLlU4Ci1kUm93bjMgICAgICBETiBEMTAuVTgKLWRSb3duNCAgICAgIEROIEQ2LlU4Ci1kUm93bjUgICAgICBETiBEMjUuVTgKLWRSb3duNiAgICAgIEROIEQyOS5VOAotZFJvd243ICAgICAgRE4gRDExLlU4Ci0KLTsvLyBkUF8wbiAgICAgICBETiBEMjkuVTgKLTsvLyBkUF8xbiAgICAgICBETiBEMzAuVTgKLTsvLyBkUF8ybiAgICAgICBETiBEMzEuVTgKLTsvLyAKLTsvLyBkUV8wbiAgICAgICBETiBEMjQuVTggICA7ISE7VGVtcDIgICAgICAgIAotOy8vIGRRXzFuICAgICAgIEROIEQyNS5VOCAgIDshITtUZW1wMiAgICAgICAgCi07Ly8gZFFfMm4gICAgICAgRE4gRDI4LlU4ICAgOyEhO2RRXzB0ICAgICAgICAKLTsvLyAKLTsvLyBkUm93bjAgLSBkUF8zLCAgZFJvd24xIC0gZFFfMG4KLTsvLyBkUm93bjIgLSBkUF8xbiwgZFJvd24zIC0gZFFfMgotOy8vIGRSb3duNCAtIGRQXzIsICBkUm93bjUgLSBkUV8xbgotOy8vIGRSb3duNiAtIGRQXzBuLCBkUm93bjcgLSBkUV8zCi0KLWRSb3cwbiAgICAgIEROIEQ3LlU4Ci1kUm93MW4gICAgICBETiBEMjQuVTgKLWRSb3cybiAgICAgIEROIEQzMC5VOAotZFJvdzNuICAgICAgRE4gRDI4LlU4Ci1kUm93NG4gICAgICBETiBEMzEuVTgKLWRSb3c1biAgICAgIEROIEQyNS5VOAotZFJvdzZuICAgICAgRE4gRDI5LlU4Ci1kUm93N24gICAgICBETiBEMTEuVTgKLQotOy8vIGRSb3cwbiAtIGRQXzMsIGRSb3cxbiAtIGRRXzBuLCBkUm93Mm4gLSBkUF8xbiwgZFJvdzNuIC0gZFFfMm4KLTsvLyBkUm93NG4gLSBkUF8yLCBkUm93NW4gLSBkUV8xbiwgZFJvdzZuIC0gZFBfMG4sIGRSb3c3biAtIGRRXzMKLQotOy8vIFBpeGVscwotZFBfMCAgICAgICAgRE4gRDQuVTgKLWRQXzEgICAgICAgIEROIEQ1LlU4ICAKLWRQXzIgICAgICAgIEROIEQ2LlU4ICAKLWRQXzMgICAgICAgIEROIEQ3LlU4ICAKLWRRXzAgICAgICAgIEROIEQ4LlU4ICAKLWRRXzEgICAgICAgIEROIEQ5LlU4ICAKLWRRXzIgICAgICAgIEROIEQxMC5VOCAKLWRRXzMgICAgICAgIEROIEQxMS5VOCAKLQotCi07Ly8gRmlsdGVyaW5nIERlY2lzaW9uCi1kQWxwaGEgICAgICBETiBEMC5VOAotZEJldGEgICAgICAgRE4gRDIuVTgKLQotZEZpbHQgICAgICAgRE4gRDE2LlU4Ci1kQXFmbGcgICAgICBETiBEMTIuVTgKLWRBcGZsZyAgICAgIEROIEQxNy5VOCAKLQotZEFwMHEwICAgICAgRE4gRDEzLlU4Ci1kQXAxcDAgICAgICBETiBEMTIuVTgKLWRBcTFxMCAgICAgIEROIEQxOC5VOAotZEFwMnAwICAgICAgRE4gRDE5LlU4Ci1kQXEycTAgICAgICBETiBEMTcuVTgKLQotOy8vIGJTTFQ0Ci1kVEMwICAgICAgICBETiBEMTguVTggICAKLWRUQzEgICAgICAgIEROIEQxOS5VOCAgIAotZFRDMDEgICAgICAgRE4gRDE4LlU4ICAgCi0KLWRUQ3MgICAgICAgIEROIEQzMS5TOAotZFRDICAgICAgICAgRE4gRDMxLlU4Ci0KLWRNYXNrXzAgICAgIEROIEQxNC5VOAotZE1hc2tfMSAgICAgRE4gRDE1LlU4ICAgIAotCi1NYXNrXzAgICAgICBSTiA2Ci0KLWRUZW1wICAgICAgIEROIEQxOS5VOAotCi07Ly8gQ29tcHV0aW5nIFAwLFEwCi1xRHEwcDAgICAgICBRTiBRMTAuUzE2Ci1xRHAxcTEgICAgICBRTiBRMTEuUzE2Ci1xRGVsdGEgICAgICBRTiBRMTAuUzE2ICA7IHJldXNlIHFEcTBwMAotZERlbHRhICAgICAgRE4gRDIwLlM4Ci0KLQotOy8vIENvbXB1dGluZyBQMSxRMQotZFJwMHEwICAgICAgRE4gRDI0LlU4Ci0KLWRNYXhQICAgICAgIEROIEQyMy5VOAotZE1pblAgICAgICAgRE4gRDIyLlU4Ci0KLWRNYXhRICAgICAgIEROIEQxOS5VOAotZE1pblEgICAgICAgRE4gRDIxLlU4Ci0KLWREZWx0YVAgICAgIEROIEQyNi5VOAotZERlbHRhUSAgICAgRE4gRDI3LlU4Ci0KLXFQXzBuICAgICAgIFFOIFExNC5TMTYKLXFRXzBuICAgICAgIFFOIFExMi5TMTYKLQotZFFfMG4gICAgICAgRE4gRDI0LlU4Ci1kUV8xbiAgICAgICBETiBEMjUuVTgKLWRQXzBuICAgICAgIEROIEQyOS5VOAotZFBfMW4gICAgICAgRE4gRDMwLlU4Ci0KLTsvLyBiU0dFNAotCi1xU3AwcTAgICAgICBRTiBRMTAuVTE2Ci0KLXFTcDJxMSAgICAgIFFOIFExMS5VMTYKLXFTcDBxMHAxICAgIFFOIFExMi5VMTYKLXFTcDNwMiAgICAgIFFOIFExMy5VMTYKLWRIU3AwcTEgICAgIEROIEQyOC5VOAotCi1xU3EycDEgICAgICBRTiBRMTEuVTE2Ci1xU3AwcTBxMSAgICBRTiBRMTIuVTE2Ci1xU3EzcTIgICAgICBRTiBRMTMuVTE2ICA7ISEKLWRIU3EwcDEgICAgIEROIEQyOC5VOCAgIDshIQotCi1xVGVtcDEgICAgICBRTiBRMTEuVTE2ICA7ISE7cVNwMnExIAotcVRlbXAyICAgICAgUU4gUTEyLlUxNiAgOyEhO3FTcDBxMHAxICAgICAgICAKLQotZFBfMHQgICAgICAgRE4gRDI4LlU4ICAgOyEhO2RIU3AwcTEgICAgICAgIAotZFFfMHQgICAgICAgRE4gRDIyLlU4ICAgOyEhO1RlbXAxICAgICAgICAKLQotZFBfMG4gICAgICAgRE4gRDI5LlU4Ci1kUF8xbiAgICAgICBETiBEMzAuVTgKLWRQXzJuICAgICAgIEROIEQzMS5VOAotCi1kUV8wbiAgICAgICBETiBEMjQuVTggICA7ISE7VGVtcDIgICAgICAgIAotZFFfMW4gICAgICAgRE4gRDI1LlU4ICAgOyEhO1RlbXAyICAgICAgICAKLWRRXzJuICAgICAgIEROIEQyOC5VOCAgIDshITtkUV8wdCAgICAgICAgCi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSwgcjExLCBkMTUKLSAgICAgICAgCi0gICAgICAgIDsvL0FyZ3VtZW50cyBvbiB0aGUgc3RhY2sKLSAgICAgICAgTV9BUkcgICBwcFRocmVzaG9sZHMsIDQKLSAgICAgICAgTV9BUkcgICBwcEJTLCA0Ci0gICAgICAgIAotICAgICAgICA7Ly8gZDAtZEFscGhhXzAKLSAgICAgICAgOy8vIGQyLWRCZXRhXzAKLQotICAgICAgICBBREQgICAgICAgICBwQWxwaGFfMSwgcEFscGhhXzAsICMxCi0gICAgICAgIEFERCAgICAgICAgIHBCZXRhXzEsIHBCZXRhXzAsICMxCi0gICAgICAgIAotICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXzBdCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsICM0Ci0gICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXzBdIAotICAgICAgICAKLSAgICAgICAgTV9MRFIgICAgICAgcEJTLCBwcEJTCi0gICAgICAgIE1fTERSICAgICAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMgCi0KLSAgICAgICAgTU9WICAgICAgICAgTWFza18wLCMwCi0KLSAgICAgICAgO2RNYXNrXzAtMTQKLSAgICAgICAgO2RNYXNrXzEtMTUKLQotICAgICAgICBWTU9WICAgICAgICBkTWFza18wLCAjMCAgICAgCi0gICAgICAgIFZNT1YgICAgICAgIGRNYXNrXzEsICMxICAgICAKLQotICAgICAgICBMRFIgICAgICAgICBYWSw9TE9PUF9DT1VOVAotICAgIAotICAgICAgICBBREQgICAgICAgICBwVG1wU3RlcCwgc3JjZHN0U3RlcCwgc3JjZHN0U3RlcAotCi0gICAgICAgIDsvLyBwMC1wMyAtIGQ0LWQ3Ci0gICAgICAgIDsvLyBxMC1xMyAtIGQ4LWQxMQotTG9vcFkgICAgICAgIAotTG9vcFggICAgICAgIAotICAgICAgICBMRFJIICAgICAgICBiUzEwLCBbcEJTXSwgIzQKLQotICAgICAgICBDTVAgICAgICAgICBiUzEwLCAjMAotICAgICAgICBCRVEgICAgICAgICBOb0ZpbHRlckJTMAotCi0gICAgICAgIDsvLyBMb2FkIDggcm93cyBvZiBkYXRhCi0gICAgICAgIEFERCAgICAgICAgIHBUbXAsIHBTcmNEc3QsIHNyY2RzdFN0ZXAKLSAgICAgICAgVkxEMSAgICAgICAgZFJvdzAsIFtwU3JjRHN0XSwgcFRtcFN0ZXAKLSAgICAgICAgVkxEMSAgICAgICAgZFJvdzEsIFtwVG1wXSwgcFRtcFN0ZXAKLSAgICAgICAgVkxEMSAgICAgICAgZFJvdzIsIFtwU3JjRHN0XSwgcFRtcFN0ZXAKLSAgICAgICAgVlpJUC44ICAgICAgZFJvdzAsIGRSb3cxCi0gICAgICAgIFZMRDEgICAgICAgIGRSb3czLCBbcFRtcF0sIHBUbXBTdGVwCi0gICAgICAgIFZMRDEgICAgICAgIGRSb3c0LCBbcFNyY0RzdF0sIHBUbXBTdGVwCi0gICAgICAgIFZaSVAuOCAgICAgIGRSb3cyLCBkUm93MwotICAgICAgICBWTEQxICAgICAgICBkUm93NSwgW3BUbXBdLCBwVG1wU3RlcAotICAgICAgICBWTEQxICAgICAgICBkUm93NiwgW3BTcmNEc3RdLCBwVG1wU3RlcAotICAgICAgICBWTEQxICAgICAgICBkUm93NywgW3BUbXBdLCBwVG1wU3RlcAotICAgICAgICBWWklQLjggICAgICBkUm93NCwgZFJvdzUKLSAgICAgICAgVlpJUC4xNiAgICAgZFJvdzEsIGRSb3czCi0gICAgCi0KLSAgICAgICAgOy8vIGRSb3cwID0gW3EzcjAgcTJyMCBxMXIwIHEwcjAgcDByMCBwMXIwIHAycjAgcDNyMF0KLSAgICAgICAgOy8vIGRSb3cxID0gW3EzcjEgcTJyMSBxMXIxIHEwcjEgcDByMSBwMXIxIHAycjEgcDNyMV0KLSAgICAgICAgOy8vIGRSb3cyID0gW3EzcjIgcTJyMiBxMXIyIHEwcjIgcDByMiBwMXIyIHAycjIgcDNyMl0KLSAgICAgICAgOy8vIGRSb3czID0gW3EzcjMgcTJyMyBxMXIzIHEwcjMgcDByMyBwMXIzIHAycjMgcDNyM10KLSAgICAgICAgOy8vIGRSb3c0ID0gW3EzcjQgcTJyNCBxMXI0IHEwcjQgcDByNCBwMXI0IHAycjQgcDNyNF0KLSAgICAgICAgOy8vIGRSb3c1ID0gW3EzcjUgcTJyNSBxMXI1IHEwcjUgcDByNSBwMXI1IHAycjUgcDNyNV0KLSAgICAgICAgOy8vIGRSb3c2ID0gW3EzcjYgcTJyNiBxMXI2IHEwcjYgcDByNiBwMXI2IHAycjYgcDNyNl0KLSAgICAgICAgOy8vIGRSb3c3ID0gW3EzcjcgcTJyNyBxMXI3IHEwcjcgcDByNyBwMXI3IHAycjcgcDNyN10KLQotICAgICAgICA7Ly8gOHg4IFRyYW5zcG9zZQotCi0gICAgICAgIFZaSVAuOCAgICAgIGRSb3c2LCBkUm93NwotCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMwotICAgICAgICBWWklQLjE2ICAgICBkUm93MCwgZFJvdzIKLSAgICAgICAgVlpJUC4xNiAgICAgZFJvdzUsIGRSb3c3Ci0gICAgICAgIAotCi0gICAgICAgIFZaSVAuMTYgICAgIGRSb3c0LCBkUm93NgotICAgICAgICBWWklQLjMyICAgICBkUm93MSwgZFJvdzUKLSAgICAgICAgVlpJUC4zMiAgICAgZFJvdzIsIGRSb3c2Ci0gICAgICAgIFZaSVAuMzIgICAgIGRSb3czLCBkUm93NwotICAgICAgICBWWklQLjMyICAgICBkUm93MCwgZFJvdzQKLSAgICAgICAgCi0KLSAgICAgICAgOy8vIGRSb3cwIC0gZFBfMywgZFJvdzEgLSBkUV8wLCBkUm93MiAtIGRQXzEsIGRSb3czIC0gZFFfMgotICAgICAgICA7Ly8gZFJvdzQgLSBkUF8yLCBkUm93NSAtIGRRXzEsIGRSb3c2IC0gZFBfMCwgZFJvdzcgLSBkUV8zCi0KLSAgICAgICAgOy8vIGRRXzAgPSBbcTByNyBxMHI2IHEwcjUgcTByNCBxMHIzIHEwcjIgcTByMSBxMHIwXQotICAgICAgICA7Ly8gZFFfMSA9IFtxMXI3IHExcjYgcTFyNSBxMXI0IHExcjMgcTFyMiBxMXIxIHExcjBdCi0gICAgICAgIDsvLyBkUV8yID0gW3EycjcgcTJyNiBxMnI1IHEycjQgcTJyMyBxMnIyIHEycjEgcTJyMF0KLSAgICAgICAgOy8vIGRRXzMgPSBbcTNyNyBxM3I2IHEzcjUgcTNyNCBxM3IzIHEzcjIgcTNyMSBxM3IwXQotCi0gICAgICAgIDsvLyBkUF8wID0gW3AwcjcgcDByNiBwMHI1IHAwcjQgcDByMyBwMHIyIHAwcjEgcDByMF0KLSAgICAgICAgOy8vIGRQXzEgPSBbcDFyNyBwMXI2IHAxcjUgcDFyNCBwMXIzIHAxcjIgcDFyMSBwMXIwXQotICAgICAgICA7Ly8gZFBfMiA9IFtwMnI3IHAycjYgcDJyNSBwMnI0IHAycjMgcDJyMiBwMnIxIHAycjBdCi0gICAgICAgIDsvLyBkUF8zID0gW3AzcjcgcDNyNiBwM3I1IHAzcjQgcDNyMyBwM3IyIHAzcjEgcDNyMF0KLQotICAgICAgICBWQUJEICAgICAgICBkQXAwcTAsIGRQXzAsIGRRXzAKLSAgICAgICAgVkFCRCAgICAgICAgZEFwMXAwLCBkUF8xLCBkUF8wCi0KLSAgICAgICAgVkFCRCAgICAgICAgZEFxMXEwLCBkUV8xLCBkUV8wCi0gICAgICAgIFZBQkQgICAgICAgIGRBcDJwMCwgZFBfMiwgZFBfMAotICAgICAgICAKLSAgICAgICAgVFNUICAgICAgICAgYlMxMCwgIzB4ZmYKLSAgICAgICAgVkNHVCAgICAgICAgZEZpbHQsIGRBbHBoYSwgZEFwMHEwCi0KLSAgICAgICAgVk1BWCAgICAgICAgZEFwMXAwLCBkQXExcTAsIGRBcDFwMAotICAgICAgICBWQUJEICAgICAgICBkQXEycTAsIGRRXzIsIGRRXzAKLQotICAgICAgICBWTU9WRVEuVTMyICBkRmlsdFswXSwgTWFza18wCi0gICAgICAgIFRTVCAgICAgICAgIGJTMTAsICMweGZmMDAKLQotICAgICAgICBWQ0dUICAgICAgICBkQXAycDAsIGRCZXRhLCBkQXAycDAKLSAgICAgICAgVkNHVCAgICAgICAgZEFwMXAwLCBkQmV0YSwgZEFwMXAwCi0KLSAgICAgICAgVk1PVkVRLlUzMiAgZEZpbHRbMV0sIE1hc2tfMAotCi0gICAgICAgIFZDR1QgICAgICAgIGRBcTJxMCwgZEJldGEsIGRBcTJxMAotICAgICAgICBWQU5EICAgICAgICBkRmlsdCwgZEZpbHQsIGRBcDFwMAotICAgICAgICBUU1QgICAgICAgICBiUzEwLCAjNCAKLQotICAgICAgICBWQU5EICAgICAgICBkQXFmbGcsIGRGaWx0LCBkQXEycTAKLSAgICAgICAgVkFORCAgICAgICAgZEFwZmxnLCBkRmlsdCwgZEFwMnAwCi0gICAgCi0gICAgICAgIEJORSAgICAgICAgIGJTR0U0ICAgICAgICAKLWJTTFQ0Ci0gICAgICAgIDsvLyBiUyA8IDQgRmlsdGVyaW5nCi0KLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQotCi0gICAgICAgIDsvLyBUcmFuc3Bvc2UKLQotICAgICAgICBWWklQLjggICAgICBkUF8zLCAgZFBfMiAgCi0gICAgICAgIFZaSVAuOCAgICAgIGRQXzFuLCBkUF8wbgotICAgICAgICBWWklQLjggICAgICBkUV8wbiwgZFFfMW4KLSAgICAgICAgVlpJUC44ICAgICAgZFFfMiwgIGRRXzMKLQotICAgICAgICAKLSAgICAgICAgVlpJUC4xNiAgICAgZFBfMywgIGRQXzFuCi0gICAgICAgIEFERCAgICAgICAgIHBUbXAsIHBTcmNEc3QsIHNyY2RzdFN0ZXAKLSAgICAgICAgVlpJUC4xNiAgICAgZFFfMG4sIGRRXzIKLSAgICAgICAgVlpJUC4xNiAgICAgZFFfMW4sIGRRXzMKLSAgICAgICAgVlpJUC4xNiAgICAgZFBfMiwgIGRQXzBuCi0KLSAgICAgICAgVlpJUC4zMiAgICAgZFBfMywgIGRRXzBuCi0gICAgICAgIFZaSVAuMzIgICAgIGRQXzFuLCBkUV8yCi0gICAgICAgIFZaSVAuMzIgICAgIGRQXzIsICBkUV8xbgotICAgICAgICBWWklQLjMyICAgICBkUF8wbiwgZFFfMwotCi0gICAgICAgIDsvLyBkUm93bjAgLSBkUF8zLCAgZFJvd24xIC0gZFFfMG4KLSAgICAgICAgOy8vIGRSb3duMiAtIGRQXzFuLCBkUm93bjMgLSBkUV8yCi0gICAgICAgIDsvLyBkUm93bjQgLSBkUF8yLCAgZFJvd241IC0gZFFfMW4KLSAgICAgICAgOy8vIGRSb3duNiAtIGRQXzBuLCBkUm93bjcgLSBkUV8zCi0KLSAgICAgICAgVlNUMSAgICAgICAgZFJvd24wLCBbcFNyY0RzdF0sIHBUbXBTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSb3duMSwgW3BUbXBdLCBwVG1wU3RlcAotICAgICAgICBWU1QxICAgICAgICBkUm93bjIsIFtwU3JjRHN0XSwgcFRtcFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJvd24zLCBbcFRtcF0sIHBUbXBTdGVwCi0gICAgICAgIDsxCi0gICAgICAgIFZTVDEgICAgICAgIGRSb3duNCwgW3BTcmNEc3RdLCBwVG1wU3RlcAotICAgICAgICBWU1QxICAgICAgICBkUm93bjUsIFtwVG1wXSwgcFRtcFN0ZXAKLSAgICAgICAgQUREUyAgICAgICAgWFksIFhZLCBYWQotICAgICAgICBWU1QxICAgICAgICBkUm93bjYsIFtwU3JjRHN0XSwgcFRtcFN0ZXAKLSAgICAgICAgQUREICAgICAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjMgotICAgICAgICBWU1QxICAgICAgICBkUm93bjcsIFtwVG1wXSwgc3JjZHN0U3RlcAotCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMwotICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXzFdCi0gICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsICM0Ci0gICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXzFdCi0KLSAgICAgICAgQkNDICAgICAgICAgTG9vcFgKLSAgICAgICAgQiAgICAgICAgICAgRXhpdExvb3BZICAgICAgICAKLQotTm9GaWx0ZXJCUzAKLSAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzQKLSAgICAgICAgQUREUyAgICAgICAgWFksIFhZLCBYWQotICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXzFdCi0gICAgICAgIEFERCAgICAgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzQKLSAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFfMV0KLSAgICAgICAgQkNDICAgICAgICAgTG9vcFgKLSAgICAgICAgQiAgICAgICAgICAgRXhpdExvb3BZICAgICAgICAKLWJTR0U0ICAgICAgICAKLSAgICAgICAgOy8vIGJTID49IDQgRmlsdGVyaW5nCi0gICAgICAgIAotICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCi0KLSAgICAgICAgOy8vIFRyYW5zcG9zZQotCi0gICAgICAgIFZaSVAuOCAgICAgIGRQXzMsICBkUF8ybiAgIAotICAgICAgICBWWklQLjggICAgICBkUF8xbiwgZFBfMG4KLSAgICAgICAgVlpJUC44ICAgICAgZFFfMG4sIGRRXzFuCi0gICAgICAgIFZaSVAuOCAgICAgIGRRXzJuLCBkUV8zCi0KLSAgICAgICAgVlpJUC4xNiAgICAgZFBfMywgIGRQXzFuCi0gICAgICAgIEFERCAgICAgICAgIHBUbXAsIHBTcmNEc3QsIHNyY2RzdFN0ZXAKLSAgICAgICAgVlpJUC4xNiAgICAgZFFfMG4sIGRRXzJuCi0gICAgICAgIFZaSVAuMTYgICAgIGRRXzFuLCBkUV8zCi0gICAgICAgIFZaSVAuMTYgICAgIGRQXzJuLCBkUF8wbgotCi0gICAgICAgIFZaSVAuMzIgICAgIGRQXzMsICBkUV8wbgotICAgICAgICBWWklQLjMyICAgICBkUF8xbiwgZFFfMm4KLSAgICAgICAgVlpJUC4zMiAgICAgZFBfMm4sIGRRXzFuCi0gICAgICAgIFZaSVAuMzIgICAgIGRQXzBuLCBkUV8zCi0KLSAgICAgICAgOy8vIGRSb3cwbiAtIGRQXzMsIGRSb3cxbiAtIGRRXzBuLCBkUm93Mm4gLSBkUF8xbiwgZFJvdzNuIC0gZFFfMm4KLSAgICAgICAgOy8vIGRSb3c0biAtIGRQXzIsIGRSb3c1biAtIGRRXzFuLCBkUm93Nm4gLSBkUF8wbiwgZFJvdzduIC0gZFFfMwotICAgICAgICAKLSAgICAgICAgVlNUMSAgICAgICAgZFJvdzBuLCBbcFNyY0RzdF0sIHBUbXBTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSb3cxbiwgW3BUbXBdLCBwVG1wU3RlcAotICAgICAgICBWU1QxICAgICAgICBkUm93Mm4sIFtwU3JjRHN0XSwgcFRtcFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJvdzNuLCBbcFRtcF0sIHBUbXBTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSb3c0biwgW3BTcmNEc3RdLCBwVG1wU3RlcAotICAgICAgICBWU1QxICAgICAgICBkUm93NW4sIFtwVG1wXSwgcFRtcFN0ZXAKLSAgICAgICAgQUREUyAgICAgICAgWFksWFksWFkKLSAgICAgICAgVlNUMSAgICAgICAgZFJvdzZuLCBbcFNyY0RzdF0sIHBUbXBTdGVwCi0gICAgICAgIEFERCAgICAgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzQKLSAgICAgICAgVlNUMSAgICAgICAgZFJvdzduLCBbcFRtcF0sIHBUbXBTdGVwCi0KLSAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMzCi0gICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFfMV0KLSAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzQKLSAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFfMV0KLQotICAgICAgICBCQ0MgICAgICAgICBMb29wWAotCi1FeGl0TG9vcFkgICAgICAgIAotICAgICAgICBTVUIgICAgICAgICBwQlMsIHBCUywgIzE0Ci0gICAgICAgIFNVQiAgICAgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzE0Ci0gICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsICMxNgotICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXzBdCi0gICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMyAKLSAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFfMF0KLSAgICAgICAgQk5FICAgICAgICAgTG9vcFkKLQotICAgICAgICBNT1YgICAgICAgICByMCwgI09NWF9TdHNfTm9FcnIKLQotICAgICAgICBNX0VORAotICAgICAgICAKLSAgICBFTkRJRgotICAgIAotICAgICAgICAKLSAgICAgICAgRU5ECi0gICAgICAgIAotICAgICAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YjNmNDEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDEyMjkwCi0gKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSAxLzggUGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgQ2hyb21hIEJsb2NrCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSwKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIDEvOC1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBjaHJvbWEgTUIuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwU3JjCVBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyCi0gKiBbaW5dCXNyY1N0ZXAgUmVmZXJlbmNlIGZyYW1lIHN0ZXAgaW4gYnl0ZQotICogW2luXQlkc3RTdGVwIERlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZS4gTXVzdCBiZSBtdWx0aXBsZSBvZiByb2kud2lkdGguCi0gKiBbaW5dCWR4CQlGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudAotICoJCQkJCQlpbiAxLzggcGl4ZWwgdW5pdDt2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10KLSAqIFtpbl0JZHkJCUZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudAotICoJCQkJCQlpbiAxLzggcGl4ZWwgdW5pdDt2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10KLSAqIFtpbl0Jcm9pCQlEaW1lbnNpb24gb2YgdGhlIGludGVycG9sYXRpb24gcmVnaW9uO3RoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgcm9pLmhlaWdodCBtdXN0Ci0gKiAgICAgICAgICAgICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgMiwgNCwgb3IgOC4KLSAqIFtvdXRdCXBEc3QJUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZnJhbWUgYnVmZmVyLgotICogICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT0yLCAgMi1ieXRlIGFsaWdubWVudCByZXF1aXJlZAotICogICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZAotICogICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4KLSAqIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgT01YX1N0c19CYWRBcmdFcnI6Ci0gKglwU3JjIG9yIHBEc3QgaXMgTlVMTC4KLSAqCXNyY1N0ZXAgb3IgZHN0U3RlcCA8IDguCi0gKglkeCBvciBkeSBpcyBvdXQgb2YgcmFuZ2UgWzAtN10uCi0gKglyb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBvdXQgb2YgcmFuZ2UgezIsNCw4fS4KLSAqCXJvaS53aWR0aCBpcyBlcXVhbCB0byAyLCBidXQgcERzdCBpcyBub3QgMi1ieXRlIGFsaWduZWQuCi0gKglyb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgYnV0IHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLgotICoJcm9pLndpZHRoIGlzIGVxdWFsIHRvIDgsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4KLSAqCXNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LgotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAoCi0gICAgIGNvbnN0IE9NWF9VOCogcFNyYywKLSAgICAgT01YX1MzMiBzcmNTdGVwLAotICAgICBPTVhfVTgqIHBEc3QsCi0gICAgIE9NWF9TMzIgZHN0U3RlcCwKLSAgICAgT01YX1MzMiBkeCwKLSAgICAgT01YX1MzMiBkeSwKLSAgICAgT01YU2l6ZSByb2kKLSApCi17Ci0gICAgcmV0dXJuIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hIAotICAgICAgICAoKE9NWF9VOCopcFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcCwgcm9pLndpZHRoLCByb2kuaGVpZ2h0LCBkeCwgZHkpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjhmNjllLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNTY3ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLTsvLyBGdW5jdGlvbjoKLTsvLyAgICAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEKLTsvLwotOy8vIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSBpbiB2NiBhc3NlbWJseS4KLTsvLyBQZXJmb3JtcyBxdWFydGVyIHBlbCBpbnRlcnBvbGF0aW9uIG9mIGludGVyIGx1bWEgTUIuCi07Ly8gSXQncyBhc3N1bWVkIHRoYXQgdGhlIGZyYW1lIGlzIGFscmVhZHkgcGFkZGVkIHdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgotOy8vIFBhcmFtZXRlcnM6Ci07Ly8gW2luXSAgICBwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlcgotOy8vIFtpbl0gICAgc3JjU3RlcCAgICAgUmVmZXJlbmNlIGZyYW1lIHN0ZXAgaW4gYnl0ZQotOy8vIFtpbl0gICAgZHN0U3RlcCAgICAgRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlLiBNdXN0IGJlIG11bHRpcGxlIG9mIHJvaS53aWR0aAotOy8vIFtpbl0gICAgZHggICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvcgotOy8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDNdCi07Ly8gW2luXSAgICBkeSAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvcgotOy8vICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDNdCi07Ly8gW2luXSAgICByb2kgICAgICAgICBEaW1lbnNpb24gb2YgdGhlIGludGVycG9sYXRpb24gcmVnaW9uO3RoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgcm9pLmhlaWdodCBtdXN0Ci07Ly8gICAgICAgICAgICAgICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LgotOy8vIFtvdXRdICAgcERzdCAgICAgICAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZnJhbWUgYnVmZmVyLgotOy8vICAgICAgICAgICAgICAgICAgIGlmIHJvaS53aWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQKLTsvLyAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCi07Ly8gICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQKLTsvLwotOy8vIFJldHVybiBWYWx1ZToKLTsvLyBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuCi07Ly8gSXQgaXMgYXNzdWVkIHRoYXQgZm9sbG93aW5nIGNhc2VzIGFyZSBzYXRpc2ZpZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbjoKLTsvLyAgcFNyYyBvciBwRHN0IGlzIG5vdCBOVUxMLgotOy8vICBzcmNTdGVwIG9yIGRzdFN0ZXAgPj0gcm9pLndpZHRoLgotOy8vICAgICBkeCBvciBkeSBpcyBpbiB0aGUgcmFuZ2UgWzAtM10uCi07Ly8gICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG5vdCBvdXQgb2YgcmFuZ2UgezQsIDgsIDE2fS4KLTsvLyAgICAgSWYgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIERzdCBpcyA0IGJ5dGUgYWxpZ25lZC4KLTsvLyAgICAgSWYgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDgsIHBEc3QgaXMgOCBieXRlIGFsaWduZWQuCi07Ly8gICAgIElmIHJvaS53aWR0aCBpcyBlcXVhbCB0byAxNiwgcERzdCBpcyAxNiBieXRlIGFsaWduZWQuCi07Ly8gICAgIHNyY1N0ZXAgYW5kIGRzdFN0ZXAgaXMgbXVsdGlwbGUgb2YgOC4KLTsvLwotOy8vCi0KLQotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0KLSAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotCi0gICAgICAgIEVYUE9SVCBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYQotICAgICAgICAKLQotICAgIElGIENvcnRleEE4Ci0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCi0gICAgRU5ESUYKLSAgICAKLSAgICAKLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi1wU3JjICAgICAgICAgICAgUk4gMAotc3JjU3RlcCAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICBSTiAyCi1kc3RTdGVwICAgICAgICAgUk4gMwotaUhlaWdodCAgICAgICAgIFJOIDQKLWlXaWR0aCAgICAgICAgICBSTiA1Ci0KLTsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKLWlkeCAgICAgICAgICAgICBSTiA2Ci1pZHkgICAgICAgICAgICAgUk4gNwotaW5kZXggICAgICAgICAgIFJOIDYKLVRlbXAgICAgICAgICAgICBSTiAxMgotcEFyZ3MgICAgICAgICAgIFJOIDExCi0KLQotICAgIElGIENvcnRleEE4Ci0KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyBJbnRlcnBvbGF0aW9uIG9mIGx1bWEgaXMgaW1wbGVtZW50ZWQgYnkgcHJvY2Vzc2luZyBibG9jayBvZiBwaXhlbHMsIHNpemUgNHg0IGF0IGEgdGltZS4KLSAgICAgICAgOy8vCi0gICAgICAgIE1fQUxMT0M0ICAgIHBwQXJncywgMTYKLSAgICAgICAgCi0gICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSwgcjExLCBkMTUKLQotcFNyY0JLICAgICAgICAgIFJOIDgKLQotOy8vIERlY2xhcmUgTmVvbiByZWdpc3RlcnMKLWRDb2VmZjUgICAgICAgICBETiAzMC5TMTYKLWRDb2VmZjIwICAgICAgICBETiAzMS5TMTYKLQotOy8vIFJlZ2lzdGVycyB1c2VkIGZvciBpbXBsZW1lbnRpbmcgSG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uCi1kU3JjMGMgICAgICAgICAgRE4gMTQuVTgKLWRTcmMxYyAgICAgICAgICBETiAxNi5VOAotZFNyYzJjICAgICAgICAgIEROIDE4LlU4Ci1kU3JjM2MgICAgICAgICAgRE4gMjAuVTggICAgICAgICAgICAgICAgICAgCi1kU3JjMGQgICAgICAgICAgRE4gMTUuVTgKLWRTcmMxZCAgICAgICAgICBETiAxNy5VOAotZFNyYzJkICAgICAgICAgIEROIDE5LlU4Ci1kU3JjM2QgICAgICAgICAgRE4gMjEuVTgKLWRBY2NIMCAgICAgICAgICBETiAyMi5VOAotZEFjY0gxICAgICAgICAgIEROIDI0LlU4Ci1kQWNjSDIgICAgICAgICAgRE4gMjYuVTgKLWRBY2NIMyAgICAgICAgICBETiAyOC5VOAotZFJlc3VsdEgwICAgICAgIEROIDIyLlUzMgotZFJlc3VsdEgxICAgICAgIEROIDI0LlUzMgotZFJlc3VsdEgyICAgICAgIEROIDI2LlUzMgotZFJlc3VsdEgzICAgICAgIEROIDI4LlUzMgotCi07Ly8gUmVnaXN0ZXJzIHVzZWQgZm9yIGltcGxlbWVudGluZyBWZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCi1kU3JjMCAgICAgICAgICAgRE4gOS5VOAotZFNyYzEgICAgICAgICAgIEROIDEwLlU4Ci1kU3JjMiAgICAgICAgICAgRE4gMTEuVTgKLWRTcmMzICAgICAgICAgICBETiAxMi5VOAotZFNyYzQgICAgICAgICAgIEROIDEzLlU4Ci1kQWNjVjAgICAgICAgICAgRE4gMC5VOAotZEFjY1YxICAgICAgICAgIEROIDIuVTgKLWRBY2NWMiAgICAgICAgICBETiA0LlU4Ci1kQWNjVjMgICAgICAgICAgRE4gNi5VOAotZFJlc3VsdFYwICAgICAgIEROIDAuVTMyCi1kUmVzdWx0VjEgICAgICAgRE4gMi5VMzIKLWRSZXN1bHRWMiAgICAgICBETiA0LlUzMgotZFJlc3VsdFYzICAgICAgIEROIDYuVTMyCi0gICAgICAgIAotOy8vIFJlZ2lzdGVycyB1c2VkIGZvciBpbXBsZW1lbnRpbmcgRGlhZ29uYWwgaW50ZXJwb2xhdGlvbgotZFRBY2MwICAgICAgICAgIEROIDAuVTgKLWRUQWNjMSAgICAgICAgICBETiAyLlU4Ci1kVEFjYzIgICAgICAgICAgRE4gNC5VOAotZFRBY2MzICAgICAgICAgIEROIDYuVTgKLWRUUmVzMCAgICAgICAgICBETiAwLjMyCi1kVFJlczEgICAgICAgICAgRE4gMi4zMgotZFRSZXMyICAgICAgICAgIEROIDQuMzIKLWRUUmVzMyAgICAgICAgICBETiA2LjMyCi1kVFJlc3VsdDAgICAgICAgRE4gMTQuVTgKLWRUUmVzdWx0MSAgICAgICBETiAxNi5VOAotZFRSZXN1bHQyICAgICAgIEROIDE4LlU4Ci1kVFJlc3VsdDMgICAgICAgRE4gMjAuVTgKLWRUZW1wUDAgICAgICAgICBETiAxOC5TMTYKLWRUZW1wUDEgICAgICAgICBETiAxOS5TMTYKLWRUZW1wUTAgICAgICAgICBETiAyMC5TMTYKLWRUZW1wUTEgICAgICAgICBETiAyMS5TMTYKLWRUZW1wUjAgICAgICAgICBETiAyMi5TMTYKLWRUZW1wUjEgICAgICAgICBETiAyMy5TMTYKLWRUZW1wUzAgICAgICAgICBETiAyNC5TMTYKLWRUZW1wUzEgICAgICAgICBETiAyNS5TMTYKLXFUZW1wUDAxICAgICAgICBRTiA5LlMxNgotcVRlbXBRMDEgICAgICAgIFFOIDEwLlMxNgotcVRlbXBSMDEgICAgICAgIFFOIDExLlMxNgotcVRlbXBTMDEgICAgICAgIFFOIDEyLlMxNgotCi07Ly8gSW50ZXJtZWRpYXRlIHZhbHVlcyBmb3IgYXZlcmFnaW5nCi1xUmVzMiAgICAgICAgICAgUU4gNy5TMTYKLXFSZXMzICAgICAgICAgICBRTiA4LlMxNgotcVJlczQgICAgICAgICAgIFFOIDkuUzE2Ci1xUmVzNSAgICAgICAgICAgUU4gMTAuUzE2Ci1xUmVzNiAgICAgICAgICAgUU4gMTEuUzE2Ci0gICAgICAgCi07Ly8gRm9yIGltcGxlbWVudGluZyBjb3B5Ci1kRHN0MCAgICAgICAgICAgIEROIDkuMzIKLWREc3QxICAgICAgICAgICAgRE4gMTAuMzIKLWREc3QyICAgICAgICAgICAgRE4gMTEuMzIKLWREc3QzICAgICAgICAgICAgRE4gMTIuMzIKLQotICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cwotICAgICAgICBNX0FSRyAgICAgICBwdHJpZHgsIDQKLSAgICAgICAgTV9BUkcgICAgICAgcHRyaWR5LCA0ICAgICAgICAKLSAgICAgICAgTV9BUkcgICAgICAgcHRyV2lkdGgsIDQKLSAgICAgICAgTV9BUkcgICAgICAgcHRySGVpZ2h0LCA0ICAgICAgICAKLQotICAgICAgICA7Ly8gTG9hZCBzdHJ1Y3R1cmUgZWxlbWVudHMgb2Ygcm9pIAotICAgICAgICBNX0xEUiAgICAgICBpZHgsIHB0cmlkeAotICAgICAgICBNX0xEUiAgICAgICBpZHksIHB0cmlkeQotICAgICAgICBNX0xEUiAgICAgICBpV2lkdGgsIHB0cldpZHRoCi0gICAgICAgIE1fTERSICAgICAgIGlIZWlnaHQsIHB0ckhlaWdodAotICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgaW5kZXgsIGlkeCwgaWR5LCBMU0wgIzIgICAgICAgICAgICAgICAgIDsvLyAgW2luZGV4XSA9IFtpZHldW2lkeF0KLSAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIE1vdmUgY29lZmZpY2llbnRzIE5lb24gcmVnaXN0ZXJzCi0gICAgICAgIFZNT1YgICAgICAgIGRDb2VmZjIwLCAjMjAKLSAgICAgICAgVk1PViAgICAgICAgZENvZWZmNSwgIzUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLUJsb2NrNHg0V2lkdGhMb29wCi1CbG9jazR4NEhlaWdodExvb3AKLQotICAgICAgICBTVE0gICAgICAgICBwQXJncywge3BTcmMsc3JjU3RlcCxwRHN0LGRzdFN0ZXB9IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBzd2l0Y2ggdGFibGUgdXNpbmcgbW90aW9uIHZlY3RvciBhcyBpbmRleAotICAgICAgICBBREQgICAgICAgICBwYywgcGMsIGluZGV4LCBMU0wgIzIKLSAgICAgICAgQiAgICAgICAgICAgQ2FzZV9mCi0gICAgICAgIEIgICAgICAgICAgIENhc2VfMCAgICAgICAgCi0gICAgICAgIEIgICAgICAgICAgIENhc2VfMSAgICAgICAgCi0gICAgICAgIEIgICAgICAgICAgIENhc2VfMiAgICAgICAgCi0gICAgICAgIEIgICAgICAgICAgIENhc2VfMyAgICAgICAgCi0gICAgICAgIEIgICAgICAgICAgIENhc2VfNCAgICAgICAgCi0gICAgICAgIEIgICAgICAgICAgIENhc2VfNSAgICAgICAgCi0gICAgICAgIEIgICAgICAgICAgIENhc2VfNiAgICAgICAgCi0gICAgICAgIEIgICAgICAgICAgIENhc2VfNyAgICAgICAgCi0gICAgICAgIEIgICAgICAgICAgIENhc2VfOCAgICAgICAgCi0gICAgICAgIEIgICAgICAgICAgIENhc2VfOSAgICAgICAgCi0gICAgICAgIEIgICAgICAgICAgIENhc2VfYSAgICAgICAgCi0gICAgICAgIEIgICAgICAgICAgIENhc2VfYiAgICAgICAgCi0gICAgICAgIEIgICAgICAgICAgIENhc2VfYyAgICAgICAgCi0gICAgICAgIEIgICAgICAgICAgIENhc2VfZAotICAgICAgICBCICAgICAgICAgICBDYXNlX2UgICAgICAgIAotICAgICAgICBCICAgICAgICAgICBDYXNlX2YKLSAgICAgICAgICAgICAgICAgICAgCi1DYXNlXzAgICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBDYXNlIEcKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgMCBcbiIKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkcyBhIDR4NCBibG9jayBvZiAuOCBhbmQgc3RvcmVzIGFzIC4zMgotICAgICAgICBBREQgICAgICAgICBUZW1wLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEgCi0gICAgICAgIFZMRDEgICAgICAgIGRTcmMwLCBbcFNyY10sIHNyY1N0ZXAKLSAgICAgICAgVkxEMSAgICAgICAgZFNyYzIsIFtUZW1wXSwgc3JjU3RlcAotICAgICAgICBWTEQxICAgICAgICBkU3JjMSwgW3BTcmNdCi0gICAgICAgIFZMRDEgICAgICAgIGRTcmMzLCBbVGVtcF0KLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKLSAgICAgICAgVlNUMSAgICAgICAgZERzdDBbMF0sIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkRHN0MlswXSwgW1RlbXBdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGREc3QxWzBdLCBbcERzdF0KLSAgICAgICAgVlNUMSAgICAgICAgZERzdDNbMF0sIFtUZW1wXQotICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCi0gICAgICAgIEIgICAgICAgICAgIEJsb2NrNHg0TG9vcEVuZAotQ2FzZV8xCi0gICAgICAgIDsvLyBDYXNlIGEKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgMSBcbiIKLQotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMgotICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZSAgICAgICAgCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NIMCwgZEFjY0gwLCBkU3JjMGMKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gyLCBkQWNjSDIsIGRTcmMyYwotICAgICAgICBWUkhBREQgICAgICBkQWNjSDEsIGRBY2NIMSwgZFNyYzFjCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NIMywgZEFjY0gzLCBkU3JjM2MKLSAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDBbMF0sIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDJbMF0sIFtUZW1wXSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDFbMF0sIFtwRHN0XQotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDNbMF0sIFtUZW1wXQotICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCi0gICAgICAgIEIgICAgICAgICAgIEJsb2NrNHg0TG9vcEVuZCAgICAgICAgCi1DYXNlXzIKLSAgICAgICAgOy8vIENhc2UgYgotICAgICAgICBNX1BSSU5URiAiQ2FzZSAyIFxuIgotCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyICAgICAgICAKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKLSAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDBbMF0sIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDJbMF0sIFtUZW1wXSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDFbMF0sIFtwRHN0XQotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDNbMF0sIFtUZW1wXQotICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCi0gICAgICAgIEIgICAgICAgICAgIEJsb2NrNHg0TG9vcEVuZCAgICAgICAgCi1DYXNlXzMKLSAgICAgICAgOy8vIENhc2UgYwotICAgICAgICBNX1BSSU5URiAiQ2FzZSAzIFxuIgotCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyCi0gICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlICAgICAgICAKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gwLCBkQWNjSDAsIGRTcmMwZAotICAgICAgICBWUkhBREQgICAgICBkQWNjSDIsIGRBY2NIMiwgZFNyYzJkCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NIMSwgZEFjY0gxLCBkU3JjMWQKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gzLCBkQWNjSDMsIGRTcmMzZAotICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMFswXSwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMlswXSwgW1RlbXBdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMVswXSwgW3BEc3RdCi0gICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIM1swXSwgW1RlbXBdCi0gICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgQiAgICAgICAgICAgQmxvY2s0eDRMb29wRW5kICAgICAgICAKLUNhc2VfNAotICAgICAgICA7Ly8gQ2FzZSBkCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIDQgXG4iCi0KLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlICAgICAgICAKLSAgICAgICAgVlJIQUREICAgICAgZEFjY1YwLCBkQWNjVjAsIGRTcmMwCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NWMiwgZEFjY1YyLCBkU3JjMgotICAgICAgICBWUkhBREQgICAgICBkQWNjVjEsIGRBY2NWMSwgZFNyYzEKLSAgICAgICAgVlJIQUREICAgICAgZEFjY1YzLCBkQWNjVjMsIGRTcmMzCi0gICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYwWzBdLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYxWzBdLCBbcERzdF0KLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYzWzBdLCBbVGVtcF0KLSAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncwotICAgICAgICBCICAgICAgICAgICBCbG9jazR4NExvb3BFbmQgICAgICAgIAotQ2FzZV81Ci0gICAgICAgIDsvLyBDYXNlIGUKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgNSBcbiIKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgICAgIHBTcmNCSywgcFNyYwotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUgICAgICAgIAotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjQkssICMyCi0gICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlICAgICAgICAKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gwLCBkQWNjSDAsIGRBY2NWMAotICAgICAgICBWUkhBREQgICAgICBkQWNjSDIsIGRBY2NIMiwgZEFjY1YyCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NIMSwgZEFjY0gxLCBkQWNjVjEKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gzLCBkQWNjSDMsIGRBY2NWMyAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgwWzBdLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgxWzBdLCBbcERzdF0KLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgzWzBdLCBbVGVtcF0KLSAgICAgICAgCi0gICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQgICAgICAgIAotQ2FzZV82Ci0gICAgICAgIDsvLyBDYXNlIGYKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgNiBcbiIKLQotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCi0gICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MCwgcVJlczIsICM1ICAgICAgICAKLSAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQxLCBxUmVzMywgIzUgICAgICAgIAotICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDIsIHFSZXM0LCAjNSAgICAgICAgCi0gICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MywgcVJlczUsICM1ICAgICAgICAKLSAgICAgICAgVlJIQUREICAgICAgZFRBY2MwLCBkVEFjYzAsIGRUUmVzdWx0MAotICAgICAgICBWUkhBREQgICAgICBkVEFjYzIsIGRUQWNjMiwgZFRSZXN1bHQyCi0gICAgICAgIFZSSEFERCAgICAgIGRUQWNjMSwgZFRBY2MxLCBkVFJlc3VsdDEKLSAgICAgICAgVlJIQUREICAgICAgZFRBY2MzLCBkVEFjYzMsIGRUUmVzdWx0MwotICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzMFswXSwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzMlswXSwgW1RlbXBdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzMVswXSwgW3BEc3RdCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzM1swXSwgW1RlbXBdCi0gICAgICAgIAotICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kICAgICAgICAKLUNhc2VfNwotICAgICAgICA7Ly8gQ2FzZSBnCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIDcgXG4iCi0gICAgICAgIE1PViAgICAgICAgIHBTcmNCSywgcFNyYwotICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjLCAjMQotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUgICAgICAgIAotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjQkssICMyCi0gICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlICAgICAgICAKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gwLCBkQWNjSDAsIGRBY2NWMAotICAgICAgICBWUkhBREQgICAgICBkQWNjSDIsIGRBY2NIMiwgZEFjY1YyCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NIMSwgZEFjY0gxLCBkQWNjVjEKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gzLCBkQWNjSDMsIGRBY2NWMyAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgwWzBdLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgxWzBdLCBbcERzdF0KLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgzWzBdLCBbVGVtcF0KLSAgICAgICAgCi0gICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKLUNhc2VfOAotICAgICAgICA7Ly8gQ2FzZSBoCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIDggXG4iCi0KLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjBbMF0sIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjJbMF0sIFtUZW1wXSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjFbMF0sIFtwRHN0XQotICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0VjNbMF0sIFtUZW1wXQotICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCi0gICAgICAgIEIgICAgICAgICAgIEJsb2NrNHg0TG9vcEVuZAotQ2FzZV85Ci0gICAgICAgIDsvLyBDYXNlIGkKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgOSBcbiIKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyCi0gICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQotICAgICAgICBWRVhUICAgICAgICBkVGVtcFAwLCBkVGVtcFAwLCBkVGVtcFAxLCAjMgotICAgICAgICBWRVhUICAgICAgICBkVGVtcFEwLCBkVGVtcFEwLCBkVGVtcFExLCAjMgotICAgICAgICBWRVhUICAgICAgICBkVGVtcFIwLCBkVGVtcFIwLCBkVGVtcFIxLCAjMgotICAgICAgICBWRVhUICAgICAgICBkVGVtcFMwLCBkVGVtcFMwLCBkVGVtcFMxLCAjMgotICAgICAgICAKLSAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQwLCBxVGVtcFAwMSwgIzUgICAgICAgIAotICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDEsIHFUZW1wUTAxLCAjNSAgICAgICAgCi0gICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MiwgcVRlbXBSMDEsICM1ICAgICAgICAKLSAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQzLCBxVGVtcFMwMSwgIzUgICAgICAgIAotCi0gICAgICAgIFZSSEFERCAgICAgIGRUQWNjMCwgZFRBY2MwLCBkVFJlc3VsdDAKLSAgICAgICAgVlJIQUREICAgICAgZFRBY2MyLCBkVEFjYzIsIGRUUmVzdWx0MgotICAgICAgICBWUkhBREQgICAgICBkVEFjYzEsIGRUQWNjMSwgZFRSZXN1bHQxCi0gICAgICAgIFZSSEFERCAgICAgIGRUQWNjMywgZFRBY2MzLCBkVFJlc3VsdDMKLSAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAotICAgICAgICBWU1QxICAgICAgICBkVFJlczBbMF0sIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkVFJlczJbMF0sIFtUZW1wXSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkVFJlczFbMF0sIFtwRHN0XQotICAgICAgICBWU1QxICAgICAgICBkVFJlczNbMF0sIFtUZW1wXQotICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlX2EKLSAgICAgICAgOy8vIENhc2UgagotICAgICAgICBNX1BSSU5URiAiQ2FzZSBhIFxuIgotCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMgotICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKLSAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAotICAgICAgICBWU1QxICAgICAgICBkVFJlczBbMF0sIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkVFJlczJbMF0sIFtUZW1wXSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkVFJlczFbMF0sIFtwRHN0XQotICAgICAgICBWU1QxICAgICAgICBkVFJlczNbMF0sIFtUZW1wXQotICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlX2IKLSAgICAgICAgOy8vIENhc2UgawotICAgICAgICBNX1BSSU5URiAiQ2FzZSBiIFxuIgotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIKLSAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCi0gICAgICAgIFZFWFQgICAgICAgIGRUZW1wUDAsIGRUZW1wUDAsIGRUZW1wUDEsICMzCi0gICAgICAgIFZFWFQgICAgICAgIGRUZW1wUTAsIGRUZW1wUTAsIGRUZW1wUTEsICMzCi0gICAgICAgIFZFWFQgICAgICAgIGRUZW1wUjAsIGRUZW1wUjAsIGRUZW1wUjEsICMzCi0gICAgICAgIFZFWFQgICAgICAgIGRUZW1wUzAsIGRUZW1wUzAsIGRUZW1wUzEsICMzCi0gICAgICAgIAotICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDAsIHFUZW1wUDAxLCAjNSAgICAgICAgCi0gICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MSwgcVRlbXBRMDEsICM1ICAgICAgICAKLSAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQyLCBxVGVtcFIwMSwgIzUgICAgICAgIAotICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDMsIHFUZW1wUzAxLCAjNSAgICAgICAgCi0KLSAgICAgICAgVlJIQUREICAgICAgZFRBY2MwLCBkVEFjYzAsIGRUUmVzdWx0MAotICAgICAgICBWUkhBREQgICAgICBkVEFjYzIsIGRUQWNjMiwgZFRSZXN1bHQyCi0gICAgICAgIFZSSEFERCAgICAgIGRUQWNjMSwgZFRBY2MxLCBkVFJlc3VsdDEKLSAgICAgICAgVlJIQUREICAgICAgZFRBY2MzLCBkVEFjYzMsIGRUUmVzdWx0MwotICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzMFswXSwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzMlswXSwgW1RlbXBdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzMVswXSwgW3BEc3RdCi0gICAgICAgIFZTVDEgICAgICAgIGRUUmVzM1swXSwgW1RlbXBdCi0gICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKLUNhc2VfYwotICAgICAgICA7Ly8gQ2FzZSBuCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIGMgXG4iCi0KLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlICAgICAgICAKLSAgICAgICAgVlJIQUREICAgICAgZEFjY1YwLCBkQWNjVjAsIGRTcmMxCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NWMiwgZEFjY1YyLCBkU3JjMwotICAgICAgICBWUkhBREQgICAgICBkQWNjVjEsIGRBY2NWMSwgZFNyYzIKLSAgICAgICAgVlJIQUREICAgICAgZEFjY1YzLCBkQWNjVjMsIGRTcmM0Ci0gICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYwWzBdLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYxWzBdLCBbcERzdF0KLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYzWzBdLCBbVGVtcF0KLSAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncwotICAgICAgICBCICAgICAgICAgICBCbG9jazR4NExvb3BFbmQKLUNhc2VfZAotICAgICAgICA7Ly8gQ2FzZSBwCi0gICAgICAgIE1fUFJJTlRGICJDYXNlIGQgXG4iCi0gICAgICAgIAotICAgICAgICBNT1YgICAgICAgICBwU3JjQkssIHBTcmMKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgcFNyYywgcFNyY0JLLCBzcmNTdGVwCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyCi0gICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlICAgICAgICAKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gwLCBkQWNjSDAsIGRBY2NWMAotICAgICAgICBWUkhBREQgICAgICBkQWNjSDIsIGRBY2NIMiwgZEFjY1YyCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NIMSwgZEFjY0gxLCBkQWNjVjEKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gzLCBkQWNjSDMsIGRBY2NWMyAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgwWzBdLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgxWzBdLCBbcERzdF0KLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgzWzBdLCBbVGVtcF0KLSAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncwotICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAotQ2FzZV9lCi0gICAgICAgIDsvLyBDYXNlIHEKLSAgICAgICAgTV9QUklOVEYgIkNhc2UgZSBcbiIKLSAgICAgICAgCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQotICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMgotICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKLSAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQwLCBxUmVzMywgIzUgICAgICAgIAotICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDEsIHFSZXM0LCAjNSAgICAgICAgCi0gICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MiwgcVJlczUsICM1ICAgICAgICAKLSAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQzLCBxUmVzNiwgIzUgICAgICAgIAotCi0gICAgICAgIFZSSEFERCAgICAgIGRUQWNjMCwgZFRBY2MwLCBkVFJlc3VsdDAKLSAgICAgICAgVlJIQUREICAgICAgZFRBY2MyLCBkVEFjYzIsIGRUUmVzdWx0MgotICAgICAgICBWUkhBREQgICAgICBkVEFjYzEsIGRUQWNjMSwgZFRSZXN1bHQxCi0gICAgICAgIFZSSEFERCAgICAgIGRUQWNjMywgZFRBY2MzLCBkVFJlc3VsdDMKLSAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAotICAgICAgICBWU1QxICAgICAgICBkVFJlczBbMF0sIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkVFJlczJbMF0sIFtUZW1wXSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICAgICBkVFJlczFbMF0sIFtwRHN0XQotICAgICAgICBWU1QxICAgICAgICBkVFJlczNbMF0sIFtUZW1wXQotICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCi0gICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCi1DYXNlX2YKLSAgICAgICAgOy8vIENhc2UgcgotICAgICAgICBNX1BSSU5URiAiQ2FzZSBmIFxuIgotICAgICAgICBNT1YgICAgICAgICBwU3JjQkssIHBTcmMKLSAgICAgICAgQUREICAgICAgICAgcFNyYywgcFNyYywgIzEKLSAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCi0gICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgcFNyYywgcFNyY0JLLCBzcmNTdGVwCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyCi0gICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlICAgICAgICAKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gwLCBkQWNjSDAsIGRBY2NWMAotICAgICAgICBWUkhBREQgICAgICBkQWNjSDIsIGRBY2NIMiwgZEFjY1YyCi0gICAgICAgIFZSSEFERCAgICAgIGRBY2NIMSwgZEFjY0gxLCBkQWNjVjEKLSAgICAgICAgVlJIQUREICAgICAgZEFjY0gzLCBkQWNjSDMsIGRBY2NWMyAgICAgICAgCi0gICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgwWzBdLCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgxWzBdLCBbcERzdF0KLSAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgzWzBdLCBbVGVtcF0KLSAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncwotCi0KLUJsb2NrNHg0TG9vcEVuZAotCi0gICAgICAgIDsvLyBXaWR0aCBMb29wCi0gICAgICAgIDsvL01fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKLSAgICAgICAgTERNICAgICAgICAgcEFyZ3MsIHtwU3JjLHNyY1N0ZXAscERzdCxkc3RTdGVwfSAgOy8vIExvYWQgYXJndW1lbnRzCi0gICAgICAgIFNVQlMgICAgICAgIGlXaWR0aCwgaVdpZHRoLCAjNAotICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjLCAjNCAgICAgIAotICAgICAgICBBREQgICAgICAgICBwRHN0LCBwRHN0LCAjNAotICAgICAgICBCR1QgICAgICAgICBCbG9jazR4NFdpZHRoTG9vcAotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIEhlaWdodCBMb29wCi0gICAgICAgIFNVQlMgICAgICAgIGlIZWlnaHQsIGlIZWlnaHQsICM0Ci0gICAgICAgIE1fTERSICAgICAgIGlXaWR0aCwgcHRyV2lkdGgKLSAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncwotICAgICAgICBBREQgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzIgICAgICAKLSAgICAgICAgQUREICAgICAgICAgcERzdCwgcERzdCwgZHN0U3RlcCwgTFNMICMyCi0gICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIGlXaWR0aAotICAgICAgICBTVUIgICAgICAgICBwRHN0LCBwRHN0LCBpV2lkdGgKLSAgICAgICAgQkdUICAgICAgICAgQmxvY2s0eDRIZWlnaHRMb29wCi0KLUVuZE9mSW50ZXJwb2xhdGlvbgotICAgICAgICBNT1YgICAgICAgICByMCwgIzAKLSAgICAgICAgTV9FTkQgICAgICAgCi0KLSAgICBFTkRJRiAgCi0gICAgICAgIDsvLyBFbmQgb2YgQ29ydGV4QTgKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgRU5ECi0gICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZjQxOGYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDUwICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gIAotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTh4OAotICAgICAgICAKLTsvLyBEZWZpbmUgdGhlIHByb2Nlc3NvciB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBmaWxlCi0gICAgICAgICAKLSAgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLSAgICAgCi0gICAgIEFSRUEgdGFibGUsIERBVEEgICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBmb3IgaW1wbGVtZW50aW5nIHN3aXRjaCBjYXNlIG9mIEMgaW4gYXNtIGJ5Ci07Ly8gdGhlIG1laHRvZCBvZiB0d28gbGV2ZWxzIG9mIGluZGV4aW5nLgotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgTV9UQUJMRSBhcm1WQ000UDEwX3BJbmRleFRhYmxlOHg4Ci0gICAgRENEICBPTVhfVkNfQ0hST01BX0RDLCAgICAgT01YX1ZDX0NIUk9NQV9IT1IgCi0gICAgRENEICBPTVhfVkNfQ0hST01BX1ZFUlQsICAgT01YX1ZDX0NIUk9NQV9QTEFORSAgCi0gICAgCi0gICAgTV9UQUJMRSBhcm1WQ000UDEwX011bHRpcGxpZXJUYWJsZUNocm9tYTh4OCwxCi0gICAgRENXICAgMywgMiwgMSw0IAotICAgIERDVyAgLTMsLTIsLTEsMAotICAgIERDVyAgIDEsIDIsIDMsNAotICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgSUYgQ29ydGV4QTgKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBTY3JhdGNoIHZhcmlhYmxlCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIAotcGMgICAgICAgICAgICAgIFJOIDE1ICAgCi1yZXR1cm4gICAgICAgICAgUk4gMCAgCi1wVGFibGUgICAgICAgICAgUk4gOCAKLSAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIElucHV0IEFyZ3VtZW50cwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBTcmNMZWZ0ICAgICAgICBSTiAwICAgIDsvLyBpbnB1dCBwb2ludGVyCi1wU3JjQWJvdmUgICAgICAgUk4gMSAgICA7Ly8gaW5wdXQgcG9pbnRlcgotcFNyY0Fib3ZlTGVmdCAgIFJOIDIgICAgOy8vIGlucHV0IHBvaW50ZXIKLXBEc3QgICAgICAgICAgICBSTiAzICAgIDsvLyBvdXRwdXQgcG9pbnRlcgotbGVmdFN0ZXAgICAgICAgIFJOIDQgICAgOy8vIGlucHV0IHZhcmlhYmxlCi1kc3RTdGVwICAgICAgICAgUk4gNSAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLXByZWRNb2RlICAgICAgICBSTiA2ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotYXZhaWxhYmlsaXR5ICAgIFJOIDcgICAgOy8vIGlucHV0IHZhcmlhYmxlCi1wTXVsdGlwbGllclRhYmxlICAgIFJOICAyICAgICAKLQotcFRtcCAgICAgICAgICAgIFJOIDkKLXN0ZXAgICAgICAgICAgICBSTiAxMAotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBOZW9uIFJlZ2lzdGVycwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLTsvLyBPTVhfVkNfQ0hST01BX0hPUgotCi1kTGVmdFZhbDAgICAgICAgRE4gIEQwLjgKLWRMZWZ0VmFsMSAgICAgICBETiAgRDEuOAotZExlZnRWYWwyICAgICAgIEROICBEMi44Ci1kTGVmdFZhbDMgICAgICAgRE4gIEQzLjgKLWRMZWZ0VmFsNCAgICAgICBETiAgRDQuOAotZExlZnRWYWw1ICAgICAgIEROICBENS44Ci1kTGVmdFZhbDYgICAgICAgRE4gIEQ2LjgKLWRMZWZ0VmFsNyAgICAgICBETiAgRDcuOAotCi07Ly8gT01YX1ZDX0NIUk9NQV9WRVJUCi0KLWRBYm92ZVZhbCAgICAgICBETiAgRDAuVTgKLQotOy8vIE9NWF9WQ19DSFJPTUFfREMKLQotZExlZnRWYWwgICAgICAgIEROICBEMS5VOAotZFN1bUFib3ZlVmFsVTE2IEROICBEMi5VMTYKLWRTdW1BYm92ZVZhbFUzMiBETiAgRDMuVTMyCi1kU3VtQWJvdmVWYWxVOCAgRE4gIEQzLlU4Ci1kU3VtTGVmdFZhbFUxNiAgRE4gIEQyLlUxNgotZFN1bUxlZnRWYWxVMzIgIEROICBEMS5VMzIKLWRTdW1MZWZ0VmFsVTggICBETiAgRDEuVTgKLWRTdW1BYm92ZUxlZnQgICBETiAgRDIuVTMyCi1kU3VtQWJvdmVMZWZ0VTggRE4gIEQyLlU4Ci1kSW5kZXhSb3cwVTggICAgRE4gIEQ1LlU4Ci1kSW5kZXhSb3cwICAgICAgRE4gIEQ1LlU2NAotZEluZGV4Um93NFU4ICAgIEROICBENi5VOAotZEluZGV4Um93NCAgICAgIEROICBENi5VNjQKLWREc3RSb3cwICAgICAgICBETiAgRDAuVTgKLWREc3RSb3c0ICAgICAgICBETiAgRDQuVTgKLWRDb25zdDEyOFU4ICAgICBETiAgRDAuVTgKLQotOy8vIE9NWF9WQ19DSFJPTUFfUExBTkUKLQotZFJldkFib3ZlVmFsICAgIEROICBEMy5VOCAgCi1kUmV2QWJvdmVWYWxVNjQgRE4gIEQzLlU2NCAgCi1kQWJvdmVMZWZ0VmFsICAgRE4gIEQyLlU4Ci1xQWJvdmU3bWludXMwICAgUU4gIFEzLlMxNiAKLXFBYm92ZURpZmYgICAgICBRTiAgUTIuUzE2IAotZEluZGV4ICAgICAgICAgIEROICBEOC5VOCAgCi1kRGlmZkFib3ZlVTggICAgRE4gIEQ5LlU4ICAKLWREaWZmQWJvdmVTMTYgICBETiAgRDkuUzE2IAotZEFib3ZlRGlmZjBVOCAgIEROICBENC5VOCAgCi1kQWJvdmVEaWZmMFU2NCAgRE4gIEQ0LlU2NAotZEFib3ZlN21pbnVzMFU4IEROICBENi5VOCAgCi1kTXVsdGlwbGllciAgICAgRE4gIEQxMC5TMTYgCi1kSG9yUHJlZCAgICAgICAgRE4gIEQxMS5TMTYgCi1kUmV2TGVmdFZhbCAgICAgRE4gIEQzLlU4Ci1kUmV2TGVmdFZhbFU2NCAgRE4gIEQzLlU2NAotcUxlZnQ3bWludXMwICAgIFFOICBRNy5TMTYKLXFMZWZ0RGlmZiAgICAgICBRTiAgUTYuUzE2Ci1kRGlmZkxlZnRVOCAgICAgRE4gIEQxNi5VOAotZERpZmZMZWZ0UzE2ICAgIEROICBEMTYuUzE2Ci1kTGVmdERpZmYwVTggICAgRE4gIEQxMi5VOAotZExlZnREaWZmMFU2NCAgIEROICBEMTIuVTY0Ci1kTGVmdDdtaW51czBVOCAgRE4gIEQxNC5VOAotZFZlclByZWQgICAgICAgIEROICBEMy5TMTYgCi1kSFZWYWxTMTYgICAgICAgRE4gIEQzLlMxNgotZEhWVmFsUzMyICAgICAgIEROICBEMy5TMzIKLWRIVlRlbXBTMzIgICAgICBETiAgRDIuUzMyCi1xQSAgICAgICAgICAgICAgUU4gIFEwLlMxNgotcUIgICAgICAgICAgICAgIFFOICBRMi5TMTYKLXFDICAgICAgICAgICAgICBRTiAgUTMuUzE2Ci1xTXVsdGlwbGllciAgICAgUU4gIFE1LlMxNgotZE11bHRpcGxpZXIwICAgIEROICBEMTAuUzE2Ci1kTXVsdGlwbGllcjEgICAgRE4gIEQxMS5TMTYKLXFDMCAgICAgICAgICAgICBRTiAgUTAuUzE2Ci1xQzEgICAgICAgICAgICAgUU4gIFExLlMxNgotcUMyICAgICAgICAgICAgIFFOICBRNC5TMTYKLXFDMyAgICAgICAgICAgICBRTiAgUTUuUzE2Ci1xQzQgICAgICAgICAgICAgUU4gIFE2LlMxNgotcUM1ICAgICAgICAgICAgIFFOICBRNy5TMTYKLXFDNiAgICAgICAgICAgICBRTiAgUTguUzE2Ci1xQzcgICAgICAgICAgICAgUU4gIFE5LlMxNgotcVN1bTAgICAgICAgICAgIFFOICBRMC5TMTYKLXFTdW0xICAgICAgICAgICBRTiAgUTEuUzE2Ci1xU3VtMiAgICAgICAgICAgUU4gIFE0LlMxNgotcVN1bTMgICAgICAgICAgIFFOICBRNS5TMTYKLXFTdW00ICAgICAgICAgICBRTiAgUTYuUzE2Ci1xU3VtNSAgICAgICAgICAgUU4gIFE3LlMxNgotcVN1bTYgICAgICAgICAgIFFOICBROC5TMTYKLXFTdW03ICAgICAgICAgICBRTiAgUTkuUzE2Ci1kU3VtMCAgICAgICAgICAgRE4gIEQwLlU4Ci1kU3VtMSAgICAgICAgICAgRE4gIEQxLlU4Ci1kU3VtMiAgICAgICAgICAgRE4gIEQyLlU4Ci1kU3VtMyAgICAgICAgICAgRE4gIEQzLlU4Ci1kU3VtNCAgICAgICAgICAgRE4gIEQ0LlU4Ci1kU3VtNSAgICAgICAgICAgRE4gIEQ1LlU4Ci1kU3VtNiAgICAgICAgICAgRE4gIEQ2LlU4Ci1kU3VtNyAgICAgICAgICAgRE4gIEQ3LlU4Ci0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4IHN0YXJ0cwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDgsIHIxMCwgZDE1Ci0gICAgICAgIAotICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cwotICAgICAgICBNX0FSRyAgICBMZWZ0U3RlcCwgICAgIDQKLSAgICAgICAgTV9BUkcgICAgRHN0U3RlcCwgICAgICA0Ci0gICAgICAgIE1fQVJHICAgIFByZWRNb2RlLCAgICAgNAotICAgICAgICBNX0FSRyAgICBBdmFpbGFiaWxpdHksIDQKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgIHBUYWJsZSw9YXJtVkNNNFAxMF9wSW5kZXhUYWJsZTh4OCAgIDsvLyBMb2FkIGluZGV4IHRhYmxlIGZvciBzd2l0Y2ggY2FzZQotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKLSAgICAgICAgTV9MRFIgICAgcHJlZE1vZGUsIFByZWRNb2RlICAgICAgICAgICAgICAgICAgOy8vIEFyZyBwcmVkTW9kZSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCi0gICAgICAgIE1fTERSICAgIGxlZnRTdGVwLCBMZWZ0U3RlcCAgICAgICAgICAgICAgICAgIDsvLyBBcmcgbGVmdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAotICAgICAgICBNX0xEUiAgICBkc3RTdGVwLCAgRHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gQXJnIGRzdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnICAgICAgICAgCi0gICAgICAgIE1fTERSICAgIGF2YWlsYWJpbGl0eSwgQXZhaWxhYmlsaXR5ICAgICAgICAgIDsvLyBBcmcgYXZhaWxhYmlsaXR5IGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICBwYywgW3BUYWJsZSwgcHJlZE1vZGUsIExTTCAjMl0gICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBjYXNlIGJhc2VkIG9uIHByZU1vZGUKLQotT01YX1ZDX0NIUk9NQV9EQwotICAgICAgICAKLSAgICAgICAgVFNUICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfTEVGVAotICAgICAgICBCRVEgICAgIERDQ2hyb21hOHg4TGVmdE5vdEF2YWlsYWJsZQotCi0gICAgICAgIEFERCAgICAgcFRtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCi0gICAgICAgIEFERCAgICAgc3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCi0KLSAgICAgICAgOy8vIExvYWQgTGVmdCBFZGdlCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzBdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMCpsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbMV19LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsxKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFsyXX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzNdfSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMypsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbNF19LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs0KmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFs1XX0sW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzUqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzZdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNipsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbN119LFtwVG1wXSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs3KmxlZnRTdGVwXSAgICAgIAotICAgICAgICAKLSAgICAgICAgVFNUICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfVVBQRVIKLSAgICAgICAgQkVRICAgICBEQ0Nocm9tYTh4OExlZnRPbmx5QXZhaWxhYmxlCi0KLSAgICAgICAgOy8vIExvYWQgVXBwZXIgRWRnZSBhbHNvCi0gICAgICAgIFZMRDEgICAgIGRBYm92ZVZhbCxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAgdG8gN10gIAotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VyciAgICAgICAgICAgICAgICAgICAgIDsvLyByZXR1cm5Ob0Vycm9yCi0gICAgICAgIAotICAgICAgICBWUEFEREwgICBkU3VtQWJvdmVWYWxVMTYsIGRBYm92ZVZhbCAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsgNis3IHwgNCs1IHwgMiszIHwgMCsxIF0gICAgICAgICAgICAgCi0gICAgICAgIFZQQURETCAgIGRTdW1BYm92ZVZhbFUzMiwgZFN1bUFib3ZlVmFsVTE2ICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWyA0KzUrNis3IHwgIDArMSsyKzMgXSAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgVlBBRERMICAgZFN1bUxlZnRWYWxVMTYsIGRMZWZ0VmFsICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsgNis3IHwgNCs1IHwgMiszIHwgMCsxIF0gICAgICAgICAgICAgCi0gICAgICAgIFZQQURETCAgIGRTdW1MZWZ0VmFsVTMyLCBkU3VtTGVmdFZhbFUxNiAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbIDQrNSs2KzcgfCAgMCsxKzIrMyBdICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgVkFERCAgICAgZFN1bUFib3ZlTGVmdCxkU3VtQWJvdmVWYWxVMzIsZFN1bUxlZnRWYWxVMzIKLSAgICAgICAgVlJTSFIgICAgZFN1bUFib3ZlTGVmdCxkU3VtQWJvdmVMZWZ0LCMzICAgICAgICAgICAgIDsvLyBTdW0gPSAoU3VtICsgNCkgPj4gMwotICAgICAgICBWUlNIUiAgICBkU3VtQWJvdmVWYWxVMzIsZFN1bUFib3ZlVmFsVTMyLCMyICAgICAgICAgOy8vIFN1bSA9IChTdW0gKyAyKSA+PiAyCi0gICAgICAgIFZSU0hSICAgIGRTdW1MZWZ0VmFsVTMyLGRTdW1MZWZ0VmFsVTMyLCMyICAgICAgICAgICA7Ly8gU3VtID0gKFN1bSArIDIpID4+IDIKLSAgICAgICAgCi0gICAgICAgIFZNT1YgICAgIGRJbmRleFJvdzBVOCwjMHgwYyAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVk1PViAgICAgZEluZGV4Um93NFU4LCMweDA0Ci0gICAgICAgIFZTSEwgICAgIGRJbmRleFJvdzAsZEluZGV4Um93MCwjMzIgICAgICAgICAgICAgICAgICA7Ly8gaW5kZXgwID0gMHgwYzBjMGMwYzAwMDAwMDAwIAotICAgICAgICBWU0hSICAgICBkSW5kZXhSb3c0LGRJbmRleFJvdzQsIzMyICAgICAgICAgICAgICAgICAgOy8vIGluZGV4NCA9IDB4MDAwMDAwMDAwNDA0MDQwNAotICAgICAgICBWQUREICAgICBkSW5kZXhSb3c0VTgsZEluZGV4Um93NFU4LGRJbmRleFJvdzBVOCAgICAgOy8vIGluZGV4NCA9IDB4MGMwYzBjMGMwNDA0MDQwNAotICAgICAgICBWVEJMICAgICBkRHN0Um93MCx7ZFN1bUFib3ZlTGVmdFU4LGRTdW1BYm92ZVZhbFU4fSxkSW5kZXhSb3cwVTgKLSAgICAgICAgVlRCTCAgICAgZERzdFJvdzQse2RTdW1MZWZ0VmFsVTgsZFN1bUFib3ZlTGVmdFU4fSxkSW5kZXhSb3c0VTgKLSAKLURDQ2hyb21hOHg4TGVmdFN0b3JlICAgICAgIAotICAgICAgICBBREQgICAgIHBUbXAsIHBEc3QsIGRzdFN0ZXAKLSAgICAgICAgQUREICAgICBzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCi0gICAgICAgIAotICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMCpkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFsxKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzIqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMypkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgIGREc3RSb3c0LFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs0KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICAgZERzdFJvdzQsW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzUqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgICBkRHN0Um93NCxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNipkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgIGREc3RSb3c0LFtwVG1wXSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs3KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLQotICAgICAgICBNX0VYSVQKLSAgICAgICAgCi0KLURDQ2hyb21hOHg4TGVmdE9ubHlBdmFpbGFibGUKLQotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIAotICAgICAgICBWUEFEREwgICBkU3VtTGVmdFZhbFUxNiwgZExlZnRWYWwgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WyA2KzcgfCA0KzUgfCAyKzMgfCAwKzEgXSAgICAgICAgICAgICAKLSAgICAgICAgVlBBRERMICAgZFN1bUxlZnRWYWxVMzIsIGRTdW1MZWZ0VmFsVTE2ICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsgNCs1KzYrNyB8ICAwKzErMiszIF0gICAKLSAgICAgICAgVlJTSFIgICAgZFN1bUxlZnRWYWxVMzIsZFN1bUxlZnRWYWxVMzIsIzIgICAgICAgICAgIDsvLyBTdW0gPSAoU3VtICsgMikgPj4gMgotICAgICAgICAKLSAgICAgICAgVkRVUCAgICAgZERzdFJvdzAsZFN1bUxlZnRWYWxVOFswXQotICAgICAgICBWRFVQICAgICBkRHN0Um93NCxkU3VtTGVmdFZhbFU4WzRdCi0gICAgICAgIAotICAgICAgICBCICAgICAgICBEQ0Nocm9tYTh4OExlZnRTdG9yZSAgCi0gICAgICAgIAotCi1EQ0Nocm9tYTh4OExlZnROb3RBdmFpbGFibGUKLSAgICAgICAgICAgICAgICAgCi0gICAgICAgIFRTVCAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSCi0gICAgICAgIEJFUSAgICAgRENDaHJvbWE4eDhOb25lQXZhaWxhYmxlCi0KLSAgICAgICAgOy8vIExvYWQgVXBwZXIgRWRnZSAKLSAgICAgICAgVkxEMSAgICAgZEFib3ZlVmFsLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCB0byA3XSAgCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICAgICAgICA7Ly8gcmV0dXJuTm9FcnJvcgotICAgICAgICAKLSAgICAgICAgVlBBRERMICAgZFN1bUFib3ZlVmFsVTE2LCBkQWJvdmVWYWwgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbIDYrNyB8IDQrNSB8IDIrMyB8IDArMSBdICAgICAgICAgICAgIAotICAgICAgICBWUEFEREwgICBkU3VtQWJvdmVWYWxVMzIsIGRTdW1BYm92ZVZhbFUxNiAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsgNCs1KzYrNyB8ICAwKzErMiszIF0gCi0gICAgICAgIFZSU0hSICAgIGRTdW1BYm92ZVZhbFUzMixkU3VtQWJvdmVWYWxVMzIsIzIgICAgICAgICA7Ly8gU3VtID0gKFN1bSArIDIpID4+IDIKLSAgICAgICAgVk1PViAgICAgZEluZGV4Um93MFU4LCMweDA0Ci0gICAgICAgIFZTSEwgICAgIGRJbmRleFJvdzAsZEluZGV4Um93MCwjMzIgICAgICAgICAgICAgICAgICA7Ly8gaW5kZXggPSAweDA0MDQwNDA0MDAwMDAwMDAKLSAgICAgICAgVlRCTCAgICAgZERzdFJvdzAse2RTdW1BYm92ZVZhbFU4fSxkSW5kZXhSb3cwVTggCi0gICAgICAgIAotICAgICAgICBCICAgICAgICBEQ0Nocm9tYTh4OFVwcGVyU3RvcmUKLSAgICAgICAgCi0KLURDQ2hyb21hOHg4Tm9uZUF2YWlsYWJsZSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWTU9WICAgICBkQ29uc3QxMjhVOCwjMHg4MCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDB4ODA4MDgwODA4MDgwODA4MCBpZihjb3VudCA9PSAwKQotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICAgOy8vIHJldHVybk5vRXJyb3IKLQotRENDaHJvbWE4eDhVcHBlclN0b3JlICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgcFRtcCwgcERzdCwgZHN0U3RlcAotICAgICAgICBBREQgICAgIHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKLSAgICAgICAgCi0gICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFswKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzEqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMipkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFszKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzQqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNSpkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs2KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BUbXBdICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzcqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICAKLSAgICAgICAgTV9FWElUCi0KLQotT01YX1ZDX0NIUk9NQV9WRVJUCi0gICAgICAgIAotICAgICAgICBWTEQxICAgICBkQWJvdmVWYWwsW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVt4XSAgICAgIDowPD0geCA8PSA3ICAgCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgCi0gICAgICAgIEIgICAgICAgIERDQ2hyb21hOHg4VXBwZXJTdG9yZQotICAgICAgICAKLQotT01YX1ZDX0NIUk9NQV9IT1IKLSAgICAgICAgCi0gICAgICAgIEFERCAgICAgcFRtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCi0gICAgICAgIEFERCAgICAgc3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCi0gICAgICAgIAotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDBbXX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMCpsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWwxW119LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzEqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsMltdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsyKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDNbXX0sW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMypsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWw0W119LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzQqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsNVtdfSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs1KmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDZbXX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNipsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWw3W119LFtwVG1wXSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzcqbGVmdFN0ZXBdCi0gICAgICAgIAotICAgICAgICBCICAgICAgICBEQ0Nocm9tYTh4OFBsYW5lU3RvcmUKLSAgICAgICAgCi0gICAgICAgIAotT01YX1ZDX0NIUk9NQV9QTEFORQotICAgICAgICBBREQgICAgIHBUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAotICAgICAgICBBREQgICAgIHN0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAotICAgICAgICAKLSAgICAgICAgVkxEMSAgICBkQWJvdmVWYWwsW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbeF0gICAgICA6MDw9IHggPD0gNyAgIAotICAgICAgICBWTEQxICAgIGRBYm92ZUxlZnRWYWxbMF0sW3BTcmNBYm92ZUxlZnRdCi0gICAgICAgIAotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFswXX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzAqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzFdfSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMSpsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbMl19LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsyKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFszXX0sW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzRdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNCpsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbNV19LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs1KmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFs2XX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzYqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzddfSxbcFRtcF0gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNypsZWZ0U3RlcF0gCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgVlJFVjY0ICBkUmV2QWJvdmVWYWwsZEFib3ZlVmFsICAgICAgICAgICAgICAgICAgICAgIDsvLyBSZXZlcnNlIG9yZGVyIG9mIGJ5dGVzID0gcFNyY0Fib3ZlWzA6MToyOjM6NDo1OjY6N10KLSAgICAgICAgVlNVQkwgICBxQWJvdmU3bWludXMwLGRSZXZBYm92ZVZhbCxkQWJvdmVMZWZ0VmFsICAgIDsvLyBxQWJvdmU3bWludXMwWzBdID0gcFNyY0Fib3ZlWzddIC0gcFNyY0Fib3ZlTGVmdFswXQotICAgICAgICBWU0hSICAgIGRSZXZBYm92ZVZhbFU2NCxkUmV2QWJvdmVWYWxVNjQsIzggICAgICAgICAgOy8vIHBTcmNBYm92ZVtYOjA6MToyOjM6NDo1OjZdCi0gICAgICAgIFZTVUJMICAgcUFib3ZlRGlmZixkUmV2QWJvdmVWYWwsZEFib3ZlVmFsICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzZdIC0gcFNyY0Fib3ZlWzBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzVdIC0gcFNyY0Fib3ZlWzFdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzRdIC0gcFNyY0Fib3ZlWzJdCi0gICAgICAgIAotICAgICAgICBWUkVWNjQgIGRSZXZMZWZ0VmFsLGRMZWZ0VmFsICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFJldmVyc2Ugb3JkZXIgb2YgYnl0ZXMgPSBwU3JjTGVmdFswOjE6MjozOjQ6NTo2OjddCi0gICAgICAgIFZTVUJMICAgcUxlZnQ3bWludXMwLGRSZXZMZWZ0VmFsLGRBYm92ZUxlZnRWYWwgICAgICA7Ly8gcUFib3ZlN21pbnVzMFswXSA9IHBTcmNMZWZ0WzddIC0gcFNyY0Fib3ZlTGVmdFswXQotICAgICAgICBWU0hSICAgIGRSZXZMZWZ0VmFsVTY0LGRSZXZMZWZ0VmFsVTY0LCM4ICAgICAgICAgICAgOy8vIHBTcmNMZWZ0W1g6MDoxOjI6Mzo0OjU6Nl0KLSAgICAgICAgVlNVQkwgICBxTGVmdERpZmYsZFJldkxlZnRWYWwsZExlZnRWYWwgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs2XSAtIHBTcmNMZWZ0WzBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNV0gLSBwU3JjTGVmdFsxXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzRdIC0gcFNyY0xlZnRbMl0KLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgcE11bHRpcGxpZXJUYWJsZSw9YXJtVkNNNFAxMF9NdWx0aXBsaWVyVGFibGVDaHJvbWE4eDggICA7Ly8gVXNlZCB0byBjYWxjdWxhdGUgSHZhbCAmIFZ2YWwgIAotICAgICAgICBWU0hMICAgIGRBYm92ZURpZmYwVTY0LGRBYm92ZURpZmYwVTY0LCMxNiAgCi0gICAgICAgIFZFWFQgICAgZERpZmZBYm92ZVU4LGRBYm92ZURpZmYwVTgsZEFib3ZlN21pbnVzMFU4LCMyICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWyA3LTAgfCA0LTIgfCA1LTEgfCA2LTAgXQotICAgICAgICBWTEQxICAgIGRNdWx0aXBsaWVyLFtwTXVsdGlwbGllclRhYmxlXSEgCi0gICAgICAgIFZTSEwgICAgZExlZnREaWZmMFU2NCxkTGVmdERpZmYwVTY0LCMxNiAgCi0gICAgICAgIFZFWFQgICAgZERpZmZMZWZ0VTgsZExlZnREaWZmMFU4LGRMZWZ0N21pbnVzMFU4LCMyICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbIDctMCB8IDQtMiB8IDUtMSB8IDYtMCBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgVk1VTCAgICBkSG9yUHJlZCxkRGlmZkFib3ZlUzE2LGRNdWx0aXBsaWVyICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbIDQqKDctMCkgfCAxKig0LTIpIHwgMiooNS0xKSB8IDMqKDYtMCkgXQotICAgICAgICBWTVVMICAgIGRWZXJQcmVkLGREaWZmTGVmdFMxNixkTXVsdGlwbGllcgotICAgICAgICBWUEFERCAgIGRIVlZhbFMxNixkSG9yUHJlZCxkVmVyUHJlZAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZQQURETCAgZEhWVmFsUzMyLGRIVlZhbFMxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW1Z8SF0gaW4gMzIgYml0cyBlYWNoCi0gICAgICAgIFZTSEwgICAgZEhWVGVtcFMzMixkSFZWYWxTMzIsIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMTcqSCA9IDE2KkggKyBIID0gKEg8PDQpK0gKLSAgICAgICAgVkFERCAgICBkSFZWYWxTMzIsZEhWVmFsUzMyLGRIVlRlbXBTMzIgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbIDE3KlYgIHwgMTcqSCBdaW4gMzIgYml0cyBlYWNoCi0gICAgICAgIFZMRDEgICAge2RNdWx0aXBsaWVyMCxkTXVsdGlwbGllcjF9LFtwTXVsdGlwbGllclRhYmxlXSAgICAgICAgICA7Ly8gcU11bHRpcGxpZXIgPSBbIDR8M3wyfDF8MHwtMXwtMnwtMyBdICAKLSAgICAgICAgVlJTSFIgICBkSFZWYWxTMzIsZEhWVmFsUzMyLCM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbY3xiXSBpbiAxNmJpdHMgZWFjaAotICAgICAgICBWQURETCAgIHFBLGRBYm92ZVZhbCxkTGVmdFZhbAotICAgICAgICBWRFVQICAgIHFBLHFBWzddCi0gICAgICAgIFZTSEwgICAgcUEscUEsIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW2F8YXxhfGF8YXxhfGF8YV0KLSAgICAgICAgVkRVUCAgICBxQixkSFZWYWxTMTZbMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbYnxifGJ8YnxifGJ8YnxiXQotICAgICAgICBWRFVQICAgIHFDLGRIVlZhbFMxNlsyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFtjfGN8Y3xjfGN8Y3xjfGNdCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgVk1VTCAgICBxQixxQixxTXVsdGlwbGllcgotICAgICAgICBWTVVMICAgIHFDLHFDLHFNdWx0aXBsaWVyCi0gICAgICAgIFZBREQgICAgcUIscUIscUEgCi0gICAgICAgIAotICAgICAgICBWRFVQICAgIHFDMCxxQ1swXQotICAgICAgICBWRFVQICAgIHFDMSxxQ1sxXQotICAgICAgICBWRFVQICAgIHFDMixxQ1syXQotICAgICAgICBWRFVQICAgIHFDMyxxQ1szXQotICAgICAgICBWRFVQICAgIHFDNCxxQ1s0XQotICAgICAgICBWRFVQICAgIHFDNSxxQ1s1XQotICAgICAgICBWRFVQICAgIHFDNixxQ1s2XQotICAgICAgICBWRFVQICAgIHFDNyxxQ1s3XQotICAgICAgICAKLSAgICAgICAgVkFERCAgICBxU3VtMCxxQixxQzAKLSAgICAgICAgVkFERCAgICBxU3VtMSxxQixxQzEKLSAgICAgICAgVkFERCAgICBxU3VtMixxQixxQzIKLSAgICAgICAgVkFERCAgICBxU3VtMyxxQixxQzMKLSAgICAgICAgVkFERCAgICBxU3VtNCxxQixxQzQKLSAgICAgICAgVkFERCAgICBxU3VtNSxxQixxQzUKLSAgICAgICAgVkFERCAgICBxU3VtNixxQixxQzYKLSAgICAgICAgVkFERCAgICBxU3VtNyxxQixxQzcKLSAgICAgICAgCi0gICAgICAgIFZRUlNIUlVOIGRTdW0wLHFTdW0wLCM1ICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAoT01YX1U4KWFybUNsaXAoMCwyNTUsKFN1bSsxNik+PjUpCi0gICAgICAgIFZRUlNIUlVOIGRTdW0xLHFTdW0xLCM1Ci0gICAgICAgIFZRUlNIUlVOIGRTdW0yLHFTdW0yLCM1Ci0gICAgICAgIFZRUlNIUlVOIGRTdW0zLHFTdW0zLCM1Ci0gICAgICAgIFZRUlNIUlVOIGRTdW00LHFTdW00LCM1Ci0gICAgICAgIFZRUlNIUlVOIGRTdW01LHFTdW01LCM1Ci0gICAgICAgIFZRUlNIUlVOIGRTdW02LHFTdW02LCM1Ci0gICAgICAgIFZRUlNIUlVOIGRTdW03LHFTdW03LCM1ICAgICAgCi0KLURDQ2hyb21hOHg4UGxhbmVTdG9yZSAgICAgICAgCi0gICAgICAgIEFERCAgICAgcFRtcCwgcERzdCwgZHN0U3RlcAotICAgICAgICBBREQgICAgIHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKLSAgICAgICAgCi0gICAgICAgIFZTVDEgICAgZFN1bTAsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzAqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgIGRTdW0xLFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFsxKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICBkU3VtMixbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMipkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgZFN1bTMsW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzMqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgIGRTdW00LFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs0KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICBkU3VtNSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNSpkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgZFN1bTYsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzYqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgIGRTdW03LFtwVG1wXSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs3KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcgICAgICAgCi0gICAgICAgIAotICAgICAgICBNT1YgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FTkQKLSAgICAgICAgCi0gICAgICAgIEVORElGIDsvLyBDb3J0ZXhBOAotICAgICAgICAKLSAgICAgICAgRU5ECi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCBlbmRzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUzMzFmNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucworKysgL2Rldi9udWxsCkBAIC0xLDQzOCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLSAgICAgCi0gIAotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgZm9yIGltcGxlbWVudGluZyBzd2l0Y2ggY2FzZSBvZiBDIGluIGFzbSBieQotOy8vIHRoZSBtZWh0b2Qgb2YgdHdvIGxldmVscyBvZiBpbmRleGluZy4KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTE2eDE2Ci0gICAgRENEICBPTVhfVkNfMTZYMTZfVkVSVCwgT01YX1ZDXzE2WDE2X0hPUiAKLSAgICBEQ0QgIE9NWF9WQ18xNlgxNl9EQywgICBPTVhfVkNfMTZYMTZfUExBTkUKLSAgICAKLQotICAgIElGIENvcnRleEE4Ci0KLSAgICBNX1RBQkxFIGFybVZDTTRQMTBfTXVsdGlwbGllclRhYmxlMTZ4MTYsMQotICAgIERDVyAgIDcsICA2LCAgNSwgIDQsICAzLCAgMiwgIDEsICA4IAotICAgIERDVyAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3Ci0gICAgRENXICAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUKLSAgICAgICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIENvbnN0YW50cyAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKLUJMS19TSVpFICAgICAgICBFUVUgMHgxMAotTVVMX0NPTlNUMCAgICAgIEVRVSAweDAxMDEwMTAxCi1NVUxfQ09OU1QxICAgICAgRVFVIDB4MDAwNjAwMDQKLU1VTF9DT05TVDIgICAgICBFUVUgMHgwMDA3MDAwNQotTVVMX0NPTlNUMyAgICAgIEVRVSAweDAwMDMwMDAxCi1NQVNLX0NPTlNUICAgICAgRVFVIDB4MDBGRjAwRkYKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBTY3JhdGNoIHZhcmlhYmxlCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoteSAgICAgICAgICAgICAgIFJOIDEyICAgCi1wYyAgICAgICAgICAgICAgUk4gMTUgICAKLQotcmV0dXJuICAgICAgICAgIFJOIDAgICAgCi1wVGFibGUgICAgICAgICAgUk4gOSAgICAKLWNvdW50ICAgICAgICAgICBSTiAxMSAgIAotcE11bHRUYWJsZSAgICAgIFJOIDkKLTsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBOZW9uIHJlZ2lzdGVycwotOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1xQWJvdmUgICAgICAgICAgUU4gUTAuVTgKLXFMZWZ0ICAgICAgICAgICBRTiBRMS5VOAotcVN1bTggICAgICAgICAgIFFOIFEwLlUxNgotZFN1bTgwICAgICAgICAgIEROIEQwLlUxNgotZFN1bTgxICAgICAgICAgIEROIEQxLlUxNgotZFN1bTQgICAgICAgICAgIEROIEQwLlUxNgotZFN1bTIgICAgICAgICAgIEROIEQwLlUzMgotZFN1bTEgICAgICAgICAgIEROIEQwLlU2NAotcU91dCAgICAgICAgICAgIFFOIFEzLlU4Ci1kU3VtTGVmdCAgICAgICAgRE4gRDYuVTY0Ci1kU3VtQWJvdmUgICAgICAgRE4gRDcuVTY0Ci1kU3VtICAgICAgICAgICAgRE4gRDguVTY0Ci1kU3VtMCAgICAgICAgICAgRE4gRDguVThbMF0KLQotcUggICAgICAgICAgICAgIFFOIFExMS5TMzIKLXFWICAgICAgICAgICAgICBRTiBRMTIuUzMyCi1xQSAgICAgICAgICAgICAgUU4gUTExLlMxNgotcUIgICAgICAgICAgICAgIFFOIFE2LlMxNgotcUMgICAgICAgICAgICAgIFFOIFE3LlMxNgotCi1xQjAgICAgICAgICAgICAgUU4gUTUuUzE2Ci1xQjEgICAgICAgICAgICAgUU4gUTYuUzE2Ci1kQTEgICAgICAgICAgICAgRE4gRDIzLlMxNgotCi1kSDAgICAgICAgICAgICAgRE4gRDIyLlMzMgotZEgxICAgICAgICAgICAgIEROIEQyMy5TMzIKLWRWMCAgICAgICAgICAgICBETiBEMjQuUzMyCi1kVjEgICAgICAgICAgICAgRE4gRDI1LlMzMgotCi1xSFYgICAgICAgICAgICAgUU4gUTExLlM2NAotcUhWMCAgICAgICAgICAgIFFOIFExMS5TMzIKLXFIVjEgICAgICAgICAgICBRTiBRMTIuUzY0Ci0KLWRIVjAwICAgICAgICAgICBETiBEMjIuUzMyCi1kSFYwMSAgICAgICAgICAgRE4gRDIzLlMzMgotCi1kSFYwICAgICAgICAgICAgRE4gRDIyLlMxNlswXQotZEhWMSAgICAgICAgICAgIEROIEQyMy5TMTZbMF0KLWRIVjEwICAgICAgICAgICBETiBEMjQuUzY0Ci1kSFYxMSAgICAgICAgICAgRE4gRDI1LlM2NAotCi1xU3VtMCAgICAgICAgICAgUU4gUTAuUzE2Ci1xU3VtMSAgICAgICAgICAgUU4gUTEuUzE2Ci0KLWRPdXQwICAgICAgICAgICBETiBENi5VOAotZE91dDEgICAgICAgICAgIEROIEQ3LlU4Ci0KLWRMZWZ0MCAgICAgICAgICBETiBEMi5VOAotZExlZnQxICAgICAgICAgIEROIEQzLlU4Ci1xQ29uc3QgICAgICAgICAgUU4gUTEzLlMxNgotCi1kQWJvdmUwICAgICAgICAgRE4gRDAuVTgKLWRBYm92ZTEgICAgICAgICBETiBEMS5VOAotCi1kUmV2TGVmdDY0ICAgICAgRE4gRDEyLlU2NAotZFJldkxlZnQgICAgICAgIEROIEQxMi5VOAotZFJldkFib3ZlNjQgICAgIEROIEQ1LlU2NAotZFJldkFib3ZlICAgICAgIEROIEQ1LlU4Ci1xTGVmdERpZmYgICAgICAgUU4gUTguUzE2Ci1kTGVmdERpZmYxICAgICAgRE4gRDE3LlMxNgotZExlZnREaWZmNjQgICAgIEROIEQxNy5TNjQKLXFEaWZmTGVmdCAgICAgICBRTiBROC5TMTYKLXFEaWZmQWJvdmUgICAgICBRTiBRNC5TMTYKLWRBYm92ZURpZmYxICAgICBETiBEOS5TMTYKLWRBYm92ZURpZmY2NCAgICBETiBEOS5TNjQKLXFBYm92ZURpZmYgICAgICBRTiBRNC5TMTYKLQotZEFib3ZlTGVmdCAgICAgIEROIEQ0LlU4Ci0KLWREaWZmTGVmdDAgICAgICBETiBEMTYuUzE2Ci1kRGlmZkxlZnQxICAgICAgRE4gRDE3LlMxNgotZERpZmZBYm92ZTAgICAgIEROIEQ4LlMxNgotZERpZmZBYm92ZTEgICAgIEROIEQ5LlMxNgotCi1xTGVmdDE1bWludXMwICAgUU4gUTcuUzE2Ci1kTGVmdDE1bWludXMwICAgRE4gRDE0LlMxNgotcUFib3ZlMTVtaW51czAgIFFOIFEzLlMxNgotZEFib3ZlMTVtaW51czAgIEROIEQ2LlMxNgotCi1xTXVsdGlwbGllciAgICAgUU4gUTEwLlMxNgotcU11bHRpcGxpZXIwICAgIFFOIFExMC5TMTYKLXFNdWx0aXBsaWVyMSAgICBRTiBRMTIuUzE2Ci1kTXVsdGlwbGllcjAgICAgRE4gRDIwLlMxNgotZE11bHRpcGxpZXIxICAgIEROIEQyMS5TMTYKLQotZEJQbHVzQ011bHQ3ICAgIEROIEQxLlM2NAotZEJQbHVzQ011bHQ3UzE2IEROIEQxLlMxNgotCi1xVG1wICAgICAgICAgICAgUU4gUTAuVTgKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBTcmNMZWZ0ICAgICAgICBSTiAwICAgIDsvLyBpbnB1dCBwb2ludGVyCi1wU3JjQWJvdmUgICAgICAgUk4gMSAgICA7Ly8gaW5wdXQgcG9pbnRlcgotcFNyY0Fib3ZlTGVmdCAgIFJOIDIgICAgOy8vIGlucHV0IHBvaW50ZXIKLXBEc3QgICAgICAgICAgICBSTiAzICAgIDsvLyBvdXRwdXQgcG9pbnRlcgotbGVmdFN0ZXAgICAgICAgIFJOIDQgICAgOy8vIGlucHV0IHZhcmlhYmxlCi1kc3RTdGVwICAgICAgICAgUk4gNSAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLXByZWRNb2RlICAgICAgICBSTiA2ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotYXZhaWxhYmlsaXR5ICAgIFJOIDcgICAgOy8vIGlucHV0IHZhcmlhYmxlCi0KLXBUbXAgICAgICAgICAgICBSTiA4Ci1zdGVwICAgICAgICAgICAgUk4gMTAKLXBUbXAyICAgICAgICAgICBSTiAxMQotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2IHN0YXJ0cwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiwgcjExLCBkMTUKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCi0gICAgICAgIE1fQVJHICAgIExlZnRTdGVwLCAgICAgNAotICAgICAgICBNX0FSRyAgICBEc3RTdGVwLCAgICAgIDQKLSAgICAgICAgTV9BUkcgICAgUHJlZE1vZGUsICAgICA0Ci0gICAgICAgIE1fQVJHICAgIEF2YWlsYWJpbGl0eSwgNAotICAgICAgICAKLSAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQKLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgIHBUYWJsZSw9YXJtVkNNNFAxMF9wSW5kZXhUYWJsZTE2eDE2IDsvLyBMb2FkIGluZGV4IHRhYmxlIGZvciBzd2l0Y2ggY2FzZQotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKLSAgICAgICAgTV9MRFIgICAgcHJlZE1vZGUsIFByZWRNb2RlICAgICAgICAgICAgICAgICAgOy8vIEFyZyBwcmVkTW9kZSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCi0gICAgICAgIE1fTERSICAgIGxlZnRTdGVwLCBMZWZ0U3RlcCAgICAgICAgICAgICAgICAgIDsvLyBBcmcgbGVmdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAotICAgICAgICBNX0xEUiAgICBkc3RTdGVwLCAgRHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gQXJnIGRzdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnICAgICAgICAgCi0gICAgICAgIE1fTERSICAgIGF2YWlsYWJpbGl0eSwgQXZhaWxhYmlsaXR5ICAgICAgICAgIDsvLyBBcmcgYXZhaWxhYmlsaXR5IGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZwotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgeSwgI0JMS19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE91dGVyIExvb3AgQ291bnQKLSAgICAgICAgTERSICAgICAgcGMsIFtwVGFibGUsIHByZWRNb2RlLCBMU0wgIzJdICAgICAgOy8vIEJyYW5jaCB0byB0aGUgY2FzZSBiYXNlZCBvbiBwcmVNb2RlCi0gICAgICAgIAotT01YX1ZDXzE2WDE2X1ZFUlQKLSAgICAgICAgVkxEMSAgICBxQWJvdmUsICBbcFNyY0Fib3ZlXQotICAgICAgICBBREQgICAgIHBUbXAsIHBEc3QsIGRzdFN0ZXAKLSAgICAgICAgQUREICAgICBzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcERzdF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwVG1wXSwgc3RlcAotICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BEc3RdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcFRtcF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwRHN0XSwgc3RlcAotICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcERzdF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwVG1wXSwgc3RlcAotICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BEc3RdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcFRtcF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwRHN0XSwgc3RlcAotICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BUbXBdLCBzdGVwCi0gICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcERzdF0sIHN0ZXAKLSAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwVG1wXSwgc3RlcAotICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BEc3RdCi0gICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcFRtcF0KLSAgICAgICAgTU9WICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgOy8vIHJldHVybk5vRXJyb3IKLSAgICAgICAgTV9FWElUCi0gICAgICAgIAotT01YX1ZDXzE2WDE2X0hPUgotICAgICAgICBBREQgICAgIHBUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAotICAgICAgICBBREQgICAgIGxlZnRTdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKLSAgICAgICAgQUREICAgICBwVG1wMiwgcERzdCwgZHN0U3RlcAotICAgICAgICBBREQgICAgIGRzdFN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKLUxvb3BIb3IgCi0gICAgICAgIFZMRDEgICAgIHtxTGVmdFtdfSwgW3BTcmNMZWZ0XSwgbGVmdFN0ZXAgICAgICAgCi0gICAgICAgIFZMRDEgICAgIHtxVG1wW119LCBbcFRtcF0sIGxlZnRTdGVwICAgICAgIAotICAgICAgICBTVUJTICAgICB5LCB5LCAjOAotICAgICAgICBWU1QxICAgICBxTGVmdCwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgIHFUbXAsIFtwVG1wMl0sIGRzdFN0ZXAKLSAgICAgICAgVkxEMSAgICAge3FMZWZ0W119LCBbcFNyY0xlZnRdLCBsZWZ0U3RlcCAgICAgICAKLSAgICAgICAgVkxEMSAgICAge3FUbXBbXX0sIFtwVG1wXSwgbGVmdFN0ZXAgICAgICAgCi0gICAgICAgIFZTVDEgICAgIHFMZWZ0LCBbcERzdF0sIGRzdFN0ZXAKLSAgICAgICAgVlNUMSAgICAgcVRtcCwgW3BUbXAyXSwgZHN0U3RlcAotICAgICAgICBWTEQxICAgICB7cUxlZnRbXX0sIFtwU3JjTGVmdF0sIGxlZnRTdGVwICAgICAgIAotICAgICAgICBWTEQxICAgICB7cVRtcFtdfSwgW3BUbXBdLCBsZWZ0U3RlcCAgICAgICAKLSAgICAgICAgVlNUMSAgICAgcUxlZnQsIFtwRHN0XSwgZHN0U3RlcAotICAgICAgICBWU1QxICAgICBxVG1wLCBbcFRtcDJdLCBkc3RTdGVwCi0gICAgICAgIFZMRDEgICAgIHtxTGVmdFtdfSwgW3BTcmNMZWZ0XSwgbGVmdFN0ZXAgICAgICAgCi0gICAgICAgIFZMRDEgICAgIHtxVG1wW119LCBbcFRtcF0sIGxlZnRTdGVwICAgICAgIAotICAgICAgICBWU1QxICAgICBxTGVmdCwgW3BEc3RdLCBkc3RTdGVwCi0gICAgICAgIFZTVDEgICAgIHFUbXAsIFtwVG1wMl0sIGRzdFN0ZXAKLSAgICAgICAgCi0gICAgICAgIEJORSAgICAgIExvb3BIb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvb3AgZm9yIDE2IHRpbWVzCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FWElUCi0gICAgICAgIAotT01YX1ZDXzE2WDE2X0RDCi0gICAgICAgIE1PViAgICAgIGNvdW50LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjb3VudCA9IDAKLSAgICAgICAgVFNUICAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX0xFRlQKLSAgICAgICAgQkVRICAgICAgVXBwZXJPck5vbmVBdmFpbGFibGUgICAgICAgICAgICAgICAgICAgICAgOy8vIEp1bXAgdG8gVXBwZXIgaWYgbm90IGxlZnQKLQotICAgICAgICBBREQgICAgIHBUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAotICAgICAgICBBREQgICAgIHN0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAotCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzBdfSwgW3BTcmNMZWZ0XSxzdGVwICAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFsxXX0sIFtwVG1wXSxzdGVwICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzJdfSwgW3BTcmNMZWZ0XSxzdGVwICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzNdfSwgW3BUbXBdLHN0ZXAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbNF19LCBbcFNyY0xlZnRdLHN0ZXAgICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbNV19LCBbcFRtcF0sc3RlcCAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFs2XX0sIFtwU3JjTGVmdF0sc3RlcCAgICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbN119LCBbcFRtcF0sc3RlcAotICAgICAgICBWTEQxICAgIHtxTGVmdFs4XX0sIFtwU3JjTGVmdF0sc3RlcCAgICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbOV19LCBbcFRtcF0sc3RlcCAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFsxMF19LFtwU3JjTGVmdF0sc3RlcCAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFsxMV19LFtwVG1wXSxzdGVwICAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFsxMl19LFtwU3JjTGVmdF0sc3RlcCAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFsxM119LFtwVG1wXSxzdGVwICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzE0XX0sW3BTcmNMZWZ0XSxzdGVwICAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFsxNV19LFtwVG1wXSAKLSAgICAgICAgCi0gICAgICAgIFZQQURETCAgIHFTdW04LCBxTGVmdAotICAgICAgICBBREQgICAgIGNvdW50LCBjb3VudCwgIzEgICAgCi0gICAgICAgIFZQQUREICAgIGRTdW00LCBkU3VtODAsIGRTdW04MQotICAgICAgICBWUEFEREwgICBkU3VtMiwgZFN1bTQKLSAgICAgICAgVlBBRERMICAgZFN1bUxlZnQsIGRTdW0yCi0gICAgICAgIFZSU0hSICAgIGRTdW0sIGRTdW1MZWZ0LCAjNAotICAgICAgICAKLVVwcGVyT3JOb25lQXZhaWxhYmxlCi0gICAgICAgIFRTVCAgICAgIGF2YWlsYWJpbGl0eSwgICNPTVhfVkNfVVBQRVIgICAgICAgICAgICAgIDsvLyBpZihhdmFpbGFiaWxpdHkgJiAjT01YX1ZDX1VQUEVSKQotICAgICAgICBCRVEgICAgICBCb3RoT3JOb25lQXZhaWxhYmxlICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSnVtcCB0byBMZWZ0IGlmIG5vdCB1cHBlcgotICAgICAgICBWTEQxICAgICBxQWJvdmUsIFtwU3JjQWJvdmVdCi0gICAgICAgIEFERCAgICAgIGNvdW50LCBjb3VudCwgIzEgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpZiB1cHBlciBpbmMgY291bnQgYnkgMQotICAgICAgICBWUEFEREwgICBxU3VtOCwgcUFib3ZlCi0gICAgICAgIFZQQUREICAgIGRTdW00LCBkU3VtODAsIGRTdW04MQotICAgICAgICBWUEFEREwgICBkU3VtMiwgZFN1bTQKLSAgICAgICAgVlBBRERMICAgZFN1bUFib3ZlLCBkU3VtMgotICAgICAgICBWUlNIUiAgICBkU3VtLCBkU3VtQWJvdmUsICM0Ci0gICAgICAgIAotQm90aE9yTm9uZUF2YWlsYWJsZQotICAgICAgICBDTVAgICAgICBjb3VudCwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNoZWNrIGlmIGJvdGggYXZhaWxhYmxlCi0gICAgICAgIEJORSAgICAgIE5vbmVBdmFpbGFibGUKLSAgICAgICAgVkFERCAgICAgZFN1bSwgZFN1bUFib3ZlLCBkU3VtTGVmdAotICAgICAgICBWUlNIUiAgICBkU3VtLCBkU3VtLCAjNQotICAgICAgICAKLQotTm9uZUF2YWlsYWJsZQotICAgICAgICBWRFVQICAgICBxT3V0LCBkU3VtMCAgICAgICAgCi0gICAgICAgIENNUCAgICAgIGNvdW50LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY2hlY2sgaWYgbm9uZSBhdmFpbGFibGUKLSAgICAgICAgQUREICAgICAgcFRtcCwgcERzdCwgZHN0U3RlcAotICAgICAgICBBREQgICAgICBzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCi0gICAgICAgIEJORSAgICAgIExvb3BEQwotICAgICAgICBWTU9WICAgICBxT3V0LCAjMTI4Ci1Mb29wREMgICAgICAgIAotICAgICAgICBWU1QxICAgIHFPdXQsIFtwRHN0XSwgc3RlcAotICAgICAgICBWU1QxICAgIHFPdXQsIFtwVG1wXSwgc3RlcAotICAgICAgICBWU1QxICAgIHFPdXQsIFtwRHN0XSwgc3RlcAotICAgICAgICBWU1QxICAgIHFPdXQsIFtwVG1wXSwgc3RlcAotICAgICAgICBWU1QxICAgIHFPdXQsIFtwRHN0XSwgc3RlcAotICAgICAgICBWU1QxICAgIHFPdXQsIFtwVG1wXSwgc3RlcAotICAgICAgICBWU1QxICAgIHFPdXQsIFtwRHN0XSwgc3RlcAotICAgICAgICBWU1QxICAgIHFPdXQsIFtwVG1wXSwgc3RlcAotICAgICAgICBWU1QxICAgIHFPdXQsIFtwRHN0XSwgc3RlcAotICAgICAgICBWU1QxICAgIHFPdXQsIFtwVG1wXSwgc3RlcAotICAgICAgICBWU1QxICAgIHFPdXQsIFtwRHN0XSwgc3RlcAotICAgICAgICBWU1QxICAgIHFPdXQsIFtwVG1wXSwgc3RlcAotICAgICAgICBWU1QxICAgIHFPdXQsIFtwRHN0XSwgc3RlcAotICAgICAgICBWU1QxICAgIHFPdXQsIFtwVG1wXSwgc3RlcAotICAgICAgICBWU1QxICAgIHFPdXQsIFtwRHN0XSwgc3RlcAotICAgICAgICBWU1QxICAgIHFPdXQsIFtwVG1wXSwgc3RlcAotICAgICAgICBNT1YgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FWElUCi0KLU9NWF9WQ18xNlgxNl9QTEFORQotICAgICAgICBMRFIgICAgIHBNdWx0VGFibGUsID1hcm1WQ000UDEwX011bHRpcGxpZXJUYWJsZTE2eDE2Ci0gICAgICAgIFZMRDEgICAgcUFib3ZlLCBbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlW3hdICAgICAgOjA8PSB4IDw9IDcgICAgCi0gICAgICAgIFZMRDEgICAgZEFib3ZlTGVmdFswXSxbcFNyY0Fib3ZlTGVmdF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBBREQgICAgIHBUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAotICAgICAgICBBREQgICAgIHN0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAotICAgICAgICBWTEQxICAgIHtxTGVmdFswXX0sICBbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbMV19LCAgW3BUbXBdLHN0ZXAgICAgICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbMl19LCAgW3BTcmNMZWZ0XSxzdGVwICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbM119LCAgW3BUbXBdLHN0ZXAgICAgICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzRdfSwgIFtwU3JjTGVmdF0sc3RlcCAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzVdfSwgIFtwVG1wXSxzdGVwICAgICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzZdfSwgIFtwU3JjTGVmdF0sc3RlcCAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFs3XX0sICBbcFRtcF0sc3RlcAotICAgICAgICBWTEQxICAgIHtxTGVmdFs4XX0sICBbcFNyY0xlZnRdLHN0ZXAgICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbOV19LCAgW3BUbXBdLHN0ZXAgICAgICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbMTBdfSwgW3BTcmNMZWZ0XSxzdGVwICAKLSAgICAgICAgVkxEMSAgICB7cUxlZnRbMTFdfSwgW3BUbXBdLHN0ZXAgICAgICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzEyXX0sIFtwU3JjTGVmdF0sc3RlcCAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzEzXX0sIFtwVG1wXSxzdGVwICAgICAgCi0gICAgICAgIFZMRDEgICAge3FMZWZ0WzE0XX0sIFtwU3JjTGVmdF0sc3RlcCAgIAotICAgICAgICBWTEQxICAgIHtxTGVmdFsxNV19LCBbcFRtcF0gICAKLQotICAgICAgICBWUkVWNjQgIGRSZXZBYm92ZSwgZEFib3ZlMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsxNToxNDoxMzoxMjoxMToxMDo5OjhdIAotICAgICAgICBWU1VCTCAgIHFBYm92ZTE1bWludXMwLCBkUmV2QWJvdmUsIGRBYm92ZUxlZnQgICAgICAgOy8vIHFBYm92ZTdtaW51czBbMF0gPSBwU3JjQWJvdmVbMTVdIC0gcFNyY0Fib3ZlTGVmdFswXSAKLSAgICAgICAgVlNIUiAgICBkUmV2QWJvdmU2NCwgZFJldkFib3ZlNjQsICM4ICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMTQ6MTM6MTI6MTE6MTA6OTo4OlhdIAotICAgICAgICBWU1VCTCAgIHFBYm92ZURpZmYsIGRSZXZBYm92ZSwgZEFib3ZlMCAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWU0hMICAgIGRBYm92ZURpZmY2NCwgZEFib3ZlRGlmZjY0LCAjMTYgCi0gICAgICAgIFZFWFQgICAgZERpZmZBYm92ZTEsIGRBYm92ZURpZmYxLCBkQWJvdmUxNW1pbnVzMCwgIzEgIAotCi0gICAgICAgIFZSRVY2NCAgZFJldkxlZnQsZExlZnQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMTU6MTQ6MTM6MTI6MTE6MTA6OTo4XSAKLSAgICAgICAgVlNVQkwgICBxTGVmdDE1bWludXMwLGRSZXZMZWZ0LCBkQWJvdmVMZWZ0ICAgICAgICAgIDsvLyBxQWJvdmU3bWludXMwWzBdID0gcFNyY0xlZnRbN10gLSBwU3JjQWJvdmVMZWZ0WzBdIAotICAgICAgICBWU0hSICAgIGRSZXZMZWZ0NjQsIGRSZXZMZWZ0NjQsICM4ICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzE0OjEzOjEyOjExOjEwOjk6ODpYXSAKLSAgICAgICAgVlNVQkwgICBxTGVmdERpZmYsZFJldkxlZnQsIGRMZWZ0MCAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIE11bHRpcGxpZXIgPSBbOHwxfDJ8Li4ufDZ8N10KLSAgICAgICAgVkxEMSAgICBxTXVsdGlwbGllciwgW3BNdWx0VGFibGVdISAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLSAgICAgICAgVlNITCAgICBkTGVmdERpZmY2NCwgZExlZnREaWZmNjQsICMxNgotICAgICAgICBWRVhUICAgIGREaWZmTGVmdDEsIGRMZWZ0RGlmZjEsIGRMZWZ0MTVtaW51czAsICMxICAgICAKLSAgICAgICAgCi0gICAgICAgIFZNVUxMICAgcUgsZERpZmZBYm92ZTAsIGRNdWx0aXBsaWVyMCAgICAgICAgICAgICAgICAKLSAgICAgICAgVk1VTEwgICBxVixkRGlmZkxlZnQwLCAgZE11bHRpcGxpZXIwICAgICAgICAgICAgICAgIAotICAgICAgICBWTUxBTCAgIHFILGREaWZmQWJvdmUxLCBkTXVsdGlwbGllcjEgCi0gICAgICAgIFZNTEFMICAgcVYsZERpZmZMZWZ0MSwgIGRNdWx0aXBsaWVyMQotICAgICAgICAKLSAgICAgICAgVlBBREQgICBkSFYwMCxkSDEsZEgwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFZQQUREICAgZEhWMDEsZFYxLGRWMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBWUEFEREwgIHFIViwgcUhWMAotICAgICAgICBWU0hMICAgIHFIVjEscUhWLCMyCi0gICAgICAgIFZBREQgICAgcUhWLHFIVixxSFYxIAotICAgICAgICAKLSAgICAgICAgOy8vIEhWID0gW2MgPSAoKDUqViszMik+PjYpIHwgYiA9ICgoNSpIKzMyKT4+NildCi0gICAgICAgIFZSU0hSICAgcUhWLHFIViwjNgotICAgICAgICAKLSAgICAgICAgOy8vIEhWMSA9IFtjKjd8Yio3XQotICAgICAgICBWU0hMICAgIHFIVjEscUhWLCMzCi0gICAgICAgIFZTVUIgICAgcUhWMSxxSFYxLHFIViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gTXVsdGlwbGllcjEgPSBbMHwxfDJ8Li4ufDddCi0gICAgICAgIFZMRDEgICAgcU11bHRpcGxpZXIwLCBbcE11bHRUYWJsZV0hICAgIAotICAgICAgICBWRFVQICAgIHFCLCBkSFYwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBWRFVQICAgIHFDLCBkSFYxIAotICAgICAgICAKLSAgICAgICAgVkFEREwgICBxQSxkQWJvdmUxLGRMZWZ0MQotICAgICAgICBWU0hMICAgIHFBLHFBLCAjNAotICAgICAgICBWRFVQICAgIHFBLGRBMVszXSAgCi0gICAgICAgIFZBREQgICAgZEJQbHVzQ011bHQ3LCBkSFYxMCwgZEhWMTEKLSAgICAgICAgCi0gICAgICAgIDsvLyBNdWx0aXBsaWVyMSA9IFs4fDl8MTB8Li4ufDE1XQotICAgICAgICBWTEQxICAgIHFNdWx0aXBsaWVyMSwgW3BNdWx0VGFibGVdCi0gICAgICAgIDsvLyBDb25zdCA9IGEgLSA3KihiK2MpCi0gICAgICAgIFZEVVAgICAgcUNvbnN0LCBkQlBsdXNDTXVsdDdTMTZbMF0KLSAgICAgICAgVlNVQiAgICBxQ29uc3QsIHFBLCBxQ29uc3QKLSAgICAgICAgCi0gICAgICAgIDsvLyBCMCA9IFswKmJ8MSpifDIqYnwzKmJ8Li4uLi4ufDcqYl0KLSAgICAgICAgVk1VTCAgICBxQjAscUIscU11bHRpcGxpZXIwCi0gICAgICAgIAotICAgICAgICA7Ly8gQjAgPSBbOCpifDkqYnwxMCpifDExKmJ8Li4uLnwxNSpiXQotICAgICAgICBWTVVMICAgIHFCMSxxQixxTXVsdGlwbGllcjEKLSAgICAgICAgCi0gICAgICAgIFZBREQgICAgcVN1bTAsIHFCMCwgcUNvbnN0Ci0gICAgICAgIFZBREQgICAgcVN1bTEsIHFCMSwgcUNvbnN0ICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBMb29wcyBmb3IgMTYgdGltZXMKLUxvb3BQbGFuZSAgICAgICAKLSAgICAgICAgOy8vIChiKnggKyBjKnkgKyBDKT4+NQotICAgICAgICBWUVJTSFJVTiBkT3V0MCwgcVN1bTAsIzUKLSAgICAgICAgVlFSU0hSVU4gZE91dDEsIHFTdW0xLCM1ICAgICAgCi0gICAgICAgIFNVQlMgICAgIHksIHksICMxCi0gICAgICAgIFZTVDEgICAgIHFPdXQsW3BEc3RdLGRzdFN0ZXAKLSAgICAgICAgVkFERCAgICAgcVN1bTAscVN1bTAscUMgCi0gICAgICAgIFZBREQgICAgIHFTdW0xLHFTdW0xLHFDIAotICAgICAgICBCTkUgICAgICBMb29wUGxhbmUKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLQotICAgICAgICBNX0VORAotICAgICAgICAKLSAgICAgICAgRU5ESUYgOy8vIENvcnRleEE4Ci0gICAgICAgICAgICAKLSAgICAgICAgRU5ECi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgZW5kcwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NzgwZWYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNTQ1ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi0gICAgICAgIAotICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICAgIAotOy8vIERlZmluZSB0aGUgcHJvY2Vzc29yIHZhcmlhbnRzIHN1cHBvcnRlZCBieSB0aGlzIGZpbGUKLSAgICAgICAgIAotICAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotICAgICAgICAKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGZvciBpbXBsZW1lbnRpbmcgc3dpdGNoIGNhc2Ugb2YgQyBpbiBhc20gYnkKLTsvLyB0aGUgbWVodG9kIG9mIHR3byBsZXZlbHMgb2YgaW5kZXhpbmcuCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBNX1RBQkxFIGFybVZDTTRQMTBfcFN3aXRjaFRhYmxlNHg0Ci0gICAgRENEICBPTVhfVkNfNHg0X1ZFUlQsICAgICBPTVhfVkNfNHg0X0hPUiAKLSAgICBEQ0QgIE9NWF9WQ180eDRfREMsICAgICAgIE9NWF9WQ180eDRfRElBR19ETAotICAgIERDRCAgT01YX1ZDXzR4NF9ESUFHX0RSLCAgT01YX1ZDXzR4NF9WUgotICAgIERDRCAgT01YX1ZDXzR4NF9IRCwgICAgICAgT01YX1ZDXzR4NF9WTAotICAgIERDRCAgT01YX1ZDXzR4NF9IVSAgIAotICAgIAotICAgICAgICAKLSAgICAgICAgSUYgQ29ydGV4QTgKLSAgICAgICAgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFNjcmF0Y2ggdmFyaWFibGUKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1yZXR1cm4gICAgICAgICAgUk4gMAotcFRhYmxlICAgICAgICAgIFJOIDgKLXBjICAgICAgICAgICAgICBSTiAxNQotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcFNyY0xlZnQgICAgICAgIFJOIDAgICAgOy8vIGlucHV0IHBvaW50ZXIKLXBTcmNBYm92ZSAgICAgICBSTiAxICAgIDsvLyBpbnB1dCBwb2ludGVyCi1wU3JjQWJvdmVMZWZ0ICAgUk4gMiAgICA7Ly8gaW5wdXQgcG9pbnRlcgotcERzdCAgICAgICAgICAgIFJOIDMgICAgOy8vIG91dHB1dCBwb2ludGVyCi1sZWZ0U3RlcCAgICAgICAgUk4gNCAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLWRzdFN0ZXAgICAgICAgICBSTiA1ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQotcHJlZE1vZGUgICAgICAgIFJOIDYgICAgOy8vIGlucHV0IHZhcmlhYmxlCi1hdmFpbGFiaWxpdHkgICAgUk4gNyAgICA7Ly8gaW5wdXQgdmFyaWFibGUKLXBEc3QxICAgICAgICAgICBSTiAxIAotcERzdDIgICAgICAgICAgIFJOIDQgCi1wRHN0MyAgICAgICAgICAgUk4gNiAKLQotcFNyY1RtcCAgICAgICAgIFJOIDkKLXNyY1N0ZXAgICAgICAgICBSTiAxMAotcERzdFRtcCAgICAgICAgIFJOIDExCi1kc3RlcCAgICAgICAgICAgUk4gMTIKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIE5lb24gcmVnaXN0ZXJzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLTsvLyBPTVhfVkNfQ0hST01BX1ZFUlQKLWRBYm92ZVUzMiAgICAgICBETiAgRDAuVTMyCi0KLTsvLyBPTVhfVkNfQ0hST01BX0hPUgotZExlZnRWYWwwICAgICAgIEROICBEMC44Ci1kTGVmdFZhbDEgICAgICAgRE4gIEQxLjgKLWRMZWZ0VmFsMiAgICAgICBETiAgRDIuOAotZExlZnRWYWwzICAgICAgIEROICBEMy44Ci1kTGVmdFZhbDBVMzIgICAgRE4gIEQwLlUzMgotZExlZnRWYWwxVTMyICAgIEROICBEMS5VMzIKLWRMZWZ0VmFsMlUzMiAgICBETiAgRDIuVTMyCi1kTGVmdFZhbDNVMzIgICAgRE4gIEQzLlUzMgotCi07Ly8gT01YX1ZDXzR4NF9EQwotZExlZnRWYWwgICAgICAgIEROICBEMC5VOAotZExlZnRWYWxVMzIgICAgIEROICBEMC5VMzIKLWRTdW1BYm92ZUxlZnRVMTYgIEROICBEMS5VMTYKLWRTdW1BYm92ZUxlZnRVMzIgIEROICBEMS5VMzIKLWRTdW1BYm92ZUxlZnRVNjQgIEROICBEMS5VNjQKLWRTdW1BYm92ZUxlZnRVOCBETiAgRDEuVTgKLWRTdW0gICAgICAgICAgICBETiAgRDAuVTgKLQotZFN1bUxlZnRWYWxVMTYgIEROICBEMS5VMTYKLWRTdW1MZWZ0VmFsVTMyICBETiAgRDEuVTMyCi1kU3VtTGVmdFZhbFU2NCAgRE4gIEQxLlU2NAotZFN1bUxlZnRWYWxVOCAgIEROICBEMS5VOAotCi1kQWJvdmVWYWwgICAgICAgRE4gIEQwLlU4Ci1kU3VtQWJvdmVWYWxVMTYgIEROICBEMS5VMTYKLWRTdW1BYm92ZVZhbFUzMiAgRE4gIEQxLlUzMgotZFN1bUFib3ZlVmFsVTY0ICBETiAgRDEuVTY0Ci1kU3VtQWJvdmVWYWxVOCAgIEROICBEMS5VOAotZENvbnN0MTI4VTggICAgIEROICBEMC5VOAotCi0KLTsvL09NWF9WQ180eDRfRElBR19ETAotCi1kQWJvdmUgICAgICAgICAgRE4gIEQwLlU4Ci1kVTcgICAgICAgICAgICAgRE4gIEQyLlU4Ci1kVTMgICAgICAgICAgICAgRE4gIEQyLlU4Ci1kQWJvdmUwICAgICAgICAgRE4gIEQzLlU4Ci1kQWJvdmUxICAgICAgICAgRE4gIEQ0LlU4Ci1kQWJvdmUyICAgICAgICAgRE4gIEQ1LlU4Ci1kVG1wICAgICAgICAgICAgRE4gIEQ2LlU4Ci1kVG1wMCAgICAgICAgICAgRE4gIEQ3LlU4Ci1kVG1wMSAgICAgICAgICAgRE4gIEQ4LlU4Ci1kVG1wMiAgICAgICAgICAgIEROICBEOS5VOAotZFRtcDMgICAgICAgICAgICBETiAgRDEwLlU4Ci1kVG1wVTMyICAgICAgICAgRE4gIEQ2LlUzMgotCi0KLTsvL09NWF9WQ180eDRfRElBR19EUgotZExlZnQgICAgICAgICAgIEROICBEMS5VOAotZFVMICAgICAgICAgICAgIEROICBEMi5VOAotCi07Ly9PTVhfVkNfNHg0X1ZSCi1kTGVmdDAgICAgICAgICAgRE4gIEQxLlU4Ci1kTGVmdDEgICAgICAgICAgRE4gIEQyLlU4Ci1kRXZlbjAgICAgICAgICAgRE4gIEQzLlU4Ci1kRXZlbjEgICAgICAgICAgRE4gIEQ0LlU4Ci1kRXZlbjIgICAgICAgICAgRE4gIEQ1LlU4Ci1kT2RkMCAgICAgICAgICAgRE4gIEQ2LlU4Ci1kT2RkMSAgICAgICAgICAgRE4gIEQxMS5VOAotZE9kZDIgICAgICAgICAgIEROICBEMTIuVTgKLWRUbXAzVTMyICAgICAgICBETiAgRDEwLlUzMiAgICAKLWRUbXAyVTMyICAgICAgICBETiAgRDkuVTMyCi0KLQotOy8vT01YX1ZDXzR4NF9IRAotZFRtcDFVNjQgICAgICAgIEROICBEOC5VNjQKLWRUbXAwVTY0ICAgICAgICBETiAgRDcuVTY0Ci1kVG1wVTY0ICAgICAgICAgRE4gIEQ2LlU2NAotZFRtcFUzMiAgICAgICAgIEROICBENi5VMzIKLWRUbXAxVTMyICAgICAgICBETiAgRDguVTMyCi0KLTsvL09NWF9WQ180eDRfSFUKLWRMMyAgICAgICAgICAgICBETiAgRDIuVTgKLWRMZWZ0SFUwICAgICAgICBETiAgRDMuVTgKLWRMZWZ0SFUxICAgICAgICBETiAgRDQuVTgKLWRMZWZ0SFUyICAgICAgICBETiAgRDUuVTgKLWRUbXAwVTMyICAgICAgICBETiAgRDcuVTMyCi0KLQotCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0IHN0YXJ0cwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQsIHIxMixkMTIKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCi0gICAgICAgIE1fQVJHICAgIExlZnRTdGVwLCAgICAgNAotICAgICAgICBNX0FSRyAgICBEc3RTdGVwLCAgICAgIDQKLSAgICAgICAgTV9BUkcgICAgUHJlZE1vZGUsICAgICA0Ci0gICAgICAgIE1fQVJHICAgIEF2YWlsYWJpbGl0eSwgNAotICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgTERSICAgICAgcFRhYmxlLD1hcm1WQ000UDEwX3BTd2l0Y2hUYWJsZTR4NCAgOy8vIExvYWQgaW5kZXggdGFibGUgZm9yIHN3aXRjaCBjYXNlCi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjawotICAgICAgICBNX0xEUkQgICBwcmVkTW9kZSxhdmFpbGFiaWxpdHksUHJlZE1vZGUgICAgIDsvLyBBcmcgcHJlZE1vZGUgJiBhdmFpbGFiaWxpdHkgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAotICAgICAgICBNX0xEUkQgICBsZWZ0U3RlcCxkc3RTdGVwLExlZnRTdGVwICAgICAgICAgIDsvLyBBcmcgbGVmdFN0ZXAgJiBkc3RTdGVwIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICBwYywgW3BUYWJsZSwgcHJlZE1vZGUsIExTTCAjMl0gICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBjYXNlIGJhc2VkIG9uIHByZU1vZGUKLQotCi1PTVhfVkNfNHg0X0hPUgotICAgICAgICAKLSAgICAgICAgQUREICAgICBwU3JjVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKLSAgICAgICAgQUREICAgICBzcmNTdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKLSAgICAgICAgOy8vIExvYWQgTGVmdCBFZGdlCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsMFtdfSxbcFNyY0xlZnRdLHNyY1N0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDFbXX0sW3BTcmNUbXBdLHNyY1N0ZXAgICAgICAgICAgICA7Ly8gICAgcFNyY0xlZnRbMSpsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWwyW119LFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICAgOy8vICAgIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsM1tdfSxbcFNyY1RtcF0gICAgICAgICAgICAgICAgICAgIDsvLyAgICBwU3JjTGVmdFszKmxlZnRTdGVwXQotICAgICAgICAKLSAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCi0gICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKLSAgICAgICAgCi0gICAgICAgIFZTVDEgICAgZExlZnRWYWwwVTMyWzBdLFtwRHN0XSxkc3RlcCAgICAgICAgICAgICAgICA7Ly8gcERzdFswKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgVlNUMSAgICBkTGVmdFZhbDFVMzJbMF0sW3BEc3RUbXBdLGRzdGVwICAgICAgICAgICAgIDsvLyBwRHN0WzEqZHN0U3RlcCt4XSA6MDw9IHggPD0gNwotICAgICAgICBWU1QxICAgIGRMZWZ0VmFsMlUzMlswXSxbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMipkc3RTdGVwK3hdIDowPD0geCA8PSA3Ci0gICAgICAgIFZTVDEgICAgZExlZnRWYWwzVTMyWzBdLFtwRHN0VG1wXSAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFszKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKLSAgICAgICAgCi0gICAgICAgIEIgICAgICAgIEV4aXRQcmVkaWN0NHg0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIGV4aXQgY29kZQotICAgICAgICAKLU9NWF9WQ180eDRfVkVSVAotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgVXBwZXIgRWRnZQotICAgICAgICBWTEQxICAgICBkQWJvdmVVMzJbMF0sW3BTcmNBYm92ZV0KLSAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCi0gICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKLSAgICAgICAgCi1EQ1ByZWRpY3Q0eDRWZXJ0U3RvcmUgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZTVDEgICAgIGRBYm92ZVUzMlswXSxbcERzdF0sZHN0ZXAKLSAgICAgICAgVlNUMSAgICAgZEFib3ZlVTMyWzBdLFtwRHN0VG1wXSxkc3RlcAotICAgICAgICBWU1QxICAgICBkQWJvdmVVMzJbMF0sW3BEc3RdCi0gICAgICAgIFZTVDEgICAgIGRBYm92ZVUzMlswXSxbcERzdFRtcF0KLQotICAgICAgICBCICAgICAgICBFeGl0UHJlZGljdDR4NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBleGl0IGNvZGUKLQotT01YX1ZDXzR4NF9EQwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFRTVCAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX0xFRlQKLSAgICAgICAgQkVRICAgICBEQ1ByZWRpY3Q0eDRMZWZ0Tm90QXZhaWxhYmxlCi0KLSAgICAgICAgQUREICAgICBwU3JjVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKLSAgICAgICAgQUREICAgICBzcmNTdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKLSAgICAgICAgOy8vIExvYWQgTGVmdCBFZGdlCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzBdfSxbcFNyY0xlZnRdLHNyY1N0ZXAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMCpsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbMV19LFtwU3JjVG1wXSxzcmNTdGVwICAgICAgICAgICAgIDsvLyAgICBwU3JjTGVmdFsxKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFsyXX0sW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgICAgOy8vICAgIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzNdfSxbcFNyY1RtcF0gICAgICAgICAgICAgICAgICAgICA7Ly8gICAgcFNyY0xlZnRbMypsZWZ0U3RlcF0KLSAgICAgICAgCi0gICAgICAgIFRTVCAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSCi0gICAgICAgIEJFUSAgICAgRENQcmVkaWN0NHg0TGVmdE9ubHlBdmFpbGFibGUKLQotICAgICAgICA7Ly8gTG9hZCBVcHBlciBFZGdlIGFsc28KLSAgICAgICAgVkxEMSAgICAgZExlZnRWYWxVMzJbMV0sW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCB0byAzXQotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCi0gICAgICAgIAotICAgICAgICBWUEFEREwgICBkU3VtQWJvdmVMZWZ0VTE2LCBkTGVmdFZhbCAgICAgICAgICAgICAgICAgOy8vIFtwU3JjQWJvdmVbMiszIHwgMCsxXSB8IHBTcmNMZWZ0WzIrMyB8IDArMV1dICAgICAgICAgICAgIAotICAgICAgICBWUEFEREwgICBkU3VtQWJvdmVMZWZ0VTMyLCBkU3VtQWJvdmVMZWZ0VTE2ICAgICAgICAgOy8vIFtwU3JjQWJvdmVbMiszKzArMV0gfCBwU3JjTGVmdFsyKzMrMCsxXV0gCi0gICAgICAgIFZQQURETCAgIGRTdW1BYm92ZUxlZnRVNjQsIGRTdW1BYm92ZUxlZnRVMzIgICAgICAgICA7Ly8gW3BTcmNBYm92ZVsyKzMrMCsxXSArIHBTcmNMZWZ0WzIrMyswKzFdXSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFZSU0hSICAgIGRTdW1BYm92ZUxlZnRVNjQsZFN1bUFib3ZlTGVmdFU2NCwjMyAgICAgICA7Ly8gU3VtID0gKFN1bSArIDQpID4+IDMKLSAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCi0gICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKLSAgICAgICAgVkRVUCAgICAgZFN1bSxkU3VtQWJvdmVMZWZ0VThbMF0KLSAgICAgICAgCi0gICAgICAgIEIgICAgICAgIERDUHJlZGljdDR4NFZlcnRTdG9yZSAgCi0gICAgICAgIAotRENQcmVkaWN0NHg0TGVmdE9ubHlBdmFpbGFibGUKLQotICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICAgOy8vIHJldHVybk5vRXJyb3IKLSAgICAgICAgCi0gICAgICAgIFZQQURETCAgIGRTdW1MZWZ0VmFsVTE2LCBkTGVmdFZhbCAgICAgICAgICAgICAgICAgICA7Ly8gWyBYWCB8IHBTcmNMZWZ0WzIrMyB8IDArMV1dICAgICAgICAgICAgIAotICAgICAgICBWUEFEREwgICBkU3VtTGVmdFZhbFUzMiwgZFN1bUxlZnRWYWxVMTYgICAgICAgICAgICAgOy8vIFsgWFhYWCB8IHBTcmNMZWZ0WzIrMyswKzFdXSAKLSAgICAgICAgCi0gICAgICAgIFZSU0hSICAgIGRTdW1MZWZ0VmFsVTMyLGRTdW1MZWZ0VmFsVTMyLCMyICAgICAgICAgICA7Ly8gU3VtID0gKFN1bSArIDIpID4+IDIKLSAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCi0gICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKLSAgICAgICAgVkRVUCAgICAgZFN1bSxkU3VtTGVmdFZhbFU4WzBdCi0gICAgICAgIAotICAgICAgICBCICAgICAgICBEQ1ByZWRpY3Q0eDRWZXJ0U3RvcmUgICAKLSAgICAgICAgCi1EQ1ByZWRpY3Q0eDRMZWZ0Tm90QXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgIAotICAgICAgICBUU1QgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19VUFBFUgotICAgICAgICBCRVEgICAgIERDUHJlZGljdDR4NE5vbmVBdmFpbGFibGUKLQotICAgICAgICA7Ly8gTG9hZCBVcHBlciBFZGdlIAotICAgICAgICBWTEQxICAgICBkQWJvdmVVMzJbMF0sW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswIHRvIDNdICAKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICAKLSAgICAgICAgVlBBRERMICAgZFN1bUFib3ZlVmFsVTE2LCBkQWJvdmVWYWwgICAgICAgICAgICAgICAgIDsvLyBbIFhYIHwgcFNyY0Fib3ZlWzIrMyB8IDArMV1dICAgICAgICAgICAgIAotICAgICAgICBWUEFEREwgICBkU3VtQWJvdmVWYWxVMzIsIGRTdW1BYm92ZVZhbFUxNiAgICAgICAgICAgOy8vIFsgWFhYWCB8IHBTcmNBYm92ZVsyKzMrMCsxXV0gCi0gICAgICAgIAotICAgICAgICBWUlNIUiAgICBkU3VtQWJvdmVWYWxVMzIsZFN1bUFib3ZlVmFsVTMyLCMyICAgICAgICAgOy8vIFN1bSA9IChTdW0gKyAyKSA+PiAyCi0gICAgICAgIEFERCAgICAgcERzdFRtcCwgcERzdCwgZHN0U3RlcAotICAgICAgICBBREQgICAgIGRzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCi0gICAgICAgIFZEVVAgICAgIGRTdW0sZFN1bUFib3ZlVmFsVThbMF0KLSAgICAgICAgCi0gICAgICAgIEIgICAgICAgIERDUHJlZGljdDR4NFZlcnRTdG9yZSAgIAotICAgICAgICAKLURDUHJlZGljdDR4NE5vbmVBdmFpbGFibGUgICAgICAgIAotICAgICAgICAKLSAgICAgICAgVk1PViAgICAgZENvbnN0MTI4VTgsIzB4ODAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAweDgwODA4MDgwODA4MDgwODAgaWYoY291bnQgPT0gMCkKLSAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotICAgICAgICAKLSAgICAgICAgQUREICAgICBwRHN0VG1wLCBwRHN0LCBkc3RTdGVwCi0gICAgICAgIEFERCAgICAgZHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKLSAgICAgICAgQiAgICAgICAgRENQcmVkaWN0NHg0VmVydFN0b3JlICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi1PTVhfVkNfNHg0X0RJQUdfREwKLSAgICAgICAgCi0gICAgICAgIFRTVCAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSX1JJR0hUCi0gICAgICAgIEJFUSAgICAgRGlhZ0RMVXBwZXJSaWdodE5vdEF2YWlsYWJsZQotICAgICAgIAotICAgICAgICBWTEQxICAgIGRBYm92ZTAsW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICAgICA7Ly8gW1U3fFU2fFU1fFU0fFUzfFUyfFUxfFUwXSAKLSAgICAgICAgVkRVUCAgICBkVTcsIGRBYm92ZTBbN10gICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFtVN3xVN3xVN3xVN3xVN3xVN3xVN3xVN10KLSAgICAgICAgVkVYVCAgICBkQWJvdmUxLCBkQWJvdmUwLCBkVTcsICMxICAgICAgICAgICAgICAgOy8vIFtVN3xVN3xVNnxVNXxVNHxVM3xVMnxVMV0KLSAgICAgICAgVkVYVCAgICBkQWJvdmUyLCBkQWJvdmUwLCBkVTcsICMyICAgICAgICAgICAgICAgOy8vIFtVN3xVN3xVN3xVNnxVNXxVNHxVM3xVMl0gCi0gICAgICAgIEIgICAgICAgRGlhZ0RMUHJlZGljdDR4NFN0b3JlICAgICAgICAgCi0gICAgICAgCi1EaWFnRExVcHBlclJpZ2h0Tm90QXZhaWxhYmxlCi0gICAgICAgIFZMRDEgICAgZEFib3ZlVTMyWzFdLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgIDsvLyBbVTN8VTJ8VTF8VTB8LXwtfC18LV0gCi0gICAgICAgIFZEVVAgICAgZFUzLCBkQWJvdmVbN10gICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbVTMgVTMgVTMgVTMgVTMgVTMgVTMgVTNdCi0KLSAgICAgICAgVkVYVCAgICBkQWJvdmUwLCBkQWJvdmUsIGRVMywgIzQgICAgICAgICAgICAgICAgOy8vIFtVMyBVMyBVMyBVMyBVMyBVMiBVMSBVMF0KLSAgICAgICAgVkVYVCAgICBkQWJvdmUxLCBkQWJvdmUsIGRVMywgIzUgICAgICAgICAgICAgICAgOy8vIFtVMyBVMyBVMyBVMyBVMyBVMyBVMiBVMV0KLSAgICAgICAgVkVYVCAgICBkQWJvdmUyLCBkQWJvdmUsIGRVMywgIzYgICAgICAgICAgICAgICAgOy8vIFtVMyBVMyBVMyBVMyBVMyBVMyBVMyBVMl0KLSAgICAgICAKLURpYWdETFByZWRpY3Q0eDRTdG9yZSAgCi0gICAgICAgIAotICAgICAgICBWSEFERCAgIGRUbXAsIGRBYm92ZTAsIGRBYm92ZTIKLSAgICAgICAgVlJIQUREICBkVG1wLCBkVG1wLCBkQWJvdmUxICAgICAgICAgICAgICAgICAgICAgOy8vIChhKzIqYitjKzIpPj4yCi0gICAgICAgIAotCi0gICAgICAgIFZTVDEgICAgZFRtcFUzMlswXSxbcERzdF0sZHN0U3RlcAotICAgICAgICBWRVhUICAgIGRUbXAsZFRtcCxkVG1wLCMxCi0gICAgICAgIFZTVDEgICAgZFRtcFUzMlswXSxbcERzdF0sZHN0U3RlcAotICAgICAgICBWRVhUICAgIGRUbXAsZFRtcCxkVG1wLCMxCi0gICAgICAgIFZTVDEgICAgZFRtcFUzMlswXSxbcERzdF0sZHN0U3RlcAotICAgICAgICBWRVhUICAgIGRUbXAsZFRtcCxkVG1wLCMxCi0gICAgICAgIFZTVDEgICAgZFRtcFUzMlswXSxbcERzdF0KLSAgICAgICAgCi0gICAgICAgIEIgICAgICAgIEV4aXRQcmVkaWN0NHg0ICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gZXhpdCBjb2RlCi0gICAgICAgIAotCi1PTVhfVkNfNHg0X0RJQUdfRFIKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBVMCxVMSxVMixVMwotICAgICAgICAKLSAgICAgICAgVkxEMSAgICBkQWJvdmVVMzJbMF0sW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgOy8vIFtYfFh8WHxYfFUzfFUyfFUxfFUwXQotICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBVTCxMMCxMMSxMMixMMyAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZExlZnQgPSBbVUx8TDB8TDF8TDJ8TDN8WHxYfFhdICAgIAotICAgICAgICBWTEQxICAgIHtkTGVmdFs3XX0sW3BTcmNBYm92ZUxlZnRdICAgICAgICAgICAgICAKLSAgICAgICAgQUREICAgICBwU3JjVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKLSAgICAgICAgQUREICAgICBzcmNTdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKLSAgICAgICAgQUREICAgICBwRHN0MSxwRHN0LGRzdFN0ZXAKLSAgICAgICAgCi0gICAgICAgIFZMRDEgICAge2RMZWZ0WzZdfSxbcFNyY0xlZnRdLHNyY1N0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFs1XX0sW3BTcmNUbXBdLHNyY1N0ZXAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMSpsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRbNF19LFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0WzNdfSxbcFNyY1RtcF0gICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFszKmxlZnRTdGVwXQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZFWFQgICAgZEFib3ZlMCxkTGVmdCxkQWJvdmUsIzMgICAgICAgICAgICAgICAgIDsvLyBbVTJ8VTF8VTB8VUx8TDB8TDF8TDJ8TDNdICAgCi0gICAgICAgIEFERCAgICAgcERzdDIscERzdDEsZHN0U3RlcAotICAgICAgICBWRVhUICAgIGRBYm92ZTEsZExlZnQsZEFib3ZlLCM0ICAgICAgICAgICAgICAgICA7Ly8gW1UzfFUyfFUxfFUwfFVMfEwwfEwxfEwyXSAgIAotICAgICAgICBBREQgICAgIHBEc3QzLHBEc3QyLGRzdFN0ZXAKLSAgICAgICAgVkVYVCAgICBkQWJvdmUyLGRMZWZ0LGRBYm92ZSwjNSAgICAgICAgICAgICAgICAgOy8vIFsgWHxVM3xVMnxVMXxVMHxVTHxMMHxMMV0gICAKLSAgICAgICAgCi0gICAgICAgIFZIQUREICAgZFRtcCwgZEFib3ZlMCwgZEFib3ZlMgotICAgICAgICBWUkhBREQgIGRUbXAsIGRUbXAsIGRBYm92ZTEgICAgICAgICAgICAgICAgICAgICA7Ly8gKGErMipiK2MrMik+PjIKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWU1QxICAgIGRUbXBVMzJbMF0sW3BEc3QzXSAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcFRtcFswXSxbMV0sWzJdLFszXSBAIHBEc3QzCi0gICAgICAgIFZFWFQgICAgZFRtcCxkVG1wLGRUbXAsIzEKLSAgICAgICAgVlNUMSAgICBkVG1wVTMyWzBdLFtwRHN0Ml0gICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHBUbXBbMV0sWzJdLFszXSxbNF0gQCBwRHN0MgotICAgICAgICBWRVhUICAgIGRUbXAsZFRtcCxkVG1wLCMxCi0gICAgICAgIFZTVDEgICAgZFRtcFUzMlswXSxbcERzdDFdICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwVG1wWzJdLFszXSxbNF0sWzVdIEAgcERzdDEKLSAgICAgICAgVkVYVCAgICBkVG1wLGRUbXAsZFRtcCwjMQotICAgICAgICBWU1QxICAgIGRUbXBVMzJbMF0sW3BEc3RdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcFRtcFszXSxbNF0sWzVdLFs2XSBAIHBEc3QKLSAgICAgICAgCi0gICAgICAgIEIgICAgICAgIEV4aXRQcmVkaWN0NHg0ICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gZXhpdCBjb2RlCi0KLU9NWF9WQ180eDRfVlIKLQotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgVUwsVTAsVTEsVTIsVTMKLSAgICAgICAgVkxEMSAgICBkQWJvdmVVMzJbMF0sW3BTcmNBYm92ZV0KLSAgICAgICAgVkxEMSAgICBkQWJvdmVbN10sW3BTcmNBYm92ZUxlZnRdICAgICAgICAgICAgICAgOy8vIFtVTHxYfFh8WHxVM3xVMnxVMXxVMF0KLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIEwwLEwxLEwyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkTGVmdDAgPSBbTDB8TDJ8WHxYfFh8WHxYfFhdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkTGVmdDEgPSBbTDF8IFh8WHxYfFh8WHxYfFhdICAgIAotICAgICAgICBWTEQxICAgIHtkTGVmdDBbN119LFtwU3JjTGVmdF0sbGVmdFN0ZXAgICAgICAgICA7Ly8gcFNyY0xlZnRbMCpsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnQxWzddfSxbcFNyY0xlZnRdLGxlZnRTdGVwICAgICAgICAgOy8vIHBTcmNMZWZ0WzEqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0MFs2XX0sW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsyKmxlZnRTdGVwXQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZFWFQgICAgZE9kZDIsZEFib3ZlLGRBYm92ZSwjNyAgICAgICAgICAgICAgICAgIDsvLyBbIHggeCB4IFUzIFUyIFUxIFUwIFVMIF0KLSAgICAgICAgVkVYVCAgICBkRXZlbjAsZExlZnQwLGRPZGQyLCM2ICAgICAgICAgICAgICAgICAgOy8vIFsgeCB4IHggVTEgVTAgVUwgTDAgTDIgXQotICAgICAgICBWRVhUICAgIGRFdmVuMSxkTGVmdDEsZE9kZDIsIzcgICAgICAgICAgICAgICAgICA7Ly8gWyB4IHggeCBVMiBVMSBVMCBVTCBMMSBdCi0gICAgICAgIFZFWFQgICAgZEV2ZW4yLGRMZWZ0MCxkQWJvdmUsIzcgICAgICAgICAgICAgICAgIDsvLyBbIHggeCB4IFUzIFUyIFUxIFUwIEwwIF0KLSAgICAgICAgVkVYVCAgICBkT2RkMCxkTGVmdDEsZEFib3ZlLCM3ICAgICAgICAgICAgICAgICAgOy8vIFsgeCB4IHggVTMgVTIgVTEgVTAgTDEgXQotICAgICAgICBWRVhUICAgIGRPZGQxLGRMZWZ0MCxkT2RkMiwjNyAgICAgICAgICAgICAgICAgICA7Ly8gWyB4IHggeCBVMiBVMSBVMCBVTCBMMCBdCi0gICAgICAgIAotICAgICAgICBWSEFERCAgIGRUbXAxLCBkT2RkMCwgZE9kZDIKLSAgICAgICAgVlJIQUREICBkVG1wMSwgZFRtcDEsIGRPZGQxICAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgeCB4IHggOSA3IDUgMyAxIF0KLSAgICAgICAgCi0gICAgICAgIFZIQUREICAgZFRtcDAsIGRFdmVuMCwgZEV2ZW4yCi0gICAgICAgIFZSSEFERCAgZFRtcDAsIGRUbXAwLCBkRXZlbjEgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIHggeCB4IDggNiA0IDIgMCBdCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgVkVYVCAgICBkVG1wMyxkVG1wMSxkVG1wMSwjMSAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgeCB4IHggeCA5IDcgNSAzIF0gCi0gICAgICAgIEFERCAgICAgcERzdFRtcCwgcERzdCwgZHN0U3RlcAotICAgICAgICBBREQgICAgIGRzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCi0gICAgICAgIFZFWFQgICAgZFRtcDIsZFRtcDAsZFRtcDAsIzEgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIHggeCB4IHggOCA2IDQgMiBdCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgVlNUMSAgICBkVG1wM1UzMlswXSxbcERzdF0sZHN0ZXAgICAgICAgICAgICAgICAgOy8vIFRtcFs5XSxbN10sWzVdLFszXQotICAgICAgICBWU1QxICAgIGRUbXAyVTMyWzBdLFtwRHN0VG1wXSxkc3RlcCAgICAgICAgICAgICA7Ly8gVG1wWzhdLFs2XSxbNF0sWzJdCi0gICAgICAgIFZTVDEgICAgZFRtcDFVMzJbMF0sW3BEc3RdLGRzdGVwICAgICAgICAgICAgICAgIDsvLyBUbXBbN10sWzVdLFszXSxbMV0KLSAgICAgICAgVlNUMSAgICBkVG1wMFUzMlswXSxbcERzdFRtcF0gICAgICAgICAgICAgICAgICAgOy8vIFRtcFs2XSxbNF0sWzJdLFswXQotICAgICAgICAKLSAgICAgICAgQiAgICAgICAgRXhpdFByZWRpY3Q0eDQgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBleGl0IGNvZGUKLSAgICAgICAgCi1PTVhfVkNfNHg0X0hECi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgOy8vIExvYWQgVTAsVTEsVTIsVTMKLSAgICAgICAgVkxEMSAgICBkQWJvdmUsW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICAgICAgOy8vZEFib3ZlTGVmdFZhbCA9IFtVN3xVNnxVNXxVNHxVM3xVMnxVMXxVMF0KLSAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIFVMLEwwLEwxLEwyLEwzICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkTGVmdCA9IFtVTHxMMHxMMXxMMnxMM3xYfFh8WF0gCi0gICAgICAgIFZMRDEgICAge2RMZWZ0WzddfSxbcFNyY0Fib3ZlTGVmdF0gICAKLSAgICAgICAgQUREICAgICBwU3JjVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKLSAgICAgICAgQUREICAgICBzcmNTdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKLSAgICAgICAgCi0gICAgICAgIFZMRDEgICAge2RMZWZ0WzZdfSxbcFNyY0xlZnRdLHNyY1N0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFs1XX0sW3BTcmNUbXBdLHNyY1N0ZXAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMSpsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRbNF19LFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0WzNdfSxbcFNyY1RtcF0gICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFszKmxlZnRTdGVwXQotICAgICAgICAKLSAgICAgICAgVkVYVCAgICBkQWJvdmUwLGRMZWZ0LGRBYm92ZSwjMyAgICAgICAgICAgICAgICAgOy8vIFsgVTJ8VTF8VTB8VUx8TDB8TDF8TDJ8TDMgXSAgCi0gICAgICAgIFZFWFQgICAgZEFib3ZlMSxkTGVmdCxkQWJvdmUsIzIgICAgICAgICAgICAgICAgIDsvLyBbIFUxfFUwfFVMfEwwfEwxfEwyfEwzfFggXSAgIAotICAgICAgICBWRVhUICAgIGRBYm92ZTIsZExlZnQsZEFib3ZlLCMxICAgICAgICAgICAgICAgICA7Ly8gWyBVMHxVTHxMMHxMMXxMMnxMM3xYfFggXSAgICAgCi0gICAgICAgIAotICAgICAgICBWSEFERCAgIGRUbXAwLCBkQWJvdmUwLCBkQWJvdmUyCi0gICAgICAgIFZSSEFERCAgZFRtcDAsIGRUbXAwLCBkQWJvdmUxICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIDAgfCAxIHwgMiB8IDQgfCA2IHwgOCB8IFggfCBYIF0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWUkhBREQgIGRUbXAxLCBkQWJvdmUxLCBkQWJvdmUwICAgICAgICAgICAgICAgICA7Ly8gKGErYisxKT4+MQotICAgICAgICBWU0hMICAgIGRUbXAxVTY0LGRUbXAxVTY0LCMyNCAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyAzfDV8IDcgfDkgfCBYIHwgWCB8IFggfCBYIF0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWU0hMICAgIGRUbXBVNjQsZFRtcDBVNjQsIzE2ICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyAyfDR8Nnw4fCBYIHwgWCB8IFggfCBYIF0KLSAgICAgICAgVlpJUCAgICBkVG1wMSxkVG1wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRUbXAgPSBbIDIgfCAzIHwgNCB8IDUgfCA2IHwgNyB8IDggfCA5IF0KLSAgICAgICAgVkVYVCAgICBkVG1wMCxkVG1wMCxkVG1wMCwjNiAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgIFh8IFh8IFh8IFh8IFh8IFh8IDAgfCAxIF0KLSAgICAgICAgVkVYVCAgICBkVG1wMSxkVG1wLGRUbXAwLCMyICAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgMCB8IDEgfCAyIHwgMyB8IDQgfCA1IHwgNiB8NyBdCi0gICAgICAgCi0gICAgICAgIEFERCAgICAgcERzdFRtcCwgcERzdCwgZHN0U3RlcAotICAgICAgICBBREQgICAgIGRzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCi0gICAgICAgIAotICAgICAgICBWU1QxICAgIGRUbXAxVTMyWzFdLFtwRHN0XSxkc3RlcCAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcFRtcFswfDF8MnwzXQotICAgICAgICBWU1QxICAgIGRUbXBVMzJbMV0sW3BEc3RUbXBdLGRzdGVwICAgICAgICAgICAgICA7Ly8gU3RvcmUgcFRtcFsyfDN8NHw1XQotICAgICAgICBWU1QxICAgIGRUbXAxVTMyWzBdLFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcFRtcFs0fDV8Nnw3XQotICAgICAgICBWU1QxICAgIGRUbXBVMzJbMF0sW3BEc3RUbXBdICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcFRtcFs2fDd8OHw5XQotICAgICAgICAKLSAgICAgICAgQiAgICAgICAgRXhpdFByZWRpY3Q0eDQgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBleGl0IGNvZGUKLSAgICAgICAgCi1PTVhfVkNfNHg0X1ZMCi0KLSAgICAgICAgCi0gICAgICAgIFRTVCAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSX1JJR0hUCi0gICAgICAgIEJFUSAgICAgRGlhZ1ZMVXBwZXJSaWdodE5vdEF2YWlsYWJsZQotICAgICAgIAotICAgICAgICBWTEQxICAgIGRBYm92ZTAsW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICAgICAgOy8vIFtVN3xVNnxVNXxVNHxVM3xVMnxVMXxVMF0gCi0gICAgICAgIFZFWFQgICAgZEFib3ZlMSxkQWJvdmUwLGRBYm92ZTAsIzEgICAgICAgICAgICAgICA7Ly8gWyBYfFU3fFU2fFU1fFU0fFUzfFUyfFUxXQotICAgICAgICBWRVhUICAgIGRBYm92ZTIsZEFib3ZlMSxkQWJvdmUxLCMxICAgICAgICAgICAgICAgOy8vIFsgWHwgWHxVN3xVNnxVNXxVNHxVM3xVMl0KLSAgICAgICAgCi0gICAgICAgIEIgICAgICAgRGlhZ1ZMUHJlZGljdDR4NFN0b3JlICAgICAgICAgCi0gICAgICAgCi1EaWFnVkxVcHBlclJpZ2h0Tm90QXZhaWxhYmxlCi0gICAgICAgIFZMRDEgICAgZEFib3ZlVTMyWzFdLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgICA7Ly8gW1UzfFUyfFUxfFUwfC18LXwtfC1dIAotICAgICAgICBWRFVQICAgIGRVMywgZEFib3ZlWzddICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFtVMyBVMyBVMyBVMyBVMyBVMyBVMyBVM10KLQotICAgICAgICBWRVhUICAgIGRBYm92ZTAsIGRBYm92ZSwgZFUzLCAjNCAgICAgICAgICAgICAgICAgOy8vIFtVMyBVMyBVMyBVMyBVMyBVMiBVMSBVMF0KLSAgICAgICAgVkVYVCAgICBkQWJvdmUxLCBkQWJvdmUsIGRVMywgIzUgICAgICAgICAgICAgICAgIDsvLyBbVTMgVTMgVTMgVTMgVTMgVTMgVTIgVTFdCi0gICAgICAgIFZFWFQgICAgZEFib3ZlMiwgZEFib3ZlLCBkVTMsICM2ICAgICAgICAgICAgICAgICA7Ly8gW1UzIFUzIFUzIFUzIFUzIFUzIFUzIFUyXQotICAgICAgIAotRGlhZ1ZMUHJlZGljdDR4NFN0b3JlICAKLSAgICAgICAgCi0gICAgICAgIFZSSEFERCAgZFRtcDAsIGRBYm92ZTEsIGRBYm92ZTAgICAgICAgICAgICAgICAgIDsvLyAoYStiKzEpPj4xCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIFh8IFh8IFh8IDh8IDZ8IDR8IDJ8IDAgXQotICAgICAgICAKLSAgICAgICAgVkhBREQgICBkVG1wMywgZEFib3ZlMCwgZEFib3ZlMgotICAgICAgICBWUkhBREQgIGRUbXAzLCBkVG1wMywgZEFib3ZlMSAgICAgICAgICAgICAgICAgICA7Ly8gKGErMipiK2MrMik+PjIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgWHwgWHwgWHwgOXwgN3wgNXwgM3wgMSBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgVkVYVCAgICBkVG1wMSxkVG1wMCxkVG1wMCwjMSAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgWHwgWHwgWHwgWHwgOHwgNnwgNHwgMiBdCi0gICAgICAgIEFERCAgICAgcERzdFRtcCwgcERzdCwgZHN0U3RlcAotICAgICAgICBBREQgICAgIGRzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCi0gICAgICAgIFZFWFQgICAgZFRtcDIsZFRtcDMsZFRtcDEsIzEgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIFh8IFh8IFh8IFh8IDl8IDd8IDV8IDMgXQotICAgICAgICAKLSAgICAgICAgVlNUMSAgICBkVG1wMFUzMlswXSxbcERzdF0sZHN0ZXAgICAgICAgICAgICAgICAgOy8vIFRtcFs2XSxbNF0sWzJdLFswXQotICAgICAgICBWU1QxICAgIGRUbXAzVTMyWzBdLFtwRHN0VG1wXSxkc3RlcCAgICAgICAgICAgICA7Ly8gVG1wWzddLFs1XSxbM10sWzFdCi0gICAgICAgIFZTVDEgICAgZFRtcDFVMzJbMF0sW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbOF0sWzZdLFs0XSxbMl0KLSAgICAgICAgVlNUMSAgICBkVG1wMlUzMlswXSxbcERzdFRtcF0gICAgICAgICAgICAgICAgICAgOy8vIFRtcFs5XSxbN10sWzVdLFszXQotICAgICAgICAKLSAgICAgICAgQiAgICAgICAgRXhpdFByZWRpY3Q0eDQgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBleGl0IGNvZGUKLSAgICAgICAgCi1PTVhfVkNfNHg0X0hVCi0gICAgICAgIEFERCAgICAgcFNyY1RtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCi0gICAgICAgIEFERCAgICAgc3JjU3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCi0KLSAgICAgICAgOy8vIExvYWQgTGVmdCBFZGdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFtMM3xMMnxMMXxMMHxYfFh8WHxYXQotICAgICAgICBWTEQxICAgIHtkTGVmdFs0XX0sW3BTcmNMZWZ0XSxzcmNTdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMCpsZWZ0U3RlcF0KLSAgICAgICAgVkxEMSAgICB7ZExlZnRbNV19LFtwU3JjVG1wXSxzcmNTdGVwICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzEqbGVmdFN0ZXBdCi0gICAgICAgIFZMRDEgICAge2RMZWZ0WzZdfSxbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsyKmxlZnRTdGVwXQotICAgICAgICBWTEQxICAgIHtkTGVmdFs3XX0sW3BTcmNUbXBdICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMypsZWZ0U3RlcF0KLSAgICAgICAgCi0gICAgICAgIFZEVVAgICAgZEwzLGRMZWZ0WzddICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbTDN8TDN8TDN8TDN8TDN8TDN8TDN8TDNdCi0gICAgICAgIAotICAgICAgICBWRVhUICAgIGRMZWZ0SFUwLGRMZWZ0LGRMMywjNCAgICAgICAgICAgICAgICAgICA7Ly8gW0wzfEwzfEwzfEwzfEwzfEwyfEwxfEwwXQotICAgICAgICBWRVhUICAgIGRMZWZ0SFUxLGRMZWZ0LGRMMywjNSAgICAgICAgICAgICAgICAgICA7Ly8gW0wzfEwzfEwzfEwzfEwzfEwzfEwyfEwxXQotICAgICAgICBWRVhUICAgIGRMZWZ0SFUyLGRMZWZ0LGRMMywjNiAgICAgICAgICAgICAgICAgICA7Ly8gW0wzfEwzfEwzfEwzfEwzfEwzfEwzfEwyXQotICAgICAgICAKLSAgICAgICAgVkhBREQgICBkVG1wMCwgZExlZnRIVTAsIGRMZWZ0SFUyCi0gICAgICAgIFZSSEFERCAgZFRtcDAsIGRUbXAwLCBkTGVmdEhVMSAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIEwzIHwgTDMgfCBMMyB8IEwzIHwgTDMgfCA1IHwgMyB8IDEgXQotICAgICAgICAKLSAgICAgICAgVlJIQUREICBkVG1wMSwgZExlZnRIVTEsIGRMZWZ0SFUwICAgICAgICAgICAgICAgOy8vIChhK2IrMSk+PjEgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgVG1wWyBMMyB8IEwzIHwgTDMgfCBMMyB8IEwzIHwgNCB8IDIgfCAwIF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBWWklQICAgIGRUbXAxLGRUbXAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZFRtcDEgPSBUbXBbN3wgNnwgNXwgNHwgM3wgMnwgMXwgMF0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZFRtcDAgPSBbTDN8TDN8TDN8TDN8TDN8TDN8TDN8TDNdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBWU1QxICAgIGRUbXAxVTMyWzBdLFtwRHN0XSxkc3RTdGVwICAgICAgICAgICAgICA7Ly8gWzN8MnwxfDBdIAotICAgICAgICBWRVhUICAgIGRUbXAxLGRUbXAxLGRUbXAxLCMyCi0gICAgICAgIFZTVDEgICAgZFRtcDFVMzJbMF0sW3BEc3RdLGRzdFN0ZXAgICAgICAgICAgICAgIDsvLyBbNXw0fDN8Ml0gCi0gICAgICAgIFZFWFQgICAgZFRtcDEsZFRtcDEsZFRtcDEsIzIKLSAgICAgICAgVlNUMSAgICBkVG1wMVUzMlswXSxbcERzdF0sZHN0U3RlcCAgICAgICAgICAgICAgOy8vIFs3fDZ8NXw0XSAgCi0gICAgICAgIFZTVDEgICAgZFRtcDBVMzJbMF0sW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBbOXw4fDd8Nl0gCi0gICAgICAgIAotICAgICAgICAKLUV4aXRQcmVkaWN0NHg0Ci0gICAgICAgIAotICAgICAgICBNT1YgICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgotICAgICAgICBNX0VORAotCi0gICAgICAgIEVORElGIDsvLyBDb3J0ZXhBOAotICAgICAgICAKLSAgICAgICAgRU5ECi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCBlbmRzCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ODE3OTUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucworKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLSAgICAgICAgCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgCi0gICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1FQRGl2VGFibGUKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKLSAgICAgICAgICAgIAotICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0gICAgCi0KLSAgICAKLSAgICAKLSAgICBJRiBDb3J0ZXhBOAotCi07Ly8gQVJNIFJlZ2lzdGVycwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBwU3JjICAgICAgIFJOIDAKLXBEc3QgICAgICAgIFJOIDEKLVFQICAgICAgICAgIFJOIDIKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBTY3JhdGNoIHZhcmlhYmxlIGZvciBVbnBhY2syeDIgCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcFNyYyAgICAgICAgUk4gOQotVmFsdWUgICAgICAgUk4gNAotVmFsdWUyICAgICAgUk4gNQotRmxhZyAgICAgICAgUk4gNgotc3RyT2Zmc2V0ICAgUk4gNwotY3N0T2Zmc2V0ICAgUk4gOAotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFNjcmF0Y2ggdmFyaWFibGUKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1yMHcwICAgICAgICBSTiAgMwotcjB3MSAgICAgICAgUk4gIDQKLQotYzB3MCAgICAgICAgUk4gIDUKLWMxdzAgICAgICAgIFJOICA2Ci0KLXJldHVybiAgICAgIFJOICAwCi1wUVBEaXZUYWJsZSBSTiAgNQotcFFQTW9kVGFibGUgICAgUk4gIDYKLVNoaWZ0ICAgICAgICBSTiAgOQotU2NhbGUgICAgICAgIFJOICAyCi0KLQotCi07Ly8gTmVvbiBSZWdpc3RlcnMKLQotZFplcm8gICAgICAgRE4gIEQwLlUxNgotZEludlRyQ29lZmYgRE4gIEQwLlMxNgotZFNjYWxlICAgICAgRE4gIEQxLlMxNgotcURxbnRDb2VmZiAgUU4gIFExLlMzMgotZERxbnRDb2VmZiAgRE4gIEQyLlMxNgotCi0KLSAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIsIHI5Ci0gICAgICAgIAotICAgICAgICBMRFIgICAgIHBTcmMsIFtwcFNyY10gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBwU3JjCi0gICAgICAgIFZNT1YgICAgZFplcm8sICMwCi0gICAgICAgIE1PViAgICAgY3N0T2Zmc2V0LCAjMzEgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUbyBiZSB1c2VkIGluIHRoZSBsb29wLCB0byBjb21wdXRlIG9mZnNldAotICAgICAgICAKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOy8vIEZpcnN0bHksIGZpbGwgYWxsIHRoZSBjb2VmZmljaWVudCB2YWx1ZXMgb24gdGhlIDxwRHN0PiBidWZmZXIgYnkgemVybwotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLSAgICAgICAgVlNUMSAgICBkWmVybyxbcERzdF0gICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMF0gID0gcERzdFsxXSAgPSBwRHN0WzJdICA9IHBEc3RbM10gID0gMCAgIAotICAgICAgICBMRFJCICAgICBGbGFnLCAgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgICA7Ly8gUHJlbG9hZCA8RmxhZz4gYmVmb3JlIDx1bnBhY2tMb29wPgotCi0KLXVucGFja0xvb3AKLSAgICAgICAgVFNUICAgICAgRmxhZywgICMweDEwICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXB1dGluZyAoRmxhZyAmIDB4MTApCi0gICAgICAgIExEUlNCTkUgIFZhbHVlMixbcFNyYywjMV0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgTERSQk5FICAgVmFsdWUsIFtwU3JjXSwgIzIgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgYnl0ZSB3aXNlIHRvIGF2b2lkIHVuYWxpZ25lZCBhY2Nlc3MKLSAgICAgICAgQU5EICAgICAgc3RyT2Zmc2V0LCBjc3RPZmZzZXQsIEZsYWcsIExTTCAjMSAgOy8vIHN0ck9mZnNldCA9IChGbGFnICYgMTUpIDwgMTsKLSAgICAgICAgTERSU0JFUSAgVmFsdWUsIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICAgOy8vIFZhbHVlID0gKE9NWF9VOCkgICpwU3JjKysKLSAgICAgICAgT1JSTkUgICAgVmFsdWUsVmFsdWUsVmFsdWUyLCBMU0wgIzggICAgICAgICAgOy8vIFZhbHVlID0gKE9NWF9VMTYpICpwU3JjKysKLSAgICAgICAgCi0gICAgICAgIFRTVCAgICAgIEZsYWcsICAjMHgyMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb21wdXRpbmcgKEZsYWcgJiAweDIwKSB0byBjaGVjaywgaWYgd2UncmUgZG9uZQotICAgICAgICBMRFJCRVEgICBGbGFnLCAgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgICA7Ly8gRmxhZyAgPSAoT01YX1U4KSAqcFNyYysrLCBmb3IgbmV4dCBpdGVyYXRpb24KLSAgICAgICAgU1RSSCAgICAgVmFsdWUsIFtwRHN0LCBzdHJPZmZzZXRdICAgICAgICAgICAgOy8vIFN0b3JlIDxWYWx1ZT4gYXQgb2Zmc2V0IDxzdHJPZmZzZXQ+Ci0gICAgICAgIEJFUSAgICAgIHVucGFja0xvb3AgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGxvb3AgYmVnaW5uaW5nCi0gICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7Ly9JbnZUcmFuc2Zvcm1EQzJ4MjogSW5saW5lZCAoSW1wbGVtZW50ZWQgaW4gQVJNIFY2KQotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLSAgICAgICAgTERNSUEgICAgcERzdCwge3IwdzAsIHIwdzF9ICAgICAgICAgICAgICAgICAgOy8vIHIwdzAgPSB8YzF8YzB8ICYgcjB3MSA9IHxjM3xjMnwKLQotICAgICAgICBTVFIgICAgICBwU3JjLCBbcHBTcmNdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVXBkYXRlIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgotICAgICAgICAKLSAgICAgICAgTERSICAgICAgcFFQRGl2VGFibGUsID1hcm1WQ000UDEwX1FQRGl2VGFibGUgOy8vIFFQIERpdmlzaW9uIGxvb2stdXAtdGFibGUgYmFzZSBwb2ludGVyCi0gICAgICAgIExEUiAgICAgIHBRUE1vZFRhYmxlLCA9YXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZSA7Ly8gUVAgTW9kdWxvIGxvb2stdXAtdGFibGUgYmFzZSBwb2ludGVyCi0gICAgICAgIAotICAgICAgICBTQUREU1VCWCByMHcwLCByMHcwLCAgcjB3MCAgICAgICAgICAgICAgICAgICA7Ly8gWyBjMDArYzAxLCBjMDAtYzAxIF0KLSAgICAgICAgU0FERFNVQlggcjB3MSwgcjB3MSwgIHIwdzEgICAgICAgICAgICAgICAgICAgOy8vIFsgYzEwK2MxMSwgYzEwLWMxMSBdCi0gICAgICAgIAotICAgICAgICBMRFJTQiAgICBTaGlmdCwgW3BRUERpdlRhYmxlLCBRUF0gICAgICAgICAgICA7Ly8gU2hpZnQgPSBwUVBEaXZUYWJsZVtRUF0KLSAgICAgICAgTERSU0IgICAgU2NhbGUsIFtwUVBNb2RUYWJsZSwgUVBdICAgICAgICAgICAgOy8vIFNjYWxlID0gcFFQTW9kVGFibGVbUVBdCi0gICAgICAgIAotICAgICAgICBTQUREMTYgICBjMHcwLCByMHcwLCByMHcxICAgICAgICAgICAgICAgICAgICA7Ly8gWyBkMDArZDEwLCBkMDErZDExIF0KLSAgICAgICAgU1NVQjE2ICAgYzF3MCwgcjB3MCwgcjB3MSAgICAgICAgICAgICAgICAgICAgOy8vIFsgZDAwLWQxMCwgZDAxLWQxMSBdCi0gICAgICAgIAotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsvL0RlcXVhbnRDaHJvbWFEQzJ4MjogSW5saW5lZCAoTmVvbiBJbXBsZW1lbnRhdGlvbikKLSAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLSAgICAgICAgTFNMICAgICAgU2NhbGUsIFNjYWxlLCBTaGlmdCAgICAgICAgICAgICAgICAgOy8vIFNjYWxlID0gU2NhbGUgPDwgU2hpZnQKLSAgICAgICAgVk1PViAgICAgZEludlRyQ29lZmYsIGMwdzAsIGMxdzAgIAotICAgICAgICBWUkVWMzIgICBkSW52VHJDb2VmZixkSW52VHJDb2VmZiAgCi0gICAgICAgIFZEVVAgICAgIGRTY2FsZSxTY2FsZSAKLSAgICAgICAgCi0gICAgICAgIFZNVUxMICAgIHFEcW50Q29lZmYsZEludlRyQ29lZmYsZFNjYWxlCi0gICAgICAgIFZTSFJOICAgIGREcW50Q29lZmYscURxbnRDb2VmZiwjMQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFZTVDEgICAgIGREcW50Q29lZmYsW3BEc3RdICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yaW5nIGFsbCB0aGUgY29lZmZpY2llbnRzIGF0IG9uY2UKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAgICAgTV9FTkQKLSAgICAgICAgCi0gICAgRU5ESUYgOy8vIENvcnRleEE4Ci0gICAgCi0gICAgCi0gICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGMyNDMxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi07Ly8gRGVzY3JpcHRpb246Ci07Ly8gSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSBhbmQgdHJhbnNmb3JtIG1vZHVsZQotOy8vIAotOy8vIAotCi07Ly8gSW5jbHVkZSBzdGFuZGFyZCBoZWFkZXJzCi0KLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLTsvLyBJbXBvcnQvRXhwb3J0IHN5bWJvbHMgcmVxdWlyZWQgZnJvbS90byBvdGhlciBmaWxlcwotOy8vIChGb3IgZXhhbXBsZSB0YWJsZXMpCi0gICAgICAgIAotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NCAKLSAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfUVBEaXZUYWJsZQotICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQotICAgICAgICAKLSAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotCi07Ly8gU2V0IGRlYnVnZ2luZyBsZXZlbCAgICAgICAgCi07Ly9ERUJVR19PTiAgICBTRVRMIHtUUlVFfQotCi0KLTsvLyBTdGF0aWMgRnVuY3Rpb246IGFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NAotICAgIAotCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0gICAgCi0gICAgCi0KLTsvLyBTdGF0aWMgRnVuY3Rpb246IGFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NAotCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0gICAgCi0gICAgSUYgIENvcnRleEE4Ci0gICAgCi07Ly9JbnB1dCBSZWdpc3RlcnMKLXBEYXRhICAgICAgICAgICAgICAgUk4gIDAKLVFQICAgICAgICAgICAgICAgICAgUk4gIDEgICAgCi0KLQotOy8vTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKLQotOy8vIEFSTSBSZWdpc3RlcnMKLQotcFFQRGl2VGFibGUgICAgICAgICBSTiAgMgotcFFQTW9kVGFibGUgICAgICAgICBSTiAgMwotU2hpZnQgICAgICAgICAgICAgICBSTiAgNAotU2NhbGUgICAgICAgICAgICAgICBSTiAgNQotCi07Ly8gTkVPTiBSZWdpc3RlcnMKLQotOy8vIFBhY2tlZCBJbnB1dCBwaXhlbHMKLWRJbjAgICAgICAgICAgICAgICAgRE4gIEQwLlMxNgotZEluMSAgICAgICAgICAgICAgICBETiAgRDEuUzE2Ci1kSW4yICAgICAgICAgICAgICAgIEROICBEMi5TMTYKLWRJbjMgICAgICAgICAgICAgICAgRE4gIEQzLlMxNiAgIAotCi07Ly8gSW50ZXJtZWRpYXRlIGNhbGN1bGF0aW9ucwotZFJvd1N1bTEgICAgICAgICAgICBETiAgRDQuUzE2Ci1kUm93U3VtMiAgICAgICAgICAgIEROICBENS5TMTYKLWRSb3dEaWZmMSAgICAgICAgICAgRE4gIEQ2LlMxNgotZFJvd0RpZmYyICAgICAgICAgICBETiAgRDcuUzE2Ci0KLTsvLyBSb3cgb3BlcmF0ZWQgcGl4ZWxzCi1kUm93T3AwICAgICAgICAgICAgIEROICBEMC5TMTYKLWRSb3dPcDEgICAgICAgICAgICAgICAgRE4gIEQxLlMxNgotZFJvd09wMiAgICAgICAgICAgICAgICBETiAgRDIuUzE2Ci1kUm93T3AzICAgICAgICAgICAgICAgIEROICBEMy5TMTYKLXFSb3dPcDAxICAgICAgICAgICAgUU4gIFEwLjMyCi1xUm93T3AyMyAgICAgICAgICAgIFFOICBRMS4zMgotCi07Ly8gSW50ZXJtZWRpYXRlIGNhbGN1bGF0aW9ucwotZENvbFN1bTEgICAgICAgICAgICBETiAgRDQuUzE2Ci1kQ29sU3VtMiAgICAgICAgICAgIEROICBENS5TMTYKLWRDb2xEaWZmMSAgICAgICAgICAgRE4gIEQ2LlMxNgotZENvbERpZmYyICAgICAgICAgICBETiAgRDcuUzE2Ci0KLTsvLyBDb2xvdW1uIG9wZXJhdGVkIHBpeGVscwotZENvbE9wMCAgICAgICAgICAgICBETiAgRDAuUzE2Ci1kQ29sT3AxICAgICAgICAgICAgICAgIEROICBEMS5TMTYKLWRDb2xPcDIgICAgICAgICAgICAgICAgRE4gIEQyLlMxNgotZENvbE9wMyAgICAgICAgICAgICAgICBETiAgRDMuUzE2Ci0KLTsvLyBUZW1wb3Jhcnkgc2NyYXRjaCB2YXJhaWJsZXMKLQotZFNjYWxlICAgICAgICAgICAgICBETiAgRDUuUzE2Ci1xUm91bmQwICAgICAgICAgICAgIFFOICBRMy5TMzIKLXFSb3VuZDEgICAgICAgICAgICAgUU4gIFE0LlMzMgotcVJvdW5kMiAgICAgICAgICAgICBRTiAgUTUuUzMyCi1xUm91bmQzICAgICAgICAgICAgIFFOICBRNi5TMzIKLQotOy8vIEludlRyYW5zZm9ybWVkIGFuZCBEZXF1YW50aXplZCBwaXhlbHMKLWRPdXQwICAgICAgICAgICAgICAgRE4gIEQwLlMxNgotZE91dDEgICAgICAgICAgICAgICAgRE4gIEQxLlMxNgotZE91dDIgICAgICAgICAgICAgICAgRE4gIEQyLlMxNgotZE91dDMgICAgICAgICAgICAgICAgRE4gIEQzLlMxNgotCi0gICAgICAgCi0gICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KLSAgICAgICAgCi0KLSAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCi0gICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQscjUsZDEzCi0gICAgCi0gICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIDsvLyBUaGUgc3RyYXRlZ3kgdXNlZCBpbiBpbXBsZW1lbnRpbmcgdGhlIHRyYW5zZm9ybSBpcyBhcyBmb2xsb3dzOioKLSAgICA7Ly8gTG9hZCB0aGUgNHg0IGJsb2NrIGludG8gNCBELXJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAqICAKLSAgICA7Ly8gVHJhbnNwb3NlIHRoZSA0eDQgbWF0cml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKLSAgICA7Ly8gUGVyZm9ybSB0aGUgcm93IG9wZXJhdGlvbnMgKG9uIGNvbHVtbnMpIHVzaW5nIFNJTUQgICAgICAgICAgICAqICAKLSAgICA7Ly8gVHJhbnNwb3NlIHRoZSA0eDQgcmVzdWx0IG1hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKLSAgICA7Ly8gUGVyZm9ybSB0aGUgY29sb3VtbiBvcGVyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICAgIDsvLyBMb2FkIGFsbCB0aGUgNHg0IHBpeGVscyBpbiBUcmFuc3Bvc2VkIGZvcm0KLSAgICAgICAgCi0gICAgICAgIFZMRDQgICAge2RJbjAsZEluMSxkSW4yLGRJbjN9LFtwRGF0YV0KLSAgICAgICAgTERSICAgICBwUVBEaXZUYWJsZSwgPWFybVZDTTRQMTBfUVBEaXZUYWJsZSAgICAgICAgOy8vIFFQIERpdmlzaW9uIGxvb2stdXAtdGFibGUgYmFzZSBwb2ludGVyCi0gICAgICAgIExEUiAgICAgcFFQTW9kVGFibGUsID1hcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlIDsvLyBRUCBNb2R1bG8gbG9vay11cC10YWJsZSBiYXNlIHBvaW50ZXIKLSAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICAgICAgICA7Ly8gUm93IE9wZXJhdGlvbnMgKFBlcmZvcm1lZCBvbiBjb2x1bW5zKQotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgICAgICAgOy8vIFNjYWxlIGZhY3RvciBjYWxjdWxhdGlvbiBpcyBkb25lIHVzaW5nIEFSTSBpbnN0cnVjdGlvbnMKLSAgICAgICAgOy8vIEludGVybGVhdmVkIHdpdGggTkVPTiBpbnN0cnVjdGlvbnMgaW5vcmRlciB0byBEdWFsIGlzc3VlCi0gICAgICAgIAotICAgICAgICBWQUREICAgIGRSb3dTdW0xLGRJbjAsZEluMQotICAgICAgICBWQUREICAgIGRSb3dTdW0yLGRJbjIsZEluMwotICAgICAgICBWU1VCICAgIGRSb3dEaWZmMSxkSW4wLGRJbjEKLSAgICAgICAgTERSU0IgICBTaGlmdCwgW3BRUERpdlRhYmxlLCBRUF0gICAgICAgICAgICAgICA7Ly8gQVJNIENPREU6IFNoaWZ0ID0gcFFQRGl2VGFibGVbUVBdCi0gICAgICAgIFZTVUIgICAgZFJvd0RpZmYyLGRJbjIsZEluMwotICAgICAgICBMRFJTQiAgIFNjYWxlLCBbcFFQTW9kVGFibGUsIFFQXSAgICAgICAgICAgICAgIDsvLyBBUk0gQ09ERTogU2NhbGUgPSBwUVBNb2RUYWJsZVtRUF0gCi0gICAgICAgIFZBREQgICAgZFJvd09wMCxkUm93U3VtMSxkUm93U3VtMgotICAgICAgICBWU1VCICAgIGRSb3dPcDEsZFJvd1N1bTEsZFJvd1N1bTIKLSAgICAgICAgVlNVQiAgICBkUm93T3AyLGRSb3dEaWZmMSxkUm93RGlmZjIKLSAgICAgICAgTFNMICAgICBTY2FsZSwgU2NhbGUsIFNoaWZ0ICAgICAgICAgICAgICAgICAgICA7Ly8gQVJNIENPREU6IFNjYWxlID0gU2NhbGUgPDwgU2hpZnQKLSAgICAgICAgVkFERCAgICBkUm93T3AzLGRSb3dEaWZmMSxkUm93RGlmZjIKLSAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIHJlc3VsdGFudCBtYXRyaXgKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgCi0gICAgICAgIFZUUk4gICAgZFJvd09wMCxkUm93T3AxCi0gICAgICAgIFZUUk4gICAgZFJvd09wMixkUm93T3AzCi0gICAgICAgIFZUUk4gICAgcVJvd09wMDEscVJvd09wMjMgCi0gICAgICAgIAotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgICAgICAgOy8vIENvbG91bW4gT3BlcmF0aW9ucyAKLSAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gICAgICAgIAotICAgICAgICBWQUREICAgIGRDb2xTdW0xLGRSb3dPcDAsZFJvd09wMQotICAgICAgICBWQUREICAgIGRDb2xTdW0yLGRSb3dPcDIsZFJvd09wMwotICAgICAgICBWU1VCICAgIGRDb2xEaWZmMSxkUm93T3AwLGRSb3dPcDEKLSAgICAgICAgVlNVQiAgICBkQ29sRGlmZjIsZFJvd09wMixkUm93T3AzCi0gICAgICAgIFZBREQgICAgZENvbE9wMCxkQ29sU3VtMSxkQ29sU3VtMgotICAgICAgICBWU1VCICAgIGRDb2xPcDEsZENvbFN1bTEsZENvbFN1bTIKLSAgICAgICAgVlNVQiAgICBkQ29sT3AyLGRDb2xEaWZmMSxkQ29sRGlmZjIKLSAgICAgICAgVkFERCAgICBkQ29sT3AzLGRDb2xEaWZmMSxkQ29sRGlmZjIKLSAgICAgICAgCi0gICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOy8vCi0gICAgICAgIDsvLyA8RGVxdWFudGl6ZT4gaW1wcm92ZXMgb24gdGhlIGMtcmVmZXJlbmNlIGNvZGUKLSAgICAgICAgOy8vIEJvdGggdGhlICBjYXNlcyBpLmUuLCBTaGlmdD49MCBhbmQgU2hpZnQ8MCBjYXNlcyBhcmUgY292ZXJlZCB0b2dldGhlcgotICAgICAgICA7Ly8gV2UgZG8gbm90IHN1YnRyYWN0IDIgZnJvbSBTaGlmdCBhcyBpbiBDIHJlZmVyZW5jZSwgaW5zdGVhZCBwZXJmb3JtIGEKLSAgICAgICAgOy8vIFNjYWxlIDw8IFNoaWZ0IG9uY2UgaW4gdGhlIGJlZ2lubmluZyBhbmQgZG8gYSByaWdodCBzaGlmdCBieSBhIAotICAgICAgICA7Ly8gY29uc3RhbnQgMiBhZnRlciB0aGUgTXVsdGlwbGljYXRpb24uIFRoZSB2YWx1ZSBvZiBSb3VuZCB3b3VsZCBiZSAyIAotICAgICAgICA7Ly8gCi0gICAgICAgIDsvLyBCeSBkb2luZyB0aGlzIHdlIGF2aW9kIHRoZSBCcmFuY2hlcyByZXF1aXJlZCBhbmQgYWxzbyAKLSAgICAgICAgOy8vIHJlZHVjZSB0aGUgY29kZSBzaXplIHN1YnN0YW50aWFsbHkKLSAgICAgICAgOy8vIAotICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgVkRVUCAgICBkU2NhbGUsIFNjYWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBBUk0gLT4gTkVPTiAgY29weSAnc2NhbGUnIHRvIHZlY3RvcgotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIFZNT1YgICAgcVJvdW5kMCwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IHRoZSBSb3VuZCBWYWx1ZSAKLSAgICAgICAgVk1PViAgICBxUm91bmQxLCMyCi0gICAgICAgIFZNT1YgICAgcVJvdW5kMiwjMgotICAgICAgICBWTU9WICAgIHFSb3VuZDMsIzIKLSAgICAgICAgCi0gICAgICAgIFZNTEFMICAgcVJvdW5kMCxkQ29sT3AwLGRTY2FsZSAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFtpXSAqIFNjYWxlICsgUm91bmQgCi0gICAgICAgIFZNTEFMICAgcVJvdW5kMSxkQ29sT3AxLGRTY2FsZQotICAgICAgICBWTUxBTCAgIHFSb3VuZDIsZENvbE9wMixkU2NhbGUKLSAgICAgICAgVk1MQUwgICBxUm91bmQzLGRDb2xPcDMsZFNjYWxlCi0gICAgICAgIAotICAgICAgICBWU0hSTiAgIGRPdXQwLHFSb3VuZDAsIzIgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBSaWdodCBzaGlmdCBieSAyICYgKE9NWF9TMTYpVmFsdWUKLSAgICAgICAgVlNIUk4gICBkT3V0MSxxUm91bmQxLCMyCi0gICAgICAgIFZTSFJOICAgZE91dDIscVJvdW5kMiwjMgotICAgICAgICBWU0hSTiAgIGRPdXQzLHFSb3VuZDMsIzIKLSAgICAgICAgCi0gICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgOy8vIFN0b3JlIGFsbCB0aGUgNHg0IHBpeGVscwotICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIAotICAgICAgICBWU1QxICB7ZE91dDAsZE91dDEsZE91dDIsZE91dDN9LCBbcERhdGFdCi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCi0gICAgICAgIAotICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAotICAgICAgICBNX0VORCAgICAgICAgCi0gICAgICAgIAotICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9DT1JURVhBOCAgIAotICAgICAgICAKLQotCi07Ly8gRnVuY3Rpb246IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyCi0gICAgCi07Ly9JbnB1dCBSZWdpc3RlcnMKLXBwU3JjICAgICAgICAgICAgICAgUk4gIDAKLXBEc3QgICAgICAgICAgICAgICAgUk4gIDEKLVFQUjIgICAgICAgICAgICAgICAgUk4gIDIKLQotOy8vT3V0cHV0IFJlZ2lzdGVycwotcmVzdWx0ICAgICAgICAgICAgICBSTiAgMAotCi07Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycwotcERzdFI0ICAgICAgICAgICAgICBSTiAgNAotcERzdFIwICAgICAgICAgICAgICBSTiAgMAotUVBSMSAgICAgICAgICAgICAgICBSTiAgMQotUVBSNSAgICAgICAgICAgICAgICBSTiAgNQotCi07Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCi0gICAgCi0gICAgSUYgQ29ydGV4QTgKLSAgICAgICAKLSAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgotICAgICAgICAKLQotICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcixyNQotICAgICAgICAKLSAgICAgICAgTU9WICAgICBwRHN0UjQscERzdCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2F2aW5nIHJlZ2lzdGVyIHIxCi0gICAgICAgIE1PViAgICAgUVBSNSxRUFIyICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNhdmluZyByZWdpc3RlciByMgotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKLSAgICAgICAgCi0gICAgICAgIE1PViAgICAgcERzdFIwLHBEc3RSNCAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldHRpbmcgdXAgcmVnaXN0ZXIgcjAKLSAgICAgICAgTU9WICAgICBRUFIxLFFQUjUgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0dGluZyB1cCByZWdpc3RlciByMQotICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIAotICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQotICAgICAgICBNT1YgICAgIHJlc3VsdCwjT01YX1N0c19Ob0VyciAgICAgICAgCi0gICAgICAgCi0gICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCi0gICAgICAgIE1fRU5ECi0gICAgICAgIAotICAgICAgICAgICAgCi0gICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0FSTTExMzZKUyAgCi0gICAgCi0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZmZiMDkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0KLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQotYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlOgotICAgIFBVU0ggICAgIHtyNC1yNixscn0KLSAgICBMRFIgICAgICByNywgPTB4ODA4MDgwODAKLSAgICBMRFIgICAgICByMTIsW3IyLCMwXQotICAgIExEUiAgICAgIHIxMCxbcjBdLHIxCi0gICAgTERSICAgICAgbHIsW3IyLHIzXQotICAgIExEUiAgICAgIHIxMSxbcjBdLHIxCi0gICAgTVZOICAgICAgcjEyLHIxMgotICAgIE1WTiAgICAgIGxyLGxyCi0gICAgVUhTVUI4ICAgcjUscjEwLHIxMgotICAgIFVIU1VCOCAgIHI0LHIxMSxscgotICAgIEVPUiAgICAgIHI1LHI1LHI3Ci0gICAgU1RSICAgICAgcjUsW3IyXSxyMwotICAgIEVPUiAgICAgIHI0LHI0LHI3Ci0gICAgU1RSICAgICAgcjQsW3IyXSxyMwotICAgIExEUiAgICAgIHIxMCxbcjBdLHIxCi0gICAgTERSICAgICAgcjEyLFtyMiwjMF0KLSAgICBMRFIgICAgICByMTEsW3IwXSxyMQotICAgIExEUiAgICAgIGxyLFtyMixyM10KLSAgICBNVk4gICAgICByMTIscjEyCi0gICAgVUhTVUI4ICAgcjUscjEwLHIxMgotICAgIE1WTiAgICAgIGxyLGxyCi0gICAgVUhTVUI4ICAgcjQscjExLGxyCi0gICAgRU9SICAgICAgcjUscjUscjcKLSAgICBTVFIgICAgICByNSxbcjJdLHIzCi0gICAgRU9SICAgICAgcjQscjQscjcKLSAgICBTVFIgICAgICByNCxbcjJdLHIzCi0gICAgUE9QICAgICAge3I0LXI2LHBjfQotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMl91bnNhZmUKLWFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24yX3Vuc2FmZToKLSAgICBQVVNIICAgICB7cjQtcjYsbHJ9Ci0gICAgTERSICAgICAgcjcsID0weDgwODA4MDgwCi0gICAgTERSICAgICAgcjQsW3IwLCM0XQotICAgIExEUiAgICAgIHIxMCxbcjBdLHIxCi0gICAgTERSICAgICAgcjEyLFtyMiwjMF0KLSAgICBMRFIgICAgICBscixbcjIscjNdCi0gICAgTERSICAgICAgcjUsW3IwLCM0XQotICAgIExEUiAgICAgIHIxMSxbcjBdLHIxCi0gICAgTVZOICAgICAgcjEyLHIxMgotICAgIE1WTiAgICAgIGxyLGxyCi0gICAgTFNSICAgICAgcjEwLHIxMCwjMTYKLSAgICBPUlIgICAgICByMTAscjEwLHI0LExTTCAjMTYKLSAgICBMU1IgICAgICByMTEscjExLCMxNgotICAgIE9SUiAgICAgIHIxMSxyMTEscjUsTFNMICMxNgotICAgIFVIU1VCOCAgIHI1LHIxMCxyMTIKLSAgICBVSFNVQjggICByNCxyMTEsbHIKLSAgICBFT1IgICAgICByNSxyNSxyNwotICAgIFNUUiAgICAgIHI1LFtyMl0scjMKLSAgICBFT1IgICAgICByNCxyNCxyNwotICAgIFNUUiAgICAgIHI0LFtyMl0scjMKLSAgICBMRFIgICAgICByNCxbcjAsIzRdCi0gICAgTERSICAgICAgcjEwLFtyMF0scjEKLSAgICBMRFIgICAgICByMTIsW3IyLCMwXQotICAgIExEUiAgICAgIGxyLFtyMixyM10KLSAgICBMRFIgICAgICByNSxbcjAsIzRdCi0gICAgTERSICAgICAgcjExLFtyMF0scjEKLSAgICBNVk4gICAgICByMTIscjEyCi0gICAgTVZOICAgICAgbHIsbHIKLSAgICBMU1IgICAgICByMTAscjEwLCMxNgotICAgIE9SUiAgICAgIHIxMCxyMTAscjQsTFNMICMxNgotICAgIExTUiAgICAgIHIxMSxyMTEsIzE2Ci0gICAgT1JSICAgICAgcjExLHIxMSxyNSxMU0wgIzE2Ci0gICAgVUhTVUI4ICAgcjUscjEwLHIxMgotICAgIFVIU1VCOCAgIHI0LHIxMSxscgotICAgIEVPUiAgICAgIHI1LHI1LHI3Ci0gICAgU1RSICAgICAgcjUsW3IyXSxyMwotICAgIEVPUiAgICAgIHI0LHI0LHI3Ci0gICAgU1RSICAgICAgcjQsW3IyXSxyMwotICAgIFBPUCAgICAgIHtyNC1yNixwY30KLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjNfdW5zYWZlCi1hcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduM191bnNhZmU6Ci0gICAgUFVTSCAgICAge3I0LXI2LGxyfQotICAgIExEUiAgICAgIHI3LCA9MHg4MDgwODA4MAotICAgIExEUiAgICAgIHI0LFtyMCwjNF0KLSAgICBMRFIgICAgICByMTAsW3IwXSxyMQotICAgIExEUiAgICAgIHIxMixbcjIsIzBdCi0gICAgTERSICAgICAgbHIsW3IyLHIzXQotICAgIExEUiAgICAgIHI1LFtyMCwjNF0KLSAgICBMRFIgICAgICByMTEsW3IwXSxyMQotICAgIE1WTiAgICAgIHIxMixyMTIKLSAgICBNVk4gICAgICBscixscgotICAgIExTUiAgICAgIHIxMCxyMTAsIzI0Ci0gICAgT1JSICAgICAgcjEwLHIxMCxyNCxMU0wgIzgKLSAgICBMU1IgICAgICByMTEscjExLCMyNAotICAgIE9SUiAgICAgIHIxMSxyMTEscjUsTFNMICM4Ci0gICAgVUhTVUI4ICAgcjUscjEwLHIxMgotICAgIFVIU1VCOCAgIHI0LHIxMSxscgotICAgIEVPUiAgICAgIHI1LHI1LHI3Ci0gICAgU1RSICAgICAgcjUsW3IyXSxyMwotICAgIEVPUiAgICAgIHI0LHI0LHI3Ci0gICAgU1RSICAgICAgcjQsW3IyXSxyMwotICAgIExEUiAgICAgIHI0LFtyMCwjNF0KLSAgICBMRFIgICAgICByMTAsW3IwXSxyMQotICAgIExEUiAgICAgIHIxMixbcjIsIzBdCi0gICAgTERSICAgICAgbHIsW3IyLHIzXQotICAgIExEUiAgICAgIHI1LFtyMCwjNF0KLSAgICBMRFIgICAgICByMTEsW3IwXSxyMQotICAgIE1WTiAgICAgIHIxMixyMTIKLSAgICBNVk4gICAgICBscixscgotICAgIExTUiAgICAgIHIxMCxyMTAsIzI0Ci0gICAgT1JSICAgICAgcjEwLHIxMCxyNCxMU0wgIzgKLSAgICBMU1IgICAgICByMTEscjExLCMyNAotICAgIE9SUiAgICAgIHIxMSxyMTEscjUsTFNMICM4Ci0gICAgVUhTVUI4ICAgcjUscjEwLHIxMgotICAgIFVIU1VCOCAgIHI0LHIxMSxscgotICAgIEVPUiAgICAgIHI1LHI1LHI3Ci0gICAgU1RSICAgICAgcjUsW3IyXSxyMwotICAgIEVPUiAgICAgIHI0LHI0LHI3Ci0gICAgU1RSICAgICAgcjQsW3IyXSxyMwotICAgIFBPUCAgICAgIHtyNC1yNixwY30KLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBlYTRhOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0xUNF91bnNhZmUKLWFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTTFQ0X3Vuc2FmZToKLSAgICBWTEQxLjMyICB7ZDE4WzBdfSxbcjVdIQotICAgIFZTVUJMLlU4IHExMSxkNSxkOQotICAgIFZNT1YgICAgIGQyOCxkMTgKLSAgICBWU1VCTC5VOCBxMTAsZDgsZDQKLSAgICBWU0hSLlMxNiBxMTEscTExLCMyCi0gICAgVlpJUC44ICAgZDE4LGQyOAotICAgIFZCSUYgICAgIGQxOCxkMTQsZDE2Ci0gICAgVlJIQURELlMxNiBxMTAscTExLHExMAotICAgIFZBREQuSTggIGQzMSxkMTgsZDE1Ci0gICAgVlFNT1ZOLlMxNiBkMjAscTEwCi0gICAgVkxEMS44ICAge2QwW119LFtyMl0KLSAgICBWTUlOLlM4ICBkMjAsZDIwLGQzMQotICAgIFZORUcuUzggIGQzMSxkMzEKLSAgICBWTEQxLjggICB7ZDJbXX0sW3IzXQotICAgIFZNQVguUzggIGQyMCxkMjAsZDMxCi0gICAgVk1PVkwuVTggcTE0LGQ0Ci0gICAgVk1PVkwuVTggcTEyLGQ4Ci0gICAgVkFERFcuUzggcTE0LHExNCxkMjAKLSAgICBWU1VCVy5TOCBxMTIscTEyLGQyMAotICAgIFZRTU9WVU4uUzE2IGQyOSxxMTQKLSAgICBWUU1PVlVOLlMxNiBkMjQscTEyCi0gICAgQlggICAgICAgbHIKLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNHRTRfdW5zYWZlCi1hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0dFNF91bnNhZmU6Ci0gICAgVkhBREQuVTggZDEzLGQ0LGQ5Ci0gICAgVkhBREQuVTggZDMxLGQ4LGQ1Ci0gICAgVkxEMS44ICAge2QwW119LFtyMl0KLSAgICBBREQgICAgICByNSxyNSwjNAotICAgIFZMRDEuOCAgIHtkMltdfSxbcjNdCi0gICAgVlJIQURELlU4IGQxMyxkMTMsZDUKLSAgICBWUkhBREQuVTggZDMxLGQzMSxkOQotICAgIEJYICAgICAgIGxyCi0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVmYjJjNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0KLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKLWFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmU6Ci0gICAgVlNVQkwuVTggcTExLGQ1LGQ5Ci0gICAgVkxEMS44ICAge2QxOFtdfSxbcjVdIQotICAgIFZTVUJMLlU4IHExMCxkOCxkNAotICAgIFZMRDEuOCAgIHtkMTlbXX0sW3I1XSEKLSAgICBWU0hSLlMxNiBxMTEscTExLCMyCi0gICAgVkVYVC44ICAgZDE4LGQxOCxkMTksIzQKLSAgICBWQU5EICAgICBkMTksZDE3LGQxNQotICAgIFZCSUYgICAgIGQxOCxkMTQsZDE2Ci0gICAgVlJIQURELlMxNiBxMTAscTExLHExMAotICAgIFZSSEFERC5VOCBkMjQsZDQsZDgKLSAgICBWQURELkk4ICBkMzEsZDE4LGQxOQotICAgIFZBTkQgICAgIGQxOSxkMTIsZDE1Ci0gICAgVlFBREQuVTggZDIzLGQ1LGQxOAotICAgIFZRTU9WTi5TMTYgZDIwLHExMAotICAgIFZBREQuSTggIGQzMSxkMzEsZDE5Ci0gICAgVlFTVUIuVTggZDIyLGQ1LGQxOAotICAgIFZRQURELlU4IGQxOSxkOSxkMTgKLSAgICBWSEFERC5VOCBkMjYsZDI0LGQ2Ci0gICAgVk1JTi5TOCAgZDIwLGQyMCxkMzEKLSAgICBWTkVHLlM4ICBkMzEsZDMxCi0gICAgVlFTVUIuVTggZDIxLGQ5LGQxOAotICAgIFZIQURELlU4IGQyNyxkMjQsZDEwCi0gICAgVk1BWC5VOCAgZDMwLGQyNixkMjIKLSAgICBWTUFYLlM4ICBkMjAsZDIwLGQzMQotICAgIFZNT1ZMLlU4IHExNCxkNAotICAgIFZNT1ZMLlU4IHExMixkOAotICAgIFZBRERXLlM4IHExNCxxMTQsZDIwCi0gICAgVlNVQlcuUzggcTEyLHExMixkMjAKLSAgICBWUU1PVlVOLlMxNiBkMjkscTE0Ci0gICAgVlFNT1ZVTi5TMTYgZDI0LHExMgotICAgIFZNQVguVTggIGQyNSxkMjcsZDIxCi0gICAgVk1JTi5VOCAgZDMwLGQzMCxkMjMKLSAgICBWTUlOLlU4ICBkMjUsZDI1LGQxOQotICAgIFZCSUYgICAgIGQyOSxkNCxkMTYKLSAgICBWQklGICAgICBkMzAsZDUsZDE3Ci0gICAgVkJJRiAgICAgZDI0LGQ4LGQxNgotICAgIFZCSUYgICAgIGQyNSxkOSxkMTIKLSAgICBCWCAgICAgICBscgotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCi1hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlOgotICAgIFZTSFIuVTggIGQxOSxkMCwjMgotICAgIFZBREQuSTggIGQxOSxkMTksZDE1Ci0gICAgVkFEREwuVTggcTEwLGQ4LGQ0Ci0gICAgVkFERC5JOCAgZDE5LGQxOSxkMTUKLSAgICBWQURETC5VOCBxMTEsZDYsZDkKLSAgICBWQUREVy5VOCBxMTIscTEwLGQ1Ci0gICAgVkNHVC5VOCAgZDE5LGQxOSxkMTMKLSAgICBWU0hSLlUxNiBxMTEscTExLCMxCi0gICAgVkhBREQuVTE2IHExMSxxMTIscTExCi0gICAgVkFERFcuVTggcTEyLHExMixkNgotICAgIFZBRERMLlU4IHExMyxkNyxkNgotICAgIFZBTkQgICAgIGQxNyxkMTcsZDE5Ci0gICAgVkhBREQuVTggZDI4LGQ0LGQ5Ci0gICAgVlNSQS5VMTYgcTEzLHExMiwjMQotICAgIFZBTkQgICAgIGQxMixkMTIsZDE5Ci0gICAgVlFSU0hSTi5VMTYgZDI5LHExMSwjMQotICAgIFZSSEFERC5VOCBkMjgsZDI4LGQ1Ci0gICAgVlFSU0hSTi5VMTYgZDMwLHExMiwjMgotICAgIFZBRERMLlU4IHExMSxkMTAsZDUKLSAgICBWQUREVy5VOCBxMTIscTEwLGQ5Ci0gICAgVkJJRiAgICAgZDI5LGQyOCxkMTcKLSAgICBWUVJTSFJOLlUxNiBkMzEscTEzLCMyCi0gICAgVkFEREwuVTggcTEzLGQxMSxkMTAKLSAgICBWU0hSLlUxNiBxMTEscTExLCMxCi0gICAgVkhBREQuVTE2IHExMSxxMTIscTExCi0gICAgVkFERFcuVTggcTEyLHExMixkMTAKLSAgICBWSEFERC5VOCBkMjgsZDgsZDUKLSAgICBWQklGICAgICBkMjksZDQsZDE2Ci0gICAgVkJJRiAgICAgZDMwLGQ1LGQxNwotICAgIFZTUkEuVTE2IHExMyxxMTIsIzEKLSAgICBWUVJTSFJOLlUxNiBkMjUscTEyLCMyCi0gICAgVlFSU0hSTi5VMTYgZDI0LHExMSwjMQotICAgIFZSSEFERC5VOCBkMjIsZDI4LGQ5Ci0gICAgVkJJRiAgICAgZDI1LGQ5LGQxMgotICAgIFZCSUYgICAgIGQzMSxkNixkMTcKLSAgICBWQklGICAgICBkMjQsZDIyLGQxMgotICAgIFZRUlNIUk4uVTE2IGQyOCxxMTMsIzIKLSAgICBWQklGICAgICBkMjQsZDgsZDE2Ci0gICAgVkJJRiAgICAgZDI4LGQxMCxkMTIKLSAgICBCWCAgICAgICBscgotCi0gICAgLmVuZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YzA0NTIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotCi0gICAgLmV4dGVybiAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzCi0gICAgLmV4dGVybiAgIGFybVZDTTRQMTBfU3VmZml4VG9MZXZlbAotICAgIC5leHRlcm4gICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlcwotICAgIC5leHRlcm4gICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzCi0gICAgLmV4dGVybiAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXMKLSAgICAuZXh0ZXJuICAgYXJtVkNNNFAxMF9aaWdaYWdfMngyCi0gICAgLmV4dGVybiAgIGFybVZDTTRQMTBfWmlnWmFnXzR4NAotCi0gICAgLmhpZGRlbiAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzCi0gICAgLmhpZGRlbiAgIGFybVZDTTRQMTBfU3VmZml4VG9MZXZlbAotICAgIC5oaWRkZW4gICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlcwotICAgIC5oaWRkZW4gICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzCi0gICAgLmhpZGRlbiAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXMKLSAgICAuaGlkZGVuICAgYXJtVkNNNFAxMF9aaWdaYWdfMngyCi0gICAgLmhpZGRlbiAgIGFybVZDTTRQMTBfWmlnWmFnXzR4NAotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcgotYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXI6Ci0gICAgUFVTSCAgICAge3I0LXIxMixscn0KLSAgICBTVUIgICAgICBzcCxzcCwjMHg0MAotICAgIExEUiAgICAgIHIxMCxbcjAsIzBdCi0gICAgTERSICAgICAgcjEyLFtyMSwjMF0KLSAgICBMRFIgICAgICByNiwgLkxhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlcwotUDA6IEFERCAgICAgIHI2LCBwYwotICAgIExEUiAgICAgIHI0LFtzcCwjMHg2OF0KLSAgICBMRFJCICAgICByOSxbcjEwLCMyXQotICAgIExEUkIgICAgIHI4LFtyMTAsIzFdCi0gICAgTERSQiAgICAgcjExLFtyMTBdLCMzCi0gICAgQUREICAgICAgcjEyLHIxMiwjOAotICAgIExEUiAgICAgIHI2LFtyNixyNCxMU0wgIzJdCi0gICAgT1JSICAgICAgcjkscjkscjgsTFNMICM4Ci0gICAgT1JSICAgICAgcjExLHI5LHIxMSxMU0wgIzE2Ci0gICAgTFNMUyAgICAgcjgscjExLHIxMgotICAgIE1PVlMgICAgIHI3LCMweDFlCi0gICAgQU5EICAgICAgcjcscjcscjgsTFNSICMyNwotICAgIFNVQlMgICAgIHIxMixyMTIsIzgKLUwweDQ0OgotICAgIEJDQyAgICAgIEwxCi0gICAgTERSQiAgICAgcjgsW3IxMF0sIzEKLUwxOgotICAgIExEUkggICAgIHI3LFtyNixyN10KLSAgICBBRERDQyAgICByMTIscjEyLCM4Ci0gICAgQUREICAgICAgcjEyLHIxMiwjNAotICAgIE9SUkNTICAgIHIxMSxyOCxyMTEsTFNMICM4Ci0gICAgTFNSUyAgICAgcjgscjcsIzEKLSAgICBCQ1MgICAgICBMMHg3NAotICAgIExTTFMgICAgIHI4LHIxMSxyMTIKLSAgICBTVUJTICAgICByMTIscjEyLCMweGEKLSAgICBBREQgICAgICByNyxyNyxyOCxMU1IgIzI5Ci0gICAgQklDICAgICAgcjcscjcsIzEKLSAgICBCICAgICAgICBMMHg0NAotTDB4NzQ6Ci0gICAgU1VCICAgICAgcjEyLHIxMixyNyxMU1IgIzEzCi0gICAgQklDICAgICAgcjcscjgsIzB4ZjAwMAotICAgIExTUlMgICAgIHI1LHI3LCMyCi0gICAgU1RSQiAgICAgcjUsW3IyLCMwXQotICAgIEJFUSAgICAgIEwweDM0NAotICAgIENNUCAgICAgIHI3LCMweDQ0Ci0gICAgQkdFICAgICAgTDB4MzNjCi0gICAgU1RSICAgICAgcjAsW3NwLCMwXQotICAgIFNUUiAgICAgIHIxLFtzcCwjNF0KLSAgICBTVFIgICAgICByMyxbc3AsIzhdCi0gICAgQU5EUyAgICAgcjEscjcsIzMKLSAgICBBREQgICAgICByMixzcCwjMHhjCi0gICAgQkVRICAgICAgTDB4ZDgKLSAgICBNT1YgICAgICByMCxyMQotTDB4YWM6Ci0gICAgTFNMUyAgICAgcjcscjExLHIxMgotICAgIFNVQlMgICAgIHIxMixyMTIsIzcKLSAgICBCQ0MgICAgICBMMgotICAgIExEUkIgICAgIHI4LFtyMTBdLCMxCi1MMjoKLSAgICBBRERDQyAgICByMTIscjEyLCM4Ci0gICAgTFNSICAgICAgcjcscjcsIzMxCi0gICAgT1JSQ1MgICAgcjExLHI4LHIxMSxMU0wgIzgKLSAgICBTVUJTICAgICByMCxyMCwjMQotICAgIE1PViAgICAgIHI4LCMxCi0gICAgU1VCICAgICAgcjgscjgscjcsTFNMICMxCi0gICAgU1RSSCAgICAgcjgsW3IyXSwjMgotICAgIEJHVCAgICAgIEwweGFjCi1MMHhkODoKLSAgICBTVUJTICAgICByMCxyNSxyMQotICAgIEJFUSAgICAgIEwweDFiOAotICAgIE1PViAgICAgIHI0LCMxCi0gICAgQ01QICAgICAgcjUsIzB4YQotICAgIE1PVkxFICAgIHI0LCMwCi0gICAgQ01QICAgICAgcjEsIzMKLSAgICBNT1ZMVCAgICByMSwjNAotICAgIE1PVkdFICAgIHIxLCMyCi0gICAgTU9WR0UgICAgcjQsIzAKLUwweGZjOgotICAgIExTTFMgICAgIHI3LHIxMSxyMTIKLSAgICBDTFogICAgICByNyxyNwotICAgIEFERCAgICAgIHIxMixyMTIscjcKLSAgICBTVUJTICAgICByMTIscjEyLCM3Ci0gICAgQkNDICAgICAgTDMKLSAgICBMRFJCICAgICByOCxbcjEwXSwjMQotICAgIE9SUiAgICAgIHIxMSxyOCxyMTEsTFNMICM4Ci0gICAgU1VCUyAgICAgcjEyLHIxMiwjOAotICAgIEJDQyAgICAgIEwzCi0gICAgTERSQiAgICAgcjgsW3IxMF0sIzEKLUwzOgotICAgIEFERENDICAgIHIxMixyMTIsIzgKLSAgICBPUlJDUyAgICByMTEscjgscjExLExTTCAjOAotICAgIENNUCAgICAgIHI3LCMweDEwCi0gICAgQkdFICAgICAgTDB4MzNjCi0gICAgTU9WUyAgICAgbHIscjQKLSAgICBURVFFUSAgICByNywjMHhlCi0gICAgTU9WRVEgICAgbHIsIzQKLSAgICBURVEgICAgICByNywjMHhmCi0gICAgTU9WRVEgICAgbHIsIzB4YwotICAgIFRFUUVRICAgIHI0LCMwCi0gICAgQURERVEgICAgcjcscjcsIzB4ZgotICAgIFRFUSAgICAgIGxyLCMwCi0gICAgQkVRICAgICAgTDB4MTg0Ci0gICAgTFNMICAgICAgcjMscjExLHIxMgotICAgIEFERCAgICAgIHIxMixyMTIsbHIKLSAgICBTVUJTICAgICByMTIscjEyLCM4Ci0gICAgUlNCICAgICAgcjksbHIsIzB4MjAKLSAgICBCQ0MgICAgICBMNAotICAgIExEUkIgICAgIHI4LFtyMTBdLCMxCi0gICAgT1JSICAgICAgcjExLHI4LHIxMSxMU0wgIzgKLSAgICBTVUJTICAgICByMTIscjEyLCM4Ci0gICAgQkNDICAgICAgTDQKLSAgICBMRFJCICAgICByOCxbcjEwXSwjMQotTDQ6Ci0gICAgQUREQ0MgICAgcjEyLHIxMiwjOAotICAgIExTUiAgICAgIHIzLHIzLHI5Ci0gICAgT1JSQ1MgICAgcjExLHI4LHIxMSxMU0wgIzgKLSAgICBMU0wgICAgICByNyxyNyxyNAotICAgIEFERCAgICAgIHI3LHIzLHI3Ci1MMHgxODQ6Ci0gICAgQUREICAgICAgcjcscjcscjEKLSAgICBNT1YgICAgICByMSwjMgotICAgIExTUlMgICAgIHI4LHI3LCMxCi0gICAgUlNCQ1MgICAgcjgscjgsIzAKLSAgICBTVFJIICAgICByOCxbcjJdLCMyCi0gICAgTERSICAgICAgcjksIC5MYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsCi1QMTogQUREICAgICAgcjksIHBjCi0gICAgTERSU0IgICAgcjgsW3I5LHI0XQotICAgIFRFUSAgICAgIHI0LCMwCi0gICAgTU9WRVEgICAgcjQsIzEKLSAgICBDTVAgICAgICByNyxyOAotICAgIEFERENTICAgIHI0LHI0LCMxCi0gICAgU1VCUyAgICAgcjAscjAsIzEKLSAgICBCR1QgICAgICBMMHhmYwotTDB4MWI4OgotICAgIExEUiAgICAgIHI4LFtzcCwjMHg2Y10KLSAgICBTVUIgICAgICByMCxyNSwjMQotICAgIFNVQlMgICAgIHIxLHI4LHI1Ci0gICAgQUREICAgICAgcjQsc3AsIzB4MmMKLSAgICBNT1YgICAgICBscixyNQotICAgIFNVQiAgICAgIGxyLGxyLCMxCi0gICAgQkVRICAgICAgTDB4MmIwCi0gICAgVEVRICAgICAgcjgsIzQKLSAgICBMRFJFUSAgICByNiwgLkxhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlcwotICAgIExEUk5FICAgIHI2LCAuTGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXMKLVAyOiBBREQgICAgICByNiwgcGMKLSAgICBMRFIgICAgICByNixbcjYscjUsTFNMICMyXQotICAgIExTTFMgICAgIHI4LHIxMSxyMTIKLSAgICBNT1ZTICAgICByNywjMHgxZQotICAgIEFORCAgICAgIHI3LHI3LHI4LExTUiAjMjcKLSAgICBTVUJTICAgICByMTIscjEyLCM4Ci1MMHgxZjQ6Ci0gICAgQkNDICAgICAgTDUKLSAgICBMRFJCICAgICByOCxbcjEwXSwjMQotTDU6Ci0gICAgTERSSCAgICAgcjcsW3I2LHI3XQotICAgIEFERENDICAgIHIxMixyMTIsIzgKLSAgICBBREQgICAgICByMTIscjEyLCM0Ci0gICAgT1JSQ1MgICAgcjExLHI4LHIxMSxMU0wgIzgKLSAgICBMU1JTICAgICByOCxyNywjMQotICAgIEJDUyAgICAgIEwweDIyNAotICAgIExTTFMgICAgIHI4LHIxMSxyMTIKLSAgICBTVUJTICAgICByMTIscjEyLCMweGEKLSAgICBBREQgICAgICByNyxyNyxyOCxMU1IgIzI5Ci0gICAgQklDICAgICAgcjcscjcsIzEKLSAgICBCICAgICAgICBMMHgxZjQKLUwweDIyNDoKLSAgICBTVUIgICAgICByMTIscjEyLHI3LExTUiAjMTMKLSAgICBCSUMgICAgICByNyxyOCwjMHhmMDAwCi0gICAgQ01QICAgICAgcjcsIzB4MTAKLSAgICBCR0UgICAgICBMMHgzM2MKLSAgICBMRFIgICAgICByMywgLkxhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzCi1QMzogQUREICAgICAgcjMsIHBjCi0gICAgQUREICAgICAgcjQsc3AsIzB4MmMKLSAgICBNT1ZTICAgICByMSxyNwotICAgIEFERCAgICAgIGxyLGxyLHIxCi0gICAgQkVRICAgICAgTDB4MmIwCi1MMHgyNDg6Ci0gICAgU1VCUyAgICAgcjAscjAsIzEKLSAgICBMRFIgICAgICByNixbcjMscjEsTFNMICMyXQotICAgIEJMVCAgICAgIEwweDJiYwotICAgIExTTFMgICAgIHI4LHIxMSxyMTIKLSAgICBNT1ZTICAgICByNywjMHhlCi0gICAgQU5EICAgICAgcjcscjcscjgsTFNSICMyOAotICAgIFNVQlMgICAgIHIxMixyMTIsIzgKLUwweDI2NDoKLSAgICBCQ0MgICAgICBMNgotICAgIExEUkIgICAgIHI4LFtyMTBdLCMxCi1MNjoKLSAgICBMRFJIICAgICByNyxbcjYscjddCi0gICAgQUREQ0MgICAgcjEyLHIxMiwjOAotICAgIEFERCAgICAgIHIxMixyMTIsIzMKLSAgICBPUlJDUyAgICByMTEscjgscjExLExTTCAjOAotICAgIExTUlMgICAgIHI4LHI3LCMxCi0gICAgQkNTICAgICAgTDB4Mjk0Ci0gICAgTFNMUyAgICAgcjgscjExLHIxMgotICAgIFNVQlMgICAgIHIxMixyMTIsIzkKLSAgICBBREQgICAgICByNyxyNyxyOCxMU1IgIzI5Ci0gICAgQklDICAgICAgcjcscjcsIzEKLSAgICBCICAgICAgICBMMHgyNjQKLUwweDI5NDoKLSAgICBTVUIgICAgICByMTIscjEyLHI3LExTUiAjMTMKLSAgICBCSUMgICAgICByNyxyOCwjMHhmMDAwCi0gICAgQ01QICAgICAgcjcsIzB4ZgotICAgIEJHRSAgICAgIEwweDMzYwotICAgIFNVQlMgICAgIHIxLHIxLHI3Ci0gICAgU1RSQiAgICAgcjcsW3I0XSwjMQotICAgIEJHVCAgICAgIEwweDI0OAotTDB4MmIwOgotICAgIFNVQlMgICAgIHIwLHIwLCMxCi0gICAgQkxUICAgICAgTDcKLSAgICBTVFJCICAgICByMSxbcjRdLCMxCi1MNzoKLSAgICBCR1QgICAgICBMMHgyYjAKLUwweDJiYzoKLSAgICBTVFJCICAgICByMSxbcjRdLCMxCi0gICAgTERSICAgICAgcjgsW3NwLCMweDZjXQotICAgIFRFUSAgICAgIHI4LCMweGYKLSAgICBBRERFUSAgICBscixsciwjMQotICAgIFNVQiAgICAgIHI0LHI0LHI1Ci0gICAgU1VCICAgICAgcjIscjIscjUKLSAgICBTVUIgICAgICByMixyMixyNQotICAgIExEUiAgICAgIHIzLFtzcCwjOF0KLSAgICBMRFIgICAgICByMCxbcjMsIzBdCi0gICAgVEVRICAgICAgcjgsIzQKLSAgICBMRFJFUSAgICByNiwgLkxhcm1WQ000UDEwX1ppZ1phZ18yeDIKLSAgICBMRFJORSAgICByNiwgLkxhcm1WQ000UDEwX1ppZ1phZ180eDQKLVA0OiBBREQgICAgICByNiwgcGMKLUwweDJlYzoKLSAgICBMRFJCICAgICByOSxbcjRdLCMxCi0gICAgTERSQiAgICAgcjgsW3I2LGxyXQotICAgIFNVQiAgICAgIGxyLGxyLCMxCi0gICAgU1VCICAgICAgbHIsbHIscjkKLSAgICBMRFJTSCAgICByOSxbcjJdLCMyCi0gICAgU1VCUyAgICAgcjUscjUsIzEKLSAgICBPUlJFUSAgICByOCxyOCwjMHgyMAotICAgIEFERCAgICAgIHIxLHI5LCMweDgwCi0gICAgQ01QICAgICAgcjEsIzB4MTAwCi0gICAgT1JSQ1MgICAgcjgscjgsIzB4MTAKLSAgICBURVEgICAgICByNSwjMAotICAgIFNUUkIgICAgIHI4LFtyMF0sIzEKLSAgICBTVFJCICAgICByOSxbcjBdLCMxCi0gICAgTFNSICAgICAgcjkscjksIzgKLSAgICBCQ0MgICAgICBMOAotICAgIFNUUkIgICAgIHI5LFtyMF0sIzEKLUw4OgotICAgIEJORSAgICAgIEwweDJlYwotICAgIFNUUiAgICAgIHIwLFtyMywjMF0KLSAgICBMRFIgICAgICByMCxbc3AsIzBdCi0gICAgTERSICAgICAgcjEsW3NwLCM0XQotICAgIEIgICAgICAgIEwweDM0NAotTDB4MzNjOgotICAgIE1WTiAgICAgIHIwLCMxCi0gICAgQiAgICAgICAgTDB4MzVjCi1MMHgzNDQ6Ci0gICAgQUREICAgICAgcjEwLHIxMCxyMTIsTFNSICMzCi0gICAgQU5EICAgICAgcjEyLHIxMiwjNwotICAgIFNVQiAgICAgIHIxMCxyMTAsIzQKLSAgICBTVFIgICAgICByMTIsW3IxLCMwXQotICAgIFNUUiAgICAgIHIxMCxbcjAsIzBdCi0gICAgTU9WICAgICAgcjAsIzAKLUwweDM1YzoKLSAgICBBREQgICAgICBzcCxzcCwjMHg0MAotICAgIFBPUCAgICAgIHtyNC1yMTIscGN9Ci0KLS5MYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXM6Ci0gICAgLndvcmQgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlcy0oUDArOCkKLS5MYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsOgotICAgIC53b3JkICAgYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsLShQMSs4KQotLkxhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlczoKLSAgICAud29yZCAgIChhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlcyAtIDQpLShQMis4KQotLkxhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzOgotICAgIC53b3JkICAgKGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXMgLSA0KS0oUDIrOCkKLS5MYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlczoKLSAgICAud29yZCAgIChhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzIC0gNCktKFAzKzgpCi0uTGFybVZDTTRQMTBfWmlnWmFnXzJ4MjoKLSAgICAud29yZCAgIGFybVZDTTRQMTBfWmlnWmFnXzJ4Mi0oUDQrOCkKLS5MYXJtVkNNNFAxMF9aaWdaYWdfNHg0OgotICAgIC53b3JkICAgYXJtVkNNNFAxMF9aaWdaYWdfNHg0LShQNCs4KQotCi0gICAgLmVuZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZWJmMmYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC5zZWN0aW9uIC5yb2RhdGEKLSAgICAuYWxpZ24gNAotCi0KLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfUVBEaXZUYWJsZQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDQKLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfUG9zVG9WQ29sMngyCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX1ZNYXRyaXgKLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9WTWF0cml4VTE2Ci0KLSAgICAuaGlkZGVuIGFybVZDTTRQMTBfUVBEaXZUYWJsZQotICAgIC5oaWRkZW4gYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQotICAgIC5oaWRkZW4gYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDQKLSAgICAuaGlkZGVuIGFybVZDTTRQMTBfUG9zVG9WQ29sMngyCi0gICAgLmhpZGRlbiBhcm1WQ000UDEwX1ZNYXRyaXgKLSAgICAuaGlkZGVuIGFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZQotICAgIC5oaWRkZW4gYXJtVkNNNFAxMF9WTWF0cml4VTE2Ci0KLWFybVZDTTRQMTBfUG9zVG9WQ29sNHg0OgotICAgIC5ieXRlICAwLCAyLCAwLCAyCi0gICAgLmJ5dGUgIDIsIDEsIDIsIDEKLSAgICAuYnl0ZSAgMCwgMiwgMCwgMgotICAgIC5ieXRlICAyLCAxLCAyLCAxCi0KLWFybVZDTTRQMTBfUG9zVG9WQ29sMngyOgotICAgIC5ieXRlICAwLCAyCi0gICAgLmJ5dGUgIDIsIDEKLQotYXJtVkNNNFAxMF9WTWF0cml4OgotICAgIC5ieXRlICAxMCwgMTYsIDEzCi0gICAgLmJ5dGUgIDExLCAxOCwgMTQKLSAgICAuYnl0ZSAgMTMsIDIwLCAxNgotICAgIC5ieXRlICAxNCwgMjMsIDE4Ci0gICAgLmJ5dGUgIDE2LCAyNSwgMjAKLSAgICAuYnl0ZSAgMTgsIDI5LCAyMwotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gWyhJTlQpKFFQLzYpXSwKLTsvLyBmb3IgdmFsdWVzIG9mIFFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYXJtVkNNNFAxMF9RUERpdlRhYmxlOgotICAgIC5ieXRlICAwLCAgMCwgIDAsICAwLCAgMCwgIDAKLSAgICAuYnl0ZSAgMSwgIDEsICAxLCAgMSwgIDEsICAxCi0gICAgLmJ5dGUgIDIsICAyLCAgMiwgIDIsICAyLCAgMgotICAgIC5ieXRlICAzLCAgMywgIDMsICAzLCAgMywgIDMKLSAgICAuYnl0ZSAgNCwgIDQsICA0LCAgNCwgIDQsICA0Ci0gICAgLmJ5dGUgIDUsICA1LCAgNSwgIDUsICA1LCAgNQotICAgIC5ieXRlICA2LCAgNiwgIDYsICA2LCAgNiwgIDYKLSAgICAuYnl0ZSAgNywgIDcsICA3LCAgNywgIDcsICA3Ci0gICAgLmJ5dGUgIDgsICA4LCAgOCwgIDgsICA4LCAgOAotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ly8gVGhpcyB0YWJsZSBjb250YWlucyBhcm1WQ000UDEwX1ZNYXRyaXhbUVAlNl1bMF0gZW50aXJlcywKLTsvLyBmb3IgdmFsdWVzIG9mIFFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZToKLSAgICAuYnl0ZSAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgLmJ5dGUgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgIC5ieXRlIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAuYnl0ZSAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgLmJ5dGUgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgIC5ieXRlIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLSAgICAuYnl0ZSAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4Ci0gICAgLmJ5dGUgMTAsIDExLCAxMywgMTQsIDE2LCAxOAotICAgIC5ieXRlIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgZXZhbHVhdGVzIHRoZSBtb2R1bHVzIGV4cHJlc3Npb24gW1FQJTZdKjYsCi07Ly8gZm9yIHZhbHVlcyBvZiBRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZToKLSAgICAuYnl0ZSAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgIC5ieXRlIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgLmJ5dGUgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAuYnl0ZSAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgIC5ieXRlIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgLmJ5dGUgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLSAgICAuYnl0ZSAwLCA2LCAxMiwgMTgsIDI0LCAzMAotICAgIC5ieXRlIDAsIDYsIDEyLCAxOCwgMjQsIDMwCi0gICAgLmJ5dGUgMCwgNiwgMTIsIDE4LCAyNCwgMzAKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIGludmlkdWFsIGJ5dGUgdmFsdWVzIHN0b3JlZCBhcwotOy8vIGhhbGZ3b3Jkcy4gVGhpcyBhdm9pZHMgdW5wYWNraW5nIGluc2lkZSB0aGUgZnVuY3Rpb24KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYXJtVkNNNFAxMF9WTWF0cml4VTE2OgotICAgIC5od29yZCAxMCwgMTYsIDEzCi0gICAgLmh3b3JkIDExLCAxOCwgMTQKLSAgICAuaHdvcmQgMTMsIDIwLCAxNgotICAgIC5od29yZCAxNCwgMjMsIDE4Ci0gICAgLmh3b3JkIDE2LCAyNSwgMjAKLSAgICAuaHdvcmQgMTgsIDI5LCAyMwotCi0gICAgLmVuZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRlOTAwNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQotYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmU6Ci0gICAgTU9WICAgICAgcjEyLHI4Ci0gICAgQU5EICAgICAgcjcscjAsIzMKLSAgICBCSUMgICAgICByMCxyMCwjMwotICAgIEFERCAgICAgIHBjLHBjLHI3LExTTCAjMgotICAgIE5PUAotICAgIEIgICAgICAgIENvcHkwdG9BbGlnbmVkCi0gICAgQiAgICAgICAgQ29weTF0b0FsaWduZWQKLSAgICBCICAgICAgICBDb3B5MnRvQWxpZ25lZAotICAgIEIgICAgICAgIENvcHkzdG9BbGlnbmVkCi1Db3B5MHRvQWxpZ25lZDoKLSAgICBMRE0gICAgICByMCx7cjcscjEwLHIxMX0KLSAgICBTVUJTICAgICByOSxyOSwjMQotICAgIEFERCAgICAgIHIwLHIwLHIxCi0gICAgU1RNICAgICAgcjghLHtyNyxyMTAscjExfQotICAgIEJHVCAgICAgIENvcHkwdG9BbGlnbmVkCi0gICAgQiAgICAgICAgQ29weUVuZAotQ29weTF0b0FsaWduZWQ6Ci0gICAgTERNICAgICAgcjAse3I3LHIxMCxyMTF9Ci0gICAgU1VCUyAgICAgcjkscjksIzEKLSAgICBBREQgICAgICByMCxyMCxyMQotICAgIExTUiAgICAgIHI3LHI3LCM4Ci0gICAgT1JSICAgICAgcjcscjcscjEwLExTTCAjMjQKLSAgICBMU1IgICAgICByMTAscjEwLCM4Ci0gICAgT1JSICAgICAgcjEwLHIxMCxyMTEsTFNMICMyNAotICAgIExTUiAgICAgIHIxMSxyMTEsIzgKLSAgICBTVE0gICAgICByOCEse3I3LHIxMCxyMTF9Ci0gICAgQkdUICAgICAgQ29weTF0b0FsaWduZWQKLSAgICBCICAgICAgICBDb3B5RW5kCi1Db3B5MnRvQWxpZ25lZDoKLSAgICBMRE0gICAgICByMCx7cjcscjEwLHIxMX0KLSAgICBTVUJTICAgICByOSxyOSwjMQotICAgIEFERCAgICAgIHIwLHIwLHIxCi0gICAgTFNSICAgICAgcjcscjcsIzE2Ci0gICAgT1JSICAgICAgcjcscjcscjEwLExTTCAjMTYKLSAgICBMU1IgICAgICByMTAscjEwLCMxNgotICAgIE9SUiAgICAgIHIxMCxyMTAscjExLExTTCAjMTYKLSAgICBMU1IgICAgICByMTEscjExLCMxNgotICAgIFNUTSAgICAgIHI4ISx7cjcscjEwLHIxMX0KLSAgICBCR1QgICAgICBDb3B5MnRvQWxpZ25lZAotICAgIEIgICAgICAgIENvcHlFbmQKLUNvcHkzdG9BbGlnbmVkOgotICAgIExETSAgICAgIHIwLHtyNyxyMTAscjExfQotICAgIFNVQlMgICAgIHI5LHI5LCMxCi0gICAgQUREICAgICAgcjAscjAscjEKLSAgICBMU1IgICAgICByNyxyNywjMjQKLSAgICBPUlIgICAgICByNyxyNyxyMTAsTFNMICM4Ci0gICAgTFNSICAgICAgcjEwLHIxMCwjMjQKLSAgICBPUlIgICAgICByMTAscjEwLHIxMSxMU0wgIzgKLSAgICBMU1IgICAgICByMTEscjExLCMyNAotICAgIFNUTSAgICAgIHI4ISx7cjcscjEwLHIxMX0KLSAgICBCR1QgICAgICBDb3B5M3RvQWxpZ25lZAotQ29weUVuZDoKLSAgICBNT1YgICAgICByMCxyMTIKLSAgICBNT1YgICAgICByMSwjMHhjCi0gICAgQlggICAgICAgbHIKLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKLWFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlOgotICAgIEFORCAgICAgIHI3LHIwLCMzCi0gICAgQklDICAgICAgcjAscjAsIzMKLSAgICBBREQgICAgICBwYyxwYyxyNyxMU0wgIzIKLSAgICBOT1AKLSAgICBCICAgICAgICBDb3B5MHRvVkFsaWduZWQKLSAgICBCICAgICAgICBDb3B5MXRvVkFsaWduZWQKLSAgICBCICAgICAgICBDb3B5MnRvVkFsaWduZWQKLSAgICBCICAgICAgICBDb3B5M3RvVkFsaWduZWQKLUNvcHkwdG9WQWxpZ25lZDoKLSAgICBMRFIgICAgICByNyxbcjBdLHIxCi0gICAgU1VCUyAgICAgcjkscjksIzEKLSAgICBTVFIgICAgICByNyxbcjhdLCM0Ci0gICAgQkdUICAgICAgQ29weTB0b1ZBbGlnbmVkCi0gICAgQiAgICAgICAgQ29weVZFbmQKLUNvcHkxdG9WQWxpZ25lZDoKLSAgICBMRFIgICAgICByMTAsW3IwLCM0XQotICAgIExEUiAgICAgIHI3LFtyMF0scjEKLSAgICBTVUJTICAgICByOSxyOSwjMQotICAgIExTTCAgICAgIHIxMCxyMTAsIzI0Ci0gICAgT1JSICAgICAgcjcscjEwLHI3LExTUiAjOAotICAgIFNUUiAgICAgIHI3LFtyOF0sIzQKLSAgICBCR1QgICAgICBDb3B5MXRvVkFsaWduZWQKLSAgICBCICAgICAgICBDb3B5VkVuZAotQ29weTJ0b1ZBbGlnbmVkOgotICAgIExEUiAgICAgIHIxMCxbcjAsIzRdCi0gICAgTERSICAgICAgcjcsW3IwXSxyMQotICAgIFNVQlMgICAgIHI5LHI5LCMxCi0gICAgTFNMICAgICAgcjEwLHIxMCwjMTYKLSAgICBPUlIgICAgICByNyxyMTAscjcsTFNSICMxNgotICAgIFNUUiAgICAgIHI3LFtyOF0sIzQKLSAgICBCR1QgICAgICBDb3B5MnRvVkFsaWduZWQKLSAgICBCICAgICAgICBDb3B5VkVuZAotQ29weTN0b1ZBbGlnbmVkOgotICAgIExEUiAgICAgIHIxMCxbcjAsIzRdCi0gICAgTERSICAgICAgcjcsW3IwXSxyMQotICAgIFNVQlMgICAgIHI5LHI5LCMxCi0gICAgTFNMICAgICAgcjEwLHIxMCwjOAotICAgIE9SUiAgICAgIHI3LHIxMCxyNyxMU1IgIzI0Ci0gICAgU1RSICAgICAgcjcsW3I4XSwjNAotICAgIEJHVCAgICAgIENvcHkzdG9WQWxpZ25lZAotQ29weVZFbmQ6Ci0gICAgU1VCICAgICAgcjAscjgsIzB4MWMKLSAgICBNT1YgICAgICByMSwjNAotICAgIEJYICAgICAgIGxyCi0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JhMjg5MC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0KLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlCi1hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5NHg0X3Vuc2FmZToKLSAgICBQVVNIICAgICB7cjQtcjYsbHJ9Ci0gICAgQU5EICAgICAgcjEyLHIwLCMzCi0gICAgQklDICAgICAgcjAscjAsIzMKLSAgICBBREQgICAgICBwYyxwYyxyMTIsTFNMICMyCi0gICAgTk9QCi0gICAgQiAgICAgICAgQ29weTR4NEFsaWduMAotICAgIEIgICAgICAgIENvcHk0eDRBbGlnbjEKLSAgICBCICAgICAgICBDb3B5NHg0QWxpZ24yCi0gICAgQiAgICAgICAgQ29weTR4NEFsaWduMwotQ29weTR4NEFsaWduMDoKLSAgICBMRFIgICAgICByNCxbcjBdLHIxCi0gICAgTERSICAgICAgcjUsW3IwXSxyMQotICAgIFNUUiAgICAgIHI0LFtyMl0scjMKLSAgICBMRFIgICAgICByOCxbcjBdLHIxCi0gICAgU1RSICAgICAgcjUsW3IyXSxyMwotICAgIExEUiAgICAgIHI5LFtyMF0scjEKLSAgICBTVFIgICAgICByOCxbcjJdLHIzCi0gICAgU1RSICAgICAgcjksW3IyXSxyMwotICAgIEIgICAgICAgIENvcHk0eDRFbmQKLUNvcHk0eDRBbGlnbjE6Ci0gICAgTERSICAgICAgcjUsW3IwLCM0XQotICAgIExEUiAgICAgIHI0LFtyMF0scjEKLSAgICBMRFIgICAgICByOSxbcjAsIzRdCi0gICAgTERSICAgICAgcjgsW3IwXSxyMQotICAgIExTUiAgICAgIHI0LHI0LCM4Ci0gICAgT1JSICAgICAgcjQscjQscjUsTFNMICMyNAotICAgIFNUUiAgICAgIHI0LFtyMl0scjMKLSAgICBMU1IgICAgICByOCxyOCwjOAotICAgIE9SUiAgICAgIHI4LHI4LHI5LExTTCAjMjQKLSAgICBMRFIgICAgICByNSxbcjAsIzRdCi0gICAgTERSICAgICAgcjQsW3IwXSxyMQotICAgIFNUUiAgICAgIHI4LFtyMl0scjMKLSAgICBMRFIgICAgICByOSxbcjAsIzRdCi0gICAgTERSICAgICAgcjgsW3IwXSxyMQotICAgIExTUiAgICAgIHI0LHI0LCM4Ci0gICAgT1JSICAgICAgcjQscjQscjUsTFNMICMyNAotICAgIFNUUiAgICAgIHI0LFtyMl0scjMKLSAgICBMU1IgICAgICByOCxyOCwjOAotICAgIE9SUiAgICAgIHI4LHI4LHI5LExTTCAjMjQKLSAgICBTVFIgICAgICByOCxbcjJdLHIzCi0gICAgQiAgICAgICAgQ29weTR4NEVuZAotQ29weTR4NEFsaWduMjoKLSAgICBMRFIgICAgICByNSxbcjAsIzRdCi0gICAgTERSICAgICAgcjQsW3IwXSxyMQotICAgIExEUiAgICAgIHI5LFtyMCwjNF0KLSAgICBMRFIgICAgICByOCxbcjBdLHIxCi0gICAgTFNSICAgICAgcjQscjQsIzE2Ci0gICAgT1JSICAgICAgcjQscjQscjUsTFNMICMxNgotICAgIFNUUiAgICAgIHI0LFtyMl0scjMKLSAgICBMU1IgICAgICByOCxyOCwjMTYKLSAgICBPUlIgICAgICByOCxyOCxyOSxMU0wgIzE2Ci0gICAgU1RSICAgICAgcjgsW3IyXSxyMwotICAgIExEUiAgICAgIHI1LFtyMCwjNF0KLSAgICBMRFIgICAgICByNCxbcjBdLHIxCi0gICAgTERSICAgICAgcjksW3IwLCM0XQotICAgIExEUiAgICAgIHI4LFtyMF0scjEKLSAgICBMU1IgICAgICByNCxyNCwjMTYKLSAgICBPUlIgICAgICByNCxyNCxyNSxMU0wgIzE2Ci0gICAgU1RSICAgICAgcjQsW3IyXSxyMwotICAgIExTUiAgICAgIHI4LHI4LCMxNgotICAgIE9SUiAgICAgIHI4LHI4LHI5LExTTCAjMTYKLSAgICBTVFIgICAgICByOCxbcjJdLHIzCi0gICAgQiAgICAgICAgQ29weTR4NEVuZAotQ29weTR4NEFsaWduMzoKLSAgICBMRFIgICAgICByNSxbcjAsIzRdCi0gICAgTERSICAgICAgcjQsW3IwXSxyMQotICAgIExEUiAgICAgIHI5LFtyMCwjNF0KLSAgICBMRFIgICAgICByOCxbcjBdLHIxCi0gICAgTFNSICAgICAgcjQscjQsIzI0Ci0gICAgT1JSICAgICAgcjQscjQscjUsTFNMICM4Ci0gICAgU1RSICAgICAgcjQsW3IyXSxyMwotICAgIExTUiAgICAgIHI4LHI4LCMyNAotICAgIE9SUiAgICAgIHI4LHI4LHI5LExTTCAjOAotICAgIFNUUiAgICAgIHI4LFtyMl0scjMKLSAgICBMRFIgICAgICByNSxbcjAsIzRdCi0gICAgTERSICAgICAgcjQsW3IwXSxyMQotICAgIExEUiAgICAgIHI5LFtyMCwjNF0KLSAgICBMRFIgICAgICByOCxbcjBdLHIxCi0gICAgTFNSICAgICAgcjQscjQsIzI0Ci0gICAgT1JSICAgICAgcjQscjQscjUsTFNMICM4Ci0gICAgU1RSICAgICAgcjQsW3IyXSxyMwotICAgIExTUiAgICAgIHI4LHI4LCMyNAotICAgIE9SUiAgICAgIHI4LHI4LHI5LExTTCAjOAotICAgIFNUUiAgICAgIHI4LFtyMl0scjMKLUNvcHk0eDRFbmQ6Ci0gICAgUE9QICAgICAge3I0LXI2LHBjfQotCi0gICAgLmVuZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIyYzY3OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JEaWFnQ29weV91bnNhZmUKLWFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZToKLSAgICBQVVNIICAgICB7cjQtcjYsbHJ9Ci0gICAgTU9WICAgICAgbHIsIzQKLSAgICBMRFIgICAgICByNiwgPTB4ZmUwMGZlMAotICAgIExEUiAgICAgIHIxMiwgPTB4ZmYwMGZmCi1Mb29wU3RhcnQxOgotICAgIExEUiAgICAgIHIxMSxbcjAsIzB4Y10KLSAgICBMRFIgICAgICByMTAsW3IwLCM4XQotICAgIExEUiAgICAgIHI1LFtyMCwjNF0KLSAgICBMRFIgICAgICByNCxbcjBdLHIxCi0gICAgVVFTVUIxNiAgcjExLHIxMSxyNgotICAgIFVRU1VCMTYgIHIxMCxyMTAscjYKLSAgICBVUVNVQjE2ICByNSxyNSxyNgotICAgIFVRU1VCMTYgIHI0LHI0LHI2Ci0gICAgVVNBVDE2ICAgcjExLCMxMyxyMTEKLSAgICBVU0FUMTYgICByMTAsIzEzLHIxMAotICAgIFVTQVQxNiAgIHI1LCMxMyxyNQotICAgIFVTQVQxNiAgIHI0LCMxMyxyNAotICAgIEFORCAgICAgIHIxMSxyMTIscjExLExTUiAjNQotICAgIEFORCAgICAgIHIxMCxyMTIscjEwLExTUiAjNQotICAgIEFORCAgICAgIHI1LHIxMixyNSxMU1IgIzUKLSAgICBBTkQgICAgICByNCxyMTIscjQsTFNSICM1Ci0gICAgT1JSICAgICAgcjExLHIxMCxyMTEsTFNMICM4Ci0gICAgT1JSICAgICAgcjEwLHI0LHI1LExTTCAjOAotICAgIFNVQlMgICAgIGxyLGxyLCMxCi0gICAgU1RSRCAgICAgcjEwLHIxMSxbcjddLCM4Ci0gICAgQkdUICAgICAgTG9vcFN0YXJ0MQotICAgIFNVQiAgICAgIHIwLHI3LCMweDIwCi0gICAgTU9WICAgICAgcjEsIzgKLSAgICBQT1AgICAgICB7cjQtcjYscGN9Ci0KLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckRpYWdDb3B5X3Vuc2FmZQotYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlOgotICAgIFBVU0ggICAgIHtyNC1yNixscn0KLSAgICBMRFIgICAgICByNiwgPTB4ZmUwMGZlMAotICAgIExEUiAgICAgIHIxMiwgPTB4ZmYwMGZmCi0gICAgTU9WICAgICAgbHIsIzIKLUxvb3BTdGFydDoKLSAgICBMRFIgICAgICByMTEsW3IwLCMweGNdCi0gICAgTERSICAgICAgcjEwLFtyMCwjOF0KLSAgICBMRFIgICAgICByNSxbcjAsIzRdCi0gICAgTERSICAgICAgcjQsW3IwXSxyMQotICAgIFVRU1VCMTYgIHIxMSxyMTEscjYKLSAgICBVUVNVQjE2ICByMTAscjEwLHI2Ci0gICAgVVFTVUIxNiAgcjUscjUscjYKLSAgICBVUVNVQjE2ICByNCxyNCxyNgotICAgIFVTQVQxNiAgIHIxMSwjMTMscjExCi0gICAgVVNBVDE2ICAgcjEwLCMxMyxyMTAKLSAgICBVU0FUMTYgICByNSwjMTMscjUKLSAgICBVU0FUMTYgICByNCwjMTMscjQKLSAgICBBTkQgICAgICByMTEscjEyLHIxMSxMU1IgIzUKLSAgICBBTkQgICAgICByMTAscjEyLHIxMCxMU1IgIzUKLSAgICBBTkQgICAgICByNSxyMTIscjUsTFNSICM1Ci0gICAgQU5EICAgICAgcjQscjEyLHI0LExTUiAjNQotICAgIE9SUiAgICAgIHIxMSxyMTAscjExLExTTCAjOAotICAgIE9SUiAgICAgIHIxMCxyNCxyNSxMU0wgIzgKLSAgICBQS0hCVCAgICByNCxyMTAscjExLExTTCAjMTYKLSAgICBTVFIgICAgICByNCxbcjddLCM4Ci0gICAgUEtIVEIgICAgcjUscjExLHIxMCxBU1IgIzE2Ci0gICAgU1RSICAgICAgcjUsW3I3XSwjLTQKLSAgICBMRFIgICAgICByMTEsW3IwLCMweGNdCi0gICAgTERSICAgICAgcjEwLFtyMCwjOF0KLSAgICBMRFIgICAgICByNSxbcjAsIzRdCi0gICAgTERSICAgICAgcjQsW3IwXSxyMQotICAgIFVRU1VCMTYgIHIxMSxyMTEscjYKLSAgICBVUVNVQjE2ICByMTAscjEwLHI2Ci0gICAgVVFTVUIxNiAgcjUscjUscjYKLSAgICBVUVNVQjE2ICByNCxyNCxyNgotICAgIFVTQVQxNiAgIHIxMSwjMTMscjExCi0gICAgVVNBVDE2ICAgcjEwLCMxMyxyMTAKLSAgICBVU0FUMTYgICByNSwjMTMscjUKLSAgICBVU0FUMTYgICByNCwjMTMscjQKLSAgICBBTkQgICAgICByMTEscjEyLHIxMSxMU1IgIzUKLSAgICBBTkQgICAgICByMTAscjEyLHIxMCxMU1IgIzUKLSAgICBBTkQgICAgICByNSxyMTIscjUsTFNSICM1Ci0gICAgQU5EICAgICAgcjQscjEyLHI0LExTUiAjNQotICAgIE9SUiAgICAgIHIxMSxyMTAscjExLExTTCAjOAotICAgIE9SUiAgICAgIHIxMCxyNCxyNSxMU0wgIzgKLSAgICBQS0hCVCAgICByNCxyMTAscjExLExTTCAjMTYKLSAgICBTVUJTICAgICBscixsciwjMQotICAgIFNUUiAgICAgIHI0LFtyN10sIzgKLSAgICBQS0hUQiAgICByNSxyMTEscjEwLEFTUiAjMTYKLSAgICBTVFIgICAgICByNSxbcjddLCM0Ci0gICAgQkdUICAgICAgTG9vcFN0YXJ0Ci0gICAgU1VCICAgICAgcjAscjcsIzB4MTgKLSAgICBNT1YgICAgICByMSwjNAotICAgIFBPUCAgICAgIHtyNC1yNixwY30KLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YWE5MjcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCi1hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmU6Ci0gICAgUFVTSCAgICAge3I0LXIxMixscn0KLSAgICBWTEQxLjggICB7ZDAsZDF9LFtyMF0scjEKLSAgICBWTU9WLkkxNiBkMzEsIzB4MTQKLSAgICBWTU9WLkkxNiBkMzAsIzB4NQotICAgIFZFWFQuOCAgIGQ0LGQwLGQxLCMxCi0gICAgVkVYVC44ICAgZDIsZDAsZDEsIzIKLSAgICBWRVhULjggICBkMyxkMCxkMSwjMwotICAgIFZFWFQuOCAgIGQ1LGQwLGQxLCM0Ci0gICAgVkVYVC44ICAgZDEsZDAsZDEsIzUKLSAgICBWQURETC5VOCBxMSxkMixkMwotICAgIFZBRERMLlU4IHEyLGQ0LGQ1Ci0gICAgVkFEREwuVTggcTUsZDAsZDEKLSAgICBWTEQxLjggICB7ZDAsZDF9LFtyMF0scjEKLSAgICBWTUxBLkkxNiBkMTAsZDIsZDMxCi0gICAgVk1VTC5JMTYgZDgsZDQsZDMwCi0gICAgVkVYVC44ICAgZDQsZDAsZDEsIzEKLSAgICBWRVhULjggICBkMixkMCxkMSwjMgotICAgIFZFWFQuOCAgIGQzLGQwLGQxLCMzCi0gICAgVkVYVC44ICAgZDUsZDAsZDEsIzQKLSAgICBWRVhULjggICBkMSxkMCxkMSwjNQotICAgIFZBRERMLlU4IHExLGQyLGQzCi0gICAgVkFEREwuVTggcTIsZDQsZDUKLSAgICBWQURETC5VOCBxNixkMCxkMQotICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQotICAgIFZTVUIuSTE2IGQxMCxkMTAsZDgKLSAgICBWTUxBLkkxNiBkMTIsZDIsZDMxCi0gICAgVk1VTC5JMTYgZDgsZDQsZDMwCi0gICAgVkVYVC44ICAgZDQsZDAsZDEsIzEKLSAgICBWRVhULjggICBkMixkMCxkMSwjMgotICAgIFZFWFQuOCAgIGQzLGQwLGQxLCMzCi0gICAgVkVYVC44ICAgZDUsZDAsZDEsIzQKLSAgICBWRVhULjggICBkMSxkMCxkMSwjNQotICAgIFZBRERMLlU4IHExLGQyLGQzCi0gICAgVkFEREwuVTggcTIsZDQsZDUKLSAgICBWQURETC5VOCBxNyxkMCxkMQotICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQotICAgIFZTVUIuSTE2IGQxMixkMTIsZDgKLSAgICBWTUxBLkkxNiBkMTQsZDIsZDMxCi0gICAgVk1VTC5JMTYgZDgsZDQsZDMwCi0gICAgVkVYVC44ICAgZDQsZDAsZDEsIzEKLSAgICBWRVhULjggICBkMixkMCxkMSwjMgotICAgIFZFWFQuOCAgIGQzLGQwLGQxLCMzCi0gICAgVkVYVC44ICAgZDUsZDAsZDEsIzQKLSAgICBWRVhULjggICBkMSxkMCxkMSwjNQotICAgIFZBRERMLlU4IHExLGQyLGQzCi0gICAgVkFEREwuVTggcTIsZDQsZDUKLSAgICBWQURETC5VOCBxOCxkMCxkMQotICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQotICAgIFZTVUIuSTE2IGQxNCxkMTQsZDgKLSAgICBWTUxBLkkxNiBkMTYsZDIsZDMxCi0gICAgVk1VTC5JMTYgZDgsZDQsZDMwCi0gICAgVkVYVC44ICAgZDQsZDAsZDEsIzEKLSAgICBWRVhULjggICBkMixkMCxkMSwjMgotICAgIFZFWFQuOCAgIGQzLGQwLGQxLCMzCi0gICAgVkVYVC44ICAgZDUsZDAsZDEsIzQKLSAgICBWRVhULjggICBkMSxkMCxkMSwjNQotICAgIFZBRERMLlU4IHExLGQyLGQzCi0gICAgVkFEREwuVTggcTIsZDQsZDUKLSAgICBWQURETC5VOCBxOSxkMCxkMQotICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQotICAgIFZTVUIuSTE2IGQxNixkMTYsZDgKLSAgICBWTUxBLkkxNiBkMTgsZDIsZDMxCi0gICAgVk1VTC5JMTYgZDgsZDQsZDMwCi0gICAgVkVYVC44ICAgZDQsZDAsZDEsIzEKLSAgICBWRVhULjggICBkMixkMCxkMSwjMgotICAgIFZFWFQuOCAgIGQzLGQwLGQxLCMzCi0gICAgVkVYVC44ICAgZDUsZDAsZDEsIzQKLSAgICBWRVhULjggICBkMSxkMCxkMSwjNQotICAgIFZBRERMLlU4IHExLGQyLGQzCi0gICAgVkFEREwuVTggcTIsZDQsZDUKLSAgICBWQURETC5VOCBxMTAsZDAsZDEKLSAgICBWTEQxLjggICB7ZDAsZDF9LFtyMF0scjEKLSAgICBWU1VCLkkxNiBkMTgsZDE4LGQ4Ci0gICAgVk1MQS5JMTYgZDIwLGQyLGQzMQotICAgIFZNVUwuSTE2IGQ4LGQ0LGQzMAotICAgIFZFWFQuOCAgIGQ0LGQwLGQxLCMxCi0gICAgVkVYVC44ICAgZDIsZDAsZDEsIzIKLSAgICBWRVhULjggICBkMyxkMCxkMSwjMwotICAgIFZFWFQuOCAgIGQ1LGQwLGQxLCM0Ci0gICAgVkVYVC44ICAgZDEsZDAsZDEsIzUKLSAgICBWQURETC5VOCBxMSxkMixkMwotICAgIFZBRERMLlU4IHEyLGQ0LGQ1Ci0gICAgVkFEREwuVTggcTExLGQwLGQxCi0gICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCi0gICAgVlNVQi5JMTYgZDIwLGQyMCxkOAotICAgIFZNTEEuSTE2IGQyMixkMixkMzEKLSAgICBWTVVMLkkxNiBkOCxkNCxkMzAKLSAgICBWRVhULjggICBkNCxkMCxkMSwjMQotICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCi0gICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKLSAgICBWRVhULjggICBkNSxkMCxkMSwjNAotICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1Ci0gICAgVkFEREwuVTggcTEsZDIsZDMKLSAgICBWQURETC5VOCBxMixkNCxkNQotICAgIFZBRERMLlU4IHExMixkMCxkMQotICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQotICAgIFZTVUIuSTE2IGQyMixkMjIsZDgKLSAgICBWTUxBLkkxNiBkMjQsZDIsZDMxCi0gICAgVk1VTC5JMTYgZDgsZDQsZDMwCi0gICAgVkVYVC44ICAgZDQsZDAsZDEsIzEKLSAgICBWRVhULjggICBkMixkMCxkMSwjMgotICAgIFZFWFQuOCAgIGQzLGQwLGQxLCMzCi0gICAgVkVYVC44ICAgZDUsZDAsZDEsIzQKLSAgICBWRVhULjggICBkMSxkMCxkMSwjNQotICAgIFZBRERMLlU4IHExLGQyLGQzCi0gICAgVkFEREwuVTggcTIsZDQsZDUKLSAgICBWQURETC5VOCBxMTMsZDAsZDEKLSAgICBWU1VCLkkxNiBkMjQsZDI0LGQ4Ci0gICAgVk1MQS5JMTYgZDI2LGQyLGQzMQotICAgIFZNVUwuSTE2IGQ4LGQ0LGQzMAotICAgIFZNT1YuSTMyIHExNSwjMHgxNAotICAgIFZNT1YuSTMyIHExNCwjMHg1Ci0gICAgVkFEREwuUzE2IHE1LGQxMCxkMjAKLSAgICBWQURETC5TMTYgcTEsZDE0LGQxNgotICAgIFZBRERMLlMxNiBxMCxkMTIsZDE4Ci0gICAgVlNVQi5JMTYgZDI2LGQyNixkOAotICAgIFZNTEEuSTMyIHE1LHExLHExNQotICAgIFZNVUwuSTMyIHE0LHEwLHExNAotICAgIFZBRERMLlMxNiBxNixkMTIsZDIyCi0gICAgVkFEREwuUzE2IHExLGQxNixkMTgKLSAgICBWQURETC5TMTYgcTAsZDE0LGQyMAotICAgIFZNTEEuSTMyIHE2LHExLHExNQotICAgIFZTVUIuSTMyIHE1LHE1LHE0Ci0gICAgVk1VTC5JMzIgcTQscTAscTE0Ci0gICAgVkFEREwuUzE2IHEyLGQxNCxkMjQKLSAgICBWQURETC5TMTYgcTEsZDE4LGQyMAotICAgIFZBRERMLlMxNiBxMCxkMTYsZDIyCi0gICAgVk1MQS5JMzIgcTIscTEscTE1Ci0gICAgVlNVQi5JMzIgcTYscTYscTQKLSAgICBWTVVMLkkzMiBxNCxxMCxxMTQKLSAgICBWQURETC5TMTYgcTMsZDE2LGQyNgotICAgIFZBRERMLlMxNiBxMSxkMjAsZDIyCi0gICAgVkFEREwuUzE2IHEwLGQxOCxkMjQKLSAgICBWTUxBLkkzMiBxMyxxMSxxMTUKLSAgICBWU1VCLkkzMiBxMixxMixxNAotICAgIFZNTFMuSTMyIHEzLHEwLHExNAotICAgIFZRUlNIUlVOLlMzMiBkMCxxNSwjMTAKLSAgICBWUVJTSFJVTi5TMzIgZDIscTYsIzEwCi0gICAgVlFSU0hSVU4uUzMyIGQ0LHEyLCMxMAotICAgIFZRUlNIUlVOLlMzMiBkNixxMywjMTAKLSAgICBWUU1PVk4uVTE2IGQwLHEwCi0gICAgVlFNT1ZOLlUxNiBkMixxMQotICAgIFZRTU9WTi5VMTYgZDQscTIKLSAgICBWUU1PVk4uVTE2IGQ2LHEzCi0gICAgUE9QICAgICAge3I0LXIxMixwY30KLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZjdmMWMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCi1hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmU6Ci0gICAgUFVTSCAgICAge3I0LXIxMixscn0KLSAgICBWTEQxLjggICB7ZDAsZDF9LFtyMF0scjEKLSAgICBBREQgICAgICByMTIscjAscjEsTFNMICMyCi0gICAgVk1PVi5JOCAgZDMwLCMweDUKLSAgICBWTU9WLkk4ICBkMzEsIzB4MTQKLSAgICBWTEQxLjggICB7ZDEwLGQxMX0sW3IxMl0scjEKLSAgICBWTEQxLjggICB7ZDIsZDN9LFtyMF0scjEKLSAgICBWTEQxLjggICB7ZDEyLGQxM30sW3IxMl0scjEKLSAgICBWQURETC5VOCBxOSxkMCxkMTAKLSAgICBWTEQxLjggICB7ZDQsZDV9LFtyMF0scjEKLSAgICBWQURETC5VOCBxMCxkMSxkMTEKLSAgICBWTEQxLjggICB7ZDYsZDd9LFtyMF0scjEKLSAgICBWQURETC5VOCBxMTAsZDIsZDEyCi0gICAgVkxEMS44ICAge2Q4LGQ5fSxbcjBdLHIxCi0gICAgVk1MQUwuVTggcTksZDQsZDMxCi0gICAgVkxEMS44ICAge2QxNCxkMTV9LFtyMTJdLHIxCi0gICAgVk1MQUwuVTggcTAsZDUsZDMxCi0gICAgVkxEMS44ICAge2QxNixkMTd9LFtyMTJdLHIxCi0gICAgVk1MQUwuVTggcTksZDYsZDMxCi0gICAgVk1MQUwuVTggcTEwLGQ2LGQzMQotICAgIFZNTFNMLlU4IHEwLGQzLGQzMAotICAgIFZBRERMLlU4IHExMSxkNCxkMTQKLSAgICBWTUxTTC5VOCBxOSxkMixkMzAKLSAgICBWQURETC5VOCBxMSxkMyxkMTMKLSAgICBWTUxBTC5VOCBxMCxkNyxkMzEKLSAgICBWTUxBTC5VOCBxMTAsZDgsZDMxCi0gICAgVk1MU0wuVTggcTksZDgsZDMwCi0gICAgVk1MQUwuVTggcTEsZDcsZDMxCi0gICAgVk1MU0wuVTggcTAsZDksZDMwCi0gICAgVk1MQUwuVTggcTExLGQ4LGQzMQotICAgIFZNTFNMLlU4IHExMCxkNCxkMzAKLSAgICBWTUxTTC5VOCBxMSxkNSxkMzAKLSAgICBWQURETC5VOCBxMixkNSxkMTUKLSAgICBWTUxBTC5VOCBxMTEsZDEwLGQzMQotICAgIFZNTFNMLlU4IHExMCxkMTAsZDMwCi0gICAgVk1MQUwuVTggcTEsZDksZDMxCi0gICAgVk1MQUwuVTggcTIsZDksZDMxCi0gICAgVkFEREwuVTggcTEyLGQ2LGQxNgotICAgIFZNTFNMLlU4IHExMSxkNixkMzAKLSAgICBWTUxTTC5VOCBxMSxkMTEsZDMwCi0gICAgVk1MU0wuVTggcTIsZDcsZDMwCi0gICAgVkFEREwuVTggcTMsZDcsZDE3Ci0gICAgVk1MQUwuVTggcTEyLGQxMCxkMzEKLSAgICBWTUxTTC5VOCBxMTEsZDEyLGQzMAotICAgIFZNTFNMLlU4IHEyLGQxMyxkMzAKLSAgICBWTUxBTC5VOCBxMyxkMTEsZDMxCi0gICAgVk1MQUwuVTggcTEyLGQxMixkMzEKLSAgICBWRVhULjggICBkMjYsZDE4LGQxOSwjMgotICAgIFZNTEFMLlU4IHEyLGQxMSxkMzEKLSAgICBWTUxBTC5VOCBxMyxkMTMsZDMxCi0gICAgVk1MU0wuVTggcTEyLGQ4LGQzMAotICAgIFZFWFQuOCAgIGQyNyxkMTgsZDE5LCM0Ci0gICAgVk1PVi5JMTYgZDMxLCMweDE0Ci0gICAgVk1MU0wuVTggcTMsZDksZDMwCi0gICAgVk1MU0wuVTggcTEyLGQxNCxkMzAKLSAgICBWRVhULjggICBkMjksZDE5LGQwLCMyCi0gICAgVkVYVC44ICAgZDI4LGQxOCxkMTksIzYKLSAgICBWTUxTTC5VOCBxMyxkMTUsZDMwCi0gICAgVkFEREwuUzE2IHEwLGQxOCxkMjkKLSAgICBWQURELkkxNiBkMjcsZDI3LGQyOAotICAgIFZNT1YuSTE2IGQzMCwjMHg1Ci0gICAgVkFERC5JMTYgZDI2LGQyNixkMTkKLSAgICBWTUxBTC5TMTYgcTAsZDI3LGQzMQotICAgIFZFWFQuOCAgIGQyNyxkMjAsZDIxLCM0Ci0gICAgVkVYVC44ICAgZDI4LGQyMCxkMjEsIzYKLSAgICBWRVhULjggICBkMjksZDIxLGQyLCMyCi0gICAgVk1MU0wuUzE2IHEwLGQyNixkMzAKLSAgICBWRVhULjggICBkMjYsZDIwLGQyMSwjMgotICAgIFZBRERMLlMxNiBxMSxkMjAsZDI5Ci0gICAgVkFERC5JMTYgZDI3LGQyNyxkMjgKLSAgICBWQURELkkxNiBkMjYsZDI2LGQyMQotICAgIFZFWFQuOCAgIGQyOCxkMjIsZDIzLCM2Ci0gICAgVk1MQUwuUzE2IHExLGQyNyxkMzEKLSAgICBWRVhULjggICBkMjksZDIzLGQ0LCMyCi0gICAgVkVYVC44ICAgZDI3LGQyMixkMjMsIzQKLSAgICBWRVhULjggICBkOCxkMjIsZDIzLCMyCi0gICAgVkFEREwuUzE2IHEyLGQyMixkMjkKLSAgICBWTUxTTC5TMTYgcTEsZDI2LGQzMAotICAgIFZBREQuSTE2IGQyNyxkMjcsZDI4Ci0gICAgVkFERC5JMTYgZDI2LGQ4LGQyMwotICAgIFZFWFQuOCAgIGQyOCxkMjQsZDI1LCM2Ci0gICAgVk1MQUwuUzE2IHEyLGQyNyxkMzEKLSAgICBWRVhULjggICBkMjcsZDI0LGQyNSwjNAotICAgIFZFWFQuOCAgIGQyOSxkMjUsZDYsIzIKLSAgICBWQURELkkxNiBkMjcsZDI3LGQyOAotICAgIFZFWFQuOCAgIGQ4LGQyNCxkMjUsIzIKLSAgICBWQURETC5TMTYgcTMsZDI0LGQyOQotICAgIFZNTFNMLlMxNiBxMixkMjYsZDMwCi0gICAgVk1MQUwuUzE2IHEzLGQyNyxkMzEKLSAgICBWQURELkkxNiBkOCxkOCxkMjUKLSAgICBWTUxTTC5TMTYgcTMsZDgsZDMwCi0gICAgVlFSU0hSVU4uUzMyIGQwLHEwLCMxMAotICAgIFZRUlNIUlVOLlMzMiBkMixxMSwjMTAKLSAgICBWUVJTSFJVTi5TMzIgZDQscTIsIzEwCi0gICAgVlFSU0hSVU4uUzMyIGQ2LHEzLCMxMAotICAgIFZRTU9WTi5VMTYgZDAscTAKLSAgICBWUU1PVk4uVTE2IGQyLHExCi0gICAgVlFNT1ZOLlUxNiBkNCxxMgotICAgIFZRTU9WTi5VMTYgZDYscTMKLSAgICBQT1AgICAgICB7cjQtcjEyLHBjfQotCi0gICAgLmVuZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5M2QzODUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0KLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCi1hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZToKLSAgICBQVVNIICAgICB7cjQtcjEyLGxyfQotICAgIFZMRDEuOCAgIHtkMjIsZDIzfSxbcjBdLHIxCi0gICAgVkVYVC44ICAgZDEwLGQyMixkMjMsIzUKLSAgICBWRVhULjggICBkMTIsZDIyLGQyMywjMQotICAgIFZFWFQuOCAgIGQxNCxkMjIsZDIzLCMyCi0gICAgVkVYVC44ICAgZDE1LGQyMixkMjMsIzMKLSAgICBWRVhULjggICBkMTMsZDIyLGQyMywjNAotICAgIFZBRERMLlU4IHExMSxkMjIsZDEwCi0gICAgVkFEREwuVTggcTQsZDE0LGQxNQotICAgIFZBRERMLlU4IHE2LGQxMixkMTMKLSAgICBWTEQxLjggICB7ZDI0LGQyNX0sW3IwXSxyMQotICAgIFZNTEEuSTE2IGQyMixkOCxkMzEKLSAgICBWTVVMLkkxNiBkOCxkMTIsZDMwCi0gICAgVkVYVC44ICAgZDEwLGQyNCxkMjUsIzUKLSAgICBWRVhULjggICBkMTIsZDI0LGQyNSwjMQotICAgIFZFWFQuOCAgIGQxNixkMjQsZDI1LCMyCi0gICAgVkVYVC44ICAgZDE3LGQyNCxkMjUsIzMKLSAgICBWRVhULjggICBkMTMsZDI0LGQyNSwjNAotICAgIFZBRERMLlU4IHExMixkMjQsZDEwCi0gICAgVlNVQi5JMTYgZDIyLGQyMixkOAotICAgIFZBRERMLlU4IHE0LGQxNixkMTcKLSAgICBWQURETC5VOCBxNixkMTIsZDEzCi0gICAgVkxEMS44ICAge2QyNixkMjd9LFtyMF0scjEKLSAgICBWTUxBLkkxNiBkMjQsZDgsZDMxCi0gICAgVk1VTC5JMTYgZDgsZDEyLGQzMAotICAgIFZFWFQuOCAgIGQxMCxkMjYsZDI3LCM1Ci0gICAgVkVYVC44ICAgZDEyLGQyNixkMjcsIzEKLSAgICBWRVhULjggICBkMTgsZDI2LGQyNywjMgotICAgIFZFWFQuOCAgIGQxOSxkMjYsZDI3LCMzCi0gICAgVkVYVC44ICAgZDEzLGQyNixkMjcsIzQKLSAgICBWQURETC5VOCBxMTMsZDI2LGQxMAotICAgIFZTVUIuSTE2IGQyNCxkMjQsZDgKLSAgICBWQURETC5VOCBxNCxkMTgsZDE5Ci0gICAgVkFEREwuVTggcTYsZDEyLGQxMwotICAgIFZMRDEuOCAgIHtkMjgsZDI5fSxbcjBdLHIxCi0gICAgVk1MQS5JMTYgZDI2LGQ4LGQzMQotICAgIFZNVUwuSTE2IGQ4LGQxMixkMzAKLSAgICBWRVhULjggICBkMTAsZDI4LGQyOSwjNQotICAgIFZFWFQuOCAgIGQxMixkMjgsZDI5LCMxCi0gICAgVkVYVC44ICAgZDIwLGQyOCxkMjksIzIKLSAgICBWRVhULjggICBkMjEsZDI4LGQyOSwjMwotICAgIFZFWFQuOCAgIGQxMyxkMjgsZDI5LCM0Ci0gICAgVkFEREwuVTggcTE0LGQyOCxkMTAKLSAgICBWU1VCLkkxNiBkMjYsZDI2LGQ4Ci0gICAgVkFEREwuVTggcTQsZDIwLGQyMQotICAgIFZBRERMLlU4IHE2LGQxMixkMTMKLSAgICBWTUxBLkkxNiBkMjgsZDgsZDMxCi0gICAgVk1MUy5JMTYgZDI4LGQxMixkMzAKLSAgICBWUVJTSFJVTi5TMTYgZDIyLHExMSwjNQotICAgIFZRUlNIUlVOLlMxNiBkMjQscTEyLCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQyNixxMTMsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDI4LHExNCwjNQotICAgIFBPUCAgICAgIHtyNC1yMTIscGN9Ci0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk4ZTdiNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKLWFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlOgotICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9Ci0gICAgVkxEMS44ICAge2Q3fSxbcjBdLHIxCi0gICAgQUREICAgICAgcjEyLHIwLHIxLExTTCAjMgotICAgIFZMRDEuOCAgIHtkOH0sW3IwXSxyMQotICAgIFZMRDEuOCAgIHtkMTJ9LFtyMTJdLHIxCi0gICAgVkxEMS44ICAge2Q5fSxbcjBdLHIxCi0gICAgVkFEREwuVTggcTAsZDcsZDEyCi0gICAgVkxEMS44ICAge2QxMH0sW3IwXSxyMQotICAgIFZMRDEuOCAgIHtkMTN9LFtyMTJdLHIxCi0gICAgVkxEMS44ICAge2QxMX0sW3IwXSxyMQotICAgIFZMRDEuOCAgIHtkMTR9LFtyMTJdLHIxCi0gICAgVkFEREwuVTggcTgsZDgsZDExCi0gICAgVkFEREwuVTggcTksZDksZDEwCi0gICAgVkxEMS44ICAge2QxNX0sW3IxMl0scjEKLSAgICBWTUxTLkkxNiBkMCxkMTYsZDMwCi0gICAgVk1VTC5JMTYgZDIwLGQxOCxkMzEKLSAgICBWQURETC5VOCBxOCxkOSxkMTIKLSAgICBWQURETC5VOCBxOSxkMTAsZDExCi0gICAgVkFEREwuVTggcTEsZDgsZDEzCi0gICAgVk1MUy5JMTYgZDIsZDE2LGQzMAotICAgIFZNVUwuSTE2IGQyMSxkMTgsZDMxCi0gICAgVkFEREwuVTggcTgsZDEwLGQxMwotICAgIFZBRERMLlU4IHE5LGQxMSxkMTIKLSAgICBWQURETC5VOCBxMixkOSxkMTQKLSAgICBWTUxTLkkxNiBkNCxkMTYsZDMwCi0gICAgVk1VTC5JMTYgZDIyLGQxOCxkMzEKLSAgICBWQURETC5VOCBxOCxkMTEsZDE0Ci0gICAgVkFEREwuVTggcTMsZDEwLGQxNQotICAgIFZBRERMLlU4IHE5LGQxMixkMTMKLSAgICBWTUxTLkkxNiBkNixkMTYsZDMwCi0gICAgVkFERC5JMTYgZDAsZDAsZDIwCi0gICAgVkFERC5JMTYgZDIsZDIsZDIxCi0gICAgVkFERC5JMTYgZDQsZDQsZDIyCi0gICAgVk1MQS5JMTYgZDYsZDE4LGQzMQotICAgIFZRUlNIUlVOLlMxNiBkMCxxMCwjNQotICAgIFZRUlNIUlVOLlMxNiBkMixxMSwjNQotICAgIFZRUlNIUlVOLlMxNiBkNCxxMiwjNQotICAgIFZRUlNIUlVOLlMxNiBkNixxMywjNQotICAgIFBPUCAgICAgIHtyNC1yMTIscGN9Ci0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ2OTUxNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotCi0gICAgLnRleHQKLSAgICAuYWxpZ24gNAotCi1hcm1WQ000UDEwX1dpZHRoQnJhbmNoVGFibGVNVklzTm90WmVybzoKLSAgICAud29yZCAgIFdpZHRoSXMyTVZJc05vdFplcm8tKFAwKzgpLCBXaWR0aElzMk1WSXNOb3RaZXJvLShQMCs4KQotICAgIC53b3JkICAgV2lkdGhJczRNVklzTm90WmVyby0oUDArOCksIFdpZHRoSXM0TVZJc05vdFplcm8tKFAwKzgpCi0gICAgLndvcmQgICBXaWR0aElzOE1WSXNOb3RaZXJvLShQMCs4KQotCi1hcm1WQ000UDEwX1dpZHRoQnJhbmNoVGFibGVNVklzWmVybzoKLSAgICAud29yZCAgIFdpZHRoSXMyTVZJc1plcm8tKFAwKzgpLCBXaWR0aElzMk1WSXNaZXJvLShQMCs4KQotICAgIC53b3JkICAgV2lkdGhJczRNVklzWmVyby0oUDArOCksIFdpZHRoSXM0TVZJc1plcm8tKFAwKzgpCi0gICAgLndvcmQgICBXaWR0aElzOE1WSXNaZXJvLShQMCs4KQotCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYQotYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWE6Ci0gICAgUFVTSCAgICAge3I0LXIxMixscn0KLSAgICBWUFVTSCAgICB7ZDgtZDE1fQotICAgIExEUkQgICAgIHI2LHI3LFtzcCwjMHg3MF0KLSAgICBMRFJEICAgICByNCxyNSxbc3AsIzB4NjhdCi0gICAgUlNCICAgICAgcjgscjYsIzgKLSAgICBSU0IgICAgICByOSxyNywjOAotICAgIENNTiAgICAgIHI2LHI3Ci0gICAgTU9WICAgICAgcjEwLCMxCi0gICAgQURSRVEgICAgcjExLCBhcm1WQ000UDEwX1dpZHRoQnJhbmNoVGFibGVNVklzWmVybwotICAgIFNVQiAgICAgIGxyLHIxLHIxMAotICAgIEFEUk5FICAgIHIxMSwgYXJtVkNNNFAxMF9XaWR0aEJyYW5jaFRhYmxlTVZJc05vdFplcm8KLSAgICBWTEQxLjggICB7ZDB9LFtyMF0scjEwCi0gICAgU01VTEJCICAgcjEyLHI4LHI5Ci0gICAgU01VTEJCICAgcjkscjYscjkKLSAgICBWTEQxLjggICB7ZDF9LFtyMF0sbHIKLSAgICBTTVVMQkIgICByOCxyOCxyNwotICAgIFNNVUxCQiAgIHI2LHI2LHI3Ci0gICAgVkRVUC44ICAgZDEyLHIxMgotICAgIFZEVVAuOCAgIGQxMyxyOQotICAgIFZEVVAuOCAgIGQxNCxyOAotICAgIFZEVVAuOCAgIGQxNSxyNgotICAgIExEUiAgICAgIHIxMSxbcjExLCByNCwgbHNsICMxXQotUDA6IEFERCAgICAgIHBjLHIxMQotCi1XaWR0aElzOE1WSXNOb3RaZXJvOgotICAgIFZMRDEuOCAgIHtkMn0sW3IwXSxyMTAKLSAgICBWTVVMTC5VOCBxMixkMCxkMTIKLSAgICBWTEQxLjggICB7ZDN9LFtyMF0sbHIKLSAgICBWTVVMTC5VOCBxMyxkMixkMTIKLSAgICBWTEQxLjggICB7ZDE2fSxbcjBdLHIxMAotICAgIFZNTEFMLlU4IHEyLGQxLGQxMwotICAgIFZMRDEuOCAgIHtkMTd9LFtyMF0sbHIKLSAgICBWTVVMTC5VOCBxMTEsZDE2LGQxMgotICAgIFZNTEFMLlU4IHEzLGQzLGQxMwotICAgIFZMRDEuOCAgIHtkMTh9LFtyMF0scjEwCi0gICAgVk1MQUwuVTggcTIsZDIsZDE0Ci0gICAgVk1MQUwuVTggcTExLGQxNyxkMTMKLSAgICBWTVVMTC5VOCBxMTIsZDE4LGQxMgotICAgIFZMRDEuOCAgIHtkMTl9LFtyMF0sbHIKLSAgICBWTUxBTC5VOCBxMyxkMTYsZDE0Ci0gICAgVkxEMS44ICAge2QwfSxbcjBdLHIxMAotICAgIFZNTEFMLlU4IHExMixkMTksZDEzCi0gICAgVk1MQUwuVTggcTExLGQxOCxkMTQKLSAgICBWTUxBTC5VOCBxMixkMyxkMTUKLSAgICBWTEQxLjggICB7ZDF9LFtyMF0sbHIKLSAgICBWTUxBTC5VOCBxMTIsZDAsZDE0Ci0gICAgVk1MQUwuVTggcTMsZDE3LGQxNQotICAgIFZNTEFMLlU4IHExMSxkMTksZDE1Ci0gICAgU1VCUyAgICAgcjUscjUsIzQKLSAgICBWTUxBTC5VOCBxMTIsZDEsZDE1Ci0gICAgVlFSU0hSTi5VMTYgZDgscTIsIzYKLSAgICBWUVJTSFJOLlUxNiBkOSxxMywjNgotICAgIFZRUlNIUk4uVTE2IGQyMCxxMTEsIzYKLSAgICBWU1QxLjY0ICB7ZDh9LFtyMl0scjMKLSAgICBWUVJTSFJOLlUxNiBkMjEscTEyLCM2Ci0gICAgVlNUMS42NCAge2Q5fSxbcjJdLHIzCi0gICAgVlNUMS42NCAge2QyMH0sW3IyXSxyMwotICAgIFZTVDEuNjQgIHtkMjF9LFtyMl0scjMKLSAgICBCR1QgICAgICBXaWR0aElzOE1WSXNOb3RaZXJvCi0gICAgTU9WICAgICAgcjAsIzAKLSAgICBWUE9QICAgICB7ZDgtZDE1fQotICAgIFBPUCAgICAgIHtyNC1yMTIscGN9Ci0KLVdpZHRoSXM0TVZJc05vdFplcm86Ci0gICAgVkxEMS44ICAge2QyfSxbcjBdLHIxMAotICAgIFZNVUxMLlU4IHEyLGQwLGQxMgotICAgIFZNVUxMLlU4IHEzLGQyLGQxMgotICAgIFZMRDEuOCAgIHtkM30sW3IwXSxscgotICAgIFZNTEFMLlU4IHEyLGQxLGQxMwotICAgIFZNTEFMLlU4IHEzLGQzLGQxMwotICAgIFZMRDEuOCAgIHtkMH0sW3IwXSxyMTAKLSAgICBWTUxBTC5VOCBxMixkMixkMTQKLSAgICBWTUxBTC5VOCBxMyxkMCxkMTQKLSAgICBWTEQxLjggICB7ZDF9LFtyMF0sbHIKLSAgICBTVUJTICAgICByNSxyNSwjMgotICAgIFZNTEFMLlU4IHEzLGQxLGQxNQotICAgIFZNTEFMLlU4IHEyLGQzLGQxNQotICAgIFZRUlNIUk4uVTE2IGQ5LHEzLCM2Ci0gICAgVlFSU0hSTi5VMTYgZDgscTIsIzYKLSAgICBWU1QxLjMyICB7ZDhbMF19LFtyMl0scjMKLSAgICBWU1QxLjMyICB7ZDlbMF19LFtyMl0scjMKLSAgICBCR1QgICAgICBXaWR0aElzNE1WSXNOb3RaZXJvCi0gICAgTU9WICAgICAgcjAsIzAKLSAgICBWUE9QICAgICB7ZDgtZDE1fQotICAgIFBPUCAgICAgIHtyNC1yMTIscGN9Ci0KLVdpZHRoSXMyTVZJc05vdFplcm86Ci0gICAgVkxEMS44ICAge2QyfSxbcjBdLHIxMAotICAgIFZNVUxMLlU4IHEyLGQwLGQxMgotICAgIFZNVUxMLlU4IHEzLGQyLGQxMgotICAgIFZMRDEuOCAgIHtkM30sW3IwXSxscgotICAgIFZNTEFMLlU4IHEyLGQxLGQxMwotICAgIFZNTEFMLlU4IHEzLGQzLGQxMwotICAgIFZMRDEuOCAgIHtkMH0sW3IwXSxyMTAKLSAgICBWTUxBTC5VOCBxMixkMixkMTQKLSAgICBWTUxBTC5VOCBxMyxkMCxkMTQKLSAgICBWTEQxLjggICB7ZDF9LFtyMF0sbHIKLSAgICBTVUJTICAgICByNSxyNSwjMgotICAgIFZNTEFMLlU4IHEzLGQxLGQxNQotICAgIFZNTEFMLlU4IHEyLGQzLGQxNQotICAgIFZRUlNIUk4uVTE2IGQ5LHEzLCM2Ci0gICAgVlFSU0hSTi5VMTYgZDgscTIsIzYKLSAgICBWU1QxLjE2ICB7ZDhbMF19LFtyMl0scjMKLSAgICBWU1QxLjE2ICB7ZDlbMF19LFtyMl0scjMKLSAgICBCR1QgICAgICBXaWR0aElzMk1WSXNOb3RaZXJvCi0gICAgTU9WICAgICAgcjAsIzAKLSAgICBWUE9QICAgICB7ZDgtZDE1fQotICAgIFBPUCAgICAgIHtyNC1yMTIscGN9Ci0KLVdpZHRoSXM4TVZJc1plcm86Ci0gICAgU1VCICAgICAgcjAscjAscjEKLVdpZHRoSXM4TG9vcE1WSXNaZXJvOgotICAgIFZMRDEuOCAgIHtkMH0sW3IwXSxyMQotICAgIFNVQlMgICAgIHI1LHI1LCMyCi0gICAgVkxEMS44ICAge2QxfSxbcjBdLHIxCi0gICAgVlNUMS42NCAge2QwfSxbcjJdLHIzCi0gICAgVlNUMS42NCAge2QxfSxbcjJdLHIzCi0gICAgQkdUICAgICAgV2lkdGhJczhMb29wTVZJc1plcm8KLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQT1AgICAgIHtkOC1kMTV9Ci0gICAgUE9QICAgICAge3I0LXIxMixwY30KLQotV2lkdGhJczRNVklzWmVybzoKLSAgICBWTEQxLjggICB7ZDF9LFtyMF0scjEKLSAgICBTVUJTICAgICByNSxyNSwjMgotICAgIFZTVDEuMzIgIHtkMFswXX0sW3IyXSxyMwotICAgIFZMRDEuOCAgIHtkMH0sW3IwXSxyMQotICAgIFZTVDEuMzIgIHtkMVswXX0sW3IyXSxyMwotICAgIEJHVCAgICAgIFdpZHRoSXM0TVZJc1plcm8KLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQT1AgICAgIHtkOC1kMTV9Ci0gICAgUE9QICAgICAge3I0LXIxMixwY30KLQotV2lkdGhJczJNVklzWmVybzoKLSAgICBWTEQxLjggICB7ZDF9LFtyMF0scjEKLSAgICBTVUJTICAgICByNSxyNSwjMgotICAgIFZTVDEuMTYgIHtkMFswXX0sW3IyXSxyMwotICAgIFZMRDEuOCAgIHtkMH0sW3IwXSxyMQotICAgIFZTVDEuMTYgIHtkMVswXX0sW3IyXSxyMwotICAgIEJHVCAgICAgIFdpZHRoSXMyTVZJc1plcm8KLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQT1AgICAgIHtkOC1kMTV9Ci0gICAgUE9QICAgICAge3I0LXIxMixwY30KLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRlNjAxMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnNlY3Rpb24gLnJvZGF0YQotICAgIC5hbGlnbiA0Ci0KLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfTUZNYXRyaXhRUE1vZFRhYmxlCi0gICAgLmdsb2JhbCBhcm1WQ000UDEwX1FQRGl2SW50cmFUYWJsZQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9RUERpdlBsdXNPbmVUYWJsZQotCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zICgxIDw8IFFiaXRzUGx1c09uZSkgLyAzIFZhbHVlcyAoSW50cmEgY2FzZSkgLAotOy8vIGZvciB2YWx1ZXMgb2YgaVFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLWFybVZDTTRQMTBfUVBEaXZJbnRyYVRhYmxlOgotICAgIC53b3JkIDIxODQ1LCAyMTg0NSwgMjE4NDUsIDIxODQ1LCAyMTg0NSwgMjE4NDUKLSAgICAud29yZCA0MzY5MCwgNDM2OTAsIDQzNjkwLCA0MzY5MCwgNDM2OTAsIDQzNjkwCi0gICAgLndvcmQgODczODEsIDg3MzgxLCA4NzM4MSwgODczODEsIDg3MzgxLCA4NzM4MQotICAgIC53b3JkIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIKLSAgICAud29yZCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1Ci0gICAgLndvcmQgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MAotICAgIC53b3JkIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEKLSAgICAud29yZCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyCi0KLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIGFybVZDTTRQMTBfTUZNYXRyaXggW2lRUCAlIDZdWzBdIGVudGlyZXMsCi07Ly8gZm9yIHZhbHVlcyBvZiBpUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLgotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYXJtVkNNNFAxMF9NRk1hdHJpeFFQTW9kVGFibGU6Ci0gICAgLmh3b3JkIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAuaHdvcmQgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgIC5od29yZCAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgLmh3b3JkIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAuaHdvcmQgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgIC5od29yZCAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0gICAgLmh3b3JkIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKLSAgICAuaHdvcmQgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgotICAgIC5od29yZCAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCi0KLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy8vIFRoaXMgdGFibGUgY29udGFpbnMgQVJNX000UDEwX1FfT0ZGU0VUICsgMSArIChpUVAgLyA2KSB2YWx1ZXMsCi07Ly8gZm9yIHZhbHVlcyBvZiBpUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLgotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWFybVZDTTRQMTBfUVBEaXZQbHVzT25lVGFibGU6Ci0gICAgLmJ5dGUgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNgotICAgIC5ieXRlIDE3LCAxNywgMTcsIDE3LCAxNywgMTcKLSAgICAuYnl0ZSAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4Ci0gICAgLmJ5dGUgMTksIDE5LCAxOSwgMTksIDE5LCAxOQotICAgIC5ieXRlIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAKLSAgICAuYnl0ZSAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxCi0gICAgLmJ5dGUgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMgotICAgIC5ieXRlIDIzLCAyMywgMjMsIDIzLCAyMywgMjMKLSAgICAuYnl0ZSAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0Ci0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxOGJlYzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NAotYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NDoKLSAgICBWUFVTSCAgICB7ZDh9Ci0gICAgVkxENC4xNiAge2QwLGQxLGQyLGQzfSxbcjFdCi0gICAgVk1PVi5JMTYgZDQsIzAKLSAgICBWQURELkkxNiBkNSxkMCxkMgotICAgIFZTVUIuSTE2IGQ2LGQwLGQyCi0gICAgVkhBREQuUzE2IGQ3LGQxLGQ0Ci0gICAgVkhBREQuUzE2IGQ4LGQzLGQ0Ci0gICAgVlNVQi5JMTYgZDcsZDcsZDMKLSAgICBWQURELkkxNiBkOCxkMSxkOAotICAgIFZBREQuSTE2IGQwLGQ1LGQ4Ci0gICAgVkFERC5JMTYgZDEsZDYsZDcKLSAgICBWU1VCLkkxNiBkMixkNixkNwotICAgIFZTVUIuSTE2IGQzLGQ1LGQ4Ci0gICAgVlRSTi4xNiAgZDAsZDEKLSAgICBWVFJOLjE2ICBkMixkMwotICAgIFZUUk4uMzIgIHEwLHExCi0gICAgVkFERC5JMTYgZDUsZDAsZDIKLSAgICBWU1VCLkkxNiBkNixkMCxkMgotICAgIFZIQURELlMxNiBkNyxkMSxkNAotICAgIFZIQURELlMxNiBkOCxkMyxkNAotICAgIFZTVUIuSTE2IGQ3LGQ3LGQzCi0gICAgVkFERC5JMTYgZDgsZDEsZDgKLSAgICBWQURELkkxNiBkMCxkNSxkOAotICAgIFZBREQuSTE2IGQxLGQ2LGQ3Ci0gICAgVlNVQi5JMTYgZDIsZDYsZDcKLSAgICBWU1VCLkkxNiBkMyxkNSxkOAotICAgIFZSU0hSLlMxNiBkMCxkMCwjNgotICAgIFZSU0hSLlMxNiBkMSxkMSwjNgotICAgIFZSU0hSLlMxNiBkMixkMiwjNgotICAgIFZSU0hSLlMxNiBkMyxkMywjNgotICAgIFZTVDEuMTYgIHtkMCxkMSxkMixkM30sW3IwXQotICAgIFZQT1AgICAgIHtkOH0KLSAgICBCWCAgICAgICBscgotCi0gICAgLmVuZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTdlZmNiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0gICAgLnN5bnRheCB1bmlmaWVkCi0KLSAgICAuZ2xvYmFsIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKLWFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQ6Ci0gICAgUFVTSCAgICAge3I0LXI4LGxyfQotICAgIExEUiAgICAgIHIyLFtyMCwjMF0KLSAgICBNT1YgICAgICByNywjMHgxZgotICAgIE1PViAgICAgIHI0LCMwCi0gICAgTU9WICAgICAgcjUsIzAKLSAgICBMRFJCICAgICByMyxbcjJdLCMxCi0gICAgU1RSRCAgICAgcjQscjUsW3IxLCMwXQotICAgIFNUUkQgICAgIHI0LHI1LFtyMSwjOF0KLSAgICBTVFJEICAgICByNCxyNSxbcjEsIzB4MTBdCi0gICAgU1RSRCAgICAgcjQscjUsW3IxLCMweDE4XQotdW5wYWNrTG9vcDoKLSAgICBUU1QgICAgICByMywjMHgxMAotICAgIExEUlNCTkUgIHI1LFtyMiwjMV0KLSAgICBMRFJCTkUgICByNCxbcjJdLCMyCi0gICAgQU5EICAgICAgcjYscjcscjMsTFNMICMxCi0gICAgTERSU0JFUSAgcjQsW3IyXSwjMQotICAgIE9SUk5FICAgIHI0LHI0LHI1LExTTCAjOAotICAgIFRTVCAgICAgIHIzLCMweDIwCi0gICAgTERSQkVRICAgcjMsW3IyXSwjMQotICAgIFNUUkggICAgIHI0LFtyMSxyNl0KLSAgICBCRVEgICAgICB1bnBhY2tMb29wCi0gICAgU1RSICAgICAgcjIsW3IwLCMwXQotICAgIFBPUCAgICAgIHtyNC1yOCxwY30KLSAgICAuZW5kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTk5YmRlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5TCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0KLSAgICAuZ2xvYmFsIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSQotb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JOgotICAgIFBVU0ggICAgIHtyNC1yOSxscn0KLSAgICBNT1ZTICAgICByNixyMAotICAgIFNVQiAgICAgIHNwLHNwLCMweGMKLSAgICBNT1YgICAgICByOSxyMQotICAgIE1PViAgICAgIHI3LHIyCi0gICAgTU9WICAgICAgcjgscjMKLSAgICBMRFIgICAgICByNCxbc3AsIzB4MjhdCi0gICAgTERSICAgICAgcjUsW3NwLCMweDJjXQotICAgIEJFUSAgICAgIEwweDU4Ci0gICAgVFNUICAgICAgcjYsIzcKLSAgICBUU1RFUSAgICByOSwjNwotICAgIEJORSAgICAgIEwweDU4Ci0gICAgQ01QICAgICAgcjcsIzAKLSAgICBDTVBORSAgICByOCwjMAotICAgIENNUE5FICAgIHI0LCMwCi0gICAgQkVRICAgICAgTDB4NTgKLSAgICBUU1QgICAgICByNCwjMwotICAgIEJORSAgICAgIEwweDU4Ci0gICAgQ01QICAgICAgcjUsIzAKLSAgICBCRVEgICAgICBMMHg1OAotICAgIFRTVCAgICAgIHI1LCMzCi0gICAgQkVRICAgICAgTDB4NjQKLUwweDU4OgotICAgIE1WTiAgICAgIHIwLCM0Ci1MMHg1YzoKLSAgICBBREQgICAgICBzcCxzcCwjMHhjCi0gICAgUE9QICAgICAge3I0LXI5LHBjfQotTDB4NjQ6Ci0gICAgU1RSICAgICAgcjQsW3NwLCMwXQotICAgIE1PViAgICAgIHIzLHI4Ci0gICAgU1RSICAgICAgcjUsW3NwLCM0XQotICAgIE1PViAgICAgIHIyLHI3Ci0gICAgTU9WICAgICAgcjEscjkKLSAgICBNT1YgICAgICByMCxyNgotICAgIEJMICAgICAgIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JCi0gICAgQ01QICAgICAgcjAsIzAKLSAgICBCTkUgICAgICBMMHg1YwotICAgIEFERCAgICAgIHIzLHI1LCMweDEwCi0gICAgQUREICAgICAgcjIscjQsIzB4MTAKLSAgICBTVFIgICAgICByMyxbc3AsIzRdCi0gICAgU1RSICAgICAgcjIsW3NwLCMwXQotICAgIEFERCAgICAgIHIzLHI4LCMyCi0gICAgQUREICAgICAgcjIscjcsIzIKLSAgICBNT1YgICAgICByMSxyOQotICAgIE1PViAgICAgIHIwLHI2Ci0gICAgQkwgICAgICAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kKLSAgICBBREQgICAgICBzcCxzcCwjMHhjCi0gICAgUE9QICAgICAge3I0LXI5LHBjfQotCi0gICAgLmVuZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGRfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2M1ZDhiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGRfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotCi0gICAgLmdsb2JhbCBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkCi1vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkOgotICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9Ci0gICAgVlBVU0ggICAge2Q4LWQ5fQotICAgIFNVQiAgICAgIHNwLHNwLCMweDIwCi0gICAgQUREICAgICAgcjQsc3AsIzAKLSAgICBMRFIgICAgICByNSxbc3AsIzB4NjRdCi0gICAgTU9WICAgICAgcjcscjEKLSAgICBNT1YgICAgICByOCxyMgotICAgIE1PViAgICAgIHI5LHIzCi0gICAgQ01QICAgICAgcjUsIzAKLSAgICBCRVEgICAgICBMMHgxMTQKLSAgICBNT1YgICAgICByMSxyNAotICAgIEJMICAgICAgIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQgIDsvLwotICAgIExEUiAgICAgIHIxLFtzcCwjMHg2MF0KLSAgICBMRFIgICAgICByMTEsIC5MYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCi1QMDogQUREICAgICAgcjExLCBwYwotICAgIExEUiAgICAgIHIxMCwgLkxhcm1WQ000UDEwX1FQRGl2VGFibGUKLVAxOiBBREQgICAgICByMTAsIHBjCi0gICAgTERSICAgICAgcjIsIC5MYXJtVkNNNFAxMF9WTWF0cml4VTE2Ci1QMjogQUREICAgICAgcjIsIHBjCi0gICAgTERSU0IgICAgcjEyLFtyMTEscjFdCi0gICAgTERSU0IgICAgbHIsW3IxMCxyMV0KLSAgICBMRFIgICAgICByMTAsID0weDMwMjA1MDQKLSAgICBMRFIgICAgICByMSwgPTB4NTA0MDEwMAotICAgIEFERCAgICAgIHIyLHIyLHIxMgotICAgIFZEVVAuMzIgIGQ3LHIxCi0gICAgVkRVUC4zMiAgZDkscjEwCi0gICAgVkRVUC4xNiAgZDUsbHIKLSAgICBWTEQxLjggICB7ZDZ9LFtyMl0KLSAgICBWVEJMLjggICBkOCx7ZDZ9LGQ3Ci0gICAgVlRCTC44ICAgZDQse2Q2fSxkOQotICAgIENNUCAgICAgIHI4LCMwCi0gICAgVkxEMS4xNiAge2QwLGQxLGQyLGQzfSxbcjRdCi0gICAgVlNITC5VMTYgZDgsZDgsZDUKLSAgICBWU0hMLlUxNiBkNCxkNCxkNQotICAgIEJFUSAgICAgIEwxCi0gICAgTERSU0ggICAgcjEwLFtyOCwjMF0KLUwxOgotICAgIFZNVUwuSTE2IGQwLGQwLGQ4Ci0gICAgVk1VTC5JMTYgZDEsZDEsZDQKLSAgICBWTVVMLkkxNiBkMixkMixkOAotICAgIFZNVUwuSTE2IGQzLGQzLGQ0Ci0gICAgVk1PVk5FLjE2IGQwWzBdLHIxMAotICAgIFZUUk4uMTYgIGQwLGQxCi0gICAgVlRSTi4xNiAgZDIsZDMKLSAgICBWVFJOLjMyICBxMCxxMQotICAgIFZNT1YuSTE2IGQ0LCMwCi0gICAgVkFERC5JMTYgZDUsZDAsZDIKLSAgICBWU1VCLkkxNiBkNixkMCxkMgotICAgIFZIQURELlMxNiBkNyxkMSxkNAotICAgIFZIQURELlMxNiBkOCxkMyxkNAotICAgIFZTVUIuSTE2IGQ3LGQ3LGQzCi0gICAgVkFERC5JMTYgZDgsZDEsZDgKLSAgICBWQURELkkxNiBkMCxkNSxkOAotICAgIFZBREQuSTE2IGQxLGQ2LGQ3Ci0gICAgVlNVQi5JMTYgZDIsZDYsZDcKLSAgICBWU1VCLkkxNiBkMyxkNSxkOAotICAgIFZUUk4uMTYgIGQwLGQxCi0gICAgVlRSTi4xNiAgZDIsZDMKLSAgICBWVFJOLjMyICBxMCxxMQotICAgIFZBREQuSTE2IGQ1LGQwLGQyCi0gICAgVlNVQi5JMTYgZDYsZDAsZDIKLSAgICBWSEFERC5TMTYgZDcsZDEsZDQKLSAgICBWSEFERC5TMTYgZDgsZDMsZDQKLSAgICBWU1VCLkkxNiBkNyxkNyxkMwotICAgIFZBREQuSTE2IGQ4LGQxLGQ4Ci0gICAgVkFERC5JMTYgZDAsZDUsZDgKLSAgICBWQURELkkxNiBkMSxkNixkNwotICAgIFZTVUIuSTE2IGQyLGQ2LGQ3Ci0gICAgVlNVQi5JMTYgZDMsZDUsZDgKLSAgICBWUlNIUi5TMTYgZDAsZDAsIzYKLSAgICBWUlNIUi5TMTYgZDEsZDEsIzYKLSAgICBWUlNIUi5TMTYgZDIsZDIsIzYKLSAgICBWUlNIUi5TMTYgZDMsZDMsIzYKLSAgICBCICAgICAgICBMMHgxMzAKLUwweDExNDoKLSAgICBMRFJTSCAgICByMTAsW3I4LCMwXQotICAgIEFERCAgICAgIHIxMCxyMTAsIzB4MjAKLSAgICBBU1IgICAgICByMTAscjEwLCM2Ci0gICAgVkRVUC4xNiAgZDAscjEwCi0gICAgVkRVUC4xNiAgZDEscjEwCi0gICAgVkRVUC4xNiAgZDIscjEwCi0gICAgVkRVUC4xNiAgZDMscjEwCi1MMHgxMzA6Ci0gICAgTERSICAgICAgcjEsW3NwLCMweDU4XQotICAgIExEUiAgICAgIHIxMCxbc3AsIzB4NWNdCi0gICAgTERSICAgICAgcjMsW3I3XSxyMQotICAgIExEUiAgICAgIHI1LFtyN10scjEKLSAgICBWTU9WICAgICBkNCxyMyxyNQotICAgIExEUiAgICAgIHIzLFtyN10scjEKLSAgICBMRFIgICAgICByNSxbcjcsIzBdCi0gICAgVk1PViAgICAgZDUscjMscjUKLSAgICBWQUREVy5VOCBxMyxxMCxkNAotICAgIFZBRERXLlU4IHE0LHExLGQ1Ci0gICAgVlFNT1ZVTi5TMTYgZDAscTMKLSAgICBWUU1PVlVOLlMxNiBkMSxxNAotICAgIFZTVDEuMzIgIHtkMFswXX0sW3I5XSxyMTAKLSAgICBWU1QxLjMyICB7ZDBbMV19LFtyOV0scjEwCi0gICAgVlNUMS4zMiAge2QxWzBdfSxbcjldLHIxMAotICAgIFZTVDEuMzIgIHtkMVsxXX0sW3I5XQotICAgIE1PViAgICAgIHIwLCMwCi0gICAgQUREICAgICAgc3Asc3AsIzB4MjAKLSAgICBWUE9QICAgICB7ZDgtZDl9Ci0gICAgUE9QICAgICAge3I0LXIxMixwY30KLQotLkxhcm1WQ000UDEwX1FQTW9kdWxvVGFibGU6Ci0gICAgLndvcmQgICBhcm1WQ000UDEwX1FQTW9kdWxvVGFibGUtKFAwKzgpCi0uTGFybVZDTTRQMTBfUVBEaXZUYWJsZToKLSAgICAud29yZCAgIGFybVZDTTRQMTBfUVBEaXZUYWJsZS0oUDErOCkKLS5MYXJtVkNNNFAxMF9WTWF0cml4VTE2OgotICAgIC53b3JkICAgYXJtVkNNNFAxMF9WTWF0cml4VTE2LShQMis4KQotCi0gICAgLmVuZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTgzNTE2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotCi0gICAgLmdsb2JhbCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JCi1vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JOgotICAgIFBVU0ggICAgIHtyNC1yMTAsbHJ9Ci0gICAgVlBVU0ggICAge2Q4LWQxNX0KLSAgICBWTEQxLjggICB7ZDBbXX0sW3IyXSEKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKLSAgICBTVUIgICAgICByMCxyMCxyMQotICAgIFZMRDEuOCAgIHtkMltdfSxbcjNdIQotICAgIExEUiAgICAgIHI0LFtzcCwjMHg2NF0KLSAgICBMRFIgICAgICByNSxbc3AsIzB4NjBdCi0gICAgTERSICAgICAgcjksID0weDMwMzAzMDMKLSAgICBMRFIgICAgICByOCwgPTB4NDA0MDQwNAotICAgIFZNT1YuSTggIGQxNCwjMAotICAgIFZNT1YuSTggIGQxNSwjMHgxCi0gICAgVk1PVi5JMTYgZDEsIzB4NAotICAgIE1PViAgICAgIHI3LCMweDQwMDAwMDAwCi1MMHgzODoKLSAgICBMRFIgICAgICByNixbcjRdLCM4Ci0gICAgVkxEMS44ICAge2Q2fSxbcjBdLHIxCi0gICAgVkxEMS44ICAge2Q1fSxbcjBdLHIxCi0gICAgQ01QICAgICAgcjYsIzAKLSAgICBWTEQxLjggICB7ZDR9LFtyMF0scjEKLSAgICBWTEQxLjggICB7ZDh9LFtyMF0scjEKLSAgICBWQUJELlU4ICBkMTksZDYsZDQKLSAgICBWTEQxLjggICB7ZDl9LFtyMF0scjEKLSAgICBWQUJELlU4ICBkMTMsZDQsZDgKLSAgICBWTEQxLjggICB7ZDEwfSxbcjBdLHIxCi0gICAgQkVRICAgICAgTDB4ZTQKLSAgICBWQUJELlU4ICBkMTIsZDUsZDQKLSAgICBWQUJELlU4ICBkMTgsZDksZDgKLSAgICBWQ0dULlU4ICBkMTYsZDAsZDEzCi0gICAgVk1PVi4zMiAgZDI2WzBdLHI2Ci0gICAgVk1BWC5VOCAgZDEyLGQxOCxkMTIKLSAgICBWTU9WTC5VOCBxMTMsZDI2Ci0gICAgVkFCRC5VOCAgZDE3LGQxMCxkOAotICAgIFZDR1QuUzE2IGQyNyxkMjYsIzAKLSAgICBWQ0dULlU4ICBkMTIsZDIsZDEyCi0gICAgVkNHVC5VOCAgZDE5LGQyLGQxOQotICAgIFZBTkQgICAgIGQxNixkMTYsZDI3Ci0gICAgVFNUICAgICAgcjYscjkKLSAgICBWQ0dULlU4ICBkMTcsZDIsZDE3Ci0gICAgVkFORCAgICAgZDE2LGQxNixkMTIKLSAgICBWQU5EICAgICBkMTIsZDE2LGQxNwotICAgIFZBTkQgICAgIGQxNyxkMTYsZDE5Ci0gICAgQkxORSAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlCi0gICAgVFNUICAgICAgcjYscjgKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzIKLSAgICBWVFNULjE2ICBkMjYsZDI2LGQxCi0gICAgQkxORSAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNHRTRfdW5zYWZlCi0gICAgVkJJVCAgICAgZDI5LGQxMyxkMjYKLSAgICBWQklUICAgICBkMjQsZDMxLGQyNgotICAgIFZCSUYgICAgIGQyOSxkNCxkMTYKLSAgICBWQklGICAgICBkMjQsZDgsZDE2Ci0gICAgVlNUMS44ICAge2QyOX0sW3IwXSxyMQotICAgIEFERFMgICAgIHI3LHI3LHI3Ci0gICAgVlNUMS44ICAge2QyNH0sW3IwXSxyMQotICAgIEJORSAgICAgIEwweDM4Ci0gICAgTU9WICAgICAgcjAsIzAKLSAgICBWUE9QICAgICB7ZDgtZDE1fQotICAgIFBPUCAgICAgIHtyNC1yMTAscGN9Ci1MMHhlNDoKLSAgICBWTEQxLjggICB7ZDBbXX0sW3IyXQotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQotICAgIEFERFMgICAgIHI3LHI3LHI3Ci0gICAgVkxEMS44ICAge2QyW119LFtyM10KLSAgICBBREQgICAgICByNSxyNSwjNAotICAgIEJORSAgICAgIEwweDM4Ci0gICAgTU9WICAgICAgcjAsIzAKLSAgICBWUE9QICAgICB7ZDgtZDE1fQotICAgIFBPUCAgICAgIHtyNC1yMTAscGN9Ci0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMTA5MzEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0KLSAgICAuZ2xvYmFsIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kKLW9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0k6Ci0gICAgUFVTSCAgICAge3I0LXIxMixscn0KLSAgICBWUFVTSCAgICB7ZDgtZDE1fQotICAgIFZMRDEuOCAgIHtkMFtdfSxbcjJdIQotICAgIFNVQiAgICAgIHIwLHIwLCM0Ci0gICAgVkxEMS44ICAge2QyW119LFtyM10hCi0gICAgTERSICAgICAgcjQsW3NwLCMweDZjXQotICAgIExEUiAgICAgIHI1LFtzcCwjMHg2OF0KLSAgICBMRFIgICAgICByOCwgPTB4NDA0MDQwNAotICAgIExEUiAgICAgIHI5LCA9MHgzMDMwMzAzCi0gICAgVk1PVi5JOCAgZDE0LCMwCi0gICAgVk1PVi5JOCAgZDE1LCMweDEKLSAgICBWTU9WLkkxNiBkMSwjMHg0Ci0gICAgTU9WICAgICAgcjcsIzB4NDAwMDAwMDAKLUwweDM0OgotICAgIExEUiAgICAgIHI2LFtyNF0sIzgKLSAgICBBREQgICAgICByMTAscjAscjEKLSAgICBBREQgICAgICBscixyMSxyMQotICAgIFZMRDEuOCAgIHtkN30sW3IwXSxscgotICAgIFZMRDEuOCAgIHtkOH0sW3IxMF0sbHIKLSAgICBWTEQxLjggICB7ZDV9LFtyMF0sbHIKLSAgICBWTEQxLjggICB7ZDEwfSxbcjEwXSxscgotICAgIFZMRDEuOCAgIHtkNn0sW3IwXSxscgotICAgIFZMRDEuOCAgIHtkOX0sW3IxMF0sbHIKLSAgICBWTEQxLjggICB7ZDR9LFtyMF0sbHIKLSAgICBWTEQxLjggICB7ZDExfSxbcjEwXSxscgotICAgIFZaSVAuOCAgIGQ3LGQ4Ci0gICAgVlpJUC44ICAgZDUsZDEwCi0gICAgVlpJUC44ICAgZDYsZDkKLSAgICBWWklQLjggICBkNCxkMTEKLSAgICBWWklQLjE2ICBkNyxkNQotICAgIFZaSVAuMTYgIGQ4LGQxMAotICAgIFZaSVAuMTYgIGQ2LGQ0Ci0gICAgVlpJUC4xNiAgZDksZDExCi0gICAgVlRSTi4zMiAgZDcsZDYKLSAgICBWVFJOLjMyICBkNSxkNAotICAgIFZUUk4uMzIgIGQxMCxkMTEKLSAgICBWVFJOLjMyICBkOCxkOQotICAgIENNUCAgICAgIHI2LCMwCi0gICAgVkFCRC5VOCAgZDE5LGQ2LGQ0Ci0gICAgVkFCRC5VOCAgZDEzLGQ0LGQ4Ci0gICAgQkVRICAgICAgTDB4MTcwCi0gICAgVkFCRC5VOCAgZDEyLGQ1LGQ0Ci0gICAgVkFCRC5VOCAgZDE4LGQ5LGQ4Ci0gICAgVk1PVi4zMiAgZDI2WzBdLHI2Ci0gICAgVkNHVC5VOCAgZDE2LGQwLGQxMwotICAgIFZNQVguVTggIGQxMixkMTgsZDEyCi0gICAgVk1PVkwuVTggcTEzLGQyNgotICAgIFZBQkQuVTggIGQxNyxkMTAsZDgKLSAgICBWQ0dULlMxNiBkMjcsZDI2LCMwCi0gICAgVkNHVC5VOCAgZDEyLGQyLGQxMgotICAgIFZDR1QuVTggIGQxOSxkMixkMTkKLSAgICBWQU5EICAgICBkMTYsZDE2LGQyNwotICAgIFRTVCAgICAgIHI2LHI5Ci0gICAgVkNHVC5VOCAgZDE3LGQyLGQxNwotICAgIFZBTkQgICAgIGQxNixkMTYsZDEyCi0gICAgVkFORCAgICAgZDEyLGQxNixkMTcKLSAgICBWQU5EICAgICBkMTcsZDE2LGQxOQotICAgIEJMTkUgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTTFQ0X3Vuc2FmZQotICAgIFRTVCAgICAgIHI2LHI4Ci0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMzCi0gICAgVlRTVC4xNiAgZDI2LGQyNixkMQotICAgIEJMTkUgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZQotICAgIFZCSVQgICAgIGQyOSxkMTMsZDI2Ci0gICAgVkJJVCAgICAgZDI0LGQzMSxkMjYKLSAgICBBREQgICAgICByMTAscjAsIzMKLSAgICBWQklGICAgICBkMjksZDQsZDE2Ci0gICAgQUREICAgICAgcjEyLHIxMCxyMQotICAgIEFERCAgICAgIGxyLHIxLHIxCi0gICAgVkJJRiAgICAgZDI0LGQ4LGQxNgotICAgIEFERFMgICAgIHI3LHI3LHI3Ci0gICAgVlNUMS44ICAge2QyOVswXX0sW3IxMF0sbHIKLSAgICBWU1QxLjggICB7ZDI5WzFdfSxbcjEyXSxscgotICAgIFZTVDEuOCAgIHtkMjlbMl19LFtyMTBdLGxyCi0gICAgVlNUMS44ICAge2QyOVszXX0sW3IxMl0sbHIKLSAgICBWU1QxLjggICB7ZDI5WzRdfSxbcjEwXSxscgotICAgIFZTVDEuOCAgIHtkMjlbNV19LFtyMTJdLGxyCi0gICAgVlNUMS44ICAge2QyOVs2XX0sW3IxMF0sbHIKLSAgICBWU1QxLjggICB7ZDI5WzddfSxbcjEyXSxscgotICAgIEFERCAgICAgIHIxMixyMCwjNAotICAgIEFERCAgICAgIHIxMCxyMTIscjEKLSAgICBWU1QxLjggICB7ZDI0WzBdfSxbcjEyXSxscgotICAgIFZTVDEuOCAgIHtkMjRbMV19LFtyMTBdLGxyCi0gICAgVlNUMS44ICAge2QyNFsyXX0sW3IxMl0sbHIKLSAgICBWU1QxLjggICB7ZDI0WzNdfSxbcjEwXSxscgotICAgIFZTVDEuOCAgIHtkMjRbNF19LFtyMTJdLGxyCi0gICAgVlNUMS44ICAge2QyNFs1XX0sW3IxMF0sbHIKLSAgICBWU1QxLjggICB7ZDI0WzZdfSxbcjEyXSxscgotICAgIFZTVDEuOCAgIHtkMjRbN119LFtyMTBdLGxyCi0gICAgQUREICAgICAgcjAscjAsIzQKLSAgICBCTkUgICAgICBMMHgzNAotICAgIE1PViAgICAgIHIwLCMwCi0gICAgVlBPUCAgICAge2Q4LWQxNX0KLSAgICBQT1AgICAgICB7cjQtcjEyLHBjfQotTDB4MTcwOgotICAgIFZMRDEuOCAgIHtkMFtdfSxbcjJdCi0gICAgQUREICAgICAgcjAscjAsIzQKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzMKLSAgICBBRERTICAgICByNyxyNyxyNwotICAgIFZMRDEuOCAgIHtkMltdfSxbcjNdCi0gICAgQUREICAgICAgcjUscjUsIzQKLSAgICBCTkUgICAgICBMMHgzNAotICAgIE1PViAgICAgIHIwLCMwCi0gICAgVlBPUCAgICAge2Q4LWQxNX0KLSAgICBQT1AgICAgICB7cjQtcjEyLHBjfQotCi0gICAgLmVuZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZmZhZDIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotCi0gICAgLmdsb2JhbCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSQotb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0k6Ci0gICAgUFVTSCAgICAge3I0LXIxMixscn0KLSAgICBWUFVTSCAgICB7ZDgtZDE1fQotICAgIEFERCAgICAgIHI3LHIyLCMxCi0gICAgQUREICAgICAgcjgscjMsIzEKLSAgICBWTEQxLjggICB7ZDBbXX0sW3IyXQotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMgotICAgIFZMRDEuOCAgIHtkMltdfSxbcjNdCi0gICAgTERSICAgICAgcjQsW3NwLCMweDZjXQotICAgIExEUiAgICAgIHI1LFtzcCwjMHg2OF0KLSAgICBNT1YgICAgICByMTEsIzAKLSAgICBWTU9WLkk4ICBkMTQsIzAKLSAgICBWTU9WLkk4ICBkMTUsIzB4MQotICAgIEFERCAgICAgIHIxMCxyMSxyMQotICAgIE1PViAgICAgIHI5LCMweDU1MDAwMDAwCi1MMHgzODoKLSAgICBMRFJIICAgICByMTIsW3I0XSwjMgotICAgIEFERCAgICAgIHI2LHIwLHIxCi0gICAgQ01QICAgICAgcjEyLCMwCi0gICAgQkVRICAgICAgTDB4ZTQKLSAgICBWTEQxLjggICB7ZDd9LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2Q2fSxbcjZdLHIxMAotICAgIFZMRDEuOCAgIHtkNX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDR9LFtyNl0scjEwCi0gICAgVkxEMS44ICAge2Q4fSxbcjBdLHIxMAotICAgIFZBQkQuVTggIGQxMixkNCxkNQotICAgIFZMRDEuOCAgIHtkOX0sW3I2XQotICAgIFZBQkQuVTggIGQxMyxkOCxkNAotICAgIFZMRDEuOCAgIHtkMTB9LFtyMF0scjEKLSAgICBWQUJELlU4ICBkMTgsZDksZDgKLSAgICBWQUJELlU4ICBkMTksZDYsZDQKLSAgICBWQ0dULlU4ICBkMTYsZDAsZDEzCi0gICAgVFNUICAgICAgcjEyLCMweGZmCi0gICAgVk1BWC5VOCAgZDEyLGQxOCxkMTIKLSAgICBWQUJELlU4ICBkMTcsZDEwLGQ4Ci0gICAgVk1PVkVRLjMyIGQxNlswXSxyMTEKLSAgICBUU1QgICAgICByMTIsIzB4ZmYwMAotICAgIFZDR1QuVTggIGQxOSxkMixkMTkKLSAgICBWQ0dULlU4ICBkMTIsZDIsZDEyCi0gICAgVk1PVkVRLjMyIGQxNlsxXSxyMTEKLSAgICBWQ0dULlU4ICBkMTcsZDIsZDE3Ci0gICAgVkxEMS44ICAge2QxMX0sW3IwXQotICAgIFZBTkQgICAgIGQxNixkMTYsZDEyCi0gICAgVFNUICAgICAgcjEyLCM0Ci0gICAgVkFORCAgICAgZDEyLGQxNixkMTcKLSAgICBWQU5EICAgICBkMTcsZDE2LGQxOQotICAgIEJORSAgICAgIEwweGY4Ci0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMyCi0gICAgU1VCICAgICAgcjAscjAscjEKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCi0gICAgVlNUMS44ICAge2QzMH0sW3IwXSxyMQotICAgIFZTVDEuOCAgIHtkMjl9LFtyMF0scjEKLSAgICBTVUIgICAgICByNixyMCxyMSxMU0wgIzIKLSAgICBWU1QxLjggICB7ZDI0fSxbcjBdLHIxCi0gICAgQUREUyAgICAgcjkscjkscjkKLSAgICBWU1QxLjggICB7ZDI1fSxbcjBdCi0gICAgQUREICAgICAgcjAscjYsIzgKLSAgICBCQ0MgICAgICBMMHgzOAotICAgIEIgICAgICAgIEwweDEzMAotTDB4ZTQ6Ci0gICAgQUREICAgICAgcjAscjAsIzgKLSAgICBBRERTICAgICByOSxyOSxyOQotICAgIEFERCAgICAgIHI1LHI1LCMyCi0gICAgQkNDICAgICAgTDB4MzgKLSAgICBCICAgICAgICBMMHgxMzAKLUwweGY4OgotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMgotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQotICAgIEJMICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKLSAgICBWU1QxLjggICB7ZDMxfSxbcjBdLHIxCi0gICAgVlNUMS44ICAge2QzMH0sW3IwXSxyMQotICAgIFZTVDEuOCAgIHtkMjl9LFtyMF0scjEKLSAgICBTVUIgICAgICByNixyMCxyMSxMU0wgIzIKLSAgICBWU1QxLjggICB7ZDI0fSxbcjBdLHIxCi0gICAgQUREUyAgICAgcjkscjkscjkKLSAgICBWU1QxLjggICB7ZDI1fSxbcjBdLHIxCi0gICAgQUREICAgICAgcjUscjUsIzIKLSAgICBWU1QxLjggICB7ZDI4fSxbcjBdCi0gICAgQUREICAgICAgcjAscjYsIzgKLSAgICBCQ0MgICAgICBMMHgzOAotTDB4MTMwOgotICAgIFNVQiAgICAgIHIwLHIwLCMweDEwCi0gICAgVkxEMS44ICAge2QwW119LFtyN10KLSAgICBBREQgICAgICByMCxyMCxyMSxMU0wgIzIKLSAgICBWTEQxLjggICB7ZDJbXX0sW3I4XQotICAgIEJORSAgICAgIEwweDM4Ci0gICAgTU9WICAgICAgcjAsIzAKLSAgICBWUE9QICAgICB7ZDgtZDE1fQotICAgIFBPUCAgICAgIHtyNC1yMTIscGN9Ci0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJhMzY4Mi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoKLSAqCi0gKi8KLQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQotICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQotCi0gICAgLmFybQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0KLSAgICAuZ2xvYmFsIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JCi1vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSToKLSAgICBQVVNIICAgICB7cjQtcjEyLGxyfQotICAgIFZQVVNIICAgIHtkOC1kMTV9Ci0gICAgQUREICAgICAgcjcscjIsIzEKLSAgICBBREQgICAgICByOCxyMywjMQotICAgIFZMRDEuOCAgIHtkMFtdfSxbcjJdCi0gICAgU1VCICAgICAgcjAscjAsIzQKLSAgICBWTEQxLjggICB7ZDJbXX0sW3IzXQotICAgIExEUiAgICAgIHI0LFtzcCwjMHg2Y10KLSAgICBMRFIgICAgICByNSxbc3AsIzB4NjhdCi0gICAgTU9WICAgICAgcjYsIzAKLSAgICBWTU9WLkk4ICBkMTQsIzAKLSAgICBWTU9WLkk4ICBkMTUsIzB4MQotICAgIE1PViAgICAgIHI5LCMweDExMDAwMDAwCi0gICAgQUREICAgICAgcjExLHIxLHIxCi1MMHgzODoKLSAgICBMRFJIICAgICByMTIsW3I0XSwjNAotICAgIENNUCAgICAgIHIxMiwjMAotICAgIEJFUSAgICAgIEwweDE2MAotICAgIEFERCAgICAgIHIxMCxyMCxyMQotICAgIFZMRDEuOCAgIHtkN30sW3IwXSxyMTEKLSAgICBWTEQxLjggICB7ZDh9LFtyMTBdLHIxMQotICAgIFZMRDEuOCAgIHtkNX0sW3IwXSxyMTEKLSAgICBWWklQLjggICBkNyxkOAotICAgIFZMRDEuOCAgIHtkMTB9LFtyMTBdLHIxMQotICAgIFZMRDEuOCAgIHtkNn0sW3IwXSxyMTEKLSAgICBWWklQLjggICBkNSxkMTAKLSAgICBWTEQxLjggICB7ZDl9LFtyMTBdLHIxMQotICAgIFZMRDEuOCAgIHtkNH0sW3IwXSxyMTEKLSAgICBWTEQxLjggICB7ZDExfSxbcjEwXSxyMTEKLSAgICBWWklQLjggICBkNixkOQotICAgIFZaSVAuMTYgIGQ4LGQxMAotICAgIFZaSVAuOCAgIGQ0LGQxMQotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMwotICAgIFZaSVAuMTYgIGQ3LGQ1Ci0gICAgVlpJUC4xNiAgZDksZDExCi0gICAgVlpJUC4xNiAgZDYsZDQKLSAgICBWVFJOLjMyICBkOCxkOQotICAgIFZUUk4uMzIgIGQ1LGQ0Ci0gICAgVlRSTi4zMiAgZDEwLGQxMQotICAgIFZUUk4uMzIgIGQ3LGQ2Ci0gICAgVkFCRC5VOCAgZDEzLGQ0LGQ4Ci0gICAgVkFCRC5VOCAgZDEyLGQ1LGQ0Ci0gICAgVkFCRC5VOCAgZDE4LGQ5LGQ4Ci0gICAgVkFCRC5VOCAgZDE5LGQ2LGQ0Ci0gICAgVFNUICAgICAgcjEyLCMweGZmCi0gICAgVkNHVC5VOCAgZDE2LGQwLGQxMwotICAgIFZNQVguVTggIGQxMixkMTgsZDEyCi0gICAgVkFCRC5VOCAgZDE3LGQxMCxkOAotICAgIFZNT1ZFUS4zMiBkMTZbMF0scjYKLSAgICBUU1QgICAgICByMTIsIzB4ZmYwMAotICAgIFZDR1QuVTggIGQxOSxkMixkMTkKLSAgICBWQ0dULlU4ICBkMTIsZDIsZDEyCi0gICAgVk1PVkVRLjMyIGQxNlsxXSxyNgotICAgIFZDR1QuVTggIGQxNyxkMixkMTcKLSAgICBWQU5EICAgICBkMTYsZDE2LGQxMgotICAgIFRTVCAgICAgIHIxMiwjNAotICAgIFZBTkQgICAgIGQxMixkMTYsZDE3Ci0gICAgVkFORCAgICAgZDE3LGQxNixkMTkKLSAgICBCTkUgICAgICBMMHgxN2MKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCi0gICAgVlpJUC44ICAgZDcsZDYKLSAgICBWWklQLjggICBkMzAsZDI5Ci0gICAgVlpJUC44ICAgZDI0LGQyNQotICAgIFZaSVAuOCAgIGQxMCxkMTEKLSAgICBWWklQLjE2ICBkNyxkMzAKLSAgICBBREQgICAgICByMTAscjAscjEKLSAgICBWWklQLjE2ICBkMjQsZDEwCi0gICAgVlpJUC4xNiAgZDI1LGQxMQotICAgIFZaSVAuMTYgIGQ2LGQyOQotICAgIFZUUk4uMzIgIGQ3LGQyNAotICAgIFZUUk4uMzIgIGQzMCxkMTAKLSAgICBWVFJOLjMyICBkNixkMjUKLSAgICBWVFJOLjMyICBkMjksZDExCi0gICAgVlNUMS44ICAge2Q3fSxbcjBdLHIxMQotICAgIFZTVDEuOCAgIHtkMjR9LFtyMTBdLHIxMQotICAgIFZTVDEuOCAgIHtkMzB9LFtyMF0scjExCi0gICAgVlNUMS44ICAge2QxMH0sW3IxMF0scjExCi0gICAgVlNUMS44ICAge2Q2fSxbcjBdLHIxMQotICAgIFZTVDEuOCAgIHtkMjV9LFtyMTBdLHIxMQotICAgIEFERFMgICAgIHI5LHI5LHI5Ci0gICAgVlNUMS44ICAge2QyOX0sW3IwXSxyMTEKLSAgICBBREQgICAgICByNSxyNSwjMgotICAgIFZTVDEuOCAgIHtkMTF9LFtyMTBdLHIxCi0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMzCi0gICAgVkxEMS44ICAge2QwW119LFtyN10KLSAgICBBREQgICAgICByMCxyMCwjNAotICAgIFZMRDEuOCAgIHtkMltdfSxbcjhdCi0gICAgQkNDICAgICAgTDB4MzgKLSAgICBCICAgICAgICBMMHgxZjAKLUwweDE2MDoKLSAgICBBREQgICAgICByMCxyMCwjNAotICAgIEFERFMgICAgIHI5LHI5LHI5Ci0gICAgVkxEMS44ICAge2QwW119LFtyN10KLSAgICBBREQgICAgICByNSxyNSwjNAotICAgIFZMRDEuOCAgIHtkMltdfSxbcjhdCi0gICAgQkNDICAgICAgTDB4MzgKLSAgICBCICAgICAgICBMMHgxZjAKLUwweDE3YzoKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCi0gICAgVlpJUC44ICAgZDcsZDMxCi0gICAgVlpJUC44ICAgZDMwLGQyOQotICAgIFZaSVAuOCAgIGQyNCxkMjUKLSAgICBWWklQLjggICBkMjgsZDExCi0gICAgVlpJUC4xNiAgZDcsZDMwCi0gICAgQUREICAgICAgcjEwLHIwLHIxCi0gICAgVlpJUC4xNiAgZDI0LGQyOAotICAgIFZaSVAuMTYgIGQyNSxkMTEKLSAgICBWWklQLjE2ICBkMzEsZDI5Ci0gICAgVlRSTi4zMiAgZDcsZDI0Ci0gICAgVlRSTi4zMiAgZDMwLGQyOAotICAgIFZUUk4uMzIgIGQzMSxkMjUKLSAgICBWVFJOLjMyICBkMjksZDExCi0gICAgVlNUMS44ICAge2Q3fSxbcjBdLHIxMQotICAgIFZTVDEuOCAgIHtkMjR9LFtyMTBdLHIxMQotICAgIFZTVDEuOCAgIHtkMzB9LFtyMF0scjExCi0gICAgVlNUMS44ICAge2QyOH0sW3IxMF0scjExCi0gICAgVlNUMS44ICAge2QzMX0sW3IwXSxyMTEKLSAgICBWU1QxLjggICB7ZDI1fSxbcjEwXSxyMTEKLSAgICBBRERTICAgICByOSxyOSxyOQotICAgIFZTVDEuOCAgIHtkMjl9LFtyMF0scjExCi0gICAgQUREICAgICAgcjUscjUsIzQKLSAgICBWU1QxLjggICB7ZDExfSxbcjEwXSxyMTEKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzMKLSAgICBWTEQxLjggICB7ZDBbXX0sW3I3XQotICAgIEFERCAgICAgIHIwLHIwLCM0Ci0gICAgVkxEMS44ICAge2QyW119LFtyOF0KLSAgICBCQ0MgICAgICBMMHgzOAotTDB4MWYwOgotICAgIFNVQiAgICAgIHI0LHI0LCMweGUKLSAgICBTVUIgICAgICByNSxyNSwjMHhlCi0gICAgU1VCICAgICAgcjAscjAsIzB4MTAKLSAgICBWTEQxLjggICB7ZDBbXX0sW3IyXQotICAgIEFERCAgICAgIHIwLHIwLHIxLExTTCAjMwotICAgIFZMRDEuOCAgIHtkMltdfSxbcjNdCi0gICAgQk5FICAgICAgTDB4MzgKLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQT1AgICAgIHtkOC1kMTV9Ci0gICAgUE9QICAgICAge3I0LXIxMixwY30KLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTRlYWJkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDMzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotICAgIC5nbG9iYWwgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEKLW9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hOgotICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9Ci0gICAgVlBVU0ggICAge2Q4LWQxNX0KLSAgICBTVUIgICAgICBzcCxzcCwjMHgxMAotICAgIExEUiAgICAgIHI2LFtzcCwjMHg3OF0KLSAgICBMRFIgICAgICByNyxbc3AsIzB4N2NdCi0gICAgTERSICAgICAgcjUsW3NwLCMweDgwXQotICAgIExEUiAgICAgIHI0LFtzcCwjMHg4NF0KLSAgICBBREQgICAgICByNixyNixyNyxMU0wgIzIKLSAgICBBREQgICAgICByMTEsc3AsIzAKLSAgICBWTU9WLkkxNiBkMzEsIzB4MTQKLSAgICBWTU9WLkkxNiBkMzAsIzB4NQotTDB4MmM6Ci0gICAgU1RNICAgICAgcjExLHtyMC1yM30KLSAgICBBREQgICAgICBwYyxwYyxyNixMU0wgIzIKLSAgICBCICAgICAgICBMMHgzZjAKLSAgICBCICAgICAgICBMMHg3OAotICAgIEIgICAgICAgIEwweGE4Ci0gICAgQiAgICAgICAgTDB4ZGMKLSAgICBCICAgICAgICBMMHgxMDAKLSAgICBCICAgICAgICBMMHgxMzQKLSAgICBCICAgICAgICBMMHgxNjgKLSAgICBCICAgICAgICBMMHgxYTgKLSAgICBCICAgICAgICBMMHgxZjAKLSAgICBCICAgICAgICBMMHgyMzQKLSAgICBCICAgICAgICBMMHgyNTgKLSAgICBCICAgICAgICBMMHgyYjAKLSAgICBCICAgICAgICBMMHgyZDgKLSAgICBCICAgICAgICBMMHgzMzAKLSAgICBCICAgICAgICBMMHgzNjQKLSAgICBCICAgICAgICBMMHgzYTgKLSAgICBCICAgICAgICBMMHgzZjAKLUwweDc4OgotICAgIEFERCAgICAgIHIxMixyMCxyMSxMU0wgIzEKLSAgICBWTEQxLjggICB7ZDl9LFtyMF0scjEKLSAgICBWTEQxLjggICB7ZDExfSxbcjEyXSxyMQotICAgIFZMRDEuOCAgIHtkMTB9LFtyMF0KLSAgICBWTEQxLjggICB7ZDEyfSxbcjEyXQotICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKLSAgICBWU1QxLjMyICB7ZDlbMF19LFtyMl0scjMKLSAgICBWU1QxLjMyICB7ZDExWzBdfSxbcjEyXSxyMwotICAgIFZTVDEuMzIgIHtkMTBbMF19LFtyMl0KLSAgICBWU1QxLjMyICB7ZDEyWzBdfSxbcjEyXQotICAgIEFERCAgICAgIHIxMSxzcCwjMAotICAgIEIgICAgICAgIEwweDQzNAotTDB4YTg6Ci0gICAgU1VCICAgICAgcjAscjAsIzIKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQotICAgIFZSSEFERC5VOCBkMjIsZDIyLGQxNAotICAgIFZSSEFERC5VOCBkMjYsZDI2LGQxOAotICAgIFZSSEFERC5VOCBkMjQsZDI0LGQxNgotICAgIFZSSEFERC5VOCBkMjgsZDI4LGQyMAotICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKLSAgICBWU1QxLjMyICB7ZDIyWzBdfSxbcjJdLHIzCi0gICAgVlNUMS4zMiAge2QyNlswXX0sW3IxMl0scjMKLSAgICBWU1QxLjMyICB7ZDI0WzBdfSxbcjJdCi0gICAgVlNUMS4zMiAge2QyOFswXX0sW3IxMl0KLSAgICBBREQgICAgICByMTEsc3AsIzAKLSAgICBCICAgICAgICBMMHg0MzQKLUwweGRjOgotICAgIFNVQiAgICAgIHIwLHIwLCMyCi0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKLSAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCi0gICAgVlNUMS4zMiAge2QyMlswXX0sW3IyXSxyMwotICAgIFZTVDEuMzIgIHtkMjZbMF19LFtyMTJdLHIzCi0gICAgVlNUMS4zMiAge2QyNFswXX0sW3IyXQotICAgIFZTVDEuMzIgIHtkMjhbMF19LFtyMTJdCi0gICAgQUREICAgICAgcjExLHNwLCMwCi0gICAgQiAgICAgICAgTDB4NDM0Ci1MMHgxMDA6Ci0gICAgU1VCICAgICAgcjAscjAsIzIKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQotICAgIFZSSEFERC5VOCBkMjIsZDIyLGQxNQotICAgIFZSSEFERC5VOCBkMjYsZDI2LGQxOQotICAgIFZSSEFERC5VOCBkMjQsZDI0LGQxNwotICAgIFZSSEFERC5VOCBkMjgsZDI4LGQyMQotICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKLSAgICBWU1QxLjMyICB7ZDIyWzBdfSxbcjJdLHIzCi0gICAgVlNUMS4zMiAge2QyNlswXX0sW3IxMl0scjMKLSAgICBWU1QxLjMyICB7ZDI0WzBdfSxbcjJdCi0gICAgVlNUMS4zMiAge2QyOFswXX0sW3IxMl0KLSAgICBBREQgICAgICByMTEsc3AsIzAKLSAgICBCICAgICAgICBMMHg0MzQKLUwweDEzNDoKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQotICAgIFZSSEFERC5VOCBkMCxkMCxkOQotICAgIFZSSEFERC5VOCBkNCxkNCxkMTEKLSAgICBWUkhBREQuVTggZDIsZDIsZDEwCi0gICAgVlJIQURELlU4IGQ2LGQ2LGQxMgotICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKLSAgICBWU1QxLjMyICB7ZDBbMF19LFtyMl0scjMKLSAgICBWU1QxLjMyICB7ZDRbMF19LFtyMTJdLHIzCi0gICAgVlNUMS4zMiAge2QyWzBdfSxbcjJdCi0gICAgVlNUMS4zMiAge2Q2WzBdfSxbcjEyXQotICAgIEFERCAgICAgIHIxMSxzcCwjMAotICAgIEIgICAgICAgIEwweDQzNAotTDB4MTY4OgotICAgIE1PViAgICAgIHI4LHIwCi0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCi0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKLSAgICBTVUIgICAgICByMCxyOCwjMgotICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCi0gICAgVlJIQURELlU4IGQyMixkMjIsZDAKLSAgICBWUkhBREQuVTggZDI2LGQyNixkNAotICAgIFZSSEFERC5VOCBkMjQsZDI0LGQyCi0gICAgVlJIQURELlU4IGQyOCxkMjgsZDYKLSAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCi0gICAgVlNUMS4zMiAge2QyMlswXX0sW3IyXSxyMwotICAgIFZTVDEuMzIgIHtkMjZbMF19LFtyMTJdLHIzCi0gICAgVlNUMS4zMiAge2QyNFswXX0sW3IyXQotICAgIFZTVDEuMzIgIHtkMjhbMF19LFtyMTJdCi0gICAgQUREICAgICAgcjExLHNwLCMwCi0gICAgQiAgICAgICAgTDB4NDM0Ci1MMHgxYTg6Ci0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCi0gICAgU1VCICAgICAgcjAscjAsIzIKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKLSAgICBWUVJTSFJVTi5TMTYgZDE0LHE3LCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQxNixxOCwjNQotICAgIFZRUlNIUlVOLlMxNiBkMTgscTksIzUKLSAgICBWUVJTSFJVTi5TMTYgZDIwLHExMCwjNQotICAgIFZSSEFERC5VOCBkMCxkMCxkMTQKLSAgICBWUkhBREQuVTggZDQsZDQsZDE4Ci0gICAgVlJIQURELlU4IGQyLGQyLGQxNgotICAgIFZSSEFERC5VOCBkNixkNixkMjAKLSAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCi0gICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCi0gICAgVlNUMS4zMiAge2Q0WzBdfSxbcjEyXSxyMwotICAgIFZTVDEuMzIgIHtkMlswXX0sW3IyXQotICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMl0KLSAgICBBREQgICAgICByMTEsc3AsIzAKLSAgICBCICAgICAgICBMMHg0MzQKLUwweDFmMDoKLSAgICBNT1YgICAgICByOCxyMAotICAgIEFERCAgICAgIHIwLHIwLCMxCi0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCi0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKLSAgICBTVUIgICAgICByMCxyOCwjMgotICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCi0gICAgVlJIQURELlU4IGQyMixkMjIsZDAKLSAgICBWUkhBREQuVTggZDI2LGQyNixkNAotICAgIFZSSEFERC5VOCBkMjQsZDI0LGQyCi0gICAgVlJIQURELlU4IGQyOCxkMjgsZDYKLSAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCi0gICAgVlNUMS4zMiAge2QyMlswXX0sW3IyXSxyMwotICAgIFZTVDEuMzIgIHtkMjZbMF19LFtyMTJdLHIzCi0gICAgVlNUMS4zMiAge2QyNFswXX0sW3IyXQotICAgIFZTVDEuMzIgIHtkMjhbMF19LFtyMTJdCi0gICAgQUREICAgICAgcjExLHNwLCMwCi0gICAgQiAgICAgICAgTDB4NDM0Ci1MMHgyMzQ6Ci0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCi0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKLSAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCi0gICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCi0gICAgVlNUMS4zMiAge2Q0WzBdfSxbcjEyXSxyMwotICAgIFZTVDEuMzIgIHtkMlswXX0sW3IyXQotICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMl0KLSAgICBBREQgICAgICByMTEsc3AsIzAKLSAgICBCICAgICAgICBMMHg0MzQKLUwweDI1ODoKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKLSAgICBTVUIgICAgICByMCxyMCwjMgotICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQotICAgIFZFWFQuOCAgIGQxOCxkMTgsZDE5LCM0Ci0gICAgVkVYVC44ICAgZDIwLGQyMCxkMjEsIzQKLSAgICBWRVhULjggICBkMjIsZDIyLGQyMywjNAotICAgIFZFWFQuOCAgIGQyNCxkMjQsZDI1LCM0Ci0gICAgVlFSU0hSVU4uUzE2IGQxNCxxOSwjNQotICAgIFZRUlNIUlVOLlMxNiBkMTYscTEwLCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQxOCxxMTEsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDIwLHExMiwjNQotICAgIFZSSEFERC5VOCBkMCxkMCxkMTQKLSAgICBWUkhBREQuVTggZDQsZDQsZDE4Ci0gICAgVlJIQURELlU4IGQyLGQyLGQxNgotICAgIFZSSEFERC5VOCBkNixkNixkMjAKLSAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCi0gICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCi0gICAgVlNUMS4zMiAge2Q0WzBdfSxbcjEyXSxyMwotICAgIFZTVDEuMzIgIHtkMlswXX0sW3IyXQotICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMl0KLSAgICBBREQgICAgICByMTEsc3AsIzAKLSAgICBCICAgICAgICBMMHg0MzQKLUwweDJiMDoKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKLSAgICBTVUIgICAgICByMCxyMCwjMgotICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQotICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKLSAgICBWU1QxLjMyICB7ZDBbMF19LFtyMl0scjMKLSAgICBWU1QxLjMyICB7ZDRbMF19LFtyMTJdLHIzCi0gICAgVlNUMS4zMiAge2QyWzBdfSxbcjJdCi0gICAgVlNUMS4zMiAge2Q2WzBdfSxbcjEyXQotICAgIEFERCAgICAgIHIxMSxzcCwjMAotICAgIEIgICAgICAgIEwweDQzNAotTDB4MmQ4OgotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQotICAgIFNVQiAgICAgIHIwLHIwLCMyCi0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCi0gICAgVkVYVC44ICAgZDE4LGQxOCxkMTksIzYKLSAgICBWRVhULjggICBkMjAsZDIwLGQyMSwjNgotICAgIFZFWFQuOCAgIGQyMixkMjIsZDIzLCM2Ci0gICAgVkVYVC44ICAgZDI0LGQyNCxkMjUsIzYKLSAgICBWUVJTSFJVTi5TMTYgZDE0LHE5LCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQxNixxMTAsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDE4LHExMSwjNQotICAgIFZRUlNIUlVOLlMxNiBkMjAscTEyLCM1Ci0gICAgVlJIQURELlU4IGQwLGQwLGQxNAotICAgIFZSSEFERC5VOCBkNCxkNCxkMTgKLSAgICBWUkhBREQuVTggZDIsZDIsZDE2Ci0gICAgVlJIQURELlU4IGQ2LGQ2LGQyMAotICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKLSAgICBWU1QxLjMyICB7ZDBbMF19LFtyMl0scjMKLSAgICBWU1QxLjMyICB7ZDRbMF19LFtyMTJdLHIzCi0gICAgVlNUMS4zMiAge2QyWzBdfSxbcjJdCi0gICAgVlNUMS4zMiAge2Q2WzBdfSxbcjEyXQotICAgIEFERCAgICAgIHIxMSxzcCwjMAotICAgIEIgICAgICAgIEwweDQzNAotTDB4MzMwOgotICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQotICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCi0gICAgVlJIQURELlU4IGQwLGQwLGQxMAotICAgIFZSSEFERC5VOCBkNCxkNCxkMTIKLSAgICBWUkhBREQuVTggZDIsZDIsZDExCi0gICAgVlJIQURELlU4IGQ2LGQ2LGQxMwotICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKLSAgICBWU1QxLjMyICB7ZDBbMF19LFtyMl0scjMKLSAgICBWU1QxLjMyICB7ZDRbMF19LFtyMTJdLHIzCi0gICAgVlNUMS4zMiAge2QyWzBdfSxbcjJdCi0gICAgVlNUMS4zMiAge2Q2WzBdfSxbcjEyXQotICAgIEFERCAgICAgIHIxMSxzcCwjMAotICAgIEIgICAgICAgIEwweDQzNAotTDB4MzY0OgotICAgIE1PViAgICAgIHI4LHIwCi0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCi0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKLSAgICBBREQgICAgICByMCxyOCxyMQotICAgIFNVQiAgICAgIHIwLHIwLCMyCi0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKLSAgICBWUkhBREQuVTggZDIyLGQyMixkMAotICAgIFZSSEFERC5VOCBkMjYsZDI2LGQ0Ci0gICAgVlJIQURELlU4IGQyNCxkMjQsZDIKLSAgICBWUkhBREQuVTggZDI4LGQyOCxkNgotICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKLSAgICBWU1QxLjMyICB7ZDIyWzBdfSxbcjJdLHIzCi0gICAgVlNUMS4zMiAge2QyNlswXX0sW3IxMl0scjMKLSAgICBWU1QxLjMyICB7ZDI0WzBdfSxbcjJdCi0gICAgVlNUMS4zMiAge2QyOFswXX0sW3IxMl0KLSAgICBBREQgICAgICByMTEsc3AsIzAKLSAgICBCICAgICAgICBMMHg0MzQKLUwweDNhODoKLSAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKLSAgICBTVUIgICAgICByMCxyMCwjMgotICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQotICAgIFZRUlNIUlVOLlMxNiBkMTQscTgsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDE2LHE5LCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQxOCxxMTAsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDIwLHExMSwjNQotICAgIFZSSEFERC5VOCBkMCxkMCxkMTQKLSAgICBWUkhBREQuVTggZDQsZDQsZDE4Ci0gICAgVlJIQURELlU4IGQyLGQyLGQxNgotICAgIFZSSEFERC5VOCBkNixkNixkMjAKLSAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCi0gICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCi0gICAgVlNUMS4zMiAge2Q0WzBdfSxbcjEyXSxyMwotICAgIFZTVDEuMzIgIHtkMlswXX0sW3IyXQotICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMl0KLSAgICBBREQgICAgICByMTEsc3AsIzAKLSAgICBCICAgICAgICBMMHg0MzQKLUwweDNmMDoKLSAgICBNT1YgICAgICByOCxyMAotICAgIEFERCAgICAgIHIwLHIwLCMxCi0gICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCi0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKLSAgICBBREQgICAgICByMCxyOCxyMQotICAgIFNVQiAgICAgIHIwLHIwLCMyCi0gICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKLSAgICBWUkhBREQuVTggZDIyLGQyMixkMAotICAgIFZSSEFERC5VOCBkMjYsZDI2LGQ0Ci0gICAgVlJIQURELlU4IGQyNCxkMjQsZDIKLSAgICBWUkhBREQuVTggZDI4LGQyOCxkNgotICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKLSAgICBWU1QxLjMyICB7ZDIyWzBdfSxbcjJdLHIzCi0gICAgVlNUMS4zMiAge2QyNlswXX0sW3IxMl0scjMKLSAgICBWU1QxLjMyICB7ZDI0WzBdfSxbcjJdCi0gICAgVlNUMS4zMiAge2QyOFswXX0sW3IxMl0KLSAgICBBREQgICAgICByMTEsc3AsIzAKLUwweDQzNDoKLSAgICBMRE0gICAgICByMTEse3IwLXIzfQotICAgIFNVQlMgICAgIHI1LHI1LCM0Ci0gICAgQUREICAgICAgcjAscjAsIzQKLSAgICBBREQgICAgICByMixyMiwjNAotICAgIEJHVCAgICAgIEwweDJjCi0gICAgU1VCUyAgICAgcjQscjQsIzQKLSAgICBMRFIgICAgICByNSxbc3AsIzB4ODBdCi0gICAgQUREICAgICAgcjExLHNwLCMwCi0gICAgQUREICAgICAgcjAscjAscjEsTFNMICMyCi0gICAgQUREICAgICAgcjIscjIscjMsTFNMICMyCi0gICAgU1VCICAgICAgcjAscjAscjUKLSAgICBTVUIgICAgICByMixyMixyNQotICAgIEJHVCAgICAgIEwweDJjCi0gICAgTU9WICAgICAgcjAsIzAKLSAgICBBREQgICAgICBzcCxzcCwjMHgxMAotICAgIFZQT1AgICAgIHtkOC1kMTV9Ci0gICAgUE9QICAgICAge3I0LXIxMixwY30KLQotICAgIC5lbmQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZDEzNTAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MuUworKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLSAgICAuYWxpZ24gNAotCi1hcm1WQ000UDEwX3BJbmRleFRhYmxlOHg4OgotICAgIC53b3JkICBPTVhfVkNfQ0hST01BX0RDLShQMCs4KSwgICAgT01YX1ZDX0NIUk9NQV9IT1ItKFAwKzgpCi0gICAgLndvcmQgIE9NWF9WQ19DSFJPTUFfVkVSVC0oUDArOCksICBPTVhfVkNfQ0hST01BX1BMQU5FLShQMCs4KQotCi1hcm1WQ000UDEwX011bHRpcGxpZXJUYWJsZUNocm9tYTh4ODoKLSAgICAuaHdvcmQgICAzLCAyLCAxLDQKLSAgICAuaHdvcmQgIC0zLC0yLC0xLDAKLSAgICAuaHdvcmQgICAxLCAyLCAzLDQKLQotICAgIC5nbG9iYWwgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4Ci1vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDg6Ci0gICAgUFVTSCAgICAge3I0LXIxMCxscn0KLSAgICBWUFVTSCAgICB7ZDgtZDE1fQotICAgIEFEUiAgICAgIHI4LCBhcm1WQ000UDEwX3BJbmRleFRhYmxlOHg4Ci0gICAgTERSICAgICAgcjYsW3NwLCMweDY4XQotICAgIExEUiAgICAgIHI0LFtzcCwjMHg2MF0KLSAgICBMRFIgICAgICByNSxbc3AsIzB4NjRdCi0gICAgTERSICAgICAgcjcsW3NwLCMweDZjXQotICAgIExEUiAgICAgIHI4LFtyOCxyNixMU0wgIzJdCi1QMDogQUREICAgICAgcGMscjgKLQotT01YX1ZDX0NIUk9NQV9EQzoKLSAgICBUU1QgICAgICByNywjMgotICAgIEJFUSAgICAgIEwweGU4Ci0gICAgQUREICAgICAgcjkscjAscjQKLSAgICBBREQgICAgICByMTAscjQscjQKLSAgICBWTEQxLjggICB7ZDFbMF19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QxWzFdfSxbcjldLHIxMAotICAgIFZMRDEuOCAgIHtkMVsyXX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDFbM119LFtyOV0scjEwCi0gICAgVkxEMS44ICAge2QxWzRdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMVs1XX0sW3I5XSxyMTAKLSAgICBWTEQxLjggICB7ZDFbNl19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QxWzddfSxbcjldCi0gICAgVFNUICAgICAgcjcsIzEKLSAgICBCRVEgICAgICBMMHhjYwotICAgIFZMRDEuOCAgIHtkMH0sW3IxXQotICAgIE1PViAgICAgIHIwLCMwCi0gICAgVlBBRERMLlU4IGQyLGQwCi0gICAgVlBBRERMLlUxNiBkMyxkMgotICAgIFZQQURETC5VOCBkMixkMQotICAgIFZQQURETC5VMTYgZDEsZDIKLSAgICBWQURELkkzMiBkMixkMyxkMQotICAgIFZSU0hSLlUzMiBkMixkMiwjMwotICAgIFZSU0hSLlUzMiBkMyxkMywjMgotICAgIFZSU0hSLlUzMiBkMSxkMSwjMgotICAgIFZNT1YuSTggIGQ1LCMweGMKLSAgICBWTU9WLkk4ICBkNiwjMHg0Ci0gICAgVlNITC5JNjQgZDUsZDUsIzMyCi0gICAgVlNIUi5VNjQgZDYsZDYsIzMyCi0gICAgVkFERC5JOCAgZDYsZDYsZDUKLSAgICBWVEJMLjggICBkMCx7ZDItZDN9LGQ1Ci0gICAgVlRCTC44ICAgZDQse2QxLWQyfSxkNgotTDB4OWM6Ci0gICAgQUREICAgICAgcjkscjMscjUKLSAgICBBREQgICAgICByMTAscjUscjUKLSAgICBWU1QxLjggICB7ZDB9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2QwfSxbcjldLHIxMAotICAgIFZTVDEuOCAgIHtkMH0sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDB9LFtyOV0scjEwCi0gICAgVlNUMS44ICAge2Q0fSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkNH0sW3I5XSxyMTAKLSAgICBWU1QxLjggICB7ZDR9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2Q0fSxbcjldCi0gICAgVlBPUCAgICAge2Q4LWQxNX0KLSAgICBQT1AgICAgICB7cjQtcjEwLHBjfQotTDB4Y2M6Ci0gICAgTU9WICAgICAgcjAsIzAKLSAgICBWUEFEREwuVTggZDIsZDEKLSAgICBWUEFEREwuVTE2IGQxLGQyCi0gICAgVlJTSFIuVTMyIGQxLGQxLCMyCi0gICAgVkRVUC44ICAgZDAsZDFbMF0KLSAgICBWRFVQLjggICBkNCxkMVs0XQotICAgIEIgICAgICAgIEwweDljCi1MMHhlODoKLSAgICBUU1QgICAgICByNywjMQotICAgIEJFUSAgICAgIEwweDExNAotICAgIFZMRDEuOCAgIHtkMH0sW3IxXQotICAgIE1PViAgICAgIHIwLCMwCi0gICAgVlBBRERMLlU4IGQyLGQwCi0gICAgVlBBRERMLlUxNiBkMyxkMgotICAgIFZSU0hSLlUzMiBkMyxkMywjMgotICAgIFZNT1YuSTggIGQ1LCMweDQKLSAgICBWU0hMLkk2NCBkNSxkNSwjMzIKLSAgICBWVEJMLjggICBkMCx7ZDN9LGQ1Ci0gICAgQiAgICAgICAgTDB4MTFjCi1MMHgxMTQ6Ci0gICAgVk1PVi5JOCAgZDAsIzB4ODAKLSAgICBNT1YgICAgICByMCwjMAotTDB4MTFjOgotICAgIEFERCAgICAgIHI5LHIzLHI1Ci0gICAgQUREICAgICAgcjEwLHI1LHI1Ci0gICAgVlNUMS44ICAge2QwfSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkMH0sW3I5XSxyMTAKLSAgICBWU1QxLjggICB7ZDB9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2QwfSxbcjldLHIxMAotICAgIFZTVDEuOCAgIHtkMH0sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDB9LFtyOV0scjEwCi0gICAgVlNUMS44ICAge2QwfSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkMH0sW3I5XQotICAgIFZQT1AgICAgIHtkOC1kMTV9Ci0gICAgUE9QICAgICAge3I0LXIxMCxwY30KLU9NWF9WQ19DSFJPTUFfVkVSVDoKLSAgICBWTEQxLjggICB7ZDB9LFtyMV0KLSAgICBNT1YgICAgICByMCwjMAotICAgIEIgICAgICAgIEwweDExYwotT01YX1ZDX0NIUk9NQV9IT1I6Ci0gICAgQUREICAgICAgcjkscjAscjQKLSAgICBBREQgICAgICByMTAscjQscjQKLSAgICBWTEQxLjggICB7ZDBbXX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDFbXX0sW3I5XSxyMTAKLSAgICBWTEQxLjggICB7ZDJbXX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDNbXX0sW3I5XSxyMTAKLSAgICBWTEQxLjggICB7ZDRbXX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDVbXX0sW3I5XSxyMTAKLSAgICBWTEQxLjggICB7ZDZbXX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDdbXX0sW3I5XQotICAgIEIgICAgICAgIEwweDI4YwotT01YX1ZDX0NIUk9NQV9QTEFORToKLSAgICBBREQgICAgICByOSxyMCxyNAotICAgIEFERCAgICAgIHIxMCxyNCxyNAotICAgIFZMRDEuOCAgIHtkMH0sW3IxXQotICAgIFZMRDEuOCAgIHtkMlswXX0sW3IyXQotICAgIFZMRDEuOCAgIHtkMVswXX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDFbMV19LFtyOV0scjEwCi0gICAgVkxEMS44ICAge2QxWzJdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMVszXX0sW3I5XSxyMTAKLSAgICBWTEQxLjggICB7ZDFbNF19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QxWzVdfSxbcjldLHIxMAotICAgIFZMRDEuOCAgIHtkMVs2XX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDFbN119LFtyOV0KLSAgICBWUkVWNjQuOCBkMyxkMAotICAgIFZTVUJMLlU4IHEzLGQzLGQyCi0gICAgVlNIUi5VNjQgZDMsZDMsIzgKLSAgICBWU1VCTC5VOCBxMixkMyxkMAotICAgIFZSRVY2NC44IGQzLGQxCi0gICAgVlNVQkwuVTggcTcsZDMsZDIKLSAgICBWU0hSLlU2NCBkMyxkMywjOAotICAgIFZTVUJMLlU4IHE2LGQzLGQxCi0gICAgQURSICAgICAgcjIsIGFybVZDTTRQMTBfTXVsdGlwbGllclRhYmxlQ2hyb21hOHg4Ci0gICAgVlNITC5JNjQgZDQsZDQsIzE2Ci0gICAgVkVYVC44ICAgZDksZDQsZDYsIzIKLSAgICBWTEQxLjE2ICB7ZDEwfSxbcjJdIQotICAgIFZTSEwuSTY0IGQxMixkMTIsIzE2Ci0gICAgVkVYVC44ICAgZDE2LGQxMixkMTQsIzIKLSAgICBWTVVMLkkxNiBkMTEsZDksZDEwCi0gICAgVk1VTC5JMTYgZDMsZDE2LGQxMAotICAgIFZQQURELkkxNiBkMyxkMTEsZDMKLSAgICBWUEFEREwuUzE2IGQzLGQzCi0gICAgVlNITC5JMzIgZDIsZDMsIzQKLSAgICBWQURELkkzMiBkMyxkMyxkMgotICAgIFZMRDEuMTYgIHtkMTAsZDExfSxbcjJdCi0gICAgVlJTSFIuUzMyIGQzLGQzLCM1Ci0gICAgVkFEREwuVTggcTAsZDAsZDEKLSAgICBWRFVQLjE2ICBxMCxkMVszXQotICAgIFZTSEwuSTE2IHEwLHEwLCM0Ci0gICAgVkRVUC4xNiAgcTIsZDNbMF0KLSAgICBWRFVQLjE2ICBxMyxkM1syXQotICAgIFZNVUwuSTE2IHEyLHEyLHE1Ci0gICAgVk1VTC5JMTYgcTMscTMscTUKLSAgICBWQURELkkxNiBxMixxMixxMAotICAgIFZEVVAuMTYgIHEwLGQ2WzBdCi0gICAgVkRVUC4xNiAgcTEsZDZbMV0KLSAgICBWRFVQLjE2ICBxNCxkNlsyXQotICAgIFZEVVAuMTYgIHE1LGQ2WzNdCi0gICAgVkRVUC4xNiAgcTYsZDdbMF0KLSAgICBWRFVQLjE2ICBxNyxkN1sxXQotICAgIFZEVVAuMTYgIHE4LGQ3WzJdCi0gICAgVkRVUC4xNiAgcTksZDdbM10KLSAgICBWQURELkkxNiBxMCxxMixxMAotICAgIFZBREQuSTE2IHExLHEyLHExCi0gICAgVkFERC5JMTYgcTQscTIscTQKLSAgICBWQURELkkxNiBxNSxxMixxNQotICAgIFZBREQuSTE2IHE2LHEyLHE2Ci0gICAgVkFERC5JMTYgcTcscTIscTcKLSAgICBWQURELkkxNiBxOCxxMixxOAotICAgIFZBREQuSTE2IHE5LHEyLHE5Ci0gICAgVlFSU0hSVU4uUzE2IGQwLHEwLCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQxLHExLCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQyLHE0LCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQzLHE1LCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQ0LHE2LCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQ1LHE3LCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQ2LHE4LCM1Ci0gICAgVlFSU0hSVU4uUzE2IGQ3LHE5LCM1Ci1MMHgyOGM6Ci0gICAgQUREICAgICAgcjkscjMscjUKLSAgICBBREQgICAgICByMTAscjUscjUKLSAgICBWU1QxLjggICB7ZDB9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2QxfSxbcjldLHIxMAotICAgIFZTVDEuOCAgIHtkMn0sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDN9LFtyOV0scjEwCi0gICAgVlNUMS44ICAge2Q0fSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkNX0sW3I5XSxyMTAKLSAgICBWU1QxLjggICB7ZDZ9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2Q3fSxbcjldCi0gICAgTU9WICAgICAgcjAsIzAKLSAgICBWUE9QICAgICB7ZDgtZDE1fQotICAgIFBPUCAgICAgIHtyNC1yMTAscGN9Ci0KLSAgICAuZW5kCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA0NDYzNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLQotICAgIC50ZXh0Ci0gICAgLmFsaWduIDQKLTsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBUaGlzIHRhYmxlIGZvciBpbXBsZW1lbnRpbmcgc3dpdGNoIGNhc2Ugb2YgQyBpbiBhc20gYnkKLTsvLyB0aGUgbWVodG9kIG9mIHR3byBsZXZlbHMgb2YgaW5kZXhpbmcuCi07Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWFybVZDTTRQMTBfcEluZGV4VGFibGUxNngxNjoKLSAgICAud29yZCAgT01YX1ZDXzE2WDE2X1ZFUlQtKFAwKzgpLCBPTVhfVkNfMTZYMTZfSE9SLShQMCs4KQotICAgIC53b3JkICBPTVhfVkNfMTZYMTZfREMtKFAwKzgpLCAgIE9NWF9WQ18xNlgxNl9QTEFORS0oUDArOCkKLQotCi1hcm1WQ000UDEwX011bHRpcGxpZXJUYWJsZTE2eDE2OgotICAgIC5od29yZCAgIDcsICA2LCAgNSwgIDQsICAzLCAgMiwgIDEsICA4Ci0gICAgLmh3b3JkICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcKLSAgICAuaHdvcmQgICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNQotCi0KLSAgICAuZ2xvYmFsIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2Ci1vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNjoKLSAgICBQVVNIICAgICB7cjQtcjEyLGxyfQotICAgIFZQVVNIICAgIHtkOC1kMTV9Ci0gICAgQURSICAgICAgcjksIGFybVZDTTRQMTBfcEluZGV4VGFibGUxNngxNgotICAgIExEUiAgICAgIHI2LFtzcCwjMHg3MF0KLSAgICBMRFIgICAgICByNCxbc3AsIzB4NjhdCi0gICAgTERSICAgICAgcjUsW3NwLCMweDZjXQotICAgIExEUiAgICAgIHI3LFtzcCwjMHg3NF0KLSAgICBNT1YgICAgICByMTIsIzB4MTAKLSAgICBMRFIgICAgICByOSxbcjkscjYsTFNMICMyXQotUDA6IEFERCAgICAgIHBjLHI5Ci1PTVhfVkNfMTZYMTZfVkVSVDoKLSAgICBWTEQxLjggICB7ZDAsZDF9LFtyMV0KLSAgICBBREQgICAgICByOCxyMyxyNQotICAgIEFERCAgICAgIHIxMCxyNSxyNQotICAgIFZTVDEuOCAgIHtkMCxkMX0sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDAsZDF9LFtyOF0scjEwCi0gICAgVlNUMS44ICAge2QwLGQxfSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkMCxkMX0sW3I4XSxyMTAKLSAgICBWU1QxLjggICB7ZDAsZDF9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2QwLGQxfSxbcjhdLHIxMAotICAgIFZTVDEuOCAgIHtkMCxkMX0sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDAsZDF9LFtyOF0scjEwCi0gICAgVlNUMS44ICAge2QwLGQxfSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkMCxkMX0sW3I4XSxyMTAKLSAgICBWU1QxLjggICB7ZDAsZDF9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2QwLGQxfSxbcjhdLHIxMAotICAgIFZTVDEuOCAgIHtkMCxkMX0sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDAsZDF9LFtyOF0scjEwCi0gICAgVlNUMS44ICAge2QwLGQxfSxbcjNdCi0gICAgVlNUMS44ICAge2QwLGQxfSxbcjhdCi0gICAgTU9WICAgICAgcjAsIzAKLSAgICBWUE9QICAgICB7ZDgtZDE1fQotICAgIFBPUCAgICAgIHtyNC1yMTIscGN9Ci1PTVhfVkNfMTZYMTZfSE9SOgotICAgIEFERCAgICAgIHI4LHIwLHI0Ci0gICAgQUREICAgICAgcjQscjQscjQKLSAgICBBREQgICAgICByMTEscjMscjUKLSAgICBBREQgICAgICByNSxyNSxyNQotTDB4OGM6Ci0gICAgVkxEMS44ICAge2QyW10sZDNbXX0sW3IwXSxyNAotICAgIFZMRDEuOCAgIHtkMFtdLGQxW119LFtyOF0scjQKLSAgICBTVUJTICAgICByMTIscjEyLCM4Ci0gICAgVlNUMS44ICAge2QyLGQzfSxbcjNdLHI1Ci0gICAgVlNUMS44ICAge2QwLGQxfSxbcjExXSxyNQotICAgIFZMRDEuOCAgIHtkMltdLGQzW119LFtyMF0scjQKLSAgICBWTEQxLjggICB7ZDBbXSxkMVtdfSxbcjhdLHI0Ci0gICAgVlNUMS44ICAge2QyLGQzfSxbcjNdLHI1Ci0gICAgVlNUMS44ICAge2QwLGQxfSxbcjExXSxyNQotICAgIFZMRDEuOCAgIHtkMltdLGQzW119LFtyMF0scjQKLSAgICBWTEQxLjggICB7ZDBbXSxkMVtdfSxbcjhdLHI0Ci0gICAgVlNUMS44ICAge2QyLGQzfSxbcjNdLHI1Ci0gICAgVlNUMS44ICAge2QwLGQxfSxbcjExXSxyNQotICAgIFZMRDEuOCAgIHtkMltdLGQzW119LFtyMF0scjQKLSAgICBWTEQxLjggICB7ZDBbXSxkMVtdfSxbcjhdLHI0Ci0gICAgVlNUMS44ICAge2QyLGQzfSxbcjNdLHI1Ci0gICAgVlNUMS44ICAge2QwLGQxfSxbcjExXSxyNQotICAgIEJORSAgICAgIEwweDhjCi0gICAgTU9WICAgICAgcjAsIzAKLSAgICBWUE9QICAgICB7ZDgtZDE1fQotICAgIFBPUCAgICAgIHtyNC1yMTIscGN9Ci1PTVhfVkNfMTZYMTZfREM6Ci0gICAgTU9WICAgICAgcjExLCMwCi0gICAgVFNUICAgICAgcjcsIzIKLSAgICBCRVEgICAgICBMMHgxNGMKLSAgICBBREQgICAgICByOCxyMCxyNAotICAgIEFERCAgICAgIHIxMCxyNCxyNAotICAgIFZMRDEuOCAgIHtkMlswXX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDJbMV19LFtyOF0scjEwCi0gICAgVkxEMS44ICAge2QyWzJdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMlszXX0sW3I4XSxyMTAKLSAgICBWTEQxLjggICB7ZDJbNF19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QyWzVdfSxbcjhdLHIxMAotICAgIFZMRDEuOCAgIHtkMls2XX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDJbN119LFtyOF0scjEwCi0gICAgVkxEMS44ICAge2QzWzBdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkM1sxXX0sW3I4XSxyMTAKLSAgICBWTEQxLjggICB7ZDNbMl19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QzWzNdfSxbcjhdLHIxMAotICAgIFZMRDEuOCAgIHtkM1s0XX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDNbNV19LFtyOF0scjEwCi0gICAgVkxEMS44ICAge2QzWzZdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkM1s3XX0sW3I4XQotICAgIFZQQURETC5VOCBxMCxxMQotICAgIEFERCAgICAgIHIxMSxyMTEsIzEKLSAgICBWUEFERC5JMTYgZDAsZDAsZDEKLSAgICBWUEFEREwuVTE2IGQwLGQwCi0gICAgVlBBRERMLlUzMiBkNixkMAotICAgIFZSU0hSLlU2NCBkOCxkNiwjNAotTDB4MTRjOgotICAgIFRTVCAgICAgIHI3LCMxCi0gICAgQkVRICAgICAgTDB4MTcwCi0gICAgVkxEMS44ICAge2QwLGQxfSxbcjFdCi0gICAgQUREICAgICAgcjExLHIxMSwjMQotICAgIFZQQURETC5VOCBxMCxxMAotICAgIFZQQURELkkxNiBkMCxkMCxkMQotICAgIFZQQURETC5VMTYgZDAsZDAKLSAgICBWUEFEREwuVTMyIGQ3LGQwCi0gICAgVlJTSFIuVTY0IGQ4LGQ3LCM0Ci1MMHgxNzA6Ci0gICAgQ01QICAgICAgcjExLCMyCi0gICAgQk5FICAgICAgTDB4MTgwCi0gICAgVkFERC5JNjQgZDgsZDcsZDYKLSAgICBWUlNIUi5VNjQgZDgsZDgsIzUKLUwweDE4MDoKLSAgICBWRFVQLjggICBxMyxkOFswXQotICAgIENNUCAgICAgIHIxMSwjMAotICAgIEFERCAgICAgIHI4LHIzLHI1Ci0gICAgQUREICAgICAgcjEwLHI1LHI1Ci0gICAgQk5FICAgICAgTDB4MTk4Ci0gICAgVk1PVi5JOCAgcTMsIzB4ODAKLUwweDE5ODoKLSAgICBWU1QxLjggICB7ZDYsZDd9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2Q2LGQ3fSxbcjhdLHIxMAotICAgIFZTVDEuOCAgIHtkNixkN30sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDYsZDd9LFtyOF0scjEwCi0gICAgVlNUMS44ICAge2Q2LGQ3fSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkNixkN30sW3I4XSxyMTAKLSAgICBWU1QxLjggICB7ZDYsZDd9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2Q2LGQ3fSxbcjhdLHIxMAotICAgIFZTVDEuOCAgIHtkNixkN30sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDYsZDd9LFtyOF0scjEwCi0gICAgVlNUMS44ICAge2Q2LGQ3fSxbcjNdLHIxMAotICAgIFZTVDEuOCAgIHtkNixkN30sW3I4XSxyMTAKLSAgICBWU1QxLjggICB7ZDYsZDd9LFtyM10scjEwCi0gICAgVlNUMS44ICAge2Q2LGQ3fSxbcjhdLHIxMAotICAgIFZTVDEuOCAgIHtkNixkN30sW3IzXSxyMTAKLSAgICBWU1QxLjggICB7ZDYsZDd9LFtyOF0scjEwCi0gICAgTU9WICAgICAgcjAsIzAKLSAgICBWUE9QICAgICB7ZDgtZDE1fQotICAgIFBPUCAgICAgIHtyNC1yMTIscGN9Ci1PTVhfVkNfMTZYMTZfUExBTkU6Ci0gICAgQURSICAgICAgcjksIGFybVZDTTRQMTBfTXVsdGlwbGllclRhYmxlMTZ4MTYKLSAgICBWTEQxLjggICB7ZDAsZDF9LFtyMV0KLSAgICBWTEQxLjggICB7ZDRbMF19LFtyMl0KLSAgICBBREQgICAgICByOCxyMCxyNAotICAgIEFERCAgICAgIHIxMCxyNCxyNAotICAgIFZMRDEuOCAgIHtkMlswXX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDJbMV19LFtyOF0scjEwCi0gICAgVkxEMS44ICAge2QyWzJdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkMlszXX0sW3I4XSxyMTAKLSAgICBWTEQxLjggICB7ZDJbNF19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QyWzVdfSxbcjhdLHIxMAotICAgIFZMRDEuOCAgIHtkMls2XX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDJbN119LFtyOF0scjEwCi0gICAgVkxEMS44ICAge2QzWzBdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkM1sxXX0sW3I4XSxyMTAKLSAgICBWTEQxLjggICB7ZDNbMl19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QzWzNdfSxbcjhdLHIxMAotICAgIFZMRDEuOCAgIHtkM1s0XX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDNbNV19LFtyOF0scjEwCi0gICAgVkxEMS44ICAge2QzWzZdfSxbcjBdLHIxMAotICAgIFZMRDEuOCAgIHtkM1s3XX0sW3I4XQotICAgIFZSRVY2NC44IGQ1LGQxCi0gICAgVlNVQkwuVTggcTMsZDUsZDQKLSAgICBWU0hSLlU2NCBkNSxkNSwjOAotICAgIFZTVUJMLlU4IHE0LGQ1LGQwCi0gICAgVlNITC5JNjQgZDksZDksIzE2Ci0gICAgVkVYVC44ICAgZDksZDksZDYsIzIKLSAgICBWUkVWNjQuOCBkMTIsZDMKLSAgICBWU1VCTC5VOCBxNyxkMTIsZDQKLSAgICBWU0hSLlU2NCBkMTIsZDEyLCM4Ci0gICAgVlNVQkwuVTggcTgsZDEyLGQyCi0gICAgVkxEMS4xNiAge2QyMCxkMjF9LFtyOV0hCi0gICAgVlNITC5JNjQgZDE3LGQxNywjMTYKLSAgICBWRVhULjggICBkMTcsZDE3LGQxNCwjMgotICAgIFZNVUxMLlMxNiBxMTEsZDgsZDIwCi0gICAgVk1VTEwuUzE2IHExMixkMTYsZDIwCi0gICAgVk1MQUwuUzE2IHExMSxkOSxkMjEKLSAgICBWTUxBTC5TMTYgcTEyLGQxNyxkMjEKLSAgICBWUEFERC5JMzIgZDIyLGQyMyxkMjIKLSAgICBWUEFERC5JMzIgZDIzLGQyNSxkMjQKLSAgICBWUEFEREwuUzMyIHExMSxxMTEKLSAgICBWU0hMLkk2NCBxMTIscTExLCMyCi0gICAgVkFERC5JNjQgcTExLHExMSxxMTIKLSAgICBWUlNIUi5TNjQgcTExLHExMSwjNgotICAgIFZTSEwuSTY0IHExMixxMTEsIzMKLSAgICBWU1VCLkk2NCBxMTIscTEyLHExMQotICAgIFZMRDEuMTYgIHtkMjAsZDIxfSxbcjldIQotICAgIFZEVVAuMTYgIHE2LGQyMlswXQotICAgIFZEVVAuMTYgIHE3LGQyM1swXQotICAgIFZBRERMLlU4IHExMSxkMSxkMwotICAgIFZTSEwuSTE2IHExMSxxMTEsIzQKLSAgICBWRFVQLjE2ICBxMTEsZDIzWzNdCi0gICAgVkFERC5JNjQgZDEsZDI0LGQyNQotICAgIFZMRDEuMTYgIHtkMjQsZDI1fSxbcjldCi0gICAgVkRVUC4xNiAgcTEzLGQxWzBdCi0gICAgVlNVQi5JMTYgcTEzLHExMSxxMTMKLSAgICBWTVVMLkkxNiBxNSxxNixxMTAKLSAgICBWTVVMLkkxNiBxNixxNixxMTIKLSAgICBWQURELkkxNiBxMCxxNSxxMTMKLSAgICBWQURELkkxNiBxMSxxNixxMTMKLUwweDJkNDoKLSAgICBWUVJTSFJVTi5TMTYgZDYscTAsIzUKLSAgICBWUVJTSFJVTi5TMTYgZDcscTEsIzUKLSAgICBTVUJTICAgICByMTIscjEyLCMxCi0gICAgVlNUMS44ICAge2Q2LGQ3fSxbcjNdLHI1Ci0gICAgVkFERC5JMTYgcTAscTAscTcKLSAgICBWQURELkkxNiBxMSxxMSxxNwotICAgIEJORSAgICAgIEwweDJkNAotICAgIE1PViAgICAgIHIwLCMwCi0gICAgVlBPUCAgICAge2Q4LWQxNX0KLSAgICBQT1AgICAgICB7cjQtcjEyLHBjfQotCi0gICAgLmVuZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRjODQ4NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5TCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLQotICAgIC50ZXh0Ci0gICAgLmFsaWduIDQKLQotYXJtVkNNNFAxMF9wU3dpdGNoVGFibGU0eDQ6Ci0gICAgLndvcmQgT01YX1ZDXzR4NF9WRVJULShQMCs4KSwgICAgIE9NWF9WQ180eDRfSE9SLShQMCs4KQotICAgIC53b3JkIE9NWF9WQ180eDRfREMtKFAwKzgpLCAgICAgICBPTVhfVkNfNHg0X0RJQUdfREwtKFAwKzgpCi0gICAgLndvcmQgT01YX1ZDXzR4NF9ESUFHX0RSLShQMCs4KSwgIE9NWF9WQ180eDRfVlItKFAwKzgpCi0gICAgLndvcmQgT01YX1ZDXzR4NF9IRC0oUDArOCksICAgICAgIE9NWF9WQ180eDRfVkwtKFAwKzgpCi0gICAgLndvcmQgT01YX1ZDXzR4NF9IVS0oUDArOCkKLQotICAgIC5nbG9iYWwgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0Ci1vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQ6Ci0gICAgUFVTSCAgICAge3I0LXIxMixscn0KLSAgICBWUFVTSCAgICB7ZDgtZDEyfQotICAgIEFEUiAgICAgIHI4LCBhcm1WQ000UDEwX3BTd2l0Y2hUYWJsZTR4NAotICAgIExEUkQgICAgIHI2LHI3LFtzcCwjMHg1OF0KLSAgICBMRFJEICAgICByNCxyNSxbc3AsIzB4NTBdCi0gICAgTERSICAgICAgcjgsW3I4LHI2LExTTCAjMl0KLVAwOiBBREQgICAgICBwYywgcjgKLQotT01YX1ZDXzR4NF9IT1I6Ci0gICAgQUREICAgICAgcjkscjAscjQKLSAgICBBREQgICAgICByMTAscjQscjQKLSAgICBWTEQxLjggICB7ZDBbXX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDFbXX0sW3I5XSxyMTAKLSAgICBWTEQxLjggICB7ZDJbXX0sW3IwXQotICAgIFZMRDEuOCAgIHtkM1tdfSxbcjldCi0gICAgQUREICAgICAgcjExLHIzLHI1Ci0gICAgQUREICAgICAgcjEyLHI1LHI1Ci0gICAgVlNUMS4zMiAge2QwWzBdfSxbcjNdLHIxMgotICAgIFZTVDEuMzIgIHtkMVswXX0sW3IxMV0scjEyCi0gICAgVlNUMS4zMiAge2QyWzBdfSxbcjNdCi0gICAgVlNUMS4zMiAge2QzWzBdfSxbcjExXQotICAgIEIgICAgICAgIEwweDM0OAotT01YX1ZDXzR4NF9WRVJUOgotICAgIFZMRDEuMzIgIHtkMFswXX0sW3IxXQotICAgIEFERCAgICAgIHIxMSxyMyxyNQotICAgIEFERCAgICAgIHIxMixyNSxyNQotTDB4NTg6Ci0gICAgVlNUMS4zMiAge2QwWzBdfSxbcjNdLHIxMgotICAgIFZTVDEuMzIgIHtkMFswXX0sW3IxMV0scjEyCi0gICAgVlNUMS4zMiAge2QwWzBdfSxbcjNdCi0gICAgVlNUMS4zMiAge2QwWzBdfSxbcjExXQotICAgIEIgICAgICAgIEwweDM0OAotT01YX1ZDXzR4NF9EQzoKLSAgICBUU1QgICAgICByNywjMgotICAgIEJFUSAgICAgIEwweGRjCi0gICAgQUREICAgICAgcjkscjAscjQKLSAgICBBREQgICAgICByMTAscjQscjQKLSAgICBWTEQxLjggICB7ZDBbMF19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QwWzFdfSxbcjldLHIxMAotICAgIFZMRDEuOCAgIHtkMFsyXX0sW3IwXQotICAgIFZMRDEuOCAgIHtkMFszXX0sW3I5XQotICAgIFRTVCAgICAgIHI3LCMxCi0gICAgQkVRICAgICAgTDB4YmMKLSAgICBWTEQxLjMyICB7ZDBbMV19LFtyMV0KLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQQURETC5VOCBkMSxkMAotICAgIFZQQURETC5VMTYgZDEsZDEKLSAgICBWUEFEREwuVTMyIGQxLGQxCi0gICAgVlJTSFIuVTY0IGQxLGQxLCMzCi0gICAgQUREICAgICAgcjExLHIzLHI1Ci0gICAgQUREICAgICAgcjEyLHI1LHI1Ci0gICAgVkRVUC44ICAgZDAsZDFbMF0KLSAgICBCICAgICAgICBMMHg1OAotTDB4YmM6Ci0gICAgTU9WICAgICAgcjAsIzAKLSAgICBWUEFEREwuVTggZDEsZDAKLSAgICBWUEFEREwuVTE2IGQxLGQxCi0gICAgVlJTSFIuVTMyIGQxLGQxLCMyCi0gICAgQUREICAgICAgcjExLHIzLHI1Ci0gICAgQUREICAgICAgcjEyLHI1LHI1Ci0gICAgVkRVUC44ICAgZDAsZDFbMF0KLSAgICBCICAgICAgICBMMHg1OAotTDB4ZGM6Ci0gICAgVFNUICAgICAgcjcsIzEKLSAgICBCRVEgICAgICBMMHgxMDgKLSAgICBWTEQxLjMyICB7ZDBbMF19LFtyMV0KLSAgICBNT1YgICAgICByMCwjMAotICAgIFZQQURETC5VOCBkMSxkMAotICAgIFZQQURETC5VMTYgZDEsZDEKLSAgICBWUlNIUi5VMzIgZDEsZDEsIzIKLSAgICBBREQgICAgICByMTEscjMscjUKLSAgICBBREQgICAgICByMTIscjUscjUKLSAgICBWRFVQLjggICBkMCxkMVswXQotICAgIEIgICAgICAgIEwweDU4Ci1MMHgxMDg6Ci0gICAgVk1PVi5JOCAgZDAsIzB4ODAKLSAgICBNT1YgICAgICByMCwjMAotICAgIEFERCAgICAgIHIxMSxyMyxyNQotICAgIEFERCAgICAgIHIxMixyNSxyNQotICAgIEIgICAgICAgIEwweDU4Ci1PTVhfVkNfNHg0X0RJQUdfREw6Ci0gICAgVFNUICAgICAgcjcsIzB4NDAKLSAgICBCRVEgICAgICBMMHgxMzgKLSAgICBWTEQxLjggICB7ZDN9LFtyMV0KLSAgICBWRFVQLjggICBkMixkM1s3XQotICAgIFZFWFQuOCAgIGQ0LGQzLGQyLCMxCi0gICAgVkVYVC44ICAgZDUsZDMsZDIsIzIKLSAgICBCICAgICAgICBMMHgxNGMKLUwweDEzODoKLSAgICBWTEQxLjMyICB7ZDBbMV19LFtyMV0KLSAgICBWRFVQLjggICBkMixkMFs3XQotICAgIFZFWFQuOCAgIGQzLGQwLGQyLCM0Ci0gICAgVkVYVC44ICAgZDQsZDAsZDIsIzUKLSAgICBWRVhULjggICBkNSxkMCxkMiwjNgotTDB4MTRjOgotICAgIFZIQURELlU4IGQ2LGQzLGQ1Ci0gICAgVlJIQURELlU4IGQ2LGQ2LGQ0Ci0gICAgVlNUMS4zMiAge2Q2WzBdfSxbcjNdLHI1Ci0gICAgVkVYVC44ICAgZDYsZDYsZDYsIzEKLSAgICBWU1QxLjMyICB7ZDZbMF19LFtyM10scjUKLSAgICBWRVhULjggICBkNixkNixkNiwjMQotICAgIFZTVDEuMzIgIHtkNlswXX0sW3IzXSxyNQotICAgIFZFWFQuOCAgIGQ2LGQ2LGQ2LCMxCi0gICAgVlNUMS4zMiAge2Q2WzBdfSxbcjNdCi0gICAgQiAgICAgICAgTDB4MzQ4Ci1PTVhfVkNfNHg0X0RJQUdfRFI6Ci0gICAgVkxEMS4zMiAge2QwWzBdfSxbcjFdCi0gICAgVkxEMS44ICAge2QxWzddfSxbcjJdCi0gICAgQUREICAgICAgcjkscjAscjQKLSAgICBBREQgICAgICByMTAscjQscjQKLSAgICBBREQgICAgICByMSxyMyxyNQotICAgIFZMRDEuOCAgIHtkMVs2XX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDFbNV19LFtyOV0scjEwCi0gICAgVkxEMS44ICAge2QxWzRdfSxbcjBdCi0gICAgVkxEMS44ICAge2QxWzNdfSxbcjldCi0gICAgVkVYVC44ICAgZDMsZDEsZDAsIzMKLSAgICBBREQgICAgICByNCxyMSxyNQotICAgIFZFWFQuOCAgIGQ0LGQxLGQwLCM0Ci0gICAgQUREICAgICAgcjYscjQscjUKLSAgICBWRVhULjggICBkNSxkMSxkMCwjNQotICAgIFZIQURELlU4IGQ2LGQzLGQ1Ci0gICAgVlJIQURELlU4IGQ2LGQ2LGQ0Ci0gICAgVlNUMS4zMiAge2Q2WzBdfSxbcjZdCi0gICAgVkVYVC44ICAgZDYsZDYsZDYsIzEKLSAgICBWU1QxLjMyICB7ZDZbMF19LFtyNF0KLSAgICBWRVhULjggICBkNixkNixkNiwjMQotICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxXQotICAgIFZFWFQuOCAgIGQ2LGQ2LGQ2LCMxCi0gICAgVlNUMS4zMiAge2Q2WzBdfSxbcjNdCi0gICAgQiAgICAgICAgTDB4MzQ4Ci1PTVhfVkNfNHg0X1ZSOgotICAgIFZMRDEuMzIgIHtkMFswXX0sW3IxXQotICAgIFZMRDEuOCAgIHtkMFs3XX0sW3IyXQotICAgIFZMRDEuOCAgIHtkMVs3XX0sW3IwXSxyNAotICAgIFZMRDEuOCAgIHtkMls3XX0sW3IwXSxyNAotICAgIFZMRDEuOCAgIHtkMVs2XX0sW3IwXQotICAgIFZFWFQuOCAgIGQxMixkMCxkMCwjNwotICAgIFZFWFQuOCAgIGQzLGQxLGQxMiwjNgotICAgIFZFWFQuOCAgIGQ0LGQyLGQxMiwjNwotICAgIFZFWFQuOCAgIGQ1LGQxLGQwLCM3Ci0gICAgVkVYVC44ICAgZDYsZDIsZDAsIzcKLSAgICBWRVhULjggICBkMTEsZDEsZDEyLCM3Ci0gICAgVkhBREQuVTggZDgsZDYsZDEyCi0gICAgVlJIQURELlU4IGQ4LGQ4LGQxMQotICAgIFZIQURELlU4IGQ3LGQzLGQ1Ci0gICAgVlJIQURELlU4IGQ3LGQ3LGQ0Ci0gICAgVkVYVC44ICAgZDEwLGQ4LGQ4LCMxCi0gICAgQUREICAgICAgcjExLHIzLHI1Ci0gICAgQUREICAgICAgcjEyLHI1LHI1Ci0gICAgVkVYVC44ICAgZDksZDcsZDcsIzEKLSAgICBWU1QxLjMyICB7ZDEwWzBdfSxbcjNdLHIxMgotICAgIFZTVDEuMzIgIHtkOVswXX0sW3IxMV0scjEyCi0gICAgVlNUMS4zMiAge2Q4WzBdfSxbcjNdLHIxMgotICAgIFZTVDEuMzIgIHtkN1swXX0sW3IxMV0KLSAgICBCICAgICAgICBMMHgzNDgKLU9NWF9WQ180eDRfSEQ6Ci0gICAgVkxEMS44ICAge2QwfSxbcjFdCi0gICAgVkxEMS44ICAge2QxWzddfSxbcjJdCi0gICAgQUREICAgICAgcjkscjAscjQKLSAgICBBREQgICAgICByMTAscjQscjQKLSAgICBWTEQxLjggICB7ZDFbNl19LFtyMF0scjEwCi0gICAgVkxEMS44ICAge2QxWzVdfSxbcjldLHIxMAotICAgIFZMRDEuOCAgIHtkMVs0XX0sW3IwXQotICAgIFZMRDEuOCAgIHtkMVszXX0sW3I5XQotICAgIFZFWFQuOCAgIGQzLGQxLGQwLCMzCi0gICAgVkVYVC44ICAgZDQsZDEsZDAsIzIKLSAgICBWRVhULjggICBkNSxkMSxkMCwjMQotICAgIFZIQURELlU4IGQ3LGQzLGQ1Ci0gICAgVlJIQURELlU4IGQ3LGQ3LGQ0Ci0gICAgVlJIQURELlU4IGQ4LGQ0LGQzCi0gICAgVlNITC5JNjQgZDgsZDgsIzI0Ci0gICAgVlNITC5JNjQgZDYsZDcsIzE2Ci0gICAgVlpJUC44ICAgZDgsZDYKLSAgICBWRVhULjggICBkNyxkNyxkNywjNgotICAgIFZFWFQuOCAgIGQ4LGQ2LGQ3LCMyCi0gICAgQUREICAgICAgcjExLHIzLHI1Ci0gICAgQUREICAgICAgcjEyLHI1LHI1Ci0gICAgVlNUMS4zMiAge2Q4WzFdfSxbcjNdLHIxMgotICAgIFZTVDEuMzIgIHtkNlsxXX0sW3IxMV0scjEyCi0gICAgVlNUMS4zMiAge2Q4WzBdfSxbcjNdCi0gICAgVlNUMS4zMiAge2Q2WzBdfSxbcjExXQotICAgIEIgICAgICAgIEwweDM0OAotT01YX1ZDXzR4NF9WTDoKLSAgICBUU1QgICAgICByNywjMHg0MAotICAgIEJFUSAgICAgIEwweDJiNAotICAgIFZMRDEuOCAgIHtkM30sW3IxXQotICAgIFZFWFQuOCAgIGQ0LGQzLGQzLCMxCi0gICAgVkVYVC44ICAgZDUsZDQsZDQsIzEKLSAgICBCICAgICAgICBMMHgyYzgKLUwweDJiNDoKLSAgICBWTEQxLjMyICB7ZDBbMV19LFtyMV0KLSAgICBWRFVQLjggICBkMixkMFs3XQotICAgIFZFWFQuOCAgIGQzLGQwLGQyLCM0Ci0gICAgVkVYVC44ICAgZDQsZDAsZDIsIzUKLSAgICBWRVhULjggICBkNSxkMCxkMiwjNgotTDB4MmM4OgotICAgIFZSSEFERC5VOCBkNyxkNCxkMwotICAgIFZIQURELlU4IGQxMCxkMyxkNQotICAgIFZSSEFERC5VOCBkMTAsZDEwLGQ0Ci0gICAgVkVYVC44ICAgZDgsZDcsZDcsIzEKLSAgICBBREQgICAgICByMTEscjMscjUKLSAgICBBREQgICAgICByMTIscjUscjUKLSAgICBWRVhULjggICBkOSxkMTAsZDgsIzEKLSAgICBWU1QxLjMyICB7ZDdbMF19LFtyM10scjEyCi0gICAgVlNUMS4zMiAge2QxMFswXX0sW3IxMV0scjEyCi0gICAgVlNUMS4zMiAge2Q4WzBdfSxbcjNdCi0gICAgVlNUMS4zMiAge2Q5WzBdfSxbcjExXQotICAgIEIgICAgICAgIEwweDM0OAotT01YX1ZDXzR4NF9IVToKLSAgICBBREQgICAgICByOSxyMCxyNAotICAgIEFERCAgICAgIHIxMCxyNCxyNAotICAgIFZMRDEuOCAgIHtkMVs0XX0sW3IwXSxyMTAKLSAgICBWTEQxLjggICB7ZDFbNV19LFtyOV0scjEwCi0gICAgVkxEMS44ICAge2QxWzZdfSxbcjBdCi0gICAgVkxEMS44ICAge2QxWzddfSxbcjldCi0gICAgVkRVUC44ICAgZDIsZDFbN10KLSAgICBWRVhULjggICBkMyxkMSxkMiwjNAotICAgIFZFWFQuOCAgIGQ0LGQxLGQyLCM1Ci0gICAgVkVYVC44ICAgZDUsZDEsZDIsIzYKLSAgICBWSEFERC5VOCBkNyxkMyxkNQotICAgIFZSSEFERC5VOCBkNyxkNyxkNAotICAgIFZSSEFERC5VOCBkOCxkNCxkMwotICAgIFZaSVAuOCAgIGQ4LGQ3Ci0gICAgVlNUMS4zMiAge2Q4WzBdfSxbcjNdLHI1Ci0gICAgVkVYVC44ICAgZDgsZDgsZDgsIzIKLSAgICBWU1QxLjMyICB7ZDhbMF19LFtyM10scjUKLSAgICBWRVhULjggICBkOCxkOCxkOCwjMgotICAgIFZTVDEuMzIgIHtkOFswXX0sW3IzXSxyNQotICAgIFZTVDEuMzIgIHtkN1swXX0sW3IzXQotTDB4MzQ4OgotICAgIE1PViAgICAgIHIwLCMwCi0gICAgVlBPUCAgICAge2Q4LWQxMn0KLSAgICBQT1AgICAgICB7cjQtcjEyLHBjfQotCi0gICAgLmVuZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRmNTEwMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qCi0gKgotICovCi0KLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLQotICAgIC5hcm0KLSAgICAuZnB1IG5lb24KLSAgICAudGV4dAotICAgIC5zeW50YXggdW5pZmllZAotCi0gICAgLmdsb2JhbCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyCi1vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyOgotICAgIHB1c2ggICAge3I0LXIxMCwgbHJ9Ci0gICAgbGRyICAgICByOSwgW3IwLCMwXQotICAgIHZtb3YuaTE2ICAgIGQwLCAjMAotICAgIG1vdiAgICAgcjgsICMweDFmCi0gICAgdnN0MS4xNiAgICB7ZDB9LCBbcjFdCi0gICAgbGRyYiAgICByNiwgW3I5XSwgIzEKLXVucGFja0xvb3A6Ci0gICAgdHN0ICAgICByNiwgIzB4MTAKLSAgICBsZHJzYm5lIHI1LCBbcjksICMxXQotICAgIGxkcmJuZSAgcjQsIFtyOV0sICMyCi0gICAgYW5kICAgICByNywgcjgsIHI2LCBsc2wgIzEKLSAgICBsZHJzYmVxIHI0LCBbcjldLCAjMQotICAgIG9ycm5lICAgcjQsIHI0LCByNSwgbHNsICM4Ci0gICAgdHN0ICAgICByNiwgIzB4MjAKLSAgICBsZHJiZXEgIHI2LCBbcjldLCAjMQotICAgIHN0cmggICAgcjQsIFtyMSwgcjddCi0gICAgYmVxICAgICB1bnBhY2tMb29wCi0gICAgbGRtaWEgICByMSwge3IzLCByNH0KLSAgICBzdHIgICAgIHI5LCBbcjAsICMwXQotICAgIGxkciAgICAgcjUsIC5MYXJtVkNNNFAxMF9RUERpdlRhYmxlCi1QMDogYWRkICAgICByNSwgcGMKLSAgICBsZHIgICAgIHI2LCAuTGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKLVAxOiBhZGQgICAgIHI2LCBwYwotICAgIHNhZGRzdWJ4ICAgICAgICByMywgcjMsIHIzCi0gICAgc2FkZHN1YnggICAgICAgIHI0LCByNCwgcjQKLSAgICBsZHJzYiAgIHI5LCBbcjUsIHIyXQotICAgIGxkcnNiICAgcjIsIFtyNiwgcjJdCi0gICAgc2FkZDE2ICByNSwgcjMsIHI0Ci0gICAgc3N1YjE2ICByNiwgcjMsIHI0Ci0gICAgbHNsICAgICByMiwgcjIsIHI5Ci0gICAgdm1vdiAgICBkMCwgcjUsIHI2Ci0gICAgdnJldjMyLjE2ICBkMCwgZDAKLSAgICB2ZHVwLjE2ICAgIGQxLCByMgotICAgIHZtdWxsLnMxNiAgIHExLCBkMCwgZDEKLSAgICB2c2hybi5pMzIgICBkMiwgcTEsICMxCi0gICAgdnN0MS4xNiAgICB7ZDJ9LCBbcjFdCi0gICAgbW92ICAgICByMCwgIzAKLSAgICBwb3AgICAgIHtyNC1yMTAsIHBjfQotCi0uTGFybVZDTTRQMTBfUVBEaXZUYWJsZToKLSAgICAud29yZCBhcm1WQ000UDEwX1FQRGl2VGFibGUtKFAwKzgpCi0uTGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGU6Ci0gICAgLndvcmQgYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZS0oUDErOCkKLQotICAgIC5lbmQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAxMDMwYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLlMKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKgotICoKLSAqLwotCi0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCi0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0Ci1hcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQ6Ci0gICAgUFVTSCAgICAge3I0LXI2LGxyfQotICAgIFZQVVNIICAgIHtkOC1kMTN9Ci0gICAgVkxENC4xNiAge2QwLGQxLGQyLGQzfSxbcjBdCi0gICAgTERSICAgICAgcjIsIC5MYXJtVkNNNFAxMF9RUERpdlRhYmxlCi1QMDogQUREICAgICAgcjIsIHBjCi0gICAgTERSICAgICAgcjMsIC5MYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQotUDE6IEFERCAgICAgIHIzLCBwYwotICAgIFZBREQuSTE2IGQ0LGQwLGQxCi0gICAgVkFERC5JMTYgZDUsZDIsZDMKLSAgICBWU1VCLkkxNiBkNixkMCxkMQotICAgIExEUlNCICAgIHI0LFtyMixyMV0KLSAgICBWU1VCLkkxNiBkNyxkMixkMwotICAgIExEUlNCICAgIHI1LFtyMyxyMV0KLSAgICBWQURELkkxNiBkMCxkNCxkNQotICAgIFZTVUIuSTE2IGQxLGQ0LGQ1Ci0gICAgVlNVQi5JMTYgZDIsZDYsZDcKLSAgICBMU0wgICAgICByNSxyNSxyNAotICAgIFZBREQuSTE2IGQzLGQ2LGQ3Ci0gICAgVlRSTi4xNiAgZDAsZDEKLSAgICBWVFJOLjE2ICBkMixkMwotICAgIFZUUk4uMzIgIHEwLHExCi0gICAgVkFERC5JMTYgZDQsZDAsZDEKLSAgICBWQURELkkxNiBkNSxkMixkMwotICAgIFZTVUIuSTE2IGQ2LGQwLGQxCi0gICAgVlNVQi5JMTYgZDcsZDIsZDMKLSAgICBWQURELkkxNiBkMCxkNCxkNQotICAgIFZTVUIuSTE2IGQxLGQ0LGQ1Ci0gICAgVlNVQi5JMTYgZDIsZDYsZDcKLSAgICBWQURELkkxNiBkMyxkNixkNwotICAgIFZEVVAuMTYgIGQ1LHI1Ci0gICAgVk1PVi5JMzIgcTMsIzB4MgotICAgIFZNT1YuSTMyIHE0LCMweDIKLSAgICBWTU9WLkkzMiBxNSwjMHgyCi0gICAgVk1PVi5JMzIgcTYsIzB4MgotICAgIFZNTEFMLlMxNiBxMyxkMCxkNQotICAgIFZNTEFMLlMxNiBxNCxkMSxkNQotICAgIFZNTEFMLlMxNiBxNSxkMixkNQotICAgIFZNTEFMLlMxNiBxNixkMyxkNQotICAgIFZTSFJOLkkzMiBkMCxxMywjMgotICAgIFZTSFJOLkkzMiBkMSxxNCwjMgotICAgIFZTSFJOLkkzMiBkMixxNSwjMgotICAgIFZTSFJOLkkzMiBkMyxxNiwjMgotICAgIFZTVDEuMTYgIHtkMCxkMSxkMixkM30sW3IwXQotICAgIFZQT1AgICAgIHtkOC1kMTN9Ci0gICAgUE9QICAgICAge3I0LXI2LHBjfQotCi0uTGFybVZDTTRQMTBfUVBEaXZUYWJsZToKLSAgICAud29yZCBhcm1WQ000UDEwX1FQRGl2VGFibGUtKFAwKzgpCi0uTGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGU6Ci0gICAgLndvcmQgYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZS0oUDErOCkKLQotLmdsb2JhbCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcgotb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXI6Ci0gICAgUFVTSCAgICAge3I0LXI2LGxyfQotICAgIE1PViAgICAgIHI0LHIxCi0gICAgTU9WICAgICAgcjUscjIKLSAgICBCTCAgICAgICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0Ci0gICAgTU9WICAgICAgcjAscjQKLSAgICBNT1YgICAgICByMSxyNQotICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NAotICAgIE1PViAgICAgIHIwLCMwCi0gICAgUE9QICAgICAge3I0LXI2LHBjfQotCi0gICAgLmVuZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNiYzVmZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICAxMjI5MAotICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICoKLSAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXMuaAotICogRGVzY3JpcHRpb246IERlY2xhcmVzIFRhYmxlcyB1c2VkIGZvciBIdWZmZm1hbiBjb2RpbmcgYW5kIGRlY29kaW5nIAotICogICAgICAgICAgICAgIGluIE1QNFAyIGNvZGVjLgotICoKLSAqLwotIAotI2lmbmRlZiBfT01YSFVGRlRBQl9IXwotI2RlZmluZSBfT01YSFVGRlRBQl9IXwotCi0KLWV4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9JbnRyYVZsY0wwTDFbMjAwXTsKLQotCi1leHRlcm4gY29uc3QgT01YX1UxNiBhcm1WQ000UDJfSW50ZXJWbGNMMEwxWzIwMF07Ci0KLWV4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hSW50cmFEQ0x1bWFDaHJvbWFJbmRleFs2NF07Ci0vL2V4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hSW50cmFEQ0Nocm9tYUluZGV4WzMyXTsKLWV4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hVmxjTVZEWzEyNF07Ci0KLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMMUxNQVhbNzNdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMEwxUk1BWFszNV07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYWzUzXTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMMVJNQVhbNDBdCi0KLSNlbmRpZiAvKiBfT01YSFVGRlRBQl9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ2NGE2OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDEyMjkwCi0gKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKgotICogRmlsZTogICAgICAgIGFybVZDTTRQMl9aaWd6YWdfVGFibGVzLmgKLSAqIERlc2NyaXB0aW9uOiBEZWNsYXJlcyBUYWJsZXMgdXNlZCBmb3IgWmlnemFnIHNjYW4gaW4gTVA0UDIgY29kZWMuCi0gKgotICovCi0gCi0jaWZuZGVmIF9PTVhaSUdaQUdUQUJfSAotI2RlZmluZSBfT01YWklHWkFHVEFCX0gKLQotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gWzE5Ml07Ci0vL2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FIb3Jpem9udGFsWmlnemFnU2NhbiBbNjRdOwotLy9leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9hVmVydGljYWxaaWd6YWdTY2FuIFs2NF07Ci0KLSNlbmRpZiAvKiBfT01YWklHWkFHVEFCX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NsaXA4X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjgzMGZjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsgLyoqCi07ICogCi07ICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0NsaXA4X3MucwotOyAqIE9wZW5NQVggREw6IHYxLjAuMgotOyAqIFJldmlzaW9uOiAgIDEyMjkwCi07ICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07ICogCi07ICogCi07ICogCi07ICoKLTsgKiBEZXNjcmlwdGlvbjogCi07ICogQ29udGFpbnMgbW9kdWxlIGZvciBDbGlwcGluZyAxNiBiaXQgdmFsdWUgdG8gWzAsMjU1XSBSYW5nZQotOyAqLyAKLQotICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgIAotCi0gICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0KLSAgICAgIElGIENvcnRleEE4Ci07Ly9JbnB1dCBBcmd1bWVudHMKLQotcFNyYyAgICAgICAgICAgICAgICAgUk4gMAotcERzdCAgICAgICAgICAgICAgICAgUk4gMQotc3RlcCAgICAgICAgICAgICAgICAgUk4gMgotCi07Ly8gTmVvbiBSZWdpc3RlcnMKLQotcXgwICAgICAgICAgICAgICAgICAgUU4gIFEwLlMxNiAgICAgICAgICAgICAgICAgIAotZHgwMCAgICAgICAgICAgICAgICAgRE4gIEQwLlMxNgotZHgwMSAgICAgICAgICAgICAgICAgRE4gIEQxLlMxNgotcXgxICAgICAgICAgICAgICAgICAgUU4gIFExLlMxNgotZHgxMCAgICAgICAgICAgICAgICAgRE4gIEQyLlMxNgotZHgxMSAgICAgICAgICAgICAgICAgRE4gIEQzLlMxNgotCi1xeDIgICAgICAgICAgICAgICAgICBRTiAgUTIuUzE2ICAgICAgICAgICAgICAgICAgCi1keDIwICAgICAgICAgICAgICAgICBETiAgRDQuUzE2Ci1keDIxICAgICAgICAgICAgICAgICBETiAgRDUuUzE2Ci1xeDMgICAgICAgICAgICAgICAgICBRTiAgUTMuUzE2Ci1keDMwICAgICAgICAgICAgICAgICBETiAgRDYuUzE2Ci1keDMxICAgICAgICAgICAgICAgICBETiAgRDcuUzE2Ci0KLQotZGNsaXAwICAgICAgICAgICAgICAgRE4gIEQwLlU4Ci1kY2xpcDEgICAgICAgICAgICAgICBETiAgRDIuVTggCi1kY2xpcDIgICAgICAgICAgICAgICBETiAgRDQuVTgKLWRjbGlwMyAgICAgICAgICAgICAgIEROICBENi5VOAotIAotICAgICAgIE1fU1RBUlQgYXJtVkNNNFAyX0NsaXA4Ci0KLSAgICAgICBWTEQxICAgICAgICAgIHtkeDAwLGR4MDEsZHgxMCxkeDExfSxbcFNyY10hICAgICAgICAgIDsvLyBMb2FkIDE2IGVudHJpZXMgZnJvbSBwU3JjCi0gICAgICAgVkxEMSAgICAgICAgICB7ZHgyMCxkeDIxLGR4MzAsZHgzMX0sW3BTcmNdISAgICAgICAgICA7Ly8gTG9hZCBuZXh0IDE2IGVudHJpZXMgZnJvbSBwU3JjICAKLSAgICAgICBWUVNIUlVOICAgICAgIGRjbGlwMCxxeDAsIzAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkY2xpcDBbaV09Y2xpcCBxeDBbaV0gdG8gWzAsMjU1XQotICAgICAgIFZRU0hSVU4gICAgICAgZGNsaXAxLHF4MSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRjbGlwMVtpXT1jbGlwIHF4MVtpXSB0byBbMCwyNTVdCi0gICAgICAgVlNUMSAgICAgICAgICB7ZGNsaXAwfSxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgOCBieXRlcyBhbmQgcERzdD1wRHN0K3N0ZXAKLSAgICAgICBWU1QxICAgICAgICAgIHtkY2xpcDF9LFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSA4IGJ5dGVzIGFuZCBwRHN0PXBEc3Qrc3RlcAotICAgICAgIFZRU0hSVU4gICAgICAgZGNsaXAyLHF4MiwjMAotICAgICAgIFZRU0hSVU4gICAgICAgZGNsaXAzLHF4MywjMAotICAgICAgIFZTVDEgICAgICAgICAge2RjbGlwMn0sW3BEc3RdLHN0ZXAKLSAgICAgICBWU1QxICAgICAgICAgIHtkY2xpcDN9LFtwRHN0XSxzdGVwCi0gICAgICAgCi0gICAgICAgVkxEMSAgICAgICAgICB7ZHgwMCxkeDAxLGR4MTAsZHgxMX0sW3BTcmNdISAgICAgICAgICA7Ly8gTG9hZCAxNiBlbnRyaWVzIGZyb20gcFNyYwotICAgICAgIFZMRDEgICAgICAgICAge2R4MjAsZHgyMSxkeDMwLGR4MzF9LFtwU3JjXSEgICAgICAgICAgOy8vIExvYWQgbmV4dCAxNiBlbnRyaWVzIGZyb20gcFNyYyAgCi0gICAgICAgVlFTSFJVTiAgICAgICBkY2xpcDAscXgwLCMwICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZGNsaXAwW2ldPWNsaXAgcXgwW2ldIHRvIFswLDI1NV0KLSAgICAgICBWUVNIUlVOICAgICAgIGRjbGlwMSxxeDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkY2xpcDFbaV09Y2xpcCBxeDFbaV0gdG8gWzAsMjU1XQotICAgICAgIFZTVDEgICAgICAgICAge2RjbGlwMH0sW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIDggYnl0ZXMgYW5kIHBEc3Q9cERzdCtzdGVwCi0gICAgICAgVlNUMSAgICAgICAgICB7ZGNsaXAxfSxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgOCBieXRlcyBhbmQgcERzdD1wRHN0K3N0ZXAKLSAgICAgICBWUVNIUlVOICAgICAgIGRjbGlwMixxeDIsIzAKLSAgICAgICBWUVNIUlVOICAgICAgIGRjbGlwMyxxeDMsIzAKLSAgICAgICBWU1QxICAgICAgICAgIHtkY2xpcDJ9LFtwRHN0XSxzdGVwCi0gICAgICAgVlNUMSAgICAgICAgICB7ZGNsaXAzfSxbcERzdF0sc3RlcAotCi0KLSAgICAgICAKLSAgICAgICAgTV9FTkQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgIAotICAgICAgICAKLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE2ZTY1Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDEyICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07LyoqCi07ICogCi07ICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zCi07ICogT3Blbk1BWCBETDogdjEuMC4yCi07ICogUmV2aXNpb246ICAgMTIyOTAKLTsgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsgKiAKLTsgKiAKLTsgKiAKLTsgKgotOyAqIERlc2NyaXB0aW9uOiAKLTsgKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBkZWNvZGluZwotOyAqIGZvciBpbnRlciwgaW50cmEgYmxvY2suCi07ICoKLTsgKgotOyAqCi07ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCi07ICoKLTsgKiBEZXNjcmlwdGlvbjoKLTsgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gCi07ICoKLTsgKiAKLTsgKgotOyAqIAotOyAqLwotCi0KLSAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAotCi0KLSAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgCi0KLQotCi0gICAgIElGIEFSTTExMzZKUwotICAgICAKLSAgICAgICAgCi0KLQotCi07Ly9JbnB1dCBBcmd1bWVudHMKLQotcHBCaXRTdHJlYW0gICAgICAgICAgUk4gMAotcEJpdE9mZnNldCAgICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgICAgICAgUk4gMgotc2hvcnRWaWRlb0hlYWRlciAgICAgUk4gMwotCi0KLTsvL0xvY2FsIFZhcmlhYmxlcwotCi1SZXR1cm4gICAgICAgICAgICAgICBSTiAwCi0KLXBWbGNUYWJsZUwwTDEgICAgICAgIFJOIDQKLXBMTUFYVGFibGVMMEwxICAgICAgIFJOIDQKLXBSTUFYVGFibGVMMEwxICAgICAgIFJOIDQKLXBaaWd6YWdUYWJsZSAgICAgICAgIFJOIDQKLQotZnR5cGUgICAgICAgICAgICAgICAgUk4gMAotdGVtcDMgICAgICAgICAgICAgICAgUk4gNAotdGVtcCAgICAgICAgICAgICAgICAgUk4gNQotQ291bnQgICAgICAgICAgICAgICAgUk4gNgotRXNjYXBlICAgICAgICAgICAgICAgUk4gNQotCi07Ly8gYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKLXppZ3phZyAgICAgICAgICAgICAgIFJOIDAKLXN0b3JlTGV2ZWwgICAgICAgICAgIFJOIDEKLXRlbXAyICAgICAgICAgICAgICAgIFJOIDQKLXRlbXAxICAgICAgICAgICAgICAgIFJOIDUKLXNpZ24gICAgICAgICAgICAgICAgIFJOIDUKLUxhc3QgICAgICAgICAgICAgICAgIFJOIDcKLXN0b3JlUnVuICAgICAgICAgICAgIFJOIDE0Ci0KLQotcGFja1JldEluZGV4ICAgICAgICAgUk4gNQotCi0KLW1hcmtlcmJpdCAgICAgICAgICAgIFJOIDUKLQotOy8vIFNjcmF0Y2ggUmVnaXN0ZXJzCi0KLVJCaXRTdHJlYW0gICAgICAgICAgIFJOIDgKLVJCaXRCdWZmZXIgICAgICAgICAgIFJOIDkKLVJCaXRDb3VudCAgICAgICAgICAgIFJOIDEwCi0KLVQxICAgICAgICAgICAgICAgICAgIFJOIDExCi1UMiAgICAgICAgICAgICAgICAgICBSTiAxMgotTFIgICAgICAgICAgICAgICAgICAgUk4gMTQgICAgICAgIAotICAgICAgICAKLQotCi0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcHBCaXRTdHJlYW0sNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBPZmZzZXQsNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcExpbmtSZWdpc3Rlciw0ICAgICAgIAotICAgICAgICAKLSAgICAgICAgTV9TVEFSVCBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZQotCi0gICAgICAgIDsvLyBnZXQgdGhlIHRhYmxlIGFkZHJlc3NlcyBmcm9tIHN0YWNrICAgICAgIAotICAgICAgICBNX0FSRyAgICAgICAgICAgcHBWbGNUYWJsZUwwTDEsNAotICAgICAgICBNX0FSRyAgICAgICAgICAgcHBMTUFYVGFibGVMMEwxLDQKLSAgICAgICAgTV9BUkcgICAgICAgICAgIHBwUk1BWFRhYmxlTDBMMSw0Ci0gICAgICAgIE1fQVJHICAgICAgICAgICBwcFppZ3phZ1RhYmxlLDQKLSAgICAgICAgCi0gICAgICAgIDsvLyBTdG9yZSBBTEwgemVyb3MgYXQgcERzdAotICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgICAgIHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbml0aWFsaXplIENvdW50IHRvIHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBNT1YgICAgICAgICAgICAgTGFzdCwjMAotICAgICAgICBNX1NUUiAgICAgICAgICAgTFIscExpbmtSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIExpbmsgUmVnaXN0ZXIgb24gU3RhY2sKLSAgICAgICAgTU9WICAgICAgICAgICAgIHRlbXAyLCMwCi0gICAgICAgIE1PViAgICAgICAgICAgICBMUiwjMCAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBJbml0aWFsaXplIHRoZSBNYWNybyBhbmQgU3RvcmUgYWxsIHplcm9zIHRvIHBEc3QgCi0gIAotICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9ICAgICAgICAgICAgICAgICAgIAotICAgICAgICBNX0JEX0lOSVQwICAgICAgcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIFJCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudCAgCi0gICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KLSAgICAgICAgTV9CRF9JTklUMSAgICAgIFQxLCBUMiwgVDIKLSAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQotICAgICAgICBNX0JEX0lOSVQyICAgICAgVDEsIFQyLCBUMgotICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9Ci0gICAgICAgIE1fU1RSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcHBCaXRzdHJlYW0gb24gc3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwQml0T2Zmc2V0IG9uIHN0YWNrCi0gICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KLSAgICAgICAgCi0gICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KLSAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQotIAotICAgICAgICAKLSAgICAgICAgU1VCICAgICAgICAgICAgIHBEc3QscERzdCwjMTI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBSZXN0b3JlIHBEc3QKLQotICAgICAgICA7Ly8gVGhlIGFybVZDTTRQMl9HZXRWTENCaXRzIGJlZ2lucwotCi1nZXRWTENiaXRzCi0gICAgICAgIAotICAgICAgICBNX0JEX0xPT0s4ICAgICAgRXNjYXBlLDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgRXNjYXBlIFZhbHVlCi0gICAgICAgIExTUiAgICAgICAgICAgICBFc2NhcGUsRXNjYXBlLCMyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIENNUCAgICAgICAgICAgICBFc2NhcGUsIzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY2hlY2sgZm9yIGVzY2FwZSBtb2RlCi0gICAgICAgIE1PVk5FICAgICAgICAgICBmdHlwZSwjMAotICAgICAgICBCTkUgICAgICAgICAgICAgbm90RXNjYXBlbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCBpZiBub3QgaW4gRXNjYXBlIG1vZGUgMwotCi0gICAgICAgIE1fQkRfVlNLSVA4ICAgICAjNyxUMQotICAgICAgICBDTVAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlciwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIHNob3J0VmlkZW9IZWFkZXIgZmxhZyB0byBrbm93IHRoZSB0eXBlIG9mIEVzY2FwZSBtb2RlCi0gICAgICAgIEJFUSAgICAgICAgICAgICBlbmRGaWxsVkxEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gRXNjYXBlIE1vZGUgNAotCi0gICAgICAgIE1fQkRfUkVBRDggICAgICBMYXN0LDEsVDEKLSAgICAgICAgTV9CRF9SRUFEOCAgICAgIHN0b3JlUnVuLDYsVDEKLSAgICAgICAgTV9CRF9SRUFEOCAgICAgIHN0b3JlTGV2ZWwsOCxUMQotCi0gICAgICAgICAgIAotICAgICAgICA7Ly8gQ2hlY2sgd2hldGhlciB0aGUgUmVzZXJ2ZWQgdmFsdWVzIGZvciBMZXZlbCBhcmUgdXNlZCBhbmQgRXhpdCB3aXRoIGFuIEVycm9yIE1lc3NhZ2UgaWYgaXQgaXMgc28KLQotICAgICAgICBURVEgICAgICAgICAgICAgc3RvcmVMZXZlbCwjMAotICAgICAgICBURVFORSAgICAgICAgICAgc3RvcmVMZXZlbCwjMTI4ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvcgotCi0gICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wMixzdG9yZVJ1bixDb3VudAotICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDIsIzY0Ci0gICAgICAgIEJHRSAgICAgICAgICAgICBFeGl0RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZXJyb3IgaWYgQ291bnQrc3RvcmVSdW4gPj0gNjQKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gTG9hZCBhZGRyZXNzIG9mIHppZ3phZ1RhYmxlCi0gICAgICAgIAotICAgICAgICBNX0xEUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWRpbmcgdGhlIEFkZHJlc3Mgb2YgWmlnemFnIHRhYmxlCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgOy8vIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIFNYVEIgICAgICAgICAgICBzdG9yZUxldmVsLHN0b3JlTGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2lnbiBFeHRlbmQgc3RvcmVMZXZlbCB0byAzMiBiaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIDsvLyBUbyBSZWZsZWN0IFJ1bmxlbmd0aAotCi0gICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCxzdG9yZVJ1bgotICAgICAgICBMRFJCICAgICAgICAgICAgemlnemFnLFtwWmlnemFnVGFibGUsQ291bnRdCi0gICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCwjMQotICAgICAgICBTVFJIICAgICAgICAgICAgc3RvcmVMZXZlbCxbcERzdCx6aWd6YWddICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIExldmVsCi0gICAgICAgICAgICAgIAotICAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9rCi0gICAgICAgCi0gICAgICAgIAotCi1lbmRGaWxsVkxECi0gICAgICAgIAotICAgICAgICAgICAgICAgCi0gICAgICAgIDsvLyBMb2FkIEZ0eXBlKCBFc2NhcGUgTW9kZSkgdmFsdWUgYmFzZWQgb24gdGhlIHR3byBzdWNjZXNzaXZlIGJpdHMgaW4gdGhlIGJpdHN0cmVhbQotICAgICAKLSAgICAgICAgTV9CRF9SRUFEOCAgICAgIHRlbXAxLDEsVDEgICAgICAgICAgIAotICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzAgICAgCi0gICAgICAgIE1PVkVRICAgICAgICAgICBmdHlwZSwjMQotICAgICAgICBCRVEgICAgICAgICAgICAgbm90RXNjYXBlbW9kZQotICAgICAgICBNX0JEX1JFQUQ4ICAgICAgdGVtcDEsMSxUMQotICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzEKLSAgICAgICAgTU9WRVEgICAgICAgICAgIGZ0eXBlLCMzCi0gICAgICAgIE1PVk5FICAgICAgICAgICBmdHlwZSwjMgotICAgICAgICAKLQotbm90RXNjYXBlbW9kZQotCi0gICAgICAgIDsvLyBMb2FkIG9wdGltaXplZCBwYWNrZWQgVkxDIHRhYmxlIHdpdGggbGFzdD0wIGFuZCBMYXN0PTEKLSAgICAgICAgCi0gICAgICAgIE1fTERSICAgICAgICAgICBwVmxjVGFibGVMMEwxLHBwVmxjVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBDb21iaW5lZCBWTEMgVGFibGUKLSAgICAgICAgICAgICAgICAKLSAgICAgICAKLSAgICAgICAgQ01QICAgICAgICAgICAgIGZ0eXBlLCMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBmdHlwZSA+PTMgZ2V0IHBlcmZvcm0gRml4ZWQgTGVuZ3RoIERlY29kaW5nIChFc2NhcGUgTW9kZSAzKQotICAgICAgICBCR0UgICAgICAgICAgICAgRXNjYXBlTW9kZTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEVsc2UgY29udGludWUgbm9ybWFsIFZMQyBEZWNvZGluZwotICAgICAgICAKLSAgICAgICAgOy8vIFZhcmlhYmxlIGxlbmdoIGRlY29kaW5nLCAiYXJtVW5QYWNrVkxDMzIiIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1fQkRfVkxEICAgICAgICBwYWNrUmV0SW5kZXgsVDEsVDIscFZsY1RhYmxlTDBMMSw0LDIKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgICAgICAgdGVtcDMsPTB4RkZGCi0gICAgICAgIAotICAgICAgICBDTVAgICAgICAgICAgICAgcGFja1JldEluZGV4LHRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGZvciBpbnZhbGlkIHN5bWJvbAotICAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGlmIGludmFsaWQgc3ltYm9sIG9jY3VycyBleGl0IHdpdGggYW4gZXJyb3IgbWVzc2FnZQotICAgICAgICAKLSAgICAgICAgQU5EICAgICAgICAgICAgIExhc3QscGFja1JldEluZGV4LCMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBHZXQgTGFzdCBmcm9tIHBhY2tlZCBJbmRleAotICAgICAgICAgICAgICAKLSAgICAgICAgIAotICAgICAgICAKLQotICAgICAgICBMU1IgICAgICAgICAgICAgc3RvcmVSdW4scGFja1JldEluZGV4LCM3ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEdldCBSdW4gVmFsdWUgZnJvbSBQYWNrZWQgaW5kZXgKLSAgICAgICAgQU5EICAgICAgICAgICAgIHN0b3JlTGV2ZWwscGFja1JldEluZGV4LCMweDdjICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZUxldmVsPXBhY2tSZXRJbmRleFsyLTZdLHN0b3JlTGV2ZWxbMC0xXT0wIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgIAotICAgICAgICBNX0xEUiAgICAgICAgICAgcExNQVhUYWJsZUwwTDEscHBMTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgOy8vIExvYWQgTE1BWCB0YWJsZQotICAgICAgICAgICAgICAKLSAgICAgICAKLSAgICAgICAgTFNSICAgICAgICAgICAgIHN0b3JlTGV2ZWwsc3RvcmVMZXZlbCwjMiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMZXZlbCB2YWx1ZQotCi0gICAgICAgIENNUCAgICAgICAgICAgICBmdHlwZSwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBCTkUgICAgICAgICAgICAgZnR5cGUyCi0gICAgICAgIAotICAgICAgICA7Ly8gZnR5cGU9PTE7IEVzY2FwZSBtb2RlID0xCi0gICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBBREQgICAgICAgICAgICB0ZW1wMSwgcExNQVhUYWJsZUwwTDEsIExhc3QsIExTTCM0ICAgICAgICAgICAgICA7Ly8gSWYgdGhlIExhc3Q9MSBhZGQgMzIgdG8gdGFibGUgYWRkcmVzcwotICAgICAgICBMRFJCICAgICAgICAgICAgdGVtcDEsW3RlbXAxLHN0b3JlUnVuXQotCi0gICAgICAgCi0gICAgICAgIEFERCAgICAgICAgICAgICBzdG9yZUxldmVsLHRlbXAxLHN0b3JlTGV2ZWwgICAgICAgICAgICAgICAgICAgICAKLQotZnR5cGUyCi0KLSAgICAgICAgOy8vIGZ0eXBlID0yOyBFc2NhcGUgbW9kZSA9MgotICAgICAgICAKLSAgICAgICAgTV9MRFIgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLHBwUk1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIFJNQVggVGFibGUgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIENNUCAgICAgICAgICAgICBmdHlwZSwjMgotICAgICAgICBCTkUgICAgICAgICAgICAgRmlsbFZMREwxCi0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgQUREICAgICAgICAgICAgdGVtcDEsIHBSTUFYVGFibGVMMEwxLCBMYXN0LCBMU0wjNCAgICAgICAgICAgICAgIDsvLyBJZiBMYXN0PTEgYWRkIDMyIHRvIHRhYmxlIGFkZHJlc3MKLSAgICAgICAgU1VCICAgICAgICAgICAgIHRlbXAyLHN0b3JlTGV2ZWwsIzEKLSAgICAgICAgTERSQiAgICAgICAgICAgIHRlbXAxLFt0ZW1wMSx0ZW1wMl0KLQotICAgICAgIAotICAgICAgICBBREQgICAgICAgICAgICAgc3RvcmVSdW4sc3RvcmVSdW4sIzEKLSAgICAgICAgQUREICAgICAgICAgICAgIHN0b3JlUnVuLHRlbXAxCi0gICAgICAgIAotRmlsbFZMREwxICAgICAgICAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICA7Ly8gYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKLQotICAgICAgICBNX0xEUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBhZGRyZXNzIG9mIHppZ3phZ1RhYmxlIAotICAgICAgICAgICAgICAgIAotICAgICAgICBNX0JEX1JFQUQ4ICAgICAgc2lnbiwxLFQxCi0KLSAgICAgICAgQ01QICAgICAgICAgICAgIHNpZ24sIzEKLSAgICAgICAgUlNCRVEgICAgICAgICAgIHN0b3JlTGV2ZWwsc3RvcmVMZXZlbCwjMAotIAotICAgICAgICBBREQgICAgICAgICAgICAgdGVtcDEsc3RvcmVSdW4sQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgUnVuICsgQ291bnQgZXhjZWVkcyA2MwotICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzY0Ci0gICAgICAgIEJHRSAgICAgICAgICAgICBFeGl0RXJyb3IKLQotICAgICAgCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICA7Ly8gVG8gUmVmbGVjdCBSdW5sZW5naHQKLQotICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsc3RvcmVSdW4KLSAKLXN0b3JlTGV2ZWxMMQotICAgICAgICAKLSAgICAgICAgTERSQiAgICAgICAgICAgIHppZ3phZyxbcFppZ3phZ1RhYmxlLENvdW50XQotICAgICAgICBDTVAgICAgICAgICAgICAgTGFzdCwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIHRoZSBMZXZlbCB2YWwgaXMgTGFzdCBub24gemVybyB2YWwKLSAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LCMxCi0gICAgICAgIExTUiAgICAgICAgICAgICBMYXN0LExhc3QsIzEKLSAgICAgICAgU1RSSCAgICAgICAgICAgIHN0b3JlTGV2ZWwsW3BEc3QsemlnemFnXSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAKLSAgICAgICAgQk5FICAgICAgICAgICAgIGVuZAotICAgICAgICAKLSAgICAgICAgQiAgICAgICAgICAgICAgIEV4aXRPawotIAotCi0KLSAgICAgICAgOy8vIEZpeGVkIExlbmdoIERlY29kaW5nIEVzY2FwZSBNb2RlIDMKLQotRXNjYXBlTW9kZTMKLQotICAgICAgICBNX0JEX1JFQUQ4ICAgICAgTGFzdCwxLFQxCi0gICAgICAgIE1fQkRfUkVBRDggICAgICBzdG9yZVJ1biw2LFQxCi0gICAgICAgIAotICAgICAgICBBREQgICAgICAgICAgICAgdGVtcDIsc3RvcmVSdW4sQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIFJ1biArIENvdW50IGV4Y2VlZHMgNjMKLSAgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAyLCM2NAotICAgICAgICBCR0UgICAgICAgICAgICAgRXhpdEVycm9yCi0KLSAgICAgICAgTV9CRF9SRUFEOCAgICAgIG1hcmtlcmJpdCwxLFQxCi0gICAgICAgIFRFUSAgICAgICAgICAgICBtYXJrZXJiaXQsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgbWFya2VyIGJpdCBpcyB6ZXJvCi0gICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IKLSAgICAgICAgCi0gICAgICAgIE1fQkRfUkVBRDE2ICAgICBzdG9yZUxldmVsLDEyLFQxCi0KLSAgICAgICAgVFNUICAgICAgICAgICAgIHN0b3JlTGV2ZWwsIzB4ODAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZXN0IGlmIHRoZSBsZXZlbCBpcyBuZWdhdGl2ZQotICAgICAgICBTVUJORSAgICAgICAgICAgc3RvcmVMZXZlbCxzdG9yZUxldmVsLCM0MDk2Ci0gICAgICAgIENNUCAgICAgICAgICAgICBzdG9yZUxldmVsLCMwCi0gICAgICAgIENNUE5FICAgICAgICAgICBzdG9yZUxldmVsLCMtMjA0OAotICAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIExldmVsPT0wIG9yICAtMjA0OCAKLQotICAgICAgICBNX0xEUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgYWRkcmVzcyBvZiB6aWd6YWdUYWJsZQotICAgICAgICAgICAgICAKLSAgICAgICAgTV9CRF9SRUFEOCAgICAgIG1hcmtlcmJpdCwxLFQxCi0gICAgICAgICAgIAotCi0gICAgICAgIDsvLyBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlciAoIFNpZ24gbm90IHVzZWQgYXMgc3RvcmVMZXZlbCBpcyBwcmVwcm9jZXNzZWQpCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIDsvLyBUbyBSZWZsZWN0IFJ1biBMZW5ndGgKLQotICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsc3RvcmVSdW4KLQotCi0gCi1zdG9yZUxldmVsTGFzdAotICAgICAgICAKLSAgICAgICAgTERSQiAgICAgICAgICAgIHppZ3phZyxbcFppZ3phZ1RhYmxlLENvdW50XQotICAgICAgICBDTVAgICAgICAgICAgICAgTGFzdCwjMQotICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsIzEKLSAgICAgICAgU1RSSCAgICAgICAgICAgIHN0b3JlTGV2ZWwsW3BEc3QsemlnemFnXSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIEJORSAgICAgICAgICAgICBlbmQgCi0gICAgICAKLSAgICAgICAgQiAgICAgICAgICAgICAgIEV4aXRPawotICAgICAgICAKLWVuZAotCi0gICAgICAgIENNUCAgICAgICAgICAgICBDb3VudCwjNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9SdW4gdGhlIExvb3AgdW50aWxsIENvdW50IHJlYWNoZXMgNjQKLQotICAgICAgICBCTFQgICAgICAgICAgICAgZ2V0VkxDYml0cwotCi0gICAgICAgIAotRXhpdE9rCi0gICAgICAgIDsvLyBFeGl0IFdoZW4gVkxDIERlY29kaW5nIGlzIGRvbmUgU3VjY2Vzc2Z1bGx5IAotICAgCi0gICAgICAgIDsvLyBMb2FkaW5nIHBwQml0U3RyZWFtIGFuZCBwQml0T2Zmc2V0IGZyb20gc3RhY2sKLSAgICAgICAgCi0gICAgICAgIENNUCAgICAgICAgICAgICBMYXN0LCMxCi0gICAgICAgIE1fTERSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0KLSAgICAgICAgTV9MRFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBPZmZzZXQKLQotICAgICAgICA7Ly9FbmRpbmcgdGhlIG1hY3JvCi0KLSAgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQKLSAgICAgICAgICAgICAKLSAgICAgICAgTU9WRVEgICAgICAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgotICAgICAgICBNT1ZORSAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX0VycgotICAgICAgICBNX0xEUiAgICAgICAgICAgTFIscExpbmtSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB0aGUgTGluayBSZWdpc3RlciBCYWNrCi0gICAgICAgIEIgICAgICAgICAgICAgICBleGl0MgotCi1FeGl0RXJyb3IKLSAgICAgICAgOy8vIEV4aXQgV2hlbiBhbiBFcnJvciBvY2N1cnMgCi0KLSAgICAgICAgTV9MRFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbQotICAgICAgICBNX0xEUiAgICAgICAgICAgcEJpdE9mZnNldCxwcE9mZnNldAotICAgICAgICA7Ly9FbmRpbmcgdGhlIG1hY3JvCi0KLSAgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQKLSAgICAgICAgTV9MRFIgICAgICAgICAgIExSLHBMaW5rUmVnaXN0ZXIKLSAgICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19FcnIKLQotZXhpdDIKLSAgICAgICAKLQotICAgICAgICBNX0VORAotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE3NzgzMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLSAvKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDEyMjkwCi0gKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCi0gKiBEZXNjcmlwdGlvbjogQ29udGFpbnMgYWxsIHRoZSBIdWZmbWFuIHRhYmxlcyB1c2VkIGluIE1QRUc0IGNvZGVjCi0gKgotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKLQotCi0KLQotLy8gQ29udGFpbnMgb3B0aW1pemVkIGFuZCBQYWNrZWQgVkxDIHRhYmxlcyB3aXRoIExhc3Q9MCBhbmQgTGFzdD0xCi0KLS8vICAgICAgICAgICAgICBvcHRpbWl6ZWQgUGFja2VkIFZMQyB0YWJsZSBFbnRyeSBGb3JtYXQgCi0vLyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAKLS8vICAgICAgICAxNSAxNCAxMyAxMiAxMSAxMCAwOSAwOCAwNyAwNiAwNSAwNCAwMyAwMiAwMSAwMAotLy8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLS8vICAgICAgIHwgIExlbiAgIHwgICAgICAgUnVuICAgICAgIHwgICAgIExldmVsICAgIHxMIHwgMSB8Ci0vLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotLy8gICAgICAgfCAgICAgICAgICAgICAgICBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgfCAwIHwKLS8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0vLyBJZiB0aGUgdGFibGUgZW50cnkgaXMgYSBsZWFmIGVudHJ5IHRoZW4gYml0IDAgc2V0OgotLy8gICAgTGVuICAgID0gTnVtYmVyIG9mIGJpdHMgb3ZlcnJlYWQgICgwIHRvIDcpICAzIGJpdHMKLS8vICAgIFJ1biAgICA9IFJ1bkxlbmd0aCBvZiB0aGUgU3ltYm9sICAoMCB0byA2MykgNiBiaXRzCi0vLyAgICBMZXZlbCAgPSBMZXZlbCBvZiB0aGUgU3ltYm9sICAgICAgKDAgdG8gMzEpIDUgYml0cwotLy8gICAgTCAgICAgID0gTGFzdCBWYWx1ZSBvZiB0aGUgU3ltYm9sICgwIG9yIDEpICAxIGJpdAotLy8KLS8vIElmIHRoZSB0YWJsZSBlbnRyeSBpcyBhbiBpbnRlcm5hbCBub2RlIHRoZW4gYml0IDAgaXMgY2xlYXI6Ci0vLyAgICBPZmZzZXQgPSBOdW1iZXIgb2YgKDE2LWJpdCkgaGFsZiB3b3JkcyBmcm9tIHRoZSB0YWJsZQotLy8gICAgICAgICAgICAgc3RhcnQgdG8gdGhlIG5leHQgdGFibGUgbm9kZQotLy8KLS8vIFRoZSB0YWJsZSBpcyBhY2Nlc3NlZCBieSBzdWNjZXNzaXZlIGxvb2t1cCB1cCBvbiB0aGUKLS8vIG5leHQgU3RlcCBiaXRzIG9mIHRoZSBpbnB1dCBiaXRzdHJlYW0gdW50aWwgYSBsZWFmIG5vZGUKLS8vIGlzIG9idGFpbmVkLiBUaGUgU3RlcCBzaXplcyBhcmUgc3VwcGxpZWQgdG8gdGhlIFZMRCBtYWNyby4KLQotLy8gVGhlIFZMQyB0YWJsZXMgdXNlZCBmb3IgSW50cmEgYW5kIG5vbiBpbnRhIGNvZWZmaWNpZW50cyBpbiBub24gRXNjYXBlIG1vZGUKLS8vIGNvbnRhaW5zIHN5bWJvbHMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xLgotLy8gSWYgYSBzeW1ib2wgaXMgbm90IGZvdW5kIGluIHRoZSB0YWJsZSBpdCB3aWxsIGJlIGNvZGVkIGFzIDB4RkZGCi0gCi0KLWNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX0ludGVyVmxjTDBMMVsyMDBdID0gewotICAgIDB4MDAyMCwgMHgwMTA4LCAweDAxNDgsIDB4MDE3MCwgMHgwMTc4LCAweDAxODAsIDB4MDE4OCwgMHgxYjA5LAotICAgIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHgyMTA5LCAweDIxMDksIDB4MDIwOSwgMHgwMDExLAotICAgIDB4MDAyOCwgMHgwMDYwLCAweDAwYjgsIDB4MDBlMCwgMHgwMDMwLCAweDAwNDgsIDB4MDA1MCwgMHgwMDU4LAotICAgIDB4M2ZmZiwgMHgzZmZmLCAweDAwMzgsIDB4MDA0MCwgMHgyMTE1LCAweDIxMTUsIDB4MjAxZCwgMHgyMDFkLAotICAgIDB4MjA1OSwgMHgyMDU5LCAweDIwNTEsIDB4MjA1MSwgMHgxYzBkLCAweDFiMGQsIDB4MWEwZCwgMHgxOTBkLAotICAgIDB4MDkxMSwgMHgwODExLCAweDA3MTEsIDB4MDYxMSwgMHgwNTExLCAweDAzMTksIDB4MDIxOSwgMHgwMTIxLAotICAgIDB4MDA2OCwgMHgwMDkwLCAweDNmZmYsIDB4M2ZmZiwgMHgwMDcwLCAweDAwNzgsIDB4MDA4MCwgMHgwMDg4LAotICAgIDB4MjA2MSwgMHgyMDYxLCAweDIxMjksIDB4MjEyOSwgMHgzNzA5LCAweDM3MDksIDB4MzgwOSwgMHgzODA5LAotICAgIDB4M2QwZCwgMHgzZDBkLCAweDNlMGQsIDB4M2UwZCwgMHgzZjBkLCAweDNmMGQsIDB4MjAwZCwgMHgyMDBkLAotICAgIDB4MDA5OCwgMHgwMGEwLCAweDAwYTgsIDB4MDBiMCwgMHgwMTMxLCAweDAyMjEsIDB4MDQxOSwgMHgwNTE5LAotICAgIDB4MDYxOSwgMHgwYTExLCAweDE5MDksIDB4MWEwOSwgMHgyMTBkLCAweDIyMGQsIDB4MjMwZCwgMHgyNDBkLAotICAgIDB4MjUwZCwgMHgyNjBkLCAweDI3MGQsIDB4MjgwZCwgMHgwMGMwLCAweDAwYzgsIDB4MDBkMCwgMHgwMGQ4LAotICAgIDB4MDA0OSwgMHgwMDQxLCAweDM4MGQsIDB4MzgwZCwgMHgzNzBkLCAweDM3MGQsIDB4MzYwZCwgMHgzNjBkLAotICAgIDB4MzUwZCwgMHgzNTBkLCAweDM0MGQsIDB4MzQwZCwgMHgzMzBkLCAweDMzMGQsIDB4MzIwZCwgMHgzMjBkLAotICAgIDB4MDBlOCwgMHgwMGYwLCAweDAwZjgsIDB4MDEwMCwgMHgzMTBkLCAweDMxMGQsIDB4MjAxNSwgMHgyMDE1LAotICAgIDB4MzYwOSwgMHgzNjA5LCAweDM1MDksIDB4MzUwOSwgMHgzNDA5LCAweDM0MDksIDB4MzMwOSwgMHgzMzA5LAotICAgIDB4MzIwOSwgMHgzMjA5LCAweDMxMDksIDB4MzEwOSwgMHgwMTEwLCAweDAxMzAsIDB4MDEzOCwgMHgwMTQwLAotICAgIDB4MDExOCwgMHgwMTIwLCAweDAxMjgsIDB4MTAwZCwgMHgzMDA5LCAweDMwMDksIDB4MmYwOSwgMHgyZjA5LAotICAgIDB4MjQxMSwgMHgyNDExLCAweDIzMTEsIDB4MjMxMSwgMHgyMDM5LCAweDIwMzksIDB4MjAzMSwgMHgyMDMxLAotICAgIDB4MGYwZCwgMHgwZTBkLCAweDBkMGQsIDB4MGMwZCwgMHgwYjBkLCAweDBhMGQsIDB4MDkwZCwgMHgwZTA5LAotICAgIDB4MGQwOSwgMHgwMjExLCAweDAxMTksIDB4MDAyOSwgMHgwMTUwLCAweDAxNTgsIDB4MDE2MCwgMHgwMTY4LAotICAgIDB4MjgwZCwgMHgyODBkLCAweDI3MGQsIDB4MjcwZCwgMHgyNjBkLCAweDI2MGQsIDB4MjUwZCwgMHgyNTBkLAotICAgIDB4MmMwOSwgMHgyYzA5LCAweGI3NTksIDB4Yjc1OSwgMHgyYTA5LCAweDJhMDksIDB4MjAyMSwgMHgyMDIxLAotICAgIDB4MDQwZCwgMHgwMzBkLCAweDBiMzUsIDB4MDEwZCwgMHgwOTA5LCAweDA4MDksIDB4MDcwOSwgMHgwNjA5LAotICAgIDB4MDExMSwgMHgwMDE5LCAweDI1MDksIDB4MjUwOSwgMHgyNDA5LCAweDI0MDksIDB4MjMwOSwgMHgyMzA5Ci19OwotCi0KLWNvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX0ludHJhVmxjTDBMMVsyMDBdID0gewotICAgIDB4MDAyMCwgMHgwMTA4LCAweDAxNDgsIDB4MDE3MCwgMHgwMTc4LCAweDAxODAsIDB4MDE4OCwgMHgwZjA5LAotICAgIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHgyMDExLCAweDIwMTEsIDB4MDEwOSwgMHgwMDE5LAotICAgIDB4MDAyOCwgMHgwMDYwLCAweDAwYjgsIDB4MDBlMCwgMHgwMDMwLCAweDAwNDgsIDB4MDA1MCwgMHgwMDU4LAotICAgIDB4M2ZmZiwgMHgzZmZmLCAweDAwMzgsIDB4MDA0MCwgMHgyMDNkLCAweDIwM2QsIDB4MjAzNSwgMHgyMDM1LAotICAgIDB4MjBiMSwgMHgyMGIxLCAweDIwYTksIDB4MjBhOSwgMHgwMjE1LCAweDAxMWQsIDB4MDAyZCwgMHgwZDA5LAotICAgIDB4MDUxOSwgMHgwODExLCAweDA0MTksIDB4MDMyMSwgMHgwMjIxLCAweDAxMzksIDB4MDBhMSwgMHgwMDk5LAotICAgIDB4MDA2OCwgMHgwMDkwLCAweDNmZmYsIDB4M2ZmZiwgMHgwMDcwLCAweDAwNzgsIDB4MDA4MCwgMHgwMDg4LAotICAgIDB4MjBiOSwgMHgyMGI5LCAweDIwYzEsIDB4MjBjMSwgMHgyMTQxLCAweDIxNDEsIDB4MjkxMSwgMHgyOTExLAotICAgIDB4MjMxNSwgMHgyMzE1LCAweDI0MTUsIDB4MjQxNSwgMHgyZjBkLCAweDJmMGQsIDB4MzAwZCwgMHgzMDBkLAotICAgIDB4MDA5OCwgMHgwMGEwLCAweDAwYTgsIDB4MDBiMCwgMHgwMGM5LCAweDAwZDEsIDB4MDBkOSwgMHgwMTQ5LAotICAgIDB4MDYxOSwgMHgwMTUxLCAweDAyMjksIDB4MDcxOSwgMHgwZTA5LCAweDAwNDUsIDB4MDUxNSwgMHgwNjE1LAotICAgIDB4MTEwZCwgMHgxMjBkLCAweDEzMGQsIDB4MTQwZCwgMHgwMGMwLCAweDAwYzgsIDB4MDBkMCwgMHgwMGQ4LAotICAgIDB4MDA5MSwgMHgwMDg5LCAweDJlMGQsIDB4MmUwZCwgMHgyZDBkLCAweDJkMGQsIDB4MmMwZCwgMHgyYzBkLAotICAgIDB4MmIwZCwgMHgyYjBkLCAweDJhMGQsIDB4MmEwZCwgMHgyMTE1LCAweDIxMTUsIDB4MjAyNSwgMHgyMDI1LAotICAgIDB4MDBlOCwgMHgwMGYwLCAweDAwZjgsIDB4MDEwMCwgMHgyYzA5LCAweDJjMDksIDB4MmIwOSwgMHgyYjA5LAotICAgIDB4MjcxMSwgMHgyNzExLCAweDI2MTEsIDB4MjYxMSwgMHgyNTExLCAweDI1MTEsIDB4MjMxOSwgMHgyMzE5LAotICAgIDB4MjIxOSwgMHgyMjE5LCAweDIxMzEsIDB4MjEzMSwgMHgwMTEwLCAweDAxMzAsIDB4MDEzOCwgMHgwMTQwLAotICAgIDB4MDExOCwgMHgwMTIwLCAweDAxMjgsIDB4MDgwZCwgMHgyMTI5LCAweDIxMjksIDB4MjA4MSwgMHgyMDgxLAotICAgIDB4MjQxMSwgMHgyNDExLCAweDIwNzksIDB4MjA3OSwgMHgyMDcxLCAweDIwNzEsIDB4MjA2OSwgMHgyMDY5LAotICAgIDB4MWJiNSwgMHgwNjBkLCAweDAwMWQsIDB4ZDNmOSwgMHgwOTA5LCAweDA4MDksIDB4MDkwZCwgMHgwMzExLAotICAgIDB4MDEyMSwgMHgwMDYxLCAweDAwNTksIDB4MDA1MSwgMHgwMTUwLCAweDAxNTgsIDB4MDE2MCwgMHgwMTY4LAotICAgIDB4MjQwZCwgMHgyNDBkLCAweDIzMGQsIDB4MjMwZCwgMHgyNjA5LCAweDI2MDksIDB4MjUwZCwgMHgyNTBkLAotICAgIDB4MjcwOSwgMHgyNzA5LCAweDIyMTEsIDB4MjIxMSwgMHgyMTE5LCAweDIxMTksIDB4MjA0OSwgMHgyMDQ5LAotICAgIDB4MDAxNSwgMHgwNTA5LCAweDAyMGQsIDB4MDEwZCwgMHgwNDA5LCAweDAzMDksIDB4MDA0MSwgMHgwMDM5LAotICAgIDB4MDExMSwgMHgwMDMxLCAweDIyMDksIDB4MjIwOSwgMHgyMDI5LCAweDIwMjksIDB4MjAyMSwgMHgyMDIxCi19OwotCi1jb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hSW50cmFEQ0x1bWFDaHJvbWFJbmRleFs2NF0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMGIsIDB4MjAwOSwgMHgyMDA5LCAweDIwMDcsIDB4MjAwNywgMHgyMDAxLCAweDIwMDEsCi0gICAgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsCi0gICAgMHgwMDI4LCAweDAwMGYsIDB4MjAwZCwgMHgyMDBkLCAweDAwMzAsIDB4MDAxMywgMHgyMDExLCAweDIwMTEsCi0gICAgMHgwMDM4LCAweDAwMTcsIDB4MjAxNSwgMHgyMDE1LCAweDNmZmYsIDB4M2ZmZiwgMHgyMDE5LCAweDIwMTksCi0KLQkweDAwMjAsIDB4MDAwOSwgMHgyMDA3LCAweDIwMDcsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwKLSAgICAweDQwMDMsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwKLSAgICAweDAwMjgsIDB4MDAwZCwgMHgyMDBiLCAweDIwMGIsIDB4MDAzMCwgMHgwMDExLCAweDIwMGYsIDB4MjAwZiwKLSAgICAweDAwMzgsIDB4MDAxNSwgMHgyMDEzLCAweDIwMTMsIDB4MWZmZiwgMHgwMDE5LCAweDIwMTcsIDB4MjAxNwotfTsKLQotCi1jb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hVmxjTVZEWzEyNF0gPSB7Ci0gICAgMHgwMDEwLCAweDAwZjAsIDB4MDA0MywgMHgwMDNmLCAweDQwNDEsIDB4NDA0MSwgMHg0MDQxLCAweDQwNDEsCi0gICAgMHgwMDE4LCAweDAwZDgsIDB4MDA0NywgMHgwMDNiLCAweDAwMjAsIDB4MDA4MCwgMHgwMGE4LCAweDAwZDAsCi0gICAgMHgwMDI4LCAweDAwNDgsIDB4MDA3MCwgMHgwMDc4LCAweDFmZmYsIDB4MDAzMCwgMHgwMDM4LCAweDAwNDAsCi0gICAgMHgwMDgxLCAweDAwMDEsIDB4MDA3ZiwgMHgwMDAzLCAweDIwN2QsIDB4MjA3ZCwgMHgyMDA1LCAweDIwMDUsCi0gICAgMHgyMDdiLCAweDIwN2IsIDB4MjAwNywgMHgyMDA3LCAweDAwNTAsIDB4MDA1OCwgMHgwMDYwLCAweDAwNjgsCi0gICAgMHgyMDc5LCAweDIwNzksIDB4MjAwOSwgMHgyMDA5LCAweDIwNzcsIDB4MjA3NywgMHgyMDBiLCAweDIwMGIsCi0gICAgMHgyMDc1LCAweDIwNzUsIDB4MjAwZCwgMHgyMDBkLCAweDIwNzMsIDB4MjA3MywgMHgyMDBmLCAweDIwMGYsCi0gICAgMHgwMDcxLCAweDAwMTEsIDB4MDA2ZiwgMHgwMDEzLCAweDAwNmQsIDB4MDAxNSwgMHgwMDZiLCAweDAwMTcsCi0gICAgMHgwMDg4LCAweDAwOTAsIDB4MDA5OCwgMHgwMGEwLCAweDAwNjksIDB4MDAxOSwgMHgwMDY3LCAweDAwMWIsCi0gICAgMHgwMDY1LCAweDAwMWQsIDB4MDA2MywgMHgwMDFmLCAweDAwNjEsIDB4MDAyMSwgMHgwMDVmLCAweDAwMjMsCi0gICAgMHgwMDVkLCAweDAwMjUsIDB4MDA1YiwgMHgwMDI3LCAweDAwYjAsIDB4MDBiOCwgMHgwMGMwLCAweDAwYzgsCi0gICAgMHgwMDU5LCAweDAwMjksIDB4MDA1NywgMHgwMDJiLCAweDIwNTUsIDB4MjA1NSwgMHgyMDJkLCAweDIwMmQsCi0gICAgMHgyMDUzLCAweDIwNTMsIDB4MjAyZiwgMHgyMDJmLCAweDIwNTEsIDB4MjA1MSwgMHgyMDMxLCAweDIwMzEsCi0gICAgMHgyMDRmLCAweDIwNGYsIDB4MjAzMywgMHgyMDMzLCAweDAwZTAsIDB4MDBlOCwgMHgwMDQ5LCAweDAwMzksCi0gICAgMHgyMDRkLCAweDIwNGQsIDB4MjAzNSwgMHgyMDM1LCAweDIwNGIsIDB4MjA0YiwgMHgyMDM3LCAweDIwMzcsCi0gICAgMHgyMDQ1LCAweDIwNDUsIDB4MjAzZCwgMHgyMDNkCi19OwotCi0vKiBMTUFYIHRhYmxlIGZvciBub24gSW50ZXIgKExhc3QgPT0gMCBhbmQgTGFzdD0xKQotICAgTGV2ZWwgLSAxIEluZGV4ZWQKLSAgIHBhZGRlZCBhcm1WQ000UDJfSW50ZXJMMEwxTE1BWFsyNy0zMV0gd2l0aCB6ZXJvcyB0byBhY2VzcyBlbnRyaWVzIGZvciBMYXN0PTEgZWZmZWN0aXZlbHkKLQotKi8KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMEwxTE1BWFs3M10gPSAKLXsKLSAgIDEyLCAgNiwgIDQsICAzLCAgMywgIDMsICAzLCAgMiwgCi0gICAgMiwgIDIsICAyLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0gICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0gICAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsCi0gICAgMywgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotCTEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotCTEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotCTEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotCTEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotCTEKLX07Ci0KLS8qIFJNQVggdGFibGUgZm9yIG5vbiBJbnRlciAoTGFzdCA9PSAwIGFuZCBMYXN0PTEpCi0gICBMZXZlbCAtIDEgSW5kZXhlZCAKLSBwYWRkZWQgYXJtVkNNNFAyX0ludGVyTDBMMVJNQVhbMTItMzFdIHdpdGggemVyb3MgdG8gYWNjZXNzIGVudHJpZXMgZm9yIExhc3Q9MSB0YWJsZSBlZmZlY3RpdmVseSAqLwotCi0KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMEwxUk1BWFszNV0gPSAKLXsKLSAgIDI2LCAxMCwgIDYsICAyLCAgMSwgIDEsICAgCi0gICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAotCTAsCTAsCTAsCTAsCTAsCTAsCi0JMCwJMCwJMCwJMCwJMCwJMCwKLQkwLAkwLAkwLAkwLAotICAgIDAsICAwLCAgMCwgIDAsICA0MCwgIDEsICAwCi19OwotCi0vKiBMTUFYIHRhYmxlIGZvciBub24gSW50cmEgKExhc3QgPT0gMCBhbmQgTGFzdD0xKQotICAgTGV2ZWwgLSAxIEluZGV4ZWQKLSAgIHBhZGRlZCBhcm1WQ000UDJfSW50cmFMMEwxTE1BWFsxNS0zMV0gd2l0aCB6ZXJvcyB0byBhY2VzcyBlbnRyaWVzIGZvciBMYXN0PTEgZWZmZWN0aXZlbHkKLQotKi8KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMEwxTE1BWFs1M10gPSAKLXsKLSAgIDI3LCAxMCwgIDUsICA0LCAgMywgIDMsICAzLCAgCi0gICAgMywgIDIsICAyLCAgMSwgIDEsICAxLCAgMSwgIDEsCTAsCi0JMCwJMCwJMCwJMCwJMCwJMCwJMCwJMCwKLQkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAotCi0JOCwgIDMsICAyLCAgMiwgIDIsICAyLCAgMiwgIDEsIAotCTEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotCTEsICAxLCAgMSwgIDEsICAxCi19OwotCi0KLS8qIFJNQVggdGFibGUgZm9yIG5vbiBJbnRlciAoTGFzdCA9PSAwIGFuZCBMYXN0PTEpCi0gICBMZXZlbCAtIDEgSW5kZXhlZCAKLSBwYWRkZWQgYXJtVkNNNFAyX0ludHJhTDBMMVJNQVhbMjctMzFdIHdpdGggemVyb3MgdG8gYWNjZXNzIGVudHJpZXMgZm9yIExhc3Q9MSB0YWJsZSBlZmZlY3RpdmVseSAqLwotCi0KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMEwxUk1BWFs0MF0gPQotewotICAgMTQsICA5LCAgNywgIDMsICAyLCAgMSwJMSwgIAotICAgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgCTAsICAKLSAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgCi0gICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKLQkwLAkwLAkwLAkwLAotCQotCTIwLCAgNiwgIDEsICAwLCAgMCwgIDAsICAwLCAgMAotCi19OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkxNWQzYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLSAvKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICAxMjI5MAotICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRmlsZTogICAgICAgIGFybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKLSAqIERlc2NyaXB0aW9uOiBDb250YWlucyBhbGwgdGhlIExvb2t1cCB0YWJsZXMgdXNlZCBpbiBNUEVHNCBjb2RlYwotICoKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLQotICAgIC8qICogVGFibGUgRW50cmllcyBjb250YWluIERjIFNjYWxlciB2YWx1ZXMKLSAgICAgICAqIGFybVZDTTRQMl9EQ1NjYWxlcltpXT0gOCAgICAgICAgICAgZm9yIGk9MSAgdG8gIDQgYW5kIGk9MzMgdG8gMzYKLSAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gMippICAgICAgICAgZm9yIGk9NSAgdG8gIDgKLSAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gaSs4ICAgICAgICAgZm9yIGk9OSAgdG8gIDI1Ci0gICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IDIqaS0xNiAgICAgIGZvciBpPTI2IHRvICAzMQotICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSAoaS0zMisxMykvMiBmb3IgaT0zNyB0byAgNTkKLSAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gaS02LTMyICAgICAgZm9yIGk9NjAgdG8gIDYzCi0gICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IDI1NSAgICAgICAgIGZvciBpPTAgYW5kIGk9MzIKLSAgICAgICAqLwotICAgICAgIAotY29uc3QgT01YX1U4IGFybVZDTTRQMl9EQ1NjYWxlcls2NF09ewotCTB4ZmYsIDB4OCwgIDB4OCwgIDB4OCwgIDB4OCwgIDB4YSwgIDB4YywgIDB4ZSwgIAotICAgIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIAotICAgIDB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsCi0gICAgMHgyMCwgMHgyMiwgMHgyNCwgMHgyNiwgMHgyOCwgMHgyYSwgMHgyYywgMHgyZSwKLSAgICAweGZmLCAweDgsICAweDgsICAweDgsICAweDgsICAweDksICAweDksICAweGEsICAKLSAgICAweGEsICAweGIsICAweGIsICAweGMsICAweGMsICAweGQsICAweGQsICAweGUsICAKLSAgICAweGUsICAweGYsICAweGYsICAweDEwLCAweDEwLCAweDExLCAweDExLCAweDEyLCAKLSAgICAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAweDE4LCAweDE5LAotCi19OwotCi0gICAgICAgICAgICAgIAotICAgICAvKiAgVGFibGUgRW50cmllcyBDb250YWluIHJlY2lwcm9jYWwgb2YgMSB0byA2MwotICAgICAgKiAgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzE2W2ldPXJvdW5kKDMyNzY3L2kpCi0gICAgICAqICBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMTZbMF09IDAKLSAgICAgICovCi0KLWNvbnN0IE9NWF9TMTYgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzE2WzY0XT17Ci0JMHgwMDAwLDB4N2ZmZiwweDQwMDAsMHgyYWFhLDB4MjAwMCwweDE5OTksMHgxNTU1LDB4MTI0OSwKLSAgICAweDEwMDAsMHgwZTM5LDB4MGNjZCwweDBiYTMsMHgwYWFiLDB4MDlkOSwweDA5MjUsMHgwODg4LAotICAgIDB4MDgwMCwweDA3ODcsMHgwNzFjLDB4MDZiZCwweDA2NjYsMHgwNjE4LDB4MDVkMSwweDA1OTEsCi0gICAgMHgwNTU1LDB4MDUxZiwweDA0ZWMsMHgwNGJlLDB4MDQ5MiwweDA0NmEsMHgwNDQ0LDB4MDQyMSwKLSAgICAweDA0MDAsMHgwM2UxLDB4MDNjNCwweDAzYTgsMHgwMzhlLDB4MDM3NiwweDAzNWUsMHgwMzQ4LAotICAgIDB4MDMzMywweDAzMWYsMHgwMzBjLDB4MDJmYSwweDAyZTksMHgwMmQ4LDB4MDJjOCwweDAyYjksCi0gICAgMHgwMmFiLDB4MDI5ZCwweDAyOGYsMHgwMjgyLDB4MDI3NiwweDAyNmEsMHgwMjVmLDB4MDI1NCwKLSAgICAweDAyNDksMHgwMjNmLDB4MDIzNSwweDAyMmIsMHgwMjIyLDB4MDIxOSwweDAyMTEsMHgwMjA4Ci0JICAgCi19OwotICAgICAKLSAgICAgIC8qIFRhYmxlIEVudHJpZXMgQ29udGFpbiByZWNpcHJvY2FsIG9mIDEgdG8gNjMKLSAgICAgICAqIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MzMltpXT1yb3VuZCgxMzEwNzEvaSkKLSAgICAgICAqIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MzMlswXT0gMAotICAgICAgICovCi0KLWNvbnN0IE9NWF9TMzIgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyWzY0XT17Ci0JMHgwMDAwMDAwMCwweDAwMDFmZmZmLDB4MDAwMTAwMDAsMHgwMDAwYWFhYSwgMHgwMDAwODAwMCwgMHgwMDAwNjY2NiwgMHgwMDAwNTU1NSwgMHgwMDAwNDkyNCwKLSAgICAweDAwMDA0MDAwLDB4MDAwMDM4ZTMsMHgwMDAwMzMzMywweDAwMDAyZThjLCAweDAwMDAyYWFiLCAweDAwMDAyNzYyLCAweDAwMDAyNDkyLCAweDAwMDAyMjIyLAotICAgIDB4MDAwMDIwMDAsMHgwMDAwMWUxZSwweDAwMDAxYzcyLDB4MDAwMDFhZjIsIDB4MDAwMDE5OWEsIDB4MDAwMDE4NjEsIDB4MDAwMDE3NDYsIDB4MDAwMDE2NDMsCi0gICAgMHgwMDAwMTU1NSwweDAwMDAxNDdiLDB4MDAwMDEzYjEsMHgwMDAwMTJmNiwgMHgwMDAwMTI0OSwgMHgwMDAwMTFhOCwgMHgwMDAwMTExMSwgMHgwMDAwMTA4NCwKLSAgICAweDAwMDAxMDAwLDB4MDAwMDBmODQsMHgwMDAwMGYwZiwweDAwMDAwZWExLCAweDAwMDAwZTM5LCAweDAwMDAwZGQ2LCAweDAwMDAwZDc5LCAweDAwMDAwZDIxLAotICAgIDB4MDAwMDBjY2QsMHgwMDAwMGM3ZCwweDAwMDAwYzMxLDB4MDAwMDBiZTgsIDB4MDAwMDBiYTMsIDB4MDAwMDBiNjEsIDB4MDAwMDBiMjEsIDB4MDAwMDBhZTUsCi0gICAgMHgwMDAwMGFhYiwweDAwMDAwYTczLDB4MDAwMDBhM2QsMHgwMDAwMGEwYSwgMHgwMDAwMDlkOSwgMHgwMDAwMDlhOSwgMHgwMDAwMDk3YiwgMHgwMDAwMDk0ZiwKLSAgICAweDAwMDAwOTI1LDB4MDAwMDA4ZmIsMHgwMDAwMDhkNCwweDAwMDAwOGFlLCAweDAwMDAwODg5LCAweDAwMDAwODY1LCAweDAwMDAwODQyLCAweDAwMDAwODIwCi0JCi19OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmM2YzNjMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyX3MucworKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8vCi07Ly8gCi07Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAyX1NldFByZWREaXJfcy5zCi07Ly8gT3Blbk1BWCBETDogdjEuMC4yCi07Ly8gUmV2aXNpb246ICAgMTIyOTAKLTsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsvLyAKLTsvLyAKLTsvLyAKLTsvLwotCi07ICoqCi07ICogRnVuY3Rpb246IGFybVZDTTRQMl9TZXRQcmVkRGlyCi07ICoKLTsgKiBEZXNjcmlwdGlvbjoKLTsgKiBQZXJmb3JtcyBkZXRlY3RpbmcgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uCi07ICoKLTsgKiBSZW1hcmtzOgotOyAqCi07ICogUGFyYW1ldGVyczoKLTsgKiBbaW5dIGJsb2NrSW5kZXggIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZAotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiBhcyBkZWZpbmVkIGluIHN1YmNsYXVzZSA2LjEuMy44LCBvZiBJU08vSUVDCi07ICogICAgICAgICAgICAgICAgICAgICAgICAgIDE0NDk2LTIuIEZ1cnRoZXJtb3JlLCBpbmRleGVzIDYgdG8gOSBpbmRpY2F0ZSB0aGUKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgYmxvY2tzIHNwYXRpYWxseSBjb3JyZXNwb25kaW5nIHRvIGx1bWluYW5jZQotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3MgMCB0byAzIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suCi07ICogW2luXSBwQ29lZkJ1ZlJvdyBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCi07ICogW2luXSBwUXBCdWYgICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcgotOyAqIFtvdXRdcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCi07ICogW291dF1wcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQotOyAqICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci07ICogICAgICAgICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQotOyAqICAgICAgICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5Ci07ICoKLTsgKiBSZXR1cm4gVmFsdWU6Ci07ICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi07ICoKLTsgKi8KLQotICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgIElOQ0xVREUgb214VkNfcy5oCi0KLQotICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLQotICAgICAgIElGIEFSTTExMzZKUwotIAotOy8vIElucHV0IEFyZ3VtZW50cwotQmxvY2tJbmRleCAgICAgICAgIFJOIDAKLXBDb2VmQnVmUm93ICAgICAgICBSTiAxCi1wQ29lZkJ1ZkNvbCAgICAgICAgUk4gMgotcHJlZERpciAgICAgICAgICAgIFJOIDMKLXByZWRRUCAgICAgICAgICAgICBSTiA0Ci1wUXBCdWYgICAgICAgICAgICAgUk4gNQotCi07Ly8gTG9jYWwgVmFyaWFibGVzCi0KLVJldHVybiAgICAgICAgICAgICBSTiAwCi1ibG9ja0RDTGVmdCAgICAgICAgUk4gNiAgCi1ibG9ja0RDVG9wICAgICAgICAgUk4gNwotYmxvY2tEQ1RvcExlZnQgICAgIFJOIDgKLXRlbXAxICAgICAgICAgICAgICBSTiA5Ci10ZW1wMiAgICAgICAgICAgICAgUk4gMTQKLQotICAgICAgIE1fU1RBUlQgICAgYXJtVkNNNFAyX1NldFByZWREaXIscjkKLQotICAgICAgIE1fQVJHICAgICAgIHBwcmVkUVAsNAotICAgICAgIE1fQVJHICAgICAgIHBwUXBCdWYsNAotICAgIAotICAgICAgIExEUkggICAgICAgIGJsb2NrRENUb3BMZWZ0LFtwQ29lZkJ1ZlJvdywjLTE2XQotICAgICAgIExEUkggICAgICAgIGJsb2NrRENMZWZ0LFtwQ29lZkJ1ZkNvbF0KLSAgICAgICAKLSAgICAgICBURVEgICAgICAgICBCbG9ja0luZGV4LCMzCi0gICAgICAgTERSRVFIICAgICAgYmxvY2tEQ1RvcCxbcENvZWZCdWZDb2wsIy0xNl0KLSAgICAgICBMRFJORUggICAgICBibG9ja0RDVG9wLFtwQ29lZkJ1ZlJvd10KLSAgICAgICAgICAgICAKLSAgICAgICBTVUJTICAgICAgICB0ZW1wMSxibG9ja0RDTGVmdCxibG9ja0RDVG9wTGVmdAotICAgICAgIFJTQkxUICAgICAgIHRlbXAxLHRlbXAxLCMwCi0gICAgICAgU1VCUyAgICAgICAgdGVtcDIsYmxvY2tEQ1RvcExlZnQsYmxvY2tEQ1RvcAotICAgICAgIFJTQkxUICAgICAgIHRlbXAyLHRlbXAyLCMwCi0gICAgICAKLSAgICAgICBNX0xEUiAgICAgICBwUXBCdWYscHBRcEJ1ZgotICAgICAgIE1fTERSICAgICAgIHByZWRRUCxwcHJlZFFQCi0gICAgICAgQ01QICAgICAgICAgdGVtcDEsdGVtcDIKLSAgICAgICBNT1YgICAgICAgICB0ZW1wMiwjT01YX1ZDX1ZFUlRJQ0FMCi0gICAgICAgTERSTFRCICAgICAgdGVtcDEsW3BRcEJ1ZiwjMV0KLSAgICAgICBTVFJMVCAgICAgICB0ZW1wMixbcHJlZERpcl0KLSAgICAgICBTVFJMVCAgICAgICB0ZW1wMSxbcHJlZFFQXQotICAgICAgIE1PViAgICAgICAgIHRlbXAyLCNPTVhfVkNfSE9SSVpPTlRBTCAgICAgICAgICAgCi0gICAgICAgTERSR0VCICAgICAgdGVtcDEsW3BRcEJ1Zl0KLSAgICAgICBTVFJHRSAgICAgICB0ZW1wMixbcHJlZERpcl0KLSAgICAgICBNT1YgICAgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKLSAgICAgICBTVFJHRSAgICAgICB0ZW1wMSxbcHJlZFFQXSAKLQotICAgICAgICAgCi0gICAgCi0gICAgICAgTV9FTkQKLSAKLSAgICAgICBFTkRJRgotCi0gICAgICAgRU5EICAgIAotICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE5YjQzNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDEyMjkwCi0gKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuYwotICogRGVzY3JpcHRpb246IENvbnRhaW5zIHRoZSB6aWd6YWcgdGFibGVzCi0gKgotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotCi0vKiBDb250YWlucyBEb3VibGUgdGhlIHZhbHVlcyBpbiB0aGUgcmVmZXJlbmNlIFppZ3phZyBUYWJsZQotICogQ29udGFpbnMgQ2xhc3NpY2FsLFZldGljYWwgYW5kIEhvcml6b250YWwgWmlnemFnc2NhbiB0YWJsZXMgaW4gb25lIGFycmF5ICAKLSAqLwotCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuIFsxOTJdID0gCi17Ci0gICAgIDAsICAyLCAgMTYsIDMyLCAgMTgsICA0LCAgNiwgMjAsCi0gICAgMzQsIDQ4LCA2NCwgNTAsIDM2LCAyMiwgIDgsICAxMCwKLSAgICAyNCwgMzgsIDUyLCA2NiwgODAsIDk2LCA4MiwgNjgsCi0gICAgNTQsIDQwLCAyNiwgIDEyLCAgMTQsIDI4LCA0MiwgNTYsIAotICAgIDcwLCA4NCwgOTgsIDExMiwgMTE0LCAxMDAsIDg2LCA3MiwKLSAgICA1OCwgNDQsIDMwLCA0NiwgNjAsIDc0LCA4OCwgMTAyLAotICAgIDExNiwgMTE4LCAxMDQsIDkwLCA3NiwgNjIsIDc4LCA5MiwKLSAgICAxMDYsIDEyMCwgMTIyLCAxMDQsIDk0LCAxMTAsIDEyNCwgMTI2LAotCi0JMCwgIDE2LCAzMiwgNDgsICAyLCAgMTgsICA0LCAyMCwKLSAgICAzNCwgNTAsIDY0LCA4MCwgOTYsIDExMiwgMTE0LCA5OCwKLSAgICA4MiwgNjYsIDUyLCAzNiwgIDYsIDIyLCAgOCwgMjQsCi0gICAgMzgsIDU0LCA2OCwgODQsIDEwMCwgMTE2LCA3MCwgODYsCi0gICAgMTAyLCAxMTgsIDQwLCA1NiwgIDEwLCAyNiwgIDEyLCAyOCwKLSAgICA0MiwgNTgsIDcyLCA4OCwgMTA0LCAxMjAsIDc0LCA5MCwgCi0gICAgMTA2LCAxMjIsIDQ0LCA2MCwgIDE0LCAzMCwgNDYsIDYyLAotICAgIDc2LCA5MiwgMTA4LCAxMjQsIDc4LCA5NCwgMTEwLCAxMjYsCi0KLSAgICAwLCAgMiwgIDQsICA2LCAgMTYsICAxOCwgMzIsIDM0LAotICAgIDIwLCAyMiwgIDgsICAxMCwgIDEyLCAgMTQsIDMwLCAyOCwKLSAgICAyNiwgMjQsIDM4LCAzNiwgNDgsIDUwLCA2NCwgNjYsCi0gICAgNTIsIDU0LCA0MCwgNDIsIDQ0LCA0NiwgNTYsIDU4LAotICAgIDYwLCA2MiwgNjgsIDcwLCA4MCwgODIsIDk2LCA5OCwKLSAgICA4NCwgODYsIDcyLCA3NCwgNzYsIDc4LCA4OCwgOTAsIAotICAgIDkyLCA5NCwgMTAwLCAxMDIsIDExMiwgMTE0LCAxMTYsIDExOCwKLSAgICAxMDQsIDEwNiwgMTA4LCAxMTAsIDEyMCwgMTIyLCAxMjQsIDEyNgotCi0KLX07Ci0KLQotCi0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUzNDZhZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgMTIyOTAKLSAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOiAKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludGVyIHJlY29uc3RydWN0aW9uCi0gKiAKLSAqLwotIAotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0KLS8qKgotICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIERlY29kZXMgdGhlIElOVEVSIGJsb2NrIGNvZWZmaWNpZW50cy4gSW52ZXJzZSBxdWFudGl6YXRpb24sIGludmVyc2VseSB6aWd6YWcKLSAqIHBvc2l0aW9uaW5nIGFuZCBJRENULCB3aXRoIGFwcHJvcHJpYXRlIGNsaXBwaW5nIG9uIGVhY2ggc3RlcCwgYXJlIHBlcmZvcm1lZAotICogb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgKHJlc2lkdWFscykgYXJlIHBsYWNlZCBpbiBhIGNvbnRpZ3VvdXMgYXJyYXkKLSAqIG9mIDY0IGVsZW1lbnRzLiBGb3IgSU5URVIgYmxvY2ssIHRoZSBvdXRwdXQgYnVmZmVyIGhvbGRzIHRoZSByZXNpZHVhbHMgZm9yCi0gKiBmdXJ0aGVyIHJlY29uc3RydWN0aW9uLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotICoJCQkJCQkJCXRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkKLSAqCQkJCQkJCQljaGVjayBmb3IgdGhlIGJpdCBzdHJlYW0gYnVmZmVyLgotICogW2luXQlwQml0T2Zmc2V0CQlwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICoJCQkJCQkJCXRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluCi0gKgkJCQkJCQkJWzAtN10KLSAqIFtpbl0JUVAJCQkJcXVhbnRpemF0aW9uIHBhcmFtZXRlcgotICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgIGEgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBpbmRpY2F0ZXMgdXNpbmcgcXVhbnRpemF0aW9uIG1ldGhvZCBkZWZpbmVkIGluIHNob3J0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvIGhlYWRlciBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBpbmRpY2F0ZXMgbm9ybWFpbCBxdWFudGl6YXRpb24gbWV0aG9kLgotICogW291dF0gcHBCaXRTdHJlYW0gCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdIHBEc3QJCQlwb2ludGVyIHRvIHRoZSBkZWNvZGVkIHJlc2lkdWFsIGJ1ZmZlciAoYSBjb250aWd1b3VzIGFycmF5IG9mIDY0IGVsZW1lbnRzIG9mCi0gKiAgICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IGRhdGEgdHlwZSkuIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgotICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCi0gKiAgIC0gQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTnVsbDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCAsIHBEc3QKLSAqICAgLSBBdCBsZWFzdCBvbmUgb2YgdGhlIGJlbG93IGNhc2U6Ci0gKiAgIC0gKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSwgUVAgPD0gMDsKLSAqCSAtIHBEc3Qgbm90IDE2LWJ5dGUgYWxpZ25lZAotICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyKAotICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotICAgICBPTVhfUzE2ICogcERzdCwKLSAgICAgT01YX0lOVCBRUCwKLSAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pCi17Ci0gICAgLyogNjQgZWxlbWVudHMgYXJlIG5lZWRlZCBidXQgdG8gYWxpZ24gaXQgdG8gMTYgYnl0ZXMgbmVlZAotICAgIDE1IG1vcmUgZWxlbWVudHMgb2YgcGFkZGluZyAqLwotICAgIE9NWF9TMTYgdGVtcEJ1Zls3OV07Ci0gICAgT01YX1MxNiAqcFRlbXBCdWYxOwotICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7Ci0gICAgLyogQWxpZ25pbmcgdGhlIGxvY2FsIGJ1ZmZlcnMgKi8KLSAgICBwVGVtcEJ1ZjEgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmKTsKLSAgICAKLSAgICAKLSAgICAvKiBWTEQgYW5kIHppZ3phZyAqLwotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wQnVmMSxzaG9ydFZpZGVvSGVhZGVyKTsKLSAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICAKLSAgICAvKiBEZXF1YW50aXphdGlvbiAqLwotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9RdWFudEludkludGVyX0koCi0gICAgIHBUZW1wQnVmMSwKLSAgICAgUVApOwotICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIAotICAgIC8qIEludmVyc2UgdHJhbnNmb3JtICovCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0lEQ1Q4eDhibGsocFRlbXBCdWYxLCBwRHN0KTsKLSAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLQkgICAgCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZWM1ZDIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYworKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDEyMjkwCi0gKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjogCi0gKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRyYSByZWNvbnN0cnVjdGlvbgotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKiBGdW5jdGlvbiBmb3Igc2F0dXJhdGluZyAxNiBiaXQgdmFsdWVzIHRvIHRoZSBbMCwyNTVdIHJhbmdlIGFuZCAgKi8KLS8qIHdyaXRpbmcgb3V0IGFzIDggYml0IHZhbHVlcy4gIERvZXMgNjQgZW50cmllcyAgICAgICAgICAgICAgICAgICAqLwotdm9pZCBhcm1WQ000UDJfQ2xpcDgoT01YX1MxNiAqcFNyYywgT01YX1U4ICpwRHN0LCBPTVhfSU5UIGRzdFN0ZXAgKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIERlY29kZXMgdGhlIElOVFJBIGJsb2NrIGNvZWZmaWNpZW50cy4gSW52ZXJzZSBxdWFudGl6YXRpb24sIGludmVyc2VseSB6aWd6YWcKLSAqIHBvc2l0aW9uaW5nLCBhbmQgSURDVCwgd2l0aCBhcHByb3ByaWF0ZSBjbGlwcGluZyBvbiBlYWNoIHN0ZXAsIGFyZSBwZXJmb3JtZWQKLSAqIG9uIHRoZSBjb2VmZmljaWVudHMuIFRoZSByZXN1bHRzIGFyZSB0aGVuIHBsYWNlZCBpbiB0aGUgb3V0cHV0IGZyYW1lL3BsYW5lIG9uCi0gKiBhIHBpeGVsIGJhc2lzLiBGb3IgSU5UUkEgYmxvY2ssIHRoZSBvdXRwdXQgdmFsdWVzIGFyZSBjbGlwcGVkIHRvIFswLCAyNTVdIGFuZAotICogd3JpdHRlbiB0byBjb3JyZXNwb25kaW5nIGJsb2NrIGJ1ZmZlciB3aXRoaW4gdGhlIGRlc3RpbmF0aW9uIHBsYW5lLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotICoJCQkJCQkJCXRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gVGhlcmUgaXMgbm8gYm91bmRhcnkKLSAqCQkJCQkJCQljaGVjayBmb3IgdGhlIGJpdCBzdHJlYW0gYnVmZmVyLgotICogW2luXQlwQml0T2Zmc2V0CQlwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICoJCQkJCQkJCXRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluCi0gKgkJCQkJCQkJWzAtN10uCi0gKiBbaW5dCXN0ZXAJCQl3aWR0aCBvZiB0aGUgZGVzdGluYXRpb24gcGxhbmUKLSAqIFtpbi9vdXRdCXBDb2VmQnVmUm93CQlbaW5dICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIFtvdXRdIHVwZGF0ZWQgY29lZmZpY2llbnQgcndvIGJ1ZmZlcgotICogW2luL291dF0JcENvZWZCdWZDb2wJCVtpbl0gIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgW291dF0gdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCi0gKiBbaW5dCWN1clFQCQkJcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgbWFjcm9ibG9jayB3aGljaAotICoJCQkJCQkJCXRoZSBjdXJyZW50IGJsb2NrIGJlbG9uZ3MgdG8KLSAqIFtpbl0JcFFwQnVmCQkgUG9pbnRlciB0byBhIDItZWxlbWVudCBRUCBhcnJheS4gcFFwQnVmWzBdIGhvbGRzIHRoZSBRUCBvZiB0aGUgOHg4IGJsb2NrIGxlZnQgdG8KLSAqICAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGJsb2NrKFFQYSkuIHBRcEJ1ZlsxXSBob2xkcyB0aGUgUVAgb2YgdGhlIDh4OCBibG9jayBqdXN0IGFib3ZlIHRoZQotICogICAgICAgICAgICAgICAgICAgY3VycmVudCBibG9jayhRUGMpLgotICogICAgICAgICAgICAgICAgICAgTm90ZSwgaW4gY2FzZSB0aGUgY29ycmVzcG9uZGluZyBibG9jayBpcyBvdXQgb2YgVk9QIGJvdW5kLCB0aGUgUVAgdmFsdWUgd2lsbCBoYXZlCi0gKiAgICAgICAgICAgICAgICAgICBubyBlZmZlY3QgdG8gdGhlIGludHJhLXByZWRpY3Rpb24gcHJvY2Vzcy4gUmVmZXIgdG8gc3ViY2xhdXNlICAiNy40LjMuMyBBZGFwdGl2ZQotICogICAgICAgICAgICAgICAgICAgYWMgY29lZmZpY2llbnQgcHJlZGljdGlvbiIgb2YgSVNPL0lFQyAxNDQ5Ni0yKE1QRUc0IFBhcnQyKSBmb3IgYWNjdXJhdGUgZGVzY3JpcHRpb24uCi0gKiBbaW5dCWJsb2NrSW5kZXgJCWJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZAotICoJCQkJCQkJCXBvc2l0aW9uIGFzIGRlZmluZWQgaW4gc3ViY2xhdXNlIDYuMS4zLjgsCi0gKgkJCQkJCQkJRmlndXJlIDYtNSBvZiBJU08vSUVDIDE0NDk2LTIuIAotICogW2luXQlpbnRyYURDVkxDCQlhIGNvZGUgZGV0ZXJtaW5lZCBieSBpbnRyYV9kY192bGNfdGhyIGFuZCBRUC4KLSAqCQkJCQkJCQlUaGlzIGFsbG93cyBhIG1lY2hhbmlzbSB0byBzd2l0Y2ggYmV0d2VlbiB0d28gVkxDCi0gKgkJCQkJCQkJZm9yIGNvZGluZyBvZiBJbnRyYSBEQyBjb2VmZmljaWVudHMgYXMgcGVyIFRhYmxlCi0gKgkJCQkJCQkJNi0yMSBvZiBJU08vSUVDIDE0NDk2LTIuIAotICogW2luXQlBQ1ByZWRGbGFnCQlhIGZsYWcgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIChvZiBsdW1pbmFuY2UpIGluZGljYXRpbmcKLSAqCQkJCQkJCQlpZiB0aGUgYWMgY29lZmZpY2llbnRzIG9mIHRoZSBmaXJzdCByb3cgb3IgZmlyc3QKLSAqCQkJCQkJCQljb2x1bW4gYXJlIGRpZmZlcmVudGlhbGx5IGNvZGVkIGZvciBpbnRyYSBjb2RlZAotICoJCQkJCQkJCW1hY3JvYmxvY2suCi0gKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgYSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsCi0gKgkJCQkJCQlhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbmxpbmVhciBpbnRyYSBEQyBtb2RlLgotICogW291dF0JcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcwotICoJCQkJCQkJCWRlY29kZWQsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUKLSAqCQkJCQkJCQlpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKLSAqIFtvdXRdCXBCaXRPZmZzZXQJCSpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKgkJCQkJCQkJY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICoJCQkJCQkJCSpwcEJpdFN0cmVhbQotICogW291dF0JcERzdAkJCXBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSBkZXN0aW5hdGlvbiBwbGFuZS4KLSAqCQkJCQkJCQlwRHN0IHNob3VsZCBiZSAxNi1ieXRlIGFsaWduZWQuCi0gKiBbb3V0XQlwQ29lZkJ1ZlJvdwkJcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgotICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCi0gKiAgIC0JQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvZWZCdWZSb3csIHBDb2VmQnVmQ29sLCBwUVBCdWYsIHBEc3QuCi0gKiAgICAgIG9yCi0gKiAgIC0gIEF0IGxlYXN0IG9uZSBvZiB0aGUgYmVsb3cgY2FzZTogKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSwgY3VyUVAgZXhjZWVkcyAoMSwgMzEpLAotICogICAgICBibG9ja0luZGV4IGV4Y2VlZHMgWzAsOV0sIHN0ZXAgaXMgbm90IHRoZSBtdWx0aXBsZSBvZiA4LCBpbnRyYURDVkxDIGlzIHplcm8gd2hpbGUKLSAqICAgICAgYmxvY2tJbmRleCBncmVhdGVyIHRoYW4gNS4KLSAqICAgICAgb3IKLSAqICAgLQlwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQKLSAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhKAotICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgIE9NWF9VOCAqcERzdCwKLSAgICAgT01YX0lOVCBzdGVwLAotICAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKLSAgICAgT01YX1MxNiAqcENvZWZCdWZDb2wsCi0gICAgIE9NWF9VOCBjdXJRUCwKLSAgICAgY29uc3QgT01YX1U4ICpwUVBCdWYsCi0gICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKLSAgICAgT01YX0lOVCBpbnRyYURDVkxDLAotICAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCi0JIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotICkKLXsKLSAgICBPTVhfUzE2IHRlbXBCdWYxWzc5XSwgdGVtcEJ1ZjJbNzldOwotICAgIE9NWF9TMTYgKnBUZW1wQnVmMSwgKnBUZW1wQnVmMjsKLSAgICBPTVhfSU5UIHByZWREaXIsIHByZWRBQ0RpcjsKLSAgICBPTVhfSU5UICBwcmVkUVA7Ci0gICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wOwotICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7Ci0gICAgCi0gICAgCi0gICAgLyogQWxpZ25pbmcgdGhlIGxvY2FsIGJ1ZmZlcnMgKi8KLSAgICBwVGVtcEJ1ZjEgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmMSk7Ci0gICAgcFRlbXBCdWYyID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1ZjIpOwotICAgIAotICAgIC8qIFNldHRpbmcgdGhlIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uIGFuZCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAqLwotICAgIGFybVZDTTRQMl9TZXRQcmVkRGlyKAotICAgICAgICBibG9ja0luZGV4LAotICAgICAgICBwQ29lZkJ1ZlJvdywKLSAgICAgICAgcENvZWZCdWZDb2wsCi0gICAgICAgICZwcmVkRGlyLAotICAgICAgICAmcHJlZFFQLAotICAgICAgICBwUVBCdWYpOwotCi0gICAgcHJlZEFDRGlyID0gcHJlZERpcjsKLQotICAgIAotICAgIGlmIChBQ1ByZWRGbGFnID09IDApCi0gICAgewotICAgICAgICBwcmVkQUNEaXIgPSBPTVhfVkNfTk9ORTsKLSAgICB9Ci0KLSAgICAvKiBTZXR0aW5nIHRoZSB2aWRlb0NvbXAgKi8KLSAgICBpZiAoYmxvY2tJbmRleCA8PSAzKQotICAgIHsKLSAgICAgICAgdmlkZW9Db21wID0gT01YX1ZDX0xVTUlOQU5DRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdmlkZW9Db21wID0gT01YX1ZDX0NIUk9NSU5BTkNFOwotICAgIH0KLSAgICAKLQotICAgIC8qIFZMRCBhbmQgemlnemFnICovCi0gICAgaWYgKGludHJhRENWTEMgPT0gMSkKLSAgICB7Ci0gICAgICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQygKLSAgICAgICAgICAgIHBwQml0U3RyZWFtLAotICAgICAgICAgICAgcEJpdE9mZnNldCwKLSAgICAgICAgICAgIHBUZW1wQnVmMSwKLSAgICAgICAgICAgIHByZWRBQ0RpciwKLSAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgICAgICAgICB2aWRlb0NvbXApOwotICAgICAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDKAotICAgICAgICAgICAgcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICBwQml0T2Zmc2V0LAotICAgICAgICAgICAgcFRlbXBCdWYxLAotICAgICAgICAgICAgcHJlZEFDRGlyLAotICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcik7Ci0gICAgICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIH0KLQotICAgIC8qIEFDIERDIHByZWRpY3Rpb24gKi8KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhKAotICAgICAgICBwVGVtcEJ1ZjEsCi0gICAgICAgIHBDb2VmQnVmUm93LAotICAgICAgICBwQ29lZkJ1ZkNvbCwKLSAgICAgICAgY3VyUVAsCi0gICAgICAgIHByZWRRUCwKLSAgICAgICAgcHJlZERpciwKLSAgICAgICAgQUNQcmVkRmxhZywKLSAgICAgICAgdmlkZW9Db21wKTsKLSAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICAKLSAgICAvKiBEZXF1YW50aXphdGlvbiAqLwotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9RdWFudEludkludHJhX0koCi0gICAgIHBUZW1wQnVmMSwKLSAgICAgY3VyUVAsCi0gICAgIHZpZGVvQ29tcCwKLSAgICAgc2hvcnRWaWRlb0hlYWRlcik7Ci0gICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgCi0gICAgLyogSW52ZXJzZSB0cmFuc2Zvcm0gKi8KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfSURDVDh4OGJsayAocFRlbXBCdWYxLCBwVGVtcEJ1ZjIpOwotICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIAotICAgIC8qIFBsYWNpbmcgdGhlIGxpbmVhciBhcnJheSBpbnRvIHRoZSBkZXN0aW5hdGlvbiBwbGFuZSBhbmQgY2xpcHBpbmcKLSAgICAgICBpdCB0byAwIHRvIDI1NSAqLwotICAgIAotCWFybVZDTTRQMl9DbGlwOChwVGVtcEJ1ZjIscERzdCxzdGVwKTsKLQkKLQkKLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1Bfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlOTUzOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1Bfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07ICoqKioqKioqKioKLTsgKiAKLTsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMKLTsgKiBPcGVuTUFYIERMOiB2MS4wLjIKLTsgKiBSZXZpc2lvbjogICAxMjI5MAotOyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOyAqIAotOyAqIAotOyAqIAotOyAqIAotOyAqKgotOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUAotOyAqCi07ICogRGVzY3JpcHRpb246Ci07ICogRGVjb2RlcyBhbmQgcGFkcyBmb3VyIG1vdGlvbiB2ZWN0b3JzIG9mIHRoZSBub24taW50cmEgbWFjcm9ibG9jayBpbiBQLVZPUC4KLTsgKiBUaGUgbW90aW9uIHZlY3RvciBwYWRkaW5nIHByb2Nlc3MgaXMgc3BlY2lmaWVkIGluIHN1YmNsYXVzZSA3LjYuMS42IG9mCi07ICogSVNPL0lFQyAxNDQ5Ni0yLgotOyAqCi07ICogUmVtYXJrczoKLTsgKgotOyAqCi07ICogUGFyYW1ldGVyczoKLTsgKiBbaW5dICAgIHBwQml0U3RyZWFtICAgICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0IHN0cmVhbSBidWZmZXIKLTsgKiBbaW5dICAgIHBCaXRPZmZzZXQgICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluCi07ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAtN10uCi07ICogW2luXSAgICBwU3JjTVZMZWZ0TUIgICAgICAgcG9pbnRlcnMgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVycyBvZiB0aGUKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tzIHNwZWNpYWxseSBhdCB0aGUgbGVmdCBzaWRlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sKLTsgKiAgICAgICAgICAgICAgICAgICAgIHJlc3BlY3RpdmVseS4KLTsgKiBbaW5dICAgIHBTcmNNVlVwcGVyTUIgICAgICBwb2ludGVycyB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXJzIG9mIHRoZQotOyAqICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja3Mgc3BlY2lhbGx5IGF0IHRoZSB1cHBlciBzaWRlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sKLTsgKiAgICAgICAgICAgICAgICAgICAgIHJlc3BlY3RpdmVseS4KLTsgKiBbaW5dICAgIHBTcmNNVlVwcGVyUmlnaHRNQiBwb2ludGVycyB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXJzIG9mIHRoZQotOyAqICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja3Mgc3BlY2lhbGx5IGF0IHRoZSB1cHBlci1yaWdodCBzaWRlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sKLTsgKiAgICAgICAgICAgICAgICAgICAgIHJlc3BlY3RpdmVseS4KLTsgKiBbaW5dICAgIGZjb2RlRm9yd2FyZCAgICAgICBhIGNvZGUgZXF1YWwgdG8gdm9wX2Zjb2RlX2ZvcndhcmQgaW4gTVBFRy00Ci07ICogICAgICAgICAgICAgICAgICAgICBiaXQgc3RyZWFtIHN5bnRheAotOyAqIFtpbl0gICAgTUJUeXBlICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4gSWYgTUJUeXBlCi07ICogICAgICAgICAgICAgICAgICAgICBpcyBub3QgZXF1YWwgdG8gT01YX1ZDX0lOVEVSNFYsIHRoZSBkZXN0aW5hdGlvbgotOyAqICAgICAgICAgICAgICAgICAgICAgbW90aW9uIHZlY3RvciBidWZmZXIgaXMgc3RpbGwgZmlsbGVkIHdpdGggdGhlCi07ICogICAgICAgICAgICAgICAgICAgICBzYW1lIGRlY29kZWQgdmVjdG9yLgotOyAqIFtvdXRdICAgcHBCaXRTdHJlYW0gICAgICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwKLTsgKiAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAotOyAqICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlcgotOyAqIFtvdXRdICAgcEJpdE9mZnNldCAgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi07ICogICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci07ICogICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0KLTsgKiBbb3V0XSAgIHBEc3RNVkN1ck1CICAgICAgICAgcG9pbnRlciB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXIgb2YgdGhlIGN1cnJlbnQKLTsgKiAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2sgd2hpY2ggY29udGFpbnMgZm91ciBkZWNvZGVkIG1vdGlvbiB2ZWN0b3JzCi07ICoKLTsgKiBSZXR1cm4gVmFsdWU6Ci07ICogT01YX1N0c19Ob0VyciAtbm8gZXJyb3IKLTsgKiAKLTsgKiAgICAgICAgICAgICAgICAgICAgIAotOyAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCi07ICoKLTsgKgotICAgICAKLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAotICAgICAgICBJTkNMVURFIG9teFZDX3MuaAotICAgICAgICAKLSAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgSUYgQVJNMTEzNkpTCi0KLTsvL0lucHV0IEFyZ3VtZW50cwotCi1wcEJpdFN0cmVhbSAgICAgICAgICAgUk4gMAotcEJpdE9mZnNldCAgICAgICAgICAgIFJOIDEKLXBTcmNNVkxlZnRNQiAgICAgICAgICBSTiAyCi1wU3JjTVZVcHBlck1CICAgICAgICAgUk4gMwotcFNyY01WVXBwZXJSaWdodE1CICAgIFJOIDQKLXBEc3RNVkN1ck1CICAgICAgICAgICBSTiA1Ci1mY29kZUZvcndhcmQgICAgICAgICAgUk4gNgotTUJUeXBlICAgICAgICAgICAgICAgIFJOIDcKLQotOy8vTG9jYWwgVmFyaWFibGVzCi0KLXplcm8gICAgICAgICAgICAgICAgICBSTiA0Ci1vbmUgICAgICAgICAgICAgICAgICAgUk4gNAotc2NhbGVGYWN0b3IgICAgICAgICAgIFJOIDEKLQotCi1SZXR1cm4gICAgICAgICAgICAgICAgUk4gMAotCi1WbGNNVkQgICAgICAgICAgICAgICAgUk4gMAotaW5kZXggICAgICAgICAgICAgICAgIFJOIDQKLUNvdW50ICAgICAgICAgICAgICAgICBSTiA3Ci0KLW12SG9yRGF0YSAgICAgICAgICAgICBSTiA0Ci1tdkhvclJlc2lkdWFsICAgICAgICAgUk4gMAotCi1tdlZlckRhdGEgICAgICAgICAgICAgUk4gNCAgICAgICAgICAgICAKLW12VmVyUmVzaWR1YWwgICAgICAgICBSTiAwCi0KLXRlbXAgICAgICAgICAgICAgICAgICBSTiAxCi0KLXRlbXAxICAgICAgICAgICAgICAgICBSTiAzCi1IaWdoICAgICAgICAgICAgICAgICAgUk4gNAotTG93ICAgICAgICAgICAgICAgICAgIFJOIDIKLVJhbmdlICAgICAgICAgICAgICAgICBSTiAxCi0KLUJsa0NvdW50ICAgICAgICAgICAgICBSTiAxNAotCi1kaWZmTVZkeCAgICAgICAgICAgICAgUk4gMAotZGlmZk1WZHkgICAgICAgICAgICAgIFJOIDEKLQotOy8vIFNjcmF0Y2ggUmVnaXN0ZXJzCi0KLVJCaXRTdHJlYW0gICAgICAgICAgICBSTiA4Ci1SQml0Q291bnQgICAgICAgICAgICAgUk4gOQotUkJpdEJ1ZmZlciAgICAgICAgICAgIFJOIDEwCi0KLVQxICAgICAgICAgICAgICAgICAgICBSTiAxMQotVDIgICAgICAgICAgICAgICAgICAgIFJOIDEyCi1MUiAgICAgICAgICAgICAgICAgICAgUk4gMTQKLQotICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYVZsY01WRAotICAgICAgIElNUE9SVCAgICAgICAgICBvbXhWQ000UDJfRmluZE1WcHJlZAotCi0gICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSAgICAgICAgCi0gICAgICAgCi0gICAgICAgTV9BTExPQzQgICAgICAgIHBwRHN0TVZDdXJNQiw0Ci0gICAgICAgTV9BTExPQzQgICAgICAgIHBEc3RNVlByZWRNRSw0Ci0gICAgICAgTV9BTExPQzQgICAgICAgIHBCbGtDb3VudCw0Ci0gICAgICAgCi0gICAgICAgTV9BTExPQzQgICAgICAgIHBwcEJpdFN0cmVhbSw0Ci0gICAgICAgTV9BTExPQzQgICAgICAgIHBwQml0T2Zmc2V0LDQKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcHBTcmNNVkxlZnRNQiw0Ci0gICAgICAgTV9BTExPQzQgICAgICAgIHBwU3JjTVZVcHBlck1CLDQKLSAgICAgICAKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcGRpZmZNVmR4LDQKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcGRpZmZNVmR5LDQKLSAgICAgICBNX0FMTE9DNCAgICAgICAgcEhpZ2gsNAotICAgICAgIAotICAgICAgICAgICAgICAKLQotCi0gICAgICAgTV9TVEFSVCAgIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QLHIxMQotICAgICAgIAotICAgICAgIE1fQVJHICAgICAgICAgICBwU3JjTVZVcHBlclJpZ2h0TUJvblN0YWNrLDQgICAgICAgICAgIDsvLyBwb2ludGVyIHRvICBwU3JjTVZVcHBlclJpZ2h0TUIgb24gc3RhY2sKLSAgICAgICBNX0FSRyAgICAgICAgICAgcERzdE1WQ3VyTUJvblN0YWNrLDQgICAgICAgICAgICAgICAgICA7Ly8gcG9pbnRlciB0byBwRHN0TVZDdXJNQiBvbiBzdGFjawotICAgICAgIE1fQVJHICAgICAgICAgICBmY29kZUZvcndhcmRvblN0YWNrLDQgICAgICAgICAgICAgICAgIDsvLyBwb2ludGVyIHRvIGZjb2RlRm9yd2FyZCBvbiBzdGFjayAKLSAgICAgICBNX0FSRyAgICAgICAgICAgTUJUeXBlb25TdGFjayw0ICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcG9pbnRlciB0byBNQlR5cGUgb24gc3RhY2sKLQotICAgICAgCi0gICAgICAgCi0gICAgICAgCi0gICAgICAgCi0gICAgICAgOy8vIEluaXRpYWxpemluZyB0aGUgQml0U3RyZWFtIE1hY3JvCi0KLSAgICAgICBNX0JEX0lOSVQwICAgICAgcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIFJCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudAotICAgICAgIE1fTERSICAgICAgICAgICBNQlR5cGUsTUJUeXBlb25TdGFjayAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIE1CVHlwZSBmcm9tIHN0YWNrCi0gICAgICAgTV9MRFIgICAgICAgICAgIHBEc3RNVkN1ck1CLHBEc3RNVkN1ck1Cb25TdGFjayAgICAgICAgOy8vIExvYWQgcERzdE1WQ3VyTUIgZnJvbSBzdGFjawotICAgICAgIE1PViAgICAgICAgICAgICB6ZXJvLCMwCi0KLSAgICAgICBURVEgICAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5UUkEgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRSQQotICAgICAgIFRFUU5FICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRSQV9RICAgICAgICAgICAgICAgIDsvLyBjaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVFJBX1EKLSAgICAgICBTVFJFUSAgICAgICAgICAgemVybyxbcERzdE1WQ3VyTUJdCi0gICAgICAgTV9CRF9JTklUMSAgICAgIFQxLCBUMiwgVDIKLSAgICAgICBTVFJFUSAgICAgICAgICAgemVybyxbcERzdE1WQ3VyTUIsIzRdCi0gICAgICAgTV9CRF9JTklUMiAgICAgIFQxLCBUMiwgVDIKLSAgICAgICBTVFJFUSAgICAgICAgICAgemVybyxbcERzdE1WQ3VyTUIsIzRdCi0gICAgICAgTU9WRVEgICAgICAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgotICAgICAgIE1PViAgICAgICAgICAgICBCbGtDb3VudCwjMAotICAgICAgIFNUUkVRICAgICAgICAgICB6ZXJvLFtwRHN0TVZDdXJNQiwjNF0KLSAgICAgICAKLSAgICAgICBCRVEgICAgICAgICAgICAgRXhpdE9LCi0KLSAgICAgICBURVEgICAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVI0ViAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRFUjRWCi0gICAgICAgVEVRTkUgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSNFZfUSAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5URVI0Vl9RCi0gICAgICAgTU9WRVEgICAgICAgICAgIENvdW50LCM0Ci0KLSAgICAgICBURVEgICAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVIgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRFUgotICAgICAgIFRFUU5FICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUl9RICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVEVSX1EKLSAgICAgICBNT1ZFUSAgICAgICAgICAgQ291bnQsIzEKLSAgICAgICAKLSAgICAgICBNX0xEUiAgICAgICAgICAgZmNvZGVGb3J3YXJkLGZjb2RlRm9yd2FyZG9uU3RhY2sgICAgICA7Ly8gTG9hZCBmY29kZUZvcndhcmQgIGZyb20gc3RhY2sKLQotICAgICAgIDsvLyBTdG9yaW5nIHRoZSB2YWx1ZXMgdGVtcG9yYXJpbHkgb24gc3RhY2sKLQotICAgICAgIE1fU1RSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0gICAgICAgICAgICAgIAotICAgICAgIE1fU1RSICAgICAgICAgICBwQml0T2Zmc2V0LHBwQml0T2Zmc2V0Ci0gICAgICAgICAgICAKLQotICAgICAgIFNVQiAgICAgICAgICAgICB0ZW1wLGZjb2RlRm9yd2FyZCwjMSAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPWZjb2RlRm9yd2FyZC0xCi0gICAgICAgTU9WICAgICAgICAgICAgIG9uZSwjMQotICAgICAgIE1fU1RSICAgICAgICAgICBwU3JjTVZMZWZ0TUIscHBTcmNNVkxlZnRNQgotICAgICAgIExTTCAgICAgICAgICAgICBzY2FsZUZhY3RvcixvbmUsdGVtcCAgICAgICAgICAgICAgICAgIDsvLyBzY2FsZUZhY3Rvcj0xPDwoZmNvZGVGb3J3YXJkLTEpCi0gICAgICAgTV9TVFIgICAgICAgICAgIHBTcmNNVlVwcGVyTUIscHBTcmNNVlVwcGVyTUIKLSAgICAgICBMU0wgICAgICAgICAgICAgc2NhbGVGYWN0b3Isc2NhbGVGYWN0b3IsIzUgICAgICAgICAgICAKLSAgICAgICBNX1NUUiAgICAgICAgICAgc2NhbGVGYWN0b3IscEhpZ2ggICAgICAgICAgICAgICAgICAgICA7Ly8gW3BIaWdoXT0zMipzY2FsZUZhY3RvcgotICAgICAgICAgICAgICAKLSAgICAgICA7Ly8gVkxEIERlY29kaW5nCi0KLQotTG9vcAotCi0gICAgICAgTERSICAgICAgICAgICAgIFZsY01WRCwgPWFybVZDTTRQMl9hVmxjTVZEICAgICAgICA7Ly8gTG9hZCB0aGUgb3B0aW1pemVkIE1WRCBWTEMgdGFibGUKLQotICAgICAgIDsvLyBIb3Jpem9udGFsIERhdGEgYW5kIFJlc2lkdWFsIGNhbGN1bGF0aW9uCi0KLSAgICAgICBMRFIgICAgICAgICAgICAgdGVtcCw9MHhGRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICBNX0JEX1ZMRCAgICAgICAgaW5kZXgsVDEsVDIsVmxjTVZELDMsMiAgICAgICAgICAgICAgICA7Ly8gdmFyaWFibGUgbGVuZ2h0IGRlY29kaW5nIHVzaW5nIHRoZSBtYWNybwotICAgICAgCi0gICAgICAgVEVRICAgICAgICAgICAgIGluZGV4LHRlbXAKLSAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIEVycm9yIE1lc3NhZ2UgaWYgdGhlIGRlY29kZWQgc3ltYm9sIGlzIGFuIGludmFsaWVkIHN5bWJvbCAKLSAgICAgICAKLSAgICAgICBTVUIgICAgICAgICAgICAgbXZIb3JEYXRhLGluZGV4LCMzMiAgICAgICAgICAgICAgICAgICA7Ly8gbXZIb3JEYXRhPWluZGV4LTMyICAgICAgICAgICAgIAotICAgICAgIE1PViAgICAgICAgICAgICBtdkhvclJlc2lkdWFsLCMxICAgICAgICAgICAgICAgICAgICAgIDsvLyBtdkhvclJlc2lkdWFsPTEKLSAgICAgICBDTVAgICAgICAgICAgICAgZmNvZGVGb3J3YXJkLCMxCi0gICAgICAgVEVRTkUgICAgICAgICAgIG12SG9yRGF0YSwjMAotICAgICAgIE1PVkVRICAgICAgICAgICBkaWZmTVZkeCxtdkhvckRhdGEgICAgICAgICAgICAgICAgICAgIDsvLyBpZiBzY2FsZUZhY3Rvcj0xKGZjb2RlRm9yd2FyZD0xKSBvciBtdkhvckRhdGE9MCBkaWZmTVZkeD1tdkhvckRhdGEgICAgICAgICAKLSAgICAgICBCRVEgICAgICAgICAgICAgVmVydGljYWxEYXRhCi0gICAgICAgCi0gICAgICAgU1VCICAgICAgICAgICAgIHRlbXAsZmNvZGVGb3J3YXJkLCMxCi0gICAgICAgTV9CRF9WUkVBRDggICAgIG12SG9yUmVzaWR1YWwsdGVtcCxUMSxUMiAgICAgICAgICAgICAgOy8vIGdldCBtdkhvclJlc2lkdWFsIGZyb20gYml0c3RyZWFtIGlmIGZjb2RlRm9yd2FyZD4xIGFuZCBtdkhvckRhdGEhPTAgICAgICAgICAgICAgIAotICAgICAgIAotICAgICAgIENNUCAgICAgICAgICAgICBtdkhvckRhdGEsIzAKLSAgICAgICBSU0JMVCAgICAgICAgICAgbXZIb3JEYXRhLG12SG9yRGF0YSwjMCAgICAgICAgICAgICAgICA7Ly8gbXZIb3JEYXRhPWFicyhtdkhvckRhdGEpCi0gICAgICAgU1VCICAgICAgICAgICAgIG12SG9yUmVzaWR1YWwsbXZIb3JSZXNpZHVhbCxmY29kZUZvcndhcmQKLSAgICAgICBTTUxBQkIgICAgICAgICAgZGlmZk1WZHgsbXZIb3JEYXRhLGZjb2RlRm9yd2FyZCxtdkhvclJlc2lkdWFsIDsvLyBkaWZmTVZkeD1hYnMobXZIb3JEYXRhKSpmY29kZUZvcndhcmQrbXZIb3JSZXNpZHVhbC1mY29kZUZvcndhcmQKLSAgICAgICBBREQgICAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsIzEKLSAgICAgICBSU0JMVCAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsIzAKLSAgICAgICAKLSAgICAgICA7Ly8gVmVydGljYWwgRGF0YSBhbmQgUmVzaWR1YWwgY2FsY3VsYXRpb24KLQotVmVydGljYWxEYXRhCi0KLSAgICAgICBNX1NUUiAgICAgICAgICAgZGlmZk1WZHgscGRpZmZNVmR4ICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgdGhlIGRpZmZNVmR4IG9uIHN0YWNrCi0gICAgICAgTERSICAgICAgICAgICAgIFZsY01WRCwgPWFybVZDTTRQMl9hVmxjTVZEICAgICAgICA7Ly8gTG9hZGluZyB0aGUgYWRkcmVzcyBvZiBvcHRpbWl6ZWQgVkxDIHRhYmxlcwotCi0gICAgICAgTERSICAgICAgICAgICAgIHRlbXAsPTB4RkZGCi0gICAgICAgTV9CRF9WTEQgICAgICAgIGluZGV4LFQxLFQyLFZsY01WRCwzLDIgICAgICAgICAgICAgICAgOy8vIFZMQyBkZWNvZGluZyB1c2luZyB0aGUgbWFjcm8KLSAgICAgICAKLSAgICAgICBURVEgICAgICAgICAgICAgaW5kZXgsdGVtcAotICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gRXJyb3IgTWVzc2FnZSBpZiBhbiBJbnZhbGllZCBTeW1ib2wgb2NjdXJzCi0gICAgICAgCi0gICAgICAgU1VCICAgICAgICAgICAgIG12VmVyRGF0YSxpbmRleCwjMzIgICAgICAgICAgICAgICAgICAgOy8vIG12VmVyRGF0YT1pbmRleC0zMiAgICAgICAgICAgICAKLSAgICAgICBNT1YgICAgICAgICAgICAgbXZWZXJSZXNpZHVhbCwjMSAgICAgCi0gICAgICAgQ01QICAgICAgICAgICAgIGZjb2RlRm9yd2FyZCwjMQotICAgICAgIFRFUU5FICAgICAgICAgICBtdlZlckRhdGEsIzAKLSAgICAgICBNT1ZFUSAgICAgICAgICAgZGlmZk1WZHksbXZWZXJEYXRhICAgICAgICAgICAgICAgICAgICA7Ly8gZGlmZk1WZHkgPSBtdlZlckRhdGEgaWYgc2NhbGVGYWN0b3I9MShmY29kZUZvcndhcmQ9MSkgb3IgbXZWZXJEYXRhPTAKLSAgICAgICBCRVEgICAgICAgICAgICAgRmluZE1WUHJlZAotCi0gICAgICAgU1VCICAgICAgICAgICAgIHRlbXAsZmNvZGVGb3J3YXJkLCMxCi0gICAgICAgTV9CRF9WUkVBRDggICAgIG12VmVyUmVzaWR1YWwsdGVtcCxUMSxUMiAgICAgICAgICAgICAgOy8vIEdldCBtdlZlclJlc2lkdWFsIGZyb20gYml0IHN0cmVhbSBpZiBmY29kZUZvcndhcmQ+MSBhbmQgbW5WZXJEYXRhIT0wCi0gICAgICAgICAgICAgCi0KLSAgICAgICBDTVAgICAgICAgICAgICAgbXZWZXJEYXRhLCMwCi0gICAgICAgUlNCTFQgICAgICAgICAgIG12VmVyRGF0YSxtdlZlckRhdGEsIzAKLSAgICAgICBTVUIgICAgICAgICAgICAgbXZWZXJSZXNpZHVhbCxtdlZlclJlc2lkdWFsLGZjb2RlRm9yd2FyZAotICAgICAgIFNNTEFCQiAgICAgICAgICBkaWZmTVZkeSxtdlZlckRhdGEsZmNvZGVGb3J3YXJkLG12VmVyUmVzaWR1YWwgOy8vIGRpZmZNVmR5PWFicyhtdlZlckRhdGEpKmZjb2RlRm9yd2FyZCttdlZlclJlc2lkdWFsLWZjb2RlRm9yd2FyZAotICAgICAgIEFERCAgICAgICAgICAgICBkaWZmTVZkeSxkaWZmTVZkeSwjMQotICAgICAgIFJTQkxUICAgICAgICAgICBkaWZmTVZkeSxkaWZmTVZkeSwjMAotCi0gICAgICAgOy8vQ2FsbGluZyB0aGUgRnVuY3Rpb24gb214VkNNNFAyX0ZpbmRNVnByZWQKLSAgICAgICAgCi1GaW5kTVZQcmVkCi0KLSAgICAgICBNX1NUUiAgICAgICAgICAgZGlmZk1WZHkscGRpZmZNVmR5Ci0gICAgICAgQUREICAgICAgICAgICAgIHRlbXAscERzdE1WQ3VyTUIsQmxrQ291bnQsTFNMICMyICAgICAgOy8vIHRlbXA9cERzdE1WQ3VyTUJbQmxrQ291bnRdCi0gICAgICAgTV9TVFIgICAgICAgICAgIHRlbXAscHBEc3RNVkN1ck1CICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHRlbXAgb24gc3RhY2sgZm9yIHBhc3NpbmcgYXMgYW4gYXJndW1lbnQgdG8gRmluZE1WUHJlZAotICAgICAgIAotICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wLCMwCi0gICAgICAgTV9TVFIgICAgICAgICAgIHRlbXAscERzdE1WUHJlZE1FICAgICAgICAgICAgICAgICAgICAgOy8vIFBhc3MgcERzdE1WUHJlZE1FPU5VTEwgYXMgYW4gYXJndW1lbnQgICAgICAgICAKLSAgICAgICBNX1NUUiAgICAgICAgICAgQmxrQ291bnQscEJsa0NvdW50ICAgICAgICAgICAgICAgICAgICA7Ly8gUGFzc3MgQmxrQ291bnQgYXMgQXJndW1lbnQgdGhyb3VnaCBzdGFjawotCi0gICAgICAgTU9WICAgICAgICAgICAgIHRlbXAscFNyY01WTGVmdE1CICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAgKFJOIDEpPXBTcmNNVkxlZnRNQgotICAgICAgIE1fTERSICAgICAgICAgICBwU3JjTVZVcHBlclJpZ2h0TUIscFNyY01WVXBwZXJSaWdodE1Cb25TdGFjawotICAgICAgIE1PViAgICAgICAgICAgICBwU3JjTVZMZWZ0TUIscFNyY01WVXBwZXJNQiAgICAgICAgICAgIDsvLyBwU3JjTVZMZWZ0TUIgKCBSTiAyKSA9IHBTcmNNVlVwcGVyTUIKLSAgICAgICBNT1YgICAgICAgICAgICAgcHBCaXRTdHJlYW0scERzdE1WQ3VyTUIgICAgICAgICAgICAgICA7Ly8gcHBCaXRTdHJlYW0gICggUk4gMCkgPSBwRHN0TVZDdXJNQgotICAgICAgIE1PViAgICAgICAgICAgICBwU3JjTVZVcHBlck1CLHBTcmNNVlVwcGVyUmlnaHRNQiAgICAgIDsvLyBwU3JjTVZVcHBlck1CKCBSTiAzKSA9IHBTcmNNVlVwcGVyUmlnaHRNQiAgICAgIAotICAgICAgIEJMICAgICAgICAgICAgICBvbXhWQ000UDJfRmluZE1WcHJlZCAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBzdWJyb3V0aW5lIG9teFZDTTRQMl9GaW5kTVZwcmVkCi0KLSAgICAgICA7Ly8gU3RvcmUgSG9yaXpvbnRhbCBNb3Rpb24gVmVjdG9yCi0gICAgIAotICAgICAgIE1fTERSICAgICAgICAgICBCbGtDb3VudCxwQmxrQ291bnQgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIEJsa0NvdW50IGZyb20gc3RhY2sKLSAgICAgICBNX0xEUiAgICAgICAgICAgSGlnaCxwSGlnaCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSGlnaD0zMipzY2FsZUZhY3RvcgotICAgICAgIExTTCAgICAgICAgICAgICB0ZW1wMSxCbGtDb3VudCwjMiAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPUJsa0NvdW50KjQKLSAgICAgICBNX0xEUiAgICAgICAgICAgZGlmZk1WZHgscGRpZmZNVmR4ICAgICAgICAgICAgICAgICAgICA7Ly8gTGFhZCBkaWZmTVZkeAotICAgICAgIAotICAgICAgIExEUlNIICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQix0ZW1wMV0gICAgICAgICAgICAgIDsvLyB0ZW1wPXBEc3RNVkN1ck1CW0Jsa0NvdW50XQotICAgICAgIAotICAgICAgIAotICAgICAgIFJTQiAgICAgICAgICAgICBMb3csSGlnaCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb3cgPSAtMzIqc2NhbGVGYWN0b3IKLSAgICAgICBBREQgICAgICAgICAgICAgZGlmZk1WZHgsdGVtcCxkaWZmTVZkeCAgICAgICAgICAgICAgICA7Ly8gZGlmZk1WZHg9cERzdE1WQ3VyTUJbQmxrQ291bnRdK2RpZmZNVmR4Ci0gICAgICAgQUREICAgICAgICAgICAgIFJhbmdlLEhpZ2gsSGlnaCAgICAgICAgICAgICAgICAgICAgICAgOy8vIFJhbmdlPTY0KlNjYWxlRmFjdG9yCi0gICAgICAgU1VCICAgICAgICAgICAgIEhpZ2gsSGlnaCwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEhpZ2g9IDMyKnNjYWxlRmFjdG9yLTEKLQotICAgICAgIENNUCAgICAgICAgICAgICBkaWZmTVZkeCxMb3cgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBkaWZmTVZkeDxMb3cgICAgICAgICAgCi0gICAgICAgQURETFQgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LFJhbmdlICAgICAgICAgICAgICAgOy8vIGRpZmZNVmR4Kz1SYW5nZQotICAgICAgICAKLSAgICAgICBDTVAgICAgICAgICAgICAgZGlmZk1WZHgsSGlnaCAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICBTVUJHVCAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsUmFuZ2UgICAgICAgICAgICAgICA7Ly8gSWYgZGlmZk1WZHggPiBIaWdoIGRpZmZNVmR4LT1SYW5nZQotICAgICAgIFNUUkggICAgICAgICAgICBkaWZmTVZkeCxbcERzdE1WQ3VyTUIsdGVtcDFdCi0KLSAgICAgICA7Ly8gU3RvcmUgVmVydGljYWwKLQotICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wMSx0ZW1wMSwjMiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wMT00KkJsa0NvdW50KzIKLSAgICAgICBNX0xEUiAgICAgICAgICAgZGlmZk1WZHgscGRpZmZNVmR5ICAgICAgICAgICAgICAgICAgICA7Ly8gTGFhZCBkaWZmTVZkeQotICAgICAgIExEUlNIICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQix0ZW1wMV0gICAgICAgICAgICAgIDsvLyB0ZW1wPXBEc3RNVkN1ck1CW0Jsa0NvdW50XS5kaWZmTVZkeQotICAgICAgIEFERCAgICAgICAgICAgICBCbGtDb3VudCxCbGtDb3VudCwjMSAgICAgICAgICAgICAgICAgIDsvLyBCbGtDb3VudD1CbGtDb3VudCsxCi0gICAgICAgQUREICAgICAgICAgICAgIGRpZmZNVmR4LHRlbXAsZGlmZk1WZHggICAgICAgICAgICAgICAgCi0gICAgICAgQ01QICAgICAgICAgICAgIGRpZmZNVmR4LExvdwotICAgICAgIEFERExUICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCxSYW5nZSAgICAgICAgICAgICAgIDsvLyBJZiBkaWZmTVZkeTxMb3cgIGRpZmZNVmR5Kz1SYW5nZSAgICAgICAgICAgICAgICAKLSAgICAgICBDTVAgICAgICAgICAgICAgZGlmZk1WZHgsSGlnaAotICAgICAgIFNVQkdUICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCxSYW5nZSAgICAgICAgICAgICAgIDsvLyBJZiBkaWZmTVZkeSA+IEhpZ2ggZGlmZk1WZHktPVJhbmdlCi0gICAgICAgU1RSSCAgICAgICAgICAgIGRpZmZNVmR4LFtwRHN0TVZDdXJNQix0ZW1wMV0gICAgCi0gICAgICAgCi0gICAgICAgQ01QICAgICAgICAgICAgIEJsa0NvdW50LENvdW50Ci0gICAgICAgTV9MRFIgICAgICAgICAgIHBTcmNNVkxlZnRNQixwcFNyY01WTGVmdE1CCi0gICAgICAgTV9MRFIgICAgICAgICAgIHBTcmNNVlVwcGVyTUIscHBTcmNNVlVwcGVyTUIKLQotICAgICAgIEJMVCAgICAgICAgICAgICBMb29wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBCbGtDb3VudDxDb3VudCBDb250aW51ZSB0aGUgTG9vcAotCi0KLSAgICAgICA7Ly8gSWYgTUJUeXBlPU9NWF9WQ19JTlRFUiBvciBNQnR5cGU9T01YX1ZDX0lOVEVSX1EgY29weSBwRHN0TVZDdXJNQlswXSB0bwotICAgICAgIDsvLyBwRHN0TVZDdXJNQlsxXSwgcERzdE1WQ3VyTUJbMl0sIHBEc3RNVkN1ck1CWzNdIAotCi0gICAgICAgTV9MRFIgICAgICAgICAgIE1CVHlwZSxNQlR5cGVvblN0YWNrCi0KLSAgICAgICBURVEgICAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICBURVFORSAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVJfUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICBMRFJFUSAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUJdCi0gICAgICAgTV9MRFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbQotICAgICAgIFNUUkVRICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQiwjNF0KLSAgICAgICAKLSAgICAgICBTVFJFUSAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUIsIzhdCi0gICAgICAgU1RSRVEgICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLCMxMl0KLSAgICAgICAKLSAgICAgICAKLSAgICAgICBNX0xEUiAgICAgICAgICAgcEJpdE9mZnNldCxwcEJpdE9mZnNldAotICAgICAgIDsvL0VuZGluZyB0aGUgbWFjcm8KLSAgICAgICBNX0JEX0ZJTkkgICAgICAgcHBCaXRTdHJlYW0scEJpdE9mZnNldCAgICAgICAgICAgICAgICAgOy8vIEZpbmlzaGluZyB0aGUgTWFjcm8gICAgICAgCi0KLSAgICAgICAKLSAgICAgICBNT1YgICAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCi0gICAgICAgQiAgICAgICAgICAgICAgIEV4aXRPSwotIAotRXhpdEVycm9yCi0KLSAgICAgICBNX0xEUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtCi0gICAgICAgTV9MRFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBCaXRPZmZzZXQKLSAgICAgICA7Ly9FbmRpbmcgdGhlIG1hY3JvCi0gICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQKLSAgICAgICAKLSAgICAgICBNT1YgICAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX0VycgotCi1FeGl0T0sgICAgICAgICAgICAgCi0KLSAgICAgICBNX0VORAotICAgICAgIEVORElGCi0gICAgICAgRU5ECi0KLQotICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNmRmZTQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXJfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07LyoqCi07ICogCi07ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMKLTsgKiBPcGVuTUFYIERMOiB2MS4wLjIKLTsgKiBSZXZpc2lvbjogICAxMjI5MAotOyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOyAqIAotOyAqIAotOyAqIAotOyAqCi07ICogRGVzY3JpcHRpb246IAotOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCi07ICogZm9yIGludGVyIGJsb2NrLgotOyAqCi07ICoKLTsgKgotOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyCi07ICoKLTsgKiBEZXNjcmlwdGlvbjoKLTsgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRlciBjb2RlZCBibG9jay4KLTsgKgotOyAqIFJlbWFya3M6Ci07ICoKLTsgKiBQYXJhbWV0ZXJzOgotOyAqIFtpbl0gICAgcHBCaXRTdHJlYW0gICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotOyAqICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgotOyAqIFtpbl0gICAgcEJpdE9mZnNldCAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLTsgKiAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gICAgWzAtN10uCi07ICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgICBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgotOyAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKLTsgKiAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQotOyAqICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKLTsgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotOyAqICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci07ICogICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQotOyAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAotOyAqICAgICAgICAgICAgICAgICAgICBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQKLTsgKgotOyAqIFJldHVybiBWYWx1ZToKLTsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKLTsgKiAgIC1BdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0LCBvcgotOyAqICAgLXBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IKLTsgKiAgIC0qcEJpdE9mZnNldCBleGNlZWRzIFswLDddLgotOyAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCi07ICogICAtQXQgbGVhc3Qgb25lIG1hcmsgYml0IGlzIGVxdWFsIHRvIHplcm8KLTsgKiAgIC1FbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIHN0cmVhbSBjb2RlIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBWTEMgdGFibGUKLTsgKiAgIC1FbmNvdW50ZXJlZCBhbmQgaWxsZWdhbCBjb2RlIGluIHRoZSBWTEMgRkxDIHRhYmxlCi07ICogICAtVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0Ci07ICoKLTsgKi8KLQotCi0gICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKLQotCi0gICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUwotCi0gICAgIAotCi0KLQotICAgICBJRiBBUk0xMTM2SlMKLSAgICAgCi0gICAgICAgIDsvLyBJbXBvcnQgdmFyaW91cyB0YWJsZXMgbmVlZGVkIGZvciB0aGUgZnVuY3Rpb24KLQotICAgICAgICAKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRlclZsY0wwTDEgICAgICAgICAgICAgOy8vIENvbnRhaW5zIG9wdGltaXplZCBhbmQgcGFja2VkIFZMQyBUYWJsZXMgZm9yIGJvdGggTGFzdCA9MSBhbmQgbGFzdD0wCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUGFja2VkIGluIFJ1bjpMZXZlbDpMYXN0IGZvcm1hdAotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDBMMUxNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgTE1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDBMMVJNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgUk1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICA7Ly8gY29udGFpbnMgY2xhc3NpY2FsIFppZ3phZyB0YWJsZSBlbnRyaWVzIHdpdGggZG91YmxlIHRoZSBvcmlnaW5hbCB2YWx1ZXMKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCi0KLQotCi07Ly9JbnB1dCBBcmd1bWVudHMKLQotcHBCaXRTdHJlYW0gICAgICAgICAgUk4gMAotcEJpdE9mZnNldCAgICAgICAgICAgUk4gMQotcERzdCAgICAgICAgICAgICAgICAgUk4gMgotc2hvcnRWaWRlb0hlYWRlciAgICAgUk4gMwotCi07Ly9Mb2NhbCBWYXJpYWJsZXMKLQotUmV0dXJuICAgICAgICAgICAgICAgUk4gMAotCi1wVmxjVGFibGVMMEwxICAgICAgICBSTiA0Ci1wTE1BWFRhYmxlTDBMMSAgICAgICBSTiA0Ci1wUk1BWFRhYmxlTDBMMSAgICAgICBSTiA0Ci1wWmlnemFnVGFibGUgICAgICAgICBSTiA0Ci1Db3VudCAgICAgICAgICAgICAgICBSTiA2Ci0KLQotICAgICAgICAKLSAgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSB0byBzdG9yZSB0aGUgVkxDLFppZ3phZyxMTUFYIGFuZCBSTUFYIHRhYmxlcwotICAgICAKLSAgICAgICAgCi0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFZsY1RhYmxlTDBMMSw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcExNQVhUYWJsZUwwTDEsNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBSTUFYVGFibGVMMEwxLDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwWmlnemFnVGFibGUsNAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcixyMTIKLQotICAgICAgICAKLQotICAgICAgICAKLSAgICAgICAgTERSICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSwgPWFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiAgICAgICA7Ly8gTG9hZCB6aWd6YWcgdGFibGUKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBaaWd6YWdUYWJsZSxwcFppZ3phZ1RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHppZ3phZyB0YWJsZSBvbiBzdGFjayB0byBwYXNzIGFzIGFyZ3VtZW50IHRvIHVuc2FmZSBmdW5jdGlvbgotICAgICAgICBMRFIgICAgICAgICAgICAgcFZsY1RhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRlclZsY0wwTDEgICAgICAgICAgICAgIDsvLyBMb2FkIG9wdGltaXplZCBWTEMgdGFibGUgd2l0aCBib3RoIEw9MCBhbmQgTD0xIGVudHJpZXMKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBWbGNUYWJsZUwwTDEscHBWbGNUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIG9wdGltaXplZCBWTEMgdGFibGUgYWRkcmVzcyBvbiBzdGFjawotICAgICAgICBMRFIgICAgICAgICAgICAgcExNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50ZXJMMEwxTE1BWCAgICAgICAgICAgIDsvLyBMb2FkIEludGVybGVhdmVkIEw9MCBhbmQgTD0xIExNQVggVGFibGVzCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSxwcExNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBMTUFYIHRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKLSAgICAgICAgTERSICAgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludGVyTDBMMVJNQVggICAgICAgICAgICA7Ly8gTG9hZCBJbnRlcmxlYXZlZCBMPTAgYW5kIEw9MSBSTUFYIFRhYmxlcwotICAgICAgICBNT1YgICAgICAgICAgICAgQ291bnQsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc2V0IHN0YXJ0PTAKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLHBwUk1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIFJNQVggdGFibGUgYWRkcmVzcyBvbiBzdGFjawotICAgICAgICAgICAgICAgIAotCi0gICAgICAgIEJMICAgICAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZSAgICAgICAgICAgICAgICAgOy8vIGNhbGwgVW5zYWZlIEZ1bmN0aW9uIGZvciBWTEMgWmlnemFnIERlY29kaW5nCi0gICAgICAgICAKLSAgICAgICAKLQotICAgICAgICBNX0VORAotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWNjNWI0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07LyoqCi07ICogCi07ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucwotOyAqIE9wZW5NQVggREw6IHYxLjAuMgotOyAqIFJldmlzaW9uOiAgIDEyMjkwCi07ICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07ICogCi07ICogCi07ICogCi07ICoKLTsgKiBEZXNjcmlwdGlvbjogCi07ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKLTsgKiBmb3IgaW50ZXIgYmxvY2suCi07ICoKLTsgKgotOyAqCi07ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIKLTsgKgotOyAqIERlc2NyaXB0aW9uOgotOyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludHJhIGNvZGVkIGJsb2NrLgotOyAqCi07ICogUmVtYXJrczoKLTsgKgotOyAqIFBhcmFtZXRlcnM6Ci07ICogW2luXSAgICBwcEJpdFN0cmVhbSAgICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi07ICogICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyCi07ICogW2luXSAgICBwQml0T2Zmc2V0ICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotOyAqICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiAgICBbMC03XS4KLTsgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOwotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAotOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCi07ICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcwotOyAqICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCi07ICogICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgotOyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi07ICogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLTsgKiAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCi07ICogW291dF0gICAgcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Ci07ICogICAgICAgICAgICAgICAgICAgIGJsb2NrLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZAotOyAqCi07ICogUmV0dXJuIFZhbHVlOgotOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cwotOyAqICAgLUF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIG9yCi07ICogICAtcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCBvcgotOyAqICAgLSpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10uCi07ICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKLTsgKiAgIC1BdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybwotOyAqICAgLUVuY291bnRlcmVkIGFuIGlsbGVnYWwgc3RyZWFtIGNvZGUgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFZMQyB0YWJsZQotOyAqICAgLUVuY291bnRlcmVkIGFuZCBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUKLTsgKiAgIC1UaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQKLTsgKgotOyAqLwotCi0KLSAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICBJTkNMVURFIGFybUNPTU1fcy5oCi0gICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAotCi0KLSAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCi0KLSAgICAgCi0KLQotCi0gICAgIElGIEFSTTExMzZKUwotICAgICAKLSAgICAgICAgOy8vIEltcG9ydCB2YXJpb3VzIHRhYmxlcyBuZWVkZWQgZm9yIHRoZSBmdW5jdGlvbgotCi0gICAgICAgIAotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhVmxjTDBMMSAgICAgICAgICAgICA7Ly8gQ29udGFpbnMgb3B0aW1pemVkIGFuZCBwYWNrZWQgVkxDIFRhYmxlcyBmb3IgYm90aCBMYXN0ID0xIGFuZCBsYXN0PTAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQYWNrZWQgaW4gUnVuOkxldmVsOkxhc3QgZm9ybWF0Ci0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMEwxTE1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBMTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMEwxUk1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBSTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgIDsvLyBjb250YWlucyBjbGFzc2ljYWwgWmlnemFnIHRhYmxlIGVudHJpZXMgd2l0aCBkb3VibGUgdGhlIG9yaWdpbmFsIHZhbHVlcwotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUKLQotOy8vSW5wdXQgQXJndW1lbnRzCi0KLXBwQml0U3RyZWFtICAgICAgICAgIFJOIDAKLXBCaXRPZmZzZXQgICAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICAgICAgIFJOIDIKLVByZWREaXIgICAgICAgICAgICAgIFJOIDMKLXNob3J0VmlkZW9IZWFkZXIgICAgIFJOIDMKLQotOy8vTG9jYWwgVmFyaWFibGVzCi0KLVJldHVybiAgICAgICAgICAgICAgIFJOIDAKLQotcFZsY1RhYmxlTDBMMSAgICAgICAgUk4gNAotcExNQVhUYWJsZUwwTDEgICAgICAgUk4gNAotcFJNQVhUYWJsZUwwTDEgICAgICAgUk4gNAotcFppZ3phZ1RhYmxlICAgICAgICAgUk4gNAotQ291bnQgICAgICAgICAgICAgICAgUk4gNgotCi0KLSAgICAgICAgCi0gICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgdG8gc3RvcmUgb3B0aW1pemVkIFZMQyxaaWd6YWcsIFJNQVgsIExNQVggVGFibGUgQWRkcmVzc2VzIAotICAgICAKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwVmxjVGFibGVMMEwxLDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwTE1BWFRhYmxlTDBMMSw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFJNQVhUYWJsZUwwTDEsNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBaaWd6YWdUYWJsZSw0Ci0KLSAgICAgICAgCi0gICAgICAgIE1fU1RBUlQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLHIxMgotCi0gICAgICAgIE1fQVJHICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyb25TdGFjayw0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcG9pbnRlciB0byBJbnB1dCBBcmd1bWVudCBvbiBzdGFjayAgICAgICAgICAgCi0KLSAgICAgICAgTERSICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSwgPWFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiAgICAgOy8vIExvYWQgQWRkcmVzcyBvZiB0aGUgWmlnemFnIHRhYmxlICAgIAotICAgICAgICBBREQgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCBwWmlnemFnVGFibGUsIFByZWREaXIsIExTTCAjNiAgICAgICAgICAgOy8vIExvYWRpbmcgRGlmZmVyZW50IHR5cGUgb2YgemlnemFnIHRhYmxlcyBiYXNlZCBvbiBQcmVkRGlyCi0gICAgICAgCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwWmlnemFnVGFibGUscHBaaWd6YWdUYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgWmlnemFnIHRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKLSAgICAgICAgTERSICAgICAgICAgICAgIHBWbGNUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFWbGNMMEwxICAgICAgICAgICAgOy8vIExvYWQgb3B0aW1pemVkIHBhY2tlZCBWTEMgVGFibGUgd2l0aCBib3RoIEw9MCBhbmQgTD0xIGVudHJpZXMKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBWbGNUYWJsZUwwTDEscHBWbGNUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBWTEMgVGFibGUgYWRkcmVzcyBvbiBzdGFjawotICAgICAgICBMRFIgICAgICAgICAgICAgcExNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFMMEwxTE1BWCAgICAgICAgICA7Ly8gTG9hZCBMTUFYIFRhYmxlCi0gICAgICAgIE1fU1RSICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSxwcExNQVhUYWJsZUwwTDEgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgTE1BWCBUYWJsZSBhZGRyZXNzIG9uIFN0YWNrCi0gICAgICAgIExEUiAgICAgICAgICAgICBwUk1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYUwwTDFSTUFYICAgICAgICAgIDsvLyBMb2FkIFJNQVggVGFibGUKLSAgICAgICAgTU9WICAgICAgICAgICAgIENvdW50LCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgU3RhcnQ9MCAgICAgICAgCi0gICAgICAgIAotICAgICAgICBNX1NUUiAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEscHBSTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIFJNQVggVGFibGUgYWRkcmVzcyBvbiBzdGFjawotICAgICAgICAgICAgICAKLQotICAgICAgIAotICAgICAgICBNX0xEUiAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcixzaG9ydFZpZGVvSGVhZGVyb25TdGFjayAgICAgICAgICAgICAgOy8vIGdldCB0aGUgSW5wdXQgQXJndW1lbnQgZnJvbSBzdGFjawotCi0gICAgICAgIEJMICAgICAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZSAgICAgICAgICAgICAgIDsvLyBDYWxsIFVuc2FmZSBGdW5jdGlvbgotCi0KLQotICAgICAgICAKLSAgICAgICAgTV9FTkQKLSAgICAgICAgRU5ESUYKLSAgICAgICAgCi0gICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlmZWQ4MC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDX3MucworKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8qKgotOyAqIAotOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKLTsgKiBPcGVuTUFYIERMOiB2MS4wLjIKLTsgKiBSZXZpc2lvbjogICAxMjI5MAotOyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOyAqIAotOyAqIAotOyAqIAotOyAqCi07ICogRGVzY3JpcHRpb246IAotOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCi07ICogZm9yIGludGVyIGJsb2NrLgotOyAqCi07ICoKLTsgKgotOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyCi07ICoKLTsgKiBEZXNjcmlwdGlvbjoKLTsgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRyYSBjb2RlZCBibG9jay4KLTsgKgotOyAqIFJlbWFya3M6Ci07ICoKLTsgKiBQYXJhbWV0ZXJzOgotOyAqIFtpbl0gICAgcHBCaXRTdHJlYW0gICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotOyAqICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgotOyAqIFtpbl0gICAgcEJpdE9mZnNldCAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLTsgKiAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gICAgWzAtN10uCi07ICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgICBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgotOyAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKLTsgKiAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQotOyAqICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKLTsgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotOyAqICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci07ICogICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQotOyAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAotOyAqICAgICAgICAgICAgICAgICAgICBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQKLTsgKgotOyAqIFJldHVybiBWYWx1ZToKLTsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKLTsgKiAgIC1BdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0LCBvcgotOyAqICAgLXBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IKLTsgKiAgIC0qcEJpdE9mZnNldCBleGNlZWRzIFswLDddLgotOyAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCi07ICogICAtQXQgbGVhc3Qgb25lIG1hcmsgYml0IGlzIGVxdWFsIHRvIHplcm8KLTsgKiAgIC1FbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIHN0cmVhbSBjb2RlIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBWTEMgdGFibGUKLTsgKiAgIC1FbmNvdW50ZXJlZCBhbmQgaWxsZWdhbCBjb2RlIGluIHRoZSBWTEMgRkxDIHRhYmxlCi07ICogICAtVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0Ci07ICoKLTsgKi8KLQotCi0gICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKLQotCi0gICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0KLSAgICAgCi0gICAgICAKLQotCi0gICAgICBJRiBDb3J0ZXhBOAotCi0gICAgIAotICAgICAgICA7Ly8gSW1wb3J0IHZhcmlvdXMgdGFibGVzIG5lZWRlZCBmb3IgdGhlIGZ1bmN0aW9uCi0KLSAgICAgICAgCi0gICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50cmFWbGNMMEwxICAgICAgICAgICAgIDsvLyBDb250YWlucyBvcHRpbWl6ZWQgYW5kIHBhY2tlZCBWTEMgVGFibGVzIGZvciBib3RoIExhc3QgPTEgYW5kIGxhc3Q9MAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFBhY2tlZCBpbiBSdW46TGV2ZWw6TGFzdCBmb3JtYXQKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYICAgICAgICAgICAgOy8vIENvbnRhaW5zIExNQVggdGFibGUgZW50cmllcyB3aXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwwTDFSTUFYICAgICAgICAgICAgOy8vIENvbnRhaW5zIFJNQVggdGFibGUgZW50cmllcyB3aXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEKLSAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiAgICAgOy8vIGNvbnRhaW5zIENMYXNzaWNhbCwgSG9yaXpvbnRhbCwgVmVydGljYWwgWmlnemFnIHRhYmxlIGVudHJpZXMgd2l0aCBkb3VibGUgdGhlIG9yaWdpbmFsIHZhbHVlcwotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX2FJbnRyYURDTHVtYUNocm9tYUluZGV4ICA7Ly8gQ29udGFpbnMgT3B0aW1pemVkIERDTHVtYSBhbmQgRENDaHJvbWEgSW5kZXggdGFibGUgRW50cmllcwotICAgICAgICAKLQotICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUKLQotOy8vSW5wdXQgQXJndW1lbnRzCi0KLXBwQml0U3RyZWFtICAgICAgICAgIFJOIDAKLXBCaXRPZmZzZXQgICAgICAgICAgIFJOIDEKLXBEc3QgICAgICAgICAgICAgICAgIFJOIDIKLVByZWREaXIgICAgICAgICAgICAgIFJOIDMKLXNob3J0VmlkZW9IZWFkZXIgICAgIFJOIDMKLXZpZGVvQ29tcCAgICAgICAgICAgIFJOIDUKLTsvL0xvY2FsIFZhcmlhYmxlcwotCi1SZXR1cm4gICAgICAgICAgICAgICBSTiAwCi0KLXBEQ0x1bWFDaHJvbWFJbmRleCAgIFJOIDQKLXBEQ0Nocm9tYUluZGV4ICAgICAgIFJOIDcKLXBWbGNUYWJsZUwwTDEgICAgICAgIFJOIDQKLXBMTUFYVGFibGVMMEwxICAgICAgIFJOIDQKLXBSTUFYVGFibGVMMEwxICAgICAgIFJOIDQKLXBaaWd6YWdUYWJsZSAgICAgICAgIFJOIDQKLUNvdW50ICAgICAgICAgICAgICAgIFJOIDYKLURDVmFsdWVTaXplICAgICAgICAgIFJOIDYKLXBvd09mU2l6ZSAgICAgICAgICAgIFJOIDcKLXRlbXAxICAgICAgICAgICAgICAgIFJOIDUKLQotCi07Ly8gU2NyYXRjaCBSZWdpc3RlcnMKLQotUkJpdFN0cmVhbSAgICAgICAgICAgUk4gOAotUkJpdEJ1ZmZlciAgICAgICAgICAgUk4gOQotUkJpdENvdW50ICAgICAgICAgICAgUk4gMTAKLQotVDEgICAgICAgICAgICAgICAgICAgUk4gMTEKLVQyICAgICAgICAgICAgICAgICAgIFJOIDEyCi1EQ1ZhbCAgICAgICAgICAgICAgICBSTiAxNAotCi0gICAgICAgIAotICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHRvIHN0b3JlIG9wdGltaXplZCBWTEMsWmlnemFnLCBSTUFYLCBMTUFYIFRhYmxlIEFkZHJlc3NlcyAKLSAgICAgCi0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFZsY1RhYmxlTDBMMSw0Ci0gICAgICAgIE1fQUxMT0M0ICAgICAgICBwcExNQVhUYWJsZUwwTDEsNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBSTUFYVGFibGVMMEwxLDQKLSAgICAgICAgTV9BTExPQzQgICAgICAgIHBwWmlnemFnVGFibGUsNAotICAgICAgICBNX0FMTE9DNCAgICAgICAgcERDQ29lZmYsNAotICAgICAgICAKLQotICAgICAgICAKLSAgICAgICAgTV9TVEFSVCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMscjEyCi0KLSAgICAgICAgTV9BUkcgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXJvblN0YWNrLDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFBvaW50ZXIgdG8gYXJndW1lbnQgb24gc3RhY2sgIAotICAgICAgICBNX0FSRyAgICAgICAgICAgdmlkZW9Db21wb25zdGFjayw0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUG9pbnRlciB0byBhcmd1bWVudCBvbiBzdGFjawotCi0gICAgICAgIAotICAgICAgICA7Ly8gRGVjb2RlIERDIENvZWZmaWNpZW50Ci0KLSAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgICAgICBwRENMdW1hQ2hyb21hSW5kZXgsID1hcm1WQ000UDJfYUludHJhRENMdW1hQ2hyb21hSW5kZXggOy8vIExvYWQgT3B0aW1pemVkIFZMQyBUYWJsZSBmb3IgTHVtaW5hbmNlIGFuZCBDaHJvbWluYW5jZQotCi0gICAgICAgIDsvLyBJbml0aWFsaXppbmcgdGhlIEJpdHN0cmVhbSBNYWNybwotCi0gICAgICAgIE1fQkRfSU5JVDAgICAgICBwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgUkJpdFN0cmVhbSwgUkJpdEJ1ZmZlciwgUkJpdENvdW50Ci0gICAgICAgIE1fTERSICAgICAgICAgICB2aWRlb0NvbXAsdmlkZW9Db21wb25zdGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBNX0JEX0lOSVQxICAgICAgVDEsIFQyLCBUMgotICAgICAgICBBREQgICAgICAgICAgICAgcERDTHVtYUNocm9tYUluZGV4LHBEQ0x1bWFDaHJvbWFJbmRleCx2aWRlb0NvbXAsIExTTCAjNiAgICAgICAgICAgICAKLSAgICAgICAgTV9CRF9JTklUMiAgICAgIFQxLCBUMiwgVDIKLSAgICAKLSAgICAgICAgCi0gICAgICAgIE1fQkRfVkxEICAgICAgICBEQ1ZhbHVlU2l6ZSxUMSxUMixwRENMdW1hQ2hyb21hSW5kZXgsNCwyICAgICAgICAgICAgICAgICAgICA7Ly8gVkxDIERlY29kZSB1c2luZyBvcHRpbWl6ZWQgTHVtaW5hbmNlIGFuZCBDaHJvbWluYW5jZSBWTEMgVGFibGUKLQotICAgIAotICAgICAgIAotCi1EZWNvZGVEQwotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBDTVAgICAgICAgICAgICAgRENWYWx1ZVNpemUsIzEyICAgICAKLSAgICAgICAgQkdUICAgICAgICAgICAgIEV4aXRFcnJvcgotICAgICAgICAKLSAgICAgICAgQ01QICAgICAgICAgICAgIERDVmFsdWVTaXplLCMwCi0gICAgICAgIE1PVkVRICAgICAgICAgICBEQ1ZhbCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgRENWYWx1ZVNpemUgaXMgemVybyB0aGVuIERDIGNvZWZmID0wCi0gICAgICAgIEJFUSAgICAgICAgICAgICBBQ0RlY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIHBlcmZvcm0gQUMgQ29lZmYgRGVjb2RpbmcKLSAgICAgICAgCi0gICAgICAgIE1fQkRfVlJFQUQxNiAgICBEQ1ZhbCxEQ1ZhbHVlU2l6ZSxUMSxUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gR2V0IERDIFZhbHVlIEZyb20gQml0IHN0cmVhbQotICAgICAgICAgCi0KLSAgICAgICAgTU9WICAgICAgICAgICAgIHBvd09mU2l6ZSwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBMU0wgICAgICAgICAgICAgcG93T2ZTaXplLERDVmFsdWVTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBvd09mU2l6ZT1wb3coMixEQ1ZhbHVlU2l6ZSkKLSAgICAgICAgQ01QICAgICAgICAgICAgIERDVmFsLHBvd09mU2l6ZSxMU1IgIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb21wYXJlIERDVmFsIHdpdGggcG93T2ZTaXplLzIgCi0gICAgICAgIEFERExUICAgICAgICAgICBEQ1ZhbCxEQ1ZhbCwjMQotICAgICAgICBTVUJMVCAgICAgICAgICAgRENWYWwsRENWYWwscG93T2ZTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIExlc3N0aGFuIHBvd09mU2l6ZS8yIERDVmFsPURDVmFsLXBvd09mU2l6ZSsxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRWxzZSBEQ1ZhbD0gZmV0Y2hiaXRzIGZyb20gYml0IHN0cmVhbQotCi1DaGVja0RDVmFsdWVTaXplCi0gICAgICAgIAotICAgICAgICBDTVAgICAgICAgICAgICAgRENWYWx1ZVNpemUsIzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIERDVmFsdWVTaXplIGdyZWF0ZXIgdGhhbiA4IGNoZWNrIG1hcmtlciBiaXQKLQotICAgICAgICBCTEUgICAgICAgICAgICAgQUNEZWNvZGUKLQotICAgICAgICBNX0JEX1JFQUQ4ICAgICAgdGVtcDEsMSxUMQotICAgICAgICBURVEgICAgICAgICAgICAgdGVtcDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIE1hcmtlciBiaXQgaXMgemVybyBFeGl0IHdpdGggYW4gRXJyb3IgTWVzc2FnZQotICAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yCi0KLSAgICAgICAgCi0KLSAgICAgICAgOy8vIERlY29kZSBBQyBDb2VmZmljaWVudAotCi1BQ0RlY29kZQotCi0gICAgICAgIE1fU1RSICAgICAgICAgICBEQ1ZhbCxwRENDb2VmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBEZWNvZGVkIERDIENvZWZmIG9uIFN0YWNrCi0gICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZXJtaW5hdGluZyB0aGUgQml0IHN0cmVhbSBNYWNybwotICAgICAgICAgCi0gICAgICAgIExEUiAgICAgICAgICAgICBwWmlnemFnVGFibGUsID1hcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgICAgICAgOy8vIExvYWQgWmlnemFnIHRhbGJlIGFkZHJlc3MgICAKLSAgICAgICAgQUREICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSwgcFppZ3phZ1RhYmxlLCBQcmVkRGlyLCBMU0wgIzYgICAgICAgICAgICAgICAgOy8vIE1vZGlmeSB0aGUgWmlnemFnIHRhYmxlIGFkcmVzcyBiYXNlZCBvbiBQcmVkRGlyICAgICAgICAgICAgICAgIAotICAgICAgIAotICAgICAgICBNX1NUUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgemlnemFnIHRhYmxlIG9uIHN0YWNrCi0gICAgICAgIExEUiAgICAgICAgICAgICBwVmxjVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhVmxjTDBMMSAgICAgICAgICAgICAgICAgOy8vIExvYWQgT3B0aW1pemVkIFZMQyBUYWJsZSBXaXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEgRW50cmllcwotICAgICAgICBNX1NUUiAgICAgICAgICAgcFZsY1RhYmxlTDBMMSxwcFZsY1RhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgT3B0aW1pemVkIFZMQyBUYWJsZSBvbiBzdGFjawotICAgICAgICBMRFIgICAgICAgICAgICAgcExNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFMMEwxTE1BWCAgICAgICAgICAgICAgIDsvLyBMb2FkIExNQVggVGFibGUKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLHBwTE1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIExNQVggdGFibGUgb24gc3RhY2sKLSAgICAgICAgTERSICAgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhTDBMMVJNQVggICAgICAgICAgICAgICA7Ly8gTG9hZCBSTUFYIFRhYmxlCi0gICAgICAgIE1PViAgICAgICAgICAgICBDb3VudCwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgU3RhcnQgPTEgICAgICAgIAotICAgICAgICAKLSAgICAgICAgTV9TVFIgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLHBwUk1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIFJNQVggVGFibGUgb24gU3RhY2sKLSAgICAgICAgCi0gICAgICAgCi0gICAgICAgIE1fTERSICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLHNob3J0VmlkZW9IZWFkZXJvblN0YWNrICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHRoZSBJbnB1dCBBcmd1bWVudCBGcm9tIFN0YWNrCi0gICAgICAgIAotICAgICAgICBCTCAgICAgICAgICAgICAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUgICAgICAgICAgICAgICAgICAgIDsvLyBDYWxsIHRoZSBVbnNhZmUgRnVuY3Rpb24KLQotICAgICAgICBNX0xEUiAgICAgICAgICAgRENWYWwscERDQ29lZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gR2V0IHRoZSBEZWNvZGVkIERDIFZhbHVlIEZyb20gU3RhY2sKLSAgICAgICAgU1RSSCAgICAgICAgICAgIERDVmFsLFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHRoZSBEQyBWYWx1ZSAKLSAgICAgICAgQiAgICAgICAgICAgICAgIEV4aXRPSwotICAgICAgICAKLSAgICAgICAgICAgICAgCi0KLUV4aXRFcnJvcgotIAotICAgICAgICBNX0JEX0ZJTkkgICAgICAgcHBCaXRTdHJlYW0scEJpdE9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVybWluYXRpbmcgdGhlIEJpdCBTdHJlYW0gTWFjcm8gaW4gY2FzZSBvZiBhbiBFcnJvcgotICAgICAgICBNT1YgICAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX0VyciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIEVycm9yIE1lc3NhZ2UgCi1FeGl0T0sKLSAgICAgIAotICAgICAgICBNX0VORAotICAgICAgICBFTkRJRgotICAgICAgICAKLSAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM0NDEyMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKLTsvLyBPcGVuTUFYIERMOiB2MS4wLjIKLTsvLyBSZXZpc2lvbjogICAxMjI5MAotOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAotOy8vIAotOy8vIAotOy8vIAotOy8vCi0KLTsvLyBGdW5jdGlvbjoKLTsvLyAgICAgb214VkNNNFAyX0ZpbmRNVnByZWQKLTsvLwotICAgICAgICA7Ly8gSW5jbHVkZSBoZWFkZXJzCi0gICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCi0gICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgICAgICAgSU5DTFVERSBhcm1WQ0NPTU1fcy5oCi0KLSAgICAgICAgOy8vIERlZmluZSBjcHUgdmFyaWFudHMKLSAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIElGIENvcnRleEE4Ci0gICAgICAgIAotICAgICAgICBNX1RBQkxFIGFybVZDTTRQMl9wQmxrSW5kZXhUYWJsZQotICAgICAgICBEQ0QgIE9NWFZDQmxrMCwgT01YVkNCbGsxCi0gICAgICAgIERDRCAgT01YVkNCbGsyLCBPTVhWQ0JsazMKLQotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycwotOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi1wU3JjTVZDdXJNQiAgICAgICAgICAgIFJOIDAKLXBTcmNDYW5kTVYxICAgICAgICAgICAgUk4gMQotcFNyY0NhbmRNVjIgICAgICAgICAgICBSTiAyCi1wU3JjQ2FuZE1WMyAgICAgICAgICAgIFJOIDMKLXBEc3RNVlByZWQgICAgICAgICAgICAgUk4gNAotcERzdE1WUHJlZE1FICAgICAgICAgICBSTiA1Ci1pQmxrICAgICAgICAgICAgICAgICAgIFJOIDYKLQotcFRhYmxlICAgICAgICAgICAgICAgICBSTiA0Ci1DYW5kTVYgICAgICAgICAgICAgICAgIFJOIDEyCi0KLXBDYW5kTVYxICAgICAgICAgICAgICAgUk4gNwotcENhbmRNVjIgICAgICAgICAgICAgICBSTiA4Ci1wQ2FuZE1WMyAgICAgICAgICAgICAgIFJOIDkKLQotQ2FuZE1WMWR4ICAgICAgICAgICAgICBSTiAwIAotQ2FuZE1WMWR5ICAgICAgICAgICAgICBSTiAxIAotQ2FuZE1WMmR4ICAgICAgICAgICAgICBSTiAyCi1DYW5kTVYyZHkgICAgICAgICAgICAgIFJOIDMKLUNhbmRNVjNkeCAgICAgICAgICAgICAgUk4gMTAKLUNhbmRNVjNkeSAgICAgICAgICAgICAgUk4gMTEKLQotdGVtcCAgICAgICAgICAgICAgICAgICBSTiAxNAotCi16ZXJvICAgICAgICAgICAgICAgICAgIFJOIDE0Ci1yZXR1cm4gICAgICAgICAgICAgICAgIFJOIDAKLSAgICAgICAgCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTWFpbiByb3V0aW5lCi07IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgIAotCi0gICAgICAgIE1fQUxMT0M0IE1WLCA0Ci0gICAgICAgIAotICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyIAotICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9GaW5kTVZwcmVkLCByMTEKLSAgICAgICAgCi0gICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCi0gICAgICAgIE1fQVJHICAgcHBEc3RNVlByZWQsICA0Ci0gICAgICAgIE1fQVJHICAgcHBEc3RNVlByZWRNRSwgNAotICAgICAgICBNX0FSRyAgIEJsaywgNAotICAgICAgICAKLSAgICAgICAgTV9BRFIgQ2FuZE1WLCBNVgotICAgICAgICBNT1YgICB6ZXJvLCAjMAotICAgICAgICBNX0xEUiBpQmxrLCBCbGsKLSAgICAgICAgCi0gICAgICAgIDsvLyBTZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZXNlCi0gICAgICAgIDsvLyB0byBiZSB1c2VkIGlmIHBTcmNDYW5kTVZbMXwyfDNdID09IE5VTEwKLSAgICAgICAgTU9WICAgcENhbmRNVjEsIENhbmRNVgotICAgICAgICBNT1YgICBwQ2FuZE1WMiwgQ2FuZE1WCi0gICAgICAgIE1PViAgIHBDYW5kTVYzLCBDYW5kTVYKLSAgICAKLSAgICAgICAgU1RSICAgemVybywgW0NhbmRNVl0KLQotICAgICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBjYXNlIGJhc2VkIG9uIGJsayBudW1iZXIKLSAgICAgICAgTV9TV0lUQ0ggaUJsawotICAgICAgICBNX0NBU0UgICBPTVhWQ0JsazAgICAgICA7Ly8gaUJsaz0wCi0gICAgICAgIE1fQ0FTRSAgIE9NWFZDQmxrMSAgICAgIDsvLyBpQmxrPTAKLSAgICAgICAgTV9DQVNFICAgT01YVkNCbGsyICAgICAgOy8vIGlCbGs9MAotICAgICAgICBNX0NBU0UgICBPTVhWQ0JsazMgICAgICA7Ly8gaUJsaz0wCi0gICAgICAgIE1fRU5EU1dJVENICi0gICAgICAgIAotT01YVkNCbGswCi0gICAgICAgIENNUCAgIHBTcmNDYW5kTVYxLCAjMAotICAgICAgICBBRERORSBwQ2FuZE1WMSwgcFNyY0NhbmRNVjEsICM0Ci0gICAgICAgIAotICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMiwgIzAKLSAgICAgICAgQURETkUgcENhbmRNVjIsIHBTcmNDYW5kTVYyLCAjOAotCi0gICAgICAgIENNUCAgIHBTcmNDYW5kTVYzLCAjMAotICAgICAgICBBRERORSBwQ2FuZE1WMywgcFNyY0NhbmRNVjMsICM4Ci0gICAgICAgIENNUEVRIHBTcmNDYW5kTVYxLCAjMAotICAgIAotICAgICAgICBNT1ZFUSBwQ2FuZE1WMywgcENhbmRNVjIKLSAgICAgICAgTU9WRVEgcENhbmRNVjEsIHBDYW5kTVYyCi0gICAgICAgICAgICAgICAgCi0gICAgICAgIENNUCAgIHBTcmNDYW5kTVYxLCAjMAotICAgICAgICBDTVBFUSBwU3JjQ2FuZE1WMiwgIzAKLSAgICAKLSAgICAgICAgTU9WRVEgcENhbmRNVjEsIHBDYW5kTVYzCi0gICAgICAgIE1PVkVRIHBDYW5kTVYyLCBwQ2FuZE1WMwotICAgICAgICAKLSAgICAgICAgQ01QICAgcFNyY0NhbmRNVjIsICMwCi0gICAgICAgIENNUEVRIHBTcmNDYW5kTVYzLCAjMAotICAgIAotICAgICAgICBNT1ZFUSBwQ2FuZE1WMiwgcENhbmRNVjEKLSAgICAgICAgTU9WRVEgcENhbmRNVjMsIHBDYW5kTVYxCi0gICAgICAgIAotICAgICAgICBCICAgICBCbGtFbmQKLSAgICAKLU9NWFZDQmxrMQotICAgICAgICBNT1YgICBwQ2FuZE1WMSwgcFNyY01WQ3VyTUIKLSAgICAgICAgQ01QICAgcFNyY0NhbmRNVjMsICMwCi0gICAgICAgIEFERE5FIHBDYW5kTVYzLCBwU3JjQ2FuZE1WMywgIzgKLSAgICAgICAgCi0gICAgICAgIENNUCAgIHBTcmNDYW5kTVYyLCAjMAotICAgICAgICBBRERORSBwQ2FuZE1WMiwgcFNyY0NhbmRNVjIsICMxMgotICAgIAotICAgICAgICBDTVBFUSBwU3JjQ2FuZE1WMywgIzAKLSAgICAKLSAgICAgICAgTU9WRVEgcENhbmRNVjIsIHBDYW5kTVYxCi0gICAgICAgIE1PVkVRIHBDYW5kTVYzLCBwQ2FuZE1WMQotICAgICAgICAgICAgCi0gICAgICAgIEIgICAgIEJsa0VuZAotCi1PTVhWQ0JsazIKLSAgICAgICAgQ01QICAgcFNyY0NhbmRNVjEsICMwCi0gICAgICAgIE1PViAgIHBDYW5kTVYyLCBwU3JjTVZDdXJNQgotICAgICAgICBBREQgICBwQ2FuZE1WMywgcFNyY01WQ3VyTUIsICM0Ci0gICAgICAgIEFERE5FIHBDYW5kTVYxLCBwU3JjQ2FuZE1WMSwgIzEyCi0gICAgICAgIEIgICAgIEJsa0VuZAotCi1PTVhWQ0JsazMKLSAgICAgICAgQUREICAgcENhbmRNVjEsIHBTcmNNVkN1ck1CLCAjOAotICAgICAgICBNT1YgICBwQ2FuZE1WMiwgcFNyY01WQ3VyTUIKLSAgICAgICAgQUREICAgcENhbmRNVjMsIHBTcmNNVkN1ck1CLCAjNAotICAgIAotQmxrRW5kCi0KLSAgICAgICAgOy8vIFVzaW5nIHRoZSB0cmFuc3BlcmFuY3kgaW5mbywgemVybwotICAgICAgICA7Ly8gb3V0IHRoZSBjYW5kaWRhdGUgTVYgaWYgbmVjY2VzYXJ5Ci0gICAgICAgIExEUlNIIENhbmRNVjFkeCwgW3BDYW5kTVYxXSwgIzIKLSAgICAgICAgTERSU0ggQ2FuZE1WMmR4LCBbcENhbmRNVjJdLCAjMgotICAgICAgICBMRFJTSCBDYW5kTVYzZHgsIFtwQ2FuZE1WM10sICMyCi0gICAgCi0gICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCi0gICAgICAgIE1fTERSIHBEc3RNVlByZWRNRSwgcHBEc3RNVlByZWRNRQotCi0gICAgICAgIExEUlNIIENhbmRNVjFkeSwgW3BDYW5kTVYxXQotICAgICAgICBMRFJTSCBDYW5kTVYyZHksIFtwQ2FuZE1WMl0KLSAgICAgICAgTERSU0ggQ2FuZE1WM2R5LCBbcENhbmRNVjNdCi0KLSAgICAgICAgQ01QIHBEc3RNVlByZWRNRSwgIzAgICAgICAgIAotCi0gICAgICAgIDsvLyBTdG9yZSB0aGUgY2FuZGlkYXRlIE1WJ3MgaW50byB0aGUgcERzdE1WUHJlZE1FLCAKLSAgICAgICAgOy8vIHRoZXNlIGNhbiBiZSB1c2VkIGluIHRoZSBmYXN0IGFsZ29yaXRobSBpZiBpbXBsZW1lbnRlZCAKLQotICAgICAgICBTVFJITkUgQ2FuZE1WMWR4LCBbcERzdE1WUHJlZE1FXSwgIzIKLSAgICAgICAgU1RSSE5FIENhbmRNVjFkeSwgW3BEc3RNVlByZWRNRV0sICMyICAgICAgICAKLSAgICAgICAgU1RSSE5FIENhbmRNVjJkeCwgW3BEc3RNVlByZWRNRV0sICMyCi0gICAgICAgIFNUUkhORSBDYW5kTVYyZHksIFtwRHN0TVZQcmVkTUVdLCAjMgotICAgICAgICBTVFJITkUgQ2FuZE1WM2R4LCBbcERzdE1WUHJlZE1FXSwgIzIKLSAgICAgICAgU1RSSE5FIENhbmRNVjNkeSwgW3BEc3RNVlByZWRNRV0KLSAgICAgICAgICAgCi0gICAgICAgIDsgRmluZCB0aGUgbWVkaWFuIG9mIHRoZSAzIGNhbmRpZGF0ZSBNVidzCi0gICAgICAgIE1fTUVESUFOMyBDYW5kTVYxZHgsIENhbmRNVjJkeCwgQ2FuZE1WM2R4LCB0ZW1wCi0KLSAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKLSAgICAgICAgTV9MRFIgcERzdE1WUHJlZCwgcHBEc3RNVlByZWQKLQotICAgICAgICBNX01FRElBTjMgQ2FuZE1WMWR5LCBDYW5kTVYyZHksIENhbmRNVjNkeSwgdGVtcAotICAgIAotICAgICAgICBTVFJIIENhbmRNVjNkeCwgW3BEc3RNVlByZWRdLCAjMgotICAgICAgICBTVFJIIENhbmRNVjNkeSwgW3BEc3RNVlByZWRdCi0KLSAgICAgICAgTU9WIHJldHVybiwgI09NWF9TdHNfTm9FcnIKLSAgICAKLSAgICAgICAgTV9FTkQKLSAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4Ci0gICAgCi0gICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGtfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFiOTI1ZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGtfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsvLwotOy8vIAotOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMl9JRENUOHg4YmxrX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLQotOy8vIEZ1bmN0aW9uOgotOy8vICAgICBvbXhWQ000UDJfSURDVDh4OGJsawotOy8vCi0gICAgICAgIDsvLyBJbmNsdWRlIGhlYWRlcnMKLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotCi0gICAgICAgIDsvLyBEZWZpbmUgY3B1IHZhcmlhbnRzCi0gICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLQotICAgICAgICBJTkNMVURFIGFybUNPTU1fSURDVF9zLmggICAgICAgIAotICAgICAgICAKLSAgICAgICAgSU1QT1JUIGFybUNPTU1fSURDVFByZVNjYWxlCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gRnVuY3Rpb24gcHJvdG90eXBlCi0gICAgICAgIDsvLwotICAgICAgICA7Ly8gICAgIE9NWFJlc3VsdAotICAgICAgICA7Ly8gICAgIG9teFZDTTRQMl9JRENUOHg4YmxrKGNvbnN0IE9NWF9TMTYqIHBTcmMsCi0gICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYqIHBEc3QpCi0gICAgICAgIDsvLyAgICAKLSAgICAgICAgCi0gICAgSUYgQ29ydGV4QTgKLSAgICAgICAgTV9BTExPQzQgIHBwRGVzdCwgNAotICAgICAgICBNX0FMTE9DNCAgcFN0cmlkZSwgNAotICAgICAgICBNX0FMTE9DOCAgcEJsaywgMio4KjgKLSAgICBFTkRJRgotICAgIAotICAgIAotICAgIElGIENvcnRleEE4Ci0gICAgICAgIE1fU1RBUlQgb214VkNNNFAyX0lEQ1Q4eDhibGssIHIxMSwgZDE1Ci0gICAgRU5ESUYKLSAgICAgICAgCi0gICAgSUYgQ29ydGV4QTgKLSAgICAgICAgCi07Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKLXBTcmMgICAgICAgICAgICBSTiAwCi1wRHN0ICAgICAgICAgICAgUk4gMQotCi07Ly8gRGVjbGFyZSBvdGhlciBpbnRlcm1lZGlhdGUgcmVnaXN0ZXJzCi1SZXN1bHQgICAgICAgICAgUk4gMAotCi07Ly8gUHJvdG90eXBlIGZvciBtYWNybyBNX0lEQ1QKLTsvLyBwU3JjICAgICAgICAgICAgUk4gMCAgOy8vIHNvdXJjZSBkYXRhIGJ1ZmZlcgotOy8vIFN0cmlkZSAgICAgICAgICBSTiAxICA7Ly8gZGVzdGluYXRpb24gc3RyaWRlIGluIGJ5dGVzCi07Ly8gcERlc3QgICAgICAgICAgIFJOIDIgIDsvLyBkZXN0aW5hdGlvbiBkYXRhIGJ1ZmZlcgotOy8vIHBTY2FsZSAgICAgICAgICBSTiAzICA7Ly8gcG9pbnRlciB0byBzY2FsaW5nIHRhYmxlCi0KLXBTcmMgICAgUk4gMCAgICAKLVN0cmlkZSAgUk4gMSAgICAKLXBEZXN0ICAgUk4gMiAgICAKLXBTY2FsZSAgUk4gMyAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgTU9WICAgICAgICAgcERlc3QsIHBEc3QKLSAgICAgICAgTERSICAgICAgICAgcFNjYWxlLCA9YXJtQ09NTV9JRENUUHJlU2NhbGUgICAgICAgIAotICAgICAgICBNX0lEQ1QgICAgICBzOSwgczE2LCAxNiAgICAgIAotICAgICAgICBNT1YgICAgICAgICBSZXN1bHQsICNPTVhfU3RzX05vRXJyCi0gICAgICAgIE1fRU5EICAgICAgIAotICAgIEVORElGICAKLSAgICAgICAgOy8vIEFSTTExMzZKUyA6TE9SOiBDb3J0ZXhBOAotCi0gICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9ja19zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9ja19zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMWFlYzMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDU4ICswLDAgQEAKLTsvLwotOy8vIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi07Ly8KLTsvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07Ly8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ly8KLTsvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOy8vCi07Ly8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07Ly8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07Ly8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOy8vCi07Ly8KLTsvLyAKLTsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucwotOy8vIE9wZW5NQVggREw6IHYxLjAuMgotOy8vIFJldmlzaW9uOiAgIDEyMjkwCi07Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Ci07Ly8gCi07Ly8gCi07Ly8gCi07Ly8KLTsvLyBEZXNjcmlwdGlvbjoKLTsvLwotOy8vCi0KLTsvLyBJbmNsdWRlIHN0YW5kYXJkIGhlYWRlcnMKLSAgICBJTkNMVURFIG9teHR5cGVzX3MuaAotICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLQotOy8vIEltcG9ydCBzeW1ib2xzIHJlcXVpcmVkIGZyb20gb3RoZXIgZmlsZXMKLQotICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKLQotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOy8vIEFSTTExMzZKUyBpbXBsZW1lbnRhdGlvbgotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi07Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07Ly8gQ29ydGV4QTggaW1wbGVtZW50YXRpb24KLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICBJRiAgQ29ydGV4QTgKLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsvLyBNQUNSTyBERUZJTklUSU9OUwotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIDsvLyBEZXNjcmlwdGlvbjoKLSAgICA7Ly8gRG9lcyBpbnRlcnBvbGF0aW9uIGZvciB0aGUgY2FzZSBvZiAiSW50ZWdlclBpeGVsIiBwcmVkaWN0VHlwZS4gQm90aCAKLSAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYXJlIGhhbmRsZWQuIEp1c3QgY29waWVzIGEgYmxvY2sgZnJvbSBwU3JjIHRvIHBEc3QKLSAgICA7Ly8KLSAgICA7Ly8gU3ludGF4OgotICAgIDsvLyBNX01DUkVDT05CTE9DS19JbnRlZ2VyUGl4ZWwKLSAgICA7Ly8gCi0gICAgOy8vIElucHV0czogTm9uZQotICAgIDsvLyBPdXRwdXRzOiBOb25lCi0KLSAgICBNQUNSTyAKLSAgICBNX01DUkVDT05CTE9DS19JbnRlZ2VyUGl4ZWwKLUNhc2VJbnRlZ2VyUGl4ZWxfUm5kMAotQ2FzZUludGVnZXJQaXhlbF9SbmQxCi0KLSAgICBWTEQxICAgICAgICBkUm93MCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkxEMSAgICAgICAgZFJvdzEsIFtwU3JjXSwgc3JjU3RlcAotICAgIFZMRDEgICAgICAgIGRSb3cyLCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWTEQxICAgICAgICBkUm93MywgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkxEMSAgICAgICAgZFJvdzQsIFtwU3JjXSwgc3JjU3RlcAotICAgIFZMRDEgICAgICAgIGRSb3c1LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWTEQxICAgICAgICBkUm93NiwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkxEMSAgICAgICAgZFJvdzcsIFtwU3JjXSwgc3JjU3RlcAotCi0gICAgVlNUMSAgICAgICAgZFJvdzAsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIFZTVDEgICAgICAgIGRSb3cxLCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWU1QxICAgICAgICBkUm93MiwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVlNUMSAgICAgICAgZFJvdzMsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIFZTVDEgICAgICAgIGRSb3c0LCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWU1QxICAgICAgICBkUm93NSwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVlNUMSAgICAgICAgZFJvdzYsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIFZTVDEgICAgICAgIGRSb3c3LCBbcERzdEA2NF0sIGRzdFN0ZXAKLQotICAgIEIgICAgICAgICAgIFN3aXRjaFByZWRpY3RUeXBlRW5kCi0gICAgTUVORAotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIDsvLyBEZXNjcmlwdGlvbjoKLSAgICA7Ly8gRG9lcyBpbnRlcnBvbGF0aW9uIGZvciB0aGUgY2FzZSBvZiAiSGFsZlBpeGVsWCIgcHJlZGljdFR5cGUuIFRoZSB0d28gCi0gICAgOy8vIHJvdW5kaW5nIGNhc2VzIGFyZSBoYW5kbGVkIGJ5IHRoZSBwYXJhbWV0ZXIgIiRybmRWYWwiLiBBdmVyYWdlcyBiZXR3ZWVuCi0gICAgOy8vIGEgcGl4ZWwgYW5kIHBpeGVsIHJpZ2h0IHRvIGl0LCByb3VuZGluZyBpdCBiYXNlZCBvbiAkcm5kVmFsLiBUaGUgCi0gICAgOy8vIHJvdW5kaW5nIGlzIGltcGxlbWVudGVkIGJ5IHVzaW5nIG9wQ29kZSBzd2l0Y2hpbmcgYmV0d2VlbiAiVlJIQUREIiBhbmQgCi0gICAgOy8vICJWSEFERCIgaW5zdHJ1Y3Rpb25zLgotICAgIDsvLwotICAgIDsvLyBTeW50YXg6Ci0gICAgOy8vIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFggJHJuZFZhbAotICAgIDsvLyAKLSAgICA7Ly8gSW5wdXRzOiAKLSAgICA7Ly8gICAgICRybmRWYWw6IDAgZm9yIHJvdW5kaW5nIGFuZCAxIGZvciBubyByb3VuZGluZwotICAgIDsvLyBPdXRwdXRzOiBOb25lCi0KLSAgICBNQUNSTyAKLSAgICBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYICRybmRWYWwKLQotICAgIExDTFMgTV9WSEFERFIKLSAgICBJRiAkcm5kVmFsID0gMAotTV9WSEFERFIgU0VUUyAiVlJIQUREIgotICAgIEVMU0UKLU1fVkhBRERSIFNFVFMgIlZIQUREIgotICAgIEVORElGCi0KLUNhc2VIYWxmUGl4ZWxYX1JuZCRybmRWYWwKLQotICAgIFZMRDEgICAgICAgIHtkUm93MCwgZFJvdzBTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkVYVCAgICAgICAgZFJvdzBTaGZ0LCBkUm93MCwgZFJvdzBTaGZ0LCAjMQotICAgIFZMRDEgICAgICAgIHtkUm93MSwgZFJvdzFTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkVYVCAgICAgICAgZFJvdzFTaGZ0LCBkUm93MSwgZFJvdzFTaGZ0LCAjMQotICAgIFZMRDEgICAgICAgIHtkUm93MiwgZFJvdzJTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkVYVCAgICAgICAgZFJvdzJTaGZ0LCBkUm93MiwgZFJvdzJTaGZ0LCAjMQotICAgIFZMRDEgICAgICAgIHtkUm93MywgZFJvdzNTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkVYVCAgICAgICAgZFJvdzNTaGZ0LCBkUm93MywgZFJvdzNTaGZ0LCAjMQotICAgIFZMRDEgICAgICAgIHtkUm93NCwgZFJvdzRTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkVYVCAgICAgICAgZFJvdzRTaGZ0LCBkUm93NCwgZFJvdzRTaGZ0LCAjMQotICAgIFZMRDEgICAgICAgIHtkUm93NSwgZFJvdzVTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkVYVCAgICAgICAgZFJvdzVTaGZ0LCBkUm93NSwgZFJvdzVTaGZ0LCAjMQotICAgIFZMRDEgICAgICAgIHtkUm93NiwgZFJvdzZTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkVYVCAgICAgICAgZFJvdzZTaGZ0LCBkUm93NiwgZFJvdzZTaGZ0LCAjMQotICAgIFZMRDEgICAgICAgIHtkUm93NywgZFJvdzdTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkVYVCAgICAgICAgZFJvdzdTaGZ0LCBkUm93NywgZFJvdzdTaGZ0LCAjMQotICAgICRNX1ZIQUREUiAgIGRSb3cwLCBkUm93MCwgZFJvdzBTaGZ0Ci0gICAgJE1fVkhBRERSICAgZFJvdzEsIGRSb3cxLCBkUm93MVNoZnQKLSAgICBWU1QxICAgICAgICBkUm93MCwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgJE1fVkhBRERSICAgZFJvdzIsIGRSb3cyLCBkUm93MlNoZnQKLSAgICBWU1QxICAgICAgICBkUm93MSwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgJE1fVkhBRERSICAgZFJvdzMsIGRSb3czLCBkUm93M1NoZnQKLSAgICBWU1QxICAgICAgICBkUm93MiwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgJE1fVkhBRERSICAgZFJvdzQsIGRSb3c0LCBkUm93NFNoZnQKLSAgICBWU1QxICAgICAgICBkUm93MywgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgJE1fVkhBRERSICAgZFJvdzUsIGRSb3c1LCBkUm93NVNoZnQKLSAgICBWU1QxICAgICAgICBkUm93NCwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgJE1fVkhBRERSICAgZFJvdzYsIGRSb3c2LCBkUm93NlNoZnQKLSAgICBWU1QxICAgICAgICBkUm93NSwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgJE1fVkhBRERSICAgZFJvdzcsIGRSb3c3LCBkUm93N1NoZnQKLSAgICBWU1QxICAgICAgICBkUm93NiwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVlNUMSAgICAgICAgZFJvdzcsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIAotICAgIEIgICAgICAgICAgIFN3aXRjaFByZWRpY3RUeXBlRW5kCi0gICAgTUVORAotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIDsvLyBEZXNjcmlwdGlvbjoKLSAgICA7Ly8gRG9lcyBpbnRlcnBvbGF0aW9uIGZvciB0aGUgY2FzZSBvZiAiSGFsZlBpeGVsWSIgcHJlZGljdFR5cGUuIFRoZSB0d28gCi0gICAgOy8vIHJvdW5kaW5nIGNhc2VzIGFyZSBoYW5kbGVkIGJ5IHRoZSBwYXJhbWV0ZXIgIiRybmRWYWwiLiBBdmVyYWdlcyBiZXR3ZWVuCi0gICAgOy8vIGEgcGl4ZWwgYW5kIHBpeGVsIGJlbG93IGl0LCByb3VuZGluZyBpdCBiYXNlZCBvbiAkcm5kVmFsLiBUaGUgCi0gICAgOy8vIHJvdW5kaW5nIGlzIGltcGxlbWVudGVkIGJ5IHVzaW5nIG9wQ29kZSBzd2l0Y2hpbmcgYmV0d2VlbiAiVlJIQUREIiBhbmQgCi0gICAgOy8vICJWSEFERCIgaW5zdHJ1Y3Rpb25zLgotICAgIDsvLwotICAgIDsvLyBTeW50YXg6Ci0gICAgOy8vIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFkgJHJuZFZhbAotICAgIDsvLyAKLSAgICA7Ly8gSW5wdXRzOiAKLSAgICA7Ly8gICAgICRybmRWYWw6IDAgZm9yIHJvdW5kaW5nIGFuZCAxIGZvciBubyByb3VuZGluZwotICAgIDsvLyBPdXRwdXRzOiBOb25lCi0KLSAgICBNQUNSTyAKLSAgICBNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxZICRybmRWYWwKLQotICAgIExDTFMgTV9WSEFERFIKLSAgICBJRiAkcm5kVmFsID0gMAotTV9WSEFERFIgU0VUUyAiVlJIQUREIgotICAgIEVMU0UKLU1fVkhBRERSIFNFVFMgIlZIQUREIgotICAgIEVORElGCi0KLUNhc2VIYWxmUGl4ZWxZX1JuZCRybmRWYWwKLSAgICBWTEQxICAgICAgICBkUm93MCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkxEMSAgICAgICAgZFJvdzEsIFtwU3JjXSwgc3JjU3RlcAotICAgIFZMRDEgICAgICAgIGRSb3cyLCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWTEQxICAgICAgICBkUm93MywgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkxEMSAgICAgICAgZFJvdzQsIFtwU3JjXSwgc3JjU3RlcAotICAgIFZMRDEgICAgICAgIGRSb3c1LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWTEQxICAgICAgICBkUm93NiwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkxEMSAgICAgICAgZFJvdzcsIFtwU3JjXSwgc3JjU3RlcAotICAgICRNX1ZIQUREUiAgIGRSb3cwLCBkUm93MCwgZFJvdzEKLSAgICBWTEQxICAgICAgICBkUm93OCwgW3BTcmNdLCBzcmNTdGVwCi0gICAgJE1fVkhBRERSICAgZFJvdzEsIGRSb3cxLCBkUm93MgotICAgIFZTVDEgICAgICAgIGRSb3cwLCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICAkTV9WSEFERFIgICBkUm93MiwgZFJvdzIsIGRSb3czCi0gICAgVlNUMSAgICAgICAgZFJvdzEsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgICRNX1ZIQUREUiAgIGRSb3czLCBkUm93MywgZFJvdzQKLSAgICBWU1QxICAgICAgICBkUm93MiwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgJE1fVkhBRERSICAgZFJvdzQsIGRSb3c0LCBkUm93NQotICAgIFZTVDEgICAgICAgIGRSb3czLCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICAkTV9WSEFERFIgICBkUm93NSwgZFJvdzUsIGRSb3c2Ci0gICAgVlNUMSAgICAgICAgZFJvdzQsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgICRNX1ZIQUREUiAgIGRSb3c2LCBkUm93NiwgZFJvdzcKLSAgICBWU1QxICAgICAgICBkUm93NSwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgJE1fVkhBRERSICAgZFJvdzcsIGRSb3c3LCBkUm93OAotICAgIFZTVDEgICAgICAgIGRSb3c2LCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWU1QxICAgICAgICBkUm93NywgW3BEc3RANjRdLCBkc3RTdGVwCi0KLSAgICBCICAgICAgICAgICBTd2l0Y2hQcmVkaWN0VHlwZUVuZAotICAgIE1FTkQKLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICA7Ly8gRGVzY3JpcHRpb246Ci0gICAgOy8vIERvZXMgaW50ZXJwb2xhdGlvbiBmb3IgdGhlIGNhc2Ugb2YgIkludGVnZXJQaXhlbCIgcHJlZGljdFR5cGUuIEJvdGggCi0gICAgOy8vIHJvdW5kaW5nIGNhc2VzIGFyZSBoYW5kbGVkLiAKLSAgICA7Ly8gVHlwaWNhbCBjb21wdXRhdGlvbiBmb3IgYSByb3cgZ29lcyBsaWtlIHRoaXMKLSAgICA7Ly8gICAgIDEuIFZMRDEgICAgICAgIHtkUm93MCwgZFJvdzBTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwIDsvLyBMb2FkIHRoZSByb3cgYW5kIG5leHQgOCBieXRlcwotICAgIDsvLyAgICAgMi4gVkVYVCAgICAgICAgZFJvdzBTaGZ0LCBkUm93MCwgZFJvdzBTaGZ0LCAjMSAgICAgOy8vIEdlbmVyYXRlIHRoZSBzaGlmdGVkIHJvdwotICAgIDsvLyAgICAgMy4gVkFEREwgICAgICAgcVN1bTAsIGRSb3cwLCBkUm93MFNoZnQgICAgICAgICAgICAgOy8vIEdlbmVyYXRlIHRoZSBzdW0gb2Ygcm93IGFuZCBzaGlmdGVkIHJvdwotICAgIDsvLyAgICAgNS4gVkFERCAgICAgICAgcVN1bTAsIHFTdW0wLCBxU3VtMSAgICAgICAgICAgICAgICAgOy8vIEFkZCB0byB0aGUgc3VtIG9mIG5leHQgcm93IChvZGQgcm93IHN1bSBoYXMgcm91bmRpbmcgdmFsdWUgYWRkZWQgdG8gaXQpCi0gICAgOy8vICAgICA2LiBWU0hSTiAgICAgICBkUm93MCwgcVN1bTAsICMyICAgICAgICAgICAgICAgICAgICA7Ly8gRGl2aWRlIGJ5IDQKLSAgICA7Ly8gICAgIDcuIFZTVDEgICAgICAgIGRSb3cwLCBbcERzdEA2NF0sIGRzdFN0ZXAgICAgICAgICAgIDsvLyBTdG9yZQotICAgIDsvLyBPZGQgcm93cyB1bmRlcmdvIGZvbGxvd2luZyBjb21wdXRhdGlvbiBhZnRlciBzdGVwIDMKLSAgICA7Ly8gICAgIDQuIFZBREQgICAgICAgIHFTdW0xLCBxU3VtMSwgcVJvdW5kCi0gICAgOy8vIFRoaXMgc2F2ZXMgZm9yIGFkZGluZyByb3VuZGluZyB2YWx1ZSB0byBlYWNoIGZpbmFsIHN1bSAob3ZlcmFsbCBzYXZlcyA0IAotICAgIDsvLyBpbnN0cnVjdGlvbnMpLgotICAgIDsvLyBUaGVyZSBpcyByZXVzZSBvZiByZWdpc3RlcnMgZm9yIHFTdW02LCBxU3VtNyAmIHFTdW04LiBPdmVyYWxsIHNjaGVkdWxpbmcgdGFrZXMgCi0gICAgOy8vIGNhcmUgb2YgdGhpcyBhbmQgYWxzbyBtaW5pbWl6ZXMgc3RhbGxzLiBSb3VuZGluZyB2YWx1ZSB3YXMgbW9kaWZpZWQgaW4gCi0gICAgOy8vIEFSTSByZWdpc3RlciBybmRWYWwgKG9yaWdpbmFsbHkgdXNlZCBmb3Igcm91bmRpbmcgZmxhZykgYmVmb3JlIHRoZSBzd2l0Y2guCi0gICAgOy8vIEl0IGlzIHRoZW4gcG9wdWxhdGVkIGludG8gYWxsIGxhbmVzIGluIHRoaXMgbWFjcm8uIE5vIGJyYW5jaGluZyBvdXQgdG8gCi0gICAgOy8vIGxhYmVsICJTd2l0Y2hQcmVkaWN0VHlwZUVuZCIgaXMgcmVxdWlyZWQgaW4gdGhlIGVuZCBvZiB0aGUgbWFjcm8gYXMgdGhlc2UgCi0gICAgOy8vIGFyZSB0aGUgbGFzdCBvZiBzd2l0Y2ggY2FzZXMuCi0gICAgOy8vIAotICAgIDsvLyBTeW50YXg6Ci0gICAgOy8vIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFhZCi0gICAgOy8vIAotICAgIDsvLyBJbnB1dHM6IE5vbmUKLSAgICA7Ly8gT3V0cHV0czogTm9uZQotCi0gICAgTUFDUk8gCi0gICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWFkKLQotQ2FzZUhhbGZQaXhlbFhZX1JuZDAKLUNhc2VIYWxmUGl4ZWxYWV9SbmQxCi0gICAgVkxEMSAgICAgICAge2RSb3cwLCBkUm93MFNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWRFVQICAgICAgICBxUm91bmQsIHJuZFZhbAotICAgIFZMRDEgICAgICAgIHtkUm93MSwgZFJvdzFTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkVYVCAgICAgICAgZFJvdzBTaGZ0LCBkUm93MCwgZFJvdzBTaGZ0LCAjMQotICAgIFZMRDEgICAgICAgIHtkUm93MiwgZFJvdzJTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkVYVCAgICAgICAgZFJvdzFTaGZ0LCBkUm93MSwgZFJvdzFTaGZ0LCAjMQotICAgIFZMRDEgICAgICAgIHtkUm93MywgZFJvdzNTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkVYVCAgICAgICAgZFJvdzJTaGZ0LCBkUm93MiwgZFJvdzJTaGZ0LCAjMQotICAgIFZMRDEgICAgICAgIHtkUm93NCwgZFJvdzRTaGZ0fSwgW3BTcmNdLCBzcmNTdGVwCi0gICAgVkFEREwgICAgICAgcVN1bTAsIGRSb3cwLCBkUm93MFNoZnQKLSAgICBWTEQxICAgICAgICB7ZFJvdzUsIGRSb3c1U2hmdH0sIFtwU3JjXSwgc3JjU3RlcAotICAgIFZBRERMICAgICAgIHFTdW0xLCBkUm93MSwgZFJvdzFTaGZ0Ci0gICAgVkxEMSAgICAgICAge2RSb3c2LCBkUm93NlNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWRVhUICAgICAgICBkUm93M1NoZnQsIGRSb3czLCBkUm93M1NoZnQsICMxCi0gICAgVkxEMSAgICAgICAge2RSb3c3LCBkUm93N1NoZnR9LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWRVhUICAgICAgICBkUm93NFNoZnQsIGRSb3c0LCBkUm93NFNoZnQsICMxCi0gICAgVkxEMSAgICAgICAge2RSb3c4LCBkUm93OFNoZnR9LCBbcFNyY10sIHNyY1N0ZXAKLSAgICBWQUREICAgICAgICBxU3VtMSwgcVN1bTEsIHFSb3VuZAotICAgIFZBRERMICAgICAgIHFTdW0yLCBkUm93MiwgZFJvdzJTaGZ0Ci0gICAgVkVYVCAgICAgICAgZFJvdzVTaGZ0LCBkUm93NSwgZFJvdzVTaGZ0LCAjMQotICAgIFZBREQgICAgICAgIHFTdW0wLCBxU3VtMCwgcVN1bTEKLSAgICBWQURETCAgICAgICBxU3VtMywgZFJvdzMsIGRSb3czU2hmdAotICAgIFZFWFQgICAgICAgIGRSb3c2U2hmdCwgZFJvdzYsIGRSb3c2U2hmdCwgIzEKLSAgICBWQUREICAgICAgICBxU3VtMSwgcVN1bTEsIHFTdW0yCi0gICAgVlNIUk4gICAgICAgZFJvdzAsIHFTdW0wLCAjMgotICAgIFZBRERMICAgICAgIHFTdW00LCBkUm93NCwgZFJvdzRTaGZ0Ci0gICAgVlNIUk4gICAgICAgZFJvdzEsIHFTdW0xLCAjMgotICAgIFZBREQgICAgICAgIHFTdW0zLCBxU3VtMywgcVJvdW5kCi0gICAgVkFEREwgICAgICAgcVN1bTUsIGRSb3c1LCBkUm93NVNoZnQKLSAgICBWU1QxICAgICAgICBkUm93MCwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVkVYVCAgICAgICAgZFJvdzdTaGZ0LCBkUm93NywgZFJvdzdTaGZ0LCAjMQotICAgIFZTVDEgICAgICAgIGRSb3cxLCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWRVhUICAgICAgICBkUm93OFNoZnQsIGRSb3c4LCBkUm93OFNoZnQsICMxCi0gICAgVkFERCAgICAgICAgcVN1bTUsIHFTdW01LCBxUm91bmQKLSAgICBWQUREICAgICAgICBxU3VtMiwgcVN1bTIsIHFTdW0zCi0gICAgVkFERCAgICAgICAgcVN1bTMsIHFTdW0zLCBxU3VtNAotICAgIFZBREQgICAgICAgIHFTdW00LCBxU3VtNCwgcVN1bTUKLSAgICBWU0hSTiAgICAgICBkUm93MiwgcVN1bTIsICMyCi0gICAgVlNIUk4gICAgICAgZFJvdzMsIHFTdW0zLCAjMgotICAgIFZTSFJOICAgICAgIGRSb3c0LCBxU3VtNCwgIzIKLSAgICBWQURETCAgICAgICBxU3VtNiwgZFJvdzYsIGRSb3c2U2hmdAotICAgIFZBRERMICAgICAgIHFTdW03LCBkUm93NywgZFJvdzdTaGZ0Ci0gICAgVlNUMSAgICAgICAgZFJvdzIsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIFZBRERMICAgICAgIHFTdW04LCBkUm93OCwgZFJvdzhTaGZ0Ci0gICAgVkFERCAgICAgICAgcVN1bTcsIHFTdW03LCBxUm91bmQKLSAgICBWU1QxICAgICAgICBkUm93MywgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVlNUMSAgICAgICAgZFJvdzQsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIFZBREQgICAgICAgIHFTdW01LCBxU3VtNSwgcVN1bTYKLSAgICBWQUREICAgICAgICBxU3VtNiwgcVN1bTYsIHFTdW03Ci0gICAgVkFERCAgICAgICAgcVN1bTcsIHFTdW03LCBxU3VtOAotICAgIFZTSFJOICAgICAgIGRSb3c1LCBxU3VtNSwgIzIKLSAgICBWU0hSTiAgICAgICBkUm93NiwgcVN1bTYsICMyCi0gICAgVlNIUk4gICAgICAgZFJvdzcsIHFTdW03LCAjMgotICAgIFZTVDEgICAgICAgIGRSb3c1LCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWU1QxICAgICAgICBkUm93NiwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVlNUMSAgICAgICAgZFJvdzcsIFtwRHN0QDY0XSwgZHN0U3RlcAotCi0gICAgTUVORAotOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi07Ly8gSW5wdXQvT3V0cHV0IFJlZ2lzdGVycwotcFNyYyAgICAgICAgICAgICAgICAgIFJOIDAKLXNyY1N0ZXAgICAgICAgICAgICAgICBSTiAxCi1wU3JjUmVzaWR1ZSAgICAgICAgICAgUk4gMgotcERzdCAgICAgICAgICAgICAgICAgIFJOIDMKLWRzdFN0ZXAgICAgICAgICAgICAgICBSTiA0Ci1wcmVkaWN0VHlwZSAgICAgICAgICAgUk4gNQotcm5kVmFsICAgICAgICAgICAgICAgIFJOIDYKLQotOy8vIExvY2FsIFNjcmF0Y2ggUmVnaXN0ZXJzCi1wRHN0Q29weSAgICAgICAgICAgICAgUk4gMAotcmV0dXJuICAgICAgICAgICAgICAgIFJOIDAKLQotOy8vIE5lb24gUmVnaXN0ZXJzCi1kUm93MCAgICAgICAgICAgICAgICAgRE4gRDAuVTgKLWRSb3cwU2hmdCAgICAgICAgICAgICBETiBEMS5VOAotZFJvdzEgICAgICAgICAgICAgICAgIEROIEQyLlU4Ci1kUm93MVNoZnQgICAgICAgICAgICAgRE4gRDMuVTgKLWRSb3cyICAgICAgICAgICAgICAgICBETiBENC5VOAotZFJvdzJTaGZ0ICAgICAgICAgICAgIEROIEQ1LlU4Ci1kUm93MyAgICAgICAgICAgICAgICAgRE4gRDYuVTgKLWRSb3czU2hmdCAgICAgICAgICAgICBETiBENy5VOAotZFJvdzQgICAgICAgICAgICAgICAgIEROIEQ4LlU4Ci1kUm93NFNoZnQgICAgICAgICAgICAgRE4gRDkuVTgKLWRSb3c1ICAgICAgICAgICAgICAgICBETiBEMTAuVTgKLWRSb3c1U2hmdCAgICAgICAgICAgICBETiBEMTEuVTgKLWRSb3c2ICAgICAgICAgICAgICAgICBETiBEMTIuVTgKLWRSb3c2U2hmdCAgICAgICAgICAgICBETiBEMTMuVTgKLWRSb3c3ICAgICAgICAgICAgICAgICBETiBEMTQuVTgKLWRSb3c3U2hmdCAgICAgICAgICAgICBETiBEMTUuVTgKLWRSb3c4ICAgICAgICAgICAgICAgICBETiBEMTYuVTgKLWRSb3c4U2hmdCAgICAgICAgICAgICBETiBEMTcuVTgKLQotCi1xU3VtMCAgICAgICAgICAgICAgICAgUU4gUTkuVTE2Ci1xU3VtMSAgICAgICAgICAgICAgICAgUU4gUTEwLlUxNgotcVN1bTIgICAgICAgICAgICAgICAgIFFOIFExMS5VMTYKLXFTdW0zICAgICAgICAgICAgICAgICBRTiBRMTIuVTE2Ci1xU3VtNCAgICAgICAgICAgICAgICAgUU4gUTEzLlUxNgotcVN1bTUgICAgICAgICAgICAgICAgIFFOIFExNC5VMTYKLXFTdW02ICAgICAgICAgICAgICAgICBRTiBRMC5VMTYKLXFTdW03ICAgICAgICAgICAgICAgICBRTiBRMS5VMTYKLXFTdW04ICAgICAgICAgICAgICAgICBRTiBRMi5VMTYKLQotcVJvdW5kICAgICAgICAgICAgICAgIFFOIFExNS5VMTYKLQotZERzdDAgICAgICAgICAgICAgICAgIEROIEQwLlU4Ci1kRHN0MSAgICAgICAgICAgICAgICAgRE4gRDEuVTgKLWREc3QyICAgICAgICAgICAgICAgICBETiBEMi5VOAotZERzdDMgICAgICAgICAgICAgICAgIEROIEQzLlU4Ci1kRHN0NCAgICAgICAgICAgICAgICAgRE4gRDQuVTgKLWREc3Q1ICAgICAgICAgICAgICAgICBETiBENS5VOAotZERzdDYgICAgICAgICAgICAgICAgIEROIEQ2LlU4Ci1kRHN0NyAgICAgICAgICAgICAgICAgRE4gRDcuVTgKLQotcVJlczAgICAgICAgICAgICAgICAgIFFOIFE0LlMxNgotcVJlczEgICAgICAgICAgICAgICAgIFFOIFE1LlMxNgotcVJlczIgICAgICAgICAgICAgICAgIFFOIFE2LlMxNgotcVJlczMgICAgICAgICAgICAgICAgIFFOIFE3LlMxNgotcVJlczQgICAgICAgICAgICAgICAgIFFOIFE4LlMxNgotcVJlczUgICAgICAgICAgICAgICAgIFFOIFE5LlMxNgotcVJlczYgICAgICAgICAgICAgICAgIFFOIFExMC5TMTYKLXFSZXM3ICAgICAgICAgICAgICAgICBRTiBRMTEuUzE2Ci0KLSAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCi0gICAgTV9TVEFSVCAgICAgb214VkNNNFAyX01DUmVjb25CbG9jaywgcjYsIGQxNQotICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCi0gICAgTV9BUkcgICAgICAgQXJnX2RzdFN0ZXAsICAgICAgICA0Ci0gICAgTV9BUkcgICAgICAgQXJnX3ByZWRpY3RUeXBlLCAgICA0Ci0gICAgTV9BUkcgICAgICAgQXJnX3JuZFZhbCwgICAgICAgICA0Ci0gICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKLSAgICBNX0xEUiAgICAgICBkc3RTdGVwLCBBcmdfZHN0U3RlcAotICAgIE1fTERSICAgICAgIHByZWRpY3RUeXBlLCBBcmdfcHJlZGljdFR5cGUKLSAgICBNX0xEUiAgICAgICBybmRWYWwsIEFyZ19ybmRWYWwKLSAgICBBREQgICAgICAgICBwcmVkaWN0VHlwZSwgcm5kVmFsLCBwcmVkaWN0VHlwZSwgTFNMICMxCi0gICAgUlNCICAgICAgICAgcm5kVmFsLCBybmRWYWwsICMyICAgICAgICAgICAgICA7Ly8gcHJlcGFyaW5nIHJuZFZhbCBmb3IgSGFsZlBpeGVsWFkKLSAgICAKLSAgICA7Ly8gVGhlIGZvbGxvd2luZyBpcyBpbXBsZW1lbnRhdGlvbiBvZiBzd2l0Y2hpbmcgdG8gZGlmZmVyZW50IGNvZGUgc2VnbWVudHMKLSAgICA7Ly8gYmFzZWQgb24gZGlmZmVyZW50IHByZWRpY3RUeXBlIGFuZCBybmRWYWwgZmxhZ3MuIFRoZSBjb3JyZXNwb25kaW5nIAotICAgIDsvLyBsYWJlbHMgKGUuZy4gQ2FzZUludGVnZXJQaXhlbF9SbmQwKSBhcmUgZW1iZWRkZWQgaW4gdGhlIG1hY3JvcyBmb2xsb3dpbmcKLSAgICA7Ly8gTV9FTkRTV0lUQ0ggKGUuZy4gTV9NQ1JFQ09OQkxPQ0tfSW50ZWdlclBpeGVsKS4gV2hpbGUgIk1fTUNSRUNPTkJMT0NLX0ludGVnZXJQaXhlbCIgCi0gICAgOy8vIGFuZCAiTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWFkiIGhhbmRsZSBmb3IgYm90aCByb3VuZGluZyBjYXNlczsgCi0gICAgOy8vICJNX01DUkVDT05CTE9DS19IYWxmUGl4ZWxYIiBhbmQgIk1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFkiIG1hY3JvcyBoYW5kbGUgCi0gICAgOy8vIHRoZSB0d28gcm91bmRpbmcgY2FzZXMgaW4gc2VwYXJhdGUgY29kZSBiYXNlcy4KLSAgICA7Ly8gQWxsIHRoZXNlIHRvZ2V0aGVyIGltcGxlbWVudCB0aGUgaW50ZXJwb2xhdGlvbiBmdW5jdGlvbmFsaXR5Ci0gICAgCi0gICAgTV9TV0lUQ0ggICAgcHJlZGljdFR5cGUKLSAgICAgICAgTV9DQVNFICAgICAgQ2FzZUludGVnZXJQaXhlbF9SbmQwCi0gICAgICAgIE1fQ0FTRSAgICAgIENhc2VJbnRlZ2VyUGl4ZWxfUm5kMQotICAgICAgICBNX0NBU0UgICAgICBDYXNlSGFsZlBpeGVsWF9SbmQwCi0gICAgICAgIE1fQ0FTRSAgICAgIENhc2VIYWxmUGl4ZWxYX1JuZDEKLSAgICAgICAgTV9DQVNFICAgICAgQ2FzZUhhbGZQaXhlbFlfUm5kMAotICAgICAgICBNX0NBU0UgICAgICBDYXNlSGFsZlBpeGVsWV9SbmQxCi0gICAgICAgIE1fQ0FTRSAgICAgIENhc2VIYWxmUGl4ZWxYWV9SbmQwCi0gICAgICAgIE1fQ0FTRSAgICAgIENhc2VIYWxmUGl4ZWxYWV9SbmQxCi0gICAgTV9FTkRTV0lUQ0gKLQotICAgIE1fTUNSRUNPTkJMT0NLX0ludGVnZXJQaXhlbAotICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFggMAotICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFggMQotICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFkgMAotICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFkgMQotICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFhZCi1Td2l0Y2hQcmVkaWN0VHlwZUVuZAotCi0gICAgOy8vIEFmdGVyIGludGVycG9sYXRpb24gaXMgZG9uZSwgcmVzaWR1ZSBuZWVkcyB0byBiZSBhZGRlZC4gVGhpcyBpcyBkb25lIAotICAgIDsvLyBvbmx5IGluIGNhc2UgInBTcmNSZXNpZHVlIiBwYXJhbWV0ZXIgdG8gdGhlIGZ1bmN0aW9uIGlzIG5vdCBOVUxMLgotICAgIDsvLyBGb2xsb3dpbmcgaXMgYSBjb21wbGV0ZWx5IHVucm9sbGVkIGNvZGUgdG8gZG8gc28uIEVhY2ggcm93IGFuZCAKLSAgICA7Ly8gY29ycmVzcG9uZGluZyByZXNpZHVlIGlzIGxvYWRlZCBhbmQgcmVzaWR1ZSBpcyBhZGRlZCBhbmQgdmFsdWUgCi0gICAgOy8vIHN0b3JlZAotICAgIAotICAgIENNUCAgICAgICAgIHBTcmNSZXNpZHVlLCAjMAotICAgIFNVQk5FICAgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMyAgICAgOy8vIFJlc3RvcmluZyBwRHN0Ci0gICAgTU9WTkUgICAgICAgcERzdENvcHksIHBEc3QKLSAgICBCRVEgICAgICAgICBwU3JjUmVzaWR1ZUNvbmRpdGlvbkVuZAotcFNyY1Jlc2lkdWVOb3ROdWxsICAgIAotICAgIFZMRDEgICAgICAgIGREc3QwLCBbcERzdEA2NF0sIGRzdFN0ZXAKLSAgICBWTEQxICAgICAgICBxUmVzMCwgW3BTcmNSZXNpZHVlQDEyOF0hCi0gICAgVkxEMSAgICAgICAgZERzdDEsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIFZMRDEgICAgICAgIHFSZXMxLCBbcFNyY1Jlc2lkdWVAMTI4XSEKLSAgICBWTEQxICAgICAgICBkRHN0MiwgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVkxEMSAgICAgICAgcVJlczIsIFtwU3JjUmVzaWR1ZUAxMjhdIQotICAgIFZBRERXICAgICAgIHFSZXMwLCBxUmVzMCwgZERzdDAKLSAgICBWTEQxICAgICAgICBkRHN0MywgW3BEc3RANjRdLCBkc3RTdGVwCi0gICAgVkFERFcgICAgICAgcVJlczEsIHFSZXMxLCBkRHN0MQotICAgIFZMRDEgICAgICAgIHFSZXMzLCBbcFNyY1Jlc2lkdWVAMTI4XSEKLSAgICBWQUREVyAgICAgICBxUmVzMiwgcVJlczIsIGREc3QyCi0gICAgVkxEMSAgICAgICAgZERzdDQsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIFZRTU9WVU4gICAgIGREc3QwLCBxUmVzMAotICAgIFZMRDEgICAgICAgIHFSZXM0LCBbcFNyY1Jlc2lkdWVAMTI4XSEKLSAgICBWQUREVyAgICAgICBxUmVzMywgcVJlczMsIGREc3QzCi0gICAgVkxEMSAgICAgICAgZERzdDUsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIFZRTU9WVU4gICAgIGREc3QxLCBxUmVzMQotICAgIFZMRDEgICAgICAgIHFSZXM1LCBbcFNyY1Jlc2lkdWVAMTI4XSEKLSAgICBWQUREVyAgICAgICBxUmVzNCwgcVJlczQsIGREc3Q0Ci0gICAgVkxEMSAgICAgICAgZERzdDYsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIFZRTU9WVU4gICAgIGREc3QyLCBxUmVzMgotICAgIFZMRDEgICAgICAgIHFSZXM2LCBbcFNyY1Jlc2lkdWVAMTI4XSEKLSAgICBWQUREVyAgICAgICBxUmVzNSwgcVJlczUsIGREc3Q1Ci0gICAgVkxEMSAgICAgICAgZERzdDcsIFtwRHN0QDY0XSwgZHN0U3RlcAotICAgIFZRTU9WVU4gICAgIGREc3QzLCBxUmVzMwotICAgIFZMRDEgICAgICAgIHFSZXM3LCBbcFNyY1Jlc2lkdWVAMTI4XSEKLSAgICBWQUREVyAgICAgICBxUmVzNiwgcVJlczYsIGREc3Q2Ci0gICAgVlNUMSAgICAgICAgZERzdDAsIFtwRHN0Q29weUA2NF0sIGRzdFN0ZXAKLSAgICBWUU1PVlVOICAgICBkRHN0NCwgcVJlczQKLSAgICBWU1QxICAgICAgICBkRHN0MSwgW3BEc3RDb3B5QDY0XSwgZHN0U3RlcAotICAgIFZBRERXICAgICAgIHFSZXM3LCBxUmVzNywgZERzdDcKLSAgICBWU1QxICAgICAgICBkRHN0MiwgW3BEc3RDb3B5QDY0XSwgZHN0U3RlcAotICAgIFZRTU9WVU4gICAgIGREc3Q1LCBxUmVzNQotICAgIFZTVDEgICAgICAgIGREc3QzLCBbcERzdENvcHlANjRdLCBkc3RTdGVwCi0gICAgVlFNT1ZVTiAgICAgZERzdDYsIHFSZXM2Ci0gICAgVlNUMSAgICAgICAgZERzdDQsIFtwRHN0Q29weUA2NF0sIGRzdFN0ZXAKLSAgICBWUU1PVlVOICAgICBkRHN0NywgcVJlczcKLSAgICBWU1QxICAgICAgICBkRHN0NSwgW3BEc3RDb3B5QDY0XSwgZHN0U3RlcAotICAgIFZTVDEgICAgICAgIGREc3Q2LCBbcERzdENvcHlANjRdLCBkc3RTdGVwCi0gICAgVlNUMSAgICAgICAgZERzdDcsIFtwRHN0Q29weUA2NF0sIGRzdFN0ZXAKLSAgICAKLXBTcmNSZXNpZHVlQ29uZGl0aW9uRW5kCi0gICAgTU9WICAgICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgotCi0gICAgTV9FTkQKLSAgICBFTkRJRiA7Ly8gQ29ydGV4QTgKLSAgICBFTkQKLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsvLyBvbXhWQ000UDJfTUNSZWNvbkJsb2NrIGVuZHMKLTsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI0ZWIyOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9zLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotOy8vCi07Ly8gQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLTsvLwotOy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsvLwotOy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ly8KLTsvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07Ly8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07Ly8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ly8KLTsgKioqKioqKioqKgotOyAqIAotOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zCi07ICogT3Blbk1BWCBETDogdjEuMC4yCi07ICogUmV2aXNpb246ICAgMTIyOTAKLTsgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsgKiAKLTsgKiAKLTsgKiAKLTsgKiAKLTsgKiBEZXNjcmlwdGlvbjoKLTsgKiBDb250YWlucyBtb2R1bGUgZm9yIERDL0FDIGNvZWZmaWNpZW50IHByZWRpY3Rpb24KLTsgKgotOyAqIAotOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhCi07ICoKLTsgKiBEZXNjcmlwdGlvbjoKLTsgKiBQZXJmb3JtcyBhZGFwdGl2ZSBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uIGZvciBhbiBpbnRyYSBibG9jay4gUHJpb3IKLTsgKiB0byB0aGUgZnVuY3Rpb24gY2FsbCwgcHJlZGljdGlvbiBkaXJlY3Rpb24gKHByZWREaXIpIHNob3VsZCBiZSBzZWxlY3RlZAotOyAqIGFzIHNwZWNpZmllZCBpbiBzdWJjbGF1c2UgNy40LjMuMSBvZiBJU08vSUVDIDE0NDk2LTIuCi07ICoKLTsgKiBSZW1hcmtzOgotOyAqCi07ICogUGFyYW1ldGVyczoKLTsgKiBbaW5dICBwU3JjRHN0ICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zIHRoZSAKLTsgKiAgICAgICAgICAgICAgICAgICAgcXVhbnRpemVkIGNvZWZmaWNpZW50IHJlc2lkdWFscyAoUFFGKSBvZiB0aGUgY3VycmVudCAKLTsgKiAgICAgICAgICAgICAgICAgICAgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gVGhlIAotOyAqICAgICAgICAgICAgICAgICAgICBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgdG8gdGhlIHJhbmdlIAotOyAqICAgICAgICAgICAgICAgICAgICBbLTIwNDgsIDIwNDddLgotOyAqIFtpbl0gIHBQcmVkQnVmUm93ICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQKLTsgKiAgICAgICAgICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuCi07ICogW2luXSAgcFByZWRCdWZDb2wgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgCi07ICogICAgICAgICAgICAgICAgICAgIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuCi07ICogW2luXSAgY3VyUVAgICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQIG1heSAKLTsgKiAgICAgICAgICAgICAgICAgICAgZXF1YWwgdG8gcHJlZFFQIGVzcGVjaWFsbHkgd2hlbiB0aGUgY3VycmVudCBibG9jayBhbmQgCi07ICogICAgICAgICAgICAgICAgICAgIHRoZSBwcmVkaWN0b3IgYmxvY2sgYXJlIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suCi07ICogW2luXSAgcHJlZFFQICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jawotOyAqIFtpbl0gIHByZWREaXIgICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQotOyAqICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLTsgKiAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKLTsgKiAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKLTsgKiBbaW5dICBBQ1ByZWRGbGFnICAgYSBmbGFnIGluZGljYXRpbmcgaWYgQUMgcHJlZGljdGlvbiBzaG91bGQgYmUKLTsgKiAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkLiBJdCBpcyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgaW4gdGhlIGJpdAotOyAqICAgICAgICAgICAgICAgICAgICBzdHJlYW0gc3ludGF4IG9mIE1QRUctNAotOyAqIFtpbl0gIHZpZGVvQ29tcCAgICB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSBvcgotOyAqICAgICAgICAgICAgICAgICAgICBhbHBoYSkgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLTsgKiBbb3V0XSBwU3JjRHN0ICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zCi07ICogICAgICAgICAgICAgICAgICAgIHRoZSBxdWFudGl6ZWQgY29lZmZpY2llbnRzIChRRikgb2YgdGhlIGN1cnJlbnQKLTsgKiAgICAgICAgICAgICAgICAgICAgYmxvY2sKLTsgKiBbb3V0XSBwUHJlZEJ1ZlJvdyAgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyCi07ICogW291dF0gcFByZWRCdWZDb2wgIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgotOyAqIFJldHVybiBWYWx1ZToKLTsgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKLTsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHMgCi07ICogLSBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbC4KLTsgKiAtIEF0IGxlYXN0IG9uZSB0aGUgZm9sbG93aW5nIGNhc2VzOiBjdXJRUCA8PSAwLCBwcmVkUVAgPD0gMCwgY3VyUVAgPjMxLCAKLTsgKiAgIHByZWRRUCA+IDMxLCBwcmVEaXIgZXhjZWVkcyBbMSwyXS4KLTsgKiAtIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnMgcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sIGlzIG5vdCAKLTsgKiAgIDQtYnl0ZSBhbGlnbmVkLgotOyAqCi07ICoqKioqKioqKgotICAgICAKLSAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAotICAgICAgICAKLSAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4Ci0gICAgICAgCi0gICAgICAgICAgICAgCi0KLSAgICAgICBJTVBPUlQgICAgICAgIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MzMgotICAgICAgIElNUE9SVCAgICAgICAgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzE2Ci0gICAgICAgSU1QT1JUICAgICAgICBhcm1WQ000UDJfRENTY2FsZXIKLSAgICAgICAKLSAgICAgICAgSUYgQ29ydGV4QTgKLTsvLyBJbnB1dCBBcmd1bWVudHMKLQotcFNyY0RzdCAgICAgICAgICBSTiAwCi1wUHJlZEJ1ZlJvdyAgICAgIFJOIDEKLXBQcmVkQnVmQ29sICAgICAgUk4gMgotY3VyUVAgICAgICAgICAgICBSTiAzCi1RUCAgICAgICAgICAgICAgIFJOIDMKLXByZWRRUCAgICAgICAgICAgUk4gNAotcHJlZERpciAgICAgICAgICBSTiA1Ci1BQ1ByZWRGbGFnICAgICAgIFJOIDYKLXZpZGVvQ29tcCAgICAgICAgUk4gNwotCi07Ly8gTG9jYWwgVmFyaWFibGVzCi0KLXNob3J0VmlkZW9IZWFkZXIgUk4gNAotZGNTY2FsZXIgICAgICAgICBSTiA0Ci1pbmRleCAgICAgICAgICAgIFJOIDYKLXByZWRDb2VmZlRhYmxlICAgUk4gNwotdGVtcDEgICAgICAgICAgICBSTiA2Ci10ZW1wMiAgICAgICAgICAgIFJOIDkKLXRlbXAgICAgICAgICAgICAgUk4gMTQKLUNvbnN0ICAgICAgICAgICAgUk4gOAotdGVtcHBQcmVkQ29sQnVmICBSTiA4Ci10ZW1wUHJlZCAgICAgICAgIFJOIDkKLQotYWJzQ29lZmZEQyAgICAgICBSTiA4Ci1uZWdkY1NjYWxlciAgICAgIFJOIDEwCi1SZW0gICAgICAgICAgICAgIFJOIDExCi10ZW1wMyAgICAgICAgICAgIFJOIDEyCi0KLWRjUm93YnVmQ29lZmYgICAgUk4gMTAKLWRjQ29sQnVmZkNvZWZmICAgUk4gMTEKLVJldHVybiAgICAgICAgICAgUk4gMAotCi07Ly9ORU9OIFJlZ2lzdGVycwotCi1xUHJlZFJvd0J1ZiAgICAgICBRTiBRMC5TMTYKLWRQcmVkUm93QnVmMCAgICAgIEROIEQwLlMxNgotZFByZWRSb3dCdWYxICAgICAgRE4gRDEuUzE2Ci0KLQotCi0KLXFDb2VmZlRhYiAgICAgICAgIFFOIFExLlMzMgotCi1xUHJlZFFQICAgICAgICAgICBRTiBRMi5TMTYKLWRQcmVkUVAwICAgICAgICAgIEROIEQ0LlMxNgotZFByZWRRUDEgICAgICAgICAgRE4gRDUuUzE2Ci0KLQotcXRlbXAxICAgICAgICAgICAgUU4gUTMuUzMyCi1xdGVtcCAgICAgICAgICAgICBRTiBRMy5TMTYKLQotZHRlbXAwICAgICAgICAgICAgRE4gRDYuUzE2Ci1kdGVtcDEgICAgICAgICAgICBETiBENy5TMTYKLQotZHRlbXAyICAgICAgICAgICAgRE4gRDguUzE2Ci1kdGVtcDMgICAgICAgICAgICBETiBEOS5TMTYKLQotZHRlbXA0ICAgICAgICAgICAgRE4gRDIuUzE2Ci1kdGVtcDUgICAgICAgICAgICBETiBEMy5TMTYKLWR0ZW1wNiAgICAgICAgICAgIEROIEQ0LlMxNgotZHRlbXA3ICAgICAgICAgICAgRE4gRDUuUzE2Ci0gCi1xdGVtcFByZWQxICAgICAgICBRTiBRNS5TMzIKLXF0ZW1wUHJlZCAgICAgICAgIFFOIFE1LlMxNgotCi1kdGVtcFByZWQwICAgICAgICBETiBEMTAuUzE2Ci1kdGVtcFByZWQxICAgICAgICBETiBEMTEuUzE2Ci0gCi0gIAotCi0gICAgICBNX1NUQVJUICAgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSxyMTEsZDExCi0KLSAgICAgIDsvLyBBc3NpZ25pbmcgcG9pbnRlcnMgdG8gSW5wdXQgYXJndW1lbnRzIG9uIFN0YWNrCi0gICAgCi0gICAgICBNX0FSRyAgICAgICAgICAgcHJlZFFQb25TdGFjayw0ICAKLSAgICAgIE1fQVJHICAgICAgICAgICBwcmVkRGlyb25TdGFjayw0Ci0gICAgICBNX0FSRyAgICAgICAgICAgQUNQcmVkRmxhZ29uU3RhY2ssNAotICAgICAgTV9BUkcgICAgICAgICAgIHZpZGVvQ29tcG9uU3RhY2ssNAotICAgICAgCi0gICAgICA7Ly8gREMgUHJlZGljdGlvbgotCi0gICAgICBNX0xEUiAgICAgICAgICAgdmlkZW9Db21wLHZpZGVvQ29tcG9uU3RhY2sgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB2aWRlb0NvbXAgRnJvbSBTdGFjayAgICAgICAgICAgICAgIAotICAgICAgICAgICAgCi0gICAgICBNX0xEUiAgICAgICAgICAgcHJlZERpcixwcmVkRGlyb25TdGFjayAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBQcmVkaWN0aW9uIGRpcmVjdGlvbgotICAgICAgOy8vIERDIFNjYWxlciBjYWxjdWxhdGlvbiAgIAotICAgICAgTERSICAgICAgICAgICAgIGluZGV4LCA9YXJtVkNNNFAyX0RDU2NhbGVyCi0gICAgICBBREQgICAgICAgICAgICAgaW5kZXgsaW5kZXgsdmlkZW9Db21wLExTTCAjNQotICAgICAgTERSQiAgICAgICAgICAgIGRjU2NhbGVyLFtpbmRleCxRUF0KLQotICAgICAgIAotICAgICAgTERSICAgICAgICAgICAgIHByZWRDb2VmZlRhYmxlLCA9YXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzE2ICAgOy8vIExvYWRpbmcgdGhlIHRhYmxlIHdpdGggZW50cmllcyAzMjc2Ny8oMSB0byA2MykgCi0gICAgICBDTVAgICAgICAgICAgICAgcHJlZERpciwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgdGhlIFByZWRpY3Rpb24gZGlyZWN0aW9uIGlzIHZlcnRpY2FsCi0KLSAgICAgIDsvLyBDYXVsdWNhdGUgdGVtcFByZWQKLSAgICAgICAgICAgIAotICAgICAgTERSRVFTSCAgICAgICAgIGFic0NvZWZmREMsW3BQcmVkQnVmUm93XSAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIHZldGljYWwgbG9hZCB0aGUgY29lZmYgZnJvbSBSb3cgUHJlZGljdGlvbiBCdWZmZXIKLSAgICAgIExEUk5FU0ggICAgICAgICBhYnNDb2VmZkRDLFtwUHJlZEJ1ZkNvbF0gICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBob3Jpem9udGFsIGxvYWQgdGhlIGNvZWZmIGZyb20gY29sdW1uIFByZWRpY3Rpb24gQnVmZmVyCi0gICAgICAKLSAgICAgIFJTQiAgICAgICAgICAgICBuZWdkY1NjYWxlcixkY1NjYWxlciwjMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBuZWdkY1NjYWxlcj0tZGNTY2FsZXIgICAKLSAgICAgIE1PViAgICAgICAgICAgICB0ZW1wMSxhYnNDb2VmZkRDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHRoZSBQcmVkaWN0aW9uIGNvZWZmIHRvIHRlbXAgZm9yIGNvbXBhcmlzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBSU0JMVCAgICAgICAgICAgYWJzQ29lZmZEQyx0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY2FsY3VsYXRlIGFic29sdXRlIHZhbCBvZiBwcmVkaWN0aW9uIGNvZWZmCi0gICAgICAKLSAgICAgIEFERCAgICAgICAgICAgICB0ZW1wLGRjU2NhbGVyLGRjU2NhbGVyCi0gICAgICBMRFJIICAgICAgICAgICAgdGVtcCxbcHJlZENvZWZmVGFibGUsdGVtcF0gICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB2YWx1ZSBmcm9tIGNvZWZmIHRhYmxlIGZvciBwZXJmb3JtaW5nIGRpdmlzaW9uIHVzaW5nIG11bHRpcGxpY2F0aW9uCi0gICAgICBTTVVMQkIgICAgICAgICAgdGVtcFByZWQsdGVtcCxhYnNDb2VmZkRDICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcHBlZD1wUHJlZEJ1ZlJvdyhDb2wpWzBdKjMyNzY3L2RjU2NhbGVyCi0gICAgICBBREQgICAgICAgICAgICAgdGVtcDMsZGNTY2FsZXIsIzEKLSAgICAgIExTUiAgICAgICAgICAgICB0ZW1wUHJlZCx0ZW1wUHJlZCwjMTUgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wcGVkPXBQcmVkQnVmUm93KENvbClbMF0vZGNTY2FsZXIgICAgICAgICAgICAgICAgICAKLSAgICAgIExTUiAgICAgICAgICAgICB0ZW1wMyx0ZW1wMywjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wMz1yb3VuZChkY1NjYWxlci8yKSAgICAgICAgICAgCi0gICAgICBNTEEgICAgICAgICAgICAgUmVtLG5lZ2RjU2NhbGVyLHRlbXBQcmVkLGFic0NvZWZmREMgICAgICAgICAgICA7Ly8gUmVtYWluZGVyIFJlbT1hYnMocFByZWRCdWZSb3coQ29sKVswXSktdGVtcFByZWQqZGNTY2FsZXIKLSAgICAgIAotICAgICAgTERSSCAgICAgICAgICAgIGRjUm93YnVmQ29lZmYsW3BQcmVkQnVmQ29sXSAgICAgICAgICAgIAotICAgICAgCi0gICAgICBDTVAgICAgICAgICAgICAgUmVtLHRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY29tcGFyZSBSZW0gd2l0aCAoZGNTY2FsZXIvMikKLSAgICAgIEFEREdFICAgICAgICAgICB0ZW1wUHJlZCwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wUHJlZD10ZW1wUHJlZCsxIGlmIFJlbT49KGRjU2NhbGVyLzIpCi0gICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzAKLSAgICAgIFJTQkxUICAgICAgICAgICB0ZW1wUHJlZCx0ZW1wUHJlZCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wUHJlZD0tdGVtcFByZWQgaWYgCi0gICAgICAgCi0gICAgICBTVFJIICAgICAgICAgICAgZGNSb3didWZDb2VmZixbcFByZWRCdWZSb3csIy0xNl0gICAgICAKLSAgICAgICAKLQotICAgICAgTERSSCAgICAgICAgICAgIHRlbXAsW3BTcmNEc3RdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9cFNyY0RzdFswXQotICAgICAgQUREICAgICAgICAgICAgIHRlbXAsdGVtcCx0ZW1wUHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9cFNyY0RzdFswXSt0ZW1wUHJlZAotICAgICAgU1NBVDE2ICAgICAgICAgIHRlbXAsIzEyLHRlbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNsaXAgdGVtcCB0byBbLTIwNDgsMjA0N10KLSAgICAgIFNNVUxCQiAgICAgICAgICBkY0NvbEJ1ZmZDb2VmZix0ZW1wLGRjU2NhbGVyICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wMT1jbGlwcGVkKHBTcmNEc3RbMF0pKmRjU2NhbGVyICAgICAgICAgICAKLSAgICAgIE1fTERSICAgICAgICAgICBBQ1ByZWRGbGFnLEFDUHJlZEZsYWdvblN0YWNrCi0gICAgICBTVFJIICAgICAgICAgICAgZGNDb2xCdWZmQ29lZmYsW3BQcmVkQnVmQ29sXSAgICAgIAotICAgICAgCi0KLSAgICAgICA7Ly8gQUMgUHJlZGljdGlvbgotICAgICAgCi0gICAgICBNX0xEUiAgICAgICAgICAgcHJlZFFQLHByZWRRUG9uU3RhY2sKLSAgICAgIAotICAgICAgQ01QICAgICAgICAgICAgIEFDUHJlZEZsYWcsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIHRoZSBBQyBwcmVkaWN0aW9uIGZsYWcgaXMgc2V0IG9yIG5vdAotICAgICAgQk5FICAgICAgICAgICAgIEV4aXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIG5vdCBzZXQgRXhpdAotICAgICAgQ01QICAgICAgICAgICAgIHByZWREaXIsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIHRoZSBQcmVkaWN0aW9uIGRpcmVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBMRFIgICAgICAgICAgICAgcHJlZENvZWZmVGFibGUsID1hcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMzIgICA7Ly8gTG9hZGluZyB0aGUgdGFibGUgd2l0aCBlbnRyaWVzIDB4MWZmZmYvKDEgdG8gNjMpIAotICAgICAgTU9WICAgICAgICAgICAgIENvbnN0LCM0Ci0gICAgICBNVUwgICAgICAgICAgICAgY3VyUVAsY3VyUVAsQ29uc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY3VyUVA9NCpjdXJRUAotICAgICAgVkRVUCAgICAgICAgICAgIGRQcmVkUVAwLHByZWRRUAotICAgICAgTERSICAgICAgICAgICAgIHRlbXAyLFtwcmVkQ29lZmZUYWJsZSxjdXJRUF0gICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9MHgxZmZmZi9jdXJRUAotICAgICAgVkRVUCAgICAgICAgICAgIHFDb2VmZlRhYix0ZW1wMgotICAgICAgQk5FICAgICAgICAgICAgIEhvcml6b250YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIHRoZSBQcmVkaWN0aW9uIGRpcmVjdGlvbiBpcyBob3Jpem9udGFsIGJyYW5jaCB0byBIb3Jpem9udGFsCi0gICAgICAKLSAgICAgCi0gICAgICAKLSAgICAgIDsvLyBWZXJ0aWNhbAotICAgICAgOy8vQ2FsY3VsYXRpbmcgdGVtcFByZWQKLQotICAgICAgVkxEMSAgICAgICAgICAgIHtkUHJlZFJvd0J1ZjAsZFByZWRSb3dCdWYxfSxbcFByZWRCdWZSb3ddICAgICAgOy8vIExvYWRpbmcgcFByZWRCdWZSb3dbaV06aT0wIHQwIDcKLSAgICAgIAotICAgICAgVk1VTEwgICAgICAgICAgIHF0ZW1wMSxkUHJlZFJvd0J1ZjAsZFByZWRRUDAgICAgICAgICAgICAgICAgICAgOy8vcXRlbXAxW2ldPXBQcmVkQnVmUm93W2ldKmRQcmVkUVBbaV06IGk9MCB0MCAzCi0gICAgICBWTVVMICAgICAgICAgICAgcXRlbXBQcmVkMSxxdGVtcDEscUNvZWZmVGFiICAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcFByZWQxW2ldPXBQcmVkQnVmUm93W2ldKmRQcmVkUVBbaV0qMHgxZmZmZi9jdXJRUCA6IGk9MCB0MCAzCi0gICAgICAKLSAgICAgIFZNVUxMICAgICAgICAgICBxdGVtcDEsZFByZWRSb3dCdWYxLGRQcmVkUVAwICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wMVtpXT1wUHJlZEJ1ZlJvd1tpXSpkUHJlZFFQW2ldIDogaT00IHQwIDcgICAgICAKLQotICAgICAgVlJTSFIgICAgICAgICAgIHF0ZW1wUHJlZDEscXRlbXBQcmVkMSwjMTcgICAgICAgICAgICAgICAgICAgICAgOy8vcXRlbXBQcmVkMVtpXT1yb3VuZChwUHJlZEJ1ZlJvd1tpXSpkUHJlZFFQW2ldL2N1clFQKSA6IGk9MCB0MCAzCi0gICAgICBWU0hSTiAgICAgICAgICAgZFByZWRRUDEscXRlbXBQcmVkMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gbmFycm93IHF0ZW1wUHJlZDFbaV0gdG8gMTYgYml0cwotICAgICAgCi0gICAgICAKLSAgICAgIFZNVUwgICAgICAgICAgICBxdGVtcFByZWQxLHF0ZW1wMSxxQ29lZmZUYWIgICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wUHJlZDFbaV09cFByZWRCdWZSb3dbaV0qZFByZWRRUFtpXSoweDFmZmZmL2N1clFQIDogaT00IHQwIDcKLSAgICAgIFZSU0hSICAgICAgICAgICBxdGVtcFByZWQxLHF0ZW1wUHJlZDEsIzE3ICAgICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wUHJlZDFbaV09cm91bmQocFByZWRCdWZSb3dbaV0qZFByZWRRUFtpXS9jdXJRUCkgIDogaT00IHQwIDcKLSAgICAgIFZMRDEgICAgICAgICAgICB7ZHRlbXAwLGR0ZW1wMX0sW3BTcmNEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvL0xvYWRpbmcgcFNyY0RzdFtpXSA6IGk9MCB0byA3Ci0gICAgICBWU0hSTiAgICAgICAgICAgZHRlbXBQcmVkMSxxdGVtcFByZWQxLCMwICAgICAgICAgICAgICAgICAgICAgICA7Ly8gbmFycm93IHF0ZW1wUHJlZDFbaV0gdG8gMTYgYml0cwotICAgICAgVk1PViAgICAgICAgICAgIGR0ZW1wUHJlZDAsZFByZWRRUDEKLSAgICAgIAotICAgICAgOy8vdXBkYXRpbmcgc291cmNlIGFuZCByb3cgcHJlZGljdGlvbiBidWZmZXIgY29udGVudHMgICAgICAKLSAgICAgIFZBREQgICAgICAgICAgICBxdGVtcCxxdGVtcCxxdGVtcFByZWQgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL3BTcmNEc3RbaV09cFNyY0RzdFtpXStxdGVtcFByZWRbaV06IGk9MCB0byA3IAotICAgICAgVlFTSEwgICAgICAgICAgIHF0ZW1wLHF0ZW1wLCM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQ2xpcCB0byBbLTIwNDgsMjA0N10KLSAgICAgIExEUkggICAgICAgICAgICBkY1Jvd2J1ZkNvZWZmLFtwUHJlZEJ1ZlJvd10gICAgICAgICAgICAgICAgICAgIDsvL0xvYWRpbmcgRGMgVmFsdWUgb2YgUm93IFByZWRpY3Rpb24gYnVmZmVyCi0gICAgICBWU0hSICAgICAgICAgICAgcXRlbXAscXRlbXAsIzQKLSAgICAgIAotICAgICAgVlNUMSAgICAgICAgICAgIHtkdGVtcDAsZHRlbXAxfSxbcFNyY0RzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vc3RvcmluZyBiYWNrIHRoZSB1cGRhdGVkIHZhbHVlcyAKLSAgICAgIFZTVDEgICAgICAgICAgICB7ZHRlbXAwLGR0ZW1wMX0sW3BQcmVkQnVmUm93XSAgICAgICAgICAgICAgICAgIDsvL3N0b3JpbmcgYmFjayB0aGUgdXBkYXRlZCByb3cgcHJlZGljdGlvbiB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBTVFJIICAgICAgICAgICAgZGNSb3didWZDb2VmZixbcFByZWRCdWZSb3ddICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmluZyB0aGUgdXBkYXRlZCBEQyBSb3cgUHJlZGljdGlvbiBjb2VmZgotICAgICAgCi0gICAgICBCICAgICAgICAgICAgICAgRXhpdAotCi1Ib3Jpem9udGFsCi0KLSAgICAgIDsvLyBDYWxjdWxhdGluZyBUZW1wcHJlZAotCi0gICAgICAgICAgICAKLQotICAgICAgVkxEMSAgICAgICAgICAgIHtkUHJlZFJvd0J1ZjAsZFByZWRSb3dCdWYxfSxbcFByZWRCdWZDb2xdICAgICAgOy8vIExvYWRpbmcgcFByZWRCdWZDb2xbaV06aT0wIHQwIDcKLSAgICAgIFZNVUxMICAgICAgICAgICBxdGVtcDEsZFByZWRSb3dCdWYwLGRQcmVkUVAwICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wMVtpXT1wUHJlZEJ1ZkNvbFtpXSpkUHJlZFFQW2ldOiBpPTAgdDAgMwotICAgICAgVk1VTCAgICAgICAgICAgIHF0ZW1wUHJlZDEscXRlbXAxLHFDb2VmZlRhYiAgICAgICAgICAgICAgICAgICAgOy8vcXRlbXBQcmVkMVtpXT1wUHJlZEJ1ZkNvbFtpXSpkUHJlZFFQW2ldKjB4MWZmZmYvY3VyUVAgOiBpPTAgdDAgMwotICAgICAgCi0gICAgICBWTVVMTCAgICAgICAgICAgcXRlbXAxLGRQcmVkUm93QnVmMSxkUHJlZFFQMCAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcDFbaV09cFByZWRCdWZDb2xbaV0qZFByZWRRUFtpXSA6IGk9NCB0MCA3ICAgICAgCi0KLSAgICAgIFZSU0hSICAgICAgICAgICBxdGVtcFByZWQxLHF0ZW1wUHJlZDEsIzE3ICAgICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wUHJlZDFbaV09cm91bmQocFByZWRCdWZDb2xbaV0qZFByZWRRUFtpXS9jdXJRUCkgOiBpPTAgdDAgMwotICAgICAgVlNIUk4gICAgICAgICAgIGRQcmVkUVAxLHF0ZW1wUHJlZDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIG5hcnJvdyBxdGVtcFByZWQxW2ldIHRvIDE2IGJpdHMKLSAgICAgIAotICAgICAgCi0gICAgICBWTVVMICAgICAgICAgICAgcXRlbXBQcmVkMSxxdGVtcDEscUNvZWZmVGFiICAgICAgICAgICAgICAgICAgICA7Ly9xdGVtcFByZWQxW2ldPXBQcmVkQnVmQ29sW2ldKmRQcmVkUVBbaV0qMHgxZmZmZi9jdXJRUCA6IGk9NCB0MCA3Ci0gICAgICAKLSAgICAgIE1PViAgICAgICAgICAgICB0ZW1wcFByZWRDb2xCdWYscFByZWRCdWZDb2wKLSAgICAgIFZSU0hSICAgICAgICAgICBxdGVtcFByZWQxLHF0ZW1wUHJlZDEsIzE3ICAgICAgICAgICAgICAgICAgICAgIDsvL3F0ZW1wUHJlZDFbaV09cm91bmQocFByZWRCdWZDb2xbaV0qZFByZWRRUFtpXS9jdXJRUCkgIDogaT00IHQwIDcKLSAgICAgIFZMRDQgICAgICAgICAgICB7ZHRlbXAwLGR0ZW1wMSxkdGVtcDIsZHRlbXAzfSxbcFNyY0RzdF0gICAgICAgIDsvLyBMb2FkaW5nIGNvZWZmaWNpZW50cyBJbnRlcmxlYXZpbmcgYnkgNAotICAgICAgVlNIUk4gICAgICAgICAgIGR0ZW1wUHJlZDEscXRlbXBQcmVkMSwjMCAgICAgICAgICAgICAgICAgICAgICAgOy8vIG5hcnJvdyBxdGVtcFByZWQxW2ldIHRvIDE2IGJpdHMKLSAgICAgIFZNT1YgICAgICAgICAgICBkdGVtcFByZWQwLGRQcmVkUVAxCi0gICAgICAKLSAgICAgIDsvLyBVcGRhdGluZyBzb3VyY2UgYW5kIGNvbHVtbiBwcmVkaWN0aW9uIGJ1ZmZlciBjb250ZW50cyAgICAgCi0gICAgICBBREQgICAgICAgICAgICAgdGVtcDIscFNyY0RzdCwjMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBWTEQ0ICAgICAgICAgICAge2R0ZW1wNCxkdGVtcDUsZHRlbXA2LGR0ZW1wN30sW3RlbXAyXSAgICAgICAgICA7Ly8gTG9hZGluZyBuZXh0IDE2IGNvZWZmaWNpZW50cyBJbnRlcmxlYXZpbmcgYnkgNAotICAgICAgVlVaUCAgICAgICAgICAgIGR0ZW1wMCxkdGVtcDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEludGVybGVhdmluZyBieSA4Ci0gICAgICBWQUREICAgICAgICAgICAgZHRlbXAwLGR0ZW1wMCxkdGVtcFByZWQwICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQWRkaW5nIHRlbXBQcmVkIHRvIGNvZWZmcwotICAgICAgVlFTSEwgICAgICAgICAgIGR0ZW1wMCxkdGVtcDAsIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENsaXAgdG8gWy0yMDQ4LDIwNDddCi0gICAgICBWU0hSICAgICAgICAgICAgZHRlbXAwLGR0ZW1wMCwjNAotICAgICAgVlNUMSAgICAgICAgICAgIHtkdGVtcDB9LFtwUHJlZEJ1ZkNvbF0hICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFVwZGF0aW5nIFByaWRpY3Rpb24gY29sdW1uIGJ1ZmZlcgotICAgICAgVlpJUCAgICAgICAgICAgIGR0ZW1wMCxkdGVtcDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRlaW50ZXJsZWF2aW5nCi0gICAgICBWU1Q0ICAgICAgICAgICAge2R0ZW1wMCxkdGVtcDEsZHRlbXAyLGR0ZW1wM30sW3BTcmNEc3RdICAgICAgICA7Ly8gVXBkYXRpbmcgc291cmNlIGNvZWZmcyAgICAgICAgIAotICAgICAgVlNUNCAgICAgICAgICAgIHtkdGVtcDQsZHRlbXA1LGR0ZW1wNixkdGVtcDd9LFt0ZW1wMl0hCi0gICAgICAKLSAgICAgIE1PViAgICAgICAgICAgICB0ZW1wMSx0ZW1wMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIFZMRDQgICAgICAgICAgICB7ZHRlbXAwLGR0ZW1wMSxkdGVtcDIsZHRlbXAzfSxbdGVtcDJdISAgICAgICAgIDsvLyBMb2FkaW5nICBjb2VmZmljaWVudHMgSW50ZXJsZWF2aW5nIGJ5IDQKLSAgICAgIAotICAgICAgVkxENCAgICAgICAgICAgIHtkdGVtcDQsZHRlbXA1LGR0ZW1wNixkdGVtcDd9LFt0ZW1wMl0KLSAgICAgIFZVWlAgICAgICAgICAgICBkdGVtcDAsZHRlbXA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbnRlcmxlYXZpbmcgYnkgOAotICAgICAgVkFERCAgICAgICAgICAgIGR0ZW1wMCxkdGVtcDAsZHRlbXBQcmVkMQotICAgICAgVlFTSEwgICAgICAgICAgIGR0ZW1wMCxkdGVtcDAsIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENsaXAgdG8gWy0yMDQ4LDIwNDddCi0gICAgICBWU0hSICAgICAgICAgICAgZHRlbXAwLGR0ZW1wMCwjNAotICAgICAgVlNUMSAgICAgICAgICAgIHtkdGVtcDB9LFtwUHJlZEJ1ZkNvbF0hCi0gICAgICBWWklQICAgICAgICAgICAgZHRlbXAwLGR0ZW1wNAotICAgICAgVlNUNCAgICAgICAgICAgIHtkdGVtcDAsZHRlbXAxLGR0ZW1wMixkdGVtcDN9LFt0ZW1wMV0KLSAgICAgIFNUUkggICAgICAgICAgICBkY0NvbEJ1ZmZDb2VmZixbdGVtcHBQcmVkQ29sQnVmXSAKLSAgICAgIFZTVDQgICAgICAgICAgICB7ZHRlbXA0LGR0ZW1wNSxkdGVtcDYsZHRlbXA3fSxbdGVtcDJdCi0gICAgICAKLUV4aXQKLQotICAgICAgU1RSSCAgICAgICAgICAgIHRlbXAsW3BTcmNEc3RdCi0gICAgICAgICAgCi0gCi0gICAgICBNT1YgICAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyIAotIAotICAgICAgTV9FTkQKLSAgICAgIEVORElGCi0KLQotICAgICAgIEVORAotCi0KLSAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDQ1NzFmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucworKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8qKgotOyAqIAotOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zCi07ICogT3Blbk1BWCBETDogdjEuMC4yCi07ICogUmV2aXNpb246ICAgMTIyOTAKLTsgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsgKiAKLTsgKiAKLTsgKiAKLTsgKgotOyAqIERlc2NyaXB0aW9uOiAKLTsgKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRlciByZWNvbnN0cnVjdGlvbgotOyAqIAotOyAqCi07ICoKLTsgKgotOyAqCi07ICogRnVuY3Rpb246IG9teFZDTTRQMl9RdWFudEludkludGVyX0kKLTsgKgotOyAqIERlc2NyaXB0aW9uOgotOyAqIFBlcmZvcm1zIGludmVyc2UgcXVhbnRpemF0aW9uIG9uIGludHJhL2ludGVyIGNvZGVkIGJsb2NrLgotOyAqIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgYml0c19wZXJfcGl4ZWwgPSA4LiBNaXNtYXRjaCBjb250cm9sCi07ICogaXMgcGVyZm9ybWVkIGZvciB0aGUgZmlyc3QgTVBFRy00IG1vZGUgaW52ZXJzZSBxdWFudGl6YXRpb24gbWV0aG9kLgotOyAqIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBjbGlwcGVkIHRvIHRoZSByYW5nZTogWy0yMDQ4LCAyMDQ3XS4KLTsgKiBNaXNtYXRjaCBjb250cm9sIGlzIHBlcmZvcm1lZCBmb3IgdGhlIGZpcnN0IGludmVyc2UgcXVhbnRpemF0aW9uIG1ldGhvZC4KLTsgKgotOyAqIFJlbWFya3M6Ci07ICoKLTsgKiBQYXJhbWV0ZXJzOgotOyAqIFtpbl0gcFNyY0RzdCAgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCAocXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuCi07ICogW2luXSBRUCAgICAgICAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpc2VyX3NjYWxlKQotOyAqIFtpbl0gdmlkZW9Db21wICAgICAgKEludHJhIHZlcnNpb24gb25seS4pIFZpZGVvIGNvbXBvbmVudCB0eXBlIG9mIHRoZQotOyAqICAgICAgICAgICAgICAgICAgY3VycmVudCBibG9jay4gVGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3M6Ci07ICogICAgICAgICAgICAgICAgICBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UsCi07ICogICAgICAgICAgICAgICAgICBPTVhfVkNfQUxQSEEuCi07ICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGEgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKLTsgKiAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLAotOyAqICAgICAgICAgICAgICAgICAgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub25saW5lYXIgaW50cmEgREMgbW9kZS4KLTsgKiBbb3V0XSAgICBwU3JjRHN0ICAgICAgcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2suICBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4KLTsgKgotOyAqIFJldHVybiBWYWx1ZToKLTsgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKLTsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKLTsgKiAgICAtIElmIHBTcmNEc3QgaXMgTlVMTCBvciBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLgotOyAqICAgICAgb3IKLTsgKiAgICAtIElmIFFQIDw9IDAuCi07ICogICAgICBvcgotOyAqICAgIC0gdmlkZW9Db21wIGlzIG5vbmUgb2YgT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIGFuZCBPTVhfVkNfQUxQSEEuCi07ICoKLTsgKi8KLQotICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLQotICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotCi0gICAgIElGIENvcnRleEE4Ci0gICAgIAotICAgICAKLTsvL0lucHV0IEFyZ3VtZW50cwotcFNyY0RzdCAgICAgICAgICAgIFJOIDAKLVFQICAgICAgICAgICAgICAgICBSTiAxCi0gICAgIAotCi07Ly9Mb2NhbCBWYXJpYWJsZXMKLUNvdW50ICAgICAgICAgICAgICBSTiAzCi1kb3VibGVRUCAgICAgICAgICAgUk4gNAotUmV0dXJuICAgICAgICAgICAgIFJOIDAKLTsvLyBOZW9uIHJlZ2lzdGVycwotCi0KLWRRUDEwICAgICAgICAgICAgICBETiBEMC5TMzJbMF0KLXFRUDEgICAgICAgICAgICAgICBRTiBRMC5TMzIKLQotZFFQMSAgICAgICAgICAgICAgIEROIEQwLlMxNgotZE1pbnVzUVAxICAgICAgICAgIEROIEQxLlMxNgotCi1kQ29lZmYwICAgICAgICAgICAgRE4gRDIuUzE2Ci1kQ29lZmYxICAgICAgICAgICAgRE4gRDMuUzE2ICAgCi0KLXFSZXN1bHQwICAgICAgICAgICBRTiBRMy5TMzIKLWRSZXN1bHQwICAgICAgICAgICBETiBENy5TMTYKLXFTaWduMCAgICAgICAgICAgICBRTiBRMy5TMzIKLWRTaWduMCAgICAgICAgICAgICBETiBENi5TMTYKLQotcVJlc3VsdDEgICAgICAgICAgIFFOIFE0LlMzMgotZFJlc3VsdDEgICAgICAgICAgIEROIEQ4LlMxNgotcVNpZ24xICAgICAgICAgICAgIFFOIFE0LlMzMgotZFNpZ24xICAgICAgICAgICAgIEROIEQ4LlMxNgotCi1kMlFQMCAgICAgICAgICAgICAgRE4gRDEwLlMzMlswXQotcTJRUDAgICAgICAgICAgICAgIFFOIFE1LlMzMgotZDJRUCAgICAgICAgICAgICAgIEROIEQxMC5TMTYKLQotZFplcm8wICAgICAgICAgICAgIEROIEQxMS5TMTYKLWRaZXJvMSAgICAgICAgICAgICBETiBEMTIuUzE2Ci1kQ29uc3QwICAgICAgICAgICAgRE4gRDEzLlMxNgotCi0gICAgCi0gICAgIE1fU1RBUlQgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSxyNCxkMTMKLSAgICAgCi0gICAgICAgICAKLSAgICAgICAgIAotICAgICAgICAgQUREICAgICAgZG91YmxlUVAsUVAsUVAgICAgICAgICAgICAgICAgICAgOy8vIGRvdWJsZVFQPSAyKlFQCi0gICAgICAgICBWTU9WICAgICBkMlFQMCxkb3VibGVRUAotICAgICAgICAgVkRVUCAgICAgcTJRUDAsZDJRUDAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1vdmUgZG91YmxlUVAgaW4gdG8gYSBzY2FsYXIKLSAgICAgICAgIFRTVCAgICAgIFFQLCMxICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgVkxEMSAgICAge2RDb2VmZjAsZENvZWZmMX0sW3BTcmNEc3RdICAgICAgOy8vIExvYWQgZmlyc3QgOCB2YWx1ZXMgdG8gQ29lZmYwLENvZWZmMQotICAgICAgICAgU1VCRVEgICAgUVAsUVAsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICBWTU9WICAgICBkUVAxMCxRUCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgUVAgaXMgZXZlbiB0aGVuIFFQMT1RUC0xIGVsc2UgUVAxPVFQICAgICAKLSAgICAgICAgIE1PViAgICAgIENvdW50LCM2NAotICAgICAgICAgVkRVUCAgICAgcVFQMSxkUVAxMCAgICAgICAgICAgICAgICAgICAgICAgOy8vIER1cGxpY2F0ZSB0ZW1wUmVzdWx0IHdpdGggUVAxCi0gICAgICAgICBWU0hSTiAgICBkMlFQLHEyUVAwLCMwCi0gICAgICAgICBWRU9SICAgICBkQ29uc3QwLGRDb25zdDAsZENvbnN0MAotICAgICAgICAgVlNIUk4gICAgZFFQMSxxUVAxLCMwICAgICAgICAgICAgICAgICAgICAgOy8vIFFQMSB0cnVuY2F0ZWQgdG8gMTYgYml0cwotICAgICAgICAgVlNVQiAgICAgZE1pbnVzUVAxLGRDb25zdDAsZFFQMSAgICAgICAgICAgOy8vIGRNaW51c1FQMT0tUVAxCi0KLUxvb3AgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgCi0gICAgICAgIDsvL1BlcmZvcm1pbmcgSW52ZXJzZSBRdWFudGl6YXRpb24KLSAgICAgICAgIAotICAgICAgICAgVkNMVCAgICAgZFNpZ24wLGRDb2VmZjAsICMwICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgQ29lZmZpY2llbnQgMCBhZ2FpbnN0IDAKLSAgICAgICAgIFZDTFQgICAgIGRTaWduMSxkQ29lZmYxLCAjMCAgICAgICAgICAgICAgIDsvLyBDb21wYXJlIENvZWZmaWNpZW50IDEgYWdhaW5zdCAwCi0gICAgICAgICBWQ0VRICAgICBkWmVybzAsZENvZWZmMCwjMCAgICAgICAgICAgICAgICA7Ly8gQ29tcGFyZSBDb2VmZmljaWVudCAwIGFnYWluc3QgemVybwotICAgICAgICAgVkJTTCAgICAgZFNpZ24wLGRNaW51c1FQMSxkUVAxICAgICAgICAgICAgOy8vIGRTaWduMCA9IC1RUDEgaWYgQ29lZmYwPCAwIGVsc2UgUVAxCi0gICAgICAgICBWQ0VRICAgICBkWmVybzEsZENvZWZmMSwjMCAgICAgICAgICAgICAgICA7Ly8gQ29tcGFyZSBDb2VmZmljaWVudCAxIGFnYWluc3QgemVybwotICAgICAgICAgVkJTTCAgICAgZFNpZ24xLGRNaW51c1FQMSxkUVAxICAgICAgICAgICAgOy8vIGRTaWduMSA9IC1RUDEgaWYgQ29lZmYxPCAwIGVsc2UgUVAxCi0gICAgICAgICBWTU9WTCAgICBxU2lnbjAsZFNpZ24wICAgICAgICAgICAgICAgICAgICA7Ly8gU2lnbiBleHRlbmQgcVNpZ24wIHRvIDMyIGJpdHMKLSAgICAgICAgIFZNT1ZMICAgIHFTaWduMSxkU2lnbjEKLSAgICAgICAgIFZNTEFMICAgIHFSZXN1bHQwLGRDb2VmZjAsZDJRUCAgICAgICAgICAgIDsvLyBxUmVzdWx0MFtpXT0gcUNvZWZmMFtpXStxQ29lZmYwW2ldKigtMikgaWYgQ29lZmYgPDAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcVJlc3VsdDBbaV09IHFDb2VmZjBbaV0gICAgICAgICAgICAgICAgIGlmIENvZWZmID49MCAKLSAgICAgICAgIFZNTEFMICAgIHFSZXN1bHQxLGRDb2VmZjEsZDJRUCAgICAgICAgICAgIDsvLyBxUmVzdWx0MVtpXT0gcUNvZWZmMVtpXStxQ29lZmYxW2ldKigtMikgaWYgQ29lZmYgPDAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcVJlc3VsdDFbaV09IHFDb2VmZjFbaV0gICAgICAgICAgICAgICAgIGlmIENvZWZmID49MCAKLSAgICAgICAgIDsvLyBDbGlwIFJlc3VsdCB0byBbLTIwNDgsMjA0N10gICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgIAotICAgICAgICAgVlFTSEwgICAgcVJlc3VsdDAscVJlc3VsdDAsIzIwICAgICAgICAgICAgOy8vIGNsaXAgdG8gWy0yMDQ4LDIwNDddCi0gICAgICAgICBWUVNITCAgICBxUmVzdWx0MSxxUmVzdWx0MSwjMjAKLSAgICAgICAgICAgICAgICAgCi0gICAgICAgICBWU0hSICAgICBxUmVzdWx0MCxxUmVzdWx0MCwjNCAgCi0gICAgICAgICBWU0hSICAgICBxUmVzdWx0MSxxUmVzdWx0MSwjNAotICAgICAgICAgVlNIUk4gICAgZFJlc3VsdDAscVJlc3VsdDAsIzE2ICAgICAgICAgICAgOy8vIE5hcnJvdyB0aGUgY2xpcHBlZCBWYWx1ZSB0byBIYWxmd29yZAotICAgICAgICAgVlNIUk4gICAgZFJlc3VsdDEscVJlc3VsdDEsIzE2IAotICAgICAgICAgVkJJVCAgICAgZFJlc3VsdDAsZENvbnN0MCxkWmVybzAgIAotICAgICAgICAgVkJJVCAgICAgZFJlc3VsdDEsZENvbnN0MCxkWmVybzEgICAgIAotICAgICAgICAgCi0gICAgICAgICBWU1QxICAgICB7ZFJlc3VsdDAsZFJlc3VsdDF9LFtwU3JjRHN0XSEgICA7Ly8gU3RvcmUgdGhlIHJlc3VsdAotICAgICAgICAgU1VCUyAgICAgQ291bnQsQ291bnQsIzgKLSAgICAgICAgIFZMRDEgICAgIHtkQ29lZmYwLGRDb2VmZjF9LFtwU3JjRHN0XQotICAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgIEJHVCAgICAgIExvb3AKLQotICAgICAgICAgTU9WICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCi0KLQotICAgICAgICAgTV9FTkQKLSAgICAgICAgIEVORElGCi0gICAgICAgICAKLQotICAgICAgICBFTkQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWE3ZmQ0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucworKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi07Ly8KLTsvLyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotOy8vCi07Ly8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07Ly8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOy8vCi07Ly8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsvLwotOy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsvLwotOy8qKgotOyAqIAotOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zCi07ICogT3Blbk1BWCBETDogdjEuMC4yCi07ICogUmV2aXNpb246ICAgMTIyOTAKLTsgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKLTsgKiAKLTsgKiAKLTsgKiAKLTsgKgotOyAqIERlc2NyaXB0aW9uOiAKLTsgKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRlciByZWNvbnN0cnVjdGlvbgotOyAqIAotOyAqCi07ICoKLTsgKgotOyAqCi07ICogCi07ICogRnVuY3Rpb246IG9teFZDTTRQMl9RdWFudEludkludHJhX0kKLTsgKgotOyAqIERlc2NyaXB0aW9uOgotOyAqIFBlcmZvcm1zIGludmVyc2UgcXVhbnRpemF0aW9uIG9uIGludHJhL2ludGVyIGNvZGVkIGJsb2NrLgotOyAqIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgYml0c19wZXJfcGl4ZWwgPSA4LiBNaXNtYXRjaCBjb250cm9sCi07ICogaXMgcGVyZm9ybWVkIGZvciB0aGUgZmlyc3QgTVBFRy00IG1vZGUgaW52ZXJzZSBxdWFudGl6YXRpb24gbWV0aG9kLgotOyAqIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBjbGlwcGVkIHRvIHRoZSByYW5nZTogWy0yMDQ4LCAyMDQ3XS4KLTsgKiBNaXNtYXRjaCBjb250cm9sIGlzIHBlcmZvcm1lZCBmb3IgdGhlIGZpcnN0IGludmVyc2UgcXVhbnRpemF0aW9uIG1ldGhvZC4KLTsgKgotOyAqIFJlbWFya3M6Ci07ICoKLTsgKiBQYXJhbWV0ZXJzOgotOyAqIFtpbl0gICAgcFNyY0RzdCAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgKHF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2suIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgotOyAqIFtpbl0gICAgUVAgICAgICAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGlzZXJfc2NhbGUpCi07ICogW2luXSAgICB2aWRlb0NvbXAgICAgICAgICAgKEludHJhIHZlcnNpb24gb25seS4pIFZpZGVvIGNvbXBvbmVudCB0eXBlIG9mIHRoZQotOyAqICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJsb2NrLiBUYWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBmbGFnczoKLTsgKiAgICAgICAgICAgICAgICAgICAgT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFLAotOyAqICAgICAgICAgICAgICAgICAgICBPTVhfVkNfQUxQSEEuCi07ICogW2luXSAgICBzaG9ydFZpZGVvSGVhZGVyICBhIGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7Ci07ICogICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsCi07ICogICAgICAgICAgICAgICAgICAgIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9ubGluZWFyIGludHJhIERDIG1vZGUuCi07ICogW291dF0gICAgcFNyY0RzdCAgICAgICAgcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2suICBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4KLTsgKgotOyAqIFJldHVybiBWYWx1ZToKLTsgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKLTsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKLTsgKiAgICAtICAgIElmIHBTcmNEc3QgaXMgTlVMTCBvciBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLgotOyAqICAgICAgb3IKLTsgKiAgICAtIElmIFFQIDw9IDAuCi07ICogICAgICBvcgotOyAqICAgIC0gdmlkZW9Db21wIGlzIG5vbmUgb2YgT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIGFuZCBPTVhfVkNfQUxQSEEuCi07ICoKLSAKLQotICAgSU5DTFVERSBvbXh0eXBlc19zLmgKLSAgIElOQ0xVREUgYXJtQ09NTV9zLmgKLSAgIAotICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAotICAgCi0gICAKLSAgIElNUE9SVCAgICAgICAgYXJtVkNNNFAyX0RDU2NhbGVyCi0gCi0gICAgIElGIENvcnRleEE4Ci0gICAgIAotICAgICAKLTsvL0lucHV0IEFyZ3VtZW50cwotcFNyY0RzdCAgICAgICAgICAgIFJOIDAKLVFQICAgICAgICAgICAgICAgICBSTiAxCi12aWRlb0NvbXAgICAgICAgICAgUk4gMgotc2hvcnRWaWRlb0hlYWRlciAgIFJOIDMKLSAgICAgCi0KLTsvL0xvY2FsIFZhcmlhYmxlcwotCi1kY1NjYWxlciAgICAgICAgICAgUk4gNAotdGVtcCAgICAgICAgICAgICAgIFJOIDE0Ci1pbmRleCAgICAgICAgICAgICAgUk4gNQotCi0KLUNvdW50ICAgICAgICAgICAgICBSTiA1Ci1kb3VibGVRUCAgICAgICAgICAgUk4gNAotUmV0dXJuICAgICAgICAgICAgIFJOIDAKLQotCi07Ly8gTmVvbiByZWdpc3RlcnMKLQotCi1kUVAxMCAgICAgICAgICAgICAgRE4gRDAuUzMyWzBdCi1xUVAxICAgICAgICAgICAgICAgUU4gUTAuUzMyCi0KLWRRUDEgICAgICAgICAgICAgICBETiBEMC5TMTYKLWRNaW51c1FQMSAgICAgICAgICBETiBEMS5TMTYKLQotZENvZWZmMCAgICAgICAgICAgIEROIEQyLlMxNgotZENvZWZmMSAgICAgICAgICAgIEROIEQzLlMxNiAgIAotCi1xUmVzdWx0MCAgICAgICAgICAgUU4gUTMuUzMyCi1kUmVzdWx0MCAgICAgICAgICAgRE4gRDcuUzE2Ci1xU2lnbjAgICAgICAgICAgICAgUU4gUTMuUzMyCi1kU2lnbjAgICAgICAgICAgICAgRE4gRDYuUzE2Ci0KLXFSZXN1bHQxICAgICAgICAgICBRTiBRNC5TMzIKLWRSZXN1bHQxICAgICAgICAgICBETiBEOC5TMTYKLXFTaWduMSAgICAgICAgICAgICBRTiBRNC5TMzIKLWRTaWduMSAgICAgICAgICAgICBETiBEOC5TMTYKLQotZDJRUDAgICAgICAgICAgICAgIEROIEQxMC5TMzJbMF0KLXEyUVAwICAgICAgICAgICAgICBRTiBRNS5TMzIKLWQyUVAgICAgICAgICAgICAgICBETiBEMTAuUzE2Ci0KLWRaZXJvMCAgICAgICAgICAgICBETiBEMTEuUzE2Ci1kWmVybzEgICAgICAgICAgICAgRE4gRDQuUzE2Ci1kQ29uc3QwICAgICAgICAgICAgRE4gRDUuUzE2Ci0KLQotCi0KLSAgICAgCi0gICAgIAotICAgICBNX1NUQVJUIG9teFZDTTRQMl9RdWFudEludkludHJhX0kscjUsZDExCi0KLQotICAgICAgICA7Ly8gUGVyZm9ybSBJbnZlcnNlIFF1YW50aXphdGlvbiBmb3IgREMgY29lZmZpY2llbnQKLQotICAgICAgICBURVEgICAgICAgc2hvcnRWaWRlb0hlYWRlciwjMCAgICAgIDsvLyBUZXN0IGlmIHNob3J0IFZpZGVvIEhlYWRlciBmbGFnID0wICAgICAgICAgICAgIAotICAgICAgICBNT1ZORSAgICAgZGNTY2FsZXIsIzggICAgICAgICAgICAgIDsvLyBpZiBzaG9ydFZpZGVvSGVhZGVyIGlzIG5vbiB6ZXJvIGRjU2NhbGVyPTgKLSAgICAgICAgQk5FICAgICAgIGNhbERDVmFsCi0gICAgICAgIAotICAgICAgICBMRFIgICAgICAgaW5kZXgsID1hcm1WQ000UDJfRENTY2FsZXIKLSAgICAgIEFERCAgICAgICBpbmRleCxpbmRleCx2aWRlb0NvbXAsTFNMICM1Ci0gICAgICBMRFJCICAgICAgZGNTY2FsZXIsW2luZGV4LFFQXQotCi0gICAgICAgIDsvL01fQ2FsRENTY2FsYXIgIHNob3J0VmlkZW9IZWFkZXIsdmlkZW9Db21wLCBRUAotCi1jYWxEQ1ZhbAotCi0gICAgICAgIExEUkggICAgIHRlbXAsW3BTcmNEc3RdCi0gICAgICAgIFNNVUxCQiAgIHRlbXAsdGVtcCxkY1NjYWxlciAgICAgICA7Ly8gZGNDb2VmZiA9IGRjU2NhbGVyICogUXVhbnRpemVkIERDIGNvZWZmaWNpZW50KGZyb20gbWVtb3J5KQotICAgICAgICBTU0FUICAgICB0ZW1wLCMxMix0ZW1wICAgICAgICAgICAgOy8vIFNhdHVyYXRpbmcgdG8gMTIgYml0cwotICAgICAgCi0KLQotICAgICAgICA7Ly8gUGVyZm9ybSBJbnZlcnNlIFF1YW50aXphdGlvbiBmb3IgQWMgQ29lZmZpY2llbnRzCi0gICAgIAotICAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgIEFERCAgICAgIGRvdWJsZVFQLFFQLFFQICAgICAgICAgICAgICAgICAgIDsvLyBkb3VibGVRUD0gMipRUAotICAgICAgICAgVk1PViAgICAgZDJRUDAsZG91YmxlUVAKLSAgICAgICAgIFZEVVAgICAgIHEyUVAwLGQyUVAwICAgICAgICAgICAgICAgICAgICAgIDsvLyBNb3ZlIGRvdWJsZVFQIGluIHRvIGEgc2NhbGFyCi0gICAgICAgICBUU1QgICAgICBRUCwjMSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgIFZMRDEgICAgIHtkQ29lZmYwLGRDb2VmZjF9LFtwU3JjRHN0XSAgICAgIDsvLyBMb2FkIGZpcnN0IDggdmFsdWVzIHRvIENvZWZmMCxDb2VmZjEKLSAgICAgICAgIFNVQkVRICAgIFFQLFFQLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgVk1PViAgICAgZFFQMTAsUVAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIFFQIGlzIGV2ZW4gdGhlbiBRUDE9UVAtMSBlbHNlIFFQMT1RUCAgICAgCi0gICAgICAgICBNT1YgICAgICBDb3VudCwjNjQKLSAgICAgICAgIFZEVVAgICAgIHFRUDEsZFFQMTAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBEdXBsaWNhdGUgdGVtcFJlc3VsdCB3aXRoIFFQMQotICAgICAgICAgVlNIUk4gICAgZDJRUCxxMlFQMCwjMAotICAgICAgICAgVkVPUiAgICAgZENvbnN0MCxkQ29uc3QwLGRDb25zdDAKLSAgICAgICAgIFZTSFJOICAgIGRRUDEscVFQMSwjMCAgICAgICAgICAgICAgICAgICAgIDsvLyBRUDEgdHJ1bmNhdGVkIHRvIDE2IGJpdHMKLSAgICAgICAgIFZTVUIgICAgIGRNaW51c1FQMSxkQ29uc3QwLGRRUDEgICAgICAgICAgIDsvLyBkTWludXNRUDE9LVFQMQotCi1Mb29wICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgIAotICAgICAgICA7Ly9QZXJmb3JtaW5nIEludmVyc2UgUXVhbnRpemF0aW9uCi0gICAgICAgICAKLSAgICAgICAgIFZDTFQgICAgIGRTaWduMCxkQ29lZmYwLCAjMCAgICAgICAgICAgICAgIDsvLyBDb21wYXJlIENvZWZmaWNpZW50IDAgYWdhaW5zdCAwCi0gICAgICAgICBWQ0xUICAgICBkU2lnbjEsZENvZWZmMSwgIzAgICAgICAgICAgICAgICA7Ly8gQ29tcGFyZSBDb2VmZmljaWVudCAxIGFnYWluc3QgMAotICAgICAgICAgVkNFUSAgICAgZFplcm8wLGRDb2VmZjAsIzAgICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgQ29lZmZpY2llbnQgMCBhZ2FpbnN0IHplcm8KLSAgICAgICAgIFZCU0wgICAgIGRTaWduMCxkTWludXNRUDEsZFFQMSAgICAgICAgICAgIDsvLyBkU2lnbjAgPSAtUVAxIGlmIENvZWZmMDwgMCBlbHNlIFFQMQotICAgICAgICAgVkNFUSAgICAgZFplcm8xLGRDb2VmZjEsIzAgICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgQ29lZmZpY2llbnQgMSBhZ2FpbnN0IHplcm8KLSAgICAgICAgIFZCU0wgICAgIGRTaWduMSxkTWludXNRUDEsZFFQMSAgICAgICAgICAgIDsvLyBkU2lnbjEgPSAtUVAxIGlmIENvZWZmMTwgMCBlbHNlIFFQMQotICAgICAgICAgVk1PVkwgICAgcVNpZ24wLGRTaWduMCAgICAgICAgICAgICAgICAgICAgOy8vIFNpZ24gZXh0ZW5kIHFTaWduMCB0byAzMiBiaXRzCi0gICAgICAgICBWTU9WTCAgICBxU2lnbjEsZFNpZ24xCi0gICAgICAgICBWTUxBTCAgICBxUmVzdWx0MCxkQ29lZmYwLGQyUVAgICAgICAgICAgICA7Ly8gcVJlc3VsdDBbaV09IHFDb2VmZjBbaV0rcUNvZWZmMFtpXSooLTIpIGlmIENvZWZmIDwwIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHFSZXN1bHQwW2ldPSBxQ29lZmYwW2ldICAgICAgICAgICAgICAgICBpZiBDb2VmZiA+PTAgCi0gICAgICAgICBWTUxBTCAgICBxUmVzdWx0MSxkQ29lZmYxLGQyUVAgICAgICAgICAgICA7Ly8gcVJlc3VsdDFbaV09IHFDb2VmZjFbaV0rcUNvZWZmMVtpXSooLTIpIGlmIENvZWZmIDwwIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHFSZXN1bHQxW2ldPSBxQ29lZmYxW2ldICAgICAgICAgICAgICAgICBpZiBDb2VmZiA+PTAgCi0gICAgICAgICA7Ly8gQ2xpcCBSZXN1bHQgdG8gWy0yMDQ4LDIwNDddICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgIFZRU0hMICAgIHFSZXN1bHQwLHFSZXN1bHQwLCMyMCAgICAgICAgICAgIDsvLyBjbGlwIHRvIFstMjA0OCwyMDQ3XQotICAgICAgICAgVlFTSEwgICAgcVJlc3VsdDEscVJlc3VsdDEsIzIwCi0gICAgICAgICAgICAgICAgIAotICAgICAgICAgVlNIUiAgICAgcVJlc3VsdDAscVJlc3VsdDAsIzQgIAotICAgICAgICAgVlNIUiAgICAgcVJlc3VsdDEscVJlc3VsdDEsIzQKLSAgICAgICAgIFZTSFJOICAgIGRSZXN1bHQwLHFSZXN1bHQwLCMxNiAgICAgICAgICAgIDsvLyBOYXJyb3cgdGhlIGNsaXBwZWQgVmFsdWUgdG8gSGFsZndvcmQKLSAgICAgICAgIFZTSFJOICAgIGRSZXN1bHQxLHFSZXN1bHQxLCMxNiAKLSAgICAgICAgIFZCSVQgICAgIGRSZXN1bHQwLGRDb25zdDAsZFplcm8wICAKLSAgICAgICAgIFZCSVQgICAgIGRSZXN1bHQxLGRDb25zdDAsZFplcm8xICAgICAKLSAgICAgICAgIAotICAgICAgICAgVlNUMSAgICAge2RSZXN1bHQwLGRSZXN1bHQxfSxbcFNyY0RzdF0hICAgOy8vIFN0b3JlIHRoZSByZXN1bHQKLSAgICAgICAgIFNVQlMgICAgIENvdW50LENvdW50LCM4Ci0gICAgICAgICBWTEQxICAgICB7ZENvZWZmMCxkQ29lZmYxfSxbcFNyY0RzdF0KLSAgICAgICAgIAotICAgICAgICAgCi0gICAgICAgICBCR1QgICAgICBMb29wCi0gICAgICAgICAKLSAgICAgICAgIFNVQiAgICAgIHBTcmNEc3QscFNyY0RzdCwjMTI4Ci0gICAgICAgICAKLSAgICAgICAgIDsvLyBTdG9yZSB0aGUgSW52ZXJzZSBxdWFudGl6ZWQgRGMgY29lZmZpY2llbnQKLSAgICAgICAgIAotICAgICAgICAgU1RSSCAgICAgdGVtcCxbcFNyY0RzdF0sIzIKLSAgICAgICAgCi0gICAgICAgICBNT1YgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKLSAgICAgICAgIAotCi0KLSAgICAgICAgIE1fRU5ECi0gICAgICAgICBFTkRJRgotICAgICAgICAgCi0KLSAgICAgICAgRU5ECi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOTM2ODEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybUNPTU1fVmVyc2lvbi5oIgotCi0jaWZkZWYgQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMKLWNvbnN0IGNoYXIgKiBjb25zdCBvbXhWQ19WZXJzaW9uRGVzY3JpcHRpb24gPSAiQVJNIE9wZW5NQVggREwgdiIgQVJNX1ZFUlNJT05fU1RSSU5HICIgICBSZWw9IiBPTVhfQVJNX1JFTEVBU0VfVEFHICIgICBBcmNoPSIgT01YX0FSTV9CVUlMRF9BUkNISVRFQ1RVUkUgIiAgIFRvb2xzPSIgIE9NWF9BUk1fQlVJTERfVE9PTENIQUlOIDsKLSNlbmRpZiAvKiBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9BUk1fREVMSVZFUlkuVFhUIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9BUk1fREVMSVZFUlkuVFhUCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODAxZjNkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvQVJNX0RFTElWRVJZLlRYVAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLVRoZSBjb250ZW50cyBvZiB0aGlzIHRyYW5zYWN0aW9uIHdhcyBjcmVhdGVkIGJ5IEhlZGxleSBGcmFuY2lzCi1vZiBBUk0gb24gMTktRmViLTIwMDguCi0KLUl0IGNvbnRhaW5zIHRoZSBBUk0gZGF0YSB2ZXJzaW9ucyBsaXN0ZWQgYmVsb3cuCi0KLVRoaXMgZGF0YSwgdW5sZXNzIG90aGVyd2lzZSBzdGF0ZWQsIGlzIEFSTSBQcm9wcmlldGFyeSBhbmQgYWNjZXNzIHRvIGl0Ci1pcyBzdWJqZWN0IHRvIHRoZSBhZ3JlZW1lbnRzIGluZGljYXRlZCBiZWxvdy4KLQotSWYgeW91IGV4cGVyaWVuY2UgcHJvYmxlbXMgd2l0aCB0aGlzIGRhdGEsIHBsZWFzZSBjb250YWN0IEFSTSBzdXBwb3J0Ci1xdW90aW5nIHRyYW5zYWN0aW9uIHJlZmVyZW5jZSA8OTc0MTI+LgotCi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi0KLS0gT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEKLSAgVmlkZW8gY29kZWNzIC0gc2FtcGxlIGNvZGUKLSAgU2FtcGxlIGNvZGUgcmVsZWFzZSBmb3IgSGFudHJvIChWZXIgMS4wLjIpCi0gIGludGVybmFsIGFjY2VzcwotCi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCi0KLVRoaXMgdHJhbnNhY3Rpb24gY29udGFpbnMgZGVsaXZlcmFibGVzIHdoaWNoIGFyZSBkZXNpZ25hdGVkIGFzIGJlaW5nIG9mCi1iZXRhIHJlbGVhc2Ugc3RhdHVzIChCRVQpLgotCi1CZXRhIHJlbGVhc2Ugc3RhdHVzIGhhcyBhIHBhcnRpY3VsYXIgbWVhbmluZyB0byBBUk0gb2Ygd2hpY2ggdGhlIHJlY2lwaWVudAotbXVzdCBiZSBhd2FyZS4gQmV0YSBpcyBhIHByZS1yZWxlYXNlIHN0YXR1cyBpbmRpY2F0aW5nIHRoYXQgdGhlIGRlbGl2ZXJhYmxlCi1zbyBkZXNjcmliZWQgaXMgYmVsaWV2ZWQgdG8gcm9idXN0bHkgZGVtb25zdHJhdGUgc3BlY2lmaWVkIGJlaGF2aW91ciwgdG8gYmUKLWNvbnNpc3RlbnQgYWNyb3NzIGl0cyBpbmNsdWRlZCBhc3BlY3RzIGFuZCBiZSByZWFkeSBmb3IgZ2VuZXJhbCBkZXBsb3ltZW50LgotQnV0IEJldGEgYWxzbyBpbmRpY2F0ZXMgdGhhdCBwcmUtcmVsZWFzZSByZWxpYWJpbGl0eSB0cmlhbHMgYXJlIG9uZ29pbmcgYW5kCi10aGF0IGl0IGlzIHBvc3NpYmxlIHJlc2lkdWFsIGRlZmVjdHMgb3IgZXJyb3JzIGluIG9wZXJhdGlvbiwgY29uc2lzdGVuY3kKLWFuZCBkb2N1bWVudGF0aW9uIG1heSBzdGlsbCBiZSBlbmNvdW50ZXJlZC4gVGhlIHJlY2lwaWVudCBzaG91bGQgY29uc2lkZXIKLXRoaXMgcG9zaXRpb24gd2hlbiB1c2luZyB0aGlzIEJldGEgbWF0ZXJpYWwgc3VwcGxpZWQuIEFSTSB3aWxsIG5vcm1hbGx5Ci1hdHRlbXB0IHRvIHByb3ZpZGUgZml4ZXMgb3IgYSB3b3JrLWFyb3VuZCBmb3IgZGVmZWN0cyBpZGVudGlmaWVkIGJ5IHRoZQotcmVjaXBpZW50LCBidXQgdGhlIHByb3Zpc2lvbiBvciB0aW1lbGluZXNzIG9mIHRoaXMgc3VwcG9ydCBjYW5ub3QgYmUKLWd1YXJhbnRlZWQuIEFSTSBzaGFsbCBub3QgYmUgcmVzcG9uc2libGUgZm9yIGRpcmVjdCBvciBjb25zZXF1ZW50aWFsCi1kYW1hZ2VzIGFzIGEgcmVzdWx0IG9mIGVuY291bnRlcmluZyBvbmUgb3IgbW9yZSBvZiB0aGVzZSByZXNpZHVhbCBkZWZlY3RzLgotQnkgYWNjZXB0aW5nIGEgQmV0YSByZWxlYXNlLCB0aGUgcmVjaXBpZW50IGFncmVlcyB0byB0aGVzZSBjb25zdHJhaW50cyBhbmQKLXRvIHByb3ZpZGluZyByZWFzb25hYmxlIGluZm9ybWF0aW9uIHRvIEFSTSB0byBlbmFibGUgdGhlIHJlcGxpY2F0aW9uIG9mIHRoZQotZGVmZWN0cyBpZGVudGlmaWVkIGJ5IHRoZSByZWNpcGllbnQuIFRoZSBzcGVjaWZpYyBCZXRhIHZlcnNpb24gc3VwcGxpZWQKLXdpbGwgbm90IGJlIHN1cHBvcnRlZCBhZnRlciByZWxlYXNlIG9mIGEgbGF0ZXIgb3IgaGlnaGVyIHN0YXR1cyB2ZXJzaW9uLgotSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgU3VwcG9ydCBmb3IgdGhlIEJldGEgcmVsZWFzZSBvZiB0aGUgZGVsaXZlcmFibGUKLXdpbGwgb25seSBiZSBwcm92aWRlZCBieSBBUk0gdG8gYSByZWNpcGllbnQgd2hvIGhhcyBhIGN1cnJlbnQgc3VwcG9ydCBhbmQKLW1haW50ZW5hbmNlIGNvbnRyYWN0IGZvciB0aGUgZGVsaXZlcmFibGUuCi0KLQotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQotCi1JbiBhZGRpdGlvbiB0byB0aGUgZGF0YSB2ZXJzaW9ucyBsaXN0ZWQgYWJvdmUsIHRoaXMgdHJhbnNhY3Rpb24gY29udGFpbnMKLXR3byBhZGRpdGlvbmFsIGZpbGVzIGF0IHRoZSB0b3AgbGV2ZWwuCi0KLVRoZSBmaXJzdCBpcyB0aGlzIGZpbGUsIEFSTV9ERUxJVkVSWV85NzQxMi5UWFQsIHdoaWNoIGlzIHRoZSBkZWxpdmVyeQotbm90ZS4KLQotVGhlIHNlY29uZCBpcyBBUk1fTUFOSUZFU1RfOTc0MTIuVFhUIHdoaWNoIGNvbnRhaW5zIGEgbWFuaWZlc3Qgb2YgYWxsIHRoZQotZmlsZXMgaW5jbHVkZWQgaW4gdGhpcyB0cmFuc2FjdGlvbiwgdG9nZXRoZXIgd2l0aCB0aGVpciBjaGVja3N1bXMuCi0KLVRoZSBjaGVja3N1bXMgcHJvdmlkZWQgYXJlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuCi1NRDUgTWVzc2FnZS1EaWdlc3QgQWxnb3JpdGhtLgotCi1UaGUgY2hlY2tzdW1zIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGUgaW50ZWdyaXR5IG9mIHRoaXMgZGF0YSB1c2luZyB0aGUKLSJtZDVzdW0iIHRvb2wgKHdoaWNoIGlzIHBhcnQgb2YgdGhlIEdOVSAidGV4dHV0aWxzIiBwYWNrYWdlKSBieSBydW5uaW5nOgotCi0gICUgbWQ1c3VtIC0tY2hlY2sgQVJNX01BTklGRVNUXzk3NDEyLlRYVAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL0FSTV9NQU5JRkVTVC5UWFQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL0FSTV9NQU5JRkVTVC5UWFQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMDFiMWUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9BUk1fTUFOSUZFU1QuVFhUCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLQkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxLwotCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpLwotODk3MTkzMmQ1NmVlZDZiMWFkMWJhNTA3ZjBiZmY1ZjAgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCi1lODhlYzg0ZTEyMjUzNDA5MmI5MGM2Nzg0MTU0OWQ2ZiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fVmVyc2lvbi5oCi00M2NmNDZjMmNmMmZlMWY5M2M2MTViNTdiY2JlNDgwOSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU0uaAotZjg3ZmVkZDljYTQzMmZlZmE3NTcwMDgxNzY4NjRlZjggIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1PTVguaAotOGU0OTg5OWE0Mjg4MjJjMzZlZjlkZDk0ZTBlMDVmMTggIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9vbXh0eXBlcy5oCi1hMDY5ODNhYmIzOWM0NzZiMDgxZTg3ZWEyNzEzNjFhNSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvYnVpbGRfdmMucGwKLWMwMWY4YjkzYWI3M2Q4YzAwZGRmMjQ5OWYwMWRhNWZmICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS9maWxlbGlzdF92Yy50eHQKLQkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy8KLTI2ZTJmZjNmNjMzNzY0ZWI3MjBkZWIzNDA5NzhkYzJkICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYwotNzlhYTIzZDk4MTdlZmQxMWQwYzRjMmJlMzZlYzFlNWMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy9hcm1DT01NLmMKLQkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjLwotCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvCi0JCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvCi1lNDUyOTc3MDRkNzIzMDJkNGE5NDdkMDc5OGM2NjZmYiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYwotMjA1ZGZhZmUxZmU3YmIxNjBiZjM2ZDI2MDBlMTEwMGEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwotYmY5MjY0MWU4NTQ4NTc3Yjc3ZTA0ZTAzZWMwNGMzNTggIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01FR2V0QnVmU2l6ZS5jCi1mNWVlNmY3YmU4MjJkODc0NzFjZWYzYjE4MDFkYmZjMiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kuYwotMjgxMTBiM2ExM2NlY2Y0ZjIxNmQxMGJjYzc2MWM0MDEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYS5jCi05YTFhMjUyNDVjOTc1ZDY0MWUxYzYzNzg4MzRhZWE0ZCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYwotM2E2NDNlYWFhZWIxMmU4ZDI3NGRjNTlhNzM1N2E1ODYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSS5jCi00YzRkZTU5NzNhNmI3NDI1MGNlOTFhYzBiMzE3YTYxNyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMuYwotNGVjZGJlOTE5M2FhYmExZjliYjBlMjRjOTM4YjM0ZjkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrMngyLmMKLTY2ZTkxMmY4Yzg4ZjYwMTljYmEzZWRlMjcxNTBhNDA3ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEuYwotMjY2ZGE0MmY0ZTMwMTVlNjdiMmNiYjU4MTY5ZDQzN2YgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYS5jCi1kOTA1MjQ3ZWVhYTUyZDRlMmNmNWY2YmMzZjYxYjM0OCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyLmMKLTViMjk0NDhkYjA0OTVjZDE3MTdhNGI5MjVmMTMzNzdjICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYuYwotZjY0NTFkZjI3ZjZkY2M5OTAzNmI0YjEyNTNjMjNiYjYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLmMKLTg5Mjc4N2Q4NTBlZWYwOWRjMjE0OGQ0NWI0MTZiMDYyICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQy5jCi0zM2RhMWMwMWEzMWY0N2MwZjNhZWE5YTdhNWVhYTliZSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyLmMKLWU5ZmIxMWIwNjY3NzUyODNkY2ZlYWU4ZDEyYTZjOTdhICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYS5jCi1hZGQ5N2JlYzA4ZTVlMWE1MzhhYTg2MDcxNjhlNjFiYSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OC5jCi1iNjk1ZWNmYzkxN2IzOTQ3MGQxZjQwNzczYjkyMzk3MiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQuYwotNTFiYzU5NmZkMmZmNjFhZDU0NTBkNzEzODQ2MWY0YTEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01FSW5pdC5jCi1kYzZiYWEwYTM4OGRjNWVhOGZmNjVjMjRiMTc5ZTY3MCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfR2V0VkxDSW5mby5jCi1hNTQ5OTkwMjk5NjU3NmY2NzEyODQ5ZGIzNGQ1YWQ2NSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLmMKLTBjM2I3Njc0NWQ1M2U3NGE4ZTY0ZTgwZGVmMzFmYWJhICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0LmMKLTRmMjc0MmJhNWEzYzIyMDhmNTNiYzBmNmE0NDNiZTE0ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzR4LmMKLWI0YWUyZGM5NDhlOGNhNjQ4MzFmZTNiYmZiZDg5NTIzICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCi1lMTUxMThjYmUzNzJkYjdjYWRiYTIyNWM5NDU2ZjE4OSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfU0FEUXVhci5jCi02MjNjZjMzNmNmY2U3ZDAxNzRmNGU1NDA3MjQ1NmYzMyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQuYwotODllNDUyYzgwZTMwMzU3Y2FkZmIwNGMwNWI2ZmUwMGMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKLTNhNTU1MWNjNTRlODViYmUzNGZjOTY2YzdkYzAwZjFjICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIuYwotMTE0MDMwZmEwZDhmMDBhZjZkMzI4OWY0N2E1ZTg1YmYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKLTllMzczYWIyOTZmYjg1YmI0NTU2NWE2YzM4NGY2ZWQ4ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzLmMKLTJkMjAwZjdjYzIzMGYzMDJkYTQ4YzU4OWRhNDJjMDJmICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NC5jCi1lYTNmMWQxZDE1MDdiNTU2MTBiMTM0OWM3YjU5NDZlOCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIuYwotYmQyYmYxNzQzYWVmMmE5Mzk2NTQ1ZWQwMjUzNjJiZTIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0F2ZXJhZ2VfNHguYwotY2E2OGU4MDk1NjdiZjg5MDQ0NjMxYjY3ZDIyOGM3Y2UgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCi03N2NhZjJiNWNiZWU5NmQzNjBhOTE5ZjI3ZTFmMTRmNCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXMuYwotMjYwODFlMzg0ZWM2MjdmZWRhZDQ3NGEwZTdkYWQ4NzcgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfOHguYwotMWM4M2FlOTIwN2E1NDk0NDkzNmY0YTYzYzY2NWJkOTkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQi5jCi00YzM2ZTA0ZGIyMDIwMGY0ZWM3MmU1YWJhNTc0NDZmZCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FURF80eDQuYwotZjc1YjdjNWE4MGQ4YmYzM2UzMTUzODBlNGVmMGFiOGEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKLTQ4ODkyNWJiN2FlZWFlMGNjZjkzZWM0NGFmOWZjZTM1ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzE2eC5jCi1jOTFhNTM0NWI1Zjg3N2IzODMxZWQxYWJjYzYwZDU3OSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmLmMKLTM1NTE1YTExNWEzMmZjYWM4NDc5MDcyYTlhNWIwZGI5ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hLmMKLWZkY2Y0NjIyYmM1ZjBhZTc1YmRiMGE1MWRjZDAzMzk3ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMuYwotNzRjOTI3ODE3NzQwMGExZjdjYzZkNzk5YThjOGFiMzQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRF80eC5jCi01NmFhMmQ1MDZkMGNmZGI0ZWJkMzY2YzA3YWRiMmQ4NSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVCbG9ja1BpeGVsLmMKLTM2YjIxNjVmZDRkMmE3ZjNmM2UxZjhkYWZmNGY5NGU1ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbC5jCi00YjZiMWI5MzNmYzdiYzhmMTRhMTg0YzAyYzAyODA4NSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQuYwotY2YwZmYwOTNhOWIzNzJkZDMyNzFlM2U1YzI4OTg0ZDQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpci5jCi05Y2NhZDlmODk0ZmJkMzIxOTRmNWI1M2RhMjE3MDcyYSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQy5jCi00OTQzYTdhMmRmN2U5ZDcwMDY3NWY4YzFkZWJmNGQ5MCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WLmMKLTI5ZTRhN2YzOGY4YzJlODI0NmVkNzU2ZGIwM2MwMTJlICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9Gd2RUcmFuc2Zvcm1SZXNpZHVhbDR4NC5jCi0yN2JjNjRlN2MxOGRhMGFhYjljOTg3YTM4OGY2MTYwOCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCi04NTkxODU2MTRiYjlkMDAxMzg2MWU0NTRkN2I5MThmMiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQuYwotCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvYXBpLwotNjNlM2I2NGI5NmNjNDJhMjM1YzA0ZjNhMGY5OTEzMTYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKLQkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvCi0JCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy8KLTBhYWU0ZjY4M2Q4OTAzY2JhOTk1NmQzMzAxZWQ5ZmZlICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQUNEQ1ByZWRpY3QuYwotOGQ2YzFiNDQ5MTUzMjkxNjVkZjY0MzA4MWNjMTFhOTcgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2suYwotMDQzNWVjYTkzMGVhY2RhMGYyYTU5ZTg0M2Q0MDVlZmYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIuYwotOWE4MmRkMGIxZjA1Zjc5ODU2NzQzNmEwMDlkMDI5NjkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QLmMKLWUxZTI0NjQ2YzRiZDAzZjVkZjc4Mjk1NDUyZGQ0ZWIyICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OC5jCi03NDZlNmIzMzRlNGEyNmQ0YTliZmFlNmQ3MzU4MjZmNiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RDVDh4OGJsay5jCi04YjFkODdiNzRkODBmZjEzYTE2MjE1YjYxZDVlNTJiYSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGsuYwotMzA5MzU4ZDM1N2JhYWZjMzhkMmIzN2JmMWU5NzY4YTkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0kuYwotY2M3N2M3MjQyYjUzYzE1M2Y4ZDA5NTI3NTgzZjI3NzEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkLmMKLTdjZDhlNzc5NjAxN2UzZGQwMGI0OTRkMzRmNjI5ZjNmICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVHZXRCdWZTaXplLmMKLWE0OTA1Y2I1ZjhkNGIyNDQ0NTRlZTRmNjBkMTgzNThiICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfUHV0VkxDQml0cy5jCi01NTk2YjMxZTQzMzIyMmMxZTQ4NjBkZWViZmE5OGVmMiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RDVF9UYWJsZS5jCi0zNjVkMDcyYmU2ZWFiMjAxZjZlMDQwMDU4YTNiYWNmYyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlci5jCi03OGVkMjIxMjU4NWIwY2NhNzU5MTNhNDczYjJlYzQzMCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMKLTUwYjJkOGRhOGYyMGY2YjFkMzliOGQzZGYzOGFmNTVkICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlTVYuYwotNGE4NTFhMmFkNmQzNTdjZGMyMzNkOWMwYmY0NzVlMDIgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYuYwotMGQ2ZDYzODc4ZjI4MjdlMDBlNWY4NWIxZThlMjYwMTcgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKLTQ4Yjg2NWE5ODNmZTViZjMwNzVlZGRmNjUyOTUwNzIyICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLmMKLTVmNDhmYTc5NDE4MzVjNDZhYzc2N2U2M2ZjMjk0MDNiICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYwotYmJhZjQ1NGI2NGIzMmIyYzQyYTc2YTdlYzM5M2Q5NzcgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Db21wYXJlTVYuYwotZWViZmY3NzJmODdhNDE0NDM2YzVjNTI4NmYyY2QyMTMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9NRUluaXQuYwotNjVhZTI0MmViOGNiNmQxMDI3Njc3YzhlZjhmNzdjYTAgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9GaWxsVkxDQnVmZmVyLmMKLTEyNTY0MmIxZWEwYzEyNTZkNzlhZjFlMGRkZWNhZTkzICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnRlcl9JLmMKLWNlMjRiYTNkODNkYTRjYjc5MTQ4NWQzMTI4MjY4YmY2ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEuYwotMDliYzA5YTJlNmZkOTYyZTcxOTk0NDU4MmUzOGE4ZmQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYwotNmIwZWU3YTExNjQ3MWE0ZGFkYmU1YmM4ZGJmNDI1YjAgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9GaWxsVkxEQnVmZmVyLmMKLTIxMzIyZGNhMDI3YzI4MzUzZTNlN2ViOGYzNjIwMDYyICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlLmMKLWVmMzUzZDgzMjQ0Mjg4ZDhjMzdlMGY3MDI0OTE3N2NjICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfR2V0VkxDQml0cy5jCi01NDFkZTgyNGY4YWViZTRhNWNhYzZmMTVkYTk0M2VmYSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDguYwotMGI0MGIxNTRiNTkxYzdmODg0MmNmZmU0MDQyZDE3YzUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwotMmZmY2VjODhkM2ZjYjM3MjU0M2E4ZjQ1MDhlYTFhYzYgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludHJhX0kuYwotZTA2ZDg1Y2EwMDBhZmNiYjUwNTgwZjk4ZjAyMDNhYzggIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jCi1hZTgyYjZmY2ZjZjczMWE2MWQ3MGUxYWE0MmU2Mjc3YSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNi5jCi0xZDA0Mzk1ZTIzMWI1OTc1NjIyNTdlOThjZGE2Y2ZiMCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCi03MmMwYTM2MzI3YjZiOWI0MzZkM2JjZTdjODk2YzUyMCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMKLTFiNjVhYTdmMzExMTI0ZWE2ZmI0N2UzODRlYzA2YTUwICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JLmMKLTcxNDk1NzEwNGE2ZWY3MTM0MWZiZTZhOWVjNjVjMTM2ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpci5jCi04NjQ5M2YwZWU4NTNmNjUzMzU0YTczODlmMTcyN2Y3MyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyLmMKLTVkZThhZmNmYjMwNTI5Njg3OTQ3ODJhN2MzYTBiNDFhICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyLmMKLTUwYmNjMjI4Y2M2NjBkYmRhMDM3NzI1MzA5ZGUzZjhiICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX2ludHJhLmMKLTRmNWNmYTFlY2M2Njg5MTNkZGU5NGUzY2FmOTdhMmUxICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX2ludHJhLmMKLWMyZWM4MDRkZGY2NGVlODQxMTQ2ZTM5YzNhNzgzNDUxICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LmMKLTQwODdmNmE4Mjc5MTJlZTViNDVlZDQyMTdmMWE2ZDc3ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLmMKLQkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpLwotNWM3MTE3MDJkZGRjZWM4NTI5ODAwMzg2MGQ3NjBjZWMgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpL2FybVZDTTRQMl9EQ1RfVGFibGUuaAotMWI5MmM5NGI3ODVjMDNlYzc2ZDRmYWUyZjJiYmRiOGEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKLWFkOWM2OTg2ZDJhMzIwMGRkNWUxZjYxMDNhNTRhOTliICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKLQkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL3NyYy8KLWU2MjdiMzM0NmIwZGM5YWZmMTQ0NDYwMDVjZTBmYTQzICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jCi0JCQkJICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvCi03Y2E5NGIxYzMzYWMwMjExZTE3ZDM4YmFhZGQ3ZDFkZCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvYXBpL2FybVZDLmgKLTEyY2Y3NTk2ZWRiYmY2MDQ4YjYyNmQxNWU4ZDBlZDQ4ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvb214VkMuaAotCQkJCSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS8KLQkJCQkgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjLwotM2E2ZGYwMDg1NzM2Y2JjYmUyZTNmNDVkMDhhZjQyMjEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL2FybVZDQ09NTV9BdmVyYWdlLmMKLTBiZjNjYjUyODYzYzgyOWIyOGMwMzUyODM1MTcwMjExICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OC5jCi01MzhiNjJmNTEwYjVhOGJkY2VkNGEzOWZhMTJkOWEyMyAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQuYwotNjY5OTNlZGQ5ZDQ0MWJmM2I1YjZjOTEyZjY0MDBiNmUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JLmMKLThlNTI2YTkwMDdlYjBkNDNlYmYzNjJjNDk4YjM3NDE1ICBPWDAwMC1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fTGltaXRNVlRvUmVjdC5jCi04N2Y4ZjI2ZTZlOTE3OGRmMGFiNzQxOTMzNGQ1YTNkYiAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX1NBRF8xNnguYwotMWE4NTc3NjQ2MTMyYWQ5YjYzYTE0NzdmZGFlYzI0NjQgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9BdmVyYWdlXzE2eC5jCi00ODUyOWM0ZjcwYzdlOTU0ZTgzMmVlY2UxYWVlNTdiZCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX1NBRF84eC5jCi0yNTI5Nzc3NjRkNGYzODI4MmI2YTU2YzU5Y2NmNGYwOSAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvYXJtVkNDT01NX1NBRC5jCi1jYzc4Y2ZhZWQ5NTAyYzJlMDI4MmM5MWZiOTVlZWFjNCAgT1gwMDAtU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0F2ZXJhZ2VfOHguYwotZTQ2ODc1MWMxNWE1ODFlYmQyMmRhMDMxZTIyMTE3ZDEgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTYuYwotM2Y0NDhkMTkxZWFlYjgyZWNiN2UyN2VmOGJhMjc4NzUgIE9YMDAwLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2suYwotYjEyOTFjMzA3ODA4NjMxZmE4MzM2ODRhYmI5YzM0Y2UgIEFSTV9ERUxJVkVSWV85NzQxMi5UWFQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybUNPTU0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybUNPTU0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMwNDg2My4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1DT01NLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybUNPTU0uaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogICAKLSAqIEZpbGU6IGFybUNPTU0uaAotICogQnJpZWY6IERlY2xhcmVzIENvbW1vbiBBUElzL0RhdGEgVHlwZXMgdXNlZCBhY3Jvc3MgT3Blbk1BWCBBUEkncwotICoKLSAqLwotIAotICAKLSNpZm5kZWYgX2FybUNvbW1vbl9IXwotI2RlZmluZSBfYXJtQ29tbW9uX0hfCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotCi10eXBlZGVmIHN0cnVjdAotewotICBPTVhfRjMyIFJlOyAvKiogUmVhbCBwYXJ0ICovCi0gIE9NWF9GMzIgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKLSAgICAgICAgCi19IE9NWF9GQzMyOyAvKiogc2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBjb21wbGV4IG51bWJlciAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICBPTVhfRjY0IFJlOyAvKiogUmVhbCBwYXJ0ICovCi0gIE9NWF9GNjQgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKLSAgICAgICAgCi19IE9NWF9GQzY0OyAvKiogZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBjb21wbGV4IG51bWJlciAqLwotCi0KLS8qIFVzZWQgYnkgYm90aCBJUCBhbmQgSUMgZG9tYWlucyBmb3IgOHg4IEpQRUcgYmxvY2tzLiAqLwotdHlwZWRlZiBPTVhfUzE2IEFSTV9CTE9DSzh4OFs2NF07Ci0KLQotI2luY2x1ZGUgImFybU9NWC5oIgotCi0jZGVmaW5lICBhcm1QSSAoT01YX0Y2NCkoMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIENvbXBpbGVyIGV4dGVuc2lvbnMgKi8KLSNpZmRlZiBBUk1fREVCVUcKLS8qIGRlYnVnIHZlcnNpb24gKi8KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2RlZmluZSBhcm1FcnJvcihzdHIpIHtwcmludGYoKHN0cikpOyBwcmludGYoIlxuIik7IGV4aXQoLTEpO30KLSNkZWZpbmUgYXJtV2FybihzdHIpIHtwcmludGYoKHN0cikpOyBwcmludGYoIlxuIik7fQotI2RlZmluZSBhcm1JZ25vcmUoYSkgKCh2b2lkKWEpCi0jZGVmaW5lIGFybUFzc2VydChhKSBhc3NlcnQoYSkKLSNlbHNlIAotLyogcmVsZWFzZSB2ZXJzaW9uICovCi0jZGVmaW5lIGFybUVycm9yKHN0cikgKCh2b2lkKSAoc3RyKSkKLSNkZWZpbmUgYXJtV2FybihzdHIpICAoKHZvaWQpIChzdHIpKQotI2RlZmluZSBhcm1JZ25vcmUoYSkgICgodm9pZCkgKGEpKQotI2RlZmluZSBhcm1Bc3NlcnQoYSkgICgodm9pZCkgKGEpKQotI2VuZGlmIC8qIEFSTV9ERUJVRyAqLwotCi0vKiBBcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KLQotI2RlZmluZSBhcm1NaW4oYSxiKSAgICAgICAgICAgICAoIChhKSA+IChiKSA/ICAoYik6KGEpICkKLSNkZWZpbmUgYXJtTWF4KGEsYikgICAgICAgICAgICAgKCAoYSkgPiAoYikgPyAgKGEpOihiKSApCi0jZGVmaW5lIGFybUFicyhhKSAgICAgICAgICAgICAgICggKGEpIDwgIDAgID8gLShhKTooYSkgKQotCi0vKiBBbGlnbm1lbnQgb3BlcmF0aW9uICovCi0KLSNkZWZpbmUgYXJtQWxpZ25Ub0J5dGVzKFB0cixOKSAgICAgIChQdHIgKyAoICgoTi0oaW50cHRyX3QpUHRyKSYoTi0xKSkgLyBzaXplb2YoKlB0cikgKSkKLSNkZWZpbmUgYXJtQWxpZ25UbzJCeXRlcyhQdHIpICAgICAgIGFybUFsaWduVG9CeXRlcyhQdHIsMikKLSNkZWZpbmUgYXJtQWxpZ25UbzRCeXRlcyhQdHIpICAgICAgIGFybUFsaWduVG9CeXRlcyhQdHIsNCkKLSNkZWZpbmUgYXJtQWxpZ25UbzhCeXRlcyhQdHIpICAgICAgIGFybUFsaWduVG9CeXRlcyhQdHIsOCkKLSNkZWZpbmUgYXJtQWxpZ25UbzE2Qnl0ZXMoUHRyKSAgICAgIGFybUFsaWduVG9CeXRlcyhQdHIsMTYpCi0KLS8qIEVycm9yIGFuZCBBbGlnbm1lbnQgY2hlY2sgKi8KLQotI2RlZmluZSBhcm1SZXRBcmdFcnJJZihjb25kaXRpb24sIGNvZGUpICBpZihjb25kaXRpb24pIHsgcmV0dXJuIChjb2RlKTsgfQotI2RlZmluZSBhcm1SZXREYXRhRXJySWYoY29uZGl0aW9uLCBjb2RlKSBpZihjb25kaXRpb24pIHsgcmV0dXJuIChjb2RlKTsgfQotCi0jaWZuZGVmIEFMSUdOTUVOVF9ET0VTTlRfTUFUVEVSCi0jZGVmaW5lIGFybUlzQnl0ZUFsaWduZWQoUHRyLE4pICAgICAoKCgoaW50cHRyX3QpKFB0cikpICUgTik9PTApCi0jZGVmaW5lIGFybU5vdEJ5dGVBbGlnbmVkKFB0cixOKSAgICAoKCgoaW50cHRyX3QpKFB0cikpICUgTikhPTApCi0jZWxzZQotI2RlZmluZSBhcm1Jc0J5dGVBbGlnbmVkKFB0cixOKSAgICAgKDEpCi0jZGVmaW5lIGFybU5vdEJ5dGVBbGlnbmVkKFB0cixOKSAgICAoMCkKLSNlbmRpZgotCi0jZGVmaW5lIGFybUlzMkJ5dGVBbGlnbmVkKFB0cikgICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciwyKQotI2RlZmluZSBhcm1JczRCeXRlQWxpZ25lZChQdHIpICAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsNCkKLSNkZWZpbmUgYXJtSXM4Qnl0ZUFsaWduZWQoUHRyKSAgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDgpCi0jZGVmaW5lIGFybUlzMTZCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciwxNikKLQotI2RlZmluZSBhcm1Ob3QyQnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDIpCi0jZGVmaW5lIGFybU5vdDRCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsNCkKLSNkZWZpbmUgYXJtTm90OEJ5dGVBbGlnbmVkKFB0cikgICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciw4KQotI2RlZmluZSBhcm1Ob3QxNkJ5dGVBbGlnbmVkKFB0cikgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDE2KQotI2RlZmluZSBhcm1Ob3QzMkJ5dGVBbGlnbmVkKFB0cikgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDMyKQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TMTZfcmVmL2FybVJvdW5kRmxvYXRUb1MzMl9yZWYvYXJtUm91bmRGbG9hdFRvUzY0Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludC9pbnQgYWZ0ZXIgcm91bmRpbmcKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2L09NWF9TMzIgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9TMTYgYXJtUm91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKTsKLU9NWF9TMzIgYXJtUm91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKTsKLU9NWF9TNjQgYXJtUm91bmRGbG9hdFRvUzY0IChPTVhfRjY0IFZhbHVlKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvUzE2X3JlZi9hcm1TYXRSb3VuZEZsb2F0VG9TMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50L2ludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYvT01YX1MzMiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1MxNiBhcm1TYXRSb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpOwotT01YX1MzMiBhcm1TYXRSb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9VMTZfcmVmL2FybVNhdFJvdW5kRmxvYXRUb1UzMgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSB1bnNpZ25lZCBzaG9ydCBpbnQvaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1UxNi9PTVhfVTMyIGZvcm1hdAotICoKLSAqLwotCi1PTVhfVTE2IGFybVNhdFJvdW5kRmxvYXRUb1UxNiAoT01YX0Y2NCBWYWx1ZSk7Ci1PTVhfVTMyIGFybVNhdFJvdW5kRmxvYXRUb1UzMiAoT01YX0Y2NCBWYWx1ZSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVNpZ25DaGVjawotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ2hlY2tzIHRoZSBzaWduIG9mIGEgdmFyaWFibGU6Ci0gKiByZXR1cm5zIDEgaWYgaXQgaXMgUG9zaXRpdmUKLSAqIHJldHVybnMgMCBpZiBpdCBpcyAwCi0gKiByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JICAgIHZhciAgICAgVmFyaWFibGUgdG8gYmUgY2hlY2tlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9JTlQgLS0gICByZXR1cm5zIDEgaWYgaXQgaXMgUG9zaXRpdmUKLSAqICAgICAgICAgICAgICByZXR1cm5zIDAgaWYgaXQgaXMgMAotICogICAgICAgICAgICAgIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCi0gKi8gCi0gCi1PTVhfSU5UIGFybVNpZ25DaGVjayAoT01YX1MxNiB2YXIpOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1DbGlwCi0gKgotICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCi0gKiAKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKLSAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAotICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1MzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQotICovIAotIAotT01YX1MzMiBhcm1DbGlwICgKLSAgICAgICAgT01YX0lOVCBtaW4sCi0gICAgICAgIE9NWF9JTlQgbWF4LCAKLSAgICAgICAgT01YX1MzMiBzcmMKLSAgICAgICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtQ2xpcF9GMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKLSAqIAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAotICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCi0gKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfRjMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCi0gKi8gCi0gCi1PTVhfRjMyIGFybUNsaXBfRjMyICgKLSAgICAgICAgT01YX0YzMiBtaW4sCi0gICAgICAgIE9NWF9GMzIgbWF4LCAKLSAgICAgICAgT01YX0YzMiBzcmMKLSAgICAgICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2hpZnRTYXRfRjMyCi0gKgotICogRGVzY3JpcHRpb246IERpdmlkZXMgYSBmbG9hdCB2YWx1ZSBieSAyXnNoaWZ0IGFuZCAKLSAqIHNhdHVyYXRlcyBpdCBmb3IgdW5zaWduZWQgdmFsdWUgcmFuZ2UgZm9yIHNhdEJpdHMuCi0gKiBTZWNvbmQgcGFyYW1ldGVyIGlzIGxpa2UgInNoaWZ0aW5nIiB0aGUgY29ycmVzcG9uZGluZyAKLSAqIGludGVnZXIgdmFsdWUuIFRha2VzIGNhcmUgb2Ygcm91bmRpbmcgd2hpbGUgY2xpcHBpbmcgdGhlIGZpbmFsIAotICogdmFsdWUuCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gdiAgICAgICAgICBOdW1iZXIgdG8gYmUgb3BlcmF0ZWQgdXBvbgotICogW2luXSBzaGlmdCAgICAgIERpdmlkZXMgdGhlIGlucHV0ICJ2IiBieSAiMl5zaGlmdCIKLSAqIFtpbl0gc2F0Qml0cyAgICBGaW5hbCByYW5nZSBpcyBbMCwgMl5zYXRCaXRzKQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TMzIgLS0gICByZXR1cm5zICJzaGlmdGVkIiBzYXR1cmF0ZWQgdmFsdWUKLSAqLyAKLSAKLU9NWF9VMzIgYXJtU2hpZnRTYXRfRjMyKAotICAgICAgICBPTVhfRjMyIHYsIAotICAgICAgICBPTVhfSU5UIHNoaWZ0LCAKLSAgICAgICAgT01YX0lOVCBzYXRCaXRzCi0gICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb25zOiBhcm1Td2FwRWxlbQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBzd2FwcyB0d28gZWxlbWVudHMgYXQgdGhlIHNwZWNpZmllZCBwb2ludGVyIGxvY2F0aW9ucy4KLSAqIFRoZSBzaXplIG9mIGVhY2ggZWxlbWVudCBjb3VsZCBiZSBhbnl0aGluZyBhcyBzcGVjaWZpZWQgYnkgPGVsZW1TaXplPgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWFJlc3VsdCAtLSBFcnJvciBzdGF0dXMgZnJvbSB0aGUgZnVuY3Rpb24KLSAqLwotT01YUmVzdWx0IGFybVN3YXBFbGVtKE9NWF9VOCAqcEJ1ZjEsIE9NWF9VOCAqcEJ1ZjIsIE9NWF9JTlQgZWxlbVNpemUpOwotCi0KLS8qKgotICogRnVuY3Rpb246IGFybU1lZGlhbk9mMwotICoKLSAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgbWVkaWFuIG9mIHRocmVlIG51bWJlcnMKLSAqIAotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBmRW50cnkgICAgIEZpcnN0IGVudHJ5Ci0gKiBbaW5dIHNFbnRyeSAgICAgc2Vjb25kIGVudHJ5Ci0gKiBbaW5dIHRFbnRyeSAgICAgVGhpcmQgZW50cnkKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfUzMyIC0tICAgcmV0dXJucyB0aGUgbWVkaWFuIHZhbHVlCi0gKi8gCi0gCi1PTVhfUzMyIGFybU1lZGlhbk9mMyAoCi0gICAgT01YX1MzMiBmRW50cnksCi0gICAgT01YX1MzMiBzRW50cnksIAotICAgIE9NWF9TMzIgdEVudHJ5IAotICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUxvZ1NpemUKLSAqCi0gKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIHNpemUgb2YgYSBwb3NpdGl2ZSB2YWx1ZSBhbmQgcmV0dXJucyB0aGUgc2FtZQotICogCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHZhbHVlICAgIFBvc2l0aXZlIHZhbHVlCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1U4IC0tICAgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgcG9zaXRpdmUgdmFsdWUKLSAqLyAKLSAKLU9NWF9VOCBhcm1Mb2dTaXplICgKLSAgICBPTVhfVTE2IHZhbHVlIAotICAgICk7ICAgIAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgLyogU2F0dXJhdGluZyBBcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAotICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAKLSAqICAgIAotICoqLwotCi1PTVhfUzMyIGFybVNhdEFkZF9TMzIoCi0gICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZTEsCi0gICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZTIKLSAgICAgICAgICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzY0KCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqIAotICogICAgCi0gKiovCi0KLU9NWF9TNjQgYXJtU2F0QWRkX1M2NCgKLSAgICAgICAgICAgICAgICBPTVhfUzY0IFZhbHVlMSwKLSAgICAgICAgICAgICAgICBPTVhfUzY0IFZhbHVlMgotICAgICAgICAgICAgICAgICk7Ci0KLS8qKiBGdW5jdGlvbiA6YXJtU2F0U3ViX1MzMigpCi0gKiAKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIHN1YnN0cmFjdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKLSAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0U3ViX1MzMigKLSAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBWYWx1ZTEsCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUyCi0gICAgICAgICAgICAgICAgICAgICk7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdE1hY19TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgTXVsdGlwbGljYXRpb24gb2YgVmFsdWUxIGFuZCBWYWx1ZTIgYW5kIHN1YmVzcXVlbnQgc2F0dXJhdGVkCi0gKiAgICAgYWNjdW11bGF0aW9uIHdpdGggTWFjCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAotICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKLSAqIFtpbl0gTWFjICAgICAgICAgIEFjY3VtdWxhdG9yCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICoqLwotCi1PTVhfUzMyIGFybVNhdE1hY19TMzIoCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgTWFjLAotICAgICAgICAgICAgICAgICAgICBPTVhfUzE2IFZhbHVlMSwKLSAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBWYWx1ZTIKLSAgICAgICAgICAgICAgICAgICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MxNlMzMl9TMzIKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgTUFDIG9wZXJhdGlvbiBvZiB0aGUgdGhyZWUgaW5wdXRzIGRlbGF5RWxlbSwgZmlsVGFwICwgbWFjCi0gKgotICogICBtYWMgPSBtYWMgKyBTYXR1cmF0ZV9pbl8zMkJpdHMoZGVsYXlFbGVtICogZmlsVGFwKQotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gZGVsYXlFbGVtICAgIEZpcnN0IDMyIGJpdCBPcGVyYW5kCi0gKiBbaW5dIGZpbFRhcCAgICAgICBTZWNvbmQgMTYgYml0IE9wZXJhbmQKLSAqIFtpbl0gbWFjICAgICAgICAgIFJlc3VsdCBvZiBNQUMgb3BlcmF0aW9uCi0gKgotICogUmV0dXJuOgotICogW291dF0gIG1hYyAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0gCi1PTVhfUzMyIGFybVNhdE1hY19TMTZTMzJfUzMyKAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBtYWMsIAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBkZWxheUVsZW0sIAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBmaWxUYXAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiByb3VuZGVkIHJpZ2h0IHNoaWZ0IG9wZXJhdGlvbiBvZiBpbnB1dCBieSB0aGUgc2NhbGVmYWN0b3IKLSAqCi0gKiAgIG91dHB1dCA9IFNhdHVyYXRlX2luXzE2Qml0cyggKCBSaWdodFNoaWZ0KCAoUm91bmQoaW5wdXQpICwgc2NhbGVGYWN0b3IgKSApCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBpbnB1dCAgICAgICBUaGUgaW5wdXQgdG8gYmUgb3BlcmF0ZWQgb24KLSAqIFtpbl0gc2NhbGVGYWN0b3IgVGhlIHNoaWZ0IG51bWJlcgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0KLQotT01YX1MxNiBhcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNigKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgaW5wdXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOVCBzY2FsZUZhY3Rvcik7Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0Ci0gKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAotICogW2luXSBzaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0gCi1PTVhfUzMyIGFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMigKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfSU5UIHNoaWZ0Ci0gICAgICAgICAgICAgICAgICAgICAgICApOwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TNjQoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAotICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKLSAqIFtpbl0gc2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotIAotT01YX1M2NCBhcm1TYXRSb3VuZExlZnRTaGlmdF9TNjQoCi0gICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzY0IFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOVCBzaGlmdAotICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzE2UzMyX1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMxNiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKLSAqICAgICBpbiBhIFMzMiBjb250YWluZXIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKLSAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotCi0KLU9NWF9TMzIgYXJtU2F0TXVsUzE2UzMyX1MzMigKLSAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBpbnB1dDEsCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgaW5wdXQyKTsKLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzMyUzMyX1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMzMiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKLSAqICAgICBpbiBhIFMzMiBjb250YWluZXIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKLSAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotCi1PTVhfUzMyIGFybVNhdE11bFMzMlMzMl9TMzIoCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgaW5wdXQxLAotICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0Mik7Ci0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtSW50RGl2QXdheUZyb21aZXJvKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6IEludGVnZXIgZGl2aXNpb24gd2l0aCByb3VuZGluZyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLiAKLSAqICAgICAgICAgICAgICAgSGFsZi1pbnRlZ2VyIHZhbHVlcyBhcmUgcm91bmRlZCBhd2F5IGZyb20gemVybwotICogICAgICAgICAgICAgICB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZC4gRm9yIGV4YW1wbGUgMy8vMiBpcyByb3VuZGVkIAotICogICAgICAgICAgICAgICB0byAyLCBhbmQgLTMvLzIgaXMgcm91bmRlZCB0byAtMi4KLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIE51bSAgICAgICAgT3BlcmFuZCAxCi0gKiBbaW5dIERlbm8gICAgICAgT3BlcmFuZCAyCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbiBpbnB1dDEvL2lucHV0MgotICogICAgCi0gKiovCi0KLU9NWF9TMzIgYXJtSW50RGl2QXdheUZyb21aZXJvIChPTVhfUzMyIE51bSwgT01YX1MzMiBEZW5vKTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogRGVidWdnaW5nIG1hY3JvcwotICoKLSAqLwotCi0KLS8qCi0gKiBEZWZpbml0aW9uIG9mIG91dHB1dCBzdHJlYW0gLSBjaGFuZ2UgdG8gc3RkZXJyIGlmIG5lY2Vzc2FyeQotICovCi0jZGVmaW5lIERFQlVHX1NUUkVBTSBzdGRvdXQKLQotLyoKLSAqIERlYnVnIHByaW50ZiBtYWNyb3MsIG9uZSBmb3IgZWFjaCBhcmd1bWVudCBjb3VudC4KLSAqIEFkZCBtb3JlIGlmIG5lZWRlZC4KLSAqLwotI2lmZGVmIERFQlVHX09OCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2RlZmluZSBERUJVR19QUklOVEZfMChhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEpCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYikKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzIoYSwgYiwgYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjKQotI2RlZmluZSBERUJVR19QUklOVEZfMyhhLCBiLCBjLCBkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQpCi0jZGVmaW5lIERFQlVHX1BSSU5URl80KGEsIGIsIGMsIGQsIGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSkKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzUoYSwgYiwgYywgZCwgZSwgZikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmKQotI2RlZmluZSBERUJVR19QUklOVEZfNihhLCBiLCBjLCBkLCBlLCBmLCBnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcpCi0jZGVmaW5lIERFQlVHX1BSSU5URl83KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCkKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzgoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSkgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpKQotI2RlZmluZSBERUJVR19QUklOVEZfOShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqKSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGopCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xMChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrKSAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaykKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzExKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwpICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsKQotI2RlZmluZSBERUJVR19QUklOVEZfMTIoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSkgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0pCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xMyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuKSAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbikKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzE0KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4sIG8pICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvKQotI2Vsc2UgLyogREVCVUdfT04gKi8KLSNkZWZpbmUgREVCVUdfUFJJTlRGXzAoYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMihhLCBiLCBjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzMoYSwgYiwgYywgZCkgICAgICAgICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl80KGEsIGIsIGMsIGQsIGUpICAgICAgICAgICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfNShhLCBiLCBjLCBkLCBlLCBmKSAgICAgICAgICAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzYoYSwgYiwgYywgZCwgZSwgZiwgZykgICAgICAgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl83KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfOChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpKSAgICAgICAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzkoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaikgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xMChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrKSAgICAKLSNkZWZpbmUgREVCVUdfUFJJTlRGXzExKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwpICAgICAgICAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMTIoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSkgICAgICAgICAgCi0jZGVmaW5lIERFQlVHX1BSSU5URl8xMyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuKSAgICAgIAotI2RlZmluZSBERUJVR19QUklOVEZfMTQoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbiwgbykgICAKLSNlbmRpZiAvKiBERUJVR19PTiAqLwotCi0KLS8qCi0gKiBEb21haW4gYW5kIHN1YiBkb21haW4gZGVmaW5pdGlvbnMKLSAqCi0gKiBJbiBvcmRlciB0byB0dXJuIG9uIGRlYnVnIGZvciBhbiBlbnRpcmUgZG9tYWluIG9yIHN1Yi1kb21haW4KLSAqIGF0IGNvbXBpbGUgdGltZSwgb25lIG9mIHRoZSBERUJVR19ET01BSU5fKiBiZWxvdyBtYXkgYmUgZGVmaW5lZCwKLSAqIHdoaWNoIHdpbGwgYWN0aXZhdGUgZGVidWcgaW4gYWxsIG9mIHRoZSBkZWZpbmVzIGl0IGNvbnRhaW5zLgotICovCi0KLSNpZmRlZiBERUJVR19ET01BSU5fQUMKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFQ0hBTlBBSVJFTFRfTVBFRzQKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFQ0hBTlBBSVJFTFQKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFREFUU1RSRUxUCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUZJTExFTFQKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFSVNTVEVSRU9fUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERU1TUE5TX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVNU1NURVJFT19TMzJfSQotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVQUkdDRkdFTFQKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFVE5TX1MzMl9JCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFSU5URVJMRUFWRVNQRUNUUlVNX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19FTkNPREVUTlNfUzMyX0kKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfTE9OR1RFUk1QUkVESUNUX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19MT05HVEVSTVJFQ09OU1RSVUNUX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19NRENURldEX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ0FBQ19NRENUSU5WX1MzMl9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfTk9JU0VMRVNTREVDT0RFCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX1FVQU5USU5WX1MzMl9JCi0jZGVmaW5lIERFQlVHX09NWEFDQUFDX1VOUEFDS0FESUZIRUFERVIKLSNkZWZpbmUgREVCVUdfT01YQUNBQUNfVU5QQUNLQURUU0ZSQU1FSEVBREVSCi0jZGVmaW5lIERFQlVHX09NWEFDTVAzX0hVRkZNQU5ERUNPREVTRkJNQlBfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDTVAzX0hVRkZNQU5ERUNPREVTRkJfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDTVAzX0hVRkZNQU5ERUNPREVfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDTVAzX01EQ1RJTlZfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDTVAzX1JFUVVBTlRJWkVTRkJfUzMyX0kKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfUkVRVUFOVElaRV9TMzJfSQotI2RlZmluZSBERUJVR19PTVhBQ01QM19TWU5USFBRTUZfUzMyX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ01QM19VTlBBQ0tGUkFNRUhFQURFUgotI2RlZmluZSBERUJVR19PTVhBQ01QM19VTlBBQ0tTQ0FMRUZBQ1RPUlNfUzgKLSNkZWZpbmUgREVCVUdfT01YQUNNUDNfVU5QQUNLU0lERUlORk8KLSNlbmRpZiAvKiBERUJVR19ET01BSU5fQUMgKi8KLQotCi0jaWZkZWYgREVCVUdfRE9NQUlOX1ZDCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfQVZFUkFHRV8xNlgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9BVkVSQUdFXzRYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfQVZFUkFHRV84WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQkxPQ0tDSFJPTUFfVThfQzFJUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQkxPQ0tMVU1BX1U4X0MxSVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUNPREVDSFJPTUFEQ0NPRUZGU1RPUEFJUkNBVkxDX1U4Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVDT0RFQ09FRkZTVE9QQUlSQ0FWTENfVTgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERVFVQU5UVFJBTlNGT1JNQUNGUk9NUEFJUl9VOF9TMTZfQzFfRExYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRVhQQU5ERlJBTUUKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HQ0hST01BX0hPUkVER0VfVThfQzFJUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdDSFJPTUFfVkVSRURHRV9VOF9DMUlSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0xVTUFfSE9SRURHRV9VOF9DMUlSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0xVTUFfVkVSRURHRV9VOF9DMUlSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfUFJFRElDVElOVFJBQ0hST01BOFg4X1U4X0MxUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1BSRURJQ1RJTlRSQV8xNlgxNl9VOF9DMVIKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9QUkVESUNUSU5UUkFfNFg0X1U4X0MxUgotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRFFVQVJfMTZYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEUVVBUl80WAotI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRFFVQVJfOFgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURfMTZYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEXzRYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEXzhYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FURF80WDQKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9UUkFOU0ZPUk1ERVFVQU5UQ0hST01BRENGUk9NUEFJUl9VOF9TMTZfQzEKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9UUkFOU0ZPUk1ERVFVQU5UTFVNQURDRlJPTVBBSVJfVThfUzE2X0MxCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNUVVBTlRfQ0hST01BREMKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9UUkFOU0ZPUk1RVUFOVF9MVU1BREMKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSEFMRl8xNlgxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9IQUxGXzhYOAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9JTlRFR0VSXzE2WDE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0lOVEVHRVJfOFg4Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9DT01QVVRFVEVYVFVSRUVSUk9SQkxPQ0tfU0FEX1U4X1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfQ09NUFVURVRFWFRVUkVFUlJPUkJMT0NLX1U4X1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfRENUOFg4QkxLRExYCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVCTE9DS0NPRUZfSU5URVJfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVQQURNVl9QVk9QCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVWTENaSUdaQUdfSU5URVJfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVWTENaSUdaQUdfSU5UUkFBQ1ZMQ19TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RFQ09ERVZMQ1pJR1pBR19JTlRSQURDVkxDX1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFTVZfVThfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVWTENaSUdaQUdfSU5URVJfUzE2Ci0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVWTENaSUdaQUdfSU5UUkFBQ1ZMQ19TMTYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERVZMQ1pJR1pBR19JTlRSQURDVkxDX1MxNgotI2RlZmluZSBERUJVR19PTVhWQ000UDJfRklORE1WUFJFRAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfSURDVDhYOEJMS0RMWAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfTElNSVRNVlRPUkVDVAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfTU9USU9ORVNUSU1BVElPTk1CCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNQkdSQVlfVTgKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1CSE9SSVpPTlRBTF9VOAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETUJWRVJUSUNBTF9VOAotI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETVYKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1FVQU5USU5URVJfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1FVQU5USU5UUkFfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1FVQU5USU5WSU5URVJfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1FVQU5USU5WSU5UUkFfUzE2X0kKLSNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1RSQU5TUkVDQkxPQ0tDRU9GX0lOVEVSCi0jZGVmaW5lIERFQlVHX09NWFZDTTRQMl9UUkFOU1JFQ0JMT0NLQ0VPRl9JTlRSQQotI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9WQyAqLwotCi0KLSNpZmRlZiBERUJVR19ET01BSU5fSUMKLS8qIFRvIGJlIGZpbGxlZCBpbiAqLwotI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9JQyAqLwotCi0KLSNpZmRlZiBERUJVR19ET01BSU5fU1AKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9ET1RQUk9EX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0JMT0NLRVhQX1MxNgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0JMT0NLRVhQX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0NPUFlfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfRE9UUFJPRF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9ET1RQUk9EX1MxNl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfQ1RPQ19TQzE2X1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9DVE9DX1NDMzJfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX1JUT0NDU19TMTZTMzJfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX1JUT0NDU19TMzJfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9DX1NDMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX0NfU0MzMgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfUl9TMTZfUzMyCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9SX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfQ19TQzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9DX1NDMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX1JfUzE2X1MzMgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfUl9TMzIKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ0NTVE9SX1MzMlMxNl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ0NTVE9SX1MzMl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ1RPQ19TQzE2X1NGUwotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOVl9DVE9DX1NDMzJfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklMVEVSTUVESUFOX1MzMl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklMVEVSTUVESUFOX1MzMgotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2X0lTRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNl9JCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTYKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNl9TRlMKLSNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNl9JU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTZfSQotI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTZfU0ZTCi0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlST05FX0JJUVVBRERJUkVDVF9TMTZfSQotI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9CSVFVQURESVJFQ1RfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlST05FX0RJUkVDVF9TMTZfSQotI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9ESVJFQ1RfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlSX0JJUVVBRERJUkVDVF9TMTZfSQotI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9CSVFVQURESVJFQ1RfUzE2Ci0jZGVmaW5lIERFQlVHX09NWEFDU1BfSUlSX0RJUkVDVF9TMTZfSQotI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9ESVJFQ1RfUzE2Ci0jZW5kaWYgLyogREVCVUdfRE9NQUlOX1NQICovCi0KLQotI2lmZGVmIERFQlVHX0RPTUFJTl9JUAotI2RlZmluZSBERUJVR19PTVhJUEJNX0FERENfVThfQzFSX1NGUwotI2RlZmluZSBERUJVR19PTVhJUEJNX0NPUFlfVThfQzFSCi0jZGVmaW5lIERFQlVHX09NWElQQk1fQ09QWV9VOF9DM1IKLSNkZWZpbmUgREVCVUdfT01YSVBCTV9NSVJST1JfVThfQzFSCi0jZGVmaW5lIERFQlVHX09NWElQQk1fTVVMQ19VOF9DMVJfU0ZTCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfQ09MT1JUV0lTVFExNF9VOF9DM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19SR0I1NjVUT1lDQkNSNDIwTFNfTUNVX1UxNl9TMTZfQzNQM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19SR0I1NjVUT1lDQkNSNDIyTFNfTUNVX1UxNl9TMTZfQzNQM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19SR0I1NjVUT1lDQkNSNDQ0TFNfTUNVX1UxNl9TMTZfQzNQM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19SR0JUT1lDQkNSNDIwTFNfTUNVX1U4X1MxNl9DM1AzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1JHQlRPWUNCQ1I0MjJMU19NQ1VfVThfUzE2X0MzUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCVE9ZQ0JDUjQ0NExTX01DVV9VOF9TMTZfQzNQM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFJTWlJPVF9VOF9QM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFRPUkdCNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFRPUkdCNTY1X1U4X1UxNl9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIwVE9SR0JMU19NQ1VfUzE2X1U4X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJSU1pDU0NST1RSR0JfVThfQzJSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJSU1pST1RfVThfUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQjU2NV9VOF9VMTZfQzJDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCTFNfTUNVX1MxNl9VOF9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0JfVThfQzJDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPWUNCQ1I0MjBST1RBVEVfVThfQzJQM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPWUNCQ1I0MjBST1RBVEVfVThfUDNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0NDRUT1JHQjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSCi0jZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0NDRUT1JHQkxTX01DVV9TMTZfVThfUDNDM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUlRPUkdCNTY1X1U4X1UxNl9DM1IKLSNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUlRPUkdCNTY1X1U4X1UxNl9QM0MzUgotI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSVE9SR0JfVThfQzNSCi0jZGVmaW5lIERFQlVHX09NWElQUFBfR0VUQ0VOVFJBTE1PTUVOVF9TNjQKLSNkZWZpbmUgREVCVUdfT01YSVBQUF9HRVRTUEFUSUFMTU9NRU5UX1M2NAotI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVEdFVFNUQVRFU0laRV9TNjQKLSNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRJTklUX1M2NAotI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVFM2NFNfVThfQzFSCi0jZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5UUzY0U19VOF9DM1IKLSNlbmRpZiAvKiBERUJVR19ET01BSU5fSVAgKi8KLQotCi0jZW5kaWYgLyogX2FybUNvbW1vbl9IXyAqLwotCi0vKkVuZCBvZiBGaWxlKi8KLQotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybUNPTU1fQml0c3RyZWFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NmI2NmQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtQ09NTV9CaXRzdHJlYW0uaAotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEZpbGU6IGFybUNPTU1fQml0c3RyZWFtLmgKLSAqIEJyaWVmOiBEZWNsYXJlcyBjb21tb24gQVBJJ3MvRGF0YSB0eXBlcyB1c2VkIGFjcm9zcyB0aGUgT3Blbk1heCBFbmNvZGVycy9EZWNvZGVycy4KLSAqCi0gKi8KLQotI2lmbmRlZiBfYXJtQ29kZWNfSF8KLSNkZWZpbmUgX2FybUNvZGVjX0hfCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX1U4ICAgY29kZUxlbjsKLSAgICBPTVhfVTMyCSBjb2RlV29yZDsKLX0gQVJNX1ZMQzMyOwotCi0vKiBUaGUgYWJvdmUgc2hvdWxkIGJlIHJlbmFtZWQgYXMgIkFSTV9WTEMzMiIgKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtTG9va0FoZWFkQml0cygpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBHZXQgdGhlIG5leHQgTiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSB3aXRob3V0IGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKipwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIE49MS4uLjMyCi0gKgotICogUmV0dXJucyAgVmFsdWUKLSAqLwotCi1PTVhfVTMyIGFybUxvb2tBaGVhZEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sIE9NWF9JTlQgKnBPZmZzZXQsIE9NWF9JTlQgTik7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUdldEJpdHMoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUmVhZCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCi0gKiAgICAKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBOPTEuLjMyCi0gKgotICogW291dF0gICAgKnBwQml0U3RyZWFtCi0gKiBbb3V0XSAgICAqcE9mZnNldAotICogUmV0dXJucyAgVmFsdWUKLSAqLwotCi1PTVhfVTMyIGFybUdldEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sIE9NWF9JTlQgKnBPZmZzZXQsIE9NWF9JTlQgTik7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUJ5dGVBbGlnbigpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBBbGlnbiB0aGUgcG9pbnRlciAqcHBCaXRTdHJlYW0gdG8gdGhlIG5leHQgYnl0ZSBib3VuZGFyeQotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKgotICogW291dF0gICAgKnBwQml0U3RyZWFtCi0gKiBbb3V0XSAgICAqcE9mZnNldAotICoKLSAqKi8KLSAKLU9NWFZvaWQgYXJtQnl0ZUFsaWduKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLE9NWF9JTlQgKnBPZmZzZXQpOwotCi0vKiogCi0gKiBGdW5jdGlvbjogYXJtU2tpcEJpdHMoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogU2tpcCBOIGJpdHMgZnJvbSB0aGUgdmFsdWUgYXQgKnBwQml0U3RyZWFtCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIE4KLSAqCi0gKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKgotICoqLwotCi1PTVhWb2lkIGFybVNraXBCaXRzKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLE9NWF9JTlQgKnBPZmZzZXQsT01YX0lOVCBOKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVmFyaWFibGUgYml0IGxlbmd0aCBEZWNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogRnVuY3Rpb246IGFybVVuUGFja1ZMQzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFZhcmlhYmxlIGxlbmd0aCBkZWNvZGUgb2YgdmFyaWFibGUgbGVuZ3RoIHN5bWJvbCAobWF4IHNpemUgMzIgYml0cykgcmVhZCBmcm9tCi0gKiB0aGUgYml0IHN0cmVhbSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSBhdCAqcE9mZnNldCBieSB1c2luZyB0aGUgdGFibGUKLSAqIHBvaW50ZWQgYnkgcENvZGVCb29rCi0gKiAKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgcENvZGVCb29rCi0gKiAKLSAqIFtvdXRdICAgICoqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKgotICogUmV0dXJucyA6IENvZGUgQm9vayBJbmRleCBpZiBzdWNjZXNzZnVsbC4gCi0gKiAgICAgICAgIDogIkFSTV9OT19DT0RFQk9PS19JTkRFWCA9IDB4RkZGRiIgaWYgc2VhcmNoIGZhaWxzLgotICoqLwotCi0jZGVmaW5lIEFSTV9OT19DT0RFQk9PS19JTkRFWCAoT01YX1UxNikoMHhGRkZGKQotCi1PTVhfVTE2IGFybVVuUGFja1ZMQzMyKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBPZmZzZXQsCi0gICAgY29uc3QgQVJNX1ZMQzMyICpwQ29kZUJvb2sKLSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZpeGVkIGJpdCBsZW5ndGggRW5jb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1QYWNrQml0cwotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAotICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCi0gKiBbaW5dCXBPZmZzZXQJICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAKLSAqICAgICAgICAgICAgICAgICAgICAgIHRvIDcuCi0gKiBbaW5dCWNvZGVXb3JkCQlDb2RlIHdvcmQgdGhhdCBuZWVkIHRvIGJlIGluc2VydGVkIGluIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQotICogW2luXQljb2RlTGVuZ3RoCQlMZW5ndGggb2YgdGhlIGNvZGUgd29yZCB2YWxpZCByYW5nZSAxLi4uMzIKLSAqCi0gKiBbb3V0XSBwcEJpdFN0cmVhbQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKLSAqCSAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAotICoJCQkJCQkJc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdIHBCaXRPZmZzZXQJCSpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKgkJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKgkJCQkJCQkqcHBCaXRTdHJlYW0uCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YX1JFU1VMVCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotIAotT01YUmVzdWx0IGFybVBhY2tCaXRzICgKLSAgICBPTVhfVTggICoqcHBCaXRTdHJlYW0sIAotICAgIE9NWF9JTlQgKnBPZmZzZXQsCi0gICAgT01YX1UzMiBjb2RlV29yZCwgCi0gICAgT01YX0lOVCBjb2RlTGVuZ3RoIAotKTsKLSAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFZhcmlhYmxlIGJpdCBsZW5ndGggRW5jb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1QYWNrVkxDMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBhY2sgYSBWTEMgY29kZSB3b3JkIGludG8gdGhlIGJpdHN0cmVhbQotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtLgotICogW2luXQlwQml0T2Zmc2V0CSAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAKLSAqICAgICAgICAgICAgICAgICAgICAgIHRvIDcuCi0gKiBbaW5dCSBjb2RlICAgICAJCVZMQyBjb2RlIHdvcmQgdGhhdCBuZWVkIHRvIGJlIGluc2VydGVkIGluIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCi0gKgotICogW291dF0gcHBCaXRTdHJlYW0JKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCi0gKgkgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAotICoJCQkJCQlzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqCQkJCQkJY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICoJCQkJCQkqcHBCaXRTdHJlYW0uCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YX1JFU1VMVCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotIAotT01YUmVzdWx0IGFybVBhY2tWTEMzMiAoCi0gICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sIAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgQVJNX1ZMQzMyIGNvZGUgCi0pOwotCi0jZW5kaWYgICAgICAvKl9hcm1Db2RlY19IXyovCi0KLS8qRW5kIG9mIEZpbGUqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvYXJtQ09NTV9WZXJzaW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1DT01NX1ZlcnNpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk5YTQ1MC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9hcm1DT01NX1ZlcnNpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qIEd1YXJkIHRoZSBoZWFkZXIgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24uICovCi0jaWZuZGVmIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18KLSNkZWZpbmUgX19BUk1fQ09NTV9WRVJTSU9OX0hfXwotCi0KLS8qIFRoZSBmb2xsb3dpbmcgbGluZSBzaG91bGQgYmUgaW4gb214dHlwZXMuaCBidXQgaGFzbid0IGJlZW4gYXBwcm92ZWQgYnkgT3Blbk1BWCB5ZXQgKi8KLSNkZWZpbmUgT01YX1ZFUlNJT04gMTAyCi0KLS8qIFdlIG5lZWQgdG8gZGVmaW5lIHRoZXNlIG1hY3JvcyBpbiBvcmRlciB0byBjb252ZXJ0IGEgI2RlZmluZSBudW1iZXIgaW50byBhICNkZWZpbmUgc3RyaW5nLiAqLwotI2RlZmluZSBBUk1fUVVPVEUoYSkgI2EKLSNkZWZpbmUgQVJNX0lORElSRUNUKEEpIEFSTV9RVU9URShBKQotCi0vKiBDb252ZXJ0IHRoZSBPTVhfVkVSU0lPTiBudW1iZXIgaW50byBhIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gcHJpbnQgaXQgb3V0LiAqLwotI2RlZmluZSBBUk1fVkVSU0lPTl9TVFJJTkcgQVJNX0lORElSRUNUKE9NWF9WRVJTSU9OKQotCi0KLS8qIERlZmluZSB0aGlzIGluIG9yZGVyIHRvIHR1cm4gb24gQVJNIHZlcnNpb24vcmVsZWFzZS9idWlsZCBzdHJpbmdzIGluIGVhY2ggZG9tYWluICovCi0jZGVmaW5lIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TCi0KLSNpZmRlZiBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUwotICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teEFDX1ZlcnNpb25EZXNjcmlwdGlvbjsKLSAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhJQ19WZXJzaW9uRGVzY3JpcHRpb247Ci0gIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214SVBfVmVyc2lvbkRlc2NyaXB0aW9uOwotICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teFNQX1ZlcnNpb25EZXNjcmlwdGlvbjsKLSAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhWQ19WZXJzaW9uRGVzY3JpcHRpb247Ci0jZW5kaWYgLyogQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMgKi8KLQotCi0vKiBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCBieSB0aGUgcmVsZWFzZSBzY3JpcHQgKi8KLS8qIFRoZXkgYXJlIHVzZWQgaW4gdGhlIEFSTSB2ZXJzaW9uIHN0cmluZ3MgZGVmaW5lZCBmb3IgZWFjaCBkb21haW4uICAgICAgICAgICAgICovCi0KLS8qIFRoZSByZWxlYXNlIHRhZyBhc3NvY2lhdGVkIHdpdGggdGhpcyByZWxlYXNlIG9mIHRoZSBsaWJyYXJ5LiAtIHVzZWQgZm9yIHNvdXJjZSBhbmQgb2JqZWN0IHJlbGVhc2VzICovCi0jZGVmaW5lIE9NWF9BUk1fUkVMRUFTRV9UQUcgICJyMHAwLTAwYmV0MSIKLQotLyogVGhlIEFSTSBhcmNoaXRlY3R1cmUgdXNlZCB0byBidWlsZCBhbnkgb2JqZWN0cyBvciBleGVjdXRhYmxlcyBpbiB0aGlzIHJlbGVhc2UuICovCi0jZGVmaW5lIE9NWF9BUk1fQlVJTERfQVJDSElURUNUVVJFICJBTlNJIEMiCi0KLS8qIFRoZSBBUk0gVG9vbGNoYWluIHVzZWQgdG8gYnVpbGQgYW55IG9iamVjdHMgb3IgZXhlY3V0YWJsZXMgaW4gdGhpcyByZWxlYXNlLiAqLwotI2RlZmluZSBPTVhfQVJNX0JVSUxEX1RPT0xDSEFJTiAgICAiQVJNIFJWQ1QgMy4xIgotCi0KLSNlbmRpZiAvKiBfX0FSTV9DT01NX1ZFUlNJT05fSF9fICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL2FybU9NWC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvYXJtT01YLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YzBjMjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9hcGkvYXJtT01YLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybU9NWF9SZWxlYXNlVmVyc2lvbi5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogVGhpcyBmaWxlIGFsbG93cyBhIHZlcnNpb24gb2YgdGhlIE9NWCBETCBsaWJyYXJpZXMgdG8gYmUgYnVpbHQgd2hlcmUgc29tZSBvcgotICogYWxsIG9mIHRoZSBmdW5jdGlvbiBuYW1lcyBjYW4gYmUgZ2l2ZW4gYSB1c2VyIHNwZWNpZmllZCBzdWZmaXguIAotICoKLSAqIFlvdSBtaWdodCB3YW50IHRvIHVzZSBpdCB3aGVyZToKLSAqCi0gKiAtIHlvdSB3YW50IHRvIHJlbmFtZSBhIGZ1bmN0aW9uICJvdXQgb2YgdGhlIHdheSIgc28gdGhhdCB5b3UgY291bGQgcmVwbGFjZQotICogICBhIGZ1bmN0aW9uIHdpdGggYSBkaWZmZXJlbnQgdmVyc2lvbiAodGhlIG9yaWdpbmFsIHZlcnNpb24gd291bGQgc3RpbGwgYmUKLSAqICAgaW4gdGhlIGxpYnJhcnkganVzdCB3aXRoIGEgZGlmZmVyZW50IG5hbWUgLSBzbyB5b3UgY291bGQgZGVidWcgdGhlIG5ldwotICogICB2ZXJzaW9uIGJ5IGNvbXBhcmluZyBpdCB0byB0aGUgb3V0cHV0IG9mIHRoZSBvbGQpCi0gKgotICogLSB5b3Ugd2FudCB0byByZW5hbWUgYWxsIHRoZSBmdW5jdGlvbnMgdG8gdmVyc2lvbnMgd2l0aCBhIHN1ZmZpeCBzbyB0aGF0IAotICogICB5b3UgY2FuIGluY2x1ZGUgdHdvIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5IGFuZCBjaG9vc2UgYmV0d2VlbiBmdW5jdGlvbnMKLSAqICAgYXQgcnVudGltZS4KLSAqCi0gKiAgICAgZS5nLiBvbXhJUEJNX0NvcHlfVThfQzFSIGNvdWxkIGJlIHJlbmFtZWQgb214SVBCTV9Db3B5X1U4X0MxUl9Db3J0ZXhBOAotICogCi0gKi8KLQotICAKLSNpZm5kZWYgX2FybU9NWF9IXwotI2RlZmluZSBfYXJtT01YX0hfCi0KLQotLyogV2UgbmVlZCB0byBkZWZpbmUgdGhlc2UgdHdvIG1hY3JvcyBpbiBvcmRlciB0byBleHBhbmQgYW5kIGNvbmNhdGVuYXRlIHRoZSBuYW1lcyAqLwotI2RlZmluZSBPTVhDQVQyQkFSKEEsIEIpIG9teCAjIyBBICMjIEIKLSNkZWZpbmUgT01YQ0FUQkFSKEEsIEIpIE9NWENBVDJCQVIoQSwgQikKLQotLyogRGVmaW5lIHRoZSBzdWZmaXggdG8gYWRkIHRvIGFsbCBmdW5jdGlvbnMgLSB0aGUgZGVmYXVsdCBpcyBubyBzdWZmaXggKi8KLSNkZWZpbmUgQkFSRV9TVUZGSVggCi0KLQotCi0vKiBEZWZpbmUgd2hhdCBoYXBwZW5zIHRvIHRoZSBiYXJlIHN1ZmZpeC1sZXNzIGZ1bmN0aW9ucywgZG93biB0byB0aGUgc3ViLWRvbWFpbiBhY2N1cmFjeSAqLwotI2RlZmluZSBPTVhBQ0FBQ19TVUZGSVggICAgQkFSRV9TVUZGSVggICAKLSNkZWZpbmUgT01YQUNNUDNfU1VGRklYICAgIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWElDSlBfU1VGRklYICAgICBCQVJFX1NVRkZJWAotI2RlZmluZSBPTVhJUEJNX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YSVBDU19TVUZGSVggICAgIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWElQUFBfU1VGRklYICAgICBCQVJFX1NVRkZJWAotI2RlZmluZSBPTVhTUF9TVUZGSVggICAgICAgQkFSRV9TVUZGSVgKLSNkZWZpbmUgT01YVkNDT01NX1NVRkZJWCAgIEJBUkVfU1VGRklYCi0jZGVmaW5lIE9NWFZDTTRQMTBfU1VGRklYICBCQVJFX1NVRkZJWAotI2RlZmluZSBPTVhWQ000UDJfU1VGRklYICAgQkFSRV9TVUZGSVgKLQotCi0KLQotLyogRGVmaW5lIHdoYXQgdGhlIGVhY2ggYmFyZSwgdW4tc3VmZml4ZWQgT3Blbk1BWCBBUEkgZnVuY3Rpb24gbmFtZXMgaXMgdG8gYmUgcmVuYW1lZCAqLwotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVDaGFuUGFpckVsdCAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVDaGFuUGFpckVsdCwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVEYXRTdHJFbHQgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVEYXRTdHJFbHQsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfRGVjb2RlRmlsbEVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlRmlsbEVsdCwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVJc1N0ZXJlb19TMzIgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVJc1N0ZXJlb19TMzIsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfRGVjb2RlTXNQTlNfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlTXNQTlNfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfRGVjb2RlTXNTdGVyZW9fUzMyX0kgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlTXNTdGVyZW9fUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfRGVjb2RlUHJnQ2ZnRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlUHJnQ2ZnRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0RlY29kZVROU19TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZVROU19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19EZWludGVybGVhdmVTcGVjdHJ1bV9TMzIgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWludGVybGVhdmVTcGVjdHJ1bV9TMzIsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfRW5jb2RlVE5TX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRW5jb2RlVE5TX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX0xvbmdUZXJtUHJlZGljdF9TMzIgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0xvbmdUZXJtUHJlZGljdF9TMzIsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfTG9uZ1Rlcm1SZWNvbnN0cnVjdF9TMzJfSSAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTG9uZ1Rlcm1SZWNvbnN0cnVjdF9TMzJfSSwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19NRENURndkX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19NRENURndkX1MzMiwgT01YQUNBQUNfU1VGRklYKQotI2RlZmluZSBvbXhBQ0FBQ19NRENUSW52X1MzMl9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19NRENUSW52X1MzMl9TMTYsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfTm9pc2VsZXNzRGVjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTm9pc2VsZXNzRGVjb2RlLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX1F1YW50SW52X1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX1F1YW50SW52X1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCi0jZGVmaW5lIG9teEFDQUFDX1VucGFja0FESUZIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX1VucGFja0FESUZIZWFkZXIsIE9NWEFDQUFDX1NVRkZJWCkKLSNkZWZpbmUgb214QUNBQUNfVW5wYWNrQURUU0ZyYW1lSGVhZGVyICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfVW5wYWNrQURUU0ZyYW1lSGVhZGVyLCBPTVhBQ0FBQ19TVUZGSVgpCi0KLQotI2RlZmluZSBvbXhBQ01QM19IdWZmbWFuRGVjb2RlX1MzMiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19IdWZmbWFuRGVjb2RlX1MzMiwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19IdWZmbWFuRGVjb2RlU2ZiX1MzMiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19IdWZmbWFuRGVjb2RlU2ZiX1MzMiwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19IdWZmbWFuRGVjb2RlU2ZiTWJwX1MzMiAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19IdWZmbWFuRGVjb2RlU2ZiTWJwX1MzMiwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19NRENUSW52X1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19NRENUSW52X1MzMiwgT01YQUNNUDNfU1VGRklYKQotI2RlZmluZSBvbXhBQ01QM19SZVF1YW50aXplX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19SZVF1YW50aXplX1MzMl9JLCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX1JlUXVhbnRpemVTZmJfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1JlUXVhbnRpemVTZmJfUzMyX0ksIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfU3ludGhQUU1GX1MzMl9TMTYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfU3ludGhQUU1GX1MzMl9TMTYsIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfVW5wYWNrRnJhbWVIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfVW5wYWNrRnJhbWVIZWFkZXIsIE9NWEFDTVAzX1NVRkZJWCkKLSNkZWZpbmUgb214QUNNUDNfVW5wYWNrU2NhbGVGYWN0b3JzX1M4ICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfVW5wYWNrU2NhbGVGYWN0b3JzX1M4LCBPTVhBQ01QM19TVUZGSVgpCi0jZGVmaW5lIG9teEFDTVAzX1VucGFja1NpZGVJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1VucGFja1NpZGVJbmZvLCBPTVhBQ01QM19TVUZGSVgpCi0KLSNkZWZpbmUgb214SUNKUF9Db3B5RXhwYW5kX1U4X0MzICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9Db3B5RXhwYW5kX1U4X0MzLCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RGd2RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RGd2RfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RGd2RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RGd2RfUzE2X0ksIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVEludl9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEludl9TMTYsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVEludl9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEludl9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RfTXVsdGlwbGVfUzE2ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RfTXVsdGlwbGVfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZF9TMTYsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkX1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkX1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZFRhYmxlSW5pdCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZFRhYmxlSW5pdCwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZfTXVsdGlwbGVfUzE2ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZfTXVsdGlwbGVfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludl9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludl9TMTYsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52X1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludlRhYmxlSW5pdCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludlRhYmxlSW5pdCwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRGVjb2RlSHVmZm1hbjh4OF9EaXJlY3RfUzE2X0MxICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRGVjb2RlSHVmZm1hbjh4OF9EaXJlY3RfUzE2X0MxLCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9EZWNvZGVIdWZmbWFuU3BlY0dldEJ1ZlNpemVfVTggICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EZWNvZGVIdWZmbWFuU3BlY0dldEJ1ZlNpemVfVTgsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjSW5pdF9VOCAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjSW5pdF9VOCwgT01YSUNKUF9TVUZGSVgpCi0jZGVmaW5lIG9teElDSlBfRW5jb2RlSHVmZm1hbjh4OF9EaXJlY3RfUzE2X1UxX0MxICAgICAgICAgT01YQ0FUQkFSKElDSlBfRW5jb2RlSHVmZm1hbjh4OF9EaXJlY3RfUzE2X1UxX0MxLCBPTVhJQ0pQX1NVRkZJWCkKLSNkZWZpbmUgb214SUNKUF9FbmNvZGVIdWZmbWFuU3BlY0dldEJ1ZlNpemVfVTggICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9FbmNvZGVIdWZmbWFuU3BlY0dldEJ1ZlNpemVfVTgsIE9NWElDSlBfU1VGRklYKQotI2RlZmluZSBvbXhJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjSW5pdF9VOCAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjSW5pdF9VOCwgT01YSUNKUF9TVUZGSVgpCi0KLSNkZWZpbmUgb214SVBCTV9BZGRDX1U4X0MxUl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9BZGRDX1U4X0MxUl9TZnMsIE9NWElQQk1fU1VGRklYKQotI2RlZmluZSBvbXhJUEJNX0NvcHlfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX0NvcHlfVThfQzFSLCBPTVhJUEJNX1NVRkZJWCkKLSNkZWZpbmUgb214SVBCTV9Db3B5X1U4X0MzUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9Db3B5X1U4X0MzUiwgT01YSVBCTV9TVUZGSVgpCi0jZGVmaW5lIG9teElQQk1fTWlycm9yX1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fTWlycm9yX1U4X0MxUiwgT01YSVBCTV9TVUZGSVgpCi0jZGVmaW5lIG9teElQQk1fTXVsQ19VOF9DMVJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fTXVsQ19VOF9DMVJfU2ZzLCBPTVhJUEJNX1NVRkZJWCkKLQotI2RlZmluZSBvbXhJUENTX0NvbG9yVHdpc3RRMTRfVThfQzNSICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX0NvbG9yVHdpc3RRMTRfVThfQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19CR1I1NjVUb1lDYkNyNDIwTFNfTUNVX1UxNl9TMTZfQzNQM1IgICAgICBPTVhDQVRCQVIoSVBDU19CR1I1NjVUb1lDYkNyNDIwTFNfTUNVX1UxNl9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0JHUjU2NVRvWUNiQ3I0MjJMU19NQ1VfVTE2X1MxNl9DM1AzUiAgICAgIE9NWENBVEJBUihJUENTX0JHUjU2NVRvWUNiQ3I0MjJMU19NQ1VfVTE2X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQkdSNTY1VG9ZQ2JDcjQ0NExTX01DVV9VMTZfUzE2X0MzUDNSICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSNTY1VG9ZQ2JDcjQ0NExTX01DVV9VMTZfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19CR1I4ODhUb1lDYkNyNDIwTFNfTUNVX1U4X1MxNl9DM1AzUiAgICAgICBPTVhDQVRCQVIoSVBDU19CR1I4ODhUb1lDYkNyNDIwTFNfTUNVX1U4X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfQkdSODg4VG9ZQ2JDcjQyMkxTX01DVV9VOF9TMTZfQzNQM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSODg4VG9ZQ2JDcjQyMkxTX01DVV9VOF9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0JHUjg4OFRvWUNiQ3I0NDRMU19NQ1VfVThfUzE2X0MzUDNSICAgICAgIE9NWENBVEJBUihJUENTX0JHUjg4OFRvWUNiQ3I0NDRMU19NQ1VfVThfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFJzekNzY1JvdEJHUl9VOF9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFJzekNzY1JvdEJHUl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBSc3pSb3RfVThfUDNSICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBSc3pSb3RfVThfUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFRvQkdSNTY1X1U4X1UxNl9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFRvQkdSNTY1X1U4X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJSc3pDc2NSb3RCR1JfVThfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJSc3pDc2NSb3RCR1JfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX0NiWUNyWTQyMlJzekNzY1JvdEJHUl9VOF9VMTZfQzJSICAgICAgICAgIE9NWENBVEJBUihJUENTX0NiWUNyWTQyMlJzekNzY1JvdEJHUl9VOF9VMTZfQzJSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlJzelJvdF9VOF9QM1IgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlJzelJvdF9VOF9QM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYllDcjQyMlRvQkdSNTY1X1U4X1UxNl9DMkMzUiAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYllDcjQyMlRvQkdSNTY1X1U4X1UxNl9DMkMzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JZQ3I0MjJUb0JHUjg4OF9VOF9DMkMzUiAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JZQ3I0MjJUb0JHUjg4OF9VOF9DMkMzUiwgT01YSVBDU19TVUZGSVgpCi0jZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19DYllDclk0MjJUb1lDYkNyNDIwUm90YXRlX1U4X0MyUDNSICAgICAgICBPTVhDQVRCQVIoSVBDU19DYllDclk0MjJUb1lDYkNyNDIwUm90YXRlX1U4X0MyUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfUDNSICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfUDNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQ0NFRvQkdSNTY1X1U4X1UxNl9DM1IgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQ0NFRvQkdSNTY1X1U4X1UxNl9DM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKLSNkZWZpbmUgb214SVBDU19ZQ2JDcjQ0NFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQ0NFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQotI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I4ODhfVThfQzNSICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I4ODhfVThfQzNSLCBPTVhJUENTX1NVRkZJWCkKLQotI2RlZmluZSBvbXhJUFBQX0RlYmxvY2tfSG9yRWRnZV9VOF9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0RlYmxvY2tfSG9yRWRnZV9VOF9JLCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9EZWJsb2NrX1ZlckVkZ2VfVThfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9EZWJsb2NrX1ZlckVkZ2VfVThfSSwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfRmlsdGVyRklSX1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRmlsdGVyRklSX1U4X0MxUiwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfRmlsdGVyTWVkaWFuX1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRmlsdGVyTWVkaWFuX1U4X0MxUiwgT01YSVBQUF9TVUZGSVgpCi0jZGVmaW5lIG9teElQUFBfR2V0Q2VudHJhbE1vbWVudF9TNjQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfR2V0Q2VudHJhbE1vbWVudF9TNjQsIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX0dldFNwYXRpYWxNb21lbnRfUzY0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0dldFNwYXRpYWxNb21lbnRfUzY0LCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9Nb21lbnRHZXRTdGF0ZVNpemUgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9Nb21lbnRHZXRTdGF0ZVNpemUsIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX01vbWVudEluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudEluaXQsIE9NWElQUFBfU1VGRklYKQotI2RlZmluZSBvbXhJUFBQX01vbWVudHNfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudHNfVThfQzFSLCBPTVhJUFBQX1NVRkZJWCkKLSNkZWZpbmUgb214SVBQUF9Nb21lbnRzX1U4X0MzUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9Nb21lbnRzX1U4X0MzUiwgT01YSVBQUF9TVUZGSVgpCi0KLSNkZWZpbmUgb214U1BfQmxvY2tFeHBfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfQmxvY2tFeHBfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0Jsb2NrRXhwX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0Jsb2NrRXhwX1MzMiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9Db3B5X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9Db3B5X1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9Eb3RQcm9kX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9Eb3RQcm9kX1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9Eb3RQcm9kX1MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9Eb3RQcm9kX1MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZURndkX0NUb0NfU0MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX0NUb0NfU0MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZURndkX0NUb0NfU0MzMl9TZnMgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX0NUb0NfU0MzMl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZURndkX1JUb0NDU19TMTZTMzJfU2ZzICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX1JUb0NDU19TMTZTMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEZ3ZF9SVG9DQ1NfUzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9SVG9DQ1NfUzMyX1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRHZXRCdWZTaXplX0NfU0MxNiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRHZXRCdWZTaXplX0NfU0MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRHZXRCdWZTaXplX0NfU0MzMiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRHZXRCdWZTaXplX0NfU0MzMiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRHZXRCdWZTaXplX1JfUzE2UzMyICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRHZXRCdWZTaXplX1JfUzE2UzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfUl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfUl9TMzIsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUSW5pdF9DX1NDMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW5pdF9DX1NDMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUSW5pdF9DX1NDMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW5pdF9DX1NDMzIsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUSW5pdF9SX1MxNlMzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW5pdF9SX1MxNlMzMiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbml0X1JfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X1JfUzMyLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZGVEludl9DQ1NUb1JfUzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DQ1NUb1JfUzMyX1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GRlRJbnZfQ0NTVG9SX1MzMlMxNl9TZnMgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ0NTVG9SX1MzMlMxNl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUSW52X0NUb0NfU0MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NUb0NfU0MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRkZUSW52X0NUb0NfU0MzMl9TZnMgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NUb0NfU0MzMl9TZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRmlsdGVyTWVkaWFuX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRmlsdGVyTWVkaWFuX1MzMiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GaWx0ZXJNZWRpYW5fUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GaWx0ZXJNZWRpYW5fUzMyX0ksIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNl9JU2ZzICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNl9JU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2X1NmcywgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0lTZnMgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0lTZnMsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0lJUl9CaVF1YWREaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUl9CaVF1YWREaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0lJUl9CaVF1YWREaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUl9CaVF1YWREaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlSX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKLSNkZWZpbmUgb214U1BfSUlSX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9JSVJPbmVfQmlRdWFkRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJPbmVfQmlRdWFkRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQotI2RlZmluZSBvbXhTUF9JSVJPbmVfQmlRdWFkRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJPbmVfQmlRdWFkRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0lJUk9uZV9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCi0jZGVmaW5lIG9teFNQX0lJUk9uZV9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKLQotI2RlZmluZSBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQXZlcmFnZV8xNngsIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9BdmVyYWdlXzh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9BdmVyYWdlXzh4LCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrLCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX0NvcHkxNngxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0NvcHkxNngxNiwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX0NvcHk4eDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0NvcHk4eDgsIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9FeHBhbmRGcmFtZV9JLCBPTVhWQ0NPTU1fU1VGRklYKQotI2RlZmluZSBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fTGltaXRNVlRvUmVjdCwgT01YVkNDT01NX1NVRkZJWCkKLSNkZWZpbmUgb214VkNDT01NX1NBRF8xNnggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX1NBRF8xNngsIE9NWFZDQ09NTV9TVUZGSVgpCi0jZGVmaW5lIG9teFZDQ09NTV9TQURfOHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9TQURfOHgsIE9NWFZDQ09NTV9TVUZGSVgpCi0KLSNkZWZpbmUgb214VkNNNFAxMF9BdmVyYWdlXzR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9BdmVyYWdlXzR4LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9CbG9ja01hdGNoX0hhbGYsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWJsb2NrQ2hyb21hX0ksIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlYmxvY2tMdW1hX0ksIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCBPTVhDQVRCQVIoVkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfR2V0VkxDSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfR2V0VkxDSW5mbywgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQyAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX01FR2V0QnVmU2l6ZSwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfTUVJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfTUVJbml0LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDgsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1NBRF80eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBRF80eCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfU0FEUXVhcl8xNnggICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEUXVhcl8xNngsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1NBRFF1YXJfNHggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBRFF1YXJfNHgsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1NBRFF1YXJfOHggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBRFF1YXJfOHgsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1NBVERfNHg0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBVERfNHg0LCBPTVhWQ000UDEwX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciwgT01YVkNNNFAxMF9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMsIE9NWFZDTTRQMTBfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCi0KLSNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDggICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDgsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4LCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRENUOHg4YmxrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRENUOHg4YmxrLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlciAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlciwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVNViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVNViwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCi0jZGVmaW5lIG9teFZDTTRQMl9GaW5kTVZwcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9GaW5kTVZwcmVkLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfSURDVDh4OGJsayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfSURDVDh4OGJsaywgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX01DUmVjb25CbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX01DUmVjb25CbG9jaywgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX01FR2V0QnVmU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX01FR2V0QnVmU2l6ZSwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX01FSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX01FSW5pdCwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX1F1YW50SW50ZXJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1F1YW50SW50ZXJfSSwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX1F1YW50SW50cmFfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1F1YW50SW50cmFfSSwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1F1YW50SW52SW50ZXJfSSwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1F1YW50SW52SW50cmFfSSwgT01YVkNNNFAyX1NVRkZJWCkKLSNkZWZpbmUgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyLCBPTVhWQ000UDJfU1VGRklYKQotI2RlZmluZSBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEsIE9NWFZDTTRQMl9TVUZGSVgpCi0KLQotI2VuZGlmIC8qIF9hcm1PTVhfaF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL29teHR5cGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2FwaS9vbXh0eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTJjYjBkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvYXBpL29teHR5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqCi0gKiBGaWxlOiBvbXh0eXBlcy5oCi0gKiBCcmllZjogRGVmaW5lcyBiYXNpYyBEYXRhIHR5cGVzIHVzZWQgaW4gT3Blbk1BWCB2MS4wLjIgaGVhZGVyIGZpbGVzLgotICoKLSAqIENvcHlyaWdodCCpIDIwMDUtMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICoKLSAqIFRoZXNlIG1hdGVyaWFscyBhcmUgcHJvdGVjdGVkIGJ5IGNvcHlyaWdodCBsYXdzIGFuZCBjb250YWluIG1hdGVyaWFsIAotICogcHJvcHJpZXRhcnkgdG8gdGhlIEtocm9ub3MgR3JvdXAsIEluYy4gIFlvdSBtYXkgdXNlIHRoZXNlIG1hdGVyaWFscyAKLSAqIGZvciBpbXBsZW1lbnRpbmcgS2hyb25vcyBzcGVjaWZpY2F0aW9ucywgd2l0aG91dCBhbHRlcmluZyBvciByZW1vdmluZyAKLSAqIGFueSB0cmFkZW1hcmssIGNvcHlyaWdodCBvciBvdGhlciBub3RpY2UgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbi4KLSAqIAotICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCByZXByZXNlbnRhdGlvbnMgCi0gKiBvciB3YXJyYW50aWVzLCBleHByZXNzIG9yIGltcGxpZWQsIHJlZ2FyZGluZyB0aGVzZSBtYXRlcmlhbHMsIGluY2x1ZGluZywgCi0gKiB3aXRob3V0IGxpbWl0YXRpb24sIGFueSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IG9yIGZpdG5lc3MgCi0gKiBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2Ugb3Igbm9uLWluZnJpbmdlbWVudCBvZiBhbnkgaW50ZWxsZWN0dWFsIHByb3BlcnR5LiAKLSAqIEtocm9ub3MgR3JvdXAgbWFrZXMgbm8sIGFuZCBleHByZXNzbHkgZGlzY2xhaW1zIGFueSwgd2FycmFudGllcywgZXhwcmVzcyAKLSAqIG9yIGltcGxpZWQsIHJlZ2FyZGluZyB0aGUgY29ycmVjdG5lc3MsIGFjY3VyYWN5LCBjb21wbGV0ZW5lc3MsIHRpbWVsaW5lc3MsIAotICogYW5kIHJlbGlhYmlsaXR5IG9mIHRoZXNlIG1hdGVyaWFscy4gCi0gKgotICogVW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyB3aWxsIHRoZSBLaHJvbm9zIEdyb3VwLCBvciBhbnkgb2YgaXRzIFByb21vdGVycywgCi0gKiBDb250cmlidXRvcnMgb3IgTWVtYmVycyBvciB0aGVpciByZXNwZWN0aXZlIHBhcnRuZXJzLCBvZmZpY2VycywgZGlyZWN0b3JzLCAKLSAqIGVtcGxveWVlcywgYWdlbnRzIG9yIHJlcHJlc2VudGF0aXZlcyBiZSBsaWFibGUgZm9yIGFueSBkYW1hZ2VzLCB3aGV0aGVyIAotICogZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgZm9yIGxvc3QgcmV2ZW51ZXMsIAotICogbG9zdCBwcm9maXRzLCBvciBvdGhlcndpc2UsIGFyaXNpbmcgZnJvbSBvciBpbiBjb25uZWN0aW9uIHdpdGggdGhlc2UgCi0gKiBtYXRlcmlhbHMuCi0gKiAKLSAqIEtocm9ub3MgYW5kIE9wZW5NQVggYXJlIHRyYWRlbWFya3Mgb2YgdGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKLSAqCi0gKi8KLSAgCi0jaWZuZGVmIF9PTVhUWVBFU19IXwotI2RlZmluZSBfT01YVFlQRVNfSF8KLQotI2luY2x1ZGUgPGxpbWl0cy5oPiAKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2RlZmluZSBPTVhfSU4KLSNkZWZpbmUgT01YX09VVAotI2RlZmluZSBPTVhfSU5PVVQKLQotCi10eXBlZGVmIGVudW0gewotICAgIAotICAgIC8qIE1hbmRhdG9yeSByZXR1cm4gY29kZXMgLSB1c2UgY2FzZXMgYXJlIGV4cGxpY2l0bHkgZGVzY3JpYmVkIGZvciBlYWNoIGZ1bmN0aW9uICovCi0gICAgT01YX1N0c19Ob0VyciAgICAgICAgICAgICAgICAgICAgPSAgMCwgICAgLyogTm8gZXJyb3IsIHRoZSBmdW5jdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5ICovCi0gICAgT01YX1N0c19FcnIgICAgICAgICAgICAgICAgICAgICAgPSAtMiwgICAgLyogVW5rbm93bi91bnNwZWNpZmllZCBlcnJvciAqLyAgICAKLSAgICBPTVhfU3RzX0ludmFsaWRCaXRzdHJlYW1WYWxFcnIgICA9IC0xODIsICAvKiBJbnZhbGlkIHZhbHVlIGRldGVjdGVkIGR1cmluZyBiaXRzdHJlYW0gcHJvY2Vzc2luZyAqLyAgICAKLSAgICBPTVhfU3RzX01lbUFsbG9jRXJyICAgICAgICAgICAgICA9IC05LCAgICAvKiBOb3QgZW5vdWdoIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBvcGVyYXRpb24gKi8KLSAgICBPTVhfU3RzQUNBQUNfR2FpbkN0ckVyciAgICAJICAgICA9IC0xNTksICAvKiBBQUM6IFVuc3VwcG9ydGVkIGdhaW4gY29udHJvbCBkYXRhIGRldGVjdGVkICovCi0gICAgT01YX1N0c0FDQUFDX1ByZ051bUVyciAgICAgICAgICAgPSAtMTY3LCAgLyogQUFDOiBJbnZhbGlkIG51bWJlciBvZiBlbGVtZW50cyBmb3Igb25lIHByb2dyYW0gICAqLwotICAgIE9NWF9TdHNBQ0FBQ19Db2VmVmFsRXJyICAgICAgICAgID0gLTE2MywgIC8qIEFBQzogSW52YWxpZCBxdWFudGl6ZWQgY29lZmZpY2llbnQgdmFsdWUgICAgICAgICAgKi8gICAgIAotICAgIE9NWF9TdHNBQ0FBQ19NYXhTZmJFcnIgICAgICAgICAgID0gLTE2MiwgIC8qIEFBQzogSW52YWxpZCBtYXhTZmIgdmFsdWUgaW4gcmVsYXRpb24gdG8gbnVtU3diICovICAgIAotCU9NWF9TdHNBQ0FBQ19QbHNEYXRhRXJyCQkgICAgID0gLTE2MCwgIC8qIEFBQzogcHVsc2UgZXNjYXBlIHNlcXVlbmNlIGRhdGEgZXJyb3IgKi8KLQotICAgIC8qIE9wdGlvbmFsIHJldHVybiBjb2RlcyAtIHVzZSBjYXNlcyBhcmUgZXhwbGljaXRseSBkZXNjcmliZWQgZm9yIGVhY2ggZnVuY3Rpb24qLwotICAgIE9NWF9TdHNfQmFkQXJnRXJyICAgICAgICAgICAgICAgID0gLTUsICAgIC8qIEJhZCBBcmd1bWVudHMgKi8KLQotICAgIE9NWF9TdHNBQ0FBQ19UbnNOdW1GaWx0RXJyICAgICAgID0gLTE1NywgIC8qIEFBQzogSW52YWxpZCBudW1iZXIgb2YgVE5TIGZpbHRlcnMgICovCi0gICAgT01YX1N0c0FDQUFDX1Ruc0xlbkVyciAgICAgICAgICAgPSAtMTU2LCAgLyogQUFDOiBJbnZhbGlkIFROUyByZWdpb24gbGVuZ3RoICAqLyAgIAotICAgIE9NWF9TdHNBQ0FBQ19UbnNPcmRlckVyciAgICAgICAgID0gLTE1NSwgIC8qIEFBQzogSW52YWxpZCBvcmRlciBvZiBUTlMgZmlsdGVyICAqLyAgICAgICAgICAgICAgICAgIAotICAgIE9NWF9TdHNBQ0FBQ19UbnNDb2VmUmVzRXJyICAgICAgID0gLTE1NCwgIC8qIEFBQzogSW52YWxpZCBiaXQtcmVzb2x1dGlvbiBmb3IgVE5TIGZpbHRlciBjb2VmZmljaWVudHMgICovCi0gICAgT01YX1N0c0FDQUFDX1Ruc0NvZWZFcnIgICAgICAgICAgPSAtMTUzLCAgLyogQUFDOiBJbnZhbGlkIFROUyBmaWx0ZXIgY29lZmZpY2llbnRzICAqLyAgICAgICAgICAgICAgICAgIAotICAgIE9NWF9TdHNBQ0FBQ19UbnNEaXJlY3RFcnIgICAgICAgID0gLTE1MiwgIC8qIEFBQzogSW52YWxpZCBUTlMgZmlsdGVyIGRpcmVjdGlvbiAgKi8gIAotCi0gICAgT01YX1N0c0lDSlBfSlBFR01hcmtlckVyciAgICAgICAgPSAtMTgzLCAgLyogSlBFRyBtYXJrZXIgZW5jb3VudGVyZWQgd2l0aGluIGFuIGVudHJvcHktY29kZWQgYmxvY2s7ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSHVmZm1hbiBkZWNvZGluZyBvcGVyYXRpb24gdGVybWluYXRlZCBlYXJseS4gICAgICAgICAgICovCi0gICAgT01YX1N0c0lDSlBfSlBFR01hcmtlciAgICAgICAgICAgPSAtMTgxLCAgLyogSlBFRyBtYXJrZXIgZW5jb3VudGVyZWQ7IEh1ZmZtYW4gZGVjb2RpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGVyYXRpb24gdGVybWluYXRlZCBlYXJseS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBPTVhfU3RzSVBQUF9Db250ZXh0TWF0Y2hFcnIgICAgICA9IC0xNywgICAvKiBDb250ZXh0IHBhcmFtZXRlciBkb2Vzbid0IG1hdGNoIHRvIHRoZSBvcGVyYXRpb24gKi8KLQotICAgIE9NWF9TdHNTUF9FdmVuTWVkaWFuTWFza1NpemVFcnIgID0gLTE4MCwgIC8qIEV2ZW4gc2l6ZSBvZiB0aGUgTWVkaWFuIEZpbHRlciBtYXNrIHdhcyByZXBsYWNlZCBieSB0aGUgb2RkIG9uZSAqLwotCi0gICAgT01YX1N0c19NYXhpbXVtRW51bWVyYXRpb24gICAgICAgPSBJTlRfTUFYICAvKlBsYWNlaG9sZGVyLCBmb3JjZXMgZW51bSBvZiBzaXplIE9NWF9JTlQqLwotICAgIAotIH0gT01YUmVzdWx0OyAgICAgICAgICAvKiogUmV0dXJuIHZhbHVlIG9yIGVycm9yIHZhbHVlIHJldHVybmVkIGZyb20gYSBmdW5jdGlvbi4gSWRlbnRpY2FsIHRvIE9NWF9JTlQgKi8KLQotIAotLyogT01YX1U4ICovCi10eXBlZGVmIHVpbnQ4X3QgT01YX1U4OwotIAotLyogT01YX1M4ICovCi10eXBlZGVmIGludDhfdCBPTVhfUzg7Ci0gCi0vKiBPTVhfVTE2ICovCi10eXBlZGVmIHVpbnQxNl90IE9NWF9VMTY7Ci0KLS8qIE9NWF9TMTYgKi8KLXR5cGVkZWYgaW50MTZfdCBPTVhfUzE2OwotCi0vKiBPTVhfVTMyICovCi10eXBlZGVmIHVpbnQzMl90IE9NWF9VMzI7Ci0KLS8qIE9NWF9TMzIgKi8KLXR5cGVkZWYgaW50MzJfdCBPTVhfUzMyOwotCi0vKiBPTVhfVTY0ICYgT01YX1M2NCAqLwotI2lmIGRlZmluZWQoIF9XSU4zMiApIHx8IGRlZmluZWQgKCBfV0lONjQgKQotICAgIHR5cGVkZWYgX19pbnQ2NCBPTVhfUzY0OyAvKiogU2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCi0gICAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IE9NWF9VNjQ7IC8qKiBVbnNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLwotICAgICNkZWZpbmUgT01YX01JTl9TNjQJCQkoMHg4MDAwMDAwMDAwMDAwMDAwaTY0KQotICAgICNkZWZpbmUgT01YX01JTl9VNjQJCQkoMHgwMDAwMDAwMDAwMDAwMDAwaTY0KQotICAgICNkZWZpbmUgT01YX01BWF9TNjQJCQkoMHg3RkZGRkZGRkZGRkZGRkZGaTY0KQotICAgICNkZWZpbmUgT01YX01BWF9VNjQJCQkoMHhGRkZGRkZGRkZGRkZGRkZGaTY0KQotI2Vsc2UKLSAgICB0eXBlZGVmIGludDY0X3QgT01YX1M2NDsgLyoqIFNpZ25lZCA2NC1iaXQgaW50ZWdlciAqLwotICAgIHR5cGVkZWYgdWludDY0X3QgT01YX1U2NDsgLyoqIFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCi0gICAgI2RlZmluZSBPTVhfTUlOX1M2NAkJCSgweDgwMDAwMDAwMDAwMDAwMDBMTCkKLSAgICAjZGVmaW5lIE9NWF9NSU5fVTY0CQkJKDB4MDAwMDAwMDAwMDAwMDAwMExMKQotICAgICNkZWZpbmUgT01YX01BWF9TNjQJCQkoMHg3RkZGRkZGRkZGRkZGRkZGTEwpCi0gICAgI2RlZmluZSBPTVhfTUFYX1U2NAkJCSgweEZGRkZGRkZGRkZGRkZGRkZMTCkKLSNlbmRpZgotCi0vKiBPTVhfU0M4ICovCi10eXBlZGVmIHN0cnVjdAotewotICBPTVhfUzggUmU7IC8qKiBSZWFsIHBhcnQgKi8KLSAgT01YX1M4IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCi0JCi19IE9NWF9TQzg7IC8qKiBTaWduZWQgOC1iaXQgY29tcGxleCBudW1iZXIgKi8KLQotCi0vKiBPTVhfU0MxNiAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgT01YX1MxNiBSZTsgLyoqIFJlYWwgcGFydCAqLwotICBPTVhfUzE2IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCi0JCi19IE9NWF9TQzE2OyAvKiogU2lnbmVkIDE2LWJpdCBjb21wbGV4IG51bWJlciAqLwotCi0KLS8qIE9NWF9TQzMyICovCi10eXBlZGVmIHN0cnVjdAotewotICBPTVhfUzMyIFJlOyAvKiogUmVhbCBwYXJ0ICovCi0gIE9NWF9TMzIgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKLQkKLX0gT01YX1NDMzI7IC8qKiBTaWduZWQgMzItYml0IGNvbXBsZXggbnVtYmVyICovCi0KLQotLyogT01YX1NDNjQgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE9NWF9TNjQgUmU7IC8qKiBSZWFsIHBhcnQgKi8KLSAgT01YX1M2NCBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQotCQotfSBPTVhfU0M2NDsgLyoqIFNpZ25lZCA2NC1iaXQgY29tcGxleCBudW1iZXIgKi8KLQotCi0vKiBPTVhfRjMyICovCi10eXBlZGVmIGZsb2F0IE9NWF9GMzI7IC8qKiBTaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50LElFRUUgNzU0ICovCi0KLQotLyogT01YX0Y2NCAqLwotdHlwZWRlZiBkb3VibGUgT01YX0Y2NDsgLyoqIERvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQsSUVFRSA3NTQgKi8KLQotCi0vKiBPTVhfSU5UICovCi10eXBlZGVmIGludCBPTVhfSU5UOyAvKiogc2lnbmVkIGludGVnZXIgY29ycmVzcG9uZGluZyB0byBtYWNoaW5lIHdvcmQgbGVuZ3RoLCBoYXMgbWF4aW11bSBzaWduZWQgdmFsdWUgSU5UX01BWCovCi0KLQotI2RlZmluZSBPTVhfTUlOX1M4ICAJICAgCSgtMTI4KQotI2RlZmluZSBPTVhfTUlOX1U4ICAJCTAKLSNkZWZpbmUgT01YX01JTl9TMTYJCSAJKC0zMjc2OCkKLSNkZWZpbmUgT01YX01JTl9VMTYJCQkwCi0jZGVmaW5lIE9NWF9NSU5fUzMyCQkJKC0yMTQ3NDgzNjQ3LTEpCi0jZGVmaW5lIE9NWF9NSU5fVTMyCQkJMAotCi0jZGVmaW5lIE9NWF9NQVhfUzgJCQkoMTI3KQotI2RlZmluZSBPTVhfTUFYX1U4CQkJKDI1NSkKLSNkZWZpbmUgT01YX01BWF9TMTYJCQkoMzI3NjcpCi0jZGVmaW5lIE9NWF9NQVhfVTE2CQkJKDB4RkZGRikKLSNkZWZpbmUgT01YX01BWF9TMzIJCQkoMjE0NzQ4MzY0NykKLSNkZWZpbmUgT01YX01BWF9VMzIJCQkoMHhGRkZGRkZGRikKLQotdHlwZWRlZiB2b2lkIE9NWFZvaWQ7Ci0KLSNpZm5kZWYgTlVMTAotI2RlZmluZSBOVUxMICgodm9pZCopMCkKLSNlbmRpZgotCi0vKiogRGVmaW5lcyB0aGUgZ2VvbWV0cmljIHBvc2l0aW9uIGFuZCBzaXplIG9mIGEgcmVjdGFuZ2xlLCAKLSAgKiB3aGVyZSB4LHkgZGVmaW5lcyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHRvcCBsZWZ0IGNvcm5lcgotICAqIG9mIHRoZSByZWN0YW5nbGUsIHdpdGggZGltZW5zaW9ucyB3aWR0aCBpbiB0aGUgeC1kaXJlY3Rpb24gCi0gICogYW5kIGhlaWdodCBpbiB0aGUgeS1kaXJlY3Rpb24gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQlPTVhfSU5UIHg7ICAgICAgLyoqIHgtY29vcmRpbmF0ZSBvZiB0b3AgbGVmdCBjb3JuZXIgb2YgcmVjdGFuZ2xlICovCi0JT01YX0lOVCB5OyAgICAgIC8qKiB5LWNvb3JkaW5hdGUgb2YgdG9wIGxlZnQgY29ybmVyIG9mIHJlY3RhbmdsZSAqLwotCU9NWF9JTlQgd2lkdGg7ICAvKiogV2lkdGggaW4gdGhlIHgtZGlyZWN0aW9uLiAqLwotCU9NWF9JTlQgaGVpZ2h0OyAvKiogSGVpZ2h0IGluIHRoZSB5LWRpcmVjdGlvbi4gKi8KLX1PTVhSZWN0OwotCi0KLS8qKiBEZWZpbmVzIHRoZSBnZW9tZXRyaWMgcG9zaXRpb24gb2YgYSBwb2ludCwgKi8KLXR5cGVkZWYgc3RydWN0IAotewotIE9NWF9JTlQgeDsgLyoqIHgtY29vcmRpbmF0ZSAqLwotIE9NWF9JTlQgeTsJLyoqIHktY29vcmRpbmF0ZSAqLwotCQotfSBPTVhQb2ludDsKLQotCi0vKiogRGVmaW5lcyB0aGUgZGltZW5zaW9ucyBvZiBhIHJlY3RhbmdsZSwgb3IgcmVnaW9uIG9mIGludGVyZXN0IGluIGFuIGltYWdlICovCi10eXBlZGVmIHN0cnVjdCAKLXsKLSBPTVhfSU5UIHdpZHRoOyAgLyoqIFdpZHRoIG9mIHRoZSByZWN0YW5nbGUsIGluIHRoZSB4LWRpcmVjdGlvbiAqLwotIE9NWF9JTlQgaGVpZ2h0OyAvKiogSGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUsIGluIHRoZSB5LWRpcmVjdGlvbiAqLwotCQotfSBPTVhTaXplOwotCi0jZW5kaWYgLyogX09NWFRZUEVTX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2J1aWxkX3ZjLnBsIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9idWlsZF92Yy5wbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTU5Y2RlZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2J1aWxkX3ZjLnBsCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLSMhL3Vzci9iaW4vcGVybAotIwotIyAKLSMgRmlsZSBOYW1lOiAgYnVpbGRfdmMucGwKLSMgT3Blbk1BWCBETDogdjEuMC4yCi0jIFJldmlzaW9uOiAgIDk2NDEKLSMgRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSMgCi0jIAotIyAKLSMKLSMgVGhpcyBmaWxlIGJ1aWxkcyB0aGUgT3Blbk1BWCBETCB2YyBkb21haW4gbGlicmFyeSBvbXhWQy5vLgotIwotCi11c2UgRmlsZTo6U3BlYzsKLXVzZSBzdHJpY3Q7Ci0KLW15ICgkQ0MsICRDQ19PUFRTLCAkQVMsICRBU19PUFRTLCAkTElCLCAkTElCX09QVFMsICRMSUJfVFlQRSk7Ci0KLSRDQyAgICAgICA9ICdhcm1jYyc7Ci0kQ0NfT1BUUyAgPSAnLS1ub191bmFsaWduZWRfYWNjZXNzIC0tY3B1IEFSTTdURE1JIC1jJzsKLSRBUyAgICAgICA9ICdhcm1hc20nOwotJEFTX09QVFMgID0gJy0tbm9fdW5hbGlnbmVkX2FjY2VzcyAtLWNwdSBBUk03VERNSSc7Ci0jICRMSUIgICAgICA9ICdhcm1saW5rJzsKLSMgJExJQl9PUFRTID0gJy0tcGFydGlhbCAtbyc7Ci0jICRMSUJfVFlQRSA9ICcubyc7Ci0kTElCICAgICAgPSAnYXJtYXInOwotJExJQl9PUFRTID0gJy0tY3JlYXRlIC1yJzsKLSRMSUJfVFlQRSA9ICcuYSc7Ci0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbXkgKEBoZWFkZXJsaXN0LCBAZmlsZWxpc3QsICRoZCwgJGZpbGUsICRvZmlsZSwgJGNvbW1hbmQsICRvYmpsaXN0LCAkbGliZmlsZSwgJGgpOwotCi0jIERlZmluZSB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyBjb250YWluaW5nIGluY2x1ZGVkIGhlYWRlciBmaWxlcy4KLUBoZWFkZXJsaXN0ID0gcXcoYXBpIHZjL2FwaSB2Yy9tNHAyL2FwaSB2Yy9tNHAxMC9hcGkpOwotCi0jIERlZmluZSB0aGUgbGlzdCBvZiBzb3VyY2UgZmlsZXMgdG8gY29tcGlsZS4KLW9wZW4oRklMRVMsICc8ZmlsZWxpc3RfdmMudHh0Jykgb3IgZGllKCJDYW4ndCBvcGVuIHNvdXJjZSBmaWxlIGxpc3RcbiIpOwotQGZpbGVsaXN0ID0gPEZJTEVTPjsKLWNsb3NlKEZJTEVTKTsKLQotIyBGaXggdGhlIGZpbGUgc2VwYXJhdG9ycyBpbiB0aGUgaGVhZGVyIHBhdGhzCi1mb3JlYWNoICRoIChAaGVhZGVybGlzdCkKLXsKLSAgICAgICAgJGggPSBGaWxlOjpTcGVjLT5jYW5vbnBhdGgoJGgpOwotfQotCi0jIENyZWF0ZSB0aGUgaW5jbHVkZSBwYXRoIHRvIGJlIHBhc3NlZCB0byB0aGUgY29tcGlsZXIKLSRoZCA9ICctSScgLiBqb2luKCcgLUknLCBAaGVhZGVybGlzdCk7Ci0KLSMgQ3JlYXRlIHRoZSBidWlsZCBkaXJlY3RvcmllcyAiL2xpYi8iIGFuZCAiL29iai8iIChpZiB0aGV5IGFyZSBub3QgdGhlcmUgYWxyZWFkeSkKLW1rZGlyICJvYmoiLCAwNzc3IGlmICghIC1kICJvYmoiKTsKLW1rZGlyICJsaWIiLCAwNzc3IGlmICghIC1kICJsaWIiKTsKLQotJG9iamxpc3QgPSAnJzsKLQotIyBDb21waWxlIGVhY2ggZmlsZQotZm9yZWFjaCAkZmlsZSAoQGZpbGVsaXN0KQotewotCW15ICRmOwotCW15ICRiYXNlOwotCW15ICRleHQ7Ci0JbXkgJG9iamZpbGU7Ci0KLQljaG9tcCgkZmlsZSk7Ci0JJGZpbGUgPSBGaWxlOjpTcGVjLT5jYW5vbnBhdGgoJGZpbGUpOwotCi0JKHVuZGVmLCB1bmRlZiwgJGYpID0gRmlsZTo6U3BlYy0+c3BsaXRwYXRoKCRmaWxlKTsKLQlpZigoJGJhc2UsICRleHQpID0gJGYgPX4gLyguKylcLihcdykkLykKLQl7Ci0JCSRvYmpmaWxlID0gRmlsZTo6U3BlYy0+Y2F0ZmlsZSgnb2JqJywgJGJhc2UuJy5vJyk7Ci0KLQkJaWYoJGV4dCBlcSAnYycpCi0JCXsKLQkJCSRvYmpsaXN0IC49ICIkb2JqZmlsZSAiOwotCQkJJGNvbW1hbmQgPSAkQ0MuJyAnLiRDQ19PUFRTLicgJy4kaGQuJyAtbyAnLiRvYmpmaWxlLicgJy4kZmlsZTsKLQkJCXByaW50ICIkY29tbWFuZFxuIjsKLQkJCXN5c3RlbSgkY29tbWFuZCk7Ci0JCX0KLQkJZWxzaWYoJGV4dCBlcSAncycpCi0JCXsKLQkJCSRvYmpsaXN0IC49ICIkb2JqZmlsZSAiOwotCQkJJGNvbW1hbmQgPSAkQVMuJyAnLiRBU19PUFRTLicgJy4kaGQuJyAtbyAnLiRvYmpmaWxlLicgJy4kZmlsZTsKLQkJCXByaW50ICIkY29tbWFuZFxuIjsKLQkJCXN5c3RlbSgkY29tbWFuZCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwcmludCAiSWdub3JpbmcgZmlsZTogJGZcbiI7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJZGllICJObyBmaWxlIGV4dGVuc2lvbiBmb3VuZDogJGZcbiI7Ci0JfQotfQotCi0jIERvIHRoZSBmaW5hbCBsaW5rIHN0YWdlIHRvIGNyZWF0ZSB0aGUgbGlicmFyaWVzLgotJGxpYmZpbGUgPSBGaWxlOjpTcGVjLT5jYXRmaWxlKCdsaWInLCAnb214VkMnLiRMSUJfVFlQRSk7Ci0kY29tbWFuZCA9ICRMSUIuJyAnLiRMSUJfT1BUUy4nICcuJGxpYmZpbGUuJyAnLiRvYmpsaXN0OwotcHJpbnQgIiRjb21tYW5kXG4iOwotKHN5c3RlbSgkY29tbWFuZCkgPT0gMCkgYW5kIHByaW50ICJCdWlsZCBzdWNjZXNzZnVsXG4iOwotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL2ZpbGVsaXN0X3ZjLnR4dCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvZmlsZWxpc3RfdmMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmYzNGFjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvZmlsZWxpc3RfdmMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS4vYXBpL2FybUNPTU0uaAotLi9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaAotLi9hcGkvYXJtQ09NTV9WZXJzaW9uLmgKLS4vYXBpL2FybU9NWF9SZWxlYXNlVmVyc2lvbi5oCi0uL2FwaS9vbXh0eXBlcy5oCi0uL3NyYy9hcm1DT01NLmMKLS4vc3JjL2FybUNPTU1fQml0c3RyZWFtLmMKLS4vdmMvYXBpL2FybVZDLmgKLS4vdmMvYXBpL29teFZDLmgKLS4vdmMvY29tbS9zcmMvYXJtVkNDT01NX0F2ZXJhZ2UuYwotLi92Yy9jb21tL3NyYy9hcm1WQ0NPTU1fU0FELmMKLS4vdmMvY29tbS9zcmMvb214VkNDT01NX0F2ZXJhZ2VfMTZ4LmMKLS4vdmMvY29tbS9zcmMvb214VkNDT01NX0F2ZXJhZ2VfOHguYwotLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrLmMKLS4vdmMvY29tbS9zcmMvb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQuYwotLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2LmMKLS4vdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHk4eDguYwotLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSS5jCi0uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9MaW1pdE1WVG9SZWN0LmMKLS4vdmMvY29tbS9zcmMvb214VkNDT01NX1NBRF8xNnguYwotLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fU0FEXzh4LmMKLS4vdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NVi5jCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlQmxvY2tQaXhlbC5jCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpci5jCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXMuYwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9Gd2RUcmFuc2Zvcm1SZXNpZHVhbDR4NC5jCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYS5jCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEuYwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEuYwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYS5jCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQuYwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlcy5jCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1NBRFF1YXIuYwotLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NC5jCi0uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrMngyLmMKLS4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9BdmVyYWdlXzR4LmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSS5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSS5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSS5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0dldFZMQ0luZm8uYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZC5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01FR2V0QnVmU2l6ZS5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01FSW5pdC5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQi5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNi5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4LmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEXzR4LmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl8xNnguYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzR4LmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl84eC5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBVERfNHg0LmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwuYwotLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpci5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpci5jCi0uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDLmMKLS4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDLmMKLS4vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0RDVF9UYWJsZS5oCi0uL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAotLi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9BQ0RDUHJlZGljdC5jCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYuYwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyLmMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZS5jCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Db21wYXJlTVYuYwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRENUX1RhYmxlLmMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19pbnRyYS5jCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfaW50cmEuYwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRmlsbFZMQ0J1ZmZlci5jCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9GaWxsVkxEQnVmZmVyLmMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0dldFZMQ0JpdHMuYwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKLS4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1B1dFZMQ0JpdHMuYwotLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpci5jCi0uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNi5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4LmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNi5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4LmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RDVDh4OGJsay5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZU1WLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlci5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQy5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGsuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX01FR2V0QnVmU2l6ZS5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9NRUluaXQuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYS5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludGVyX0kuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnRyYV9JLmMKLS4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSS5jCi0uL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0kuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIuYwotLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEuYwotLi92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9zcmMvYXJtQ09NTS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9zcmMvYXJtQ09NTS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGRiZjQxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2Uvc3JjL2FybUNPTU0uYworKysgL2Rldi9udWxsCkBAIC0xLDk1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtQ09NTS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVmaW5lcyBDb21tb24gQVBJcyB1c2VkIGFjcm9zcyBPcGVuTUFYIEFQSSdzCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgLyogTWlzY2VsbGFuZW91cyBBcml0aG1ldGljIG9wZXJhdGlvbnMgKi8KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzE2Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludCBhZnRlciByb3VuZGluZwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9TMTYgYXJtUm91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKQotewotICAgIGlmIChWYWx1ZSA+IDApCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9TMTYpKFZhbHVlICsgLjUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9TMTYpKFZhbHVlIC0gLjUpOwotICAgIH0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzMyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIGludCBhZnRlciByb3VuZGluZwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMzIgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9TMzIgYXJtUm91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKQotewotICAgIGlmIChWYWx1ZSA+IDApCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9TMzIpKFZhbHVlICsgLjUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9TMzIpKFZhbHVlIC0gLjUpOwotICAgIH0KLX0KLS8qKgotICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1MxNgotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2IGZvcm1hdAotICoKLSAqLwotCi1PTVhfUzE2IGFybVNhdFJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSkKLXsKLSAgICBpZiAoVmFsdWUgPiAwKQotICAgIHsKLSAgICAgICAgVmFsdWUgKz0gMC41OwotICAgICAgICAKLSAgICAgICAgaWYoVmFsdWUgPiAoT01YX1MxNilPTVhfTUFYX1MxNiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUFYX1MxNjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilWYWx1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBWYWx1ZSAtPSAwLjU7Ci0KLSAgICAgICAgaWYoVmFsdWUgPCAoT01YX1MxNilPTVhfTUlOX1MxNiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUlOX1MxNjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoT01YX1MxNilWYWx1ZTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvUzMyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMzIgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9TMzIgYXJtU2F0Um91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKQotewotICAgIGlmIChWYWx1ZSA+IDApCi0gICAgewotICAgICAgICBWYWx1ZSArPSAwLjU7Ci0gICAgICAgIAotICAgICAgICBpZihWYWx1ZSA+IChPTVhfUzMyKU9NWF9NQVhfUzMyICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKU9NWF9NQVhfUzMyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKVZhbHVlOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIFZhbHVlIC09IDAuNTsKLQotICAgICAgICBpZihWYWx1ZSA8IChPTVhfUzMyKU9NWF9NSU5fUzMyICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKU9NWF9NSU5fUzMyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChPTVhfUzMyKVZhbHVlOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9VMTYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgdW5zaWduZWQgc2hvcnQgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1UxNiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1UxNiBhcm1TYXRSb3VuZEZsb2F0VG9VMTYgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgVmFsdWUgKz0gMC41OwotICAgIAotICAgIGlmKFZhbHVlID4gKE9NWF9VMTYpT01YX01BWF9VMTYgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfVTE2KU9NWF9NQVhfVTE2OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9VMTYpVmFsdWU7Ci0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9VMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgdW5zaWduZWQgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1UzMiBmb3JtYXQKLSAqCi0gKi8KLQotT01YX1UzMiBhcm1TYXRSb3VuZEZsb2F0VG9VMzIgKE9NWF9GNjQgVmFsdWUpCi17Ci0gICAgVmFsdWUgKz0gMC41OwotICAgIAotICAgIGlmKFZhbHVlID4gKE9NWF9VMzIpT01YX01BWF9VMzIgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChPTVhfVTMyKU9NWF9NQVhfVTMyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9VMzIpVmFsdWU7Ci0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TNjQKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgNjQgYml0IGludCBhZnRlciByb3VuZGluZwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TNjQgZm9ybWF0Ci0gKgotICovCi0KLU9NWF9TNjQgYXJtUm91bmRGbG9hdFRvUzY0IChPTVhfRjY0IFZhbHVlKQotewotICAgIGlmIChWYWx1ZSA+IDApCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9TNjQpKFZhbHVlICsgLjUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gKE9NWF9TNjQpKFZhbHVlIC0gLjUpOwotICAgIH0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtU2lnbkNoZWNrCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDaGVja3MgdGhlIHNpZ24gb2YgYSB2YXJpYWJsZToKLSAqIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQotICogcmV0dXJucyAwIGlmIGl0IGlzIDAKLSAqIHJldHVybnMgLTEgaWYgaXQgaXMgTmVnYXRpdmUgCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQkgICAgdmFyICAgICBWYXJpYWJsZSB0byBiZSBjaGVja2VkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX0lOVCAtLSAgIHJldHVybnMgMSBpZiBpdCBpcyBQb3NpdGl2ZQotICogICAgICAgICAgICAgIHJldHVybnMgMCBpZiBpdCBpcyAwCi0gKiAgICAgICAgICAgICAgcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKLSAqLyAKLQotT01YX0lOVCBhcm1TaWduQ2hlY2sgKAotICAgIE9NWF9TMTYgdmFyCi0pCi0KLXsKLSAgICBPTVhfSU5UIFNpZ247Ci0gICAgCi0gICAgaWYgKHZhciA8IDApCi0gICAgewotICAgICAgICBTaWduID0gLTE7Ci0gICAgfQotICAgIGVsc2UgaWYgKCB2YXIgPiAwKQotICAgIHsKLSAgICAgICAgU2lnbiA9IDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIFNpZ24gPSAwOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gU2lnbjsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtQ2xpcAotICoKLSAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQotICogCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCi0gKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKLSAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKLSAqLyAKLSAKLU9NWF9TMzIgYXJtQ2xpcCAoCi0gICAgT01YX0lOVCBtaW4sCi0gICAgT01YX0lOVCBtYXgsIAotICAgIE9NWF9TMzIgc3JjIAotKQotIAotewotICAgIGlmIChzcmMgPiBtYXgpCi0gICAgewotICAgICAgICBzcmMgPSBtYXg7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNyYyA8IG1pbikKLSAgICB7Ci0gICAgICAgIHNyYyA9IG1pbjsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHNyYzsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtQ2xpcF9GMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjogQ2xpcHMgdGhlIGlucHV0IGJldHdlZW4gTUFYIGFuZCBNSU4gdmFsdWUKLSAqIAotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gTWluICAgICBsb3dlciBib3VuZAotICogW2luXSBNYXggICAgIHVwcGVyIGJvdW5kCi0gKiBbaW5dIHNyYyAgICAgdmFyaWFibGUgdG8gdGhlIGNsaXBwZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfRjMyIC0tICAgcmV0dXJucyBjbGlwcGVkIHZhbHVlCi0gKi8gCi0gCi1PTVhfRjMyIGFybUNsaXBfRjMyICgKLSAgICBPTVhfRjMyIG1pbiwKLSAgICBPTVhfRjMyIG1heCwgCi0gICAgT01YX0YzMiBzcmMgCi0pCi0gCi17Ci0gICAgaWYgKHNyYyA+IG1heCkKLSAgICB7Ci0gICAgICAgIHNyYyA9IG1heDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3JjIDwgbWluKQotICAgIHsKLSAgICAgICAgc3JjID0gbWluOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3JjOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1TaGlmdFNhdF9GMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjogRGl2aWRlcyBhIGZsb2F0IHZhbHVlIGJ5IDJec2hpZnQgYW5kIAotICogc2F0dXJhdGVzIGl0IGZvciB1bnNpZ25lZCB2YWx1ZSByYW5nZSBmb3Igc2F0Qml0cy4KLSAqIFNlY29uZCBwYXJhbWV0ZXIgaXMgbGlrZSAic2hpZnRpbmciIHRoZSBjb3JyZXNwb25kaW5nIAotICogaW50ZWdlciB2YWx1ZS4gVGFrZXMgY2FyZSBvZiByb3VuZGluZyB3aGlsZSBjbGlwcGluZyB0aGUgZmluYWwgCi0gKiB2YWx1ZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSB2ICAgICAgICAgIE51bWJlciB0byBiZSBvcGVyYXRlZCB1cG9uCi0gKiBbaW5dIHNoaWZ0ICAgICAgRGl2aWRlcyB0aGUgaW5wdXQgInYiIGJ5ICIyXnNoaWZ0IgotICogW2luXSBzYXRCaXRzICAgIEZpbmFsIHJhbmdlIGlzIFswLCAyXnNhdEJpdHMpCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1MzMiAtLSAgIHJldHVybnMgInNoaWZ0ZWQiIHNhdHVyYXRlZCB2YWx1ZQotICovIAotIAotT01YX1UzMiBhcm1TaGlmdFNhdF9GMzIoT01YX0YzMiB2LCBPTVhfSU5UIHNoaWZ0LCBPTVhfSU5UIHNhdEJpdHMpIAotewotICAgIE9NWF9VMzIgYWxsT25lcyA9IChPTVhfVTMyKSgtMSk7Ci0gICAgT01YX1UzMiBtYXhWID0gYWxsT25lcyA+PiAoMzItc2F0Qml0cyk7Ci0gICAgT01YX0YzMiB2U2hpZnRlZCwgdlJvdW5kZWQsIHNoaWZ0RGl2ID0gKE9NWF9GMzIpKDEgPDwgc2hpZnQpOwotICAgIE9NWF9VMzIgdkludDsKLSAgICBPTVhfVTMyIHZJbnRTYXQ7Ci0gICAgCi0gICAgaWYodiA8PSAwKQotICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICB2U2hpZnRlZCA9IHYgLyBzaGlmdERpdjsKLSAgICB2Um91bmRlZCA9IChPTVhfRjMyKSh2U2hpZnRlZCArIDAuNSk7Ci0gICAgdkludCA9IChPTVhfVTMyKXZSb3VuZGVkOwotICAgIHZJbnRTYXQgPSB2SW50OwotICAgIGlmKHZJbnRTYXQgPiBtYXhWKSAKLSAgICAgICAgdkludFNhdCA9IG1heFY7Ci0gICAgcmV0dXJuIHZJbnRTYXQ7Ci19Ci0KLS8qKgotICogRnVuY3Rpb25zOiBhcm1Td2FwRWxlbQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhlc2UgZnVuY3Rpb24gc3dhcHMgdHdvIGVsZW1lbnRzIGF0IHRoZSBzcGVjaWZpZWQgcG9pbnRlciBsb2NhdGlvbnMuCi0gKiBUaGUgc2l6ZSBvZiBlYWNoIGVsZW1lbnQgY291bGQgYmUgYW55dGhpbmcgYXMgc3BlY2lmaWVkIGJ5IDxlbGVtU2l6ZT4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhSZXN1bHQgLS0gRXJyb3Igc3RhdHVzIGZyb20gdGhlIGZ1bmN0aW9uCi0gKi8KLU9NWFJlc3VsdCBhcm1Td2FwRWxlbSgKLSAgICAgICAgT01YX1U4ICpwQnVmMSwKLSAgICAgICAgT01YX1U4ICpwQnVmMiwKLSAgICAgICAgT01YX0lOVCBlbGVtU2l6ZQotICAgICAgICkKLXsKLSAgICBPTVhfSU5UIGk7Ci0gICAgT01YX1U4IHRlbXA7Ci0gICAgYXJtUmV0QXJnRXJySWYoIXBCdWYxIHx8ICFwQnVmMiwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIAotICAgIGZvcihpID0gMDsgaSA8IGVsZW1TaXplOyBpKyspCi0gICAgewotICAgICAgICB0ZW1wID0gKihwQnVmMSArIGkpOwotICAgICAgICAqKHBCdWYxICsgaSkgPSAqKHBCdWYyICsgaSk7Ci0gICAgICAgICoocEJ1ZjIgKyBpKSA9IHRlbXA7Ci0gICAgfQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1NZWRpYW5PZjMKLSAqCi0gKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIG1lZGlhbiBvZiB0aHJlZSBudW1iZXJzCi0gKiAKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gZkVudHJ5ICAgICBGaXJzdCBlbnRyeQotICogW2luXSBzRW50cnkgICAgIHNlY29uZCBlbnRyeQotICogW2luXSB0RW50cnkgICAgIFRoaXJkIGVudHJ5Ci0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1MzMiAtLSAgIHJldHVybnMgdGhlIG1lZGlhbiB2YWx1ZQotICovIAotIAotT01YX1MzMiBhcm1NZWRpYW5PZjMgKAotICAgIE9NWF9TMzIgZkVudHJ5LAotICAgIE9NWF9TMzIgc0VudHJ5LCAKLSAgICBPTVhfUzMyIHRFbnRyeSAKLSkKLXsKLSAgICBPTVhfUzMyIGEsIGIsIGM7Ci0gICAgCi0gICAgYSA9IGFybU1pbiAoZkVudHJ5LCBzRW50cnkpOwotICAgIGIgPSBhcm1NYXggKGZFbnRyeSwgc0VudHJ5KTsKLSAgICBjID0gYXJtTWluIChiLCB0RW50cnkpOwotICAgIHJldHVybiAoYXJtTWF4IChhLCBjKSk7Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUxvZ1NpemUKLSAqCi0gKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIHNpemUgb2YgYSBwb3NpdGl2ZSB2YWx1ZSBhbmQgcmV0dXJucyB0aGUgc2FtZQotICogCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHZhbHVlICAgIFBvc2l0aXZlIHZhbHVlCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1U4IC0tICAgICBSZXR1cm5zIHRoZSBtaW5pbXVtIG51bWJlciBvZiBiaXRzIHJlcXVpcmVkIHRvIHJlcHJlc2VudCB0aGUgcG9zaXRpdmUgdmFsdWUuIAotICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBzbWFsbGVzdCBrPj0wIHN1Y2ggdGhhdCB0aGF0IHZhbHVlIGlzIGxlc3MgdGhhbiAoMTw8aykuCi0gKi8gCi0gCi1PTVhfVTggYXJtTG9nU2l6ZSAoCi0gICAgT01YX1UxNiB2YWx1ZSAKLSkKLXsKLSAgICBPTVhfVTggaTsgICAgCi0gICAgZm9yICggaSA9IDA7IHZhbHVlID4gMDsgdmFsdWUgPSB2YWx1ZSA+PiAxKSAKLSAgICB7Ci0gICAgICAgIGkrKzsKLSAgICB9Ci0gICAgcmV0dXJuIGk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAvKiBTYXR1cmF0aW5nIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLwotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzMyKCkKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqIAotICogICAgCi0gKiovCi0gCi1PTVhfUzMyIGFybVNhdEFkZF9TMzIoT01YX1MzMiBWYWx1ZTEsT01YX1MzMiBWYWx1ZTIpCi17Ci0gICAgT01YX1MzMiBSZXN1bHQ7Ci0gICAgCi0gICAgUmVzdWx0ID0gVmFsdWUxICsgVmFsdWUyOwotCi0gICAgaWYoIChWYWx1ZTFeVmFsdWUyKSA+PSAwKQotICAgIHsKLSAgICAgICAgLypTYW1lIHNpZ24qLwotICAgICAgICBpZiggKFJlc3VsdF5WYWx1ZTEpID49IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBub3Qgc2F0dXJhdGVkKi8KLSAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihWYWx1ZTEgPj0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIHBvc2l0aXZlIHNpZGUqLwotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUFYX1MzMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIG5lZ2F0aXZlIHNpZGUqLwotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUlOX1MzMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIH0KLSAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gUmVzdWx0OwotICAgIH0KLSAgICAKLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1M2NCgpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAotICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAKLSAqICAgIAotICoqLwotIAotT01YX1M2NCBhcm1TYXRBZGRfUzY0KE9NWF9TNjQgVmFsdWUxLE9NWF9TNjQgVmFsdWUyKQotewotICAgIE9NWF9TNjQgUmVzdWx0OwotICAgIAotICAgIFJlc3VsdCA9IFZhbHVlMSArIFZhbHVlMjsKLQotICAgIGlmKCAoVmFsdWUxXlZhbHVlMikgPj0gMCkKLSAgICB7Ci0gICAgICAgIC8qU2FtZSBzaWduKi8KLSAgICAgICAgaWYoIChSZXN1bHReVmFsdWUxKSA+PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKlJlc3VsdCBoYXMgbm90IHNhdHVyYXRlZCovCi0gICAgICAgICAgICByZXR1cm4gUmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoVmFsdWUxID49IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBwb3NpdGl2ZSBzaWRlKi8KLSAgICAgICAgICAgICAgICBSZXN1bHQgPSBPTVhfTUFYX1M2NDsKLSAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gbmVnYXRpdmUgc2lkZSovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NSU5fUzY0OwotICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgfQotICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgfQotICAgIAotfQotCi0vKiogRnVuY3Rpb24gOmFybVNhdFN1Yl9TMzIoKQotICogCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBzdWJzdHJhY3Rpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqIAotICoqLwotCi1PTVhfUzMyIGFybVNhdFN1Yl9TMzIoT01YX1MzMiBWYWx1ZTEsT01YX1MzMiBWYWx1ZTIpCi17Ci0gICAgT01YX1MzMiBSZXN1bHQ7Ci0gICAgCi0gICAgUmVzdWx0ID0gVmFsdWUxIC0gVmFsdWUyOwotCi0gICAgaWYoIChWYWx1ZTFeVmFsdWUyKSA8IDApCi0gICAgewotICAgICAgICAvKk9wcG9zaXRlIHNpZ24qLwotICAgICAgICBpZiggKFJlc3VsdF5WYWx1ZTEpID49IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBub3Qgc2F0dXJhdGVkKi8KLSAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihWYWx1ZTEgPj0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIHBvc2l0aXZlIHNpZGUqLwotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUFYX1MzMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIG5lZ2F0aXZlIHNpZGUqLwotICAgICAgICAgICAgICAgIHJldHVybiBPTVhfTUlOX1MzMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIH0KLSAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gUmVzdWx0OwotICAgIH0KLSAgICAKLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBNdWx0aXBsaWNhdGlvbiBvZiBWYWx1ZTEgYW5kIFZhbHVlMiBhbmQgc3ViZXNxdWVudCBzYXR1cmF0ZWQKLSAqICAgICBhY2N1bXVsYXRpb24gd2l0aCBNYWMKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCi0gKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAotICogW2luXSBNYWMgICAgICAgICAgQWNjdW11bGF0b3IKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiovCi0KLU9NWF9TMzIgYXJtU2F0TWFjX1MzMihPTVhfUzMyIE1hYyxPTVhfUzE2IFZhbHVlMSxPTVhfUzE2IFZhbHVlMikKLXsKLSAgICBPTVhfUzMyIFJlc3VsdDsKLSAgICAKLSAgICBSZXN1bHQgPSAoT01YX1MzMikoVmFsdWUxKlZhbHVlMik7Ci0gICAgUmVzdWx0ID0gYXJtU2F0QWRkX1MzMiggTWFjICwgUmVzdWx0ICk7Ci0KLSAgICByZXR1cm4gUmVzdWx0OyAgICAKLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TWFjX1MxNlMzMl9TMzIKLSAqCi0gKiBEZXNjcmlwdGlvbiA6Ci0gKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgTUFDIG9wZXJhdGlvbiBvZiB0aGUgdGhyZWUgaW5wdXRzIGRlbGF5RWxlbSwgZmlsVGFwICwgbWFjCi0gKgotICogICBtYWMgPSBtYWMgKyBTYXR1cmF0ZV9pbl8zMkJpdHMoZGVsYXlFbGVtICogZmlsVGFwKQotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gZGVsYXlFbGVtICAgIEZpcnN0IDMyIGJpdCBPcGVyYW5kCi0gKiBbaW5dIGZpbFRhcCAgICAgICBTZWNvbmQgMTYgYml0IE9wZXJhbmQKLSAqIFtpbl0gbWFjICAgICAgICAgIFJlc3VsdCBvZiBNQUMgb3BlcmF0aW9uCi0gKgotICogUmV0dXJuOgotICogW291dF0gIG1hYyAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0gCi1PTVhfUzMyIGFybVNhdE1hY19TMTZTMzJfUzMyKE9NWF9TMzIgbWFjLCBPTVhfUzMyIGRlbGF5RWxlbSwgT01YX1MxNiBmaWxUYXAgKQotewotICAgIAotICAgIE9NWF9TMzIgcmVzdWx0OwotCi0gICAgcmVzdWx0ID0gYXJtU2F0TXVsUzE2UzMyX1MzMihmaWxUYXAsZGVsYXlFbGVtKTsgCi0KLSAgICBpZiAoIHJlc3VsdCA+IE9NWF9NQVhfUzE2ICkKLSAgICB7Ci0gICAgICAgIHJlc3VsdCA9IE9NWF9NQVhfUzMyOwotICAgIH0KLSAgICBlbHNlIGlmKCByZXN1bHQgPCBPTVhfTUlOX1MxNiApCi0gICAgewotICAgICAgICByZXN1bHQgPSBPTVhfTUlOX1MzMjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZGVsYXlFbGVtICogZmlsVGFwOwotICAgIH0KLQotICAgIG1hYyA9IGFybVNhdEFkZF9TMzIobWFjLHJlc3VsdCk7Ci0gICAgCi0gICAgcmV0dXJuIG1hYzsKLX0KLQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNgotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJvdW5kZWQgcmlnaHQgc2hpZnQgb3BlcmF0aW9uIG9mIGlucHV0IGJ5IHRoZSBzY2FsZWZhY3RvcgotICoKLSAqICAgb3V0cHV0ID0gU2F0dXJhdGVfaW5fMTZCaXRzKCAoIFJpZ2h0L0xlZnRTaGlmdCggKFJvdW5kKGlucHV0KSAsIHNoaWZ0ICkgKQotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gaW5wdXQgICAgICAgVGhlIGlucHV0IHRvIGJlIG9wZXJhdGVkIG9uCi0gKiBbaW5dIHNoaWZ0IFRoZSBzaGlmdCBudW1iZXIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotCi0KLU9NWF9TMTYgYXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYoT01YX1MzMiBpbnB1dCwgT01YX0lOVCBzaGlmdCkKLXsKLSAgICBpbnB1dCA9IGFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMihpbnB1dCwtc2hpZnQpOwotCi0gICAgaWYgKCBpbnB1dCA+IE9NWF9NQVhfUzE2ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUFYX1MxNjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgPCBPTVhfTUlOX1MxNikKLSAgICB7Ci0gICAgICAgIHJldHVybiAoT01YX1MxNilPTVhfTUlOX1MxNjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICByZXR1cm4gKE9NWF9TMTYpaW5wdXQ7Ci0gICAgfQotCi19Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0Ci0gKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCi0gKiAgICAgCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCi0gKiBbaW5dIFNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLQotT01YX1MzMiBhcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoT01YX1MzMiBWYWx1ZSwgT01YX0lOVCBTaGlmdCkKLXsKLSAgICBPTVhfSU5UIGk7Ci0gICAgCi0gICAgaWYgKFNoaWZ0IDwgMCkKLSAgICB7Ci0gICAgICAgIFNoaWZ0ID0gLVNoaWZ0OwotICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TMzIoVmFsdWUsICgxIDw8IChTaGlmdCAtIDEpKSk7Ci0gICAgICAgIFZhbHVlID0gVmFsdWUgPj4gU2hpZnQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBTaGlmdDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWx1ZSA9IGFybVNhdEFkZF9TMzIoVmFsdWUsIFZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVmFsdWU7Ci19Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NCgpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0aW5nIGxlZnQtc2hpZnQgb3BlcmF0aW9uIG9uIGlucHV0Ci0gKiAgICAgT3Igcm91bmRlZCBSaWdodCBzaGlmdCBpZiB0aGUgaW5wdXQgU2hpZnQgaXMgbmVnYXRpdmUuCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBWYWx1ZSAgICAgICAgT3BlcmFuZAotICogW2luXSBzaGlmdCAgICAgICAgT3BlcmFuZCBmb3Igc2hpZnQgb3BlcmF0aW9uCi0gKgotICogUmV0dXJuOgotICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgotICogICAgCi0gKiovCi0gCi1PTVhfUzY0IGFybVNhdFJvdW5kTGVmdFNoaWZ0X1M2NChPTVhfUzY0IFZhbHVlLCBPTVhfSU5UIFNoaWZ0KQotewotICAgIE9NWF9JTlQgaTsKLSAgICAKLSAgICBpZiAoU2hpZnQgPCAwKQotICAgIHsKLSAgICAgICAgU2hpZnQgPSAtU2hpZnQ7Ci0gICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1M2NChWYWx1ZSwgKChPTVhfUzY0KTEgPDwgKFNoaWZ0IC0gMSkpKTsKLSAgICAgICAgVmFsdWUgPSBWYWx1ZSA+PiBTaGlmdDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFNoaWZ0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1M2NChWYWx1ZSwgVmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBWYWx1ZTsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzE2UzMyX1MzMigpCi0gKgotICogRGVzY3JpcHRpb24gOgotICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMxNiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKLSAqICAgICBpbiBhIFMzMiBjb250YWluZXIKLSAqCi0gKiBQYXJhbWV0cnM6Ci0gKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKLSAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgotICoKLSAqIFJldHVybjoKLSAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KLSAqICAgIAotICoqLwotCi0KLU9NWF9TMzIgYXJtU2F0TXVsUzE2UzMyX1MzMihPTVhfUzE2IGlucHV0MSxPTVhfUzMyIGlucHV0MikKLXsKLSAgICBPTVhfUzE2IGhpMixsbzE7Ci0gICAgT01YX1UxNiBsbzI7Ci0gICAgCi0gICAgT01YX1MzMiB0ZW1wMSx0ZW1wMjsKLSAgICBPTVhfUzMyIHJlc3VsdDsKLSAgICAKLSAgICBsbzEgID0gaW5wdXQxOwotCi0gICAgaGkyICA9ICggaW5wdXQyID4+ICAxNiApOwotICAgIGxvMiAgPSAoIChPTVhfVTMyKSggaW5wdXQyIDw8IDE2ICkgPj4gMTYgKTsKLSAgICAKLSAgICB0ZW1wMSA9IGhpMiAqIGxvMTsKLSAgICB0ZW1wMiA9ICggbG8yKiBsbzEgKSA+PiAxNjsKLQotICAgIHJlc3VsdCA9ICBhcm1TYXRBZGRfUzMyKHRlbXAxLHRlbXAyKTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogRnVuY3Rpb24gOmFybVNhdE11bFMzMlMzMl9TMzIoKQotICoKLSAqIERlc2NyaXB0aW9uIDoKLSAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMzIgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCi0gKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCi0gKgotICogUGFyYW1ldHJzOgotICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCi0gKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCi0gKiAgICAKLSAqKi8KLQotT01YX1MzMiBhcm1TYXRNdWxTMzJTMzJfUzMyKE9NWF9TMzIgaW5wdXQxLE9NWF9TMzIgaW5wdXQyKQotewotICAgIE9NWF9TMTYgaGkxLGhpMjsKLSAgICBPTVhfVTE2IGxvMSxsbzI7Ci0gICAgCi0gICAgT01YX1MzMiB0ZW1wMSx0ZW1wMix0ZW1wMzsKLSAgICBPTVhfUzMyIHJlc3VsdDsKLQotICAgIGhpMSAgPSAoIGlucHV0MSA+PiAgMTYgKTsKLSAgICBsbzEgID0gKCAoT01YX1UzMikoIGlucHV0MSA8PCAxNiApID4+IDE2ICk7Ci0KLSAgICBoaTIgID0gKCBpbnB1dDIgPj4gIDE2ICk7Ci0gICAgbG8yICA9ICggKE9NWF9VMzIpKCBpbnB1dDIgPDwgMTYgKSA+PiAxNiApOwotICAgIAotICAgIHRlbXAxID0gICBoaTEgKiBoaTI7Ci0gICAgdGVtcDIgPSAoIGhpMSogbG8yICkgPj4gMTY7Ci0gICAgdGVtcDMgPSAoIGhpMiogbG8xICkgPj4gMTY7Ci0KLSAgICByZXN1bHQgPSBhcm1TYXRBZGRfUzMyKHRlbXAxLHRlbXAyKTsKLSAgICByZXN1bHQgPSBhcm1TYXRBZGRfUzMyKHJlc3VsdCx0ZW1wMyk7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIEZ1bmN0aW9uIDphcm1JbnREaXZBd2F5RnJvbVplcm8oKQotICoKLSAqIERlc2NyaXB0aW9uIDogSW50ZWdlciBkaXZpc2lvbiB3aXRoIHJvdW5kaW5nIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuIAotICogICAgICAgICAgICAgICBIYWxmLWludGVnZXIgdmFsdWVzIGFyZSByb3VuZGVkIGF3YXkgZnJvbSB6ZXJvCi0gKiAgICAgICAgICAgICAgIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLiBGb3IgZXhhbXBsZSAzLy8yIGlzIHJvdW5kZWQgCi0gKiAgICAgICAgICAgICAgIHRvIDIsIGFuZCAtMy8vMiBpcyByb3VuZGVkIHRvIC0yLgotICoKLSAqIFBhcmFtZXRyczoKLSAqIFtpbl0gTnVtICAgICAgICBPcGVyYW5kIDEKLSAqIFtpbl0gRGVubyAgICAgICBPcGVyYW5kIDIKLSAqCi0gKiBSZXR1cm46Ci0gKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uIGlucHV0MS8vaW5wdXQyCi0gKiAgICAKLSAqKi8KLQotT01YX1MzMiBhcm1JbnREaXZBd2F5RnJvbVplcm8gKE9NWF9TMzIgTnVtLCBPTVhfUzMyIERlbm8pCi17Ci0gICAgT01YX0Y2NCByZXN1bHQ7Ci0gICAgCi0gICAgcmVzdWx0ID0gKChPTVhfRjY0KU51bSkvKChPTVhfRjY0KURlbm8pOwotICAgIAotICAgIGlmIChyZXN1bHQgPj0gMCkKLSAgICB7Ci0gICAgICAgIHJlc3VsdCArPSAwLjU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJlc3VsdCAtPSAwLjU7Ci0gICAgfQotCi0gICAgcmV0dXJuIChPTVhfUzMyKShyZXN1bHQpOwotfQotCi0KLS8qRW5kIG9mIEZpbGUqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlmNTNjYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1DT01NX0JpdHN0cmVhbS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVmaW5lcyBiaXRzdHJlYW0gZW5jb2RlIGFuZCBkZWNvZGUgZnVuY3Rpb25zIGNvbW1vbiB0byBhbGwgY29kZWNzCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZpeGVkIGJpdCBsZW5ndGggRGVjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1Mb29rQWhlYWRCaXRzKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEdldCB0aGUgbmV4dCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtIHdpdGhvdXQgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqKnBwQml0U3RyZWFtCi0gKiBbaW5dICAgICAqcE9mZnNldAotICogW2luXSAgICAgTj0xLi4uMzIKLSAqCi0gKiBSZXR1cm5zICBWYWx1ZQotICovCi0KLU9NWF9VMzIgYXJtTG9va0FoZWFkQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKQotewotICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKLSAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OwotICAgIE9NWF9VMzIgVmFsdWU7Ci0KLSAgICBhcm1Bc3NlcnQoT2Zmc2V0Pj0wICYmIE9mZnNldDw9Nyk7Ci0gICAgYXJtQXNzZXJ0KE4+PTEgJiYgTjw9MzIpOwotCi0gICAgLyogUmVhZCBuZXh0IDMyIGJpdHMgZnJvbSBzdHJlYW0gKi8KLSAgICBWYWx1ZSA9IChwQml0U3RyZWFtWzBdIDw8IDI0ICkgfCAoIHBCaXRTdHJlYW1bMV0gPDwgMTYpICB8IChwQml0U3RyZWFtWzJdIDw8IDggKSB8IChwQml0U3RyZWFtWzNdKSA7Ci0gICAgVmFsdWUgPSAoVmFsdWUgPDwgT2Zmc2V0ICkgfCAocEJpdFN0cmVhbVs0XSA+PiAoOC1PZmZzZXQpKTsKLQotICAgIC8qIFJldHVybiBOIGJpdHMgKi8KLSAgICByZXR1cm4gVmFsdWUgPj4gKDMyLU4pOwotfQotCi0KLS8qKgotICogRnVuY3Rpb246IGFybUdldEJpdHMoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUmVhZCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCi0gKiAgICAKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBOPTEuLjMyCi0gKgotICogW291dF0gICAgKnBwQml0U3RyZWFtCi0gKiBbb3V0XSAgICAqcE9mZnNldAotICogUmV0dXJucyAgVmFsdWUKLSAqLwotCi0KLU9NWF9VMzIgYXJtR2V0Qml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKQotewotICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKLSAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OwotICAgIE9NWF9VMzIgVmFsdWU7Ci0gICAgCi0gICAgaWYoTiA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGFybUFzc2VydChPZmZzZXQ+PTAgJiYgT2Zmc2V0PD03KTsKLSAgICBhcm1Bc3NlcnQoTj49MSAmJiBOPD0zMik7Ci0KLSAgICAvKiBSZWFkIG5leHQgMzIgYml0cyBmcm9tIHN0cmVhbSAqLwotICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPDwgMjQgKSB8ICggcEJpdFN0cmVhbVsxXSA8PCAxNikgIHwgKHBCaXRTdHJlYW1bMl0gPDwgOCApIHwgKHBCaXRTdHJlYW1bM10pIDsKLSAgICBWYWx1ZSA9IChWYWx1ZSA8PCBPZmZzZXQgKSB8IChwQml0U3RyZWFtWzRdID4+ICg4LU9mZnNldCkpOwotCi0gICAgLyogQWR2YW5jZSBiaXRzdHJlYW0gcG9pbnRlciBieSBOIGJpdHMgKi8KLSAgICBPZmZzZXQgKz0gTjsKLSAgICAqcHBCaXRTdHJlYW0gPSBwQml0U3RyZWFtICsgKE9mZnNldD4+Myk7Ci0gICAgKnBPZmZzZXQgPSBPZmZzZXQgJiA3OwotCi0gICAgLyogUmV0dXJuIE4gYml0cyAqLwotICAgIHJldHVybiBWYWx1ZSA+PiAoMzItTik7Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybUJ5dGVBbGlnbigpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBBbGlnbiB0aGUgcG9pbnRlciAqcHBCaXRTdHJlYW0gdG8gdGhlIG5leHQgYnl0ZSBib3VuZGFyeQotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKgotICogW291dF0gICAgKnBwQml0U3RyZWFtCi0gKiBbb3V0XSAgICAqcE9mZnNldAotICoKLSAqKi8KLSAKLU9NWFZvaWQgYXJtQnl0ZUFsaWduKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLE9NWF9JTlQgKnBPZmZzZXQpCi17Ci0gICAgaWYoKnBPZmZzZXQgPiAwKQotICAgIHsKLSAgICAgICAgKnBwQml0U3RyZWFtICs9IDE7Ci0gICAgICAgICpwT2Zmc2V0ID0gMDsKLSAgICB9ICAgIAotfQotCi0vKiogCi0gKiBGdW5jdGlvbjogYXJtU2tpcEJpdHMoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogU2tpcCBOIGJpdHMgZnJvbSB0aGUgdmFsdWUgYXQgKnBwQml0U3RyZWFtCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQotICogW2luXSAgICAgKnBPZmZzZXQKLSAqIFtpbl0gICAgIE4KLSAqCi0gKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKgotICoqLwotCi0KLU9NWFZvaWQgYXJtU2tpcEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCxPTVhfSU5UIE4pCi17Ci0gICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKLSAgICBjb25zdCBPTVhfVTggKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07Ci0gICAKLSAgICAvKiBBZHZhbmNlIGJpdHN0cmVhbSBwb2ludGVyIGJ5IE4gYml0cyAqLwotICAgIE9mZnNldCArPSBOOwotICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW0gKyAoT2Zmc2V0Pj4zKTsKLSAgICAqcE9mZnNldCA9IE9mZnNldCAmIDc7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFZhcmlhYmxlIGJpdCBsZW5ndGggRGVjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1VblBhY2tWTEMzMigpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBWYXJpYWJsZSBsZW5ndGggZGVjb2RlIG9mIHZhcmlhYmxlIGxlbmd0aCBzeW1ib2wgKG1heCBzaXplIDMyIGJpdHMpIHJlYWQgZnJvbQotICogdGhlIGJpdCBzdHJlYW0gcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gYXQgKnBPZmZzZXQgYnkgdXNpbmcgdGhlIHRhYmxlCi0gKiBwb2ludGVkIGJ5IHBDb2RlQm9vawotICogCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgKnBCaXRTdHJlYW0KLSAqIFtpbl0gICAgICpwT2Zmc2V0Ci0gKiBbaW5dICAgICBwQ29kZUJvb2sKLSAqIAotICogW291dF0gICAgKnBCaXRTdHJlYW0KLSAqIFtvdXRdICAgICpwT2Zmc2V0Ci0gKgotICogUmV0dXJucyA6IENvZGUgQm9vayBJbmRleCBpZiBzdWNjZXNzZnVsbC4gCi0gKiAgICAgICAgIDogQVJNX05PX0NPREVCT09LX0lOREVYID0gLTEgaWYgc2VhcmNoIGZhaWxzLgotICoqLwotI2lmbmRlZiBDX09QVElNSVpFRF9JTVBMRU1FTlRBVElPTiAKLQotT01YX1UxNiBhcm1VblBhY2tWTEMzMigKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwT2Zmc2V0LAotICAgIGNvbnN0IEFSTV9WTEMzMiAqcENvZGVCb29rCi0pCi17ICAgIAotICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKLSAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OwotICAgIE9NWF9VMzIgVmFsdWU7Ci0gICAgT01YX0lOVCBJbmRleDsKLSAgICAgICAgCi0gICAgYXJtQXNzZXJ0KE9mZnNldD49MCAmJiBPZmZzZXQ8PTcpOwotCi0gICAgLyogUmVhZCBuZXh0IDMyIGJpdHMgZnJvbSBzdHJlYW0gKi8KLSAgICBWYWx1ZSA9IChwQml0U3RyZWFtWzBdIDw8IDI0ICkgfCAoIHBCaXRTdHJlYW1bMV0gPDwgMTYpICB8IChwQml0U3RyZWFtWzJdIDw8IDggKSB8IChwQml0U3RyZWFtWzNdKSA7Ci0gICAgVmFsdWUgPSAoVmFsdWUgPDwgT2Zmc2V0ICkgfCAocEJpdFN0cmVhbVs0XSA+PiAoOC1PZmZzZXQpKTsKLQotICAgIC8qIFNlYXJjaCB0aHJvdWdoIHRoZSBjb2RlYm9vayAqLyAgICAKLSAgICBmb3IgKEluZGV4PTA7IHBDb2RlQm9vay0+Y29kZUxlbiAhPSAwOyBJbmRleCsrKQotICAgIHsKLSAgICAgICAgaWYgKHBDb2RlQm9vay0+Y29kZVdvcmQgPT0gKFZhbHVlID4+ICgzMiAtIHBDb2RlQm9vay0+Y29kZUxlbikpKQotICAgICAgICB7Ci0gICAgICAgICAgICBPZmZzZXQgICAgICAgPSBPZmZzZXQgKyBwQ29kZUJvb2stPmNvZGVMZW47Ci0gICAgICAgICAgICAqcHBCaXRTdHJlYW0gPSBwQml0U3RyZWFtICsgKE9mZnNldCA+PiAzKSA7Ci0gICAgICAgICAgICAqcE9mZnNldCAgICAgPSBPZmZzZXQgJiA3OwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gSW5kZXg7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgICBwQ29kZUJvb2srKzsKLSAgICB9Ci0KLSAgICAvKiBObyBjb2RlIG1hdGNoIGZvdW5kICovCi0gICAgcmV0dXJuIEFSTV9OT19DT0RFQk9PS19JTkRFWDsKLX0KLQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZpeGVkIGJpdCBsZW5ndGggRW5jb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1QYWNrQml0cwotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAotICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCi0gKiBbaW5dIHBPZmZzZXQgICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAKLSAqICAgICAgICAgICAgICAgICAgICAgIHRvIDcuCi0gKiBbaW5dIGNvZGVXb3JkICAgICAgICBDb2RlIHdvcmQgdGhhdCBuZWVkIHRvIGJlIGluc2VydGVkIGluIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQotICogW2luXSBjb2RlTGVuZ3RoICAgICAgTGVuZ3RoIG9mIHRoZSBjb2RlIHdvcmQgdmFsaWQgcmFuZ2UgMS4uLjMyCi0gKgotICogW291dF0gcHBCaXRTdHJlYW0gICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdIHBCaXRPZmZzZXQgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0gCi1PTVhSZXN1bHQgYXJtUGFja0JpdHMgKAotICAgIE9NWF9VOCAgKipwcEJpdFN0cmVhbSwgCi0gICAgT01YX0lOVCAqcE9mZnNldCwKLSAgICBPTVhfVTMyIGNvZGVXb3JkLCAKLSAgICBPTVhfSU5UIGNvZGVMZW5ndGggCi0pCi17Ci0gICAgT01YX1U4ICAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKLSAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OwotICAgIE9NWF9VMzIgVmFsdWU7Ci0gICAgICAgIAotICAgIC8qIGNoZWNraW5nIGFyZ3VtZW50IHZhbGlkaXR5ICovCi0gICAgYXJtUmV0QXJnRXJySWYoT2Zmc2V0IDwgMCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKE9mZnNldCA+IDcsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihjb2RlTGVuZ3RoIDwgMSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGNvZGVMZW5ndGggPiAzMiwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgLyogUHJlcGFyZSB0aGUgZmlyc3QgYnl0ZSAqLwotICAgIGNvZGVXb3JkID0gY29kZVdvcmQgPDwgKDMyLWNvZGVMZW5ndGgpOwotICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPj4gKDgtT2Zmc2V0KSkgPDwgKDgtT2Zmc2V0KTsKLSAgICBWYWx1ZSA9IFZhbHVlIHwgKGNvZGVXb3JkID4+ICgyNCtPZmZzZXQpKTsKLQotICAgIC8qIFdyaXRlIG91dCB3aG9sZSBieXRlcyAqLwotICAgIHdoaWxlICg4LU9mZnNldCA8PSBjb2RlTGVuZ3RoKQotICAgIHsKLSAgICAgICAgKnBCaXRTdHJlYW0rKyA9IChPTVhfVTgpVmFsdWU7Ci0gICAgICAgIGNvZGVXb3JkICAgPSBjb2RlV29yZCAgPDwgKDgtT2Zmc2V0KTsKLSAgICAgICAgY29kZUxlbmd0aCA9IGNvZGVMZW5ndGggLSAoOC1PZmZzZXQpOwotICAgICAgICBPZmZzZXQgPSAwOwotICAgICAgICBWYWx1ZSA9IGNvZGVXb3JkID4+IDI0OwotICAgIH0KLQotICAgIC8qIFdyaXRlIG91dCBmaW5hbCBwYXJ0aWFsIGJ5dGUgKi8KLSAgICAqcEJpdFN0cmVhbSAgPSAoT01YX1U4KVZhbHVlOwotICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW07Ci0gICAgKnBPZmZzZXQgPSBPZmZzZXQgKyBjb2RlTGVuZ3RoOwotICAgIAotICAgIHJldHVybiAgT01YX1N0c19Ob0VycjsKLX0KLSAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFZhcmlhYmxlIGJpdCBsZW5ndGggRW5jb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1QYWNrVkxDMzIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBhY2sgYSBWTEMgY29kZSB3b3JkIGludG8gdGhlIGJpdHN0cmVhbQotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtLgotICogW2luXQlwQml0T2Zmc2V0CSAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAKLSAqICAgICAgICAgICAgICAgICAgICAgIHRvIDcuCi0gKiBbaW5dCSBjb2RlICAgICAJCVZMQyBjb2RlIHdvcmQgdGhhdCBuZWVkIHRvIGJlIGluc2VydGVkIGluIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCi0gKgotICogW291dF0gcHBCaXRTdHJlYW0JKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCi0gKgkgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAotICoJCQkJCQlzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqCQkJCQkJY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICoJCQkJCQkqcHBCaXRTdHJlYW0uCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YX1JFU1VMVCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotIAotT01YUmVzdWx0IGFybVBhY2tWTEMzMiAoCi0gICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sIAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgQVJNX1ZMQzMyIGNvZGUgCi0pCi17Ci0gICAgcmV0dXJuIChhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgY29kZS5jb2RlV29yZCwgY29kZS5jb2RlTGVuKSk7Ci19Ci0KLS8qRW5kIG9mIEZpbGUqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9hcGkvYXJtVkMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvYXBpL2FybVZDLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYmU4YjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9hcGkvYXJtVkMuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBGaWxlOiBhcm1WaWRlby5oCi0gKiBCcmllZjogRGVjbGFyZXMgQVBJJ3MvQmFzaWMgRGF0YSB0eXBlcyB1c2VkIGFjcm9zcyB0aGUgT3Blbk1BWCBWaWRlbyBkb21haW4KLSAqCi0gKi8KLQotCi0jaWZuZGVmIF9hcm1WaWRlb19IXwotI2RlZmluZSBfYXJtVmlkZW9fSF8KLQotI2luY2x1ZGUgIm9teFZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKLQotLyoqCi0gKiBBUk0gc3BlY2lmaWMgc3RhdGUgc3RydWN0dXJlIHRvIGhvbGQgTW90aW9uIEVzdGltYXRpb24gaW5mb3JtYXRpb24uCi0gKi8KLSAKLXN0cnVjdCBtNHAyX01FU3BlYwotewotICAgIE9NWFZDTTRQMk1FUGFyYW1zIE1FUGFyYW1zOwotICAgIE9NWFZDTTRQMk1FTW9kZSAgIE1FTW9kZTsKLX07Ci0KLXN0cnVjdCBtNHAxMF9NRVNwZWMKLXsKLSAgICBPTVhWQ000UDEwTUVQYXJhbXMgTUVQYXJhbXM7Ci0gICAgT01YVkNNNFAxME1FTW9kZSAgIE1FTW9kZTsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IG00cDJfTUVTcGVjICBBUk1WQ000UDJfTUVTcGVjOwotdHlwZWRlZiBzdHJ1Y3QgbTRwMTBfTUVTcGVjIEFSTVZDTTRQMTBfTUVTcGVjOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQ29tcGFyZU1WCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBjb21wYXJpc2lvbiBvZiBtb3Rpb24gdmVjdG9ycyBhbmQgU0FEJ3MgdG8gZGVjaWRlIHRoZQotICogYmVzdCBNViBhbmQgU0FECi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgICAgbXZYICAgICB4IGNvb3JkaW5hdGUgb2YgdGhlIGNhbmRpZGF0ZSBtb3Rpb24gdmVjdG9yCi0gKiBbaW5dICAgICBtdlkgICAgIHkgY29vcmRpbmF0ZSBvZiB0aGUgY2FuZGlkYXRlIG1vdGlvbiB2ZWN0b3IKLSAqIFtpbl0gICAgIGNhbmRTQUQgQ2FuZGlkYXRlIFNBRAotICogW2luXSAgICAgYmVzdE1WWCB4IGNvb3JkaW5hdGUgb2YgdGhlIGJlc3QgbW90aW9uIHZlY3RvcgotICogW2luXSAgICAgYmVzdE1WWSB5IGNvb3JkaW5hdGUgb2YgdGhlIGJlc3QgbW90aW9uIHZlY3RvcgotICogW2luXSAgICAgYmVzdFNBRCBiZXN0IFNBRAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9JTlQgLS0gMSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHNhZCBpcyB0aGUgYmVzdAotICogICAgICAgICAgICAwIHRvIGluZGljYXRlIHRoYXQgaXQgaXMgTk9UIHRoZSBiZXN0IFNBRAotICovCi0KLU9NWF9JTlQgYXJtVkNNNFAyX0NvbXBhcmVNViAoCi0gICAgT01YX1MxNiBtdlgsCi0gICAgT01YX1MxNiBtdlksCi0gICAgT01YX0lOVCBjYW5kU0FELAotICAgIE9NWF9TMTYgYmVzdE1WWCwKLSAgICBPTVhfUzE2IGJlc3RNVlksCi0gICAgT01YX0lOVCBiZXN0U0FEKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0FDRENQcmVkaWN0Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhZGFwdGl2ZSBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uIGZvciBhbiBpbnRyYSBibG9jay4gUHJpb3IKLSAqIHRvIHRoZSBmdW5jdGlvbiBjYWxsLCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAocHJlZERpcikgc2hvdWxkIGJlIHNlbGVjdGVkCi0gKiBhcyBzcGVjaWZpZWQgaW4gc3ViY2xhdXNlIDcuNC4zLjEgb2YgSVNPL0lFQyAxNDQ5Ni0yLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcFNyY0RzdCAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHF1YW50aXplZCBjb2VmZmljaWVudCByZXNpZHVhbHMgKFBRRikgb2YgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBibG9jawotICogW2luXSBwUHJlZEJ1ZlJvdyBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCi0gKiBbaW5dIHBQcmVkQnVmQ29sIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKLSAqIFtpbl0gY3VyUVAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgY3VycmVudCBibG9jay4gY3VyUVAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBtYXkgZXF1YWwgdG8gcHJlZFFQIGVzcGVjaWFsbHkgd2hlbiB0aGUgY3VycmVudAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrIGFuZCB0aGUgcHJlZGljdG9yIGJsb2NrIGFyZSBpbiB0aGUgc2FtZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2suCi0gKiBbaW5dIHByZWRRUCAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jawotICogW2luXSBwcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5Ci0gKiBbaW5dIEFDUHJlZEZsYWcgIGEgZmxhZyBpbmRpY2F0aW5nIGlmIEFDIHByZWRpY3Rpb24gc2hvdWxkIGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkLiBJdCBpcyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgaW4gdGhlIGJpdAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBzeW50YXggb2YgTVBFRy00Ci0gKiBbaW5dIHZpZGVvQ29tcCAgIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2UsIGNocm9taW5hbmNlIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiBbaW5dIGZsYWcgICAgICAgIFRoaXMgZmxhZyBkZWZpbmVzIHRoZSBpZiBvbmUgd2FudHMgdG8gdXNlIHRoaXMgZnVuY3Rpb25zIHRvCi0gKiAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZSBQUUYgKHNldCAxLCBwcmVkaWN0aW9uKSBvciBRRiAoc2V0IDAsIHJlY29uc3RydWN0aW9uKQotICogW291dF0gICAgcFByZUFDUHJlZGljdCAgIHBvaW50ZXIgdG8gdGhlIHByZWRpY3RlZCBjb2VmZmljaWVudHMgYnVmZmVyLgotICogICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGxlZCBPTkxZIGlmIGl0IGlzIG5vdCBOVUxMCi0gKiBbb3V0XSAgICBwU3JjRHN0ICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcXVhbnRpemVkIGNvZWZmaWNpZW50cyAoUUYpIG9mIHRoZSBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sKLSAqIFtvdXRdICAgIHBQcmVkQnVmUm93IHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgotICogW291dF0gICAgcFByZWRCdWZDb2wgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCi0gKiBbb3V0XSAgICBwU3VtRXJyICAgICBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIHN1bSBvZiB0aGUgZGlmZmVyZW5jZQotICogICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiBwcmVkaWN0ZWQgYW5kIHVucHJlZGljdGVkIGNvZWZmaWNpZW50cwotICogICAgICAgICAgICAgICAgICAgICAgSWYgdGhpcyBpcyBOVUxMLCBkbyBub3QgdXBkYXRlCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfQUNEQ1ByZWRpY3QoCi0gICAgIE9NWF9TMTYgKiBwU3JjRHN0LAotICAgICBPTVhfUzE2ICogcFByZUFDUHJlZGljdCwKLSAgICAgT01YX1MxNiAqIHBQcmVkQnVmUm93LAotICAgICBPTVhfUzE2ICogcFByZWRCdWZDb2wsCi0gICAgIE9NWF9JTlQgY3VyUVAsCi0gICAgIE9NWF9JTlQgcHJlZFFQLAotICAgICBPTVhfSU5UIHByZWREaXIsCi0gICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKLSAgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgIHZpZGVvQ29tcCwKLSAgICAgT01YX1U4IGZsYWcsCi0gICAgIE9NWF9JTlQgKnBTdW1FcnIKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9TZXRQcmVkRGlyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBkZXRlY3RpbmcgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBibG9ja0luZGV4ICBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiBhcyBkZWZpbmVkIGluIHN1YmNsYXVzZSA2LjEuMy44LCBvZiBJU08vSUVDCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ0OTYtMi4gRnVydGhlcm1vcmUsIGluZGV4ZXMgNiB0byA5IGluZGljYXRlIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhIGJsb2NrcyBzcGF0aWFsbHkgY29ycmVzcG9uZGluZyB0byBsdW1pbmFuY2UKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3MgMCB0byAzIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suCi0gKiBbaW5dIHBDb2VmQnVmUm93IHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKLSAqIFtpbl0gcFFwQnVmICAgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBidWZmZXIKLSAqIFtvdXRdICAgIHByZWRRUCAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jawotICogW291dF0gICAgcHJlZERpciAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQotICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgIHByZWRpY3QgdmVydGljYWxseQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX1NldFByZWREaXIoCi0gICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKLSAgICAgT01YX1MxNiAqcENvZWZCdWZSb3csCi0gICAgIE9NWF9TMTYgKnBDb2VmQnVmQ29sLAotICAgICBPTVhfSU5UICpwcmVkRGlyLAotICAgICBPTVhfSU5UICpwcmVkUVAsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFFwQnVmCi0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZyBmb3Igb25lIGludHJhIGJsb2NrLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcHBCaXRTdHJlYW0gICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0IHN0cmVhbQotICogW2luXSBwQml0T2Zmc2V0ICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LgotICogW2luXSBwUURjdEJsa0NvZWYgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudAotICogW2luXSBwcmVkRGlyICAgICAgICAgQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24sIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB6aWd6YWcgc2NhbiBwYXR0ZXJuLiBUaGlzIHRha2VzIG9uZSBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX05PTkUgICAgICAgICAgQUMgcHJlZGljdGlvbiBub3QgdXNlZC4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBIb3Jpem9udGFsIHByZWRpY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgVmVydGljYWwgcHJlZGljdGlvbi4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCi0gKiBbaW5dIHBhdHRlcm4gICAgICAgICBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBibG9jayBpcyBlbmNvZGVkCi0gKiBbaW5dIHN0YXJ0ICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggMHRoIGVsZW1lbnQKLSAqICAgICAgICAgICAgICAgICAgICAgIG9yIDFzdC4KLSAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhKAotICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAotICAgICBPTVhfVTggcHJlZERpciwKLSAgICAgT01YX1U4IHBhdHRlcm4sCi0gICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgT01YX1U4IHN0YXJ0Ci0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRyYSBjb2RlZCBibG9jay4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBwQml0U3RyZWFtICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdHN0cmVhbSBidWZmZXIKLSAqIFtpbl0gcEJpdE9mZnNldCAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLTddLgotICogW2luXSBwcmVkRGlyICAgICAgICAgQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHppZ3phZyBzY2FuIHBhdHRlcm4uIEl0IHRha2VzIG9uZSBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX05PTkUgIEFDIHByZWRpY3Rpb24gbm90IHVzZWQ7Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtIGNsYXNzaWNhbCB6aWd6YWcgc2NhbjsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgSG9yaXpvbnRhbCBwcmVkaWN0aW9uOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtIGFsdGVybmF0ZS12ZXJ0aWNhbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2NhbjsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgVmVydGljYWwgcHJlZGljdGlvbjsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGh1cyBwZXJmb3JtCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0ZS1ob3Jpem9udGFsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgotICogW2luXSB2aWRlb0NvbXAgICAgICAgdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2Ugb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCi0gKiBbaW5dIHN0YXJ0ICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggMHRoIGVsZW1lbnQKLSAqICAgICAgICAgICAgICAgICAgICAgIG9yIDFzdC4KLSAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKLSAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQotICogW291dF0gICAgcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmEoCi0gICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0gICAgIE9NWF9TMTYgKiBwRHN0LAotICAgICBPTVhfVTggcHJlZERpciwKLSAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLCAKLSAgICAgT01YX1U4ICBzdGFydAotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGZpbGxpbmcgb2YgdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBhY2NvcmRpbmcgdG8gdGhlIHJ1biwgbGV2ZWwKLSAqIGFuZCBzaWduLCBhbHNvIHVwZGF0ZXMgdGhlIGluZGV4Ci0gKiAKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dICBzdG9yZVJ1biAgICAgICAgU3RvcmVkIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpICAgCi0gKiBbaW5dICBzdG9yZUxldmVsICAgICAgU3RvcmVkIExldmVsIHZhbHVlIChub24temVybyB2YWx1ZSkKLSAqIFtpbl0gIHNpZ24gICAgICAgICAgICBGbGFnIGluZGljYXRpbmcgdGhlIHNpZ24gb2YgbGV2ZWwKLSAqIFtpbl0gIGxhc3QgICAgICAgICAgICBzdGF0dXMgb2YgdGhlIGxhc3QgZmxhZwotICogW2luXSAgcEluZGV4ICAgICAgICAgIHBvaW50ZXIgdG8gY29lZmZpY2llbnQgaW5kZXggaW4gOHg4IG1hdHJpeAotICogW291dF0gcEluZGV4ICAgICAgICAgIHBvaW50ZXIgdG8gdXBkYXRlZCBjb2VmZmljaWVudCBpbmRleCBpbiA4eDggCi0gKiAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4Ci0gKiBbaW5dICBwWmlnemFnVGFibGUgICAgcG9pbnRlciB0byB0aGUgemlnemFnIHRhYmxlcwotICogW291dF0gcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcigKLSAgICBPTVhfVTMyIHN0b3JlUnVuLAotICAgIE9NWF9TMTYgKiBwRHN0LAotICAgIE9NWF9TMTYgc3RvcmVMZXZlbCwKLSAgICBPTVhfVTggIHNpZ24sCi0gICAgT01YX1U4ICBsYXN0LAotICAgIE9NWF9VOCAgKiBpbmRleCwKLSAgICBjb25zdCBPTVhfVTggKiBwWmlnemFnVGFibGUKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9HZXRWTENCaXRzCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBlc2NhcGUgbW9kZSBkZWNpc2lvbiBiYXNlZCBvbiB0aGUgcnVuLCBydW4rLCBsZXZlbCwgbGV2ZWwrIGFuZCAKLSAqIGxhc3QgY29tYmluYXRpb25zLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotICoJCQkJCQkJCXRoZSBiaXQgc3RyZWFtCi0gKiBbaW5dCXBCaXRPZmZzZXQJCXBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKgkJCQkJCQkJYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3Ci0gKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCi0gKiBbaW5dIHN0YXJ0ICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggCi0gKiAgICAgICAgICAgICAgICAgICAgICAwdGggZWxlbWVudCBvciAxc3QuCi0gKiBbaW4vb3V0XSBwTGFzdCAgICAgICBwb2ludGVyIHRvIGxhc3Qgc3RhdHVzIGZsYWcKLSAqIFtpbl0gcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAgICAgIFRoZSBydW4gdmFsdWUgZnJvbSB3aGljaCBsZXZlbCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogbGFzdCA9PSAwCi0gKiBbaW5dIEluZGV4QmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAgICBBcnJheSBpbmRleCBpbiB0aGUgVkxDIHRhYmxlIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRpbmcgdG8gdGhlICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgCi0gKiBbaW5dIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDEgICAgICBUaGUgcnVuIHZhbHVlIGZyb20gd2hpY2ggbGV2ZWwgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IGxhc3QgPT0gMQotICogW2luXSBJbmRleEJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDEgICAgQXJyYXkgaW5kZXggaW4gdGhlIFZMQyB0YWJsZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50aW5nIHRvIHRoZSAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwIAotICogW2luXSBwUnVuSW5kZXhUYWJsZUwwICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dIHBWbGNUYWJsZUwwICAgICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gcFJ1bkluZGV4VGFibGVMMSAgICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQotICogW2luXSBwVmxjVGFibGVMMSAgICAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dIHBMTUFYVGFibGVMMCAgICAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gcExNQVhUYWJsZUwxICAgICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQotICogW2luXSBwUk1BWFRhYmxlTDAgICAgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSBwUk1BWFRhYmxlTDEgICAgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQotICogW291dF1wRHN0CQkJICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Ci0gKgkJCQkJCQlibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfR2V0VkxDQml0cyAoCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgICAgICAgICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLQkJCSAgT01YX1MxNiAqIHBEc3QsCi0JCQkgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKLQkJCSAgT01YX1U4ICAgIHN0YXJ0LAkJCSAgCi0JCQkgIE9NWF9VOCAgKiBwTGFzdCwKLQkJCSAgT01YX1U4ICAgIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAsCi0JCQkgIE9NWF9VOCAgICBtYXhJbmRleEZvck11bHRpcGxlRW50cmllc0wwLAotCQkJICBPTVhfVTggICAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEsCi0JCQkgIE9NWF9VOCAgICBtYXhJbmRleEZvck11bHRpcGxlRW50cmllc0wxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMCwKLQkJCSAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwWmlnemFnVGFibGUKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9QdXRWTENCaXRzCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDaGVja3MgdGhlIHR5cGUgb2YgRXNjYXBlIE1vZGUgYW5kIHB1dCBlbmNvZGVkIGJpdHMgZm9yIAotICogcXVhbnRpemVkIERDVCBjb2VmZmljaWVudHMuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQkgcHBCaXRTdHJlYW0gICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqCQkJCQkJICB0aGUgYml0IHN0cmVhbQotICogW2luXQkgcEJpdE9mZnNldCAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICogICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKLSAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KLSAqIFtpbl0gIHN0YXJ0ICAgICAgICAgICAgc3RhcnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuY29kaW5nIGJlZ2lucyB3aXRoIAotICogICAgICAgICAgICAgICAgICAgICAgICAwdGggZWxlbWVudCBvciAxc3QuCi0gKiBbaW5dICBtYXhTdG9yZVJ1bkwwICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsYXN0ID0gMAotICogW2luXSAgbWF4U3RvcmVSdW5MMSAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQotICogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGFzdCA9IDEKLSAqIFtpbl0gIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wwIAotICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAotICogICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAotICogICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKSBmb3IgbGFzdCA9IDAKLSAqIFtpbl0gIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxIAotICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAotICogICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAotICogICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKSBmb3IgbGFzdCA9IDEKLSAqIFtpbl0gIHBSdW5JbmRleFRhYmxlTDAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dICBwVmxjVGFibGVMMCAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dICBwUnVuSW5kZXhUYWJsZUwxIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQotICogW2luXSAgcFZsY1RhYmxlTDEgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMQotICogW2luXSAgcExNQVhUYWJsZUwwICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gIHBMTUFYVGFibGVMMSAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dICBwUk1BWFRhYmxlTDAgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gIHBSTUFYVGFibGVMMSAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQotICogW291dF0gcFFEY3RCbGtDb2VmICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50Ci0gKiBbb3V0XSBwcEJpdFN0cmVhbSAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAotICogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgotICogW291dF0gcEJpdE9mZnNldCAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX1B1dFZMQ0JpdHMgKAotICAgICAgICAgICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKLSAgICAgICAgICAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotICAgICAgICAgICAgICBPTVhfVTggc3RhcnQsCi0gICAgICAgICAgICAgIE9NWF9VOCBtYXhTdG9yZVJ1bkwwLAotICAgICAgICAgICAgICBPTVhfVTggbWF4U3RvcmVSdW5MMSwKLSAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMCwKLSAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDAsCi0gICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDAsCi0JCQkgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcExNQVhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJNQVhUYWJsZUwxLAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFppZ3phZ1RhYmxlCi0pOwotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGNhbGN1bGF0aW5nIHRoZSBWTEMgYml0cyBkZXBlbmRpbmcgb24gdGhlIGVzY2FwZSB0eXBlIGFuZCBpbnNlcnQgCi0gKiB0aGUgc2FtZSBpbiB0aGUgYml0c3RyZWFtCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQkgcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotICoJICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJpdCBzdHJlYW0KLSAqIFtpbl0JIHBCaXRPZmZzZXQgICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNwotICogW2luXSAgcnVuICAgICAgICAgICAgICAgIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpIHRvIGJlIGVuY29kZWQgIAotICogW2luXSAgbGV2ZWwgICAgICAgICAgICAgIExldmVsIHZhbHVlIChub24temVybyB2YWx1ZSkgdG8gYmUgZW5jb2RlZAotICogW2luXSAgcnVuUGx1cyAgICAgICAgICAgIENhbGN1bGF0ZWQgYXMgcnVuUGx1cyA9IHJ1biAtIChSTUFYICsgMSkgIAotICogW2luXSAgbGV2ZWxQbHVzICAgICAgICAgIENhbGN1bGF0ZWQgYXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxQbHVzID0gc2lnbihsZXZlbCkqW2FicyhsZXZlbCkgLSBMTUFYXQotICogW2luXSAgZk1vZGUgICAgICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyB0aGUgZXNjYXBlIG1vZGVzCi0gKiBbaW5dICBsYXN0ICAgICAgICAgICAgICAgc3RhdHVzIG9mIHRoZSBsYXN0IGZsYWcKLSAqIFtpbl0gIG1heFJ1bkZvck11bHRpcGxlRW50cmllcyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIHdpbGwgYmUgZXF1YWwgdG8gMTogCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKLSAqIFtpbl0gIHBSdW5JbmRleFRhYmxlICAgICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbgotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX3RhYmxlc19WTEMuaAotICogW2luXSAgcFZsY1RhYmxlICAgICAgICAgIFZMQyB0YWJsZSBkZWZpbmVkIGluIGFybVZDTTRQMl9IdWZmX3RhYmxlc19WTEMuaAotICogW291dF0gcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdIHBCaXRPZmZzZXQgICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlciAoCi0gICAgICAgICAgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgICAgICAgICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLSAgICAgICAgICAgICAgT01YX1UzMiBydW4sCi0gICAgICAgICAgICAgIE9NWF9TMTYgbGV2ZWwsIAotCQkJICBPTVhfVTMyIHJ1blBsdXMsCi0gICAgICAgICAgICAgIE9NWF9TMTYgbGV2ZWxQbHVzLCAKLSAgICAgICAgICAgICAgT01YX1U4ICBmTW9kZSwKLQkJCSAgT01YX1U4ICBsYXN0LAotICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllcywgCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKnBSdW5JbmRleFRhYmxlLAotICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZQotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgZXNjYXBlIG1vZGUgZGVjaXNpb24gYmFzZWQgb24gdGhlIHJ1biwgcnVuKywgbGV2ZWwsIGxldmVsKyBhbmQgCi0gKiBsYXN0IGNvbWJpbmF0aW9ucy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHJ1biAgICAgICAgICAgICBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSB0byBiZSBlbmNvZGVkICAKLSAqIFtpbl0gbGV2ZWwgICAgICAgICAgIExldmVsIHZhbHVlIChub24temVybyB2YWx1ZSkgdG8gYmUgZW5jb2RlZAotICogW2luXSBydW5QbHVzICAgICAgICAgQ2FsY3VsYXRlZCBhcyBydW5QbHVzID0gcnVuIC0gKFJNQVggKyAxKSAgCi0gKiBbaW5dIGxldmVsUGx1cyAgICAgICBDYWxjdWxhdGVkIGFzIAotICogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxQbHVzID0gc2lnbihsZXZlbCkqW2FicyhsZXZlbCkgLSBMTUFYXQotICogW2luXSBtYXhTdG9yZVJ1biAgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKLSAqIFtpbl0gbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzIAotICogICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCAKLSAqICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCi0gKiAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQotICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgotICogW2luXSBwUnVuSW5kZXhUYWJsZSAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKLSAqICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBSZXR1cm5zIGFuIEVzY2FwZSBtb2RlIHdoaWNoIGNhbiB0YWtlIHZhbHVlcyBmcm9tIDAgdG8gMwotICogMCAtLT4gbm8gZXNjYXBlIG1vZGUsIDEgLS0+IGVzY2FwZSB0eXBlIDEsCi0gKiAxIC0tPiBlc2NhcGUgdHlwZSAyLCAzIC0tPiBlc2NhcGUgdHlwZSAzLCBjaGVjayBzZWN0aW9uIDcuNC4xLjMKLSAqIGluIHRoZSBNUEVHIElTTyBzdGFuZGFyZC4KLSAqCi0gKi8KLQotT01YX1U4IGFybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUoCi0gICAgIE9NWF9VMzIgcnVuLAotICAgICBPTVhfVTMyIHJ1blBsdXMsCi0gICAgIE9NWF9TMTYgbGV2ZWwsCi0gICAgIE9NWF9TMTYgbGV2ZWxQbHVzLAotICAgICBPTVhfVTggIG1heFN0b3JlUnVuLAotICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllcywKLSAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotICAgICBjb25zdCBPTVhfVTggICpwUnVuSW5kZXhUYWJsZQotKTsKLQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIHNlYXJjaDsgZXN0aW1hdGVzIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICAKLSAqIEJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIHVzaW5nIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCAKLSAqIHRoZXJlZm9yZSBhIHNoaWZ0IGxlZnQgb3IgcmlnaHQgYnkgMSBiaXQgbWF5IGJlIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSAKLSAqIGlucHV0IG9yIG91dHB1dCBNVnMgd2l0aCBvdGhlciBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgCi0gKiBpbnB1dCBNVnMgcmVwcmVzZW50ZWQgdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwU3JjUmVmQnVmCQlwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgTUIgdGhhdCAKLSAqICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgICAgICAgICBwbGFuZS4KLSAqIFtpbl0JcmVmV2lkdGgJCSAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZQotICogW2luXQlwUmVmUmVjdAkJICBwb2ludGVyIHRvIHRoZSB2YWxpZCByZWN0YW5ndWxhciBpbiByZWZlcmVuY2UgcGxhbmUuIFJlbGF0aXZlIHRvIGltYWdlIG9yaWdpbi4gCi0gKiAgICAgICAgICAgICAgICAgICAgSXQncyBub3QgbGltaXRlZCB0byB0aGUgaW1hZ2UgYm91bmRhcnksIGJ1dCBkZXBlbmRlZCBvbiB0aGUgcGFkZGluZy4gRm9yIGV4YW1wbGUsIAotICogICAgICAgICAgICAgICAgICAgIGlmIHlvdSBwYWQgNCBwaXhlbHMgb3V0c2lkZSB0aGUgaW1hZ2UgYm9yZGVyLCB0aGVuIHRoZSB2YWx1ZSBmb3IgbGVmdCBib3JkZXIgCi0gKiAgICAgICAgICAgICAgICAgICAgY2FuIGJlIC00Ci0gKiBbaW5dCXBTcmNDdXJyQnVmCQlwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgZXh0cmFjdGVkIGZyb20gb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgCi0gKiAgICAgICAgICAgICAgICAgICAgMjU2IGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LgotICogW2luXSBwQ3VyclBvaW50UG9zCXBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUKLSAqIFtpbl0gcFNyY1ByZU1WCQkgIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIHByZWRpY3RlZCBNVgotICogW2luXSBwU3JjUHJlU0FECQlwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCBieSBwU3JjUHJlTVYpCi0gKiBbaW5dIHNlYXJjaFJhbmdlCQlzZWFyY2ggcmFuZ2UgZm9yIDE2WDE2IGludGVnZXIgYmxvY2ssdGhlIHVuaXRzIG9mIGl0IGlzIGZ1bGwgcGl4ZWwsdGhlIHNlYXJjaCByYW5nZSAKLSAqICAgICAgICAgICAgICAgICAgICBpcyB0aGUgc2FtZSBpbiBhbGwgZGlyZWN0aW9ucy5JdCBpcyBpbiBpbmNsdXNpdmUgb2YgdGhlIGJvdW5kYXJ5IGFuZCBzcGVjaWZpZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgdGVybXMgb2YgaW50ZWdlciBwaXhlbCB1bml0cy4KLSAqIFtpbl0gcE1FU3BlYwkJCSAgdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCi0gKiAgICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyAKLSAqICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4KLSAqIFtpbl0gQmxvY2tTaXplICAgICBNYWNyb0Jsb2NrIFNpemUgaS5lIGVpdGhlciAxNngxNiBvciA4eDguCi0gKiBbb3V0XQlwRHN0TVYJCQlwb2ludGVyIHRvIGVzdGltYXRlZCBNVgotICogW291dF0JcERzdFNBRAkJCXBvaW50ZXIgdG8gbWluaW11bSBTQUQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfU3RzX05vRXJyIKhDIG5vIGVycm9yLgotICogT01YX1N0c19CYWRBcmdFcnIgqEMgYmFkIGFyZ3VtZW50cwotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcigKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgICBPTVhfSU5UIHJlZldpZHRoLAotICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNQcmVNViwKLSAgICAgY29uc3QgT01YX0lOVCAqcFNyY1ByZVNBRCwKLSAgICAgdm9pZCAqcE1FU3BlYywKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNViwKLSAgICAgT01YX0lOVCAqcERzdFNBRCwKLSAgICAgT01YX1U4IEJsb2NrU2l6ZQotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYSAxNngxNiBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gIFJldHVybnMgdGhlIGVzdGltYXRlZCAKLSAqIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyB0aGUgaGFsZi1waXhlbCAKLSAqIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCAKLSAqIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdE1WLCBpLmUuLCB0aGUgaW5pdGlhbCBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCAKLSAqIGV4dGVybmFsbHkuICBUaGUgaW5wdXQgcGFyYW1ldGVycyBwU3JjUmVmQnVmIGFuZCBwU2VhcmNoUG9pbnRSZWZQb3Mgc2hvdWxkIGJlIAotICogc2hpZnRlZCBieSB0aGUgd2lubmluZyBNViBvZiAxNngxNiBpbnRlZ2VyIHNlYXJjaCBwcmlvciB0byBjYWxsaW5nIEJsb2NrTWF0Y2hfSGFsZl8xNngxNi4gIAotICogVGhlIGZ1bmN0aW9uIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBTcmNSZWZCdWYJCXBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSBNQiAKLSAqICAgICAgICAgICAgICAgICAgICB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIAotICogICAgICAgICAgICAgICAgICAgIHRoZQljdXJyZW50IHBsYW5lLgotICogW2luXQlyZWZXaWR0aAkJICB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lCi0gKiBbaW5dCXBSZWZSZWN0CQkgIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlCi0gKiBbaW5dCXBTcmNDdXJyQnVmCQlwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgZXh0cmFjdGVkIGZyb20gb3JpZ2luYWwgcGxhbmUgCi0gKiAgICAgICAgICAgICAgICAgICAgKGxpbmVhciBhcnJheSwgMjU2IGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqIFtpbl0JcFNlYXJjaFBvaW50UmVmUG9zCXBvc2l0aW9uIG9mIHRoZSBzdGFydGluZyBwb2ludCBmb3IgaGFsZiBwaXhlbCBzZWFyY2ggKHNwZWNpZmllZCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzKSBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLgotICogW2luXQlybmRWYWwJCQkgIHJvdW5kaW5nIGNvbnRyb2wgYml0IGZvciBoYWxmIHBpeGVsIG1vdGlvbiBlc3RpbWF0aW9uOyAKLSAqICAgICAgICAgICAgICAgICAgICAwPXJvdW5kaW5nIGNvbnRyb2wgZGlzYWJsZWQ7IDE9cm91bmRpbmcgY29udHJvbCBlbmFibGVkCi0gKiBbaW5dCXBTcmNEc3RNVgkJcG9pbnRlciB0byB0aGUgaW5pdGlhbCBNViBlc3RpbWF0ZTsgdHlwaWNhbGx5IGdlbmVyYXRlZCBkdXJpbmcgYSBwcmlvciAKLSAqICAgICAgICAgICAgICAgICAgMTZYMTYgaW50ZWdlciBzZWFyY2ggYW5kIGl0cyB1bml0IGlzIGhhbGYgcGl4ZWwuCi0gKiBbaW5dIEJsb2NrU2l6ZSAgICAgTWFjcm9CbG9jayBTaXplIGkuZSBlaXRoZXIgMTZ4MTYgb3IgOHg4LgotICogW291dF1wU3JjRHN0TVYJCXBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WCi0gKiBbb3V0XXBEc3RTQUQJCQlwb2ludGVyIHRvIG1pbmltdW0gU0FECi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1N0c19Ob0VyciCoQyBubyBlcnJvcgotICogT01YX1N0c19CYWRBcmdFcnIgqEMgYmFkIGFyZ3VtZW50cwotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZigKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgICBPTVhfSU5UIHJlZldpZHRoLAotICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAotICAgICBPTVhfSU5UIHJuZFZhbCwKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKLSAgICAgT01YX0lOVCAqcERzdFNBRCwKLSAgICAgT01YX1U4IEJsb2NrU2l6ZQotKTsKLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9QYWRNVgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgbW90aW9uIHZlY3RvciBwYWRkaW5nIGZvciBhIG1hY3JvYmxvY2suCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwU3JjRHN0TVYgICAgICAgcG9pbnRlciB0byBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBvZiB0aGUgY3VycmVudAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrCi0gKiBbaW5dIHBUcmFuc3AgICAgICAgICBwb2ludGVyIHRvIHRyYW5zcGFyZW50IHN0YXR1cyBidWZmZXIgb2YgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgbWFjcm9ibG9jawotICogW291dF0gICAgcFNyY0RzdE1WICAgICAgIHBvaW50ZXIgdG8gbW90aW9uIHZlY3RvciBidWZmZXIgaW4gd2hpY2ggdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbiB2ZWN0b3JzIGhhdmUgYmVlbiBwYWRkZWQKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX1BhZE1WKAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqIHBTcmNEc3RNViwKLSAgICAgT01YX1U4ICogcFRyYW5zcAotKTsKLQotLyogCi0gKiBILjI2NCBTcGVjaWZpYyBEZWNsYXJhdGlvbnMgCi0gKi8KLS8qIERlZmluZXMgKi8KLSNkZWZpbmUgQVJNX000UDEwX1FfT0ZGU0VUICAgICAgICAoMTUpCi0KLQotLyogRGVxdWFudCB0YWJsZXMgKi8KLQotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFsxNl07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfUG9zVG9WQ29sMngyWzRdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ZNYXRyaXhbNl1bM107Ci1leHRlcm4gY29uc3QgT01YX1UzMiBhcm1WQ000UDEwX01GTWF0cml4WzZdWzNdOwotCi0KLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybSB0aGUgd29yayByZXF1aXJlZCBieSB0aGUgT3Blbk1BWAotICogRGVjb2RlQ29lZmZzVG9QYWlyIGZ1bmN0aW9uIGFuZCBEZWNvZGVDaHJvbWFEQ0NvZWZmc1RvUGFpci4KLSAqIFNpbmNlIG1vc3Qgb2YgdGhlIGNvZGUgaXMgY29tbW9uIHdlIHNoYXJlIGl0IGhlcmUuCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBCaXRTdHJlYW0JCURvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlcgotICogW2luXQlwT2Zmc2V0CQkJUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCi0gKgkJCQkJCQkJdG8gYnkgKnBwQml0U3RyZWFtCi0gKiBbaW5dCXNNYXhOdW1Db2VmZglNYXhpbXVtIG51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgaW4gY3VycmVudAotICoJCQkJCQkJCWJsb2NrICg0LDE1IG9yIDE2KQotICogW2luXQluVGFibGUgICAgICAgICAgVGFibGUgbnVtYmVyICgwIHRvIDQpIGFjY29yZGluZyB0byB0aGUgZml2ZSBjb2x1bW5zCi0gKiAgICAgICAgICAgICAgICAgICAgICBvZiBUYWJsZSA5LTUgaW4gdGhlIEguMjY0IHNwZWMKLSAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKLSAqIFtvdXRdCXBPZmZzZXQJCQkqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAotICogW291dF0JcE51bUNvZWZmCQlQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4KLSAqCQkJCQkJCQl0aGlzIGJsb2NrCi0gKiBbb3V0XQlwcFBvc0NvZWZidWYJRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwKLSAqCQkJCQkJCQljb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlcgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLQotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcigKLSAgICAgY29uc3QgT01YX1U4KiogcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9TMzIqIHBPZmZzZXQsCi0gICAgIE9NWF9VOCogcE51bUNvZWZmLAotICAgICBPTVhfVTgqKnBwUG9zQ29lZmJ1ZiwKLSAgICAgT01YX0lOVCBuVGFibGUsCi0gICAgIE9NWF9JTlQgc01heE51bUNvZWZmICAgICAgICAKLSApOwotCi0vKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtIERDIHN0eWxlIGludHJhIHByZWRpY3Rpb24sIGF2ZXJhZ2luZyB1cHBlciBhbmQgbGVmdCBibG9jawotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBTcmNMZWZ0CQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgbGVmdCBjb2VmZmljaWVudHM6Ci0gKgkJCQkJCQkJcFt4LCB5XSAoeCA9IC0xLCB5ID0gMC4uMykKLSAqIFtpbl0JcFNyY0Fib3ZlCQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgYWJvdmUgY29lZmZpY2llbnRzOgotICoJCQkJCQkJCXBbeCx5XSAoeCA9IDAuLjMsIHkgPSAtMSkKLSAqIFtpbl0JbGVmdFN0ZXAJCVN0ZXAgb2YgbGVmdCBjb2VmZmljaWVudCBidWZmZXIKLSAqIFtpbl0JZHN0U3RlcAkJCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICogW2luXQlhdmFpbGFiaWxpdHkJTmVpZ2hib3JpbmcgMTZ4MTYgTUIgYXZhaWxhYmlsaXR5IGZsYWcKLSAqIFtvdXRdCXBEc3QJCQlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBOb25lCi0gKi8KLQotdm9pZCBhcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDNHg0KAotICAgICBjb25zdCBPTVhfVTgqIHBTcmNMZWZ0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKLSAgICAgT01YX1U4KiBwRHN0LAotICAgICBPTVhfSU5UIGxlZnRTdGVwLAotICAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5ICAgICAgICAKLSk7Ci0KLS8qCi0gKiBEZXNjcmlwdGlvbgotICogVW5wYWNrIGEgNHg0IGJsb2NrIG9mIGNvZWZmaWNpZW50LXJlc2lkdWFsIHBhaXIgdmFsdWVzCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcHBTcmMJRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpcgotICoJCQkJCQlidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCi0gKiBbb3V0XQlwcFNyYwkqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sKLSAqIFtvdXRdCXBEc3QJUG9pbnRlciB0byB1bnBhY2tlZCA0eDQgYmxvY2sKLSAqLwotCi12b2lkIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQoCi0gICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAotICAgICBPTVhfUzE2KiBwRHN0Ci0pOwotCi0vKgotICogRGVzY3JpcHRpb24KLSAqIFVucGFjayBhIDJ4MiBibG9jayBvZiBjb2VmZmljaWVudC1yZXNpZHVhbCBwYWlyIHZhbHVlcwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwU3JjCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIKLSAqCQkJCQkJYnVmZmVyIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZwotICogW291dF0JcHBTcmMJKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrCi0gKiBbb3V0XQlwRHN0CVBvaW50ZXIgdG8gdW5wYWNrZWQgNHg0IGJsb2NrCi0gKi8KLQotdm9pZCBhcm1WQ000UDEwX1VucGFja0Jsb2NrMngyKAotICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKLSAgICAgT01YX1MxNiogcERzdAotKTsKLQotLyoKLSAqIERlc2NyaXB0aW9uCi0gKiBEZWJsb2NrIG9uZSBib3VuZGFyeSBwaXhlbAotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBRMCAgICAgICAgIFBvaW50ZXIgdG8gcGl4ZWwgcTAKLSAqIFtpbl0gU3RlcCAgICAgICAgU3RlcCBiZXR3ZWVuIHBpeGVscyBxMCBhbmQgcTEKLSAqIFtpbl0gdEMwICAgICAgICAgRWRnZSB0aHJlc2hvbGQgdmFsdWUKLSAqIFtpbl0gYWxwaGEgICAgICAgYWxwaGEgdGhyZXNob2xkIHZhbHVlCi0gKiBbaW5dIGJldGEgICAgICAgIGJldGEgdGhyZXNob2xkIHZhbHVlCi0gKiBbaW5dIGJTICAgICAgICAgIGRlYmxvY2tpbmcgc3RyZW5ndGgKLSAqIFtpbl0gQ2hyb21hRmxhZyAgVHJ1ZSBmb3IgY2hyb21hIGJsb2NrcwotICogW291dF0gcFEwICAgICAgICBEZWJsb2NrZWQgcGl4ZWxzCi0gKiAKLSAqLwotCi12b2lkIGFybVZDTTRQMTBfRGVCbG9ja1BpeGVsKAotICAgIE9NWF9VOCAqcFEwLCAgICAvKiBwb2ludGVyIHRvIHRoZSBwaXhlbCBxMCAqLwotICAgIGludCBTdGVwLCAgICAgICAvKiBzdGVwIGJldHdlZW4gcGl4ZWxzIHEwIGFuZCBxMSAqLwotICAgIGludCB0QzAsICAgICAgICAvKiBlZGdlIHRocmVzaG9sZCB2YWx1ZSAqLwotICAgIGludCBhbHBoYSwgICAgICAvKiBhbHBoYSAqLwotICAgIGludCBiZXRhLCAgICAgICAvKiBiZXRhICovCi0gICAgaW50IGJTLCAgICAgICAgIC8qIGRlYmxvY2tpbmcgc3RyZW5ndGggKi8KLSAgICBpbnQgQ2hyb21hRmxhZwotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBob3Jpem9udGFsIDEvMi1wZWwgcG9zaXRpb25zCi0gKgotICogUmVtYXJrczoKLSAqCi0gKglbaW5dCXBTcmMJCQlQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAotIAkJCQkJCQkJCQkJCQlpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQotICoJW2luXQlpU3JjU3RlcAlTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgotICoJW2luXQlpRHN0U3RlcAlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCi0gKglbaW5dCWlXaWR0aAkJV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqCVtpbl0JaUhlaWdodAkJSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKglbb3V0XQlwRHN0CSAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgMS8yLXBlbCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hKAotICAgICAgICBjb25zdCBPTVhfVTgqCQlwU3JjLCAKLQkJT01YX1UzMiAJaVNyY1N0ZXAsIAotCQlPTVhfVTgqIAlwRHN0LCAKLQkJT01YX1UzMiAJaURzdFN0ZXAsIAotCQlPTVhfVTMyIAlpV2lkdGgsIAotCQlPTVhfVTMyIAlpSGVpZ2h0Ci0pOwotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB2ZXJ0aWNhbCAxLzItcGVsIHBvc2l0aW9ucyAKLSAqIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICoJW2luXQlwU3JjCQkJUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSAKLSAqCQkJCQkJCQkJCQkJaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKLSAqCVtpbl0JaVNyY1N0ZXAJU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KLSAqCVtpbl0JaURzdFN0ZXAJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgotICoJW2luXQlpV2lkdGgJCVdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKglbaW5dCWlIZWlnaHQJCUhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jawotICoJW291dF0JcERzdCAgICAJUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIDEvMi1wZWwKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hKAkKLQkgY29uc3QgT01YX1U4KiAJcFNyYywgCi0JIE9NWF9VMzIgCWlTcmNTdGVwLCAKLSAJIE9NWF9VOCogCXBEc3QsCi0gCSBPTVhfVTMyIAlpRHN0U3RlcCwgCi0gCSBPTVhfVTMyIAlpV2lkdGgsIAotIAkgT01YX1UzMiAJaUhlaWdodAotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZEaWFnX0x1bWEKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yICgxLzIsIDEvMikgIHBvc2l0aW9ucyAKLSAqIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogIFtpbl0gICAgcFNyYyAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCi0gKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgotICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgotICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtvdXRdICAgcERzdCAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlICgxLzIsMS8yKS1wZWwKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYSggIAotICAgICAgICBjb25zdCBPTVhfVTgqICAgICBwU3JjLCAKLSAgICAgICAgT01YX1UzMiAgICAgaVNyY1N0ZXAsIAotICAgICAgICBPTVhfVTgqICAgICBwRHN0LCAKLSAgICAgICAgT01YX1UzMiAgICAgaURzdFN0ZXAsCi0gICAgICAgIE9NWF9VMzIgICAgIGlXaWR0aCwgCi0gICAgICAgIE9NWF9VMzIgICAgIGlIZWlnaHQKLSk7Ci0KLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRyYW5zZm9ybSBSZXNpZHVhbCA0eDQgQ29lZmZpY2llbnRzCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIHBTcmMJCVNvdXJjZSA0eDQgYmxvY2sKLSAqIFtvdXRdIHBEc3QJCURlc3RpbmF0aW9uIDR4NCBibG9jawotICoKLSAqLwotCi12b2lkIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQoT01YX1MxNiogcERzdCwgT01YX1MxNiAqcFNyYyk7Ci0KLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEZvcndhcmQgVHJhbnNmb3JtIFJlc2lkdWFsIDR4NCBDb2VmZmljaWVudHMKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgcFNyYwkJU291cmNlIDR4NCBibG9jawotICogW291dF0gcERzdAkJRGVzdGluYXRpb24gNHg0IGJsb2NrCi0gKgotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9Gd2RUcmFuc2Zvcm1SZXNpZHVhbDR4NChPTVhfUzE2KiBwRHN0LCBPTVhfUzE2ICpwU3JjKTsKLQotT01YX0lOVCBhcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NViAoCi0gICAgT01YX1MxNiAgbXZYLAotICAgIE9NWF9TMTYgIG12WSwKLSAgICBPTVhWQ01vdGlvblZlY3RvciBkaWZmTVYsIAotICAgIE9NWF9JTlQgY2FuZFNBRCwgCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKmJlc3RNViwgCi0gICAgT01YX1UzMiBuTGFtZGEsCi0gICAgT01YX1MzMiAqcEJlc3RDb3N0KTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNDT01NX1NBRAotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGUgdGhlIFNBRCBmb3IgTnhNIGJsb2Nrcy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFtpbl0JCXBTcmNPcmcJCVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrCi0gKiBbaW5dCQlpU3RlcE9yZwlTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIKLSAqIFtpbl0JCXBTcmNSZWYJCVBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jawotICogW2luXQkJaVN0ZXBSZWYJU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlcgotICogW2luXQkJaUhlaWdodAkJSGVpZ2h0IG9mIHRoZSBibG9jawotICogW2luXQkJaVdpZHRoCQlXaWR0aCBvZiB0aGUgYmxvY2sKLSAqIFtvdXRdCXBEc3RTQUQJCVBvaW50ZXIgb2YgcmVzdWx0IFNBRAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLU9NWFJlc3VsdCBhcm1WQ0NPTU1fU0FEKAkKLQljb25zdCBPTVhfVTgqIAlwU3JjT3JnLAotCU9NWF9VMzIgCWlTdGVwT3JnLAotCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYsCi0JT01YX1UzMiAJaVN0ZXBSZWYsCi0JT01YX1MzMioJcERzdFNBRCwKLQlPTVhfVTMyCQlpSGVpZ2h0LAotCU9NWF9VMzIJCWlXaWR0aCk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDQ09NTV9BdmVyYWdlCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIGJsb2NrcyBhbmQgc3RvcmVzIHRoZSByZXN1bHQuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKglbaW5dCXBQcmVkMAkJCVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMAotICoJW2luXQlwUHJlZDEJCQlQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEKLSAqCVtpbl0JaVByZWRTdGVwMAkgICAgU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMAotICoJW2luXQlpUHJlZFN0ZXAxCSAgICBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxCi0gKglbaW5dCWlEc3RTdGVwIAkJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCi0gKglbaW5dCWlXaWR0aAkJCVdpZHRoIG9mIHRoZSBibG9ja3MKLSAqCVtpbl0JaUhlaWdodAkJCUhlaWdodCBvZiB0aGUgYmxvY2tzCi0gKglbb3V0XQlwRHN0UHJlZAkJUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotIE9NWFJlc3VsdCBhcm1WQ0NPTU1fQXZlcmFnZSAoCi0JIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDAsCi0JIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDEsCQotCSBPTVhfVTMyCQlpUHJlZFN0ZXAwLAotCSBPTVhfVTMyCQlpUHJlZFN0ZXAxLAotCSBPTVhfVTgqCQlwRHN0UHJlZCwKLQkgT01YX1UzMgkJaURzdFN0ZXAsIAotCSBPTVhfVTMyCQlpV2lkdGgsCi0JIE9NWF9VMzIJCWlIZWlnaHQKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfU0FEUXVhcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgCi0gKiBhdmVyYWdlIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFtpbl0JCXBTcmMJCQkJUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2sKLSAqIFtpbl0JCXBTcmNSZWYwCQlQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwCi0gKiBbaW5dCQlwU3JjUmVmMQkJUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMQotICogW2luXQkJaVNyY1N0ZXAgCQlTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIKLSAqIFtpbl0JCWlSZWZTdGVwMAkJU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqIFtpbl0JCWlSZWZTdGVwMSAJU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqIFtpbl0JCWlIZWlnaHQJCQlIZWlnaHQgb2YgdGhlIGJsb2NrCi0gKiBbaW5dCQlpV2lkdGgJCQlXaWR0aCBvZiB0aGUgYmxvY2sKLSAqIFtvdXRdCXBEc3RTQUQJCQlQb2ludGVyIG9mIHJlc3VsdCBTQUQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi1PTVhSZXN1bHQgYXJtVkNNNFAxMF9TQURRdWFyKAotCWNvbnN0IE9NWF9VOCogCXBTcmMsCi0gICAgY29uc3QgT01YX1U4KiAJcFNyY1JlZjAsCi0JY29uc3QgT01YX1U4KiAJcFNyY1JlZjEsCQotICAgIE9NWF9VMzIgCWlTcmNTdGVwLAotICAgIE9NWF9VMzIJCWlSZWZTdGVwMCwKLSAgICBPTVhfVTMyCQlpUmVmU3RlcDEsCi0gICAgT01YX1UzMioJcERzdFNBRCwKLSAgICBPTVhfVTMyICAgICBpSGVpZ2h0LAotICAgIE9NWF9VMzIgICAgIGlXaWR0aAotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgY2hyb21hIGNvbXBvbmVudHMuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiAgW2luXSAgICBwU3JjICAgICAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCi0gKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgotICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgotICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgZHggICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS84IHBpeGVsIHVuaXQgKDB+NykgCi0gKiAgW2luXSAgICBkeSAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS84IHBpeGVsIHVuaXQgKDB+NykKLSAqICBbb3V0XSAgIHBEc3QgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlcgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLSBPTVhSZXN1bHQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEoCi0gICAgICAgIE9NWF9VOCAgICAgICpwU3JjLAotICAgICAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwKLSAgICAgICAgT01YX1U4ICAgICAgKnBEc3QsCi0gICAgICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLAotICAgICAgICBPTVhfVTMyICAgICBpV2lkdGgsCi0gICAgICAgIE9NWF9VMzIgICAgIGlIZWlnaHQsCi0gICAgICAgIE9NWF9VMzIgICAgIGR4LAotICAgICAgICBPTVhfVTMyICAgICBkeQotKTsKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGx1bWEgY29tcG9uZW50cy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqICBbaW5dICAgIHBTcmMgICAgICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGUgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKLSAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCi0gKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBkeCAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgdW5pdCAoMH4zKSAKLSAqICBbaW5dICAgIGR5ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgdW5pdCAoMH4zKSAKLSAqICBbb3V0XSAgIHBEc3QgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlcgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLQotIE9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEoCi0gICAgIGNvbnN0IE9NWF9VOCAgICAgKnBTcmMsCi0gICAgIE9NWF9VMzIgICAgaVNyY1N0ZXAsCi0gICAgIE9NWF9VOCAgICAgKnBEc3QsCi0gICAgIE9NWF9VMzIgICAgaURzdFN0ZXAsCi0gICAgIE9NWF9VMzIgICAgaVdpZHRoLAotICAgICBPTVhfVTMyICAgIGlIZWlnaHQsCi0gICAgIE9NWF9VMzIgICAgZHgsCi0gICAgIE9NWF9VMzIgICAgZHkKLSk7Ci0KLS8qKgotICogRnVuY3Rpb246IG9teFZDSDI2NF9EZXF1YW50VHJhbnNmb3JtQUNGcm9tUGFpcl9VOF9TMTZfQzFfREx4Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiBSZWNvbnN0cnVjdCB0aGUgNHg0IHJlc2lkdWFsIGJsb2NrIGZyb20gY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIsCi0gKiBwZXJmb3JtIGRlcXVhbnRpc2F0aW9uIGFuZCBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24gZm9yIDR4NCBibG9jayBvZgotICogcmVzaWR1YWxzIGFuZCB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgYmxvY2suCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcFNyYwkJRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24KLSAqCQkJCQkJCXBhaXIgYnVmZmVyIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZwotICogW2luXQlwREMJCQlQb2ludGVyIHRvIHRoZSBEQyBjb2VmZmljaWVudCBvZiB0aGlzIGJsb2NrLCBOVUxMCi0gKgkJCQkJCQlpZiBpdCBkb2Vzbid0IGV4aXN0Ci0gKiBbaW5dCVFQCQkJUXVhbnRpemF0aW9uIHBhcmFtZXRlcgotICogW2luXSBBQyAgICAgICAgICBGbGFnIGluZGljYXRpbmcgaWYgYXQgbGVhc3Qgb25lIG5vbi16ZXJvIGNvZWZmaWNpZW50IGV4aXN0cwotICogW291dF0JcERzdAkJcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCA0eDQgYmxvY2sgZGF0YQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1BQ0Zyb21QYWlyX1U4X1MxNl9DMV9ETHgoCi0gICAgIE9NWF9VOCAqKnBwU3JjLAotICAgICBPTVhfUzE2ICpwRHN0LAotICAgICBPTVhfSU5UIFFQLAotICAgICBPTVhfUzE2KiBwREMsCi0gICAgIGludCBBQwotKTsKLQotI2VuZGlmICAvKl9hcm1WaWRlb19IXyovCi0KLS8qRW5kIG9mIEZpbGUqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2FwaS9vbXhWQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9hcGkvb214VkMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IzY2M3Mi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2FwaS9vbXhWQy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDM4MSArMCwwIEBACi0vKioKLSAqIEZpbGU6IG9teFZDLmgKLSAqIEJyaWVmOiBPcGVuTUFYIERMIHYxLjAuMiAtIFZpZGVvIENvZGluZyBsaWJyYXJ5Ci0gKgotICogQ29weXJpZ2h0IKkgMjAwNS0yMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKgotICogVGhlc2UgbWF0ZXJpYWxzIGFyZSBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGxhd3MgYW5kIGNvbnRhaW4gbWF0ZXJpYWwgCi0gKiBwcm9wcmlldGFyeSB0byB0aGUgS2hyb25vcyBHcm91cCwgSW5jLiAgWW91IG1heSB1c2UgdGhlc2UgbWF0ZXJpYWxzIAotICogZm9yIGltcGxlbWVudGluZyBLaHJvbm9zIHNwZWNpZmljYXRpb25zLCB3aXRob3V0IGFsdGVyaW5nIG9yIHJlbW92aW5nIAotICogYW55IHRyYWRlbWFyaywgY29weXJpZ2h0IG9yIG90aGVyIG5vdGljZSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uLgotICogCi0gKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHJlcHJlc2VudGF0aW9ucyAKLSAqIG9yIHdhcnJhbnRpZXMsIGV4cHJlc3Mgb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZXNlIG1hdGVyaWFscywgaW5jbHVkaW5nLCAKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyAKLSAqIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBvciBub24taW5mcmluZ2VtZW50IG9mIGFueSBpbnRlbGxlY3R1YWwgcHJvcGVydHkuIAotICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCB3YXJyYW50aWVzLCBleHByZXNzIAotICogb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZSBjb3JyZWN0bmVzcywgYWNjdXJhY3ksIGNvbXBsZXRlbmVzcywgdGltZWxpbmVzcywgCi0gKiBhbmQgcmVsaWFiaWxpdHkgb2YgdGhlc2UgbWF0ZXJpYWxzLiAKLSAqCi0gKiBVbmRlciBubyBjaXJjdW1zdGFuY2VzIHdpbGwgdGhlIEtocm9ub3MgR3JvdXAsIG9yIGFueSBvZiBpdHMgUHJvbW90ZXJzLCAKLSAqIENvbnRyaWJ1dG9ycyBvciBNZW1iZXJzIG9yIHRoZWlyIHJlc3BlY3RpdmUgcGFydG5lcnMsIG9mZmljZXJzLCBkaXJlY3RvcnMsIAotICogZW1wbG95ZWVzLCBhZ2VudHMgb3IgcmVwcmVzZW50YXRpdmVzIGJlIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMsIHdoZXRoZXIgCi0gKiBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBmb3IgbG9zdCByZXZlbnVlcywgCi0gKiBsb3N0IHByb2ZpdHMsIG9yIG90aGVyd2lzZSwgYXJpc2luZyBmcm9tIG9yIGluIGNvbm5lY3Rpb24gd2l0aCB0aGVzZSAKLSAqIG1hdGVyaWFscy4KLSAqIAotICogS2hyb25vcyBhbmQgT3Blbk1BWCBhcmUgdHJhZGVtYXJrcyBvZiB0aGUgS2hyb25vcyBHcm91cCBJbmMuIAotICoKLSAqLwotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfT01YVkNfSF8KLSNkZWZpbmUgX09NWFZDX0hfCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLQotLyogNi4xLjEuMSBNb3Rpb24gVmVjdG9ycyAgKi8KLS8qIEluIG9teFZDLCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBPTVhfUzE2IGR4OwotICAgIE9NWF9TMTYgZHk7Ci19IE9NWFZDTW90aW9uVmVjdG9yOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9BdmVyYWdlXzh4ICAgKDYuMS4zLjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gOHg0LCA4eDgsIG9yIDh4MTYgYmxvY2tzLiAgVGhlIAotICogcmVzdWx0IGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gIFRoZSBibG9jayBhdmVyYWdlIGZ1bmN0aW9uIGNhbiAKLSAqIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBoYWxmLXBpeGVsIGludGVycG9sYXRpb24gdG8gb2J0YWluIHF1YXJ0ZXIgCi0gKiBwaXhlbCBtb3Rpb24gZXN0aW1hdGVzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTEwXSwgc3ViY2xhdXNlIDguNC4yLjIuMS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFByZWQwICAgICAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFByZWQxICAgICAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpRHN0U3RlcCAgIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAKLSAqICAgaUhlaWdodCAgICAtIEhlaWdodCBvZiB0aGUgYmxvY2tzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gOC1ieXRlIGFsaWduZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBQcmVkMCwgcFByZWQxLCBvciAKLSAqICAgICAgICAgICAgICBwRHN0UHJlZC4gCi0gKiAgICAtICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIC0gICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICBpRHN0U3RlcCAgIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgaUhlaWdodCBpcyBub3QgNCwgOCwgb3IgMTYuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9BdmVyYWdlXzh4ICgKLSAgICBjb25zdCBPTVhfVTggKnBQcmVkMCwKLSAgICBjb25zdCBPTVhfVTggKnBQcmVkMSwKLSAgICBPTVhfVTMyIGlQcmVkU3RlcDAsCi0gICAgT01YX1UzMiBpUHJlZFN0ZXAxLAotICAgIE9NWF9VOCAqcERzdFByZWQsCi0gICAgT01YX1UzMiBpRHN0U3RlcCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICAgKDYuMS4zLjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gMTZ4MTYgb3IgMTZ4OCBibG9ja3MuICBUaGUgCi0gKiByZXN1bHQgaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAgVGhlIGJsb2NrIGF2ZXJhZ2UgZnVuY3Rpb24gY2FuIAotICogYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGhhbGYtcGl4ZWwgaW50ZXJwb2xhdGlvbiB0byBvYnRhaW4gcXVhcnRlciAKLSAqIHBpeGVsIG1vdGlvbiBlc3RpbWF0ZXMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMTBdLCBzdWJjbGF1c2UgOC40LjIuMi4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwUHJlZDAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBQcmVkMSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2tzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gMTYtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwUHJlZDAsIHBQcmVkMSwgb3IgCi0gKiAgICAgICAgICAgICAgcERzdFByZWQuIAotICogICAgLSAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICAtICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgLSAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIC0gICBpRHN0U3RlcCA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIC0gICBpSGVpZ2h0IGlzIG5vdCA4IG9yIDE2LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggKAotICAgIGNvbnN0IE9NWF9VOCAqcFByZWQwLAotICAgIGNvbnN0IE9NWF9VOCAqcFByZWQxLAotICAgIE9NWF9VMzIgaVByZWRTdGVwMCwKLSAgICBPTVhfVTMyIGlQcmVkU3RlcDEsCi0gICAgT01YX1U4ICpwRHN0UHJlZCwKLSAgICBPTVhfVTMyIGlEc3RTdGVwLAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSAgICg2LjEuMy4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGV4cGFuZHMgYSByZWNvbnN0cnVjdGVkIGZyYW1lIGluLXBsYWNlLiAgVGhlIHVuZXhwYW5kZWQgCi0gKiBzb3VyY2UgZnJhbWUgc2hvdWxkIGJlIHN0b3JlZCBpbiBhIHBsYW5lIGJ1ZmZlciB3aXRoIHN1ZmZpY2llbnQgc3BhY2UgCi0gKiBwcmUtYWxsb2NhdGVkIGZvciBlZGdlIGV4cGFuc2lvbiwgYW5kIHRoZSBpbnB1dCBmcmFtZSBzaG91bGQgYmUgbG9jYXRlZCBpbiAKLSAqIHRoZSBwbGFuZSBidWZmZXIgY2VudGVyLiAgVGhpcyBmdW5jdGlvbiBleGVjdXRlcyB0aGUgcGl4ZWwgZXhwYW5zaW9uIGJ5IAotICogcmVwbGljYXRpbmcgc291cmNlIGZyYW1lIGVkZ2UgcGl4ZWwgaW50ZW5zaXRpZXMgaW4gdGhlIGVtcHR5IHBpeGVsIAotICogbG9jYXRpb25zIChleHBhbnNpb24gcmVnaW9uKSBiZXR3ZWVuIHRoZSBzb3VyY2UgZnJhbWUgZWRnZSBhbmQgdGhlIHBsYW5lIAotICogYnVmZmVyIGVkZ2UuICBUaGUgd2lkdGgvaGVpZ2h0IG9mIHRoZSBleHBhbnNpb24gcmVnaW9ucyBvbiB0aGUgCi0gKiBob3Jpem9udGFsL3ZlcnRpY2FsIGVkZ2VzIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHBhcmFtZXRlciBpRXhwYW5kUGVscy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdFBsYW5lIC0gcG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmcmFtZSB0byBiZSAKLSAqICAgICAgICAgICAgZXhwYW5kZWQ7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBpRnJhbWVXaWR0aCAtIGZyYW1lIHdpZHRoOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGlGcmFtZUhlaWdodCAtZnJhbWUgaGVpZ2h0OyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGlFeHBhbmRQZWxzIC0gbnVtYmVyIG9mIHBpeGVscyB0byBiZSBleHBhbmRlZCBpbiB0aGUgaG9yaXpvbnRhbCBhbmQgCi0gKiAgICAgICAgICAgIHZlcnRpY2FsIGRpcmVjdGlvbnM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgaVBsYW5lU3RlcCAtIGRpc3RhbmNlLCBpbiBieXRlcywgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgCi0gKiAgICAgICAgICAgIGluIHRoZSBwbGFuZSBidWZmZXI7IG11c3QgYmUgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gCi0gKiAgICAgICAgICAgIChpRnJhbWVXaWR0aCArIDIgKiBpRXhwYW5kUGVscykuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0UGxhbmUgLVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZnJhbWUgKE5PVCB0aGUgCi0gKiAgICAgICAgICAgIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgcGxhbmUpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgICBwU3JjRHN0UGxhbmUgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBTcmNEc3RQbGFuZSBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICAgLSAgICBvbmUgb2YgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGlzIGVpdGhlciBlcXVhbCB0byB6ZXJvIG9yIGlzIGEgCi0gKiAgICAgICAgICAgICAgbm9uLW11bHRpcGxlIG9mIDg6IGlGcmFtZUhlaWdodCwgaUZyYW1lV2lkdGgsIGlQbGFuZVN0ZXAsIG9yIAotICogICAgICAgICAgICAgIGlFeHBhbmRQZWxzLiAKLSAqICAgIC0gICAgaVBsYW5lU3RlcCA8IChpRnJhbWVXaWR0aCArIDIgKiBpRXhwYW5kUGVscykuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JICgKLSAgICBPTVhfVTggKnBTcmNEc3RQbGFuZSwKLSAgICBPTVhfVTMyIGlGcmFtZVdpZHRoLAotICAgIE9NWF9VMzIgaUZyYW1lSGVpZ2h0LAotICAgIE9NWF9VMzIgaUV4cGFuZFBlbHMsCi0gICAgT01YX1UzMiBpUGxhbmVTdGVwCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db3B5OHg4ICAgKDYuMS4zLjMuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDh4OCBibG9jayB0byB0aGUgY3VycmVudCBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgZnJhbWUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCBhbmQgbXVzdCBiZSBsYXJnZXIgdGhhbiAKLSAqICAgICAgICAgICAgb3IgZXF1YWwgdG8gOC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QgCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgICAgYm91bmRhcnk6IHBTcmMsIHBEc3QgCi0gKiAgICAtICAgIHN0ZXAgPDggb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fQ29weTh4OCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIHN0ZXAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvcHkxNngxNiAgICg2LjEuMy4zLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSAxNngxNiBtYWNyb2Jsb2NrIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgbWFjcm9ibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgZnJhbWUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgYW5kIG11c3QgYmUgbGFyZ2VyIAotICogICAgICAgICAgICB0aGFuIG9yIGVxdWFsIHRvIDE2LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIG1hY3JvYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIAotICogICAgICAgICAgICAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICAgIGJvdW5kYXJ5OiBwU3JjLCBwRHN0IAotICogICAgLSAgICBzdGVwIDwxNiBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fQ29weTE2eDE2ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgc3RlcAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCAgICg2LjEuNC4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyB0ZXh0dXJlIGVycm9yIG9mIHRoZSBibG9jazsgYWxzbyByZXR1cm5zIFNBRC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBzcmNTdGVwIC0gc3RlcCBvZiB0aGUgc291cmNlIHBsYW5lIAotICogICBwU3JjUmVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJ1ZmZlciwgYW4gOHg4IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIGFuIDh4OCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgU3VtIG9mIEFic29sdXRlIERpZmZlcmVuY2VzIChTQUQpIHZhbHVlIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZiwgcERzdCBhbmQgcERzdFNBRC4gCi0gKiAgICAtICAgIHBTcmMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgU3JjU3RlcCA8PSAwIG9yIHNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX0lOVCBzcmNTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9JTlQgKnBEc3RTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jayAgICg2LjEuNC4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyB0aGUgdGV4dHVyZSBlcnJvciBvZiB0aGUgYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgcGxhbmUuIFRoaXMgc2hvdWxkIGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHNyY1N0ZXAgLSBzdGVwIG9mIHRoZSBzb3VyY2UgcGxhbmUgCi0gKiAgIHBTcmNSZWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYnVmZmVyLCBhbiA4eDggYmxvY2suIFRoaXMgc2hvdWxkIGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIGFuIDh4OCBibG9jay4gVGhpcyBzaG91bGQgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmMsIHBTcmNSZWYsIHBEc3QuIAotICogICAgLSAgICBwU3JjIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIFNyY1N0ZXAgPD0gMCBvciBzcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfSU5UIHNyY1N0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAotICAgIE9NWF9TMTYgKnBEc3QKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0xpbWl0TVZUb1JlY3QgICAoNi4xLjQuMS4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogTGltaXRzIHRoZSBtb3Rpb24gdmVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBibG9jay9tYWNyb2Jsb2NrIHRvIAotICogcHJldmVudCB0aGUgbW90aW9uIGNvbXBlbnNhdGVkIGJsb2NrL21hY3JvYmxvY2sgZnJvbSBtb3Zpbmcgb3V0c2lkZSBhIAotICogYm91bmRpbmcgcmVjdGFuZ2xlIGFzIHNob3duIGluIEZpZ3VyZSA2LTEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNNViAtIHBvaW50ZXIgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGJsb2NrIAotICogICAgICAgICAgICBvciBtYWNyb2Jsb2NrIAotICogICBwUmVjdFZPUFJlZiAtIHBvaW50ZXIgdG8gdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSAKLSAqICAgWGNvb3JkLCBZY29vcmQgIC0gY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnJlbnQgYmxvY2sgb3IgbWFjcm9ibG9jayAKLSAqICAgc2l6ZSAtIHNpemUgb2YgdGhlIGN1cnJlbnQgYmxvY2sgb3IgbWFjcm9ibG9jazsgbXVzdCBiZSBlcXVhbCB0byA4IG9yIAotICogICAgICAgICAgICAxNi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGxpbWl0ZWQgbW90aW9uIHZlY3RvciAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNNViwgcERzdE1WLCBvciBwUmVjdFZPUFJlZi4gCi0gKiAgICAtICAgIHNpemUgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2LiAKLSAqICAgIC0gICAgdGhlIHdpZHRoIG9yIGhlaWdodCBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIGlzIGxlc3MgdGhhbiAKLSAqICAgICAgICAgdHdpY2UgdGhlIGJsb2NrIHNpemUuCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdCAoCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNViwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAotICAgIGNvbnN0IE9NWFJlY3QgKnBSZWN0Vk9QUmVmLAotICAgIE9NWF9JTlQgWGNvb3JkLAotICAgIE9NWF9JTlQgWWNvb3JkLAotICAgIE9NWF9JTlQgc2l6ZQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fU0FEXzE2eCAgICg2LjEuNC4xLjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgMTZ4MTYgYW5kIDE2eDggYmxvY2tzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyIAotICogICBwU3JjUmVmICAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKLSAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAotICogICBpSGVpZ2h0ICAtIEhlaWdodCBvZiB0aGUgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjT3JnLCBwRHN0U0FELCBvciBwU3JjUmVmIAotICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBpU3RlcE9yZyAgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKLSAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgOCBvciAxNiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fU0FEXzE2eCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAotICAgIE9NWF9VMzIgaVN0ZXBPcmcsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAotICAgIE9NWF9VMzIgaVN0ZXBSZWYsCi0gICAgT01YX1MzMiAqcERzdFNBRCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX1NBRF84eCAgICg2LjEuNC4xLjUpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgOHgxNiwgOHg4LCA4eDQgYmxvY2tzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnICAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgCi0gKiAgICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlciAKLSAqICAgcFNyY1JlZiAgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCi0gKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKLSAqICAgaUhlaWdodCAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjT3JnLCBwRHN0U0FELCBvciBwU3JjUmVmIAotICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIGlTdGVwT3JnICA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCi0gKiAgICAtICAgIGlTdGVwUmVmIDw9IDAgb3IgaVN0ZXBSZWYgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgNCwgOCBvciAxNiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fU0FEXzh4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCi0gICAgT01YX1UzMiBpU3RlcE9yZywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCi0gICAgT01YX1UzMiBpU3RlcFJlZiwKLSAgICBPTVhfUzMyKnBEc3RTQUQsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyogNi4yLjEuMSBEaXJlY3Rpb24gICovCi0vKiBUaGUgZGlyZWN0aW9uIGVudW1lcmF0b3IgaXMgdXNlZCB3aXRoIGZ1bmN0aW9ucyB0aGF0IHBlcmZvcm0gQUMvREMgcHJlZGljdGlvbiBhbmQgemlnLXphZyBzY2FuLiAgKi8KLQotZW51bSB7Ci0gICAgT01YX1ZDX05PTkUgICAgICAgPSAwLAotICAgIE9NWF9WQ19IT1JJWk9OVEFMID0gMSwKLSAgICBPTVhfVkNfVkVSVElDQUwgICA9IDIgCi19OwotCi0KLQotLyogNi4yLjEuMiBCaWxpbmVhciBJbnRlcnBvbGF0aW9uICAqLwotLyogVGhlIGJpbGluZWFyIGludGVycG9sYXRpb24gZW51bWVyYXRvciBpcyB1c2VkIHdpdGggbW90aW9uIGVzdGltYXRpb24sIG1vdGlvbiBjb21wZW5zYXRpb24sIGFuZCByZWNvbnN0cnVjdGlvbiBmdW5jdGlvbnMuICAqLwotCi1lbnVtIHsKLSAgICBPTVhfVkNfSU5URUdFUl9QSVhFTCA9IDAsIC8qIGNhc2UgYSAqLwotICAgIE9NWF9WQ19IQUxGX1BJWEVMX1ggID0gMSwgLyogY2FzZSBiICovCi0gICAgT01YX1ZDX0hBTEZfUElYRUxfWSAgPSAyLCAvKiBjYXNlIGMgKi8KLSAgICBPTVhfVkNfSEFMRl9QSVhFTF9YWSA9IDMgIC8qIGNhc2UgZCAqLyAKLX07Ci0KLQotCi0vKiA2LjIuMS4zIE5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5ICAqLwotLyogTmVpZ2hib3JpbmcgbWFjcm9ibG9jayBhdmFpbGFiaWxpdHkgaXMgaW5kaWNhdGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZmxhZ3M6ICAgKi8KLQotZW51bSB7Ci0gICAgT01YX1ZDX1VQUEVSID0gMSwgICAgICAgIC8qKiBhYm92ZSBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLwotICAgIE9NWF9WQ19MRUZUID0gMiwgICAgICAgICAvKiogbGVmdCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLwotICAgIE9NWF9WQ19DRU5URVIgPSA0LAotICAgIE9NWF9WQ19SSUdIVCA9IDgsCi0gICAgT01YX1ZDX0xPV0VSID0gMTYsCi0gICAgT01YX1ZDX1VQUEVSX0xFRlQgPSAzMiwgIC8qKiBhYm92ZS1sZWZ0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCi0gICAgT01YX1ZDX1VQUEVSX1JJR0hUID0gNjQsIC8qKiBhYm92ZS1yaWdodCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLwotICAgIE9NWF9WQ19MT1dFUl9MRUZUID0gMTI4LAotICAgIE9NWF9WQ19MT1dFUl9SSUdIVCA9IDI1NiAKLX07Ci0KLQotCi0vKiA2LjIuMS40IFZpZGVvIENvbXBvbmVudHMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgdmlkZW8gY29tcG9uZW50cyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ19MVU1JTkFOQ0UsICAgIC8qKiBMdW1pbmFuY2UgY29tcG9uZW50ICovCi0gICAgT01YX1ZDX0NIUk9NSU5BTkNFICAgLyoqIGNocm9taW5hbmNlIGNvbXBvbmVudCAqLyAKLX0gT01YVkNNNFAyVmlkZW9Db21wb25lbnQ7Ci0KLQotCi0vKiA2LjIuMS41IE1hY3JvYmxvY2tUeXBlcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBtYWNyb2Jsb2NrIHR5cGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgT01YX1ZDX0lOVEVSICAgICA9IDAsIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KLSAgICBPTVhfVkNfSU5URVJfUSAgID0gMSwgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLwotICAgIE9NWF9WQ19JTlRFUjRWICAgPSAyLCAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCi0gICAgT01YX1ZDX0lOVFJBICAgICA9IDMsIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLwotICAgIE9NWF9WQ19JTlRSQV9RICAgPSA0LCAvKiogSSBhbmQgUCBwaWN0dXJlLCBJLSBhbmQgUC1WT1AgKi8KLSAgICBPTVhfVkNfSU5URVI0Vl9RID0gNSAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAoSC4yNjMpKi8KLX0gT01YVkNNNFAyTWFjcm9ibG9ja1R5cGU7Ci0KLQotCi0vKiA2LjIuMS42IENvb3JkaW5hdGVzICAqLwotLyogQ29vcmRpbmF0ZXMgYXJlIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX0lOVCB4OwotICAgIE9NWF9JTlQgeTsKLX0gT01YVkNNNFAyQ29vcmRpbmF0ZTsKLQotCi0KLS8qIDYuMi4xLjcgTW90aW9uIEVzdGltYXRpb24gQWxnb3JpdGhtcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBtb3Rpb24gZXN0aW1hdGlvbiBzZWFyY2ggbWV0aG9kcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ19NNFAyX0ZBU1RfU0VBUkNIID0gMCwgIC8qKiBGYXN0IG1vdGlvbiBzZWFyY2ggKi8KLSAgICBPTVhfVkNfTTRQMl9GVUxMX1NFQVJDSCA9IDEgICAvKiogRnVsbCBtb3Rpb24gc2VhcmNoICovIAotfSBPTVhWQ000UDJNRU1vZGU7Ci0KLQotCi0vKiA2LjIuMS44IE1vdGlvbiBFc3RpbWF0aW9uIFBhcmFtZXRlcnMgICovCi0vKiBBIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgY29udHJvbCBwYXJhbWV0ZXJzIGZvciAKLSAqIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9ucyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAKLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX0lOVCBzZWFyY2hFbmFibGU4eDg7ICAgICAvKiogZW5hYmxlcyA4eDggc2VhcmNoICovCi0gICAgT01YX0lOVCBoYWxmUGVsU2VhcmNoRW5hYmxlOyAvKiogZW5hYmxlcyBoYWxmLXBlbCByZXNvbHV0aW9uICovCi0gICAgT01YX0lOVCBzZWFyY2hSYW5nZTsgICAgICAgICAvKiogc2VhcmNoIHJhbmdlICovCi0gICAgT01YX0lOVCBybmRWYWw7ICAgICAgICAgICAgICAvKiogcm91bmRpbmcgY29udHJvbDsgMC1kaXNhYmxlZCwgMS1lbmFibGVkKi8KLX0gT01YVkNNNFAyTUVQYXJhbXM7Ci0KLQotCi0vKiA2LjIuMS45IE1hY3JvYmxvY2sgSW5mb3JtYXRpb24gICAqLwotLyogQSBkYXRhIHN0cnVjdHVyZSBjb250YWluaW5nIG1hY3JvYmxvY2sgcGFyYW1ldGVycyBmb3IgCi0gKiBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9TMzIgc2xpY2VJZDsgICAgICAgICAgICAgICAgIC8qIHNsaWNlIG51bWJlciAqLwotICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIG1iVHlwZTsgIC8qIE1CIHR5cGU6IE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciBPTVhfVkNfSU5URVI0ICovCi0gICAgT01YX1MzMiBxcDsgICAgICAgICAgICAgICAgICAgICAgLyogcXVhbnRpemF0aW9uIHBhcmFtZXRlciovCi0gICAgT01YX1UzMiBjYnB5OyAgICAgICAgICAgICAgICAgICAgLyogQ0JQIEx1bWEgKi8KLSAgICBPTVhfVTMyIGNicGM7ICAgICAgICAgICAgICAgICAgICAvKiBDQlAgQ2hyb21hICovCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WMFsyXVsyXTsgICAgLyogbW90aW9uIHZlY3RvciwgcmVwcmVzZW50ZWQgdXNpbmcgMS8yLXBlbCB1bml0cywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcE1WMFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MSwgYmxvY2t4ID0wfjEpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVlByZWRbMl1bMl07IC8qIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiwgcmVwcmVzZW50ZWQgdXNpbmcgMS8yLXBlbCB1bml0cywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcE1WUHJlZFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MSwgYmxvY2t4ID0gMH4xKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBPTVhfVTggcFByZWREaXJbMl1bMl07ICAgICAgICAgICAvKiBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBPTVhfVkNfTk9ORSwgT01YX1ZDX1ZFUlRJQ0FMLCBPTVhfVkNfSE9SSVpPTlRBTCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLX0gT01YVkNNNFAyTUJJbmZvLCAqT01YVkNNNFAyTUJJbmZvUHRyOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9GaW5kTVZwcmVkICAgKDYuMi4zLjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFByZWRpY3RzIGEgbW90aW9uIHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgdXNpbmcgdGhlIHByb2NlZHVyZSAKLSAqIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuNS4gIFRoZSByZXN1bHRpbmcgcHJlZGljdGVkIE1WIGlzIAotICogcmV0dXJuZWQgaW4gcERzdE1WUHJlZC4gSWYgdGhlIHBhcmFtZXRlciBwRHN0TVZQcmVkTUUgaWYgaXMgbm90IE5VTEwgdGhlbiAKLSAqIHRoZSBzZXQgb2YgdGhyZWUgTVYgY2FuZGlkYXRlcyB1c2VkIGZvciBwcmVkaWN0aW9uIGlzIGFsc28gcmV0dXJuZWQsIAotICogb3RoZXJ3aXNlIHBEc3RNVlByZWRNRWlzIE5VTEwgdXBvbiByZXR1cm4uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBZIAotICogICAgICAgICAgICBtYWNyb2Jsb2NrOyBhIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKLSAqICAgcFNyY0NhbmRNVjEgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKLSAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCB0byB0aGUgbGVmdCBvZiB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgCi0gKiAgICAgICAgICAgIGlmIHRoZXJlIGlzIG5vIE1CIHRvIHRoZSBsZWZ0LiAKLSAqICAgcFNyY0NhbmRNVjIgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKLSAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCBhYm92ZSB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgaWYgdGhlcmUgCi0gKiAgICAgICAgICAgIGlzIG5vIE1CIGxvY2F0ZWQgYWJvdmUgdGhlIGN1cnJlbnQgTUIuIAotICogICBwU3JjQ2FuZE1WMyAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAotICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIHRvIHRoZSByaWdodCBhbmQgYWJvdmUgdGhlIGN1cnJlbnQgTUI7IHNldCAKLSAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGVyZSBpcyBubyBNQiBsb2NhdGVkIHRvIHRoZSBhYm92ZS1yaWdodC4gCi0gKiAgIGlCbGsgLSB0aGUgaW5kZXggb2YgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKLSAqICAgcERzdE1WUHJlZE1FIC0gTVYgY2FuZGlkYXRlIHJldHVybiBidWZmZXI7ICBpZiBzZXQgdG8gTlVMTCB0aGVuIAotICogICAgICAgICAgICBwcmVkaWN0aW9uIGNhbmRpZGF0ZSBNVnMgYXJlIG5vdCByZXR1cm5lZCBhbmQgcERzdE1WUHJlZE1FIHdpbGwgCi0gKiAgICAgICAgICAgIGJlIE5VTEwgdXBvbiBmdW5jdGlvbiByZXR1cm47IGlmIHBEc3RNVlByZWRNRSBpcyBub24tTlVMTCB0aGVuIGl0IAotICogICAgICAgICAgICBtdXN0IHBvaW50IHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgc3VmZmljaWVudCBzcGFjZSBmb3IgdGhyZWUgCi0gKiAgICAgICAgICAgIHJldHVybiBNVnMuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0TVZQcmVkIC0gcG9pbnRlciB0byB0aGUgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IgCi0gKiAgIHBEc3RNVlByZWRNRSAtIGlmIG5vbi1OVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgIHBvaW50cyB1cG9uIAotICogICAgICAgICAgICByZXR1cm4gdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgdGhyZWUgbW90aW9uIHZlY3RvciBjYW5kaWRhdGVzIAotICogICAgICAgICAgICB1c2VkIGZvciBwcmVkaWN0aW9uIGFzIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSAKLSAqICAgICAgICAgICAgNy42LjUsIG90aGVyd2lzZSBpZiBOVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgaXMgTlVMTCAKLSAqICAgICAgICAgICAgdXBvbiBvdXRwdXQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICAgdGhlIHBvaW50ZXIgcERzdE1WUHJlZCBpcyBOVUxMIAotICogICAgLSAgICB0aGUgcGFyYW1ldGVyIGlCbGsgZG9lcyBub3QgZmFsbCBpbnRvIHRoZSByYW5nZSAwIDw9IGlCbGs8PTMgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0ZpbmRNVnByZWQgKAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZDdXJNQiwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0NhbmRNVjEsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNDYW5kTVYyLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjQ2FuZE1WMywKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WUHJlZCwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WUHJlZE1FLAotICAgIE9NWF9JTlQgaUJsawotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfSURDVDh4OGJsayAgICg2LjIuMy4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyBhIDJEIGludmVyc2UgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCi0gKiBbSVNPMTQ0OTYtMl0uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgSURDVCBpbnB1dCBidWZmZXI7IAotICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgQWNjb3JkaW5nIHRvIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMl0sIHRoZSBpbnB1dCBjb2VmZmljaWVudCB2YWx1ZXMgc2hvdWxkIGxpZSB3aXRoaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbLTIwNDgsIDIwNDddLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBJRENUIG91dHB1dCBidWZmZXI7IAotICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0lEQ1Q4eDhibGsgKAotICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCi0gICAgT01YX1MxNiAqcERzdAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUVHZXRCdWZTaXplICAgKDYuMi40LjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIAotICogc3RydWN0dXJlIGZvciB0aGUgZm9sbG93aW5nIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogCi0gKiBCbG9ja01hdGNoX0ludGVnZXJfOHg4LCBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCi0gKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDJNRU1vZGUgCi0gKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTaXplIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgc3BlY2lmaWNhdGlvbiAKLSAqICAgICAgICAgICAgc3RydWN0dXJlIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAotICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAotICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIAotICogICAgICAgICBwYXJhbWV0ZXIgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfTUVHZXRCdWZTaXplICgKLSAgICBPTVhWQ000UDJNRU1vZGUgTUVtb2RlLAotICAgIGNvbnN0IE9NWFZDTTRQMk1FUGFyYW1zICpwTUVQYXJhbXMsCi0gICAgT01YX1UzMiAqcFNpemUKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01FSW5pdCAgICg2LjIuNC4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBJbml0aWFsaXplcyB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIHJlcXVpcmVkIGZvciB0aGUgCi0gKiBmb2xsb3dpbmcgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAgQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCwgCi0gKiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIE1lbW9yeSBmb3IgdGhlIAotICogc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgKnBNRVNwZWMgbXVzdCBiZSBhbGxvY2F0ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCi0gKiBmdW5jdGlvbiwgYW5kIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgRm9sbG93aW5nIAotICogaW5pdGlhbGl6YXRpb24gYnkgdGhpcyBmdW5jdGlvbiwgdGhlIHZlbmRvci1zcGVjaWZpYyBzdHJ1Y3R1cmUgKnBNRVNwZWMgCi0gKiBzaG91bGQgY29udGFpbiBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiBhbGwgbW90aW9uIAotICogZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIHJlY2VpdmVkIHZpYSB0aGUgc3RydWN0dXJlIHBNRVBhcmFtcywgZm9yIGV4YW1wbGUgIAotICogcm5kVmFsLCBzZWFyY2hSYW5nZSwgZXRjLiAgVGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIAotICogc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgY2FuIGJlIGRldGVybWluZWQgdXNpbmcgdGhlIGZ1bmN0aW9uIAotICogb214VkNNNFAyX01FR2V0QnVmU2l6ZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKLSAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMk1FTW9kZSAKLSAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHVuaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKLSAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSAKLSAqICAgICAgICAgcGFyYW1ldGVyIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX01FSW5pdCAoCi0gICAgT01YVkNNNFAyTUVNb2RlIE1FbW9kZSwKLSAgICBjb25zdCBPTVhWQ000UDJNRVBhcmFtcypwTUVQYXJhbXMsCi0gICAgdm9pZCAqcE1FU3BlYwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICAgKDYuMi40LjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCAKLSAqIG1pbmltdW0gU0FELiBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCB1c2luZyAKLSAqIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSAKLSAqIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgCi0gKiBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgaW5wdXQgTVZzIHJlcHJlc2VudGVkIAotICogdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgTUIgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiAKLSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgcGxhbmUuIAotICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCi0gKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHBsYW5lIHJlY3RhbmdsZTsgY29vcmRpbmF0ZXMgCi0gKiAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4gIFJlY3RhbmdsZSAKLSAqICAgICAgICAgICAgYm91bmRhcmllcyBtYXkgZXh0ZW5kIGJleW9uZCBpbWFnZSBib3VuZGFyaWVzIGlmIHRoZSBpbWFnZSBoYXMgCi0gKiAgICAgICAgICAgIGJlZW4gcGFkZGVkLiAgRm9yIGV4YW1wbGUsIGlmIHBhZGRpbmcgZXh0ZW5kcyA0IHBpeGVscyBiZXlvbmQgCi0gKiAgICAgICAgICAgIGZyYW1lIGJvcmRlciwgdGhlbiB0aGUgdmFsdWUgZm9yIHRoZSBsZWZ0IGJvcmRlciBjb3VsZCBiZSBzZXQgdG8gCi0gKiAgICAgICAgICAgIC00LiAKLSAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCi0gKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMjU2IAotICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCi0gKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKLSAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCi0gKiAgIHBTcmNQcmVNViAtIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIAotICogICAgICAgICAgICBwcmVkaWN0ZWQgTVYgCi0gKiAgIHBTcmNQcmVTQUQgLSBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCAKLSAqICAgICAgICAgICAgYnkgcFNyY1ByZU1WKTsgbWF5IGJlIHNldCB0byBOVUxMIGlmIHVuYXZhaWxhYmxlLiAKLSAqICAgcE1FU3BlYyAtIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgCi0gKiAgICAgICAgICAgIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKLSAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyBmdW5jdGlvbi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAotICogICAgICAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBDdXJyUG9pbnRQb3MsIHBEc3RNViwgcERzdFNBRCBvciAKLSAqICAgICAgICAgICAgICBwTUVTcGVjLCBvciAKLSAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqcFNyY1ByZU1WLAotICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCi0gICAgdm9pZCAqcE1FU3BlYywKLSAgICBPTVhWQ01vdGlvblZlY3RvcipwRHN0TVYsCi0gICAgT01YX0lOVCAqcERzdFNBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAgICg2LjIuNC4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhbiA4eDggYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCAKLSAqIG1pbmltdW0gU0FELiAgQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgCi0gKiB1c2luZyBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgCi0gKiByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIAotICogZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IGlucHV0IE1WcyByZXByZXNlbnRlZCAKLSAqIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIGJsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IDh4OCBibG9jayAKLSAqICAgICAgICAgICAgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAotICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCi0gKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHBsYW5lIHJlY3RhbmdsZTsgY29vcmRpbmF0ZXMgCi0gKiAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4gIFJlY3RhbmdsZSAKLSAqICAgICAgICAgICAgYm91bmRhcmllcyBtYXkgZXh0ZW5kIGJleW9uZCBpbWFnZSBib3VuZGFyaWVzIGlmIHRoZSBpbWFnZSBoYXMgCi0gKiAgICAgICAgICAgIGJlZW4gcGFkZGVkLiAKLSAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCi0gKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMTI4IAotICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCi0gKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2IGJ5dGVzLiAKLSAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAotICogICBwU3JjUHJlTVYgLSBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyAKLSAqICAgICAgICAgICAgcHJlZGljdGVkIE1WIAotICogICBwU3JjUHJlU0FEIC0gcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgCi0gKiAgICAgICAgICAgIGJ5IHBTcmNQcmVNVik7IG1heSBiZSBzZXQgdG8gTlVMTCBpZiB1bmF2YWlsYWJsZS4gCi0gKiAgIHBNRVNwZWMgLSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IAotICogICAgICAgICAgICBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCi0gKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgZnVuY3Rpb24uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKLSAqICAgICAgICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwQ3VyclBvaW50UG9zLCBwRHN0TVYsIHBEc3RTQUQgb3IgCi0gKiAgICAgICAgICAgICAgcE1FU3BlYywgb3IgCi0gKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCi0gICAgY29uc3QgT01YX0lOVCAqcFNyY1ByZVNBRCwKLSAgICB2b2lkICpwTUVTcGVjLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCi0gICAgT01YX0lOVCAqcERzdFNBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2ICAgKDYuMi40LjIuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uICBSZXR1cm5zIHRoZSAKLSAqIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiAKLSAqIGVzdGltYXRlcyB0aGUgaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgCi0gKiByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgCi0gKiB0aGUgaW5pdGlhbCBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgCi0gKiBwU3JjUmVmQnVmIGFuZCBwU2VhcmNoUG9pbnRSZWZQb3Mgc2hvdWxkIGJlIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgCi0gKiAxNngxNiBpbnRlZ2VyIHNlYXJjaCBwcmlvciB0byBjYWxsaW5nIEJsb2NrTWF0Y2hfSGFsZl8xNngxNi4gVGhlIGZ1bmN0aW9uIAotICogQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBtYWNyb2Jsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKLSAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAotICogICBwUmVmUmVjdCAtIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlIAotICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKLSAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAyNTYgCi0gKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKLSAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAotICogICBwU2VhcmNoUG9pbnRSZWZQb3MgLSBwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgCi0gKiAgICAgICAgICAgIHNlYXJjaCAoc3BlY2lmaWVkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLCBpLmUuLCB0aGUgcmVmZXJlbmNlIHBvc2l0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIAotICogICAgICAgICAgICBwcmVkaWN0ZWQgbW90aW9uIHZlY3Rvci4gCi0gKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKLSAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbCBNViBlc3RpbWF0ZTsgdHlwaWNhbGx5IGdlbmVyYXRlZCAKLSAqICAgICAgICAgICAgZHVyaW5nIGEgcHJpb3IgMTZYMTYgaW50ZWdlciBzZWFyY2g7IHNwZWNpZmllZCBpbiB0ZXJtcyBvZiAKLSAqICAgICAgICAgICAgaGFsZi1waXhlbCB1bml0cy4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAotICogICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwU2VhcmNoUG9pbnRSZWZQb3MsIHBTcmNEc3RNVi4KLSAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCi0gICAgT01YX0lOVCBybmRWYWwsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKLSAgICBPTVhfSU5UICpwRHN0U0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICAgKDYuMi40LjIuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGFuIDh4OCBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gUmV0dXJucyB0aGUgCi0gKiBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gCi0gKiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIAotICogcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIAotICogdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIAotICogcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIAotICogOHg4IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzh4OC4gVGhlIGZ1bmN0aW9uIAotICogQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgOHg4IGJsb2NrIAotICogICAgICAgICAgICBpbiB0aGUgY3VycmVudCBwbGFuZS4gCi0gKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKLSAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSAKLSAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCi0gKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMTI4IAotICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKLSAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAotICogICBwU2VhcmNoUG9pbnRSZWZQb3MgLSBwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgCi0gKiAgICAgICAgICAgIHNlYXJjaCAoc3BlY2lmaWVkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLiAKLSAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAotICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIAotICogICAgICAgICAgICBkdXJpbmcgYSBwcmlvciA4eDggaW50ZWdlciBzZWFyY2gsIHNwZWNpZmllZCBpbiB0ZXJtcyBvZiAKLSAqICAgICAgICAgICAgaGFsZi1waXhlbCB1bml0cy4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjUmVmQnVmLCBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwU2VhcmNoUG9pbnRSZWZQb3MsIHBTcmNEc3RNVgotICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgOC1ieXRlIGFsaWduZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICBPTVhfSU5UIHJlZldpZHRoLAotICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAotICAgIE9NWF9JTlQgcm5kVmFsLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCi0gICAgT01YX0lOVCAqcERzdFNBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICAgKDYuMi40LjMuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIG1vdGlvbiBzZWFyY2ggZm9yIGEgMTZ4MTYgbWFjcm9ibG9jay4gIFNlbGVjdHMgYmVzdCBtb3Rpb24gc2VhcmNoIAotICogc3RyYXRlZ3kgZnJvbSBhbW9uZyBpbnRlci0xTVYsIGludGVyLTRNViwgYW5kIGludHJhIG1vZGVzLiAgU3VwcG9ydHMgCi0gKiBpbnRlZ2VyIGFuZCBoYWxmIHBpeGVsIHJlc29sdXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjdXJyZW50IE1CIGluIHRoZSAKLSAqICAgICAgICAgICAgb3JpZ2luYWwgcGljdHVyZSBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIAotICogICAgICAgICAgICBUaGUgZnVuY3Rpb24gZG9lcyBub3QgZXhwZWN0IHNvdXJjZSBkYXRhIG91dHNpZGUgdGhlIHJlZ2lvbiAKLSAqICAgICAgICAgICAgYm91bmRlZCBieSB0aGUgTUIgdG8gYmUgYXZhaWxhYmxlOyBmb3IgZXhhbXBsZSBpdCBpcyBub3QgCi0gKiAgICAgICAgICAgIG5lY2Vzc2FyeSBmb3IgdGhlIGNhbGxlciB0byBndWFyYW50ZWUgdGhlIGF2YWlsYWJpbGl0eSBvZiAKLSAqICAgICAgICAgICAgcFNyY0N1cnJCdWZbLVNyY0N1cnJTdGVwXSwgaS5lLiwgdGhlIHJvdyBvZiBwaXhlbHMgYWJvdmUgdGhlIE1CIAotICogICAgICAgICAgICB0byBiZSBwcm9jZXNzZWQuIAotICogICBzcmNDdXJyU3RlcCAtIHdpZHRoIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLCBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIHBsYW5lIGxvY2F0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHNyY1JlZlN0ZXAgLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUsIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSwgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIAotICogICAgICAgICAgICB0aGUgaW1hZ2Ugb3JpZ2luIAotICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIAotICogICAgICAgICAgICBzdHJ1Y3R1cmU7IG11c3QgYmUgYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAotICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gCi0gKiAgIHBNQkluZm8gLSBhcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIG5lYXJieSBNQnM6IAotICogICAgICAgICAgICAtICAgcE1CSW5mb1swXSAtIHBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMV0gLSBwb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMl0gLSBwb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICAgcE1CSW5mb1szXSAtIHBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCB0byBOVUxMIGlmIHRoZSAKLSAqICAgICAgICAgICAgY29ycmVzcG9uZGluZyBNQiBkb2Vzbid0IGV4aXN0LiAgRm9yIGVhY2ggTUIsIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIAotICogICAgICAgICAgICBtZW1iZXJzIGFyZSB1c2VkOiAgICAKLSAqICAgICAgICAgICAgLSAgIG1iVHlwZSAtIG1hY3JvYmxvY2sgdHlwZSwgZWl0aGVyIE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciAKLSAqICAgICAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWIAotICogICAgICAgICAgICAtICAgcE1WMFsyXVsyXSAtIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yczsgcmVwcmVzZW50ZWQgCi0gKiAgICAgICAgICAgICAgICBpbiAxLzIgcGl4ZWwgdW5pdHMgCi0gKiAgICAgICAgICAgIC0gICBzbGljZUlEIC0gbnVtYmVyIG9mIHRoZSBzbGljZSB0byB3aGljaCB0aGUgTUIgYmVsb25ncyAKLSAqICAgcFNyY0RzdE1CQ3VyciAtIHBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIAotICogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIHNldCBwcmlvciB0byBjYWxsaW5nIHRoZSAKLSAqICAgICAgICAgICAgZnVuY3Rpb246IHNsaWNlSUQgLSB0aGUgbnVtYmVyIG9mIHRoZSBzbGljZSB0aGUgdG8gd2hpY2ggdGhlIAotICogICAgICAgICAgICBjdXJyZW50IE1CIGJlbG9uZ3MuICBUaGUgc3RydWN0dXJlIGVsZW1lbnRzIGNicHkgYW5kIGNicGMgYXJlIAotICogICAgICAgICAgICBpZ25vcmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdE1CQ3VyciAtIHBvaW50ZXIgdG8gdXBkYXRlZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBNQiBhZnRlciBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuICBUaGUgCi0gKiAgICAgICAgICAgIGZvbGxvd2luZyBzdHJ1Y3R1cmUgbWVtYmVycyBhcmUgdXBkYXRlZCBieSB0aGUgTUUgZnVuY3Rpb246ICAgCi0gKiAgICAgICAgICAgICAgLSAgbWJUeXBlIC0gbWFjcm9ibG9jayB0eXBlOiBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgCi0gKiAgICAgICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYuIAotICogICAgICAgICAgICAgIC0gIHBNVjBbMl1bMl0gLSBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIGluIAotICogICAgICAgICAgICAgICAgIHRlcm1zIG9mIDEvMiBwZWwgdW5pdHMuIAotICogICAgICAgICAgICAgIC0gIHBNVlByZWRbMl1bMl0gLSBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIAotICogICAgICAgICAgICAgICAgIGluIHRlcm1zIG9mIDEvMiBwZWwgdW5pdHMuIAotICogICAgICAgICAgICBUaGUgc3RydWN0dXJlIG1lbWJlcnMgY2JweSBhbmQgY2JwYyBhcmUgbm90IHVwZGF0ZWQgYnkgdGhlIGZ1bmN0aW9uLiAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIG1pbmltdW0gU0FEIGZvciBJTlRFUjFWLCBvciBzdW0gb2YgbWluaW11bSBTQURzIAotICogICAgICAgICAgICBmb3IgSU5URVI0ViAKLSAqICAgcERzdEJsb2NrU0FEIC0gcG9pbnRlciB0byBhbiBhcnJheSBvZiBTQUQgdmFsdWVzIGZvciBlYWNoIG9mIHRoZSBmb3VyIAotICogICAgICAgICAgICA4eDggbHVtYSBibG9ja3MgaW4gdGhlIE1CLiAgVGhlIGJsb2NrIFNBRHMgYXJlIGluIHNjYW4gb3JkZXIgZm9yIAotICogICAgICAgICAgICBlYWNoIE1CLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKLSAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0N1cnJCdWYsIAotICogICAgICAgICAgICAgIHBTcmNSZWZCdWYsIHBSZWZSZWN0LCBwQ3VyclBvaW50UG9zLCBwTUJJbnRlciwgcE1CSW50cmEsIAotICogICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnIsIG9yIHBEc3RTQUQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgT01YX1MzMiBzcmNDdXJyU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgT01YX1MzMiBzcmNSZWZTdGVwLAotICAgIGNvbnN0IE9NWFJlY3QqcFJlZlJlY3QsCi0gICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICB2b2lkICpwTUVTcGVjLAotICAgIGNvbnN0IE9NWFZDTTRQMk1CSW5mb1B0ciAqcE1CSW5mbywKLSAgICBPTVhWQ000UDJNQkluZm8gKnBTcmNEc3RNQkN1cnIsCi0gICAgT01YX1UxNiAqcERzdFNBRCwKLSAgICBPTVhfVTE2ICpwRHN0QmxvY2tTQUQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RDVDh4OGJsayAgICg2LjIuNC40LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyBhIDJEIGZvcndhcmQgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCi0gKiBbSVNPMTQ0OTYtMl0uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgaW5wdXQgYnVmZmVyOyBtdXN0IAotICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIElucHV0IHZhbHVlcyAocGl4ZWwgCi0gKiAgICAgICAgICAgIGludGVuc2l0aWVzKSBhcmUgdmFsaWQgaW4gdGhlIHJhbmdlIFstMjU1LDI1NV0uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIG91dHB1dCBidWZmZXI7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgcmV0dXJuZWQgaWY6Ci0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EQ1Q4eDhibGsgKAotICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCi0gICAgT01YX1MxNiAqcERzdAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnRyYV9JICAgKDYuMi40LjQuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHF1YW50aXphdGlvbiBvbiBpbnRyYSBibG9jayBjb2VmZmljaWVudHMuIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgCi0gKiBiaXRzX3Blcl9waXhlbCA9PSA4LiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgaW50cmEgYmxvY2sgY29lZmZpY2llbnRzOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKS4gCi0gKiAgIGJsb2NrSW5kZXggLSBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQgcG9zaXRpb24sIAotICogICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA1LCBhcyBkZWZpbmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIAotICogICAgICAgICAgICA2LjEuMy44LiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKLSAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChxdWFudGl6ZWQpIGludGVyYmxvY2sgY29lZmZpY2llbnRzLiAgCi0gKiAgICAgICAgICAgIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MSwgQUMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAotICogICAgICAgICAgICBpbnRlcnZhbCBbLTEyNywgMTI3XSwgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKLSAqICAgICAgICAgICAgaW50ZXJ2YWwgWzEsIDI1NF0uICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTAsIEFDIGNvZWZmaWNpZW50cyAKLSAqICAgICAgICAgICAgYXJlIHNhdHVyYXRlZCBvbiB0aGUgaW50ZXJ2YWwgWy0yMDQ3LCAyMDQ3XS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIGJsb2NrSW5kZXggPCAwIG9yIGJsb2NrSW5kZXggPj0gMTAgCi0gKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludHJhX0kgKAotICAgIE9NWF9TMTYgKnBTcmNEc3QsCi0gICAgT01YX1U4IFFQLAotICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW50ZXJfSSAgICg2LjIuNC40LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBxdWFudGl6YXRpb24gb24gYW4gaW50ZXIgY29lZmZpY2llbnQgYmxvY2s7IHN1cHBvcnRzIAotICogYml0c19wZXJfcGl4ZWwgPT0gOC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IGludGVyIGJsb2NrIGNvZWZmaWNpZW50czsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkgCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwgYW5kIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAocXVhbnRpemVkKSBpbnRlcmJsb2NrIGNvZWZmaWNpZW50cy4gIAotICogICAgICAgICAgICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTEsIEFDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKLSAqICAgICAgICAgICAgaW50ZXJ2YWwgWy0xMjcsIDEyN10sIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCi0gKiAgICAgICAgICAgIGludGVydmFsIFsxLCAyNTRdLiAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0wLCBBQyBjb2VmZmljaWVudHMgCi0gKiAgICAgICAgICAgIGFyZSBzYXR1cmF0ZWQgb24gdGhlIGludGVydmFsIFstMjA0NywgMjA0N10uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICgKLSAgICBPTVhfUzE2ICpwU3JjRHN0LAotICAgIE9NWF9VOCBRUCwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhICAgKDYuMi40LjQuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFF1YW50aXplcyB0aGUgRENUIGNvZWZmaWNpZW50cywgaW1wbGVtZW50cyBpbnRyYSBibG9jayBBQy9EQyBjb2VmZmljaWVudCAKLSAqIHByZWRpY3Rpb24sIGFuZCByZWNvbnN0cnVjdHMgdGhlIGN1cnJlbnQgaW50cmEgYmxvY2sgdGV4dHVyZSBmb3IgcHJlZGljdGlvbiAKLSAqIG9uIHRoZSBuZXh0IGZyYW1lLiAgUXVhbnRpemVkIHJvdyBhbmQgY29sdW1uIGNvZWZmaWNpZW50cyBhcmUgcmV0dXJuZWQgaW4gCi0gKiB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBidWZmZXJzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcGl4ZWxzIG9mIGN1cnJlbnQgaW50cmEgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiAKLSAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyIGNvbnRhaW5pbmcgCi0gKiAgICAgICAgICAgICgobnVtX21iX3Blcl9yb3cgKiAyICsgMSkgKiA4KSBlbGVtZW50cyBvZiB0eXBlIE9NWF9TMTYuIAotICogICAgICAgICAgICBDb2VmZmljaWVudHMgYXJlIG9yZ2FuaXplZCBpbnRvIGJsb2NrcyBvZiBlaWdodCBhcyBkZXNjcmliZWQgCi0gKiAgICAgICAgICAgIGJlbG93IChJbnRlcm5hbCBQcmVkaWN0aW9uIENvZWZmaWNpZW50IFVwZGF0ZSBQcm9jZWR1cmVzKS4gIFRoZSAKLSAqICAgICAgICAgICAgREMgY29lZmZpY2llbnQgaXMgZmlyc3QsIGFuZCB0aGUgcmVtYWluaW5nIGJ1ZmZlciBsb2NhdGlvbnMgCi0gKiAgICAgICAgICAgIGNvbnRhaW4gdGhlIHF1YW50aXplZCBBQyBjb2VmZmljaWVudHMuIEVhY2ggZ3JvdXAgb2YgZWlnaHQgcm93IAotICogICAgICAgICAgICBidWZmZXIgZWxlbWVudHMgY29tYmluZWQgd2l0aCBvbmUgZWxlbWVudCBlaWdodCBlbGVtZW50cyBhaGVhZCAKLSAqICAgICAgICAgICAgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHByZWRpY3RvcnMgb2YgdGhlIG5laWdoYm9yaW5nIGJsb2NrIAotICogICAgICAgICAgICB0aGF0IGlzIHNwYXRpYWxseSBhYm92ZSBvciB0byB0aGUgbGVmdCBvZiB0aGUgYmxvY2sgY3VycmVudGx5IHRvIAotICogICAgICAgICAgICBiZSBkZWNvZGVkLiBBIG5lZ2F0aXZlLXZhbHVlZCBEQyBjb2VmZmljaWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzIAotICogICAgICAgICAgICBuZWlnaGJvcmluZyBibG9jayBpcyBub3QgSU5UUkEtY29kZWQgb3Igb3V0IG9mIGJvdW5kcywgYW5kIAotICogICAgICAgICAgICB0aGVyZWZvcmUgdGhlIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIGludmFsaWQuICBQb2ludGVyIG11c3QgCi0gKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgCi0gKiAgICAgICAgICAgIGNvbnRhaW5pbmcgMTYgZWxlbWVudHMgb2YgdHlwZSBPTVhfUzE2LiBDb2VmZmljaWVudHMgYXJlIAotICogICAgICAgICAgICBvcmdhbml6ZWQgYXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gNi4yLjIuNS4gIFBvaW50ZXIgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwU3VtRXJyIC0gcG9pbnRlciB0byBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBBQyBwcmVkaWN0aW9uIGlzIAotICogICAgICAgICAgICByZXF1aXJlZDsgQUMgcHJlZGljdGlvbiBpcyBlbmFibGVkIGlmICpwU3VtRXJyID49MCwgYnV0IHRoZSAKLSAqICAgICAgICAgICAgdmFsdWUgaXMgbm90IHVzZWQgZm9yIGNvZWZmaWNpZW50IHByZWRpY3Rpb24sIGkuZS4sIHRoZSBzdW0gb2YgCi0gKiAgICAgICAgICAgIGFic29sdXRlIGRpZmZlcmVuY2VzIHN0YXJ0cyBmcm9tIDAgZm9yIGVhY2ggY2FsbCB0byB0aGlzIAotICogICAgICAgICAgICBmdW5jdGlvbi4gIE90aGVyd2lzZSBBQyBwcmVkaWN0aW9uIGlzIGRpc2FibGVkIGlmICpwU3VtRXJyIDwgMCAuIAotICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uLCBhcyAKLSAqICAgICAgICAgICAgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA2LjEuMy44LiAKLSAqICAgY3VyUXAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHRvIHdoaWNoIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBibG9jayBiZWxvbmdzIAotICogICBwUXBCdWYgLSBwb2ludGVyIHRvIGEgMi1lbGVtZW50IHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyOyBwUXBCdWZbMF0gCi0gKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgOHg4IAotICogICAgICAgICAgICBibG9jayBsZWZ0IG9mIHRoZSBjdXJyZW50IGJsb2NrIChRUGEpLCBhbmQgcFFwQnVmWzFdIGNvbnRhaW5zIAotICogICAgICAgICAgICB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBhc3NvY2lhdGVkIHdpdGggdGhlIDh4OCBibG9jayBhYm92ZSAKLSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgYmxvY2sgKFFQYykuICBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgY29ycmVzcG9uZGluZyAKLSAqICAgICAgICAgICAgYmxvY2sgaXMgb3V0c2lkZSBvZiB0aGUgVk9QIGJvdW5kLCB0aGUgUXAgdmFsdWUgd2lsbCBub3QgYWZmZWN0IAotICogICAgICAgICAgICB0aGUgaW50cmEgcHJlZGljdGlvbiBwcm9jZXNzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCAKLSAqICAgICAgICAgICAgc3ViLWNsYXVzZSA3LjQuMy4zLCAgQWRhcHRpdmUgQUMgQ29lZmZpY2llbnQgUHJlZGljdGlvbi4gIAotICogICBzcmNTdGVwIC0gd2lkdGggb2YgdGhlIHNvdXJjZSBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgZHN0U3RlcCAtIHdpZHRoIG9mIHRoZSByZWNvbnN0cnVjdGVkIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIAotICogICAgICAgICAgICBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCi0gKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgYnVmZmVyOyBwRHN0WzBdIGNvbnRhaW5zIAotICogICAgICAgICAgICB0aGUgcHJlZGljdGVkIERDIGNvZWZmaWNpZW50OyB0aGUgcmVtYWluaW5nIGVudHJpZXMgY29udGFpbiB0aGUgCi0gKiAgICAgICAgICAgIHF1YW50aXplZCBBQyBjb2VmZmljaWVudHMgKHdpdGhvdXQgcHJlZGljdGlvbikuICBUaGUgcG9pbnRlciAKLSAqICAgICAgICAgICAgcERzdG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBwUmVjIC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCB0ZXh0dXJlOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gCi0gKiAgICAgICAgICAgIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyIAotICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAKLSAqICAgcFByZUFDUHJlZGljdCAtIGlmIHByZWRpY3Rpb24gaXMgZW5hYmxlZCwgdGhlIHBhcmFtZXRlciBwb2ludHMgdG8gdGhlIAotICogICAgICAgICAgICBzdGFydCBvZiB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGNvZWZmaWNpZW50IGRpZmZlcmVuY2VzIGZvciAKLSAqICAgICAgICAgICAgVkxDIGVuY29kaW5nLiBUaGUgZW50cnkgcFByZUFDUHJlZGljdFswXWluZGljYXRlcyBwcmVkaWN0aW9uIAotICogICAgICAgICAgICBkaXJlY3Rpb24gZm9yIHRoZSBjdXJyZW50IGJsb2NrIGFuZCB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgdmFsdWVzOiBPTVhfVkNfTk9ORSAocHJlZGljdGlvbiBkaXNhYmxlZCksIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKLSAqICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAgVGhlIGVudHJpZXMgCi0gKiAgICAgICAgICAgIHBQcmVBQ1ByZWRpY3RbMV0tcFByZUFDUHJlZGljdFs3XWNvbnRhaW4gcHJlZGljdGVkIEFDIAotICogICAgICAgICAgICBjb2VmZmljaWVudHMuICBJZiBwcmVkaWN0aW9uIGlzIGRpc2FibGVkICgqcFN1bUVycjwwKSB0aGVuIHRoZSAKLSAqICAgICAgICAgICAgY29udGVudHMgb2YgdGhpcyBidWZmZXIgYXJlIHVuZGVmaW5lZCB1cG9uIHJldHVybiBmcm9tIHRoZSAKLSAqICAgICAgICAgICAgZnVuY3Rpb24gCi0gKiAgIHBTdW1FcnIgLSBwb2ludGVyIHRvIHRoZSB2YWx1ZSBvZiB0aGUgYWNjdW11bGF0ZWQgQUMgY29lZmZpY2llbnQgZXJyb3JzLCAKLSAqICAgICAgICAgICAgaS5lLiwgc3VtIG9mIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHByZWRpY3RlZCBhbmQgCi0gKiAgICAgICAgICAgIHVucHJlZGljdGVkIEFDIGNvZWZmaWNpZW50cyAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCwgcFJlYywgCi0gKiAgICAgICAgIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgcFFwQnVmLCBwUHJlQUNQcmVkaWN0LCBwU3VtRXJyLiAKLSAqICAgIC0gICAgYmxvY2tJbmRleCA8IDAgb3IgYmxvY2tJbmRleCA+PSAxMDsgCi0gKiAgICAtICAgIGN1clFQIDw9IDAgb3IgY3VyUVAgPj0gMzIuIAotICogICAgLSAgICBzcmNTdGVwLCBvciBkc3RTdGVwIDw9IDAgb3Igbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZDogLiAKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkOiAKLSAqICAgICAgICAgcFNyYywgcFJlYy4gIAotICoKLSAqICBOb3RlOiBUaGUgY29lZmZpY2llbnQgYnVmZmVycyBtdXN0IGJlIHVwZGF0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSAKLSAqICAgICAgICB1cGRhdGUgcHJvY2VkdXJlcyBkZWZpbmVkIGluIHNlY3Rpb24gaW4gNi4yLjIuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX1U4ICpwUmVjLAotICAgIE9NWF9TMTYgKnBQcmVkQnVmUm93LAotICAgIE9NWF9TMTYgKnBQcmVkQnVmQ29sLAotICAgIE9NWF9TMTYgKnBQcmVBQ1ByZWRpY3QsCi0gICAgT01YX0lOVCAqcFN1bUVyciwKLSAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCi0gICAgT01YX1U4IGN1clFwLAotICAgIGNvbnN0IE9NWF9VOCAqcFFwQnVmLAotICAgIE9NWF9JTlQgc3JjU3RlcCwKLSAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAgICg2LjIuNC40LjUpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBJbXBsZW1lbnRzIERDVCwgYW5kIHF1YW50aXplcyB0aGUgRENUIGNvZWZmaWNpZW50cyBvZiB0aGUgaW50ZXIgYmxvY2sgCi0gKiB3aGlsZSByZWNvbnN0cnVjdGluZyB0aGUgdGV4dHVyZSByZXNpZHVhbC4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIAotICogdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC1wb2ludGVyIHRvIHRoZSByZXNpZHVhbHMgdG8gYmUgZW5jb2RlZDsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIAotICogICAgICAgICAgICAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyAKLSAqICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwgYW5kIAotICogICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFJlYyAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgdGV4dHVyZSByZXNpZHVhbHM7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgZWl0aGVyIE5VTEwgb3IgCi0gKiAgICAgICAgIG5vdCAxNi1ieXRlIGFsaWduZWQ6IAotICogICAgICAgICAgICAtIHBTcmMgCi0gKiAgICAgICAgICAgIC0gcERzdAotICogICAgICAgICAgICAtIHBSZWMKLSAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyICgKLSAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX1MxNiAqcFJlYywKLSAgICBPTVhfVTggUVAsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICg2LjIuNC41LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyB6aWd6YWcgc2NhbiBhbmQgVkxDIGVuY29kaW5nIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgZm9yIG9uZSAKLSAqIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgcHJvdmlkZWQgCi0gKiBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKLSAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICJJbnRyYSBEQyAKLSAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmciLiAgCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LiAKLSAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKLSAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB0aGUgemlnemFnIAotICogICAgICAgICAgICBzY2FuIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZC4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbi4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKLSAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAotICogICAgICAgICAgICBlbmNvZGVkIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSkgb2YgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIGJsb2NrIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLCBzbyAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAotICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmLiAKLSAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKLSAqICAgIC0gICAgUHJlZERpciBpcyBub3Qgb25lIG9mOiBPTVhfVkNfTk9ORSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAotICogICAgICAgICBPTVhfVkNfVkVSVElDQUwuIAotICogICAgLSAgICBWaWRlb0NvbXAgaXMgbm90IG9uZSBjb21wb25lbnQgb2YgZW51bSBPTVhWQ000UDJWaWRlb0NvbXBvbmVudC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICgKLSAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKLSAgICBPTVhfVTggcHJlZERpciwKLSAgICBPTVhfVTggcGF0dGVybiwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICg2LjIuNC41LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyB6aWd6YWcgc2NhbiBhbmQgVkxDIGVuY29kaW5nIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgZm9yIG9uZSAKLSAqIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgcHJvdmlkZWQgCi0gKiBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKLSAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKLSAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuIAotICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAotICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24sIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHRoZSB6aWd6YWcgCi0gKiAgICAgICAgICAgIHNjYW4gcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX05PTkUgLSBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb24uICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAotICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCi0gKiAgICAgICAgICAgIGVuY29kZWQgCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsIHNvIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgCi0gKiAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYuIAotICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAotICogICAgLSAgICBQcmVkRGlyIGlzIG5vdCBvbmUgb2Y6IE9NWF9WQ19OT05FLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCi0gKiAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gCi0gKiAgICAtICAgIFZpZGVvQ29tcCBpcyBub3Qgb25lIGNvbXBvbmVudCBvZiBlbnVtIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgKAotICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAotICAgIE9NWF9VOCBwcmVkRGlyLAotICAgIE9NWF9VOCBwYXR0ZXJuLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICAgKDYuMi40LjUuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZyBmb3Igb25lIGludGVyIGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAotICogICAgICAgICAgICBzdHJlYW0gCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3IAotICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAotICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCi0gKiAgICAgICAgICAgIGVuY29kZWQgCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQgc28gdGhhdCAKLSAqICAgICAgICAgICAgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHMgCi0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnM6IGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIAotICogICAgICAgICAgICAgIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZiAKLSAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICgKLSAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKLSAgICBPTVhfVTggcGF0dGVybiwKLSAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZU1WICAgKDYuMi40LjUuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFByZWRpY3RzIGEgbW90aW9uIHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaywgZW5jb2RlcyB0aGUgCi0gKiBkaWZmZXJlbmNlLCBhbmQgd3JpdGVzIHRoZSBvdXRwdXQgdG8gdGhlIHN0cmVhbSBidWZmZXIuIFRoZSBpbnB1dCBNVnMgCi0gKiBwTVZDdXJNQiwgcFNyY01WTGVmdE1CLCBwU3JjTVZVcHBlck1CLCBhbmQgcFNyY01WVXBwZXJSaWdodE1CIHNob3VsZCBsaWUgCi0gKiB3aXRoaW4gdGhlIHJhbmdlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGlucHV0IHBhcmFtZXRlciBmY29kZUZvcndhcmQsIGFzIAotICogZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4zLiAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIAotICogc3VwZXJzZXQgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBmdW5jdGlvbiAKLSAqIG9teFZDTTRQMl9GaW5kTVZwcmVkLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSBpbmRleCBvZiB0aGUgZmlyc3QgZnJlZSAobmV4dCBhdmFpbGFibGUpIGJpdCBpbiB0aGUgc3RyZWFtIAotICogICAgICAgICAgICBidWZmZXIgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0sIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDcuIAotICogICBwTVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIHZhbHVlIG9mIAotICogICAgICAgICAgICBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCi0gKiAgIHBTcmNNVkxlZnRNQiAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBsZWZ0IG1hY3JvYmxvY2sgbW90aW9uIHZlY3RvcjsgYSAKLSAqICAgICAgICAgICAgdmFsdWUgb2YgIE5VTExpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAotICogICBwU3JjTVZVcHBlck1CIC0gcG9pbnRlciB0byBzb3VyY2UgdXBwZXIgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIAotICogICAgICAgICAgICB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCi0gKiAgIHBTcmNNVlVwcGVyUmlnaHRNQiAtIHBvaW50ZXIgdG8gc291cmNlIHVwcGVyIHJpZ2h0IE1CIG1vdGlvbiB2ZWN0b3I7IGEgCi0gKiAgICAgICAgICAgIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKLSAqICAgZmNvZGVGb3J3YXJkIC0gYW4gaW50ZWdlciB3aXRoIHZhbHVlcyBmcm9tIDEgdG8gNzsgdXNlZCBpbiBlbmNvZGluZyAKLSAqICAgICAgICAgICAgbW90aW9uIHZlY3RvcnMgcmVsYXRlZCB0byBzZWFyY2ggcmFuZ2UsIGFzIGRlc2NyaWJlZCBpbiAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjMuIAotICogICBNQlR5cGUgLSBtYWNybyBibG9jayB0eXBlLCB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA1IAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHVwZGF0ZWQgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIAotICogICAgICAgICAgICBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSB1cGRhdGVkIGluZGV4IG9mIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgcG9zaXRpb24gaW4gc3RyZWFtIAotICogICAgICAgICAgICBidWZmZXIgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCi0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKLSAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBNVkN1ck1CIAotICogICAgLSAgICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKLSAqICAgIC0gICAgZmNvZGVGb3J3YXJkIDw9IDAsIG9yIGZjb2RlRm9yd2FyZCA+IDcsIG9yIE1CVHlwZSA8IDAuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVNViAoCi0gICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WQ3VyTUIsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqcFNyY01WTGVmdE1CLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlck1CLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlclJpZ2h0TUIsCi0gICAgT01YX0lOVCBmY29kZUZvcndhcmQsCi0gICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgTUJUeXBlCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICAgKDYuMi41LjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIERlY29kZXMgYW5kIHBhZHMgdGhlIGZvdXIgbW90aW9uIHZlY3RvcnMgYXNzb2NpYXRlZCB3aXRoIGEgbm9uLWludHJhIFAtVk9QIAotICogbWFjcm9ibG9jay4gIEZvciBtYWNyb2Jsb2NrcyBvZiB0eXBlIE9NWF9WQ19JTlRFUjRWLCB0aGUgb3V0cHV0IE1WIGlzIAotICogcGFkZGVkIGFzIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMS42LiBPdGhlcndpc2UsIGZvciAKLSAqIG1hY3JvYmxvY2tzIG9mIHR5cGVzIG90aGVyIHRoYW4gT01YX1ZDX0lOVEVSNFYsIHRoZSBkZWNvZGVkIE1WIGlzIGNvcGllZCB0byAKLSAqIGFsbCBmb3VyIG91dHB1dCBNViBidWZmZXIgZW50cmllcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKLSAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XS4gCi0gKiAgIHBTcmNNVkxlZnRNQiwgcFNyY01WVXBwZXJNQiwgYW5kIHBTcmNNVlVwcGVyUmlnaHRNQiAtIHBvaW50ZXJzIHRvIHRoZSAKLSAqICAgICAgICAgICAgbW90aW9uIHZlY3RvciBidWZmZXJzIG9mIHRoZSBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIGxlZnQsIAotICogICAgICAgICAgICB1cHBlciwgYW5kIHVwcGVyLXJpZ2h0IHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaywgCi0gKiAgICAgICAgICAgIHJlc3BlY3RpdmVseTsgYSB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gIE5vdGU6IAotICogICAgICAgICAgICBBbnkgbmVpZ2hib3Job29kIG1hY3JvYmxvY2sgb3V0c2lkZSB0aGUgY3VycmVudCBWT1Agb3IgdmlkZW8gCi0gKiAgICAgICAgICAgIHBhY2tldCBvciBvdXRzaWRlIHRoZSBjdXJyZW50IEdPQiAod2hlbiBzaG9ydF92aWRlb19oZWFkZXIgaXMgCi0gKiAgICAgICAgICAgICAxICkgZm9yIHdoaWNoIGdvYl9oZWFkZXJfZW1wdHkgaXMgIDAgIGlzIHRyZWF0ZWQgYXMgCi0gKiAgICAgICAgICAgIHRyYW5zcGFyZW50LCBhY2NvcmRpbmcgdG8gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjUuIAotICogICBmY29kZUZvcndhcmQgLSBhIGNvZGUgZXF1YWwgdG8gdm9wX2Zjb2RlX2ZvcndhcmQgaW4gTVBFRy00IGJpdCBzdHJlYW0gCi0gKiAgICAgICAgICAgIHN5bnRheCAKLSAqICAgTUJUeXBlIC0gdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4gSWYgTUJUeXBlIGlzIG5vdCBlcXVhbCB0byAKLSAqICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYsIHRoZSBkZXN0aW5hdGlvbiBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpcyBzdGlsbCAKLSAqICAgICAgICAgICAgZmlsbGVkIHdpdGggdGhlIHNhbWUgZGVjb2RlZCB2ZWN0b3IuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3RNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXIgZm9yIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBtYWNyb2Jsb2NrOyBjb250YWlucyBmb3VyIGRlY29kZWQgbW90aW9uIHZlY3RvcnMgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0TVZDdXJNQiAKLSAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQotICogICAgLSAgICBmY29kZUZvcndhcmQgZXhjZWVkcyAoMCw3XQotICogICAgLSAgICBNQlR5cGUgbGVzcyB0aGFuIHplcm8KLSAqICAgIC0gICAgbW90aW9uIHZlY3RvciBidWZmZXIgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZMZWZ0TUIsCi0gICAgT01YVkNNb3Rpb25WZWN0b3IqcFNyY01WVXBwZXJNQiwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WVXBwZXJSaWdodE1CLAotICAgIE9NWFZDTW90aW9uVmVjdG9yKnBEc3RNVkN1ck1CLAotICAgIE9NWF9JTlQgZmNvZGVGb3J3YXJkLAotICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIE1CVHlwZQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAoNi4yLjUuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgCi0gKiBmb3Igb25lIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgCi0gKiBwcm92aWRlZCBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKLSAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKLSAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgCi0gKiAgICAgICAgICAgIGJpdHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgYnl0ZSByZWZlcmVuY2VkIAotICogICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uICBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIHZhbGlkIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAtN10uIAotICogICAgICAgICAgICBCaXQgUG9zaXRpb24gaW4gb25lIGJ5dGU6ICB8TW9zdCAgICAgIExlYXN0fCAKLSAqICAgICAgICAgICAgICAgICAgICAqcEJpdE9mZnNldCAgICAgICAgfDAgMSAyIDMgNCA1IDYgN3wgCi0gKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjsgdXNlZCB0byBzZWxlY3QgdGhlIHppZ3phZyBzY2FuIAotICogICAgICAgICAgICBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAotICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQ7IAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uOyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW47IAotICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uOyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCi0gKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKLSAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc3VjaCB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0Ci0gKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KLSAqICAgIC0gICAgcHJlRGlyIGV4Y2VlZHMgWzAsMl0KLSAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQgCi0gKiAgICBPTVhfU3RzX0VyciAtIGlmOgotICogICAgLSAgICBJbiBEZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgZGNfc2l6ZSA+IDEyIAotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgbWFyayBiaXRzIGVxdWFscyB6ZXJvIAotICogICAgLSAgICBJbGxlZ2FsIHN0cmVhbSBlbmNvdW50ZXJlZDsgY29kZSBjYW5ub3QgYmUgbG9jYXRlZCBpbiBWTEMgdGFibGUgCi0gKiAgICAtICAgIEZvcmJpZGRlbiBjb2RlIGVuY291bnRlcmVkIGluIHRoZSBWTEMgRkxDIHRhYmxlLiAKLSAqICAgIC0gICAgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9VOCBwcmVkRGlyLAotICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKLSAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgKDYuMi41LjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIAotICogZm9yIG9uZSBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIAotICogcHJvdmlkZWQgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCi0gKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCi0gKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIAotICogICAgICAgICAgICBiaXRzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGJ5dGUgcmVmZXJlbmNlZCAKLSAqICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiAgVGhlIHBhcmFtZXRlciAqcEJpdE9mZnNldCBpcyB2YWxpZCBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLTddLiBCaXQgUG9zaXRpb24gaW4gb25lIGJ5dGU6ICB8TW9zdCBMZWFzdHwgKnBCaXRPZmZzZXQgCi0gKiAgICAgICAgICAgIHwwIDEgMiAzIDQgNSA2IDd8IAotICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb247IHVzZWQgdG8gc2VsZWN0IHRoZSB6aWd6YWcgc2NhbiAKLSAqICAgICAgICAgICAgcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiBPTVhfVkNfTk9ORSAtIEFDIAotICogICAgICAgICAgICBwcmVkaWN0aW9uIG5vdCB1c2VkOyBwZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbjsgcGVyZm9ybXMgCi0gKiAgICAgICAgICAgIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2NhbjsgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgCi0gKiAgICAgICAgICAgIHByZWRpY3Rpb247IHBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKLSAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSBvciBjaHJvbWluYW5jZSkgb2YgdGhlIAotICogICAgICAgICAgICBjdXJyZW50IGJsb2NrIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzdWNoIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudCBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIAotICogICAgICAgICAgICAgIG9yIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgICAgICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSwgcHJlRGlyIGV4Y2VlZHMgWzAsMl0sIG9yIHBEc3QgaXMgCi0gKiAgICAgICAgICAgICAgbm90IDQtYnl0ZSBhbGlnbmVkIAotICogICAgT01YX1N0c19FcnIgSW4gRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIGRjX3NpemUgPiAxMiBBdCBsZWFzdCBvbmUgb2YgCi0gKiAgICAgICAgICAgICAgbWFyayBiaXRzIGVxdWFscyB6ZXJvIElsbGVnYWwgc3RyZWFtIGVuY291bnRlcmVkOyBjb2RlIGNhbm5vdCAKLSAqICAgICAgICAgICAgICBiZSBsb2NhdGVkIGluIFZMQyB0YWJsZSBGb3JiaWRkZW4gY29kZSBlbmNvdW50ZXJlZCBpbiB0aGUgVkxDIAotICogICAgICAgICAgICAgIEZMQyB0YWJsZSBUaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX1U4IHByZWREaXIsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgICAoNi4yLjUuMi4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50ZXItY29kZWQgYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBpbiB0aGUgY3VycmVudCBzdHJlYW0gCi0gKiAgICAgICAgICAgIGJ5dGUgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0uIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgCi0gKiAgICAgICAgICAgIHZhbGlkIHdpdGhpbiB0aGUgcmFuZ2UgWzAtN10uIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGRlY29kaW5nIHN1Y2ggdGhhdCBpdCBwb2ludHMgCi0gKiAgICAgICAgICAgIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgaW4gdGhlIHN0cmVhbSBieXRlIHJlZmVyZW5jZWQgYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0Ci0gKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkCi0gKiAgICAtICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQotICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IsIGlmOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybyAKLSAqICAgIC0gICAgRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBzdHJlYW0gY29kZSB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgVkxDIHRhYmxlIAotICogICAgLSAgICBFbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUgCi0gKiAgICAtICAgIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludkludHJhX0kgICAoNi4yLjUuMy4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgdGhlIHNlY29uZCBpbnZlcnNlIHF1YW50aXphdGlvbiBtb2RlIG9uIGFuIGludHJhL2ludGVyIGNvZGVkIAotICogYmxvY2suIFN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gCi0gKiB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKLSAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGZvbGxvd2luZyBmbGFnczogT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIChpbnRyYSAKLSAqICAgICAgICAgICAgdmVyc2lvbiBvbmx5KS4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlciAKLSAqICAgICAgICAgICAgKGludHJhIHZlcnNpb24gb25seSkuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2sgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgCi0gKiAgICAgICAgICAgICAgdHJ1ZTogCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTCAKLSAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PTMxIAotICogICAgLSAgICB2aWRlb0NvbXAgaXMgbmVpdGhlciBPTVhfVkNfTFVNSU5BTkNFIG5vciBPTVhfVkNfQ0hST01JTkFOQ0UuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludkludHJhX0kgKAotICAgIE9NWF9TMTYgKnBTcmNEc3QsCi0gICAgT01YX0lOVCBRUCwKLSAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludkludGVyX0kgICAoNi4yLjUuMy4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgdGhlIHNlY29uZCBpbnZlcnNlIHF1YW50aXphdGlvbiBtb2RlIG9uIGFuIGludHJhL2ludGVyIGNvZGVkIAotICogYmxvY2suIFN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gCi0gKiB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKLSAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGZvbGxvd2luZyBmbGFnczogT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIChpbnRyYSAKLSAqICAgICAgICAgICAgdmVyc2lvbiBvbmx5KS4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlciAKLSAqICAgICAgICAgICAgKGludHJhIHZlcnNpb24gb25seSkuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2sgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgCi0gKiAgICAgICAgICAgICAgdHJ1ZTogCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTCAKLSAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PTMxIAotICogICAgLSAgICB2aWRlb0NvbXAgaXMgbmVpdGhlciBPTVhfVkNfTFVNSU5BTkNFIG5vciBPTVhfVkNfQ0hST01JTkFOQ0UuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludkludGVyX0kgKAotICAgIE9NWF9TMTYgKnBTcmNEc3QsCi0gICAgT01YX0lOVCBRUAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhICAgKDYuMi41LjQuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIERlY29kZXMgdGhlIElOVFJBIGJsb2NrIGNvZWZmaWNpZW50cy4gSW52ZXJzZSBxdWFudGl6YXRpb24sIGludmVyc2VseSAKLSAqIHppZ3phZyBwb3NpdGlvbmluZywgYW5kIElEQ1QsIHdpdGggYXBwcm9wcmlhdGUgY2xpcHBpbmcgb24gZWFjaCBzdGVwLCBhcmUgCi0gKiBwZXJmb3JtZWQgb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgYXJlIHRoZW4gcGxhY2VkIGluIHRoZSBvdXRwdXQgCi0gKiBmcmFtZS9wbGFuZSBvbiBhIHBpeGVsIGJhc2lzLiAgTm90ZTogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgb25seSB3aGVuIAotICogYXQgbGVhc3Qgb25lIG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50IG9mIGN1cnJlbnQgYmxvY2sgZXhpc3RzIGluIHRoZSBiaXQgCi0gKiBzdHJlYW0uIFRoZSBEQyBvbmx5IGNvbmRpdGlvbiB3aWxsIGJlIGhhbmRsZWQgaW4gYW5vdGhlciBmdW5jdGlvbi4gCi0gKgotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCi0gKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSAKLSAqICAgICAgICAgICAgYnVmZmVyLiAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XS4gCi0gKiAgIHN0ZXAgLSB3aWR0aCBvZiB0aGUgZGVzdGluYXRpb24gcGxhbmUgCi0gKiAgIHBDb2VmQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIAotICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwQ29lZkJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgY3VyUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHdoaWNoIHRoZSBjdXJyZW50IGJsb2NrIAotICogICAgICAgICAgICBiZWxvbmdzIHRvIAotICogICBwUVBCdWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlciAKLSAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiBhcyAKLSAqICAgICAgICAgICAgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA2LjEuMy44LCBGaWd1cmUgNi01LiAKLSAqICAgaW50cmFEQ1ZMQyAtIGEgY29kZSBkZXRlcm1pbmVkIGJ5IGludHJhX2RjX3ZsY190aHIgYW5kIFFQLiBUaGlzIGFsbG93cyBhIAotICogICAgICAgICAgICBtZWNoYW5pc20gdG8gc3dpdGNoIGJldHdlZW4gdHdvIFZMQyBmb3IgY29kaW5nIG9mIEludHJhIERDIAotICogICAgICAgICAgICBjb2VmZmljaWVudHMgYXMgcGVyIFtJU08xNDQ5Ni0yXSwgVGFibGUgNi0yMS4gCi0gKiAgIEFDUHJlZEZsYWcgLSBhIGZsYWcgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIChvZiBsdW1pbmFuY2UpIGluZGljYXRpbmcgaWYgCi0gKiAgICAgICAgICAgIHRoZSBhYyBjb2VmZmljaWVudHMgb2YgdGhlIGZpcnN0IHJvdyBvciBmaXJzdCBjb2x1bW4gYXJlIAotICogICAgICAgICAgICBkaWZmZXJlbnRpYWxseSBjb2RlZCBmb3IgaW50cmEgY29kZWQgbWFjcm9ibG9jay4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCi0gKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIGRlc3RpbmF0aW9uIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gCi0gKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBDb2VmQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyLiAKLSAqICAgcENvZWZCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgIE5vdGU6IAotICogICAgICAgICAgICBUaGUgY29lZmZpY2llbnQgYnVmZmVycyBtdXN0IGJlIHVwZGF0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSAKLSAqICAgICAgICAgICAgdXBkYXRlIHByb2NlZHVyZSBkZWZpbmVkIGluIHNlY3Rpb24gNi4yLjIuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgCi0gKiAgICAgICAgIHBRUEJ1ZiwgcERzdC4gCi0gKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10gCi0gKiAgICAtICAgIGN1clFQIGV4Y2VlZHMgKDEsIDMxKQotICogICAgLSAgICBibG9ja0luZGV4IGV4Y2VlZHMgWzAsNV0KLSAqICAgIC0gICAgc3RlcCBpcyBub3QgdGhlIG11bHRpcGxlIG9mIDgKLSAqICAgIC0gICAgYSBwb2ludGVyIGFsaWdubWVudCByZXF1aXJlbWVudCB3YXMgdmlvbGF0ZWQuIAotICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IuIFJlZmVyIHRvIE9NWF9TdHNfRXJyIG9mIERlY29kZVZMQ1ppZ3phZ19JbnRyYS4gIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9JTlQgc3RlcCwKLSAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKLSAgICBPTVhfUzE2ICpwQ29lZkJ1ZkNvbCwKLSAgICBPTVhfVTggY3VyUVAsCi0gICAgY29uc3QgT01YX1U4ICpwUVBCdWYsCi0gICAgT01YX0lOVCBibG9ja0luZGV4LAotICAgIE9NWF9JTlQgaW50cmFEQ1ZMQywKLSAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIgICAoNi4yLjUuNC4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogRGVjb2RlcyB0aGUgSU5URVIgYmxvY2sgY29lZmZpY2llbnRzLiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgCi0gKiBxdWFudGl6YXRpb24sIGludmVyc2UgemlnemFnIHBvc2l0aW9uaW5nLCBhbmQgSURDVCAod2l0aCBhcHByb3ByaWF0ZSAKLSAqIGNsaXBwaW5nIG9uIGVhY2ggc3RlcCkgb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgKHJlc2lkdWFscykgYXJlIAotICogcGxhY2VkIGluIGEgY29udGlndW91cyBhcnJheSBvZiA2NCBlbGVtZW50cy4gRm9yIElOVEVSIGJsb2NrLCB0aGUgb3V0cHV0IAotICogYnVmZmVyIGhvbGRzIHRoZSByZXNpZHVhbHMgZm9yIGZ1cnRoZXIgcmVjb25zdHJ1Y3Rpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCi0gKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSAKLSAqICAgICAgICAgICAgYnVmZmVyLiAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XSAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAotICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlY29kZWQgcmVzaWR1YWwgYnVmZmVyIChhIGNvbnRpZ3VvdXMgYXJyYXkgb2YgNjQgCi0gKiAgICAgICAgICAgIGVsZW1lbnRzIG9mIE9NWF9TMTYgZGF0YSB0eXBlKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTnVsbDogCi0gKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQgLCBwRHN0IAotICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCi0gKiAgICAtICAgIFFQIDw9IDAuIAotICogICAgLSAgICBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQgCi0gKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvci4gUmVmZXIgdG8gT01YX1N0c19FcnIgb2YgRGVjb2RlVkxDWmlnemFnX0ludGVyIC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9JTlQgUVAsCi0gICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEgICAoNi4yLjUuNC4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suICBQcmlvciAKLSAqIHRvIHRoZSBmdW5jdGlvbiBjYWxsLCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAocHJlZERpcikgc2hvdWxkIGJlIHNlbGVjdGVkIGFzIAotICogc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4zLjEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIHF1YW50aXplZCAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnQgcmVzaWR1YWxzIChQUUYpIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIAotICogICAgICAgICAgICBzYXR1cmF0ZWQgdG8gdGhlIHJhbmdlIFstMjA0OCwgMjA0N10uIAotICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiAKLSAqICAgICAgICAgICAgYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICBjdXJRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQIG1heSBlcXVhbCB0byAKLSAqICAgICAgICAgICAgcHJlZFFQIGVzcGVjaWFsbHkgd2hlbiB0aGUgY3VycmVudCBibG9jayBhbmQgdGhlIHByZWRpY3RvciBibG9jayAKLSAqICAgICAgICAgICAgYXJlIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suIAotICogICBwcmVkUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sgCi0gKiAgIHByZWREaXIgLSBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6IE9NWF9WQ19IT1JJWk9OVEFMIC0gcHJlZGljdCBob3Jpem9udGFsbHkgCi0gKiAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTCAtIHByZWRpY3QgdmVydGljYWxseSAKLSAqICAgQUNQcmVkRmxhZyAtIGEgZmxhZyBpbmRpY2F0aW5nIGlmIEFDIHByZWRpY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZC4gSXQgCi0gKiAgICAgICAgICAgIGlzIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyBpbiB0aGUgYml0IHN0cmVhbSBzeW50YXggb2YgTVBFRy00IAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIHF1YW50aXplZCAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnRzIChRRikgb2YgdGhlIGN1cnJlbnQgYmxvY2sgCi0gKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyIAotICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAgTm90ZTogCi0gKiAgICAgICAgICAgIEJ1ZmZlciB1cGRhdGU6IFVwZGF0ZSB0aGUgQUMgcHJlZGljdGlvbiBidWZmZXIgKGJvdGggcm93IGFuZCAKLSAqICAgICAgICAgICAgY29sdW1uIGJ1ZmZlcikuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKLSAqICAgICAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgICAgcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sLiAKLSAqICAgICAgICAtICAgIGN1clFQIDw9IDAsIAotICogICAgICAgIC0gICAgcHJlZFFQIDw9IDAsIAotICogICAgICAgIC0gICAgY3VyUVAgPjMxLCAKLSAqICAgICAgICAtICAgIHByZWRRUCA+IDMxLCAKLSAqICAgICAgICAtICAgIHByZURpciBleGNlZWRzIFsxLDJdCi0gKiAgICAgICAgLSAgICBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhICgKLSAgICBPTVhfUzE2ICpwU3JjRHN0LAotICAgIE9NWF9TMTYgKnBQcmVkQnVmUm93LAotICAgIE9NWF9TMTYgKnBQcmVkQnVmQ29sLAotICAgIE9NWF9JTlQgY3VyUVAsCi0gICAgT01YX0lOVCBwcmVkUVAsCi0gICAgT01YX0lOVCBwcmVkRGlyLAotICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKLSAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01DUmVjb25CbG9jayAgICg2LjIuNS41LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBtb3Rpb24gY29tcGVuc2F0aW9uIHByZWRpY3Rpb24gZm9yIGFuIDh4OCBibG9jayB1c2luZyAKLSAqIGludGVycG9sYXRpb24gZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4yLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4gCi0gKiAgIHNyY1N0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgZHN0U3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSAKLSAqICAgICAgICAgICAgZGVzdGluYXRpb24gcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIHBTcmNSZXNpZHVlIC0gcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSAxNi1iaXQgcHJlZGljdGlvbiAKLSAqICAgICAgICAgICAgcmVzaWR1YWxzOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gSWYgdGhlIHBvaW50ZXIgaXMgTlVMTCwgdGhlbiAKLSAqICAgICAgICAgICAgbm8gcHJlZGljdGlvbiBpcyBkb25lLCBvbmx5IG1vdGlvbiBjb21wZW5zYXRpb24sIGkuZS4sIHRoZSBibG9jayAKLSAqICAgICAgICAgICAgaXMgbW92ZWQgd2l0aCBpbnRlcnBvbGF0aW9uLiAKLSAqICAgcHJlZGljdFR5cGUgLSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIHR5cGUsIGFzIGRlZmluZWQgaW4gc2VjdGlvbiAKLSAqICAgICAgICAgICAgNi4yLjEuMi4gCi0gKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gIElmIAotICogICAgICAgICAgICBwcmVkaWN0aW9uIHJlc2lkdWFscyBhcmUgYWRkZWQgdGhlbiBvdXRwdXQgaW50ZW5zaXRpZXMgYXJlIAotICogICAgICAgICAgICBjbGlwcGVkIHRvIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcFNyY1Jlc2lkdWUgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyBvciBwRHN0LiAKLSAqICAgIC0gICAgZWl0aGVyIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgaW52YWxpZCB0eXBlIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBwcmVkaWN0VHlwZS4gCi0gKiAgICAtICAgIHRoZSBwYXJhbWV0ZXIgcm5kVmFsIGlzIG5vdCBlcXVhbCBlaXRoZXIgdG8gMCBvciAxLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDJfTUNSZWNvbkJsb2NrICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX0lOVCBzcmNTdGVwLAotICAgIGNvbnN0IE9NWF9TMTYgKnBTcmNSZXNpZHVlLAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgT01YX0lOVCBwcmVkaWN0VHlwZSwKLSAgICBPTVhfSU5UIHJuZFZhbAotKTsKLQotCi0KLS8qIDYuMy4xLjEgSW50cmEgMTZ4MTYgUHJlZGljdGlvbiBNb2RlcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBpbnRyYV8xNngxNiBtYWNyb2Jsb2NrIHByZWRpY3Rpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfMTZYMTZfVkVSVCA9IDAsICAvKiogSW50cmFfMTZ4MTZfVmVydGljYWwgKi8KLSAgICBPTVhfVkNfMTZYMTZfSE9SID0gMSwgICAvKiogSW50cmFfMTZ4MTZfSG9yaXpvbnRhbCAqLwotICAgIE9NWF9WQ18xNlgxNl9EQyA9IDIsICAgIC8qKiBJbnRyYV8xNngxNl9EQyAqLwotICAgIE9NWF9WQ18xNlgxNl9QTEFORSA9IDMgIC8qKiBJbnRyYV8xNngxNl9QbGFuZSAqLyAKLX0gT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZTsKLQotCi0KLS8qIDYuMy4xLjIgSW50cmEgNHg0IFByZWRpY3Rpb24gTW9kZXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgaW50cmFfNHg0IG1hY3JvYmxvY2sgcHJlZGljdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ180WDRfVkVSVCA9IDAsICAgICAvKiogSW50cmFfNHg0X1ZlcnRpY2FsICovCi0gICAgT01YX1ZDXzRYNF9IT1IgPSAxLCAgICAgIC8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbCAqLwotICAgIE9NWF9WQ180WDRfREMgPSAyLCAgICAgICAvKiogSW50cmFfNHg0X0RDICovCi0gICAgT01YX1ZDXzRYNF9ESUFHX0RMID0gMywgIC8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9MZWZ0ICovCi0gICAgT01YX1ZDXzRYNF9ESUFHX0RSID0gNCwgIC8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9SaWdodCAqLwotICAgIE9NWF9WQ180WDRfVlIgPSA1LCAgICAgICAvKiogSW50cmFfNHg0X1ZlcnRpY2FsX1JpZ2h0ICovCi0gICAgT01YX1ZDXzRYNF9IRCA9IDYsICAgICAgIC8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9Eb3duICovCi0gICAgT01YX1ZDXzRYNF9WTCA9IDcsICAgICAgIC8qKiBJbnRyYV80eDRfVmVydGljYWxfTGVmdCAqLwotICAgIE9NWF9WQ180WDRfSFUgPSA4ICAgICAgICAvKiogSW50cmFfNHg0X0hvcml6b250YWxfVXAgKi8gCi19IE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlOwotCi0KLQotLyogNi4zLjEuMyBDaHJvbWEgUHJlZGljdGlvbiBNb2RlcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBpbnRyYSBjaHJvbWEgcHJlZGljdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ19DSFJPTUFfREMgPSAwLCAgICAvKiogSW50cmFfQ2hyb21hX0RDICovCi0gICAgT01YX1ZDX0NIUk9NQV9IT1IgPSAxLCAgIC8qKiBJbnRyYV9DaHJvbWFfSG9yaXpvbnRhbCAqLwotICAgIE9NWF9WQ19DSFJPTUFfVkVSVCA9IDIsICAvKiogSW50cmFfQ2hyb21hX1ZlcnRpY2FsICovCi0gICAgT01YX1ZDX0NIUk9NQV9QTEFORSA9IDMgIC8qKiBJbnRyYV9DaHJvbWFfUGxhbmUgKi8gCi19IE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlOwotCi0KLQotLyogNi4zLjEuNCBNb3Rpb24gRXN0aW1hdGlvbiBNb2RlcyAgKi8KLS8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBILjI2NCBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLwotCi10eXBlZGVmIGVudW0gewotICAgIE9NWF9WQ19NNFAxMF9GQVNUX1NFQVJDSCA9IDAsIC8qKiBGYXN0IG1vdGlvbiBzZWFyY2ggKi8KLSAgICBPTVhfVkNfTTRQMTBfRlVMTF9TRUFSQ0ggPSAxICAvKiogRnVsbCBtb3Rpb24gc2VhcmNoICovIAotfSBPTVhWQ000UDEwTUVNb2RlOwotCi0KLQotLyogNi4zLjEuNSBNYWNyb2Jsb2NrIFR5cGVzICAqLwotLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIEguMjY0IG1hY3JvYmxvY2sgdHlwZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfUF8xNngxNiAgPSAwLCAvKiBkZWZpbmVkIGJ5IFtJU08xNDQ5Ni0xMF0gKi8KLSAgICBPTVhfVkNfUF8xNng4ICA9IDEsCi0gICAgT01YX1ZDX1BfOHgxNiAgPSAyLAotICAgIE9NWF9WQ19QXzh4OCAgPSAzLAotICAgIE9NWF9WQ19QUkVGMF84eDggID0gNCwKLSAgICBPTVhfVkNfSU5URVJfU0tJUCAgPSA1LAotICAgIE9NWF9WQ19JTlRSQV80eDQgID0gOCwKLSAgICBPTVhfVkNfSU5UUkFfMTZ4MTYgID0gOSwKLSAgICBPTVhfVkNfSU5UUkFfUENNID0gMTAgCi19IE9NWFZDTTRQMTBNYWNyb2Jsb2NrVHlwZTsKLQotCi0KLS8qIDYuMy4xLjYgU3ViLU1hY3JvYmxvY2sgVHlwZXMgICovCi0vKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgSC4yNjQgc3ViLW1hY3JvYmxvY2sgdHlwZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBPTVhfVkNfU1VCX1BfOHg4ID0gMCwgLyogZGVmaW5lZCBieSBbSVNPMTQ0OTYtMTBdICovCi0gICAgT01YX1ZDX1NVQl9QXzh4NCA9IDEsCi0gICAgT01YX1ZDX1NVQl9QXzR4OCA9IDIsCi0gICAgT01YX1ZDX1NVQl9QXzR4NCA9IDMgCi19IE9NWFZDTTRQMTBTdWJNYWNyb2Jsb2NrVHlwZTsKLQotCi0KLS8qIDYuMy4xLjcgVmFyaWFibGUgTGVuZ3RoIENvZGluZyAoVkxDKSBJbmZvcm1hdGlvbiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9VOCB1VHJhaWxpbmdfT25lczsgICAgICAvKiBUcmFpbGluZyBvbmVzOyAzIGF0IG1vc3QgKi8KLSAgICBPTVhfVTggdVRyYWlsaW5nX09uZV9TaWduczsgLyogVHJhaWxpbmcgb25lcyBzaWduYWwgKi8KLSAgICBPTVhfVTggdU51bUNvZWZmczsgICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZzLCBpbmNsdWRpbmcgdHJhaWxpbmcgb25lcyAqLwotICAgIE9NWF9VOCB1VG90YWxaZXJvczsgICAgICAgICAvKiBUb3RhbCBudW1iZXIgb2YgemVybyBjb2VmcyAqLwotICAgIE9NWF9TMTYgaUxldmVsc1sxNl07ICAgICAgICAvKiBMZXZlbHMgb2Ygbm9uLXplcm8gY29lZnMsIGluIHJldmVyc2UgemlnLXphZyBvcmRlciAqLwotICAgIE9NWF9VOCB1UnVuc1sxNl07ICAgICAgICAgICAvKiBSdW5zIGZvciBsZXZlbHMgYW5kIHRyYWlsaW5nIG9uZXMsIGluIHJldmVyc2UgemlnLXphZyBvcmRlciAqLwotfSBPTVhWQ000UDEwVkxDSW5mbzsKLQotCi0KLS8qIDYuMy4xLjggTWFjcm9ibG9jayBJbmZvcm1hdGlvbiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE9NWF9TMzIgc2xpY2VJZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNsaWNlIG51bWJlciAqLwotICAgIE9NWFZDTTRQMTBNYWNyb2Jsb2NrVHlwZSBtYlR5cGU7ICAgICAgICAgIC8qIE1CIHR5cGUgKi8KLSAgICBPTVhWQ000UDEwU3ViTWFjcm9ibG9ja1R5cGUgc3ViTUJUeXBlWzRdOyAvKiBzdWItYmxvY2sgdHlwZSAqLwotICAgIE9NWF9TMzIgcXB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHFwIGZvciBsdW1hICovCi0gICAgT01YX1MzMiBxcGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcXAgZm9yIGNocm9tYSAqLwotICAgIE9NWF9VMzIgY2JweTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENCUCBMdW1hICovCi0gICAgT01YX1UzMiBjYnBjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ0JQIENocm9tYSAqLwotICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVjBbNF1bNF07IC8qIG1vdGlvbiB2ZWN0b3IsIHJlcHJlc2VudGVkIHVzaW5nIDEvNC1wZWwgdW5pdHMsIHBNVjBbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjMsIGJsb2NreCA9MH4zKSAqLwotICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVlByZWRbNF1bNF07IC8qIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiwgUmVwcmVzZW50ZWQgdXNpbmcgMS80LXBlbCB1bml0cywgcE1WUHJlZFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MywgYmxvY2t4ID0gMH4zKSAqLwotICAgIE9NWF9VOCBwUmVmTDBJZHhbNF07ICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZmVyZW5jZSBwaWN0dXJlIGluZGljZXMgKi8KLSAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIEludHJhMTZ4MTZQcmVkTW9kZTsgLyogYmVzdCBpbnRyYSAxNngxNiBwcmVkaWN0aW9uIG1vZGUgKi8KLSAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSBwSW50cmE0eDRQcmVkTW9kZVsxNl07IC8qIGJlc3QgaW50cmEgNHg0IHByZWRpY3Rpb24gbW9kZSBmb3IgZWFjaCBibG9jaywgcE1WMCBpbmRleGVkIGFzIGFib3ZlICovCi19IE9NWFZDTTRQMTBNQkluZm8sICpPTVhWQ000UDEwTUJJbmZvUHRyOwotCi0KLQotLyogNi4zLjEuOSBNb3Rpb24gRXN0aW1hdGlvbiBQYXJhbWV0ZXJzICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgT01YX1MzMiBibG9ja1NwbGl0RW5hYmxlOHg4OyAvKiBlbmFibGVzIDE2eDgsIDh4MTYsIDh4OCAqLwotICAgIE9NWF9TMzIgYmxvY2tTcGxpdEVuYWJsZTR4NDsgLyogZW5hYmxlIHNwbGl0dGluZyBvZiA4eDQsIDR4OCwgNHg0IGJsb2NrcyAqLwotICAgIE9NWF9TMzIgaGFsZlNlYXJjaEVuYWJsZTsKLSAgICBPTVhfUzMyIHF1YXJ0ZXJTZWFyY2hFbmFibGU7Ci0gICAgT01YX1MzMiBpbnRyYUVuYWJsZTR4NDsgICAgICAvKiAxPWVuYWJsZSwgMD1kaXNhYmxlICovCi0gICAgT01YX1MzMiBzZWFyY2hSYW5nZTE2eDE2OyAgICAvKiBpbnRlZ2VyIHBpeGVsIHVuaXRzICovCi0gICAgT01YX1MzMiBzZWFyY2hSYW5nZTh4ODsKLSAgICBPTVhfUzMyIHNlYXJjaFJhbmdlNHg0OwotfSBPTVhWQ000UDEwTUVQYXJhbXM7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0ICAgKDYuMy4zLjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm0gSW50cmFfNHg0IHByZWRpY3Rpb24gZm9yIGx1bWEgc2FtcGxlcy4gSWYgdGhlIHVwcGVyLXJpZ2h0IGJsb2NrIGlzIAotICogbm90IGF2YWlsYWJsZSwgdGhlbiBkdXBsaWNhdGlvbiB3b3JrIHNob3VsZCBiZSBoYW5kbGVkIGluc2lkZSB0aGUgZnVuY3Rpb24uIAotICogVXNlcnMgbmVlZCBub3QgZGVmaW5lIHRoZW0gb3V0c2lkZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0xlZnQgLSAgUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDQgbGVmdCBwaXhlbHM6IAotICogICAgICAgICAgICAgICAgICBwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKSAKLSAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggYWJvdmUgcGl4ZWxzOiAKLSAqICAgICAgICAgICAgICAgICAgcFt4LHldICh4ID0gMC4uNywgeSA9LTEpOyAKLSAqICAgICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKLSAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgcHJlZE1vZGUgLSBJbnRyYV80eDQgcHJlZGljdGlvbiBtb2RlLiAKLSAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgNHg0IGJsb2NrIGF2YWlsYWJpbGl0eSBmbGFnLCByZWZlciB0byAKLSAqICAgICAgICAgICAgICJOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSIgLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgcERzdCBpcyBOVUxMLiAKLSAqICAgIGRzdFN0ZXAgPCA0LCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAotICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAotICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfVVBQRVIgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfRElBR19ETCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsIC0xXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9ESUFHX0RSLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAotICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKLSAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKLSAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCi0gKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSEQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCi0gKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAotICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZMLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19VUFBFUiAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSFUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAotICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgCi0gKgotICogTm90ZTogCi0gKiAgICAgcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlcnMgaWYgCi0gKiAgICAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBhcyBpbXBsaWVkIGluIHByZWRNb2RlLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0xlZnQsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIGxlZnRTdGVwLAotICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSBwcmVkTW9kZSwKLSAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiAgICg2LjMuMy4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtIEludHJhXzE2eDE2IHByZWRpY3Rpb24gZm9yIGx1bWEgc2FtcGxlcy4gSWYgdGhlIHVwcGVyLXJpZ2h0IGJsb2NrIAotICogaXMgbm90IGF2YWlsYWJsZSwgdGhlbiBkdXBsaWNhdGlvbiB3b3JrIHNob3VsZCBiZSBoYW5kbGVkIGluc2lkZSB0aGUgCi0gKiBmdW5jdGlvbi4gVXNlcnMgbmVlZCBub3QgZGVmaW5lIHRoZW0gb3V0c2lkZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0xlZnQgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgbGVmdCBwaXhlbHM6IHBbeCwgeV0gKHggPSAtMSwgeSA9IAotICogICAgICAgICAgICAwLi4xNSkgCi0gKiAgIHBTcmNBYm92ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBhYm92ZSBwaXhlbHM6IHBbeCx5XSAoeCA9IDAuLjE1LCAKLSAqICAgICAgICAgICAgeT0gLTEpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKLSAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwcmVkTW9kZSAtIEludHJhXzE2eDE2IHByZWRpY3Rpb24gbW9kZSwgcGxlYXNlIHJlZmVyIHRvIHNlY3Rpb24gMy40LjEuIAotICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyAxNngxNiBNQiBhdmFpbGFiaWxpdHkgZmxhZy4gUmVmZXIgdG8gCi0gKiAgICAgICAgICAgICAgICAgIHNlY3Rpb24gMy40LjQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBwRHN0IGlzIE5VTEwuIAotICogICAgZHN0U3RlcCA8IDE2LiBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCi0gKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4xNSkgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjE1KSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9QTEFORSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKLSAqICAgICAgICAgICAgICBwW3gsLTFdKHggPSAwLi4xNSksIG9yIHBbLTEseV0gKHkgPSAwLi4xNSksIG9yIHBbLTEsLTFdIGlzIG5vdCAKLSAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKLSAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICAKLSAqCi0gKiBOb3RlOiAKLSAqICAgICBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVycyBpZiAKLSAqICAgICB0aGV5IGFyZSBub3QgdXNlZCBieSBpbnRyYSBwcmVkaWN0aW9uIGltcGxpZWQgaW4gcHJlZE1vZGUuIAotICogTm90ZTogCi0gKiAgICAgT01YX1ZDX1VQUEVSX1JJR0hUIGlzIG5vdCB1c2VkIGluIGludHJhXzE2eDE2IGx1bWEgcHJlZGljdGlvbi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0xlZnQsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIGxlZnRTdGVwLAotICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIHByZWRNb2RlLAotICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCAgICg2LjMuMy4xLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbnRyYSBwcmVkaWN0aW9uIGZvciBjaHJvbWEgc2FtcGxlcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0xlZnQgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBsZWZ0IHBpeGVsczogcFt4LCB5XSAoeCA9IC0xLCB5PSAKLSAqICAgICAgICAgICAgMC4uNykuIAotICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBhYm92ZSBwaXhlbHM6IHBbeCx5XSAoeCA9IDAuLjcsIHkgCi0gKiAgICAgICAgICAgID0gLTEpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKLSAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgcHJlZE1vZGUgLSBJbnRyYSBjaHJvbWEgcHJlZGljdGlvbiBtb2RlLCBwbGVhc2UgcmVmZXIgdG8gc2VjdGlvbiAzLjQuMy4gCi0gKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIGNocm9tYSBibG9jayBhdmFpbGFiaWxpdHkgZmxhZywgcGxlYXNlIHJlZmVyIAotICogICAgICAgICAgICB0byAgIk5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5Ii4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBwRHN0IGlzIE5VTEwuIAotICogICAgZHN0U3RlcCA8IDggb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKLSAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjcpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uNykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX1BMQU5FLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAotICogICAgICAgICAgICAgIHBbeCwtMV0oeCA9IDAuLjcpLCBvciBwWy0xLHldICh5ID0gMC4uNyksIG9yIHBbLTEsLTFdIGlzIG5vdCAKLSAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKLSAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKLSAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gIAotICoKLSAqICBOb3RlOiBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVyIGlmIAotICogIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gaW1wbGllZCBpbiBwcmVkTW9kZS4gCi0gKgotICogIE5vdGU6IE9NWF9WQ19VUFBFUl9SSUdIVCBpcyBub3QgdXNlZCBpbiBpbnRyYSBjaHJvbWEgcHJlZGljdGlvbi4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4ICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNMZWZ0LAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlTGVmdCwKLSAgICBPTVhfVTggKnBEc3QsCi0gICAgT01YX0lOVCBsZWZ0U3RlcCwKLSAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUgcHJlZE1vZGUsCi0gICAgT01YX1MzMiBhdmFpbGFiaWxpdHkKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgICAoNi4zLjMuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgcXVhcnRlci1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBsdW1hIE1CLiBJdCBpcyBhc3N1bWVkIHRoYXQgCi0gKiB0aGUgZnJhbWUgaXMgYWxyZWFkeSBwYWRkZWQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlciAKLSAqICAgc3JjU3RlcCAtIHJlZmVyZW5jZSBmcmFtZSBzdGVwLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHJvaS53aWR0aCAKLSAqICAgZHN0U3RlcCAtIGRlc3RpbmF0aW9uIGZyYW1lIHN0ZXAsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCi0gKiAgICAgICAgICAgIHJvaS53aWR0aCAKLSAqICAgZHggLSBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgCi0gKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXSAKLSAqICAgZHkgLSBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciB5IGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgCi0gKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXSAKLSAqICAgcm9pIC0gRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjsgdGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCAKLSAqICAgICAgICAgICAgcm9pLmhlaWdodCBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXI6IAotICogICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqICAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKiAgICAgICAgICBpZiByb2kud2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgPCByb2kud2lkdGguIAotICogICAgZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLDNdLiAKLSAqICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7NCwgOCwgMTZ9LiAKLSAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNCBieXRlIGFsaWduZWQuIAotICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDggb3IgMTYsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCi0gKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBPTVhfUzMyIHNyY1N0ZXAsCi0gICAgT01YX1U4ICpwRHN0LAotICAgIE9NWF9TMzIgZHN0U3RlcCwKLSAgICBPTVhfUzMyIGR4LAotICAgIE9NWF9TMzIgZHksCi0gICAgT01YU2l6ZSByb2kKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAgICg2LjMuMy4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyAxLzgtcGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgaW50ZXIgY2hyb21hIE1CLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC1Qb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlciAKLSAqICAgc3JjU3RlcCAtUmVmZXJlbmNlIGZyYW1lIHN0ZXAgaW4gYnl0ZXMgCi0gKiAgIGRzdFN0ZXAgLURlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAKLSAqICAgICAgICAgICAgcm9pLndpZHRoLiAKLSAqICAgZHggLUZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvOCBwaXhlbCAKLSAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddIAotICogICBkeSAtRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvOCBwaXhlbCAKLSAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddIAotICogICByb2kgLURpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247IHRoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgCi0gKiAgICAgICAgICAgIHJvaS5oZWlnaHQgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgMiwgNCwgb3IgOC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlcjoKLSAqICAgICAgICAgaWYgcm9pLndpZHRoPT0yLCAgMi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqICAgICAgICAgaWYgcm9pLndpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCA8IDguIAotICogICAgZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLTddLiAKLSAqICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7Miw0LDh9LiAKLSAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byAyLCBidXQgcERzdCBpcyBub3QgMi1ieXRlIGFsaWduZWQuIAotICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIGJ1dCBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gOCwgYnV0IHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX1MzMiBzcmNTdGVwLAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfUzMyIGRzdFN0ZXAsCi0gICAgT01YX1MzMiBkeCwKLSAgICBPTVhfUzMyIGR5LAotICAgIE9NWFNpemUgcm9pCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICAgKDYuMy4zLjMuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgdmVydGljYWwgZWRnZXMgb2YgdGhlIGx1bWEgCi0gKiBtYWNyb2Jsb2NrICgxNngxNikuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHNyY2RzdFN0ZXAgLVN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcEFscGhhIC1BcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGFscGhhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAotICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgCi0gKiAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAotICogICBwQmV0YSAtQXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCi0gKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIAotICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtQXJyYXkgb2Ygc2l6ZSAxNiBvZiBUaHJlc2hvbGRzIChUQzApICh2YWx1ZXMgZm9yIHRoZSBsZWZ0IAotICogICAgICAgICAgICBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlcik7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuLiAgUGVyIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgCi0gKiAgICAgICAgICAgIGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLUFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgCi0gKiAgICAgICAgICAgIG9yZGVyKTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgCi0gKiAgICAgICAgICAgIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIEVpdGhlciBvZiB0aGUgcG9pbnRlcnMgaW4gcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUyAKLSAqICAgICAgICAgICAgICBpcyBOVUxMLiAKLSAqICAgIEVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XWlzIG91dHNpZGUgb2YgdGhlIAotICogICAgICAgICAgICAgIHJhbmdlIFswLDI1XS4gCi0gKiAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAocEJTW2ldPT00ICYmIAotICogICAgICAgICAgICAgIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kgKAotICAgIE9NWF9VOCAqcFNyY0RzdCwKLSAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCi0gICAgY29uc3QgT01YX1U4ICpwQmV0YSwKLSAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAotICAgIGNvbnN0IE9NWF9VOCAqcEJTCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JICAgKDYuMy4zLjMuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgaG9yaXpvbnRhbCBlZGdlcyBvZiB0aGUgbHVtYSAKLSAqIG1hY3JvYmxvY2sgKDE2eDE2KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtIHN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcEFscGhhIC0gYXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBhbHBoYSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKLSAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSAKLSAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAotICogICBwQmV0YSAtIGFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gCi0gKiAgICAgICAgICAgIGlzIGZvciB0aGUgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlKS4gUGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSAKLSAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSAxNiBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSB0b3AgCi0gKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayAKLSAqICAgICAgICAgICAgb3JkZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciBbSVNPMTQ0OTYgMTBdIAotICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIAotICogICAgICAgICAgICBvcmRlcik7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIAotICogICAgICAgICAgICBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyLCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCi0gKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAotICogICAgLSAgICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAotICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMTVdIGlzIAotICogICAgICAgICBvdXRzaWRlIG9mIHRoZSByYW5nZSBbMCwyNV0uIAotICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKLSAqICAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kgKAotICAgIE9NWF9VOCAqcFNyY0RzdCwKLSAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCi0gICAgY29uc3QgT01YX1U4ICpwQmV0YSwKLSAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAotICAgIGNvbnN0IE9NWF9VOCAqcEJTCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgICAoNi4zLjMuMy4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciB2ZXJ0aWNhbCBlZGdlcyBvZiB0aGUgY2hyb21hIAotICogbWFjcm9ibG9jayAoOHg4KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC0gU3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIHBBbHBoYSAtIEFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyBhbHBoYSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIGZvciAKLSAqICAgICAgICAgICAgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIAotICogICAgICAgICAgICBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC0gQXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCi0gKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIAotICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtIEFycmF5IG9mIHNpemUgOCBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSBsZWZ0IAotICogICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlIG9mIGVhY2ggNHgyIGNocm9tYSBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgCi0gKiAgICAgICAgICAgIGJsb2NrIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtIEFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAodmFsdWVzIGZvciBlYWNoIDJ4MiBjaHJvbWEgCi0gKiAgICAgICAgICAgIGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlcikuIFRoaXMgcGFyYW1ldGVyIGlzIHRoZSAKLSAqICAgICAgICAgICAgc2FtZSBhcyB0aGUgcEJTIHBhcmFtZXRlciBwYXNzZWQgaW50byBGaWx0ZXJEZWJsb2NrTHVtYV9WZXJFZGdlOyAKLSAqICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIAotICogICAgICAgICAgICBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgCi0gKiAgICAgICAgICAgIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0IGJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCi0gKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAotICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIHBUaHJlc2hvbGRzIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAotICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uN10gaXMgb3V0c2lkZSAKLSAqICAgICAgICAgb2YgdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKLSAqICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAotICogICAgLSAgICBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JICgKLSAgICBPTVhfVTggKnBTcmNEc3QsCi0gICAgT01YX1MzMiBzcmNkc3RTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAotICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCi0gICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKLSAgICBjb25zdCBPTVhfVTggKnBCUwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICAgKDYuMy4zLjMuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIHRoZSBob3Jpem9udGFsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCi0gKiBtYWNyb2Jsb2NrICg4eDgpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHNyY2RzdFN0ZXAgLSBhcnJheSBzdGVwOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIHBBbHBoYSAtIGFycmF5IG9mIHNpemUgMiBjb250YWluaW5nIGFscGhhIHRocmVzaG9sZHM7IHRoZSBmaXJzdCBlbGVtZW50IAotICogICAgICAgICAgICBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIAotICogICAgICAgICAgICBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciBpbnRlcm5hbCBob3Jpem9udGFsIAotICogICAgICAgICAgICBlZGdlLiAgUGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIAotICogICAgICAgICAgICBbMCwyNTVdLiAKLSAqICAgcEJldGEgLSBhcnJheSBvZiBzaXplIDIgY29udGFpbmluZyBiZXRhIHRocmVzaG9sZHM7IHRoZSBmaXJzdCBlbGVtZW50IAotICogICAgICAgICAgICBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIAotICogICAgICAgICAgICBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgaW50ZXJuYWwgCi0gKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZS4gIFBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgOCBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSB0b3AgCi0gKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSBvZiBlYWNoIDJ4NCBjaHJvbWEgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgCi0gKiAgICAgICAgICAgIGJsb2NrIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTYgY29udGFpbmluZyBCUyBwYXJhbWV0ZXJzIGZvciBlYWNoIDJ4MiBjaHJvbWEgCi0gKiAgICAgICAgICAgIGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIG9yZGVyOyB2YWxpZCBpbiB0aGUgcmFuZ2UgCi0gKiAgICAgICAgICAgIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIAotICogICAgICAgICAgICBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuIAotICogICAgICAgICAgICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciwgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAotICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIHBUaHJlc2hvbGRzIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAotICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uN10gaXMgb3V0c2lkZSAKLSAqICAgICAgICAgb2YgdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAotICogICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLgotICogICAgLSAgICBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICgKLSAgICBPTVhfVTggKnBTcmNEc3QsCi0gICAgT01YX1MzMiBzcmNkc3RTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAotICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCi0gICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKLSAgICBjb25zdCBPTVhfVTggKnBCUwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgICAoNi4zLjMuMy41KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyB0aGUgaG9yaXpvbnRhbCBhbmQgCi0gKiB2ZXJ0aWNhbCBlZGdlcyBvZiBhIGx1bWEgbWFjcm9ibG9jayAoMTZ4MTYpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAotICogICBzcmNkc3RTdGVwIC0gaW1hZ2Ugd2lkdGg7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBBbHBoYSAtIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIAotICogICAgICAgICAgICBmb2xsb3dzOiB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgCi0gKiAgICAgICAgICAgIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAotICogICBwQmV0YSAtIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYmV0YSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogCi0gKiAgICAgICAgICAgIHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAKLSAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciBbSVNPMTQ0OTYtMTBdIAotICogICAgICAgICAgICBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIHRocmVzaG9sZCAoVEMwKSwgb3JnYW5pemVkIGFzIAotICogICAgICAgICAgICBmb2xsb3dzOiB7dmFsdWVzIGZvciB0aGUgbGVmdCBvciBhYm92ZSBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCAKLSAqICAgICAgICAgICAgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayAKLSAqICAgICAgICAgICAgb3JkZXJ9OyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgW0lTTzE0NDk2LTEwXSAKLSAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIEJTIHBhcmFtZXRlcnMgYXJyYW5nZWQgaW4gc2NhbiBibG9jayAKLSAqICAgICAgICAgICAgb3JkZXIgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXM7IHZhbGlkIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgCi0gKiAgICAgICAgICAgIG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gCi0gKiAgICAgICAgICAgIDQuIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCi0gKiAgICAtICAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCi0gKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzIG9yIHBCUy4gCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQWxwaGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCi0gKiAgICAgICAgICAgICAgWzAsMjU1XS4gCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBCZXRhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAotICogICAgICAgICAgICAgIFswLDE4XS4gCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjMxXWlzIG91dHNpZGUgb2YgCi0gKiAgICAgICAgICAgICAgdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAotICogICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAotICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgKAotICAgIE9NWF9VOCAqcFNyY0RzdCwKLSAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCi0gICAgY29uc3QgT01YX1U4ICpwQmV0YSwKLSAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAotICAgIGNvbnN0IE9NWF9VOCAqcEJTCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JICAgKDYuMy4zLjMuNikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2tpbmcgZmlsdGVyaW5nIG9uIGFsbCBlZGdlcyBvZiB0aGUgY2hyb21hIAotICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHNyY2RzdFN0ZXAgLSBzdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgcEFscGhhIC0gcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgCi0gKiAgICAgICAgICAgIGZvbGxvd3M6IHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCAKLSAqICAgICAgICAgICAgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC0gcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBCZXRhIFRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiAKLSAqICAgICAgICAgICAgeyBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAKLSAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciBbSVNPMTQ0OTYtMTBdIAotICogICAgICAgICAgICBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgOHgyIG9mIFRocmVzaG9sZHMgKFRDMCkgKHZhbHVlcyBmb3IgdGhlIGxlZnQgCi0gKiAgICAgICAgICAgIG9yIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDIgb3IgMng0IGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCAKLSAqICAgICAgICAgICAgYmxvY2sgb3JkZXIgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcik7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuIFBlciBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNngyIG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgb3JkZXIgCi0gKiAgICAgICAgICAgIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzKTsgdmFsaWQgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSAKLSAqICAgICAgICAgICAgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSAKLSAqICAgICAgICAgICAgNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAotICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKLSAqICAgIC0gICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBBbHBoYVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgICBbMCwyNTVdLiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQmV0YVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgICBbMCwxOF0uIAotICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XWlzIG91dHNpZGUgb2YgCi0gKiAgICAgICAgICAgICAgdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgICAtICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgIGZvciBpPj00LCBvciAKLSAqICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAotICogICAgLSAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kgKAotICAgIE9NWF9VOCAqcFNyY0RzdCwKLSAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCi0gICAgY29uc3QgT01YX1U4ICpwQmV0YSwKLSAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAotICAgIGNvbnN0IE9NWF9VOCAqcEJTCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAgICg2LjMuNC4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSByYXN0ZXIgc2NhbiBmb3IgYSAyeDIgYmxvY2sgb2YgCi0gKiBDaHJvbWFEQ0xldmVsLiAgVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHRoZSBwYWNrZWQgcG9zaXRpb24tY29lZmZpY2llbnQgCi0gKiBidWZmZXIgYXJlIHN0b3JlZCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIsIGkuZS4sIHRoZSBmaXJzdCBidWZmZXIgZWxlbWVudCAKLSAqIGNvbnRhaW5zIHRoZSBsYXN0IG5vbi16ZXJvIHBvc3Rpb24tY29lZmZpY2llbnQgcGFpciBvZiB0aGUgYmxvY2suIFdpdGhpbiAKLSAqIGVhY2ggcG9zaXRpb24tY29lZmZpY2llbnQgcGFpciwgdGhlIHBvc2l0aW9uIGVudHJ5IGluZGljYXRlcyB0aGUgCi0gKiByYXN0ZXItc2NhbiBwb3NpdGlvbiBvZiB0aGUgY29lZmZpY2llbnQsIHdoaWxlIHRoZSBjb2VmZmljaWVudCBlbnRyeSAKLSAqIGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCB2YWx1ZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBPZmZzZXQgLSBQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCi0gKiAgIHBPZmZzZXQgLSAqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKLSAqICAgcE51bUNvZWZmIC0gUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluIHRoaXMgYmxvY2sgCi0gKiAgIHBwUG9zQ29lZkJ1ZiAtIERvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsIAotICogICAgICAgICAgICBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlci4gIEJ1ZmZlciBwb3NpdGlvbiAKLSAqICAgICAgICAgICAgKCpwcFBvc0NvZWZCdWYpIGlzIHVwZGF0ZWQgdXBvbiByZXR1cm4sIHVubGVzcyB0aGVyZSBhcmUgb25seSAKLSAqICAgICAgICAgICAgemVybyBjb2VmZmljaWVudHMgaW4gdGhlIGN1cnJlbnRseSBkZWNvZGVkIGJsb2NrLiAgSW4gdGhpcyBjYXNlIAotICogICAgICAgICAgICB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGJ5cGFzcyB0aGUgdHJhbnNmb3JtL2RlcXVhbnRpemF0aW9uIG9mIAotICogICAgICAgICAgICB0aGUgZW1wdHkgYmxvY2tzLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwcEJpdFN0cmVhbSBvciBwT2Zmc2V0IGlzIE5VTEwuIAotICogICAgLSAgICBwcFBvc0NvZWZCdWYgb3IgcE51bUNvZWZmIGlzIE5VTEwuIAotICogICAgT01YX1N0c19FcnIgLSBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYW4gaWxsZWdhbCBjb2RlIGlzIGVuY291bnRlcmVkIGluIHRoZSBiaXRzdHJlYW0gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfUzMyKnBPZmZzZXQsCi0gICAgT01YX1U4ICpwTnVtQ29lZmYsCi0gICAgT01YX1U4ICoqcHBQb3NDb2VmYnVmCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMgICAoNi4zLjQuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIDR4NCBibG9jayBvZiAKLSAqIEludHJhMTZ4MTZEQ0xldmVsLCBJbnRyYTE2eDE2QUNMZXZlbCwgTHVtYUxldmVsLCBhbmQgQ2hyb21hQUNMZXZlbC4gSW52ZXJzZSAKLSAqIGZpZWxkIHNjYW4gaXMgbm90IHN1cHBvcnRlZC4gVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHRoZSBwYWNrZWQgCi0gKiBwb3NpdGlvbi1jb2VmZmljaWVudCBidWZmZXIgYXJlIHN0b3JlZCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIsIGkuZS4sIHRoZSAKLSAqIGZpcnN0IGJ1ZmZlciBlbGVtZW50IGNvbnRhaW5zIHRoZSBsYXN0IG5vbi16ZXJvIHBvc3Rpb24tY29lZmZpY2llbnQgcGFpciBvZiAKLSAqIHRoZSBibG9jay4gV2l0aGluIGVhY2ggcG9zaXRpb24tY29lZmZpY2llbnQgcGFpciwgdGhlIHBvc2l0aW9uIGVudHJ5IAotICogaW5kaWNhdGVzIHRoZSByYXN0ZXItc2NhbiBwb3NpdGlvbiBvZiB0aGUgY29lZmZpY2llbnQsIHdoaWxlIHRoZSAKLSAqIGNvZWZmaWNpZW50IGVudHJ5IGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCB2YWx1ZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLURvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcE9mZnNldCAtIFBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10uIAotICogICBzTWF4TnVtQ29lZmYgLSBNYXhpbXVtIHRoZSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIGJsb2NrIAotICogICBzVkxDU2VsZWN0IC0gVkxDIHRhYmxlIHNlbGVjdG9yLCBvYnRhaW5lZCBmcm9tIHRoZSBudW1iZXIgb2Ygbm9uLXplcm8gCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyBjb250YWluZWQgaW4gdGhlIGFib3ZlIGFuZCBsZWZ0IDR4NCBibG9ja3MuICBJdCBpcyAKLSAqICAgICAgICAgICAgZXF1aXZhbGVudCB0byB0aGUgdmFyaWFibGUgbkMgZGVzY3JpYmVkIGluIEguMjY0IHN0YW5kYXJkIHRhYmxlIAotICogICAgICAgICAgICA5IDUsIGV4Y2VwdCBpdHMgdmFsdWUgY2FuIHQgYmUgbGVzcyB0aGFuIHplcm8uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZC4gIAotICogICAgICAgICAgICBCdWZmZXIgcG9zaXRpb24gKCpwcFBvc0NvZWZCdWYpIGlzIHVwZGF0ZWQgdXBvbiByZXR1cm4sIHVubGVzcyAKLSAqICAgICAgICAgICAgdGhlcmUgYXJlIG9ubHkgemVybyBjb2VmZmljaWVudHMgaW4gdGhlIGN1cnJlbnRseSBkZWNvZGVkIGJsb2NrLiAKLSAqICAgICAgICAgICAgIEluIHRoaXMgY2FzZSB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGJ5cGFzcyB0aGUgCi0gKiAgICAgICAgICAgIHRyYW5zZm9ybS9kZXF1YW50aXphdGlvbiBvZiB0aGUgZW1wdHkgYmxvY2tzLiAKLSAqICAgcE9mZnNldCAtICpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAotICogICBwTnVtQ29lZmYgLSBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4gdGhpcyBibG9jayAKLSAqICAgcHBQb3NDb2VmQnVmIC0gRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcHBCaXRTdHJlYW0gb3IgcE9mZnNldCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcHBQb3NDb2VmQnVmIG9yIHBOdW1Db2VmZiBpcyBOVUxMLiAKLSAqICAgIC0gICAgc01heE51bUNvZWZmIGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgMTUgb3IgMTYuIAotICogICAgLSAgICBzVkxDU2VsZWN0IGlzIGxlc3MgdGhhbiAwLiAKLSAqCi0gKiAgICBPTVhfU3RzX0VyciAtIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAotICogICAgLSAgICBhbiBpbGxlZ2FsIGNvZGUgaXMgZW5jb3VudGVyZWQgaW4gdGhlIGJpdHN0cmVhbSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDICgKLSAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICBPTVhfUzMyICpwT2Zmc2V0LAotICAgIE9NWF9VOCAqcE51bUNvZWZmLAotICAgIE9NWF9VOCAqKnBwUG9zQ29lZmJ1ZiwKLSAgICBPTVhfSU5UIHNWTENTZWxlY3QsCi0gICAgT01YX0lOVCBzTWF4TnVtQ29lZmYKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIgICAoNi4zLjQuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUmVjb25zdHJ1Y3RzIHRoZSA0eDQgTHVtYURDIGJsb2NrIGZyb20gdGhlIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgCi0gKiBidWZmZXIsIHBlcmZvcm1zIGludGVnZXIgaW52ZXJzZSwgYW5kIGRlcXVhbnRpemF0aW9uIGZvciA0eDQgTHVtYURDIAotICogY29lZmZpY2llbnRzLCBhbmQgdXBkYXRlcyB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byB0aGUgbmV4dCBub24tZW1wdHkgCi0gKiBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKLSAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAotICogICBRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIgUXBZIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcFNyYyAtICpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jayAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IEx1bWFEQyBjb2VmZmljaWVudHMgYnVmZmVyOyBtdXN0IAotICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIFFQIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciAoCi0gICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfSU5UIFFQCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIgICAoNi4zLjQuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUmVjb25zdHJ1Y3QgdGhlIDJ4MiBDaHJvbWFEQyBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLCAKLSAqIHBlcmZvcm0gaW50ZWdlciBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uLCBhbmQgZGVxdWFudGl6YXRpb24gZm9yIDJ4MiBjaHJvbWEgCi0gKiBEQyBjb2VmZmljaWVudHMsIGFuZCB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgCi0gKiBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKLSAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAotICogICBRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIgUXBDIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcFNyYyAtICpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jayAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgMngyIENocm9tYURDIGNvZWZmaWNpZW50cyBidWZmZXI7IAotICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgUVAgaXMgbm90IGluIHRoZSByYW5nZSBvZiBbMC01MV0uIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAotICAgIE9NWF9TMTYgKnBEc3QsCi0gICAgT01YX0lOVCBRUAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICAgKDYuMy40LjIuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFJlY29uc3RydWN0IHRoZSA0eDQgcmVzaWR1YWwgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwgCi0gKiBwZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24gZm9yIDR4NCBibG9jayBvZiAKLSAqIHJlc2lkdWFscyB3aXRoIHByZXZpb3VzIGludHJhIHByZWRpY3Rpb24gb3IgbW90aW9uIGNvbXBlbnNhdGlvbiBkYXRhLCBhbmQgCi0gKiB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgYmxvY2suIElmIHBEQyA9PSBOVUxMLCAKLSAqIHRoZXJlIHJlIDE2IG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50cyBhdCBtb3N0IGluIHRoZSBwYWNrZWQgYnVmZmVyIHN0YXJ0aW5nIAotICogZnJvbSA0eDQgYmxvY2sgcG9zaXRpb24gMDsgSWYgcERDICE9IE5VTEwsIHRoZXJlIHJlIDE1IG5vbi16ZXJvIEFDIAotICogY29lZmZpY2llbnRzIGF0IG1vc3QgaW4gdGhlIHBhY2tldCBidWZmZXIgc3RhcnRpbmcgZnJvbSA0eDQgYmxvY2sgcG9zaXRpb24gCi0gKiAxLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAotICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCi0gKiAgIHBQcmVkIC0gUG9pbnRlciB0byB0aGUgcHJlZGljdGVkIDR4NCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeSAKLSAqICAgcHJlZFN0ZXAgLSBQcmVkaWN0ZWQgZnJhbWUgc3RlcCBzaXplIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgZHN0U3RlcCAtIERlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAotICogICBwREMgLSBQb2ludGVyIHRvIHRoZSBEQyBjb2VmZmljaWVudCBvZiB0aGlzIGJsb2NrLCBOVUxMIGlmIGl0IGRvZXNuJ3QgCi0gKiAgICAgICAgICAgIGV4aXN0IAotICogICBRUCAtIFFQIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIuICBJdCBzaG91bGQgYmUgUXBDIGluIGNocm9tYSA0eDQgYmxvY2sgCi0gKiAgICAgICAgICAgIGRlY29kaW5nLCBvdGhlcndpc2UgaXQgc2hvdWxkIGJlIFFwWS4gCi0gKiAgIEFDIC0gRmxhZyBpbmRpY2F0aW5nIGlmIGF0IGxlYXN0IG9uZSBub24temVybyBBQyBjb2VmZmljaWVudCBleGlzdHMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBibG9jayBkYXRhOyBtdXN0IGJlIGFsaWduZWQgb24gYSAKLSAqICAgICAgICAgICAgNC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBQcmVkIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBQcmVkIG9yIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcHJlZFN0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgIC0gICAgQUMgIT0wIGFuZCBRcCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXSBvciBwcFNyYyA9PSBOVUxMLiAKLSAqICAgIC0gICAgQUMgPT0wICYmIHBEQyA9PU5VTEwuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgKAotICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAotICAgIGNvbnN0IE9NWF9VOCAqcFByZWQsCi0gICAgY29uc3QgT01YX1MxNiAqcERDLAotICAgIE9NWF9VOCAqcERzdCwKLSAgICBPTVhfSU5UIHByZWRTdGVwLAotICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICBPTVhfSU5UIFFQLAotICAgIE9NWF9JTlQgQUMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgICAoNi4zLjUuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gCi0gKiBzdHJ1Y3R1cmUgZm9yIHRoZSBvbXhWQ000UDEwIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9ucyBCbG9ja01hdGNoX0ludGVnZXIgCi0gKiBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAotICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAxME1FTW9kZSAKLSAqICAgcE1FUGFyYW1zIC1tb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU2l6ZSAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIG1vdGlvbiAKLSAqICAgICAgICAgICAgZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwTUVQYXJhbXMgb3IgcFNpemUgaXMgTlVMTC4gCi0gKiAgICAtICAgIGFuIGludmFsaWQgTUVNb2RlIGlzIHNwZWNpZmllZC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgKAotICAgIE9NWFZDTTRQMTBNRU1vZGUgTUVtb2RlLAotICAgIGNvbnN0IE9NWFZDTTRQMTBNRVBhcmFtcyAqcE1FUGFyYW1zLAotICAgIE9NWF9VMzIgKnBTaXplCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTUVJbml0ICAgKDYuMy41LjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEluaXRpYWxpemVzIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgcmVxdWlyZWQgZm9yIHRoZSAKLSAqIG9teFZDTTRQMTAgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAgQmxvY2tNYXRjaF9JbnRlZ2VyIGFuZCAKLSAqIE1vdGlvbkVzdGltYXRpb25NQi4gTWVtb3J5IGZvciB0aGUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgKnBNRVNwZWMgbXVzdCBiZSAKLSAqIGFsbG9jYXRlZCBwcmlvciB0byBjYWxsaW5nIHRoZSBmdW5jdGlvbiwgYW5kIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgY2FuIAotICogYmUgZGV0ZXJtaW5lZCB1c2luZyB0aGUgZnVuY3Rpb24gb214VkNNNFAxMF9NRUdldEJ1ZlNpemUuIEZvbGxvd2luZyAKLSAqIGluaXRpYWxpemF0aW9uIGJ5IHRoaXMgZnVuY3Rpb24sIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3RydWN0dXJlICpwTUVTcGVjIAotICogc2hvdWxkIGNvbnRhaW4gYW4gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gb2YgYWxsIG1vdGlvbiAKLSAqIGVzdGltYXRpb24gcGFyYW1ldGVycyByZWNlaXZlZCB2aWEgdGhlIHN0cnVjdHVyZSBwTUVQYXJhbXMsIGZvciBleGFtcGxlICAKLSAqIHNlYXJjaFJhbmdlMTZ4MTYsIHNlYXJjaFJhbmdlOHg4LCBldGMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCi0gKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDEwTUVNb2RlIAotICogICBwTUVQYXJhbXMgLSBtb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgdW5pbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBNRVBhcmFtcyBvciBwU2l6ZSBpcyBOVUxMLiAKLSAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKLSAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIG9uZSBvZiB0aGUgc2VhcmNoIHJhbmdlcyAKLSAqICAgICAgICAgKGUuZy4sICBwTUJQYXJhbXMgPnNlYXJjaFJhbmdlOHg4LCBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlMTZ4MTYsIGV0Yy4pIAotICogICAgLSAgICBlaXRoZXIgaW4gaXNvbGF0aW9uIG9yIGluIGNvbWJpbmF0aW9uLCBvbmUgb3IgbW9yZSBvZiB0aGUgZW5hYmxlcyBvciAKLSAqICAgICAgICAgc2VhcmNoIHJhbmdlcyBpbiB0aGUgc3RydWN0dXJlICpwTUVQYXJhbXMgd2VyZSBjb25maWd1cmVkIHN1Y2ggCi0gKiAgICAgICAgIHRoYXQgdGhlIHJlcXVlc3RlZCBiZWhhdmlvciBmYWlscyB0byBjb21wbHkgd2l0aCBbSVNPMTQ0OTYtMTBdLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX01FSW5pdCAoCi0gICAgT01YVkNNNFAxME1FTW9kZSBNRW1vZGUsCi0gICAgY29uc3QgT01YVkNNNFAxME1FUGFyYW1zICpwTUVQYXJhbXMsCi0gICAgdm9pZCAqcE1FU3BlYwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciAgICg2LjMuNS4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbnRlZ2VyIGJsb2NrIG1hdGNoLiAgUmV0dXJucyBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjdXJyZW50IGJsb2NrOgotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZTogCi0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLCBleHByZXNzZWQgaW4gdGVybXMgCi0gKiAgICAgICAgICAgIG9mIGludGVnZXIgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgaUJsb2NrV2lkdGguIAotICogICBuU3JjUmVmU3RlcCAtIFN0cmlkZSBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKLSAqICAgICAgICAgICAgb2YgaW50ZWdlciBwaXhlbHMgCi0gKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHJlY3RhbmdsZSBpbnNpZGUgdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgcGljdHVyZSBwbGFuZSAKLSAqICAgbkN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAotICogICBpQmxvY2tXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrLCBleHByZXNzZWQgaW4gdGVybXMgb2YgaW50ZWdlciAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaywgZXhwcmVzc2VkIGluIHRlcm1zIG9mIAotICogICAgICAgICAgICBpbnRlZ2VyIHBpeGVsczsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3I7IHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKLSAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNVjsgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0LCBleHByZXNzZWQgaW4gdGVybXMgCi0gKiAgICAgICAgICAgIG9mIDEvNC1wZWwgdW5pdHMgCi0gKiAgIHBNVkNhbmRpZGF0ZSAtIENhbmRpZGF0ZSBNVjsgdXNlZCB0byBpbml0aWFsaXplIHRoZSBtb3Rpb24gc2VhcmNoLCAKLSAqICAgICAgICAgICAgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWxzIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIGludGVnZXIgc2VhcmNoLCBleHByZXNzZWQgaW4gdGVybXMgCi0gKiAgICAgICAgICAgIG9mIDEvNC1wZWwgdW5pdHMgCi0gKiAgIHBCZXN0Q29zdCAtIE1vdGlvbiBjb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNVjsgY29tcHV0ZWQgYXMgCi0gKiAgICAgICAgICAgIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgYXJlIE5VTEw6Ci0gKiAgICAgICAgIHBTcmNPcmdZLCBwU3JjUmVmWSwgcFJlZlJlY3QsIHBNVlByZWQsIHBNVkNhbmRpZGF0ZSwgb3IgcE1FU3BlYy4gCi0gKiAgICAtICAgIEVpdGhlciBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAotICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKLSAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAotICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgT01YX1U4IGlCbG9ja1dpZHRoLAotICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsCi0gICAgT01YX1UzMiBuTGFtZGEsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQsCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVkNhbmRpZGF0ZSwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcEJlc3RNViwKLSAgICBPTVhfUzMyICpwQmVzdENvc3QsCi0gICAgdm9pZCAqcE1FU3BlYwotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAgICg2LjMuNS4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhIGhhbGYtcGVsIGJsb2NrIG1hdGNoIHVzaW5nIHJlc3VsdHMgZnJvbSBhIHByaW9yIGludGVnZXIgc2VhcmNoLiAKLSAqICBSZXR1cm5zIHRoZSBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyB0aGUgCi0gKiBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciByZXNvbHV0aW9uIG1vdGlvbiAKLSAqIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdEJlc3RNViwgaS5lLiwgdGhlIGluaXRpYWwgCi0gKiBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGZ1bmN0aW9uIAotICogb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOgotICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZTogIAotICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAotICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAotICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCi0gKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHMgCi0gKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yLCB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCi0gKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVYsIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHM7IHVzZWQgdG8gCi0gKiAgICAgICAgICAgIGNvbXB1dGUgbW90aW9uIGNvc3QgCi0gKiAgIHBTcmNEc3RCZXN0TVYgLSBUaGUgYmVzdCBNViByZXN1bHRpbmcgZnJvbSBhIHByaW9yIGludGVnZXIgc2VhcmNoLCAKLSAqICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0cyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gdGhlIGhhbGYtcGVsIHNlYXJjaCwgZXhwcmVzc2VkIGluIAotICogICAgICAgICAgICB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAotICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAotICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNPcmdZLCBwU3JjUmVmWSwgCi0gKiAgICAgICAgICAgICAgcFNyY0RzdEJlc3RNViwgcE1WUHJlZCwgcEJlc3RDb3N0IAotICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIGVxdWFsIHRvIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAotICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKLSAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAotICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKLSAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAotICAgIE9NWF9VMzIgbkxhbWRhLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0QmVzdE1WLAotICAgIE9NWF9TMzIgKnBCZXN0Q29zdAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciAgICg2LjMuNS4yLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhIHF1YXJ0ZXItcGVsIGJsb2NrIG1hdGNoIHVzaW5nIHJlc3VsdHMgZnJvbSBhIHByaW9yIGhhbGYtcGVsIAotICogc2VhcmNoLiAgUmV0dXJucyB0aGUgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgCi0gKiB0aGUgcXVhcnRlci1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGhhbGYtcGVsIHJlc29sdXRpb24gCi0gKiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0QmVzdE1WLCBpLmUuLCB0aGUgCi0gKiBpbml0aWFsIGhhbGYtcGVsIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGZ1bmN0aW9uIAotICogb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgbWF5IGJlIHVzZWQgZm9yIGhhbGYtcGVsIG1vdGlvbiBlc3RpbWF0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZToKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmU6Ci0gKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAotICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKLSAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKLSAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVscyAKLSAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAotICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3IsIHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKLSAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNViwgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0czsgdXNlZCB0byAKLSAqICAgICAgICAgICAgY29tcHV0ZSBtb3Rpb24gY29zdCAKLSAqICAgcFNyY0RzdEJlc3RNViAtIFRoZSBiZXN0IE1WIHJlc3VsdGluZyBmcm9tIGEgcHJpb3IgaGFsZi1wZWwgc2VhcmNoLCAKLSAqICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80IHBlbCB1bml0cyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gdGhlIHF1YXJ0ZXItcGVsIHNlYXJjaCwgZXhwcmVzc2VkIAotICogICAgICAgICAgICBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAotICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAotICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNPcmdZLCBwU3JjUmVmWSwgcFNyY0RzdEJlc3RNViwgcE1WUHJlZCwgcEJlc3RDb3N0IAotICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIGVxdWFsIHRvIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAotICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKLSAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAotICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKLSAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAotICAgIE9NWF9VMzIgbkxhbWRhLAotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0QmVzdE1WLAotICAgIE9NWF9TMzIgKnBCZXN0Q29zdAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAgICg2LjMuNS4zLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBhbmQgc2VsZWN0cyBiZXN0IG1vdGlvbiBlc3RpbWF0aW9uIAotICogc3RyYXRlZ3kgZnJvbSB0aGUgc2V0IG9mIG1vZGVzIHN1cHBvcnRlZCBpbiBiYXNlbGluZSBwcm9maWxlIFtJU08xNDQ5Ni0xMF0uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNDdXJyQnVmIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOyAKLSAqICAgICAgICAgICAgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKiAgIHBTcmNSZWZCdWZMaXN0IC0gUG9pbnRlciB0byBhbiBhcnJheSB3aXRoIDE2IGVudHJpZXMuICBFYWNoIGVudHJ5IHBvaW50cyAKLSAqICAgICAgICAgICAgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBNQiBpbiBhIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgcGljdHVyZS4gIFRoZSBhcnJheSBpcyBmaWxsZWQgZnJvbSBsb3ctdG8taGlnaCB3aXRoIHZhbGlkIAotICogICAgICAgICAgICByZWZlcmVuY2UgZnJhbWUgcG9pbnRlcnM7IHRoZSB1bnVzZWQgaGlnaCBlbnRyaWVzIHNob3VsZCBiZSBzZXQgCi0gKiAgICAgICAgICAgIHRvIE5VTEwuICBPcmRlcmluZyBvZiB0aGUgcmVmZXJlbmNlIGZyYW1lcyBzaG91bGQgZm9sbG93IAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHN1YmNsYXVzZSA4LjIuNCAgRGVjb2RpbmcgUHJvY2VzcyBmb3IgUmVmZXJlbmNlIAotICogICAgICAgICAgICBQaWN0dXJlIExpc3RzLiAgIFRoZSBlbnRyaWVzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgcFNyY1JlY0J1ZiAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBNQiBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlY29uc3RydWN0ZWQgcGljdHVyZTsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAotICogICBTcmNDdXJyU3RlcCAtIFdpZHRoIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgU3JjUmVmU3RlcCAtIFdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIFNyY1JlY1N0ZXAgLSBXaWR0aCBvZiB0aGUgcmVjb25zdHJ1Y3RlZCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgcFJlZlJlY3QgLSBQb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlOyByZWxhdGl2ZSB0byB0aGUgCi0gKiAgICAgICAgICAgIGltYWdlIG9yaWdpbi4gCi0gKiAgIHBDdXJyUG9pbnRQb3MgLSBQb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKLSAqICAgTGFtYmRhIC0gTGFncmFuZ2UgZmFjdG9yIGZvciBjb21wdXRpbmcgdGhlIGNvc3QgZnVuY3Rpb24gCi0gKiAgIHBNRVNwZWMgLSBQb2ludGVyIHRvIHRoZSBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgbXVzdCAKLSAqICAgICAgICAgICAgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIAotICogICAgICAgICAgICBmdW5jdGlvbi4gCi0gKiAgIHBNQkludGVyIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBhZGphY2VudCB0eXBlIElOVEVSIE1CcyAoTGVmdCwgVG9wLCAKLSAqICAgICAgICAgICAgVG9wLUxlZnQsIFRvcC1SaWdodCkuIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIAotICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZSBjb3JyZXNwb25kaW5nIE1CIGRvZXNuIHQgZXhpc3Qgb3IgaXMgbm90IG9mIHR5cGUgCi0gKiAgICAgICAgICAgIElOVEVSLiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbMF0gLSBQb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gIHBNQkludGVyWzFdIC0gUG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gIHBNQkludGVyWzJdIC0gUG9pbnRlciB0byB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbM10gLSBQb2ludGVyIHRvIHRvcC1yaWdodCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgcE1CSW50cmEgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIGFkamFjZW50IHR5cGUgSU5UUkEgTUJzIChMZWZ0LCBUb3AsIAotICogICAgICAgICAgICBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgCi0gKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24gdCBleGlzdCBvciBpcyBub3Qgb2YgdHlwZSAKLSAqICAgICAgICAgICAgSU5UUkEuIAotICogICAgICAgICAgICAtICBwTUJJbnRyYVswXSAtIFBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50cmFbMV0gLSBQb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgcE1CSW50cmFbMl0gLSBQb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICAtICBwTUJJbnRyYVszXSAtIFBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAotICogICBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IE1CLiAgCi0gKiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZW50cmllcyBzaG91bGQgYmUgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhlIAotICogICAgICAgICAgICBmdW5jdGlvbjogIHNsaWNlSUQgLSB0aGUgbnVtYmVyIG9mIHRoZSBzbGljZSB0aGUgdG8gd2hpY2ggdGhlIAotICogICAgICAgICAgICBjdXJyZW50IE1CIGJlbG9uZ3MuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0Q29zdCAtIFBvaW50ZXIgdG8gdGhlIG1pbmltdW0gbW90aW9uIGNvc3QgZm9yIHRoZSBjdXJyZW50IE1CLiAKLSAqICAgcERzdEJsb2NrU0FEIC0gUG9pbnRlciB0byB0aGUgYXJyYXkgb2YgU0FEcyBmb3IgZWFjaCBvZiB0aGUgc2l4dGVlbiBsdW1hIAotICogICAgICAgICAgICA0eDQgYmxvY2tzIGluIGVhY2ggTUIuICBUaGUgYmxvY2sgU0FEcyBhcmUgaW4gc2NhbiBvcmRlciBmb3IgCi0gKiAgICAgICAgICAgIGVhY2ggTUIuICBGb3IgaW1wbGVtZW50YXRpb25zIHRoYXQgY2Fubm90IGNvbXB1dGUgdGhlIFNBRCB2YWx1ZXMgCi0gKiAgICAgICAgICAgIGluZGl2aWR1YWxseSwgdGhlIG1heGltdW0gcG9zc2libGUgdmFsdWUgKDB4ZmZmZikgaXMgcmV0dXJuZWQgCi0gKiAgICAgICAgICAgIGZvciBlYWNoIG9mIHRoZSAxNiBibG9jayBTQUQgZW50cmllcy4gCi0gKiAgIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIHVwZGF0ZWQgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgTUIgYWZ0ZXIgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLiAgVGhlIAotICogICAgICAgICAgICBmb2xsb3dpbmcgZmllbGRzIGFyZSB1cGRhdGVkIGJ5IHRoZSBNRSBmdW5jdGlvbi4gICBUaGUgZm9sbG93aW5nIAotICogICAgICAgICAgICBwYXJhbWV0ZXIgc2V0IHF1YW50aWZpZXMgdGhlIE1CLWxldmVsIE1FIHNlYXJjaCByZXN1bHRzOiAKLSAqICAgICAgICAgICAgLSAgTWJUeXBlIAotICogICAgICAgICAgICAtICBzdWJNQlR5cGVbNF0gCi0gKiAgICAgICAgICAgIC0gIHBNVjBbNF1bNF0gCi0gKiAgICAgICAgICAgIC0gIHBNVlByZWRbNF1bNF0gCi0gKiAgICAgICAgICAgIC0gIHBSZWZMMElkeFs0XSAKLSAqICAgICAgICAgICAgLSAgSW50cmExNngxNlByZWRNb2RlIAotICogICAgICAgICAgICAtICBwSW50cmE0eDRQcmVkTW9kZVs0XVs0XSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0N1cnJCdWYsIAotICogICAgICAgICAgIHBTcmNSZWZCdWZMaXN0LCBwU3JjUmVjQnVmLCBwUmVmUmVjdCwgcEN1cnJQb2ludFBvcywgcE1FU3BlYywgCi0gKiAgICAgICAgICAgcE1CSW50ZXIsIHBNQkludHJhLHBTcmNEc3RNQkN1cnIsIHBEc3RDb3N0LCBwU3JjUmVmQnVmTGlzdFswXSAKLSAqICAgIC0gICAgU3JjUmVmU3RlcCwgU3JjUmVjU3RlcCBhcmUgbm90IG11bHRpcGxlcyBvZiAxNiAKLSAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICBPTVhfUzMyIFNyY0N1cnJTdGVwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1Zkxpc3RbMTVdLAotICAgIE9NWF9TMzIgU3JjUmVmU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWNCdWYsCi0gICAgT01YX1MzMiBTcmNSZWNTdGVwLAotICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgT01YX1UzMiBMYW1iZGEsCi0gICAgdm9pZCAqcE1FU3BlYywKLSAgICBjb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRlciwKLSAgICBjb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRyYSwKLSAgICBPTVhWQ000UDEwTUJJbmZvUHRyIHBTcmNEc3RNQkN1cnIsCi0gICAgT01YX0lOVCAqcERzdENvc3QsCi0gICAgT01YX1UxNiAqcERzdEJsb2NrU0FECi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEXzR4ICAgKDYuMy41LjQuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciA0eDggYW5kIDR4NCBibG9ja3MuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmcgLVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgaVN0ZXBPcmcgLVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBwU3JjUmVmIC1Qb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCi0gKiAgIGlTdGVwUmVmIC1TdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAotICogICBpSGVpZ2h0IC1IZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY09yZywgcFNyY1JlZiwgb3IgcERzdFNBRCAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCi0gKiAgICAtICAgIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1NBRF80eCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAotICAgIE9NWF9VMzIgaVN0ZXBPcmcsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAotICAgIE9NWF9VMzIgaVN0ZXBSZWYsCi0gICAgT01YX1MzMiAqcERzdFNBRCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzR4ICAgKDYuMy41LjQuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCi0gKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciA0eDggb3IgNHg0IGJsb2Nrcy4gIFJvdW5kaW5nIAotICogaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAotICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKLSAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCi0gKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfNHggKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYwLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjEsCi0gICAgT01YX1UzMiBpU3JjU3RlcCwKLSAgICBPTVhfVTMyIGlSZWZTdGVwMCwKLSAgICBPTVhfVTMyIGlSZWZTdGVwMSwKLSAgICBPTVhfVTMyICpwRHN0U0FELAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfOHggICAoNi4zLjUuNC4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKLSAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDh4MTYsIDh4OCwgb3IgOHg0IGJsb2Nrcy4gIAotICogUm91bmRpbmcgaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAotICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKLSAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl84eCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMSwKLSAgICBPTVhfVTMyIGlTcmNTdGVwLAotICAgIE9NWF9VMzIgaVJlZlN0ZXAwLAotICAgIE9NWF9VMzIgaVJlZlN0ZXAxLAotICAgIE9NWF9VMzIgKnBEc3RTQUQsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl8xNnggICAoNi4zLjUuNC40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKLSAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDE2eDE2IG9yIDE2eDggYmxvY2tzLiAgCi0gKiBSb3VuZGluZyBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgCi0gKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2IAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYuIAotICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKLSAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCi0gKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzE2eCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjAsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMSwKLSAgICBPTVhfVTMyIGlTcmNTdGVwLAotICAgIE9NWF9VMzIgaVJlZlN0ZXAwLAotICAgIE9NWF9VMzIgaVJlZlN0ZXAxLAotICAgIE9NWF9VMzIgKnBEc3RTQUQsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FURF80eDQgICAoNi4zLjUuNC41KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBzdW0gb2YgYWJzb2x1dGUgdHJhbnNmb3JtIGRpZmZlcmVuY2VzIChTQVREKSAKLSAqIGZvciBhIDR4NCBibG9jayBieSBhcHBseWluZyBhIEhhZGFtYXJkIHRyYW5zZm9ybSB0byB0aGUgZGlmZmVyZW5jZSBibG9jayAKLSAqIGFuZCB0aGVuIGNhbGN1bGF0aW5nIHRoZSBzdW0gb2YgYWJzb2x1dGUgY29lZmZpY2llbnQgdmFsdWVzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkgCi0gKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgcFNyY1JlZiAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeSAKLSAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIHJlc3VsdGluZyBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY09yZywgcFNyY1JlZiwgb3IgcERzdFNBRCBlaXRoZXIgcFNyY09yZyAKLSAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVN0ZXBPcmcgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TQVREXzR4NCAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAotICAgIE9NWF9VMzIgaVN0ZXBPcmcsCi0gICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAotICAgIE9NWF9VMzIgaVN0ZXBSZWYsCi0gICAgT01YX1UzMiAqcERzdFNBRAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICAgKDYuMy41LjUuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdHdvIGhvcml6b250YWwgMS8yLXBlbCBwb3NpdGlvbnMgCi0gKiAoLTEvMiwwKSBhbmQgKDEvMiwgMCkgLSBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSBpbiAKLSAqICAgICAgICAgICAgdGhlIHJlY29uc3RydWN0aW9uIGZyYW1lIHBsYW5lLiAKLSAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAKLSAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXI7IG11c3QgYmUgYSAKLSAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgaVdpZHRoLiAKLSAqICAgaVdpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIDQsIDgsIG9yIDE2IAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0TGVmdCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIGxlZnQgLXBlbCBwb3NpdGlvbiAKLSAqICAgICAgICAgICAgKC0xLzIsIDApIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcERzdFJpZ2h0IC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgcmlnaHQgLXBlbCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gKDEvMiwgMCkgCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgICBwU3JjLCBwRHN0TGVmdCwgb3IgcERzdFJpZ2h0IAotICogICAgLSAgICBpV2lkdGggb3IgaUhlaWdodCBoYXZlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2IAotICogICAgLSAgICBpV2lkdGg9PTQgYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpV2lkdGg9PTggYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpV2lkdGg9PTE2IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgT01YX1UzMiBpU3JjU3RlcCwKLSAgICBPTVhfVTggKnBEc3RMZWZ0LAotICAgIE9NWF9VOCAqcERzdFJpZ2h0LAotICAgIE9NWF9VMzIgaURzdFN0ZXAsCi0gICAgT01YX1UzMiBpV2lkdGgsCi0gICAgT01YX1UzMiBpSGVpZ2h0Ci0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEgICAoNi4zLjUuNS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB0d28gdmVydGljYWwgMS8yLXBlbCBwb3NpdGlvbnMgLSAKLSAqICgwLCAtMS8yKSBhbmQgKDAsIDEvMikgLSBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgaW4gdGhlIAotICogICAgICAgICAgICByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lIAotICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuIAotICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIChpbnRlcnBvbGF0aW9uKSBidWZmZXI7IG11c3QgYmUgYSAKLSAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgaVdpZHRoLiAKLSAqICAgaVdpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFVwIC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgLXBlbCBwb3NpdGlvbiBhYm92ZSAKLSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZnVsbC1wZWwgcG9zaXRpb24gKDAsIC0xLzIpIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBEc3REb3duIC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgLXBlbCBwb3NpdGlvbiBiZWxvdyAKLSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZnVsbC1wZWwgcG9zaXRpb24gKDAsIDEvMikgCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICBwU3JjLCBwRHN0VXAsIG9yIHBEc3REb3duIAotICogICAgLSAgICBpV2lkdGggb3IgaUhlaWdodCBoYXZlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2IAotICogICAgLSAgICBpV2lkdGg9PTQgYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpV2lkdGg9PTggYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpV2lkdGg9PTE2IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSAoCi0gICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgIE9NWF9VMzIgaVNyY1N0ZXAsCi0gICAgT01YX1U4ICpwRHN0VXAsCi0gICAgT01YX1U4ICpwRHN0RG93biwKLSAgICBPTVhfVTMyIGlEc3RTdGVwLAotICAgIE9NWF9VMzIgaVdpZHRoLAotICAgIE9NWF9VMzIgaUhlaWdodAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggICAoNi4zLjUuNS4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byA0eDQsIDR4OCBibG9ja3MuICBUaGUgcmVzdWx0IAotICogaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwUHJlZDAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBQcmVkMSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDA7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDE7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2tzOyBtdXN0IGJlIGVpdGhlciA0IG9yIDguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICBwUHJlZDAsIHBQcmVkMSwgb3IgcERzdFByZWQgCi0gKiAgICAtICAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBpRHN0U3RlcCA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDggCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9BdmVyYWdlXzR4ICgKLSAgICBjb25zdCBPTVhfVTggKnBQcmVkMCwKLSAgICBjb25zdCBPTVhfVTggKnBQcmVkMSwKLSAgICBPTVhfVTMyIGlQcmVkU3RlcDAsCi0gICAgT01YX1UzMiBpUHJlZFN0ZXAxLAotICAgIE9NWF9VOCAqcERzdFByZWQsCi0gICAgT01YX1UzMiBpRHN0U3RlcCwKLSAgICBPTVhfVTMyIGlIZWlnaHQKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAgICg2LjMuNS42LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIDJ4MiBIYWRhbWFyZCB0cmFuc2Zvcm0gb2YgY2hyb21hIERDIGNvZWZmaWNpZW50cyAKLSAqIGFuZCB0aGVuIHF1YW50aXplcyB0aGUgY29lZmZpY2llbnRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgMngyIGFycmF5IG9mIGNocm9tYSBEQyBjb2VmZmljaWVudHMuICA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCi0gKiAgIGJJbnRyYSAtIEluZGljYXRlIHdoZXRoZXIgdGhpcyBpcyBhbiBJTlRSQSBibG9jay4gMS1JTlRSQSwgMC1JTlRFUiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdHJhbnNmb3JtZWQgYW5kIHF1YW50aXplZCBjb2VmZmljaWVudHMuICA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgIHBTcmNEc3QgCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMgKAotICAgIE9NWF9TMTYgKnBTcmNEc3QsCi0gICAgT01YX1UzMiBpUVAsCi0gICAgT01YX1U4IGJJbnRyYQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAgICg2LjMuNS42LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgNHg0IEhhZGFtYXJkIHRyYW5zZm9ybSBvZiBsdW1hIERDIGNvZWZmaWNpZW50cyAKLSAqIGFuZCB0aGVuIHF1YW50aXplcyB0aGUgY29lZmZpY2llbnRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgNHg0IGFycmF5IG9mIGx1bWEgREMgY29lZmZpY2llbnRzLiAgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdHJhbnNmb3JtZWQgYW5kIHF1YW50aXplZCBjb2VmZmljaWVudHMuICAxNi1ieXRlIAotICogICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QgCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gMTYtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAoCi0gICAgT01YX1MxNiAqcFNyY0RzdCwKLSAgICBPTVhfVTMyIGlRUAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDICAgKDYuMy41LjYuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSA0eDQgSGFkYW1hcmQgdHJhbnNmb3JtIGFuZCB0aGVuIGRlcXVhbnRpemVzIAotICogdGhlIGNvZWZmaWNpZW50cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIDR4NCBhcnJheSBvZiB0aGUgNHg0IEhhZGFtYXJkLXRyYW5zZm9ybWVkIGFuZCAKLSAqICAgICAgICAgICAgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDE2IGJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gaW52ZXJzZS10cmFuc2Zvcm1lZCBhbmQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgCi0gKiAgICAgICAgICAgIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgCi0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQyAoCi0gICAgY29uc3QgT01YX1MxNiAqcFNyYywKLSAgICBPTVhfUzE2ICpwRHN0LAotICAgIE9NWF9VMzIgaVFQCi0pOwotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQyAgICg2LjMuNS42LjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgMngyIEhhZGFtYXJkIHRyYW5zZm9ybSBhbmQgdGhlbiBkZXF1YW50aXplcyAKLSAqIHRoZSBjb2VmZmljaWVudHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSAyeDIgYXJyYXkgb2YgdGhlIDJ4MiBIYWRhbWFyZC10cmFuc2Zvcm1lZCBhbmQgCi0gKiAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudHMuICA4IGJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gaW52ZXJzZS10cmFuc2Zvcm1lZCBhbmQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgCi0gKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyAKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgKAotICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCi0gICAgT01YX1MxNiAqcERzdCwKLSAgICBPTVhfVTMyIGlRUAotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICAgKDYuMy41LjcuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSBhbiA0eDQgaW50ZWdlciB0cmFuc2Zvcm1hdGlvbiB0byBwcm9kdWNlIAotICogdGhlIGRpZmZlcmVuY2Ugc2lnbmFsIGFuZCB0aGVuIGFkZHMgdGhlIGRpZmZlcmVuY2UgdG8gdGhlIHByZWRpY3Rpb24gdG8gZ2V0IAotICogdGhlIHJlY29uc3RydWN0ZWQgc2lnbmFsLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjUHJlZCAtIFBvaW50ZXIgdG8gcHJlZGljdGlvbiBzaWduYWwuICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcERlcXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4gIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVNyY1ByZWRTdGVwIC0gU3RlcCBvZiB0aGUgcHJlZGljdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgaURzdFJlY29uU3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIHJlY29uc3RydWN0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIAotICogICAgICAgICAgICBtdWx0aXBsZSBvZiA0LiAKLSAqICAgYkFDIC0gSW5kaWNhdGUgd2hldGhlciB0aGVyZSBpcyBBQyBjb2VmZmljaWVudHMgaW4gdGhlIGNvZWZmaWNpZW50cyAKLSAqICAgICAgICAgICAgbWF0cml4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFJlY29uIC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiByZWNvbnN0cnVjdGlvbiBidWZmZXIuICA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgcFNyY1ByZWQsIHBEZXF1YW50Q29lZmYsIHBEc3RSZWNvbiAKLSAqICAgIC0gICAgcFNyY1ByZWQgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlTcmNQcmVkU3RlcCBvciBpRHN0UmVjb25TdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAotICogICAgLSAgICBwRGVxdWFudENvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICgKLSAgICBjb25zdCBPTVhfVTggKnBTcmNQcmVkLAotICAgIGNvbnN0IE9NWF9TMTYgKnBEZXF1YW50Q29lZmYsCi0gICAgT01YX1U4ICpwRHN0UmVjb24sCi0gICAgT01YX1UzMiBpU3JjUHJlZFN0ZXAsCi0gICAgT01YX1UzMiBpRHN0UmVjb25TdGVwLAotICAgIE9NWF9VOCBiQUMKLSk7Ci0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCAgICg2LjMuNS44LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHN1YnRyYWN0cyB0aGUgcHJlZGljdGlvbiBzaWduYWwgZnJvbSB0aGUgb3JpZ2luYWwgc2lnbmFsIHRvIAotICogcHJvZHVjZSB0aGUgZGlmZmVyZW5jZSBzaWduYWwgYW5kIHRoZW4gcGVyZm9ybXMgYSA0eDQgaW50ZWdlciB0cmFuc2Zvcm0gYW5kIAotICogcXVhbnRpemF0aW9uLiBUaGUgcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cyBhcmUgc3RvcmVkIGFzIAotICogcERzdFF1YW50Q29lZmYuIFRoaXMgZnVuY3Rpb24gY2FuIGFsc28gb3V0cHV0IGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cyBvciAKLSAqIHVucXVhbnRpemVkIERDIGNvZWZmaWNpZW50cyBvcHRpb25hbGx5IGJ5IHNldHRpbmcgdGhlIHBvaW50ZXJzIAotICogcERzdERlUXVhbnRDb2VmZiwgcERDQ29lZmYuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIG9yaWdpbmFsIHNpZ25hbC4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBTcmNQcmVkIC0gUG9pbnRlciB0byBwcmVkaWN0aW9uIHNpZ25hbC4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlTcmNPcmdTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgc2lnbmFsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAotICogICAgICAgICAgICA0LiAKLSAqICAgaVNyY1ByZWRTdGVwIC0gU3RlcCBvZiB0aGUgcHJlZGljdGlvbiBzaWduYWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgCi0gKiAgICAgICAgICAgIG9mIDQuIAotICogICBwTnVtQ29lZmYgLU51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgYWZ0ZXIgcXVhbnRpemF0aW9uLiBJZiB0aGlzIAotICogICAgICAgICAgICBwYXJhbWV0ZXIgaXMgbm90IHJlcXVpcmVkLCBpdCBpcyBzZXQgdG8gTlVMTC4gCi0gKiAgIG5UaHJlc2hTQUQgLSBaZXJvLWJsb2NrIGVhcmx5IGRldGVjdGlvbiB0aHJlc2hvbGQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIAotICogICAgICAgICAgICBub3QgcmVxdWlyZWQsIGl0IGlzIHNldCB0byAwLiAKLSAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKLSAqICAgYkludHJhIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhbiBJTlRSQSBibG9jaywgZWl0aGVyIDEtSU5UUkEgb3IgCi0gKiAgICAgICAgICAgIDAtSU5URVIgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RRdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4gIAotICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcERzdERlUXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIGRlcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cyAKLSAqICAgICAgICAgICAgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IGVxdWFsIHRvIE5VTEwuICA4LWJ5dGUgYWxpZ25tZW50IAotICogICAgICAgICAgICByZXF1aXJlZC4gCi0gKiAgIHBEQ0NvZWZmIC0gUG9pbnRlciB0byB0aGUgdW5xdWFudGl6ZWQgREMgY29lZmZpY2llbnQgaWYgdGhpcyBwYXJhbWV0ZXIgCi0gKiAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byBOVUxMLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICBwU3JjT3JnLCBwU3JjUHJlZCwgcE51bUNvZWZmLCBwRHN0UXVhbnRDb2VmZiwgCi0gKiAgICAgICAgICAgIHBEc3REZVF1YW50Q29lZmYsIHBEQ0NvZWZmIAotICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBwU3JjUHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVNyY09yZ1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgaVNyY1ByZWRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIHBEc3RRdWFudENvZWZmIG9yIHBEc3REZVF1YW50Q29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKLSAgICBjb25zdCBPTVhfVTggKnBTcmNQcmVkLAotICAgIE9NWF9VMzIgaVNyY09yZ1N0ZXAsCi0gICAgT01YX1UzMiBpU3JjUHJlZFN0ZXAsCi0gICAgT01YX1MxNiAqcERzdFF1YW50Q29lZmYsCi0gICAgT01YX1MxNiAqcERzdERlUXVhbnRDb2VmZiwKLSAgICBPTVhfUzE2ICpwRENDb2VmZiwKLSAgICBPTVhfUzggKnBOdW1Db2VmZiwKLSAgICBPTVhfVTMyIG5UaHJlc2hTQUQsCi0gICAgT01YX1UzMiBpUVAsCi0gICAgT01YX1U4IGJJbnRyYQotKTsKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0dldFZMQ0luZm8gICAoNi4zLjUuOS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBleHRyYWN0cyBydW4tbGVuZ3RoIGVuY29kaW5nIChSTEUpIGluZm9ybWF0aW9uIGZyb20gdGhlIAotICogY29lZmZpY2llbnQgbWF0cml4LiAgVGhlIHJlc3VsdHMgYXJlIHJldHVybmVkIGluIGFuIE9NWFZDTTRQMTBWTENJbmZvIAotICogc3RydWN0dXJlLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjQ29lZmYgLSBwb2ludGVyIHRvIHRoZSB0cmFuc2Zvcm0gY29lZmZpY2llbnQgbWF0cml4LiAgOC1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwU2Nhbk1hdHJpeCAtIHBvaW50ZXIgdG8gdGhlIHNjYW4gb3JkZXIgZGVmaW5pdGlvbiBtYXRyaXguICBGb3IgYSBsdW1hIAotICogICAgICAgICAgICBibG9jayB0aGUgc2NhbiBtYXRyaXggc2hvdWxkIGZvbGxvdyBbSVNPMTQ0OTYtMTBdIHNlY3Rpb24gOC41LjQsIAotICogICAgICAgICAgICBhbmQgc2hvdWxkIGNvbnRhaW4gdGhlIHZhbHVlcyAwLCAxLCA0LCA4LCA1LCAyLCAzLCA2LCA5LCAxMiwgMTMsIAotICogICAgICAgICAgICAxMCwgNywgMTEsIDE0LCAxNS4gIEZvciBhIGNocm9tYSBibG9jaywgdGhlIHNjYW4gbWF0cml4IHNob3VsZCAKLSAqICAgICAgICAgICAgY29udGFpbiB0aGUgdmFsdWVzIDAsIDEsIDIsIDMuIAotICogICBiQUMgLSBpbmRpY2F0ZXMgcHJlc2VuY2Ugb2YgYSBEQyBjb2VmZmljaWVudDsgMCA9IERDIGNvZWZmaWNpZW50IAotICogICAgICAgICAgICBwcmVzZW50LCAxPSBEQyBjb2VmZmljaWVudCBhYnNlbnQuIAotICogICBNYXhOdW1Db2VmIC0gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGNvbnRhaW5lZCBpbiB0aGUgCi0gKiAgICAgICAgICAgIHRyYW5zZm9ybSBjb2VmZmljaWVudCBtYXRyaXgsIHBTcmNDb2VmZi4gVGhlIHZhbHVlIHNob3VsZCBiZSAxNiAKLSAqICAgICAgICAgICAgZm9yIGJsb2NrcyBvZiB0eXBlIExVTUFEQywgTFVNQUFDLCBMVU1BTEVWRUwsIGFuZCBDSFJPTUFBQy4gVGhlIAotICogICAgICAgICAgICB2YWx1ZSBzaG91bGQgYmUgNCBmb3IgYmxvY2tzIG9mIHR5cGUgQ0hST01BREMuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0VkxDSW5mbyAtIHBvaW50ZXIgdG8gc3RydWN0dXJlIHRoYXQgc3RvcmVzIGluZm9ybWF0aW9uIGZvciAKLSAqICAgICAgICAgICAgcnVuLWxlbmd0aCBjb2RpbmcuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgIHBTcmNDb2VmZiwgcFNjYW5NYXRyaXgsIHBEc3RWTENJbmZvIAotICogICAgLSAgICBwU3JjQ29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfR2V0VkxDSW5mbyAoCi0gICAgY29uc3QgT01YX1MxNiAqcFNyY0NvZWZmLAotICAgIGNvbnN0IE9NWF9VOCAqcFNjYW5NYXRyaXgsCi0gICAgT01YX1U4IGJBQywKLSAgICBPTVhfVTMyIE1heE51bUNvZWYsCi0gICAgT01YVkNNNFAxMFZMQ0luZm8qcERzdFZMQ0luZm8KLSk7Ci0KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyoqIGVuZCBvZiAjZGVmaW5lIF9PTVhWQ19IXyAqLwotCi0vKiogRU9GICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvYXJtVkNDT01NX0F2ZXJhZ2UuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvYXJtVkNDT01NX0F2ZXJhZ2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdiMzdiZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL2FybVZDQ09NTV9BdmVyYWdlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNDT01NX0F2ZXJhZ2UuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIEF2ZXJhZ2Ugb2YgdHdvIGJsb2NrcyBpZiBzaXplIGlXaWR0aCBYIGlIZWlnaHQKLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNDT01NX0F2ZXJhZ2UKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gYmxvY2tzIGFuZCBzdG9yZXMgdGhlIHJlc3VsdC4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqCVtpbl0JcFByZWQwCQkJUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwCi0gKglbaW5dCXBQcmVkMQkJCVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMQotICoJW2luXQlpUHJlZFN0ZXAwCSAgICBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwCi0gKglbaW5dCWlQcmVkU3RlcDEJICAgIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEKLSAqCVtpbl0JaURzdFN0ZXAgCQlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLSAqCVtpbl0JaVdpZHRoCQkJV2lkdGggb2YgdGhlIGJsb2NrcwotICoJW2luXQlpSGVpZ2h0CQkJSGVpZ2h0IG9mIHRoZSBibG9ja3MKLSAqCVtvdXRdCXBEc3RQcmVkCQlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi0gT01YUmVzdWx0IGFybVZDQ09NTV9BdmVyYWdlICgKLQkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMCwKLQkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMSwJCi0JIE9NWF9VMzIJCWlQcmVkU3RlcDAsCi0JIE9NWF9VMzIJCWlQcmVkU3RlcDEsCi0JIE9NWF9VOCoJCXBEc3RQcmVkLAotCSBPTVhfVTMyCQlpRHN0U3RlcCwgCi0JIE9NWF9VMzIJCWlXaWR0aCwKLQkgT01YX1UzMgkJaUhlaWdodAotKQotewotICAgIE9NWF9VMzIgICAgIHgsIHk7Ci0KLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwUHJlZDAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocFByZWQxID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3RQcmVkID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgZm9yICh5ID0gMDsgeSA8IGlIZWlnaHQ7IHkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCBpV2lkdGg7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgcERzdFByZWQgW3kgKiBpRHN0U3RlcCArIHhdID0gCi0gICAgICAgICAgICAgICAgKE9NWF9VOCkoKChPTVhfVTMyKXBQcmVkMCBbeSAqIGlQcmVkU3RlcDAgKyB4XSArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmVkMSBbeSAqIGlQcmVkU3RlcDEgKyB4XSArIDEpID4+IDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL2FybVZDQ09NTV9TQUQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvYXJtVkNDT01NX1NBRC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWI5NmRjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvYXJtVkNDT01NX1NBRC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDQ09NTV9TQUQuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBmb3IgTnhNIGJsb2NrcwotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNDT01NX1NBRAotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGUgdGhlIFNBRCBmb3IgTnhNIGJsb2Nrcy4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFtpbl0JCXBTcmNPcmcJCVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrCi0gKiBbaW5dCQlpU3RlcE9yZwlTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIKLSAqIFtpbl0JCXBTcmNSZWYJCVBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jawotICogW2luXQkJaVN0ZXBSZWYJU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlcgotICogW2luXQkJaUhlaWdodAkJSGVpZ2h0IG9mIHRoZSBibG9jawotICogW2luXQkJaVdpZHRoCQlXaWR0aCBvZiB0aGUgYmxvY2sKLSAqIFtvdXRdCXBEc3RTQUQJCVBvaW50ZXIgb2YgcmVzdWx0IFNBRAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLU9NWFJlc3VsdCBhcm1WQ0NPTU1fU0FEKAkKLQljb25zdCBPTVhfVTgqIAlwU3JjT3JnLAotCU9NWF9VMzIgCWlTdGVwT3JnLAotCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYsCi0JT01YX1UzMiAJaVN0ZXBSZWYsCi0JT01YX1MzMioJcERzdFNBRCwKLQlPTVhfVTMyCQlpSGVpZ2h0LAotCU9NWF9VMzIJCWlXaWR0aAotKQotewotICAgIE9NWF9JTlQgICAgIHgsIHk7Ci0gICAgCi0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY09yZyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgCi0gICAgKnBEc3RTQUQgPSAwOwotICAgIGZvciAoeSA9IDA7IHkgPCBpSGVpZ2h0OyB5KyspCi0gICAgewotICAgICAgICBmb3IgKHggPSAwOyB4IDwgaVdpZHRoOyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwRHN0U0FEICs9IGFybUFicyhwU3JjT3JnIFsoeSAqIGlTdGVwT3JnKSArIHhdIC0gCi0gICAgICAgICAgICAgICAgICAgICAgIHBTcmNSZWYgWyh5ICogaVN0ZXBSZWYpICsgeF0pOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQXZlcmFnZV8xNnguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0F2ZXJhZ2VfMTZ4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NWJjYTguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQXZlcmFnZV8xNnguYworKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNDT01NX0F2ZXJhZ2VfMTZ4LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBBdmVyYWdlIG9mIHR3byAxNngxNiBvciAxNng4IGJsb2NrcwotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICAgKDYuMS4zLjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gMTZ4MTYgb3IgMTZ4OCBibG9ja3MuICBUaGUgCi0gKiByZXN1bHQgaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAgVGhlIGJsb2NrIGF2ZXJhZ2UgZnVuY3Rpb24gY2FuIAotICogYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGhhbGYtcGl4ZWwgaW50ZXJwb2xhdGlvbiB0byBvYnRhaW4gcXVhcnRlciAKLSAqIHBpeGVsIG1vdGlvbiBlc3RpbWF0ZXMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMTBdLCBzdWJjbGF1c2UgOC40LjIuMi4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwUHJlZDAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBQcmVkMSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2tzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gMTYtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwUHJlZDAsIHBQcmVkMSwgb3IgCi0gKiAgICAgICAgICAgICAgcERzdFByZWQuIAotICogICAgLSAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICAtICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgLSAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIC0gICBpRHN0U3RlcCA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgIC0gICBpSGVpZ2h0IGlzIG5vdCA4IG9yIDE2LiAKLSAqCi0gKi8KLSBPTVhSZXN1bHQgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICgKLQkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMCwKLQkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMSwJCi0JIE9NWF9VMzIJCWlQcmVkU3RlcDAsCi0JIE9NWF9VMzIJCWlQcmVkU3RlcDEsCi0JIE9NWF9VOCoJCXBEc3RQcmVkLAotCSBPTVhfVTMyCQlpRHN0U3RlcCwgCi0JIE9NWF9VMzIJCWlIZWlnaHQKLSkKLXsKLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwUHJlZDAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocFByZWQxID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3RQcmVkID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpSGVpZ2h0ICE9IDgpICYmIChpSGVpZ2h0ICE9IDE2KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwRHN0UHJlZCksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpUHJlZFN0ZXAwID09IDApIHx8IChpUHJlZFN0ZXAwICYgMTUpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaVByZWRTdGVwMSA9PSAwKSB8fCAoaVByZWRTdGVwMSAmIDE1KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlEc3RTdGVwID09IDApIHx8IChpRHN0U3RlcCAmIDE1KSwgT01YX1N0c19CYWRBcmdFcnIpCi0KLSAgICByZXR1cm4gYXJtVkNDT01NX0F2ZXJhZ2UgCi0gICAgICAgIChwUHJlZDAsIHBQcmVkMSwgaVByZWRTdGVwMCwgaVByZWRTdGVwMSwgcERzdFByZWQsIGlEc3RTdGVwLCAxNiwgaUhlaWdodCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9BdmVyYWdlXzh4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9BdmVyYWdlXzh4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMTRmNDMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQXZlcmFnZV84eC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fQXZlcmFnZV84eC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgQXZlcmFnZSBvZiB0d28gOHg0IG9yIDh4OCBvciA4eDE2IGJsb2NrcwotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0F2ZXJhZ2VfOHggICAoNi4xLjMuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byA4eDQsIDh4OCwgb3IgOHgxNiBibG9ja3MuICBUaGUgCi0gKiByZXN1bHQgaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAgVGhlIGJsb2NrIGF2ZXJhZ2UgZnVuY3Rpb24gY2FuIAotICogYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGhhbGYtcGl4ZWwgaW50ZXJwb2xhdGlvbiB0byBvYnRhaW4gcXVhcnRlciAKLSAqIHBpeGVsIG1vdGlvbiBlc3RpbWF0ZXMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMTBdLCBzdWJjbGF1c2UgOC40LjIuMi4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwUHJlZDAgICAgIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwUHJlZDEgICAgIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpUHJlZFN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlEc3RTdGVwICAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIAotICogICBpSGVpZ2h0ICAgIC0gSGVpZ2h0IG9mIHRoZSBibG9ja3MgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RQcmVkIC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiA4LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFByZWQwLCBwUHJlZDEsIG9yIAotICogICAgICAgICAgICAgIHBEc3RQcmVkLiAKLSAqICAgIC0gICBwRHN0UHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICAgLSAgIGlQcmVkU3RlcDAgPD0gMCBvciBpUHJlZFN0ZXAwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgIGlEc3RTdGVwICAgPD0gMCBvciBpRHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICBpSGVpZ2h0IGlzIG5vdCA0LCA4LCBvciAxNi4gCi0gKgotICovCi0gT01YUmVzdWx0IG9teFZDQ09NTV9BdmVyYWdlXzh4ICgJCi0JIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDAsCi0JIGNvbnN0IE9NWF9VOCogCSAgICBwUHJlZDEsCQotICAgICBPTVhfVTMyCQlpUHJlZFN0ZXAwLAotICAgICBPTVhfVTMyCQlpUHJlZFN0ZXAxLAotCSBPTVhfVTgqCQlwRHN0UHJlZCwKLSAgICAgT01YX1UzMgkJaURzdFN0ZXAsIAotCSBPTVhfVTMyCQlpSGVpZ2h0Ci0pCi17Ci0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFByZWQwID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBQcmVkMSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0UHJlZCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaVByZWRTdGVwMCA9PSAwKSB8fCAoaVByZWRTdGVwMCAmIDcpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaVByZWRTdGVwMSA9PSAwKSB8fCAoaVByZWRTdGVwMSAmIDcpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaURzdFN0ZXAgPT0gMCkgfHwgKGlEc3RTdGVwICYgNyksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpSGVpZ2h0ICE9IDQpICYmIChpSGVpZ2h0ICE9IDgpICYmIChpSGVpZ2h0ICE9IDE2KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3RQcmVkKSwgT01YX1N0c19CYWRBcmdFcnIpCi0KLSAgICByZXR1cm4gYXJtVkNDT01NX0F2ZXJhZ2UgCi0gICAgICAgIChwUHJlZDAsIHBQcmVkMSwgaVByZWRTdGVwMCwgaVByZWRTdGVwMSwgcERzdFByZWQsIGlEc3RTdGVwLCA4LCBpSGVpZ2h0KTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFmNTI0MC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2suYworKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jay5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGUgY29tcHV0aW5nIHRoZSBlcnJvciBmb3IgYSBNQiBvZiBzaXplIDh4OAotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrICAgKDYuMS40LjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIHRoZSB0ZXh0dXJlIGVycm9yIG9mIHRoZSBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBwbGFuZS4gVGhpcyBzaG91bGQgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgc3JjU3RlcCAtIHN0ZXAgb2YgdGhlIHNvdXJjZSBwbGFuZSAKLSAqICAgcFNyY1JlZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBidWZmZXIsIGFuIDh4OCBibG9jay4gVGhpcyBzaG91bGQgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgYW4gOHg4IGJsb2NrLiBUaGlzIHNob3VsZCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyYywgcFNyY1JlZiwgcERzdC4gCi0gKiAgICAtICAgIHBTcmMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgU3JjU3RlcCA8PSAwIG9yIHNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQgCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrKAotICAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgIE9NWF9JTlQgc3JjU3RlcCwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAotICAgICBPTVhfUzE2ICogcERzdAotKQotewotCi0gICAgT01YX0lOVCAgICAgeCwgeSwgY291bnQ7Ci0KLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocFNyY1JlZiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoc3JjU3RlcCA8PSAwKSB8fCAoc3JjU3RlcCAmIDcpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICAvKiBDYWxjdWxhdGUgdGhlIGVycm9yIGJsb2NrICovCi0gICAgZm9yICh5ID0gMCwgY291bnQgPSAwOwotICAgICAgICAgeSA8IDg7Ci0gICAgICAgICB5KyssIHBTcmMgKz0gc3JjU3RlcCkKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyssIGNvdW50KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEc3RbY291bnRdID0gcFNyY1t4XSAtIHBTcmNSZWZbY291bnRdOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci0KLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdmNDhjOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FELmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FELmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZSBjb21wdXRpbmcgdGhlIGVycm9yIGZvciBhIE1CIG9mIHNpemUgOHg4Ci0gKiAKLSAqLwotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9ja19TQUQgICAoNi4xLjQuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgdGV4dHVyZSBlcnJvciBvZiB0aGUgYmxvY2s7IGFsc28gcmV0dXJucyBTQUQuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgc3JjU3RlcCAtIHN0ZXAgb2YgdGhlIHNvdXJjZSBwbGFuZSAKLSAqICAgcFNyY1JlZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBidWZmZXIsIGFuIDh4OCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCBhbiA4eDggYmxvY2s7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIFN1bSBvZiBBYnNvbHV0ZSBEaWZmZXJlbmNlcyAoU0FEKSB2YWx1ZSAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYsIHBEc3QgYW5kIHBEc3RTQUQuIAotICogICAgLSAgICBwU3JjIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIFNyY1N0ZXAgPD0gMCBvciBzcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEKAotICAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgIE9NWF9JTlQgc3JjU3RlcCwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAotICAgICBPTVhfUzE2ICogcERzdCwKLSAgICAgT01YX0lOVCAqcERzdFNBRAotKQotewotCi0gICAgT01YX0lOVCAgICAgeCwgeSwgY291bnQ7Ci0KLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0U0FEID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocFNyY1JlZiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoc3JjU3RlcCA8PSAwKSB8fCAoc3JjU3RlcCAmIDcpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICAvKiBDYWxjdWxhdGUgdGhlIGVycm9yIGJsb2NrICovCi0gICAgZm9yICh5ID0gMCwgY291bnQgPSAwLCAqcERzdFNBRCA9IDA7Ci0gICAgICAgICB5IDwgODsKLSAgICAgICAgIHkrKywgcFNyYyArPSBzcmNTdGVwKQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKywgY291bnQrKykKLSAgICAgICAgewotICAgICAgICAgICAgcERzdFtjb3VudF0gPSBwU3JjW3hdIC0gcFNyY1JlZltjb3VudF07Ci0gICAgICAgICAgICAqcERzdFNBRCArPSBhcm1BYnMocERzdFtjb3VudF0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci0KLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNDY3YTQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNDT01NX0NvcHkxNngxNi5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIE1QRUc0IDE2eDE2IENvcHkgbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db3B5MTZ4MTYgICAoNi4xLjMuMy4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29waWVzIHRoZSByZWZlcmVuY2UgMTZ4MTYgbWFjcm9ibG9jayB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIG1hY3JvYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBzdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIGZyYW1lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IGFuZCBtdXN0IGJlIGxhcmdlciAKLSAqICAgICAgICAgICAgdGhhbiBvciBlcXVhbCB0byAxNi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBtYWNyb2Jsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSAKLSAqICAgICAgICAgICAgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgICBib3VuZGFyeTogcFNyYywgcERzdCAKLSAqICAgIC0gICAgc3RlcCA8MTYgb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fQ29weTE2eDE2KAotCQljb25zdCBPTVhfVTggKnBTcmMsIAotCQlPTVhfVTggKnBEc3QsIAotCQlPTVhfSU5UIHN0ZXApCi0gewotICAgIC8qIERlZmluaXRpb25zIGFuZCBJbml0aWFsaXphdGlvbnMqLwotCi0gICAgT01YX0lOVCBjb3VudCxpbmRleCwgeCwgeTsKLSAgICAKLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCgoc3RlcCA8IDE2KSB8fCAoc3RlcCAlIDE2KSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAKLSAgICAKLSAgICAvKiBDb3B5aW5nIHRoZSByZWYgMTZ4MTYgYmxrIHRvIHRoZSBjdXJyIGJsayAqLwotICAgIGZvciAoeSA9IDAsIGNvdW50ID0gMCwgaW5kZXggPSAwOyB5IDwgMTY7IHkrKywgY291bnQgPSBjb3VudCArIHN0ZXAgLSAxNikKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrLCBjb3VudCsrLCBpbmRleCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0W2luZGV4XSA9IHBTcmNbY291bnRdOwotICAgICAgICB9ICAgICAgIAotICAgIH0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLSB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNTk2OWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDQ09NTV9Db3B5OHg4LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogTVBFRzQgOHg4IENvcHkgbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db3B5OHg4ICAgKDYuMS4zLjMuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDh4OCBibG9jayB0byB0aGUgY3VycmVudCBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgZnJhbWUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCBhbmQgbXVzdCBiZSBsYXJnZXIgdGhhbiAKLSAqICAgICAgICAgICAgb3IgZXF1YWwgdG8gOC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QgCi0gKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgICAgYm91bmRhcnk6IHBTcmMsIHBEc3QgCi0gKiAgICAtICAgIHN0ZXAgPDggb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDQ09NTV9Db3B5OHg4KAotCQljb25zdCBPTVhfVTggKnBTcmMsIAotCQlPTVhfVTggKnBEc3QsIAotCQlPTVhfSU5UIHN0ZXApCi0gewotICAgIC8qIERlZmluaXRpb25zIGFuZCBJbml0aWFsaXphdGlvbnMqLwotCi0gICAgT01YX0lOVCBjb3VudCxpbmRleCwgeCwgeTsKLSAgICAKLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoKHN0ZXAgPCA4KSB8fCAoc3RlcCAlIDgpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIAotICAgIAotICAgIC8qIENvcHlpbmcgdGhlIHJlZiA4eDggYmxrIHRvIHRoZSBjdXJyIGJsayAqLwotICAgIGZvciAoeSA9IDAsIGNvdW50ID0gMCwgaW5kZXggPSAwOyB5IDwgODsgeSsrLCBjb3VudCA9IGNvdW50ICsgc3RlcCAtIDgpCi0gICAgewotICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrLCBjb3VudCsrLCBpbmRleCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0W2luZGV4XSA9IHBTcmNbY291bnRdOwotICAgICAgICB9ICAgICAgIAotICAgIH0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLSB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9FeHBhbmRGcmFtZV9JLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNzlmZDAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBFeHBhbmQgRnJhbWUgYm91bmRhcnkgcGl4ZWxzIGludG8gUGxhbmUKLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSAgICg2LjEuMy4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGV4cGFuZHMgYSByZWNvbnN0cnVjdGVkIGZyYW1lIGluLXBsYWNlLiAgVGhlIHVuZXhwYW5kZWQgCi0gKiBzb3VyY2UgZnJhbWUgc2hvdWxkIGJlIHN0b3JlZCBpbiBhIHBsYW5lIGJ1ZmZlciB3aXRoIHN1ZmZpY2llbnQgc3BhY2UgCi0gKiBwcmUtYWxsb2NhdGVkIGZvciBlZGdlIGV4cGFuc2lvbiwgYW5kIHRoZSBpbnB1dCBmcmFtZSBzaG91bGQgYmUgbG9jYXRlZCBpbiAKLSAqIHRoZSBwbGFuZSBidWZmZXIgY2VudGVyLiAgVGhpcyBmdW5jdGlvbiBleGVjdXRlcyB0aGUgcGl4ZWwgZXhwYW5zaW9uIGJ5IAotICogcmVwbGljYXRpbmcgc291cmNlIGZyYW1lIGVkZ2UgcGl4ZWwgaW50ZW5zaXRpZXMgaW4gdGhlIGVtcHR5IHBpeGVsIAotICogbG9jYXRpb25zIChleHBhbnNpb24gcmVnaW9uKSBiZXR3ZWVuIHRoZSBzb3VyY2UgZnJhbWUgZWRnZSBhbmQgdGhlIHBsYW5lIAotICogYnVmZmVyIGVkZ2UuICBUaGUgd2lkdGgvaGVpZ2h0IG9mIHRoZSBleHBhbnNpb24gcmVnaW9ucyBvbiB0aGUgCi0gKiBob3Jpem9udGFsL3ZlcnRpY2FsIGVkZ2VzIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHBhcmFtZXRlciBpRXhwYW5kUGVscy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdFBsYW5lIC0gcG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmcmFtZSB0byBiZSAKLSAqICAgICAgICAgICAgZXhwYW5kZWQ7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBpRnJhbWVXaWR0aCAtIGZyYW1lIHdpZHRoOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGlGcmFtZUhlaWdodCAtZnJhbWUgaGVpZ2h0OyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGlFeHBhbmRQZWxzIC0gbnVtYmVyIG9mIHBpeGVscyB0byBiZSBleHBhbmRlZCBpbiB0aGUgaG9yaXpvbnRhbCBhbmQgCi0gKiAgICAgICAgICAgIHZlcnRpY2FsIGRpcmVjdGlvbnM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgaVBsYW5lU3RlcCAtIGRpc3RhbmNlLCBpbiBieXRlcywgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgCi0gKiAgICAgICAgICAgIGluIHRoZSBwbGFuZSBidWZmZXI7IG11c3QgYmUgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gCi0gKiAgICAgICAgICAgIChpRnJhbWVXaWR0aCArIDIgKiBpRXhwYW5kUGVscykuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0UGxhbmUgLVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZnJhbWUgKE5PVCB0aGUgCi0gKiAgICAgICAgICAgIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgcGxhbmUpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgICBwU3JjRHN0UGxhbmUgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBTcmNEc3RQbGFuZSBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICAgLSAgICBvbmUgb2YgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGlzIGVpdGhlciBlcXVhbCB0byB6ZXJvIG9yIGlzIGEgCi0gKiAgICAgICAgICAgICAgbm9uLW11bHRpcGxlIG9mIDg6IGlGcmFtZUhlaWdodCwgaUZyYW1lV2lkdGgsIGlQbGFuZVN0ZXAsIG9yIAotICogICAgICAgICAgICAgIGlFeHBhbmRQZWxzLiAKLSAqICAgIC0gICAgaVBsYW5lU3RlcCA8IChpRnJhbWVXaWR0aCArIDIgKiBpRXhwYW5kUGVscykuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JKAotCU9NWF9VOCoJcFNyY0RzdFBsYW5lLCAKLQlPTVhfVTMyCWlGcmFtZVdpZHRoLCAKLQlPTVhfVTMyCWlGcmFtZUhlaWdodCwgCi0JT01YX1UzMglpRXhwYW5kUGVscywgCi0JT01YX1UzMglpUGxhbmVTdGVwCi0pCi17Ci0gICAgT01YX0lOVCAgICAgeCwgeTsKLSAgICBPTVhfVTgqICAgICBwTGVmdDsKLSAgICBPTVhfVTgqICAgICBwUmlnaHQ7Ci0gICAgT01YX1U4KiAgICAgcFRvcDsKLSAgICBPTVhfVTgqICAgICBwQm90dG9tOwotCi0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdFBsYW5lID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjRHN0UGxhbmUpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihpRnJhbWVXaWR0aCA9PSAwIHx8IGlGcmFtZVdpZHRoICYgNywgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoaUZyYW1lSGVpZ2h0PT0gMCB8fCBpRnJhbWVIZWlnaHQgJiA3LCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihpRXhwYW5kUGVscyA9PSAwIHx8IGlFeHBhbmRQZWxzICYgNywgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoaVBsYW5lU3RlcCA9PSAwIHx8IGlQbGFuZVN0ZXAgJiA3LCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihpUGxhbmVTdGVwIDwgKGlGcmFtZVdpZHRoICsgMiAqIGlFeHBhbmRQZWxzKSwgCi0gICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpCi0KLSAgICAvKiBUb3AgYW5kIEJvdHRvbSAqLwotICAgIHBUb3AgPSBwU3JjRHN0UGxhbmUgLSAoaUV4cGFuZFBlbHMgKiBpUGxhbmVTdGVwKTsKLSAgICBwQm90dG9tID0gcFNyY0RzdFBsYW5lICsgKGlGcmFtZUhlaWdodCAqIGlQbGFuZVN0ZXApOwotCi0gICAgZm9yICh5ID0gMDsgeSA8IChPTVhfSU5UKWlFeHBhbmRQZWxzOyB5KyspCi0gICAgewotICAgICAgICBmb3IgKHggPSAwOyB4IDwgKE9NWF9JTlQpaUZyYW1lV2lkdGg7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgcFRvcCBbeSAqIGlQbGFuZVN0ZXAgKyB4XSA9IAotICAgICAgICAgICAgICAgIHBTcmNEc3RQbGFuZSBbeF07Ci0gICAgICAgICAgICBwQm90dG9tIFt5ICogaVBsYW5lU3RlcCArIHhdID0gCi0gICAgICAgICAgICAgICAgcFNyY0RzdFBsYW5lIFsoaUZyYW1lSGVpZ2h0IC0gMSkgKiBpUGxhbmVTdGVwICsgeF07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBMZWZ0LCBSaWdodCBhbmQgQ29ybmVycyAqLwotICAgIHBMZWZ0ID0gcFNyY0RzdFBsYW5lIC0gaUV4cGFuZFBlbHM7Ci0gICAgcFJpZ2h0ID0gcFNyY0RzdFBsYW5lICsgaUZyYW1lV2lkdGg7Ci0KLSAgICBmb3IgKHkgPSAtKE9NWF9JTlQpaUV4cGFuZFBlbHM7IHkgPCAoT01YX0lOVCkoaUZyYW1lSGVpZ2h0ICsgaUV4cGFuZFBlbHMpOyB5KyspCi0gICAgewotICAgICAgICBmb3IgKHggPSAwOyB4IDwgKE9NWF9JTlQpaUV4cGFuZFBlbHM7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgcExlZnQgW3kgKiBpUGxhbmVTdGVwICsgeF0gPSAKLSAgICAgICAgICAgICAgICBwU3JjRHN0UGxhbmUgW3kgKiBpUGxhbmVTdGVwICsgMF07Ci0gICAgICAgICAgICBwUmlnaHQgW3kgKiBpUGxhbmVTdGVwICsgeF0gPSAKLSAgICAgICAgICAgICAgICBwU3JjRHN0UGxhbmUgW3kgKiBpUGxhbmVTdGVwICsgKGlGcmFtZVdpZHRoIC0gMSldOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9MaW1pdE1WVG9SZWN0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9MaW1pdE1WVG9SZWN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYTkwOTMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fTGltaXRNVlRvUmVjdC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZSBmb3IgbGltaXRpbmcgdGhlIE1WCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDQ09NTV9MaW1pdE1WVG9SZWN0ICAgKDYuMS40LjEuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIExpbWl0cyB0aGUgbW90aW9uIHZlY3RvciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYmxvY2svbWFjcm9ibG9jayB0byAKLSAqIHByZXZlbnQgdGhlIG1vdGlvbiBjb21wZW5zYXRlZCBibG9jay9tYWNyb2Jsb2NrIGZyb20gbW92aW5nIG91dHNpZGUgYSAKLSAqIGJvdW5kaW5nIHJlY3RhbmdsZSBhcyBzaG93biBpbiBGaWd1cmUgNi0xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjTVYgLSBwb2ludGVyIHRvIHRoZSBtb3Rpb24gdmVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBibG9jayAKLSAqICAgICAgICAgICAgb3IgbWFjcm9ibG9jayAKLSAqICAgcFJlY3RWT1BSZWYgLSBwb2ludGVyIHRvIHRoZSBib3VuZGluZyByZWN0YW5nbGUgCi0gKiAgIFhjb29yZCwgWWNvb3JkICAtIGNvb3JkaW5hdGVzIG9mIHRoZSBjdXJyZW50IGJsb2NrIG9yIG1hY3JvYmxvY2sgCi0gKiAgIHNpemUgLSBzaXplIG9mIHRoZSBjdXJyZW50IGJsb2NrIG9yIG1hY3JvYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gOCBvciAKLSAqICAgICAgICAgICAgMTYuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBsaW1pdGVkIG1vdGlvbiB2ZWN0b3IgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjTVYsIHBEc3RNViwgb3IgcFJlY3RWT1BSZWYuIAotICogICAgLSAgICBzaXplIGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgOCBvciAxNi4gCi0gKiAgICAtICAgIHRoZSB3aWR0aCBvciBoZWlnaHQgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBpcyBsZXNzIHRoYW4gCi0gKiAgICAgICAgIHR3aWNlIHRoZSBibG9jayBzaXplLgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX0xpbWl0TVZUb1JlY3QoCi0gICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICogcFNyY01WLAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAotICAgICBjb25zdCBPTVhSZWN0ICogcFJlY3RWT1BSZWYsCi0gICAgIE9NWF9JTlQgWGNvb3JkLAotICAgICBPTVhfSU5UIFljb29yZCwKLSAgICAgT01YX0lOVCBzaXplCi0pCi17Ci0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY01WID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0TVYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBSZWN0Vk9QUmVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoc2l6ZSAhPSA4KSAmJiAoc2l6ZSAhPSAxNiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigocFJlY3RWT1BSZWYtPndpZHRoIDwgKDIqIHNpemUpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChwUmVjdFZPUFJlZi0+aGVpZ2h0IDwgKDIqIHNpemUpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIAotICAgIHBEc3RNVi0+ZHggPSBhcm1NaW4gKGFybU1heCAocFNyY01WLT5keCwgMipwUmVjdFZPUFJlZi0+eCAtIFhjb29yZCksCi0gICAgICAgICAgICAgICAgICAgICgyKnBSZWN0Vk9QUmVmLT54ICsgcFJlY3RWT1BSZWYtPndpZHRoIC0gWGNvb3JkIC0gc2l6ZSkpOwotICAgIHBEc3RNVi0+ZHkgPSBhcm1NaW4gKGFybU1heCAocFNyY01WLT5keSwgMipwUmVjdFZPUFJlZi0+eSAtIFljb29yZCksCi0gICAgICAgICAgICAgICAgICAgICgyKnBSZWN0Vk9QUmVmLT55ICsgcFJlY3RWT1BSZWYtPmhlaWdodCAtIFljb29yZCAtIHNpemUpKTsKLQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9TQURfMTZ4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9TQURfMTZ4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZGJiZDAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fU0FEXzE2eC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDQ09NTV9TQURfMTZ4LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBTQUQgZm9yIDE2eDE2IGFuZCAxNng4IGJsb2NrcwotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX1NBRF8xNnggICAoNi4xLjQuMS40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgZm9yIDE2eDE2IGFuZCAxNng4IGJsb2Nrcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlciAKLSAqICAgcFNyY1JlZiAgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCi0gKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKLSAqICAgaUhlaWdodCAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9yIG1vcmUgb2YgdGhlIAotICogICAgICAgICAgICAgIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY09yZywgcERzdFNBRCwgb3IgcFNyY1JlZiAKLSAqICAgIC0gICAgcFNyY09yZyBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgaVN0ZXBPcmcgIDw9IDAgb3IgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgCi0gKiAgICAtICAgIGlTdGVwUmVmIDw9IDAgb3IgaVN0ZXBSZWYgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IDggb3IgMTYgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNDT01NX1NBRF8xNngoCi0JCQljb25zdCBPTVhfVTgqIAlwU3JjT3JnLAotCQkJT01YX1UzMiAJaVN0ZXBPcmcsCi0JCQljb25zdCBPTVhfVTgqIAlwU3JjUmVmLAotCQkJT01YX1UzMiAJaVN0ZXBSZWYsCi0JCQlPTVhfUzMyKglwRHN0U0FELAotCQkJT01YX1UzMgkJaUhlaWdodAotKQotewotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmNPcmcgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0U0FEID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpSGVpZ2h0ICE9IDE2KSAmJiAoaUhlaWdodCAhPSA4KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwU3JjT3JnKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlTdGVwT3JnID09IDApIHx8IChpU3RlcE9yZyAmIDE1KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlTdGVwUmVmID09IDApIHx8IChpU3RlcFJlZiAmIDE1KSwgT01YX1N0c19CYWRBcmdFcnIpCi0KLSAgICByZXR1cm4gYXJtVkNDT01NX1NBRCAKLSAgICAgICAgKHBTcmNPcmcsIGlTdGVwT3JnLCBwU3JjUmVmLCBpU3RlcFJlZiwgcERzdFNBRCwgaUhlaWdodCwgMTYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fU0FEXzh4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9TQURfOHguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JmZDFlYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9TQURfOHguYworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fU0FEXzh4LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBTQUQgZm9yIDh4MTYsIDh4OCwgOHg0IGJsb2NrcwotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNDT01NX1NBRF84eCAgICg2LjEuNC4xLjUpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgOHgxNiwgOHg4LCA4eDQgYmxvY2tzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnICAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgCi0gKiAgICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlciAKLSAqICAgcFNyY1JlZiAgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCi0gKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKLSAqICAgaUhlaWdodCAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjT3JnLCBwRHN0U0FELCBvciBwU3JjUmVmIAotICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIGlTdGVwT3JnICA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCi0gKiAgICAtICAgIGlTdGVwUmVmIDw9IDAgb3IgaVN0ZXBSZWYgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgNCwgOCBvciAxNiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ0NPTU1fU0FEXzh4KAkKLQljb25zdCBPTVhfVTgqIAlwU3JjT3JnLAotCU9NWF9VMzIgCWlTdGVwT3JnLAotCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYsCi0JT01YX1UzMiAJaVN0ZXBSZWYsCi0JT01YX1MzMioJcERzdFNBRCwKLQlPTVhfVTMyCQlpSGVpZ2h0Ci0pCi17Ci0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY09yZyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gMTYpICYmIChpSGVpZ2h0ICE9IDgpICYmIChpSGVpZ2h0ICE9IDQpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY09yZyksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpU3RlcE9yZyA9PSAwKSB8fCAoaVN0ZXBPcmcgJiA3KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlTdGVwUmVmID09IDApIHx8IChpU3RlcFJlZiAmIDcpLCBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIHJldHVybiBhcm1WQ0NPTU1fU0FEIAotICAgICAgICAocFNyY09yZywgaVN0ZXBPcmcsIHBTcmNSZWYsIGlTdGVwUmVmLCBwRHN0U0FELCBpSGVpZ2h0LCA4KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcyNDFjYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogRmlsZTogICAgIGFybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogCi0gKiBIZWFkZXIgZmlsZSBmb3IgQVJNIGltcGxlbWVudGF0aW9uIG9mIE9wZW5NQVggVkNNNFAxMAotICogCi0gKi8KLSAKLSNpZm5kZWYgQVJNVkNNNFAxMF9DQVZMQ1RBQkxFU19ICi0jZGVmaW5lIEFSTVZDTTRQMTBfQ0FWTENUQUJMRVNfSAotICAKLS8qIENBVkxDIHRhYmxlcyAqLwotCi1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfQ0FWTENUcmFpbGluZ09uZXNbNjJdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX0NBVkxDVG90YWxDb2VmZls2Ml07Ci1leHRlcm4gY29uc3QgQVJNX1ZMQzMyICphcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc1s1XTsKLWV4dGVybiBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ0xldmVsUHJlZml4WzE3XTsKLWV4dGVybiBjb25zdCBBUk1fVkxDMzIgKmFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNbMTVdOwotZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiAqYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNbM107Ci1leHRlcm4gY29uc3QgQVJNX1ZMQzMyICphcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzWzddOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRhMzA3NC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAKLSAqIENBVkxDIHRhYmxlcyBmb3IgSC4yNjQKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybVZDTTRQMTBfQ0FWTENUYWJsZXMuaCIKLQotLyogVGFibGVzIG1hcHBpbmcgYSBjb2RlIHRvIFRyYWlsaW5nT25lcyBhbmQgVG90YWxDb2VmZiAqLwotCi1jb25zdCBPTVhfVTggYXJtVkNNNFAxMF9DQVZMQ1RyYWlsaW5nT25lc1s2Ml0gPSB7Ci0gMCwKLSAwLCAxLAotIDAsIDEsIDIsCi0gMCwgMSwgMiwgMywKLSAwLCAxLCAyLCAzLAotIDAsIDEsIDIsIDMsCi0gMCwgMSwgMiwgMywKLSAwLCAxLCAyLCAzLAotIDAsIDEsIDIsIDMsCi0gMCwgMSwgMiwgMywKLSAwLCAxLCAyLCAzLAotIDAsIDEsIDIsIDMsCi0gMCwgMSwgMiwgMywKLSAwLCAxLCAyLCAzLAotIDAsIDEsIDIsIDMsCi0gMCwgMSwgMiwgMywKLSAwLCAxLCAyLCAzCi19OwotCi1jb25zdCBPTVhfVTggYXJtVkNNNFAxMF9DQVZMQ1RvdGFsQ29lZmZbNjJdID0gewotIDAsCi0gMSwgMSwKLSAyLCAyLCAyLAotIDMsIDMsIDMsIDMsCi0gNCwgNCwgNCwgNCwKLSA1LCA1LCA1LCA1LAotIDYsIDYsIDYsIDYsCi0gNywgNywgNywgNywKLSA4LCA4LCA4LCA4LAotIDksIDksIDksIDksCi0gMTAsIDEwLCAxMCwgMTAsCi0gMTEsIDExLCAxMSwgMTEsCi0gMTIsIDEyLCAxMiwgMTIsCi0gMTMsIDEzLCAxMywgMTMsCi0gMTQsIDE0LCAxNCwgMTQsCi0gMTUsIDE1LCAxNSwgMTUsCi0gMTYsIDE2LCAxNiwgMTYKLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW4wWzYzXSA9IHsKLSAgICB7ICAxLCAweDAwMDEgfSwKLSAgICB7ICA2LCAweDAwMDUgfSwKLSAgICB7ICAyLCAweDAwMDEgfSwKLSAgICB7ICA4LCAweDAwMDcgfSwKLSAgICB7ICA2LCAweDAwMDQgfSwKLSAgICB7ICAzLCAweDAwMDEgfSwKLSAgICB7ICA5LCAweDAwMDcgfSwKLSAgICB7ICA4LCAweDAwMDYgfSwKLSAgICB7ICA3LCAweDAwMDUgfSwKLSAgICB7ICA1LCAweDAwMDMgfSwKLSAgICB7IDEwLCAweDAwMDcgfSwKLSAgICB7ICA5LCAweDAwMDYgfSwKLSAgICB7ICA4LCAweDAwMDUgfSwKLSAgICB7ICA2LCAweDAwMDMgfSwKLSAgICB7IDExLCAweDAwMDcgfSwKLSAgICB7IDEwLCAweDAwMDYgfSwKLSAgICB7ICA5LCAweDAwMDUgfSwKLSAgICB7ICA3LCAweDAwMDQgfSwKLSAgICB7IDEzLCAweDAwMGYgfSwKLSAgICB7IDExLCAweDAwMDYgfSwKLSAgICB7IDEwLCAweDAwMDUgfSwKLSAgICB7ICA4LCAweDAwMDQgfSwKLSAgICB7IDEzLCAweDAwMGIgfSwKLSAgICB7IDEzLCAweDAwMGUgfSwKLSAgICB7IDExLCAweDAwMDUgfSwKLSAgICB7ICA5LCAweDAwMDQgfSwKLSAgICB7IDEzLCAweDAwMDggfSwKLSAgICB7IDEzLCAweDAwMGEgfSwKLSAgICB7IDEzLCAweDAwMGQgfSwKLSAgICB7IDEwLCAweDAwMDQgfSwKLSAgICB7IDE0LCAweDAwMGYgfSwKLSAgICB7IDE0LCAweDAwMGUgfSwKLSAgICB7IDEzLCAweDAwMDkgfSwKLSAgICB7IDExLCAweDAwMDQgfSwKLSAgICB7IDE0LCAweDAwMGIgfSwKLSAgICB7IDE0LCAweDAwMGEgfSwKLSAgICB7IDE0LCAweDAwMGQgfSwKLSAgICB7IDEzLCAweDAwMGMgfSwKLSAgICB7IDE1LCAweDAwMGYgfSwKLSAgICB7IDE1LCAweDAwMGUgfSwKLSAgICB7IDE0LCAweDAwMDkgfSwKLSAgICB7IDE0LCAweDAwMGMgfSwKLSAgICB7IDE1LCAweDAwMGIgfSwKLSAgICB7IDE1LCAweDAwMGEgfSwKLSAgICB7IDE1LCAweDAwMGQgfSwKLSAgICB7IDE0LCAweDAwMDggfSwKLSAgICB7IDE2LCAweDAwMGYgfSwKLSAgICB7IDE1LCAweDAwMDEgfSwKLSAgICB7IDE1LCAweDAwMDkgfSwKLSAgICB7IDE1LCAweDAwMGMgfSwKLSAgICB7IDE2LCAweDAwMGIgfSwKLSAgICB7IDE2LCAweDAwMGUgfSwKLSAgICB7IDE2LCAweDAwMGQgfSwKLSAgICB7IDE1LCAweDAwMDggfSwKLSAgICB7IDE2LCAweDAwMDcgfSwKLSAgICB7IDE2LCAweDAwMGEgfSwKLSAgICB7IDE2LCAweDAwMDkgfSwKLSAgICB7IDE2LCAweDAwMGMgfSwKLSAgICB7IDE2LCAweDAwMDQgfSwKLSAgICB7IDE2LCAweDAwMDYgfSwKLSAgICB7IDE2LCAweDAwMDUgfSwKLSAgICB7IDE2LCAweDAwMDggfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjFbNjNdID0gewotICAgIHsgIDIsIDB4MDAwMyB9LAotICAgIHsgIDYsIDB4MDAwYiB9LAotICAgIHsgIDIsIDB4MDAwMiB9LAotICAgIHsgIDYsIDB4MDAwNyB9LAotICAgIHsgIDUsIDB4MDAwNyB9LAotICAgIHsgIDMsIDB4MDAwMyB9LAotICAgIHsgIDcsIDB4MDAwNyB9LAotICAgIHsgIDYsIDB4MDAwYSB9LAotICAgIHsgIDYsIDB4MDAwOSB9LAotICAgIHsgIDQsIDB4MDAwNSB9LAotICAgIHsgIDgsIDB4MDAwNyB9LAotICAgIHsgIDYsIDB4MDAwNiB9LAotICAgIHsgIDYsIDB4MDAwNSB9LAotICAgIHsgIDQsIDB4MDAwNCB9LAotICAgIHsgIDgsIDB4MDAwNCB9LAotICAgIHsgIDcsIDB4MDAwNiB9LAotICAgIHsgIDcsIDB4MDAwNSB9LAotICAgIHsgIDUsIDB4MDAwNiB9LAotICAgIHsgIDksIDB4MDAwNyB9LAotICAgIHsgIDgsIDB4MDAwNiB9LAotICAgIHsgIDgsIDB4MDAwNSB9LAotICAgIHsgIDYsIDB4MDAwOCB9LAotICAgIHsgMTEsIDB4MDAwZiB9LAotICAgIHsgIDksIDB4MDAwNiB9LAotICAgIHsgIDksIDB4MDAwNSB9LAotICAgIHsgIDYsIDB4MDAwNCB9LAotICAgIHsgMTEsIDB4MDAwYiB9LAotICAgIHsgMTEsIDB4MDAwZSB9LAotICAgIHsgMTEsIDB4MDAwZCB9LAotICAgIHsgIDcsIDB4MDAwNCB9LAotICAgIHsgMTIsIDB4MDAwZiB9LAotICAgIHsgMTEsIDB4MDAwYSB9LAotICAgIHsgMTEsIDB4MDAwOSB9LAotICAgIHsgIDksIDB4MDAwNCB9LAotICAgIHsgMTIsIDB4MDAwYiB9LAotICAgIHsgMTIsIDB4MDAwZSB9LAotICAgIHsgMTIsIDB4MDAwZCB9LAotICAgIHsgMTEsIDB4MDAwYyB9LAotICAgIHsgMTIsIDB4MDAwOCB9LAotICAgIHsgMTIsIDB4MDAwYSB9LAotICAgIHsgMTIsIDB4MDAwOSB9LAotICAgIHsgMTEsIDB4MDAwOCB9LAotICAgIHsgMTMsIDB4MDAwZiB9LAotICAgIHsgMTMsIDB4MDAwZSB9LAotICAgIHsgMTMsIDB4MDAwZCB9LAotICAgIHsgMTIsIDB4MDAwYyB9LAotICAgIHsgMTMsIDB4MDAwYiB9LAotICAgIHsgMTMsIDB4MDAwYSB9LAotICAgIHsgMTMsIDB4MDAwOSB9LAotICAgIHsgMTMsIDB4MDAwYyB9LAotICAgIHsgMTMsIDB4MDAwNyB9LAotICAgIHsgMTQsIDB4MDAwYiB9LAotICAgIHsgMTMsIDB4MDAwNiB9LAotICAgIHsgMTMsIDB4MDAwOCB9LAotICAgIHsgMTQsIDB4MDAwOSB9LAotICAgIHsgMTQsIDB4MDAwOCB9LAotICAgIHsgMTQsIDB4MDAwYSB9LAotICAgIHsgMTMsIDB4MDAwMSB9LAotICAgIHsgMTQsIDB4MDAwNyB9LAotICAgIHsgMTQsIDB4MDAwNiB9LAotICAgIHsgMTQsIDB4MDAwNSB9LAotICAgIHsgMTQsIDB4MDAwNCB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuMls2M10gPSB7Ci0gICAgeyAgNCwgMHgwMDBmIH0sCi0gICAgeyAgNiwgMHgwMDBmIH0sCi0gICAgeyAgNCwgMHgwMDBlIH0sCi0gICAgeyAgNiwgMHgwMDBiIH0sCi0gICAgeyAgNSwgMHgwMDBmIH0sCi0gICAgeyAgNCwgMHgwMDBkIH0sCi0gICAgeyAgNiwgMHgwMDA4IH0sCi0gICAgeyAgNSwgMHgwMDBjIH0sCi0gICAgeyAgNSwgMHgwMDBlIH0sCi0gICAgeyAgNCwgMHgwMDBjIH0sCi0gICAgeyAgNywgMHgwMDBmIH0sCi0gICAgeyAgNSwgMHgwMDBhIH0sCi0gICAgeyAgNSwgMHgwMDBiIH0sCi0gICAgeyAgNCwgMHgwMDBiIH0sCi0gICAgeyAgNywgMHgwMDBiIH0sCi0gICAgeyAgNSwgMHgwMDA4IH0sCi0gICAgeyAgNSwgMHgwMDA5IH0sCi0gICAgeyAgNCwgMHgwMDBhIH0sCi0gICAgeyAgNywgMHgwMDA5IH0sCi0gICAgeyAgNiwgMHgwMDBlIH0sCi0gICAgeyAgNiwgMHgwMDBkIH0sCi0gICAgeyAgNCwgMHgwMDA5IH0sCi0gICAgeyAgNywgMHgwMDA4IH0sCi0gICAgeyAgNiwgMHgwMDBhIH0sCi0gICAgeyAgNiwgMHgwMDA5IH0sCi0gICAgeyAgNCwgMHgwMDA4IH0sCi0gICAgeyAgOCwgMHgwMDBmIH0sCi0gICAgeyAgNywgMHgwMDBlIH0sCi0gICAgeyAgNywgMHgwMDBkIH0sCi0gICAgeyAgNSwgMHgwMDBkIH0sCi0gICAgeyAgOCwgMHgwMDBiIH0sCi0gICAgeyAgOCwgMHgwMDBlIH0sCi0gICAgeyAgNywgMHgwMDBhIH0sCi0gICAgeyAgNiwgMHgwMDBjIH0sCi0gICAgeyAgOSwgMHgwMDBmIH0sCi0gICAgeyAgOCwgMHgwMDBhIH0sCi0gICAgeyAgOCwgMHgwMDBkIH0sCi0gICAgeyAgNywgMHgwMDBjIH0sCi0gICAgeyAgOSwgMHgwMDBiIH0sCi0gICAgeyAgOSwgMHgwMDBlIH0sCi0gICAgeyAgOCwgMHgwMDA5IH0sCi0gICAgeyAgOCwgMHgwMDBjIH0sCi0gICAgeyAgOSwgMHgwMDA4IH0sCi0gICAgeyAgOSwgMHgwMDBhIH0sCi0gICAgeyAgOSwgMHgwMDBkIH0sCi0gICAgeyAgOCwgMHgwMDA4IH0sCi0gICAgeyAxMCwgMHgwMDBkIH0sCi0gICAgeyAgOSwgMHgwMDA3IH0sCi0gICAgeyAgOSwgMHgwMDA5IH0sCi0gICAgeyAgOSwgMHgwMDBjIH0sCi0gICAgeyAxMCwgMHgwMDA5IH0sCi0gICAgeyAxMCwgMHgwMDBjIH0sCi0gICAgeyAxMCwgMHgwMDBiIH0sCi0gICAgeyAxMCwgMHgwMDBhIH0sCi0gICAgeyAxMCwgMHgwMDA1IH0sCi0gICAgeyAxMCwgMHgwMDA4IH0sCi0gICAgeyAxMCwgMHgwMDA3IH0sCi0gICAgeyAxMCwgMHgwMDA2IH0sCi0gICAgeyAxMCwgMHgwMDAxIH0sCi0gICAgeyAxMCwgMHgwMDA0IH0sCi0gICAgeyAxMCwgMHgwMDAzIH0sCi0gICAgeyAxMCwgMHgwMDAyIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW4zWzYzXSA9IHsKLSAgICB7ICA2LCAweDAwMDMgfSwKLSAgICB7ICA2LCAweDAwMDAgfSwKLSAgICB7ICA2LCAweDAwMDEgfSwKLSAgICB7ICA2LCAweDAwMDQgfSwKLSAgICB7ICA2LCAweDAwMDUgfSwKLSAgICB7ICA2LCAweDAwMDYgfSwKLSAgICB7ICA2LCAweDAwMDggfSwKLSAgICB7ICA2LCAweDAwMDkgfSwKLSAgICB7ICA2LCAweDAwMGEgfSwKLSAgICB7ICA2LCAweDAwMGIgfSwKLSAgICB7ICA2LCAweDAwMGMgfSwKLSAgICB7ICA2LCAweDAwMGQgfSwKLSAgICB7ICA2LCAweDAwMGUgfSwKLSAgICB7ICA2LCAweDAwMGYgfSwKLSAgICB7ICA2LCAweDAwMTAgfSwKLSAgICB7ICA2LCAweDAwMTEgfSwKLSAgICB7ICA2LCAweDAwMTIgfSwKLSAgICB7ICA2LCAweDAwMTMgfSwKLSAgICB7ICA2LCAweDAwMTQgfSwKLSAgICB7ICA2LCAweDAwMTUgfSwKLSAgICB7ICA2LCAweDAwMTYgfSwKLSAgICB7ICA2LCAweDAwMTcgfSwKLSAgICB7ICA2LCAweDAwMTggfSwKLSAgICB7ICA2LCAweDAwMTkgfSwKLSAgICB7ICA2LCAweDAwMWEgfSwKLSAgICB7ICA2LCAweDAwMWIgfSwKLSAgICB7ICA2LCAweDAwMWMgfSwKLSAgICB7ICA2LCAweDAwMWQgfSwKLSAgICB7ICA2LCAweDAwMWUgfSwKLSAgICB7ICA2LCAweDAwMWYgfSwKLSAgICB7ICA2LCAweDAwMjAgfSwKLSAgICB7ICA2LCAweDAwMjEgfSwKLSAgICB7ICA2LCAweDAwMjIgfSwKLSAgICB7ICA2LCAweDAwMjMgfSwKLSAgICB7ICA2LCAweDAwMjQgfSwKLSAgICB7ICA2LCAweDAwMjUgfSwKLSAgICB7ICA2LCAweDAwMjYgfSwKLSAgICB7ICA2LCAweDAwMjcgfSwKLSAgICB7ICA2LCAweDAwMjggfSwKLSAgICB7ICA2LCAweDAwMjkgfSwKLSAgICB7ICA2LCAweDAwMmEgfSwKLSAgICB7ICA2LCAweDAwMmIgfSwKLSAgICB7ICA2LCAweDAwMmMgfSwKLSAgICB7ICA2LCAweDAwMmQgfSwKLSAgICB7ICA2LCAweDAwMmUgfSwKLSAgICB7ICA2LCAweDAwMmYgfSwKLSAgICB7ICA2LCAweDAwMzAgfSwKLSAgICB7ICA2LCAweDAwMzEgfSwKLSAgICB7ICA2LCAweDAwMzIgfSwKLSAgICB7ICA2LCAweDAwMzMgfSwKLSAgICB7ICA2LCAweDAwMzQgfSwKLSAgICB7ICA2LCAweDAwMzUgfSwKLSAgICB7ICA2LCAweDAwMzYgfSwKLSAgICB7ICA2LCAweDAwMzcgfSwKLSAgICB7ICA2LCAweDAwMzggfSwKLSAgICB7ICA2LCAweDAwMzkgfSwKLSAgICB7ICA2LCAweDAwM2EgfSwKLSAgICB7ICA2LCAweDAwM2IgfSwKLSAgICB7ICA2LCAweDAwM2MgfSwKLSAgICB7ICA2LCAweDAwM2QgfSwKLSAgICB7ICA2LCAweDAwM2UgfSwKLSAgICB7ICA2LCAweDAwM2YgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlbjRbMTVdID0gewotICAgIHsgIDIsIDB4MDAwMSB9LAotICAgIHsgIDYsIDB4MDAwNyB9LAotICAgIHsgIDEsIDB4MDAwMSB9LAotICAgIHsgIDYsIDB4MDAwNCB9LAotICAgIHsgIDYsIDB4MDAwNiB9LAotICAgIHsgIDMsIDB4MDAwMSB9LAotICAgIHsgIDYsIDB4MDAwMyB9LAotICAgIHsgIDcsIDB4MDAwMyB9LAotICAgIHsgIDcsIDB4MDAwMiB9LAotICAgIHsgIDYsIDB4MDAwNSB9LAotICAgIHsgIDYsIDB4MDAwMiB9LAotICAgIHsgIDgsIDB4MDAwMyB9LAotICAgIHsgIDgsIDB4MDAwMiB9LAotICAgIHsgIDcsIDB4MDAwMCB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi0KLWNvbnN0IEFSTV9WTEMzMiAqYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNbNV0gPSB7Ci0gICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuMCwgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuMSwKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW4yLCAKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW4zLCAKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW40Ci19OwotCi0vKiBUYWJsZSBmb3IgbGV2ZWxfcHJlZml4ICovCi0KLWNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDTGV2ZWxQcmVmaXhbMTddID0gewotICAgIHsgIDEsIDF9LAotICAgIHsgIDIsIDF9LAotICAgIHsgIDMsIDF9LAotICAgIHsgIDQsIDF9LAotICAgIHsgIDUsIDF9LAotICAgIHsgIDYsIDF9LAotICAgIHsgIDcsIDF9LAotICAgIHsgIDgsIDF9LAotICAgIHsgIDksIDF9LAotICAgIHsgMTAsIDF9LAotICAgIHsgMTEsIDF9LAotICAgIHsgMTIsIDF9LAotICAgIHsgMTMsIDF9LAotICAgIHsgMTQsIDF9LAotICAgIHsgMTUsIDF9LAotICAgIHsgMTYsIDF9LAotICAgIHsgIDAsIDB9Ci19OwotCi0vKiBUYWJsZXMgZm9yIHRvdGFsX3plcm9zICovCi0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxWzE3XSA9IHsKLSAgICB7ICAxLCAweDAwMDEgfSwKLSAgICB7ICAzLCAweDAwMDMgfSwKLSAgICB7ICAzLCAweDAwMDIgfSwKLSAgICB7ICA0LCAweDAwMDMgfSwKLSAgICB7ICA0LCAweDAwMDIgfSwKLSAgICB7ICA1LCAweDAwMDMgfSwKLSAgICB7ICA1LCAweDAwMDIgfSwKLSAgICB7ICA2LCAweDAwMDMgfSwKLSAgICB7ICA2LCAweDAwMDIgfSwKLSAgICB7ICA3LCAweDAwMDMgfSwKLSAgICB7ICA3LCAweDAwMDIgfSwKLSAgICB7ICA4LCAweDAwMDMgfSwKLSAgICB7ICA4LCAweDAwMDIgfSwKLSAgICB7ICA5LCAweDAwMDMgfSwKLSAgICB7ICA5LCAweDAwMDIgfSwKLSAgICB7ICA5LCAweDAwMDEgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJbMTZdID0gewotICAgIHsgIDMsIDB4MDAwNyB9LAotICAgIHsgIDMsIDB4MDAwNiB9LAotICAgIHsgIDMsIDB4MDAwNSB9LAotICAgIHsgIDMsIDB4MDAwNCB9LAotICAgIHsgIDMsIDB4MDAwMyB9LAotICAgIHsgIDQsIDB4MDAwNSB9LAotICAgIHsgIDQsIDB4MDAwNCB9LAotICAgIHsgIDQsIDB4MDAwMyB9LAotICAgIHsgIDQsIDB4MDAwMiB9LAotICAgIHsgIDUsIDB4MDAwMyB9LAotICAgIHsgIDUsIDB4MDAwMiB9LAotICAgIHsgIDYsIDB4MDAwMyB9LAotICAgIHsgIDYsIDB4MDAwMiB9LAotICAgIHsgIDYsIDB4MDAwMSB9LAotICAgIHsgIDYsIDB4MDAwMCB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zM1sxNV0gPSB7Ci0gICAgeyAgNCwgMHgwMDA1IH0sCi0gICAgeyAgMywgMHgwMDA3IH0sCi0gICAgeyAgMywgMHgwMDA2IH0sCi0gICAgeyAgMywgMHgwMDA1IH0sCi0gICAgeyAgNCwgMHgwMDA0IH0sCi0gICAgeyAgNCwgMHgwMDAzIH0sCi0gICAgeyAgMywgMHgwMDA0IH0sCi0gICAgeyAgMywgMHgwMDAzIH0sCi0gICAgeyAgNCwgMHgwMDAyIH0sCi0gICAgeyAgNSwgMHgwMDAzIH0sCi0gICAgeyAgNSwgMHgwMDAyIH0sCi0gICAgeyAgNiwgMHgwMDAxIH0sCi0gICAgeyAgNSwgMHgwMDAxIH0sCi0gICAgeyAgNiwgMHgwMDAwIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M0WzE0XSA9IHsKLSAgICB7ICA1LCAweDAwMDMgfSwKLSAgICB7ICAzLCAweDAwMDcgfSwKLSAgICB7ICA0LCAweDAwMDUgfSwKLSAgICB7ICA0LCAweDAwMDQgfSwKLSAgICB7ICAzLCAweDAwMDYgfSwKLSAgICB7ICAzLCAweDAwMDUgfSwKLSAgICB7ICAzLCAweDAwMDQgfSwKLSAgICB7ICA0LCAweDAwMDMgfSwKLSAgICB7ICAzLCAweDAwMDMgfSwKLSAgICB7ICA0LCAweDAwMDIgfSwKLSAgICB7ICA1LCAweDAwMDIgfSwKLSAgICB7ICA1LCAweDAwMDEgfSwKLSAgICB7ICA1LCAweDAwMDAgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczVbMTNdID0gewotICAgIHsgIDQsIDB4MDAwNSB9LAotICAgIHsgIDQsIDB4MDAwNCB9LAotICAgIHsgIDQsIDB4MDAwMyB9LAotICAgIHsgIDMsIDB4MDAwNyB9LAotICAgIHsgIDMsIDB4MDAwNiB9LAotICAgIHsgIDMsIDB4MDAwNSB9LAotICAgIHsgIDMsIDB4MDAwNCB9LAotICAgIHsgIDMsIDB4MDAwMyB9LAotICAgIHsgIDQsIDB4MDAwMiB9LAotICAgIHsgIDUsIDB4MDAwMSB9LAotICAgIHsgIDQsIDB4MDAwMSB9LAotICAgIHsgIDUsIDB4MDAwMCB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zNlsxMl0gPSB7Ci0gICAgeyAgNiwgMHgwMDAxIH0sCi0gICAgeyAgNSwgMHgwMDAxIH0sCi0gICAgeyAgMywgMHgwMDA3IH0sCi0gICAgeyAgMywgMHgwMDA2IH0sCi0gICAgeyAgMywgMHgwMDA1IH0sCi0gICAgeyAgMywgMHgwMDA0IH0sCi0gICAgeyAgMywgMHgwMDAzIH0sCi0gICAgeyAgMywgMHgwMDAyIH0sCi0gICAgeyAgNCwgMHgwMDAxIH0sCi0gICAgeyAgMywgMHgwMDAxIH0sCi0gICAgeyAgNiwgMHgwMDAwIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3M3WzExXSA9IHsKLSAgICB7ICA2LCAweDAwMDEgfSwKLSAgICB7ICA1LCAweDAwMDEgfSwKLSAgICB7ICAzLCAweDAwMDUgfSwKLSAgICB7ICAzLCAweDAwMDQgfSwKLSAgICB7ICAzLCAweDAwMDMgfSwKLSAgICB7ICAyLCAweDAwMDMgfSwKLSAgICB7ICAzLCAweDAwMDIgfSwKLSAgICB7ICA0LCAweDAwMDEgfSwKLSAgICB7ICAzLCAweDAwMDEgfSwKLSAgICB7ICA2LCAweDAwMDAgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczhbMTBdID0gewotICAgIHsgIDYsIDB4MDAwMSB9LAotICAgIHsgIDQsIDB4MDAwMSB9LAotICAgIHsgIDUsIDB4MDAwMSB9LAotICAgIHsgIDMsIDB4MDAwMyB9LAotICAgIHsgIDIsIDB4MDAwMyB9LAotICAgIHsgIDIsIDB4MDAwMiB9LAotICAgIHsgIDMsIDB4MDAwMiB9LAotICAgIHsgIDMsIDB4MDAwMSB9LAotICAgIHsgIDYsIDB4MDAwMCB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zOVs5XSA9IHsKLSAgICB7ICA2LCAweDAwMDEgfSwKLSAgICB7ICA2LCAweDAwMDAgfSwKLSAgICB7ICA0LCAweDAwMDEgfSwKLSAgICB7ICAyLCAweDAwMDMgfSwKLSAgICB7ICAyLCAweDAwMDIgfSwKLSAgICB7ICAzLCAweDAwMDEgfSwKLSAgICB7ICAyLCAweDAwMDEgfSwKLSAgICB7ICA1LCAweDAwMDEgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczEwWzhdID0gewotICAgIHsgIDUsIDB4MDAwMSB9LAotICAgIHsgIDUsIDB4MDAwMCB9LAotICAgIHsgIDMsIDB4MDAwMSB9LAotICAgIHsgIDIsIDB4MDAwMyB9LAotICAgIHsgIDIsIDB4MDAwMiB9LAotICAgIHsgIDIsIDB4MDAwMSB9LAotICAgIHsgIDQsIDB4MDAwMSB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTFbN10gPSB7Ci0gICAgeyAgNCwgMHgwMDAwIH0sCi0gICAgeyAgNCwgMHgwMDAxIH0sCi0gICAgeyAgMywgMHgwMDAxIH0sCi0gICAgeyAgMywgMHgwMDAyIH0sCi0gICAgeyAgMSwgMHgwMDAxIH0sCi0gICAgeyAgMywgMHgwMDAzIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxMls2XSA9IHsKLSAgICB7ICA0LCAweDAwMDAgfSwKLSAgICB7ICA0LCAweDAwMDEgfSwKLSAgICB7ICAyLCAweDAwMDEgfSwKLSAgICB7ICAxLCAweDAwMDEgfSwKLSAgICB7ICAzLCAweDAwMDEgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczEzWzVdID0gewotICAgIHsgIDMsIDB4MDAwMCB9LAotICAgIHsgIDMsIDB4MDAwMSB9LAotICAgIHsgIDEsIDB4MDAwMSB9LAotICAgIHsgIDIsIDB4MDAwMSB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTRbNF0gPSB7Ci0gICAgeyAgMiwgMHgwMDAwIH0sCi0gICAgeyAgMiwgMHgwMDAxIH0sCi0gICAgeyAgMSwgMHgwMDAxIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxNVszXSA9IHsKLSAgICB7ICAxLCAweDAwMDAgfSwKLSAgICB7ICAxLCAweDAwMDEgfSwKLSAgICB7ICAwLCAweDAwMDAgfQotfTsKLQotY29uc3QgQVJNX1ZMQzMyICphcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzWzE1XSA9IHsKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxLCAKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyLAotICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczMsIAotICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczQsIAotICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczUsIAotICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczYsIAotICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczcsIAotICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczgsIAotICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczksIAotICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczEwLCAKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxMSwgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTIsIAotICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczEzLCAKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MxNCwgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMTUgCi19OwotCi1zdGF0aWMgY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyXzFbNV0gPSB7Ci0gICAgeyAgMSwgMSB9LAotICAgIHsgIDIsIDEgfSwKLSAgICB7ICAzLCAxIH0sCi0gICAgeyAgMywgMCB9LAotICAgIHsgIDAsIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4Ml8yWzRdID0gewotICAgIHsgIDEsIDEgfSwKLSAgICB7ICAyLCAxIH0sCi0gICAgeyAgMiwgMCB9LAotICAgIHsgIDAsIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4Ml8zWzNdID0gewotICAgIHsgIDEsIDEgfSwKLSAgICB7ICAxLCAwIH0sCi0gICAgeyAgMCwgMCB9Ci19OwotCi1jb25zdCBBUk1fVkxDMzIgKmFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzWzNdID0gewotICAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4Ml8xLCAKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJfMiwgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyXzMKLX07Ci0KLQotLyogVGFibGVzIGZvciBydW5fYmVmb3JlICovCi0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZTFbM10gPSB7Ci0gICAgeyAgMSwgMHgwMDAxIH0sCi0gICAgeyAgMSwgMHgwMDAwIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZTJbNF0gPSB7Ci0gICAgeyAgMSwgMHgwMDAxIH0sCi0gICAgeyAgMiwgMHgwMDAxIH0sCi0gICAgeyAgMiwgMHgwMDAwIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZTNbNV0gPSB7Ci0gICAgeyAgMiwgMHgwMDAzIH0sCi0gICAgeyAgMiwgMHgwMDAyIH0sCi0gICAgeyAgMiwgMHgwMDAxIH0sCi0gICAgeyAgMiwgMHgwMDAwIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZTRbNl0gPSB7Ci0gICAgeyAgMiwgMHgwMDAzIH0sCi0gICAgeyAgMiwgMHgwMDAyIH0sCi0gICAgeyAgMiwgMHgwMDAxIH0sCi0gICAgeyAgMywgMHgwMDAxIH0sCi0gICAgeyAgMywgMHgwMDAwIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZTVbN10gPSB7Ci0gICAgeyAgMiwgMHgwMDAzIH0sCi0gICAgeyAgMiwgMHgwMDAyIH0sCi0gICAgeyAgMywgMHgwMDAzIH0sCi0gICAgeyAgMywgMHgwMDAyIH0sCi0gICAgeyAgMywgMHgwMDAxIH0sCi0gICAgeyAgMywgMHgwMDAwIH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZTZbOF0gPSB7Ci0gICAgeyAgMiwgMHgwMDAzIH0sCi0gICAgeyAgMywgMHgwMDAwIH0sCi0gICAgeyAgMywgMHgwMDAxIH0sCi0gICAgeyAgMywgMHgwMDAzIH0sCi0gICAgeyAgMywgMHgwMDAyIH0sCi0gICAgeyAgMywgMHgwMDA1IH0sCi0gICAgeyAgMywgMHgwMDA0IH0sCi0gICAgeyAgMCwgMHgwMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZTdbMTZdID0gewotICAgIHsgIDMsIDB4MDAwNyB9LAotICAgIHsgIDMsIDB4MDAwNiB9LAotICAgIHsgIDMsIDB4MDAwNSB9LAotICAgIHsgIDMsIDB4MDAwNCB9LAotICAgIHsgIDMsIDB4MDAwMyB9LAotICAgIHsgIDMsIDB4MDAwMiB9LAotICAgIHsgIDMsIDB4MDAwMSB9LAotICAgIHsgIDQsIDB4MDAwMSB9LAotICAgIHsgIDUsIDB4MDAwMSB9LAotICAgIHsgIDYsIDB4MDAwMSB9LAotICAgIHsgIDcsIDB4MDAwMSB9LAotICAgIHsgIDgsIDB4MDAwMSB9LAotICAgIHsgIDksIDB4MDAwMSB9LAotICAgIHsgMTAsIDB4MDAwMSB9LAotICAgIHsgMTEsIDB4MDAwMSB9LAotICAgIHsgIDAsIDB4MDAwMCB9Ci19OwotCi1jb25zdCBBUk1fVkxDMzIgKmFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNbN10gPSB7Ci0gICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmUxLCAKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZTIsIAotICAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlMywgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmU0LCAKLSAgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZTUsIAotICAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlNiwgCi0gICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmU3Ci19OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MTFhMzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYuYworKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9Db21wYXJlTW90aW9uQ29zdFRvTVYuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZSBmb3IgY29tcGFyaW5nIG1vdGlvbiB2ZWN0b3JzIGFuZCBTQUQncyB0byBkZWNpZGUgCi0gKiB0aGUgYmVzdCBNViBhbmQgU0FECi0gKgotICovCi0gIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9FeHBHb2xCaXRzVXNlZAotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgY2FsY3VsYXRpbmcgRXhwLUdvbG9tYiBjb2RlIGxlbmd0aCBmb3IgYSBnaXZlbiB2YWx1ZXMKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCSAgICAgICAgIHZhbAlTaWduZWQgbnVtYmVyIGZvciB3aGljaCBFeHAtR29sb21iIGNvZGUgbGVuZ3RoIGhhcwotICogICAgICAgICAgICAgICAgICAgICAgdG8gYmUgY2FsY3VsYXRlZAotICoKLSAqIFJldHVybiBWYWx1ZTogCi0gKiAgICAgICAgICAgICBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIEV4cC1Hb2xvbWIgY29kZSBmb3IgdmFsCi0gKi8KLQotc3RhdGljIE9NWF9VMTYgYXJtVkNNNFAxMF9FeHBHb2xCaXRzVXNlZCAoT01YX1MxNiB2YWwpCi17Ci0gICAgT01YX1UxNiBzaXplQ29kZU51bSwgY29kZU51bTsKLSAgICAKLSAgICAvKiBNYXBwaW5nIHZhbCB0byBjb2RlTnVtICovCi0gICAgY29kZU51bSA9IGFybUFicyAodmFsKTsKLSAgICBpZiAodmFsID4gMCkKLSAgICB7Ci0gICAgICAgIGNvZGVOdW0gPSAoMiAqIGNvZGVOdW0pIC0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgY29kZU51bSA9IDIgKiBjb2RlTnVtOwotICAgIH0KLSAgICAKLSAgICAvKiBTaXplIG9mIHRoZSBleHAtZ29sb21iIGNvZGUgKi8KLSAgICBzaXplQ29kZU51bSA9ICgyICogYXJtTG9nU2l6ZSAoY29kZU51bSArIDEpKSAtIDE7Ci0gICAgCi0gICAgcmV0dXJuIHNpemVDb2RlTnVtOwotfQotICAgICAgICAgICAgICAgIAotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NVgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgY29tcGFyaXNpb24gb2YgbW90aW9uIHZlY3RvcnMgYW5kIE1vdGlvbiBjb3N0IHRvIGRlY2lkZSB0aGUgCi0gKiBiZXN0IE1WIGFuZCBiZXN0IE1DCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQkgICAgICAgICBtdlgJeCBjb29yZGluYXRlIG9mIHRoZSBjYW5kaWRhdGUgbW90aW9uIHZlY3RvciBpbiAxLzQgcGVsIHVuaXRzCi0gKiBbaW5dCSAgICAgICAgIG12WQl5IGNvb3JkaW5hdGUgb2YgdGhlIGNhbmRpZGF0ZSBtb3Rpb24gdmVjdG9yIGluIDEvNCBwZWwgdW5pdHMKLSAqIFtpbl0JICAgICAgZGlmZk1WCWRpZmZlcmVudGlhbCBNVgotICogW2luXQkgICAgIGNhbmRTQUQJQ2FuZGlkYXRlIFNBRAotICogW2luXQkgICAgICBiZXN0TVYJQmVzdCBNViwgY29udGFpbnMgYmVzdCBNViB0aWxsIHRoZSBwcmV2aW91cyBpbnRlcmF0aW9uLgotICogW2luXSAgICAgICBuTGFtZGEgICAgTGFtZGEgZmFjdG9yOyB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCi0gKiBbaW5dICAgKnBCZXN0Q29zdCAgICBDb250YWlucyB0aGUgY3VycmVudCBiZXN0IG1vdGlvbiBjb3N0LgotICogW291dF0gICpwQmVzdENvc3QgICAgcEJlc3RDb3N0IE1vdGlvbiBjb3N0IHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WIAotICogICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIganVkZ2VtZW50OyAKLSAqICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVkIGFzIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYsIGlmIHRoZSBjYW5kQ29zdCBpcyBsZXNzIAotICogICAgICAgICAgICAgICAgICAgICAgdGhhbiB0aGUgYmVzdCBjb3N0IHBhc3NlZCB0aGVuIHRoZSAqcEJlc3RDb3N0IHdpbGwgYmUgZXF1YWwgdG8gY2FuZENvc3QKLSAqIFtvdXRdCSAgYmVzdE1WCUZpbmFsbHkgd2lsbCBoYXZlIHRoZSBiZXN0IE1WIGFmdGVyIHRoZSBqdWRnZW1lbnQuCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX0lOVCAtLSAxIHRvIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgbW90aW9uIGNvc3QgaXMgdGhlIGJlc3QgCi0gKiAgICAgICAgICAgIDAgdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyBOT1QgdGhlIGJlc3QgbW90aW9uIGNvc3QKLSAqLwotCi1PTVhfSU5UIGFybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WICgKLSAgICBPTVhfUzE2ICBtdlgsCi0gICAgT01YX1MxNiAgbXZZLAotICAgIE9NWFZDTW90aW9uVmVjdG9yIGRpZmZNViwgCi0gICAgT01YX0lOVCBjYW5kU0FELCAKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqYmVzdE1WLCAKLSAgICBPTVhfVTMyIG5MYW1kYSwKLSAgICBPTVhfUzMyICpwQmVzdENvc3QKLSkgCi17Ci0gICAgT01YX1MzMiBjYW5kQ29zdDsKLSAgICBPTVhfVTE2IHNpemVDb2RlTnVtOwotICAgIAotICAgIHNpemVDb2RlTnVtID0gYXJtVkNNNFAxMF9FeHBHb2xCaXRzVXNlZCAoZGlmZk1WLmR4KTsKLSAgICBzaXplQ29kZU51bSArPSBhcm1WQ000UDEwX0V4cEdvbEJpdHNVc2VkIChkaWZmTVYuZHkpOwotICAgIAotICAgIC8qIE1vdGlvbiBjb3N0ID0gU0FEICsgIGxhbWRhICogKChiaXRzdXNlZChkaWZmTVZ4KSArIChiaXRzdXNlZChkaWZmTVZ5KSkqLwotICAgIGNhbmRDb3N0ID0gY2FuZFNBRCArIChuTGFtZGEgKiBzaXplQ29kZU51bSk7Ci0gICAgICAgIAotICAgIC8qIENhbGN1bGF0ZSBjYW5kQ29zdCAqLwotICAgIGlmIChjYW5kQ29zdCA8ICpwQmVzdENvc3QpCi0gICAgewotICAgICAgICAqcEJlc3RDb3N0ID0gY2FuZENvc3Q7Ci0gICAgICAgIGJlc3RNVi0+ZHggPSBtdlg7Ci0gICAgICAgIGJlc3RNVi0+ZHkgPSBtdlk7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBpZiAoY2FuZENvc3QgPiAqcEJlc3RDb3N0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIC8qIHNob3J0ZXIgbW90aW9uIHZlY3RvciAqLwotICAgIGlmICggKG12WCAqIG12WCArIG12WSAqIG12WSkgPCAoKGJlc3RNVi0+ZHggKiBiZXN0TVYtPmR4KSArIChiZXN0TVYtPmR5ICogYmVzdE1WLT5keSkpICkKLSAgICB7Ci0gICAgICAgICpwQmVzdENvc3QgPSBjYW5kQ29zdDsKLSAgICAgICAgYmVzdE1WLT5keCA9IG12WDsKLSAgICAgICAgYmVzdE1WLT5keSA9IG12WTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIAotICAgIHJldHVybiAwOwotfQotCi0vKkVuZCBvZiBGaWxlKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVCbG9ja1BpeGVsLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlQmxvY2tQaXhlbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmRhOGFiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVCbG9ja1BpeGVsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogCi0gKiBILjI2NCBsdW1hIGRlYmxvY2sgbW9kdWxlCi0gKiAKLSAqLwotCi0jaWZkZWYgREVCVUdfQVJNVkNNNFAxMF9ERUJMT0NLUElYRUwKLSN1bmRlZiBERUJVR19PTgotI2RlZmluZSBERUJVR19PTgotI2VuZGlmIC8qIERFQlVHX0FSTVZDTTRQMTBfREVCTE9DS1BJWEVMICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoKLSAqIERlc2NyaXB0aW9uCi0gKiBEZWJsb2NrIG9uZSBib3VuZGFyeSBwaXhlbAotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBRMCAgICAgICAgIFBvaW50ZXIgdG8gcGl4ZWwgcTAKLSAqIFtpbl0gU3RlcCAgICAgICAgU3RlcCBiZXR3ZWVuIHBpeGVscyBxMCBhbmQgcTEKLSAqIFtpbl0gdEMwICAgICAgICAgRWRnZSB0aHJlc2hvbGQgdmFsdWUKLSAqIFtpbl0gYWxwaGEgICAgICAgYWxwaGEgdGhyZXNob2xkIHZhbHVlCi0gKiBbaW5dIGJldGEgICAgICAgIGJldGEgdGhyZXNob2xkIHZhbHVlCi0gKiBbaW5dIGJTICAgICAgICAgIGRlYmxvY2tpbmcgc3RyZW5ndGgKLSAqIFtpbl0gQ2hyb21hRmxhZyAgVHJ1ZSBmb3IgY2hyb21hIGJsb2NrcwotICogW291dF0gcFEwICAgICAgICBEZWJsb2NrZWQgcGl4ZWxzCi0gKiAKLSAqLwotCi12b2lkIGFybVZDTTRQMTBfRGVCbG9ja1BpeGVsKAotICAgIE9NWF9VOCAqcFEwLCAgICAvKiBwb2ludGVyIHRvIHRoZSBwaXhlbCBxMCAqLwotICAgIGludCBTdGVwLCAgICAgICAvKiBzdGVwIGJldHdlZW4gcGl4ZWxzIHEwIGFuZCBxMSAqLwotICAgIGludCB0QzAsICAgICAgICAvKiBlZGdlIHRocmVzaG9sZCB2YWx1ZSAqLwotICAgIGludCBhbHBoYSwgICAgICAvKiBhbHBoYSAqLwotICAgIGludCBiZXRhLCAgICAgICAvKiBiZXRhICovCi0gICAgaW50IGJTLCAgICAgICAgIC8qIGRlYmxvY2tpbmcgc3RyZW5ndGggKi8KLSAgICBpbnQgQ2hyb21hRmxhZwotKQotewotICAgIGludCBwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTM7Ci0gICAgaW50IGFwLCBhcSwgZGVsdGE7Ci0KLSAgICBpZiAoYlM9PTApCi0gICAgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcDMgPSBwUTBbLTQqU3RlcF07Ci0gICAgcDIgPSBwUTBbLTMqU3RlcF07Ci0gICAgcDEgPSBwUTBbLTIqU3RlcF07Ci0gICAgcDAgPSBwUTBbLTEqU3RlcF07Ci0gICAgcTAgPSBwUTBbIDAqU3RlcF07Ci0gICAgcTEgPSBwUTBbIDEqU3RlcF07Ci0gICAgcTIgPSBwUTBbIDIqU3RlcF07Ci0gICAgcTMgPSBwUTBbIDMqU3RlcF07Ci0KLSAgICBpZiAoYXJtQWJzKHAwLXEwKT49YWxwaGEgfHwgYXJtQWJzKHAxLXAwKT49YmV0YSB8fCBhcm1BYnMocTEtcTApPj1iZXRhKQotICAgIHsKLSAgICAgICAgREVCVUdfUFJJTlRGXzEwKCJEZUJsb2NrUGl4ZWw6ICUwMnggJTAyeCAlMDJ4ICUwMnggfCAlMDJ4ICUwMnggJTAyeCAlMDJ4IGFscGhhPSVkIGJldGE9JWRcbiIsCi0gICAgICAgICAgICBwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTMsIGFscGhhLCBiZXRhKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGFwID0gYXJtQWJzKHAyIC0gcDApOwotICAgIGFxID0gYXJtQWJzKHEyIC0gcTApOwotCi0gICAgaWYgKGJTIDwgNCkKLSAgICB7Ci0gICAgICAgIGludCB0QyA9IHRDMDsKLQotICAgICAgICBpZiAoQ2hyb21hRmxhZykKLSAgICAgICAgewotICAgICAgICAgICAgdEMrKzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChhcCA8IGJldGEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdEMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhcSA8IGJldGEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdEMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIAotICAgICAgICBkZWx0YSA9ICgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCkgPj4gMzsKLSAgICAgICAgZGVsdGEgPSBhcm1DbGlwKC10QywgdEMsIGRlbHRhKTsKLQotICAgICAgICBwUTBbLTEqU3RlcF0gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBwMCArIGRlbHRhKTsKLSAgICAgICAgcFEwWyAwKlN0ZXBdID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgcTAgLSBkZWx0YSk7Ci0KLSAgICAgICAgaWYgKENocm9tYUZsYWc9PTAgJiYgYXA8YmV0YSkKLSAgICAgICAgewotICAgICAgICAgICAgZGVsdGEgPSAocDIgKyAoKHAwK3EwKzEpPj4xKSAtIChwMTw8MSkpPj4xOwotICAgICAgICAgICAgZGVsdGEgPSBhcm1DbGlwKC10QzAsIHRDMCwgZGVsdGEpOwotICAgICAgICAgICAgcFEwWy0yKlN0ZXBdID0gKE9NWF9VOCkocDEgKyBkZWx0YSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoQ2hyb21hRmxhZz09MCAmJiBhcTxiZXRhKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWx0YSA9IChxMiArICgocDArcTArMSk+PjEpIC0gKHExPDwxKSk+PjE7Ci0gICAgICAgICAgICBkZWx0YSA9IGFybUNsaXAoLXRDMCwgdEMwLCBkZWx0YSk7Ci0gICAgICAgICAgICBwUTBbIDEqU3RlcF0gPSAoT01YX1U4KShxMSArIGRlbHRhKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIC8qIGJTPT00ICovCi0gICAgewotICAgICAgICBpZiAoQ2hyb21hRmxhZz09MCAmJiBhcDxiZXRhICYmIGFybUFicyhwMC1xMCk8KChhbHBoYT4+MikrMikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBRMFstMSpTdGVwXSA9IChPTVhfVTgpKChwMiArIDIqcDEgKyAyKnAwICsgMipxMCArIHExICsgNCk+PjMpOwotICAgICAgICAgICAgcFEwWy0yKlN0ZXBdID0gKE9NWF9VOCkoKHAyICsgcDEgKyBwMCArIHEwICsgMik+PjIpOwotICAgICAgICAgICAgcFEwWy0zKlN0ZXBdID0gKE9NWF9VOCkoKDIqcDMgKyAzKnAyICsgcDEgKyBwMCArIHEwICsgNCk+PjMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcFEwWy0xKlN0ZXBdID0gKE9NWF9VOCkoKDIqcDEgKyBwMCArIHExICsgMik+PjIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKENocm9tYUZsYWc9PTAgJiYgYXE8YmV0YSAmJiBhcm1BYnMocDAtcTApPCgoYWxwaGE+PjIpKzIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwUTBbIDAqU3RlcF0gPSAoT01YX1U4KSgocTIgKyAyKnExICsgMipxMCArIDIqcDAgKyBwMSArIDQpPj4zKTsKLSAgICAgICAgICAgIHBRMFsgMSpTdGVwXSA9IChPTVhfVTgpKChxMiArIHExICsgcDAgKyBxMCArIDIpPj4yKTsKLSAgICAgICAgICAgIHBRMFsgMipTdGVwXSA9IChPTVhfVTgpKCgyKnEzICsgMypxMiArIHExICsgcTAgKyBwMCArIDQpPj4zKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBRMFsgMCpTdGVwXSA9IChPTVhfVTgpKCgyKnExICsgcTAgKyBwMSArIDIpPj4yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIERFQlVHX1BSSU5URl8xMygiRGVCbG9ja1BpeGVsOiAlMDJ4ICUwMnggJTAyeCAlMDJ4IHwgJTAyeCAlMDJ4ICUwMnggJTAyeCBiUz0lZCAtPiAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAotICAgICAgICBwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTMsIGJTLAotICAgICAgICBwUTBbLTIqU3RlcF0sIHBRMFstMSpTdGVwXSxwUTBbMCpTdGVwXSxwUTBbMSpTdGVwXSk7Ci0KLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzFkNTNiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogCi0gKiBILjI2NCBkZWNvZGUgY29lZmZpY2llbnRzIG1vZHVsZQotICogCi0gKi8KLSAKLSNpZmRlZiBERUJVR19BUk1WQ000UDEwX0RFQ09ERUNPRUZGU1RPUEFJUgotI3VuZGVmIERFQlVHX09OCi0jZGVmaW5lIERFQlVHX09OCi0jZW5kaWYKLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKLSNpbmNsdWRlICJhcm1WQ000UDEwX0NBVkxDVGFibGVzLmgiCi0KLS8qIDR4NCBEZVppZ1phZyB0YWJsZSAqLwotCi1zdGF0aWMgY29uc3QgT01YX1U4IGFybVZDTTRQMTBfWmlnWmFnWzE2XSA9Ci17Ci0gICAgMCwgMSwgNCwgOCwgNSwgMiwgMywgNiwgOSwgMTIsIDEzLCAxMCwgNywgMTEsIDE0LCAxNQotfTsKLQotLyoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtIHRoZSB3b3JrIHJlcXVpcmVkIGJ5IHRoZSBPcGVuTUFYCi0gKiBEZWNvZGVDb2VmZnNUb1BhaXIgZnVuY3Rpb24gYW5kIERlY29kZUNocm9tYURDQ29lZmZzVG9QYWlyLgotICogU2luY2UgbW9zdCBvZiB0aGUgY29kZSBpcyBjb21tb24gd2Ugc2hhcmUgaXQgaGVyZS4KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyCi0gKiBbaW5dCXBPZmZzZXQJCQlQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0KLSAqIFtpbl0Jc01heE51bUNvZWZmCU1heGltdW0gbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpbiBjdXJyZW50Ci0gKgkJCQkJCQkJYmxvY2sgKDQsMTUgb3IgMTYpCi0gKiBbaW5dCW5UYWJsZSAgICAgICAgICBUYWJsZSBudW1iZXIgKDAgdG8gNCkgYWNjb3JkaW5nIHRvIHRoZSBmaXZlIGNvbHVtbnMKLSAqICAgICAgICAgICAgICAgICAgICAgIG9mIFRhYmxlIDktNSBpbiB0aGUgSC4yNjQgc3BlYwotICogW291dF0JcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAotICogW291dF0JcE9mZnNldAkJCSpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCi0gKiBbb3V0XQlwTnVtQ29lZmYJCVBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbgotICoJCQkJCQkJCXRoaXMgYmxvY2sKLSAqIFtvdXRdCXBwUG9zQ29lZmJ1ZglEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbAotICoJCQkJCQkJCWNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKAotICAgICBjb25zdCBPTVhfVTgqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX1MzMiogcE9mZnNldCwKLSAgICAgT01YX1U4KiBwTnVtQ29lZmYsCi0gICAgIE9NWF9VOCAgKipwcFBvc0NvZWZidWYsCi0gICAgIE9NWF9JTlQgblRhYmxlLAotICAgICBPTVhfSU5UIHNNYXhOdW1Db2VmZiAgICAgICAgCi0gKQotewotICAgIGludCBDb2VmZlRva2VuLCBUb3RhbENvZWZmLCBUcmFpbGluZ09uZXM7Ci0gICAgaW50IExldmVsLCBMZXZlbENvZGUsIExldmVsUHJlZml4LCBMZXZlbFN1ZmZpeCwgTGV2ZWxTdWZmaXhTaXplOwotICAgIGludCBTdWZmaXhMZW5ndGgsIFJ1biwgWmVyb3NMZWZ0LENvZWZmTnVtOwotICAgIGludCBpLCBGbGFnczsKLSAgICBPTVhfVTggKnBQb3NDb2VmYnVmID0gKnBwUG9zQ29lZmJ1ZjsKLSAgICBPTVhfUzE2IHBMZXZlbFsxNl07Ci0gICAgT01YX1U4ICBwUnVuWzE2XTsKLQotICAgIENvZWZmVG9rZW4gPSBhcm1VblBhY2tWTEMzMihwcEJpdFN0cmVhbSwgcE9mZnNldCwgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNbblRhYmxlXSk7Ci0gICAgYXJtUmV0RGF0YUVycklmKENvZWZmVG9rZW4gPT0gQVJNX05PX0NPREVCT09LX0lOREVYLCBPTVhfU3RzX0Vycik7Ci0KLSAgICBUcmFpbGluZ09uZXMgPSBhcm1WQ000UDEwX0NBVkxDVHJhaWxpbmdPbmVzW0NvZWZmVG9rZW5dOwotICAgIFRvdGFsQ29lZmYgICA9IGFybVZDTTRQMTBfQ0FWTENUb3RhbENvZWZmW0NvZWZmVG9rZW5dOwotICAgICpwTnVtQ29lZmYgICA9IChPTVhfVTgpVG90YWxDb2VmZjsKLQotICAgIERFQlVHX1BSSU5URl8yKCJUb3RhbENvZWZmID0gJWQsIFRyYWlsaW5nT25lcyA9ICVkXG4iLCBUb3RhbENvZWZmLCBUcmFpbGluZ09uZXMpOwotCi0gICAgaWYgKFRvdGFsQ29lZmYgPT0gMCkKLSAgICB7Ci0gICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KLSAgICAgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci0gICAgfQotCi0gICAgLyogRGVjb2RlIHRyYWlsaW5nIG9uZXMgKi8KLSAgICBmb3IgKGk9VG90YWxDb2VmZi0xOyBpPj1Ub3RhbENvZWZmLVRyYWlsaW5nT25lczsgaS0tKQotICAgIHsKLSAgICAgICAgaWYgKGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBPZmZzZXQsIDEpKQotICAgICAgICB7Ci0gICAgICAgICAgICBMZXZlbCA9IC0xOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTGV2ZWwgPSArMTsKLSAgICAgICAgfQotICAgICAgICBwTGV2ZWxbaV0gPSAoT01YX1MxNilMZXZlbDsKLQotICAgICAgICBERUJVR19QUklOVEZfMigiTGV2ZWxbJWRdID0gJWRcbiIsIGksIHBMZXZlbFtpXSk7Ci0gICAgfQotCi0gICAgLyogRGVjb2RlIChub24gemVybykgbGV2ZWwgdmFsdWVzICovCi0gICAgU3VmZml4TGVuZ3RoID0gMDsKLSAgICBpZiAoVG90YWxDb2VmZj4xMCAmJiBUcmFpbGluZ09uZXM8MykKLSAgICB7Ci0gICAgICAgIFN1ZmZpeExlbmd0aD0xOwotICAgIH0KLSAgICBmb3IgKCA7IGk+PTA7IGktLSkKLSAgICB7Ci0gICAgICAgIExldmVsUHJlZml4ID0gYXJtVW5QYWNrVkxDMzIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIGFybVZDTTRQMTBfQ0FWTENMZXZlbFByZWZpeCk7Ci0gICAgICAgIGFybVJldERhdGFFcnJJZihMZXZlbFByZWZpeCA9PSBBUk1fTk9fQ09ERUJPT0tfSU5ERVgsIE9NWF9TdHNfRXJyKTsKLQotICAgICAgICBMZXZlbFN1ZmZpeFNpemUgPSBTdWZmaXhMZW5ndGg7Ci0gICAgICAgIGlmIChMZXZlbFByZWZpeD09MTQgJiYgU3VmZml4TGVuZ3RoPT0wKQotICAgICAgICB7Ci0gICAgICAgICAgICBMZXZlbFN1ZmZpeFNpemUgPSA0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChMZXZlbFByZWZpeD09MTUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExldmVsU3VmZml4U2l6ZSA9IDEyOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBMZXZlbFN1ZmZpeCA9IDA7Ci0gICAgICAgIGlmIChMZXZlbFN1ZmZpeFNpemUgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBMZXZlbFN1ZmZpeCA9IGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBPZmZzZXQsIExldmVsU3VmZml4U2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBMZXZlbENvZGUgPSAoTGV2ZWxQcmVmaXggPDwgU3VmZml4TGVuZ3RoKSArIExldmVsU3VmZml4OwotCi0KLSAgICAgICAgaWYgKExldmVsUHJlZml4PT0xNSAmJiBTdWZmaXhMZW5ndGg9PTApCi0gICAgICAgIHsKLSAgICAgICAgICAgIExldmVsQ29kZSArPSAxNTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIExldmVsQ29kZSA9IDIqKG1hZ25pdHVkZS0xKSArIHNpZ24gKi8KLQotICAgICAgICBpZiAoaT09VG90YWxDb2VmZi0xLVRyYWlsaW5nT25lcyAmJiBUcmFpbGluZ09uZXM8MykKLSAgICAgICAgewotICAgICAgICAgICAgLyogTGV2ZWwgbWFnbml0dWRlIGNhbid0IGJlIDEgKi8KLSAgICAgICAgICAgIExldmVsQ29kZSArPSAyOwotICAgICAgICB9Ci0gICAgICAgIGlmIChMZXZlbENvZGUgJiAxKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiAyYSsxIG1hcHMgdG8gLWEtMSAqLwotICAgICAgICAgICAgTGV2ZWwgPSAoLUxldmVsQ29kZS0xKT4+MTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIDJhKzAgbWFwcyB0byArYSsxICovCi0gICAgICAgICAgICBMZXZlbCA9IChMZXZlbENvZGUrMik+PjE7Ci0gICAgICAgIH0KLSAgICAgICAgcExldmVsW2ldID0gKE9NWF9TMTYpTGV2ZWw7Ci0KLSAgICAgICAgREVCVUdfUFJJTlRGXzIoIkxldmVsWyVkXSA9ICVkXG4iLCBpLCBwTGV2ZWxbaV0pOwotCi0gICAgICAgIGlmIChTdWZmaXhMZW5ndGg9PTApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN1ZmZpeExlbmd0aD0xOwotICAgICAgICB9Ci0gICAgICAgIGlmICggKChMZXZlbENvZGU+PjEpKzEpPigzPDwoU3VmZml4TGVuZ3RoLTEpKSAmJiBTdWZmaXhMZW5ndGg8NiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN1ZmZpeExlbmd0aCsrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogRGVjb2RlIHJ1biB2YWx1ZXMgKi8KLSAgICBaZXJvc0xlZnQgPSAwOwotICAgIGlmIChUb3RhbENvZWZmIDwgc01heE51bUNvZWZmKQotICAgIHsKLSAgICAgICAgLyogRGVjb2RlIFRvdGFsWmVyb3MgVkxDICovCi0gICAgICAgIGlmIChzTWF4TnVtQ29lZmY9PTQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFplcm9zTGVmdCA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc1tUb3RhbENvZWZmLTFdKTsKLSAgICAgICAgICAgIGFybVJldERhdGFFcnJJZihaZXJvc0xlZnQgPT1BUk1fTk9fQ09ERUJPT0tfSU5ERVggLCBPTVhfU3RzX0Vycik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBaZXJvc0xlZnQgPSBhcm1VblBhY2tWTEMzMihwcEJpdFN0cmVhbSwgcE9mZnNldCwgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc1tUb3RhbENvZWZmLTFdKTsKLSAgICAgICAgICAgICBhcm1SZXREYXRhRXJySWYoWmVyb3NMZWZ0ID09QVJNX05PX0NPREVCT09LX0lOREVYICwgT01YX1N0c19FcnIpOwotCSAgICB9Ci0gICAgfQotCi0gICAgREVCVUdfUFJJTlRGXzEoIlRvdGFsWmVyb3MgPSAlZFxuIiwgWmVyb3NMZWZ0KTsKLQotCUNvZWZmTnVtPVplcm9zTGVmdCtUb3RhbENvZWZmLTE7Ci0KLSAgICBmb3IgKGk9VG90YWxDb2VmZi0xOyBpPjA7IGktLSkKLSAgICB7Ci0gICAgICAgIFJ1biA9IDA7Ci0gICAgICAgIGlmIChaZXJvc0xlZnQgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgVGFibGUgPSBaZXJvc0xlZnQ7Ci0gICAgICAgICAgICBpZiAoVGFibGUgPiA2KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFRhYmxlID0gNzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFJ1biA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzW1RhYmxlLTFdKTsKLSAgICAgICAgICAgIGFybVJldERhdGFFcnJJZihSdW4gPT0gQVJNX05PX0NPREVCT09LX0lOREVYLCBPTVhfU3RzX0Vycik7Ci0gICAgICAgIH0KLSAgICAgICAgcFJ1bltpXSA9IChPTVhfVTgpUnVuOwotCi0gICAgICAgIERFQlVHX1BSSU5URl8yKCJSdW5bJWRdID0gJWRcbiIsIGksIHBSdW5baV0pOwotCi0gICAgICAgIFplcm9zTGVmdCAtPSBSdW47Ci0gICAgfQotICAgIHBSdW5bMF0gPSAoT01YX1U4KVplcm9zTGVmdDsKLQotICAgIERFQlVHX1BSSU5URl8xKCJSdW5bMF0gPSAlZFxuIiwgcFJ1bltpXSk7Ci0KLQotICAgIC8qIEZpbGwgaW4gY29lZmZpY2llbnRzICovCi0JICAgIAotICAgIGlmIChzTWF4TnVtQ29lZmY9PTE1KQotICAgIHsKLSAgICAgICAgQ29lZmZOdW0rKzsgLyogU2tpcCB0aGUgREMgcG9zaXRpb24gKi8KLSAgICB9Ci0JCi0JLypmb3IgKGk9MDtpPFRvdGFsQ29lZmY7aSsrKQotCQlDb2VmZk51bSArPSBwUnVuW2ldKzE7Ki8KLSAgICAKLQlmb3IgKGk9KFRvdGFsQ29lZmYtMSk7IGk+PTA7IGktLSkKLSAgICB7Ci0gICAgICAgIC8qQ29lZmZOdW0gKz0gcFJ1bltpXSsxOyovCi0gICAgICAgIExldmVsICAgICA9IHBMZXZlbFtpXTsKLQotICAgICAgICBERUJVR19QUklOVEZfMigiQ29lZlslZF0gPSAlZFxuIiwgQ29lZmZOdW0sIExldmVsKTsKLQotICAgICAgICBGbGFncyA9IENvZWZmTnVtOwotCQlDb2VmZk51bSAtPSAocFJ1bltpXSsxKTsKLSAgICAgICAgaWYgKHNNYXhOdW1Db2VmZj40KQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBQZXJmb3JtIDR4NCBEZVppZ1phZyAqLwotICAgICAgICAgICAgRmxhZ3MgPSBhcm1WQ000UDEwX1ppZ1phZ1tGbGFnc107Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGk9PTApCi0gICAgICAgIHsgICAKLSAgICAgICAgICAgIC8qIEVuZCBvZiBibG9jayBmbGFnICovCi0gICAgICAgICAgICBGbGFncyArPSAweDIwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChMZXZlbDwtMTI4IHx8IExldmVsPjEyNykKLSAgICAgICAgewotICAgICAgICAgICAgLyogT3ZlcmZsb3cgZmxhZyAqLwotICAgICAgICAgICAgRmxhZ3MgKz0gMHgxMDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgKnBQb3NDb2VmYnVmKysgPSAoT01YX1U4KShGbGFncyk7Ci0gICAgICAgICpwUG9zQ29lZmJ1ZisrID0gKE9NWF9VOCkoTGV2ZWwgJiAweEZGKTsKLSAgICAgICAgaWYgKEZsYWdzICYgMHgxMCkKLSAgICAgICAgewotICAgICAgICAgICAgKnBQb3NDb2VmYnVmKysgPSAoT01YX1U4KShMZXZlbD4+OCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAqcHBQb3NDb2VmYnVmID0gcFBvc0NvZWZidWY7Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlcy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNmNlZjMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlcXVhbnRUYWJsZXMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGludmVyc2UgcXVhbnRpemUgdGFibGVzCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFsxNl0gPSAKLXsKLSAgICAwLCAyLCAwLCAyLAotICAgIDIsIDEsIDIsIDEsCi0gICAgMCwgMiwgMCwgMiwKLSAgICAyLCAxLCAyLCAxCi19OwotCi1jb25zdCBPTVhfVTggYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDJbNF0gPSAKLXsKLSAgICAwLCAyLAotICAgIDIsIDEKLX07Ci0KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ZNYXRyaXhbNl1bM10gPQotewotICAgIHsgMTAsIDE2LCAxMyB9LAotICAgIHsgMTEsIDE4LCAxNCB9LAotICAgIHsgMTMsIDIwLCAxNiB9LAotICAgIHsgMTQsIDIzLCAxOCB9LAotICAgIHsgMTYsIDI1LCAyMCB9LAotICAgIHsgMTgsIDI5LCAyMyB9Ci19OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9Gd2RUcmFuc2Zvcm1SZXNpZHVhbDR4NC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9Gd2RUcmFuc2Zvcm1SZXNpZHVhbDR4NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2Q2YzBmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRndkVHJhbnNmb3JtUmVzaWR1YWw0eDQuYworKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfRndkVHJhbnNmb3JtUmVzaWR1YWw0eDQuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IHRyYW5zZm9ybSBtb2R1bGUKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0gCi0vKgotICogRGVzY3JpcHRpb246Ci0gKiBGb3J3YXJkIFRyYW5zZm9ybSBSZXNpZHVhbCA0eDQgQ29lZmZpY2llbnRzCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIHBTcmMJCVNvdXJjZSA0eDQgYmxvY2sKLSAqIFtvdXRdIHBEc3QJCURlc3RpbmF0aW9uIDR4NCBibG9jawotICoKLSAqLwotdm9pZCBhcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0KE9NWF9TMTYqIHBEc3QsIE9NWF9TMTYgKnBTcmMpCi17Ci0gICAgaW50IGk7Ci0KLSAgICAvKiBUcmFuc2Zvcm0gcm93cyAqLwotICAgIGZvciAoaT0wOyBpPDE2OyBpKz00KQotICAgIHsKLSAgICAgICAgaW50IGQwID0gcFNyY1tpKzBdOwotICAgICAgICBpbnQgZDEgPSBwU3JjW2krMV07Ci0gICAgICAgIGludCBkMiA9IHBTcmNbaSsyXTsKLSAgICAgICAgaW50IGQzID0gcFNyY1tpKzNdOwotICAgICAgICBpbnQgZTAgPSBkMCArIGQzOwotICAgICAgICBpbnQgZTEgPSBkMCAtIGQzOwotICAgICAgICBpbnQgZTIgPSBkMSArIGQyOwotICAgICAgICBpbnQgZTMgPSBkMSAtIGQyOwotICAgICAgICBpbnQgZjAgPSBlMCArIGUyOwotICAgICAgICBpbnQgZjEgPSAoZTEgPDwgMSkgKyBlMzsKLSAgICAgICAgaW50IGYyID0gZTAgLSBlMjsKLSAgICAgICAgaW50IGYzID0gZTEgLSAoZTMgPDwgMSk7Ci0gICAgICAgIHBEc3RbaSswXSA9IChPTVhfUzE2KWYwOwotICAgICAgICBwRHN0W2krMV0gPSAoT01YX1MxNilmMTsKLSAgICAgICAgcERzdFtpKzJdID0gKE9NWF9TMTYpZjI7Ci0gICAgICAgIHBEc3RbaSszXSA9IChPTVhfUzE2KWYzOwotICAgIH0KLQotICAgIC8qIFRyYW5zZm9ybSBjb2x1bW5zICovCi0gICAgZm9yIChpPTA7IGk8NDsgaSsrKQotICAgIHsKLSAgICAgICAgaW50IGYwID0gcERzdFtpKzBdOwotICAgICAgICBpbnQgZjEgPSBwRHN0W2krNF07Ci0gICAgICAgIGludCBmMiA9IHBEc3RbaSs4XTsKLSAgICAgICAgaW50IGYzID0gcERzdFtpKzEyXTsKLSAgICAgICAgaW50IGcwID0gZjAgKyBmMzsKLSAgICAgICAgaW50IGcxID0gZjAgLSBmMzsKLSAgICAgICAgaW50IGcyID0gZjEgKyBmMjsKLSAgICAgICAgaW50IGczID0gZjEgLSBmMjsKLSAgICAgICAgaW50IGgwID0gZzAgKyBnMjsKLSAgICAgICAgaW50IGgxID0gKGcxIDw8IDEpICsgZzM7Ci0gICAgICAgIGludCBoMiA9IGcwIC0gZzI7Ci0gICAgICAgIGludCBoMyA9IGcxIC0gKGczIDw8IDEpOwotICAgICAgICBwRHN0W2krMF0gPSAoT01YX1MxNikgaDA7Ci0gICAgICAgIHBEc3RbaSs0XSA9IChPTVhfUzE2KSBoMTsKLSAgICAgICAgcERzdFtpKzhdID0gKE9NWF9TMTYpIGgyOwotICAgICAgICBwRHN0W2krMTJdID0gKE9NWF9TMTYpIGgzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTlkZjQ5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbnMgd2lsbCBoZWxwIHRvIGNhbGN1bGF0ZSBIYWxmIFBlbCBsdW1hIGludGVycG9sYXRpb24KLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYQotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgKDEvMiwgMS8yKSAgcG9zaXRpb25zIAotICogYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiAgW2luXSAgICBwU3JjICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAotICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKLSAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCi0gKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW291dF0gICBwRHN0ICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgKDEvMiwxLzIpLXBlbAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hKCAgCi0gICAgICAgIGNvbnN0IE9NWF9VOCogICAgIHBTcmMsIAotICAgICAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwgCi0gICAgICAgIE9NWF9VOCogICAgIHBEc3QsIAotICAgICAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwKLSAgICAgICAgT01YX1UzMiAgICAgaVdpZHRoLCAKLSAgICAgICAgT01YX1UzMiAgICAgaUhlaWdodAotKQotewotICAgIE9NWF9TMzIgICAgIEhhbGZDb2VmZiwgcG9zOwotICAgIE9NWF9TMTYgICAgIEJ1ZiBbMjEgKiAxNl07ICAvKiAyMSByb3dzIGJ5IDE2IHBpeGVscyBwZXIgcm93ICovCi0gICAgT01YX1UzMiAgICAgeSwgeDsKLQotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIC8qCi0gICAgICogSW50ZXJtZWRpYXRlIHZhbHVlcyB3aWxsIGJlIDEvMiBwZWwgYXQgSG9yaXpvbnRhbCBkaXJlY3Rpb24KLSAgICAgKiBTdGFydGluZyBhdCAoMC41LCAtMikgYXQgdG9wIGV4dGVuZGluZyB0byAoMC41LCBoZWlnaHQgKyAzKSBhdCBib3R0b20KLSAgICAgKiBCdWYgY29udGFpbnMgYSAyRCBhcnJheSBvZiBzaXplIChpV2lkdGgpWChpSGVpZ2h0ICsgNSkKLSAgICAgKi8KLSAgICBmb3IgKHkgPSAwOyB5IDwgaUhlaWdodCArIDU7IHkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCBpV2lkdGg7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgcG9zID0gKHktMikgKiBpU3JjU3RlcCArIHg7Ci0gICAgICAgICAgICBIYWxmQ29lZmYgPSAKLSAgICAgICAgICAgICAgICBwU3JjIFtwb3MgLSAyXSAtIAotICAgICAgICAgICAgICAgIDUgKiBwU3JjIFtwb3MgLSAxXSArIAotICAgICAgICAgICAgICAgIDIwICogcFNyYyBbcG9zXSArIAotICAgICAgICAgICAgICAgIDIwICogcFNyYyBbcG9zICsgMV0gLSAKLSAgICAgICAgICAgICAgICA1ICogcFNyYyBbcG9zICsgMl0gKyAKLSAgICAgICAgICAgICAgICBwU3JjIFtwb3MgKyAzXTsKLSAgICAgICAgICAgIEJ1ZiBbeSAqIGlXaWR0aCArIHhdID0gKE9NWF9TMTYpSGFsZkNvZWZmOwotICAgICAgICB9IC8qIHggKi8KLSAgICB9IC8qIHkgKi8KLQotICAgIC8qIFZlcnRpY2FsIGludGVycG9sYXRlICovCi0gICAgZm9yICh5ID0gMDsgeSA8IGlIZWlnaHQ7IHkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCBpV2lkdGg7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgcG9zID0geSAqIGlXaWR0aCArIHg7Ci0gICAgICAgICAgICBIYWxmQ29lZmYgPSAKLSAgICAgICAgICAgICAgICBCdWYgW3Bvc10gLSAKLSAgICAgICAgICAgICAgICA1ICogQnVmIFtwb3MgKyAxICogaVdpZHRoXSArIAotICAgICAgICAgICAgICAgIDIwICogQnVmIFtwb3MgKyAyICogaVdpZHRoXSArIAotICAgICAgICAgICAgICAgIDIwICogQnVmIFtwb3MgKyAzICogaVdpZHRoXSAtIAotICAgICAgICAgICAgICAgIDUgKiBCdWYgW3BvcyArIDQgKiBpV2lkdGhdICsgCi0gICAgICAgICAgICAgICAgQnVmIFtwb3MgKyA1ICogaVdpZHRoXTsKLQotICAgICAgICAgICAgSGFsZkNvZWZmID0gKEhhbGZDb2VmZiArIDUxMikgPj4gMTA7Ci0gICAgICAgICAgICBIYWxmQ29lZmYgPSBhcm1DbGlwKDAsIDI1NSwgSGFsZkNvZWZmKTsKLQotICAgICAgICAgICAgcERzdCBbeSAqIGlEc3RTdGVwICsgeF0gPSAoT01YX1U4KSBIYWxmQ29lZmY7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgIAotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTQ2MmIyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYworKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbnMgd2lsbCBoZWxwIHRvIGNhbGN1bGF0ZSBIYWxmIFBlbCBsdW1hIGludGVycG9sYXRpb24KLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBob3Jpem9udGFsIDEvMi1wZWwgcG9zaXRpb25zCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiAgW2luXSAgICBwU3JjICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAotICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKLSAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCi0gKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW291dF0gICBwRHN0ICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgMS8yLXBlbCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hKAotICAgICAgICBjb25zdCBPTVhfVTgqICAgICBwU3JjLCAKLSAgICAgICAgT01YX1UzMiAgICAgaVNyY1N0ZXAsIAotICAgICAgICBPTVhfVTgqICAgICBwRHN0LCAKLSAgICAgICAgT01YX1UzMiAgICAgaURzdFN0ZXAsIAotICAgICAgICBPTVhfVTMyICAgICBpV2lkdGgsIAotICAgICAgICBPTVhfVTMyICAgICBpSGVpZ2h0Ci0pCi17Ci0gICAgT01YX0lOVCAgICAgeCwgeTsKLSAgICBPTVhfUzMyICAgICBIYWxmQ29lZmYsIHBvczsKLQotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIGZvciAoeSA9IDA7IHkgPCBpSGVpZ2h0OyB5KyspCi0gICAgewotICAgICAgICBmb3IgKHggPSAwOyB4IDwgaVdpZHRoOyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBvcyA9IHkgKiBpU3JjU3RlcCArIHg7Ci0gICAgICAgICAgICBIYWxmQ29lZmYgPSAKLSAgICAgICAgICAgICAgICBwU3JjIFtwb3MgLSAyXSAtIAotICAgICAgICAgICAgICAgIDUgKiBwU3JjIFtwb3MgLSAxXSArIAotICAgICAgICAgICAgICAgIDIwICogcFNyYyBbcG9zXSArIAotICAgICAgICAgICAgICAgIDIwICogcFNyYyBbcG9zICsgMV0gLSAKLSAgICAgICAgICAgICAgICA1ICogcFNyYyBbcG9zICsgMl0gKyAKLSAgICAgICAgICAgICAgICBwU3JjIFtwb3MgKyAzXTsKLQotICAgICAgICAgICAgSGFsZkNvZWZmID0gKEhhbGZDb2VmZiArIDE2KSA+PiA1OwotICAgICAgICAgICAgSGFsZkNvZWZmID0gYXJtQ2xpcCgwLCAyNTUsIEhhbGZDb2VmZik7Ci0KLSAgICAgICAgICAgIHBEc3QgW3kgKiBpRHN0U3RlcCArIHhdID0gSGFsZkNvZWZmOwotICAgICAgICB9IC8qIHggKi8KLSAgICB9IC8qIHkgKi8KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YWRmNDUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9ucyB3aWxsIGhlbHAgdG8gY2FsY3VsYXRlIEhhbGYgUGVsIGx1bWEgaW50ZXJwb2xhdGlvbgotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB2ZXJ0aWNhbCAxLzItcGVsIHBvc2l0aW9ucyAKLSAqIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogIFtpbl0gICAgcFNyYyAgICAgICAgUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSAKLSAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCi0gKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgotICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyLgotICogIFtpbl0gICAgaVdpZHRoICAgICAgV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbaW5dICAgIGlIZWlnaHQgICAgIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jawotICogIFtvdXRdICAgcERzdCAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIDEvMi1wZWwKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hKCAgIAotICAgICBjb25zdCBPTVhfVTgqICAgIHBTcmMsIAotICAgICBPTVhfVTMyICAgIGlTcmNTdGVwLCAKLSAgICAgT01YX1U4KiAgICBwRHN0LAotICAgICBPTVhfVTMyICAgIGlEc3RTdGVwLCAKLSAgICAgT01YX1UzMiAgICBpV2lkdGgsIAotICAgICBPTVhfVTMyICAgIGlIZWlnaHQKLSkKLXsKLSAgICBPTVhfUzMyICAgICBIYWxmQ29lZmYsIHBvczsKLSAgICBPTVhfSU5UICAgICB5LCB4OwotCi0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0KLSAgICBmb3IgKHkgPSAwOyB5IDwgaUhlaWdodDsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IGlXaWR0aDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwb3MgPSB5ICogaVNyY1N0ZXAgKyB4OwotICAgICAgICAgICAgSGFsZkNvZWZmID0gCi0gICAgICAgICAgICAgICAgcFNyYyBbcG9zIC0gMiAqIGlTcmNTdGVwXSAtIAotICAgICAgICAgICAgICAgIDUgKiBwU3JjIFtwb3MgLSAxICogaVNyY1N0ZXBdICsgCi0gICAgICAgICAgICAgICAgMjAgKiBwU3JjIFtwb3NdICsgCi0gICAgICAgICAgICAgICAgMjAgKiBwU3JjIFtwb3MgKyAxICogaVNyY1N0ZXBdIC0gCi0gICAgICAgICAgICAgICAgNSAqIHBTcmMgW3BvcyArIDIgKiBpU3JjU3RlcF0gKyAKLSAgICAgICAgICAgICAgICBwU3JjIFtwb3MgKyAzICogaVNyY1N0ZXBdOwotCi0gICAgICAgICAgICBIYWxmQ29lZmYgPSAoSGFsZkNvZWZmICsgMTYpID4+IDU7Ci0gICAgICAgICAgICBIYWxmQ29lZmYgPSBhcm1DbGlwKDAsIDI1NSwgSGFsZkNvZWZmKTsKLQotICAgICAgICAgICAgcERzdCBbeSAqIGlEc3RTdGVwICsgeF0gPSAoT01YX1U4KSBIYWxmQ29lZmY7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjczMGY4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBpbnRlcnBvbGF0aW9uIGZvciBjaHJvbWEgY29tcG9uZW50cwotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGNocm9tYSBjb21wb25lbnRzLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogIFtpbl0gICAgcFNyYyAgICAgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZSBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQotICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbaW5dICAgIGR4ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvOCBwaXhlbCB1bml0ICgwfjcpIAotICogIFtpbl0gICAgZHkgICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvOCBwaXhlbCB1bml0ICgwfjcpCi0gKiAgW291dF0gICBwRHN0ICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi0gT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hKAotICAgICAgICBPTVhfVTggICAgICAqcFNyYywKLSAgICAgICAgT01YX1UzMiAgICAgaVNyY1N0ZXAsCi0gICAgICAgIE9NWF9VOCAgICAgICpwRHN0LAotICAgICAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwKLSAgICAgICAgT01YX1UzMiAgICAgaVdpZHRoLAotICAgICAgICBPTVhfVTMyICAgICBpSGVpZ2h0LAotICAgICAgICBPTVhfVTMyICAgICBkeCwKLSAgICAgICAgT01YX1UzMiAgICAgZHkKLSkKLXsKLSAgICBPTVhfVTMyICAgICBFaWdodE1pbnVzZHggPSA4IC0gZHg7Ci0gICAgT01YX1UzMiAgICAgRWlnaHRNaW51c2R5ID0gOCAtIGR5OwotICAgIE9NWF9VMzIgICAgIEFDb2VmZiwgQkNvZWZmLCBDQ29lZmYsIERDb2VmZjsKLSAgICBPTVhfVTMyICAgICB4LCB5OwotCi0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGR4ID4gNywgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoZHkgPiA3LCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihpU3JjU3RlcCA9PSAwLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihpRHN0U3RlcCA9PSAwLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihpV2lkdGggPT0gMCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoaUhlaWdodCA9PSAwLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICAKLSAgICAvKiBpZiBmcmFjdGlvbmwgbXYgaXMgbm90ICgwLCAwKSAqLwotICAgIGlmIChkeCAhPSAwIHx8IGR5ICE9IDApCi0gICAgewotICAgICAgICBBQ29lZmYgPSBFaWdodE1pbnVzZHggKiBFaWdodE1pbnVzZHk7Ci0gICAgICAgIEJDb2VmZiA9IGR4ICogRWlnaHRNaW51c2R5OwotICAgICAgICBDQ29lZmYgPSBFaWdodE1pbnVzZHggKiBkeTsKLSAgICAgICAgRENvZWZmID0gZHggKiBkeTsKLQotICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaUhlaWdodDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgaVdpZHRoOyB4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcERzdCBbeSAqIGlEc3RTdGVwICsgeF0gPSAoCi0gICAgICAgICAgICAgICAgICAgIEFDb2VmZiAqIHBTcmMgW3kgKiBpU3JjU3RlcCArIHhdICsKLSAgICAgICAgICAgICAgICAgICAgQkNvZWZmICogcFNyYyBbeSAqIGlTcmNTdGVwICsgeCArIDFdICsKLSAgICAgICAgICAgICAgICAgICAgQ0NvZWZmICogcFNyYyBbKHkgKyAxKSAqIGlTcmNTdGVwICsgeF0gKwotICAgICAgICAgICAgICAgICAgICBEQ29lZmYgKiBwU3JjIFsoeSArIDEpICogaVNyY1N0ZXAgKyB4ICsgMV0gKwotICAgICAgICAgICAgICAgICAgICAzMikgPj4gNjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaUhlaWdodDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgaVdpZHRoOyB4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcERzdCBbeSAqIGlEc3RTdGVwICsgeF0gPSBwU3JjIFt5ICogaVNyY1N0ZXAgKyB4XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM4ZDYyZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEuYworKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBpbnRlcnBvbGF0aW9uIGZvciBsdW1hIGNvbXBvbmVudHMKLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtTTRQMTBfQ29weQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBjb3B5IGEgYmxvY2sgb2YgZGF0YSBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogIFtpbl0gICAgcFNyYyAgICAgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrCi0gKiAgW2luXSAgICBpU3JjU3RlcCAgICBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgotICogIFtpbl0gICAgaURzdFN0ZXAgICAgU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbb3V0XSAgIHBEc3QgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlcgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KLSAqCi0gKi8KLXN0YXRpYyBPTVhSZXN1bHQgYXJtTTRQMTBfQ29weSggIAotICAgIGNvbnN0IE9NWF9VOCogICAgIHBTcmMsCi0gICAgT01YX1UzMiAgICAgaVNyY1N0ZXAsCi0gICAgT01YX1U4KiAgICAgcERzdCwKLSAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwgCi0gICAgT01YX1UzMiAgICAgaVdpZHRoLAotICAgIE9NWF9VMzIgICAgIGlIZWlnaHQKLSkKLXsKLSAgICBPTVhfVTMyICAgICB4LCB5OwotCi0gICAgZm9yICh5ID0gMDsgeSA8IGlIZWlnaHQ7IHkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCBpV2lkdGg7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgcERzdCBbeSAqIGlEc3RTdGVwICsgeF0gPSBwU3JjIFt5ICogaVNyY1N0ZXAgKyB4XTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgbHVtYSBjb21wb25lbnRzLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogIFtpbl0gICAgcFNyYyAgICAgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZSBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQotICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KLSAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCi0gKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqICBbaW5dICAgIGR4ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0ICgwfjMpIAotICogIFtpbl0gICAgZHkgICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0ICgwfjMpIAotICogIFtvdXRdICAgcERzdCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgotICoKLSAqLwotCi0gT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYSgKLSAgICAgY29uc3QgT01YX1U4ICAgICAqcFNyYywKLSAgICAgT01YX1UzMiAgICBpU3JjU3RlcCwKLSAgICAgT01YX1U4ICAgICAqcERzdCwKLSAgICAgT01YX1UzMiAgICBpRHN0U3RlcCwKLSAgICAgT01YX1UzMiAgICBpV2lkdGgsCi0gICAgIE9NWF9VMzIgICAgaUhlaWdodCwKLSAgICAgT01YX1UzMiAgICBkeCwKLSAgICAgT01YX1UzMiAgICBkeQotKQotewotICAgIE9NWF9VOCAgICAgIHBCdWYxIFsxNioxNl07Ci0gICAgY29uc3QgT01YX1U4ICAgICAgKnBTcmNIYWxmSG9yID0gcFNyYzsKLSAgICBjb25zdCBPTVhfVTggICAgICAqcFNyY0hhbGZWZXIgPSBwU3JjOwotCi0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGR4ID4gMywgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoZHkgPiAzLCBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIC8qIFdvcmsgb3V0IHBvc2l0aW9ucyBmb3IgaGFsZiBwaXhlbCBpbnRlcnBvbGF0aW9uICovCi0gICAgaWYgKGR4ID09IDMpCi0gICAgewotICAgICAgICBwU3JjSGFsZlZlciArPSAxOwotICAgIH0KLSAgICBpZiAoZHkgPT0gMykKLSAgICB7Ci0gICAgICAgIHBTcmNIYWxmSG9yICs9IGlTcmNTdGVwOwotICAgIH0KLQotICAgIC8qIFN3aXRjaCBvbiB0eXBlIG9mIHBpeGVsCi0gICAgICogUGl4ZWxzIGFyZSBuYW1lZCAnYScgdG8gJ3MnIGFzIGluIHRoZSBILjI2NCBzdGFuZGFyZAotICAgICAqLwotICAgIGlmIChkeCA9PSAwICYmIGR5ID09IDApCi0gICAgewotICAgICAgICAvKiBHICovCi0gICAgICAgIGFybU00UDEwX0NvcHkocFNyYywgaVNyY1N0ZXAsIHBEc3QsIGlEc3RTdGVwLCBpV2lkdGgsIGlIZWlnaHQpOwotICAgIH0KLSAgICBlbHNlIGlmIChkeSA9PSAwKQotICAgIHsKLSAgICAgICAgLyogYSwgYiwgYyAqLwotICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hCi0gICAgICAgICAgICAocFNyY0hhbGZIb3IsIGlTcmNTdGVwLCBwRHN0LCBpRHN0U3RlcCwgaVdpZHRoLCBpSGVpZ2h0KTsgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIGlmIChkeCA9PSAxIHx8IGR4ID09IDMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFybVZDQ09NTV9BdmVyYWdlIAotICAgICAgICAgICAgICAgIChwRHN0LCBwU3JjSGFsZlZlciwgaURzdFN0ZXAsIGlTcmNTdGVwLCBwRHN0LCBpRHN0U3RlcCwgaVdpZHRoLCBpSGVpZ2h0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChkeCA9PSAwKQotICAgIHsKLSAgICAgICAgLyogZCwgaCwgbiAqLwotICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hCi0gICAgICAgICAgICAocFNyY0hhbGZWZXIsIGlTcmNTdGVwLCBwRHN0LCBpRHN0U3RlcCwgaVdpZHRoLCBpSGVpZ2h0KTsKLQotICAgICAgICBpZiAoZHkgPT0gMSB8fCBkeSA9PSAzKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcm1WQ0NPTU1fQXZlcmFnZSAKLSAgICAgICAgICAgICAgICAocERzdCwgcFNyY0hhbGZIb3IsIGlEc3RTdGVwLCBpU3JjU3RlcCwgcERzdCwgaURzdFN0ZXAsIGlXaWR0aCwgaUhlaWdodCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZHggPT0gMiB8fCBkeSA9PSAyKQotICAgIHsKLSAgICAgICAgLyogaiAqLwotICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYQotICAgICAgICAgICAgKHBTcmMsIGlTcmNTdGVwLCBwRHN0LCBpRHN0U3RlcCwgaVdpZHRoLCBpSGVpZ2h0KTsKLQotICAgICAgICBpZiAoZHggPT0gMSB8fCBkeCA9PSAzKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBpLCBrICovCi0gICAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hCi0gICAgICAgICAgICAgICAgKHBTcmNIYWxmVmVyLCBpU3JjU3RlcCwgcEJ1ZjEsIGlXaWR0aCwgaVdpZHRoLCBpSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGFybVZDQ09NTV9BdmVyYWdlIAotICAgICAgICAgICAgICAgIChwRHN0LCBwQnVmMSwgaURzdFN0ZXAsIGlXaWR0aCwgcERzdCwgaURzdFN0ZXAsIGlXaWR0aCwgaUhlaWdodCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGR5ID09IDEgfHwgZHkgPT0gMykKLSAgICAgICAgewotICAgICAgICAgICAgLyogZixxICovCi0gICAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hCi0gICAgICAgICAgICAgICAgKHBTcmNIYWxmSG9yLCBpU3JjU3RlcCwgcEJ1ZjEsIGlXaWR0aCwgaVdpZHRoLCBpSGVpZ2h0KTsKLQotICAgICAgICAgICAgYXJtVkNDT01NX0F2ZXJhZ2UgCi0gICAgICAgICAgICAgICAgKHBEc3QsIHBCdWYxLCBpRHN0U3RlcCwgaVdpZHRoLCBwRHN0LCBpRHN0U3RlcCwgaVdpZHRoLCBpSGVpZ2h0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIC8qIGR4PTEsMyBhbmQgZHk9MSwzICovCi0gICAgewotICAgICAgICAvKiBlLCBnLCBwLCByICovCi0gICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEKLSAgICAgICAgICAgIChwU3JjSGFsZkhvciwgaVNyY1N0ZXAsIHBCdWYxLCBpV2lkdGgsIGlXaWR0aCwgaUhlaWdodCk7Ci0KLSAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYQotICAgICAgICAgICAgKHBTcmNIYWxmVmVyLCBpU3JjU3RlcCwgcERzdCwgaURzdFN0ZXAsIGlXaWR0aCwgaUhlaWdodCk7Ci0KLSAgICAgICAgYXJtVkNDT01NX0F2ZXJhZ2UgCi0gICAgICAgICAgICAocEJ1ZjEsIHBEc3QsIGlXaWR0aCwgaURzdFN0ZXAsIHBEc3QsIGlEc3RTdGVwLCBpV2lkdGgsIGlIZWlnaHQpOwotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIwMGQ1NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDNHg0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQzR4NC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgNHg0IGludHJhIHByZWRpY3Rpb24gbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtIERDIHN0eWxlIGludHJhIHByZWRpY3Rpb24sIGF2ZXJhZ2luZyB1cHBlciBhbmQgbGVmdCBibG9jawotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBTcmNMZWZ0CQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgbGVmdCBjb2VmZmljaWVudHM6Ci0gKgkJCQkJCQkJcFt4LCB5XSAoeCA9IC0xLCB5ID0gMC4uMykKLSAqIFtpbl0JcFNyY0Fib3ZlCQlQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgYWJvdmUgY29lZmZpY2llbnRzOgotICoJCQkJCQkJCXBbeCx5XSAoeCA9IDAuLjMsIHkgPSAtMSkKLSAqIFtpbl0JbGVmdFN0ZXAJCVN0ZXAgb2YgbGVmdCBjb2VmZmljaWVudCBidWZmZXIKLSAqIFtpbl0JZHN0U3RlcAkJCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICogW2luXQlhdmFpbGFiaWxpdHkJTmVpZ2hib3JpbmcgMTZ4MTYgTUIgYXZhaWxhYmlsaXR5IGZsYWcKLSAqIFtvdXRdCXBEc3QJCQlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBOb25lCi0gKi8KLQotdm9pZCBhcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDNHg0KAotICAgICBjb25zdCBPTVhfVTgqIHBTcmNMZWZ0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwKLSAgICAgT01YX1U4KiBwRHN0LAotICAgICBPTVhfSU5UIGxlZnRTdGVwLAotICAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5ICAgICAgICAKLSkKLXsKLSAgICBpbnQgeCwgeSwgU3VtPTAsIENvdW50ID0gMDsKLQotICAgIGlmIChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCkKLSAgICB7Ci0gICAgICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgU3VtICs9IHBTcmNMZWZ0W3kqbGVmdFN0ZXBdOwotICAgICAgICB9Ci0gICAgICAgIENvdW50Kys7Ci0gICAgfQotICAgIGlmIChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpCi0gICAgewotICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN1bSArPSBwU3JjQWJvdmVbeF07Ci0gICAgICAgIH0KLSAgICAgICAgQ291bnQrKzsKLSAgICB9Ci0gICAgaWYgKENvdW50PT0wKQotICAgIHsKLSAgICAgICAgU3VtID0gMTI4OwotICAgIH0KLSAgICBlbHNlIGlmIChDb3VudD09MSkKLSAgICB7Ci0gICAgICAgIFN1bSA9IChTdW0gKyAyKSA+PiAyOwotICAgIH0KLSAgICBlbHNlIC8qIENvdW50ID0gMiAqLwotICAgIHsKLSAgICAgICAgU3VtID0gKFN1bSArIDQpID4+IDM7Ci0gICAgfQotICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSAoT01YX1U4KVN1bTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAxZDRmNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1F1YW50VGFibGVzLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBpbnZlcnNlIHF1YW50aXplIHRhYmxlcwotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotCi1jb25zdCBPTVhfVTMyIGFybVZDTTRQMTBfTUZNYXRyaXhbNl1bM10gPQotewotICAgIHsxMzEwNywgNTI0MywgODA2Nn0sCi0gICAgezExOTE2LCA0NjYwLCA3NDkwfSwKLSAgICB7MTAwODIsIDQxOTQsIDY1NTR9LAotICAgIHsgOTM2MiwgMzY0NywgNTgyNX0sCi0gICAgeyA4MTkyLCAzMzU1LCA1MjQzfSwKLSAgICB7IDcyODIsIDI4OTMsIDQ1NTl9Ci19OyAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfU0FEUXVhci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9TQURRdWFyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZjhhZjUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9TQURRdWFyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9TQURRdWFyLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBTQUQgb2YgcFNyYyB3aXRoIGF2ZXJhZ2Ugb2YgdHdvIFJlZiBibG9ja3MKLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfU0FEUXVhcgotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgCi0gKiBhdmVyYWdlIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFtpbl0JCXBTcmMJCQkJUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2sKLSAqIFtpbl0JCXBTcmNSZWYwCQlQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwCi0gKiBbaW5dCQlwU3JjUmVmMQkJUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMQotICogW2luXQkJaVNyY1N0ZXAgCQlTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXIKLSAqIFtpbl0JCWlSZWZTdGVwMAkJU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqIFtpbl0JCWlSZWZTdGVwMSAJU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqIFtpbl0JCWlIZWlnaHQJCQlIZWlnaHQgb2YgdGhlIGJsb2NrCi0gKiBbaW5dCQlpV2lkdGgJCQlXaWR0aCBvZiB0aGUgYmxvY2sKLSAqIFtvdXRdCXBEc3RTQUQJCQlQb2ludGVyIG9mIHJlc3VsdCBTQUQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCi0gKgotICovCi1PTVhSZXN1bHQgYXJtVkNNNFAxMF9TQURRdWFyKAotCWNvbnN0IE9NWF9VOCogCXBTcmMsCi0gICAgY29uc3QgT01YX1U4KiAJcFNyY1JlZjAsCi0JY29uc3QgT01YX1U4KiAJcFNyY1JlZjEsCQotICAgIE9NWF9VMzIgCWlTcmNTdGVwLAotICAgIE9NWF9VMzIJCWlSZWZTdGVwMCwKLSAgICBPTVhfVTMyCQlpUmVmU3RlcDEsCi0gICAgT01YX1UzMioJcERzdFNBRCwKLSAgICBPTVhfVTMyICAgICBpSGVpZ2h0LAotICAgIE9NWF9VMzIgICAgIGlXaWR0aAotKQotewotICAgIE9NWF9JTlQgICAgIHgsIHk7Ci0gICAgT01YX1MzMiAgICAgU0FEID0gMDsKLQotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZjAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZjEgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIGZvciAoeSA9IDA7IHkgPCBpSGVpZ2h0OyB5KyspCi0gICAgewotICAgICAgICBmb3IgKHggPSAwOyB4IDwgaVdpZHRoOyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNBRCArPSBhcm1BYnMocFNyYyBbeSAqIGlTcmNTdGVwICsgeF0gLSAoKAotICAgICAgICAgICAgICAgICAgICBwU3JjUmVmMCBbeSAqIGlSZWZTdGVwMCArIHhdICsgCi0gICAgICAgICAgICAgICAgICAgIHBTcmNSZWYxIFt5ICogaVJlZlN0ZXAxICsgeF0gKyAxKSA+PiAxKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgIAotICAgICpwRHN0U0FEID0gU0FEOwotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNTM3MzEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgdHJhbnNmb3JtIG1vZHVsZQotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSAKLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRyYW5zZm9ybSBSZXNpZHVhbCA0eDQgQ29lZmZpY2llbnRzCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gIHBTcmMJCVNvdXJjZSA0eDQgYmxvY2sKLSAqIFtvdXRdIHBEc3QJCURlc3RpbmF0aW9uIDR4NCBibG9jawotICoKLSAqLwotCi12b2lkIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQoT01YX1MxNiogcERzdCwgT01YX1MxNiAqcFNyYykKLXsKLSAgICBpbnQgaTsKLQotICAgIC8qIFRyYW5zZm9ybSByb3dzICovCi0gICAgZm9yIChpPTA7IGk8MTY7IGkrPTQpCi0gICAgewotICAgICAgICBpbnQgZDAgPSBwU3JjW2krMF07Ci0gICAgICAgIGludCBkMSA9IHBTcmNbaSsxXTsKLSAgICAgICAgaW50IGQyID0gcFNyY1tpKzJdOwotICAgICAgICBpbnQgZDMgPSBwU3JjW2krM107Ci0gICAgICAgIGludCBlMCA9IGQwICsgZDI7Ci0gICAgICAgIGludCBlMSA9IGQwIC0gZDI7Ci0gICAgICAgIGludCBlMiA9IChkMT4+MSkgLSBkMzsKLSAgICAgICAgaW50IGUzID0gZDEgKyAoZDM+PjEpOwotICAgICAgICBpbnQgZjAgPSBlMCArIGUzOwotICAgICAgICBpbnQgZjEgPSBlMSArIGUyOwotICAgICAgICBpbnQgZjIgPSBlMSAtIGUyOwotICAgICAgICBpbnQgZjMgPSBlMCAtIGUzOwotICAgICAgICBwRHN0W2krMF0gPSAoT01YX1MxNilmMDsKLSAgICAgICAgcERzdFtpKzFdID0gKE9NWF9TMTYpZjE7Ci0gICAgICAgIHBEc3RbaSsyXSA9IChPTVhfUzE2KWYyOwotICAgICAgICBwRHN0W2krM10gPSAoT01YX1MxNilmMzsKLSAgICB9Ci0KLSAgICAvKiBUcmFuc2Zvcm0gY29sdW1ucyAqLwotICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKLSAgICB7Ci0gICAgICAgIGludCBmMCA9IHBEc3RbaSswXTsKLSAgICAgICAgaW50IGYxID0gcERzdFtpKzRdOwotICAgICAgICBpbnQgZjIgPSBwRHN0W2krOF07Ci0gICAgICAgIGludCBmMyA9IHBEc3RbaSsxMl07Ci0gICAgICAgIGludCBnMCA9IGYwICsgZjI7Ci0gICAgICAgIGludCBnMSA9IGYwIC0gZjI7Ci0gICAgICAgIGludCBnMiA9IChmMT4+MSkgLSBmMzsKLSAgICAgICAgaW50IGczID0gZjEgKyAoZjM+PjEpOwotICAgICAgICBpbnQgaDAgPSBnMCArIGczOwotICAgICAgICBpbnQgaDEgPSBnMSArIGcyOwotICAgICAgICBpbnQgaDIgPSBnMSAtIGcyOwotICAgICAgICBpbnQgaDMgPSBnMCAtIGczOwotICAgICAgICBwRHN0W2krMF0gPSAoT01YX1MxNikoKGgwKzMyKT4+Nik7Ci0gICAgICAgIHBEc3RbaSs0XSA9IChPTVhfUzE2KSgoaDErMzIpPj42KTsKLSAgICAgICAgcERzdFtpKzhdID0gKE9NWF9TMTYpKChoMiszMik+PjYpOwotICAgICAgICBwRHN0W2krMTJdID0gKE9NWF9TMTYpKChoMyszMik+PjYpOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazJ4Mi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazJ4Mi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjAwNGU1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2syeDIuYworKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIAotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX1VucGFja0Jsb2NrMngyLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBpbnZlcnNlIHF1YW50aXplIGFuZCB0cmFuc2Zvcm0gaGVscGVyIG1vZHVsZQotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKgotICogRGVzY3JpcHRpb24KLSAqIFVucGFjayBhIDJ4MiBibG9jayBvZiBjb2VmZmljaWVudC1yZXNpZHVhbCBwYWlyIHZhbHVlcwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBwU3JjCURvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIKLSAqCQkJCQkJYnVmZmVyIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZwotICogW291dF0JcHBTcmMJKnBwU3JjIGlzIHVwZGF0ZWQgdG8gdGhlIHN0YXJ0IG9mIG5leHQgbm9uIGVtcHR5IGJsb2NrCi0gKiBbb3V0XQlwRHN0CVBvaW50ZXIgdG8gdW5wYWNrZWQgNHg0IGJsb2NrCi0gKi8KLQotdm9pZCBhcm1WQ000UDEwX1VucGFja0Jsb2NrMngyKAotICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKLSAgICAgT01YX1MxNiogcERzdAotKQotewotICAgIGNvbnN0IE9NWF9VOCAqcFNyYyA9ICpwcFNyYzsKLSAgICBpbnQgaTsKLSAgICBpbnQgRmxhZywgVmFsdWU7Ci0KLSAgICBmb3IgKGk9MDsgaTw0OyBpKyspCi0gICAgewotICAgICAgICBwRHN0W2ldID0gMDsKLSAgICB9Ci0KLSAgICBkbwotICAgIHsKLSAgICAgICAgRmxhZyAgPSAqcFNyYysrOwotICAgICAgICBpZiAoRmxhZyAmIDB4MTApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIDE2IGJpdCAqLwotICAgICAgICAgICAgVmFsdWUgPSAqcFNyYysrOwotICAgICAgICAgICAgVmFsdWUgPSBWYWx1ZSB8ICgoKnBTcmMrKyk8PDgpOwotICAgICAgICAgICAgaWYgKFZhbHVlICYgMHg4MDAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZhbHVlIC09IDB4MTAwMDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiA4IGJpdCAqLwotICAgICAgICAgICAgVmFsdWUgPSAqcFNyYysrOwotICAgICAgICAgICAgaWYgKFZhbHVlICYgMHg4MCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWYWx1ZSAtPSAweDEwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpID0gRmxhZyAmIDE1OwotICAgICAgICBwRHN0W2ldID0gKE9NWF9TMTYpVmFsdWU7Ci0gICAgfQotICAgIHdoaWxlICgoRmxhZyAmIDB4MjApPT0wKTsKLQotICAgICpwcFNyYyA9IHBTcmM7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MGM5MzMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSBhbmQgdHJhbnNmb3JtIGhlbHBlciBtb2R1bGUKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoKLSAqIERlc2NyaXB0aW9uCi0gKiBVbnBhY2sgYSA0eDQgYmxvY2sgb2YgY29lZmZpY2llbnQtcmVzaWR1YWwgcGFpciB2YWx1ZXMKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcFNyYwlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyCi0gKgkJCQkJCWJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKLSAqIFtvdXRdCXBwU3JjCSpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jawotICogW291dF0JcERzdAlQb2ludGVyIHRvIHVucGFja2VkIDR4NCBibG9jawotICovCi0KLXZvaWQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NCgKLSAgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCi0gICAgIE9NWF9TMTYqIHBEc3QKLSkKLXsKLSAgICBjb25zdCBPTVhfVTggKnBTcmMgPSAqcHBTcmM7Ci0gICAgaW50IGk7Ci0gICAgaW50IEZsYWcsIFZhbHVlOwotCi0gICAgZm9yIChpPTA7IGk8MTY7IGkrKykKLSAgICB7Ci0gICAgICAgIHBEc3RbaV0gPSAwOwotICAgIH0KLQotICAgIGRvCi0gICAgewotICAgICAgICBGbGFnICA9ICpwU3JjKys7Ci0gICAgICAgIGlmIChGbGFnICYgMHgxMCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogMTYgYml0ICovCi0gICAgICAgICAgICBWYWx1ZSA9ICpwU3JjKys7Ci0gICAgICAgICAgICBWYWx1ZSA9IFZhbHVlIHwgKCgqcFNyYysrKTw8OCk7Ci0gICAgICAgICAgICBpZiAoVmFsdWUgJiAweDgwMDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVmFsdWUgLT0gMHgxMDAwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIDggYml0ICovCi0gICAgICAgICAgICBWYWx1ZSA9ICpwU3JjKys7Ci0gICAgICAgICAgICBpZiAoVmFsdWUgJiAweDgwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZhbHVlIC09IDB4MTAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGkgPSBGbGFnICYgMTU7Ci0gICAgICAgIHBEc3RbaV0gPSAoT01YX1MxNilWYWx1ZTsKLSAgICB9Ci0gICAgd2hpbGUgKChGbGFnICYgMHgyMCk9PTApOwotCi0gICAgKnBwU3JjID0gcFNyYzsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQXZlcmFnZV80eC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9BdmVyYWdlXzR4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzODYwNWUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9BdmVyYWdlXzR4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9BdmVyYWdlXzR4LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBBdmVyYWdlIG9mIHR3byA0eDQgb3IgNHg4IGJsb2NrcwotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9BdmVyYWdlXzR4ICAgKDYuMy41LjUuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gNHg0LCA0eDggYmxvY2tzLiAgVGhlIHJlc3VsdCAKLSAqIGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFByZWQwIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwUHJlZDEgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlQcmVkU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrczsgbXVzdCBiZSBlaXRoZXIgNCBvciA4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFByZWQgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgcFByZWQwLCBwUHJlZDEsIG9yIHBEc3RQcmVkIAotICogICAgLSAgICBwRHN0UHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgaVByZWRTdGVwMSA8PSAwIG9yIGlQcmVkU3RlcDEgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgaURzdFN0ZXAgPD0gMCBvciBpRHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBpSGVpZ2h0IGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgNCBvciA4IAotICoKLSAqLwotIE9NWFJlc3VsdCBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggKAotCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQwLAotCSBjb25zdCBPTVhfVTgqIAkgICAgcFByZWQxLAkKLQkgT01YX1UzMgkJaVByZWRTdGVwMCwKLQkgT01YX1UzMgkJaVByZWRTdGVwMSwKLQkgT01YX1U4KgkJcERzdFByZWQsCi0JIE9NWF9VMzIJCWlEc3RTdGVwLCAKLQkgT01YX1UzMgkJaUhlaWdodAotKQotewotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBQcmVkMCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwUHJlZDEgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdFByZWQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gNCkgJiYgKGlIZWlnaHQgIT0gOCksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpUHJlZFN0ZXAwID09IDApIHx8IChpUHJlZFN0ZXAwICYgMyksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpUHJlZFN0ZXAxID09IDApIHx8IChpUHJlZFN0ZXAxICYgMyksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpRHN0U3RlcCA9PSAwKSB8fCAoaURzdFN0ZXAgJiAzKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBEc3RQcmVkKSwgT01YX1N0c19CYWRBcmdFcnIpCi0KLSAgICByZXR1cm4gYXJtVkNDT01NX0F2ZXJhZ2UgCi0gICAgICAgIChwUHJlZDAsIHBQcmVkMSwgaVByZWRTdGVwMCwgaVByZWRTdGVwMSwgcERzdFByZWQsIGlEc3RTdGVwLCA0LCBpSGVpZ2h0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2ZkYjY0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGhhbGYgcGVsIEJsb2NrIG1hdGNoaW5nLCAKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLSAgICAKLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAgICg2LjMuNS4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhIGhhbGYtcGVsIGJsb2NrIG1hdGNoIHVzaW5nIHJlc3VsdHMgZnJvbSBhIHByaW9yIGludGVnZXIgc2VhcmNoLiAKLSAqICBSZXR1cm5zIHRoZSBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyB0aGUgCi0gKiBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciByZXNvbHV0aW9uIG1vdGlvbiAKLSAqIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdEJlc3RNViwgaS5lLiwgdGhlIGluaXRpYWwgCi0gKiBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGZ1bmN0aW9uIAotICogb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLiBJZiAKLSAqICAgICAgICAgICAgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiBJZiBpQmxvY2tXaWR0aD09OCwgIAotICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IAotICogICAgICAgICAgICByZXF1aXJlZC4gCi0gKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmUgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCAKLSAqICAgICAgICAgICAgcmVxdWlyZWQuICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICBJZiAKLSAqICAgICAgICAgICAgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKLSAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVscyAKLSAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAotICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3IsIHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKLSAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNViwgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0czsgdXNlZCB0byAKLSAqICAgICAgICAgICAgY29tcHV0ZSBtb3Rpb24gY29zdCAKLSAqICAgcFNyY0RzdEJlc3RNViAtIFRoZSBiZXN0IE1WIHJlc3VsdGluZyBmcm9tIGEgcHJpb3IgaW50ZWdlciBzZWFyY2gsIAotICogICAgICAgICAgICByZXByZXNlbnRlZCBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0QmVzdE1WIC0gQmVzdCBNViByZXN1bHRpbmcgZnJvbSB0aGUgaGFsZi1wZWwgc2VhcmNoLCBleHByZXNzZWQgaW4gCi0gKiAgICAgICAgICAgIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHMgCi0gKiAgIHBCZXN0Q29zdCAtIE1vdGlvbiBjb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNVjsgY29tcHV0ZWQgYXMgCi0gKiAgICAgICAgICAgIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY09yZ1ksIHBTcmNSZWZZLCAKLSAqICAgICAgICAgICAgICBwU3JjRHN0QmVzdE1WLCBwTVZQcmVkLCBwQmVzdENvc3QgCi0gKiAgICAtICAgIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgZXF1YWwgdG8gdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi0gCi1PTVhSZXN1bHQgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYoCi0gICAgY29uc3QgT01YX1U4KiBwU3JjT3JnWSwgCi0gICAgT01YX1MzMiBuU3JjT3JnU3RlcCwgCi0gICAgY29uc3QgT01YX1U4KiBwU3JjUmVmWSwgCi0gICAgT01YX1MzMiBuU3JjUmVmU3RlcCwgCi0gICAgT01YX1U4IGlCbG9ja1dpZHRoLCAKLSAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LCAKLSAgICBPTVhfVTMyIG5MYW1kYSwgCi0gICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqIHBNVlByZWQsIAotICAgIE9NWFZDTW90aW9uVmVjdG9yKiBwU3JjRHN0QmVzdE1WLCAKLSAgICBPTVhfUzMyKiBwQmVzdENvc3QKLSkKLXsKLSAgICAvKiBEZWZpbml0aW9ucyBhbmQgSW5pdGlhbGl6YXRpb25zKi8KLSAgICBPTVhfSU5UICAgICBjYW5kU0FEOwotICAgIE9NWF9JTlQgICAgIGZyb21YLCB0b1gsIGZyb21ZLCB0b1k7Ci0gICAgLyogT2Zmc2V0IHRvIHRoZSByZWZlcmVuY2UgYXQgdGhlIGJlZ2luaW5nIG9mIHRoZSBib3VuZGluZyBib3ggKi8KLSAgICBjb25zdCBPTVhfVTggICAgICAqcFRlbXBTcmNSZWZZLCAqcFRlbXBTcmNPcmdZOwotICAgIE9NWF9TMTYgICAgIHgsIHk7Ci0gICAgT01YVkNNb3Rpb25WZWN0b3IgZGlmZk1WLCBjYW5kTVYsIGludGVnZXJNVjsKLSAgICBPTVhfVTggICAgICBpbnRlcnBvbFlbMjU2XTsKLQotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgNCkgJiYgKCFhcm1JczRCeXRlQWxpZ25lZChwU3JjT3JnWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA4KSAmJiAoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmNPcmdZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gMTYpICYmICghYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmNPcmdZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQlhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDQpICYmICghYXJtSXM0Qnl0ZUFsaWduZWQocFNyY1JlZlkpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgOCkgJiYgKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjUmVmWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09IDE2KSAmJiAoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjUmVmWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKG5TcmNPcmdTdGVwICUgaUJsb2NrV2lkdGgpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFNyY09yZ1kgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWZZID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwTVZQcmVkID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0QmVzdE1WID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQmVzdENvc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotCWFybVJldEFyZ0VycklmKCgoaUJsb2NrV2lkdGghPTQpJiYoaUJsb2NrV2lkdGghPTgpJiYoaUJsb2NrV2lkdGghPTE2KSkgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0JYXJtUmV0QXJnRXJySWYoKChpQmxvY2tIZWlnaHQhPTQpJiYoaUJsb2NrSGVpZ2h0IT04KSYmKGlCbG9ja0hlaWdodCE9MTYpKSAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAvKiBDaGVjayBmb3IgdmFsaWQgcmVnaW9uICovIAotICAgIGZyb21YID0gMTsKLSAgICB0b1ggICA9IDE7Ci0gICAgZnJvbVkgPSAxOwotICAgIHRvWSAgID0gMTsKLSAgICAKLSAgICAvKiBJbml0aWFsaXplIHRvIG1heCB2YWx1ZSBhcyBhIHN0YXJ0IHBvaW50ICovCi0gICAgKnBCZXN0Q29zdCA9IDB4N2ZmZmZmZmY7Ci0gICAgCi0gICAgaW50ZWdlck1WLmR4ID0gcFNyY0RzdEJlc3RNVi0+ZHg7Ci0gICAgaW50ZWdlck1WLmR5ID0gcFNyY0RzdEJlc3RNVi0+ZHk7Ci0gICAgCi0gICAgLyogTG9vcGluZyBvbiB5LSBheGlzICovCi0gICAgZm9yICh5ID0gLWZyb21ZOyB5IDw9IHRvWTsgeSsrKQotICAgIHsKLSAgICAgICAgLyogTG9vcGluZyBvbiB4LSBheGlzICovCi0gICAgICAgIGZvciAoeCA9IC1mcm9tWDsgeCA8PSB0b1g7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgLyogUG9zaXRpb25pbmcgdGhlIHBvaW50ZXIgKi8KLSAgICAgICAgICAgIHBUZW1wU3JjUmVmWSA9IHBTcmNSZWZZICsgKG5TcmNSZWZTdGVwICogKGludGVnZXJNVi5keS80KSkgKyAoaW50ZWdlck1WLmR4LzQpOwotICAgICAgICAgICAgaWYgKHggPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBUZW1wU3JjUmVmWSA9IHBUZW1wU3JjUmVmWSArIHg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoeSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFRlbXBTcmNSZWZZID0gcFRlbXBTcmNSZWZZICsgKHkgKiBuU3JjUmVmU3RlcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwVGVtcFNyY09yZ1kgPSBwU3JjT3JnWTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogUHJlcGFyZSBjYW5kIE1WICovCi0gICAgICAgICAgICBjYW5kTVYuZHggPSBpbnRlZ2VyTVYuZHggKyB4ICogMjsKLSAgICAgICAgICAgIGNhbmRNVi5keSA9IGludGVnZXJNVi5keSArIHkgKiAyOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBJbnRlcnBvbGF0ZSBoYWxmIHBlbCBmb3IgdGhlIGN1cnJlbnQgcG9zaXRpb24qLwotICAgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hKAotICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBTcmNSZWZZLAotICAgICAgICAgICAgICAgICAgICAgICAgblNyY1JlZlN0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbFksCi0gICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja1dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2NrSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgYXJtQWJzKHgpICogMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFybUFicyh5KSAqIDIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIFNBRCAqLwotICAgICAgICAgICAgYXJtVkNDT01NX1NBRCgJCi0gICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFNyY09yZ1ksCi0gICAgICAgICAgICAgICAgICAgICAgICBuU3JjT3JnU3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja1dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgJmNhbmRTQUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tXaWR0aCk7Ci0gCi0gICAgICAgICAgICBkaWZmTVYuZHggPSBjYW5kTVYuZHggLSBwTVZQcmVkLT5keDsKLSAgICAgICAgICAgIGRpZmZNVi5keSA9IGNhbmRNVi5keSAtIHBNVlByZWQtPmR5OwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBSZXN1bHQgY2FsY3VsYXRpb25zICovCi0gICAgICAgICAgICBhcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NViAoCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW5kTVYuZHgsIAotICAgICAgICAgICAgICAgICAgICAgICAgY2FuZE1WLmR5LCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZNViwgCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW5kU0FELCAKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RCZXN0TVYsIAotICAgICAgICAgICAgICAgICAgICAgICAgbkxhbWRhLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIHBCZXN0Q29zdCk7Ci0KLSAgICAgICAgfSAvKiBFbmQgb2YgeC0gYXhpcyAqLwotICAgIH0gLyogRW5kIG9mIHktYXhpcyAqLwotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci0KLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTAyMDBmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIEJsb2NrIG1hdGNoaW5nLCBhIGZ1bGwgc2VhcmNoIGFsZ29yaXRobQotICogaXMgaW1wbGVtZW50ZWQKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciAgICg2LjMuNS4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbnRlZ2VyIGJsb2NrIG1hdGNoLiAgUmV0dXJucyBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBJZiAKLSAqICAgICAgICAgICAgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiBJZiBpQmxvY2tXaWR0aD09OCwgIAotICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IAotICogICAgICAgICAgICByZXF1aXJlZC4gCi0gKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmUuIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCAKLSAqICAgICAgICAgICAgcmVxdWlyZWQuICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICBJZiAKLSAqICAgICAgICAgICAgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLCBleHByZXNzZWQgaW4gdGVybXMgCi0gKiAgICAgICAgICAgIG9mIGludGVnZXIgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgaUJsb2NrV2lkdGguIAotICogICBuU3JjUmVmU3RlcCAtIFN0cmlkZSBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKLSAqICAgICAgICAgICAgb2YgaW50ZWdlciBwaXhlbHMgCi0gKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHJlY3RhbmdsZSBpbnNpZGUgdGhlIHJlZmVyZW5jZSAKLSAqICAgICAgICAgICAgcGljdHVyZSBwbGFuZSAKLSAqICAgbkN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAotICogICBpQmxvY2tXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrLCBleHByZXNzZWQgaW4gdGVybXMgb2YgaW50ZWdlciAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaywgZXhwcmVzc2VkIGluIHRlcm1zIG9mIAotICogICAgICAgICAgICBpbnRlZ2VyIHBpeGVsczsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAotICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3I7IHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKLSAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNVjsgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0LCBleHByZXNzZWQgaW4gdGVybXMgCi0gKiAgICAgICAgICAgIG9mIDEvNC1wZWwgdW5pdHMgCi0gKiAgIHBNVkNhbmRpZGF0ZSAtIENhbmRpZGF0ZSBNVjsgdXNlZCB0byBpbml0aWFsaXplIHRoZSBtb3Rpb24gc2VhcmNoLCAKLSAqICAgICAgICAgICAgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWxzIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIGludGVnZXIgc2VhcmNoLCBleHByZXNzZWQgaW4gdGVybXMgCi0gKiAgICAgICAgICAgIG9mIDEvNC1wZWwgdW5pdHMgCi0gKiAgIHBCZXN0Q29zdCAtIE1vdGlvbiBjb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNVjsgY29tcHV0ZWQgYXMgCi0gKiAgICAgICAgICAgIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pdG5lcnMgYXJlIE5VTEw6Ci0gKiAgICAgICAgIHBTcmNPcmdZLCBwU3JjUmVmWSwgcFJlZlJlY3QsIHBNVlByZWQsIHBNVkNhbmRpZGF0ZSwgb3IgcE1FU3BlYy4gCi0gKiAgICAtICAgIEVpdGhlciBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotIAotIE9NWFJlc3VsdCBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciAoCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZ1ksCi0gICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZlksCi0gICAgIE9NWF9TMzIgblNyY1JlZlN0ZXAsCi0JIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotCSBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgICBPTVhfVTggaUJsb2NrV2lkdGgsCi0gICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsCi0gICAgIE9NWF9VMzIgbkxhbWRhLAotICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WUHJlZCwKLSAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVkNhbmRpZGF0ZSwKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBCZXN0TVYsCi0gICAgIE9NWF9TMzIgKnBCZXN0Q29zdCwKLSAgICAgdm9pZCAqcE1FU3BlYwotKQotewotICAgIC8qIERlZmluaXRpb25zIGFuZCBJbml0aWFsaXphdGlvbnMqLwotICAgIE9NWF9JTlQgY2FuZFNBRDsKLSAgICBPTVhfSU5UIGZyb21YLCB0b1gsIGZyb21ZLCB0b1k7Ci0gICAgLyogT2Zmc2V0IHRvIHRoZSByZWZlcmVuY2UgYXQgdGhlIGJlZ2luaW5nIG9mIHRoZSBib3VuZGluZyBib3ggKi8KLSAgICBjb25zdCBPTVhfVTggKnBUZW1wU3JjUmVmWSwgKnBUZW1wU3JjT3JnWTsKLSAgICBPTVhfUzE2IHgsIHk7Ci0gICAgT01YVkNNb3Rpb25WZWN0b3IgZGlmZk1WOwotICAgIE9NWF9TMzIgblNlYXJjaFJhbmdlOwotICAgIEFSTVZDTTRQMTBfTUVTcGVjICphcm1NRVNwZWMgPSAoQVJNVkNNNFAxMF9NRVNwZWMgKikgcE1FU3BlYzsKLQotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgNCkgJiYgKCFhcm1JczRCeXRlQWxpZ25lZChwU3JjT3JnWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA4KSAmJiAoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmNPcmdZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gMTYpICYmICghYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmNPcmdZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQlhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDQpICYmICghYXJtSXM0Qnl0ZUFsaWduZWQocFNyY1JlZlkpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgOCkgJiYgKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjUmVmWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09IDE2KSAmJiAoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjUmVmWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFNyY09yZ1kgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWZZID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwTVZQcmVkID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwTVZDYW5kaWRhdGUgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCZXN0TVYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCZXN0Q29zdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0JYXJtUmV0QXJnRXJySWYoKChpQmxvY2tXaWR0aCE9NCkmJihpQmxvY2tXaWR0aCE9OCkmJihpQmxvY2tXaWR0aCE9MTYpKSAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQlhcm1SZXRBcmdFcnJJZigoKGlCbG9ja0hlaWdodCE9NCkmJihpQmxvY2tIZWlnaHQhPTgpJiYoaUJsb2NrSGVpZ2h0IT0xNikpICwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybUlnbm9yZSAocE1FU3BlYyk7Ci0KLSAgICBpZihpQmxvY2tXaWR0aCA9PSA0KQotICAgIHsKLSAgICAgICAgblNlYXJjaFJhbmdlID0gYXJtTUVTcGVjLT5NRVBhcmFtcy5zZWFyY2hSYW5nZTR4NDsKLSAgICB9Ci0gICAgZWxzZSBpZihpQmxvY2tXaWR0aCA9PSA4KQotICAgIHsKLSAgICAgICAgblNlYXJjaFJhbmdlID0gYXJtTUVTcGVjLT5NRVBhcmFtcy5zZWFyY2hSYW5nZTh4ODsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgblNlYXJjaFJhbmdlID0gYXJtTUVTcGVjLT5NRVBhcmFtcy5zZWFyY2hSYW5nZTE2eDE2OwotICAgIH0KLSAgICAvKiBDaGVjayBmb3IgdmFsaWQgcmVnaW9uICovIAotICAgIGZyb21YID0gblNlYXJjaFJhbmdlOwotICAgIHRvWCAgID0gblNlYXJjaFJhbmdlOwotICAgIGZyb21ZID0gblNlYXJjaFJhbmdlOwotICAgIHRvWSAgID0gblNlYXJjaFJhbmdlOwotICAgIAotICAgIGlmICgocEN1cnJQb2ludFBvcy0+eCAtIG5TZWFyY2hSYW5nZSkgPCBwUmVmUmVjdC0+eCkKLSAgICB7Ci0gICAgICAgIGZyb21YID0gIHBDdXJyUG9pbnRQb3MtPnggLSBwUmVmUmVjdC0+eDsKLSAgICB9Ci0KLSAgICBpZiAoKHBDdXJyUG9pbnRQb3MtPnggKyBpQmxvY2tXaWR0aCArIG5TZWFyY2hSYW5nZSkgPiAocFJlZlJlY3QtPnggKyBwUmVmUmVjdC0+d2lkdGgpKQotICAgIHsKLSAgICAgICAgdG9YICAgPSBwUmVmUmVjdC0+d2lkdGggLSAocEN1cnJQb2ludFBvcy0+eCAtIHBSZWZSZWN0LT54KSAtIGlCbG9ja1dpZHRoOwotICAgIH0KLQotICAgIGlmICgocEN1cnJQb2ludFBvcy0+eSAtIG5TZWFyY2hSYW5nZSkgPCBwUmVmUmVjdC0+eSkKLSAgICB7Ci0gICAgICAgIGZyb21ZID0gcEN1cnJQb2ludFBvcy0+eSAtIHBSZWZSZWN0LT55OwotICAgIH0KLQotICAgIGlmICgocEN1cnJQb2ludFBvcy0+eSArIGlCbG9ja1dpZHRoICsgblNlYXJjaFJhbmdlKSA+IChwUmVmUmVjdC0+eSArIHBSZWZSZWN0LT5oZWlnaHQpKQotICAgIHsKLSAgICAgICAgdG9ZICAgPSBwUmVmUmVjdC0+d2lkdGggLSAocEN1cnJQb2ludFBvcy0+eSAtIHBSZWZSZWN0LT55KSAtIGlCbG9ja1dpZHRoOwotICAgIH0KLSAgICAKLSAgICBwQmVzdE1WLT5keCA9IC1mcm9tWCAqIDQ7Ci0gICAgcEJlc3RNVi0+ZHkgPSAtZnJvbVkgKiA0OwotICAgIC8qIEluaXRpYWxpemUgdG8gbWF4IHZhbHVlIGFzIGEgc3RhcnQgcG9pbnQgKi8KLSAgICAqcEJlc3RDb3N0ID0gMHg3ZmZmZmZmZjsKLSAgICAKLSAgICAvKiBMb29waW5nIG9uIHktIGF4aXMgKi8KLSAgICBmb3IgKHkgPSAtZnJvbVk7IHkgPD0gdG9ZOyB5KyspCi0gICAgewotICAgICAgICAvKiBMb29waW5nIG9uIHgtIGF4aXMgKi8KLSAgICAgICAgZm9yICh4ID0gLWZyb21YOyB4IDw9IHRvWDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBQb3NpdGlvbmluZyB0aGUgcG9pbnRlciAqLwotICAgICAgICAgICAgcFRlbXBTcmNSZWZZID0gcFNyY1JlZlkgKyAoblNyY1JlZlN0ZXAgKiB5KSArIHg7Ci0gICAgICAgICAgICBwVGVtcFNyY09yZ1kgPSBwU3JjT3JnWTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogQ2FsY3VsYXRlIHRoZSBTQUQgKi8KLSAgICAgICAgICAgIGFybVZDQ09NTV9TQUQoCQotICAgIAkgICAgICAgIHBUZW1wU3JjT3JnWSwKLSAgICAJICAgICAgICBuU3JjT3JnU3RlcCwKLSAgICAJICAgICAgICBwVGVtcFNyY1JlZlksCi0gICAgCSAgICAgICAgblNyY1JlZlN0ZXAsCi0gICAgCSAgICAgICAgJmNhbmRTQUQsCi0gICAgCSAgICAgICAgaUJsb2NrSGVpZ2h0LAotICAgIAkgICAgICAgIGlCbG9ja1dpZHRoKTsKLSAgICAJICAgIAotICAgICAgICAgICAgZGlmZk1WLmR4ID0gKHggKiA0KSAtIHBNVlByZWQtPmR4OwotICAgICAgICAgICAgZGlmZk1WLmR5ID0gKHkgKiA0KSAtIHBNVlByZWQtPmR5OwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBSZXN1bHQgY2FsY3VsYXRpb25zICovCi0gICAgICAgICAgICBhcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NViAoKHggKiA0KSwgKHkgKiA0KSwgZGlmZk1WLCBjYW5kU0FELCBwQmVzdE1WLCBuTGFtZGEsIHBCZXN0Q29zdCk7Ci0KLSAgICAgICAgfSAvKiBFbmQgb2YgeC0gYXhpcyAqLwotICAgIH0gLyogRW5kIG9mIHktYXhpcyAqLwotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci0KLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDUwZDJjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHF1YXRlciBwZWwgQmxvY2sgbWF0Y2hpbmcsIAotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLSAKLSAgICAKLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciAgICg2LjMuNS4yLjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhIHF1YXJ0ZXItcGVsIGJsb2NrIG1hdGNoIHVzaW5nIHJlc3VsdHMgZnJvbSBhIHByaW9yIGhhbGYtcGVsIAotICogc2VhcmNoLiAgUmV0dXJucyB0aGUgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgCi0gKiB0aGUgcXVhcnRlci1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGhhbGYtcGVsIHJlc29sdXRpb24gCi0gKiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0QmVzdE1WLCBpLmUuLCB0aGUgCi0gKiBpbml0aWFsIGhhbGYtcGVsIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGZ1bmN0aW9uIAotICogb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgbWF5IGJlIHVzZWQgZm9yIGhhbGYtcGVsIG1vdGlvbiBlc3RpbWF0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZS4gSWYgCi0gKiAgICAgICAgICAgIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gSWYgaUJsb2NrV2lkdGg9PTgsICAKLSAqICAgICAgICAgICAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCAKLSAqICAgICAgICAgICAgcmVxdWlyZWQuIAotICogICBwU3JjUmVmWSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBibG9jayBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgCi0gKiAgICAgICAgICAgIHJlcXVpcmVkLiAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgSWYgCi0gKiAgICAgICAgICAgIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCi0gKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHMgCi0gKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yLCB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCi0gKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVYsIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHM7IHVzZWQgdG8gCi0gKiAgICAgICAgICAgIGNvbXB1dGUgbW90aW9uIGNvc3QgCi0gKiAgIHBTcmNEc3RCZXN0TVYgLSBUaGUgYmVzdCBNViByZXN1bHRpbmcgZnJvbSBhIHByaW9yIGhhbGYtcGVsIHNlYXJjaCwgCi0gKiAgICAgICAgICAgIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNCBwZWwgdW5pdHMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIHRoZSBxdWFydGVyLXBlbCBzZWFyY2gsIGV4cHJlc3NlZCAKLSAqICAgICAgICAgICAgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0cyAKLSAqICAgcEJlc3RDb3N0IC0gTW90aW9uIGNvc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZXN0IE1WOyBjb21wdXRlZCBhcyAKLSAqICAgICAgICAgICAgU0FEK0xhbWRhKkJpdHNVc2VkQnlNViAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBPbmUgb2YgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwU3JjT3JnWSwgcFNyY1JlZlksIHBTcmNEc3RCZXN0TVYsIHBNVlByZWQsIHBCZXN0Q29zdCAKLSAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSBlcXVhbCB0byB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLSAKLU9NWFJlc3VsdCBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlcigKLSAgICBjb25zdCBPTVhfVTgqIHBTcmNPcmdZLCAKLSAgICBPTVhfUzMyIG5TcmNPcmdTdGVwLCAKLSAgICBjb25zdCBPTVhfVTgqIHBTcmNSZWZZLCAKLSAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLCAKLSAgICBPTVhfVTggaUJsb2NrV2lkdGgsIAotICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsIAotICAgIE9NWF9VMzIgbkxhbWRhLCAKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciogcE1WUHJlZCwgCi0gICAgT01YVkNNb3Rpb25WZWN0b3IqIHBTcmNEc3RCZXN0TVYsIAotICAgIE9NWF9TMzIqIHBCZXN0Q29zdAotKQotewotICAgIC8qIERlZmluaXRpb25zIGFuZCBJbml0aWFsaXphdGlvbnMqLwotICAgIE9NWF9JTlQgICAgIGNhbmRTQUQ7Ci0gICAgT01YX0lOVCAgICAgZnJvbVgsIHRvWCwgZnJvbVksIHRvWTsKLSAgICAvKiBPZmZzZXQgdG8gdGhlIHJlZmVyZW5jZSBhdCB0aGUgYmVnaW5pbmcgb2YgdGhlIGJvdW5kaW5nIGJveCAqLwotICAgIGNvbnN0IE9NWF9VOCAgICAgICpwVGVtcFNyY1JlZlksICpwVGVtcFNyY09yZ1k7Ci0gICAgT01YX1MxNiAgICAgeCwgeTsKLSAgICBPTVhWQ01vdGlvblZlY3RvciBkaWZmTVYsIGNhbmRNViwgaW5pdGlhbE1WOwotICAgIE9NWF9VOCAgICAgIGludGVycG9sWVsyNTZdOwotICAgIE9NWF9TMzIgICAgIHBlbFBvc1gsIHBlbFBvc1k7Ci0KLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDQpICYmICghYXJtSXM0Qnl0ZUFsaWduZWQocFNyY09yZ1kpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAgOCkgJiYgKCFhcm1JczhCeXRlQWxpZ25lZChwU3JjT3JnWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09IDE2KSAmJiAoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjT3JnWSkpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0JYXJtUmV0QXJnRXJySWYoKGlCbG9ja1dpZHRoID09ICA0KSAmJiAoIWFybUlzNEJ5dGVBbGlnbmVkKHBTcmNSZWZZKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoaUJsb2NrV2lkdGggPT0gIDgpICYmICghYXJtSXM4Qnl0ZUFsaWduZWQocFNyY1JlZlkpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChpQmxvY2tXaWR0aCA9PSAxNikgJiYgKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY1JlZlkpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChuU3JjT3JnU3RlcCAlIGlCbG9ja1dpZHRoKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTcmNPcmdZID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmWSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocE1WUHJlZCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdEJlc3RNViA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJlc3RDb3N0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQlhcm1SZXRBcmdFcnJJZigoKGlCbG9ja1dpZHRoIT00KSYmKGlCbG9ja1dpZHRoIT04KSYmKGlCbG9ja1dpZHRoIT0xNikpICwgT01YX1N0c19CYWRBcmdFcnIpOwotCWFybVJldEFyZ0VycklmKCgoaUJsb2NrSGVpZ2h0IT00KSYmKGlCbG9ja0hlaWdodCE9OCkmJihpQmxvY2tIZWlnaHQhPTE2KSkgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgICAgIAotICAgICAgICAgICAgCi0gICAgLyogQ2hlY2sgZm9yIHZhbGlkIHJlZ2lvbiAqLyAKLSAgICBmcm9tWCA9IDE7Ci0gICAgdG9YICAgPSAxOwotICAgIGZyb21ZID0gMTsKLSAgICB0b1kgICA9IDE7Ci0gICAgCi0gICAgLyogSW5pdGlhbGl6ZSB0byBtYXggdmFsdWUgYXMgYSBzdGFydCBwb2ludCAqLwotICAgICpwQmVzdENvc3QgPSAweDdmZmZmZmZmOwotICAgIAotICAgIGluaXRpYWxNVi5keCA9IHBTcmNEc3RCZXN0TVYtPmR4OwotICAgIGluaXRpYWxNVi5keSA9IHBTcmNEc3RCZXN0TVYtPmR5OwotICAgIAotICAgIC8qIExvb3Bpbmcgb24geS0gYXhpcyAqLwotICAgIGZvciAoeSA9IC1mcm9tWTsgeSA8PSB0b1k7IHkrKykKLSAgICB7Ci0gICAgICAgIC8qIExvb3Bpbmcgb24geC0gYXhpcyAqLwotICAgICAgICBmb3IgKHggPSAtZnJvbVg7IHggPD0gdG9YOyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFBvc2l0aW9uaW5nIHRoZSBwb2ludGVyICovCi0gICAgICAgICAgICBwVGVtcFNyY1JlZlkgPSBwU3JjUmVmWSArIChuU3JjUmVmU3RlcCAqIChpbml0aWFsTVYuZHkvNCkpICsgKGluaXRpYWxNVi5keC80KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogQ2FsY3VsYXRpbmcgdGhlIGZyYWN0IHBlbCBwb3NpdGlvbiAqLwotICAgICAgICAgICAgcGVsUG9zWCA9IChpbml0aWFsTVYuZHggJSA0KSArIHg7Ci0gICAgICAgICAgICBpZiAocGVsUG9zWCA8IDApIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBUZW1wU3JjUmVmWSA9IHBUZW1wU3JjUmVmWSAtIDE7Ci0gICAgICAgICAgICAgICAgcGVsUG9zWCArPSA0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGVsUG9zWSA9IChpbml0aWFsTVYuZHkgJSA0KSArIHk7Ci0gICAgICAgICAgICBpZiAocGVsUG9zWSA8IDApIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBUZW1wU3JjUmVmWSA9IHBUZW1wU3JjUmVmWSAtICgxICogblNyY1JlZlN0ZXApOwotICAgICAgICAgICAgICAgIHBlbFBvc1kgKz0gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcFRlbXBTcmNPcmdZID0gcFNyY09yZ1k7IAotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBQcmVwYXJlIGNhbmQgTVYgKi8KLSAgICAgICAgICAgIGNhbmRNVi5keCA9IGluaXRpYWxNVi5keCArIHg7Ci0gICAgICAgICAgICBjYW5kTVYuZHkgPSBpbml0aWFsTVYuZHkgKyB5OwotICAgICAgICAgICAgIAotICAgICAgICAgICAgLyogSW50ZXJwb2xhdGUgUXVhdGVyIHBlbCBmb3IgdGhlIGN1cnJlbnQgcG9zaXRpb24qLwotICAgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hKAotICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBTcmNSZWZZLAotICAgICAgICAgICAgICAgICAgICAgICAgblNyY1JlZlN0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbFksCi0gICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja1dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgaUJsb2NrSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgcGVsUG9zWCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlbFBvc1kpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIFNBRCAqLwotICAgICAgICAgICAgYXJtVkNDT01NX1NBRCgJCi0gICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFNyY09yZ1ksCi0gICAgICAgICAgICAgICAgICAgICAgICBuU3JjT3JnU3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlCbG9ja1dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgJmNhbmRTQUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpQmxvY2tXaWR0aCk7Ci0gCi0gICAgICAgICAgICBkaWZmTVYuZHggPSBjYW5kTVYuZHggLSBwTVZQcmVkLT5keDsKLSAgICAgICAgICAgIGRpZmZNVi5keSA9IGNhbmRNVi5keSAtIHBNVlByZWQtPmR5OwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBSZXN1bHQgY2FsY3VsYXRpb25zICovCi0gICAgICAgICAgICBhcm1WQ000UDEwX0NvbXBhcmVNb3Rpb25Db3N0VG9NViAoCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW5kTVYuZHgsIAotICAgICAgICAgICAgICAgICAgICAgICAgY2FuZE1WLmR5LCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZNViwgCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW5kU0FELCAKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RCZXN0TVYsIAotICAgICAgICAgICAgICAgICAgICAgICAgbkxhbWRhLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIHBCZXN0Q29zdCk7Ci0KLSAgICAgICAgfSAvKiBFbmQgb2YgeC0gYXhpcyAqLwotICAgIH0gLyogRW5kIG9mIHktYXhpcyAqLwotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci0KLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWVjZjNmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGludHJhIGNocm9tYSBkZWJsb2NrCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kgICAoNi4zLjMuMy42KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9ja2luZyBmaWx0ZXJpbmcgb24gYWxsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCi0gKiBtYWNyb2Jsb2NrICgxNngxNikuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtIHN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBwQWxwaGEgLSBwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyAKLSAqICAgICAgICAgICAgZm9sbG93czoge2V4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIAotICogICAgICAgICAgICBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgcEJldGEgLSBwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIEJldGEgVGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IAotICogICAgICAgICAgICB7IGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsIAotICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIFtJU08xNDQ5Ni0xMF0gCi0gKiAgICAgICAgICAgIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSA4eDIgb2YgVGhyZXNob2xkcyAoVEMwKSAodmFsdWVzIGZvciB0aGUgbGVmdCAKLSAqICAgICAgICAgICAgb3IgYWJvdmUgZWRnZSBvZiBlYWNoIDR4MiBvciAyeDQgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIAotICogICAgICAgICAgICBibG9jayBvcmRlciBhbmQgdGhlbiBpbiBob3Jpem9udGFsIGJsb2NrIG9yZGVyKTsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gUGVyIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLSBhcnJheSBvZiBzaXplIDE2eDIgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gc2NhbiBibG9jayBvcmRlciAKLSAqICAgICAgICAgICAgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXMpOyB2YWxpZCBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IAotICogICAgICAgICAgICBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IAotICogICAgICAgICAgICA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cyAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAotICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAgICAgICAgICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBBbHBoYVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgICBbMCwyNTVdLiAKLSAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQmV0YVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgICBbMCwxOF0uIAotICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XWlzIG91dHNpZGUgb2YgCi0gKiAgICAgICAgICAgICAgdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgICAtICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgIGZvciBpPj00LCBvciAKLSAqICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAotICogICAgLSAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0koCi0JT01YX1U4KiBwU3JjRHN0LCAKLQlPTVhfUzMyIHNyY2RzdFN0ZXAsIAotCWNvbnN0IE9NWF9VOCogcEFscGhhLCAKLQljb25zdCBPTVhfVTgqIHBCZXRhLCAKLQljb25zdCBPTVhfVTgqIHBUaHJlc2hvbGRzLAotICAgIGNvbnN0IE9NWF9VOCAqcEJTCi0pCi17Ci0gICAgT01YUmVzdWx0IGVycm9yQ29kZTsKLSAgICAKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiA3LCAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJldGEgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzID09IE5VTEwsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0koCi0gICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBwQlMpOwotCi0gICAgYXJtUmV0QXJnRXJySWYoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIsIGVycm9yQ29kZSkKLSAgICAKLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JKAotICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGErMiwgcEJldGErMiwgcFRocmVzaG9sZHMrOCwgcEJTKzE2KTsKLQotICAgIHJldHVybiBlcnJvckNvZGU7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTU5NjMxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgbHVtYSBkZWJsb2NrCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotIAotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JICAgKDYuMy4zLjMuNSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgdGhlIGhvcml6b250YWwgYW5kIAotICogdmVydGljYWwgZWRnZXMgb2YgYSBsdW1hIG1hY3JvYmxvY2sgKDE2eDE2KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtIGltYWdlIHdpZHRoOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwQWxwaGEgLSBwb2ludGVyIHRvIGEgMngyIHRhYmxlIG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyAKLSAqICAgICAgICAgICAgZm9sbG93czoge2V4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIAotICogICAgICAgICAgICBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9LiAgUGVyIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgcEJldGEgLSBwb2ludGVyIHRvIGEgMngyIHRhYmxlIG9mIGJldGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIGZvbGxvd3M6IAotICogICAgICAgICAgICB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgCi0gKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgW0lTTzE0NDk2LTEwXSAKLSAqICAgICAgICAgICAgYmV0YSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLSBwb2ludGVyIHRvIGEgMTZ4MiB0YWJsZSBvZiB0aHJlc2hvbGQgKFRDMCksIG9yZ2FuaXplZCBhcyAKLSAqICAgICAgICAgICAgZm9sbG93czoge3ZhbHVlcyBmb3IgdGhlIGxlZnQgb3IgYWJvdmUgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgCi0gKiAgICAgICAgICAgIGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIG9yZGVyIGFuZCB0aGVuIGluIGhvcml6b250YWwgYmxvY2sgCi0gKiAgICAgICAgICAgIG9yZGVyfTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIFtJU08xNDQ5Ni0xMF0gCi0gKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLSBwb2ludGVyIHRvIGEgMTZ4MiB0YWJsZSBvZiBCUyBwYXJhbWV0ZXJzIGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgCi0gKiAgICAgICAgICAgIG9yZGVyIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzOyB2YWxpZCBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IAotICogICAgICAgICAgICBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IAotICogICAgICAgICAgICA0LiBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAotICogICAgLSAgICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAotICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcyBvciBwQlMuIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAgICAgICAgICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBBbHBoYVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgICBbMCwyNTVdLiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcEJldGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCi0gKiAgICAgICAgICAgICAgWzAsMThdLiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMzFdaXMgb3V0c2lkZSBvZiAKLSAqICAgICAgICAgICAgICB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCi0gKiAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCi0gKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JKAotCU9NWF9VOCogcFNyY0RzdCwgCi0JT01YX1MzMiBzcmNkc3RTdGVwLCAKLQljb25zdCBPTVhfVTgqIHBBbHBoYSwgCi0JY29uc3QgT01YX1U4KiBwQmV0YSwgCi0JY29uc3QgT01YX1U4KiBwVGhyZXNob2xkcywgCi0JY29uc3QgT01YX1U4ICpwQlMKLSkKLXsKLSAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOwotICAgIAotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocFNyY0RzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihzcmNkc3RTdGVwICYgMTUsICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7ICAgIAotICAgIGFybVJldEFyZ0VycklmKHBBbHBoYSA9PSBOVUxMLCAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCZXRhID09IE5VTEwsICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzID09IE5VTEwsICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwVGhyZXNob2xkcyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQlMgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBCUyksICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0koCi0gICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBwQlMpOwotCi0gICAgYXJtUmV0QXJnRXJySWYoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIsIGVycm9yQ29kZSkKLSAgICAKLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSgKLSAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhKzIsIHBCZXRhKzIsIHBUaHJlc2hvbGRzKzE2LCBwQlMrMTYpOwotCi0gICAgcmV0dXJuIGVycm9yQ29kZTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MzFlZWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBkZWNvZGUgY29lZmZpY2llbnRzIG1vZHVsZQotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAgICg2LjMuNC4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSByYXN0ZXIgc2NhbiBmb3IgYSAyeDIgYmxvY2sgb2YgCi0gKiBDaHJvbWFEQ0xldmVsLiAgVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHRoZSBwYWNrZWQgcG9zaXRpb24tY29lZmZpY2llbnQgCi0gKiBidWZmZXIgYXJlIHN0b3JlZCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIsIGkuZS4sIHRoZSBmaXJzdCBidWZmZXIgZWxlbWVudCAKLSAqIGNvbnRhaW5zIHRoZSBsYXN0IG5vbi16ZXJvIHBvc3Rpb24tY29lZmZpY2llbnQgcGFpciBvZiB0aGUgYmxvY2suIFdpdGhpbiAKLSAqIGVhY2ggcG9zaXRpb24tY29lZmZpY2llbnQgcGFpciwgdGhlIHBvc2l0aW9uIGVudHJ5IGluZGljYXRlcyB0aGUgCi0gKiByYXN0ZXItc2NhbiBwb3NpdGlvbiBvZiB0aGUgY29lZmZpY2llbnQsIHdoaWxlIHRoZSBjb2VmZmljaWVudCBlbnRyeSAKLSAqIGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCB2YWx1ZS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBPZmZzZXQgLSBQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCi0gKiAgIHBPZmZzZXQgLSAqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKLSAqICAgcE51bUNvZWZmIC0gUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluIHRoaXMgYmxvY2sgCi0gKiAgIHBwUG9zQ29lZkJ1ZiAtIERvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsIAotICogICAgICAgICAgICBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlci4gIEJ1ZmZlciBwb3NpdGlvbiAKLSAqICAgICAgICAgICAgKCpwcFBvc0NvZWZCdWYpIGlzIHVwZGF0ZWQgdXBvbiByZXR1cm4sIHVubGVzcyB0aGVyZSBhcmUgb25seSAKLSAqICAgICAgICAgICAgemVybyBjb2VmZmljaWVudHMgaW4gdGhlIGN1cnJlbnRseSBkZWNvZGVkIGJsb2NrLiAgSW4gdGhpcyBjYXNlIAotICogICAgICAgICAgICB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGJ5cGFzcyB0aGUgdHJhbnNmb3JtL2RlcXVhbnRpemF0aW9uIG9mIAotICogICAgICAgICAgICB0aGUgZW1wdHkgYmxvY2tzLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwcEJpdFN0cmVhbSBvciBwT2Zmc2V0IGlzIE5VTEwuIAotICogICAgLSAgICBwcFBvc0NvZWZCdWYgb3IgcE51bUNvZWZmIGlzIE5VTEwuIAotICogICAgT01YX1N0c19FcnIgLSBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYW4gaWxsZWdhbCBjb2RlIGlzIGVuY291bnRlcmVkIGluIHRoZSBiaXRzdHJlYW0gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgKAotICAgICBjb25zdCBPTVhfVTgqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX1MzMiogcE9mZnNldCwKLSAgICAgT01YX1U4KiBwTnVtQ29lZmYsCi0gICAgIE9NWF9VOCoqIHBwUG9zQ29lZmJ1ZiAgICAgICAgCi0gKQotCi17Ci0gICAgYXJtUmV0QXJnRXJySWYocHBCaXRTdHJlYW09PU5VTEwgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigqcHBCaXRTdHJlYW09PU5VTEwgICwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBPZmZzZXQ9PU5VTEwgICAgICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKnBPZmZzZXQ8MCAgICAgICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigqcE9mZnNldD43ICAgICAgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBOdW1Db2VmZj09TlVMTCAgICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHBQb3NDb2VmYnVmPT1OVUxMICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigqcHBQb3NDb2VmYnVmPT1OVUxMICwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgcmV0dXJuIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBwTnVtQ29lZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwUG9zQ29lZmJ1ZiwgNCwgNCk7Ci0KLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThhYjgxOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgZGVjb2RlIGNvZWZmaWNpZW50cyBtb2R1bGUKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQyAgICg2LjMuNC4xLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3IgNHg0IGJsb2NrIG9mIAotICogSW50cmExNngxNkRDTGV2ZWwsIEludHJhMTZ4MTZBQ0xldmVsLCBMdW1hTGV2ZWwsIGFuZCBDaHJvbWFBQ0xldmVsLiBJbnZlcnNlIAotICogZmllbGQgc2NhbiBpcyBub3Qgc3VwcG9ydGVkLiBUaGUgZGVjb2RlZCBjb2VmZmljaWVudHMgaW4gdGhlIHBhY2tlZCAKLSAqIHBvc2l0aW9uLWNvZWZmaWNpZW50IGJ1ZmZlciBhcmUgc3RvcmVkIGluIHJldmVyc2UgemlnLXphZyBvcmRlciwgaS5lLiwgdGhlIAotICogZmlyc3QgYnVmZmVyIGVsZW1lbnQgY29udGFpbnMgdGhlIGxhc3Qgbm9uLXplcm8gcG9zdGlvbi1jb2VmZmljaWVudCBwYWlyIG9mIAotICogdGhlIGJsb2NrLiBXaXRoaW4gZWFjaCBwb3NpdGlvbi1jb2VmZmljaWVudCBwYWlyLCB0aGUgcG9zaXRpb24gZW50cnkgCi0gKiBpbmRpY2F0ZXMgdGhlIHJhc3Rlci1zY2FuIHBvc2l0aW9uIG9mIHRoZSBjb2VmZmljaWVudCwgd2hpbGUgdGhlIAotICogY29lZmZpY2llbnQgZW50cnkgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHZhbHVlLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwT2Zmc2V0IC0gUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW07IHZhbGlkIGluIHRoZSByYW5nZSBbMCw3XS4gCi0gKiAgIHNNYXhOdW1Db2VmZiAtIE1heGltdW0gdGhlIG51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgaW4gY3VycmVudCAKLSAqICAgICAgICAgICAgYmxvY2sgCi0gKiAgIHNWTENTZWxlY3QgLSBWTEMgdGFibGUgc2VsZWN0b3IsIG9idGFpbmVkIGZyb20gdGhlIG51bWJlciBvZiBub24temVybyAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnRzIGNvbnRhaW5lZCBpbiB0aGUgYWJvdmUgYW5kIGxlZnQgNHg0IGJsb2Nrcy4gIEl0IGlzIAotICogICAgICAgICAgICBlcXVpdmFsZW50IHRvIHRoZSB2YXJpYWJsZSBuQyBkZXNjcmliZWQgaW4gSC4yNjQgc3RhbmRhcmQgdGFibGUgCi0gKiAgICAgICAgICAgIDkgNSwgZXhjZXB0IGl0cyB2YWx1ZSBjYW4gdCBiZSBsZXNzIHRoYW4gemVyby4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkLiAgCi0gKiAgICAgICAgICAgIEJ1ZmZlciBwb3NpdGlvbiAoKnBwUG9zQ29lZkJ1ZikgaXMgdXBkYXRlZCB1cG9uIHJldHVybiwgdW5sZXNzIAotICogICAgICAgICAgICB0aGVyZSBhcmUgb25seSB6ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGUgY3VycmVudGx5IGRlY29kZWQgYmxvY2suIAotICogICAgICAgICAgICAgSW4gdGhpcyBjYXNlIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gYnlwYXNzIHRoZSAKLSAqICAgICAgICAgICAgdHJhbnNmb3JtL2RlcXVhbnRpemF0aW9uIG9mIHRoZSBlbXB0eSBibG9ja3MuIAotICogICBwT2Zmc2V0IC0gKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCi0gKiAgIHBOdW1Db2VmZiAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGlzIGJsb2NrIAotICogICBwcFBvc0NvZWZCdWYgLSBEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbCAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBwcEJpdFN0cmVhbSBvciBwT2Zmc2V0IGlzIE5VTEwuIAotICogICAgLSAgICBwcFBvc0NvZWZCdWYgb3IgcE51bUNvZWZmIGlzIE5VTEwuIAotICogICAgLSAgICBzTWF4TnVtQ29lZmYgaXMgbm90IGVxdWFsIHRvIGVpdGhlciAxNSBvciAxNi4gCi0gKiAgICAtICAgIHNWTENTZWxlY3QgaXMgbGVzcyB0aGFuIDAuIAotICoKLSAqICAgIE9NWF9TdHNfRXJyIC0gaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGFuIGlsbGVnYWwgY29kZSBpcyBlbmNvdW50ZXJlZCBpbiB0aGUgYml0c3RyZWFtIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQygKLSAgICAgY29uc3QgT01YX1U4KiogcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9TMzIqIHBPZmZzZXQsCi0gICAgIE9NWF9VOCogcE51bUNvZWZmLAotICAgICBPTVhfVTgqKnBwUG9zQ29lZmJ1ZiwKLSAgICAgT01YX0lOVCBzVkxDU2VsZWN0LAotICAgICBPTVhfSU5UIHNNYXhOdW1Db2VmZiAgICAgICAgCi0gKQotewotICAgIGludCBuVGFibGU7Ci0KLSAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbT09TlVMTCAgICwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCpwcEJpdFN0cmVhbT09TlVMTCAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocE9mZnNldD09TlVMTCAgICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigqcE9mZnNldDwwICAgICAgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCpwT2Zmc2V0PjcgICAgICAgICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocE51bUNvZWZmPT1OVUxMICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcFBvc0NvZWZidWY9PU5VTEwgICwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCpwcFBvc0NvZWZidWY9PU5VTEwgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoc1ZMQ1NlbGVjdDwwICAgICAgICAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihzTWF4TnVtQ29lZmY8MTUgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHNNYXhOdW1Db2VmZj4xNiAgICAgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgCi0gICAgLyogRmluZCBWTEMgdGFibGUgbnVtYmVyICovCi0gICAgaWYgKHNWTENTZWxlY3Q8MikKLSAgICB7Ci0gICAgICAgIG5UYWJsZSA9IDA7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNWTENTZWxlY3Q8NCkKLSAgICB7Ci0gICAgICAgIG5UYWJsZSA9IDE7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNWTENTZWxlY3Q8OCkKLSAgICB7Ci0gICAgICAgIG5UYWJsZSA9IDI7Ci0gICAgfQotICAgIGVsc2UgLyogc1ZMQ1NlbGVjdCA+PSA4ICovCi0gICAgewotICAgICAgICBuVGFibGUgPSAzOwotICAgIH0KLQotICAgIHJldHVybiBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcihwcEJpdFN0cmVhbSwgcE9mZnNldCwgcE51bUNvZWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcFBvc0NvZWZidWYsIG5UYWJsZSwgc01heE51bUNvZWZmKTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEwMjJiYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSBhbmQgdHJhbnNmb3JtIG1vZHVsZQotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoKLSAqIERlc2NyaXB0aW9uOgotICogRGVxdWFudGl6ZSBMdW1hIEFDIGJsb2NrCi0gKi8KLQotc3RhdGljIHZvaWQgRGVxdWFudEx1bWFBQzR4NCgKLSAgICAgT01YX1MxNiogcFNyY0RzdCwKLSAgICAgT01YX0lOVCBRUCAgICAgICAgCi0pCi17Ci0gICAgY29uc3QgT01YX1U4ICpwVlJvdyA9ICZhcm1WQ000UDEwX1ZNYXRyaXhbUVAlNl1bMF07Ci0gICAgaW50IFNoaWZ0ID0gUVAgLyA2OwotICAgIGludCBpOwotICAgIE9NWF9TMzIgVmFsdWU7Ci0KLSAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKQotICAgIHsKLQotICAgICAgICBWYWx1ZSA9IChwU3JjRHN0W2ldICogcFZSb3dbYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbaV1dKSA8PCBTaGlmdDsKLSAgICAgICAgcFNyY0RzdFtpXSA9IChPTVhfUzE2KVZhbHVlOwotICAgIH0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgICAoNi4zLjQuMi4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUmVjb25zdHJ1Y3QgdGhlIDR4NCByZXNpZHVhbCBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLCAKLSAqIHBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludGVnZXIgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiBmb3IgNHg0IGJsb2NrIG9mIAotICogcmVzaWR1YWxzIHdpdGggcHJldmlvdXMgaW50cmEgcHJlZGljdGlvbiBvciBtb3Rpb24gY29tcGVuc2F0aW9uIGRhdGEsIGFuZCAKLSAqIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSBibG9jay4gSWYgcERDID09IE5VTEwsIAotICogdGhlcmUgcmUgMTYgbm9uLXplcm8gQUMgY29lZmZpY2llbnRzIGF0IG1vc3QgaW4gdGhlIHBhY2tlZCBidWZmZXIgc3RhcnRpbmcgCi0gKiBmcm9tIDR4NCBibG9jayBwb3NpdGlvbiAwOyBJZiBwREMgIT0gTlVMTCwgdGhlcmUgcmUgMTUgbm9uLXplcm8gQUMgCi0gKiBjb2VmZmljaWVudHMgYXQgbW9zdCBpbiB0aGUgcGFja2V0IGJ1ZmZlciBzdGFydGluZyBmcm9tIDR4NCBibG9jayBwb3NpdGlvbiAKLSAqIDEuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwU3JjIC0gRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCi0gKiAgICAgICAgICAgIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZyAKLSAqICAgcFByZWQgLSBQb2ludGVyIHRvIHRoZSBwcmVkaWN0ZWQgNHg0IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5IAotICogICBwcmVkU3RlcCAtIFByZWRpY3RlZCBmcmFtZSBzdGVwIHNpemUgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAotICogICBkc3RTdGVwIC0gRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCi0gKiAgIHBEQyAtIFBvaW50ZXIgdG8gdGhlIERDIGNvZWZmaWNpZW50IG9mIHRoaXMgYmxvY2ssIE5VTEwgaWYgaXQgZG9lc24ndCAKLSAqICAgICAgICAgICAgZXhpc3QgCi0gKiAgIFFQIC0gUVAgUXVhbnRpemF0aW9uIHBhcmFtZXRlci4gIEl0IHNob3VsZCBiZSBRcEMgaW4gY2hyb21hIDR4NCBibG9jayAKLSAqICAgICAgICAgICAgZGVjb2RpbmcsIG90aGVyd2lzZSBpdCBzaG91bGQgYmUgUXBZLiAKLSAqICAgQUMgLSBGbGFnIGluZGljYXRpbmcgaWYgYXQgbGVhc3Qgb25lIG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50IGV4aXN0cyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IGJsb2NrIGRhdGE7IG11c3QgYmUgYWxpZ25lZCBvbiBhIAotICogICAgICAgICAgICA0LWJ5dGUgYm91bmRhcnkgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcFByZWQgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcFByZWQgb3IgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBwcmVkU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAotICogICAgLSAgICBBQyAhPTAgYW5kIFFwIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdIG9yIHBwU3JjID09IE5VTEwuIAotICogICAgLSAgICBBQyA9PTAgJiYgcERDID09TlVMTC4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkKAotICAgICBjb25zdCBPTVhfVTggKipwcFNyYywKLSAgICAgY29uc3QgT01YX1U4ICpwUHJlZCwKLSAgICAgY29uc3QgT01YX1MxNiAqcERDLAotICAgICBPTVhfVTggKnBEc3QsCi0gICAgIE9NWF9JTlQgcHJlZFN0ZXAsCi0gICAgIE9NWF9JTlQgZHN0U3RlcCwKLSAgICAgT01YX0lOVCBRUCwKLSAgICAgT01YX0lOVCBBQyAgICAgICAgCi0pCi17Ci0gICAgT01YX1MxNiBwQnVmZmVyWzE2KzRdOwotICAgIE9NWF9TMTYgKnBEZWx0YTsKLSAgICBpbnQgaSx4LHk7Ci0gICAgCi0gICAgYXJtUmV0QXJnRXJySWYocFByZWQgPT0gTlVMTCwgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBQcmVkKSxPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdCAgID09IE5VTEwsICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZFN0ZXAgJiAzLCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoZHN0U3RlcCAmIDMsICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoQUMhPTAgJiYgKFFQPDApLCAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoQUMhPTAgJiYgKFFQPjUxKSwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoQUMhPTAgJiYgcHBTcmM9PU5VTEwsICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoQUMhPTAgJiYgKnBwU3JjPT1OVUxMLCAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoQUM9PTAgJiYgcERDPT1OVUxMLCAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgCi0gICAgcERlbHRhID0gYXJtQWxpZ25UbzhCeXRlcyhwQnVmZmVyKTsgICAgCi0KLSAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKQotICAgIHsKLSAgICAgICAgcERlbHRhW2ldID0gMDsKLSAgICB9Ci0gICAgaWYgKEFDKQotICAgIHsKLSAgICAgICAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NChwcFNyYywgcERlbHRhKTsKLSAgICAgICAgRGVxdWFudEx1bWFBQzR4NChwRGVsdGEsIFFQKTsKLSAgICB9Ci0gICAgaWYgKHBEQykKLSAgICB7Ci0gICAgICAgIHBEZWx0YVswXSA9IHBEQ1swXTsKLSAgICB9Ci0gICAgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NChwRGVsdGEscERlbHRhKTsKLQotICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSAoT01YX1U4KWFybUNsaXAoMCwyNTUscFByZWRbeSpwcmVkU3RlcCt4XSArIHBEZWx0YVs0KnkreF0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMzRhOTYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGNocm9tYSBkZWJsb2NrIG1vZHVsZQotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kgICAoNi4zLjMuMy40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gdGhlIGhvcml6b250YWwgZWRnZXMgb2YgdGhlIGNocm9tYSAKLSAqIG1hY3JvYmxvY2sgKDh4OCkuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtIGFycmF5IHN0ZXA7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgcEFscGhhIC0gYXJyYXkgb2Ygc2l6ZSAyIGNvbnRhaW5pbmcgYWxwaGEgdGhyZXNob2xkczsgdGhlIGZpcnN0IGVsZW1lbnQgCi0gKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGFuZCB0aGUgCi0gKiAgICAgICAgICAgIHNlY29uZCBlbGVtZW50IGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIGludGVybmFsIGhvcml6b250YWwgCi0gKiAgICAgICAgICAgIGVkZ2UuICBQZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgCi0gKiAgICAgICAgICAgIFswLDI1NV0uIAotICogICBwQmV0YSAtIGFycmF5IG9mIHNpemUgMiBjb250YWluaW5nIGJldGEgdGhyZXNob2xkczsgdGhlIGZpcnN0IGVsZW1lbnQgCi0gKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGFuZCB0aGUgCi0gKiAgICAgICAgICAgIHNlY29uZCBlbGVtZW50IGNvbnRhaW5zIHRoZSB0aHJlc2hvbGQgZm9yIHRoZSBpbnRlcm5hbCAKLSAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLiAgUGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSA4IGNvbnRhaW5pbmcgdGhyZXNob2xkcywgVEMwLCBmb3IgdGhlIHRvcCAKLSAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlIG9mIGVhY2ggMng0IGNocm9tYSBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCAKLSAqICAgICAgICAgICAgYmxvY2sgb3JkZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNiBjb250YWluaW5nIEJTIHBhcmFtZXRlcnMgZm9yIGVhY2ggMngyIGNocm9tYSAKLSAqICAgICAgICAgICAgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgYmxvY2sgb3JkZXI7IHZhbGlkIGluIHRoZSByYW5nZSAKLSAqICAgICAgICAgICAgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgCi0gKiAgICAgICAgICAgIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gCi0gKiAgICAgICAgICAgIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyLCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBhbnkgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUy4gCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgIC0gICAgcFRocmVzaG9sZHMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgICAtICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAotICogICAgLSAgICBPbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwVGhyZXNob2xkc1swLi43XSBpcyBvdXRzaWRlIAotICogICAgICAgICBvZiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCi0gKiAgICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuCi0gKiAgICAtICAgIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSgKLSAgICAgT01YX1U4KiBwU3JjRHN0LAotICAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCi0gICAgIGNvbnN0IE9NWF9VOCogcEFscGhhLAotICAgICBjb25zdCBPTVhfVTgqIHBCZXRhLAotICAgICBjb25zdCBPTVhfVTgqIHBUaHJlc2hvbGRzLAotICAgICBjb25zdCBPTVhfVTggKnBCUyAgICAgICAgCi0gKQotewotICAgIGludCBJLCBYLCBZLCBJbnRlcm5hbD0wOwotCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjRHN0KSwgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihzcmNkc3RTdGVwICYgNywgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEFscGhhID09IE5VTEwsICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCZXRhID09IE5VTEwsICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkcyA9PSBOVUxMLCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBUaHJlc2hvbGRzKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCUyA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocEJTKSwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICBmb3IgKFk9MDsgWTw4OyBZKz00LCBJbnRlcm5hbD0xKQotICAgIHsKLSAgICAgICAgZm9yIChYPTA7IFg8ODsgWCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBJID0gKFg+PjEpKzQqKFk+PjEpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhcm1SZXRBcmdFcnJJZihwQlNbSV0gPiA0LCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYoIChJID4gMykgJiYgKHBCU1tJXSA9PSA0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYoIChJIDwgNCkgICAgICAgJiYgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICggKHBCU1tJXSA9PSA0KSAmJiAocEJTW0leMV0gIT0gNCkgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKiBGaWx0ZXIgaG9yaXpvbnRhbCBlZGdlIHdpdGggcTAgYXQgKFgsWSkgKi8KLSAgICAgICAgICAgIGFybVZDTTRQMTBfRGVCbG9ja1BpeGVsKAotICAgICAgICAgICAgICAgIHBTcmNEc3QgKyBZKnNyY2RzdFN0ZXAgKyBYLAotICAgICAgICAgICAgICAgIHNyY2RzdFN0ZXAsCi0gICAgICAgICAgICAgICAgcFRocmVzaG9sZHNbKFg+PjEpKzQqKFk+PjIpXSwKLSAgICAgICAgICAgICAgICBwQWxwaGFbSW50ZXJuYWxdLAotICAgICAgICAgICAgICAgIHBCZXRhW0ludGVybmFsXSwKLSAgICAgICAgICAgICAgICBwQlNbSV0sCi0gICAgICAgICAgICAgICAgMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBiMGU4Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgZGVibG9ja2luZyBtb2R1bGUKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JICAgKDYuMy4zLjMuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgdmVydGljYWwgZWRnZXMgb2YgdGhlIGNocm9tYSAKLSAqIG1hY3JvYmxvY2sgKDh4OCkuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBwQWxwaGEgLSBBcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgYWxwaGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyBmb3IgCi0gKiAgICAgICAgICAgIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSAKLSAqICAgICAgICAgICAgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAotICogICBwQmV0YSAtIEFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAotICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAotICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBiZXRhIHZhbHVlcyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgcFRocmVzaG9sZHMgLSBBcnJheSBvZiBzaXplIDggY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgbGVmdCAKLSAqICAgICAgICAgICAgdmVydGljYWwgZWRnZSBvZiBlYWNoIDR4MiBjaHJvbWEgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIAotICogICAgICAgICAgICBibG9jayBvcmRlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgUGVyIAotICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAotICogICBwQlMgLSBBcnJheSBvZiBzaXplIDE2IG9mIEJTIHBhcmFtZXRlcnMgKHZhbHVlcyBmb3IgZWFjaCAyeDIgY2hyb21hIAotICogICAgICAgICAgICBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIpLiBUaGlzIHBhcmFtZXRlciBpcyB0aGUgCi0gKiAgICAgICAgICAgIHNhbWUgYXMgdGhlIHBCU3BhcmFtZXRlciBwYXNzZWQgaW50byBGaWx0ZXJEZWJsb2NrTHVtYV9WZXJFZGdlOyAKLSAqICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIAotICogICAgICAgICAgICBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgCi0gKiAgICAgICAgICAgIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0IGJ5dGUgYWxpZ25lZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAotICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCi0gKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAotICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIHBUaHJlc2hvbGRzIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAotICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKLSAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uN10gaXMgb3V0c2lkZSAKLSAqICAgICAgICAgb2YgdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKLSAqICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAotICogICAgLSAgICBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0koCi0gICAgIE9NWF9VOCogcFNyY0RzdCwKLSAgICAgT01YX1MzMiBzcmNkc3RTdGVwLAotICAgICBjb25zdCBPTVhfVTgqIHBBbHBoYSwKLSAgICAgY29uc3QgT01YX1U4KiBwQmV0YSwKLSAgICAgY29uc3QgT01YX1U4KiBwVGhyZXNob2xkcywKLSAgICAgY29uc3QgT01YX1U4ICpwQlMgICAgICAgIAotICkKLXsKLSAgICBpbnQgSSwgWCwgWSwgSW50ZXJuYWw9MDsKLQotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0RzdCksICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoc3JjZHN0U3RlcCAmIDcsICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBBbHBoYSA9PSBOVUxMLCAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHMgPT0gTlVMTCwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwVGhyZXNob2xkcyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQlMgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBCUyksICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCZXRhWzBdID4gMTgsICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJldGFbMV0gPiAxOCwgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIGZvciAoWD0wOyBYPDg7IFgrPTQsIEludGVybmFsPTEpCi0gICAgewotICAgICAgICBmb3IgKFk9MDsgWTw4OyBZKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEkgPSAoWT4+MSkrNCooWD4+MSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFybVJldEFyZ0VycklmKHBCU1tJXSA+IDQsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYoIChJID4gMykgJiYgKHBCU1tJXSA9PSA0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFybVJldEFyZ0VycklmKCAoIChwQlNbSV0gPT0gNCkgJiYgKHBCU1tJXjNdICE9IDQpICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgICAgICAgICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHNbWV0gPiAyNSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qIEZpbHRlciB2ZXJ0aWNhbCBlZGdlIHdpdGggcTAgYXQgKFgsWSkgKi8KLSAgICAgICAgICAgIGFybVZDTTRQMTBfRGVCbG9ja1BpeGVsKAotICAgICAgICAgICAgICAgIHBTcmNEc3QgKyBZKnNyY2RzdFN0ZXAgKyBYLAotICAgICAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAgICAgcFRocmVzaG9sZHNbKFk+PjEpKzQqKFg+PjIpXSwKLSAgICAgICAgICAgICAgICBwQWxwaGFbSW50ZXJuYWxdLAotICAgICAgICAgICAgICAgIHBCZXRhW0ludGVybmFsXSwKLSAgICAgICAgICAgICAgICBwQlNbSV0sCi0gICAgICAgICAgICAgICAgMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTI5NGY4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGx1bWEgZGVibG9jayBtb2R1bGUKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSAgICg2LjMuMy4zLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyBvbiBmb3VyIGhvcml6b250YWwgZWRnZXMgb2YgdGhlIGx1bWEgCi0gKiBtYWNyb2Jsb2NrICgxNngxNikuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIHNyY2RzdFN0ZXAgLXMgdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBBbHBoYSAtIGFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYWxwaGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCi0gKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgCi0gKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgcEJldGEgLSBhcnJheSBvZiBzaXplIDIgb2YgYmV0YSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYmV0YSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIAotICogICAgICAgICAgICBpcyBmb3IgdGhlIGludGVybmFsIGhvcml6b250YWwgZWRnZSkuIFBlciBbSVNPMTQ0OTYtMTBdIGJldGEgCi0gKiAgICAgICAgICAgIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAotICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgMTYgY29udGFpbmluZyB0aHJlc2hvbGRzLCBUQzAsIGZvciB0aGUgdG9wIAotICogICAgICAgICAgICBob3Jpem9udGFsIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgYmxvY2sgCi0gKiAgICAgICAgICAgIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgW0lTTzE0NDk2IDEwXSAKLSAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayAKLSAqICAgICAgICAgICAgb3JkZXIpOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSAKLSAqICAgICAgICAgICAgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgotICogCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciwgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAotICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKLSAqICAgIC0gICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgLSAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgIC0gICAgcEJldGFbMF0gYW5kL29yIHBCZXRhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgICAtICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XSBpcyAKLSAqICAgICAgICAgb3V0c2lkZSBvZiB0aGUgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIC0gICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgICBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgCi0gKiAgICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0koCi0gICAgIE9NWF9VOCogcFNyY0RzdCwKLSAgICAgT01YX1MzMiBzcmNkc3RTdGVwLAotICAgICBjb25zdCBPTVhfVTgqIHBBbHBoYSwKLSAgICAgY29uc3QgT01YX1U4KiBwQmV0YSwKLSAgICAgY29uc3QgT01YX1U4KiBwVGhyZXNob2xkcywKLSAgICAgY29uc3QgT01YX1U4ICpwQlMgICAgICAgIAotICkKLXsKLSAgICBpbnQgSSwgWCwgWSwgSW50ZXJuYWw9MDsKLQotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiA3LCAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOyAgICAKLSAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkcyA9PSBOVUxMLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAKLSAgICBmb3IgKFk9MDsgWTwxNjsgWSs9NCwgSW50ZXJuYWw9MSkKLSAgICB7Ci0gICAgICAgIGZvciAoWD0wOyBYPDE2OyBYKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEkgPSAoWD4+MikrNCooWT4+Mik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFybVJldEFyZ0VycklmKHBCU1tJXSA+IDQsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgICAgICAgICAgCi0gICAgICAgICAgICBhcm1SZXRBcmdFcnJJZiggKEkgPiAzKSAmJiAocEJTW0ldID09IDQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgICAgICAgICAgCi0gICAgICAgICAgICBhcm1SZXRBcmdFcnJJZiggKEkgPCA0KSAgICAgICAmJiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKCAocEJTW0ldID09IDQpICYmIChwQlNbSV4xXSAhPSA0KSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBGaWx0ZXIgaG9yaXpvbnRhbCBlZGdlIHdpdGggcTAgYXQgKFgsWSkgKi8KLSAgICAgICAgICAgIGFybVZDTTRQMTBfRGVCbG9ja1BpeGVsKAotICAgICAgICAgICAgICAgIHBTcmNEc3QgKyBZKnNyY2RzdFN0ZXAgKyBYLAotICAgICAgICAgICAgICAgIHNyY2RzdFN0ZXAsCi0gICAgICAgICAgICAgICAgcFRocmVzaG9sZHNbSV0sCi0gICAgICAgICAgICAgICAgcEFscGhhW0ludGVybmFsXSwKLSAgICAgICAgICAgICAgICBwQmV0YVtJbnRlcm5hbF0sCi0gICAgICAgICAgICAgICAgcEJTW0ldLAotICAgICAgICAgICAgICAgIDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNlMjMyYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCBsdW1hIGRlYmxvY2sgbW9kdWxlCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kgICAoNi4zLjMuMy4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciB2ZXJ0aWNhbCBlZGdlcyBvZiB0aGUgbHVtYSAKLSAqIG1hY3JvYmxvY2sgKDE2eDE2KS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKLSAqICAgc3JjZHN0U3RlcCAtU3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwQWxwaGEgLUFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYWxwaGEgCi0gKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCi0gKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKiAgIHBCZXRhIC1BcnJheSBvZiBzaXplIDIgb2YgYmV0YSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyB0aGUgYmV0YSAKLSAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKLSAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlKTsgcGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSB2YWx1ZXMgCi0gKiAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCi0gKiAgIHBUaHJlc2hvbGRzIC1BcnJheSBvZiBzaXplIDE2IG9mIFRocmVzaG9sZHMgKFRDMCkgKHZhbHVlcyBmb3IgdGhlIGxlZnQgCi0gKiAgICAgICAgICAgIGVkZ2Ugb2YgZWFjaCA0eDQgYmxvY2ssIGFycmFuZ2VkIGluIHZlcnRpY2FsIGJsb2NrIG9yZGVyKTsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4uICBQZXIgW0lTTzE0NDk2LTEwXSB2YWx1ZXMgbXVzdCAKLSAqICAgICAgICAgICAgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCi0gKiAgIHBCUyAtQXJyYXkgb2Ygc2l6ZSAxNiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayAKLSAqICAgICAgICAgICAgb3JkZXIpOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSAKLSAqICAgICAgICAgICAgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKLSAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCi0gKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAotICogICAgRWl0aGVyIG9mIHRoZSBwb2ludGVycyBpbiBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTIAotICogICAgICAgICAgICAgIGlzIE5VTEwuIAotICogICAgRWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKiAgICBwU3JjRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICogICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgICBwQWxwaGFbMF0gYW5kL29yIHBBbHBoYVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyNTVdLiAKLSAqICAgIHBCZXRhWzBdIGFuZC9vciBwQmV0YVsxXSBpcyBvdXRzaWRlIHRoZSByYW5nZSBbMCwxOF0uIAotICogICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMTVdaXMgb3V0c2lkZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgcmFuZ2UgWzAsMjVdLiAKLSAqICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIChwQlNbaV09PTQgJiYgCi0gKiAgICAgICAgICAgICAgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JKAotICAgICBPTVhfVTgqIHBTcmNEc3QsCi0gICAgIE9NWF9TMzIgc3JjZHN0U3RlcCwKLSAgICAgY29uc3QgT01YX1U4KiBwQWxwaGEsCi0gICAgIGNvbnN0IE9NWF9VOCogcEJldGEsCi0gICAgIGNvbnN0IE9NWF9VOCogcFRocmVzaG9sZHMsCi0gICAgIGNvbnN0IE9NWF9VOCAqcEJTICAgICAgICAKLSApCi17Ci0gICAgaW50IFgsIFksIEksIEludGVybmFsPTA7Ci0KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBTcmNEc3QpLE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihzcmNkc3RTdGVwICYgMTUsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsgICAgCi0gICAgYXJtUmV0QXJnRXJySWYocEFscGhhID09IE5VTEwsICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJldGEgPT0gTlVMTCwgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHMgPT0gTlVMTCwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBUaHJlc2hvbGRzKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCUyA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocEJTKSwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJldGFbMF0gPiAxOCwgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQmV0YVsxXSA+IDE4LCAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIAotCi0gICAgZm9yIChYPTA7IFg8MTY7IFgrPTQsIEludGVybmFsPTEpCi0gICAgewotICAgICAgICBmb3IgKFk9MDsgWTwxNjsgWSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBJID0gKFk+PjIpKzQqKFg+PjIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhcm1SZXRBcmdFcnJJZihwQlNbWV0gPiA0LCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFybVJldEFyZ0VycklmKChwQlNbWV0gPT0gNCkgJiYgKFkgPiAzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFybVJldEFyZ0VycklmKCggKHBCU1tZXSA9PSA0KSAmJiAocEJTW1leM10gIT0gNCkgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkc1tZXSA+IDI1LCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIEZpbHRlciB2ZXJ0aWNhbCBlZGdlIHdpdGggcTAgYXQgKFgsWSkgKi8KLSAgICAgICAgICAgIGFybVZDTTRQMTBfRGVCbG9ja1BpeGVsKAotICAgICAgICAgICAgICAgIHBTcmNEc3QgKyBZKnNyY2RzdFN0ZXAgKyBYLAotICAgICAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAgICAgcFRocmVzaG9sZHNbSV0sCi0gICAgICAgICAgICAgICAgcEFscGhhW0ludGVybmFsXSwKLSAgICAgICAgICAgICAgICBwQmV0YVtJbnRlcm5hbF0sCi0gICAgICAgICAgICAgICAgcEJTW0ldLAotICAgICAgICAgICAgICAgIDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0dldFZMQ0luZm8uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfR2V0VkxDSW5mby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODA1NTJhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfR2V0VkxDSW5mby5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0dldFZMQ0luZm8uYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiAKLSAqIFRoaXMgZnVuY3Rpb24gZXh0cmFjdHMgcnVuLWxlbmd0aCBlbmNvZGluZyAoUkxFKSBpbmZvcm1hdGlvbgotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfR2V0VkxDSW5mbyAgICg2LjMuNS45LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzIHJ1bi1sZW5ndGggZW5jb2RpbmcgKFJMRSkgaW5mb3JtYXRpb24gZnJvbSB0aGUgCi0gKiBjb2VmZmljaWVudCBtYXRyaXguICBUaGUgcmVzdWx0cyBhcmUgcmV0dXJuZWQgaW4gYW4gT01YVkNNNFAxMFZMQ0luZm8gCi0gKiBzdHJ1Y3R1cmUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNDb2VmZiAtIHBvaW50ZXIgdG8gdGhlIHRyYW5zZm9ybSBjb2VmZmljaWVudCBtYXRyaXguICA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBTY2FuTWF0cml4IC0gcG9pbnRlciB0byB0aGUgc2NhbiBvcmRlciBkZWZpbml0aW9uIG1hdHJpeC4gIEZvciBhIGx1bWEgCi0gKiAgICAgICAgICAgIGJsb2NrIHRoZSBzY2FuIG1hdHJpeCBzaG91bGQgZm9sbG93IFtJU08xNDQ5Ni0xMF0gc2VjdGlvbiA4LjUuNCwgCi0gKiAgICAgICAgICAgIGFuZCBzaG91bGQgY29udGFpbiB0aGUgdmFsdWVzIDAsIDEsIDQsIDgsIDUsIDIsIDMsIDYsIDksIDEyLCAxMywgCi0gKiAgICAgICAgICAgIDEwLCA3LCAxMSwgMTQsIDE1LiAgRm9yIGEgY2hyb21hIGJsb2NrLCB0aGUgc2NhbiBtYXRyaXggc2hvdWxkIAotICogICAgICAgICAgICBjb250YWluIHRoZSB2YWx1ZXMgMCwgMSwgMiwgMy4gCi0gKiAgIGJBQyAtIGluZGljYXRlcyBwcmVzZW5jZSBvZiBhIERDIGNvZWZmaWNpZW50OyAwID0gREMgY29lZmZpY2llbnQgCi0gKiAgICAgICAgICAgIHByZXNlbnQsIDE9IERDIGNvZWZmaWNpZW50IGFic2VudC4gCi0gKiAgIE1heE51bUNvZWYgLSBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgY29udGFpbmVkIGluIHRoZSAKLSAqICAgICAgICAgICAgdHJhbnNmb3JtIGNvZWZmaWNpZW50IG1hdHJpeCwgcFNyY0NvZWZmLiBUaGUgdmFsdWUgc2hvdWxkIGJlIDE2IAotICogICAgICAgICAgICBmb3IgYmxvY2tzIG9mIHR5cGUgTFVNQURDLCBMVU1BQUMsIExVTUFMRVZFTCwgYW5kIENIUk9NQUFDLiBUaGUgCi0gKiAgICAgICAgICAgIHZhbHVlIHNob3VsZCBiZSA0IGZvciBibG9ja3Mgb2YgdHlwZSBDSFJPTUFEQy4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RWTENJbmZvIC0gcG9pbnRlciB0byBzdHJ1Y3R1cmUgdGhhdCBzdG9yZXMgaW5mb3JtYXRpb24gZm9yIAotICogICAgICAgICAgICBydW4tbGVuZ3RoIGNvZGluZy4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgcFNyY0NvZWZmLCBwU2Nhbk1hdHJpeCwgcERzdFZMQ0luZm8gCi0gKiAgICAtICAgIHBTcmNDb2VmZiBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9HZXRWTENJbmZvICgKLQljb25zdCBPTVhfUzE2KgkJICAgIHBTcmNDb2VmZiwKLQljb25zdCBPTVhfVTgqCQkJICAgIHBTY2FuTWF0cml4LAotCU9NWF9VOAkJCSAgICBiQUMsCi0JT01YX1UzMgkJCSAgICBNYXhOdW1Db2VmLAotCU9NWFZDTTRQMTBWTENJbmZvKglwRHN0VkxDSW5mbwotKQotewotICAgIE9NWF9JTlQgICAgIGksIE1pbkluZGV4OwotICAgIE9NWF9TMzIgICAgIFZhbHVlOwotICAgIE9NWF9VMzIgICAgIE1hc2sgPSA0LCBSdW5CZWZvcmU7Ci0gICAgT01YX1MxNiAgICAgKnBMZXZlbDsKLSAgICBPTVhfVTggICAgICAqcFJ1bjsKLSAgICBPTVhfUzE2ICAgICBCdWYgWzE2XTsKLQotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmNDb2VmZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0NvZWZmKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocFNjYW5NYXRyaXggPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdFZMQ0luZm8gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYkFDID4gMSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoTWF4TnVtQ29lZiA+IDE2LCBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIC8qIEluaXRpYWxpemUgUkxFIEluZm8gc3RydWN0dXJlICovCi0gICAgcERzdFZMQ0luZm8tPnVUcmFpbGluZ19PbmVzID0gMDsKLSAgICBwRHN0VkxDSW5mby0+dVRyYWlsaW5nX09uZV9TaWducyA9IDA7Ci0gICAgcERzdFZMQ0luZm8tPnVOdW1Db2VmZnMgPSAwOwotICAgIHBEc3RWTENJbmZvLT51VG90YWxaZXJvcyA9IDA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICB7Ci0gICAgICAgIHBEc3RWTENJbmZvLT5pTGV2ZWxzIFtpXSA9IDA7Ci0gICAgICAgIHBEc3RWTENJbmZvLT51UnVucyBbaV0gPSAwOwotICAgIH0KLSAgICAKLSAgICBNaW5JbmRleCA9IChiQUMgPT0gMCAmJiBNYXhOdW1Db2VmID09IDE1KSA/IDEgOiAwOwotICAgIGZvciAoaSA9IE1pbkluZGV4OyBpIDwgKE1heE51bUNvZWYgKyBNaW5JbmRleCk7IGkrKykKLSAgICB7ICAgICAgICAKLSAgICAgICAgLyogU2NhbiAqLwotICAgICAgICBCdWYgW2kgLSBNaW5JbmRleF0gPSBwU3JjQ29lZmYgW3BTY2FuTWF0cml4IFtpXV07Ci0gICAgfQotCi0gICAgLyogc2tpcCB6ZXJvcyBhdCB0aGUgZW5kICovCi0gICAgaSA9IE1heE51bUNvZWYgLSAxOwotICAgIHdoaWxlICghQnVmIFtpXSAmJiBpID49IDApCi0gICAgewotICAgICAgICBpLS07Ci0gICAgfQotICAgIAotICAgIGlmIChpIDwgMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotICAgIH0KLQotICAgIC8qIEZpbGwgUkxFIEluZm8gc3RydWN0dXJlICovCi0gICAgcExldmVsID0gcERzdFZMQ0luZm8tPmlMZXZlbHM7Ci0gICAgcFJ1biA9IHBEc3RWTENJbmZvLT51UnVuczsKLSAgICBSdW5CZWZvcmUgPSAwOwotCi0gICAgLyogSGFuZGxlIGZpcnN0IG5vbiB6ZXJvIHNlcGFyYXRlICovCi0gICAgcERzdFZMQ0luZm8tPnVOdW1Db2VmZnMrKzsKLSAgICBWYWx1ZSA9IEJ1ZiBbaV07Ci0gICAgaWYgKFZhbHVlID09IDEgfHwgVmFsdWUgPT0gLTEpCi0gICAgewotICAgICAgICBwRHN0VkxDSW5mby0+dVRyYWlsaW5nX09uZXMrKzsKLSAgICAgICAgCi0gICAgICAgIHBEc3RWTENJbmZvLT51VHJhaWxpbmdfT25lX1NpZ25zIHw9IAotICAgICAgICAgICAgVmFsdWUgPT0gLTEgPyBNYXNrIDogMDsKLSAgICAgICAgTWFzayA+Pj0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgVmFsdWUgLT0gKFZhbHVlID4gMCA/IDEgOiAtMSk7Ci0gICAgICAgICpwTGV2ZWwrKyA9IFZhbHVlOwotICAgICAgICBNYXNrID0gMDsKLSAgICB9Ci0KLSAgICAvKiBSZW1haW5pbmcgbm9uIHplcm8gKi8KLSAgICB3aGlsZSAoLS1pID49IDApCi0gICAgewotICAgICAgICBWYWx1ZSA9IEJ1ZiBbaV07Ci0gICAgICAgIGlmIChWYWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgcERzdFZMQ0luZm8tPnVOdW1Db2VmZnMrKzsKLQotICAgICAgICAgICAgLyogTWFzayBiZWNvbWVzIHplcm8gYWZ0ZXIgZW50ZXJpbmcgKi8KLSAgICAgICAgICAgIGlmIChNYXNrICYmCi0gICAgICAgICAgICAgICAgKFZhbHVlID09IDEgfHwgCi0gICAgICAgICAgICAgICAgIFZhbHVlID09IC0xKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwRHN0VkxDSW5mby0+dVRyYWlsaW5nX09uZXMrKzsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwRHN0VkxDSW5mby0+dVRyYWlsaW5nX09uZV9TaWducyB8PSAKLSAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT0gLTEgPyBNYXNrIDogMDsKLSAgICAgICAgICAgICAgICBNYXNrID4+PSAxOwotICAgICAgICAgICAgICAgICpwUnVuKysgPSBSdW5CZWZvcmU7Ci0gICAgICAgICAgICAgICAgUnVuQmVmb3JlID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBJZiAzIHRyYWlsaW5nIG9uZXMgYXJlIG5vdCBjb21wbGV0ZWQgKi8KLSAgICAgICAgICAgICAgICBpZiAoTWFzaykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE1hc2sgPSAwOwotICAgICAgICAgICAgICAgICAgICBWYWx1ZSAtPSAoVmFsdWUgPiAwID8gMSA6IC0xKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKnBMZXZlbCsrID0gVmFsdWU7Ci0gICAgICAgICAgICAgICAgKnBSdW4rKyA9IFJ1bkJlZm9yZTsKLSAgICAgICAgICAgICAgICBSdW5CZWZvcmUgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcERzdFZMQ0luZm8tPnVUb3RhbFplcm9zKys7Ci0gICAgICAgICAgICBSdW5CZWZvcmUrKzsKLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotICAgIAotICAgIC8qIFVwZGF0ZSBsYXN0IHJ1biAqLwotICAgIGlmIChSdW5CZWZvcmUpCi0gICAgewotICAgICAgICAqcFJ1bisrID0gUnVuQmVmb3JlOwotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODgyNGQ4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYworKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgMS84IFBpeGVsIGludGVycG9sYXRpb24gZm9yIENocm9tYSBCbG9jawotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICAgKDYuMy4zLjIuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIDEvOC1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBjaHJvbWEgTUIuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLVBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyIAotICogICBzcmNTdGVwIC1SZWZlcmVuY2UgZnJhbWUgc3RlcCBpbiBieXRlcyAKLSAqICAgZHN0U3RlcCAtRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAotICogICAgICAgICAgICByb2kud2lkdGguIAotICogICBkeCAtRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQgaW4gMS84IHBpeGVsIAotICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10gCi0gKiAgIGR5IC1GcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQgaW4gMS84IHBpeGVsIAotICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10gCi0gKiAgIHJvaSAtRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjsgdGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCAKLSAqICAgICAgICAgICAgcm9pLmhlaWdodCBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciAyLCA0LCBvciA4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZnJhbWUgYnVmZmVyIGlmIHJvaS53aWR0aD09MiwgIDItYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkIGlmIHJvaS53aWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKiAgICAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAotICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKLSAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCi0gKiAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgPCA4LiAKLSAqICAgIGR4IG9yIGR5IGlzIG91dCBvZiByYW5nZSBbMC03XS4gCi0gKiAgICByb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBvdXQgb2YgcmFuZ2UgezIsNCw4fS4gCi0gKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gMiwgYnV0IHBEc3QgaXMgbm90IDItYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAotICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDgsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCi0gKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICgKLSAgICAgY29uc3QgT01YX1U4KiBwU3JjLAotICAgICBPTVhfUzMyIHNyY1N0ZXAsCi0gICAgIE9NWF9VOCogcERzdCwKLSAgICAgT01YX1MzMiBkc3RTdGVwLAotICAgICBPTVhfUzMyIGR4LAotICAgICBPTVhfUzMyIGR5LAotICAgICBPTVhTaXplIHJvaQotICkKLXsKLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoc3JjU3RlcCA8IDgsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGRzdFN0ZXAgPCA4LCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihkeCA8IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGR4ID4gNywgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoZHkgPCAwLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihkeSA+IDcsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChyb2kud2lkdGggIT0gMikgJiYgKHJvaS53aWR0aCAhPSA0KSAmJiAocm9pLndpZHRoICE9IDgpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigocm9pLmhlaWdodCAhPSAyKSAmJiAocm9pLmhlaWdodCAhPSA0KSAmJiAocm9pLmhlaWdodCAhPSA4KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKHJvaS53aWR0aCA9PSAyKSAmJiBhcm1Ob3QyQnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChyb2kud2lkdGggPT0gNCkgJiYgYXJtTm90NEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigocm9pLndpZHRoID09IDgpICYmIGFybU5vdDhCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoc3JjU3RlcCAmIDcsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGRzdFN0ZXAgJiA3LCBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIHJldHVybiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYSAKLSAgICAgICAgKChPTVhfVTgqKXBTcmMsIHNyY1N0ZXAsIHBEc3QsIGRzdFN0ZXAsIHJvaS53aWR0aCwgcm9pLmhlaWdodCwgZHgsIGR5KTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmM4MjA4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEuYworKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgSGFsZiBob3Jpem9udGFsIGx1bWEgaW50ZXJwb2xhdGlvbgotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAgICg2LjMuNS41LjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIHR3byBob3Jpem9udGFsIDEvMi1wZWwgcG9zaXRpb25zIAotICogKC0xLzIsMCkgYW5kICgxLzIsIDApIC0gYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgaW4gCi0gKiAgICAgICAgICAgIHRoZSByZWNvbnN0cnVjdGlvbiBmcmFtZSBwbGFuZS4gCi0gKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gCi0gKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24oaW50ZXJwb2xhdGlvbikgYnVmZmVyOyBtdXN0IGJlIGEgCi0gKiAgICAgICAgICAgIG11bHRpcGxlIG9mIGlXaWR0aC4gCi0gKiAgIGlXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byA0LCA4LCBvciAxNiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdExlZnQgLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSBsZWZ0IC1wZWwgcG9zaXRpb24gCi0gKiAgICAgICAgICAgICgtMS8yLCAwKSAKLSAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBEc3RSaWdodCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIHJpZ2h0IC1wZWwgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uICgxLzIsIDApIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICAgcFNyYywgcERzdExlZnQsIG9yIHBEc3RSaWdodCAKLSAqICAgIC0gICAgaVdpZHRoIG9yIGlIZWlnaHQgaGF2ZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNiAKLSAqICAgIC0gICAgaVdpZHRoPT00IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVdpZHRoPT04IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgaVdpZHRoPT0xNiBidXQgcERzdExlZnQgYW5kL29yIHBEc3RSaWdodCBpcy9hcmUgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAotICogICAgLSAgICBhbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hKAotICAgICAgICBjb25zdCBPTVhfVTgqICAgICBwU3JjLCAKLSAgICAgICAgT01YX1UzMiAgICAgaVNyY1N0ZXAsIAotICAgICAgICBPTVhfVTgqICAgICBwRHN0TGVmdCwgCi0gICAgICAgIE9NWF9VOCogICAgIHBEc3RSaWdodCwgCi0gICAgICAgIE9NWF9VMzIgICAgIGlEc3RTdGVwLCAKLSAgICAgICAgT01YX1UzMiAgICAgaVdpZHRoLCAKLSAgICAgICAgT01YX1UzMiAgICAgaUhlaWdodAotKQotewotICAgIE9NWFJlc3VsdCAgIFJldFZhbHVlOyAgICAKLQotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdExlZnQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdFJpZ2h0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpV2lkdGggPT0gNCkgJiYgCi0gICAgICAgICAgICAgICAgICAgYXJtTm90NEJ5dGVBbGlnbmVkKHBEc3RMZWZ0KSAmJgotICAgICAgICAgICAgICAgICAgIGFybU5vdDRCeXRlQWxpZ25lZChwRHN0UmlnaHQpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaVdpZHRoID09IDgpICYmIAotICAgICAgICAgICAgICAgICAgIGFybU5vdDhCeXRlQWxpZ25lZChwRHN0TGVmdCkgJiYKLSAgICAgICAgICAgICAgICAgICBhcm1Ob3Q4Qnl0ZUFsaWduZWQocERzdFJpZ2h0KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlXaWR0aCA9PSAxNikgJiYgCi0gICAgICAgICAgICAgICAgICAgYXJtTm90MTZCeXRlQWxpZ25lZChwRHN0TGVmdCkgJiYKLSAgICAgICAgICAgICAgICAgICBhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBEc3RSaWdodCksIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gMTYpICYmIChpSGVpZ2h0ICE9IDgpJiYgKGlIZWlnaHQgIT0gNCksIE9NWF9TdHNfQmFkQXJnRXJyKQotCWFybVJldEFyZ0VycklmKChpV2lkdGggIT0gMTYpICYmIChpV2lkdGggIT0gOCkmJiAoaVdpZHRoICE9IDQpLCBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIFJldFZhbHVlID0gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZIb3JfTHVtYSAoCi0gICAgICAgIHBTcmMgLSAxLCAgICAgCi0gICAgICAgIGlTcmNTdGVwLCAKLSAgICAgICAgcERzdExlZnQsICAgICAKLSAgICAgICAgaURzdFN0ZXAsIAotICAgICAgICBpV2lkdGgsICAgCi0gICAgICAgIGlIZWlnaHQpOwotCi0gICAgaWYgKFJldFZhbHVlICE9IE9NWF9TdHNfTm9FcnIpCi0gICAgewotICAgICAgICByZXR1cm4gUmV0VmFsdWU7Ci0gICAgfQotCi0gICAgUmV0VmFsdWUgPSBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICgKLSAgICAgICAgcFNyYywgICAgIAotICAgICAgICBpU3JjU3RlcCwgCi0gICAgICAgIHBEc3RSaWdodCwgICAgIAotICAgICAgICBpRHN0U3RlcCwgCi0gICAgICAgIGlXaWR0aCwgICAKLSAgICAgICAgaUhlaWdodCk7Ci0KLSAgICByZXR1cm4gUmV0VmFsdWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YzE4NmIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBTQUQgZm9yIDR4NCBibG9ja3MKLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSAgICg2LjMuNS41LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIHR3byB2ZXJ0aWNhbCAxLzItcGVsIHBvc2l0aW9ucyAtIAotICogKDAsIC0xLzIpIGFuZCAoMCwgMS8yKSAtIGFyb3VuZCBhIGZ1bGwtcGVsIHBvc2l0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0b3AtbGVmdCBjb3JuZXIgb2YgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUgCi0gKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gCi0gKiAgIGlEc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gKGludGVycG9sYXRpb24pIGJ1ZmZlcjsgbXVzdCBiZSBhIAotICogICAgICAgICAgICBtdWx0aXBsZSBvZiBpV2lkdGguIAotICogICBpV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0VXAgLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAtcGVsIHBvc2l0aW9uIGFib3ZlIAotICogICAgICAgICAgICB0aGUgY3VycmVudCBmdWxsLXBlbCBwb3NpdGlvbiAoMCwgLTEvMikgCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcERzdERvd24gLVBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAtcGVsIHBvc2l0aW9uIGJlbG93IAotICogICAgICAgICAgICB0aGUgY3VycmVudCBmdWxsLXBlbCBwb3NpdGlvbiAoMCwgMS8yKSAKLSAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTgsIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgIHBTcmMsIHBEc3RVcCwgb3IgcERzdERvd24gCi0gKiAgICAtICAgIGlXaWR0aCBvciBpSGVpZ2h0IGhhdmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYgCi0gKiAgICAtICAgIGlXaWR0aD09NCBidXQgcERzdFVwIGFuZC9vciBwRHN0RG93biBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlXaWR0aD09OCBidXQgcERzdFVwIGFuZC9vciBwRHN0RG93biBpcy9hcmUgbm90IGFsaWduZWQgb24gYSA4LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlXaWR0aD09MTYgYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLSBPTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSggIAotICAgICBjb25zdCBPTVhfVTgqICAgIHBTcmMsIAotICAgICBPTVhfVTMyICAgIGlTcmNTdGVwLCAKLSAgICAgT01YX1U4KiAgICBwRHN0VXAsIAotICAgICBPTVhfVTgqICAgIHBEc3REb3duLCAKLSAgICAgT01YX1UzMiAgICBpRHN0U3RlcCwgCi0gICAgIE9NWF9VMzIgICAgaVdpZHRoLCAKLSAgICAgT01YX1UzMiAgICBpSGVpZ2h0Ci0pCi17Ci0gICAgT01YUmVzdWx0ICAgUmV0VmFsdWU7Ci0KLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3RVcCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0RG93biA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaVdpZHRoID09IDQpICYmIAotICAgICAgICAgICAgICAgICAgIGFybU5vdDRCeXRlQWxpZ25lZChwRHN0VXApICYmCi0gICAgICAgICAgICAgICAgICAgYXJtTm90NEJ5dGVBbGlnbmVkKHBEc3REb3duKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlXaWR0aCA9PSA4KSAmJiAKLSAgICAgICAgICAgICAgICAgICBhcm1Ob3Q4Qnl0ZUFsaWduZWQocERzdFVwKSAmJgotICAgICAgICAgICAgICAgICAgIGFybU5vdDhCeXRlQWxpZ25lZChwRHN0RG93biksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpV2lkdGggPT0gMTYpICYmIAotICAgICAgICAgICAgICAgICAgIGFybU5vdDE2Qnl0ZUFsaWduZWQocERzdFVwKSAmJgotICAgICAgICAgICAgICAgICAgIGFybU5vdDE2Qnl0ZUFsaWduZWQocERzdERvd24pLCBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIGFybVJldEFyZ0VycklmKChpSGVpZ2h0ICE9IDE2KSAmJiAoaUhlaWdodCAhPSA4KSYmIChpSGVpZ2h0ICE9IDQpLCBPTVhfU3RzX0JhZEFyZ0VycikKLQlhcm1SZXRBcmdFcnJJZigoaVdpZHRoICE9IDE2KSAmJiAoaVdpZHRoICE9IDgpJiYgKGlXaWR0aCAhPSA0KSwgT01YX1N0c19CYWRBcmdFcnIpCi0KLSAgICBSZXRWYWx1ZSA9IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEoICAKLSAgICAgICAgcFNyYyAtIGlTcmNTdGVwLCAKLSAgICAgICAgaVNyY1N0ZXAsIAotICAgICAgICBwRHN0VXAsCi0gICAgICAgIGlEc3RTdGVwLCAKLSAgICAgICAgaVdpZHRoLCAKLSAgICAgICAgaUhlaWdodCk7Ci0gICAgCi0gICAgaWYgKFJldFZhbHVlICE9IE9NWF9TdHNfTm9FcnIpCi0gICAgewotICAgICAgICByZXR1cm4gUmV0VmFsdWU7Ci0gICAgfQotCi0gICAgUmV0VmFsdWUgPSBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZlZlcl9MdW1hKCAgCi0gICAgICAgIHBTcmMsIAotICAgICAgICBpU3JjU3RlcCwgCi0gICAgICAgIHBEc3REb3duLAotICAgICAgICBpRHN0U3RlcCwgCi0gICAgICAgIGlXaWR0aCwgCi0gICAgICAgIGlIZWlnaHQpOwotICAgIAotICAgIHJldHVybiBSZXRWYWx1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmE4MTYzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBQZXJmb3JtcyBxdWFydGVyLXBpeGVsIGludGVycG9sYXRpb24gCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYSAgICg2LjMuMy4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBxdWFydGVyLXBpeGVsIGludGVycG9sYXRpb24gZm9yIGludGVyIGx1bWEgTUIuIEl0IGlzIGFzc3VtZWQgdGhhdCAKLSAqIHRoZSBmcmFtZSBpcyBhbHJlYWR5IHBhZGRlZCB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIgCi0gKiAgIHNyY1N0ZXAgLXJlZmVyZW5jZSBmcmFtZSBzdGVwLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHJvaS53aWR0aCAKLSAqICAgZHN0U3RlcCAtZGVzdGluYXRpb24gZnJhbWUgc3RlcCwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAKLSAqICAgICAgICAgICAgcm9pLndpZHRoIAotICogICBkeCAtRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciBjb21wb25lbnQgaW4gMS80IHBpeGVsIAotICogICAgICAgICAgICB1bml0OyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsM10gCi0gKiAgIGR5IC1GcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciB5IGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgCi0gKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXSAKLSAqICAgcm9pIC1EaW1lbnNpb24gb2YgdGhlIGludGVycG9sYXRpb24gcmVnaW9uOyB0aGUgcGFyYW1ldGVycyByb2kud2lkdGggYW5kIAotICogICAgICAgICAgICByb2kuaGVpZ2h0IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZnJhbWUgYnVmZmVyIGlmIHJvaS53aWR0aD09NCwgIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkIGlmIHJvaS53aWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCi0gKiAgICAgICAgICAgIGlmIHJvaS53aWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCA8IHJvaS53aWR0aC4gCi0gKiAgICBkeCBvciBkeSBpcyBvdXQgb2YgcmFuZ2UgWzAsM10uIAotICogICAgcm9pLndpZHRoIG9yIHJvaS5oZWlnaHQgaXMgb3V0IG9mIHJhbmdlIHs0LCA4LCAxNn0uIAotICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIGJ1dCBwRHN0IGlzIG5vdCA0IGJ5dGUgYWxpZ25lZC4gCi0gKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gOCBvciAxNiwgYnV0IHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKLSAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hICgKLSAgICAgY29uc3QgT01YX1U4KiBwU3JjLAotICAgICBPTVhfUzMyIHNyY1N0ZXAsCi0gICAgIE9NWF9VOCogcERzdCwKLSAgICAgT01YX1MzMiBkc3RTdGVwLAotICAgICBPTVhfUzMyIGR4LAotICAgICBPTVhfUzMyIGR5LAotICAgICBPTVhTaXplIHJvaSAgICAgICAgCi0gKQotewotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihzcmNTdGVwIDwgcm9pLndpZHRoLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihkc3RTdGVwIDwgcm9pLndpZHRoLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihkeCA8IDAsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGR4ID4gMywgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoZHkgPCAwLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihkeSA+IDMsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChyb2kud2lkdGggIT0gNCkgJiYgKHJvaS53aWR0aCAhPSA4KSAmJiAocm9pLndpZHRoICE9IDE2KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKHJvaS5oZWlnaHQgIT0gNCkgJiYgKHJvaS5oZWlnaHQgIT0gOCkgJiYgKHJvaS5oZWlnaHQgIT0gMTYpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigocm9pLndpZHRoID09IDQpICYmIGFybU5vdDRCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKHJvaS53aWR0aCA9PSA4KSAmJiBhcm1Ob3Q4Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChyb2kud2lkdGggPT0gMTYpICYmIGFybU5vdDE2Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHNyY1N0ZXAgJiA3LCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihkc3RTdGVwICYgNywgT01YX1N0c19CYWRBcmdFcnIpIAotCi0gICAgcmV0dXJuIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYSAKLSAgICAgICAgKHBTcmMsIHNyY1N0ZXAsIHBEc3QsIGRzdFN0ZXAsIHJvaS53aWR0aCwgcm9pLmhlaWdodCwgZHgsIGR5KTsKLQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjllNzY4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIDR4NCBoYWRhbWFyZCB0cmFuc2Zvcm0gb2YgY2hyb21hIERDICAKLSAqIGNvZWZmaWNpZW50cyBhbmQgcXVhbnRpemF0aW9uCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgICAoNi4zLjUuNi40KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIDJ4MiBIYWRhbWFyZCB0cmFuc2Zvcm0gYW5kIHRoZW4gZGVxdWFudGl6ZXMgCi0gKiB0aGUgY29lZmZpY2llbnRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgMngyIGFycmF5IG9mIHRoZSAyeDIgSGFkYW1hcmQtdHJhbnNmb3JtZWQgYW5kIAotICogICAgICAgICAgICBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgOCBieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIGludmVyc2UtdHJhbnNmb3JtZWQgYW5kIGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIAotICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgCi0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDKAotCWNvbnN0IE9NWF9TMTYqIAlwU3JjLAotCU9NWF9TMTYqCXBEc3QsCi0JT01YX1UzMgkJaVFQCi0pCi17Ci0gICAgT01YX0lOVCAgICAgaSwgajsKLSAgICBPTVhfUzMyICAgICBtWzJdWzJdOwotICAgIE9NWF9TMzIgICAgIFFQZXIsIFYwMCwgVmFsdWU7Ci0KLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoaVFQID4gNTEsIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgLyogSW52IEhhZGFtYXJkIFRyYW5zZm9ybSBmb3IgMngyIGJsb2NrICovCi0gICAgbVswXVswXSA9IHBTcmNbMF0gKyBwU3JjWzFdICsgIHBTcmNbMl0gKyBwU3JjWzNdOwotICAgIG1bMF1bMV0gPSBwU3JjWzBdIC0gcFNyY1sxXSArICBwU3JjWzJdIC0gcFNyY1szXTsKLSAgICBtWzFdWzBdID0gcFNyY1swXSArIHBTcmNbMV0gLSAgcFNyY1syXSAtIHBTcmNbM107Ci0gICAgbVsxXVsxXSA9IHBTcmNbMF0gLSBwU3JjWzFdIC0gIHBTcmNbMl0gKyBwU3JjWzNdOwotCi0gICAgLyogUXVhbnRpemF0aW9uICovCi0gICAgLyogU2NhbGluZyAqLwotICAgIFFQZXIgPSBpUVAgLyA2OwotICAgIFYwMCA9IGFybVZDTTRQMTBfVk1hdHJpeCBbaVFQICUgNl1bMF07Ci0KLSAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKFFQZXIgPCAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZhbHVlID0gKG1bal1baV0gKiBWMDApID4+IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVmFsdWUgPSAobVtqXVtpXSAqIFYwMCkgPDwgKFFQZXIgLSAxKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcERzdFtqICogMiArIGldID0gKE9NWF9TMTYpIFZhbHVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZjE1Y2YuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSA0eDQgaGFkYW1hcmQgdHJhbnNmb3JtIG9mIGx1bWEgREMgY29lZmZpY2llbnRzIAotICogYW5kIHF1YW50aXphdGlvbgotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQyAgICg2LjMuNS42LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgNHg0IEhhZGFtYXJkIHRyYW5zZm9ybSBhbmQgdGhlbiBkZXF1YW50aXplcyAKLSAqIHRoZSBjb2VmZmljaWVudHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSA0eDQgYXJyYXkgb2YgdGhlIDR4NCBIYWRhbWFyZC10cmFuc2Zvcm1lZCBhbmQgCi0gKiAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudHMuICAxNiBieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIGludmVyc2UtdHJhbnNmb3JtZWQgYW5kIGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIAotICogICAgICAgICAgICAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjIAotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9MdW1hREMoCQotCWNvbnN0IE9NWF9TMTYqIAlwU3JjLAotCU9NWF9TMTYqCXBEc3QsCi0JT01YX1UzMgkJaVFQCi0pCi17Ci0gICAgT01YX0lOVCAgICAgaSwgajsKLSAgICBPTVhfUzMyICAgICBtMVs0XVs0XSwgbTJbNF1bNF0sIFZhbHVlOwotICAgIE9NWF9TMzIgICAgIFFQZXIsIFY7Ci0KLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoaVFQID4gNTEsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgLyogSW52IEhhZGFtYXJkIFRyYW5zZm9ybSBmb3IgREMgTHVtYSA0eDQgYmxvY2sgKi8KLSAgICAvKiBIb3Jpem9udGFsICovCi0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICB7Ci0gICAgICAgIGogPSBpICogNDsKLSAgICAgICAgCi0gICAgICAgIG0xW2ldWzBdID0gcFNyY1tqICsgMF0gKyBwU3JjW2ogKyAyXTsgLyogYStjICovCi0gICAgICAgIG0xW2ldWzFdID0gcFNyY1tqICsgMV0gKyBwU3JjW2ogKyAzXTsgLyogYitkICovCi0gICAgICAgIG0xW2ldWzJdID0gcFNyY1tqICsgMF0gLSBwU3JjW2ogKyAyXTsgLyogYS1jICovCi0gICAgICAgIG0xW2ldWzNdID0gcFNyY1tqICsgMV0gLSBwU3JjW2ogKyAzXTsgLyogYi1kICovCi0KLSAgICAgICAgbTJbaV1bMF0gPSBtMVtpXVswXSArIG0xW2ldWzFdOyAvKiBhK2IrYytkICovCi0gICAgICAgIG0yW2ldWzFdID0gbTFbaV1bMl0gKyBtMVtpXVszXTsgLyogYStiLWMtZCAqLwotICAgICAgICBtMltpXVsyXSA9IG0xW2ldWzJdIC0gbTFbaV1bM107IC8qIGEtYi1jK2QgKi8KLSAgICAgICAgbTJbaV1bM10gPSBtMVtpXVswXSAtIG0xW2ldWzFdOyAvKiBhLWIrYy1kICovCi0KLSAgICB9Ci0KLSAgICAvKiBWZXJ0aWNhbCAqLwotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgewotICAgICAgICBtMVswXVtpXSA9IG0yWzBdW2ldICsgbTJbMl1baV07Ci0gICAgICAgIG0xWzFdW2ldID0gbTJbMV1baV0gKyBtMlszXVtpXTsKLSAgICAgICAgbTFbMl1baV0gPSBtMlswXVtpXSAtIG0yWzJdW2ldOwotICAgICAgICBtMVszXVtpXSA9IG0yWzFdW2ldIC0gbTJbM11baV07Ci0KLSAgICAgICAgbTJbMF1baV0gPSBtMVswXVtpXSArIG0xWzFdW2ldOwotICAgICAgICBtMlsxXVtpXSA9IG0xWzJdW2ldICsgbTFbM11baV07Ci0gICAgICAgIG0yWzJdW2ldID0gbTFbMl1baV0gLSBtMVszXVtpXTsKLSAgICAgICAgbTJbM11baV0gPSBtMVswXVtpXSAtIG0xWzFdW2ldOwotICAgIH0KLQotICAgIAotICAgIC8qIFNjYWxpbmcgKi8KLSAgICBRUGVyID0gaVFQIC8gNjsKLSAgICBWID0gYXJtVkNNNFAxMF9WTWF0cml4IFtpUVAgJSA2XVswXTsKLQotICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoUVBlciA8IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVmFsdWUgPSAobTJbal1baV0gKiBWICsgKDEgPDwgKDEgLSBRUGVyKSkpID4+ICgyIC0gUVBlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVmFsdWUgPSBtMltqXVtpXSAqIFYgKiAoMSA8PCAoUVBlciAtIDIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgcERzdFtqICogNCArIGldID0gKE9NWF9TMTYpIFZhbHVlOwotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZTQ1MTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1SZXNpZHVhbEFuZEFkZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGludmVyc2UgaW50ZWdlciA0eDQgdHJhbnNmb3JtCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICAgKDYuMy41LjcuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSBhbiA0eDQgaW50ZWdlciB0cmFuc2Zvcm1hdGlvbiB0byBwcm9kdWNlIAotICogdGhlIGRpZmZlcmVuY2Ugc2lnbmFsIGFuZCB0aGVuIGFkZHMgdGhlIGRpZmZlcmVuY2UgdG8gdGhlIHByZWRpY3Rpb24gdG8gZ2V0IAotICogdGhlIHJlY29uc3RydWN0ZWQgc2lnbmFsLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjUHJlZCAtIFBvaW50ZXIgdG8gcHJlZGljdGlvbiBzaWduYWwuICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgcERlcXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4gIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKLSAqICAgaVNyY1ByZWRTdGVwIC0gU3RlcCBvZiB0aGUgcHJlZGljdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgaURzdFJlY29uU3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIHJlY29uc3RydWN0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIAotICogICAgICAgICAgICBtdWx0aXBsZSBvZiA0LiAKLSAqICAgYkFDIC0gSW5kaWNhdGUgd2hldGhlciB0aGVyZSBpcyBBQyBjb2VmZmljaWVudHMgaW4gdGhlIGNvZWZmaWNpZW50cyAKLSAqICAgICAgICAgICAgbWF0cml4LiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFJlY29uIC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiByZWNvbnN0cnVjdGlvbiBidWZmZXIuICA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgcFNyY1ByZWQsIHBEZXF1YW50Q29lZmYsIHBEc3RSZWNvbiAKLSAqICAgIC0gICAgcFNyY1ByZWQgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlTcmNQcmVkU3RlcCBvciBpRHN0UmVjb25TdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAotICogICAgLSAgICBwRGVxdWFudENvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkKAotCWNvbnN0IE9NWF9VOCogCXBTcmNQcmVkLCAKLQljb25zdCBPTVhfUzE2KiAJcERlcXVhbnRDb2VmZiwgCi0JT01YX1U4KiAJcERzdFJlY29uLAotCU9NWF9VMzIgCWlTcmNQcmVkU3RlcCwgCi0JT01YX1UzMgkJaURzdFJlY29uU3RlcCwgCi0JT01YX1U4CQliQUMKLSkKLXsKLSAgICBPTVhfSU5UICAgICBpLCBqOwotICAgIE9NWF9TMTYgICAgIEluWzE2XSwgT3V0WzE2XTsKLSAgICBPTVhfUzMyICAgICBWYWx1ZTsKLQotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmNQcmVkID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwU3JjUHJlZCksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEZXF1YW50Q29lZmYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBEZXF1YW50Q29lZmYpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0UmVjb24gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBEc3RSZWNvbiksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGJBQyA+IDEsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGlTcmNQcmVkU3RlcCA9PSAwIHx8IGlTcmNQcmVkU3RlcCAmIDMsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGlEc3RSZWNvblN0ZXAgPT0gMCB8fCBpRHN0UmVjb25TdGVwICYgMywgT01YX1N0c19CYWRBcmdFcnIpCi0KLSAgICBpZiAoYkFDKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEluW2ldID0gcERlcXVhbnRDb2VmZiBbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogQ29weSBEQyAqLwotICAgICAgICBJblswXSA9IHBEZXF1YW50Q29lZmYgWzBdOwotICAgIAotICAgICAgICBmb3IgKGkgPSAxOyBpIDwgMTY7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgSW5baV0gPSAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogUmVzaWR1YWwgVHJhbnNmb3JtICovCi0gICAgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NCAoT3V0LCBJbik7ICAgIAotICAgIAotICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBBZGQgcHJlZGl0aW9uICovCi0gICAgICAgICAgICBWYWx1ZSA9IChPTVhfUzMyKSBPdXQgW2ogKiA0ICsgaV0gKyBwU3JjUHJlZCBbaiAqIGlTcmNQcmVkU3RlcCArIGldOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBTYXR1cmF0ZSBWYWx1ZSB0byBPTVhfVTggKi8KLSAgICAgICAgICAgIFZhbHVlID0gYXJtQ2xpcCAoMCwgMjU1LCBWYWx1ZSk7Ci0KLSAgICAgICAgICAgIHBEc3RSZWNvbltqICogaURzdFJlY29uU3RlcCArIGldID0gKE9NWF9VOCkgVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTUVHZXRCdWZTaXplLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX01FR2V0QnVmU2l6ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTI0NWUxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTUVHZXRCdWZTaXplLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOgotICogSW5pdGlhbGl6YXRpb24gbW9kdWxlcyBmb3IgdGhlIHZlbmRvciBzcGVjaWZpYyBNb3Rpb24gRXN0aW1hdGlvbiBzdHJ1Y3R1cmUuCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZSAgICg2LjMuNS4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb21wdXRlcyB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiAKLSAqIHN0cnVjdHVyZSBmb3IgdGhlIG9teFZDTTRQMTAgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zIEJsb2NrTWF0Y2hfSW50ZWdlciAKLSAqIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCi0gKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDEwTUVNb2RlIAotICogICBwTUVQYXJhbXMgLW1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTaXplIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgbW90aW9uIAotICogICAgICAgICAgICBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBNRVBhcmFtcyBvciBwU2l6ZSBpcyBOVUxMLiAKLSAqICAgIC0gICAgYW4gaW52YWxpZCBNRU1vZGUgaXMgc3BlY2lmaWVkLiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfTUVHZXRCdWZTaXplKAotICAgIE9NWFZDTTRQMTBNRU1vZGUgTUVNb2RlLAotICAgIGNvbnN0IE9NWFZDTTRQMTBNRVBhcmFtcyAqcE1FUGFyYW1zLAotICAgIE9NWF9VMzIgKnBTaXplCi0gICAgKQotewotICAgIGFybVJldEFyZ0VycklmKCFwTUVQYXJhbXMsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighcFNpemUsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoTUVNb2RlICE9IE9NWF9WQ19NNFAxMF9GQVNUX1NFQVJDSCkgJiYgCi0gICAgICAgICAgICAgICAgICAgKE1FTW9kZSAhPSBPTVhfVkNfTTRQMTBfRlVMTF9TRUFSQ0gpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UxNngxNiA8PSAwKSB8fCAKLSAgICAgICAgICAgICAgICAgICAocE1FUGFyYW1zLT5zZWFyY2hSYW5nZTh4OCA8PSAwKSB8fCAKLSAgICAgICAgICAgICAgICAgICAocE1FUGFyYW1zLT5zZWFyY2hSYW5nZTR4NCA8PSAwKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgICAgICAgICAgICAgICAgIAotICAgICpwU2l6ZSA9IChPTVhfSU5UKSBzaXplb2YoQVJNVkNNNFAxMF9NRVNwZWMpOwotICAgIAotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9NRUluaXQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTUVJbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NjMzNTMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9NRUluaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9NRUluaXQuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOgotICogSW5pdGlhbGl6YXRpb24gbW9kdWxlcyBmb3IgdGhlIHZlbmRvciBzcGVjaWZpYyBNb3Rpb24gRXN0aW1hdGlvbiBzdHJ1Y3R1cmUuCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9NRUluaXQgICAoNi4zLjUuMS4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogSW5pdGlhbGl6ZXMgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSByZXF1aXJlZCBmb3IgdGhlIAotICogb214VkNNNFAxMCBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnM6ICBCbG9ja01hdGNoX0ludGVnZXIgYW5kIAotICogTW90aW9uRXN0aW1hdGlvbk1CLiBNZW1vcnkgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAqcE1FU3BlYyBtdXN0IGJlIAotICogYWxsb2NhdGVkIHByaW9yIHRvIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLCBhbmQgc2hvdWxkIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSBjYW4gCi0gKiBiZSBkZXRlcm1pbmVkIHVzaW5nIHRoZSBmdW5jdGlvbiBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZS4gRm9sbG93aW5nIAotICogaW5pdGlhbGl6YXRpb24gYnkgdGhpcyBmdW5jdGlvbiwgdGhlIHZlbmRvci1zcGVjaWZpYyBzdHJ1Y3R1cmUgKnBNRVNwZWMgCi0gKiBzaG91bGQgY29udGFpbiBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiBhbGwgbW90aW9uIAotICogZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIHJlY2VpdmVkIHZpYSB0aGUgc3RydWN0dXJlIHBNRVBhcmFtcywgZm9yIGV4YW1wbGUgIAotICogc2VhcmNoUmFuZ2UxNngxNiwgc2VhcmNoUmFuZ2U4eDgsIGV0Yy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKLSAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMTBNRU1vZGUgCi0gKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB1bmluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcE1FUGFyYW1zIG9yIHBTaXplIGlzIE5VTEwuIAotICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAotICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3Igb25lIG9mIHRoZSBzZWFyY2ggcmFuZ2VzIAotICogICAgICAgICAoZS5nLiwgIHBNQlBhcmFtcyA+c2VhcmNoUmFuZ2U4eDgsIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UxNngxNiwgZXRjLikgCi0gKiAgICAtICAgIGVpdGhlciBpbiBpc29sYXRpb24gb3IgaW4gY29tYmluYXRpb24sIG9uZSBvciBtb3JlIG9mIHRoZSBlbmFibGVzIG9yIAotICogICAgICAgICBzZWFyY2ggcmFuZ2VzIGluIHRoZSBzdHJ1Y3R1cmUgKnBNRVBhcmFtcyB3ZXJlIGNvbmZpZ3VyZWQgc3VjaCAKLSAqICAgICAgICAgdGhhdCB0aGUgcmVxdWVzdGVkIGJlaGF2aW9yIGZhaWxzIHRvIGNvbXBseSB3aXRoIFtJU08xNDQ5Ni0xMF0uIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9NRUluaXQoCi0gICAgICAgIE9NWFZDTTRQMTBNRU1vZGUgTUVNb2RlLAotICAgICAgICBjb25zdCBPTVhWQ000UDEwTUVQYXJhbXMgKnBNRVBhcmFtcywKLSAgICAgICAgdm9pZCAqcE1FU3BlYwotICAgICAgICkKLXsKLSAgICBBUk1WQ000UDEwX01FU3BlYyAqYXJtTUVTcGVjID0gKEFSTVZDTTRQMTBfTUVTcGVjICopIHBNRVNwZWM7Ci0gICAgCi0gICAgYXJtUmV0QXJnRXJySWYoIXBNRVBhcmFtcywgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFwTUVTcGVjLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKE1FTW9kZSAhPSBPTVhfVkNfTTRQMTBfRkFTVF9TRUFSQ0gpICYmIAotICAgICAgICAgICAgICAgICAgIChNRU1vZGUgIT0gT01YX1ZDX000UDEwX0ZVTExfU0VBUkNIKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChwTUVQYXJhbXMtPnNlYXJjaFJhbmdlMTZ4MTYgPD0gMCkgfHwgCi0gICAgICAgICAgICAgICAgICAgKHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2U4eDggPD0gMCkgfHwgCi0gICAgICAgICAgICAgICAgICAgKHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2U0eDQgPD0gMCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAKLSAgICBhcm1NRVNwZWMtPk1FUGFyYW1zLmJsb2NrU3BsaXRFbmFibGU4eDggPSBwTUVQYXJhbXMtPmJsb2NrU3BsaXRFbmFibGU4eDg7Ci0gICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5ibG9ja1NwbGl0RW5hYmxlNHg0ID0gcE1FUGFyYW1zLT5ibG9ja1NwbGl0RW5hYmxlNHg0OwotICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuaGFsZlNlYXJjaEVuYWJsZSAgICA9IHBNRVBhcmFtcy0+aGFsZlNlYXJjaEVuYWJsZTsKLSAgICBhcm1NRVNwZWMtPk1FUGFyYW1zLnF1YXJ0ZXJTZWFyY2hFbmFibGUgPSBwTUVQYXJhbXMtPnF1YXJ0ZXJTZWFyY2hFbmFibGU7Ci0gICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5pbnRyYUVuYWJsZTR4NCAgICAgID0gcE1FUGFyYW1zLT5pbnRyYUVuYWJsZTR4NDsgICAgIAotICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuc2VhcmNoUmFuZ2UxNngxNiAgICA9IHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UxNngxNjsgICAKLSAgICBhcm1NRVNwZWMtPk1FUGFyYW1zLnNlYXJjaFJhbmdlOHg4ICAgICAgPSBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlOHg4OwotICAgIGFybU1FU3BlYy0+TUVQYXJhbXMuc2VhcmNoUmFuZ2U0eDQgICAgICA9IHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2U0eDQ7Ci0gICAgYXJtTUVTcGVjLT5NRU1vZGUgICAgICAgICAgICAgICAgICAgICAgID0gTUVNb2RlOwotICAgIAotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNjQzOTQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIuYworKysgL2Rldi9udWxsCkBAIC0xLDE5MDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm0gTUIgbGV2ZWwgbW90aW9uIGVzdGltYXRpb24KLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotI2RlZmluZSAgQVJNX1ZDTTRQMTBfTUFYX0ZSQU1FUyAgICAgKDE1KQotI2RlZmluZSAgQVJNX1ZDTTRQMTBfTUFYXzR4NF9TQUQJCSgweGZmZmYpCi0jZGVmaW5lICBBUk1fVkNNNFAxMF9NQVhfTU9ERV9WQUxVRSAgICAgKDB4ZmZmZmZmZmYpCi0jZGVmaW5lICBBUk1fVkNNNFAxMF9NQVhfTU9ERVMgICAgICAgICAgKDE2KQotI2RlZmluZSAgQVJNX1ZDTTRQMTBfTUJfQkxPQ0tfU0laRSAgICAgICgxNikKLSNkZWZpbmUgIEFSTV9WQ000UDEwX01FRElBTihhLGIsYykgICAgICAoYT5iP2E+Yz9iPmM/YjpjOmE6Yj5jP2E+Yz9hOmM6YikKLSNkZWZpbmUgIEFSTV9WQ000UDEwX1NISUZUX1FQICAgICAgICAgICAoMTIpCi0KLSNkZWZpbmUgIEFSTV9WQ000UDEwX01WUFJFRF9NRURJQU4gICAgICAoMCkKLSNkZWZpbmUgIEFSTV9WQ000UDEwX01WUFJFRF9MICAgICAgICAgICAoMSkKLSNkZWZpbmUgIEFSTV9WQ000UDEwX01WUFJFRF9VICAgICAgICAgICAoMikKLSNkZWZpbmUgIEFSTV9WQ000UDEwX01WUFJFRF9VUiAgICAgICAgICAoMykKLQotI2RlZmluZSBBUk1fVkNNNFAxMF9NQl9CTE9DS19TSVpFICAgICAgICgxNikKLSNkZWZpbmUgQVJNX1ZDTTRQMTBfQkxPQ0tfU0laRSAgICAgICAgICAoNCkKLSNkZWZpbmUgQVJNX1ZDTTRQMTBfTUFYX0NPU1QgICAgICAgICAgICAoMSA8PCAzMCkKLSNkZWZpbmUgIEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0sgICAgICAoLTIpCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9DYWxjdWxhdGVCbG9ja1NBRAotICoKLSAqIERlc2NyaXB0aW9uOgotICogICAgQ2FsY3VsYXRlIFNBRCB2YWx1ZSBmb3IgdGhlIHNlbGVjdGVkIE1CIGVuY29kaW5nIG1vZGUgYW5kIHVwZGF0ZSAKLSAqIHBEc3RCbG9ja1NBRCBwYXJhbWV0ZXIuIFRoZXNlIFNBRCB2YWx1ZXMgYXJlIGNhbGN1bGF0ZWQgNHg0IGJsb2NrcyBhdAotICogYSB0aW1lIGFuZCBpbiB0aGUgc2NhbiBvcmRlci4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBTcmNNQkluZm8gICAgLSAKLSAqIFtpbl0gcFNyY0N1cnJCdWYgICAtIAotICogW2luXSBTcmNDdXJyU3RlcCAgIC0gCi0gKiBbaW5dIHBTcmNSZWZCdWZMaXN0LSAKLSAqIFtpbl0gU3JjUmVmU3RlcCAgICAtIAotICogW2luXSBwU3JjUmVjQnVmICAgIC0gCi0gKiBbaW5dIFNyY1JlY1N0ZXAgICAgLSAKLSAqIFtpbl0gcFJlZlJlY3QgICAgICAtIAotICogW2luXSBwQ3VyclBvaW50UG9zIC0gCi0gKiBbaW5dIExhbWJkYSAgICAgICAgLSAKLSAqIFtpbl0gcE1FU3BlYyAgICAgICAtIAotICogW2luXSBwTUJJbnRlciAgICAgIC0gCi0gKiBbaW5dIHBNQkludHJhICAgICAgLSAKLSAqIFtvdXRdIHBEc3RCbG9ja1NBRCAtIHBvaW50ZXIgdG8gMTYgZWxlbWVudCBhcnJheSBmb3IgU0FEIGNvcnJlc3BvbmRpbmcgdG8gNHg0IGJsb2NrcwotICogUmV0dXJuIFZhbHVlOgotICogTm9uZQotICoKLSAqLwotCi1zdGF0aWMgT01YUmVzdWx0IGFybVZDTTRQMTBfQ2FsY3VsYXRlQmxvY2tTQUQoCi0JT01YVkNNNFAxME1CSW5mbyAqcFNyY01CSW5mbywgCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JT01YX1MzMiBTcmNDdXJyU3RlcCwgCi0JY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmTGlzdFtBUk1fVkNNNFAxMF9NQVhfRlJBTUVTXSwKLQlPTVhfUzMyIFNyY1JlZlN0ZXAsCi0JY29uc3QgT01YX1U4ICpwU3JjUmVjQnVmLCAKLQlPTVhfUzMyIFNyY1JlY1N0ZXAsCi0JY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0JY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLQljb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRlciwgCi0JY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50cmEsCi0JT01YX1UxNiAqcERzdEJsb2NrU0FEKQotewotCU9NWF9JTlQJCUludmFsaWRTQUQgPSAwOwotCU9NWF9JTlQJCWk7Ci0KLQlPTVhfVTgJCUJ1ZmZlciBbMTYqMTYgKyAxNV07Ci0JT01YX1U4CQkqcFRlbXBEc3RCdWY7Ci0JT01YX1MzMgkJVGVtcERzdFN0ZXA7Ci0JT01YX1U4CQkqcFRlbXBSZWZCdWY7Ci0JT01YX1MzMgkJVGVtcFJlZlN0ZXA7IAotCi0JLyogVGVtcG9yYXJ5IGJ1ZmZlciB0byBzdG9yZSB0aGUgcHJlZGljdGVkIG1iIGNvZWZmaWNpZW50cyAqLwotCXBUZW1wRHN0QnVmID0gYXJtQWxpZ25UbzE2Qnl0ZXMoQnVmZmVyKTsKLQlUZW1wRHN0U3RlcCA9IDE2OwotCi0JLyogVXBkYXRlIHBEc3RCbG9ja1NBRCBpZiBNQiBpcyBhIHZhbGlkIHR5cGUgKi8KLQlpZiAocFNyY01CSW5mbykKLQl7Ci0JICAgIE9NWF9VMzIgICAgIFdpZHRoPTAsIEhlaWdodD0wLCBNYXhYUGFydCwgTWF4WVBhcnQsTWF4U3ViWFBhcnQsTWF4U3ViWVBhcnQ7Ci0JICAgIAotCQkvKiBEZXBlbmRpbmcgb24gdHlwZSBvZiBNQiwgZG8gcHJlZGljdGlvbiBhbmQgZmlsbCB0ZW1wIGJ1ZmZlciAqLwotCQlzd2l0Y2ggKHBTcmNNQkluZm8tPm1iVHlwZSkKLQkJewotCQljYXNlIE9NWF9WQ19QXzE2eDE2OgotCQkJCVdpZHRoID0gMTY7Ci0JCQkJSGVpZ2h0ID0gMTY7Ci0JCQkJYnJlYWs7Ci0JCWNhc2UgT01YX1ZDX1BfMTZ4ODoKLQkJCQlXaWR0aCA9IDE2OwotCQkJCUhlaWdodCA9IDg7Ci0JCQkJYnJlYWs7Ci0JCWNhc2UgT01YX1ZDX1BfOHgxNjoKLQkJCQlXaWR0aCA9IDg7Ci0JCQkJSGVpZ2h0ID0gMTY7Ci0JCQkJYnJlYWs7Ci0JCWNhc2UgT01YX1ZDX1BfOHg4OgotCQkJCVdpZHRoID0gODsKLQkJCQlIZWlnaHQgPSA4OwotCQkJCWJyZWFrOwotCQljYXNlIE9NWF9WQ19JTlRSQV80eDQ6Ci0JCQl7Ci0JCQkJLyogQ3JlYXRlIHByZWRpY3RlZCBNQiBJbnRyYTR4NCBtb2RlICovCi0JCQkJT01YX1MzMiAgICAgUHJlZEludHJhNHg0TW9kZSBbNV1bOV07Ci0JCQkJT01YX1MzMgkJeCwgeSwgQmxvY2s4eDgsIEJsb2NrNHg0LCBCbG9ja1gsIEJsb2NrWTsKLQkJCQlPTVhfVTggICAgICBwU3JjWUJ1ZmYgWygxNiozKSooMTYqMildOwotCQkJCU9NWF9VOAkJKnBTcmNZOwotCQkJCU9NWF9TMzIgICAgIFN0ZXBTcmNZOwotCQkJCU9NWF9TMzIJCWF2YWlsYWJpbGl0eTsKLQotCQkJCWZvciAoeSA9IDA7IHkgPCA1OyB5KyspCi0JCQkJewotCQkJCQlmb3IgKHggPSAwOyB4IDwgOTsgeCsrKQotCQkJCQl7Ci0JCQkJCQkvKiAKLQkJCQkJCSAqIEluaXRpYWxpemUgd2l0aCB2YWx1ZSBvZiBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLLCB0byBtZWFuIHRoaXMgCi0JCQkJCQkgKiA0eDQgYmxvY2sgaXMgbm90IGF2YWlsYWJsZSAKLQkJCQkJCSAqLwotCQkJCQkJUHJlZEludHJhNHg0TW9kZSBbeV1beF0gPSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLyogUmVwbGFjZSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLIHZhbHVlIHdpdGggYXZhaWxhYmxlIE1CcyB2YWx1ZXMqLwotCQkJCWZvciAoeCA9IDA7IHggPCA0OyB4KyspCi0JCQkJewotCQkJCQkvKiBTdG9yZSB2YWx1ZXMgb2YgYjAsIGIxLCBiMiwgYjMgKi8KLQkJCQkJaWYgKHBNQkludHJhWzFdICE9IE5VTEwpCi0JCQkJCXsKLQkJCQkJCVByZWRJbnRyYTR4NE1vZGUgWzBdW3ggKyAxXSA9IAotCQkJCQkJCXBNQkludHJhWzFdLT5wSW50cmE0eDRQcmVkTW9kZVszKjQgKyB4XTsgICAgICAgICAgICAKLQkJCQkJfQotCQkJICAgICAgICAKLQkJCQkJLyogU3RvcmUgdmFsdWVzIG9mIGQwLCBkMSwgZDIsIGQzICovCi0JCQkJCWlmIChwTUJJbnRyYVszXSAhPSBOVUxMKQotCQkJCQl7Ci0JCQkJCQlQcmVkSW50cmE0eDRNb2RlIFswXVt4ICsgNV0gPSAKLQkJCQkJCQlwTUJJbnRyYVszXS0+cEludHJhNHg0UHJlZE1vZGVbMyo0ICsgeF07Ci0JCQkJCX0KLQkJCQl9Ci0JCSAgICAKLQkJCQkvKiBTdG9yZSB2YWx1ZXMgb2YgYzMgKi8KLQkJCQlpZiAocE1CSW50cmFbMl0gIT0gTlVMTCkKLQkJCQl7Ci0JCQkJCVByZWRJbnRyYTR4NE1vZGUgWzBdWzBdID0gcE1CSW50cmFbMl0tPnBJbnRyYTR4NFByZWRNb2RlWzE1XTsKLQkJCQl9Ci0JCSAgICAKLQkJCQlmb3IgKHkgPSAwOyB5IDwgNDsgeSsrKQotCQkJCXsKLQkJCQkJLyogU3RvcmUgdmFsdWVzIG9mIGEwLCBhMSwgYTIsIGEzICovCi0JCQkJCWlmIChwTUJJbnRyYVswXSAhPSBOVUxMKQotCQkJCQl7Ci0JCQkJCQlQcmVkSW50cmE0eDRNb2RlIFt5ICsgMV1bMF0gPSAKLQkJCQkJCQlwTUJJbnRyYVswXS0+cEludHJhNHg0UHJlZE1vZGVbeSo0ICsgM107Ci0JCQkJCX0KLQkJCQl9Ci0JCSAgICAgICAgCi0JCQkJLyoKLQkJCQkgKiBVcGRhdGUgbmVpZ2hib3VyaW5nIFByZWQgbW9kZSBhcnJheSB3aGljaCB3aWxsIGJlIHVzZWQgZm9yCi0JCQkJICogcHJlZGljdGlvbiBvZiBJbnRyYTR4NCBtb2Rlcy4KLQkJCQkgKi8KLQkJCSAgICAKLQkJCQlwU3JjWSA9IHBTcmNZQnVmZjsKLQkJCQlTdGVwU3JjWSA9IDE2ICogMzsKLQkJCQlmb3IgKHkgPSAwOyB5IDwgKDE2ICogMik7IHkrKykKLQkJCQl7Ci0JCQkJCWZvciAoeCA9IDA7IHggPCAoMTYgKiAzKTsgeCsrKQotCQkJCQl7Ci0JCQkJCQlwU3JjWSBbU3RlcFNyY1kgKiB5ICsgeF0gPSAKLQkJCQkJCQlwU3JjUmVjQnVmIFtTcmNSZWNTdGVwICogKHkgLSAxNikgKyB4IC0gMTZdOwotCQkJCQl9Ci0JCQkJfQotCi0JCSAgICAKLQkJCQkvKiBmb3IgZWFjaCA4eDggYmxvY2sgKi8KLQkJCQlmb3IgKEJsb2NrOHg4ID0gMDsgQmxvY2s4eDggPCA0OyBCbG9jazh4OCsrKQotCQkJCXsKLQkJCQkJLyogZm9yIGVhY2ggNHg0IGJsb2NrIGluc2lkZSA4eDggYmxvY2sgKi8KLQkJCQkJZm9yIChCbG9jazR4NCA9IDA7IEJsb2NrNHg0IDwgNDsgQmxvY2s0eDQrKykKLQkJCQkJewotCQkJCQkJLyogR2V0IGJsb2NrIGNvcmRpbmF0ZXMgZnJvbSA4eDggYmxvY2sgaW5kZXggYW5kIDR4NCBibG9jayBpbmRleCAqLwotCQkJCQkJQmxvY2tYID0gKChCbG9jazh4OCAmIDEpIDw8IDEpICsgKEJsb2NrNHg0ICYgMSk7Ci0JCQkJCQlCbG9ja1kgPSAoKEJsb2NrOHg4ID4+IDEpIDw8IDEpICsgKEJsb2NrNHg0ID4+IDEpOwotCQkJCQkgICAgCi0JCQkJCQkvKiBBZGQgb2Zmc2V0IHRvIHBvaW50IHRvIHN0YXJ0IG9mIGN1cnJlbnQgTUIgaW4gdGhlIGFycmF5IHBJbnRyYTR4NFByZWRNb2RlICovCi0JCQkJCQl4ID0gQmxvY2tYICsgMTsKLQkJCQkJCXkgPSBCbG9ja1kgKyAxOwotCi0JCQkJCQlhdmFpbGFiaWxpdHkgPSAwOwotCi0JCQkJCQkvKiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIExFRlQgQmxvY2sgKi8KLQkJCQkJCWlmIChQcmVkSW50cmE0eDRNb2RlIFt5XVt4IC0gMV0gIT0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSykKLQkJCQkJCXsKLQkJCQkJCQlhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX0xFRlQ7ICAgICAgICAKLQkJCQkJCX0KLQotCQkJCQkJLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBVUFBFUiBCbG9jayAqLwotCQkJCQkJaWYgKFByZWRJbnRyYTR4NE1vZGUgW3kgLSAxXVt4XSAhPSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLKQotCQkJCQkJewotCQkJCQkJCWF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfVVBQRVI7ICAgICAgICAKLQkJCQkJCX0KLQotCQkJCQkJLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBVUFBFUiBMRUZUIEJsb2NrICovCi0JCQkJCQlpZiAoUHJlZEludHJhNHg0TW9kZSBbeSAtIDFdW3ggLSAxXSAhPSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLKQotCQkJCQkJewotCQkJCQkJCWF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfVVBQRVJfTEVGVDsgICAgICAgIAotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlQcmVkSW50cmE0eDRNb2RlIFt5XVt4XSA9IHBTcmNNQkluZm8tPnBJbnRyYTR4NFByZWRNb2RlW0Jsb2NrWSo0K0Jsb2NrWF07Ci0JCQkJCQl4ID0gQmxvY2tYICogNDsKLQkJCQkJCXkgPSBCbG9ja1kgKiA0OwotCi0JCQkJCQlwU3JjWSA9IHBTcmNZQnVmZiArIDE2ICogU3RlcFNyY1kgKyAxNiArIHkgKiBTdGVwU3JjWSArIHg7Ci0KLQkJCQkJCW9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCgKLQkJCQkJCQkgcFNyY1kgLSAxLAotCQkJCQkJCSBwU3JjWSAtIFN0ZXBTcmNZLAotCQkJCQkJCSBwU3JjWSAtIFN0ZXBTcmNZIC0gMSwKLQkJCQkJCQkgcFRlbXBEc3RCdWYgKyB4ICsgeSAqIFRlbXBEc3RTdGVwLAotCQkJCQkJCSBTdGVwU3JjWSwKLQkJCQkJCQkgVGVtcERzdFN0ZXAsCi0JCQkJCQkJIHBTcmNNQkluZm8tPnBJbnRyYTR4NFByZWRNb2RlW0Jsb2NrWSo0K0Jsb2NrWF0sCi0JCQkJCQkJIGF2YWlsYWJpbGl0eSk7Ci0KLQkJCQkJCWZvciAoQmxvY2tZPTA7QmxvY2tZPDQ7QmxvY2tZKyspCi0JCQkJCQl7Ci0JCQkJCQkJZm9yKEJsb2NrWD0wO0Jsb2NrWDw0O0Jsb2NrWCsrKQotCQkJCQkJCXsKLQkJCQkJCQkJcFNyY1kgW0Jsb2NrWSAqIFN0ZXBTcmNZICsgQmxvY2tYXSA9IAotCQkJCQkJCQkJKE9NWF9VOCkoKihwVGVtcERzdEJ1ZiArIHggKyB5ICogVGVtcERzdFN0ZXAgKyBCbG9ja1kgKiBUZW1wRHN0U3RlcCArIEJsb2NrWCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQljYXNlIE9NWF9WQ19JTlRSQV8xNngxNjoKLQkJCXsKLQkJCQlPTVhfVTMyICAgICBNQlBvc1ggPSBwQ3VyclBvaW50UG9zLT54ID4+IDQ7ICAgICAgICAKLQkJCQlPTVhfVTMyICAgICBNQlBvc1kgPSBwQ3VyclBvaW50UG9zLT55ID4+IDQ7ICAgICAgICAKLQkJCQlPTVhfVTMyCQlhdmFpbGFiaWxpdHkgPSAwOwotCi0JCQkJLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBMRUZUIE1CICovCi0JCQkJaWYgKChNQlBvc1ggIT0gMCkgJiYgKHBNQkludHJhIFswXSAhPSAwIHx8IHBNQkludGVyIFswXSAhPSAwKSkKLQkJCQl7Ci0JCQkJCWF2YWlsYWJpbGl0eSB8PSBPTVhfVkNfTEVGVDsgICAgICAgIAotCQkJCX0KLQotCQkJCS8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgVVAgTUIgKi8KLQkJCQlpZiAoKE1CUG9zWSAhPSAwKSAmJiAocE1CSW50cmEgWzFdICE9IDAgfHwgcE1CSW50ZXIgWzFdICE9IDApKQotCQkJCXsKLQkJCQkJYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19VUFBFUjsgICAgICAgIAotCQkJCX0KLQotCQkJCS8qIENoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgVVAtTEVGVCBNQiAqLwotCQkJCWlmICgoTUJQb3NYID4gMCkgJiYgKE1CUG9zWSA+IDApICYmIAotCQkJCQkocE1CSW50cmEgWzJdICE9IDAgfHwgcE1CSW50ZXIgWzJdICE9IDApKQotCQkJCXsKLQkJCQkJYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19VUFBFUl9MRUZUOyAgICAgICAgCi0JCQkJfQotCi0JCQkJb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYoCi0JCQkJCQlwU3JjUmVjQnVmIC0gMSwgCi0JCQkJCQlwU3JjUmVjQnVmIC0gU3JjUmVjU3RlcCwgCi0JCQkJCQlwU3JjUmVjQnVmIC0gU3JjUmVjU3RlcCAtIDEsIAotCQkJCQkJcFRlbXBEc3RCdWYsIAotCQkJCQkJU3JjUmVjU3RlcCwgCi0JCQkJCQlUZW1wRHN0U3RlcCwgCi0JCQkJCQlwU3JjTUJJbmZvLT5JbnRyYTE2eDE2UHJlZE1vZGUsIAotCQkJCQkJYXZhaWxhYmlsaXR5KTsKLQkJCQkKLQkJCQlicmVhazsKLQkJCX0KLQotCQljYXNlIE9NWF9WQ19JTlRFUl9TS0lQOgotCQljYXNlIE9NWF9WQ19QUkVGMF84eDg6Ci0JCWNhc2UgT01YX1ZDX0lOVFJBX1BDTToKLQkJZGVmYXVsdDoKLQkJCS8qIFRoZXNlIGNhc2VzIHdpbGwgdXBkYXRlIHBEc3RCbG9ja1NBRCB3aXRoIE1BWCB2YWx1ZSAqLwotCQkJSW52YWxpZFNBRCA9IDE7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIElOVEVSIE1CICovCi0JCWlmICgocFNyY01CSW5mby0+bWJUeXBlID09IE9NWF9WQ19QXzE2eDE2KSB8fAotCQkJKHBTcmNNQkluZm8tPm1iVHlwZSA9PSBPTVhfVkNfUF84eDE2KSB8fAotCQkJKHBTcmNNQkluZm8tPm1iVHlwZSA9PSBPTVhfVkNfUF8xNng4KSB8fAotCQkJKHBTcmNNQkluZm8tPm1iVHlwZSA9PSBPTVhfVkNfUF84eDgpKQotCQl7Ci0gICAgICAgIAljb25zdCBPTVhfVTgJCSpwVGVtcFNyY0J1ZjsKLSAgICAgICAgCU9NWF9TMzIJCVRlbXBTcmNTdGVwOwotICAgICAgICAJT01YX1MzMgkJbXZ4LG12eTsKLSAgICAgICAgCU9NWF9VMzIJCVBhcnRYLCBQYXJ0WSwgU3ViUGFydFgsIFN1YlBhcnRZOwotICAgICAgICAJCi0JCQlUZW1wU3JjU3RlcCA9IFNyY1JlZlN0ZXA7Ci0KLQkJCU1heFhQYXJ0ID0gMTYvV2lkdGg7Ci0JCQlNYXhZUGFydCA9IDE2L0hlaWdodDsKLQotCi0JCQlmb3IgKFBhcnRZID0gMDsgUGFydFkgPCBNYXhZUGFydDsgUGFydFkrKykKLQkJCXsKLQkJCQlmb3IgKFBhcnRYID0gMDsgUGFydFggPCBNYXhYUGFydDsgUGFydFgrKykKLQkJCQl7Ci0KLQkJCQkJcFRlbXBTcmNCdWYgPSBwU3JjUmVmQnVmTGlzdFtwU3JjTUJJbmZvLT5wUmVmTDBJZHhbUGFydFkgKiAyICsgUGFydFhdXTsKLQotCQkJCQlpZiAoTWF4WFBhcnQgPT0gMiAmJiBNYXhZUGFydCA9PSAyKQotCQkJCQl7Ci0gICAgICAgIAkJCQlzd2l0Y2ggKHBTcmNNQkluZm8tPnN1Yk1CVHlwZVtQYXJ0WSoyK1BhcnRYXSkKLSAgICAgICAgCQkJCXsKLSAgICAgICAgCQkJCSAgICBjYXNlIE9NWF9WQ19TVUJfUF84eDg6Ci0JCQkJCQkJCVdpZHRoID0gODsKLQkJCQkJCQkJSGVpZ2h0ID0gODsKLSAgICAgICAgICAgIAkJCQkgICAgYnJlYWs7Ci0gICAgICAgIAkJCQkgICAgY2FzZSBPTVhfVkNfU1VCX1BfOHg0OgotCQkJCQkJCQlXaWR0aCA9IDg7Ci0JCQkJCQkJCUhlaWdodCA9IDQ7Ci0gICAgICAgICAgICAJCQkJICAgIGJyZWFrOwotICAgICAgICAJCQkJICAgIGNhc2UgT01YX1ZDX1NVQl9QXzR4ODoKLQkJCQkJCQkJV2lkdGggPSA0OwotCQkJCQkJCQlIZWlnaHQgPSA4OwotICAgICAgICAgICAgCQkJCSAgICBicmVhazsKLSAgICAgICAgCQkJCSAgICBjYXNlIE9NWF9WQ19TVUJfUF80eDQ6Ci0JCQkJCQkJCVdpZHRoID0gNDsKLQkJCQkJCQkJSGVpZ2h0ID0gNDsKLSAgICAgICAgICAgIAkJCQkgICAgYnJlYWs7Ci0gICAgICAgIAkJCQkgICAgZGVmYXVsdDoKLQkJCQkJCQkJLyogRGVmYXVsdCAqLwotCQkJCQkJCQlXaWR0aCA9IDQ7Ci0JCQkJCQkJCUhlaWdodCA9IDQ7Ci0gICAgICAgIAkJCQkgICAgYnJlYWs7Ci0gICAgICAgIAkJCQl9Ci0JCQkJCQotICAgIAkJCQkgICAgTWF4U3ViWFBhcnQgPSA4L1dpZHRoOwotICAgIAkJCQkgICAgTWF4U3ViWVBhcnQgPSA4L0hlaWdodDsKLQotCQkJCQkJZm9yIChTdWJQYXJ0WSA9IDA7IFN1YlBhcnRZIDwgTWF4U3ViWVBhcnQ7IFN1YlBhcnRZKyspCi0JCQkJCQl7Ci0JCQkJCQkJZm9yIChTdWJQYXJ0WCA9IDA7IFN1YlBhcnRYIDwgTWF4U3ViWFBhcnQ7IFN1YlBhcnRYKyspCi0JCQkJCQkJewotCQkJCQkJCQltdnggPSBwU3JjTUJJbmZvLT5wTVYwIFsyKlBhcnRZICsgU3ViUGFydFldWzIqUGFydFggKyBTdWJQYXJ0WF0uZHg7Ci0JCQkJCQkJCW12eSA9IHBTcmNNQkluZm8tPnBNVjAgWzIqUGFydFkgKyBTdWJQYXJ0WV1bMipQYXJ0WCArIFN1YlBhcnRYXS5keTsKLQkJCQkJCQkJYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9MdW1hKAotCQkJCQkJCQkJcFRlbXBTcmNCdWYgKyAoOCpQYXJ0WCArIDQqU3ViUGFydFggKyAobXZ4LzQpKSArICg4KlBhcnRZICsgNCpTdWJQYXJ0WSArIChtdnkvNCkpICogVGVtcFNyY1N0ZXAsCi0JCQkJCQkJCQlUZW1wU3JjU3RlcCwKLQkJCQkJCQkJCXBUZW1wRHN0QnVmICsgKDgqUGFydFggKyA0KlN1YlBhcnRYKSArICg4KlBhcnRZICsgNCpTdWJQYXJ0WSkgKiBUZW1wRHN0U3RlcCwKLQkJCQkJCQkJCVRlbXBEc3RTdGVwLAotCQkJCQkJCQkJV2lkdGgsCi0JCQkJCQkJCQlIZWlnaHQsCi0JCQkJCQkJCQltdnggJiAzLAotCQkJCQkJCQkJbXZ5ICYgMwotCQkJCQkJCQkJKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0KLQkJCQkJCW12eCA9IHBTcmNNQkluZm8tPnBNVjAgWzIqUGFydFldWzIqUGFydFhdLmR4OwotCQkJCQkJbXZ5ID0gcFNyY01CSW5mby0+cE1WMCBbMipQYXJ0WV1bMipQYXJ0WF0uZHk7Ci0JCQkJCQlhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEoCi0JCQkJCQkJcFRlbXBTcmNCdWYgKyAoOCpQYXJ0WCArIChtdngvNCkpICsgKDgqUGFydFkgKyAobXZ5LzQpKSAqIFRlbXBTcmNTdGVwLAotCQkJCQkJCVRlbXBTcmNTdGVwLAotCQkJCQkJCXBUZW1wRHN0QnVmICsgKDgqUGFydFgpICsgKDgqUGFydFkpICogVGVtcERzdFN0ZXAsCi0JCQkJCQkJVGVtcERzdFN0ZXAsCi0JCQkJCQkJV2lkdGgsCi0JCQkJCQkJSGVpZ2h0LAotCQkJCQkJCW12eCAmIDMsCi0JCQkJCQkJbXZ5ICYgMwotCQkJCQkJCSk7Ci0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JewotCQlJbnZhbGlkU0FEID0gMTsKLQl9Ci0KLQkvKiBDYWxjdWxhdGUgU0FEIGZyb20gcHJlZGljdGVkIGJ1ZmZlciAqLwotCWlmICghSW52YWxpZFNBRCkKLQl7Ci0JICAgIE9NWF9VMzIgICAgIHg4eDgsIHk4eDgsIHg0eDQsIHk0eDQsIEJsb2NrOHg4LCBCbG9jazR4NDsKLQkgICAgT01YX1MzMiAgICAgU0FEOwotCSAgICAKLQkJcFRlbXBSZWZCdWYgPSBwVGVtcERzdEJ1ZjsKLQkJVGVtcFJlZlN0ZXAgPSAxNjsKLQotCQkvKiBTQUQgZm9yIGVhY2ggNHg0IGJsb2NrIGluIHNjYW4gb3JkZXIgKi8KLQkJZm9yIChCbG9jazh4OCA9IDA7IEJsb2NrOHg4IDwgNDsgQmxvY2s4eDgrKykKLQkJewotCQkJeDh4OCA9IDgqKEJsb2NrOHg4ICYgMSk7Ci0JCQl5OHg4ID0gOCooQmxvY2s4eDggPj4gMSk7Ci0JCQlmb3IgKEJsb2NrNHg0ID0gMDsgQmxvY2s0eDQgPCA0OyBCbG9jazR4NCsrKQotCQkJewotCQkJCXg0eDQgPSA0KihCbG9jazR4NCAmIDEpOwotCQkJCXk0eDQgPSA0KihCbG9jazR4NCA+PiAxKTsKLQotCQkJCWFybVZDQ09NTV9TQUQoCQotCQkJCQlwU3JjQ3VyckJ1ZiArICh4OHg4ICsgeDR4NCkgKyAoeTh4OCArIHk0eDQpICogU3JjQ3VyclN0ZXAsIAotCQkJCQlTcmNDdXJyU3RlcCwKLQkJCQkJcFRlbXBSZWZCdWYgKyAoeDh4OCArIHg0eDQpICsgKHk4eDggKyB5NHg0KSAqIFRlbXBSZWZTdGVwLAotCQkJCQlUZW1wUmVmU3RlcCwKLSAgICAJCQkJJlNBRCwKLSAgICAJCQkJNCwgLyogSGVpZ2h0ICovCi0gICAgCQkJCTQpOyAvKiBXaWR0aCAqLwotICAgICAgICAgICAgICAgICoocERzdEJsb2NrU0FEICsgNCAqIEJsb2NrOHg4ICsgQmxvY2s0eDQpID0gKFNBRCA8IDB4N2ZmZikgPyAoT01YX1UxNikgU0FEIDogQVJNX1ZDTTRQMTBfTUFYX01PREVfVkFMVUU7ICAgCQkJICAgIAotIAkJCX0KLQkJfQotCX0KLQllbHNlCi0JewotCQkvKiBGaWxsIFNBRHMgd2l0aCBtYXggdmFsdWVzIGFuZCByZXR1cm4qLwotCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJewotCQkJcERzdEJsb2NrU0FEIFtpXSA9IEFSTV9WQ000UDEwX01BWF80eDRfU0FEOwotCQl9Ci0JfQotCXJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9Nb2RlNHg0RGVjaXNpb24KLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgIEludHJhIDR4NCBNb2RlIGRlY2lzaW9uIGJ5IGNhbGN1bGF0aW5nIGNvc3QgZm9yIGFsbCBwb3NzaWJsZSBtb2RlcyBhbmQKLSAqIGNob29zaW5nIHRoZSBiZXN0IG1vZGUKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBTcmNDdXJyQnVmICAgIC0gUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgY3VycmVudCBNYWNyb2Jsb2NrCi0gKiBbaW5dIFNyY0N1cnJTdGVwIC0gU3RlcCBzaXplIG9mIHRoZSBwb2ludGVyIHBTcmNDdXJyQnVmCi0gKiBbaW4vb3V0XSBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byB0aGUgT01YVkNNNFAxME1CSW5mbyB3aGljaCB3aWxsIGJlIHVwZGF0ZWQgZm9yCi0gKiAgICAgICAgICAgICAgICAgICAgZmllbGQgcEludHJhNHg0UHJlZE1vZGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suCi0gKiBbaW5dIEJsb2NrOHg4ICAgIC0gSW5kZXggOHg4IGJsb2NrIGluIHdoaWNoIGN1cnJlbnQgNHg0IGJsb2NrIGJlbG9uZ3MKLSAqIFtpbl0gQmxvY2s0eDQgICAgLSBJbmRleCBvZiBjdXJyZW50IDR4NCBibG9jawotICogW2luL291dF0gcFByZWRJbnRyYTR4NFNyY1kgLSBQb2ludGVyIHRvIGN1cnJlbnQgYmxvY2sgbG9jYXRpb24gaW4gYnVmZmVyIAotICogICAgICAgICAgICAgICAgICAgIHdpdGggcmVjb25zdHJ1Y3RlZCB2YWx1ZXMuIFRoaXMgd2lsbCBiZSBtb2RpZmllZCBieSB0aGlzCi0gKiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gd2l0aCBiZXN0IG1vZGUgcHJlZGljdGVkIHZhbHVlcyAKLSAqIFtpbl0gU3RlcFByZWRJbnRyYTR4NFNyY1kgIC0gU3RlcCBzaXplIG9mIHRoZSBwb2ludGVyIHBQcmVkSW50cmE0eDRTcmNZCi0gKiBbaW5dIHBJbnRyYTR4NFByZWRNb2RlICAgICAtIEFycmF5IG9mIEludHJhIDR4NCBwcmVkaWN0aW9uIG1vZGUgZm9yIHRoZSBNQi4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudCBNQiBtb2RlcyBzdGFydHMgYXQgWzEsMV0uCi0gKiBbaW5dIHBCZXN0Q29zdCAgIC0gQ29zdCBmb3IgdGhlIEJlc3QgSW50cmEgNHg0IG1vZGUKLSAqIFJldHVybiBWYWx1ZToKLSAqIE5vbmUKLSAqCi0gKi8KLXN0YXRpYyBPTVhWb2lkIGFybVZDTTRQMTBfTW9kZTR4NERlY2lzaW9uICgKLSAgICBjb25zdCBPTVhfVTgqIHBTcmNDdXJyQnVmLCAgIAotICAgIE9NWF9TMzIgU3JjQ3VyclN0ZXAsCi0gICAgT01YVkNNNFAxME1CSW5mbyAqcFNyY0RzdE1CQ3VyciwKLSAgICBPTVhfUzMyIEJsb2NrOHg4LAotICAgIE9NWF9TMzIgQmxvY2s0eDQsCi0gICAgT01YX1U4ICAqcFByZWRJbnRyYTR4NFNyY1ksCi0gICAgT01YX1MzMiBTdGVwUHJlZEludHJhNHg0U3JjWSwKLSAgICBPTVhfUzMyIHBJbnRyYTR4NFByZWRNb2RlIFtdWzldLAotICAgIE9NWF9TMzIgKnBCZXN0Q29zdAotKQotewotICAgIE9NWF9TMzIgICAgIGksIGosIHgsIHksIEJsb2NrWCwgQmxvY2tZLCBtb2RlOwotICAgIE9NWF9TMzIgICAgIENvc3QsIEJlc3RDb3N0OwotICAgIE9NWF9VOCAgICAgICpwU3JjWTsKLSAgICBPTVhfUzMyICAgICBTdGVwU3JjWTsKLSAgICBPTVhfUzMyICAgICBhdmFpbGFiaWxpdHkgPSAwOwotICAgIE9NWF9VOCAgICAgIHBQcmVkQmxvY2sgWzQqNF07Ci0gICAgT01YUmVzdWx0ICAgUmV0ID0gT01YX1N0c19FcnI7Ci0KLSAgICAvKiBHZXQgYmxvY2sgY29yZGluYXRlcyBmcm9tIDh4OCBibG9jayBpbmRleCBhbmQgNHg0IGJsb2NrIGluZGV4ICovCi0gICAgQmxvY2tYID0gKChCbG9jazh4OCAmIDEpIDw8IDEpICsgKEJsb2NrNHg0ICYgMSk7Ci0gICAgQmxvY2tZID0gKChCbG9jazh4OCA+PiAxKSA8PCAxKSArIChCbG9jazR4NCA+PiAxKTsKLSAgICAKLSAgICAvKiBBZGQgb2Zmc2V0IHRvIHBvaW50IHRvIHN0YXJ0IG9mIGN1cnJlbnQgTUIgaW4gdGhlIGFycmF5IHBJbnRyYTR4NFByZWRNb2RlICovCi0gICAgeCA9IEJsb2NrWCArIDE7Ci0gICAgeSA9IEJsb2NrWSArIDE7Ci0KLSAgICAvKiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIExFRlQgQmxvY2sgKi8KLSAgICBpZiAocEludHJhNHg0UHJlZE1vZGUgW3ldW3ggLSAxXSAhPSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLKQotICAgIHsKLSAgICAgICAgYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19MRUZUOyAgICAgICAgCi0gICAgfQotCi0gICAgLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBVUFBFUiBCbG9jayAqLwotICAgIGlmIChwSW50cmE0eDRQcmVkTW9kZSBbeSAtIDFdW3hdICE9IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0spCi0gICAgewotICAgICAgICBhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX1VQUEVSOyAgICAgICAgCi0gICAgfQotCi0gICAgLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBVUFBFUiBMRUZUIEJsb2NrICovCi0gICAgaWYgKHBJbnRyYTR4NFByZWRNb2RlIFt5IC0gMV1beCAtIDFdICE9IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0spCi0gICAgewotICAgICAgICBhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX1VQUEVSX0xFRlQ7ICAgICAgICAKLSAgICB9Ci0KLSAgICBwU3JjWSA9IHBQcmVkSW50cmE0eDRTcmNZICsgCi0gICAgICAgICAgICBTdGVwUHJlZEludHJhNHg0U3JjWSAqIChCbG9ja1kgPDwgMikgKyAKLSAgICAgICAgICAgIChCbG9ja1ggPDwgMik7Ci0gICAgICAgICAgICAKLSAgICBTdGVwU3JjWSA9IFN0ZXBQcmVkSW50cmE0eDRTcmNZOwotICAgICAgICAgICAgICAKLSAgICB4ID0gQmxvY2tYICogNDsKLSAgICB5ID0gQmxvY2tZICogNDsKLQotICAgIENvc3QgPSBCZXN0Q29zdCA9IEFSTV9WQ000UDEwX01BWF9DT1NUOwotICAgIAotICAgIC8qIEdvIHRocm91Z2ggZWFjaCBtb2RlIGZvciBtaW5pbSBjb3N0ICovCi0gICAgZm9yIChtb2RlID0gMDsgbW9kZSA8IDk7IG1vZGUrKykKLSAgICB7Ci0gICAgICAgIFJldCA9IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCgKLSAgICAgICAgICAgICBwU3JjWSAtIDEsCi0gICAgICAgICAgICAgcFNyY1kgLSBTdGVwU3JjWSwKLSAgICAgICAgICAgICBwU3JjWSAtIFN0ZXBTcmNZIC0gMSwKLSAgICAgICAgICAgICBwUHJlZEJsb2NrLAotICAgICAgICAgICAgIFN0ZXBTcmNZLAotICAgICAgICAgICAgIDQsCi0gICAgICAgICAgICAgKE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlKSBtb2RlLAotICAgICAgICAgICAgIGF2YWlsYWJpbGl0eSk7Ci0gICAgICAgICAgICAgCi0gICAgICAgIGlmIChSZXQgPT0gT01YX1N0c19Ob0VycikKLSAgICAgICAgeyAgICAgICAgICAgIAotICAgICAgICAgICAgYXJtVkNDT01NX1NBRCggICAgCi0gICAgICAgICAgICAgICAgcFNyY0N1cnJCdWYgKyAoeSAqIFNyY0N1cnJTdGVwKSArIHgsCi0gICAgICAgICAgICAgICAgU3JjQ3VyclN0ZXAsCi0gICAgICAgICAgICAgICAgcFByZWRCbG9jaywKLSAgICAgICAgICAgICAgICA0LAotICAgICAgICAgICAgICAgICZDb3N0LAotICAgICAgICAgICAgICAgIDQsCi0gICAgICAgICAgICAgICAgNCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChDb3N0IDwgQmVzdENvc3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQmVzdENvc3QgPSBDb3N0OwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBJbnRyYTR4NFByZWRNb2RlIFtCbG9ja1kgKyAxXVtCbG9ja1ggKyAxXSA9IAotICAgICAgICAgICAgICAgICAgICAoT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUpIG1vZGU7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBJbnRyYTR4NFByZWRNb2RlIFtCbG9ja1kgKiA0ICsgQmxvY2tYXSA9IAotICAgICAgICAgICAgICAgICAgICAoT01YVkNNNFAxMEludHJhNHg0UHJlZE1vZGUpIG1vZGU7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcFNyY1kgW1N0ZXBTcmNZICogaiArIGldID0gcFByZWRCbG9jayBbNCAqIGogKyBpXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgICpwQmVzdENvc3QgPSBCZXN0Q29zdDsKLSAgICByZXR1cm47Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfU2V0TW90aW9uVmVjdG9yUHJlZGljdG9yCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgZG8gdGhlIE1WIFByZWRpY3Rpb24gZm9yIEludGVyIE1CcwotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIEJsb2NrU3RhcnRYIC0gU3RhcnQgWCBpbmRleCBpbiBpbnRlZ2VyIHBlbHMgaW4gY3VycmVudCBCbG9jawotICogW2luXSBCbG9ja1N0YXJ0WSAtIFN0YXJ0IFkgaW5kZXggaW4gaW50ZWdlciBwZWxzIGluIGN1cnJlbnQgQmxvY2sKLSAqIFtpbl0gQmxvY2tTaXplWCAgLSBXaWR0aCBvZiBjdXJyZW50IGJsb2NrCi0gKiBbaW5dIEJsb2NrU2l6ZVkgIC0gSGVpZ2h0IG9mIGN1cnJlbnQgYmxvY2sKLSAqIFtpbl0gUmVmRnJhbWUgICAgLSBJbmRleCBvZiB0aGUgcmVmZXJlbmNlIGZyYW1lIGZvciBwcmVkaWN0aW9uCi0gKiBbaW5dIHBSZWZGckFyciAgIC0gUG9pbnRlciB0byBSZWYgYXJyYXkgc3RvcmluZyBuZWlnaGJvdXJpbmcgTVZzIGZvciBNViBwcmVkaWN0aW9uCi0gKiBbaW5dIHBNVkFyciAgICAgIC0gUG9pbnRlciB0byBNViBhcnJheSBzdG9yaW5nIG5laWdoYm91cmluZyBNVnMgZm9yIE1WIHByZWRpY3Rpb24KLSAqIFtvdXRdIHBNVlByZWQgICAgLSBQb2ludGVyIHRvIHByZWRpY3RlZCBNVnMKLSAqIFJlbWFya3M6Ci0gKgotICogUmV0dXJuIFZhbHVlOgotICogTm9uZQotICoKLSAqLwotc3RhdGljIE9NWFZvaWQgYXJtVkNNNFAxMF9TZXRNb3Rpb25WZWN0b3JQcmVkaWN0b3IoCi0gICAgT01YX1UzMiBCbG9ja1N0YXJ0WCwgCi0gICAgT01YX1UzMiBCbG9ja1N0YXJ0WSwKLSAgICBPTVhfVTMyIEJsb2NrU2l6ZXgsCi0gICAgT01YX1UzMiBCbG9ja1NpemV5LAotICAgIE9NWF9TMzIgUmVmRnJhbWUsCi0gICAgT01YX1MzMiBwUmVmRnJBcnJbXVs2XSwgCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WQXJyW11bMTJdLAotICAgIE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkCi0pCi17Ci0gICAgT01YX1MzMiAgICAgUkZyYW1lTDsgICAgICAgLyogTGVmdCAqLwotICAgIE9NWF9TMzIgICAgIFJGcmFtZVU7ICAgICAgIC8qIFVwICovCi0gICAgT01YX1MzMiAgICAgUkZyYW1lVVI7ICAgICAgLyogVXAtUmlnaHQgKi8KLQotICAgIE9NWF9TMzIgICAgIEJsb2NrWCwgQmxvY2tZLCBCbG9ja1hGciwgQmxvY2tZRnIsIE1WUHJlZFR5cGU7Ci0gICAgT01YX1MzMiAgICAgQmxvY2tYUGx1c09mZiwgQmxvY2tYUGx1c09mZkZyLCBCbG9ja1hNaW4xRnIsIEJsb2NrWU1pbjFGcjsKLSAgICAKLSAgICBCbG9ja1ggPSA0ICsgKEJsb2NrU3RhcnRYID4+IDIpOwotICAgIEJsb2NrWSA9IDQgKyAoQmxvY2tTdGFydFkgPj4gMik7IAotICAgIEJsb2NrWFBsdXNPZmYgPSBCbG9ja1ggKyAoQmxvY2tTaXpleCA+PiAyKTsKLSAgICAKLSAgICBCbG9ja1hGciA9IEJsb2NrWCA+PiAxOyAgCi0gICAgQmxvY2tZRnIgPSBCbG9ja1kgPj4gMTsgIAotICAgIEJsb2NrWE1pbjFGciA9IChCbG9ja1ggLSAxKSA+PiAxOyAgCi0gICAgQmxvY2tZTWluMUZyID0gKEJsb2NrWSAtIDEpID4+IDE7ICAKLSAgICBCbG9ja1hQbHVzT2ZmRnIgPSBCbG9ja1hQbHVzT2ZmID4+IDE7Ci0gICAgCi0gICAgTVZQcmVkVHlwZSA9IEFSTV9WQ000UDEwX01WUFJFRF9NRURJQU47Ci0KLSAgICBSRnJhbWVMID0gcFJlZkZyQXJyIFtCbG9ja1lGcl1bQmxvY2tYTWluMUZyXTsKLSAgICBSRnJhbWVVID0gcFJlZkZyQXJyIFtCbG9ja1lNaW4xRnJdW0Jsb2NrWEZyXTsKLSAgICBSRnJhbWVVUiA9IHBSZWZGckFyciBbQmxvY2tZTWluMUZyXVtCbG9ja1hQbHVzT2ZmRnJdOwotCi0gICAgaWYgKFJGcmFtZVVSID09IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0spCi0gICAgewotICAgICAgICBSRnJhbWVVUiA9IHBSZWZGckFyciBbQmxvY2tZTWluMUZyXVtCbG9ja1hNaW4xRnJdOwotICAgIH0KLQotICAgIC8qIAotICAgICAqIFByZWRpY3Rpb24gaWYgb25seSBvbmUgb2YgdGhlIG5laWdoYm9ycyB1c2VzIHRoZSByZWZlcmVuY2UgZnJhbWUKLSAgICAgKiB3ZSBhcmUgY2hlY2tpbmcKLSAgICAgKi8KLSAgCi0gICAgaWYgKFJGcmFtZUwgPT0gUmVmRnJhbWUgJiYgUkZyYW1lVSAhPSBSZWZGcmFtZSAmJiBSRnJhbWVVUiAhPSBSZWZGcmFtZSkKLSAgICB7Ci0gICAgICAgIE1WUHJlZFR5cGUgPSBBUk1fVkNNNFAxMF9NVlBSRURfTDsKLSAgICB9Ci0gICAgZWxzZSBpZihSRnJhbWVMICE9IFJlZkZyYW1lICYmIFJGcmFtZVUgPT0gUmVmRnJhbWUgJiYgUkZyYW1lVVIgIT0gUmVmRnJhbWUpCi0gICAgewotICAgICAgICBNVlByZWRUeXBlID0gQVJNX1ZDTTRQMTBfTVZQUkVEX1U7Ci0gICAgfQotICAgIGVsc2UgaWYoUkZyYW1lTCAhPSBSZWZGcmFtZSAmJiBSRnJhbWVVICE9IFJlZkZyYW1lICYmIFJGcmFtZVVSID09IFJlZkZyYW1lKQotICAgIHsKLSAgICAgICAgTVZQcmVkVHlwZSA9IEFSTV9WQ000UDEwX01WUFJFRF9VUjsKLSAgICB9Ci0KLSAgICAvKiBEaXJlY3Rpb25hbCBwcmVkaWN0aW9ucyAgKi8KLSAgICBlbHNlIGlmKEJsb2NrU2l6ZXggPT0gOCAmJiBCbG9ja1NpemV5ID09IDE2KQotICAgIHsKLSAgICAgICAgaWYoQmxvY2tTdGFydFggPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoUkZyYW1lTCA9PSBSZWZGcmFtZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNVlByZWRUeXBlID0gQVJNX1ZDTTRQMTBfTVZQUkVEX0w7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoUkZyYW1lVVIgPT0gUmVmRnJhbWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTVZQcmVkVHlwZSA9IEFSTV9WQ000UDEwX01WUFJFRF9VUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmKEJsb2NrU2l6ZXggPT0gMTYgJiYgQmxvY2tTaXpleSA9PSA4KQotICAgIHsKLSAgICAgICAgaWYoQmxvY2tTdGFydFkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoUkZyYW1lVSA9PSBSZWZGcmFtZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNVlByZWRUeXBlID0gQVJNX1ZDTTRQMTBfTVZQUkVEX1U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihSRnJhbWVMID09IFJlZkZyYW1lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1WUHJlZFR5cGUgPSBBUk1fVkNNNFAxMF9NVlBSRURfTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHN3aXRjaCAoTVZQcmVkVHlwZSkKLSAgICB7Ci0gICAgY2FzZSBBUk1fVkNNNFAxMF9NVlBSRURfTUVESUFOOgotICAgICAgICBpZiAoIShwUmVmRnJBcnIgW0Jsb2NrWU1pbjFGcl1bQmxvY2tYTWluMUZyXSA9PSBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLIHx8IAotICAgICAgICAgICAgICBwUmVmRnJBcnIgW0Jsb2NrWU1pbjFGcl1bQmxvY2tYRnJdID09IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0sgfHwgCi0gICAgICAgICAgICAgIHBSZWZGckFyciBbQmxvY2tZTWluMUZyXVtCbG9ja1hQbHVzT2ZmRnJdID09IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0spKQotICAgICAgICB7Ci0gICAgICAgICAgICBwTVZQcmVkLT5keCA9IHBNVkFyciBbQmxvY2tZXVtCbG9ja1ggLSAxXS5keDsKLSAgICAgICAgICAgIHBNVlByZWQtPmR5ID0gcE1WQXJyIFtCbG9ja1ldW0Jsb2NrWCAtIDFdLmR5OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcE1WUHJlZC0+ZHggPSAKLSAgICAgICAgICAgICAgICBBUk1fVkNNNFAxMF9NRURJQU4ocE1WQXJyIFtCbG9ja1ldW0Jsb2NrWCAtIDFdLmR4LCAKLSAgICAgICAgICAgICAgICBwTVZBcnIgW0Jsb2NrWSAtIDFdW0Jsb2NrWF0uZHgsIAotICAgICAgICAgICAgICAgIHBNVkFyciBbQmxvY2tZIC0gMV1bQmxvY2tYUGx1c09mZl0uZHgpOwotICAgICAgICAgICAgcE1WUHJlZC0+ZHkgPSAKLSAgICAgICAgICAgICAgICBBUk1fVkNNNFAxMF9NRURJQU4ocE1WQXJyIFtCbG9ja1ldW0Jsb2NrWCAtIDFdLmR5LCAKLSAgICAgICAgICAgICAgICBwTVZBcnIgW0Jsb2NrWSAtIDFdW0Jsb2NrWF0uZHksIAotICAgICAgICAgICAgICAgIHBNVkFyciBbQmxvY2tZIC0gMV1bQmxvY2tYUGx1c09mZl0uZHkpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBBUk1fVkNNNFAxMF9NVlBSRURfTDoKLSAgICAgICAgcE1WUHJlZC0+ZHggPSBwTVZBcnIgW0Jsb2NrWV1bQmxvY2tYIC0gMV0uZHg7Ci0gICAgICAgIHBNVlByZWQtPmR5ID0gcE1WQXJyIFtCbG9ja1ldW0Jsb2NrWCAtIDFdLmR5OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFSTV9WQ000UDEwX01WUFJFRF9VOgotICAgICAgICBwTVZQcmVkLT5keCA9IHBNVkFyciBbQmxvY2tZIC0gMV1bQmxvY2tYXS5keDsKLSAgICAgICAgcE1WUHJlZC0+ZHkgPSBwTVZBcnIgW0Jsb2NrWSAtIDFdW0Jsb2NrWF0uZHk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVJNX1ZDTTRQMTBfTVZQUkVEX1VSOgotICAgICAgICBpZiAocFJlZkZyQXJyIFtCbG9ja1lNaW4xRnJdW0Jsb2NrWFBsdXNPZmZGcl0gIT0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSykKLSAgICAgICAgewotICAgICAgICAgICAgcE1WUHJlZC0+ZHggPSBwTVZBcnIgW0Jsb2NrWSAtIDFdW0Jsb2NrWFBsdXNPZmZdLmR4OwotICAgICAgICAgICAgcE1WUHJlZC0+ZHkgPSBwTVZBcnIgW0Jsb2NrWSAtIDFdW0Jsb2NrWFBsdXNPZmZdLmR5OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcE1WUHJlZC0+ZHggPSBwTVZBcnIgW0Jsb2NrWSAtIDFdW0Jsb2NrWCAtIDFdLmR4OwotICAgICAgICAgICAgcE1WUHJlZC0+ZHkgPSBwTVZBcnIgW0Jsb2NrWSAtIDFdW0Jsb2NrWCAtIDFdLmR5OwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICAKLSAgICByZXR1cm47Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfQmxvY2tNb3Rpb25TZWFyY2gKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgIEdldHMgYmVzdCBNViBmb3IgdGhlIGN1cnJlbnQgYmxvY2sKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwU3JjQ3VyckJ1ZiAgICAtIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGx1bWEgY29tcG9uZW50IG9mIGN1cnJlbnQgTWFjcm9ibG9jayAKLSAqIFtpbl0gU3JjQ3VyclN0ZXAgLSBTdGVwIHNpemUgZm9yIHRoZSBwb2ludGVyIHBTcmNDdXJyQnVmIAotICogW2luXSBwU3JjUmVmWSAgICAtIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGx1bWEgY29tcG9uZW50IG9mIGNvLWxvY2F0ZWQgcmVmZXJlbmNlIE1CCi0gKiBbaW5dIG5TcmNSZWZTdGVwIC0gU3RlcCBzaXplIGZvciB0aGUgcG9pbnRlciBwU3JjUmVmWSAKLSAqIFtpbl0gcFJlZlJlY3QgICBQb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlOyByZWxhdGl2ZSB0byB0aGUgaW1hZ2Ugb3JpZ2luLgotICogW2luXSBwQ3VyclBvaW50UG9zICAgUG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZS4KLSAqIFtpbl0gcE1FU3BlYyAgICAgLSBNb3Rpb24gZXN0aW1hdGlvbiBzdHJ1Y3R1cmUKLSAqIFtpbl0gcE1CSW50ZXIgICAgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGZvdXIKLSAqICAgICAgICAgICAgICAgICAgICBhZGphY2VudCB0eXBlIElOVEVSIE1CcyAoTGVmdCwgVG9wLCBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gCi0gKiBbaW5dIG5MYW1kYSAgICAgIC0gRm9yIGNhbGN1bGF0aW5nIHRoZSBjb3N0Ci0gKiBbb3V0XSBwQmVzdENvc3QgIC0gTWluaW11bSBjb3N0IGZvciBlbmNvZGluZyBjdXJyZW50IGJsb2NrIAotICogW291dF0gcEJlc3RNViAgICAtIE1WIGNvcnJlc3BvbmRpbmcgdG8gYmVzdCBjb3N0Ci0gKiBbaW5dIEJsb2NrU3RhcnRYIC0gQmxvY2sgc3RhcnQgWCBpbmRleCBpbiBpbnRlZ2VyIHBlbHMKLSAqIFtpbl0gQmxvY2tTdGFydFkgLSBCbG9jayBzdGFydCBZIGluZGV4IGluIGludGVnZXIgcGVscwotICogW2luXSBCbG9ja1NpemVYICAtIFdpZHRoIG9mIGN1cnJlbnQgYmxvY2sKLSAqIFtpbl0gQmxvY2tTaXplWSAgLSBIZWlnaHQgb2YgY3VycmVudCBibG9jawotICogW2luXSBSZWZGcmFtZSAgICAtIEluZGV4IG9mIHRoZSByZWZlcmVuY2UgZnJhbWUgZm9yIHByZWRpY3Rpb24KLSAqIFtpbl0gcFJlZkZyQXJyICAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBmcmFtZSBhcnJheSBzdG9yaW5nIG5laWdoYm91cmluZyBNVnMgZm9yIHByZWRpY3Rpb24KLSAqIFtpbl0gcE1WQXJyICAgICAgLSBQb2ludGVyIHRvIE1WIGFycmF5IHN0b3JpbmcgbmVpZ2hib3VyaW5nIE1WcyBmb3IgTVYgcHJlZGljdGlvbgotICogW2luXSBwTVZQcmVkICAgICAtIFBvaW50ZXIgdG8gTVYgcHJlZGljdGVkIGZyb20gbmVpZ2hib3VyIE1WcwotICogUmVtYXJrczoKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhSZXN1bHQKLSAqCi0gKi8KLXN0YXRpYyBPTVhSZXN1bHQgYXJtVkNNNFAxMF9CbG9ja01vdGlvblNlYXJjaCgKLSAgICBjb25zdCBPTVhfVTgqIHBTcmNDdXJyQnVmLCAKLSAgICBPTVhfUzMyIFNyY0N1cnJTdGVwLCAKLSAgICBjb25zdCBPTVhfVTgqIHBTcmNSZWZZLCAKLSAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLCAKLQljb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLQljb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgIHZvaWQqIHBNRVNwZWMsIAotCi0gICAgT01YX1MzMiBuTGFtZGEsCi0gICAgT01YX1MzMiogcEJlc3RDb3N0LCAKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcEJlc3RNViwKLSAgICAKLSAgICBPTVhfVTMyIEJsb2NrU3RhcnRYLCAKLSAgICBPTVhfVTMyIEJsb2NrU3RhcnRZLAotICAgIE9NWF9VMzIgQmxvY2tTaXplWCwKLSAgICBPTVhfVTMyIEJsb2NrU2l6ZVksCi0gICAgT01YX1MzMiBSZWZGcmFtZSwKLSAgICBPTVhfUzMyIHBSZWZGckFyciBbXVs2XSwgCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WQXJyIFtdWzEyXSwKLSAgICBPTVhWQ01vdGlvblZlY3RvciAqcE1WUHJlZAotICAgKQotewotCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgICBNVkNhbGN1bGF0ZWQsIE1WQ2FuZGlkYXRlOwotICAgIE9NWF9TMzIgICAgICAgICAgICAgQ29zdDsKLSAgICBPTVhSZXN1bHQgICAgICAgICAgIFJldFZhbHVlOwotICAgIE9NWFZDTTRQMTBNRVBhcmFtcyAgKnBNRVBhcmFtczsgICAgCi0JT01YVkNNNFAyQ29vcmRpbmF0ZSBDdXJyQmxvY2tQb3M7Ci0KLSAgICAvKiBHZXQgUHJlZGljdGVkIE1vdGlvbiBWZWN0b3JzICovCi0gICAgYXJtVkNNNFAxMF9TZXRNb3Rpb25WZWN0b3JQcmVkaWN0b3IgKAotICAgICAgICBCbG9ja1N0YXJ0WCwgCi0gICAgICAgIEJsb2NrU3RhcnRZLAotICAgICAgICBCbG9ja1NpemVYLCAKLSAgICAgICAgQmxvY2tTaXplWSwKLSAgICAgICAgUmVmRnJhbWUsCi0gICAgICAgIHBSZWZGckFyciwgICAKLSAgICAgICAgcE1WQXJyLCAgICAgIAotICAgICAgICBwTVZQcmVkKTsKLQotICAgIC8qIEluaXRpYWxpemUgY2FuZGlkYXRlIE1WICovCi0gICAgTVZDYW5kaWRhdGUuZHggPSAwOwotICAgIE1WQ2FuZGlkYXRlLmR5ID0gMDsKLSAgICAKLSAgICBDdXJyQmxvY2tQb3MueCA9IHBDdXJyUG9pbnRQb3MtPnggKyBCbG9ja1N0YXJ0WDsKLSAgICBDdXJyQmxvY2tQb3MueSA9IHBDdXJyUG9pbnRQb3MtPnkgKyBCbG9ja1N0YXJ0WTsKLQotICAgIC8qIEJsb2NrIE1hdGNoIEludGVnZXIgKi8KLSAgICBSZXRWYWx1ZSA9IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICgKLSAgICAgICAgcFNyY0N1cnJCdWYsIAotICAgICAgICBTcmNDdXJyU3RlcCwgCi0gICAgICAgIHBTcmNSZWZZLCAKLSAgICAgICAgblNyY1JlZlN0ZXAsIAotICAgICAgICBwUmVmUmVjdCwgCi0gICAgICAgICZDdXJyQmxvY2tQb3MsIAotICAgICAgICBCbG9ja1NpemVYLCAKLSAgICAgICAgQmxvY2tTaXplWSwgCi0gICAgICAgIG5MYW1kYSwgCi0gICAgICAgIHBNVlByZWQsIAotICAgICAgICAmTVZDYW5kaWRhdGUsIAotICAgICAgICAmTVZDYWxjdWxhdGVkLCAKLSAgICAgICAgJkNvc3QsIAotICAgICAgICBwTUVTcGVjKTsKLSAgICAKLSAgICAvKiB1cGRhdGVkIEJlc3RNViovCi0gICAgLyoqcEJlc3RDb3N0ID0gQ29zdDsKLSAgICBwQmVzdE1WLT5keCA9IE1WQ2FsY3VsYXRlZC5keDsKLSAgICBwQmVzdE1WLT5keSA9IE1WQ2FsY3VsYXRlZC5keTsqLwotCi0gICAgcE1FUGFyYW1zID0gKE9NWFZDTTRQMTBNRVBhcmFtcyAqKSBwTUVTcGVjOwotICAgIAotICAgIC8qIEJsb2NrIE1hdGNoIEhhbGYgcGVsICovCi0gICAgaWYgKHBNRVBhcmFtcy0+aGFsZlNlYXJjaEVuYWJsZSkKLSAgICB7Ci0gICAgICAgIFJldFZhbHVlID0gb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYoCi0gICAgICAgICAgICBwU3JjQ3VyckJ1ZiwgCi0gICAgICAgICAgICBTcmNDdXJyU3RlcCwgCi0gICAgICAgICAgICBwU3JjUmVmWSwgCi0gICAgICAgICAgICBuU3JjUmVmU3RlcCwgCi0gICAgICAgICAgICBCbG9ja1NpemVYLCAKLSAgICAgICAgICAgIEJsb2NrU2l6ZVksIAotICAgICAgICAgICAgbkxhbWRhLCAKLSAgICAgICAgICAgIHBNVlByZWQsIAotICAgICAgICAgICAgJk1WQ2FsY3VsYXRlZCwgICAgICAgIC8qIGlucHV0L291dHB1dCovCi0gICAgICAgICAgICAmQ29zdCk7Ci0gICAgfQotCi0gICAgLyogQmxvY2sgTWF0Y2ggUXVhcnRlciBwZWwgKi8KLSAgICBpZiAocE1FUGFyYW1zLT5xdWFydGVyU2VhcmNoRW5hYmxlKQotICAgIHsKLSAgICAgICAgUmV0VmFsdWUgPSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlcigKLSAgICAgICAgICAgIHBTcmNDdXJyQnVmLCAKLSAgICAgICAgICAgIFNyY0N1cnJTdGVwLCAKLSAgICAgICAgICAgIHBTcmNSZWZZLCAKLSAgICAgICAgICAgIG5TcmNSZWZTdGVwLCAKLSAgICAgICAgICAgIEJsb2NrU2l6ZVgsIAotICAgICAgICAgICAgQmxvY2tTaXplWSwgCi0gICAgICAgICAgICBuTGFtZGEsIAotICAgICAgICAgICAgcE1WUHJlZCwgCi0gICAgICAgICAgICAmTVZDYWxjdWxhdGVkLCAKLSAgICAgICAgICAgICZDb3N0KTsKLSAgICB9Ci0KLSAgICAvKiB1cGRhdGVkIEJlc3QgQ29zdCBhbmQgQmVzdCBNViAqLwotICAgICpwQmVzdENvc3QgPSBDb3N0OwotICAgIHBCZXN0TVYtPmR4ID0gTVZDYWxjdWxhdGVkLmR4OwotICAgIHBCZXN0TVYtPmR5ID0gTVZDYWxjdWxhdGVkLmR5OwotCi0gICAgLyoKLSAgICAgKiBTa2lwIE1CIGNvc3QgY2FsY3VsYXRpb25zIG9mIDE2eDE2IGludGVyIG1vZGUKLSAgICAgKi8KLSAgICByZXR1cm4gUmV0VmFsdWU7Ci19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfUGFydGl0aW9uTUUKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgIEdldHMgYmVzdCBjb3N0IGZvciB0aGUgY3VycmVudCBwYXJ0aXRpb24KLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwU3JjQ3VyckJ1ZiAgICAtIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGx1bWEgY29tcG9uZW50IG9mIGN1cnJlbnQgTWFjcm9ibG9jayAKLSAqIFtpbl0gU3JjQ3VyclN0ZXAgLSBTdGVwIHNpemUgZm9yIHRoZSBwb2ludGVyIHBTcmNDdXJyQnVmIAotICogW2luXSBwU3JjUmVmQnVmTGlzdCAgICAtIFBvaW50ZXIgdG8gTGlzdCBvZiByZWYgYnVmZmVyIG9mIGNvLWxvY2F0ZWQgcmVmZXJlbmNlIE1CCi0gKiBbaW5dIG5TcmNSZWZTdGVwIC0gU3RlcCBzaXplIGZvciB0aGUgcG9pbnRlciBwU3JjUmVmWSAKLSAqIFtpbl0gcFJlZlJlY3QgICBQb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlOyByZWxhdGl2ZSB0byB0aGUgaW1hZ2Ugb3JpZ2luLgotICogW2luXSBwQ3VyclBvaW50UG9zICAgUG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZS4KLSAqIFtpbl0gcE1FU3BlYyAgICAgLSBNb3Rpb24gZXN0aW1hdGlvbiBzdHJ1Y3R1cmUKLSAqIFtpbl0gUGFydFdpZHRoICAgLSBXaWR0aCBvZiBjdXJyZW50IHBhcnRpdGlvbgotICogW2luXSBQYXJ0SGVpZ2h0ICAtIEhlaWdodCBvZiBjdXJyZW50IHBhcnRpdGlvbgotICogW2luXSBCbG9ja1dpZHRoICAtIFdpZHRoIG9mIGN1cnJlbnQgYmxvY2sKLSAqIFtpbl0gQmxvY2tIZWlnaHQgLSBIZWlnaHQgb2YgY3VycmVudCBibG9jawotICogW2luXSBQYXJ0U3RhcnRYICAtIFBhcnRpdGlvbiBzdGFydCBYIGluZGV4IGluIGludGVnZXIgcGVscwotICogW2luXSBQYXJ0U3RhcnRZICAtIFBhcnRpdGlvbiBzdGFydCBZIGluZGV4IGluIGludGVnZXIgcGVscwotICogW2luXSBwTVZBcnIgICAgICAtIFBvaW50ZXIgdG8gTVYgYXJyYXkgc3RvcmluZyBuZWlnaGJvdXJpbmcgTVZzIGZvciBNViBwcmVkaWN0aW9uCi0gKiBbaW5dIHBSZWZGckFyciAgIC0gUG9pbnRlciB0byByZWZlcmVuY2UgZnJhbWUgYXJyYXkgc3RvcmluZyBuZWlnaGJvdXJpbmcgTVZzIGZvciBwcmVkaWN0aW9uCi0gKiBbaW5dIExhbWJkYSAgICAgIC0gRm9yIGNhbGN1bGF0aW5nIHRoZSBjb3N0Ci0gKiBbb3V0XSBwQ29zdCAgICAgIC0gUG9pbnRlciB0byBjb3N0IGZvciBJbnRlciBNQgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWFJlc3VsdAotICoKLSAqLwotc3RhdGljIE9NWFJlc3VsdCBhcm1WQ000UDEwX1BhcnRpdGlvbk1FICgKLSAgICBjb25zdCBPTVhfVTgqIHBTcmNDdXJyQnVmLCAgIAotICAgIE9NWF9TMzIgU3JjQ3VyclN0ZXAsCi0JY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmTGlzdFtBUk1fVkNNNFAxMF9NQVhfRlJBTUVTXSwKLQlPTVhfUzMyIFNyY1JlZlN0ZXAsCi0JY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0JY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICB2b2lkKiBwTUVTcGVjLCAKLQotICAgIE9NWF9TMzIgUGFydFdpZHRoLAotICAgIE9NWF9TMzIgUGFydEhlaWdodCwKLSAgICBPTVhfUzMyIEJsb2NrV2lkdGgsCi0gICAgT01YX1MzMiBCbG9ja0hlaWdodCwKLSAgICBPTVhfUzMyIFBhcnRTdGFydFgsIAotICAgIE9NWF9TMzIgUGFydFN0YXJ0WSwKLQotICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVkFyciBbXVsxMl0sCi0gICAgT01YX1MzMiBwUmVmRnJBcnIgW11bNl0sCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WUHJlZEFyciBbXVs0XSwKLQotICAgIE9NWF9TMzIgTGFtYmRhLAotICAgIE9NWF9TMzIgKnBDb3N0Ci0pCi17Ci0gICAgT01YX1UzMiAgICAgeCwgeSwgaSwgaiwgcmVmLCBPZmZYLCBPZmZZLCBPZmZTcmMsIE9mZlJlZjsKLSAgICBPTVhfUzMyICAgICBCbG9ja0Nvc3QsIFBhcnRpdGlvbkNvc3QsIEJlc3RDb3N0OwotICAgIE9NWF9TMzIgICAgIEJlc3RSZWZGcmFtZT0wOwotICAgIE9NWFZDTW90aW9uVmVjdG9yICAgQmVzdE1WIFs0XVs0XTsKLSAgICBPTVhWQ01vdGlvblZlY3RvciAgIEJlc3RNVlByZWQgWzRdWzRdOwotICAgIE9NWFZDTW90aW9uVmVjdG9yICAgTVZQcmVkOwotICAgIE9NWFZDTW90aW9uVmVjdG9yICAgRHN0TVY7Ci0KLSAgICBCZXN0Q29zdCA9IEFSTV9WQ000UDEwX01BWF9DT1NUOwotICAgIAotICAgIGZvciAocmVmID0gMDsgcmVmIDwgQVJNX1ZDTTRQMTBfTUFYX0ZSQU1FUzsgcmVmKyspCi0gICAgewotICAgICAgICBpZiAocFNyY1JlZkJ1Zkxpc3QgW3JlZl0gPT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAJLyogTm8gcmVmZXJlbmNlIGZyYW1lLCBjb250aW51ZSAqLwotICAgICAgICAJY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBQYXJ0aXRpb25Db3N0ID0gMDsKLSAgICAgICAgCi0gICAgICAgIGZvciAoeSA9IDA7IHkgPCBQYXJ0SGVpZ2h0OyB5ICs9IEJsb2NrSGVpZ2h0KQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgUGFydFdpZHRoOyB4ICs9IEJsb2NrV2lkdGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAJT2ZmU3JjID0gU3JjQ3VyclN0ZXAgKiAoUGFydFN0YXJ0WSArIHkpICsgUGFydFN0YXJ0WCArIHg7Ci0gICAgICAgICAgICAJT2ZmUmVmID0gU3JjUmVmU3RlcCAqIChQYXJ0U3RhcnRZICsgeSkgKyBQYXJ0U3RhcnRYICsgeDsKLSAgICAgICAgICAgICAgICBhcm1WQ000UDEwX0Jsb2NrTW90aW9uU2VhcmNoICgKLSAgICAgICAgICAgICAgICAgICAgcFNyY0N1cnJCdWYgKyBPZmZTcmMsIAotICAgICAgICAgICAgICAgICAgICBTcmNDdXJyU3RlcCwgCi0gICAgICAgICAgICAgICAgICAgIHBTcmNSZWZCdWZMaXN0IFtyZWZdICsgT2ZmUmVmLCAKLSAgICAgICAgICAgICAgICAgICAgU3JjUmVmU3RlcCwgCi0gICAgICAgICAgICAgICAgICAgIHBSZWZSZWN0LAotICAgICAgICAgICAgICAgICAgICBwQ3VyclBvaW50UG9zLAotICAgICAgICAgICAgICAgICAgICBwTUVTcGVjLCAKLQotICAgICAgICAgICAgICAgICAgICBMYW1iZGEsCi0gICAgICAgICAgICAgICAgICAgICZCbG9ja0Nvc3QsIAotICAgICAgICAgICAgICAgICAgICAmRHN0TVYsCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4ICsgUGFydFN0YXJ0WCwgCi0gICAgICAgICAgICAgICAgICAgIHkgKyBQYXJ0U3RhcnRZLAotICAgICAgICAgICAgICAgICAgICBCbG9ja1dpZHRoLAotICAgICAgICAgICAgICAgICAgICBCbG9ja0hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgcmVmLAotICAgICAgICAgICAgICAgICAgICBwUmVmRnJBcnIsIAotICAgICAgICAgICAgICAgICAgICBwTVZBcnIsCi0gICAgICAgICAgICAgICAgICAgICZNVlByZWQpOwotCi0gICAgICAgICAgICAgICAgUGFydGl0aW9uQ29zdCArPSBCbG9ja0Nvc3Q7Ci0JCQkJCi0JCQkJT2ZmWCA9IChQYXJ0U3RhcnRYICsgeCkgPj4gMjsKLQkJCQlPZmZZID0gKFBhcnRTdGFydFkgKyB5KSA+PiAyOwotCQkJCQotCSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAoQmxvY2tIZWlnaHQgPj4gMik7IGorKykKLQkgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoQmxvY2tXaWR0aCA+PiAyKTsgaSsrKQotCSAgICAgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgICAgICBwTVZBcnIgWzQgKyBPZmZZICsgal1bNCArIE9mZlggKyBpXS5keCA9IERzdE1WLmR4OwotCSAgICAgICAgICAgICAgICAgICAgcE1WQXJyIFs0ICsgT2ZmWSArIGpdWzQgKyBPZmZYICsgaV0uZHkgPSBEc3RNVi5keTsKLQkgICAgICAgICAgICAgICAgICAgIHBNVlByZWRBcnIgW09mZlkgKyBqXVtPZmZYICsgaV0uZHggPSBNVlByZWQuZHg7Ci0JICAgICAgICAgICAgICAgICAgICBwTVZQcmVkQXJyIFtPZmZZICsgal1bT2ZmWCArIGldLmR5ID0gTVZQcmVkLmR5OwotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgfQotCi0JCQkJcFJlZkZyQXJyIFsyICsgKE9mZlkgPj4gMSldWzIgKyAoT2ZmWCA+PiAxKV0gPSByZWY7Ci0JICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IChCbG9ja0hlaWdodCA+PiAzKTsgaisrKQotCSAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChCbG9ja1dpZHRoID4+IDMpOyBpKyspCi0JICAgICAgICAgICAgICAgIHsKLQkJCSAgICAgICAgICAgIHBSZWZGckFyciBbMiArIChPZmZZID4+IDEpICsgal1bMiArIChPZmZYID4+IDEpICsgaV0gPSByZWY7Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0JCS8qCi0JCSAqIElmIFBhcnRpdGlvbkNvc3QgaXMgbGVzcyBmb3IgdGhpcyByZWZlcmVuY2UgZnJhbWUsIG1vdGlvbiB2ZWN0b3JzIG5lZWRzIHRvIGJlIGJhY2tlZHVwCi0JCSAqLwotICAgICAgICBpZiAoUGFydGl0aW9uQ29zdCA8PSBCZXN0Q29zdCkKLSAgICAgICAgewotICAgICAgICAgICAgQmVzdENvc3QgPSBQYXJ0aXRpb25Db3N0OyAgICAgICAgICAgIAotICAgICAgICAgICAgQmVzdFJlZkZyYW1lID0gcmVmOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgKFBhcnRIZWlnaHQvQmxvY2tIZWlnaHQpOyB5KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IChQYXJ0V2lkdGgvQmxvY2tXaWR0aCk7IHgrKykKLSAgICAgICAgICAgICAgICB7Ci0JCQkJCU9mZlggPSAoUGFydFN0YXJ0WCArIHggKiBCbG9ja1dpZHRoKSA+PiAyOwotCQkJCQlPZmZZID0gKFBhcnRTdGFydFkgKyB5ICogQmxvY2tIZWlnaHQpID4+IDI7Ci0JCQkJCi0gICAgICAgICAgICAgICAgICAgIEJlc3RNVlt5XVt4XS5keCA9IHBNVkFyciBbNCArIE9mZlldWzQgKyBPZmZYXS5keDsKLSAgICAgICAgICAgICAgICAgICAgQmVzdE1WW3ldW3hdLmR5ID0gcE1WQXJyIFs0ICsgT2ZmWV1bNCArIE9mZlhdLmR5OwotICAgICAgICAgICAgICAgICAgICBCZXN0TVZQcmVkW3ldW3hdLmR4ID0gcE1WUHJlZEFyciBbT2ZmWV1bT2ZmWF0uZHg7Ci0gICAgICAgICAgICAgICAgICAgIEJlc3RNVlByZWRbeV1beF0uZHkgPSBwTVZQcmVkQXJyIFtPZmZZXVtPZmZYXS5keTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotCS8qCi0JICogQ29weSBiYWNrIGJlc3QgcmVmZXJlbmNlIGZyYW1lLCBtb3Rpb24gdmVjdG9ycyBhbmQgY29zdC4KLQkgKi8KLSAgICBmb3IgKHkgPSAwOyB5IDwgKFBhcnRIZWlnaHQvQmxvY2tIZWlnaHQpOyB5KyspCi0gICAgewotICAgICAgICBmb3IgKHggPSAwOyB4IDwgKFBhcnRXaWR0aC9CbG9ja1dpZHRoKTsgeCsrKQotICAgICAgICB7Ci0JCQlPZmZYID0gKFBhcnRTdGFydFggKyB4ICogQmxvY2tXaWR0aCkgPj4gMjsKLQkJCU9mZlkgPSAoUGFydFN0YXJ0WSArIHkgKiBCbG9ja0hlaWdodCkgPj4gMjsgICAgICAgICAgICAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IChCbG9ja0hlaWdodCA+PiAyKTsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoQmxvY2tXaWR0aCA+PiAyKTsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcE1WQXJyIFs0ICsgT2ZmWSArIGpdWzQgKyBPZmZYICsgaV0uZHggPSBCZXN0TVZbeV1beF0uZHg7Ci0gICAgICAgICAgICAgICAgICAgIHBNVkFyciBbNCArIE9mZlkgKyBqXVs0ICsgT2ZmWCArIGldLmR5ID0gQmVzdE1WW3ldW3hdLmR5OwotICAgICAgICAgICAgICAgICAgICBwTVZQcmVkQXJyIFtPZmZZICsgal1bT2ZmWCArIGldLmR4ID0gQmVzdE1WUHJlZFt5XVt4XS5keDsKLSAgICAgICAgICAgICAgICAgICAgcE1WUHJlZEFyciBbT2ZmWSArIGpdW09mZlggKyBpXS5keSA9IEJlc3RNVlByZWRbeV1beF0uZHk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgKEJsb2NrSGVpZ2h0ID4+IDMpOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChCbG9ja1dpZHRoID4+IDMpOyBpKyspCi0gICAgICAgICAgICAgICAgewotCQkgICAgICAgICAgICBwUmVmRnJBcnIgWzIgKyAoT2ZmWSA+PiAxKSArIGpdWzIgKyAoT2ZmWCA+PiAxKSArIGldID0gQmVzdFJlZkZyYW1lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCSpwQ29zdCA9IEJlc3RDb3N0OwotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotCi19Ci0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50cmExNngxNkVzdGltYXRpb24KLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGZvciBJTlRFUiBNQiB0eXBlIGFuZCBzZWxlY3RzIGJlc3QgbW90aW9uIGVzdGltYXRpb24gc3RyYXRlZ3kgZnJvbSAKLSAqIHRoZSBzZXQgb2YgbW9kZXMgc3VwcG9ydGVkIGluIGJhc2VsaW5lIHByb2ZpbGUgSVNPL0lFQyAxNDQ5Ni0xMC4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBTcmNDdXJyQnVmICAgIC0gUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgbHVtYSBjb21wb25lbnQgb2YgY3VycmVudCBNYWNyb2Jsb2NrIAotICogW2luXSBTcmNDdXJyU3RlcCAtIFN0ZXAgc2l6ZSBmb3IgdGhlIHBvaW50ZXIgcFNyY0N1cnJCdWYgCi0gKiBbaW5dIHBTcmNSZWNCdWYgICAgLSBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBsdW1hIGNvbXBvbmVudCBvZiBjby1sb2NhdGVkIHJlY29uc3RydWN0ZWQgTUIgCi0gKiBbaW5dIFNyY1JlY1N0ZXAgLSBTdGVwIHNpemUgZm9yIHRoZSBwb2ludGVyIHBTcmNSZWNCdWYgCi0gKiBbaW5dIG5NQlBvc1ggICAgIC0gUG9zaXRpb24gb2YgTUIgaW4gdGhlIGZyYW1lIHcuci50IFggYXhpcwotICogW2luXSBuTUJQb3NZICAgICAtIFBvc2l0aW9uIG9mIE1CIGluIHRoZSBmcmFtZSB3LnIudCBZIGF4aXMKLSAqIFtpbl0gcE1CSW50ZXIgICAgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGZvdXIKLSAqICAgICAgICAgICAgICAgICAgICBhZGphY2VudCB0eXBlIElOVEVSIE1CcyAoTGVmdCwgVG9wLCBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gCi0gKiBbaW5dIHBNQkludHJhICAgIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBmb3VyCi0gKiAgICAgICAgICAgICAgICAgICAgYWRqYWNlbnQgdHlwZSBJTlRSQSBNQnMgKExlZnQsIFRvcCwgVG9wLUxlZnQsIFRvcC1SaWdodCkuIAotICogW2luL291dF0gcFNyY0RzdE1CQ3VyciAtIFBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIEZvbGxvd2luZyBtZW1iZXIgc2hvdWxkIGJlIHNldCAKLSAqICAgICAgICAgICAgICAgICAgICBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uCi0gKiBbaW5dIExhbWJkYSAgICAgIC0gRm9yIGNhbGN1bGF0aW5nIHRoZSBjb3N0Ci0gKiBbb3V0XSBwQ29zdCAgICAgIC0gUG9pbnRlciB0byBjb3N0IGZvciBJbnRyYTE2eDE2Ci0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfU3RzX05vRXJyIC0gTm8gRXJyb3IKLSAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKLSAqCi0gKi8KLQotc3RhdGljIE9NWFJlc3VsdCBhcm1WQ000UDEwX0ludHJhMTZ4MTZFc3RpbWF0aW9uKAotICAgIGNvbnN0IE9NWF9VOCogcFNyY0N1cnJCdWYsICAgCi0gICAgT01YX1MzMiBTcmNDdXJyU3RlcCwKLSAgICBjb25zdCBPTVhfVTgqIHBTcmNSZWNCdWYsICAgCi0gICAgT01YX1MzMiBTcmNSZWNTdGVwLAotCWNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50ZXIsCi0gICAgY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50cmEsCi0gICAgT01YVkNNNFAxME1CSW5mbyAqcFNyY0RzdE1CQ3VyciwKLSAgICBPTVhfVTMyICpwQ29zdCkKLXsKLSAgICBPTVhfVTggICAgICBQcmVkQnVmIFsxNioxNiArIDE2XTsKLSAgICBPTVhfVTggICAgICAqcFByZWQ7Ci0gICAgT01YX1MzMiAgICAgbW9kZTsKLSAgICBPTVhfUzMyICAgICBDb3N0OwotICAgIE9NWF9TMzIgICAgIGF2YWlsYWJpbGl0eSA9IDA7Ci0gICAgT01YUmVzdWx0ICAgUmV0OwotICAgIE9NWFZDTTRQMTBJbnRyYTE2eDE2UHJlZE1vZGUgICAgSW50cmFNb2RlMTZ4MTYgWzRdID0gCi0gICAgICAgIHtPTVhfVkNfMTZYMTZfVkVSVCwgT01YX1ZDXzE2WDE2X0hPUiwgCi0gICAgICAgIE9NWF9WQ18xNlgxNl9EQywgT01YX1ZDXzE2WDE2X1BMQU5FfTsgICAgICAgIAotICAgIE9NWF9VMzIgICAgIE1CUG9zWCA9IHBDdXJyUG9pbnRQb3MtPnggPj4gNDsgICAgICAgIAotICAgIE9NWF9VMzIgICAgIE1CUG9zWSA9IHBDdXJyUG9pbnRQb3MtPnkgPj4gNDsgICAgICAgIAotCi0JcFByZWQgPSBhcm1BbGlnblRvMTZCeXRlcyhQcmVkQnVmKTsKLSAgICAKLQkvKiBDaGVjayBmb3IgYXZhaWxhYmlsaXR5IG9mIExFRlQgTUIgKi8KLSAgICBpZiAoKE1CUG9zWCAhPSAwKSAmJiAocE1CSW50cmEgWzBdICE9IDAgfHwgcE1CSW50ZXIgWzBdICE9IDApKQotICAgIHsKLSAgICAgICAgYXZhaWxhYmlsaXR5IHw9IE9NWF9WQ19MRUZUOyAgICAgICAgCi0gICAgfQotCi0gICAgLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBVUCBNQiAqLwotICAgIGlmICgoTUJQb3NZICE9IDApICYmIChwTUJJbnRyYSBbMV0gIT0gMCB8fCBwTUJJbnRlciBbMV0gIT0gMCkpCi0gICAgewotICAgICAgICBhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX1VQUEVSOyAgICAgICAgCi0gICAgfQotCi0gICAgLyogQ2hlY2sgZm9yIGF2YWlsYWJpbGl0eSBvZiBVUC1MRUZUIE1CICovCi0gICAgaWYgKChNQlBvc1ggPiAwKSAmJiAoTUJQb3NZID4gMCkgJiYgCi0gICAgICAgIChwTUJJbnRyYSBbMl0gIT0gMCB8fCBwTUJJbnRlciBbMl0gIT0gMCkpCi0gICAgewotICAgICAgICBhdmFpbGFiaWxpdHkgfD0gT01YX1ZDX1VQUEVSX0xFRlQ7ICAgICAgICAKLSAgICB9Ci0KLSAgICAqcENvc3QgPSBBUk1fVkNNNFAxMF9NQVhfQ09TVDsKLSAgICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgNDsgbW9kZSsrKQotICAgIHsKLSAgICAgICAgUmV0ID0gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYoCi0gICAgICAgICAgICAgICAgcFNyY1JlY0J1ZiAtIDEsIAotICAgICAgICAgICAgICAgIHBTcmNSZWNCdWYgLSBTcmNSZWNTdGVwLCAKLSAgICAgICAgICAgICAgICBwU3JjUmVjQnVmIC0gU3JjUmVjU3RlcCAtIDEsIAotICAgICAgICAgICAgICAgIHBQcmVkLCAKLSAgICAgICAgICAgICAgICBTcmNSZWNTdGVwLCAKLSAgICAgICAgICAgICAgICAxNiwgCi0gICAgICAgICAgICAgICAgSW50cmFNb2RlMTZ4MTYgW21vZGVdLCAKLSAgICAgICAgICAgICAgICBhdmFpbGFiaWxpdHkpOwotICAgICAgICBpZiAoUmV0ID09IE9NWF9TdHNfTm9FcnIpICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB7Ci0gICAgICAgICAgICBhcm1WQ0NPTU1fU0FEKCAgICAKLSAgICAgICAgICAgICAgICBwU3JjQ3VyckJ1ZiwKLSAgICAgICAgICAgICAgICBTcmNDdXJyU3RlcCwKLSAgICAgICAgICAgICAgICBwUHJlZCwKLSAgICAgICAgICAgICAgICAxNiwKLSAgICAgICAgICAgICAgICAmQ29zdCwKLSAgICAgICAgICAgICAgICAxNiwKLSAgICAgICAgICAgICAgICAxNik7Ci0gICAgICAgICAgICBpZiAoQ29zdCA8ICpwQ29zdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcENvc3QgPSBDb3N0OwotICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPkludHJhMTZ4MTZQcmVkTW9kZSA9IEludHJhTW9kZTE2eDE2IFttb2RlXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludHJhNHg0RXN0aW1hdGlvbgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gZm9yIEludHJhIDR4NCBNQiB0eXBlIGFuZCBzZWxlY3RzCi0gKiB0aGUgYmVzdCBzZXQgb2YgbW9kZXMgc3VwcG9ydGVkIGluIGJhc2VsaW5lIHByb2ZpbGUuCi0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcFNyY0N1cnJCdWYgICAgLSBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBsdW1hIGNvbXBvbmVudCBvZiBjdXJyZW50IE1hY3JvYmxvY2sgCi0gKiBbaW5dIFNyY0N1cnJTdGVwIC0gU3RlcCBzaXplIGZvciB0aGUgcG9pbnRlciBwU3JjQ3VyckJ1ZiAKLSAqIFtpbl0gcFNyY1JlY0J1ZiAgICAtIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGx1bWEgY29tcG9uZW50IG9mIGNvLWxvY2F0ZWQgcmVjb25zdHJ1Y3RlZCBNQiAKLSAqIFtpbl0gU3JjUmVjU3RlcCAtIFN0ZXAgc2l6ZSBmb3IgdGhlIHBvaW50ZXIgcFNyY1JlY0J1ZiAKLSAqIFtpbl0gbk1CUG9zWCAgICAgLSBQb3NpdGlvbiBvZiBNQiBpbiB0aGUgZnJhbWUgdy5yLnQgWCBheGlzCi0gKiBbaW5dIG5NQlBvc1kgICAgIC0gUG9zaXRpb24gb2YgTUIgaW4gdGhlIGZyYW1lIHcuci50IFkgYXhpcwotICogW2luXSBwTUJJbnRyYSAgICAtIEFycmF5LCBvZiBkaW1lbnNpb24gZm91ciwgY29udGFpbmluZyBwb2ludGVycyB0byBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggZm91cgotICogICAgICAgICAgICAgICAgICAgIGFkamFjZW50IHR5cGUgSU5UUkEgTUJzIChMZWZ0LCBUb3AsIFRvcC1MZWZ0LCBUb3AtUmlnaHQpLiAKLSAqIFtpbi9vdXRdIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgTUIuICBGb2xsb3dpbmcgbWVtYmVyIHNob3VsZCBiZSBzZXQgCi0gKiAgICAgICAgICAgICAgICAgICAgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbgotICogW2luXSBMYW1iZGEgICAgICAtIEZvciBjYWxjdWxhdGluZyB0aGUgY29zdAotICogW291dF0gcENvc3QgICAgICAtIFBvaW50ZXIgdG8gY29zdCBmb3IgSW50cmE0eDQKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9TdHNfTm9FcnIgLSBObyBFcnJvcgotICogT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgotICoKLSAqLwotCi1zdGF0aWMgT01YUmVzdWx0IGFybVZDTTRQMTBfSW50cmE0eDRFc3RpbWF0aW9uKAotICAgIGNvbnN0IE9NWF9VOCogcFNyY0N1cnJCdWYsICAgCi0gICAgT01YX1MzMiBTcmNDdXJyU3RlcCwKLSAgICBjb25zdCBPTVhfVTgqIHBTcmNSZWNCdWYsICAgCi0gICAgT01YX1MzMiBTcmNSZWNTdGVwLAotICAgIGNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludHJhLAotICAgIE9NWFZDTTRQMTBNQkluZm8gKnBTcmNEc3RNQkN1cnIsCi0gICAgT01YX1UzMiAqcENvc3QpCi17Ci0gICAgT01YX1MzMiAgICAgeCwgeSwgQmxvY2s0eDQsIEJsb2NrOHg4OwotICAgIE9NWF9TMzIgICAgIENvc3Q7Ci0KLSAgICAvKgotICAgICAqIFByZWRJbnRyYTR4NE1vZGUgd2lsbCBzdG9yZSBwcmVkaWN0aW9uIG1vZGVzIG9mIDR4NCBibG9ja3MuIAotICAgICAqIE1vZGVzIGZvciBjdXJyZW50IE1CIHN0YXJ0cyBhdCBpbmRleCBbMV1bMV0uICAgCi0gICAgICogTW9kZXMgb2YgbmlnaGJvdXJpbmcgTUIncyB3aWxsIGJlIGFzIHNob3duIGJlbG93Ci0gICAgICogQSB2YWx1ZSBvZiBBUk1fVkNNNFAxMF9JTlZBTElEX0JMT0NLIGZvciBhbnkgYmxvY2sgaW4gdGhpcyBhcnJheSBtZWFucyAKLSAgICAgKiB0aGF0IGJsb2NrIGlzIG5vdCBhdmFpbGFibGUgZm9yIHByZWRpY3Rpb24uCi0gICAgICoKLSAgICAgKiBjMyBiMCBiMSBiMiBiMyBkMCBkMSBkMiBkMwotICAgICAqIGEwIHh4IHh4IHh4IHh4IC0gIC0gIC0gIC0KLSAgICAgKiBhMSB4eCB4eCB4eCB4eCAtICAtICAtICAtCi0gICAgICogYTIgeHggeHggeHggeHggLSAgLSAgLSAgLQotICAgICAqIGEzIHh4IHh4IHh4IHh4IC0gIC0gIC0gIC0KLSAgICAgKgotICAgICAqLwotICAgIE9NWF9TMzIgICAgIFByZWRJbnRyYTR4NE1vZGUgWzVdWzldOwotCi0gICAgLyoKLSAgICAgKiBwU3JjWSBzdG9yZXMgcmUtY29uc3RydXN0ZWQgc291cmNlIGFycmF5IG9mIHNpemUgM01CIFggMk1CIGFzIGJlbG93Ci0gICAgICoKLSAgICAgKiBNQjExIE1CMTIgTUIxMyAKLSAgICAgKiBNQjIxIE1CMjIgTUIyMwotICAgICAqCi0gICAgICogVGhpcyBhcnJheSB3aWxsIGJlIHVzZWQgZm9yIGxvY2FsIHJlY29uc3RydWN0aW9uIG9mIDR4NCBibG9ja3MgCi0gICAgICogd2l0aCBiZXN0IHByZWRpY3Rpb24gbW9kZSB3aXRoaW4gYW4gTUIKLSAgICAgKi8gICAgCi0gICAgT01YX1U4ICAgICAgcFNyY1kgWygxNiozKSooMTYqMildOwotICAgIE9NWF9TMzIgICAgIFN0ZXBTcmNZOwotICAgIAotICAgIC8qIGluaXQgKi8KLSAgICAqcENvc3QgPSAwOwotCi0gICAgZm9yICh5ID0gMDsgeSA8IDU7IHkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCA5OyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIAotICAgICAgICAgICAgICogSW5pdGlhbGl6ZSB3aXRoIHZhbHVlIG9mIEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0ssIHRvIG1lYW4gdGhpcyAKLSAgICAgICAgICAgICAqIDR4NCBibG9jayBpcyBub3QgYXZhaWxhYmxlIAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBQcmVkSW50cmE0eDRNb2RlIFt5XVt4XSA9IEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0s7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBSZXBsYWNlIEFSTV9WQ000UDEwX0lOVkFMSURfQkxPQ0sgdmFsdWUgd2l0aCBhdmFpbGFibGUgTUJzIHZhbHVlcyovCi0gICAgZm9yICh4ID0gMDsgeCA8IDQ7IHgrKykKLSAgICB7Ci0gICAgICAgIC8qIFN0b3JlIHZhbHVlcyBvZiBiMCwgYjEsIGIyLCBiMyAqLwotICAgICAgICBpZiAocE1CSW50cmFbMV0gIT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgUHJlZEludHJhNHg0TW9kZSBbMF1beCArIDFdID0gCi0gICAgICAgICAgICAgICAgcE1CSW50cmFbMV0tPnBJbnRyYTR4NFByZWRNb2RlWzMqNCArIHhdOyAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKiBTdG9yZSB2YWx1ZXMgb2YgZDAsIGQxLCBkMiwgZDMgKi8KLSAgICAgICAgaWYgKHBNQkludHJhWzNdICE9IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFByZWRJbnRyYTR4NE1vZGUgWzBdW3ggKyA1XSA9IAotICAgICAgICAgICAgICAgIHBNQkludHJhWzNdLT5wSW50cmE0eDRQcmVkTW9kZVszKjQgKyB4XTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKiBTdG9yZSB2YWx1ZXMgb2YgYzMgKi8KLSAgICBpZiAocE1CSW50cmFbMl0gIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIFByZWRJbnRyYTR4NE1vZGUgWzBdWzBdID0gcE1CSW50cmFbMl0tPnBJbnRyYTR4NFByZWRNb2RlWzE1XTsKLSAgICB9Ci0gICAgCi0gICAgZm9yICh5ID0gMDsgeSA8IDQ7IHkrKykKLSAgICB7Ci0gICAgICAgIC8qIFN0b3JlIHZhbHVlcyBvZiBhMCwgYTEsIGEyLCBhMyAqLwotICAgICAgICBpZiAocE1CSW50cmFbMF0gIT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgUHJlZEludHJhNHg0TW9kZSBbeSArIDFdWzBdID0gCi0gICAgICAgICAgICAgICAgcE1CSW50cmFbMF0tPnBJbnRyYTR4NFByZWRNb2RlW3kqNCArIDNdOwotICAgICAgICB9Ci0gICAgfQotICAgICAgICAKLSAgICAvKgotICAgICAqIFVwZGF0ZSBuZWlnaGJvdXJpbmcgUHJlZCBtb2RlIGFycmF5IHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IKLSAgICAgKiBwcmVkaWN0aW9uIG9mIEludHJhNHg0IG1vZGVzLgotICAgICAqLwotICAgIAotICAgIFN0ZXBTcmNZID0gMTYgKiAzOwotICAgIGZvciAoeSA9IDA7IHkgPCAoMTYgKiAyKTsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8ICgxNiAqIDMpOyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBTcmNZIFtTdGVwU3JjWSAqIHkgKyB4XSA9IAotICAgICAgICAgICAgICAgIHBTcmNSZWNCdWYgW1NyY1JlY1N0ZXAgKiAoeSAtIDE2KSArIHggLSAxNl07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyogZm9yIGVhY2ggOHg4IGJsb2NrICovCi0gICAgZm9yIChCbG9jazh4OCA9IDA7IEJsb2NrOHg4IDwgNDsgQmxvY2s4eDgrKykKLSAgICB7Ci0gICAgICAgIC8qIGZvciBlYWNoIDR4NCBibG9jayBpbnNpZGUgOHg4IGJsb2NrICovCi0gICAgICAgIGZvciAoQmxvY2s0eDQgPSAwOyBCbG9jazR4NCA8IDQ7IEJsb2NrNHg0KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFybVZDTTRQMTBfTW9kZTR4NERlY2lzaW9uICgKLSAgICAgICAgICAgICAgICBwU3JjQ3VyckJ1ZiwgICAKLSAgICAgICAgICAgICAgICBTcmNDdXJyU3RlcCwKLSAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLAotICAgICAgICAgICAgICAgIEJsb2NrOHg4LCAKLSAgICAgICAgICAgICAgICBCbG9jazR4NCwKLSAgICAgICAgICAgICAgICBwU3JjWSArIDE2ICogU3RlcFNyY1kgKyAxNiwKLSAgICAgICAgICAgICAgICBTdGVwU3JjWSwKLSAgICAgICAgICAgICAgICBQcmVkSW50cmE0eDRNb2RlLCAKLSAgICAgICAgICAgICAgICAmQ29zdCk7Ci0KLSAgICAgICAgICAgICpwQ29zdCArPSBDb3N0OwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVyTUVNQgotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gZm9yIElOVEVSIE1CIHR5cGUgYW5kIHNlbGVjdHMgYmVzdCBtb3Rpb24gZXN0aW1hdGlvbiBzdHJhdGVneSBmcm9tIAotICogdGhlIHNldCBvZiBtb2RlcyBzdXBwb3J0ZWQgaW4gYmFzZWxpbmUgcHJvZmlsZSBJU08vSUVDIDE0NDk2LTEwLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcFNyY0N1cnJCdWYgICAgLSBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBsdW1hIGNvbXBvbmVudCBvZiBjdXJyZW50IE1hY3JvYmxvY2sgCi0gKiBbaW5dIFNyY0N1cnJTdGVwIC0gU3RlcCBzaXplIGZvciB0aGUgcG9pbnRlciBwU3JjQ3VyckJ1ZiAKLSAqIFtpbl0gcFNyY1JlZkJ1Zkxpc3QgICAgLSBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBsdW1hIGNvbXBvbmVudCBvZiBjby1sb2NhdGVkIHJlZmVyZW5jZSBNQgotICogW2luXSBTcmNSZWZTdGVwIC0gU3RlcCBzaXplIGZvciB0aGUgcG9pbnRlciBwU3JjUmVmWSAKLSAqIFtpbl0gcFJlZlJlY3QgICBQb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlOyByZWxhdGl2ZSB0byB0aGUgaW1hZ2Ugb3JpZ2luLgotICogW2luXSBwQ3VyclBvaW50UG9zICAgUG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZS4KLSAqIFtpbl0gcE1FU3BlYyAgICAgLSBNb3Rpb24gZXN0aW1hdGlvbiBzdHJ1Y3R1cmUKLSAqIFtpbl0gcE1CSW50ZXIgICAgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGZvdXIKLSAqICAgICAgICAgICAgICAgICAgICBhZGphY2VudCB0eXBlIElOVEVSIE1CcyAoTGVmdCwgVG9wLCBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gCi0gKiBbaW4vb3V0XSBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IE1CLiAgRm9sbG93aW5nIG1lbWJlciBzaG91bGQgYmUgc2V0IAotICogICAgICAgICAgICAgICAgICAgIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KLSAqIFtpbl0gTGFtYmRhICAgICAgLSBGb3IgY2FsY3VsYXRpbmcgdGhlIGNvc3QKLSAqIFtvdXRdIHBEc3RDb3N0ICAgICAgLSBQb2ludGVyIHRvIGNvc3QgZm9yIEludGVyIE1CCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfU3RzX05vRXJyIC0gTm8gRXJyb3IKLSAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKLSAqCi0gKi8KLQotc3RhdGljIE9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVyTUVNQigKLSAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLCAKLQlPTVhfUzMyIFNyY0N1cnJTdGVwLCAKLQljb25zdCBPTVhfVTggKnBTcmNSZWZCdWZMaXN0W0FSTV9WQ000UDEwX01BWF9GUkFNRVNdLAotCU9NWF9TMzIgU3JjUmVmU3RlcCwKLQljb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLQljb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotCU9NWF9VMzIgTGFtYmRhLAotCXZvaWQgKnBNRVNwZWMsCi0JY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50ZXIsIAotICAgIE9NWFZDTTRQMTBNQkluZm9QdHIgcFNyY0RzdE1CQ3VyciwKLQlPTVhfVTMyICpwRHN0Q29zdCkKLXsKLSAgICBPTVhfUzMyICAgICBpLCBqLCB4LCB5LCBtb2RlOwotICAgIE9NWF9VMzIgICAgIEJsb2NrOHg4LCBYUGVyTUIsIFlQZXJNQiwgQmxvY2syeCwgQmxvY2syeTsKLSAgICBPTVhfUzMyICAgICBQYXJ0U3RhcnRYID0gMCwgUGFydFN0YXJ0WSA9IDA7Ci0gICAgT01YX1MzMiAgICAgUGFydFdpZHRoID0gOCwgUGFydEhlaWdodCA9IDgsIEJsb2NrV2lkdGggPSA0LCBCbG9ja0hlaWdodCA9IDQ7Ci0gICAgY29uc3QgT01YX1UzMiAgICAgQmxrU3ogWzRdWzJdID0ge3s0LDR9LCB7NCw4fSwgezgsNH19OwotICAgIGNvbnN0IE9NWF9VMzIgICAgIFBhcnRTeiBbNF1bMl0gPSB7ezgsOH0sIHs4LDE2fSwgezE2LDh9LCB7MTYsMTZ9fTsKLSAgICBjb25zdCBPTVhWQ000UDEwU3ViTWFjcm9ibG9ja1R5cGUgICAgIAotICAgICAgICAgICAgICAgIE1vZGVTdWJNQlR5cGU0eDQgW10gPSB7T01YX1ZDX1NVQl9QXzR4NCwgT01YX1ZDX1NVQl9QXzR4OCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfU1VCX1BfOHg0LCBPTVhfVkNfU1VCX1BfOHg4fTsKLSAgICBjb25zdCBPTVhWQ000UDEwTWFjcm9ibG9ja1R5cGUKLSAgICAgICAgICAgICAgICBNb2RlTUJUeXBlIFtdID0ge09NWF9WQ19QXzh4OCwgT01YX1ZDX1BfOHgxNiwgT01YX1ZDX1BfMTZ4OCwgT01YX1ZDX1BfMTZ4MTZ9OwotICAgIAotICAgIE9NWFZDTTRQMTBNRVBhcmFtcyAgKnBNQk9wdGlvbnM7Ci0gICAgLyoKLSAgICAgKiBSZWZGckFyciBhbmQgIE1WQXJyIHdpbGwgYmUgdXNlZCBmb3IgdGVtcG9yYXJ5IHN0b3JhZ2Ugb2YgUmVmZXJlbmNlIGZyYW1lIGluZGV4IGFuZCBNVnMKLSAgICAgKiBJdCB3aWxsIHN0b3JlIFJlZkluZGV4IGFuZCBNVnMgb2YgNiBNQnMgYXMgc2hvd24gYmVsb3cKLSAgICAgKiAKLSAgICAgKiAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tfAotICAgICAqICAgICB8VHAtTHQgfFRvcCAgIHxUcC1SICB8Ci0gICAgICogICAgIHwgTUIgICB8IE1CICAgfCBNQiAgIHwKLSAgICAgKiAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tfAotICAgICAqICAgICB8TGVmdCAgfCBDdXJyIHwgICAgICB8Ci0gICAgICogICAgIHwgTUIgICB8IE1CICAgfCAgICAgIHwKLSAgICAgKiAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tfAotICAgICAqLwotICAgIE9NWF9TMzIgICAgIFJlZkZyQXJyIFs0XVs2XTsgCi0gICAgT01YVkNNb3Rpb25WZWN0b3IgTVZBcnIgWzhdWzEyXTsKLSAgICBPTVhWQ01vdGlvblZlY3RvciBNVlByZWRBcnIgWzRdWzRdOwotICAgIAotICAgIC8qCi0gICAgICogSW5kZXhUb0xvYyB3aWxsIHRyYW5zbGF0ZSBwTUJJbnRlciBpbmRleCBpbnRvIHNwYWNpYWwgYXJyYW5nZW1lbnQgb2YgTUJzCi0gICAgICovCi0gICAgT01YX1MzMiAgICAgSW5kZXhUb0xvYyBbXSA9IHsyLDEsMywwfTsKLSAgICBPTVhfVTMyICAgICBwYXJ0LCBNYXhQYXJ0OwotICAgIE9NWF9TMzIgICAgIENvc3QsIE1vdGlvbkNvc3Q4eDggWzRdLCBNQkNvc3QsIEJlc3RDb3N0OwotCi0gICAgLyoKLSAgICAgKiBVcGRhdGUgbmVpZ2hib3VyaW5nIE1WIGFycmF5IGFuZCBSZWYgZnJhbWUgYXJyYXkgd2hpY2ggd2lsbCBiZSB1c2VkIGZvcgotICAgICAqIHByZWRpY3Rpb24gb2YgTVZzIGFuZCBSZWYgZnJhbWVzLgotICAgICAqLwotCi0gICAgLyogU2V0IGNvc3QgdG8gYSBoaWdoIHZhbHVlICovCi0gICAgQ29zdCA9IEJlc3RDb3N0ID0gQVJNX1ZDTTRQMTBfTUFYX0NPU1Q7Ci0gICAgCi0gICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCAxMjsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpID0gMyAqICh5ID4+IDIpICsgKHggPj4gMik7Ci0gICAgICAgICAgICBpZiAoKHkgPCA0IHx8IHggPCA0KSAmJiAocE1CSW50ZXJbSW5kZXhUb0xvY1tpXV0gIT0gTlVMTCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTVZBcnIgW3ldW3hdLmR4ID0gCi0gICAgICAgICAgICAgICAgICAgIHBNQkludGVyW0luZGV4VG9Mb2NbaV1dLT5wTVYwW3kgJSA0XVt4ICUgNF0uZHg7Ci0gICAgICAgICAgICAgICAgTVZBcnIgW3ldW3hdLmR5ID0gCi0gICAgICAgICAgICAgICAgICAgIHBNQkludGVyW0luZGV4VG9Mb2NbaV1dLT5wTVYwW3kgJSA0XVt4ICUgNF0uZHk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTVZBcnIgW3ldW3hdLmR4ID0gMDsKLSAgICAgICAgICAgICAgICBNVkFyciBbeV1beF0uZHkgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSAgICAKLQotICAgIGZvciAoeSA9IDA7IHkgPCA0OyB5KyspCi0gICAgewotICAgICAgICBmb3IgKHggPSAwOyB4IDwgNjsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpID0gMyAqICh5ID4+IDEpICsgKHggPj4gMSk7Ci0gICAgICAgICAgICBpZiAoKHkgPCAyIHx8IHggPCAyKSAmJiAocE1CSW50ZXJbSW5kZXhUb0xvY1tpXV0gIT0gTlVMTCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUmVmRnJBcnIgW3ldW3hdID0gCi0gICAgICAgICAgICAgICAgICAgIHBNQkludGVyW0luZGV4VG9Mb2NbaV1dLT5wUmVmTDBJZHggWyh5ICUgMikgKiAyICsgKHggJSAyKV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUmVmRnJBcnIgW3ldW3hdID0gQVJNX1ZDTTRQMTBfSU5WQUxJRF9CTE9DSzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gICAgCi0KLSAgICBmb3IgKHkgPSAwOyB5IDwgNDsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IDQ7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgTVZQcmVkQXJyIFt5XVt4XS5keCA9IDA7Ci0gICAgICAgICAgICBNVlByZWRBcnIgW3ldW3hdLmR5ID0gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKgotICAgICAqIE1vdGlvbiBFc3RpbWF0aW9uIGZvciA4eDggTUIgUGFydGl0aW9uIAotICAgICAqLwotCi0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICB7Ci0gICAgICAgIE1vdGlvbkNvc3Q4eDggW2ldID0gMDsKLSAgICB9ICAgICAgICAKLSAgICAKLSAgICBwTUJPcHRpb25zID0gKE9NWFZDTTRQMTBNRVBhcmFtcyAqKSBwTUVTcGVjOwotICAgIAotICAgIGlmIChwTUJPcHRpb25zLT5ibG9ja1NwbGl0RW5hYmxlOHg4ID09IDEgJiYgCi0gICAgICAgIHBNQk9wdGlvbnMtPmJsb2NrU3BsaXRFbmFibGU0eDQgPT0gMSkKLSAgICB7Ci0gICAgICAgIHBTcmNEc3RNQkN1cnItPm1iVHlwZSA9IE9NWF9WQ19QXzh4ODsKLQotICAgICAgICBQYXJ0V2lkdGggPSBQYXJ0U3ogWzBdWzBdOwotICAgICAgICBQYXJ0SGVpZ2h0ID0gUGFydFN6IFswXVsxXTsKLSAgICAgICAgCi0gICAgICAgIC8qIEZvciBlYWNoIDh4OCBwYXJ0aXRpb25zICovCi0gICAgICAgIGZvciAoQmxvY2s4eDggPSAwOyBCbG9jazh4OCA8IDQ7IEJsb2NrOHg4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFBhcnRTdGFydFggPSAoQmxvY2s4eDggJSAyKSA8PCAzOwotICAgICAgICAgICAgUGFydFN0YXJ0WSA9IChCbG9jazh4OCAvIDIpIDw8IDM7Ci0KLSAgICAgICAgICAgIEJsb2NrMnggPSAoQmxvY2s4eDggJiAxKSA8PCAxOwotICAgICAgICAgICAgQmxvY2syeSA9IChCbG9jazh4OCA+PiAxKSA8PCAxOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBCZXN0Q29zdCA9IEFSTV9WQ000UDEwX01BWF9DT1NUOwotICAgICAgICAgICAgZm9yIChtb2RlID0gMDsgbW9kZSA8IDM7IG1vZGUrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCbG9ja1dpZHRoID0gQmxrU3ogW21vZGVdWzBdOwotICAgICAgICAgICAgICAgIEJsb2NrSGVpZ2h0ID0gQmxrU3ogW21vZGVdWzFdOwotCi0gICAgICAgICAgICAgICAgYXJtVkNNNFAxMF9QYXJ0aXRpb25NRSAoCi0gICAgICAgICAgICAgICAgICAgIHBTcmNDdXJyQnVmLCAgIAotICAgICAgICAgICAgICAgICAgICBTcmNDdXJyU3RlcCwKLSAgICAgICAgICAgICAgICAgICAgcFNyY1JlZkJ1Zkxpc3QsICAgCi0gICAgICAgICAgICAgICAgICAgIFNyY1JlZlN0ZXAsCi0gICAgICAgICAgICAgICAgICAgIHBSZWZSZWN0LAotICAgICAgICAgICAgICAgICAgICBwQ3VyclBvaW50UG9zLAotICAgICAgICAgICAgICAgICAgICBwTUVTcGVjLAotCi0gICAgICAgICAgICAgICAgICAgIFBhcnRXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgUGFydEhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgQmxvY2tXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgQmxvY2tIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgIFBhcnRTdGFydFgsCi0gICAgICAgICAgICAgICAgICAgIFBhcnRTdGFydFksCi0KLSAgICAgICAgICAgICAgICAgICAgTVZBcnIsCi0gICAgICAgICAgICAgICAgICAgIFJlZkZyQXJyLAotICAgICAgICAgICAgICAgICAgICBNVlByZWRBcnIsCi0KLSAgICAgICAgICAgICAgICAgICAgTGFtYmRhLAotICAgICAgICAgICAgICAgICAgICAmQ29zdCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChDb3N0IDw9IEJlc3RDb3N0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGNvc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgQmVzdENvc3QgPSBDb3N0OwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIE1CQ3VyciBzdHJ1Y3QgKi8KLSAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+c3ViTUJUeXBlIFtCbG9jazh4OF0gPSBNb2RlU3ViTUJUeXBlNHg0IFttb2RlXTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBSZWZMMElkeCBbQmxvY2s4eDhdID0gUmVmRnJBcnIgWzIgKyAoUGFydFN0YXJ0WSA+PiAzKV1bMiArIChQYXJ0U3RhcnRYID4+IDMpXTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgcE1WMCBhbmQgcE1WUHJlZCBvZiBNQkN1cnIgc3RydWN0ICovCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMCBbQmxvY2syeSArIGpdW0Jsb2NrMnggKyBpXS5keCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WQXJyIFs0ICsgQmxvY2syeSArIGpdWzQgKyBCbG9jazJ4ICsgaV0uZHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMCBbQmxvY2syeSArIGpdW0Jsb2NrMnggKyBpXS5keSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WQXJyIFs0ICsgQmxvY2syeSArIGpdWzQgKyBCbG9jazJ4ICsgaV0uZHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WUHJlZCBbQmxvY2syeSArIGpdW0Jsb2NrMnggKyBpXS5keCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WUHJlZEFyciBbQmxvY2syeSArIGpdW0Jsb2NrMnggKyBpXS5keDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVZQcmVkIFtCbG9jazJ5ICsgal1bQmxvY2syeCArIGldLmR5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZQcmVkQXJyIFtCbG9jazJ5ICsgal1bQmxvY2syeCArIGldLmR5OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBVcGRhdGUgY29zdCAqLwotICAgICAgICAgICAgTW90aW9uQ29zdDh4OCBbQmxvY2s4eDhdID0gQmVzdENvc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qIENvc3QgZm9yIG1iVHlwZSBPTVhfVkNfUF84eDggKi8KLSAgICAgICAgQmVzdENvc3QgPSAwOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBCZXN0Q29zdCArPSBNb3Rpb25Db3N0OHg4IFtpXTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBTZXQgc3ViIE1CIHR5cGUgdG8gOHg4ICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnN1Yk1CVHlwZSBbaV0gPSBPTVhfVkNfU1VCX1BfOHg4OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBNb3Rpb24gRXN0aW1hdGlvbiBmb3IgOHg4LCA4eDE2LCAxNng4IGFuZCAxNngxNiBNQiBQYXJ0aXRpb24KLSAgICAgKiBJZiBwTUJPcHRpb25zLT5iOHg4QmxvY2tTcGxpdEVuYWJsZSBpcyAwLCBkbyBvbmx5IDE2eDE2IE1FIChtb2RlIDMpCi0gICAgICovCi0gICAgZm9yIChtb2RlID0gKHBNQk9wdGlvbnMtPmJsb2NrU3BsaXRFbmFibGU4eDggPT0gMSA/IDAgOiAzKTsgbW9kZSA8IDQ7IG1vZGUrKykKLSAgICB7Ci0gICAgICAgIEJsb2NrV2lkdGggPSBQYXJ0V2lkdGggPSBQYXJ0U3ogW21vZGVdWzBdOwotICAgICAgICBCbG9ja0hlaWdodCA9IFBhcnRIZWlnaHQgPSBQYXJ0U3ogW21vZGVdWzFdOwotICAgICAgICAKLSAgICAgICAgWFBlck1CID0gMTYgLyBQYXJ0V2lkdGg7Ci0gICAgICAgIFlQZXJNQiA9IDE2IC8gUGFydEhlaWdodDsKLSAgICAgICAgTWF4UGFydCA9IFhQZXJNQiAqIFlQZXJNQjsKLSAgICAgICAgCi0gICAgICAgIE1CQ29zdCA9IDA7Ci0gICAgICAgIAotICAgICAgICAvKiBwYXJ0IHNpemUgNCwgMiwgMiBhbmQgMSBjb3JyZXNwb25kaW5nIHRvIDh4OCwgOHgxNiwgMTZ4OCBhbmQgMTZ4MTYgTUIgKi8KLSAgICAgICAgZm9yIChwYXJ0ID0gMDsgcGFydCA8IE1heFBhcnQ7IHBhcnQrKykKLSAgICAgICAgewotICAgICAgICAJUGFydFN0YXJ0WCA9IChwYXJ0ICUgWFBlck1CKSAqIFBhcnRXaWR0aDsKLSAgICAgICAgCVBhcnRTdGFydFkgPSAocGFydCAvIFhQZXJNQikgKiBQYXJ0SGVpZ2h0OwotICAgICAgICAJCi0gICAgICAgICAgICBhcm1WQ000UDEwX1BhcnRpdGlvbk1FICgKLSAgICAgICAgICAgICAgICBwU3JjQ3VyckJ1ZiwKLSAgICAgICAgICAgICAgICBTcmNDdXJyU3RlcCwKLSAgICAgICAgICAgICAgICBwU3JjUmVmQnVmTGlzdCwgICAKLSAgICAgICAgICAgICAgICBTcmNSZWZTdGVwLAotICAgICAgICAgICAgICAgIHBSZWZSZWN0LAotICAgICAgICAgICAgICAgIHBDdXJyUG9pbnRQb3MsCi0gICAgICAgICAgICAgICAgcE1FU3BlYywKLQotICAgICAgICAgICAgICAgIFBhcnRXaWR0aCwKLSAgICAgICAgICAgICAgICBQYXJ0SGVpZ2h0LAotICAgICAgICAgICAgICAgIEJsb2NrV2lkdGgsCi0gICAgICAgICAgICAgICAgQmxvY2tIZWlnaHQsCi0gICAgICAgICAgICAgICAgUGFydFN0YXJ0WCwKLSAgICAgICAgICAgICAgICBQYXJ0U3RhcnRZLAotCi0gICAgICAgICAgICAgICAgTVZBcnIsCi0gICAgICAgICAgICAgICAgUmVmRnJBcnIsCi0gICAgICAgICAgICAgICAgTVZQcmVkQXJyLAotCi0gICAgICAgICAgICAgICAgTGFtYmRhLAotICAgICAgICAgICAgICAgICZDb3N0KTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBNQkNvc3QgKz0gQ29zdDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChNQkNvc3QgPD0gQmVzdENvc3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBjb3N0ICovCi0gICAgICAgICAgICBCZXN0Q29zdCA9IE1CQ29zdDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogVXBkYXRlIG1iVHlwZSBvZiBNQkN1cnIgc3RydWN0ICovCi0gICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5tYlR5cGUgPSBNb2RlTUJUeXBlIFttb2RlXTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogVXBkYXRlIHBNVjAgYW5kIHBNVlByZWQgb2YgTUJDdXJyIHN0cnVjdCAqLwotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMCBbal1baV0uZHggPSBNVkFyciBbNCtqXVs0K2ldLmR4OwotICAgICAgICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVYwIFtqXVtpXS5keSA9IE1WQXJyIFs0K2pdWzQraV0uZHk7Ci0gICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVlByZWQgW2pdW2ldLmR4ID0gTVZQcmVkQXJyIFtqXVtpXS5keDsKLSAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WUHJlZCBbal1baV0uZHkgPSBNVlByZWRBcnIgW2pdW2ldLmR5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnItPnBSZWZMMElkeCBbaioyK2ldID0gUmVmRnJBcnIgWzIral1bMitpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qIFVwZGF0ZSBCZXN0IENvc3QgKi8KLSAgICAqcERzdENvc3QgPSBCZXN0Q29zdDsKLSAgICAKLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTW90aW9uRXN0aW1hdGlvbk1CICAgKDYuMy41LjMuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIE1CLWxldmVsIG1vdGlvbiBlc3RpbWF0aW9uIGFuZCBzZWxlY3RzIGJlc3QgbW90aW9uIGVzdGltYXRpb24gCi0gKiBzdHJhdGVneSBmcm9tIHRoZSBzZXQgb2YgbW9kZXMgc3VwcG9ydGVkIGluIGJhc2VsaW5lIHByb2ZpbGUgW0lTTzE0NDk2LTEwXS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0N1cnJCdWYgLSBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU7IAotICogICAgICAgICAgICAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKLSAqICAgcFNyY1JlZkJ1Zkxpc3QgLSBQb2ludGVyIHRvIGFuIGFycmF5IHdpdGggMTYgZW50cmllcy4gIEVhY2ggZW50cnkgcG9pbnRzIAotICogICAgICAgICAgICB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIE1CIGluIGEgcmVmZXJlbmNlIAotICogICAgICAgICAgICBwaWN0dXJlLiAgVGhlIGFycmF5IGlzIGZpbGxlZCBmcm9tIGxvdy10by1oaWdoIHdpdGggdmFsaWQgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBmcmFtZSBwb2ludGVyczsgdGhlIHVudXNlZCBoaWdoIGVudHJpZXMgc2hvdWxkIGJlIHNldCAKLSAqICAgICAgICAgICAgdG8gTlVMTC4gIE9yZGVyaW5nIG9mIHRoZSByZWZlcmVuY2UgZnJhbWVzIHNob3VsZCBmb2xsb3cgCi0gKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gc3ViY2xhdXNlIDguMi40ICBEZWNvZGluZyBQcm9jZXNzIGZvciBSZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIFBpY3R1cmUgTGlzdHMuICAgVGhlIGVudHJpZXMgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAotICogICBwU3JjUmVjQnVmIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIE1CIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZCBwaWN0dXJlOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCi0gKiAgIFNyY0N1cnJTdGVwIC0gV2lkdGggb2YgdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBTcmNSZWZTdGVwIC0gV2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCi0gKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKLSAqICAgU3JjUmVjU3RlcCAtIFdpZHRoIG9mIHRoZSByZWNvbnN0cnVjdGVkIHBpY3R1cmUgcGxhbmUgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwUmVmUmVjdCAtIFBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSByZWN0YW5nbGU7IHJlbGF0aXZlIHRvIHRoZSAKLSAqICAgICAgICAgICAgaW1hZ2Ugb3JpZ2luLiAKLSAqICAgcEN1cnJQb2ludFBvcyAtIFBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAotICogICBMYW1iZGEgLSBMYWdyYW5nZSBmYWN0b3IgZm9yIGNvbXB1dGluZyB0aGUgY29zdCBmdW5jdGlvbiAKLSAqICAgcE1FU3BlYyAtIFBvaW50ZXIgdG8gdGhlIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyBtdXN0IAotICogICAgICAgICAgICBoYXZlIGJlZW4gYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBwcmlvciB0byBjYWxsaW5nIHRoaXMgCi0gKiAgICAgICAgICAgIGZ1bmN0aW9uLiAKLSAqICAgcE1CSW50ZXIgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIGFkamFjZW50IHR5cGUgSU5URVIgTUJzIChMZWZ0LCBUb3AsIAotICogICAgICAgICAgICBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgCi0gKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24gdCBleGlzdCBvciBpcyBub3Qgb2YgdHlwZSAKLSAqICAgICAgICAgICAgSU5URVIuIHBNQkludGVyWzBdIC0gUG9pbnRlciB0byBsZWZ0IE1CIGluZm9ybWF0aW9uIHBNQkludGVyWzFdIAotICogICAgICAgICAgICAtIFBvaW50ZXIgdG8gdG9wIE1CIGluZm9ybWF0aW9uIHBNQkludGVyWzJdIC0gUG9pbnRlciB0byAKLSAqICAgICAgICAgICAgdG9wLWxlZnQgTUIgaW5mb3JtYXRpb24gcE1CSW50ZXJbM10gLSBQb2ludGVyIHRvIHRvcC1yaWdodCBNQiAKLSAqICAgICAgICAgICAgaW5mb3JtYXRpb24gCi0gKiAgIHBNQkludHJhIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBhZGphY2VudCB0eXBlIElOVFJBIE1CcyAoTGVmdCwgVG9wLCAKLSAqICAgICAgICAgICAgVG9wLUxlZnQsIFRvcC1SaWdodCkuIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIAotICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZSBjb3JyZXNwb25kaW5nIE1CIGRvZXNuIHQgZXhpc3Qgb3IgaXMgbm90IG9mIHR5cGUgCi0gKiAgICAgICAgICAgIElOVFJBLiBwTUJJbnRyYVswXSAtIFBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiBwTUJJbnRyYVsxXSAKLSAqICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiBwTUJJbnRyYVsyXSAtIFBvaW50ZXIgdG8gCi0gKiAgICAgICAgICAgIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIHBNQkludHJhWzNdIC0gUG9pbnRlciB0byB0b3AtcmlnaHQgTUIgCi0gKiAgICAgICAgICAgIGluZm9ybWF0aW9uIAotICogICBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IE1CLiAgCi0gKiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZW50cmllcyBzaG91bGQgYmUgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhlIAotICogICAgICAgICAgICBmdW5jdGlvbjogIHNsaWNlSUQgLSB0aGUgbnVtYmVyIG9mIHRoZSBzbGljZSB0aGUgdG8gd2hpY2ggdGhlIAotICogICAgICAgICAgICBjdXJyZW50IE1CIGJlbG9uZ3MuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0Q29zdCAtIFBvaW50ZXIgdG8gdGhlIG1pbmltdW0gbW90aW9uIGNvc3QgZm9yIHRoZSBjdXJyZW50IE1CLiAKLSAqICAgcERzdEJsb2NrU0FEIC0gUG9pbnRlciB0byB0aGUgYXJyYXkgb2YgU0FEcyBmb3IgZWFjaCBvZiB0aGUgc2l4dGVlbiBsdW1hIAotICogICAgICAgICAgICA0eDQgYmxvY2tzIGluIGVhY2ggTUIuICBUaGUgYmxvY2sgU0FEcyBhcmUgaW4gc2NhbiBvcmRlciBmb3IgCi0gKiAgICAgICAgICAgIGVhY2ggTUIuICBGb3IgaW1wbGVtZW50YXRpb25zIHRoYXQgY2Fubm90IGNvbXB1dGUgdGhlIFNBRCB2YWx1ZXMgCi0gKiAgICAgICAgICAgIGluZGl2aWR1YWxseSwgdGhlIG1heGltdW0gcG9zc2libGUgdmFsdWUgKDB4ZmZmZikgaXMgcmV0dXJuZWQgCi0gKiAgICAgICAgICAgIGZvciBlYWNoIG9mIHRoZSAxNiBibG9jayBTQUQgZW50cmllcy4gCi0gKiAgIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIHVwZGF0ZWQgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgTUIgYWZ0ZXIgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLiAgVGhlIAotICogICAgICAgICAgICBmb2xsb3dpbmcgZmllbGRzIGFyZSB1cGRhdGVkIGJ5IHRoZSBNRSBmdW5jdGlvbi4gICBUaGUgZm9sbG93aW5nIAotICogICAgICAgICAgICBwYXJhbWV0ZXIgc2V0IHF1YW50aWZpZXMgdGhlIE1CLWxldmVsIE1FIHNlYXJjaCByZXN1bHRzOiBNYlR5cGUgCi0gKiAgICAgICAgICAgIHN1Yk1CVHlwZVs0XSBwTVYwWzRdWzRdIHBNVlByZWRbNF1bNF0gcFJlZkwwSWR4WzRdIAotICogICAgICAgICAgICBJbnRyYTE2eDE2UHJlZE1vZGUgcEludHJhNHg0UHJlZE1vZGVbNF1bNF0gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICBPbmUgb2YgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNDdXJyQnVmLCAKLSAqICAgICAgICAgICBwU3JjUmVmQnVmTGlzdCwgcFNyY1JlY0J1ZiwgcFJlZlJlY3QsIHBDdXJyUG9pbnRQb3MsIHBNRVNwZWMsIAotICogICAgICAgICAgIHBNQkludGVyLCBwTUJJbnRyYSxwU3JjRHN0TUJDdXJyLCBwRHN0Q29zdCwgcFNyY1JlZkJ1Zkxpc3RbMF0gCi0gKiAgICAtICAgIFNyY1JlZlN0ZXAsIFNyY1JlY1N0ZXAgYXJlIG5vdCBtdWx0aXBsZXMgb2YgMTYgCi0gKiAgICAtICAgIGlCbG9ja1dpZHRoIG9yIGlCbG9ja0hlaWdodCBhcmUgdmFsdWVzIG90aGVyIHRoYW4gNCwgOCwgb3IgMTYuIAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi0gCi1PTVhSZXN1bHQgb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIoICAgICAgICAgICAgICAgICAgICAKLSAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQlPTVhfUzMyIFNyY0N1cnJTdGVwLCAKLQljb25zdCBPTVhfVTggKnBTcmNSZWZCdWZMaXN0W0FSTV9WQ000UDEwX01BWF9GUkFNRVNdLAotCU9NWF9TMzIgU3JjUmVmU3RlcCwKLQljb25zdCBPTVhfVTggKnBTcmNSZWNCdWYsIAotCU9NWF9TMzIgU3JjUmVjU3RlcCwKLQljb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLQljb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotCU9NWF9VMzIgTGFtYmRhLAotCXZvaWQgKnBNRVNwZWMsCi0JY29uc3QgT01YVkNNNFAxME1CSW5mb1B0ciAqcE1CSW50ZXIsIAotCWNvbnN0IE9NWFZDTTRQMTBNQkluZm9QdHIgKnBNQkludHJhLAotICAgIE9NWFZDTTRQMTBNQkluZm8gKnBTcmNEc3RNQkN1cnIsCi0JT01YX0lOVCAqcERzdENvc3QsCi0gICAgT01YX1UxNiAqcERzdEJsb2NrU0FEKQotewotICAgIE9NWF9VMzIgICAgIENvc3QsIGksIEludHJhRmxhZyA9IDE7Ci0gICAgT01YVkNNNFAxME1FUGFyYW1zICAqcE1FUGFyYW1zOyAKLQotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmNDdXJyQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWZCdWZMaXN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWNCdWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocFJlZlJlY3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocEN1cnJQb2ludFBvcyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwTUVTcGVjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBNQkludGVyID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBNQkludHJhID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3RNQkN1cnIgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdENvc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoU3JjUmVmU3RlcCA8PSAwIHx8IFNyY1JlZlN0ZXAgJiAxNSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoU3JjUmVjU3RlcCA8PSAwIHx8IFNyY1JlY1N0ZXAgJiAxNSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoU3JjQ3VyclN0ZXAgPD0gMCB8fCBTcmNDdXJyU3RlcCAmIDE1LCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICAKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBTcmNDdXJyQnVmKSwgT01YX1N0c19CYWRBcmdFcnIpICAgIAotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocFNyY1JlY0J1ZiksIE9NWF9TdHNfQmFkQXJnRXJyKQotCi0gICAgZm9yIChpID0gMDsgaSA8IEFSTV9WQ000UDEwX01BWF9GUkFNRVM7IGkrKykKLSAgICB7Ci0gICAgICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWZCdWZMaXN0IFtpXSAhPSBOVUxMICYmCi0gICAgICAgICAgICBhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBTcmNSZWZCdWZMaXN0IFtpXSksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgICAgICAgICAgCi0gICAgICAgIC8qIENoZWNrIGlmIGN1cnJlbnQgTUIgbmVlZHMgSU5URVIgY29zdCBjYWxjdWxhdGlvbnMgKi8KLSAgICAgICAgaWYgKHBTcmNSZWZCdWZMaXN0IFtpXSAhPSBOVUxMICYmIEludHJhRmxhZyA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBJbnRyYUZsYWcgPSAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgKnBEc3RDb3N0ID0gQVJNX1ZDTTRQMTBfTUFYX0NPU1Q7Ci0gICAgLyoKLSAgICAgKiBJbnRlciBjb3N0IGNhbGN1bGF0aW9ucyAKLSAgICAgKi8KLQotICAgICAvKiBjaGVjayB0aGlzIE1CIGNhbiBiZSBJbnRlciAqLwotICAgIGlmIChJbnRyYUZsYWcgIT0gMSkKLSAgICB7Ci0gICAgICAgICBhcm1WQ000UDEwX0ludGVyTUVNQigKLSAgICAgICAgICAgICBwU3JjQ3VyckJ1ZiwgICAKLSAgICAgICAgICAgICBTcmNDdXJyU3RlcCwKLSAgICAgICAgICAgICBwU3JjUmVmQnVmTGlzdCwgICAKLSAgICAgICAgICAgICBTcmNSZWZTdGVwLAotICAgICAgICAgICAgIHBSZWZSZWN0LCAgICAKLSAgICAgICAgICAgICBwQ3VyclBvaW50UG9zLAotICAgICAgICAgICAgIExhbWJkYSwKLSAgICAgICAgICAgICBwTUVTcGVjLAotICAgICAgICAgICAgIHBNQkludGVyLAotICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnIsCi0gICAgICAgICAgICAgJkNvc3QKLSAgICAgICAgICAgICApOwotICAgICAgICAKLSAgICAgICAgKnBEc3RDb3N0ID0gQ29zdDsKLSAgICB9ICAgICAKLQotICAgIHBNRVBhcmFtcyA9IChPTVhWQ000UDEwTUVQYXJhbXMgKilwTUVTcGVjOwotICAgIAotICAgIGlmIChwTUVQYXJhbXMtPmludHJhRW5hYmxlNHg0ID09IDEpCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBJbnRyYSA0eDQgY29zdCBjYWxjdWxhdGlvbnMKLSAgICAgICAgICovCi0gICAgICAgIGFybVZDTTRQMTBfSW50cmE0eDRFc3RpbWF0aW9uKAotICAgICAgICAgICAgcFNyY0N1cnJCdWYsICAgCi0gICAgICAgICAgICBTcmNDdXJyU3RlcCwKLSAgICAgICAgICAgIHBTcmNSZWNCdWYsICAgCi0gICAgICAgICAgICBTcmNSZWNTdGVwLAotICAgICAgICAgICAgcE1CSW50cmEsCi0gICAgICAgICAgICBwU3JjRHN0TUJDdXJyLAotICAgICAgICAgICAgJkNvc3QKLSAgICAgICAgICAgICk7Ci0KLSAgICAgICAgaWYgKENvc3QgPD0gKnBEc3RDb3N0KQotICAgICAgICB7Ci0gICAgICAgICAgICAqcERzdENvc3QgPSBDb3N0OwotICAgICAgICAgICAgcFNyY0RzdE1CQ3Vyci0+bWJUeXBlID0gT01YX1ZDX0lOVFJBXzR4NDsKLQotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLQotICAgIC8qCi0gICAgICogQ29zdCBmb3IgSW50cmEgMTZ4MTYgbW9kZQotICAgICAqLwotCi0gICAgYXJtVkNNNFAxMF9JbnRyYTE2eDE2RXN0aW1hdGlvbigKLSAgICAgICAgcFNyY0N1cnJCdWYsICAgCi0gICAgICAgIFNyY0N1cnJTdGVwLAotICAgICAgICBwU3JjUmVjQnVmLCAgIAotICAgICAgICBTcmNSZWNTdGVwLAotICAgICAgICBwQ3VyclBvaW50UG9zLAotICAgICAgICBwTUJJbnRlciwKLSAgICAgICAgcE1CSW50cmEsCi0gICAgICAgIHBTcmNEc3RNQkN1cnIsCi0gICAgICAgICZDb3N0Ci0gICAgICAgICk7Ci0KLSAgICBpZiAoQ29zdCA8PSAqcERzdENvc3QpCi0gICAgewotICAgICAgICAqcERzdENvc3QgPSBDb3N0OwotICAgICAgICBwU3JjRHN0TUJDdXJyLT5tYlR5cGUgPSBPTVhfVkNfSU5UUkFfMTZ4MTY7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBVcGRhdGUgcERzdEJsb2NrU0FEIHRvIG1heCB2YWx1ZQotICAgICAqLwotCWFybVZDTTRQMTBfQ2FsY3VsYXRlQmxvY2tTQUQoCXBTcmNEc3RNQkN1cnIsIAotICAgICAgICBwU3JjQ3VyckJ1ZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgCVNyY0N1cnJTdGVwLCAKLSAgICAJcFNyY1JlZkJ1Zkxpc3QsCi0gICAgCVNyY1JlZlN0ZXAsCi0gICAgCXBTcmNSZWNCdWYsIAotICAgIAlTcmNSZWNTdGVwLAotICAgIAlwUmVmUmVjdCwKLSAgICAJcEN1cnJQb2ludFBvcywKLSAgICAJcE1CSW50ZXIsIAotICAgIAlwTUJJbnRyYSwKLSAgICAJcERzdEJsb2NrU0FEKTsKLQotCi0JcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODUwNzcxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgQ2hyb21hIDh4OCBpbnRyYSBwcmVkaWN0aW9uIG1vZHVsZQotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybSBEQyBzdHlsZSBpbnRyYSBwcmVkaWN0aW9uLCB1cHBlciBibG9jayBoYXMgcHJpb3JpdHkKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwU3JjTGVmdAkJUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGxlZnQgY29lZmZpY2llbnRzOgotICoJCQkJCQkJCXBbeCwgeV0gKHggPSAtMSwgeSA9IDAuLjMpCi0gKiBbaW5dCXBTcmNBYm92ZQkJUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGFib3ZlIGNvZWZmaWNpZW50czoKLSAqCQkJCQkJCQlwW3gseV0gKHggPSAwLi4zLCB5ID0gLTEpCi0gKiBbaW5dCWxlZnRTdGVwCQlTdGVwIG9mIGxlZnQgY29lZmZpY2llbnQgYnVmZmVyCi0gKiBbaW5dCWRzdFN0ZXAJCQlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLSAqIFtpbl0JYXZhaWxhYmlsaXR5CU5laWdoYm9yaW5nIDE2eDE2IE1CIGF2YWlsYWJpbGl0eSBmbGFnCi0gKiBbb3V0XQlwRHN0CQkJUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogTm9uZQotICovCi0KLXN0YXRpYyB2b2lkIGFybVZDTTRQMTBfUHJlZGljdEludHJhRENVcDR4NCgKLSAgICAgY29uc3QgT01YX1U4KiBwU3JjTGVmdCwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCi0gICAgIE9NWF9VOCogcERzdCwKLSAgICAgT01YX0lOVCBsZWZ0U3RlcCwKLSAgICAgT01YX0lOVCBkc3RTdGVwLAotICAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eSAgICAgICAgCi0pCi17Ci0gICAgaW50IHgsIHksIFN1bT0wLCBDb3VudCA9IDA7Ci0KLSAgICBpZiAoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKQotICAgIHsKLSAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdW0gKz0gcFNyY0Fib3ZlW3hdOwotICAgICAgICB9Ci0gICAgICAgIENvdW50Kys7Ci0gICAgfQotICAgIGVsc2UgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUKQotICAgIHsKLSAgICAgICAgZm9yICh5PTA7IHk8NDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdW0gKz0gcFNyY0xlZnRbeSpsZWZ0U3RlcF07Ci0gICAgICAgIH0KLSAgICAgICAgQ291bnQrKzsKLSAgICB9Ci0gICAgaWYgKENvdW50PT0wKQotICAgIHsKLSAgICAgICAgU3VtID0gMTI4OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBTdW0gPSAoU3VtICsgMikgPj4gMjsKLSAgICB9Ci0gICAgZm9yICh5PTA7IHk8NDsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IChPTVhfVTgpU3VtOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtIERDIHN0eWxlIGludHJhIHByZWRpY3Rpb24sIGxlZnQgYmxvY2sgaGFzIHByaW9yaXR5Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyY0xlZnQJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBsZWZ0IGNvZWZmaWNpZW50czoKLSAqCQkJCQkJCQlwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKQotICogW2luXQlwU3JjQWJvdmUJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBhYm92ZSBjb2VmZmljaWVudHM6Ci0gKgkJCQkJCQkJcFt4LHldICh4ID0gMC4uMywgeSA9IC0xKQotICogW2luXQlsZWZ0U3RlcAkJU3RlcCBvZiBsZWZ0IGNvZWZmaWNpZW50IGJ1ZmZlcgotICogW2luXQlkc3RTdGVwCQkJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCi0gKiBbaW5dCWF2YWlsYWJpbGl0eQlOZWlnaGJvcmluZyAxNngxNiBNQiBhdmFpbGFiaWxpdHkgZmxhZwotICogW291dF0JcERzdAkJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE5vbmUKLSAqLwotCi1zdGF0aWMgdm9pZCBhcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDTGVmdDR4NCgKLSAgICAgY29uc3QgT01YX1U4KiBwU3JjTGVmdCwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCi0gICAgIE9NWF9VOCogcERzdCwKLSAgICAgT01YX0lOVCBsZWZ0U3RlcCwKLSAgICAgT01YX0lOVCBkc3RTdGVwLAotICAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eSAgICAgICAgCi0pCi17Ci0gICAgaW50IHgsIHksIFN1bT0wLCBDb3VudCA9IDA7Ci0KLSAgICBpZiAoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpCi0gICAgewotICAgICAgICBmb3IgKHk9MDsgeTw0OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN1bSArPSBwU3JjTGVmdFt5KmxlZnRTdGVwXTsKLSAgICAgICAgfQotICAgICAgICBDb3VudCsrOwotICAgIH0KLSAgICBlbHNlIGlmIChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpCi0gICAgewotICAgICAgICBmb3IgKHg9MDsgeDw0OyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN1bSArPSBwU3JjQWJvdmVbeF07Ci0gICAgICAgIH0KLSAgICAgICAgQ291bnQrKzsKLSAgICB9Ci0gICAgaWYgKENvdW50PT0wKQotICAgIHsKLSAgICAgICAgU3VtID0gMTI4OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBTdW0gPSAoU3VtICsgMikgPj4gMjsKLSAgICB9Ci0gICAgZm9yICh5PTA7IHk8NDsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IChPTVhfVTgpU3VtOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4ICAgKDYuMy4zLjEuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGludHJhIHByZWRpY3Rpb24gZm9yIGNocm9tYSBzYW1wbGVzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA4IGxlZnQgcGl4ZWxzOiBwW3gsIHldICh4ID0gLTEsIHk9IAotICogICAgICAgICAgICAwLi43KS4gCi0gKiAgIHBTcmNBYm92ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA4IGFib3ZlIHBpeGVsczogcFt4LHldICh4ID0gMC4uNywgeSAKLSAqICAgICAgICAgICAgPSAtMSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwU3JjQWJvdmVMZWZ0IC0gUG9pbnRlciB0byB0aGUgYWJvdmUgbGVmdCBwaXhlbHM6IHBbeCx5XSAoeCA9IC0xLCB5ID0gLTEpIAotICogICBsZWZ0U3RlcCAtIFN0ZXAgb2YgbGVmdCBwaXhlbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKLSAqICAgZHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBwcmVkTW9kZSAtIEludHJhIGNocm9tYSBwcmVkaWN0aW9uIG1vZGUsIHBsZWFzZSByZWZlciB0byBzZWN0aW9uIDMuNC4zLiAKLSAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgY2hyb21hIGJsb2NrIGF2YWlsYWJpbGl0eSBmbGFnLCBwbGVhc2UgcmVmZXIgCi0gKiAgICAgICAgICAgIHRvICAiTmVpZ2hib3JpbmcgTWFjcm9ibG9jayBBdmFpbGFiaWxpdHkiLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIHBEc3QgaXMgTlVMTC4gCi0gKiAgICBkc3RTdGVwIDwgOCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAotICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ19DSFJPTUFfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uNykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi43KSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ19DSFJPTUFfUExBTkUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCi0gKiAgICAgICAgICAgICAgcFt4LC0xXSh4ID0gMC4uNyksIG9yIHBbLTEseV0gKHkgPSAwLi43KSwgb3IgcFstMSwtMV0gaXMgbm90IAotICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAotICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAgTm90ZTogCi0gKiAgICAgICAgICAgICAgcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlciBpZiAKLSAqICAgICAgICAgICAgICB0aGV5IGFyZSBub3QgdXNlZCBieSBpbnRyYSBwcmVkaWN0aW9uIGltcGxpZWQgaW4gcHJlZE1vZGUuIAotICogICAgICAgICAgICAgICBOb3RlOiBPTVhfVkNfVVBQRVJfUklHSFQgaXMgbm90IHVzZWQgaW4gaW50cmEgY2hyb21hIAotICogICAgICAgICAgICAgIHByZWRpY3Rpb24uIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCgKLSAgICAgY29uc3QgT01YX1U4KiBwU3JjTGVmdCwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlTGVmdCwKLSAgICAgT01YX1U4KiBwRHN0LAotICAgICBPTVhfSU5UIGxlZnRTdGVwLAotICAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgIE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlIHByZWRNb2RlLAotICAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eSAgICAgICAgCi0gKQotewotICAgIGludCB4LCB5LCBTdW07Ci0gICAgaW50IEgsIFYsIGEsIGIsIGM7Ci0KLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihkc3RTdGVwIDwgOCwgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoZHN0U3RlcCAlIDgpICE9IDAsICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGxlZnRTdGVwICUgOCkgIT0gMCwgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0Fib3ZlKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpICAgICAgJiYgcFNyY0Fib3ZlICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUICkgICAgICAmJiBwU3JjTGVmdCAgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSX0xFRlQpICYmIHBTcmNBYm92ZUxlZnQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfQ0hST01BX1ZFUlQgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKSwgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ19DSFJPTUFfSE9SICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCksICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDX0NIUk9NQV9QTEFORSAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUiksICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfQ0hST01BX1BMQU5FICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSX0xFRlQpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ19DSFJPTUFfUExBTkUgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCksICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigodW5zaWduZWQpcHJlZE1vZGUgPiBPTVhfVkNfQ0hST01BX1BMQU5FLCAgIE9NWF9TdHNfQmFkQXJnRXJyKTsgICAgCi0KLSAgICBzd2l0Y2ggKHByZWRNb2RlKQotICAgIHsKLSAgICBjYXNlIE9NWF9WQ19DSFJPTUFfREM6Ci0gICAgICAgIGFybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQoICAgICAgIHBTcmNMZWZ0LCAgICAgICAgICAgIHBTcmNBYm92ZSwgICBwRHN0LCAgICAgICAgICAgICBsZWZ0U3RlcCwgZHN0U3RlcCwgYXZhaWxhYmlsaXR5KTsKLSAgICAgICAgYXJtVkNNNFAxMF9QcmVkaWN0SW50cmFEQ1VwNHg0KCAgICAgcFNyY0xlZnQsICAgICAgICAgICAgcFNyY0Fib3ZlKzQsIHBEc3QrNCwgICAgICAgICAgIGxlZnRTdGVwLCBkc3RTdGVwLCBhdmFpbGFiaWxpdHkpOwotICAgICAgICBhcm1WQ000UDEwX1ByZWRpY3RJbnRyYURDTGVmdDR4NCggICBwU3JjTGVmdCs0KmxlZnRTdGVwLCBwU3JjQWJvdmUsICAgcERzdCs0KmRzdFN0ZXAsICAgbGVmdFN0ZXAsIGRzdFN0ZXAsIGF2YWlsYWJpbGl0eSk7Ci0gICAgICAgIGFybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQoICAgICAgIHBTcmNMZWZ0KzQqbGVmdFN0ZXAsIHBTcmNBYm92ZSs0LCBwRHN0KzQrNCpkc3RTdGVwLCBsZWZ0U3RlcCwgZHN0U3RlcCwgYXZhaWxhYmlsaXR5KTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9NWF9WQ19DSFJPTUFfSE9SOgotICAgICAgICBmb3IgKHk9MDsgeTw4OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoeD0wOyB4PDg7IHgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IHBTcmNMZWZ0W3kqbGVmdFN0ZXBdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPTVhfVkNfQ0hST01BX1ZFUlQ6Ci0gICAgICAgIGZvciAoeT0wOyB5PDg7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICh4PTA7IHg8ODsgeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gcFNyY0Fib3ZlW3hdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPTVhfVkNfQ0hST01BX1BMQU5FOgotICAgICAgICBIID0gNCoocFNyY0Fib3ZlWzddIC0gcFNyY0Fib3ZlTGVmdFswXSk7Ci0gICAgICAgIGZvciAoeD0yOyB4Pj0wOyB4LS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIEggKz0gKHgrMSkqKHBTcmNBYm92ZVs0K3hdIC0gcFNyY0Fib3ZlWzIteF0pOwotICAgICAgICB9Ci0gICAgICAgIFYgPSA0KihwU3JjTGVmdFs3KmxlZnRTdGVwXSAtIHBTcmNBYm92ZUxlZnRbMF0pOwotICAgICAgICBmb3IgKHk9MjsgeT49MDsgeS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBWICs9ICh5KzEpKihwU3JjTGVmdFsoNCt5KSpsZWZ0U3RlcF0gLSBwU3JjTGVmdFsoMi15KSpsZWZ0U3RlcF0pOwotICAgICAgICB9Ci0gICAgICAgIGEgPSAxNioocFNyY0Fib3ZlWzddICsgcFNyY0xlZnRbNypsZWZ0U3RlcF0pOwotICAgICAgICBiID0gKDE3KkgrMTYpPj41OwotICAgICAgICBjID0gKDE3KlYrMTYpPj41OwotICAgICAgICBmb3IgKHk9MDsgeTw4OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoeD0wOyB4PDg7IHgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdW0gPSAoYSArIGIqKHgtMykgKyBjKih5LTMpICsgMTYpPj41OwotICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gKE9NWF9VOClhcm1DbGlwKDAsMjU1LFN1bSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM0NDUyNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBILjI2NCAxNngxNiBpbnRyYSBwcmVkaWN0aW9uIG1vZHVsZQotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2ICAgKDYuMy4zLjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm0gSW50cmFfMTZ4MTYgcHJlZGljdGlvbiBmb3IgbHVtYSBzYW1wbGVzLiBJZiB0aGUgdXBwZXItcmlnaHQgYmxvY2sgCi0gKiBpcyBub3QgYXZhaWxhYmxlLCB0aGVuIGR1cGxpY2F0aW9uIHdvcmsgc2hvdWxkIGJlIGhhbmRsZWQgaW5zaWRlIHRoZSAKLSAqIGZ1bmN0aW9uLiBVc2VycyBuZWVkIG5vdCBkZWZpbmUgdGhlbSBvdXRzaWRlLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBsZWZ0IHBpeGVsczogcFt4LCB5XSAoeCA9IC0xLCB5ID0gCi0gKiAgICAgICAgICAgIDAuLjE1KSAKLSAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDE2IGFib3ZlIHBpeGVsczogcFt4LHldICh4ID0gMC4uMTUsIAotICogICAgICAgICAgICB5PSAtMSk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBwU3JjQWJvdmVMZWZ0IC0gUG9pbnRlciB0byB0aGUgYWJvdmUgbGVmdCBwaXhlbHM6IHBbeCx5XSAoeCA9IC0xLCB5ID0gLTEpIAotICogICBsZWZ0U3RlcCAtIFN0ZXAgb2YgbGVmdCBwaXhlbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHByZWRNb2RlIC0gSW50cmFfMTZ4MTYgcHJlZGljdGlvbiBtb2RlLCBwbGVhc2UgcmVmZXIgdG8gc2VjdGlvbiAzLjQuMS4gCi0gKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIDE2eDE2IE1CIGF2YWlsYWJpbGl0eSBmbGFnLiBSZWZlciB0byAKLSAqICAgICAgICAgICAgICAgICAgc2VjdGlvbiAzLjQuNC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIHBEc3QgaXMgTlVMTC4gCi0gKiAgICBkc3RTdGVwIDwgMTYuIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAotICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKLSAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjE1KSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMTUpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzE2WDE2X1BMQU5FLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAotICogICAgICAgICAgICAgIHBbeCwtMV0oeCA9IDAuLjE1KSwgb3IgcFstMSx5XSAoeSA9IDAuLjE1KSwgb3IgcFstMSwtMV0gaXMgbm90IAotICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAotICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIAotICoKLSAqIE5vdGU6IAotICogICAgIHBTcmNBYm92ZSwgcFNyY0Fib3ZlLCBwU3JjQWJvdmVMZWZ0IG1heSBiZSBpbnZhbGlkIHBvaW50ZXJzIGlmIAotICogICAgIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gaW1wbGllZCBpbiBwcmVkTW9kZS4gCi0gKiBOb3RlOiAKLSAqICAgICBPTVhfVkNfVVBQRVJfUklHSFQgaXMgbm90IHVzZWQgaW4gaW50cmFfMTZ4MTYgbHVtYSBwcmVkaWN0aW9uLiAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNigKLSAgICBjb25zdCBPTVhfVTgqIHBTcmNMZWZ0LCAKLSAgICBjb25zdCBPTVhfVTggKnBTcmNBYm92ZSwgCi0gICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LCAKLSAgICBPTVhfVTgqIHBEc3QsIAotICAgIE9NWF9JTlQgbGVmdFN0ZXAsIAotICAgIE9NWF9JTlQgZHN0U3RlcCwgCi0gICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSBwcmVkTW9kZSwgCi0gICAgT01YX1MzMiBhdmFpbGFiaWxpdHkpCi17Ci0gICAgaW50IHgseSxTdW0sQ291bnQ7Ci0gICAgaW50IEgsVixhLGIsYzsKLQotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGRzdFN0ZXAgPCAxNiwgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoZHN0U3RlcCAlIDE2KSAhPSAwLCAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChsZWZ0U3RlcCAlIDE2KSAhPSAwLCAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocFNyY0Fib3ZlKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDE2Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsgICAgICAgIAotICAgIGFybVJldEFyZ0VycklmKChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpICAgICAgJiYgcFNyY0Fib3ZlICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19MRUZUICkgICAgICAmJiBwU3JjTGVmdCAgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSX0xFRlQpICYmIHBTcmNBYm92ZUxlZnQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfMTZYMTZfVkVSVCAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpLCAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzE2WDE2X0hPUiAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpLCAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ18xNlgxNl9QTEFORSAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUiksICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfMTZYMTZfUExBTkUgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfTEVGVCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzE2WDE2X1BMQU5FICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpLCAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKHVuc2lnbmVkKXByZWRNb2RlID4gT01YX1ZDXzE2WDE2X1BMQU5FLCAgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgc3dpdGNoIChwcmVkTW9kZSkKLSAgICB7Ci0gICAgY2FzZSBPTVhfVkNfMTZYMTZfVkVSVDoKLSAgICAgICAgZm9yICh5PTA7IHk8MTY7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICh4PTA7IHg8MTY7IHgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IHBTcmNBYm92ZVt4XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgT01YX1ZDXzE2WDE2X0hPUjoKLSAgICAgICAgZm9yICh5PTA7IHk8MTY7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICh4PTA7IHg8MTY7IHgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IHBTcmNMZWZ0W3kqbGVmdFN0ZXBdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPTVhfVkNfMTZYMTZfREM6Ci0gICAgICAgIC8qIFRoaXMgY2FuIGFsd2F5cyBiZSB1c2VkIGV2ZW4gaWYgbm8gYmxvY2tzIGF2YWlsYWJsZSAqLwotICAgICAgICBTdW0gPSAwOwotICAgICAgICBDb3VudCA9IDA7Ci0gICAgICAgIGlmIChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICh5PTA7IHk8MTY7IHkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdW0gKz0gcFNyY0xlZnRbeSpsZWZ0U3RlcF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb3VudCsrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoeD0wOyB4PDE2OyB4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3VtICs9IHBTcmNBYm92ZVt4XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvdW50Kys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKENvdW50PT0wKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdW0gPSAxMjg7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoQ291bnQ9PTEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN1bSA9IChTdW0gKyA4KSA+PiA0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyogQ291bnQgPSAyICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN1bSA9IChTdW0gKyAxNikgPj4gNTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHk9MDsgeTwxNjsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHg9MDsgeDwxNjsgeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gKE9NWF9VOClTdW07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9NWF9WQ18xNlgxNl9QTEFORToKLSAgICAgICAgSCA9IDgqKHBTcmNBYm92ZVsxNV0gLSBwU3JjQWJvdmVMZWZ0WzBdKTsKLSAgICAgICAgZm9yICh4PTY7IHg+PTA7IHgtLSkKLSAgICAgICAgewotICAgICAgICAgICAgSCArPSAoeCsxKSoocFNyY0Fib3ZlWzgreF0gLSBwU3JjQWJvdmVbNi14XSk7Ci0gICAgICAgIH0KLSAgICAgICAgViA9IDgqKHBTcmNMZWZ0WzE1KmxlZnRTdGVwXSAtIHBTcmNBYm92ZUxlZnRbMF0pOwotICAgICAgICBmb3IgKHk9NjsgeT49MDsgeS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBWICs9ICh5KzEpKihwU3JjTGVmdFsoOCt5KSpsZWZ0U3RlcF0gLSBwU3JjTGVmdFsoNi15KSpsZWZ0U3RlcF0pOwotICAgICAgICB9Ci0gICAgICAgIGEgPSAxNioocFNyY0Fib3ZlWzE1XSArIHBTcmNMZWZ0WzE1KmxlZnRTdGVwXSk7Ci0gICAgICAgIGIgPSAoNSpIKzMyKT4+NjsKLSAgICAgICAgYyA9ICg1KlYrMzIpPj42OwotICAgICAgICBmb3IgKHk9MDsgeTwxNjsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHg9MDsgeDwxNjsgeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN1bSA9IChhICsgYiooeC03KSArIGMqKHktNykgKyAxNik+PjU7Ci0gICAgICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXAreF0gPSAoT01YX1U4KWFybUNsaXAoMCwyNTUsU3VtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRjMjVmNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQuYworKysgL2Rldi9udWxsCkBAIC0xLDM1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IDR4NCBpbnRyYSBwcmVkaWN0aW9uIG1vZHVsZQotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCAgICg2LjMuMy4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtIEludHJhXzR4NCBwcmVkaWN0aW9uIGZvciBsdW1hIHNhbXBsZXMuIElmIHRoZSB1cHBlci1yaWdodCBibG9jayBpcyAKLSAqIG5vdCBhdmFpbGFibGUsIHRoZW4gZHVwbGljYXRpb24gd29yayBzaG91bGQgYmUgaGFuZGxlZCBpbnNpZGUgdGhlIGZ1bmN0aW9uLiAKLSAqIFVzZXJzIG5lZWQgbm90IGRlZmluZSB0aGVtIG91dHNpZGUuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNMZWZ0IC0gIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA0IGxlZnQgcGl4ZWxzOiAKLSAqICAgICAgICAgICAgICAgICAgcFt4LCB5XSAoeCA9IC0xLCB5ID0gMC4uMykgCi0gKiAgIHBTcmNBYm92ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiA4IGFib3ZlIHBpeGVsczogCi0gKiAgICAgICAgICAgICAgICAgIHBbeCx5XSAoeCA9IDAuLjcsIHkgPS0xKTsgCi0gKiAgICAgICAgICAgICAgIG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBTcmNBYm92ZUxlZnQgLSBQb2ludGVyIHRvIHRoZSBhYm92ZSBsZWZ0IHBpeGVsczogcFt4LHldICh4ID0gLTEsIHkgPSAtMSkgCi0gKiAgIGxlZnRTdGVwIC0gU3RlcCBvZiBsZWZ0IHBpeGVsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCi0gKiAgIHByZWRNb2RlIC0gSW50cmFfNHg0IHByZWRpY3Rpb24gbW9kZS4gCi0gKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIDR4NCBibG9jayBhdmFpbGFiaWxpdHkgZmxhZywgcmVmZXIgdG8gCi0gKiAgICAgICAgICAgICAiTmVpZ2hib3JpbmcgTWFjcm9ibG9jayBBdmFpbGFiaWxpdHkiIC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCi0gKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAotICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKLSAqICAgIHBEc3QgaXMgTlVMTC4gCi0gKiAgICBkc3RTdGVwIDwgNCwgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAotICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKLSAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX1VQUEVSIAotICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0RJQUdfREwsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LCAxXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9ESUFHX0RSLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAotICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAotICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKLSAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAotICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKLSAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKLSAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCi0gKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSEQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCi0gKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCi0gKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAotICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCi0gKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZMLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19VUFBFUiAKLSAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKLSAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSFUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCi0gKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCi0gKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAotICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAotICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgCi0gKgotICogTm90ZTogCi0gKiAgICAgcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlcnMgaWYgCi0gKiAgICAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBhcyBpbXBsaWVkIGluIHByZWRNb2RlLiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCgKLSAgICAgY29uc3QgT01YX1U4KiBwU3JjTGVmdCwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlTGVmdCwKLSAgICAgT01YX1U4KiBwRHN0LAotICAgICBPTVhfSU5UIGxlZnRTdGVwLAotICAgICBPTVhfSU5UIGRzdFN0ZXAsCi0gICAgIE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlIHByZWRNb2RlLAotICAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eSAgICAgICAgCi0gKQotewotICAgIGludCB4LCB5OwotICAgIE9NWF9VOCBwVG1wWzEwXTsKLQotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChsZWZ0U3RlcCAlIDQpICE9IDAsICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGRzdFN0ZXAgJSA0KSAhPSAwLCAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChkc3RTdGVwIDwgNCksICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBTcmNBYm92ZSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsgICAgCi0gICAgYXJtUmV0QXJnRXJySWYoKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUikgICAgICAmJiBwU3JjQWJvdmUgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQgKSAgICAgICYmIHBTcmNMZWZ0ICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfTEVGVCkgJiYgcFNyY0Fib3ZlTGVmdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfVkVSVCAgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUiksICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X0hPUiAgICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCksICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9ESUFHX0RMICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSKSwgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfRElBR19EUiAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUiksICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X0RJQUdfRFIgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfTEVGVCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9ESUFHX0RSICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpLCAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfVlIgICAgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUiksICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X1ZSICAgICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfTEVGVCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9WUiAgICAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpLCAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfSEQgICAgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUiksICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X0hEICAgICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfVVBQRVJfTEVGVCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwcmVkTW9kZT09T01YX1ZDXzRYNF9IRCAgICAgICYmICEoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX0xFRlQpLCAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZE1vZGU9PU9NWF9WQ180WDRfVkwgICAgICAmJiAhKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUiksICAgICAgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRNb2RlPT1PTVhfVkNfNFg0X0hVICAgICAgJiYgIShhdmFpbGFiaWxpdHkgJiBPTVhfVkNfTEVGVCksICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigodW5zaWduZWQpcHJlZE1vZGUgPiBPTVhfVkNfNFg0X0hVLCAgIE9NWF9TdHNfQmFkQXJnRXJyKTsgICAgCi0gICAgCi0gICAgLyogTm90ZTogVGhpcyBjb2RlIG11c3Qgbm90IHJlYWQgdGhlIHBTcmMgYXJyYXlzIHVubGVzcyB0aGUgY29ycmVzcG9uZGluZwotICAgICAqIGJsb2NrIGlzIG1hcmtlZCBhcyBhdmFpbGFibGUuIElmIHRoZSBibG9jayBpcyBub3QgYXZhaWJhYmxlIHRoZW4gcFNyYwotICAgICAqIG1heSBub3QgYmUgYSB2YWxpZCBwb2ludGVyLgotICAgICAqCi0gICAgICogTm90ZTogVG8gbWFrZSB0aGUgY29kZSBtb3JlIHJlYWRhYmxlIHdlIHJlZmVyIHRvIHRoZSBuZWlnaGJvdXJpbmcgcGl4ZWxzCi0gICAgICogaW4gdmFyaWFibGVzIG5hbWVkIGFzIGJlbG93OgotICAgICAqCi0gICAgICogICAgVUwgVTAgVTEgVTIgVTMgVTQgVTUgVTYgVTcKLSAgICAgKiAgICBMMCB4eCB4eCB4eCB4eAotICAgICAqICAgIEwxIHh4IHh4IHh4IHh4Ci0gICAgICogICAgTDIgeHggeHggeHggeHgKLSAgICAgKiAgICBMMyB4eCB4eCB4eCB4eAotICAgICAqLwotICAgICAKLSNkZWZpbmUgVUwgcFNyY0Fib3ZlTGVmdFswXQotI2RlZmluZSBVMCBwU3JjQWJvdmVbMF0KLSNkZWZpbmUgVTEgcFNyY0Fib3ZlWzFdCi0jZGVmaW5lIFUyIHBTcmNBYm92ZVsyXQotI2RlZmluZSBVMyBwU3JjQWJvdmVbM10KLSNkZWZpbmUgVTQgcFNyY0Fib3ZlWzRdCi0jZGVmaW5lIFU1IHBTcmNBYm92ZVs1XQotI2RlZmluZSBVNiBwU3JjQWJvdmVbNl0KLSNkZWZpbmUgVTcgcFNyY0Fib3ZlWzddCi0jZGVmaW5lIEwwIHBTcmNMZWZ0WzAqbGVmdFN0ZXBdCi0jZGVmaW5lIEwxIHBTcmNMZWZ0WzEqbGVmdFN0ZXBdCi0jZGVmaW5lIEwyIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCi0jZGVmaW5lIEwzIHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCi0KLSAgICBzd2l0Y2ggKHByZWRNb2RlKQotICAgIHsKLSAgICBjYXNlIE9NWF9WQ180WDRfVkVSVDoKLSAgICAgICAgZm9yICh5PTA7IHk8NDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCswXSA9IFUwOwotICAgICAgICAgICAgcERzdFt5KmRzdFN0ZXArMV0gPSBVMTsKLSAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwKzJdID0gVTI7Ci0gICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCszXSA9IFUzOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPTVhfVkNfNFg0X0hPUjoKLSAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0WzAqZHN0U3RlcCt4XSA9IEwwOwotICAgICAgICAgICAgcERzdFsxKmRzdFN0ZXAreF0gPSBMMTsKLSAgICAgICAgICAgIHBEc3RbMipkc3RTdGVwK3hdID0gTDI7Ci0gICAgICAgICAgICBwRHN0WzMqZHN0U3RlcCt4XSA9IEwzOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIAotICAgIGNhc2UgT01YX1ZDXzRYNF9EQzoKLSAgICAgICAgLyogVGhpcyBjYW4gYWx3YXlzIGJlIHVzZWQgZXZlbiBpZiBubyBibG9ja3MgYXZhaWxhYmxlICovCi0gICAgICAgIGFybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQocFNyY0xlZnQsIHBTcmNBYm92ZSwgcERzdCwgbGVmdFN0ZXAsIGRzdFN0ZXAsIGF2YWlsYWJpbGl0eSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgICAKLSAgICBjYXNlIE9NWF9WQ180WDRfRElBR19ETDoKLSAgICAgICAgcFRtcFswXSA9IChPTVhfVTgpKChVMCArIDIqVTEgKyBVMiArIDIpPj4yKTsKLSAgICAgICAgcFRtcFsxXSA9IChPTVhfVTgpKChVMSArIDIqVTIgKyBVMyArIDIpPj4yKTsKLSAgICAgICAgaWYgKGF2YWlsYWJpbGl0eSAmIE9NWF9WQ19VUFBFUl9SSUdIVCkKLSAgICAgICAgewotICAgICAgICAgICAgcFRtcFsyXSA9IChPTVhfVTgpKChVMiArIDIqVTMgKyBVNCArIDIpPj4yKTsKLSAgICAgICAgICAgIHBUbXBbM10gPSAoT01YX1U4KSgoVTMgKyAyKlU0ICsgVTUgKyAyKT4+Mik7Ci0gICAgICAgICAgICBwVG1wWzRdID0gKE9NWF9VOCkoKFU0ICsgMipVNSArIFU2ICsgMik+PjIpOwotICAgICAgICAgICAgcFRtcFs1XSA9IChPTVhfVTgpKChVNSArIDIqVTYgKyBVNyArIDIpPj4yKTsKLSAgICAgICAgICAgIHBUbXBbNl0gPSAoT01YX1U4KSgoVTYgKyAzKlU3ICAgICAgKyAyKT4+Mik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwVG1wWzJdID0gKE9NWF9VOCkoKFUyICsgMypVMyAgICAgICsgMik+PjIpOwotICAgICAgICAgICAgcFRtcFszXSA9IFUzOwotICAgICAgICAgICAgcFRtcFs0XSA9IFUzOwotICAgICAgICAgICAgcFRtcFs1XSA9IFUzOwotICAgICAgICAgICAgcFRtcFs2XSA9IFUzOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gcFRtcFt4K3ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPTVhfVkNfNFg0X0RJQUdfRFI6ICAgICAgICAKLSAgICAgICAgLyogeC15ID0gLTMsIC0yLCAtMSwgMCwgMSwgMiwgMyAqLwotICAgICAgICBwVG1wWzBdID0gKE9NWF9VOCkoKEwxICsgMipMMiArIEwzICsgMik+PjIpOwotICAgICAgICBwVG1wWzFdID0gKE9NWF9VOCkoKEwwICsgMipMMSArIEwyICsgMik+PjIpOwotICAgICAgICBwVG1wWzJdID0gKE9NWF9VOCkoKFVMICsgMipMMCArIEwxICsgMik+PjIpOwotICAgICAgICBwVG1wWzNdID0gKE9NWF9VOCkoKFUwICsgMipVTCArIEwwICsgMik+PjIpOwotICAgICAgICBwVG1wWzRdID0gKE9NWF9VOCkoKFUxICsgMipVMCArIFVMICsgMik+PjIpOwotICAgICAgICBwVG1wWzVdID0gKE9NWF9VOCkoKFUyICsgMipVMSArIFUwICsgMik+PjIpOwotICAgICAgICBwVG1wWzZdID0gKE9NWF9VOCkoKFUzICsgMipVMiArIFUxICsgMik+PjIpOwotICAgICAgICBmb3IgKHk9MDsgeTw0OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IHBUbXBbMyt4LXldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPTVhfVkNfNFg0X1ZSOgotICAgICAgICAvKiB6VlI9MngteSA9IC0zLCAtMiwgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYKLSAgICAgICAgICogeC0oeT4+MSkgPSAtMSwgLTEsICAwLCAwLCAxLCAxLCAyLCAyLCAzLCAzCi0gICAgICAgICAqIHkgICAgICAgID0gIDMsICAyLCAgPywgPywgPywgPywgPywgPywgMSwgMAotICAgICAgICAgKi8KLSAgICAgICAgcFRtcFswXSA9IChPTVhfVTgpKChMMiArIDIqTDEgKyBMMCArIDIpPj4yKTsKLSAgICAgICAgcFRtcFsxXSA9IChPTVhfVTgpKChMMSArIDIqTDAgKyBVTCArIDIpPj4yKTsKLSAgICAgICAgcFRtcFsyXSA9IChPTVhfVTgpKChMMCArIDIqVUwgKyBVMCArIDIpPj4yKTsKLSAgICAgICAgcFRtcFszXSA9IChPTVhfVTgpKChVTCArIFUwICsgMSk+PjEpOwotICAgICAgICBwVG1wWzRdID0gKE9NWF9VOCkoKFVMICsgMipVMCArIFUxICsgMik+PjIpOwotICAgICAgICBwVG1wWzVdID0gKE9NWF9VOCkoKFUwICsgVTEgKyAxKT4+MSk7Ci0gICAgICAgIHBUbXBbNl0gPSAoT01YX1U4KSgoVTAgKyAyKlUxICsgVTIgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbN10gPSAoT01YX1U4KSgoVTEgKyBVMiArIDEpPj4xKTsKLSAgICAgICAgcFRtcFs4XSA9IChPTVhfVTgpKChVMSArIDIqVTIgKyBVMyArIDIpPj4yKTsKLSAgICAgICAgcFRtcFs5XSA9IChPTVhfVTgpKChVMiArIFUzICsgMSk+PjEpOwotICAgICAgICBmb3IgKHk9MDsgeTw0OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IHBUbXBbMysyKngteV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9NWF9WQ180WDRfSEQ6Ci0gICAgICAgIC8qIHpIRD0yeS14ID0gLTMgLTIgLTEgIDAgIDEgIDIgIDMgIDQgIDUgIDYKLSAgICAgICAgICogeS0oeD4+MSkgPSAtMSAtMSAgMCAgMCAgMSAgMSAgMiAgMiAgMyAgMwotICAgICAgICAgKiB4ICAgICAgICA9ICAzICAyICAgICAgICAgICAgICAgICAgICAxICAwCi0gICAgICAgICAqLwotICAgICAgICBwVG1wWzBdID0gKE9NWF9VOCkoKFUyICsgMipVMSArIFUwICsgMik+PjIpOwotICAgICAgICBwVG1wWzFdID0gKE9NWF9VOCkoKFUxICsgMipVMCArIFVMICsgMik+PjIpOwotICAgICAgICBwVG1wWzJdID0gKE9NWF9VOCkoKFUwICsgMipVTCArIEwwICsgMik+PjIpOwotICAgICAgICBwVG1wWzNdID0gKE9NWF9VOCkoKFVMICsgTDAgKyAxKT4+MSk7Ci0gICAgICAgIHBUbXBbNF0gPSAoT01YX1U4KSgoVUwgKyAyKkwwICsgTDEgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbNV0gPSAoT01YX1U4KSgoTDAgKyBMMSArIDEpPj4xKTsKLSAgICAgICAgcFRtcFs2XSA9IChPTVhfVTgpKChMMCArIDIqTDEgKyBMMiArIDIpPj4yKTsKLSAgICAgICAgcFRtcFs3XSA9IChPTVhfVTgpKChMMSArIEwyICsgMSk+PjEpOwotICAgICAgICBwVG1wWzhdID0gKE9NWF9VOCkoKEwxICsgMipMMiArIEwzICsgMik+PjIpOwotICAgICAgICBwVG1wWzldID0gKE9NWF9VOCkoKEwyICsgTDMgKyAxKT4+MSk7Ci0gICAgICAgIGZvciAoeT0wOyB5PDQ7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICh4PTA7IHg8NDsgeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBEc3RbeSpkc3RTdGVwK3hdID0gcFRtcFszKzIqeS14XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgT01YX1ZDXzRYNF9WTDoKLSAgICAgICAgLyogTm90ZTogeCsoeT4+MSkgPSAoMip4K3kpPj4xCi0gICAgICAgICAqIDJ4K3kgPSAwIDEgMiAzIDQgNSA2IDcgOCA5Ci0gICAgICAgICAqLwotICAgICAgICBwVG1wWzBdID0gKE9NWF9VOCkoKFUwICsgVTEgKyAxKT4+MSk7Ci0gICAgICAgIHBUbXBbMV0gPSAoT01YX1U4KSgoVTAgKyAyKlUxICsgVTIgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbMl0gPSAoT01YX1U4KSgoVTEgKyBVMiArIDEpPj4xKTsKLSAgICAgICAgcFRtcFszXSA9IChPTVhfVTgpKChVMSArIDIqVTIgKyBVMyArIDIpPj4yKTsKLSAgICAgICAgcFRtcFs0XSA9IChPTVhfVTgpKChVMiArIFUzICsgMSk+PjEpOwotICAgICAgICBpZiAoYXZhaWxhYmlsaXR5ICYgT01YX1ZDX1VQUEVSX1JJR0hUKQotICAgICAgICB7Ci0gICAgICAgICAgICBwVG1wWzVdID0gKE9NWF9VOCkoKFUyICsgMipVMyArIFU0ICsgMik+PjIpOwotICAgICAgICAgICAgcFRtcFs2XSA9IChPTVhfVTgpKChVMyArIFU0ICsgMSk+PjEpOwotICAgICAgICAgICAgcFRtcFs3XSA9IChPTVhfVTgpKChVMyArIDIqVTQgKyBVNSArIDIpPj4yKTsKLSAgICAgICAgICAgIHBUbXBbOF0gPSAoT01YX1U4KSgoVTQgKyBVNSArIDEpPj4xKTsKLSAgICAgICAgICAgIHBUbXBbOV0gPSAoT01YX1U4KSgoVTQgKyAyKlU1ICsgVTYgKyAyKT4+Mik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwVG1wWzVdID0gKE9NWF9VOCkoKFUyICsgMypVMyArIDIpPj4yKTsKLSAgICAgICAgICAgIHBUbXBbNl0gPSBVMzsKLSAgICAgICAgICAgIHBUbXBbN10gPSBVMzsKLSAgICAgICAgICAgIHBUbXBbOF0gPSBVMzsKLSAgICAgICAgICAgIHBUbXBbOV0gPSBVMzsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHk9MDsgeTw0OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IHBUbXBbMip4K3ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPTVhfVkNfNFg0X0hVOgotICAgICAgICAvKiB6SFUgPSB4KzIqeSAqLwotICAgICAgICBwVG1wWzBdID0gKE9NWF9VOCkoKEwwICsgTDEgKyAxKT4+MSk7Ci0gICAgICAgIHBUbXBbMV0gPSAoT01YX1U4KSgoTDAgKyAyKkwxICsgTDIgKyAyKT4+Mik7Ci0gICAgICAgIHBUbXBbMl0gPSAoT01YX1U4KSgoTDEgKyBMMiArIDEpPj4xKTsKLSAgICAgICAgcFRtcFszXSA9IChPTVhfVTgpKChMMSArIDIqTDIgKyBMMyArIDIpPj4yKTsKLSAgICAgICAgcFRtcFs0XSA9IChPTVhfVTgpKChMMiArIEwzICsgMSk+PjEpOwotICAgICAgICBwVG1wWzVdID0gKE9NWF9VOCkoKEwyICsgMypMMyArIDIpPj4yKTsKLSAgICAgICAgcFRtcFs2XSA9IEwzOwotICAgICAgICBwVG1wWzddID0gTDM7Ci0gICAgICAgIHBUbXBbOF0gPSBMMzsKLSAgICAgICAgcFRtcFs5XSA9IEwzOwotICAgICAgICBmb3IgKHk9MDsgeTw0OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoeD0wOyB4PDQ7IHgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwRHN0W3kqZHN0U3RlcCt4XSA9IHBUbXBbeCsyKnldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzE2eC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzE2eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDBhNzg1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl8xNnguYworKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9TQURRdWFyXzE2eC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgU0FEIG9mIHBTcmMgd2l0aCBhdmVyYWdlIG9mIHR3byBSZWYgYmxvY2tzCi0gKiBvZiAxNngxNiBvciAxNng4Ci0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfMTZ4ICAgKDYuMy41LjQuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCi0gKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciAxNngxNiBvciAxNng4IGJsb2Nrcy4gIAotICogUm91bmRpbmcgaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAotICogICAgICAgICAgICBib3VuZGFyeS4gCi0gKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IAotICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAotICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAotICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgOCBvciAxNiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdFNBRCAtUG9pbnRlciBvZiByZXN1bHQgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2LiAKLSAqICAgIC0gICAgT25lIG9mIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmMCwgCi0gKiAgICAgICAgICAgICAgcFNyY1JlZjEsIHBEc3RTQUQuIAotICogICAgLSAgICBpU3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl8xNngoCi0JY29uc3QgT01YX1U4KiAJcFNyYywKLSAgICBjb25zdCBPTVhfVTgqIAlwU3JjUmVmMCwKLQljb25zdCBPTVhfVTgqIAlwU3JjUmVmMSwJCi0gICAgT01YX1UzMiAJaVNyY1N0ZXAsCi0gICAgT01YX1UzMgkJaVJlZlN0ZXAwLAotICAgIE9NWF9VMzIJCWlSZWZTdGVwMSwKLSAgICBPTVhfVTMyKglwRHN0U0FELAotICAgIE9NWF9VMzIgICAgIGlIZWlnaHQKLSkKLXsKLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYwID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWYxID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlIZWlnaHQgIT0gMTYpICYmIChpSGVpZ2h0ICE9IDgpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3QxNkJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaVNyY1N0ZXAgPT0gMCkgfHwgKGlTcmNTdGVwICYgMTUpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICAKLQotICAgIHJldHVybiBhcm1WQ000UDEwX1NBRFF1YXIKLSAgICAgICAgKHBTcmMsIHBTcmNSZWYwLCBwU3JjUmVmMSwgaVNyY1N0ZXAsIAotICAgICAgICBpUmVmU3RlcDAsIGlSZWZTdGVwMSwgcERzdFNBRCwgaUhlaWdodCwgMTYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzR4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfNHguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI2MGQzNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBRFF1YXJfNHguYworKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9TQURRdWFyXzR4LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBTQUQgb2YgcFNyYyB3aXRoIGF2ZXJhZ2Ugb2YgdHdvIFJlZiBibG9ja3MKLSAqIG9mIDR4OCBvciA0eDQgYmxvY2tzCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfNHggICAoNi4zLjUuNC4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKLSAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDR4OCBvciA0eDQgYmxvY2tzLiAgUm91bmRpbmcgCi0gKiBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBwU3JjUmVmMCAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIHBTcmNSZWYxIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBvcmlnaW5hbCBibG9jayBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKLSAqICAgaVJlZlN0ZXAwIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMCAKLSAqICAgaVJlZlN0ZXAxIC0gU3RlcCBvZiByZWZlcmVuY2UgYmxvY2sgMSAKLSAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCi0gKiAgICAtICAgIE9uZSBvZiBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAotICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKLSAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl80eCggCi0JICBjb25zdCBPTVhfVTgqIAlwU3JjLAotICAgICAgY29uc3QgT01YX1U4KiAJcFNyY1JlZjAsCi0JICBjb25zdCBPTVhfVTgqIAlwU3JjUmVmMSwJCi0gICAgICBPTVhfVTMyIAlpU3JjU3RlcCwKLSAgICAgIE9NWF9VMzIJaVJlZlN0ZXAwLAotICAgICAgT01YX1UzMglpUmVmU3RlcDEsCi0gICAgICBPTVhfVTMyKglwRHN0U0FELAotICAgICAgT01YX1UzMiAgIGlIZWlnaHQKLSkKLXsKLSAgICAvKiBjaGVjayBmb3IgYXJndW1lbnQgZXJyb3IgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmMCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZjEgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChpSGVpZ2h0ICE9IDgpICYmIChpSGVpZ2h0ICE9IDQpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGlTcmNTdGVwID09IDApIHx8IChpU3JjU3RlcCAmIDMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgCi0gICAgcmV0dXJuIGFybVZDTTRQMTBfU0FEUXVhcgotICAgICAgICAocFNyYywgcFNyY1JlZjAsIHBTcmNSZWYxLCBpU3JjU3RlcCwgCi0gICAgICAgIGlSZWZTdGVwMCwgaVJlZlN0ZXAxLCBwRHN0U0FELCBpSGVpZ2h0LCA0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEUXVhcl84eC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzh4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjOGNkZjMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURRdWFyXzh4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfU0FEUXVhcl84eC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgU0FEIG9mIHBTcmMgd2l0aCBhdmVyYWdlIG9mIHR3byBSZWYgYmxvY2tzCi0gKiBvZiA4eDE2IG9yIDh4OCBvciA4eDQKLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl84eCAgICg2LjMuNS40LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSBhdmVyYWdlIAotICogb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKSBmb3IgOHgxNiwgOHg4LCBvciA4eDQgYmxvY2tzLiAgCi0gKiBSb3VuZGluZyBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAotICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCi0gKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCi0gKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIGVpdGhlciA0LCA4LCBvciAxNi4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKLSAqICAgIC0gICAgT25lIG9mIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwU3JjUmVmMCwgCi0gKiAgICAgICAgICAgICAgcFNyY1JlZjEsIHBEc3RTQUQuIAotICogICAgLSAgICBpU3JjU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4IAotICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzh4KCAKLQljb25zdCBPTVhfVTgqIAlwU3JjLAotICAgIGNvbnN0IE9NWF9VOCogCXBTcmNSZWYwLAotCWNvbnN0IE9NWF9VOCogCXBTcmNSZWYxLAkKLSAgICBPTVhfVTMyIAlpU3JjU3RlcCwKLSAgICBPTVhfVTMyCQlpUmVmU3RlcDAsCi0gICAgT01YX1UzMgkJaVJlZlN0ZXAxLAotICAgIE9NWF9VMzIqCXBEc3RTQUQsCi0gICAgT01YX1UzMiAgICAgaUhlaWdodAotKQotewotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZjAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZjEgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocERzdFNBRCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoaUhlaWdodCAhPSAxNikgJiYgKGlIZWlnaHQgIT0gOCkgJiYgCi0gICAgICAgIChpSGVpZ2h0ICE9IDQpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpU3JjU3RlcCA9PSAwKSB8fCAoaVNyY1N0ZXAgJiA3KSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgCi0KLSAgICByZXR1cm4gYXJtVkNNNFAxMF9TQURRdWFyCi0gICAgICAgIChwU3JjLCBwU3JjUmVmMCwgcFNyY1JlZjEsIGlTcmNTdGVwLCAKLSAgICAgICAgaVJlZlN0ZXAwLCBpUmVmU3RlcDEsIHBEc3RTQUQsIGlIZWlnaHQsIDgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURfNHguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FEXzR4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMmQ4ZGQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TQURfNHguYworKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1NBRF80eC5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgU0FEIGZvciA0eDggYW5kIDR4NCBibG9ja3MKLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEXzR4ICAgKDYuMy41LjQuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciA0eDggYW5kIDR4NCBibG9ja3MuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNPcmcgLVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKLSAqICAgaVN0ZXBPcmcgLVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAotICogICBwU3JjUmVmIC1Qb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCi0gKiAgIGlTdGVwUmVmIC1TdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAotICogICBpSGVpZ2h0IC1IZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgT25lIG9mIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY09yZywgcFNyY1JlZiwgb3IgcERzdFNBRCAKLSAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCi0gKiAgICAtICAgIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1NBRF80eCgJCi0JY29uc3QgT01YX1U4KiAJcFNyY09yZywKLQlPTVhfVTMyIAlpU3RlcE9yZywKLQljb25zdCBPTVhfVTgqIAlwU3JjUmVmLAotCU9NWF9VMzIgCWlTdGVwUmVmLAotCU9NWF9TMzIqCXBEc3RTQUQsCi0JT01YX1UzMgkJaUhlaWdodAotKQotewotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmNPcmcgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0U0FEID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpSGVpZ2h0ICE9IDgpICYmIChpSGVpZ2h0ICE9IDQpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFNyY09yZyksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpU3RlcE9yZyA9PSAwKSB8fCAoaVN0ZXBPcmcgJiAzKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlTdGVwUmVmID09IDApIHx8IChpU3RlcFJlZiAmIDMpLCBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIHJldHVybiBhcm1WQ0NPTU1fU0FEIAotICAgICAgICAocFNyY09yZywgaVN0ZXBPcmcsIHBTcmNSZWYsIGlTdGVwUmVmLCBwRHN0U0FELCBpSGVpZ2h0LCA0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FURF80eDQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfU0FURF80eDQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY3NDQ5OS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1NBVERfNHg0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfU0FURF80eDQuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIFNBRCBmb3IgNHg0IGJsb2NrcwotICogCi0gKi8KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBVERfNHg0ICAgKDYuMy41LjQuNSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgc3VtIG9mIGFic29sdXRlIHRyYW5zZm9ybSBkaWZmZXJlbmNlcyAoU0FURCkgCi0gKiBmb3IgYSA0eDQgYmxvY2sgYnkgYXBwbHlpbmcgYSBIYWRhbWFyZCB0cmFuc2Zvcm0gdG8gdGhlIGRpZmZlcmVuY2UgYmxvY2sgCi0gKiBhbmQgdGhlbiBjYWxjdWxhdGluZyB0aGUgc3VtIG9mIGFic29sdXRlIGNvZWZmaWNpZW50IHZhbHVlcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY09yZyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJ5IAotICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCi0gKiAgIHBTcmNSZWYgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkgCi0gKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIHRoZSByZXN1bHRpbmcgU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBTcmNPcmcsIHBTcmNSZWYsIG9yIHBEc3RTQUQgZWl0aGVyIHBTcmNPcmcgCi0gKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlTdGVwT3JnIDw9IDAgb3IgaVN0ZXBPcmcgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKLSAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfU0FURF80eDQoIAotCWNvbnN0IE9NWF9VOCoJCXBTcmNPcmcsCi0JT01YX1UzMiAgICAgaVN0ZXBPcmcsICAgICAgICAgICAgICAgICAgICAgICAgIAotCWNvbnN0IE9NWF9VOCoJCXBTcmNSZWYsCi0JT01YX1UzMgkJaVN0ZXBSZWYsCi0JT01YX1UzMiogICAgcERzdFNBRAotKQotewotICAgIE9NWF9JTlQgICAgIGksIGo7Ci0gICAgT01YX1MzMiAgICAgU0FURCA9IDA7Ci0gICAgT01YX1MzMiAgICAgZCBbNF1bNF0sIG0xWzRdWzRdLCBtMls0XVs0XTsKLQotICAgIC8qIGNoZWNrIGZvciBhcmd1bWVudCBlcnJvciAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmNPcmcgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0U0FEID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChpU3RlcE9yZyA9PSAwKSB8fCAoaVN0ZXBPcmcgJiAzKSwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoKGlTdGVwUmVmID09IDApIHx8IChpU3RlcFJlZiAmIDMpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFNyY09yZyksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwU3JjUmVmKSwgT01YX1N0c19CYWRBcmdFcnIpCi0KLSAgICAvKiBDYWxjdWxhdGUgdGhlIGRpZmZlcmVuY2UgKi8KLSAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZCBbal1baV0gPSBwU3JjT3JnIFtqICogaVN0ZXBPcmcgKyBpXSAtIHBTcmNSZWYgW2ogKiBpU3RlcFJlZiArIGldOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogSGFkYW1hcmQgVHJhbnNmb3IgZm9yIDR4NCBibG9jayAqLwotCi0gICAgLyogSG9yaXpvbnRhbCAqLwotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgewotICAgICAgICBtMVtpXVswXSA9IGRbaV1bMF0gKyBkW2ldWzJdOyAvKiBhK2MgKi8KLSAgICAgICAgbTFbaV1bMV0gPSBkW2ldWzFdICsgZFtpXVszXTsgLyogYitkICovCi0gICAgICAgIG0xW2ldWzJdID0gZFtpXVswXSAtIGRbaV1bMl07IC8qIGEtYyAqLwotICAgICAgICBtMVtpXVszXSA9IGRbaV1bMV0gLSBkW2ldWzNdOyAvKiBiLWQgKi8KLQotICAgICAgICBtMltpXVswXSA9IG0xW2ldWzBdICsgbTFbaV1bMV07IC8qIGErYitjK2QgKi8KLSAgICAgICAgbTJbaV1bMV0gPSBtMVtpXVsyXSArIG0xW2ldWzNdOyAvKiBhK2ItYy1kICovCi0gICAgICAgIG0yW2ldWzJdID0gbTFbaV1bMl0gLSBtMVtpXVszXTsgLyogYS1iLWMrZCAqLwotICAgICAgICBtMltpXVszXSA9IG0xW2ldWzBdIC0gbTFbaV1bMV07IC8qIGEtYitjLWQgKi8KLQotICAgIH0KLQotICAgIC8qIFZlcnRpY2FsICovCi0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICB7Ci0gICAgICAgIG0xWzBdW2ldID0gbTJbMF1baV0gKyBtMlsyXVtpXTsKLSAgICAgICAgbTFbMV1baV0gPSBtMlsxXVtpXSArIG0yWzNdW2ldOwotICAgICAgICBtMVsyXVtpXSA9IG0yWzBdW2ldIC0gbTJbMl1baV07Ci0gICAgICAgIG0xWzNdW2ldID0gbTJbMV1baV0gLSBtMlszXVtpXTsKLQotICAgICAgICBtMlswXVtpXSA9IG0xWzBdW2ldICsgbTFbMV1baV07Ci0gICAgICAgIG0yWzFdW2ldID0gbTFbMl1baV0gKyBtMVszXVtpXTsKLSAgICAgICAgbTJbMl1baV0gPSBtMVsyXVtpXSAtIG0xWzNdW2ldOwotICAgICAgICBtMlszXVtpXSA9IG0xWzBdW2ldIC0gbTFbMV1baV07Ci0gICAgfQotICAgIAotICAgIC8qIGNhbGN1bGF0ZSBTQUQgZm9yIFRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cyAqLwotICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBTQVREICs9IGFybUFicyhtMiBbal1baV0pOwotICAgICAgICB9Ci0gICAgfQotICAgICAgICAKLSAgICAqcERzdFNBRCA9IChTQVREICsgMSkgLyAyOwotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxODRkN2MuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1N1YkFuZFRyYW5zZm9ybVFEUVJlc2lkdWFsLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSBTQUQgZm9yIDR4NCBibG9ja3MKLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgICAoNi4zLjUuOC4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBzdWJ0cmFjdHMgdGhlIHByZWRpY3Rpb24gc2lnbmFsIGZyb20gdGhlIG9yaWdpbmFsIHNpZ25hbCB0byAKLSAqIHByb2R1Y2UgdGhlIGRpZmZlcmVuY2Ugc2lnbmFsIGFuZCB0aGVuIHBlcmZvcm1zIGEgNHg0IGludGVnZXIgdHJhbnNmb3JtIGFuZCAKLSAqIHF1YW50aXphdGlvbi4gVGhlIHF1YW50aXplZCB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMgYXJlIHN0b3JlZCBhcyAKLSAqIHBEc3RRdWFudENvZWZmLiBUaGlzIGZ1bmN0aW9uIGNhbiBhbHNvIG91dHB1dCBkZXF1YW50aXplZCBjb2VmZmljaWVudHMgb3IgCi0gKiB1bnF1YW50aXplZCBEQyBjb2VmZmljaWVudHMgb3B0aW9uYWxseSBieSBzZXR0aW5nIHRoZSBwb2ludGVycyAKLSAqIHBEc3REZVF1YW50Q29lZmYsIHBEQ0NvZWZmLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjT3JnIC0gUG9pbnRlciB0byBvcmlnaW5hbCBzaWduYWwuIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBwU3JjUHJlZCAtIFBvaW50ZXIgdG8gcHJlZGljdGlvbiBzaWduYWwuIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpU3JjT3JnU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIHNpZ25hbCBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAKLSAqICAgICAgICAgICAgNC4gCi0gKiAgIGlTcmNQcmVkU3RlcCAtIFN0ZXAgb2YgdGhlIHByZWRpY3Rpb24gc2lnbmFsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIAotICogICAgICAgICAgICBvZiA0LiAKLSAqICAgcE51bUNvZWZmIC1OdW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGFmdGVyIHF1YW50aXphdGlvbi4gSWYgdGhpcyAKLSAqICAgICAgICAgICAgcGFyYW1ldGVyIGlzIG5vdCByZXF1aXJlZCwgaXQgaXMgc2V0IHRvIE5VTEwuIAotICogICBuVGhyZXNoU0FEIC0gWmVyby1ibG9jayBlYXJseSBkZXRlY3Rpb24gdGhyZXNob2xkLiBJZiB0aGlzIHBhcmFtZXRlciBpcyAKLSAqICAgICAgICAgICAgbm90IHJlcXVpcmVkLCBpdCBpcyBzZXQgdG8gMC4gCi0gKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCi0gKiAgIGJJbnRyYSAtIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYW4gSU5UUkEgYmxvY2ssIGVpdGhlciAxLUlOVFJBIG9yIAotICogICAgICAgICAgICAwLUlOVEVSIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0UXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMuICAKLSAqICAgICAgICAgICAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCi0gKiAgIHBEc3REZVF1YW50Q29lZmYgLSBQb2ludGVyIHRvIHRoZSBkZXF1YW50aXplZCB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMgCi0gKiAgICAgICAgICAgIGlmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBlcXVhbCB0byBOVUxMLiAgOC1ieXRlIGFsaWdubWVudCAKLSAqICAgICAgICAgICAgcmVxdWlyZWQuIAotICogICBwRENDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHVucXVhbnRpemVkIERDIGNvZWZmaWNpZW50IGlmIHRoaXMgcGFyYW1ldGVyIAotICogICAgICAgICAgICBpcyBub3QgZXF1YWwgdG8gTlVMTC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgICAgcFNyY09yZywgcFNyY1ByZWQsIHBOdW1Db2VmZiwgcERzdFF1YW50Q29lZmYsIAotICogICAgICAgICAgICBwRHN0RGVRdWFudENvZWZmLCBwRENDb2VmZiAKLSAqICAgIC0gICAgcFNyY09yZyBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKLSAqICAgIC0gICAgcFNyY1ByZWQgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCi0gKiAgICAtICAgIGlTcmNPcmdTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCi0gKiAgICAtICAgIGlTcmNQcmVkU3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAotICogICAgLSAgICBwRHN0UXVhbnRDb2VmZiBvciBwRHN0RGVRdWFudENvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLSBPTVhSZXN1bHQgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCAoCi0JIGNvbnN0IE9NWF9VOCoJCXBTcmNPcmcsCi0JIGNvbnN0IE9NWF9VOCoJCXBTcmNQcmVkLAotCSBPTVhfVTMyCQlpU3JjT3JnU3RlcCwKLQkgT01YX1UzMgkJaVNyY1ByZWRTdGVwLAotCSBPTVhfUzE2KgkgICAgcERzdFF1YW50Q29lZmYsCi0JIE9NWF9TMTYqIAkgICAgcERzdERlUXVhbnRDb2VmZiwKLQkgT01YX1MxNioJICAgIHBEQ0NvZWZmLAotCSBPTVhfUzgqCQlwTnVtQ29lZmYsCi0JIE9NWF9VMzIJCW5UaHJlc2hTQUQsCi0JIE9NWF9VMzIJCWlRUCwKLQkgT01YX1U4CQkgICAgYkludHJhCi0pCi17Ci0gICAgT01YX0lOVCAgICAgaSwgajsKLSAgICBPTVhfUzggICAgICBOdW1Db2VmZiA9IDA7Ci0gICAgT01YX1MxNiAgICAgQnVmWzE2XSwgbVsxNl07Ci0gICAgT01YX1UzMiAgICAgUUJpdHMsIFFQcGVyLCBRUG1vZCwgZjsKLSAgICBPTVhfUzMyICAgICBWYWx1ZSwgTUYsIFRocmVzaERDOwotCi0gICAgLyogY2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY09yZyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLQlhcm1SZXRBcmdFcnJJZihwRHN0RGVRdWFudENvZWZmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotCWFybVJldEFyZ0VycklmKHBOdW1Db2VmZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLQlhcm1SZXRBcmdFcnJJZihwRENDb2VmZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFNyY09yZyksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBTcmNQcmVkID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwU3JjUHJlZCksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKHBEc3RRdWFudENvZWZmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwRHN0UXVhbnRDb2VmZiksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKChwRHN0RGVRdWFudENvZWZmICE9IE5VTEwpICYmIAotCQkJYXJtTm90OEJ5dGVBbGlnbmVkKHBEc3REZVF1YW50Q29lZmYpLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZigoYkludHJhICE9IDApICYmIChiSW50cmEgIT0gMSksIE9NWF9TdHNfQmFkQXJnRXJyKQotICAgIGFybVJldEFyZ0VycklmKGlRUCA+IDUxLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihpU3JjT3JnU3RlcCA9PSAwLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihpU3JjUHJlZFN0ZXAgPT0gMCwgT01YX1N0c19CYWRBcmdFcnIpCi0gICAgYXJtUmV0QXJnRXJySWYoaVNyY09yZ1N0ZXAgJiAzLCBPTVhfU3RzX0JhZEFyZ0VycikKLSAgICBhcm1SZXRBcmdFcnJJZihpU3JjUHJlZFN0ZXAgJiAzLCBPTVhfU3RzX0JhZEFyZ0VycikKLQotICAgIC8qIAotICAgICAqIFplcm8tQmxvY2sgRWFybHkgZGV0ZWN0aW9uIHVzaW5nIG5UaHJlc2hTQUQgcGFyYW0gCi0gICAgICovCi0KLSAgICBRUHBlciA9IGlRUCAvIDY7Ci0gICAgUVBtb2QgPSBpUVAgJSA2OyAgICAKLSAgICBRQml0cyA9IDE1ICsgUVBwZXI7Ci0gICAgCi0gICAgZiA9ICgxIDw8IFFCaXRzKSAvIChiSW50cmEgPyAzIDogNik7Ci0gICAgCi0gICAgLyogRG8gWmVyby1CbG9jayBFYXJseSBkZXRlY3Rpb24gaWYgZW5hYmxlZCAqLwotICAgIGlmIChuVGhyZXNoU0FEKQotICAgIHsKLSAgICAgICAgVGhyZXNoREMgPSAoKDEgPDwgUUJpdHMpIC0gZikgLyBhcm1WQ000UDEwX01GTWF0cml4W1FQbW9kXVswXTsKLSAgICAgICAgaWYgKG5UaHJlc2hTQUQgPCBUaHJlc2hEQykKLSAgICAgICAgewotICAgICAgICAgICAgLyogU2V0IGJsb2NrIHRvIHplcm8gKi8KLSAgICAgICAgICAgIGlmIChwRENDb2VmZiAhPSBOVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwRENDb2VmZiA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBEc3RRdWFudENvZWZmIFs0ICogaiArIGldID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBEc3REZVF1YW50Q29lZmYgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcERzdERlUXVhbnRDb2VmZiBbNCAqIGogKyBpXSA9IDA7ICAgIAotICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwTnVtQ29lZmYgIT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcE51bUNvZWZmID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgIC8qIENhbGN1bGF0ZSBkaWZmZXJlbmNlICovCi0gICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJ1ZiBbaiAqIDQgKyBpXSA9IAotICAgICAgICAgICAgICAgIHBTcmNPcmcgW2ogKiBpU3JjT3JnU3RlcCArIGldIC0gcFNyY1ByZWQgW2ogKiBpU3JjUHJlZFN0ZXAgKyBpXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFJlc2lkdWFsIFRyYW5zZm9ybSAqLwotICAgIGFybVZDTTRQMTBfRndkVHJhbnNmb3JtUmVzaWR1YWw0eDQgKG0sIEJ1Zik7Ci0KLSAgICBpZiAocERDQ29lZmYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIC8qIENvcHkgdW5xdWFudGl6ZWQgREMgdmFsdWUgaW50byBwb2ludGVyICovCi0gICAgICAgICpwRENDb2VmZiA9IG1bMF07Ci0gICAgfQotCi0gICAgLyogUXVhbnRpemF0aW9uICovCi0gICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1GID0gYXJtVkNNNFAxMF9NRk1hdHJpeFtRUG1vZF1bYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbaiAqIDQgKyBpXV07Ci0gICAgICAgICAgICBWYWx1ZSA9IGFybUFicyhtW2ogKiA0ICsgaV0pICogTUYgKyBmOwotICAgICAgICAgICAgVmFsdWUgPj49IFFCaXRzOwotICAgICAgICAgICAgVmFsdWUgPSBtW2ogKiA0ICsgaV0gPCAwID8gLVZhbHVlIDogVmFsdWU7Ci0gICAgICAgICAgICBCdWZbNCAqIGogKyBpXSA9IHBEc3RRdWFudENvZWZmIFs0ICogaiArIGldID0gKE9NWF9TMTYpVmFsdWU7Ci0gICAgICAgICAgICBpZiAoKHBOdW1Db2VmZiAhPSBOVUxMKSAmJiBWYWx1ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOdW1Db2VmZisrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogT3V0cHV0IG51bWJlciBvZiBub24temVybyBDb2VmZnMgKi8KLSAgICBpZiAocE51bUNvZWZmICE9IE5VTEwpCi0gICAgewotICAgICAgICAqcE51bUNvZWZmID0gTnVtQ29lZmY7Ci0gICAgfQotICAgIAotICAgIC8qIFJlc2lkdWFsIEludiBUcmFuc2Zvcm0gKi8KLSAgICBpZiAocERzdERlUXVhbnRDb2VmZiAhPSBOVUxMKQotICAgIHsgICAgCi0gICAgICAgIC8qIFJlIFNjYWxlICovCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbSBbaiAqIDQgKyBpXSAgPSBCdWYgW2ogKiA0ICsgaV0gKiAoMSA8PCBRUHBlcikgKgotICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDEwX1ZNYXRyaXhbUVBtb2RdW2FybVZDTTRQMTBfUG9zVG9WQ29sNHg0W2ogKiA0ICsgaV1dOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQgKHBEc3REZVF1YW50Q29lZmYsIG0pOyAgICAgICAgCi0gICAgfQotICAgICAgICAKLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ5ZjVhNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpci5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSBhbmQgdHJhbnNmb3JtIG1vZHVsZQotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoKLSAqIERlc2NyaXB0aW9uOgotICogRGVxdWFudGl6ZSBDaHJvbWEgMngyIERDIGJsb2NrCi0gKi8KLQotc3RhdGljIHZvaWQgRGVxdWFudENocm9tYURDMngyKAotICAgICBPTVhfUzE2KiBwRHN0LAotICAgICBPTVhfSU5UIFFQICAgICAgICAKLSkKLXsKLSAgICBpbnQgU2hpZnQgPSAoUVAvNiktMSA7Ci0gICAgaW50IFNjYWxlID0gYXJtVkNNNFAxMF9WTWF0cml4W1FQJTZdWzBdOwotICAgIGludCBpLCBWYWx1ZTsKLQotICAgIGlmIChTaGlmdCA+PSAwKQotICAgIHsKLSAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWx1ZSA9IChwRHN0W2ldICogU2NhbGUpIDw8IFNoaWZ0OwotICAgICAgICAgICAgcERzdFtpXSA9IChPTVhfUzE2KVZhbHVlOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgVmFsdWUgPSAocERzdFtpXSAqIFNjYWxlKSA+PiAxOwotICAgICAgICAgICAgcERzdFtpXSA9IChPTVhfUzE2KVZhbHVlOwotICAgICAgICB9Ci0gICAgfQotfQotIAotCi0vKgotICogRGVzY3JpcHRpb246Ci0gKiBJbnZlcnNlIFRyYW5zZm9ybSBEQyAyeDIgQ29lZmZpY2llbnRzCi0gKi8KLQotc3RhdGljIHZvaWQgSW52VHJhbnNmb3JtREMyeDIoT01YX1MxNiogcERhdGEpCi17Ci0gICAgaW50IGMwMCA9IHBEYXRhWzBdOwotICAgIGludCBjMDEgPSBwRGF0YVsxXTsKLSAgICBpbnQgYzEwID0gcERhdGFbMl07Ci0gICAgaW50IGMxMSA9IHBEYXRhWzNdOwotCi0gICAgaW50IGQwMCA9IGMwMCArIGMwMTsKLSAgICBpbnQgZDAxID0gYzAwIC0gYzAxOwotICAgIGludCBkMTAgPSBjMTAgKyBjMTE7Ci0gICAgaW50IGQxMSA9IGMxMCAtIGMxMTsKLQotICAgIHBEYXRhWzBdID0gKE9NWF9TMTYpKGQwMCArIGQxMCk7Ci0gICAgcERhdGFbMV0gPSAoT01YX1MxNikoZDAxICsgZDExKTsKLSAgICBwRGF0YVsyXSA9IChPTVhfUzE2KShkMDAgLSBkMTApOwotICAgIHBEYXRhWzNdID0gKE9NWF9TMTYpKGQwMSAtIGQxMSk7Ci19Ci0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIgICAoNi4zLjQuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUmVjb25zdHJ1Y3QgdGhlIDJ4MiBDaHJvbWFEQyBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLCAKLSAqIHBlcmZvcm0gaW50ZWdlciBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uLCBhbmQgZGVxdWFudGl6YXRpb24gZm9yIDJ4MiBjaHJvbWEgCi0gKiBEQyBjb2VmZmljaWVudHMsIGFuZCB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgCi0gKiBibG9jay4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKLSAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAotICogICBRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIgUXBDIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcFNyYyAtICpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jayAKLSAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgMngyIENocm9tYURDIGNvZWZmaWNpZW50cyBidWZmZXI7IAotICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCi0gKiAgICAtICAgIHBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCi0gKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIC0gICAgUVAgaXMgbm90IGluIHRoZSByYW5nZSBvZiBbMC01MV0uIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcigKLSAgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCi0gICAgIE9NWF9TMTYqIHBEc3QsCi0gICAgIE9NWF9JTlQgUVAgICAgICAgIAotICkKLXsKLSAgICBhcm1SZXRBcmdFcnJJZihwcFNyYyAgPT0gTlVMTCwgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigqcHBTcmMgPT0gTlVMTCwgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ICAgPT0gTlVMTCwgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihRUDwwLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihRUD41MSwgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIGFybVZDTTRQMTBfVW5wYWNrQmxvY2syeDIocHBTcmMsIHBEc3QpOwotICAgIEludlRyYW5zZm9ybURDMngyKHBEc3QpOwotICAgIERlcXVhbnRDaHJvbWFEQzJ4MihwRHN0LCBRUCk7Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzMzZDQ5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEguMjY0IGludmVyc2UgcXVhbnRpemUgYW5kIHRyYW5zZm9ybSBtb2R1bGUKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqIERlcXVhbnRpemUgTHVtYSBEQyBibG9jawotICovCi0KLXN0YXRpYyB2b2lkIERlcXVhbnRMdW1hREM0eDQoCi0gICAgIE9NWF9TMTYqIHBEc3QsCi0gICAgIE9NWF9JTlQgUVAgICAgICAgIAotKQotewotICAgIGludCBTaGlmdCA9IChRUC82KS0yIDsKLSAgICBpbnQgU2NhbGUgPSBhcm1WQ000UDEwX1ZNYXRyaXhbUVAlNl1bMF07Ci0gICAgaW50IGksIFJvdW5kLCBWYWx1ZTsKLQotICAgIGlmIChTaGlmdCA+PSAwKQotICAgIHsKLSAgICAgICAgZm9yIChpPTA7IGk8MTY7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgVmFsdWUgPSAocERzdFtpXSAqIFNjYWxlKSA8PCBTaGlmdDsKLSAgICAgICAgICAgIHBEc3RbaV0gPSAoT01YX1MxNilWYWx1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBTaGlmdCA9IC1TaGlmdDs7Ci0gICAgICAgIFJvdW5kID0gMTw8KFNoaWZ0LTEpOwotCi0gICAgICAgIGZvciAoaT0wOyBpPDE2OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbHVlID0gKHBEc3RbaV0gKiBTY2FsZSArIFJvdW5kKSA+PiBTaGlmdDsKLSAgICAgICAgICAgIHBEc3RbaV0gPSAoT01YX1MxNilWYWx1ZTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotIAotCi0vKgotICogRGVzY3JpcHRpb246Ci0gKiBJbnZlcnNlIFRyYW5zZm9ybSBEQyA0eDQgQ29lZmZpY2llbnRzCi0gKi8KLXN0YXRpYyB2b2lkIEludlRyYW5zZm9ybURDNHg0KE9NWF9TMTYqIHBEYXRhKQotewotICAgIGludCBpOwotCi0gICAgLyogVHJhbnNmb3JtIHJvd3MgKi8KLSAgICBmb3IgKGk9MDsgaTwxNjsgaSs9NCkKLSAgICB7Ci0gICAgICAgIGludCBjMCA9IHBEYXRhW2krMF07Ci0gICAgICAgIGludCBjMSA9IHBEYXRhW2krMV07Ci0gICAgICAgIGludCBjMiA9IHBEYXRhW2krMl07Ci0gICAgICAgIGludCBjMyA9IHBEYXRhW2krM107Ci0gICAgICAgIHBEYXRhW2krMF0gPSAoT01YX1MxNikoYzArYzErYzIrYzMpOwotICAgICAgICBwRGF0YVtpKzFdID0gKE9NWF9TMTYpKGMwK2MxLWMyLWMzKTsKLSAgICAgICAgcERhdGFbaSsyXSA9IChPTVhfUzE2KShjMC1jMS1jMitjMyk7Ci0gICAgICAgIHBEYXRhW2krM10gPSAoT01YX1MxNikoYzAtYzErYzItYzMpOwotICAgIH0KLQotICAgIC8qIFRyYW5zZm9ybSBjb2x1bW5zICovCi0gICAgZm9yIChpPTA7IGk8NDsgaSsrKQotICAgIHsKLSAgICAgICAgaW50IGMwID0gcERhdGFbaSswXTsKLSAgICAgICAgaW50IGMxID0gcERhdGFbaSs0XTsKLSAgICAgICAgaW50IGMyID0gcERhdGFbaSs4XTsKLSAgICAgICAgaW50IGMzID0gcERhdGFbaSsxMl07Ci0gICAgICAgIHBEYXRhW2krMF0gPSAoT01YX1MxNikoYzArYzErYzIrYzMpOwotICAgICAgICBwRGF0YVtpKzRdID0gKE9NWF9TMTYpKGMwK2MxLWMyLWMzKTsKLSAgICAgICAgcERhdGFbaSs4XSA9IChPTVhfUzE2KShjMC1jMS1jMitjMyk7Ci0gICAgICAgIHBEYXRhW2krMTJdID0gKE9NWF9TMTYpKGMwLWMxK2MyLWMzKTsKLSAgICB9Ci19Ci0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyICAgKDYuMy40LjIuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFJlY29uc3RydWN0cyB0aGUgNHg0IEx1bWFEQyBibG9jayBmcm9tIHRoZSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIAotICogYnVmZmVyLCBwZXJmb3JtcyBpbnRlZ2VyIGludmVyc2UsIGFuZCBkZXF1YW50aXphdGlvbiBmb3IgNHg0IEx1bWFEQyAKLSAqIGNvZWZmaWNpZW50cywgYW5kIHVwZGF0ZXMgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gdGhlIG5leHQgbm9uLWVtcHR5IAotICogYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwU3JjIC0gRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIgCi0gKiAgICAgICAgICAgIG91dHB1dCBieSBDQUxWQyBkZWNvZGluZyAKLSAqICAgUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyIFFwWSAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBTcmMgLSAqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sgCi0gKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBMdW1hREMgY29lZmZpY2llbnRzIGJ1ZmZlcjsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKLSAqICAgIC0gICAgcHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcERzdCBpcyBub3QgOCBieXRlIGFsaWduZWQuIAotICogICAgLSAgICBRUCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXS4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcigKLSAgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCi0gICAgIE9NWF9TMTYqIHBEc3QsCi0gICAgIE9NWF9JTlQgUVAgICAgICAgIAotICkKLXsKLSAgICBhcm1SZXRBcmdFcnJJZihwcFNyYyAgPT0gTlVMTCwgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigqcHBTcmMgPT0gTlVMTCwgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ICAgPT0gTlVMTCwgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihRUDwwLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihRUD41MSwgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQocHBTcmMsIHBEc3QpOwotICAgIC8qSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NChwRHN0LCBRUCk7Ki8KLSAgICBJbnZUcmFuc2Zvcm1EQzR4NChwRHN0KTsKLSAgICBEZXF1YW50THVtYURDNHg0KHBEc3QsIFFQKTsKLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjZhM2QwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMuYworKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgNHg0IGhhZGFtYXJkIHRyYW5zZm9ybSBvZiBjaHJvbWEgREMgIAotICogY29lZmZpY2llbnRzIGFuZCBxdWFudGl6YXRpb24KLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMgICAoNi4zLjUuNi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyAyeDIgSGFkYW1hcmQgdHJhbnNmb3JtIG9mIGNocm9tYSBEQyBjb2VmZmljaWVudHMgCi0gKiBhbmQgdGhlbiBxdWFudGl6ZXMgdGhlIGNvZWZmaWNpZW50cy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIDJ4MiBhcnJheSBvZiBjaHJvbWEgREMgY29lZmZpY2llbnRzLiAgOC1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAotICogICBiSW50cmEgLSBJbmRpY2F0ZSB3aGV0aGVyIHRoaXMgaXMgYW4gSU5UUkEgYmxvY2suIDEtSU5UUkEsIDAtSU5URVIgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRyYW5zZm9ybWVkIGFuZCBxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgOC1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgICAgICBwU3JjRHN0IAotICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKLSAqCi0gKi8KLU9NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0Nocm9tYURDKAotCU9NWF9TMTYqIAlwU3JjRHN0LAotCU9NWF9VMzIJCWlRUCwKLQlPTVhfVTgJCWJJbnRyYQotKQotewotICAgIE9NWF9JTlQgICAgIGksIGo7Ci0gICAgT01YX1MzMiAgICAgbVsyXVsyXTsKLSAgICBPTVhfUzMyICAgICBWYWx1ZTsKLSAgICBPTVhfUzMyICAgICBRYml0c1BsdXNPbmUsIFR3b19mLCBNRjAwOwotCi0gICAgLyogQ2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoaVFQID4gNTEsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIC8qIEhhZGFtYXJkIFRyYW5zZm9ybSBmb3IgMngyIGJsb2NrICovCi0gICAgbVswXVswXSA9IHBTcmNEc3RbMF0gKyBwU3JjRHN0WzFdICsgIHBTcmNEc3RbMl0gKyBwU3JjRHN0WzNdOwotICAgIG1bMF1bMV0gPSBwU3JjRHN0WzBdIC0gcFNyY0RzdFsxXSArICBwU3JjRHN0WzJdIC0gcFNyY0RzdFszXTsKLSAgICBtWzFdWzBdID0gcFNyY0RzdFswXSArIHBTcmNEc3RbMV0gLSAgcFNyY0RzdFsyXSAtIHBTcmNEc3RbM107Ci0gICAgbVsxXVsxXSA9IHBTcmNEc3RbMF0gLSBwU3JjRHN0WzFdIC0gIHBTcmNEc3RbMl0gKyBwU3JjRHN0WzNdOwotCi0gICAgLyogUXVhbnRpemF0aW9uICovCi0gICAgUWJpdHNQbHVzT25lID0gQVJNX000UDEwX1FfT0ZGU0VUICsgMSArIChpUVAgLyA2KTsgLypmbG9vciAoUVAvNikqLwotICAgIE1GMDAgPSBhcm1WQ000UDEwX01GTWF0cml4IFtpUVAgJSA2XVswXTsKLQotICAgIFR3b19mID0gKDEgPDwgUWJpdHNQbHVzT25lKSAvIChiSW50cmEgPyAzIDogNik7IC8qIDMtPklOVFJBLCA2LT5JTlRFUiAqLwotCi0gICAgLyogU2NhbGluZyAqLwotICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWx1ZSA9IChhcm1BYnMobVtqXVtpXSkgKiBNRjAwICsgVHdvX2YpID4+IFFiaXRzUGx1c09uZTsKLSAgICAgICAgICAgIHBTcmNEc3RbaiAqIDIgKyBpXSA9IChPTVhfUzE2KSgobVtqXVtpXSA8IDApID8gLVZhbHVlIDogVmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9MdW1hREMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE5OWEyZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxjdWxhdGUgNHg0IGhhZGFtYXJkIHRyYW5zZm9ybSBvZiBsdW1hIERDIGNvZWZmaWNpZW50cyAKLSAqIGFuZCBxdWFudGl6YXRpb24KLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDICAgKDYuMy41LjYuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSA0eDQgSGFkYW1hcmQgdHJhbnNmb3JtIG9mIGx1bWEgREMgY29lZmZpY2llbnRzIAotICogYW5kIHRoZW4gcXVhbnRpemVzIHRoZSBjb2VmZmljaWVudHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSA0eDQgYXJyYXkgb2YgbHVtYSBEQyBjb2VmZmljaWVudHMuICAxNi1ieXRlIAotICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICogICBpUVAgLSBRdWFudGl6YXRpb24gcGFyYW1ldGVyOyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCw1MV0uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0cmFuc2Zvcm1lZCBhbmQgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDE2LWJ5dGUgCi0gKiAgICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0RzdCAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgYWxpZ25lZCBvbiBhbiAxNi1ieXRlIGJvdW5kYXJ5IAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfTHVtYURDKAotCU9NWF9TMTYqIAlwU3JjRHN0LAotCU9NWF9VMzIJCWlRUAotKQotewotICAgIE9NWF9JTlQgICAgIGksIGo7Ci0gICAgT01YX1MzMiAgICAgbTFbNF1bNF0sIG0yWzRdWzRdOwotICAgIE9NWF9TMzIgICAgIFZhbHVlOwotICAgIE9NWF9VMzIgICAgIFFiaXRzUGx1c09uZSwgVHdvX2YsIE1GOwotCi0gICAgLyogQ2hlY2sgZm9yIGFyZ3VtZW50IGVycm9yICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoYXJtTm90MTZCeXRlQWxpZ25lZChwU3JjRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKGlRUCA+IDUxLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICAvKiBIYWRhbWFyZCBUcmFuc2Zvcm0gZm9yIDR4NCBibG9jayAqLwotICAgIC8qIEhvcml6b250YWwgSGFkYW1hcmQgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgIHsKLSAgICAgICAgaiA9IGkgKiA0OwotICAgICAgICAKLSAgICAgICAgbTFbaV1bMF0gPSBwU3JjRHN0W2ogKyAwXSArIHBTcmNEc3RbaiArIDJdOyAvKiBhK2MgKi8KLSAgICAgICAgbTFbaV1bMV0gPSBwU3JjRHN0W2ogKyAxXSArIHBTcmNEc3RbaiArIDNdOyAvKiBiK2QgKi8KLSAgICAgICAgbTFbaV1bMl0gPSBwU3JjRHN0W2ogKyAwXSAtIHBTcmNEc3RbaiArIDJdOyAvKiBhLWMgKi8KLSAgICAgICAgbTFbaV1bM10gPSBwU3JjRHN0W2ogKyAxXSAtIHBTcmNEc3RbaiArIDNdOyAvKiBiLWQgKi8KLQotICAgICAgICBtMltpXVswXSA9IG0xW2ldWzBdICsgbTFbaV1bMV07IC8qIGErYitjK2QgKi8KLSAgICAgICAgbTJbaV1bMV0gPSBtMVtpXVsyXSArIG0xW2ldWzNdOyAvKiBhK2ItYy1kICovCi0gICAgICAgIG0yW2ldWzJdID0gbTFbaV1bMl0gLSBtMVtpXVszXTsgLyogYS1iLWMrZCAqLwotICAgICAgICBtMltpXVszXSA9IG0xW2ldWzBdIC0gbTFbaV1bMV07IC8qIGEtYitjLWQgKi8KLQotICAgIH0KLQotICAgIC8qIFZlcnRpY2FsICovCi0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICB7Ci0gICAgICAgIG0xWzBdW2ldID0gbTJbMF1baV0gKyBtMlsyXVtpXTsKLSAgICAgICAgbTFbMV1baV0gPSBtMlsxXVtpXSArIG0yWzNdW2ldOwotICAgICAgICBtMVsyXVtpXSA9IG0yWzBdW2ldIC0gbTJbMl1baV07Ci0gICAgICAgIG0xWzNdW2ldID0gbTJbMV1baV0gLSBtMlszXVtpXTsKLQotICAgICAgICBtMlswXVtpXSA9IG0xWzBdW2ldICsgbTFbMV1baV07Ci0gICAgICAgIG0yWzFdW2ldID0gbTFbMl1baV0gKyBtMVszXVtpXTsKLSAgICAgICAgbTJbMl1baV0gPSBtMVsyXVtpXSAtIG0xWzNdW2ldOwotICAgICAgICBtMlszXVtpXSA9IG0xWzBdW2ldIC0gbTFbMV1baV07Ci0gICAgfQotCi0gICAgCi0gICAgLyogUXVhbnRpemF0aW9uICovCi0gICAgUWJpdHNQbHVzT25lID0gQVJNX000UDEwX1FfT0ZGU0VUICsgMSArIChpUVAgLyA2KTsgLypmbG9vciAoUVAvNikqLwotICAgIFR3b19mID0gKDEgPDwgUWJpdHNQbHVzT25lKSAvIDM7IC8qIDMtPklOVFJBLCA2LT5JTlRFUiAqLwotICAgIE1GID0gYXJtVkNNNFAxMF9NRk1hdHJpeCBbaVFQICUgNl1bMF07Ci0KLSAgICAvKiBTY2FsaW5nICovCi0gICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbHVlID0gKGFybUFicygobTJbal1baV0vKiArIDEqLykgLyAyKSAqIE1GICsgVHdvX2YpID4+IFFiaXRzUGx1c09uZTsKLSAgICAgICAgICAgIHBTcmNEc3RbaiAqIDQgKyBpXSA9IChPTVhfUzE2KSgobTJbal1baV0gPCAwKSA/IC1WYWx1ZSA6IFZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0RDVF9UYWJsZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfRENUX1RhYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MmRhMTMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfRENUX1RhYmxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0RDVF9UYWJsZS5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICoKLSAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfRENUX1RhYmxlLmgKLSAqIERlc2NyaXB0aW9uOiBEZWNsYXJlcyBUYWJsZXMgdXNlZCBmb3IgRENUL0lEQ1QgbW9kdWxlCi0gKiAgICAgICAgICAgICAgaW4gTVA0UDIgY29kZWMuCi0gKgotICovCi0gCi0jaWZuZGVmIF9PTVhEQ1RUQUJfSF8KLSNkZWZpbmUgX09NWERDVFRBQl9IXwotCi1leHRlcm4gY29uc3QgT01YX0Y2NCBhcm1WQ000UDJfcHJlQ2FsY0RDVENvc1s4XVs4XTsKLQotI2VuZGlmIC8qIF9PTVhEQ1RUQUJfSF8gKi8KLQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg4YmRiYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKgotICogRmlsZTogICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlcy5oCi0gKiBEZXNjcmlwdGlvbjogRGVjbGFyZXMgVGFibGVzIHVzZWQgZm9yIEh1ZmZmbWFuIGNvZGluZyBhbmQgZGVjb2RpbmcgCi0gKiAgICAgICAgICAgICAgaW4gTVA0UDIgY29kZWMuCi0gKgotICovCi0gCi0jaWZuZGVmIF9PTVhIVUZGVEFCX0hfCi0jZGVmaW5lIF9PTVhIVUZGVEFCX0hfCi0KLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBSdW5JZHhbMTFdOwotZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfSW50cmFWbGNMMFs2OF07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwxUnVuSWR4WzddOwotZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfSW50cmFWbGNMMVszNl07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTE1BWFsxNV07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwxTE1BWFsyMV07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwUk1BWFsyN107Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwxUk1BWFs4XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBSdW5JZHhbMTJdOwotZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfSW50ZXJWbGNMMFs1OV07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwxUnVuSWR4WzNdOwotZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfSW50ZXJWbGNMMVs0NV07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTE1BWFsyN107Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwxTE1BWFs0MV07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwUk1BWFsxMl07Ci1leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwxUk1BWFszXTsKLWV4dGVybiBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAyX2FJbnRyYURDTHVtYUluZGV4WzE0XTsKLWV4dGVybiBjb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAyX2FJbnRyYURDQ2hyb21hSW5kZXhbMTRdOwotZXh0ZXJuIGNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfYVZsY01WRFs2Nl07Ci0KLSNlbmRpZiAvKiBfT01YSFVGRlRBQl9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGMxNjNmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICoKLSAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfWmlnemFnX1RhYmxlcy5oCi0gKiBEZXNjcmlwdGlvbjogRGVjbGFyZXMgVGFibGVzIHVzZWQgZm9yIFppZ3phZyBzY2FuIGluIE1QNFAyIGNvZGVjLgotICoKLSAqLwotIAotI2lmbmRlZiBfT01YWklHWkFHVEFCX0hfCi0jZGVmaW5lIF9PTVhaSUdaQUdUQUJfSF8KLQotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gWzY0XTsKLWV4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FIb3Jpem9udGFsWmlnemFnU2NhbiBbNjRdOwotZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYVZlcnRpY2FsWmlnemFnU2NhbiBbNjRdOwotCi0jZW5kaWYgLyogX09NWFpJR1pBR1RBQl9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQUNEQ1ByZWRpY3QuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0FDRENQcmVkaWN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5OTNmNzMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQUNEQ1ByZWRpY3QuYworKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0FDRENQcmVkaWN0LmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGUgZm9yIERDL0FDIGNvZWZmaWNpZW50IHByZWRpY3Rpb24KLSAqCi0gKi8gCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQUNEQ1ByZWRpY3QKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGFkYXB0aXZlIERDL0FDIGNvZWZmaWNpZW50IHByZWRpY3Rpb24gZm9yIGFuIGludHJhIGJsb2NrLiBQcmlvcgotICogdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHByZWRpY3Rpb24gZGlyZWN0aW9uIChwcmVkRGlyKSBzaG91bGQgYmUgc2VsZWN0ZWQKLSAqIGFzIHNwZWNpZmllZCBpbiBzdWJjbGF1c2UgNy40LjMuMSBvZiBJU08vSUVDIDE0NDk2LTIuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwU3JjRHN0ICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcXVhbnRpemVkIGNvZWZmaWNpZW50IHJlc2lkdWFscyAoUFFGKSBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJsb2NrCi0gKiBbaW5dIHBQcmVkQnVmUm93IHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKLSAqIFtpbl0gcFByZWRCdWZDb2wgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgotICogW2luXSBjdXJRUCAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBjdXJRUAotICogICAgICAgICAgICAgICAgICAgICAgICAgIG1heSBlcXVhbCB0byBwcmVkUVAgZXNwZWNpYWxseSB3aGVuIHRoZSBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgYW5kIHRoZSBwcmVkaWN0b3IgYmxvY2sgYXJlIGluIHRoZSBzYW1lCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jay4KLSAqIFtpbl0gcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCi0gKiBbaW5dIHByZWREaXIgICAgIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKLSAqIFtpbl0gQUNQcmVkRmxhZyAgYSBmbGFnIGluZGljYXRpbmcgaWYgQUMgcHJlZGljdGlvbiBzaG91bGQgYmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtZWQuIEl0IGlzIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyBpbiB0aGUgYml0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIHN5bnRheCBvZiBNUEVHLTQKLSAqIFtpbl0gdmlkZW9Db21wICAgdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2Ugb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSkgb2YgdGhlIGN1cnJlbnQgYmxvY2sKLSAqIFtpbl0gZmxhZyAgICAgICAgVGhpcyBmbGFnIGRlZmluZXMgdGhlIGlmIG9uZSB3YW50cyB0byB1c2UgdGhpcyBmdW5jdGlvbnMgdG8KLSAqICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlIFBRRiAoc2V0IDEsIHByZWRpY3Rpb24pIG9yIFFGIChzZXQgMCwgcmVjb25zdHJ1Y3Rpb24pCi0gKiBbb3V0XSAgICBwUHJlQUNQcmVkaWN0ICAgcG9pbnRlciB0byB0aGUgcHJlZGljdGVkIGNvZWZmaWNpZW50cyBidWZmZXIuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsbGVkIE9OTFkgaWYgaXQgaXMgbm90IE5VTEwKLSAqIFtvdXRdICAgIHBTcmNEc3QgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucwotICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBxdWFudGl6ZWQgY29lZmZpY2llbnRzIChRRikgb2YgdGhlIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jawotICogW291dF0gICAgcFByZWRCdWZSb3cgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyCi0gKiBbb3V0XSAgICBwUHJlZEJ1ZkNvbCBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKLSAqIFtvdXRdICAgIHBTdW1FcnIgICAgIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgc3VtIG9mIHRoZSBkaWZmZXJlbmNlCi0gKiAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIHByZWRpY3RlZCBhbmQgdW5wcmVkaWN0ZWQgY29lZmZpY2llbnRzCi0gKiAgICAgICAgICAgICAgICAgICAgICBJZiB0aGlzIGlzIE5VTEwsIGRvIG5vdCB1cGRhdGUKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9BQ0RDUHJlZGljdCgKLSAgICAgT01YX1MxNiAqIHBTcmNEc3QsCi0gICAgIE9NWF9TMTYgKiBwUHJlQUNQcmVkaWN0LAotICAgICBPTVhfUzE2ICogcFByZWRCdWZSb3csCi0gICAgIE9NWF9TMTYgKiBwUHJlZEJ1ZkNvbCwKLSAgICAgT01YX0lOVCBjdXJRUCwKLSAgICAgT01YX0lOVCBwcmVkUVAsCi0gICAgIE9NWF9JTlQgcHJlZERpciwKLSAgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAotICAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAsCi0gICAgIE9NWF9VOCBmbGFnLAotICAgICBPTVhfSU5UICpwU3VtRXJyCi0pCi17Ci0gICAgT01YX0lOVCBkY1NjYWxlciwgaTsKLSAgICBPTVhfUzE2IHRlbXBQcmVkOwotCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFByZWRCdWZSb3cgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBQcmVkQnVmQ29sID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihjdXJRUCA8PSAwLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZFFQIDw9IDAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigocHJlZERpciAhPSAxKSAmJiAocHJlZERpciAhPSAyKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczRCeXRlQWxpZ25lZChwU3JjRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczRCeXRlQWxpZ25lZChwUHJlZEJ1ZlJvdyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM0Qnl0ZUFsaWduZWQocFByZWRCdWZDb2wpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICAKLSAgICAvKiBTZXQgREMgc2NhbGVyIHZhbHVlIHRvIGF2b2lkIHNvbWUgY29tcGlsZXJzIGdpdmluZyBhIHdhcm5pbmcuICovCi0gICAgZGNTY2FsZXI9MDsKLSAgICAKLSAgICAvKiBDYWxjdWxhdGUgdGhlIERDIHNjYWxlciB2YWx1ZSAqLwotICAgIGlmICh2aWRlb0NvbXAgPT0gT01YX1ZDX0xVTUlOQU5DRSkKLSAgICB7Ci0gICAgICAgIGlmIChjdXJRUCA+PSAxICYmIGN1clFQIDw9IDQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRjU2NhbGVyID0gODsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjdXJRUCA+PSA1ICYmIGN1clFQIDw9IDgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRjU2NhbGVyID0gMiAqIGN1clFQOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGN1clFQID49IDkgJiYgY3VyUVAgPD0gMjQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRjU2NhbGVyID0gY3VyUVAgKyA4OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZGNTY2FsZXIgPSAoMiAqIGN1clFQKSAtIDE2OwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHZpZGVvQ29tcCA9PSBPTVhfVkNfQ0hST01JTkFOQ0UpCi0gICAgewotICAgICAgICBpZiAoY3VyUVAgPj0gMSAmJiBjdXJRUCA8PSA0KQotICAgICAgICB7Ci0gICAgICAgICAgICBkY1NjYWxlciA9IDg7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY3VyUVAgPj0gNSAmJiBjdXJRUCA8PSAyNCkKLSAgICAgICAgewotICAgICAgICAgICAgZGNTY2FsZXIgPSAoY3VyUVAgKyAxMykvMjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRjU2NhbGVyID0gY3VyUVAgLSA2OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHBQcmVBQ1ByZWRpY3QgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHBQcmVBQ1ByZWRpY3RbMF0gPSBwcmVkRGlyOwotICAgIH0KLQotICAgIGlmIChwcmVkRGlyID09IE9NWF9WQ19WRVJUSUNBTCkKLSAgICB7Ci0gICAgICAgIC8qIEZbMF1bMF0vL2RjX3NjYWxlciAqLwotICAgICAgICB0ZW1wUHJlZCA9IGFybUludERpdkF3YXlGcm9tWmVybyhwUHJlZEJ1ZlJvd1swXSwgZGNTY2FsZXIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBGWzBdWzBdLy9kY19zY2FsZXIgKi8KLSAgICAgICAgdGVtcFByZWQgPSBhcm1JbnREaXZBd2F5RnJvbVplcm8ocFByZWRCdWZDb2xbMF0sIGRjU2NhbGVyKTsKLSAgICB9Ci0KLSAgICAvKiBVcGRhdGluZyB0aGUgREMgdmFsdWUgdG8gdGhlIHJvdyBhbmQgY29sIGJ1ZmZlciAqLwotICAgICoocFByZWRCdWZSb3cgLSA4KSA9ICpwUHJlZEJ1ZkNvbDsKLQotICAgIGlmIChmbGFnKQotICAgIHsKLSAgICAgICAgLyogQ2FsIGFuZCBzdG9yZSBGWzBdWzBdIGludG8gdGhlIGNvbCBidWZmZXIgKi8KLSAgICAgICAgKnBQcmVkQnVmQ29sID0gcFNyY0RzdFswXSAqIGRjU2NhbGVyOwotCi0gICAgICAgIC8qIFBRRiA9IFFGIC0gRlswXVswXS8vZGNfc2NhbGVyICovCi0gICAgICAgIHBTcmNEc3RbMF0gLT0gdGVtcFByZWQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFFGID0gUFFGICsgRlswXVswXS8vZGNfc2NhbGVyICovCi0gICAgICAgIHBTcmNEc3RbMF0gKz0gdGVtcFByZWQ7Ci0gICAgICAgIAotICAgICAgICAvKiBTYXR1cmF0ZSAqLwotICAgICAgICBwU3JjRHN0WzBdID0gYXJtQ2xpcCAoLTIwNDgsIDIwNDcsIHBTcmNEc3RbMF0pOwotCi0gICAgICAgIC8qIENhbCBhbmQgc3RvcmUgRlswXVswXSBpbnRvIHRoZSBjb2wgYnVmZmVyICovCi0gICAgICAgICpwUHJlZEJ1ZkNvbCA9IHBTcmNEc3RbMF0gKiBkY1NjYWxlcjsKLSAgICB9Ci0KLQotICAgIGlmIChBQ1ByZWRGbGFnID09IDEpCi0gICAgewotICAgICAgICBpZiAocHJlZERpciA9PSBPTVhfVkNfVkVSVElDQUwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCA4OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcFByZWQgPSBhcm1JbnREaXZBd2F5RnJvbVplcm8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBQcmVkQnVmUm93W2ldICogcHJlZFFQLCBjdXJRUCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZsYWcpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGluZyBRRiB0byB0aGUgcm93IGJ1ZmYgKi8KLSAgICAgICAgICAgICAgICAgICAgcFByZWRCdWZSb3dbaV0gPSBwU3JjRHN0W2ldOwotICAgICAgICAgICAgICAgICAgICAvKlBRRlhbdl1bMF0gPSBRRlhbdl1bMF0gLSAoUUZBW3ZdWzBdICogUVBBKSAvLyBRUFggKi8KLSAgICAgICAgICAgICAgICAgICAgcFNyY0RzdFtpXSAtPSB0ZW1wUHJlZDsKLSAgICAgICAgICAgICAgICAgICAgLyogU3VtIG9mIGFic29sdXRlIHZhbHVlcyBvZiBBQyBwcmVkaWN0aW9uIGVycm9yLCB0aGlzIGNhbgotICAgICAgICAgICAgICAgICAgICBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIHRvIGNob29zZSB3aGV0aGVyIHRvIHVzZQotICAgICAgICAgICAgICAgICAgICBBQyBwcmVkaWN0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICpwU3VtRXJyICs9IGFybUFicyhwU3JjRHN0W2ldKTsKLSAgICAgICAgICAgICAgICAgICAgLyogcFByZUFDUHJlZGljdFsxfjddIHN0b3JlIHRoZSBlcnJvciBzaWduYWwKLSAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgQUMgcHJlZGljdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBwUHJlQUNQcmVkaWN0W2ldID0gcFNyY0RzdFtpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypRRlhbdl1bMF0gPSBQUUZYW3ZdWzBdICsgKFFGQVt2XVswXSAqIFFQQSkgLy8gUVBYICovCi0gICAgICAgICAgICAgICAgICAgIHBTcmNEc3RbaV0gKz0gdGVtcFByZWQ7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvKiBTYXR1cmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICBwU3JjRHN0W2ldID0gYXJtQ2xpcCAoLTIwNDgsIDIwNDcsIHBTcmNEc3RbaV0pOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRpbmcgUUYgdG8gdGhlIHJvdyBidWZmICovCi0gICAgICAgICAgICAgICAgICAgIHBQcmVkQnVmUm93W2ldID0gcFNyY0RzdFtpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGkgPSA4OyBpIDwgNjQ7IGkgKz0gOCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZW1wUHJlZCA9IGFybUludERpdkF3YXlGcm9tWmVybyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFByZWRCdWZDb2xbaT4+M10gKiBwcmVkUVAsIGN1clFQKTsKLSAgICAgICAgICAgICAgICBpZiAoZmxhZykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0aW5nIFFGIHRvIGNvbCBidWZmICovCi0gICAgICAgICAgICAgICAgICAgIHBQcmVkQnVmQ29sW2k+PjNdID0gcFNyY0RzdFtpXTsKLSAgICAgICAgICAgICAgICAgICAgLypQUUZYWzBdW3VdID0gUUZYWzBdW3VdIC0gKFFGQVswXVt1XSAqIFFQQSkgLy8gUVBYICovCi0gICAgICAgICAgICAgICAgICAgIHBTcmNEc3RbaV0gLT0gdGVtcFByZWQ7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFN1bSBvZiBhYnNvbHV0ZSB2YWx1ZXMgb2YgQUMgcHJlZGljdGlvbiBlcnJvciwgdGhpcyBjYW4KLSAgICAgICAgICAgICAgICAgICAgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSB0byBjaG9vc2Ugd2hldGhlciB0byB1c2UgQUMKLSAgICAgICAgICAgICAgICAgICAgcHJlZGljdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAqcFN1bUVyciArPSBhcm1BYnMocFNyY0RzdFtpXSk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHBQcmVBQ1ByZWRpY3RbMX43XSBzdG9yZSB0aGUgZXJyb3Igc2lnbmFsCi0gICAgICAgICAgICAgICAgICAgIGFmdGVyIEFDIHByZWRpY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgcFByZUFDUHJlZGljdFtpPj4zXSA9IHBTcmNEc3RbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qUUZYWzBdW3VdID0gUFFGWFswXVt1XSArIChRRkFbMF1bdV0gKiBRUEEpIC8vIFFQWCAqLwotICAgICAgICAgICAgICAgICAgICBwU3JjRHN0W2ldICs9IHRlbXBQcmVkOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLyogU2F0dXJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgcFNyY0RzdFtpXSA9IGFybUNsaXAgKC0yMDQ4LCAyMDQ3LCBwU3JjRHN0W2ldKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0aW5nIFFGIHRvIGNvbCBidWZmICovCi0gICAgICAgICAgICAgICAgICAgIHBQcmVkQnVmQ29sW2k+PjNdID0gcFNyY0RzdFtpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLypFbmQgb2YgRmlsZSovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZmRhMTAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9CbG9ja01hdGNoX0hhbGYuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIEJsb2NrIG1hdGNoaW5nLCBhIGZ1bGwgc2VhcmNoIGFsZ29yaXRobQotICogaXMgaW1wbGVtZW50ZWQKLSAqCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiAgUmV0dXJucyB0aGUgZXN0aW1hdGVkIAotICogbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIHRoZSBoYWxmLXBpeGVsIAotICogbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIAotICogYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIHRoZSBpbml0aWFsIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIAotICogZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIHBTcmNSZWZCdWYgYW5kIHBTZWFyY2hQb2ludFJlZlBvcyBzaG91bGQgYmUgCi0gKiBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIDE2eDE2IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzE2eDE2LiAgCi0gKiBUaGUgZnVuY3Rpb24gQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JcFNyY1JlZkJ1ZgkJcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIAotICogICAgICAgICAgICAgICAgICAgIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgdGhlCWN1cnJlbnQgcGxhbmUuCi0gKiBbaW5dCXJlZldpZHRoCQkgIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUKLSAqIFtpbl0JcFJlZlJlY3QJCSAgcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUKLSAqIFtpbl0JcFNyY0N1cnJCdWYJCXBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAKLSAqICAgICAgICAgICAgICAgICAgICAobGluZWFyIGFycmF5LCAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogW2luXQlwU2VhcmNoUG9pbnRSZWZQb3MJcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIHNlYXJjaCAoc3BlY2lmaWVkIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuCi0gKiBbaW5dCXJuZFZhbAkJCSAgcm91bmRpbmcgY29udHJvbCBiaXQgZm9yIGhhbGYgcGl4ZWwgbW90aW9uIGVzdGltYXRpb247IAotICogICAgICAgICAgICAgICAgICAgIDA9cm91bmRpbmcgY29udHJvbCBkaXNhYmxlZDsgMT1yb3VuZGluZyBjb250cm9sIGVuYWJsZWQKLSAqIFtpbl0JcFNyY0RzdE1WCQlwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIGR1cmluZyBhIHByaW9yIAotICogICAgICAgICAgICAgICAgICAxNlgxNiBpbnRlZ2VyIHNlYXJjaCBhbmQgaXRzIHVuaXQgaXMgaGFsZiBwaXhlbC4KLSAqIFtpbl0gQmxvY2tTaXplICAgICBNYWNyb0Jsb2NrIFNpemUgaS5lIGVpdGhlciAxNngxNiBvciA4eDguCi0gKiBbb3V0XXBTcmNEc3RNVgkJcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKLSAqIFtvdXRdcERzdFNBRAkJCXBvaW50ZXIgdG8gbWluaW11bSBTQUQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfU3RzX05vRXJyIKhDIG5vIGVycm9yCi0gKiBPTVhfU3RzX0JhZEFyZ0VyciCoQyBiYWQgYXJndW1lbnRzCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmKAotICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCi0gICAgIE9NWF9JTlQgcm5kVmFsLAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAotICAgICBPTVhfSU5UICpwRHN0U0FELAotICAgICBPTVhfVTggQmxvY2tTaXplCi0pCi17Ci0gICAgT01YX0lOVCAgICAgb3V0ZXIsIGlubmVyLCBjb3VudCwgaW5kZXg7Ci0gICAgT01YX1MxNiAgICAgaGFsZlBlbFggPSAwLCBoYWxmUGVsWSA9IDAsIHgsIHk7Ci0gICAgT01YX0lOVCAgICAgY2FuZFNBRCwgcmVmU0FEID0gMDsKLSAgICBPTVhfSU5UICAgICBtaW5TQUQsIGZyb21YLCB0b1gsIGZyb21ZLCB0b1k7Ci0gICAgLyogT2Zmc2V0IHRvIHRoZSByZWZlcmVuY2UgYXQgdGhlIGJlZ2luaW5nIG9mIHRoZSBib3VuZGluZyBib3ggKi8KLSAgICBjb25zdCBPTVhfVTggICAgICAqcFRlbXBTcmNSZWZCdWY7Ci0gICAgT01YX1U4IHRlbXBQZWw7Ci0gICAgICAgIAotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmNSZWZCdWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBSZWZSZWN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjQ3VyckJ1ZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFNlYXJjaFBvaW50UmVmUG9zID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0TVYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgLyogUG9zaXRpb25pbmcgdGhlIHBvaW50ZXIgKi8KLSAgICBwVGVtcFNyY1JlZkJ1ZiA9IHBTcmNSZWZCdWYgKyAocmVmV2lkdGggKiAocFNyY0RzdE1WLT5keS8yKSkgKyAocFNyY0RzdE1WLT5keC8yKTsKLQotICAgIC8qIENvcHkgdGhlIGNhbmRpZGF0ZSB0byB0aGUgdGVtcG9yYXJ5IGxpbmVhciBhcnJheSAqLwotICAgIGZvciAob3V0ZXIgPSAwLCBjb3VudCA9IDAsaW5kZXggPSAwOwotICAgICAgICAgb3V0ZXIgPCBCbG9ja1NpemU7Ci0gICAgICAgICBvdXRlcisrLCBpbmRleCArPSByZWZXaWR0aCAtIEJsb2NrU2l6ZSkKLSAgICB7Ci0gICAgICAgIGZvciAoaW5uZXIgPSAwOyBpbm5lciA8IEJsb2NrU2l6ZTsgaW5uZXIrKywgY291bnQrKywgaW5kZXgrKykKLSAgICAgICAgewotICAgICAgICAgICAgcmVmU0FEICs9IGFybUFicyAocFRlbXBTcmNSZWZCdWZbaW5kZXhdIC0gcFNyY0N1cnJCdWZbY291bnRdKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFNldCB0aGUgbWluU2FkIGFzIHJlZmVyZW5jZSBTQUQgKi8KLSAgICBtaW5TQUQgPSByZWZTQUQ7Ci0gICAgKnBEc3RTQUQgPSByZWZTQUQ7Ci0KLSAgICAvKiBDaGVjayBmb3IgdmFsaWQgcmVnaW9uICovCi0gICAgZnJvbVggPSAxOwotICAgIHRvWCAgID0gMTsKLSAgICBmcm9tWSA9IDE7Ci0gICAgdG9ZICAgPSAxOwotICAgIGlmICgocFNlYXJjaFBvaW50UmVmUG9zLT54IC0gMSkgPCBwUmVmUmVjdC0+eCkKLSAgICB7Ci0gICAgICAgIGZyb21YID0gMDsKLSAgICB9Ci0KLSAgICBpZiAoKHBTZWFyY2hQb2ludFJlZlBvcy0+eCArIEJsb2NrU2l6ZSArIDEpID4gKHBSZWZSZWN0LT54ICsgcFJlZlJlY3QtPndpZHRoKSkKLSAgICB7Ci0gICAgICAgIHRvWCAgID0gMDsKLSAgICB9Ci0KLSAgICBpZiAoKHBTZWFyY2hQb2ludFJlZlBvcy0+eSAtIDEpIDwgcFJlZlJlY3QtPnkpCi0gICAgewotICAgICAgICBmcm9tWSA9IDA7Ci0gICAgfQotCi0gICAgaWYgKChwU2VhcmNoUG9pbnRSZWZQb3MtPnkgKyBCbG9ja1NpemUgKyAxKSA+IChwUmVmUmVjdC0+eSArIHBSZWZSZWN0LT5oZWlnaHQpKQotICAgIHsKLSAgICAgICAgdG9ZICAgPSAwOwotICAgIH0KLQotICAgIC8qIExvb3Bpbmcgb24geS0gYXhpcyAqLwotICAgIGZvciAoeSA9IC1mcm9tWTsgeSA8PSB0b1k7IHkrKykKLSAgICB7Ci0gICAgICAgIC8qIExvb3Bpbmcgb24geC0gYXhpcyAqLwotICAgICAgICBmb3IgKHggPSAtZnJvbVg7IHggPD0gdG9YOyB4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGNoZWNrIGZvciBpbnRlZ2VyIHBvc2l0aW9uICovCi0gICAgICAgICAgICBpZiAoIHggPT0gMCAmJiB5ID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBQb3NpdGlvbmluZyB0aGUgcG9pbnRlciAqLwotICAgICAgICAgICAgcFRlbXBTcmNSZWZCdWYgPSBwU3JjUmVmQnVmICsgKHJlZldpZHRoICogKHBTcmNEc3RNVi0+ZHkvMikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHBTcmNEc3RNVi0+ZHgvMik7Ci0KLSAgICAgICAgICAgIC8qIEludGVycG9sYXRlIHRoZSBwaXhlbCBhbmQgY2FsY3VsYXRlIHRoZSBTQUQqLwotICAgICAgICAgICAgZm9yIChvdXRlciA9IDAsIGNvdW50ID0gMCwgY2FuZFNBRCA9IDAsaW5kZXggPSAwOwotICAgICAgICAgICAgICAgICBvdXRlciA8IEJsb2NrU2l6ZTsKLSAgICAgICAgICAgICAgICAgb3V0ZXIrKywgaW5kZXggKz0gcmVmV2lkdGggLSBCbG9ja1NpemUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbm5lciA9IDA7IGlubmVyIDwgQmxvY2tTaXplOyBpbm5lcisrLCBjb3VudCsrLGluZGV4KyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0ZW1wUGVsID0gKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFNyY1JlZkJ1ZltpbmRleF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwVGVtcFNyY1JlZkJ1ZltpbmRleCArIHhdICogYXJtQWJzKHgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcFRlbXBTcmNSZWZCdWZbaW5kZXggKyByZWZXaWR0aCAqIHldICogYXJtQWJzKHkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcFRlbXBTcmNSZWZCdWZbaW5kZXggKyByZWZXaWR0aCAqIHkgKyB4XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYXJtQWJzKHgqeSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhcm1BYnMgKHgpICsgYXJtQWJzICh5KSAtIHJuZFZhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAvICgyICogKGFybUFicyAoeCkgKyBhcm1BYnMgKHkpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNhbmRTQUQgKz0gYXJtQWJzICh0ZW1wUGVsIC0gcFNyY0N1cnJCdWZbY291bnRdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIFJlc3VsdCBjYWxjdWxhdGlvbnMgKi8KLSAgICAgICAgICAgIGlmIChhcm1WQ000UDJfQ29tcGFyZU1WICh4LCB5LCBjYW5kU0FELCBoYWxmUGVsWCwgaGFsZlBlbFksIG1pblNBRCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBEc3RTQUQgPSBjYW5kU0FEOwotICAgICAgICAgICAgICAgIG1pblNBRCAgID0gY2FuZFNBRDsKLSAgICAgICAgICAgICAgICBoYWxmUGVsWCA9IHg7Ci0gICAgICAgICAgICAgICAgaGFsZlBlbFkgPSB5OwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gLyogRW5kIG9mIHgtIGF4aXMgKi8KLSAgICB9IC8qIEVuZCBvZiB5LWF4aXMgKi8KLQotICAgIHBTcmNEc3RNVi0+ZHggKz0gaGFsZlBlbFg7Ci0gICAgcFNyY0RzdE1WLT5keSArPSBoYWxmUGVsWTsKLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotCi19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjA1NjYwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIEJsb2NrIG1hdGNoaW5nLCBhIGZ1bGwgc2VhcmNoIGFsZ29yaXRobQotICogaXMgaW1wbGVtZW50ZWQKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIAotICogQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgaGFsZi1waXhlbCB1bml0cywgYW5kIAotICogdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgcmVxdWlyZWQsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2ggdGhlIAotICogaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIGZ1bmN0aW9ucyB0aGF0IGVpdGhlciBnZW5lcmF0ZSBvdXRwdXQgTVZzIG9yIGV4cGVjdCAKLSAqIGlucHV0IE1WcyByZXByZXNlbnRlZCB1c2luZyBpbnRlZ2VyIHBpeGVsIHVuaXRzLiAKLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dCXBTcmNSZWZCdWYJCXBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSBNQiB0aGF0IAotICogICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICAgICAgICAgIHBsYW5lLgotICogW2luXQlyZWZXaWR0aAkJICB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lCi0gKiBbaW5dCXBSZWZSZWN0CQkgIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlY3Rhbmd1bGFyIGluIHJlZmVyZW5jZSBwbGFuZS4gUmVsYXRpdmUgdG8gaW1hZ2Ugb3JpZ2luLiAKLSAqICAgICAgICAgICAgICAgICAgICBJdCdzIG5vdCBsaW1pdGVkIHRvIHRoZSBpbWFnZSBib3VuZGFyeSwgYnV0IGRlcGVuZGVkIG9uIHRoZSBwYWRkaW5nLiBGb3IgZXhhbXBsZSwgCi0gKiAgICAgICAgICAgICAgICAgICAgaWYgeW91IHBhZCA0IHBpeGVscyBvdXRzaWRlIHRoZSBpbWFnZSBib3JkZXIsIHRoZW4gdGhlIHZhbHVlIGZvciBsZWZ0IGJvcmRlciAKLSAqICAgICAgICAgICAgICAgICAgICBjYW4gYmUgLTQKLSAqIFtpbl0JcFNyY0N1cnJCdWYJCXBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAKLSAqICAgICAgICAgICAgICAgICAgICAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCi0gKiBbaW5dIHBDdXJyUG9pbnRQb3MJcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZQotICogW2luXSBwU3JjUHJlTVYJCSAgcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gcHJlZGljdGVkIE1WCi0gKiBbaW5dIHBTcmNQcmVTQUQJCXBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIGJ5IHBTcmNQcmVNVikKLSAqIFtpbl0gc2VhcmNoUmFuZ2UJCXNlYXJjaCByYW5nZSBmb3IgMTZYMTYgaW50ZWdlciBibG9jayx0aGUgdW5pdHMgb2YgaXQgaXMgZnVsbCBwaXhlbCx0aGUgc2VhcmNoIHJhbmdlIAotICogICAgICAgICAgICAgICAgICAgIGlzIHRoZSBzYW1lIGluIGFsbCBkaXJlY3Rpb25zLkl0IGlzIGluIGluY2x1c2l2ZSBvZiB0aGUgYm91bmRhcnkgYW5kIHNwZWNpZmllZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzLgotICogW2luXSBwTUVTcGVjCQkJICB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKLSAqICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nIAotICogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLgotICogW291dF0JcERzdE1WCQkJcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKLSAqIFtvdXRdCXBEc3RTQUQJCQlwb2ludGVyIHRvIG1pbmltdW0gU0FECi0gKgotICogUmV0dXJuIFZhbHVlOgotICogT01YX1N0c19Ob0VyciCoQyBubyBlcnJvci4KLSAqIE9NWF9TdHNfQmFkQXJnRXJyIKhDIGJhZCBhcmd1bWVudHMKLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIoCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCi0gICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCi0gICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCi0gICAgIHZvaWQgKnBNRVNwZWMsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCi0gICAgIE9NWF9JTlQgKnBEc3RTQUQsCi0gICAgIE9NWF9VOCBCbG9ja1NpemUKLSkKLXsKLQotICAgIC8qIERlZmluaXRpb25zIGFuZCBJbml0aWFsaXphdGlvbnMqLwotCi0gICAgT01YX0lOVCAgICAgb3V0ZXIsIGlubmVyLCBjb3VudCxpbmRleDsKLSAgICBPTVhfSU5UICAgICBjYW5kU0FEOwotICAgIC8qKDI1NioyNTYgKzEpIHRoaXMgaXMgdG8gbWFrZSB0aGUgU0FEIG1heCBpbml0aWFsbHkqLwotICAgIE9NWF9JTlQgICAgIG1pblNBRCA9IDB4MTAwMDEsIGZyb21YLCB0b1gsIGZyb21ZLCB0b1k7Ci0gICAgLyogT2Zmc2V0IHRvIHRoZSByZWZlcmVuY2UgYXQgdGhlIGJlZ2luaW5nIG9mIHRoZSBib3VuZGluZyBib3ggKi8KLSAgICBjb25zdCBPTVhfVTggICAgICAqcFRlbXBTcmNSZWZCdWY7Ci0gICAgT01YX1MxNiAgICAgeCwgeTsKLSAgICBPTVhfSU5UIHNlYXJjaFJhbmdlOwotICAgCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY1JlZkJ1ZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFJlZlJlY3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTcmNDdXJyQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQ3VyclBvaW50UG9zID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwTUVTcGVjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0TVYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgICAgICAKLSAgICBzZWFyY2hSYW5nZSA9ICgoT01YVkNNNFAyTUVQYXJhbXMgKilwTUVTcGVjKS0+c2VhcmNoUmFuZ2U7Ci0gICAgLyogQ2hlY2sgZm9yIHZhbGlkIHJlZ2lvbiAqLwotICAgIGZyb21YID0gc2VhcmNoUmFuZ2U7Ci0gICAgdG9YICAgPSBzZWFyY2hSYW5nZTsKLSAgICBmcm9tWSA9IHNlYXJjaFJhbmdlOwotICAgIHRvWSAgID0gc2VhcmNoUmFuZ2U7Ci0KLSAgICBpZiAoKHBDdXJyUG9pbnRQb3MtPnggLSBzZWFyY2hSYW5nZSkgPCBwUmVmUmVjdC0+eCkKLSAgICB7Ci0gICAgICAgIGZyb21YID0gIHBDdXJyUG9pbnRQb3MtPnggLSBwUmVmUmVjdC0+eDsKLSAgICB9Ci0KLSAgICBpZiAoKHBDdXJyUG9pbnRQb3MtPnggKyBCbG9ja1NpemUgKyBzZWFyY2hSYW5nZSkgPiAocFJlZlJlY3QtPnggKyBwUmVmUmVjdC0+d2lkdGgpKQotICAgIHsKLSAgICAgICAgdG9YICAgPSBwUmVmUmVjdC0+d2lkdGggLSAocEN1cnJQb2ludFBvcy0+eCAtIHBSZWZSZWN0LT54KSAtIEJsb2NrU2l6ZTsKLSAgICB9Ci0KLSAgICBpZiAoKHBDdXJyUG9pbnRQb3MtPnkgLSBzZWFyY2hSYW5nZSkgPCBwUmVmUmVjdC0+eSkKLSAgICB7Ci0gICAgICAgIGZyb21ZID0gcEN1cnJQb2ludFBvcy0+eSAtIHBSZWZSZWN0LT55OwotICAgIH0KLQotICAgIGlmICgocEN1cnJQb2ludFBvcy0+eSArIEJsb2NrU2l6ZSArIHNlYXJjaFJhbmdlKSA+IChwUmVmUmVjdC0+eSArIHBSZWZSZWN0LT5oZWlnaHQpKQotICAgIHsKLSAgICAgICAgdG9ZICAgPSBwUmVmUmVjdC0+d2lkdGggLSAocEN1cnJQb2ludFBvcy0+eSAtIHBSZWZSZWN0LT55KSAtIEJsb2NrU2l6ZTsKLSAgICB9Ci0KLSAgICBwRHN0TVYtPmR4ID0gLWZyb21YOwotICAgIHBEc3RNVi0+ZHkgPSAtZnJvbVk7Ci0gICAgLyogTG9vcGluZyBvbiB5LSBheGlzICovCi0gICAgZm9yICh5ID0gLWZyb21ZOyB5IDw9IHRvWTsgeSsrKQotICAgIHsKLQotICAgICAgICAvKiBMb29waW5nIG9uIHgtIGF4aXMgKi8KLSAgICAgICAgZm9yICh4ID0gLWZyb21YOyB4IDw9IHRvWDsgeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBQb3NpdGlvbmluZyB0aGUgcG9pbnRlciAqLwotICAgICAgICAgICAgcFRlbXBTcmNSZWZCdWYgPSBwU3JjUmVmQnVmICsgKHJlZldpZHRoICogeSkgKyB4OwotCi0gICAgICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIFNBRCAqLwotICAgICAgICAgICAgZm9yIChvdXRlciA9IDAsIGNvdW50ID0gMCwgaW5kZXggPSAwLCBjYW5kU0FEID0gMDsKLSAgICAgICAgICAgICAgICAgb3V0ZXIgPCBCbG9ja1NpemU7Ci0gICAgICAgICAgICAgICAgIG91dGVyKyssIGluZGV4ICs9IHJlZldpZHRoIC0gQmxvY2tTaXplKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoaW5uZXIgPSAwOyBpbm5lciA8IEJsb2NrU2l6ZTsgaW5uZXIrKywgY291bnQrKywgaW5kZXgrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbmRTQUQgKz0gYXJtQWJzIChwVGVtcFNyY1JlZkJ1ZltpbmRleF0gLSBwU3JjQ3VyckJ1Zltjb3VudF0pOyAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBSZXN1bHQgY2FsY3VsYXRpb25zICovCi0gICAgICAgICAgICBpZiAoYXJtVkNNNFAyX0NvbXBhcmVNViAoeCwgeSwgY2FuZFNBRCwgcERzdE1WLT5keC8yLCBwRHN0TVYtPmR5LzIsIG1pblNBRCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBEc3RTQUQgPSBjYW5kU0FEOwotICAgICAgICAgICAgICAgIG1pblNBRCAgID0gY2FuZFNBRDsKLSAgICAgICAgICAgICAgICBwRHN0TVYtPmR4ID0geCoyOwotICAgICAgICAgICAgICAgIHBEc3RNVi0+ZHkgPSB5KjI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSAvKiBFbmQgb2YgeC0gYXhpcyAqLwotICAgIH0gLyogRW5kIG9mIHktYXhpcyAqLwotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci0KLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNTEwZTcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZSBmb3IgVkxDIGVzY2FwZSBtb2RlIGNoZWNrIAotICoKLSAqLyAKLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGVzY2FwZSBtb2RlIGRlY2lzaW9uIGJhc2VkIG9uIHRoZSBydW4sIHJ1bissIGxldmVsLCBsZXZlbCsgYW5kIAotICogbGFzdCBjb21iaW5hdGlvbnMuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBydW4gICAgICAgICAgICAgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgdG8gYmUgZW5jb2RlZCAgCi0gKiBbaW5dIGxldmVsICAgICAgICAgICBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpIHRvIGJlIGVuY29kZWQKLSAqIFtpbl0gcnVuUGx1cyAgICAgICAgIENhbGN1bGF0ZWQgYXMgcnVuUGx1cyA9IHJ1biAtIChSTUFYICsgMSkgIAotICogW2luXSBsZXZlbFBsdXMgICAgICAgQ2FsY3VsYXRlZCBhcyAKLSAqICAgICAgICAgICAgICAgICAgICAgIGxldmVsUGx1cyA9IHNpZ24obGV2ZWwpKlthYnMobGV2ZWwpIC0gTE1BWF0KLSAqIFtpbl0gbWF4U3RvcmVSdW4gICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCi0gKiBbaW5dIG1heFJ1bkZvck11bHRpcGxlRW50cmllcyAKLSAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCi0gKiAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGVxdWFsIHRvIDE6IAotICogICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKLSAqIFtpbl0gcFJ1bkluZGV4VGFibGUgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCi0gKiAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQotICoKLSAqICAgICAgICAgICAgICAgICAgICAgIAotICogUmV0dXJuIFZhbHVlOgotICogUmV0dXJucyBhbiBFc2NhcGUgbW9kZSB3aGljaCBjYW4gdGFrZSB2YWx1ZXMgZnJvbSAwIHRvIDMKLSAqIDAgLS0+IG5vIGVzY2FwZSBtb2RlLCAxIC0tPiBlc2NhcGUgdHlwZSAxLAotICogMSAtLT4gZXNjYXBlIHR5cGUgMiwgMyAtLT4gZXNjYXBlIHR5cGUgMywgY2hlY2sgc2VjdGlvbiA3LjQuMS4zCi0gKiBpbiB0aGUgTVBFRyBJU08gc3RhbmRhcmQuCi0gKgotICovCi0KLU9NWF9VOCBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlKAotICAgICBPTVhfVTMyIHJ1biwKLSAgICAgT01YX1UzMiBydW5QbHVzLAotICAgICBPTVhfUzE2IGxldmVsLAotICAgICBPTVhfUzE2IGxldmVsUGx1cywKLSAgICAgT01YX1U4ICBtYXhTdG9yZVJ1biwKLSAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMsCi0gICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgY29uc3QgT01YX1U4ICAqcFJ1bkluZGV4VGFibGUKLSkKLXsKLSAgICBPTVhfVTggZXNjYXBlID0gMCwgZk1vZGUgPSAwLCBlbnRyaWVzOwotICAgIAotICAgIGxldmVsID0gYXJtQWJzIChsZXZlbCk7Ci0gICAgbGV2ZWxQbHVzID0gYXJtQWJzIChsZXZlbFBsdXMpOwotICAgIAotICAgIC8qIENoZWNrIGZvciBhIHZhbGlkIGVudHJ5IHdpdGggcnVuLCBsZXZlbCBhbmQgTGFzdCBjb21iaW5hdGlvbiAKLSAgICAgICBNb2RlIDAgY2hlY2sgKi8KLSAgICBpZiAocnVuIDw9IG1heFN0b3JlUnVuKQotICAgIHsKLSAgICAgICAgZW50cmllcyA9IHBSdW5JbmRleFRhYmxlW3J1biArIDFdCi0gICAgICAgICAgICAgICAgICAtIHBSdW5JbmRleFRhYmxlW3J1bl07Ci0gICAgICAgIGlmIChydW4gPiBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJpZXMgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsZXZlbCA+IGVudHJpZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVzY2FwZSA9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZXNjYXBlID0gMTsKLSAgICB9Ci0gICAgaWYoZXNjYXBlICYmIHNob3J0VmlkZW9IZWFkZXIpCi0gICAgewotICAgICAgICBlc2NhcGUgPSAwOwotICAgICAgICBmTW9kZSA9IDQ7Ci0gICAgfQotICAgIC8qIENoZWNrIGZvciBhIHZhbGlkIGVudHJ5IHdpdGggcnVuLCBsZXZlbFBsdXMgYW5kIExhc3QgY29tYmluYXRpb24gCi0gICAgICAgTW9kZSAxIGNoZWNrICovICAgIAotICAgIGlmIChlc2NhcGUpCi0gICAgewotICAgICAgICBlc2NhcGUgPSAwOwotICAgICAgICBmTW9kZSA9IDE7Ci0gICAgICAgIGlmIChydW4gPD0gbWF4U3RvcmVSdW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJpZXMgPSBwUnVuSW5kZXhUYWJsZVtydW4gKyAxXQotICAgICAgICAgICAgICAgICAgICAgIC0gcFJ1bkluZGV4VGFibGVbcnVuXTsKLSAgICAgICAgICAgIGlmIChydW4gPiBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW50cmllcyA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobGV2ZWxQbHVzID4gZW50cmllcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlc2NhcGUgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZXNjYXBlID0gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKiBDaGVjayBmb3IgYSB2YWxpZCBlbnRyeSB3aXRoIHJ1blBsdXMsIGxldmVsIGFuZCBMYXN0IGNvbWJpbmF0aW9uIAotICAgICAgIE1vZGUgMiBjaGVjayAqLyAgICAKLSAgICBpZiAoZXNjYXBlKQotICAgIHsKLSAgICAgICAgZXNjYXBlID0gMDsKLSAgICAgICAgZk1vZGUgPSAyOwotICAgICAgICBpZiAocnVuUGx1cyA8PSBtYXhTdG9yZVJ1bikKLSAgICAgICAgewotICAgICAgICAgICAgZW50cmllcyA9IHBSdW5JbmRleFRhYmxlW3J1blBsdXMgKyAxXQotICAgICAgICAgICAgICAgICAgICAgIC0gcFJ1bkluZGV4VGFibGVbcnVuUGx1c107Ci0gICAgICAgICAgICBpZiAocnVuUGx1cyA+IG1heFJ1bkZvck11bHRpcGxlRW50cmllcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbnRyaWVzID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsZXZlbCA+IGVudHJpZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXNjYXBlID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVzY2FwZSA9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyogc2VsZWN0IG1vZGUgMyAtLT4gRkxDICovCi0gICAgaWYgKGVzY2FwZSkKLSAgICB7Ci0gICAgICAgIGZNb2RlID0gMzsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGZNb2RlOwotfQotCi0vKkVuZCBvZiBGaWxlKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ29tcGFyZU1WLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Db21wYXJlTVYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I2MjFhMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Db21wYXJlTVYuYworKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfQ29tcGFyZU1WLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGUgZm9yIGNvbXBhcmluZyBtb3Rpb24gdmVjdG9ycyBhbmQgU0FEJ3MgdG8gZGVjaWRlIAotICogdGhlIGJlc3QgTVYgYW5kIFNBRAotICoKLSAqLwotICAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9Db21wYXJlTVYKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGNvbXBhcmlzaW9uIG9mIG1vdGlvbiB2ZWN0b3JzIGFuZCBTQUQncyB0byBkZWNpZGUgdGhlIAotICogYmVzdCBNViBhbmQgU0FECi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQkgICAgbXZYCQl4IGNvb3JkaW5hdGUgb2YgdGhlIGNhbmRpZGF0ZSBtb3Rpb24gdmVjdG9yCi0gKiBbaW5dCSAgICBtdlkJCXkgY29vcmRpbmF0ZSBvZiB0aGUgY2FuZGlkYXRlIG1vdGlvbiB2ZWN0b3IKLSAqIFtpbl0JICAgIGNhbmRTQUQJQ2FuZGlkYXRlIFNBRAotICogW2luXQkgICAgYmVzdE1WWAl4IGNvb3JkaW5hdGUgb2YgdGhlIGJlc3QgbW90aW9uIHZlY3RvcgotICogW2luXQkgICAgYmVzdE1WWQl5IGNvb3JkaW5hdGUgb2YgdGhlIGJlc3QgbW90aW9uIHZlY3RvcgotICogW2luXQkgICAgYmVzdFNBRAliZXN0IFNBRAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIE9NWF9JTlQgLS0gMSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHNhZCBpcyB0aGUgYmVzdCAKLSAqICAgICAgICAgICAgMCB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIE5PVCB0aGUgYmVzdCBTQUQKLSAqLwotCi1PTVhfSU5UIGFybVZDTTRQMl9Db21wYXJlTVYgKAotICAgIE9NWF9TMTYgbXZYLCAKLSAgICBPTVhfUzE2IG12WSwgCi0gICAgT01YX0lOVCBjYW5kU0FELCAKLSAgICBPTVhfUzE2IGJlc3RNVlgsIAotICAgIE9NWF9TMTYgYmVzdE1WWSwgCi0gICAgT01YX0lOVCBiZXN0U0FECi0pIAotewotICAgIGlmIChjYW5kU0FEIDwgYmVzdFNBRCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBpZiAoY2FuZFNBRCA+IGJlc3RTQUQpCi0gICAgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgLyogc2hvcnRlciBtb3Rpb24gdmVjdG9yICovCi0gICAgaWYgKCAobXZYICogbXZYICsgbXZZICogbXZZKSA8IChiZXN0TVZYKmJlc3RNVlgrYmVzdE1WWSpiZXN0TVZZKSApCi0gICAgewotICAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0vKkVuZCBvZiBGaWxlKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RDVF9UYWJsZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRENUX1RhYmxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMDU1ZDkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRENUX1RhYmxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotIC8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfRENUX1RhYmxlLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX0RDVF9UYWJsZS5jCi0gKiBEZXNjcmlwdGlvbjogQ29udGFpbnMgdGhlIERDVC9JRENUIGNvZWZmaWNlbnQgbWF0cml4Ci0gKgotICovCi0KLSNpZm5kZWYgX09NWERDVENPU1RBQl9DXwotI2RlZmluZSBfT01YRENUQ09TVEFCX0NfCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotCi1jb25zdCBPTVhfRjY0IGFybVZDTTRQMl9wcmVDYWxjRENUQ29zWzhdWzhdID0KLXsKLSAgICAgICAgewotICAgICAgICAgICAgICAgIDAuMzUzNTUzMzkwNTkzMjczNzMwLCAKLSAgICAgICAgICAgICAgICAwLjQ5MDM5MjY0MDIwMTYxNTIyMCwgCi0gICAgICAgICAgICAgICAgMC40NjE5Mzk3NjYyNTU2NDMzNzAsIAotICAgICAgICAgICAgICAgIDAuNDE1NzM0ODA2MTUxMjcyNjIwLCAKLSAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3Mzc5MCwgCi0gICAgICAgICAgICAgICAgMC4yNzc3ODUxMTY1MDk4MDExNDAsIAotICAgICAgICAgICAgICAgIDAuMTkxMzQxNzE2MTgyNTQ0OTIwLCAKLSAgICAgICAgICAgICAgICAwLjA5NzU0NTE2MTAwODA2NDE1MiAKLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICAgICAgIDAuMzUzNTUzMzkwNTkzMjczNzMwLCAKLSAgICAgICAgICAgICAgICAwLjQxNTczNDgwNjE1MTI3MjYyMCwgCi0gICAgICAgICAgICAgICAgMC4xOTEzNDE3MTYxODI1NDQ5MjAsIAotICAgICAgICAgICAgICAgIC0wLjA5NzU0NTE2MTAwODA2NDA5NiwgCi0gICAgICAgICAgICAgICAgLTAuMzUzNTUzMzkwNTkzMjczNzMwLCAKLSAgICAgICAgICAgICAgICAtMC40OTAzOTI2NDAyMDE2MTUyMjAsIAotICAgICAgICAgICAgICAgIC0wLjQ2MTkzOTc2NjI1NTY0MzQyMCwgCi0gICAgICAgICAgICAgICAgLTAuMjc3Nzg1MTE2NTA5ODAxMDkwCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3MzczMCwgCi0gICAgICAgICAgICAgICAgMC4yNzc3ODUxMTY1MDk4MDExNDAsIAotICAgICAgICAgICAgICAgIC0wLjE5MTM0MTcxNjE4MjU0NDg2MCwgCi0gICAgICAgICAgICAgICAgLTAuNDkwMzkyNjQwMjAxNjE1MjIwLCAKLSAgICAgICAgICAgICAgICAtMC4zNTM1NTMzOTA1OTMyNzM4NDAsIAotICAgICAgICAgICAgICAgIDAuMDk3NTQ1MTYxMDA4MDY0MTM4LCAKLSAgICAgICAgICAgICAgICAwLjQ2MTkzOTc2NjI1NTY0MzI2MCwgCi0gICAgICAgICAgICAgICAgMC40MTU3MzQ4MDYxNTEyNzI3MzAgCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3MzczMCwgCi0gICAgICAgICAgICAgICAgMC4wOTc1NDUxNjEwMDgwNjQxNTIsIAotICAgICAgICAgICAgICAgIC0wLjQ2MTkzOTc2NjI1NTY0MzM3MCwgCi0gICAgICAgICAgICAgICAgLTAuMjc3Nzg1MTE2NTA5ODAxMDkwLCAKLSAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3MzY4MCwgCi0gICAgICAgICAgICAgICAgMC40MTU3MzQ4MDYxNTEyNzI3MzAsIAotICAgICAgICAgICAgICAgIC0wLjE5MTM0MTcxNjE4MjU0NDkyMCwgCi0gICAgICAgICAgICAgICAgLTAuNDkwMzkyNjQwMjAxNjE1MzMwCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3MzczMCwgCi0gICAgICAgICAgICAgICAgLTAuMDk3NTQ1MTYxMDA4MDY0MDk2LCAKLSAgICAgICAgICAgICAgICAtMC40NjE5Mzk3NjYyNTU2NDM0MjAsIAotICAgICAgICAgICAgICAgIDAuMjc3Nzg1MTE2NTA5ODAwOTIwLCAKLSAgICAgICAgICAgICAgICAwLjM1MzU1MzM5MDU5MzI3Mzg0MCwgCi0gICAgICAgICAgICAgICAgLTAuNDE1NzM0ODA2MTUxMjcyNjIwLCAKLSAgICAgICAgICAgICAgICAtMC4xOTEzNDE3MTYxODI1NDUyODAsIAotICAgICAgICAgICAgICAgIDAuNDkwMzkyNjQwMjAxNjE1MjIwIAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgMC4zNTM1NTMzOTA1OTMyNzM3MzAsIAotICAgICAgICAgICAgICAgIC0wLjI3Nzc4NTExNjUwOTgwMDk4MCwgCi0gICAgICAgICAgICAgICAgLTAuMTkxMzQxNzE2MTgyNTQ1MTcwLCAKLSAgICAgICAgICAgICAgICAwLjQ5MDM5MjY0MDIwMTYxNTIyMCwgCi0gICAgICAgICAgICAgICAgLTAuMzUzNTUzMzkwNTkzMjczMzQwLCAKLSAgICAgICAgICAgICAgICAtMC4wOTc1NDUxNjEwMDgwNjQwMTMsIAotICAgICAgICAgICAgICAgIDAuNDYxOTM5NzY2MjU1NjQzMzcwLCAKLSAgICAgICAgICAgICAgICAtMC40MTU3MzQ4MDYxNTEyNzI1MTAKLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICAgICAgIDAuMzUzNTUzMzkwNTkzMjczNzMwLCAKLSAgICAgICAgICAgICAgICAtMC40MTU3MzQ4MDYxNTEyNzI2NzAsIAotICAgICAgICAgICAgICAgIDAuMTkxMzQxNzE2MTgyNTQ1MDAwLCAKLSAgICAgICAgICAgICAgICAwLjA5NzU0NTE2MTAwODA2NDM4OCwgCi0gICAgICAgICAgICAgICAgLTAuMzUzNTUzMzkwNTkzMjczNjIwLCAKLSAgICAgICAgICAgICAgICAwLjQ5MDM5MjY0MDIwMTYxNTMzMCwgCi0gICAgICAgICAgICAgICAgLTAuNDYxOTM5NzY2MjU1NjQzMjAwLCAKLSAgICAgICAgICAgICAgICAwLjI3Nzc4NTExNjUwOTgwMDc2MCAKLSAgICAgICAgfSwKLSAgICAgICAgewotICAgICAgICAgICAgICAgIDAuMzUzNTUzMzkwNTkzMjczNzMwLCAKLSAgICAgICAgICAgICAgICAtMC40OTAzOTI2NDAyMDE2MTUyMjAsIAotICAgICAgICAgICAgICAgIDAuNDYxOTM5NzY2MjU1NjQzMjYwLCAKLSAgICAgICAgICAgICAgICAtMC40MTU3MzQ4MDYxNTEyNzI2MjAsIAotICAgICAgICAgICAgICAgIDAuMzUzNTUzMzkwNTkzMjczMjkwLCAKLSAgICAgICAgICAgICAgICAtMC4yNzc3ODUxMTY1MDk4MDA3NjAsIAotICAgICAgICAgICAgICAgIDAuMTkxMzQxNzE2MTgyNTQ0NzgwLCAKLSAgICAgICAgICAgICAgICAtMC4wOTc1NDUxNjEwMDgwNjQyNzcKLSAgICAgICAgfQotfTsKLQotI2VuZGlmIC8qX09NWERDVENPU1RBQl9DXyovCi0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfaW50cmEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19pbnRyYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWFhMTk4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19pbnRyYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX2ludHJhLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGVzIGZvciBmaWxsaW5nIG9mIHRoZSBjb2VmZmljaWVudCBidWZmZXIKLSAqCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCIKLSNpbmNsdWRlICJhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIgotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50cmEgY29kZWQgYmxvY2suCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyCi0gKiBbaW5dIHBCaXRPZmZzZXQgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMC03XS4KLSAqIFtpbl0gcHJlZERpciAgICAgICAgIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB6aWd6YWcgc2NhbiBwYXR0ZXJuLiBJdCB0YWtlcyBvbmUgb2YgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WQ19OT05FICBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkOwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybSBjbGFzc2ljYWwgemlnemFnIHNjYW47Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WQ19IT1JJWk9OVEFMICAgIEhvcml6b250YWwgcHJlZGljdGlvbjsKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybSBhbHRlcm5hdGUtdmVydGljYWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW47Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTCAgICAgIFZlcnRpY2FsIHByZWRpY3Rpb247Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRodXMgcGVyZm9ybQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGUtaG9yaXpvbnRhbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KLSAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAwdGggZWxlbWVudAotICogICAgICAgICAgICAgICAgICAgICAgb3IgMXN0LgotICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgotICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCi0gKiBbb3V0XSAgICBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYSgKLSAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLSAgICAgT01YX1MxNiAqIHBEc3QsCi0gICAgIE9NWF9VOCBwcmVkRGlyLAotICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgIE9NWF9VOCAgc3RhcnQKLSkKLXsKLSAgICBPTVhfVTggIGxhc3QgPSAwOwotICAgIGNvbnN0IE9NWF9VOCAgKnBaaWd6YWdUYWJsZSA9IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbjsKLSAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOwotICAgIAotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigqcHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCaXRPZmZzZXQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczRCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCgqcEJpdE9mZnNldCA8IDApIHx8ICgqcEJpdE9mZnNldCA+NyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigocHJlZERpciA+IDIpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICBzd2l0Y2ggKHByZWREaXIpCi0gICAgewotICAgICAgICBjYXNlIE9NWF9WQ19OT05FOgotICAgICAgICB7Ci0gICAgICAgICAgICBwWmlnemFnVGFibGUgPSBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW47Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgT01YX1ZDX0hPUklaT05UQUw6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHBaaWd6YWdUYWJsZSA9IGFybVZDTTRQMl9hVmVydGljYWxaaWd6YWdTY2FuOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE9NWF9WQ19WRVJUSUNBTDoKLSAgICAgICAgewotICAgICAgICAgICAgcFppZ3phZ1RhYmxlID0gYXJtVkNNNFAyX2FIb3Jpem9udGFsWmlnemFnU2NhbjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIGVycm9yQ29kZSA9IGFybVZDTTRQMl9HZXRWTENCaXRzICgKLSAgICAgICAgICAgICAgcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICAgIHBCaXRPZmZzZXQsCi0JCQkgIHBEc3QsCi0JCQkgIHNob3J0VmlkZW9IZWFkZXIsCi0JCQkgIHN0YXJ0LAotCQkJICAmbGFzdCwKLQkJCSAgMTAsCi0JCQkgIDYyLAotCQkJICAgNywKLQkJCSAgMjEsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwwUnVuSWR4LAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFWbGNMMCwKLQkJCSAgYXJtVkNNNFAyX0ludHJhTDFSdW5JZHgsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYVZsY0wxLAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMExNQVgsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwxTE1BWCwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBSTUFYLAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMVJNQVgsCi0gICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSApOwotICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIAotICAgIGlmIChsYXN0ID09IDApCi0gICAgewotICAgICAgICByZXR1cm4gT01YX1N0c19FcnI7Ci0gICAgfQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfaW50cmEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19pbnRyYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjFjNTQ3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19pbnRyYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX2ludHJhLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZwotICogZm9yIGludHJhIGJsb2NrLgotICoKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIgotI2luY2x1ZGUgImFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgiCi0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZyBmb3Igb25lIGludHJhIGJsb2NrLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcHBCaXRTdHJlYW0gICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0IHN0cmVhbQotICogW2luXSBwQml0T2Zmc2V0ICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LgotICogW2luXSBwUURjdEJsa0NvZWYgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudAotICogW2luXSBwcmVkRGlyICAgICAgICAgQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24sIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB6aWd6YWcgc2NhbiBwYXR0ZXJuLiBUaGlzIHRha2VzIG9uZSBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHZhbHVlczoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX05PTkUgICAgICAgICAgQUMgcHJlZGljdGlvbiBub3QgdXNlZC4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAgICBIb3Jpem9udGFsIHByZWRpY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMICAgICAgVmVydGljYWwgcHJlZGljdGlvbi4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCi0gKiBbaW5dIHBhdHRlcm4gICAgICAgICBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBibG9jayBpcyBlbmNvZGVkCi0gKiBbaW5dIHN0YXJ0ICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggMHRoIGVsZW1lbnQKLSAqICAgICAgICAgICAgICAgICAgICAgIG9yIDFzdC4KLSAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLU9NWFJlc3VsdCBhcm1WQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhKAotICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAotICAgICBPTVhfVTggcHJlZERpciwKLSAgICAgT01YX1U4IHBhdHRlcm4sCi0gICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgT01YX1U4IHN0YXJ0Ci0pCi17Ci0gICAgY29uc3QgT01YX1U4ICAqcFppZ3phZ1RhYmxlID0gYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuOwotICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7Ci0gICAgCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCpwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJpdE9mZnNldCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFFEY3RCbGtDb2VmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoKnBCaXRPZmZzZXQgPCAwKSB8fCAoKnBCaXRPZmZzZXQgPjcpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoc3RhcnQgPiAxLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocHJlZERpciA+IDIsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIGlmIChwYXR0ZXJuKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChwcmVkRGlyKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE9NWF9WQ19OT05FOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSA9IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBPTVhfVkNfSE9SSVpPTlRBTDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwWmlnemFnVGFibGUgPSBhcm1WQ000UDJfYVZlcnRpY2FsWmlnemFnU2NhbjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBPTVhfVkNfVkVSVElDQUw6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFppZ3phZ1RhYmxlID0gYXJtVkNNNFAyX2FIb3Jpem9udGFsWmlnemFnU2NhbjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZXJyb3JDb2RlID0gYXJtVkNNNFAyX1B1dFZMQ0JpdHMgKAotICAgICAgICAgICAgICBwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgcEJpdE9mZnNldCwKLSAgICAgICAgICAgICAgcFFEY3RCbGtDb2VmLAotICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLAotICAgICAgICAgICAgICBzdGFydCwKLSAgICAgICAgICAgICAgMTQsCi0gICAgICAgICAgICAgIDIwLAotICAgICAgICAgICAgICA5LAotICAgICAgICAgICAgICA2LAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMFJ1bklkeCwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhVmxjTDAsCi0JCQkgIGFybVZDTTRQMl9JbnRyYUwxUnVuSWR4LAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFWbGNMMSwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMTUFYLAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50cmFMMUxNQVgsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRyYUwwUk1BWCwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDFSTUFYLAotICAgICAgICAgICAgICBwWmlnemFnVGFibGUKLSAgICAgICAgKTsKLSAgICAgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgICAgIAotICAgIH0gLyogUGF0dGVybiBjaGVjayBlbmRzKi8KLQotICAgIHJldHVybiAoT01YX1N0c19Ob0Vycik7Ci0KLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViNzcxNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9GaWxsVkxDQnVmZmVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9GaWxsVkxDQnVmZmVyLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGUgZm9yIHB1dHRpbmcgVkxDIGJpdHMKLSAqCi0gKi8gCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9GaWxsVkxDQnVmZmVyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBjYWxjdWxhdGluZyB0aGUgVkxDIGJpdHMgZGVwZW5kaW5nIG9uIHRoZSBlc2NhcGUgdHlwZSBhbmQgaW5zZXJ0IAotICogdGhlIHNhbWUgaW4gdGhlIGJpdHN0cmVhbQotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JIHBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KLSAqCSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtCi0gKiBbaW5dCSBwQml0T2Zmc2V0ICAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKLSAqIFtpbl0gIHJ1biAgICAgICAgICAgICAgICBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSB0byBiZSBlbmNvZGVkICAKLSAqIFtpbl0gIGxldmVsICAgICAgICAgICAgICBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpIHRvIGJlIGVuY29kZWQKLSAqIFtpbl0gIHJ1blBsdXMgICAgICAgICAgICBDYWxjdWxhdGVkIGFzIHJ1blBsdXMgPSBydW4gLSAoUk1BWCArIDEpICAKLSAqIFtpbl0gIGxldmVsUGx1cyAgICAgICAgICBDYWxjdWxhdGVkIGFzIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsUGx1cyA9IHNpZ24obGV2ZWwpKlthYnMobGV2ZWwpIC0gTE1BWF0KLSAqIFtpbl0gIGZNb2RlICAgICAgICAgICAgICBGbGFnIGluZGljYXRpbmcgdGhlIGVzY2FwZSBtb2RlcwotICogW2luXSAgbGFzdCAgICAgICAgICAgICAgIHN0YXR1cyBvZiB0aGUgbGFzdCBmbGFnCi0gKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCB3aWxsIGJlIGVxdWFsIHRvIDE6IAotICogICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCi0gKiBbaW5dICBwUnVuSW5kZXhUYWJsZSAgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKLSAqIFtpbl0gIHBWbGNUYWJsZSAgICAgICAgICBWTEMgdGFibGUgZGVmaW5lZCBpbiBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKLSAqIFtvdXRdIHBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCi0gKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIgKAotICAgICAgICAgICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICAgIE9NWF9VMzIgcnVuLAotICAgICAgICAgICAgICBPTVhfUzE2IGxldmVsLCAKLQkJCSAgT01YX1UzMiBydW5QbHVzLAotICAgICAgICAgICAgICBPTVhfUzE2IGxldmVsUGx1cywgCi0gICAgICAgICAgICAgIE9NWF9VOCAgZk1vZGUsCi0JCQkgIE9NWF9VOCAgbGFzdCwKLSAgICAgICAgICAgICAgT01YX1U4ICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMsIAotICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICpwUnVuSW5kZXhUYWJsZSwKLSAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGUKLSkKLXsKLSAgICBPTVhfSU5UIHRlbXBJbmRleDsKLQlPTVhfVTMyIHRlbXBSdW4gPSBydW4sIHNpZ24gPSAwOwotICAgIE9NWF9TMTYgdGVtcExldmVsID0gbGV2ZWw7IAotICAgIAotICAgIC8qIEVzY2FwZSBzZXF1ZW5jZSBhZGRpdGlvbiAqLwotICAgIGlmIChmTW9kZSA9PSAxKQotICAgIHsKLSAgICAgICAgYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDMsIDcpOwotICAgICAgICBhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMCwgMSk7Ci0JCXRlbXBMZXZlbCA9IGxldmVsUGx1czsKLQotICAgIH0KLSAgICBlbHNlIGlmKGZNb2RlID09IDIpCi0gICAgewotICAgICAgICBhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMywgNyk7Ci0gICAgICAgIGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAyLCAyKTsKLQkJdGVtcFJ1biA9IHJ1blBsdXM7Ci0gICAgfQotICAgIGVsc2UgaWYgKGZNb2RlID09IDMpCi0gICAgewotICAgICAgICBhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMywgNyk7Ci0gICAgICAgIGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAzLCAyKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZk1vZGUgPT0gNCkKLSAgICB7Ci0gICAgICAgIGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAzLCA3KTsKLSAgICAgICAgYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIChPTVhfVTMyKWxhc3QsIDEpOwotCQlhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgdGVtcFJ1biwgNik7Ci0JCWlmKCh0ZW1wTGV2ZWwgIT0gMCkgJiYgKHRlbXBMZXZlbCAhPSAtMTI4KSkKLQkJewotCQkgICAgYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsCi0JCQkgICAoT01YX1UzMikgdGVtcExldmVsLCA4KTsKLQkJfQotCQlyZXR1cm4gT01YX1N0c19Ob0VycjsJCQotICAgIH0KLSAgICAKLSAgICBpZiAodGVtcExldmVsIDwgMCkKLSAgICB7Ci0gICAgICAgIHNpZ24gPSAxOwotICAgICAgICB0ZW1wTGV2ZWwgPSBhcm1BYnModGVtcExldmVsKTsKLSAgICB9Ci0gICAgLyogUHV0dGluZyBWTEMgYml0cyBpbiB0aGUgc3RyZWFtICovCi0JaWYgKGZNb2RlIDwgMykKLQl7Ci0JCWlmICh0ZW1wUnVuID4gbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzKQotCQl7Ci0JCQl0ZW1wSW5kZXggPSBwUnVuSW5kZXhUYWJsZSBbbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzICsgMV0gKyAKLQkJCQkJCSh0ZW1wUnVuIC0gbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzIC0gMSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQl0ZW1wSW5kZXggPSBwUnVuSW5kZXhUYWJsZSBbdGVtcFJ1bl0gKyAodGVtcExldmVsIC0xKTsKLQkJfQotICAgIAotCQlhcm1QYWNrVkxDMzIgKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LAotCQkJCQkgIHBWbGNUYWJsZSBbdGVtcEluZGV4XSk7Ci0JCWFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAoT01YX1UzMilzaWduLCAxKTsKLQl9Ci0gICAgZWxzZQotCXsKLQkJaWYgKHNpZ24pCi0JCXsKLQkJCXRlbXBMZXZlbCA9IC10ZW1wTGV2ZWw7Ci0JCX0KLQkJdGVtcFJ1biAgPSBydW47Ci0JCWFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAoT01YX1UzMilsYXN0LCAxKTsKLQkJYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHRlbXBSdW4sIDYpOwotCQlhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMSwgMSk7Ci0JCWFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LAotCQkJICAgKE9NWF9VMzIpIHRlbXBMZXZlbCwgMTIpOwotCQlhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMSwgMSk7Ci0JfQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKkVuZCBvZiBGaWxlKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRmlsbFZMREJ1ZmZlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRmlsbFZMREJ1ZmZlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDlmNWQ1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlci5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlIGZvciBWTEMgZ2V0IGJpdHMgZnJvbSB0aGUgc3RyZWFtIAotICoKLSAqLyAKLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSNpbmNsdWRlICJhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIgotCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBmaWxsaW5nIG9mIHRoZSBjb2VmZmljaWVudCBidWZmZXIgYWNjb3JkaW5nIHRvIHRoZSBydW4sIGxldmVsCi0gKiBhbmQgc2lnbiwgYWxzbyB1cGRhdGVzIHRoZSBpbmRleAotICogCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSAgc3RvcmVSdW4gICAgICAgIFN0b3JlZCBSdW4gdmFsdWUgKGNvdW50IG9mIHplcm9zKSAgIAotICogW2luXSAgc3RvcmVMZXZlbCAgICAgIFN0b3JlZCBMZXZlbCB2YWx1ZSAobm9uLXplcm8gdmFsdWUpCi0gKiBbaW5dICBzaWduICAgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIHRoZSBzaWduIG9mIGxldmVsCi0gKiBbaW5dICBsYXN0ICAgICAgICAgICAgc3RhdHVzIG9mIHRoZSBsYXN0IGZsYWcKLSAqIFtpbl0gIHBJbmRleCAgICAgICAgICBwb2ludGVyIHRvIGNvZWZmaWNpZW50IGluZGV4IGluIDh4OCBtYXRyaXgKLSAqIFtvdXRdIHBJbmRleCAgICAgICAgICBwb2ludGVyIHRvIHVwZGF0ZWQgY29lZmZpY2llbnQgaW5kZXggaW4gOHg4IAotICogICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeAotICogW2luXSAgcFppZ3phZ1RhYmxlICAgIHBvaW50ZXIgdG8gdGhlIHppZ3phZyB0YWJsZXMKLSAqIFtvdXRdIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAotICogICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIoCi0gICAgT01YX1UzMiBzdG9yZVJ1biwKLSAgICBPTVhfUzE2ICogcERzdCwKLSAgICBPTVhfUzE2IHN0b3JlTGV2ZWwsCi0gICAgT01YX1U4ICBzaWduLAotICAgIE9NWF9VOCAgbGFzdCwKLSAgICBPTVhfVTggICogcEluZGV4LAotICAgIGNvbnN0IE9NWF9VOCAqIHBaaWd6YWdUYWJsZQotKQotewotICAgIC8qIFN0b3JlIHRoZSB6ZXJvJ3MgYXMgcGVyIHRoZSBydW4gbGVuZ3RoIGNvdW50ICovCi0gICAgZm9yICg7c3RvcmVSdW4gPiAwOyBzdG9yZVJ1bi0tLCAoKnBJbmRleCkrKykKLSAgICB7Ci0gICAgICAgIHBEc3RbcFppZ3phZ1RhYmxlWypwSW5kZXhdXSA9IDA7Ci0gICAgfQotICAgIC8qIFN0b3JlIHRoZSBsZXZlbCBkZXBlbmRpbmcgb24gdGhlIHNpZ24qLwotICAgIGlmIChzaWduID09IDEpCi0gICAgewotICAgICAgICBwRHN0W3BaaWd6YWdUYWJsZVsqcEluZGV4XV0gPSAtc3RvcmVMZXZlbDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcERzdFtwWmlnemFnVGFibGVbKnBJbmRleF1dID0gc3RvcmVMZXZlbDsKLSAgICB9Ci0gICAgKCpwSW5kZXgpKys7Ci0KLSAgICAvKiBJZiBsYXN0IGlzIDEsIGZpbGwgdGhlIHJlbWFpbmluZyBlbG1lbnRzIG9mIHRoZSBidWZmZXIgd2l0aCB6ZXJvcyAqLwotICAgIGlmIChsYXN0ID09IDEpCi0gICAgewotICAgICAgICB3aGlsZSAoKnBJbmRleCA8IDY0KQotICAgICAgICB7Ci0gICAgICAgICAgICBwRHN0W3BaaWd6YWdUYWJsZVsqcEluZGV4XV0gPSAwOwotICAgICAgICAgICAgKCpwSW5kZXgpKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfR2V0VkxDQml0cy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfR2V0VkxDQml0cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWIxNDExLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0dldFZMQ0JpdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0dldFZMQ0JpdHMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZSBmb3IgVkxDIGdldCBiaXRzIGZyb20gdGhlIHN0cmVhbSAKLSAqCi0gKi8gCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKLSNpbmNsdWRlICJhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIgotI2luY2x1ZGUgImFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCIKLQotIAotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0dldFZMQ0JpdHMKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGVzY2FwZSBtb2RlIGRlY2lzaW9uIGJhc2VkIG9uIHRoZSBydW4sIHJ1bissIGxldmVsLCBsZXZlbCsgYW5kIAotICogbGFzdCBjb21iaW5hdGlvbnMuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKgkJCQkJCQkJdGhlIGJpdCBzdHJlYW0KLSAqIFtpbl0JcEJpdE9mZnNldAkJcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqCQkJCQkJCQlieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKLSAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAKLSAqICAgICAgICAgICAgICAgICAgICAgIDB0aCBlbGVtZW50IG9yIDFzdC4KLSAqIFtpbi9vdXRdIHBMYXN0ICAgICAgIHBvaW50ZXIgdG8gbGFzdCBzdGF0dXMgZmxhZwotICogW2luXSBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwICAgICAgVGhlIHJ1biB2YWx1ZSBmcm9tIHdoaWNoIGxldmVsIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiBsYXN0ID09IDAKLSAqIFtpbl0gSW5kZXhCZWdpblNpbmdsZUxldmVsRW50cmllc0wwICAgIEFycmF5IGluZGV4IGluIHRoZSBWTEMgdGFibGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGluZyB0byB0aGUgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAKLSAqIFtpbl0gcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMSAgICAgIFRoZSBydW4gdmFsdWUgZnJvbSB3aGljaCBsZXZlbCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogbGFzdCA9PSAxCi0gKiBbaW5dIEluZGV4QmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMSAgICBBcnJheSBpbmRleCBpbiB0aGUgVkxDIHRhYmxlIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRpbmcgdG8gdGhlICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgCi0gKiBbaW5dIHBSdW5JbmRleFRhYmxlTDAgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKLSAqIFtpbl0gcFZsY1RhYmxlTDAgICAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMAotICogW2luXSBwUnVuSW5kZXhUYWJsZUwxICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dIHBWbGNUYWJsZUwxICAgICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gcExNQVhUYWJsZUwwICAgICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSBwTE1BWFRhYmxlTDEgICAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbaW5dIHBSTUFYVGFibGVMMCAgICAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dIHBSTUFYVGFibGVMMSAgICAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCi0gKiBbb3V0XXBEc3QJCQkgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKLSAqCQkJCQkJCWJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KLSAqCi0gKi8KLQotT01YUmVzdWx0IGFybVZDTTRQMl9HZXRWTENCaXRzICgKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotCQkJICBPTVhfUzE2ICogcERzdCwKLQkJCSAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotCQkJICBPTVhfVTggICAgc3RhcnQsCQkJICAKLQkJCSAgT01YX1U4ICAqIHBMYXN0LAotCQkJICBPTVhfVTggICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCwKLQkJCSAgT01YX1U4ICAgIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDAsCi0JCQkgIE9NWF9VOCAgICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSwKLQkJCSAgT01YX1U4ICAgIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwwLAotCQkJICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBaaWd6YWdUYWJsZQotKQotewotICAgIE9NWF9VMzIgc3RvcmVSdW47Ci0gICAgT01YX1U4ICB0YWJJbmRleCwgbWFya2VyQml0OwotICAgIE9NWF9TMTYgc3RvcmVMZXZlbDsKLSAgICBPTVhfVTE2IHVucGFja1JldEluZGV4OwotCU9NWF9VOCAgaSwgZlR5cGUsIGVzY2FwZTsJCi0JT01YX1U4ICBzaWduID0gMDsKLQkKLQkvKiBVbnBhY2tpbmcgdGhlIGJpdHN0cmVhbSBhbmQgUkxEICovCi0gICAgZm9yIChpID0gc3RhcnQ7IGkgPCA2NDspCi0gICAgewotCQllc2NhcGUgPSBhcm1Mb29rQWhlYWRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCA3KTsKLQkJaWYgKGVzY2FwZSAhPSAzKQotCQl7CQotCQkJZlR5cGUgPSAwOyAvKiBOb3QgaW4gZXNjYXBlIG1vZGUgKi8KLQkJfQotCQllbHNlCi0JCXsKLQkJCWFybVNraXBCaXRzIChwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgNyk7Ci0JCQlpZihzaG9ydFZpZGVvSGVhZGVyKQotCQkJewotCQkJICAqcExhc3QgPSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxKTsKLQkJCSAgc3RvcmVSdW4gPSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCA2KTsKLQkJCSAgc3RvcmVMZXZlbCA9IGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDgpOwotCQkJICAKLQkJCSAgLyogUmVmIHRvIFRhYmxlIEItMTggKGMpIGluIE1QRUc0IFN0YW5kYXJkLSBGTEMgY29kZSBmb3IgICovCi0JCQkgIC8qIExFVkVMIHdoZW4gc2hvcnRfdmlkZW9faGVhZGVyIGlzIDEsIHRoZSBzdG9yZUxldmVsIGlzICAqLwotCQkJICAvKiBhIHNpZ25lZCB2YWx1ZSBhbmQgdGhlIHNpZ24gYW5kIHRoZSB1bnNpZ25lZCB2YWx1ZSBmb3IgKi8KLQkJCSAgLyogc3RvcmVMZXZlbCBuZWVkIHRvIGJlIGV4dHJhY3RlZCBhbmQgcGFzc2VkIHRvIGFybSAgICAgICovCi0JCQkgIC8qIEZpbGxWTERCdWZmZXIgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCQkJICAgICAKLQkJCSAgc2lnbiA9IChzdG9yZUxldmVsICYgMHg4MCk7Ci0JCQkgIGlmKHNpZ249PTB4ODApCi0JCQkgIHsKLQkJCSAgCXN0b3JlTGV2ZWw9KHN0b3JlTGV2ZWxeMHhmZikrMTsJCQkgIAotCQkJICAJc2lnbj0xOwotCQkJICAJCi0JCQkgIH0KLQkJCSAgCi0JCQkgIGFybVJldERhdGFFcnJJZiggc3RvcmVMZXZlbCA9PSAwIHx8IHNpZ24qc3RvcmVMZXZlbCA9PSAxMjggLCBPTVhfU3RzX0Vycik7IC8qIEludmFsaWQgRkxDICovCi0JCQkgIGFybVJldERhdGFFcnJJZigoaSArIHN0b3JlUnVuKSA+PSA2NCwgT01YX1N0c19FcnIpOwotCQkJICBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcigKLQkJCSAgICBzdG9yZVJ1biwKLQkJCSAgICBwRHN0LAotCQkJICAgIHN0b3JlTGV2ZWwsCi0JCQkgICAgc2lnbiwKLQkJCSAgICAqcExhc3QsCi0JCQkgICAgJmksCi0JCQkgICAgcFppZ3phZ1RhYmxlKTsKLQkJCSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLQkJCSAgICAKLQkJCX0KLQkJCWlmIChhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxKSkKLQkJCXsKLQkJCQlpZiAoYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMSkpCi0JCQkJewotCQkJCQlmVHlwZSA9IDM7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWZUeXBlID0gMjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJZlR5cGUgPSAxOwotCQkJfQotCQl9Ci0KLQkgICAgaWYgKGZUeXBlIDwgMykKLQkgICAgewotCSAgICAgICAgdW5wYWNrUmV0SW5kZXggPSBhcm1VblBhY2tWTEMzMihwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwKLQkJCQkJCQkJCQlwVmxjVGFibGVMMCk7Ci0JCQlpZiAodW5wYWNrUmV0SW5kZXggIT0gQVJNX05PX0NPREVCT09LX0lOREVYKQotCQkgICAgewotCQkJICAgIC8qIERlY29kZSBydW4gYW5kIGxldmVsIGZyb20gdGhlIGluZGV4ICovCi0JCQkgICAgLyogbGFzdCA9IDAgKi8KLQkJCSAgICAqcExhc3QgPSAwOwotCQkJICAgIGlmICh1bnBhY2tSZXRJbmRleCA+IG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDApCi0JCQkgICAgewotCQkJCSAgICBzdG9yZUxldmVsID0gMTsKLQkJCQkgICAgc3RvcmVSdW4gPSAodW5wYWNrUmV0SW5kZXggLSBtYXhJbmRleEZvck11bHRpcGxlRW50cmllc0wwKSAKLQkJCQkJCQkrIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDA7Ci0JCQkgICAgfQotCQkJICAgIGVsc2UKLQkJCSAgICB7Ci0JCQkJICAgIHRhYkluZGV4ID0gMTsKLQkJCQkgICAgd2hpbGUgKHBSdW5JbmRleFRhYmxlTDBbdGFiSW5kZXhdIDw9IHVucGFja1JldEluZGV4KQotCQkJCSAgICB7Ci0JCQkJCSAgICB0YWJJbmRleCsrOwotCQkJCSAgICB9Ci0JCQkJICAgIHN0b3JlUnVuID0gdGFiSW5kZXggLSAxOwotCQkJCSAgICBzdG9yZUxldmVsID0gdW5wYWNrUmV0SW5kZXggLSBwUnVuSW5kZXhUYWJsZUwwW3RhYkluZGV4IC0gMV0gKyAxOwotCQkJICAgIH0KLQkJCSAgICBzaWduID0gKE9NWF9VOCkgYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMSk7Ci0JCQkKLQkJCSAgICBpZiAoZlR5cGUgPT0gMSkKLQkJCSAgICB7Ci0JCQkJICAgIHN0b3JlTGV2ZWwgPSAoYXJtQWJzKHN0b3JlTGV2ZWwpICsgcExNQVhUYWJsZUwwW3N0b3JlUnVuXSk7Ci0JCQkgICAgfQotCQkJICAgIGVsc2UgaWYgKGZUeXBlID09IDIpCi0JCQkgICAgewotCQkJCSAgICBzdG9yZVJ1biA9IHN0b3JlUnVuICsgcFJNQVhUYWJsZUwwW3N0b3JlTGV2ZWwtMV0gKyAxOwotCQkJICAgIH0KLQkJICAgIH0KLQkJICAgIGVsc2UKLQkJICAgIHsKLQkJCSAgICB1bnBhY2tSZXRJbmRleCA9IGFybVVuUGFja1ZMQzMyKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAKLQkJCQkJCQkJCQkJcFZsY1RhYmxlTDEpOwotCi0JCQkgICAgYXJtUmV0RGF0YUVycklmKHVucGFja1JldEluZGV4ID09IEFSTV9OT19DT0RFQk9PS19JTkRFWCwgT01YX1N0c19FcnIpOwotCi0JCQkgICAgLyogRGVjb2RlIHJ1biBhbmQgbGV2ZWwgZnJvbSB0aGUgaW5kZXggKi8KLQkJCSAgICAvKiBsYXN0ID0gMSAqLwotCQkJICAgICpwTGFzdCA9IDE7Ci0JCQkgICAgaWYgKHVucGFja1JldEluZGV4ID4gbWF4SW5kZXhGb3JNdWx0aXBsZUVudHJpZXNMMSkKLQkJCSAgICB7Ci0JCQkJICAgIHN0b3JlTGV2ZWwgPSAxOwotCQkJCSAgICBzdG9yZVJ1biA9ICh1bnBhY2tSZXRJbmRleCAtIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDEpIAotCQkJCQkJCSsgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDE7Ci0JCSAgICAgICAgfQotCQkgICAgICAgIGVsc2UKLQkJCSAgICB7Ci0JCQkJICAgIHRhYkluZGV4ID0gMTsKLQkJCQkgICAgd2hpbGUgKHBSdW5JbmRleFRhYmxlTDFbdGFiSW5kZXhdIDw9IHVucGFja1JldEluZGV4KQotCQkJCSAgICB7Ci0JCQkJCSAgICB0YWJJbmRleCsrOwotCQkJCSAgICB9Ci0JCQkJICAgIHN0b3JlUnVuID0gdGFiSW5kZXggLSAxOwotCQkJCSAgICBzdG9yZUxldmVsID0gdW5wYWNrUmV0SW5kZXggLSBwUnVuSW5kZXhUYWJsZUwxW3RhYkluZGV4IC0gMV0gKyAxOwotCQkJICAgIH0KLQkJCSAgICBzaWduID0gKE9NWF9VOCkgYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMSk7Ci0KLQkJCSAgICBpZiAoZlR5cGUgPT0gMSkKLQkJCSAgICB7Ci0JCQkgICAgICAgIHN0b3JlTGV2ZWwgPSAoYXJtQWJzKHN0b3JlTGV2ZWwpICsgcExNQVhUYWJsZUwxW3N0b3JlUnVuXSk7CQkJCQotCQkJICAgIH0KLQkJCSAgICBlbHNlIGlmIChmVHlwZSA9PSAyKQotCQkJICAgIHsKLQkJCQkgICAgc3RvcmVSdW4gPSBzdG9yZVJ1biArIHBSTUFYVGFibGVMMVtzdG9yZUxldmVsLTFdICsgMTsKLQkJCSAgICB9Ci0JCSAgICB9Ci0gICAgICAgICAgICBhcm1SZXREYXRhRXJySWYoKGkgKyBzdG9yZVJ1bikgPj0gNjQsIE9NWF9TdHNfRXJyKTsKLQkJICAgIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyKAotCQkJICAgIHN0b3JlUnVuLAotCQkJICAgIHBEc3QsCi0JCQkgICAgc3RvcmVMZXZlbCwKLQkJCSAgICBzaWduLAotCQkJICAgICpwTGFzdCwKLQkJCSAgICAmaSwKLQkJCSAgICBwWmlnemFnVGFibGUpOwkJCi0JICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0JCSAgICAqcExhc3QgPSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxKTsKLQkJICAgIHN0b3JlUnVuICA9IGFybUdldEJpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDYpOwotCQkgICAgYXJtUmV0RGF0YUVycklmKChpICsgc3RvcmVSdW4pID49IDY0LCBPTVhfU3RzX0Vycik7Ci0JCSAgICBtYXJrZXJCaXQgPSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAxKTsKLQkJICAgIGFybVJldERhdGFFcnJJZiggbWFya2VyQml0ID09IDAsIE9NWF9TdHNfRXJyKTsKLQkJICAgIHN0b3JlTGV2ZWwgID0gYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMTIpOwotCQkgICAgaWYgKHN0b3JlTGV2ZWwgJiAweDgwMCkKLQkJICAgIHsKLQkJCSAgICBzdG9yZUxldmVsIC09IDQwOTY7Ci0JCSAgICB9CQkJCi0JCSAgICBhcm1SZXREYXRhRXJySWYoIHN0b3JlTGV2ZWwgPT0gMCB8fCBzdG9yZUxldmVsID09IC0yMDQ4ICwgT01YX1N0c19FcnIpOyAvKiBJbnZhbGlkIEZMQyAqLwotCQkgICAgYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMSk7Ci0JCSAgICBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcigKLQkJCSAgICBzdG9yZVJ1biwKLQkJCSAgICBwRHN0LAotCQkJICAgIHN0b3JlTGV2ZWwsCi0JCQkgICAgMCwgLyogU2lnbiBpcyBub3QgdXNlZCwgcHJlcHJvY2Vzc2luZyBkb25lICovCi0JCQkgICAgKnBMYXN0LAotCQkJICAgICZpLAotCQkJICAgIHBaaWd6YWdUYWJsZSk7Ci0KLQkgICAgfQotICAgIH0gLyogRW5kIG9mIGZvcmxvb3AgZm9yIGkgKi8KLQlyZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyogRW5kIG9mIEZpbGUgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEwMWQ0OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYworKysgL2Rldi9udWxsCkBAIC0xLDUxMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0gLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKLSAqIERlc2NyaXB0aW9uOiBDb250YWlucyBhbGwgdGhlIEh1ZmZtYW4gdGFibGVzIHVzZWQgaW4gTVBFRzQgY29kZWMKLSAqCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotCi0vKiAKLSogIEZvciBJbnRyYQotKiAgbGFzdCA9IDAgCi0qLwotY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwUnVuSWR4WzExXSA9IAoteyAKLSAgICAwLCAyNywgMzcsIDQyLCA0NiwgNDksIDUyLCAKLSAgICA1NSwgNTgsIDYwLCA2MgotfTsKLQotLyogRW50cnkgZGVmaW5lZCBmb3IgYWxsIHZhbHVlcyAKLSogIGZvciBydW4gPSAwIHRvIDE0Ci0qICBOb3RlOiB0aGUgbGFzdCBlbnRyeSBpcyB0byB0ZXJtaW5hdGUgd2hpbGUgZGVjb2RpbmcKLSovCi1jb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAyX0ludHJhVmxjTDBbNjhdID0gCi17Ci0gICAgICAgIHsyLCAgICAyfSwKLSAgICAgICAgezMsICAgIDZ9LAotICAgICAgICB7NCwgICAgMTV9LAotICAgICAgICB7NSwgICAgMTN9LAotICAgICAgICB7NSwgICAgMTJ9LAotICAgICAgICB7NiwgICAgMjF9LAotICAgICAgICB7NiwgICAgMTl9LAotICAgICAgICB7NiwgICAgMTh9LAotICAgICAgICB7NywgICAgMjN9LAotICAgICAgICB7OCwgICAgMzF9LAotICAgICAgICB7OCwgICAgMzB9LAotICAgICAgICB7OCwgICAgMjl9LAotICAgICAgICB7OSwgICAgMzd9LAotICAgICAgICB7OSwgICAgMzZ9LAotICAgICAgICB7OSwgICAgMzV9LAotICAgICAgICB7OSwgICAgMzN9LAotICAgICAgICB7MTAsICAgMzN9LAotICAgICAgICB7MTAsICAgMzJ9LAotICAgICAgICB7MTAsICAgMTV9LAotICAgICAgICB7MTAsICAgMTR9LAotICAgICAgICB7MTEsICAgIDd9LAotICAgICAgICB7MTEsICAgIDZ9LAotICAgICAgICB7MTEsICAgMzJ9LAotICAgICAgICB7MTEsICAgMzN9LAotICAgICAgICB7MTIsICAgODB9LAotICAgICAgICB7MTIsICAgODF9LAotICAgICAgICB7MTIsICAgODJ9LAotICAgICAgICB7NCwgICAgMTR9LAotICAgICAgICB7NiwgICAgMjB9LAotICAgICAgICB7NywgICAgMjJ9LAotICAgICAgICB7OCwgICAgMjh9LAotICAgICAgICB7OSwgICAgMzJ9LAotICAgICAgICB7OSwgICAgMzF9LAotICAgICAgICB7MTAsICAgMTN9LAotICAgICAgICB7MTEsICAgMzR9LAotICAgICAgICB7MTIsICAgODN9LAotICAgICAgICB7MTIsICAgODV9LAotICAgICAgICB7NSwgICAgMTF9LAotICAgICAgICB7NywgICAgMjF9LAotICAgICAgICB7OSwgICAgMzB9LAotICAgICAgICB7MTAsICAgMTJ9LAotICAgICAgICB7MTIsICAgODZ9LAotICAgICAgICB7NiwgICAgMTd9LAotICAgICAgICB7OCwgICAgMjd9LAotICAgICAgICB7OSwgICAgMjl9LAotICAgICAgICB7MTAsICAgMTF9LAotICAgICAgICB7NiwgICAgMTZ9LAotICAgICAgICB7OSwgICAgMzR9LAotICAgICAgICB7MTAsICAgMTB9LAotICAgICAgICB7NiwgICAgMTN9LAotICAgICAgICB7OSwgICAgMjh9LAotICAgICAgICB7MTAsICAgIDh9LAotICAgICAgICB7NywgICAgMTh9LAotICAgICAgICB7OSwgICAgMjd9LAotICAgICAgICB7MTIsICAgODR9LAotICAgICAgICB7NywgICAgMjB9LAotICAgICAgICB7OSwgICAgMjZ9LAotICAgICAgICB7MTIsICAgODd9LAotICAgICAgICB7OCwgICAgMjV9LAotICAgICAgICB7MTAsICAgIDl9LAotICAgICAgICB7OCwgICAgMjR9LAotICAgICAgICB7MTEsICAgMzV9LAotICAgICAgICB7OCwgICAgMjN9LAotICAgICAgICB7OSwgICAgMjV9LAotICAgICAgICB7OSwgICAgMjR9LAotICAgICAgICB7MTAsICAgIDd9LAotICAgICAgICB7MTIsICAgODh9LAotICAgICAgICB7MCwgICAgIDB9Ci19OwotCi0vKiAKLSogIEZvciBJbnRyYQotKiAgbGFzdCA9IDEgCi0qLwotCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDFSdW5JZHhbOF0gPSAKLXsKLSAgICAwLCAgOCwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMQotfTsKLQotLyogRW50cnkgZGVmaW5lZCBmb3IgYWxsIHZhbHVlcyAKLSogIGZvciBydW4gPSAwIHRvIDIwCi0qICAqICBOb3RlOiB0aGUgbGFzdCBlbnRyeSBpcyB0byB0ZXJtaW5hdGUgd2hpbGUgZGVjb2RpbmcKLSovCi1jb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAyX0ludHJhVmxjTDFbMzZdID0gCi17Ci0gICAgICAgIHs0LCAgICAgN30sCi0gICAgICAgIHs2LCAgICAxMn0sCi0gICAgICAgIHs4LCAgICAyMn0sCi0gICAgICAgIHs5LCAgICAyM30sCi0gICAgICAgIHsxMCwgICAgNn0sCi0gICAgICAgIHsxMSwgICAgNX0sCi0gICAgICAgIHsxMSwgICAgNH0sCi0gICAgICAgIHsxMiwgICA4OX0sCi0gICAgICAgIHs2LCAgICAxNX0sCi0gICAgICAgIHs5LCAgICAyMn0sCi0gICAgICAgIHsxMCwgICAgNX0sCi0gICAgICAgIHs2LCAgICAxNH0sCi0gICAgICAgIHsxMCwgICAgNH0sCi0gICAgICAgIHs3LCAgICAxN30sCi0gICAgICAgIHsxMSwgICAzNn0sCi0gICAgICAgIHs3LCAgICAxNn0sCi0gICAgICAgIHsxMSwgICAzN30sCi0gICAgICAgIHs3LCAgICAxOX0sCi0gICAgICAgIHsxMiwgICA5MH0sCi0gICAgICAgIHs4LCAgICAyMX0sCi0gICAgICAgIHsxMiwgICA5MX0sCi0gICAgICAgIHs4LCAgICAyMH0sCi0gICAgICAgIHs4LCAgICAxOX0sCi0gICAgICAgIHs4LCAgICAyNn0sCi0gICAgICAgIHs5LCAgICAyMX0sCi0gICAgICAgIHs5LCAgICAyMH0sCi0gICAgICAgIHs5LCAgICAxOX0sCi0gICAgICAgIHs5LCAgICAxOH0sCi0gICAgICAgIHs5LCAgICAxN30sCi0gICAgICAgIHsxMSwgICAzOH0sCi0gICAgICAgIHsxMSwgICAzOX0sCi0gICAgICAgIHsxMiwgICA5Mn0sCi0gICAgICAgIHsxMiwgICA5M30sCi0gICAgICAgIHsxMiwgICA5NH0sCi0gICAgICAgIHsxMiwgICA5NX0sICAKLSAgICAgICAgezAsICAgICAwfQotfTsKLQotLyogTE1BWCB0YWJsZSBmb3IgSW50cmEgKExhc3QgPT0gMCkqLwotY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTE1BWFsxNV0gPSAKLXsKLSAgIDI3LCAxMCwgIDUsICA0LCAgMywgIDMsICAzLCAgCi0gICAgMywgIDIsICAyLCAgMSwgIDEsICAxLCAgMSwgIDEKLX07Ci0KLS8qIExNQVggdGFibGUgZm9yIEludHJhIChMYXN0ID09IDEpKi8KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50cmFMMUxNQVhbMjFdID0gCi17Ci0gICAgOCwgIDMsICAyLCAgMiwgIDIsICAyLCAgMiwgIDEsIAotCTEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotCTEsICAxLCAgMSwgIDEsICAxCi19OwotCi0vKiBSTUFYIHRhYmxlIGZvciBJbnRyYSAoTGFzdCA9PSAwKQotICAgTGV2ZWwgLSAxIEluZGV4ZWQgCi0qLwotY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwUk1BWFsyN10gPQotewotICAgMTQsICA5LCAgNywgIDMsICAyLCAgMSwJMSwgIAotICAgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgCTAsICAKLSAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgCi0gICAgMCwgIDAsICAwLCAgMCwgIDAsICAwCi19OwotCi0vKiBSTUFYIHRhYmxlIGZvciBJbnRyYSAoTGFzdCA9PSAxKQotICAgTGV2ZWwgLSAxIEluZGV4ZWQgCi0qLwotY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwxUk1BWFs4XSA9Ci17Ci0gICAyMCwgIDYsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAKLX07Ci0KLS8qIAotKiAgRm9yIEludGVyCi0qICBsYXN0ID0gMCAKLSovCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBSdW5JZHhbMTJdID0gCi17IAotICAgICAwLCAgMTIsICAxOCwgIDIyLCAgMjUsICAyOCwgIAotICAgIDMxLCAgMzQsICAzNiwgIDM4LCAgNDAsICA0MgotfTsKLQotLyogRW50cnkgZGVmaW5lZCBmb3IgYWxsIHZhbHVlcyAKLSogIGZvciBydW4gPSAwIHRvIDI2Ci0qICBOb3RlOiB0aGUgbGFzdCBlbnRyeSBpcyB0byB0ZXJtaW5hdGUgd2hpbGUgZGVjb2RpbmcKLSovCi1jb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAyX0ludGVyVmxjTDBbNTldID0gCi17Ci0gICAgICAgIHsyLCAgICAgMn0sCi0gICAgICAgIHs0LCAgICAxNX0sCi0gICAgICAgIHs2LCAgICAyMX0sCi0gICAgICAgIHs3LCAgICAyM30sCi0gICAgICAgIHs4LCAgICAzMX0sCi0gICAgICAgIHs5LCAgICAzN30sCi0gICAgICAgIHs5LCAgICAzNn0sCi0gICAgICAgIHsxMCwgICAzM30sCi0gICAgICAgIHsxMCwgICAzMn0sCi0gICAgICAgIHsxMSwgICAgN30sCi0gICAgICAgIHsxMSwgICAgNn0sCi0gICAgICAgIHsxMSwgICAzMn0sCi0gICAgICAgIHszLCAgICAgNn0sCi0gICAgICAgIHs2LCAgICAyMH0sCi0gICAgICAgIHs4LCAgICAzMH0sCi0gICAgICAgIHsxMCwgICAxNX0sCi0gICAgICAgIHsxMSwgICAzM30sCi0gICAgICAgIHsxMiwgICA4MH0sCi0gICAgICAgIHs0LCAgICAxNH0sCi0gICAgICAgIHs4LCAgICAyOX0sCi0gICAgICAgIHsxMCwgICAxNH0sCi0gICAgICAgIHsxMiwgICA4MX0sCi0gICAgICAgIHs1LCAgICAxM30sCi0gICAgICAgIHs5LCAgICAzNX0sCi0gICAgICAgIHsxMCwgICAxM30sCi0gICAgICAgIHs1LCAgICAxMn0sCi0gICAgICAgIHs5LCAgICAzNH0sCi0gICAgICAgIHsxMiwgICA4Mn0sCi0gICAgICAgIHs1LCAgICAxMX0sCi0gICAgICAgIHsxMCwgICAxMn0sCi0gICAgICAgIHsxMiwgICA4M30sCi0gICAgICAgIHs2LCAgICAxOX0sCi0gICAgICAgIHsxMCwgICAxMX0sCi0gICAgICAgIHsxMiwgICA4NH0sCi0gICAgICAgIHs2LCAgICAxOH0sCi0gICAgICAgIHsxMCwgICAxMH0sCi0gICAgICAgIHs2LCAgICAxN30sCi0gICAgICAgIHsxMCwgICAgOX0sCi0gICAgICAgIHs2LCAgICAxNn0sCi0gICAgICAgIHsxMCwgICAgOH0sCi0gICAgICAgIHs3LCAgICAyMn0sCi0gICAgICAgIHsxMiwgICA4NX0sCi0gICAgICAgIHs3LCAgICAyMX0sCi0gICAgICAgIHs3LCAgICAyMH0sCi0gICAgICAgIHs4LCAgICAyOH0sCi0gICAgICAgIHs4LCAgICAyN30sCi0gICAgICAgIHs5LCAgICAzM30sCi0gICAgICAgIHs5LCAgICAzMn0sCi0gICAgICAgIHs5LCAgICAzMX0sCi0gICAgICAgIHs5LCAgICAzMH0sCi0gICAgICAgIHs5LCAgICAyOX0sCi0gICAgICAgIHs5LCAgICAyOH0sCi0gICAgICAgIHs5LCAgICAyN30sCi0gICAgICAgIHs5LCAgICAyNn0sCi0gICAgICAgIHsxMSwgICAzNH0sCi0gICAgICAgIHsxMSwgICAzNX0sCi0gICAgICAgIHsxMiwgICA4Nn0sCi0gICAgICAgIHsxMiwgICA4N30sCi0gICAgICAgIHswLCAgICAgMH0KLX07Ci0gCi0KLS8qIAotKiAgRm9yIEludHJhCi0qICBsYXN0ID0gMSAKLSovCi0KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMVJ1bklkeFszXSA9IAotewotICAgIDAsIDMsIDUKLX07Ci0KLS8qIEVudHJ5IGRlZmluZWQgZm9yIGFsbCB2YWx1ZXMgCi0qICBmb3IgcnVuID0gMCB0byA0MAotKiAgTm90ZTogdGhlIGxhc3QgZW50cnkgaXMgdG8gdGVybWluYXRlIHdoaWxlIGRlY29kaW5nCi0qLwotY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9JbnRlclZsY0wxWzQ1XSA9IAotewotICAgICAgICB7NCwgICAgIDd9LAotICAgICAgICB7OSwgICAgMjV9LAotICAgICAgICB7MTEsICAgIDV9LAotICAgICAgICB7NiwgICAgMTV9LAotICAgICAgICB7MTEsICAgIDR9LAotICAgICAgICB7NiwgICAgMTR9LAotICAgICAgICB7NiwgICAgMTN9LAotICAgICAgICB7NiwgICAgMTJ9LAotICAgICAgICB7NywgICAgMTl9LAotICAgICAgICB7NywgICAgMTh9LAotICAgICAgICB7NywgICAgMTd9LAotICAgICAgICB7NywgICAgMTZ9LAotICAgICAgICB7OCwgICAgMjZ9LAotICAgICAgICB7OCwgICAgMjV9LAotICAgICAgICB7OCwgICAgMjR9LAotICAgICAgICB7OCwgICAgMjN9LAotICAgICAgICB7OCwgICAgMjJ9LAotICAgICAgICB7OCwgICAgMjF9LAotICAgICAgICB7OCwgICAgMjB9LAotICAgICAgICB7OCwgICAgMTl9LAotICAgICAgICB7OSwgICAgMjR9LAotICAgICAgICB7OSwgICAgMjN9LAotICAgICAgICB7OSwgICAgMjJ9LAotICAgICAgICB7OSwgICAgMjF9LAotICAgICAgICB7OSwgICAgMjB9LAotICAgICAgICB7OSwgICAgMTl9LAotICAgICAgICB7OSwgICAgMTh9LAotICAgICAgICB7OSwgICAgMTd9LAotICAgICAgICB7MTAsICAgIDd9LAotICAgICAgICB7MTAsICAgIDZ9LAotICAgICAgICB7MTAsICAgIDV9LAotICAgICAgICB7MTAsICAgIDR9LAotICAgICAgICB7MTEsICAgMzZ9LAotICAgICAgICB7MTEsICAgMzd9LAotICAgICAgICB7MTEsICAgMzh9LAotICAgICAgICB7MTEsICAgMzl9LAotICAgICAgICB7MTIsICAgODh9LAotICAgICAgICB7MTIsICAgODl9LAotICAgICAgICB7MTIsICAgOTB9LAotICAgICAgICB7MTIsICAgOTF9LAotICAgICAgICB7MTIsICAgOTJ9LAotICAgICAgICB7MTIsICAgOTN9LAotICAgICAgICB7MTIsICAgOTR9LAotICAgICAgICB7MTIsICAgOTV9LAotICAgICAgICB7IDAsICAgIDB9Ci19OwotCi0vKiBMTUFYIHRhYmxlIGZvciBJbnRyYSAoTGFzdCA9PSAwKSovCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMTUFYWzI3XSA9IAotewotICAgMTIsICA2LCAgNCwgIDMsICAzLCAgMywgIDMsICAyLCAKLSAgICAyLCAgMiwgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwKLSAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKLSAgICAxLCAgMSwgIDEsCi19OwotCi0vKiBMTUFYIHRhYmxlIGZvciBJbnRyYSAoTGFzdCA9PSAxKSovCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDFMTUFYWzQxXSA9IAotewotICAgIDMsICAyLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLQkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKLQkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKLQkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKLQkxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKLQkxLCAgCi19OwotCi0vKiBSTUFYIHRhYmxlIGZvciBJbnRyYSAoTGFzdCA9PSAwKQotICAgTGV2ZWwgLSAxIEluZGV4ZWQgCi0qLwotY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwUk1BWFsxMl0gPSAKLXsKLSAgIDI2LCAxMCwgIDYsICAyLCAgMSwgIDEsICAgCi0gICAgMCwgIDAsICAwLCAgMCwgIDAsICAwCi19OwotCi0vKiBSTUFYIHRhYmxlIGZvciBJbnRyYSAoTGFzdCA9PSAxKQotICAgTGV2ZWwgLSAxIEluZGV4ZWQgCi0qLwotY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwxUk1BWFszXSA9IAotewotICAgNDAsICAxLCAgMAotfTsKLQotLyogCi0qICBGb3IgSW50cmEgLSBMdW1pbmFuY2UKLSovCi0KLWNvbnN0IEFSTV9WTEMzMiBhcm1WQ000UDJfYUludHJhRENMdW1hSW5kZXhbMTRdID0gCi17Ci0gICAgICAgIHszLCAgICAgM30sCi0gICAgICAgIHsyLCAgICAgM30sCi0gICAgICAgIHsyLCAgICAgMn0sCi0gICAgICAgIHszLCAgICAgMn0sCi0gICAgICAgIHszLCAgICAgMX0sCi0gICAgICAgIHs0LCAgICAgMX0sCi0gICAgICAgIHs1LCAgICAgMX0sCi0gICAgICAgIHs2LCAgICAgMX0sCi0gICAgICAgIHs3LCAgICAgMX0sCi0gICAgICAgIHs4LCAgICAgMX0sCi0gICAgICAgIHs5LCAgICAgMX0sCi0gICAgICAgIHsxMCwgICAgMX0sCi0gICAgICAgIHsxMSwgICAgMX0sCi0gICAgICAgIHswLCAgICAgMH0KLX07Ci0KLS8qIAotKiAgRm9yIEludHJhIC0gQ2hyb21pbmFuY2UKLSovCi0gCi1jb25zdCBBUk1fVkxDMzIgYXJtVkNNNFAyX2FJbnRyYURDQ2hyb21hSW5kZXhbMTRdID0gCi17Ci0gICAgICAgIHsyLCAgICAgM30sCi0gICAgICAgIHsyLCAgICAgMn0sCi0gICAgICAgIHsyLCAgICAgMX0sCi0gICAgICAgIHszLCAgICAgMX0sCi0gICAgICAgIHs0LCAgICAgMX0sCi0gICAgICAgIHs1LCAgICAgMX0sCi0gICAgICAgIHs2LCAgICAgMX0sCi0gICAgICAgIHs3LCAgICAgMX0sCi0gICAgICAgIHs4LCAgICAgMX0sCi0gICAgICAgIHs5LCAgICAgMX0sCi0gICAgICAgIHsxMCwgICAgMX0sCi0gICAgICAgIHsxMSwgICAgMX0sCi0gICAgICAgIHsxMiwgICAgMX0sCi0gICAgICAgIHswLCAgICAgMH0KLX07Ci0KLS8qIAotICogIE1vdGlvbiB2ZWN0b3IgZGVjb2RpbmcgdGFibGUKLSAqLwotIAotY29uc3QgQVJNX1ZMQzMyIGFybVZDTTRQMl9hVmxjTVZEWzY2XSA9Ci17Ci0gICAgICAgIHsxMywgICAgIDV9LAotICAgICAgICB7MTMsICAgICA3fSwKLSAgICAgICAgezEyLCAgICAgNX0sCi0gICAgICAgIHsxMiwgICAgIDd9LAotICAgICAgICB7MTIsICAgICA5fSwKLSAgICAgICAgezEyLCAgICAxMX0sCi0gICAgICAgIHsxMiwgICAgMTN9LAotICAgICAgICB7MTIsICAgIDE1fSwKLSAgICAgICAgezExLCAgICAgOX0sCi0gICAgICAgIHsxMSwgICAgMTF9LAotICAgICAgICB7MTEsICAgIDEzfSwKLSAgICAgICAgezExLCAgICAxNX0sCi0gICAgICAgIHsxMSwgICAgMTd9LAotICAgICAgICB7MTEsICAgIDE5fSwKLSAgICAgICAgezExLCAgICAyMX0sCi0gICAgICAgIHsxMSwgICAgMjN9LAotICAgICAgICB7MTEsICAgIDI1fSwKLSAgICAgICAgezExLCAgICAyN30sCi0gICAgICAgIHsxMSwgICAgMjl9LAotICAgICAgICB7MTEsICAgIDMxfSwKLSAgICAgICAgezExLCAgICAzM30sCi0gICAgICAgIHsxMSwgICAgMzV9LAotICAgICAgICB7MTAsICAgIDE5fSwKLSAgICAgICAgezEwLCAgICAyMX0sCi0gICAgICAgIHsxMCwgICAgMjN9LAotICAgICAgICB7OCwgICAgICA3fSwKLSAgICAgICAgezgsICAgICAgOX0sCi0gICAgICAgIHs4LCAgICAgMTF9LAotICAgICAgICB7NywgICAgICA3fSwKLSAgICAgICAgezUsICAgICAgM30sCi0gICAgICAgIHs0LCAgICAgIDN9LAotICAgICAgICB7MywgICAgICAzfSwKLSAgICAgICAgezEsICAgICAgMX0sCi0gICAgICAgIHszLCAgICAgIDJ9LAotICAgICAgICB7NCwgICAgICAyfSwKLSAgICAgICAgezUsICAgICAgMn0sCi0gICAgICAgIHs3LCAgICAgIDZ9LAotICAgICAgICB7OCwgICAgIDEwfSwKLSAgICAgICAgezgsICAgICAgOH0sCi0gICAgICAgIHs4LCAgICAgIDZ9LAotICAgICAgICB7MTAsICAgIDIyfSwKLSAgICAgICAgezEwLCAgICAyMH0sCi0gICAgICAgIHsxMCwgICAgMTh9LAotICAgICAgICB7MTEsICAgIDM0fSwKLSAgICAgICAgezExLCAgICAzMn0sCi0gICAgICAgIHsxMSwgICAgMzB9LAotICAgICAgICB7MTEsICAgIDI4fSwKLSAgICAgICAgezExLCAgICAyNn0sCi0gICAgICAgIHsxMSwgICAgMjR9LAotICAgICAgICB7MTEsICAgIDIyfSwKLSAgICAgICAgezExLCAgICAyMH0sCi0gICAgICAgIHsxMSwgICAgMTh9LAotICAgICAgICB7MTEsICAgIDE2fSwKLSAgICAgICAgezExLCAgICAxNH0sCi0gICAgICAgIHsxMSwgICAgMTJ9LAotICAgICAgICB7MTEsICAgIDEwfSwKLSAgICAgICAgezExLCAgICAgOH0sCi0gICAgICAgIHsxMiwgICAgMTR9LAotICAgICAgICB7MTIsICAgIDEyfSwKLSAgICAgICAgezEyLCAgICAxMH0sCi0gICAgICAgIHsxMiwgICAgIDh9LAotICAgICAgICB7MTIsICAgICA2fSwKLSAgICAgICAgezEyLCAgICAgNH0sCi0gICAgICAgIHsxMywgICAgIDZ9LAotICAgICAgICB7MTMsICAgICA0fSwKLSAgICAgICAgeyAwLCAgICAgMH0KLX07Ci0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9QdXRWTENCaXRzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9QdXRWTENCaXRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZDU0OTQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfUHV0VkxDQml0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfUHV0VkxDQml0cy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlIGZvciBWTEMgcHV0IGJpdHMgdG8gYml0c3RyZWFtIAotICoKLSAqLyAKLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotI2luY2x1ZGUgImFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgiCi0jaW5jbHVkZSAiYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIgotCi0gCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfUHV0VkxDQml0cwotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ2hlY2tzIHRoZSB0eXBlIG9mIEVzY2FwZSBNb2RlIGFuZCBwdXQgZW5jb2RlZCBiaXRzIGZvciAKLSAqIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnRzLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0JIHBwQml0U3RyZWFtICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCi0gKgkJCQkJCSAgdGhlIGJpdCBzdHJlYW0KLSAqIFtpbl0JIHBCaXRPZmZzZXQgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3Ci0gKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCi0gKiBbaW5dICBzdGFydCAgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgMHRoIGVsZW1lbnQgb3IgMXN0LgotICogW2luXSAgbWF4U3RvcmVSdW5MMCAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQotICogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGFzdCA9IDAKLSAqIFtpbl0gIG1heFN0b3JlUnVuTDEgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGxhc3QgPSAxCi0gKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykgZm9yIGxhc3QgPSAwCi0gKiBbaW5dICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJ1biB2YWx1ZSBhZnRlciB3aGljaCBsZXZlbCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykgZm9yIGxhc3QgPSAxCi0gKiBbaW5dICBwUnVuSW5kZXhUYWJsZUwwIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAotICogW2luXSAgcFZsY1RhYmxlTDAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMAotICogW2luXSAgcFJ1bkluZGV4VGFibGVMMSBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gIHBWbGNUYWJsZUwxICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDEKLSAqIFtpbl0gIHBMTUFYVGFibGVMMCAgICAgTGV2ZWwgTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dICBwTE1BWFRhYmxlTDEgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAotICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMQotICogW2luXSAgcFJNQVhUYWJsZUwwICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCi0gKiBbaW5dICBwUk1BWFRhYmxlTDEgICAgIFJ1biBNQVggdGFibGUgZGVmaW5lZCBpbiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKLSAqIFtvdXRdIHBRRGN0QmxrQ29lZiAgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudAotICogW291dF0gcHBCaXRTdHJlYW0gICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZAotICogICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KLSAqIFtvdXRdIHBCaXRPZmZzZXQgICAgICAgKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0uCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCi0gKgotICovCi0KLQotT01YUmVzdWx0IGFybVZDTTRQMl9QdXRWTENCaXRzICgKLSAgICAgICAgICAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotICAgICAgICAgICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCi0gICAgICAgICAgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgICAgICAgICAgT01YX1U4IHN0YXJ0LAotICAgICAgICAgICAgICBPTVhfVTggbWF4U3RvcmVSdW5MMCwKLSAgICAgICAgICAgICAgT01YX1U4IG1heFN0b3JlUnVuTDEsCi0gICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDAsCi0gICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEsCi0gICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwwLAotICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwwLAotCQkJICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMCwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMSwKLSAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBaaWd6YWdUYWJsZQotKQotewotCi0gICAgT01YX1UzMiBzdG9yZVJ1biA9IDAsIHJ1biwgc3RvcmVSdW5QbHVzOwotICAgIE9NWF9VOCAgbGFzdCA9IDAsIGZpcnN0ID0gMSwgZk1vZGU7Ci0gICAgT01YX1MxNiBsZXZlbCwgc3RvcmVMZXZlbCA9IDAsIHN0b3JlTGV2ZWxQbHVzOwotICAgIE9NWF9JTlQgaTsKLSAgICAKLSAgICAgICAgLyogUkxFIGVuY29kaW5nIGFuZCBwYWNraW5nIHRoZSBiaXRzIGludG8gdGhlIHN0cmVhbXMgKi8KLSAgICAgICAgZm9yIChpID0gc3RhcnQsIHJ1bj0wOyBpIDwgNjQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgbGV2ZWwgICA9IHBRRGN0QmxrQ29lZltwWmlnemFnVGFibGVbaV1dOwotCi0gICAgICAgICAgICAvKiBDb3VudGluZyB0aGUgcnVuICovCi0gICAgICAgICAgICBpZiAobGV2ZWwgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBydW4rKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogRm91bmQgYSBub24temVybyBjb2VmZiAqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChmaXJzdCA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbGFzdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBmb3IgYSB2YWxpZCBlbnRyeSBpbiB0aGUgVkxDIHRhYmxlICovCi0gICAgICAgICAgICAgICAgICAgIHN0b3JlTGV2ZWxQbHVzID0gYXJtU2lnbkNoZWNrKHN0b3JlTGV2ZWwpICogCi0gICAgICAgICAgICAgICAgICAgICAgKGFybUFicyhzdG9yZUxldmVsKSAtIHBMTUFYVGFibGVMMFtzdG9yZVJ1bl0pOwotICAgICAgICAgICAgICAgICAgICBzdG9yZVJ1blBsdXMgPSBzdG9yZVJ1biAtIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwUk1BWFRhYmxlTDBbYXJtQWJzKHN0b3JlTGV2ZWwpIC0gMV0gKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmTW9kZSA9IGFybVZDTTRQMl9DaGVja1ZMQ0VzY2FwZU1vZGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVJ1biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlUnVuUGx1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZUxldmVsUGx1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFN0b3JlUnVuTDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnVuSW5kZXhUYWJsZUwwKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9GaWxsVkxDQnVmZmVyICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBCaXRTdHJlYW0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVJ1biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVMZXZlbCwgCi0JCQkJCQkJCQkgIHN0b3JlUnVuUGx1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVMZXZlbFBsdXMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmTW9kZSwKLQkJCQkJCQkJCSAgbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDAsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnVuSW5kZXhUYWJsZUwwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmxjVGFibGVMMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RvcmVMZXZlbCA9IGxldmVsOwotICAgICAgICAgICAgICAgIHN0b3JlUnVuICAgPSBydW47Ci0gICAgICAgICAgICAgICAgZmlyc3QgPSAwOwotICAgICAgICAgICAgICAgIHJ1biA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSAvKiBlbmQgb2YgZm9yIGxvb3AgZm9yIDY0IGVsZW1lbnRzICovCi0KLSAgICAgICAgLyogd3JpdGluZyB0aGUgbGFzdCBlbGVtZW50ICovCi0gICAgICAgIGxhc3QgPSAxOwotICAgICAgICAKLSAgICAgICAgLyogQ2hlY2sgZm9yIGEgdmFsaWQgZW50cnkgaW4gdGhlIFZMQyB0YWJsZSAqLwotICAgICAgICBzdG9yZUxldmVsUGx1cyA9IGFybVNpZ25DaGVjayhzdG9yZUxldmVsKSAqIAotICAgICAgICAgICAgICAgICAgICAgICAgKGFybUFicyhzdG9yZUxldmVsKSAtIHBMTUFYVGFibGVMMVtydW5dKTsKLSAgICAgICAgc3RvcmVSdW5QbHVzID0gc3RvcmVSdW4gLSAKLSAgICAgICAgICAgICAgICAgICAgICAocFJNQVhUYWJsZUwxW2FybUFicyhzdG9yZUxldmVsKSAtIDFdICsgMSk7Ci0gICAgICAgIGZNb2RlID0gYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlUnVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVSdW5QbHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlTGV2ZWxQbHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U3RvcmVSdW5MMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdW5JbmRleFRhYmxlTDEpOwotICAgICAgICAKLSAgICAgICAgYXJtVkNNNFAyX0ZpbGxWTENCdWZmZXIgKAotICAgICAgICAgICAgICAgICAgICAgICAgICBwcEJpdFN0cmVhbSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlUnVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZUxldmVsLCAKLQkJCQkJCSAgc3RvcmVSdW5QbHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZUxldmVsUGx1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZk1vZGUsCi0JCQkJCQkgIGxhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwUnVuSW5kZXhUYWJsZUwxLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwVmxjVGFibGVMMSk7Ci0JcmV0dXJuIE9NWF9TdHNfTm9FcnI7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLX0KLQotLyogRW5kIG9mIEZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFkNDRkNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9TZXRQcmVkRGlyLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqIAotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGUgZm9yIGRldGVjdGluZyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24KLSAqCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9TZXRQcmVkRGlyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBkZXRlY3RpbmcgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBibG9ja0luZGV4ICBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiBhcyBkZWZpbmVkIGluIHN1YmNsYXVzZSA2LjEuMy44LCBvZiBJU08vSUVDCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ0OTYtMi4gRnVydGhlcm1vcmUsIGluZGV4ZXMgNiB0byA5IGluZGljYXRlIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhIGJsb2NrcyBzcGF0aWFsbHkgY29ycmVzcG9uZGluZyB0byBsdW1pbmFuY2UKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3MgMCB0byAzIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suCi0gKiBbaW5dIHBDb2VmQnVmUm93IHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKLSAqIFtpbl0gcFFwQnVmICAgICAgcG9pbnRlciB0byB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBidWZmZXIKLSAqIFtvdXRdICAgIHByZWRRUCAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIHByZWRpY3RvciBibG9jawotICogW291dF0gICAgcHJlZERpciAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQotICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTCAgICAgIHByZWRpY3QgdmVydGljYWxseQotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgotICoKLSAqLwotCi1PTVhSZXN1bHQgYXJtVkNNNFAyX1NldFByZWREaXIoCi0gICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKLSAgICAgT01YX1MxNiAqcENvZWZCdWZSb3csCi0gICAgIE9NWF9TMTYgKnBDb2VmQnVmQ29sLAotICAgICBPTVhfSU5UICpwcmVkRGlyLAotICAgICBPTVhfSU5UICpwcmVkUVAsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFFwQnVmCi0pCi17Ci0gICAgT01YX1U4ICBibG9ja0RDTGVmdDsKLSAgICBPTVhfVTggIGJsb2NrRENUb3A7Ci0gICAgT01YX1U4ICBibG9ja0RDVG9wTGVmdDsKLQotICAgIGlmIChibG9ja0luZGV4ID09IDMpCi0gICAgewotICAgICAgICBibG9ja0RDVG9wID0gKihwQ29lZkJ1ZkNvbCAtIDgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBibG9ja0RDVG9wID0gKnBDb2VmQnVmUm93OwotICAgIH0KLSAgICBibG9ja0RDTGVmdCA9ICpwQ29lZkJ1ZkNvbDsKLSAgICBibG9ja0RDVG9wTGVmdCA9ICoocENvZWZCdWZSb3cgLSA4KTsKLQotICAgIGlmIChhcm1BYnMoYmxvY2tEQ0xlZnQgLSBibG9ja0RDVG9wTGVmdCkgPCBhcm1BYnMoYmxvY2tEQ1RvcExlZnQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGJsb2NrRENUb3ApKQotICAgIHsKLSAgICAgICAgKnByZWREaXIgPSBPTVhfVkNfVkVSVElDQUw7Ci0gICAgICAgICpwcmVkUVAgPSBwUXBCdWZbMV07Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgICpwcmVkRGlyID0gT01YX1ZDX0hPUklaT05UQUw7Ci0gICAgICAgICpwcmVkUVAgPSBwUXBCdWZbMF07Ci0gICAgfQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0KLS8qRW5kIG9mIEZpbGUqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfWmlnemFnX1RhYmxlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2ZjMGVmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLSAvKioKLSAqIAotICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5jCi0gKiBEZXNjcmlwdGlvbjogQ29udGFpbnMgdGhlIHppZ3phZyB0YWJsZXMKLSAqCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gWzY0XSA9IAotewotICAgICAwLCAgMSwgIDgsIDE2LCAgOSwgIDIsICAzLCAxMCwKLSAgICAxNywgMjQsIDMyLCAyNSwgMTgsIDExLCAgNCwgIDUsCi0gICAgMTIsIDE5LCAyNiwgMzMsIDQwLCA0OCwgNDEsIDM0LAotICAgIDI3LCAyMCwgMTMsICA2LCAgNywgMTQsIDIxLCAyOCwgCi0gICAgMzUsIDQyLCA0OSwgNTYsIDU3LCA1MCwgNDMsIDM2LAotICAgIDI5LCAyMiwgMTUsIDIzLCAzMCwgMzcsIDQ0LCA1MSwKLSAgICA1OCwgNTksIDUyLCA0NSwgMzgsIDMxLCAzOSwgNDYsCi0gICAgNTMsIDYwLCA2MSwgNTQsIDQ3LCA1NSwgNjIsIDYzCi19OwotCi1jb25zdCBPTVhfVTggYXJtVkNNNFAyX2FIb3Jpem9udGFsWmlnemFnU2NhbiBbNjRdID0gCi17Ci0gICAgIDAsICAxLCAgMiwgIDMsICA4LCAgOSwgMTYsIDE3LAotICAgIDEwLCAxMSwgIDQsICA1LCAgNiwgIDcsIDE1LCAxNCwKLSAgICAxMywgMTIsIDE5LCAxOCwgMjQsIDI1LCAzMiwgMzMsCi0gICAgMjYsIDI3LCAyMCwgMjEsIDIyLCAyMywgMjgsIDI5LAotICAgIDMwLCAzMSwgMzQsIDM1LCA0MCwgNDEsIDQ4LCA0OSwKLSAgICA0MiwgNDMsIDM2LCAzNywgMzgsIDM5LCA0NCwgNDUsIAotICAgIDQ2LCA0NywgNTAsIDUxLCA1NiwgNTcsIDU4LCA1OSwKLSAgICA1MiwgNTMsIDU0LCA1NSwgNjAsIDYxLCA2MiwgNjMKLX07Ci0KLWNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYVZlcnRpY2FsWmlnemFnU2NhbiBbNjRdID0gCi17Ci0gICAgIDAsICA4LCAxNiwgMjQsICAxLCAgOSwgIDIsIDEwLAotICAgICAxNywgMjUsIDMyLCA0MCwgNDgsIDU2LCA1NywgNDksCi0gICAgIDQxLCAzMywgMjYsIDE4LCAgMywgMTEsICA0LCAxMiwKLSAgICAgMTksIDI3LCAzNCwgNDIsIDUwLCA1OCwgMzUsIDQzLAotICAgICA1MSwgNTksIDIwLCAyOCwgIDUsIDEzLCAgNiwgMTQsCi0gICAgIDIxLCAyOSwgMzYsIDQ0LCA1MiwgNjAsIDM3LCA0NSwgCi0gICAgIDUzLCA2MSwgMjIsIDMwLCAgNywgMTUsIDIzLCAzMSwKLSAgICAgMzgsIDQ2LCA1NCwgNjIsIDM5LCA0NywgNTUsIDYzCi19OwotCi0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIzYzUzMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfMTZ4MTYuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNi5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiAKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgQmxvY2sgbWF0Y2hpbmcsIGEgZnVsbCBzZWFyY2ggYWxnb3JpdGhtCi0gKiBpcyBpbXBsZW1lbnRlZAotICoKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2ICAgKDYuMi40LjIuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uICBSZXR1cm5zIHRoZSAKLSAqIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiAKLSAqIGVzdGltYXRlcyB0aGUgaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgCi0gKiByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgCi0gKiB0aGUgaW5pdGlhbCBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgCi0gKiBwU3JjUmVmQnVmIGFuZCBwU2VhcmNoUG9pbnRSZWZQb3Mgc2hvdWxkIGJlIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgCi0gKiAxNngxNiBpbnRlZ2VyIHNlYXJjaCBwcmlvciB0byBjYWxsaW5nIEJsb2NrTWF0Y2hfSGFsZl8xNngxNi4gVGhlIGZ1bmN0aW9uIAotICogQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBtYWNyb2Jsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKLSAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAotICogICBwUmVmUmVjdCAtIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlIAotICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKLSAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAyNTYgCi0gKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKLSAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAotICogICBwU2VhcmNoUG9pbnRSZWZQb3MgLSBwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgCi0gKiAgICAgICAgICAgIHNlYXJjaCAoc3BlY2lmaWVkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSAKLSAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLCBpLmUuLCB0aGUgcmVmZXJlbmNlIHBvc2l0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIAotICogICAgICAgICAgICBwcmVkaWN0ZWQgbW90aW9uIHZlY3Rvci4gCi0gKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKLSAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbCBNViBlc3RpbWF0ZTsgdHlwaWNhbGx5IGdlbmVyYXRlZCAKLSAqICAgICAgICAgICAgZHVyaW5nIGEgcHJpb3IgMTZYMTYgaW50ZWdlciBzZWFyY2g7IHNwZWNpZmllZCBpbiB0ZXJtcyBvZiAKLSAqICAgICAgICAgICAgaGFsZi1waXhlbCB1bml0cy4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAotICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAotICogICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwU2VhcmNoUG9pbnRSZWZQb3MsIHBTcmNEc3RNVi4KLSAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IgCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2KAotICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCi0gICAgIE9NWF9JTlQgcm5kVmFsLAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAotICAgICBPTVhfSU5UICpwRHN0U0FECi0pCi17Ci0KLSAgICAvKiBGb3IgYSBibG9ja3NpemUgb2YgMTZ4MTYgKi8KLSAgICBPTVhfVTggQmxvY2tTaXplID0gMTY7Ci0gICAgCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovICAKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmQnVmICAgICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBSZWZSZWN0ICAgICAgICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFNyY0N1cnJCdWYgICAgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU2VhcmNoUG9pbnRSZWZQb3MgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3RNViAgICAgICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjQ3VyckJ1ZiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgIAotICAgIHJldHVybiAoYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY1JlZkJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWZSZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjQ3VyckJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlYXJjaFBvaW50UmVmUG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRWYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNEc3RNViwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERzdFNBRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tTaXplKSk7Ci0KLQotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2RhNzlmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDguYworKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDguYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgQmxvY2sgbWF0Y2hpbmcsIGEgZnVsbCBzZWFyY2ggYWxnb3JpdGhtCi0gKiBpcyBpbXBsZW1lbnRlZAotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCAgICg2LjIuNC4yLjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhbiA4eDggYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uIFJldHVybnMgdGhlIAotICogZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgbWluaW11bSBTQUQuICBUaGlzIGZ1bmN0aW9uIAotICogZXN0aW1hdGVzIHRoZSBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciAKLSAqIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdE1WLCBpLmUuLCAKLSAqIHRoZSBpbml0aWFsIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIGV4dGVybmFsbHkuICBUaGUgaW5wdXQgcGFyYW1ldGVycyAKLSAqIHBTcmNSZWZCdWYgYW5kIHBTZWFyY2hQb2ludFJlZlBvcyBzaG91bGQgYmUgc2hpZnRlZCBieSB0aGUgd2lubmluZyBNViBvZiAKLSAqIDh4OCBpbnRlZ2VyIHNlYXJjaCBwcmlvciB0byBjYWxsaW5nIEJsb2NrTWF0Y2hfSGFsZl84eDguIFRoZSBmdW5jdGlvbiAKLSAqIEJsb2NrTWF0Y2hfSW50ZWdlcl84eDggbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIGJsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IDh4OCBibG9jayAKLSAqICAgICAgICAgICAgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAotICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCi0gKiAgIHBSZWZSZWN0IC0gcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUgCi0gKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAotICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDEyOCAKLSAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCi0gKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKLSAqICAgcFNlYXJjaFBvaW50UmVmUG9zIC0gcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIAotICogICAgICAgICAgICBzZWFyY2ggKHNwZWNpZmllZCBpbiB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzKSBpbiB0aGUgCi0gKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZS4gCi0gKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKLSAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbCBNViBlc3RpbWF0ZTsgdHlwaWNhbGx5IGdlbmVyYXRlZCAKLSAqICAgICAgICAgICAgZHVyaW5nIGEgcHJpb3IgOHg4IGludGVnZXIgc2VhcmNoLCBzcGVjaWZpZWQgaW4gdGVybXMgb2YgCi0gKiAgICAgICAgICAgIGhhbGYtcGl4ZWwgdW5pdHMuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcFNyY1JlZkJ1ZiwgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcFNlYXJjaFBvaW50UmVmUG9zLCBwU3JjRHN0TVYKLSAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDgoCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICAgT01YX0lOVCByZWZXaWR0aCwKLSAgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBTZWFyY2hQb2ludFJlZlBvcywKLSAgICAgT01YX0lOVCBybmRWYWwsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCi0gICAgIE9NWF9JTlQgKnBEc3RTQUQKLSkKLXsKLSAgICAvKiBGb3IgYSBibG9ja3NpemUgb2YgOHg4ICovCi0gICAgT01YX1U4IEJsb2NrU2l6ZSA9IDg7Ci0gICAgCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovICAKLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjUmVmQnVmICAgICAgICAgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBSZWZSZWN0ICAgICAgICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFNyY0N1cnJCdWYgICAgICAgID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwU2VhcmNoUG9pbnRSZWZQb3MgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3RNViAgICAgICAgICA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmNDdXJyQnVmKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgCi0gICAgcmV0dXJuIChhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjUmVmQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlZlJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNDdXJyQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2VhcmNoUG9pbnRSZWZQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJuZFZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0RzdE1WLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHN0U0FELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja1NpemUpKTsKLQotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIyNDAxNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYuYworKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNi5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGVzIGZvciBCbG9jayBtYXRjaGluZywgYSBmdWxsIHNlYXJjaCBhbGdvcml0aG0KLSAqIGlzIGltcGxlbWVudGVkCi0gKiAKLSAqLwotIAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiAgICg2LjIuNC4yLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIHNlYXJjaDsgZXN0aW1hdGVzIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgCi0gKiBtaW5pbXVtIFNBRC4gQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgCi0gKiBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgCi0gKiByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIAotICogZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IGlucHV0IE1WcyByZXByZXNlbnRlZCAKLSAqIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCi0gKiAgICAgICAgICAgIE1CIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gCi0gKiAgICAgICAgICAgIHRoZSBjdXJyZW50IHBsYW5lLiAKLSAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAotICogICBwUmVmUmVjdCAtIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSBwbGFuZSByZWN0YW5nbGU7IGNvb3JkaW5hdGVzIAotICogICAgICAgICAgICBhcmUgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBvcmlnaW4uICBSZWN0YW5nbGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJpZXMgbWF5IGV4dGVuZCBiZXlvbmQgaW1hZ2UgYm91bmRhcmllcyBpZiB0aGUgaW1hZ2UgaGFzIAotICogICAgICAgICAgICBiZWVuIHBhZGRlZC4gIEZvciBleGFtcGxlLCBpZiBwYWRkaW5nIGV4dGVuZHMgNCBwaXhlbHMgYmV5b25kIAotICogICAgICAgICAgICBmcmFtZSBib3JkZXIsIHRoZW4gdGhlIHZhbHVlIGZvciB0aGUgbGVmdCBib3JkZXIgY291bGQgYmUgc2V0IHRvIAotICogICAgICAgICAgICAtNC4gCi0gKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAotICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDI1NiAKLSAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAotICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNi4gCi0gKiAgIHBDdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAotICogICBwU3JjUHJlTVYgLSBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyAKLSAqICAgICAgICAgICAgcHJlZGljdGVkIE1WIAotICogICBwU3JjUHJlU0FEIC0gcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgCi0gKiAgICAgICAgICAgIGJ5IHBTcmNQcmVNVik7IG1heSBiZSBzZXQgdG8gTlVMTCBpZiB1bmF2YWlsYWJsZS4gCi0gKiAgIHBNRVNwZWMgLSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IAotICogICAgICAgICAgICBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCi0gKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgZnVuY3Rpb24uIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKLSAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAotICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKLSAqICAgICAgICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwQ3VyclBvaW50UG9zLCBwRHN0TVYsIHBEc3RTQUQgb3IgCi0gKiAgICAgICAgICAgICAgcE1FU3BlYywgb3IgCi0gKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQgCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2KAotICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgIE9NWF9JTlQgcmVmV2lkdGgsCi0gICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAotICAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAotICAgICB2b2lkICpwTUVTcGVjLAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAotICAgICBPTVhfSU5UICpwRHN0U0FECi0pCi17Ci0KLSAgIE9NWF9VOCBCbG9ja1NpemUgPSAxNjsKLSAgIAotICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovICAKLSAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY0N1cnJCdWYpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAKLSAgIHJldHVybiAoIGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIoCi0gICAgIHBTcmNSZWZCdWYsCi0gICAgIHJlZldpZHRoLAotICAgICBwUmVmUmVjdCwKLSAgICAgcFNyY0N1cnJCdWYsCi0gICAgIHBDdXJyUG9pbnRQb3MsCi0gICAgIHBTcmNQcmVNViwKLSAgICAgcFNyY1ByZVNBRCwKLSAgICAgcE1FU3BlYywKLSAgICAgcERzdE1WLAotICAgICBwRHN0U0FELAotICAgICBCbG9ja1NpemUpCi0gICAgICk7Ci0KLQotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2E5OWJkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDguYworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDguYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgQmxvY2sgbWF0Y2hpbmcsIGEgZnVsbCBzZWFyY2ggYWxnb3JpdGhtCi0gKiBpcyBpbXBsZW1lbnRlZAotICogCi0gKi8KLQotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtT01YLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLQotI2luY2x1ZGUgImFybVZDLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDggICAoNi4yLjQuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgYW4gOHg4IGJsb2NrIHNlYXJjaDsgZXN0aW1hdGVzIG1vdGlvbiB2ZWN0b3IgYW5kIGFzc29jaWF0ZWQgCi0gKiBtaW5pbXVtIFNBRC4gIEJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgbW90aW9uIHZlY3RvcnMgYXJlIHJlcHJlc2VudGVkIAotICogdXNpbmcgaGFsZi1waXhlbCB1bml0cywgYW5kIHRoZXJlZm9yZSBhIHNoaWZ0IGxlZnQgb3IgcmlnaHQgYnkgMSBiaXQgbWF5IGJlIAotICogcmVxdWlyZWQsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2ggdGhlIGlucHV0IG9yIG91dHB1dCBNVnMgd2l0aCBvdGhlciAKLSAqIGZ1bmN0aW9ucyB0aGF0IGVpdGhlciBnZW5lcmF0ZSBvdXRwdXQgTVZzIG9yIGV4cGVjdCBpbnB1dCBNVnMgcmVwcmVzZW50ZWQgCi0gKiB1c2luZyBpbnRlZ2VyIHBpeGVsIHVuaXRzLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBibG9jayB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCA4eDggYmxvY2sgCi0gKiAgICAgICAgICAgIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKLSAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAotICogICBwUmVmUmVjdCAtIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlZmVyZW5jZSBwbGFuZSByZWN0YW5nbGU7IGNvb3JkaW5hdGVzIAotICogICAgICAgICAgICBhcmUgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIHRoZSBpbWFnZSBvcmlnaW4uICBSZWN0YW5nbGUgCi0gKiAgICAgICAgICAgIGJvdW5kYXJpZXMgbWF5IGV4dGVuZCBiZXlvbmQgaW1hZ2UgYm91bmRhcmllcyBpZiB0aGUgaW1hZ2UgaGFzIAotICogICAgICAgICAgICBiZWVuIHBhZGRlZC4gCi0gKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIAotICogICAgICAgICAgICBidWZmZXIgZXh0cmFjdGVkIGZyb20gdGhlIG9yaWdpbmFsIHBsYW5lIChsaW5lYXIgYXJyYXksIDEyOCAKLSAqICAgICAgICAgICAgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIAotICogICAgICAgICAgICBieXRlcyBiZXR3ZWVuIGxpbmVzIChzdGVwKSBpcyAxNiBieXRlcy4gCi0gKiAgIHBDdXJyUG9pbnRQb3MgLSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKLSAqICAgcFNyY1ByZU1WIC0gcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gCi0gKiAgICAgICAgICAgIHByZWRpY3RlZCBNViAKLSAqICAgcFNyY1ByZVNBRCAtIHBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIAotICogICAgICAgICAgICBieSBwU3JjUHJlTVYpOyBtYXkgYmUgc2V0IHRvIE5VTEwgaWYgdW5hdmFpbGFibGUuIAotICogICBwTUVTcGVjIC0gdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyAKLSAqICAgICAgICAgICAgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAotICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nIGZ1bmN0aW9uLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdE1WIC0gcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYgCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIG1pbmltdW0gU0FEIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLiAgUmV0dXJuZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY1JlZkJ1ZiwgCi0gKiAgICAgICAgICAgICAgcFJlZlJlY3QsIHBTcmNDdXJyQnVmZiwgcEN1cnJQb2ludFBvcywgcERzdE1WLCBwRHN0U0FEIG9yIAotICogICAgICAgICAgICAgIHBNRVNwZWMsIG9yIAotICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgOC1ieXRlIGFsaWduZWQgCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCgKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgICBPTVhfSU5UIHJlZldpZHRoLAotICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNQcmVNViwKLSAgICAgY29uc3QgT01YX0lOVCAqcFNyY1ByZVNBRCwKLSAgICAgdm9pZCAqcE1FU3BlYywKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBEc3RNViwKLSAgICAgT01YX0lOVCAqcERzdFNBRAotKQotewotICAgT01YX1U4IEJsb2NrU2l6ZSA9IDg7Ci0gICAKLSAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLyAgCi0gICBhcm1SZXRBcmdFcnJJZighYXJtSXM4Qnl0ZUFsaWduZWQocFNyY0N1cnJCdWYpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAKLSAgIHJldHVybiAoIGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIoCi0gICAgIHBTcmNSZWZCdWYsCi0gICAgIHJlZldpZHRoLAotICAgICBwUmVmUmVjdCwKLSAgICAgcFNyY0N1cnJCdWYsCi0gICAgIHBDdXJyUG9pbnRQb3MsCi0gICAgIHBTcmNQcmVNViwKLSAgICAgcFNyY1ByZVNBRCwKLSAgICAgcE1FU3BlYywKLSAgICAgcERzdE1WLAotICAgICBwRHN0U0FELAotICAgICBCbG9ja1NpemUpCi0gICAgICk7Ci0KLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RDVDh4OGJsay5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRENUOHg4YmxrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3M2UyNGEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRENUOHg4YmxrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EQ1Q4eDhibGsuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgOHg4IGJsb2NrIERDVAotICogCi0gKi8KLSAKLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLQotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQ000UDJfRENUX1RhYmxlLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRENUOHg4YmxrICAgKDYuMi40LjQuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbXB1dGVzIGEgMkQgZm9yd2FyZCBEQ1QgZm9yIGEgc2luZ2xlIDh4OCBibG9jaywgYXMgZGVmaW5lZCBpbiAKLSAqIFtJU08xNDQ5Ni0yXS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBpbnB1dCBidWZmZXI7IG11c3QgCi0gKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgSW5wdXQgdmFsdWVzIChwaXhlbCAKLSAqICAgICAgICAgICAgaW50ZW5zaXRpZXMpIGFyZSB2YWxpZCBpbiB0aGUgcmFuZ2UgWy0yNTUsMjU1XS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgb3V0cHV0IGJ1ZmZlcjsgbXVzdCAKLSAqICAgICAgICAgICAgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCByZXR1cm5lZCBpZjoKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfRENUOHg4YmxrIChjb25zdCBPTVhfUzE2ICpwU3JjLCBPTVhfUzE2ICpwRHN0KQotewotICAgIE9NWF9JTlQgeCwgeSwgdSwgdjsKLSAgICAKLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0KLSAgICBmb3IgKHUgPSAwOyB1IDwgODsgdSsrKQotICAgIHsKLSAgICAgICAgZm9yICh2ID0gMDsgdiA8IDg7IHYrKykKLSAgICAgICAgewotICAgICAgICAgICAgT01YX0Y2NCBzdW0gPSAwLjA7Ci0gICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdW0gKz0gcFNyY1soeCAqIDgpICsgeV0gKgotICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfcHJlQ2FsY0RDVENvc1t4XVt1XSAqCi0gICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9wcmVDYWxjRENUQ29zW3ldW3ZdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBEc3RbKHUgKiA4KSArIHZdPSBhcm1Sb3VuZEZsb2F0VG9TMTYgKHN1bSk7ICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotCi0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM5YTdmNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246IAotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50ZXIgcmVjb25zdHJ1Y3Rpb24KLSAqIAotICovCi0gCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIgICAoNi4yLjUuNC4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogRGVjb2RlcyB0aGUgSU5URVIgYmxvY2sgY29lZmZpY2llbnRzLiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgCi0gKiBxdWFudGl6YXRpb24sIGludmVyc2UgemlnemFnIHBvc2l0aW9uaW5nLCBhbmQgSURDVCAod2l0aCBhcHByb3ByaWF0ZSAKLSAqIGNsaXBwaW5nIG9uIGVhY2ggc3RlcCkgb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgKHJlc2lkdWFscykgYXJlIAotICogcGxhY2VkIGluIGEgY29udGlndW91cyBhcnJheSBvZiA2NCBlbGVtZW50cy4gRm9yIElOVEVSIGJsb2NrLCB0aGUgb3V0cHV0IAotICogYnVmZmVyIGhvbGRzIHRoZSByZXNpZHVhbHMgZm9yIGZ1cnRoZXIgcmVjb25zdHJ1Y3Rpb24uIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCi0gKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSAKLSAqICAgICAgICAgICAgYnVmZmVyLiAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XSAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAotICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlY29kZWQgcmVzaWR1YWwgYnVmZmVyIChhIGNvbnRpZ3VvdXMgYXJyYXkgb2YgNjQgCi0gKiAgICAgICAgICAgIGVsZW1lbnRzIG9mIE9NWF9TMTYgZGF0YSB0eXBlKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTnVsbDogCi0gKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQgLCBwRHN0IAotICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCi0gKiAgICAtICAgIFFQIDw9IDAuIAotICogICAgLSAgICBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQgCi0gKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvci4gUmVmZXIgdG8gT01YX1N0c19FcnIgb2YgRGVjb2RlVkxDWmlnemFnX0ludGVyIC4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlcigKLSAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLSAgICAgT01YX1MxNiAqIHBEc3QsCi0gICAgIE9NWF9JTlQgUVAsCi0gICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKQotewotICAgIC8qIDY0IGVsZW1lbnRzIGFyZSBuZWVkZWQgYnV0IHRvIGFsaWduIGl0IHRvIDE2IGJ5dGVzIG5lZWQKLSAgICAxNSBtb3JlIGVsZW1lbnRzIG9mIHBhZGRpbmcgKi8KLSAgICBPTVhfUzE2IHRlbXBCdWZbNzldOwotICAgIE9NWF9TMTYgKnBUZW1wQnVmMTsKLSAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOwotICAgIC8qIEFsaWduaW5nIHRoZSBsb2NhbCBidWZmZXJzICovCi0gICAgcFRlbXBCdWYxID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1Zik7Ci0gICAgCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCpwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJpdE9mZnNldCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCgoUVAgPD0gMCkgfHwgKFFQID49IDMyKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQlhcm1SZXRBcmdFcnJJZigoKCpwQml0T2Zmc2V0IDwgMCkgfHwgKCpwQml0T2Zmc2V0ID4gNykpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLQotICAgIC8qIFZMRCBhbmQgemlnemFnICovCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcihwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBCdWYxLHNob3J0VmlkZW9IZWFkZXIpOwotICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIAotICAgIC8qIERlcXVhbnRpemF0aW9uICovCi0gICAgZXJyb3JDb2RlID0gb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSgKLSAgICAgcFRlbXBCdWYxLAotICAgICBRUCk7Ci0gICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgCi0gICAgLyogSW52ZXJzZSB0cmFuc2Zvcm0gKi8KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfSURDVDh4OGJsayhwVGVtcEJ1ZjEsIHBEc3QpOwotICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIAotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MGRhNmMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOiAKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludHJhIHJlY29uc3RydWN0aW9uCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhICAgKDYuMi41LjQuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIERlY29kZXMgdGhlIElOVFJBIGJsb2NrIGNvZWZmaWNpZW50cy4gSW52ZXJzZSBxdWFudGl6YXRpb24sIGludmVyc2VseSAKLSAqIHppZ3phZyBwb3NpdGlvbmluZywgYW5kIElEQ1QsIHdpdGggYXBwcm9wcmlhdGUgY2xpcHBpbmcgb24gZWFjaCBzdGVwLCBhcmUgCi0gKiBwZXJmb3JtZWQgb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgYXJlIHRoZW4gcGxhY2VkIGluIHRoZSBvdXRwdXQgCi0gKiBmcmFtZS9wbGFuZSBvbiBhIHBpeGVsIGJhc2lzLiAgTm90ZTogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgb25seSB3aGVuIAotICogYXQgbGVhc3Qgb25lIG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50IG9mIGN1cnJlbnQgYmxvY2sgZXhpc3RzIGluIHRoZSBiaXQgCi0gKiBzdHJlYW0uIFRoZSBEQyBvbmx5IGNvbmRpdGlvbiB3aWxsIGJlIGhhbmRsZWQgaW4gYW5vdGhlciBmdW5jdGlvbi4gCi0gKgotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCi0gKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSAKLSAqICAgICAgICAgICAgYnVmZmVyLiAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XS4gCi0gKiAgIHN0ZXAgLSB3aWR0aCBvZiB0aGUgZGVzdGluYXRpb24gcGxhbmUgCi0gKiAgIHBDb2VmQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIAotICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwQ29lZkJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgY3VyUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHdoaWNoIHRoZSBjdXJyZW50IGJsb2NrIAotICogICAgICAgICAgICBiZWxvbmdzIHRvIAotICogICBwUVBCdWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlciAKLSAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiBhcyAKLSAqICAgICAgICAgICAgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA2LjEuMy44LCBGaWd1cmUgNi01LiAKLSAqICAgaW50cmFEQ1ZMQyAtIGEgY29kZSBkZXRlcm1pbmVkIGJ5IGludHJhX2RjX3ZsY190aHIgYW5kIFFQLiBUaGlzIGFsbG93cyBhIAotICogICAgICAgICAgICBtZWNoYW5pc20gdG8gc3dpdGNoIGJldHdlZW4gdHdvIFZMQyBmb3IgY29kaW5nIG9mIEludHJhIERDIAotICogICAgICAgICAgICBjb2VmZmljaWVudHMgYXMgcGVyIFtJU08xNDQ5Ni0yXSwgVGFibGUgNi0yMS4gCi0gKiAgIEFDUHJlZEZsYWcgLSBhIGZsYWcgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIChvZiBsdW1pbmFuY2UpIGluZGljYXRpbmcgaWYgCi0gKiAgICAgICAgICAgIHRoZSBhYyBjb2VmZmljaWVudHMgb2YgdGhlIGZpcnN0IHJvdyBvciBmaXJzdCBjb2x1bW4gYXJlIAotICogICAgICAgICAgICBkaWZmZXJlbnRpYWxseSBjb2RlZCBmb3IgaW50cmEgY29kZWQgbWFjcm9ibG9jay4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAotICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCi0gKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIGRlc3RpbmF0aW9uIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gCi0gKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBDb2VmQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyLiAKLSAqICAgcENvZWZCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgIE5vdGU6IAotICogICAgICAgICAgICBUaGUgY29lZmZpY2llbnQgYnVmZmVycyBtdXN0IGJlIHVwZGF0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSAKLSAqICAgICAgICAgICAgdXBkYXRlIHByb2NlZHVyZSBkZWZpbmVkIGluIHNlY3Rpb24gNi4yLjIuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgCi0gKiAgICAgICAgIHBRUEJ1ZiwgcERzdC4gCi0gKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10gCi0gKiAgICAtICAgIGN1clFQIGV4Y2VlZHMgKDEsIDMxKQotICogICAgLSAgICBibG9ja0luZGV4IGV4Y2VlZHMgWzAsNV0KLSAqICAgIC0gICAgc3RlcCBpcyBub3QgdGhlIG11bHRpcGxlIG9mIDgKLSAqICAgIC0gICAgYSBwb2ludGVyIGFsaWdubWVudCByZXF1aXJlbWVudCB3YXMgdmlvbGF0ZWQuIAotICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IuIFJlZmVyIHRvIE9NWF9TdHNfRXJyIG9mIERlY29kZVZMQ1ppZ3phZ19JbnRyYS4gIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSgKLSAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgICBPTVhfVTggKnBEc3QsCi0gICAgIE9NWF9JTlQgc3RlcCwKLSAgICAgT01YX1MxNiAqcENvZWZCdWZSb3csCi0gICAgIE9NWF9TMTYgKnBDb2VmQnVmQ29sLAotICAgICBPTVhfVTggY3VyUVAsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFFQQnVmLAotICAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCi0gICAgIE9NWF9JTlQgaW50cmFEQ1ZMQywKLSAgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAotCSBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSApCi17Ci0gICAgT01YX1MxNiB0ZW1wQnVmMVs3OV0sIHRlbXBCdWYyWzc5XTsKLSAgICBPTVhfUzE2ICpwVGVtcEJ1ZjEsICpwVGVtcEJ1ZjI7Ci0gICAgT01YX0lOVCBwcmVkRGlyLCBwcmVkQUNEaXIsIGksIGosIGNvdW50OwotICAgIE9NWF9JTlQgIHByZWRRUDsKLSAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXA7Ci0gICAgT01YUmVzdWx0IGVycm9yQ29kZTsKLSAgICAKLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQ29lZkJ1ZlJvdyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocENvZWZCdWZDb2wgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBRUEJ1ZiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKChjdXJRUCA8PSAwKSB8fCAoY3VyUVAgPj0gMzIpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCgqcEJpdE9mZnNldCA8IDApIHx8ICgqcEJpdE9mZnNldCA+NyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoYmxvY2tJbmRleCA8IDApIHx8IChibG9ja0luZGV4ID4gNSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoc3RlcCAlIDgpICE9IDAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAKLQotICAgIC8qIEFsaWduaW5nIHRoZSBsb2NhbCBidWZmZXJzICovCi0gICAgcFRlbXBCdWYxID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1ZjEpOwotICAgIHBUZW1wQnVmMiA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYyKTsKLSAgICAKLSAgICAvKiBTZXR0aW5nIHRoZSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiBhbmQgcHJlZGljdGlvbiBkaXJlY3Rpb24gKi8KLSAgICBhcm1WQ000UDJfU2V0UHJlZERpcigKLSAgICAgICAgYmxvY2tJbmRleCwKLSAgICAgICAgcENvZWZCdWZSb3csCi0gICAgICAgIHBDb2VmQnVmQ29sLAotICAgICAgICAmcHJlZERpciwKLSAgICAgICAgJnByZWRRUCwKLSAgICAgICAgcFFQQnVmKTsKLQotICAgIHByZWRBQ0RpciA9IHByZWREaXI7Ci0KLSAgICBhcm1SZXRBcmdFcnJJZigoKHByZWRRUCA8PSAwKSB8fCAocHJlZFFQID49IDMyKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIGlmIChBQ1ByZWRGbGFnID09IDApCi0gICAgewotICAgICAgICBwcmVkQUNEaXIgPSBPTVhfVkNfTk9ORTsKLSAgICB9Ci0KLSAgICAvKiBTZXR0aW5nIHRoZSB2aWRlb0NvbXAgKi8KLSAgICBpZiAoYmxvY2tJbmRleCA8PSAzKQotICAgIHsKLSAgICAgICAgdmlkZW9Db21wID0gT01YX1ZDX0xVTUlOQU5DRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdmlkZW9Db21wID0gT01YX1ZDX0NIUk9NSU5BTkNFOwotICAgIH0KLSAgICAKLQotICAgIC8qIFZMRCBhbmQgemlnemFnICovCi0gICAgaWYgKGludHJhRENWTEMgPT0gMSkKLSAgICB7Ci0gICAgICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQygKLSAgICAgICAgICAgIHBwQml0U3RyZWFtLAotICAgICAgICAgICAgcEJpdE9mZnNldCwKLSAgICAgICAgICAgIHBUZW1wQnVmMSwKLSAgICAgICAgICAgIHByZWRBQ0RpciwKLSAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgICAgICAgICB2aWRlb0NvbXApOwotICAgICAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDKAotICAgICAgICAgICAgcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICBwQml0T2Zmc2V0LAotICAgICAgICAgICAgcFRlbXBCdWYxLAotICAgICAgICAgICAgcHJlZEFDRGlyLAotICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcik7Ci0gICAgICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIH0KLQotICAgIC8qIEFDIERDIHByZWRpY3Rpb24gKi8KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhKAotICAgICAgICBwVGVtcEJ1ZjEsCi0gICAgICAgIHBDb2VmQnVmUm93LAotICAgICAgICBwQ29lZkJ1ZkNvbCwKLSAgICAgICAgY3VyUVAsCi0gICAgICAgIHByZWRRUCwKLSAgICAgICAgcHJlZERpciwKLSAgICAgICAgQUNQcmVkRmxhZywKLSAgICAgICAgdmlkZW9Db21wKTsKLSAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKLSAgICAKLSAgICAvKiBEZXF1YW50aXphdGlvbiAqLwotICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9RdWFudEludkludHJhX0koCi0gICAgIHBUZW1wQnVmMSwKLSAgICAgY3VyUVAsCi0gICAgIHZpZGVvQ29tcCwKLSAgICAgc2hvcnRWaWRlb0hlYWRlcik7Ci0gICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7Ci0gICAgCi0gICAgLyogSW52ZXJzZSB0cmFuc2Zvcm0gKi8KLSAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfSURDVDh4OGJsayAocFRlbXBCdWYxLCBwVGVtcEJ1ZjIpOwotICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIAotICAgIC8qIFBsYWNpbmcgdGhlIGxpbmVhciBhcnJheSBpbnRvIHRoZSBkZXN0aW5hdGlvbiBwbGFuZSBhbmQgY2xpcHBpbmcKLSAgICAgICBpdCB0byAwIHRvIDI1NSAqLwotICAgIGZvciAoaiA9IDAsIGNvdW50ID0gMDsgaiA8IDg7IGorKykKLSAgICB7Ci0gICAgICAgIGZvcihpID0gMDsgaSA8IDg7IGkrKywgY291bnQrKykKLSAgICAgICAgewotICAgICAgICAgICAgcERzdFtpXSA9IGFybUNsaXAgKDAsIDI1NSwgcFRlbXBCdWYyW2NvdW50XSk7Ci0gICAgICAgIH0KLSAgICAgICAgcERzdCArPSBzdGVwOwotICAgIH0KLQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUyYzIyMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjogCi0gKiBDb250YWlucyBtb2R1bGUgZm9yIGRlY29kaW5nIE1WIGFuZCBwYWRkaW5nIHRoZSBzYW1lCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oIgotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICAgKDYuMi41LjEuMSkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIERlY29kZXMgYW5kIHBhZHMgdGhlIGZvdXIgbW90aW9uIHZlY3RvcnMgYXNzb2NpYXRlZCB3aXRoIGEgbm9uLWludHJhIFAtVk9QIAotICogbWFjcm9ibG9jay4gIEZvciBtYWNyb2Jsb2NrcyBvZiB0eXBlIE9NWF9WQ19JTlRFUjRWLCB0aGUgb3V0cHV0IE1WIGlzIAotICogcGFkZGVkIGFzIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMS42LiBPdGhlcndpc2UsIGZvciAKLSAqIG1hY3JvYmxvY2tzIG9mIHR5cGVzIG90aGVyIHRoYW4gT01YX1ZDX0lOVEVSNFYsIHRoZSBkZWNvZGVkIE1WIGlzIGNvcGllZCB0byAKLSAqIGFsbCBmb3VyIG91dHB1dCBNViBidWZmZXIgZW50cmllcy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKLSAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XS4gCi0gKiAgIHBTcmNNVkxlZnRNQiwgcFNyY01WVXBwZXJNQiwgYW5kIHBTcmNNVlVwcGVyUmlnaHRNQiAtIHBvaW50ZXJzIHRvIHRoZSAKLSAqICAgICAgICAgICAgbW90aW9uIHZlY3RvciBidWZmZXJzIG9mIHRoZSBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIGxlZnQsIAotICogICAgICAgICAgICB1cHBlciwgYW5kIHVwcGVyLXJpZ2h0IHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaywgCi0gKiAgICAgICAgICAgIHJlc3BlY3RpdmVseTsgYSB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gIE5vdGU6IAotICogICAgICAgICAgICBBbnkgbmVpZ2hib3Job29kIG1hY3JvYmxvY2sgb3V0c2lkZSB0aGUgY3VycmVudCBWT1Agb3IgdmlkZW8gCi0gKiAgICAgICAgICAgIHBhY2tldCBvciBvdXRzaWRlIHRoZSBjdXJyZW50IEdPQiAod2hlbiBzaG9ydF92aWRlb19oZWFkZXIgaXMgCi0gKiAgICAgICAgICAgICAxICkgZm9yIHdoaWNoIGdvYl9oZWFkZXJfZW1wdHkgaXMgIDAgIGlzIHRyZWF0ZWQgYXMgCi0gKiAgICAgICAgICAgIHRyYW5zcGFyZW50LCBhY2NvcmRpbmcgdG8gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjUuIAotICogICBmY29kZUZvcndhcmQgLSBhIGNvZGUgZXF1YWwgdG8gdm9wX2Zjb2RlX2ZvcndhcmQgaW4gTVBFRy00IGJpdCBzdHJlYW0gCi0gKiAgICAgICAgICAgIHN5bnRheCAKLSAqICAgTUJUeXBlIC0gdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4gSWYgTUJUeXBlIGlzIG5vdCBlcXVhbCB0byAKLSAqICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYsIHRoZSBkZXN0aW5hdGlvbiBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpcyBzdGlsbCAKLSAqICAgICAgICAgICAgZmlsbGVkIHdpdGggdGhlIHNhbWUgZGVjb2RlZCB2ZWN0b3IuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKLSAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3RNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXIgZm9yIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBtYWNyb2Jsb2NrOyBjb250YWlucyBmb3VyIGRlY29kZWQgbW90aW9uIHZlY3RvcnMgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0TVZDdXJNQiAKLSAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQotICogICAgLSAgICBmY29kZUZvcndhcmQgZXhjZWVkcyAoMCw3XQotICogICAgLSAgICBNQlR5cGUgbGVzcyB0aGFuIHplcm8KLSAqICAgIC0gICAgbW90aW9uIHZlY3RvciBidWZmZXIgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKLSAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1AoCi0gICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICogcFNyY01WTGVmdE1CLAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WVXBwZXJNQiwKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IgKiBwU3JjTVZVcHBlclJpZ2h0TUIsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yICogcERzdE1WQ3VyTUIsCi0gICAgIE9NWF9JTlQgZmNvZGVGb3J3YXJkLAotICAgICBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZSBNQlR5cGUKLSApCi17Ci0gICAgT01YVkNNb3Rpb25WZWN0b3IgZGlmZk1WOwotICAgIE9NWFZDTW90aW9uVmVjdG9yIGRzdE1WUHJlZE1FWzEyXTsKLSAgICBPTVhfSU5UIGlCbGssIGksIGNvdW50ID0gMTsKLSAgICBPTVhfUzMyIG12SG9yUmVzaWR1YWwgPSAxLCBtdlZlclJlc2lkdWFsID0gMSwgbXZIb3JEYXRhLCBtdlZlckRhdGE7Ci0gICAgT01YX1M4IHNjYWxlRmFjdG9yLCBpbmRleDsKLSAgICBPTVhfUzE2IGhpZ2gsIGxvdywgcmFuZ2U7Ci0KLQotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigqcHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCaXRPZmZzZXQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3RNVkN1ck1CID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoKCpwQml0T2Zmc2V0IDwgMCkgfHwgKCpwQml0T2Zmc2V0ID4gNykpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKChmY29kZUZvcndhcmQgPCAxKSB8fCAoZmNvZGVGb3J3YXJkID4gNykpLCBcCi0gICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM0Qnl0ZUFsaWduZWQocERzdE1WQ3VyTUIpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgCi0gICAgaWYgKChNQlR5cGUgPT0gT01YX1ZDX0lOVFJBKSB8fAotICAgICAgICAoTUJUeXBlID09IE9NWF9WQ19JTlRSQV9RKQotICAgICAgICkKLSAgICB7Ci0gICAgICAgIC8qIEFsbCBNVidzIGFyZSB6ZXJvICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEc3RNVkN1ck1CW2ldLmR4ID0gMDsKLSAgICAgICAgICAgIHBEc3RNVkN1ck1CW2ldLmR5ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotICAgIH0KLQotICAgIGlmICgoTUJUeXBlID09IE9NWF9WQ19JTlRFUjRWKSB8fCAoTUJUeXBlID09IE9NWF9WQ19JTlRFUjRWX1EpKQotICAgIHsKLSAgICAgICAgY291bnQgPSA0OwotICAgIH0KLSAgICBlbHNlIGlmICgoTUJUeXBlID09IE9NWF9WQ19JTlRFUikgfHwgKE1CVHlwZSA9PSBPTVhfVkNfSU5URVJfUSkpCi0gICAgewotICAgICAgICBjb3VudCA9IDE7Ci0gICAgfQotCi0gICAgLyogQ2FsY3VsYXRpbmcgdGhlIHNjYWxlIGZhY3RvciAqLwotICAgIHNjYWxlRmFjdG9yID0gMSA8PCAoZmNvZGVGb3J3YXJkIC0xKTsKLSAgICBoaWdoID0gICggMzIgKiBzY2FsZUZhY3RvcikgLSAxOwotICAgIGxvdyA9ICAgKCAoLTMyKSAqIHNjYWxlRmFjdG9yKTsKLSAgICByYW5nZSA9ICggNjQgKiBzY2FsZUZhY3Rvcik7Ci0KLSAgICAvKiBIdWZmbWFuIGRlY29kaW5nIGFuZCBNViByZWNvbnN0cnVjdGlvbiAqLwotICAgIGZvciAoaUJsayA9IDA7IGlCbGsgPCBjb3VudDsgaUJsaysrKQotICAgIHsKLQotICAgICAgICAvKiBIdWZmbWFuIGRlY29kaW5nIHRvIGdldCBIb3Jpem9udGFsIGRhdGEgYW5kIHJlc2lkdWFsICovCi0gICAgICAgIGluZGV4ID0gYXJtVW5QYWNrVkxDMzIocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9hVmxjTVZEKTsKLSAgICAgICAgYXJtUmV0RGF0YUVycklmKGluZGV4ID09IC0xLCBPTVhfU3RzX0Vycik7Ci0KLSAgICAgICAgbXZIb3JEYXRhID0gaW5kZXggLSAzMjsKLQotICAgICAgICBpZiAoKGZjb2RlRm9yd2FyZCA+IDEpICYmIChtdkhvckRhdGEgIT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG12SG9yUmVzaWR1YWwgPSAoT01YX1MzMikgYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdE9mZnNldCwgKGZjb2RlRm9yd2FyZCAtMSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSHVmZm1hbiBkZWNvZGluZyB0byBnZXQgVmVydGljYWwgZGF0YSBhbmQgcmVzaWR1YWwgKi8KLSAgICAgICAgaW5kZXggPSBhcm1VblBhY2tWTEMzMihwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgYXJtVkNNNFAyX2FWbGNNVkQpOwotICAgICAgICBhcm1SZXREYXRhRXJySWYoaW5kZXggPT0gLTEsIE9NWF9TdHNfRXJyKTsKLQotICAgICAgICBtdlZlckRhdGEgPSBpbmRleCAtIDMyOwotCi0gICAgICAgIGlmICgoZmNvZGVGb3J3YXJkID4gMSkgJiYgKG12VmVyRGF0YSAhPSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgbXZWZXJSZXNpZHVhbCA9IChPTVhfUzMyKSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0T2Zmc2V0LCAoZmNvZGVGb3J3YXJkIC0xKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDYWxjdWxhdGluZyB0aGUgZGlmZmVydGlhbCBNViAqLwotICAgICAgICBpZiAoIChzY2FsZUZhY3RvciA9PSAxKSB8fCAobXZIb3JEYXRhID09IDApICkKLSAgICAgICAgewotICAgICAgICAgICAgZGlmZk1WLmR4ID0gbXZIb3JEYXRhOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZGlmZk1WLmR4ID0gKChhcm1BYnMobXZIb3JEYXRhKSAtIDEpICogZmNvZGVGb3J3YXJkKQotICAgICAgICAgICAgICAgICAgICAgICAgICsgbXZIb3JSZXNpZHVhbCArIDE7Ci0gICAgICAgICAgICBpZiAobXZIb3JEYXRhIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkaWZmTVYuZHggPSAtZGlmZk1WLmR4OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCAoc2NhbGVGYWN0b3IgPT0gMSkgfHwgKG12VmVyRGF0YSA9PSAwKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRpZmZNVi5keSA9IG12VmVyRGF0YTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRpZmZNVi5keSA9ICgoYXJtQWJzKG12VmVyRGF0YSkgLSAxKSAqIGZjb2RlRm9yd2FyZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICArIG12VmVyUmVzaWR1YWwgKyAxOwotICAgICAgICAgICAgaWYgKG12VmVyRGF0YSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGlmZk1WLmR5ID0gLWRpZmZNVi5keTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIEZpbmQgdGhlIHByZWRpY3RlZCB2ZWN0b3IgKi8KLSAgICAgICAgb214VkNNNFAyX0ZpbmRNVnByZWQgKAotICAgICAgICAgICAgcERzdE1WQ3VyTUIsCi0gICAgICAgICAgICBwU3JjTVZMZWZ0TUIsCi0gICAgICAgICAgICBwU3JjTVZVcHBlck1CLAotICAgICAgICAgICAgcFNyY01WVXBwZXJSaWdodE1CLAotICAgICAgICAgICAgJnBEc3RNVkN1ck1CW2lCbGtdLAotICAgICAgICAgICAgZHN0TVZQcmVkTUUsCi0gICAgICAgICAgICBpQmxrKTsKLQotICAgICAgICAvKiBBZGRpbmcgdGhlIGRpZmZlcmVuY2UgdG8gdGhlIHByZWRpY3RlZCBNViB0byByZWNvbnN0cnVjdCBNViAqLwotICAgICAgICBwRHN0TVZDdXJNQltpQmxrXS5keCArPSBkaWZmTVYuZHg7Ci0gICAgICAgIHBEc3RNVkN1ck1CW2lCbGtdLmR5ICs9IGRpZmZNVi5keTsKLQotICAgICAgICAvKiBDaGVja2luZyB0aGUgcmFuZ2UgYW5kIGtlZXBpbmcgaXQgd2l0aGluIHRoZSBsaW1pdHMgKi8KLSAgICAgICAgaWYgKCBwRHN0TVZDdXJNQltpQmxrXS5keCA8IGxvdyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEc3RNVkN1ck1CW2lCbGtdLmR4ICs9IHJhbmdlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwRHN0TVZDdXJNQltpQmxrXS5keCA+IGhpZ2gpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEc3RNVkN1ck1CW2lCbGtdLmR4IC09IHJhbmdlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBwRHN0TVZDdXJNQltpQmxrXS5keSA8IGxvdyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEc3RNVkN1ck1CW2lCbGtdLmR5ICs9IHJhbmdlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwRHN0TVZDdXJNQltpQmxrXS5keSA+IGhpZ2gpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEc3RNVkN1ck1CW2lCbGtdLmR5IC09IHJhbmdlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKChNQlR5cGUgPT0gT01YX1ZDX0lOVEVSKSB8fCAoTUJUeXBlID09IE9NWF9WQ19JTlRFUl9RKSkKLSAgICB7Ci0gICAgICAgIHBEc3RNVkN1ck1CWzFdID0gcERzdE1WQ3VyTUJbMF07Ci0gICAgICAgIHBEc3RNVkN1ck1CWzJdID0gcERzdE1WQ3VyTUJbMF07Ci0gICAgICAgIHBEc3RNVkN1ck1CWzNdID0gcERzdE1WQ3VyTUJbMF07Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDNjZjZlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjogCi0gKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBkZWNvZGluZwotICogZm9yIGludGVyIGJsb2NrLgotICoKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgiCi0jaW5jbHVkZSAiYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaCIKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyICAgKDYuMi41LjIuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludGVyLWNvZGVkIGJsb2NrLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgaW4gdGhlIGN1cnJlbnQgc3RyZWFtIAotICogICAgICAgICAgICBieXRlIHJlZmVyZW5jZWQgYnkgKnBwQml0U3RyZWFtLiBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIAotICogICAgICAgICAgICB2YWxpZCB3aXRoaW4gdGhlIHJhbmdlIFswLTddLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAotICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBkZWNvZGluZyBzdWNoIHRoYXQgaXQgcG9pbnRzIAotICogICAgICAgICAgICB0byB0aGUgbmV4dCBhdmFpbGFibGUgYml0IGluIHRoZSBzdHJlYW0gYnl0ZSByZWZlcmVuY2VkIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudCBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKLSAqICAgICAgICAgcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdAotICogICAgLSAgICBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZAotICogICAgLSAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KLSAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yLCBpZjoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG1hcmsgYml0IGlzIGVxdWFsIHRvIHplcm8gCi0gKiAgICAtICAgIEVuY291bnRlcmVkIGFuIGlsbGVnYWwgc3RyZWFtIGNvZGUgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFZMQyB0YWJsZSAKLSAqICAgIC0gICAgRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBjb2RlIGluIHRoZSBWTEMgRkxDIHRhYmxlIAotICogICAgLSAgICBUaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQgCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyKAotICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotICAgICBPTVhfUzE2ICogcERzdCwKLSAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pCi17Ci0gICAgT01YX1U4ICBsYXN0LHN0YXJ0ID0gMDsKLSAgICBjb25zdCBPTVhfVTggICpwWmlnemFnVGFibGUgPSBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW47Ci0gICAgT01YUmVzdWx0IGVycm9yQ29kZTsKLSAgICAKLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM0Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIGVycm9yQ29kZSA9IGFybVZDTTRQMl9HZXRWTENCaXRzICgKLSAgICAgICAgICAgICAgcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICAgIHBCaXRPZmZzZXQsCi0JCQkgIHBEc3QsCi0JCQkgIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgICAgICAgICAgIHN0YXJ0LAotCQkJICAmbGFzdCwKLQkJCSAgMTEsCi0JCQkgIDQyLAotCQkJICAgMiwKLQkJCSAgIDUsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwwUnVuSWR4LAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50ZXJWbGNMMCwKLQkJCSAgYXJtVkNNNFAyX0ludGVyTDFSdW5JZHgsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlclZsY0wxLAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMExNQVgsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwxTE1BWCwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDBSTUFYLAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMVJNQVgsCi0gICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSApOwotICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOwotICAgIAotICAgIGlmIChsYXN0ID09IDApCi0gICAgewotICAgICAgICByZXR1cm4gT01YX1N0c19FcnI7Ci0gICAgfQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRkZGFmMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOiAKLSAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCi0gKiBmb3IgaW50cmEgYmxvY2suCi0gKgotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgICAoNi4yLjUuMi4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgCi0gKiBmb3Igb25lIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgCi0gKiBwcm92aWRlZCBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKLSAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKLSAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgCi0gKiAgICAgICAgICAgIGJpdHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgYnl0ZSByZWZlcmVuY2VkIAotICogICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uICBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIHZhbGlkIGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWzAtN10uIEJpdCBQb3NpdGlvbiBpbiBvbmUgYnl0ZTogIHxNb3N0IExlYXN0fCAqcEJpdE9mZnNldCAKLSAqICAgICAgICAgICAgfDAgMSAyIDMgNCA1IDYgN3wgCi0gKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjsgdXNlZCB0byBzZWxlY3QgdGhlIHppZ3phZyBzY2FuIAotICogICAgICAgICAgICBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IE9NWF9WQ19OT05FIC0gQUMgCi0gKiAgICAgICAgICAgIHByZWRpY3Rpb24gbm90IHVzZWQ7IHBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uOyBwZXJmb3JtcyAKLSAqICAgICAgICAgICAgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuOyBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCAKLSAqICAgICAgICAgICAgcHJlZGljdGlvbjsgcGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQgc3VjaCAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHN1Y2ggdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKLSAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcERzdCwgCi0gKiAgICAgICAgICAgICAgb3IgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKLSAqICAgICAgICAgICAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddLCBwcmVEaXIgZXhjZWVkcyBbMCwyXSwgb3IgcERzdCBpcyAKLSAqICAgICAgICAgICAgICBub3QgNC1ieXRlIGFsaWduZWQgCi0gKiAgICBPTVhfU3RzX0VyciBJbiBEZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgZGNfc2l6ZSA+IDEyIEF0IGxlYXN0IG9uZSBvZiAKLSAqICAgICAgICAgICAgICBtYXJrIGJpdHMgZXF1YWxzIHplcm8gSWxsZWdhbCBzdHJlYW0gZW5jb3VudGVyZWQ7IGNvZGUgY2Fubm90IAotICogICAgICAgICAgICAgIGJlIGxvY2F0ZWQgaW4gVkxDIHRhYmxlIEZvcmJpZGRlbiBjb2RlIGVuY291bnRlcmVkIGluIHRoZSBWTEMgCi0gKiAgICAgICAgICAgICAgRkxDIHRhYmxlIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKLSAqCi0gKi8KLQotCi1PTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDKAotICAgICBjb25zdCBPTVhfVTggKiogcHBCaXRTdHJlYW0sCi0gICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAotICAgICBPTVhfUzE2ICogcERzdCwKLSAgICAgT01YX1U4IHByZWREaXIsCi0gICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKQotewotICAgIE9NWF9VOCBzdGFydCA9IDA7Ci0KLSAgICByZXR1cm4gYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYSgKLSAgICAgcHBCaXRTdHJlYW0sCi0gICAgIHBCaXRPZmZzZXQsCi0gICAgIHBEc3QsCi0gICAgIHByZWREaXIsCi0gICAgIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgIHN0YXJ0KTsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNzZlZDEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYworKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjogCi0gKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBkZWNvZGluZwotICogZm9yIGludHJhIGJsb2NrLgotICoKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLSNpbmNsdWRlICJhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgiCi0jaW5jbHVkZSAiYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaCIKLQotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICg2LjIuNS4yLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyAKLSAqIGZvciBvbmUgaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSAKLSAqIHByb3ZpZGVkIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAotICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIEludHJhIERDIAotICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZy4gIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSAKLSAqICAgICAgICAgICAgYml0c3RyZWFtIGJ1ZmZlciAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBieXRlIHJlZmVyZW5jZWQgCi0gKiAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgdmFsaWQgaW4gdGhlIAotICogICAgICAgICAgICByYW5nZSBbMC03XS4gCi0gKiAgICAgICAgICAgIEJpdCBQb3NpdGlvbiBpbiBvbmUgYnl0ZTogIHxNb3N0ICAgICAgTGVhc3R8IAotICogICAgICAgICAgICAgICAgICAgICpwQml0T2Zmc2V0ICAgICAgICB8MCAxIDIgMyA0IDUgNiA3fCAKLSAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uOyB1c2VkIHRvIHNlbGVjdCB0aGUgemlnemFnIHNjYW4gCi0gKiAgICAgICAgICAgIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZDsgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb247IAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2NhbjsgCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb247IAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKLSAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSBvciBjaHJvbWluYW5jZSkgb2YgdGhlIAotICogICAgICAgICAgICBjdXJyZW50IGJsb2NrIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzdWNoIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IAotICogICAgICAgICAgICBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudCBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgNC1ieXRlIGFsaWduZWQuIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCi0gKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QKLSAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQotICogICAgLSAgICBwcmVEaXIgZXhjZWVkcyBbMCwyXQotICogICAgLSAgICBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZCAKLSAqICAgIE9NWF9TdHNfRXJyIC0gaWY6Ci0gKiAgICAtICAgIEluIERlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLCBkY19zaXplID4gMTIgCi0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiBtYXJrIGJpdHMgZXF1YWxzIHplcm8gCi0gKiAgICAtICAgIElsbGVnYWwgc3RyZWFtIGVuY291bnRlcmVkOyBjb2RlIGNhbm5vdCBiZSBsb2NhdGVkIGluIFZMQyB0YWJsZSAKLSAqICAgIC0gICAgRm9yYmlkZGVuIGNvZGUgZW5jb3VudGVyZWQgaW4gdGhlIFZMQyBGTEMgdGFibGUuIAotICogICAgLSAgICBUaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQgCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMoCi0gICAgIGNvbnN0IE9NWF9VOCAqKiBwcEJpdFN0cmVhbSwKLSAgICAgT01YX0lOVCAqIHBCaXRPZmZzZXQsCi0gICAgIE9NWF9TMTYgKiBwRHN0LAotICAgICBPTVhfVTggcHJlZERpciwKLSAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotICAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKLSkKLXsKLSAgICAvKiBEdW1teSBpbml0aWxhaXphdGlvbiB0byByZW1vdmUgY29tcGlsYXRpb24gZXJyb3IgKi8KLSAgICBPTVhfUzggIERDVmFsdWVTaXplID0gMDsKLSAgICBPTVhfVTE2IHBvd09mU2l6ZSwgZmV0Y2hEQ2JpdHM7Ci0gICAgT01YX1U4IHN0YXJ0ID0gMTsKLQotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigqcHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBCaXRPZmZzZXQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczRCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCgqcEJpdE9mZnNldCA8IDApIHx8ICgqcEJpdE9mZnNldCA+IDcpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKHByZWREaXIgPiAyKSwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgLyogSW5zZXJ0IHRoZSBjb2RlIGludG8gdGhlIGJpdHN0cmVhbSAqLwotICAgIGlmICh2aWRlb0NvbXAgPT0gT01YX1ZDX0xVTUlOQU5DRSkKLSAgICB7Ci0gICAgICAgIERDVmFsdWVTaXplID0gYXJtVW5QYWNrVkxDMzIocHBCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdE9mZnNldCwgYXJtVkNNNFAyX2FJbnRyYURDTHVtYUluZGV4KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAodmlkZW9Db21wID09IE9NWF9WQ19DSFJPTUlOQU5DRSkKLSAgICB7Ci0gICAgICAgIERDVmFsdWVTaXplID0gYXJtVW5QYWNrVkxDMzIocHBCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdE9mZnNldCwgYXJtVkNNNFAyX2FJbnRyYURDQ2hyb21hSW5kZXgpOwotICAgIH0KLSAgICBhcm1SZXREYXRhRXJySWYoRENWYWx1ZVNpemUgPT0gLTEsIE9NWF9TdHNfRXJyKTsKLSAgICBhcm1SZXREYXRhRXJySWYoRENWYWx1ZVNpemUgPiAxMiwgT01YX1N0c19FcnIpOwotCi0KLSAgICBpZiAoRENWYWx1ZVNpemUgPT0gMCkKLSAgICB7Ci0gICAgICAgIHBEc3RbMF0gPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmZXRjaERDYml0cyA9IChPTVhfVTE2KSBhcm1HZXRCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRENWYWx1ZVNpemUpOwotCi0gICAgICAgIGlmICggKGZldGNoRENiaXRzID4+IChEQ1ZhbHVlU2l6ZSAtIDEpKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBjYWx1bGF0ZSBwb3cgKi8KLSAgICAgICAgICAgIHBvd09mU2l6ZSA9ICgxIDw8IERDVmFsdWVTaXplKTsKLQotICAgICAgICAgICAgcERzdFswXSA9ICAoT01YX1MxNikgKGZldGNoRENiaXRzIF4gKHBvd09mU2l6ZSAtIDEpKTsKLSAgICAgICAgICAgIHBEc3RbMF0gPSAtcERzdFswXTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEc3RbMF0gPSBmZXRjaERDYml0czsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChEQ1ZhbHVlU2l6ZSA+IDgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHJlYWRpbmcgYW5kIGNoZWNraW5nIHRoZSBtYXJrZXIgYml0Ki8KLSAgICAgICAgICAgIGFybVJldERhdGFFcnJJZiAoYXJtR2V0Qml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgMSkgPT0gMCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0Vycik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYSgKLSAgICAgICAgICAgICAgICBwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgICBwQml0T2Zmc2V0LAotICAgICAgICAgICAgICAgIHBEc3QsCi0gICAgICAgICAgICAgICAgcHJlZERpciwKLSAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLAotICAgICAgICAgICAgICAgIHN0YXJ0KTsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlTVYuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZU1WLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNGEyMzYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlTVYuYworKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0VuY29kZU1WLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjogCi0gKiBDb250YWlucyBtb2R1bGUgZm9yIHByZWRpY3RpbmcgTVYgb2YgTUIKLSAqCi0gKi8gCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtQ09NTV9CaXRzdHJlYW0uaCIKLSNpbmNsdWRlICJhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgiCi0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZU1WICAgKDYuMi40LjUuNCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFByZWRpY3RzIGEgbW90aW9uIHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaywgZW5jb2RlcyB0aGUgCi0gKiBkaWZmZXJlbmNlLCBhbmQgd3JpdGVzIHRoZSBvdXRwdXQgdG8gdGhlIHN0cmVhbSBidWZmZXIuIFRoZSBpbnB1dCBNVnMgCi0gKiBwTVZDdXJNQiwgcFNyY01WTGVmdE1CLCBwU3JjTVZVcHBlck1CLCBhbmQgcFNyY01WVXBwZXJSaWdodE1CIHNob3VsZCBsaWUgCi0gKiB3aXRoaW4gdGhlIHJhbmdlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGlucHV0IHBhcmFtZXRlciBmY29kZUZvcndhcmQsIGFzIAotICogZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4zLiAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIAotICogc3VwZXJzZXQgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBmdW5jdGlvbiAKLSAqIG9teFZDTTRQMl9GaW5kTVZwcmVkLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSBpbmRleCBvZiB0aGUgZmlyc3QgZnJlZSAobmV4dCBhdmFpbGFibGUpIGJpdCBpbiB0aGUgc3RyZWFtIAotICogICAgICAgICAgICBidWZmZXIgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0sIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDcuIAotICogICBwTVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIHZhbHVlIG9mIAotICogICAgICAgICAgICBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCi0gKiAgIHBTcmNNVkxlZnRNQiAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBsZWZ0IG1hY3JvYmxvY2sgbW90aW9uIHZlY3RvcjsgYSAKLSAqICAgICAgICAgICAgdmFsdWUgb2YgIE5VTExpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAotICogICBwU3JjTVZVcHBlck1CIC0gcG9pbnRlciB0byBzb3VyY2UgdXBwZXIgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIAotICogICAgICAgICAgICB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCi0gKiAgIHBTcmNNVlVwcGVyUmlnaHRNQiAtIHBvaW50ZXIgdG8gc291cmNlIHVwcGVyIHJpZ2h0IE1CIG1vdGlvbiB2ZWN0b3I7IGEgCi0gKiAgICAgICAgICAgIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKLSAqICAgZmNvZGVGb3J3YXJkIC0gYW4gaW50ZWdlciB3aXRoIHZhbHVlcyBmcm9tIDEgdG8gNzsgdXNlZCBpbiBlbmNvZGluZyAKLSAqICAgICAgICAgICAgbW90aW9uIHZlY3RvcnMgcmVsYXRlZCB0byBzZWFyY2ggcmFuZ2UsIGFzIGRlc2NyaWJlZCBpbiAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjMuIAotICogICBNQlR5cGUgLSBtYWNybyBibG9jayB0eXBlLCB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA1IAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtIHVwZGF0ZWQgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIAotICogICAgICAgICAgICBidWZmZXIgCi0gKiAgIHBCaXRPZmZzZXQgLSB1cGRhdGVkIGluZGV4IG9mIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgcG9zaXRpb24gaW4gc3RyZWFtIAotICogICAgICAgICAgICBidWZmZXIgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCi0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKLSAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBNVkN1ck1CIAotICogICAgLSAgICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKLSAqICAgIC0gICAgZmNvZGVGb3J3YXJkIDw9IDAsIG9yIGZjb2RlRm9yd2FyZCA+IDcsIG9yIE1CVHlwZSA8IDAuIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZU1WKAotICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKiBwTVZDdXJNQiwKLSAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKiBwU3JjTVZMZWZ0TUIsCi0gICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICogcFNyY01WVXBwZXJNQiwKLSAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKiBwU3JjTVZVcHBlclJpZ2h0TUIsCi0gICAgIE9NWF9JTlQgZmNvZGVGb3J3YXJkLAotICAgICBPTVhWQ000UDJNYWNyb2Jsb2NrVHlwZSBNQlR5cGUKLSkKLXsKLSAgICBPTVhWQ01vdGlvblZlY3RvciBkc3RNVlByZWQsIGRpZmZNVjsKLSAgICBPTVhWQ01vdGlvblZlY3RvciBkc3RNVlByZWRNRVsxMl07Ci0gICAgLyogSW5pdGlhbGl6ZWQgdG8gcmVtb3ZlIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KLSAgICBPTVhfSU5UIGlCbGssIGksIGNvdW50ID0gMTsKLSAgICBPTVhfUzMyIG12SG9yUmVzaWR1YWwsIG12VmVyUmVzaWR1YWwsIG12SG9yRGF0YSwgbXZWZXJEYXRhOwotICAgIE9NWF9VOCBzY2FsZUZhY3RvciwgaW5kZXg7Ci0KLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwTVZDdXJNQiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKCgqcEJpdE9mZnNldCA8IDApIHx8ICgqcEJpdE9mZnNldCA+IDcpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCgoZmNvZGVGb3J3YXJkIDwgMSkgfHwgKGZjb2RlRm9yd2FyZCA+IDcpKSwgXAotICAgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgCi0gICAgaWYgKChNQlR5cGUgPT0gT01YX1ZDX0lOVFJBKSB8fAotICAgICAgICAoTUJUeXBlID09IE9NWF9WQ19JTlRSQV9RKQotICAgICAgICkKLSAgICB7Ci0gICAgICAgIC8qIE5vIGNhbmRpZGF0ZSB2ZWN0b3JzIGhlbmNlIG1ha2UgdGhlbSB6ZXJvICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBkc3RNVlByZWRNRVtpXS5keCA9IDA7Ci0gICAgICAgICAgICBkc3RNVlByZWRNRVtpXS5keSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLSAgICB9Ci0KLSAgICBpZiAoKE1CVHlwZSA9PSBPTVhfVkNfSU5URVI0VikgfHwgKE1CVHlwZSA9PSBPTVhfVkNfSU5URVI0Vl9RKSkKLSAgICB7Ci0gICAgICAgIGNvdW50ID0gNDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKE1CVHlwZSA9PSBPTVhfVkNfSU5URVIpIHx8IChNQlR5cGUgPT0gT01YX1ZDX0lOVEVSX1EpKQotICAgIHsKLSAgICAgICAgY291bnQgPSAxOwotICAgIH0KLQotICAgIC8qIENhbGN1bGF0aW5nIHRoZSBzY2FsZSBmYWN0b3IgKi8KLSAgICBzY2FsZUZhY3RvciA9IDEgPDwgKGZjb2RlRm9yd2FyZCAtMSk7Ci0KLSAgICBmb3IgKGlCbGsgPSAwOyBpQmxrIDwgY291bnQ7IGlCbGsrKykKLSAgICB7Ci0KLSAgICAgICAgLyogRmluZCB0aGUgcHJlZGljdGVkIHZlY3RvciAqLwotICAgICAgICBvbXhWQ000UDJfRmluZE1WcHJlZCAoCi0gICAgICAgICAgICBwTVZDdXJNQiwKLSAgICAgICAgICAgIHBTcmNNVkxlZnRNQiwKLSAgICAgICAgICAgIHBTcmNNVlVwcGVyTUIsCi0gICAgICAgICAgICBwU3JjTVZVcHBlclJpZ2h0TUIsCi0gICAgICAgICAgICAmZHN0TVZQcmVkLAotICAgICAgICAgICAgZHN0TVZQcmVkTUUsCi0gICAgICAgICAgICBpQmxrICk7Ci0KLSAgICAgICAgLyogQ2FsY3VsYXRpbmcgdGhlIGRpZmZlcmVudGlhbCBtb3Rpb24gdmVjdG9yIChkaWZmTVYpICovCi0gICAgICAgIGRpZmZNVi5keCA9IHBNVkN1ck1CW2lCbGtdLmR4IC0gZHN0TVZQcmVkLmR4OwotICAgICAgICBkaWZmTVYuZHkgPSBwTVZDdXJNQltpQmxrXS5keSAtIGRzdE1WUHJlZC5keTsKLQotICAgICAgICAvKiBDYWxjdWxhdGluZyB0aGUgbXZfZGF0YSBhbmQgbXZfcmVzaWR1YWwgZm9yIEhvcml6YW50YWwgTVYgKi8KLSAgICAgICAgaWYgKGRpZmZNVi5keCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBtdkhvclJlc2lkdWFsID0gMDsKLSAgICAgICAgICAgIG12SG9yRGF0YSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBtdkhvclJlc2lkdWFsID0gKCBhcm1BYnMoZGlmZk1WLmR4KSAtIDEpICUgc2NhbGVGYWN0b3I7Ci0gICAgICAgICAgICBtdkhvckRhdGEgPSAoYXJtQWJzKGRpZmZNVi5keCkgLSBtdkhvclJlc2lkdWFsICsgKHNjYWxlRmFjdG9yIC0gMSkpCi0gICAgICAgICAgICAgICAgICAgICAvIHNjYWxlRmFjdG9yOwotICAgICAgICAgICAgaWYgKGRpZmZNVi5keCA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbXZIb3JEYXRhID0gLW12SG9yRGF0YTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIENhbGN1bGF0aW5nIHRoZSBtdl9kYXRhIGFuZCBtdl9yZXNpZHVhbCBmb3IgVmVydGljYWwgTVYgKi8KLSAgICAgICAgaWYgKGRpZmZNVi5keSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBtdlZlclJlc2lkdWFsID0gMDsKLSAgICAgICAgICAgIG12VmVyRGF0YSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBtdlZlclJlc2lkdWFsID0gKCBhcm1BYnMoZGlmZk1WLmR5KSAtIDEpICUgc2NhbGVGYWN0b3I7Ci0gICAgICAgICAgICBtdlZlckRhdGEgPSAoYXJtQWJzKGRpZmZNVi5keSkgLSBtdlZlclJlc2lkdWFsICsgKHNjYWxlRmFjdG9yIC0gMSkpCi0gICAgICAgICAgICAgICAgICAgICAvIHNjYWxlRmFjdG9yOwotICAgICAgICAgICAgaWYgKGRpZmZNVi5keSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbXZWZXJEYXRhID0gLW12VmVyRGF0YTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIEh1ZmZtYW4gZW5jb2RpbmcgKi8KLQotICAgICAgICAvKiBUaGUgaW5kZXggaXMgYWN0dWFsbHkgY2FsY3VsYXRlIGFzCi0gICAgICAgICAgIGluZGV4ID0gKChmbG9hdCkgKG12SG9yRGF0YS8yKSArIDE2KSAqIDIsCi0gICAgICAgICAgIG1lYW5pbmcgdGhlIE1WIGRhdGEgaXMgaGFsZmVkIGFuZCB0aGVuIG5vcm1hbGl6ZWQKLSAgICAgICAgICAgdG8gYmVnaW4gd2l0aCB6ZXJvIGFuZCB0aGVuIGRvdWJsZWQgdG8gdGFrZSBjYXJlIG9mIGluZGV4aW5nCi0gICAgICAgICAgIHRoZSBmcmFjdGlvbmFsIHBhcnQgaW5jbHVkZWQgKi8KLSAgICAgICAgaW5kZXggPSBtdkhvckRhdGEgKyAzMjsKLSAgICAgICAgYXJtUGFja1ZMQzMyIChwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgYXJtVkNNNFAyX2FWbGNNVkRbaW5kZXhdKTsKLSAgICAgICAgaWYgKChmY29kZUZvcndhcmQgPiAxKSAmJiAoZGlmZk1WLmR4ICE9IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcm1QYWNrQml0cyAocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIG12SG9yUmVzaWR1YWwsIChmY29kZUZvcndhcmQgLTEpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFRoZSBpbmRleCBpcyBhY3R1YWxseSBjYWxjdWxhdGUgYXMKLSAgICAgICAgICAgaW5kZXggPSAoKGZsb2F0KSAobXZWZXJEYXRhLzIpICsgMTYpICogMiwKLSAgICAgICAgICAgbWVhbmluZyB0aGUgTVYgZGF0YSBpcyBoYWxmZWQgYW5kIHRoZW4gbm9ybWFsaXplZAotICAgICAgICAgICB0byBiZWdpbiB3aXRoIHplcm8gYW5kIHRoZW4gZG91YmxlZCB0byB0YWtlIGNhcmUgb2YgaW5kZXhpbmcKLSAgICAgICAgICAgdGhlIGZyYWN0aW9uYWwgcGFydCBpbmNsdWRlZCAqLwotICAgICAgICBpbmRleCA9IG12VmVyRGF0YSArIDMyOwotICAgICAgICBhcm1QYWNrVkxDMzIgKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBhcm1WQ000UDJfYVZsY01WRFtpbmRleF0pOwotICAgICAgICBpZiAoKGZjb2RlRm9yd2FyZCA+IDEpICYmIChkaWZmTVYuZHkgIT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFybVBhY2tCaXRzIChwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgbXZWZXJSZXNpZHVhbCwgKGZjb2RlRm9yd2FyZCAtMSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTU4Zjg4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLS8qKgotICogCi0gKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjogCi0gKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZwotICogZm9yIGludGVyIGJsb2NrLgotICoKLSAqLyAKLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCIKLSNpbmNsdWRlICJhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIgotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIgICAoNi4yLjQuNS4zKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nIGZvciBvbmUgaW50ZXIgYmxvY2suIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCi0gKiAgICAgICAgICAgIHN0cmVhbSAKLSAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAotICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcgCi0gKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCi0gKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKLSAqICAgICAgICAgICAgZW5jb2RlZCAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCBzbyB0aGF0IAotICogICAgICAgICAgICBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50cyAKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVyczogaXMgTlVMTDogcHBCaXRTdHJlYW0sICpwcEJpdFN0cmVhbSwgCi0gKiAgICAgICAgICAgICAgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmIAotICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50ZXIoCi0gICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKLSAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAotICAgICBPTVhfVTggcGF0dGVybiwKLQkgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pCi17Ci0gICAgT01YX1U4IHN0YXJ0ID0gMDsKLSAgICBjb25zdCBPTVhfVTggICpwWmlnemFnVGFibGUgPSBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW47Ci0KLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKnBwQml0U3RyZWFtID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwQml0T2Zmc2V0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwUURjdEJsa0NvZWYgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCgqcEJpdE9mZnNldCA8IDApIHx8ICgqcEJpdE9mZnNldCA+NyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIGlmIChwYXR0ZXJuKQotICAgIHsKLSAgICAgICAgYXJtVkNNNFAyX1B1dFZMQ0JpdHMgKAotICAgICAgICAgICAgICBwcEJpdFN0cmVhbSwKLSAgICAgICAgICAgICAgcEJpdE9mZnNldCwKLSAgICAgICAgICAgICAgcFFEY3RCbGtDb2VmLAotICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLAotICAgICAgICAgICAgICBzdGFydCwKLSAgICAgICAgICAgICAgMjYsCi0gICAgICAgICAgICAgIDQwLAotICAgICAgICAgICAgICAxMCwKLSAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDBSdW5JZHgsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlclZsY0wwLAotCQkJICBhcm1WQ000UDJfSW50ZXJMMVJ1bklkeCwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyVmxjTDEsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwwTE1BWCwKLSAgICAgICAgICAgICAgYXJtVkNNNFAyX0ludGVyTDFMTUFYLAotICAgICAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMFJNQVgsCi0gICAgICAgICAgICAgIGFybVZDTTRQMl9JbnRlckwxUk1BWCwKLSAgICAgICAgICAgICAgcFppZ3phZ1RhYmxlCi0gICAgICAgICk7Ci0gICAgfSAvKiBQYXR0ZXJuIGNoZWNrIGVuZHMqLwotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci0KLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2I2ZDk3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQy5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246IAotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZW5jb2RpbmcKLSAqIGZvciBpbnRyYSBibG9jay4KLSAqCi0gKi8gCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgKDYuMi40LjUuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIHppZ3phZyBzY2FuIGFuZCBWTEMgZW5jb2Rpbmcgb2YgQUMgYW5kIERDIGNvZWZmaWNpZW50cyBmb3Igb25lIAotICogaW50cmEgYmxvY2suICBUd28gdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uIChEQ1ZMQyBhbmQgQUNWTEMpIGFyZSBwcm92aWRlZCAKLSAqIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBvZiBwcm9jZXNzaW5nIERDIAotICogY29lZmZpY2llbnRzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy40LjEuNCwgIEludHJhIERDIAotICogQ29lZmZpY2llbnQgRGVjb2RpbmcgZm9yIHRoZSBDYXNlIG9mIFN3aXRjaGVkIFZMQyBFbmNvZGluZy4gIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0c3RyZWFtIAotICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgCi0gKiAgICAgICAgICAgICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNy4gCi0gKiAgIHBRRGN0QmxrQ29lZiAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgCi0gKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgdGhlIHppZ3phZyAKLSAqICAgICAgICAgICAgc2NhbiBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAotICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQuICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAotICogICAgICAgICAgICAtICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbi4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19WRVJUSUNBTCAtIFZlcnRpY2FsIHByZWRpY3Rpb24uICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgIHBhdHRlcm4gLSBibG9jayBwYXR0ZXJuIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhpcyBibG9jayBpcyAKLSAqICAgICAgICAgICAgZW5jb2RlZCAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCi0gKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKLSAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwgc28gCi0gKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKLSAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAotICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKLSAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZi4gCi0gKiAgICAtICAgKnBCaXRPZmZzZXQgPCAwLCBvciAqcEJpdE9mZnNldCA+Ny4gCi0gKiAgICAtICAgIFByZWREaXIgaXMgbm90IG9uZSBvZjogT01YX1ZDX05PTkUsIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKLSAqICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAKLSAqICAgIC0gICAgVmlkZW9Db21wIGlzIG5vdCBvbmUgY29tcG9uZW50IG9mIGVudW0gT01YVkNNNFAyVmlkZW9Db21wb25lbnQuIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDKAotICAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKLSAgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKLSAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAotICAgICBPTVhfVTggcHJlZERpciwKLSAgICAgT01YX1U4IHBhdHRlcm4sCi0gICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKQotewotICAgIE9NWF9VOCBzdGFydCA9IDA7Ci0KLSAgICByZXR1cm4gYXJtVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYSgKLSAgICAgcHBCaXRTdHJlYW0sCi0gICAgIHBCaXRPZmZzZXQsCi0gICAgIHBRRGN0QmxrQ29lZiwKLSAgICAgcHJlZERpciwKLSAgICAgcGF0dGVybiwKLSAgICAgc2hvcnRWaWRlb0hlYWRlciwKLSAgICAgc3RhcnQpOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZGRhMTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMuYworKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjogCi0gKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZwotICogZm9yIGludHJhIGJsb2NrLgotICoKLSAqLyAKLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCIKLSNpbmNsdWRlICJhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5oIgotCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICg2LjIuNC41LjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyB6aWd6YWcgc2NhbiBhbmQgVkxDIGVuY29kaW5nIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgZm9yIG9uZSAKLSAqIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgcHJvdmlkZWQgCi0gKiBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKLSAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICJJbnRyYSBEQyAKLSAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmciLiAgCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gCi0gKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKLSAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LiAKLSAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKLSAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB0aGUgemlnemFnIAotICogICAgICAgICAgICBzY2FuIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZC4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCi0gKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uLiAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuLiAKLSAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbi4gIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKLSAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAotICogICAgICAgICAgICBlbmNvZGVkIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSkgb2YgdGhlIGN1cnJlbnQgCi0gKiAgICAgICAgICAgIGJsb2NrIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLCBzbyAKLSAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAotICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCi0gKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAotICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmLiAKLSAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKLSAqICAgIC0gICAgUHJlZERpciBpcyBub3Qgb25lIG9mOiBPTVhfVkNfTk9ORSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAotICogICAgICAgICBPTVhfVkNfVkVSVElDQUwuIAotICogICAgLSAgICBWaWRlb0NvbXAgaXMgbm90IG9uZSBjb21wb25lbnQgb2YgZW51bSBPTVhWQ000UDJWaWRlb0NvbXBvbmVudC4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMoCi0gICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAotICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAotICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCi0gICAgIE9NWF9VOCBwcmVkRGlyLAotICAgICBPTVhfVTggcGF0dGVybiwKLSAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAotICAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKLSkKLXsKLSAgICBPTVhfUzE2IGRjVmFsdWUsIHBvd09mU2l6ZTsKLSAgICBPTVhfVTggIERDVmFsdWVTaXplLCBzdGFydCA9IDE7Ci0gICAgT01YX1UxNiBhYnNEQ1ZhbHVlOwotCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocHBCaXRTdHJlYW0gPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCpwcEJpdFN0cmVhbSA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocEJpdE9mZnNldCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFFEY3RCbGtDb2VmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoKnBCaXRPZmZzZXQgPCAwKSB8fCAoKnBCaXRPZmZzZXQgPjcpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0JYXJtUmV0QXJnRXJySWYoKHZpZGVvQ29tcCAhPSBPTVhfVkNfTFVNSU5BTkNFKSAmJiAodmlkZW9Db21wICE9IE9NWF9WQ19DSFJPTUlOQU5DRSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQlhcm1SZXRBcmdFcnJJZigocHJlZERpciAhPSBPTVhfVkNfTk9ORSkgJiYgKHByZWREaXIgIT0gT01YX1ZDX0hPUklaT05UQUwpICYmIChwcmVkRGlyICE9IE9NWF9WQ19WRVJUSUNBTCkgLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgCi0gICAgaWYgKHBhdHRlcm4pCi0gICAgewotICAgICAgICBkY1ZhbHVlID0gcFFEY3RCbGtDb2VmWzBdOwotICAgICAgICBhYnNEQ1ZhbHVlID0gYXJtQWJzKGRjVmFsdWUpOwotCi0gICAgICAgIC8qIEZpbmQgdGhlIHNpemUgKi8KLSAgICAgICAgRENWYWx1ZVNpemUgPSBhcm1Mb2dTaXplIChhYnNEQ1ZhbHVlKTsKLSAgICAgICAgYWJzRENWYWx1ZSA9IGFybUFicyhkY1ZhbHVlKTsKLQotICAgICAgICAvKiBJbnNlcnQgdGhlIGNvZGUgaW50byB0aGUgYml0c3RyZWFtICovCi0gICAgICAgIGlmICh2aWRlb0NvbXAgPT0gT01YX1ZDX0xVTUlOQU5DRSkKLSAgICAgICAgewotCi0gICAgICAgICAgICBhcm1QYWNrVkxDMzIgKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfYUludHJhRENMdW1hSW5kZXhbRENWYWx1ZVNpemVdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh2aWRlb0NvbXAgPT0gT01YX1ZDX0NIUk9NSU5BTkNFKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIGFybVBhY2tWTEMzMiAocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9hSW50cmFEQ0Nocm9tYUluZGV4W0RDVmFsdWVTaXplXSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBBZGRpdGlvbmFsIGNvZGUgZ2VuZXJhdGlvbiBpbiBjYXNlIG9mIG5lZ2F0aXZlCi0gICAgICAgICAgIGRjIHZhbHVlIHRoZSBhZGRpdGlvbmFsICovCi0gICAgICAgIGlmIChEQ1ZhbHVlU2l6ZSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkY1ZhbHVlIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBjYWx1bGF0ZSAyIHBvdyAqLwotICAgICAgICAgICAgICAgIHBvd09mU2l6ZSA9ICgxIDw8IERDVmFsdWVTaXplKTsKLQotICAgICAgICAgICAgICAgIGFic0RDVmFsdWUgPSAgYWJzRENWYWx1ZSBeIChwb3dPZlNpemUgLSAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFybVBhY2tCaXRzKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAoT01YX1UzMilhYnNEQ1ZhbHVlLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICBEQ1ZhbHVlU2l6ZSk7Ci0KLSAgICAgICAgICAgIGlmIChEQ1ZhbHVlU2l6ZSA+IDgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXJtUGFja0JpdHMocHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIDEsIDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEoCi0gICAgICAgICAgICAgICAgcHBCaXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgcEJpdE9mZnNldCwKLSAgICAgICAgICAgICAgICBwUURjdEJsa0NvZWYsCi0gICAgICAgICAgICAgICAgcHJlZERpciwKLSAgICAgICAgICAgICAgICBwYXR0ZXJuLAotICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsCi0gICAgICAgICAgICAgICAgc3RhcnQpOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTRiNDg2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWQuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0ZpbmRNVnByZWQuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOiAKLSAqIENvbnRhaW5zIG1vZHVsZSBmb3IgcHJlZGljdGluZyBNViBvZiBNQgotICoKLSAqLwotICAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfRmluZE1WcHJlZCAgICg2LjIuMy4xLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQcmVkaWN0cyBhIG1vdGlvbiB2ZWN0b3IgZm9yIHRoZSBjdXJyZW50IGJsb2NrIHVzaW5nIHRoZSBwcm9jZWR1cmUgCi0gKiBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjUuICBUaGUgcmVzdWx0aW5nIHByZWRpY3RlZCBNViBpcyAKLSAqIHJldHVybmVkIGluIHBEc3RNVlByZWQuIElmIHRoZSBwYXJhbWV0ZXIgcERzdE1WUHJlZE1FIGlmIGlzIG5vdCBOVUxMIHRoZW4gCi0gKiB0aGUgc2V0IG9mIHRocmVlIE1WIGNhbmRpZGF0ZXMgdXNlZCBmb3IgcHJlZGljdGlvbiBpcyBhbHNvIHJldHVybmVkLCAKLSAqIG90aGVyd2lzZSBwRHN0TVZQcmVkTUVpcyBOVUxMIHVwb24gcmV0dXJuLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjTVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgWSAKLSAqICAgICAgICAgICAgbWFjcm9ibG9jazsgYSB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCi0gKiAgIHBTcmNDYW5kTVYxIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDQgTVZzIGFzc29jaWF0ZWQgCi0gKiAgICAgICAgICAgIHdpdGggdGhlIE1CIGxvY2F0ZWQgdG8gdGhlIGxlZnQgb2YgdGhlIGN1cnJlbnQgTUI7IHNldCB0byBOVUxMIAotICogICAgICAgICAgICBpZiB0aGVyZSBpcyBubyBNQiB0byB0aGUgbGVmdC4gCi0gKiAgIHBTcmNDYW5kTVYyIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDQgTVZzIGFzc29jaWF0ZWQgCi0gKiAgICAgICAgICAgIHdpdGggdGhlIE1CIGxvY2F0ZWQgYWJvdmUgdGhlIGN1cnJlbnQgTUI7IHNldCB0byBOVUxMIGlmIHRoZXJlIAotICogICAgICAgICAgICBpcyBubyBNQiBsb2NhdGVkIGFib3ZlIHRoZSBjdXJyZW50IE1CLiAKLSAqICAgcFNyY0NhbmRNVjMgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKLSAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCB0byB0aGUgcmlnaHQgYW5kIGFib3ZlIHRoZSBjdXJyZW50IE1COyBzZXQgCi0gKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlcmUgaXMgbm8gTUIgbG9jYXRlZCB0byB0aGUgYWJvdmUtcmlnaHQuIAotICogICBpQmxrIC0gdGhlIGluZGV4IG9mIGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCi0gKiAgIHBEc3RNVlByZWRNRSAtIE1WIGNhbmRpZGF0ZSByZXR1cm4gYnVmZmVyOyAgaWYgc2V0IHRvIE5VTEwgdGhlbiAKLSAqICAgICAgICAgICAgcHJlZGljdGlvbiBjYW5kaWRhdGUgTVZzIGFyZSBub3QgcmV0dXJuZWQgYW5kIHBEc3RNVlByZWRNRSB3aWxsIAotICogICAgICAgICAgICBiZSBOVUxMIHVwb24gZnVuY3Rpb24gcmV0dXJuOyBpZiBwRHN0TVZQcmVkTUUgaXMgbm9uLU5VTEwgdGhlbiBpdCAKLSAqICAgICAgICAgICAgbXVzdCBwb2ludCB0byBhIGJ1ZmZlciBjb250YWluaW5nIHN1ZmZpY2llbnQgc3BhY2UgZm9yIHRocmVlIAotICogICAgICAgICAgICByZXR1cm4gTVZzLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcERzdE1WUHJlZCAtIHBvaW50ZXIgdG8gdGhlIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yIAotICogICBwRHN0TVZQcmVkTUUgLSBpZiBub24tTlVMTCB1cG9uIGlucHV0IHRoZW4gcERzdE1WUHJlZE1FICBwb2ludHMgdXBvbiAKLSAqICAgICAgICAgICAgcmV0dXJuIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHRocmVlIG1vdGlvbiB2ZWN0b3IgY2FuZGlkYXRlcyAKLSAqICAgICAgICAgICAgdXNlZCBmb3IgcHJlZGljdGlvbiBhcyBzcGVjaWZpZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgCi0gKiAgICAgICAgICAgIDcuNi41LCBvdGhlcndpc2UgaWYgTlVMTCB1cG9uIGlucHV0IHRoZW4gcERzdE1WUHJlZE1FIGlzIE5VTEwgCi0gKiAgICAgICAgICAgIHVwb24gb3V0cHV0LiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCi0gKiAgICAtICAgIHRoZSBwb2ludGVyIHBEc3RNVlByZWQgaXMgTlVMTCAKLSAqICAgIC0gICAgdGhlIHBhcmFtZXRlciBpQmxrIGRvZXMgbm90IGZhbGwgaW50byB0aGUgcmFuZ2UgMCA8PSBpQmxrPD0zIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAyX0ZpbmRNVnByZWQoCi0gICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yKiBwU3JjTVZDdXJNQiwKLSAgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqIHBTcmNDYW5kTVYxLAotICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciogcFNyY0NhbmRNVjIsCi0gICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yKiBwU3JjQ2FuZE1WMywKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IqIHBEc3RNVlByZWQsCi0gICAgIE9NWFZDTW90aW9uVmVjdG9yKiBwRHN0TVZQcmVkTUUsCi0gICAgIE9NWF9JTlQgaUJsawotICkKLXsKLSAgICBPTVhWQ01vdGlvblZlY3RvciBDYW5kTVY7Ci0JY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBDYW5kTVYxOwotICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwQ2FuZE1WMjsKLSAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcENhbmRNVjM7Ci0gICAgCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0JYXJtUmV0QXJnRXJySWYoaUJsayE9MCAmJiBwU3JjTVZDdXJNQiA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdE1WUHJlZCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKGlCbGsgPCAwKSB8fCAoaUJsayA+IDMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7IAotCi0gICAgQ2FuZE1WLmR4ID0gQ2FuZE1WLmR5ID0gMDsKLQkvKiBCYXNlZCBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGJsb2NrIGV4dHJhY3QgdGhlIG1vdGlvbiB2ZWN0b3JzIGFuZAotICAgICAgIHRoZSB0cmFucGVyYW5jeSBzdGF0dXMgKi8KLSAgIAotICAgIAotICAgIC8qIFNldCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlc2UgdG8gYmUgdXNlZCBpZiBwU3JjQ2FuZE1WWzF8MnwzXSA9PSBOVUxMICovCi0gICAgcENhbmRNVjEgPSBwQ2FuZE1WMiA9IHBDYW5kTVYzID0gJkNhbmRNVjsKLQotICAgIAotICAgIHN3aXRjaCAoaUJsaykKLSAgICB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgewotICAgICAgICAgICAgaWYocFNyY0NhbmRNVjEgIT0gTlVMTCkKLSAgICAgICAgICAgIHsKLQkJCSAgICBwQ2FuZE1WMSA9ICZwU3JjQ2FuZE1WMVsxXTsKLQkJCX0KLQkJCWlmKHBTcmNDYW5kTVYyICE9IE5VTEwpCi0gICAgICAgICAgICB7Ci0JCQkJcENhbmRNVjIgPSAmcFNyY0NhbmRNVjJbMl07Ci0JCQl9Ci0JCQlpZihwU3JjQ2FuZE1WMyAhPSBOVUxMKQotICAgICAgICAgICAgewotCQkJCXBDYW5kTVYzID0gJnBTcmNDYW5kTVYzWzJdOwotCQkJfQotCQkJaWYgKChwU3JjQ2FuZE1WMSA9PSBOVUxMKSAmJiAocFNyY0NhbmRNVjIgPT0gTlVMTCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcENhbmRNVjEgPSBwQ2FuZE1WMiA9IHBDYW5kTVYzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZigocFNyY0NhbmRNVjEgPT0gTlVMTCkgJiYgKHBTcmNDYW5kTVYzID09IE5VTEwpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDYW5kTVYxID0gcENhbmRNVjMgPSBwQ2FuZE1WMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoKHBTcmNDYW5kTVYyID09IE5VTEwpICYmIChwU3JjQ2FuZE1WMyA9PSBOVUxMKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQ2FuZE1WMiA9IHBDYW5kTVYzID0gcENhbmRNVjE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIDE6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHBDYW5kTVYxID0gJnBTcmNNVkN1ck1CWzBdOwotCQkJaWYocFNyY0NhbmRNVjIgIT0gTlVMTCkKLSAgICAgICAgICAgIHsKLQkJCQlwQ2FuZE1WMiA9ICZwU3JjQ2FuZE1WMlszXTsKLQkJCX0KLQkJCWlmKHBTcmNDYW5kTVYzICE9IE5VTEwpCi0gICAgICAgICAgICB7Ci0JCQkJcENhbmRNVjMgPSAmcFNyY0NhbmRNVjNbMl07Ci0JCQl9Ci0JCQlpZigocFNyY0NhbmRNVjIgPT0gTlVMTCkgJiYgKHBTcmNDYW5kTVYzID09IE5VTEwpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDYW5kTVYyID0gcENhbmRNVjMgPSBwQ2FuZE1WMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgewotICAgICAgICAgICAgaWYocFNyY0NhbmRNVjEgIT0gTlVMTCkKLSAgICAgICAgICAgIHsKLQkJCQlwQ2FuZE1WMSA9ICZwU3JjQ2FuZE1WMVszXTsKLQkJCX0KLQkJCXBDYW5kTVYyID0gJnBTcmNNVkN1ck1CWzBdOwotCQkJcENhbmRNVjMgPSAmcFNyY01WQ3VyTUJbMV07Ci0JCQlicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIDM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHBDYW5kTVYxID0gJnBTcmNNVkN1ck1CWzJdOwotCQkJcENhbmRNVjIgPSAmcFNyY01WQ3VyTUJbMF07Ci0JCQlwQ2FuZE1WMyA9ICZwU3JjTVZDdXJNQlsxXTsKLQkJCWJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogRmluZCB0aGUgbWVkaWFuIG9mIHRoZSAzIGNhbmRpZGF0ZSBNVidzICovCi0gICAgcERzdE1WUHJlZC0+ZHggPSBhcm1NZWRpYW5PZjMgKHBDYW5kTVYxLT5keCwgcENhbmRNVjItPmR4LCBwQ2FuZE1WMy0+ZHgpOwotICAgIHBEc3RNVlByZWQtPmR5ID0gYXJtTWVkaWFuT2YzIChwQ2FuZE1WMS0+ZHksIHBDYW5kTVYyLT5keSwgcENhbmRNVjMtPmR5KTsKLSAgICAgICAgCi0gICAgaWYgKHBEc3RNVlByZWRNRSAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgLyogU3RvcmUgdGhlIGNhbmRpZGF0ZSBNVidzIGludG8gdGhlIHBEc3RNVlByZWRNRSwgdGhlc2UgY2FuIGJlIHVzZWQKLSAgICAgICAgICAgaW4gdGhlIGZhc3QgYWxnb3JpdGhtIGlmIGltcGxlbWVudGVkICovCi0gICAgICAgIHBEc3RNVlByZWRNRVswXS5keCA9IHBDYW5kTVYxLT5keDsKLSAgICAgICAgcERzdE1WUHJlZE1FWzBdLmR5ID0gcENhbmRNVjEtPmR5OwotICAgICAgICBwRHN0TVZQcmVkTUVbMV0uZHggPSBwQ2FuZE1WMi0+ZHg7Ci0gICAgICAgIHBEc3RNVlByZWRNRVsxXS5keSA9IHBDYW5kTVYyLT5keTsKLSAgICAgICAgcERzdE1WUHJlZE1FWzJdLmR4ID0gcENhbmRNVjMtPmR4OwotICAgICAgICBwRHN0TVZQcmVkTUVbMl0uZHkgPSBwQ2FuZE1WMy0+ZHk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsay5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTEyNDU4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX0lEQ1Q4eDhibGsuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0lEQ1Q4eDhibGsuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgOHg4IGJsb2NrIElEQ1QKLSAqIAotICovCi0KLQotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0jaW5jbHVkZSAiYXJtVkNNNFAyX0RDVF9UYWJsZS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0lEQ1Q4eDhibGsgICAoNi4yLjMuMi4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgYSAyRCBpbnZlcnNlIERDVCBmb3IgYSBzaW5nbGUgOHg4IGJsb2NrLCBhcyBkZWZpbmVkIGluIAotICogW0lTTzE0NDk2LTJdLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIElEQ1QgaW5wdXQgYnVmZmVyOyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIEFjY29yZGluZyB0byAKLSAqICAgICAgICAgICAgW0lTTzE0NDk2LTJdLCB0aGUgaW5wdXQgY29lZmZpY2llbnQgdmFsdWVzIHNob3VsZCBsaWUgd2l0aGluIHRoZSAKLSAqICAgICAgICAgICAgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgSURDVCBvdXRwdXQgYnVmZmVyOyAKLSAqICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICoKLSAqLwotT01YUmVzdWx0IG9teFZDTTRQMl9JRENUOHg4YmxrIChjb25zdCBPTVhfUzE2ICpwU3JjLCBPTVhfUzE2ICpwRHN0KQotewotICAgIE9NWF9JTlQgeCwgeSwgdSwgdjsKLQotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmMgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyYyksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0KLSAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrKQotICAgIHsKLSAgICAgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykKLSAgICAgICAgewotICAgICAgICAgICAgT01YX0Y2NCBzdW0gPSAwLjA7Ci0gICAgICAgICAgICBmb3IgKHUgPSAwOyB1IDwgODsgdSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAodiA9IDA7IHYgPCA4OyB2KyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdW0gKz0gcFNyY1sodSAqIDgpICsgdl0gKgotICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX3ByZUNhbGNEQ1RDb3NbeF1bdV0gKgotICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX3ByZUNhbGNEQ1RDb3NbeV1bdl07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcERzdFsoeCAqIDgpICsgeV0gPSAoT01YX1MxNikgZmxvb3Ioc3VtICsgMC41KTsKLQotICAgICAgICAgICAgLyogU2F0dXJhdGUgdG8gWy0yNTYsIDI1NV0gKi8KLSAgICAgICAgICAgIHBEc3RbKHggKiA4KSArIHldID0gYXJtQ2xpcCAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERzdFsoeCAqIDgpICsgeV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNmMGNmNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2suYworKysgL2Rldi9udWxsCkBAIC0xLDM3MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX01DUmVjb25CbG9jay5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIE1QRUc0IG1vdGlvbiBjb21wZW5zYXRpb24gcHJlZGljdGlvbiBmb3IgYW4gOHg4IGJsb2NrIHVzaW5nIAotICogaW50ZXJwb2xhdGlvbgotICogCi0gKi8KLSAKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9IYWxmUGVsVmVyCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBoYWxmIHBlbCBtb3Rpb24gY29tcGVuc2F0aW9uIGZvciBhbiA4eDggYmxvY2sgdXNpbmcgdmVydGljYWwgCi0gKiBpbnRlcnBvbGF0aW9uIGRlc2NyaWJlZCBpbiBJU08vSUVDIDE0NDk2LTIsIHN1YmNsYXVzZSA3LjYuMi4KLSAqCi0gKiBSZW1hcmtzOgotICoKLSAqIFBhcmFtZXRlcnM6Ci0gKiBbaW5dIHBTcmMgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuCi0gKiBbaW5dIHNyY1N0ZXAgICAgIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzCi0gKiAgICAgICAgICAgICAgICAgIGluIHRoZSByZWZlcmVuY2UgcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUKLSAqICAgICAgICAgICAgICAgICAgb2YgOC4KLSAqIFtpbl0gcm5kVmFsICAgICAgcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuCi0gKiBbb3V0XSBwRHN0ICAgICAgIHBvaW50ZXIgdG8gdGhlIGxpbmFlciA4eDggZGVzdGluYXRpb24gYnVmZmVyOwotICoKLSAqLwotc3RhdGljIE9NWFZvaWQgYXJtVkNNNFAyX0hhbGZQZWxWZXIoCi0gICAgICBjb25zdCBPTVhfVTggKnBTcmMsCi0gICAgICBPTVhfSU5UIHNyY1N0ZXAsIAotICAgICAgT01YX1U4ICpwRHN0LAotICAgICAgT01YX0lOVCBybmRWYWwpCi17Ci0gIGNvbnN0IE9NWF9VOCAqcFRlbXBTcmMxOwotICBjb25zdCBPTVhfVTggKnBUZW1wU3JjMjsKLSAgT01YX0lOVCB5LCB4OwotICAKLSAgcFRlbXBTcmMxID0gcFNyYzsgIAotICBwVGVtcFNyYzIgPSBwU3JjICsgc3JjU3RlcDsKLSAgc3JjU3RlcCAtPSA4OwotICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKQotICB7Ci0gICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykKLSAgICB7Ci0gICAgICAqcERzdCsrID0gKCgqcFRlbXBTcmMxKysgKyAqcFRlbXBTcmMyKyspICsgMSAtIHJuZFZhbCkgPj4gMTsKLSAgICB9Ci0gICAgcFRlbXBTcmMxICs9IHNyY1N0ZXA7Ci0gICAgcFRlbXBTcmMyICs9IHNyY1N0ZXA7Ci0gIH0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0hhbGZQZWxIb3IKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGhhbGYgcGVsIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIGFuIDh4OCBibG9jayB1c2luZyBob3Jpem9udGFsIAotICogaW50ZXJwb2xhdGlvbiBkZXNjcmliZWQgaW4gSVNPL0lFQyAxNDQ5Ni0yLCBzdWJjbGF1c2UgNy42LjIuCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwU3JjICAgICAgICBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLgotICogW2luXSBzcmNTdGVwICAgICBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcwotICogICAgICAgICAgICAgICAgICBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlCi0gKiAgICAgICAgICAgICAgICAgIG9mIDguCi0gKiBbaW5dIHJuZFZhbCAgICAgIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLgotICogW291dF0gcERzdCAgICAgICBwb2ludGVyIHRvIHRoZSBsaW5hZXIgOHg4IGRlc3RpbmF0aW9uIGJ1ZmZlcjsKLSAqCi0gKi8KLXN0YXRpYyBPTVhWb2lkIGFybVZDTTRQMl9IYWxmUGVsSG9yKAotICAgICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgICAgT01YX0lOVCBzcmNTdGVwLCAKLSAgICAgIE9NWF9VOCAqcERzdCwKLSAgICAgIE9NWF9JTlQgcm5kVmFsKQotewotICBjb25zdCBPTVhfVTggKnBUZW1wU3JjMTsKLSAgY29uc3QgT01YX1U4ICpwVGVtcFNyYzI7Ci0gIE9NWF9JTlQgeSwgeDsKLSAgCi0gIHBUZW1wU3JjMSA9IHBTcmM7Ci0gIHBUZW1wU3JjMiA9IHBUZW1wU3JjMSArIDE7Ci0KLSAgc3JjU3RlcCAtPSA4OwotICBmb3IgKHk9MDsgeTw4OyB5KyspCi0gIHsKLSAgICBmb3IgKHg9MDsgeDw4OyB4KyspCi0gICAgewotICAgICAgKnBEc3QrKyA9ICgoKnBUZW1wU3JjMSsrICsgKnBUZW1wU3JjMisrKSArIDEgLSBybmRWYWwpID4+IDE7Ci0gICAgfQotICAgIHBUZW1wU3JjMSArPSBzcmNTdGVwOwotICAgIHBUZW1wU3JjMiArPSBzcmNTdGVwOwotICB9Ci19Ci0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0hhbGZQZWxWZXJIb3IKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGhhbGYgcGVsIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIGFuIDh4OCBibG9jayB1c2luZyBib3RoIAotICogaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgaW50ZXJwb2xhdGlvbiBkZXNjcmliZWQgaW4gSVNPL0lFQyAxNDQ5Ni0yLAotICogc3ViY2xhdXNlIDcuNi4yLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcFNyYyAgICAgICAgcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4KLSAqIFtpbl0gc3JjU3RlcCAgICAgZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMKLSAqICAgICAgICAgICAgICAgICAgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZQotICogICAgICAgICAgICAgICAgICBvZiA4LgotICogW2luXSBybmRWYWwgICAgICByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4KLSAqIFtvdXRdIHBEc3QgICAgICAgcG9pbnRlciB0byB0aGUgbGluYWVyIDh4OCBkZXN0aW5hdGlvbiBidWZmZXI7Ci0gKgotICovCi1zdGF0aWMgT01YVm9pZCBhcm1WQ000UDJfSGFsZlBlbFZlckhvcigKLSAgICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKLSAgICAgIE9NWF9JTlQgc3JjU3RlcCwgCi0gICAgICBPTVhfVTggKnBEc3QsCi0gICAgICBPTVhfSU5UIHJuZFZhbCkKLXsKLSAgY29uc3QgT01YX1U4ICpwVGVtcFNyYzE7Ci0gIGNvbnN0IE9NWF9VOCAqcFRlbXBTcmMyOwotICBjb25zdCBPTVhfVTggKnBUZW1wU3JjMzsKLSAgY29uc3QgT01YX1U4ICpwVGVtcFNyYzQ7Ci0gIE9NWF9JTlQgeSwgeDsKLQotICBwVGVtcFNyYzEgPSBwU3JjOwotICBwVGVtcFNyYzIgPSBwU3JjICsgc3JjU3RlcDsKLSAgcFRlbXBTcmMzID0gcFNyYyArIDE7Ci0gIHBUZW1wU3JjNCA9IHBTcmMgKyBzcmNTdGVwICsgMTsKLQotICBzcmNTdGVwIC09IDg7Ci0gIGZvciAoeT0wOyB5PDg7IHkrKykKLSAgewotICAgIGZvciAoeD0wOyB4PDg7IHgrKykKLQl7Ci0JICAqcERzdCsrID0gKCgqcFRlbXBTcmMxKysgKyAqcFRlbXBTcmMyKysgKyAqcFRlbXBTcmMzKysgKyAqcFRlbXBTcmM0KyspICsgCi0JICAgICAgICAgICAgICAgICAgMiAtIHJuZFZhbCkgPj4gMjsKLQl9Ci0gICAgcFRlbXBTcmMxICs9IHNyY1N0ZXA7Ci0gICAgcFRlbXBTcmMyICs9IHNyY1N0ZXA7Ci0gICAgcFRlbXBTcmMzICs9IHNyY1N0ZXA7Ci0gICAgcFRlbXBTcmM0ICs9IHNyY1N0ZXA7Ci0gIH0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX01DUmVjb25CbG9ja19Ob1JlcwotICoKLSAqIERlc2NyaXB0aW9uOgotICogRG8gbW90aW9uIGNvbXBlbnNhdGlvbiBhbmQgY29weSB0aGUgcmVzdWx0IHRvIHRoZSBjdXJyZW50IGJsb2NrLgotICoKLSAqIFJlbWFya3M6Ci0gKgotICogUGFyYW1ldGVyczoKLSAqIFtpbl0gcFNyYyAgICAgICAgcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4KLSAqIFtpbl0gc3JjU3RlcCAgICAgZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMKLSAqICAgICAgICAgICAgICAgICAgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZQotICogICAgICAgICAgICAgICAgICBvZiA4LgotICogW2luXSBkc3RTdGVwICAgICBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4KLSAqIFtpbl0gcHJlZGljdFR5cGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiB0eXBlLCBhcyBkZWZpbmVkIGluIHNlY3Rpb24gNi4yLjEuMi4KLSAqIFtpbl0gcm5kVmFsICAgICAgcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuCi0gKiBbb3V0XSBwRHN0ICAgICAgIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4KLSAqICAgICAgICAgICAgICAgICAgSWYgcHJlZGljdGlvbiByZXNpZHVhbHMgYXJlIGFkZGVkIHRoZW4gb3V0cHV0IGludGVuc2l0aWVzCi0gKiAgICAgICAgICAgICAgICAgIGFyZSBjbGlwcGVkIHRvIHRoZSByYW5nZSBbMCwyNTVdLgotICoKLSAqLwotc3RhdGljIE9NWFZvaWQgYXJtVkNNNFAyX01DUmVjb25CbG9ja19Ob1JlcygKLSAgICAgIGNvbnN0IE9NWF9VOCAqcFNyYywgCi0gICAgICBPTVhfSU5UIHNyY1N0ZXAsCi0gICAgICBPTVhfVTggKnBEc3QsCi0gICAgICBPTVhfSU5UIGRzdFN0ZXApCi17Ci0gICAgT01YX1U4IHgseSxjb3VudCxpbmRleDsKLSAgICAKLSAgICAvKiBDb3B5aW5nIHRoZSByZWYgOHg4IGJsayB0byB0aGUgY3VyciBibGsgKi8KLSAgICBmb3IgKHkgPSAwLCBjb3VudCA9IDAsIGluZGV4ID0gMDsgeSA8IDg7IHkrKyxpbmRleCArPSAoc3JjU3RlcCAtOCksIGNvdW50ICs9IChkc3RTdGVwIC0gOCkpCi0gICAgewotICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrLCBjb3VudCsrLGluZGV4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEc3RbY291bnRdID0gcFNyY1tpbmRleF07Ci0gICAgICAgIH0gICAgICAgCi0gICAgfQotfQotCi0vKioKLSAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfTUNSZWNvbkJsb2NrX1JlcwotICoKLSAqIERlc2NyaXB0aW9uOgotICogUmVjb25zdHJ1Y3RzIElOVEVSIGJsb2NrIGJ5IHN1bW1pbmcgdGhlIG1vdGlvbiBjb21wZW5zYXRpb24gcmVzdWx0cwotICogYW5kIHRoZSByZXN1bHRzIG9mIHRoZSBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uIChwcmVkaWN0aW9uIHJlc2lkdWFscykuCi0gKiBPdXRwdXQgaW50ZW5zaXRpZXMgYXJlIGNsaXBwZWQgdG8gdGhlIHJhbmdlIFswLDI1NV0uCi0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXSBwU3JjICAgICAgICBwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgcmVmZXJlbmNlIHBsYW5lLgotICogW2luXSBwU3JjUmVzaWR1ZSBwb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIDE2LWJpdCBwcmVkaWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgIHJlc2lkdWFscy4gSWYgdGhlIHBvaW50ZXIgaXMgTlVMTCx0aGVuIG5vIHByZWRpY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgaXMgZG9uZSwgb25seSBtb3Rpb24gY29tcGVuc2F0aW9uLCBpLmUuLCB0aGUgYmxvY2sgaXMKLSAqICAgICAgICAgICAgICAgICAgbW92ZWQgd2l0aCBpbnRlcnBvbGF0aW9uLgotICogW2luXSBkc3RTdGVwICAgICBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4KLSAqIFtvdXRdIHBEc3QgICAgICAgcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLgotICogICAgICAgICAgICAgICAgICBJZiBwcmVkaWN0aW9uIHJlc2lkdWFscyBhcmUgYWRkZWQgdGhlbiBvdXRwdXQgaW50ZW5zaXRpZXMKLSAqICAgICAgICAgICAgICAgICAgYXJlIGNsaXBwZWQgdG8gdGhlIHJhbmdlIFswLDI1NV0uCi0gKgotICovCi1zdGF0aWMgT01YVm9pZCBhcm1WQ000UDJfTUNSZWNvbkJsb2NrX1JlcygKLSAgICAgIGNvbnN0IE9NWF9VOCAqcFNyYywgCi0gICAgICBjb25zdCBPTVhfUzE2ICpwU3JjUmVzaWR1ZSwKLSAgICAgIE9NWF9VOCAqcERzdCwKLSAgICAgIE9NWF9JTlQgZHN0U3RlcCkKLXsKLSAgICAgIAotICBPTVhfVTggeCx5OwotICBPTVhfSU5UIHRlbXA7Ci0gIAotICBmb3IoeSA9IDA7IHkgPCA4OyB5KyspCi0gIHsKLSAgICBmb3IoeCA9IDA7IHggPCA4OyB4KyspCi0gICAgewotICAgICAgdGVtcCA9IHBTcmNbeF0gKyBwU3JjUmVzaWR1ZVt4XTsgICAgICAgICAKLSAgICAgIHBEc3RbeF0gPSBhcm1DbGlwKDAsMjU1LHRlbXApOwotICAgIH0KLSAgICBwRHN0ICs9IGRzdFN0ZXA7Ci0gICAgcFNyYyArPSA4OwotICAgIHBTcmNSZXNpZHVlICs9IDg7Ci0gIH0KLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgICAoNi4yLjUuNS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgbW90aW9uIGNvbXBlbnNhdGlvbiBwcmVkaWN0aW9uIGZvciBhbiA4eDggYmxvY2sgdXNpbmcgCi0gKiBpbnRlcnBvbGF0aW9uIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuIAotICogICBzcmNTdGVwIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIAotICogICAgICAgICAgICByZWZlcmVuY2UgcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGRzdFN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgCi0gKiAgICAgICAgICAgIGRlc3RpbmF0aW9uIHBsYW5lLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAotICogICBwU3JjUmVzaWR1ZSAtIHBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgMTYtYml0IHByZWRpY3Rpb24gCi0gKiAgICAgICAgICAgIHJlc2lkdWFsczsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIElmIHRoZSBwb2ludGVyIGlzIE5VTEwsIHRoZW4gCi0gKiAgICAgICAgICAgIG5vIHByZWRpY3Rpb24gaXMgZG9uZSwgb25seSBtb3Rpb24gY29tcGVuc2F0aW9uLCBpLmUuLCB0aGUgYmxvY2sgCi0gKiAgICAgICAgICAgIGlzIG1vdmVkIHdpdGggaW50ZXJwb2xhdGlvbi4gCi0gKiAgIHByZWRpY3RUeXBlIC0gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiB0eXBlLCBhcyBkZWZpbmVkIGluIHNlY3Rpb24gCi0gKiAgICAgICAgICAgIDYuMi4xLjIuIAotICogICBybmRWYWwgLSByb3VuZGluZyBjb250cm9sIHBhcmFtZXRlcjogMCAtIGRpc2FibGVkOyAxIC0gZW5hYmxlZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuICBJZiAKLSAqICAgICAgICAgICAgcHJlZGljdGlvbiByZXNpZHVhbHMgYXJlIGFkZGVkIHRoZW4gb3V0cHV0IGludGVuc2l0aWVzIGFyZSAKLSAqICAgICAgICAgICAgY2xpcHBlZCB0byB0aGUgcmFuZ2UgWzAsMjU1XS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAotICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAotICogICAgLSAgICBwRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCi0gKiAgICAtICAgIHBTcmNSZXNpZHVlIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAotICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgb3IgcERzdC4gCi0gKiAgICAtICAgIGVpdGhlciBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgICAtICAgIGludmFsaWQgdHlwZSBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgcHJlZGljdFR5cGUuIAotICogICAgLSAgICB0aGUgcGFyYW1ldGVyIHJuZFZhbCBpcyBub3QgZXF1YWwgZWl0aGVyIHRvIDAgb3IgMS4gCi0gKgotICovCi1PTVhSZXN1bHQgb214VkNNNFAyX01DUmVjb25CbG9jaygKLQkJY29uc3QgT01YX1U4ICpwU3JjLAotCQlPTVhfSU5UIHNyY1N0ZXAsCi0JCWNvbnN0IE9NWF9TMTYgKnBTcmNSZXNpZHVlLAotCQlPTVhfVTggKnBEc3QsIAotCQlPTVhfSU5UIGRzdFN0ZXAsCi0JCU9NWF9JTlQgcHJlZGljdFR5cGUsCi0JCU9NWF9JTlQgcm5kVmFsKQotewotICAgIC8qIERlZmluaXRpb25zIGFuZCBJbml0aWFsaXphdGlvbnMqLwotICAgIE9NWF9VOCBwVGVtcERzdFs2NF07Ci0gICAgCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBEc3QpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwU3JjUmVzaWR1ZSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoKGRzdFN0ZXAgJSA4KSB8fCAoc3JjU3RlcCAlIDgpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCgocHJlZGljdFR5cGUgIT0gT01YX1ZDX0lOVEVHRVJfUElYRUwpICYmCi0gICAgICAgICAgICAgICAgICAgIChwcmVkaWN0VHlwZSAhPSBPTVhfVkNfSEFMRl9QSVhFTF9YKSAmJgotICAgICAgICAgICAgICAgICAgICAocHJlZGljdFR5cGUgIT0gT01YX1ZDX0hBTEZfUElYRUxfWSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHByZWRpY3RUeXBlICE9IE9NWF9WQ19IQUxGX1BJWEVMX1hZKQotICAgICAgICAgICAgICAgICAgICksT01YX1N0c19CYWRBcmdFcnIpOyAKLSAgICBhcm1SZXRBcmdFcnJJZigoKHJuZFZhbCAhPSAwKSAmJiAocm5kVmFsICE9IDEpKSxPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgCi0gICAgc3dpdGNoKHByZWRpY3RUeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBPTVhfVkNfSU5URUdFUl9QSVhFTDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX01DUmVjb25CbG9ja19Ob1JlcyhwU3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBUZW1wRHN0WzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9NWF9WQ19IQUxGX1BJWEVMX1g6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IYWxmUGVsSG9yKHBTcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwVGVtcERzdFswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRWYWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPTVhfVkNfSEFMRl9QSVhFTF9ZOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSGFsZlBlbFZlcihwU3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjU3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocFRlbXBEc3RbMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm5kVmFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT01YX1ZDX0hBTEZfUElYRUxfWFk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IYWxmUGVsVmVySG9yKHBTcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwVGVtcERzdFswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRWYWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgCi0gICAgaWYocFNyY1Jlc2lkdWUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhcm1WQ000UDJfTUNSZWNvbkJsb2NrX05vUmVzKCYocFRlbXBEc3RbMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGVwKTsgICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBhcm1WQ000UDJfTUNSZWNvbkJsb2NrX1JlcygmKHBUZW1wRHN0WzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNSZXNpZHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXApOyAgICAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX01FR2V0QnVmU2l6ZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVHZXRCdWZTaXplLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYTg1MmUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUVHZXRCdWZTaXplLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX01FR2V0QnVmU2l6ZS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBJbml0aWFsaXphdGlvbiBtb2R1bGVzIGZvciB0aGUgdmVuZG9yIHNwZWNpZmljIE1vdGlvbiBFc3RpbWF0aW9uIHN0cnVjdHVyZS4KLSAqIAotICovCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1WQy5oIgotI2luY2x1ZGUgImFybUNPTU0uaCIKLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9NRUdldEJ1ZlNpemUgICAoNi4yLjQuMS4xKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29tcHV0ZXMgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gCi0gKiBzdHJ1Y3R1cmUgZm9yIHRoZSBmb2xsb3dpbmcgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAKLSAqIEJsb2NrTWF0Y2hfSW50ZWdlcl84eDgsIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiwgYW5kIE1vdGlvbkVzdGltYXRpb25NQi4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKLSAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMk1FTW9kZSAKLSAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNpemUgLSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBzcGVjaWZpY2F0aW9uIAotICogICAgICAgICAgICBzdHJ1Y3R1cmUgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBNRW1vZGUgCi0gKiAgICAtICAgIGEgbmVnYXRpdmUgb3IgemVybyB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgCi0gKiAgICAgICAgIHBhcmFtZXRlciBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAyX01FR2V0QnVmU2l6ZSgKLSAgICBPTVhWQ000UDJNRU1vZGUgTUVNb2RlLCAKLSAgICBjb25zdCBPTVhWQ000UDJNRVBhcmFtcyAqcE1FUGFyYW1zLCAKLSAgICBPTVhfVTMyICpwU2l6ZQotICAgKQotewotICAgIGFybVJldEFyZ0VycklmKCFwTUVQYXJhbXMsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighcFNpemUsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwTUVQYXJhbXMtPnNlYXJjaFJhbmdlIDw9IDAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoTUVNb2RlICE9IE9NWF9WQ19NNFAxMF9GQVNUX1NFQVJDSCkgJiYKLSAgICAgICAgICAgICAgICAgICAoTUVNb2RlICE9IE9NWF9WQ19NNFAxMF9GVUxMX1NFQVJDSCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAKLSAgICAqcFNpemUgPSAoT01YX0lOVCkgc2l6ZW9mKEFSTVZDTTRQMl9NRVNwZWMpOwotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9NRUluaXQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX01FSW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWM1N2MyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX01FSW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9NRUluaXQuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOgotICogSW5pdGlhbGl6YXRpb24gbW9kdWxlcyBmb3IgdGhlIHZlbmRvciBzcGVjaWZpYyBNb3Rpb24gRXN0aW1hdGlvbiBzdHJ1Y3R1cmUuCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUVJbml0ICAgKDYuMi40LjEuMikKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIEluaXRpYWxpemVzIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgcmVxdWlyZWQgZm9yIHRoZSAKLSAqIGZvbGxvd2luZyBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnM6ICBCbG9ja01hdGNoX0ludGVnZXJfOHg4LCAKLSAqIEJsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNiwgYW5kIE1vdGlvbkVzdGltYXRpb25NQi4gTWVtb3J5IGZvciB0aGUgCi0gKiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAqcE1FU3BlYyBtdXN0IGJlIGFsbG9jYXRlZCBwcmlvciB0byBjYWxsaW5nIHRoZSAKLSAqIGZ1bmN0aW9uLCBhbmQgc2hvdWxkIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBGb2xsb3dpbmcgCi0gKiBpbml0aWFsaXphdGlvbiBieSB0aGlzIGZ1bmN0aW9uLCB0aGUgdmVuZG9yLXNwZWNpZmljIHN0cnVjdHVyZSAqcE1FU3BlYyAKLSAqIHNob3VsZCBjb250YWluIGFuIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIHJlcHJlc2VudGF0aW9uIG9mIGFsbCBtb3Rpb24gCi0gKiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgcmVjZWl2ZWQgdmlhIHRoZSBzdHJ1Y3R1cmUgcE1FUGFyYW1zLCBmb3IgZXhhbXBsZSAgCi0gKiBybmRWYWwsIHNlYXJjaFJhbmdlLCBldGMuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgCi0gKiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSBjYW4gYmUgZGV0ZXJtaW5lZCB1c2luZyB0aGUgZnVuY3Rpb24gCi0gKiBvbXhWQ000UDJfTUVHZXRCdWZTaXplLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAotICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAyTUVNb2RlIAotICogICBwTUVQYXJhbXMgLSBtb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAotICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgdW5pbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAotICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAotICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIAotICogICAgICAgICBwYXJhbWV0ZXIgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZSAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9NRUluaXQoCi0gICAgT01YVkNNNFAyTUVNb2RlIE1FTW9kZSwgCi0gICAgY29uc3QgT01YVkNNNFAyTUVQYXJhbXMgKnBNRVBhcmFtcywgCi0gICAgdm9pZCAqcE1FU3BlYwotICAgKQotewotICAgIEFSTVZDTTRQMl9NRVNwZWMgKmFybU1FU3BlYyA9IChBUk1WQ000UDJfTUVTcGVjICopIHBNRVNwZWM7Ci0gICAgCi0gICAgYXJtUmV0QXJnRXJySWYoIXBNRVBhcmFtcywgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFwTUVTcGVjLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKE1FTW9kZSAhPSBPTVhfVkNfTTRQMl9GQVNUX1NFQVJDSCkgJiYgCi0gICAgICAgICAgICAgICAgICAgKE1FTW9kZSAhPSBPTVhfVkNfTTRQMl9GVUxMX1NFQVJDSCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwTUVQYXJhbXMtPnNlYXJjaFJhbmdlIDw9IDAsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAKLSAgICBhcm1NRVNwZWMtPk1FUGFyYW1zLnNlYXJjaEVuYWJsZTh4OCAgICAgPSBwTUVQYXJhbXMtPnNlYXJjaEVuYWJsZTh4ODsKLSAgICBhcm1NRVNwZWMtPk1FUGFyYW1zLmhhbGZQZWxTZWFyY2hFbmFibGUgPSBwTUVQYXJhbXMtPmhhbGZQZWxTZWFyY2hFbmFibGU7Ci0gICAgYXJtTUVTcGVjLT5NRVBhcmFtcy5zZWFyY2hSYW5nZSAgICAgICAgID0gcE1FUGFyYW1zLT5zZWFyY2hSYW5nZTsgICAgICAgIAotICAgIGFybU1FU3BlYy0+TUVQYXJhbXMucm5kVmFsICAgICAgICAgICAgICA9IHBNRVBhcmFtcy0+cm5kVmFsOwotICAgIGFybU1FU3BlYy0+TUVNb2RlICAgICAgICAgICAgICAgICAgICAgICA9IE1FTW9kZTsKLSAgICAKLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YmIyOTcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlIGZvciBtb3Rpb24gc2VhcmNoIDE2eDE2IG1hY3JvYmxvY2sKLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLS8qKgotICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoXzE2eDE2Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiAxNngxNiBibG9jayBtYXRjaCB3cmFwcGVyIGZ1bmN0aW9uLCBjYWxscyBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2LgotICogSWYgaGFsZiBwZWwgc2VhcmNoIGlzIGVuYWJsZWQgaXQgYWxzbyBjYWxscyBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2Ci0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwU3JjUmVmQnVmCSAgcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIHRoYXQKLSAqICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudAotICogICAgICAgICAgICAgICAgICAgIHBsYW5lLgotICogW2luXQlzcmNSZWZTdGVwCSAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZQotICogW2luXQlwUmVmUmVjdAkgIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlY3Rhbmd1bGFyIGluIHJlZmVyZW5jZSBwbGFuZS4gUmVsYXRpdmUgdG8gaW1hZ2Ugb3JpZ2luLgotICogICAgICAgICAgICAgICAgICAgIEl0J3Mgbm90IGxpbWl0ZWQgdG8gdGhlIGltYWdlIGJvdW5kYXJ5LCBidXQgZGVwZW5kZWQgb24gdGhlIHBhZGRpbmcuIEZvciBleGFtcGxlLAotICogICAgICAgICAgICAgICAgICAgIGlmIHlvdSBwYWQgNCBwaXhlbHMgb3V0c2lkZSB0aGUgaW1hZ2UgYm9yZGVyLCB0aGVuIHRoZSB2YWx1ZSBmb3IgbGVmdCBib3JkZXIKLSAqICAgICAgICAgICAgICAgICAgICBjYW4gYmUgLTQKLSAqIFtpbl0JcFNyY0N1cnJCdWYJICBwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgZXh0cmFjdGVkIGZyb20gb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwKLSAqICAgICAgICAgICAgICAgICAgICAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiAxNi1ieXRlIGJvdW5kYXJ5LgotICogW2luXSBwQ3VyclBvaW50UG9zIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUKLSAqIFtpbl0gcFNyY1ByZU1WCSAgcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gcHJlZGljdGVkIE1WCi0gKiBbaW5dIHBTcmNQcmVTQUQJICBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCBieSBwU3JjUHJlTVYpOyBtYXkgYmUgc2V0IHRvIE5VTEwgaWYgdW5hdmFpbGFibGUuCi0gKiBbaW5dIHBNRVNwZWMJCSAgdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQKLSAqICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nCi0gKiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uCi0gKiBbb3V0XSBwRHN0TVYJICAgICAgcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKLSAqIFtvdXRdIHBEc3RTQUQJICBwb2ludGVyIHRvIG1pbmltdW0gU0FECi0gKiAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKLSAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cwotICoKLSAqLwotc3RhdGljIE9NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF8xNngxNigKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAotICAgICBjb25zdCBPTVhfSU5UIHNyY1JlZlN0ZXAsCi0gICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAotICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAotICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAotICAgICBPTVhfSU5UICpwU3JjUHJlU0FELAotICAgICB2b2lkICpwTUVTcGVjLAotICAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAotICAgICBPTVhfSU5UICpwRHN0U0FECi0pCi17Ci0gICAgT01YVkNNNFAyTUVQYXJhbXMgKnBNRVBhcmFtcyA9IChPTVhWQ000UDJNRVBhcmFtcyAqKXBNRVNwZWM7Ci0gICAgT01YX0lOVCBybmRWYWw7Ci0gICAgCi0gICAgcm5kVmFsID0gcE1FUGFyYW1zLT5ybmRWYWw7Ci0gICAgCi0gICAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl8xNngxNigKLSAgICAgICAgcFNyY1JlZkJ1ZiwKLSAgICAgICAgc3JjUmVmU3RlcCwKLSAgICAgICAgcFJlZlJlY3QsCi0gICAgICAgIHBTcmNDdXJyQnVmLAotICAgICAgICBwQ3VyclBvaW50UG9zLAotICAgICAgICBwU3JjUHJlTVYsCi0gICAgICAgIHBTcmNQcmVTQUQsCi0gICAgICAgIHBNRVBhcmFtcywKLSAgICAgICAgcERzdE1WLAotICAgICAgICBwRHN0U0FEKTsKLSAgICAKLSAgICBpZiAocE1FUGFyYW1zLT5oYWxmUGVsU2VhcmNoRW5hYmxlKQotICAgIHsKLSAgICAgICAgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNigKLSAgICAgICAgICAgIHBTcmNSZWZCdWYsCi0gICAgICAgICAgICBzcmNSZWZTdGVwLAotICAgICAgICAgICAgcFJlZlJlY3QsCi0gICAgICAgICAgICBwU3JjQ3VyckJ1ZiwKLSAgICAgICAgICAgIHBDdXJyUG9pbnRQb3MsCi0gICAgICAgICAgICBybmRWYWwsCi0gICAgICAgICAgICBwRHN0TVYsCi0gICAgICAgICAgICBwRHN0U0FEKTsKLSAgICB9Ci0gCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7ICAgICAgICAKLX0KLQotLyoqCi0gKiBGdW5jdGlvbjogYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfOHg4Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiA4eDggYmxvY2sgbWF0Y2ggd3JhcHBlciBmdW5jdGlvbiwgY2FsbHMgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSW50ZWdlcl84eDguCi0gKiBJZiBoYWxmIHBlbCBzZWFyY2ggaXMgZW5hYmxlZCBpdCBhbHNvIGNhbGxzIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4Ci0gKgotICogUmVtYXJrczoKLSAqCi0gKiBQYXJhbWV0ZXJzOgotICogW2luXQlwU3JjUmVmQnVmCSAgcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIHRoYXQKLSAqICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudAotICogICAgICAgICAgICAgICAgICAgIHBsYW5lLgotICogW2luXQlzcmNSZWZTdGVwCSAgd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZQotICogW2luXQlwUmVmUmVjdAkgIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlY3Rhbmd1bGFyIGluIHJlZmVyZW5jZSBwbGFuZS4gUmVsYXRpdmUgdG8gaW1hZ2Ugb3JpZ2luLgotICogICAgICAgICAgICAgICAgICAgIEl0J3Mgbm90IGxpbWl0ZWQgdG8gdGhlIGltYWdlIGJvdW5kYXJ5LCBidXQgZGVwZW5kZWQgb24gdGhlIHBhZGRpbmcuIEZvciBleGFtcGxlLAotICogICAgICAgICAgICAgICAgICAgIGlmIHlvdSBwYWQgNCBwaXhlbHMgb3V0c2lkZSB0aGUgaW1hZ2UgYm9yZGVyLCB0aGVuIHRoZSB2YWx1ZSBmb3IgbGVmdCBib3JkZXIKLSAqICAgICAgICAgICAgICAgICAgICBjYW4gYmUgLTQKLSAqIFtpbl0JcFNyY0N1cnJCdWYJICBwb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgZXh0cmFjdGVkIGZyb20gb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwKLSAqICAgICAgICAgICAgICAgICAgICAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiAxNi1ieXRlIGJvdW5kYXJ5LgotICogW2luXSBwQ3VyclBvaW50UG9zIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUKLSAqIFtpbl0gcFNyY1ByZU1WCSAgcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gcHJlZGljdGVkIE1WCi0gKiBbaW5dIHBTcmNQcmVTQUQJICBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCBieSBwU3JjUHJlTVYpOyBtYXkgYmUgc2V0IHRvIE5VTEwgaWYgdW5hdmFpbGFibGUuCi0gKiBbaW5dIHBNRVNwZWMJCSAgdmVuZG9yLXNwZWNpZmljIG1vdGlvbiBlc3RpbWF0aW9uIHNwZWNpZmljYXRpb24gc3RydWN0dXJlOyBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQKLSAqICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nCi0gKiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uCi0gKiBbb3V0XSBwRHN0TVYJICAgICAgcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKLSAqIFtvdXRdIHBEc3RTQUQJICBwb2ludGVyIHRvIG1pbmltdW0gU0FECi0gKiAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKLSAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cwotICoKLSAqLwotc3RhdGljIE9NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF84eDgoCi0gICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKLSAgICAgT01YX0lOVCBzcmNSZWZTdGVwLAotICAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKLSAgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNQcmVNViwKLSAgICAgT01YX0lOVCAqcFNyY1ByZVNBRCwKLSAgICAgdm9pZCAqcE1FU3BlYywKLSAgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKLSAgICAgT01YX0lOVCAqcERzdFNBRAotKQotewotICAgIE9NWFZDTTRQMk1FUGFyYW1zICpwTUVQYXJhbXMgPSAoT01YVkNNNFAyTUVQYXJhbXMgKilwTUVTcGVjOwotICAgIE9NWF9JTlQgcm5kVmFsOwotICAgIAotICAgIHJuZFZhbCA9IHBNRVBhcmFtcy0+cm5kVmFsOwotICAgIAotICAgIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4KAotICAgICAgICBwU3JjUmVmQnVmLAotICAgICAgICBzcmNSZWZTdGVwLAotICAgICAgICBwUmVmUmVjdCwKLSAgICAgICAgcFNyY0N1cnJCdWYsCi0gICAgICAgIHBDdXJyUG9pbnRQb3MsCi0gICAgICAgIHBTcmNQcmVNViwKLSAgICAgICAgcFNyY1ByZVNBRCwKLSAgICAgICAgcE1FUGFyYW1zLAotICAgICAgICBwU3JjRHN0TVYsCi0gICAgICAgIHBEc3RTQUQpOwotICAgIAotICAgIGlmIChwTUVQYXJhbXMtPmhhbGZQZWxTZWFyY2hFbmFibGUpCi0gICAgewotICAgICAgICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzh4OCgKLSAgICAgICAgICAgIHBTcmNSZWZCdWYsCi0gICAgICAgICAgICBzcmNSZWZTdGVwLAotICAgICAgICAgICAgcFJlZlJlY3QsCi0gICAgICAgICAgICBwU3JjQ3VyckJ1ZiwKLSAgICAgICAgICAgIHBDdXJyUG9pbnRQb3MsCi0gICAgICAgICAgICBybmRWYWwsCi0gICAgICAgICAgICBwU3JjRHN0TVYsCi0gICAgICAgICAgICBwRHN0U0FEKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7ICAgICAgICAKLX0KLQotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiAgICg2LjIuNC4zLjEpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBtb3Rpb24gc2VhcmNoIGZvciBhIDE2eDE2IG1hY3JvYmxvY2suICBTZWxlY3RzIGJlc3QgbW90aW9uIHNlYXJjaCAKLSAqIHN0cmF0ZWd5IGZyb20gYW1vbmcgaW50ZXItMU1WLCBpbnRlci00TVYsIGFuZCBpbnRyYSBtb2Rlcy4gIFN1cHBvcnRzIAotICogaW50ZWdlciBhbmQgaGFsZiBwaXhlbCByZXNvbHV0aW9uLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY3VycmVudCBNQiBpbiB0aGUgCi0gKiAgICAgICAgICAgIG9yaWdpbmFsIHBpY3R1cmUgcGxhbmU7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICAKLSAqICAgICAgICAgICAgVGhlIGZ1bmN0aW9uIGRvZXMgbm90IGV4cGVjdCBzb3VyY2UgZGF0YSBvdXRzaWRlIHRoZSByZWdpb24gCi0gKiAgICAgICAgICAgIGJvdW5kZWQgYnkgdGhlIE1CIHRvIGJlIGF2YWlsYWJsZTsgZm9yIGV4YW1wbGUgaXQgaXMgbm90IAotICogICAgICAgICAgICBuZWNlc3NhcnkgZm9yIHRoZSBjYWxsZXIgdG8gZ3VhcmFudGVlIHRoZSBhdmFpbGFiaWxpdHkgb2YgCi0gKiAgICAgICAgICAgIHBTcmNDdXJyQnVmWy1TcmNDdXJyU3RlcF0sIGkuZS4sIHRoZSByb3cgb2YgcGl4ZWxzIGFib3ZlIHRoZSBNQiAKLSAqICAgICAgICAgICAgdG8gYmUgcHJvY2Vzc2VkLiAKLSAqICAgc3JjQ3VyclN0ZXAgLSB3aWR0aCBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSwgaW4gdGVybXMgb2YgZnVsbCAKLSAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAotICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAotICogICAgICAgICAgICBwbGFuZSBsb2NhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKLSAqICAgICAgICAgICAgYm91bmRhcnkuIAotICogICBzcmNSZWZTdGVwIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lLCBpbiB0ZXJtcyBvZiBmdWxsIAotICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCi0gKiAgIHBSZWZSZWN0IC0gcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUsIHNwZWNpZmllZCByZWxhdGl2ZSB0byAKLSAqICAgICAgICAgICAgdGhlIGltYWdlIG9yaWdpbiAKLSAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCi0gKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiAKLSAqICAgICAgICAgICAgc3RydWN0dXJlOyBtdXN0IGJlIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKLSAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIAotICogICBwTUJJbmZvIC0gYXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAotICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBuZWFyYnkgTUJzOiAKLSAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMF0gLSBwb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzFdIC0gcG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gCi0gKiAgICAgICAgICAgIC0gICBwTUJJbmZvWzJdIC0gcG9pbnRlciB0byB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgLSAgIHBNQkluZm9bM10gLSBwb2ludGVyIHRvIHRvcC1yaWdodCBNQiBpbmZvcm1hdGlvbiAKLSAqICAgICAgICAgICAgQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgdG8gTlVMTCBpZiB0aGUgCi0gKiAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24ndCBleGlzdC4gIEZvciBlYWNoIE1CLCB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSAKLSAqICAgICAgICAgICAgbWVtYmVycyBhcmUgdXNlZDogICAgCi0gKiAgICAgICAgICAgIC0gICBtYlR5cGUgLSBtYWNyb2Jsb2NrIHR5cGUsIGVpdGhlciBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgCi0gKiAgICAgICAgICAgICAgICBPTVhfVkNfSU5URVI0ViAKLSAqICAgICAgICAgICAgLSAgIHBNVjBbMl1bMl0gLSBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIAotICogICAgICAgICAgICAgICAgaW4gMS8yIHBpeGVsIHVuaXRzIAotICogICAgICAgICAgICAtICAgc2xpY2VJRCAtIG51bWJlciBvZiB0aGUgc2xpY2UgdG8gd2hpY2ggdGhlIE1CIGJlbG9uZ3MgCi0gKiAgIHBTcmNEc3RNQkN1cnIgLSBwb2ludGVyIHRvIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhlIGN1cnJlbnQgTUIuICAKLSAqICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBlbnRyaWVzIHNob3VsZCBiZSBzZXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCi0gKiAgICAgICAgICAgIGZ1bmN0aW9uOiBzbGljZUlEIC0gdGhlIG51bWJlciBvZiB0aGUgc2xpY2UgdGhlIHRvIHdoaWNoIHRoZSAKLSAqICAgICAgICAgICAgY3VycmVudCBNQiBiZWxvbmdzLiAgVGhlIHN0cnVjdHVyZSBlbGVtZW50cyBjYnB5IGFuZCBjYnBjIGFyZSAKLSAqICAgICAgICAgICAgaWdub3JlZC4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3RNQkN1cnIgLSBwb2ludGVyIHRvIHVwZGF0ZWQgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgTUIgYWZ0ZXIgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLiAgVGhlIAotICogICAgICAgICAgICBmb2xsb3dpbmcgc3RydWN0dXJlIG1lbWJlcnMgYXJlIHVwZGF0ZWQgYnkgdGhlIE1FIGZ1bmN0aW9uOiAgIAotICogICAgICAgICAgICAgIC0gIG1iVHlwZSAtIG1hY3JvYmxvY2sgdHlwZTogT01YX1ZDX0lOVFJBLCBPTVhfVkNfSU5URVIsIG9yIAotICogICAgICAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWLiAKLSAqICAgICAgICAgICAgICAtICBwTVYwWzJdWzJdIC0gZXN0aW1hdGVkIG1vdGlvbiB2ZWN0b3JzOyByZXByZXNlbnRlZCBpbiAKLSAqICAgICAgICAgICAgICAgICB0ZXJtcyBvZiAxLzIgcGVsIHVuaXRzLiAKLSAqICAgICAgICAgICAgICAtICBwTVZQcmVkWzJdWzJdIC0gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3JzOyByZXByZXNlbnRlZCAKLSAqICAgICAgICAgICAgICAgICBpbiB0ZXJtcyBvZiAxLzIgcGVsIHVuaXRzLiAKLSAqICAgICAgICAgICAgVGhlIHN0cnVjdHVyZSBtZW1iZXJzIGNicHkgYW5kIGNicGMgYXJlIG5vdCB1cGRhdGVkIGJ5IHRoZSBmdW5jdGlvbi4gCi0gKiAgIHBEc3RTQUQgLSBwb2ludGVyIHRvIHRoZSBtaW5pbXVtIFNBRCBmb3IgSU5URVIxViwgb3Igc3VtIG9mIG1pbmltdW0gU0FEcyAKLSAqICAgICAgICAgICAgZm9yIElOVEVSNFYgCi0gKiAgIHBEc3RCbG9ja1NBRCAtIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgU0FEIHZhbHVlcyBmb3IgZWFjaCBvZiB0aGUgZm91ciAKLSAqICAgICAgICAgICAgOHg4IGx1bWEgYmxvY2tzIGluIHRoZSBNQi4gIFRoZSBibG9jayBTQURzIGFyZSBpbiBzY2FuIG9yZGVyIGZvciAKLSAqICAgICAgICAgICAgZWFjaCBNQi4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCi0gKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNDdXJyQnVmLCAKLSAqICAgICAgICAgICAgICBwU3JjUmVmQnVmLCBwUmVmUmVjdCwgcEN1cnJQb2ludFBvcywgcE1CSW50ZXIsIHBNQkludHJhLCAKLSAqICAgICAgICAgICAgICBwU3JjRHN0TUJDdXJyLCBvciBwRHN0U0FELiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgKAotICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCi0gICAgT01YX1MzMiBzcmNDdXJyU3RlcCwKLSAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCi0gICAgT01YX1MzMiBzcmNSZWZTdGVwLAotICAgIGNvbnN0IE9NWFJlY3QqcFJlZlJlY3QsCi0gICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKLSAgICB2b2lkICpwTUVTcGVjLAotICAgIGNvbnN0IE9NWFZDTTRQMk1CSW5mb1B0ciAqcE1CSW5mbywKLSAgICBPTVhWQ000UDJNQkluZm8gKnBTcmNEc3RNQkN1cnIsCi0gICAgT01YX1UxNiAqcERzdFNBRCwKLSAgICBPTVhfVTE2ICpwRHN0QmxvY2tTQUQKLSkKLXsKLSAKLSAgICBPTVhfSU5UIGludHJhU0FELCBhdmVyYWdlLCBjb3VudCwgaW5kZXgsIHgsIHk7Ci0gICAgT01YVkNNb3Rpb25WZWN0b3IgZHN0TVYxNngxNjsKLSAgICBPTVhfSU5UICAgICAgICAgICBkc3RTQUQxNngxNjsKLSAgICBPTVhfSU5UICAgICAgICAgICBkc3RTQUQ4eDg7Ci0gICAgT01YVkNNNFAyTUVQYXJhbXMgICpwTUVQYXJhbXM7IAotCU9NWFZDTTRQMkNvb3JkaW5hdGUgVGVtcEN1cnJQb2ludFBvczsgCi0gICAgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFRlbXBDdXJyUG9pbnRQb3M7IAotICAgIE9NWF9VOCBhVGVtcFNyY0N1cnJCdWZbMjcxXTsKLSAgICBPTVhfVTggKnBUZW1wU3JjQ3VyckJ1ZjsKLSAgICBPTVhfVTggKnBEc3Q7Ci0gICAgT01YX1U4IGFEc3RbNzFdOwotICAgIE9NWF9TMzIgZHN0U3RlcCA9IDg7Ci0gICAgT01YX0lOVCBwcmVkaWN0VHlwZTsKLQlPTVhfUzMyIFNhZDsKLSAgICBjb25zdCBPTVhfVTggKnBUZW1wU3JjUmVmQnVmOwotICAgIE9NWFZDTW90aW9uVmVjdG9yKiBwU3JjQ2FuZE1WMVs0XTsKLSAgICBPTVhWQ01vdGlvblZlY3RvciogcFNyY0NhbmRNVjJbNF07Ci0gICAgT01YVkNNb3Rpb25WZWN0b3IqIHBTcmNDYW5kTVYzWzRdOwotICAgICAgICAKLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmNDdXJyQnVmKSwgT01YX1N0c19CYWRBcmdFcnIpOwotCWFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocFNyY1JlZkJ1ZiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoKHNyY0N1cnJTdGVwICUgMTYpIHx8IChzcmNSZWZTdGVwICUgMTYpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotCWFybVJldEFyZ0VycklmKHBTcmNDdXJyQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQlhcm1SZXRBcmdFcnJJZihwU3JjUmVmQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwUmVmUmVjdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7ICAgIAotICAgIGFybVJldEFyZ0VycklmKHBDdXJyUG9pbnRQb3MgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3RNQkN1cnIgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBEc3RTQUQgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIAotICAgIAotICAgIHBUZW1wQ3VyclBvaW50UG9zID0gJihUZW1wQ3VyclBvaW50UG9zKTsKLSAgICBwVGVtcFNyY0N1cnJCdWYgPSBhcm1BbGlnblRvMTZCeXRlcyhhVGVtcFNyY0N1cnJCdWYpOwotICAgIHBNRVBhcmFtcyA9IChPTVhWQ000UDJNRVBhcmFtcyAqKXBNRVNwZWM7Ci0gICAgcFRlbXBDdXJyUG9pbnRQb3MtPnggPSBwQ3VyclBvaW50UG9zLT54OwotICAgIHBUZW1wQ3VyclBvaW50UG9zLT55ID0gcEN1cnJQb2ludFBvcy0+eTsKLSAgICBwU3JjRHN0TUJDdXJyLT5tYlR5cGUgPSBPTVhfVkNfSU5URVI7Ci0gICAgCi0gICAgLyogUHJlcGFyaW5nIGEgbGluZWFyIGJ1ZmZlciBmb3IgYmxvY2sgbWF0Y2ggKi8KLSAgICBmb3IgKHkgPSAwLCBpbmRleCA9IGNvdW50ID0gMDsgeSA8IDE2OyB5KyssIGluZGV4ICs9IHNyY0N1cnJTdGVwIC0gMTYpCi0gICAgewotICAgICAgICBmb3IoeCA9IDA7IHggPCAxNjsgeCsrLCBjb3VudCsrLCBpbmRleCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwVGVtcFNyY0N1cnJCdWZbY291bnRdID0gcFNyY0N1cnJCdWZbaW5kZXhdOwotICAgICAgICB9Ci0gICAgfQotICAgIGZvcih5ID0gMCwgaW5kZXggPSAwOyB5IDwgMjsgeSsrKQotICAgIHsKLSAgICAgICAgZm9yKHggPSAwOyB4IDwgMjsgeCsrLGluZGV4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKChwTUJJbmZvWzBdICE9IE5VTEwpICYmIChwTUJJbmZvWzBdLT5tYlR5cGUgIT0gT01YX1ZDX0lOVFJBKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBTcmNDYW5kTVYxW2luZGV4XSA9ICYocE1CSW5mb1swXS0+cE1WMFt5XVt4XSk7IAotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcFNyY0NhbmRNVjFbaW5kZXhdID0gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKChwTUJJbmZvWzFdICE9IE5VTEwpICYmIChwTUJJbmZvWzFdLT5tYlR5cGUgIT0gT01YX1ZDX0lOVFJBKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBTcmNDYW5kTVYyW2luZGV4XSA9ICYocE1CSW5mb1sxXS0+cE1WMFt5XVt4XSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwU3JjQ2FuZE1WMltpbmRleF0gPSBOVUxMOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKChwTUJJbmZvWzNdICE9IE5VTEwpICYmIChwTUJJbmZvWzNdLT5tYlR5cGUgIT0gT01YX1ZDX0lOVFJBKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHBTcmNDYW5kTVYzW2luZGV4XSA9ICYocE1CSW5mb1szXS0+cE1WMFt5XVt4XSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwU3JjQ2FuZE1WM1tpbmRleF0gPSBOVUxMOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQkvKiBDYWxjdWxhdGluZyBTQUQgYXQgTVYoMCwwKSAqLwotCWFybVZDQ09NTV9TQUQocFRlbXBTcmNDdXJyQnVmLAotCQkJCQkgIDE2LAotCQkJCQkgIHBTcmNSZWZCdWYsCi0JCQkJCSAgc3JjUmVmU3RlcCwKLQkJCQkJICAmU2FkLAotCQkJCQkgIDE2LAotCQkJCQkgIDE2KTsKLQkqcERzdFNBRCA9IFNhZDsKLQotICAgIC8qIE1vZGUgZGVjaXNpb24gZm9yIE5PVF9DT0RFRCBNQiAqLwotCWlmKCpwRHN0U0FEID09IDApCi0JewotICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdLmR4ID0gMDsKLSAgICAgICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFswXVswXS5keSA9IDA7Ci0gICAgICAgICpwRHN0U0FEICAgPSAwOwotCQlyZXR1cm4gT01YX1N0c19Ob0VycjsKLQl9Ci0KLSAgICBvbXhWQ000UDJfRmluZE1WcHJlZCgKLSAgICAgICAgICAgICAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjFbMF0sCi0gICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYyWzBdLAotICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WM1swXSwKLSAgICAgICAgICAgICAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVZQcmVkWzBdWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgIC8qIEludGVyIDEgTVYgKi8KLSAgICBhcm1WQ000UDJfQmxvY2tNYXRjaF8xNngxNigKLSAgICAgICAgcFNyY1JlZkJ1ZiwKLSAgICAgICAgc3JjUmVmU3RlcCwKLSAgICAgICAgcFJlZlJlY3QsCi0gICAgICAgIHBUZW1wU3JjQ3VyckJ1ZiwKLSAgICAgICAgcEN1cnJQb2ludFBvcywKLSAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVZQcmVkWzBdWzBdKSwKLSAgICAgICAgTlVMTCwKLSAgICAgICAgcE1FUGFyYW1zLAotICAgICAgICAmZHN0TVYxNngxNiwKLSAgICAgICAgJmRzdFNBRDE2eDE2KTsKLSAgICAKLSAgICAvKiBJbml0aWFsaXplIGFsbCB3aXRoIDEgTVYgdmFsdWVzICovCi0gICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFswXVswXS5keCA9IGRzdE1WMTZ4MTYuZHg7Ci0gICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFswXVswXS5keSA9IGRzdE1WMTZ4MTYuZHk7Ci0gICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFswXVsxXS5keCA9IGRzdE1WMTZ4MTYuZHg7Ci0gICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFswXVsxXS5keSA9IGRzdE1WMTZ4MTYuZHk7Ci0gICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVswXS5keCA9IGRzdE1WMTZ4MTYuZHg7Ci0gICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVswXS5keSA9IGRzdE1WMTZ4MTYuZHk7Ci0gICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVsxXS5keCA9IGRzdE1WMTZ4MTYuZHg7Ci0gICAgcFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVsxXS5keSA9IGRzdE1WMTZ4MTYuZHk7IAotICAgIAotICAgICpwRHN0U0FEICAgPSBkc3RTQUQxNngxNjsgICAgICAgCi0gICAgCi0gICAgaWYgKHBNRVBhcmFtcy0+c2VhcmNoRW5hYmxlOHg4KQotICAgIHsKLSAgICAgICAgLyogSW50ZXIgNE1WICovCi0gICAgICAgIGFybVZDTTRQMl9CbG9ja01hdGNoXzh4OCAocFNyY1JlZkJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVmU3RlcCwgcFJlZlJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wU3JjQ3VyckJ1ZiwgcFRlbXBDdXJyUG9pbnRQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WUHJlZFswXVswXSksIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNRVBhcmFtcywgJihwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdFNBRDh4OAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICBwRHN0QmxvY2tTQURbMF0gPSBkc3RTQUQ4eDg7Ci0gICAgICAgICpwRHN0U0FEID0gZHN0U0FEOHg4OwotICAgICAgICBwVGVtcEN1cnJQb2ludFBvcy0+eCArPSA4OwotICAgICAgICBwU3JjUmVmQnVmICs9IDg7Ci0gICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkKAotICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMV0pLAotICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WMVsxXSwKLSAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjJbMV0sCi0gICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYzWzFdLAotICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVlByZWRbMF1bMV0pLAotICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAxKTsKLSAgICAgICAgCi0gICAgICAgIGFybVZDTTRQMl9CbG9ja01hdGNoXzh4OCAocFNyY1JlZkJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVmU3RlcCwgcFJlZlJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wU3JjQ3VyckJ1ZiwgcFRlbXBDdXJyUG9pbnRQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocFNyY0RzdE1CQ3Vyci0+cE1WUHJlZFswXVsxXSksIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNRVBhcmFtcywgJihwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzFdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdFNBRDh4OAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICBwRHN0QmxvY2tTQURbMV0gPSBkc3RTQUQ4eDg7Ci0gICAgICAgICpwRHN0U0FEICs9IGRzdFNBRDh4ODsKLSAgICAgICAgcFRlbXBDdXJyUG9pbnRQb3MtPnggLT0gODsKLSAgICAgICAgcFRlbXBDdXJyUG9pbnRQb3MtPnkgKz0gODsKLSAgICAgICAgcFNyY1JlZkJ1ZiArPSAoc3JjUmVmU3RlcCAqIDgpIC0gODsKLSAgICAgICAgCi0gICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkKAotICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMF0pLAotICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WMVsyXSwKLSAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjJbMl0sCi0gICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYzWzJdLAotICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVlByZWRbMV1bMF0pLAotICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAyKTsKLSAgICAgICAgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfOHg4IChwU3JjUmVmQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWZTdGVwLCBwUmVmUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBTcmNDdXJyQnVmLCBwVGVtcEN1cnJQb2ludFBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVZQcmVkWzFdWzBdKSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1FUGFyYW1zLCAmKHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0U0FEOHg4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgIHBEc3RCbG9ja1NBRFsyXSA9IGRzdFNBRDh4ODsKLSAgICAgICAgKnBEc3RTQUQgKz0gZHN0U0FEOHg4OwotICAgICAgICBwVGVtcEN1cnJQb2ludFBvcy0+eCArPSA4OwotICAgICAgICBwU3JjUmVmQnVmICs9IDg7Ci0gICAgICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkKAotICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMV0pLAotICAgICAgICAgICAgICAgICAgICBwU3JjQ2FuZE1WMVszXSwKLSAgICAgICAgICAgICAgICAgICAgcFNyY0NhbmRNVjJbM10sCi0gICAgICAgICAgICAgICAgICAgIHBTcmNDYW5kTVYzWzNdLAotICAgICAgICAgICAgICAgICAgICAmKHBTcmNEc3RNQkN1cnItPnBNVlByZWRbMV1bMV0pLAotICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAzKTsKLSAgICAgICAgYXJtVkNNNFAyX0Jsb2NrTWF0Y2hfOHg4IChwU3JjUmVmQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWZTdGVwLCBwUmVmUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBTcmNDdXJyQnVmLCBwVGVtcEN1cnJQb2ludFBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwU3JjRHN0TUJDdXJyLT5wTVZQcmVkWzFdWzFdKSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1FUGFyYW1zLCAmKHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0U0FEOHg4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgIHBEc3RCbG9ja1NBRFszXSA9IGRzdFNBRDh4ODsKLSAgICAgICAgKnBEc3RTQUQgKz0gZHN0U0FEOHg4OyAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8qIENoZWNraW5nIGlmIDRNViBpcyBlcXVhbCB0byAxTVYgKi8KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgKHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMF0uZHggIT0gZHN0TVYxNngxNi5keCkgfHwKLSAgICAgICAgICAgIChwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdLmR5ICE9IGRzdE1WMTZ4MTYuZHkpIHx8Ci0gICAgICAgICAgICAocFNyY0RzdE1CQ3Vyci0+cE1WMFswXVsxXS5keCAhPSBkc3RNVjE2eDE2LmR4KSB8fAotICAgICAgICAgICAgKHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMV0uZHkgIT0gZHN0TVYxNngxNi5keSkgfHwKLSAgICAgICAgICAgIChwU3JjRHN0TUJDdXJyLT5wTVYwWzFdWzBdLmR4ICE9IGRzdE1WMTZ4MTYuZHgpIHx8Ci0gICAgICAgICAgICAocFNyY0RzdE1CQ3Vyci0+cE1WMFsxXVswXS5keSAhPSBkc3RNVjE2eDE2LmR5KSB8fAotICAgICAgICAgICAgKHBTcmNEc3RNQkN1cnItPnBNVjBbMV1bMV0uZHggIT0gZHN0TVYxNngxNi5keCkgfHwKLSAgICAgICAgICAgIChwU3JjRHN0TUJDdXJyLT5wTVYwWzFdWzFdLmR5ICE9IGRzdE1WMTZ4MTYuZHkpCi0gICAgICAgICAgICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogc2VsZWN0IHRoZSA0IE1WICovCi0gICAgICAgICAgICBwU3JjRHN0TUJDdXJyLT5tYlR5cGUgPSBPTVhfVkNfSU5URVI0VjsKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAvKiBmaW5kaW5nIHRoZSBlcnJvciBpbiBpbnRyYSBtb2RlICovCi0gICAgZm9yIChjb3VudCA9IDAsIGF2ZXJhZ2UgPSAwOyBjb3VudCA8IDI1NiA7IGNvdW50KyspCi0gICAgewotICAgICAgICBhdmVyYWdlID0gYXZlcmFnZSArIHBUZW1wU3JjQ3VyckJ1Zltjb3VudF07Ci0gICAgfQotICAgIGF2ZXJhZ2UgPSBhdmVyYWdlLzI1NjsKLSAgICAKLQlpbnRyYVNBRCA9IDA7Ci0KLSAgICAvKiBJbnRyYSBTQUQgY2FsY3VsYXRpb24gKi8KLSAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCAyNTYgOyBjb3VudCsrKQotICAgIHsKLSAgICAgICAgaW50cmFTQUQgKz0gYXJtQWJzICgocFRlbXBTcmNDdXJyQnVmW2NvdW50XSkgLSAoYXZlcmFnZSkpOwotICAgIH0KLSAgICAKLQkvKiBVc2luZyB0aGUgTVBFRzQgVk0gZm9ybXVsYSBmb3IgaW50cmEvaW50ZXIgbW9kZSBkZWNpc2lvbiAKLQkgICBWYXIgPCAoU0FEIC0gMipOQikgd2hlcmUgTkIgPSBOXjIgaXMgdGhlIG51bWJlciBvZiBwaXhlbHMKLQkgICBvZiB0aGUgbWFjcm9ibG9jay4qLwotCi0gICAgaWYgKGludHJhU0FEIDw9ICgqcERzdFNBRCAtIDUxMikpCi0gICAgewotICAgICAgICBwU3JjRHN0TUJDdXJyLT5tYlR5cGUgPSBPTVhfVkNfSU5UUkE7Ci0gICAgICAgIHBTcmNEc3RNQkN1cnItPnBNVjBbMF1bMF0uZHggPSAwOwotICAgICAgICBwU3JjRHN0TUJDdXJyLT5wTVYwWzBdWzBdLmR5ID0gMDsKLSAgICAgICAgKnBEc3RTQUQgICA9IGludHJhU0FEOwotICAgICAgICBwRHN0QmxvY2tTQURbMF0gPSAweEZGRkY7Ci0gICAgICAgIHBEc3RCbG9ja1NBRFsxXSA9IDB4RkZGRjsKLSAgICAgICAgcERzdEJsb2NrU0FEWzJdID0gMHhGRkZGOwotICAgICAgICBwRHN0QmxvY2tTQURbM10gPSAweEZGRkY7Ci0gICAgfQotCi0gICAgaWYocFNyY0RzdE1CQ3Vyci0+bWJUeXBlID09IE9NWF9WQ19JTlRFUikKLSAgICB7Ci0gICAgICBwVGVtcFNyY1JlZkJ1ZiA9IHBTcmNSZWZCdWYgKyAoc3JjUmVmU3RlcCAqIGRzdE1WMTZ4MTYuZHkpICsgZHN0TVYxNngxNi5keDsKLSAgICAKLSAgICAgIGlmKChkc3RNVjE2eDE2LmR4ICYgMHgxKSAmJiAoZHN0TVYxNngxNi5keSAmIDB4MSkpCi0gICAgICB7Ci0gICAgICAgIHByZWRpY3RUeXBlID0gT01YX1ZDX0hBTEZfUElYRUxfWFk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKGRzdE1WMTZ4MTYuZHggJiAweDEpCi0gICAgICB7Ci0gICAgICAgIHByZWRpY3RUeXBlID0gT01YX1ZDX0hBTEZfUElYRUxfWDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYoZHN0TVYxNngxNi5keSAmIDB4MSkKLSAgICAgIHsKLSAgICAgICAgcHJlZGljdFR5cGUgPSBPTVhfVkNfSEFMRl9QSVhFTF9ZOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBwcmVkaWN0VHlwZSA9IE9NWF9WQ19JTlRFR0VSX1BJWEVMOwotICAgICAgfQotICAgICAgCi0gICAgICBwRHN0ID0gYXJtQWxpZ25UbzhCeXRlcygmKGFEc3RbMF0pKTsKLSAgICAgIC8qIENhbGN1bGF0aW5nIEJsb2NrIFNBRCBhdCBNVihkc3RNVjE2eDE2LmR4LGRzdE1WMTZ4MTYuZHkpICovCi0JICAvKiBCbG9jayAwICovCi0gICAgICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrKHBUZW1wU3JjUmVmQnVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVmU3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNRVBhcmFtcy0+cm5kVmFsKTsKLSAgICAKLSAgICAgIGFybVZDQ09NTV9TQUQocFRlbXBTcmNDdXJyQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgMTYsCi0gICAgICAgICAgICAgICAgICAgICAgICBwRHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZTYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICA4LAotICAgICAgICAgICAgICAgICAgICAgICAgOCk7Ci0gICAgICBwRHN0QmxvY2tTQURbMF0gPSBTYWQ7Ci0gICAKLSAgICAgIC8qIEJsb2NrIDEgKi8KLSAgICAgIG9teFZDTTRQMl9NQ1JlY29uQmxvY2socFRlbXBTcmNSZWZCdWYgKyA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVmU3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNRVBhcmFtcy0+cm5kVmFsKTsJCQkJCSAgCi0KLSAgICAgIGFybVZDQ09NTV9TQUQocFRlbXBTcmNDdXJyQnVmICsgOCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDE2LAotICAgICAgICAgICAgICAgICAgICAgICAgcERzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAmU2FkLAotICAgICAgICAgICAgICAgICAgICAgICAgOCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDgpOwotICAgICAgcERzdEJsb2NrU0FEWzFdID0gU2FkOwotCQotICAgICAgLyogQmxvY2sgMiAqLwotICAgICAgb214VkNNNFAyX01DUmVjb25CbG9jayhwVGVtcFNyY1JlZkJ1ZiArIChzcmNSZWZTdGVwKjgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUmVmU3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNRVBhcmFtcy0+cm5kVmFsKTsKLQotICAgICAgYXJtVkNDT01NX1NBRChwVGVtcFNyY0N1cnJCdWYgKyAoMTYqOCksCi0gICAgICAgICAgICAgICAgICAgICAgICAxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgJlNhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICA4KTsKLSAgICAgIHBEc3RCbG9ja1NBRFsyXSA9IFNhZDsKLQotCSAgLyogQmxvY2sgMyAqLwotICAgICAgb214VkNNNFAyX01DUmVjb25CbG9jayhwVGVtcFNyY1JlZkJ1ZiArIChzcmNSZWZTdGVwKjgpICsgOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1JlZlN0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERzdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTUVQYXJhbXMtPnJuZFZhbCk7Ci0KLSAgICAgIGFybVZDQ09NTV9TQUQocFRlbXBTcmNDdXJyQnVmICsgKDE2KjgpICsgOCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDE2LAotICAgICAgICAgICAgICAgICAgICAgICAgcERzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdFN0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAmU2FkLAotICAgICAgICAgICAgICAgICAgICAgICAgOCwKLSAgICAgICAgICAgICAgICAgICAgICAgIDgpOwotICAgICAgcERzdEJsb2NrU0FEWzNdID0gU2FkOwotICAgIH0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA5MWYzMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0gLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIEZpbGU6ICAgICAgICBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX1MxNi5jCi0gKiBEZXNjcmlwdGlvbjogQ29udGFpbnMgbW9kdWxlcyBmb3IgQUMgREMgcHJlZGljdGlvbgotICoKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhICAgKDYuMi41LjQuMykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBlcmZvcm1zIGFkYXB0aXZlIERDL0FDIGNvZWZmaWNpZW50IHByZWRpY3Rpb24gZm9yIGFuIGludHJhIGJsb2NrLiAgUHJpb3IgCi0gKiB0byB0aGUgZnVuY3Rpb24gY2FsbCwgcHJlZGljdGlvbiBkaXJlY3Rpb24gKHByZWREaXIpIHNob3VsZCBiZSBzZWxlY3RlZCBhcyAKLSAqIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMy4xLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50IHJlc2lkdWFscyAoUFFGKSBvZiB0aGUgY3VycmVudCBibG9jazsgbXVzdCBiZSAKLSAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSAKLSAqICAgICAgICAgICAgc2F0dXJhdGVkIHRvIHRoZSByYW5nZSBbLTIwNDgsIDIwNDddLiAKLSAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgb24gCi0gKiAgICAgICAgICAgIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgY3VyUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBjdXJRUCBtYXkgZXF1YWwgdG8gCi0gKiAgICAgICAgICAgIHByZWRRUCBlc3BlY2lhbGx5IHdoZW4gdGhlIGN1cnJlbnQgYmxvY2sgYW5kIHRoZSBwcmVkaWN0b3IgYmxvY2sgCi0gKiAgICAgICAgICAgIGFyZSBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLiAKLSAqICAgcHJlZFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrIAotICogICBwcmVkRGlyIC0gaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUgb2YgdGhlIAotICogICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOiBPTVhfVkNfSE9SSVpPTlRBTCAtIHByZWRpY3QgaG9yaXpvbnRhbGx5IAotICogICAgICAgICAgICBPTVhfVkNfVkVSVElDQUwgLSBwcmVkaWN0IHZlcnRpY2FsbHkgCi0gKiAgIEFDUHJlZEZsYWcgLSBhIGZsYWcgaW5kaWNhdGluZyBpZiBBQyBwcmVkaWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQuIEl0IAotICogICAgICAgICAgICBpcyBlcXVhbCB0byBhY19wcmVkX2ZsYWcgaW4gdGhlIGJpdCBzdHJlYW0gc3ludGF4IG9mIE1QRUctNCAKLSAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSBvciBjaHJvbWluYW5jZSkgb2YgdGhlIAotICogICAgICAgICAgICBjdXJyZW50IGJsb2NrIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIHdoaWNoIGNvbnRhaW5zIHRoZSBxdWFudGl6ZWQgCi0gKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyAoUUYpIG9mIHRoZSBjdXJyZW50IGJsb2NrIAotICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlciAKLSAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgIE5vdGU6IAotICogICAgICAgICAgICBCdWZmZXIgdXBkYXRlOiBVcGRhdGUgdGhlIEFDIHByZWRpY3Rpb24gYnVmZmVyIChib3RoIHJvdyBhbmQgCi0gKiAgICAgICAgICAgIGNvbHVtbiBidWZmZXIpLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6Ci0gKiAgICAgICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzIGlzIE5VTEw6IAotICogICAgICAgICAgICAgIHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbC4gCi0gKiAgICAgICAgLSAgICBjdXJRUCA8PSAwLCAKLSAqICAgICAgICAtICAgIHByZWRRUCA8PSAwLCAKLSAqICAgICAgICAtICAgIGN1clFQID4zMSwgCi0gKiAgICAgICAgLSAgICBwcmVkUVAgPiAzMSwgCi0gKiAgICAgICAgLSAgICBwcmVEaXIgZXhjZWVkcyBbMSwyXQotICogICAgICAgIC0gICAgcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhKAotICAgICBPTVhfUzE2ICogcFNyY0RzdCwKLSAgICAgT01YX1MxNiAqIHBQcmVkQnVmUm93LAotICAgICBPTVhfUzE2ICogcFByZWRCdWZDb2wsCi0gICAgIE9NWF9JTlQgY3VyUVAsCi0gICAgIE9NWF9JTlQgcHJlZFFQLAotICAgICBPTVhfSU5UIHByZWREaXIsCi0gICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKLSAgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCi0gKQotewotICAgIE9NWF9VOCBmbGFnOwotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBQcmVkQnVmUm93ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwUHJlZEJ1ZkNvbCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoY3VyUVAgPD0gMCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRRUCA8PSAwLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoY3VyUVAgPiAzMSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHByZWRRUCA+IDMxLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKHByZWREaXIgIT0gMSkgJiYgKHByZWREaXIgIT0gMiksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM0Qnl0ZUFsaWduZWQocFNyY0RzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXM0Qnl0ZUFsaWduZWQocFByZWRCdWZSb3cpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzNEJ5dGVBbGlnbmVkKHBQcmVkQnVmQ29sKSwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgZmxhZyA9IDA7Ci0gICAgcmV0dXJuIGFybVZDTTRQMl9BQ0RDUHJlZGljdCgKLSAgICAgICAgcFNyY0RzdCwKLSAgICAgICAgTlVMTCwKLSAgICAgICAgcFByZWRCdWZSb3csCi0gICAgICAgIHBQcmVkQnVmQ29sLAotICAgICAgICBjdXJRUCwKLSAgICAgICAgcHJlZFFQLAotICAgICAgICBwcmVkRGlyLAotICAgICAgICBBQ1ByZWRGbGFnLAotICAgICAgICB2aWRlb0NvbXAsCi0gICAgICAgIGZsYWcsCi0gICAgICAgIE5VTEwpOwotCi19Ci0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnRlcl9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludGVyX0kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA1NWI2Ni4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludGVyX0kuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1F1YW50SW50ZXJfSS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRlciBRdWFudGl6YXRpb24KLSAqIAotICovCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW50ZXJfSSAgICg2LjIuNC40LjMpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyBxdWFudGl6YXRpb24gb24gYW4gaW50ZXIgY29lZmZpY2llbnQgYmxvY2s7IHN1cHBvcnRzIAotICogYml0c19wZXJfcGl4ZWwgPT0gOC4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IGludGVyIGJsb2NrIGNvZWZmaWNpZW50czsgbXVzdCBiZSBhbGlnbmVkIAotICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAotICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkgCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgCi0gKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwgYW5kIAotICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKLSAqCi0gKiBPdXRwdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAocXVhbnRpemVkKSBpbnRlcmJsb2NrIGNvZWZmaWNpZW50cy4gIAotICogICAgICAgICAgICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTEsIEFDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKLSAqICAgICAgICAgICAgaW50ZXJ2YWwgWy0xMjcsIDEyN10sIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCi0gKiAgICAgICAgICAgIGludGVydmFsIFsxLCAyNTRdLiAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0wLCBBQyBjb2VmZmljaWVudHMgCi0gKiAgICAgICAgICAgIGFyZSBzYXR1cmF0ZWQgb24gdGhlIGludGVydmFsIFstMjA0NywgMjA0N10uIAotICoKLSAqIFJldHVybiBWYWx1ZToKLSAqICAgIAotICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAotICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgotICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwuIAotICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludGVyX0koCi0gICAgIE9NWF9TMTYgKiBwU3JjRHN0LAotICAgICBPTVhfVTggUVAsCi0JIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotKQotewotCi0gICAgLyogRGVmaW5pdGlvbnMgYW5kIEluaXRpYWxpemF0aW9ucyovCi0gICAgT01YX0lOVCBjb2VmZkNvdW50OwotICAgIE9NWF9JTlQgZlNpZ247Ci0gICAgT01YX0lOVCBtYXhDbHBBQyA9IDAsIG1pbkNscEFDID0gMDsKLSAgICBPTVhfSU5UIG1heENscERDID0gMCwgbWluQ2xwREMgPSAwOwotICAgIAotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCgoUVAgPD0gMCkgfHwgKFFQID49IDMyKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgIC8qIE9uZSBhcmd1bWVudCBjaGVjayBpcyBkZWxheWVkIHVudGlsIHdlIGhhdmUgYXNjZXJ0YWluZWQgdGhhdCAgKi8KLSAgIC8qIHBRTWF0cml4IGlzIG5vdCBOVUxMLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAKLSAgICAvKiBTZXQgdGhlIENsaXAgUmFuZ2UgYmFzZWQgb24gU1ZIIG9uL29mZiAqLwotICAgIGlmKHNob3J0VmlkZW9IZWFkZXIgPT0gMSkKLSAgICB7Ci0gICAgICAgbWF4Q2xwREMgPSAyNTQ7Ci0gICAgICAgbWluQ2xwREMgPSAxOwotICAgICAgIG1heENscEFDID0gMTI3OwotICAgICAgIG1pbkNscEFDID0gLTEyNzsgICAgICAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBtYXhDbHBEQyA9IDIwNDc7Ci0gICAgICAgIG1pbkNscERDID0gLTIwNDc7Ci0gICAgICAgIG1heENscEFDID0gMjA0NzsKLSAgICAgICAgbWluQ2xwQUMgPSAtMjA0NzsgICAKLSAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgLyogU2Vjb25kIEludmVyc2UgcXVhbnRpc2F0aW9uIG1ldGhvZCAqLwotICAgIGZvciAoY29lZmZDb3VudCA9IDA7IGNvZWZmQ291bnQgPCA2NDsgY29lZmZDb3VudCsrKQotICAgIHsKLSAgICAgICAgZlNpZ24gPSAgYXJtU2lnbkNoZWNrIChwU3JjRHN0W2NvZWZmQ291bnRdKTsgIAotICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdID0gKGFybUFicyhwU3JjRHN0W2NvZWZmQ291bnRdKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKFFQLzIpKS8oMiAqIFFQKTsKLSAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSAqPSBmU2lnbjsKLSAgICAgICAgCi0gICAgICAgIC8qIENsaXAgKi8KLSAgICAgICAgaWYgKGNvZWZmQ291bnQgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdID0KLSAgICAgICAgICAgKE9NWF9TMTYpIGFybUNsaXAgKG1pbkNscERDLCBtYXhDbHBEQywgcFNyY0RzdFtjb2VmZkNvdW50XSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gPQotICAgICAgICAgICAoT01YX1MxNikgYXJtQ2xpcCAobWluQ2xwQUMsIG1heENscEFDLCBwU3JjRHN0W2NvZWZmQ291bnRdKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLQotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW50cmFfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnRyYV9JLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NWI4MDIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnRyYV9JLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9RdWFudEludHJhX0kuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50cmEgUXVhbnRpemF0aW9uCi0gKiAKLSAqLwotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludHJhX0kgICAoNi4yLjQuNC4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgcXVhbnRpemF0aW9uIG9uIGludHJhIGJsb2NrIGNvZWZmaWNpZW50cy4gVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyAKLSAqIGJpdHNfcGVyX3BpeGVsID09IDguIAotICoKLSAqIElucHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBpbnRyYSBibG9jayBjb2VmZmljaWVudHM7IG11c3QgYmUgYWxpZ25lZCAKLSAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpLiAKLSAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiwgCi0gKiAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDUsIGFzIGRlZmluZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgCi0gKiAgICAgICAgICAgIDYuMS4zLjguIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAotICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKHF1YW50aXplZCkgaW50ZXJibG9jayBjb2VmZmljaWVudHMuICAKLSAqICAgICAgICAgICAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLCBBQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCi0gKiAgICAgICAgICAgIGludGVydmFsIFstMTI3LCAxMjddLCBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAotICogICAgICAgICAgICBpbnRlcnZhbCBbMSwgMjU0XS4gIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MCwgQUMgY29lZmZpY2llbnRzIAotICogICAgICAgICAgICBhcmUgc2F0dXJhdGVkIG9uIHRoZSBpbnRlcnZhbCBbLTIwNDcsIDIwNDddLiAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMLiAKLSAqICAgIC0gICAgYmxvY2tJbmRleCA8IDAgb3IgYmxvY2tJbmRleCA+PSAxMCAKLSAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnRyYV9JKAotICAgICBPTVhfUzE2ICogcFNyY0RzdCwKLSAgICAgT01YX1U4IFFQLAotICAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCi0JIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgotICkKLXsKLQotICAgIC8qIERlZmluaXRpb25zIGFuZCBJbml0aWFsaXphdGlvbnMqLwotICAgIC8qIEluaXRpYWxpemVkIHRvIHJlbW92ZSBjb21waWxhdGlvbiBlcnJvciAqLwotICAgIE9NWF9JTlQgZGNTY2FsZXIgPSAwLCBjb2VmZkNvdW50LGZTaWduOwotICAgIE9NWF9JTlQgbWF4Q2xwQUMsIG1pbkNscEFDOwotCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKChibG9ja0luZGV4IDwgMCkgfHwgKGJsb2NrSW5kZXggPj0gMTApKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCgoUVAgPD0gMCkgfHwgKFFQID49IDMyKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgIC8qIE9uZSBhcmd1bWVudCBjaGVjayBpcyBkZWxheWVkIHVudGlsIHdlIGhhdmUgYXNjZXJ0YWluZWQgdGhhdCAgKi8KLSAgIC8qIHBRTWF0cml4IGlzIG5vdCBOVUxMLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIAotICAgIC8qIFNldCB0aGUgQ2xpcCBSYW5nZSBiYXNlZCBvbiBTVkggb24vb2ZmICovCi0gICAgaWYoc2hvcnRWaWRlb0hlYWRlciA9PSAxKQotICAgIHsKLSAgICAgICAgbWF4Q2xwQUMgPSAxMjc7Ci0gICAgICAgIG1pbkNscEFDID0gLTEyNzsKLSAgICAgICAgZGNTY2FsZXIgPSA4OwotICAgICAgICAvKiBEZXF1YW50IHRoZSBEQyB2YWx1ZSwgdGhpcyBhcHBsaWVzIHRvIGJvdGggdGhlIG1ldGhvZHMgKi8KLSAgICAgICAgcFNyY0RzdFswXSA9IGFybUludERpdkF3YXlGcm9tWmVybyAocFNyY0RzdFswXSwgZGNTY2FsZXIpOwotICAgIAotICAgICAgICAvKiBDbGlwIGJldHdlZW4gMSBhbmQgMjU0ICovCi0gICAgICAgIHBTcmNEc3RbMF0gPSAoT01YX1MxNikgYXJtQ2xpcCAoMSwgMjU0LCBwU3JjRHN0WzBdKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbWF4Q2xwQUMgPSAyMDQ3OwotICAgICAgICBtaW5DbHBBQyA9IC0yMDQ3OyAgIAotICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIERDIHNjYWxlciB2YWx1ZSAqLwotICAgICAgICBpZiAoKGJsb2NrSW5kZXggIDwgNCkgfHwgKGJsb2NrSW5kZXggID4gNSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChRUCA+PSAxICYmIFFQIDw9IDQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGNTY2FsZXIgPSA4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoUVAgPj0gNSAmJiBRUCA8PSA4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gMiAqIFFQOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoUVAgPj0gOSAmJiBRUCA8PSAyNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkY1NjYWxlciA9IFFQICsgODsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkY1NjYWxlciA9ICgyICogUVApIC0gMTY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYmxvY2tJbmRleCA8IDYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChRUCA+PSAxICYmIFFQIDw9IDQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGNTY2FsZXIgPSA4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoUVAgPj0gNSAmJiBRUCA8PSAyNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkY1NjYWxlciA9IChRUCArIDEzKS8yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gUVAgLSA2OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKiBEZXF1YW50IHRoZSBEQyB2YWx1ZSwgdGhpcyBhcHBsaWVzIHRvIGJvdGggdGhlIG1ldGhvZHMgKi8KLSAgICAgICAgcFNyY0RzdFswXSA9IGFybUludERpdkF3YXlGcm9tWmVybyAocFNyY0RzdFswXSwgZGNTY2FsZXIpOwotICAgIH0KLSAgICAKLSAgICAvKiBTZWNvbmQgSW52ZXJzZSBxdWFudGlzYXRpb24gbWV0aG9kICovCi0gICAgZm9yIChjb2VmZkNvdW50ID0gMTsgY29lZmZDb3VudCA8IDY0OyBjb2VmZkNvdW50KyspCi0gICAgewotICAgICAgICBmU2lnbiA9ICBhcm1TaWduQ2hlY2sgKHBTcmNEc3RbY29lZmZDb3VudF0pOyAgCi0gICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gPSBhcm1BYnMocFNyY0RzdFtjb2VmZkNvdW50XSkvKDIgKiBRUCk7Ci0gICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gKj0gZlNpZ247Ci0KLSAgICAgICAgLyogQ2xpcCAqLwotICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdID0KLSAgICAgICAgKE9NWF9TMTYpIGFybUNsaXAgKG1pbkNscEFDLCBtYXhDbHBBQywgcFNyY0RzdFtjb2VmZkNvdW50XSk7Ci0gICAgfQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotCi19Ci0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg5ZTI0NC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0kuYworKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSS5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRlciBpbnZlcnNlIFF1YW50aXphdGlvbgotICogCi0gKi8gCi0KLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgImFybU9NWC5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0KLSNpbmNsdWRlICJhcm1DT01NLmgiCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludkludGVyX0kgICAoNi4yLjUuMy4yKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogUGVyZm9ybXMgdGhlIHNlY29uZCBpbnZlcnNlIHF1YW50aXphdGlvbiBtb2RlIG9uIGFuIGludHJhL2ludGVyIGNvZGVkIAotICogYmxvY2suIFN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gCi0gKiB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrOyBtdXN0IGJlIAotICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKLSAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgCi0gKiAgICAgICAgICAgIGZvbGxvd2luZyBmbGFnczogT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIChpbnRyYSAKLSAqICAgICAgICAgICAgdmVyc2lvbiBvbmx5KS4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlciAKLSAqICAgICAgICAgICAgKGludHJhIHZlcnNpb24gb25seSkuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2sgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgCi0gKiAgICAgICAgICAgICAgdHJ1ZTogCi0gKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTCAKLSAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PTMxIAotICogICAgLSAgICB2aWRlb0NvbXAgaXMgbmVpdGhlciBPTVhfVkNfTFVNSU5BTkNFIG5vciBPTVhfVkNfQ0hST01JTkFOQ0UuIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSgKLSAgICAgT01YX1MxNiAqIHBTcmNEc3QsCi0gICAgIE9NWF9JTlQgUVAKLQkgKQotewotCi0gICAgT01YX0lOVCBjb2VmZkNvdW50LCBTaWduOwotICAgIAotICAgIC8qIEFyZ3VtZW50IGVycm9yIGNoZWNrcyAqLwotICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCgoUVAgPD0gMCkgfHwgKFFQID49IDMyKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIC8qIFNlY29uZCBJbnZlcnNlIHF1YW50aXNhdGlvbiBtZXRob2QgKi8KLSAgICBmb3IgKGNvZWZmQ291bnQgPSAwOyBjb2VmZkNvdW50IDwgNjQ7IGNvZWZmQ291bnQrKykKLSAgICB7Ci0gICAgICAgIC8qIGNoZWNrIHNpZ24gKi8KLSAgICAgICAgU2lnbiA9ICBhcm1TaWduQ2hlY2sgKHBTcmNEc3RbY29lZmZDb3VudF0pOwotICAgICAgICAgICAgICAKLSAgICAgICAgLyogUXVhbnRpemUgdGhlIGNvZWZmICovCi0gICAgICAgIGlmIChRUCAmIDB4MSkKLSAgICAgICAgewotICAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9ICgyKiBhcm1BYnMocFNyY0RzdFtjb2VmZkNvdW50XSkgKyAxKSAqIFFQOwotICAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSAqPSBTaWduOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSA9ICgyKiBhcm1BYnMocFNyY0RzdFtjb2VmZkNvdW50XSkgKyAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUVAgLSAxOwotICAgICAgICAgICAgcFNyY0RzdFtjb2VmZkNvdW50XSAqPSBTaWduOwotICAgICAgICB9Ci0gICAgICAgIC8qIFNhdHVyYXRlICovCi0gICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gPSBhcm1DbGlwICgtMjA0OCwgMjA0NywgcFNyY0RzdFtjb2VmZkNvdW50XSk7Ci0gICAgfQotICAgIHJldHVybiBPTVhfU3RzX05vRXJyOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMjRjYzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9RdWFudEludkludHJhX0kuYwotICogT3Blbk1BWCBETDogdjEuMC4yCi0gKiBSZXZpc2lvbjogICA5NjQxCi0gKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAotICogCi0gKiAKLSAqIAotICoKLSAqIERlc2NyaXB0aW9uOgotICogQ29udGFpbnMgbW9kdWxlcyBmb3IgaW50cmEgaW52ZXJzZSBRdWFudGl6YXRpb24KLSAqIAotICovIAotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0vKioKLSAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSAgICg2LjIuNS4zLjIpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBQZXJmb3JtcyB0aGUgc2Vjb25kIGludmVyc2UgcXVhbnRpemF0aW9uIG1vZGUgb24gYW4gaW50cmEvaW50ZXIgY29kZWQgCi0gKiBibG9jay4gU3VwcG9ydHMgYml0c19wZXJfcGl4ZWwgPSA4LiBUaGUgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgY2xpcHBlZCB0byAKLSAqIHRoZSByYW5nZSBbLTIwNDgsIDIwNDddLiAKLSAqCi0gKiBJbnB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgKHF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2s7IG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChxdWFudGl6ZXJfc2NhbGUpIAotICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSBvZiB0aGUgY3VycmVudCBibG9jay4gVGFrZXMgb25lIG9mIHRoZSAKLSAqICAgICAgICAgICAgZm9sbG93aW5nIGZsYWdzOiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgKGludHJhIAotICogICAgICAgICAgICB2ZXJzaW9uIG9ubHkpLiAKLSAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyIAotICogICAgICAgICAgICAoaW50cmEgdmVyc2lvbiBvbmx5KS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jayAKLSAqCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAKLSAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKLSAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyAKLSAqICAgICAgICAgICAgICB0cnVlOiAKLSAqICAgIC0gICAgcFNyY0RzdCBpcyBOVUxMIAotICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49MzEgCi0gKiAgICAtICAgIHZpZGVvQ29tcCBpcyBuZWl0aGVyIE9NWF9WQ19MVU1JTkFOQ0Ugbm9yIE9NWF9WQ19DSFJPTUlOQU5DRS4gCi0gKgotICovCi0KLU9NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JKAotICAgICBPTVhfUzE2ICogcFNyY0RzdCwKLSAgICAgT01YX0lOVCBRUCwKLSAgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wLAotCSBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKLSkKLXsKLQotICAgIC8qIEluaXRpYWxpemVkIHRvIHJlbW92ZSBjb21waWxhdGlvbiBlcnJvciAqLwotICAgIE9NWF9JTlQgZGNTY2FsZXIgPSAwLCBjb2VmZkNvdW50LCBTaWduOwotCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoKChRUCA8PSAwKSB8fCAoUVAgPj0gMzIpKSwgT01YX1N0c19CYWRBcmdFcnIpOwotCWFybVJldEFyZ0VycklmKCgodmlkZW9Db21wICE9IE9NWF9WQ19MVU1JTkFOQ0UpICYmICh2aWRlb0NvbXAgIT0gT01YX1ZDX0NIUk9NSU5BTkNFKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICAKLSAgICAvKiBDYWxjdWxhdGUgdGhlIERDIHNjYWxlciB2YWx1ZSAqLwotICAgIAotICAgIC8qIGxpbmVhciBpbnRyYSBEQyBtb2RlICovCi0gICAgaWYoc2hvcnRWaWRlb0hlYWRlcikKLSAgICB7Ci0gICAgICAgIGRjU2NhbGVyID0gODsKLSAgICB9Ci0gICAgLyogbm9ubGluZWFyIGludHJhIERDIG1vZGUgKi8KLSAgICBlbHNlCi0gICAgewotICAgIAotICAgICAgICBpZiAodmlkZW9Db21wID09IE9NWF9WQ19MVU1JTkFOQ0UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChRUCA+PSAxICYmIFFQIDw9IDQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGNTY2FsZXIgPSA4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoUVAgPj0gNSAmJiBRUCA8PSA4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gMiAqIFFQOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoUVAgPj0gOSAmJiBRUCA8PSAyNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkY1NjYWxlciA9IFFQICsgODsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkY1NjYWxlciA9ICgyICogUVApIC0gMTY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBlbHNlIGlmICh2aWRlb0NvbXAgPT0gT01YX1ZDX0NIUk9NSU5BTkNFKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoUVAgPj0gMSAmJiBRUCA8PSA0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRjU2NhbGVyID0gODsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKFFQID49IDUgJiYgUVAgPD0gMjQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGNTY2FsZXIgPSAoUVAgKyAxMykvMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkY1NjYWxlciA9IFFQIC0gNjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBEZXF1YW50IHRoZSBEQyB2YWx1ZSwgdGhpcyBhcHBsaWVzIHRvIGJvdGggdGhlIG1ldGhvZHMgKi8KLSAgICBwU3JjRHN0WzBdID0gcFNyY0RzdFswXSAqIGRjU2NhbGVyOwotCi0gICAgLyogU2F0dXJhdGUgKi8KLSAgICBwU3JjRHN0WzBdID0gYXJtQ2xpcCAoLTIwNDgsIDIwNDcsIHBTcmNEc3RbMF0pOwotCi0gICAgLyogU2Vjb25kIEludmVyc2UgcXVhbnRpc2F0aW9uIG1ldGhvZCAqLwotICAgIGZvciAoY29lZmZDb3VudCA9IDE7IGNvZWZmQ291bnQgPCA2NDsgY29lZmZDb3VudCsrKQotICAgIHsKLSAgICAgICAgLyogY2hlY2sgc2lnbiAqLwotICAgICAgICBTaWduID0gIGFybVNpZ25DaGVjayAocFNyY0RzdFtjb2VmZkNvdW50XSk7ICAKLQotICAgICAgICBpZiAoUVAgJiAweDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gPSAoMiogYXJtQWJzKHBTcmNEc3RbY29lZmZDb3VudF0pICsgMSkgKiBRUDsKLSAgICAgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gKj0gU2lnbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBTcmNEc3RbY29lZmZDb3VudF0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiogYXJtQWJzKHBTcmNEc3RbY29lZmZDb3VudF0pICsgMSkgKiBRUCAtIDE7Ci0gICAgICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdICo9IFNpZ247Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBTYXR1cmF0ZSAqLwotICAgICAgICBwU3JjRHN0W2NvZWZmQ291bnRdID0gYXJtQ2xpcCAoLTIwNDgsIDIwNDcsIHBTcmNEc3RbY29lZmZDb3VudF0pOwotICAgIH0KLSAgICByZXR1cm4gT01YX1N0c19Ob0VycjsKLQotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvcmVmZXJlbmNlL3ZjL200cDIvc3JjL29teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjE1YTc3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEFSTSBMaW1pdGVkCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotLyoqCi0gKiAKLSAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlci5jCi0gKiBPcGVuTUFYIERMOiB2MS4wLjIKLSAqIFJldmlzaW9uOiAgIDk2NDEKLSAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Ci0gKiAKLSAqIAotICogCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBDb250YWlucyBtb2R1bGVzIERDVC0+cXVhbnQgYW5kIHJlY29uc3RydWN0aW5nIHRoZSBpbnRlciB0ZXh0dXJlIGRhdGEKLSAqIAotICovIAotCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotCi0KLS8qKgotICogRnVuY3Rpb246ICBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50ZXIgICAoNi4yLjQuNC41KQotICoKLSAqIERlc2NyaXB0aW9uOgotICogSW1wbGVtZW50cyBEQ1QsIGFuZCBxdWFudGl6ZXMgdGhlIERDVCBjb2VmZmljaWVudHMgb2YgdGhlIGludGVyIGJsb2NrIAotICogd2hpbGUgcmVjb25zdHJ1Y3RpbmcgdGhlIHRleHR1cmUgcmVzaWR1YWwuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciAKLSAqIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtcG9pbnRlciB0byB0aGUgcmVzaWR1YWxzIHRvIGJlIGVuY29kZWQ7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiAKLSAqICAgICAgICAgICAgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlci4gCi0gKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgCi0gKiAgICAgICAgICAgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIG1vZGUsIGFuZCAKLSAqICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAotICoKLSAqIE91dHB1dCBBcmd1bWVudHM6Ci0gKiAgIAotICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudHMgYnVmZmVyOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBSZWMgLSBwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIHRleHR1cmUgcmVzaWR1YWxzOyBtdXN0IGJlIGFsaWduZWQgCi0gKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIGVpdGhlciBOVUxMIG9yIAotICogICAgICAgICBub3QgMTYtYnl0ZSBhbGlnbmVkOiAKLSAqICAgICAgICAgICAgLSBwU3JjIAotICogICAgICAgICAgICAtIHBEc3QKLSAqICAgICAgICAgICAgLSBwUmVjCi0gKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAotICoKLSAqLwotCi1PTVhSZXN1bHQgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyKAotICAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAotICAgICBPTVhfUzE2ICogcERzdCwKLSAgICAgT01YX1MxNiAqIHBSZWMsCi0gICAgIE9NWF9VOCBRUCwKLSAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pCi17Ci0gICAgLyogNjQgZWxlbWVudHMgYXJlIG5lZWRlZCBidXQgdG8gYWxpZ24gaXQgdG8gMTYgYnl0ZXMgbmVlZCAKLSAgICA4IG1vcmUgZWxlbWVudHMgb2YgcGFkZGluZyAqLwotICAgIE9NWF9TMTYgdGVtcEJ1ZmZlcls3Ml07Ci0gICAgT01YX1MxNiAqcFRlbXBCdWZmZXI7Ci0gICAgT01YX0lOVCBpOwotICAgICAgICAKLSAgICAvKiBBbGlnbmluZyB0aGUgbG9jYWwgYnVmZmVycyAqLwotICAgIHBUZW1wQnVmZmVyID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1ZmZlcik7Ci0KLSAgICAvKiBBcmd1bWVudCBlcnJvciBjaGVja3MgKi8KLSAgICBhcm1SZXRBcmdFcnJJZihwU3JjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwUmVjID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwRHN0ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZighYXJtSXMxNkJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwUmVjKSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKCFhcm1JczE2Qnl0ZUFsaWduZWQocERzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoKFFQIDw9IDApIHx8IChRUCA+PSAzMikpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgCi0gICAgb214VkNNNFAyX0RDVDh4OGJsayAocFNyYywgcERzdCk7Ci0gICAgb214VkNNNFAyX1F1YW50SW50ZXJfSSgKLSAgICAgcERzdCwKLSAgICAgUVAsCi0gICAgIHNob3J0VmlkZW9IZWFkZXIpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCi0gICAgewotICAgICAgICBwVGVtcEJ1ZmZlcltpXSA9IHBEc3RbaV07Ci0gICAgfQotCi0gICAgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSgKLSAgICAgcFRlbXBCdWZmZXIsCi0gICAgIFFQKTsKLSAgICBvbXhWQ000UDJfSURDVDh4OGJsayAocFRlbXBCdWZmZXIsIHBSZWMpOwotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvbTRwMi9zcmMvb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MjNlM2YuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEuYworKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0vKioKLSAqIAotICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhLmMKLSAqIE9wZW5NQVggREw6IHYxLjAuMgotICogUmV2aXNpb246ICAgOTY0MQotICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKLSAqIAotICogCi0gKiAKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqIENvbnRhaW5zIG1vZHVsZXMgRENULT5xdWFudCBhbmQgcmVjb25zdHJ1Y3RpbmcgdGhlIGludHJhIHRleHR1cmUgZGF0YQotICogCi0gKi8gCi0gCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJhcm1PTVguaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotCi0jaW5jbHVkZSAiYXJtQ09NTS5oIgotI2luY2x1ZGUgImFybVZDLmgiCi0KLQotLyoqCi0gKiBGdW5jdGlvbjogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAgICg2LjIuNC40LjQpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiBRdWFudGl6ZXMgdGhlIERDVCBjb2VmZmljaWVudHMsIGltcGxlbWVudHMgaW50cmEgYmxvY2sgQUMvREMgY29lZmZpY2llbnQgCi0gKiBwcmVkaWN0aW9uLCBhbmQgcmVjb25zdHJ1Y3RzIHRoZSBjdXJyZW50IGludHJhIGJsb2NrIHRleHR1cmUgZm9yIHByZWRpY3Rpb24gCi0gKiBvbiB0aGUgbmV4dCBmcmFtZS4gIFF1YW50aXplZCByb3cgYW5kIGNvbHVtbiBjb2VmZmljaWVudHMgYXJlIHJldHVybmVkIGluIAotICogdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgYnVmZmVycy4gCi0gKgotICogSW5wdXQgQXJndW1lbnRzOgotICogICAKLSAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHBpeGVscyBvZiBjdXJyZW50IGludHJhIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gCi0gKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlciBjb250YWluaW5nIAotICogICAgICAgICAgICAoKG51bV9tYl9wZXJfcm93ICogMiArIDEpICogOCkgZWxlbWVudHMgb2YgdHlwZSBPTVhfUzE2LiAKLSAqICAgICAgICAgICAgQ29lZmZpY2llbnRzIGFyZSBvcmdhbml6ZWQgaW50byBibG9ja3Mgb2YgZWlnaHQgYXMgZGVzY3JpYmVkIAotICogICAgICAgICAgICBiZWxvdyAoSW50ZXJuYWwgUHJlZGljdGlvbiBDb2VmZmljaWVudCBVcGRhdGUgUHJvY2VkdXJlcykuICBUaGUgCi0gKiAgICAgICAgICAgIERDIGNvZWZmaWNpZW50IGlzIGZpcnN0LCBhbmQgdGhlIHJlbWFpbmluZyBidWZmZXIgbG9jYXRpb25zIAotICogICAgICAgICAgICBjb250YWluIHRoZSBxdWFudGl6ZWQgQUMgY29lZmZpY2llbnRzLiBFYWNoIGdyb3VwIG9mIGVpZ2h0IHJvdyAKLSAqICAgICAgICAgICAgYnVmZmVyIGVsZW1lbnRzIGNvbWJpbmVkIHdpdGggb25lIGVsZW1lbnQgZWlnaHQgZWxlbWVudHMgYWhlYWQgCi0gKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCBwcmVkaWN0b3JzIG9mIHRoZSBuZWlnaGJvcmluZyBibG9jayAKLSAqICAgICAgICAgICAgdGhhdCBpcyBzcGF0aWFsbHkgYWJvdmUgb3IgdG8gdGhlIGxlZnQgb2YgdGhlIGJsb2NrIGN1cnJlbnRseSB0byAKLSAqICAgICAgICAgICAgYmUgZGVjb2RlZC4gQSBuZWdhdGl2ZS12YWx1ZWQgREMgY29lZmZpY2llbnQgaW5kaWNhdGVzIHRoYXQgdGhpcyAKLSAqICAgICAgICAgICAgbmVpZ2hib3JpbmcgYmxvY2sgaXMgbm90IElOVFJBLWNvZGVkIG9yIG91dCBvZiBib3VuZHMsIGFuZCAKLSAqICAgICAgICAgICAgdGhlcmVmb3JlIHRoZSBBQyBhbmQgREMgY29lZmZpY2llbnRzIGFyZSBpbnZhbGlkLiAgUG9pbnRlciBtdXN0IAotICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCi0gKiAgIHBQcmVkQnVmQ29sIC0gcG9pbnRlciB0byB0aGUgcHJlZGljdGlvbiBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyIAotICogICAgICAgICAgICBjb250YWluaW5nIDE2IGVsZW1lbnRzIG9mIHR5cGUgT01YX1MxNi4gQ29lZmZpY2llbnRzIGFyZSAKLSAqICAgICAgICAgICAgb3JnYW5pemVkIGFzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDYuMi4yLjUuICBQb2ludGVyIG11c3QgYmUgCi0gKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFN1bUVyciAtIHBvaW50ZXIgdG8gYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgQUMgcHJlZGljdGlvbiBpcyAKLSAqICAgICAgICAgICAgcmVxdWlyZWQ7IEFDIHByZWRpY3Rpb24gaXMgZW5hYmxlZCBpZiAqcFN1bUVyciA+PTAsIGJ1dCB0aGUgCi0gKiAgICAgICAgICAgIHZhbHVlIGlzIG5vdCB1c2VkIGZvciBjb2VmZmljaWVudCBwcmVkaWN0aW9uLCBpLmUuLCB0aGUgc3VtIG9mIAotICogICAgICAgICAgICBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBzdGFydHMgZnJvbSAwIGZvciBlYWNoIGNhbGwgdG8gdGhpcyAKLSAqICAgICAgICAgICAgZnVuY3Rpb24uICBPdGhlcndpc2UgQUMgcHJlZGljdGlvbiBpcyBkaXNhYmxlZCBpZiAqcFN1bUVyciA8IDAgLiAKLSAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiwgYXMgCi0gKiAgICAgICAgICAgIGRlZmluZWQgaW4gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNi4xLjMuOC4gCi0gKiAgIGN1clFwIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgbWFjcm9ibG9jayB0byB3aGljaCB0aGUgY3VycmVudCAKLSAqICAgICAgICAgICAgYmxvY2sgYmVsb25ncyAKLSAqICAgcFFwQnVmIC0gcG9pbnRlciB0byBhIDItZWxlbWVudCBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcjsgcFFwQnVmWzBdIAotICogICAgICAgICAgICBjb250YWlucyB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBhc3NvY2lhdGVkIHdpdGggdGhlIDh4OCAKLSAqICAgICAgICAgICAgYmxvY2sgbGVmdCBvZiB0aGUgY3VycmVudCBibG9jayAoUVBhKSwgYW5kIHBRcEJ1ZlsxXSBjb250YWlucyAKLSAqICAgICAgICAgICAgdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSA4eDggYmxvY2sgYWJvdmUgCi0gKiAgICAgICAgICAgIHRoZSBjdXJyZW50IGJsb2NrIChRUGMpLiAgSW4gdGhlIGV2ZW50IHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgCi0gKiAgICAgICAgICAgIGJsb2NrIGlzIG91dHNpZGUgb2YgdGhlIFZPUCBib3VuZCwgdGhlIFFwIHZhbHVlIHdpbGwgbm90IGFmZmVjdCAKLSAqICAgICAgICAgICAgdGhlIGludHJhIHByZWRpY3Rpb24gcHJvY2VzcywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgCi0gKiAgICAgICAgICAgIHN1Yi1jbGF1c2UgNy40LjMuMywgIEFkYXB0aXZlIEFDIENvZWZmaWNpZW50IFByZWRpY3Rpb24uICAKLSAqICAgc3JjU3RlcCAtIHdpZHRoIG9mIHRoZSBzb3VyY2UgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCi0gKiAgIGRzdFN0ZXAgLSB3aWR0aCBvZiB0aGUgcmVjb25zdHJ1Y3RlZCBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSAKLSAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgMTYuIAotICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKLSAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAotICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCi0gKgotICogT3V0cHV0IEFyZ3VtZW50czoKLSAqICAgCi0gKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IGJ1ZmZlcjsgcERzdFswXSBjb250YWlucyAKLSAqICAgICAgICAgICAgdGhlIHByZWRpY3RlZCBEQyBjb2VmZmljaWVudDsgdGhlIHJlbWFpbmluZyBlbnRyaWVzIGNvbnRhaW4gdGhlIAotICogICAgICAgICAgICBxdWFudGl6ZWQgQUMgY29lZmZpY2llbnRzICh3aXRob3V0IHByZWRpY3Rpb24pLiAgVGhlIHBvaW50ZXIgCi0gKiAgICAgICAgICAgIHBEc3RtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKLSAqICAgcFJlYyAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgdGV4dHVyZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIAotICogICAgICAgICAgICA4LWJ5dGUgYm91bmRhcnkuIAotICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlciAKLSAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgCi0gKiAgIHBQcmVBQ1ByZWRpY3QgLSBpZiBwcmVkaWN0aW9uIGlzIGVuYWJsZWQsIHRoZSBwYXJhbWV0ZXIgcG9pbnRzIHRvIHRoZSAKLSAqICAgICAgICAgICAgc3RhcnQgb2YgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBjb2VmZmljaWVudCBkaWZmZXJlbmNlcyBmb3IgCi0gKiAgICAgICAgICAgIFZMQyBlbmNvZGluZy4gVGhlIGVudHJ5IHBQcmVBQ1ByZWRpY3RbMF1pbmRpY2F0ZXMgcHJlZGljdGlvbiAKLSAqICAgICAgICAgICAgZGlyZWN0aW9uIGZvciB0aGUgY3VycmVudCBibG9jayBhbmQgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgCi0gKiAgICAgICAgICAgIHZhbHVlczogT01YX1ZDX05PTkUgKHByZWRpY3Rpb24gZGlzYWJsZWQpLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCi0gKiAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gIFRoZSBlbnRyaWVzIAotICogICAgICAgICAgICBwUHJlQUNQcmVkaWN0WzFdLXBQcmVBQ1ByZWRpY3RbN11jb250YWluIHByZWRpY3RlZCBBQyAKLSAqICAgICAgICAgICAgY29lZmZpY2llbnRzLiAgSWYgcHJlZGljdGlvbiBpcyBkaXNhYmxlZCAoKnBTdW1FcnI8MCkgdGhlbiB0aGUgCi0gKiAgICAgICAgICAgIGNvbnRlbnRzIG9mIHRoaXMgYnVmZmVyIGFyZSB1bmRlZmluZWQgdXBvbiByZXR1cm4gZnJvbSB0aGUgCi0gKiAgICAgICAgICAgIGZ1bmN0aW9uIAotICogICBwU3VtRXJyIC0gcG9pbnRlciB0byB0aGUgdmFsdWUgb2YgdGhlIGFjY3VtdWxhdGVkIEFDIGNvZWZmaWNpZW50IGVycm9ycywgCi0gKiAgICAgICAgICAgIGkuZS4sIHN1bSBvZiB0aGUgYWJzb2x1dGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBwcmVkaWN0ZWQgYW5kIAotICogICAgICAgICAgICB1bnByZWRpY3RlZCBBQyBjb2VmZmljaWVudHMgCi0gKgotICogUmV0dXJuIFZhbHVlOgotICogICAgCi0gKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCi0gKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHM6Ci0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QsIHBSZWMsIAotICogICAgICAgICBwQ29lZkJ1ZlJvdywgcENvZWZCdWZDb2wsIHBRcEJ1ZiwgcFByZUFDUHJlZGljdCwgcFN1bUVyci4gCi0gKiAgICAtICAgIGJsb2NrSW5kZXggPCAwIG9yIGJsb2NrSW5kZXggPj0gMTA7IAotICogICAgLSAgICBjdXJRUCA8PSAwIG9yIGN1clFQID49IDMyLiAKLSAqICAgIC0gICAgc3JjU3RlcCwgb3IgZHN0U3RlcCA8PSAwIG9yIG5vdCBhIG11bHRpcGxlIG9mIDguIAotICogICAgLSAgICBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQ6IC4gCi0gKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZDogCi0gKiAgICAgICAgIHBTcmMsIHBSZWMuICAKLSAqCi0gKiAgTm90ZTogVGhlIGNvZWZmaWNpZW50IGJ1ZmZlcnMgbXVzdCBiZSB1cGRhdGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgCi0gKiAgICAgICAgdXBkYXRlIHByb2NlZHVyZXMgZGVmaW5lZCBpbiBzZWN0aW9uIGluIDYuMi4yLiAKLSAqCi0gKi8KLQotT01YUmVzdWx0IG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSgKLSAgICAgY29uc3QgT01YX1U4ICpwU3JjLAotICAgICBPTVhfUzE2ICogcERzdCwKLSAgICAgT01YX1U4ICogcFJlYywKLSAgICAgT01YX1MxNiAqcFByZWRCdWZSb3csCi0gICAgIE9NWF9TMTYgKnBQcmVkQnVmQ29sLAotICAgICBPTVhfUzE2ICogcFByZUFDUHJlZGljdCwKLSAgICAgT01YX0lOVCAqcFN1bUVyciwKLSAgICAgT01YX0lOVCBibG9ja0luZGV4LAotICAgICBPTVhfVTggY3VyUXAsCi0gICAgIGNvbnN0IE9NWF9VOCAqcFFwQnVmLAotICAgICBPTVhfSU5UIHNyY1N0ZXAsCi0gICAgIE9NWF9JTlQgZHN0U3RlcCwKLQkgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCi0pCi17Ci0gICAgLyogNjQgZWxlbWVudHMgYXJlIG5lZWRlZCBidXQgdG8gYWxpZ24gaXQgdG8gMTYgYnl0ZXMgbmVlZAotICAgIDggbW9yZSBlbGVtZW50cyBvZiBwYWRkaW5nICovCi0gICAgT01YX1MxNiB0ZW1wQnVmMVs3OV0sIHRlbXBCdWYyWzc5XTsKLSAgICBPTVhfUzE2IHRlbXBCdWYzWzc5XTsKLSAgICBPTVhfUzE2ICpwVGVtcEJ1ZjEsICpwVGVtcEJ1ZjIsKnBUZW1wQnVmMzsKLSAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXA7Ci0gICAgT01YX1U4ICBmbGFnOwotICAgIE9NWF9JTlQgeCwgeSwgY291bnQsIHByZWREaXI7Ci0gICAgT01YX0lOVCBwcmVkUVAsIEFDUHJlZEZsYWc7Ci0gICAgCi0KLSAgICAvKiBBbGlnbmluZyB0aGUgbG9jYWwgYnVmZmVycyAqLwotICAgIHBUZW1wQnVmMSA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYxKTsKLSAgICBwVGVtcEJ1ZjIgPSBhcm1BbGlnblRvMTZCeXRlcyh0ZW1wQnVmMik7Ci0gICAgcFRlbXBCdWYzID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1ZjMpOwotCi0gICAgLyogQXJndW1lbnQgZXJyb3IgY2hlY2tzICovCi0gICAgYXJtUmV0QXJnRXJySWYocFNyYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFJlYyA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocERzdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBTcmMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzOEJ5dGVBbGlnbmVkKHBSZWMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYoIWFybUlzMTZCeXRlQWxpZ25lZChwRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKHBQcmVkQnVmUm93ID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZihwUHJlZEJ1ZkNvbCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFByZUFDUHJlZGljdCA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFN1bUVyciA9PSBOVUxMLCBPTVhfU3RzX0JhZEFyZ0Vycik7Ci0gICAgYXJtUmV0QXJnRXJySWYocFFwQnVmID09IE5VTEwsIE9NWF9TdHNfQmFkQXJnRXJyKTsKLSAgICBhcm1SZXRBcmdFcnJJZigoc3JjU3RlcCA8PSAwKSB8fCAoZHN0U3RlcCA8PSAwKSB8fAotICAgICAgICAgICAgICAgIChkc3RTdGVwICYgNykgfHwgKHNyY1N0ZXAgJiA3KQotICAgICAgICAgICAgICAgICwgT01YX1N0c19CYWRBcmdFcnIpOwotICAgIGFybVJldEFyZ0VycklmKChibG9ja0luZGV4IDwgMCkgfHwgKGJsb2NrSW5kZXggPiA5KSwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0gICAgYXJtUmV0QXJnRXJySWYoKGN1clFwIDw9IDApIHx8IChjdXJRcCA+PTMyKSwgT01YX1N0c19CYWRBcmdFcnIpOwotCi0KLSAgIC8qIFNldHRpbmcgdGhlIHZpZGVvQ29tcCAqLwotICAgIGlmIChibG9ja0luZGV4IDw9IDMpCi0gICAgewotICAgICAgICB2aWRlb0NvbXAgPSBPTVhfVkNfTFVNSU5BTkNFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB2aWRlb0NvbXAgPSBPTVhfVkNfQ0hST01JTkFOQ0U7Ci0gICAgfQotICAgIC8qIENvbnZlcnRpbmcgZnJvbSAyLWQgdG8gMS1kIGJ1ZmZlciAqLwotICAgIGZvciAoeSA9IDAsIGNvdW50ID0gMDsgeSA8IDg7IHkrKykKLSAgICB7Ci0gICAgICAgIGZvcih4PSAwOyB4IDwgODsgeCsrLCBjb3VudCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwVGVtcEJ1ZjFbY291bnRdID0gcFNyY1soeSpzcmNTdGVwKSArIHhdOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgb214VkNNNFAyX0RDVDh4OGJsayAgKHBUZW1wQnVmMSwgcFRlbXBCdWYyKTsKLSAgICBvbXhWQ000UDJfUXVhbnRJbnRyYV9JKAotICAgICAgICBwVGVtcEJ1ZjIsCi0gICAgICAgIGN1clFwLAotICAgICAgICBibG9ja0luZGV4LAotICAgICAgICBzaG9ydFZpZGVvSGVhZGVyKTsKLQotICAgIC8qIENvbnZlcnRpbmcgZnJvbSAxLUQgdG8gMi1EIGJ1ZmZlciAqLwotICAgIGZvciAoeSA9IDAsIGNvdW50ID0gMDsgeSA8IDg7IHkrKykKLSAgICB7Ci0gICAgICAgIGZvcih4ID0gMDsgeCA8IDg7IHgrKywgY291bnQrKykKLSAgICAgICAgewotICAgICAgICAgICAgLyogc3RvcmluZyB0ZW1wYnVmMiB0byB0ZW1wYnVmMSAqLwotICAgICAgICAgICAgcFRlbXBCdWYxW2NvdW50XSA9IHBUZW1wQnVmMltjb3VudF07Ci0gICAgICAgICAgICBwRHN0Wyh5KmRzdFN0ZXApICsgeF0gPSBwVGVtcEJ1ZjJbY291bnRdOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQUMgYW5kIERDIHByZWRpY3Rpb24gKi8KLSAgICBhcm1WQ000UDJfU2V0UHJlZERpcigKLSAgICAgICAgYmxvY2tJbmRleCwKLSAgICAgICAgcFByZWRCdWZSb3csCi0gICAgICAgIHBQcmVkQnVmQ29sLAotICAgICAgICAmcHJlZERpciwKLSAgICAgICAgJnByZWRRUCwKLSAgICAgICAgcFFwQnVmKTsKLQotICAgIGFybVJldERhdGFFcnJJZigoKHByZWRRUCA8PSAwKSB8fCAocHJlZFFQID49IDMyKSksIE9NWF9TdHNfQmFkQXJnRXJyKTsKLQotICAgIGZsYWcgPSAxOwotICAgIGlmICgqcFN1bUVyciA8IDApCi0gICAgewotICAgICAgICBBQ1ByZWRGbGFnID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgQUNQcmVkRmxhZyA9IDE7Ci0gICAgfQotCi0gICAgYXJtVkNNNFAyX0FDRENQcmVkaWN0KAotICAgICAgICBwVGVtcEJ1ZjIsCi0gICAgICAgIHBQcmVBQ1ByZWRpY3QsCi0gICAgICAgIHBQcmVkQnVmUm93LAotICAgICAgICBwUHJlZEJ1ZkNvbCwKLSAgICAgICAgY3VyUXAsCi0gICAgICAgIHByZWRRUCwKLSAgICAgICAgcHJlZERpciwKLSAgICAgICAgQUNQcmVkRmxhZywKLSAgICAgICAgdmlkZW9Db21wLAotICAgICAgICBmbGFnLAotICAgICAgICBwU3VtRXJyKTsKLQotICAgIC8qIFJlY29uc3RydWN0aW5nIHRoZSB0ZXh0dXJlIGRhdGEgKi8KLSAgICBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JKAotICAgICAgICBwVGVtcEJ1ZjEsCi0gICAgICAgIGN1clFwLAotICAgICAgICB2aWRlb0NvbXAsCi0gICAgICAgIHNob3J0VmlkZW9IZWFkZXIpOwotICAgIG9teFZDTTRQMl9JRENUOHg4YmxrIChwVGVtcEJ1ZjEsIHBUZW1wQnVmMyk7Ci0gICAgZm9yKGNvdW50ID0gMDsgY291bnQgPCA2NDsgY291bnQrKykKLSAgICB7Ci0gICAgICAgIHBSZWNbY291bnRdID0gYXJtTWF4KDAscFRlbXBCdWYzW2NvdW50XSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL3JlZmVyZW5jZS92Yy9zcmMvYXJtVkNfVmVyc2lvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDkzNjgxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9yZWZlcmVuY2UvdmMvc3JjL2FybVZDX1ZlcnNpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAiYXJtQ09NTV9WZXJzaW9uLmgiCi0KLSNpZmRlZiBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUwotY29uc3QgY2hhciAqIGNvbnN0IG9teFZDX1ZlcnNpb25EZXNjcmlwdGlvbiA9ICJBUk0gT3Blbk1BWCBETCB2IiBBUk1fVkVSU0lPTl9TVFJJTkcgIiAgIFJlbD0iIE9NWF9BUk1fUkVMRUFTRV9UQUcgIiAgIEFyY2g9IiBPTVhfQVJNX0JVSUxEX0FSQ0hJVEVDVFVSRSAiICAgVG9vbHM9IiAgT01YX0FSTV9CVUlMRF9UT09MQ0hBSU4gOwotI2VuZGlmIC8qIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0RlY1Rlc3RCZW5jaC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9EZWNUZXN0QmVuY2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVjMDA2NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0RlY1Rlc3RCZW5jaC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiSDI2NFN3RGVjQXBpLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogQ0hFQ0tfTUVNT1JZX1VTQUdFIHByaW50cyBhbmQgc3VtcyB0aGUgbWVtb3J5IGFsbG9jYXRlZCBpbiBjYWxscyB0bwotICogSDI2NFN3RGVjTWFsbG9jKCkgKi8KLS8qICNkZWZpbmUgQ0hFQ0tfTUVNT1JZX1VTQUdFICovCi0KLS8qIF9OT19PVVQgZGlzYWJsZXMgb3V0cHV0IGZpbGUgd3JpdGluZyAqLwotLyogI2RlZmluZSBfTk9fT1VUICovCi0KLS8qIERlYnVnIHByaW50cyAqLwotI2RlZmluZSBERUJVRyhhcmd2KSBwcmludGYgYXJndgotCi0vKiBDVlMgdGFnIG5hbWUgZm9yIGlkZW50aWZpY2F0aW9uICovCi1jb25zdCBjaGFyIHRhZ05hbWVbMjU2XSA9ICIkTmFtZTogRklSU1RfQU5EUk9JRF9DT1BZUklHSFQgJCI7Ci0KLXZvaWQgV3JpdGVPdXRwdXQoY2hhciAqZmlsZW5hbWUsIHU4ICpkYXRhLCB1MzIgcGljU2l6ZSk7Ci11MzIgTmV4dFBhY2tldCh1OCAqKnBTdHJtKTsKLXUzMiBDcm9wUGljdHVyZSh1OCAqcE91dEltYWdlLCB1OCAqcEluSW1hZ2UsCi0gICAgdTMyIHBpY1dpZHRoLCB1MzIgcGljSGVpZ2h0LCBDcm9wUGFyYW1zICpwQ3JvcFBhcmFtcyk7Ci0KLS8qIEdsb2JhbCB2YXJpYWJsZXMgZm9yIHN0cmVhbSBoYW5kbGluZyAqLwotdTggKnN0cmVhbVN0b3AgPSBOVUxMOwotdTMyIHBhY2tldGl6ZSA9IDA7Ci11MzIgbmFsVW5pdFN0cmVhbSA9IDA7Ci1GSUxFICpmb3V0cHV0ID0gTlVMTDsKLQotI2lmZGVmIFNPQ19ERVNJR05FUgotCi0vLyBJbml0aWFsaXNhdGlvbiBmdW5jdGlvbiBkZWZpbmVkIGluIEluaXRDYWNoZS5zCi1leHRlcm4gdm9pZCBjYWNoZV9pbml0KHZvaWQpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogICRTdWIkJG1haW4KLQotICAgIFB1cnBvc2U6Ci0gICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIEMgbGlicmFyeSBpbml0aWFsaXNhdGlvbiBhbmQKLSAgICAgICAgYmVmb3JlIG1haW4uIEl0cyBwdXJwb3NlIGlzIHRvIGRvIGFueSBmdXJ0aGVyIGluaXRpYWxpc2F0aW9uIGJlZm9yZSB0aGUKLSAgICAgICAgYXBwbGljYXRpb24gc3RhcnQuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgJFN1YiQkbWFpbihjaGFyIGFyZ2MsIGNoYXIgKiBhcmd2W10pCi17Ci0gIGNhY2hlX2luaXQoKTsgICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgc29tZSBleHRyYSBzZXR1cCB3b3JrIHNldHRpbmcgdXAgY2FjaGVzCi0gIHJldHVybiAkU3VwZXIkJG1haW4oYXJnYywgYXJndik7IC8vIGNhbGxzIHRoZSBvcmlnaW5hbCBmdW5jdGlvbgotfQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiAgbWFpbgotCi0gICAgUHVycG9zZToKLSAgICAgICAgbWFpbiBmdW5jdGlvbiBvZiBkZWNvZGVyIHRlc3RiZW5jaC4gUHJvdmlkZXMgY29tbWFuZCBsaW5lIGludGVyZmFjZQotICAgICAgICB3aXRoIGZpbGUgSS9PIGZvciBILjI2NCBkZWNvZGVyLiBQcmludHMgb3V0IHRoZSB1c2FnZSBpbmZvcm1hdGlvbgotICAgICAgICB3aGVuIGV4ZWN1dGVkIHdpdGhvdXQgYXJndW1lbnRzLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0KLSAgICB1MzIgaSwgdG1wOwotICAgIHUzMiBtYXhOdW1QaWNzID0gMDsKLSAgICB1OCAqYnl0ZVN0cm1TdGFydDsKLSAgICB1OCAqaW1hZ2VEYXRhOwotICAgIHU4ICp0bXBJbWFnZSA9IE5VTEw7Ci0gICAgdTMyIHN0cm1MZW47Ci0gICAgdTMyIHBpY1NpemU7Ci0gICAgSDI2NFN3RGVjSW5zdCBkZWNJbnN0OwotICAgIEgyNjRTd0RlY1JldCByZXQ7Ci0gICAgSDI2NFN3RGVjSW5wdXQgZGVjSW5wdXQ7Ci0gICAgSDI2NFN3RGVjT3V0cHV0IGRlY091dHB1dDsKLSAgICBIMjY0U3dEZWNQaWN0dXJlIGRlY1BpY3R1cmU7Ci0gICAgSDI2NFN3RGVjSW5mbyBkZWNJbmZvOwotICAgIEgyNjRTd0RlY0FwaVZlcnNpb24gZGVjVmVyOwotICAgIHUzMiBwaWNEZWNvZGVOdW1iZXI7Ci0gICAgdTMyIHBpY0Rpc3BsYXlOdW1iZXI7Ci0gICAgdTMyIG51bUVycm9ycyA9IDA7Ci0gICAgdTMyIGNyb3BEaXNwbGF5ID0gMDsKLSAgICB1MzIgZGlzYWJsZU91dHB1dFJlb3JkZXJpbmcgPSAwOwotCi0gICAgRklMRSAqZmlucHV0OwotCi0gICAgY2hhciBvdXRGaWxlTmFtZVsyNTZdID0gIiI7Ci0KLSAgICAvKiBQcmludCBBUEkgdmVyc2lvbiBudW1iZXIgKi8KLSAgICBkZWNWZXIgPSBIMjY0U3dEZWNHZXRBUElWZXJzaW9uKCk7Ci0gICAgREVCVUcoKCJILjI2NCBEZWNvZGVyIEFQSSB2JWQuJWRcbiIsIGRlY1Zlci5tYWpvciwgZGVjVmVyLm1pbm9yKSk7Ci0KLSAgICAvKiBQcmludCB0YWcgbmFtZSBpZiAnLVQnIGFyZ3VtZW50IHByZXNlbnQgKi8KLSAgICBpZiAoIGFyZ2MgPiAxICYmIHN0cmNtcChhcmd2WzFdLCAiLVQiKSA9PSAwICkKLSAgICB7Ci0gICAgICAgIERFQlVHKCgiJXNcbiIsIHRhZ05hbWUpKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgdGhhdCBlbm91Z2ggY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBnaXZlbiwgaWYgbm90IC0+IHByaW50IHVzYWdlCi0gICAgICogaW5mb3JtYXRpb24gb3V0ICovCi0gICAgaWYgKGFyZ2MgPCAyKQotICAgIHsKLSAgICAgICAgREVCVUcoKAotICAgICAgICAgICAgIlVzYWdlOiAlcyBbLU5uXSBbLU9vdXRmaWxlXSBbLVBdIFstVV0gWy1DXSBbLVJdIFstVF0gZmlsZS5oMjY0XG4iLAotICAgICAgICAgICAgYXJndlswXSkpOwotICAgICAgICBERUJVRygoIlx0LU5uIGZvcmNlcyBkZWNvZGluZyB0byBzdG9wIGFmdGVyIG4gcGljdHVyZXNcbiIpKTsKLSNpZiBkZWZpbmVkKF9OT19PVVQpCi0gICAgICAgIERFQlVHKCgiXHQtT291dGZpbGUgb3V0cHV0IHdyaXRpbmcgZGlzYWJsZWQgYXQgY29tcGlsZSB0aW1lXG4iKSk7Ci0jZWxzZQotICAgICAgICBERUJVRygoIlx0LU9vdXRmaWxlIHdyaXRlIG91dHB1dCB0byBcIm91dGZpbGVcIiAoZGVmYXVsdCBvdXRfd3h4eGh5eXkueXV2KVxuIikpOwotICAgICAgICBERUJVRygoIlx0LU9ub25lIGRvZXMgbm90IHdyaXRlIG91dHB1dFxuIikpOwotI2VuZGlmCi0gICAgICAgIERFQlVHKCgiXHQtUCBwYWNrZXQtYnktcGFja2V0IG1vZGVcbiIpKTsKLSAgICAgICAgREVCVUcoKCJcdC1VIE5BTCB1bml0IHN0cmVhbSBtb2RlXG4iKSk7Ci0gICAgICAgIERFQlVHKCgiXHQtQyBkaXNwbGF5IGNyb3BwZWQgaW1hZ2UgKGRlZmF1bHQgZGVjb2RlZCBpbWFnZSlcbiIpKTsKLSAgICAgICAgREVCVUcoKCJcdC1SIGRpc2FibGUgRFBCIG91dHB1dCByZW9yZGVyaW5nXG4iKSk7Ci0gICAgICAgIERFQlVHKCgiXHQtVCB0byBwcmludCB0YWcgbmFtZSBhbmQgZXhpdFxuIikpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiByZWFkIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgKi8KLSAgICBmb3IgKGkgPSAxOyBpIDwgKHUzMikoYXJnYy0xKTsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKCBzdHJuY21wKGFyZ3ZbaV0sICItTiIsIDIpID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXhOdW1QaWNzID0gKHUzMilhdG9pKGFyZ3ZbaV0rMik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIHN0cm5jbXAoYXJndltpXSwgIi1PIiwgMikgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmNweShvdXRGaWxlTmFtZSwgYXJndltpXSsyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggc3RyY21wKGFyZ3ZbaV0sICItUCIpID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwYWNrZXRpemUgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBzdHJjbXAoYXJndltpXSwgIi1VIikgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5hbFVuaXRTdHJlYW0gPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBzdHJjbXAoYXJndltpXSwgIi1DIikgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNyb3BEaXNwbGF5ID0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggc3RyY21wKGFyZ3ZbaV0sICItUiIpID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBkaXNhYmxlT3V0cHV0UmVvcmRlcmluZyA9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBvcGVuIGlucHV0IGZpbGUgZm9yIHJlYWRpbmcsIGZpbGUgbmFtZSBnaXZlbiBieSB1c2VyLiBJZiBmaWxlIG9wZW4KLSAgICAgKiBmYWlscyAtPiBleGl0ICovCi0gICAgZmlucHV0ID0gZm9wZW4oYXJndlthcmdjLTFdLCJyYiIpOwotICAgIGlmIChmaW5wdXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIERFQlVHKCgiVU5BQkxFIFRPIE9QRU4gSU5QVVQgRklMRVxuIikpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogY2hlY2sgc2l6ZSBvZiB0aGUgaW5wdXQgZmlsZSAtPiBsZW5ndGggb2YgdGhlIHN0cmVhbSBpbiBieXRlcyAqLwotICAgIGZzZWVrKGZpbnB1dCwwTCxTRUVLX0VORCk7Ci0gICAgc3RybUxlbiA9ICh1MzIpZnRlbGwoZmlucHV0KTsKLSAgICByZXdpbmQoZmlucHV0KTsKLQotICAgIC8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igc3RyZWFtIGJ1ZmZlci4gaWYgdW5zdWNjZXNzZnVsIC0+IGV4aXQgKi8KLSAgICBieXRlU3RybVN0YXJ0ID0gKHU4ICopbWFsbG9jKHNpemVvZih1OCkqc3RybUxlbik7Ci0gICAgaWYgKGJ5dGVTdHJtU3RhcnQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIERFQlVHKCgiVU5BQkxFIFRPIEFMTE9DQVRFIE1FTU9SWVxuIikpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogcmVhZCBpbnB1dCBzdHJlYW0gZnJvbSBmaWxlIHRvIGJ1ZmZlciBhbmQgY2xvc2UgaW5wdXQgZmlsZSAqLwotICAgIGZyZWFkKGJ5dGVTdHJtU3RhcnQsIHNpemVvZih1OCksIHN0cm1MZW4sIGZpbnB1dCk7Ci0gICAgZmNsb3NlKGZpbnB1dCk7Ci0KLSAgICAvKiBpbml0aWFsaXplIGRlY29kZXIuIElmIHVuc3VjY2Vzc2Z1bCAtPiBleGl0ICovCi0gICAgcmV0ID0gSDI2NFN3RGVjSW5pdCgmZGVjSW5zdCwgZGlzYWJsZU91dHB1dFJlb3JkZXJpbmcpOwotICAgIGlmIChyZXQgIT0gSDI2NFNXREVDX09LKQotICAgIHsKLSAgICAgICAgREVCVUcoKCJERUNPREVSIElOSVRJQUxJWkFUSU9OIEZBSUxFRFxuIikpOwotICAgICAgICBmcmVlKGJ5dGVTdHJtU3RhcnQpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogaW5pdGlhbGl6ZSBIMjY0U3dEZWNEZWNvZGUoKSBpbnB1dCBzdHJ1Y3R1cmUgKi8KLSAgICBzdHJlYW1TdG9wID0gYnl0ZVN0cm1TdGFydCArIHN0cm1MZW47Ci0gICAgZGVjSW5wdXQucFN0cmVhbSA9IGJ5dGVTdHJtU3RhcnQ7Ci0gICAgZGVjSW5wdXQuZGF0YUxlbiA9IHN0cm1MZW47Ci0gICAgZGVjSW5wdXQuaW50cmFDb25jZWFsbWVudE1ldGhvZCA9IDA7Ci0KLSAgICAvKiBnZXQgcG9pbnRlciB0byBuZXh0IHBhY2tldCBhbmQgdGhlIHNpemUgb2YgcGFja2V0Ci0gICAgICogKGZvciBwYWNrZXRpemUgb3IgbmFsVW5pdFN0cmVhbSBtb2RlcykgKi8KLSAgICBpZiAoICh0bXAgPSBOZXh0UGFja2V0KCZkZWNJbnB1dC5wU3RyZWFtKSkgIT0gMCApCi0gICAgICAgIGRlY0lucHV0LmRhdGFMZW4gPSB0bXA7Ci0KLSAgICBwaWNEZWNvZGVOdW1iZXIgPSBwaWNEaXNwbGF5TnVtYmVyID0gMTsKLSAgICAvKiBtYWluIGRlY29kaW5nIGxvb3AgKi8KLSAgICBkbwotICAgIHsKLSAgICAgICAgLyogUGljdHVyZSBJRCBpcyB0aGUgcGljdHVyZSBudW1iZXIgaW4gZGVjb2Rpbmcgb3JkZXIgKi8KLSAgICAgICAgZGVjSW5wdXQucGljSWQgPSBwaWNEZWNvZGVOdW1iZXI7Ci0KLSAgICAgICAgLyogY2FsbCBBUEkgZnVuY3Rpb24gdG8gcGVyZm9ybSBkZWNvZGluZyAqLwotICAgICAgICByZXQgPSBIMjY0U3dEZWNEZWNvZGUoZGVjSW5zdCwgJmRlY0lucHV0LCAmZGVjT3V0cHV0KTsKLQotICAgICAgICBzd2l0Y2gocmV0KQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX0hEUlNfUkRZX0JVRkZfTk9UX0VNUFRZOgotICAgICAgICAgICAgICAgIC8qIFN0cmVhbSBoZWFkZXJzIHdlcmUgc3VjY2Vzc2Z1bGx5IGRlY29kZWQKLSAgICAgICAgICAgICAgICAgKiAtPiBzdHJlYW0gaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIGZvciBxdWVyeSBub3cgKi8KLQotICAgICAgICAgICAgICAgIHJldCA9IEgyNjRTd0RlY0dldEluZm8oZGVjSW5zdCwgJmRlY0luZm8pOwotICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gSDI2NFNXREVDX09LKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAgICAgICAgICAgICBERUJVRygoIlByb2ZpbGUgJWRcbiIsIGRlY0luZm8ucHJvZmlsZSkpOwotCi0gICAgICAgICAgICAgICAgREVCVUcoKCJXaWR0aCAlZCBIZWlnaHQgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgIGRlY0luZm8ucGljV2lkdGgsIGRlY0luZm8ucGljSGVpZ2h0KSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY3JvcERpc3BsYXkgJiYgZGVjSW5mby5jcm9wcGluZ0ZsYWcpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBERUJVRygoIkNyb3BwaW5nIHBhcmFtczogKCVkLCAlZCkgJWR4JWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLmNyb3BQYXJhbXMuY3JvcExlZnRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLmNyb3BQYXJhbXMuY3JvcFRvcE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY0luZm8uY3JvcFBhcmFtcy5jcm9wT3V0V2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLmNyb3BQYXJhbXMuY3JvcE91dEhlaWdodCkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIENyb3BwZWQgZnJhbWUgc2l6ZSBpbiBwbGFuYXIgWVVWIDQ6MjowICovCi0gICAgICAgICAgICAgICAgICAgIHBpY1NpemUgPSBkZWNJbmZvLmNyb3BQYXJhbXMuY3JvcE91dFdpZHRoICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY0luZm8uY3JvcFBhcmFtcy5jcm9wT3V0SGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBwaWNTaXplID0gKDMgKiBwaWNTaXplKS8yOwotICAgICAgICAgICAgICAgICAgICB0bXBJbWFnZSA9IG1hbGxvYyhwaWNTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRtcEltYWdlID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIERlY29kZXIgb3V0cHV0IGZyYW1lIHNpemUgaW4gcGxhbmFyIFlVViA0OjI6MCAqLwotICAgICAgICAgICAgICAgICAgICBwaWNTaXplID0gZGVjSW5mby5waWNXaWR0aCAqIGRlY0luZm8ucGljSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBwaWNTaXplID0gKDMgKiBwaWNTaXplKS8yOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIERFQlVHKCgidmlkZW9SYW5nZSAlZCwgbWF0cml4Q29lZmZpY2llbnRzICVkXG4iLAotICAgICAgICAgICAgICAgICAgICBkZWNJbmZvLnZpZGVvUmFuZ2UsIGRlY0luZm8ubWF0cml4Q29lZmZpY2llbnRzKSk7Ci0KLSAgICAgICAgICAgICAgICAvKiB1cGRhdGUgSDI2NFN3RGVjRGVjb2RlKCkgaW5wdXQgc3RydWN0dXJlLCBudW1iZXIgb2YgYnl0ZXMKLSAgICAgICAgICAgICAgICAgKiAiY29uc3VtZWQiIGlzIGNvbXB1dGVkIGFzIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbmV3IHN0cmVhbQotICAgICAgICAgICAgICAgICAqIHBvaW50ZXIgYW5kIG9sZCBzdHJlYW0gcG9pbnRlciAqLwotICAgICAgICAgICAgICAgIGRlY0lucHV0LmRhdGFMZW4gLT0KLSAgICAgICAgICAgICAgICAgICAgKHUzMikoZGVjT3V0cHV0LnBTdHJtQ3VyclBvcyAtIGRlY0lucHV0LnBTdHJlYW0pOwotICAgICAgICAgICAgICAgIGRlY0lucHV0LnBTdHJlYW0gPSBkZWNPdXRwdXQucFN0cm1DdXJyUG9zOwotCi0gICAgICAgICAgICAgICAgLyogSWYgLU8gb3B0aW9uIG5vdCB1c2VkLCBnZW5lcmF0ZSBkZWZhdWx0IGZpbGUgbmFtZSAqLwotICAgICAgICAgICAgICAgIGlmIChvdXRGaWxlTmFtZVswXSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKG91dEZpbGVOYW1lLCAib3V0X3clZGglZC55dXYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY0luZm8ucGljV2lkdGgsIGRlY0luZm8ucGljSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfUElDX1JEWV9CVUZGX05PVF9FTVBUWToKLSAgICAgICAgICAgICAgICAvKiBQaWN0dXJlIGlzIHJlYWR5IGFuZCBtb3JlIGRhdGEgcmVtYWlucyBpbiBpbnB1dCBidWZmZXIKLSAgICAgICAgICAgICAgICAgKiAtPiB1cGRhdGUgSDI2NFN3RGVjRGVjb2RlKCkgaW5wdXQgc3RydWN0dXJlLCBudW1iZXIgb2YgYnl0ZXMKLSAgICAgICAgICAgICAgICAgKiAiY29uc3VtZWQiIGlzIGNvbXB1dGVkIGFzIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbmV3IHN0cmVhbQotICAgICAgICAgICAgICAgICAqIHBvaW50ZXIgYW5kIG9sZCBzdHJlYW0gcG9pbnRlciAqLwotICAgICAgICAgICAgICAgIGRlY0lucHV0LmRhdGFMZW4gLT0KLSAgICAgICAgICAgICAgICAgICAgKHUzMikoZGVjT3V0cHV0LnBTdHJtQ3VyclBvcyAtIGRlY0lucHV0LnBTdHJlYW0pOwotICAgICAgICAgICAgICAgIGRlY0lucHV0LnBTdHJlYW0gPSBkZWNPdXRwdXQucFN0cm1DdXJyUG9zOwotICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotCi0gICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19QSUNfUkRZOgotCi0gICAgICAgICAgICAgICAgLypsaW50IC1lc3ltKDY0NCx0bXBJbWFnZSxwaWNTaXplKSB2YXJpYWJsZSBpbml0aWFsaXplZCBhdAotICAgICAgICAgICAgICAgICAqIEgyNjRTV0RFQ19IRFJTX1JEWV9CVUZGX05PVF9FTVBUWSBjYXNlICovCi0KLSAgICAgICAgICAgICAgICBpZiAocmV0ID09IEgyNjRTV0RFQ19QSUNfUkRZKQotICAgICAgICAgICAgICAgICAgICBkZWNJbnB1dC5kYXRhTGVuID0gTmV4dFBhY2tldCgmZGVjSW5wdXQucFN0cmVhbSk7Ci0KLSAgICAgICAgICAgICAgICAvKiBJZiBlbm91Z2ggcGljdHVyZXMgZGVjb2RlZCAtPiBmb3JjZSBkZWNvZGluZyB0byBlbmQKLSAgICAgICAgICAgICAgICAgKiBieSBzZXR0aW5nIHRoYXQgbm8gbW9yZSBzdHJlYW0gaXMgYXZhaWxhYmxlICovCi0gICAgICAgICAgICAgICAgaWYgKG1heE51bVBpY3MgJiYgcGljRGVjb2RlTnVtYmVyID09IG1heE51bVBpY3MpCi0gICAgICAgICAgICAgICAgICAgIGRlY0lucHV0LmRhdGFMZW4gPSAwOwotCi0gICAgICAgICAgICAgICAgLyogSW5jcmVtZW50IGRlY29kaW5nIG51bWJlciBmb3IgZXZlcnkgZGVjb2RlZCBwaWN0dXJlICovCi0gICAgICAgICAgICAgICAgcGljRGVjb2RlTnVtYmVyKys7Ci0KLSAgICAgICAgICAgICAgICAvKiB1c2UgZnVuY3Rpb24gSDI2NFN3RGVjTmV4dFBpY3R1cmUoKSB0byBvYnRhaW4gbmV4dCBwaWN0dXJlCi0gICAgICAgICAgICAgICAgICogaW4gZGlzcGxheSBvcmRlci4gRnVuY3Rpb24gaXMgY2FsbGVkIHVudGlsIG5vIG1vcmUgaW1hZ2VzCi0gICAgICAgICAgICAgICAgICogYXJlIHJlYWR5IGZvciBkaXNwbGF5ICovCi0gICAgICAgICAgICAgICAgd2hpbGUgKCBIMjY0U3dEZWNOZXh0UGljdHVyZShkZWNJbnN0LCAmZGVjUGljdHVyZSwgMCkgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRTV0RFQ19QSUNfUkRZICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERFQlVHKCgiUElDICVkLCB0eXBlICVzIiwgcGljRGlzcGxheU51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY1BpY3R1cmUuaXNJZHJQaWN0dXJlID8gIklEUiIgOiAiTk9OLUlEUiIpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBpY0Rpc3BsYXlOdW1iZXIgIT0gZGVjUGljdHVyZS5waWNJZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHKCgiLCBkZWNvZGVkIHBpYyAlZCIsIGRlY1BpY3R1cmUucGljSWQpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlY1BpY3R1cmUubmJyT2ZFcnJNQnMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHKCgiLCBjb25jZWFsZWQgJWRcbiIsIGRlY1BpY3R1cmUubmJyT2ZFcnJNQnMpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBERUJVRygoIlxuIikpOwotICAgICAgICAgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKLQotICAgICAgICAgICAgICAgICAgICBudW1FcnJvcnMgKz0gZGVjUGljdHVyZS5uYnJPZkVyck1CczsKLQotICAgICAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgZGlzcGxheSBudW1iZXIgZm9yIGV2ZXJ5IGRpc3BsYXllZCBwaWN0dXJlICovCi0gICAgICAgICAgICAgICAgICAgIHBpY0Rpc3BsYXlOdW1iZXIrKzsKLQotICAgICAgICAgICAgICAgICAgICAvKmxpbnQgLWVzeW0oNjQ0LGRlY0luZm8pIGFsd2F5cyBpbml0aWFsaXplZCBpZiBwaWN0dXJlcwotICAgICAgICAgICAgICAgICAgICAgKiBhdmFpbGFibGUgZm9yIGRpc3BsYXkgKi8KLQotICAgICAgICAgICAgICAgICAgICAvKiBXcml0ZSBvdXRwdXQgcGljdHVyZSB0byBmaWxlICovCi0gICAgICAgICAgICAgICAgICAgIGltYWdlRGF0YSA9ICh1OCopZGVjUGljdHVyZS5wT3V0cHV0UGljdHVyZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNyb3BEaXNwbGF5ICYmIGRlY0luZm8uY3JvcHBpbmdGbGFnKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBDcm9wUGljdHVyZSh0bXBJbWFnZSwgaW1hZ2VEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY0luZm8ucGljV2lkdGgsIGRlY0luZm8ucGljSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWNJbmZvLmNyb3BQYXJhbXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBXcml0ZU91dHB1dChvdXRGaWxlTmFtZSwgdG1wSW1hZ2UsIHBpY1NpemUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVPdXRwdXQob3V0RmlsZU5hbWUsIGltYWdlRGF0YSwgcGljU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfU1RSTV9QUk9DRVNTRUQ6Ci0gICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19TVFJNX0VSUjoKLSAgICAgICAgICAgICAgICAvKiBJbnB1dCBzdHJlYW0gd2FzIGRlY29kZWQgYnV0IG5vIHBpY3R1cmUgaXMgcmVhZHkKLSAgICAgICAgICAgICAgICAgKiAtPiBHZXQgbW9yZSBkYXRhICovCi0gICAgICAgICAgICAgICAgZGVjSW5wdXQuZGF0YUxlbiA9IE5leHRQYWNrZXQoJmRlY0lucHV0LnBTdHJlYW0pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIERFQlVHKCgiRkFUQUwgRVJST1JcbiIpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAgICAgfQotICAgIC8qIGtlZXAgZGVjb2RpbmcgdW50aWwgYWxsIGRhdGEgZnJvbSBpbnB1dCBzdHJlYW0gYnVmZmVyIGNvbnN1bWVkICovCi0gICAgfSB3aGlsZSAoZGVjSW5wdXQuZGF0YUxlbiA+IDApOwotCi0gICAgLyogaWYgb3V0cHV0IGluIGRpc3BsYXkgb3JkZXIgaXMgcHJlZmVycmVkLCB0aGUgZGVjb2RlciBzaGFsbCBiZSBmb3JjZWQKLSAgICAgKiB0byBvdXRwdXQgcGljdHVyZXMgcmVtYWluaW5nIGluIGRlY29kZWQgcGljdHVyZSBidWZmZXIuIFVzZSBmdW5jdGlvbgotICAgICAqIEgyNjRTd0RlY05leHRQaWN0dXJlKCkgdG8gb2J0YWluIG5leHQgcGljdHVyZSBpbiBkaXNwbGF5IG9yZGVyLiBGdW5jdGlvbgotICAgICAqIGlzIGNhbGxlZCB1bnRpbCBubyBtb3JlIGltYWdlcyBhcmUgcmVhZHkgZm9yIGRpc3BsYXkuIFNlY29uZCBwYXJhbWV0ZXIKLSAgICAgKiBmb3IgdGhlIGZ1bmN0aW9uIGlzIHNldCB0byAnMScgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGlzIGVuZCBvZiB0aGUKLSAgICAgKiBzdHJlYW0gYW5kIGFsbCBwaWN0dXJlcyBzaGFsbCBiZSBvdXRwdXQgKi8KLSAgICB3aGlsZSAoSDI2NFN3RGVjTmV4dFBpY3R1cmUoZGVjSW5zdCwgJmRlY1BpY3R1cmUsIDEpID09IEgyNjRTV0RFQ19QSUNfUkRZKQotICAgIHsKLSAgICAgICAgREVCVUcoKCJQSUMgJWQsIHR5cGUgJXMiLCBwaWNEaXNwbGF5TnVtYmVyLAotICAgICAgICAgICAgZGVjUGljdHVyZS5pc0lkclBpY3R1cmUgPyAiSURSIiA6ICJOT04tSURSIikpOwotICAgICAgICBpZiAocGljRGlzcGxheU51bWJlciAhPSBkZWNQaWN0dXJlLnBpY0lkKQotICAgICAgICAgICAgREVCVUcoKCIsIGRlY29kZWQgcGljICVkIiwgZGVjUGljdHVyZS5waWNJZCkpOwotICAgICAgICBpZiAoZGVjUGljdHVyZS5uYnJPZkVyck1CcykKLSAgICAgICAgewotICAgICAgICAgICAgREVCVUcoKCIsIGNvbmNlYWxlZCAlZFxuIiwgZGVjUGljdHVyZS5uYnJPZkVyck1CcykpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIERFQlVHKCgiXG4iKSk7Ci0gICAgICAgIGZmbHVzaChzdGRvdXQpOwotCi0gICAgICAgIG51bUVycm9ycyArPSBkZWNQaWN0dXJlLm5ick9mRXJyTUJzOwotCi0gICAgICAgIC8qIEluY3JlbWVudCBkaXNwbGF5IG51bWJlciBmb3IgZXZlcnkgZGlzcGxheWVkIHBpY3R1cmUgKi8KLSAgICAgICAgcGljRGlzcGxheU51bWJlcisrOwotCi0gICAgICAgIC8qIFdyaXRlIG91dHB1dCBwaWN0dXJlIHRvIGZpbGUgKi8KLSAgICAgICAgaW1hZ2VEYXRhID0gKHU4KilkZWNQaWN0dXJlLnBPdXRwdXRQaWN0dXJlOwotICAgICAgICBpZiAoY3JvcERpc3BsYXkgJiYgZGVjSW5mby5jcm9wcGluZ0ZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IENyb3BQaWN0dXJlKHRtcEltYWdlLCBpbWFnZURhdGEsCi0gICAgICAgICAgICAgICAgZGVjSW5mby5waWNXaWR0aCwgZGVjSW5mby5waWNIZWlnaHQsCi0gICAgICAgICAgICAgICAgJmRlY0luZm8uY3JvcFBhcmFtcyk7Ci0gICAgICAgICAgICBpZiAodG1wKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIFdyaXRlT3V0cHV0KG91dEZpbGVOYW1lLCB0bXBJbWFnZSwgcGljU2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBXcml0ZU91dHB1dChvdXRGaWxlTmFtZSwgaW1hZ2VEYXRhLCBwaWNTaXplKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIHJlbGVhc2UgZGVjb2RlciBpbnN0YW5jZSAqLwotICAgIEgyNjRTd0RlY1JlbGVhc2UoZGVjSW5zdCk7Ci0KLSAgICBpZiAoZm91dHB1dCkKLSAgICAgICAgZmNsb3NlKGZvdXRwdXQpOwotCi0gICAgLyogZnJlZSBhbGxvY2F0ZWQgYnVmZmVycyAqLwotICAgIGZyZWUoYnl0ZVN0cm1TdGFydCk7Ci0gICAgZnJlZSh0bXBJbWFnZSk7Ci0KLSAgICBERUJVRygoIk91dHB1dCBmaWxlOiAlc1xuIiwgb3V0RmlsZU5hbWUpKTsKLQotICAgIERFQlVHKCgiREVDT0RJTkcgRE9ORVxuIikpOwotICAgIGlmIChudW1FcnJvcnMgfHwgcGljRGVjb2RlTnVtYmVyID09IDEpCi0gICAgewotICAgICAgICBERUJVRygoIkVSUk9SUyBGT1VORFxuIikpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6ICBXcml0ZU91dHB1dAotCi0gICAgUHVycG9zZToKLSAgICAgICAgV3JpdGUgcGljdHVyZSBwb2ludGVkIGJ5IGRhdGEgdG8gZmlsZS4gU2l6ZSBvZiB0aGUKLSAgICAgICAgcGljdHVyZSBpbiBwaXhlbHMgaXMgaW5kaWNhdGVkIGJ5IHBpY1NpemUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIFdyaXRlT3V0cHV0KGNoYXIgKmZpbGVuYW1lLCB1OCAqZGF0YSwgdTMyIHBpY1NpemUpCi17Ci0KLSAgICAvKiBmb3V0cHV0IGlzIGdsb2JhbCBmaWxlIHBvaW50ZXIgKi8KLSAgICBpZiAoZm91dHB1dCA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgLyogb3BlbiBvdXRwdXQgZmlsZSBmb3Igd3JpdGluZywgY2FuIGJlIGRpc2FibGVkIHdpdGggZGVmaW5lLgotICAgICAgICAgKiBJZiBmaWxlIG9wZW4gZmFpbHMgLT4gZXhpdCAqLwotICAgICAgICBpZiAoc3RyY21wKGZpbGVuYW1lLCAibm9uZSIpICE9IDApCi0gICAgICAgIHsKLSNpZiAhZGVmaW5lZChfTk9fT1VUKQotICAgICAgICAgICAgZm91dHB1dCA9IGZvcGVuKGZpbGVuYW1lLCAid2IiKTsKLSAgICAgICAgICAgIGlmIChmb3V0cHV0ID09IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREVCVUcoKCJVTkFCTEUgVE8gT1BFTiBPVVRQVVQgRklMRVxuIikpOwotICAgICAgICAgICAgICAgIGV4aXQoMTAwKTsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGZvdXRwdXQgJiYgZGF0YSkKLSAgICAgICAgZndyaXRlKGRhdGEsIDEsIHBpY1NpemUsIGZvdXRwdXQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogTmV4dFBhY2tldAotCi0gICAgUHVycG9zZToKLSAgICAgICAgR2V0IHRoZSBwb2ludGVyIHRvIHN0YXJ0IG9mIG5leHQgcGFja2V0IGluIGlucHV0IHN0cmVhbS4gVXNlcwotICAgICAgICBnbG9iYWwgdmFyaWFibGVzICdwYWNrZXRpemUnIGFuZCAnbmFsVW5pdFN0cmVhbScgdG8gZGV0ZXJtaW5lIHRoZQotICAgICAgICBkZWNvZGVyIGlucHV0IHN0cmVhbSBtb2RlIGFuZCAnc3RyZWFtU3RvcCcgdG8gZGV0ZXJtaW5lIHRoZSBlbmQKLSAgICAgICAgb2Ygc3RyZWFtLiBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgc3RyZWFtIG1vZGVzOgotICAgICAgICAgICAgZGVmYXVsdCAtIHRoZSB3aG9sZSBzdHJlYW0gYXQgb25jZQotICAgICAgICAgICAgcGFja2V0aXplIC0gYSBzaW5nbGUgTkFMLXVuaXQgd2l0aCBzdGFydCBjb2RlIHByZWZpeAotICAgICAgICAgICAgbmFsVW5pdFN0cmVhbSAtIGEgc2luZ2xlIE5BTC11bml0IHdpdGhvdXQgc3RhcnQgY29kZSBwcmVmaXgKLQotICAgICAgICBwU3RybSBzdG9yZXMgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgcHJldmlvdXMgZGVjb2RlciBpbnB1dCBhbmQgaXMKLSAgICAgICAgcmVwbGFjZWQgd2l0aCBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBkZWNvZGVyIGlucHV0LgotCi0gICAgICAgIFJldHVybnMgdGhlIHBhY2tldCBzaXplIGluIGJ5dGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgTmV4dFBhY2tldCh1OCAqKnBTdHJtKQotewotCi0gICAgdTMyIGluZGV4OwotICAgIHUzMiBtYXhJbmRleDsKLSAgICB1MzIgemVyb0NvdW50OwotICAgIHU4ICpzdHJlYW07Ci0gICAgdTggYnl0ZTsKLSAgICBzdGF0aWMgdTMyIHByZXZJbmRleD0wOwotCi0gICAgLyogRm9yIGRlZmF1bHQgc3RyZWFtIG1vZGUgYWxsIHRoZSBzdHJlYW0gaXMgaW4gZmlyc3QgcGFja2V0ICovCi0gICAgaWYgKCFwYWNrZXRpemUgJiYgIW5hbFVuaXRTdHJlYW0pCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgaW5kZXggPSAwOwotICAgIHN0cmVhbSA9ICpwU3RybSArIHByZXZJbmRleDsKLSAgICBtYXhJbmRleCA9ICh1MzIpKHN0cmVhbVN0b3AgLSBzdHJlYW0pOwotCi0gICAgaWYgKG1heEluZGV4ID09IDApCi0gICAgICAgIHJldHVybigwKTsKLQotICAgIC8qIGxlYWRpbmcgemVyb3Mgb2YgZmlyc3QgTkFMIHVuaXQgKi8KLSAgICBkbwotICAgIHsKLSAgICAgICAgYnl0ZSA9IHN0cmVhbVtpbmRleCsrXTsKLSAgICB9IHdoaWxlIChieXRlICE9IDEgJiYgaW5kZXggPCBtYXhJbmRleCk7Ci0KLSAgICAvKiBpbnZhbGlkIHN0YXJ0IGNvZGUgcHJlZml4ICovCi0gICAgaWYgKGluZGV4ID09IG1heEluZGV4IHx8IGluZGV4IDwgMykKLSAgICB7Ci0gICAgICAgIERFQlVHKCgiSU5WQUxJRCBCWVRFIFNUUkVBTVxuIikpOwotICAgICAgICBleGl0KDEwMCk7Ci0gICAgfQotCi0gICAgLyogbmFsVW5pdFN0cmVhbSBpcyB3aXRob3V0IHN0YXJ0IGNvZGUgcHJlZml4ICovCi0gICAgaWYgKG5hbFVuaXRTdHJlYW0pCi0gICAgewotICAgICAgICBzdHJlYW0gKz0gaW5kZXg7Ci0gICAgICAgIG1heEluZGV4IC09IGluZGV4OwotICAgICAgICBpbmRleCA9IDA7Ci0gICAgfQotCi0gICAgemVyb0NvdW50ID0gMDsKLQotICAgIC8qIFNlYXJjaCBzdHJlYW0gZm9yIG5leHQgc3RhcnQgY29kZSBwcmVmaXggKi8KLSAgICAvKmxpbnQgLWUoNzE2KSB3aGlsZSgxKSB1c2VkIGNvbnNjaW91c2x5ICovCi0gICAgd2hpbGUgKDEpCi0gICAgewotICAgICAgICBieXRlID0gc3RyZWFtW2luZGV4KytdOwotICAgICAgICBpZiAoIWJ5dGUpCi0gICAgICAgICAgICB6ZXJvQ291bnQrKzsKLQotICAgICAgICBpZiAoIChieXRlID09IDB4MDEpICYmICh6ZXJvQ291bnQgPj0gMikgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBTdGFydCBjb2RlIHByZWZpeCBoYXMgdHdvIHplcm9zCi0gICAgICAgICAgICAgKiBUaGlyZCB6ZXJvIGlzIGFzc3VtZWQgdG8gYmUgbGVhZGluZyB6ZXJvIG9mIG5leHQgcGFja2V0Ci0gICAgICAgICAgICAgKiBGb3VydGggYW5kIG1vcmUgemVyb3MgYXJlIGFzc3VtZWQgdG8gYmUgdHJhaWxpbmcgemVyb3Mgb2YgdGhpcwotICAgICAgICAgICAgICogcGFja2V0ICovCi0gICAgICAgICAgICBpZiAoemVyb0NvdW50ID4gMykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbmRleCAtPSA0OwotICAgICAgICAgICAgICAgIHplcm9Db3VudCAtPSAzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGluZGV4IC09IHplcm9Db3VudCsxOwotICAgICAgICAgICAgICAgIHplcm9Db3VudCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChieXRlKQotICAgICAgICAgICAgemVyb0NvdW50ID0gMDsKLQotICAgICAgICBpZiAoaW5kZXggPT0gbWF4SW5kZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKiBTdG9yZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhY2tldCAqLwotICAgICpwU3RybSA9IHN0cmVhbTsKLSAgICBwcmV2SW5kZXggPSBpbmRleDsKLQotICAgIC8qIG5hbFVuaXRTdHJlYW0gaXMgd2l0aG91dCB0cmFpbGluZyB6ZXJvcyAqLwotICAgIGlmIChuYWxVbml0U3RyZWFtKQotICAgICAgICBpbmRleCAtPSB6ZXJvQ291bnQ7Ci0KLSAgICByZXR1cm4oaW5kZXgpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiBDcm9wUGljdHVyZQotCi0gICAgUHVycG9zZToKLSAgICAgICAgUGVyZm9ybSBjcm9wcGluZyBmb3IgcGljdHVyZS4gSW5wdXQgcGljdHVyZSBwSW5JbWFnZSB3aXRoIGRpbWVuc2lvbnMKLSAgICAgICAgcGljV2lkdGggeCBwaWNIZWlnaHQgaXMgY3JvcHBlZCB3aXRoIHBDcm9wUGFyYW1zIGFuZCB0aGUgcmVzdWx0aW5nCi0gICAgICAgIHBpY3R1cmUgaXMgc3RvcmVkIGluIHBPdXRJbWFnZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXUzMiBDcm9wUGljdHVyZSh1OCAqcE91dEltYWdlLCB1OCAqcEluSW1hZ2UsCi0gICAgdTMyIHBpY1dpZHRoLCB1MzIgcGljSGVpZ2h0LCBDcm9wUGFyYW1zICpwQ3JvcFBhcmFtcykKLXsKLQotICAgIHUzMiBpLCBqOwotICAgIHUzMiBvdXRXaWR0aCwgb3V0SGVpZ2h0OwotICAgIHU4ICpwT3V0LCAqcEluOwotCi0gICAgaWYgKHBPdXRJbWFnZSA9PSBOVUxMIHx8IHBJbkltYWdlID09IE5VTEwgfHwgcENyb3BQYXJhbXMgPT0gTlVMTCB8fAotICAgICAgICAhcGljV2lkdGggfHwgIXBpY0hlaWdodCkKLSAgICB7Ci0gICAgICAgIC8qIGp1c3QgdG8gcHJldmVudCBsaW50IHdhcm5pbmcsIHJldHVybmluZyBub24temVybyB3aWxsIHJlc3VsdCBpbgotICAgICAgICAgKiByZXR1cm4gd2l0aG91dCBmcmVlaW5nIHRoZSBtZW1vcnkgKi8KLSAgICAgICAgZnJlZShwT3V0SW1hZ2UpOwotICAgICAgICByZXR1cm4oMSk7Ci0gICAgfQotCi0gICAgaWYgKCAoKHBDcm9wUGFyYW1zLT5jcm9wTGVmdE9mZnNldCArIHBDcm9wUGFyYW1zLT5jcm9wT3V0V2lkdGgpID4KLSAgICAgICAgICAgcGljV2lkdGggKSB8fAotICAgICAgICAgKChwQ3JvcFBhcmFtcy0+Y3JvcFRvcE9mZnNldCArIHBDcm9wUGFyYW1zLT5jcm9wT3V0SGVpZ2h0KSA+Ci0gICAgICAgICAgIHBpY0hlaWdodCApICkKLSAgICB7Ci0gICAgICAgIC8qIGp1c3QgdG8gcHJldmVudCBsaW50IHdhcm5pbmcsIHJldHVybmluZyBub24temVybyB3aWxsIHJlc3VsdCBpbgotICAgICAgICAgKiByZXR1cm4gd2l0aG91dCBmcmVlaW5nIHRoZSBtZW1vcnkgKi8KLSAgICAgICAgZnJlZShwT3V0SW1hZ2UpOwotICAgICAgICByZXR1cm4oMSk7Ci0gICAgfQotCi0gICAgb3V0V2lkdGggPSBwQ3JvcFBhcmFtcy0+Y3JvcE91dFdpZHRoOwotICAgIG91dEhlaWdodCA9IHBDcm9wUGFyYW1zLT5jcm9wT3V0SGVpZ2h0OwotCi0gICAgLyogQ2FsY3VsYXRlIHN0YXJ0aW5nIHBvaW50ZXIgZm9yIGx1bWEgKi8KLSAgICBwSW4gPSBwSW5JbWFnZSArIHBDcm9wUGFyYW1zLT5jcm9wVG9wT2Zmc2V0KnBpY1dpZHRoICsKLSAgICAgICAgcENyb3BQYXJhbXMtPmNyb3BMZWZ0T2Zmc2V0OwotICAgIHBPdXQgPSBwT3V0SW1hZ2U7Ci0KLSAgICAvKiBDb3B5IGx1bWEgcGl4ZWwgdmFsdWVzICovCi0gICAgZm9yIChpID0gb3V0SGVpZ2h0OyBpOyBpLS0pCi0gICAgewotICAgICAgICBmb3IgKGogPSBvdXRXaWR0aDsgajsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcE91dCsrID0gKnBJbisrOwotICAgICAgICB9Ci0gICAgICAgIHBJbiArPSBwaWNXaWR0aCAtIG91dFdpZHRoOwotICAgIH0KLQotICAgIG91dFdpZHRoID4+PSAxOwotICAgIG91dEhlaWdodCA+Pj0gMTsKLQotICAgIC8qIENhbGN1bGF0ZSBzdGFydGluZyBwb2ludGVyIGZvciBjYiAqLwotICAgIHBJbiA9IHBJbkltYWdlICsgcGljV2lkdGgqcGljSGVpZ2h0ICsKLSAgICAgICAgcENyb3BQYXJhbXMtPmNyb3BUb3BPZmZzZXQqcGljV2lkdGgvNCArIHBDcm9wUGFyYW1zLT5jcm9wTGVmdE9mZnNldC8yOwotCi0gICAgLyogQ29weSBjYiBwaXhlbCB2YWx1ZXMgKi8KLSAgICBmb3IgKGkgPSBvdXRIZWlnaHQ7IGk7IGktLSkKLSAgICB7Ci0gICAgICAgIGZvciAoaiA9IG91dFdpZHRoOyBqOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwT3V0KysgPSAqcEluKys7Ci0gICAgICAgIH0KLSAgICAgICAgcEluICs9IHBpY1dpZHRoLzIgLSBvdXRXaWR0aDsKLSAgICB9Ci0KLSAgICAvKiBDYWxjdWxhdGUgc3RhcnRpbmcgcG9pbnRlciBmb3IgY3IgKi8KLSAgICBwSW4gPSBwSW5JbWFnZSArIDUqcGljV2lkdGgqcGljSGVpZ2h0LzQgKwotICAgICAgICBwQ3JvcFBhcmFtcy0+Y3JvcFRvcE9mZnNldCpwaWNXaWR0aC80ICsgcENyb3BQYXJhbXMtPmNyb3BMZWZ0T2Zmc2V0LzI7Ci0KLSAgICAvKiBDb3B5IGNyIHBpeGVsIHZhbHVlcyAqLwotICAgIGZvciAoaSA9IG91dEhlaWdodDsgaTsgaS0tKQotICAgIHsKLSAgICAgICAgZm9yIChqID0gb3V0V2lkdGg7IGo7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgKnBPdXQrKyA9ICpwSW4rKzsKLSAgICAgICAgfQotICAgICAgICBwSW4gKz0gcGljV2lkdGgvMiAtIG91dFdpZHRoOwotICAgIH0KLQotICAgIHJldHVybiAoMCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjVHJhY2UKLQotICAgIFB1cnBvc2U6Ci0gICAgICAgIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgSDI2NFN3RGVjVHJhY2UgZnVuY3Rpb24uIFByb3RvdHlwZSBvZiB0aGlzCi0gICAgICAgIGZ1bmN0aW9uIGlzIGdpdmVuIGluIEgyNjRTd0RlY0FwaS5oLiBUaGlzIGltcGxlbWVudGF0aW9uIGFwcGVuZHMKLSAgICAgICAgdHJhY2UgbWVzc2FnZXMgdG8gZmlsZSBuYW1lZCAnZGVjX2FwaS50cmMnLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBIMjY0U3dEZWNUcmFjZShjaGFyICpzdHJpbmcpCi17Ci0gICAgRklMRSAqZnA7Ci0KLSAgICBmcCA9IGZvcGVuKCJkZWNfYXBpLnRyYyIsICJhdCIpOwotCi0gICAgaWYgKCFmcCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZndyaXRlKHN0cmluZywgMSwgc3RybGVuKHN0cmluZyksIGZwKTsKLSAgICBmd3JpdGUoIlxuIiwgMSwxLCBmcCk7Ci0KLSAgICBmY2xvc2UoZnApOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY01hbGxvYwotCi0gICAgUHVycG9zZToKLSAgICAgICAgRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBIMjY0U3dEZWNNYWxsb2MgZnVuY3Rpb24uIFByb3RvdHlwZSBvZiB0aGlzCi0gICAgICAgIGZ1bmN0aW9uIGlzIGdpdmVuIGluIEgyNjRTd0RlY0FwaS5oLiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMKLSAgICAgICAgbGlicmFyeSBmdW5jdGlvbiBtYWxsb2MgZm9yIGFsbG9jYXRpb24gb2YgbWVtb3J5LgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCogSDI2NFN3RGVjTWFsbG9jKHUzMiBzaXplLCB1MzIgbnVtKQotewotICAgIGlmIChzaXplID4gVUlOVDMyX01BWCAvIG51bSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKENIRUNLX01FTU9SWV9VU0FHRSkKLSAgICAvKiBOb3RlIHRoYXQgaWYgdGhlIGRlY29kZXIgaGFzIHRvIGZyZWUgYW5kIHJlYWxsb2NhdGUgc29tZSBvZiB0aGUgYnVmZmVycwotICAgICAqIHRoZSB0b3RhbCB2YWx1ZSB3aWxsIGJlIGludmFsaWQgKi8KLSAgICBzdGF0aWMgdTMyIG51bUJ5dGVzID0gMDsKLSAgICBudW1CeXRlcyArPSBzaXplICogbnVtOwotICAgIERFQlVHKCgiQWxsb2NhdGVkICVkIGJ5dGVzLCB0b3RhbCAlZFxuIiwgc2l6ZSwgbnVtQnl0ZXMpKTsKLSNlbmRpZgotCi0gICAgcmV0dXJuIG1hbGxvYyhzaXplICogbnVtKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNGcmVlCi0KLSAgICBQdXJwb3NlOgotICAgICAgICBFeGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIEgyNjRTd0RlY0ZyZWUgZnVuY3Rpb24uIFByb3RvdHlwZSBvZiB0aGlzCi0gICAgICAgIGZ1bmN0aW9uIGlzIGdpdmVuIGluIEgyNjRTd0RlY0FwaS5oLiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMKLSAgICAgICAgbGlicmFyeSBmdW5jdGlvbiBmcmVlIGZvciBmcmVlaW5nIG9mIG1lbW9yeS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgSDI2NFN3RGVjRnJlZSh2b2lkICpwdHIpCi17Ci0gICAgZnJlZShwdHIpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY01lbWNweQotCi0gICAgUHVycG9zZToKLSAgICAgICAgRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBIMjY0U3dEZWNNZW1jcHkgZnVuY3Rpb24uIFByb3RvdHlwZSBvZiB0aGlzCi0gICAgICAgIGZ1bmN0aW9uIGlzIGdpdmVuIGluIEgyNjRTd0RlY0FwaS5oLiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMKLSAgICAgICAgbGlicmFyeSBmdW5jdGlvbiBtZW1jcHkgdG8gY29weSBzcmMgdG8gZGVzdC4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgSDI2NFN3RGVjTWVtY3B5KHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgdTMyIGNvdW50KQotewotICAgIG1lbWNweShkZXN0LCBzcmMsIGNvdW50KTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNNZW1zZXQKLQotICAgIFB1cnBvc2U6Ci0gICAgICAgIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgSDI2NFN3RGVjTWVtc2V0IGZ1bmN0aW9uLiBQcm90b3R5cGUgb2YgdGhpcwotICAgICAgICBmdW5jdGlvbiBpcyBnaXZlbiBpbiBIMjY0U3dEZWNBcGkuaC4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzCi0gICAgICAgIGxpYnJhcnkgZnVuY3Rpb24gbWVtc2V0IHRvIHNldCBjb250ZW50IG9mIG1lbW9yeSBhcmVhIHBvaW50ZWQgYnkgcHRyLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBIMjY0U3dEZWNNZW1zZXQodm9pZCAqcHRyLCBpMzIgdmFsdWUsIHUzMiBjb3VudCkKLXsKLSAgICBtZW1zZXQocHRyLCB2YWx1ZSwgY291bnQpOwotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0V2YWx1YXRpb25UZXN0QmVuY2guYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvRXZhbHVhdGlvblRlc3RCZW5jaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzU2YTFmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvRXZhbHVhdGlvblRlc3RCZW5jaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiSDI2NFN3RGVjQXBpLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotdm9pZCBXcml0ZU91dHB1dChGSUxFICpmaWQsIHU4ICpkYXRhLCB1MzIgcGljU2l6ZSk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiAgbWFpbgotCi0gICAgUHVycG9zZToKLSAgICAgICAgbWFpbiBmdW5jdGlvbi4gQXNzdW1pbmcgdGhhdCBleGVjdXRhYmxlIGlzIG5hbWVkICdkZWNvZGVyJyB0aGUgdXNhZ2UKLSAgICAgICAgaXMgYXMgZm9sbG93cwotCi0gICAgICAgICAgICBkZWNvZGVyIGlucHV0RmlsZU5hbWUKLQotICAgICAgICAsIHdoZXJlIGlucHV0RmlsZU5hbWUgc2hhbGwgYmUgbmFtZSBvZiBmaWxlIGNvbnRhaW5pbmcgaDI2NCBzdHJlYW0KLSAgICAgICAgZGF0YS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLQotICAgIHU4ICpieXRlU3RybVN0YXJ0OwotICAgIHU4ICpieXRlU3RybTsKLSAgICB1MzIgc3RybUxlbjsKLSAgICB1MzIgcGljU2l6ZTsKLSAgICBIMjY0U3dEZWNJbnN0IGRlY0luc3Q7Ci0gICAgSDI2NFN3RGVjUmV0IHJldDsKLSAgICBIMjY0U3dEZWNJbnB1dCBkZWNJbnB1dDsKLSAgICBIMjY0U3dEZWNPdXRwdXQgZGVjT3V0cHV0OwotICAgIEgyNjRTd0RlY1BpY3R1cmUgZGVjUGljdHVyZTsKLSAgICBIMjY0U3dEZWNJbmZvIGRlY0luZm87Ci0gICAgdTMyIHBpY051bWJlcjsKLQotICAgIEZJTEUgKmZpbnB1dDsKLSAgICBGSUxFICpmb3V0cHV0OwotCi0gICAgLyogQ2hlY2sgdGhhdCBlbm91Z2ggY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBnaXZlbiwgaWYgbm90IC0+IHByaW50IHVzYWdlCi0gICAgICogaW5mb3JtYXRpb24gb3V0ICovCi0gICAgaWYgKGFyZ2MgPCAyKQotICAgIHsKLSAgICAgICAgcHJpbnRmKCAiVXNhZ2U6ICVzIGZpbGUuaDI2NFxuIiwgYXJndlswXSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBvcGVuIG91dHB1dCBmaWxlIGZvciB3cml0aW5nLCBvdXRwdXQgZmlsZSBuYW1lZCBvdXQueXV2LiBJZiBmaWxlIG9wZW4KLSAgICAgKiBmYWlscyAtPiBleGl0ICovCi0gICAgZm91dHB1dCA9IGZvcGVuKCJvdXQueXV2IiwgIndiIik7Ci0gICAgaWYgKGZvdXRwdXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHByaW50ZigiVU5BQkxFIFRPIE9QRU4gT1VUUFVUIEZJTEVcbiIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogb3BlbiBpbnB1dCBmaWxlIGZvciByZWFkaW5nLCBmaWxlIG5hbWUgZ2l2ZW4gYnkgdXNlci4gSWYgZmlsZSBvcGVuCi0gICAgICogZmFpbHMgLT4gZXhpdCAqLwotICAgIGZpbnB1dCA9IGZvcGVuKGFyZ3ZbYXJnYy0xXSwgInJiIik7Ci0gICAgaWYgKGZpbnB1dCA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgcHJpbnRmKCJVTkFCTEUgVE8gT1BFTiBJTlBVVCBGSUxFXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIGNoZWNrIHNpemUgb2YgdGhlIGlucHV0IGZpbGUgLT4gbGVuZ3RoIG9mIHRoZSBzdHJlYW0gaW4gYnl0ZXMgKi8KLSAgICBmc2VlayhmaW5wdXQsIDBMLCBTRUVLX0VORCk7Ci0gICAgc3RybUxlbiA9ICh1MzIpZnRlbGwoZmlucHV0KTsKLSAgICByZXdpbmQoZmlucHV0KTsKLQotICAgIC8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igc3RyZWFtIGJ1ZmZlciwgZXhpdCBpZiB1bnN1Y2Nlc3NmdWwgKi8KLSAgICBieXRlU3RybSA9IGJ5dGVTdHJtU3RhcnQgPSAodTggKilIMjY0U3dEZWNNYWxsb2Moc2l6ZW9mKHU4KSwgc3RybUxlbik7Ci0gICAgaWYgKGJ5dGVTdHJtID09IE5VTEwpCi0gICAgewotICAgICAgICBwcmludGYoIlVOQUJMRSBUTyBBTExPQ0FURSBNRU1PUllcbiIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogcmVhZCBpbnB1dCBzdHJlYW0gZnJvbSBmaWxlIHRvIGJ1ZmZlciBhbmQgY2xvc2UgaW5wdXQgZmlsZSAqLwotICAgIGZyZWFkKGJ5dGVTdHJtLCBzaXplb2YodTgpLCBzdHJtTGVuLCBmaW5wdXQpOwotICAgIGZjbG9zZShmaW5wdXQpOwotCi0gICAgLyogaW5pdGlhbGl6ZSBkZWNvZGVyLiBJZiB1bnN1Y2Nlc3NmdWwgLT4gZXhpdCAqLwotICAgIHJldCA9IEgyNjRTd0RlY0luaXQoJmRlY0luc3QsIDApOwotICAgIGlmIChyZXQgIT0gSDI2NFNXREVDX09LKQotICAgIHsKLSAgICAgICAgcHJpbnRmKCJERUNPREVSIElOSVRJQUxJWkFUSU9OIEZBSUxFRFxuIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBpbml0aWFsaXplIEgyNjRTd0RlY0RlY29kZSgpIGlucHV0IHN0cnVjdHVyZSAqLwotICAgIGRlY0lucHV0LnBTdHJlYW0gPSBieXRlU3RybVN0YXJ0OwotICAgIGRlY0lucHV0LmRhdGFMZW4gPSBzdHJtTGVuOwotICAgIGRlY0lucHV0LmludHJhQ29uY2VhbG1lbnRNZXRob2QgPSAwOwotCi0gICAgcGljTnVtYmVyID0gMDsKLQotICAgIC8qIEZvciBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudHMsIHJlYWQgdGhlIHN0YXJ0IHRpbWUgKGluIHNlY29uZHMpIGhlcmUuCi0gICAgICogVGhlIGRlY29kaW5nIHRpbWUgc2hvdWxkIGJlIG1lYXN1cmVkIG92ZXIgc2V2ZXJhbCBmcmFtZXMgYW5kIGFmdGVyCi0gICAgICogdGhhdCBhdmVyYWdlIGZwcyAoZnJhbWVzL3NlY29uZCkgY2FuIGJlIGNhbGN1bGF0ZWQuCi0gICAgICoKLSAgICAgKiBzdGFydFRpbWUgPSBHZXRUaW1lKCk7Ci0gICAgICoKLSAgICAgKiBUbyBwcmV2ZW50IGNhbGN1bGF0aW5nIGZpbGUgSS9PIGxhdGVuc2llcyBhcyBhIGRlY29kaW5nIHRpbWUsCi0gICAgICogY29tbWVudCBvdXQgV3JpdGVPdXRwdXQgZnVuY3Rpb24gY2FsbC4gQWxzbyBwcmludHMgdG8gc3Rkb3V0IG1pZ2h0Ci0gICAgICogY29uc3VtZSBjb25zaWRlcmFibGUgYW1vdW50IG9mIGN5Y2xlcyBkdXJpbmcgbWVhc3VyZW1lbnQgKi8KLQotICAgIC8qIG1haW4gZGVjb2RpbmcgbG9vcCAqLwotICAgIGRvCi0gICAgewotICAgICAgICAvKiBjYWxsIEFQSSBmdW5jdGlvbiB0byBwZXJmb3JtIGRlY29kaW5nICovCi0gICAgICAgIHJldCA9IEgyNjRTd0RlY0RlY29kZShkZWNJbnN0LCAmZGVjSW5wdXQsICZkZWNPdXRwdXQpOwotCi0gICAgICAgIHN3aXRjaChyZXQpCi0gICAgICAgIHsKLQotICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfSERSU19SRFlfQlVGRl9OT1RfRU1QVFk6Ci0KLSAgICAgICAgICAgICAgICAvKiBwaWN0dXJlIGRpbWVuc2lvbnMgYXJlIGF2YWlsYWJsZSBmb3IgcXVlcnkgbm93ICovCi0gICAgICAgICAgICAgICAgcmV0ID0gSDI2NFN3RGVjR2V0SW5mbyhkZWNJbnN0LCAmZGVjSW5mbyk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldCAhPSBIMjY0U1dERUNfT0spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQotICAgICAgICAgICAgICAgIC8qIHBpY3R1cmUgc2l6ZSBpbiBwaXhlbHMgKi8KLSAgICAgICAgICAgICAgICBwaWNTaXplID0gZGVjSW5mby5waWNXaWR0aCAqIGRlY0luZm8ucGljSGVpZ2h0OwotICAgICAgICAgICAgICAgIC8qIG1lbW9yeSBuZWVkZWQgZm9yIFlDYkNyIDQ6MjowIHBpY3R1cmUgaW4gYnl0ZXMgKi8KLSAgICAgICAgICAgICAgICBwaWNTaXplID0gKDMgKiBwaWNTaXplKS8yOwotICAgICAgICAgICAgICAgIC8qIG1lbW9yeSBuZWVkZWQgZm9yIDE2LWJpdCBSR0IgcGljdHVyZSBpbiBieXRlcwotICAgICAgICAgICAgICAgICAqIHBpY1NpemUgPSAoZGVjSW5mby5waWNXaWR0aCAqIGRlY0luZm8ucGljSGVpZ2h0KSAqIDI7ICovCi0KLSAgICAgICAgICAgICAgICBwcmludGYoIldpZHRoICVkIEhlaWdodCAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgZGVjSW5mby5waWNXaWR0aCwgZGVjSW5mby5waWNIZWlnaHQpOwotCi0gICAgICAgICAgICAgICAgLyogdXBkYXRlIEgyNjRTd0RlY0RlY29kZSgpIGlucHV0IHN0cnVjdHVyZSwgbnVtYmVyIG9mIGJ5dGVzCi0gICAgICAgICAgICAgICAgICogImNvbnN1bWVkIiBpcyBjb21wdXRlZCBhcyBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG5ldyBzdHJlYW0KLSAgICAgICAgICAgICAgICAgKiBwb2ludGVyIGFuZCBvbGQgc3RyZWFtIHBvaW50ZXIgKi8KLSAgICAgICAgICAgICAgICBkZWNJbnB1dC5kYXRhTGVuIC09Ci0gICAgICAgICAgICAgICAgICAgICh1MzIpKGRlY091dHB1dC5wU3RybUN1cnJQb3MgLSBkZWNJbnB1dC5wU3RyZWFtKTsKLSAgICAgICAgICAgICAgICBkZWNJbnB1dC5wU3RyZWFtID0gZGVjT3V0cHV0LnBTdHJtQ3VyclBvczsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfUElDX1JEWV9CVUZGX05PVF9FTVBUWToKLSAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1BJQ19SRFk6Ci0KLSAgICAgICAgICAgICAgICAvKiB1cGRhdGUgSDI2NFN3RGVjRGVjb2RlKCkgaW5wdXQgc3RydWN0dXJlLCBudW1iZXIgb2YgYnl0ZXMKLSAgICAgICAgICAgICAgICAgKiAiY29uc3VtZWQiIGlzIGNvbXB1dGVkIGFzIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbmV3IHN0cmVhbQotICAgICAgICAgICAgICAgICAqIHBvaW50ZXIgYW5kIG9sZCBzdHJlYW0gcG9pbnRlciAqLwotICAgICAgICAgICAgICAgIGRlY0lucHV0LmRhdGFMZW4gLT0KLSAgICAgICAgICAgICAgICAgICAgKHUzMikoZGVjT3V0cHV0LnBTdHJtQ3VyclBvcyAtIGRlY0lucHV0LnBTdHJlYW0pOwotICAgICAgICAgICAgICAgIGRlY0lucHV0LnBTdHJlYW0gPSBkZWNPdXRwdXQucFN0cm1DdXJyUG9zOwotCi0gICAgICAgICAgICAgICAgLyogdXNlIGZ1bmN0aW9uIEgyNjRTd0RlY05leHRQaWN0dXJlKCkgdG8gb2J0YWluIG5leHQgcGljdHVyZQotICAgICAgICAgICAgICAgICAqIGluIGRpc3BsYXkgb3JkZXIuIEZ1bmN0aW9uIGlzIGNhbGxlZCB1bnRpbCBubyBtb3JlIGltYWdlcwotICAgICAgICAgICAgICAgICAqIGFyZSByZWFkeSBmb3IgZGlzcGxheSAqLwotICAgICAgICAgICAgICAgIHdoaWxlIChIMjY0U3dEZWNOZXh0UGljdHVyZShkZWNJbnN0LCAmZGVjUGljdHVyZSwgMCkgPT0KLSAgICAgICAgICAgICAgICAgICAgSDI2NFNXREVDX1BJQ19SRFkpIHsgcGljTnVtYmVyKys7Ci0KLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJQSUMgJWQsIHR5cGUgJXMsIGNvbmNlYWxlZCAlZFxuIiwgcGljTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgZGVjUGljdHVyZS5pc0lkclBpY3R1cmUgPyAiSURSIiA6ICJOT04tSURSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY1BpY3R1cmUubmJyT2ZFcnJNQnMpOwotICAgICAgICAgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBEbyBjb2xvciBjb252ZXJzaW9uIGlmIG5lZWRlZCB0byBnZXQgZGlzcGxheSBpbWFnZQotICAgICAgICAgICAgICAgICAgICAgKiBpbiBSR0ItZm9ybWF0Ci0gICAgICAgICAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAgICAgICAqIFl1dlRvUmdiKCBkZWNQaWN0dXJlLnBPdXRwdXRQaWN0dXJlLCBwUmdiUGljdHVyZSApOyAqLwotCi0gICAgICAgICAgICAgICAgICAgIC8qIHdyaXRlIG5leHQgZGlzcGxheSBpbWFnZSB0byBvdXRwdXQgZmlsZSAqLwotICAgICAgICAgICAgICAgICAgICBXcml0ZU91dHB1dChmb3V0cHV0LCAodTgqKWRlY1BpY3R1cmUucE91dHB1dFBpY3R1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICBwaWNTaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfRVZBTFVBVElPTl9MSU1JVF9FWENFRURFRDoKLSAgICAgICAgICAgICAgICAvKiBldmFsdWF0aW9uIHZlcnNpb24gb2YgdGhlIGRlY29kZXIgaGFzIGxpbWl0ZWQgZGVjb2RpbmcKLSAgICAgICAgICAgICAgICAgKiBjYXBhYmlsaXRpZXMgKi8KLSAgICAgICAgICAgICAgICBwcmludGYoIkVWQUxVQVRJT04gTElNSVQgUkVBQ0hFRFxuIik7Ci0gICAgICAgICAgICAgICAgZ290byBlbmQ7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJVTlJFQ09WRVJBQkxFIEVSUk9SXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAvKiBrZWVwIGRlY29kaW5nIHVudGlsIGFsbCBkYXRhIGZyb20gaW5wdXQgc3RyZWFtIGJ1ZmZlciBjb25zdW1lZCAqLwotICAgIH0gd2hpbGUgKGRlY0lucHV0LmRhdGFMZW4gPiAwKTsKLQotZW5kOgotCi0gICAgLyogaWYgb3V0cHV0IGluIGRpc3BsYXkgb3JkZXIgaXMgcHJlZmVycmVkLCB0aGUgZGVjb2RlciBzaGFsbCBiZSBmb3JjZWQKLSAgICAgKiB0byBvdXRwdXQgcGljdHVyZXMgcmVtYWluaW5nIGluIGRlY29kZWQgcGljdHVyZSBidWZmZXIuIFVzZSBmdW5jdGlvbgotICAgICAqIEgyNjRTd0RlY05leHRQaWN0dXJlKCkgdG8gb2J0YWluIG5leHQgcGljdHVyZSBpbiBkaXNwbGF5IG9yZGVyLiBGdW5jdGlvbgotICAgICAqIGlzIGNhbGxlZCB1bnRpbCBubyBtb3JlIGltYWdlcyBhcmUgcmVhZHkgZm9yIGRpc3BsYXkuIFNlY29uZCBwYXJhbWV0ZXIKLSAgICAgKiBmb3IgdGhlIGZ1bmN0aW9uIGlzIHNldCB0byAnMScgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGlzIGVuZCBvZiB0aGUKLSAgICAgKiBzdHJlYW0gYW5kIGFsbCBwaWN0dXJlcyBzaGFsbCBiZSBvdXRwdXQgKi8KLSAgICB3aGlsZSAoSDI2NFN3RGVjTmV4dFBpY3R1cmUoZGVjSW5zdCwgJmRlY1BpY3R1cmUsIDEpID09Ci0gICAgICAgIEgyNjRTV0RFQ19QSUNfUkRZKSB7Ci0KLSAgICAgICAgcGljTnVtYmVyKys7Ci0KLSAgICAgICAgcHJpbnRmKCJQSUMgJWQsIHR5cGUgJXMsIGNvbmNlYWxlZCAlZFxuIiwgcGljTnVtYmVyLAotICAgICAgICAgICAgZGVjUGljdHVyZS5pc0lkclBpY3R1cmUgPyAiSURSIiA6ICJOT04tSURSIiwKLSAgICAgICAgICAgIGRlY1BpY3R1cmUubmJyT2ZFcnJNQnMpOwotICAgICAgICBmZmx1c2goc3Rkb3V0KTsKLQotICAgICAgICAvKiBEbyBjb2xvciBjb252ZXJzaW9uIGlmIG5lZWRlZCB0byBnZXQgZGlzcGxheSBpbWFnZQotICAgICAgICAgKiBpbiBSR0ItZm9ybWF0Ci0gICAgICAgICAqCi0gICAgICAgICAqIFl1dlRvUmdiKCBkZWNQaWN0dXJlLnBPdXRwdXRQaWN0dXJlLCBwUmdiUGljdHVyZSApOyAqLwotCi0gICAgICAgIC8qIHdyaXRlIG5leHQgZGlzcGxheSBpbWFnZSB0byBvdXRwdXQgZmlsZSAqLwotICAgICAgICBXcml0ZU91dHB1dChmb3V0cHV0LCAodTgqKWRlY1BpY3R1cmUucE91dHB1dFBpY3R1cmUsIHBpY1NpemUpOwotICAgIH0KLQotICAgIC8qIEZvciBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudHMsIHJlYWQgdGhlIGVuZCB0aW1lIChpbiBzZWNvbmRzKSBoZXJlLgotICAgICAqCi0gICAgICogZW5kVGltZSA9IEdldFRpbWUoKTsKLSAgICAgKgotICAgICAqIE5vdyB0aGUgcGVyZm9ybWFuY2UgY2FuIGJlIGNhbGN1bGF0ZWQgYXMgZnJhbWVzIHBlciBzZWNvbmQ6Ci0gICAgICogZnBzID0gcGljTnVtYmVyIC8gKGVuZFRpbWUgLSBzdGFydFRpbWUpOyAqLwotCi0KLSAgICAvKiByZWxlYXNlIGRlY29kZXIgaW5zdGFuY2UgKi8KLSAgICBIMjY0U3dEZWNSZWxlYXNlKGRlY0luc3QpOwotCi0gICAgLyogY2xvc2Ugb3V0cHV0IGZpbGUgKi8KLSAgICBmY2xvc2UoZm91dHB1dCk7Ci0KLSAgICAvKiBmcmVlIGJ5dGUgc3RyZWFtIGJ1ZmZlciAqLwotICAgIGZyZWUoYnl0ZVN0cm1TdGFydCk7Ci0KLSAgICByZXR1cm4gMDsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogIFdyaXRlT3V0cHV0Ci0KLSAgICBQdXJwb3NlOgotICAgICAgICBXcml0ZSBwaWN0dXJlIHBvaW50ZWQgYnkgZGF0YSB0byBmaWxlIHBvaW50ZWQgYnkgZmlkLiBTaXplIG9mIHRoZQotICAgICAgICBwaWN0dXJlIGluIHBpeGVscyBpcyBpbmRpY2F0ZWQgYnkgcGljU2l6ZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgV3JpdGVPdXRwdXQoRklMRSAqZmlkLCB1OCAqZGF0YSwgdTMyIHBpY1NpemUpCi17Ci0gICAgZndyaXRlKGRhdGEsIDEsIHBpY1NpemUsIGZpZCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiAgSDI2NFN3RGVjVHJhY2UKLQotICAgIFB1cnBvc2U6Ci0gICAgICAgIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgSDI2NFN3RGVjVHJhY2UgZnVuY3Rpb24uIFByb3RvdHlwZSBvZiB0aGlzCi0gICAgICAgIGZ1bmN0aW9uIGlzIGdpdmVuIGluIEgyNjRTd0RlY0FwaS5oLiBUaGlzIGltcGxlbWVudGF0aW9uIGFwcGVuZHMKLSAgICAgICAgdHJhY2UgbWVzc2FnZXMgdG8gZmlsZSBuYW1lZCAnZGVjX2FwaS50cmMnLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBIMjY0U3dEZWNUcmFjZShjaGFyICpzdHJpbmcpCi17Ci0gICAgRklMRSAqZnA7Ci0KLSAgICBmcCA9IGZvcGVuKCJkZWNfYXBpLnRyYyIsICJhdCIpOwotCi0gICAgaWYgKCFmcCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZndyaXRlKHN0cmluZywgMSwgc3RybGVuKHN0cmluZyksIGZwKTsKLSAgICBmd3JpdGUoIlxuIiwgMSwxLCBmcCk7Ci0KLSAgICBmY2xvc2UoZnApOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY21hbGxvYwotCi0gICAgUHVycG9zZToKLSAgICAgICAgRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBIMjY0U3dEZWNNYWxsb2MgZnVuY3Rpb24uIFByb3RvdHlwZSBvZiB0aGlzCi0gICAgICAgIGZ1bmN0aW9uIGlzIGdpdmVuIGluIEgyNjRTd0RlY0FwaS5oLiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMKLSAgICAgICAgbGlicmFyeSBmdW5jdGlvbiBtYWxsb2MgZm9yIGFsbG9jYXRpb24gb2YgbWVtb3J5LgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCogSDI2NFN3RGVjTWFsbG9jKHUzMiBzaXplLCB1MzIgbnVtKQotewotICAgIGlmIChzaXplID4gVUlOVDMyX01BWCAvIG51bSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIG1hbGxvYyhzaXplICogbnVtKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNGcmVlCi0KLSAgICBQdXJwb3NlOgotICAgICAgICBFeGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIEgyNjRTd0RlY0ZyZWUgZnVuY3Rpb24uIFByb3RvdHlwZSBvZiB0aGlzCi0gICAgICAgIGZ1bmN0aW9uIGlzIGdpdmVuIGluIEgyNjRTd0RlY0FwaS5oLiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMKLSAgICAgICAgbGlicmFyeSBmdW5jdGlvbiBmcmVlIGZvciBmcmVlaW5nIG9mIG1lbW9yeS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgSDI2NFN3RGVjRnJlZSh2b2lkICpwdHIpCi17Ci0gICAgZnJlZShwdHIpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY01lbWNweQotCi0gICAgUHVycG9zZToKLSAgICAgICAgRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBIMjY0U3dEZWNNZW1jcHkgZnVuY3Rpb24uIFByb3RvdHlwZSBvZiB0aGlzCi0gICAgICAgIGZ1bmN0aW9uIGlzIGdpdmVuIGluIEgyNjRTd0RlY0FwaS5oLiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMKLSAgICAgICAgbGlicmFyeSBmdW5jdGlvbiBtZW1jcHkgdG8gY29weSBzcmMgdG8gZGVzdC4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgSDI2NFN3RGVjTWVtY3B5KHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgdTMyIGNvdW50KQotewotICAgIG1lbWNweShkZXN0LCBzcmMsIGNvdW50KTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNNZW1zZXQKLQotICAgIFB1cnBvc2U6Ci0gICAgICAgIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgSDI2NFN3RGVjTWVtc2V0IGZ1bmN0aW9uLiBQcm90b3R5cGUgb2YgdGhpcwotICAgICAgICBmdW5jdGlvbiBpcyBnaXZlbiBpbiBIMjY0U3dEZWNBcGkuaC4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzCi0gICAgICAgIGxpYnJhcnkgZnVuY3Rpb24gbWVtc2V0IHRvIHNldCBjb250ZW50IG9mIG1lbW9yeSBhcmVhIHBvaW50ZWQgYnkgcHRyLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBIMjY0U3dEZWNNZW1zZXQodm9pZCAqcHRyLCBpMzIgdmFsdWUsIHUzMiBjb3VudCkKLXsKLSAgICBtZW1zZXQocHRyLCB2YWx1ZSwgY291bnQpOwotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0gyNjRTd0RlY0FwaS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9IMjY0U3dEZWNBcGkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTliMzhlNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL0gyNjRTd0RlY0FwaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBIMjY0U3dEZWNJbml0Ci0gICAgICAgICAgSDI2NFN3RGVjR2V0SW5mbwotICAgICAgICAgIEgyNjRTd0RlY1JlbGVhc2UKLSAgICAgICAgICBIMjY0U3dEZWNEZWNvZGUKLSAgICAgICAgICBIMjY0U3dEZWNHZXRBUElWZXJzaW9uCi0gICAgICAgICAgSDI2NFN3RGVjTmV4dFBpY3R1cmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGxvZy9sb2cuaD4KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9jb250YWluZXIuaCIKLSNpbmNsdWRlICJIMjY0U3dEZWNBcGkuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2RlY29kZXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLQotI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgVmVyc2lvbiBJbmZvcm1hdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBIMjY0U1dERUNfTUFKT1JfVkVSU0lPTiAyCi0jZGVmaW5lIEgyNjRTV0RFQ19NSU5PUl9WRVJTSU9OIDMKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotSDI2NERFQ19UUkFDRSAgICAgICAgICAgVHJhY2UgSDI2NCBEZWNvZGVyIEFQSSBmdW5jdGlvbiBjYWxscy4KLUgyNjRERUNfRVZBTFVBVElPTiAgICAgIENvbXBpbGUgZXZhbHVhdGlvbiB2ZXJzaW9uLCByZXN0cmljdHMgbnVtYmVyIG9mIGZyYW1lcwotICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBjYW4gYmUgZGVjb2RlZAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYgSDI2NERFQ19UUkFDRQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jZGVmaW5lIERFQ19BUElfVFJDKHN0cikgICAgSDI2NFN3RGVjVHJhY2Uoc3RyKQotI2Vsc2UKLSNkZWZpbmUgREVDX0FQSV9UUkMoc3RyKQotI2VuZGlmCi0KLSNpZmRlZiBIMjY0REVDX0VWQUxVQVRJT04KLSNkZWZpbmUgSDI2NERFQ19FVkFMVUFUSU9OX0xJTUlUICAgNTAwCi0jZW5kaWYKLQotdm9pZCBIMjY0U3dEZWNUcmFjZShjaGFyICpzdHJpbmcpIHsKLSAgICBVTlVTRUQoc3RyaW5nKTsKLX0KLQotdm9pZCogSDI2NFN3RGVjTWFsbG9jKHUzMiBzaXplLCB1MzIgbnVtKSB7Ci0gICAgaWYgKHNpemUgPiBVSU5UMzJfTUFYIC8gbnVtKSB7Ci0gICAgICAgIEFMT0dFKCJjYW4ndCBhbGxvY2F0ZSAldSAqICV1IGJ5dGVzIiwgc2l6ZSwgbnVtKTsKLSAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzg1NTQxOSIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIG1hbGxvYyhzaXplICogbnVtKTsKLX0KLQotdm9pZCBIMjY0U3dEZWNGcmVlKHZvaWQgKnB0cikgewotICAgIGZyZWUocHRyKTsKLX0KLQotdm9pZCBIMjY0U3dEZWNNZW1jcHkodm9pZCAqZGVzdCwgdm9pZCAqc3JjLCB1MzIgY291bnQpIHsKLSAgICBtZW1jcHkoZGVzdCwgc3JjLCBjb3VudCk7Ci19Ci0KLXZvaWQgSDI2NFN3RGVjTWVtc2V0KHZvaWQgKnB0ciwgaTMyIHZhbHVlLCB1MzIgY291bnQpIHsKLSAgICBtZW1zZXQocHRyLCB2YWx1ZSwgY291bnQpOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSDI2NFN3RGVjSW5pdCgpCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEluaXRpYWxpemUgZGVjb2RlciBzb2Z0d2FyZS4gRnVuY3Rpb24gcmVzZXJ2ZXMgbWVtb3J5IGZvciB0aGUKLSAgICAgICAgICAgIGRlY29kZXIgaW5zdGFuY2UgYW5kIGNhbGxzIGgyNjRic2RJbml0IHRvIGluaXRpYWxpemUgdGhlCi0gICAgICAgICAgICBpbnN0YW5jZSBkYXRhLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIG5vT3V0cHV0UmVvcmRlcmluZyAgZmxhZyB0byBpbmRpY2F0ZSBkZWNvZGVyIHRoYXQgaXQgZG9lc24ndCBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRyeSB0byBwcm92aWRlIG91dHB1dCBwaWN0dXJlcyBpbiBkaXNwbGF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyLCBzYXZlcyBtZW1vcnkKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgZGVjSW5zdCAgICAgICAgICAgICBwb2ludGVyIHRvIGluaXRpYWxpemVkIGluc3RhbmNlIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEgyNjRTV0RFQ19PSyAgICAgICAgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkIHRoZSBpbnN0YW5jZQotICAgICAgICAgICAgSDI2NFNXREVDX0lOSVRGQUlMICBpbml0aWFsaXphdGlvbiBmYWlsZWQKLSAgICAgICAgICAgIEgyNjRTV0RFQ19QQVJBTV9FUlIgaW52YWxpZCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBIMjY0U1dERUNfTUVNX0ZBSUwgIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1IMjY0U3dEZWNSZXQgSDI2NFN3RGVjSW5pdChIMjY0U3dEZWNJbnN0ICpkZWNJbnN0LCB1MzIgbm9PdXRwdXRSZW9yZGVyaW5nKQotewotICAgIHUzMiBydiA9IDA7Ci0KLSAgICBkZWNDb250YWluZXJfdCAqcERlY0NvbnQ7Ci0KLSAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjSW5pdCMiKTsKLQotICAgIC8qIGNoZWNrIHRoYXQgcmlnaHQgc2hpZnQgb24gbmVnYXRpdmUgbnVtYmVycyBpcyBwZXJmb3JtZWQgc2lnbmVkICovCi0gICAgLypsaW50IC1zYXZlIC1lKiBmb2xsb3dpbmcgY2hlY2sgY2F1c2VzIG11bHRpcGxlIGxpbnQgbWVzc2FnZXMgKi8KLSAgICBpZiAoICgoLTEpPj4xKSAhPSAoLTEpICkKLSAgICB7Ci0gICAgICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNJbml0IyBFUlJPUjogUmlnaHQgc2hpZnQgaXMgbm90IHNpZ25lZCIpOwotICAgICAgICByZXR1cm4oSDI2NFNXREVDX0lOSVRGQUlMKTsKLSAgICB9Ci0gICAgLypsaW50IC1yZXN0b3JlICovCi0KLSAgICBpZiAoZGVjSW5zdCA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0luaXQjIEVSUk9SOiBkZWNJbnN0ID09IE5VTEwiKTsKLSAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19QQVJBTV9FUlIpOwotICAgIH0KLQotICAgIHBEZWNDb250ID0gKGRlY0NvbnRhaW5lcl90ICopSDI2NFN3RGVjTWFsbG9jKHNpemVvZihkZWNDb250YWluZXJfdCksIDEpOwotCi0gICAgaWYgKHBEZWNDb250ID09IE5VTEwpCi0gICAgewotICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjSW5pdCMgRVJST1I6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4oSDI2NFNXREVDX01FTUZBSUwpOwotICAgIH0KLQotI2lmZGVmIEgyNjRERUNfVFJBQ0UKLSAgICBzcHJpbnRmKHBEZWNDb250LT5zdHIsICJIMjY0U3dEZWNJbml0IyBkZWNJbnN0ICVwIG5vT3V0cHV0UmVvcmRlcmluZyAlZCIsCi0gICAgICAgICAgICAodm9pZCopZGVjSW5zdCwgbm9PdXRwdXRSZW9yZGVyaW5nKTsKLSAgICBERUNfQVBJX1RSQyhwRGVjQ29udC0+c3RyKTsKLSNlbmRpZgotCi0gICAgcnYgPSBoMjY0YnNkSW5pdCgmcERlY0NvbnQtPnN0b3JhZ2UsIG5vT3V0cHV0UmVvcmRlcmluZyk7Ci0gICAgaWYgKHJ2ICE9IEhBTlRST19PSykKLSAgICB7Ci0gICAgICAgIEgyNjRTd0RlY1JlbGVhc2UocERlY0NvbnQpOwotICAgICAgICByZXR1cm4oSDI2NFNXREVDX01FTUZBSUwpOwotICAgIH0KLQotICAgIHBEZWNDb250LT5kZWNTdGF0ICA9IElOSVRJQUxJWkVEOwotICAgIHBEZWNDb250LT5waWNOdW1iZXIgPSAwOwotCi0jaWZkZWYgSDI2NERFQ19UUkFDRQotICAgIHNwcmludGYocERlY0NvbnQtPnN0ciwgIkgyNjRTd0RlY0luaXQjIE9LOiByZXR1cm4gJXAiLCAodm9pZCopcERlY0NvbnQpOwotICAgIERFQ19BUElfVFJDKHBEZWNDb250LT5zdHIpOwotI2VuZGlmCi0KLSAgICAqZGVjSW5zdCA9IChkZWNDb250YWluZXJfdCAqKXBEZWNDb250OwotCi0gICAgcmV0dXJuKEgyNjRTV0RFQ19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBIMjY0U3dEZWNHZXRJbmZvKCkKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyByZWFkIGFjY2VzcyB0byBkZWNvZGVyIGluZm9ybWF0aW9uLiBUaGlzCi0gICAgICAgICAgICBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCBiZWZvcmUgSDI2NFN3RGVjRGVjb2RlIGZ1bmN0aW9uIGhhcwotICAgICAgICAgICAgaW5kaWNhdGVkIHRoYXQgaGVhZGVycyBhcmUgcmVhZHkuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgZGVjSW5zdCAgICAgZGVjb2RlciBpbnN0YW5jZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBwRGVjSW5mbyAgICBwb2ludGVyIHRvIGluZm8gc3RydWN0IHdoZXJlIGRhdGEgaXMgd3JpdHRlbgotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIMjY0U1dERUNfT0sgICAgICAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIMjY0U1dERUNfUEFSQU1fRVJSICAgICBpbnZhbGlkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIEgyNjRTV0RFQ19IRFJTX05PVF9SRFkgIGluZm9ybWF0aW9uIG5vdCBhdmFpbGFibGUgeWV0Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLUgyNjRTd0RlY1JldCBIMjY0U3dEZWNHZXRJbmZvKEgyNjRTd0RlY0luc3QgZGVjSW5zdCwgSDI2NFN3RGVjSW5mbyAqcERlY0luZm8pCi17Ci0KLSAgICBzdG9yYWdlX3QgKnBTdG9yYWdlOwotCi0gICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY0dldEluZm8jIik7Ci0KLSAgICBpZiAoZGVjSW5zdCA9PSBOVUxMIHx8IHBEZWNJbmZvID09IE5VTEwpCi0gICAgewotICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjR2V0SW5mbyMgRVJST1I6IGRlY0luc3Qgb3IgcERlY0luZm8gaXMgTlVMTCIpOwotICAgICAgICByZXR1cm4oSDI2NFNXREVDX1BBUkFNX0VSUik7Ci0gICAgfQotCi0gICAgcFN0b3JhZ2UgPSAmKCgoZGVjQ29udGFpbmVyX3QgKilkZWNJbnN0KS0+c3RvcmFnZSk7Ci0KLSAgICBpZiAocFN0b3JhZ2UtPmFjdGl2ZVNwcyA9PSBOVUxMIHx8IHBTdG9yYWdlLT5hY3RpdmVQcHMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNHZXRJbmZvIyBFUlJPUjogSGVhZGVycyBub3QgZGVjb2RlZCB5ZXQiKTsKLSAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19IRFJTX05PVF9SRFkpOwotICAgIH0KLQotI2lmZGVmIEgyNjRERUNfVFJBQ0UKLSAgICBzcHJpbnRmKCgoZGVjQ29udGFpbmVyX3QqKWRlY0luc3QpLT5zdHIsCi0gICAgICAgICJIMjY0U3dEZWNHZXRJbmZvIyBkZWNJbnN0ICVwICBwRGVjSW5mbyAlcCIsIGRlY0luc3QsICh2b2lkKilwRGVjSW5mbyk7Ci0gICAgREVDX0FQSV9UUkMoKChkZWNDb250YWluZXJfdCopZGVjSW5zdCktPnN0cik7Ci0jZW5kaWYKLQotICAgIC8qIGgyNjRic2RQaWNXaWR0aCBhbmQgLUhlaWdodCByZXR1cm4gZGltZW5zaW9ucyBpbiBtYWNyb2Jsb2NrIHVuaXRzLAotICAgICAqIHBpY1dpZHRoIGFuZCAtSGVpZ2h0IGluIHBpeGVscyAqLwotICAgIHBEZWNJbmZvLT5waWNXaWR0aCAgICAgICAgPSBoMjY0YnNkUGljV2lkdGgocFN0b3JhZ2UpIDw8IDQ7Ci0gICAgcERlY0luZm8tPnBpY0hlaWdodCAgICAgICA9IGgyNjRic2RQaWNIZWlnaHQocFN0b3JhZ2UpIDw8IDQ7Ci0gICAgcERlY0luZm8tPnZpZGVvUmFuZ2UgICAgICA9IGgyNjRic2RWaWRlb1JhbmdlKHBTdG9yYWdlKTsKLSAgICBwRGVjSW5mby0+bWF0cml4Q29lZmZpY2llbnRzID0gaDI2NGJzZE1hdHJpeENvZWZmaWNpZW50cyhwU3RvcmFnZSk7Ci0KLSAgICBoMjY0YnNkQ3JvcHBpbmdQYXJhbXMocFN0b3JhZ2UsCi0gICAgICAgICZwRGVjSW5mby0+Y3JvcHBpbmdGbGFnLAotICAgICAgICAmcERlY0luZm8tPmNyb3BQYXJhbXMuY3JvcExlZnRPZmZzZXQsCi0gICAgICAgICZwRGVjSW5mby0+Y3JvcFBhcmFtcy5jcm9wT3V0V2lkdGgsCi0gICAgICAgICZwRGVjSW5mby0+Y3JvcFBhcmFtcy5jcm9wVG9wT2Zmc2V0LAotICAgICAgICAmcERlY0luZm8tPmNyb3BQYXJhbXMuY3JvcE91dEhlaWdodCk7Ci0KLSAgICAvKiBzYW1wbGUgYXNwZWN0IHJhdGlvICovCi0gICAgaDI2NGJzZFNhbXBsZUFzcGVjdFJhdGlvKHBTdG9yYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcERlY0luZm8tPnBhcldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcERlY0luZm8tPnBhckhlaWdodCk7Ci0KLSAgICAvKiBwcm9maWxlICovCi0gICAgcERlY0luZm8tPnByb2ZpbGUgPSBoMjY0YnNkUHJvZmlsZShwU3RvcmFnZSk7Ci0KLSAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjR2V0SW5mbyMgT0siKTsKLQotICAgIHJldHVybihIMjY0U1dERUNfT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSDI2NFN3RGVjUmVsZWFzZSgpCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFJlbGVhc2UgdGhlIGRlY29kZXIgaW5zdGFuY2UuIEZ1bmN0aW9uIGNhbGxzIGgyNjRic2RTaHV0RG93biB0bwotICAgICAgICAgICAgcmVsZWFzZSBpbnN0YW5jZSBkYXRhIGFuZCBmcmVlcyB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlCi0gICAgICAgICAgICBpbnN0YW5jZS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBkZWNJbnN0ICAgICBEZWNvZGVyIGluc3RhbmNlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgbm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIEgyNjRTd0RlY1JlbGVhc2UoSDI2NFN3RGVjSW5zdCBkZWNJbnN0KQotewotCi0gICAgZGVjQ29udGFpbmVyX3QgKnBEZWNDb250OwotCi0gICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY1JlbGVhc2UjIik7Ci0KLSAgICBpZiAoZGVjSW5zdCA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgREVDX0FQSV9UUkMoIkgyNjRTd0RlY1JlbGVhc2UjIEVSUk9SOiBkZWNJbnN0ID09IE5VTEwiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHBEZWNDb250ID0gKGRlY0NvbnRhaW5lcl90KilkZWNJbnN0OwotCi0jaWZkZWYgSDI2NERFQ19UUkFDRQotICAgIHNwcmludGYocERlY0NvbnQtPnN0ciwgIkgyNjRTd0RlY1JlbGVhc2UjIGRlY0luc3QgJXAiLGRlY0luc3QpOwotICAgIERFQ19BUElfVFJDKHBEZWNDb250LT5zdHIpOwotI2VuZGlmCi0KLSAgICBoMjY0YnNkU2h1dGRvd24oJnBEZWNDb250LT5zdG9yYWdlKTsKLQotICAgIEgyNjRTd0RlY0ZyZWUocERlY0NvbnQpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSDI2NFN3RGVjRGVjb2RlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIERlY29kZSBzdHJlYW0gZGF0YS4gQ2FsbHMgaDI2NGJzZERlY29kZSB0byBkbyB0aGUgYWN0dWFsIGRlY29kaW5nLgotCi0gICAgICAgIElucHV0OgotICAgICAgICAgICAgZGVjSW5zdCAgICAgZGVjb2RlciBpbnN0YW5jZQotICAgICAgICAgICAgcElucHV0ICAgICAgcG9pbnRlciB0byBpbnB1dCBzdHJ1Y3QKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgcE91dHB1dCAgICAgcG9pbnRlciB0byBvdXRwdXQgc3RydWN0Ci0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEgyNjRTV0RFQ19OT1RfSU5JVElBTElaRUQgICBkZWNvZGVyIGluc3RhbmNlIG5vdCBpbml0aWFsaXplZCB5ZXQKLSAgICAgICAgICAgIEgyNjRTV0RFQ19QQVJBTV9FUlIgICAgICAgICBpbnZhbGlkIHBhcmFtZXRlcnMKLQotICAgICAgICAgICAgSDI2NFNXREVDX1NUUk1fUFJPQ0VTU0VEICAgIHN0cmVhbSBidWZmZXIgZGVjb2RlZAotICAgICAgICAgICAgSDI2NFNXREVDX0hEUlNfUkRZX0JVRkZfTk9UX0VNUFRZICAgaGVhZGVycyBkZWNvZGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlciBub3QgZmluaXNoZWQKLSAgICAgICAgICAgIEgyNjRTV0RFQ19QSUNfUkRZICAgICAgICAgICAgICAgICAgIGRlY29kaW5nIG9mIGEgcGljdHVyZSBmaW5pc2hlZAotICAgICAgICAgICAgSDI2NFNXREVDX1BJQ19SRFlfQlVGRl9OT1RfRU1QVFkgICAgZGVjb2Rpbmcgb2YgYSBwaWN0dXJlIGZpbmlzaGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlciBub3QgZmluaXNoZWQKLSAgICAgICAgICAgIEgyNjRTV0RFQ19TVFJNX0VSUiAgICAgICAgICAgICAgICAgIHNlcmlvdXMgZXJyb3IgaW4gZGVjb2RpbmcsIG5vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBwYXJhbWV0ZXIgc2V0cyBhdmFpbGFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGRlY29kZSBwaWN0dXJlIGRhdGEKLSAgICAgICAgICAgIEgyNjRTV0RFQ19FVkFMVUFUSU9OX0xJTUlUX0VYQ0VFREVEIHRoaXMgY2FuIG9ubHkgb2NjdXIgd2hlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGlvbiB2ZXJzaW9uIGlzIHVzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXggbnVtYmVyIG9mIGZyYW1lcyByZWFjaGVkCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLUgyNjRTd0RlY1JldCBIMjY0U3dEZWNEZWNvZGUoSDI2NFN3RGVjSW5zdCBkZWNJbnN0LCBIMjY0U3dEZWNJbnB1dCAqcElucHV0LAotICAgICAgICAgICAgICAgICAgSDI2NFN3RGVjT3V0cHV0ICpwT3V0cHV0KQotewotCi0gICAgZGVjQ29udGFpbmVyX3QgKnBEZWNDb250OwotICAgIHUzMiBzdHJtTGVuOwotICAgIHUzMiBudW1SZWFkQnl0ZXM7Ci0gICAgdTggKnRtcFN0cmVhbTsKLSAgICB1MzIgZGVjUmVzdWx0ID0gMDsKLSAgICBIMjY0U3dEZWNSZXQgcmV0dXJuVmFsdWUgPSBIMjY0U1dERUNfU1RSTV9QUk9DRVNTRUQ7Ci0KLSAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjRGVjb2RlIyIpOwotCi0gICAgLyogQ2hlY2sgdGhhdCBmdW5jdGlvbiBpbnB1dCBwYXJhbWV0ZXJzIGFyZSB2YWxpZCAqLwotICAgIGlmIChwSW5wdXQgPT0gTlVMTCB8fCBwT3V0cHV0ID09IE5VTEwpCi0gICAgewotICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjRGVjb2RlIyBFUlJPUjogcElucHV0IG9yIHBPdXRwdXQgaXMgTlVMTCIpOwotICAgICAgICByZXR1cm4oSDI2NFNXREVDX1BBUkFNX0VSUik7Ci0gICAgfQotCi0gICAgaWYgKChwSW5wdXQtPnBTdHJlYW0gPT0gTlVMTCkgfHwgKHBJbnB1dC0+ZGF0YUxlbiA9PSAwKSkKLSAgICB7Ci0gICAgICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNEZWNvZGUjIEVSUk9SOiBJbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMiKTsKLSAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19QQVJBTV9FUlIpOwotICAgIH0KLQotICAgIHBEZWNDb250ID0gKGRlY0NvbnRhaW5lcl90ICopZGVjSW5zdDsKLQotICAgIC8qIENoZWNrIGlmIGRlY29kZXIgaXMgaW4gYW4gaW5jb3JyZWN0IG1vZGUgKi8KLSAgICBpZiAoZGVjSW5zdCA9PSBOVUxMIHx8IHBEZWNDb250LT5kZWNTdGF0ID09IFVOSU5JVElBTElaRUQpCi0gICAgewotICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjRGVjb2RlIyBFUlJPUjogRGVjb2RlciBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19OT1RfSU5JVElBTElaRUQpOwotICAgIH0KLQotI2lmZGVmIEgyNjRERUNfRVZBTFVBVElPTgotICAgIGlmIChwRGVjQ29udC0+cGljTnVtYmVyID49IEgyNjRERUNfRVZBTFVBVElPTl9MSU1JVCkKLSAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19FVkFMVUFUSU9OX0xJTUlUX0VYQ0VFREVEKTsKLSNlbmRpZgotCi0jaWZkZWYgSDI2NERFQ19UUkFDRQotICAgIHNwcmludGYocERlY0NvbnQtPnN0ciwgIkgyNjRTd0RlY0RlY29kZSMgZGVjSW5zdCAlcCAgcElucHV0ICVwICBwT3V0cHV0ICVwIiwKLSAgICAgICAgICAgIGRlY0luc3QsICh2b2lkKilwSW5wdXQsICh2b2lkKilwT3V0cHV0KTsKLSAgICBERUNfQVBJX1RSQyhwRGVjQ29udC0+c3RyKTsKLSNlbmRpZgotCi0gICAgcE91dHB1dC0+cFN0cm1DdXJyUG9zICAgPSBOVUxMOwotCi0gICAgbnVtUmVhZEJ5dGVzID0gMDsKLSAgICBzdHJtTGVuID0gcElucHV0LT5kYXRhTGVuOwotICAgIHRtcFN0cmVhbSA9IHBJbnB1dC0+cFN0cmVhbTsKLSAgICBwRGVjQ29udC0+c3RvcmFnZS5pbnRyYUNvbmNlYWxtZW50RmxhZyA9IHBJbnB1dC0+aW50cmFDb25jZWFsbWVudE1ldGhvZDsKLQotICAgIGRvCi0gICAgewotICAgICAgICAvKiBSZXR1cm4gSERSU19SRFkgYWZ0ZXIgRFBCIGZsdXNoIGNhdXNlZCBieSBuZXcgU1BTICovCi0gICAgICAgIGlmIChwRGVjQ29udC0+ZGVjU3RhdCA9PSBORVdfSEVBREVSUykKLSAgICAgICAgewotICAgICAgICAgICAgZGVjUmVzdWx0ID0gSDI2NEJTRF9IRFJTX1JEWTsKLSAgICAgICAgICAgIHBEZWNDb250LT5kZWNTdGF0ID0gSU5JVElBTElaRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvKiBDb250aW51ZSBkZWNvZGluZyBub3JtYWxseSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBkZWNSZXN1bHQgPSBoMjY0YnNkRGVjb2RlKCZwRGVjQ29udC0+c3RvcmFnZSwgdG1wU3RyZWFtLCBzdHJtTGVuLAotICAgICAgICAgICAgICAgIHBJbnB1dC0+cGljSWQsICZudW1SZWFkQnl0ZXMpOwotICAgICAgICB9Ci0gICAgICAgIHRtcFN0cmVhbSArPSBudW1SZWFkQnl0ZXM7Ci0gICAgICAgIC8qIGNoZWNrIGlmIHRvbyBtYW55IGJ5dGVzIGFyZSByZWFkIGZyb20gc3RyZWFtICovCi0gICAgICAgIGlmICggKGkzMikoc3RybUxlbiAtIG51bVJlYWRCeXRlcykgPj0gMCApCi0gICAgICAgICAgICBzdHJtTGVuIC09IG51bVJlYWRCeXRlczsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RybUxlbiA9IDA7Ci0KLSAgICAgICAgcE91dHB1dC0+cFN0cm1DdXJyUG9zID0gdG1wU3RyZWFtOwotCi0gICAgICAgIHN3aXRjaCAoZGVjUmVzdWx0KQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIEgyNjRCU0RfSERSU19SRFk6Ci0KLSAgICAgICAgICAgICAgICBpZihwRGVjQ29udC0+c3RvcmFnZS5kcGItPmZsdXNoZWQgJiYKLSAgICAgICAgICAgICAgICAgICBwRGVjQ29udC0+c3RvcmFnZS5kcGItPm51bU91dCAhPQotICAgICAgICAgICAgICAgICAgIHBEZWNDb250LT5zdG9yYWdlLmRwYi0+b3V0SW5kZXgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQgZmlyc3QgYWxsIERQQiBzdG9yZWQgcGljdHVyZXMKLSAgICAgICAgICAgICAgICAgICAgICogRFBCIGZsdXNoIGNhdXNlZCBieSBuZXcgU1BTICovCi0gICAgICAgICAgICAgICAgICAgIHBEZWNDb250LT5zdG9yYWdlLmRwYi0+Zmx1c2hlZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNDb250LT5kZWNTdGF0ID0gTkVXX0hFQURFUlM7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gSDI2NFNXREVDX1BJQ19SRFlfQlVGRl9OT1RfRU1QVFk7Ci0gICAgICAgICAgICAgICAgICAgIHN0cm1MZW4gPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IEgyNjRTV0RFQ19IRFJTX1JEWV9CVUZGX05PVF9FTVBUWTsKLSAgICAgICAgICAgICAgICAgICAgc3RybUxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEgyNjRCU0RfUElDX1JEWToKLSAgICAgICAgICAgICAgICBwRGVjQ29udC0+cGljTnVtYmVyKys7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc3RybUxlbiA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IEgyNjRTV0RFQ19QSUNfUkRZOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBIMjY0U1dERUNfUElDX1JEWV9CVUZGX05PVF9FTVBUWTsKLQotICAgICAgICAgICAgICAgIHN0cm1MZW4gPSAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEgyNjRCU0RfUEFSQU1fU0VUX0VSUk9SOgotICAgICAgICAgICAgICAgIGlmICggIWgyNjRic2RDaGVja1ZhbGlkUGFyYW1TZXRzKCZwRGVjQ29udC0+c3RvcmFnZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgIHN0cm1MZW4gPT0gMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IEgyNjRTV0RFQ19TVFJNX0VSUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEgyNjRCU0RfTUVNQUxMT0NfRVJST1I6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IEgyNjRTV0RFQ19NRU1GQUlMOwotICAgICAgICAgICAgICAgICAgICBzdHJtTGVuID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICB9IHdoaWxlIChzdHJtTGVuKTsKLQotI2lmZGVmIEgyNjRERUNfVFJBQ0UKLSAgICBzcHJpbnRmKHBEZWNDb250LT5zdHIsICJIMjY0U3dEZWNEZWNvZGUjIE9LOiBEZWNSZXN1bHQgJWQiLAotICAgICAgICAgICAgcmV0dXJuVmFsdWUpOwotICAgIERFQ19BUElfVFJDKHBEZWNDb250LT5zdHIpOwotI2VuZGlmCi0KLSAgICByZXR1cm4ocmV0dXJuVmFsdWUpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSDI2NFN3RGVjR2V0QVBJVmVyc2lvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBSZXR1cm4gdmVyc2lvbiBpbmZvcm1hdGlvbiBvZiB0aGUgQVBJCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEFQSSB2ZXJzaW9uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLUgyNjRTd0RlY0FwaVZlcnNpb24gSDI2NFN3RGVjR2V0QVBJVmVyc2lvbigpCi17Ci0gICAgSDI2NFN3RGVjQXBpVmVyc2lvbiB2ZXI7Ci0KLSAgICB2ZXIubWFqb3IgPSBIMjY0U1dERUNfTUFKT1JfVkVSU0lPTjsKLSAgICB2ZXIubWlub3IgPSBIMjY0U1dERUNfTUlOT1JfVkVSU0lPTjsKLQotICAgIHJldHVybih2ZXIpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEgyNjRTd0RlY05leHRQaWN0dXJlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEdldCBuZXh0IHBpY3R1cmUgaW4gZGlzcGxheSBvcmRlciBpZiBhbnkgYXZhaWxhYmxlLgotCi0gICAgICAgIElucHV0OgotICAgICAgICAgICAgZGVjSW5zdCAgICAgZGVjb2RlciBpbnN0YW5jZS4KLSAgICAgICAgICAgIGZsdXNoQnVmZmVyIGZvcmNlIG91dHB1dCBvZiBhbGwgYnVmZmVyZWQgcGljdHVyZXMKLQotICAgICAgICBPdXRwdXQ6Ci0gICAgICAgICAgICBwT3V0cHV0ICAgICBwb2ludGVyIHRvIG91dHB1dCBzdHJ1Y3R1cmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSDI2NFNXREVDX09LICAgICAgICAgICAgbm8gcGljdHVyZXMgYXZhaWxhYmxlIGZvciBkaXNwbGF5Ci0gICAgICAgICAgICBIMjY0U1dERUNfUElDX1JEWSAgICAgICBwaWN0dXJlIGF2YWlsYWJsZSBmb3IgZGlzcGxheQotICAgICAgICAgICAgSDI2NFNXREVDX1BBUkFNX0VSUiAgICAgaW52YWxpZCBwYXJhbWV0ZXJzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLUgyNjRTd0RlY1JldCBIMjY0U3dEZWNOZXh0UGljdHVyZShIMjY0U3dEZWNJbnN0IGRlY0luc3QsCi0gICAgSDI2NFN3RGVjUGljdHVyZSAqcE91dHB1dCwgdTMyIGZsdXNoQnVmZmVyKQotewotCi0gICAgZGVjQ29udGFpbmVyX3QgKnBEZWNDb250OwotICAgIHUzMiBudW1FcnJNYnMsIGlzSWRyUGljLCBwaWNJZDsKLSAgICB1MzIgKnBPdXRQaWM7Ci0KLSAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjTmV4dFBpY3R1cmUjIik7Ci0KLSAgICBpZiAoZGVjSW5zdCA9PSBOVUxMIHx8IHBPdXRwdXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIERFQ19BUElfVFJDKCJIMjY0U3dEZWNOZXh0UGljdHVyZSMgRVJST1I6IGRlY0luc3Qgb3IgcE91dHB1dCBpcyBOVUxMIik7Ci0gICAgICAgIHJldHVybihIMjY0U1dERUNfUEFSQU1fRVJSKTsKLSAgICB9Ci0KLSAgICBwRGVjQ29udCA9IChkZWNDb250YWluZXJfdCopZGVjSW5zdDsKLQotI2lmZGVmIEgyNjRERUNfVFJBQ0UKLSAgICBzcHJpbnRmKHBEZWNDb250LT5zdHIsICJIMjY0U3dEZWNOZXh0UGljdHVyZSMgZGVjSW5zdCAlcCBwT3V0cHV0ICVwICVzICVkIiwKLSAgICAgICAgICAgIGRlY0luc3QsICh2b2lkKilwT3V0cHV0LCAiZmx1c2hCdWZmZXIiLCBmbHVzaEJ1ZmZlcik7Ci0gICAgREVDX0FQSV9UUkMocERlY0NvbnQtPnN0cik7Ci0jZW5kaWYKLQotICAgIGlmIChmbHVzaEJ1ZmZlcikKLSAgICAgICAgaDI2NGJzZEZsdXNoQnVmZmVyKCZwRGVjQ29udC0+c3RvcmFnZSk7Ci0KLSAgICBwT3V0UGljID0gKHUzMiopaDI2NGJzZE5leHRPdXRwdXRQaWN0dXJlKCZwRGVjQ29udC0+c3RvcmFnZSwgJnBpY0lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzSWRyUGljLCAmbnVtRXJyTWJzKTsKLQotICAgIGlmIChwT3V0UGljID09IE5VTEwpCi0gICAgewotICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjTmV4dFBpY3R1cmUjIE9LOiByZXR1cm4gSDI2NFNXREVDX09LIik7Ci0gICAgICAgIHJldHVybihIMjY0U1dERUNfT0spOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwT3V0cHV0LT5wT3V0cHV0UGljdHVyZSA9IHBPdXRQaWM7Ci0gICAgICAgIHBPdXRwdXQtPnBpY0lkICAgICAgICAgID0gcGljSWQ7Ci0gICAgICAgIHBPdXRwdXQtPmlzSWRyUGljdHVyZSAgID0gaXNJZHJQaWM7Ci0gICAgICAgIHBPdXRwdXQtPm5ick9mRXJyTUJzICAgID0gbnVtRXJyTWJzOwotICAgICAgICBERUNfQVBJX1RSQygiSDI2NFN3RGVjTmV4dFBpY3R1cmUjIE9LOiByZXR1cm4gSDI2NFNXREVDX1BJQ19SRFkiKTsKLSAgICAgICAgcmV0dXJuKEgyNjRTV0RFQ19QSUNfUkRZKTsKLSAgICB9Ci0KLX0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL1Rlc3RCZW5jaE11bHRpcGxlSW5zdGFuY2UuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvVGVzdEJlbmNoTXVsdGlwbGVJbnN0YW5jZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTM4NmJiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvVGVzdEJlbmNoTXVsdGlwbGVJbnN0YW5jZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKiBDVlMgdGFnIG5hbWUgZm9yIGlkZW50aWZpY2F0aW9uICovCi1jb25zdCBjaGFyIHRhZ05hbWVbMjU2XSA9ICIkTmFtZTogRklSU1RfQU5EUk9JRF9DT1BZUklHSFQgJCI7Ci0KLSNpbmNsdWRlICJIMjY0U3dEZWNBcGkuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIERFQlVHKGFyZ3YpIHByaW50ZiBhcmd2Ci0KLS8qIF9OT19PVVQgZGlzYWJsZXMgb3V0cHV0IGZpbGUgd3JpdGluZyAqLwotI2lmZGVmIF9fYXJtCi0jZGVmaW5lIF9OT19PVVQKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBXcml0ZU91dHB1dChGSUxFICpmaWQsIHU4ICpkYXRhLCB1MzIgcGljU2l6ZSk7Ci0KLXUzMiBDcm9wUGljdHVyZSh1OCAqcE91dEltYWdlLCB1OCAqcEluSW1hZ2UsCi0gICAgdTMyIHBpY1dpZHRoLCB1MzIgcGljSGVpZ2h0LCBDcm9wUGFyYW1zICpwQ3JvcFBhcmFtcyk7Ci0KLXZvaWQgQ3JvcFdyaXRlT3V0cHV0KEZJTEUgKmZpZCwgdTggKmltYWdlRGF0YSwgdTMyIGNyb3BEaXNwbGF5LAotICAgICAgICBIMjY0U3dEZWNJbmZvICpkZWNJbmZvKTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBIMjY0U3dEZWNJbnN0IGRlY0luc3Q7Ci0gICAgSDI2NFN3RGVjSW5wdXQgZGVjSW5wdXQ7Ci0gICAgSDI2NFN3RGVjT3V0cHV0IGRlY091dHB1dDsKLSAgICBIMjY0U3dEZWNQaWN0dXJlIGRlY1BpY3R1cmU7Ci0gICAgSDI2NFN3RGVjSW5mbyBkZWNJbmZvOwotICAgIEZJTEUgKmZvdXRwdXQ7Ci0gICAgY2hhciBvdXRGaWxlTmFtZVsyNTZdOwotICAgIHU4ICpieXRlU3RybVN0YXJ0OwotICAgIHUzMiBwaWNOdW1iZXI7Ci19IERlY29kZXI7Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLQotICAgIGkzMiBpbnN0Q291bnQsIGluc3RSdW5uaW5nOwotICAgIGkzMiBpOwotICAgIHUzMiBtYXhOdW1QaWNzOwotICAgIHUzMiBzdHJtTGVuOwotICAgIEgyNjRTd0RlY1JldCByZXQ7Ci0gICAgdTMyIG51bUVycm9ycyA9IDA7Ci0gICAgdTMyIGNyb3BEaXNwbGF5ID0gMDsKLSAgICB1MzIgZGlzYWJsZU91dHB1dFJlb3JkZXJpbmcgPSAwOwotICAgIEZJTEUgKmZpbnB1dDsKLSAgICBEZWNvZGVyICoqZGVjb2RlcjsKLSAgICBjaGFyIG91dEZpbGVOYW1lWzI1Nl0gPSAib3V0Lnl1diI7Ci0KLQotICAgIGlmICggYXJnYyA+IDEgJiYgc3RyY21wKGFyZ3ZbMV0sICItVCIpID09IDAgKQotICAgIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgdGFnTmFtZSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmIChhcmdjIDwgMikKLSAgICB7Ci0gICAgICAgIERFQlVHKCgKLSAgICAgICAgICAgICJVc2FnZTogJXMgWy1Obl0gWy1Pb3V0ZmlsZV0gWy1QXSBbLVVdIFstQ10gWy1SXSBbLVRdIGZpbGUxLjI2NCBbZmlsZTIuMjY0XSAuLiBbZmlsZU4uMjY0XVxuIiwKLSAgICAgICAgICAgIGFyZ3ZbMF0pKTsKLSAgICAgICAgREVCVUcoKCJcdC1ObiBmb3JjZXMgZGVjb2RpbmcgdG8gc3RvcCBhZnRlciBuIHBpY3R1cmVzXG4iKSk7Ci0jaWYgZGVmaW5lZChfTk9fT1VUKQotICAgICAgICBERUJVRygoIlx0LU9vdXRmaWxlIG91dHB1dCB3cml0aW5nIGRpc2FibGVkIGF0IGNvbXBpbGUgdGltZVxuIikpOwotI2Vsc2UKLSAgICAgICAgREVCVUcoKCJcdC1Pb3V0ZmlsZSB3cml0ZSBvdXRwdXQgdG8gXCJvdXRmaWxlXCIgKGRlZmF1bHQgb3V0Lnl1dilcbiIpKTsKLSAgICAgICAgREVCVUcoKCJcdC1Pbm9uZSBkb2VzIG5vdCB3cml0ZSBvdXRwdXRcbiIpKTsKLSNlbmRpZgotICAgICAgICBERUJVRygoIlx0LUMgZGlzcGxheSBjcm9wcGVkIGltYWdlIChkZWZhdWx0IGRlY29kZWQgaW1hZ2UpXG4iKSk7Ci0gICAgICAgIERFQlVHKCgiXHQtUiBkaXNhYmxlIERQQiBvdXRwdXQgcmVvcmRlcmluZ1xuIikpOwotICAgICAgICBERUJVRygoIlx0LVQgdG8gcHJpbnQgdGFnIG5hbWUgYW5kIGV4aXRcbiIpKTsKLSAgICAgICAgZXhpdCgxMDApOwotICAgIH0KLQotICAgIGluc3RDb3VudCA9IGFyZ2MgLSAxOwotCi0gICAgLyogcmVhZCBjb21tYW5kIGxpbmUgYXJndW1lbnRzICovCi0gICAgbWF4TnVtUGljcyA9IDA7Ci0gICAgZm9yIChpID0gMTsgaSA8IChhcmdjLTEpOyBpKyspCi0gICAgewotICAgICAgICBpZiAoIHN0cm5jbXAoYXJndltpXSwgIi1OIiwgMikgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1heE51bVBpY3MgPSAodTMyKWF0b2koYXJndltpXSsyKTsKLSAgICAgICAgICAgIGluc3RDb3VudC0tOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBzdHJuY21wKGFyZ3ZbaV0sICItTyIsIDIpID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJjcHkob3V0RmlsZU5hbWUsIGFyZ3ZbaV0rMik7Ci0gICAgICAgICAgICBpbnN0Q291bnQtLTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggc3RyY21wKGFyZ3ZbaV0sICItQyIpID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjcm9wRGlzcGxheSA9IDE7Ci0gICAgICAgICAgICBpbnN0Q291bnQtLTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggc3RyY21wKGFyZ3ZbaV0sICItUiIpID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBkaXNhYmxlT3V0cHV0UmVvcmRlcmluZyA9IDE7Ci0gICAgICAgICAgICBpbnN0Q291bnQtLTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChpbnN0Q291bnQgPCAxKQotICAgIHsKLSAgICAgICAgREVCVUcoKCJObyBpbnB1dCBmaWxlc1xuIikpOwotICAgICAgICBleGl0KDEwMCk7Ci0gICAgfQotCi0gICAgLyogYWxsb2NhdGUgbWVtb3J5IGZvciBtdWx0aXBsZSBkZWNvZGVyIGluc3RhbmNlcwotICAgICAqIG9uZSBpbnN0YW5jZSBmb3IgZXZlcnkgc3RyZWFtIGZpbGUgKi8KLSAgICBkZWNvZGVyID0gKERlY29kZXIgKiopbWFsbG9jKHNpemVvZihEZWNvZGVyKikqKHUzMilpbnN0Q291bnQpOwotICAgIGlmIChkZWNvZGVyID09IE5VTEwpCi0gICAgewotICAgICAgICBERUJVRygoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpKTsKLSAgICAgICAgZXhpdCgxMDApOwotICAgIH0KLQotICAgIC8qIHByZXBhcmUgZWFjaCBkZWNvZGVyIGluc3RhbmNlICovCi0gICAgZm9yIChpID0gMDsgaSA8IGluc3RDb3VudDsgaSsrKQotICAgIHsKLSAgICAgICAgZGVjb2RlcltpXSA9IChEZWNvZGVyICopY2FsbG9jKDEsIHNpemVvZihEZWNvZGVyKSk7Ci0KLSAgICAgICAgLyogb3BlbiBpbnB1dCBmaWxlICovCi0gICAgICAgIGZpbnB1dCA9IGZvcGVuKGFyZ3ZbYXJnYy1pbnN0Q291bnQraV0sInJiIik7Ci0gICAgICAgIGlmIChmaW5wdXQgPT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgREVCVUcoKCJVbmFibGUgdG8gb3BlbiBpbnB1dCBmaWxlIDwlcz5cbiIsIGFyZ3ZbYXJnYy1pbnN0Q291bnQraV0pKTsKLSAgICAgICAgICAgIGV4aXQoMTAwKTsKLSAgICAgICAgfQotCi0gICAgICAgIERFQlVHKCgiUmVhZGluZyBpbnB1dCBmaWxlWyVkXSAlc1xuIiwgaSwgYXJndlthcmdjLWluc3RDb3VudCtpXSkpOwotCi0gICAgICAgIC8qIHJlYWQgaW5wdXQgc3RyZWFtIHRvIGJ1ZmZlciAqLwotICAgICAgICBmc2VlayhmaW5wdXQsMEwsU0VFS19FTkQpOwotICAgICAgICBzdHJtTGVuID0gKHUzMilmdGVsbChmaW5wdXQpOwotICAgICAgICByZXdpbmQoZmlucHV0KTsKLSAgICAgICAgZGVjb2RlcltpXS0+Ynl0ZVN0cm1TdGFydCA9ICh1OCAqKW1hbGxvYyhzaXplb2YodTgpKnN0cm1MZW4pOwotICAgICAgICBpZiAoZGVjb2RlcltpXS0+Ynl0ZVN0cm1TdGFydCA9PSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBERUJVRygoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpKTsKLSAgICAgICAgICAgIGV4aXQoMTAwKTsKLSAgICAgICAgfQotICAgICAgICBmcmVhZChkZWNvZGVyW2ldLT5ieXRlU3RybVN0YXJ0LCBzaXplb2YodTgpLCBzdHJtTGVuLCBmaW5wdXQpOwotICAgICAgICBmY2xvc2UoZmlucHV0KTsKLQotICAgICAgICAvKiBvcGVuIG91dHB1dCBmaWxlICovCi0gICAgICAgIGlmIChzdHJjbXAob3V0RmlsZU5hbWUsICJub25lIikgIT0gMCkKLSAgICAgICAgewotI2lmIGRlZmluZWQoX05PX09VVCkKLSAgICAgICAgICAgIGRlY29kZXJbaV0tPmZvdXRwdXQgPSBOVUxMOwotI2Vsc2UKLSAgICAgICAgICAgIHNwcmludGYoZGVjb2RlcltpXS0+b3V0RmlsZU5hbWUsICIlcyVpIiwgb3V0RmlsZU5hbWUsIGkpOwotICAgICAgICAgICAgZGVjb2RlcltpXS0+Zm91dHB1dCA9IGZvcGVuKGRlY29kZXJbaV0tPm91dEZpbGVOYW1lLCAid2IiKTsKLSAgICAgICAgICAgIGlmIChkZWNvZGVyW2ldLT5mb3V0cHV0ID09IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREVCVUcoKCJVbmFibGUgdG8gb3BlbiBvdXRwdXQgZmlsZVxuIikpOwotICAgICAgICAgICAgICAgIGV4aXQoMTAwKTsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICB9Ci0KLSAgICAgICAgcmV0ID0gSDI2NFN3RGVjSW5pdCgmKGRlY29kZXJbaV0tPmRlY0luc3QpLCBkaXNhYmxlT3V0cHV0UmVvcmRlcmluZyk7Ci0KLSAgICAgICAgaWYgKHJldCAhPSBIMjY0U1dERUNfT0spCi0gICAgICAgIHsKLSAgICAgICAgICAgIERFQlVHKCgiSW5pdCBmYWlsZWQgJWRcbiIsIHJldCkpOwotICAgICAgICAgICAgZXhpdCgxMDApOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQucFN0cmVhbSA9IGRlY29kZXJbaV0tPmJ5dGVTdHJtU3RhcnQ7Ci0gICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LmRhdGFMZW4gPSBzdHJtTGVuOwotICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbnB1dC5pbnRyYUNvbmNlYWxtZW50TWV0aG9kID0gMDsKLQotICAgIH0KLQotICAgIC8qIG1haW4gZGVjb2RpbmcgbG9vcCAqLwotICAgIGRvCi0gICAgewotICAgICAgICAvKiBkZWNvZGUgb25jZSB1c2luZyBlYWNoIGluc3RhbmNlICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbnN0Q291bnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0ID0gSDI2NFN3RGVjRGVjb2RlKGRlY29kZXJbaV0tPmRlY0luc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoZGVjb2RlcltpXS0+ZGVjSW5wdXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGRlY29kZXJbaV0tPmRlY091dHB1dCkpOwotCi0gICAgICAgICAgICBzd2l0Y2gocmV0KQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgY2FzZSBIMjY0U1dERUNfSERSU19SRFlfQlVGRl9OT1RfRU1QVFk6Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gSDI2NFN3RGVjR2V0SW5mbyhkZWNvZGVyW2ldLT5kZWNJbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoZGVjb2RlcltpXS0+ZGVjSW5mbykpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IEgyNjRTV0RFQ19PSykKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNyb3BEaXNwbGF5ICYmIGRlY29kZXJbaV0tPmRlY0luZm8uY3JvcHBpbmdGbGFnKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBERUJVRygoIkRlY29kZXJbJWRdIENyb3BwaW5nIHBhcmFtczogKCVkLCAlZCkgJWR4JWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbmZvLmNyb3BQYXJhbXMuY3JvcExlZnRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5mby5jcm9wUGFyYW1zLmNyb3BUb3BPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5mby5jcm9wUGFyYW1zLmNyb3BPdXRXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbmZvLmNyb3BQYXJhbXMuY3JvcE91dEhlaWdodCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgREVCVUcoKCJEZWNvZGVyWyVkXSBXaWR0aCAlZCBIZWlnaHQgJWRcbiIsIGksCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbmZvLnBpY1dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5mby5waWNIZWlnaHQpKTsKLQotICAgICAgICAgICAgICAgICAgICBERUJVRygoIkRlY29kZXJbJWRdIHZpZGVvUmFuZ2UgJWQsIG1hdHJpY0NvZWZmaWNpZW50cyAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGksIGRlY29kZXJbaV0tPmRlY0luZm8udmlkZW9SYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0luZm8ubWF0cml4Q29lZmZpY2llbnRzKSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LmRhdGFMZW4gLT0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1MzIpKGRlY29kZXJbaV0tPmRlY091dHB1dC5wU3RybUN1cnJQb3MgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQucFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LnBTdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjT3V0cHV0LnBTdHJtQ3VyclBvczsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIEgyNjRTV0RFQ19QSUNfUkRZX0JVRkZfTk9UX0VNUFRZOgotICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbnB1dC5kYXRhTGVuIC09Ci0gICAgICAgICAgICAgICAgICAgICAgICAodTMyKShkZWNvZGVyW2ldLT5kZWNPdXRwdXQucFN0cm1DdXJyUG9zIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LnBTdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbnB1dC5wU3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY091dHB1dC5wU3RybUN1cnJQb3M7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1BJQ19SRFk6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gSDI2NFNXREVDX1BJQ19SRFkpCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNJbnB1dC5kYXRhTGVuID0gMDsKLQotICAgICAgICAgICAgICAgICAgICByZXQgPSBIMjY0U3dEZWNHZXRJbmZvKGRlY29kZXJbaV0tPmRlY0luc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJihkZWNvZGVyW2ldLT5kZWNJbmZvKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gSDI2NFNXREVDX09LKQotICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoSDI2NFN3RGVjTmV4dFBpY3R1cmUoZGVjb2RlcltpXS0+ZGVjSW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGRlY29kZXJbaV0tPmRlY1BpY3R1cmUpLCAwKSA9PSBIMjY0U1dERUNfUElDX1JEWSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+cGljTnVtYmVyKys7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG51bUVycm9ycyArPSBkZWNvZGVyW2ldLT5kZWNQaWN0dXJlLm5ick9mRXJyTUJzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBERUJVRygoIkRlY29kZXJbJWRdIFBJQyAlZCwgdHlwZSAlcywgY29uY2VhbGVkICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGRlY29kZXJbaV0tPnBpY051bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNQaWN0dXJlLmlzSWRyUGljdHVyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJJRFIiIDogIk5PTi1JRFIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY1BpY3R1cmUubmJyT2ZFcnJNQnMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBDcm9wV3JpdGVPdXRwdXQoZGVjb2RlcltpXS0+Zm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHU4KilkZWNvZGVyW2ldLT5kZWNQaWN0dXJlLnBPdXRwdXRQaWN0dXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wRGlzcGxheSwgJihkZWNvZGVyW2ldLT5kZWNJbmZvKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAobWF4TnVtUGljcyAmJiBkZWNvZGVyW2ldLT5waWNOdW1iZXIgPT0gbWF4TnVtUGljcykKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY0lucHV0LmRhdGFMZW4gPSAwOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1NUUk1fUFJPQ0VTU0VEOgotICAgICAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1NUUk1fRVJSOgotICAgICAgICAgICAgICAgIGNhc2UgSDI2NFNXREVDX1BBUkFNX0VSUjoKLSAgICAgICAgICAgICAgICAgICAgZGVjb2RlcltpXS0+ZGVjSW5wdXQuZGF0YUxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgREVCVUcoKCJEZWNvZGVyWyVkXSBGQVRBTCBFUlJPUlxuIiwgaSkpOwotICAgICAgICAgICAgICAgICAgICBleGl0KDEwKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIGNoZWNrIGlmIGFueSBvZiB0aGUgaW5zdGFuY2VzIGlzIHN0aWxsIHJ1bm5pbmcgKD1oYXMgbW9yZSBkYXRhKSAqLwotICAgICAgICBpbnN0UnVubmluZyA9IGluc3RDb3VudDsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGluc3RDb3VudDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGVjb2RlcltpXS0+ZGVjSW5wdXQuZGF0YUxlbiA9PSAwKQotICAgICAgICAgICAgICAgIGluc3RSdW5uaW5nLS07Ci0gICAgICAgIH0KLQotICAgIH0gd2hpbGUgKGluc3RSdW5uaW5nKTsKLQotCi0gICAgLyogZ2V0IGxhc3QgZnJhbWVzIGFuZCBjbG9zZSBlYWNoIGluc3RhbmNlICovCi0gICAgZm9yIChpID0gMDsgaSA8IGluc3RDb3VudDsgaSsrKQotICAgIHsKLSAgICAgICAgd2hpbGUgKEgyNjRTd0RlY05leHRQaWN0dXJlKGRlY29kZXJbaV0tPmRlY0luc3QsCi0gICAgICAgICAgICAgICAgJihkZWNvZGVyW2ldLT5kZWNQaWN0dXJlKSwgMSkgPT0gSDI2NFNXREVDX1BJQ19SRFkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlY29kZXJbaV0tPnBpY051bWJlcisrOwotCi0gICAgICAgICAgICBERUJVRygoIkRlY29kZXJbJWRdIFBJQyAlZCwgdHlwZSAlcywgY29uY2VhbGVkICVkXG4iLAotICAgICAgICAgICAgICAgIGksIGRlY29kZXJbaV0tPnBpY051bWJlciwKLSAgICAgICAgICAgICAgICBkZWNvZGVyW2ldLT5kZWNQaWN0dXJlLmlzSWRyUGljdHVyZQotICAgICAgICAgICAgICAgICAgICA/ICJJRFIiIDogIk5PTi1JRFIiLAotICAgICAgICAgICAgICAgIGRlY29kZXJbaV0tPmRlY1BpY3R1cmUubmJyT2ZFcnJNQnMpKTsKLSAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOwotCi0gICAgICAgICAgICBDcm9wV3JpdGVPdXRwdXQoZGVjb2RlcltpXS0+Zm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgKHU4KilkZWNvZGVyW2ldLT5kZWNQaWN0dXJlLnBPdXRwdXRQaWN0dXJlLAotICAgICAgICAgICAgICAgICAgICBjcm9wRGlzcGxheSwgJihkZWNvZGVyW2ldLT5kZWNJbmZvKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBIMjY0U3dEZWNSZWxlYXNlKGRlY29kZXJbaV0tPmRlY0luc3QpOwotCi0gICAgICAgIGlmIChkZWNvZGVyW2ldLT5mb3V0cHV0KQotICAgICAgICAgICAgZmNsb3NlKGRlY29kZXJbaV0tPmZvdXRwdXQpOwotCi0gICAgICAgIGZyZWUoZGVjb2RlcltpXS0+Ynl0ZVN0cm1TdGFydCk7Ci0KLSAgICAgICAgZnJlZShkZWNvZGVyW2ldKTsKLSAgICB9Ci0KLSAgICBmcmVlKGRlY29kZXIpOwotCi0gICAgaWYgKG51bUVycm9ycykKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gMDsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBDcm9wV3JpdGVPdXRwdXQoRklMRSAqZm91dHB1dCwgdTggKmltYWdlRGF0YSwgdTMyIGNyb3BEaXNwbGF5LAotICAgICAgICBIMjY0U3dEZWNJbmZvICpkZWNJbmZvKQotewotICAgIHU4ICp0bXBJbWFnZSA9IE5VTEw7Ci0gICAgdTMyIHRtcCwgcGljU2l6ZTsKLQotICAgIGlmIChjcm9wRGlzcGxheSAmJiBkZWNJbmZvLT5jcm9wcGluZ0ZsYWcpCi0gICAgewotICAgICAgICBwaWNTaXplID0gZGVjSW5mby0+Y3JvcFBhcmFtcy5jcm9wT3V0V2lkdGggKgotICAgICAgICAgICAgICAgICAgZGVjSW5mby0+Y3JvcFBhcmFtcy5jcm9wT3V0SGVpZ2h0OwotICAgICAgICBwaWNTaXplID0gKDMgKiBwaWNTaXplKS8yOwotICAgICAgICB0bXBJbWFnZSA9IG1hbGxvYyhwaWNTaXplKTsKLSAgICAgICAgaWYgKHRtcEltYWdlID09IE5VTEwpCi0gICAgICAgICAgICBleGl0KDEpOwotICAgICAgICB0bXAgPSBDcm9wUGljdHVyZSh0bXBJbWFnZSwgaW1hZ2VEYXRhLAotICAgICAgICAgICAgZGVjSW5mby0+cGljV2lkdGgsIGRlY0luZm8tPnBpY0hlaWdodCwKLSAgICAgICAgICAgICYoZGVjSW5mby0+Y3JvcFBhcmFtcykpOwotICAgICAgICBpZiAodG1wKQotICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgV3JpdGVPdXRwdXQoZm91dHB1dCwgdG1wSW1hZ2UsIHBpY1NpemUpOwotICAgICAgICBmcmVlKHRtcEltYWdlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcGljU2l6ZSA9IGRlY0luZm8tPnBpY1dpZHRoICogZGVjSW5mby0+cGljSGVpZ2h0OwotICAgICAgICBwaWNTaXplID0gKDMgKiBwaWNTaXplKS8yOwotICAgICAgICBXcml0ZU91dHB1dChmb3V0cHV0LCBpbWFnZURhdGEsIHBpY1NpemUpOwotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBXcml0ZU91dHB1dChGSUxFICpmaWQsIHU4ICpkYXRhLCB1MzIgcGljU2l6ZSkKLXsKLSAgICBpZiAoZmlkKQotICAgICAgICBmd3JpdGUoZGF0YSwgMSwgcGljU2l6ZSwgZmlkKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNUcmFjZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBIMjY0U3dEZWNUcmFjZShjaGFyICpzdHJpbmcpCi17Ci0gICAgRklMRSAqZnA7Ci0KLSAgICBmcCA9IGZvcGVuKCJkZWNfYXBpLnRyYyIsICJhdCIpOwotCi0gICAgaWYgKCFmcCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZndyaXRlKHN0cmluZywgMSwgc3RybGVuKHN0cmluZyksIGZwKTsKLSAgICBmd3JpdGUoIlxuIiwgMSwxLCBmcCk7Ci0KLSAgICBmY2xvc2UoZnApOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogIEgyNjRTd0RlY21hbGxvYwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCogSDI2NFN3RGVjTWFsbG9jKHUzMiBzaXplLCB1MzIgbnVtKQotewotICAgIGlmIChzaXplID4gVUlOVDMyX01BWCAvIG51bSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIG1hbGxvYyhzaXplICogbnVtKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNGcmVlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEgyNjRTd0RlY0ZyZWUodm9pZCAqcHRyKQotewotICAgIGZyZWUocHRyKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNNZW1jcHkKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgSDI2NFN3RGVjTWVtY3B5KHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgdTMyIGNvdW50KQotewotICAgIG1lbWNweShkZXN0LCBzcmMsIGNvdW50KTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6ICBIMjY0U3dEZWNNZW1zZXQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgSDI2NFN3RGVjTWVtc2V0KHZvaWQgKnB0ciwgaTMyIHZhbHVlLCB1MzIgY291bnQpCi17Ci0gICAgbWVtc2V0KHB0ciwgdmFsdWUsIGNvdW50KTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6IENyb3BQaWN0dXJlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgQ3JvcFBpY3R1cmUodTggKnBPdXRJbWFnZSwgdTggKnBJbkltYWdlLAotICAgIHUzMiBwaWNXaWR0aCwgdTMyIHBpY0hlaWdodCwgQ3JvcFBhcmFtcyAqcENyb3BQYXJhbXMpCi17Ci0KLSAgICB1MzIgaSwgajsKLSAgICB1MzIgb3V0V2lkdGgsIG91dEhlaWdodDsKLSAgICB1OCAqcE91dCwgKnBJbjsKLQotICAgIGlmIChwT3V0SW1hZ2UgPT0gTlVMTCB8fCBwSW5JbWFnZSA9PSBOVUxMIHx8IHBDcm9wUGFyYW1zID09IE5VTEwgfHwKLSAgICAgICAgIXBpY1dpZHRoIHx8ICFwaWNIZWlnaHQpCi0gICAgewotICAgICAgICAvKiBkdWUgdG8gbGludCB3YXJuaW5nICovCi0gICAgICAgIGZyZWUocE91dEltYWdlKTsKLSAgICAgICAgcmV0dXJuKDEpOwotICAgIH0KLQotICAgIGlmICggKChwQ3JvcFBhcmFtcy0+Y3JvcExlZnRPZmZzZXQgKyBwQ3JvcFBhcmFtcy0+Y3JvcE91dFdpZHRoKSA+Ci0gICAgICAgICAgIHBpY1dpZHRoICkgfHwKLSAgICAgICAgICgocENyb3BQYXJhbXMtPmNyb3BUb3BPZmZzZXQgKyBwQ3JvcFBhcmFtcy0+Y3JvcE91dEhlaWdodCkgPgotICAgICAgICAgICBwaWNIZWlnaHQgKSApCi0gICAgewotICAgICAgICAvKiBkdWUgdG8gbGludCB3YXJuaW5nICovCi0gICAgICAgIGZyZWUocE91dEltYWdlKTsKLSAgICAgICAgcmV0dXJuKDEpOwotICAgIH0KLQotICAgIG91dFdpZHRoID0gcENyb3BQYXJhbXMtPmNyb3BPdXRXaWR0aDsKLSAgICBvdXRIZWlnaHQgPSBwQ3JvcFBhcmFtcy0+Y3JvcE91dEhlaWdodDsKLQotICAgIHBJbiA9IHBJbkltYWdlICsgcENyb3BQYXJhbXMtPmNyb3BUb3BPZmZzZXQqcGljV2lkdGggKwotICAgICAgICBwQ3JvcFBhcmFtcy0+Y3JvcExlZnRPZmZzZXQ7Ci0gICAgcE91dCA9IHBPdXRJbWFnZTsKLQotICAgIC8qIGx1bWEgKi8KLSAgICBmb3IgKGkgPSBvdXRIZWlnaHQ7IGk7IGktLSkKLSAgICB7Ci0gICAgICAgIGZvciAoaiA9IG91dFdpZHRoOyBqOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwT3V0KysgPSAqcEluKys7Ci0gICAgICAgIH0KLSAgICAgICAgcEluICs9IHBpY1dpZHRoIC0gb3V0V2lkdGg7Ci0gICAgfQotCi0gICAgb3V0V2lkdGggPj49IDE7Ci0gICAgb3V0SGVpZ2h0ID4+PSAxOwotCi0gICAgcEluID0gcEluSW1hZ2UgKyBwaWNXaWR0aCpwaWNIZWlnaHQgKwotICAgICAgICBwQ3JvcFBhcmFtcy0+Y3JvcFRvcE9mZnNldCpwaWNXaWR0aC80ICsgcENyb3BQYXJhbXMtPmNyb3BMZWZ0T2Zmc2V0LzI7Ci0KLSAgICAvKiBjYiAqLwotICAgIGZvciAoaSA9IG91dEhlaWdodDsgaTsgaS0tKQotICAgIHsKLSAgICAgICAgZm9yIChqID0gb3V0V2lkdGg7IGo7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgKnBPdXQrKyA9ICpwSW4rKzsKLSAgICAgICAgfQotICAgICAgICBwSW4gKz0gcGljV2lkdGgvMiAtIG91dFdpZHRoOwotICAgIH0KLQotICAgIHBJbiA9IHBJbkltYWdlICsgNSpwaWNXaWR0aCpwaWNIZWlnaHQvNCArCi0gICAgICAgIHBDcm9wUGFyYW1zLT5jcm9wVG9wT2Zmc2V0KnBpY1dpZHRoLzQgKyBwQ3JvcFBhcmFtcy0+Y3JvcExlZnRPZmZzZXQvMjsKLQotICAgIC8qIGNyICovCi0gICAgZm9yIChpID0gb3V0SGVpZ2h0OyBpOyBpLS0pCi0gICAgewotICAgICAgICBmb3IgKGogPSBvdXRXaWR0aDsgajsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcE91dCsrID0gKnBJbisrOwotICAgICAgICB9Ci0gICAgICAgIHBJbiArPSBwaWNXaWR0aC8yIC0gb3V0V2lkdGg7Ci0gICAgfQotCi0gICAgcmV0dXJuICgwKTsKLQotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV9ob3IucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfY2hyb21hX2hvci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzRhNDg0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfY2hyb21hX2hvci5zCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLTsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLTsKLTsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ci07ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ci07IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07LS0KLTstLSBBYnN0cmFjdCA6IEFSTXY2IG9wdGltaXplZCB2ZXJzaW9uIG9mIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvciBmdW5jdGlvbgotOy0tCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLSAgICBJRiAgOkRFRjogSDI2NERFQ19XSU5BU00KLSAgICAgICAgOy8vIFdlIGRvbnQgdXNlIFJFUVVJUkU4IGFuZCBQUkVTRVJWRTggZm9yIHdpbmFzbQotICAgIEVMU0UKLSAgICAgICAgUkVRVUlSRTgKLSAgICAgICAgUFJFU0VSVkU4Ci0gICAgRU5ESUYKLQotICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQotCi0KLTsvLyBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3IgcmVnaXN0ZXIgYWxsb2NhdGlvbgotCi1yZWYgICAgIFJOIDAKLXB0ckEgICAgUk4gMAotCi1tYiAgICAgIFJOIDEKLWJsb2NrICAgUk4gMQotCi14MCAgICAgIFJOIDIKLWNvdW50ICAgUk4gMgotCi15MCAgICAgIFJOIDMKLXZhbFggICAgUk4gMwotCi13aWR0aCAgIFJOIDQKLQotaGVpZ2h0ICBSTiA1Ci10bXA3ICAgIFJOIDUKLQotY2hyUFcgICBSTiA2Ci10bXA4ICAgIFJOIDYKLQotdG1wMSAgICBSTiA3Ci1jaHJQSCAgIFJOIDcKLQotdG1wMiAgICBSTiA4Ci0KLXRtcDMgICAgUk4gOQotCi10bXA0ICAgIFJOIDEwCi0KLXRtcDUgICAgUk4gMTEKLQotdG1wNiAgICBSTiAxMgotCi1jMzIgICAgIFJOIDE0Ci14RnJhYyAgIFJOIDE0Ci0KLTsvLyBGdW5jdGlvbiBleHBvcnRzIGFuZCBpbXBvcnRzCi0KLSAgICBJTVBPUlQgIGgyNjRic2RGaWxsQmxvY2sKLQotICAgIEVYUE9SVCAgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yCi0KLTsvLyAgRnVuY3Rpb24gYXJndW1lbnRzCi07Ly8KLTsvLyAgdTggKnJlZiwgICAgICAgICAgICAgICAgICAgOiAweGM0Ci07Ly8gIHU4ICpwcmVkUGFydENocm9tYSwgICAgICAgIDogMHhjOAotOy8vICBpMzIgeDAsICAgICAgICAgICAgICAgICAgICA6IDB4Y2MKLTsvLyAgaTMyIHkwLCAgICAgICAgICAgICAgICAgICAgOiAweGQwCi07Ly8gIHUzMiB3aWR0aCwgICAgICAgICAgICAgICAgIDogMHhmOAotOy8vICB1MzIgaGVpZ2h0LCAgICAgICAgICAgICAgICA6IDB4ZmMKLTsvLyAgdTMyIHhGcmFjLCAgICAgICAgICAgICAgICAgOiAweDEwMAotOy8vICB1MzIgY2hyb21hUGFydFdpZHRoLCAgICAgICA6IDB4MTA0Ci07Ly8gIHUzMiBjaHJvbWFQYXJ0SGVpZ2h0ICAgICAgIDogMHgxMDgKLQotaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yCi0gICAgU1RNRkQgICBzcCEsIHtyMC1yMTEsbHJ9Ci0gICAgU1VCICAgICBzcCwgc3AsICMweGM0Ci0KLSAgICBMRFIgICAgIGNoclBXLCBbc3AsICMweDEwNF0gICAgIDsvLyBjaHJvbWFQYXJ0V2lkdGgKLSAgICBMRFIgICAgIHdpZHRoLCBbc3AsICMweGY4XSAgICAgIDsvLyB3aWR0aAotICAgIENNUCAgICAgeDAsICMwCi0gICAgQkxUICAgICBkb19maWxsCi0KLSAgICBBREQgICAgIHRtcDYsIHgwLCBjaHJQVyAgICAgICAgIDsvLyB0bXA2ID0geDArIGNocm9tYVBhcnRXaWR0aAotICAgIEFERCAgICAgdG1wNiwgdG1wNiwgIzEgICAgICAgICAgOy8vIHRtcDYgPSB4MCArIGNocm9tYVBhcnRXaWR0aCArIDEKLSAgICBDTVAgICAgIHRtcDYsIHdpZHRoICAgICAgICAgICAgIDsvLyB4MCtjaHJvbWFQYXJ0V2lkdGgrMSA+IHdpZHRoCi0gICAgQkhJICAgICBkb19maWxsCi0KLSAgICBDTVAgICAgIHkwLCAjMAotICAgIEJMVCAgICAgZG9fZmlsbAotICAgIExEUiAgICAgY2hyUEgsIFtzcCwgIzB4MTA4XSAgICAgOy8vIGNocm9tYVBhcnRIZWlnaHQKLSAgICBMRFIgICAgIGhlaWdodCwgW3NwLCAjMHhmY10gICAgIDsvLyBoZWlnaHQKLSAgICBBREQgICAgIHRtcDYsIHkwLCBjaHJQSCAgICAgICAgIDsvLyB0bXA2ID0geTAgKyBjaHJvbWFQYXJ0SGVpZ2h0Ci0gICAgQ01QICAgICB0bXA2LCBoZWlnaHQKLSAgICBCTFMgICAgIHNraXBfZmlsbAotCi1kb19maWxsCi0gICAgTERSICAgICBjaHJQSCwgW3NwLCAjMHgxMDhdICAgICA7Ly8gY2hyb21hUGFydEhlaWdodAotICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsICMweGZjXSAgICAgOy8vIGhlaWdodAotICAgIEFERCAgICAgdG1wOCwgY2hyUFcsICMxICAgICAgICAgOy8vIHRtcDggPSBjaHJvbWFQYXJ0V2lkdGgrMQotICAgIE1PViAgICAgdG1wMiwgdG1wOCAgICAgICAgICAgICAgOy8vIHRtcDIgPSBjaHJvbWFQYXJ0V2lkdGgrMQotICAgIFNUTUlBICAgc3Ase3dpZHRoLGhlaWdodCx0bXA4LGNoclBILHRtcDJ9Ci0gICAgQUREICAgICBibG9jaywgc3AsICMweDFjICAgICAgICA7Ly8gYmxvY2sKLSAgICBCTCAgICAgIGgyNjRic2RGaWxsQmxvY2sKLQotICAgIExEUiAgICAgeDAsIFtzcCwgIzB4Y2NdCi0gICAgTERSICAgICB5MCwgW3NwLCAjMHhkMF0KLSAgICBMRFIgICAgIHJlZiwgW3NwLCAjMHhjNF0gICAgICAgIDsvLyByZWYKLSAgICBTVE1JQSAgIHNwLHt3aWR0aCxoZWlnaHQsdG1wOCxjaHJQSCx0bXAyfQotICAgIEFERCAgICAgYmxvY2ssIHNwLCAjMHgxYyAgICAgICAgOy8vIGJsb2NrCi0gICAgTUxBICAgICByZWYsIGhlaWdodCwgd2lkdGgsIHJlZiA7Ly8gcmVmICs9IHdpZHRoICogaGVpZ2h0OyAKLSAgICBNTEEgICAgIGJsb2NrLCBjaHJQSCwgdG1wOCwgYmxvY2s7Ly8gYmxvY2sgKyAoY2hyb21hUEgpKihjaHJvbWFQVysxKQotICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jawotCi0gICAgTU9WICAgICB4MCwgIzAgICAgICAgICAgICAgICAgICA7Ly8geDAgPSAwCi0gICAgTU9WICAgICB5MCwgIzAgICAgICAgICAgICAgICAgICA7Ly8geTAgPSAwCi0gICAgU1RSICAgICB4MCwgW3NwLCAjMHhjY10KLSAgICBTVFIgICAgIHkwLCBbc3AsICMweGQwXQotICAgIEFERCAgICAgcmVmLCBzcCwgIzB4MWMgICAgICAgICAgOy8vIHJlZiA9IGJsb2NrCi0gICAgU1RSICAgICByZWYsIFtzcCwgIzB4YzRdICAgICAgICA7Ly8gcmVmCi0KLSAgICBTVFIgICAgIGNoclBILCBbc3AsICMweGZjXSAgICAgIDsvLyBoZWlnaHQKLSAgICBTVFIgICAgIHRtcDgsIFtzcCwgIzB4ZjhdICAgICAgIDsvLyB3aWR0aAotICAgIE1PViAgICAgd2lkdGgsIHRtcDgKLSAgICBTVUIgICAgIGNoclBXLCBjaHJQVywgIzEKLQotc2tpcF9maWxsCi0gICAgTUxBICAgICB0bXAzLCB5MCwgd2lkdGgsIHgwICAgICA7Ly8gdG1wMyA9IHkwKndpZHRoK3gwCi0gICAgTERSICAgICB4RnJhYywgW3NwLCAjMHgxMDBdICAgICA7Ly8geEZyYWMKLSAgICBBREQgICAgIHB0ckEsIHJlZiwgdG1wMyAgICAgICAgIDsvLyBwdHJBID0gcmVmICsgeTAqd2lkdGgreDAKLSAgICBSU0IgICAgIHZhbFgsIHhGcmFjLCAjOCAgICAgICAgIDsvLyB2YWxYID0gOC14RnJhYwotCi0gICAgTERSICAgICBtYiwgW3NwLCAjMHhjOF0gICAgICAgICA7Ly8gcHJlZFBhcnRDaHJvbWEKLQotCi0gICAgOy8vIHBhY2sgdmFsdWVzIHRvIGNvdW50IHJlZ2lzdGVyCi0gICAgOy8vIFszMToyOF0gbG9vcF94IChjaHJvbWFQYXJ0V2lkdGgtMSkKLSAgICA7Ly8gWzI3OjI0XSBsb29wX3kgKGNocm9tYVBhcnRIZWlnaHQtMSkKLSAgICA7Ly8gWzIzOjIwXSBjaHJvbWFQYXJ0V2lkdGgtMQotICAgIDsvLyBbMTk6MTZdIGNocm9tYVBhcnRIZWlnaHQtMQotICAgIDsvLyBbMTU6MDBdIG5vdGhpbmcKLQotICAgIFNVQiAgICAgdG1wMiwgY2hyUEgsICMxICAgICAgICAgICAgIDsvLyBjaHJvbWFQYXJ0SGVpZ2h0LTEKLSAgICBTVUIgICAgIHRtcDEsIGNoclBXLCAjMSAgICAgICAgICAgICA7Ly8gY2hyb21hUGFydFdpZHRoLTEKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICMxNiA7Ly8gY2hyb21hUGFydEhlaWdodC0xCi0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjMjQgOy8vIGxvb3BfeQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAxLCBMU0wgIzIwIDsvLyBjaHJvbWFQYXJ0V2lkdGgtMQotICAgIEFORCAgICAgdG1wMiwgY291bnQsICMweDAwRjAwMDAwICAgIDsvLyBsb29wX3gKLSAgICBQS0hCVCAgIHZhbFgsIHZhbFgsIHhGcmFjLCBMU0wgIzE2ICA7Ly8gfHhGcmFjfHZhbFggfAotICAgIE1PViAgICAgdmFsWCwgdmFsWCwgTFNMICMzICAgICAgICAgIDsvLyBtdWx0aXBseSBieSA4IGluIGFkdmFuY2UKLSAgICBNT1YgICAgIGMzMiwgIzMyCi0KLQotICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICA7Ly8gQ2IKLSAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICA7Ly8gMngyIHBlbHMgcGVyIGl0ZXJhdGlvbgotICAgIDsvLyBiaWxpbmVhciB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCi0KLWxvb3AxX3kKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICM4Ci0gICAgTERSQiAgICB0bXAxLCBbcHRyQSwgd2lkdGhdCi0gICAgTERSQiAgICB0bXAyLCBbcHRyQV0sICMxCi0KLWxvb3AxX3gKLSAgICBMRFJCICAgIHRtcDMsIFtwdHJBLCB3aWR0aF0KLSAgICBMRFJCICAgIHRtcDQsIFtwdHJBXSwgIzEKLQotICAgIFBLSEJUICAgdG1wNSwgdG1wMSwgdG1wMywgTFNMICMxNgotICAgIFBLSEJUICAgdG1wNiwgdG1wMiwgdG1wNCwgTFNMICMxNgotCi0gICAgTERSQiAgICB0bXAxLCBbcHRyQSwgd2lkdGhdCi0gICAgTERSQiAgICB0bXAyLCBbcHRyQV0sICMxCi0KLSAgICBTTUxBRCAgIHRtcDUsIHRtcDUsIHZhbFgsIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKLSAgICBTTUxBRCAgIHRtcDYsIHRtcDYsIHZhbFgsIGMzMiAgICAgICA7Ly8gbXVsdGlwbHkKLQotICAgIFBLSEJUICAgdG1wNywgdG1wMywgdG1wMSwgTFNMICMxNgotICAgIFBLSEJUICAgdG1wOCwgdG1wNCwgdG1wMiwgTFNMICMxNgotCi0gICAgU01MQUQgICB0bXA3LCB0bXA3LCB2YWxYLCBjMzIgICAgICAgOy8vIG11bHRpcGx5Ci0gICAgU01MQUQgICB0bXA4LCB0bXA4LCB2YWxYLCBjMzIgICAgICAgOy8vIG11bHRpcGx5Ci0KLSAgICBNT1YgICAgIHRtcDUsIHRtcDUsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wNSwgW21iLCM4XSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMiBjb2wgMQotCi0gICAgTU9WICAgICB0bXA2LCB0bXA2LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDYsIFttYl0sIzEgICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDEgY29sIDEKLQotICAgIE1PViAgICAgdG1wNywgdG1wNywgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXA3LCBbbWIsIzhdICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAyIGNvbCAyCi0KLSAgICBNT1YgICAgIHRtcDgsIHRtcDgsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wOCwgW21iXSwjMSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMSBjb2wgMgotCi0gICAgU1VCUyAgICBjb3VudCwgY291bnQsICMyPDwyOAotICAgIEJDUyAgICAgbG9vcDFfeAotCi0gICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKLQotICAgIEFERFMgICAgbWIsIG1iLCAjMTYKLSAgICBTQkMgICAgIG1iLCBtYiwgdG1wMiwgTFNSICMyMAotICAgIEFERCAgICAgcHRyQSwgcHRyQSwgd2lkdGgsIExTTCAjMQotICAgIFNCQyAgICAgcHRyQSwgcHRyQSwgdG1wMiwgTFNSICMyMAotICAgIFNVQiAgICAgcHRyQSwgcHRyQSwgIzEKLQotICAgIEFERFMgICAgY291bnQsIGNvdW50LCAjMHhFIDw8IDI0Ci0gICAgQkdFICAgICBsb29wMV95Ci0KLSAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgOy8vIENyCi0gICAgOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4ZmNdICAgICAgICAgIDsvLyBoZWlnaHQKLSAgICBMRFIgICAgIHJlZiwgW3NwLCAjMHhjNF0gICAgICAgICAgICA7Ly8gcmVmCi0gICAgTERSICAgICB0bXAxLCBbc3AsICMweGQwXSAgICAgICAgICAgOy8vIHkwCi0gICAgTERSICAgICB0bXAyLCBbc3AsICMweGNjXSAgICAgICAgICAgOy8vIHgwCi0gICAgTERSICAgICBtYiwgW3NwLCAjMHhjOF0gICAgICAgICAgICAgOy8vIHByZWRQYXJ0Q2hyb21hCi0KLSAgICBBREQgICAgIHRtcDEsIGhlaWdodCwgdG1wMQotICAgIE1MQSAgICAgdG1wMywgdG1wMSwgd2lkdGgsIHRtcDIKLSAgICBBREQgICAgIHB0ckEsIHJlZiwgdG1wMwotICAgIEFERCAgICAgbWIsIG1iLCAjNjQKLQotICAgIEFORCAgICAgY291bnQsIGNvdW50LCAjMHgwMEZGRkZGRgotICAgIEFORCAgICAgdG1wMSwgY291bnQsICMweDAwMEYwMDAwCi0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjOAotICAgIEFORCAgICAgdG1wMiwgY291bnQsICMweDAwRjAwMDAwCi0KLSAgICA7Ly8gMngyIHBlbHMgcGVyIGl0ZXJhdGlvbgotICAgIDsvLyBiaWxpbmVhciB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCi1sb29wMl95Ci0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjOAotICAgIExEUkIgICAgdG1wMSwgW3B0ckEsIHdpZHRoXQotICAgIExEUkIgICAgdG1wMiwgW3B0ckFdLCAjMQotCi1sb29wMl94Ci0gICAgTERSQiAgICB0bXAzLCBbcHRyQSwgd2lkdGhdCi0gICAgTERSQiAgICB0bXA0LCBbcHRyQV0sICMxCi0KLSAgICBQS0hCVCAgIHRtcDUsIHRtcDEsIHRtcDMsIExTTCAjMTYKLSAgICBQS0hCVCAgIHRtcDYsIHRtcDIsIHRtcDQsIExTTCAjMTYKLQotICAgIExEUkIgICAgdG1wMSwgW3B0ckEsIHdpZHRoXQotICAgIExEUkIgICAgdG1wMiwgW3B0ckFdLCAjMQotCi0gICAgU01MQUQgICB0bXA1LCB0bXA1LCB2YWxYLCBjMzIgICAgICAgOy8vIG11bHRpcGx5Ci0gICAgU01MQUQgICB0bXA2LCB0bXA2LCB2YWxYLCBjMzIgICAgICAgOy8vIG11bHRpcGx5Ci0KLSAgICBQS0hCVCAgIHRtcDcsIHRtcDMsIHRtcDEsIExTTCAjMTYKLSAgICBQS0hCVCAgIHRtcDgsIHRtcDQsIHRtcDIsIExTTCAjMTYKLQotICAgIFNNTEFEICAgdG1wNywgdG1wNywgdmFsWCwgYzMyICAgICAgIDsvLyBtdWx0aXBseQotICAgIFNNTEFEICAgdG1wOCwgdG1wOCwgdmFsWCwgYzMyICAgICAgIDsvLyBtdWx0aXBseQotCi0gICAgTU9WICAgICB0bXA1LCB0bXA1LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDUsIFttYiwjOF0gICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDIgY29sIDEKLQotICAgIE1PViAgICAgdG1wNiwgdG1wNiwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXA2LCBbbWJdLCMxICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAxIGNvbCAxCi0KLSAgICBNT1YgICAgIHRtcDcsIHRtcDcsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wNywgW21iLCM4XSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMiBjb2wgMgotCi0gICAgTU9WICAgICB0bXA4LCB0bXA4LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDgsIFttYl0sIzEgICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDEgY29sIDIKLQotICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjMjw8MjgKLSAgICBCQ1MgICAgIGxvb3AyX3gKLQotICAgIEFORCAgICAgdG1wMiwgY291bnQsICMweDAwRjAwMDAwCi0KLSAgICBBRERTICAgIG1iLCBtYiwgIzE2Ci0gICAgU0JDICAgICBtYiwgbWIsIHRtcDIsIExTUiAjMjAKLSAgICBBREQgICAgIHB0ckEsIHB0ckEsIHdpZHRoLCBMU0wgIzEKLSAgICBTQkMgICAgIHB0ckEsIHB0ckEsIHRtcDIsIExTUiAjMjAKLSAgICBTVUIgICAgIHB0ckEsIHB0ckEsICMxCi0KLSAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIzB4RSA8PCAyNAotICAgIEJHRSAgICAgbG9vcDJfeQotCi0gICAgQUREICAgICBzcCxzcCwjMHhkNAotICAgIExETUZEICAgc3AhLCB7cjQtcjExLHBjfQotCi0gICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV9ob3JfdmVyLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV9ob3JfdmVyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MjBhZDMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfaG9yX3Zlci5zCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLTsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLTsKLTsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ci07ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ci07IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07LS0KLTstLSBBYnN0cmFjdCA6IEFSTXY2IG9wdGltaXplZCB2ZXJzaW9uIG9mIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvclZlciAKLTstLSAgICAgICAgICAgIGZ1bmN0aW9uCi07LS0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotICAgIElGICA6REVGOiBIMjY0REVDX1dJTkFTTQotICAgICAgICA7Ly8gV2UgZG9udCB1c2UgUkVRVUlSRTggYW5kIFBSRVNFUlZFOCBmb3Igd2luYXNtCi0gICAgRUxTRQotICAgICAgICBSRVFVSVJFOAotICAgICAgICBQUkVTRVJWRTgKLSAgICBFTkRJRgotCi0gICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCi0KLQotOy8vIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvclZlciByZWdpc3RlciBhbGxvY2F0aW9uCi0KLXJlZiAgICAgUk4gMAotcHRyQSAgICBSTiAwCi0KLW1iICAgICAgUk4gMQotYmxvY2sgICBSTiAxCi0KLXgwICAgICAgUk4gMgotY291bnQgICBSTiAyCi0KLXkwICAgICAgUk4gMwotdmFsWSAgICBSTiAzCi0KLXdpZHRoICAgUk4gNAotCi10bXA0ICAgIFJOIDUKLWhlaWdodCAgUk4gNQotCi10bXAxICAgIFJOIDYKLQotdG1wMiAgICBSTiA3Ci0KLXRtcDMgICAgUk4gOAotCi12YWxYICAgIFJOIDkKLQotdG1wNSAgICBSTiAxMAotY2hyUFcgICBSTiAxMAotCi10bXA2ICAgIFJOIDExCi1jaHJQSCAgIFJOIDExCi0KLXhGcmFjICAgUk4gMTIKLQotYzMyICAgICBSTiAxNAoteUZyYWMgICBSTiAxNAotCi07Ly8gZnVuY3Rpb24gZXhwb3J0cyBhbmQgaW1wb3J0cwotCi0gICAgSU1QT1JUICBoMjY0YnNkRmlsbEJsb2NrCi0KLSAgICBFWFBPUlQgIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvclZlcgotCi07Ly8gIEZ1bmN0aW9uIGFyZ3VtZW50cwotOy8vCi07Ly8gIHU4ICpyZWYsICAgICAgICAgICAgICAgICAgIDogMHhjNAotOy8vICB1OCAqcHJlZFBhcnRDaHJvbWEsICAgICAgICA6IDB4YzgKLTsvLyAgaTMyIHgwLCAgICAgICAgICAgICAgICAgICAgOiAweGNjCi07Ly8gIGkzMiB5MCwgICAgICAgICAgICAgICAgICAgIDogMHhkMAotOy8vICB1MzIgd2lkdGgsICAgICAgICAgICAgICAgICA6IDB4ZjgKLTsvLyAgdTMyIGhlaWdodCwgICAgICAgICAgICAgICAgOiAweGZjCi07Ly8gIHUzMiB4RnJhYywgICAgICAgICAgICAgICAgIDogMHgxMDAKLTsvLyAgdTMyIHlGcmFjLCAgICAgICAgICAgICAgICAgOiAweDEwNAotOy8vICB1MzIgY2hyb21hUGFydFdpZHRoLCAgICAgICA6IDB4MTA4Ci07Ly8gIHUzMiBjaHJvbWFQYXJ0SGVpZ2h0ICAgICAgIDogMHgxMGMKLQotaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yVmVyCi0gICAgU1RNRkQgICBzcCEsIHtyMC1yMTEsbHJ9Ci0gICAgU1VCICAgICBzcCwgc3AsICMweGM0Ci0KLSAgICBMRFIgICAgIGNoclBXLCBbc3AsICMweDEwOF0gICAgIDsvLyBjaHJvbWFQYXJ0V2lkdGgKLSAgICBMRFIgICAgIHhGcmFjLCBbc3AsICMweDEwMF0gICAgIDsvLyB4RnJhYwotICAgIExEUiAgICAgd2lkdGgsIFtzcCwgIzB4ZjhdICAgICAgOy8vIHdpZHRoCi0gICAgQ01QICAgICB4MCwgIzAKLSAgICBCTFQgICAgIGRvX2ZpbGwKLQotICAgIEFERCAgICAgdG1wMSwgeDAsIGNoclBXICAgICAgICAgOy8vIHRtcDEgPSB4MCsgY2hyb21hUGFydFdpZHRoCi0gICAgQUREICAgICB0bXAxLCB0bXAxLCAjMSAgICAgICAgICA7Ly8gdG1wMSA9IHgwKyBjaHJvbWFQYXJ0V2lkdGgrMQotICAgIENNUCAgICAgdG1wMSwgd2lkdGggICAgICAgICAgICAgOy8vIHgwK2Nocm9tYVBhcnRXaWR0aCsxID4gd2lkdGgKLSAgICBCSEkgICAgIGRvX2ZpbGwKLQotICAgIENNUCAgICAgeTAsICMwCi0gICAgQkxUICAgICBkb19maWxsCi0gICAgTERSICAgICBjaHJQSCwgW3NwLCAjMHgxMGNdICAgICA7Ly8gY2hyb21hUGFydEhlaWdodAotICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsICMweGZjXSAgICAgOy8vIGhlaWdodAotICAgIEFERCAgICAgdG1wMSwgeTAsIGNoclBIICAgICAgICAgOy8vIHRtcDEgPSB5MCArIGNocm9tYVBhcnRIZWlnaHQKLSAgICBBREQgICAgIHRtcDEsIHRtcDEsICMxICAgICAgICAgIDsvLyB0bXAxID0geTAgKyBjaHJvbWFQYXJ0SGVpZ2h0ICsgMQotICAgIENNUCAgICAgdG1wMSwgaGVpZ2h0Ci0gICAgQkxTICAgICBza2lwX2ZpbGwKLQotZG9fZmlsbAotICAgIExEUiAgICAgY2hyUEgsIFtzcCwgIzB4MTBjXSAgICAgOy8vIGNocm9tYVBhcnRIZWlnaHQKLSAgICBMRFIgICAgIGhlaWdodCwgW3NwLCAjMHhmY10gICAgIDsvLyBoZWlnaHQKLSAgICBBREQgICAgIHRtcDMsIGNoclBXLCAjMSAgICAgICAgIDsvLyB0bXAzID0gY2hyb21hUGFydFdpZHRoKzEKLSAgICBBREQgICAgIHRtcDEsIGNoclBXLCAjMSAgICAgICAgIDsvLyB0bXAxID0gY2hyb21hUGFydFdpZHRoKzEKLSAgICBBREQgICAgIHRtcDIsIGNoclBILCAjMSAgICAgICAgIDsvLyB0bXAyID0gY2hyb21hUGFydEhlaWdodCsxCi0gICAgU1RNSUEgICBzcCx7d2lkdGgsaGVpZ2h0LHRtcDEsdG1wMix0bXAzfQotICAgIEFERCAgICAgYmxvY2ssIHNwLCAjMHgxYyAgICAgICAgOy8vIGJsb2NrCi0gICAgQkwgICAgICBoMjY0YnNkRmlsbEJsb2NrCi0KLSAgICBMRFIgICAgIHgwLCBbc3AsICMweGNjXQotICAgIExEUiAgICAgeTAsIFtzcCwgIzB4ZDBdCi0gICAgTERSICAgICByZWYsIFtzcCwgIzB4YzRdICAgICAgICA7Ly8gcmVmCi0gICAgU1RNSUEgICBzcCx7d2lkdGgsaGVpZ2h0LHRtcDEsdG1wMix0bXAzfQotICAgIEFERCAgICAgYmxvY2ssIHNwLCAjMHgxYyAgICAgICAgOy8vIGJsb2NrCi0gICAgTUxBICAgICByZWYsIGhlaWdodCwgd2lkdGgsIHJlZiA7Ly8gcmVmICs9IHdpZHRoICogaGVpZ2h0OyAKLSAgICBNTEEgICAgIGJsb2NrLCB0bXAyLCB0bXAxLCBibG9jazsvLyBibG9jayArIChjaHJvbWFQVysxKSooY2hyb21hUEgrMSkKLSAgICBCTCAgICAgIGgyNjRic2RGaWxsQmxvY2sKLQotICAgIE1PViAgICAgeDAsICMwICAgICAgICAgICAgICAgICAgOy8vIHgwID0gMAotICAgIE1PViAgICAgeTAsICMwICAgICAgICAgICAgICAgICAgOy8vIHkwID0gMAotICAgIFNUUiAgICAgeDAsIFtzcCwgIzB4Y2NdCi0gICAgU1RSICAgICB5MCwgW3NwLCAjMHhkMF0KLSAgICBBREQgICAgIHJlZiwgc3AsICMweDFjICAgICAgICAgIDsvLyByZWYgPSBibG9jawotICAgIFNUUiAgICAgcmVmLCBbc3AsICMweGM0XSAgICAgICAgOy8vIHJlZgotCi0gICAgU1RSICAgICB0bXAyLCBbc3AsICMweGZjXSAgICAgICA7Ly8gaGVpZ2h0Ci0gICAgU1RSICAgICB0bXAxLCBbc3AsICMweGY4XSAgICAgICA7Ly8gd2lkdGgKLSAgICBNT1YgICAgIHdpZHRoLCB0bXAxCi0KLXNraXBfZmlsbAotICAgIE1MQSAgICAgdG1wMywgeTAsIHdpZHRoLCB4MCAgICAgOy8vIHRtcDMgPSB5MCp3aWR0aCt4MAotICAgIExEUiAgICAgeUZyYWMsIFtzcCwgIzB4MTA0XSAgICAgOy8vIHlGcmFjCi0gICAgTERSICAgICB4RnJhYywgW3NwLCAjMHgxMDBdCi0gICAgQUREICAgICBwdHJBLCByZWYsIHRtcDMgICAgICAgICA7Ly8gcHRyQSA9IHJlZiArIHkwKndpZHRoK3gwCi0gICAgUlNCICAgICB2YWxYLCB4RnJhYywgIzggICAgICAgICA7Ly8gdmFsWCA9IDgteEZyYWMKLSAgICBSU0IgICAgIHZhbFksIHlGcmFjLCAjOCAgICAgICAgIDsvLyB2YWxZID0gOC15RnJhYwotCi0gICAgTERSICAgICBtYiwgW3NwLCAjMHhjOF0gICAgICAgICA7Ly8gcHJlZFBhcnRDaHJvbWEKLQotCi0gICAgOy8vIHBhY2sgdmFsdWVzIHRvIGNvdW50IHJlZ2lzdGVyCi0gICAgOy8vIFszMToyOF0gbG9vcF94IChjaHJvbWFQYXJ0V2lkdGgtMSkKLSAgICA7Ly8gWzI3OjI0XSBsb29wX3kgKGNocm9tYVBhcnRIZWlnaHQtMSkKLSAgICA7Ly8gWzIzOjIwXSBjaHJvbWFQYXJ0V2lkdGgtMQotICAgIDsvLyBbMTk6MTZdIGNocm9tYVBhcnRIZWlnaHQtMQotICAgIDsvLyBbMTU6MDBdIG5vdGhpbmcKLQotICAgIFNVQiAgICAgdG1wMiwgY2hyUEgsICMxICAgICAgICAgICAgIDsvLyBjaHJvbWFQYXJ0SGVpZ2h0LTEKLSAgICBTVUIgICAgIHRtcDEsIGNoclBXLCAjMSAgICAgICAgICAgICA7Ly8gY2hyb21hUGFydFdpZHRoLTEKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICMxNiA7Ly8gY2hyb21hUGFydEhlaWdodC0xCi0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjMjQgOy8vIGxvb3BfeQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAxLCBMU0wgIzIwIDsvLyBjaHJvbWFQYXJ0V2lkdGgtMQotICAgIEFORCAgICAgdG1wMiwgY291bnQsICMweDAwRjAwMDAwICAgIDsvLyBsb29wX3gKLSAgICBQS0hCVCAgIHZhbFksIHZhbFksIHlGcmFjLCBMU0wgIzE2ICA7Ly8gfHlGcmFjfHZhbFkgfAotICAgIE1PViAgICAgYzMyLCAjMzIKLQotCi0gICAgOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIDsvLyBDYgotICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIDsvLyAyeDIgcGVscyBwZXIgaXRlcmF0aW9uCi0gICAgOy8vIGJpbGluZWFyIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIGludGVycG9sYXRpb24KLQotbG9vcDFfeQotICAgIExEUkIgICAgdG1wMSwgW3B0ckFdCi0gICAgTERSQiAgICB0bXAzLCBbcHRyQSwgd2lkdGhdCi0gICAgTERSQiAgICB0bXA1LCBbcHRyQSwgd2lkdGgsIExTTCAjMV0KLQotICAgIFBLSEJUICAgdG1wMSwgdG1wMSwgdG1wMywgTFNMICMxNiAgIDsvLyB8dDN8dDF8Ci0gICAgUEtIQlQgICB0bXAzLCB0bXAzLCB0bXA1LCBMU0wgIzE2ICAgOy8vIHx0NXx0M3wKLQotICAgIFNNVUFEICAgdG1wMSwgdG1wMSwgdmFsWSAgICAgICAgICAgIDsvLyB0MT0odDEqdmFsWSArIHQzKnlGcmFjKQotICAgIFNNVUFEICAgdG1wMywgdG1wMywgdmFsWSAgICAgICAgICAgIDsvLyB0Mz0odDMqdmFsWSArIHQ1KnlGcmFjKQotCi0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjOAotbG9vcDFfeAotICAgIDsvLyBmaXJzdAotICAgIExEUkIgICAgdG1wMiwgW3B0ckEsICMxXSEKLSAgICBMRFJCICAgIHRtcDQsIFtwdHJBLCB3aWR0aF0KLSAgICBMRFJCICAgIHRtcDYsIFtwdHJBLCB3aWR0aCwgTFNMICMxXQotCi0gICAgUEtIQlQgICB0bXAyLCB0bXAyLCB0bXA0LCBMU0wgIzE2ICAgOy8vIHx0NHx0MnwKLSAgICBQS0hCVCAgIHRtcDQsIHRtcDQsIHRtcDYsIExTTCAjMTYgICA7Ly8gfHQ2fHQ0fAotCi0gICAgU01VQUQgICB0bXAyLCB0bXAyLCB2YWxZICAgICAgICAgICAgOy8vIHQyPSh0Mip2YWxZICsgdDQqeUZyYWMpCi0gICAgTUxBICAgICB0bXA1LCB0bXAxLCB2YWxYLCBjMzIgICAgICAgOy8vIHQ1PXQxKnZhbFgrMzIKLSAgICBNTEEgICAgIHRtcDUsIHRtcDIsIHhGcmFjLCB0bXA1ICAgICA7Ly8gdDU9dDIqeEZyYWMrdDUKLQotICAgIFNNVUFEICAgdG1wNCwgdG1wNCwgdmFsWSAgICAgICAgICAgIDsvLyB0ND0odDQqdmFsWSArIHQ2KnlGcmFjKQotICAgIE1MQSAgICAgdG1wNiwgdG1wMywgdmFsWCwgYzMyICAgICAgIDsvLyB0Mz10Myp2YWxYKzMyCi0gICAgTUxBICAgICB0bXA2LCB0bXA0LCB4RnJhYywgdG1wNiAgICAgOy8vIHQ2PXQ0KnhGcmFjK3Q2Ci0KLSAgICBNT1YgICAgIHRtcDYsIHRtcDYsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wNiwgW21iLCAjOF0gICAgICAgICAgICAgIDsvLyBzdG9yZSBwaXhlbAotICAgIE1PViAgICAgdG1wNSwgdG1wNSwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXA1LCBbbWJdLCAjMSAgICAgICAgICAgICAgOy8vIHN0b3JlIHBpeGVsCi0KLSAgICA7Ly8gc2Vjb25kCi0gICAgTERSQiAgICB0bXAxLCBbcHRyQSwgIzFdIQotICAgIExEUkIgICAgdG1wMywgW3B0ckEsIHdpZHRoXQotICAgIExEUkIgICAgdG1wNSwgW3B0ckEsIHdpZHRoLCBMU0wgIzFdCi0KLSAgICBQS0hCVCAgIHRtcDEsIHRtcDEsIHRtcDMsIExTTCAjMTYgICA7Ly8gfHQzfHQxfAotICAgIFBLSEJUICAgdG1wMywgdG1wMywgdG1wNSwgTFNMICMxNiAgIDsvLyB8dDV8dDN8Ci0KLSAgICBTTVVBRCAgIHRtcDEsIHRtcDEsIHZhbFkgICAgICAgICAgICA7Ly8gdDE9KHQxKnZhbFkgKyB0Myp5RnJhYykKLSAgICBNTEEgICAgIHRtcDUsIHRtcDEsIHhGcmFjLCBjMzIgICAgICA7Ly8gdDE9dDEqeEZyYWMrMzIKLSAgICBNTEEgICAgIHRtcDUsIHRtcDIsIHZhbFgsIHRtcDUgICAgICA7Ly8gdDU9dDIqdmFsWCt0NQotCi0gICAgU01VQUQgICB0bXAzLCB0bXAzLCB2YWxZICAgICAgICAgICAgOy8vIHQzPSh0Myp2YWxZICsgdDUqeUZyYWMpCi0gICAgTUxBICAgICB0bXA2LCB0bXAzLCB4RnJhYywgYzMyICAgICAgOy8vIHQzPXQzKnhGcmFjKzMyCi0gICAgTUxBICAgICB0bXA2LCB0bXA0LCB2YWxYLCB0bXA2ICAgICAgOy8vIHQ2PXQ0KnZhbFgrdDYKLQotICAgIE1PViAgICAgdG1wNiwgdG1wNiwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXA2LCBbbWIsICM4XSAgICAgICAgICAgICAgOy8vIHN0b3JlIHBpeGVsCi0gICAgTU9WICAgICB0bXA1LCB0bXA1LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDUsIFttYl0sICMxICAgICAgICAgICAgICA7Ly8gc3RvcmUgcGl4ZWwKLQotICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjMjw8MjgKLSAgICBCQ1MgICAgIGxvb3AxX3gKLQotICAgIEFORCAgICAgdG1wMiwgY291bnQsICMweDAwRjAwMDAwCi0KLSAgICBBRERTICAgIG1iLCBtYiwgIzE2Ci0gICAgU0JDICAgICBtYiwgbWIsIHRtcDIsIExTUiAjMjAKLSAgICBBREQgICAgIHB0ckEsIHB0ckEsIHdpZHRoLCBMU0wgIzEKLSAgICBTQkMgICAgIHB0ckEsIHB0ckEsIHRtcDIsIExTUiAjMjAKLQotICAgIEFERFMgICAgY291bnQsIGNvdW50LCAjMHhFIDw8IDI0Ci0gICAgQkdFICAgICBsb29wMV95Ci0KLSAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgOy8vIENyCi0gICAgOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4ZmNdICAgICAgICAgIDsvLyBoZWlnaHQKLSAgICBMRFIgICAgIHJlZiwgW3NwLCAjMHhjNF0gICAgICAgICAgICA7Ly8gcmVmCi0gICAgTERSICAgICB0bXAxLCBbc3AsICMweGQwXSAgICAgICAgICAgOy8vIHkwCi0gICAgTERSICAgICB0bXAyLCBbc3AsICMweGNjXSAgICAgICAgICAgOy8vIHgwCi0gICAgTERSICAgICBtYiwgW3NwLCAjMHhjOF0gICAgICAgICAgICAgOy8vIHByZWRQYXJ0Q2hyb21hCi0KLSAgICBBREQgICAgIHRtcDEsIGhlaWdodCwgdG1wMQotICAgIE1MQSAgICAgdG1wMywgdG1wMSwgd2lkdGgsIHRtcDIKLSAgICBBREQgICAgIHB0ckEsIHJlZiwgdG1wMwotICAgIEFERCAgICAgbWIsIG1iLCAjNjQKLQotICAgIEFORCAgICAgY291bnQsIGNvdW50LCAjMHgwMEZGRkZGRgotICAgIEFORCAgICAgdG1wMSwgY291bnQsICMweDAwMEYwMDAwCi0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjOAotICAgIEFORCAgICAgdG1wMiwgY291bnQsICMweDAwRjAwMDAwCi0KLSAgICA7Ly8gMngyIHBlbHMgcGVyIGl0ZXJhdGlvbgotICAgIDsvLyBiaWxpbmVhciB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uCi1sb29wMl95Ci0gICAgTERSQiAgICB0bXAxLCBbcHRyQV0KLSAgICBMRFJCICAgIHRtcDMsIFtwdHJBLCB3aWR0aF0KLSAgICBMRFJCICAgIHRtcDUsIFtwdHJBLCB3aWR0aCwgTFNMICMxXQotCi0gICAgUEtIQlQgICB0bXAxLCB0bXAxLCB0bXAzLCBMU0wgIzE2ICAgOy8vIHx0M3x0MXwKLSAgICBQS0hCVCAgIHRtcDMsIHRtcDMsIHRtcDUsIExTTCAjMTYgICA7Ly8gfHQ1fHQzfAotCi0gICAgU01VQUQgICB0bXAxLCB0bXAxLCB2YWxZICAgICAgICAgICAgOy8vIHQxPSh0MSp2YWxZICsgdDMqeUZyYWMpCi0gICAgU01VQUQgICB0bXAzLCB0bXAzLCB2YWxZICAgICAgICAgICAgOy8vIHQzPSh0Myp2YWxZICsgdDUqeUZyYWMpCi0KLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICM4Ci1sb29wMl94Ci0gICAgOy8vIGZpcnN0Ci0gICAgTERSQiAgICB0bXAyLCBbcHRyQSwgIzFdIQotICAgIExEUkIgICAgdG1wNCwgW3B0ckEsIHdpZHRoXQotICAgIExEUkIgICAgdG1wNiwgW3B0ckEsIHdpZHRoLCBMU0wgIzFdCi0KLSAgICBQS0hCVCAgIHRtcDIsIHRtcDIsIHRtcDQsIExTTCAjMTYgICA7Ly8gfHQ0fHQyfAotICAgIFBLSEJUICAgdG1wNCwgdG1wNCwgdG1wNiwgTFNMICMxNiAgIDsvLyB8dDZ8dDR8Ci0KLSAgICBTTVVBRCAgIHRtcDIsIHRtcDIsIHZhbFkgICAgICAgICAgICA7Ly8gdDI9KHQyKnZhbFkgKyB0NCp5RnJhYykKLSAgICBNTEEgICAgIHRtcDUsIHRtcDEsIHZhbFgsIGMzMiAgICAgICA7Ly8gdDU9dDEqdmFsWCszMgotICAgIE1MQSAgICAgdG1wNSwgdG1wMiwgeEZyYWMsIHRtcDUgICAgIDsvLyB0NT10Mip4RnJhYyt0NQotCi0gICAgU01VQUQgICB0bXA0LCB0bXA0LCB2YWxZICAgICAgICAgICAgOy8vIHQ0PSh0NCp2YWxZICsgdDYqeUZyYWMpCi0gICAgTUxBICAgICB0bXA2LCB0bXAzLCB2YWxYLCBjMzIgICAgICAgOy8vIHQzPXQzKnZhbFgrMzIKLSAgICBNTEEgICAgIHRtcDYsIHRtcDQsIHhGcmFjLCB0bXA2ICAgICA7Ly8gdDY9dDQqeEZyYWMrdDYKLQotICAgIE1PViAgICAgdG1wNiwgdG1wNiwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXA2LCBbbWIsICM4XSAgICAgICAgICAgICAgOy8vIHN0b3JlIHBpeGVsCi0gICAgTU9WICAgICB0bXA1LCB0bXA1LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDUsIFttYl0sICMxICAgICAgICAgICAgICA7Ly8gc3RvcmUgcGl4ZWwKLQotICAgIDsvLyBzZWNvbmQgCi0gICAgTERSQiAgICB0bXAxLCBbcHRyQSwgIzFdIQotICAgIExEUkIgICAgdG1wMywgW3B0ckEsIHdpZHRoXQotICAgIExEUkIgICAgdG1wNSwgW3B0ckEsIHdpZHRoLCBMU0wgIzFdCi0KLSAgICBQS0hCVCAgIHRtcDEsIHRtcDEsIHRtcDMsIExTTCAjMTYgICA7Ly8gfHQzfHQxfAotICAgIFBLSEJUICAgdG1wMywgdG1wMywgdG1wNSwgTFNMICMxNiAgIDsvLyB8dDV8dDN8Ci0KLSAgICBTTVVBRCAgIHRtcDEsIHRtcDEsIHZhbFkgICAgICAgICAgICA7Ly8gdDE9KHQxKnZhbFkgKyB0Myp5RnJhYykKLSAgICBNTEEgICAgIHRtcDUsIHRtcDEsIHhGcmFjLCBjMzIgICAgICA7Ly8gdDE9dDEqeEZyYWMrMzIKLSAgICBNTEEgICAgIHRtcDUsIHRtcDIsIHZhbFgsIHRtcDUgICAgICA7Ly8gdDU9dDIqdmFsWCt0NQotCi0gICAgU01VQUQgICB0bXAzLCB0bXAzLCB2YWxZICAgICAgICAgICAgOy8vIHQzPSh0Myp2YWxZICsgdDUqeUZyYWMpCi0gICAgTUxBICAgICB0bXA2LCB0bXAzLCB4RnJhYywgYzMyICAgICAgOy8vIHQzPXQzKnhGcmFjKzMyCi0gICAgTUxBICAgICB0bXA2LCB0bXA0LCB2YWxYLCB0bXA2ICAgICAgOy8vIHQ2PXQ0KnZhbFgrdDYKLQotICAgIE1PViAgICAgdG1wNiwgdG1wNiwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXA2LCBbbWIsICM4XSAgICAgICAgICAgICAgOy8vIHN0b3JlIHBpeGVsCi0gICAgTU9WICAgICB0bXA1LCB0bXA1LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDUsIFttYl0sICMxICAgICAgICAgICAgICA7Ly8gc3RvcmUgcGl4ZWwKLQotICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjMjw8MjgKLSAgICBCQ1MgICAgIGxvb3AyX3gKLQotICAgIEFORCAgICAgdG1wMiwgY291bnQsICMweDAwRjAwMDAwCi0KLSAgICBBRERTICAgIG1iLCBtYiwgIzE2Ci0gICAgU0JDICAgICBtYiwgbWIsIHRtcDIsIExTUiAjMjAKLSAgICBBREQgICAgIHB0ckEsIHB0ckEsIHdpZHRoLCBMU0wgIzEKLSAgICBTQkMgICAgIHB0ckEsIHB0ckEsIHRtcDIsIExTUiAjMjAKLQotICAgIEFERFMgICAgY291bnQsIGNvdW50LCAjMHhFIDw8IDI0Ci0gICAgQkdFICAgICBsb29wMl95Ci0KLSAgICBBREQgICAgIHNwLHNwLCMweGQ0Ci0gICAgTERNRkQgICBzcCEse3I0LXIxMSxwY30KLQotICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfdmVyLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV92ZXIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY5ZGYxYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2Nocm9tYV92ZXIucworKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi07IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci07Ci07IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOwotOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOwotOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy0tCi07LS0gQWJzdHJhY3QgOiBBUk12NiBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFWZXIgZnVuY3Rpb24KLTstLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0gICAgSUYgOkRFRjogSDI2NERFQ19XSU5BU00KLSAgICAgICAgOy8vIFdlIGRvbnQgdXNlIFJFUVVJUkU4IGFuZCBQUkVTRVJWRTggZm9yIHdpbmFzbQotICAgIEVMU0UKLSAgICAgICAgUkVRVUlSRTgKLSAgICAgICAgUFJFU0VSVkU4Ci0gICAgRU5ESUYKLQotICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQotCi07Ly8gaDI2NGJzZEludGVycG9sYXRlQ2hyb21hVmVyIHJlZ2lzdGVyIGFsbG9jYXRpb24KLQotcmVmICAgICBSTiAwCi1wdHJBICAgIFJOIDAKLQotbWIgICAgICBSTiAxCi1ibG9jayAgIFJOIDEKLQoteDAgICAgICBSTiAyCi1jb3VudCAgIFJOIDIKLQoteTAgICAgICBSTiAzCi12YWxZICAgIFJOIDMKLQotd2lkdGggICBSTiA0Ci0KLWhlaWdodCAgUk4gNQotdG1wNyAgICBSTiA1Ci0KLWNoclBXICAgUk4gNgotdG1wOCAgICBSTiA2Ci0KLXRtcDEgICAgUk4gNwotCi10bXAyICAgIFJOIDgKLQotdG1wMyAgICBSTiA5Ci0KLXRtcDQgICAgUk4gMTAKLQotdG1wNSAgICBSTiAxMQotY2hyUEggICBSTiAxMQotCi10bXA2ICAgIFJOIDEyCi0KLWMzMiAgICAgUk4gMTQKLXlGcmFjICAgUk4gMTQKLQotOy8vIEZ1bmN0aW9uIGV4cG9ydHMgYW5kIGltcG9ydHMKLQotICAgIElNUE9SVCAgaDI2NGJzZEZpbGxCbG9jawotCi0gICAgRVhQT1JUICBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFWZXIKLQotOy8vICBGdW5jdGlvbiBhcmd1bWVudHMKLTsvLwotOy8vICB1OCAqcmVmLCAgICAgICAgICAgICAgICAgICA6IDB4YzQKLTsvLyAgdTggKnByZWRQYXJ0Q2hyb21hLCAgICAgICAgOiAweGM4Ci07Ly8gIGkzMiB4MCwgICAgICAgICAgICAgICAgICAgIDogMHhjYwotOy8vICBpMzIgeTAsICAgICAgICAgICAgICAgICAgICA6IDB4ZDAKLTsvLyAgdTMyIHdpZHRoLCAgICAgICAgICAgICAgICAgOiAweGY4Ci07Ly8gIHUzMiBoZWlnaHQsICAgICAgICAgICAgICAgIDogMHhmYwotOy8vICB1MzIgeUZyYWMsICAgICAgICAgICAgICAgICA6IDB4MTAwCi07Ly8gIHUzMiBjaHJvbWFQYXJ0V2lkdGgsICAgICAgIDogMHgxMDQKLTsvLyAgdTMyIGNocm9tYVBhcnRIZWlnaHQgICAgICAgOiAweDEwOAotCi1oMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFWZXIKLSAgICBTVE1GRCAgIHNwISwge3IwLXIxMSxscn0KLSAgICBTVUIgICAgIHNwLCBzcCwgIzB4YzQKLQotICAgIExEUiAgICAgY2hyUFcsIFtzcCwgIzB4MTA0XSAgICAgOy8vIGNocm9tYVBhcnRXaWR0aAotICAgIExEUiAgICAgd2lkdGgsIFtzcCwgIzB4ZjhdICAgICAgOy8vIHdpZHRoCi0gICAgQ01QICAgICB4MCwgIzAKLSAgICBCTFQgICAgIGRvX2ZpbGwKLQotICAgIEFERCAgICAgdG1wMSwgeDAsIGNoclBXICAgICAgICAgOy8vIHRtcDEgPSB4MCsgY2hyb21hUGFydFdpZHRoCi0gICAgQ01QICAgICB0bXAxLCB3aWR0aCAgICAgICAgICAgICA7Ly8geDArY2hyb21hUGFydFdpZHRoID4gd2lkdGgKLSAgICBCSEkgICAgIGRvX2ZpbGwKLQotICAgIENNUCAgICAgeTAsICMwCi0gICAgQkxUICAgICBkb19maWxsCi0gICAgTERSICAgICBjaHJQSCwgW3NwLCAjMHgxMDhdICAgICA7Ly8gY2hyb21hUGFydEhlaWdodAotICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsICMweGZjXSAgICAgOy8vIGhlaWdodAotICAgIEFERCAgICAgdG1wMSwgeTAsIGNoclBIICAgICAgICAgOy8vIHRtcDEgPSB5MCArIGNocm9tYVBhcnRIZWlnaHQKLSAgICBBREQgICAgIHRtcDEsIHRtcDEsICMxICAgICAgICAgIDsvLyB0bXAxID0geTAgKyBjaHJvbWFQYXJ0SGVpZ2h0ICsgMQotICAgIENNUCAgICAgdG1wMSwgaGVpZ2h0Ci0gICAgQkxTICAgICBza2lwX2ZpbGwKLQotZG9fZmlsbAotICAgIExEUiAgICAgY2hyUEgsIFtzcCwgIzB4MTA4XSAgICAgOy8vIGNocm9tYVBhcnRIZWlnaHQKLSAgICBMRFIgICAgIGhlaWdodCwgW3NwLCAjMHhmY10gICAgIDsvLyBoZWlnaHQKLSAgICBBREQgICAgIHRtcDEsIGNoclBILCAjMSAgICAgICAgIDsvLyB0bXAxID0gY2hyb21hUGFydEhlaWdodCsxCi0gICAgTU9WICAgICB0bXAyLCBjaHJQVyAgICAgICAgICAgICA7Ly8gdG1wMiA9IGNocm9tYVBhcnRXaWR0aAotICAgIFNUTUlBICAgc3Ase3dpZHRoLGhlaWdodCxjaHJQVyx0bXAxLHRtcDJ9Ci0gICAgQUREICAgICBibG9jaywgc3AsICMweDFjICAgICAgICA7Ly8gYmxvY2sKLSAgICBCTCAgICAgIGgyNjRic2RGaWxsQmxvY2sKLQotICAgIExEUiAgICAgeDAsIFtzcCwgIzB4Y2NdCi0gICAgTERSICAgICB5MCwgW3NwLCAjMHhkMF0KLSAgICBMRFIgICAgIHJlZiwgW3NwLCAjMHhjNF0gICAgICAgIDsvLyByZWYKLSAgICBTVE1JQSAgIHNwLHt3aWR0aCxoZWlnaHQsY2hyUFcsdG1wMSx0bXAyfQotICAgIEFERCAgICAgYmxvY2ssIHNwLCAjMHgxYyAgICAgICAgOy8vIGJsb2NrCi0gICAgTUxBICAgICByZWYsIGhlaWdodCwgd2lkdGgsIHJlZiA7Ly8gcmVmICs9IHdpZHRoICogaGVpZ2h0OyAKLSAgICBNTEEgICAgIGJsb2NrLCBjaHJQVywgdG1wMSwgYmxvY2s7Ly8gYmxvY2sgKyAoY2hyb21hUFcpKihjaHJvbWFQSCsxKQotICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jawotCi0gICAgTU9WICAgICB4MCwgIzAgICAgICAgICAgICAgICAgICA7Ly8geDAgPSAwCi0gICAgTU9WICAgICB5MCwgIzAgICAgICAgICAgICAgICAgICA7Ly8geTAgPSAwCi0gICAgU1RSICAgICB4MCwgW3NwLCAjMHhjY10KLSAgICBTVFIgICAgIHkwLCBbc3AsICMweGQwXQotICAgIEFERCAgICAgcmVmLCBzcCwgIzB4MWMgICAgICAgICAgOy8vIHJlZiA9IGJsb2NrCi0gICAgU1RSICAgICByZWYsIFtzcCwgIzB4YzRdICAgICAgICA7Ly8gcmVmCi0KLSAgICBTVFIgICAgIHRtcDEsIFtzcCwgIzB4ZmNdICAgICAgIDsvLyBoZWlnaHQKLSAgICBTVFIgICAgIGNoclBXLCBbc3AsICMweGY4XSAgICAgIDsvLyB3aWR0aAotICAgIE1PViAgICAgd2lkdGgsIGNoclBXCi0KLXNraXBfZmlsbAotICAgIE1MQSAgICAgdG1wMywgeTAsIHdpZHRoLCB4MCAgICAgOy8vIHRtcDMgPSB5MCp3aWR0aCt4MAotICAgIExEUiAgICAgeUZyYWMsIFtzcCwgIzB4MTAwXSAgICAgOy8vIHlGcmFjCi0gICAgQUREICAgICBwdHJBLCByZWYsIHRtcDMgICAgICAgICA7Ly8gcHRyQSA9IHJlZiArIHkwKndpZHRoK3gwCi0gICAgUlNCICAgICB2YWxZLCB5RnJhYywgIzggICAgICAgICA7Ly8gdmFsWSA9IDgteUZyYWMKLQotICAgIExEUiAgICAgbWIsIFtzcCwgIzB4YzhdICAgICAgICAgOy8vIHByZWRQYXJ0Q2hyb21hCi0KLQotICAgIDsvLyBwYWNrIHZhbHVlcyB0byBjb3VudCByZWdpc3RlcgotICAgIDsvLyBbMzE6MjhdIGxvb3BfeCAoY2hyb21hUGFydFdpZHRoLTEpCi0gICAgOy8vIFsyNzoyNF0gbG9vcF95IChjaHJvbWFQYXJ0SGVpZ2h0LTEpCi0gICAgOy8vIFsyMzoyMF0gY2hyb21hUGFydFdpZHRoLTEKLSAgICA7Ly8gWzE5OjE2XSBjaHJvbWFQYXJ0SGVpZ2h0LTEKLSAgICA7Ly8gWzE1OjAwXSBub3RoaW5nCi0KLSAgICBTVUIgICAgIHRtcDIsIGNoclBILCAjMSAgICAgICAgICAgICA7Ly8gY2hyb21hUGFydEhlaWdodC0xCi0gICAgU1VCICAgICB0bXAxLCBjaHJQVywgIzEgICAgICAgICAgICAgOy8vIGNocm9tYVBhcnRXaWR0aC0xCi0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjMTYgOy8vIGNocm9tYVBhcnRIZWlnaHQtMQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzI0IDsvLyBsb29wX3kKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMSwgTFNMICMyMCA7Ly8gY2hyb21hUGFydFdpZHRoLTEKLSAgICBBTkQgICAgIHRtcDIsIGNvdW50LCAjMHgwMEYwMDAwMCAgICA7Ly8gbG9vcF94Ci0gICAgUEtIQlQgICB2YWxZLCB2YWxZLCB5RnJhYywgTFNMICMxNiAgOy8vIHx5RnJhY3x2YWxZIHwKLSAgICBNT1YgICAgIHZhbFksIHZhbFksIExTTCAjMyAgICAgICAgICA7Ly8gbXVsdGlwbHkgYnkgOCBpbiBhZHZhbmNlCi0gICAgTU9WICAgICBjMzIsICMzMgotCi0KLSAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgOy8vIENiCi0gICAgOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgOy8vIDJ4MiBwZWxzIHBlciBpdGVyYXRpb24KLSAgICA7Ly8gYmlsaW5lYXIgdmVydGljYWwgaW50ZXJwb2xhdGlvbgotCi1sb29wMV95Ci0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjOAotbG9vcDFfeAotICAgIDsvLyBQcm9jZXNzIDJ4MiBibG9jawotICAgIExEUkIgICAgdG1wMiwgW3B0ckEsd2lkdGhdICAgICAgICAgIDsvLyAyIHJvdywgMSBjb2wKLSAgICBMRFJCICAgIHRtcDMsIFtwdHJBLHdpZHRoLCBMU0wgIzFdICA7Ly8gMyByb3csIDEgY29sCi0gICAgTERSQiAgICB0bXAxLCBbcHRyQV0sIzEgICAgICAgICAgICAgOy8vIDEgcm93LCAxIGNvbAotCi0gICAgTERSQiAgICB0bXA1LCBbcHRyQSx3aWR0aF0gICAgICAgICAgOy8vIDIgcm93LCAyIGNvbAotICAgIExEUkIgICAgdG1wNiwgW3B0ckEsd2lkdGgsIExTTCAjMV0gIDsvLyAzIHJvdywgMiBjb2wKLSAgICBMRFJCICAgIHRtcDQsIFtwdHJBXSwjMSAgICAgICAgICAgICA7Ly8gMSByb3csIDIgY29sCi0KLSAgICBQS0hCVCAgIHRtcDEsIHRtcDEsIHRtcDIsIExTTCAjMTYgICA7Ly8gfEJ8QXwKLSAgICBQS0hCVCAgIHRtcDIsIHRtcDIsIHRtcDMsIExTTCAjMTYgICA7Ly8gfEN8QnwKLSAgICBQS0hCVCAgIHRtcDQsIHRtcDQsIHRtcDUsIExTTCAjMTYgICA7Ly8gfEJ8QXwKLQotICAgIFNNTEFEICAgdG1wNywgdG1wMiwgdmFsWSwgYzMyICAgICAgIDsvLyBtdWx0aXBseQotICAgIFBLSEJUICAgdG1wNSwgdG1wNSwgdG1wNiwgTFNMICMxNiAgIDsvLyB8Q3xCfAotICAgIFNNTEFEICAgdG1wMiwgdG1wMSwgdmFsWSwgYzMyICAgICAgIDsvLyBtdWx0aXBseQotICAgIFNNTEFEICAgdG1wOCwgdG1wNSwgdmFsWSwgYzMyICAgICAgIDsvLyBtdWx0aXBseQotICAgIFNNTEFEICAgdG1wNSwgdG1wNCwgdmFsWSwgYzMyICAgICAgIDsvLyBtdWx0aXBseQotCi0gICAgTU9WICAgICB0bXA3LCB0bXA3LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDcsIFttYiwjOF0gICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDIgY29sIDEKLSAgICBNT1YgICAgIHRtcDIsIHRtcDIsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wMiwgW21iXSwjMSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMSBjb2wgMQotCi0gICAgTU9WICAgICB0bXA4LCB0bXA4LCBMU1IgIzYgICAgICAgICAgOy8vIHNjYWxlIGRvd24KLSAgICBTVFJCICAgIHRtcDgsIFttYiwjOF0gICAgICAgICAgICAgICA7Ly8gc3RvcmUgcm93IDIgY29sIDIKLSAgICBNT1YgICAgIHRtcDUsIHRtcDUsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wNSwgW21iXSwjMSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMSBjb2wgMgotCi0KLSAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzI8PDI4Ci0gICAgQkNTICAgICBsb29wMV94Ci0KLSAgICBBTkQgICAgIHRtcDIsIGNvdW50LCAjMHgwMEYwMDAwMAotCi0gICAgQUREUyAgICBtYiwgbWIsICMxNgotICAgIFNCQyAgICAgbWIsIG1iLCB0bXAyLCBMU1IgIzIwCi0gICAgQUREICAgICBwdHJBLCBwdHJBLCB3aWR0aCwgTFNMICMxCi0gICAgU0JDICAgICBwdHJBLCBwdHJBLCB0bXAyLCBMU1IgIzIwCi0KLSAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIzB4RSA8PCAyNAotICAgIEJHRSAgICAgbG9vcDFfeSAKLQotICAgIDsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICA7Ly8gQ3IKLSAgICA7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHhmY10gICAgICAgICAgOy8vIGhlaWdodAotICAgIExEUiAgICAgcmVmLCBbc3AsICMweGM0XSAgICAgICAgICAgIDsvLyByZWYKLSAgICBMRFIgICAgIHRtcDEsIFtzcCwgIzB4ZDBdICAgICAgICAgICA7Ly8geTAKLSAgICBMRFIgICAgIHRtcDIsIFtzcCwgIzB4Y2NdICAgICAgICAgICA7Ly8geDAKLSAgICBMRFIgICAgIG1iLCBbc3AsICMweGM4XSAgICAgICAgICAgICA7Ly8gcHJlZFBhcnRDaHJvbWEKLQotICAgIEFERCAgICAgdG1wMSwgaGVpZ2h0LCB0bXAxCi0gICAgTUxBICAgICB0bXAzLCB0bXAxLCB3aWR0aCwgdG1wMgotICAgIEFERCAgICAgcHRyQSwgcmVmLCB0bXAzCi0gICAgQUREICAgICBtYiwgbWIsICM2NAotCi0gICAgQU5EICAgICBjb3VudCwgY291bnQsICMweDAwRkZGRkZGCi0gICAgQU5EICAgICB0bXAxLCBjb3VudCwgIzB4MDAwRjAwMDAKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMSwgTFNMICM4Ci0gICAgQU5EICAgICB0bXAyLCBjb3VudCwgIzB4MDBGMDAwMDAKLQotICAgIDsvLyAyeDIgcGVscyBwZXIgaXRlcmF0aW9uCi0gICAgOy8vIGJpbGluZWFyIHZlcnRpY2FsIGludGVycG9sYXRpb24KLWxvb3AyX3kKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMiwgTFNMICM4Ci1sb29wMl94Ci0gICAgOy8vIFByb2Nlc3MgMngyIGJsb2NrCi0gICAgTERSQiAgICB0bXAyLCBbcHRyQSx3aWR0aF0gICAgICAgICAgOy8vIDIgcm93LCAxIGNvbAotICAgIExEUkIgICAgdG1wMywgW3B0ckEsd2lkdGgsIExTTCAjMV0gIDsvLyAzIHJvdywgMSBjb2wKLSAgICBMRFJCICAgIHRtcDEsIFtwdHJBXSwjMSAgICAgICAgICAgICA7Ly8gMSByb3csIDEgY29sCi0KLSAgICBMRFJCICAgIHRtcDUsIFtwdHJBLHdpZHRoXSAgICAgICAgICA7Ly8gMiByb3csIDIgY29sCi0gICAgTERSQiAgICB0bXA2LCBbcHRyQSx3aWR0aCwgTFNMICMxXSAgOy8vIDMgcm93LCAyIGNvbAotICAgIExEUkIgICAgdG1wNCwgW3B0ckFdLCMxICAgICAgICAgICAgIDsvLyAxIHJvdywgMiBjb2wKLQotICAgIFBLSEJUICAgdG1wMSwgdG1wMSwgdG1wMiwgTFNMICMxNiAgIDsvLyB8QnxBfAotICAgIFBLSEJUICAgdG1wMiwgdG1wMiwgdG1wMywgTFNMICMxNiAgIDsvLyB8Q3xCfAotICAgIFBLSEJUICAgdG1wNCwgdG1wNCwgdG1wNSwgTFNMICMxNiAgIDsvLyB8QnxBfAotCi0gICAgU01MQUQgICB0bXA3LCB0bXAyLCB2YWxZLCBjMzIgICAgICAgOy8vIG11bHRpcGx5Ci0gICAgUEtIQlQgICB0bXA1LCB0bXA1LCB0bXA2LCBMU0wgIzE2ICAgOy8vIHxDfEJ8Ci0gICAgU01MQUQgICB0bXAyLCB0bXAxLCB2YWxZLCBjMzIgICAgICAgOy8vIG11bHRpcGx5Ci0gICAgU01MQUQgICB0bXA4LCB0bXA1LCB2YWxZLCBjMzIgICAgICAgOy8vIG11bHRpcGx5Ci0gICAgU01MQUQgICB0bXA1LCB0bXA0LCB2YWxZLCBjMzIgICAgICAgOy8vIG11bHRpcGx5Ci0KLSAgICBNT1YgICAgIHRtcDcsIHRtcDcsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wNywgW21iLCM4XSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMiBjb2wgMQotICAgIE1PViAgICAgdG1wMiwgdG1wMiwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXAyLCBbbWJdLCMxICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAxIGNvbCAxCi0KLSAgICBNT1YgICAgIHRtcDgsIHRtcDgsIExTUiAjNiAgICAgICAgICA7Ly8gc2NhbGUgZG93bgotICAgIFNUUkIgICAgdG1wOCwgW21iLCM4XSAgICAgICAgICAgICAgIDsvLyBzdG9yZSByb3cgMiBjb2wgMgotICAgIE1PViAgICAgdG1wNSwgdG1wNSwgTFNSICM2ICAgICAgICAgIDsvLyBzY2FsZSBkb3duCi0gICAgU1RSQiAgICB0bXA1LCBbbWJdLCMxICAgICAgICAgICAgICAgOy8vIHN0b3JlIHJvdyAxIGNvbCAyCi0KLQotICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjMjw8MjgKLSAgICBCQ1MgICAgIGxvb3AyX3gKLQotICAgIEFORCAgICAgdG1wMiwgY291bnQsICMweDAwRjAwMDAwCi0KLSAgICBBRERTICAgIG1iLCBtYiwgIzE2Ci0gICAgU0JDICAgICBtYiwgbWIsIHRtcDIsIExTUiAjMjAKLSAgICBBREQgICAgIHB0ckEsIHB0ckEsIHdpZHRoLCBMU0wgIzEKLSAgICBTQkMgICAgIHB0ckEsIHB0ckEsIHRtcDIsIExTUiAjMjAKLQotICAgIEFERFMgICAgY291bnQsIGNvdW50LCAjMHhFIDw8IDI0Ci0gICAgQkdFICAgICBsb29wMl95Ci0KLSAgICBBREQgICAgIHNwLHNwLCMweGQ0Ci0gICAgTERNRkQgICBzcCEsIHtyNC1yMTEscGN9Ci0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfaG9yX2hhbGYucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfaG9yX2hhbGYucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM5NjhiNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2hvcl9oYWxmLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotOwotOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsKLTsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsKLTsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTstLQotOy0tIEFic3RyYWN0IDogQVJNdjYgb3B0aW1pemVkIHZlcnNpb24gb2YgaDI2NGJzZEludGVycG9sYXRlSG9ySGFsZiBmdW5jdGlvbgotOy0tCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLSAgICBJRiA6REVGOiBIMjY0REVDX1dJTkFTTQotICAgICAgICA7Ly8gV2UgZG9udCB1c2UgUkVRVUlSRTggYW5kIFBSRVNFUlZFOCBmb3Igd2luYXNtCi0gICAgRUxTRQotICAgICAgICBSRVFVSVJFOAotICAgICAgICBQUkVTRVJWRTgKLSAgICBFTkRJRgotCi0gICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCi0KLTsvLyBoMjY0YnNkSW50ZXJwb2xhdGVIb3JIYWxmIHJlZ2lzdGVyIGFsbG9jYXRpb24KLQotcmVmICAgICBSTiAwCi0KLW1iICAgICAgUk4gMQotYnVmZiAgICBSTiAxCi0KLWNvdW50ICAgUk4gMgoteDAgICAgICBSTiAyCi0KLXkwICAgICAgUk4gMwoteF8yXzAgICBSTiAzCi0KLXdpZHRoICAgUk4gNAoteF8zXzEgICBSTiA0Ci0KLWhlaWdodCAgUk4gNQoteF82XzQgICBSTiA1Ci0KLXBhcnRXICAgUk4gNgoteF83XzUgICBSTiA2Ci0KLXBhcnRIICAgUk4gNwotdG1wMSAgICBSTiA3Ci0KLXRtcDIgICAgUk4gOAotCi10bXAzICAgIFJOIDkKLQotdG1wNCAgICBSTiAxMAotCi1tdWx0XzIwXzAxICBSTiAxMQotbXVsdF8yMF9tNSAgUk4gMTIKLQotcGx1czE2ICBSTiAxNAotCi0KLTsvLyBmdW5jdGlvbiBleHBvcnRzIGFuZCBpbXBvcnRzCi0KLSAgICBJTVBPUlQgIGgyNjRic2RGaWxsQmxvY2sKLQotICAgIEVYUE9SVCAgaDI2NGJzZEludGVycG9sYXRlSG9ySGFsZgotCi07Ly8gSG9yaXpvbnRhbCBmaWx0ZXIgYXBwcm9hY2gKLTsvLwotOy8vIEJhc2ljIGlkZWEgaW4gaG9yaXpvbnRhbCBmaWx0ZXJpbmcgaXMgdG8gYWRqdXN0IGNvZWZmaWNpZW50cwotOy8vIGxpa2UgYmVsb3cuIENhbGN1bGF0aW9uIGlzIGRvbmUgd2l0aCAxNi1iaXQgbWF0aHMuCi07Ly8KLTsvLyBSZWcgICAgIHhfMl8wICAgICB4XzNfMSAgICAgeF82XzQgICAgIHhfN181ICAgICB4XzJfMAotOy8vICAgICAgIFsgIDIgIDAgXSBbICAzICAxIF0gWyAgNiAgNCBdIFsgIDcgIDUgXSBbIDEwICA4IF0gLi4uCi07Ly8geV8wID0gICAyMCAgMSAgICAgMjAgLTUgICAgICAgIC01ICAgICAgICAgMQotOy8vIHlfMSA9ICAgLTUgICAgICAgIDIwICAxICAgICAgMSAyMCAgICAgICAgLTUKLTsvLyB5XzIgPSAgICAxICAgICAgICAtNSAgICAgICAgLTUgMjAgICAgICAxIDIwCi07Ly8geV8zID0gICAgICAgICAgICAgIDEgICAgICAgIDIwIC01ICAgICAtNSAyMCAgICAgICAgIDEKLQotCi1oMjY0YnNkSW50ZXJwb2xhdGVIb3JIYWxmCi0gICAgU1RNRkQgICBzcCEsIHtyMC1yMTEsIGxyfQotICAgIFNVQiAgICAgc3AsIHNwLCAjMHgxZTQKLQotICAgIENNUCAgICAgeDAsICMwCi0gICAgQkxUICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHgwIDwgMCkKLSAgICBMRFIgICAgIHBhcnRXLCBbc3AsIzB4MjIwXSAgICAgIDsvLyBwYXJ0V2lkdGgKLSAgICBBREQgICAgIHRtcDQsIHgwLCBwYXJ0VyAgICAgICAgIDsvLyAoeDArcGFydFdpZHRoKQotICAgIEFERCAgICAgdG1wNCwgdG1wNCwgIzUgICAgICAgICAgOy8vICh5MCtwYXJ0Vys1KQotICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCi0gICAgQ01QICAgICB0bXA0LCB3aWR0aAotICAgIEJISSAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh4MCtwYXJ0Vyk+d2lkdGgKLQotICAgIENNUCAgICAgeTAsICMwCi0gICAgQkxUICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHkwIDwgMCkKLSAgICBMRFIgICAgIHBhcnRILCBbc3AsIzB4MjI0XSAgICAgIDsvLyBwYXJ0SGVpZ2h0Ci0gICAgQUREICAgICB0bXAyLCB5MCwgcGFydEggICAgICAgICA7Ly8gKHkwK3BhcnRIZWlnaHQpCi0gICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHgyMWNdICAgICA7Ly8gaGVpZ2h0Ci0gICAgQ01QICAgICB0bXAyLCBoZWlnaHQKLSAgICBCTFMgICAgIHNraXBfZmlsbCAgICAgICAgICAgICAgIDsvLyBubyBvdmVyZmlsbCBuZWVkZWQKLQotCi1kb19maWxsCi0gICAgTERSICAgICBwYXJ0SCwgW3NwLCMweDIyNF0gICAgICA7Ly8gcGFydEhlaWdodAotICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4MjFjXSAgICAgOy8vIGhlaWdodAotICAgIExEUiAgICAgcGFydFcsIFtzcCwjMHgyMjBdICAgICAgOy8vIHBhcnRXaWR0aAotICAgIEFERCAgICAgdG1wNCwgcGFydFcsICM1ICAgICAgICAgOy8vIHRtcDQgPSBwYXJ0VyArIDU7Ci0gICAgU1RNSUIgICBzcCwge2hlaWdodCwgdG1wNH0gICAgICA7Ly8gc3ArNCA9IGhlaWdodCwgc3ArOCA9IHBhcnRXaWR0aCs1Ci0gICAgU1RSICAgICBwYXJ0SCwgW3NwLCMweGNdICAgICAgICA7Ly8gc3ArYyA9IHBhcnRIZWlnaHQKLSAgICBTVFIgICAgIHRtcDQsIFtzcCwjMHgxMF0gICAgICAgIDsvLyBzcCsxMCA9IHBhcnRXaWR0aCs1Ci0gICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKLSAgICBTVFIgICAgIHdpZHRoLCBbc3AsIzBdICAgICAgICAgIDsvLyBzcCswID0gd2lkdGgKLSAgICBBREQgICAgIGJ1ZmYsIHNwLCAjMHgyOCAgICAgICAgIDsvLyBidWZmID0gcDFbMjEqMjEvNCsxXQotICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jawotCi0gICAgTU9WICAgICB4MCwgIzAKLSAgICBTVFIgICAgIHgwLFtzcCwjMHgxZWNdICAgICAgICAgIDsvLyB4MCA9IDAKLSAgICBTVFIgICAgIHgwLFtzcCwjMHgxZjBdICAgICAgICAgIDsvLyB5MCA9IDAKLSAgICBBREQgICAgIHJlZixzcCwjMHgyOCAgICAgICAgICAgIDsvLyByZWYgPSBwMQotICAgIFNUUiAgICAgdG1wNCwgW3NwLCMweDIxOF0gICAgICAgOy8vIHdpZHRoID0gcGFydFdpZHRoKzUKLQotCi1za2lwX2ZpbGwKLSAgICBMRFIgICAgIHgwICxbc3AsIzB4MWVjXSAgICAgICAgIDsvLyB4MAotICAgIExEUiAgICAgeTAgLFtzcCwjMHgxZjBdICAgICAgICAgOy8vIHkwCi0gICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKLSAgICBNTEEgICAgIHRtcDIsIHdpZHRoLCB5MCwgeDAgICAgIDsvLyB5MCp3aWR0aCt4MAotICAgIEFERCAgICAgcmVmLCByZWYsIHRtcDIgICAgICAgICAgOy8vIHJlZiArPSB5MCp3aWR0aCt4MAotICAgIEFERCAgICAgcmVmLCByZWYsICM4ICAgICAgICAgICAgOy8vIHJlZiA9IHJlZis4Ci0gICAgTERSICAgICBtYiwgW3NwLCAjMHgxZThdICAgICAgICA7Ly8gbWIKLQotICAgIDsvLyBwYWNrIHZhbHVlcyB0byBjb3VudCByZWdpc3RlcgotICAgIDsvLyBbMzE6MjhdIGxvb3BfeCAocGFydFdpZHRoLTEpCi0gICAgOy8vIFsyNzoyNF0gbG9vcF95IChwYXJ0SGVpZ2h0LTEpCi0gICAgOy8vIFsyMzoyMF0gcGFydFdpZHRoLTEKLSAgICA7Ly8gWzE5OjE2XSBwYXJ0SGVpZ2h0LTEKLSAgICA7Ly8gWzE1OjAwXSB3aWR0aAotICAgIE1PViAgICAgY291bnQsIHdpZHRoCi0gICAgU1VCICAgICBwYXJ0VywgcGFydFcsICMxOwotICAgIFNVQiAgICAgcGFydEgsIHBhcnRILCAjMTsKLSAgICBBREQgICAgIHRtcDIsIHBhcnRILCBwYXJ0VywgTFNMICM0Ci0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIsIExTTCAjMTYKLQotCi0gICAgTERSICAgICBtdWx0XzIwXzAxLCA9IDB4MDAxNDAwMDEKLSAgICBMRFIgICAgIG11bHRfMjBfbTUsID0gMHgwMDE0RkZGQgotICAgIE1PViAgICAgcGx1czE2LCAjMTYKLSAgICBBTkQgICAgIHRtcDEsIGNvdW50LCAjMHgwMDBGMDAwMCAgICA7Ly8gcGFydEhlaWdodC0xCi0gICAgQU5EICAgICB0bXAzLCBjb3VudCwgIzB4MDBGMDAwMDAgICAgOy8vIHBhcnRXaWR0aC0xCi0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDEsIExTTCAjOAotbG9vcF95Ci0gICAgTERSICAgICB4XzNfMSwgW3JlZiwgIy04XQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAzLCBMU0wgIzgKLSAgICBMRFIgICAgIHhfN181LCBbcmVmLCAjLTRdCi0gICAgVVhUQjE2ICB4XzJfMCwgeF8zXzEKLSAgICBVWFRCMTYgIHhfM18xLCB4XzNfMSwgUk9SICM4Ci0gICAgVVhUQjE2ICB4XzZfNCwgeF83XzUKLQotbG9vcF94Ci0gICAgVVhUQjE2ICB4XzdfNSwgeF83XzUsIFJPUiAjOAotCi0gICAgU01MQUQgICB0bXAxLCB4XzJfMCwgbXVsdF8yMF8wMSwgcGx1czE2Ci0gICAgU01MQVRCICB0bXAzLCB4XzJfMCwgbXVsdF8yMF8wMSwgcGx1czE2Ci0gICAgU01MQVRCICB0bXAyLCB4XzJfMCwgbXVsdF8yMF9tNSwgcGx1czE2Ci0gICAgU01MQVRCICB0bXA0LCB4XzNfMSwgbXVsdF8yMF8wMSwgcGx1czE2Ci0KLSAgICBTTUxBRCAgIHRtcDEsIHhfM18xLCBtdWx0XzIwX201LCB0bXAxCi0gICAgU01MQVRCICB0bXAzLCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wMwotICAgIFNNTEFEICAgdG1wMiwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDIKLSAgICBMRFIgICAgIHhfM18xLCBbcmVmXSwgIzQKLSAgICBTTUxBRCAgIHRtcDQsIHhfNl80LCBtdWx0XzIwX201LCB0bXA0Ci0KLSAgICBTTUxBQkIgIHRtcDEsIHhfNl80LCBtdWx0XzIwX201LCB0bXAxCi0gICAgU01MQURYICB0bXAzLCB4XzZfNCwgbXVsdF8yMF9tNSwgdG1wMwotICAgIFNNTEFEWCAgdG1wMiwgeF82XzQsIG11bHRfMjBfMDEsIHRtcDIKLSAgICBTTUxBRFggIHRtcDQsIHhfN181LCBtdWx0XzIwX201LCB0bXA0Ci0KLSAgICBTTUxBQkIgIHRtcDEsIHhfN181LCBtdWx0XzIwXzAxLCB0bXAxCi0gICAgVVhUQjE2ICB4XzJfMCwgeF8zXzEKLSAgICBTTUxBQkIgIHRtcDIsIHhfN181LCBtdWx0XzIwX201LCB0bXAyCi0gICAgU01MQURYICB0bXAzLCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wMwotICAgIFNNTEFCQiAgdG1wNCwgeF8yXzAsIG11bHRfMjBfMDEsIHRtcDQKLQotICAgIE1PViAgICAgdG1wMiwgdG1wMiwgQVNSICM1Ci0gICAgTU9WICAgICB0bXAxLCB0bXAxLCBBU1IgIzUKLSAgICBQS0hCVCAgIHRtcDIsIHRtcDIsIHRtcDQsIExTTCAjKDE2LTUpCi0gICAgUEtIQlQgICB0bXAxLCB0bXAxLCB0bXAzLCBMU0wgIygxNi01KQotICAgIFVTQVQxNiAgdG1wMiwgIzgsIHRtcDIKLSAgICBVU0FUMTYgIHRtcDEsICM4LCB0bXAxCi0KLSAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI4Ci0gICAgT1JSICAgICB0bXAxLCB0bXAxLCB0bXAyLCBMU0wgIzgKLSAgICBTVFIgICAgIHRtcDEsIFttYl0sICM0Ci0gICAgQkNDICAgICBuZXh0X3kKLQotICAgIFVYVEIxNiAgeF8zXzEsIHhfM18xLCBST1IgIzgKLQotICAgIFNNTEFEICAgdG1wMSwgeF82XzQsIG11bHRfMjBfMDEsIHBsdXMxNgotICAgIFNNTEFUQiAgdG1wMywgeF82XzQsIG11bHRfMjBfMDEsIHBsdXMxNgotICAgIFNNTEFUQiAgdG1wMiwgeF82XzQsIG11bHRfMjBfbTUsIHBsdXMxNgotICAgIFNNTEFUQiAgdG1wNCwgeF83XzUsIG11bHRfMjBfMDEsIHBsdXMxNgotCi0gICAgU01MQUQgICB0bXAxLCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wMQotICAgIFNNTEFUQiAgdG1wMywgeF83XzUsIG11bHRfMjBfbTUsIHRtcDMKLSAgICBTTUxBRCAgIHRtcDIsIHhfN181LCBtdWx0XzIwXzAxLCB0bXAyCi0gICAgTERSICAgICB4XzdfNSwgW3JlZl0sICM0Ci0gICAgU01MQUQgICB0bXA0LCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wNAotCi0gICAgU01MQUJCICB0bXAxLCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wMQotICAgIFNNTEFEWCAgdG1wMywgeF8yXzAsIG11bHRfMjBfbTUsIHRtcDMKLSAgICBTTUxBRFggIHRtcDIsIHhfMl8wLCBtdWx0XzIwXzAxLCB0bXAyCi0gICAgU01MQURYICB0bXA0LCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wNAotCi0gICAgU01MQUJCICB0bXAxLCB4XzNfMSwgbXVsdF8yMF8wMSwgdG1wMQotICAgIFVYVEIxNiAgeF82XzQsIHhfN181Ci0gICAgU01MQUJCICB0bXAyLCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wMgotICAgIFNNTEFEWCAgdG1wMywgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDMKLSAgICBTTUxBQkIgIHRtcDQsIHhfNl80LCBtdWx0XzIwXzAxLCB0bXA0Ci0KLSAgICBNT1YgICAgIHRtcDIsIHRtcDIsIEFTUiAjNQotICAgIE1PViAgICAgdG1wMSwgdG1wMSwgQVNSICM1Ci0gICAgUEtIQlQgICB0bXAyLCB0bXAyLCB0bXA0LCBMU0wgIygxNi01KQotICAgIFBLSEJUICAgdG1wMSwgdG1wMSwgdG1wMywgTFNMICMoMTYtNSkKLSAgICBVU0FUMTYgIHRtcDIsICM4LCB0bXAyCi0gICAgVVNBVDE2ICB0bXAxLCAjOCwgdG1wMQotCi0gICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyOAotICAgIE9SUiAgICAgdG1wMSwgdG1wMSwgdG1wMiwgTFNMICM4Ci0gICAgU1RSICAgICB0bXAxLCBbbWJdLCAjNAotICAgIEJDUyAgICAgbG9vcF94Ci0KLW5leHRfeQotICAgIEFORCAgICAgdG1wMywgY291bnQsICMweDAwRjAwMDAwICAgIDsvLyBwYXJ0V2lkdGgtMQotICAgIFNNTEFCQiAgcmVmLCBjb3VudCwgbXVsdF8yMF8wMSwgcmVmIDsvLyArd2lkdGgKLSAgICBBRERTICAgIG1iLCBtYiwgIzE2ICAgICAgICAgICAgICAgICA7Ly8gKzE2LCBDYXJyeT0wCi0gICAgU0JDICAgICBtYiwgbWIsIHRtcDMsIExTUiAjMjAgICAgICAgOy8vIC0ocGFydFdpZHRoLTEpLTEKLSAgICBTQkMgICAgIHJlZiwgcmVmLCB0bXAzLCBMU1IgIzIwICAgICA7Ly8gLShwYXJ0V2lkdGgtMSktMQotICAgIEFERFMgICAgY291bnQsIGNvdW50LCAjKDE8PDI4KS0oMTw8MjQpCi0gICAgQkdFICAgICBsb29wX3kKLQotICAgIEFERCAgICAgc3Asc3AsIzB4MWY0Ci0gICAgTERNRkQgICBzcCEsIHtyNC1yMTEsIHBjfQotCi0gICAgRU5ECi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfaG9yX3F1YXJ0ZXIucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfaG9yX3F1YXJ0ZXIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUyNDNkNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2hvcl9xdWFydGVyLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotOwotOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsKLTsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsKLTsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTstLQotOy0tIEFic3RyYWN0IDogQVJNdjYgb3B0aW1pemVkIHZlcnNpb24gb2YgaDI2NGJzZEludGVycG9sYXRlSG9yUXVhcnRlciBmdW5jdGlvbgotOy0tCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLSAgICBJRiA6REVGOiBIMjY0REVDX1dJTkFTTQotICAgICAgICA7Ly8gV2UgZG9udCB1c2UgUkVRVUlSRTggYW5kIFBSRVNFUlZFOCBmb3Igd2luYXNtCi0gICAgRUxTRQotICAgICAgICBSRVFVSVJFOAotICAgICAgICBQUkVTRVJWRTgKLSAgICBFTkRJRgotCi0gICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCi0KLTsvLyBoMjY0YnNkSW50ZXJwb2xhdGVIb3JRdWFydGVyIHJlZ2lzdGVyIGFsbG9jYXRpb24KLQotcmVmICAgICBSTiAwCi0KLW1iICAgICAgUk4gMQotYnVmZiAgICBSTiAxCi0KLWNvdW50ICAgUk4gMgoteDAgICAgICBSTiAyCi0KLXkwICAgICAgUk4gMwoteF8yXzAgICBSTiAzCi0KLXdpZHRoICAgUk4gNAoteF8zXzEgICBSTiA0Ci0KLWhlaWdodCAgUk4gNQoteF82XzQgICBSTiA1Ci0KLXBhcnRXICAgUk4gNgoteF83XzUgICBSTiA2Ci0KLXBhcnRIICAgUk4gNwotdG1wMSAgICBSTiA3Ci0KLXRtcDIgICAgUk4gOAotCi10bXAzICAgIFJOIDkKLQotdG1wNCAgICBSTiAxMAotCi1tdWx0XzIwXzAxICBSTiAxMQotCi1tdWx0XzIwX201ICBSTiAxMgotCi1wbHVzMTYgIFJOIDE0Ci0KLQotOy8vIGZ1bmN0aW9uIGV4cG9ydHMgYW5kIGltcG9ydHMKLQotICAgIElNUE9SVCAgaDI2NGJzZEZpbGxCbG9jawotCi0gICAgRVhQT1JUICBoMjY0YnNkSW50ZXJwb2xhdGVIb3JRdWFydGVyCi0KLQotOy8vIEhvcml6b250YWwgZmlsdGVyIGFwcHJvYWNoCi07Ly8KLTsvLyBCYXNpYyBpZGVhIGluIGhvcml6b250YWwgZmlsdGVyaW5nIGlzIHRvIGFkanVzdCBjb2VmZmljaWVudHMKLTsvLyBsaWtlIGJlbG93LiBDYWxjdWxhdGlvbiBpcyBkb25lIHdpdGggMTYtYml0IG1hdGhzLgotOy8vCi07Ly8gUmVnICAgICB4XzJfMCAgICAgeF8zXzEgICAgIHhfNl80ICAgICB4XzdfNSAgICAgeF8yXzAKLTsvLyAgICAgICBbICAyICAwIF0gWyAgMyAgMSBdIFsgIDYgIDQgXSBbICA3ICA1IF0gWyAxMCAgOCBdIC4uLgotOy8vIHlfMCA9ICAgMjAgIDEgICAgIDIwIC01ICAgICAgICAtNSAgICAgICAgIDEKLTsvLyB5XzEgPSAgIC01ICAgICAgICAyMCAgMSAgICAgIDEgMjAgICAgICAgIC01Ci07Ly8geV8yID0gICAgMSAgICAgICAgLTUgICAgICAgIC01IDIwICAgICAgMSAyMAotOy8vIHlfMyA9ICAgICAgICAgICAgICAxICAgICAgICAyMCAtNSAgICAgLTUgMjAgICAgICAgICAxCi0KLQotaDI2NGJzZEludGVycG9sYXRlSG9yUXVhcnRlcgotICAgIFNUTUZEICAgc3AhLCB7cjAtcjExLCBscn0KLSAgICBTVUIgICAgIHNwLCBzcCwgIzB4MWU0Ci0KLSAgICBDTVAgICAgIHgwLCAjMAotICAgIEJMVCAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh4MCA8IDApCi0gICAgTERSICAgICBwYXJ0VywgW3NwLCMweDIyMF0gICAgICA7Ly8gcGFydFdpZHRoCi0gICAgQUREICAgICB0bXA0LCB4MCwgcGFydFcgICAgICAgICA7Ly8gKHgwK3BhcnRXaWR0aCkKLSAgICBBREQgICAgIHRtcDQsIHRtcDQsICM1ICAgICAgICAgIDsvLyAoeTArcGFydFcrNSkKLSAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAotICAgIENNUCAgICAgdG1wNCwgd2lkdGgKLSAgICBCSEkgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeDArcGFydFcpPndpZHRoCi0KLSAgICBDTVAgICAgIHkwLCAjMAotICAgIEJMVCAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh5MCA8IDApCi0gICAgTERSICAgICBwYXJ0SCwgW3NwLCMweDIyNF0gICAgICA7Ly8gcGFydEhlaWdodAotICAgIEFERCAgICAgdG1wMiwgeTAsIHBhcnRIICAgICAgICAgOy8vICh5MCtwYXJ0SGVpZ2h0KQotICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4MjFjXSAgICAgOy8vIGhlaWdodAotICAgIENNUCAgICAgdG1wMiwgaGVpZ2h0Ci0gICAgQkxTICAgICBza2lwX2ZpbGwgICAgICAgICAgICAgICA7Ly8gbm8gb3ZlcmZpbGwgbmVlZGVkCi0KLQotZG9fZmlsbAotICAgIExEUiAgICAgcGFydEgsIFtzcCwjMHgyMjRdICAgICAgOy8vIHBhcnRIZWlnaHQKLSAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweDIxY10gICAgIDsvLyBoZWlnaHQKLSAgICBMRFIgICAgIHBhcnRXLCBbc3AsIzB4MjIwXSAgICAgIDsvLyBwYXJ0V2lkdGgKLSAgICBBREQgICAgIHRtcDQsIHBhcnRXLCAjNSAgICAgICAgIDsvLyB0bXA0ID0gcGFydFcgKyA1OwotICAgIFNUTUlCICAgc3AsIHtoZWlnaHQsIHRtcDR9ICAgICAgOy8vIHNwKzQgPSBoZWlnaHQsIHNwKzggPSBwYXJ0V2lkdGgrNQotICAgIFNUUiAgICAgcGFydEgsIFtzcCwjMHhjXSAgICAgICAgOy8vIHNwK2MgPSBwYXJ0SGVpZ2h0Ci0gICAgU1RSICAgICB0bXA0LCBbc3AsIzB4MTBdICAgICAgICA7Ly8gc3ArMTAgPSBwYXJ0V2lkdGgrNQotICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCi0gICAgU1RSICAgICB3aWR0aCwgW3NwLCMwXSAgICAgICAgICA7Ly8gc3ArMCA9IHdpZHRoCi0gICAgQUREICAgICBidWZmLCBzcCwgIzB4MjggICAgICAgICA7Ly8gYnVmZiA9IHAxWzIxKjIxLzQrMV0KLSAgICBCTCAgICAgIGgyNjRic2RGaWxsQmxvY2sKLQotICAgIE1PViAgICAgeDAsICMwCi0gICAgU1RSICAgICB4MCxbc3AsIzB4MWVjXSAgICAgICAgICA7Ly8geDAgPSAwCi0gICAgU1RSICAgICB4MCxbc3AsIzB4MWYwXSAgICAgICAgICA7Ly8geTAgPSAwCi0gICAgQUREICAgICByZWYsc3AsIzB4MjggICAgICAgICAgICA7Ly8gcmVmID0gcDEKLSAgICBTVFIgICAgIHRtcDQsIFtzcCwjMHgyMThdICAgICAgIDsvLyB3aWR0aCA9IHBhcnRXaWR0aCs1Ci0KLQotc2tpcF9maWxsCi0gICAgTERSICAgICB4MCAsW3NwLCMweDFlY10gICAgICAgICA7Ly8geDAKLSAgICBMRFIgICAgIHkwICxbc3AsIzB4MWYwXSAgICAgICAgIDsvLyB5MAotICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCi0gICAgTUxBICAgICB0bXAyLCB3aWR0aCwgeTAsIHgwICAgICA7Ly8geTAqd2lkdGgreDAKLSAgICBBREQgICAgIHJlZiwgcmVmLCB0bXAyICAgICAgICAgIDsvLyByZWYgKz0geTAqd2lkdGgreDAKLSAgICBBREQgICAgIHJlZiwgcmVmLCAjOCAgICAgICAgICAgIDsvLyByZWYgPSByZWYrOAotICAgIExEUiAgICAgbWIsIFtzcCwgIzB4MWU4XSAgICAgICAgOy8vIG1iCi0KLSAgICA7Ly8gcGFjayB2YWx1ZXMgdG8gY291bnQgcmVnaXN0ZXIKLSAgICA7Ly8gWzMxOjI4XSBsb29wX3ggKHBhcnRXaWR0aC0xKQotICAgIDsvLyBbMjc6MjRdIGxvb3BfeSAocGFydEhlaWdodC0xKQotICAgIDsvLyBbMjM6MjBdIHBhcnRXaWR0aC0xCi0gICAgOy8vIFsxOToxNl0gcGFydEhlaWdodC0xCi0gICAgOy8vIFsxNTowMF0gd2lkdGgKLSAgICBNT1YgICAgIGNvdW50LCB3aWR0aAotICAgIFNVQiAgICAgcGFydFcsIHBhcnRXLCAjMTsKLSAgICBTVUIgICAgIHBhcnRILCBwYXJ0SCwgIzE7Ci0gICAgQUREICAgICB0bXAyLCBwYXJ0SCwgcGFydFcsIExTTCAjNAotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAyLCBMU0wgIzE2Ci0KLQotICAgIExEUiAgICAgbXVsdF8yMF8wMSwgPSAweDAwMTQwMDAxCi0gICAgTERSICAgICBtdWx0XzIwX201LCA9IDB4MDAxNEZGRkIKLSAgICBNT1YgICAgIHBsdXMxNiwgIzE2Ci0gICAgQU5EICAgICB0bXAxLCBjb3VudCwgIzB4MDAwRjAwMDAgICAgOy8vIHBhcnRIZWlnaHQtMQotICAgIEFORCAgICAgdG1wMywgY291bnQsICMweDAwRjAwMDAwICAgIDsvLyBwYXJ0V2lkdGgtMQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAxLCBMU0wgIzgKLWxvb3BfeQotICAgIExEUiAgICAgeF8zXzEsIFtyZWYsICMtOF0KLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMywgTFNMICM4Ci0gICAgTERSICAgICB4XzdfNSwgW3JlZiwgIy00XQotICAgIFVYVEIxNiAgeF8yXzAsIHhfM18xCi0gICAgVVhUQjE2ICB4XzNfMSwgeF8zXzEsIFJPUiAjOAotICAgIFVYVEIxNiAgeF82XzQsIHhfN181Ci0KLWxvb3BfeAotICAgIFVYVEIxNiAgeF83XzUsIHhfN181LCBST1IgIzgKLQotICAgIFNNTEFEICAgdG1wMSwgeF8yXzAsIG11bHRfMjBfMDEsIHBsdXMxNgotICAgIFNNTEFUQiAgdG1wMywgeF8yXzAsIG11bHRfMjBfMDEsIHBsdXMxNgotICAgIFNNTEFUQiAgdG1wMiwgeF8yXzAsIG11bHRfMjBfbTUsIHBsdXMxNgotICAgIFNNTEFUQiAgdG1wNCwgeF8zXzEsIG11bHRfMjBfMDEsIHBsdXMxNgotCi0gICAgU01MQUQgICB0bXAxLCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wMQotICAgIFNNTEFUQiAgdG1wMywgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDMKLSAgICBTTUxBRCAgIHRtcDIsIHhfM18xLCBtdWx0XzIwXzAxLCB0bXAyCi0gICAgTERSICAgICB4XzNfMSwgW3JlZl0sICM0Ci0gICAgU01MQUQgICB0bXA0LCB4XzZfNCwgbXVsdF8yMF9tNSwgdG1wNAotCi0gICAgU01MQUJCICB0bXAxLCB4XzZfNCwgbXVsdF8yMF9tNSwgdG1wMQotICAgIFNNTEFEWCAgdG1wMywgeF82XzQsIG11bHRfMjBfbTUsIHRtcDMKLSAgICBTTUxBRFggIHRtcDIsIHhfNl80LCBtdWx0XzIwXzAxLCB0bXAyCi0gICAgU01MQURYICB0bXA0LCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wNAotCi0gICAgU01MQUJCICB0bXAxLCB4XzdfNSwgbXVsdF8yMF8wMSwgdG1wMQotICAgIFVYVEIxNiAgeF8yXzAsIHhfM18xCi0gICAgU01MQUJCICB0bXAyLCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wMgotICAgIFNNTEFEWCAgdG1wMywgeF83XzUsIG11bHRfMjBfMDEsIHRtcDMKLSAgICBTTUxBQkIgIHRtcDQsIHhfMl8wLCBtdWx0XzIwXzAxLCB0bXA0Ci0KLSAgICBNT1YgICAgIHRtcDIsIHRtcDIsIEFTUiAjNQotICAgIE1PViAgICAgdG1wMSwgdG1wMSwgQVNSICM1Ci0gICAgUEtIQlQgICB0bXAyLCB0bXAyLCB0bXA0LCBMU0wgIygxNi01KQotICAgIFBLSEJUICAgdG1wMSwgdG1wMSwgdG1wMywgTFNMICMoMTYtNSkKLSAgICBMRFIgICAgIHRtcDQsIFtzcCwgIzB4MjI4XQotICAgIFVTQVQxNiAgdG1wMiwgIzgsIHRtcDIKLSAgICBVU0FUMTYgIHRtcDEsICM4LCB0bXAxCi0gICAgU1VCICAgICB0bXA0LCB0bXA0LCAjMTAKLQotICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjNDw8MjgKLSAgICBMRFIgICAgIHRtcDMsIFtyZWYsIHRtcDRdCi0gICAgT1JSICAgICB0bXAxLCB0bXAxLCB0bXAyLCBMU0wgIzgKLQotOy8vIHF1YXJ0ZXIgcGVsIHBvc2l0aW9uCi0gICAgTERSICAgICB0bXAyLCA9IDB4ODA4MDgwODAKLSAgICBNVk4gICAgIHRtcDMsIHRtcDMKLSAgICBVSFNVQjggIHRtcDEsIHRtcDEsIHRtcDMKLSAgICBFT1IgICAgIHRtcDEsIHRtcDEsIHRtcDIKLSAgICBTVFIgICAgIHRtcDEsIFttYl0sICM0Ci0KLSAgICBCQ0MgICAgIG5leHRfeQotCi0gICAgVVhUQjE2ICB4XzNfMSwgeF8zXzEsIFJPUiAjOAotCi0gICAgU01MQUQgICB0bXAxLCB4XzZfNCwgbXVsdF8yMF8wMSwgcGx1czE2Ci0gICAgU01MQVRCICB0bXAzLCB4XzZfNCwgbXVsdF8yMF8wMSwgcGx1czE2Ci0gICAgU01MQVRCICB0bXAyLCB4XzZfNCwgbXVsdF8yMF9tNSwgcGx1czE2Ci0gICAgU01MQVRCICB0bXA0LCB4XzdfNSwgbXVsdF8yMF8wMSwgcGx1czE2Ci0KLSAgICBTTUxBRCAgIHRtcDEsIHhfN181LCBtdWx0XzIwX201LCB0bXAxCi0gICAgU01MQVRCICB0bXAzLCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wMwotICAgIFNNTEFEICAgdG1wMiwgeF83XzUsIG11bHRfMjBfMDEsIHRtcDIKLSAgICBMRFIgICAgIHhfN181LCBbcmVmXSwgIzQKLSAgICBTTUxBRCAgIHRtcDQsIHhfMl8wLCBtdWx0XzIwX201LCB0bXA0Ci0KLSAgICBTTUxBQkIgIHRtcDEsIHhfMl8wLCBtdWx0XzIwX201LCB0bXAxCi0gICAgU01MQURYICB0bXAzLCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wMwotICAgIFNNTEFEWCAgdG1wMiwgeF8yXzAsIG11bHRfMjBfMDEsIHRtcDIKLSAgICBTTUxBRFggIHRtcDQsIHhfM18xLCBtdWx0XzIwX201LCB0bXA0Ci0KLSAgICBTTUxBQkIgIHRtcDEsIHhfM18xLCBtdWx0XzIwXzAxLCB0bXAxCi0gICAgVVhUQjE2ICB4XzZfNCwgeF83XzUKLSAgICBTTUxBQkIgIHRtcDIsIHhfM18xLCBtdWx0XzIwX201LCB0bXAyCi0gICAgU01MQURYICB0bXAzLCB4XzNfMSwgbXVsdF8yMF8wMSwgdG1wMwotICAgIFNNTEFCQiAgdG1wNCwgeF82XzQsIG11bHRfMjBfMDEsIHRtcDQKLQotICAgIE1PViAgICAgdG1wMiwgdG1wMiwgQVNSICM1Ci0gICAgTU9WICAgICB0bXAxLCB0bXAxLCBBU1IgIzUKLSAgICBQS0hCVCAgIHRtcDIsIHRtcDIsIHRtcDQsIExTTCAjKDE2LTUpCi0gICAgUEtIQlQgICB0bXAxLCB0bXAxLCB0bXAzLCBMU0wgIygxNi01KQotICAgIExEUiAgICAgdG1wNCwgW3NwLCAjMHgyMjhdCi0gICAgVVNBVDE2ICB0bXAyLCAjOCwgdG1wMgotICAgIFVTQVQxNiAgdG1wMSwgIzgsIHRtcDEKLSAgICBTVUIgICAgIHRtcDQsIHRtcDQsICMxMAotCi0gICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyOAotICAgIExEUiAgICAgdG1wMywgW3JlZiwgdG1wNF0KLSAgICBPUlIgICAgIHRtcDEsIHRtcDEsIHRtcDIsIExTTCAjOAotCi07Ly8gcXVhcnRlciBwZWwKLSAgICBMRFIgICAgIHRtcDIsID0gMHg4MDgwODA4MAotICAgIE1WTiAgICAgdG1wMywgdG1wMwotICAgIFVIU1VCOCAgdG1wMSwgdG1wMSwgdG1wMwotICAgIEVPUiAgICAgdG1wMSwgdG1wMSwgdG1wMgotCi0gICAgU1RSICAgICB0bXAxLCBbbWJdLCAjNAotICAgIEJDUyAgICAgbG9vcF94Ci0KLW5leHRfeQotICAgIEFORCAgICAgdG1wMywgY291bnQsICMweDAwRjAwMDAwICAgIDsvLyBwYXJ0V2lkdGgtMQotICAgIFNNTEFCQiAgcmVmLCBjb3VudCwgbXVsdF8yMF8wMSwgcmVmIDsvLyArd2lkdGgKLSAgICBBRERTICAgIG1iLCBtYiwgIzE2ICAgICAgICAgICAgICAgICA7Ly8gKzE2LCBDYXJyeT0wCi0gICAgU0JDICAgICBtYiwgbWIsIHRtcDMsIExTUiAjMjAgICAgICAgOy8vIC0ocGFydFdpZHRoLTEpLTEKLSAgICBTQkMgICAgIHJlZiwgcmVmLCB0bXAzLCBMU1IgIzIwICAgICA7Ly8gLShwYXJ0V2lkdGgtMSktMQotICAgIEFERFMgICAgY291bnQsIGNvdW50LCAjKDE8PDI4KS0oMTw8MjQpCi0gICAgQkdFICAgICBsb29wX3kKLQotICAgIEFERCAgICAgc3Asc3AsIzB4MWY0Ci0gICAgTERNRkQgICBzcCEsIHtyNC1yMTEsIHBjfQotCi0gICAgRU5ECi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfaG9yX3Zlcl9xdWFydGVyLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX2hvcl92ZXJfcXVhcnRlci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzc5YjM5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfaG9yX3Zlcl9xdWFydGVyLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1MzYgKzAsMCBAQAotOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotOwotOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsKLTsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsKLTsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTstLQotOy0tIEFic3RyYWN0IDogQVJNdjYgb3B0aW1pemVkIHZlcnNpb24gb2YgaDI2NGJzZEludGVycG9sYXRlSG9yVmVyUXVhcnRlciAKLTstLSAgICAgICAgICAgIGZ1bmN0aW9uCi07LS0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotICAgIElGIDpERUY6IEgyNjRERUNfV0lOQVNNCi0gICAgICAgIDsvLyBXZSBkb250IHVzZSBSRVFVSVJFOCBhbmQgUFJFU0VSVkU4IGZvciB3aW5hc20KLSAgICBFTFNFCi0gICAgICAgIFJFUVVJUkU4Ci0gICAgICAgIFBSRVNFUlZFOAotICAgIEVORElGCi0KLSAgICBBUkVBICAgIHwudGV4dHwsIENPREUKLQotOy8vIGgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIgcmVnaXN0ZXIgYWxsb2NhdGlvbgotCi1yZWYgICAgIFJOIDAKLQotbWIgICAgICBSTiAxCi1idWZmICAgIFJOIDEKLQotY291bnQgICBSTiAyCi14MCAgICAgIFJOIDIKLQoteTAgICAgICBSTiAzCi14XzJfMCAgIFJOIDMKLXJlcyAgICAgUk4gMwotCi14XzNfMSAgIFJOIDQKLXRtcDEgICAgUk4gNAotCi1oZWlnaHQgIFJOIDUKLXhfNl80ICAgUk4gNQotdG1wMiAgICBSTiA1Ci0KLXBhcnRXICAgUk4gNgoteF83XzUgICBSTiA2Ci10bXAzICAgIFJOIDYKLQotcGFydEggICBSTiA3Ci10bXA0ICAgIFJOIDcKLQotdG1wNSAgICBSTiA4Ci0KLXRtcDYgICAgUk4gOQotCi10bXBhICAgIFJOIDEwCi0KLW11bHRfMjBfMDEgIFJOIDExCi10bXBiICAgICAgICBSTiAxMQotCi1tdWx0XzIwX201ICBSTiAxMgotd2lkdGggICAgICAgUk4gMTIKLQotcGx1czE2ICBSTiAxNAotCi0KLTsvLyBmdW5jdGlvbiBleHBvcnRzIGFuZCBpbXBvcnRzCi0KLSAgICBJTVBPUlQgIGgyNjRic2RGaWxsQmxvY2sKLQotICAgIEVYUE9SVCAgaDI2NGJzZEludGVycG9sYXRlSG9yVmVyUXVhcnRlcgotCi07Ly8gSG9yaXpvbnRhbCBmaWx0ZXIgYXBwcm9hY2gKLTsvLwotOy8vIEJhc2ljIGlkZWEgaW4gaG9yaXpvbnRhbCBmaWx0ZXJpbmcgaXMgdG8gYWRqdXN0IGNvZWZmaWNpZW50cwotOy8vIGxpa2UgYmVsb3cuIENhbGN1bGF0aW9uIGlzIGRvbmUgd2l0aCAxNi1iaXQgbWF0aHMuCi07Ly8KLTsvLyBSZWcgICAgIHhfMl8wICAgICB4XzNfMSAgICAgeF82XzQgICAgIHhfN181ICAgICB4XzJfMAotOy8vICAgICAgIFsgIDIgIDAgXSBbICAzICAxIF0gWyAgNiAgNCBdIFsgIDcgIDUgXSBbIDEwICA4IF0gLi4uCi07Ly8geV8wID0gICAyMCAgMSAgICAgMjAgLTUgICAgICAgIC01ICAgICAgICAgMQotOy8vIHlfMSA9ICAgLTUgICAgICAgIDIwICAxICAgICAgMSAyMCAgICAgICAgLTUKLTsvLyB5XzIgPSAgICAxICAgICAgICAtNSAgICAgICAgLTUgMjAgICAgICAxIDIwCi07Ly8geV8zID0gICAgICAgICAgICAgIDEgICAgICAgIDIwIC01ICAgICAtNSAyMCAgICAgICAgIDEKLQotCi1oMjY0YnNkSW50ZXJwb2xhdGVIb3JWZXJRdWFydGVyCi0gICAgU1RNRkQgICBzcCEsIHtyMC1yMTEsIGxyfQotICAgIFNVQiAgICAgc3AsIHNwLCAjMHgxZTQKLQotICAgIENNUCAgICAgeDAsICMwCi0gICAgQkxUICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHgwIDwgMCkKLSAgICBMRFIgICAgIHBhcnRXLCBbc3AsIzB4MjIwXSAgICAgIDsvLyBwYXJ0V2lkdGgKLSAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAotICAgIEFERCAgICAgdG1wYSwgeDAsIHBhcnRXICAgICAgICAgOy8vICh4MCtwYXJ0V2lkdGgpCi0gICAgQUREICAgICB0bXBhLCB0bXBhLCAjNSAgICAgICAgICA7Ly8gKHgwK3BhcnRXKzUpCi0gICAgQ01QICAgICB0bXBhLCB3aWR0aAotICAgIEJISSAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh4MCtwYXJ0Vyk+d2lkdGgKLQotICAgIENNUCAgICAgeTAsICMwCi0gICAgQkxUICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHkwIDwgMCkKLSAgICBMRFIgICAgIHBhcnRILCBbc3AsIzB4MjI0XSAgICAgIDsvLyBwYXJ0SGVpZ2h0Ci0gICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHgyMWNdICAgICA7Ly8gaGVpZ2h0Ci0gICAgQUREICAgICB0bXA1LCB5MCwgcGFydEggICAgICAgICA7Ly8gKHkwK3BhcnRIZWlnaHQpCi0gICAgQUREICAgICB0bXA1LCB0bXA1LCAjNSAgICAgICAgICA7Ly8gKHkwK3BhcnRIKzUpCi0gICAgQ01QICAgICB0bXA1LCBoZWlnaHQKLSAgICBCTFMgICAgIHNraXBfZmlsbCAgICAgICAgICAgICAgIDsvLyBubyBvdmVyZmlsbCBuZWVkZWQKLQotCi1kb19maWxsCi0gICAgTERSICAgICBwYXJ0SCwgW3NwLCMweDIyNF0gICAgICA7Ly8gcGFydEhlaWdodAotICAgIExEUiAgICAgcGFydFcsIFtzcCwjMHgyMjBdICAgICAgOy8vIHBhcnRXaWR0aAotICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4MjFjXSAgICAgOy8vIGhlaWdodAotICAgIEFERCAgICAgdG1wNSwgcGFydEgsICM1ICAgICAgICAgOy8vIHRtcDUgPSBwYXJ0SCArIDUKLSAgICBBREQgICAgIHRtcGEsIHBhcnRXLCAjNSAgICAgICAgIDsvLyB0bXBhID0gcGFydFcgKyA1Ci0gICAgU1RNSUIgICBzcCwge2hlaWdodCwgdG1wYX0gICAgICA7Ly8gc3ArNCA9IGhlaWdodCwgc3ArOCA9IHBhcnRXaWR0aCs1Ci0gICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKLSAgICBTVFIgICAgIHRtcDUsIFtzcCwjMHhjXSAgICAgICAgIDsvLyBzcCtjID0gcGFydEhlaWdodCs1Ci0gICAgU1RSICAgICB0bXBhLCBbc3AsIzB4MTBdICAgICAgICA7Ly8gc3ArMTAgPSBwYXJ0V2lkdGgrNQotICAgIFNUUiAgICAgd2lkdGgsIFtzcCwjMF0gICAgICAgICAgOy8vIHNwKzAgPSB3aWR0aAotICAgIEFERCAgICAgYnVmZiwgc3AsICMweDI4ICAgICAgICAgOy8vIGJ1ZmYgPSBwMVsyMSoyMS80KzFdCi0gICAgQkwgICAgICBoMjY0YnNkRmlsbEJsb2NrCi0KLSAgICBNT1YgICAgIHgwLCAjMAotICAgIFNUUiAgICAgeDAsW3NwLCMweDFlY10gICAgICAgICAgOy8vIHgwID0gMAotICAgIFNUUiAgICAgeDAsW3NwLCMweDFmMF0gICAgICAgICAgOy8vIHkwID0gMAotICAgIEFERCAgICAgcmVmLHNwLCMweDI4ICAgICAgICAgICAgOy8vIHJlZiA9IHAxCi0gICAgU1RSICAgICB0bXBhLCBbc3AsIzB4MjE4XSAgICAgICA7Ly8gd2lkdGggPSBwYXJ0V2lkdGgrNQotCi0KLXNraXBfZmlsbAotICAgIExEUiAgICAgeDAgLFtzcCwjMHgxZWNdICAgICAgICAgOy8vIHgwCi0gICAgTERSICAgICB5MCAsW3NwLCMweDFmMF0gICAgICAgICA7Ly8geTAKLSAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAotICAgIExEUiAgICAgdG1wNiwgW3NwLCMweDIyOF0gICAgICAgOy8vIGhvclZlck9mZnNldAotICAgIExEUiAgICAgbWIsIFtzcCwgIzB4MWU4XSAgICAgICAgOy8vIG1iCi0gICAgTUxBICAgICB0bXA1LCB3aWR0aCwgeTAsIHgwICAgICA7Ly8geTAqd2lkdGgreDAKLSAgICBBREQgICAgIHJlZiwgcmVmLCB0bXA1ICAgICAgICAgIDsvLyByZWYgKz0geTAqd2lkdGgreDAKLSAgICBTVFIgICAgIHJlZiwgW3NwLCAjMHgxZTRdICAgICAgIDsvLyBzdG9yZSAicmVmIiBmb3IgdmVydGljYWwgZmlsdGVyaW5nCi0gICAgQU5EICAgICB0bXA2LCB0bXA2LCAjMiAgICAgICAgICA7Ly8gY2FsY3VsYXRlIHJlZiBmb3IgaG9yaXpvbnRhbCBmaWx0ZXIKLSAgICBNT1YgICAgIHRtcGEsICMyCi0gICAgQUREICAgICB0bXA2LCB0bXBhLCB0bXA2LCBMU1IgIzEKLSAgICBNTEEgICAgIHJlZiwgdG1wNiwgd2lkdGgsIHJlZgotICAgIEFERCAgICAgcmVmLCByZWYsICM4ICAgICAgICAgICAgOy8vIHJlZiA9IHJlZis4Ci0KLSAgICA7Ly8gcGFjayB2YWx1ZXMgdG8gY291bnQgcmVnaXN0ZXIKLSAgICA7Ly8gWzMxOjI4XSBsb29wX3ggKHBhcnRXaWR0aC0xKQotICAgIDsvLyBbMjc6MjRdIGxvb3BfeSAocGFydEhlaWdodC0xKQotICAgIDsvLyBbMjM6MjBdIHBhcnRXaWR0aC0xCi0gICAgOy8vIFsxOToxNl0gcGFydEhlaWdodC0xCi0gICAgOy8vIFsxNTowMF0gd2lkdGgKLSAgICBNT1YgICAgIGNvdW50LCB3aWR0aAotICAgIFNVQiAgICAgcGFydFcsIHBhcnRXLCAjMTsKLSAgICBTVUIgICAgIHBhcnRILCBwYXJ0SCwgIzE7Ci0gICAgQUREICAgICB0bXA1LCBwYXJ0SCwgcGFydFcsIExTTCAjNAotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXA1LCBMU0wgIzE2Ci0KLQotICAgIExEUiAgICAgbXVsdF8yMF8wMSwgPSAweDAwMTQwMDAxICAgIDsvLyBjb25zdGFudCBtdWx0aXBsaWVycwotICAgIExEUiAgICAgbXVsdF8yMF9tNSwgPSAweDAwMTRGRkZCICAgIDsvLyBjb25zdGFudCBtdWx0aXBsaWVycwotICAgIE1PViAgICAgcGx1czE2LCAjMTYgICAgICAgICAgICAgICAgIDsvLyBjb25zdGFudCBmb3IgYWRkCi0gICAgQU5EICAgICB0bXA0LCBjb3VudCwgIzB4MDAwRjAwMDAgICAgOy8vIHBhcnRIZWlnaHQtMQotICAgIEFORCAgICAgdG1wNiwgY291bnQsICMweDAwRjAwMDAwICAgIDsvLyBwYXJ0V2lkdGgtMQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXA0LCBMU0wgIzggIDsvLyBwYXJ0SC0xIHRvIGxvd2VyIHBhcnQgb2YgdG9wIGJ5dGUKLQotOy8vIEhPUklaT05UQUwgUEFSVAotCi1sb29wX3lfaG9yCi0gICAgTERSICAgICB4XzNfMSwgW3JlZiwgIy04XQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXA2LCBMU0wgIzggICA7Ly8gcGFydFctMSB0byB1cHBlciBwYXJ0IG9mIHRvcCBieXRlCi0gICAgTERSICAgICB4XzdfNSwgW3JlZiwgIy00XQotICAgIFVYVEIxNiAgeF8yXzAsIHhfM18xCi0gICAgVVhUQjE2ICB4XzNfMSwgeF8zXzEsIFJPUiAjOAotICAgIFVYVEIxNiAgeF82XzQsIHhfN181Ci0KLWxvb3BfeF9ob3IKLSAgICBVWFRCMTYgIHhfN181LCB4XzdfNSwgUk9SICM4Ci0KLSAgICBTTUxBRCAgIHRtcDQsIHhfMl8wLCBtdWx0XzIwXzAxLCBwbHVzMTYKLSAgICBTTUxBVEIgIHRtcDYsIHhfMl8wLCBtdWx0XzIwXzAxLCBwbHVzMTYKLSAgICBTTUxBVEIgIHRtcDUsIHhfMl8wLCBtdWx0XzIwX201LCBwbHVzMTYKLSAgICBTTUxBVEIgIHRtcGEsIHhfM18xLCBtdWx0XzIwXzAxLCBwbHVzMTYKLQotICAgIFNNTEFEICAgdG1wNCwgeF8zXzEsIG11bHRfMjBfbTUsIHRtcDQKLSAgICBTTUxBVEIgIHRtcDYsIHhfM18xLCBtdWx0XzIwX201LCB0bXA2Ci0gICAgU01MQUQgICB0bXA1LCB4XzNfMSwgbXVsdF8yMF8wMSwgdG1wNQotICAgIExEUiAgICAgeF8zXzEsIFtyZWZdLCAjNAotICAgIFNNTEFEICAgdG1wYSwgeF82XzQsIG11bHRfMjBfbTUsIHRtcGEKLQotICAgIFNNTEFCQiAgdG1wNCwgeF82XzQsIG11bHRfMjBfbTUsIHRtcDQKLSAgICBTTUxBRFggIHRtcDYsIHhfNl80LCBtdWx0XzIwX201LCB0bXA2Ci0gICAgU01MQURYICB0bXA1LCB4XzZfNCwgbXVsdF8yMF8wMSwgdG1wNQotICAgIFNNTEFEWCAgdG1wYSwgeF83XzUsIG11bHRfMjBfbTUsIHRtcGEKLQotICAgIFNNTEFCQiAgdG1wNCwgeF83XzUsIG11bHRfMjBfMDEsIHRtcDQKLSAgICBVWFRCMTYgIHhfMl8wLCB4XzNfMQotICAgIFNNTEFCQiAgdG1wNSwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDUKLSAgICBTTUxBRFggIHRtcDYsIHhfN181LCBtdWx0XzIwXzAxLCB0bXA2Ci0gICAgU01MQUJCICB0bXBhLCB4XzJfMCwgbXVsdF8yMF8wMSwgdG1wYQotCi0gICAgTU9WICAgICB0bXA1LCB0bXA1LCBBU1IgIzUKLSAgICBNT1YgICAgIHRtcDQsIHRtcDQsIEFTUiAjNQotICAgIFBLSEJUICAgdG1wNSwgdG1wNSwgdG1wYSwgTFNMICMoMTYtNSkKLSAgICBQS0hCVCAgIHRtcDQsIHRtcDQsIHRtcDYsIExTTCAjKDE2LTUpCi0gICAgVVNBVDE2ICB0bXA1LCAjOCwgdG1wNQotICAgIFVTQVQxNiAgdG1wNCwgIzgsIHRtcDQKLQotICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjNDw8MjgKLSAgICBPUlIgICAgIHRtcDQsIHRtcDQsIHRtcDUsIExTTCAjOAotICAgIFNUUiAgICAgdG1wNCwgW21iXSwgIzQKLSAgICBCQ0MgICAgIG5leHRfeV9ob3IKLQotICAgIFVYVEIxNiAgeF8zXzEsIHhfM18xLCBST1IgIzgKLQotICAgIFNNTEFEICAgdG1wNCwgeF82XzQsIG11bHRfMjBfMDEsIHBsdXMxNgotICAgIFNNTEFUQiAgdG1wNiwgeF82XzQsIG11bHRfMjBfMDEsIHBsdXMxNgotICAgIFNNTEFUQiAgdG1wNSwgeF82XzQsIG11bHRfMjBfbTUsIHBsdXMxNgotICAgIFNNTEFUQiAgdG1wYSwgeF83XzUsIG11bHRfMjBfMDEsIHBsdXMxNgotCi0gICAgU01MQUQgICB0bXA0LCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wNAotICAgIFNNTEFUQiAgdG1wNiwgeF83XzUsIG11bHRfMjBfbTUsIHRtcDYKLSAgICBTTUxBRCAgIHRtcDUsIHhfN181LCBtdWx0XzIwXzAxLCB0bXA1Ci0gICAgTERSICAgICB4XzdfNSwgW3JlZl0sICM0Ci0gICAgU01MQUQgICB0bXBhLCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wYQotCi0gICAgU01MQUJCICB0bXA0LCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wNAotICAgIFNNTEFEWCAgdG1wNiwgeF8yXzAsIG11bHRfMjBfbTUsIHRtcDYKLSAgICBTTUxBRFggIHRtcDUsIHhfMl8wLCBtdWx0XzIwXzAxLCB0bXA1Ci0gICAgU01MQURYICB0bXBhLCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wYQotCi0gICAgU01MQUJCICB0bXA0LCB4XzNfMSwgbXVsdF8yMF8wMSwgdG1wNAotICAgIFVYVEIxNiAgeF82XzQsIHhfN181Ci0gICAgU01MQUJCICB0bXA1LCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wNQotICAgIFNNTEFEWCAgdG1wNiwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDYKLSAgICBTTUxBQkIgIHRtcGEsIHhfNl80LCBtdWx0XzIwXzAxLCB0bXBhCi0KLSAgICBNT1YgICAgIHRtcDUsIHRtcDUsIEFTUiAjNQotICAgIE1PViAgICAgdG1wNCwgdG1wNCwgQVNSICM1Ci0gICAgUEtIQlQgICB0bXA1LCB0bXA1LCB0bXBhLCBMU0wgIygxNi01KQotICAgIFBLSEJUICAgdG1wNCwgdG1wNCwgdG1wNiwgTFNMICMoMTYtNSkKLSAgICBVU0FUMTYgIHRtcDUsICM4LCB0bXA1Ci0gICAgVVNBVDE2ICB0bXA0LCAjOCwgdG1wNAotCi0gICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyOAotICAgIE9SUiAgICAgdG1wNCwgdG1wNCwgdG1wNSwgTFNMICM4Ci0gICAgU1RSICAgICB0bXA0LCBbbWJdLCAjNAotICAgIEJDUyAgICAgbG9vcF94X2hvcgotCi1uZXh0X3lfaG9yCi0gICAgQU5EICAgICB0bXA2LCBjb3VudCwgIzB4MDBGMDAwMDAgICAgICAgIDsvLyBwYXJ0V2lkdGgtMQotICAgIFNNTEFCQiAgcmVmLCBjb3VudCwgbXVsdF8yMF8wMSwgcmVmICAgICA7Ly8gK3dpZHRoCi0gICAgQUREUyAgICBtYiwgbWIsICMxNiAgICAgICAgICAgICAgICAgICAgIDsvLyArMTYsIENhcnJ5PTAKLSAgICBTQkMgICAgIG1iLCBtYiwgdG1wNiwgTFNSICMyMCAgICAgICAgICAgOy8vIC0ocGFydFdpZHRoLTEpLTEKLSAgICBTQkMgICAgIHJlZiwgcmVmLCB0bXA2LCBMU1IgIzIwICAgICAgICAgOy8vIC0ocGFydFdpZHRoLTEpLTEKLSAgICBBRERTICAgIGNvdW50LCBjb3VudCwgIygxPDwyOCktKDE8PDI0KSAgOy8vIGRlY3JlbWVudCBjb3VudGVyIChwYXJ0VykKLSAgICBCR0UgICAgIGxvb3BfeV9ob3IKLQotCi0KLTsvLyBWRVJUSUNBTCBQQVJUCi07Ly8KLTsvLyBBcHByb2FjaCB0byB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCi07Ly8KLTsvLyBJbnRlcnBvbGF0aW9uIGlzIGRvbmUgYnkgdXNpbmcgMzItYml0IGxvYWRzIGFuZCBzdG9yZXMKLTsvLyBhbmQgYnkgdXNpbmcgMTYgYml0IGFyaXRobWV0aWMuIDR4NCBibG9jayBpcyBwcm9jZXNzZWQKLTsvLyBpbiBlYWNoIHJvdW5kLgotOy8vCi07Ly8gfGFfMTF8YV8xMXxhXzExfGFfMTF8Li4ufGFfMW58YV8xbnxhXzFufGFfMW58Ci07Ly8gfGJfMTF8Yl8xMXxiXzExfGJfMTF8Li4ufGJfMW58Yl8xbnxiXzFufGJfMW58Ci07Ly8gfGNfMTF8Y18xMXxjXzExfGNfMTF8Li4ufGNfMW58Y18xbnxjXzFufGNfMW58Ci07Ly8gfGRfMTF8ZF8xMXxkXzExfGRfMTF8Li4ufGRfMW58ZF8xbnxkXzFufGRfMW58Ci07Ly8gICAgICAgICAgIC4uCi07Ly8gICAgICAgICAgIC4uCi07Ly8gfGFfbTF8YV9tMXxhX20xfGFfbTF8Li4uCi07Ly8gfGJfbTF8Yl9tMXxiX20xfGJfbTF8Li4uCi07Ly8gfGNfbTF8Y19tMXxjX20xfGNfbTF8Li4uCi07Ly8gfGRfbTF8ZF9tMXxkX20xfGRfbTF8Li4uCi0KLTsvLyBBcHByb2FjaCB0byBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIHRvIHF1YXJ0ZXIgcGVsIHBvc2l0aW9uLgotOy8vIDQgYnl0ZXMgYXJlIHByb2Nlc3NlZCBwYXJhbGxlbAotOy8vCi07Ly8gYWxnb3JpdGhtIChhK2IrMSkvMi4gUm91ZGluZyB1cHdhcmRzICsxIGNhbiBiZSBhY2hpZXZlZCBieSAKLTsvLyBuZWdhdGluZyBzZWNvbmQgb3BlcmFuZCB0byBnZXQgb25lJ3MgY29tcGxlbWVudCAoaW5zdGVhZCBvZiAyJ3MpCi07Ly8gYW5kIHVzaW5nIHN1YnRyYWN0aW9uLCBFT1IgaXMgdXNlZCB0byBjb3JyZWN0IHNpZ24uCi07Ly8KLTsvLyBNVk4gICAgIGIsIGIKLTsvLyBVSFNVQjggIGEsIGEsIGIKLTsvLyBFT1IgICAgIGEsIGEsIDB4ODA4MDgwODAKLQotCi0gICAgTERSICAgICByZWYsIFtzcCwgIzB4MWU0XSAgICAgICAgICAgOy8vIHJlZgotICAgIExEUiAgICAgdG1wYSwgW3NwLCAjMHgyMjhdICAgICAgICAgIDsvLyBob3JWZXJPZmZzZXQKLSAgICBMRFIgICAgIG1iLCBbc3AsICMweDFlOF0gICAgICAgICAgICA7Ly8gbWIKLSAgICBMRFIgICAgIHdpZHRoLCBbc3AsICMweDIxOF0gICAgICAgICA7Ly8gd2lkdGgKLSAgICBBREQgICAgIHJlZiwgcmVmLCAjMiAgICAgICAgICAgICAgICA7Ly8gY2FsY3VsYXRlIGNvcnJlY3QgcG9zaXRpb24KLSAgICBBTkQgICAgIHRtcGEsIHRtcGEsICMxCi0gICAgQUREICAgICByZWYsIHJlZiwgdG1wYQotICAgIExEUiAgICAgcGx1czE2LCA9IDB4MDAxMDAwMTAgICAgICAgIDsvLyArMTYgdG8gbG93ZXIgYW5kIHVwcGVyZiBoYWxmd29yZHMKLSAgICBBTkQgICAgIGNvdW50LCBjb3VudCwgIzB4MDBGRkZGRkYgICA7Ly8gcGFydFdpZHRoLTEKLQotICAgIEFORCAgICAgdG1wYSwgY291bnQsICMweDAwMEYwMDAwICAgIDsvLyBwYXJ0SGVpZ2h0LTEKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wYSwgTFNMICM4Ci0KLWxvb3BfeQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXA2LCBMU0wgIzggIDsvLyBwYXJ0V2lkdGgtMQotCi1sb29wX3gKLSAgICBMRFIgICAgIHRtcDEsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHxhNHxhM3xhMnxhMXwKLSAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHxjNHxjM3xjMnxjMXwKLSAgICBMRFIgICAgIHRtcDMsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHxnNHxnM3xnMnxnMXwKLSAgICBMRFIgICAgIHRtcDQsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHxtNHxtM3xtMnxtMXwKLSAgICBMRFIgICAgIHRtcDUsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHxyNHxyM3xyMnxyMXwKLSAgICBMRFIgICAgIHRtcDYsIFtyZWZdLCB3aWR0aCAgICAgOy8vIHx0NHx0M3x0Mnx0MXwKLQotICAgIDsvLyBmaXJzdCBmb3VyIHBpeGVscyAKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDMgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8Ci0gICAgVVhUQjE2ICB0bXBiLCB0bXAyICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0KLSAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDUgICAgICAgICAgICA7Ly8gfGMzK3IzfGMxK3IxfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0ErVAotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTERSICAgICByZXMsID0gMHgwMEZGMDBGRgotICAgIFVYVEIxNiAgdG1wYSwgdG1wMywgUk9SICM4ICAgICAgICAgIDsvLyB8ZzR8ZzJ8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA0LCBST1IgIzggICAgOy8vIHxnNCttNHxnMittMnwKLSAgICBBTkQgICAgIHJlcywgcmVzLCB0bXBiLCBMU1IgIzUgICAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCi0KLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0gICAgVVhUQjE2ICB0bXBiLCB0bXAyLCBST1IgIzggICAgICAgICAgOy8vIHxjNHxjMnwKLSAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNSwgUk9SICM4ICAgIDsvLyB8YzQrcjR8YzIrcjJ8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNiwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0ErVAotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTERSICAgICB0bXAxLCBbbWJdCi0gICAgTERSICAgICB0bXBhLCA9IDB4RkYwMEZGMDAKLSAgICBNVk4gICAgIHRtcDEsIHRtcDEKLSAgICBBTkQgICAgIHRtcGEsIHRtcGEsIHRtcGIsIExTTCAjMyAgICA7Ly8gbWFzayBhbmQgZGl2ZWRlIGJ5IDMyCi0gICAgT1JSICAgICByZXMsIHJlcywgdG1wYQotCi0gICAgTERSICAgICB0bXBhLCA9IDB4ODA4MDgwODAKLSAgICBVSFNVQjggIHJlcywgcmVzLCB0bXAxICAgICAgICAgICAgICA7Ly8gYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgotICAgIExEUiAgICAgdG1wMSwgW3JlZl0sIHdpZHRoICAgICAgICAgIDsvLyBsb2FkIG5leHQgcm93Ci0gICAgRU9SICAgICByZXMsIHJlcywgdG1wYSAgICAgICAgICAgICAgOy8vIGNvcnJlY3Qgc2lnbgotCi0gICAgU1RSICAgICByZXMsIFttYl0sICMxNiAgICAgICAgICAgICAgOy8vIG5leHQgcm93IChtYikKLQotCi0gICAgOy8vIHRtcDIgPSB8YTR8YTN8YTJ8YTF8Ci0gICAgOy8vIHRtcDMgPSB8YzR8YzN8YzJ8YzF8Ci0gICAgOy8vIHRtcDQgPSB8ZzR8ZzN8ZzJ8ZzF8Ci0gICAgOy8vIHRtcDUgPSB8bTR8bTN8bTJ8bTF8Ci0gICAgOy8vIHRtcDYgPSB8cjR8cjN8cjJ8cjF8Ci0gICAgOy8vIHRtcDEgPSB8dDR8dDN8dDJ8dDF8Ci0KLSAgICA7Ly8gc2Vjb25kIGZvdXIgcGl4ZWxzCi0gICAgVVhUQjE2ICB0bXBhLCB0bXA0ICAgICAgICAgICAgICAgICAgOy8vIHxnM3xnMXwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDUgICAgICAgICAgICA7Ly8gfGczK20zfGcxK20xfAotICAgIFVYVEIxNiAgdG1wYiwgdG1wMyAgICAgICAgICAgICAgICAgIDsvLyB8YzN8YzF8Ci0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNiAgICAgICAgICAgIDsvLyB8YzMrcjN8YzErcjF8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHJlcywgPSAweDAwRkYwMEZGCi0gICAgVVhUQjE2ICB0bXBhLCB0bXA0LCBST1IgIzggICAgICAgICAgOy8vIHxnNHxnMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDUsIFJPUiAjOCAgICA7Ly8gfGc0K200fGcyK20yfAotICAgIEFORCAgICAgcmVzLCByZXMsIHRtcGIsIExTUiAjNSAgICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKLQotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDMsIFJPUiAjOCAgICAgICAgICA7Ly8gfGM0fGMyfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA2LCBST1IgIzggICAgOy8vIHxjNCtyNHxjMityMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDIsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHRtcDIsIFttYl0KLSAgICBMRFIgICAgIHRtcGEsID0gMHhGRjAwRkYwMAotICAgIE1WTiAgICAgdG1wMiwgdG1wMgotCi0gICAgQU5EICAgICB0bXBhLCB0bXBhLCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgotICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKLSAgICBMRFIgICAgIHRtcGEsID0gMHg4MDgwODA4MAotICAgIFVIU1VCOCAgcmVzLCByZXMsIHRtcDIgICAgICAgICAgICAgIDsvLyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCi0gICAgTERSICAgICB0bXAyLCBbcmVmXSwgd2lkdGggICAgICAgICAgOy8vIGxvYWQgbmV4dCByb3cKLSAgICBFT1IgICAgIHJlcywgcmVzLCB0bXBhICAgICAgICAgICAgICA7Ly8gY29ycmVjdCBzaWduCi0gICAgU1RSICAgICByZXMsIFttYl0sICMxNiAgICAgICAgICAgICAgOy8vIG5leHQgcm93Ci0KLSAgICA7Ly8gdG1wMyA9IHxhNHxhM3xhMnxhMXwKLSAgICA7Ly8gdG1wNCA9IHxjNHxjM3xjMnxjMXwKLSAgICA7Ly8gdG1wNSA9IHxnNHxnM3xnMnxnMXwKLSAgICA7Ly8gdG1wNiA9IHxtNHxtM3xtMnxtMXwKLSAgICA7Ly8gdG1wMSA9IHxyNHxyM3xyMnxyMXwKLSAgICA7Ly8gdG1wMiA9IHx0NHx0M3x0Mnx0MXwKLQotICAgIDsvLyB0aGlyZCBmb3VyIHBpeGVscwotICAgIFVYVEIxNiAgdG1wYSwgdG1wNSAgICAgICAgICAgICAgICAgIDsvLyB8ZzN8ZzF8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA2ICAgICAgICAgICAgOy8vIHxnMyttM3xnMSttMXwKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDQgICAgICAgICAgICAgICAgICA7Ly8gfGMzfGMxfAotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLSAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDEgICAgICAgICAgICA7Ly8gfGMzK3IzfGMxK3IxfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAzICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMiAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0ErVAotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTERSICAgICByZXMsID0gMHgwMEZGMDBGRgotICAgIFVYVEIxNiAgdG1wYSwgdG1wNSwgUk9SICM4ICAgICAgICAgIDsvLyB8ZzR8ZzJ8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA2LCBST1IgIzggICAgOy8vIHxnNCttNHxnMittMnwKLSAgICBBTkQgICAgIHJlcywgcmVzLCB0bXBiLCBMU1IgIzUgICAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCi0KLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0gICAgVVhUQjE2ICB0bXBiLCB0bXA0LCBST1IgIzggICAgICAgICAgOy8vIHxjNHxjMnwKLSAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wMSwgUk9SICM4ICAgIDsvLyB8YzQrcjR8YzIrcjJ8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAzLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMiwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0ErVAotCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHRtcDMsIFttYl0KLSAgICBMRFIgICAgIHRtcGEsID0gMHhGRjAwRkYwMAotICAgIE1WTiAgICAgdG1wMywgdG1wMwotCi0gICAgQU5EICAgICB0bXBhLCB0bXBhLCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgotICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKLSAgICBMRFIgICAgIHRtcGEsID0gMHg4MDgwODA4MAotICAgIFVIU1VCOCAgcmVzLCByZXMsIHRtcDMgICAgICAgICAgICAgIDsvLyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCi0gICAgTERSICAgICB0bXAzLCBbcmVmXSAgICAgICAgICAgICAgICAgOy8vIGxvYWQgbmV4dCByb3cKLSAgICBFT1IgICAgIHJlcywgcmVzLCB0bXBhICAgICAgICAgICAgICA7Ly8gY29ycmVjdCBzaWduCi0gICAgU1RSICAgICByZXMsIFttYl0sICMxNiAgICAgICAgICAgICAgOy8vIG5leHQgcm93Ci0KLSAgICA7Ly8gdG1wNCA9IHxhNHxhM3xhMnxhMXwKLSAgICA7Ly8gdG1wNSA9IHxjNHxjM3xjMnxjMXwKLSAgICA7Ly8gdG1wNiA9IHxnNHxnM3xnMnxnMXwKLSAgICA7Ly8gdG1wMSA9IHxtNHxtM3xtMnxtMXwKLSAgICA7Ly8gdG1wMiA9IHxyNHxyM3xyMnxyMXwKLSAgICA7Ly8gdG1wMyA9IHx0NHx0M3x0Mnx0MXwKLQotICAgIDsvLyBmb3VydGggZm91ciBwaXhlbHMKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDYgICAgICAgICAgICAgICAgICA7Ly8gfGczfGcxfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSAgICAgICAgICAgIDsvLyB8ZzMrbTN8ZzErbTF8Ci0gICAgVVhUQjE2ICB0bXBiLCB0bXA1ICAgICAgICAgICAgICAgICAgOy8vIHxjM3xjMXwKLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAyICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKLSAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDYsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8Ci0gICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgotCi0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotICAgIFVYVEIxNiAgdG1wYiwgdG1wNSwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDIsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIExEUiAgICAgdG1wNSwgW21iXQotICAgIExEUiAgICAgdG1wNCwgPSAweEZGMDBGRjAwCi0gICAgTVZOICAgICB0bXA1LCB0bXA1Ci0KLSAgICBBTkQgICAgIHRtcGEsIHRtcDQsIHRtcGIsIExTTCAjMyAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCi0gICAgT1JSICAgICByZXMsIHJlcywgdG1wYQotICAgIExEUiAgICAgdG1wYSwgPSAweDgwODA4MDgwCi0gICAgVUhTVUI4ICByZXMsIHJlcywgdG1wNSAgICAgICAgICAgICAgOy8vIGJpbGluZWFyIGludGVycG9sYXRpb24KLQotICAgIDsvLyBkZWNyZW1lbnQgbG9vcF94IGNvdW50ZXIKLSAgICBTVUJTICAgIGNvdW50LCBjb3VudCwgIzQ8PDI4ICAgICAgICA7Ly8gZGVjcmVtZW50IHggbG9vcCBjb3VudGVyCi0KLSAgICA7Ly8gY2FsY3VsYXRlICJyZWYiIGFkZHJlc3MgZm9yIG5leHQgcm91bmQKLSAgICBTVUIgICAgIHJlZiwgcmVmLCB3aWR0aCwgTFNMICMzICAgICA7Ly8gcmVmIC09IDgqd2lkdGg7Ci0gICAgQUREICAgICByZWYsIHJlZiwgIzQgICAgICAgICAgICAgICAgOy8vIG5leHQgY29sdW1uICg0IHBpeGVscykKLQotICAgIEVPUiAgICAgcmVzLCByZXMsIHRtcGEgICAgICAgICAgICAgIDsvLyBjb3JyZWN0IHNpZ24KLSAgICBTVFIgICAgIHJlcywgW21iXSwgIy00NAotCi0gICAgQkNTICAgICBsb29wX3gKLQotICAgIEFERFMgICAgbWIsIG1iLCAjNjQgICAgICAgICAgICAgICAgIDsvLyBzZXQgQ2Fycnk9MAotICAgIEFERCAgICAgcmVmLCByZWYsIHdpZHRoLCBMU0wgIzIgICAgIDsvLyByZWYgKz0gNCp3aWR0aAotICAgIEFORCAgICAgdG1wNiwgY291bnQsICMweDAwRjAwMDAwICAgIDsvLyBwYXJ0V2lkdGgtMQotICAgIFNCQyAgICAgcmVmLCByZWYsIHRtcDYsIExTUiAjMjAgICAgIDsvLyAtKHBhcnRXaWR0aC0xKS0xCi0gICAgU0JDICAgICBtYiwgbWIsIHRtcDYsIExTUiAjMjAgICAgICAgOy8vIC0ocGFydFdpZHRoLTEpLTEKLQotICAgIEFERFMgICAgY291bnQsIGNvdW50LCAjMHhDIDw8IDI0ICAgIDsvLyBkZWNyZW1lbnQgeSBsb29wIGNvdW50ZXIKLSAgICBCR0UgICAgIGxvb3BfeQotCi0gICAgQUREICAgICBzcCwgc3AsICMweDFmNAotICAgIExETUZEICAgc3AhLCB7cjQtcjExLCBwY30KLQotICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV9taWRfaG9yLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX21pZF9ob3IucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgxYWVkNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybTExX2FzbS9oMjY0YnNkX2ludGVycG9sYXRlX21pZF9ob3IucworKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi07IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQotOw0KLTsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi07DQotOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLTsNCi07IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi07IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi07IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi07IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotOy0tDQotOy0tIEFic3RyYWN0IDogQVJNdjYgb3B0aW1pemVkIHZlcnNpb24gaG9yaXpvbnRhbCBwYXJ0IG9mIA0KLTstLSAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZU1pZCBmdW5jdGlvbnMNCi07LS0NCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLQ0KLSAgICBJRiA6REVGOiBIMjY0REVDX1dJTkFTTQ0KLSAgICAgICAgOy8vIFdlIGRvbnQgdXNlIFJFUVVJUkU4IGFuZCBQUkVTRVJWRTggZm9yIHdpbmFzbQ0KLSAgICBFTFNFDQotICAgICAgICBSRVFVSVJFOA0KLSAgICAgICAgUFJFU0VSVkU4DQotICAgIEVORElGDQotDQotICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQ0KLQ0KLQ0KLTsvLyBSZWdpc3RlciBhbGxvY2F0aW9uDQotDQotcmVmICAgICBSTiAwICAgIDsvLyBwb2ludGVyIHRvIGN1cnJlbnQgcG9zaXRpb24gaW4gcmVmZXJlbmNlIGltYWdlDQotbWIgICAgICBSTiAxICAgIDsvLyBwb2ludGVyIHRvIGN1cnJlbnQgcG9zaXRpb24gaW4gaW50ZXJwb2xhdGVkIG1iDQotY291bnQgICBSTiAyICAgIDsvLyBiaXQtcGFja2VkIHdpZHRoIGFuZCBjb3VudCB2YWx1ZXMNCi0NCi14XzJfMCAgIFJOIDQNCi14XzNfMSAgIFJOIDUNCi14XzZfNCAgIFJOIDYNCi14XzdfNSAgIFJOIDcNCi0NCi10bXAxICAgIFJOIDgNCi10bXAyICAgIFJOIDkNCi10bXAzICAgIFJOIDEwDQotdG1wNCAgICBSTiAxMQ0KLQ0KLW11bHRfMjBfMDEgIFJOIDEyICAgOy8vIFsyMCwgIDFdDQotbXVsdF8yMF9tNSAgUk4gMTQgICA7Ly8gWzIwLCAtNV0NCi0NCi0NCi0gICAgICAgIEVYUE9SVCAgaDI2NGJzZEludGVycG9sYXRlTWlkSG9yUGFydA0KLQ0KLTsvLyBIb3Jpem9udGFsIGZpbHRlciBhcHByb2FjaA0KLTsvLw0KLTsvLyBCYXNpYyBpZGVhIGluIGhvcml6b250YWwgZmlsdGVyaW5nIGlzIHRvIGFkanVzdCBjb2VmZmljaWVudHMNCi07Ly8gbGlrZSBiZWxvdy4gQ2FsY3VsYXRpb24gaXMgZG9uZSB3aXRoIDE2LWJpdCBtYXRocy4NCi07Ly8NCi07Ly8gUmVnICAgICB4XzJfMCAgICAgeF8zXzEgICAgIHhfNl80ICAgICB4XzdfNSAgICAgeF8yXzANCi07Ly8gICAgICAgWyAgMiAgMCBdIFsgIDMgIDEgXSBbICA2ICA0IF0gWyAgNyAgNSBdIFsgMTAgIDggXSAuLi4NCi07Ly8geV8wID0gICAyMCAgMSAgICAgMjAgLTUgICAgICAgIC01ICAgICAgICAgMQ0KLTsvLyB5XzEgPSAgIC01ICAgICAgICAyMCAgMSAgICAgIDEgMjAgICAgICAgIC01DQotOy8vIHlfMiA9ICAgIDEgICAgICAgIC01ICAgICAgICAtNSAyMCAgICAgIDEgMjANCi07Ly8geV8zID0gICAgICAgICAgICAgIDEgICAgICAgIDIwIC01ICAgICAtNSAyMCAgICAgICAgIDENCi0NCi0NCi1oMjY0YnNkSW50ZXJwb2xhdGVNaWRIb3JQYXJ0DQotICAgIFNUTUZEICAgc3AhLCB7cjQtcjExLCBscn0NCi0NCi0gICAgOy8vIHBhY2sgdmFsdWVzIHRvIGNvdW50IHJlZ2lzdGVyDQotICAgIDsvLyBbMzE6MjhdIGxvb3BfeCAocGFydFdpZHRoLTEpDQotICAgIDsvLyBbMjc6MjRdIGxvb3BfeSAocGFydEhlaWdodC0xKQ0KLSAgICA7Ly8gWzIzOjIwXSBwYXJ0V2lkdGgtMQ0KLSAgICA7Ly8gWzE5OjE2XSBwYXJ0SGVpZ2h0LTENCi0gICAgOy8vIFsxNTowMF0gd2lkdGgNCi0NCi0NCi0gICAgTERSICAgICBtdWx0XzIwXzAxLCA9IDB4MDAxNDAwMDENCi0gICAgTERSICAgICBtdWx0XzIwX201LCA9IDB4MDAxNEZGRkINCi0gICAgQU5EICAgICB0bXAzLCBjb3VudCwgIzB4MDAwRjAwMDAgICAgOy8vIHBhcnRXaWR0aC0xDQotbG9vcF95DQotICAgIExEUiAgICAgeF8zXzEsIFtyZWYsICMtOF0NCi0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDMsIExTTCAjMTINCi0gICAgTERSICAgICB4XzdfNSwgW3JlZiwgIy00XQ0KLSAgICBVWFRCMTYgIHhfMl8wLCB4XzNfMQ0KLSAgICBVWFRCMTYgIHhfM18xLCB4XzNfMSwgUk9SICM4DQotICAgIFVYVEIxNiAgeF82XzQsIHhfN181DQotDQotbG9vcF94DQotICAgIFVYVEIxNiAgeF83XzUsIHhfN181LCBST1IgIzgNCi0NCi0gICAgU01VQUQgICB0bXAxLCB4XzJfMCwgbXVsdF8yMF8wMQ0KLSAgICBTTVVMVEIgIHRtcDIsIHhfMl8wLCBtdWx0XzIwX201DQotICAgIFNNVUxUQiAgdG1wMywgeF8yXzAsIG11bHRfMjBfMDENCi0gICAgU01VTFRCICB0bXA0LCB4XzNfMSwgbXVsdF8yMF8wMQ0KLQ0KLSAgICBTTUxBRCAgIHRtcDEsIHhfM18xLCBtdWx0XzIwX201LCB0bXAxDQotICAgIFNNTEFEICAgdG1wMiwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDINCi0gICAgU01MQVRCICB0bXAzLCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wMw0KLSAgICBMRFIgICAgIHhfM18xLCBbcmVmXSwgIzQNCi0gICAgU01MQUQgICB0bXA0LCB4XzZfNCwgbXVsdF8yMF9tNSwgdG1wNA0KLQ0KLSAgICBTTUxBQkIgIHRtcDEsIHhfNl80LCBtdWx0XzIwX201LCB0bXAxDQotICAgIFNNTEFEWCAgdG1wMiwgeF82XzQsIG11bHRfMjBfMDEsIHRtcDINCi0gICAgU01MQURYICB0bXAzLCB4XzZfNCwgbXVsdF8yMF9tNSwgdG1wMw0KLSAgICBTTUxBRFggIHRtcDQsIHhfN181LCBtdWx0XzIwX201LCB0bXA0DQotDQotICAgIFNNTEFCQiAgdG1wMSwgeF83XzUsIG11bHRfMjBfMDEsIHRtcDENCi0gICAgU01MQUJCICB0bXAyLCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wMg0KLSAgICBVWFRCMTYgIHhfMl8wLCB4XzNfMQ0KLSAgICBTTUxBRFggIHRtcDMsIHhfN181LCBtdWx0XzIwXzAxLCB0bXAzDQotICAgIFNNTEFCQiAgdG1wNCwgeF8yXzAsIG11bHRfMjBfMDEsIHRtcDQNCi0NCi0gICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyOA0KLSAgICBTVFIgICAgIHRtcDEsIFttYl0sICM0DQotICAgIFNUUiAgICAgdG1wMiwgW21iXSwgIzQNCi0gICAgU1RSICAgICB0bXAzLCBbbWJdLCAjNA0KLSAgICBTVFIgICAgIHRtcDQsIFttYl0sICM0DQotICAgIEJDQyAgICAgbmV4dF95DQotDQotICAgIFVYVEIxNiAgeF8zXzEsIHhfM18xLCBST1IgIzgNCi0NCi0gICAgU01VQUQgICB0bXAxLCB4XzZfNCwgbXVsdF8yMF8wMQ0KLSAgICBTTVVMVEIgIHRtcDIsIHhfNl80LCBtdWx0XzIwX201DQotICAgIFNNVUxUQiAgdG1wMywgeF82XzQsIG11bHRfMjBfMDENCi0gICAgU01VTFRCICB0bXA0LCB4XzdfNSwgbXVsdF8yMF8wMQ0KLQ0KLSAgICBTTUxBRCAgIHRtcDEsIHhfN181LCBtdWx0XzIwX201LCB0bXAxDQotICAgIFNNTEFEICAgdG1wMiwgeF83XzUsIG11bHRfMjBfMDEsIHRtcDINCi0gICAgU01MQVRCICB0bXAzLCB4XzdfNSwgbXVsdF8yMF9tNSwgdG1wMw0KLSAgICBMRFIgICAgIHhfN181LCBbcmVmXSwgIzQNCi0gICAgU01MQUQgICB0bXA0LCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wNA0KLQ0KLSAgICBTTUxBQkIgIHRtcDEsIHhfMl8wLCBtdWx0XzIwX201LCB0bXAxDQotICAgIFNNTEFEWCAgdG1wMiwgeF8yXzAsIG11bHRfMjBfMDEsIHRtcDINCi0gICAgU01MQURYICB0bXAzLCB4XzJfMCwgbXVsdF8yMF9tNSwgdG1wMw0KLSAgICBTTUxBRFggIHRtcDQsIHhfM18xLCBtdWx0XzIwX201LCB0bXA0DQotDQotICAgIFNNTEFCQiAgdG1wMSwgeF8zXzEsIG11bHRfMjBfMDEsIHRtcDENCi0gICAgU01MQUJCICB0bXAyLCB4XzNfMSwgbXVsdF8yMF9tNSwgdG1wMg0KLSAgICBVWFRCMTYgIHhfNl80LCB4XzdfNQ0KLSAgICBTTUxBRFggIHRtcDMsIHhfM18xLCBtdWx0XzIwXzAxLCB0bXAzDQotICAgIFNNTEFCQiAgdG1wNCwgeF82XzQsIG11bHRfMjBfMDEsIHRtcDQNCi0NCi0gICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyOA0KLSAgICBTVFIgICAgIHRtcDEsIFttYl0sICM0DQotICAgIFNUUiAgICAgdG1wMiwgW21iXSwgIzQNCi0gICAgU1RSICAgICB0bXAzLCBbbWJdLCAjNA0KLSAgICBTVFIgICAgIHRtcDQsIFttYl0sICM0DQotICAgIEJDUyAgICAgbG9vcF94DQotDQotbmV4dF95DQotICAgIEFORCAgICAgdG1wMywgY291bnQsICMweDAwMEYwMDAwICAgIDsvLyBwYXJ0V2lkdGgtMQ0KLSAgICBTTUxBQkIgIHJlZiwgY291bnQsIG11bHRfMjBfMDEsIHJlZiAgIDsvLyArd2lkdGgNCi0gICAgU0JDICAgICByZWYsIHJlZiwgdG1wMywgTFNSICMxNiAgIDsvLyAtKHBhcnRXaWR0aC0xKS0xDQotICAgIEFERFMgICAgY291bnQsIGNvdW50LCAjKDE8PDI4KS0oMTw8MjApDQotICAgIEJHRSAgICAgbG9vcF95DQotDQotICAgIExETUZEICAgc3AhLCB7cjQtcjExLCBwY30NCi0NCi0gICAgRU5EDQotDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV92ZXJfaGFsZi5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV92ZXJfaGFsZi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDRmYzZmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfdmVyX2hhbGYucworKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi07IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci07Ci07IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOwotOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOwotOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy0tCi07LS0gQWJzdHJhY3QgOiBBUk12NiBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBoMjY0YnNkSW50ZXJwb2xhdGVWZXJIYWxmIGZ1bmN0aW9uCi07LS0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotICAgIElGIDpERUY6IEgyNjRERUNfV0lOQVNNCi0gICAgICAgIDsvLyBXZSBkb250IHVzZSBSRVFVSVJFOCBhbmQgUFJFU0VSVkU4IGZvciB3aW5hc20KLSAgICBFTFNFCi0gICAgICAgIFJFUVVJUkU4Ci0gICAgICAgIFBSRVNFUlZFOAotICAgIEVORElGCi0KLSAgICBBUkVBICAgIHwudGV4dHwsIENPREUKLQotOy8vIGgyNjRic2RJbnRlcnBvbGF0ZVZlckhhbGYgcmVnaXN0ZXIgYWxsb2NhdGlvbgotCi1yZWYgICAgIFJOIDAKLQotbWIgICAgICBSTiAxCi1idWZmICAgIFJOIDEKLQotY291bnQgICBSTiAyCi14MCAgICAgIFJOIDIKLQotcmVzICAgICBSTiAzCi15MCAgICAgIFJOIDMKLQotdG1wMSAgICBSTiA0Ci0KLXRtcDIgICAgUk4gNQotaGVpZ2h0ICBSTiA1Ci0KLXRtcDMgICAgUk4gNgotcGFydFcgICBSTiA2Ci0KLXRtcDQgICAgUk4gNwotcGFydEggICBSTiA3Ci0KLXRtcDUgICAgUk4gOAotdG1wNiAgICBSTiA5Ci0KLXRtcGEgICAgUk4gMTAKLXRtcGIgICAgUk4gMTEKLXdpZHRoICAgUk4gMTIKLQotcGx1czE2ICBSTiAxNAotCi0KLTsvLyBmdW5jdGlvbiBleHBvcnRzIGFuZCBpbXBvcnRzCi0KLSAgICBJTVBPUlQgIGgyNjRic2RGaWxsQmxvY2sKLQotICAgIEVYUE9SVCAgaDI2NGJzZEludGVycG9sYXRlVmVySGFsZgotCi07Ly8gQXBwcm9hY2ggdG8gdmVydGljYWwgaW50ZXJwb2xhdGlvbgotOy8vCi07Ly8gSW50ZXJwb2xhdGlvbiBpcyBkb25lIGJ5IHVzaW5nIDMyLWJpdCBsb2FkcyBhbmQgc3RvcmVzCi07Ly8gYW5kIGJ5IHVzaW5nIDE2IGJpdCBhcml0aG1ldGljLiA0eDQgYmxvY2sgaXMgcHJvY2Vzc2VkCi07Ly8gaW4gZWFjaCByb3VuZC4KLTsvLwotOy8vIHxhXzExfGFfMTF8YV8xMXxhXzExfC4uLnxhXzFufGFfMW58YV8xbnxhXzFufAotOy8vIHxiXzExfGJfMTF8Yl8xMXxiXzExfC4uLnxiXzFufGJfMW58Yl8xbnxiXzFufAotOy8vIHxjXzExfGNfMTF8Y18xMXxjXzExfC4uLnxjXzFufGNfMW58Y18xbnxjXzFufAotOy8vIHxkXzExfGRfMTF8ZF8xMXxkXzExfC4uLnxkXzFufGRfMW58ZF8xbnxkXzFufAotOy8vICAgICAgICAgICAuLgotOy8vICAgICAgICAgICAuLgotOy8vIHxhX20xfGFfbTF8YV9tMXxhX20xfC4uLgotOy8vIHxiX20xfGJfbTF8Yl9tMXxiX20xfC4uLgotOy8vIHxjX20xfGNfbTF8Y19tMXxjX20xfC4uLgotOy8vIHxkX20xfGRfbTF8ZF9tMXxkX20xfC4uLgotCi1oMjY0YnNkSW50ZXJwb2xhdGVWZXJIYWxmCi0gICAgU1RNRkQgICBzcCEsIHtyMC1yMTEsIGxyfQotICAgIFNVQiAgICAgc3AsIHNwLCAjMHgxZTQKLQotICAgIENNUCAgICAgeDAsICMwCi0gICAgQkxUICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHgwIDwgMCkKLSAgICBMRFIgICAgIHBhcnRXLCBbc3AsIzB4MjIwXSAgICAgIDsvLyBwYXJ0V2lkdGgKLSAgICBBREQgICAgIHRtcDUsIHgwLCBwYXJ0VyAgICAgICAgIDsvLyAoeDArcGFydFdpZHRoKQotICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCi0gICAgQ01QICAgICB0bXA1LCB3aWR0aAotICAgIEJISSAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh4MCtwYXJ0Vyk+d2lkdGgKLQotICAgIENNUCAgICAgeTAsICMwCi0gICAgQkxUICAgICBkb19maWxsICAgICAgICAgICAgICAgICA7Ly8gKHkwIDwgMCkKLSAgICBMRFIgICAgIHBhcnRILCBbc3AsIzB4MjI0XSAgICAgIDsvLyBwYXJ0SGVpZ2h0Ci0gICAgQUREICAgICB0bXA2LCB5MCwgcGFydEggICAgICAgICA7Ly8gKHkwK3BhcnRIZWlnaHQpCi0gICAgQUREICAgICB0bXA2LCB0bXA2LCAjNSAgICAgICAgICA7Ly8gKHkwK3BhcnRIKzUpCi0gICAgTERSICAgICBoZWlnaHQsIFtzcCwjMHgyMWNdICAgICA7Ly8gaGVpZ2h0Ci0gICAgQ01QICAgICB0bXA2LCBoZWlnaHQKLSAgICBCTFMgICAgIHNraXBfZmlsbCAgICAgICAgICAgICAgIDsvLyBubyBvdmVyZmlsbCBuZWVkZWQKLQotCi1kb19maWxsCi0gICAgTERSICAgICBwYXJ0SCwgW3NwLCMweDIyNF0gICAgICA7Ly8gcGFydEhlaWdodAotICAgIEFERCAgICAgdG1wNSwgcGFydEgsICM1ICAgICAgICAgOy8vIHIyID0gcGFydEggKyA1OwotICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4MjFjXSAgICAgOy8vIGhlaWdodAotICAgIExEUiAgICAgcGFydFcsIFtzcCwjMHgyMjBdICAgICAgOy8vIHBhcnRXaWR0aAotICAgIFNUTUlCICAgc3AsIHtoZWlnaHQsIHBhcnRXfSAgICAgOy8vIHNwKzQgPSBoZWlnaHQsIHNwKzggPSBwYXJ0V2lkdGgKLSAgICBTVFIgICAgIHRtcDUsIFtzcCwjMHhjXSAgICAgICAgIDsvLyBzcCtjIHBhcnRIZWlnaHQrNQotICAgIFNUUiAgICAgcGFydFcsIFtzcCwjMHgxMF0gICAgICAgOy8vIHNwKzEwID0gcGFydFdpZHRoCi0gICAgTERSICAgICB3aWR0aCwgW3NwLCMweDIxOF0gICAgICA7Ly8gd2lkdGgKLSAgICBTVFIgICAgIHdpZHRoLCBbc3AsIzBdICAgICAgICAgIDsvLyBzcCswID0gd2lkdGgKLSAgICBBREQgICAgIGJ1ZmYsIHNwLCAjMHgyOCAgICAgICAgIDsvLyBidWZmID0gcDFbMjEqMjEvNCsxXQotICAgIEJMICAgICAgaDI2NGJzZEZpbGxCbG9jawotCi0gICAgTU9WICAgICB4MCwgIzAKLSAgICBTVFIgICAgIHgwLFtzcCwjMHgxZWNdICAgICAgICAgIDsvLyB4MCA9IDAKLSAgICBTVFIgICAgIHgwLFtzcCwjMHgxZjBdICAgICAgICAgIDsvLyB5MCA9IDAKLSAgICBBREQgICAgIHJlZixzcCwjMHgyOCAgICAgICAgICAgIDsvLyByZWYgPSBwMQotICAgIFNUUiAgICAgcGFydFcsIFtzcCwjMHgyMThdCi0KLQotc2tpcF9maWxsCi0gICAgTERSICAgICB4MCAsW3NwLCMweDFlY10gICAgICAgICA7Ly8geDAKLSAgICBMRFIgICAgIHkwICxbc3AsIzB4MWYwXSAgICAgICAgIDsvLyB5MAotICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCi0gICAgTUxBICAgICB0bXA2LCB3aWR0aCwgeTAsIHgwICAgICA7Ly8geTAqd2lkdGgreDAKLSAgICBBREQgICAgIHJlZiwgcmVmLCB0bXA2ICAgICAgICAgIDsvLyByZWYgKz0geTAqd2lkdGgreDAKLSAgICBMRFIgICAgIG1iLCBbc3AsICMweDFlOF0gICAgICAgIDsvLyBtYgotCi0gICAgQUREICAgICBjb3VudCwgcGFydFcsIHBhcnRILCBMU0wgIzE2ICAgIDsvLyB8cGFydEh8cGFydFd8Ci0gICAgTERSICAgICB0bXA1LCA9IDB4MDAwMTAwMDEKLSAgICBTU1VCMTYgIGNvdW50LCBjb3VudCwgdG1wNTsgICAgIDsvLyB8cGFydEgtMXxwYXJ0Vy0xfAotICAgIExEUiAgICAgcGx1czE2LCA9IDB4MDAxMDAwMTAKLQotICAgIEFORCAgICAgdG1wMSwgY291bnQsICMweDAwMDAwMEZGIDsvLyBwYXJ0V2lkdGgKLQotCi1sb29wX3kKLSAgICBBREQgICAgIGNvdW50LCBjb3VudCwgdG1wMSwgTFNMICMyNCAgOy8vIHBhcnRXaWR0aC0xIHRvIHRvcCBieXRlCi0KLWxvb3BfeAotICAgIExEUiAgICAgdG1wMSwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfGE0fGEzfGEyfGExfAotICAgIExEUiAgICAgdG1wMiwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfGM0fGMzfGMyfGMxfAotICAgIExEUiAgICAgdG1wMywgW3JlZl0sIHdpZHRoICAgICA7Ly8gfGc0fGczfGcyfGcxfAotICAgIExEUiAgICAgdG1wNCwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfG00fG0zfG0yfG0xfAotICAgIExEUiAgICAgdG1wNSwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfHI0fHIzfHIyfHIxfAotICAgIExEUiAgICAgdG1wNiwgW3JlZl0sIHdpZHRoICAgICA7Ly8gfHQ0fHQzfHQyfHQxfAotCi0gICAgOy8vIGZpcnN0IGZvdXIgcGl4ZWxzCi0gICAgVVhUQjE2ICB0bXBhLCB0bXAzICAgICAgICAgICAgICAgICAgOy8vIHxnM3xnMXwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDQgICAgICAgICAgICA7Ly8gfGczK20zfGcxK20xfAotICAgIFVYVEIxNiAgdG1wYiwgdG1wMiAgICAgICAgICAgICAgICAgIDsvLyB8YzN8YzF8Ci0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA1ICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKLSAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDYgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDMsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8Ci0gICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgotCi0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotICAgIFVYVEIxNiAgdG1wYiwgdG1wMiwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDUsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDYsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIExEUiAgICAgdG1wMSwgW3JlZl0sIHdpZHRoCi0gICAgTERSICAgICB0bXBhLCA9IDB4RkYwMEZGMDAKLQotICAgIEFORCAgICAgdG1wYSwgdG1wYSwgdG1wYiwgTFNMICMzICAgIDsvLyBtYXNrIGFuZCBkaXZlZGUgYnkgMzIKLSAgICBPUlIgICAgIHJlcywgcmVzLCB0bXBhCi0gICAgU1RSICAgICByZXMsIFttYl0sICMxNiAgICAgICAgICAgICAgOy8vIG5leHQgcm93IChtYikKLQotICAgIDsvLyB0bXAyID0gfGE0fGEzfGEyfGExfAotICAgIDsvLyB0bXAzID0gfGM0fGMzfGMyfGMxfAotICAgIDsvLyB0bXA0ID0gfGc0fGczfGcyfGcxfAotICAgIDsvLyB0bXA1ID0gfG00fG0zfG0yfG0xfAotICAgIDsvLyB0bXA2ID0gfHI0fHIzfHIyfHIxfAotICAgIDsvLyB0bXAxID0gfHQ0fHQzfHQyfHQxfAotCi0gICAgOy8vIHNlY29uZCBmb3VyIHBpeGVscwotICAgIFVYVEIxNiAgdG1wYSwgdG1wNCAgICAgICAgICAgICAgICAgIDsvLyB8ZzN8ZzF8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA1ICAgICAgICAgICAgOy8vIHxnMyttM3xnMSttMXwKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDMgICAgICAgICAgICAgICAgICA7Ly8gfGMzfGMxfAotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLSAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDYgICAgICAgICAgICA7Ly8gfGMzK3IzfGMxK3IxfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAyICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0ErVAotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTERSICAgICByZXMsID0gMHgwMEZGMDBGRgotICAgIFVYVEIxNiAgdG1wYSwgdG1wNCwgUk9SICM4ICAgICAgICAgIDsvLyB8ZzR8ZzJ8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA1LCBST1IgIzggICAgOy8vIHxnNCttNHxnMittMnwKLSAgICBBTkQgICAgIHJlcywgcmVzLCB0bXBiLCBMU1IgIzUgICAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCi0KLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0gICAgVVhUQjE2ICB0bXBiLCB0bXAzLCBST1IgIzggICAgICAgICAgOy8vIHxjNHxjMnwKLSAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNiwgUk9SICM4ICAgIDsvLyB8YzQrcjR8YzIrcjJ8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAyLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0ErVAotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTERSICAgICB0bXAyLCBbcmVmXSwgd2lkdGgKLSAgICBMRFIgICAgIHRtcGEsID0gMHhGRjAwRkYwMAotCi0gICAgQU5EICAgICB0bXBhLCB0bXBhLCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgotICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKLSAgICBTVFIgICAgIHJlcywgW21iXSwgIzE2ICAgICAgICAgICAgICA7Ly8gbmV4dCByb3cKLQotICAgIDsvLyB0bXAzID0gfGE0fGEzfGEyfGExfAotICAgIDsvLyB0bXA0ID0gfGM0fGMzfGMyfGMxfAotICAgIDsvLyB0bXA1ID0gfGc0fGczfGcyfGcxfAotICAgIDsvLyB0bXA2ID0gfG00fG0zfG0yfG0xfAotICAgIDsvLyB0bXAxID0gfHI0fHIzfHIyfHIxfAotICAgIDsvLyB0bXAyID0gfHQ0fHQzfHQyfHQxfAotCi0gICAgOy8vIHRoaXJkIGZvdXIgcGl4ZWxzCi0gICAgVVhUQjE2ICB0bXBhLCB0bXA1ICAgICAgICAgICAgICAgICAgOy8vIHxnM3xnMXwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDYgICAgICAgICAgICA7Ly8gfGczK20zfGcxK20xfAotICAgIFVYVEIxNiAgdG1wYiwgdG1wNCAgICAgICAgICAgICAgICAgIDsvLyB8YzN8YzF8Ci0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wMSAgICAgICAgICAgIDsvLyB8YzMrcjN8YzErcjF8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAyICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHJlcywgPSAweDAwRkYwMEZGCi0gICAgVVhUQjE2ICB0bXBhLCB0bXA1LCBST1IgIzggICAgICAgICAgOy8vIHxnNHxnMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDYsIFJPUiAjOCAgICA7Ly8gfGc0K200fGcyK20yfAotICAgIEFORCAgICAgcmVzLCByZXMsIHRtcGIsIExTUiAjNSAgICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKLQotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDQsIFJPUiAjOCAgICAgICAgICA7Ly8gfGM0fGMyfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAxLCBST1IgIzggICAgOy8vIHxjNCtyNHxjMityMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDMsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAyLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIExEUiAgICAgdG1wMywgW3JlZl0KLSAgICBMRFIgICAgIHRtcGEsID0gMHhGRjAwRkYwMAotCi0gICAgOy8vIGRlY3JlbWVudCBsb29wX3ggY291bnRlcgotICAgIFNVQlMgICAgY291bnQsIGNvdW50LCAjNDw8MjQgICAgICAgIDsvLyAocGFydFdpZHRoLTEpIC09IDQ7Ci0KLSAgICBBTkQgICAgIHRtcGEsIHRtcGEsIHRtcGIsIExTTCAjMyAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCi0gICAgT1JSICAgICByZXMsIHJlcywgdG1wYQotICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjMTYgICAgICAgICAgICAgIDsvLyBuZXh0IHJvdwotCi0gICAgOy8vIHRtcDQgPSB8YTR8YTN8YTJ8YTF8Ci0gICAgOy8vIHRtcDUgPSB8YzR8YzN8YzJ8YzF8Ci0gICAgOy8vIHRtcDYgPSB8ZzR8ZzN8ZzJ8ZzF8Ci0gICAgOy8vIHRtcDEgPSB8bTR8bTN8bTJ8bTF8Ci0gICAgOy8vIHRtcDIgPSB8cjR8cjN8cjJ8cjF8Ci0gICAgOy8vIHRtcDMgPSB8dDR8dDN8dDJ8dDF8Ci0KLSAgICA7Ly8gZm91cnRoIGZvdXIgcGl4ZWxzCi0gICAgVVhUQjE2ICB0bXBhLCB0bXA2ICAgICAgICAgICAgICAgICAgOy8vIHxnM3xnMXwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEgICAgICAgICAgICA7Ly8gfGczK20zfGcxK20xfAotICAgIFVYVEIxNiAgdG1wYiwgdG1wNSAgICAgICAgICAgICAgICAgIDsvLyB8YzN8YzF8Ci0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wMiAgICAgICAgICAgIDsvLyB8YzMrcjN8YzErcjF8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDQgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAzICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHJlcywgPSAweDAwRkYwMEZGCi0gICAgVVhUQjE2ICB0bXBhLCB0bXA2LCBST1IgIzggICAgICAgICAgOy8vIHxnNHxnMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDEsIFJPUiAjOCAgICA7Ly8gfGc0K200fGcyK20yfAotICAgIEFORCAgICAgcmVzLCByZXMsIHRtcGIsIExTUiAjNSAgICAgIDsvLyBtYXNrIGFuZCBkaXZpZGUgYnkgMzIKLQotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDUsIFJPUiAjOCAgICAgICAgICA7Ly8gfGM0fGMyfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXAyLCBST1IgIzggICAgOy8vIHxjNCtyNHxjMityMnwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDQsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAzLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQStUCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHRtcDQsID0gMHhGRjAwRkYwMAotCi0gICAgOy8vIGNhbGN1bGF0ZSAicmVmIiBhZGRyZXNzIGZvciBuZXh0IHJvdW5kCi0gICAgU1VCICAgICByZWYsIHJlZiwgd2lkdGgsIExTTCAjMyAgICAgOy8vIHJlZiAtPSA4KndpZHRoOwotICAgIEFERCAgICAgcmVmLCByZWYsICM0OyAgICAgICAgICAgICAgIDsvLyBuZXh0IGNvbHVtbiAoNCBwaXhlbHMpCi0gICAgQU5EICAgICB0bXBhLCB0bXA0LCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgotICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKLSAgICBTVFIgICAgIHJlcywgW21iXSwgIy00NAotCi0gICAgQkNTICAgICBsb29wX3gKLQotICAgIEFERFMgICAgY291bnQsIGNvdW50LCAjMjUyPDwxNiAgICAgIDsvLyAocGFydEhlaWdodC0xKSAtPSA0OwotICAgIEFERCAgICAgcmVmLCByZWYsIHdpZHRoLCBMU0wgIzIgICAgIDsvLyByZWYgKz0gNCp3aWR0aAotICAgIEFORCAgICAgdG1wMSwgY291bnQsICMweDAwMDAwMEZGICAgIDsvLyBwYXJ0V2lkdGgtMQotICAgIEFERCAgICAgdG1wMiwgdG1wMSwgIzEgICAgICAgICAgICAgIDsvLyBwYXJ0V2lkdGgKLSAgICBTVUIgICAgIHJlZiwgcmVmLCB0bXAyICAgICAgICAgICAgICA7Ly8gcmVmIC09IHBhcnRXaWR0aAotICAgIEFERCAgICAgbWIsIG1iLCAjNjQ7Ci0gICAgU1VCICAgICBtYiwgbWIsIHRtcDI7ICAgICAgICAgICAgICAgOy8vIG1iIC09IHBhcnRXaWR0aAotICAgIEJHRSAgICAgbG9vcF95Ci0KLSAgICBBREQgICAgIHNwLHNwLCMweDFmNAotICAgIExETUZEICAgc3AhLCB7cjQtcjExLCBwY30KLQotICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV92ZXJfcXVhcnRlci5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vaDI2NGJzZF9pbnRlcnBvbGF0ZV92ZXJfcXVhcnRlci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjY2Yzg1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL2gyNjRic2RfaW50ZXJwb2xhdGVfdmVyX3F1YXJ0ZXIucworKysgL2Rldi9udWxsCkBAIC0xLDM3NCArMCwwIEBACi07IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci07Ci07IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOwotOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOwotOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOy0tCi07LS0gQWJzdHJhY3QgOiBBUk12NiBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBoMjY0YnNkSW50ZXJwb2xhdGVWZXJRdWFydGVyIGZ1bmN0aW9uCi07LS0KLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBJRiA6REVGOiBIMjY0REVDX1dJTkFTTQotICAgICAgICA7Ly8gV2UgZG9udCB1c2UgUkVRVUlSRTggYW5kIFBSRVNFUlZFOCBmb3Igd2luYXNtCi0gICAgRUxTRQotICAgICAgICBSRVFVSVJFOAotICAgICAgICBQUkVTRVJWRTgKLSAgICBFTkRJRgotCi0gICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCi0KLTsvLyBoMjY0YnNkSW50ZXJwb2xhdGVWZXJRdWFydGVyIHJlZ2lzdGVyIGFsbG9jYXRpb24KLQotcmVmICAgICBSTiAwCi0KLW1iICAgICAgUk4gMQotYnVmZiAgICBSTiAxCi0KLWNvdW50ICAgUk4gMgoteDAgICAgICBSTiAyCi0KLXJlcyAgICAgUk4gMwoteTAgICAgICBSTiAzCi0KLXRtcDEgICAgUk4gNAotCi10bXAyICAgIFJOIDUKLWhlaWdodCAgUk4gNQotCi10bXAzICAgIFJOIDYKLXBhcnRXICAgUk4gNgotCi10bXA0ICAgIFJOIDcKLXBhcnRIICAgUk4gNwotCi10bXA1ICAgIFJOIDgKLXRtcDYgICAgUk4gOQotCi10bXBhICAgIFJOIDEwCi10bXBiICAgIFJOIDExCi13aWR0aCAgIFJOIDEyCi0KLXBsdXMxNiAgUk4gMTQKLQotCi07Ly8gZnVuY3Rpb24gZXhwb3J0cyBhbmQgaW1wb3J0cwotCi0gICAgSU1QT1JUICBoMjY0YnNkRmlsbEJsb2NrCi0KLSAgICBFWFBPUlQgIGgyNjRic2RJbnRlcnBvbGF0ZVZlclF1YXJ0ZXIKLQotOy8vIEFwcHJvYWNoIHRvIHZlcnRpY2FsIGludGVycG9sYXRpb24KLTsvLwotOy8vIEludGVycG9sYXRpb24gaXMgZG9uZSBieSB1c2luZyAzMi1iaXQgbG9hZHMgYW5kIHN0b3JlcwotOy8vIGFuZCBieSB1c2luZyAxNiBiaXQgYXJpdGhtZXRpYy4gNHg0IGJsb2NrIGlzIHByb2Nlc3NlZAotOy8vIGluIGVhY2ggcm91bmQuCi07Ly8KLTsvLyB8YV8xMXxhXzExfGFfMTF8YV8xMXwuLi58YV8xbnxhXzFufGFfMW58YV8xbnwKLTsvLyB8Yl8xMXxiXzExfGJfMTF8Yl8xMXwuLi58Yl8xbnxiXzFufGJfMW58Yl8xbnwKLTsvLyB8Y18xMXxjXzExfGNfMTF8Y18xMXwuLi58Y18xbnxjXzFufGNfMW58Y18xbnwKLTsvLyB8ZF8xMXxkXzExfGRfMTF8ZF8xMXwuLi58ZF8xbnxkXzFufGRfMW58ZF8xbnwKLTsvLyAgICAgICAgICAgLi4KLTsvLyAgICAgICAgICAgLi4KLTsvLyB8YV9tMXxhX20xfGFfbTF8YV9tMXwuLi4KLTsvLyB8Yl9tMXxiX20xfGJfbTF8Yl9tMXwuLi4KLTsvLyB8Y19tMXxjX20xfGNfbTF8Y19tMXwuLi4KLTsvLyB8ZF9tMXxkX20xfGRfbTF8ZF9tMXwuLi4KLQotaDI2NGJzZEludGVycG9sYXRlVmVyUXVhcnRlcgotICAgIFNUTUZEICAgc3AhLCB7cjAtcjExLCBscn0KLSAgICBTVUIgICAgIHNwLCBzcCwgIzB4MWU0Ci0KLSAgICBDTVAgICAgIHgwLCAjMAotICAgIEJMVCAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh4MCA8IDApCi0gICAgTERSICAgICBwYXJ0VywgW3NwLCMweDIyMF0gICAgICA7Ly8gcGFydFdpZHRoCi0gICAgQUREICAgICB0bXA1LCB4MCwgcGFydFcgICAgICAgICA7Ly8gKHgwK3BhcnRXaWR0aCkKLSAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAotICAgIENNUCAgICAgdG1wNSwgd2lkdGgKLSAgICBCSEkgICAgIGRvX2ZpbGwgICAgICAgICAgICAgICAgIDsvLyAoeDArcGFydFcpPndpZHRoCi0KLSAgICBDTVAgICAgIHkwLCAjMAotICAgIEJMVCAgICAgZG9fZmlsbCAgICAgICAgICAgICAgICAgOy8vICh5MCA8IDApCi0gICAgTERSICAgICBwYXJ0SCwgW3NwLCMweDIyNF0gICAgICA7Ly8gcGFydEhlaWdodAotICAgIEFERCAgICAgdG1wNiwgeTAsIHBhcnRIICAgICAgICAgOy8vICh5MCtwYXJ0SGVpZ2h0KQotICAgIEFERCAgICAgdG1wNiwgdG1wNiwgIzUgICAgICAgICAgOy8vICh5MCtwYXJ0SCs1KQotICAgIExEUiAgICAgaGVpZ2h0LCBbc3AsIzB4MjFjXSAgICAgOy8vIGhlaWdodAotICAgIENNUCAgICAgdG1wNiwgaGVpZ2h0Ci0gICAgQkxTICAgICBza2lwX2ZpbGwgICAgICAgICAgICAgICA7Ly8gbm8gb3ZlcmZpbGwgbmVlZGVkCi0KLQotZG9fZmlsbAotICAgIExEUiAgICAgcGFydEgsIFtzcCwjMHgyMjRdICAgICAgOy8vIHBhcnRIZWlnaHQKLSAgICBBREQgICAgIHRtcDUsIHBhcnRILCAjNSAgICAgICAgIDsvLyByMiA9IHBhcnRIICsgNTsKLSAgICBMRFIgICAgIGhlaWdodCwgW3NwLCMweDIxY10gICAgIDsvLyBoZWlnaHQKLSAgICBMRFIgICAgIHBhcnRXLCBbc3AsIzB4MjIwXSAgICAgIDsvLyBwYXJ0V2lkdGgKLSAgICBTVE1JQiAgIHNwLCB7aGVpZ2h0LCBwYXJ0V30gICAgIDsvLyBzcCs0ID0gaGVpZ2h0LCBzcCs4ID0gcGFydFdpZHRoCi0gICAgU1RSICAgICB0bXA1LCBbc3AsIzB4Y10gICAgICAgICA7Ly8gc3ArYyBwYXJ0SGVpZ2h0KzUKLSAgICBTVFIgICAgIHBhcnRXLCBbc3AsIzB4MTBdICAgICAgIDsvLyBzcCsxMCA9IHBhcnRXaWR0aAotICAgIExEUiAgICAgd2lkdGgsIFtzcCwjMHgyMThdICAgICAgOy8vIHdpZHRoCi0gICAgU1RSICAgICB3aWR0aCwgW3NwLCMwXSAgICAgICAgICA7Ly8gc3ArMCA9IHdpZHRoCi0gICAgQUREICAgICBidWZmLCBzcCwgIzB4MjggICAgICAgICA7Ly8gYnVmZiA9IHAxWzIxKjIxLzQrMV0KLSAgICBCTCAgICAgIGgyNjRic2RGaWxsQmxvY2sKLQotICAgIE1PViAgICAgeDAsICMwCi0gICAgU1RSICAgICB4MCxbc3AsIzB4MWVjXSAgICAgICAgICA7Ly8geDAgPSAwCi0gICAgU1RSICAgICB4MCxbc3AsIzB4MWYwXSAgICAgICAgICA7Ly8geTAgPSAwCi0gICAgQUREICAgICByZWYsc3AsIzB4MjggICAgICAgICAgICA7Ly8gcmVmID0gcDEKLSAgICBTVFIgICAgIHBhcnRXLCBbc3AsIzB4MjE4XQotCi0KLXNraXBfZmlsbAotICAgIExEUiAgICAgeDAgLFtzcCwjMHgxZWNdICAgICAgICAgOy8vIHgwCi0gICAgTERSICAgICB5MCAsW3NwLCMweDFmMF0gICAgICAgICA7Ly8geTAKLSAgICBMRFIgICAgIHdpZHRoLCBbc3AsIzB4MjE4XSAgICAgIDsvLyB3aWR0aAotICAgIE1MQSAgICAgdG1wNiwgd2lkdGgsIHkwLCB4MCAgICAgOy8vIHkwKndpZHRoK3gwCi0gICAgQUREICAgICByZWYsIHJlZiwgdG1wNiAgICAgICAgICA7Ly8gcmVmICs9IHkwKndpZHRoK3gwCi0gICAgTERSICAgICBtYiwgW3NwLCAjMHgxZThdICAgICAgICA7Ly8gbWIKLQotICAgIEFERCAgICAgY291bnQsIHBhcnRXLCBwYXJ0SCwgTFNMICM4ICAgIDsvLyB8eHh8eHh8cGFydEh8cGFydFd8Ci0gICAgTERSICAgICB0bXA1LCA9IDB4MDAwMTAxMDAKLSAgICBSU0IgICAgIGNvdW50LCB0bXA1LCBjb3VudCwgTFNMICM4ICAgICAgOy8vIHx4eHxwYXJ0SC0xfHBhcnRXLTF8eHh8Ci0gICAgTERSICAgICB0bXAyLCBbc3AsICMweDIyOF0gICAgICA7Ly8gdmVyT2Zmc2V0Ci0gICAgQUREICAgICBjb3VudCwgY291bnQsIHRtcDIgICAgICA7Ly8gfHh4fHBhcnRILTF8cGFydFctMXx2ZXJPZmZzZXR8Ci0gICAgTERSICAgICBwbHVzMTYsID0gMHgwMDEwMDAxMAotCi0gICAgQU5EICAgICB0bXAxLCBjb3VudCwgIzB4MDAwMEZGMDAgOy8vIHBhcnRXaWR0aAotCi0KLWxvb3BfeQotICAgIEFERCAgICAgY291bnQsIGNvdW50LCB0bXAxLCBMU0wgIzE2ICA7Ly8gcGFydFdpZHRoLTEgdG8gdG9wIGJ5dGUKLQotbG9vcF94Ci0gICAgTERSICAgICB0bXAxLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8YTR8YTN8YTJ8YTF8Ci0gICAgTERSICAgICB0bXAyLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8YzR8YzN8YzJ8YzF8Ci0gICAgTERSICAgICB0bXAzLCBbcmVmXSwgd2lkdGggICAgIDsvLyB8ZzR8ZzN8ZzJ8ZzF8Ci0gICAgTERSICAgICB0bXA0LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8bTR8bTN8bTJ8bTF8Ci0gICAgTERSICAgICB0bXA1LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8cjR8cjN8cjJ8cjF8Ci0gICAgTERSICAgICB0bXA2LCBbcmVmXSwgd2lkdGggICAgIDsvLyB8dDR8dDN8dDJ8dDF8Ci0KLSAgICA7Ly8gZmlyc3QgZm91ciBwaXhlbHMgCi0gICAgVVhUQjE2ICB0bXBhLCB0bXAzICAgICAgICAgICAgICAgICAgOy8vIHxnM3xnMXwKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDQgICAgICAgICAgICA7Ly8gfGczK20zfGcxK20xfAotICAgIFVYVEIxNiAgdG1wYiwgdG1wMiAgICAgICAgICAgICAgICAgIDsvLyB8YzN8YzF8Ci0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotCi0gICAgVVhUQUIxNiB0bXBiLCB0bXBiLCB0bXA1ICAgICAgICAgICAgOy8vIHxjMytyM3xjMStyMXwKLSAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0EKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDYgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKStBK1QKLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIExEUiAgICAgcmVzLCA9IDB4MDBGRjAwRkYKLSAgICBVWFRCMTYgIHRtcGEsIHRtcDMsIFJPUiAjOCAgICAgICAgICA7Ly8gfGc0fGcyfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wNCwgUk9SICM4ICAgIDsvLyB8ZzQrbTR8ZzIrbTJ8Ci0gICAgQU5EICAgICByZXMsIHJlcywgdG1wYiwgTFNSICM1ICAgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgotCi0gICAgQUREICAgICB0bXBhLCB0bXBhLCB0bXBhLCBMU0wgIzIgICAgOy8vIDUoRytNKQotICAgIFVYVEIxNiAgdG1wYiwgdG1wMiwgUk9SICM4ICAgICAgICAgIDsvLyB8YzR8YzJ8Ci0gICAgQUREICAgICB0bXBhLCBwbHVzMTYsIHRtcGEsIExTTCAjMiAgOy8vIDE2KzIwKEcrTSkKLSAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDUsIFJPUiAjOCAgICA7Ly8gfGM0K3I0fGMyK3IyfAotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0EKLSAgICBVWFRBQjE2IHRtcGEsIHRtcGEsIHRtcDYsIFJPUiAjOCAgICA7Ly8gMTYrMjAoRytNKStBK1QKLQotICAgIEFERCAgICAgdG1wYiwgdG1wYiwgdG1wYiwgTFNMICMyICAgIDsvLyA1KEMrUikKLSAgICBTU1VCMTYgIHRtcGEsIHRtcGEsIHRtcGIgICAgICAgICAgICA7Ly8gMTYrMjAoRytNKSsoQStUKS01KEMrUikKLQotICAgIFVTQVQxNiAgdG1wYiwgIzEzLCB0bXBhICAgICAgICAgICAgIDsvLyBzYXR1cmF0ZQotICAgIE1PVlMgICAgdG1wMSwgY291bnQsIExTTCAjMzEgICAgICAgIDsvLyB1cGRhdGUgZmxhZ3MgKHZlck9mZnNldCkKLSAgICBMRFIgICAgIHRtcGEsID0gMHhGRjAwRkYwMAotICAgIE1WTkVRICAgdG1wMSwgdG1wMyAgICAgICAgICAgICAgICAgIDsvLyBzZWxlY3QgdmVyT2Zmc2V0PTAKLSAgICBNVk5ORSAgIHRtcDEsIHRtcDQgICAgICAgICAgICAgICAgICA7Ly8gc2VsZWN0IHZlck9mZnNldD0xCi0gICAgQU5EICAgICB0bXBhLCB0bXBhLCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmVkZSBieSAzMgotICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKLQotICAgIExEUiAgICAgdG1wYSwgPSAweDgwODA4MDgwCi0gICAgVUhTVUI4ICByZXMsIHJlcywgdG1wMSAgICAgICAgICAgICAgOy8vIGJpbGluZWFyIGludGVycG9sYXRpb24KLSAgICBMRFIgICAgIHRtcDEsIFtyZWZdLCB3aWR0aCAgICAgICAgICA7Ly8gbG9hZCBuZXh0IHJvdwotICAgIEVPUiAgICAgcmVzLCByZXMsIHRtcGEgICAgICAgICAgICAgIDsvLyBjb3JyZWN0IHNpZ24KLQotICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjMTYgICAgICAgICAgICAgIDsvLyBuZXh0IHJvdyAobWIpCi0KLQotICAgIDsvLyB0bXAyID0gfGE0fGEzfGEyfGExfAotICAgIDsvLyB0bXAzID0gfGM0fGMzfGMyfGMxfAotICAgIDsvLyB0bXA0ID0gfGc0fGczfGcyfGcxfAotICAgIDsvLyB0bXA1ID0gfG00fG0zfG0yfG0xfAotICAgIDsvLyB0bXA2ID0gfHI0fHIzfHIyfHIxfAotICAgIDsvLyB0bXAxID0gfHQ0fHQzfHQyfHQxfAotCi0gICAgOy8vIHNlY29uZCBmb3VyIHBpeGVscwotICAgIFVYVEIxNiAgdG1wYSwgdG1wNCAgICAgICAgICAgICAgICAgIDsvLyB8ZzN8ZzF8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA1ICAgICAgICAgICAgOy8vIHxnMyttM3xnMSttMXwKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDMgICAgICAgICAgICAgICAgICA7Ly8gfGMzfGMxfAotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLSAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDYgICAgICAgICAgICA7Ly8gfGMzK3IzfGMxK3IxfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAyICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0ErVAotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTERSICAgICByZXMsID0gMHgwMEZGMDBGRgotICAgIFVYVEIxNiAgdG1wYSwgdG1wNCwgUk9SICM4ICAgICAgICAgIDsvLyB8ZzR8ZzJ8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA1LCBST1IgIzggICAgOy8vIHxnNCttNHxnMittMnwKLSAgICBBTkQgICAgIHJlcywgcmVzLCB0bXBiLCBMU1IgIzUgICAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCi0KLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0gICAgVVhUQjE2ICB0bXBiLCB0bXAzLCBST1IgIzggICAgICAgICAgOy8vIHxjNHxjMnwKLSAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wNiwgUk9SICM4ICAgIDsvLyB8YzQrcjR8YzIrcjJ8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAyLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMSwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0ErVAotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTERSICAgICB0bXBhLCA9IDB4RkYwMEZGMDAKLSAgICBNVk5FUSAgIHRtcDIsIHRtcDQgICAgICAgICAgICAgICAgICA7Ly8gc2VsZWN0IHZlck9mZnNldD0wCi0gICAgTVZOTkUgICB0bXAyLCB0bXA1ICAgICAgICAgICAgICAgICAgOy8vIHNlbGVjdCB2ZXJPZmZzZXQ9MQotCi0gICAgQU5EICAgICB0bXBhLCB0bXBhLCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgotICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKLSAgICBMRFIgICAgIHRtcGEsID0gMHg4MDgwODA4MAotICAgIFVIU1VCOCAgcmVzLCByZXMsIHRtcDIgICAgICAgICAgICAgIDsvLyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCi0gICAgTERSICAgICB0bXAyLCBbcmVmXSwgd2lkdGggICAgICAgICAgOy8vIGxvYWQgbmV4dCByb3cKLSAgICBFT1IgICAgIHJlcywgcmVzLCB0bXBhICAgICAgICAgICAgICA7Ly8gY29ycmVjdCBzaWduCi0gICAgU1RSICAgICByZXMsIFttYl0sICMxNiAgICAgICAgICAgICAgOy8vIG5leHQgcm93Ci0KLSAgICA7Ly8gdG1wMyA9IHxhNHxhM3xhMnxhMXwKLSAgICA7Ly8gdG1wNCA9IHxjNHxjM3xjMnxjMXwKLSAgICA7Ly8gdG1wNSA9IHxnNHxnM3xnMnxnMXwKLSAgICA7Ly8gdG1wNiA9IHxtNHxtM3xtMnxtMXwKLSAgICA7Ly8gdG1wMSA9IHxyNHxyM3xyMnxyMXwKLSAgICA7Ly8gdG1wMiA9IHx0NHx0M3x0Mnx0MXwKLQotICAgIDsvLyB0aGlyZCBmb3VyIHBpeGVscwotICAgIFVYVEIxNiAgdG1wYSwgdG1wNSAgICAgICAgICAgICAgICAgIDsvLyB8ZzN8ZzF8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA2ICAgICAgICAgICAgOy8vIHxnMyttM3xnMSttMXwKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDQgICAgICAgICAgICAgICAgICA7Ly8gfGMzfGMxfAotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLSAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDEgICAgICAgICAgICA7Ly8gfGMzK3IzfGMxK3IxfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAzICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMiAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0ErVAotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTERSICAgICByZXMsID0gMHgwMEZGMDBGRgotICAgIFVYVEIxNiAgdG1wYSwgdG1wNSwgUk9SICM4ICAgICAgICAgIDsvLyB8ZzR8ZzJ8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA2LCBST1IgIzggICAgOy8vIHxnNCttNHxnMittMnwKLSAgICBBTkQgICAgIHJlcywgcmVzLCB0bXBiLCBMU1IgIzUgICAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCi0KLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0gICAgVVhUQjE2ICB0bXBiLCB0bXA0LCBST1IgIzggICAgICAgICAgOy8vIHxjNHxjMnwKLSAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wMSwgUk9SICM4ICAgIDsvLyB8YzQrcjR8YzIrcjJ8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAzLCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMiwgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0ErVAotCi0KLSAgICBBREQgICAgIHRtcGIsIHRtcGIsIHRtcGIsIExTTCAjMiAgICA7Ly8gNShDK1IpCi0gICAgU1NVQjE2ICB0bXBhLCB0bXBhLCB0bXBiICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrKEErVCktNShDK1IpCi0KLSAgICBVU0FUMTYgIHRtcGIsICMxMywgdG1wYSAgICAgICAgICAgICA7Ly8gc2F0dXJhdGUKLSAgICBMRFIgICAgIHRtcGEsID0gMHhGRjAwRkYwMAotICAgIE1WTkVRICAgdG1wMywgdG1wNSAgICAgICAgICAgICAgICAgIDsvLyBzZWxlY3QgdmVyT2Zmc2V0PTAKLSAgICBNVk5ORSAgIHRtcDMsIHRtcDYgICAgICAgICAgICAgICAgICA7Ly8gc2VsZWN0IHZlck9mZnNldD0xCi0KLSAgICBBTkQgICAgIHRtcGEsIHRtcGEsIHRtcGIsIExTTCAjMyAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCi0gICAgT1JSICAgICByZXMsIHJlcywgdG1wYQotICAgIExEUiAgICAgdG1wYSwgPSAweDgwODA4MDgwCi0gICAgVUhTVUI4ICByZXMsIHJlcywgdG1wMyAgICAgICAgICAgICAgOy8vIGJpbGluZWFyIGludGVycG9sYXRpb24KLSAgICBMRFIgICAgIHRtcDMsIFtyZWZdICAgICAgICAgICAgICAgICA7Ly8gbG9hZCBuZXh0IHJvdwotICAgIEVPUiAgICAgcmVzLCByZXMsIHRtcGEgICAgICAgICAgICAgIDsvLyBjb3JyZWN0IHNpZ24KLSAgICBTVFIgICAgIHJlcywgW21iXSwgIzE2ICAgICAgICAgICAgICA7Ly8gbmV4dCByb3cKLQotICAgIDsvLyB0bXA0ID0gfGE0fGEzfGEyfGExfAotICAgIDsvLyB0bXA1ID0gfGM0fGMzfGMyfGMxfAotICAgIDsvLyB0bXA2ID0gfGc0fGczfGcyfGcxfAotICAgIDsvLyB0bXAxID0gfG00fG0zfG0yfG0xfAotICAgIDsvLyB0bXAyID0gfHI0fHIzfHIyfHIxfAotICAgIDsvLyB0bXAzID0gfHQ0fHQzfHQyfHQxfAotCi0gICAgOy8vIGZvdXJ0aCBmb3VyIHBpeGVscwotICAgIFVYVEIxNiAgdG1wYSwgdG1wNiAgICAgICAgICAgICAgICAgIDsvLyB8ZzN8ZzF8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxICAgICAgICAgICAgOy8vIHxnMyttM3xnMSttMXwKLSAgICBVWFRCMTYgIHRtcGIsIHRtcDUgICAgICAgICAgICAgICAgICA7Ly8gfGMzfGMxfAotICAgIEFERCAgICAgdG1wYSwgdG1wYSwgdG1wYSwgTFNMICMyICAgIDsvLyA1KEcrTSkKLSAgICBVWFRBQjE2IHRtcGIsIHRtcGIsIHRtcDIgICAgICAgICAgICA7Ly8gfGMzK3IzfGMxK3IxfAotICAgIEFERCAgICAgdG1wYSwgcGx1czE2LCB0bXBhLCBMU0wgIzIgIDsvLyAxNisyMChHK00pCi0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA0ICAgICAgICAgICAgOy8vIDE2KzIwKEcrTSkrQQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMyAgICAgICAgICAgIDsvLyAxNisyMChHK00pK0ErVAotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTERSICAgICByZXMsID0gMHgwMEZGMDBGRgotICAgIFVYVEIxNiAgdG1wYSwgdG1wNiwgUk9SICM4ICAgICAgICAgIDsvLyB8ZzR8ZzJ8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXAxLCBST1IgIzggICAgOy8vIHxnNCttNHxnMittMnwKLSAgICBBTkQgICAgIHJlcywgcmVzLCB0bXBiLCBMU1IgIzUgICAgICA7Ly8gbWFzayBhbmQgZGl2aWRlIGJ5IDMyCi0KLSAgICBBREQgICAgIHRtcGEsIHRtcGEsIHRtcGEsIExTTCAjMiAgICA7Ly8gNShHK00pCi0gICAgVVhUQjE2ICB0bXBiLCB0bXA1LCBST1IgIzggICAgICAgICAgOy8vIHxjNHxjMnwKLSAgICBBREQgICAgIHRtcGEsIHBsdXMxNiwgdG1wYSwgTFNMICMyICA7Ly8gMTYrMjAoRytNKQotICAgIFVYVEFCMTYgdG1wYiwgdG1wYiwgdG1wMiwgUk9SICM4ICAgIDsvLyB8YzQrcjR8YzIrcjJ8Ci0gICAgVVhUQUIxNiB0bXBhLCB0bXBhLCB0bXA0LCBST1IgIzggICAgOy8vIDE2KzIwKEcrTSkrQQotICAgIFVYVEFCMTYgdG1wYSwgdG1wYSwgdG1wMywgUk9SICM4ICAgIDsvLyAxNisyMChHK00pK0ErVAotCi0gICAgQUREICAgICB0bXBiLCB0bXBiLCB0bXBiLCBMU0wgIzIgICAgOy8vIDUoQytSKQotICAgIFNTVUIxNiAgdG1wYSwgdG1wYSwgdG1wYiAgICAgICAgICAgIDsvLyAxNisyMChHK00pKyhBK1QpLTUoQytSKQotCi0gICAgVVNBVDE2ICB0bXBiLCAjMTMsIHRtcGEgICAgICAgICAgICAgOy8vIHNhdHVyYXRlCi0gICAgTERSICAgICB0bXA0LCA9IDB4RkYwMEZGMDAKLSAgICBNVk5FUSAgIHRtcDUsIHRtcDYgICAgICAgICAgICAgICAgICA7Ly8gc2VsZWN0IHZlck9mZnNldD0wCi0gICAgTVZOTkUgICB0bXA1LCB0bXAxICAgICAgICAgICAgICAgICAgOy8vIHNlbGVjdCB2ZXJPZmZzZXQ9MQotCi0gICAgQU5EICAgICB0bXBhLCB0bXA0LCB0bXBiLCBMU0wgIzMgICAgOy8vIG1hc2sgYW5kIGRpdmlkZSBieSAzMgotICAgIE9SUiAgICAgcmVzLCByZXMsIHRtcGEKLSAgICBMRFIgICAgIHRtcGEsID0gMHg4MDgwODA4MAotICAgIFVIU1VCOCAgcmVzLCByZXMsIHRtcDUgICAgICAgICAgICAgIDsvLyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCi0KLSAgICA7Ly8gZGVjcmVtZW50IGxvb3BfeCBjb3VudGVyCi0gICAgU1VCUyAgICBjb3VudCwgY291bnQsICM0PDwyNCAgICAgICAgOy8vIChwYXJ0V2lkdGgtMSkgLT0gNDsKLQotICAgIDsvLyBjYWxjdWxhdGUgInJlZiIgYWRkcmVzcyBmb3IgbmV4dCByb3VuZAotICAgIFNVQiAgICAgcmVmLCByZWYsIHdpZHRoLCBMU0wgIzMgICAgIDsvLyByZWYgLT0gOCp3aWR0aDsKLSAgICBBREQgICAgIHJlZiwgcmVmLCAjNDsgICAgICAgICAgICAgICA7Ly8gbmV4dCBjb2x1bW4gKDQgcGl4ZWxzKQotCi0gICAgRU9SICAgICByZXMsIHJlcywgdG1wYSAgICAgICAgICAgICAgOy8vIGNvcnJlY3Qgc2lnbgotICAgIFNUUiAgICAgcmVzLCBbbWJdLCAjLTQ0Ci0gCi0gICAgQkNTICAgICBsb29wX3gKLQotICAgIEFERFMgICAgY291bnQsIGNvdW50LCAjMjUyPDwxNiAgICAgIDsvLyAocGFydEhlaWdodC0xKSAtPSA0OwotICAgIEFERCAgICAgcmVmLCByZWYsIHdpZHRoLCBMU0wgIzIgICAgIDsvLyByZWYgKz0gNCp3aWR0aAotICAgIEFORCAgICAgdG1wMSwgY291bnQsICMweDAwMDBGRjAwICAgIDsvLyBwYXJ0V2lkdGgtMQotICAgIE1PViAgICAgdG1wMiwgIzEKLSAgICBBREQgICAgIHRtcDIsIHRtcDIsIHRtcDEsIExTUiAjOCAgICA7Ly8gcGFydFdpZHRoCi0gICAgU1VCICAgICByZWYsIHJlZiwgdG1wMiAgICAgICAgICAgICAgOy8vIHJlZiAtPSBwYXJ0V2lkdGgKLSAgICBBREQgICAgIG1iLCBtYiwgIzY0OwotICAgIFNVQiAgICAgbWIsIG1iLCB0bXAyOyAgICAgICAgICAgICAgIDsvLyBtYiAtPSBwYXJ0V2lkdGgKLSAgICBCR0UgICAgIGxvb3BfeQotCi0gICAgQUREICAgICBzcCxzcCwjMHgxZjQKLSAgICBMRE1GRCAgIHNwISwge3I0LXIxMSwgcGN9Ci0KLSAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtMTFfYXNtL3dpbl9hc20uYmF0IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vd2luX2FzbS5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOGQ4OGMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm0xMV9hc20vd2luX2FzbS5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1lY2hvIG9mZgotc2V0IEFTTUZMQUdTPSAtY2hlY2tyZWdsaXN0IC1DUFUgQVJNMTEzNiAtUHJlRGVmaW5lICJIMjY0REVDX1dJTkFTTSBTRVRMIHtUUlVFfSIKLXNldCBBU009IkQ6XFByb2dyYW0gRmlsZXNcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gOFxWQ1xjZVxiaW5ceDg2X2FybVxhcm1hc20iCi1lY2hvIG9uCi0KLSVBU00lICVBU01GTEFHUyUgaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfdmVyLnMKLSVBU00lICVBU01GTEFHUyUgaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfaG9yLnMKLSVBU00lICVBU01GTEFHUyUgaDI2NGJzZF9pbnRlcnBvbGF0ZV9ob3JfaGFsZi5zCi0lQVNNJSAlQVNNRkxBR1MlIGgyNjRic2RfaW50ZXJwb2xhdGVfaG9yX3F1YXJ0ZXIucwotJUFTTSUgJUFTTUZMQUdTJSBoMjY0YnNkX2ludGVycG9sYXRlX2hvcl92ZXJfcXVhcnRlci5zCi0lQVNNJSAlQVNNRkxBR1MlIGgyNjRic2RfaW50ZXJwb2xhdGVfdmVyX2hhbGYucwotJUFTTSUgJUFTTUZMQUdTJSBoMjY0YnNkX2ludGVycG9sYXRlX3Zlcl9xdWFydGVyLnMKLQotcmVtICVBU00lICVBU01GTEFHUyUgaDI2NGJzZF9pbnRlcnBvbGF0ZV9jaHJvbWFfaG9yX3Zlci5zCi1yZW0gJUFTTSUgJUFTTUZMQUdTJSBoMjY0YnNkX2ludGVycG9sYXRlX21pZF9ob3IucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZENsZWFyTWJMYXllci5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZENsZWFyTWJMYXllci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjExNjU0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RDbGVhck1iTGF5ZXIucworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTsKLTsgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLTsKLTsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci07IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLTsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci07Ci07ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi07Ci07IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLTsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLTsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLTsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi07Ci0KLSAgICBSRVFVSVJFOAotICAgIFBSRVNFUlZFOAotCi0gICAgQVJFQSAgICB8LnRleHR8LCBDT0RFCi0KLSAgICBFWFBPUlQgaDI2NGJzZENsZWFyTWJMYXllcgotCi07IElucHV0IC8gb3V0cHV0IHJlZ2lzdGVycwotcE1iTGF5ZXIgICAgUk4gIDAKLXNpemUgICAgICAgIFJOICAxCi1wVG1wICAgICAgICBSTiAgMgotc3RlcCAgICAgICAgUk4gIDMKLQotOyAtLSBORU9OIHJlZ2lzdGVycyAtLQotCi1xWmVybyAgIFFOICBRMC5VOAotCi07LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsKLTsgICAgRnVuY3Rpb246IGgyNjRic2RDbGVhck1iTGF5ZXIKLTsKLTsgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci07Ci07ICAgICAgICBJbnB1dHM6Ci07Ci07ICAgICAgICBPdXRwdXRzOgotOwotOyAgICAgICAgUmV0dXJuczoKLTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1oMjY0YnNkQ2xlYXJNYkxheWVyCi0KLSAgICBWTU9WICAgIHFaZXJvLCAjMAotICAgIEFERCAgICAgcFRtcCwgcE1iTGF5ZXIsICMxNgotICAgIE1PViAgICAgc3RlcCwgIzMyCi0gICAgU1VCUyAgICBzaXplLCBzaXplLCAjNjQKLQotbG9vcAotICAgIFZTVDEgICAgcVplcm8sIFtwTWJMYXllcl0sIHN0ZXAKLSAgICBTVUJTICAgIHNpemUsIHNpemUsICM2NAotICAgIFZTVDEgICAgcVplcm8sIFtwVG1wXSwgc3RlcAotICAgIFZTVDEgICAgcVplcm8sIFtwTWJMYXllcl0sIHN0ZXAKLSAgICBWU1QxICAgIHFaZXJvLCBbcFRtcF0sIHN0ZXAKLSAgICBCQ1MgICAgIGxvb3AKLQotICAgIEJYICAgICAgbHIKLSAgICBFTkQKLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RDb3VudExlYWRpbmdaZXJvcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2JkNzNlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RDb3VudExlYWRpbmdaZXJvcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotOwotOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotOwotOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsKLTsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsKLTsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsKLQotICAgIFJFUVVJUkU4Ci0gICAgUFJFU0VSVkU4Ci0KLSAgICBBUkVBICAgIHwudGV4dHwsIENPREUKLQotICAgIEVYUE9SVCBoMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MKLQotOyBJbnB1dCAvIG91dHB1dCByZWdpc3RlcnMKLXZhbHVlICAgIFJOICAwCi0KLTsgLS0gTkVPTiByZWdpc3RlcnMgLS0KLQotOy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ci07ICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MKLTsKLTsgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci07Ci07ICAgICAgICBJbnB1dHM6Ci07Ci07ICAgICAgICBPdXRwdXRzOgotOwotOyAgICAgICAgUmV0dXJuczoKLTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1oMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MKLQotICAgIENMWiAgICAgdmFsdWUsIHZhbHVlCi0gICAgQlggICAgICBscgotICAgIEVORAotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RGaWxsUm93Ny5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZEZpbGxSb3c3LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZmFjOTIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc20vaDI2NGJzZEZpbGxSb3c3LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotOwotOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotOwotOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsKLTsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsKLTsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsKLQotICAgIFJFUVVJUkU4Ci0gICAgUFJFU0VSVkU4Ci0KLSAgICBBUkVBICAgIHwudGV4dHwsIENPREUKLQotICAgIEVYUE9SVCBoMjY0YnNkRmlsbFJvdzcKLQotOyBJbnB1dCAvIG91dHB1dCByZWdpc3RlcnMKLQotcmVmICAgICBSTiAwCi1maWxsICAgIFJOIDEKLWxlZnQgICAgUk4gMgotdG1wMiAgICBSTiAyCi1jZW50ZXIgIFJOIDMKLXJpZ2h0ICAgUk4gNAotdG1wMSAgICBSTiA1Ci0KLTsgLS0gTkVPTiByZWdpc3RlcnMgLS0KLQotcVRtcDAgICBRTiAgUTAuVTgKLXFUbXAxICAgUU4gIFExLlU4Ci1kVG1wMCAgIEROICBEMC5VOAotZFRtcDEgICBETiAgRDEuVTgKLWRUbXAyICAgRE4gIEQyLlU4Ci1kVG1wMyAgIEROICBEMy5VOAotCi0KLTsvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOwotOyAgICBGdW5jdGlvbjogaDI2NGJzZEZpbGxSb3c3Ci07Ci07ICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotOwotOyAgICAgICAgSW5wdXRzOgotOwotOyAgICAgICAgT3V0cHV0czoKLTsKLTsgICAgICAgIFJldHVybnM6Ci07Ci07LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotaDI2NGJzZEZpbGxSb3c3Ci0gICAgICAgIFBVU0ggICAgIHtyNC1yNixscn0KLSAgICAgICAgQ01QICAgICAgbGVmdCwgIzAKLSAgICAgICAgTERSICAgICAgcmlnaHQsIFtzcCwjMHgxMF0KLSAgICAgICAgQkVRICAgICAgc3dpdGNoX2NlbnRlcgotICAgICAgICBMRFJCICAgICB0bXAxLCBbcmVmLCMwXQotCi1sb29wX2xlZnQKLSAgICAgICAgU1VCUyAgICAgbGVmdCwgbGVmdCwgIzEKLSAgICAgICAgU1RSQiAgICAgdG1wMSwgW2ZpbGxdLCAjMQotICAgICAgICBCTkUgICAgICBsb29wX2xlZnQKLQotc3dpdGNoX2NlbnRlcgotICAgICAgICBBU1IgICAgICB0bXAyLGNlbnRlciwjMgotICAgICAgICBDTVAgICAgICB0bXAyLCM5Ci0gICAgICAgIEFERENDICAgIHBjLHBjLHRtcDIsTFNMICMyCi0gICAgICAgIEIgICAgICAgIGxvb3BfY2VudGVyCi0gICAgICAgIEIgICAgICAgIGxvb3BfY2VudGVyCi0gICAgICAgIEIgICAgICAgIGNhc2VfMQotICAgICAgICBCICAgICAgICBjYXNlXzIKLSAgICAgICAgQiAgICAgICAgY2FzZV8zCi0gICAgICAgIEIgICAgICAgIGNhc2VfNAotICAgICAgICBCICAgICAgICBjYXNlXzUKLSAgICAgICAgQiAgICAgICAgY2FzZV82Ci0gICAgICAgIEIgICAgICAgIGNhc2VfNwotICAgICAgICBCICAgICAgICBjYXNlXzgKLTtjYXNlXzgKLTsgICAgICAgIExEUiAgICAgIHRtcDIsIFtyZWZdLCAjNAotOyAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0Ci07ICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0Ci07Y2FzZV83Ci07ICAgICAgICBMRFIgICAgICB0bXAyLCBbcmVmXSwgIzQKLTsgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAotOyAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCAjNAotO2Nhc2VfNgotOyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sICM0Ci07ICAgICAgICBTVUIgICAgICBjZW50ZXIsIGNlbnRlciwgIzQKLTsgICAgICAgIFNUUiAgICAgIHRtcDIsIFtmaWxsXSwjNAotO2Nhc2VfNQotOyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sICM0Ci07ICAgICAgICBTVUIgICAgICBjZW50ZXIsIGNlbnRlciwgIzQKLTsgICAgICAgIFNUUiAgICAgIHRtcDIsIFtmaWxsXSwjNAotO2Nhc2VfNAotOyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sIzQKLTsgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAotOyAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCAjNAotO2Nhc2VfMwotOyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sIzQKLTsgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAotOyAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCAjNAotO2Nhc2VfMgotOyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sIzQKLTsgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAotOyAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCAjNAotO2Nhc2VfMQotOyAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sIzQKLTsgICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAotOyAgICAgICAgU1RSICAgICAgdG1wMiwgW2ZpbGxdLCAjNAotCi1jYXNlXzgKLSAgICAgICAgVkxEMSAgICB7cVRtcDAsIHFUbXAxfSwgW3JlZl0hCi0gICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMzMgotICAgICAgICBWU1QxICAgIHFUbXAwLCBbZmlsbF0hCi0gICAgICAgIFZTVDEgICAgcVRtcDEsIFtmaWxsXSEKLSAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgotY2FzZV83Ci0gICAgICAgIFZMRDEgICAge2RUbXAwLGRUbXAxLGRUbXAyfSwgW3JlZl0hCi0gICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMyOAotICAgICAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCAjNAotICAgICAgICBWU1QxICAgIHtkVG1wMCxkVG1wMSxkVG1wMn0sIFtmaWxsXSEKLSAgICAgICAgU1RSICAgICB0bXAyLCBbZmlsbF0sIzQKLSAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgotY2FzZV82Ci0gICAgICAgIFZMRDEgICAge2RUbXAwLGRUbXAxLGRUbXAyfSwgW3JlZl0hCi0gICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMyNAotICAgICAgICBWU1QxICAgIHtkVG1wMCxkVG1wMSxkVG1wMn0sIFtmaWxsXSEKLSAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgotY2FzZV81Ci0gICAgICAgIFZMRDEgICAgcVRtcDAsIFtyZWZdIQotICAgICAgICBTVUIgICAgIGNlbnRlciwgY2VudGVyLCAjMjAKLSAgICAgICAgTERSICAgICB0bXAyLCBbcmVmXSwgIzQKLSAgICAgICAgVlNUMSAgICBxVG1wMCwgW2ZpbGxdIQotICAgICAgICBTVFIgICAgIHRtcDIsIFtmaWxsXSwjNAotICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCi1jYXNlXzQKLSAgICAgICAgVkxEMSAgICBxVG1wMCwgW3JlZl0hCi0gICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMxNgotICAgICAgICBWU1QxICAgIHFUbXAwLCBbZmlsbF0hCi0gICAgICAgIEIgICAgICAgbG9vcF9jZW50ZXIKLWNhc2VfMwotICAgICAgICBWTEQxICAgIGRUbXAwLCBbcmVmXSEKLSAgICAgICAgU1VCICAgICBjZW50ZXIsIGNlbnRlciwgIzEyCi0gICAgICAgIExEUiAgICAgdG1wMiwgW3JlZl0sICM0Ci0gICAgICAgIFZTVDEgICAgZFRtcDAsIFtmaWxsXSEKLSAgICAgICAgU1RSICAgICB0bXAyLCBbZmlsbF0sIzQKLSAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgotY2FzZV8yCi0gICAgICAgIExEUiAgICAgIHRtcDIsIFtyZWZdLCM0Ci0gICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAotICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0Ci1jYXNlXzEKLSAgICAgICAgTERSICAgICAgdG1wMiwgW3JlZl0sIzQKLSAgICAgICAgU1VCICAgICAgY2VudGVyLCBjZW50ZXIsICM0Ci0gICAgICAgIFNUUiAgICAgIHRtcDIsIFtmaWxsXSwgIzQKLQotbG9vcF9jZW50ZXIKLSAgICAgICAgQ01QICAgICAgY2VudGVyLCAjMAotICAgICAgICBMRFJCTkUgICB0bXAyLCBbcmVmXSwgIzEKLSAgICAgICAgU1VCTkUgICAgY2VudGVyLCBjZW50ZXIsICMxCi0gICAgICAgIFNUUkJORSAgIHRtcDIsIFtmaWxsXSwgIzEKLSAgICAgICAgQk5FICAgICAgbG9vcF9jZW50ZXIKLSAgICAgICAgQ01QICAgICAgcmlnaHQsIzAKLSAgICAgICAgUE9QRVEgICAge3I0LXI2LHBjfQotICAgICAgICBMRFJCICAgICB0bXAyLCBbcmVmLCMtMV0KLQotbG9vcF9yaWdodAotICAgICAgICBTVFJCICAgICB0bXAyLCBbZmlsbF0sICMxCi0gICAgICAgIFNVQlMgICAgIHJpZ2h0LCByaWdodCwgIzEKLSAgICAgICAgQk5FICAgICAgbG9vcF9yaWdodAotCi0gICAgICAgIFBPUCAgICAgIHtyNC1yNixwY30KLSAgICAgICAgRU5ECi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RGbHVzaEJpdHMucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RGbHVzaEJpdHMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEzMzViOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkRmx1c2hCaXRzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi07Ci07IENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci07Ci07IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi07IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotOwotOyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotOwotOyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi07IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotOyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotOwotCi0gICAgUkVRVUlSRTgKLSAgICBQUkVTRVJWRTgKLQotICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQotCi0gICAgRVhQT1JUIGgyNjRic2RGbHVzaEJpdHMKLQotOyBJbnB1dCAvIG91dHB1dCByZWdpc3RlcnMKLXBTdHJtRGF0YSAgICAgICBSTiAgMAotbnVtQml0cyAgICAgICAgIFJOICAxCi1yZWFkQml0cyAgICAgICAgUk4gIDIKLXN0cm1CdWZmU2l6ZSAgICBSTiAgMwotcFN0cm1CdWZmU3RhcnQgIFJOICAxCi1wU3RybUN1cnJQb3MgICAgUk4gIDIKLWJpdFBvc0luV29yZCAgICBSTiAgMQotCi07IC0tIE5FT04gcmVnaXN0ZXJzIC0tCi0KLQotCi07LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsKLTsgICAgRnVuY3Rpb246IGgyNjRic2RGbHVzaEJpdHMKLTsKLTsgICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci07Ci07ICAgICAgICBJbnB1dHM6Ci07Ci07ICAgICAgICBPdXRwdXRzOgotOwotOyAgICAgICAgUmV0dXJuczoKLTsKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1oMjY0YnNkRmx1c2hCaXRzCi07Ly8gICAgUFVTSCAgICAge3I0LXI2LGxyfQotCi0gICAgTERSIHJlYWRCaXRzLCBbcFN0cm1EYXRhLCAjMHgxMF0KLSAgICBMRFIgc3RybUJ1ZmZTaXplLCBbcFN0cm1EYXRhLCAjMHhDXQotCi0gICAgQUREIHJlYWRCaXRzLCByZWFkQml0cywgbnVtQml0cwotICAgIEFORCBiaXRQb3NJbldvcmQsIHJlYWRCaXRzLCAjNwotCi0gICAgU1RSIHJlYWRCaXRzLCBbcFN0cm1EYXRhLCAjMHgxMF0KLSAgICBTVFIgYml0UG9zSW5Xb3JkLCBbcFN0cm1EYXRhLCAjMHg4XQotCi0gICAgTERSIHBTdHJtQnVmZlN0YXJ0LCBbcFN0cm1EYXRhLCAjMHgwXQotCi0gICAgQ01QIHJlYWRCaXRzLCBzdHJtQnVmZlNpemUsIExTTCAjMwotCi0gICAgQkhJIGVuZF9vZl9zdHJlYW0KLQotICAgIEFERCBwU3RybUN1cnJQb3MsIHBTdHJtQnVmZlN0YXJ0LCByZWFkQml0cywgTFNSICMzCi0gICAgU1RSIHBTdHJtQ3VyclBvcywgW3BTdHJtRGF0YSwgIzB4NF0KLSAgICBNT1YgcjAsICMwCi0gICAgQlggIGxyCi07Ly8gICAgUE9QICAgICAge3I0LXI2LHBjfQotCi1lbmRfb2Zfc3RyZWFtCi0gICAgTVZOIHIwLCAjMAotICAgIEJYICBscgotOy8vICAgIFBPUCAgICAgIHtyNC1yNixwY30KLQotICAgIEVORAotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RXcml0ZU1hY3JvYmxvY2sucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtL2gyNjRic2RXcml0ZU1hY3JvYmxvY2sucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhhMDc4MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbS9oMjY0YnNkV3JpdGVNYWNyb2Jsb2NrLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotOwotOyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotOwotOyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotOyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTsKLTsgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTsKLTsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotOyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLTsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotOyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLTsKLQotICAgIFJFUVVJUkU4Ci0gICAgUFJFU0VSVkU4Ci0KLSAgICBBUkVBICAgIHwudGV4dHwsIENPREUKLQotICAgIEVYUE9SVCBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrCi0KLTsgSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzCi1pbWFnZSAgIFJOICAwCi1kYXRhICAgIFJOICAxCi13aWR0aCAgIFJOICAyCi1sdW1hICAgIFJOICAzCi1jYiAgICAgIFJOICA0Ci1jciAgICAgIFJOICA1Ci1jd2lkdGggIFJOICA2Ci0KLTsgLS0gTkVPTiByZWdpc3RlcnMgLS0KLQotcVJvdzAgICBRTiAgUTAuVTgKLXFSb3cxICAgUU4gIFExLlU4Ci1xUm93MiAgIFFOICBRMi5VOAotcVJvdzMgICBRTiAgUTMuVTgKLXFSb3c0ICAgUU4gIFE0LlU4Ci1xUm93NSAgIFFOICBRNS5VOAotcVJvdzYgICBRTiAgUTYuVTgKLXFSb3c3ICAgUU4gIFE3LlU4Ci1xUm93OCAgIFFOICBROC5VOAotcVJvdzkgICBRTiAgUTkuVTgKLXFSb3cxMCAgUU4gIFExMC5VOAotcVJvdzExICBRTiAgUTExLlU4Ci1xUm93MTIgIFFOICBRMTIuVTgKLXFSb3cxMyAgUU4gIFExMy5VOAotcVJvdzE0ICBRTiAgUTE0LlU4Ci1xUm93MTUgIFFOICBRMTUuVTgKLQotZFJvdzAgICBETiAgRDAuVTgKLWRSb3cxICAgRE4gIEQxLlU4Ci1kUm93MiAgIEROICBEMi5VOAotZFJvdzMgICBETiAgRDMuVTgKLWRSb3c0ICAgRE4gIEQ0LlU4Ci1kUm93NSAgIEROICBENS5VOAotZFJvdzYgICBETiAgRDYuVTgKLWRSb3c3ICAgRE4gIEQ3LlU4Ci1kUm93OCAgIEROICBEOC5VOAotZFJvdzkgICBETiAgRDkuVTgKLWRSb3cxMCAgRE4gIEQxMC5VOAotZFJvdzExICBETiAgRDExLlU4Ci1kUm93MTIgIEROICBEMTIuVTgKLWRSb3cxMyAgRE4gIEQxMy5VOAotZFJvdzE0ICBETiAgRDE0LlU4Ci1kUm93MTUgIEROICBEMTUuVTgKLQotOy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07Ci07ICAgIEZ1bmN0aW9uOiBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrCi07Ci07ICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotOyAgICAgICAgICAgIFdyaXRlIG9uZSBtYWNyb2Jsb2NrIGludG8gdGhlIGltYWdlLiBCb3RoIGx1bWEgYW5kIGNocm9tYQotOyAgICAgICAgICAgIGNvbXBvbmVudHMgd2lsbCBiZSB3cml0dGVuIGF0IHRoZSBzYW1lIHRpbWUuCi07Ci07ICAgICAgICBJbnB1dHM6Ci07ICAgICAgICAgICAgZGF0YSAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgZGF0YSB0byBiZSB3cml0dGVuLCAyNTYgdmFsdWVzIGZvcgotOyAgICAgICAgICAgICAgICAgICAgbHVtYSBmb2xsb3dlZCBieSA2NCB2YWx1ZXMgZm9yIGJvdGggY2hyb21hIGNvbXBvbmVudHMKLTsKLTsgICAgICAgIE91dHB1dHM6Ci07ICAgICAgICAgICAgaW1hZ2UgICBwb2ludGVyIHRvIHRoZSBpbWFnZSB3aGVyZSB0aGUgbWFjcm9ibG9jayB3aWxsIGJlIHdyaXR0ZW4KLTsKLTsgICAgICAgIFJldHVybnM6Ci07ICAgICAgICAgICAgbm9uZQotOwotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWgyNjRic2RXcml0ZU1hY3JvYmxvY2sKLSAgICBQVVNIICAgIHtyNC1yNixscn0KLSAgICBWUFVTSCAgIHtxNC1xN30KLQotICAgIExEUiAgICAgd2lkdGgsIFtpbWFnZSwgIzRdCi0gICAgTERSICAgICBsdW1hLCBbaW1hZ2UsICMweENdCi0gICAgTERSICAgICBjYiwgW2ltYWdlLCAjMHgxMF0KLSAgICBMRFIgICAgIGNyLCBbaW1hZ2UsICMweDE0XQotCi0KLTsgICBXcml0ZSBsdW1hCi0gICAgVkxEMSAgICB7cVJvdzAsIHFSb3cxfSwgW2RhdGFdIQotICAgIExTTCAgICAgd2lkdGgsIHdpZHRoLCAjNAotICAgIFZMRDEgICAge3FSb3cyLCBxUm93M30sIFtkYXRhXSEKLSAgICBMU1IgICAgIGN3aWR0aCwgd2lkdGgsICMxCi0gICAgVlNUMSAgICB7cVJvdzB9LCBbbHVtYUAxMjhdLCB3aWR0aAotICAgIFZMRDEgICAge3FSb3c0LCBxUm93NX0sIFtkYXRhXSEKLSAgICBWU1QxICAgIHtxUm93MX0sIFtsdW1hQDEyOF0sIHdpZHRoCi0gICAgVkxEMSAgICB7cVJvdzYsIHFSb3c3fSwgW2RhdGFdIQotICAgIFZTVDEgICAge3FSb3cyfSwgW2x1bWFAMTI4XSwgd2lkdGgKLSAgICBWTEQxICAgIHtxUm93OCwgcVJvdzl9LCBbZGF0YV0hCi0gICAgVlNUMSAgICB7cVJvdzN9LCBbbHVtYUAxMjhdLCB3aWR0aAotICAgIFZMRDEgICAge3FSb3cxMCwgcVJvdzExfSwgW2RhdGFdIQotICAgIFZTVDEgICAge3FSb3c0fSwgW2x1bWFAMTI4XSwgd2lkdGgKLSAgICBWTEQxICAgIHtxUm93MTIsIHFSb3cxM30sIFtkYXRhXSEKLSAgICBWU1QxICAgIHtxUm93NX0sIFtsdW1hQDEyOF0sIHdpZHRoCi0gICAgVkxEMSAgICB7cVJvdzE0LCBxUm93MTV9LCBbZGF0YV0hCi0gICAgVlNUMSAgICB7cVJvdzZ9LCBbbHVtYUAxMjhdLCB3aWR0aAotCi0gICAgVkxEMSAgICB7cVJvdzAsIHFSb3cxfSwgW2RhdGFdISA7Y2Igcm93cyAwLDEsMiwzCi0gICAgVlNUMSAgICB7cVJvdzd9LCBbbHVtYUAxMjhdLCB3aWR0aAotICAgIFZMRDEgICAge3FSb3cyLCBxUm93M30sIFtkYXRhXSEgO2NiIHJvd3MgNCw1LDYsNwotICAgIFZTVDEgICAge3FSb3c4fSwgW2x1bWFAMTI4XSwgd2lkdGgKLSAgICBWTEQxICAgIHtxUm93NCwgcVJvdzV9LCBbZGF0YV0hIDtjciByb3dzIDAsMSwyLDMKLSAgICBWU1QxICAgIHtxUm93OX0sIFtsdW1hQDEyOF0sIHdpZHRoCi0gICAgVkxEMSAgICB7cVJvdzYsIHFSb3c3fSwgW2RhdGFdISA7Y3Igcm93cyA0LDUsNiw3Ci0gICAgVlNUMSAgICB7cVJvdzEwfSwgW2x1bWFAMTI4XSwgd2lkdGgKLSAgICBWU1QxICAgIHtkUm93MH0sIFtjYkA2NF0sIGN3aWR0aAotICAgIFZTVDEgICAge2RSb3c4fSwgW2NyQDY0XSwgY3dpZHRoCi0gICAgVlNUMSAgICB7cVJvdzExfSwgW2x1bWFAMTI4XSwgd2lkdGgKLSAgICBWU1QxICAgIHtkUm93MX0sIFtjYkA2NF0sIGN3aWR0aAotICAgIFZTVDEgICAge2RSb3c5fSwgW2NyQDY0XSwgY3dpZHRoCi0gICAgVlNUMSAgICB7cVJvdzEyfSwgW2x1bWFAMTI4XSwgd2lkdGgKLSAgICBWU1QxICAgIHtkUm93Mn0sIFtjYkA2NF0sIGN3aWR0aAotICAgIFZTVDEgICAge2RSb3cxMH0sIFtjckA2NF0sIGN3aWR0aAotICAgIFZTVDEgICAge3FSb3cxM30sIFtsdW1hQDEyOF0sIHdpZHRoCi0gICAgVlNUMSAgICB7ZFJvdzN9LCBbY2JANjRdLCBjd2lkdGgKLSAgICBWU1QxICAgIHtkUm93MTF9LCBbY3JANjRdLCBjd2lkdGgKLSAgICBWU1QxICAgIHtxUm93MTR9LCBbbHVtYUAxMjhdLCB3aWR0aAotICAgIFZTVDEgICAge2RSb3c0fSwgW2NiQDY0XSwgY3dpZHRoCi0gICAgVlNUMSAgICB7ZFJvdzEyfSwgW2NyQDY0XSwgY3dpZHRoCi0gICAgVlNUMSAgICB7cVJvdzE1fSwgW2x1bWFdCi0gICAgVlNUMSAgICB7ZFJvdzV9LCBbY2JANjRdLCBjd2lkdGgKLSAgICBWU1QxICAgIHtkUm93MTN9LCBbY3JANjRdLCBjd2lkdGgKLSAgICBWU1QxICAgIHtkUm93Nn0sIFtjYkA2NF0sIGN3aWR0aAotICAgIFZTVDEgICAge2RSb3cxNH0sIFtjckA2NF0sIGN3aWR0aAotICAgIFZTVDEgICAge2RSb3c3fSwgW2NiQDY0XQotICAgIFZTVDEgICAge2RSb3cxNX0sIFtjckA2NF0KLQotICAgIFZQT1AgICAge3E0LXE3fQotICAgIFBPUCAgICAge3I0LXI2LHBjfQotICAgIEVORAotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9hc21fY29tbW9uLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvYXNtX2NvbW1vbi5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjlhNzVjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9hc21fY29tbW9uLlMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1ACi1AIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci1ACi1AIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotQCB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1AIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotQAotQCAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotQAotQCBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1AIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1AIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotQCBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1AIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotQAotCi0KLQotCi0gICAgLm1hY3JvIFJFUVVJUkU4Ci0gICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCi0gICAgLmVuZG0KLQotICAgIC5tYWNybyBQUkVTRVJWRTgKLSAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKLSAgICAuZW5kbQotCi0KLSAgICAubWFjcm8gZnVuY3Rpb24gbmFtZSwgZXhwb3J0PTAKLS5pZiBcZXhwb3J0Ci0gICAgLmdsb2JhbCBcbmFtZQotLmVuZGlmCi0gICAgLnR5cGUgICBcbmFtZSwgJWZ1bmN0aW9uCi1cbmFtZToKLSAgICAuZW5kbQotCi0gICAgLm1hY3JvIGVuZGZ1bmN0aW9uCi0gICAgLmVuZG0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RDbGVhck1iTGF5ZXIuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkQ2xlYXJNYkxheWVyLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMjc1MmYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RDbGVhck1iTGF5ZXIuUworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLUAKLUAgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLUAKLUAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci1AIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLUAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1ACi1AICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi1ACi1AIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLUAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLUAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1AIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLUAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi1ACi0KLSNpbmNsdWRlICJhc21fY29tbW9uLlMiCi0KLSAgICBQUkVTRVJWRTgKLQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0KLS8qIElucHV0IC8gb3V0cHV0IHJlZ2lzdGVycyAqLwotI2RlZmluZSBwTWJMYXllciAgICByMAotI2RlZmluZSBzaXplICAgICAgICByMQotI2RlZmluZSBwVG1wICAgICAgICByMgotI2RlZmluZSBzdGVwICAgICAgICByMwotCi0vKiAtLSBORU9OIHJlZ2lzdGVycyAtLSAqLwotCi0jZGVmaW5lIHFaZXJvICAgUTAKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2xlYXJNYkxheWVyCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLQotICAgICAgICBJbnB1dHM6Ci0KLSAgICAgICAgT3V0cHV0czoKLQotICAgICAgICBSZXR1cm5zOgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1mdW5jdGlvbiBoMjY0YnNkQ2xlYXJNYkxheWVyLCBleHBvcnQ9MQotCi0gICAgVk1PVi5JOCBxWmVybywgIzAKLSAgICBBREQgICAgIHBUbXAsIHBNYkxheWVyLCAjMTYKLSAgICBNT1YgICAgIHN0ZXAsICMzMgotICAgIFNVQlMgICAgc2l6ZSwgc2l6ZSwgIzY0Ci0KLWxvb3A6Ci0gICAgVlNUMS44ICB7cVplcm99LCBbcE1iTGF5ZXJdLCBzdGVwCi0gICAgU1VCUyAgICBzaXplLCBzaXplLCAjNjQKLSAgICBWU1QxLjggIHtxWmVyb30sIFtwVG1wXSwgc3RlcAotICAgIFZTVDEuOCAge3FaZXJvfSwgW3BNYkxheWVyXSwgc3RlcAotICAgIFZTVDEuOCAge3FaZXJvfSwgW3BUbXBdLCBzdGVwCi0gICAgQkNTICAgICBsb29wCi0KLSAgICBCWCAgICAgIGxyCi0KLWVuZGZ1bmN0aW9uCi0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZENvdW50TGVhZGluZ1plcm9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZENvdW50TGVhZGluZ1plcm9zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYzlmNjAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RDb3VudExlYWRpbmdaZXJvcy5TCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotQAotQCBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotQAotQCBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLUAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotQCBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLUAKLUAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLUAKLUAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotQCBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotQCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLUAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotQCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLUAKLSNpbmNsdWRlICJhc21fY29tbW9uLlMiCi0KLSAgICBQUkVTRVJWRTgKLSAgICAuYXJtCi0gICAgLnRleHQKLQotCi0vKiBJbnB1dCAvIG91dHB1dCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgdmFsdWUgICAgcjAKLQotLyogLS0gTkVPTiByZWdpc3RlcnMgLS0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotCi0gICAgICAgIElucHV0czoKLQotICAgICAgICBPdXRwdXRzOgotCi0gICAgICAgIFJldHVybnM6Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWZ1bmN0aW9uIGgyNjRic2RDb3VudExlYWRpbmdaZXJvcywgZXhwb3J0PTEKLQotICAgIENMWiAgICAgdmFsdWUsIHZhbHVlCi0gICAgQlggICAgICBscgotCi1lbmRmdW5jdGlvbgotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZEZpbGxSb3c3LlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZEZpbGxSb3c3LlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZDYyMjcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RGaWxsUm93Ny5TCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLUAKLUAgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLUAKLUAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci1AIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLUAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1ACi1AICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi1ACi1AIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLUAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLUAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1AIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLUAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi1ACi0KLSNpbmNsdWRlICJhc21fY29tbW9uLlMiCi0KLSAgICBQUkVTRVJWRTgKLQotICAgIC5mcHUgbmVvbgotICAgIC50ZXh0Ci0KLS8qIElucHV0IC8gb3V0cHV0IHJlZ2lzdGVycyAqLwotCi0jZGVmaW5lIHJlZiAgICAgcjAKLSNkZWZpbmUgZmlsbCAgICByMQotI2RlZmluZSBsZWZ0ICAgIHIyCi0jZGVmaW5lIHRtcDIgICAgcjIKLSNkZWZpbmUgY2VudGVyICByMwotI2RlZmluZSByaWdodCAgIHI0Ci0jZGVmaW5lIHRtcDEgICAgcjUKLQotLyogLS0gTkVPTiByZWdpc3RlcnMgLS0gKi8KLQotI2RlZmluZSBxVG1wMCAgICAgUTAKLSNkZWZpbmUgcVRtcDEgICAgIFExCi0jZGVmaW5lIGRUbXAwICAgICBEMAotI2RlZmluZSBkVG1wMSAgICAgRDEKLSNkZWZpbmUgZFRtcDIgICAgIEQyCi0jZGVmaW5lIGRUbXAzICAgICBEMwotCi0vKgotdm9pZCBoMjY0YnNkRmlsbFJvdzcoY29uc3QgdTggKiByZWYsIHU4ICogZmlsbCwgaTMyIGxlZnQsIGkzMiBjZW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICBpMzIgcmlnaHQpOwotKi8KLQotZnVuY3Rpb24gaDI2NGJzZEZpbGxSb3c3LCBleHBvcnQ9MQotCi0gICAgICAgIFBVU0ggICAgIHtyNC1yNixscn0KLSAgICAgICAgQ01QICAgICAgbGVmdCwgIzAKLSAgICAgICAgTERSICAgICAgcmlnaHQsIFtzcCwjMHgxMF0KLSAgICAgICAgQkVRICAgICAgc3dpdGNoX2NlbnRlcgotICAgICAgICBMRFJCICAgICB0bXAxLCBbcmVmLCMwXQotCi1sb29wX2xlZnQ6Ci0gICAgICAgIFNVQlMgICAgIGxlZnQsIGxlZnQsICMxCi0gICAgICAgIFNUUkIgICAgIHRtcDEsIFtmaWxsXSwgIzEKLSAgICAgICAgQk5FICAgICAgbG9vcF9sZWZ0Ci0KLXN3aXRjaF9jZW50ZXI6Ci0gICAgICAgIEFTUiAgICAgIHRtcDIsY2VudGVyLCMyCi0gICAgICAgIENNUCAgICAgIHRtcDIsIzkKLSAgICAgICAgQUREQ0MgICAgcGMscGMsdG1wMixMU0wgIzIKLSAgICAgICAgQiAgICAgICAgbG9vcF9jZW50ZXIKLSAgICAgICAgQiAgICAgICAgbG9vcF9jZW50ZXIKLSAgICAgICAgQiAgICAgICAgY2FzZV8xCi0gICAgICAgIEIgICAgICAgIGNhc2VfMgotICAgICAgICBCICAgICAgICBjYXNlXzMKLSAgICAgICAgQiAgICAgICAgY2FzZV80Ci0gICAgICAgIEIgICAgICAgIGNhc2VfNQotICAgICAgICBCICAgICAgICBjYXNlXzYKLSAgICAgICAgQiAgICAgICAgY2FzZV83Ci0gICAgICAgIEIgICAgICAgIGNhc2VfOAotCi1jYXNlXzg6Ci0gICAgICAgIFZMRDEuOCAge3FUbXAwLCBxVG1wMX0sIFtyZWZdIQotICAgICAgICBTVUIgICAgIGNlbnRlciwgY2VudGVyLCAjMzIKLSAgICAgICAgVlNUMS44ICB7cVRtcDB9LCBbZmlsbF0hCi0gICAgICAgIFZTVDEuOCAge3FUbXAxfSwgW2ZpbGxdIQotICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCi1jYXNlXzc6Ci0gICAgICAgIFZMRDEuOCAge2RUbXAwLGRUbXAxLGRUbXAyfSwgW3JlZl0hCi0gICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMyOAotICAgICAgICBMRFIgICAgIHRtcDIsIFtyZWZdLCAjNAotICAgICAgICBWU1QxLjggIHtkVG1wMCxkVG1wMSxkVG1wMn0sIFtmaWxsXSEKLSAgICAgICAgU1RSICAgICB0bXAyLCBbZmlsbF0sIzQKLSAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgotY2FzZV82OgotICAgICAgICBWTEQxLjggIHtkVG1wMCxkVG1wMSxkVG1wMn0sIFtyZWZdIQotICAgICAgICBTVUIgICAgIGNlbnRlciwgY2VudGVyLCAjMjQKLSAgICAgICAgVlNUMS44ICB7ZFRtcDAsZFRtcDEsZFRtcDJ9LCBbZmlsbF0hCi0gICAgICAgIEIgICAgICAgbG9vcF9jZW50ZXIKLWNhc2VfNToKLSAgICAgICAgVkxEMS44ICB7cVRtcDB9LCBbcmVmXSEKLSAgICAgICAgU1VCICAgICBjZW50ZXIsIGNlbnRlciwgIzIwCi0gICAgICAgIExEUiAgICAgdG1wMiwgW3JlZl0sICM0Ci0gICAgICAgIFZTVDEuOCAge3FUbXAwfSwgW2ZpbGxdIQotICAgICAgICBTVFIgICAgIHRtcDIsIFtmaWxsXSwjNAotICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCi1jYXNlXzQ6Ci0gICAgICAgIFZMRDEuOCAge3FUbXAwfSwgW3JlZl0hCi0gICAgICAgIFNVQiAgICAgY2VudGVyLCBjZW50ZXIsICMxNgotICAgICAgICBWU1QxLjggIHtxVG1wMH0sIFtmaWxsXSEKLSAgICAgICAgQiAgICAgICBsb29wX2NlbnRlcgotY2FzZV8zOgotICAgICAgICBWTEQxLjggIHtkVG1wMH0sIFtyZWZdIQotICAgICAgICBTVUIgICAgIGNlbnRlciwgY2VudGVyLCAjMTIKLSAgICAgICAgTERSICAgICB0bXAyLCBbcmVmXSwgIzQKLSAgICAgICAgVlNUMS44ICBkVG1wMCwgW2ZpbGxdIQotICAgICAgICBTVFIgICAgIHRtcDIsIFtmaWxsXSwjNAotICAgICAgICBCICAgICAgIGxvb3BfY2VudGVyCi1jYXNlXzI6Ci0gICAgICAgIExEUiAgICAgIHRtcDIsIFtyZWZdLCM0Ci0gICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAotICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0Ci1jYXNlXzE6Ci0gICAgICAgIExEUiAgICAgIHRtcDIsIFtyZWZdLCM0Ci0gICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjNAotICAgICAgICBTVFIgICAgICB0bXAyLCBbZmlsbF0sICM0Ci0KLWxvb3BfY2VudGVyOgotICAgICAgICBDTVAgICAgICBjZW50ZXIsICMwCi0gICAgICAgIEJFUSAgICAgIGp1bXAKLSAgICAgICAgTERSQiAgICAgdG1wMiwgW3JlZl0sICMxCi0gICAgICAgIFNVQiAgICAgIGNlbnRlciwgY2VudGVyLCAjMQotICAgICAgICBTVFJCICAgICB0bXAyLCBbZmlsbF0sICMxCi0gICAgICAgIEJORSAgICAgIGxvb3BfY2VudGVyCi1qdW1wOgotICAgICAgICBDTVAgICAgICByaWdodCwjMAotICAgICAgICBQT1BFUSAgICB7cjQtcjYscGN9Ci0gICAgICAgIExEUkIgICAgIHRtcDIsIFtyZWYsIy0xXQotCi1sb29wX3JpZ2h0OgotICAgICAgICBTVFJCICAgICB0bXAyLCBbZmlsbF0sICMxCi0gICAgICAgIFNVQlMgICAgIHJpZ2h0LCByaWdodCwgIzEKLSAgICAgICAgQk5FICAgICAgbG9vcF9yaWdodAotCi0gICAgICAgIFBPUCAgICAgIHtyNC1yNixwY30KLQotZW5kZnVuY3Rpb24KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZEZsdXNoQml0cy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RGbHVzaEJpdHMuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4ODQ3MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZEZsdXNoQml0cy5TCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotQAotQCBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotQAotQCBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLUAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotQCBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLUAKLUAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLUAKLUAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotQCBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotQCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLUAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotQCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLUAKLQotI2luY2x1ZGUgImFzbV9jb21tb24uUyIKLQotICAgIFBSRVNFUlZFOAotCi0gICAgLmFybQotICAgIC50ZXh0Ci0KLS8qIElucHV0IC8gb3V0cHV0IHJlZ2lzdGVycyAqLwotI2RlZmluZSBwU3RybURhdGEgICAgICAgcjAKLSNkZWZpbmUgbnVtQml0cyAgICAgICAgIHIxCi0jZGVmaW5lIHJlYWRCaXRzICAgICAgICByMgotI2RlZmluZSBzdHJtQnVmZlNpemUgICAgcjMKLSNkZWZpbmUgcFN0cm1CdWZmU3RhcnQgIHIxCi0jZGVmaW5lIHBTdHJtQ3VyclBvcyAgICByMgotI2RlZmluZSBiaXRQb3NJbldvcmQgICAgcjEKLQotLyogSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzICovCi0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RGbHVzaEJpdHMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotCi0gICAgICAgIElucHV0czoKLQotICAgICAgICBPdXRwdXRzOgotCi0gICAgICAgIFJldHVybnM6Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1mdW5jdGlvbiBoMjY0YnNkRmx1c2hCaXRzLCBleHBvcnQ9MQotCi0gICAgTERSIHJlYWRCaXRzLCBbcFN0cm1EYXRhLCAjMHgxMF0KLSAgICBMRFIgc3RybUJ1ZmZTaXplLCBbcFN0cm1EYXRhLCAjMHhDXQotCi0gICAgQUREIHJlYWRCaXRzLCByZWFkQml0cywgbnVtQml0cwotICAgIEFORCBiaXRQb3NJbldvcmQsIHJlYWRCaXRzLCAjNwotCi0gICAgU1RSIHJlYWRCaXRzLCBbcFN0cm1EYXRhLCAjMHgxMF0KLSAgICBTVFIgYml0UG9zSW5Xb3JkLCBbcFN0cm1EYXRhLCAjMHg4XQotCi0gICAgTERSIHBTdHJtQnVmZlN0YXJ0LCBbcFN0cm1EYXRhLCAjMHgwXQotCi0gICAgQ01QIHJlYWRCaXRzLCBzdHJtQnVmZlNpemUsIExTTCAjMwotCi0gICAgQkhJIGVuZF9vZl9zdHJlYW0KLQotICAgIEFERCBwU3RybUN1cnJQb3MsIHBTdHJtQnVmZlN0YXJ0LCByZWFkQml0cywgTFNSICMzCi0gICAgU1RSIHBTdHJtQ3VyclBvcywgW3BTdHJtRGF0YSwgIzB4NF0KLSAgICBNT1YgcjAsICMwCi0gICAgQlggIGxyCi0KLWVuZF9vZl9zdHJlYW06Ci0gICAgTVZOIHIwLCAjMAotICAgIEJYICBscgotCi1lbmRmdW5jdGlvbgotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkV3JpdGVNYWNyb2Jsb2NrLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZFdyaXRlTWFjcm9ibG9jay5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDkzYjkyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkV3JpdGVNYWNyb2Jsb2NrLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotQAotQCBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotQAotQCBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLUAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotQCBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLUAKLUAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLUAKLUAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotQCBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotQCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLUAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotQCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLUAKLQotI2luY2x1ZGUgImFzbV9jb21tb24uUyIKLQotICAgIFJFUVVJUkU4Ci0gICAgUFJFU0VSVkU4Ci0KLSAgICAuYXJtCi0gICAgLmZwdSBuZW9uCi0gICAgLnRleHQKLQotLyogSW5wdXQgLyBvdXRwdXQgcmVnaXN0ZXJzICovCi0jZGVmaW5lIGltYWdlICAgcjAKLSNkZWZpbmUgZGF0YSAgICByMQotI2RlZmluZSB3aWR0aCAgIHIyCi0jZGVmaW5lIGx1bWEgICAgcjMKLSNkZWZpbmUgY2IgICAgICByNAotI2RlZmluZSBjciAgICAgIHI1Ci0jZGVmaW5lIGN3aWR0aCAgcjYKLQotLyogLS0gTkVPTiByZWdpc3RlcnMgLS0gKi8KLQotI2RlZmluZSBxUm93MCAgICAgUTAKLSNkZWZpbmUgcVJvdzEgICAgIFExCi0jZGVmaW5lIHFSb3cyICAgICBRMgotI2RlZmluZSBxUm93MyAgICAgUTMKLSNkZWZpbmUgcVJvdzQgICAgIFE0Ci0jZGVmaW5lIHFSb3c1ICAgICBRNQotI2RlZmluZSBxUm93NiAgICAgUTYKLSNkZWZpbmUgcVJvdzcgICAgIFE3Ci0jZGVmaW5lIHFSb3c4ICAgICBROAotI2RlZmluZSBxUm93OSAgICAgUTkKLSNkZWZpbmUgcVJvdzEwICAgIFExMAotI2RlZmluZSBxUm93MTEgICAgUTExCi0jZGVmaW5lIHFSb3cxMiAgICBRMTIKLSNkZWZpbmUgcVJvdzEzICAgIFExMwotI2RlZmluZSBxUm93MTQgICAgUTE0Ci0jZGVmaW5lIHFSb3cxNSAgICBRMTUKLQotI2RlZmluZSBkUm93MCAgICAgRDAKLSNkZWZpbmUgZFJvdzEgICAgIEQxCi0jZGVmaW5lIGRSb3cyICAgICBEMgotI2RlZmluZSBkUm93MyAgICAgRDMKLSNkZWZpbmUgZFJvdzQgICAgIEQ0Ci0jZGVmaW5lIGRSb3c1ICAgICBENQotI2RlZmluZSBkUm93NiAgICAgRDYKLSNkZWZpbmUgZFJvdzcgICAgIEQ3Ci0jZGVmaW5lIGRSb3c4ICAgICBEOAotI2RlZmluZSBkUm93OSAgICAgRDkKLSNkZWZpbmUgZFJvdzEwICAgIEQxMAotI2RlZmluZSBkUm93MTEgICAgRDExCi0jZGVmaW5lIGRSb3cxMiAgICBEMTIKLSNkZWZpbmUgZFJvdzEzICAgIEQxMwotI2RlZmluZSBkUm93MTQgICAgRDE0Ci0jZGVmaW5lIGRSb3cxNSAgICBEMTUKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFdyaXRlIG9uZSBtYWNyb2Jsb2NrIGludG8gdGhlIGltYWdlLiBCb3RoIGx1bWEgYW5kIGNocm9tYQotICAgICAgICAgICAgY29tcG9uZW50cyB3aWxsIGJlIHdyaXR0ZW4gYXQgdGhlIHNhbWUgdGltZS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBkYXRhICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBkYXRhIHRvIGJlIHdyaXR0ZW4sIDI1NiB2YWx1ZXMgZm9yCi0gICAgICAgICAgICAgICAgICAgIGx1bWEgZm9sbG93ZWQgYnkgNjQgdmFsdWVzIGZvciBib3RoIGNocm9tYSBjb21wb25lbnRzCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIGltYWdlICAgcG9pbnRlciB0byB0aGUgaW1hZ2Ugd2hlcmUgdGhlIG1hY3JvYmxvY2sgd2lsbCBiZSB3cml0dGVuCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotZnVuY3Rpb24gaDI2NGJzZFdyaXRlTWFjcm9ibG9jaywgZXhwb3J0PTEKLSAgICBQVVNIICAgIHtyNC1yNixscn0KLSAgICBWUFVTSCAgIHtxNC1xN30KLQotICAgIExEUiAgICAgd2lkdGgsIFtpbWFnZSwgIzRdCi0gICAgTERSICAgICBsdW1hLCBbaW1hZ2UsICMweENdCi0gICAgTERSICAgICBjYiwgW2ltYWdlLCAjMHgxMF0KLSAgICBMRFIgICAgIGNyLCBbaW1hZ2UsICMweDE0XQotCi0KLUAgICBXcml0ZSBsdW1hCi0gICAgVkxEMS44ICB7cVJvdzAsIHFSb3cxfSwgW2RhdGFdIQotICAgIExTTCAgICAgd2lkdGgsIHdpZHRoLCAjNAotICAgIFZMRDEuOCAge3FSb3cyLCBxUm93M30sIFtkYXRhXSEKLSAgICBMU1IgICAgIGN3aWR0aCwgd2lkdGgsICMxCi0gICAgVlNUMS44ICB7cVJvdzB9LCBbbHVtYSw6MTI4XSwgd2lkdGgKLSAgICBWTEQxLjggIHtxUm93NCwgcVJvdzV9LCBbZGF0YV0hCi0gICAgVlNUMS44ICB7cVJvdzF9LCBbbHVtYSw6MTI4XSwgd2lkdGgKLSAgICBWTEQxLjggIHtxUm93NiwgcVJvdzd9LCBbZGF0YV0hCi0gICAgVlNUMS44ICB7cVJvdzJ9LCBbbHVtYSw6MTI4XSwgd2lkdGgKLSAgICBWTEQxLjggIHtxUm93OCwgcVJvdzl9LCBbZGF0YV0hCi0gICAgVlNUMS44ICB7cVJvdzN9LCBbbHVtYSw6MTI4XSwgd2lkdGgKLSAgICBWTEQxLjggIHtxUm93MTAsIHFSb3cxMX0sIFtkYXRhXSEKLSAgICBWU1QxLjggIHtxUm93NH0sIFtsdW1hLDoxMjhdLCB3aWR0aAotICAgIFZMRDEuOCAge3FSb3cxMiwgcVJvdzEzfSwgW2RhdGFdIQotICAgIFZTVDEuOCAge3FSb3c1fSwgW2x1bWEsOjEyOF0sIHdpZHRoCi0gICAgVkxEMS44ICB7cVJvdzE0LCBxUm93MTV9LCBbZGF0YV0hCi0gICAgVlNUMS44ICB7cVJvdzZ9LCBbbHVtYSw6MTI4XSwgd2lkdGgKLQotICAgIFZMRDEuOCAge3FSb3cwLCBxUm93MX0sIFtkYXRhXSEgOy8vY2Igcm93cyAwLDEsMiwzCi0gICAgVlNUMS44ICB7cVJvdzd9LCBbbHVtYSw6MTI4XSwgd2lkdGgKLSAgICBWTEQxLjggIHtxUm93MiwgcVJvdzN9LCBbZGF0YV0hIDsvL2NiIHJvd3MgNCw1LDYsNwotICAgIFZTVDEuOCAge3FSb3c4fSwgW2x1bWEsOjEyOF0sIHdpZHRoCi0gICAgVkxEMS44ICB7cVJvdzQsIHFSb3c1fSwgW2RhdGFdISA7Ly9jciByb3dzIDAsMSwyLDMKLSAgICBWU1QxLjggIHtxUm93OX0sIFtsdW1hLDoxMjhdLCB3aWR0aAotICAgIFZMRDEuOCAge3FSb3c2LCBxUm93N30sIFtkYXRhXSEgOy8vY3Igcm93cyA0LDUsNiw3Ci0gICAgVlNUMS44ICB7cVJvdzEwfSwgW2x1bWEsOjEyOF0sIHdpZHRoCi0gICAgVlNUMS44ICB7ZFJvdzB9LCBbY2IsOjY0XSwgY3dpZHRoCi0gICAgVlNUMS44ICB7ZFJvdzh9LCBbY3IsOjY0XSwgY3dpZHRoCi0gICAgVlNUMS44ICB7cVJvdzExfSwgW2x1bWEsOjEyOF0sIHdpZHRoCi0gICAgVlNUMS44ICB7ZFJvdzF9LCBbY2IsOjY0XSwgY3dpZHRoCi0gICAgVlNUMS44ICB7ZFJvdzl9LCBbY3IsOjY0XSwgY3dpZHRoCi0gICAgVlNUMS44ICB7cVJvdzEyfSwgW2x1bWEsOjEyOF0sIHdpZHRoCi0gICAgVlNUMS44ICB7ZFJvdzJ9LCBbY2IsOjY0XSwgY3dpZHRoCi0gICAgVlNUMS44ICB7ZFJvdzEwfSwgW2NyLDo2NF0sIGN3aWR0aAotICAgIFZTVDEuOCAge3FSb3cxM30sIFtsdW1hLDoxMjhdLCB3aWR0aAotICAgIFZTVDEuOCAge2RSb3czfSwgW2NiLDo2NF0sIGN3aWR0aAotICAgIFZTVDEuOCAge2RSb3cxMX0sIFtjciw6NjRdLCBjd2lkdGgKLSAgICBWU1QxLjggIHtxUm93MTR9LCBbbHVtYSw6MTI4XSwgd2lkdGgKLSAgICBWU1QxLjggIHtkUm93NH0sIFtjYiw6NjRdLCBjd2lkdGgKLSAgICBWU1QxLjggIHtkUm93MTJ9LCBbY3IsOjY0XSwgY3dpZHRoCi0gICAgVlNUMS44ICB7cVJvdzE1fSwgW2x1bWFdCi0gICAgVlNUMS44ICB7ZFJvdzV9LCBbY2IsOjY0XSwgY3dpZHRoCi0gICAgVlNUMS44ICB7ZFJvdzEzfSwgW2NyLDo2NF0sIGN3aWR0aAotICAgIFZTVDEuOCAge2RSb3c2fSwgW2NiLDo2NF0sIGN3aWR0aAotICAgIFZTVDEuOCAge2RSb3cxNH0sIFtjciw6NjRdLCBjd2lkdGgKLSAgICBWU1QxLjggIHtkUm93N30sIFtjYiw6NjRdCi0gICAgVlNUMS44ICB7ZFJvdzE1fSwgW2NyLDo2NF0KLQotICAgIFZQT1AgICAge3E0LXE3fQotICAgIFBPUCAgICAge3I0LXI2LHBjfQotQCAgICBCWCAgICAgIGxyCi0KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9ieXRlX3N0cmVhbS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2J5dGVfc3RyZWFtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNzdmOGMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2J5dGVfc3RyZWFtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIEV4dHJhY3ROYWxVbml0Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF9ieXRlX3N0cmVhbS5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIEJZVEVfU1RSRUFNX0VSUk9SICAweEZGRkZGRkZGCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6IEV4dHJhY3ROYWxVbml0Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEV4dHJhY3RzIG9uZSBOQUwgdW5pdCBmcm9tIHRoZSBieXRlIHN0cmVhbSBidWZmZXIuIFJlbW92ZXMKLSAgICAgICAgICAgIGVtdWxhdGlvbiBwcmV2ZW50aW9uIGJ5dGVzIGlmIHByZXNlbnQuIFRoZSBvcmlnaW5hbCBzdHJlYW0gYnVmZmVyCi0gICAgICAgICAgICBpcyB1c2VkIGRpcmVjdGx5IGFuZCBpcyB0aGVyZWZvcmUgbW9kaWZpZWQgaWYgZW11bGF0aW9uIHByZXZlbnRpb24KLSAgICAgICAgICAgIGJ5dGVzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJlYW0uCi0KLSAgICAgICAgICAgIFN0cmVhbSBidWZmZXIgaXMgYXNzdW1lZCB0byBjb250YWluIGVpdGhlciBleGFjdGx5IG9uZSBOQUwgdW5pdAotICAgICAgICAgICAgYW5kIG5vdGhpbmcgZWxzZSwgb3Igb25lIG9yIG1vcmUgTkFMIHVuaXRzIGVtYmVkZGVkIGluIGJ5dGUKLSAgICAgICAgICAgIHN0cmVhbSBmb3JtYXQgZGVzY3JpYmVkIGluIHRoZSBBbm5leCBCIG9mIHRoZSBzdGFuZGFyZC4gRnVuY3Rpb24KLSAgICAgICAgICAgIGRldGVjdHMgd2hpY2ggb25lIGlzIHVzZWQgYmFzZWQgb24gdGhlIGZpcnN0IGJ5dGVzIGluIHRoZSBidWZmZXIuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcEJ5dGVTdHJlYW0gICAgIHBvaW50ZXIgdG8gYnl0ZSBzdHJlYW0gYnVmZmVyCi0gICAgICAgICAgICBsZW4gICAgICAgICAgICAgbGVuZ3RoIG9mIHRoZSBzdHJlYW0gYnVmZmVyIChpbiBieXRlcykKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHN0cmVhbSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaGVyZQotICAgICAgICAgICAgcmVhZEJ5dGVzICAgICAgIG51bWJlciBvZiBieXRlcyAiY29uc3VtZWQiIGZyb20gdGhlIHN0cmVhbSBidWZmZXIKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBlcnJvciBpbiBieXRlIHN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZEV4dHJhY3ROYWxVbml0KHU4ICpwQnl0ZVN0cmVhbSwgdTMyIGxlbiwgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICAgIHUzMiAqcmVhZEJ5dGVzKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLCB0bXA7Ci0gICAgdTMyIGJ5dGVDb3VudCxpbml0Qnl0ZUNvdW50OwotICAgIHUzMiB6ZXJvQ291bnQ7Ci0gICAgdTggIGJ5dGU7Ci0gICAgdTMyIGhhc0VtdWxhdGlvbiA9IEhBTlRST19GQUxTRTsKLSAgICB1MzIgaW52YWxpZFN0cmVhbSA9IEhBTlRST19GQUxTRTsKLSAgICB1OCAqcmVhZFB0ciwgKndyaXRlUHRyOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocEJ5dGVTdHJlYW0pOwotICAgIEFTU0VSVChsZW4pOwotICAgIEFTU0VSVChsZW4gPCBCWVRFX1NUUkVBTV9FUlJPUik7Ci0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0KLSAgICAvKiBieXRlIHN0cmVhbSBmb3JtYXQgaWYgc3RhcnRzIHdpdGggMHgwMDAwMDEgb3IgMHgwMDAwMDAgKi8KLSAgICBpZiAobGVuID4gMyAmJiBwQnl0ZVN0cmVhbVswXSA9PSAweDAwICYmIHBCeXRlU3RyZWFtWzFdID09IDB4MDAgJiYKLSAgICAgICAgKHBCeXRlU3RyZWFtWzJdJjB4RkUpID09IDB4MDApCi0gICAgewotICAgICAgICAvKiBzZWFyY2ggZm9yIE5BTCB1bml0IHN0YXJ0IHBvaW50LCBpLmUuIHBvaW50IGFmdGVyIGZpcnN0IHN0YXJ0IGNvZGUKLSAgICAgICAgICogcHJlZml4IGluIHRoZSBzdHJlYW0gKi8KLSAgICAgICAgemVyb0NvdW50ID0gYnl0ZUNvdW50ID0gMjsKLSAgICAgICAgcmVhZFB0ciA9IHBCeXRlU3RyZWFtICsgMjsKLSAgICAgICAgLypsaW50IC1lKDcxNikgd2hpbGUoMSkgdXNlZCBjb25zY2lvdXNseSAqLwotICAgICAgICB3aGlsZSAoMSkKLSAgICAgICAgewotICAgICAgICAgICAgYnl0ZSA9ICpyZWFkUHRyKys7Ci0gICAgICAgICAgICBieXRlQ291bnQrKzsKLQotICAgICAgICAgICAgaWYgKGJ5dGVDb3VudCA9PSBsZW4pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogbm8gc3RhcnQgY29kZSBwcmVmaXggZm91bmQgLT4gZXJyb3IgKi8KLSAgICAgICAgICAgICAgICAqcmVhZEJ5dGVzID0gbGVuOwotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFieXRlKQotICAgICAgICAgICAgICAgIHplcm9Db3VudCsrOwotICAgICAgICAgICAgZWxzZSBpZiAoKGJ5dGUgPT0gMHgwMSkgJiYgKHplcm9Db3VudCA+PSAyKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB6ZXJvQ291bnQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5pdEJ5dGVDb3VudCA9IGJ5dGVDb3VudDsKLQotICAgICAgICAvKiBkZXRlcm1pbmUgc2l6ZSBvZiB0aGUgTkFMIHVuaXQuIFNlYXJjaCBmb3IgbmV4dCBzdGFydCBjb2RlIHByZWZpeAotICAgICAgICAgKiBvciBlbmQgb2Ygc3RyZWFtIGFuZCBpZ25vcmUgcG9zc2libGUgdHJhaWxpbmcgemVybyBieXRlcyAqLwotICAgICAgICB6ZXJvQ291bnQgPSAwOwotICAgICAgICAvKmxpbnQgLWUoNzE2KSB3aGlsZSgxKSB1c2VkIGNvbnNjaW91c2x5ICovCi0gICAgICAgIHdoaWxlICgxKQotICAgICAgICB7Ci0gICAgICAgICAgICBieXRlID0gKnJlYWRQdHIrKzsKLSAgICAgICAgICAgIGJ5dGVDb3VudCsrOwotICAgICAgICAgICAgaWYgKCFieXRlKQotICAgICAgICAgICAgICAgIHplcm9Db3VudCsrOwotCi0gICAgICAgICAgICBpZiAoIChieXRlID09IDB4MDMpICYmICh6ZXJvQ291bnQgPT0gMikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGhhc0VtdWxhdGlvbiA9IEhBTlRST19UUlVFOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIChieXRlID09IDB4MDEpICYmICh6ZXJvQ291bnQgPj0gMiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCAtIGluaXRCeXRlQ291bnQgLSB6ZXJvQ291bnQgLSAxOwotICAgICAgICAgICAgICAgIHplcm9Db3VudCAtPSBNSU4oemVyb0NvdW50LCAzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGJ5dGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHplcm9Db3VudCA+PSAzKQotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkU3RyZWFtID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgICAgICAgICAgemVyb0NvdW50ID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGJ5dGVDb3VudCA9PSBsZW4pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFN0cm1EYXRhLT5zdHJtQnVmZlNpemUgPSBieXRlQ291bnQgLSBpbml0Qnl0ZUNvdW50IC0gemVyb0NvdW50OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogc2VwYXJhdGUgTkFMIHVuaXRzIGFzIGlucHV0IC0+IGp1c3Qgc2V0IHN0cmVhbSBwYXJhbXMgKi8KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpbml0Qnl0ZUNvdW50ID0gMDsKLSAgICAgICAgemVyb0NvdW50ID0gMDsKLSAgICAgICAgcFN0cm1EYXRhLT5zdHJtQnVmZlNpemUgPSBsZW47Ci0gICAgICAgIGhhc0VtdWxhdGlvbiA9IEhBTlRST19UUlVFOwotICAgIH0KLQotICAgIHBTdHJtRGF0YS0+cFN0cm1CdWZmU3RhcnQgICAgPSBwQnl0ZVN0cmVhbSArIGluaXRCeXRlQ291bnQ7Ci0gICAgcFN0cm1EYXRhLT5wU3RybUN1cnJQb3MgICAgICA9IHBTdHJtRGF0YS0+cFN0cm1CdWZmU3RhcnQ7Ci0gICAgcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQgICAgICA9IDA7Ci0gICAgcFN0cm1EYXRhLT5zdHJtQnVmZlJlYWRCaXRzICA9IDA7Ci0KLSAgICAvKiByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzICJjb25zdW1lZCIgKi8KLSAgICAqcmVhZEJ5dGVzID0gcFN0cm1EYXRhLT5zdHJtQnVmZlNpemUgKyBpbml0Qnl0ZUNvdW50ICsgemVyb0NvdW50OwotCi0gICAgaWYgKGludmFsaWRTdHJlYW0pCi0gICAgewotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgLyogcmVtb3ZlIGVtdWxhdGlvbiBwcmV2ZW50aW9uIGJ5dGVzIGJlZm9yZSByYnNwIHByb2Nlc3NpbmcgKi8KLSAgICBpZiAoaGFzRW11bGF0aW9uKQotICAgIHsKLSAgICAgICAgdG1wID0gcFN0cm1EYXRhLT5zdHJtQnVmZlNpemU7Ci0gICAgICAgIHJlYWRQdHIgPSB3cml0ZVB0ciA9IHBTdHJtRGF0YS0+cFN0cm1CdWZmU3RhcnQ7Ci0gICAgICAgIHplcm9Db3VudCA9IDA7Ci0gICAgICAgIGZvciAoaSA9IHRtcDsgaS0tOykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCh6ZXJvQ291bnQgPT0gMikgJiYgKCpyZWFkUHRyID09IDB4MDMpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGVtdWxhdGlvbiBwcmV2ZW50aW9uIGJ5dGUgc2hhbGwgYmUgZm9sbG93ZWQgYnkgb25lIG9mIHRoZQotICAgICAgICAgICAgICAgICAqIGZvbGxvd2luZyBieXRlczogMHgwMCwgMHgwMSwgMHgwMiwgMHgwMy4gVGhpcyBpbXBsaWVzIHRoYXQKLSAgICAgICAgICAgICAgICAgKiBlbXVsYXRpb24gcHJldmVudGlvbiAweDAzIGJ5dGUgc2hhbGwgbm90IGJlIHRoZSBsYXN0IGJ5dGUKLSAgICAgICAgICAgICAgICAgKiBvZiB0aGUgc3RyZWFtLiAqLwotICAgICAgICAgICAgICAgIGlmICggKGkgPT0gMCkgfHwgKCoocmVhZFB0cisxKSA+IDB4MDMpICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgICAgICAgICAgICAgLyogZG8gbm90IHdyaXRlIGVtdWxhdGlvbiBwcmV2ZW50aW9uIGJ5dGUgKi8KLSAgICAgICAgICAgICAgICByZWFkUHRyKys7Ci0gICAgICAgICAgICAgICAgemVyb0NvdW50ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBOQUwgdW5pdCBzaGFsbCBub3QgY29udGFpbiBieXRlIHNlcXVlbmNlcyAweDAwMDAwMCwKLSAgICAgICAgICAgICAgICAgKiAweDAwMDAwMSBvciAweDAwMDAwMiAqLwotICAgICAgICAgICAgICAgIGlmICggKHplcm9Db3VudCA9PSAyKSAmJiAoKnJlYWRQdHIgPD0gMHgwMikgKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKnJlYWRQdHIgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgemVyb0NvdW50Kys7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB6ZXJvQ291bnQgPSAwOwotCi0gICAgICAgICAgICAgICAgKndyaXRlUHRyKysgPSAqcmVhZFB0cisrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogKHJlYWRQdHIgLSB3cml0ZVB0cikgaW5kaWNhdGVzIG51bWJlciBvZiAicmVtb3ZlZCIgZW11bGF0aW9uCi0gICAgICAgICAqIHByZXZlbnRpb24gYnl0ZXMgLT4gc3VidHJhY3QgZnJvbSBzdHJlYW0gYnVmZmVyIHNpemUgKi8KLSAgICAgICAgcFN0cm1EYXRhLT5zdHJtQnVmZlNpemUgLT0gKHUzMikocmVhZFB0ciAtIHdyaXRlUHRyKTsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfYnl0ZV9zdHJlYW0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9ieXRlX3N0cmVhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmFlYzc2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9ieXRlX3N0cmVhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19CWVRFX1NUUkVBTV9ICi0jZGVmaW5lIEgyNjRTV0RFQ19CWVRFX1NUUkVBTV9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RFeHRyYWN0TmFsVW5pdCh1OCAqcEJ5dGVTdHJlYW0sIHUzMiBsZW4sIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgICB1MzIgKnJlYWRCeXRlcyk7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX0JZVEVfU1RSRUFNX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NhdmxjLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY2F2bGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIyZDdiYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY2F2bGMuYworKysgL2Rldi9udWxsCkBAIC0xLDkxNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgRGVjb2RlQ29lZmZUb2tlbgotICAgICAgICAgIERlY29kZUxldmVsUHJlZml4Ci0gICAgICAgICAgRGVjb2RlVG90YWxaZXJvcwotICAgICAgICAgIERlY29kZVJ1bkJlZm9yZQotICAgICAgICAgIERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImgyNjRic2RfY2F2bGMuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogRm9sbG93aW5nIGRlc2NyaXB0aW9ucyB1c2UgdGVybSAiaW5mb3JtYXRpb24gZmllbGQiIHRvIHJlcHJlc2VudCBjb21iaW5hdGlvbgotICogb2YgY2VydGFpbiBkZWNvZGVkIHN5bWJvbCB2YWx1ZSBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgY29ycmVzcG9uZGluZyB2YXJpYWJsZQotICogbGVuZ3RoIGNvZGUgd29yZC4gRm9yIGV4YW1wbGUsIHRvdGFsX3plcm9zIGluZm9ybWF0aW9uIGZpZWxkIGNvbnNpc3RzIG9mCi0gKiA0IGJpdHMgc3ltYm9sIHZhbHVlIChiaXRzIFs0LDddKSBhbG9uZyB3aXRoIGZvdXIgYml0cyB0byByZXByZXNlbnQgbGVuZ3RoCi0gKiBvZiB0aGUgVkxDIGNvZGUgd29yZCAoYml0cyBbMCwzXSkgKi8KLQotLyogbWFjcm8gdG8gb2J0YWluIGxlbmd0aCBvZiB0aGUgY29lZmYgdG9rZW4gaW5mb3JtYXRpb24gZmllbGQsIGJpdHMgWzAsNF0gICovCi0jZGVmaW5lIExFTkdUSF9UQyh2bGMpICgodmxjKSAmIDB4MUYpCi0vKiBtYWNybyB0byBvYnRhaW4gbGVuZ3RoIG9mIHRoZSBvdGhlciBpbmZvcm1hdGlvbiBmaWVsZHMsIGJpdHMgWzAsM10gKi8KLSNkZWZpbmUgTEVOR1RIKHZsYykgKCh2bGMpICYgMHhGKQotLyogbWFjcm8gdG8gb2J0YWluIGNvZGUgd29yZCBmcm9tIHRoZSBpbmZvcm1hdGlvbiBmaWVsZHMsIGJpdHMgWzQsN10gKi8KLSNkZWZpbmUgSU5GTyh2bGMpICgoKHZsYykgPj4gNCkgJiAweEYpICAvKiA0IE1TQiBiaXRzIGNvbnRhaW4gaW5mb3JtYXRpb24gKi8KLS8qIG1hY3JvIHRvIG9idGFpbiB0cmFpbGluZyBvbmVzIGZyb20gdGhlIGNvZWZmIHRva2VuIGluZm9ybWF0aW9uIHdvcmQsCi0gKiBiaXRzIFs1LDEwXSAqLwotI2RlZmluZSBUUkFJTElOR19PTkVTKGNvZWZmVG9rZW4pICgoKGNvZWZmVG9rZW4pPj41KSAmIDB4M0YpCi0vKiBtYWNybyB0byBvYnRhaW4gdG90YWwgY29lZmYgZnJvbSB0aGUgY29lZmYgdG9rZW4gaW5mb3JtYXRpb24gd29yZCwKLSAqIGJpdHMgWzExLDE1XSAqLwotI2RlZmluZSBUT1RBTF9DT0VGRihjb2VmZlRva2VuKSAoKChjb2VmZlRva2VuKSA+PiAxMSkgJiAweDFGKQotCi0jZGVmaW5lIFZMQ19OT1RfRk9VTkQgMHhGRkZGRkZGRVUKLQotLyogVkxDIHRhYmxlcyBmb3IgY29lZmZfdG9rZW4uIEJlY2F1c2Ugb2YgbG9uZyBjb2RlcyAobWF4LiAxNiBiaXRzKSBzb21lIG9mIHRoZQotICogdGFibGVzIGhhdmUgYmVlbiBzcGxpdHRlZCBpbnRvIG11bHRpcGxlIHNlcGFyYXRlIHRhYmxlcy4gRWFjaCBhcnJheS90YWJsZQotICogZWxlbWVudCBoYXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6Ci0gKiBbNSBiaXRzIGZvciB0b3QuY29lZmYuXSBbNiBiaXRzIGZvciB0ci5vbmVzXSBbNSBiaXRzIGZvciBWTEMgbGVuZ3RoXQotICogSWYgdGhlcmUgaXMgYSAweDAwMDAgdmFsdWUsIGl0IG1lYW5zIHRoYXQgdGhlcmUgaXMgbm90IGNvcnJlc3BvbmRpbmcgVkxDCi0gKiBjb2Rld29yZCBmb3IgdGhhdCBpbmRleC4gKi8KLQotLyogVkxDIGxlbmd0aHMgdXAgdG8gNiBiaXRzLCAwIDw9IG5DIDwgMiAqLwotc3RhdGljIGNvbnN0IHUxNiBjb2VmZlRva2VuMF8wWzMyXSA9IHsKLSAgICAweDAwMDAsMHgwMDAwLDB4MDAwMCwweDIwNjYsMHgxMDI2LDB4MDgwNiwweDE4NjUsMHgxODY1LAotICAgIDB4MTA0MywweDEwNDMsMHgxMDQzLDB4MTA0MywweDEwNDMsMHgxMDQzLDB4MTA0MywweDEwNDMsCi0gICAgMHgwODIyLDB4MDgyMiwweDA4MjIsMHgwODIyLDB4MDgyMiwweDA4MjIsMHgwODIyLDB4MDgyMiwKLSAgICAweDA4MjIsMHgwODIyLDB4MDgyMiwweDA4MjIsMHgwODIyLDB4MDgyMiwweDA4MjIsMHgwODIyfTsKLQotLyogVkxDIGxlbmd0aHMgdXAgdG8gMTAgYml0cywgMCA8PSBuQyA8IDIgKi8KLXN0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbjBfMVs0OF0gPSB7Ci0gICAgMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4NDA2YSwweDMwNGEsMHgyODJhLDB4MjAwYSwKLSAgICAweDM4NjksMHgzODY5LDB4Mjg0OSwweDI4NDksMHgyMDI5LDB4MjAyOSwweDE4MDksMHgxODA5LAotICAgIDB4MzA2OCwweDMwNjgsMHgzMDY4LDB4MzA2OCwweDIwNDgsMHgyMDQ4LDB4MjA0OCwweDIwNDgsCi0gICAgMHgxODI4LDB4MTgyOCwweDE4MjgsMHgxODI4LDB4MTAwOCwweDEwMDgsMHgxMDA4LDB4MTAwOCwKLSAgICAweDI4NjcsMHgyODY3LDB4Mjg2NywweDI4NjcsMHgyODY3LDB4Mjg2NywweDI4NjcsMHgyODY3LAotICAgIDB4MTg0NywweDE4NDcsMHgxODQ3LDB4MTg0NywweDE4NDcsMHgxODQ3LDB4MTg0NywweDE4NDd9OwotCi0vKiBWTEMgbGVuZ3RocyB1cCB0byAxNCBiaXRzLCAwIDw9IG5DIDwgMiAqLwotc3RhdGljIGNvbnN0IHUxNiBjb2VmZlRva2VuMF8yWzU2XSA9IHsKLSAgICAweDYwNmUsMHg1ODRlLDB4NTAyZSwweDUwMGUsMHg1ODZlLDB4NTA0ZSwweDQ4MmUsMHg0ODBlLAotICAgIDB4NDAwZCwweDQwMGQsMHg0ODRkLDB4NDg0ZCwweDQwMmQsMHg0MDJkLDB4MzgwZCwweDM4MGQsCi0gICAgMHg1MDZkLDB4NTA2ZCwweDQwNGQsMHg0MDRkLDB4MzgyZCwweDM4MmQsMHgzMDBkLDB4MzAwZCwKLSAgICAweDQ4NmIsMHg0ODZiLDB4NDg2YiwweDQ4NmIsMHg0ODZiLDB4NDg2YiwweDQ4NmIsMHg0ODZiLAotICAgIDB4Mzg0YiwweDM4NGIsMHgzODRiLDB4Mzg0YiwweDM4NGIsMHgzODRiLDB4Mzg0YiwweDM4NGIsCi0gICAgMHgzMDJiLDB4MzAyYiwweDMwMmIsMHgzMDJiLDB4MzAyYiwweDMwMmIsMHgzMDJiLDB4MzAyYiwKLSAgICAweDI4MGIsMHgyODBiLDB4MjgwYiwweDI4MGIsMHgyODBiLDB4MjgwYiwweDI4MGIsMHgyODBifTsKLQotLyogVkxDIGxlbmd0aHMgdXAgdG8gMTYgYml0cywgMCA8PSBuQyA8IDIgKi8KLXN0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbjBfM1szMl0gPSB7Ci0gICAgMHgwMDAwLDB4MDAwMCwweDY4MmYsMHg2ODJmLDB4ODAxMCwweDgwNTAsMHg4MDMwLDB4NzgxMCwKLSAgICAweDgwNzAsMHg3ODUwLDB4NzgzMCwweDcwMTAsMHg3ODcwLDB4NzA1MCwweDcwMzAsMHg2ODEwLAotICAgIDB4NzA2ZiwweDcwNmYsMHg2ODRmLDB4Njg0ZiwweDYwMmYsMHg2MDJmLDB4NjAwZiwweDYwMGYsCi0gICAgMHg2ODZmLDB4Njg2ZiwweDYwNGYsMHg2MDRmLDB4NTgyZiwweDU4MmYsMHg1ODBmLDB4NTgwZn07Ci0KLS8qIFZMQyBsZW5ndGhzIHVwIHRvIDYgYml0cywgMiA8PSBuQyA8IDQgKi8KLXN0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbjJfMFszMl0gPSB7Ci0gICAgMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4Mzg2NiwweDIwNDYsMHgyMDI2LDB4MTAwNiwKLSAgICAweDMwNjYsMHgxODQ2LDB4MTgyNiwweDA4MDYsMHgyODY1LDB4Mjg2NSwweDEwMjUsMHgxMDI1LAotICAgIDB4MjA2NCwweDIwNjQsMHgyMDY0LDB4MjA2NCwweDE4NjQsMHgxODY0LDB4MTg2NCwweDE4NjQsCi0gICAgMHgxMDQzLDB4MTA0MywweDEwNDMsMHgxMDQzLDB4MTA0MywweDEwNDMsMHgxMDQzLDB4MTA0M307Ci0KLS8qIFZMQyBsZW5ndGhzIHVwIHRvIDkgYml0cywgMiA8PSBuQyA8IDQgKi8KLXN0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbjJfMVszMl0gPSB7Ci0gICAgMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4NDg2OSwweDM4NDksMHgzODI5LDB4MzAwOSwKLSAgICAweDI4MDgsMHgyODA4LDB4MzA0OCwweDMwNDgsMHgzMDI4LDB4MzAyOCwweDIwMDgsMHgyMDA4LAotICAgIDB4NDA2NywweDQwNjcsMHg0MDY3LDB4NDA2NywweDI4NDcsMHgyODQ3LDB4Mjg0NywweDI4NDcsCi0gICAgMHgyODI3LDB4MjgyNywweDI4MjcsMHgyODI3LDB4MTgwNywweDE4MDcsMHgxODA3LDB4MTgwN307Ci0KLS8qIFZMQyBsZW5ndGhzIHVwIHRvIDE0IGJpdHMsIDIgPD0gbkMgPCA0ICovCi1zdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW4yXzJbMTI4XSA9IHsKLSAgICAweDAwMDAsMHgwMDAwLDB4Nzg2ZCwweDc4NmQsMHg4MDZlLDB4ODA0ZSwweDgwMmUsMHg4MDBlLAotICAgIDB4NzgyZSwweDc4MGUsMHg3ODRlLDB4NzAyZSwweDcwNGQsMHg3MDRkLDB4NzAwZCwweDcwMGQsCi0gICAgMHg3MDZkLDB4NzA2ZCwweDY4NGQsMHg2ODRkLDB4NjgyZCwweDY4MmQsMHg2ODBkLDB4NjgwZCwKLSAgICAweDY4NmQsMHg2ODZkLDB4NjA0ZCwweDYwNGQsMHg2MDJkLDB4NjAyZCwweDYwMGQsMHg2MDBkLAotICAgIDB4NTgwYywweDU4MGMsMHg1ODBjLDB4NTgwYywweDU4NGMsMHg1ODRjLDB4NTg0YywweDU4NGMsCi0gICAgMHg1ODJjLDB4NTgyYywweDU4MmMsMHg1ODJjLDB4NTAwYywweDUwMGMsMHg1MDBjLDB4NTAwYywKLSAgICAweDYwNmMsMHg2MDZjLDB4NjA2YywweDYwNmMsMHg1MDRjLDB4NTA0YywweDUwNGMsMHg1MDRjLAotICAgIDB4NTAyYywweDUwMmMsMHg1MDJjLDB4NTAyYywweDQ4MGMsMHg0ODBjLDB4NDgwYywweDQ4MGMsCi0gICAgMHg1ODZiLDB4NTg2YiwweDU4NmIsMHg1ODZiLDB4NTg2YiwweDU4NmIsMHg1ODZiLDB4NTg2YiwKLSAgICAweDQ4NGIsMHg0ODRiLDB4NDg0YiwweDQ4NGIsMHg0ODRiLDB4NDg0YiwweDQ4NGIsMHg0ODRiLAotICAgIDB4NDgyYiwweDQ4MmIsMHg0ODJiLDB4NDgyYiwweDQ4MmIsMHg0ODJiLDB4NDgyYiwweDQ4MmIsCi0gICAgMHg0MDBiLDB4NDAwYiwweDQwMGIsMHg0MDBiLDB4NDAwYiwweDQwMGIsMHg0MDBiLDB4NDAwYiwKLSAgICAweDUwNmIsMHg1MDZiLDB4NTA2YiwweDUwNmIsMHg1MDZiLDB4NTA2YiwweDUwNmIsMHg1MDZiLAotICAgIDB4NDA0YiwweDQwNGIsMHg0MDRiLDB4NDA0YiwweDQwNGIsMHg0MDRiLDB4NDA0YiwweDQwNGIsCi0gICAgMHg0MDJiLDB4NDAyYiwweDQwMmIsMHg0MDJiLDB4NDAyYiwweDQwMmIsMHg0MDJiLDB4NDAyYiwKLSAgICAweDM4MGIsMHgzODBiLDB4MzgwYiwweDM4MGIsMHgzODBiLDB4MzgwYiwweDM4MGIsMHgzODBifTsKLQotLyogVkxDIGxlbmd0aHMgdXAgdG8gNiBiaXRzLCA0IDw9IG5DIDwgOCAqLwotc3RhdGljIGNvbnN0IHUxNiBjb2VmZlRva2VuNF8wWzY0XSA9IHsKLSAgICAweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLAotICAgIDB4MTgwNiwweDM4NDYsMHgzODI2LDB4MTAwNiwweDQ4NjYsMHgzMDQ2LDB4MzAyNiwweDA4MDYsCi0gICAgMHgyODI1LDB4MjgyNSwweDI4NDUsMHgyODQ1LDB4MjAyNSwweDIwMjUsMHgyMDQ1LDB4MjA0NSwKLSAgICAweDE4MjUsMHgxODI1LDB4NDA2NSwweDQwNjUsMHgxODQ1LDB4MTg0NSwweDEwMjUsMHgxMDI1LAotICAgIDB4Mzg2NCwweDM4NjQsMHgzODY0LDB4Mzg2NCwweDMwNjQsMHgzMDY0LDB4MzA2NCwweDMwNjQsCi0gICAgMHgyODY0LDB4Mjg2NCwweDI4NjQsMHgyODY0LDB4MjA2NCwweDIwNjQsMHgyMDY0LDB4MjA2NCwKLSAgICAweDE4NjQsMHgxODY0LDB4MTg2NCwweDE4NjQsMHgxMDQ0LDB4MTA0NCwweDEwNDQsMHgxMDQ0LAotICAgIDB4MDgyNCwweDA4MjQsMHgwODI0LDB4MDgyNCwweDAwMDQsMHgwMDA0LDB4MDAwNCwweDAwMDR9OwotCi0vKiBWTEMgbGVuZ3RocyB1cCB0byAxMCBiaXRzLCA0IDw9IG5DIDwgOCAqLwotc3RhdGljIGNvbnN0IHUxNiBjb2VmZlRva2VuNF8xWzEyOF0gPSB7Ci0gICAgMHgwMDAwLDB4ODAwYSwweDgwNmEsMHg4MDRhLDB4ODAyYSwweDc4MGEsMHg3ODZhLDB4Nzg0YSwKLSAgICAweDc4MmEsMHg3MDBhLDB4NzA2YSwweDcwNGEsMHg3MDJhLDB4NjgwYSwweDY4MjksMHg2ODI5LAotICAgIDB4NjAwOSwweDYwMDksMHg2ODQ5LDB4Njg0OSwweDYwMjksMHg2MDI5LDB4NTgwOSwweDU4MDksCi0gICAgMHg2ODY5LDB4Njg2OSwweDYwNDksMHg2MDQ5LDB4NTgyOSwweDU4MjksMHg1MDA5LDB4NTAwOSwKLSAgICAweDYwNjgsMHg2MDY4LDB4NjA2OCwweDYwNjgsMHg1ODQ4LDB4NTg0OCwweDU4NDgsMHg1ODQ4LAotICAgIDB4NTAyOCwweDUwMjgsMHg1MDI4LDB4NTAyOCwweDQ4MDgsMHg0ODA4LDB4NDgwOCwweDQ4MDgsCi0gICAgMHg1ODY4LDB4NTg2OCwweDU4NjgsMHg1ODY4LDB4NTA0OCwweDUwNDgsMHg1MDQ4LDB4NTA0OCwKLSAgICAweDQ4MjgsMHg0ODI4LDB4NDgyOCwweDQ4MjgsMHg0MDA4LDB4NDAwOCwweDQwMDgsMHg0MDA4LAotICAgIDB4MzgwNywweDM4MDcsMHgzODA3LDB4MzgwNywweDM4MDcsMHgzODA3LDB4MzgwNywweDM4MDcsCi0gICAgMHgzMDA3LDB4MzAwNywweDMwMDcsMHgzMDA3LDB4MzAwNywweDMwMDcsMHgzMDA3LDB4MzAwNywKLSAgICAweDQ4NDcsMHg0ODQ3LDB4NDg0NywweDQ4NDcsMHg0ODQ3LDB4NDg0NywweDQ4NDcsMHg0ODQ3LAotICAgIDB4MjgwNywweDI4MDcsMHgyODA3LDB4MjgwNywweDI4MDcsMHgyODA3LDB4MjgwNywweDI4MDcsCi0gICAgMHg1MDY3LDB4NTA2NywweDUwNjcsMHg1MDY3LDB4NTA2NywweDUwNjcsMHg1MDY3LDB4NTA2NywKLSAgICAweDQwNDcsMHg0MDQ3LDB4NDA0NywweDQwNDcsMHg0MDQ3LDB4NDA0NywweDQwNDcsMHg0MDQ3LAotICAgIDB4NDAyNywweDQwMjcsMHg0MDI3LDB4NDAyNywweDQwMjcsMHg0MDI3LDB4NDAyNywweDQwMjcsCi0gICAgMHgyMDA3LDB4MjAwNywweDIwMDcsMHgyMDA3LDB4MjAwNywweDIwMDcsMHgyMDA3LDB4MjAwN307Ci0KLS8qIGZpeGVkIDYgYml0IGxlbmd0aCBWTEMsIG5DIDw9IDggKi8KLXN0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbjhbNjRdID0gewotICAgIDB4MDgwNiwweDA4MjYsMHgwMDAwLDB4MDAwNiwweDEwMDYsMHgxMDI2LDB4MTA0NiwweDAwMDAsCi0gICAgMHgxODA2LDB4MTgyNiwweDE4NDYsMHgxODY2LDB4MjAwNiwweDIwMjYsMHgyMDQ2LDB4MjA2NiwKLSAgICAweDI4MDYsMHgyODI2LDB4Mjg0NiwweDI4NjYsMHgzMDA2LDB4MzAyNiwweDMwNDYsMHgzMDY2LAotICAgIDB4MzgwNiwweDM4MjYsMHgzODQ2LDB4Mzg2NiwweDQwMDYsMHg0MDI2LDB4NDA0NiwweDQwNjYsCi0gICAgMHg0ODA2LDB4NDgyNiwweDQ4NDYsMHg0ODY2LDB4NTAwNiwweDUwMjYsMHg1MDQ2LDB4NTA2NiwKLSAgICAweDU4MDYsMHg1ODI2LDB4NTg0NiwweDU4NjYsMHg2MDA2LDB4NjAyNiwweDYwNDYsMHg2MDY2LAotICAgIDB4NjgwNiwweDY4MjYsMHg2ODQ2LDB4Njg2NiwweDcwMDYsMHg3MDI2LDB4NzA0NiwweDcwNjYsCi0gICAgMHg3ODA2LDB4NzgyNiwweDc4NDYsMHg3ODY2LDB4ODAwNiwweDgwMjYsMHg4MDQ2LDB4ODA2Nn07Ci0KLS8qIFZMQyBsZW5ndGhzIHVwIHRvIDMgYml0cywgbkMgPT0gLTEgKi8KLXN0YXRpYyBjb25zdCB1MTYgY29lZmZUb2tlbk1pbnVzMV8wWzhdID0gewotICAgIDB4MDAwMCwweDEwNDMsMHgwMDAyLDB4MDAwMiwweDA4MjEsMHgwODIxLDB4MDgyMSwweDA4MjF9OwotCi0vKiBWTEMgbGVuZ3RocyB1cCB0byA4IGJpdHMsIG5DID09IC0xICovCi1zdGF0aWMgY29uc3QgdTE2IGNvZWZmVG9rZW5NaW51czFfMVszMl0gPSB7Ci0gICAgMHgyMDY3LDB4MjA2NywweDIwNDgsMHgyMDI4LDB4MTg0NywweDE4NDcsMHgxODI3LDB4MTgyNywKLSAgICAweDIwMDYsMHgyMDA2LDB4MjAwNiwweDIwMDYsMHgxODA2LDB4MTgwNiwweDE4MDYsMHgxODA2LAotICAgIDB4MTAwNiwweDEwMDYsMHgxMDA2LDB4MTAwNiwweDE4NjYsMHgxODY2LDB4MTg2NiwweDE4NjYsCi0gICAgMHgxMDI2LDB4MTAyNiwweDEwMjYsMHgxMDI2LDB4MDgwNiwweDA4MDYsMHgwODA2LDB4MDgwNn07Ci0KLS8qIFZMQyB0YWJsZXMgZm9yIHRvdGFsX3plcm9zLiBPbmUgdGFibGUgY29udGFpbmluZyBsb25nZXIgY29kZSwgdG90YWxaZXJvc18xLAotICogaGFzIGJlZW4gYnJva2VuIGludG8gdHdvIHNlcGFyYXRlIHRhYmxlcy4gVGFibGUgZWxlbWVudHMgaGF2ZSB0aGUKLSAqIGZvbGxvd2luZyBzdHJ1Y3R1cmU6Ci0gKiBbNCBiaXRzIGZvciBpbmZvXSBbNCBiaXRzIGZvciBWTEMgbGVuZ3RoXSAqLwotCi0vKiBWTEMgbGVuZ3RocyB1cCB0byA1IGJpdHMgKi8KLXN0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzFfMFszMl0gPSB7Ci0gICAgMHgwMCwweDAwLDB4NjUsMHg1NSwweDQ0LDB4NDQsMHgzNCwweDM0LAotICAgIDB4MjMsMHgyMywweDIzLDB4MjMsMHgxMywweDEzLDB4MTMsMHgxMywKLSAgICAweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsCi0gICAgMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxfTsKLQotLyogVkxDIGxlbmd0aHMgdXAgdG8gOSBiaXRzICovCi1zdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc18xXzFbMzJdID0gewotICAgIDB4MDAsMHhmOSwweGU5LDB4ZDksMHhjOCwweGM4LDB4YjgsMHhiOCwKLSAgICAweGE3LDB4YTcsMHhhNywweGE3LDB4OTcsMHg5NywweDk3LDB4OTcsCi0gICAgMHg4NiwweDg2LDB4ODYsMHg4NiwweDg2LDB4ODYsMHg4NiwweDg2LAotICAgIDB4NzYsMHg3NiwweDc2LDB4NzYsMHg3NiwweDc2LDB4NzYsMHg3Nn07Ci0KLXN0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzJbNjRdID0gewotICAgIDB4ZTYsMHhkNiwweGM2LDB4YjYsMHhhNSwweGE1LDB4OTUsMHg5NSwKLSAgICAweDg0LDB4ODQsMHg4NCwweDg0LDB4NzQsMHg3NCwweDc0LDB4NzQsCi0gICAgMHg2NCwweDY0LDB4NjQsMHg2NCwweDU0LDB4NTQsMHg1NCwweDU0LAotICAgIDB4NDMsMHg0MywweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsMHg0MywKLSAgICAweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsCi0gICAgMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzLAotICAgIDB4MTMsMHgxMywweDEzLDB4MTMsMHgxMywweDEzLDB4MTMsMHgxMywKLSAgICAweDAzLDB4MDMsMHgwMywweDAzLDB4MDMsMHgwMywweDAzLDB4MDN9OwotCi1zdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc18zWzY0XSA9IHsKLSAgICAweGQ2LDB4YjYsMHhjNSwweGM1LDB4YTUsMHhhNSwweDk1LDB4OTUsCi0gICAgMHg4NCwweDg0LDB4ODQsMHg4NCwweDU0LDB4NTQsMHg1NCwweDU0LAotICAgIDB4NDQsMHg0NCwweDQ0LDB4NDQsMHgwNCwweDA0LDB4MDQsMHgwNCwKLSAgICAweDczLDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywweDczLDB4NzMsCi0gICAgMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLAotICAgIDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywKLSAgICAweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsCi0gICAgMHgxMywweDEzLDB4MTMsMHgxMywweDEzLDB4MTMsMHgxMywweDEzfTsKLQotc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfNFszMl0gPSB7Ci0gICAgMHhjNSwweGI1LDB4YTUsMHgwNSwweDk0LDB4OTQsMHg3NCwweDc0LAotICAgIDB4MzQsMHgzNCwweDI0LDB4MjQsMHg4MywweDgzLDB4ODMsMHg4MywKLSAgICAweDYzLDB4NjMsMHg2MywweDYzLDB4NTMsMHg1MywweDUzLDB4NTMsCi0gICAgMHg0MywweDQzLDB4NDMsMHg0MywweDEzLDB4MTMsMHgxMywweDEzfTsKLQotc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfNVszMl0gPSB7Ci0gICAgMHhiNSwweDk1LDB4YTQsMHhhNCwweDg0LDB4ODQsMHgyNCwweDI0LAotICAgIDB4MTQsMHgxNCwweDA0LDB4MDQsMHg3MywweDczLDB4NzMsMHg3MywKLSAgICAweDYzLDB4NjMsMHg2MywweDYzLDB4NTMsMHg1MywweDUzLDB4NTMsCi0gICAgMHg0MywweDQzLDB4NDMsMHg0MywweDMzLDB4MzMsMHgzMywweDMzfTsKLQotc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfNls2NF0gPSB7Ci0gICAgMHhhNiwweDA2LDB4MTUsMHgxNSwweDg0LDB4ODQsMHg4NCwweDg0LAotICAgIDB4OTMsMHg5MywweDkzLDB4OTMsMHg5MywweDkzLDB4OTMsMHg5MywKLSAgICAweDczLDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywweDczLDB4NzMsCi0gICAgMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLAotICAgIDB4NTMsMHg1MywweDUzLDB4NTMsMHg1MywweDUzLDB4NTMsMHg1MywKLSAgICAweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsCi0gICAgMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLAotICAgIDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyM307Ci0KLXN0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzdbNjRdID0gewotICAgIDB4OTYsMHgwNiwweDE1LDB4MTUsMHg3NCwweDc0LDB4NzQsMHg3NCwKLSAgICAweDgzLDB4ODMsMHg4MywweDgzLDB4ODMsMHg4MywweDgzLDB4ODMsCi0gICAgMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLAotICAgIDB4NDMsMHg0MywweDQzLDB4NDMsMHg0MywweDQzLDB4NDMsMHg0MywKLSAgICAweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsCi0gICAgMHgyMywweDIzLDB4MjMsMHgyMywweDIzLDB4MjMsMHgyMywweDIzLAotICAgIDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwKLSAgICAweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTJ9OwotCi1zdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc184WzY0XSA9IHsKLSAgICAweDg2LDB4MDYsMHgyNSwweDI1LDB4MTQsMHgxNCwweDE0LDB4MTQsCi0gICAgMHg3MywweDczLDB4NzMsMHg3MywweDczLDB4NzMsMHg3MywweDczLAotICAgIDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywweDYzLDB4NjMsMHg2MywKLSAgICAweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsMHgzMywweDMzLDB4MzMsCi0gICAgMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLAotICAgIDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwKLSAgICAweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsCi0gICAgMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyfTsKLQotc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfOVs2NF0gPSB7Ci0gICAgMHgxNiwweDA2LDB4NzUsMHg3NSwweDI0LDB4MjQsMHgyNCwweDI0LAotICAgIDB4NTMsMHg1MywweDUzLDB4NTMsMHg1MywweDUzLDB4NTMsMHg1MywKLSAgICAweDYyLDB4NjIsMHg2MiwweDYyLDB4NjIsMHg2MiwweDYyLDB4NjIsCi0gICAgMHg2MiwweDYyLDB4NjIsMHg2MiwweDYyLDB4NjIsMHg2MiwweDYyLAotICAgIDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwKLSAgICAweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsCi0gICAgMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyLAotICAgIDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMn07Ci0KLXN0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzEwWzMyXSA9IHsKLSAgICAweDE1LDB4MDUsMHg2NCwweDY0LDB4MjMsMHgyMywweDIzLDB4MjMsCi0gICAgMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLDB4NTIsMHg1MiwweDUyLAotICAgIDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwweDQyLDB4NDIsMHg0MiwKLSAgICAweDMyLDB4MzIsMHgzMiwweDMyLDB4MzIsMHgzMiwweDMyLDB4MzJ9OwotCi1zdGF0aWMgY29uc3QgdTggdG90YWxaZXJvc18xMVsxNl0gPSB7Ci0gICAgMHgwNCwweDE0LDB4MjMsMHgyMywweDMzLDB4MzMsMHg1MywweDUzLAotICAgIDB4NDEsMHg0MSwweDQxLDB4NDEsMHg0MSwweDQxLDB4NDEsMHg0MX07Ci0KLXN0YXRpYyBjb25zdCB1OCB0b3RhbFplcm9zXzEyWzE2XSA9IHsKLSAgICAweDA0LDB4MTQsMHg0MywweDQzLDB4MjIsMHgyMiwweDIyLDB4MjIsCi0gICAgMHgzMSwweDMxLDB4MzEsMHgzMSwweDMxLDB4MzEsMHgzMSwweDMxfTsKLQotc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfMTNbOF0gPSB7MHgwMywweDEzLDB4MzIsMHgzMiwweDIxLDB4MjEsMHgyMSwweDIxfTsKLQotc3RhdGljIGNvbnN0IHU4IHRvdGFsWmVyb3NfMTRbNF0gPSB7MHgwMiwweDEyLDB4MjEsMHgyMX07Ci0KLS8qIFZMQyB0YWJsZXMgZm9yIHJ1bl9iZWZvcmUuIFRhYmxlIGVsZW1lbnRzIGhhdmUgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6Ci0gKiBbNCBiaXRzIGZvciBpbmZvXSBbNGJpdHMgZm9yIFZMQyBsZW5ndGhdCi0gKi8KLQotc3RhdGljIGNvbnN0IHU4IHJ1bkJlZm9yZV82WzhdID0gezB4MTMsMHgyMywweDQzLDB4MzMsMHg2MywweDUzLDB4MDIsMHgwMn07Ci0KLXN0YXRpYyBjb25zdCB1OCBydW5CZWZvcmVfNVs4XSA9IHsweDUzLDB4NDMsMHgzMywweDIzLDB4MTIsMHgxMiwweDAyLDB4MDJ9OwotCi1zdGF0aWMgY29uc3QgdTggcnVuQmVmb3JlXzRbOF0gPSB7MHg0MywweDMzLDB4MjIsMHgyMiwweDEyLDB4MTIsMHgwMiwweDAyfTsKLQotc3RhdGljIGNvbnN0IHU4IHJ1bkJlZm9yZV8zWzRdID0gezB4MzIsMHgyMiwweDEyLDB4MDJ9OwotCi1zdGF0aWMgY29uc3QgdTggcnVuQmVmb3JlXzJbNF0gPSB7MHgyMiwweDEyLDB4MDEsMHgwMX07Ci0KLXN0YXRpYyBjb25zdCB1OCBydW5CZWZvcmVfMVsyXSA9IHsweDExLDB4MDF9OwotCi0vKiBmb2xsb3dpbmcgZm91ciBtYWNyb3MgYXJlIHVzZWQgdG8gaGFuZGxlIHN0cmVhbSBidWZmZXIgImNhY2hlIiBpbiB0aGUgQ0FWTEMKLSAqIGRlY29kaW5nIGZ1bmN0aW9uICovCi0KLS8qIG1hY3JvIHRvIGluaXRpYWxpemUgc3RyZWFtIGJ1ZmZlciBjYWNoZSwgZmlsbHMgdGhlIGJ1ZmZlciAoMzIgYml0cykgKi8KLSNkZWZpbmUgQlVGRkVSX0lOSVQodmFsdWUsIGJpdHMpIFwKLXsgXAotICAgIChiaXRzKSA9IDMyOyBcCi0gICAgKHZhbHVlKSA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk7IFwKLX0KLQotLyogbWFjcm8gdG8gcmVhZCBudW1CaXRzIGJpdHMgZnJvbSB0aGUgYnVmZmVyLCBiaXRzIHdpbGwgYmUgd3JpdHRlbiB0bwotICogb3V0VmFsLiBSZWZpbGxzIHRoZSBidWZmZXIgaWYgbm90IGVub3VnaCBiaXRzIGxlZnQgKi8KLSNkZWZpbmUgQlVGRkVSX1NIT1codmFsdWUsIGJpdHMsIG91dFZhbCwgbnVtQml0cykgXAoteyBcCi0gICAgaWYgKChiaXRzKSA8IChudW1CaXRzKSkgXAotICAgIHsgXAotICAgICAgICBpZihoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwzMi0oYml0cykpID09IEVORF9PRl9TVFJFQU0pIFwKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsgXAotICAgICAgICAodmFsdWUpID0gaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKTsgXAotICAgICAgICAoYml0cykgPSAzMjsgXAotICAgIH0gXAotICAgIChvdXRWYWwpID0gKHZhbHVlKSA+PiAoMzIgLSAobnVtQml0cykpOyBcCi19Ci0KLS8qIG1hY3JvIHRvIGZsdXNoIG51bUJpdHMgYml0cyBmcm9tIHRoZSBidWZmZXIgKi8KLSNkZWZpbmUgQlVGRkVSX0ZMVVNIKHZhbHVlLCBiaXRzLCBudW1CaXRzKSBcCi17IFwKLSAgICAodmFsdWUpIDw8PSAobnVtQml0cyk7IFwKLSAgICAoYml0cykgLT0gKG51bUJpdHMpOyBcCi19Ci0KLS8qIG1hY3JvIHRvIHJlYWQgYW5kIGZsdXNoICBudW1CaXRzIGJpdHMgZnJvbSB0aGUgYnVmZmVyLCBiaXRzIHdpbGwgYmUgd3JpdHRlbgotICogdG8gb3V0VmFsLiBSZWZpbGxzIHRoZSBidWZmZXIgaWYgbm90IGVub3VnaCBiaXRzIGxlZnQgKi8KLSNkZWZpbmUgQlVGRkVSX0dFVCh2YWx1ZSwgYml0cywgb3V0VmFsLCBudW1CaXRzKSBcCi17IFwKLSAgICBpZiAoKGJpdHMpIDwgKG51bUJpdHMpKSBcCi0gICAgeyBcCi0gICAgICAgIGlmKGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLDMyLShiaXRzKSkgPT0gRU5EX09GX1NUUkVBTSkgXAotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOyBcCi0gICAgICAgICh2YWx1ZSkgPSBoMjY0YnNkU2hvd0JpdHMzMihwU3RybURhdGEpOyBcCi0gICAgICAgIChiaXRzKSA9IDMyOyBcCi0gICAgfSBcCi0gICAgKG91dFZhbCkgPSAodmFsdWUpID4+ICgzMiAtIChudW1CaXRzKSk7IFwKLSAgICAodmFsdWUpIDw8PSAobnVtQml0cyk7IFwKLSAgICAoYml0cykgLT0gKG51bUJpdHMpOyBcCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBEZWNvZGVDb2VmZlRva2VuKHUzMiBiaXRzLCB1MzIgbmMpOwotCi1zdGF0aWMgdTMyIERlY29kZUxldmVsUHJlZml4KHUzMiBiaXRzKTsKLQotc3RhdGljIHUzMiBEZWNvZGVUb3RhbFplcm9zKHUzMiBiaXRzLCB1MzIgdG90YWxDb2VmZiwgdTMyIGlzQ2hyb21hREMpOwotCi1zdGF0aWMgdTMyIERlY29kZVJ1bkJlZm9yZSh1MzIgYml0cyx1MzIgemVyb3NMZWZ0KTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVDb2VmZlRva2VuCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgY29lZmZfdG9rZW4gaW5mb3JtYXRpb24gZmllbGQgZnJvbSB0aGUgc3RyZWFtLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICB1MzIgYml0cyAgICAgICAgICAgICAgICAgIG5leHQgMTYgc3RyZWFtIGJpdHMKLSAgICAgICAgICB1MzIgbmMgICAgICAgICAgICAgICAgICAgIG5DLCBzZWUgc3RhbmRhcmQgZm9yIGRldGFpbHMKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIHUzMiAgaW5mb3JtYXRpb24gZmllbGQgKDExIGJpdHMgZm9yIHZhbHVlLCA1IGJpdHMgZm9yIGxlbmd0aCkKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIERlY29kZUNvZWZmVG9rZW4odTMyIGJpdHMsIHUzMiBuYykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdmFsdWU7Ci0KLS8qIENvZGUgKi8KLQotICAgIC8qIHN0YW5kYXJkIGRlZmluZXMgdGhhdCBuYyBmb3IgZGVjb2Rpbmcgb2YgY2hyb21hIGRjIGNvZWZmaWNpZW50cyBpcyAtMSwKLSAgICAgKiByZXByZXNlbnRlZCBieSB1MzIgaGVyZSAtPiAtMSBtYXBzIHRvIDJeMzIgLSAxICovCi0gICAgQVNTRVJUKG5jIDw9IDE2IHx8IG5jID09ICh1MzIpKC0xKSk7Ci0KLSAgICBpZiAobmMgPCAyKQotICAgIHsKLSAgICAgICAgaWYgKGJpdHMgPj0gMHg4MDAwKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWx1ZSA9IDB4MDAwMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4MEMwMCkKLSAgICAgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjBfMFtiaXRzID4+IDEwXTsKLSAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDAxMDApCi0gICAgICAgICAgICB2YWx1ZSA9IGNvZWZmVG9rZW4wXzFbYml0cyA+PiA2XTsKLSAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDAwMjApCi0gICAgICAgICAgICB2YWx1ZSA9IGNvZWZmVG9rZW4wXzJbKGJpdHM+PjIpLThdOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2YWx1ZSA9IGNvZWZmVG9rZW4wXzNbYml0c107Ci0gICAgfQotICAgIGVsc2UgaWYgKG5jIDwgNCkKLSAgICB7Ci0gICAgICAgIGlmIChiaXRzID49IDB4ODAwMCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsdWUgPSBiaXRzICYgMHg0MDAwID8gMHgwMDAyIDogMHgwODIyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgxMDAwKQotICAgICAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuMl8wW2JpdHMgPj4gMTBdOwotICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4MDIwMCkKLSAgICAgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjJfMVtiaXRzID4+IDddOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2YWx1ZSA9IGNvZWZmVG9rZW4yXzJbYml0cz4+Ml07Ci0gICAgfQotICAgIGVsc2UgaWYgKG5jIDwgOCkKLSAgICB7Ci0gICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjRfMFtiaXRzID4+IDEwXTsKLSAgICAgICAgaWYgKCF2YWx1ZSkKLSAgICAgICAgICAgIHZhbHVlID0gY29lZmZUb2tlbjRfMVtiaXRzPj42XTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobmMgPD0gMTYpCi0gICAgewotICAgICAgICB2YWx1ZSA9IGNvZWZmVG9rZW44W2JpdHM+PjEwXTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdmFsdWUgPSBjb2VmZlRva2VuTWludXMxXzBbYml0cyA+PiAxM107Ci0gICAgICAgIGlmICghdmFsdWUpCi0gICAgICAgICAgICB2YWx1ZSA9IGNvZWZmVG9rZW5NaW51czFfMVtiaXRzPj44XTsKLSAgICB9Ci0KLSAgICByZXR1cm4odmFsdWUpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlTGV2ZWxQcmVmaXgKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSBsZXZlbF9wcmVmaXggaW5mb3JtYXRpb24gZmllbGQgZnJvbSB0aGUgc3RyZWFtCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIHUzMiBiaXRzICAgICAgbmV4dCAxNiBzdHJlYW0gYml0cwotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgdTMyICBsZXZlbF9wcmVmaXggaW5mb3JtYXRpb24gZmllbGQgb3IgVkxDX05PVF9GT1VORAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgRGVjb2RlTGV2ZWxQcmVmaXgodTMyIGJpdHMpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIG51bVplcm9zOwotCi0vKiBDb2RlICovCi0KLSAgICBpZiAoYml0cyA+PSAweDgwMDApCi0gICAgICAgIG51bVplcm9zID0gMDsKLSAgICBlbHNlIGlmIChiaXRzID49IDB4NDAwMCkKLSAgICAgICAgbnVtWmVyb3MgPSAxOwotICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgyMDAwKQotICAgICAgICBudW1aZXJvcyA9IDI7Ci0gICAgZWxzZSBpZiAoYml0cyA+PSAweDEwMDApCi0gICAgICAgIG51bVplcm9zID0gMzsKLSAgICBlbHNlIGlmIChiaXRzID49IDB4MDgwMCkKLSAgICAgICAgbnVtWmVyb3MgPSA0OwotICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwNDAwKQotICAgICAgICBudW1aZXJvcyA9IDU7Ci0gICAgZWxzZSBpZiAoYml0cyA+PSAweDAyMDApCi0gICAgICAgIG51bVplcm9zID0gNjsKLSAgICBlbHNlIGlmIChiaXRzID49IDB4MDEwMCkKLSAgICAgICAgbnVtWmVyb3MgPSA3OwotICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgwMDgwKQotICAgICAgICBudW1aZXJvcyA9IDg7Ci0gICAgZWxzZSBpZiAoYml0cyA+PSAweDAwNDApCi0gICAgICAgIG51bVplcm9zID0gOTsKLSAgICBlbHNlIGlmIChiaXRzID49IDB4MDAyMCkKLSAgICAgICAgbnVtWmVyb3MgPSAxMDsKLSAgICBlbHNlIGlmIChiaXRzID49IDB4MDAxMCkKLSAgICAgICAgbnVtWmVyb3MgPSAxMTsKLSAgICBlbHNlIGlmIChiaXRzID49IDB4MDAwOCkKLSAgICAgICAgbnVtWmVyb3MgPSAxMjsKLSAgICBlbHNlIGlmIChiaXRzID49IDB4MDAwNCkKLSAgICAgICAgbnVtWmVyb3MgPSAxMzsKLSAgICBlbHNlIGlmIChiaXRzID49IDB4MDAwMikKLSAgICAgICAgbnVtWmVyb3MgPSAxNDsKLSAgICBlbHNlIGlmIChiaXRzID49IDB4MDAwMSkKLSAgICAgICAgbnVtWmVyb3MgPSAxNTsKLSAgICBlbHNlIC8qIG1vcmUgdGhhbiAxNSB6ZXJvcyBlbmNvdW50ZXJlZCB3aGljaCBpcyBhbiBlcnJvciAqLwotICAgICAgICByZXR1cm4oVkxDX05PVF9GT1VORCk7Ci0KLSAgICByZXR1cm4obnVtWmVyb3MpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlVG90YWxaZXJvcwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgRnVuY3Rpb24gdG8gZGVjb2RlIHRvdGFsX3plcm9zIGluZm9ybWF0aW9uIGZpZWxkIGZyb20gdGhlIHN0cmVhbQotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICB1MzIgYml0cyAgICAgICAgICAgICAgICAgIG5leHQgOSBzdHJlYW0gYml0cwotICAgICAgICAgIHUzMiB0b3RhbENvZWZmICAgICAgICAgICAgdG90YWwgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBmb3IgdGhlIGJsb2NrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWluZyBkZWNvZGVkCi0gICAgICAgICAgdTMyIGlzQ2hyb21hREMgICAgICAgICAgIGZsYWcgdG8gaW5kaWNhdGUgY2hyb21hIERDIGJsb2NrCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICB1MzIgIGluZm9ybWF0aW9uIGZpZWxkICg0IGJpdHMgdmFsdWUsIDQgYml0cyBsZW5ndGgpCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBEZWNvZGVUb3RhbFplcm9zKHUzMiBiaXRzLCB1MzIgdG90YWxDb2VmZiwgdTMyIGlzQ2hyb21hREMpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHZhbHVlID0gMHgwOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQodG90YWxDb2VmZik7Ci0KLSAgICBpZiAoIWlzQ2hyb21hREMpCi0gICAgewotICAgICAgICBBU1NFUlQodG90YWxDb2VmZiA8IDE2KTsKLSAgICAgICAgc3dpdGNoICh0b3RhbENvZWZmKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzFfMFtiaXRzID4+IDRdOwotICAgICAgICAgICAgICAgIGlmICghdmFsdWUpCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc18xXzFbYml0c107Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfMltiaXRzID4+IDNdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzNbYml0cyA+PiAzXTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc180W2JpdHMgPj4gNF07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfNVtiaXRzID4+IDRdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzZbYml0cyA+PiAzXTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICAgIHZhbHVlID0gdG90YWxaZXJvc183W2JpdHMgPj4gM107Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfOFtiaXRzID4+IDNdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSB0b3RhbFplcm9zXzlbYml0cyA+PiAzXTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfMTBbYml0cyA+PiA0XTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfMTFbYml0cyA+PiA1XTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfMTJbYml0cyA+PiA1XTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfMTNbYml0cyA+PiA2XTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvdGFsWmVyb3NfMTRbYml0cyA+PiA3XTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDogLyogY2FzZSAxNSAqLwotICAgICAgICAgICAgICAgIHZhbHVlID0gKGJpdHMgPj4gOCkgPyAweDExIDogMHgwMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBBU1NFUlQodG90YWxDb2VmZiA8IDQpOwotICAgICAgICBiaXRzID4+PSA2OwotICAgICAgICBpZiAoYml0cyA+IDMpCi0gICAgICAgICAgICB2YWx1ZSA9IDB4MDE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRvdGFsQ29lZmYgPT0gMykKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4MTE7Ci0gICAgICAgICAgICBlbHNlIGlmIChiaXRzID4gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4MTI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh0b3RhbENvZWZmID09IDIpCi0gICAgICAgICAgICAgICAgdmFsdWUgPSAweDIyOwotICAgICAgICAgICAgZWxzZSBpZiAoYml0cykKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4MjM7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdmFsdWUgPSAweDMzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKHZhbHVlKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZVJ1bkJlZm9yZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgRnVuY3Rpb24gdG8gZGVjb2RlIHJ1bl9iZWZvcmUgaW5mb3JtYXRpb24gZmllbGQgZnJvbSB0aGUgc3RyZWFtCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIHUzMiBiaXRzICAgICAgICAgICAgICAgICAgbmV4dCAxMSBzdHJlYW0gYml0cwotICAgICAgICAgIHUzMiB6ZXJvc0xlZnQgICAgICAgICAgICAgbnVtYmVyIG9mIHplcm9zIGxlZnQgZm9yIHRoZSBjdXJyZW50IGJsb2NrCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICB1MzIgIGluZm9ybWF0aW9uIGZpZWxkICg0IGJpdHMgdmFsdWUsIDQgYml0cyBsZW5ndGgpCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBEZWNvZGVSdW5CZWZvcmUodTMyIGJpdHMsIHUzMiB6ZXJvc0xlZnQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHZhbHVlID0gMHgwOwotCi0vKiBDb2RlICovCi0KLSAgICBzd2l0Y2ggKHplcm9zTGVmdCkKLSAgICB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIHZhbHVlID0gcnVuQmVmb3JlXzFbYml0cz4+MTBdOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgdmFsdWUgPSBydW5CZWZvcmVfMltiaXRzPj45XTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIHZhbHVlID0gcnVuQmVmb3JlXzNbYml0cz4+OV07Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICB2YWx1ZSA9IHJ1bkJlZm9yZV80W2JpdHM+PjhdOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgdmFsdWUgPSBydW5CZWZvcmVfNVtiaXRzPj44XTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgIHZhbHVlID0gcnVuQmVmb3JlXzZbYml0cz4+OF07Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaWYgKGJpdHMgPj0gMHgxMDApCi0gICAgICAgICAgICAgICAgdmFsdWUgPSAoKDctKGJpdHM+PjgpKTw8NCkrMHgzOwotICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDgwKQotICAgICAgICAgICAgICAgIHZhbHVlID0gMHg3NDsKLSAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMgPj0gMHg0MCkKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IDB4ODU7Ci0gICAgICAgICAgICBlbHNlIGlmIChiaXRzID49IDB4MjApCi0gICAgICAgICAgICAgICAgdmFsdWUgPSAweDk2OwotICAgICAgICAgICAgZWxzZSBpZiAoYml0cyA+PSAweDEwKQotICAgICAgICAgICAgICAgIHZhbHVlID0gMHhhNzsKLSAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMgPj0gMHg4KQotICAgICAgICAgICAgICAgIHZhbHVlID0gMHhiODsKLSAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMgPj0gMHg0KQotICAgICAgICAgICAgICAgIHZhbHVlID0gMHhjOTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMgPj0gMHgyKQotICAgICAgICAgICAgICAgIHZhbHVlID0gMHhkQTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGJpdHMpCi0gICAgICAgICAgICAgICAgdmFsdWUgPSAweGVCOwotICAgICAgICAgICAgaWYgKElORk8odmFsdWUpID4gemVyb3NMZWZ0KQotICAgICAgICAgICAgICAgIHZhbHVlID0gMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybih2YWx1ZSk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVSZXNpZHVhbEJsb2NrQ2F2bGMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIEZ1bmN0aW9uIHRvIGRlY29kZSBvbmUgQ0FWTEMgY29kZWQgYmxvY2suIFRoaXMgY29ycmVzcG9uZHMgdG8KLSAgICAgICAgICBzeW50YXggZWxlbWVudHMgcmVzaWR1YWxfYmxvY2tfY2F2bGMoKSBpbiB0aGUgc3RhbmRhcmQuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIHBTdHJtRGF0YSAgICAgICAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgIG5jICAgICAgICAgICAgICAgICAgICBuQyB2YWx1ZQotICAgICAgICAgIG1heE51bUNvZWZmICAgICAgICAgICBtYXhpbXVtIG51bWJlciBvZiByZXNpZHVhbCBjb2VmZmljaWVudHMKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIGNvZWZmTGV2ZWwgICAgICAgICAgICBzdG9yZXMgZGVjb2RlZCBjb2VmZmljaWVudCBsZXZlbHMKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgIG51bUNvZWZmcyAgICAgICAgICAgICBvbiBiaXRzIFs0LDExXSBpZiBzdWNjZXNzZnVsCi0gICAgICAgICAgY29lZmZNYXAgICAgICAgICAgICAgIG9uIGJpdHMgWzE2LDMxXSBpZiBzdWNjZXNzZnVsLCB0aGlzIGlzIGJpdCBtYXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgZWFjaCBiaXQgaW5kaWNhdGVzIGlmIHRoZSBjb3JyZXNwb25kaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmaWNpZW50IHdhcyB6ZXJvICgwKSBvciBub24temVybyAoMSkKLSAgICAgICAgICBIQU5UUk9fTk9LICAgICAgICAgICAgZW5kIG9mIHN0cmVhbSBvciBlcnJvciBpbiBzdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVSZXNpZHVhbEJsb2NrQ2F2bGMoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgaTMyICpjb2VmZkxldmVsLAotICBpMzIgbmMsCi0gIHUzMiBtYXhOdW1Db2VmZikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgdG1wLCB0b3RhbENvZWZmLCB0cmFpbGluZ09uZXMsIHN1ZmZpeExlbmd0aCwgbGV2ZWxQcmVmaXg7Ci0gICAgdTMyIGxldmVsU3VmZml4LCB6ZXJvc0xlZnQsIGJpdDsKLSAgICBpMzIgbGV2ZWxbMTZdOwotICAgIHUzMiBydW5bMTZdOwotICAgIC8qIHN0cmVhbSAiY2FjaGUiICovCi0gICAgdTMyIGJ1ZmZlclZhbHVlOwotICAgIHUzMiBidWZmZXJCaXRzOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQoY29lZmZMZXZlbCk7Ci0gICAgQVNTRVJUKG5jID4gLTIpOwotICAgIEFTU0VSVChtYXhOdW1Db2VmZiA9PSA0IHx8IG1heE51bUNvZWZmID09IDE1IHx8IG1heE51bUNvZWZmID09IDE2KTsKLSAgICBBU1NFUlQoVkxDX05PVF9GT1VORCAhPSBFTkRfT0ZfU1RSRUFNKTsKLQotICAgIC8qIGFzc3VtZSB0aGF0IGNvZWZmTGV2ZWwgYXJyYXkgaGFzIGJlZW4gImNsZWFuZWQiIGJ5IGNhbGxlciAqLwotCi0gICAgQlVGRkVSX0lOSVQoYnVmZmVyVmFsdWUsIGJ1ZmZlckJpdHMpOwotCi0gICAgLypsaW50IC1lNzc0IGRpc2FibGUgbGludCB3YXJuaW5nIG9uIGFsd2F5cyBmYWxzZSBjb21wYXJpc29uICovCi0gICAgQlVGRkVSX1NIT1coYnVmZmVyVmFsdWUsIGJ1ZmZlckJpdHMsIGJpdCwgMTYpOwotICAgIC8qbGludCArZTc3NCAqLwotICAgIHRtcCA9IERlY29kZUNvZWZmVG9rZW4oYml0LCAodTMyKW5jKTsKLSAgICBpZiAoIXRtcCkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIEJVRkZFUl9GTFVTSChidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgTEVOR1RIX1RDKHRtcCkpOwotCi0gICAgdG90YWxDb2VmZiA9IFRPVEFMX0NPRUZGKHRtcCk7Ci0gICAgaWYgKHRvdGFsQ29lZmYgPiBtYXhOdW1Db2VmZikKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHRyYWlsaW5nT25lcyA9IFRSQUlMSU5HX09ORVModG1wKTsKLQotICAgIGlmICh0b3RhbENvZWZmICE9IDApCi0gICAgewotICAgICAgICBpID0gMDsKLSAgICAgICAgLyogbm9uemVybyBjb2VmZmljaWVudHM6ICsvLSAxICovCi0gICAgICAgIGlmICh0cmFpbGluZ09uZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJVRkZFUl9HRVQoYnVmZmVyVmFsdWUsIGJ1ZmZlckJpdHMsIGJpdCwgdHJhaWxpbmdPbmVzKTsKLSAgICAgICAgICAgIHRtcCA9IDEgPDwgKHRyYWlsaW5nT25lcyAtIDEpOwotICAgICAgICAgICAgZm9yICg7IHRtcDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxldmVsW2ldID0gYml0ICYgdG1wID8gLTEgOiAxOwotICAgICAgICAgICAgICAgIHRtcCA+Pj0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIG90aGVyIGxldmVscyAqLwotICAgICAgICBpZiAodG90YWxDb2VmZiA+IDEwICYmIHRyYWlsaW5nT25lcyA8IDMpCi0gICAgICAgICAgICBzdWZmaXhMZW5ndGggPSAxOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdWZmaXhMZW5ndGggPSAwOwotCi0gICAgICAgIGZvciAoOyBpIDwgdG90YWxDb2VmZjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBCVUZGRVJfU0hPVyhidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgYml0LCAxNik7Ci0gICAgICAgICAgICBsZXZlbFByZWZpeCA9IERlY29kZUxldmVsUHJlZml4KGJpdCk7Ci0gICAgICAgICAgICBpZiAobGV2ZWxQcmVmaXggPT0gVkxDX05PVF9GT1VORCkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICBCVUZGRVJfRkxVU0goYnVmZmVyVmFsdWUsIGJ1ZmZlckJpdHMsIGxldmVsUHJlZml4KzEpOwotCi0gICAgICAgICAgICBpZiAobGV2ZWxQcmVmaXggPCAxNCkKLSAgICAgICAgICAgICAgICB0bXAgPSBzdWZmaXhMZW5ndGg7Ci0gICAgICAgICAgICBlbHNlIGlmIChsZXZlbFByZWZpeCA9PSAxNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXAgPSBzdWZmaXhMZW5ndGggPyBzdWZmaXhMZW5ndGggOiA0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHNldHRpbmcgc3VmZml4TGVuZ3RoIHRvIDEgaGVyZSBjb3JyZXNwb25kcyB0byBhZGRpbmcgMTUKLSAgICAgICAgICAgICAgICAgKiB0byBsZXZlbENvZGUgdmFsdWUgaWYgbGV2ZWxQcmVmaXggPT0gMTUgYW5kCi0gICAgICAgICAgICAgICAgICogc3VmZml4TGVuZ3RoID09IDAgKi8KLSAgICAgICAgICAgICAgICBpZiAoIXN1ZmZpeExlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgc3VmZml4TGVuZ3RoID0gMTsKLSAgICAgICAgICAgICAgICB0bXAgPSAxMjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHN1ZmZpeExlbmd0aCkKLSAgICAgICAgICAgICAgICBsZXZlbFByZWZpeCA8PD0gc3VmZml4TGVuZ3RoOwotCi0gICAgICAgICAgICBpZiAodG1wKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJVRkZFUl9HRVQoYnVmZmVyVmFsdWUsIGJ1ZmZlckJpdHMsIGxldmVsU3VmZml4LCB0bXApOwotICAgICAgICAgICAgICAgIGxldmVsUHJlZml4ICs9IGxldmVsU3VmZml4OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0bXAgPSBsZXZlbFByZWZpeDsKLQotICAgICAgICAgICAgaWYgKGkgPT0gdHJhaWxpbmdPbmVzICYmIHRyYWlsaW5nT25lcyA8IDMpCi0gICAgICAgICAgICAgICAgdG1wICs9IDI7Ci0KLSAgICAgICAgICAgIGxldmVsW2ldID0gKHRtcCsyKT4+MTsKLQotICAgICAgICAgICAgaWYgKHN1ZmZpeExlbmd0aCA9PSAwKQotICAgICAgICAgICAgICAgIHN1ZmZpeExlbmd0aCA9IDE7Ci0KLSAgICAgICAgICAgIGlmICgobGV2ZWxbaV0gPiAoMyA8PCAoc3VmZml4TGVuZ3RoIC0gMSkpKSAmJiBzdWZmaXhMZW5ndGggPCA2KQotICAgICAgICAgICAgICAgIHN1ZmZpeExlbmd0aCsrOwotCi0gICAgICAgICAgICBpZiAodG1wICYgMHgxKQotICAgICAgICAgICAgICAgIGxldmVsW2ldID0gLWxldmVsW2ldOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogemVybyBydW5zICovCi0gICAgICAgIGlmICh0b3RhbENvZWZmIDwgbWF4TnVtQ29lZmYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJVRkZFUl9TSE9XKGJ1ZmZlclZhbHVlLCBidWZmZXJCaXRzLCBiaXQsOSk7Ci0gICAgICAgICAgICB6ZXJvc0xlZnQgPSBEZWNvZGVUb3RhbFplcm9zKGJpdCwgdG90YWxDb2VmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTMyKShtYXhOdW1Db2VmZiA9PSA0KSk7Ci0gICAgICAgICAgICBpZiAoIXplcm9zTGVmdCkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICBCVUZGRVJfRkxVU0goYnVmZmVyVmFsdWUsIGJ1ZmZlckJpdHMsIExFTkdUSCh6ZXJvc0xlZnQpKTsKLSAgICAgICAgICAgIHplcm9zTGVmdCA9IElORk8oemVyb3NMZWZ0KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICB6ZXJvc0xlZnQgPSAwOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b3RhbENvZWZmIC0gMTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoemVyb3NMZWZ0ID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCVUZGRVJfU0hPVyhidWZmZXJWYWx1ZSwgYnVmZmVyQml0cywgYml0LDExKTsKLSAgICAgICAgICAgICAgICB0bXAgPSBEZWNvZGVSdW5CZWZvcmUoYml0LCB6ZXJvc0xlZnQpOwotICAgICAgICAgICAgICAgIGlmICghdG1wKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgQlVGRkVSX0ZMVVNIKGJ1ZmZlclZhbHVlLCBidWZmZXJCaXRzLCBMRU5HVEgodG1wKSk7Ci0gICAgICAgICAgICAgICAgcnVuW2ldID0gSU5GTyh0bXApOwotICAgICAgICAgICAgICAgIHplcm9zTGVmdCAtPSBydW5baV0rKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBydW5baV0gPSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogY29tYmluaW5nIGxldmVsIGFuZCBydW4sIGxldmVsU3VmZml4IHZhcmlhYmxlIHVzZWQgdG8gaG9sZCBjb2VmZk1hcCwKLSAgICAgICAgICogaS5lLiBiaXQgbWFwIGluZGljYXRpbmcgd2hpY2ggY29lZmZpY2llbnRzIGhhZCBub24temVybyB2YWx1ZS4gKi8KLQotICAgICAgICAvKmxpbnQgLWVzeW0oNzcxLGxldmVsLHJ1bikgbGV2ZWwgYW5kIHJ1biBhcmUgYWx3YXlzIGluaXRpYWxpemVkICovCi0gICAgICAgIHRtcCA9IHplcm9zTGVmdDsKLSAgICAgICAgY29lZmZMZXZlbFt0bXBdID0gbGV2ZWxbdG90YWxDb2VmZi0xXTsKLSAgICAgICAgbGV2ZWxTdWZmaXggPSAxIDw8IHRtcDsKLSAgICAgICAgZm9yIChpID0gdG90YWxDb2VmZi0xOyBpLS07KQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgKz0gcnVuW2ldOwotICAgICAgICAgICAgbGV2ZWxTdWZmaXggfD0gMSA8PCB0bXA7Ci0gICAgICAgICAgICBjb2VmZkxldmVsW3RtcF0gPSBsZXZlbFtpXTsKLSAgICAgICAgfQotCi0gICAgfQotICAgIGVsc2UKLSAgICAgICAgbGV2ZWxTdWZmaXggPSAwOwotCi0gICAgaWYgKGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLCAzMi1idWZmZXJCaXRzKSAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHJldHVybigodG90YWxDb2VmZiA8PCA0KSB8IChsZXZlbFN1ZmZpeCA8PCAxNikpOwotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY2F2bGMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jYXZsYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDM1M2QzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jYXZsYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19DQVZMQ19ICi0jZGVmaW5lIEgyNjRTV0RFQ19DQVZMQ19ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYygKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBpMzIgKmNvZWZmTGV2ZWwsCi0gIGkzMiBuYywKLSAgdTMyIG1heE51bUNvZWZmKTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfQ0FWTENfSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY2ZnLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY2ZnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYWJhNWEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NmZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19DRkdfSAotI2RlZmluZSBIMjY0U1dERUNfQ0ZHX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIE1BWF9OVU1fUkVGX1BJQ1MgMTYKLSNkZWZpbmUgTUFYX05VTV9TTElDRV9HUk9VUFMgOAotI2RlZmluZSBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTIDMyCi0jZGVmaW5lIE1BWF9OVU1fUElDX1BBUkFNX1NFVFMgMjU2Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX0NGR19IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb25jZWFsLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29uY2VhbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTI2MmVkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb25jZWFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIGgyNjRic2RDb25jZWFsCi0gICAgICAgICAgQ29uY2VhbE1iCi0gICAgICAgICAgVHJhbnNmb3JtCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF9jb25jZWFsLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9yZWNvbnN0cnVjdC5oIgotI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qbGludCAtZTcwMiBkaXNhYmxlIGxpbnQgd2FybmluZyBvbiByaWdodCBzaGlmdCBvZiBzaWduZWQgcXVhbnRpdHkgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIENvbmNlYWxNYihtYlN0b3JhZ2VfdCAqcE1iLCBpbWFnZV90ICpjdXJySW1hZ2UsIHUzMiByb3csIHUzMiBjb2wsCi0gICAgdTMyIHNsaWNlVHlwZSwgdTggKmRhdGEpOwotCi1zdGF0aWMgdm9pZCBUcmFuc2Zvcm0oaTMyICpkYXRhKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6IGgyNjRic2RDb25jZWFsCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFBlcmZvcm0gZXJyb3IgY29uY2VhbG1lbnQgZm9yIGEgcGljdHVyZS4gVHdvIHR5cGVzIG9mIGNvbmNlYWxtZW50Ci0gICAgICAgICAgICBpcyBwZXJmb3JtZWQgYmFzZWQgb24gc2xpY2VUeXBlOgotICAgICAgICAgICAgICAgIDEpIGNvcHkgZnJvbSBwcmV2aW91cyBwaWN0dXJlIGZvciBQLXNsaWNlcy4KLSAgICAgICAgICAgICAgICAyKSBjb25jZWFsbWVudCBmcm9tIG5laWdoYm91ciBwaXhlbHMgZm9yIEktc2xpY2VzCi0KLSAgICAgICAgICAgIEktdHlwZSBjb25jZWFsbWVudCBpcyBiYXNlZCBvbiBpZGVhcyBwcmVzZW50ZWQgYnkgSmFybm8gVHVsa2tpLgotICAgICAgICAgICAgVGhlIGNvbmNlYWxtZW50IGFsZ29yaXRobSBkZXRlcm1pbmVzIGZyZXF1ZW5jeSBkb21haW4gY29lZmZpY2llbnRzCi0gICAgICAgICAgICBmcm9tIHRoZSBuZWlnaGJvdXIgcGl4ZWxzLCBhcHBsaWVzIGludGVnZXIgdHJhbnNmb3JtICh0aGUgc2FtZQotICAgICAgICAgICAgdHJhbnNmb3JtIHVzZWQgaW4gdGhlIHJlc2lkdWFsIHByb2Nlc3NpbmcpIGFuZCB1c2VzIHRoZSByZXN1bHRzIGFzCi0gICAgICAgICAgICBwaXhlbCB2YWx1ZXMgZm9yIGNvbmNlYWxlZCBtYWNyb2Jsb2Nrcy4gVHJhbnNmb3JtIHByb2R1Y2VzIDR4NAotICAgICAgICAgICAgYXJyYXkgYW5kIG9uZSBwaXhlbCB2YWx1ZSBoYXMgdG8gYmUgdXNlZCBmb3IgNHg0IGx1bWEgYmxvY2tzIGFuZAotICAgICAgICAgICAgMngyIGNocm9tYSBibG9ja3MuCi0KLSAgICAgICAgICAgIFNpbWlsYXIgY29uY2VhbG1lbnQgaXMgcGVyZm9ybWVkIGZvciB3aG9sZSBwaWN0dXJlICh0aGUgY2hvaXNlCi0gICAgICAgICAgICBvZiB0aGUgdHlwZSBpcyBiYXNlZCBvbiBsYXN0IHN1Y2Nlc3NmdWxseSBkZWNvZGVkIHNsaWNlIGhlYWRlciBvZgotICAgICAgICAgICAgdGhlIHBpY3R1cmUgYnV0IGl0IGlzIGhhbmRsZWQgYnkgdGhlIGNhbGxpbmcgZnVuY3Rpb24pLiBJdCBpcwotICAgICAgICAgICAgYWNrbm93bGVkZ2VkIHRoYXQgdGhpcyBtYXkgcmVzdWx0IGluIHdyb25nIHR5cGUgb2YgY29uY2VhbG1lbnQKLSAgICAgICAgICAgIHdoZW4gYSBwaWN0dXJlIGNvbnRhaW5zIGJvdGggdHlwZXMgb2Ygc2xpY2VzLiBIb3dldmVyLAotICAgICAgICAgICAgZGV0ZXJtaW5hdGlvbiBvZiBzbGljZSB0eXBlIG1hY3JvYmxvY2stYnktbWFjcm9ibG9jayBjYW5ub3QKLSAgICAgICAgICAgIGJlIGRvbmUgZHVlIHRvIHRoZSBmYWN0IHRoYXQgaXQgaXMgaW1wb3NzaWJsZSB0byBrbm93IHRvIHdoaWNoCi0gICAgICAgICAgICBzbGljZSBlYWNoIGNvcnJ1cHRlZCAobm90IHN1Y2Nlc3NmdWxseSBkZWNvZGVkKSBtYWNyb2Jsb2NrCi0gICAgICAgICAgICBiZWxvbmdzLgotCi0gICAgICAgICAgICBUaGUgZXJyb3IgY29uY2VhbG1lbnQgaXMgc3RhcnRlZCBieSBzZWFyY2hpbmcgdGhlIGZpcnN0IHByb3BvZXJseQotICAgICAgICAgICAgZGVjb2RlZCBtYWNyb2Jsb2NrIGFuZCBjb25jZWFsaW5nIHRoZSByb3cgY29udGFpbmluZyB0aGUgbWFjcm9ibG9jawotICAgICAgICAgICAgaW4gcXVlc3Rpb24uIEFmdGVyIHRoYXQgYWxsIG1hY3JvYmxvY2tzIGFib3ZlIHRoZSByb3cgaW4gcXVlc3Rpb24KLSAgICAgICAgICAgIGFyZSBjb25jZWFsZWQuIEZpbmFsbHkgY29uY2VhbG1lbnQgb2Ygcm93cyBiZWxvdyBpcyBwZXJmb3JtZWQuCi0gICAgICAgICAgICBUaGUgb3JkZXIgb2YgY29uY2VhbG1lbnQgZm9yIDR4NCBwaWN0dXJlIHdoZXJlIG1hY3JvYmxvY2sgOSBpcyB0aGUKLSAgICAgICAgICAgIGZpcnN0IHByb3Blcmx5IGRlY29kZWQgb25lIGlzIGFzIGZvbGxvd3MgKHByb3Blcmx5IGRlY29kZWQKLSAgICAgICAgICAgIG1hY3JvYmxvY2tzIG1hcmtlZCB3aXRoICd4JywgbnVtYmVycyBpbmRpY2F0aW5nIHRoZSBvcmRlciBvZgotICAgICAgICAgICAgY29uY2VhbG1lbnQpOgotCi0gICAgICAgICAgICAgICA0ICA2ICA4IDEwCi0gICAgICAgICAgICAgICAzICA1ICA3ICA5Ci0gICAgICAgICAgICAgICAxICB4ICB4ICAyCi0gICAgICAgICAgICAgIDExIDEyIDEzIDE0Ci0KLSAgICAgICAgICAgIElmIGFsbCBtYWNyb2Jsb2NrcyBvZiB0aGUgcGljdHVyZSBhcmUgbG9zdCwgdGhlIGNvbmNlYWxtZW50IGlzCi0gICAgICAgICAgICBjb3B5IG9mIHByZXZpb3VzIHBpY3R1cmUgZm9yIFAtdHlwZSBhbmQgc2V0dGluZyB0aGUgaW1hZ2UgdG8KLSAgICAgICAgICAgIGNvbnN0YW50IGdyYXkgKHBpeGVsIHZhbHVlIDEyOCkgZm9yIEktdHlwZS4KLQotICAgICAgICAgICAgQ29uY2VhbG1lbnQgc2V0cyBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBjb25jZWFsZWQKLSAgICAgICAgICAgIG1hY3JvYmxvY2tzIHRvIHZhbHVlIDQwIGFuZCBtYWNyb2Jsb2NrIHR5cGUgdG8gaW50cmEgdG8gZW5hYmxlCi0gICAgICAgICAgICBkZWJsb2NraW5nIGZpbHRlciB0byBzbW9vdGggdGhlIGVkZ2VzIG9mIHRoZSBjb25jZWFsZWQgYXJlYXMuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0b3JhZ2UgICAgICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIGN1cnJJbWFnZSAgICAgICBwb2ludGVyIHRvIGN1cnJlbnQgaW1hZ2Ugc3RydWN0dXJlCi0gICAgICAgICAgICBzbGljZVR5cGUgICAgICAgdHlwZSBvZiB0aGUgc2xpY2UKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgY3VyckltYWdlICAgICAgIGNvbmNlYWxlZCBtYWNyb2Jsb2NrcyB3aWxsIGJlIHdyaXR0ZW4gaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RDb25jZWFsKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIGltYWdlX3QgKmN1cnJJbWFnZSwgdTMyIHNsaWNlVHlwZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgajsKLSAgICB1MzIgcm93LCBjb2w7Ci0gICAgdTMyIHdpZHRoLCBoZWlnaHQ7Ci0gICAgdTggKnJlZkRhdGE7Ci0gICAgbWJTdG9yYWdlX3QgKm1iOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0b3JhZ2UpOwotICAgIEFTU0VSVChjdXJySW1hZ2UpOwotCi0gICAgREVCVUcoKCJDb25jZWFsaW5nICVzIHNsaWNlXG4iLCBJU19JX1NMSUNFKHNsaWNlVHlwZSkgPwotICAgICAgICAgICAgImludHJhIiA6ICJpbnRlciIpKTsKLQotICAgIHdpZHRoID0gY3VyckltYWdlLT53aWR0aDsKLSAgICBoZWlnaHQgPSBjdXJySW1hZ2UtPmhlaWdodDsKLSAgICByZWZEYXRhID0gTlVMTDsKLSAgICAvKiB1c2UgcmVmZXJlbmNlIHBpY3R1cmUgd2l0aCBzbWFsbGVzdCBhdmFpbGFibGUgaW5kZXggKi8KLSAgICBpZiAoSVNfUF9TTElDRShzbGljZVR5cGUpIHx8IChwU3RvcmFnZS0+aW50cmFDb25jZWFsbWVudEZsYWcgIT0gMCkpCi0gICAgewotICAgICAgICBpID0gMDsKLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgICAgcmVmRGF0YSA9IGgyNjRic2RHZXRSZWZQaWNEYXRhKHBTdG9yYWdlLT5kcGIsIGkpOwotICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgaWYgKGkgPj0gMTYpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gd2hpbGUgKHJlZkRhdGEgPT0gTlVMTCk7Ci0gICAgfQotCi0gICAgaSA9IHJvdyA9IGNvbCA9IDA7Ci0gICAgLyogZmluZCBmaXJzdCBwcm9wZXJseSBkZWNvZGVkIG1hY3JvYmxvY2sgLT4gc3RhcnQgcG9pbnQgZm9yIGNvbmNlYWxtZW50ICovCi0gICAgd2hpbGUgKGkgPCBwU3RvcmFnZS0+cGljU2l6ZUluTWJzICYmICFwU3RvcmFnZS0+bWJbaV0uZGVjb2RlZCkKLSAgICB7Ci0gICAgICAgIGkrKzsKLSAgICAgICAgY29sKys7Ci0gICAgICAgIGlmIChjb2wgPT0gd2lkdGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJvdysrOwotICAgICAgICAgICAgY29sID0gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIHdob2xlIHBpY3R1cmUgbG9zdCAtPiBjb3B5IHByZXZpb3VzIG9yIHNldCBncmV5ICovCi0gICAgaWYgKGkgPT0gcFN0b3JhZ2UtPnBpY1NpemVJbk1icykKLSAgICB7Ci0gICAgICAgIGlmICggKElTX0lfU0xJQ0Uoc2xpY2VUeXBlKSAmJiAocFN0b3JhZ2UtPmludHJhQ29uY2VhbG1lbnRGbGFnID09IDApKSB8fAotICAgICAgICAgICAgIHJlZkRhdGEgPT0gTlVMTCkKLSAgICAgICAgICAgIEgyNjRTd0RlY01lbXNldChjdXJySW1hZ2UtPmRhdGEsIDEyOCwgd2lkdGgqaGVpZ2h0KjM4NCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIEgyNjRTd0RlY01lbWNweShjdXJySW1hZ2UtPmRhdGEsIHJlZkRhdGEsIHdpZHRoKmhlaWdodCozODQpOwotCi0gICAgICAgIHBTdG9yYWdlLT5udW1Db25jZWFsZWRNYnMgPSBwU3RvcmFnZS0+cGljU2l6ZUluTWJzOwotCi0gICAgICAgIC8qIG5vIGZpbHRlcmluZyBpZiB3aG9sZSBwaWN0dXJlIGNvbmNlYWxlZCAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFN0b3JhZ2UtPnBpY1NpemVJbk1iczsgaSsrKQotICAgICAgICAgICAgcFN0b3JhZ2UtPm1iW2ldLmRpc2FibGVEZWJsb2NraW5nRmlsdGVySWRjID0gMTsKLQotICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKLSAgICB9Ci0KLSAgICAvKiBzdGFydCBmcm9tIHRoZSByb3cgY29udGFpbmluZyB0aGUgZmlyc3QgY29ycmVjdCBtYWNyb2Jsb2NrLCBjb25jZWFsIHRoZQotICAgICAqIHJvdyBpbiBxdWVzdGlvbiwgYWxsIHJvd3MgYWJvdmUgdGhhdCByb3cgYW5kIHRoZW4gY29udGludWUgZG93bndhcmRzICovCi0gICAgbWIgPSBwU3RvcmFnZS0+bWIgKyByb3cgKiB3aWR0aDsKLSAgICBmb3IgKGogPSBjb2w7IGotLTspCi0gICAgewotICAgICAgICBDb25jZWFsTWIobWIraiwgY3VyckltYWdlLCByb3csIGosIHNsaWNlVHlwZSwgcmVmRGF0YSk7Ci0gICAgICAgIG1iW2pdLmRlY29kZWQgPSAxOwotICAgICAgICBwU3RvcmFnZS0+bnVtQ29uY2VhbGVkTWJzKys7Ci0gICAgfQotICAgIGZvciAoaiA9IGNvbCArIDE7IGogPCB3aWR0aDsgaisrKQotICAgIHsKLSAgICAgICAgaWYgKCFtYltqXS5kZWNvZGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb25jZWFsTWIobWIraiwgY3VyckltYWdlLCByb3csIGosIHNsaWNlVHlwZSwgcmVmRGF0YSk7Ci0gICAgICAgICAgICBtYltqXS5kZWNvZGVkID0gMTsKLSAgICAgICAgICAgIHBTdG9yYWdlLT5udW1Db25jZWFsZWRNYnMrKzsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBpZiBwcmV2aW91cyByb3cocykgY291bGQgbm90IGJlIGNvbmNlYWxlZCAtPiBjb25jZWFsIHRoZW0gbm93ICovCi0gICAgaWYgKHJvdykKLSAgICB7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpID0gcm93IC0gMTsKLSAgICAgICAgICAgIG1iID0gcFN0b3JhZ2UtPm1iICsgaSp3aWR0aCArIGo7Ci0gICAgICAgICAgICBkbwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbmNlYWxNYihtYiwgY3VyckltYWdlLCBpLCBqLCBzbGljZVR5cGUsIHJlZkRhdGEpOwotICAgICAgICAgICAgICAgIG1iLT5kZWNvZGVkID0gMTsKLSAgICAgICAgICAgICAgICBwU3RvcmFnZS0+bnVtQ29uY2VhbGVkTWJzKys7Ci0gICAgICAgICAgICAgICAgbWIgLT0gd2lkdGg7Ci0gICAgICAgICAgICB9IHdoaWxlKGktLSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBwcm9jZXNzIHJvd3MgYmVsb3cgdGhlIG9uZSBjb250YWluaW5nIHRoZSBmaXJzdCBjb3JyZWN0IG1hY3JvYmxvY2sgKi8KLSAgICBmb3IgKGkgPSByb3cgKyAxOyBpIDwgaGVpZ2h0OyBpKyspCi0gICAgewotICAgICAgICBtYiA9IHBTdG9yYWdlLT5tYiArIGkgKiB3aWR0aDsKLQotICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFtYltqXS5kZWNvZGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbmNlYWxNYihtYitqLCBjdXJySW1hZ2UsIGksIGosIHNsaWNlVHlwZSwgcmVmRGF0YSk7Ci0gICAgICAgICAgICAgICAgbWJbal0uZGVjb2RlZCA9IDE7Ci0gICAgICAgICAgICAgICAgcFN0b3JhZ2UtPm51bUNvbmNlYWxlZE1icysrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiBDb25jZWFsTWIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgUGVyZm9ybSBlcnJvciBjb25jZWFsbWVudCBmb3Igb25lIG1hY3JvYmxvY2ssIGxvY2F0aW9uIG9mIHRoZQotICAgICAgICAgICAgbWFjcm9ibG9jayBpbiB0aGUgcGljdHVyZSBpbmRpY2F0ZWQgYnkgcm93IGFuZCBjb2wKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIENvbmNlYWxNYihtYlN0b3JhZ2VfdCAqcE1iLCBpbWFnZV90ICpjdXJySW1hZ2UsIHUzMiByb3csIHUzMiBjb2wsCi0gICAgdTMyIHNsaWNlVHlwZSwgdTggKnJlZkRhdGEpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksIGosIGNvbXA7Ci0gICAgdTMyIGhvciwgdmVyOwotICAgIHUzMiBtYk51bTsKLSAgICB1MzIgd2lkdGgsIGhlaWdodDsKLSAgICB1OCAqbWJQb3M7Ci0gICAgdTggZGF0YVszODRdOwotICAgIHU4ICpwRGF0YTsKLSAgICBpMzIgdG1wOwotICAgIGkzMiBmaXJzdFBoYXNlWzE2XTsKLSAgICBpMzIgKnBUbXA7Ci0gICAgLyogbmVpZ2hib3VycyBhYm92ZSwgYmVsb3csIGxlZnQgYW5kIHJpZ2h0ICovCi0gICAgaTMyIGFbNF0gPSB7IDAsMCwwLDAgfSwgYls0XSwgbFs0XSA9IHsgMCwwLDAsMCB9LCByWzRdOwotICAgIHUzMiBBLCBCLCBMLCBSOwotI2lmZGVmIEgyNjRERUNfT01YREwKLSAgICB1OCBmaWxsQnVmZlszMioyMSArIDE1ICsgMzJdOwotICAgIHU4ICpwRmlsbDsKLSNlbmRpZgotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBNYik7Ci0gICAgQVNTRVJUKCFwTWItPmRlY29kZWQpOwotICAgIEFTU0VSVChjdXJySW1hZ2UpOwotICAgIEFTU0VSVChjb2wgPCBjdXJySW1hZ2UtPndpZHRoKTsKLSAgICBBU1NFUlQocm93IDwgY3VyckltYWdlLT5oZWlnaHQpOwotCi0jaWZkZWYgSDI2NERFQ19PTVhETAotICAgIHBGaWxsID0gQUxJR04oZmlsbEJ1ZmYsIDE2KTsKLSNlbmRpZgotICAgIHdpZHRoID0gY3VyckltYWdlLT53aWR0aDsKLSAgICBoZWlnaHQgPSBjdXJySW1hZ2UtPmhlaWdodDsKLSAgICBtYk51bSA9IHJvdyAqIHdpZHRoICsgY29sOwotCi0gICAgaDI2NGJzZFNldEN1cnJJbWFnZU1iUG9pbnRlcnMoY3VyckltYWdlLCBtYk51bSk7Ci0KLSAgICBtYlBvcyA9IGN1cnJJbWFnZS0+ZGF0YSArIHJvdyAqIDE2ICogd2lkdGggKiAxNiArIGNvbCAqIDE2OwotICAgIEEgPSBCID0gTCA9IFIgPSBIQU5UUk9fRkFMU0U7Ci0KLSAgICAvKiBzZXQgcXBZIHRvIDQwIHRvIGVuYWJsZSBzb21lIGZpbHRlcmluZyBpbiBkZWJsb2NraW5nIChzdGV0c29uIHZhbHVlKSAqLwotICAgIHBNYi0+cXBZID0gNDA7Ci0gICAgcE1iLT5kaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYyA9IDA7Ci0gICAgLyogbWJUeXBlIHNldCB0byBpbnRyYSB0byBwZXJmb3JtIGZpbHRlcmluZyBkZXNwaXRlIHRoZSB2YWx1ZXMgb2Ygb3RoZXIKLSAgICAgKiBib3VuZGFyeSBzdHJlbmd0aCBkZXRlcm1pbmF0aW9uIGZpZWxkcyAqLwotICAgIHBNYi0+bWJUeXBlID0gSV80eDQ7Ci0gICAgcE1iLT5maWx0ZXJPZmZzZXRBID0gMDsKLSAgICBwTWItPmZpbHRlck9mZnNldEIgPSAwOwotICAgIHBNYi0+Y2hyb21hUXBJbmRleE9mZnNldCA9IDA7Ci0KLSAgICBpZiAoSVNfSV9TTElDRShzbGljZVR5cGUpKQotICAgICAgICBIMjY0U3dEZWNNZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgICBtdl90IG12ID0gezAsMH07Ci0gICAgICAgIGltYWdlX3QgcmVmSW1hZ2U7Ci0gICAgICAgIHJlZkltYWdlLndpZHRoID0gd2lkdGg7Ci0gICAgICAgIHJlZkltYWdlLmhlaWdodCA9IGhlaWdodDsKLSAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHJlZkRhdGE7Ci0gICAgICAgIGlmIChyZWZJbWFnZS5kYXRhKQotICAgICAgICB7Ci0jaWZuZGVmIEgyNjRERUNfT01YREwKLSAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCAmbXYsICZyZWZJbWFnZSwgY29sKjE2LCByb3cqMTYsCi0gICAgICAgICAgICAgICAgMCwgMCwgMTYsIDE2KTsKLSNlbHNlCi0gICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgJm12LCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICgocm93KjE2KSArICgoY29sKjE2KTw8MTYpKSwKLSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAxMCwgcEZpbGwpOwotI2VuZGlmCi0gICAgICAgICAgICBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrKGN1cnJJbWFnZSwgZGF0YSk7Ci0KLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fT0spOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIEgyNjRTd0RlY01lbXNldChkYXRhLCAwLCBzaXplb2YoZGF0YSkpOwotICAgIH0KLQotICAgIEgyNjRTd0RlY01lbXNldChmaXJzdFBoYXNlLCAwLCBzaXplb2YoZmlyc3RQaGFzZSkpOwotCi0gICAgLyogY291bnRlciBmb3IgbnVtYmVyIG9mIG5laWdoYm91cnMgdXNlZCAqLwotICAgIGogPSAwOwotICAgIGhvciA9IHZlciA9IDA7Ci0gICAgaWYgKHJvdyAmJiAocE1iLXdpZHRoKS0+ZGVjb2RlZCkKLSAgICB7Ci0gICAgICAgIEEgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgcERhdGEgPSBtYlBvcyAtIHdpZHRoKjE2OwotICAgICAgICBhWzBdID0gKnBEYXRhKys7IGFbMF0gKz0gKnBEYXRhKys7IGFbMF0gKz0gKnBEYXRhKys7IGFbMF0gKz0gKnBEYXRhKys7Ci0gICAgICAgIGFbMV0gPSAqcERhdGErKzsgYVsxXSArPSAqcERhdGErKzsgYVsxXSArPSAqcERhdGErKzsgYVsxXSArPSAqcERhdGErKzsKLSAgICAgICAgYVsyXSA9ICpwRGF0YSsrOyBhWzJdICs9ICpwRGF0YSsrOyBhWzJdICs9ICpwRGF0YSsrOyBhWzJdICs9ICpwRGF0YSsrOwotICAgICAgICBhWzNdID0gKnBEYXRhKys7IGFbM10gKz0gKnBEYXRhKys7IGFbM10gKz0gKnBEYXRhKys7IGFbM10gKz0gKnBEYXRhKys7Ci0gICAgICAgIGorKzsKLSAgICAgICAgaG9yKys7Ci0gICAgICAgIGZpcnN0UGhhc2VbMF0gKz0gYVswXSArIGFbMV0gKyBhWzJdICsgYVszXTsKLSAgICAgICAgZmlyc3RQaGFzZVsxXSArPSBhWzBdICsgYVsxXSAtIGFbMl0gLSBhWzNdOwotICAgIH0KLSAgICBpZiAoKHJvdyAhPSBoZWlnaHQgLSAxKSAmJiAocE1iK3dpZHRoKS0+ZGVjb2RlZCkKLSAgICB7Ci0gICAgICAgIEIgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgcERhdGEgPSBtYlBvcyArIDE2KndpZHRoKjE2OwotICAgICAgICBiWzBdID0gKnBEYXRhKys7IGJbMF0gKz0gKnBEYXRhKys7IGJbMF0gKz0gKnBEYXRhKys7IGJbMF0gKz0gKnBEYXRhKys7Ci0gICAgICAgIGJbMV0gPSAqcERhdGErKzsgYlsxXSArPSAqcERhdGErKzsgYlsxXSArPSAqcERhdGErKzsgYlsxXSArPSAqcERhdGErKzsKLSAgICAgICAgYlsyXSA9ICpwRGF0YSsrOyBiWzJdICs9ICpwRGF0YSsrOyBiWzJdICs9ICpwRGF0YSsrOyBiWzJdICs9ICpwRGF0YSsrOwotICAgICAgICBiWzNdID0gKnBEYXRhKys7IGJbM10gKz0gKnBEYXRhKys7IGJbM10gKz0gKnBEYXRhKys7IGJbM10gKz0gKnBEYXRhKys7Ci0gICAgICAgIGorKzsKLSAgICAgICAgaG9yKys7Ci0gICAgICAgIGZpcnN0UGhhc2VbMF0gKz0gYlswXSArIGJbMV0gKyBiWzJdICsgYlszXTsKLSAgICAgICAgZmlyc3RQaGFzZVsxXSArPSBiWzBdICsgYlsxXSAtIGJbMl0gLSBiWzNdOwotICAgIH0KLSAgICBpZiAoY29sICYmIChwTWItMSktPmRlY29kZWQpCi0gICAgewotICAgICAgICBMID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgIHBEYXRhID0gbWJQb3MgLSAxOwotICAgICAgICBsWzBdID0gcERhdGFbMF07IGxbMF0gKz0gcERhdGFbMTYqd2lkdGhdOwotICAgICAgICBsWzBdICs9IHBEYXRhWzMyKndpZHRoXTsgbFswXSArPSBwRGF0YVs0OCp3aWR0aF07Ci0gICAgICAgIHBEYXRhICs9IDY0KndpZHRoOwotICAgICAgICBsWzFdID0gcERhdGFbMF07IGxbMV0gKz0gcERhdGFbMTYqd2lkdGhdOwotICAgICAgICBsWzFdICs9IHBEYXRhWzMyKndpZHRoXTsgbFsxXSArPSBwRGF0YVs0OCp3aWR0aF07Ci0gICAgICAgIHBEYXRhICs9IDY0KndpZHRoOwotICAgICAgICBsWzJdID0gcERhdGFbMF07IGxbMl0gKz0gcERhdGFbMTYqd2lkdGhdOwotICAgICAgICBsWzJdICs9IHBEYXRhWzMyKndpZHRoXTsgbFsyXSArPSBwRGF0YVs0OCp3aWR0aF07Ci0gICAgICAgIHBEYXRhICs9IDY0KndpZHRoOwotICAgICAgICBsWzNdID0gcERhdGFbMF07IGxbM10gKz0gcERhdGFbMTYqd2lkdGhdOwotICAgICAgICBsWzNdICs9IHBEYXRhWzMyKndpZHRoXTsgbFszXSArPSBwRGF0YVs0OCp3aWR0aF07Ci0gICAgICAgIGorKzsKLSAgICAgICAgdmVyKys7Ci0gICAgICAgIGZpcnN0UGhhc2VbMF0gKz0gbFswXSArIGxbMV0gKyBsWzJdICsgbFszXTsKLSAgICAgICAgZmlyc3RQaGFzZVs0XSArPSBsWzBdICsgbFsxXSAtIGxbMl0gLSBsWzNdOwotICAgIH0KLSAgICBpZiAoKGNvbCAhPSB3aWR0aCAtIDEpICYmIChwTWIrMSktPmRlY29kZWQpCi0gICAgewotICAgICAgICBSID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgIHBEYXRhID0gbWJQb3MgKyAxNjsKLSAgICAgICAgclswXSA9IHBEYXRhWzBdOyByWzBdICs9IHBEYXRhWzE2KndpZHRoXTsKLSAgICAgICAgclswXSArPSBwRGF0YVszMip3aWR0aF07IHJbMF0gKz0gcERhdGFbNDgqd2lkdGhdOwotICAgICAgICBwRGF0YSArPSA2NCp3aWR0aDsKLSAgICAgICAgclsxXSA9IHBEYXRhWzBdOyByWzFdICs9IHBEYXRhWzE2KndpZHRoXTsKLSAgICAgICAgclsxXSArPSBwRGF0YVszMip3aWR0aF07IHJbMV0gKz0gcERhdGFbNDgqd2lkdGhdOwotICAgICAgICBwRGF0YSArPSA2NCp3aWR0aDsKLSAgICAgICAgclsyXSA9IHBEYXRhWzBdOyByWzJdICs9IHBEYXRhWzE2KndpZHRoXTsKLSAgICAgICAgclsyXSArPSBwRGF0YVszMip3aWR0aF07IHJbMl0gKz0gcERhdGFbNDgqd2lkdGhdOwotICAgICAgICBwRGF0YSArPSA2NCp3aWR0aDsKLSAgICAgICAgclszXSA9IHBEYXRhWzBdOyByWzNdICs9IHBEYXRhWzE2KndpZHRoXTsKLSAgICAgICAgclszXSArPSBwRGF0YVszMip3aWR0aF07IHJbM10gKz0gcERhdGFbNDgqd2lkdGhdOwotICAgICAgICBqKys7Ci0gICAgICAgIHZlcisrOwotICAgICAgICBmaXJzdFBoYXNlWzBdICs9IHJbMF0gKyByWzFdICsgclsyXSArIHJbM107Ci0gICAgICAgIGZpcnN0UGhhc2VbNF0gKz0gclswXSArIHJbMV0gLSByWzJdIC0gclszXTsKLSAgICB9Ci0KLSAgICAvKiBhdCBsZWFzdCBvbmUgcHJvcGVybHkgZGVjb2RlZCBuZWlnaGJvdXIgYXZhaWxhYmxlICovCi0gICAgQVNTRVJUKGopOwotCi0gICAgLypsaW50IC1lc3ltKDY0NCxsLHIsYSxiKSB2YXJpYWJsZSBpbml0aWFsaXplZCBhYm92ZSAqLwotICAgIGlmICghaG9yICYmIEwgJiYgUikKLSAgICAgICAgZmlyc3RQaGFzZVsxXSA9IChsWzBdK2xbMV0rbFsyXStsWzNdLXJbMF0tclsxXS1yWzJdLXJbM10pID4+IDU7Ci0gICAgZWxzZSBpZiAoaG9yKQotICAgICAgICBmaXJzdFBoYXNlWzFdID4+PSAoMytob3IpOwotCi0gICAgaWYgKCF2ZXIgJiYgQSAmJiBCKQotICAgICAgICBmaXJzdFBoYXNlWzRdID0gKGFbMF0rYVsxXSthWzJdK2FbM10tYlswXS1iWzFdLWJbMl0tYlszXSkgPj4gNTsKLSAgICBlbHNlIGlmICh2ZXIpCi0gICAgICAgIGZpcnN0UGhhc2VbNF0gPj49ICgzK3Zlcik7Ci0KLSAgICBzd2l0Y2ggKGopCi0gICAgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBmaXJzdFBoYXNlWzBdID4+PSA0OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgZmlyc3RQaGFzZVswXSA+Pj0gNTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIC8qIGFwcHJveGltYXRlIChmaXJzdFBoYXNlWzBdKjQvMyk+PjYgKi8KLSAgICAgICAgICAgIGZpcnN0UGhhc2VbMF0gPSAoMjEgKiBmaXJzdFBoYXNlWzBdKSA+PiAxMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6IC8qIDQgKi8KLSAgICAgICAgICAgIGZpcnN0UGhhc2VbMF0gPj49IDY7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgIH0KLQotCi0gICAgVHJhbnNmb3JtKGZpcnN0UGhhc2UpOwotCi0gICAgZm9yIChpID0gMCwgcERhdGEgPSBkYXRhLCBwVG1wID0gZmlyc3RQaGFzZTsgaSA8IDI1NjspCi0gICAgewotICAgICAgICB0bXAgPSBwVG1wWyhpICYgMHhGKT4+Ml07Ci0gICAgICAgIC8qbGludCAtZTczNCBDTElQMSBtYWNybyByZXN1bHRzIGluIHZhbHVlIHRoYXQgZml0cyBpbnRvIDggYml0cyAqLwotICAgICAgICAqcERhdGErKyA9IENMSVAxKHRtcCk7Ci0gICAgICAgIC8qbGludCArZTczNCAqLwotCi0gICAgICAgIGkrKzsKLSAgICAgICAgaWYgKCEoaSAmIDB4M0YpKQotICAgICAgICAgICAgcFRtcCArPSA0OwotICAgIH0KLQotICAgIC8qIGNocm9tYSBjb21wb25lbnRzICovCi0gICAgbWJQb3MgPSBjdXJySW1hZ2UtPmRhdGEgKyB3aWR0aCAqIGhlaWdodCAqIDI1NiArCi0gICAgICAgcm93ICogOCAqIHdpZHRoICogOCArIGNvbCAqIDg7Ci0gICAgZm9yIChjb21wID0gMDsgY29tcCA8IDI7IGNvbXArKykKLSAgICB7Ci0KLSAgICAgICAgSDI2NFN3RGVjTWVtc2V0KGZpcnN0UGhhc2UsIDAsIHNpemVvZihmaXJzdFBoYXNlKSk7Ci0KLSAgICAgICAgLyogY291bnRlciBmb3IgbnVtYmVyIG9mIG5laWdoYm91cnMgdXNlZCAqLwotICAgICAgICBqID0gMDsKLSAgICAgICAgaG9yID0gdmVyID0gMDsKLSAgICAgICAgaWYgKEEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEYXRhID0gbWJQb3MgLSB3aWR0aCo4OwotICAgICAgICAgICAgYVswXSA9ICpwRGF0YSsrOyBhWzBdICs9ICpwRGF0YSsrOwotICAgICAgICAgICAgYVsxXSA9ICpwRGF0YSsrOyBhWzFdICs9ICpwRGF0YSsrOwotICAgICAgICAgICAgYVsyXSA9ICpwRGF0YSsrOyBhWzJdICs9ICpwRGF0YSsrOwotICAgICAgICAgICAgYVszXSA9ICpwRGF0YSsrOyBhWzNdICs9ICpwRGF0YSsrOwotICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgaG9yKys7Ci0gICAgICAgICAgICBmaXJzdFBoYXNlWzBdICs9IGFbMF0gKyBhWzFdICsgYVsyXSArIGFbM107Ci0gICAgICAgICAgICBmaXJzdFBoYXNlWzFdICs9IGFbMF0gKyBhWzFdIC0gYVsyXSAtIGFbM107Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBEYXRhID0gbWJQb3MgKyA4KndpZHRoKjg7Ci0gICAgICAgICAgICBiWzBdID0gKnBEYXRhKys7IGJbMF0gKz0gKnBEYXRhKys7Ci0gICAgICAgICAgICBiWzFdID0gKnBEYXRhKys7IGJbMV0gKz0gKnBEYXRhKys7Ci0gICAgICAgICAgICBiWzJdID0gKnBEYXRhKys7IGJbMl0gKz0gKnBEYXRhKys7Ci0gICAgICAgICAgICBiWzNdID0gKnBEYXRhKys7IGJbM10gKz0gKnBEYXRhKys7Ci0gICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICBob3IrKzsKLSAgICAgICAgICAgIGZpcnN0UGhhc2VbMF0gKz0gYlswXSArIGJbMV0gKyBiWzJdICsgYlszXTsKLSAgICAgICAgICAgIGZpcnN0UGhhc2VbMV0gKz0gYlswXSArIGJbMV0gLSBiWzJdIC0gYlszXTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTCkKLSAgICAgICAgewotICAgICAgICAgICAgcERhdGEgPSBtYlBvcyAtIDE7Ci0gICAgICAgICAgICBsWzBdID0gcERhdGFbMF07IGxbMF0gKz0gcERhdGFbOCp3aWR0aF07Ci0gICAgICAgICAgICBwRGF0YSArPSAxNip3aWR0aDsKLSAgICAgICAgICAgIGxbMV0gPSBwRGF0YVswXTsgbFsxXSArPSBwRGF0YVs4KndpZHRoXTsKLSAgICAgICAgICAgIHBEYXRhICs9IDE2KndpZHRoOwotICAgICAgICAgICAgbFsyXSA9IHBEYXRhWzBdOyBsWzJdICs9IHBEYXRhWzgqd2lkdGhdOwotICAgICAgICAgICAgcERhdGEgKz0gMTYqd2lkdGg7Ci0gICAgICAgICAgICBsWzNdID0gcERhdGFbMF07IGxbM10gKz0gcERhdGFbOCp3aWR0aF07Ci0gICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICB2ZXIrKzsKLSAgICAgICAgICAgIGZpcnN0UGhhc2VbMF0gKz0gbFswXSArIGxbMV0gKyBsWzJdICsgbFszXTsKLSAgICAgICAgICAgIGZpcnN0UGhhc2VbNF0gKz0gbFswXSArIGxbMV0gLSBsWzJdIC0gbFszXTsKLSAgICAgICAgfQotICAgICAgICBpZiAoUikKLSAgICAgICAgewotICAgICAgICAgICAgcERhdGEgPSBtYlBvcyArIDg7Ci0gICAgICAgICAgICByWzBdID0gcERhdGFbMF07IHJbMF0gKz0gcERhdGFbOCp3aWR0aF07Ci0gICAgICAgICAgICBwRGF0YSArPSAxNip3aWR0aDsKLSAgICAgICAgICAgIHJbMV0gPSBwRGF0YVswXTsgclsxXSArPSBwRGF0YVs4KndpZHRoXTsKLSAgICAgICAgICAgIHBEYXRhICs9IDE2KndpZHRoOwotICAgICAgICAgICAgclsyXSA9IHBEYXRhWzBdOyByWzJdICs9IHBEYXRhWzgqd2lkdGhdOwotICAgICAgICAgICAgcERhdGEgKz0gMTYqd2lkdGg7Ci0gICAgICAgICAgICByWzNdID0gcERhdGFbMF07IHJbM10gKz0gcERhdGFbOCp3aWR0aF07Ci0gICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICB2ZXIrKzsKLSAgICAgICAgICAgIGZpcnN0UGhhc2VbMF0gKz0gclswXSArIHJbMV0gKyByWzJdICsgclszXTsKLSAgICAgICAgICAgIGZpcnN0UGhhc2VbNF0gKz0gclswXSArIHJbMV0gLSByWzJdIC0gclszXTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWhvciAmJiBMICYmIFIpCi0gICAgICAgICAgICBmaXJzdFBoYXNlWzFdID0gKGxbMF0rbFsxXStsWzJdK2xbM10tclswXS1yWzFdLXJbMl0tclszXSkgPj4gNDsKLSAgICAgICAgZWxzZSBpZiAoaG9yKQotICAgICAgICAgICAgZmlyc3RQaGFzZVsxXSA+Pj0gKDIraG9yKTsKLQotICAgICAgICBpZiAoIXZlciAmJiBBICYmIEIpCi0gICAgICAgICAgICBmaXJzdFBoYXNlWzRdID0gKGFbMF0rYVsxXSthWzJdK2FbM10tYlswXS1iWzFdLWJbMl0tYlszXSkgPj4gNDsKLSAgICAgICAgZWxzZSBpZiAodmVyKQotICAgICAgICAgICAgZmlyc3RQaGFzZVs0XSA+Pj0gKDIrdmVyKTsKLQotICAgICAgICBzd2l0Y2ggKGopCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICBmaXJzdFBoYXNlWzBdID4+PSAzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgZmlyc3RQaGFzZVswXSA+Pj0gNDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgIC8qIGFwcHJveGltYXRlIChmaXJzdFBoYXNlWzBdKjQvMyk+PjUgKi8KLSAgICAgICAgICAgICAgICBmaXJzdFBoYXNlWzBdID0gKDIxICogZmlyc3RQaGFzZVswXSkgPj4gOTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDogLyogNCAqLwotICAgICAgICAgICAgICAgIGZpcnN0UGhhc2VbMF0gPj49IDU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIFRyYW5zZm9ybShmaXJzdFBoYXNlKTsKLQotICAgICAgICBwRGF0YSA9IGRhdGEgKyAyNTYgKyBjb21wKjY0OwotICAgICAgICBmb3IgKGkgPSAwLCBwVG1wID0gZmlyc3RQaGFzZTsgaSA8IDY0OykKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gcFRtcFsoaSAmIDB4Nyk+PjFdOwotICAgICAgICAgICAgLypsaW50IC1lNzM0IENMSVAxIG1hY3JvIHJlc3VsdHMgaW4gdmFsdWUgdGhhdCBmaXRzIGludG8gOCBiaXRzICovCi0gICAgICAgICAgICAqcERhdGErKyA9IENMSVAxKHRtcCk7Ci0gICAgICAgICAgICAvKmxpbnQgK2U3MzQgKi8KLQotICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgaWYgKCEoaSAmIDB4RikpCi0gICAgICAgICAgICAgICAgcFRtcCArPSA0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyogaW5jcmVtZW50IHBvaW50ZXJzIGZvciBjciAqLwotICAgICAgICBtYlBvcyArPSB3aWR0aCAqIGhlaWdodCAqIDY0OwotICAgIH0KLQotICAgIGgyNjRic2RXcml0ZU1hY3JvYmxvY2soY3VyckltYWdlLCBkYXRhKTsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6IFRyYW5zZm9ybQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBTaW1wbGlmaWVkIHRyYW5zZm9ybSwgYXNzdW1pbmcgdGhhdCBvbmx5IGRjIGNvbXBvbmVudCBhbmQgbG93ZXN0Ci0gICAgICAgICAgICBob3Jpem9udGFsIGFuZCBsb3dlc3QgdmVydGljYWwgY29tcG9uZW50IG1heSBiZSBub24temVybwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIFRyYW5zZm9ybShpMzIgKmRhdGEpCi17Ci0KLSAgICB1MzIgY29sOwotICAgIGkzMiB0bXAwLCB0bXAxOwotCi0gICAgaWYgKCFkYXRhWzFdICYmICFkYXRhWzRdKQotICAgIHsKLSAgICAgICAgZGF0YVsxXSAgPSBkYXRhWzJdICA9IGRhdGFbM10gID0gZGF0YVs0XSAgPSBkYXRhWzVdICA9Ci0gICAgICAgIGRhdGFbNl0gID0gZGF0YVs3XSAgPSBkYXRhWzhdICA9IGRhdGFbOV0gID0gZGF0YVsxMF0gPQotICAgICAgICBkYXRhWzExXSA9IGRhdGFbMTJdID0gZGF0YVsxM10gPSBkYXRhWzE0XSA9IGRhdGFbMTVdID0gZGF0YVswXTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvKiBmaXJzdCBob3Jpem9udGFsIHRyYW5zZm9ybSBmb3Igcm93cyAwIGFuZCAxICovCi0gICAgdG1wMCA9IGRhdGFbMF07Ci0gICAgdG1wMSA9IGRhdGFbMV07Ci0gICAgZGF0YVswXSA9IHRtcDAgKyB0bXAxOwotICAgIGRhdGFbMV0gPSB0bXAwICsgKHRtcDE+PjEpOwotICAgIGRhdGFbMl0gPSB0bXAwIC0gKHRtcDE+PjEpOwotICAgIGRhdGFbM10gPSB0bXAwIC0gdG1wMTsKLQotICAgIHRtcDAgPSBkYXRhWzRdOwotICAgIGRhdGFbNV0gPSB0bXAwOwotICAgIGRhdGFbNl0gPSB0bXAwOwotICAgIGRhdGFbN10gPSB0bXAwOwotCi0gICAgLyogdGhlbiB2ZXJ0aWNhbCB0cmFuc2Zvcm0gKi8KLSAgICBmb3IgKGNvbCA9IDQ7IGNvbC0tOyBkYXRhKyspCi0gICAgewotICAgICAgICB0bXAwID0gZGF0YVswXTsKLSAgICAgICAgdG1wMSA9IGRhdGFbNF07Ci0gICAgICAgIGRhdGFbMF0gPSB0bXAwICsgdG1wMTsKLSAgICAgICAgZGF0YVs0XSA9IHRtcDAgKyAodG1wMT4+MSk7Ci0gICAgICAgIGRhdGFbOF0gPSB0bXAwIC0gKHRtcDE+PjEpOwotICAgICAgICBkYXRhWzEyXSA9IHRtcDAgLSB0bXAxOwotICAgIH0KLQotfQotLypsaW50ICtlNzAyICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb25jZWFsLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29uY2VhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTM0NjcwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9jb25jZWFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX0NPTkNFQUxfSAotI2RlZmluZSBIMjY0U1dERUNfQ09OQ0VBTF9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgotI2luY2x1ZGUgImgyNjRic2Rfc3RvcmFnZS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RDb25jZWFsKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIGltYWdlX3QgKmN1cnJJbWFnZSwgdTMyIHNsaWNlVHlwZSk7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX0NPTkNFQUxfSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29udGFpbmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfY29udGFpbmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5Yjc0YTAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2NvbnRhaW5lci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19DT05UQUlORVJfSAotI2RlZmluZSBIMjY0U1dERUNfQ09OVEFJTkVSX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc3RvcmFnZS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBTdHJpbmcgbGVuZ3RoIGZvciB0cmFjaW5nICovCi0jZGVmaW5lIEgyNjRERUNfVFJBQ0VfU1RSX0xFTiAxMDAKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIGVudW0gewotICAgICAgICBVTklOSVRJQUxJWkVELAotICAgICAgICBJTklUSUFMSVpFRCwKLSAgICAgICAgTkVXX0hFQURFUlMKLSAgICB9IGRlY1N0YXQ7Ci0KLSAgICB1MzIgcGljTnVtYmVyOwotICAgIHN0b3JhZ2VfdCBzdG9yYWdlOwotI2lmZGVmIEgyNjRERUNfVFJBQ0UKLSAgICBjaGFyIHN0cltIMjY0REVDX1RSQUNFX1NUUl9MRU5dOwotI2VuZGlmCi19IGRlY0NvbnRhaW5lcl90OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX0RFQ0NPTlRBSU5FUl9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWJsb2NraW5nLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVibG9ja2luZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGMxZjc2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWJsb2NraW5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDE3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBoMjY0YnNkRmlsdGVyUGljdHVyZQotICAgICAgICAgIEZpbHRlclZlckx1bWFFZGdlCi0gICAgICAgICAgRmlsdGVySG9yTHVtYUVkZ2UKLSAgICAgICAgICBGaWx0ZXJIb3JMdW1hCi0gICAgICAgICAgRmlsdGVyVmVyQ2hyb21hRWRnZQotICAgICAgICAgIEZpbHRlckhvckNocm9tYUVkZ2UKLSAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWEKLSAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgKLSAgICAgICAgICBFZGdlQm91bmRhcnlTdHJlbmd0aAotICAgICAgICAgIEdldEJvdW5kYXJ5U3RyZW5ndGhzCi0gICAgICAgICAgSXNTbGljZUJvdW5kYXJ5T25MZWZ0Ci0gICAgICAgICAgSXNTbGljZUJvdW5kYXJ5T25Ub3AKLSAgICAgICAgICBHZXRNYkZpbHRlcmluZ0ZsYWdzCi0gICAgICAgICAgR2V0THVtYUVkZ2VUaHJlc2hvbGRzCi0gICAgICAgICAgR2V0Q2hyb21hRWRnZVRocmVzaG9sZHMKLSAgICAgICAgICBGaWx0ZXJMdW1hCi0gICAgICAgICAgRmlsdGVyQ2hyb21hCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLSNpbmNsdWRlICJoMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2RlYmxvY2tpbmcuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2RwYi5oIgotCi0jaWZkZWYgSDI2NERFQ19PTVhETAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogU3dpdGNoIG9mZiB0aGUgZm9sbG93aW5nIExpbnQgbWVzc2FnZXMgZm9yIHRoaXMgZmlsZToKLSAqIEluZm8gNzAxOiBTaGlmdCBsZWZ0IG9mIHNpZ25lZCBxdWFudGl0eSAoaW50KQotICogSW5mbyA3MDI6IFNoaWZ0IHJpZ2h0IG9mIHNpZ25lZCBxdWFudGl0eSAoaW50KQotICovCi0vKmxpbnQgLWU3MDEgLWU3MDIgKi8KLQotLyogYXJyYXkgb2YgYWxwaGEgdmFsdWVzLCBmcm9tIHRoZSBzdGFuZGFyZCAqLwotc3RhdGljIGNvbnN0IHU4IGFscGhhc1s1Ml0gPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw0LDQsNSw2LDcsOCw5LDEwLAotICAgIDEyLDEzLDE1LDE3LDIwLDIyLDI1LDI4LDMyLDM2LDQwLDQ1LDUwLDU2LDYzLDcxLDgwLDkwLDEwMSwxMTMsMTI3LDE0NCwxNjIsCi0gICAgMTgyLDIwMywyMjYsMjU1LDI1NX07Ci0KLS8qIGFycmF5IG9mIGJldGEgdmFsdWVzLCBmcm9tIHRoZSBzdGFuZGFyZCAqLwotc3RhdGljIGNvbnN0IHU4IGJldGFzWzUyXSA9IHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMiwyLDMsMywzLDMsNCw0LAotICAgIDQsNiw2LDcsNyw4LDgsOSw5LDEwLDEwLDExLDExLDEyLDEyLDEzLDEzLDE0LDE0LDE1LDE1LDE2LDE2LDE3LDE3LDE4LDE4fTsKLQotCi0KLSNpZm5kZWYgSDI2NERFQ19PTVhETAotLyogYXJyYXkgb2YgdGMwIHZhbHVlcywgZnJvbSB0aGUgc3RhbmRhcmQsIGVhY2ggdHJpcGxldCBjb3JyZXNwb25kcyB0byBhCi0gKiBjb2x1bW4gaW4gdGhlIHRhYmxlLiBJbmRleGluZyBnb2VzIGFzIHRjMFtpbmRleEFdW2JTLTFdICovCi1zdGF0aWMgY29uc3QgdTggdGMwWzUyXVszXSA9IHsKLSAgICB7MCwwLDB9LHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sCi0gICAgezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LHswLDAsMH0sezAsMCwwfSx7MCwwLDB9LAotICAgIHswLDAsMH0sezAsMCwxfSx7MCwwLDF9LHswLDAsMX0sezAsMCwxfSx7MCwxLDF9LHswLDEsMX0sezEsMSwxfSwKLSAgICB7MSwxLDF9LHsxLDEsMX0sezEsMSwxfSx7MSwxLDJ9LHsxLDEsMn0sezEsMSwyfSx7MSwxLDJ9LHsxLDIsM30sCi0gICAgezEsMiwzfSx7MiwyLDN9LHsyLDIsNH0sezIsMyw0fSx7MiwzLDR9LHszLDMsNX0sezMsNCw2fSx7Myw0LDZ9LAotICAgIHs0LDUsN30sezQsNSw4fSx7NCw2LDl9LHs1LDcsMTB9LHs2LDgsMTF9LHs2LDgsMTN9LHs3LDEwLDE0fSx7OCwxMSwxNn0sCi0gICAgezksMTIsMTh9LHsxMCwxMywyMH0sezExLDE1LDIzfSx7MTMsMTcsMjV9Ci19OwotI2Vsc2UKLS8qIGFycmF5IG9mIHRjMCB2YWx1ZXMsIGZyb20gdGhlIHN0YW5kYXJkLCBlYWNoIHRyaXBsZXQgY29ycmVzcG9uZHMgdG8gYQotICogY29sdW1uIGluIHRoZSB0YWJsZS4gSW5kZXhpbmcgZ29lcyBhcyB0YzBbaW5kZXhBXVtiU10gKi8KLXN0YXRpYyBjb25zdCB1OCB0YzBbNTJdWzVdID0gewotICAgIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwKLSAgICB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sCi0gICAgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LAotICAgIHswLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwfSwKLSAgICB7MCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAxLCAwfSwgezAsIDAsIDAsIDEsIDB9LCB7MCwgMCwgMCwgMSwgMH0sCi0gICAgezAsIDAsIDAsIDEsIDB9LCB7MCwgMCwgMSwgMSwgMH0sIHswLCAwLCAxLCAxLCAwfSwgezAsIDEsIDEsIDEsIDB9LAotICAgIHswLCAxLCAxLCAxLCAwfSwgezAsIDEsIDEsIDEsIDB9LCB7MCwgMSwgMSwgMSwgMH0sIHswLCAxLCAxLCAyLCAwfSwKLSAgICB7MCwgMSwgMSwgMiwgMH0sIHswLCAxLCAxLCAyLCAwfSwgezAsIDEsIDEsIDIsIDB9LCB7MCwgMSwgMiwgMywgMH0sCi0gICAgezAsIDEsIDIsIDMsIDB9LCB7MCwgMiwgMiwgMywgMH0sIHswLCAyLCAyLCA0LCAwfSwgezAsIDIsIDMsIDQsIDB9LAotICAgIHswLCAyLCAzLCA0LCAwfSwgezAsIDMsIDMsIDUsIDB9LCB7MCwgMywgNCwgNiwgMH0sIHswLCAzLCA0LCA2LCAwfSwKLSAgICB7MCwgNCwgNSwgNywgMH0sIHswLCA0LCA1LCA4LCAwfSwgezAsIDQsIDYsIDksIDB9LCB7MCwgNSwgNywgMTAsIDB9LAotICAgIHswLCA2LCA4LCAxMSwgMH0sIHswLCA2LCA4LCAxMywgMH0sIHswLCA3LCAxMCwgMTQsIDB9LAotICAgIHswLCA4LCAxMSwgMTYsIDB9LCB7MCwgOSwgMTIsIDE4LCAwfSwgezAsIDEwLCAxMywgMjAsIDB9LAotICAgIHswLCAxMSwgMTUsIDIzLCAwfSwgezAsIDEzLCAxNywgMjUsIDB9Ci19OwotI2VuZGlmCi0KLQotI2lmbmRlZiBIMjY0REVDX09NWERMCi0vKiBtYXBwaW5nIG9mIHJhc3RlciBzY2FuIGJsb2NrIGluZGV4IHRvIDR4NCBibG9jayBpbmRleCAqLwotc3RhdGljIGNvbnN0IHUzMiBtYjR4NEluZGV4WzE2XSA9Ci0gICAgezAsIDEsIDQsIDUsIDIsIDMsIDYsIDcsIDgsIDksIDEyLCAxMywgMTAsIDExLCAxNCwgMTV9OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY29uc3QgdTggKnRjMDsKLSAgICB1MzIgYWxwaGE7Ci0gICAgdTMyIGJldGE7Ci19IGVkZ2VUaHJlc2hvbGRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHUzMiB0b3A7Ci0gICAgdTMyIGxlZnQ7Ci19IGJTX3Q7Ci0KLWVudW0geyBUT1AgPSAwLCBMRUZUID0gMSwgSU5ORVIgPSAyIH07Ci0jZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLwotCi0jZGVmaW5lIEZJTFRFUl9MRUZUX0VER0UgICAgMHgwNAotI2RlZmluZSBGSUxURVJfVE9QX0VER0UgICAgIDB4MDIKLSNkZWZpbmUgRklMVEVSX0lOTkVSX0VER0UgICAweDAxCi0KLQotLyogY2xpcHBpbmcgdGFibGUgZGVmaW5lZCBpbiBpbnRyYV9wcmVkaWN0aW9uLmMgKi8KLWV4dGVybiBjb25zdCB1OCBoMjY0YnNkQ2xpcFtdOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iU3RvcmFnZV90ICptYjEsIHUzMiBpMSwgdTMyIGkyKTsKLQotI2lmbmRlZiBIMjY0REVDX09NWERMCi1zdGF0aWMgdTMyIEVkZ2VCb3VuZGFyeVN0cmVuZ3RoKG1iU3RvcmFnZV90ICptYjEsIG1iU3RvcmFnZV90ICptYjIsCi0gICAgdTMyIGkxLCB1MzIgaTIpOwotI2Vsc2UKLXN0YXRpYyB1MzIgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYlN0b3JhZ2VfdCAqbWIxLCB1MzIgaTEsIHUzMiBpMik7Ci1zdGF0aWMgdTMyIEVkZ2VCb3VuZGFyeVN0cmVuZ3RoTGVmdChtYlN0b3JhZ2VfdCAqbWIxLCBtYlN0b3JhZ2VfdCAqbWIyKTsKLXN0YXRpYyB1MzIgRWRnZUJvdW5kYXJ5U3RyZW5ndGhUb3AobWJTdG9yYWdlX3QgKm1iMSwgbWJTdG9yYWdlX3QgKm1iMik7Ci0jZW5kaWYKLQotc3RhdGljIHUzMiBJc1NsaWNlQm91bmRhcnlPbkxlZnQobWJTdG9yYWdlX3QgKm1iKTsKLQotc3RhdGljIHUzMiBJc1NsaWNlQm91bmRhcnlPblRvcChtYlN0b3JhZ2VfdCAqbWIpOwotCi1zdGF0aWMgdTMyIEdldE1iRmlsdGVyaW5nRmxhZ3MobWJTdG9yYWdlX3QgKm1iKTsKLQotI2lmbmRlZiBIMjY0REVDX09NWERMCi0KLXN0YXRpYyB1MzIgR2V0Qm91bmRhcnlTdHJlbmd0aHMobWJTdG9yYWdlX3QgKm1iLCBiU190ICpicywgdTMyIGZsYWdzKTsKLQotc3RhdGljIHZvaWQgRmlsdGVyTHVtYSh1OCAqZGF0YSwgYlNfdCAqYlMsIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKLSAgICAgICAgdTMyIGltYWdlV2lkdGgpOwotCi1zdGF0aWMgdm9pZCBGaWx0ZXJDaHJvbWEodTggKmNiLCB1OCAqY3IsIGJTX3QgKmJTLCBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCi0gICAgICAgIHUzMiBpbWFnZVdpZHRoKTsKLQotc3RhdGljIHZvaWQgRmlsdGVyVmVyTHVtYUVkZ2UoIHU4ICpkYXRhLCB1MzIgYlMsIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKLSAgICAgICAgdTMyIGltYWdlV2lkdGgpOwotc3RhdGljIHZvaWQgRmlsdGVySG9yTHVtYUVkZ2UoIHU4ICpkYXRhLCB1MzIgYlMsIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKLSAgICAgICAgaTMyIGltYWdlV2lkdGgpOwotc3RhdGljIHZvaWQgRmlsdGVySG9yTHVtYSggdTggKmRhdGEsIHUzMiBiUywgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAotICAgICAgICBpMzIgaW1hZ2VXaWR0aCk7Ci0KLXN0YXRpYyB2b2lkIEZpbHRlclZlckNocm9tYUVkZ2UoIHU4ICpkYXRhLCB1MzIgYlMsIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKLSAgdTMyIGltYWdlV2lkdGgpOwotc3RhdGljIHZvaWQgRmlsdGVySG9yQ2hyb21hRWRnZSggdTggKmRhdGEsIHUzMiBiUywgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAotICBpMzIgaW1hZ2VXaWR0aCk7Ci1zdGF0aWMgdm9pZCBGaWx0ZXJIb3JDaHJvbWEoIHU4ICpkYXRhLCB1MzIgYlMsIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKLSAgaTMyIGltYWdlV2lkdGgpOwotCi1zdGF0aWMgdm9pZCBHZXRMdW1hRWRnZVRocmVzaG9sZHMoCi0gIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKLSAgbWJTdG9yYWdlX3QgKm1iLAotICB1MzIgZmlsdGVyaW5nRmxhZ3MpOwotCi1zdGF0aWMgdm9pZCBHZXRDaHJvbWFFZGdlVGhyZXNob2xkcygKLSAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAotICBtYlN0b3JhZ2VfdCAqbWIsCi0gIHUzMiBmaWx0ZXJpbmdGbGFncywKLSAgaTMyIGNocm9tYVFwSW5kZXhPZmZzZXQpOwotCi0jZWxzZSAvKiBIMjY0REVDX09NWERMICovCi0KLXN0YXRpYyB1MzIgR2V0Qm91bmRhcnlTdHJlbmd0aHMobWJTdG9yYWdlX3QgKm1iLCB1OCAoKmJzKVsxNl0sIHUzMiBmbGFncyk7Ci0KLXN0YXRpYyB2b2lkIEdldEx1bWFFZGdlVGhyZXNob2xkcygKLSAgICBtYlN0b3JhZ2VfdCAqbWIsCi0gICAgdTggKCphbHBoYSlbMl0sCi0gICAgdTggKCpiZXRhKVsyXSwKLSAgICB1OCAoKnRocmVzaG9sZClbMTZdLAotICAgIHU4ICgqYnMpWzE2XSwKLSAgICB1MzIgZmlsdGVyaW5nRmxhZ3MgKTsKLQotc3RhdGljIHZvaWQgR2V0Q2hyb21hRWRnZVRocmVzaG9sZHMoCi0gICAgbWJTdG9yYWdlX3QgKm1iLAotICAgIHU4ICgqYWxwaGEpWzJdLAotICAgIHU4ICgqYmV0YSlbMl0sCi0gICAgdTggKCp0aHJlc2hvbGQpWzhdLAotICAgIHU4ICgqYnMpWzE2XSwKLSAgICB1MzIgZmlsdGVyaW5nRmxhZ3MsCi0gICAgaTMyIGNocm9tYVFwSW5kZXhPZmZzZXQpOwotCi0jZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IElzU2xpY2VCb3VuZGFyeU9uTGVmdAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgdGhlcmUgaXMgYSBzbGljZSBib3VuZGFyeSBvbiB0aGUgbGVmdCBzaWRlCi0gICAgICAgICAgICBvZiBhIG1hY3JvYmxvY2suCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgSXNTbGljZUJvdW5kYXJ5T25MZWZ0KG1iU3RvcmFnZV90ICptYikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChtYiAmJiBtYi0+bWJBKTsKLQotICAgIGlmIChtYi0+c2xpY2VJZCAhPSBtYi0+bWJBLT5zbGljZUlkKQotICAgICAgICByZXR1cm4oSEFOVFJPX1RSVUUpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuKEhBTlRST19GQUxTRSk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBJc1NsaWNlQm91bmRhcnlPblRvcAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgdGhlcmUgaXMgYSBzbGljZSBib3VuZGFyeSBhYm92ZSB0aGUKLSAgICAgICAgICAgIGN1cnJlbnQgbWFjcm9ibG9jay4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXUzMiBJc1NsaWNlQm91bmRhcnlPblRvcChtYlN0b3JhZ2VfdCAqbWIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQobWIgJiYgbWItPm1iQik7Ci0KLSAgICBpZiAobWItPnNsaWNlSWQgIT0gbWItPm1iQi0+c2xpY2VJZCkKLSAgICAgICAgcmV0dXJuKEhBTlRST19UUlVFKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybihIQU5UUk9fRkFMU0UpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogR2V0TWJGaWx0ZXJpbmdGbGFncwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgRnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIGVkZ2VzIG9mIGEgbWFjcm9ibG9jayBoYXMgdG8gYmUKLSAgICAgICAgICBmaWx0ZXJlZC4gT3V0cHV0IGlzIGEgYml0LXdpc2UgT1Igb2YgRklMVEVSX0xFRlRfRURHRSwKLSAgICAgICAgICBGSUxURVJfVE9QX0VER0UgYW5kIEZJTFRFUl9JTk5FUl9FREdFLCBkZXBlbmRpbmcgb24gd2hpY2ggZWRnZXMKLSAgICAgICAgICBzaGFsbCBiZSBmaWx0ZXJlZC4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXUzMiBHZXRNYkZpbHRlcmluZ0ZsYWdzKG1iU3RvcmFnZV90ICptYikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgZmxhZ3MgPSAwOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQobWIpOwotCi0gICAgLyogbm90aGluZyB3aWxsIGJlIGZpbHRlcmVkIGlmIGRpc2FibGVEZWJsb2NraW5nRmlsdGVySWRjID09IDEgKi8KLSAgICBpZiAobWItPmRpc2FibGVEZWJsb2NraW5nRmlsdGVySWRjICE9IDEpCi0gICAgewotICAgICAgICBmbGFncyB8PSBGSUxURVJfSU5ORVJfRURHRTsKLQotICAgICAgICAvKiBmaWx0ZXJMZWZ0TWJFZGdlRmxhZywgbGVmdCBtYiBpcyBNQl9BICovCi0gICAgICAgIGlmIChtYi0+bWJBICYmCi0gICAgICAgICAgICAoKG1iLT5kaXNhYmxlRGVibG9ja2luZ0ZpbHRlcklkYyAhPSAyKSB8fAotICAgICAgICAgICAgICFJc1NsaWNlQm91bmRhcnlPbkxlZnQobWIpKSkKLSAgICAgICAgICAgIGZsYWdzIHw9IEZJTFRFUl9MRUZUX0VER0U7Ci0KLSAgICAgICAgLyogZmlsdGVyVG9wTWJFZGdlRmxhZyAqLwotICAgICAgICBpZiAobWItPm1iQiAmJgotICAgICAgICAgICAgKChtYi0+ZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgIT0gMikgfHwKLSAgICAgICAgICAgICAhSXNTbGljZUJvdW5kYXJ5T25Ub3AobWIpKSkKLSAgICAgICAgICAgIGZsYWdzIHw9IEZJTFRFUl9UT1BfRURHRTsKLSAgICB9Ci0KLSAgICByZXR1cm4oZmxhZ3MpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSW5uZXJCb3VuZGFyeVN0cmVuZ3RoCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBib3VuZGFyeSBzdHJlbmd0aCB2YWx1ZSBicyBmb3IgYW4gaW5uZXIKLSAgICAgICAgICAgIGVkZ2Ugb2YgYSBtYWNyb2Jsb2NrLiBNYWNyb2Jsb2NrIHR5cGUgaXMgY2hlY2tlZCBiZWZvcmUgdGhpcyBpcwotICAgICAgICAgICAgY2FsbGVkIC0+IG5vIGludHJhIG1iIGNvbmRpdGlvbiBoZXJlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIElubmVyQm91bmRhcnlTdHJlbmd0aChtYlN0b3JhZ2VfdCAqbWIxLCB1MzIgaW5kMSwgdTMyIGluZDIpCi17Ci0gICAgaTMyIHRtcDEsIHRtcDI7Ci0gICAgaTMyIG12MSwgbXYyLCBtdjMsIG12NDsKLQotICAgIHRtcDEgPSBtYjEtPnRvdGFsQ29lZmZbaW5kMV07Ci0gICAgdG1wMiA9IG1iMS0+dG90YWxDb2VmZltpbmQyXTsKLSAgICBtdjEgPSBtYjEtPm12W2luZDFdLmhvcjsKLSAgICBtdjIgPSBtYjEtPm12W2luZDJdLmhvcjsKLSAgICBtdjMgPSBtYjEtPm12W2luZDFdLnZlcjsKLSAgICBtdjQgPSBtYjEtPm12W2luZDJdLnZlcjsKLQotICAgIGlmICh0bXAxIHx8IHRtcDIpCi0gICAgewotICAgICAgICByZXR1cm4gMjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIChBQlMobXYxIC0gbXYyKSA+PSA0KSB8fCAoQUJTKG12MyAtIG12NCkgPj0gNCkgfHwKLSAgICAgICAgICAgICAgKG1iMS0+cmVmQWRkcltpbmQxID4+IDJdICE9IG1iMS0+cmVmQWRkcltpbmQyID4+IDJdKSApCi0gICAgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gMDsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBJbm5lckJvdW5kYXJ5U3RyZW5ndGgyCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBib3VuZGFyeSBzdHJlbmd0aCB2YWx1ZSBicyBmb3IgYW4gaW5uZXIKLSAgICAgICAgICAgIGVkZ2Ugb2YgYSBtYWNyb2Jsb2NrLiBUaGUgZnVuY3Rpb24gaXMgdGhlIHNhbWUgYXMKLSAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aCBidXQgd2l0aG91dCBjaGVja2luZyB0b3RhbENvZWZmLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIElubmVyQm91bmRhcnlTdHJlbmd0aDIobWJTdG9yYWdlX3QgKm1iMSwgdTMyIGluZDEsIHUzMiBpbmQyKQotewotICAgIGkzMiB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OwotCi0gICAgdG1wMSA9IG1iMS0+bXZbaW5kMV0uaG9yOwotICAgIHRtcDIgPSBtYjEtPm12W2luZDJdLmhvcjsKLSAgICB0bXAzID0gbWIxLT5tdltpbmQxXS52ZXI7Ci0gICAgdG1wNCA9IG1iMS0+bXZbaW5kMl0udmVyOwotCi0gICAgaWYgKCAoQUJTKHRtcDEgLSB0bXAyKSA+PSA0KSB8fCAoQUJTKHRtcDMgLSB0bXA0KSA+PSA0KSB8fAotICAgICAgICAgKG1iMS0+cmVmQWRkcltpbmQxID4+IDJdICE9IG1iMS0+cmVmQWRkcltpbmQyID4+IDJdKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAwOwotfQotI2lmbmRlZiBIMjY0REVDX09NWERMCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBib3VuZGFyeSBzdHJlbmd0aCB2YWx1ZSBicyBmb3IgbGVmdC0gb3IKLSAgICAgICAgICAgIHRvcC1tb3N0IGVkZ2Ugb2YgYSBtYWNyb2Jsb2NrLiBNYWNyb2Jsb2NrIHR5cGVzIGFyZSBjaGVja2VkCi0gICAgICAgICAgICBiZWZvcmUgdGhpcyBpcyBjYWxsZWQgLT4gbm8gaW50cmEgbWIgY29uZGl0aW9ucyBoZXJlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIEVkZ2VCb3VuZGFyeVN0cmVuZ3RoKG1iU3RvcmFnZV90ICptYjEsIG1iU3RvcmFnZV90ICptYjIsCi0gICAgdTMyIGluZDEsIHUzMiBpbmQyKQotewotCi0gICAgaWYgKG1iMS0+dG90YWxDb2VmZltpbmQxXSB8fCBtYjItPnRvdGFsQ29lZmZbaW5kMl0pCi0gICAgewotICAgICAgICByZXR1cm4gMjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKG1iMS0+cmVmQWRkcltpbmQxID4+IDJdICE9IG1iMi0+cmVmQWRkcltpbmQyID4+IDJdKSB8fAotICAgICAgICAgICAgIChBQlMobWIxLT5tdltpbmQxXS5ob3IgLSBtYjItPm12W2luZDJdLmhvcikgPj0gNCkgfHwKLSAgICAgICAgICAgICAoQUJTKG1iMS0+bXZbaW5kMV0udmVyIC0gbWIyLT5tdltpbmQyXS52ZXIpID49IDQpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLSNlbHNlIC8qIEgyNjRERUNfT01YREwgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBFZGdlQm91bmRhcnlTdHJlbmd0aFRvcAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYm91bmRhcnkgc3RyZW5ndGggdmFsdWUgYnMgZm9yCi0gICAgICAgICAgICB0b3AtbW9zdCBlZGdlIG9mIGEgbWFjcm9ibG9jay4gTWFjcm9ibG9jayB0eXBlcyBhcmUgY2hlY2tlZAotICAgICAgICAgICAgYmVmb3JlIHRoaXMgaXMgY2FsbGVkIC0+IG5vIGludHJhIG1iIGNvbmRpdGlvbnMgaGVyZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXUzMiBFZGdlQm91bmRhcnlTdHJlbmd0aFRvcChtYlN0b3JhZ2VfdCAqbWIxLCBtYlN0b3JhZ2VfdCAqbWIyKQotewotICAgIHUzMiB0b3BCcyA9IDA7Ci0gICAgdTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQ7Ci0KLSAgICB0bXAxID0gbWIxLT50b3RhbENvZWZmWzBdOwotICAgIHRtcDIgPSBtYjItPnRvdGFsQ29lZmZbMTBdOwotICAgIHRtcDMgPSBtYjEtPnRvdGFsQ29lZmZbMV07Ci0gICAgdG1wNCA9IG1iMi0+dG90YWxDb2VmZlsxMV07Ci0gICAgaWYgKHRtcDEgfHwgdG1wMikKLSAgICB7Ci0gICAgICAgIHRvcEJzID0gMjw8MDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKEFCUyhtYjEtPm12WzBdLmhvciAtIG1iMi0+bXZbMTBdLmhvcikgPj0gNCkgfHwKLSAgICAgICAgICAgICAoQUJTKG1iMS0+bXZbMF0udmVyIC0gbWIyLT5tdlsxMF0udmVyKSA+PSA0KSB8fAotICAgICAgICAgICAgIChtYjEtPnJlZkFkZHJbMF0gIT0gbWIyLT5yZWZBZGRyWzEwID4+IDJdKSkKLSAgICB7Ci0gICAgICAgIHRvcEJzID0gMTw8MDsKLSAgICB9Ci0gICAgdG1wMSA9IG1iMS0+dG90YWxDb2VmZls0XTsKLSAgICB0bXAyID0gbWIyLT50b3RhbENvZWZmWzE0XTsKLSAgICBpZiAodG1wMyB8fCB0bXA0KQotICAgIHsKLSAgICAgICAgdG9wQnMgKz0gMjw8ODsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKEFCUyhtYjEtPm12WzFdLmhvciAtIG1iMi0+bXZbMTFdLmhvcikgPj0gNCkgfHwKLSAgICAgICAgICAgICAoQUJTKG1iMS0+bXZbMV0udmVyIC0gbWIyLT5tdlsxMV0udmVyKSA+PSA0KSB8fAotICAgICAgICAgICAgIChtYjEtPnJlZkFkZHJbMF0gIT0gbWIyLT5yZWZBZGRyWzExID4+IDJdKSkKLSAgICB7Ci0gICAgICAgIHRvcEJzICs9IDE8PDg7Ci0gICAgfQotICAgIHRtcDMgPSBtYjEtPnRvdGFsQ29lZmZbNV07Ci0gICAgdG1wNCA9IG1iMi0+dG90YWxDb2VmZlsxNV07Ci0gICAgaWYgKHRtcDEgfHwgdG1wMikKLSAgICB7Ci0gICAgICAgIHRvcEJzICs9IDI8PDE2OwotICAgIH0KLSAgICBlbHNlIGlmICgoQUJTKG1iMS0+bXZbNF0uaG9yIC0gbWIyLT5tdlsxNF0uaG9yKSA+PSA0KSB8fAotICAgICAgICAgICAgIChBQlMobWIxLT5tdls0XS52ZXIgLSBtYjItPm12WzE0XS52ZXIpID49IDQpIHx8Ci0gICAgICAgICAgICAgKG1iMS0+cmVmQWRkcls0ID4+IDJdICE9IG1iMi0+cmVmQWRkclsxNCA+PiAyXSkpCi0gICAgewotICAgICAgICB0b3BCcyArPSAxPDwxNjsKLSAgICB9Ci0gICAgaWYgKHRtcDMgfHwgdG1wNCkKLSAgICB7Ci0gICAgICAgIHRvcEJzICs9IDI8PDI0OwotICAgIH0KLSAgICBlbHNlIGlmICgoQUJTKG1iMS0+bXZbNV0uaG9yIC0gbWIyLT5tdlsxNV0uaG9yKSA+PSA0KSB8fAotICAgICAgICAgICAgIChBQlMobWIxLT5tdls1XS52ZXIgLSBtYjItPm12WzE1XS52ZXIpID49IDQpIHx8Ci0gICAgICAgICAgICAgKG1iMS0+cmVmQWRkcls1ID4+IDJdICE9IG1iMi0+cmVmQWRkclsxNSA+PiAyXSkpCi0gICAgewotICAgICAgICB0b3BCcyArPSAxPDwyNDsKLSAgICB9Ci0KLSAgICByZXR1cm4gdG9wQnM7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRWRnZUJvdW5kYXJ5U3RyZW5ndGhMZWZ0Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBib3VuZGFyeSBzdHJlbmd0aCB2YWx1ZSBicyBmb3IgbGVmdC0KLSAgICAgICAgICAgIGVkZ2Ugb2YgYSBtYWNyb2Jsb2NrLiBNYWNyb2Jsb2NrIHR5cGVzIGFyZSBjaGVja2VkCi0gICAgICAgICAgICBiZWZvcmUgdGhpcyBpcyBjYWxsZWQgLT4gbm8gaW50cmEgbWIgY29uZGl0aW9ucyBoZXJlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIEVkZ2VCb3VuZGFyeVN0cmVuZ3RoTGVmdChtYlN0b3JhZ2VfdCAqbWIxLCBtYlN0b3JhZ2VfdCAqbWIyKQotewotICAgIHUzMiBsZWZ0QnMgPSAwOwotICAgIHUzMiB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OwotCi0gICAgdG1wMSA9IG1iMS0+dG90YWxDb2VmZlswXTsKLSAgICB0bXAyID0gbWIyLT50b3RhbENvZWZmWzVdOwotICAgIHRtcDMgPSBtYjEtPnRvdGFsQ29lZmZbMl07Ci0gICAgdG1wNCA9IG1iMi0+dG90YWxDb2VmZls3XTsKLQotICAgIGlmICh0bXAxIHx8IHRtcDIpCi0gICAgewotICAgICAgICBsZWZ0QnMgPSAyPDwwOwotICAgIH0KLSAgICBlbHNlIGlmICgoQUJTKG1iMS0+bXZbMF0uaG9yIC0gbWIyLT5tdls1XS5ob3IpID49IDQpIHx8Ci0gICAgICAgICAgICAgKEFCUyhtYjEtPm12WzBdLnZlciAtIG1iMi0+bXZbNV0udmVyKSA+PSA0KSB8fAotICAgICAgICAgICAgIChtYjEtPnJlZkFkZHJbMF0gIT0gbWIyLT5yZWZBZGRyWzUgPj4gMl0pKQotICAgIHsKLSAgICAgICAgbGVmdEJzID0gMTw8MDsKLSAgICB9Ci0gICAgdG1wMSA9IG1iMS0+dG90YWxDb2VmZls4XTsKLSAgICB0bXAyID0gbWIyLT50b3RhbENvZWZmWzEzXTsKLSAgICBpZiAodG1wMyB8fCB0bXA0KQotICAgIHsKLSAgICAgICAgbGVmdEJzICs9IDI8PDg7Ci0gICAgfQotICAgIGVsc2UgaWYgKChBQlMobWIxLT5tdlsyXS5ob3IgLSBtYjItPm12WzddLmhvcikgPj0gNCkgfHwKLSAgICAgICAgICAgICAoQUJTKG1iMS0+bXZbMl0udmVyIC0gbWIyLT5tdls3XS52ZXIpID49IDQpIHx8Ci0gICAgICAgICAgICAgKG1iMS0+cmVmQWRkclswXSAhPSBtYjItPnJlZkFkZHJbNyA+PiAyXSkpCi0gICAgewotICAgICAgICBsZWZ0QnMgKz0gMTw8ODsKLSAgICB9Ci0gICAgdG1wMyA9IG1iMS0+dG90YWxDb2VmZlsxMF07Ci0gICAgdG1wNCA9IG1iMi0+dG90YWxDb2VmZlsxNV07Ci0gICAgaWYgKHRtcDEgfHwgdG1wMikKLSAgICB7Ci0gICAgICAgIGxlZnRCcyArPSAyPDwxNjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKEFCUyhtYjEtPm12WzhdLmhvciAtIG1iMi0+bXZbMTNdLmhvcikgPj0gNCkgfHwKLSAgICAgICAgICAgICAoQUJTKG1iMS0+bXZbOF0udmVyIC0gbWIyLT5tdlsxM10udmVyKSA+PSA0KSB8fAotICAgICAgICAgICAgIChtYjEtPnJlZkFkZHJbOCA+PiAyXSAhPSBtYjItPnJlZkFkZHJbMTMgPj4gMl0pKQotICAgIHsKLSAgICAgICAgbGVmdEJzICs9IDE8PDE2OwotICAgIH0KLSAgICBpZiAodG1wMyB8fCB0bXA0KQotICAgIHsKLSAgICAgICAgbGVmdEJzICs9IDI8PDI0OwotICAgIH0KLSAgICBlbHNlIGlmICgoQUJTKG1iMS0+bXZbMTBdLmhvciAtIG1iMi0+bXZbMTVdLmhvcikgPj0gNCkgfHwKLSAgICAgICAgICAgICAoQUJTKG1iMS0+bXZbMTBdLnZlciAtIG1iMi0+bXZbMTVdLnZlcikgPj0gNCkgfHwKLSAgICAgICAgICAgICAobWIxLT5yZWZBZGRyWzEwID4+IDJdICE9IG1iMi0+cmVmQWRkclsxNSA+PiAyXSkpCi0gICAgewotICAgICAgICBsZWZ0QnMgKz0gMTw8MjQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIGxlZnRCczsKLX0KLSNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RGaWx0ZXJQaWN0dXJlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGRlYmxvY2tpbmcgZmlsdGVyaW5nIGZvciBhIHBpY3R1cmUuIEZpbHRlciBkb2VzIG5vdCBjb3B5Ci0gICAgICAgICAgdGhlIG9yaWdpbmFsIHBpY3R1cmUgYW55d2hlcmUgYnV0IGZpbHRlcmluZyBpcyBwZXJmb3JtZWQgZGlyZWN0bHkKLSAgICAgICAgICBvbiB0aGUgb3JpZ2luYWwgaW1hZ2UuIFBhcmFtZXRlcnMgY29udHJvbGxpbmcgdGhlIGZpbHRlcmluZyBwcm9jZXNzCi0gICAgICAgICAgYXJlIGNvbXB1dGVkIGJhc2VkIG9uIGluZm9ybWF0aW9uIGluIG1hY3JvYmxvY2sgc3RydWN0dXJlcyBvZiB0aGUKLSAgICAgICAgICBmaWx0ZXJlZCBtYWNyb2Jsb2NrLCBtYWNyb2Jsb2NrIGFib3ZlIGFuZCBtYWNyb2Jsb2NrIG9uIHRoZSBsZWZ0IG9mCi0gICAgICAgICAgdGhlIGZpbHRlcmVkIG9uZS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgaW1hZ2UgICAgICAgICBwb2ludGVyIHRvIGltYWdlIHRvIGJlIGZpbHRlcmVkCi0gICAgICAgICAgbWIgICAgICAgICAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgZGF0YSBzdHJ1Y3R1cmUgb2YgdGhlIHRvcC1sZWZ0Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrIG9mIHRoZSBwaWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICBpbWFnZSAgICAgICAgIGZpbHRlcmVkIGltYWdlIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZuZGVmIEgyNjRERUNfT01YREwKLXZvaWQgaDI2NGJzZEZpbHRlclBpY3R1cmUoCi0gIGltYWdlX3QgKmltYWdlLAotICBtYlN0b3JhZ2VfdCAqbWIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGZsYWdzOwotICAgIHUzMiBwaWNTaXplSW5NYnMsIG1iUm93LCBtYkNvbDsKLSAgICB1MzIgcGljV2lkdGhJbk1iczsKLSAgICB1OCAqZGF0YTsKLSAgICBtYlN0b3JhZ2VfdCAqcE1iOwotICAgIGJTX3QgYlNbMTZdOwotICAgIGVkZ2VUaHJlc2hvbGRfdCB0aHJlc2hvbGRzWzNdOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoaW1hZ2UpOwotICAgIEFTU0VSVChtYik7Ci0gICAgQVNTRVJUKGltYWdlLT5kYXRhKTsKLSAgICBBU1NFUlQoaW1hZ2UtPndpZHRoKTsKLSAgICBBU1NFUlQoaW1hZ2UtPmhlaWdodCk7Ci0KLSAgICBwaWNXaWR0aEluTWJzID0gaW1hZ2UtPndpZHRoOwotICAgIGRhdGEgPSBpbWFnZS0+ZGF0YTsKLSAgICBwaWNTaXplSW5NYnMgPSBwaWNXaWR0aEluTWJzICogaW1hZ2UtPmhlaWdodDsKLQotICAgIHBNYiA9IG1iOwotCi0gICAgZm9yIChtYlJvdyA9IDAsIG1iQ29sID0gMDsgbWJSb3cgPCBpbWFnZS0+aGVpZ2h0OyBwTWIrKykKLSAgICB7Ci0gICAgICAgIGZsYWdzID0gR2V0TWJGaWx0ZXJpbmdGbGFncyhwTWIpOwotCi0gICAgICAgIGlmIChmbGFncykKLSAgICAgICAgewotICAgICAgICAgICAgLyogR2V0Qm91bmRhcnlTdHJlbmd0aHMgZnVuY3Rpb24gcmV0dXJucyBub24temVybyB2YWx1ZSBpZiBhbnkgb2YKLSAgICAgICAgICAgICAqIHRoZSBiUyB2YWx1ZXMgZm9yIHRoZSBtYWNyb2Jsb2NrIGJlaW5nIHByb2Nlc3NlZCB3YXMgbm9uLXplcm8gKi8KLSAgICAgICAgICAgIGlmIChHZXRCb3VuZGFyeVN0cmVuZ3RocyhwTWIsIGJTLCBmbGFncykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogbHVtYSAqLwotICAgICAgICAgICAgICAgIEdldEx1bWFFZGdlVGhyZXNob2xkcyh0aHJlc2hvbGRzLCBwTWIsIGZsYWdzKTsKLSAgICAgICAgICAgICAgICBkYXRhID0gaW1hZ2UtPmRhdGEgKyBtYlJvdyAqIHBpY1dpZHRoSW5NYnMgKiAyNTYgKyBtYkNvbCAqIDE2OwotCi0gICAgICAgICAgICAgICAgRmlsdGVyTHVtYSgodTgqKWRhdGEsIGJTLCB0aHJlc2hvbGRzLCBwaWNXaWR0aEluTWJzKjE2KTsKLQotICAgICAgICAgICAgICAgIC8qIGNocm9tYSAqLwotICAgICAgICAgICAgICAgIEdldENocm9tYUVkZ2VUaHJlc2hvbGRzKHRocmVzaG9sZHMsIHBNYiwgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgIHBNYi0+Y2hyb21hUXBJbmRleE9mZnNldCk7Ci0gICAgICAgICAgICAgICAgZGF0YSA9IGltYWdlLT5kYXRhICsgcGljU2l6ZUluTWJzICogMjU2ICsKLSAgICAgICAgICAgICAgICAgICAgbWJSb3cgKiBwaWNXaWR0aEluTWJzICogNjQgKyBtYkNvbCAqIDg7Ci0KLSAgICAgICAgICAgICAgICBGaWx0ZXJDaHJvbWEoKHU4KilkYXRhLCBkYXRhICsgNjQqcGljU2l6ZUluTWJzLCBiUywKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZHMsIHBpY1dpZHRoSW5NYnMqOCk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1iQ29sKys7Ci0gICAgICAgIGlmIChtYkNvbCA9PSBwaWNXaWR0aEluTWJzKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYkNvbCA9IDA7Ci0gICAgICAgICAgICBtYlJvdysrOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRmlsdGVyVmVyTHVtYUVkZ2UKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRmlsdGVyIG9uZSB2ZXJ0aWNhbCA0LXBpeGVsIGx1bWEgZWRnZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgRmlsdGVyVmVyTHVtYUVkZ2UoCi0gIHU4ICpkYXRhLAotICB1MzIgYlMsCi0gIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKLSAgdTMyIGltYWdlV2lkdGgpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgaTMyIGRlbHRhLCB0YywgdG1wOwotICAgIHUzMiBpOwotICAgIHU4IHAwLCBxMCwgcDEsIHExLCBwMiwgcTI7Ci0gICAgdTMyIHRtcEZsYWc7Ci0gICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGJTICYmIGJTIDw9IDQpOwotICAgIEFTU0VSVCh0aHJlc2hvbGRzKTsKLQotICAgIGlmIChiUyA8IDQpCi0gICAgewotICAgICAgICB0YyA9IHRocmVzaG9sZHMtPnRjMFtiUy0xXTsKLSAgICAgICAgdG1wID0gdGM7Ci0gICAgICAgIGZvciAoaSA9IDQ7IGk7IGktLSwgZGF0YSArPSBpbWFnZVdpZHRoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwMSA9IGRhdGFbLTJdOyBwMCA9IGRhdGFbLTFdOwotICAgICAgICAgICAgcTAgPSBkYXRhWzBdOyBxMSA9IGRhdGFbMV07Ci0gICAgICAgICAgICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhKSAmJgotICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMS1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSAgJiYKLSAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocTEtcTApIDwgdGhyZXNob2xkcy0+YmV0YSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHAyID0gZGF0YVstM107Ci0gICAgICAgICAgICAgICAgcTIgPSBkYXRhWzJdOwotCi0gICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZClBQlMocDItcDApIDwgdGhyZXNob2xkcy0+YmV0YSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFbLTJdID0gKHU4KShwMSArIENMSVAzKC10Yyx0YywKLSAgICAgICAgICAgICAgICAgICAgICAgIChwMiArICgocDAgKyBxMCArIDEpID4+IDEpIC0gKHAxIDw8IDEpKSA+PiAxKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCsrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpQUJTKHEyLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBkYXRhWzFdID0gKHU4KShxMSArIENMSVAzKC10Yyx0YywKLSAgICAgICAgICAgICAgICAgICAgICAgIChxMiArICgocDAgKyBxMCArIDEpID4+IDEpIC0gKHExIDw8IDEpKSA+PiAxKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCsrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRlbHRhID0gQ0xJUDMoLXRtcCwgdG1wLCAoKCgocTAgLSBwMCkgPDwgMikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAocDEgLSBxMSkgKyA0KSA+PiAzKSk7Ci0KLSAgICAgICAgICAgICAgICBwMCA9IGNscFtwMCArIGRlbHRhXTsKLSAgICAgICAgICAgICAgICBxMCA9IGNscFtxMCAtIGRlbHRhXTsKLSAgICAgICAgICAgICAgICB0bXAgPSB0YzsKLSAgICAgICAgICAgICAgICBkYXRhWy0xXSA9IHAwOwotICAgICAgICAgICAgICAgIGRhdGFbIDBdID0gcTA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yIChpID0gNDsgaTsgaS0tLCBkYXRhICs9IGltYWdlV2lkdGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHAxID0gZGF0YVstMl07IHAwID0gZGF0YVstMV07Ci0gICAgICAgICAgICBxMCA9IGRhdGFbMF07IHExID0gZGF0YVsxXTsKLSAgICAgICAgICAgIGlmICggKCh1bnNpZ25lZClBQlMocDAtcTApIDwgdGhyZXNob2xkcy0+YWxwaGEpICYmCi0gICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHAxLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpICAmJgotICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhxMS1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wRmxhZyA9Ci0gICAgICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHAwLXEwKSA8ICgodGhyZXNob2xkcy0+YWxwaGEgPj4gMikgKzIpKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgICAgICAgICAgICAgIHAyID0gZGF0YVstM107Ci0gICAgICAgICAgICAgICAgcTIgPSBkYXRhWzJdOwotCi0gICAgICAgICAgICAgICAgaWYgKHRtcEZsYWcgJiYgKHVuc2lnbmVkKUFCUyhwMi1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wID0gcDEgKyBwMCArIHEwOwotICAgICAgICAgICAgICAgICAgICBkYXRhWy0xXSA9ICh1OCkoKHAyICsgMiAqIHRtcCArIHExICsgNCkgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFbLTJdID0gKHU4KSgocDIgKyB0bXAgKyAyKSA+PiAyKTsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVstM10gPSAodTgpKCgyICogZGF0YVstNF0gKyAzICogcDIgKyB0bXAgKyA0KSA+PiAzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBkYXRhWy0xXSA9ICgyICogcDEgKyBwMCArIHExICsgMikgPj4gMjsKLQotICAgICAgICAgICAgICAgIGlmICh0bXBGbGFnICYmICh1bnNpZ25lZClBQlMocTItcTApIDwgdGhyZXNob2xkcy0+YmV0YSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCA9IHAwICsgcTAgKyBxMTsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVswXSA9ICh1OCkoKHAxICsgMiAqIHRtcCArIHEyICsgNCkgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFbMV0gPSAodTgpKCh0bXAgKyBxMiArIDIpID4+IDIpOwotICAgICAgICAgICAgICAgICAgICBkYXRhWzJdID0gKHU4KSgoMiAqIGRhdGFbM10gKyAzICogcTIgKyB0bXAgKyA0KSA+PiAzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBkYXRhWzBdID0gKHU4KSgoMiAqIHExICsgcTAgKyBwMSArIDIpID4+IDIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRmlsdGVySG9yTHVtYUVkZ2UKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRmlsdGVyIG9uZSBob3Jpem9udGFsIDQtcGl4ZWwgbHVtYSBlZGdlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEZpbHRlckhvckx1bWFFZGdlKAotICB1OCAqZGF0YSwKLSAgdTMyIGJTLAotICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCi0gIGkzMiBpbWFnZVdpZHRoKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIGkzMiBkZWx0YSwgdGMsIHRtcDsKLSAgICB1MzIgaTsKLSAgICB1OCBwMCwgcTAsIHAxLCBxMSwgcDIsIHEyOwotICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChiUyA8IDQpOwotICAgIEFTU0VSVCh0aHJlc2hvbGRzKTsKLQotICAgIHRjID0gdGhyZXNob2xkcy0+dGMwW2JTLTFdOwotICAgIHRtcCA9IHRjOwotICAgIGZvciAoaSA9IDQ7IGk7IGktLSwgZGF0YSsrKQotICAgIHsKLSAgICAgICAgcDEgPSBkYXRhWy1pbWFnZVdpZHRoKjJdOyBwMCA9IGRhdGFbLWltYWdlV2lkdGhdOwotICAgICAgICBxMCA9IGRhdGFbMF07IHExID0gZGF0YVtpbWFnZVdpZHRoXTsKLSAgICAgICAgaWYgKCAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCB0aHJlc2hvbGRzLT5hbHBoYSkgJiYKLSAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMS1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSAgJiYKLSAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhxMS1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHAyID0gZGF0YVstaW1hZ2VXaWR0aCozXTsKLQotICAgICAgICAgICAgaWYgKCh1bnNpZ25lZClBQlMocDItcDApIDwgdGhyZXNob2xkcy0+YmV0YSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkYXRhWy1pbWFnZVdpZHRoKjJdID0gKHU4KShwMSArIENMSVAzKC10Yyx0YywKLSAgICAgICAgICAgICAgICAgICAgKHAyICsgKChwMCArIHEwICsgMSkgPj4gMSkgLSAocDEgPDwgMSkpID4+IDEpKTsKLSAgICAgICAgICAgICAgICB0bXArKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcTIgPSBkYXRhW2ltYWdlV2lkdGgqMl07Ci0KLSAgICAgICAgICAgIGlmICgodW5zaWduZWQpQUJTKHEyLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGF0YVtpbWFnZVdpZHRoXSA9ICh1OCkocTEgKyBDTElQMygtdGMsdGMsCi0gICAgICAgICAgICAgICAgICAgIChxMiArICgocDAgKyBxMCArIDEpID4+IDEpIC0gKHExIDw8IDEpKSA+PiAxKSk7Ci0gICAgICAgICAgICAgICAgdG1wKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlbHRhID0gQ0xJUDMoLXRtcCwgdG1wLCAoKCgocTAgLSBwMCkgPDwgMikgKwotICAgICAgICAgICAgICAgICAgICAgIChwMSAtIHExKSArIDQpID4+IDMpKTsKLQotICAgICAgICAgICAgcDAgPSBjbHBbcDAgKyBkZWx0YV07Ci0gICAgICAgICAgICBxMCA9IGNscFtxMCAtIGRlbHRhXTsKLSAgICAgICAgICAgIHRtcCA9IHRjOwotICAgICAgICAgICAgZGF0YVstaW1hZ2VXaWR0aF0gPSBwMDsKLSAgICAgICAgICAgIGRhdGFbICAwXSA9IHEwOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEZpbHRlckhvckx1bWEKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRmlsdGVyIGFsbCBmb3VyIHN1Y2Nlc3NpdmUgaG9yaXpvbnRhbCA0LXBpeGVsIGx1bWEgZWRnZXMuIFRoaXMgY2FuCi0gICAgICAgICAgICBiZSBkb25lIHdoZW4gYlMgaXMgZXF1YWwgdG8gYWxsIGZvdXIgZWRnZXMuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEZpbHRlckhvckx1bWEoCi0gIHU4ICpkYXRhLAotICB1MzIgYlMsCi0gIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKLSAgaTMyIGltYWdlV2lkdGgpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgaTMyIGRlbHRhLCB0YywgdG1wOwotICAgIHUzMiBpOwotICAgIHU4IHAwLCBxMCwgcDEsIHExLCBwMiwgcTI7Ci0gICAgdTMyIHRtcEZsYWc7Ci0gICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGJTIDw9IDQpOwotICAgIEFTU0VSVCh0aHJlc2hvbGRzKTsKLQotICAgIGlmIChiUyA8IDQpCi0gICAgewotICAgICAgICB0YyA9IHRocmVzaG9sZHMtPnRjMFtiUy0xXTsKLSAgICAgICAgdG1wID0gdGM7Ci0gICAgICAgIGZvciAoaSA9IDE2OyBpOyBpLS0sIGRhdGErKykKLSAgICAgICAgewotICAgICAgICAgICAgcDEgPSBkYXRhWy1pbWFnZVdpZHRoKjJdOyBwMCA9IGRhdGFbLWltYWdlV2lkdGhdOwotICAgICAgICAgICAgcTAgPSBkYXRhWzBdOyBxMSA9IGRhdGFbaW1hZ2VXaWR0aF07Ci0gICAgICAgICAgICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhKSAmJgotICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMS1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSAgJiYKLSAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocTEtcTApIDwgdGhyZXNob2xkcy0+YmV0YSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHAyID0gZGF0YVstaW1hZ2VXaWR0aCozXTsKLQotICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpQUJTKHAyLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBkYXRhWy1pbWFnZVdpZHRoKjJdID0gKHU4KShwMSArIENMSVAzKC10Yyx0YywKLSAgICAgICAgICAgICAgICAgICAgICAgIChwMiArICgocDAgKyBxMCArIDEpID4+IDEpIC0gKHAxIDw8IDEpKSA+PiAxKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCsrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHEyID0gZGF0YVtpbWFnZVdpZHRoKjJdOwotCi0gICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZClBQlMocTItcTApIDwgdGhyZXNob2xkcy0+YmV0YSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFbaW1hZ2VXaWR0aF0gPSAodTgpKHExICsgQ0xJUDMoLXRjLHRjLAotICAgICAgICAgICAgICAgICAgICAgICAgKHEyICsgKChwMCArIHEwICsgMSkgPj4gMSkgLSAocTEgPDwgMSkpID4+IDEpKTsKLSAgICAgICAgICAgICAgICAgICAgdG1wKys7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZGVsdGEgPSBDTElQMygtdG1wLCB0bXAsICgoKChxMCAtIHAwKSA8PCAyKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChwMSAtIHExKSArIDQpID4+IDMpKTsKLQotICAgICAgICAgICAgICAgIHAwID0gY2xwW3AwICsgZGVsdGFdOwotICAgICAgICAgICAgICAgIHEwID0gY2xwW3EwIC0gZGVsdGFdOwotICAgICAgICAgICAgICAgIHRtcCA9IHRjOwotICAgICAgICAgICAgICAgIGRhdGFbLWltYWdlV2lkdGhdID0gcDA7Ci0gICAgICAgICAgICAgICAgZGF0YVsgIDBdID0gcTA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMTY7IGk7IGktLSwgZGF0YSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwMSA9IGRhdGFbLWltYWdlV2lkdGgqMl07IHAwID0gZGF0YVstaW1hZ2VXaWR0aF07Ci0gICAgICAgICAgICBxMCA9IGRhdGFbMF07IHExID0gZGF0YVtpbWFnZVdpZHRoXTsKLSAgICAgICAgICAgIGlmICggKCh1bnNpZ25lZClBQlMocDAtcTApIDwgdGhyZXNob2xkcy0+YWxwaGEpICYmCi0gICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHAxLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpICAmJgotICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhxMS1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wRmxhZyA9ICgodW5zaWduZWQpQUJTKHAwLXEwKSA8ICgodGhyZXNob2xkcy0+YWxwaGEgPj4gMikgKzIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgICAgICAgICBwMiA9IGRhdGFbLWltYWdlV2lkdGgqM107Ci0gICAgICAgICAgICAgICAgcTIgPSBkYXRhW2ltYWdlV2lkdGgqMl07Ci0KLSAgICAgICAgICAgICAgICBpZiAodG1wRmxhZyAmJiAodW5zaWduZWQpQUJTKHAyLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0bXAgPSBwMSArIHAwICsgcTA7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFbLWltYWdlV2lkdGhdID0gKHU4KSgocDIgKyAyICogdG1wICsgcTEgKyA0KSA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVstaW1hZ2VXaWR0aCoyXSA9ICh1OCkoKHAyICsgdG1wICsgMikgPj4gMik7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFbLWltYWdlV2lkdGgqM10gPSAodTgpKCgyICogZGF0YVstaW1hZ2VXaWR0aCo0XSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAqIHAyICsgdG1wICsgNCkgPj4gMyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZGF0YVstaW1hZ2VXaWR0aF0gPSAodTgpKCgyICogcDEgKyBwMCArIHExICsgMikgPj4gMik7Ci0KLSAgICAgICAgICAgICAgICBpZiAodG1wRmxhZyAmJiAodW5zaWduZWQpQUJTKHEyLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0bXAgPSBwMCArIHEwICsgcTE7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFbIDBdID0gKHU4KSgocDEgKyAyICogdG1wICsgcTIgKyA0KSA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVtpbWFnZVdpZHRoXSA9ICh1OCkoKHRtcCArIHEyICsgMikgPj4gMik7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFbaW1hZ2VXaWR0aCoyXSA9ICh1OCkoKDIgKiBkYXRhW2ltYWdlV2lkdGgqM10gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAqIHEyICsgdG1wICsgNCkgPj4gMyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZGF0YVswXSA9ICgyICogcTEgKyBxMCArIHAxICsgMikgPj4gMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEZpbHRlclZlckNocm9tYUVkZ2UKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRmlsdGVyIG9uZSB2ZXJ0aWNhbCAyLXBpeGVsIGNocm9tYSBlZGdlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEZpbHRlclZlckNocm9tYUVkZ2UoCi0gIHU4ICpkYXRhLAotICB1MzIgYlMsCi0gIGVkZ2VUaHJlc2hvbGRfdCAqdGhyZXNob2xkcywKLSAgdTMyIHdpZHRoKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIGkzMiBkZWx0YSwgdGM7Ci0gICAgdTggcDAsIHEwLCBwMSwgcTE7Ci0gICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGJTIDw9IDQpOwotICAgIEFTU0VSVCh0aHJlc2hvbGRzKTsKLQotICAgIHAxID0gZGF0YVstMl07IHAwID0gZGF0YVstMV07Ci0gICAgcTAgPSBkYXRhWzBdOyBxMSA9IGRhdGFbMV07Ci0gICAgaWYgKCAoKHVuc2lnbmVkKUFCUyhwMC1xMCkgPCB0aHJlc2hvbGRzLT5hbHBoYSkgJiYKLSAgICAgICAgICgodW5zaWduZWQpQUJTKHAxLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpICAmJgotICAgICAgICAgKCh1bnNpZ25lZClBQlMocTEtcTApIDwgdGhyZXNob2xkcy0+YmV0YSkgKQotICAgIHsKLSAgICAgICAgaWYgKGJTIDwgNCkKLSAgICAgICAgewotICAgICAgICAgICAgdGMgPSB0aHJlc2hvbGRzLT50YzBbYlMtMV0gKyAxOwotICAgICAgICAgICAgZGVsdGEgPSBDTElQMygtdGMsIHRjLCAoKCgocTAgLSBwMCkgPDwgMikgKwotICAgICAgICAgICAgICAgICAgICAgIChwMSAtIHExKSArIDQpID4+IDMpKTsKLSAgICAgICAgICAgIHAwID0gY2xwW3AwICsgZGVsdGFdOwotICAgICAgICAgICAgcTAgPSBjbHBbcTAgLSBkZWx0YV07Ci0gICAgICAgICAgICBkYXRhWy0xXSA9IHAwOwotICAgICAgICAgICAgZGF0YVsgMF0gPSBxMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRhdGFbLTFdID0gKDIgKiBwMSArIHAwICsgcTEgKyAyKSA+PiAyOwotICAgICAgICAgICAgZGF0YVsgMF0gPSAoMiAqIHExICsgcTAgKyBwMSArIDIpID4+IDI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZGF0YSArPSB3aWR0aDsKLSAgICBwMSA9IGRhdGFbLTJdOyBwMCA9IGRhdGFbLTFdOwotICAgIHEwID0gZGF0YVswXTsgcTEgPSBkYXRhWzFdOwotICAgIGlmICggKCh1bnNpZ25lZClBQlMocDAtcTApIDwgdGhyZXNob2xkcy0+YWxwaGEpICYmCi0gICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMS1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSAgJiYKLSAgICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGEpICkKLSAgICB7Ci0gICAgICAgIGlmIChiUyA8IDQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRjID0gdGhyZXNob2xkcy0+dGMwW2JTLTFdICsgMTsKLSAgICAgICAgICAgIGRlbHRhID0gQ0xJUDMoLXRjLCB0YywgKCgoKHEwIC0gcDApIDw8IDIpICsKLSAgICAgICAgICAgICAgICAgICAgICAocDEgLSBxMSkgKyA0KSA+PiAzKSk7Ci0gICAgICAgICAgICBwMCA9IGNscFtwMCArIGRlbHRhXTsKLSAgICAgICAgICAgIHEwID0gY2xwW3EwIC0gZGVsdGFdOwotICAgICAgICAgICAgZGF0YVstMV0gPSBwMDsKLSAgICAgICAgICAgIGRhdGFbIDBdID0gcTA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBkYXRhWy0xXSA9ICgyICogcDEgKyBwMCArIHExICsgMikgPj4gMjsKLSAgICAgICAgICAgIGRhdGFbIDBdID0gKDIgKiBxMSArIHEwICsgcDEgKyAyKSA+PiAyOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRmlsdGVySG9yQ2hyb21hRWRnZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGaWx0ZXIgb25lIGhvcml6b250YWwgMi1waXhlbCBjaHJvbWEgZWRnZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBGaWx0ZXJIb3JDaHJvbWFFZGdlKAotICB1OCAqZGF0YSwKLSAgdTMyIGJTLAotICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCi0gIGkzMiB3aWR0aCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICBpMzIgZGVsdGEsIHRjOwotICAgIHUzMiBpOwotICAgIHU4IHAwLCBxMCwgcDEsIHExOwotICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChiUyA8IDQpOwotICAgIEFTU0VSVCh0aHJlc2hvbGRzKTsKLQotICAgIHRjID0gdGhyZXNob2xkcy0+dGMwW2JTLTFdICsgMTsKLSAgICBmb3IgKGkgPSAyOyBpOyBpLS0sIGRhdGErKykKLSAgICB7Ci0gICAgICAgIHAxID0gZGF0YVstd2lkdGgqMl07IHAwID0gZGF0YVstd2lkdGhdOwotICAgICAgICBxMCA9IGRhdGFbMF07IHExID0gZGF0YVt3aWR0aF07Ci0gICAgICAgIGlmICggKCh1bnNpZ25lZClBQlMocDAtcTApIDwgdGhyZXNob2xkcy0+YWxwaGEpICYmCi0gICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocDEtcDApIDwgdGhyZXNob2xkcy0+YmV0YSkgICYmCi0gICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocTEtcTApIDwgdGhyZXNob2xkcy0+YmV0YSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWx0YSA9IENMSVAzKC10YywgdGMsICgoKChxMCAtIHAwKSA8PCAyKSArCi0gICAgICAgICAgICAgICAgICAgICAgKHAxIC0gcTEpICsgNCkgPj4gMykpOwotICAgICAgICAgICAgcDAgPSBjbHBbcDAgKyBkZWx0YV07Ci0gICAgICAgICAgICBxMCA9IGNscFtxMCAtIGRlbHRhXTsKLSAgICAgICAgICAgIGRhdGFbLXdpZHRoXSA9IHAwOwotICAgICAgICAgICAgZGF0YVsgIDBdID0gcTA7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRmlsdGVySG9yQ2hyb21hCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZpbHRlciBhbGwgZm91ciBzdWNjZXNzaXZlIGhvcml6b250YWwgMi1waXhlbCBjaHJvbWEgZWRnZXMuIFRoaXMKLSAgICAgICAgICAgIGNhbiBiZSBkb25lIGlmIGJTIGlzIGVxdWFsIGZvciBhbGwgZm91ciBlZGdlcy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgRmlsdGVySG9yQ2hyb21hKAotICB1OCAqZGF0YSwKLSAgdTMyIGJTLAotICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCi0gIGkzMiB3aWR0aCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICBpMzIgZGVsdGEsIHRjOwotICAgIHUzMiBpOwotICAgIHU4IHAwLCBxMCwgcDEsIHExOwotICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChiUyA8PSA0KTsKLSAgICBBU1NFUlQodGhyZXNob2xkcyk7Ci0KLSAgICBpZiAoYlMgPCA0KQotICAgIHsKLSAgICAgICAgdGMgPSB0aHJlc2hvbGRzLT50YzBbYlMtMV0gKyAxOwotICAgICAgICBmb3IgKGkgPSA4OyBpOyBpLS0sIGRhdGErKykKLSAgICAgICAgewotICAgICAgICAgICAgcDEgPSBkYXRhWy13aWR0aCoyXTsgcDAgPSBkYXRhWy13aWR0aF07Ci0gICAgICAgICAgICBxMCA9IGRhdGFbMF07IHExID0gZGF0YVt3aWR0aF07Ci0gICAgICAgICAgICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhKSAmJgotICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhwMS1wMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSAgJiYKLSAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClBQlMocTEtcTApIDwgdGhyZXNob2xkcy0+YmV0YSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRlbHRhID0gQ0xJUDMoLXRjLCB0YywgKCgoKHEwIC0gcDApIDw8IDIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHAxIC0gcTEpICsgNCkgPj4gMykpOwotICAgICAgICAgICAgICAgIHAwID0gY2xwW3AwICsgZGVsdGFdOwotICAgICAgICAgICAgICAgIHEwID0gY2xwW3EwIC0gZGVsdGFdOwotICAgICAgICAgICAgICAgIGRhdGFbLXdpZHRoXSA9IHAwOwotICAgICAgICAgICAgICAgIGRhdGFbICAwXSA9IHEwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDg7IGk7IGktLSwgZGF0YSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwMSA9IGRhdGFbLXdpZHRoKjJdOyBwMCA9IGRhdGFbLXdpZHRoXTsKLSAgICAgICAgICAgIHEwID0gZGF0YVswXTsgcTEgPSBkYXRhW3dpZHRoXTsKLSAgICAgICAgICAgIGlmICggKCh1bnNpZ25lZClBQlMocDAtcTApIDwgdGhyZXNob2xkcy0+YWxwaGEpICYmCi0gICAgICAgICAgICAgICAgICgodW5zaWduZWQpQUJTKHAxLXAwKSA8IHRocmVzaG9sZHMtPmJldGEpICAmJgotICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKUFCUyhxMS1xMCkgPCB0aHJlc2hvbGRzLT5iZXRhKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFbLXdpZHRoXSA9ICgyICogcDEgKyBwMCArIHExICsgMikgPj4gMjsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVsgIDBdID0gKDIgKiBxMSArIHEwICsgcDEgKyAyKSA+PiAyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBHZXRCb3VuZGFyeVN0cmVuZ3RocwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBjYWxjdWxhdGUgYm91bmRhcnkgc3RyZW5ndGhzIGZvciBhbGwgZWRnZXMgb2YgYQotICAgICAgICAgICAgbWFjcm9ibG9jay4gRnVuY3Rpb24gcmV0dXJucyBIQU5UUk9fVFJVRSBpZiBhbnkgb2YgdGhlIGJTIHZhbHVlcyBmb3IKLSAgICAgICAgICAgIHRoZSBtYWNyb2Jsb2NrIGhhZCBub24temVybyB2YWx1ZSwgSEFOVFJPX0ZBTFNFIG90aGVyd2lzZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXUzMiBHZXRCb3VuZGFyeVN0cmVuZ3RocyhtYlN0b3JhZ2VfdCAqbWIsIGJTX3QgKmJTLCB1MzIgZmxhZ3MpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgLyogdGhpcyBmbGFnIGlzIHNldCBIQU5UUk9fVFJVRSBhcyBzb29uIGFzIGFueSBib3VuZGFyeSBzdHJlbmd0aCB2YWx1ZSBpcwotICAgICAqIG5vbi16ZXJvICovCi0gICAgdTMyIG5vblplcm9CcyA9IEhBTlRST19GQUxTRTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKG1iKTsKLSAgICBBU1NFUlQoYlMpOwotICAgIEFTU0VSVChmbGFncyk7Ci0KLSAgICAvKiB0b3AgZWRnZXMgKi8KLSAgICBpZiAoZmxhZ3MgJiBGSUxURVJfVE9QX0VER0UpCi0gICAgewotICAgICAgICBpZiAoSVNfSU5UUkFfTUIoKm1iKSB8fCBJU19JTlRSQV9NQigqbWItPm1iQikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTWzBdLnRvcCA9IGJTWzFdLnRvcCA9IGJTWzJdLnRvcCA9IGJTWzNdLnRvcCA9IDQ7Ci0gICAgICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTWzBdLnRvcCA9IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYi0+bWJCLCAwLCAxMCk7Ci0gICAgICAgICAgICBiU1sxXS50b3AgPSBFZGdlQm91bmRhcnlTdHJlbmd0aChtYiwgbWItPm1iQiwgMSwgMTEpOwotICAgICAgICAgICAgYlNbMl0udG9wID0gRWRnZUJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iLT5tYkIsIDQsIDE0KTsKLSAgICAgICAgICAgIGJTWzNdLnRvcCA9IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYi0+bWJCLCA1LCAxNSk7Ci0gICAgICAgICAgICBpZiAoYlNbMF0udG9wIHx8IGJTWzFdLnRvcCB8fCBiU1syXS50b3AgfHwgYlNbM10udG9wKQotICAgICAgICAgICAgICAgIG5vblplcm9CcyA9IEhBTlRST19UUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGJTWzBdLnRvcCA9IGJTWzFdLnRvcCA9IGJTWzJdLnRvcCA9IGJTWzNdLnRvcCA9IDA7Ci0gICAgfQotCi0gICAgLyogbGVmdCBlZGdlcyAqLwotICAgIGlmIChmbGFncyAmIEZJTFRFUl9MRUZUX0VER0UpCi0gICAgewotICAgICAgICBpZiAoSVNfSU5UUkFfTUIoKm1iKSB8fCBJU19JTlRSQV9NQigqbWItPm1iQSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTWzBdLmxlZnQgPSBiU1s0XS5sZWZ0ID0gYlNbOF0ubGVmdCA9IGJTWzEyXS5sZWZ0ID0gNDsKLSAgICAgICAgICAgIG5vblplcm9CcyA9IEhBTlRST19UUlVFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYlNbMF0ubGVmdCA9IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYi0+bWJBLCAwLCA1KTsKLSAgICAgICAgICAgIGJTWzRdLmxlZnQgPSBFZGdlQm91bmRhcnlTdHJlbmd0aChtYiwgbWItPm1iQSwgMiwgNyk7Ci0gICAgICAgICAgICBiU1s4XS5sZWZ0ID0gRWRnZUJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iLT5tYkEsIDgsIDEzKTsKLSAgICAgICAgICAgIGJTWzEyXS5sZWZ0ID0gRWRnZUJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iLT5tYkEsIDEwLCAxNSk7Ci0gICAgICAgICAgICBpZiAoIW5vblplcm9CcyAmJgotICAgICAgICAgICAgICAgIChiU1swXS5sZWZ0IHx8IGJTWzRdLmxlZnQgfHwgYlNbOF0ubGVmdCB8fCBiU1sxMl0ubGVmdCkpCi0gICAgICAgICAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgYlNbMF0ubGVmdCA9IGJTWzRdLmxlZnQgPSBiU1s4XS5sZWZ0ID0gYlNbMTJdLmxlZnQgPSAwOwotICAgIH0KLQotICAgIC8qIGlubmVyIGVkZ2VzICovCi0gICAgaWYgKElTX0lOVFJBX01CKCptYikpCi0gICAgewotICAgICAgICBiU1s0XS50b3AgID0gYlNbNV0udG9wICA9IGJTWzZdLnRvcCAgPSBiU1s3XS50b3AgID0KLSAgICAgICAgYlNbOF0udG9wICA9IGJTWzldLnRvcCAgPSBiU1sxMF0udG9wID0gYlNbMTFdLnRvcCA9Ci0gICAgICAgIGJTWzEyXS50b3AgPSBiU1sxM10udG9wID0gYlNbMTRdLnRvcCA9IGJTWzE1XS50b3AgPSAzOwotCi0gICAgICAgIGJTWzFdLmxlZnQgID0gYlNbMl0ubGVmdCAgPSBiU1szXS5sZWZ0ICA9Ci0gICAgICAgIGJTWzVdLmxlZnQgID0gYlNbNl0ubGVmdCAgPSBiU1s3XS5sZWZ0ICA9Ci0gICAgICAgIGJTWzldLmxlZnQgID0gYlNbMTBdLmxlZnQgPSBiU1sxMV0ubGVmdCA9Ci0gICAgICAgIGJTWzEzXS5sZWZ0ID0gYlNbMTRdLmxlZnQgPSBiU1sxNV0ubGVmdCA9IDM7Ci0gICAgICAgIG5vblplcm9CcyA9IEhBTlRST19UUlVFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiAxNngxNiBpbnRlciBtYiAtPiByZWYgYWRkcmVzc2VzIG9yIG1vdGlvbiB2ZWN0b3JzIGNhbm5vdCBkaWZmZXIsCi0gICAgICAgICAqIG9ubHkgY2hlY2sgaWYgZWl0aGVyIG9mIHRoZSBibG9ja3MgY29udGFpbiBjb2VmZmljaWVudHMgKi8KLSAgICAgICAgaWYgKGgyNjRic2ROdW1NYlBhcnQobWItPm1iVHlwZSkgPT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgYlNbNF0udG9wID0gbWItPnRvdGFsQ29lZmZbMl0gfHwgbWItPnRvdGFsQ29lZmZbMF0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzVdLnRvcCA9IG1iLT50b3RhbENvZWZmWzNdIHx8IG1iLT50b3RhbENvZWZmWzFdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s2XS50b3AgPSBtYi0+dG90YWxDb2VmZls2XSB8fCBtYi0+dG90YWxDb2VmZls0XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbN10udG9wID0gbWItPnRvdGFsQ29lZmZbN10gfHwgbWItPnRvdGFsQ29lZmZbNV0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzhdLnRvcCA9IG1iLT50b3RhbENvZWZmWzhdIHx8IG1iLT50b3RhbENvZWZmWzJdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s5XS50b3AgPSBtYi0+dG90YWxDb2VmZls5XSB8fCBtYi0+dG90YWxDb2VmZlszXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTBdLnRvcCA9IG1iLT50b3RhbENvZWZmWzEyXSB8fCBtYi0+dG90YWxDb2VmZls2XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTFdLnRvcCA9IG1iLT50b3RhbENvZWZmWzEzXSB8fCBtYi0+dG90YWxDb2VmZls3XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTJdLnRvcCA9IG1iLT50b3RhbENvZWZmWzEwXSB8fCBtYi0+dG90YWxDb2VmZls4XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTNdLnRvcCA9IG1iLT50b3RhbENvZWZmWzExXSB8fCBtYi0+dG90YWxDb2VmZls5XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTRdLnRvcCA9IG1iLT50b3RhbENvZWZmWzE0XSB8fCBtYi0+dG90YWxDb2VmZlsxMl0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzE1XS50b3AgPSBtYi0+dG90YWxDb2VmZlsxNV0gfHwgbWItPnRvdGFsQ29lZmZbMTNdID8gMiA6IDA7Ci0KLSAgICAgICAgICAgIGJTWzFdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxXSB8fCBtYi0+dG90YWxDb2VmZlswXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMl0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzRdIHx8IG1iLT50b3RhbENvZWZmWzFdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1szXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbNV0gfHwgbWItPnRvdGFsQ29lZmZbNF0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzVdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlszXSB8fCBtYi0+dG90YWxDb2VmZlsyXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbNl0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzZdIHx8IG1iLT50b3RhbENvZWZmWzNdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s3XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbN10gfHwgbWItPnRvdGFsQ29lZmZbNl0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzldLmxlZnQgPSBtYi0+dG90YWxDb2VmZls5XSB8fCBtYi0+dG90YWxDb2VmZls4XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTBdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxMl0gfHwgbWItPnRvdGFsQ29lZmZbOV0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzExXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTNdIHx8IG1iLT50b3RhbENvZWZmWzEyXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTNdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxMV0gfHwgbWItPnRvdGFsQ29lZmZbMTBdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxNF0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzE0XSB8fCBtYi0+dG90YWxDb2VmZlsxMV0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzE1XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTVdIHx8IG1iLT50b3RhbENvZWZmWzE0XSA/IDIgOiAwOwotICAgICAgICB9Ci0gICAgICAgIC8qIDE2eDggaW50ZXIgbWIgLT4gcmVmIGFkZHJlc3NlcyBhbmQgbW90aW9uIHZlY3RvcnMgY2FuIGJlIGRpZmZlcmVudAotICAgICAgICAgKiBvbmx5IGZvciB0aGUgbWlkZGxlIGhvcml6b250YWwgZWRnZSwgZm9yIHRoZSBvdGhlciB0b3AgZWRnZXMgaXQgaXMKLSAgICAgICAgICogZW5vdWdoIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGJsb2NrcyBjb250YWluIGNvZWZmaWNpZW50cyBvciBub3QuIFRoZQotICAgICAgICAgKiBzYW1lIGFwcGxpZXMgdG8gYWxsIGludGVybmFsIGxlZnQgZWRnZXMuICovCi0gICAgICAgIGVsc2UgaWYgKG1iLT5tYlR5cGUgPT0gUF9MMF9MMF8xNng4KQotICAgICAgICB7Ci0gICAgICAgICAgICBiU1s0XS50b3AgPSBtYi0+dG90YWxDb2VmZlsyXSB8fCBtYi0+dG90YWxDb2VmZlswXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbNV0udG9wID0gbWItPnRvdGFsQ29lZmZbM10gfHwgbWItPnRvdGFsQ29lZmZbMV0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzZdLnRvcCA9IG1iLT50b3RhbENvZWZmWzZdIHx8IG1iLT50b3RhbENvZWZmWzRdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s3XS50b3AgPSBtYi0+dG90YWxDb2VmZls3XSB8fCBtYi0+dG90YWxDb2VmZls1XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTJdLnRvcCA9IG1iLT50b3RhbENvZWZmWzEwXSB8fCBtYi0+dG90YWxDb2VmZls4XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTNdLnRvcCA9IG1iLT50b3RhbENvZWZmWzExXSB8fCBtYi0+dG90YWxDb2VmZls5XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTRdLnRvcCA9IG1iLT50b3RhbENvZWZmWzE0XSB8fCBtYi0+dG90YWxDb2VmZlsxMl0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzE1XS50b3AgPSBtYi0+dG90YWxDb2VmZlsxNV0gfHwgbWItPnRvdGFsQ29lZmZbMTNdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s4XS50b3AgPSBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDgsIDIpOwotICAgICAgICAgICAgYlNbOV0udG9wID0gSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA5LCAzKTsKLSAgICAgICAgICAgIGJTWzEwXS50b3AgPSBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDEyLCA2KTsKLSAgICAgICAgICAgIGJTWzExXS50b3AgPSBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDEzLCA3KTsKLQotICAgICAgICAgICAgYlNbMV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzFdIHx8IG1iLT50b3RhbENvZWZmWzBdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1syXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbNF0gfHwgbWItPnRvdGFsQ29lZmZbMV0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzNdLmxlZnQgPSBtYi0+dG90YWxDb2VmZls1XSB8fCBtYi0+dG90YWxDb2VmZls0XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbNV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzNdIHx8IG1iLT50b3RhbENvZWZmWzJdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s2XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbNl0gfHwgbWItPnRvdGFsQ29lZmZbM10gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzddLmxlZnQgPSBtYi0+dG90YWxDb2VmZls3XSB8fCBtYi0+dG90YWxDb2VmZls2XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbOV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzldIHx8IG1iLT50b3RhbENvZWZmWzhdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxMF0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzEyXSB8fCBtYi0+dG90YWxDb2VmZls5XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTFdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxM10gfHwgbWItPnRvdGFsQ29lZmZbMTJdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxM10ubGVmdCA9IG1iLT50b3RhbENvZWZmWzExXSB8fCBtYi0+dG90YWxDb2VmZlsxMF0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzE0XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTRdIHx8IG1iLT50b3RhbENvZWZmWzExXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTVdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxNV0gfHwgbWItPnRvdGFsQ29lZmZbMTRdID8gMiA6IDA7Ci0gICAgICAgIH0KLSAgICAgICAgLyogOHgxNiBpbnRlciBtYiAtPiByZWYgYWRkcmVzc2VzIGFuZCBtb3Rpb24gdmVjdG9ycyBjYW4gYmUgZGlmZmVyZW50Ci0gICAgICAgICAqIG9ubHkgZm9yIHRoZSBtaWRkbGUgdmVydGljYWwgZWRnZSwgZm9yIHRoZSBvdGhlciBsZWZ0IGVkZ2VzIGl0IGlzCi0gICAgICAgICAqIGVub3VnaCB0byBjaGVjayB3aGV0aGVyIHRoZSBibG9ja3MgY29udGFpbiBjb2VmZmljaWVudHMgb3Igbm90LiBUaGUKLSAgICAgICAgICogc2FtZSBhcHBsaWVzIHRvIGFsbCBpbnRlcm5hbCB0b3AgZWRnZXMuICovCi0gICAgICAgIGVsc2UgaWYgKG1iLT5tYlR5cGUgPT0gUF9MMF9MMF84eDE2KQotICAgICAgICB7Ci0gICAgICAgICAgICBiU1s0XS50b3AgPSBtYi0+dG90YWxDb2VmZlsyXSB8fCBtYi0+dG90YWxDb2VmZlswXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbNV0udG9wID0gbWItPnRvdGFsQ29lZmZbM10gfHwgbWItPnRvdGFsQ29lZmZbMV0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzZdLnRvcCA9IG1iLT50b3RhbENvZWZmWzZdIHx8IG1iLT50b3RhbENvZWZmWzRdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s3XS50b3AgPSBtYi0+dG90YWxDb2VmZls3XSB8fCBtYi0+dG90YWxDb2VmZls1XSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbOF0udG9wID0gbWItPnRvdGFsQ29lZmZbOF0gfHwgbWItPnRvdGFsQ29lZmZbMl0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzldLnRvcCA9IG1iLT50b3RhbENvZWZmWzldIHx8IG1iLT50b3RhbENvZWZmWzNdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxMF0udG9wID0gbWItPnRvdGFsQ29lZmZbMTJdIHx8IG1iLT50b3RhbENvZWZmWzZdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxMV0udG9wID0gbWItPnRvdGFsQ29lZmZbMTNdIHx8IG1iLT50b3RhbENvZWZmWzddID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxMl0udG9wID0gbWItPnRvdGFsQ29lZmZbMTBdIHx8IG1iLT50b3RhbENvZWZmWzhdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxM10udG9wID0gbWItPnRvdGFsQ29lZmZbMTFdIHx8IG1iLT50b3RhbENvZWZmWzldID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxNF0udG9wID0gbWItPnRvdGFsQ29lZmZbMTRdIHx8IG1iLT50b3RhbENvZWZmWzEyXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTVdLnRvcCA9IG1iLT50b3RhbENvZWZmWzE1XSB8fCBtYi0+dG90YWxDb2VmZlsxM10gPyAyIDogMDsKLQotICAgICAgICAgICAgYlNbMV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzFdIHx8IG1iLT50b3RhbENvZWZmWzBdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1szXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbNV0gfHwgbWItPnRvdGFsQ29lZmZbNF0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzVdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlszXSB8fCBtYi0+dG90YWxDb2VmZlsyXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbN10ubGVmdCA9IG1iLT50b3RhbENvZWZmWzddIHx8IG1iLT50b3RhbENvZWZmWzZdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1s5XS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbOV0gfHwgbWItPnRvdGFsQ29lZmZbOF0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzExXS5sZWZ0ID0gbWItPnRvdGFsQ29lZmZbMTNdIHx8IG1iLT50b3RhbENvZWZmWzEyXSA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMTNdLmxlZnQgPSBtYi0+dG90YWxDb2VmZlsxMV0gfHwgbWItPnRvdGFsQ29lZmZbMTBdID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxNV0ubGVmdCA9IG1iLT50b3RhbENvZWZmWzE1XSB8fCBtYi0+dG90YWxDb2VmZlsxNF0gPyAyIDogMDsKLSAgICAgICAgICAgIGJTWzJdLmxlZnQgPSBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDQsIDEpOwotICAgICAgICAgICAgYlNbNl0ubGVmdCA9IElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgNiwgMyk7Ci0gICAgICAgICAgICBiU1sxMF0ubGVmdCA9IElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgMTIsIDkpOwotICAgICAgICAgICAgYlNbMTRdLmxlZnQgPSBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDE0LCAxMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBiU1s0XS50b3AgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFs0XSwgbWI0eDRJbmRleFswXSk7Ci0gICAgICAgICAgICBiU1s1XS50b3AgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFs1XSwgbWI0eDRJbmRleFsxXSk7Ci0gICAgICAgICAgICBiU1s2XS50b3AgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFs2XSwgbWI0eDRJbmRleFsyXSk7Ci0gICAgICAgICAgICBiU1s3XS50b3AgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFs3XSwgbWI0eDRJbmRleFszXSk7Ci0gICAgICAgICAgICBiU1s4XS50b3AgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFs4XSwgbWI0eDRJbmRleFs0XSk7Ci0gICAgICAgICAgICBiU1s5XS50b3AgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFs5XSwgbWI0eDRJbmRleFs1XSk7Ci0gICAgICAgICAgICBiU1sxMF0udG9wID0KLSAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMTBdLCBtYjR4NEluZGV4WzZdKTsKLSAgICAgICAgICAgIGJTWzExXS50b3AgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsxMV0sIG1iNHg0SW5kZXhbN10pOwotICAgICAgICAgICAgYlNbMTJdLnRvcCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzEyXSwgbWI0eDRJbmRleFs4XSk7Ci0gICAgICAgICAgICBiU1sxM10udG9wID0KLSAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMTNdLCBtYjR4NEluZGV4WzldKTsKLSAgICAgICAgICAgIGJTWzE0XS50b3AgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsxNF0sIG1iNHg0SW5kZXhbMTBdKTsKLSAgICAgICAgICAgIGJTWzE1XS50b3AgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsxNV0sIG1iNHg0SW5kZXhbMTFdKTsKLQotICAgICAgICAgICAgYlNbMV0ubGVmdCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzFdLCBtYjR4NEluZGV4WzBdKTsKLSAgICAgICAgICAgIGJTWzJdLmxlZnQgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsyXSwgbWI0eDRJbmRleFsxXSk7Ci0gICAgICAgICAgICBiU1szXS5sZWZ0ID0KLSAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbM10sIG1iNHg0SW5kZXhbMl0pOwotICAgICAgICAgICAgYlNbNV0ubGVmdCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzVdLCBtYjR4NEluZGV4WzRdKTsKLSAgICAgICAgICAgIGJTWzZdLmxlZnQgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFs2XSwgbWI0eDRJbmRleFs1XSk7Ci0gICAgICAgICAgICBiU1s3XS5sZWZ0ID0KLSAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbN10sIG1iNHg0SW5kZXhbNl0pOwotICAgICAgICAgICAgYlNbOV0ubGVmdCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzldLCBtYjR4NEluZGV4WzhdKTsKLSAgICAgICAgICAgIGJTWzEwXS5sZWZ0ID0KLSAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMTBdLCBtYjR4NEluZGV4WzldKTsKLSAgICAgICAgICAgIGJTWzExXS5sZWZ0ID0KLSAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMTFdLCBtYjR4NEluZGV4WzEwXSk7Ci0gICAgICAgICAgICBiU1sxM10ubGVmdCA9Ci0gICAgICAgICAgICAgICAgSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCBtYjR4NEluZGV4WzEzXSwgbWI0eDRJbmRleFsxMl0pOwotICAgICAgICAgICAgYlNbMTRdLmxlZnQgPQotICAgICAgICAgICAgICAgIElubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgbWI0eDRJbmRleFsxNF0sIG1iNHg0SW5kZXhbMTNdKTsKLSAgICAgICAgICAgIGJTWzE1XS5sZWZ0ID0KLSAgICAgICAgICAgICAgICBJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIG1iNHg0SW5kZXhbMTVdLCBtYjR4NEluZGV4WzE0XSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFub25aZXJvQnMgJiYKLSAgICAgICAgICAgIChiU1s0XS50b3AgfHwgYlNbNV0udG9wIHx8IGJTWzZdLnRvcCB8fCBiU1s3XS50b3AgfHwKLSAgICAgICAgICAgICBiU1s4XS50b3AgfHwgYlNbOV0udG9wIHx8IGJTWzEwXS50b3AgfHwgYlNbMTFdLnRvcCB8fAotICAgICAgICAgICAgIGJTWzEyXS50b3AgfHwgYlNbMTNdLnRvcCB8fCBiU1sxNF0udG9wIHx8IGJTWzE1XS50b3AgfHwKLSAgICAgICAgICAgICBiU1sxXS5sZWZ0IHx8IGJTWzJdLmxlZnQgfHwgYlNbM10ubGVmdCB8fAotICAgICAgICAgICAgIGJTWzVdLmxlZnQgfHwgYlNbNl0ubGVmdCB8fCBiU1s3XS5sZWZ0IHx8Ci0gICAgICAgICAgICAgYlNbOV0ubGVmdCB8fCBiU1sxMF0ubGVmdCB8fCBiU1sxMV0ubGVmdCB8fAotICAgICAgICAgICAgIGJTWzEzXS5sZWZ0IHx8IGJTWzE0XS5sZWZ0IHx8IGJTWzE1XS5sZWZ0KSkKLSAgICAgICAgICAgIG5vblplcm9CcyA9IEhBTlRST19UUlVFOwotICAgIH0KLQotICAgIHJldHVybihub25aZXJvQnMpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogR2V0THVtYUVkZ2VUaHJlc2hvbGRzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIENvbXB1dGUgYWxwaGEsIGJldGEgYW5kIHRjMCB0aHJlc2hvbGRzIGZvciBpbm5lciwgbGVmdCBhbmQgdG9wCi0gICAgICAgICAgICBsdW1hIGVkZ2VzIG9mIGEgbWFjcm9ibG9jay4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgR2V0THVtYUVkZ2VUaHJlc2hvbGRzKAotICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCi0gIG1iU3RvcmFnZV90ICptYiwKLSAgdTMyIGZpbHRlcmluZ0ZsYWdzKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpbmRleEEsIGluZGV4QjsKLSAgICB1MzIgcXBBdiwgcXAsIHFwVG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQodGhyZXNob2xkcyk7Ci0gICAgQVNTRVJUKG1iKTsKLQotICAgIHFwID0gbWItPnFwWTsKLQotICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXAgKyBtYi0+ZmlsdGVyT2Zmc2V0QSk7Ci0gICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcCArIG1iLT5maWx0ZXJPZmZzZXRCKTsKLQotICAgIHRocmVzaG9sZHNbSU5ORVJdLmFscGhhID0gYWxwaGFzW2luZGV4QV07Ci0gICAgdGhyZXNob2xkc1tJTk5FUl0uYmV0YSA9IGJldGFzW2luZGV4Ql07Ci0gICAgdGhyZXNob2xkc1tJTk5FUl0udGMwID0gdGMwW2luZGV4QV07Ci0KLSAgICBpZiAoZmlsdGVyaW5nRmxhZ3MgJiBGSUxURVJfVE9QX0VER0UpCi0gICAgewotICAgICAgICBxcFRtcCA9IG1iLT5tYkItPnFwWTsKLSAgICAgICAgaWYgKHFwVG1wICE9IHFwKQotICAgICAgICB7Ci0gICAgICAgICAgICBxcEF2ID0gKHFwICsgcXBUbXAgKyAxKSA+PiAxOwotCi0gICAgICAgICAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0QSk7Ci0gICAgICAgICAgICBpbmRleEIgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7Ci0KLSAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS5hbHBoYSA9IGFscGhhc1tpbmRleEFdOwotICAgICAgICAgICAgdGhyZXNob2xkc1tUT1BdLmJldGEgPSBiZXRhc1tpbmRleEJdOwotICAgICAgICAgICAgdGhyZXNob2xkc1tUT1BdLnRjMCA9IHRjMFtpbmRleEFdOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGhyZXNob2xkc1tUT1BdLmFscGhhID0gdGhyZXNob2xkc1tJTk5FUl0uYWxwaGE7Ci0gICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0uYmV0YSA9IHRocmVzaG9sZHNbSU5ORVJdLmJldGE7Ci0gICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0udGMwID0gdGhyZXNob2xkc1tJTk5FUl0udGMwOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChmaWx0ZXJpbmdGbGFncyAmIEZJTFRFUl9MRUZUX0VER0UpCi0gICAgewotICAgICAgICBxcFRtcCA9IG1iLT5tYkEtPnFwWTsKLSAgICAgICAgaWYgKHFwVG1wICE9IHFwKQotICAgICAgICB7Ci0gICAgICAgICAgICBxcEF2ID0gKHFwICsgcXBUbXAgKyAxKSA+PiAxOwotCi0gICAgICAgICAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0QSk7Ci0gICAgICAgICAgICBpbmRleEIgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7Ci0KLSAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0uYWxwaGEgPSBhbHBoYXNbaW5kZXhBXTsKLSAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0uYmV0YSA9IGJldGFzW2luZGV4Ql07Ci0gICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLnRjMCA9IHRjMFtpbmRleEFdOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGhyZXNob2xkc1tMRUZUXS5hbHBoYSA9IHRocmVzaG9sZHNbSU5ORVJdLmFscGhhOwotICAgICAgICAgICAgdGhyZXNob2xkc1tMRUZUXS5iZXRhID0gdGhyZXNob2xkc1tJTk5FUl0uYmV0YTsKLSAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0udGMwID0gdGhyZXNob2xkc1tJTk5FUl0udGMwOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogR2V0Q2hyb21hRWRnZVRocmVzaG9sZHMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgQ29tcHV0ZSBhbHBoYSwgYmV0YSBhbmQgdGMwIHRocmVzaG9sZHMgZm9yIGlubmVyLCBsZWZ0IGFuZCB0b3AKLSAgICAgICAgICAgIGNocm9tYSBlZGdlcyBvZiBhIG1hY3JvYmxvY2suCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEdldENocm9tYUVkZ2VUaHJlc2hvbGRzKAotICBlZGdlVGhyZXNob2xkX3QgKnRocmVzaG9sZHMsCi0gIG1iU3RvcmFnZV90ICptYiwKLSAgdTMyIGZpbHRlcmluZ0ZsYWdzLAotICBpMzIgY2hyb21hUXBJbmRleE9mZnNldCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaW5kZXhBLCBpbmRleEI7Ci0gICAgdTMyIHFwQXYsIHFwLCBxcFRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHRocmVzaG9sZHMpOwotICAgIEFTU0VSVChtYik7Ci0KLSAgICBxcCA9IG1iLT5xcFk7Ci0gICAgcXAgPSBoMjY0YnNkUXBDW0NMSVAzKDAsIDUxLCAoaTMyKXFwICsgY2hyb21hUXBJbmRleE9mZnNldCldOwotCi0gICAgaW5kZXhBID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcCArIG1iLT5maWx0ZXJPZmZzZXRBKTsKLSAgICBpbmRleEIgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwICsgbWItPmZpbHRlck9mZnNldEIpOwotCi0gICAgdGhyZXNob2xkc1tJTk5FUl0uYWxwaGEgPSBhbHBoYXNbaW5kZXhBXTsKLSAgICB0aHJlc2hvbGRzW0lOTkVSXS5iZXRhID0gYmV0YXNbaW5kZXhCXTsKLSAgICB0aHJlc2hvbGRzW0lOTkVSXS50YzAgPSB0YzBbaW5kZXhBXTsKLQotICAgIGlmIChmaWx0ZXJpbmdGbGFncyAmIEZJTFRFUl9UT1BfRURHRSkKLSAgICB7Ci0gICAgICAgIHFwVG1wID0gbWItPm1iQi0+cXBZOwotICAgICAgICBpZiAocXBUbXAgIT0gbWItPnFwWSkKLSAgICAgICAgewotICAgICAgICAgICAgcXBUbXAgPSBoMjY0YnNkUXBDW0NMSVAzKDAsIDUxLCAoaTMyKXFwVG1wICsgY2hyb21hUXBJbmRleE9mZnNldCldOwotICAgICAgICAgICAgcXBBdiA9IChxcCArIHFwVG1wICsgMSkgPj4gMTsKLQotICAgICAgICAgICAgaW5kZXhBID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEEpOwotICAgICAgICAgICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEIpOwotCi0gICAgICAgICAgICB0aHJlc2hvbGRzW1RPUF0uYWxwaGEgPSBhbHBoYXNbaW5kZXhBXTsKLSAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS5iZXRhID0gYmV0YXNbaW5kZXhCXTsKLSAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS50YzAgPSB0YzBbaW5kZXhBXTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocmVzaG9sZHNbVE9QXS5hbHBoYSA9IHRocmVzaG9sZHNbSU5ORVJdLmFscGhhOwotICAgICAgICAgICAgdGhyZXNob2xkc1tUT1BdLmJldGEgPSB0aHJlc2hvbGRzW0lOTkVSXS5iZXRhOwotICAgICAgICAgICAgdGhyZXNob2xkc1tUT1BdLnRjMCA9IHRocmVzaG9sZHNbSU5ORVJdLnRjMDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoZmlsdGVyaW5nRmxhZ3MgJiBGSUxURVJfTEVGVF9FREdFKQotICAgIHsKLSAgICAgICAgcXBUbXAgPSBtYi0+bWJBLT5xcFk7Ci0gICAgICAgIGlmIChxcFRtcCAhPSBtYi0+cXBZKQotICAgICAgICB7Ci0gICAgICAgICAgICBxcFRtcCA9IGgyNjRic2RRcENbQ0xJUDMoMCwgNTEsIChpMzIpcXBUbXAgKyBjaHJvbWFRcEluZGV4T2Zmc2V0KV07Ci0gICAgICAgICAgICBxcEF2ID0gKHFwICsgcXBUbXAgKyAxKSA+PiAxOwotCi0gICAgICAgICAgICBpbmRleEEgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0QSk7Ci0gICAgICAgICAgICBpbmRleEIgPSAodTMyKUNMSVAzKDAsIDUxLCAoaTMyKXFwQXYgKyBtYi0+ZmlsdGVyT2Zmc2V0Qik7Ci0KLSAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0uYWxwaGEgPSBhbHBoYXNbaW5kZXhBXTsKLSAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0uYmV0YSA9IGJldGFzW2luZGV4Ql07Ci0gICAgICAgICAgICB0aHJlc2hvbGRzW0xFRlRdLnRjMCA9IHRjMFtpbmRleEFdOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGhyZXNob2xkc1tMRUZUXS5hbHBoYSA9IHRocmVzaG9sZHNbSU5ORVJdLmFscGhhOwotICAgICAgICAgICAgdGhyZXNob2xkc1tMRUZUXS5iZXRhID0gdGhyZXNob2xkc1tJTk5FUl0uYmV0YTsKLSAgICAgICAgICAgIHRocmVzaG9sZHNbTEVGVF0udGMwID0gdGhyZXNob2xkc1tJTk5FUl0udGMwOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRmlsdGVyTHVtYQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBmaWx0ZXIgYWxsIGx1bWEgZWRnZXMgb2YgYSBtYWNyb2Jsb2NrCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEZpbHRlckx1bWEoCi0gIHU4ICpkYXRhLAotICBiU190ICpiUywKLSAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAotICB1MzIgd2lkdGgpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHZibG9jazsKLSAgICBiU190ICp0bXA7Ci0gICAgdTggKnB0cjsKLSAgICB1MzIgb2Zmc2V0OwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGJTKTsKLSAgICBBU1NFUlQodGhyZXNob2xkcyk7Ci0KLSAgICBwdHIgPSBkYXRhOwotICAgIHRtcCA9IGJTOwotCi0gICAgb2Zmc2V0ICA9IFRPUDsKLQotICAgIC8qIGxvb3AgYmxvY2sgcm93cywgcGVyZm9ybSBmaWx0ZXJpbmcgZm9yIGFsbCB2ZXJ0aWNhbCBlZGdlcyBvZiB0aGUgYmxvY2sKLSAgICAgKiByb3cgZmlyc3QsIHRoZW4gZmlsdGVyIGVhY2ggaG9yaXpvbnRhbCBlZGdlIG9mIHRoZSByb3cgKi8KLSAgICBmb3IgKHZibG9jayA9IDQ7IHZibG9jay0tOykKLSAgICB7Ci0gICAgICAgIC8qIG9ubHkgcGVyZm9ybSBmaWx0ZXJpbmcgaWYgYlMgaXMgbm9uLXplcm8sIGZpcnN0IG9mIHRoZSBmb3VyCi0gICAgICAgICAqIEZpbHRlclZlckx1bWFFZGdlIGhhbmRsZXMgdGhlIGxlZnQgZWRnZSBvZiB0aGUgbWFjcm9ibG9jaywgb3RoZXJzCi0gICAgICAgICAqIGZpbHRlciBpbm5lciBlZGdlcyAqLwotICAgICAgICBpZiAodG1wWzBdLmxlZnQpCi0gICAgICAgICAgICBGaWx0ZXJWZXJMdW1hRWRnZShwdHIsIHRtcFswXS5sZWZ0LCB0aHJlc2hvbGRzICsgTEVGVCwgd2lkdGgpOwotICAgICAgICBpZiAodG1wWzFdLmxlZnQpCi0gICAgICAgICAgICBGaWx0ZXJWZXJMdW1hRWRnZShwdHIrNCwgdG1wWzFdLmxlZnQsIHRocmVzaG9sZHMgKyBJTk5FUiwgd2lkdGgpOwotICAgICAgICBpZiAodG1wWzJdLmxlZnQpCi0gICAgICAgICAgICBGaWx0ZXJWZXJMdW1hRWRnZShwdHIrOCwgdG1wWzJdLmxlZnQsIHRocmVzaG9sZHMgKyBJTk5FUiwgd2lkdGgpOwotICAgICAgICBpZiAodG1wWzNdLmxlZnQpCi0gICAgICAgICAgICBGaWx0ZXJWZXJMdW1hRWRnZShwdHIrMTIsIHRtcFszXS5sZWZ0LCB0aHJlc2hvbGRzICsgSU5ORVIsIHdpZHRoKTsKLQotICAgICAgICAvKiBpZiBiUyBpcyBlcXVhbCBmb3IgYWxsIGhvcml6b250YWwgZWRnZXMgb2YgdGhlIHJvdyAtPiBwZXJmb3JtCi0gICAgICAgICAqIGZpbHRlcmluZyB3aXRoIEZpbHRlckhvckx1bWEsIG90aGVyd2lzZSB1c2UgRmlsdGVySG9yTHVtYUVkZ2UgZm9yCi0gICAgICAgICAqIGVhY2ggZWRnZSBzZXBhcmF0ZWx5LiBvZmZzZXQgdmFyaWFibGUgaW5kaWNhdGVzIHRvcCBtYWNyb2Jsb2NrIGVkZ2UKLSAgICAgICAgICogb24gdGhlIGZpcnN0IGxvb3Agcm91bmQsIGlubmVyIGVkZ2UgZm9yIHRoZSBvdGhlciByb3VuZHMgKi8KLSAgICAgICAgaWYgKHRtcFswXS50b3AgPT0gdG1wWzFdLnRvcCAmJiB0bXBbMV0udG9wID09IHRtcFsyXS50b3AgJiYKLSAgICAgICAgICAgIHRtcFsyXS50b3AgPT0gdG1wWzNdLnRvcCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYodG1wWzBdLnRvcCkKLSAgICAgICAgICAgICAgICBGaWx0ZXJIb3JMdW1hKHB0ciwgdG1wWzBdLnRvcCwgdGhyZXNob2xkcyArIG9mZnNldCwgKGkzMil3aWR0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZih0bXBbMF0udG9wKQotICAgICAgICAgICAgICAgIEZpbHRlckhvckx1bWFFZGdlKHB0ciwgdG1wWzBdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOwotICAgICAgICAgICAgaWYodG1wWzFdLnRvcCkKLSAgICAgICAgICAgICAgICBGaWx0ZXJIb3JMdW1hRWRnZShwdHIrNCwgdG1wWzFdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOwotICAgICAgICAgICAgaWYodG1wWzJdLnRvcCkKLSAgICAgICAgICAgICAgICBGaWx0ZXJIb3JMdW1hRWRnZShwdHIrOCwgdG1wWzJdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOwotICAgICAgICAgICAgaWYodG1wWzNdLnRvcCkKLSAgICAgICAgICAgICAgICBGaWx0ZXJIb3JMdW1hRWRnZShwdHIrMTIsIHRtcFszXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGZvdXIgcGl4ZWwgcm93cyBhaGVhZCwgaS5lLiBuZXh0IHJvdyBvZiA0eDQtYmxvY2tzICovCi0gICAgICAgIHB0ciArPSB3aWR0aCo0OwotICAgICAgICB0bXAgKz0gNDsKLSAgICAgICAgb2Zmc2V0ID0gSU5ORVI7Ci0gICAgfQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEZpbHRlckNocm9tYQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBmaWx0ZXIgYWxsIGNocm9tYSBlZGdlcyBvZiBhIG1hY3JvYmxvY2sKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgRmlsdGVyQ2hyb21hKAotICB1OCAqZGF0YUNiLAotICB1OCAqZGF0YUNyLAotICBiU190ICpiUywKLSAgZWRnZVRocmVzaG9sZF90ICp0aHJlc2hvbGRzLAotICB1MzIgd2lkdGgpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHZibG9jazsKLSAgICBiU190ICp0bXA7Ci0gICAgdTMyIG9mZnNldDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGFDYik7Ci0gICAgQVNTRVJUKGRhdGFDcik7Ci0gICAgQVNTRVJUKGJTKTsKLSAgICBBU1NFUlQodGhyZXNob2xkcyk7Ci0KLSAgICB0bXAgPSBiUzsKLSAgICBvZmZzZXQgPSBUT1A7Ci0KLSAgICAvKiBsb29wIGJsb2NrIHJvd3MsIHBlcmZvcm0gZmlsdGVyaW5nIGZvciBhbGwgdmVydGljYWwgZWRnZXMgb2YgdGhlIGJsb2NrCi0gICAgICogcm93IGZpcnN0LCB0aGVuIGZpbHRlciBlYWNoIGhvcml6b250YWwgZWRnZSBvZiB0aGUgcm93ICovCi0gICAgZm9yICh2YmxvY2sgPSAwOyB2YmxvY2sgPCAyOyB2YmxvY2srKykKLSAgICB7Ci0gICAgICAgIC8qIG9ubHkgcGVyZm9ybSBmaWx0ZXJpbmcgaWYgYlMgaXMgbm9uLXplcm8sIGZpcnN0IHR3byBvZiB0aGUgZm91cgotICAgICAgICAgKiBGaWx0ZXJWZXJDaHJvbWFFZGdlIGNhbGxzIGhhbmRsZSB0aGUgbGVmdCBlZGdlIG9mIHRoZSBtYWNyb2Jsb2NrLAotICAgICAgICAgKiBvdGhlcnMgZmlsdGVyIHRoZSBpbm5lciBlZGdlLiBOb3RlIHRoYXQgYXMgY2hyb21hIHVzZXMgYlMgdmFsdWVzCi0gICAgICAgICAqIGRldGVybWluZWQgZm9yIGx1bWEgZWRnZXMsIGVhY2ggYlMgaXMgdXNlZCBvbmx5IGZvciAyIHBpeGVscyBvZgotICAgICAgICAgKiBhIDQtcGl4ZWwgZWRnZSAqLwotICAgICAgICBpZiAodG1wWzBdLmxlZnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbHRlclZlckNocm9tYUVkZ2UoZGF0YUNiLCB0bXBbMF0ubGVmdCwgdGhyZXNob2xkcyArIExFRlQsIHdpZHRoKTsKLSAgICAgICAgICAgIEZpbHRlclZlckNocm9tYUVkZ2UoZGF0YUNyLCB0bXBbMF0ubGVmdCwgdGhyZXNob2xkcyArIExFRlQsIHdpZHRoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodG1wWzRdLmxlZnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbHRlclZlckNocm9tYUVkZ2UoZGF0YUNiKzIqd2lkdGgsIHRtcFs0XS5sZWZ0LCB0aHJlc2hvbGRzICsgTEVGVCwKLSAgICAgICAgICAgICAgICB3aWR0aCk7Ci0gICAgICAgICAgICBGaWx0ZXJWZXJDaHJvbWFFZGdlKGRhdGFDcisyKndpZHRoLCB0bXBbNF0ubGVmdCwgdGhyZXNob2xkcyArIExFRlQsCi0gICAgICAgICAgICAgICAgd2lkdGgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0bXBbMl0ubGVmdCkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsdGVyVmVyQ2hyb21hRWRnZShkYXRhQ2IrNCwgdG1wWzJdLmxlZnQsIHRocmVzaG9sZHMgKyBJTk5FUiwKLSAgICAgICAgICAgICAgICB3aWR0aCk7Ci0gICAgICAgICAgICBGaWx0ZXJWZXJDaHJvbWFFZGdlKGRhdGFDcis0LCB0bXBbMl0ubGVmdCwgdGhyZXNob2xkcyArIElOTkVSLAotICAgICAgICAgICAgICAgIHdpZHRoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodG1wWzZdLmxlZnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbHRlclZlckNocm9tYUVkZ2UoZGF0YUNiKzIqd2lkdGgrNCwgdG1wWzZdLmxlZnQsCi0gICAgICAgICAgICAgICAgdGhyZXNob2xkcyArIElOTkVSLCB3aWR0aCk7Ci0gICAgICAgICAgICBGaWx0ZXJWZXJDaHJvbWFFZGdlKGRhdGFDcisyKndpZHRoKzQsIHRtcFs2XS5sZWZ0LAotICAgICAgICAgICAgICAgIHRocmVzaG9sZHMgKyBJTk5FUiwgd2lkdGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogaWYgYlMgaXMgZXF1YWwgZm9yIGFsbCBob3Jpem9udGFsIGVkZ2VzIG9mIHRoZSByb3cgLT4gcGVyZm9ybQotICAgICAgICAgKiBmaWx0ZXJpbmcgd2l0aCBGaWx0ZXJIb3JDaHJvbWEsIG90aGVyd2lzZSB1c2UgRmlsdGVySG9yQ2hyb21hRWRnZQotICAgICAgICAgKiBmb3IgZWFjaCBlZGdlIHNlcGFyYXRlbHkuIG9mZnNldCB2YXJpYWJsZSBpbmRpY2F0ZXMgdG9wIG1hY3JvYmxvY2sKLSAgICAgICAgICogZWRnZSBvbiB0aGUgZmlyc3QgbG9vcCByb3VuZCwgaW5uZXIgZWRnZSBmb3IgdGhlIHNlY29uZCAqLwotICAgICAgICBpZiAodG1wWzBdLnRvcCA9PSB0bXBbMV0udG9wICYmIHRtcFsxXS50b3AgPT0gdG1wWzJdLnRvcCAmJgotICAgICAgICAgICAgdG1wWzJdLnRvcCA9PSB0bXBbM10udG9wKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZih0bXBbMF0udG9wKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZpbHRlckhvckNocm9tYShkYXRhQ2IsIHRtcFswXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKLSAgICAgICAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWEoZGF0YUNyLCB0bXBbMF0udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodG1wWzBdLnRvcCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWFFZGdlKGRhdGFDYiwgdG1wWzBdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOwotICAgICAgICAgICAgICAgIEZpbHRlckhvckNocm9tYUVkZ2UoZGF0YUNyLCB0bXBbMF0udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodG1wWzFdLnRvcCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWFFZGdlKGRhdGFDYisyLCB0bXBbMV0udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7Ci0gICAgICAgICAgICAgICAgRmlsdGVySG9yQ2hyb21hRWRnZShkYXRhQ3IrMiwgdG1wWzFdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRtcFsyXS50b3ApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmlsdGVySG9yQ2hyb21hRWRnZShkYXRhQ2IrNCwgdG1wWzJdLnRvcCwgdGhyZXNob2xkcytvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgpOwotICAgICAgICAgICAgICAgIEZpbHRlckhvckNocm9tYUVkZ2UoZGF0YUNyKzQsIHRtcFsyXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0bXBbM10udG9wKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZpbHRlckhvckNocm9tYUVkZ2UoZGF0YUNiKzYsIHRtcFszXS50b3AsIHRocmVzaG9sZHMrb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoKTsKLSAgICAgICAgICAgICAgICBGaWx0ZXJIb3JDaHJvbWFFZGdlKGRhdGFDcis2LCB0bXBbM10udG9wLCB0aHJlc2hvbGRzK29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgKGkzMil3aWR0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0bXAgKz0gODsKLSAgICAgICAgZGF0YUNiICs9IHdpZHRoKjQ7Ci0gICAgICAgIGRhdGFDciArPSB3aWR0aCo0OwotICAgICAgICBvZmZzZXQgPSBJTk5FUjsKLSAgICB9Ci19Ci0KLSNlbHNlIC8qIEgyNjRERUNfT01YREwgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkRmlsdGVyUGljdHVyZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBkZWJsb2NraW5nIGZpbHRlcmluZyBmb3IgYSBwaWN0dXJlLiBGaWx0ZXIgZG9lcyBub3QgY29weQotICAgICAgICAgIHRoZSBvcmlnaW5hbCBwaWN0dXJlIGFueXdoZXJlIGJ1dCBmaWx0ZXJpbmcgaXMgcGVyZm9ybWVkIGRpcmVjdGx5Ci0gICAgICAgICAgb24gdGhlIG9yaWdpbmFsIGltYWdlLiBQYXJhbWV0ZXJzIGNvbnRyb2xsaW5nIHRoZSBmaWx0ZXJpbmcgcHJvY2VzcwotICAgICAgICAgIGFyZSBjb21wdXRlZCBiYXNlZCBvbiBpbmZvcm1hdGlvbiBpbiBtYWNyb2Jsb2NrIHN0cnVjdHVyZXMgb2YgdGhlCi0gICAgICAgICAgZmlsdGVyZWQgbWFjcm9ibG9jaywgbWFjcm9ibG9jayBhYm92ZSBhbmQgbWFjcm9ibG9jayBvbiB0aGUgbGVmdCBvZgotICAgICAgICAgIHRoZSBmaWx0ZXJlZCBvbmUuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIGltYWdlICAgICAgICAgcG9pbnRlciB0byBpbWFnZSB0byBiZSBmaWx0ZXJlZAotICAgICAgICAgIG1iICAgICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIGRhdGEgc3RydWN0dXJlIG9mIHRoZSB0b3AtbGVmdAotICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jayBvZiB0aGUgcGljdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgaW1hZ2UgICAgICAgICBmaWx0ZXJlZCBpbWFnZSBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgbm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKmxpbnQgLS1lezU1MH0gU3ltYm9sIG5vdCBhY2Nlc3NlZCAqLwotdm9pZCBoMjY0YnNkRmlsdGVyUGljdHVyZSgKLSAgaW1hZ2VfdCAqaW1hZ2UsCi0gIG1iU3RvcmFnZV90ICptYikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgZmxhZ3M7Ci0gICAgdTMyIHBpY1NpemVJbk1icywgbWJSb3csIG1iQ29sOwotICAgIHUzMiBwaWNXaWR0aEluTWJzOwotICAgIHU4ICpkYXRhOwotICAgIG1iU3RvcmFnZV90ICpwTWI7Ci0gICAgdTggYlNbMl1bMTZdOwotICAgIHU4IHRocmVzaG9sZEx1bWFbMl1bMTZdOwotICAgIHU4IHRocmVzaG9sZENocm9tYVsyXVs4XTsKLSAgICB1OCBhbHBoYVsyXVsyXTsKLSAgICB1OCBiZXRhWzJdWzJdOwotICAgIE9NWFJlc3VsdCByZXM7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChpbWFnZSk7Ci0gICAgQVNTRVJUKG1iKTsKLSAgICBBU1NFUlQoaW1hZ2UtPmRhdGEpOwotICAgIEFTU0VSVChpbWFnZS0+d2lkdGgpOwotICAgIEFTU0VSVChpbWFnZS0+aGVpZ2h0KTsKLQotICAgIHBpY1dpZHRoSW5NYnMgPSBpbWFnZS0+d2lkdGg7Ci0gICAgZGF0YSA9IGltYWdlLT5kYXRhOwotICAgIHBpY1NpemVJbk1icyA9IHBpY1dpZHRoSW5NYnMgKiBpbWFnZS0+aGVpZ2h0OwotCi0gICAgcE1iID0gbWI7Ci0KLSAgICBmb3IgKG1iUm93ID0gMCwgbWJDb2wgPSAwOyBtYlJvdyA8IGltYWdlLT5oZWlnaHQ7IHBNYisrKQotICAgIHsKLSAgICAgICAgZmxhZ3MgPSBHZXRNYkZpbHRlcmluZ0ZsYWdzKHBNYik7Ci0KLSAgICAgICAgaWYgKGZsYWdzKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBHZXRCb3VuZGFyeVN0cmVuZ3RocyBmdW5jdGlvbiByZXR1cm5zIG5vbi16ZXJvIHZhbHVlIGlmIGFueSBvZgotICAgICAgICAgICAgICogdGhlIGJTIHZhbHVlcyBmb3IgdGhlIG1hY3JvYmxvY2sgYmVpbmcgcHJvY2Vzc2VkIHdhcyBub24temVybyAqLwotICAgICAgICAgICAgaWYgKEdldEJvdW5kYXJ5U3RyZW5ndGhzKHBNYiwgYlMsIGZsYWdzKSkKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIC8qIEx1bWEgKi8KLSAgICAgICAgICAgICAgICBHZXRMdW1hRWRnZVRocmVzaG9sZHMocE1iLGFscGhhLGJldGEsdGhyZXNob2xkTHVtYSxiUyxmbGFncyk7Ci0gICAgICAgICAgICAgICAgZGF0YSA9IGltYWdlLT5kYXRhICsgbWJSb3cgKiBwaWNXaWR0aEluTWJzICogMjU2ICsgbWJDb2wgKiAxNjsKLQotICAgICAgICAgICAgICAgIHJlcyA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JKCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9TMzIpKHBpY1dpZHRoSW5NYnMqMTYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliZXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopdGhyZXNob2xkTHVtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJTICk7Ci0KLSAgICAgICAgICAgICAgICByZXMgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSSggZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfUzMyKShwaWNXaWR0aEluTWJzKjE2KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWFscGhhKzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliZXRhKzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4Kil0aHJlc2hvbGRMdW1hKzE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYlMrMTYgKTsKLSAgICAgICAgICAgICAgICAvKiBDYiAqLwotICAgICAgICAgICAgICAgIEdldENocm9tYUVkZ2VUaHJlc2hvbGRzKHBNYiwgYWxwaGEsIGJldGEsIHRocmVzaG9sZENocm9tYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUywgZmxhZ3MsIHBNYi0+Y2hyb21hUXBJbmRleE9mZnNldCk7Ci0gICAgICAgICAgICAgICAgZGF0YSA9IGltYWdlLT5kYXRhICsgcGljU2l6ZUluTWJzICogMjU2ICsKLSAgICAgICAgICAgICAgICAgICAgbWJSb3cgKiBwaWNXaWR0aEluTWJzICogNjQgKyBtYkNvbCAqIDg7Ci0KLSAgICAgICAgICAgICAgICByZXMgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JKCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfUzMyKShwaWNXaWR0aEluTWJzKjgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWFscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJldGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopdGhyZXNob2xkQ2hyb21hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJTICk7Ci0gICAgICAgICAgICAgICAgcmVzID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSggZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMikocGljV2lkdGhJbk1icyo4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KilhbHBoYSsyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJldGErMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4Kil0aHJlc2hvbGRDaHJvbWErOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiliUysxNiApOwotICAgICAgICAgICAgICAgIC8qIENyICovCi0gICAgICAgICAgICAgICAgZGF0YSArPSAocGljU2l6ZUluTWJzICogNjQpOwotICAgICAgICAgICAgICAgIHJlcyA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0koIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9TMzIpKHBpY1dpZHRoSW5NYnMqOCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYmV0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4Kil0aHJlc2hvbGRDaHJvbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYlMgKTsKLSAgICAgICAgICAgICAgICByZXMgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JKCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfUzMyKShwaWNXaWR0aEluTWJzKjgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWFscGhhKzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCopYmV0YSsyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKXRocmVzaG9sZENocm9tYSs4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTgqKWJTKzE2ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtYkNvbCsrOwotICAgICAgICBpZiAobWJDb2wgPT0gcGljV2lkdGhJbk1icykKLSAgICAgICAgewotICAgICAgICAgICAgbWJDb2wgPSAwOwotICAgICAgICAgICAgbWJSb3crKzsKLSAgICAgICAgfQotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEdldEJvdW5kYXJ5U3RyZW5ndGhzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBib3VuZGFyeSBzdHJlbmd0aHMgZm9yIGFsbCBlZGdlcyBvZiBhCi0gICAgICAgICAgICBtYWNyb2Jsb2NrLiBGdW5jdGlvbiByZXR1cm5zIEhBTlRST19UUlVFIGlmIGFueSBvZiB0aGUgYlMgdmFsdWVzIGZvcgotICAgICAgICAgICAgdGhlIG1hY3JvYmxvY2sgaGFkIG5vbi16ZXJvIHZhbHVlLCBIQU5UUk9fRkFMU0Ugb3RoZXJ3aXNlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIEdldEJvdW5kYXJ5U3RyZW5ndGhzKG1iU3RvcmFnZV90ICptYiwgdTggKCpiUylbMTZdLCB1MzIgZmxhZ3MpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgLyogdGhpcyBmbGFnIGlzIHNldCBIQU5UUk9fVFJVRSBhcyBzb29uIGFzIGFueSBib3VuZGFyeSBzdHJlbmd0aCB2YWx1ZSBpcwotICAgICAqIG5vbi16ZXJvICovCi0gICAgdTMyIG5vblplcm9CcyA9IEhBTlRST19GQUxTRTsKLSAgICB1MzIgKnBUbXA7Ci0gICAgdTMyIHRtcDEsIHRtcDIsIGlzSW50cmFNYjsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKG1iKTsKLSAgICBBU1NFUlQoYlMpOwotICAgIEFTU0VSVChmbGFncyk7Ci0KLSAgICBpc0ludHJhTWIgPSBJU19JTlRSQV9NQigqbWIpOwotCi0gICAgLyogdG9wIGVkZ2VzICovCi0gICAgcFRtcCA9ICh1MzIqKSZiU1sxXVswXTsKLSAgICBpZiAoZmxhZ3MgJiBGSUxURVJfVE9QX0VER0UpCi0gICAgewotICAgICAgICBpZiAoaXNJbnRyYU1iIHx8IElTX0lOVFJBX01CKCptYi0+bWJCKSkKLSAgICAgICAgewotICAgICAgICAgICAgKnBUbXAgPSAweDA0MDQwNDA0OwotICAgICAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFRtcCA9IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoVG9wKG1iLCBtYi0+bWJCKTsKLSAgICAgICAgICAgIGlmICgqcFRtcCkKLSAgICAgICAgICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAqcFRtcCA9IDA7Ci0gICAgfQotCi0gICAgLyogbGVmdCBlZGdlcyAqLwotICAgIHBUbXAgPSAodTMyKikmYlNbMF1bMF07Ci0gICAgaWYgKGZsYWdzICYgRklMVEVSX0xFRlRfRURHRSkKLSAgICB7Ci0gICAgICAgIGlmIChpc0ludHJhTWIgfHwgSVNfSU5UUkFfTUIoKm1iLT5tYkEpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKmJTWzBdWzBdID0gYlNbMF1bMV0gPSBiU1swXVsyXSA9IGJTWzBdWzNdID0gNDsqLwotICAgICAgICAgICAgKnBUbXAgPSAweDA0MDQwNDA0OwotICAgICAgICAgICAgbm9uWmVyb0JzID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFRtcCA9IEVkZ2VCb3VuZGFyeVN0cmVuZ3RoTGVmdChtYiwgbWItPm1iQSk7Ci0gICAgICAgICAgICBpZiAoIW5vblplcm9CcyAmJiAqcFRtcCkKLSAgICAgICAgICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAqcFRtcCA9IDA7Ci0gICAgfQotCi0gICAgLyogaW5uZXIgZWRnZXMgKi8KLSAgICBpZiAoaXNJbnRyYU1iKQotICAgIHsKLSAgICAgICAgcFRtcCsrOwotICAgICAgICAqcFRtcCsrID0gMHgwMzAzMDMwMzsKLSAgICAgICAgKnBUbXArKyA9IDB4MDMwMzAzMDM7Ci0gICAgICAgICpwVG1wKysgPSAweDAzMDMwMzAzOwotICAgICAgICBwVG1wKys7Ci0gICAgICAgICpwVG1wKysgPSAweDAzMDMwMzAzOwotICAgICAgICAqcFRtcCsrID0gMHgwMzAzMDMwMzsKLSAgICAgICAgKnBUbXAgPSAweDAzMDMwMzAzOwotCi0gICAgICAgIG5vblplcm9CcyA9IEhBTlRST19UUlVFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwVG1wID0gKHUzMiopbWItPnRvdGFsQ29lZmY7Ci0KLSAgICAgICAgLyogMTZ4MTYgaW50ZXIgbWIgLT4gcmVmIGFkZHJlc3NlcyBvciBtb3Rpb24gdmVjdG9ycyBjYW5ub3QgZGlmZmVyLAotICAgICAgICAgKiBvbmx5IGNoZWNrIGlmIGVpdGhlciBvZiB0aGUgYmxvY2tzIGNvbnRhaW4gY29lZmZpY2llbnRzICovCi0gICAgICAgIGlmIChoMjY0YnNkTnVtTWJQYXJ0KG1iLT5tYlR5cGUpID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcDEgPSAqcFRtcCsrOwotICAgICAgICAgICAgdG1wMiA9ICpwVG1wKys7Ci0gICAgICAgICAgICBiU1sxXVs0XSAgPSAodG1wMSAmIDB4MDBGRjAwRkYpID8gMiA6IDA7IC8qIFsyXSAgfHwgWzBdICovCi0gICAgICAgICAgICBiU1sxXVs1XSAgPSAodG1wMSAmIDB4RkYwMEZGMDApID8gMiA6IDA7IC8qIFszXSAgfHwgWzFdICovCi0gICAgICAgICAgICBiU1swXVs0XSAgPSAodG1wMSAmIDB4MDAwMEZGRkYpID8gMiA6IDA7IC8qIFsxXSAgfHwgWzBdICovCi0gICAgICAgICAgICBiU1swXVs1XSAgPSAodG1wMSAmIDB4RkZGRjAwMDApID8gMiA6IDA7IC8qIFszXSAgfHwgWzJdICovCi0KLSAgICAgICAgICAgIHRtcDEgPSAqcFRtcCsrOwotICAgICAgICAgICAgYlNbMV1bNl0gID0gKHRtcDIgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbNl0gIHx8IFs0XSAqLwotICAgICAgICAgICAgYlNbMV1bN10gID0gKHRtcDIgJiAweEZGMDBGRjAwKSA/IDIgOiAwOyAvKiBbN10gIHx8IFs1XSAqLwotICAgICAgICAgICAgYlNbMF1bMTJdID0gKHRtcDIgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbNV0gIHx8IFs0XSAqLwotICAgICAgICAgICAgYlNbMF1bMTNdID0gKHRtcDIgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbN10gIHx8IFs2XSAqLwotICAgICAgICAgICAgdG1wMiA9ICpwVG1wOwotICAgICAgICAgICAgYlNbMV1bMTJdID0gKHRtcDEgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbMTBdIHx8IFs4XSAqLwotICAgICAgICAgICAgYlNbMV1bMTNdID0gKHRtcDEgJiAweEZGMDBGRjAwKSA/IDIgOiAwOyAvKiBbMTFdIHx8IFs5XSAqLwotICAgICAgICAgICAgYlNbMF1bNl0gID0gKHRtcDEgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbOV0gIHx8IFs4XSAqLwotICAgICAgICAgICAgYlNbMF1bN10gID0gKHRtcDEgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbMTFdIHx8IFsxMF0gKi8KLQotICAgICAgICAgICAgYlNbMV1bMTRdID0gKHRtcDIgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbMTRdIHx8IFsxMl0gKi8KLSAgICAgICAgICAgIGJTWzFdWzE1XSA9ICh0bXAyICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzE1XSB8fCBbMTNdICovCi0gICAgICAgICAgICBiU1swXVsxNF0gPSAodG1wMiAmIDB4MDAwMEZGRkYpID8gMiA6IDA7IC8qIFsxM10gfHwgWzEyXSAqLwotICAgICAgICAgICAgYlNbMF1bMTVdID0gKHRtcDIgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbMTVdIHx8IFsxNF0gKi8KLQotICAgICAgICAgICAgewotICAgICAgICAgICAgdTMyIHRtcDMsIHRtcDQ7Ci0KLSAgICAgICAgICAgIHRtcDEgPSBtYi0+dG90YWxDb2VmZls4XTsKLSAgICAgICAgICAgIHRtcDIgPSBtYi0+dG90YWxDb2VmZlsyXTsKLSAgICAgICAgICAgIHRtcDMgPSBtYi0+dG90YWxDb2VmZls5XTsKLSAgICAgICAgICAgIHRtcDQgPSBtYi0+dG90YWxDb2VmZlszXTsKLQotICAgICAgICAgICAgYlNbMV1bOF0gPSB0bXAxIHx8IHRtcDIgPyAyIDogMDsKLSAgICAgICAgICAgIHRtcDEgPSBtYi0+dG90YWxDb2VmZlsxMl07Ci0gICAgICAgICAgICB0bXAyID0gbWItPnRvdGFsQ29lZmZbNl07Ci0gICAgICAgICAgICBiU1sxXVs5XSA9IHRtcDMgfHwgdG1wNCA/IDIgOiAwOwotICAgICAgICAgICAgdG1wMyA9IG1iLT50b3RhbENvZWZmWzEzXTsKLSAgICAgICAgICAgIHRtcDQgPSBtYi0+dG90YWxDb2VmZls3XTsKLSAgICAgICAgICAgIGJTWzFdWzEwXSA9IHRtcDEgfHwgdG1wMiA/IDIgOiAwOwotICAgICAgICAgICAgdG1wMSA9IG1iLT50b3RhbENvZWZmWzRdOwotICAgICAgICAgICAgdG1wMiA9IG1iLT50b3RhbENvZWZmWzFdOwotICAgICAgICAgICAgYlNbMV1bMTFdID0gdG1wMyB8fCB0bXA0ID8gMiA6IDA7Ci0gICAgICAgICAgICB0bXAzID0gbWItPnRvdGFsQ29lZmZbNl07Ci0gICAgICAgICAgICB0bXA0ID0gbWItPnRvdGFsQ29lZmZbM107Ci0gICAgICAgICAgICBiU1swXVs4XSA9IHRtcDEgfHwgdG1wMiA/IDIgOiAwOwotICAgICAgICAgICAgdG1wMSA9IG1iLT50b3RhbENvZWZmWzEyXTsKLSAgICAgICAgICAgIHRtcDIgPSBtYi0+dG90YWxDb2VmZls5XTsKLSAgICAgICAgICAgIGJTWzBdWzldID0gdG1wMyB8fCB0bXA0ID8gMiA6IDA7Ci0gICAgICAgICAgICB0bXAzID0gbWItPnRvdGFsQ29lZmZbMTRdOwotICAgICAgICAgICAgdG1wNCA9IG1iLT50b3RhbENvZWZmWzExXTsKLSAgICAgICAgICAgIGJTWzBdWzEwXSA9IHRtcDEgfHwgdG1wMiA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMF1bMTFdID0gdG1wMyB8fCB0bXA0ID8gMiA6IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAxNng4IGludGVyIG1iIC0+IHJlZiBhZGRyZXNzZXMgYW5kIG1vdGlvbiB2ZWN0b3JzIGNhbiBiZSBkaWZmZXJlbnQKLSAgICAgICAgICogb25seSBmb3IgdGhlIG1pZGRsZSBob3Jpem9udGFsIGVkZ2UsIGZvciB0aGUgb3RoZXIgdG9wIGVkZ2VzIGl0IGlzCi0gICAgICAgICAqIGVub3VnaCB0byBjaGVjayB3aGV0aGVyIHRoZSBibG9ja3MgY29udGFpbiBjb2VmZmljaWVudHMgb3Igbm90LiBUaGUKLSAgICAgICAgICogc2FtZSBhcHBsaWVzIHRvIGFsbCBpbnRlcm5hbCBsZWZ0IGVkZ2VzLiAqLwotICAgICAgICBlbHNlIGlmIChtYi0+bWJUeXBlID09IFBfTDBfTDBfMTZ4OCkKLSAgICAgICAgewotICAgICAgICAgICAgdG1wMSA9ICpwVG1wKys7Ci0gICAgICAgICAgICB0bXAyID0gKnBUbXArKzsKLSAgICAgICAgICAgIGJTWzFdWzRdICA9ICh0bXAxICYgMHgwMEZGMDBGRikgPyAyIDogMDsgLyogWzJdICB8fCBbMF0gKi8KLSAgICAgICAgICAgIGJTWzFdWzVdICA9ICh0bXAxICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzNdICB8fCBbMV0gKi8KLSAgICAgICAgICAgIGJTWzBdWzRdICA9ICh0bXAxICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzFdICB8fCBbMF0gKi8KLSAgICAgICAgICAgIGJTWzBdWzVdICA9ICh0bXAxICYgMHhGRkZGMDAwMCkgPyAyIDogMDsgLyogWzNdICB8fCBbMl0gKi8KLSAgICAgICAgICAgIHRtcDEgPSAqcFRtcCsrOwotICAgICAgICAgICAgYlNbMV1bNl0gID0gKHRtcDIgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbNl0gIHx8IFs0XSAqLwotICAgICAgICAgICAgYlNbMV1bN10gID0gKHRtcDIgJiAweEZGMDBGRjAwKSA/IDIgOiAwOyAvKiBbN10gIHx8IFs1XSAqLwotICAgICAgICAgICAgYlNbMF1bMTJdID0gKHRtcDIgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbNV0gIHx8IFs0XSAqLwotICAgICAgICAgICAgYlNbMF1bMTNdID0gKHRtcDIgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbN10gIHx8IFs2XSAqLwotICAgICAgICAgICAgdG1wMiA9ICpwVG1wOwotICAgICAgICAgICAgYlNbMV1bMTJdID0gKHRtcDEgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbMTBdIHx8IFs4XSAqLwotICAgICAgICAgICAgYlNbMV1bMTNdID0gKHRtcDEgJiAweEZGMDBGRjAwKSA/IDIgOiAwOyAvKiBbMTFdIHx8IFs5XSAqLwotICAgICAgICAgICAgYlNbMF1bNl0gID0gKHRtcDEgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbOV0gIHx8IFs4XSAqLwotICAgICAgICAgICAgYlNbMF1bN10gID0gKHRtcDEgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbMTFdIHx8IFsxMF0gKi8KLQotICAgICAgICAgICAgYlNbMV1bMTRdID0gKHRtcDIgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbMTRdIHx8IFsxMl0gKi8KLSAgICAgICAgICAgIGJTWzFdWzE1XSA9ICh0bXAyICYgMHhGRjAwRkYwMCkgPyAyIDogMDsgLyogWzE1XSB8fCBbMTNdICovCi0gICAgICAgICAgICBiU1swXVsxNF0gPSAodG1wMiAmIDB4MDAwMEZGRkYpID8gMiA6IDA7IC8qIFsxM10gfHwgWzEyXSAqLwotICAgICAgICAgICAgYlNbMF1bMTVdID0gKHRtcDIgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbMTVdIHx8IFsxNF0gKi8KLQotICAgICAgICAgICAgYlNbMV1bOF0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA4LCAyKTsKLSAgICAgICAgICAgIGJTWzFdWzldID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgOSwgMyk7Ci0gICAgICAgICAgICBiU1sxXVsxMF0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxMiwgNik7Ci0gICAgICAgICAgICBiU1sxXVsxMV0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCAxMywgNyk7Ci0KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHUzMiB0bXAzLCB0bXA0OwotCi0gICAgICAgICAgICB0bXAxID0gbWItPnRvdGFsQ29lZmZbNF07Ci0gICAgICAgICAgICB0bXAyID0gbWItPnRvdGFsQ29lZmZbMV07Ci0gICAgICAgICAgICB0bXAzID0gbWItPnRvdGFsQ29lZmZbNl07Ci0gICAgICAgICAgICB0bXA0ID0gbWItPnRvdGFsQ29lZmZbM107Ci0gICAgICAgICAgICBiU1swXVs4XSA9IHRtcDEgfHwgdG1wMiA/IDIgOiAwOwotICAgICAgICAgICAgdG1wMSA9IG1iLT50b3RhbENvZWZmWzEyXTsKLSAgICAgICAgICAgIHRtcDIgPSBtYi0+dG90YWxDb2VmZls5XTsKLSAgICAgICAgICAgIGJTWzBdWzldID0gdG1wMyB8fCB0bXA0ID8gMiA6IDA7Ci0gICAgICAgICAgICB0bXAzID0gbWItPnRvdGFsQ29lZmZbMTRdOwotICAgICAgICAgICAgdG1wNCA9IG1iLT50b3RhbENvZWZmWzExXTsKLSAgICAgICAgICAgIGJTWzBdWzEwXSA9IHRtcDEgfHwgdG1wMiA/IDIgOiAwOwotICAgICAgICAgICAgYlNbMF1bMTFdID0gdG1wMyB8fCB0bXA0ID8gMiA6IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyogOHgxNiBpbnRlciBtYiAtPiByZWYgYWRkcmVzc2VzIGFuZCBtb3Rpb24gdmVjdG9ycyBjYW4gYmUgZGlmZmVyZW50Ci0gICAgICAgICAqIG9ubHkgZm9yIHRoZSBtaWRkbGUgdmVydGljYWwgZWRnZSwgZm9yIHRoZSBvdGhlciBsZWZ0IGVkZ2VzIGl0IGlzCi0gICAgICAgICAqIGVub3VnaCB0byBjaGVjayB3aGV0aGVyIHRoZSBibG9ja3MgY29udGFpbiBjb2VmZmljaWVudHMgb3Igbm90LiBUaGUKLSAgICAgICAgICogc2FtZSBhcHBsaWVzIHRvIGFsbCBpbnRlcm5hbCB0b3AgZWRnZXMuICovCi0gICAgICAgIGVsc2UgaWYgKG1iLT5tYlR5cGUgPT0gUF9MMF9MMF84eDE2KQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAxID0gKnBUbXArKzsKLSAgICAgICAgICAgIHRtcDIgPSAqcFRtcCsrOwotICAgICAgICAgICAgYlNbMV1bNF0gID0gKHRtcDEgJiAweDAwRkYwMEZGKSA/IDIgOiAwOyAvKiBbMl0gIHx8IFswXSAqLwotICAgICAgICAgICAgYlNbMV1bNV0gID0gKHRtcDEgJiAweEZGMDBGRjAwKSA/IDIgOiAwOyAvKiBbM10gIHx8IFsxXSAqLwotICAgICAgICAgICAgYlNbMF1bNF0gID0gKHRtcDEgJiAweDAwMDBGRkZGKSA/IDIgOiAwOyAvKiBbMV0gIHx8IFswXSAqLwotICAgICAgICAgICAgYlNbMF1bNV0gID0gKHRtcDEgJiAweEZGRkYwMDAwKSA/IDIgOiAwOyAvKiBbM10gIHx8IFsyXSAqLwotICAgICAgICAgICAgdG1wMSA9ICpwVG1wKys7Ci0gICAgICAgICAgICBiU1sxXVs2XSAgPSAodG1wMiAmIDB4MDBGRjAwRkYpID8gMiA6IDA7IC8qIFs2XSAgfHwgWzRdICovCi0gICAgICAgICAgICBiU1sxXVs3XSAgPSAodG1wMiAmIDB4RkYwMEZGMDApID8gMiA6IDA7IC8qIFs3XSAgfHwgWzVdICovCi0gICAgICAgICAgICBiU1swXVsxMl0gPSAodG1wMiAmIDB4MDAwMEZGRkYpID8gMiA6IDA7IC8qIFs1XSAgfHwgWzRdICovCi0gICAgICAgICAgICBiU1swXVsxM10gPSAodG1wMiAmIDB4RkZGRjAwMDApID8gMiA6IDA7IC8qIFs3XSAgfHwgWzZdICovCi0gICAgICAgICAgICB0bXAyID0gKnBUbXA7Ci0gICAgICAgICAgICBiU1sxXVsxMl0gPSAodG1wMSAmIDB4MDBGRjAwRkYpID8gMiA6IDA7IC8qIFsxMF0gfHwgWzhdICovCi0gICAgICAgICAgICBiU1sxXVsxM10gPSAodG1wMSAmIDB4RkYwMEZGMDApID8gMiA6IDA7IC8qIFsxMV0gfHwgWzldICovCi0gICAgICAgICAgICBiU1swXVs2XSAgPSAodG1wMSAmIDB4MDAwMEZGRkYpID8gMiA6IDA7IC8qIFs5XSAgfHwgWzhdICovCi0gICAgICAgICAgICBiU1swXVs3XSAgPSAodG1wMSAmIDB4RkZGRjAwMDApID8gMiA6IDA7IC8qIFsxMV0gfHwgWzEwXSAqLwotCi0gICAgICAgICAgICBiU1sxXVsxNF0gPSAodG1wMiAmIDB4MDBGRjAwRkYpID8gMiA6IDA7IC8qIFsxNF0gfHwgWzEyXSAqLwotICAgICAgICAgICAgYlNbMV1bMTVdID0gKHRtcDIgJiAweEZGMDBGRjAwKSA/IDIgOiAwOyAvKiBbMTVdIHx8IFsxM10gKi8KLSAgICAgICAgICAgIGJTWzBdWzE0XSA9ICh0bXAyICYgMHgwMDAwRkZGRikgPyAyIDogMDsgLyogWzEzXSB8fCBbMTJdICovCi0gICAgICAgICAgICBiU1swXVsxNV0gPSAodG1wMiAmIDB4RkZGRjAwMDApID8gMiA6IDA7IC8qIFsxNV0gfHwgWzE0XSAqLwotCi0gICAgICAgICAgICBiU1swXVs4XSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDQsIDEpOwotICAgICAgICAgICAgYlNbMF1bOV0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA2LCAzKTsKLSAgICAgICAgICAgIGJTWzBdWzEwXSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDEyLCA5KTsKLSAgICAgICAgICAgIGJTWzBdWzExXSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDE0LCAxMSk7Ci0KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHUzMiB0bXAzLCB0bXA0OwotCi0gICAgICAgICAgICB0bXAxID0gbWItPnRvdGFsQ29lZmZbOF07Ci0gICAgICAgICAgICB0bXAyID0gbWItPnRvdGFsQ29lZmZbMl07Ci0gICAgICAgICAgICB0bXAzID0gbWItPnRvdGFsQ29lZmZbOV07Ci0gICAgICAgICAgICB0bXA0ID0gbWItPnRvdGFsQ29lZmZbM107Ci0gICAgICAgICAgICBiU1sxXVs4XSA9IHRtcDEgfHwgdG1wMiA/IDIgOiAwOwotICAgICAgICAgICAgdG1wMSA9IG1iLT50b3RhbENvZWZmWzEyXTsKLSAgICAgICAgICAgIHRtcDIgPSBtYi0+dG90YWxDb2VmZls2XTsKLSAgICAgICAgICAgIGJTWzFdWzldID0gdG1wMyB8fCB0bXA0ID8gMiA6IDA7Ci0gICAgICAgICAgICB0bXAzID0gbWItPnRvdGFsQ29lZmZbMTNdOwotICAgICAgICAgICAgdG1wNCA9IG1iLT50b3RhbENvZWZmWzddOwotICAgICAgICAgICAgYlNbMV1bMTBdID0gdG1wMSB8fCB0bXAyID8gMiA6IDA7Ci0gICAgICAgICAgICBiU1sxXVsxMV0gPSB0bXAzIHx8IHRtcDQgPyAyIDogMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcDEgPSAqcFRtcCsrOwotICAgICAgICAgICAgYlNbMV1bNF0gPSAodG1wMSAmIDB4MDBGRjAwRkYpID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAyLCAwKTsKLSAgICAgICAgICAgIGJTWzFdWzVdID0gKHRtcDEgJiAweEZGMDBGRjAwKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgMywgMSk7Ci0gICAgICAgICAgICBiU1swXVs0XSA9ICh0bXAxICYgMHgwMDAwRkZGRikgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDEsIDApOwotICAgICAgICAgICAgYlNbMF1bNV0gPSAodG1wMSAmIDB4RkZGRjAwMDApID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAzLCAyKTsKLSAgICAgICAgICAgIHRtcDEgPSAqcFRtcCsrOwotICAgICAgICAgICAgYlNbMV1bNl0gID0gKHRtcDEgJiAweDAwRkYwMEZGKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgNiwgNCk7Ci0gICAgICAgICAgICBiU1sxXVs3XSAgPSAodG1wMSAmIDB4RkYwMEZGMDApID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCA3LCA1KTsKLSAgICAgICAgICAgIGJTWzBdWzEyXSA9ICh0bXAxICYgMHgwMDAwRkZGRikgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDUsIDQpOwotICAgICAgICAgICAgYlNbMF1bMTNdID0gKHRtcDEgJiAweEZGRkYwMDAwKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgNywgNik7Ci0gICAgICAgICAgICB0bXAxID0gKnBUbXArKzsKLSAgICAgICAgICAgIGJTWzFdWzEyXSA9ICh0bXAxICYgMHgwMEZGMDBGRikgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDEwLCA4KTsKLSAgICAgICAgICAgIGJTWzFdWzEzXSA9ICh0bXAxICYgMHhGRjAwRkYwMCkgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDExLCA5KTsKLSAgICAgICAgICAgIGJTWzBdWzZdICA9ICh0bXAxICYgMHgwMDAwRkZGRikgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDksIDgpOwotICAgICAgICAgICAgYlNbMF1bN10gID0gKHRtcDEgJiAweEZGRkYwMDAwKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgMTEsIDEwKTsKLSAgICAgICAgICAgIHRtcDEgPSAqcFRtcDsKLSAgICAgICAgICAgIGJTWzFdWzE0XSA9ICh0bXAxICYgMHgwMEZGMDBGRikgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDE0LCAxMik7Ci0gICAgICAgICAgICBiU1sxXVsxNV0gPSAodG1wMSAmIDB4RkYwMEZGMDApID8gMiA6ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgyKG1iLCAxNSwgMTMpOwotICAgICAgICAgICAgYlNbMF1bMTRdID0gKHRtcDEgJiAweDAwMDBGRkZGKSA/IDIgOiAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoMihtYiwgMTMsIDEyKTsKLSAgICAgICAgICAgIGJTWzBdWzE1XSA9ICh0bXAxICYgMHhGRkZGMDAwMCkgPyAyIDogKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aDIobWIsIDE1LCAxNCk7Ci0KLSAgICAgICAgICAgIGJTWzFdWzhdID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgOCwgMik7Ci0gICAgICAgICAgICBiU1sxXVs5XSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDksIDMpOwotICAgICAgICAgICAgYlNbMV1bMTBdID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgMTIsIDYpOwotICAgICAgICAgICAgYlNbMV1bMTFdID0gKHU4KUlubmVyQm91bmRhcnlTdHJlbmd0aChtYiwgMTMsIDcpOwotCi0gICAgICAgICAgICBiU1swXVs4XSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDQsIDEpOwotICAgICAgICAgICAgYlNbMF1bOV0gPSAodTgpSW5uZXJCb3VuZGFyeVN0cmVuZ3RoKG1iLCA2LCAzKTsKLSAgICAgICAgICAgIGJTWzBdWzEwXSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDEyLCA5KTsKLSAgICAgICAgICAgIGJTWzBdWzExXSA9ICh1OClJbm5lckJvdW5kYXJ5U3RyZW5ndGgobWIsIDE0LCAxMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcFRtcCA9ICh1MzIqKSZiU1swXVswXTsKLSAgICAgICAgaWYgKCFub25aZXJvQnMgJiYgKHBUbXBbMV0gfHwgcFRtcFsyXSB8fCBwVG1wWzNdIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBwVG1wWzVdIHx8IHBUbXBbNl0gfHwgcFRtcFs3XSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBub25aZXJvQnMgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybihub25aZXJvQnMpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogR2V0THVtYUVkZ2VUaHJlc2hvbGRzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIENvbXB1dGUgYWxwaGEsIGJldGEgYW5kIHRjMCB0aHJlc2hvbGRzIGZvciBpbm5lciwgbGVmdCBhbmQgdG9wCi0gICAgICAgICAgICBsdW1hIGVkZ2VzIG9mIGEgbWFjcm9ibG9jay4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgR2V0THVtYUVkZ2VUaHJlc2hvbGRzKAotICAgIG1iU3RvcmFnZV90ICptYiwKLSAgICB1OCAoKmFscGhhKVsyXSwKLSAgICB1OCAoKmJldGEpWzJdLAotICAgIHU4ICgqdGhyZXNob2xkKVsxNl0sCi0gICAgdTggKCpicylbMTZdLAotICAgIHUzMiBmaWx0ZXJpbmdGbGFncyApCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGluZGV4QSwgaW5kZXhCOwotICAgIHUzMiBxcEF2LCBxcCwgcXBUbXA7Ci0gICAgdTMyIGk7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVCh0aHJlc2hvbGQpOwotICAgIEFTU0VSVChicyk7Ci0gICAgQVNTRVJUKGJldGEpOwotICAgIEFTU0VSVChhbHBoYSk7Ci0gICAgQVNTRVJUKG1iKTsKLQotICAgIHFwID0gbWItPnFwWTsKLQotICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXAgKyBtYi0+ZmlsdGVyT2Zmc2V0QSk7Ci0gICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcCArIG1iLT5maWx0ZXJPZmZzZXRCKTsKLQotICAgIC8qIEludGVybmFsIGVkZ2UgdmFsdWVzICovCi0gICAgYWxwaGFbMF1bMV0gPSBhbHBoYXNbaW5kZXhBXTsKLSAgICBhbHBoYVsxXVsxXSA9IGFscGhhc1tpbmRleEFdOwotICAgIGFscGhhWzFdWzBdID0gYWxwaGFzW2luZGV4QV07Ci0gICAgYWxwaGFbMF1bMF0gPSBhbHBoYXNbaW5kZXhBXTsKLSAgICBiZXRhWzBdWzFdID0gYmV0YXNbaW5kZXhCXTsKLSAgICBiZXRhWzFdWzFdID0gYmV0YXNbaW5kZXhCXTsKLSAgICBiZXRhWzFdWzBdID0gYmV0YXNbaW5kZXhCXTsKLSAgICBiZXRhWzBdWzBdID0gYmV0YXNbaW5kZXhCXTsKLQotICAgIC8qIHZlcnRpY2FsIHNjYW4gb3JkZXIgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotICAgIHsKLSAgICAgICAgdTMyIHQxLCB0MjsKLQotICAgICAgICB0MSA9IGJzW2ldWzBdOwotICAgICAgICB0MiA9IGJzW2ldWzFdOwotICAgICAgICB0aHJlc2hvbGRbaV1bMF0gID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7Ci0gICAgICAgIHQxID0gYnNbaV1bMl07Ci0gICAgICAgIHRocmVzaG9sZFtpXVsxXSAgPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKLSAgICAgICAgdDIgPSBic1tpXVszXTsKLSAgICAgICAgdGhyZXNob2xkW2ldWzJdICA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOwotICAgICAgICB0MSA9IGJzW2ldWzRdOwotICAgICAgICB0aHJlc2hvbGRbaV1bM10gID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7Ci0gICAgICAgIHQyID0gYnNbaV1bNV07Ci0gICAgICAgIHRocmVzaG9sZFtpXVs0XSAgPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKLSAgICAgICAgdDEgPSBic1tpXVs2XTsKLSAgICAgICAgdGhyZXNob2xkW2ldWzVdICA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOwotICAgICAgICB0MiA9IGJzW2ldWzddOwotICAgICAgICB0aHJlc2hvbGRbaV1bNl0gID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7Ci0gICAgICAgIHQxID0gYnNbaV1bOF07Ci0gICAgICAgIHRocmVzaG9sZFtpXVs3XSAgPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKLSAgICAgICAgdDIgPSBic1tpXVs5XTsKLSAgICAgICAgdGhyZXNob2xkW2ldWzhdICA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOwotICAgICAgICB0MSA9IGJzW2ldWzEwXTsKLSAgICAgICAgdGhyZXNob2xkW2ldWzldICA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOwotICAgICAgICB0MiA9IGJzW2ldWzExXTsKLSAgICAgICAgdGhyZXNob2xkW2ldWzEwXSA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOwotICAgICAgICB0MSA9IGJzW2ldWzEyXTsKLSAgICAgICAgdGhyZXNob2xkW2ldWzExXSA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOwotICAgICAgICB0MiA9IGJzW2ldWzEzXTsKLSAgICAgICAgdGhyZXNob2xkW2ldWzEyXSA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOwotICAgICAgICB0MSA9IGJzW2ldWzE0XTsKLSAgICAgICAgdGhyZXNob2xkW2ldWzEzXSA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOwotICAgICAgICB0MiA9IGJzW2ldWzE1XTsKLSAgICAgICAgdGhyZXNob2xkW2ldWzE0XSA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOwotICAgICAgICB0aHJlc2hvbGRbaV1bMTVdID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7Ci0gICAgfQotCi0gICAgaWYgKGZpbHRlcmluZ0ZsYWdzICYgRklMVEVSX1RPUF9FREdFKQotICAgIHsKLSAgICAgICAgcXBUbXAgPSBtYi0+bWJCLT5xcFk7Ci0gICAgICAgIGlmIChxcFRtcCAhPSBxcCkKLSAgICAgICAgewotICAgICAgICAgICAgdTMyIHQxLCB0MiwgdDMsIHQ0OwotICAgICAgICAgICAgcXBBdiA9IChxcCArIHFwVG1wICsgMSkgPj4gMTsKLQotICAgICAgICAgICAgaW5kZXhBID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEEpOwotICAgICAgICAgICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEIpOwotCi0gICAgICAgICAgICBhbHBoYVsxXVswXSA9IGFscGhhc1tpbmRleEFdOwotICAgICAgICAgICAgYmV0YVsxXVswXSA9IGJldGFzW2luZGV4Ql07Ci0gICAgICAgICAgICB0MSA9IGJzWzFdWzBdOwotICAgICAgICAgICAgdDIgPSBic1sxXVsxXTsKLSAgICAgICAgICAgIHQzID0gYnNbMV1bMl07Ci0gICAgICAgICAgICB0NCA9IGJzWzFdWzNdOwotICAgICAgICAgICAgdGhyZXNob2xkWzFdWzBdID0gKHQxICYmICh0MSA8IDQpKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7Ci0gICAgICAgICAgICB0aHJlc2hvbGRbMV1bMV0gPSAodDIgJiYgKHQyIDwgNCkpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKLSAgICAgICAgICAgIHRocmVzaG9sZFsxXVsyXSA9ICh0MyAmJiAodDMgPCA0KSkgPyB0YzBbaW5kZXhBXVt0M10gOiAwOwotICAgICAgICAgICAgdGhyZXNob2xkWzFdWzNdID0gKHQ0ICYmICh0NCA8IDQpKSA/IHRjMFtpbmRleEFdW3Q0XSA6IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGZpbHRlcmluZ0ZsYWdzICYgRklMVEVSX0xFRlRfRURHRSkKLSAgICB7Ci0gICAgICAgIHFwVG1wID0gbWItPm1iQS0+cXBZOwotICAgICAgICBpZiAocXBUbXAgIT0gcXApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHFwQXYgPSAocXAgKyBxcFRtcCArIDEpID4+IDE7Ci0KLSAgICAgICAgICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRBKTsKLSAgICAgICAgICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRCKTsKLQotICAgICAgICAgICAgYWxwaGFbMF1bMF0gPSBhbHBoYXNbaW5kZXhBXTsKLSAgICAgICAgICAgIGJldGFbMF1bMF0gPSBiZXRhc1tpbmRleEJdOwotICAgICAgICAgICAgdGhyZXNob2xkWzBdWzBdID0gKGJzWzBdWzBdICYmIChic1swXVswXSA8IDQpKSA/IHRjMFtpbmRleEFdW2JzWzBdWzBdXSA6IDA7Ci0gICAgICAgICAgICB0aHJlc2hvbGRbMF1bMV0gPSAoYnNbMF1bMV0gJiYgKGJzWzBdWzFdIDwgNCkpID8gdGMwW2luZGV4QV1bYnNbMF1bMV1dIDogMDsKLSAgICAgICAgICAgIHRocmVzaG9sZFswXVsyXSA9IChic1swXVsyXSAmJiAoYnNbMF1bMl0gPCA0KSkgPyB0YzBbaW5kZXhBXVtic1swXVsyXV0gOiAwOwotICAgICAgICAgICAgdGhyZXNob2xkWzBdWzNdID0gKGJzWzBdWzNdICYmIChic1swXVszXSA8IDQpKSA/IHRjMFtpbmRleEFdW2JzWzBdWzNdXSA6IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBHZXRDaHJvbWFFZGdlVGhyZXNob2xkcwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBDb21wdXRlIGFscGhhLCBiZXRhIGFuZCB0YzAgdGhyZXNob2xkcyBmb3IgaW5uZXIsIGxlZnQgYW5kIHRvcAotICAgICAgICAgICAgY2hyb21hIGVkZ2VzIG9mIGEgbWFjcm9ibG9jay4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgR2V0Q2hyb21hRWRnZVRocmVzaG9sZHMoCi0gICAgbWJTdG9yYWdlX3QgKm1iLAotICAgIHU4ICgqYWxwaGEpWzJdLAotICAgIHU4ICgqYmV0YSlbMl0sCi0gICAgdTggKCp0aHJlc2hvbGQpWzhdLAotICAgIHU4ICgqYnMpWzE2XSwKLSAgICB1MzIgZmlsdGVyaW5nRmxhZ3MsCi0gICAgaTMyIGNocm9tYVFwSW5kZXhPZmZzZXQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGluZGV4QSwgaW5kZXhCOwotICAgIHUzMiBxcEF2LCBxcCwgcXBUbXA7Ci0gICAgdTMyIGk7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVCh0aHJlc2hvbGQpOwotICAgIEFTU0VSVChicyk7Ci0gICAgQVNTRVJUKGJldGEpOwotICAgIEFTU0VSVChhbHBoYSk7Ci0gICAgQVNTRVJUKG1iKTsKLSAgICBBU1NFUlQobWIpOwotCi0gICAgcXAgPSBtYi0+cXBZOwotICAgIHFwID0gaDI2NGJzZFFwQ1tDTElQMygwLCA1MSwgKGkzMilxcCArIGNocm9tYVFwSW5kZXhPZmZzZXQpXTsKLQotICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXAgKyBtYi0+ZmlsdGVyT2Zmc2V0QSk7Ci0gICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcCArIG1iLT5maWx0ZXJPZmZzZXRCKTsKLQotICAgIGFscGhhWzBdWzFdID0gYWxwaGFzW2luZGV4QV07Ci0gICAgYWxwaGFbMV1bMV0gPSBhbHBoYXNbaW5kZXhBXTsKLSAgICBhbHBoYVsxXVswXSA9IGFscGhhc1tpbmRleEFdOwotICAgIGFscGhhWzBdWzBdID0gYWxwaGFzW2luZGV4QV07Ci0gICAgYmV0YVswXVsxXSA9IGJldGFzW2luZGV4Ql07Ci0gICAgYmV0YVsxXVsxXSA9IGJldGFzW2luZGV4Ql07Ci0gICAgYmV0YVsxXVswXSA9IGJldGFzW2luZGV4Ql07Ci0gICAgYmV0YVswXVswXSA9IGJldGFzW2luZGV4Ql07Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotICAgIHsKLSAgICAgICAgdTMyIHQxLCB0MjsKLQotICAgICAgICB0MSA9IGJzW2ldWzBdOwotICAgICAgICB0MiA9IGJzW2ldWzFdOwotICAgICAgICB0aHJlc2hvbGRbaV1bMF0gID0gKHQxKSA/IHRjMFtpbmRleEFdW3QxXSA6IDA7Ci0gICAgICAgIHQxID0gYnNbaV1bMl07Ci0gICAgICAgIHRocmVzaG9sZFtpXVsxXSAgPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKLSAgICAgICAgdDIgPSBic1tpXVszXTsKLSAgICAgICAgdGhyZXNob2xkW2ldWzJdICA9ICh0MSkgPyB0YzBbaW5kZXhBXVt0MV0gOiAwOwotICAgICAgICB0MSA9IGJzW2ldWzhdOwotICAgICAgICB0aHJlc2hvbGRbaV1bM10gID0gKHQyKSA/IHRjMFtpbmRleEFdW3QyXSA6IDA7Ci0gICAgICAgIHQyID0gYnNbaV1bOV07Ci0gICAgICAgIHRocmVzaG9sZFtpXVs0XSAgPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKLSAgICAgICAgdDEgPSBic1tpXVsxMF07Ci0gICAgICAgIHRocmVzaG9sZFtpXVs1XSAgPSAodDIpID8gdGMwW2luZGV4QV1bdDJdIDogMDsKLSAgICAgICAgdDIgPSBic1tpXVsxMV07Ci0gICAgICAgIHRocmVzaG9sZFtpXVs2XSAgPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKLSAgICAgICAgdGhyZXNob2xkW2ldWzddICA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOwotICAgIH0KLQotICAgIGlmIChmaWx0ZXJpbmdGbGFncyAmIEZJTFRFUl9UT1BfRURHRSkKLSAgICB7Ci0gICAgICAgIHFwVG1wID0gbWItPm1iQi0+cXBZOwotICAgICAgICBpZiAocXBUbXAgIT0gbWItPnFwWSkKLSAgICAgICAgewotICAgICAgICAgICAgdTMyIHQxLCB0MiwgdDMsIHQ0OwotICAgICAgICAgICAgcXBUbXAgPSBoMjY0YnNkUXBDW0NMSVAzKDAsIDUxLCAoaTMyKXFwVG1wICsgY2hyb21hUXBJbmRleE9mZnNldCldOwotICAgICAgICAgICAgcXBBdiA9IChxcCArIHFwVG1wICsgMSkgPj4gMTsKLQotICAgICAgICAgICAgaW5kZXhBID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEEpOwotICAgICAgICAgICAgaW5kZXhCID0gKHUzMilDTElQMygwLCA1MSwgKGkzMilxcEF2ICsgbWItPmZpbHRlck9mZnNldEIpOwotCi0gICAgICAgICAgICBhbHBoYVsxXVswXSA9IGFscGhhc1tpbmRleEFdOwotICAgICAgICAgICAgYmV0YVsxXVswXSA9IGJldGFzW2luZGV4Ql07Ci0KLSAgICAgICAgICAgIHQxID0gYnNbMV1bMF07Ci0gICAgICAgICAgICB0MiA9IGJzWzFdWzFdOwotICAgICAgICAgICAgdDMgPSBic1sxXVsyXTsKLSAgICAgICAgICAgIHQ0ID0gYnNbMV1bM107Ci0gICAgICAgICAgICB0aHJlc2hvbGRbMV1bMF0gPSAodDEpID8gdGMwW2luZGV4QV1bdDFdIDogMDsKLSAgICAgICAgICAgIHRocmVzaG9sZFsxXVsxXSA9ICh0MikgPyB0YzBbaW5kZXhBXVt0Ml0gOiAwOwotICAgICAgICAgICAgdGhyZXNob2xkWzFdWzJdID0gKHQzKSA/IHRjMFtpbmRleEFdW3QzXSA6IDA7Ci0gICAgICAgICAgICB0aHJlc2hvbGRbMV1bM10gPSAodDQpID8gdGMwW2luZGV4QV1bdDRdIDogMDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoZmlsdGVyaW5nRmxhZ3MgJiBGSUxURVJfTEVGVF9FREdFKQotICAgIHsKLSAgICAgICAgcXBUbXAgPSBtYi0+bWJBLT5xcFk7Ci0gICAgICAgIGlmIChxcFRtcCAhPSBtYi0+cXBZKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIHFwVG1wID0gaDI2NGJzZFFwQ1tDTElQMygwLCA1MSwgKGkzMilxcFRtcCArIGNocm9tYVFwSW5kZXhPZmZzZXQpXTsKLSAgICAgICAgICAgIHFwQXYgPSAocXAgKyBxcFRtcCArIDEpID4+IDE7Ci0KLSAgICAgICAgICAgIGluZGV4QSA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRBKTsKLSAgICAgICAgICAgIGluZGV4QiA9ICh1MzIpQ0xJUDMoMCwgNTEsIChpMzIpcXBBdiArIG1iLT5maWx0ZXJPZmZzZXRCKTsKLQotICAgICAgICAgICAgYWxwaGFbMF1bMF0gPSBhbHBoYXNbaW5kZXhBXTsKLSAgICAgICAgICAgIGJldGFbMF1bMF0gPSBiZXRhc1tpbmRleEJdOwotICAgICAgICAgICAgdGhyZXNob2xkWzBdWzBdID0gKGJzWzBdWzBdKSA/IHRjMFtpbmRleEFdW2JzWzBdWzBdXSA6IDA7Ci0gICAgICAgICAgICB0aHJlc2hvbGRbMF1bMV0gPSAoYnNbMF1bMV0pID8gdGMwW2luZGV4QV1bYnNbMF1bMV1dIDogMDsKLSAgICAgICAgICAgIHRocmVzaG9sZFswXVsyXSA9IChic1swXVsyXSkgPyB0YzBbaW5kZXhBXVtic1swXVsyXV0gOiAwOwotICAgICAgICAgICAgdGhyZXNob2xkWzBdWzNdID0gKGJzWzBdWzNdKSA/IHRjMFtpbmRleEFdW2JzWzBdWzNdXSA6IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KLQotLypsaW50ICtlNzAxICtlNzAyICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWJsb2NraW5nLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVibG9ja2luZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTcxZGRhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWJsb2NraW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX0RFQkxPQ0tJTkdfSAotI2RlZmluZSBIMjY0U1dERUNfREVCTE9DS0lOR19ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2ltYWdlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RGaWx0ZXJQaWN0dXJlKAotICBpbWFnZV90ICppbWFnZSwKLSAgbWJTdG9yYWdlX3QgKm1iKTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfREVCTE9DS0lOR19IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWNvZGVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVjb2Rlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWM0ODBmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kZWNvZGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIGgyNjRic2RJbml0Ci0gICAgICAgICAgaDI2NGJzZERlY29kZQotICAgICAgICAgIGgyNjRic2RTaHV0ZG93bgotICAgICAgICAgIGgyNjRic2RDdXJyZW50SW1hZ2UKLSAgICAgICAgICBoMjY0YnNkTmV4dE91dHB1dFBpY3R1cmUKLSAgICAgICAgICBoMjY0YnNkUGljV2lkdGgKLSAgICAgICAgICBoMjY0YnNkUGljSGVpZ2h0Ci0gICAgICAgICAgaDI2NGJzZEZsdXNoQnVmZmVyCi0gICAgICAgICAgaDI2NGJzZENoZWNrVmFsaWRQYXJhbVNldHMKLSAgICAgICAgICBoMjY0YnNkVmlkZW9SYW5nZQotICAgICAgICAgIGgyNjRic2RNYXRyaXhDb2VmZmljaWVudHMKLSAgICAgICAgICBoMjY0YnNkQ3JvcHBpbmdQYXJhbXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJoMjY0YnNkX2RlY29kZXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX25hbF91bml0LmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9ieXRlX3N0cmVhbS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc2VxX3BhcmFtX3NldC5oIgotI2luY2x1ZGUgImgyNjRic2RfcGljX3BhcmFtX3NldC5oIgotI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfaGVhZGVyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9kYXRhLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9uZWlnaGJvdXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2RwYi5oIgotI2luY2x1ZGUgImgyNjRic2RfZGVibG9ja2luZy5oIgotI2luY2x1ZGUgImgyNjRic2RfY29uY2VhbC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiBoMjY0YnNkSW5pdAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBJbml0aWFsaXplIHRoZSBkZWNvZGVyLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIG5vT3V0cHV0UmVvcmRlcmluZyAgZmxhZyB0byBpbmRpY2F0ZSB0aGUgZGVjb2RlciB0aGF0IGl0IGRvZXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmUgdG8gcGVyZm9ybSByZW9yZGVyaW5nIG9mIGRpc3BsYXkgaW1hZ2VzLgotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICAgICAgICAgIHBvaW50ZXIgdG8gaW5pdGlhbGl6ZWQgc3RvcmFnZSBzdHJ1Y3R1cmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgbm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZEluaXQoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyIG5vT3V0cHV0UmVvcmRlcmluZykKLXsKLQotLyogVmFyaWFibGVzICovCi0gICAgdTMyIHNpemU7Ci0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0b3JhZ2UpOwotCi0gICAgaDI2NGJzZEluaXRTdG9yYWdlKHBTdG9yYWdlKTsKLQotICAgIC8qIGFsbG9jYXRlIG1iTGF5ZXIgdG8gYmUgbmV4dCBtdWx0aXBsZSBvZiA2NCB0byBlbmFibGUgdXNlIG9mCi0gICAgICogc3BlY2lmaWMgTkVPTiBvcHRpbWl6ZWQgIm1lbXNldCIgZm9yIGNsZWFyaW5nIHRoZSBzdHJ1Y3R1cmUgKi8KLSAgICBzaXplID0gKHNpemVvZihtYWNyb2Jsb2NrTGF5ZXJfdCkgKyA2MykgJiB+MHgzRjsKLQotICAgIHBTdG9yYWdlLT5tYkxheWVyID0gKG1hY3JvYmxvY2tMYXllcl90KilIMjY0U3dEZWNNYWxsb2Moc2l6ZSwgMSk7Ci0gICAgaWYgKCFwU3RvcmFnZS0+bWJMYXllcikKLSAgICAgICAgcmV0dXJuIEhBTlRST19OT0s7Ci0KLSAgICBpZiAobm9PdXRwdXRSZW9yZGVyaW5nKQotICAgICAgICBwU3RvcmFnZS0+bm9SZW9yZGVyaW5nID0gSEFOVFJPX1RSVUU7Ci0KLSAgICByZXR1cm4gSEFOVFJPX09LOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2REZWNvZGUKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRGVjb2RlIGEgTkFMIHVuaXQuIFRoaXMgZnVuY3Rpb24gY2FsbHMgb3RoZXIgbW9kdWxlcyB0byBwZXJmb3JtCi0gICAgICAgICAgICB0YXNrcyBsaWtlCi0gICAgICAgICAgICAgICAgKiBleHRyYWN0IGFuZCBkZWNvZGUgTkFMIHVuaXQgZnJvbSB0aGUgYnl0ZSBzdHJlYW0KLSAgICAgICAgICAgICAgICAqIGRlY29kZSBwYXJhbWV0ZXIgc2V0cwotICAgICAgICAgICAgICAgICogZGVjb2RlIHNsaWNlIGhlYWRlciBhbmQgc2xpY2UgZGF0YQotICAgICAgICAgICAgICAgICogY29uY2VhbCBlcnJvcnMgaW4gdGhlIHBpY3R1cmUKLSAgICAgICAgICAgICAgICAqIHBlcmZvcm0gZGVibG9ja2luZyBmaWx0ZXJpbmcKLQotICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjb250YWlucyB0b3AgbGV2ZWwgY29udHJvbCBsb2dpYyBvZiB0aGUgZGVjb2Rlci4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICAgICAgcG9pbnRlciB0byBzdG9yYWdlIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgICBieXRlU3RybSAgICAgICAgcG9pbnRlciB0byBzdHJlYW0gYnVmZmVyIGdpdmVuIGJ5IGFwcGxpY2F0aW9uCi0gICAgICAgICAgICBsZW4gICAgICAgICAgICAgbGVuZ3RoIG9mIHRoZSBidWZmZXIgaW4gYnl0ZXMKLSAgICAgICAgICAgIHBpY0lkICAgICAgICAgICBpZGVudGlmaWVyIGZvciBhIHBpY3R1cmUsIGFzc2lnbmVkIGJ5IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHJlYWRCeXRlcyAgICAgICBudW1iZXIgb2YgYnl0ZXMgcmVhZCBmcm9tIHRoZSBzdHJlYW0gaXMgc3RvcmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIMjY0QlNEX1JEWSAgICAgICAgICAgICBkZWNvZGluZyBmaW5pc2hlZCwgbm90aGluZyBzcGVjaWFsCi0gICAgICAgICAgICBIMjY0QlNEX1BJQ19SRFkgICAgICAgICBkZWNvZGluZyBvZiBhIHBpY3R1cmUgZmluaXNoZWQKLSAgICAgICAgICAgIEgyNjRCU0RfSERSU19SRFkgICAgICAgIHBhcmFtIHNldHMgYWN0aXZhdGVkLCBpbmZvcm1hdGlvbiBsaWtlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIGRpbWVuc2lvbnMgZXRjIGNhbiBiZSByZWFkCi0gICAgICAgICAgICBIMjY0QlNEX0VSUk9SICAgICAgICAgICBlcnJvciBpbiBkZWNvZGluZwotICAgICAgICAgICAgSDI2NEJTRF9QQVJBTV9TRVRfRVJST1Igc2VyaXVzIGVycm9yIGluIGRlY29kaW5nLCBmYWlsZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2YXRlIHBhcmFtIHNldHMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGUoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTggKmJ5dGVTdHJtLCB1MzIgbGVuLCB1MzIgcGljSWQsCi0gICAgdTMyICpyZWFkQnl0ZXMpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgcHBzSWQsIHNwc0lkOwotICAgIGkzMiBwaWNPcmRlckNudDsKLSAgICBuYWxVbml0X3QgbmFsVW5pdDsKLSAgICBzZXFQYXJhbVNldF90IHNlcVBhcmFtU2V0OwotICAgIHBpY1BhcmFtU2V0X3QgcGljUGFyYW1TZXQ7Ci0gICAgc3RybURhdGFfdCBzdHJtOwotICAgIHUzMiBhY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX0ZBTFNFOwotICAgIHUzMiBwaWNSZWFkeSA9IEhBTlRST19GQUxTRTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdG9yYWdlKTsKLSAgICBBU1NFUlQoYnl0ZVN0cm0pOwotICAgIEFTU0VSVChsZW4pOwotICAgIEFTU0VSVChyZWFkQnl0ZXMpOwotCi0gICAgLyogaWYgcHJldmlvdXMgYnVmZmVyIHdhcyBub3QgZmluaXNoZWQgYW5kIHNhbWUgcG9pbnRlciBnaXZlbiAtPiBza2lwIE5BTAotICAgICAqIHVuaXQgZXh0cmFjdGlvbiAqLwotICAgIGlmIChwU3RvcmFnZS0+cHJldkJ1Zk5vdEZpbmlzaGVkICYmIGJ5dGVTdHJtID09IHBTdG9yYWdlLT5wcmV2QnVmUG9pbnRlcikKLSAgICB7Ci0gICAgICAgIHN0cm0gPSBwU3RvcmFnZS0+c3RybVswXTsKLSAgICAgICAgc3RybS5wU3RybUN1cnJQb3MgPSBzdHJtLnBTdHJtQnVmZlN0YXJ0OwotICAgICAgICBzdHJtLnN0cm1CdWZmUmVhZEJpdHMgPSBzdHJtLmJpdFBvc0luV29yZCA9IDA7Ci0gICAgICAgICpyZWFkQnl0ZXMgPSBwU3RvcmFnZS0+cHJldkJ5dGVzQ29uc3VtZWQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RFeHRyYWN0TmFsVW5pdChieXRlU3RybSwgbGVuLCAmc3RybSwgcmVhZEJ5dGVzKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVQUklOVCgiQllURV9TVFJFQU0iKTsKLSAgICAgICAgICAgIHJldHVybihIMjY0QlNEX0VSUk9SKTsKLSAgICAgICAgfQotICAgICAgICAvKiBzdG9yZSBzdHJlYW0gKi8KLSAgICAgICAgcFN0b3JhZ2UtPnN0cm1bMF0gPSBzdHJtOwotICAgICAgICBwU3RvcmFnZS0+cHJldkJ5dGVzQ29uc3VtZWQgPSAqcmVhZEJ5dGVzOwotICAgICAgICBwU3RvcmFnZS0+cHJldkJ1ZlBvaW50ZXIgPSBieXRlU3RybTsKLSAgICB9Ci0gICAgcFN0b3JhZ2UtPnByZXZCdWZOb3RGaW5pc2hlZCA9IEhBTlRST19GQUxTRTsKLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVOYWxVbml0KCZzdHJtLCAmbmFsVW5pdCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgewotICAgICAgICBFUFJJTlQoIk5BTF9VTklUIik7Ci0gICAgICAgIHJldHVybihIMjY0QlNEX0VSUk9SKTsKLSAgICB9Ci0KLSAgICAvKiBEaXNjYXJkIHVuc3BlY2lmaWVkLCByZXNlcnZlZCwgU1BTIGV4dGVuc2lvbiBhbmQgYXV4aWxpYXJ5IHBpY3R1cmUgc2xpY2VzICovCi0gICAgaWYobmFsVW5pdC5uYWxVbml0VHlwZSA9PSAwIHx8IG5hbFVuaXQubmFsVW5pdFR5cGUgPj0gMTMpCi0gICAgewotICAgICAgICBERUJVRygoIkRJU0NBUkRFRCBOQUwgKFVOU1BFQ0lGSUVELCBSRUdJU1RFUkVELCBTUFMgZXh0IG9yIEFVWCBzbGljZSlcbiIpKTsKLSAgICAgICAgcmV0dXJuKEgyNjRCU0RfUkRZKTsKLSAgICB9Ci0KLSAgICB0bXAgPSBoMjY0YnNkQ2hlY2tBY2Nlc3NVbml0Qm91bmRhcnkoCi0gICAgICAmc3RybSwKLSAgICAgICZuYWxVbml0LAotICAgICAgcFN0b3JhZ2UsCi0gICAgICAmYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgewotICAgICAgICBFUFJJTlQoIkFDQ0VTUyBVTklUIEJPVU5EQVJZIENIRUNLIik7Ci0gICAgICAgIGlmICh0bXAgPT0gUEFSQU1fU0VUX0VSUk9SKQotICAgICAgICAgICAgcmV0dXJuKEgyNjRCU0RfUEFSQU1fU0VUX0VSUk9SKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOwotICAgIH0KLQotICAgIGlmICggYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyApCi0gICAgewotICAgICAgICBERUJVRygoIkFjY2VzcyB1bml0IGJvdW5kYXJ5XG4iKSk7Ci0gICAgICAgIC8qIGNvbmNlYWwgaWYgcGljdHVyZSBzdGFydGVkIGFuZCBwYXJhbSBzZXRzIGFjdGl2YXRlZCAqLwotICAgICAgICBpZiAocFN0b3JhZ2UtPnBpY1N0YXJ0ZWQgJiYgcFN0b3JhZ2UtPmFjdGl2ZVNwcyAhPSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBERUJVRygoIkNPTkNFQUxJTkcuLi4iKSk7Ci0KLSAgICAgICAgICAgIC8qIHJldHVybiBlcnJvciBpZiBzZWNvbmQgcGhhc2Ugb2YKLSAgICAgICAgICAgICAqIGluaXRpYWxpemF0aW9uIGlzIG5vdCBjb21wbGV0ZWQgKi8KLSAgICAgICAgICAgIGlmIChwU3RvcmFnZS0+cGVuZGluZ0FjdGl2YXRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVBSSU5UKCJQZW5kaW5nIGFjdGl2YXRpb24gbm90IGNvbXBsZXRlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAoSDI2NEJTRF9FUlJPUik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghcFN0b3JhZ2UtPnZhbGlkU2xpY2VJbkFjY2Vzc1VuaXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmN1cnJJbWFnZS0+ZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgIGgyNjRic2RBbGxvY2F0ZURwYkltYWdlKHBTdG9yYWdlLT5kcGIpOwotICAgICAgICAgICAgICAgIGgyNjRic2RJbml0UmVmUGljTGlzdChwU3RvcmFnZS0+ZHBiKTsKLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkQ29uY2VhbChwU3RvcmFnZSwgcFN0b3JhZ2UtPmN1cnJJbWFnZSwgUF9TTElDRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZENvbmNlYWwocFN0b3JhZ2UsIHBTdG9yYWdlLT5jdXJySW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5zbGljZUhlYWRlci0+c2xpY2VUeXBlKTsKLQotICAgICAgICAgICAgcGljUmVhZHkgPSBIQU5UUk9fVFJVRTsKLQotICAgICAgICAgICAgLyogY3VycmVudCBOQUwgdW5pdCBzaG91bGQgYmUgZGVjb2RlZCBvbiBuZXh0IGFjdGl2YXRpb24gLT4gc2V0Ci0gICAgICAgICAgICAgKiByZWFkQnl0ZXMgdG8gMCAqLwotICAgICAgICAgICAgKnJlYWRCeXRlcyA9IDA7Ci0gICAgICAgICAgICBwU3RvcmFnZS0+cHJldkJ1Zk5vdEZpbmlzaGVkID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgICAgICBERUJVRygoIi4uLkRPTkVcbiIpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBTdG9yYWdlLT52YWxpZFNsaWNlSW5BY2Nlc3NVbml0ID0gSEFOVFJPX0ZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIHBTdG9yYWdlLT5za2lwUmVkdW5kYW50U2xpY2VzID0gSEFOVFJPX0ZBTFNFOwotICAgIH0KLQotICAgIGlmICghcGljUmVhZHkpCi0gICAgewotICAgICAgICBzd2l0Y2ggKG5hbFVuaXQubmFsVW5pdFR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTkFMX1NFUV9QQVJBTV9TRVQ6Ci0gICAgICAgICAgICAgICAgREVCVUcoKCJTRVEgUEFSQU0gU0VUXG4iKSk7Ci0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVNlcVBhcmFtU2V0KCZzdHJtLCAmc2VxUGFyYW1TZXQpOwotICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJTRVFfUEFSQU1fU0VUIik7Ci0gICAgICAgICAgICAgICAgICAgIEZSRUUoc2VxUGFyYW1TZXQub2Zmc2V0Rm9yUmVmRnJhbWUpOwotICAgICAgICAgICAgICAgICAgICBGUkVFKHNlcVBhcmFtU2V0LnZ1aVBhcmFtZXRlcnMpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9FUlJPUik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RTdG9yZVNlcVBhcmFtU2V0KHBTdG9yYWdlLCAmc2VxUGFyYW1TZXQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE5BTF9QSUNfUEFSQU1fU0VUOgotICAgICAgICAgICAgICAgIERFQlVHKCgiUElDIFBBUkFNIFNFVFxuIikpOwotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVQaWNQYXJhbVNldCgmc3RybSwgJnBpY1BhcmFtU2V0KTsKLSAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEVQUklOVCgiUElDX1BBUkFNX1NFVCIpOwotICAgICAgICAgICAgICAgICAgICBGUkVFKHBpY1BhcmFtU2V0LnJ1bkxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIEZSRUUocGljUGFyYW1TZXQudG9wTGVmdCk7Ci0gICAgICAgICAgICAgICAgICAgIEZSRUUocGljUGFyYW1TZXQuYm90dG9tUmlnaHQpOwotICAgICAgICAgICAgICAgICAgICBGUkVFKHBpY1BhcmFtU2V0LnNsaWNlR3JvdXBJZCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybihIMjY0QlNEX0VSUk9SKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZFN0b3JlUGljUGFyYW1TZXQocFN0b3JhZ2UsICZwaWNQYXJhbVNldCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTkFMX0NPREVEX1NMSUNFX0lEUjoKLSAgICAgICAgICAgICAgICBERUJVRygoIklEUiAiKSk7Ci0gICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgICBjYXNlIE5BTF9DT0RFRF9TTElDRToKLSAgICAgICAgICAgICAgICBERUJVRygoIlNMSUNFIEhFQURFUlxuIikpOwotCi0gICAgICAgICAgICAgICAgLyogcGljdHVyZSBzdWNjZXNzZnVsbHkgZmluaXNoZWQgYW5kIHN0aWxsIGRlY29kaW5nIHNhbWUgb2xkCi0gICAgICAgICAgICAgICAgICogYWNjZXNzIHVuaXQgLT4gbm8gbmVlZCB0byBkZWNvZGUgcmVkdW5kYW50IHNsaWNlcyAqLwotICAgICAgICAgICAgICAgIGlmIChwU3RvcmFnZS0+c2tpcFJlZHVuZGFudFNsaWNlcykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEgyNjRCU0RfUkRZKTsKLQotICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5waWNTdGFydGVkID0gSEFOVFJPX1RSVUU7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaDI2NGJzZElzU3RhcnRPZlBpY3R1cmUocFN0b3JhZ2UpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPm51bUNvbmNlYWxlZE1icyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5jdXJyZW50UGljSWQgICAgPSBwaWNJZDsKLQotICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkQ2hlY2tQcHNJZCgmc3RybSwgJnBwc0lkKTsKLSAgICAgICAgICAgICAgICAgICAgQVNTRVJUKHRtcCA9PSBIQU5UUk9fT0spOwotICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSBvbGQgYWN0aXZlU3BzSWQgYW5kIHJldHVybiBoZWFkZXJzIHJlYWR5Ci0gICAgICAgICAgICAgICAgICAgICAqIGluZGljYXRpb24gaWYgYWN0aXZlU3BzIGNoYW5nZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgc3BzSWQgPSBwU3RvcmFnZS0+YWN0aXZlU3BzSWQ7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RBY3RpdmF0ZVBhcmFtU2V0cyhwU3RvcmFnZSwgcHBzSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfSURSX05BTF9VTklUKCZuYWxVbml0KSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0UpOwotICAgICAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJQYXJhbSBzZXQgYWN0aXZhdGlvbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwc0lkID0gTUFYX05VTV9QSUNfUEFSQU1fU0VUUzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHMgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwc0lkID0gTUFYX05VTV9TRVFfUEFSQU1fU0VUUzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnBlbmRpbmdBY3RpdmF0aW9uID0gSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih0bXAgPT0gTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEgyNjRCU0RfTUVNQUxMT0NfRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEgyNjRCU0RfUEFSQU1fU0VUX0VSUk9SKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChzcHNJZCAhPSBwU3RvcmFnZS0+YWN0aXZlU3BzSWQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcVBhcmFtU2V0X3QgKm9sZFNQUyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXFQYXJhbVNldF90ICpuZXdTUFMgPSBwU3RvcmFnZS0+YWN0aXZlU3BzOwotICAgICAgICAgICAgICAgICAgICAgICAgdTMyIG5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnID0gMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYocFN0b3JhZ2UtPm9sZFNwc0lkIDwgTUFYX05VTV9TRVFfUEFSQU1fU0VUUykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRTUFMgPSBwU3RvcmFnZS0+c3BzW3BTdG9yYWdlLT5vbGRTcHNJZF07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICpyZWFkQnl0ZXMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnByZXZCdWZOb3RGaW5pc2hlZCA9IEhBTlRST19UUlVFOwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKG5hbFVuaXQubmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RDaGVja1ByaW9yUGljc0ZsYWcoJm5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJtLCBuZXdTUFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWxVbml0Lm5hbFVuaXRUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBIQU5UUk9fTk9LOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZigodG1wICE9IEhBTlRST19PSykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChub091dHB1dE9mUHJpb3JQaWNzRmxhZyAhPSAwKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBTdG9yYWdlLT5kcGItPm5vUmVvcmRlcmluZykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbGRTUFMgPT0gTlVMTCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbGRTUFMtPnBpY1dpZHRoSW5NYnMgIT0gbmV3U1BTLT5waWNXaWR0aEluTWJzKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9sZFNQUy0+cGljSGVpZ2h0SW5NYnMgIT0gbmV3U1BTLT5waWNIZWlnaHRJbk1icykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbGRTUFMtPm1heERwYlNpemUgIT0gbmV3U1BTLT5tYXhEcGJTaXplKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+ZHBiLT5mbHVzaGVkID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkRmx1c2hEcGIocFN0b3JhZ2UtPmRwYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5vbGRTcHNJZCA9IHBTdG9yYWdlLT5hY3RpdmVTcHNJZDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEgyNjRCU0RfSERSU19SRFkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogcmV0dXJuIGVycm9yIGlmIHNlY29uZCBwaGFzZSBvZgotICAgICAgICAgICAgICAgICAqIGluaXRpYWxpemF0aW9uIGlzIG5vdCBjb21wbGV0ZWQgKi8KLSAgICAgICAgICAgICAgICBpZiAocFN0b3JhZ2UtPnBlbmRpbmdBY3RpdmF0aW9uKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJQZW5kaW5nIGFjdGl2YXRpb24gbm90IGNvbXBsZXRlZCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEgyNjRCU0RfRVJST1IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlU2xpY2VIZWFkZXIoJnN0cm0sIHBTdG9yYWdlLT5zbGljZUhlYWRlciArIDEsCi0gICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMsIHBTdG9yYWdlLT5hY3RpdmVQcHMsICZuYWxVbml0KTsKLSAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEVQUklOVCgiU0xJQ0VfSEVBREVSIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybihIMjY0QlNEX0VSUk9SKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGgyNjRic2RJc1N0YXJ0T2ZQaWN0dXJlKHBTdG9yYWdlKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghSVNfSURSX05BTF9VTklUKCZuYWxVbml0KSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZENoZWNrR2Fwc0luRnJhbWVOdW0ocFN0b3JhZ2UtPmRwYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+c2xpY2VIZWFkZXJbMV0uZnJhbWVOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFsVW5pdC5uYWxSZWZJZGMgIT0gMCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2Fwc0luRnJhbWVOdW1WYWx1ZUFsbG93ZWRGbGFnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVQUklOVCgiR2FwcyBpbiBmcmFtZSBudW0iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSDI2NEJTRF9FUlJPUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmN1cnJJbWFnZS0+ZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkQWxsb2NhdGVEcGJJbWFnZShwU3RvcmFnZS0+ZHBiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBzdG9yZSBzbGljZSBoZWFkZXIgdG8gc3RvcmFnZSBpZiBzdWNjZXNzZnVsbHkgZGVjb2RlZCAqLwotICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5zbGljZUhlYWRlclswXSA9IHBTdG9yYWdlLT5zbGljZUhlYWRlclsxXTsKLSAgICAgICAgICAgICAgICBwU3RvcmFnZS0+dmFsaWRTbGljZUluQWNjZXNzVW5pdCA9IEhBTlRST19UUlVFOwotICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5wcmV2TmFsVW5pdFswXSA9IG5hbFVuaXQ7Ci0KLSAgICAgICAgICAgICAgICBoMjY0YnNkQ29tcHV0ZVNsaWNlR3JvdXBNYXAocFN0b3JhZ2UsCi0gICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5zbGljZUhlYWRlci0+c2xpY2VHcm91cENoYW5nZUN5Y2xlKTsKLQotICAgICAgICAgICAgICAgIGgyNjRic2RJbml0UmVmUGljTGlzdChwU3RvcmFnZS0+ZHBiKTsKLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkUmVvcmRlclJlZlBpY0xpc3QocFN0b3JhZ2UtPmRwYiwKLSAgICAgICAgICAgICAgICAgICAgJnBTdG9yYWdlLT5zbGljZUhlYWRlci0+cmVmUGljTGlzdFJlb3JkZXJpbmcsCi0gICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5zbGljZUhlYWRlci0+ZnJhbWVOdW0sCi0gICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5zbGljZUhlYWRlci0+bnVtUmVmSWR4TDBBY3RpdmUpOwotICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJSZW9yZGVyaW5nIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybihIMjY0QlNEX0VSUk9SKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBERUJVRygoIlNMSUNFIERBVEEsIEZJUlNUICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLT5maXJzdE1iSW5TbGljZSkpOwotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVTbGljZURhdGEoJnN0cm0sIHBTdG9yYWdlLAotICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+Y3VyckltYWdlLCBwU3RvcmFnZS0+c2xpY2VIZWFkZXIpOwotICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRVBSSU5UKCJTTElDRV9EQVRBIik7Ci0gICAgICAgICAgICAgICAgICAgIGgyNjRic2RNYXJrU2xpY2VDb3JydXB0ZWQocFN0b3JhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+c2xpY2VIZWFkZXItPmZpcnN0TWJJblNsaWNlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEgyNjRCU0RfRVJST1IpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChoMjY0YnNkSXNFbmRPZlBpY3R1cmUocFN0b3JhZ2UpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcGljUmVhZHkgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPnNraXBSZWR1bmRhbnRTbGljZXMgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTkFMX1NFSToKLSAgICAgICAgICAgICAgICBERUJVRygoIlNFSSBNRVNTQUdFLCBOT1QgREVDT0RFRCIpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBERUJVRygoIk5PVCBJTVBMRU1FTlRFRCBZRVQgJWRcbiIsbmFsVW5pdC5uYWxVbml0VHlwZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHBpY1JlYWR5KQotICAgIHsKLSAgICAgICAgaDI2NGJzZEZpbHRlclBpY3R1cmUocFN0b3JhZ2UtPmN1cnJJbWFnZSwgcFN0b3JhZ2UtPm1iKTsKLQotICAgICAgICBoMjY0YnNkUmVzZXRTdG9yYWdlKHBTdG9yYWdlKTsKLQotICAgICAgICBwaWNPcmRlckNudCA9IGgyNjRic2REZWNvZGVQaWNPcmRlckNudChwU3RvcmFnZS0+cG9jLAotICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcywgcFN0b3JhZ2UtPnNsaWNlSGVhZGVyLCBwU3RvcmFnZS0+cHJldk5hbFVuaXQpOwotCi0gICAgICAgIGlmIChwU3RvcmFnZS0+dmFsaWRTbGljZUluQWNjZXNzVW5pdCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBTdG9yYWdlLT5wcmV2TmFsVW5pdC0+bmFsUmVmSWRjKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RNYXJrRGVjUmVmUGljKHBTdG9yYWdlLT5kcGIsCi0gICAgICAgICAgICAgICAgICAgICZwU3RvcmFnZS0+c2xpY2VIZWFkZXItPmRlY1JlZlBpY01hcmtpbmcsCi0gICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5jdXJySW1hZ2UsIHBTdG9yYWdlLT5zbGljZUhlYWRlci0+ZnJhbWVOdW0sCi0gICAgICAgICAgICAgICAgICAgIHBpY09yZGVyQ250LAotICAgICAgICAgICAgICAgICAgICBJU19JRFJfTkFMX1VOSVQocFN0b3JhZ2UtPnByZXZOYWxVbml0KSA/Ci0gICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFLAotICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+Y3VycmVudFBpY0lkLCBwU3RvcmFnZS0+bnVtQ29uY2VhbGVkTWJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIG5vbi1yZWZlcmVuY2UgcGljdHVyZSwganVzdCBzdG9yZSBmb3IgcG9zc2libGUgZGlzcGxheQotICAgICAgICAgICAgICogcmVvcmRlcmluZyAqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RNYXJrRGVjUmVmUGljKHBTdG9yYWdlLT5kcGIsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5jdXJySW1hZ2UsIHBTdG9yYWdlLT5zbGljZUhlYWRlci0+ZnJhbWVOdW0sCi0gICAgICAgICAgICAgICAgICAgIHBpY09yZGVyQ250LAotICAgICAgICAgICAgICAgICAgICBJU19JRFJfTkFMX1VOSVQocFN0b3JhZ2UtPnByZXZOYWxVbml0KSA/Ci0gICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFLAotICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+Y3VycmVudFBpY0lkLCBwU3RvcmFnZS0+bnVtQ29uY2VhbGVkTWJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHBTdG9yYWdlLT5waWNTdGFydGVkID0gSEFOVFJPX0ZBTFNFOwotICAgICAgICBwU3RvcmFnZS0+dmFsaWRTbGljZUluQWNjZXNzVW5pdCA9IEhBTlRST19GQUxTRTsKLQotICAgICAgICByZXR1cm4oSDI2NEJTRF9QSUNfUkRZKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4oSDI2NEJTRF9SRFkpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZFNodXRkb3duCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFNodXRkb3duIGEgZGVjb2RlciBpbnN0YW5jZS4gRnVuY3Rpb24gZnJlZXMgYWxsIHRoZSBtZW1vcmllcwotICAgICAgICAgICAgYWxsb2NhdGVkIGZvciB0aGUgZGVjb2RlciBpbnN0YW5jZS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2UgZGF0YSBzdHJ1Y3R1cmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgbm9uZQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZFNodXRkb3duKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RvcmFnZSk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9TRVFfUEFSQU1fU0VUUzsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHBTdG9yYWdlLT5zcHNbaV0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZSRUUocFN0b3JhZ2UtPnNwc1tpXS0+b2Zmc2V0Rm9yUmVmRnJhbWUpOwotICAgICAgICAgICAgRlJFRShwU3RvcmFnZS0+c3BzW2ldLT52dWlQYXJhbWV0ZXJzKTsKLSAgICAgICAgICAgIEZSRUUocFN0b3JhZ2UtPnNwc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9QSUNfUEFSQU1fU0VUUzsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHBTdG9yYWdlLT5wcHNbaV0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZSRUUocFN0b3JhZ2UtPnBwc1tpXS0+cnVuTGVuZ3RoKTsKLSAgICAgICAgICAgIEZSRUUocFN0b3JhZ2UtPnBwc1tpXS0+dG9wTGVmdCk7Ci0gICAgICAgICAgICBGUkVFKHBTdG9yYWdlLT5wcHNbaV0tPmJvdHRvbVJpZ2h0KTsKLSAgICAgICAgICAgIEZSRUUocFN0b3JhZ2UtPnBwc1tpXS0+c2xpY2VHcm91cElkKTsKLSAgICAgICAgICAgIEZSRUUocFN0b3JhZ2UtPnBwc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBGUkVFKHBTdG9yYWdlLT5tYkxheWVyKTsKLSAgICBGUkVFKHBTdG9yYWdlLT5tYik7Ci0gICAgRlJFRShwU3RvcmFnZS0+c2xpY2VHcm91cE1hcCk7Ci0KLSAgICBoMjY0YnNkRnJlZURwYihwU3RvcmFnZS0+ZHBiKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2ROZXh0T3V0cHV0UGljdHVyZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBHZXQgbmV4dCBvdXRwdXQgcGljdHVyZSBpbiBkaXNwbGF5IG9yZGVyLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBkYXRhIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBwaWNJZCAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBwaWN0dXJlIHdpbGwgYmUgc3RvcmVkIGhlcmUKLSAgICAgICAgICAgIGlzSWRyUGljICAgIElEUiBmbGFnIG9mIHRoZSBwaWN0dXJlIHdpbGwgYmUgc3RvcmVkIGhlcmUKLSAgICAgICAgICAgIG51bUVyck1icyAgIG51bWJlciBvZiBjb25jZWFsZWQgbWFjcm9ibG9ja3MgaW4gdGhlIHBpY3R1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgcGljdHVyZSBkYXRhCi0gICAgICAgICAgICBOVUxMIGlmIG5vIHBpY3R1cmVzIGF2YWlsYWJsZSBmb3IgZGlzcGxheQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11OCogaDI2NGJzZE5leHRPdXRwdXRQaWN0dXJlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHUzMiAqcGljSWQsIHUzMiAqaXNJZHJQaWMsCi0gICAgdTMyICpudW1FcnJNYnMpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgZHBiT3V0UGljdHVyZV90ICpwT3V0OwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0b3JhZ2UpOwotCi0gICAgcE91dCA9IGgyNjRic2REcGJPdXRwdXRQaWN0dXJlKHBTdG9yYWdlLT5kcGIpOwotCi0gICAgaWYgKHBPdXQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgICpwaWNJZCA9IHBPdXQtPnBpY0lkOwotICAgICAgICAqaXNJZHJQaWMgPSBwT3V0LT5pc0lkcjsKLSAgICAgICAgKm51bUVyck1icyA9IHBPdXQtPm51bUVyck1iczsKLSAgICAgICAgcmV0dXJuIChwT3V0LT5kYXRhKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4oTlVMTCk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkUGljV2lkdGgKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgR2V0IHdpZHRoIG9mIHRoZSBwaWN0dXJlIGluIG1hY3JvYmxvY2tzCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIGRhdGEgc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgcGljdHVyZSB3aWR0aAotICAgICAgICAgICAgMCBpZiBwYXJhbWV0ZXJzIHNldHMgbm90IHlldCBhY3RpdmF0ZWQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RQaWNXaWR0aChzdG9yYWdlX3QgKnBTdG9yYWdlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdG9yYWdlKTsKLQotICAgIGlmIChwU3RvcmFnZS0+YWN0aXZlU3BzKQotICAgICAgICByZXR1cm4ocFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljV2lkdGhJbk1icyk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4oMCk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkUGljSGVpZ2h0Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEdldCBoZWlnaHQgb2YgdGhlIHBpY3R1cmUgaW4gbWFjcm9ibG9ja3MKLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2UgZGF0YSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBwaWN0dXJlIHdpZHRoCi0gICAgICAgICAgICAwIGlmIHBhcmFtZXRlcnMgc2V0cyBub3QgeWV0IGFjdGl2YXRlZAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZFBpY0hlaWdodChzdG9yYWdlX3QgKnBTdG9yYWdlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdG9yYWdlKTsKLQotICAgIGlmIChwU3RvcmFnZS0+YWN0aXZlU3BzKQotICAgICAgICByZXR1cm4ocFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljSGVpZ2h0SW5NYnMpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuKDApOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEZsdXNoQnVmZmVyCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZsdXNoIHRoZSBkZWNvZGVkIHBpY3R1cmUgYnVmZmVyLCBzZWUgZHBiLmMgZm9yIGRldGFpbHMKLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2UgZGF0YSBzdHJ1Y3R1cmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkRmx1c2hCdWZmZXIoc3RvcmFnZV90ICpwU3RvcmFnZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RvcmFnZSk7Ci0KLSAgICBoMjY0YnNkRmx1c2hEcGIocFN0b3JhZ2UtPmRwYik7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2hlY2tWYWxpZFBhcmFtU2V0cwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBDaGVjayBpZiBhbnkgdmFsaWQgcGFyYW1ldGVyIHNldCBjb21iaW5hdGlvbnMgKFNQUy9QUFMpIGV4aXN0cy4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIDEgICAgICAgYXQgbGVhc3Qgb25lIHZhbGlkIFNQUy9QUFMgY29tYmluYXRpb24gZm91bmQKLSAgICAgICAgICAgIDAgICAgICAgbm8gdmFsaWQgcGFyYW0gc2V0IGNvbWJpbmF0aW9ucyBmb3VuZAotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkQ2hlY2tWYWxpZFBhcmFtU2V0cyhzdG9yYWdlX3QgKnBTdG9yYWdlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdG9yYWdlKTsKLQotICAgIHJldHVybihoMjY0YnNkVmFsaWRQYXJhbVNldHMocFN0b3JhZ2UpID09IEhBTlRST19PSyA/IDEgOiAwKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RWaWRlb1JhbmdlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEdldCB2YWx1ZSBvZiB2aWRlb19mdWxsX3JhbmdlX2ZsYWcgcmVjZWl2ZWQgaW4gdGhlIFZVSSBkYXRhLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgMSAgIHZpZGVvX2Z1bGxfcmFuZ2VfZmxhZyByZWNlaXZlZCBhbmQgdmFsdWUgaXMgMQotICAgICAgICAgICAgMCAgIG90aGVyd2lzZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZFZpZGVvUmFuZ2Uoc3RvcmFnZV90ICpwU3RvcmFnZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RvcmFnZSk7Ci0KLSAgICBpZiAocFN0b3JhZ2UtPmFjdGl2ZVNwcyAmJiBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzUHJlc2VudEZsYWcgJiYKLSAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycyAmJgotICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzLT52aWRlb1NpZ25hbFR5cGVQcmVzZW50RmxhZyAmJgotICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzLT52aWRlb0Z1bGxSYW5nZUZsYWcpCi0gICAgICAgIHJldHVybigxKTsKLSAgICBlbHNlIC8qIGRlZmF1bHQgdmFsdWUgb2YgdmlkZW9fZnVsbF9yYW5nZV9mbGFnIGlzIDAgKi8KLSAgICAgICAgcmV0dXJuKDApOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZE1hdHJpeENvZWZmaWNpZW50cwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBHZXQgdmFsdWUgb2YgbWF0cml4X2NvZWZmaWNpZW50cyByZWNlaXZlZCBpbiB0aGUgVlVJIGRhdGEKLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHZhbHVlIG9mIG1hdHJpeF9jb2VmZmljaWVudHMgaWYgcmVjZWl2ZWQKLSAgICAgICAgICAgIDIgICBvdGhlcndpc2UgKHRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUpCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkTWF0cml4Q29lZmZpY2llbnRzKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0b3JhZ2UpOwotCi0gICAgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMgJiYgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVyc1ByZXNlbnRGbGFnICYmCi0gICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMgJiYKLSAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycy0+dmlkZW9TaWduYWxUeXBlUHJlc2VudEZsYWcgJiYKLSAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycy0+Y29sb3VyRGVzY3JpcHRpb25QcmVzZW50RmxhZykKLSAgICAgICAgcmV0dXJuKHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPm1hdHJpeENvZWZmaWNpZW50cyk7Ci0gICAgZWxzZSAvKiBkZWZhdWx0IHVuc3BlY2lmaWVkICovCi0gICAgICAgIHJldHVybigyKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGhoMjY0YnNkQ3JvcHBpbmdQYXJhbXMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgR2V0IGNyb3BwaW5nIHBhcmFtZXRlcnMgb2YgdGhlIGFjdGl2ZSBTUFMKLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIGNyb3BwaW5nRmxhZyAgICBmbGFnIGluZGljYXRpbmcgaWYgY3JvcHBpbmcgcGFyYW1zIHByZXNlbnQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZWQgaGVyZQotICAgICAgICAgICAgbGVmdE9mZnNldCAgICAgIGNyb3BwaW5nIGxlZnQgb2Zmc2V0IGluIHBpeGVscyBpcyBzdG9yZWQgaGVyZQotICAgICAgICAgICAgd2lkdGggICAgICAgICAgIHdpZHRoIG9mIHRoZSBpbWFnZSBhZnRlciBjcm9wcGluZyBpcyBzdG9yZWQgaGVyZQotICAgICAgICAgICAgdG9wT2Zmc2V0ICAgICAgIGNyb3BwaW5nIHRvcCBvZmZzZXQgaW4gcGl4ZWxzIGlzIHN0b3JlZCBoZXJlCi0gICAgICAgICAgICBoZWlnaHQgICAgICAgICAgaGVpZ2h0IG9mIHRoZSBpbWFnZSBhZnRlciBjcm9wcGluZyBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZENyb3BwaW5nUGFyYW1zKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHUzMiAqY3JvcHBpbmdGbGFnLAotICAgIHUzMiAqbGVmdE9mZnNldCwgdTMyICp3aWR0aCwgdTMyICp0b3BPZmZzZXQsIHUzMiAqaGVpZ2h0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdG9yYWdlKTsKLQotICAgIGlmIChwU3RvcmFnZS0+YWN0aXZlU3BzICYmIHBTdG9yYWdlLT5hY3RpdmVTcHMtPmZyYW1lQ3JvcHBpbmdGbGFnKQotICAgIHsKLSAgICAgICAgKmNyb3BwaW5nRmxhZyA9IDE7Ci0gICAgICAgICpsZWZ0T2Zmc2V0ID0gMiAqIHBTdG9yYWdlLT5hY3RpdmVTcHMtPmZyYW1lQ3JvcExlZnRPZmZzZXQ7Ci0gICAgICAgICp3aWR0aCA9IDE2ICogcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljV2lkdGhJbk1icyAtCi0gICAgICAgICAgICAgICAgIDIgKiAocFN0b3JhZ2UtPmFjdGl2ZVNwcy0+ZnJhbWVDcm9wTGVmdE9mZnNldCArCi0gICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+ZnJhbWVDcm9wUmlnaHRPZmZzZXQpOwotICAgICAgICAqdG9wT2Zmc2V0ID0gMiAqIHBTdG9yYWdlLT5hY3RpdmVTcHMtPmZyYW1lQ3JvcFRvcE9mZnNldDsKLSAgICAgICAgKmhlaWdodCA9IDE2ICogcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljSGVpZ2h0SW5NYnMgLQotICAgICAgICAgICAgICAgICAgMiAqIChwU3RvcmFnZS0+YWN0aXZlU3BzLT5mcmFtZUNyb3BUb3BPZmZzZXQgKwotICAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5mcmFtZUNyb3BCb3R0b21PZmZzZXQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAqY3JvcHBpbmdGbGFnID0gMDsKLSAgICAgICAgKmxlZnRPZmZzZXQgPSAwOwotICAgICAgICAqd2lkdGggPSAwOwotICAgICAgICAqdG9wT2Zmc2V0ID0gMDsKLSAgICAgICAgKmhlaWdodCA9IDA7Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZFNhbXBsZUFzcGVjdFJhdGlvCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEdldCBhc3BlY3QgcmF0aW8gcmVjZWl2ZWQgaW4gdGhlIFZVSSBkYXRhCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBzYXJXaWR0aCAgICBzYW1wbGUgYXNwZWN0IHJhdGlvIGhlaWdodAotICAgICAgICAgICAgc2FySGVpZ2h0ICAgc2FtcGxlIGFzcGVjdCByYXRpbyB3aWR0aAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RTYW1wbGVBc3BlY3RSYXRpbyhzdG9yYWdlX3QgKnBTdG9yYWdlLCB1MzIgKnNhcldpZHRoLCB1MzIgKnNhckhlaWdodCkKLXsKLQotLyogVmFyaWFibGVzICovCi0gICAgdTMyIHcgPSAxOwotICAgIHUzMiBoID0gMTsKLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RvcmFnZSk7Ci0KLQotICAgIGlmIChwU3RvcmFnZS0+YWN0aXZlU3BzICYmCi0gICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnNQcmVzZW50RmxhZyAmJgotICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzICYmCi0gICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPmFzcGVjdFJhdGlvUHJlc2VudEZsYWcgKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzLT5hc3BlY3RSYXRpb0lkYykKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBBU1BFQ1RfUkFUSU9fVU5TUEVDSUZJRUQ6ICB3ID0gICAwOyBoID0gIDA7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBU1BFQ1RfUkFUSU9fMV8xOiAgICAgICAgICB3ID0gICAxOyBoID0gIDE7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBU1BFQ1RfUkFUSU9fMTJfMTE6ICAgICAgICB3ID0gIDEyOyBoID0gMTE7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBU1BFQ1RfUkFUSU9fMTBfMTE6ICAgICAgICB3ID0gIDEwOyBoID0gMTE7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBU1BFQ1RfUkFUSU9fMTZfMTE6ICAgICAgICB3ID0gIDE2OyBoID0gMTE7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBU1BFQ1RfUkFUSU9fNDBfMzM6ICAgICAgICB3ID0gIDQwOyBoID0gMzM7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBU1BFQ1RfUkFUSU9fMjRfMTE6ICAgICAgICB3ID0gIDI0OyBoID0gMTE7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBU1BFQ1RfUkFUSU9fMjBfMTE6ICAgICAgICB3ID0gIDIwOyBoID0gMTE7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBU1BFQ1RfUkFUSU9fMzJfMTE6ICAgICAgICB3ID0gIDMyOyBoID0gMTE7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBU1BFQ1RfUkFUSU9fODBfMzM6ICAgICAgICB3ID0gIDgwOyBoID0gMzM7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBU1BFQ1RfUkFUSU9fMThfMTE6ICAgICAgICB3ID0gIDE4OyBoID0gMTE7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBU1BFQ1RfUkFUSU9fMTVfMTE6ICAgICAgICB3ID0gIDE1OyBoID0gMTE7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBU1BFQ1RfUkFUSU9fNjRfMzM6ICAgICAgICB3ID0gIDY0OyBoID0gMzM7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBU1BFQ1RfUkFUSU9fMTYwXzk5OiAgICAgICB3ID0gMTYwOyBoID0gOTk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBU1BFQ1RfUkFUSU9fRVhURU5ERURfU0FSOgotICAgICAgICAgICAgICAgIHcgPSBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzLT5zYXJXaWR0aDsKLSAgICAgICAgICAgICAgICBoID0gcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+dnVpUGFyYW1ldGVycy0+c2FySGVpZ2h0OwotICAgICAgICAgICAgICAgIGlmICgodyA9PSAwKSB8fCAoaCA9PSAwKSkKLSAgICAgICAgICAgICAgICAgICAgdyA9IGggPSAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB3ID0gMDsKLSAgICAgICAgICAgICAgICBoID0gMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIHNldCBhc3BlY3QgcmF0aW8qLwotICAgICpzYXJXaWR0aCA9IHc7Ci0gICAgKnNhckhlaWdodCA9IGg7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkUHJvZmlsZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBHZXQgcHJvZmlsZSBpbmZvcm1hdGlvbiBmcm9tIGFjdGl2ZSBTUFMKLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHByb2ZpbGUgICBjdXJyZW50IHByb2ZpbGUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXUzMiBoMjY0YnNkUHJvZmlsZShzdG9yYWdlX3QgKnBTdG9yYWdlKQotewotICAgIGlmIChwU3RvcmFnZS0+YWN0aXZlU3BzKQotICAgICAgICByZXR1cm4gcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cHJvZmlsZUlkYzsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVjb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RlY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMzNjUyMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZGVjb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19ERUNPREVSX0gKLSNkZWZpbmUgSDI2NFNXREVDX0RFQ09ERVJfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zdG9yYWdlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIGVudW1lcmF0ZWQgcmV0dXJuIHZhbHVlcyBvZiB0aGUgZnVuY3Rpb25zICovCi1lbnVtIHsKLSAgICBIMjY0QlNEX1JEWSwKLSAgICBIMjY0QlNEX1BJQ19SRFksCi0gICAgSDI2NEJTRF9IRFJTX1JEWSwKLSAgICBIMjY0QlNEX0VSUk9SLAotICAgIEgyNjRCU0RfUEFSQU1fU0VUX0VSUk9SLAotICAgIEgyNjRCU0RfTUVNQUxMT0NfRVJST1IKLX07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZEluaXQoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyIG5vT3V0cHV0UmVvcmRlcmluZyk7Ci11MzIgaDI2NGJzZERlY29kZShzdG9yYWdlX3QgKnBTdG9yYWdlLCB1OCAqYnl0ZVN0cm0sIHUzMiBsZW4sIHUzMiBwaWNJZCwKLSAgICB1MzIgKnJlYWRCeXRlcyk7Ci12b2lkIGgyNjRic2RTaHV0ZG93bihzdG9yYWdlX3QgKnBTdG9yYWdlKTsKLQotdTgqIGgyNjRic2ROZXh0T3V0cHV0UGljdHVyZShzdG9yYWdlX3QgKnBTdG9yYWdlLCB1MzIgKnBpY0lkLCB1MzIgKmlzSWRyUGljLAotICAgIHUzMiAqbnVtRXJyTWJzKTsKLQotdTMyIGgyNjRic2RQaWNXaWR0aChzdG9yYWdlX3QgKnBTdG9yYWdlKTsKLXUzMiBoMjY0YnNkUGljSGVpZ2h0KHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOwotdTMyIGgyNjRic2RWaWRlb1JhbmdlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOwotdTMyIGgyNjRic2RNYXRyaXhDb2VmZmljaWVudHMoc3RvcmFnZV90ICpwU3RvcmFnZSk7Ci12b2lkIGgyNjRic2RDcm9wcGluZ1BhcmFtcyhzdG9yYWdlX3QgKnBTdG9yYWdlLCB1MzIgKmNyb3BwaW5nRmxhZywKLSAgICB1MzIgKmxlZnQsIHUzMiAqd2lkdGgsIHUzMiAqdG9wLCB1MzIgKmhlaWdodCk7Ci12b2lkIGgyNjRic2RTYW1wbGVBc3BlY3RSYXRpbyhzdG9yYWdlX3QgKnBTdG9yYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyICpzYXJXaWR0aCwgdTMyICpzYXJIZWlnaHQpOwotdTMyIGgyNjRic2RDaGVja1ZhbGlkUGFyYW1TZXRzKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOwotCi12b2lkIGgyNjRic2RGbHVzaEJ1ZmZlcihzdG9yYWdlX3QgKnBTdG9yYWdlKTsKLQotdTMyIGgyNjRic2RQcm9maWxlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19ERUNPREVSX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RwYi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2RwYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDllZWU5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kcGIuYworKysgL2Rldi9udWxsCkBAIC0xLDE1OTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIENvbXBhcmVQaWN0dXJlcwotICAgICAgICAgIGgyNjRic2RSZW9yZGVyUmVmUGljTGlzdAotICAgICAgICAgIE1tY29wMQotICAgICAgICAgIE1tY29wMgotICAgICAgICAgIE1tY29wMwotICAgICAgICAgIE1tY29wNAotICAgICAgICAgIE1tY29wNQotICAgICAgICAgIE1tY29wNgotICAgICAgICAgIGgyNjRic2RNYXJrRGVjUmVmUGljCi0gICAgICAgICAgaDI2NGJzZEdldFJlZlBpY0RhdGEKLSAgICAgICAgICBoMjY0YnNkQWxsb2NhdGVEcGJJbWFnZQotICAgICAgICAgIFNsaWRpbmdXaW5kb3dSZWZQaWNNYXJraW5nCi0gICAgICAgICAgaDI2NGJzZEluaXREcGIKLSAgICAgICAgICBoMjY0YnNkUmVzZXREcGIKLSAgICAgICAgICBoMjY0YnNkSW5pdFJlZlBpY0xpc3QKLSAgICAgICAgICBGaW5kRHBiUGljCi0gICAgICAgICAgU2V0UGljTnVtcwotICAgICAgICAgIGgyNjRic2RDaGVja0dhcHNJbkZyYW1lTnVtCi0gICAgICAgICAgRmluZFNtYWxsZXN0UGljT3JkZXJDbnQKLSAgICAgICAgICBPdXRwdXRQaWN0dXJlCi0gICAgICAgICAgaDI2NGJzZERwYk91dHB1dFBpY3R1cmUKLSAgICAgICAgICBoMjY0YnNkRmx1c2hEcGIKLSAgICAgICAgICBoMjY0YnNkRnJlZURwYgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImgyNjRic2RfY2ZnLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgotI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLSNpbmNsdWRlICJiYXNldHlwZS5oIgotCi0jaW5jbHVkZSA8bG9nL2xvZy5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBtYWNyb3MgdG8gZGV0ZXJtaW5lIHBpY3R1cmUgc3RhdHVzLiBOb3RlIHRoYXQgSVNfU0hPUlRfVEVSTSBtYWNybyByZXR1cm5zCi0gKiB0cnVlIGFsc28gZm9yIG5vbi1leGlzdGluZyBwaWN0dXJlcyBiZWNhdXNlIG5vbi1leGlzdGluZyBwaWN0dXJlcyBhcmUKLSAqIHJlZ2FyZGVkIHNob3J0IHRlcm0gcGljdHVyZXMgYWNjb3JkaW5nIHRvIEguMjY0IHN0YW5kYXJkICovCi0jZGVmaW5lIElTX1JFRkVSRU5DRShhKSAoKGEpLnN0YXR1cykKLSNkZWZpbmUgSVNfRVhJU1RJTkcoYSkgKChhKS5zdGF0dXMgPiBOT05fRVhJU1RJTkcpCi0jZGVmaW5lIElTX1NIT1JUX1RFUk0oYSkgXAotICAgICgoYSkuc3RhdHVzID09IE5PTl9FWElTVElORyB8fCAoYSkuc3RhdHVzID09IFNIT1JUX1RFUk0pCi0jZGVmaW5lIElTX0xPTkdfVEVSTShhKSAoKGEpLnN0YXR1cyA9PSBMT05HX1RFUk0pCi0KLS8qIG1hY3JvIHRvIHNldCBhIHBpY3R1cmUgdW51c2VkIGZvciByZWZlcmVuY2UgKi8KLSNkZWZpbmUgU0VUX1VOVVNFRChhKSAoYSkuc3RhdHVzID0gVU5VU0VEOwotCi0jZGVmaW5lIE1BWF9OVU1fUkVGX0lEWF9MMF9BQ1RJVkUgMTYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaTMyIENvbXBhcmVQaWN0dXJlcyhjb25zdCB2b2lkICpwdHIxLCBjb25zdCB2b2lkICpwdHIyKTsKLQotc3RhdGljIHUzMiBNbWNvcDEoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBjdXJyUGljTnVtLCB1MzIgZGlmZmVyZW5jZU9mUGljTnVtcyk7Ci0KLXN0YXRpYyB1MzIgTW1jb3AyKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgbG9uZ1Rlcm1QaWNOdW0pOwotCi1zdGF0aWMgdTMyIE1tY29wMyhkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGN1cnJQaWNOdW0sIHUzMiBkaWZmZXJlbmNlT2ZQaWNOdW1zLAotICAgIHUzMiBsb25nVGVybUZyYW1lSWR4KTsKLQotc3RhdGljIHUzMiBNbWNvcDQoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBtYXhMb25nVGVybUZyYW1lSWR4KTsKLQotc3RhdGljIHUzMiBNbWNvcDUoZHBiU3RvcmFnZV90ICpkcGIpOwotCi1zdGF0aWMgdTMyIE1tY29wNihkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGZyYW1lTnVtLCBpMzIgcGljT3JkZXJDbnQsCi0gICAgdTMyIGxvbmdUZXJtRnJhbWVJZHgpOwotCi1zdGF0aWMgdTMyIFNsaWRpbmdXaW5kb3dSZWZQaWNNYXJraW5nKGRwYlN0b3JhZ2VfdCAqZHBiKTsKLQotc3RhdGljIGkzMiBGaW5kRHBiUGljKGRwYlN0b3JhZ2VfdCAqZHBiLCBpMzIgcGljTnVtLCB1MzIgaXNTaG9ydFRlcm0pOwotCi1zdGF0aWMgdm9pZCBTZXRQaWNOdW1zKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgY3VyckZyYW1lTnVtKTsKLQotc3RhdGljIGRwYlBpY3R1cmVfdCogRmluZFNtYWxsZXN0UGljT3JkZXJDbnQoZHBiU3RvcmFnZV90ICpkcGIpOwotCi1zdGF0aWMgdTMyIE91dHB1dFBpY3R1cmUoZHBiU3RvcmFnZV90ICpkcGIpOwotCi1zdGF0aWMgdm9pZCBTaGVsbFNvcnQoZHBiUGljdHVyZV90ICpwUGljLCB1MzIgbnVtKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBDb21wYXJlUGljdHVyZXMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gY29tcGFyZSBkcGIgcGljdHVyZXMsIHVzZWQgYnkgdGhlIFNoZWxsU29ydCgpIGZ1bmN0aW9uLgotICAgICAgICAgICAgT3JkZXIgb2YgdGhlIHBpY3R1cmVzIGFmdGVyIHNvcnRpbmcgc2hhbGwgYmUgYXMgZm9sbG93czoKLSAgICAgICAgICAgICAgICAxKSBzaG9ydCB0ZXJtIHJlZmVyZW5jZSBwaWN0dXJlcyBzdGFydGluZyB3aXRoIHRoZSBsYXJnZXN0Ci0gICAgICAgICAgICAgICAgICAgcGljTnVtCi0gICAgICAgICAgICAgICAgMikgbG9uZyB0ZXJtIHJlZmVyZW5jZSBwaWN0dXJlcyBzdGFydGluZyB3aXRoIHRoZSBzbWFsbGVzdAotICAgICAgICAgICAgICAgICAgIGxvbmdUZXJtUGljTnVtCi0gICAgICAgICAgICAgICAgMykgcGljdHVyZXMgdW51c2VkIGZvciByZWZlcmVuY2UgYnV0IG5lZWRlZCBmb3IgZGlzcGxheQotICAgICAgICAgICAgICAgIDQpIG90aGVyIHBpY3R1cmVzCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIC0xICAgICAgcGljIDEgaXMgZ3JlYXRlciB0aGFuIHBpYyAyCi0gICAgICAgICAgICAgMCAgICAgIGVxdWFsIGZyb20gY29tcGFyaXNvbiBwb2ludCBvZiB2aWV3Ci0gICAgICAgICAgICAgMSAgICAgIHBpYyAyIGlzIGdyZWF0ZXIgdGhlbiBwaWMgMQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaTMyIENvbXBhcmVQaWN0dXJlcyhjb25zdCB2b2lkICpwdHIxLCBjb25zdCB2b2lkICpwdHIyKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIGRwYlBpY3R1cmVfdCAqcGljMSwgKnBpYzI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwdHIxKTsKLSAgICBBU1NFUlQocHRyMik7Ci0KLSAgICBwaWMxID0gKGRwYlBpY3R1cmVfdCopcHRyMTsKLSAgICBwaWMyID0gKGRwYlBpY3R1cmVfdCopcHRyMjsKLQotICAgIC8qIGJvdGggYXJlIG5vbi1yZWZlcmVuY2UgcGljdHVyZXMsIGNoZWNrIGlmIG5lZWRlZCBmb3IgZGlzcGxheSAqLwotICAgIGlmICghSVNfUkVGRVJFTkNFKCpwaWMxKSAmJiAhSVNfUkVGRVJFTkNFKCpwaWMyKSkKLSAgICB7Ci0gICAgICAgIGlmIChwaWMxLT50b0JlRGlzcGxheWVkICYmICFwaWMyLT50b0JlRGlzcGxheWVkKQotICAgICAgICAgICAgcmV0dXJuKC0xKTsKLSAgICAgICAgZWxzZSBpZiAoIXBpYzEtPnRvQmVEaXNwbGF5ZWQgJiYgcGljMi0+dG9CZURpc3BsYXllZCkKLSAgICAgICAgICAgIHJldHVybigxKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuKDApOwotICAgIH0KLSAgICAvKiBvbmx5IHBpYyAxIG5lZWRlZCBmb3IgcmVmZXJlbmNlIC0+IGdyZWF0ZXIgKi8KLSAgICBlbHNlIGlmICghSVNfUkVGRVJFTkNFKCpwaWMyKSkKLSAgICAgICAgcmV0dXJuKC0xKTsKLSAgICAvKiBvbmx5IHBpYyAyIG5lZWRlZCBmb3IgcmVmZXJlbmNlIC0+IGdyZWF0ZXIgKi8KLSAgICBlbHNlIGlmICghSVNfUkVGRVJFTkNFKCpwaWMxKSkKLSAgICAgICAgcmV0dXJuKDEpOwotICAgIC8qIGJvdGggYXJlIHNob3J0IHRlcm0gcmVmZXJlbmNlIHBpY3R1cmVzIC0+IGNoZWNrIHBpY051bSAqLwotICAgIGVsc2UgaWYgKElTX1NIT1JUX1RFUk0oKnBpYzEpICYmIElTX1NIT1JUX1RFUk0oKnBpYzIpKQotICAgIHsKLSAgICAgICAgaWYgKHBpYzEtPnBpY051bSA+IHBpYzItPnBpY051bSkKLSAgICAgICAgICAgIHJldHVybigtMSk7Ci0gICAgICAgIGVsc2UgaWYgKHBpYzEtPnBpY051bSA8IHBpYzItPnBpY051bSkKLSAgICAgICAgICAgIHJldHVybigxKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuKDApOwotICAgIH0KLSAgICAvKiBvbmx5IHBpYyAxIGlzIHNob3J0IHRlcm0gLT4gZ3JlYXRlciAqLwotICAgIGVsc2UgaWYgKElTX1NIT1JUX1RFUk0oKnBpYzEpKQotICAgICAgICByZXR1cm4oLTEpOwotICAgIC8qIG9ubHkgcGljIDIgaXMgc2hvcnQgdGVybSAtPiBncmVhdGVyICovCi0gICAgZWxzZSBpZiAoSVNfU0hPUlRfVEVSTSgqcGljMikpCi0gICAgICAgIHJldHVybigxKTsKLSAgICAvKiBib3RoIGFyZSBsb25nIHRlcm0gcmVmZXJlbmNlIHBpY3R1cmVzIC0+IGNoZWNrIHBpY051bSAoY29udGFpbnMgdGhlCi0gICAgICogbG9uZ1Rlcm1QaWNOdW0gKi8KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAocGljMS0+cGljTnVtID4gcGljMi0+cGljTnVtKQotICAgICAgICAgICAgcmV0dXJuKDEpOwotICAgICAgICBlbHNlIGlmIChwaWMxLT5waWNOdW0gPCBwaWMyLT5waWNOdW0pCi0gICAgICAgICAgICByZXR1cm4oLTEpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4oMCk7Ci0gICAgfQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RSZW9yZGVyUmVmUGljTGlzdAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBwZXJmb3JtIHJlZmVyZW5jZSBwaWN0dXJlIGxpc3QgcmVvcmRlcmluZyBiYXNlZCBvbgotICAgICAgICAgICAgcmVvcmRlcmluZyBjb21tYW5kcyByZWNlaXZlZCBpbiB0aGUgc2xpY2UgaGVhZGVyLiBTZWUgZGV0YWlscwotICAgICAgICAgICAgb2YgdGhlIHByb2Nlc3MgaW4gdGhlIEguMjY0IHN0YW5kYXJkLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIGRwYiAgICAgICAgICAgICBwb2ludGVyIHRvIGRwYiBzdG9yYWdlIHN0cnVjdHVyZQotICAgICAgICAgICAgb3JkZXIgICAgICAgICAgIHBvaW50ZXIgdG8gcmVvcmRlcmluZyBjb21tYW5kcwotICAgICAgICAgICAgY3VyckZyYW1lTnVtICAgIGN1cnJlbnQgZnJhbWUgbnVtYmVyCi0gICAgICAgICAgICBudW1SZWZJZHhBY3RpdmUgbnVtYmVyIG9mIGFjdGl2ZSByZWZlcmVuY2UgaW5kaWNlcyBmb3IgY3VycmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgZHBiICAgICAgICAgICAgICdsaXN0JyBmaWVsZCBvZiB0aGUgc3RydWN0dXJlIHJlb3JkZXJlZAotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICBpZiBub24tZXhpc3RpbmcgcGljdHVyZXMgcmVmZXJyZWQgdG8gaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZW9yZGVyaW5nIGNvbW1hbmRzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkUmVvcmRlclJlZlBpY0xpc3QoCi0gIGRwYlN0b3JhZ2VfdCAqZHBiLAotICByZWZQaWNMaXN0UmVvcmRlcmluZ190ICpvcmRlciwKLSAgdTMyIGN1cnJGcmFtZU51bSwKLSAgdTMyIG51bVJlZklkeEFjdGl2ZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgaiwgaywgcGljTnVtUHJlZCwgcmVmSWR4OwotICAgIGkzMiBwaWNOdW0sIHBpY051bU5vV3JhcCwgaW5kZXg7Ci0gICAgdTMyIGlzU2hvcnRUZXJtOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQob3JkZXIpOwotICAgIEFTU0VSVChjdXJyRnJhbWVOdW0gPD0gZHBiLT5tYXhGcmFtZU51bSk7Ci0gICAgQVNTRVJUKG51bVJlZklkeEFjdGl2ZSA8PSBNQVhfTlVNX1JFRl9JRFhfTDBfQUNUSVZFKTsKLQotICAgIC8qIHNldCBkcGIgcGljdHVyZSBudW1iZXJzIGZvciBzb3J0aW5nICovCi0gICAgU2V0UGljTnVtcyhkcGIsIGN1cnJGcmFtZU51bSk7Ci0KLSAgICBpZiAoIW9yZGVyLT5yZWZQaWNMaXN0UmVvcmRlcmluZ0ZsYWdMMCkKLSAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLSAgICByZWZJZHggICAgID0gMDsKLSAgICBwaWNOdW1QcmVkID0gY3VyckZyYW1lTnVtOwotCi0gICAgaSA9IDA7Ci0gICAgd2hpbGUgKG9yZGVyLT5jb21tYW5kW2ldLnJlb3JkZXJpbmdPZlBpY051bXNJZGMgPCAzKQotICAgIHsKLSAgICAgICAgLyogc2hvcnQgdGVybSAqLwotICAgICAgICBpZiAob3JkZXItPmNvbW1hbmRbaV0ucmVvcmRlcmluZ09mUGljTnVtc0lkYyA8IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvcmRlci0+Y29tbWFuZFtpXS5yZW9yZGVyaW5nT2ZQaWNOdW1zSWRjID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGljTnVtTm9XcmFwID0KLSAgICAgICAgICAgICAgICAgICAgKGkzMilwaWNOdW1QcmVkIC0gKGkzMilvcmRlci0+Y29tbWFuZFtpXS5hYnNEaWZmUGljTnVtOwotICAgICAgICAgICAgICAgIGlmIChwaWNOdW1Ob1dyYXAgPCAwKQotICAgICAgICAgICAgICAgICAgICBwaWNOdW1Ob1dyYXAgKz0gKGkzMilkcGItPm1heEZyYW1lTnVtOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBpY051bU5vV3JhcCA9Ci0gICAgICAgICAgICAgICAgICAgIChpMzIpKHBpY051bVByZWQgKyBvcmRlci0+Y29tbWFuZFtpXS5hYnNEaWZmUGljTnVtKTsKLSAgICAgICAgICAgICAgICBpZiAocGljTnVtTm9XcmFwID49IChpMzIpZHBiLT5tYXhGcmFtZU51bSkKLSAgICAgICAgICAgICAgICAgICAgcGljTnVtTm9XcmFwIC09IChpMzIpZHBiLT5tYXhGcmFtZU51bTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBpY051bVByZWQgPSAodTMyKXBpY051bU5vV3JhcDsKLSAgICAgICAgICAgIHBpY051bSA9IHBpY051bU5vV3JhcDsKLSAgICAgICAgICAgIGlmICgodTMyKXBpY051bU5vV3JhcCA+IGN1cnJGcmFtZU51bSkKLSAgICAgICAgICAgICAgICBwaWNOdW0gLT0gKGkzMilkcGItPm1heEZyYW1lTnVtOwotICAgICAgICAgICAgaXNTaG9ydFRlcm0gPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgfQotICAgICAgICAvKiBsb25nIHRlcm0gKi8KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwaWNOdW0gPSAoaTMyKW9yZGVyLT5jb21tYW5kW2ldLmxvbmdUZXJtUGljTnVtOwotICAgICAgICAgICAgaXNTaG9ydFRlcm0gPSBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgfQotICAgICAgICAvKiBmaW5kIGNvcnJlc3BvbmRpbmcgcGljdHVyZSBmcm9tIGRwYiAqLwotICAgICAgICBpbmRleCA9IEZpbmREcGJQaWMoZHBiLCBwaWNOdW0sIGlzU2hvcnRUZXJtKTsKLSAgICAgICAgaWYgKGluZGV4IDwgMCB8fCAhSVNfRVhJU1RJTkcoZHBiLT5idWZmZXJbaW5kZXhdKSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgICAgICAvKiBzaGlmdCBwaWN0dXJlcyAqLwotICAgICAgICBmb3IgKGogPSBudW1SZWZJZHhBY3RpdmU7IGogPiByZWZJZHg7IGotLSkKLSAgICAgICAgICAgIGRwYi0+bGlzdFtqXSA9IGRwYi0+bGlzdFtqLTFdOwotICAgICAgICAvKiBwdXQgcGljdHVyZSBpbnRvIHRoZSBsaXN0ICovCi0gICAgICAgIGRwYi0+bGlzdFtyZWZJZHgrK10gPSAmZHBiLT5idWZmZXJbaW5kZXhdOwotICAgICAgICAvKiByZW1vdmUgbGF0ZXIgcmVmZXJlbmNlcyB0byB0aGUgc2FtZSBwaWN0dXJlICovCi0gICAgICAgIGZvciAoaiA9IGsgPSByZWZJZHg7IGogPD0gbnVtUmVmSWR4QWN0aXZlOyBqKyspCi0gICAgICAgICAgICBpZihkcGItPmxpc3Rbal0gIT0gJmRwYi0+YnVmZmVyW2luZGV4XSkKLSAgICAgICAgICAgICAgICBkcGItPmxpc3RbaysrXSA9IGRwYi0+bGlzdFtqXTsKLQotICAgICAgICBpKys7Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBNbWNvcDEKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gbWFyayBhIHNob3J0LXRlcm0gcmVmZXJlbmNlIHBpY3R1cmUgdW51c2VkIGZvcgotICAgICAgICAgICAgcmVmZXJlbmNlLCBtZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbiBlcXVhbCB0byAxCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgIGZhaWx1cmUsIHBpY3R1cmUgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGJ1ZmZlcgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIE1tY29wMShkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGN1cnJQaWNOdW0sIHUzMiBkaWZmZXJlbmNlT2ZQaWNOdW1zKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIGkzMiBpbmRleCwgcGljTnVtOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoY3VyclBpY051bSA8IGRwYi0+bWF4RnJhbWVOdW0pOwotCi0gICAgcGljTnVtID0gKGkzMiljdXJyUGljTnVtIC0gKGkzMilkaWZmZXJlbmNlT2ZQaWNOdW1zOwotCi0gICAgaW5kZXggPSBGaW5kRHBiUGljKGRwYiwgcGljTnVtLCBIQU5UUk9fVFJVRSk7Ci0gICAgaWYgKGluZGV4IDwgMCkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgU0VUX1VOVVNFRChkcGItPmJ1ZmZlcltpbmRleF0pOwotICAgIGRwYi0+bnVtUmVmRnJhbWVzLS07Ci0gICAgaWYgKCFkcGItPmJ1ZmZlcltpbmRleF0udG9CZURpc3BsYXllZCkKLSAgICAgICAgZHBiLT5mdWxsbmVzcy0tOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBNbWNvcDIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gbWFyayBhIGxvbmctdGVybSByZWZlcmVuY2UgcGljdHVyZSB1bnVzZWQgZm9yCi0gICAgICAgICAgICByZWZlcmVuY2UsIG1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uIGVxdWFsIHRvIDIKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgZmFpbHVyZSwgcGljdHVyZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYnVmZmVyCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgTW1jb3AyKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgbG9uZ1Rlcm1QaWNOdW0pCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgaTMyIGluZGV4OwotCi0vKiBDb2RlICovCi0KLSAgICBpbmRleCA9IEZpbmREcGJQaWMoZHBiLCAoaTMyKWxvbmdUZXJtUGljTnVtLCBIQU5UUk9fRkFMU0UpOwotICAgIGlmIChpbmRleCA8IDApCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIFNFVF9VTlVTRUQoZHBiLT5idWZmZXJbaW5kZXhdKTsKLSAgICBkcGItPm51bVJlZkZyYW1lcy0tOwotICAgIGlmICghZHBiLT5idWZmZXJbaW5kZXhdLnRvQmVEaXNwbGF5ZWQpCi0gICAgICAgIGRwYi0+ZnVsbG5lc3MtLTsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogTW1jb3AzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGFzc2luZyBhIGxvbmdUZXJtRnJhbWVJZHggdG8gYSBzaG9ydC10ZXJtIHJlZmVyZW5jZQotICAgICAgICAgICAgZnJhbWUgKGkuZS4gdG8gY2hhbmdlIGl0IHRvIGEgbG9uZy10ZXJtIHJlZmVyZW5jZSBwaWN0dXJlKSwKLSAgICAgICAgICAgIG1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uIGVxdWFsIHRvIDMKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgZmFpbHVyZSwgc2hvcnQtdGVybSBwaWN0dXJlIGRvZXMgbm90IGV4aXN0IGluIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIG9yIGlzIGEgbm9uLWV4aXN0aW5nIHBpY3R1cmUsIG9yIGludmFsaWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdUZXJtRnJhbWVJZHggZ2l2ZW4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBNbWNvcDMoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBjdXJyUGljTnVtLCB1MzIgZGlmZmVyZW5jZU9mUGljTnVtcywKLSAgICB1MzIgbG9uZ1Rlcm1GcmFtZUlkeCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICBpMzIgaW5kZXgsIHBpY051bTsKLSAgICB1MzIgaTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRwYik7Ci0gICAgQVNTRVJUKGN1cnJQaWNOdW0gPCBkcGItPm1heEZyYW1lTnVtKTsKLQotICAgIGlmICggKGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCA9PSBOT19MT05HX1RFUk1fRlJBTUVfSU5ESUNFUykgfHwKLSAgICAgICAgIChsb25nVGVybUZyYW1lSWR4ID4gZHBiLT5tYXhMb25nVGVybUZyYW1lSWR4KSApCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIC8qIGNoZWNrIGlmIGEgbG9uZyB0ZXJtIHBpY3R1cmUgd2l0aCB0aGUgc2FtZSBsb25nVGVybUZyYW1lSWR4IGFscmVhZHkKLSAgICAgKiBleGlzdCBhbmQgcmVtb3ZlIGl0IGlmIG5lY2Vzc2FyeSAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPm1heFJlZkZyYW1lczsgaSsrKQotICAgICAgICBpZiAoSVNfTE9OR19URVJNKGRwYi0+YnVmZmVyW2ldKSAmJgotICAgICAgICAgICh1MzIpZHBiLT5idWZmZXJbaV0ucGljTnVtID09IGxvbmdUZXJtRnJhbWVJZHgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNFVF9VTlVTRUQoZHBiLT5idWZmZXJbaV0pOwotICAgICAgICAgICAgZHBiLT5udW1SZWZGcmFtZXMtLTsKLSAgICAgICAgICAgIGlmICghZHBiLT5idWZmZXJbaV0udG9CZURpc3BsYXllZCkKLSAgICAgICAgICAgICAgICBkcGItPmZ1bGxuZXNzLS07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgcGljTnVtID0gKGkzMiljdXJyUGljTnVtIC0gKGkzMilkaWZmZXJlbmNlT2ZQaWNOdW1zOwotCi0gICAgaW5kZXggPSBGaW5kRHBiUGljKGRwYiwgcGljTnVtLCBIQU5UUk9fVFJVRSk7Ci0gICAgaWYgKGluZGV4IDwgMCkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIGlmICghSVNfRVhJU1RJTkcoZHBiLT5idWZmZXJbaW5kZXhdKSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgZHBiLT5idWZmZXJbaW5kZXhdLnN0YXR1cyA9IExPTkdfVEVSTTsKLSAgICBkcGItPmJ1ZmZlcltpbmRleF0ucGljTnVtID0gKGkzMilsb25nVGVybUZyYW1lSWR4OwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBNbWNvcDQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gc2V0IG1heExvbmdUZXJtRnJhbWVJZHgsCi0gICAgICAgICAgICBtZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbiBlcXVhbCB0byA0Ci0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgIHN1Y2Nlc3MKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBNbWNvcDQoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBtYXhMb25nVGVybUZyYW1lSWR4KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotCi0vKiBDb2RlICovCi0KLSAgICBkcGItPm1heExvbmdUZXJtRnJhbWVJZHggPSBtYXhMb25nVGVybUZyYW1lSWR4OwotCi0gICAgZm9yIChpID0gMDsgaSA8IGRwYi0+bWF4UmVmRnJhbWVzOyBpKyspCi0gICAgICAgIGlmIChJU19MT05HX1RFUk0oZHBiLT5idWZmZXJbaV0pICYmCi0gICAgICAgICAgKCAoKHUzMilkcGItPmJ1ZmZlcltpXS5waWNOdW0gPiBtYXhMb25nVGVybUZyYW1lSWR4KSB8fAotICAgICAgICAgICAgKGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCA9PSBOT19MT05HX1RFUk1fRlJBTUVfSU5ESUNFUykgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNFVF9VTlVTRUQoZHBiLT5idWZmZXJbaV0pOwotICAgICAgICAgICAgZHBiLT5udW1SZWZGcmFtZXMtLTsKLSAgICAgICAgICAgIGlmICghZHBiLT5idWZmZXJbaV0udG9CZURpc3BsYXllZCkKLSAgICAgICAgICAgICAgICBkcGItPmZ1bGxuZXNzLS07Ci0gICAgICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogTW1jb3A1Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIG1hcmsgYWxsIHJlZmVyZW5jZSBwaWN0dXJlcyB1bnVzZWQgZm9yIHJlZmVyZW5jZSBhbmQKLSAgICAgICAgICAgIHNldCBtYXhMb25nVGVybUZyYW1lSWR4IHRvIE5PX0xPTkdfVEVSTV9GUkFNRV9JTkRJQ0VTLAotICAgICAgICAgICAgbWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb24gZXF1YWwgdG8gNS4gRnVuY3Rpb24gZmx1c2hlcwotICAgICAgICAgICAgdGhlIGJ1ZmZlciBhbmQgcGxhY2VzIGFsbCBwaWN0dXJlcyB0aGF0IGFyZSBuZWVkZWQgZm9yIGRpc3BsYXkgaW50bwotICAgICAgICAgICAgdGhlIG91dHB1dCBidWZmZXIuCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgIHN1Y2Nlc3MKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBNbWNvcDUoZHBiU3RvcmFnZV90ICpkcGIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0KLS8qIENvZGUgKi8KLQotICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKElTX1JFRkVSRU5DRShkcGItPmJ1ZmZlcltpXSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNFVF9VTlVTRUQoZHBiLT5idWZmZXJbaV0pOwotICAgICAgICAgICAgaWYgKCFkcGItPmJ1ZmZlcltpXS50b0JlRGlzcGxheWVkKQotICAgICAgICAgICAgICAgIGRwYi0+ZnVsbG5lc3MtLTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIG91dHB1dCBhbGwgcGljdHVyZXMgKi8KLSAgICB3aGlsZSAoT3V0cHV0UGljdHVyZShkcGIpID09IEhBTlRST19PSykKLSAgICAgICAgOwotICAgIGRwYi0+bnVtUmVmRnJhbWVzID0gMDsKLSAgICBkcGItPm1heExvbmdUZXJtRnJhbWVJZHggPSBOT19MT05HX1RFUk1fRlJBTUVfSU5ESUNFUzsKLSAgICBkcGItPnByZXZSZWZGcmFtZU51bSA9IDA7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IE1tY29wNgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBhc3NpZ24gbG9uZ1Rlcm1GcmFtZUlkeCB0byB0aGUgY3VycmVudCBwaWN0dXJlLAotICAgICAgICAgICAgbWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb24gZXF1YWwgdG8gNgotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICBpbnZhbGlkIGxvbmdUZXJtRnJhbWVJZHggb3Igbm8gcm9vbSBmb3IgY3VycmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSBpbiB0aGUgYnVmZmVyCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgTW1jb3A2KGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgZnJhbWVOdW0sIGkzMiBwaWNPcmRlckNudCwKLSAgICB1MzIgbG9uZ1Rlcm1GcmFtZUlkeCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGZyYW1lTnVtIDwgZHBiLT5tYXhGcmFtZU51bSk7Ci0KLSAgICBpZiAoIChkcGItPm1heExvbmdUZXJtRnJhbWVJZHggPT0gTk9fTE9OR19URVJNX0ZSQU1FX0lORElDRVMpIHx8Ci0gICAgICAgICAobG9uZ1Rlcm1GcmFtZUlkeCA+IGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCkgKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAvKiBjaGVjayBpZiBhIGxvbmcgdGVybSBwaWN0dXJlIHdpdGggdGhlIHNhbWUgbG9uZ1Rlcm1GcmFtZUlkeCBhbHJlYWR5Ci0gICAgICogZXhpc3QgYW5kIHJlbW92ZSBpdCBpZiBuZWNlc3NhcnkgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgZHBiLT5tYXhSZWZGcmFtZXM7IGkrKykKLSAgICAgICAgaWYgKElTX0xPTkdfVEVSTShkcGItPmJ1ZmZlcltpXSkgJiYKLSAgICAgICAgICAodTMyKWRwYi0+YnVmZmVyW2ldLnBpY051bSA9PSBsb25nVGVybUZyYW1lSWR4KQotICAgICAgICB7Ci0gICAgICAgICAgICBTRVRfVU5VU0VEKGRwYi0+YnVmZmVyW2ldKTsKLSAgICAgICAgICAgIGRwYi0+bnVtUmVmRnJhbWVzLS07Ci0gICAgICAgICAgICBpZiAoIWRwYi0+YnVmZmVyW2ldLnRvQmVEaXNwbGF5ZWQpCi0gICAgICAgICAgICAgICAgZHBiLT5mdWxsbmVzcy0tOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgIGlmIChkcGItPm51bVJlZkZyYW1lcyA8IGRwYi0+bWF4UmVmRnJhbWVzKQotICAgIHsKLSAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5mcmFtZU51bSA9IGZyYW1lTnVtOwotICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnBpY051bSAgID0gKGkzMilsb25nVGVybUZyYW1lSWR4OwotICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnBpY09yZGVyQ250ID0gcGljT3JkZXJDbnQ7Ci0gICAgICAgIGRwYi0+Y3VycmVudE91dC0+c3RhdHVzICAgPSBMT05HX1RFUk07Ci0gICAgICAgIGlmIChkcGItPm5vUmVvcmRlcmluZykKLSAgICAgICAgICAgIGRwYi0+Y3VycmVudE91dC0+dG9CZURpc3BsYXllZCA9IEhBTlRST19GQUxTRTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZHBiLT5jdXJyZW50T3V0LT50b0JlRGlzcGxheWVkID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgIGRwYi0+bnVtUmVmRnJhbWVzKys7Ci0gICAgICAgIGRwYi0+ZnVsbG5lc3MrKzsKLSAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci0gICAgfQotICAgIC8qIGlmIHRoZXJlIGlzIG5vIHJvb20sIHJldHVybiBhbiBlcnJvciAqLwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZE1hcmtEZWNSZWZQaWMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gcGVyZm9ybSByZWZlcmVuY2UgcGljdHVyZSBtYXJraW5nIHByb2Nlc3MuIFRoaXMKLSAgICAgICAgICAgIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYm90aCBmb3IgcmVmZXJlbmNlIGFuZCBub24tcmVmZXJlbmNlCi0gICAgICAgICAgICBwaWN0dXJlcy4gIE5vbi1yZWZlcmVuY2UgcGljdHVyZXMgc2hhbGwgaGF2ZSBtYXJrIHBvaW50ZXIgc2V0IHRvCi0gICAgICAgICAgICBOVUxMLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIGRwYiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIERQQiBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgbWFyayAgICAgICAgcG9pbnRlciB0byByZWZlcmVuY2UgcGljdHVyZSBtYXJraW5nIGNvbW1hbmRzCi0gICAgICAgICAgICBpbWFnZSAgICAgICBwb2ludGVyIHRvIGN1cnJlbnQgcGljdHVyZSB0byBiZSBwbGFjZWQgaW4gdGhlIGJ1ZmZlcgotICAgICAgICAgICAgZnJhbWVOdW0gICAgZnJhbWUgbnVtYmVyIG9mIHRoZSBjdXJyZW50IHBpY3R1cmUKLSAgICAgICAgICAgIHBpY09yZGVyQ250IHBpY3R1cmUgb3JkZXIgY291bnQgZm9yIHRoZSBjdXJyZW50IHBpY3R1cmUKLSAgICAgICAgICAgIGlzSWRyICAgICAgIGZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIGN1cnJlbnQgcGljdHVyZSBpcyBhbgotICAgICAgICAgICAgICAgICAgICAgICAgSURSIHBpY3R1cmUKLSAgICAgICAgICAgIGN1cnJlbnRQaWNJZCAgICBpZGVudGlmaWVyIGZvciB0aGUgY3VycmVudCBwaWN0dXJlLCBmcm9tIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uLCBzdG9yZWQgYWxvbmcgd2l0aCB0aGUgcGljdHVyZQotICAgICAgICAgICAgbnVtRXJyTWJzICAgICAgIG51bWJlciBvZiBjb25jZWFsZWQgbWFjcm9ibG9ja3MgaW4gdGhlIGN1cnJlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlLCBzdG9yZWQgYWxvbmcgd2l0aCB0aGUgcGljdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBkcGIgICAgICAgICAnYnVmZmVyJyBtb2RpZmllZCwgcG9zc2libGUgb3V0cHV0IGZyYW1lcyBwbGFjZWQgaW50bwotICAgICAgICAgICAgICAgICAgICAgICAgJ291dEJ1ZicKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgZmFpbHVyZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZE1hcmtEZWNSZWZQaWMoCi0gIGRwYlN0b3JhZ2VfdCAqZHBiLAotICBkZWNSZWZQaWNNYXJraW5nX3QgKm1hcmssCi0gIGltYWdlX3QgKmltYWdlLAotICB1MzIgZnJhbWVOdW0sCi0gIGkzMiBwaWNPcmRlckNudCwKLSAgdTMyIGlzSWRyLAotICB1MzIgY3VycmVudFBpY0lkLAotICB1MzIgbnVtRXJyTWJzKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLCBzdGF0dXM7Ci0gICAgdTMyIG1hcmtlZEFzTG9uZ1Rlcm07Ci0gICAgdTMyIHRvQmVEaXNwbGF5ZWQ7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkcGIpOwotICAgIEFTU0VSVChtYXJrIHx8ICFpc0lkcik7Ci0gICAgQVNTRVJUKCFpc0lkciB8fCAoZnJhbWVOdW0gPT0gMCAmJiBwaWNPcmRlckNudCA9PSAwKSk7Ci0gICAgQVNTRVJUKGZyYW1lTnVtIDwgZHBiLT5tYXhGcmFtZU51bSk7Ci0KLSAgICBpZiAoaW1hZ2UtPmRhdGEgIT0gZHBiLT5jdXJyZW50T3V0LT5kYXRhKQotICAgIHsKLSAgICAgICAgRVBSSU5UKCJUUllJTkcgVE8gTUFSSyBOT04tQUxMT0NBVEVEIElNQUdFIik7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICBkcGItPmxhc3RDb250YWluc01tY281ID0gSEFOVFJPX0ZBTFNFOwotICAgIHN0YXR1cyA9IEhBTlRST19PSzsKLQotICAgIHRvQmVEaXNwbGF5ZWQgPSBkcGItPm5vUmVvcmRlcmluZyA/IEhBTlRST19GQUxTRSA6IEhBTlRST19UUlVFOwotCi0gICAgLyogbm9uLXJlZmVyZW5jZSBwaWN0dXJlLCBzdG9yZWQgZm9yIGRpc3BsYXkgcmVvcmRlcmluZyBwdXJwb3NlcyAqLwotICAgIGlmIChtYXJrID09IE5VTEwpCi0gICAgewotICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnN0YXR1cyA9IFVOVVNFRDsKLSAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5mcmFtZU51bSA9IGZyYW1lTnVtOwotICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnBpY051bSA9IChpMzIpZnJhbWVOdW07Ci0gICAgICAgIGRwYi0+Y3VycmVudE91dC0+cGljT3JkZXJDbnQgPSBwaWNPcmRlckNudDsKLSAgICAgICAgZHBiLT5jdXJyZW50T3V0LT50b0JlRGlzcGxheWVkID0gdG9CZURpc3BsYXllZDsKLSAgICAgICAgaWYgKCFkcGItPm5vUmVvcmRlcmluZykKLSAgICAgICAgICAgIGRwYi0+ZnVsbG5lc3MrKzsKLSAgICB9Ci0gICAgLyogSURSIHBpY3R1cmUgKi8KLSAgICBlbHNlIGlmIChpc0lkcikKLSAgICB7Ci0KLSAgICAgICAgLyogaDI2NGJzZENoZWNrR2Fwc0luRnJhbWVOdW0gbm90IGNhbGxlZCBmb3IgSURSIHBpY3R1cmVzIC0+IGhhdmUgdG8KLSAgICAgICAgICogcmVzZXQgbnVtT3V0IGFuZCBvdXRJbmRleCBoZXJlICovCi0gICAgICAgIGRwYi0+bnVtT3V0ID0gZHBiLT5vdXRJbmRleCA9IDA7Ci0KLSAgICAgICAgLyogZmx1c2ggdGhlIGJ1ZmZlciAqLwotICAgICAgICBNbWNvcDUoZHBiKTsKLSAgICAgICAgLyogaWYgbm9PdXRwdXRPZlByaW9yUGljc0ZsYWcgd2FzIHNldCAtPiB0aGUgcGljdHVyZXMgcHJlY2VkaW5nIHRoZQotICAgICAgICAgKiBJRFIgcGljdHVyZSBzaGFsbCBub3QgYmUgb3V0cHV0IC0+IHNldCBvdXRwdXQgYnVmZmVyIGVtcHR5ICovCi0gICAgICAgIGlmIChtYXJrLT5ub091dHB1dE9mUHJpb3JQaWNzRmxhZyB8fCBkcGItPm5vUmVvcmRlcmluZykKLSAgICAgICAgewotICAgICAgICAgICAgZHBiLT5udW1PdXQgPSAwOwotICAgICAgICAgICAgZHBiLT5vdXRJbmRleCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWFyay0+bG9uZ1Rlcm1SZWZlcmVuY2VGbGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnN0YXR1cyA9IExPTkdfVEVSTTsKLSAgICAgICAgICAgIGRwYi0+bWF4TG9uZ1Rlcm1GcmFtZUlkeCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBkcGItPmN1cnJlbnRPdXQtPnN0YXR1cyA9IFNIT1JUX1RFUk07Ci0gICAgICAgICAgICBkcGItPm1heExvbmdUZXJtRnJhbWVJZHggPSBOT19MT05HX1RFUk1fRlJBTUVfSU5ESUNFUzsKLSAgICAgICAgfQotICAgICAgICBkcGItPmN1cnJlbnRPdXQtPmZyYW1lTnVtICA9IDA7Ci0gICAgICAgIGRwYi0+Y3VycmVudE91dC0+cGljTnVtICAgID0gMDsKLSAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5waWNPcmRlckNudCA9IDA7Ci0gICAgICAgIGRwYi0+Y3VycmVudE91dC0+dG9CZURpc3BsYXllZCA9IHRvQmVEaXNwbGF5ZWQ7Ci0gICAgICAgIGRwYi0+ZnVsbG5lc3MgPSAxOwotICAgICAgICBkcGItPm51bVJlZkZyYW1lcyA9IDE7Ci0gICAgfQotICAgIC8qIHJlZmVyZW5jZSBwaWN0dXJlICovCi0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbWFya2VkQXNMb25nVGVybSA9IEhBTlRST19GQUxTRTsKLSAgICAgICAgaWYgKG1hcmstPmFkYXB0aXZlUmVmUGljTWFya2luZ01vZGVGbGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICBpID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChtYXJrLT5vcGVyYXRpb25baV0ubWVtb3J5TWFuYWdlbWVudENvbnRyb2xPcGVyYXRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChtYXJrLT5vcGVyYXRpb25baV0ubWVtb3J5TWFuYWdlbWVudENvbnRyb2xPcGVyYXRpb24pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBNbWNvcDEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRwYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmstPm9wZXJhdGlvbltpXS5kaWZmZXJlbmNlT2ZQaWNOdW1zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IE1tY29wMihkcGIsIG1hcmstPm9wZXJhdGlvbltpXS5sb25nVGVybVBpY051bSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAgTW1jb3AzKAotICAgICAgICAgICAgICAgICAgICAgICAgICBkcGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrLT5vcGVyYXRpb25baV0uZGlmZmVyZW5jZU9mUGljTnVtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyay0+b3BlcmF0aW9uW2ldLmxvbmdUZXJtRnJhbWVJZHgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gTW1jb3A0KAotICAgICAgICAgICAgICAgICAgICAgICAgICBkcGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmstPm9wZXJhdGlvbltpXS5tYXhMb25nVGVybUZyYW1lSWR4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IE1tY29wNShkcGIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZHBiLT5sYXN0Q29udGFpbnNNbWNvNSA9IEhBTlRST19UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW0gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gTW1jb3A2KAotICAgICAgICAgICAgICAgICAgICAgICAgICBkcGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNPcmRlckNudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyay0+b3BlcmF0aW9uW2ldLmxvbmdUZXJtRnJhbWVJZHgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VkQXNMb25nVGVybSA9IEhBTlRST19UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogLyogaW52YWxpZCBtZW1vcnkgbWFuYWdlbWVudCBjb250cm9sIG9wZXJhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gSEFOVFJPX05PSzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBTbGlkaW5nV2luZG93UmVmUGljTWFya2luZyhkcGIpOwotICAgICAgICB9Ci0gICAgICAgIC8qIGlmIGN1cnJlbnQgcGljdHVyZSB3YXMgbm90IG1hcmtlZCBhcyBsb25nLXRlcm0gcmVmZXJlbmNlIGJ5Ci0gICAgICAgICAqIG1lbW9yeSBtYW5hZ2VtZW50IGNvbnRyb2wgb3BlcmF0aW9uIDYgLT4gbWFyayBjdXJyZW50IGFzIHNob3J0Ci0gICAgICAgICAqIHRlcm0gYW5kIGluc2VydCBpdCBpbnRvIGRwYiAoaWYgdGhlcmUgaXMgcm9vbSkgKi8KLSAgICAgICAgaWYgKCFtYXJrZWRBc0xvbmdUZXJtKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZHBiLT5udW1SZWZGcmFtZXMgPCBkcGItPm1heFJlZkZyYW1lcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkcGItPmN1cnJlbnRPdXQtPmZyYW1lTnVtID0gZnJhbWVOdW07Ci0gICAgICAgICAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5waWNOdW0gICA9IChpMzIpZnJhbWVOdW07Ci0gICAgICAgICAgICAgICAgZHBiLT5jdXJyZW50T3V0LT5waWNPcmRlckNudCA9IHBpY09yZGVyQ250OwotICAgICAgICAgICAgICAgIGRwYi0+Y3VycmVudE91dC0+c3RhdHVzICAgPSBTSE9SVF9URVJNOwotICAgICAgICAgICAgICAgIGRwYi0+Y3VycmVudE91dC0+dG9CZURpc3BsYXllZCA9IHRvQmVEaXNwbGF5ZWQ7Ci0gICAgICAgICAgICAgICAgZHBiLT5mdWxsbmVzcysrOwotICAgICAgICAgICAgICAgIGRwYi0+bnVtUmVmRnJhbWVzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBubyByb29tICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gSEFOVFJPX05PSzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGRwYi0+Y3VycmVudE91dC0+aXNJZHIgPSBpc0lkcjsKLSAgICBkcGItPmN1cnJlbnRPdXQtPnBpY0lkID0gY3VycmVudFBpY0lkOwotICAgIGRwYi0+Y3VycmVudE91dC0+bnVtRXJyTWJzID0gbnVtRXJyTWJzOwotCi0gICAgLyogZHBiIHdhcyBpbml0aWFsaXplZCB0byBub3QgdG8gcmVvcmRlciB0aGUgcGljdHVyZXMgLT4gb3V0cHV0IGN1cnJlbnQKLSAgICAgKiBwaWN0dXJlIGltbWVkaWF0ZWx5ICovCi0gICAgaWYgKGRwYi0+bm9SZW9yZGVyaW5nKQotICAgIHsKLSAgICAgICAgQVNTRVJUKGRwYi0+bnVtT3V0ID09IDApOwotICAgICAgICBBU1NFUlQoZHBiLT5vdXRJbmRleCA9PSAwKTsKLSAgICAgICAgZHBiLT5vdXRCdWZbZHBiLT5udW1PdXRdLmRhdGEgID0gZHBiLT5jdXJyZW50T3V0LT5kYXRhOwotICAgICAgICBkcGItPm91dEJ1ZltkcGItPm51bU91dF0uaXNJZHIgPSBkcGItPmN1cnJlbnRPdXQtPmlzSWRyOwotICAgICAgICBkcGItPm91dEJ1ZltkcGItPm51bU91dF0ucGljSWQgPSBkcGItPmN1cnJlbnRPdXQtPnBpY0lkOwotICAgICAgICBkcGItPm91dEJ1ZltkcGItPm51bU91dF0ubnVtRXJyTWJzID0gZHBiLT5jdXJyZW50T3V0LT5udW1FcnJNYnM7Ci0gICAgICAgIGRwYi0+bnVtT3V0Kys7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIG91dHB1dCBwaWN0dXJlcyBpZiBidWZmZXIgZnVsbCAqLwotICAgICAgICB3aGlsZSAoZHBiLT5mdWxsbmVzcyA+IGRwYi0+ZHBiU2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaSA9IE91dHB1dFBpY3R1cmUoZHBiKTsKLSAgICAgICAgICAgIEFTU0VSVChpID09IEhBTlRST19PSyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBzb3J0IGRwYiAqLwotICAgIFNoZWxsU29ydChkcGItPmJ1ZmZlciwgZHBiLT5kcGJTaXplKzEpOwotCi0gICAgcmV0dXJuKHN0YXR1cyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkR2V0UmVmUGljRGF0YQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBnZXQgcmVmZXJlbmNlIHBpY3R1cmUgZGF0YSBmcm9tIHRoZSByZWZlcmVuY2UgcGljdHVyZQotICAgICAgICAgICAgbGlzdAotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBwb2ludGVyIHRvIGRlc2lyZWQgcmVmZXJlbmNlIHBpY3R1cmUgZGF0YQotICAgICAgICAgICAgTlVMTCBpZiBpbnZhbGlkIGluZGV4IG9yIG5vbi1leGlzdGluZyBwaWN0dXJlIHJlZmVycmVkCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXU4KiBoMjY0YnNkR2V0UmVmUGljRGF0YShkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGluZGV4KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgaWYoaW5kZXggPiAxNiB8fCBkcGItPmxpc3RbaW5kZXhdID09IE5VTEwpCi0gICAgICAgIHJldHVybihOVUxMKTsKLSAgICBlbHNlIGlmKCFJU19FWElTVElORygqZHBiLT5saXN0W2luZGV4XSkpCi0gICAgICAgIHJldHVybihOVUxMKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybihkcGItPmxpc3RbaW5kZXhdLT5kYXRhKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RBbGxvY2F0ZURwYkltYWdlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIGZ1bmN0aW9uIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgYSBpbWFnZS4gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdAotICAgICAgICAgICAgcmVhbGx5IGFsbG9jYXRlIGFueSBtZW1vcnkgYnV0IHJlc2VydmVzIG9uZSBvZiB0aGUgYnVmZmVyCi0gICAgICAgICAgICBwb3NpdGlvbnMgZm9yIGRlY29kaW5nIG9mIGN1cnJlbnQgcGljdHVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBwb2ludGVyIHRvIG1lbW9yeSBhcmVhIGZvciB0aGUgaW1hZ2UKLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11OCogaDI2NGJzZEFsbG9jYXRlRHBiSW1hZ2UoZHBiU3RvcmFnZV90ICpkcGIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoICFkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLnRvQmVEaXNwbGF5ZWQgJiYKLSAgICAgICAgICAgICFJU19SRUZFUkVOQ0UoZHBiLT5idWZmZXJbZHBiLT5kcGJTaXplXSkgKTsKLSAgICBBU1NFUlQoZHBiLT5mdWxsbmVzcyA8PSAgZHBiLT5kcGJTaXplKTsKLQotICAgIGRwYi0+Y3VycmVudE91dCA9IGRwYi0+YnVmZmVyICsgZHBiLT5kcGJTaXplOwotCi0gICAgcmV0dXJuKGRwYi0+Y3VycmVudE91dC0+ZGF0YSk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBTbGlkaW5nV2luZG93UmVmUGljTWFya2luZwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBwZXJmb3JtIHNsaWRpbmcgd2luZG93IHJlZmVuY2UgcGljdHVyZSBtYXJraW5nIHByb2Nlc3MuCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgIGZhaWx1cmUsIG5vIHNob3J0LXRlcm0gcmVmZXJlbmNlIGZyYW1lIGZvdW5kIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdWxkIGJlIG1hcmtlZCB1bnVzZWQKLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIFNsaWRpbmdXaW5kb3dSZWZQaWNNYXJraW5nKGRwYlN0b3JhZ2VfdCAqZHBiKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIGkzMiBpbmRleCwgcGljTnVtOwotICAgIHUzMiBpOwotCi0vKiBDb2RlICovCi0KLSAgICBpZiAoZHBiLT5udW1SZWZGcmFtZXMgPCBkcGItPm1heFJlZkZyYW1lcykKLSAgICB7Ci0gICAgICAgIHJldHVybihIQU5UUk9fT0spOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpbmRleCA9IC0xOwotICAgICAgICBwaWNOdW0gPSAwOwotICAgICAgICAvKiBmaW5kIHRoZSBvbGRlc3Qgc2hvcnQgdGVybSBwaWN0dXJlICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPm51bVJlZkZyYW1lczsgaSsrKQotICAgICAgICAgICAgaWYgKElTX1NIT1JUX1RFUk0oZHBiLT5idWZmZXJbaV0pKQotICAgICAgICAgICAgICAgIGlmIChkcGItPmJ1ZmZlcltpXS5waWNOdW0gPCBwaWNOdW0gfHwgaW5kZXggPT0gLTEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbmRleCA9IChpMzIpaTsKLSAgICAgICAgICAgICAgICAgICAgcGljTnVtID0gZHBiLT5idWZmZXJbaV0ucGljTnVtOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgaWYgKGluZGV4ID49IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNFVF9VTlVTRUQoZHBiLT5idWZmZXJbaW5kZXhdKTsKLSAgICAgICAgICAgIGRwYi0+bnVtUmVmRnJhbWVzLS07Ci0gICAgICAgICAgICBpZiAoIWRwYi0+YnVmZmVyW2luZGV4XS50b0JlRGlzcGxheWVkKQotICAgICAgICAgICAgICAgIGRwYi0+ZnVsbG5lc3MtLTsKLQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW5pdERwYgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBpbml0aWFsaXplIERQQi4gUmVzZXJ2ZXMgbWVtb3JpZXMgZm9yIHRoZSBidWZmZXIsCi0gICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZSBsaXN0IGFuZCBvdXRwdXQgYnVmZmVyLiBkcGJTaXplIGluZGljYXRlcwotICAgICAgICAgICAgdGhlIG1heGltdW0gRFBCIHNpemUgaW5kaWNhdGVkIGJ5IHRoZSBsZXZlbElkYyBpbiB0aGUgc3RyZWFtLgotICAgICAgICAgICAgSWYgbm9SZW9yZGVyaW5nIGZsYWcgaXMgRkFMU0UgdGhlIERQQiBzdG9yZXMgZHBiU2l6ZSBwaWN0dXJlcwotICAgICAgICAgICAgZm9yIGRpc3BsYXkgcmVvcmRlcmluZyBwdXJwb3Nlcy4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoZQotICAgICAgICAgICAgZmxhZyBpcyBUUlVFIHRoZSBEUEIgb25seSBzdG9yZXMgbWF4UmVmRnJhbWVzIHJlZmVyZW5jZSBwaWN0dXJlcwotICAgICAgICAgICAgYW5kIG91dHB1dHMgYWxsIHRoZSBwaWN0dXJlcyBpbW1lZGlhdGVseS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwaWNTaXplSW5NYnMgICAgcGljdHVyZSBzaXplIGluIG1hY3JvYmxvY2tzCi0gICAgICAgICAgICBkcGJTaXplICAgICAgICAgc2l6ZSBvZiB0aGUgRFBCIChudW1iZXIgb2YgcGljdHVyZXMpCi0gICAgICAgICAgICBtYXhSZWZGcmFtZXMgICAgbWF4IG51bWJlciBvZiByZWZlcmVuY2UgZnJhbWVzCi0gICAgICAgICAgICBtYXhGcmFtZU51bSAgICAgbWF4IGZyYW1lIG51bWJlcgotICAgICAgICAgICAgbm9SZW9yZGVyaW5nICAgIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCBEUEIgZG9lcyBub3QgaGF2ZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBhcmUgdG8gcmVvcmRlciBmcmFtZXMgZm9yIGRpc3BsYXkKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgZHBiICAgICAgICAgICAgIHBvaW50ZXIgdG8gZHBiIGRhdGEgc3RvcmFnZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgTUVNT1JZX0FMTE9DQVRJT05fRVJST1IgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkSW5pdERwYigKLSAgZHBiU3RvcmFnZV90ICpkcGIsCi0gIHUzMiBwaWNTaXplSW5NYnMsCi0gIHUzMiBkcGJTaXplLAotICB1MzIgbWF4UmVmRnJhbWVzLAotICB1MzIgbWF4RnJhbWVOdW0sCi0gIHUzMiBub1Jlb3JkZXJpbmcpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwaWNTaXplSW5NYnMpOwotICAgIEFTU0VSVChtYXhSZWZGcmFtZXMgPD0gTUFYX05VTV9SRUZfUElDUyk7Ci0gICAgQVNTRVJUKG1heFJlZkZyYW1lcyA8PSBkcGJTaXplKTsKLSAgICBBU1NFUlQobWF4RnJhbWVOdW0pOwotICAgIEFTU0VSVChkcGJTaXplKTsKLQotICAgIC8vIHNlZSBjb21tZW50IGluIGxvb3AgYmVsb3cgYWJvdXQgc2l6ZSBjYWxjdWxhdGlvbgotICAgIGlmIChwaWNTaXplSW5NYnMgPiAoVUlOVDMyX01BWCAtIDMyIC0gMTUpIC8gMzg0KSB7Ci0gICAgICAgIEFMT0dFKCJiLzI4NTMzNTYyIik7Ci0gICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjg1MzM1NjIiKTsKLSAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKLSAgICB9Ci0KLSAgICBkcGItPm1heExvbmdUZXJtRnJhbWVJZHggPSBOT19MT05HX1RFUk1fRlJBTUVfSU5ESUNFUzsKLSAgICBkcGItPm1heFJlZkZyYW1lcyAgICAgICAgPSBNQVgobWF4UmVmRnJhbWVzLCAxKTsKLSAgICBpZiAobm9SZW9yZGVyaW5nKQotICAgICAgICBkcGItPmRwYlNpemUgICAgICAgICA9IGRwYi0+bWF4UmVmRnJhbWVzOwotICAgIGVsc2UKLSAgICAgICAgZHBiLT5kcGJTaXplICAgICAgICAgPSBkcGJTaXplOwotICAgIGRwYi0+bWF4RnJhbWVOdW0gICAgICAgICA9IG1heEZyYW1lTnVtOwotICAgIGRwYi0+bm9SZW9yZGVyaW5nICAgICAgICA9IG5vUmVvcmRlcmluZzsKLSAgICBkcGItPmZ1bGxuZXNzICAgICAgICAgICAgPSAwOwotICAgIGRwYi0+bnVtUmVmRnJhbWVzICAgICAgICA9IDA7Ci0gICAgZHBiLT5wcmV2UmVmRnJhbWVOdW0gICAgID0gMDsKLQotICAgIEFMTE9DQVRFKGRwYi0+YnVmZmVyLCBNQVhfTlVNX1JFRl9JRFhfTDBfQUNUSVZFICsgMSwgZHBiUGljdHVyZV90KTsKLSAgICBpZiAoZHBiLT5idWZmZXIgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKLSAgICBIMjY0U3dEZWNNZW1zZXQoZHBiLT5idWZmZXIsIDAsCi0gICAgICAgICAgICAoTUFYX05VTV9SRUZfSURYX0wwX0FDVElWRSArIDEpKnNpemVvZihkcGJQaWN0dXJlX3QpKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgZHBiLT5kcGJTaXplICsgMTsgaSsrKQotICAgIHsKLSAgICAgICAgLyogQWxsb2NhdGUgbmVlZGVkIGFtb3VudCBvZiBtZW1vcnksIHdoaWNoIGlzOgotICAgICAgICAgKiBpbWFnZSBzaXplICsgMzIgKyAxNSwgd2hlcmUgMzIgY2FtZXMgZnJvbSB0aGUgZmFjdCB0aGF0IGluIEFSTSBPcGVuTWF4Ci0gICAgICAgICAqIERMIGltcGxlbWVudGF0aW9uIEZ1bmN0aW9ucyBtYXkgcmVhZCBiZXlvbmQgdGhlIGVuZCBvZiBhbiBhcnJheSwKLSAgICAgICAgICogYnkgYSBtYXhpbXVtIG9mIDMyIGJ5dGVzLiBBbmQgKzE1IGNhbWVzIGZvciB0aGUgbmVlZCB0byBhbGlnbiBtZW1vcnkKLSAgICAgICAgICogdG8gMTYtYnl0ZSBib3VuZGFyeSAqLwotICAgICAgICBBTExPQ0FURShkcGItPmJ1ZmZlcltpXS5wQWxsb2NhdGVkRGF0YSwgKHBpY1NpemVJbk1icyozODQgKyAzMisxNSksIHU4KTsKLSAgICAgICAgaWYgKGRwYi0+YnVmZmVyW2ldLnBBbGxvY2F0ZWREYXRhID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOwotCi0gICAgICAgIGRwYi0+YnVmZmVyW2ldLmRhdGEgPSBBTElHTihkcGItPmJ1ZmZlcltpXS5wQWxsb2NhdGVkRGF0YSwgMTYpOwotICAgIH0KLQotICAgIEFMTE9DQVRFKGRwYi0+bGlzdCwgTUFYX05VTV9SRUZfSURYX0wwX0FDVElWRSArIDEsIGRwYlBpY3R1cmVfdCopOwotICAgIEFMTE9DQVRFKGRwYi0+b3V0QnVmLCBkcGItPmRwYlNpemUrMSwgZHBiT3V0UGljdHVyZV90KTsKLQotICAgIGlmIChkcGItPmxpc3QgPT0gTlVMTCB8fCBkcGItPm91dEJ1ZiA9PSBOVUxMKQotICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOwotCi0gICAgSDI2NFN3RGVjTWVtc2V0KGRwYi0+bGlzdCwgMCwKLSAgICAgICAgICAgICgoTUFYX05VTV9SRUZfSURYX0wwX0FDVElWRSArIDEpICogc2l6ZW9mKGRwYlBpY3R1cmVfdCopKSApOwotCi0gICAgZHBiLT5udW1PdXQgPSBkcGItPm91dEluZGV4ID0gMDsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZFJlc2V0RHBiCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIHJlc2V0IERQQi4gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdoZW4gYW4gSURSCi0gICAgICAgICAgICBzbGljZSAob3RoZXIgdGhhbiB0aGUgZmlyc3QpIGFjdGl2YXRlcyBuZXcgc2VxdWVuY2UgcGFyYW1ldGVyIHNldC4KLSAgICAgICAgICAgIEZ1bmN0aW9uIGNhbGxzIGgyNjRic2RGcmVlRHBiIHRvIGZyZWUgb2xkIGFsbG9jYXRlZCBtZW1vcmllcyBhbmQKLSAgICAgICAgICAgIGgyNjRic2RJbml0RHBiIHRvIHJlLWluaXRpYWxpemUgdGhlIERQQi4gU2FtZSBpbnB1dHMsIG91dHB1dHMgYW5kCi0gICAgICAgICAgICByZXR1cm5zIGFzIGZvciBoMjY0YnNkSW5pdERwYi4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RSZXNldERwYigKLSAgZHBiU3RvcmFnZV90ICpkcGIsCi0gIHUzMiBwaWNTaXplSW5NYnMsCi0gIHUzMiBkcGJTaXplLAotICB1MzIgbWF4UmVmRnJhbWVzLAotICB1MzIgbWF4RnJhbWVOdW0sCi0gIHUzMiBub1Jlb3JkZXJpbmcpCi17Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwaWNTaXplSW5NYnMpOwotICAgIEFTU0VSVChtYXhSZWZGcmFtZXMgPD0gTUFYX05VTV9SRUZfUElDUyk7Ci0gICAgQVNTRVJUKG1heFJlZkZyYW1lcyA8PSBkcGJTaXplKTsKLSAgICBBU1NFUlQobWF4RnJhbWVOdW0pOwotICAgIEFTU0VSVChkcGJTaXplKTsKLQotICAgIGgyNjRic2RGcmVlRHBiKGRwYik7Ci0KLSAgICByZXR1cm4gaDI2NGJzZEluaXREcGIoZHBiLCBwaWNTaXplSW5NYnMsIGRwYlNpemUsIG1heFJlZkZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RnJhbWVOdW0sIG5vUmVvcmRlcmluZyk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEluaXRSZWZQaWNMaXN0Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGluaXRpYWxpemUgcmVmZXJlbmNlIHBpY3R1cmUgbGlzdC4gRnVuY3Rpb24ganVzdAotICAgICAgICAgICAgc2V0cyBwb2ludGVycyBpbiB0aGUgbGlzdCBhY2NvcmRpbmcgdG8gcGljdHVyZXMgaW4gdGhlIGJ1ZmZlci4KLSAgICAgICAgICAgIFRoZSBidWZmZXIgaXMgYXNzdW1lZCB0byBjb250YWluIHBpY3R1cmVzIHNvcnRlZCBhY2NvcmRpbmcgdG8KLSAgICAgICAgICAgIHdoYXQgdGhlIEguMjY0IHN0YW5kYXJkIHNheXMgYWJvdXQgaW5pdGlhbCByZWZlcmVuY2UgcGljdHVyZSBsaXN0LgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIGRwYiAgICAgcG9pbnRlciB0byBkcGIgZGF0YSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgZHBiICAgICAnbGlzdCcgZmllbGQgaW5pdGlhbGl6ZWQKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgbm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RJbml0UmVmUGljTGlzdChkcGJTdG9yYWdlX3QgKmRwYikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLQotLyogQ29kZSAqLwotCi0gICAgZm9yIChpID0gMDsgaSA8IGRwYi0+bnVtUmVmRnJhbWVzOyBpKyspCi0gICAgICAgIGRwYi0+bGlzdFtpXSA9ICZkcGItPmJ1ZmZlcltpXTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEZpbmREcGJQaWMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gZmluZCBhIHJlZmVyZW5jZSBwaWN0dXJlIGZyb20gdGhlIGJ1ZmZlci4gVGhlIHBpY3R1cmUKLSAgICAgICAgICAgIHRvIGJlIGZvdW5kIGlzIGlkZW50aWZpZWQgYnkgcGljTnVtIGFuZCBpc1Nob3J0VGVybSBmbGFnLgotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBpbmRleCBvZiB0aGUgcGljdHVyZSBpbiB0aGUgYnVmZmVyCi0gICAgICAgICAgICAtMSBpZiB0aGUgc3BlY2lmaWVkIHBpY3R1cmUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgYnVmZmVyCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpMzIgRmluZERwYlBpYyhkcGJTdG9yYWdlX3QgKmRwYiwgaTMyIHBpY051bSwgdTMyIGlzU2hvcnRUZXJtKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpID0gMDsKLSAgICB1MzIgZm91bmQgPSBIQU5UUk9fRkFMU0U7Ci0KLS8qIENvZGUgKi8KLQotICAgIGlmIChpc1Nob3J0VGVybSkKLSAgICB7Ci0gICAgICAgIHdoaWxlIChpIDwgZHBiLT5tYXhSZWZGcmFtZXMgJiYgIWZvdW5kKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoSVNfU0hPUlRfVEVSTShkcGItPmJ1ZmZlcltpXSkgJiYKLSAgICAgICAgICAgICAgZHBiLT5idWZmZXJbaV0ucGljTnVtID09IHBpY051bSkKLSAgICAgICAgICAgICAgICBmb3VuZCA9IEhBTlRST19UUlVFOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBBU1NFUlQocGljTnVtID49IDApOwotICAgICAgICB3aGlsZSAoaSA8IGRwYi0+bWF4UmVmRnJhbWVzICYmICFmb3VuZCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKElTX0xPTkdfVEVSTShkcGItPmJ1ZmZlcltpXSkgJiYKLSAgICAgICAgICAgICAgZHBiLT5idWZmZXJbaV0ucGljTnVtID09IHBpY051bSkKLSAgICAgICAgICAgICAgICBmb3VuZCA9IEhBTlRST19UUlVFOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChmb3VuZCkKLSAgICAgICAgcmV0dXJuKChpMzIpaSk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4oLTEpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogU2V0UGljTnVtcwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBzZXQgcGljTnVtIHZhbHVlcyBmb3Igc2hvcnQtdGVybSBwaWN0dXJlcyBpbiB0aGUKLSAgICAgICAgICAgIGJ1ZmZlci4gTnVtYmVyaW5nIG9mIHBpY3R1cmVzIGlzIGJhc2VkIG9uIGZyYW1lIG51bWJlcnMgYW5kIGFzCi0gICAgICAgICAgICBmcmFtZSBudW1iZXJzIGFyZSBtb2R1bG8gbWF4RnJhbWVOdW0gLT4gZnJhbWUgbnVtYmVycyBvZiBvbGRlcgotICAgICAgICAgICAgcGljdHVyZXMgaW4gdGhlIGJ1ZmZlciBtYXkgYmUgYmlnZ2VyIHRoYW4gdGhlIGN1cnJGcmFtZU51bS4KLSAgICAgICAgICAgIHBpY051bXMgd2lsbCBiZSBzZXQgc28gdGhhdCBjdXJyZW50IGZyYW1lIGhhcyB0aGUgbGFyZ2VzdCBwaWNOdW0KLSAgICAgICAgICAgIGFuZCBhbGwgdGhlIHNob3J0LXRlcm0gZnJhbWVzIGluIHRoZSBidWZmZXIgd2lsbCBnZXQgc21hbGxlciBwaWNOdW0KLSAgICAgICAgICAgIHJlcHJlc2VudGluZyB0aGVpciAiZGlzdGFuY2UiIGZyb20gdGhlIGN1cnJlbnQgZnJhbWUuIFRoaXMKLSAgICAgICAgICAgIGZ1bmN0aW9uIGtpbmQgb2YgbWFwcyB0aGUgbW9kdWxvIGFyaXRobWV0aWMgYmFjayB0byBub3JtYWwuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB2b2lkIFNldFBpY051bXMoZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBjdXJyRnJhbWVOdW0pCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0gICAgaTMyIGZyYW1lTnVtV3JhcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRwYik7Ci0gICAgQVNTRVJUKGN1cnJGcmFtZU51bSA8IGRwYi0+bWF4RnJhbWVOdW0pOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGRwYi0+bnVtUmVmRnJhbWVzOyBpKyspCi0gICAgICAgIGlmIChJU19TSE9SVF9URVJNKGRwYi0+YnVmZmVyW2ldKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGRwYi0+YnVmZmVyW2ldLmZyYW1lTnVtID4gY3VyckZyYW1lTnVtKQotICAgICAgICAgICAgICAgIGZyYW1lTnVtV3JhcCA9Ci0gICAgICAgICAgICAgICAgICAgIChpMzIpZHBiLT5idWZmZXJbaV0uZnJhbWVOdW0gLSAoaTMyKWRwYi0+bWF4RnJhbWVOdW07Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZnJhbWVOdW1XcmFwID0gKGkzMilkcGItPmJ1ZmZlcltpXS5mcmFtZU51bTsKLSAgICAgICAgICAgIGRwYi0+YnVmZmVyW2ldLnBpY051bSA9IGZyYW1lTnVtV3JhcDsKLSAgICAgICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZENoZWNrR2Fwc0luRnJhbWVOdW0KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gY2hlY2sgZ2FwcyBpbiBmcmFtZV9udW0gYW5kIGdlbmVyYXRlIG5vbi1leGlzdGluZwotICAgICAgICAgICAgKHNob3J0IHRlcm0pIHJlZmVyZW5jZSBwaWN0dXJlcyBpZiBuZWNlc3NhcnkuIFRoaXMgZnVuY3Rpb24gc2hvdWxkCi0gICAgICAgICAgICBiZSBjYWxsZWQgb25seSBmb3Igbm9uLUlEUiBwaWN0dXJlcy4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBkcGIgICAgICAgICBwb2ludGVyIHRvIGRwYiBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgZnJhbWVOdW0gICAgZnJhbWUgbnVtYmVyIG9mIHRoZSBjdXJyZW50IHBpY3R1cmUKLSAgICAgICAgICAgIGlzUmVmUGljICAgIGZsYWcgdG8gaW5kaWNhdGUgaWYgY3VycmVudCBwaWN0dXJlIGlzIGEgcmVmZXJlbmNlIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICBub24tcmVmZXJlbmNlIHBpY3R1cmUKLSAgICAgICAgICAgIGdhcHNBbGxvd2VkIEZsYWcgd2hpY2ggaW5kaWNhdGVzIGFjdGl2ZSBTUFMgc3RhbmNlIG9uIHdoZXRoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvIGFsbG93IGdhcHMKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgZHBiICAgICAgICAgJ2J1ZmZlcicgcG9zc2libHkgbW9kaWZpZWQgYnkgaW5zZXJ0aW5nIG5vbi1leGlzdGluZwotICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZXMgd2l0aCBzbGlkaW5nIHdpbmRvdyBtYXJraW5nIHByb2Nlc3MKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgZXJyb3IgaW4gc2xpZGluZyB3aW5kb3cgcmVmZXJlbmNlIHBpY3R1cmUgbWFya2luZyBvcgotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW0gZXF1YWwgdG8gcHJldmlvdXMgcmVmZXJlbmNlIGZyYW1lIHVzZWQgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICBhIHJlZmVyZW5jZSBwaWN0dXJlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkQ2hlY2tHYXBzSW5GcmFtZU51bShkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIGZyYW1lTnVtLCB1MzIgaXNSZWZQaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGdhcHNBbGxvd2VkKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB1blVzZWRTaG9ydFRlcm1GcmFtZU51bTsKLSAgICB1OCAqdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZHBiKTsKLSAgICBBU1NFUlQoZHBiLT5mdWxsbmVzcyA8PSBkcGItPmRwYlNpemUpOwotICAgIEFTU0VSVChmcmFtZU51bSA8IGRwYi0+bWF4RnJhbWVOdW0pOwotCi0gICAgZHBiLT5udW1PdXQgPSAwOwotICAgIGRwYi0+b3V0SW5kZXggPSAwOwotCi0gICAgaWYoIWdhcHNBbGxvd2VkKQotICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotICAgIGlmICggKGZyYW1lTnVtICE9IGRwYi0+cHJldlJlZkZyYW1lTnVtKSAmJgotICAgICAgICAgKGZyYW1lTnVtICE9ICgoZHBiLT5wcmV2UmVmRnJhbWVOdW0gKyAxKSAlIGRwYi0+bWF4RnJhbWVOdW0pKSkKLSAgICB7Ci0KLSAgICAgICAgdW5Vc2VkU2hvcnRUZXJtRnJhbWVOdW0gPSAoZHBiLT5wcmV2UmVmRnJhbWVOdW0gKyAxKSAlIGRwYi0+bWF4RnJhbWVOdW07Ci0KLSAgICAgICAgLyogc3RvcmUgZGF0YSBwb2ludGVyIG9mIGxhc3QgYnVmZmVyIHBvc2l0aW9uIHRvIGJlIHVzZWQgYXMgbmV4dAotICAgICAgICAgKiAiYWxsb2NhdGVkIiBkYXRhIHBvaW50ZXIgaWYgbGFzdCBidWZmZXIgcG9zaXRpb24gYWZ0ZXIgdGhpcyBwcm9jZXNzCi0gICAgICAgICAqIGNvbnRhaW5zIGRhdGEgcG9pbnRlciBsb2NhdGVkIGluIG91dEJ1ZiAoYnVmZmVyIHBsYWNlZCBpbiB0aGUgb3V0cHV0Ci0gICAgICAgICAqIHNoYWxsIG5vdCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgY3VycmVudCBwaWN0dXJlKSAqLwotICAgICAgICB0bXAgPSBkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLmRhdGE7Ci0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNldFBpY051bXMoZHBiLCB1blVzZWRTaG9ydFRlcm1GcmFtZU51bSk7Ci0KLSAgICAgICAgICAgIGlmIChTbGlkaW5nV2luZG93UmVmUGljTWFya2luZyhkcGIpICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIG91dHB1dCBwaWN0dXJlcyBpZiBidWZmZXIgZnVsbCAqLwotICAgICAgICAgICAgd2hpbGUgKGRwYi0+ZnVsbG5lc3MgPj0gZHBiLT5kcGJTaXplKQotICAgICAgICAgICAgewotI2lmZGVmIF9BU1NFUlRfVVNFRAotICAgICAgICAgICAgICAgIEFTU0VSVCghZHBiLT5ub1Jlb3JkZXJpbmcpOwotICAgICAgICAgICAgICAgIEFTU0VSVChPdXRwdXRQaWN0dXJlKGRwYikgPT0gSEFOVFJPX09LKTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgT3V0cHV0UGljdHVyZShkcGIpOwotI2VuZGlmCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGFkZCB0byBlbmQgb2YgbGlzdCAqLwotICAgICAgICAgICAgQVNTRVJUKCAhZHBiLT5idWZmZXJbZHBiLT5kcGJTaXplXS50b0JlRGlzcGxheWVkICYmCi0gICAgICAgICAgICAgICAgICAgICFJU19SRUZFUkVOQ0UoZHBiLT5idWZmZXJbZHBiLT5kcGJTaXplXSkgKTsKLSAgICAgICAgICAgIGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0uc3RhdHVzID0gTk9OX0VYSVNUSU5HOwotICAgICAgICAgICAgZHBiLT5idWZmZXJbZHBiLT5kcGJTaXplXS5mcmFtZU51bSA9IHVuVXNlZFNob3J0VGVybUZyYW1lTnVtOwotICAgICAgICAgICAgZHBiLT5idWZmZXJbZHBiLT5kcGJTaXplXS5waWNOdW0gICA9IChpMzIpdW5Vc2VkU2hvcnRUZXJtRnJhbWVOdW07Ci0gICAgICAgICAgICBkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLnBpY09yZGVyQ250ID0gMDsKLSAgICAgICAgICAgIGRwYi0+YnVmZmVyW2RwYi0+ZHBiU2l6ZV0udG9CZURpc3BsYXllZCA9IEhBTlRST19GQUxTRTsKLSAgICAgICAgICAgIGRwYi0+ZnVsbG5lc3MrKzsKLSAgICAgICAgICAgIGRwYi0+bnVtUmVmRnJhbWVzKys7Ci0KLSAgICAgICAgICAgIC8qIHNvcnQgdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgU2hlbGxTb3J0KGRwYi0+YnVmZmVyLCBkcGItPmRwYlNpemUrMSk7Ci0KLSAgICAgICAgICAgIHVuVXNlZFNob3J0VGVybUZyYW1lTnVtID0gKHVuVXNlZFNob3J0VGVybUZyYW1lTnVtICsgMSkgJQotICAgICAgICAgICAgICAgIGRwYi0+bWF4RnJhbWVOdW07Ci0KLSAgICAgICAgfSB3aGlsZSAodW5Vc2VkU2hvcnRUZXJtRnJhbWVOdW0gIT0gZnJhbWVOdW0pOwotCi0gICAgICAgIC8qIHBpY3R1cmVzIHBsYWNlZCBpbiBvdXRwdXQgYnVmZmVyIC0+IGNoZWNrIHRoYXQgJ2RhdGEnIGluCi0gICAgICAgICAqIGJ1ZmZlciBwb3NpdGlvbiBkcGJTaXplIGlzIG5vdCBpbiB0aGUgb3V0cHV0IGJ1ZmZlciAodGhpcyB3aWxsIGJlCi0gICAgICAgICAqICJhbGxvY2F0ZWQiIGJ5IGgyNjRic2RBbGxvY2F0ZURwYkltYWdlKS4gSWYgaXQgaXMgLT4gZXhjaGFuZ2UgZGF0YQotICAgICAgICAgKiBwb2ludGVyIHdpdGggdGhlIG9uZSBzdG9yZWQgaW4gdGhlIGJlZ2lubmluZyAqLwotICAgICAgICBpZiAoZHBiLT5udW1PdXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMiBpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZHBiLT5udW1PdXQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZHBiLT5vdXRCdWZbaV0uZGF0YSA9PSBkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLmRhdGEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBmaW5kIGJ1ZmZlciBwb3NpdGlvbiBjb250YWluaW5nIGRhdGEgcG9pbnRlciBzdG9yZWQgaW4KLSAgICAgICAgICAgICAgICAgICAgICogdG1wICovCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkcGItPmRwYlNpemU7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRwYi0+YnVmZmVyW2ldLmRhdGEgPT0gdG1wKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwYi0+YnVmZmVyW2ldLmRhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcGItPmJ1ZmZlcltkcGItPmRwYlNpemVdLmRhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBiLT5idWZmZXJbZHBiLT5kcGJTaXplXS5kYXRhID0gdG1wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEFTU0VSVChpIDwgZHBiLT5kcGJTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIC8qIGZyYW1lTnVtIGZvciByZWZlcmVuY2UgcGljdHVyZXMgc2hhbGwgbm90IGJlIHRoZSBzYW1lIGFzIGZvciBwcmV2aW91cwotICAgICAqIHJlZmVyZW5jZSBwaWN0dXJlLCBvdGhlcndpc2UgYWNjZXNzZXMgdG8gcGljdHVyZXMgaW4gdGhlIGJ1ZmZlciBjYW5ub3QKLSAgICAgKiBiZSBzb2x2ZWQgdW5hbWJpZ3VvdXNseSAqLwotICAgIGVsc2UgaWYgKGlzUmVmUGljICYmIGZyYW1lTnVtID09IGRwYi0+cHJldlJlZkZyYW1lTnVtKQotICAgIHsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIC8qIHNhdmUgY3VycmVudCBmcmFtZV9udW0gaW4gcHJldlJlZkZyYW1lTnVtLiBGb3Igbm9uLXJlZmVyZW5jZSBmcmFtZQotICAgICAqIHByZXZGcmFtZU51bSBpcyBzZXQgdG8gZnJhbWUgbnVtYmVyIG9mIGxhc3Qgbm9uLWV4aXN0aW5nIGZyYW1lIGFib3ZlICovCi0gICAgaWYgKGlzUmVmUGljKQotICAgICAgICBkcGItPnByZXZSZWZGcmFtZU51bSA9IGZyYW1lTnVtOwotICAgIGVsc2UgaWYgKGZyYW1lTnVtICE9IGRwYi0+cHJldlJlZkZyYW1lTnVtKQotICAgIHsKLSAgICAgICAgZHBiLT5wcmV2UmVmRnJhbWVOdW0gPQotICAgICAgICAgICAgKGZyYW1lTnVtICsgZHBiLT5tYXhGcmFtZU51bSAtIDEpICUgZHBiLT5tYXhGcmFtZU51bTsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEZpbmRTbWFsbGVzdFBpY09yZGVyQ250Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGZpbmQgcGljdHVyZSB3aXRoIHNtYWxsZXN0IHBpY3R1cmUgb3JkZXIgY291bnQuIFRoaXMKLSAgICAgICAgICAgIHdpbGwgYmUgdGhlIG5leHQgcGljdHVyZSBpbiBkaXNwbGF5IG9yZGVyLgotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBwaWN0dXJlLCBOVUxMIGlmIG5vIHBpY3R1cmVzIHRvIGJlIGRpc3BsYXllZAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1kcGJQaWN0dXJlX3QqIEZpbmRTbWFsbGVzdFBpY09yZGVyQ250KGRwYlN0b3JhZ2VfdCAqZHBiKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotICAgIGkzMiBwaWNPcmRlckNudDsKLSAgICBkcGJQaWN0dXJlX3QgKnRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRwYik7Ci0KLSAgICBwaWNPcmRlckNudCA9IDB4N0ZGRkZGRkY7Ci0gICAgdG1wID0gTlVMTDsKLQotICAgIGZvciAoaSA9IDA7IGkgPD0gZHBiLT5kcGJTaXplOyBpKyspCi0gICAgewotICAgICAgICBpZiAoZHBiLT5idWZmZXJbaV0udG9CZURpc3BsYXllZCAmJgotICAgICAgICAgICAgKGRwYi0+YnVmZmVyW2ldLnBpY09yZGVyQ250IDwgcGljT3JkZXJDbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBkcGItPmJ1ZmZlciArIGk7Ci0gICAgICAgICAgICBwaWNPcmRlckNudCA9IGRwYi0+YnVmZmVyW2ldLnBpY09yZGVyQ250OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKHRtcCk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBPdXRwdXRQaWN0dXJlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIHB1dCBuZXh0IGRpc3BsYXkgb3JkZXIgcGljdHVyZSBpbnRvIHRoZSBvdXRwdXQgYnVmZmVyLgotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICBubyBwaWN0dXJlcyB0byBkaXNwbGF5Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBPdXRwdXRQaWN0dXJlKGRwYlN0b3JhZ2VfdCAqZHBiKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIGRwYlBpY3R1cmVfdCAqdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZHBiKTsKLQotICAgIGlmIChkcGItPm5vUmVvcmRlcmluZykKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgdG1wID0gRmluZFNtYWxsZXN0UGljT3JkZXJDbnQoZHBiKTsKLQotICAgIC8qIG5vIHBpY3R1cmVzIHRvIGJlIGRpc3BsYXllZCAqLwotICAgIGlmICh0bXAgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgZHBiLT5vdXRCdWZbZHBiLT5udW1PdXRdLmRhdGEgID0gdG1wLT5kYXRhOwotICAgIGRwYi0+b3V0QnVmW2RwYi0+bnVtT3V0XS5pc0lkciA9IHRtcC0+aXNJZHI7Ci0gICAgZHBiLT5vdXRCdWZbZHBiLT5udW1PdXRdLnBpY0lkID0gdG1wLT5waWNJZDsKLSAgICBkcGItPm91dEJ1ZltkcGItPm51bU91dF0ubnVtRXJyTWJzID0gdG1wLT5udW1FcnJNYnM7Ci0gICAgZHBiLT5udW1PdXQrKzsKLQotICAgIHRtcC0+dG9CZURpc3BsYXllZCA9IEhBTlRST19GQUxTRTsKLSAgICBpZiAoIUlTX1JFRkVSRU5DRSgqdG1wKSkKLSAgICB7Ci0gICAgICAgIGRwYi0+ZnVsbG5lc3MtLTsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2REcGJPdXRwdXRQaWN0dXJlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGdldCBuZXh0IGRpc3BsYXkgb3JkZXIgcGljdHVyZSBmcm9tIHRoZSBvdXRwdXQgYnVmZmVyLgotCi0gICAgICAgIFJldHVybjoKLSAgICAgICAgICAgIHBvaW50ZXIgdG8gb3V0cHV0IHBpY3R1cmUgc3RydWN0dXJlLCBOVUxMIGlmIG5vIHBpY3R1cmVzIHRvCi0gICAgICAgICAgICBkaXNwbGF5Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWRwYk91dFBpY3R1cmVfdCogaDI2NGJzZERwYk91dHB1dFBpY3R1cmUoZHBiU3RvcmFnZV90ICpkcGIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZHBiKTsKLQotICAgIGlmIChkcGItPm91dEluZGV4IDwgZHBiLT5udW1PdXQpCi0gICAgICAgIHJldHVybihkcGItPm91dEJ1ZiArIGRwYi0+b3V0SW5kZXgrKyk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4oTlVMTCk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkRmx1c2hEcGIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gZmx1c2ggdGhlIERQQi4gRnVuY3Rpb24gcHV0cyBhbGwgcGljdHVyZXMgbmVlZGVkIGZvcgotICAgICAgICAgICAgZGlzcGxheSBpbnRvIHRoZSBvdXRwdXQgYnVmZmVyLiBUaGlzIGZ1bmN0aW9uIHNoYWxsIGJlIGNhbGxlZCBpbgotICAgICAgICAgICAgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIHRvIG9idGFpbiBwaWN0dXJlcyBidWZmZXJlZCBmb3IgZGlzcGxheQotICAgICAgICAgICAgcmUtb3JkZXJpbmcgcHVycG9zZXMuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZEZsdXNoRHBiKGRwYlN0b3JhZ2VfdCAqZHBiKQotewotCi0gICAgLyogZG9uJ3QgZG8gYW55dGhpbmcgaWYgYnVmZmVyIG5vdCByZXNlcnZlZCAqLwotICAgIGlmIChkcGItPmJ1ZmZlcikKLSAgICB7Ci0gICAgICAgIGRwYi0+Zmx1c2hlZCA9IDE7Ci0gICAgICAgIC8qIG91dHB1dCBhbGwgcGljdHVyZXMgKi8KLSAgICAgICAgd2hpbGUgKE91dHB1dFBpY3R1cmUoZHBiKSA9PSBIQU5UUk9fT0spCi0gICAgICAgICAgICA7Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEZyZWVEcGIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gZnJlZSBtZW1vcmllcyByZXNlcnZlZCBmb3IgdGhlIERQQi4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkRnJlZURwYihkcGJTdG9yYWdlX3QgKmRwYikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRwYik7Ci0KLSAgICBpZiAoZHBiLT5idWZmZXIpCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZHBiLT5kcGJTaXplKzE7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgRlJFRShkcGItPmJ1ZmZlcltpXS5wQWxsb2NhdGVkRGF0YSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgRlJFRShkcGItPmJ1ZmZlcik7Ci0gICAgRlJFRShkcGItPmxpc3QpOwotICAgIEZSRUUoZHBiLT5vdXRCdWYpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogU2hlbGxTb3J0Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFNvcnQgcGljdHVyZXMgaW4gdGhlIGJ1ZmZlci4gRnVuY3Rpb24gaW1wbGVtZW50cyBTaGVsbCdzIG1ldGhvZCwKLSAgICAgICAgICAgIGkuZS4gZGltaW5pc2hpbmcgaW5jcmVtZW50IHNvcnQuIFNlZSBlLmcuICJOdW1lcmljYWwgUmVjaXBlcyBpbiBDIgotICAgICAgICAgICAgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB2b2lkIFNoZWxsU29ydChkcGJQaWN0dXJlX3QgKnBQaWMsIHUzMiBudW0pCi17Ci0KLSAgICB1MzIgaSwgajsKLSAgICB1MzIgc3RlcDsKLSAgICBkcGJQaWN0dXJlX3QgdG1wUGljOwotCi0gICAgc3RlcCA9IDc7Ci0KLSAgICB3aGlsZSAoc3RlcCkKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IHN0ZXA7IGkgPCBudW07IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdG1wUGljID0gcFBpY1tpXTsKLSAgICAgICAgICAgIGogPSBpOwotICAgICAgICAgICAgd2hpbGUgKGogPj0gc3RlcCAmJiBDb21wYXJlUGljdHVyZXMocFBpYyArIGogLSBzdGVwLCAmdG1wUGljKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFBpY1tqXSA9IHBQaWNbai1zdGVwXTsKLSAgICAgICAgICAgICAgICBqIC09IHN0ZXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwUGljW2pdID0gdG1wUGljOwotICAgICAgICB9Ci0gICAgICAgIHN0ZXAgPj49IDE7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kcGIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9kcGIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUyNTA4NC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfZHBiLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19EUEJfSAotI2RlZmluZSBIMjY0U1dERUNfRFBCX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfaGVhZGVyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9pbWFnZS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIGVudW1lcmF0aW9uIHRvIHJlcHJlc2VudCBzdGF0dXMgb2YgYnVmZmVyZWQgaW1hZ2UgKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgVU5VU0VEID0gMCwKLSAgICBOT05fRVhJU1RJTkcsCi0gICAgU0hPUlRfVEVSTSwKLSAgICBMT05HX1RFUk0KLX0gZHBiUGljdHVyZVN0YXR1c19lOwotCi0vKiBzdHJ1Y3R1cmUgdG8gcmVwcmVzZW50IGEgYnVmZmVyZWQgcGljdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHU4ICpkYXRhOyAgICAgICAgICAgLyogMTYtYnl0ZSBhbGlnbmVkIHBvaW50ZXIgb2YgcEFsbG9jYXRlZERhdGEgKi8KLSAgICB1OCAqcEFsbG9jYXRlZERhdGE7IC8qIGFsbG9jYXRlZCBwaWN0dXJlIHBvaW50ZXI7IChzaXplICsgMTUpIGJ5dGVzICovCi0gICAgaTMyIHBpY051bTsKLSAgICB1MzIgZnJhbWVOdW07Ci0gICAgaTMyIHBpY09yZGVyQ250OwotICAgIGRwYlBpY3R1cmVTdGF0dXNfZSBzdGF0dXM7Ci0gICAgdTMyIHRvQmVEaXNwbGF5ZWQ7Ci0gICAgdTMyIHBpY0lkOwotICAgIHUzMiBudW1FcnJNYnM7Ci0gICAgdTMyIGlzSWRyOwotfSBkcGJQaWN0dXJlX3Q7Ci0KLS8qIHN0cnVjdHVyZSB0byByZXByZXNlbnQgZGlzcGxheSBpbWFnZSBvdXRwdXQgZnJvbSB0aGUgYnVmZmVyICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdTggKmRhdGE7Ci0gICAgdTMyIHBpY0lkOwotICAgIHUzMiBudW1FcnJNYnM7Ci0gICAgdTMyIGlzSWRyOwotfSBkcGJPdXRQaWN0dXJlX3Q7Ci0KLS8qIHN0cnVjdHVyZSB0byByZXByZXNlbnQgRFBCICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgZHBiUGljdHVyZV90ICpidWZmZXI7Ci0gICAgZHBiUGljdHVyZV90ICoqbGlzdDsKLSAgICBkcGJQaWN0dXJlX3QgKmN1cnJlbnRPdXQ7Ci0gICAgZHBiT3V0UGljdHVyZV90ICpvdXRCdWY7Ci0gICAgdTMyIG51bU91dDsKLSAgICB1MzIgb3V0SW5kZXg7Ci0gICAgdTMyIG1heFJlZkZyYW1lczsKLSAgICB1MzIgZHBiU2l6ZTsKLSAgICB1MzIgbWF4RnJhbWVOdW07Ci0gICAgdTMyIG1heExvbmdUZXJtRnJhbWVJZHg7Ci0gICAgdTMyIG51bVJlZkZyYW1lczsKLSAgICB1MzIgZnVsbG5lc3M7Ci0gICAgdTMyIHByZXZSZWZGcmFtZU51bTsKLSAgICB1MzIgbGFzdENvbnRhaW5zTW1jbzU7Ci0gICAgdTMyIG5vUmVvcmRlcmluZzsKLSAgICB1MzIgZmx1c2hlZDsKLX0gZHBiU3RvcmFnZV90OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkSW5pdERwYigKLSAgZHBiU3RvcmFnZV90ICpkcGIsCi0gIHUzMiBwaWNTaXplSW5NYnMsCi0gIHUzMiBkcGJTaXplLAotICB1MzIgbnVtUmVmRnJhbWVzLAotICB1MzIgbWF4RnJhbWVOdW0sCi0gIHUzMiBub1Jlb3JkZXJpbmcpOwotCi11MzIgaDI2NGJzZFJlc2V0RHBiKAotICBkcGJTdG9yYWdlX3QgKmRwYiwKLSAgdTMyIHBpY1NpemVJbk1icywKLSAgdTMyIGRwYlNpemUsCi0gIHUzMiBudW1SZWZGcmFtZXMsCi0gIHUzMiBtYXhGcmFtZU51bSwKLSAgdTMyIG5vUmVvcmRlcmluZyk7Ci0KLXZvaWQgaDI2NGJzZEluaXRSZWZQaWNMaXN0KGRwYlN0b3JhZ2VfdCAqZHBiKTsKLQotdTgqIGgyNjRic2RBbGxvY2F0ZURwYkltYWdlKGRwYlN0b3JhZ2VfdCAqZHBiKTsKLQotdTgqIGgyNjRic2RHZXRSZWZQaWNEYXRhKGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgaW5kZXgpOwotCi11MzIgaDI2NGJzZFJlb3JkZXJSZWZQaWNMaXN0KAotICBkcGJTdG9yYWdlX3QgKmRwYiwKLSAgcmVmUGljTGlzdFJlb3JkZXJpbmdfdCAqb3JkZXIsCi0gIHUzMiBjdXJyRnJhbWVOdW0sCi0gIHUzMiBudW1SZWZJZHhBY3RpdmUpOwotCi11MzIgaDI2NGJzZE1hcmtEZWNSZWZQaWMoCi0gIGRwYlN0b3JhZ2VfdCAqZHBiLAotICBkZWNSZWZQaWNNYXJraW5nX3QgKm1hcmssCi0gIGltYWdlX3QgKmltYWdlLAotICB1MzIgZnJhbWVOdW0sCi0gIGkzMiBwaWNPcmRlckNudCwKLSAgdTMyIGlzSWRyLAotICB1MzIgcGljSWQsCi0gIHUzMiBudW1FcnJNYnMpOwotCi11MzIgaDI2NGJzZENoZWNrR2Fwc0luRnJhbWVOdW0oZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBmcmFtZU51bSwgdTMyIGlzUmVmUGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBnYXBzQWxsb3dlZCk7Ci0KLWRwYk91dFBpY3R1cmVfdCogaDI2NGJzZERwYk91dHB1dFBpY3R1cmUoZHBiU3RvcmFnZV90ICpkcGIpOwotCi12b2lkIGgyNjRic2RGbHVzaERwYihkcGJTdG9yYWdlX3QgKmRwYik7Ci0KLXZvaWQgaDI2NGJzZEZyZWVEcGIoZHBiU3RvcmFnZV90ICpkcGIpOwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19EUEJfSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW1hZ2UuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbWFnZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjkyODcwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbWFnZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrCi0gICAgICAgICAgaDI2NGJzZFdyaXRlT3V0cHV0QmxvY2tzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF9pbWFnZS5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotI2luY2x1ZGUgImgyNjRic2RfbmVpZ2hib3VyLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIHgtIGFuZCB5LWNvb3JkaW5hdGVzIGZvciBlYWNoIGJsb2NrLCBkZWZpbmVkIGluIGgyNjRic2RfaW50cmFfcHJlZGljdGlvbi5jICovCi1leHRlcm4gY29uc3QgdTMyIGgyNjRic2RCbG9ja1hbXTsKLWV4dGVybiBjb25zdCB1MzIgaDI2NGJzZEJsb2NrWVtdOwotCi0vKiBjbGlwcGluZyB0YWJsZSwgZGVmaW5lZCBpbiBoMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uYyAqLwotZXh0ZXJuIGNvbnN0IHU4IGgyNjRic2RDbGlwW107Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZFdyaXRlTWFjcm9ibG9jawotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBXcml0ZSBvbmUgbWFjcm9ibG9jayBpbnRvIHRoZSBpbWFnZS4gQm90aCBsdW1hIGFuZCBjaHJvbWEKLSAgICAgICAgICAgIGNvbXBvbmVudHMgd2lsbCBiZSB3cml0dGVuIGF0IHRoZSBzYW1lIHRpbWUuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgZGF0YSAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgZGF0YSB0byBiZSB3cml0dGVuLCAyNTYgdmFsdWVzIGZvcgotICAgICAgICAgICAgICAgICAgICBsdW1hIGZvbGxvd2VkIGJ5IDY0IHZhbHVlcyBmb3IgYm90aCBjaHJvbWEgY29tcG9uZW50cwotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBpbWFnZSAgIHBvaW50ZXIgdG8gdGhlIGltYWdlIHdoZXJlIHRoZSBtYWNyb2Jsb2NrIHdpbGwgYmUgd3JpdHRlbgotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZuZGVmIEgyNjRERUNfTkVPTgotdm9pZCBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrKGltYWdlX3QgKmltYWdlLCB1OCAqZGF0YSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLSAgICB1MzIgd2lkdGg7Ci0gICAgdTMyICpsdW0sICpjYiwgKmNyOwotICAgIHUzMiAqcHRyOwotICAgIHUzMiB0bXAxLCB0bXAyOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoaW1hZ2UpOwotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoISgodTMyKWRhdGEmMHgzKSk7Ci0KLSAgICB3aWR0aCA9IGltYWdlLT53aWR0aDsKLQotICAgIC8qbGludCAtc2F2ZSAtZTgyNiBsdW0sIGNiIGFuZCBjciB1c2VkIHRvIGNvcHkgNCBieXRlcyBhdCB0aGUgdGltZSwgZGlzYWJsZQotICAgICAqICJhcmVhIHRvbyBzbWFsbCIgaW5mbyBtZXNzYWdlICovCi0gICAgbHVtID0gKHUzMiopaW1hZ2UtPmx1bWE7Ci0gICAgY2IgPSAodTMyKilpbWFnZS0+Y2I7Ci0gICAgY3IgPSAodTMyKilpbWFnZS0+Y3I7Ci0gICAgQVNTRVJUKCEoKHUzMilsdW0mMHgzKSk7Ci0gICAgQVNTRVJUKCEoKHUzMiljYiYweDMpKTsKLSAgICBBU1NFUlQoISgodTMyKWNyJjB4MykpOwotCi0gICAgcHRyID0gKHUzMiopZGF0YTsKLQotICAgIHdpZHRoICo9IDQ7Ci0gICAgZm9yIChpID0gMTY7IGkgOyBpLS0pCi0gICAgewotICAgICAgICB0bXAxID0gKnB0cisrOwotICAgICAgICB0bXAyID0gKnB0cisrOwotICAgICAgICAqbHVtKysgPSB0bXAxOwotICAgICAgICAqbHVtKysgPSB0bXAyOwotICAgICAgICB0bXAxID0gKnB0cisrOwotICAgICAgICB0bXAyID0gKnB0cisrOwotICAgICAgICAqbHVtKysgPSB0bXAxOwotICAgICAgICAqbHVtKysgPSB0bXAyOwotICAgICAgICBsdW0gKz0gd2lkdGgtNDsKLSAgICB9Ci0KLSAgICB3aWR0aCA+Pj0gMTsKLSAgICBmb3IgKGkgPSA4OyBpIDsgaS0tKQotICAgIHsKLSAgICAgICAgdG1wMSA9ICpwdHIrKzsKLSAgICAgICAgdG1wMiA9ICpwdHIrKzsKLSAgICAgICAgKmNiKysgPSB0bXAxOwotICAgICAgICAqY2IrKyA9IHRtcDI7Ci0gICAgICAgIGNiICs9IHdpZHRoLTI7Ci0gICAgfQotCi0gICAgZm9yIChpID0gODsgaSA7IGktLSkKLSAgICB7Ci0gICAgICAgIHRtcDEgPSAqcHRyKys7Ci0gICAgICAgIHRtcDIgPSAqcHRyKys7Ci0gICAgICAgICpjcisrID0gdG1wMTsKLSAgICAgICAgKmNyKysgPSB0bXAyOwotICAgICAgICBjciArPSB3aWR0aC0yOwotICAgIH0KLQotfQotI2VuZGlmCi0jaWZuZGVmIEgyNjRERUNfT01YREwKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZFdyaXRlT3V0cHV0QmxvY2tzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFdyaXRlIG9uZSBtYWNyb2Jsb2NrIGludG8gdGhlIGltYWdlLiBQcmVkaWN0aW9uIGZvciB0aGUgbWFjcm9ibG9jawotICAgICAgICAgICAgYW5kIHRoZSByZXNpZHVhbCBhcmUgZ2l2ZW4gc2VwYXJhdGVseSBhbmQgd2lsbCBiZSBjb21iaW5lZCB3aGlsZQotICAgICAgICAgICAgd3JpdGluZyB0aGUgZGF0YSB0byB0aGUgaW1hZ2UKLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBkYXRhICAgICAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgcHJlZGljdGlvbiBkYXRhLCAyNTYgdmFsdWVzIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgbHVtYSBmb2xsb3dlZCBieSA2NCB2YWx1ZXMgZm9yIGJvdGggY2hyb21hIGNvbXBvbmVudHMKLSAgICAgICAgICAgIG1iTnVtICAgICAgIG51bWJlciBvZiB0aGUgbWFjcm9ibG9jawotICAgICAgICAgICAgcmVzaWR1YWwgICAgcG9pbnRlciB0byByZXNpZHVhbCBkYXRhLCAxNiAxNi1lbGVtZW50IGFycmF5cyBmb3IgbHVtYQotICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93ZWQgYnkgNCAxNi1lbGVtZW50IGFycmF5cyBmb3IgYm90aCBjaHJvbWEKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgaW1hZ2UgICAgICAgcG9pbnRlciB0byB0aGUgaW1hZ2Ugd2hlcmUgdGhlIGRhdGEgd2lsbCBiZSB3cml0dGVuCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkV3JpdGVPdXRwdXRCbG9ja3MoaW1hZ2VfdCAqaW1hZ2UsIHUzMiBtYk51bSwgdTggKmRhdGEsCi0gICAgICAgIGkzMiByZXNpZHVhbFtdWzE2XSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLSAgICB1MzIgcGljV2lkdGgsIHBpY1NpemU7Ci0gICAgdTggKmx1bSwgKmNiLCAqY3I7Ci0gICAgdTggKmltYWdlQmxvY2s7Ci0gICAgdTggKnRtcDsKLSAgICB1MzIgcm93LCBjb2w7Ci0gICAgdTMyIGJsb2NrOwotICAgIHUzMiB4LCB5OwotICAgIGkzMiAqcFJlczsKLSAgICBpMzIgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKLSAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChpbWFnZSk7Ci0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChtYk51bSA8IGltYWdlLT53aWR0aCAqIGltYWdlLT5oZWlnaHQpOwotICAgIEFTU0VSVCghKCh1MzIpZGF0YSYweDMpKTsKLQotICAgIC8qIEltYWdlIHNpemUgaW4gbWFjcm9ibG9ja3MgKi8KLSAgICBwaWNXaWR0aCA9IGltYWdlLT53aWR0aDsKLSAgICBwaWNTaXplID0gcGljV2lkdGggKiBpbWFnZS0+aGVpZ2h0OwotICAgIHJvdyA9IG1iTnVtIC8gcGljV2lkdGg7Ci0gICAgY29sID0gbWJOdW0gJSBwaWNXaWR0aDsKLQotICAgIC8qIE91dHB1dCBtYWNyb2Jsb2NrIHBvc2l0aW9uIGluIG91dHB1dCBwaWN0dXJlICovCi0gICAgbHVtID0gKGltYWdlLT5kYXRhICsgcm93ICogcGljV2lkdGggKiAyNTYgKyBjb2wgKiAxNik7Ci0gICAgY2IgPSAoaW1hZ2UtPmRhdGEgKyBwaWNTaXplICogMjU2ICsgcm93ICogcGljV2lkdGggKiA2NCArIGNvbCAqIDgpOwotICAgIGNyID0gKGNiICsgcGljU2l6ZSAqIDY0KTsKLQotICAgIHBpY1dpZHRoICo9IDE2OwotCi0gICAgZm9yIChibG9jayA9IDA7IGJsb2NrIDwgMTY7IGJsb2NrKyspCi0gICAgewotICAgICAgICB4ID0gaDI2NGJzZEJsb2NrWFtibG9ja107Ci0gICAgICAgIHkgPSBoMjY0YnNkQmxvY2tZW2Jsb2NrXTsKLQotICAgICAgICBwUmVzID0gcmVzaWR1YWxbYmxvY2tdOwotCi0gICAgICAgIEFTU0VSVChwUmVzKTsKLQotICAgICAgICB0bXAgPSBkYXRhICsgeSoxNiArIHg7Ci0gICAgICAgIGltYWdlQmxvY2sgPSBsdW0gKyB5KnBpY1dpZHRoICsgeDsKLQotICAgICAgICBBU1NFUlQoISgodTMyKXRtcCYweDMpKTsKLSAgICAgICAgQVNTRVJUKCEoKHUzMilpbWFnZUJsb2NrJjB4MykpOwotCi0gICAgICAgIGlmIChJU19SRVNJRFVBTF9FTVBUWShwUmVzKSkKLSAgICAgICAgewotICAgICAgICAgICAgLypsaW50IC1lODI2ICovCi0gICAgICAgICAgICBpMzIgKmluMzIgPSAoaTMyKil0bXA7Ci0gICAgICAgICAgICBpMzIgKm91dDMyID0gKGkzMiopaW1hZ2VCbG9jazsKLQotICAgICAgICAgICAgLyogUmVzaWR1YWwgaXMgemVybyA9PiBjb3B5IHByZWRpY3Rpb24gYmxvY2sgdG8gb3V0cHV0ICovCi0gICAgICAgICAgICB0bXAxID0gKmluMzI7ICBpbjMyICs9IDQ7Ci0gICAgICAgICAgICB0bXAyID0gKmluMzI7ICBpbjMyICs9IDQ7Ci0gICAgICAgICAgICAqb3V0MzIgPSB0bXAxOyBvdXQzMiArPSBwaWNXaWR0aC80OwotICAgICAgICAgICAgKm91dDMyID0gdG1wMjsgb3V0MzIgKz0gcGljV2lkdGgvNDsKLSAgICAgICAgICAgIHRtcDEgPSAqaW4zMjsgIGluMzIgKz0gNDsKLSAgICAgICAgICAgIHRtcDIgPSAqaW4zMjsKLSAgICAgICAgICAgICpvdXQzMiA9IHRtcDE7IG91dDMyICs9IHBpY1dpZHRoLzQ7Ci0gICAgICAgICAgICAqb3V0MzIgPSB0bXAyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotCi0gICAgICAgICAgICBSQU5HRV9DSEVDS19BUlJBWShwUmVzLCAtNTEyLCA1MTEsIDE2KTsKLQotICAgICAgICAgICAgLyogQ2FsY3VsYXRlIGltYWdlID0gcHJlZGljdGlvbiArIHJlc2lkdWFsCi0gICAgICAgICAgICAgKiBQcm9jZXNzIGZvdXIgcGl4ZWxzIGluIGEgbG9vcCAqLwotICAgICAgICAgICAgZm9yIChpID0gNDsgaTsgaS0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcDEgPSB0bXBbMF07Ci0gICAgICAgICAgICAgICAgdG1wMiA9ICpwUmVzKys7Ci0gICAgICAgICAgICAgICAgdG1wMyA9IHRtcFsxXTsKLSAgICAgICAgICAgICAgICB0bXAxID0gY2xwW3RtcDEgKyB0bXAyXTsKLSAgICAgICAgICAgICAgICB0bXA0ID0gKnBSZXMrKzsKLSAgICAgICAgICAgICAgICBpbWFnZUJsb2NrWzBdID0gKHU4KXRtcDE7Ci0gICAgICAgICAgICAgICAgdG1wMyA9IGNscFt0bXAzICsgdG1wNF07Ci0gICAgICAgICAgICAgICAgdG1wMSA9IHRtcFsyXTsKLSAgICAgICAgICAgICAgICB0bXAyID0gKnBSZXMrKzsKLSAgICAgICAgICAgICAgICBpbWFnZUJsb2NrWzFdID0gKHU4KXRtcDM7Ci0gICAgICAgICAgICAgICAgdG1wMSA9IGNscFt0bXAxICsgdG1wMl07Ci0gICAgICAgICAgICAgICAgdG1wMyA9IHRtcFszXTsKLSAgICAgICAgICAgICAgICB0bXA0ID0gKnBSZXMrKzsKLSAgICAgICAgICAgICAgICBpbWFnZUJsb2NrWzJdID0gKHU4KXRtcDE7Ci0gICAgICAgICAgICAgICAgdG1wMyA9IGNscFt0bXAzICsgdG1wNF07Ci0gICAgICAgICAgICAgICAgdG1wICs9IDE2OwotICAgICAgICAgICAgICAgIGltYWdlQmxvY2tbM10gPSAodTgpdG1wMzsKLSAgICAgICAgICAgICAgICBpbWFnZUJsb2NrICs9IHBpY1dpZHRoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwaWNXaWR0aCAvPSAyOwotCi0gICAgZm9yIChibG9jayA9IDE2OyBibG9jayA8PSAyMzsgYmxvY2srKykKLSAgICB7Ci0gICAgICAgIHggPSBoMjY0YnNkQmxvY2tYW2Jsb2NrICYgMHgzXTsKLSAgICAgICAgeSA9IGgyNjRic2RCbG9ja1lbYmxvY2sgJiAweDNdOwotCi0gICAgICAgIHBSZXMgPSByZXNpZHVhbFtibG9ja107Ci0KLSAgICAgICAgQVNTRVJUKHBSZXMpOwotCi0gICAgICAgIHRtcCA9IGRhdGEgKyAyNTY7Ci0gICAgICAgIGltYWdlQmxvY2sgPSBjYjsKLQotICAgICAgICBpZiAoYmxvY2sgPj0gMjApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGltYWdlQmxvY2sgPSBjcjsKLSAgICAgICAgICAgIHRtcCArPSA2NDsKLSAgICAgICAgfQotCi0gICAgICAgIHRtcCArPSB5KjggKyB4OwotICAgICAgICBpbWFnZUJsb2NrICs9IHkqcGljV2lkdGggKyB4OwotCi0gICAgICAgIEFTU0VSVCghKCh1MzIpdG1wJjB4MykpOwotICAgICAgICBBU1NFUlQoISgodTMyKWltYWdlQmxvY2smMHgzKSk7Ci0KLSAgICAgICAgaWYgKElTX1JFU0lEVUFMX0VNUFRZKHBSZXMpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKmxpbnQgLWU4MjYgKi8KLSAgICAgICAgICAgIGkzMiAqaW4zMiA9IChpMzIqKXRtcDsKLSAgICAgICAgICAgIGkzMiAqb3V0MzIgPSAoaTMyKilpbWFnZUJsb2NrOwotCi0gICAgICAgICAgICAvKiBSZXNpZHVhbCBpcyB6ZXJvID0+IGNvcHkgcHJlZGljdGlvbiBibG9jayB0byBvdXRwdXQgKi8KLSAgICAgICAgICAgIHRtcDEgPSAqaW4zMjsgIGluMzIgKz0gMjsKLSAgICAgICAgICAgIHRtcDIgPSAqaW4zMjsgIGluMzIgKz0gMjsKLSAgICAgICAgICAgICpvdXQzMiA9IHRtcDE7IG91dDMyICs9IHBpY1dpZHRoLzQ7Ci0gICAgICAgICAgICAqb3V0MzIgPSB0bXAyOyBvdXQzMiArPSBwaWNXaWR0aC80OwotICAgICAgICAgICAgdG1wMSA9ICppbjMyOyAgaW4zMiArPSAyOwotICAgICAgICAgICAgdG1wMiA9ICppbjMyOwotICAgICAgICAgICAgKm91dDMyID0gdG1wMTsgb3V0MzIgKz0gcGljV2lkdGgvNDsKLSAgICAgICAgICAgICpvdXQzMiA9IHRtcDI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIFJBTkdFX0NIRUNLX0FSUkFZKHBSZXMsIC01MTIsIDUxMSwgMTYpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSA0OyBpOyBpLS0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wMSA9IHRtcFswXTsKLSAgICAgICAgICAgICAgICB0bXAyID0gKnBSZXMrKzsKLSAgICAgICAgICAgICAgICB0bXAzID0gdG1wWzFdOwotICAgICAgICAgICAgICAgIHRtcDEgPSBjbHBbdG1wMSArIHRtcDJdOwotICAgICAgICAgICAgICAgIHRtcDQgPSAqcFJlcysrOwotICAgICAgICAgICAgICAgIGltYWdlQmxvY2tbMF0gPSAodTgpdG1wMTsKLSAgICAgICAgICAgICAgICB0bXAzID0gY2xwW3RtcDMgKyB0bXA0XTsKLSAgICAgICAgICAgICAgICB0bXAxID0gdG1wWzJdOwotICAgICAgICAgICAgICAgIHRtcDIgPSAqcFJlcysrOwotICAgICAgICAgICAgICAgIGltYWdlQmxvY2tbMV0gPSAodTgpdG1wMzsKLSAgICAgICAgICAgICAgICB0bXAxID0gY2xwW3RtcDEgKyB0bXAyXTsKLSAgICAgICAgICAgICAgICB0bXAzID0gdG1wWzNdOwotICAgICAgICAgICAgICAgIHRtcDQgPSAqcFJlcysrOwotICAgICAgICAgICAgICAgIGltYWdlQmxvY2tbMl0gPSAodTgpdG1wMTsKLSAgICAgICAgICAgICAgICB0bXAzID0gY2xwW3RtcDMgKyB0bXA0XTsKLSAgICAgICAgICAgICAgICB0bXAgKz0gODsKLSAgICAgICAgICAgICAgICBpbWFnZUJsb2NrWzNdID0gKHU4KXRtcDM7Ci0gICAgICAgICAgICAgICAgaW1hZ2VCbG9jayArPSBwaWNXaWR0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQotI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ltYWdlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW1hZ2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ3YzE4Yy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW1hZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfSU1BR0VfSAotI2RlZmluZSBIMjY0U1dERUNfSU1BR0VfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1OCAqZGF0YTsKLSAgICB1MzIgd2lkdGg7Ci0gICAgdTMyIGhlaWdodDsKLSAgICAvKiBjdXJyZW50IE1CJ3MgY29tcG9uZW50cyAqLwotICAgIHU4ICpsdW1hOwotICAgIHU4ICpjYjsKLSAgICB1OCAqY3I7Ci19IGltYWdlX3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrKGltYWdlX3QgKmltYWdlLCB1OCAqZGF0YSk7Ci0KLSNpZm5kZWYgSDI2NERFQ19PTVhETAotdm9pZCBoMjY0YnNkV3JpdGVPdXRwdXRCbG9ja3MoaW1hZ2VfdCAqaW1hZ2UsIHUzMiBtYk51bSwgdTggKmRhdGEsCi0gICAgaTMyIHJlc2lkdWFsW11bMTZdKTsKLSNlbmRpZgotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19JTUFHRV9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50ZXJfcHJlZGljdGlvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTgxYzRhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBoMjY0YnNkSW50ZXJQcmVkaWN0aW9uCi0gICAgICAgICAgTXZQcmVkaWN0aW9uMTZ4MTYKLSAgICAgICAgICBNdlByZWRpY3Rpb24xNng4Ci0gICAgICAgICAgTXZQcmVkaWN0aW9uOHgxNgotICAgICAgICAgIE12UHJlZGljdGlvbjh4OAotICAgICAgICAgIE12UHJlZGljdGlvbgotICAgICAgICAgIE1lZGlhbkZpbHRlcgotICAgICAgICAgIEdldEludGVyTmVpZ2hib3VyCi0gICAgICAgICAgR2V0UHJlZGljdGlvbk12Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF9pbnRlcl9wcmVkaWN0aW9uLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9uZWlnaGJvdXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3JlY29uc3RydWN0LmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgYXZhaWxhYmxlOwotICAgIHUzMiByZWZJbmRleDsKLSAgICBtdl90IG12OwotfSBpbnRlck5laWdoYm91cl90OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgTXZQcmVkaWN0aW9uMTZ4MTYobWJTdG9yYWdlX3QgKnBNYiwgbWJQcmVkX3QgKm1iUHJlZCwKLSAgICBkcGJTdG9yYWdlX3QgKmRwYik7Ci1zdGF0aWMgdTMyIE12UHJlZGljdGlvbjE2eDgobWJTdG9yYWdlX3QgKnBNYiwgbWJQcmVkX3QgKm1iUHJlZCwKLSAgICBkcGJTdG9yYWdlX3QgKmRwYik7Ci1zdGF0aWMgdTMyIE12UHJlZGljdGlvbjh4MTYobWJTdG9yYWdlX3QgKnBNYiwgbWJQcmVkX3QgKm1iUHJlZCwKLSAgICBkcGJTdG9yYWdlX3QgKmRwYik7Ci1zdGF0aWMgdTMyIE12UHJlZGljdGlvbjh4OChtYlN0b3JhZ2VfdCAqcE1iLCBzdWJNYlByZWRfdCAqc3ViTWJQcmVkLAotICAgIGRwYlN0b3JhZ2VfdCAqZHBiKTsKLXN0YXRpYyB1MzIgTXZQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHN1Yk1iUHJlZF90ICpzdWJNYlByZWQsCi0gICAgdTMyIG1iUGFydElkeCwgdTMyIHN1Yk1iUGFydElkeCk7Ci1zdGF0aWMgaTMyIE1lZGlhbkZpbHRlcihpMzIgYSwgaTMyIGIsIGkzMiBjKTsKLQotc3RhdGljIHZvaWQgR2V0SW50ZXJOZWlnaGJvdXIodTMyIHNsaWNlSWQsIG1iU3RvcmFnZV90ICpuTWIsCi0gICAgaW50ZXJOZWlnaGJvdXJfdCAqbiwgdTMyIGluZGV4KTsKLXN0YXRpYyB2b2lkIEdldFByZWRpY3Rpb25Ndihtdl90ICptdiwgaW50ZXJOZWlnaGJvdXJfdCAqYSwgdTMyIHJlZkluZGV4KTsKLQotc3RhdGljIGNvbnN0IG5laWdoYm91cl90IE5fQV9TVUJfUEFSVFs0XVs0XVs0XSA9IHsKLSAgICB7IHsge01CX0EsNX0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0EsNX0sIHtNQl9BLDd9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQSw1fSwge01CX0NVUlIsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9BLDV9LCB7TUJfQ1VSUiwwfSwge01CX0EsN30sIHtNQl9DVVJSLDJ9IH0gfSwKLQotICAgIHsgeyB7TUJfQ1VSUiwxfSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQ1VSUiwxfSwge01CX0NVUlIsM30sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9DVVJSLDF9LCB7TUJfQ1VSUiw0fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0NVUlIsMX0sIHtNQl9DVVJSLDR9LCB7TUJfQ1VSUiwzfSwge01CX0NVUlIsNn0gfSB9LAotCi0gICAgeyB7IHtNQl9BLDEzfSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQSwxM30sIHtNQl9BLDE1fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0EsMTN9LCB7TUJfQ1VSUiw4fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0EsMTN9LCB7TUJfQ1VSUiw4fSwge01CX0EsMTV9LCB7TUJfQ1VSUiwxMH0gfSB9LAotCi0gICAgeyB7IHtNQl9DVVJSLDl9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9DVVJSLDl9LCB7TUJfQ1VSUiwxMX0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9DVVJSLDl9LCB7TUJfQ1VSUiwxMn0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9DVVJSLDl9LCB7TUJfQ1VSUiwxMn0sIHtNQl9DVVJSLDExfSwge01CX0NVUlIsMTR9IH0gfSB9OwotCi1zdGF0aWMgY29uc3QgbmVpZ2hib3VyX3QgTl9CX1NVQl9QQVJUWzRdWzRdWzRdID0gewotICAgIHsgeyB7TUJfQiwxMH0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0IsMTB9LCB7TUJfQ1VSUiwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0IsMTB9LCB7TUJfQiwxMX0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9CLDEwfSwge01CX0IsMTF9LCB7TUJfQ1VSUiwwfSwge01CX0NVUlIsMX0gfSB9LAotCi0gICAgeyB7IHtNQl9CLDE0fSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQiwxNH0sIHtNQl9DVVJSLDR9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQiwxNH0sIHtNQl9CLDE1fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0IsMTR9LCB7TUJfQiwxNX0sIHtNQl9DVVJSLDR9LCB7TUJfQ1VSUiw1fSB9IH0sCi0KLSAgICB7IHsge01CX0NVUlIsMn0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0NVUlIsMn0sIHtNQl9DVVJSLDh9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQ1VSUiwyfSwge01CX0NVUlIsM30sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9DVVJSLDJ9LCB7TUJfQ1VSUiwzfSwge01CX0NVUlIsOH0sIHtNQl9DVVJSLDl9IH0gfSwKLQotICAgIHsgeyB7TUJfQ1VSUiw2fSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQ1VSUiw2fSwge01CX0NVUlIsMTJ9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQ1VSUiw2fSwge01CX0NVUlIsN30sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9DVVJSLDZ9LCB7TUJfQ1VSUiw3fSwge01CX0NVUlIsMTJ9LCB7TUJfQ1VSUiwxM30gfSB9IH07Ci0KLXN0YXRpYyBjb25zdCBuZWlnaGJvdXJfdCBOX0NfU1VCX1BBUlRbNF1bNF1bNF0gPSB7Ci0gICAgeyB7IHtNQl9CLDE0fSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQiwxNH0sIHtNQl9OQSw0fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0IsMTF9LCB7TUJfQiwxNH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9CLDExfSwge01CX0IsMTR9LCB7TUJfQ1VSUiwxfSwge01CX05BLDR9IH0gfSwKLQotICAgIHsgeyB7TUJfQywxMH0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0MsMTB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9CLDE1fSwge01CX0MsMTB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQiwxNX0sIHtNQl9DLDEwfSwge01CX0NVUlIsNX0sIHtNQl9OQSwwfSB9IH0sCi0KLSAgICB7IHsge01CX0NVUlIsNn0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0NVUlIsNn0sIHtNQl9OQSwxMn0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9DVVJSLDN9LCB7TUJfQ1VSUiw2fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0NVUlIsM30sIHtNQl9DVVJSLDZ9LCB7TUJfQ1VSUiw5fSwge01CX05BLDEyfSB9IH0sCi0KLSAgICB7IHsge01CX05BLDJ9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9OQSwyfSwge01CX05BLDh9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQ1VSUiw3fSwge01CX05BLDJ9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQ1VSUiw3fSwge01CX05BLDJ9LCB7TUJfQ1VSUiwxM30sIHtNQl9OQSw4fSB9IH0gfTsKLQotc3RhdGljIGNvbnN0IG5laWdoYm91cl90IE5fRF9TVUJfUEFSVFs0XVs0XVs0XSA9IHsKLSAgICB7IHsge01CX0QsMTV9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9ELDE1fSwge01CX0EsNX0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9ELDE1fSwge01CX0IsMTB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfRCwxNX0sIHtNQl9CLDEwfSwge01CX0EsNX0sIHtNQl9DVVJSLDB9IH0gfSwKLQotICAgIHsgeyB7TUJfQiwxMX0sIHtNQl9OQSwwfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0IsMTF9LCB7TUJfQ1VSUiwxfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0IsMTF9LCB7TUJfQiwxNH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9CLDExfSwge01CX0IsMTR9LCB7TUJfQ1VSUiwxfSwge01CX0NVUlIsNH0gfSB9LAotCi0gICAgeyB7IHtNQl9BLDd9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9BLDd9LCB7TUJfQSwxM30sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9BLDd9LCB7TUJfQ1VSUiwyfSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0EsN30sIHtNQl9DVVJSLDJ9LCB7TUJfQSwxM30sIHtNQl9DVVJSLDh9IH0gfSwKLQotICAgIHsgeyB7TUJfQ1VSUiwzfSwge01CX05BLDB9LCB7TUJfTkEsMH0sIHtNQl9OQSwwfSB9LAotICAgICAgeyB7TUJfQ1VSUiwzfSwge01CX0NVUlIsOX0sIHtNQl9OQSwwfSwge01CX05BLDB9IH0sCi0gICAgICB7IHtNQl9DVVJSLDN9LCB7TUJfQ1VSUiw2fSwge01CX05BLDB9LCB7TUJfTkEsMH0gfSwKLSAgICAgIHsge01CX0NVUlIsM30sIHtNQl9DVVJSLDZ9LCB7TUJfQ1VSUiw5fSwge01CX0NVUlIsMTJ9IH0gfSB9OwotCi0KLSNpZmRlZiBIMjY0REVDX09NWERMCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEludGVyUHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUHJvY2Vzc2VzIG9uZSBpbnRlciBtYWNyb2Jsb2NrLiBQZXJmb3JtcyBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24KLSAgICAgICAgICBhbmQgcmVjb25zdHJ1Y3RzIHByZWRpY3Rpb24gbWFjcm9ibG9jay4gV3JpdGVzIHRoZSBmaW5hbCBtYWNyb2Jsb2NrCi0gICAgICAgICAgKHByZWRpY3Rpb24gKyByZXNpZHVhbCkgaW50byB0aGUgb3V0cHV0IGltYWdlIChjdXJySW1hZ2UpCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIHBNYiAgICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIHNwZWNpZmljIGluZm9ybWF0aW9uCi0gICAgICAgICAgcE1iTGF5ZXIgICAgICBwb2ludGVyIHRvIGN1cnJlbnQgbWFjcm9ibG9jayBkYXRhIGZyb20gc3RyZWFtCi0gICAgICAgICAgZHBiICAgICAgICAgICBwb2ludGVyIHRvIGRlY29kZWQgcGljdHVyZSBidWZmZXIKLSAgICAgICAgICBtYk51bSAgICAgICAgIGN1cnJlbnQgbWFjcm9ibG9jayBudW1iZXIKLSAgICAgICAgICBjdXJySW1hZ2UgICAgIHBvaW50ZXIgdG8gb3V0cHV0IGltYWdlCi0gICAgICAgICAgZGF0YSAgICAgICAgICBwb2ludGVyIHdoZXJlIHByZWRpY3RlZCBtYWNyb2Jsb2NrIHdpbGwgYmUgc3RvcmVkCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICBwTWIgICAgICAgICAgIHN0cnVjdHVyZSBpcyB1cGRhdGVkIHdpdGggY3VycmVudCBtYWNyb2Jsb2NrCi0gICAgICAgICAgY3VyckltYWdlICAgICBjdXJyZW50IG1hY3JvYmxvY2sgaXMgd3JpdHRlbiBpbnRvIGltYWdlCi0gICAgICAgICAgZGF0YSAgICAgICAgICBwcmVkaWN0aW9uIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICBIQU5UUk9fT0sgICAgIHN1Y2Nlc3MKLSAgICAgICAgICBIQU5UUk9fTk9LICAgIGVycm9yIGluIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIGgyNjRic2RJbnRlclByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgbWFjcm9ibG9ja0xheWVyX3QgKnBNYkxheWVyLAotICAgIGRwYlN0b3JhZ2VfdCAqZHBiLCB1MzIgbWJOdW0sIGltYWdlX3QgKmN1cnJJbWFnZSwgdTggKmRhdGEpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0gICAgdTMyIHgsIHk7Ci0gICAgdTMyIGNvbEFuZFJvdzsKLSAgICBzdWJNYlBhcnRNb2RlX2Ugc3ViUGFydE1vZGU7Ci0gICAgaW1hZ2VfdCByZWZJbWFnZTsKLSAgICB1OCBmaWxsQnVmZlszMioyMSArIDE1ICsgMzJdOwotICAgIHU4ICpwRmlsbDsKLSAgICB1MzIgdG1wOwotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBNYik7Ci0gICAgQVNTRVJUKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKTsKLSAgICBBU1NFUlQocE1iTGF5ZXIpOwotCi0gICAgLyogMTYtYnl0ZSBhbGlnbm1lbnQgKi8KLSAgICBwRmlsbCA9IEFMSUdOKGZpbGxCdWZmLCAxNik7Ci0KLSAgICAvKiBzZXQgcm93IGJpdHMgMTU6MCAqLwotICAgIGNvbEFuZFJvdyA9IG1iTnVtIC8gY3VyckltYWdlLT53aWR0aDsKLSAgICAvKnNldCBjb2wgdG8gYml0cyAzMToxNiAqLwotICAgIGNvbEFuZFJvdyArPSAobWJOdW0gLSBjb2xBbmRSb3cgKiBjdXJySW1hZ2UtPndpZHRoKSA8PCAxNjsKLSAgICBjb2xBbmRSb3cgPDw9IDQ7Ci0KLSAgICByZWZJbWFnZS53aWR0aCA9IGN1cnJJbWFnZS0+d2lkdGg7Ci0gICAgcmVmSW1hZ2UuaGVpZ2h0ID0gY3VyckltYWdlLT5oZWlnaHQ7Ci0KLSAgICBzd2l0Y2ggKHBNYi0+bWJUeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBQX1NraXA6Ci0gICAgICAgIGNhc2UgUF9MMF8xNngxNjoKLSAgICAgICAgICAgIGlmIChNdlByZWRpY3Rpb24xNngxNihwTWIsICZwTWJMYXllci0+bWJQcmVkLCBkcGIpICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyWzBdOwotICAgICAgICAgICAgdG1wID0gKDA8PDI0KSArICgwPDwxNikgKyAoMTY8PDgpICsgMTY7Ci0gICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdiwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUF9MMF9MMF8xNng4OgotICAgICAgICAgICAgaWYgKCBNdlByZWRpY3Rpb24xNng4KHBNYiwgJnBNYkxheWVyLT5tYlByZWQsIGRwYikgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbMF07Ci0gICAgICAgICAgICB0bXAgPSAoMDw8MjQpICsgKDA8PDE2KSArICgxNjw8OCkgKyA4OwotICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYsICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7Ci0KLSAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbMl07Ci0gICAgICAgICAgICB0bXAgPSAoMDw8MjQpICsgKDg8PDE2KSArICgxNjw8OCkgKyA4OwotICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrOCwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUF9MMF9MMF84eDE2OgotICAgICAgICAgICAgaWYgKCBNdlByZWRpY3Rpb244eDE2KHBNYiwgJnBNYkxheWVyLT5tYlByZWQsIGRwYikgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbMF07Ci0gICAgICAgICAgICB0bXAgPSAoMDw8MjQpICsgKDA8PDE2KSArICg4PDw4KSArIDE2OwotICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYsICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7Ci0gICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyWzFdOwotICAgICAgICAgICAgdG1wID0gKDg8PDI0KSArICgwPDwxNikgKyAoODw8OCkgKyAxNjsKLSAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQsICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OiAvKiBQXzh4OCBhbmQgUF84eDhyZWYwICovCi0gICAgICAgICAgICBpZiAoIE12UHJlZGljdGlvbjh4OChwTWIsICZwTWJMYXllci0+c3ViTWJQcmVkLCBkcGIpICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbaV07Ci0gICAgICAgICAgICAgICAgc3ViUGFydE1vZGUgPQotICAgICAgICAgICAgICAgICAgICBoMjY0YnNkU3ViTWJQYXJ0TW9kZShwTWJMYXllci0+c3ViTWJQcmVkLnN1Yk1iVHlwZVtpXSk7Ci0gICAgICAgICAgICAgICAgeCA9IGkgJiAweDEgPyA4IDogMDsKLSAgICAgICAgICAgICAgICB5ID0gaSA8IDIgPyAwIDogODsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1YlBhcnRNb2RlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNQl9TUF84eDg6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAoeDw8MjQpICsgKHk8PDE2KSArICg4PDw4KSArIDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmksICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNQl9TUF84eDQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAoeDw8MjQpICsgKHk8PDE2KSArICg4PDw4KSArIDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmksICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHg8PDI0KSArICgoeSs0KTw8MTYpICsgKDg8PDgpICsgNDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSsyLCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTUJfU1BfNHg4OgotICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHg8PDI0KSArICh5PDwxNikgKyAoNDw8OCkgKyA4OwotICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppLCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICgoeCs0KTw8MjQpICsgKHk8PDE2KSArICg0PDw4KSArIDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmkrMSwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHg8PDI0KSArICh5PDwxNikgKyAoNDw8OCkgKyA0OwotICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppLCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sQW5kUm93LCB0bXAsIHBGaWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICgoeCs0KTw8MjQpICsgKHk8PDE2KSArICg0PDw4KSArIDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmkrMSwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAoeDw8MjQpICsgKCh5KzQpPDwxNikgKyAoNDw8OCkgKyA0OwotICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppKzIsICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xBbmRSb3csIHRtcCwgcEZpbGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKCh4KzQpPDwyNCkgKyAoKHkrNCk8PDE2KSArICg0PDw4KSArIDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmkrMywgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEFuZFJvdywgdG1wLCBwRmlsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBpZiBkZWNvZGVkIGZsYWcgPiAxIC0+IG1iIGhhcyBhbHJlYWR5IGJlZW4gc3VjY2Vzc2Z1bGx5IGRlY29kZWQgYW5kCi0gICAgICogd3JpdHRlbiB0byBvdXRwdXQgLT4gZG8gbm90IHdyaXRlIGFnYWluICovCi0gICAgaWYgKHBNYi0+ZGVjb2RlZCA+IDEpCi0gICAgICAgIHJldHVybiBIQU5UUk9fT0s7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLX0KLQotI2Vsc2UgLyogSDI2NERFQ19PTVhETCAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbnRlclByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFByb2Nlc3NlcyBvbmUgaW50ZXIgbWFjcm9ibG9jay4gUGVyZm9ybXMgbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uCi0gICAgICAgICAgYW5kIHJlY29uc3RydWN0cyBwcmVkaWN0aW9uIG1hY3JvYmxvY2suIFdyaXRlcyB0aGUgZmluYWwgbWFjcm9ibG9jawotICAgICAgICAgIChwcmVkaWN0aW9uICsgcmVzaWR1YWwpIGludG8gdGhlIG91dHB1dCBpbWFnZSAoY3VyckltYWdlKQotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICBwTWIgICAgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBzcGVjaWZpYyBpbmZvcm1hdGlvbgotICAgICAgICAgIHBNYkxheWVyICAgICAgcG9pbnRlciB0byBjdXJyZW50IG1hY3JvYmxvY2sgZGF0YSBmcm9tIHN0cmVhbQotICAgICAgICAgIGRwYiAgICAgICAgICAgcG9pbnRlciB0byBkZWNvZGVkIHBpY3R1cmUgYnVmZmVyCi0gICAgICAgICAgbWJOdW0gICAgICAgICBjdXJyZW50IG1hY3JvYmxvY2sgbnVtYmVyCi0gICAgICAgICAgY3VyckltYWdlICAgICBwb2ludGVyIHRvIG91dHB1dCBpbWFnZQotICAgICAgICAgIGRhdGEgICAgICAgICAgcG9pbnRlciB3aGVyZSBwcmVkaWN0ZWQgbWFjcm9ibG9jayB3aWxsIGJlIHN0b3JlZAotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgcE1iICAgICAgICAgICBzdHJ1Y3R1cmUgaXMgdXBkYXRlZCB3aXRoIGN1cnJlbnQgbWFjcm9ibG9jawotICAgICAgICAgIGN1cnJJbWFnZSAgICAgY3VycmVudCBtYWNyb2Jsb2NrIGlzIHdyaXR0ZW4gaW50byBpbWFnZQotICAgICAgICAgIGRhdGEgICAgICAgICAgcHJlZGljdGlvbiBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgSEFOVFJPX09LICAgICBzdWNjZXNzCi0gICAgICAgICAgSEFOVFJPX05PSyAgICBlcnJvciBpbiBtb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXUzMiBoMjY0YnNkSW50ZXJQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIG1hY3JvYmxvY2tMYXllcl90ICpwTWJMYXllciwKLSAgICBkcGJTdG9yYWdlX3QgKmRwYiwgdTMyIG1iTnVtLCBpbWFnZV90ICpjdXJySW1hZ2UsIHU4ICpkYXRhKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotICAgIHUzMiB4LCB5OwotICAgIHUzMiByb3csIGNvbDsKLSAgICBzdWJNYlBhcnRNb2RlX2Ugc3ViUGFydE1vZGU7Ci0gICAgaW1hZ2VfdCByZWZJbWFnZTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBNYik7Ci0gICAgQVNTRVJUKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKTsKLSAgICBBU1NFUlQocE1iTGF5ZXIpOwotCi0gICAgcm93ID0gbWJOdW0gLyBjdXJySW1hZ2UtPndpZHRoOwotICAgIGNvbCA9IG1iTnVtIC0gcm93ICogY3VyckltYWdlLT53aWR0aDsKLSAgICByb3cgKj0gMTY7Ci0gICAgY29sICo9IDE2OwotCi0gICAgcmVmSW1hZ2Uud2lkdGggPSBjdXJySW1hZ2UtPndpZHRoOwotICAgIHJlZkltYWdlLmhlaWdodCA9IGN1cnJJbWFnZS0+aGVpZ2h0OwotCi0gICAgc3dpdGNoIChwTWItPm1iVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgUF9Ta2lwOgotICAgICAgICBjYXNlIFBfTDBfMTZ4MTY6Ci0gICAgICAgICAgICBpZiAoTXZQcmVkaWN0aW9uMTZ4MTYocE1iLCAmcE1iTGF5ZXItPm1iUHJlZCwgZHBiKSAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHBNYi0+cmVmQWRkclswXTsKLSAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12LCAmcmVmSW1hZ2UsIGNvbCwgcm93LCAwLCAwLAotICAgICAgICAgICAgICAgIDE2LCAxNik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFBfTDBfTDBfMTZ4ODoKLSAgICAgICAgICAgIGlmICggTXZQcmVkaWN0aW9uMTZ4OChwTWIsICZwTWJMYXllci0+bWJQcmVkLCBkcGIpICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICByZWZJbWFnZS5kYXRhID0gcE1iLT5yZWZBZGRyWzBdOwotICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYsICZyZWZJbWFnZSwgY29sLCByb3csIDAsIDAsCi0gICAgICAgICAgICAgICAgMTYsIDgpOwotICAgICAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHBNYi0+cmVmQWRkclsyXTsKLSAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzgsICZyZWZJbWFnZSwgY29sLCByb3csIDAsIDgsCi0gICAgICAgICAgICAgICAgMTYsIDgpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBQX0wwX0wwXzh4MTY6Ci0gICAgICAgICAgICBpZiAoIE12UHJlZGljdGlvbjh4MTYocE1iLCAmcE1iTGF5ZXItPm1iUHJlZCwgZHBiKSAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHBNYi0+cmVmQWRkclswXTsKLSAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12LCAmcmVmSW1hZ2UsIGNvbCwgcm93LCAwLCAwLAotICAgICAgICAgICAgICAgIDgsIDE2KTsKLSAgICAgICAgICAgIHJlZkltYWdlLmRhdGEgPSBwTWItPnJlZkFkZHJbMV07Ci0gICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0LCAmcmVmSW1hZ2UsIGNvbCwgcm93LCA4LCAwLAotICAgICAgICAgICAgICAgIDgsIDE2KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6IC8qIFBfOHg4IGFuZCBQXzh4OHJlZjAgKi8KLSAgICAgICAgICAgIGlmICggTXZQcmVkaWN0aW9uOHg4KHBNYiwgJnBNYkxheWVyLT5zdWJNYlByZWQsIGRwYikgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVmSW1hZ2UuZGF0YSA9IHBNYi0+cmVmQWRkcltpXTsKLSAgICAgICAgICAgICAgICBzdWJQYXJ0TW9kZSA9Ci0gICAgICAgICAgICAgICAgICAgIGgyNjRic2RTdWJNYlBhcnRNb2RlKHBNYkxheWVyLT5zdWJNYlByZWQuc3ViTWJUeXBlW2ldKTsKLSAgICAgICAgICAgICAgICB4ID0gaSAmIDB4MSA/IDggOiAwOwotICAgICAgICAgICAgICAgIHkgPSBpIDwgMiA/IDAgOiA4OwotICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViUGFydE1vZGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE1CX1NQXzh4ODoKLSAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCwgcm93LCB4LCB5LCA4LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTUJfU1BfOHg0OgotICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppLCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLCByb3csIHgsIHksIDgsIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppKzIsICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wsIHJvdywgeCwgeSs0LCA4LCA0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTUJfU1BfNHg4OgotICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppLCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLCByb3csIHgsIHksIDQsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppKzEsICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wsIHJvdywgeCs0LCB5LCA0LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmksICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wsIHJvdywgeCwgeSwgNCwgNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoMjY0YnNkUHJlZGljdFNhbXBsZXMoZGF0YSwgcE1iLT5tdis0KmkrMSwgJnJlZkltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCwgcm93LCB4KzQsIHksIDQsIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaDI2NGJzZFByZWRpY3RTYW1wbGVzKGRhdGEsIHBNYi0+bXYrNCppKzIsICZyZWZJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wsIHJvdywgeCwgeSs0LCA0LCA0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkaWN0U2FtcGxlcyhkYXRhLCBwTWItPm12KzQqaSszLCAmcmVmSW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLCByb3csIHgrNCwgeSs0LCA0LCA0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qIGlmIGRlY29kZWQgZmxhZyA+IDEgLT4gbWIgaGFzIGFscmVhZHkgYmVlbiBzdWNjZXNzZnVsbHkgZGVjb2RlZCBhbmQKLSAgICAgKiB3cml0dGVuIHRvIG91dHB1dCAtPiBkbyBub3Qgd3JpdGUgYWdhaW4gKi8KLSAgICBpZiAocE1iLT5kZWNvZGVkID4gMSkKLSAgICAgICAgcmV0dXJuIEhBTlRST19PSzsKLQotICAgIGlmIChwTWItPm1iVHlwZSAhPSBQX1NraXApCi0gICAgewotICAgICAgICBoMjY0YnNkV3JpdGVPdXRwdXRCbG9ja3MoY3VyckltYWdlLCBtYk51bSwgZGF0YSwKLSAgICAgICAgICAgIHBNYkxheWVyLT5yZXNpZHVhbC5sZXZlbCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGgyNjRic2RXcml0ZU1hY3JvYmxvY2soY3VyckltYWdlLCBkYXRhKTsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLX0KLSNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogTXZQcmVkaWN0aW9uMTZ4MTYKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgTW90aW9uIHZlY3RvciBwcmVkaWN0aW9uIGZvciAxNngxNiBwYXJ0aXRpb24gbW9kZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgTXZQcmVkaWN0aW9uMTZ4MTYobWJTdG9yYWdlX3QgKnBNYiwgbWJQcmVkX3QgKm1iUHJlZCwgZHBiU3RvcmFnZV90ICpkcGIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgbXZfdCBtdjsKLSAgICBtdl90IG12UHJlZDsKLSAgICBpbnRlck5laWdoYm91cl90IGFbM107IC8qIEEsIEIsIEMgKi8KLSAgICB1MzIgcmVmSW5kZXg7Ci0gICAgdTggKnRtcDsKLSAgICB1MzIgKnRtcE12MSwgKnRtcE12MjsKLQotLyogQ29kZSAqLwotCi0gICAgcmVmSW5kZXggPSBtYlByZWQtPnJlZklkeEwwWzBdOwotCi0gICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQSwgYSwgNSk7Ci0gICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQiwgYSsxLCAxMCk7Ci0gICAgLypsaW50IC0tZSg3NDApICBVbnVzdWFsIHBvaW50ZXIgY2FzdCAoaW5jb21wYXRpYmxlIGluZGlyZWN0IHR5cGVzKSAqLwotICAgIHRtcE12MSA9ICh1MzIqKSgmYVswXS5tdik7IC8qIHdlIHRlc3QganVzdCB0aGF0IGJvdGggTVZzIGFyZSB6ZXJvICovCi0gICAgLypsaW50IC0tZSg3NDApICovCi0gICAgdG1wTXYyID0gKHUzMiopKCZhWzFdLm12KTsgLyogaS5lLiBhWzBdLm12LmhvciA9PSAwICYmIGFbMF0ubXYudmVyID09IDAgKi8KLSAgICBpZiAocE1iLT5tYlR5cGUgPT0gUF9Ta2lwICYmCi0gICAgICAgICghYVswXS5hdmFpbGFibGUgfHwgIWFbMV0uYXZhaWxhYmxlIHx8Ci0gICAgICAgICAoIGFbMF0ucmVmSW5kZXggPT0gMCAmJiAoKHUzMikoKnRtcE12MSkgPT0gMCkgKSB8fAotICAgICAgICAgKCBhWzFdLnJlZkluZGV4ID09IDAgJiYgKCh1MzIpKCp0bXBNdjIpID09IDApICkpKQotICAgIHsKLSAgICAgICAgICAgIG12LmhvciA9IG12LnZlciA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG12ID0gbWJQcmVkLT5tdmRMMFswXTsKLSAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQywgYSsyLCAxMCk7Ci0gICAgICAgIGlmICghYVsyXS5hdmFpbGFibGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkQsIGErMiwgMTUpOwotICAgICAgICB9Ci0KLSAgICAgICAgR2V0UHJlZGljdGlvbk12KCZtdlByZWQsIGEsIHJlZkluZGV4KTsKLQotICAgICAgICBtdi5ob3IgKz0gbXZQcmVkLmhvcjsKLSAgICAgICAgbXYudmVyICs9IG12UHJlZC52ZXI7Ci0KLSAgICAgICAgLyogaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIHJhbmdlIFstMjA0OCwgMjA0Ny43NV0gKi8KLSAgICAgICAgaWYgKCh1MzIpKGkzMikobXYuaG9yKzgxOTIpID49ICgxNjM4NCkpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAgICAgLyogdmVydGljYWwgbW90aW9uIHZlY3RvciByYW5nZSBbLTUxMiwgNTExLjc1XQotICAgICAgICAgKiAoc21hbGxlciBmb3IgbG93IGxldmVscykgKi8KLSAgICAgICAgaWYgKCh1MzIpKGkzMikobXYudmVyKzIwNDgpID49ICg0MDk2KSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0UmVmUGljRGF0YShkcGIsIHJlZkluZGV4KTsKLSAgICBpZiAodG1wID09IE5VTEwpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHBNYi0+bXZbMF0gPSBwTWItPm12WzFdID0gcE1iLT5tdlsyXSA9IHBNYi0+bXZbM10gPQotICAgIHBNYi0+bXZbNF0gPSBwTWItPm12WzVdID0gcE1iLT5tdls2XSA9IHBNYi0+bXZbN10gPQotICAgIHBNYi0+bXZbOF0gPSBwTWItPm12WzldID0gcE1iLT5tdlsxMF0gPSBwTWItPm12WzExXSA9Ci0gICAgcE1iLT5tdlsxMl0gPSBwTWItPm12WzEzXSA9IHBNYi0+bXZbMTRdID0gcE1iLT5tdlsxNV0gPSBtdjsKLQotICAgIHBNYi0+cmVmUGljWzBdID0gcmVmSW5kZXg7Ci0gICAgcE1iLT5yZWZQaWNbMV0gPSByZWZJbmRleDsKLSAgICBwTWItPnJlZlBpY1syXSA9IHJlZkluZGV4OwotICAgIHBNYi0+cmVmUGljWzNdID0gcmVmSW5kZXg7Ci0gICAgcE1iLT5yZWZBZGRyWzBdID0gdG1wOwotICAgIHBNYi0+cmVmQWRkclsxXSA9IHRtcDsKLSAgICBwTWItPnJlZkFkZHJbMl0gPSB0bXA7Ci0gICAgcE1iLT5yZWZBZGRyWzNdID0gdG1wOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBNdlByZWRpY3Rpb24xNng4Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIE1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiBmb3IgMTZ4OCBwYXJ0aXRpb24gbW9kZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgTXZQcmVkaWN0aW9uMTZ4OChtYlN0b3JhZ2VfdCAqcE1iLCBtYlByZWRfdCAqbWJQcmVkLCBkcGJTdG9yYWdlX3QgKmRwYikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICBtdl90IG12OwotICAgIG12X3QgbXZQcmVkOwotICAgIGludGVyTmVpZ2hib3VyX3QgYVszXTsgLyogQSwgQiwgQyAqLwotICAgIHUzMiByZWZJbmRleDsKLSAgICB1OCAqdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBtdiA9IG1iUHJlZC0+bXZkTDBbMF07Ci0gICAgcmVmSW5kZXggPSBtYlByZWQtPnJlZklkeEwwWzBdOwotCi0gICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQiwgYSsxLCAxMCk7Ci0KLSAgICBpZiAoYVsxXS5yZWZJbmRleCA9PSByZWZJbmRleCkKLSAgICAgICAgbXZQcmVkID0gYVsxXS5tdjsKLSAgICBlbHNlCi0gICAgewotICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJBLCBhLCA1KTsKLSAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQywgYSsyLCAxMCk7Ci0gICAgICAgIGlmICghYVsyXS5hdmFpbGFibGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkQsIGErMiwgMTUpOwotICAgICAgICB9Ci0KLSAgICAgICAgR2V0UHJlZGljdGlvbk12KCZtdlByZWQsIGEsIHJlZkluZGV4KTsKLQotICAgIH0KLSAgICBtdi5ob3IgKz0gbXZQcmVkLmhvcjsKLSAgICBtdi52ZXIgKz0gbXZQcmVkLnZlcjsKLQotICAgIC8qIGhvcml6b250YWwgbW90aW9uIHZlY3RvciByYW5nZSBbLTIwNDgsIDIwNDcuNzVdICovCi0gICAgaWYgKCh1MzIpKGkzMikobXYuaG9yKzgxOTIpID49ICgxNjM4NCkpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy01MTIsIDUxMS43NV0gKHNtYWxsZXIgZm9yIGxvdyBsZXZlbHMpICovCi0gICAgaWYgKCh1MzIpKGkzMikobXYudmVyKzIwNDgpID49ICg0MDk2KSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgdG1wID0gaDI2NGJzZEdldFJlZlBpY0RhdGEoZHBiLCByZWZJbmRleCk7Ci0gICAgaWYgKHRtcCA9PSBOVUxMKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICBwTWItPm12WzBdID0gcE1iLT5tdlsxXSA9IHBNYi0+bXZbMl0gPSBwTWItPm12WzNdID0KLSAgICBwTWItPm12WzRdID0gcE1iLT5tdls1XSA9IHBNYi0+bXZbNl0gPSBwTWItPm12WzddID0gbXY7Ci0gICAgcE1iLT5yZWZQaWNbMF0gPSByZWZJbmRleDsKLSAgICBwTWItPnJlZlBpY1sxXSA9IHJlZkluZGV4OwotICAgIHBNYi0+cmVmQWRkclswXSA9IHRtcDsKLSAgICBwTWItPnJlZkFkZHJbMV0gPSB0bXA7Ci0KLSAgICBtdiA9IG1iUHJlZC0+bXZkTDBbMV07Ci0gICAgcmVmSW5kZXggPSBtYlByZWQtPnJlZklkeEwwWzFdOwotCi0gICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iQSwgYSwgMTMpOwotICAgIGlmIChhWzBdLnJlZkluZGV4ID09IHJlZkluZGV4KQotICAgICAgICBtdlByZWQgPSBhWzBdLm12OwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGFbMV0uYXZhaWxhYmxlID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgIGFbMV0ucmVmSW5kZXggPSBwTWItPnJlZlBpY1swXTsKLSAgICAgICAgYVsxXS5tdiA9IHBNYi0+bXZbMF07Ci0KLSAgICAgICAgLyogYyBpcyBub3QgYXZhaWxhYmxlICovCi0gICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkEsIGErMiwgNyk7Ci0KLSAgICAgICAgR2V0UHJlZGljdGlvbk12KCZtdlByZWQsIGEsIHJlZkluZGV4KTsKLQotICAgIH0KLSAgICBtdi5ob3IgKz0gbXZQcmVkLmhvcjsKLSAgICBtdi52ZXIgKz0gbXZQcmVkLnZlcjsKLQotICAgIC8qIGhvcml6b250YWwgbW90aW9uIHZlY3RvciByYW5nZSBbLTIwNDgsIDIwNDcuNzVdICovCi0gICAgaWYgKCh1MzIpKGkzMikobXYuaG9yKzgxOTIpID49ICgxNjM4NCkpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIC8qIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgcmFuZ2UgWy01MTIsIDUxMS43NV0gKHNtYWxsZXIgZm9yIGxvdyBsZXZlbHMpICovCi0gICAgaWYgKCh1MzIpKGkzMikobXYudmVyKzIwNDgpID49ICg0MDk2KSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgdG1wID0gaDI2NGJzZEdldFJlZlBpY0RhdGEoZHBiLCByZWZJbmRleCk7Ci0gICAgaWYgKHRtcCA9PSBOVUxMKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICBwTWItPm12WzhdID0gcE1iLT5tdls5XSA9IHBNYi0+bXZbMTBdID0gcE1iLT5tdlsxMV0gPQotICAgIHBNYi0+bXZbMTJdID0gcE1iLT5tdlsxM10gPSBwTWItPm12WzE0XSA9IHBNYi0+bXZbMTVdID0gbXY7Ci0gICAgcE1iLT5yZWZQaWNbMl0gPSByZWZJbmRleDsKLSAgICBwTWItPnJlZlBpY1szXSA9IHJlZkluZGV4OwotICAgIHBNYi0+cmVmQWRkclsyXSA9IHRtcDsKLSAgICBwTWItPnJlZkFkZHJbM10gPSB0bXA7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IE12UHJlZGljdGlvbjh4MTYKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgTW90aW9uIHZlY3RvciBwcmVkaWN0aW9uIGZvciA4eDE2IHBhcnRpdGlvbiBtb2RlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBNdlByZWRpY3Rpb244eDE2KG1iU3RvcmFnZV90ICpwTWIsIG1iUHJlZF90ICptYlByZWQsIGRwYlN0b3JhZ2VfdCAqZHBiKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIG12X3QgbXY7Ci0gICAgbXZfdCBtdlByZWQ7Ci0gICAgaW50ZXJOZWlnaGJvdXJfdCBhWzNdOyAvKiBBLCBCLCBDICovCi0gICAgdTMyIHJlZkluZGV4OwotICAgIHU4ICp0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIG12ID0gbWJQcmVkLT5tdmRMMFswXTsKLSAgICByZWZJbmRleCA9IG1iUHJlZC0+cmVmSWR4TDBbMF07Ci0KLSAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJBLCBhLCA1KTsKLQotICAgIGlmIChhWzBdLnJlZkluZGV4ID09IHJlZkluZGV4KQotICAgICAgICBtdlByZWQgPSBhWzBdLm12OwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkIsIGErMSwgMTApOwotICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJCLCBhKzIsIDE0KTsKLSAgICAgICAgaWYgKCFhWzJdLmF2YWlsYWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBwTWItPm1iRCwgYSsyLCAxNSk7Ci0gICAgICAgIH0KLQotICAgICAgICBHZXRQcmVkaWN0aW9uTXYoJm12UHJlZCwgYSwgcmVmSW5kZXgpOwotCi0gICAgfQotICAgIG12LmhvciArPSBtdlByZWQuaG9yOwotICAgIG12LnZlciArPSBtdlByZWQudmVyOwotCi0gICAgLyogaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIHJhbmdlIFstMjA0OCwgMjA0Ny43NV0gKi8KLSAgICBpZiAoKHUzMikoaTMyKShtdi5ob3IrODE5MikgPj0gKDE2Mzg0KSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgLyogdmVydGljYWwgbW90aW9uIHZlY3RvciByYW5nZSBbLTUxMiwgNTExLjc1XSAoc21hbGxlciBmb3IgbG93IGxldmVscykgKi8KLSAgICBpZiAoKHUzMikoaTMyKShtdi52ZXIrMjA0OCkgPj0gKDQwOTYpKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0UmVmUGljRGF0YShkcGIsIHJlZkluZGV4KTsKLSAgICBpZiAodG1wID09IE5VTEwpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHBNYi0+bXZbMF0gPSBwTWItPm12WzFdID0gcE1iLT5tdlsyXSA9IHBNYi0+bXZbM10gPQotICAgIHBNYi0+bXZbOF0gPSBwTWItPm12WzldID0gcE1iLT5tdlsxMF0gPSBwTWItPm12WzExXSA9IG12OwotICAgIHBNYi0+cmVmUGljWzBdID0gcmVmSW5kZXg7Ci0gICAgcE1iLT5yZWZQaWNbMl0gPSByZWZJbmRleDsKLSAgICBwTWItPnJlZkFkZHJbMF0gPSB0bXA7Ci0gICAgcE1iLT5yZWZBZGRyWzJdID0gdG1wOwotCi0gICAgbXYgPSBtYlByZWQtPm12ZEwwWzFdOwotICAgIHJlZkluZGV4ID0gbWJQcmVkLT5yZWZJZHhMMFsxXTsKLQotICAgIEdldEludGVyTmVpZ2hib3VyKHBNYi0+c2xpY2VJZCwgcE1iLT5tYkMsIGErMiwgMTApOwotICAgIGlmICghYVsyXS5hdmFpbGFibGUpCi0gICAgewotICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJCLCBhKzIsIDExKTsKLSAgICB9Ci0gICAgaWYgKGFbMl0ucmVmSW5kZXggPT0gcmVmSW5kZXgpCi0gICAgICAgIG12UHJlZCA9IGFbMl0ubXY7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgYVswXS5hdmFpbGFibGUgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgYVswXS5yZWZJbmRleCA9IHBNYi0+cmVmUGljWzBdOwotICAgICAgICBhWzBdLm12ID0gcE1iLT5tdlswXTsKLQotICAgICAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIHBNYi0+bWJCLCBhKzEsIDE0KTsKLQotICAgICAgICBHZXRQcmVkaWN0aW9uTXYoJm12UHJlZCwgYSwgcmVmSW5kZXgpOwotCi0gICAgfQotICAgIG12LmhvciArPSBtdlByZWQuaG9yOwotICAgIG12LnZlciArPSBtdlByZWQudmVyOwotCi0gICAgLyogaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIHJhbmdlIFstMjA0OCwgMjA0Ny43NV0gKi8KLSAgICBpZiAoKHUzMikoaTMyKShtdi5ob3IrODE5MikgPj0gKDE2Mzg0KSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgLyogdmVydGljYWwgbW90aW9uIHZlY3RvciByYW5nZSBbLTUxMiwgNTExLjc1XSAoc21hbGxlciBmb3IgbG93IGxldmVscykgKi8KLSAgICBpZiAoKHUzMikoaTMyKShtdi52ZXIrMjA0OCkgPj0gKDQwOTYpKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0UmVmUGljRGF0YShkcGIsIHJlZkluZGV4KTsKLSAgICBpZiAodG1wID09IE5VTEwpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHBNYi0+bXZbNF0gPSBwTWItPm12WzVdID0gcE1iLT5tdls2XSA9IHBNYi0+bXZbN10gPQotICAgIHBNYi0+bXZbMTJdID0gcE1iLT5tdlsxM10gPSBwTWItPm12WzE0XSA9IHBNYi0+bXZbMTVdID0gbXY7Ci0gICAgcE1iLT5yZWZQaWNbMV0gPSByZWZJbmRleDsKLSAgICBwTWItPnJlZlBpY1szXSA9IHJlZkluZGV4OwotICAgIHBNYi0+cmVmQWRkclsxXSA9IHRtcDsKLSAgICBwTWItPnJlZkFkZHJbM10gPSB0bXA7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IE12UHJlZGljdGlvbjh4OAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBNb3Rpb24gdmVjdG9yIHByZWRpY3Rpb24gZm9yIDh4OCBwYXJ0aXRpb24gbW9kZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgTXZQcmVkaWN0aW9uOHg4KG1iU3RvcmFnZV90ICpwTWIsIHN1Yk1iUHJlZF90ICpzdWJNYlByZWQsIGRwYlN0b3JhZ2VfdCAqZHBiKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLCBqOwotICAgIHUzMiBudW1TdWJNYlBhcnQ7Ci0KLS8qIENvZGUgKi8KLQotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgewotICAgICAgICBudW1TdWJNYlBhcnQgPSBoMjY0YnNkTnVtU3ViTWJQYXJ0KHN1Yk1iUHJlZC0+c3ViTWJUeXBlW2ldKTsKLSAgICAgICAgcE1iLT5yZWZQaWNbaV0gPSBzdWJNYlByZWQtPnJlZklkeEwwW2ldOwotICAgICAgICBwTWItPnJlZkFkZHJbaV0gPSBoMjY0YnNkR2V0UmVmUGljRGF0YShkcGIsIHN1Yk1iUHJlZC0+cmVmSWR4TDBbaV0pOwotICAgICAgICBpZiAocE1iLT5yZWZBZGRyW2ldID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1TdWJNYlBhcnQ7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKE12UHJlZGljdGlvbihwTWIsIHN1Yk1iUHJlZCwgaSwgaikgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogTXZQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFBlcmZvcm0gbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uIGZvciBzdWItcGFydGl0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBNdlByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgc3ViTWJQcmVkX3QgKnN1Yk1iUHJlZCwgdTMyIG1iUGFydElkeCwKLSAgICB1MzIgc3ViTWJQYXJ0SWR4KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIG12X3QgbXYsIG12UHJlZDsKLSAgICB1MzIgcmVmSW5kZXg7Ci0gICAgc3ViTWJQYXJ0TW9kZV9lIHN1Yk1iUGFydE1vZGU7Ci0gICAgY29uc3QgbmVpZ2hib3VyX3QgKm47Ci0gICAgbWJTdG9yYWdlX3QgKm5NYjsKLSAgICBpbnRlck5laWdoYm91cl90IGFbM107IC8qIEEsIEIsIEMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgbXYgPSBzdWJNYlByZWQtPm12ZEwwW21iUGFydElkeF1bc3ViTWJQYXJ0SWR4XTsKLSAgICBzdWJNYlBhcnRNb2RlID0gaDI2NGJzZFN1Yk1iUGFydE1vZGUoc3ViTWJQcmVkLT5zdWJNYlR5cGVbbWJQYXJ0SWR4XSk7Ci0gICAgcmVmSW5kZXggPSBzdWJNYlByZWQtPnJlZklkeEwwW21iUGFydElkeF07Ci0KLSAgICBuID0gTl9BX1NVQl9QQVJUW21iUGFydElkeF1bc3ViTWJQYXJ0TW9kZV0rc3ViTWJQYXJ0SWR4OwotICAgIG5NYiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG4tPm1iKTsKLSAgICBHZXRJbnRlck5laWdoYm91cihwTWItPnNsaWNlSWQsIG5NYiwgYSwgbi0+aW5kZXgpOwotCi0gICAgbiA9IE5fQl9TVUJfUEFSVFttYlBhcnRJZHhdW3N1Yk1iUGFydE1vZGVdK3N1Yk1iUGFydElkeDsKLSAgICBuTWIgPSBoMjY0YnNkR2V0TmVpZ2hib3VyTWIocE1iLCBuLT5tYik7Ci0gICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBuTWIsIGErMSwgbi0+aW5kZXgpOwotCi0gICAgbiA9IE5fQ19TVUJfUEFSVFttYlBhcnRJZHhdW3N1Yk1iUGFydE1vZGVdK3N1Yk1iUGFydElkeDsKLSAgICBuTWIgPSBoMjY0YnNkR2V0TmVpZ2hib3VyTWIocE1iLCBuLT5tYik7Ci0gICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBuTWIsIGErMiwgbi0+aW5kZXgpOwotCi0gICAgaWYgKCFhWzJdLmF2YWlsYWJsZSkKLSAgICB7Ci0gICAgICAgIG4gPSBOX0RfU1VCX1BBUlRbbWJQYXJ0SWR4XVtzdWJNYlBhcnRNb2RlXStzdWJNYlBhcnRJZHg7Ci0gICAgICAgIG5NYiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG4tPm1iKTsKLSAgICAgICAgR2V0SW50ZXJOZWlnaGJvdXIocE1iLT5zbGljZUlkLCBuTWIsIGErMiwgbi0+aW5kZXgpOwotICAgIH0KLQotICAgIEdldFByZWRpY3Rpb25NdigmbXZQcmVkLCBhLCByZWZJbmRleCk7Ci0KLSAgICBtdi5ob3IgKz0gbXZQcmVkLmhvcjsKLSAgICBtdi52ZXIgKz0gbXZQcmVkLnZlcjsKLQotICAgIC8qIGhvcml6b250YWwgbW90aW9uIHZlY3RvciByYW5nZSBbLTIwNDgsIDIwNDcuNzVdICovCi0gICAgaWYgKCgodTMyKShpMzIpKG12Lmhvcis4MTkyKSA+PSAoMTYzODQpKSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgLyogdmVydGljYWwgbW90aW9uIHZlY3RvciByYW5nZSBbLTUxMiwgNTExLjc1XSAoc21hbGxlciBmb3IgbG93IGxldmVscykgKi8KLSAgICBpZiAoKCh1MzIpKGkzMikobXYudmVyKzIwNDgpID49ICg0MDk2KSkpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHN3aXRjaCAoc3ViTWJQYXJ0TW9kZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTUJfU1BfOHg4OgotICAgICAgICAgICAgcE1iLT5tdls0Km1iUGFydElkeF0gPSBtdjsKLSAgICAgICAgICAgIHBNYi0+bXZbNCptYlBhcnRJZHggKyAxXSA9IG12OwotICAgICAgICAgICAgcE1iLT5tdls0Km1iUGFydElkeCArIDJdID0gbXY7Ci0gICAgICAgICAgICBwTWItPm12WzQqbWJQYXJ0SWR4ICsgM10gPSBtdjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTUJfU1BfOHg0OgotICAgICAgICAgICAgcE1iLT5tdls0Km1iUGFydElkeCArIDIqc3ViTWJQYXJ0SWR4XSA9IG12OwotICAgICAgICAgICAgcE1iLT5tdls0Km1iUGFydElkeCArIDIqc3ViTWJQYXJ0SWR4ICsgMV0gPSBtdjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTUJfU1BfNHg4OgotICAgICAgICAgICAgcE1iLT5tdls0Km1iUGFydElkeCArIHN1Yk1iUGFydElkeF0gPSBtdjsKLSAgICAgICAgICAgIHBNYi0+bXZbNCptYlBhcnRJZHggKyBzdWJNYlBhcnRJZHggKyAyXSA9IG12OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNQl9TUF80eDQ6Ci0gICAgICAgICAgICBwTWItPm12WzQqbWJQYXJ0SWR4ICsgc3ViTWJQYXJ0SWR4XSA9IG12OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBNZWRpYW5GaWx0ZXIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgTWVkaWFuIGZpbHRlcmluZyBmb3IgbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWkzMiBNZWRpYW5GaWx0ZXIoaTMyIGEsIGkzMiBiLCBpMzIgYykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICBpMzIgbWF4LG1pbixtZWQ7Ci0KLS8qIENvZGUgKi8KLQotICAgIG1heCA9IG1pbiA9IG1lZCA9IGE7Ci0gICAgaWYgKGIgPiBtYXgpCi0gICAgewotICAgICAgICBtYXggPSBiOwotICAgIH0KLSAgICBlbHNlIGlmIChiIDwgbWluKQotICAgIHsKLSAgICAgICAgbWluID0gYjsKLSAgICB9Ci0gICAgaWYgKGMgPiBtYXgpCi0gICAgewotICAgICAgICBtZWQgPSBtYXg7Ci0gICAgfQotICAgIGVsc2UgaWYgKGMgPCBtaW4pCi0gICAgewotICAgICAgICBtZWQgPSBtaW47Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG1lZCA9IGM7Ci0gICAgfQotCi0gICAgcmV0dXJuKG1lZCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogR2V0SW50ZXJOZWlnaGJvdXIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgR2V0IGF2YWlsYWJpbGl0eSwgcmVmZXJlbmNlIGluZGV4IGFuZCBtb3Rpb24gdmVjdG9yIG9mIGEgbmVpZ2hib3VyCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgR2V0SW50ZXJOZWlnaGJvdXIodTMyIHNsaWNlSWQsIG1iU3RvcmFnZV90ICpuTWIsCi0gICAgaW50ZXJOZWlnaGJvdXJfdCAqbiwgdTMyIGluZGV4KQotewotCi0gICAgbi0+YXZhaWxhYmxlID0gSEFOVFJPX0ZBTFNFOwotICAgIG4tPnJlZkluZGV4ID0gMHhGRkZGRkZGRjsKLSAgICBuLT5tdi5ob3IgPSBuLT5tdi52ZXIgPSAwOwotCi0gICAgaWYgKG5NYiAmJiAoc2xpY2VJZCA9PSBuTWItPnNsaWNlSWQpKQotICAgIHsKLSAgICAgICAgdTMyIHRtcDsKLSAgICAgICAgbXZfdCB0bXBNdjsKLQotICAgICAgICB0bXAgPSBuTWItPm1iVHlwZTsKLSAgICAgICAgbi0+YXZhaWxhYmxlID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgIC8qIE1iUGFydFByZWRNb2RlICJpbmxpbmVkIiAqLwotICAgICAgICBpZiAodG1wIDw9IFBfOHg4cmVmMCkKLSAgICAgICAgewotICAgICAgICAgICAgdG1wTXYgPSBuTWItPm12W2luZGV4XTsKLSAgICAgICAgICAgIHRtcCA9IG5NYi0+cmVmUGljW2luZGV4Pj4yXTsKLSAgICAgICAgICAgIG4tPnJlZkluZGV4ID0gdG1wOwotICAgICAgICAgICAgbi0+bXYgPSB0bXBNdjsKLSAgICAgICAgfQotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEdldFByZWRpY3Rpb25NdgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBDb21wdXRlIG1vdGlvbiB2ZWN0b3IgcHJlZGljdG9yIGJhc2VkIG9uIG5laWdoYm91cnMgQSwgQiBhbmQgQwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIEdldFByZWRpY3Rpb25Ndihtdl90ICptdiwgaW50ZXJOZWlnaGJvdXJfdCAqYSwgdTMyIHJlZkluZGV4KQotewotCi0gICAgaWYgKCBhWzFdLmF2YWlsYWJsZSB8fCBhWzJdLmF2YWlsYWJsZSB8fCAhYVswXS5hdmFpbGFibGUpCi0gICAgewotICAgICAgICB1MzIgaXNBLCBpc0IsIGlzQzsKLSAgICAgICAgaXNBID0gKGFbMF0ucmVmSW5kZXggPT0gcmVmSW5kZXgpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0gICAgICAgIGlzQiA9IChhWzFdLnJlZkluZGV4ID09IHJlZkluZGV4KSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotICAgICAgICBpc0MgPSAoYVsyXS5yZWZJbmRleCA9PSByZWZJbmRleCkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgICAgICBpZiAoKCh1MzIpaXNBKyh1MzIpaXNCKyh1MzIpaXNDKSAhPSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBtdi0+aG9yID0gKGkxNilNZWRpYW5GaWx0ZXIoYVswXS5tdi5ob3IsIGFbMV0ubXYuaG9yLCBhWzJdLm12Lmhvcik7Ci0gICAgICAgICAgICBtdi0+dmVyID0gKGkxNilNZWRpYW5GaWx0ZXIoYVswXS5tdi52ZXIsIGFbMV0ubXYudmVyLCBhWzJdLm12LnZlcik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoaXNBKQotICAgICAgICAgICAgKm12ID0gYVswXS5tdjsKLSAgICAgICAgZWxzZSBpZiAoaXNCKQotICAgICAgICAgICAgKm12ID0gYVsxXS5tdjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgKm12ID0gYVsyXS5tdjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgKm12ID0gYVswXS5tdjsKLSAgICB9Ci0KLX0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50ZXJfcHJlZGljdGlvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludGVyX3ByZWRpY3Rpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRkZWUyNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50ZXJfcHJlZGljdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19JTlRFUl9QUkVESUNUSU9OX0gKLSNkZWZpbmUgSDI2NFNXREVDX0lOVEVSX1BSRURJQ1RJT05fSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9pbWFnZS5oIgotI2luY2x1ZGUgImgyNjRic2RfbWFjcm9ibG9ja19sYXllci5oIgotI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZEludGVyUHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCBtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsCi0gICAgZHBiU3RvcmFnZV90ICpkcGIsIHUzMiBtYk51bSwgaW1hZ2VfdCAqaW1hZ2UsIHU4ICpkYXRhKTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfSU5URVJfUFJFRElDVElPTl9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50cmFfcHJlZGljdGlvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmM4NWU1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBoMjY0YnNkSW50cmFQcmVkaWN0aW9uCi0gICAgICAgICAgaDI2NGJzZEdldE5laWdoYm91clBlbHMKLSAgICAgICAgICBoMjY0YnNkSW50cmExNngxNlByZWRpY3Rpb24KLSAgICAgICAgICBoMjY0YnNkSW50cmE0eDRQcmVkaWN0aW9uCi0gICAgICAgICAgaDI2NGJzZEludHJhQ2hyb21hUHJlZGljdGlvbgotICAgICAgICAgIGgyNjRic2RBZGRSZXNpZHVhbAotICAgICAgICAgIEludHJhMTZ4MTZWZXJ0aWNhbFByZWRpY3Rpb24KLSAgICAgICAgICBJbnRyYTE2eDE2SG9yaXpvbnRhbFByZWRpY3Rpb24KLSAgICAgICAgICBJbnRyYTE2eDE2RGNQcmVkaWN0aW9uCi0gICAgICAgICAgSW50cmExNngxNlBsYW5lUHJlZGljdGlvbgotICAgICAgICAgIEludHJhQ2hyb21hRGNQcmVkaWN0aW9uCi0gICAgICAgICAgSW50cmFDaHJvbWFIb3Jpem9udGFsUHJlZGljdGlvbgotICAgICAgICAgIEludHJhQ2hyb21hVmVydGljYWxQcmVkaWN0aW9uCi0gICAgICAgICAgSW50cmFDaHJvbWFQbGFuZVByZWRpY3Rpb24KLSAgICAgICAgICBHZXQ0eDROZWlnaGJvdXJQZWxzCi0gICAgICAgICAgV3JpdGU0eDRUbzE2eDE2Ci0gICAgICAgICAgSW50cmE0eDRWZXJ0aWNhbFByZWRpY3Rpb24KLSAgICAgICAgICBJbnRyYTR4NEhvcml6b250YWxQcmVkaWN0aW9uCi0gICAgICAgICAgSW50cmE0eDREY1ByZWRpY3Rpb24KLSAgICAgICAgICBJbnRyYTR4NERpYWdvbmFsRG93bkxlZnRQcmVkaWN0aW9uCi0gICAgICAgICAgSW50cmE0eDREaWFnb25hbERvd25SaWdodFByZWRpY3Rpb24KLSAgICAgICAgICBJbnRyYTR4NFZlcnRpY2FsUmlnaHRQcmVkaWN0aW9uCi0gICAgICAgICAgSW50cmE0eDRIb3Jpem9udGFsRG93blByZWRpY3Rpb24KLSAgICAgICAgICBJbnRyYTR4NFZlcnRpY2FsTGVmdFByZWRpY3Rpb24KLSAgICAgICAgICBJbnRyYTR4NEhvcml6b250YWxVcFByZWRpY3Rpb24KLSAgICAgICAgICBEZXRlcm1pbmVJbnRyYTR4NFByZWRNb2RlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF9pbnRyYV9wcmVkaWN0aW9uLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9uZWlnaGJvdXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2ltYWdlLmgiCi0KLSNpZmRlZiBIMjY0REVDX09NWERMCi0jaW5jbHVkZSAib214dHlwZXMuaCIKLSNpbmNsdWRlICJvbXhWQy5oIgotI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogU3dpdGNoIG9mZiB0aGUgZm9sbG93aW5nIExpbnQgbWVzc2FnZXMgZm9yIHRoaXMgZmlsZToKLSAqIEluZm8gNzAyOiBTaGlmdCByaWdodCBvZiBzaWduZWQgcXVhbnRpdHkgKGludCkKLSAqLwotLypsaW50IC1lNzAyICovCi0KLQotLyogeC0gYW5kIHktY29vcmRpbmF0ZXMgZm9yIGVhY2ggYmxvY2sgKi8KLWNvbnN0IHUzMiBoMjY0YnNkQmxvY2tYWzE2XSA9Ci0gICAgeyAwLCA0LCAwLCA0LCA4LCAxMiwgOCwgMTIsIDAsIDQsIDAsIDQsIDgsIDEyLCA4LCAxMiB9OwotY29uc3QgdTMyIGgyNjRic2RCbG9ja1lbMTZdID0KLSAgICB7IDAsIDAsIDQsIDQsIDAsIDAsIDQsIDQsIDgsIDgsIDEyLCAxMiwgOCwgOCwgMTIsIDEyIH07Ci0KLWNvbnN0IHU4IGgyNjRic2RDbGlwWzEyODBdID0KLXsKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwKLSAgICAxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwKLSAgICAzMiwzMywzNCwzNSwzNiwzNywzOCwzOSw0MCw0MSw0Miw0Myw0NCw0NSw0Niw0NywKLSAgICA0OCw0OSw1MCw1MSw1Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSw2Miw2MywKLSAgICA2NCw2NSw2Niw2Nyw2OCw2OSw3MCw3MSw3Miw3Myw3NCw3NSw3Niw3Nyw3OCw3OSwKLSAgICA4MCw4MSw4Miw4Myw4NCw4NSw4Niw4Nyw4OCw4OSw5MCw5MSw5Miw5Myw5NCw5NSwKLSAgICA5Niw5Nyw5OCw5OSwxMDAsMTAxLDEwMiwxMDMsMTA0LDEwNSwxMDYsMTA3LDEwOCwxMDksMTEwLDExMSwKLSAgICAxMTIsMTEzLDExNCwxMTUsMTE2LDExNywxMTgsMTE5LDEyMCwxMjEsMTIyLDEyMywxMjQsMTI1LDEyNiwxMjcsCi0gICAgMTI4LDEyOSwxMzAsMTMxLDEzMiwxMzMsMTM0LDEzNSwxMzYsMTM3LDEzOCwxMzksMTQwLDE0MSwxNDIsMTQzLAotICAgIDE0NCwxNDUsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLDE1MywxNTQsMTU1LDE1NiwxNTcsMTU4LDE1OSwKLSAgICAxNjAsMTYxLDE2MiwxNjMsMTY0LDE2NSwxNjYsMTY3LDE2OCwxNjksMTcwLDE3MSwxNzIsMTczLDE3NCwxNzUsCi0gICAgMTc2LDE3NywxNzgsMTc5LDE4MCwxODEsMTgyLDE4MywxODQsMTg1LDE4NiwxODcsMTg4LDE4OSwxOTAsMTkxLAotICAgIDE5MiwxOTMsMTk0LDE5NSwxOTYsMTk3LDE5OCwxOTksMjAwLDIwMSwyMDIsMjAzLDIwNCwyMDUsMjA2LDIwNywKLSAgICAyMDgsMjA5LDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsMjIxLDIyMiwyMjMsCi0gICAgMjI0LDIyNSwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyMzUsMjM2LDIzNywyMzgsMjM5LAotICAgIDI0MCwyNDEsMjQyLDI0MywyNDQsMjQ1LDI0NiwyNDcsMjQ4LDI0OSwyNTAsMjUxLDI1MiwyNTMsMjU0LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAotICAgIDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKLSAgICAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCi0gICAgMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1Ci19OwotCi0jaWZuZGVmIEgyNjRERUNfT01YREwKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB2b2lkIEdldDR4NE5laWdoYm91clBlbHModTggKmEsIHU4ICpsLCB1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCwKLSAgICB1MzIgYmxvY2tOdW0pOwotc3RhdGljIHZvaWQgSW50cmExNngxNlZlcnRpY2FsUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlKTsKLXN0YXRpYyB2b2lkIEludHJhMTZ4MTZIb3Jpem9udGFsUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmxlZnQpOwotc3RhdGljIHZvaWQgSW50cmExNngxNkRjUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCwKLSAgICB1MzIgQSwgdTMyIEIpOwotc3RhdGljIHZvaWQgSW50cmExNngxNlBsYW5lUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCk7Ci1zdGF0aWMgdm9pZCBJbnRyYUNocm9tYURjUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCwKLSAgICB1MzIgQSwgdTMyIEIpOwotc3RhdGljIHZvaWQgSW50cmFDaHJvbWFIb3Jpem9udGFsUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmxlZnQpOwotc3RhdGljIHZvaWQgSW50cmFDaHJvbWFWZXJ0aWNhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSk7Ci1zdGF0aWMgdm9pZCBJbnRyYUNocm9tYVBsYW5lUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCk7Ci0KLXN0YXRpYyB2b2lkIEludHJhNHg0VmVydGljYWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUpOwotc3RhdGljIHZvaWQgSW50cmE0eDRIb3Jpem9udGFsUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmxlZnQpOwotc3RhdGljIHZvaWQgSW50cmE0eDREY1ByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQsIHUzMiBBLCB1MzIgQik7Ci1zdGF0aWMgdm9pZCBJbnRyYTR4NERpYWdvbmFsRG93bkxlZnRQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUpOwotc3RhdGljIHZvaWQgSW50cmE0eDREaWFnb25hbERvd25SaWdodFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQpOwotc3RhdGljIHZvaWQgSW50cmE0eDRWZXJ0aWNhbFJpZ2h0UHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCk7Ci1zdGF0aWMgdm9pZCBJbnRyYTR4NEhvcml6b250YWxEb3duUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCk7Ci1zdGF0aWMgdm9pZCBJbnRyYTR4NFZlcnRpY2FsTGVmdFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSk7Ci1zdGF0aWMgdm9pZCBJbnRyYTR4NEhvcml6b250YWxVcFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICpsZWZ0KTsKLXZvaWQgaDI2NGJzZEFkZFJlc2lkdWFsKHU4ICpkYXRhLCBpMzIgKnJlc2lkdWFsLCB1MzIgYmxvY2tOdW0pOwotCi1zdGF0aWMgdm9pZCBXcml0ZTR4NFRvMTZ4MTYodTggKmRhdGEsIHU4ICpkYXRhNHg0LCB1MzIgYmxvY2tOdW0pOwotI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KLQotc3RhdGljIHUzMiBEZXRlcm1pbmVJbnRyYTR4NFByZWRNb2RlKG1hY3JvYmxvY2tMYXllcl90ICpwTWJMYXllciwKLSAgICB1MzIgYXZhaWxhYmxlLCBuZWlnaGJvdXJfdCAqbkEsIG5laWdoYm91cl90ICpuQiwgdTMyIGluZGV4LAotICAgIG1iU3RvcmFnZV90ICpuTWJBLCBtYlN0b3JhZ2VfdCAqbk1iQik7Ci0KLQotI2lmZGVmIEgyNjRERUNfT01YREwKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50cmExNngxNlByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgMTZ4MTYgcHJlZGljdGlvbiBtb2RlIGZvciBsdW1hIHBpeGVscyBhbmQgYWRkCi0gICAgICAgICAgcmVzaWR1YWwgaW50byBwcmVkaWN0aW9uLiBUaGUgcmVzdWx0aW5nIGx1bWEgcGl4ZWxzIGFyZQotICAgICAgICAgIHN0b3JlZCBpbiBtYWNyb2Jsb2NrIGFycmF5ICdkYXRhJy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXUzMiBoMjY0YnNkSW50cmExNngxNlByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIHU4ICpwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiB3aWR0aCwgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBhdmFpbGFibGVBLCBhdmFpbGFibGVCLCBhdmFpbGFibGVEOwotICAgIE9NWFJlc3VsdCBvbXhSZXM7Ci0KLS8qIENvZGUgKi8KLSAgICBBU1NFUlQocE1iKTsKLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKHB0cik7Ci0gICAgQVNTRVJUKGgyNjRic2RQcmVkTW9kZUludHJhMTZ4MTYocE1iLT5tYlR5cGUpIDwgNCk7Ci0KLSAgICBhdmFpbGFibGVBID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkEpOwotICAgIGlmIChhdmFpbGFibGVBICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCi0gICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iQS0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQotICAgICAgICBhdmFpbGFibGVBID0gSEFOVFJPX0ZBTFNFOwotICAgIGF2YWlsYWJsZUIgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iQik7Ci0gICAgaWYgKGF2YWlsYWJsZUIgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKLSAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJCLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCi0gICAgICAgIGF2YWlsYWJsZUIgPSBIQU5UUk9fRkFMU0U7Ci0gICAgYXZhaWxhYmxlRCA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJEKTsKLSAgICBpZiAoYXZhaWxhYmxlRCAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgotICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkQtPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKLSAgICAgICAgYXZhaWxhYmxlRCA9IEhBTlRST19GQUxTRTsKLQotICAgIG9teFJlcyA9IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2KCAocHRyLTEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0ciAtIHdpZHRoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdHIgLSB3aWR0aC0xKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRic2RQcmVkTW9kZUludHJhMTZ4MTYocE1iLT5tYlR5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMikoYXZhaWxhYmxlQiArIChhdmFpbGFibGVBPDwxKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZUQ8PDUpKSApOwotICAgIGlmIChvbXhSZXMgIT0gT01YX1N0c19Ob0VycikKLSAgICAgICAgcmV0dXJuIEhBTlRST19OT0s7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50cmE0eDRQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGludHJhIDR4NCBwcmVkaWN0aW9uIGZvciBsdW1hIHBpeGVscyBhbmQgYWRkIHJlc2lkdWFsCi0gICAgICAgICAgaW50byBwcmVkaWN0aW9uLiBUaGUgcmVzdWx0aW5nIGx1bWEgcGl4ZWxzIGFyZSBzdG9yZWQgaW4KLSAgICAgICAgICBtYWNyb2Jsb2NrIGFycmF5ICdkYXRhJy4gVGhlIGludHJhIDR4NCBwcmVkaWN0aW9uIG1vZGUgZm9yIGVhY2gKLSAgICAgICAgICBibG9jayBpcyBzdG9yZWQgaW4gJ3BNYicgc3RydWN0dXJlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIGgyNjRic2RJbnRyYTR4NFByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpwdHIsIHUzMiB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCwgdTMyIGJsb2NrKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLSAgICB1MzIgbW9kZTsKLSAgICBuZWlnaGJvdXJfdCBuZWlnaGJvdXIsIG5laWdoYm91ckI7Ci0gICAgbWJTdG9yYWdlX3QgKm5NYiwgKm5NYjI7Ci0gICAgdTMyIGF2YWlsYWJsZUEsIGF2YWlsYWJsZUIsIGF2YWlsYWJsZUMsIGF2YWlsYWJsZUQ7Ci0KLSAgICBPTVhSZXN1bHQgb214UmVzOwotICAgIHUzMiB4LCB5OwotICAgIHU4ICpsLCAqYSwgKmFsOwotLyogQ29kZSAqLwotICAgIEFTU0VSVChwTWIpOwotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQobWJMYXllcik7Ci0gICAgQVNTRVJUKHB0cik7Ci0gICAgQVNTRVJUKHBNYi0+aW50cmE0eDRQcmVkTW9kZVtibG9ja10gPCA5KTsKLQotICAgIG5laWdoYm91ciA9ICpoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tBKGJsb2NrKTsKLSAgICBuTWIgPSBoMjY0YnNkR2V0TmVpZ2hib3VyTWIocE1iLCBuZWlnaGJvdXIubWIpOwotICAgIGF2YWlsYWJsZUEgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBuTWIpOwotICAgIGlmIChhdmFpbGFibGVBICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCi0gICAgICAgKCBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobk1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikgKQotICAgIHsKLSAgICAgICAgYXZhaWxhYmxlQSA9IEhBTlRST19GQUxTRTsKLSAgICB9Ci0KLSAgICBuZWlnaGJvdXJCID0gKmgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0IoYmxvY2spOwotICAgIG5NYjIgPSBoMjY0YnNkR2V0TmVpZ2hib3VyTWIocE1iLCBuZWlnaGJvdXJCLm1iKTsKLSAgICBhdmFpbGFibGVCID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgbk1iMik7Ci0gICAgaWYgKGF2YWlsYWJsZUIgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKLSAgICAgICAoIGgyNjRic2RNYlBhcnRQcmVkTW9kZShuTWIyLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikgKQotICAgIHsKLSAgICAgICAgYXZhaWxhYmxlQiA9IEhBTlRST19GQUxTRTsKLSAgICB9Ci0KLSAgICBtb2RlID0gRGV0ZXJtaW5lSW50cmE0eDRQcmVkTW9kZShtYkxheWVyLAotICAgICAgICAodTMyKShhdmFpbGFibGVBICYmIGF2YWlsYWJsZUIpLAotICAgICAgICAmbmVpZ2hib3VyLCAmbmVpZ2hib3VyQiwgYmxvY2ssIG5NYiwgbk1iMik7Ci0gICAgcE1iLT5pbnRyYTR4NFByZWRNb2RlW2Jsb2NrXSA9ICh1OCltb2RlOwotCi0gICAgbmVpZ2hib3VyID0gKmgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0MoYmxvY2spOwotICAgIG5NYiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG5laWdoYm91ci5tYik7Ci0gICAgYXZhaWxhYmxlQyA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIG5NYik7Ci0gICAgaWYgKGF2YWlsYWJsZUMgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKLSAgICAgICAoIGgyNjRic2RNYlBhcnRQcmVkTW9kZShuTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSApCi0gICAgewotICAgICAgICBhdmFpbGFibGVDID0gSEFOVFJPX0ZBTFNFOwotICAgIH0KLQotICAgIG5laWdoYm91ciA9ICpoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tEKGJsb2NrKTsKLSAgICBuTWIgPSBoMjY0YnNkR2V0TmVpZ2hib3VyTWIocE1iLCBuZWlnaGJvdXIubWIpOwotICAgIGF2YWlsYWJsZUQgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBuTWIpOwotICAgIGlmIChhdmFpbGFibGVEICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCi0gICAgICAgKCBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobk1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikgKQotICAgIHsKLSAgICAgICAgYXZhaWxhYmxlRCA9IEhBTlRST19GQUxTRTsKLSAgICB9Ci0KLSAgICB4ID0gaDI2NGJzZEJsb2NrWFtibG9ja107Ci0gICAgeSA9IGgyNjRic2RCbG9ja1lbYmxvY2tdOwotCi0gICAgaWYgKHkgPT0gMCkKLSAgICAgICAgYSA9IHB0ciAtIHdpZHRoICsgeDsKLSAgICBlbHNlCi0gICAgICAgIGEgPSBkYXRhLTE2OwotCi0gICAgaWYgKHggPT0gMCkKLSAgICAgICAgbCA9IHB0ciArIHkgKiB3aWR0aCAtMTsKLSAgICBlbHNlCi0gICAgewotICAgICAgICBsID0gZGF0YS0xOwotICAgICAgICB3aWR0aCA9IDE2OwotICAgIH0KLQotICAgIGlmICh4ID09IDApCi0gICAgICAgIGFsID0gbC13aWR0aDsKLSAgICBlbHNlCi0gICAgICAgIGFsID0gYS0xOwotCi0gICAgb214UmVzID0gb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0KCBsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSltb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMikoYXZhaWxhYmxlQiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlQTw8MSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZUQ8PDUpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVDPDw2KSkgKTsKLSAgICBpZiAob214UmVzICE9IE9NWF9TdHNfTm9FcnIpCi0gICAgICAgIHJldHVybiBIQU5UUk9fTk9LOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50cmFDaHJvbWFQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGludHJhIHByZWRpY3Rpb24gZm9yIGNocm9tYSBwaXhlbHMgYW5kIGFkZCByZXNpZHVhbAotICAgICAgICAgIGludG8gcHJlZGljdGlvbi4gVGhlIHJlc3VsdGluZyBjaHJvbWEgcGl4ZWxzIGFyZSBzdG9yZWQgaW4gJ2RhdGEnLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIGgyNjRic2RJbnRyYUNocm9tYVByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIGltYWdlX3QgKmltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBwcmVkTW9kZSwgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBhdmFpbGFibGVBLCBhdmFpbGFibGVCLCBhdmFpbGFibGVEOwotICAgIE9NWFJlc3VsdCBvbXhSZXM7Ci0gICAgdTggKnB0cjsKLSAgICB1MzIgd2lkdGg7Ci0KLS8qIENvZGUgKi8KLSAgICBBU1NFUlQocE1iKTsKLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGltYWdlKTsKLSAgICBBU1NFUlQocHJlZE1vZGUgPCA0KTsKLQotICAgIGF2YWlsYWJsZUEgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iQSk7Ci0gICAgaWYgKGF2YWlsYWJsZUEgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKLSAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJBLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCi0gICAgICAgIGF2YWlsYWJsZUEgPSBIQU5UUk9fRkFMU0U7Ci0gICAgYXZhaWxhYmxlQiA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJCKTsKLSAgICBpZiAoYXZhaWxhYmxlQiAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgotICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKLSAgICAgICAgYXZhaWxhYmxlQiA9IEhBTlRST19GQUxTRTsKLSAgICBhdmFpbGFibGVEID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkQpOwotICAgIGlmIChhdmFpbGFibGVEICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCi0gICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iRC0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQotICAgICAgICBhdmFpbGFibGVEID0gSEFOVFJPX0ZBTFNFOwotCi0gICAgcHRyID0gaW1hZ2UtPmNiOwotICAgIHdpZHRoID0gaW1hZ2UtPndpZHRoKjg7Ci0KLSAgICBvbXhSZXMgPSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDgoIChwdHItMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHRyIC0gd2lkdGgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0ciAtIHdpZHRoIC0xKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyKXdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMikoYXZhaWxhYmxlQiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZUE8PDEpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlRDw8NSkpICk7Ci0gICAgaWYgKG9teFJlcyAhPSBPTVhfU3RzX05vRXJyKQotICAgICAgICByZXR1cm4gSEFOVFJPX05PSzsKLQotICAgIC8qIGFkdmFuY2UgcG9pbnRlcnMgKi8KLSAgICBkYXRhICs9IDY0OwotICAgIHB0ciA9IGltYWdlLT5jcjsKLQotICAgIG9teFJlcyA9IG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCggKHB0ci0xKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdHIgLSB3aWR0aCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHRyIC0gd2lkdGggLTEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzIpd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZE1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyKShhdmFpbGFibGVCICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlQTw8MSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVEPDw1KSkgKTsKLSAgICBpZiAob214UmVzICE9IE9NWF9TdHNfTm9FcnIpCi0gICAgICAgIHJldHVybiBIQU5UUk9fTk9LOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotCi0jZWxzZSAvKiBIMjY0REVDX09NWERMICovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50cmFQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQcm9jZXNzZXMgb25lIGludHJhIG1hY3JvYmxvY2suIFBlcmZvcm1zIGludHJhIHByZWRpY3Rpb24gdXNpbmcKLSAgICAgICAgICBzcGVjaWZpZWQgcHJlZGljdGlvbiBtb2RlLiBXcml0ZXMgdGhlIGZpbmFsIG1hY3JvYmxvY2sKLSAgICAgICAgICAocHJlZGljdGlvbiArIHJlc2lkdWFsKSBpbnRvIHRoZSBvdXRwdXQgaW1hZ2UgKGltYWdlKQotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICBwTWIgICAgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBzcGVjaWZpYyBpbmZvcm1hdGlvbgotICAgICAgICAgIG1iTGF5ZXIgICAgICAgcG9pbnRlciB0byBjdXJyZW50IG1hY3JvYmxvY2sgZGF0YSBmcm9tIHN0cmVhbQotICAgICAgICAgIGltYWdlICAgICAgICAgcG9pbnRlciB0byBvdXRwdXQgaW1hZ2UKLSAgICAgICAgICBtYk51bSAgICAgICAgIGN1cnJlbnQgbWFjcm9ibG9jayBudW1iZXIKLSAgICAgICAgICBjb25zdHJhaW5lZEludHJhUHJlZCAgZmxhZyBzcGVjaWZ5aW5nIGlmIG5laWdoYm91cmluZyBpbnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrcyBhcmUgdXNlZCBpbiBpbnRyYSBwcmVkaWN0aW9uCi0gICAgICAgICAgZGF0YSAgICAgICAgICBwb2ludGVyIHdoZXJlIG91dHB1dCBtYWNyb2Jsb2NrIHdpbGwgYmUgc3RvcmVkCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICBwTWIgICAgICAgICAgIHN0cnVjdHVyZSBpcyB1cGRhdGVkIHdpdGggY3VycmVudCBtYWNyb2Jsb2NrCi0gICAgICAgICAgaW1hZ2UgICAgICAgICBjdXJyZW50IG1hY3JvYmxvY2sgaXMgd3JpdHRlbiBpbnRvIGltYWdlCi0gICAgICAgICAgZGF0YSAgICAgICAgICBjdXJyZW50IG1hY3JvYmxvY2sgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgIEhBTlRST19PSyAgICAgc3VjY2VzcwotICAgICAgICAgIEhBTlRST19OT0sgICAgZXJyb3IgaW4gaW50cmEgcHJlZGljdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIGgyNjRic2RJbnRyYVByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgbWFjcm9ibG9ja0xheWVyX3QgKm1iTGF5ZXIsCi0gICAgaW1hZ2VfdCAqaW1hZ2UsIHUzMiBtYk51bSwgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkLCB1OCAqZGF0YSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICAvKiBwZWxBYm92ZSBhbmQgcGVsTGVmdCBjb250YWluIHNhbXBsZXMgYWJvdmUgYW5kIGxlZnQgdG8gdGhlIGN1cnJlbnQKLSAgICAgKiBtYWNyb2Jsb2NrLiBBYm92ZSBhcnJheSBjb250YWlucyBhbHNvIHNhbXBsZSBhYm92ZS1sZWZ0IHRvIHRoZSBjdXJyZW50Ci0gICAgICogbWIgYXMgd2VsbCBhcyA0IHNhbXBsZXMgYWJvdmUtcmlnaHQgdG8gdGhlIGN1cnJlbnQgbWIgKGxhdHRlciBvbmx5IGZvcgotICAgICAqIGx1bWEpICovCi0gICAgLyogbHVtRCArIGx1bUIgKyBsdW1DICsgY2JEICsgY2JCICsgY3JEICsgY3JCICovCi0gICAgdTggcGVsQWJvdmVbMSArIDE2ICsgNCArIDEgKyA4ICsgMSArIDhdOwotICAgIC8qIGx1bUEgKyBjYkEgKyBjckEgKi8KLSAgICB1OCBwZWxMZWZ0WzE2ICsgOCArIDhdOwotICAgIHUzMiB0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwTWIpOwotICAgIEFTU0VSVChpbWFnZSk7Ci0gICAgQVNTRVJUKG1iTnVtIDwgaW1hZ2UtPndpZHRoICogaW1hZ2UtPmhlaWdodCk7Ci0gICAgQVNTRVJUKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iVHlwZSkgIT0gUFJFRF9NT0RFX0lOVEVSKTsKLQotICAgIGgyNjRic2RHZXROZWlnaGJvdXJQZWxzKGltYWdlLCBwZWxBYm92ZSwgcGVsTGVmdCwgbWJOdW0pOwotCi0gICAgaWYgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVFJBMTZ4MTYpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkSW50cmExNngxNlByZWRpY3Rpb24ocE1iLCBkYXRhLCBtYkxheWVyLT5yZXNpZHVhbC5sZXZlbCwKLSAgICAgICAgICAgIHBlbEFib3ZlLCBwZWxMZWZ0LCBjb25zdHJhaW5lZEludHJhUHJlZCk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RJbnRyYTR4NFByZWRpY3Rpb24ocE1iLCBkYXRhLCBtYkxheWVyLAotICAgICAgICAgICAgcGVsQWJvdmUsIHBlbExlZnQsIGNvbnN0cmFpbmVkSW50cmFQcmVkKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICB9Ci0KLSAgICB0bXAgPSBoMjY0YnNkSW50cmFDaHJvbWFQcmVkaWN0aW9uKHBNYiwgZGF0YSArIDI1NiwKLSAgICAgICAgICAgIG1iTGF5ZXItPnJlc2lkdWFsLmxldmVsKzE2LCBwZWxBYm92ZSArIDIxLCBwZWxMZWZ0ICsgMTYsCi0gICAgICAgICAgICBtYkxheWVyLT5tYlByZWQuaW50cmFDaHJvbWFQcmVkTW9kZSwgY29uc3RyYWluZWRJbnRyYVByZWQpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIGlmIGRlY29kZWQgZmxhZyA+IDEgLT4gbWIgaGFzIGFscmVhZHkgYmVlbiBzdWNjZXNzZnVsbHkgZGVjb2RlZCBhbmQKLSAgICAgKiB3cml0dGVuIHRvIG91dHB1dCAtPiBkbyBub3Qgd3JpdGUgYWdhaW4gKi8KLSAgICBpZiAocE1iLT5kZWNvZGVkID4gMSkKLSAgICAgICAgcmV0dXJuIEhBTlRST19PSzsKLQotICAgIGgyNjRic2RXcml0ZU1hY3JvYmxvY2soaW1hZ2UsIGRhdGEpOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkR2V0TmVpZ2hib3VyUGVscwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgR2V0IHBpeGVsIHZhbHVlcyBmcm9tIG5laWdoYm91cmluZyBtYWNyb2Jsb2NrcyBpbnRvICdhYm92ZScKLSAgICAgICAgICBhbmQgJ2xlZnQnIGFycmF5cy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkR2V0TmVpZ2hib3VyUGVscyhpbWFnZV90ICppbWFnZSwgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIG1iTnVtKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotICAgIHUzMiB3aWR0aCwgcGljU2l6ZTsKLSAgICB1OCAqcHRyLCAqdG1wOwotICAgIHUzMiByb3csIGNvbDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGltYWdlKTsKLSAgICBBU1NFUlQoYWJvdmUpOwotICAgIEFTU0VSVChsZWZ0KTsKLSAgICBBU1NFUlQobWJOdW0gPCBpbWFnZS0+d2lkdGggKiBpbWFnZS0+aGVpZ2h0KTsKLQotICAgIGlmICghbWJOdW0pCi0gICAgICAgIHJldHVybjsKLQotICAgIHdpZHRoID0gaW1hZ2UtPndpZHRoOwotICAgIHBpY1NpemUgPSB3aWR0aCAqIGltYWdlLT5oZWlnaHQ7Ci0gICAgcm93ID0gbWJOdW0gLyB3aWR0aDsKLSAgICBjb2wgPSBtYk51bSAtIHJvdyAqIHdpZHRoOwotCi0gICAgd2lkdGggKj0gMTY7Ci0gICAgcHRyID0gaW1hZ2UtPmRhdGEgKyByb3cgKiAxNiAqIHdpZHRoICArIGNvbCAqIDE2OwotCi0gICAgLyogbm90ZSB0aGF0IGx1bWEgc2FtcGxlcyBhYm92ZS1yaWdodCB0byBjdXJyZW50IG1hY3JvYmxvY2sgZG8gbm90IG1ha2UKLSAgICAgKiBzZW5zZSB3aGVuIGN1cnJlbnQgbWIgaXMgdGhlIHJpZ2h0LW1vc3QgbWIgaW4gYSByb3cuIFNhbWUgYXBwbGllcyB0bwotICAgICAqIHNhbXBsZSBhYm92ZS1sZWZ0IGlmIGNvbCBpcyB6ZXJvLiBIb3dldmVyLCB1c2FnZSBvZiBwZWxzIGluIHByZWRpY3Rpb24KLSAgICAgKiBpcyBjb250cm9sbGVkIGJ5IG5laWdoYm91ciBhdmFpbGFiaWxpdHkgaW5mb3JtYXRpb24gaW4gYWN0dWFsIHByZWRpY3Rpb24KLSAgICAgKiBwcm9jZXNzICovCi0gICAgaWYgKHJvdykKLSAgICB7Ci0gICAgICAgIHRtcCA9IHB0ciAtICh3aWR0aCArIDEpOwotICAgICAgICBmb3IgKGkgPSAyMTsgaS0tOykKLSAgICAgICAgICAgICphYm92ZSsrID0gKnRtcCsrOwotICAgIH0KLQotICAgIGlmIChjb2wpCi0gICAgewotICAgICAgICBwdHItLTsKLSAgICAgICAgZm9yIChpID0gMTY7IGktLTsgcHRyKz13aWR0aCkKLSAgICAgICAgICAgICpsZWZ0KysgPSAqcHRyOwotICAgIH0KLQotICAgIHdpZHRoID4+PSAxOwotICAgIHB0ciA9IGltYWdlLT5kYXRhICsgcGljU2l6ZSAqIDI1NiArIHJvdyAqIDggKiB3aWR0aCAgKyBjb2wgKiA4OwotCi0gICAgaWYgKHJvdykKLSAgICB7Ci0gICAgICAgIHRtcCA9IHB0ciAtICh3aWR0aCArIDEpOwotICAgICAgICBmb3IgKGkgPSA5OyBpLS07KQotICAgICAgICAgICAgKmFib3ZlKysgPSAqdG1wKys7Ci0gICAgICAgIHRtcCArPSAocGljU2l6ZSAqIDY0KSAtIDk7Ci0gICAgICAgIGZvciAoaSA9IDk7IGktLTspCi0gICAgICAgICAgICAqYWJvdmUrKyA9ICp0bXArKzsKLSAgICB9Ci0KLSAgICBpZiAoY29sKQotICAgIHsKLSAgICAgICAgcHRyLS07Ci0gICAgICAgIGZvciAoaSA9IDg7IGktLTsgcHRyKz13aWR0aCkKLSAgICAgICAgICAgICpsZWZ0KysgPSAqcHRyOwotICAgICAgICBwdHIgKz0gKHBpY1NpemUgKiA2NCkgLSA4ICogd2lkdGg7Ci0gICAgICAgIGZvciAoaSA9IDg7IGktLTsgcHRyKz13aWR0aCkKLSAgICAgICAgICAgICpsZWZ0KysgPSAqcHRyOwotICAgIH0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBJbnRyYTE2eDE2UHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBpbnRyYSAxNngxNiBwcmVkaWN0aW9uIG1vZGUgZm9yIGx1bWEgcGl4ZWxzIGFuZCBhZGQKLSAgICAgICAgICByZXNpZHVhbCBpbnRvIHByZWRpY3Rpb24uIFRoZSByZXN1bHRpbmcgbHVtYSBwaXhlbHMgYXJlCi0gICAgICAgICAgc3RvcmVkIGluIG1hY3JvYmxvY2sgYXJyYXkgJ2RhdGEnLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZEludHJhMTZ4MTZQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLCBpMzIgcmVzaWR1YWxbXVsxNl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICphYm92ZSwgdTggKmxlZnQsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLSAgICB1MzIgYXZhaWxhYmxlQSwgYXZhaWxhYmxlQiwgYXZhaWxhYmxlRDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChyZXNpZHVhbCk7Ci0gICAgQVNTRVJUKGFib3ZlKTsKLSAgICBBU1NFUlQobGVmdCk7Ci0gICAgQVNTRVJUKGgyNjRic2RQcmVkTW9kZUludHJhMTZ4MTYocE1iLT5tYlR5cGUpIDwgNCk7Ci0KLSAgICBhdmFpbGFibGVBID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkEpOwotICAgIGlmIChhdmFpbGFibGVBICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCi0gICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iQS0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQotICAgICAgICBhdmFpbGFibGVBID0gSEFOVFJPX0ZBTFNFOwotICAgIGF2YWlsYWJsZUIgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iQik7Ci0gICAgaWYgKGF2YWlsYWJsZUIgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKLSAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJCLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCi0gICAgICAgIGF2YWlsYWJsZUIgPSBIQU5UUk9fRkFMU0U7Ci0gICAgYXZhaWxhYmxlRCA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJEKTsKLSAgICBpZiAoYXZhaWxhYmxlRCAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgotICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkQtPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKLSAgICAgICAgYXZhaWxhYmxlRCA9IEhBTlRST19GQUxTRTsKLQotICAgIHN3aXRjaChoMjY0YnNkUHJlZE1vZGVJbnRyYTE2eDE2KHBNYi0+bWJUeXBlKSkKLSAgICB7Ci0gICAgICAgIGNhc2UgMDogLyogSW50cmFfMTZ4MTZfVmVydGljYWwgKi8KLSAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQikKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICBJbnRyYTE2eDE2VmVydGljYWxQcmVkaWN0aW9uKGRhdGEsIGFib3ZlKzEpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxOiAvKiBJbnRyYV8xNngxNl9Ib3Jpem9udGFsICovCi0gICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUEpCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgSW50cmExNngxNkhvcml6b250YWxQcmVkaWN0aW9uKGRhdGEsIGxlZnQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyOiAvKiBJbnRyYV8xNngxNl9EQyAqLwotICAgICAgICAgICAgSW50cmExNngxNkRjUHJlZGljdGlvbihkYXRhLCBhYm92ZSsxLCBsZWZ0LCBhdmFpbGFibGVBLCBhdmFpbGFibGVCKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6IC8qIGNhc2UgMzogSW50cmFfMTZ4MTZfUGxhbmUgKi8KLSAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQSB8fCAhYXZhaWxhYmxlQiB8fCAhYXZhaWxhYmxlRCkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICBJbnRyYTE2eDE2UGxhbmVQcmVkaWN0aW9uKGRhdGEsIGFib3ZlKzEsIGxlZnQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIC8qIGFkZCByZXNpZHVhbCAqLwotICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgICAgICBoMjY0YnNkQWRkUmVzaWR1YWwoZGF0YSwgcmVzaWR1YWxbaV0sIGkpOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBJbnRyYTR4NFByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgNHg0IHByZWRpY3Rpb24gZm9yIGx1bWEgcGl4ZWxzIGFuZCBhZGQgcmVzaWR1YWwKLSAgICAgICAgICBpbnRvIHByZWRpY3Rpb24uIFRoZSByZXN1bHRpbmcgbHVtYSBwaXhlbHMgYXJlIHN0b3JlZCBpbgotICAgICAgICAgIG1hY3JvYmxvY2sgYXJyYXkgJ2RhdGEnLiBUaGUgaW50cmEgNHg0IHByZWRpY3Rpb24gbW9kZSBmb3IgZWFjaAotICAgICAgICAgIGJsb2NrIGlzIHN0b3JlZCBpbiAncE1iJyBzdHJ1Y3R1cmUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkSW50cmE0eDRQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja0xheWVyX3QgKm1iTGF5ZXIsIHU4ICphYm92ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpsZWZ0LCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGJsb2NrOwotICAgIHUzMiBtb2RlOwotICAgIG5laWdoYm91cl90IG5laWdoYm91ciwgbmVpZ2hib3VyQjsKLSAgICBtYlN0b3JhZ2VfdCAqbk1iLCAqbk1iMjsKLSAgICB1OCBhWzEgKyA0ICsgNF0sIGxbMSArIDRdOwotICAgIHUzMiBkYXRhNHg0WzRdOwotICAgIHUzMiBhdmFpbGFibGVBLCBhdmFpbGFibGVCLCBhdmFpbGFibGVDLCBhdmFpbGFibGVEOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKG1iTGF5ZXIpOwotICAgIEFTU0VSVChhYm92ZSk7Ci0gICAgQVNTRVJUKGxlZnQpOwotCi0gICAgZm9yIChibG9jayA9IDA7IGJsb2NrIDwgMTY7IGJsb2NrKyspCi0gICAgewotCi0gICAgICAgIEFTU0VSVChwTWItPmludHJhNHg0UHJlZE1vZGVbYmxvY2tdIDwgOSk7Ci0KLSAgICAgICAgbmVpZ2hib3VyID0gKmgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0EoYmxvY2spOwotICAgICAgICBuTWIgPSBoMjY0YnNkR2V0TmVpZ2hib3VyTWIocE1iLCBuZWlnaGJvdXIubWIpOwotICAgICAgICBhdmFpbGFibGVBID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgbk1iKTsKLSAgICAgICAgaWYgKGF2YWlsYWJsZUEgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKLSAgICAgICAgICAgKCBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobk1iLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhdmFpbGFibGVBID0gSEFOVFJPX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgbmVpZ2hib3VyQiA9ICpoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tCKGJsb2NrKTsKLSAgICAgICAgbk1iMiA9IGgyNjRic2RHZXROZWlnaGJvdXJNYihwTWIsIG5laWdoYm91ckIubWIpOwotICAgICAgICBhdmFpbGFibGVCID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgbk1iMik7Ci0gICAgICAgIGlmIChhdmFpbGFibGVCICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCi0gICAgICAgICAgICggaDI2NGJzZE1iUGFydFByZWRNb2RlKG5NYjItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGF2YWlsYWJsZUIgPSBIQU5UUk9fRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBtb2RlID0gRGV0ZXJtaW5lSW50cmE0eDRQcmVkTW9kZShtYkxheWVyLAotICAgICAgICAgICAgKHUzMikoYXZhaWxhYmxlQSAmJiBhdmFpbGFibGVCKSwKLSAgICAgICAgICAgICZuZWlnaGJvdXIsICZuZWlnaGJvdXJCLCBibG9jaywgbk1iLCBuTWIyKTsKLSAgICAgICAgcE1iLT5pbnRyYTR4NFByZWRNb2RlW2Jsb2NrXSA9ICh1OCltb2RlOwotCi0gICAgICAgIG5laWdoYm91ciA9ICpoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tDKGJsb2NrKTsKLSAgICAgICAgbk1iID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbmVpZ2hib3VyLm1iKTsKLSAgICAgICAgYXZhaWxhYmxlQyA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIG5NYik7Ci0gICAgICAgIGlmIChhdmFpbGFibGVDICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCi0gICAgICAgICAgICggaDI2NGJzZE1iUGFydFByZWRNb2RlKG5NYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpICkKLSAgICAgICAgewotICAgICAgICAgICAgYXZhaWxhYmxlQyA9IEhBTlRST19GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIG5laWdoYm91ciA9ICpoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tEKGJsb2NrKTsKLSAgICAgICAgbk1iID0gaDI2NGJzZEdldE5laWdoYm91ck1iKHBNYiwgbmVpZ2hib3VyLm1iKTsKLSAgICAgICAgYXZhaWxhYmxlRCA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIG5NYik7Ci0gICAgICAgIGlmIChhdmFpbGFibGVEICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCi0gICAgICAgICAgICggaDI2NGJzZE1iUGFydFByZWRNb2RlKG5NYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpICkKLSAgICAgICAgewotICAgICAgICAgICAgYXZhaWxhYmxlRCA9IEhBTlRST19GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIEdldDR4NE5laWdoYm91clBlbHMoYSwgbCwgZGF0YSwgYWJvdmUsIGxlZnQsIGJsb2NrKTsKLQotICAgICAgICBzd2l0Y2gobW9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAwOiAvKiBJbnRyYV80eDRfVmVydGljYWwgKi8KLSAgICAgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUIpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICBJbnRyYTR4NFZlcnRpY2FsUHJlZGljdGlvbigodTgqKWRhdGE0eDQsIGEgKyAxKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTogLyogSW50cmFfNHg0X0hvcml6b250YWwgKi8KLSAgICAgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUEpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICBJbnRyYTR4NEhvcml6b250YWxQcmVkaWN0aW9uKCh1OCopZGF0YTR4NCwgbCArIDEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyOiAvKiBJbnRyYV80eDRfREMgKi8KLSAgICAgICAgICAgICAgICBJbnRyYTR4NERjUHJlZGljdGlvbigodTgqKWRhdGE0eDQsIGEgKyAxLCBsICsgMSwKLSAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlQSwgYXZhaWxhYmxlQik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDM6IC8qIEludHJhXzR4NF9EaWFnb25hbF9Eb3duX0xlZnQgKi8KLSAgICAgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUIpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhWzVdID0gYVs2XSA9IGFbN10gPSBhWzhdID0gYVs0XTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSW50cmE0eDREaWFnb25hbERvd25MZWZ0UHJlZGljdGlvbigodTgqKWRhdGE0eDQsIGEgKyAxKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNDogLyogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fUmlnaHQgKi8KLSAgICAgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUEgfHwgIWF2YWlsYWJsZUIgfHwgIWF2YWlsYWJsZUQpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICBJbnRyYTR4NERpYWdvbmFsRG93blJpZ2h0UHJlZGljdGlvbigodTgqKWRhdGE0eDQsIGEgKyAxLCBsICsgMSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDU6IC8qIEludHJhXzR4NF9WZXJ0aWNhbF9SaWdodCAqLwotICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQSB8fCAhYXZhaWxhYmxlQiB8fCAhYXZhaWxhYmxlRCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIEludHJhNHg0VmVydGljYWxSaWdodFByZWRpY3Rpb24oKHU4KilkYXRhNHg0LCBhICsgMSwgbCArIDEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA2OiAvKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9Eb3duICovCi0gICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVBIHx8ICFhdmFpbGFibGVCIHx8ICFhdmFpbGFibGVEKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgSW50cmE0eDRIb3Jpem9udGFsRG93blByZWRpY3Rpb24oKHU4KilkYXRhNHg0LCBhICsgMSwgbCArIDEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA3OiAvKiBJbnRyYV80eDRfVmVydGljYWxfTGVmdCAqLwotICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFbNV0gPSBhWzZdID0gYVs3XSA9IGFbOF0gPSBhWzRdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJbnRyYTR4NFZlcnRpY2FsTGVmdFByZWRpY3Rpb24oKHU4KilkYXRhNHg0LCBhICsgMSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OiAvKiBjYXNlIDggSW50cmFfNHg0X0hvcml6b250YWxfVXAgKi8KLSAgICAgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUEpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICBJbnRyYTR4NEhvcml6b250YWxVcFByZWRpY3Rpb24oKHU4KilkYXRhNHg0LCBsICsgMSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBXcml0ZTR4NFRvMTZ4MTYoZGF0YSwgKHU4KilkYXRhNHg0LCBibG9jayk7Ci0gICAgICAgIGgyNjRic2RBZGRSZXNpZHVhbChkYXRhLCBtYkxheWVyLT5yZXNpZHVhbC5sZXZlbFtibG9ja10sIGJsb2NrKTsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEludHJhQ2hyb21hUHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBpbnRyYSBwcmVkaWN0aW9uIGZvciBjaHJvbWEgcGl4ZWxzIGFuZCBhZGQgcmVzaWR1YWwKLSAgICAgICAgICBpbnRvIHByZWRpY3Rpb24uIFRoZSByZXN1bHRpbmcgY2hyb21hIHBpeGVscyBhcmUgc3RvcmVkIGluICdkYXRhJy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RJbnRyYUNocm9tYVByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIGkzMiByZXNpZHVhbFtdWzE2XSwKLSAgICAgICAgICAgICAgICAgICAgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIHByZWRNb2RlLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksIGNvbXAsIGJsb2NrOwotICAgIHUzMiBhdmFpbGFibGVBLCBhdmFpbGFibGVCLCBhdmFpbGFibGVEOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKHJlc2lkdWFsKTsKLSAgICBBU1NFUlQoYWJvdmUpOwotICAgIEFTU0VSVChsZWZ0KTsKLSAgICBBU1NFUlQocHJlZE1vZGUgPCA0KTsKLQotICAgIGF2YWlsYWJsZUEgPSBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iQSk7Ci0gICAgaWYgKGF2YWlsYWJsZUEgJiYgY29uc3RyYWluZWRJbnRyYVByZWQgJiYKLSAgICAgICAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJBLT5tYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUikpCi0gICAgICAgIGF2YWlsYWJsZUEgPSBIQU5UUk9fRkFMU0U7Ci0gICAgYXZhaWxhYmxlQiA9IGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJCKTsKLSAgICBpZiAoYXZhaWxhYmxlQiAmJiBjb25zdHJhaW5lZEludHJhUHJlZCAmJgotICAgICAgIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUocE1iLT5tYkItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVEVSKSkKLSAgICAgICAgYXZhaWxhYmxlQiA9IEhBTlRST19GQUxTRTsKLSAgICBhdmFpbGFibGVEID0gaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkQpOwotICAgIGlmIChhdmFpbGFibGVEICYmIGNvbnN0cmFpbmVkSW50cmFQcmVkICYmCi0gICAgICAgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iRC0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpKQotICAgICAgICBhdmFpbGFibGVEID0gSEFOVFJPX0ZBTFNFOwotCi0gICAgZm9yIChjb21wID0gMCwgYmxvY2sgPSAxNjsgY29tcCA8IDI7IGNvbXArKykKLSAgICB7Ci0gICAgICAgIHN3aXRjaChwcmVkTW9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAwOiAvKiBJbnRyYV9DaHJvbWFfREMgKi8KLSAgICAgICAgICAgICAgICBJbnRyYUNocm9tYURjUHJlZGljdGlvbihkYXRhLCBhYm92ZSsxLCBsZWZ0LCBhdmFpbGFibGVBLAotICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVCKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxOiAvKiBJbnRyYV9DaHJvbWFfSG9yaXpvbnRhbCAqLwotICAgICAgICAgICAgICAgIGlmICghYXZhaWxhYmxlQSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIEludHJhQ2hyb21hSG9yaXpvbnRhbFByZWRpY3Rpb24oZGF0YSwgbGVmdCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjogLyogSW50cmFfQ2hyb21hX1ZlcnRpY2FsICovCi0gICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVCKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgSW50cmFDaHJvbWFWZXJ0aWNhbFByZWRpY3Rpb24oZGF0YSwgYWJvdmUrMSk7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDogLyogY2FzZSAzOiBJbnRyYV9DaHJvbWFfUGxhbmUgKi8KLSAgICAgICAgICAgICAgICBpZiAoIWF2YWlsYWJsZUEgfHwgIWF2YWlsYWJsZUIgfHwgIWF2YWlsYWJsZUQpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICBJbnRyYUNocm9tYVBsYW5lUHJlZGljdGlvbihkYXRhLCBhYm92ZSsxLCBsZWZ0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrLCBibG9jaysrKQotICAgICAgICAgICAgaDI2NGJzZEFkZFJlc2lkdWFsKGRhdGEsIHJlc2lkdWFsW2ldLCBibG9jayk7Ci0KLSAgICAgICAgLyogYWR2YW5jZSBwb2ludGVycyAqLwotICAgICAgICBkYXRhICs9IDY0OwotICAgICAgICBhYm92ZSArPSA5OwotICAgICAgICBsZWZ0ICs9IDg7Ci0gICAgICAgIHJlc2lkdWFsICs9IDQ7Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkQWRkUmVzaWR1YWwKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIEFkZCByZXNpZHVhbCBvZiBhIGJsb2NrIGludG8gcHJlZGljdGlvbiBpbiBtYWNyb2Jsb2NrIGFycmF5ICdkYXRhJy4KLSAgICAgICAgICBUaGUgcmVzdWx0IChyZXNpZHVhbCArIHByZWRpY3Rpb24pIGlzIHN0b3JlZCBpbiAnZGF0YScuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZuZGVmIEgyNjRERUNfT01YREwKLXZvaWQgaDI2NGJzZEFkZFJlc2lkdWFsKHU4ICpkYXRhLCBpMzIgKnJlc2lkdWFsLCB1MzIgYmxvY2tOdW0pCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0gICAgdTMyIHgsIHk7Ci0gICAgdTMyIHdpZHRoOwotICAgIGkzMiB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OwotICAgIHU4ICp0bXA7Ci0gICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKHJlc2lkdWFsKTsKLSAgICBBU1NFUlQoYmxvY2tOdW0gPCAxNiArIDQgKyA0KTsKLQotICAgIGlmIChJU19SRVNJRFVBTF9FTVBUWShyZXNpZHVhbCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFJBTkdFX0NIRUNLX0FSUkFZKHJlc2lkdWFsLCAtNTEyLCA1MTEsIDE2KTsKLQotICAgIGlmIChibG9ja051bSA8IDE2KQotICAgIHsKLSAgICAgICAgd2lkdGggPSAxNjsKLSAgICAgICAgeCA9IGgyNjRic2RCbG9ja1hbYmxvY2tOdW1dOwotICAgICAgICB5ID0gaDI2NGJzZEJsb2NrWVtibG9ja051bV07Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHdpZHRoID0gODsKLSAgICAgICAgeCA9IGgyNjRic2RCbG9ja1hbYmxvY2tOdW0gJiAweDNdOwotICAgICAgICB5ID0gaDI2NGJzZEJsb2NrWVtibG9ja051bSAmIDB4M107Ci0gICAgfQotCi0gICAgdG1wID0gZGF0YSArIHkqd2lkdGggKyB4OwotICAgIGZvciAoaSA9IDQ7IGk7IGktLSkKLSAgICB7Ci0gICAgICAgIHRtcDEgPSAqcmVzaWR1YWwrKzsKLSAgICAgICAgdG1wMiA9IHRtcFswXTsKLSAgICAgICAgdG1wMyA9ICpyZXNpZHVhbCsrOwotICAgICAgICB0bXA0ID0gdG1wWzFdOwotCi0gICAgICAgIHRtcFswXSA9IGNscFt0bXAxICsgdG1wMl07Ci0KLSAgICAgICAgdG1wMSA9ICpyZXNpZHVhbCsrOwotICAgICAgICB0bXAyID0gdG1wWzJdOwotCi0gICAgICAgIHRtcFsxXSA9IGNscFt0bXAzICsgdG1wNF07Ci0KLSAgICAgICAgdG1wMyA9ICpyZXNpZHVhbCsrOwotICAgICAgICB0bXA0ID0gdG1wWzNdOwotCi0gICAgICAgIHRtcDEgPSBjbHBbdG1wMSArIHRtcDJdOwotICAgICAgICB0bXAzID0gY2xwW3RtcDMgKyB0bXA0XTsKLSAgICAgICAgdG1wWzJdID0gKHU4KXRtcDE7Ci0gICAgICAgIHRtcFszXSA9ICh1OCl0bXAzOwotCi0gICAgICAgIHRtcCArPSB3aWR0aDsKLSAgICB9Ci0KLX0KLSNlbmRpZgotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBJbnRyYTE2eDE2VmVydGljYWxQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGludHJhIDE2eDE2IHZlcnRpY2FsIHByZWRpY3Rpb24gbW9kZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBJbnRyYTE2eDE2VmVydGljYWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksIGo7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoYWJvdmUpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgewotICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgKmRhdGErKyA9IGFib3ZlW2pdOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSW50cmExNngxNkhvcml6b250YWxQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGludHJhIDE2eDE2IGhvcml6b250YWwgcHJlZGljdGlvbiBtb2RlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIEludHJhMTZ4MTZIb3Jpem9udGFsUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmxlZnQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksIGo7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQobGVmdCk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICAqZGF0YSsrID0gbGVmdFtpXTsKLSAgICAgICAgfQotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEludHJhMTZ4MTZEY1ByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgMTZ4MTYgREMgcHJlZGljdGlvbiBtb2RlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIEludHJhMTZ4MTZEY1ByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQsIHUzMiBhdmFpbGFibGVBLAotICAgIHUzMiBhdmFpbGFibGVCKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLCB0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoYWJvdmUpOwotICAgIEFTU0VSVChsZWZ0KTsKLQotICAgIGlmIChhdmFpbGFibGVBICYmIGF2YWlsYWJsZUIpCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwLCB0bXAgPSAwOyBpIDwgMTY7IGkrKykKLSAgICAgICAgICAgIHRtcCArPSBhYm92ZVtpXSArIGxlZnRbaV07Ci0gICAgICAgIHRtcCA9ICh0bXAgKyAxNikgPj4gNTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYXZhaWxhYmxlQSkKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDAsIHRtcCA9IDA7IGkgPCAxNjsgaSsrKQotICAgICAgICAgICAgdG1wICs9IGxlZnRbaV07Ci0gICAgICAgIHRtcCA9ICh0bXAgKyA4KSA+PiA0OwotICAgIH0KLSAgICBlbHNlIGlmIChhdmFpbGFibGVCKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMCwgdG1wID0gMDsgaSA8IDE2OyBpKyspCi0gICAgICAgICAgICB0bXAgKz0gYWJvdmVbaV07Ci0gICAgICAgIHRtcCA9ICh0bXAgKyA4KSA+PiA0OwotICAgIH0KLSAgICAvKiBuZWl0aGVyIEEgbm9yIEIgYXZhaWxhYmxlICovCi0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdG1wID0gMTI4OwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0gICAgICAgIGRhdGFbaV0gPSAodTgpdG1wOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSW50cmExNngxNlBsYW5lUHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBpbnRyYSAxNngxNiBwbGFuZSBwcmVkaWN0aW9uIG1vZGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgSW50cmExNngxNlBsYW5lUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICBpMzIgaSwgajsKLSAgICBpMzIgYSwgYiwgYzsKLSAgICBpMzIgdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGFib3ZlKTsKLSAgICBBU1NFUlQobGVmdCk7Ci0KLSAgICBhID0gMTYgKiAoYWJvdmVbMTVdICsgbGVmdFsxNV0pOwotCi0gICAgZm9yIChpID0gMCwgYiA9IDA7IGkgPCA4OyBpKyspCi0gICAgICAgIGIgKz0gKGkgKyAxKSAqIChhYm92ZVs4K2ldIC0gYWJvdmVbNi1pXSk7Ci0gICAgYiA9ICg1ICogYiArIDMyKSA+PiA2OwotCi0gICAgZm9yIChpID0gMCwgYyA9IDA7IGkgPCA3OyBpKyspCi0gICAgICAgIGMgKz0gKGkgKyAxKSAqIChsZWZ0WzgraV0gLSBsZWZ0WzYtaV0pOwotICAgIC8qIHBbLTEsLTFdIGhhcyB0byBiZSBhY2Nlc3NlZCB0aHJvdWdoIGFib3ZlIHBvaW50ZXIgKi8KLSAgICBjICs9IChpICsgMSkgKiAobGVmdFs4K2ldIC0gYWJvdmVbLTFdKTsKLSAgICBjID0gKDUgKiBjICsgMzIpID4+IDY7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSAoYSArIGIgKiAoaiAtIDcpICsgYyAqIChpIC0gNykgKyAxNikgPj4gNTsKLSAgICAgICAgICAgIGRhdGFbaSoxNitqXSA9ICh1OClDTElQMSh0bXApOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSW50cmFDaHJvbWFEY1ByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgY2hyb21hIERDIHByZWRpY3Rpb24gbW9kZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBJbnRyYUNocm9tYURjUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIGF2YWlsYWJsZUEsCi0gICAgdTMyIGF2YWlsYWJsZUIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0gICAgdTMyIHRtcDEsIHRtcDI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoYWJvdmUpOwotICAgIEFTU0VSVChsZWZ0KTsKLQotICAgIC8qIHkgPSAwLi4zICovCi0gICAgaWYgKGF2YWlsYWJsZUEgJiYgYXZhaWxhYmxlQikKLSAgICB7Ci0gICAgICAgIHRtcDEgPSBhYm92ZVswXSArIGFib3ZlWzFdICsgYWJvdmVbMl0gKyBhYm92ZVszXSArCi0gICAgICAgICAgICAgIGxlZnRbMF0gKyBsZWZ0WzFdICsgbGVmdFsyXSArIGxlZnRbM107Ci0gICAgICAgIHRtcDEgPSAodG1wMSArIDQpID4+IDM7Ci0gICAgICAgIHRtcDIgPSAoYWJvdmVbNF0gKyBhYm92ZVs1XSArIGFib3ZlWzZdICsgYWJvdmVbN10gKyAyKSA+PiAyOwotICAgIH0KLSAgICBlbHNlIGlmIChhdmFpbGFibGVCKQotICAgIHsKLSAgICAgICAgdG1wMSA9IChhYm92ZVswXSArIGFib3ZlWzFdICsgYWJvdmVbMl0gKyBhYm92ZVszXSArIDIpID4+IDI7Ci0gICAgICAgIHRtcDIgPSAoYWJvdmVbNF0gKyBhYm92ZVs1XSArIGFib3ZlWzZdICsgYWJvdmVbN10gKyAyKSA+PiAyOwotICAgIH0KLSAgICBlbHNlIGlmIChhdmFpbGFibGVBKQotICAgIHsKLSAgICAgICAgdG1wMSA9IChsZWZ0WzBdICsgbGVmdFsxXSArIGxlZnRbMl0gKyBsZWZ0WzNdICsgMikgPj4gMjsKLSAgICAgICAgdG1wMiA9IHRtcDE7Ci0gICAgfQotICAgIC8qIG5laXRoZXIgQSBub3IgQiBhdmFpbGFibGUgKi8KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0bXAxID0gdG1wMiA9IDEyODsKLSAgICB9Ci0KLSAgICBBU1NFUlQodG1wMSA8IDI1NiAmJiB0bXAyIDwgMjU2KTsKLSAgICBmb3IgKGkgPSA0OyBpLS07KQotICAgIHsKLSAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAxOwotICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDE7Ci0gICAgICAgICpkYXRhKysgPSAodTgpdG1wMTsKLSAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAxOwotICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDI7Ci0gICAgICAgICpkYXRhKysgPSAodTgpdG1wMjsKLSAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAyOwotICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDI7Ci0gICAgfQotCi0gICAgLyogeSA9IDQuLi43ICovCi0gICAgaWYgKGF2YWlsYWJsZUEpCi0gICAgewotICAgICAgICB0bXAxID0gKGxlZnRbNF0gKyBsZWZ0WzVdICsgbGVmdFs2XSArIGxlZnRbN10gKyAyKSA+PiAyOwotICAgICAgICBpZiAoYXZhaWxhYmxlQikKLSAgICAgICAgewotICAgICAgICAgICAgdG1wMiA9IGFib3ZlWzRdICsgYWJvdmVbNV0gKyBhYm92ZVs2XSArIGFib3ZlWzddICsKLSAgICAgICAgICAgICAgICAgICBsZWZ0WzRdICsgbGVmdFs1XSArIGxlZnRbNl0gKyBsZWZ0WzddOwotICAgICAgICAgICAgdG1wMiA9ICh0bXAyICsgNCkgPj4gMzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICB0bXAyID0gdG1wMTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYXZhaWxhYmxlQikKLSAgICB7Ci0gICAgICAgIHRtcDEgPSAoYWJvdmVbMF0gKyBhYm92ZVsxXSArIGFib3ZlWzJdICsgYWJvdmVbM10gKyAyKSA+PiAyOwotICAgICAgICB0bXAyID0gKGFib3ZlWzRdICsgYWJvdmVbNV0gKyBhYm92ZVs2XSArIGFib3ZlWzddICsgMikgPj4gMjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdG1wMSA9IHRtcDIgPSAxMjg7Ci0gICAgfQotCi0gICAgQVNTRVJUKHRtcDEgPCAyNTYgJiYgdG1wMiA8IDI1Nik7Ci0gICAgZm9yIChpID0gNDsgaS0tOykKLSAgICB7Ci0gICAgICAgICpkYXRhKysgPSAodTgpdG1wMTsKLSAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAxOwotICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDE7Ci0gICAgICAgICpkYXRhKysgPSAodTgpdG1wMTsKLSAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAyOwotICAgICAgICAqZGF0YSsrID0gKHU4KXRtcDI7Ci0gICAgICAgICpkYXRhKysgPSAodTgpdG1wMjsKLSAgICAgICAgKmRhdGErKyA9ICh1OCl0bXAyOwotICAgIH0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBJbnRyYUNocm9tYUhvcml6b250YWxQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGludHJhIGNocm9tYSBob3Jpem9udGFsIHByZWRpY3Rpb24gbW9kZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBJbnRyYUNocm9tYUhvcml6b250YWxQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqbGVmdCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChsZWZ0KTsKLQotICAgIGZvciAoaSA9IDg7IGktLTspCi0gICAgewotICAgICAgICAqZGF0YSsrID0gKmxlZnQ7Ci0gICAgICAgICpkYXRhKysgPSAqbGVmdDsKLSAgICAgICAgKmRhdGErKyA9ICpsZWZ0OwotICAgICAgICAqZGF0YSsrID0gKmxlZnQ7Ci0gICAgICAgICpkYXRhKysgPSAqbGVmdDsKLSAgICAgICAgKmRhdGErKyA9ICpsZWZ0OwotICAgICAgICAqZGF0YSsrID0gKmxlZnQ7Ci0gICAgICAgICpkYXRhKysgPSAqbGVmdCsrOwotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEludHJhQ2hyb21hVmVydGljYWxQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGludHJhIGNocm9tYSB2ZXJ0aWNhbCBwcmVkaWN0aW9uIG1vZGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgSW50cmFDaHJvbWFWZXJ0aWNhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChhYm92ZSk7Ci0KLSAgICBmb3IgKGkgPSA4OyBpLS07ZGF0YSsrLyphYm92ZS09OCovKQotICAgIHsKLSAgICAgICAgZGF0YVswXSA9ICphYm92ZTsKLSAgICAgICAgZGF0YVs4XSA9ICphYm92ZTsKLSAgICAgICAgZGF0YVsxNl0gPSAqYWJvdmU7Ci0gICAgICAgIGRhdGFbMjRdID0gKmFib3ZlOwotICAgICAgICBkYXRhWzMyXSA9ICphYm92ZTsKLSAgICAgICAgZGF0YVs0MF0gPSAqYWJvdmU7Ci0gICAgICAgIGRhdGFbNDhdID0gKmFib3ZlOwotICAgICAgICBkYXRhWzU2XSA9ICphYm92ZSsrOwotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEludHJhQ2hyb21hUGxhbmVQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGludHJhIGNocm9tYSBwbGFuZSBwcmVkaWN0aW9uIG1vZGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgSW50cmFDaHJvbWFQbGFuZVByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0gICAgaTMyIGEsIGIsIGM7Ci0gICAgaTMyIHRtcDsKLSAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoYWJvdmUpOwotICAgIEFTU0VSVChsZWZ0KTsKLQotICAgIGEgPSAxNiAqIChhYm92ZVs3XSArIGxlZnRbN10pOwotCi0gICAgYiA9IChhYm92ZVs0XSAtIGFib3ZlWzJdKSArIDIgKiAoYWJvdmVbNV0gLSBhYm92ZVsxXSkKLSAgICAgICAgKyAzICogKGFib3ZlWzZdIC0gYWJvdmVbMF0pICsgNCAqIChhYm92ZVs3XSAtIGFib3ZlWy0xXSk7Ci0gICAgYiA9ICgxNyAqIGIgKyAxNikgPj4gNTsKLQotICAgIC8qIHBbLTEsLTFdIGhhcyB0byBiZSBhY2Nlc3NlZCB0aHJvdWdoIGFib3ZlIHBvaW50ZXIgKi8KLSAgICBjID0gKGxlZnRbNF0gLSBsZWZ0WzJdKSArIDIgKiAobGVmdFs1XSAtIGxlZnRbMV0pCi0gICAgICAgICsgMyAqIChsZWZ0WzZdIC0gbGVmdFswXSkgKyA0ICogKGxlZnRbN10gLSBhYm92ZVstMV0pOwotICAgIGMgPSAoMTcgKiBjICsgMTYpID4+IDU7Ci0KLSAgICAvKmEgKz0gMTY7Ki8KLSAgICBhID0gYSAtIDMgKiBjICsgMTY7Ci0gICAgZm9yIChpID0gODsgaS0tOyBhICs9IGMpCi0gICAgewotICAgICAgICB0bXAgPSAoYSAtIDMgKiBiKTsKLSAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOwotICAgICAgICB0bXAgKz0gYjsKLSAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOwotICAgICAgICB0bXAgKz0gYjsKLSAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOwotICAgICAgICB0bXAgKz0gYjsKLSAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOwotICAgICAgICB0bXAgKz0gYjsKLSAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOwotICAgICAgICB0bXAgKz0gYjsKLSAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOwotICAgICAgICB0bXAgKz0gYjsKLSAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOwotICAgICAgICB0bXAgKz0gYjsKLSAgICAgICAgKmRhdGErKyA9IGNscFt0bXA+PjVdOwotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEdldDR4NE5laWdoYm91clBlbHMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIEdldCBuZWlnaGJvdXJpbmcgcGl4ZWxzIG9mIGEgNHg0IGJsb2NrIGludG8gJ2EnIGFuZCAnbCcuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgR2V0NHg0TmVpZ2hib3VyUGVscyh1OCAqYSwgdTggKmwsIHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LAotICAgIHUzMiBibG9ja051bSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgeCwgeTsKLSAgICB1OCB0MSwgdDI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChhKTsKLSAgICBBU1NFUlQobCk7Ci0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChhYm92ZSk7Ci0gICAgQVNTRVJUKGxlZnQpOwotICAgIEFTU0VSVChibG9ja051bSA8IDE2KTsKLQotICAgIHggPSBoMjY0YnNkQmxvY2tYW2Jsb2NrTnVtXTsKLSAgICB5ID0gaDI2NGJzZEJsb2NrWVtibG9ja051bV07Ci0KLSAgICAvKiBBIGFuZCBEICovCi0gICAgaWYgKHggPT0gMCkKLSAgICB7Ci0gICAgICAgIHQxID0gbGVmdFt5ICAgIF07Ci0gICAgICAgIHQyID0gbGVmdFt5ICsgMV07Ci0gICAgICAgIGxbMV0gPSB0MTsKLSAgICAgICAgbFsyXSA9IHQyOwotICAgICAgICB0MSA9IGxlZnRbeSArIDJdOwotICAgICAgICB0MiA9IGxlZnRbeSArIDNdOwotICAgICAgICBsWzNdID0gdDE7Ci0gICAgICAgIGxbNF0gPSB0MjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdDEgPSBkYXRhW3kgKiAxNiArIHggLSAxICAgICBdOwotICAgICAgICB0MiA9IGRhdGFbeSAqIDE2ICsgeCAtIDEgKyAxNl07Ci0gICAgICAgIGxbMV0gPSB0MTsKLSAgICAgICAgbFsyXSA9IHQyOwotICAgICAgICB0MSA9IGRhdGFbeSAqIDE2ICsgeCAtIDEgKyAzMl07Ci0gICAgICAgIHQyID0gZGF0YVt5ICogMTYgKyB4IC0gMSArIDQ4XTsKLSAgICAgICAgbFszXSA9IHQxOwotICAgICAgICBsWzRdID0gdDI7Ci0gICAgfQotCi0gICAgLyogQiwgQyBhbmQgRCAqLwotICAgIGlmICh5ID09IDApCi0gICAgewotICAgICAgICB0MSA9IGFib3ZlW3ggICAgXTsKLSAgICAgICAgdDIgPSBhYm92ZVt4ICAgIF07Ci0gICAgICAgIGxbMF0gPSB0MTsKLSAgICAgICAgYVswXSA9IHQyOwotICAgICAgICB0MSA9IGFib3ZlW3ggKyAxXTsKLSAgICAgICAgdDIgPSBhYm92ZVt4ICsgMl07Ci0gICAgICAgIGFbMV0gPSB0MTsKLSAgICAgICAgYVsyXSA9IHQyOwotICAgICAgICB0MSA9IGFib3ZlW3ggKyAzXTsKLSAgICAgICAgdDIgPSBhYm92ZVt4ICsgNF07Ci0gICAgICAgIGFbM10gPSB0MTsKLSAgICAgICAgYVs0XSA9IHQyOwotICAgICAgICB0MSA9IGFib3ZlW3ggKyA1XTsKLSAgICAgICAgdDIgPSBhYm92ZVt4ICsgNl07Ci0gICAgICAgIGFbNV0gPSB0MTsKLSAgICAgICAgYVs2XSA9IHQyOwotICAgICAgICB0MSA9IGFib3ZlW3ggKyA3XTsKLSAgICAgICAgdDIgPSBhYm92ZVt4ICsgOF07Ci0gICAgICAgIGFbN10gPSB0MTsKLSAgICAgICAgYVs4XSA9IHQyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0MSA9IGRhdGFbKHkgLSAxKSAqIDE2ICsgeCAgICBdOwotICAgICAgICB0MiA9IGRhdGFbKHkgLSAxKSAqIDE2ICsgeCArIDFdOwotICAgICAgICBhWzFdID0gdDE7Ci0gICAgICAgIGFbMl0gPSB0MjsKLSAgICAgICAgdDEgPSBkYXRhWyh5IC0gMSkgKiAxNiArIHggKyAyXTsKLSAgICAgICAgdDIgPSBkYXRhWyh5IC0gMSkgKiAxNiArIHggKyAzXTsKLSAgICAgICAgYVszXSA9IHQxOwotICAgICAgICBhWzRdID0gdDI7Ci0gICAgICAgIHQxID0gZGF0YVsoeSAtIDEpICogMTYgKyB4ICsgNF07Ci0gICAgICAgIHQyID0gZGF0YVsoeSAtIDEpICogMTYgKyB4ICsgNV07Ci0gICAgICAgIGFbNV0gPSB0MTsKLSAgICAgICAgYVs2XSA9IHQyOwotICAgICAgICB0MSA9IGRhdGFbKHkgLSAxKSAqIDE2ICsgeCArIDZdOwotICAgICAgICB0MiA9IGRhdGFbKHkgLSAxKSAqIDE2ICsgeCArIDddOwotICAgICAgICBhWzddID0gdDE7Ci0gICAgICAgIGFbOF0gPSB0MjsKLQotICAgICAgICBpZiAoeCA9PSAwKQotICAgICAgICAgICAgbFswXSA9IGFbMF0gPSBsZWZ0W3ktMV07Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGxbMF0gPSBhWzBdID0gZGF0YVsoeSAtIDEpICogMTYgKyB4IC0gMV07Ci0gICAgfQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSW50cmE0eDRWZXJ0aWNhbFByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgNHg0IHZlcnRpY2FsIHByZWRpY3Rpb24gbW9kZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBJbnRyYTR4NFZlcnRpY2FsUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHU4IHQxLCB0MjsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChhYm92ZSk7Ci0KLSAgICB0MSA9IGFib3ZlWzBdOwotICAgIHQyID0gYWJvdmVbMV07Ci0gICAgZGF0YVswXSA9IGRhdGFbNF0gPSBkYXRhWzhdID0gZGF0YVsxMl0gPSB0MTsKLSAgICBkYXRhWzFdID0gZGF0YVs1XSA9IGRhdGFbOV0gPSBkYXRhWzEzXSA9IHQyOwotICAgIHQxID0gYWJvdmVbMl07Ci0gICAgdDIgPSBhYm92ZVszXTsKLSAgICBkYXRhWzJdID0gZGF0YVs2XSA9IGRhdGFbMTBdID0gZGF0YVsxNF0gPSB0MTsKLSAgICBkYXRhWzNdID0gZGF0YVs3XSA9IGRhdGFbMTFdID0gZGF0YVsxNV0gPSB0MjsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEludHJhNHg0SG9yaXpvbnRhbFByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgNHg0IGhvcml6b250YWwgcHJlZGljdGlvbiBtb2RlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIEludHJhNHg0SG9yaXpvbnRhbFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICpsZWZ0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHU4IHQxLCB0MjsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChsZWZ0KTsKLQotICAgIHQxID0gbGVmdFswXTsKLSAgICB0MiA9IGxlZnRbMV07Ci0gICAgZGF0YVswXSA9IGRhdGFbMV0gPSBkYXRhWzJdID0gZGF0YVszXSA9IHQxOwotICAgIGRhdGFbNF0gPSBkYXRhWzVdID0gZGF0YVs2XSA9IGRhdGFbN10gPSB0MjsKLSAgICB0MSA9IGxlZnRbMl07Ci0gICAgdDIgPSBsZWZ0WzNdOwotICAgIGRhdGFbOF0gPSBkYXRhWzldID0gZGF0YVsxMF0gPSBkYXRhWzExXSA9IHQxOwotICAgIGRhdGFbMTJdID0gZGF0YVsxM10gPSBkYXRhWzE0XSA9IGRhdGFbMTVdID0gdDI7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBJbnRyYTR4NERjUHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgREMgcHJlZGljdGlvbiBtb2RlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIEludHJhNHg0RGNQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgYXZhaWxhYmxlQSwKLSAgICB1MzIgYXZhaWxhYmxlQikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wOwotICAgIHU4IHQxLCB0MiwgdDMsIHQ0OwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGFib3ZlKTsKLSAgICBBU1NFUlQobGVmdCk7Ci0KLSAgICBpZiAoYXZhaWxhYmxlQSAmJiBhdmFpbGFibGVCKQotICAgIHsKLSAgICAgICAgdDEgPSBhYm92ZVswXTsgdDIgPSBhYm92ZVsxXTsgdDMgPSBhYm92ZVsyXTsgdDQgPSBhYm92ZVszXTsKLSAgICAgICAgdG1wID0gdDEgKyB0MiArIHQzICsgdDQ7Ci0gICAgICAgIHQxID0gbGVmdFswXTsgdDIgPSBsZWZ0WzFdOyB0MyA9IGxlZnRbMl07IHQ0ID0gbGVmdFszXTsKLSAgICAgICAgdG1wICs9IHQxICsgdDIgKyB0MyArIHQ0OwotICAgICAgICB0bXAgPSAodG1wICsgNCkgPj4gMzsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYXZhaWxhYmxlQSkKLSAgICB7Ci0gICAgICAgIHQxID0gbGVmdFswXTsgdDIgPSBsZWZ0WzFdOyB0MyA9IGxlZnRbMl07IHQ0ID0gbGVmdFszXTsKLSAgICAgICAgdG1wID0gKHQxICsgdDIgKyB0MyArIHQ0ICsgMikgPj4gMjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYXZhaWxhYmxlQikKLSAgICB7Ci0gICAgICAgIHQxID0gYWJvdmVbMF07IHQyID0gYWJvdmVbMV07IHQzID0gYWJvdmVbMl07IHQ0ID0gYWJvdmVbM107Ci0gICAgICAgIHRtcCA9ICh0MSArIHQyICsgdDMgKyB0NCArIDIpID4+IDI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHRtcCA9IDEyODsKLSAgICB9Ci0KLSAgICBBU1NFUlQodG1wIDwgMjU2KTsKLSAgICBkYXRhWzBdID0gZGF0YVsxXSA9IGRhdGFbMl0gPSBkYXRhWzNdID0KLSAgICBkYXRhWzRdID0gZGF0YVs1XSA9IGRhdGFbNl0gPSBkYXRhWzddID0KLSAgICBkYXRhWzhdID0gZGF0YVs5XSA9IGRhdGFbMTBdID0gZGF0YVsxMV0gPQotICAgIGRhdGFbMTJdID0gZGF0YVsxM10gPSBkYXRhWzE0XSA9IGRhdGFbMTVdID0gKHU4KXRtcDsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEludHJhNHg0RGlhZ29uYWxEb3duTGVmdFByZWRpY3Rpb24KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFBlcmZvcm0gaW50cmEgNHg0IGRpYWdvbmFsIGRvd24tbGVmdCBwcmVkaWN0aW9uIG1vZGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgSW50cmE0eDREaWFnb25hbERvd25MZWZ0UHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChhYm92ZSk7Ci0KLSAgICBkYXRhWyAwXSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVsxXSArIGFib3ZlWzJdICsgMikgPj4gMjsKLSAgICBkYXRhWyAxXSA9IChhYm92ZVsxXSArIDIgKiBhYm92ZVsyXSArIGFib3ZlWzNdICsgMikgPj4gMjsKLSAgICBkYXRhWyA0XSA9IChhYm92ZVsxXSArIDIgKiBhYm92ZVsyXSArIGFib3ZlWzNdICsgMikgPj4gMjsKLSAgICBkYXRhWyAyXSA9IChhYm92ZVsyXSArIDIgKiBhYm92ZVszXSArIGFib3ZlWzRdICsgMikgPj4gMjsKLSAgICBkYXRhWyA1XSA9IChhYm92ZVsyXSArIDIgKiBhYm92ZVszXSArIGFib3ZlWzRdICsgMikgPj4gMjsKLSAgICBkYXRhWyA4XSA9IChhYm92ZVsyXSArIDIgKiBhYm92ZVszXSArIGFib3ZlWzRdICsgMikgPj4gMjsKLSAgICBkYXRhWyAzXSA9IChhYm92ZVszXSArIDIgKiBhYm92ZVs0XSArIGFib3ZlWzVdICsgMikgPj4gMjsKLSAgICBkYXRhWyA2XSA9IChhYm92ZVszXSArIDIgKiBhYm92ZVs0XSArIGFib3ZlWzVdICsgMikgPj4gMjsKLSAgICBkYXRhWyA5XSA9IChhYm92ZVszXSArIDIgKiBhYm92ZVs0XSArIGFib3ZlWzVdICsgMikgPj4gMjsKLSAgICBkYXRhWzEyXSA9IChhYm92ZVszXSArIDIgKiBhYm92ZVs0XSArIGFib3ZlWzVdICsgMikgPj4gMjsKLSAgICBkYXRhWyA3XSA9IChhYm92ZVs0XSArIDIgKiBhYm92ZVs1XSArIGFib3ZlWzZdICsgMikgPj4gMjsKLSAgICBkYXRhWzEwXSA9IChhYm92ZVs0XSArIDIgKiBhYm92ZVs1XSArIGFib3ZlWzZdICsgMikgPj4gMjsKLSAgICBkYXRhWzEzXSA9IChhYm92ZVs0XSArIDIgKiBhYm92ZVs1XSArIGFib3ZlWzZdICsgMikgPj4gMjsKLSAgICBkYXRhWzExXSA9IChhYm92ZVs1XSArIDIgKiBhYm92ZVs2XSArIGFib3ZlWzddICsgMikgPj4gMjsKLSAgICBkYXRhWzE0XSA9IChhYm92ZVs1XSArIDIgKiBhYm92ZVs2XSArIGFib3ZlWzddICsgMikgPj4gMjsKLSAgICBkYXRhWzE1XSA9IChhYm92ZVs2XSArIDMgKiBhYm92ZVs3XSArIDIpID4+IDI7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBJbnRyYTR4NERpYWdvbmFsRG93blJpZ2h0UHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgZGlhZ29uYWwgZG93bi1yaWdodCBwcmVkaWN0aW9uIG1vZGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgSW50cmE0eDREaWFnb25hbERvd25SaWdodFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICphYm92ZSwgdTggKmxlZnQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGFib3ZlKTsKLSAgICBBU1NFUlQobGVmdCk7Ci0KLSAgICBkYXRhWyAwXSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVstMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKLSAgICBkYXRhWyA1XSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVstMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKLSAgICBkYXRhWzEwXSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVstMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKLSAgICBkYXRhWzE1XSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVstMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKLSAgICBkYXRhWyAxXSA9IChhYm92ZVstMV0gKyAyICogYWJvdmVbMF0gKyBhYm92ZVsxXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgNl0gPSAoYWJvdmVbLTFdICsgMiAqIGFib3ZlWzBdICsgYWJvdmVbMV0gKyAyKSA+PiAyOwotICAgIGRhdGFbMTFdID0gKGFib3ZlWy0xXSArIDIgKiBhYm92ZVswXSArIGFib3ZlWzFdICsgMikgPj4gMjsKLSAgICBkYXRhWyAyXSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVsxXSArIGFib3ZlWzJdICsgMikgPj4gMjsKLSAgICBkYXRhWyA3XSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVsxXSArIGFib3ZlWzJdICsgMikgPj4gMjsKLSAgICBkYXRhWyAzXSA9IChhYm92ZVsxXSArIDIgKiBhYm92ZVsyXSArIGFib3ZlWzNdICsgMikgPj4gMjsKLSAgICBkYXRhWyA0XSA9IChsZWZ0Wy0xXSArIDIgKiBsZWZ0WzBdICsgbGVmdFsxXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgOV0gPSAobGVmdFstMV0gKyAyICogbGVmdFswXSArIGxlZnRbMV0gKyAyKSA+PiAyOwotICAgIGRhdGFbMTRdID0gKGxlZnRbLTFdICsgMiAqIGxlZnRbMF0gKyBsZWZ0WzFdICsgMikgPj4gMjsKLSAgICBkYXRhWyA4XSA9IChsZWZ0WzBdICsgMiAqIGxlZnRbMV0gKyBsZWZ0WzJdICsgMikgPj4gMjsKLSAgICBkYXRhWzEzXSA9IChsZWZ0WzBdICsgMiAqIGxlZnRbMV0gKyBsZWZ0WzJdICsgMikgPj4gMjsKLSAgICBkYXRhWzEyXSA9IChsZWZ0WzFdICsgMiAqIGxlZnRbMl0gKyBsZWZ0WzNdICsgMikgPj4gMjsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBJbnRyYTR4NFZlcnRpY2FsUmlnaHRQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGludHJhIDR4NCB2ZXJ0aWNhbCByaWdodCBwcmVkaWN0aW9uIG1vZGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgSW50cmE0eDRWZXJ0aWNhbFJpZ2h0UHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoYWJvdmUpOwotICAgIEFTU0VSVChsZWZ0KTsKLQotICAgIGRhdGFbIDBdID0gKGFib3ZlWy0xXSArIGFib3ZlWzBdICsgMSkgPj4gMTsKLSAgICBkYXRhWyA5XSA9IChhYm92ZVstMV0gKyBhYm92ZVswXSArIDEpID4+IDE7Ci0gICAgZGF0YVsgNV0gPSAoYWJvdmVbLTFdICsgMiAqIGFib3ZlWzBdICsgYWJvdmVbMV0gKyAyKSA+PiAyOwotICAgIGRhdGFbMTRdID0gKGFib3ZlWy0xXSArIDIgKiBhYm92ZVswXSArIGFib3ZlWzFdICsgMikgPj4gMjsKLSAgICBkYXRhWyA0XSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVstMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKLSAgICBkYXRhWzEzXSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVstMV0gKyBsZWZ0WzBdICsgMikgPj4gMjsKLSAgICBkYXRhWyAxXSA9IChhYm92ZVswXSArIGFib3ZlWzFdICsgMSkgPj4gMTsKLSAgICBkYXRhWzEwXSA9IChhYm92ZVswXSArIGFib3ZlWzFdICsgMSkgPj4gMTsKLSAgICBkYXRhWyA2XSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVsxXSArIGFib3ZlWzJdICsgMikgPj4gMjsKLSAgICBkYXRhWzE1XSA9IChhYm92ZVswXSArIDIgKiBhYm92ZVsxXSArIGFib3ZlWzJdICsgMikgPj4gMjsKLSAgICBkYXRhWyAyXSA9IChhYm92ZVsxXSArIGFib3ZlWzJdICsgMSkgPj4gMTsKLSAgICBkYXRhWzExXSA9IChhYm92ZVsxXSArIGFib3ZlWzJdICsgMSkgPj4gMTsKLSAgICBkYXRhWyA3XSA9IChhYm92ZVsxXSArIDIgKiBhYm92ZVsyXSArIGFib3ZlWzNdICsgMikgPj4gMjsKLSAgICBkYXRhWyAzXSA9IChhYm92ZVsyXSArIGFib3ZlWzNdICsgMSkgPj4gMTsKLSAgICBkYXRhWyA4XSA9IChsZWZ0WzFdICsgMiAqIGxlZnRbMF0gKyBsZWZ0Wy0xXSArIDIpID4+IDI7Ci0gICAgZGF0YVsxMl0gPSAobGVmdFsyXSArIDIgKiBsZWZ0WzFdICsgbGVmdFswXSArIDIpID4+IDI7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBJbnRyYTR4NEhvcml6b250YWxEb3duUHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgaG9yaXpvbnRhbCBkb3duIHByZWRpY3Rpb24gbW9kZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBJbnRyYTR4NEhvcml6b250YWxEb3duUHJlZGljdGlvbih1OCAqZGF0YSwgdTggKmFib3ZlLCB1OCAqbGVmdCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChkYXRhKTsKLSAgICBBU1NFUlQoYWJvdmUpOwotICAgIEFTU0VSVChsZWZ0KTsKLQotICAgIGRhdGFbIDBdID0gKGxlZnRbLTFdICsgbGVmdFswXSArIDEpID4+IDE7Ci0gICAgZGF0YVsgNl0gPSAobGVmdFstMV0gKyBsZWZ0WzBdICsgMSkgPj4gMTsKLSAgICBkYXRhWyA1XSA9IChsZWZ0Wy0xXSArIDIgKiBsZWZ0WzBdICsgbGVmdFsxXSArIDIpID4+IDI7Ci0gICAgZGF0YVsxMV0gPSAobGVmdFstMV0gKyAyICogbGVmdFswXSArIGxlZnRbMV0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDRdID0gKGxlZnRbMF0gKyBsZWZ0WzFdICsgMSkgPj4gMTsKLSAgICBkYXRhWzEwXSA9IChsZWZ0WzBdICsgbGVmdFsxXSArIDEpID4+IDE7Ci0gICAgZGF0YVsgOV0gPSAobGVmdFswXSArIDIgKiBsZWZ0WzFdICsgbGVmdFsyXSArIDIpID4+IDI7Ci0gICAgZGF0YVsxNV0gPSAobGVmdFswXSArIDIgKiBsZWZ0WzFdICsgbGVmdFsyXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgOF0gPSAobGVmdFsxXSArIGxlZnRbMl0gKyAxKSA+PiAxOwotICAgIGRhdGFbMTRdID0gKGxlZnRbMV0gKyBsZWZ0WzJdICsgMSkgPj4gMTsKLSAgICBkYXRhWzEzXSA9IChsZWZ0WzFdICsgMiAqIGxlZnRbMl0gKyBsZWZ0WzNdICsgMikgPj4gMjsKLSAgICBkYXRhWzEyXSA9IChsZWZ0WzJdICsgbGVmdFszXSArIDEpID4+IDE7Ci0gICAgZGF0YVsgMV0gPSAoYWJvdmVbMF0gKyAyICogYWJvdmVbLTFdICsgbGVmdFswXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgN10gPSAoYWJvdmVbMF0gKyAyICogYWJvdmVbLTFdICsgbGVmdFswXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgMl0gPSAoYWJvdmVbMV0gKyAyICogYWJvdmVbMF0gKyBhYm92ZVstMV0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDNdID0gKGFib3ZlWzJdICsgMiAqIGFib3ZlWzFdICsgYWJvdmVbMF0gKyAyKSA+PiAyOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEludHJhNHg0VmVydGljYWxMZWZ0UHJlZGljdGlvbgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGVyZm9ybSBpbnRyYSA0eDQgdmVydGljYWwgbGVmdCBwcmVkaWN0aW9uIG1vZGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgSW50cmE0eDRWZXJ0aWNhbExlZnRQcmVkaWN0aW9uKHU4ICpkYXRhLCB1OCAqYWJvdmUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGFib3ZlKTsKLQotICAgIGRhdGFbIDBdID0gKGFib3ZlWzBdICsgYWJvdmVbMV0gKyAxKSA+PiAxOwotICAgIGRhdGFbIDFdID0gKGFib3ZlWzFdICsgYWJvdmVbMl0gKyAxKSA+PiAxOwotICAgIGRhdGFbIDJdID0gKGFib3ZlWzJdICsgYWJvdmVbM10gKyAxKSA+PiAxOwotICAgIGRhdGFbIDNdID0gKGFib3ZlWzNdICsgYWJvdmVbNF0gKyAxKSA+PiAxOwotICAgIGRhdGFbIDRdID0gKGFib3ZlWzBdICsgMiAqIGFib3ZlWzFdICsgYWJvdmVbMl0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDVdID0gKGFib3ZlWzFdICsgMiAqIGFib3ZlWzJdICsgYWJvdmVbM10gKyAyKSA+PiAyOwotICAgIGRhdGFbIDZdID0gKGFib3ZlWzJdICsgMiAqIGFib3ZlWzNdICsgYWJvdmVbNF0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDddID0gKGFib3ZlWzNdICsgMiAqIGFib3ZlWzRdICsgYWJvdmVbNV0gKyAyKSA+PiAyOwotICAgIGRhdGFbIDhdID0gKGFib3ZlWzFdICsgYWJvdmVbMl0gKyAxKSA+PiAxOwotICAgIGRhdGFbIDldID0gKGFib3ZlWzJdICsgYWJvdmVbM10gKyAxKSA+PiAxOwotICAgIGRhdGFbMTBdID0gKGFib3ZlWzNdICsgYWJvdmVbNF0gKyAxKSA+PiAxOwotICAgIGRhdGFbMTFdID0gKGFib3ZlWzRdICsgYWJvdmVbNV0gKyAxKSA+PiAxOwotICAgIGRhdGFbMTJdID0gKGFib3ZlWzFdICsgMiAqIGFib3ZlWzJdICsgYWJvdmVbM10gKyAyKSA+PiAyOwotICAgIGRhdGFbMTNdID0gKGFib3ZlWzJdICsgMiAqIGFib3ZlWzNdICsgYWJvdmVbNF0gKyAyKSA+PiAyOwotICAgIGRhdGFbMTRdID0gKGFib3ZlWzNdICsgMiAqIGFib3ZlWzRdICsgYWJvdmVbNV0gKyAyKSA+PiAyOwotICAgIGRhdGFbMTVdID0gKGFib3ZlWzRdICsgMiAqIGFib3ZlWzVdICsgYWJvdmVbNl0gKyAyKSA+PiAyOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogSW50cmE0eDRIb3Jpem9udGFsVXBQcmVkaWN0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQZXJmb3JtIGludHJhIDR4NCBob3Jpem9udGFsIHVwIHByZWRpY3Rpb24gbW9kZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBJbnRyYTR4NEhvcml6b250YWxVcFByZWRpY3Rpb24odTggKmRhdGEsIHU4ICpsZWZ0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChsZWZ0KTsKLQotICAgIGRhdGFbIDBdID0gKGxlZnRbMF0gKyBsZWZ0WzFdICsgMSkgPj4gMTsKLSAgICBkYXRhWyAxXSA9IChsZWZ0WzBdICsgMiAqIGxlZnRbMV0gKyBsZWZ0WzJdICsgMikgPj4gMjsKLSAgICBkYXRhWyAyXSA9IChsZWZ0WzFdICsgbGVmdFsyXSArIDEpID4+IDE7Ci0gICAgZGF0YVsgM10gPSAobGVmdFsxXSArIDIgKiBsZWZ0WzJdICsgbGVmdFszXSArIDIpID4+IDI7Ci0gICAgZGF0YVsgNF0gPSAobGVmdFsxXSArIGxlZnRbMl0gKyAxKSA+PiAxOwotICAgIGRhdGFbIDVdID0gKGxlZnRbMV0gKyAyICogbGVmdFsyXSArIGxlZnRbM10gKyAyKSA+PiAyOwotICAgIGRhdGFbIDZdID0gKGxlZnRbMl0gKyBsZWZ0WzNdICsgMSkgPj4gMTsKLSAgICBkYXRhWyA3XSA9IChsZWZ0WzJdICsgMyAqIGxlZnRbM10gKyAyKSA+PiAyOwotICAgIGRhdGFbIDhdID0gKGxlZnRbMl0gKyBsZWZ0WzNdICsgMSkgPj4gMTsKLSAgICBkYXRhWyA5XSA9IChsZWZ0WzJdICsgMyAqIGxlZnRbM10gKyAyKSA+PiAyOwotICAgIGRhdGFbMTBdID0gbGVmdFszXTsKLSAgICBkYXRhWzExXSA9IGxlZnRbM107Ci0gICAgZGF0YVsxMl0gPSBsZWZ0WzNdOwotICAgIGRhdGFbMTNdID0gbGVmdFszXTsKLSAgICBkYXRhWzE0XSA9IGxlZnRbM107Ci0gICAgZGF0YVsxNV0gPSBsZWZ0WzNdOwotCi19Ci0KLSNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogV3JpdGU0eDRUbzE2eDE2Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBXcml0ZSBhIDR4NCBibG9jayAoZGF0YTR4NCkgaW50byBjb3JyZWN0IHBvc2l0aW9uCi0gICAgICAgICAgaW4gMTZ4MTYgbWFjcm9ibG9jayAoZGF0YSkuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgV3JpdGU0eDRUbzE2eDE2KHU4ICpkYXRhLCB1OCAqZGF0YTR4NCwgdTMyIGJsb2NrTnVtKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB4LCB5OwotICAgIHUzMiAqaW4zMiwgKm91dDMyOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKGRhdGE0eDQpOwotICAgIEFTU0VSVChibG9ja051bSA8IDE2KTsKLQotICAgIHggPSBoMjY0YnNkQmxvY2tYW2Jsb2NrTnVtXTsKLSAgICB5ID0gaDI2NGJzZEJsb2NrWVtibG9ja051bV07Ci0KLSAgICBkYXRhICs9IHkqMTYreDsKLQotICAgIEFTU0VSVCgoKHUzMilkYXRhJjB4MykgPT0gMCk7Ci0KLSAgICAvKmxpbnQgLS1lKDgyNikgKi8KLSAgICBvdXQzMiA9ICh1MzIgKilkYXRhOwotICAgIC8qbGludCAtLWUoODI2KSAqLwotICAgIGluMzIgPSAodTMyICopZGF0YTR4NDsKLQotICAgIG91dDMyWzBdID0gKmluMzIrKzsKLSAgICBvdXQzMls0XSA9ICppbjMyKys7Ci0gICAgb3V0MzJbOF0gPSAqaW4zMisrOwotICAgIG91dDMyWzEyXSA9ICppbjMyKys7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGV0ZXJtaW5lSW50cmE0eDRQcmVkTW9kZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUmV0dXJucyB0aGUgaW50cmEgNHg0IHByZWRpY3Rpb24gbW9kZSBvZiBhIGJsb2NrIGJhc2VkIG9uIHRoZQotICAgICAgICAgIG5laWdoYm91cmluZyBtYWNyb2Jsb2NrcyBhbmQgaW5mb3JtYXRpb24gcGFyc2VkIGZyb20gc3RyZWFtLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgRGV0ZXJtaW5lSW50cmE0eDRQcmVkTW9kZShtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsCi0gICAgdTMyIGF2YWlsYWJsZSwgbmVpZ2hib3VyX3QgKm5BLCBuZWlnaGJvdXJfdCAqbkIsIHUzMiBpbmRleCwKLSAgICBtYlN0b3JhZ2VfdCAqbk1iQSwgbWJTdG9yYWdlX3QgKm5NYkIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIG1vZGUxLCBtb2RlMjsKLSAgICBtYlN0b3JhZ2VfdCAqcE1iOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocE1iTGF5ZXIpOwotCi0gICAgLyogZGMgb25seSBwcmVkaWN0aW9uPyAqLwotICAgIGlmICghYXZhaWxhYmxlKQotICAgICAgICBtb2RlMSA9IDI7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcE1iID0gbk1iQTsKLSAgICAgICAgaWYgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVFJBNHg0KQotICAgICAgICB7Ci0gICAgICAgICAgICBtb2RlMSA9IHBNYi0+aW50cmE0eDRQcmVkTW9kZVtuQS0+aW5kZXhdOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1vZGUxID0gMjsKLQotICAgICAgICBwTWIgPSBuTWJCOwotICAgICAgICBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYi0+bWJUeXBlKSA9PSBQUkVEX01PREVfSU5UUkE0eDQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1vZGUyID0gcE1iLT5pbnRyYTR4NFByZWRNb2RlW25CLT5pbmRleF07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbW9kZTIgPSAyOwotCi0gICAgICAgIG1vZGUxID0gTUlOKG1vZGUxLCBtb2RlMik7Ci0gICAgfQotCi0gICAgaWYgKCFwTWJMYXllci0+bWJQcmVkLnByZXZJbnRyYTR4NFByZWRNb2RlRmxhZ1tpbmRleF0pCi0gICAgewotICAgICAgICBpZiAocE1iTGF5ZXItPm1iUHJlZC5yZW1JbnRyYTR4NFByZWRNb2RlW2luZGV4XSA8IG1vZGUxKQotICAgICAgICB7Ci0gICAgICAgICAgICBtb2RlMSA9IHBNYkxheWVyLT5tYlByZWQucmVtSW50cmE0eDRQcmVkTW9kZVtpbmRleF07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBtb2RlMSA9IHBNYkxheWVyLT5tYlByZWQucmVtSW50cmE0eDRQcmVkTW9kZVtpbmRleF0gKyAxOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKG1vZGUxKTsKLX0KLQotCi0vKmxpbnQgK2U3MDIgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50cmFfcHJlZGljdGlvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY1MmJkNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfaW50cmFfcHJlZGljdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19JTlRSQV9QUkVESUNUSU9OX0gKLSNkZWZpbmUgSDI2NFNXREVDX0lOVFJBX1BSRURJQ1RJT05fSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9pbWFnZS5oIgotI2luY2x1ZGUgImgyNjRic2RfbWFjcm9ibG9ja19sYXllci5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZm5kZWYgSDI2NERFQ19PTVhETAotdTMyIGgyNjRic2RJbnRyYVByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgbWFjcm9ibG9ja0xheWVyX3QgKm1iTGF5ZXIsCi0gICAgaW1hZ2VfdCAqaW1hZ2UsIHUzMiBtYk51bSwgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkLCB1OCAqZGF0YSk7Ci0KLXUzMiBoMjY0YnNkSW50cmE0eDRQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja0xheWVyX3QgKm1iTGF5ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQpOwotdTMyIGgyNjRic2RJbnRyYTE2eDE2UHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgaTMyIHJlc2lkdWFsW11bMTZdLAotICAgIHU4ICphYm92ZSwgdTggKmxlZnQsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCk7Ci0KLXUzMiBoMjY0YnNkSW50cmFDaHJvbWFQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLCBpMzIgcmVzaWR1YWxbXVsxNl0sCi0gICAgdTggKmFib3ZlLCB1OCAqbGVmdCwgdTMyIHByZWRNb2RlLCB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQpOwotCi12b2lkIGgyNjRic2RHZXROZWlnaGJvdXJQZWxzKGltYWdlX3QgKmltYWdlLCB1OCAqYWJvdmUsIHU4ICpsZWZ0LCB1MzIgbWJOdW0pOwotCi0jZWxzZQotCi11MzIgaDI2NGJzZEludHJhNHg0UHJlZGljdGlvbihtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tMYXllcl90ICptYkxheWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKnBJbWFnZSwgdTMyIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkLCB1MzIgYmxvY2spOwotCi11MzIgaDI2NGJzZEludHJhMTZ4MTZQcmVkaWN0aW9uKG1iU3RvcmFnZV90ICpwTWIsIHU4ICpkYXRhLCB1OCAqcEltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiB3aWR0aCwgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkKTsKLQotdTMyIGgyNjRic2RJbnRyYUNocm9tYVByZWRpY3Rpb24obWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIGltYWdlX3QgKmltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBwcmVkTW9kZSwgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkKTsKLQotI2VuZGlmCi0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX0lOVFJBX1BSRURJQ1RJT05fSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbWFjcm9ibG9ja19sYXllci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIzZTdmMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbWFjcm9ibG9ja19sYXllci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgaDI2NGJzZERlY29kZU1hY3JvYmxvY2tMYXllcgotICAgICAgICAgIGgyNjRic2RNYlBhcnRQcmVkTW9kZQotICAgICAgICAgIGgyNjRic2ROdW1NYlBhcnQKLSAgICAgICAgICBoMjY0YnNkTnVtU3ViTWJQYXJ0Ci0gICAgICAgICAgRGVjb2RlTWJQcmVkCi0gICAgICAgICAgRGVjb2RlU3ViTWJQcmVkCi0gICAgICAgICAgRGVjb2RlUmVzaWR1YWwKLSAgICAgICAgICBEZXRlcm1pbmVOYwotICAgICAgICAgIENicEludHJhMTZ4MTYKLSAgICAgICAgICBoMjY0YnNkUHJlZE1vZGVJbnRyYTE2eDE2Ci0gICAgICAgICAgaDI2NGJzZERlY29kZU1hY3JvYmxvY2sKLSAgICAgICAgICBQcm9jZXNzUmVzaWR1YWwKLSAgICAgICAgICBoMjY0YnNkU3ViTWJQYXJ0TW9kZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImgyNjRic2RfbWFjcm9ibG9ja19sYXllci5oIgotI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfaGVhZGVyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF92bGMuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2NhdmxjLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9uYWxfdW5pdC5oIgotI2luY2x1ZGUgImgyNjRic2RfbmVpZ2hib3VyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF90cmFuc2Zvcm0uaCIKLSNpbmNsdWRlICJoMjY0YnNkX2ludHJhX3ByZWRpY3Rpb24uaCIKLSNpbmNsdWRlICJoMjY0YnNkX2ludGVyX3ByZWRpY3Rpb24uaCIKLQotI2lmZGVmIEgyNjRERUNfT01YREwKLSNpbmNsdWRlICJvbXh0eXBlcy5oIgotI2luY2x1ZGUgIm9teFZDLmgiCi0jaW5jbHVkZSAiYXJtVkMuaCIKLSNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZkZWYgSDI2NERFQ19PTVhETAotc3RhdGljIGNvbnN0IHUzMiBjaHJvbWFJbmRleFs4XSA9IHsgMjU2LCAyNjAsIDI4OCwgMjkyLCAzMjAsIDMyNCwgMzUyLCAzNTYgfTsKLXN0YXRpYyBjb25zdCB1MzIgbHVtYUluZGV4WzE2XSA9IHsgICAwLCAgIDQsICA2NCwgIDY4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsICAxMiwgIDcyLCAgNzYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOCwgMTMyLCAxOTIsIDE5NiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM2LCAxNDAsIDIwMCwgMjA0IH07Ci0jZW5kaWYKLS8qIG1hcHBpbmcgb2YgZGMgY29lZmZpY2llbnRzIGFycmF5IHRvIGx1bWEgYmxvY2tzICovCi1zdGF0aWMgY29uc3QgdTMyIGRjQ29lZmZJbmRleFsxNl0gPQotICAgIHswLCAxLCA0LCA1LCAyLCAzLCA2LCA3LCA4LCA5LCAxMiwgMTMsIDEwLCAxMSwgMTQsIDE1fTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZU1iUHJlZChzdHJtRGF0YV90ICpwU3RybURhdGEsIG1iUHJlZF90ICpwTWJQcmVkLAotICAgIG1iVHlwZV9lIG1iVHlwZSwgdTMyIG51bVJlZklkeEFjdGl2ZSk7Ci1zdGF0aWMgdTMyIERlY29kZVN1Yk1iUHJlZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHN1Yk1iUHJlZF90ICpwU3ViTWJQcmVkLAotICAgIG1iVHlwZV9lIG1iVHlwZSwgdTMyIG51bVJlZklkeEFjdGl2ZSk7Ci1zdGF0aWMgdTMyIERlY29kZVJlc2lkdWFsKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgcmVzaWR1YWxfdCAqcFJlc2lkdWFsLAotICAgIG1iU3RvcmFnZV90ICpwTWIsIG1iVHlwZV9lIG1iVHlwZSwgdTMyIGNvZGVkQmxvY2tQYXR0ZXJuKTsKLQotI2lmZGVmIEgyNjRERUNfT01YREwKLXN0YXRpYyB1MzIgRGV0ZXJtaW5lTmMobWJTdG9yYWdlX3QgKnBNYiwgdTMyIGJsb2NrSW5kZXgsIHU4ICpwVG90YWxDb2VmZik7Ci0jZWxzZQotc3RhdGljIHUzMiBEZXRlcm1pbmVOYyhtYlN0b3JhZ2VfdCAqcE1iLCB1MzIgYmxvY2tJbmRleCwgaTE2ICpwVG90YWxDb2VmZik7Ci0jZW5kaWYKLQotc3RhdGljIHUzMiBDYnBJbnRyYTE2eDE2KG1iVHlwZV9lIG1iVHlwZSk7Ci0jaWZkZWYgSDI2NERFQ19PTVhETAotc3RhdGljIHUzMiBQcm9jZXNzSW50cmE0eDRSZXNpZHVhbChtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkLAotICAgICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllciwgY29uc3QgdTggKipwU3JjLCBpbWFnZV90ICppbWFnZSk7Ci1zdGF0aWMgdTMyIFByb2Nlc3NDaHJvbWFSZXNpZHVhbChtYlN0b3JhZ2VfdCAqcE1iLCB1OCAqZGF0YSwgY29uc3QgdTggKipwU3JjICk7Ci1zdGF0aWMgdTMyIFByb2Nlc3NJbnRyYTE2eDE2UmVzaWR1YWwobWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCwKLSAgICAgICAgICAgICAgICAgICAgdTMyIGludHJhQ2hyb21hUHJlZE1vZGUsIGNvbnN0IHU4ICoqcFNyYywgaW1hZ2VfdCAqaW1hZ2UpOwotCi0KLSNlbHNlCi1zdGF0aWMgdTMyIFByb2Nlc3NSZXNpZHVhbChtYlN0b3JhZ2VfdCAqcE1iLCBpMzIgcmVzaWR1YWxMZXZlbFtdWzE2XSwgdTMyICopOwotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiBoMjY0YnNkRGVjb2RlTWFjcm9ibG9ja0xheWVyCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQYXJzZSBtYWNyb2Jsb2NrIHNwZWNpZmljIGluZm9ybWF0aW9uIGZyb20gYml0IHN0cmVhbS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgcFN0cm1EYXRhICAgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgICBwTWIgICAgICAgICAgICAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgc3RvcmFnZSBzdHJ1Y3R1cmUKLSAgICAgICAgICBzbGljZVR5cGUgICAgICAgICB0eXBlIG9mIHRoZSBjdXJyZW50IHNsaWNlCi0gICAgICAgICAgbnVtUmVmSWR4QWN0aXZlICAgbWF4aW11bSByZWZlcmVuY2UgaW5kZXgKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIHBNYkxheWVyICAgICAgICAgIHN0b3JlcyB0aGUgbWFjcm9ibG9jayBkYXRhIHBhcnNlZCBmcm9tIHN0cmVhbQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgSEFOVFJPX09LICAgICAgICAgc3VjY2VzcwotICAgICAgICAgIEhBTlRST19OT0sgICAgICAgIGVuZCBvZiBzdHJlYW0gb3IgZXJyb3IgaW4gc3RyZWFtCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlTWFjcm9ibG9ja0xheWVyKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgICBtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsIG1iU3RvcmFnZV90ICpwTWIsIHUzMiBzbGljZVR5cGUsCi0gICAgdTMyIG51bVJlZklkeEFjdGl2ZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCBpLCB2YWx1ZTsKLSAgICBpMzIgaXRtcDsKLSAgICBtYlBhcnRQcmVkTW9kZV9lIHBhcnRNb2RlOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocE1iTGF5ZXIpOwotCi0jaWZkZWYgSDI2NERFQ19ORU9OCi0gICAgaDI2NGJzZENsZWFyTWJMYXllcihwTWJMYXllciwgKChzaXplb2YobWFjcm9ibG9ja0xheWVyX3QpICsgNjMpICYgfjB4M0YpKTsKLSNlbHNlCi0gICAgSDI2NFN3RGVjTWVtc2V0KHBNYkxheWVyLCAwLCBzaXplb2YobWFjcm9ibG9ja0xheWVyX3QpKTsKLSNlbmRpZgotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLQotICAgIGlmIChJU19JX1NMSUNFKHNsaWNlVHlwZSkpCi0gICAgewotICAgICAgICBpZiAoKHZhbHVlICsgNikgPiAzMSB8fCB0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwTWJMYXllci0+bWJUeXBlID0gKG1iVHlwZV9lKSh2YWx1ZSArIDYpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoKHZhbHVlICsgMSkgPiAzMSB8fCB0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwTWJMYXllci0+bWJUeXBlID0gKG1iVHlwZV9lKSh2YWx1ZSArIDEpOwotICAgIH0KLQotICAgIGlmIChwTWJMYXllci0+bWJUeXBlID09IElfUENNKQotICAgIHsKLSAgICAgICAgaTMyICpsZXZlbDsKLSAgICAgICAgd2hpbGUoICFoMjY0YnNkSXNCeXRlQWxpZ25lZChwU3RybURhdGEpICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogcGNtX2FsaWdubWVudF96ZXJvX2JpdCAqLwotICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgICAgIGlmICh0bXApCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICB9Ci0KLSAgICAgICAgbGV2ZWwgPSBwTWJMYXllci0+cmVzaWR1YWwubGV2ZWxbMF07Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAzODQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdmFsdWUgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpOwotICAgICAgICAgICAgaWYgKHZhbHVlID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgKmxldmVsKysgPSAoaTMyKXZhbHVlOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBhcnRNb2RlID0gaDI2NGJzZE1iUGFydFByZWRNb2RlKHBNYkxheWVyLT5tYlR5cGUpOwotICAgICAgICBpZiAoIChwYXJ0TW9kZSA9PSBQUkVEX01PREVfSU5URVIpICYmCi0gICAgICAgICAgICAgKGgyNjRic2ROdW1NYlBhcnQocE1iTGF5ZXItPm1iVHlwZSkgPT0gNCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBEZWNvZGVTdWJNYlByZWQocFN0cm1EYXRhLCAmcE1iTGF5ZXItPnN1Yk1iUHJlZCwKLSAgICAgICAgICAgICAgICBwTWJMYXllci0+bWJUeXBlLCBudW1SZWZJZHhBY3RpdmUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gRGVjb2RlTWJQcmVkKHBTdHJtRGF0YSwgJnBNYkxheWVyLT5tYlByZWQsCi0gICAgICAgICAgICAgICAgcE1iTGF5ZXItPm1iVHlwZSwgbnVtUmVmSWR4QWN0aXZlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotCi0gICAgICAgIGlmIChwYXJ0TW9kZSAhPSBQUkVEX01PREVfSU5UUkExNngxNikKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYk1hcHBlZChwU3RybURhdGEsICZ2YWx1ZSwKLSAgICAgICAgICAgICAgICAodTMyKShwYXJ0TW9kZSA9PSBQUkVEX01PREVfSU5UUkE0eDQpKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgcE1iTGF5ZXItPmNvZGVkQmxvY2tQYXR0ZXJuID0gdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwTWJMYXllci0+Y29kZWRCbG9ja1BhdHRlcm4gPSBDYnBJbnRyYTE2eDE2KHBNYkxheWVyLT5tYlR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBwTWJMYXllci0+Y29kZWRCbG9ja1BhdHRlcm4gfHwKLSAgICAgICAgICAgICAocGFydE1vZGUgPT0gUFJFRF9NT0RFX0lOVFJBMTZ4MTYpICkKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LIHx8IChpdG1wIDwgLTI2KSB8fCAoaXRtcCA+IDI1KSApCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgcE1iTGF5ZXItPm1iUXBEZWx0YSA9IGl0bXA7Ci0KLSAgICAgICAgICAgIHRtcCA9IERlY29kZVJlc2lkdWFsKHBTdHJtRGF0YSwgJnBNYkxheWVyLT5yZXNpZHVhbCwgcE1iLAotICAgICAgICAgICAgICAgIHBNYkxheWVyLT5tYlR5cGUsIHBNYkxheWVyLT5jb2RlZEJsb2NrUGF0dGVybik7Ci0KLSAgICAgICAgICAgIHBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0cyA9Ci0gICAgICAgICAgICAgICAgKHUzMikocFN0cm1EYXRhLT5wU3RybUN1cnJQb3MgLSBwU3RybURhdGEtPnBTdHJtQnVmZlN0YXJ0KSAqIDggKwotICAgICAgICAgICAgICAgIHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkOwotCi0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZE1iUGFydFByZWRNb2RlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBSZXR1cm5zIHRoZSBwcmVkaWN0aW9uIG1vZGUgb2YgYSBtYWNyb2Jsb2NrIHR5cGUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotbWJQYXJ0UHJlZE1vZGVfZSBoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobWJUeXBlX2UgbWJUeXBlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQobWJUeXBlIDw9IDMxKTsKLQotICAgIGlmICgobWJUeXBlIDw9IFBfOHg4cmVmMCkpCi0gICAgICAgIHJldHVybihQUkVEX01PREVfSU5URVIpOwotICAgIGVsc2UgaWYgKG1iVHlwZSA9PSBJXzR4NCkKLSAgICAgICAgcmV0dXJuKFBSRURfTU9ERV9JTlRSQTR4NCk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4oUFJFRF9NT0RFX0lOVFJBMTZ4MTYpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZE51bU1iUGFydAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUmV0dXJucyB0aGUgYW1vdW50IG9mIG1hY3JvYmxvY2sgcGFydGl0aW9ucyBpbiBhIG1hY3JvYmxvY2sgdHlwZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZE51bU1iUGFydChtYlR5cGVfZSBtYlR5cGUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpOwotCi0gICAgc3dpdGNoIChtYlR5cGUpCi0gICAgewotICAgICAgICBjYXNlIFBfTDBfMTZ4MTY6Ci0gICAgICAgIGNhc2UgUF9Ta2lwOgotICAgICAgICAgICAgcmV0dXJuKDEpOwotCi0gICAgICAgIGNhc2UgUF9MMF9MMF8xNng4OgotICAgICAgICBjYXNlIFBfTDBfTDBfOHgxNjoKLSAgICAgICAgICAgIHJldHVybigyKTsKLQotICAgICAgICAvKiBQXzh4OCBvciBQXzh4OHJlZjAgKi8KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybig0KTsKLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkTnVtU3ViTWJQYXJ0Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBSZXR1cm5zIHRoZSBhbW91bnQgb2Ygc3ViLXBhcnRpdGlvbnMgaW4gYSBzdWItbWFjcm9ibG9jayB0eXBlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkTnVtU3ViTWJQYXJ0KHN1Yk1iVHlwZV9lIHN1Yk1iVHlwZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHN1Yk1iVHlwZSA8PSBQX0wwXzR4NCk7Ci0KLSAgICBzd2l0Y2ggKHN1Yk1iVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgUF9MMF84eDg6Ci0gICAgICAgICAgICByZXR1cm4oMSk7Ci0KLSAgICAgICAgY2FzZSBQX0wwXzh4NDoKLSAgICAgICAgY2FzZSBQX0wwXzR4ODoKLSAgICAgICAgICAgIHJldHVybigyKTsKLQotICAgICAgICAvKiBQX0wwXzR4NCAqLwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuKDQpOwotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZU1iUHJlZAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGFyc2UgbWFjcm9ibG9jayBwcmVkaWN0aW9uIGluZm9ybWF0aW9uIGZyb20gYml0IHN0cmVhbSBhbmQgc3RvcmUKLSAgICAgICAgICBpbiAncE1iUHJlZCcuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBEZWNvZGVNYlByZWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBtYlByZWRfdCAqcE1iUHJlZCwgbWJUeXBlX2UgbWJUeXBlLAotICAgIHUzMiBudW1SZWZJZHhBY3RpdmUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgaSwgaiwgdmFsdWU7Ci0gICAgaTMyIGl0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwTWJQcmVkKTsKLQotICAgIHN3aXRjaCAoaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZSkpCi0gICAgewotICAgICAgICBjYXNlIFBSRURfTU9ERV9JTlRFUjogLyogUFJFRF9NT0RFX0lOVEVSICovCi0gICAgICAgICAgICBpZiAobnVtUmVmSWR4QWN0aXZlID4gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSBoMjY0YnNkTnVtTWJQYXJ0KG1iVHlwZSksIGogPSAwOyBpLS07ICBqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVHJ1bmNhdGVkKHBTdHJtRGF0YSwgJnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgKHUzMikobnVtUmVmSWR4QWN0aXZlID4gMikpOwotICAgICAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSyB8fCB2YWx1ZSA+PSBudW1SZWZJZHhBY3RpdmUpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcE1iUHJlZC0+cmVmSWR4TDBbal0gPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IGgyNjRic2ROdW1NYlBhcnQobWJUeXBlKSwgaiA9IDA7IGktLTsgIGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOwotICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgICAgICBwTWJQcmVkLT5tdmRMMFtqXS5ob3IgPSAoaTE2KWl0bXA7Ci0KLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOwotICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgICAgICBwTWJQcmVkLT5tdmRMMFtqXS52ZXIgPSAoaTE2KWl0bXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFBSRURfTU9ERV9JTlRSQTR4NDoKLSAgICAgICAgICAgIGZvciAoaXRtcCA9IDAsIGkgPSAwOyBpdG1wIDwgMjsgaXRtcCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbHVlID0gaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKTsKLSAgICAgICAgICAgICAgICB0bXAgPSAwOwotICAgICAgICAgICAgICAgIGZvciAoaiA9IDg7IGotLTsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcE1iUHJlZC0+cHJldkludHJhNHg0UHJlZE1vZGVGbGFnW2ldID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICYgMHg4MDAwMDAwMCA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA8PD0gMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwTWJQcmVkLT5wcmV2SW50cmE0eDRQcmVkTW9kZUZsYWdbaV0pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBNYlByZWQtPnJlbUludHJhNHg0UHJlZE1vZGVbaV0gPSB2YWx1ZT4+Mjk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA8PD0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwgOCArIDMqdG1wKSA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBmYWxsLXRocm91Z2ggKi8KLQotICAgICAgICBjYXNlIFBSRURfTU9ERV9JTlRSQTE2eDE2OgotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LIHx8IHZhbHVlID4gMykKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICBwTWJQcmVkLT5pbnRyYUNocm9tYVByZWRNb2RlID0gdmFsdWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZVN1Yk1iUHJlZAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGFyc2Ugc3ViLW1hY3JvYmxvY2sgcHJlZGljdGlvbiBpbmZvcm1hdGlvbiBmcm9tIGJpdCBzdHJlYW0gYW5kCi0gICAgICAgICAgc3RvcmUgaW4gJ3BNYlByZWQnLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgRGVjb2RlU3ViTWJQcmVkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgc3ViTWJQcmVkX3QgKnBTdWJNYlByZWQsCi0gICAgbWJUeXBlX2UgbWJUeXBlLCB1MzIgbnVtUmVmSWR4QWN0aXZlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIGksIGosIHZhbHVlOwotICAgIGkzMiBpdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFN1Yk1iUHJlZCk7Ci0gICAgQVNTRVJUKGgyNjRic2RNYlBhcnRQcmVkTW9kZShtYlR5cGUpID09IFBSRURfTU9ERV9JTlRFUik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0sgfHwgdmFsdWUgPiAzKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwU3ViTWJQcmVkLT5zdWJNYlR5cGVbaV0gPSAoc3ViTWJUeXBlX2UpdmFsdWU7Ci0gICAgfQotCi0gICAgaWYgKCAobnVtUmVmSWR4QWN0aXZlID4gMSkgJiYgKG1iVHlwZSAhPSBQXzh4OHJlZjApICkKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJUcnVuY2F0ZWQocFN0cm1EYXRhLCAmdmFsdWUsCi0gICAgICAgICAgICAgICAgKHUzMikobnVtUmVmSWR4QWN0aXZlID4gMikpOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0sgfHwgdmFsdWUgPj0gbnVtUmVmSWR4QWN0aXZlKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHBTdWJNYlByZWQtPnJlZklkeEwwW2ldID0gdmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgIHsKLSAgICAgICAgaiA9IDA7Ci0gICAgICAgIGZvciAodmFsdWUgPSBoMjY0YnNkTnVtU3ViTWJQYXJ0KHBTdWJNYlByZWQtPnN1Yk1iVHlwZVtpXSk7Ci0gICAgICAgICAgICAgdmFsdWUtLTsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICBwU3ViTWJQcmVkLT5tdmRMMFtpXVtqXS5ob3IgPSAoaTE2KWl0bXA7Ci0KLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgIHBTdWJNYlByZWQtPm12ZEwwW2ldW2pdLnZlciA9IChpMTYpaXRtcDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLSNpZmRlZiBIMjY0REVDX09NWERMCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZVJlc2lkdWFsCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQYXJzZSByZXNpZHVhbCBpbmZvcm1hdGlvbiBmcm9tIGJpdCBzdHJlYW0gYW5kIHN0b3JlIGluICdwUmVzaWR1YWwnLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgRGVjb2RlUmVzaWR1YWwoc3RybURhdGFfdCAqcFN0cm1EYXRhLCByZXNpZHVhbF90ICpwUmVzaWR1YWwsCi0gICAgbWJTdG9yYWdlX3QgKnBNYiwgbWJUeXBlX2UgbWJUeXBlLCB1MzIgY29kZWRCbG9ja1BhdHRlcm4pCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksIGo7Ci0gICAgdTMyIGJsb2NrQ29kZWQ7Ci0gICAgdTMyIGJsb2NrSW5kZXg7Ci0gICAgdTMyIGlzMTZ4MTY7Ci0gICAgT01YX0lOVCBuYzsKLSAgICBPTVhSZXN1bHQgb214UmVzOwotICAgIE9NWF9VOCAqcFBvc0NvZWZCdWY7Ci0KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBSZXNpZHVhbCk7Ci0KLSAgICBwUG9zQ29lZkJ1ZiA9IHBSZXNpZHVhbC0+cG9zQ29lZkJ1ZjsKLQotICAgIC8qIGx1bWEgREMgaXMgYXQgaW5kZXggMjQgKi8KLSAgICBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVFJBMTZ4MTYpCi0gICAgewotICAgICAgICBuYyA9IChPTVhfSU5UKURldGVybWluZU5jKHBNYiwgMCwgcFJlc2lkdWFsLT50b3RhbENvZWZmKTsKLSNpZm5kZWYgSDI2NERFQ19ORU9OCi0gICAgICAgIG9teFJlcyA9ICBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDKAotICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTggKiopICgmcFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpLAotICAgICAgICAgICAgICAgIChPTVhfUzMyKikgKCZwU3RybURhdGEtPmJpdFBvc0luV29yZCksCi0gICAgICAgICAgICAgICAgJnBSZXNpZHVhbC0+dG90YWxDb2VmZlsyNF0sCi0gICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmLAotICAgICAgICAgICAgICAgIG5jLAotICAgICAgICAgICAgICAgIDE2KTsKLSNlbHNlCi0gICAgICAgIG9teFJlcyA9IGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKAotICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTggKiopICgmcFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpLAotICAgICAgICAgICAgICAgIChPTVhfUzMyKikgKCZwU3RybURhdGEtPmJpdFBvc0luV29yZCksCi0gICAgICAgICAgICAgICAgJnBSZXNpZHVhbC0+dG90YWxDb2VmZlsyNF0sCi0gICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmLAotICAgICAgICAgICAgICAgIG5jLAotICAgICAgICAgICAgICAgIDE2KTsKLSNlbmRpZgotICAgICAgICBpZiAob214UmVzICE9IE9NWF9TdHNfTm9FcnIpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIGlzMTZ4MTYgPSBIQU5UUk9fVFJVRTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBpczE2eDE2ID0gSEFOVFJPX0ZBTFNFOwotCi0gICAgZm9yIChpID0gNCwgYmxvY2tJbmRleCA9IDA7IGktLTspCi0gICAgewotICAgICAgICAvKiBsdW1hIGNicCBpbiBiaXRzIDAtMyAqLwotICAgICAgICBibG9ja0NvZGVkID0gY29kZWRCbG9ja1BhdHRlcm4gJiAweDE7Ci0gICAgICAgIGNvZGVkQmxvY2tQYXR0ZXJuID4+PSAxOwotICAgICAgICBpZiAoYmxvY2tDb2RlZCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChqID0gNDsgai0tOyBibG9ja0luZGV4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmMgPSAoT01YX0lOVClEZXRlcm1pbmVOYyhwTWIsYmxvY2tJbmRleCxwUmVzaWR1YWwtPnRvdGFsQ29lZmYpOwotICAgICAgICAgICAgICAgIGlmIChpczE2eDE2KQotICAgICAgICAgICAgICAgIHsKLSNpZm5kZWYgSDI2NERFQ19ORU9OCi0gICAgICAgICAgICAgICAgICAgIG9teFJlcyA9ICBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTggKiopICgmcFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfUzMyKikgKCZwU3RybURhdGEtPmJpdFBvc0luV29yZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBSZXNpZHVhbC0+dG90YWxDb2VmZltibG9ja0luZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFBvc0NvZWZCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUpOwotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgb214UmVzID0gIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTggKiopICgmcFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfUzMyKikgKCZwU3RybURhdGEtPmJpdFBvc0luV29yZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBSZXNpZHVhbC0+dG90YWxDb2VmZltibG9ja0luZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFBvc0NvZWZCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0jaWZuZGVmIEgyNjRERUNfTkVPTgotICAgICAgICAgICAgICAgICAgICBvbXhSZXMgPSAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4ICoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbYmxvY2tJbmRleF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2KTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgIG9teFJlcyA9IGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTggKiopICgmcFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfUzMyKikgKCZwU3RybURhdGEtPmJpdFBvc0luV29yZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBSZXNpZHVhbC0+dG90YWxDb2VmZltibG9ja0luZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFBvc0NvZWZCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvbXhSZXMgIT0gT01YX1N0c19Ob0VycikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGJsb2NrSW5kZXggKz0gNDsKLSAgICB9Ci0KLSAgICAvKiBjaHJvbWEgREMgYmxvY2sgYXJlIGF0IGluZGljZXMgMjUgYW5kIDI2ICovCi0gICAgYmxvY2tDb2RlZCA9IGNvZGVkQmxvY2tQYXR0ZXJuICYgMHgzOwotICAgIGlmIChibG9ja0NvZGVkKQotICAgIHsKLSNpZm5kZWYgSDI2NERFQ19ORU9OCi0gICAgICAgIG9teFJlcyA9ICBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMoCi0gICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKLSAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAotICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbMjVdLAotICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1Zik7Ci0jZWxzZQotICAgICAgICBvbXhSZXMgPSBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcigKLSAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiopICgmcFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpLAotICAgICAgICAgICAgICAgIChPTVhfUzMyKikgKCZwU3RybURhdGEtPmJpdFBvc0luV29yZCksCi0gICAgICAgICAgICAgICAgJnBSZXNpZHVhbC0+dG90YWxDb2VmZlsyNV0sCi0gICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmLAotICAgICAgICAgICAgICAgIDE3LAotICAgICAgICAgICAgICAgIDQpOwotI2VuZGlmCi0gICAgICAgIGlmIChvbXhSZXMgIT0gT01YX1N0c19Ob0VycikKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSNpZm5kZWYgSDI2NERFQ19ORU9OCi0gICAgICAgIG9teFJlcyA9ICBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMoCi0gICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCoqKSAoJnBTdHJtRGF0YS0+cFN0cm1DdXJyUG9zKSwKLSAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAotICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbMjZdLAotICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1Zik7Ci0jZWxzZQotICAgICAgICBvbXhSZXMgPSBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcigKLSAgICAgICAgICAgICAgICAoY29uc3QgT01YX1U4KiopICgmcFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpLAotICAgICAgICAgICAgICAgIChPTVhfUzMyKikgKCZwU3RybURhdGEtPmJpdFBvc0luV29yZCksCi0gICAgICAgICAgICAgICAgJnBSZXNpZHVhbC0+dG90YWxDb2VmZlsyNl0sCi0gICAgICAgICAgICAgICAgJnBQb3NDb2VmQnVmLAotICAgICAgICAgICAgICAgIDE3LAotICAgICAgICAgICAgICAgIDQpOwotI2VuZGlmCi0gICAgICAgIGlmIChvbXhSZXMgIT0gT01YX1N0c19Ob0VycikKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICAvKiBjaHJvbWEgQUMgKi8KLSAgICBibG9ja0NvZGVkID0gY29kZWRCbG9ja1BhdHRlcm4gJiAweDI7Ci0gICAgaWYgKGJsb2NrQ29kZWQpCi0gICAgewotICAgICAgICBmb3IgKGkgPSA4OyBpLS07YmxvY2tJbmRleCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBuYyA9IChPTVhfSU5UKURldGVybWluZU5jKHBNYiwgYmxvY2tJbmRleCwgcFJlc2lkdWFsLT50b3RhbENvZWZmKTsKLSNpZm5kZWYgSDI2NERFQ19ORU9OCi0gICAgICAgICAgICBvbXhSZXMgPSAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQygKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9VOCAqKikgKCZwU3RybURhdGEtPnBTdHJtQ3VyclBvcyksCi0gICAgICAgICAgICAgICAgICAgIChPTVhfUzMyKikgKCZwU3RybURhdGEtPmJpdFBvc0luV29yZCksCi0gICAgICAgICAgICAgICAgICAgICZwUmVzaWR1YWwtPnRvdGFsQ29lZmZbYmxvY2tJbmRleF0sCi0gICAgICAgICAgICAgICAgICAgICZwUG9zQ29lZkJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgbmMsCi0gICAgICAgICAgICAgICAgICAgIDE1KTsKLSNlbHNlCi0gICAgICAgICAgICBvbXhSZXMgPSAgYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIoCi0gICAgICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVTggKiopICgmcFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpLAotICAgICAgICAgICAgICAgICAgICAoT01YX1MzMiopICgmcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpLAotICAgICAgICAgICAgICAgICAgICAmcFJlc2lkdWFsLT50b3RhbENvZWZmW2Jsb2NrSW5kZXhdLAotICAgICAgICAgICAgICAgICAgICAmcFBvc0NvZWZCdWYsCi0gICAgICAgICAgICAgICAgICAgIG5jLAotICAgICAgICAgICAgICAgICAgICAxNSk7Ci0jZW5kaWYKLSAgICAgICAgICAgIGlmIChvbXhSZXMgIT0gT01YX1N0c19Ob0VycikKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0jZWxzZQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVSZXNpZHVhbAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUGFyc2UgcmVzaWR1YWwgaW5mb3JtYXRpb24gZnJvbSBiaXQgc3RyZWFtIGFuZCBzdG9yZSBpbiAncFJlc2lkdWFsJy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIERlY29kZVJlc2lkdWFsKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgcmVzaWR1YWxfdCAqcFJlc2lkdWFsLAotICAgIG1iU3RvcmFnZV90ICpwTWIsIG1iVHlwZV9lIG1iVHlwZSwgdTMyIGNvZGVkQmxvY2tQYXR0ZXJuKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLCBqLCB0bXA7Ci0gICAgaTMyIG5jOwotICAgIHUzMiBibG9ja0NvZGVkOwotICAgIHUzMiBibG9ja0luZGV4OwotICAgIHUzMiBpczE2eDE2OwotICAgIGkzMiAoKmxldmVsKVsxNl07Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwUmVzaWR1YWwpOwotCi0gICAgbGV2ZWwgPSBwUmVzaWR1YWwtPmxldmVsOwotCi0gICAgLyogbHVtYSBEQyBpcyBhdCBpbmRleCAyNCAqLwotICAgIGlmIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobWJUeXBlKSA9PSBQUkVEX01PREVfSU5UUkExNngxNikKLSAgICB7Ci0gICAgICAgIG5jID0gKGkzMilEZXRlcm1pbmVOYyhwTWIsIDAsIHBSZXNpZHVhbC0+dG90YWxDb2VmZik7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVSZXNpZHVhbEJsb2NrQ2F2bGMocFN0cm1EYXRhLCBsZXZlbFsyNF0sIG5jLCAxNik7Ci0gICAgICAgIGlmICgodG1wICYgMHhGKSAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgcFJlc2lkdWFsLT50b3RhbENvZWZmWzI0XSA9ICh0bXAgPj4gNCkgJiAweEZGOwotICAgICAgICBpczE2eDE2ID0gSEFOVFJPX1RSVUU7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgaXMxNngxNiA9IEhBTlRST19GQUxTRTsKLQotICAgIGZvciAoaSA9IDQsIGJsb2NrSW5kZXggPSAwOyBpLS07KQotICAgIHsKLSAgICAgICAgLyogbHVtYSBjYnAgaW4gYml0cyAwLTMgKi8KLSAgICAgICAgYmxvY2tDb2RlZCA9IGNvZGVkQmxvY2tQYXR0ZXJuICYgMHgxOwotICAgICAgICBjb2RlZEJsb2NrUGF0dGVybiA+Pj0gMTsKLSAgICAgICAgaWYgKGJsb2NrQ29kZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaiA9IDQ7IGotLTsgYmxvY2tJbmRleCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5jID0gKGkzMilEZXRlcm1pbmVOYyhwTWIsIGJsb2NrSW5kZXgsIHBSZXNpZHVhbC0+dG90YWxDb2VmZik7Ci0gICAgICAgICAgICAgICAgaWYgKGlzMTZ4MTYpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlUmVzaWR1YWxCbG9ja0NhdmxjKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsW2Jsb2NrSW5kZXhdICsgMSwgbmMsIDE1KTsKLSAgICAgICAgICAgICAgICAgICAgcFJlc2lkdWFsLT5jb2VmZk1hcFtibG9ja0luZGV4XSA9IHRtcCA+PiAxNTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZVJlc2lkdWFsQmxvY2tDYXZsYyhwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFtibG9ja0luZGV4XSwgbmMsIDE2KTsKLSAgICAgICAgICAgICAgICAgICAgcFJlc2lkdWFsLT5jb2VmZk1hcFtibG9ja0luZGV4XSA9IHRtcCA+PiAxNjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCh0bXAgJiAweEYpICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICAgICAgcFJlc2lkdWFsLT50b3RhbENvZWZmW2Jsb2NrSW5kZXhdID0gKHRtcCA+PiA0KSAmIDB4RkY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYmxvY2tJbmRleCArPSA0OwotICAgIH0KLQotICAgIC8qIGNocm9tYSBEQyBibG9jayBhcmUgYXQgaW5kaWNlcyAyNSBhbmQgMjYgKi8KLSAgICBibG9ja0NvZGVkID0gY29kZWRCbG9ja1BhdHRlcm4gJiAweDM7Ci0gICAgaWYgKGJsb2NrQ29kZWQpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlUmVzaWR1YWxCbG9ja0NhdmxjKHBTdHJtRGF0YSwgbGV2ZWxbMjVdLCAtMSwgNCk7Ci0gICAgICAgIGlmICgodG1wICYgMHhGKSAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgcFJlc2lkdWFsLT50b3RhbENvZWZmWzI1XSA9ICh0bXAgPj4gNCkgJiAweEZGOwotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlUmVzaWR1YWxCbG9ja0NhdmxjKHBTdHJtRGF0YSwgbGV2ZWxbMjVdKzQsIC0xLCA0KTsKLSAgICAgICAgaWYgKCh0bXAgJiAweEYpICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICBwUmVzaWR1YWwtPnRvdGFsQ29lZmZbMjZdID0gKHRtcCA+PiA0KSAmIDB4RkY7Ci0gICAgfQotCi0gICAgLyogY2hyb21hIEFDICovCi0gICAgYmxvY2tDb2RlZCA9IGNvZGVkQmxvY2tQYXR0ZXJuICYgMHgyOwotICAgIGlmIChibG9ja0NvZGVkKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gODsgaS0tO2Jsb2NrSW5kZXgrKykKLSAgICAgICAgewotICAgICAgICAgICAgbmMgPSAoaTMyKURldGVybWluZU5jKHBNYiwgYmxvY2tJbmRleCwgcFJlc2lkdWFsLT50b3RhbENvZWZmKTsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVSZXNpZHVhbEJsb2NrQ2F2bGMocFN0cm1EYXRhLAotICAgICAgICAgICAgICAgIGxldmVsW2Jsb2NrSW5kZXhdICsgMSwgbmMsIDE1KTsKLSAgICAgICAgICAgIGlmICgodG1wICYgMHhGKSAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICBwUmVzaWR1YWwtPnRvdGFsQ29lZmZbYmxvY2tJbmRleF0gPSAodG1wID4+IDQpICYgMHhGRjsKLSAgICAgICAgICAgIHBSZXNpZHVhbC0+Y29lZmZNYXBbYmxvY2tJbmRleF0gPSAodG1wID4+IDE1KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZXRlcm1pbmVOYwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUmV0dXJucyB0aGUgbkMgb2YgYSBibG9jay4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZmRlZiBIMjY0REVDX09NWERMCi11MzIgRGV0ZXJtaW5lTmMobWJTdG9yYWdlX3QgKnBNYiwgdTMyIGJsb2NrSW5kZXgsIHU4ICpwVG90YWxDb2VmZikKLSNlbHNlCi11MzIgRGV0ZXJtaW5lTmMobWJTdG9yYWdlX3QgKnBNYiwgdTMyIGJsb2NrSW5kZXgsIGkxNiAqcFRvdGFsQ29lZmYpCi0jZW5kaWYKLXsKLS8qbGludCAtZTcwMiAqLwotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wOwotICAgIGkzMiBuOwotICAgIGNvbnN0IG5laWdoYm91cl90ICpuZWlnaGJvdXJBLCAqbmVpZ2hib3VyQjsKLSAgICB1OCBuZWlnaGJvdXJBaW5kZXgsIG5laWdoYm91ckJpbmRleDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGJsb2NrSW5kZXggPCAyNCk7Ci0KLSAgICAvKiBpZiBuZWlnaGJvdXIgYmxvY2sgYmVsb25ncyB0byBjdXJyZW50IG1hY3JvYmxvY2sgdG90YWxDb2VmZiBhcnJheQotICAgICAqIG1iU3RvcmFnZSBoYXMgbm90IGJlZW4gc2V0L3VwZGF0ZWQgeWV0IC0+IHVzZSBwVG90YWxDb2VmZiAqLwotICAgIG5laWdoYm91ckEgPSBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tBKGJsb2NrSW5kZXgpOwotICAgIG5laWdoYm91ckIgPSBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tCKGJsb2NrSW5kZXgpOwotICAgIG5laWdoYm91ckFpbmRleCA9IG5laWdoYm91ckEtPmluZGV4OwotICAgIG5laWdoYm91ckJpbmRleCA9IG5laWdoYm91ckItPmluZGV4OwotICAgIGlmIChuZWlnaGJvdXJBLT5tYiA9PSBNQl9DVVJSICYmIG5laWdoYm91ckItPm1iID09IE1CX0NVUlIpCi0gICAgewotICAgICAgICBuID0gKHBUb3RhbENvZWZmW25laWdoYm91ckFpbmRleF0gKwotICAgICAgICAgICAgIHBUb3RhbENvZWZmW25laWdoYm91ckJpbmRleF0gKyAxKT4+MTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobmVpZ2hib3VyQS0+bWIgPT0gTUJfQ1VSUikKLSAgICB7Ci0gICAgICAgIG4gPSBwVG90YWxDb2VmZltuZWlnaGJvdXJBaW5kZXhdOwotICAgICAgICBpZiAoaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBuID0gKG4gKyBwTWItPm1iQi0+dG90YWxDb2VmZltuZWlnaGJvdXJCaW5kZXhdICsgMSkgPj4gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChuZWlnaGJvdXJCLT5tYiA9PSBNQl9DVVJSKQotICAgIHsKLSAgICAgICAgbiA9IHBUb3RhbENvZWZmW25laWdoYm91ckJpbmRleF07Ci0gICAgICAgIGlmIChoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUocE1iLCBwTWItPm1iQSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG4gPSAobiArIHBNYi0+bWJBLT50b3RhbENvZWZmW25laWdoYm91ckFpbmRleF0gKyAxKSA+PiAxOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG4gPSB0bXAgPSAwOwotICAgICAgICBpZiAoaDI2NGJzZElzTmVpZ2hib3VyQXZhaWxhYmxlKHBNYiwgcE1iLT5tYkEpKQotICAgICAgICB7Ci0gICAgICAgICAgICBuID0gcE1iLT5tYkEtPnRvdGFsQ29lZmZbbmVpZ2hib3VyQWluZGV4XTsKLSAgICAgICAgICAgIHRtcCA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShwTWIsIHBNYi0+bWJCKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRtcCkKLSAgICAgICAgICAgICAgICBuID0gKG4gKyBwTWItPm1iQi0+dG90YWxDb2VmZltuZWlnaGJvdXJCaW5kZXhdICsgMSkgPj4gMTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBuID0gcE1iLT5tYkItPnRvdGFsQ29lZmZbbmVpZ2hib3VyQmluZGV4XTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4oKHUzMiluKTsKLS8qbGludCArZTcwMiAqLwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IENicEludHJhMTZ4MTYKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFJldHVybnMgdGhlIGNvZGVkIGJsb2NrIHBhdHRlcm4gZm9yIGludHJhIDE2eDE2IG1hY3JvYmxvY2suCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBDYnBJbnRyYTE2eDE2KG1iVHlwZV9lIG1iVHlwZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgY2JwOwotICAgIHUzMiB0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChtYlR5cGUgPj0gSV8xNngxNl8wXzBfMCAmJiBtYlR5cGUgPD0gSV8xNngxNl8zXzJfMSk7Ci0KLSAgICBpZiAobWJUeXBlID49IElfMTZ4MTZfMF8wXzEpCi0gICAgICAgIGNicCA9IDE1OwotICAgIGVsc2UKLSAgICAgICAgY2JwID0gMDsKLQotICAgIC8qIHRtcCBpcyAwIGZvciBJXzE2eDE2XzBfMF8wIG1iIHR5cGUgKi8KLSAgICAvKiBpZ25vcmUgbGludCB3YXJuaW5nIG9uIGFyaXRobWV0aWMgb24gZW51bSdzICovCi0gICAgdG1wID0gLypsaW50IC1lKDY1NikqLyhtYlR5cGUgLSBJXzE2eDE2XzBfMF8wKSA+PiAyOwotICAgIGlmICh0bXAgPiAyKQotICAgICAgICB0bXAgLT0gMzsKLQotICAgIGNicCArPSB0bXAgPDwgNDsKLQotICAgIHJldHVybihjYnApOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZFByZWRNb2RlSW50cmExNngxNgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUmV0dXJucyB0aGUgcHJlZGljdGlvbiBtb2RlIGZvciBpbnRyYSAxNngxNiBtYWNyb2Jsb2NrLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZFByZWRNb2RlSW50cmExNngxNihtYlR5cGVfZSBtYlR5cGUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKG1iVHlwZSA+PSBJXzE2eDE2XzBfMF8wICYmIG1iVHlwZSA8PSBJXzE2eDE2XzNfMl8xKTsKLQotICAgIC8qIHRtcCBpcyAwIGZvciBJXzE2eDE2XzBfMF8wIG1iIHR5cGUgKi8KLSAgICAvKiBpZ25vcmUgbGludCB3YXJuaW5nIG9uIGFyaXRobWV0aWMgb24gZW51bSdzICovCi0gICAgdG1wID0gLypsaW50IC1lKDY1NikqLyhtYlR5cGUgLSBJXzE2eDE2XzBfMF8wKTsKLQotICAgIHJldHVybih0bXAgJiAweDMpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZERlY29kZU1hY3JvYmxvY2sKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIERlY29kZSBvbmUgbWFjcm9ibG9jayBhbmQgd3JpdGUgaW50byBvdXRwdXQgaW1hZ2UuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIHBNYiAgICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIHNwZWNpZmljIGluZm9ybWF0aW9uCi0gICAgICAgICAgbWJMYXllciAgICAgICBwb2ludGVyIHRvIGN1cnJlbnQgbWFjcm9ibG9jayBkYXRhIGZyb20gc3RyZWFtCi0gICAgICAgICAgY3VyckltYWdlICAgICBwb2ludGVyIHRvIG91dHB1dCBpbWFnZQotICAgICAgICAgIGRwYiAgICAgICAgICAgcG9pbnRlciB0byBkZWNvZGVkIHBpY3R1cmUgYnVmZmVyCi0gICAgICAgICAgcXBZICAgICAgICAgICBwb2ludGVyIHRvIHNsaWNlIFFQCi0gICAgICAgICAgbWJOdW0gICAgICAgICBjdXJyZW50IG1hY3JvYmxvY2sgbnVtYmVyCi0gICAgICAgICAgY29uc3RyYWluZWRJbnRyYVByZWQgIGZsYWcgc3BlY2lmeWluZyBpZiBuZWlnaGJvdXJpbmcgaW50ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja3MgYXJlIHVzZWQgaW4gaW50cmEgcHJlZGljdGlvbgotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgcE1iICAgICAgICAgICBzdHJ1Y3R1cmUgaXMgdXBkYXRlZCB3aXRoIGN1cnJlbnQgbWFjcm9ibG9jawotICAgICAgICAgIGN1cnJJbWFnZSAgICAgZGVjb2RlZCBtYWNyb2Jsb2NrIGlzIHdyaXR0ZW4gaW50byBvdXRwdXQgaW1hZ2UKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgIEhBTlRST19PSyAgICAgc3VjY2VzcwotICAgICAgICAgIEhBTlRST19OT0sgICAgZXJyb3IgaW4gbWFjcm9ibG9jayBkZWNvZGluZwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZU1hY3JvYmxvY2sobWJTdG9yYWdlX3QgKnBNYiwgbWFjcm9ibG9ja0xheWVyX3QgKnBNYkxheWVyLAotICAgIGltYWdlX3QgKmN1cnJJbWFnZSwgZHBiU3RvcmFnZV90ICpkcGIsIGkzMiAqcXBZLCB1MzIgbWJOdW0sCi0gICAgdTMyIGNvbnN0cmFpbmVkSW50cmFQcmVkRmxhZywgdTgqIGRhdGEpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksIHRtcDsKLSAgICBtYlR5cGVfZSBtYlR5cGU7Ci0jaWZkZWYgSDI2NERFQ19PTVhETAotICAgIGNvbnN0IHU4ICpwU3JjOwotI2VuZGlmCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocE1iKTsKLSAgICBBU1NFUlQocE1iTGF5ZXIpOwotICAgIEFTU0VSVChjdXJySW1hZ2UpOwotICAgIEFTU0VSVChxcFkgJiYgKnFwWSA8IDUyKTsKLSAgICBBU1NFUlQobWJOdW0gPCBjdXJySW1hZ2UtPndpZHRoKmN1cnJJbWFnZS0+aGVpZ2h0KTsKLQotICAgIG1iVHlwZSA9IHBNYkxheWVyLT5tYlR5cGU7Ci0gICAgcE1iLT5tYlR5cGUgPSBtYlR5cGU7Ci0KLSAgICBwTWItPmRlY29kZWQrKzsKLQotICAgIGgyNjRic2RTZXRDdXJySW1hZ2VNYlBvaW50ZXJzKGN1cnJJbWFnZSwgbWJOdW0pOwotCi0gICAgaWYgKG1iVHlwZSA9PSBJX1BDTSkKLSAgICB7Ci0gICAgICAgIHU4ICpwRGF0YSA9ICh1OCopZGF0YTsKLSNpZmRlZiBIMjY0REVDX09NWERMCi0gICAgICAgIHU4ICp0b3QgPSBwTWItPnRvdGFsQ29lZmY7Ci0jZWxzZQotICAgICAgICBpMTYgKnRvdCA9IHBNYi0+dG90YWxDb2VmZjsKLSNlbmRpZgotICAgICAgICBpMzIgKmxldiA9IHBNYkxheWVyLT5yZXNpZHVhbC5sZXZlbFswXTsKLQotICAgICAgICBwTWItPnFwWSA9IDA7Ci0KLSAgICAgICAgLyogaWYgZGVjb2RlZCBmbGFnID4gMSAtPiBtYiBoYXMgYWxyZWFkeSBiZWVuIHN1Y2Nlc3NmdWxseSBkZWNvZGVkIGFuZAotICAgICAgICAgKiB3cml0dGVuIHRvIG91dHB1dCAtPiBkbyBub3Qgd3JpdGUgYWdhaW4gKi8KLSAgICAgICAgaWYgKHBNYi0+ZGVjb2RlZCA+IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDI0OyBpLS07KQotICAgICAgICAgICAgICAgICp0b3QrKyA9IDE2OwotICAgICAgICAgICAgcmV0dXJuIEhBTlRST19PSzsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaSA9IDI0OyBpLS07KQotICAgICAgICB7Ci0gICAgICAgICAgICAqdG90KysgPSAxNjsKLSAgICAgICAgICAgIGZvciAodG1wID0gMTY7IHRtcC0tOykKLSAgICAgICAgICAgICAgICAqcERhdGErKyA9ICh1OCkoKmxldisrKTsKLSAgICAgICAgfQotICAgICAgICBoMjY0YnNkV3JpdGVNYWNyb2Jsb2NrKGN1cnJJbWFnZSwgKHU4KilkYXRhKTsKLQotICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSNpZmRlZiBIMjY0REVDX09NWERMCi0gICAgICAgIGlmIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2RJbnRlclByZWRpY3Rpb24ocE1iLCBwTWJMYXllciwgZHBiLCBtYk51bSwKLSAgICAgICAgICAgICAgICBjdXJySW1hZ2UsICh1OCopZGF0YSk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykgcmV0dXJuICh0bXApOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgaWYgKG1iVHlwZSAhPSBQX1NraXApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEgyNjRTd0RlY01lbWNweShwTWItPnRvdGFsQ29lZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1iTGF5ZXItPnJlc2lkdWFsLnRvdGFsQ29lZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMjcqc2l6ZW9mKCpwTWItPnRvdGFsQ29lZmYpKTsKLQotICAgICAgICAgICAgLyogdXBkYXRlIHFwWSAqLwotICAgICAgICAgICAgaWYgKHBNYkxheWVyLT5tYlFwRGVsdGEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnFwWSA9ICpxcFkgKyBwTWJMYXllci0+bWJRcERlbHRhOwotICAgICAgICAgICAgICAgIGlmICgqcXBZIDwgMCkgKnFwWSArPSA1MjsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICgqcXBZID49IDUyKSAqcXBZIC09IDUyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcE1iLT5xcFkgPSAodTMyKSpxcFk7Ci0KLSNpZmRlZiBIMjY0REVDX09NWERMCi0gICAgICAgICAgICBwU3JjID0gcE1iTGF5ZXItPnJlc2lkdWFsLnBvc0NvZWZCdWY7Ci0KLSAgICAgICAgICAgIGlmIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobWJUeXBlKSA9PSBQUkVEX01PREVfSU5URVIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT01YUmVzdWx0IHJlczsKLSAgICAgICAgICAgICAgICB1OCAqcDsKLSAgICAgICAgICAgICAgICB1OCAqdG90YWxDb2VmZiA9IHBNYi0+dG90YWxDb2VmZjsKLQotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrLCB0b3RhbENvZWZmKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwID0gZGF0YSArIGx1bWFJbmRleFtpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCp0b3RhbENvZWZmKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFNyYywgcCwgMCwgcCwgMTYsIDE2LCAqcXBZLCAqdG90YWxDb2VmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9NWF9TdHNfTm9FcnIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVFJBNHg0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcCA9IFByb2Nlc3NJbnRyYTR4NFJlc2lkdWFsKHBNYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbmVkSW50cmFQcmVkRmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWJMYXllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJySW1hZ2UpOwotICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRtcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChoMjY0YnNkTWJQYXJ0UHJlZE1vZGUobWJUeXBlKSA9PSBQUkVEX01PREVfSU5UUkExNngxNikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXAgPSBQcm9jZXNzSW50cmExNngxNlJlc2lkdWFsKHBNYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbmVkSW50cmFQcmVkRmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWJMYXllci0+bWJQcmVkLmludHJhQ2hyb21hUHJlZE1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBTcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyckltYWdlKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0bXApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0bXAgPSBQcm9jZXNzQ2hyb21hUmVzaWR1YWwocE1iLCBkYXRhLCAmcFNyYyk7Ci0KLSNlbHNlCi0gICAgICAgICAgICB0bXAgPSBQcm9jZXNzUmVzaWR1YWwocE1iLCBwTWJMYXllci0+cmVzaWR1YWwubGV2ZWwsCi0gICAgICAgICAgICAgICAgcE1iTGF5ZXItPnJlc2lkdWFsLmNvZWZmTWFwKTsKLSNlbmRpZgotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuICh0bXApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgSDI2NFN3RGVjTWVtc2V0KHBNYi0+dG90YWxDb2VmZiwgMCwgMjcqc2l6ZW9mKCpwTWItPnRvdGFsQ29lZmYpKTsKLSAgICAgICAgICAgIHBNYi0+cXBZID0gKHUzMikqcXBZOwotICAgICAgICB9Ci0jaWZkZWYgSDI2NERFQ19PTVhETAotICAgICAgICAvKiBpZiBkZWNvZGVkIGZsYWcgPiAxIC0+IG1iIGhhcyBhbHJlYWR5IGJlZW4gc3VjY2Vzc2Z1bGx5IGRlY29kZWQgYW5kCi0gICAgICAgICAqIHdyaXR0ZW4gdG8gb3V0cHV0IC0+IGRvIG5vdCB3cml0ZSBhZ2FpbiAqLwotICAgICAgICBpZiAocE1iLT5kZWNvZGVkID4gMSkKLSAgICAgICAgICAgIHJldHVybiBIQU5UUk9fT0s7Ci0KLSAgICAgICAgaDI2NGJzZFdyaXRlTWFjcm9ibG9jayhjdXJySW1hZ2UsIGRhdGEpOwotI2Vsc2UKLSAgICAgICAgaWYgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShtYlR5cGUpICE9IFBSRURfTU9ERV9JTlRFUikKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gaDI2NGJzZEludHJhUHJlZGljdGlvbihwTWIsIHBNYkxheWVyLCBjdXJySW1hZ2UsIG1iTnVtLAotICAgICAgICAgICAgICAgIGNvbnN0cmFpbmVkSW50cmFQcmVkRmxhZywgKHU4KilkYXRhKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKSByZXR1cm4gKHRtcCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkSW50ZXJQcmVkaWN0aW9uKHBNYiwgcE1iTGF5ZXIsIGRwYiwgbWJOdW0sCi0gICAgICAgICAgICAgICAgY3VyckltYWdlLCAodTgqKWRhdGEpOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spIHJldHVybiAodG1wKTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgfQotCi0gICAgcmV0dXJuIEhBTlRST19PSzsKLX0KLQotCi0jaWZkZWYgSDI2NERFQ19PTVhETAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IFByb2Nlc3NDaHJvbWFSZXNpZHVhbAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUHJvY2VzcyB0aGUgcmVzaWR1YWwgZGF0YSBvZiBjaHJvbWEgd2l0aAotICAgICAgICAgIGludmVyc2UgcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIHRyYW5zZm9ybS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXUzMiBQcm9jZXNzQ2hyb21hUmVzaWR1YWwobWJTdG9yYWdlX3QgKnBNYiwgdTggKmRhdGEsIGNvbnN0IHU4ICoqcFNyYyApCi17Ci0gICAgdTMyIGk7Ci0gICAgdTMyIGNocm9tYVFwOwotICAgIGkxNiAqcERjOwotICAgIGkxNiBkY1s0ICsgNF0gPSB7MCwwLDAsMCwwLDAsMCwwfTsKLSAgICB1OCAqdG90YWxDb2VmZjsKLSAgICBPTVhSZXN1bHQgcmVzdWx0OwotICAgIHU4ICpwOwotCi0gICAgLyogY2hyb21hIERDIHByb2Nlc3NpbmcuIEZpcnN0IGNocm9tYSBkYyBibG9jayBpcyBibG9jayB3aXRoIGluZGV4IDI1ICovCi0gICAgY2hyb21hUXAgPQotICAgICAgICBoMjY0YnNkUXBDW0NMSVAzKDAsIDUxLCAoaTMyKXBNYi0+cXBZICsgcE1iLT5jaHJvbWFRcEluZGV4T2Zmc2V0KV07Ci0KLSAgICBpZiAocE1iLT50b3RhbENvZWZmWzI1XSkKLSAgICB7Ci0gICAgICAgIHBEYyA9IGRjOwotICAgICAgICByZXN1bHQgPSBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyKAotICAgICAgICAgICAgICAgIHBTcmMsCi0gICAgICAgICAgICAgICAgcERjLAotICAgICAgICAgICAgICAgIChpMzIpY2hyb21hUXApOwotICAgICAgICBpZiAocmVzdWx0ICE9IE9NWF9TdHNfTm9FcnIpCi0gICAgICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOwotICAgIH0KLSAgICBpZiAocE1iLT50b3RhbENvZWZmWzI2XSkKLSAgICB7Ci0gICAgICAgIHBEYyA9IGRjKzQ7Ci0gICAgICAgIHJlc3VsdCA9IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIoCi0gICAgICAgICAgICAgICAgcFNyYywKLSAgICAgICAgICAgICAgICBwRGMsCi0gICAgICAgICAgICAgICAgKGkzMiljaHJvbWFRcCk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gT01YX1N0c19Ob0VycikKLSAgICAgICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgcERjID0gZGM7Ci0gICAgdG90YWxDb2VmZiA9IHBNYi0+dG90YWxDb2VmZiArIDE2OwotICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyssIHBEYysrLCB0b3RhbENvZWZmKyspCi0gICAgewotICAgICAgICAvKiBjaHJvbWEgcHJlZGljdGlvbiAqLwotICAgICAgICBpZiAoKnRvdGFsQ29lZmYgfHwgKnBEYykKLSAgICAgICAgewotICAgICAgICAgICAgcCA9IGRhdGEgKyBjaHJvbWFJbmRleFtpXTsKLSAgICAgICAgICAgIHJlc3VsdCA9IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQoCi0gICAgICAgICAgICAgICAgICAgIHBTcmMsCi0gICAgICAgICAgICAgICAgICAgIHAsCi0gICAgICAgICAgICAgICAgICAgIHBEYywKLSAgICAgICAgICAgICAgICAgICAgcCwKLSAgICAgICAgICAgICAgICAgICAgOCwKLSAgICAgICAgICAgICAgICAgICAgOCwKLSAgICAgICAgICAgICAgICAgICAgKGkzMiljaHJvbWFRcCwKLSAgICAgICAgICAgICAgICAgICAgKnRvdGFsQ29lZmYpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBPTVhfU3RzX05vRXJyKQotICAgICAgICAgICAgICAgIHJldHVybiAoSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBQcm9jZXNzSW50cmExNngxNlJlc2lkdWFsCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBQcm9jZXNzIHRoZSByZXNpZHVhbCBkYXRhIG9mIGx1bWEgd2l0aAotICAgICAgICAgIGludmVyc2UgcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIHRyYW5zZm9ybS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXUzMiBQcm9jZXNzSW50cmExNngxNlJlc2lkdWFsKG1iU3RvcmFnZV90ICpwTWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBpbnRyYUNocm9tYVByZWRNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTgqKiBwU3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfdCAqaW1hZ2UpCi17Ci0gICAgdTMyIGk7Ci0gICAgaTE2ICpwRGM7Ci0gICAgaTE2IGRjWzE2XSA9IHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfTsKLSAgICB1OCAqdG90YWxDb2VmZjsKLSAgICBPTVhSZXN1bHQgcmVzdWx0OwotICAgIHU4ICpwOwotCi0gICAgdG90YWxDb2VmZiA9IHBNYi0+dG90YWxDb2VmZjsKLQotICAgIGlmICh0b3RhbENvZWZmWzI0XSkKLSAgICB7Ci0gICAgICAgIHBEYyA9IGRjOwotICAgICAgICByZXN1bHQgPSBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcigKLSAgICAgICAgICAgICAgICAgICAgcFNyYywKLSAgICAgICAgICAgICAgICAgICAgcERjLAotICAgICAgICAgICAgICAgICAgICAoaTMyKXBNYi0+cXBZKTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBPTVhfU3RzX05vRXJyKQotICAgICAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKLSAgICB9Ci0gICAgLyogSW50cmEgMTZ4MTYgcHJlZCAqLwotICAgIGlmIChoMjY0YnNkSW50cmExNngxNlByZWRpY3Rpb24ocE1iLCBkYXRhLCBpbWFnZS0+bHVtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZS0+d2lkdGgqMTYsIGNvbnN0cmFpbmVkSW50cmFQcmVkKSAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKywgdG90YWxDb2VmZisrKQotICAgIHsKLSAgICAgICAgcCA9IGRhdGEgKyBsdW1hSW5kZXhbaV07Ci0gICAgICAgIHBEYyA9ICZkY1tkY0NvZWZmSW5kZXhbaV1dOwotICAgICAgICBpZiAoKnRvdGFsQ29lZmYgfHwgKnBEYykKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCgKLSAgICAgICAgICAgICAgICAgICAgcFNyYywKLSAgICAgICAgICAgICAgICAgICAgcCwKLSAgICAgICAgICAgICAgICAgICAgcERjLAotICAgICAgICAgICAgICAgICAgICBwLAotICAgICAgICAgICAgICAgICAgICAxNiwKLSAgICAgICAgICAgICAgICAgICAgMTYsCi0gICAgICAgICAgICAgICAgICAgIChpMzIpcE1iLT5xcFksCi0gICAgICAgICAgICAgICAgICAgICp0b3RhbENvZWZmKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT01YX1N0c19Ob0VycikKLSAgICAgICAgICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGgyNjRic2RJbnRyYUNocm9tYVByZWRpY3Rpb24ocE1iLCBkYXRhICsgMjU2LAotICAgICAgICAgICAgICAgIGltYWdlLAotICAgICAgICAgICAgICAgIGludHJhQ2hyb21hUHJlZE1vZGUsCi0gICAgICAgICAgICAgICAgY29uc3RyYWluZWRJbnRyYVByZWQpICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgcmV0dXJuIEhBTlRST19PSzsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBQcm9jZXNzSW50cmE0eDRSZXNpZHVhbAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgUHJvY2VzcyB0aGUgcmVzaWR1YWwgZGF0YSBvZiBsdW1hIHdpdGgKLSAgICAgICAgICBpbnZlcnNlIHF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSB0cmFuc2Zvcm0uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11MzIgUHJvY2Vzc0ludHJhNHg0UmVzaWR1YWwobWJTdG9yYWdlX3QgKnBNYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgY29uc3RyYWluZWRJbnRyYVByZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja0xheWVyX3QgKm1iTGF5ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKipwU3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3QgKmltYWdlKQotewotICAgIHUzMiBpOwotICAgIHU4ICp0b3RhbENvZWZmOwotICAgIE9NWFJlc3VsdCByZXN1bHQ7Ci0gICAgdTggKnA7Ci0KLSAgICB0b3RhbENvZWZmID0gcE1iLT50b3RhbENvZWZmOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyssIHRvdGFsQ29lZmYrKykKLSAgICB7Ci0gICAgICAgIHAgPSBkYXRhICsgbHVtYUluZGV4W2ldOwotICAgICAgICBpZiAoaDI2NGJzZEludHJhNHg0UHJlZGljdGlvbihwTWIsIHAsIG1iTGF5ZXIsIGltYWdlLT5sdW1hLAotICAgICAgICAgICAgICAgICAgICBpbWFnZS0+d2lkdGgqMTYsIGNvbnN0cmFpbmVkSW50cmFQcmVkLCBpKSAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAgICAgaWYgKCp0b3RhbENvZWZmKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkKAotICAgICAgICAgICAgICAgICAgICBwU3JjLAotICAgICAgICAgICAgICAgICAgICBwLAotICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICBwLAotICAgICAgICAgICAgICAgICAgICAxNiwKLSAgICAgICAgICAgICAgICAgICAgMTYsCi0gICAgICAgICAgICAgICAgICAgIChpMzIpcE1iLT5xcFksCi0gICAgICAgICAgICAgICAgICAgICp0b3RhbENvZWZmKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT01YX1N0c19Ob0VycikKLSAgICAgICAgICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGgyNjRic2RJbnRyYUNocm9tYVByZWRpY3Rpb24ocE1iLCBkYXRhICsgMjU2LAotICAgICAgICAgICAgICAgIGltYWdlLAotICAgICAgICAgICAgICAgIG1iTGF5ZXItPm1iUHJlZC5pbnRyYUNocm9tYVByZWRNb2RlLAotICAgICAgICAgICAgICAgIGNvbnN0cmFpbmVkSW50cmFQcmVkKSAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHJldHVybiBIQU5UUk9fT0s7Ci19Ci0KLSNlbHNlIC8qIEgyNjRERUNfT01YREwgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBQcm9jZXNzUmVzaWR1YWwKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFByb2Nlc3MgdGhlIHJlc2lkdWFsIGRhdGEgb2Ygb25lIG1hY3JvYmxvY2sgd2l0aAotICAgICAgICAgIGludmVyc2UgcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIHRyYW5zZm9ybS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIFByb2Nlc3NSZXNpZHVhbChtYlN0b3JhZ2VfdCAqcE1iLCBpMzIgcmVzaWR1YWxMZXZlbFtdWzE2XSwgdTMyICpjb2VmZk1hcCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLSAgICB1MzIgY2hyb21hUXA7Ci0gICAgaTMyICgqYmxvY2tEYXRhKVsxNl07Ci0gICAgaTMyICgqYmxvY2tEYylbMTZdOwotICAgIGkxNiAqdG90YWxDb2VmZjsKLSAgICBpMzIgKmNocm9tYURjOwotICAgIGNvbnN0IHUzMiAqZGNDb2VmZklkeDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBNYik7Ci0gICAgQVNTRVJUKHJlc2lkdWFsTGV2ZWwpOwotCi0gICAgLyogc2V0IHBvaW50ZXJzIHRvIERDIGNvZWZmaWNpZW50IGJsb2NrcyAqLwotICAgIGJsb2NrRGMgPSByZXNpZHVhbExldmVsICsgMjQ7Ci0KLSAgICBibG9ja0RhdGEgPSByZXNpZHVhbExldmVsOwotICAgIHRvdGFsQ29lZmYgPSBwTWItPnRvdGFsQ29lZmY7Ci0gICAgaWYgKGgyNjRic2RNYlBhcnRQcmVkTW9kZShwTWItPm1iVHlwZSkgPT0gUFJFRF9NT0RFX0lOVFJBMTZ4MTYpCi0gICAgewotICAgICAgICBpZiAodG90YWxDb2VmZlsyNF0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGgyNjRic2RQcm9jZXNzTHVtYURjKCpibG9ja0RjLCBwTWItPnFwWSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGNDb2VmZklkeCA9IGRjQ29lZmZJbmRleDsKLQotICAgICAgICBmb3IgKGkgPSAxNjsgaS0tOyBibG9ja0RhdGErKywgdG90YWxDb2VmZisrLCBjb2VmZk1hcCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBzZXQgZGMgY29lZmZpY2llbnQgb2YgbHVtYSBibG9jayAqLwotICAgICAgICAgICAgKCpibG9ja0RhdGEpWzBdID0gKCpibG9ja0RjKVsqZGNDb2VmZklkeCsrXTsKLSAgICAgICAgICAgIGlmICgoKmJsb2NrRGF0YSlbMF0gfHwgKnRvdGFsQ29lZmYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGgyNjRic2RQcm9jZXNzQmxvY2soKmJsb2NrRGF0YSwgcE1iLT5xcFksIDEsICpjb2VmZk1hcCkgIT0KLSAgICAgICAgICAgICAgICAgICAgSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgTUFSS19SRVNJRFVBTF9FTVBUWSgqYmxvY2tEYXRhKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmb3IgKGkgPSAxNjsgaS0tOyBibG9ja0RhdGErKywgdG90YWxDb2VmZisrLCBjb2VmZk1hcCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKnRvdGFsQ29lZmYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGgyNjRic2RQcm9jZXNzQmxvY2soKmJsb2NrRGF0YSwgcE1iLT5xcFksIDAsICpjb2VmZk1hcCkgIT0KLSAgICAgICAgICAgICAgICAgICAgSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgTUFSS19SRVNJRFVBTF9FTVBUWSgqYmxvY2tEYXRhKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIGNocm9tYSBEQyBwcm9jZXNzaW5nLiBGaXJzdCBjaHJvbWEgZGMgYmxvY2sgaXMgYmxvY2sgd2l0aCBpbmRleCAyNSAqLwotICAgIGNocm9tYVFwID0KLSAgICAgICAgaDI2NGJzZFFwQ1tDTElQMygwLCA1MSwgKGkzMilwTWItPnFwWSArIHBNYi0+Y2hyb21hUXBJbmRleE9mZnNldCldOwotICAgIGlmIChwTWItPnRvdGFsQ29lZmZbMjVdIHx8IHBNYi0+dG90YWxDb2VmZlsyNl0pCi0gICAgICAgIGgyNjRic2RQcm9jZXNzQ2hyb21hRGMocmVzaWR1YWxMZXZlbFsyNV0sIGNocm9tYVFwKTsKLSAgICBjaHJvbWFEYyA9IHJlc2lkdWFsTGV2ZWxbMjVdOwotICAgIGZvciAoaSA9IDg7IGktLTsgYmxvY2tEYXRhKyssIHRvdGFsQ29lZmYrKywgY29lZmZNYXArKykKLSAgICB7Ci0gICAgICAgIC8qIHNldCBkYyBjb2VmZmljaWVudCBvZiBjaHJvbWEgYmxvY2sgKi8KLSAgICAgICAgKCpibG9ja0RhdGEpWzBdID0gKmNocm9tYURjKys7Ci0gICAgICAgIGlmICgoKmJsb2NrRGF0YSlbMF0gfHwgKnRvdGFsQ29lZmYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChoMjY0YnNkUHJvY2Vzc0Jsb2NrKCpibG9ja0RhdGEsIGNocm9tYVFwLCAxLCpjb2VmZk1hcCkgIT0KLSAgICAgICAgICAgICAgICBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIE1BUktfUkVTSURVQUxfRU1QVFkoKmJsb2NrRGF0YSk7Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci19Ci0jZW5kaWYgLyogSDI2NERFQ19PTVhETCAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RTdWJNYlBhcnRNb2RlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBSZXR1cm5zIHRoZSBtYWNyb2Jsb2NrJ3Mgc3ViLXBhcnRpdGlvbiBtb2RlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdWJNYlBhcnRNb2RlX2UgaDI2NGJzZFN1Yk1iUGFydE1vZGUoc3ViTWJUeXBlX2Ugc3ViTWJUeXBlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoc3ViTWJUeXBlIDwgNCk7Ci0KLSAgICByZXR1cm4oKHN1Yk1iUGFydE1vZGVfZSlzdWJNYlR5cGUpOwotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYmMzNDAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX21hY3JvYmxvY2tfbGF5ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX01BQ1JPQkxPQ0tfTEFZRVJfSAotI2RlZmluZSBIMjY0U1dERUNfTUFDUk9CTE9DS19MQVlFUl9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgotI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2RwYi5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBNYWNybyB0byBkZXRlcm1pbmUgaWYgYSBtYiBpcyBhbiBpbnRyYSBtYiAqLwotI2RlZmluZSBJU19JTlRSQV9NQihhKSAoKGEpLm1iVHlwZSA+IDUpCi0KLS8qIE1hY3JvIHRvIGRldGVybWluZSBpZiBhIG1iIGlzIGFuIElfUENNIG1iICovCi0jZGVmaW5lIElTX0lfUENNX01CKGEpICgoYSkubWJUeXBlID09IDMxKQotCi10eXBlZGVmIGVudW0gewotICAgIFBfU2tpcCAgICAgICAgICA9IDAsCi0gICAgUF9MMF8xNngxNiAgICAgID0gMSwKLSAgICBQX0wwX0wwXzE2eDggICAgPSAyLAotICAgIFBfTDBfTDBfOHgxNiAgICA9IDMsCi0gICAgUF84eDggICAgICAgICAgID0gNCwKLSAgICBQXzh4OHJlZjAgICAgICAgPSA1LAotICAgIElfNHg0ICAgICAgICAgICA9IDYsCi0gICAgSV8xNngxNl8wXzBfMCAgID0gNywKLSAgICBJXzE2eDE2XzFfMF8wICAgPSA4LAotICAgIElfMTZ4MTZfMl8wXzAgICA9IDksCi0gICAgSV8xNngxNl8zXzBfMCAgID0gMTAsCi0gICAgSV8xNngxNl8wXzFfMCAgID0gMTEsCi0gICAgSV8xNngxNl8xXzFfMCAgID0gMTIsCi0gICAgSV8xNngxNl8yXzFfMCAgID0gMTMsCi0gICAgSV8xNngxNl8zXzFfMCAgID0gMTQsCi0gICAgSV8xNngxNl8wXzJfMCAgID0gMTUsCi0gICAgSV8xNngxNl8xXzJfMCAgID0gMTYsCi0gICAgSV8xNngxNl8yXzJfMCAgID0gMTcsCi0gICAgSV8xNngxNl8zXzJfMCAgID0gMTgsCi0gICAgSV8xNngxNl8wXzBfMSAgID0gMTksCi0gICAgSV8xNngxNl8xXzBfMSAgID0gMjAsCi0gICAgSV8xNngxNl8yXzBfMSAgID0gMjEsCi0gICAgSV8xNngxNl8zXzBfMSAgID0gMjIsCi0gICAgSV8xNngxNl8wXzFfMSAgID0gMjMsCi0gICAgSV8xNngxNl8xXzFfMSAgID0gMjQsCi0gICAgSV8xNngxNl8yXzFfMSAgID0gMjUsCi0gICAgSV8xNngxNl8zXzFfMSAgID0gMjYsCi0gICAgSV8xNngxNl8wXzJfMSAgID0gMjcsCi0gICAgSV8xNngxNl8xXzJfMSAgID0gMjgsCi0gICAgSV8xNngxNl8yXzJfMSAgID0gMjksCi0gICAgSV8xNngxNl8zXzJfMSAgID0gMzAsCi0gICAgSV9QQ00gICAgICAgICAgID0gMzEKLX0gbWJUeXBlX2U7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gICAgUF9MMF84eDggPSAwLAotICAgIFBfTDBfOHg0ID0gMSwKLSAgICBQX0wwXzR4OCA9IDIsCi0gICAgUF9MMF80eDQgPSAzCi19IHN1Yk1iVHlwZV9lOwotCi10eXBlZGVmIGVudW0gewotICAgIE1CX1BfMTZ4MTYgPSAwLAotICAgIE1CX1BfMTZ4OCwKLSAgICBNQl9QXzh4MTYsCi0gICAgTUJfUF84eDgKLX0gbWJQYXJ0TW9kZV9lOwotCi10eXBlZGVmIGVudW0gewotICAgIE1CX1NQXzh4OCA9IDAsCi0gICAgTUJfU1BfOHg0LAotICAgIE1CX1NQXzR4OCwKLSAgICBNQl9TUF80eDQKLX0gc3ViTWJQYXJ0TW9kZV9lOwotCi10eXBlZGVmIGVudW0gewotICAgIFBSRURfTU9ERV9JTlRSQTR4NCA9IDAsCi0gICAgUFJFRF9NT0RFX0lOVFJBMTZ4MTYgICwKLSAgICBQUkVEX01PREVfSU5URVIKLX0gbWJQYXJ0UHJlZE1vZGVfZTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qIE12UHJlZGljdGlvbjE2eDE2IGFzc3VtZXMgdGhhdCBNVnMgYXJlIDE2Yml0cyAqLwotICAgIGkxNiBob3I7Ci0gICAgaTE2IHZlcjsKLX0gbXZfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgcHJldkludHJhNHg0UHJlZE1vZGVGbGFnWzE2XTsKLSAgICB1MzIgcmVtSW50cmE0eDRQcmVkTW9kZVsxNl07Ci0gICAgdTMyIGludHJhQ2hyb21hUHJlZE1vZGU7Ci0gICAgdTMyIHJlZklkeEwwWzRdOwotICAgIG12X3QgbXZkTDBbNF07Ci19IG1iUHJlZF90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHN1Yk1iVHlwZV9lIHN1Yk1iVHlwZVs0XTsKLSAgICB1MzIgcmVmSWR4TDBbNF07Ci0gICAgbXZfdCBtdmRMMFs0XVs0XTsKLX0gc3ViTWJQcmVkX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0jaWZkZWYgSDI2NERFQ19PTVhETAotICAgIHU4IHBvc0NvZWZCdWZbMjcqMTYqM107Ci0gICAgdTggdG90YWxDb2VmZlsyN107Ci0jZWxzZQotICAgIGkxNiB0b3RhbENvZWZmWzI3XTsKLSNlbmRpZgotICAgIGkzMiBsZXZlbFsyNl1bMTZdOwotICAgIHUzMiBjb2VmZk1hcFsyNF07Ci19IHJlc2lkdWFsX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgbWJUeXBlX2UgbWJUeXBlOwotICAgIHUzMiBjb2RlZEJsb2NrUGF0dGVybjsKLSAgICBpMzIgbWJRcERlbHRhOwotICAgIG1iUHJlZF90IG1iUHJlZDsKLSAgICBzdWJNYlByZWRfdCBzdWJNYlByZWQ7Ci0gICAgcmVzaWR1YWxfdCByZXNpZHVhbDsKLX0gbWFjcm9ibG9ja0xheWVyX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IG1iU3RvcmFnZQotewotICAgIG1iVHlwZV9lIG1iVHlwZTsKLSAgICB1MzIgc2xpY2VJZDsKLSAgICB1MzIgZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGM7Ci0gICAgaTMyIGZpbHRlck9mZnNldEE7Ci0gICAgaTMyIGZpbHRlck9mZnNldEI7Ci0gICAgdTMyIHFwWTsKLSAgICBpMzIgY2hyb21hUXBJbmRleE9mZnNldDsKLSNpZmRlZiBIMjY0REVDX09NWERMCi0gICAgdTggdG90YWxDb2VmZlsyN107Ci0jZWxzZQotICAgIGkxNiB0b3RhbENvZWZmWzI3XTsKLSNlbmRpZgotICAgIHU4IGludHJhNHg0UHJlZE1vZGVbMTZdOwotICAgIHUzMiByZWZQaWNbNF07Ci0gICAgdTgqIHJlZkFkZHJbNF07Ci0gICAgbXZfdCBtdlsxNl07Ci0gICAgdTMyIGRlY29kZWQ7Ci0gICAgc3RydWN0IG1iU3RvcmFnZSAqbWJBOwotICAgIHN0cnVjdCBtYlN0b3JhZ2UgKm1iQjsKLSAgICBzdHJ1Y3QgbWJTdG9yYWdlICptYkM7Ci0gICAgc3RydWN0IG1iU3RvcmFnZSAqbWJEOwotfSBtYlN0b3JhZ2VfdDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZU1hY3JvYmxvY2tMYXllcihzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gICAgbWFjcm9ibG9ja0xheWVyX3QgKnBNYkxheWVyLCBtYlN0b3JhZ2VfdCAqcE1iLCB1MzIgc2xpY2VUeXBlLAotICAgIHUzMiBudW1SZWZJZHhBY3RpdmUpOwotCi11MzIgaDI2NGJzZE51bU1iUGFydChtYlR5cGVfZSBtYlR5cGUpOwotdTMyIGgyNjRic2ROdW1TdWJNYlBhcnQoc3ViTWJUeXBlX2Ugc3ViTWJUeXBlKTsKLQotc3ViTWJQYXJ0TW9kZV9lIGgyNjRic2RTdWJNYlBhcnRNb2RlKHN1Yk1iVHlwZV9lIHN1Yk1iVHlwZSk7Ci0KLXUzMiBoMjY0YnNkRGVjb2RlTWFjcm9ibG9jayhtYlN0b3JhZ2VfdCAqcE1iLCBtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsCi0gICAgaW1hZ2VfdCAqY3VyckltYWdlLCBkcGJTdG9yYWdlX3QgKmRwYiwgaTMyICpxcFksIHUzMiBtYk51bSwKLSAgICB1MzIgY29uc3RyYWluZWRJbnRyYVByZWRGbGFnLCB1OCogZGF0YSk7Ci0KLXUzMiBoMjY0YnNkUHJlZE1vZGVJbnRyYTE2eDE2KG1iVHlwZV9lIG1iVHlwZSk7Ci0KLW1iUGFydFByZWRNb2RlX2UgaDI2NGJzZE1iUGFydFByZWRNb2RlKG1iVHlwZV9lIG1iVHlwZSk7Ci0jaWZkZWYgSDI2NERFQ19ORU9OCi11MzIgaDI2NGJzZENsZWFyTWJMYXllcihtYWNyb2Jsb2NrTGF5ZXJfdCAqcE1iTGF5ZXIsIHUzMiBzaXplKTsKLSNlbmRpZgotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19NQUNST0JMT0NLX0xBWUVSX0ggKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmFsX3VuaXQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uYWxfdW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDRjNDNhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uYWxfdW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBoMjY0YnNkRGVjb2RlTmFsVW5pdAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImgyNjRic2RfbmFsX3VuaXQuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZERlY29kZU5hbFVuaXQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRGVjb2RlIE5BTCB1bml0IGhlYWRlciBpbmZvcm1hdGlvbgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBwTmFsVW5pdCAgICAgICAgTkFMIHVuaXQgaGVhZGVyIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgaW52YWxpZCBOQUwgdW5pdCBoZWFkZXIgaW5mb3JtYXRpb24KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVOYWxVbml0KHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgbmFsVW5pdF90ICpwTmFsVW5pdCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocE5hbFVuaXQpOwotICAgIEFTU0VSVChwU3RybURhdGEtPmJpdFBvc0luV29yZCA9PSAwKTsKLQotICAgIC8qIGZvcmJpZGRlbl96ZXJvX2JpdCAobm90IGNoZWNrZWQgdG8gYmUgemVybywgZXJyb3JzIGlnbm9yZWQpICovCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAvKiBBc3N1bWluZyB0aGF0IE5BTCB1bml0IHN0YXJ0cyBmcm9tIGJ5dGUgYm91bmRhcnkgrT4gZG9uJ3QgaGF2ZSB0byBjaGVjawotICAgICAqIGZvbGxvd2luZyA3IGJpdHMgZm9yIEVORF9PRl9TVFJFQU0gKi8KLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMik7Ci0gICAgcE5hbFVuaXQtPm5hbFJlZklkYyA9IHRtcDsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNSk7Ci0gICAgcE5hbFVuaXQtPm5hbFVuaXRUeXBlID0gKG5hbFVuaXRUeXBlX2UpdG1wOwotCi0gICAgLyogZGF0YSBwYXJ0aXRpb25pbmcgTkFMIHVuaXRzIG5vdCBzdXBwb3J0ZWQgKi8KLSAgICBpZiAoICh0bXAgPT0gMikgfHwgKHRtcCA9PSAzKSB8fCAodG1wID09IDQpICkKLSAgICB7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICAvKiBuYWxfcmVmX2lkYyBzaGFsbCBub3QgYmUgemVybyBmb3IgdGhlc2UgbmFsX3VuaXRfdHlwZXMgKi8KLSAgICBpZiAoICggKHRtcCA9PSBOQUxfU0VRX1BBUkFNX1NFVCkgfHwgKHRtcCA9PSBOQUxfUElDX1BBUkFNX1NFVCkgfHwKLSAgICAgICAgICAgKHRtcCA9PSBOQUxfQ09ERURfU0xJQ0VfSURSKSApICYmIChwTmFsVW5pdC0+bmFsUmVmSWRjID09IDApICkKLSAgICB7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0gICAgLyogbmFsX3JlZl9pZGMgc2hhbGwgYmUgemVybyBmb3IgdGhlc2UgbmFsX3VuaXRfdHlwZXMgKi8KLSAgICBlbHNlIGlmICggKCAodG1wID09IE5BTF9TRUkpIHx8ICh0bXAgPT0gTkFMX0FDQ0VTU19VTklUX0RFTElNSVRFUikgfHwKLSAgICAgICAgICAgICAgICAodG1wID09IE5BTF9FTkRfT0ZfU0VRVUVOQ0UpIHx8ICh0bXAgPT0gTkFMX0VORF9PRl9TVFJFQU0pIHx8Ci0gICAgICAgICAgICAgICAgKHRtcCA9PSBOQUxfRklMTEVSX0RBVEEpICkgJiYgKHBOYWxVbml0LT5uYWxSZWZJZGMgIT0gMCkgKQotICAgIHsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uYWxfdW5pdC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25hbF91bml0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4OTU3YmYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25hbF91bml0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX05BTF9VTklUX0gKLSNkZWZpbmUgSDI2NFNXREVDX05BTF9VTklUX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIG1hY3JvIHRvIGRldGVybWluZSBpZiBOQUwgdW5pdCBwb2ludGVkIGJ5IHBOYWxVbml0IGNvbnRhaW5zIGFuIElEUiBzbGljZSAqLwotI2RlZmluZSBJU19JRFJfTkFMX1VOSVQocE5hbFVuaXQpIFwKLSAgICAoKHBOYWxVbml0KS0+bmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUikKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi10eXBlZGVmIGVudW0gewotICAgIE5BTF9DT0RFRF9TTElDRSA9IDEsCi0gICAgTkFMX0NPREVEX1NMSUNFX0lEUiA9IDUsCi0gICAgTkFMX1NFSSA9IDYsCi0gICAgTkFMX1NFUV9QQVJBTV9TRVQgPSA3LAotICAgIE5BTF9QSUNfUEFSQU1fU0VUID0gOCwKLSAgICBOQUxfQUNDRVNTX1VOSVRfREVMSU1JVEVSID0gOSwKLSAgICBOQUxfRU5EX09GX1NFUVVFTkNFID0gMTAsCi0gICAgTkFMX0VORF9PRl9TVFJFQU0gPSAxMSwKLSAgICBOQUxfRklMTEVSX0RBVEEgPSAxMiwKLSAgICBOQUxfTUFYX1RZUEVfVkFMVUUgPSAzMQotfSBuYWxVbml0VHlwZV9lOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGU7Ci0gICAgdTMyIG5hbFJlZklkYzsKLX0gbmFsVW5pdF90OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlTmFsVW5pdChzdHJtRGF0YV90ICpwU3RybURhdGEsIG5hbFVuaXRfdCAqcE5hbFVuaXQpOwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19OQUxfVU5JVF9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uZWlnaGJvdXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9uZWlnaGJvdXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U1ZWVmZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmVpZ2hib3VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIGgyNjRic2RJbml0TWJOZWlnaGJvdXJzCi0gICAgICAgICAgaDI2NGJzZEdldE5laWdoYm91ck1iCi0gICAgICAgICAgaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQQotICAgICAgICAgIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0IKLSAgICAgICAgICBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tDCi0gICAgICAgICAgaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrRAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImgyNjRic2RfbmVpZ2hib3VyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEZvbGxvd2luZyBmb3VyIHRhYmxlcyBpbmRpY2F0ZSBuZWlnaGJvdXJzIG9mIGVhY2ggYmxvY2sgb2YgYSBtYWNyb2Jsb2NrLgotICogRmlyc3QgMTYgdmFsdWVzIGFyZSBmb3IgbHVtYSBibG9ja3MsIG5leHQgNCB2YWx1ZXMgZm9yIENiIGFuZCBsYXN0IDQKLSAqIHZhbHVlcyBmb3IgQ3IuIEVsZW1lbnRzIG9mIHRoZSB0YWJsZSBpbmRpY2F0ZSB0byB3aGljaCBtYWNyb2Jsb2NrIHRoZQotICogbmVpZ2hib3VyIGJsb2NrIGJlbG9uZ3MgYW5kIHRoZSBpbmRleCBvZiB0aGUgbmVpZ2hib3VyIGJsb2NrIGluIHF1ZXN0aW9uLgotICogSW5kZXhpbmcgb2YgdGhlIGJsb2NrcyBnb2VzIGFzIGZvbGxvd3MKLSAqCi0gKiAgICAgICAgICBZICAgICAgICAgICAgIENiICAgICAgIENyCi0gKiAgICAgIDAgIDEgIDQgIDUgICAgICAxNiAxNyAgICAyMCAyMQotICogICAgICAyICAzICA2ICA3ICAgICAgMTggMTkgICAgMjIgMjMKLSAqICAgICAgOCAgOSAxMiAxMwotICogICAgIDEwIDExIDE0IDE1Ci0gKi8KLQotLyogbGVmdCBuZWlnaGJvdXIgZm9yIGVhY2ggYmxvY2sgKi8KLXN0YXRpYyBjb25zdCBuZWlnaGJvdXJfdCBOX0FfNHg0QlsyNF0gPSB7Ci0gICAge01CX0EsNX0sICAgIHtNQl9DVVJSLDB9LCB7TUJfQSw3fSwgICAge01CX0NVUlIsMn0sCi0gICAge01CX0NVUlIsMX0sIHtNQl9DVVJSLDR9LCB7TUJfQ1VSUiwzfSwge01CX0NVUlIsNn0sCi0gICAge01CX0EsMTN9LCAgIHtNQl9DVVJSLDh9LCB7TUJfQSwxNX0sICAge01CX0NVUlIsMTB9LAotICAgIHtNQl9DVVJSLDl9LCB7TUJfQ1VSUiwxMn0se01CX0NVUlIsMTF9LHtNQl9DVVJSLDE0fSwKLSAgICB7TUJfQSwxN30sICAge01CX0NVUlIsMTZ9LHtNQl9BLDE5fSwgICB7TUJfQ1VSUiwxOH0sCi0gICAge01CX0EsMjF9LCAgIHtNQl9DVVJSLDIwfSx7TUJfQSwyM30sICAge01CX0NVUlIsMjJ9IH07Ci0KLS8qIGFib3ZlIG5laWdoYm91ciBmb3IgZWFjaCBibG9jayAqLwotc3RhdGljIGNvbnN0IG5laWdoYm91cl90IE5fQl80eDRCWzI0XSA9IHsKLSAgICB7TUJfQiwxMH0sICAge01CX0IsMTF9LCAgIHtNQl9DVVJSLDB9LCB7TUJfQ1VSUiwxfSwKLSAgICB7TUJfQiwxNH0sICAge01CX0IsMTV9LCAgIHtNQl9DVVJSLDR9LCB7TUJfQ1VSUiw1fSwKLSAgICB7TUJfQ1VSUiwyfSwge01CX0NVUlIsM30sIHtNQl9DVVJSLDh9LCB7TUJfQ1VSUiw5fSwKLSAgICB7TUJfQ1VSUiw2fSwge01CX0NVUlIsN30sIHtNQl9DVVJSLDEyfSx7TUJfQ1VSUiwxM30sCi0gICAge01CX0IsMTh9LCAgIHtNQl9CLDE5fSwgICB7TUJfQ1VSUiwxNn0se01CX0NVUlIsMTd9LAotICAgIHtNQl9CLDIyfSwgICB7TUJfQiwyM30sICAge01CX0NVUlIsMjB9LHtNQl9DVVJSLDIxfSB9OwotCi0vKiBhYm92ZS1yaWdodCBuZWlnaGJvdXIgZm9yIGVhY2ggYmxvY2sgKi8KLXN0YXRpYyBjb25zdCBuZWlnaGJvdXJfdCBOX0NfNHg0QlsyNF0gPSB7Ci0gICAge01CX0IsMTF9LCAgIHtNQl9CLDE0fSwgICB7TUJfQ1VSUiwxfSwge01CX05BLDR9LAotICAgIHtNQl9CLDE1fSwgICB7TUJfQywxMH0sICAge01CX0NVUlIsNX0sIHtNQl9OQSwwfSwKLSAgICB7TUJfQ1VSUiwzfSwge01CX0NVUlIsNn0sIHtNQl9DVVJSLDl9LCB7TUJfTkEsMTJ9LAotICAgIHtNQl9DVVJSLDd9LCB7TUJfTkEsMn0sICAge01CX0NVUlIsMTN9LHtNQl9OQSw4fSwKLSAgICB7TUJfQiwxOX0sICAge01CX0MsMTh9LCAgIHtNQl9DVVJSLDE3fSx7TUJfTkEsMTZ9LAotICAgIHtNQl9CLDIzfSwgICB7TUJfQywyMn0sICAge01CX0NVUlIsMjF9LHtNQl9OQSwyMH0gfTsKLQotLyogYWJvdmUtbGVmdCBuZWlnaGJvdXIgZm9yIGVhY2ggYmxvY2sgKi8KLXN0YXRpYyBjb25zdCBuZWlnaGJvdXJfdCBOX0RfNHg0QlsyNF0gPSB7Ci0gICAge01CX0QsMTV9LCAgIHtNQl9CLDEwfSwgICB7TUJfQSw1fSwgICAge01CX0NVUlIsMH0sCi0gICAge01CX0IsMTF9LCAgIHtNQl9CLDE0fSwgICB7TUJfQ1VSUiwxfSwge01CX0NVUlIsNH0sCi0gICAge01CX0EsN30sICAgIHtNQl9DVVJSLDJ9LCB7TUJfQSwxM30sICAge01CX0NVUlIsOH0sCi0gICAge01CX0NVUlIsM30sIHtNQl9DVVJSLDZ9LCB7TUJfQ1VSUiw5fSwge01CX0NVUlIsMTJ9LAotICAgIHtNQl9ELDE5fSwgICB7TUJfQiwxOH0sICAge01CX0EsMTd9LCAgIHtNQl9DVVJSLDE2fSwKLSAgICB7TUJfRCwyM30sICAge01CX0IsMjJ9LCAgIHtNQl9BLDIxfSwgICB7TUJfQ1VSUiwyMH0gfTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbml0TWJOZWlnaGJvdXJzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEluaXRpYWxpemUgbWFjcm9ibG9jayBuZWlnaGJvdXJzLiBGdW5jdGlvbiBzZXRzIG5laWdoYm91cgotICAgICAgICAgICAgbWFjcm9ibG9jayBwb2ludGVycyBpbiBtYWNyb2Jsb2NrIHN0cnVjdHVyZXMgdG8gcG9pbnQgdG8KLSAgICAgICAgICAgIG1hY3JvYmxvY2tzIG9uIHRoZSBsZWZ0LCBhYm92ZSwgYWJvdmUtcmlnaHQgYW5kIGFib3ZlLWxlZnQuCi0gICAgICAgICAgICBQb2ludGVycyBhcmUgc2V0IE5VTEwgaWYgdGhlIG5laWdoYm91ciBkb2VzIG5vdCBmaXQgaW50byB0aGUKLSAgICAgICAgICAgIHBpY3R1cmUuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcGljV2lkdGggICAgICAgIHdpZHRoIG9mIHRoZSBwaWN0dXJlIGluIG1hY3JvYmxvY2tzCi0gICAgICAgICAgICBwaWNTaXplSW5NYnMgICAgbm8gbmVlZCB0byBjbGFyaWZ5Ci0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHBNYlN0b3JhZ2UgICAgICBuZWlnaGJvdXIgcG9pbnRlcnMgb2YgZWFjaCBtYlN0b3JhZ2Ugc3RydWN0dXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgbm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RJbml0TWJOZWlnaGJvdXJzKG1iU3RvcmFnZV90ICpwTWJTdG9yYWdlLCB1MzIgcGljV2lkdGgsCi0gICAgdTMyIHBpY1NpemVJbk1icykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgcm93LCBjb2w7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwTWJTdG9yYWdlKTsKLSAgICBBU1NFUlQocGljV2lkdGgpOwotICAgIEFTU0VSVChwaWNXaWR0aCA8PSBwaWNTaXplSW5NYnMpOwotICAgIEFTU0VSVCgoKHBpY1NpemVJbk1icyAvIHBpY1dpZHRoKSAqIHBpY1dpZHRoKSA9PSBwaWNTaXplSW5NYnMpOwotCi0gICAgcm93ID0gY29sID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBwaWNTaXplSW5NYnM7IGkrKykKLSAgICB7Ci0KLSAgICAgICAgaWYgKGNvbCkKLSAgICAgICAgICAgIHBNYlN0b3JhZ2VbaV0ubWJBID0gcE1iU3RvcmFnZSArIGkgLSAxOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwTWJTdG9yYWdlW2ldLm1iQSA9IE5VTEw7Ci0KLSAgICAgICAgaWYgKHJvdykKLSAgICAgICAgICAgIHBNYlN0b3JhZ2VbaV0ubWJCID0gcE1iU3RvcmFnZSArIGkgLSBwaWNXaWR0aDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcE1iU3RvcmFnZVtpXS5tYkIgPSBOVUxMOwotCi0gICAgICAgIGlmIChyb3cgJiYgKGNvbCA8IHBpY1dpZHRoIC0gMSkpCi0gICAgICAgICAgICBwTWJTdG9yYWdlW2ldLm1iQyA9IHBNYlN0b3JhZ2UgKyBpIC0gKHBpY1dpZHRoIC0gMSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBNYlN0b3JhZ2VbaV0ubWJDID0gTlVMTDsKLQotICAgICAgICBpZiAocm93ICYmIGNvbCkKLSAgICAgICAgICAgIHBNYlN0b3JhZ2VbaV0ubWJEID0gcE1iU3RvcmFnZSArIGkgLSAocGljV2lkdGggKyAxKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcE1iU3RvcmFnZVtpXS5tYkQgPSBOVUxMOwotCi0gICAgICAgIGNvbCsrOwotICAgICAgICBpZiAoY29sID09IHBpY1dpZHRoKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb2wgPSAwOwotICAgICAgICAgICAgcm93Kys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkR2V0TmVpZ2hib3VyTWIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgR2V0IHBvaW50ZXIgdG8gbmVpZ2hib3VyIG1hY3JvYmxvY2suCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcE1iICAgICAgICAgcG9pbnRlciB0byBtYWNyb2Jsb2NrIHN0cnVjdHVyZSBvZiB0aGUgbWFjcm9ibG9jawotICAgICAgICAgICAgICAgICAgICAgICAgd2hvc2UgbmVpZ2hib3VyIGlzIHdhbnRlZAotICAgICAgICAgICAgbmVpZ2hib3VyICAgaW5kaWNhdGVzIHdoaWNoIG5laWdoYm91ciBpcyB3YW50ZWQKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBwb2ludGVyIHRvIG5laWdoYm91ciBtYWNyb2Jsb2NrCi0gICAgICAgICAgICBOVUxMIGlmIG5vdCBhdmFpbGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotbWJTdG9yYWdlX3QqIGgyNjRic2RHZXROZWlnaGJvdXJNYihtYlN0b3JhZ2VfdCAqcE1iLCBuZWlnaGJvdXJNYl9lIG5laWdoYm91cikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKChuZWlnaGJvdXIgPD0gTUJfQ1VSUikgfHwgKG5laWdoYm91ciA9PSBNQl9OQSkpOwotCi0gICAgaWYgKG5laWdoYm91ciA9PSBNQl9BKQotICAgICAgICByZXR1cm4ocE1iLT5tYkEpOwotICAgIGVsc2UgaWYgKG5laWdoYm91ciA9PSBNQl9CKQotICAgICAgICByZXR1cm4ocE1iLT5tYkIpOwotICAgIGVsc2UgaWYgKG5laWdoYm91ciA9PSBNQl9DKQotICAgICAgICByZXR1cm4ocE1iLT5tYkMpOwotICAgIGVsc2UgaWYgKG5laWdoYm91ciA9PSBNQl9EKQotICAgICAgICByZXR1cm4ocE1iLT5tYkQpOwotICAgIGVsc2UgaWYgKG5laWdoYm91ciA9PSBNQl9DVVJSKQotICAgICAgICByZXR1cm4ocE1iKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybihOVUxMKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0EKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgR2V0IGxlZnQgbmVpZ2hib3VyIG9mIHRoZSBibG9jay4gRnVuY3Rpb24gcmV0dXJucyBwb2ludGVyIHRvCi0gICAgICAgICAgICB0aGUgdGFibGUgZGVmaW5lZCBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIGJsb2NrSW5kZXggIGluZGljYXRlcyB0aGUgYmxvY2sgd2hvc2UgbmVpZ2hib3VycyBhcmUgd2FudGVkCi0KLSAgICAgICAgT3V0cHV0czoKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgcG9pbnRlciB0byBuZWlnaGJvdXIgc3RydWN0dXJlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWNvbnN0IG5laWdoYm91cl90KiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tBKHUzMiBibG9ja0luZGV4KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGJsb2NrSW5kZXggPCAyNCk7Ci0KLSAgICByZXR1cm4oTl9BXzR4NEIrYmxvY2tJbmRleCk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tCCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEdldCBhYm92ZSBuZWlnaGJvdXIgb2YgdGhlIGJsb2NrLiBGdW5jdGlvbiByZXR1cm5zIHBvaW50ZXIgdG8KLSAgICAgICAgICAgIHRoZSB0YWJsZSBkZWZpbmVkIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgYmxvY2tJbmRleCAgaW5kaWNhdGVzIHRoZSBibG9jayB3aG9zZSBuZWlnaGJvdXJzIGFyZSB3YW50ZWQKLQotICAgICAgICBPdXRwdXRzOgotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBwb2ludGVyIHRvIG5laWdoYm91ciBzdHJ1Y3R1cmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotY29uc3QgbmVpZ2hib3VyX3QqIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0IodTMyIGJsb2NrSW5kZXgpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoYmxvY2tJbmRleCA8IDI0KTsKLQotICAgIHJldHVybihOX0JfNHg0QitibG9ja0luZGV4KTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0MKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgR2V0IGFib3ZlLXJpZ2h0ICBuZWlnaGJvdXIgb2YgdGhlIGJsb2NrLiBGdW5jdGlvbiByZXR1cm5zIHBvaW50ZXIKLSAgICAgICAgICAgIHRvIHRoZSB0YWJsZSBkZWZpbmVkIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgYmxvY2tJbmRleCAgaW5kaWNhdGVzIHRoZSBibG9jayB3aG9zZSBuZWlnaGJvdXJzIGFyZSB3YW50ZWQKLQotICAgICAgICBPdXRwdXRzOgotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBwb2ludGVyIHRvIG5laWdoYm91ciBzdHJ1Y3R1cmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotY29uc3QgbmVpZ2hib3VyX3QqIGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0ModTMyIGJsb2NrSW5kZXgpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoYmxvY2tJbmRleCA8IDI0KTsKLQotICAgIHJldHVybihOX0NfNHg0QitibG9ja0luZGV4KTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2ROZWlnaGJvdXI0eDRCbG9ja0QKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgR2V0IGFib3ZlLWxlZnQgbmVpZ2hib3VyIG9mIHRoZSBibG9jay4gRnVuY3Rpb24gcmV0dXJucyBwb2ludGVyIHRvCi0gICAgICAgICAgICB0aGUgdGFibGUgZGVmaW5lZCBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIGJsb2NrSW5kZXggIGluZGljYXRlcyB0aGUgYmxvY2sgd2hvc2UgbmVpZ2hib3VycyBhcmUgd2FudGVkCi0KLSAgICAgICAgT3V0cHV0czoKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgcG9pbnRlciB0byBuZWlnaGJvdXIgc3RydWN0dXJlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWNvbnN0IG5laWdoYm91cl90KiBoMjY0YnNkTmVpZ2hib3VyNHg0QmxvY2tEKHUzMiBibG9ja0luZGV4KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGJsb2NrSW5kZXggPCAyNCk7Ci0KLSAgICByZXR1cm4oTl9EXzR4NEIrYmxvY2tJbmRleCk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgQ2hlY2sgaWYgbmVpZ2hib3VyIG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlLiBOZWlnaGJvdXIgbWFjcm9ibG9jawotICAgICAgICAgICAgaXMgY29uc2lkZXJlZCBhdmFpbGFibGUgaWYgaXQgaXMgd2l0aGluIHRoZSBwaWN0dXJlIGFuZCBiZWxvbmdzCi0gICAgICAgICAgICB0byB0aGUgc2FtZSBzbGljZSBhcyB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBNYiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jawotICAgICAgICAgICAgcE5laWdoYm91ciAgcG9pbnRlciB0byB0aGUgbmVpZ2hib3VyIG1hY3JvYmxvY2sKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBUUlVFICAgIG5laWdoYm91ciBpcyBhdmFpbGFibGUKLSAgICAgICAgICAgIEZBTFNFICAgbmVpZ2hib3VyIGlzIG5vdCBhdmFpbGFibGUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RJc05laWdoYm91ckF2YWlsYWJsZShtYlN0b3JhZ2VfdCAqcE1iLCBtYlN0b3JhZ2VfdCAqcE5laWdoYm91cikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLS8qIENvZGUgKi8KLQotICAgIGlmICggKHBOZWlnaGJvdXIgPT0gTlVMTCkgfHwgKHBNYi0+c2xpY2VJZCAhPSBwTmVpZ2hib3VyLT5zbGljZUlkKSApCi0gICAgICAgIHJldHVybihIQU5UUk9fRkFMU0UpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuKEhBTlRST19UUlVFKTsKLQotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmVpZ2hib3VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfbmVpZ2hib3VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZTBhZDEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX25laWdoYm91ci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19ORUlHSEJPVVJfSAotI2RlZmluZSBIMjY0U1dERUNfTkVJR0hCT1VSX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2RfbWFjcm9ibG9ja19sYXllci5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi10eXBlZGVmIGVudW0gewotICAgIE1CX0EgPSAwLAotICAgIE1CX0IsCi0gICAgTUJfQywKLSAgICBNQl9ELAotICAgIE1CX0NVUlIsCi0gICAgTUJfTkEgPSAweEZGCi19IG5laWdoYm91ck1iX2U7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBuZWlnaGJvdXJNYl9lICAgbWI7Ci0gICAgdTggICAgICAgICAgICAgaW5kZXg7Ci19IG5laWdoYm91cl90OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZEluaXRNYk5laWdoYm91cnMobWJTdG9yYWdlX3QgKnBNYlN0b3JhZ2UsIHUzMiBwaWNXaWR0aCwKLSAgICB1MzIgcGljU2l6ZUluTWJzKTsKLQotbWJTdG9yYWdlX3QqIGgyNjRic2RHZXROZWlnaGJvdXJNYihtYlN0b3JhZ2VfdCAqcE1iLCBuZWlnaGJvdXJNYl9lIG5laWdoYm91cik7Ci0KLXUzMiBoMjY0YnNkSXNOZWlnaGJvdXJBdmFpbGFibGUobWJTdG9yYWdlX3QgKnBNYiwgbWJTdG9yYWdlX3QgKnBOZWlnaGJvdXIpOwotCi1jb25zdCBuZWlnaGJvdXJfdCogaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQSh1MzIgYmxvY2tJbmRleCk7Ci1jb25zdCBuZWlnaGJvdXJfdCogaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQih1MzIgYmxvY2tJbmRleCk7Ci1jb25zdCBuZWlnaGJvdXJfdCogaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrQyh1MzIgYmxvY2tJbmRleCk7Ci1jb25zdCBuZWlnaGJvdXJfdCogaDI2NGJzZE5laWdoYm91cjR4NEJsb2NrRCh1MzIgYmxvY2tJbmRleCk7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX05FSUdIQk9VUl9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfb3JkZXJfY250LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX29yZGVyX2NudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjIzMzUyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfb3JkZXJfY250LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIGgyNjRic2REZWNvZGVQaWNPcmRlckNudAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotI2luY2x1ZGUgImgyNjRic2RfcGljX29yZGVyX2NudC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZERlY29kZVBpY09yZGVyQ250Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIENvbXB1dGUgcGljdHVyZSBvcmRlciBjb3VudCBmb3IgYSBwaWN0dXJlLiBGdW5jdGlvbiBpbXBsZW1lbnRzCi0gICAgICAgICAgICBjb21wdXRhdGlvbiBvZiBhbGwgUE9DIHR5cGVzICgwLCAxIGFuZCAyKSwgdHlwZSBpcyBvYnRhaW5lZCBmcm9tCi0gICAgICAgICAgICBzcHMuIFNlZSBzdGFuZGFyZCBmb3IgZGVzY3JpcHRpb24gb2YgdGhlIFBPQyB0eXBlcyBhbmQgaG93IFBPQyBpcwotICAgICAgICAgICAgY29tcHV0ZWQgZm9yIGVhY2ggdHlwZS4KLQotICAgICAgICAgICAgRnVuY3Rpb24gcmV0dXJucyB0aGUgbWluaW11bSBvZiB0b3AgZmllbGQgYW5kIGJvdHRvbSBmaWVsZCBwaWMKLSAgICAgICAgICAgIG9yZGVyIGNvdW50cy4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwb2MgICAgICAgICBwb2ludGVyIHRvIHByZXZpb3VzIHJlc3VsdHMKLSAgICAgICAgICAgIHNwcyAgICAgICAgIHBvaW50ZXIgdG8gc2VxdWVuY2UgcGFyYW1ldGVyIHNldAotICAgICAgICAgICAgc2xpY0hlYWRlciAgcG9pbnRlciB0byBjdXJyZW50IHNsaWNlIGhlYWRlciwgZnJhbWUgbnVtYmVyIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgcGFyYW1zIG5lZWRlZCBmb3IgUE9DIGNvbXB1dGF0aW9uCi0gICAgICAgICAgICBwTmFsVW5pdCAgICBwb2ludGVyIHRvIGN1cnJlbnQgTkFMIHVuaXQgc3RydWN0cnVlLCBmdW5jdGlvbiBuZWVkcwotICAgICAgICAgICAgICAgICAgICAgICAgdG8ga25vdyBpZiB0aGlzIGlzIGFuIElEUiBwaWN0dXJlIGFuZCBhbHNvIGlmIHRoaXMgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGEgcmVmZXJlbmNlIHBpY3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgcG9jICAgICAgICAgcmVzdWx0cyBzdG9yZWQgaGVyZSBmb3IgY29tcHV0YXRpb24gb2YgbmV4dCBQT0MKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgcGljdHVyZSBvcmRlciBjb3VudAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1pMzIgaDI2NGJzZERlY29kZVBpY09yZGVyQ250KHBvY1N0b3JhZ2VfdCAqcG9jLCBzZXFQYXJhbVNldF90ICpzcHMsCi0gICAgc2xpY2VIZWFkZXJfdCAqcFNsaWNlSGVhZGVyLCBuYWxVbml0X3QgKnBOYWxVbml0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotICAgIGkzMiBwaWNPcmRlckNudDsKLSAgICB1MzIgZnJhbWVOdW1PZmZzZXQsIGFic0ZyYW1lTnVtLCBwaWNPcmRlckNudEN5Y2xlQ250OwotICAgIHUzMiBmcmFtZU51bUluUGljT3JkZXJDbnRDeWNsZTsKLSAgICBpMzIgZXhwZWN0ZWREZWx0YVBpY09yZGVyQ250Q3ljbGU7Ci0gICAgdTMyIGNvbnRhaW5zTW1jbzU7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwb2MpOwotICAgIEFTU0VSVChzcHMpOwotICAgIEFTU0VSVChwU2xpY2VIZWFkZXIpOwotICAgIEFTU0VSVChwTmFsVW5pdCk7Ci0gICAgQVNTRVJUKHNwcy0+cGljT3JkZXJDbnRUeXBlIDw9IDIpOwotCi0jaWYgMAotICAgIC8qIEphblNhOiBJIGRvbid0IHRoaW5rIHRoaXMgaXMgbmVjZXNzYXJ5LCBkb24ndCBzZWUgYW55IHJlYXNvbiB0bwotICAgICAqIGluY3JlbWVudCBwcmV2RnJhbWVOdW0gb25lIGJ5IG9uZSBpbnN0ZWFkIG9mIG9uZSBiaWcgaW5jcmVtZW50LgotICAgICAqIEhvd2V2ZXIsIHN0YW5kYXJkIHNwZWNpZmllcyB0aGF0IHRoaXMgc2hvdWxkIGJlIGRvbmUgLT4gaWYgc29tZW9uZQotICAgICAqIGZpZ3VyZXMgb3V0IGFueSBjYXNlIHdoZW4gdGhlIG91dGNvbWUgd291bGQgYmUgZGlmZmVyZW50IGZvciBzdGVwIGJ5Ci0gICAgICogc3RlcCBpbmNyZW1lbnQsIHRoaXMgcGFydCBvZiB0aGUgY29kZSBzaG91bGQgYmUgZW5hYmxlZCAqLwotCi0gICAgLyogaWYgdGhlcmUgd2FzIGEgZ2FwIGluIGZyYW1lIG51bWJlcmluZyBhbmQgcGljT3JkZXJDbnRUeXBlIGlzIDEgb3IgMiAtPgotICAgICAqICJjb21wdXRlIiBwaWMgb3JkZXIgY291bnRzIGZvciBub24tZXhpc3RpbmcgZnJhbWVzLiBUaGVzZSBhcmUgbm90Ci0gICAgICogYWN0dWFsbHkgY29tcHV0ZWQsIGJ1dCBwcm9jZXNzIG5lZWRzIHRvIGJlIGRvbmUgdG8gdXBkYXRlIHRoZQotICAgICAqIHByZXZGcmFtZU51bSBhbmQgcHJldkZyYW1lTnVtT2Zmc2V0ICovCi0gICAgaWYgKCBzcHMtPnBpY09yZGVyQ250VHlwZSA+IDAgJiYKLSAgICAgICAgIHBTbGljZUhlYWRlci0+ZnJhbWVOdW0gIT0gcG9jLT5wcmV2RnJhbWVOdW0gJiYKLSAgICAgICAgIHBTbGljZUhlYWRlci0+ZnJhbWVOdW0gIT0gKChwb2MtPnByZXZGcmFtZU51bSArIDEpICUgc3BzLT5tYXhGcmFtZU51bSkpCi0gICAgewotCi0gICAgICAgIC8qIHVzZSB2YXJpYWJsZSBpIGZvciB1blVzZWRTaG9ydFRlcm1GcmFtZU51bSAqLwotICAgICAgICBpID0gKHBvYy0+cHJldkZyYW1lTnVtICsgMSkgJSBzcHMtPm1heEZyYW1lTnVtOwotCi0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwb2MtPnByZXZGcmFtZU51bSA+IGkpCi0gICAgICAgICAgICAgICAgZnJhbWVOdW1PZmZzZXQgPSBwb2MtPnByZXZGcmFtZU51bU9mZnNldCArIHNwcy0+bWF4RnJhbWVOdW07Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZnJhbWVOdW1PZmZzZXQgPSBwb2MtPnByZXZGcmFtZU51bU9mZnNldDsKLQotICAgICAgICAgICAgcG9jLT5wcmV2RnJhbWVOdW1PZmZzZXQgPSBmcmFtZU51bU9mZnNldDsKLSAgICAgICAgICAgIHBvYy0+cHJldkZyYW1lTnVtID0gaTsKLQotICAgICAgICAgICAgaSA9IChpICsgMSkgJSBzcHMtPm1heEZyYW1lTnVtOwotCi0gICAgICAgIH0gd2hpbGUgKGkgIT0gcFNsaWNlSGVhZGVyLT5mcmFtZU51bSk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvKiBjaGVjayBpZiBjdXJyZW50IHNsaWNlIGluY2x1ZGVzIG1tY28gZXF1YWwgdG8gNSAqLwotICAgIGNvbnRhaW5zTW1jbzUgPSBIQU5UUk9fRkFMU0U7Ci0gICAgaWYgKHBTbGljZUhlYWRlci0+ZGVjUmVmUGljTWFya2luZy5hZGFwdGl2ZVJlZlBpY01hcmtpbmdNb2RlRmxhZykKLSAgICB7Ci0gICAgICAgIGkgPSAwOwotICAgICAgICB3aGlsZSAocFNsaWNlSGVhZGVyLT5kZWNSZWZQaWNNYXJraW5nLm9wZXJhdGlvbltpXS4KLSAgICAgICAgICAgIG1lbW9yeU1hbmFnZW1lbnRDb250cm9sT3BlcmF0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocFNsaWNlSGVhZGVyLT5kZWNSZWZQaWNNYXJraW5nLm9wZXJhdGlvbltpXS4KLSAgICAgICAgICAgICAgICBtZW1vcnlNYW5hZ2VtZW50Q29udHJvbE9wZXJhdGlvbiA9PSA1KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRhaW5zTW1jbzUgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotICAgIH0KLSAgICBzd2l0Y2ggKHNwcy0+cGljT3JkZXJDbnRUeXBlKQotICAgIHsKLQotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAvKiBzZXQgcHJldlBpY09yZGVyQ250IHZhbHVlcyBmb3IgSURSIGZyYW1lICovCi0gICAgICAgICAgICBpZiAoSVNfSURSX05BTF9VTklUKHBOYWxVbml0KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwb2MtPnByZXZQaWNPcmRlckNudE1zYiA9IDA7Ci0gICAgICAgICAgICAgICAgcG9jLT5wcmV2UGljT3JkZXJDbnRMc2IgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBjb21wdXRlIHBpY09yZGVyQ250TXNiIChzdG9yZWQgaW4gcGljT3JkZXJDbnQgdmFyaWFibGUpICovCi0gICAgICAgICAgICBpZiAoIChwU2xpY2VIZWFkZXItPnBpY09yZGVyQ250THNiIDwgcG9jLT5wcmV2UGljT3JkZXJDbnRMc2IpICYmCi0gICAgICAgICAgICAgICAgKChwb2MtPnByZXZQaWNPcmRlckNudExzYiAtIHBTbGljZUhlYWRlci0+cGljT3JkZXJDbnRMc2IpID49Ci0gICAgICAgICAgICAgICAgIHNwcy0+bWF4UGljT3JkZXJDbnRMc2IvMikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ID0gcG9jLT5wcmV2UGljT3JkZXJDbnRNc2IgKwotICAgICAgICAgICAgICAgICAgICAoaTMyKXNwcy0+bWF4UGljT3JkZXJDbnRMc2I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICgocFNsaWNlSGVhZGVyLT5waWNPcmRlckNudExzYiA+IHBvYy0+cHJldlBpY09yZGVyQ250THNiKSAmJgotICAgICAgICAgICAgICAgICgocFNsaWNlSGVhZGVyLT5waWNPcmRlckNudExzYiAtIHBvYy0+cHJldlBpY09yZGVyQ250THNiKSA+Ci0gICAgICAgICAgICAgICAgIHNwcy0+bWF4UGljT3JkZXJDbnRMc2IvMikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ID0gcG9jLT5wcmV2UGljT3JkZXJDbnRNc2IgLQotICAgICAgICAgICAgICAgICAgICAoaTMyKXNwcy0+bWF4UGljT3JkZXJDbnRMc2I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPSBwb2MtPnByZXZQaWNPcmRlckNudE1zYjsKLQotICAgICAgICAgICAgLyogc3RhbmRhcmQgc3BlY2lmaWVzIHRoYXQgcHJldlBpY09yZGVyQ250TXNiIGlzIGZyb20gcHJldmlvdXMKLSAgICAgICAgICAgICAqIHJlcmVyZW5jZSBmcmFtZSAtPiByZXBsYWNlIG9sZCB2YWx1ZSBvbmx5IGlmIGN1cnJlbnQgZnJhbWUgaXMKLSAgICAgICAgICAgICAqIHJlcmVyZW5jZSBmcmFtZSAqLwotICAgICAgICAgICAgaWYgKHBOYWxVbml0LT5uYWxSZWZJZGMpCi0gICAgICAgICAgICAgICAgcG9jLT5wcmV2UGljT3JkZXJDbnRNc2IgPSBwaWNPcmRlckNudDsKLQotICAgICAgICAgICAgLyogY29tcHV0ZSB0b3AgZmllbGQgb3JkZXIgY250IChzdG9yZWQgaW4gcGljT3JkZXJDbnQpICovCi0gICAgICAgICAgICBwaWNPcmRlckNudCArPSAoaTMyKXBTbGljZUhlYWRlci0+cGljT3JkZXJDbnRMc2I7Ci0KLSAgICAgICAgICAgIC8qIGlmIGRlbHRhIGZvciBib3R0b20gZmllbGQgaXMgbmVnYXRpdmUgLT4gYm90dG9tIHdpbGwgYmUgdGhlCi0gICAgICAgICAgICAgKiBtaW5pbXVtIHBpYyBvcmRlciBjb3VudCAqLwotICAgICAgICAgICAgaWYgKHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudEJvdHRvbSA8IDApCi0gICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgKz0gcFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250Qm90dG9tOwotCi0gICAgICAgICAgICAvKiBzdGFuZGFyZCBzcGVjaWZpZXMgdGhhdCBwcmV2UGljT3JkZXJDbnRMc2IgaXMgZnJvbSBwcmV2aW91cwotICAgICAgICAgICAgICogcmVyZXJlbmNlIGZyYW1lIC0+IHJlcGxhY2Ugb2xkIHZhbHVlIG9ubHkgaWYgY3VycmVudCBmcmFtZSBpcwotICAgICAgICAgICAgICogcmVyZXJlbmNlIGZyYW1lICovCi0gICAgICAgICAgICBpZiAocE5hbFVuaXQtPm5hbFJlZklkYykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBpZiBjdXJyZW50IGZyYW1lIGNvbnRhaW5zIG1tY281IC0+IG1vZGlmeSB2YWx1ZXMgdG8gYmUKLSAgICAgICAgICAgICAgICAgKiBzdG9yZWQgKi8KLSAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNNbWNvNSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBvYy0+cHJldlBpY09yZGVyQ250TXNiID0gMDsKLSAgICAgICAgICAgICAgICAgICAgLyogcHJldlBpY09yZGVyQ250THNiIHNob3VsZCBiZSB0aGUgdG9wIGZpZWxkIHBpY09yZGVyQ250Ci0gICAgICAgICAgICAgICAgICAgICAqIGlmIHByZXZpb3VzIGZyYW1lIGluY2x1ZGVkIG1tY281LiBUb3AgZmllbGQgcGljT3JkZXJDbnQKLSAgICAgICAgICAgICAgICAgICAgICogZm9yIGZyYW1lcyBjb250YWluaW5nIG1tY281IGlzIG9idGFpbmVkIGJ5IHN1YnRyYWN0aW5nCi0gICAgICAgICAgICAgICAgICAgICAqIHRoZSBwaWNPcmRlckNudCBmcm9tIG9yaWdpbmFsIHRvcCBmaWVsZCBvcmRlciBjb3VudCAtPgotICAgICAgICAgICAgICAgICAgICAgKiB2YWx1ZSBpcyB6ZXJvIGlmIHRvcCBmaWVsZCB3YXMgdGhlIG1pbmltdW0sIGkuZS4gZGVsdGEKLSAgICAgICAgICAgICAgICAgICAgICogZm9yIGJvdHRvbSB3YXMgcG9zaXRpdmUsIG90aGVyd2lzZSB2YWx1ZSBpcwotICAgICAgICAgICAgICAgICAgICAgKiAtZGVsdGFQaWNPcmRlckNudEJvdHRvbSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAocFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250Qm90dG9tIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvYy0+cHJldlBpY09yZGVyQ250THNiID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTMyKSgtcFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250Qm90dG9tKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcG9jLT5wcmV2UGljT3JkZXJDbnRMc2IgPSAwOwotICAgICAgICAgICAgICAgICAgICBwaWNPcmRlckNudCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBvYy0+cHJldlBpY09yZGVyQ250THNiID0gcFNsaWNlSGVhZGVyLT5waWNPcmRlckNudExzYjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMToKLQotICAgICAgICAgICAgLyogc3RlcCAxIChpbiB0aGUgZGVzY3JpcHRpb24gaW4gdGhlIHN0YW5kYXJkKSAqLwotICAgICAgICAgICAgaWYgKElTX0lEUl9OQUxfVU5JVChwTmFsVW5pdCkpCi0gICAgICAgICAgICAgICAgZnJhbWVOdW1PZmZzZXQgPSAwOwotICAgICAgICAgICAgZWxzZSBpZiAocG9jLT5wcmV2RnJhbWVOdW0gPiBwU2xpY2VIZWFkZXItPmZyYW1lTnVtKQotICAgICAgICAgICAgICAgIGZyYW1lTnVtT2Zmc2V0ID0gcG9jLT5wcmV2RnJhbWVOdW1PZmZzZXQgKyBzcHMtPm1heEZyYW1lTnVtOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGZyYW1lTnVtT2Zmc2V0ID0gcG9jLT5wcmV2RnJhbWVOdW1PZmZzZXQ7Ci0KLSAgICAgICAgICAgIC8qIHN0ZXAgMiAqLwotICAgICAgICAgICAgaWYgKHNwcy0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlKQotICAgICAgICAgICAgICAgIGFic0ZyYW1lTnVtID0gZnJhbWVOdW1PZmZzZXQgKyBwU2xpY2VIZWFkZXItPmZyYW1lTnVtOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGFic0ZyYW1lTnVtID0gMDsKLQotICAgICAgICAgICAgaWYgKHBOYWxVbml0LT5uYWxSZWZJZGMgPT0gMCAmJiBhYnNGcmFtZU51bSA+IDApCi0gICAgICAgICAgICAgICAgYWJzRnJhbWVOdW0gLT0gMTsKLQotICAgICAgICAgICAgLyogc3RlcCAzICovCi0gICAgICAgICAgICBpZiAoYWJzRnJhbWVOdW0gPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBpY09yZGVyQ250Q3ljbGVDbnQgPQotICAgICAgICAgICAgICAgICAgICAoYWJzRnJhbWVOdW0gLSAxKS9zcHMtPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZTsKLSAgICAgICAgICAgICAgICBmcmFtZU51bUluUGljT3JkZXJDbnRDeWNsZSA9Ci0gICAgICAgICAgICAgICAgICAgIChhYnNGcmFtZU51bSAtIDEpJXNwcy0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBzdGVwIDQgKi8KLSAgICAgICAgICAgIGV4cGVjdGVkRGVsdGFQaWNPcmRlckNudEN5Y2xlID0gMDsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzcHMtPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZTsgaSsrKQotICAgICAgICAgICAgICAgIGV4cGVjdGVkRGVsdGFQaWNPcmRlckNudEN5Y2xlICs9IHNwcy0+b2Zmc2V0Rm9yUmVmRnJhbWVbaV07Ci0KLSAgICAgICAgICAgIC8qIHN0ZXAgNSAocGljT3JkZXJDbnQgdXNlZCB0byBzdG9yZSBleHBlY3RlZFBpY09yZGVyQ250KSAqLwotICAgICAgICAgICAgLypsaW50IC1lc3ltKDY0NCxwaWNPcmRlckNudEN5Y2xlQ250KSBhbHdheXMgaW5pdGlhbGl6ZWQgKi8KLSAgICAgICAgICAgIC8qbGludCAtZXN5bSg2NDQsZnJhbWVOdW1JblBpY09yZGVyQ250Q3ljbGUpIGFsd2F5cyBpbml0aWFsaXplZCAqLwotICAgICAgICAgICAgaWYgKGFic0ZyYW1lTnVtID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwaWNPcmRlckNudCA9Ci0gICAgICAgICAgICAgICAgICAgIChpMzIpcGljT3JkZXJDbnRDeWNsZUNudCAqIGV4cGVjdGVkRGVsdGFQaWNPcmRlckNudEN5Y2xlOwotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gZnJhbWVOdW1JblBpY09yZGVyQ250Q3ljbGU7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgKz0gc3BzLT5vZmZzZXRGb3JSZWZGcmFtZVtpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwaWNPcmRlckNudCA9IDA7Ci0KLSAgICAgICAgICAgIGlmIChwTmFsVW5pdC0+bmFsUmVmSWRjID09IDApCi0gICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgKz0gc3BzLT5vZmZzZXRGb3JOb25SZWZQaWM7Ci0KLSAgICAgICAgICAgIC8qIHN0ZXAgNiAocGljT3JkZXJDbnQgaXMgdG9wIGZpZWxkIG9yZGVyIGNudCBpZiBkZWx0YSBmb3IgYm90dG9tCi0gICAgICAgICAgICAgKiBpcyBwb3NpdGl2ZSwgb3RoZXJ3aXNlIGl0IGlzIGJvdHRvbSBmaWVsZCBvcmRlciBjbnQpICovCi0gICAgICAgICAgICBwaWNPcmRlckNudCArPSBwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRbMF07Ci0KLSAgICAgICAgICAgIGlmICggKHNwcy0+b2Zmc2V0Rm9yVG9wVG9Cb3R0b21GaWVsZCArCi0gICAgICAgICAgICAgICAgICAgIHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudFsxXSkgPCAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwaWNPcmRlckNudCArPSBzcHMtPm9mZnNldEZvclRvcFRvQm90dG9tRmllbGQgKwotICAgICAgICAgICAgICAgICAgICBwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRbMV07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGlmIGN1cnJlbnQgcGljdHVyZSBjb250YWlucyBtbWNvNSAtPiBzZXQgcHJldkZyYW1lTnVtT2Zmc2V0IGFuZAotICAgICAgICAgICAgICogcHJldkZyYW1lTnVtIHRvIDAgZm9yIGNvbXB1dGF0aW9uIG9mIHBpY09yZGVyQ250IG9mIG5leHQKLSAgICAgICAgICAgICAqIGZyYW1lLCBvdGhlcndpc2Ugc3RvcmUgZnJhbWVOdW0gYW5kIGZyYW1lTnVtT2Zmc2V0IHRvIHBvYwotICAgICAgICAgICAgICogc3RydWN0dXJlICovCi0gICAgICAgICAgICBpZiAoIWNvbnRhaW5zTW1jbzUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcG9jLT5wcmV2RnJhbWVOdW1PZmZzZXQgPSBmcmFtZU51bU9mZnNldDsKLSAgICAgICAgICAgICAgICBwb2MtPnByZXZGcmFtZU51bSA9IHBTbGljZUhlYWRlci0+ZnJhbWVOdW07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcG9jLT5wcmV2RnJhbWVOdW1PZmZzZXQgPSAwOwotICAgICAgICAgICAgICAgIHBvYy0+cHJldkZyYW1lTnVtID0gMDsKLSAgICAgICAgICAgICAgICBwaWNPcmRlckNudCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OiAvKiBjYXNlIDIgKi8KLSAgICAgICAgICAgIC8qIGRlcml2ZSBmcmFtZU51bU9mZnNldCAqLwotICAgICAgICAgICAgaWYgKElTX0lEUl9OQUxfVU5JVChwTmFsVW5pdCkpCi0gICAgICAgICAgICAgICAgZnJhbWVOdW1PZmZzZXQgPSAwOwotICAgICAgICAgICAgZWxzZSBpZiAocG9jLT5wcmV2RnJhbWVOdW0gPiBwU2xpY2VIZWFkZXItPmZyYW1lTnVtKQotICAgICAgICAgICAgICAgIGZyYW1lTnVtT2Zmc2V0ID0gcG9jLT5wcmV2RnJhbWVOdW1PZmZzZXQgKyBzcHMtPm1heEZyYW1lTnVtOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGZyYW1lTnVtT2Zmc2V0ID0gcG9jLT5wcmV2RnJhbWVOdW1PZmZzZXQ7Ci0KLSAgICAgICAgICAgIC8qIGRlcml2ZSBwaWNPcmRlckNudCAodHlwZSAyIGhhcyBzYW1lIHZhbHVlIGZvciB0b3AgYW5kIGJvdHRvbQotICAgICAgICAgICAgICogZmllbGQgb3JkZXIgY250cykgKi8KLSAgICAgICAgICAgIGlmIChJU19JRFJfTkFMX1VOSVQocE5hbFVuaXQpKQotICAgICAgICAgICAgICAgIHBpY09yZGVyQ250ID0gMDsKLSAgICAgICAgICAgIGVsc2UgaWYgKHBOYWxVbml0LT5uYWxSZWZJZGMgPT0gMCkKLSAgICAgICAgICAgICAgICBwaWNPcmRlckNudCA9Ci0gICAgICAgICAgICAgICAgICAgIDIgKiAoaTMyKShmcmFtZU51bU9mZnNldCArIHBTbGljZUhlYWRlci0+ZnJhbWVOdW0pIC0gMTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwaWNPcmRlckNudCA9Ci0gICAgICAgICAgICAgICAgICAgIDIgKiAoaTMyKShmcmFtZU51bU9mZnNldCArIHBTbGljZUhlYWRlci0+ZnJhbWVOdW0pOwotCi0gICAgICAgICAgICAvKiBpZiBjdXJyZW50IHBpY3R1cmUgY29udGFpbnMgbW1jbzUgLT4gc2V0IHByZXZGcmFtZU51bU9mZnNldCBhbmQKLSAgICAgICAgICAgICAqIHByZXZGcmFtZU51bSB0byAwIGZvciBjb21wdXRhdGlvbiBvZiBwaWNPcmRlckNudCBvZiBuZXh0Ci0gICAgICAgICAgICAgKiBmcmFtZSwgb3RoZXJ3aXNlIHN0b3JlIGZyYW1lTnVtIGFuZCBmcmFtZU51bU9mZnNldCB0byBwb2MKLSAgICAgICAgICAgICAqIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgaWYgKCFjb250YWluc01tY281KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0ID0gZnJhbWVOdW1PZmZzZXQ7Ci0gICAgICAgICAgICAgICAgcG9jLT5wcmV2RnJhbWVOdW0gPSBwU2xpY2VIZWFkZXItPmZyYW1lTnVtOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBvYy0+cHJldkZyYW1lTnVtT2Zmc2V0ID0gMDsKLSAgICAgICAgICAgICAgICBwb2MtPnByZXZGcmFtZU51bSA9IDA7Ci0gICAgICAgICAgICAgICAgcGljT3JkZXJDbnQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICB9Ci0KLSAgICAvKmxpbnQgLWVzeW0oNjQ0LHBpY09yZGVyQ250KSBhbHdheXMgaW5pdGlhbGl6ZWQgKi8KLSAgICByZXR1cm4ocGljT3JkZXJDbnQpOwotCi19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfb3JkZXJfY250LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX29yZGVyX2NudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTc0MWViLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfb3JkZXJfY250LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX1BJQ19PUkRFUl9DTlRfSAotI2RlZmluZSBIMjY0U1dERUNfUElDX09SREVSX0NOVF9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgotI2luY2x1ZGUgImgyNjRic2RfbmFsX3VuaXQuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIHN0cnVjdHVyZSB0byBzdG9yZSBpbmZvcm1hdGlvbiBjb21wdXRlZCBmb3IgcHJldmlvdXMgcGljdHVyZSwgbmVlZGVkIGZvcgotICogUE9DIGNvbXB1dGF0aW9uIG9mIGEgcGljdHVyZS4gVHdvIGZpcnN0IGZpZWxkcyBmb3IgUE9DIHR5cGUgMCwgbGFzdCB0d28KLSAqIGZvciB0eXBlcyAxIGFuZCAyICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBwcmV2UGljT3JkZXJDbnRMc2I7Ci0gICAgaTMyIHByZXZQaWNPcmRlckNudE1zYjsKLSAgICB1MzIgcHJldkZyYW1lTnVtOwotICAgIHUzMiBwcmV2RnJhbWVOdW1PZmZzZXQ7Ci19IHBvY1N0b3JhZ2VfdDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1pMzIgaDI2NGJzZERlY29kZVBpY09yZGVyQ250KHBvY1N0b3JhZ2VfdCAqcG9jLCBzZXFQYXJhbVNldF90ICpzcHMsCi0gICAgc2xpY2VIZWFkZXJfdCAqc2xpY2VIZWFkZXIsIG5hbFVuaXRfdCAqcE5hbFVuaXQpOwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19QSUNfT1JERVJfQ05UX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19wYXJhbV9zZXQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9waWNfcGFyYW1fc2V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNGRlYTQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19wYXJhbV9zZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgaDI2NGJzZERlY29kZVBpY1BhcmFtU2V0Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiaDI2NGJzZF9waWNfcGFyYW1fc2V0LmgiCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF92bGMuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2NmZy5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBsb29rdXAgdGFibGUgZm9yIGNlaWwobG9nMihudW1TbGljZUdyb3VwcykpLCBpLmUuIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0bwotICogcmVwcmVzZW50IHJhbmdlIFswLCBudW1TbGljZUdyb3VwcykKLSAqCi0gKiBOT1RFOiBpZiBNQVhfTlVNX1NMSUNFX0dST1VQUyBpcyBoaWdoZXIgdGhhbiA4IHRoaXMgdGFibGUgaGFzIHRvIGJlIHJlc2l6ZWQKLSAqIGFjY29yZGluZ2x5ICovCi1zdGF0aWMgY29uc3QgdTMyIENlaWxMb2cyTnVtU2xpY2VHcm91cHNbOF0gPSB7MSwgMSwgMiwgMiwgMywgMywgMywgM307Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6IGgyNjRic2REZWNvZGVQaWNQYXJhbVNldAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBEZWNvZGUgcGljdHVyZSBwYXJhbWV0ZXIgc2V0IGluZm9ybWF0aW9uIGZyb20gdGhlIHN0cmVhbS4KLQotICAgICAgICAgICAgRnVuY3Rpb24gYWxsb2NhdGVzIG1lbW9yeSBmb3IKLSAgICAgICAgICAgICAgICAtIHJ1biBsZW5ndGhzIGlmIHNsaWNlIGdyb3VwIG1hcCB0eXBlIGlzIDAKLSAgICAgICAgICAgICAgICAtIHRvcC1sZWZ0IGFuZCBib3R0b20tcmlnaHQgYXJyYXlzIGlmIG1hcCB0eXBlIGlzIDIKLSAgICAgICAgICAgICAgICAtIGZvciBzbGljZSBncm91cCBpZHMgaWYgbWFwIHR5cGUgaXMgNgotCi0gICAgICAgICAgICBWYWxpZGl0eSBvZiBzb21lIG9mIHRoZSBzbGljZSBncm91cCBtYXBwaW5nIGluZm9ybWF0aW9uIGRlcGVuZHMKLSAgICAgICAgICAgIG9uIHRoZSBpbWFnZSBkaW1lbnNpb25zIHdoaWNoIGFyZSBub3Qga25vd24gaGVyZS4gVGhlcmVmb3JlIHRoZQotICAgICAgICAgICAgdmFsaWRpdHkgaGFzIHRvIGJlIGNoZWNrZWQgYWZ0ZXJ3YXJkcywgY3VycmVudGx5IGluIHRoZSBwYXJhbWV0ZXIKLSAgICAgICAgICAgIHNldCBhY3RpdmF0aW9uIHBoYXNlLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBwUGljUGFyYW1TZXQgICAgZGVjb2RlZCBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGZhaWx1cmUsIGludmFsaWQgaW5mb3JtYXRpb24gb3IgZW5kIG9mIHN0cmVhbQotICAgICAgICAgICAgTUVNT1JZX0FMTE9DQVRJT05fRVJST1IgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUKLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZVBpY1BhcmFtU2V0KHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgcGljUGFyYW1TZXRfdCAqcFBpY1BhcmFtU2V0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIGksIHZhbHVlOwotICAgIGkzMiBpdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFBpY1BhcmFtU2V0KTsKLQotCi0gICAgSDI2NFN3RGVjTWVtc2V0KHBQaWNQYXJhbVNldCwgMCwgc2l6ZW9mKHBpY1BhcmFtU2V0X3QpKTsKLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICZwUGljUGFyYW1TZXQtPnBpY1BhcmFtZXRlclNldElkKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgaWYgKHBQaWNQYXJhbVNldC0+cGljUGFyYW1ldGVyU2V0SWQgPj0gTUFYX05VTV9QSUNfUEFSQU1fU0VUUykKLSAgICB7Ci0gICAgICAgIEVQUklOVCgicGljX3BhcmFtZXRlcl9zZXRfaWQiKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICZwUGljUGFyYW1TZXQtPnNlcVBhcmFtZXRlclNldElkKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgaWYgKHBQaWNQYXJhbVNldC0+c2VxUGFyYW1ldGVyU2V0SWQgPj0gTUFYX05VTV9TRVFfUEFSQU1fU0VUUykKLSAgICB7Ci0gICAgICAgIEVQUklOVCgic2VxX3BhcmFtX3NldF9pZCIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgLyogZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnLCBzaGFsbCBiZSAwIGZvciBiYXNlbGluZSBwcm9maWxlICovCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wKQotICAgIHsKLSAgICAgICAgRVBSSU5UKCJlbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWciKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFBpY1BhcmFtU2V0LT5waWNPcmRlclByZXNlbnRGbGFnID0gKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgLyogbnVtX3NsaWNlX2dyb3Vwc19taW51czEgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBwUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzID0gdmFsdWUgKyAxOwotICAgIGlmIChwUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzID4gTUFYX05VTV9TTElDRV9HUk9VUFMpCi0gICAgewotICAgICAgICBFUFJJTlQoIm51bV9zbGljZV9ncm91cHNfbWludXMxIik7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICAvKiBkZWNvZGUgc2xpY2UgZ3JvdXAgbWFwcGluZyBpbmZvcm1hdGlvbiBpZiBtb3JlIHRoYW4gb25lIHNsaWNlIGdyb3VwcyAqLwotICAgIGlmIChwUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzID4gMSkKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgICAmcFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwTWFwVHlwZSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIGlmIChwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBNYXBUeXBlID4gNikKLSAgICAgICAgewotICAgICAgICAgICAgRVBSSU5UKCJzbGljZV9ncm91cF9tYXBfdHlwZSIpOwotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cE1hcFR5cGUgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgQUxMT0NBVEUocFBpY1BhcmFtU2V0LT5ydW5MZW5ndGgsCi0gICAgICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5udW1TbGljZUdyb3VwcywgdTMyKTsKLSAgICAgICAgICAgIGlmIChwUGljUGFyYW1TZXQtPnJ1bkxlbmd0aCA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBpY1BhcmFtU2V0LT5udW1TbGljZUdyb3VwczsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+cnVuTGVuZ3RoW2ldID0gdmFsdWUrMTsKLSAgICAgICAgICAgICAgICAvKiBwYXJhbSB2YWx1ZXMgY2hlY2tlZCBpbiBDaGVja1BwcygpICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwTWFwVHlwZSA9PSAyKQotICAgICAgICB7Ci0gICAgICAgICAgICBBTExPQ0FURShwUGljUGFyYW1TZXQtPnRvcExlZnQsCi0gICAgICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5udW1TbGljZUdyb3VwcyAtIDEsIHUzMik7Ci0gICAgICAgICAgICBBTExPQ0FURShwUGljUGFyYW1TZXQtPmJvdHRvbVJpZ2h0LAotICAgICAgICAgICAgICAgIHBQaWNQYXJhbVNldC0+bnVtU2xpY2VHcm91cHMgLSAxLCB1MzIpOwotICAgICAgICAgICAgaWYgKHBQaWNQYXJhbVNldC0+dG9wTGVmdCA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5ib3R0b21SaWdodCA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBpY1BhcmFtU2V0LT5udW1TbGljZUdyb3VwcyAtIDE7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgICAgICBwUGljUGFyYW1TZXQtPnRvcExlZnRbaV0gPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgICAgICBwUGljUGFyYW1TZXQtPmJvdHRvbVJpZ2h0W2ldID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgLyogcGFyYW0gdmFsdWVzIGNoZWNrZWQgaW4gQ2hlY2tQcHMoKSAqLwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCAocFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwTWFwVHlwZSA9PSAzKSB8fAotICAgICAgICAgICAgICAgICAgKHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cE1hcFR5cGUgPT0gNCkgfHwKLSAgICAgICAgICAgICAgICAgIChwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBNYXBUeXBlID09IDUpICkKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICBwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnID0KLSAgICAgICAgICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICBwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBDaGFuZ2VSYXRlID0gdmFsdWUgKyAxOwotICAgICAgICAgICAgLyogcGFyYW0gdmFsdWUgY2hlY2tlZCBpbiBDaGVja1BwcygpICovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwTWFwVHlwZSA9PSA2KQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICBwUGljUGFyYW1TZXQtPnBpY1NpemVJbk1hcFVuaXRzID0gdmFsdWUgKyAxOwotCi0gICAgICAgICAgICBBTExPQ0FURShwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBJZCwKLSAgICAgICAgICAgICAgICBwUGljUGFyYW1TZXQtPnBpY1NpemVJbk1hcFVuaXRzLCB1MzIpOwotICAgICAgICAgICAgaWYgKHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cElkID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKLQotICAgICAgICAgICAgLyogZGV0ZXJtaW5lIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQgcmFuZ2UKLSAgICAgICAgICAgICAqIFswLCBudW1TbGljZUdyb3VwcykgKi8KLSAgICAgICAgICAgIHRtcCA9IENlaWxMb2cyTnVtU2xpY2VHcm91cHNbcFBpY1BhcmFtU2V0LT5udW1TbGljZUdyb3Vwcy0xXTsKLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQaWNQYXJhbVNldC0+cGljU2l6ZUluTWFwVW5pdHM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBJZFtpXSA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgdG1wKTsKLSAgICAgICAgICAgICAgICBpZiAoIHBQaWNQYXJhbVNldC0+c2xpY2VHcm91cElkW2ldID49Ci0gICAgICAgICAgICAgICAgICAgICBwUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEVQUklOVCgic2xpY2VfZ3JvdXBfaWQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIG51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBpZiAodmFsdWUgPiAzMSkKLSAgICB7Ci0gICAgICAgIEVQUklOVCgibnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotICAgIHBQaWNQYXJhbVNldC0+bnVtUmVmSWR4TDBBY3RpdmUgPSB2YWx1ZSArIDE7Ci0KLSAgICAvKiBudW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgaWYgKHZhbHVlID4gMzEpCi0gICAgewotICAgICAgICBFUFJJTlQoIm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEiKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIC8qIHdlaWdodGVkX3ByZWRfZmxhZywgdGhpcyBzaGFsbCBiZSAwIGZvciBiYXNlbGluZSBwcm9maWxlICovCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wKQotICAgIHsKLSAgICAgICAgRVBSSU5UKCJ3ZWlnaHRlZF9wcmVkX2ZsYWciKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIC8qIHdlaWdodGVkX2JpcHJlZF9pZGMgKi8KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDIpOwotICAgIGlmICh0bXAgPiAyKQotICAgIHsKLSAgICAgICAgRVBSSU5UKCJ3ZWlnaHRlZF9iaXByZWRfaWRjIik7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICAvKiBwaWNfaW5pdF9xcF9taW51czI2ICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgaWYgKChpdG1wIDwgLTI2KSB8fCAoaXRtcCA+IDI1KSkKLSAgICB7Ci0gICAgICAgIEVQUklOVCgicGljX2luaXRfcXBfbWludXMyNiIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotICAgIHBQaWNQYXJhbVNldC0+cGljSW5pdFFwID0gKHUzMikoaXRtcCArIDI2KTsKLQotICAgIC8qIHBpY19pbml0X3FzX21pbnVzMjYgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBpZiAoKGl0bXAgPCAtMjYpIHx8IChpdG1wID4gMjUpKQotICAgIHsKLSAgICAgICAgRVBSSU5UKCJwaWNfaW5pdF9xc19taW51czI2Iik7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBpZiAoKGl0bXAgPCAtMTIpIHx8IChpdG1wID4gMTIpKQotICAgIHsKLSAgICAgICAgRVBSSU5UKCJjaHJvbWFfcXBfaW5kZXhfb2Zmc2V0Iik7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0gICAgcFBpY1BhcmFtU2V0LT5jaHJvbWFRcEluZGV4T2Zmc2V0ID0gaXRtcDsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFBpY1BhcmFtU2V0LT5kZWJsb2NraW5nRmlsdGVyQ29udHJvbFByZXNlbnRGbGFnID0KLSAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwUGljUGFyYW1TZXQtPmNvbnN0cmFpbmVkSW50cmFQcmVkRmxhZyA9ICh0bXAgPT0gMSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBQaWNQYXJhbVNldC0+cmVkdW5kYW50UGljQ250UHJlc2VudEZsYWcgPSAodG1wID09IDEpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgdG1wID0gaDI2NGJzZFJic3BUcmFpbGluZ0JpdHMocFN0cm1EYXRhKTsKLQotICAgIC8qIGlnbm9yZSBwb3NzaWJsZSBlcnJvcnMgaW4gdHJhaWxpbmcgYml0cyBvZiBwYXJhbWV0ZXJzIHNldHMgKi8KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX3BhcmFtX3NldC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3BpY19wYXJhbV9zZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMyODYzOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcGljX3BhcmFtX3NldC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19QSUNfUEFSQU1fU0VUX0gKLSNkZWZpbmUgSDI2NFNXREVDX1BJQ19QQVJBTV9TRVRfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBkYXRhIHN0cnVjdHVyZSB0byBzdG9yZSBQUFMgaW5mb3JtYXRpb24gZGVjb2RlZCBmcm9tIHRoZSBzdHJlYW0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIHBpY1BhcmFtZXRlclNldElkOwotICAgIHUzMiBzZXFQYXJhbWV0ZXJTZXRJZDsKLSAgICB1MzIgcGljT3JkZXJQcmVzZW50RmxhZzsKLSAgICB1MzIgbnVtU2xpY2VHcm91cHM7Ci0gICAgdTMyIHNsaWNlR3JvdXBNYXBUeXBlOwotICAgIHUzMiAqcnVuTGVuZ3RoOwotICAgIHUzMiAqdG9wTGVmdDsKLSAgICB1MzIgKmJvdHRvbVJpZ2h0OwotICAgIHUzMiBzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZzsKLSAgICB1MzIgc2xpY2VHcm91cENoYW5nZVJhdGU7Ci0gICAgdTMyIHBpY1NpemVJbk1hcFVuaXRzOwotICAgIHUzMiAqc2xpY2VHcm91cElkOwotICAgIHUzMiBudW1SZWZJZHhMMEFjdGl2ZTsKLSAgICB1MzIgcGljSW5pdFFwOwotICAgIGkzMiBjaHJvbWFRcEluZGV4T2Zmc2V0OwotICAgIHUzMiBkZWJsb2NraW5nRmlsdGVyQ29udHJvbFByZXNlbnRGbGFnOwotICAgIHUzMiBjb25zdHJhaW5lZEludHJhUHJlZEZsYWc7Ci0gICAgdTMyIHJlZHVuZGFudFBpY0NudFByZXNlbnRGbGFnOwotfSBwaWNQYXJhbVNldF90OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlUGljUGFyYW1TZXQoc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICAgIHBpY1BhcmFtU2V0X3QgKnBQaWNQYXJhbVNldCk7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1BJQ19QQVJBTV9TRVRfSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcmVjb25zdHJ1Y3QuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9yZWNvbnN0cnVjdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDA5YTA2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9yZWNvbnN0cnVjdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMxOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3JlY29uc3RydWN0LmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9pbWFnZS5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotCi0jaWZkZWYgSDI2NERFQ19PTVhETAotI2luY2x1ZGUgIm9teHR5cGVzLmgiCi0jaW5jbHVkZSAib214VkMuaCIKLSNpbmNsdWRlICJhcm1WQy5oIgotI2VuZGlmIC8qIEgyNjRERUNfT01YREwgKi8KLQotI2RlZmluZSBVTlVTRUQoeCkgKHZvaWQpKHgpCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFN3aXRjaCBvZmYgdGhlIGZvbGxvd2luZyBMaW50IG1lc3NhZ2VzIGZvciB0aGlzIGZpbGU6Ci0gKiBJbmZvIDcwMTogU2hpZnQgbGVmdCBvZiBzaWduZWQgcXVhbnRpdHkgKGludCkKLSAqIEluZm8gNzAyOiBTaGlmdCByaWdodCBvZiBzaWduZWQgcXVhbnRpdHkgKGludCkKLSAqLwotLypsaW50IC1lNzAxIC1lNzAyICovCi0KLS8qIEx1bWEgZnJhY3Rpb25hbC1zYW1wbGUgcG9zaXRpb25zCi0gKgotICogIEcgYSBiIGMgSAotICogIGQgZSBmIGcKLSAqICBoIGkgaiBrIG0KLSAqICBuIHAgcSByCi0gKiAgTSAgIHMgICBOCi0gKgotICogIEcsIEgsIE0gYW5kIE4gYXJlIGludGVnZXIgc2FtcGxlIHBvc2l0aW9ucwotICogIGEtcyBhcmUgZnJhY3Rpb25hbCBzYW1wbGVzIHRoYXQgbmVlZCB0byBiZSBpbnRlcnBvbGF0ZWQuCi0gKi8KLSNpZm5kZWYgSDI2NERFQ19PTVhETAotc3RhdGljIGNvbnN0IHUzMiBsdW1hRnJhY1Bvc1s0XVs0XSA9IHsKLSAgLyogRyAgZCAgaCAgbiAgICBhICBlICBpICBwICAgIGIgIGYgIGogICBxICAgICBjICAgZyAgIGsgICByICovCi0gICAgezAsIDEsIDIsIDN9LCB7NCwgNSwgNiwgN30sIHs4LCA5LCAxMCwgMTF9LCB7MTIsIDEzLCAxNCwgMTV9fTsKLSNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCi0KLS8qIGNsaXBwaW5nIHRhYmxlLCBkZWZpbmVkIGluIGgyNjRic2RfaW50cmFfcHJlZGljdGlvbi5jICovCi1leHRlcm4gY29uc3QgdTggaDI2NGJzZENsaXBbXTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRERUNfT01YREwKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3IKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgY2hyb21hIGludGVycG9sYXRpb24gaW4gaG9yaXpvbnRhbCBkaXJlY3Rpb24uCi0gICAgICAgICAgT3ZlcmZpbGxpbmcgaXMgZG9uZSBvbmx5IGlmIG5lZWRlZC4gUmVmZXJlbmNlIGltYWdlIChwUmVmKSBpcwotICAgICAgICAgIHJlYWQgYXQgY29ycmVjdCBwb3NpdGlvbiBhbmQgdGhlIHByZWRpY3RlZCBwYXJ0IGlzIHdyaXR0ZW4gdG8KLSAgICAgICAgICBtYWNyb2Jsb2NrJ3MgY2hyb21pbmFuY2UgKHByZWRQYXJ0Q2hyb21hKQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgcFJlZiAgICAgICAgICAgICAgcG9pbnRlciB0byByZWZlcmVuY2UgZnJhbWUgQ2IgdG9wLWxlZnQgY29ybmVyCi0gICAgICAgICAgeDAgICAgICAgICAgICAgICAgaW50ZWdlciB4LWNvb3JkaW5hdGUgZm9yIHByZWRpY3Rpb24KLSAgICAgICAgICB5MCAgICAgICAgICAgICAgICBpbnRlZ2VyIHktY29vcmRpbmF0ZSBmb3IgcHJlZGljdGlvbgotICAgICAgICAgIHdpZHRoICAgICAgICAgICAgIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgZnJhbWUgY2hyb21pbmFuY2UgaW4gcGl4ZWxzCi0gICAgICAgICAgaGVpZ2h0ICAgICAgICAgICAgaGVpZ2h0IG9mIHRoZSByZWZlcmVuY2UgZnJhbWUgY2hyb21pbmFuY2UgaW4gcGl4ZWxzCi0gICAgICAgICAgeEZyYWMgICAgICAgICAgICAgaG9yaXpvbnRhbCBmcmFjdGlvbiBmb3IgcHJlZGljdGlvbiBpbiAxLzggcGl4ZWxzCi0gICAgICAgICAgY2hyb21hUGFydFdpZHRoICAgd2lkdGggb2YgdGhlIHByZWRpY3RlZCBwYXJ0IGluIHBpeGVscwotICAgICAgICAgIGNocm9tYVBhcnRIZWlnaHQgIGhlaWdodCBvZiB0aGUgcHJlZGljdGVkIHBhcnQgaW4gcGl4ZWxzCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgcHJlZFBhcnRDaHJvbWEgICAgcG9pbnRlciB3aGVyZSBwcmVkaWN0ZWQgcGFydCBpcyB3cml0dGVuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZuZGVmIEgyNjRERUNfQVJNMTEKLXZvaWQgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yKAotICB1OCAqcFJlZiwKLSAgdTggKnByZWRQYXJ0Q2hyb21hLAotICBpMzIgeDAsCi0gIGkzMiB5MCwKLSAgdTMyIHdpZHRoLAotICB1MzIgaGVpZ2h0LAotICB1MzIgeEZyYWMsCi0gIHUzMiBjaHJvbWFQYXJ0V2lkdGgsCi0gIHUzMiBjaHJvbWFQYXJ0SGVpZ2h0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB4LCB5LCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCBjLCB2YWw7Ci0gICAgdTggKnB0ckEsICpjYnI7Ci0gICAgdTMyIGNvbXA7Ci0gICAgdTggYmxvY2tbOSo4KjJdOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocHJlZFBhcnRDaHJvbWEpOwotICAgIEFTU0VSVChjaHJvbWFQYXJ0V2lkdGgpOwotICAgIEFTU0VSVChjaHJvbWFQYXJ0SGVpZ2h0KTsKLSAgICBBU1NFUlQoeEZyYWMgPCA4KTsKLSAgICBBU1NFUlQocFJlZik7Ci0KLSAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArY2hyb21hUGFydFdpZHRoKzEgPiB3aWR0aCkgfHwKLSAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArY2hyb21hUGFydEhlaWdodCA+IGhlaWdodCkpCi0gICAgewotICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHBSZWYsIGJsb2NrLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICBjaHJvbWFQYXJ0V2lkdGggKyAxLCBjaHJvbWFQYXJ0SGVpZ2h0LCBjaHJvbWFQYXJ0V2lkdGggKyAxKTsKLSAgICAgICAgcFJlZiArPSB3aWR0aCAqIGhlaWdodDsKLSAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhwUmVmLCBibG9jayArIChjaHJvbWFQYXJ0V2lkdGgrMSkqY2hyb21hUGFydEhlaWdodCwKLSAgICAgICAgICAgIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwgY2hyb21hUGFydFdpZHRoICsgMSwKLSAgICAgICAgICAgIGNocm9tYVBhcnRIZWlnaHQsIGNocm9tYVBhcnRXaWR0aCArIDEpOwotCi0gICAgICAgIHBSZWYgPSBibG9jazsKLSAgICAgICAgeDAgPSAwOwotICAgICAgICB5MCA9IDA7Ci0gICAgICAgIHdpZHRoID0gY2hyb21hUGFydFdpZHRoKzE7Ci0gICAgICAgIGhlaWdodCA9IGNocm9tYVBhcnRIZWlnaHQ7Ci0gICAgfQotCi0gICAgdmFsID0gOCAtIHhGcmFjOwotCi0gICAgZm9yIChjb21wID0gMDsgY29tcCA8PSAxOyBjb21wKyspCi0gICAgewotCi0gICAgICAgIHB0ckEgPSBwUmVmICsgKGNvbXAgKiBoZWlnaHQgKyAodTMyKXkwKSAqIHdpZHRoICsgeDA7Ci0gICAgICAgIGNiciA9IHByZWRQYXJ0Q2hyb21hICsgY29tcCAqIDggKiA4OwotCi0gICAgICAgIC8qIDJ4MiBwZWxzIHBlciBpdGVyYXRpb24KLSAgICAgICAgICogYmlsaW5lYXIgaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uICovCi0gICAgICAgIGZvciAoeSA9IChjaHJvbWFQYXJ0SGVpZ2h0ID4+IDEpOyB5OyB5LS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoeCA9IChjaHJvbWFQYXJ0V2lkdGggPj4gMSk7IHg7IHgtLSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXAxID0gcHRyQVt3aWR0aF07Ci0gICAgICAgICAgICAgICAgdG1wMiA9ICpwdHJBKys7Ci0gICAgICAgICAgICAgICAgdG1wMyA9IHB0ckFbd2lkdGhdOwotICAgICAgICAgICAgICAgIHRtcDQgPSAqcHRyQSsrOwotICAgICAgICAgICAgICAgIGMgPSAoKHZhbCAqIHRtcDEgKyB4RnJhYyAqIHRtcDMpIDw8IDMpICsgMzI7Ci0gICAgICAgICAgICAgICAgYyA+Pj0gNjsKLSAgICAgICAgICAgICAgICBjYnJbOF0gPSAodTgpYzsKLSAgICAgICAgICAgICAgICBjID0gKCh2YWwgKiB0bXAyICsgeEZyYWMgKiB0bXA0KSA8PCAzKSArIDMyOwotICAgICAgICAgICAgICAgIGMgPj49IDY7Ci0gICAgICAgICAgICAgICAgKmNicisrID0gKHU4KWM7Ci0gICAgICAgICAgICAgICAgdG1wMSA9IHB0ckFbd2lkdGhdOwotICAgICAgICAgICAgICAgIHRtcDIgPSAqcHRyQTsKLSAgICAgICAgICAgICAgICBjID0gKCh2YWwgKiB0bXAzICsgeEZyYWMgKiB0bXAxKSA8PCAzKSArIDMyOwotICAgICAgICAgICAgICAgIGMgPj49IDY7Ci0gICAgICAgICAgICAgICAgY2JyWzhdID0gKHU4KWM7Ci0gICAgICAgICAgICAgICAgYyA9ICgodmFsICogdG1wNCArIHhGcmFjICogdG1wMikgPDwgMykgKyAzMjsKLSAgICAgICAgICAgICAgICBjID4+PSA2OwotICAgICAgICAgICAgICAgICpjYnIrKyA9ICh1OCljOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2JyICs9IDIqOCAtIGNocm9tYVBhcnRXaWR0aDsKLSAgICAgICAgICAgIHB0ckEgKz0gMip3aWR0aCAtIGNocm9tYVBhcnRXaWR0aDsKLSAgICAgICAgfQotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYVZlcgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBjaHJvbWEgaW50ZXJwb2xhdGlvbiBpbiB2ZXJ0aWNhbCBkaXJlY3Rpb24uCi0gICAgICAgICAgT3ZlcmZpbGxpbmcgaXMgZG9uZSBvbmx5IGlmIG5lZWRlZC4gUmVmZXJlbmNlIGltYWdlIChwUmVmKSBpcwotICAgICAgICAgIHJlYWQgYXQgY29ycmVjdCBwb3NpdGlvbiBhbmQgdGhlIHByZWRpY3RlZCBwYXJ0IGlzIHdyaXR0ZW4gdG8KLSAgICAgICAgICBtYWNyb2Jsb2NrJ3MgY2hyb21pbmFuY2UgKHByZWRQYXJ0Q2hyb21hKQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYVZlcigKLSAgdTggKnBSZWYsCi0gIHU4ICpwcmVkUGFydENocm9tYSwKLSAgaTMyIHgwLAotICBpMzIgeTAsCi0gIHUzMiB3aWR0aCwKLSAgdTMyIGhlaWdodCwKLSAgdTMyIHlGcmFjLAotICB1MzIgY2hyb21hUGFydFdpZHRoLAotICB1MzIgY2hyb21hUGFydEhlaWdodCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgeCwgeSwgdG1wMSwgdG1wMiwgdG1wMywgYywgdmFsOwotICAgIHU4ICpwdHJBLCAqY2JyOwotICAgIHUzMiBjb21wOwotICAgIHU4IGJsb2NrWzkqOCoyXTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHByZWRQYXJ0Q2hyb21hKTsKLSAgICBBU1NFUlQoY2hyb21hUGFydFdpZHRoKTsKLSAgICBBU1NFUlQoY2hyb21hUGFydEhlaWdodCk7Ci0gICAgQVNTRVJUKHlGcmFjIDwgOCk7Ci0gICAgQVNTRVJUKHBSZWYpOwotCi0gICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK2Nocm9tYVBhcnRXaWR0aCA+IHdpZHRoKSB8fAotICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtjaHJvbWFQYXJ0SGVpZ2h0KzEgPiBoZWlnaHQpKQotICAgIHsKLSAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhwUmVmLCBibG9jaywgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LCBjaHJvbWFQYXJ0V2lkdGgsCi0gICAgICAgICAgICBjaHJvbWFQYXJ0SGVpZ2h0ICsgMSwgY2hyb21hUGFydFdpZHRoKTsKLSAgICAgICAgcFJlZiArPSB3aWR0aCAqIGhlaWdodDsKLSAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhwUmVmLCBibG9jayArIGNocm9tYVBhcnRXaWR0aCooY2hyb21hUGFydEhlaWdodCsxKSwKLSAgICAgICAgICAgIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwgY2hyb21hUGFydFdpZHRoLAotICAgICAgICAgICAgY2hyb21hUGFydEhlaWdodCArIDEsIGNocm9tYVBhcnRXaWR0aCk7Ci0KLSAgICAgICAgcFJlZiA9IGJsb2NrOwotICAgICAgICB4MCA9IDA7Ci0gICAgICAgIHkwID0gMDsKLSAgICAgICAgd2lkdGggPSBjaHJvbWFQYXJ0V2lkdGg7Ci0gICAgICAgIGhlaWdodCA9IGNocm9tYVBhcnRIZWlnaHQrMTsKLSAgICB9Ci0KLSAgICB2YWwgPSA4IC0geUZyYWM7Ci0KLSAgICBmb3IgKGNvbXAgPSAwOyBjb21wIDw9IDE7IGNvbXArKykKLSAgICB7Ci0KLSAgICAgICAgcHRyQSA9IHBSZWYgKyAoY29tcCAqIGhlaWdodCArICh1MzIpeTApICogd2lkdGggKyB4MDsKLSAgICAgICAgY2JyID0gcHJlZFBhcnRDaHJvbWEgKyBjb21wICogOCAqIDg7Ci0KLSAgICAgICAgLyogMngyIHBlbHMgcGVyIGl0ZXJhdGlvbgotICAgICAgICAgKiBiaWxpbmVhciB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uICovCi0gICAgICAgIGZvciAoeSA9IChjaHJvbWFQYXJ0SGVpZ2h0ID4+IDEpOyB5OyB5LS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoeCA9IChjaHJvbWFQYXJ0V2lkdGggPj4gMSk7IHg7IHgtLSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXAzID0gcHRyQVt3aWR0aCoyXTsKLSAgICAgICAgICAgICAgICB0bXAyID0gcHRyQVt3aWR0aF07Ci0gICAgICAgICAgICAgICAgdG1wMSA9ICpwdHJBKys7Ci0gICAgICAgICAgICAgICAgYyA9ICgodmFsICogdG1wMiArIHlGcmFjICogdG1wMykgPDwgMykgKyAzMjsKLSAgICAgICAgICAgICAgICBjID4+PSA2OwotICAgICAgICAgICAgICAgIGNicls4XSA9ICh1OCljOwotICAgICAgICAgICAgICAgIGMgPSAoKHZhbCAqIHRtcDEgKyB5RnJhYyAqIHRtcDIpIDw8IDMpICsgMzI7Ci0gICAgICAgICAgICAgICAgYyA+Pj0gNjsKLSAgICAgICAgICAgICAgICAqY2JyKysgPSAodTgpYzsKLSAgICAgICAgICAgICAgICB0bXAzID0gcHRyQVt3aWR0aCoyXTsKLSAgICAgICAgICAgICAgICB0bXAyID0gcHRyQVt3aWR0aF07Ci0gICAgICAgICAgICAgICAgdG1wMSA9ICpwdHJBKys7Ci0gICAgICAgICAgICAgICAgYyA9ICgodmFsICogdG1wMiArIHlGcmFjICogdG1wMykgPDwgMykgKyAzMjsKLSAgICAgICAgICAgICAgICBjID4+PSA2OwotICAgICAgICAgICAgICAgIGNicls4XSA9ICh1OCljOwotICAgICAgICAgICAgICAgIGMgPSAoKHZhbCAqIHRtcDEgKyB5RnJhYyAqIHRtcDIpIDw8IDMpICsgMzI7Ci0gICAgICAgICAgICAgICAgYyA+Pj0gNjsKLSAgICAgICAgICAgICAgICAqY2JyKysgPSAodTgpYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNiciArPSAyKjggLSBjaHJvbWFQYXJ0V2lkdGg7Ci0gICAgICAgICAgICBwdHJBICs9IDIqd2lkdGggLSBjaHJvbWFQYXJ0V2lkdGg7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLSNlbmRpZgotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3JWZXIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgY2hyb21hIGludGVycG9sYXRpb24gaW4gaG9yaXpvbnRhbCBhbmQKLSAgICAgICAgICB2ZXJ0aWNhbCBkaXJlY3Rpb24uIE92ZXJmaWxsaW5nIGlzIGRvbmUgb25seSBpZiBuZWVkZWQuIFJlZmVyZW5jZQotICAgICAgICAgIGltYWdlIChyZWYpIGlzIHJlYWQgYXQgY29ycmVjdCBwb3NpdGlvbiBhbmQgdGhlIHByZWRpY3RlZCBwYXJ0Ci0gICAgICAgICAgaXMgd3JpdHRlbiB0byBtYWNyb2Jsb2NrJ3MgY2hyb21pbmFuY2UgKHByZWRQYXJ0Q2hyb21hKQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYUhvclZlcigKLSAgdTggKnJlZiwKLSAgdTggKnByZWRQYXJ0Q2hyb21hLAotICBpMzIgeDAsCi0gIGkzMiB5MCwKLSAgdTMyIHdpZHRoLAotICB1MzIgaGVpZ2h0LAotICB1MzIgeEZyYWMsCi0gIHUzMiB5RnJhYywKLSAgdTMyIGNocm9tYVBhcnRXaWR0aCwKLSAgdTMyIGNocm9tYVBhcnRIZWlnaHQpCi17Ci0gICAgdTggYmxvY2tbOSo5KjJdOwotICAgIHUzMiB4LCB5LCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB2YWxYLCB2YWxZLCBwbHVzMzIgPSAzMjsKLSAgICB1MzIgY29tcDsKLSAgICB1OCAqcHRyQSwgKmNicjsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHByZWRQYXJ0Q2hyb21hKTsKLSAgICBBU1NFUlQoY2hyb21hUGFydFdpZHRoKTsKLSAgICBBU1NFUlQoY2hyb21hUGFydEhlaWdodCk7Ci0gICAgQVNTRVJUKHhGcmFjIDwgOCk7Ci0gICAgQVNTRVJUKHlGcmFjIDwgOCk7Ci0gICAgQVNTRVJUKHJlZik7Ci0KLSAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArY2hyb21hUGFydFdpZHRoKzEgPiB3aWR0aCkgfHwKLSAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArY2hyb21hUGFydEhlaWdodCsxID4gaGVpZ2h0KSkKLSAgICB7Ci0gICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCBibG9jaywgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgY2hyb21hUGFydFdpZHRoICsgMSwgY2hyb21hUGFydEhlaWdodCArIDEsIGNocm9tYVBhcnRXaWR0aCArIDEpOwotICAgICAgICByZWYgKz0gd2lkdGggKiBoZWlnaHQ7Ci0gICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCBibG9jayArIChjaHJvbWFQYXJ0V2lkdGgrMSkqKGNocm9tYVBhcnRIZWlnaHQrMSksCi0gICAgICAgICAgICB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsIGNocm9tYVBhcnRXaWR0aCArIDEsCi0gICAgICAgICAgICBjaHJvbWFQYXJ0SGVpZ2h0ICsgMSwgY2hyb21hUGFydFdpZHRoICsgMSk7Ci0KLSAgICAgICAgcmVmID0gYmxvY2s7Ci0gICAgICAgIHgwID0gMDsKLSAgICAgICAgeTAgPSAwOwotICAgICAgICB3aWR0aCA9IGNocm9tYVBhcnRXaWR0aCsxOwotICAgICAgICBoZWlnaHQgPSBjaHJvbWFQYXJ0SGVpZ2h0KzE7Ci0gICAgfQotCi0gICAgdmFsWCA9IDggLSB4RnJhYzsKLSAgICB2YWxZID0gOCAtIHlGcmFjOwotCi0gICAgZm9yIChjb21wID0gMDsgY29tcCA8PSAxOyBjb21wKyspCi0gICAgewotCi0gICAgICAgIHB0ckEgPSByZWYgKyAoY29tcCAqIGhlaWdodCArICh1MzIpeTApICogd2lkdGggKyB4MDsKLSAgICAgICAgY2JyID0gcHJlZFBhcnRDaHJvbWEgKyBjb21wICogOCAqIDg7Ci0KLSAgICAgICAgLyogMngyIHBlbHMgcGVyIGl0ZXJhdGlvbgotICAgICAgICAgKiBiaWxpbmVhciB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uICovCi0gICAgICAgIGZvciAoeSA9IChjaHJvbWFQYXJ0SGVpZ2h0ID4+IDEpOyB5OyB5LS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcDEgPSAqcHRyQTsKLSAgICAgICAgICAgIHRtcDMgPSBwdHJBW3dpZHRoXTsKLSAgICAgICAgICAgIHRtcDUgPSBwdHJBW3dpZHRoKjJdOwotICAgICAgICAgICAgdG1wMSAqPSB2YWxZOwotICAgICAgICAgICAgdG1wMSArPSB0bXAzICogeUZyYWM7Ci0gICAgICAgICAgICB0bXAzICo9IHZhbFk7Ci0gICAgICAgICAgICB0bXAzICs9IHRtcDUgKiB5RnJhYzsKLSAgICAgICAgICAgIGZvciAoeCA9IChjaHJvbWFQYXJ0V2lkdGggPj4gMSk7IHg7IHgtLSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXAyID0gKisrcHRyQTsKLSAgICAgICAgICAgICAgICB0bXA0ID0gcHRyQVt3aWR0aF07Ci0gICAgICAgICAgICAgICAgdG1wNiA9IHB0ckFbd2lkdGgqMl07Ci0gICAgICAgICAgICAgICAgdG1wMiAqPSB2YWxZOwotICAgICAgICAgICAgICAgIHRtcDIgKz0gdG1wNCAqIHlGcmFjOwotICAgICAgICAgICAgICAgIHRtcDQgKj0gdmFsWTsKLSAgICAgICAgICAgICAgICB0bXA0ICs9IHRtcDYgKiB5RnJhYzsKLSAgICAgICAgICAgICAgICB0bXAxID0gdG1wMSAqIHZhbFggKyBwbHVzMzI7Ci0gICAgICAgICAgICAgICAgdG1wMyA9IHRtcDMgKiB2YWxYICsgcGx1czMyOwotICAgICAgICAgICAgICAgIHRtcDEgKz0gdG1wMiAqIHhGcmFjOwotICAgICAgICAgICAgICAgIHRtcDEgPj49IDY7Ci0gICAgICAgICAgICAgICAgdG1wMyArPSB0bXA0ICogeEZyYWM7Ci0gICAgICAgICAgICAgICAgdG1wMyA+Pj0gNjsKLSAgICAgICAgICAgICAgICBjYnJbOF0gPSAodTgpdG1wMzsKLSAgICAgICAgICAgICAgICAqY2JyKysgPSAodTgpdG1wMTsKLQotICAgICAgICAgICAgICAgIHRtcDEgPSAqKytwdHJBOwotICAgICAgICAgICAgICAgIHRtcDMgPSBwdHJBW3dpZHRoXTsKLSAgICAgICAgICAgICAgICB0bXA1ID0gcHRyQVt3aWR0aCoyXTsKLSAgICAgICAgICAgICAgICB0bXAxICo9IHZhbFk7Ci0gICAgICAgICAgICAgICAgdG1wMSArPSB0bXAzICogeUZyYWM7Ci0gICAgICAgICAgICAgICAgdG1wMyAqPSB2YWxZOwotICAgICAgICAgICAgICAgIHRtcDMgKz0gdG1wNSAqIHlGcmFjOwotICAgICAgICAgICAgICAgIHRtcDIgPSB0bXAyICogdmFsWCArIHBsdXMzMjsKLSAgICAgICAgICAgICAgICB0bXA0ID0gdG1wNCAqIHZhbFggKyBwbHVzMzI7Ci0gICAgICAgICAgICAgICAgdG1wMiArPSB0bXAxICogeEZyYWM7Ci0gICAgICAgICAgICAgICAgdG1wMiA+Pj0gNjsKLSAgICAgICAgICAgICAgICB0bXA0ICs9IHRtcDMgKiB4RnJhYzsKLSAgICAgICAgICAgICAgICB0bXA0ID4+PSA2OwotICAgICAgICAgICAgICAgIGNicls4XSA9ICh1OCl0bXA0OwotICAgICAgICAgICAgICAgICpjYnIrKyA9ICh1OCl0bXAyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2JyICs9IDIqOCAtIGNocm9tYVBhcnRXaWR0aDsKLSAgICAgICAgICAgIHB0ckEgKz0gMip3aWR0aCAtIGNocm9tYVBhcnRXaWR0aDsKLSAgICAgICAgfQotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IFByZWRpY3RDaHJvbWEKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIFRvcCBsZXZlbCBjaHJvbWEgcHJlZGljdGlvbiBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZSBhcHByb3ByaWF0ZQotICAgICAgICAgIGludGVycG9sYXRpb24gZnVuY3Rpb24uIFRoZSBvdXRwdXQgaXMgd3JpdHRlbiB0byBtYWNyb2Jsb2NrIGFycmF5LgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdm9pZCBQcmVkaWN0Q2hyb21hKAotICB1OCAqbWJQYXJ0Q2hyb21hLAotICB1MzIgeEFMLAotICB1MzIgeUFMLAotICB1MzIgcGFydFdpZHRoLAotICB1MzIgcGFydEhlaWdodCwKLSAgbXZfdCAqbXYsCi0gIGltYWdlX3QgKnJlZlBpYykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgeEZyYWMsIHlGcmFjLCB3aWR0aCwgaGVpZ2h0LCBjaHJvbWFQYXJ0V2lkdGgsIGNocm9tYVBhcnRIZWlnaHQ7Ci0gICAgaTMyIHhJbnQsIHlJbnQ7Ci0gICAgdTggKnJlZjsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKG12KTsKLSAgICBBU1NFUlQocmVmUGljKTsKLSAgICBBU1NFUlQocmVmUGljLT5kYXRhKTsKLSAgICBBU1NFUlQocmVmUGljLT53aWR0aCk7Ci0gICAgQVNTRVJUKHJlZlBpYy0+aGVpZ2h0KTsKLQotICAgIHdpZHRoICA9IDggKiByZWZQaWMtPndpZHRoOwotICAgIGhlaWdodCA9IDggKiByZWZQaWMtPmhlaWdodDsKLQotICAgIHhJbnQgPSAoeEFMID4+IDEpICsgKG12LT5ob3IgPj4gMyk7Ci0gICAgeUludCA9ICh5QUwgPj4gMSkgKyAobXYtPnZlciA+PiAzKTsKLSAgICB4RnJhYyA9IG12LT5ob3IgJiAweDc7Ci0gICAgeUZyYWMgPSBtdi0+dmVyICYgMHg3OwotCi0gICAgY2hyb21hUGFydFdpZHRoICA9IHBhcnRXaWR0aCA+PiAxOwotICAgIGNocm9tYVBhcnRIZWlnaHQgPSBwYXJ0SGVpZ2h0ID4+IDE7Ci0gICAgcmVmID0gcmVmUGljLT5kYXRhICsgMjU2ICogcmVmUGljLT53aWR0aCAqIHJlZlBpYy0+aGVpZ2h0OwotCi0gICAgaWYgKHhGcmFjICYmIHlGcmFjKQotICAgIHsKLSAgICAgICAgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yVmVyKHJlZiwgbWJQYXJ0Q2hyb21hLCB4SW50LCB5SW50LCB3aWR0aCwKLSAgICAgICAgICAgICAgICBoZWlnaHQsIHhGcmFjLCB5RnJhYywgY2hyb21hUGFydFdpZHRoLCBjaHJvbWFQYXJ0SGVpZ2h0KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoeEZyYWMpCi0gICAgewotICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3IocmVmLCBtYlBhcnRDaHJvbWEsIHhJbnQsIHlJbnQsIHdpZHRoLAotICAgICAgICAgICAgICAgIGhlaWdodCwgeEZyYWMsIGNocm9tYVBhcnRXaWR0aCwgY2hyb21hUGFydEhlaWdodCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHlGcmFjKQotICAgIHsKLSAgICAgICAgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hVmVyKHJlZiwgbWJQYXJ0Q2hyb21hLCB4SW50LCB5SW50LCB3aWR0aCwKLSAgICAgICAgICAgICAgICBoZWlnaHQsIHlGcmFjLCBjaHJvbWFQYXJ0V2lkdGgsIGNocm9tYVBhcnRIZWlnaHQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgbWJQYXJ0Q2hyb21hLCB4SW50LCB5SW50LCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgY2hyb21hUGFydFdpZHRoLCBjaHJvbWFQYXJ0SGVpZ2h0LCA4KTsKLSAgICAgICAgcmVmICs9IHdpZHRoICogaGVpZ2h0OwotICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgbWJQYXJ0Q2hyb21hICsgOCo4LCB4SW50LCB5SW50LCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgY2hyb21hUGFydFdpZHRoLCBjaHJvbWFQYXJ0SGVpZ2h0LCA4KTsKLSAgICB9Ci0KLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZVZlckhhbGYKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gdmVydGljYWwgaW50ZXJwb2xhdGlvbiBvZiBwaXhlbCBwb3NpdGlvbiAnaCcKLSAgICAgICAgICBmb3IgYSBibG9jay4gT3ZlcmZpbGxpbmcgaXMgZG9uZSBvbmx5IGlmIG5lZWRlZC4gUmVmZXJlbmNlCi0gICAgICAgICAgaW1hZ2UgKHJlZikgaXMgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZCB0aGUgcHJlZGljdGVkIHBhcnQKLSAgICAgICAgICBpcyB3cml0dGVuIHRvIG1hY3JvYmxvY2sgYXJyYXkgKG1iKQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmbmRlZiBIMjY0REVDX0FSTTExCi12b2lkIGgyNjRic2RJbnRlcnBvbGF0ZVZlckhhbGYoCi0gIHU4ICpyZWYsCi0gIHU4ICptYiwKLSAgaTMyIHgwLAotICBpMzIgeTAsCi0gIHUzMiB3aWR0aCwKLSAgdTMyIGhlaWdodCwKLSAgdTMyIHBhcnRXaWR0aCwKLSAgdTMyIHBhcnRIZWlnaHQpCi17Ci0gICAgdTMyIHAxWzIxKjIxLzQrMV07Ci0gICAgdTMyIGksIGo7Ci0gICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7Ci0gICAgdTggKnB0ckMsICpwdHJWOwotICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKLQotICAgIC8qIENvZGUgKi8KLQotICAgIEFTU0VSVChyZWYpOwotICAgIEFTU0VSVChtYik7Ci0KLSAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArcGFydFdpZHRoID4gd2lkdGgpIHx8Ci0gICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK3BhcnRIZWlnaHQrNSA+IGhlaWdodCkpCi0gICAgewotICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgKHU4KilwMSwgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgIHBhcnRXaWR0aCwgcGFydEhlaWdodCs1LCBwYXJ0V2lkdGgpOwotCi0gICAgICAgIHgwID0gMDsKLSAgICAgICAgeTAgPSAwOwotICAgICAgICByZWYgPSAodTgqKXAxOwotICAgICAgICB3aWR0aCA9IHBhcnRXaWR0aDsKLSAgICB9Ci0KLSAgICByZWYgKz0gKHUzMil5MCAqIHdpZHRoICsgKHUzMil4MDsKLQotICAgIHB0ckMgPSByZWYgKyB3aWR0aDsKLSAgICBwdHJWID0gcHRyQyArIDUqd2lkdGg7Ci0KLSAgICAvKiA0IHBpeGVscyBwZXIgaXRlcmF0aW9uLCBpbnRlcnBvbGF0ZSB1c2luZyA1IHZlcnRpY2FsIHNhbXBsZXMgKi8KLSAgICBmb3IgKGkgPSAocGFydEhlaWdodCA+PiAyKTsgaTsgaS0tKQotICAgIHsKLSAgICAgICAgLyogaDEgPSAoMTYgKyBBICsgMTYoRytNKSArIDQoRytNKSAtIDQoQytSKSAtIChDK1IpICsgVCkgPj4gNSAqLwotICAgICAgICBmb3IgKGogPSBwYXJ0V2lkdGg7IGo7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgdG1wNCA9IHB0clZbLShpMzIpd2lkdGgqMl07Ci0gICAgICAgICAgICB0bXA1ID0gcHRyVlstKGkzMil3aWR0aF07Ci0gICAgICAgICAgICB0bXAxID0gcHRyVlt3aWR0aF07Ci0gICAgICAgICAgICB0bXAyID0gcHRyVlt3aWR0aCoyXTsKLSAgICAgICAgICAgIHRtcDYgPSAqcHRyVisrOwotCi0gICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDE7Ci0gICAgICAgICAgICB0bXAyIC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMiAtPSB0bXA3OwotICAgICAgICAgICAgdG1wMiArPSAxNjsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wNjsKLSAgICAgICAgICAgIHRtcDMgPSBwdHJDW3dpZHRoKjJdOwotICAgICAgICAgICAgdG1wMiArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAyICs9IHRtcDM7Ci0gICAgICAgICAgICB0bXAyID0gY2xwW3RtcDI+PjVdOwotICAgICAgICAgICAgdG1wMSArPSAxNjsKLSAgICAgICAgICAgIG1iWzQ4XSA9ICh1OCl0bXAyOwotCi0gICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDY7Ci0gICAgICAgICAgICB0bXAxIC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMSAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXA1OwotICAgICAgICAgICAgdG1wMiA9IHB0ckNbd2lkdGhdOwotICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAxICs9IHRtcDI7Ci0gICAgICAgICAgICB0bXAxID0gY2xwW3RtcDE+PjVdOwotICAgICAgICAgICAgdG1wNiArPSAxNjsKLSAgICAgICAgICAgIG1iWzMyXSA9ICh1OCl0bXAxOwotCi0gICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7Ci0gICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNiAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAzOwotICAgICAgICAgICAgdG1wMSA9ICpwdHJDOwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA2ICs9IHRtcDE7Ci0gICAgICAgICAgICB0bXA2ID0gY2xwW3RtcDY+PjVdOwotICAgICAgICAgICAgdG1wNSArPSAxNjsKLSAgICAgICAgICAgIG1iWzE2XSA9ICh1OCl0bXA2OwotCi0gICAgICAgICAgICB0bXAxICs9IHRtcDQ7Ci0gICAgICAgICAgICB0bXA1IC09ICh0bXAxIDw8IDIpOwotICAgICAgICAgICAgdG1wNSAtPSB0bXAxOwotICAgICAgICAgICAgdG1wMyArPSB0bXAyOwotICAgICAgICAgICAgdG1wNiA9IHB0ckNbLShpMzIpd2lkdGhdOwotICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgMik7Ci0gICAgICAgICAgICB0bXA1ICs9IHRtcDY7Ci0gICAgICAgICAgICB0bXA1ID0gY2xwW3RtcDU+PjVdOwotICAgICAgICAgICAgKm1iKysgPSAodTgpdG1wNTsKLSAgICAgICAgICAgIHB0ckMrKzsKLSAgICAgICAgfQotICAgICAgICBwdHJDICs9IDQqd2lkdGggLSBwYXJ0V2lkdGg7Ci0gICAgICAgIHB0clYgKz0gNCp3aWR0aCAtIHBhcnRXaWR0aDsKLSAgICAgICAgbWIgKz0gNCoxNiAtIHBhcnRXaWR0aDsKLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50ZXJwb2xhdGVWZXJRdWFydGVyCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBGdW5jdGlvbiB0byBwZXJmb3JtIHZlcnRpY2FsIGludGVycG9sYXRpb24gb2YgcGl4ZWwgcG9zaXRpb24gJ2QnCi0gICAgICAgICAgb3IgJ24nIGZvciBhIGJsb2NrLiBPdmVyZmlsbGluZyBpcyBkb25lIG9ubHkgaWYgbmVlZGVkLiBSZWZlcmVuY2UKLSAgICAgICAgICBpbWFnZSAocmVmKSBpcyByZWFkIGF0IGNvcnJlY3QgcG9zaXRpb24gYW5kIHRoZSBwcmVkaWN0ZWQgcGFydAotICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gbWFjcm9ibG9jayBhcnJheSAobWIpCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZEludGVycG9sYXRlVmVyUXVhcnRlcigKLSAgdTggKnJlZiwKLSAgdTggKm1iLAotICBpMzIgeDAsCi0gIGkzMiB5MCwKLSAgdTMyIHdpZHRoLAotICB1MzIgaGVpZ2h0LAotICB1MzIgcGFydFdpZHRoLAotICB1MzIgcGFydEhlaWdodCwKLSAgdTMyIHZlck9mZnNldCkgICAgLyogMCBmb3IgcGl4ZWwgZCwgMSBmb3IgcGl4ZWwgbiAqLwotewotICAgIHUzMiBwMVsyMSoyMS80KzFdOwotICAgIHUzMiBpLCBqOwotICAgIGkzMiB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OwotICAgIHU4ICpwdHJDLCAqcHRyViwgKnB0ckludDsKLSAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7Ci0KLSAgICAvKiBDb2RlICovCi0KLSAgICBBU1NFUlQocmVmKTsKLSAgICBBU1NFUlQobWIpOwotCi0gICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK3BhcnRXaWR0aCA+IHdpZHRoKSB8fAotICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtwYXJ0SGVpZ2h0KzUgPiBoZWlnaHQpKQotICAgIHsKLSAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsICh1OCopcDEsIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQrNSwgcGFydFdpZHRoKTsKLQotICAgICAgICB4MCA9IDA7Ci0gICAgICAgIHkwID0gMDsKLSAgICAgICAgcmVmID0gKHU4KilwMTsKLSAgICAgICAgd2lkdGggPSBwYXJ0V2lkdGg7Ci0gICAgfQotCi0gICAgcmVmICs9ICh1MzIpeTAgKiB3aWR0aCArICh1MzIpeDA7Ci0KLSAgICBwdHJDID0gcmVmICsgd2lkdGg7Ci0gICAgcHRyViA9IHB0ckMgKyA1KndpZHRoOwotCi0gICAgLyogUG9pbnRlciB0byBpbnRlZ2VyIHNhbXBsZSBwb3NpdGlvbiwgZWl0aGVyIE0gb3IgUiAqLwotICAgIHB0ckludCA9IHB0ckMgKyAoMit2ZXJPZmZzZXQpKndpZHRoOwotCi0gICAgLyogNCBwaXhlbHMgcGVyIGl0ZXJhdGlvbgotICAgICAqIGludGVycG9sYXRlIHVzaW5nIDUgdmVydGljYWwgc2FtcGxlcyBhbmQgYXZlcmFnZSBiZXR3ZWVuCi0gICAgICogaW50ZXJwb2xhdGVkIHZhbHVlIGFuZCBpbnRlZ2VyIHNhbXBsZSB2YWx1ZSAqLwotICAgIGZvciAoaSA9IChwYXJ0SGVpZ2h0ID4+IDIpOyBpOyBpLS0pCi0gICAgewotICAgICAgICAvKiBoMSA9ICgxNiArIEEgKyAxNihHK00pICsgNChHK00pIC0gNChDK1IpIC0gKEMrUikgKyBUKSA+PiA1ICovCi0gICAgICAgIGZvciAoaiA9IHBhcnRXaWR0aDsgajsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXA0ID0gcHRyVlstKGkzMil3aWR0aCoyXTsKLSAgICAgICAgICAgIHRtcDUgPSBwdHJWWy0oaTMyKXdpZHRoXTsKLSAgICAgICAgICAgIHRtcDEgPSBwdHJWW3dpZHRoXTsKLSAgICAgICAgICAgIHRtcDIgPSBwdHJWW3dpZHRoKjJdOwotICAgICAgICAgICAgdG1wNiA9ICpwdHJWKys7Ci0KLSAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMTsKLSAgICAgICAgICAgIHRtcDIgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAyIC09IHRtcDc7Ci0gICAgICAgICAgICB0bXAyICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IHRtcDUgKyB0bXA2OwotICAgICAgICAgICAgdG1wMyA9IHB0ckNbd2lkdGgqMl07Ci0gICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wMiArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDIgKz0gdG1wMzsKLSAgICAgICAgICAgIHRtcDIgPSBjbHBbdG1wMj4+NV07Ci0gICAgICAgICAgICB0bXA3ID0gcHRySW50W3dpZHRoKjJdOwotICAgICAgICAgICAgdG1wMSArPSAxNjsKLSAgICAgICAgICAgIHRtcDIrKzsKLSAgICAgICAgICAgIG1iWzQ4XSA9ICh1OCkoKHRtcDIgKyB0bXA3KSA+PiAxKTsKLQotICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA2OwotICAgICAgICAgICAgdG1wMSAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDEgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wNTsKLSAgICAgICAgICAgIHRtcDIgPSBwdHJDW3dpZHRoXTsKLSAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMSArPSB0bXAyOwotICAgICAgICAgICAgdG1wMSA9IGNscFt0bXAxPj41XTsKLSAgICAgICAgICAgIHRtcDcgPSBwdHJJbnRbd2lkdGhdOwotICAgICAgICAgICAgdG1wNiArPSAxNjsKLSAgICAgICAgICAgIHRtcDErKzsKLSAgICAgICAgICAgIG1iWzMyXSA9ICh1OCkoKHRtcDEgKyB0bXA3KSA+PiAxKTsKLQotICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXA1OwotICAgICAgICAgICAgdG1wNiAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDYgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMzsKLSAgICAgICAgICAgIHRtcDEgPSAqcHRyQzsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNiArPSB0bXAxOwotICAgICAgICAgICAgdG1wNiA9IGNscFt0bXA2Pj41XTsKLSAgICAgICAgICAgIHRtcDcgPSAqcHRySW50OwotICAgICAgICAgICAgdG1wNSArPSAxNjsKLSAgICAgICAgICAgIHRtcDYrKzsKLSAgICAgICAgICAgIG1iWzE2XSA9ICh1OCkoKHRtcDYgKyB0bXA3KSA+PiAxKTsKLQotICAgICAgICAgICAgdG1wMSArPSB0bXA0OwotICAgICAgICAgICAgdG1wNSAtPSAodG1wMSA8PCAyKTsKLSAgICAgICAgICAgIHRtcDUgLT0gdG1wMTsKLSAgICAgICAgICAgIHRtcDMgKz0gdG1wMjsKLSAgICAgICAgICAgIHRtcDYgPSBwdHJDWy0oaTMyKXdpZHRoXTsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgNCk7Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDIpOwotICAgICAgICAgICAgdG1wNSArPSB0bXA2OwotICAgICAgICAgICAgdG1wNSA9IGNscFt0bXA1Pj41XTsKLSAgICAgICAgICAgIHRtcDcgPSBwdHJJbnRbLShpMzIpd2lkdGhdOwotICAgICAgICAgICAgdG1wNSsrOwotICAgICAgICAgICAgKm1iKysgPSAodTgpKCh0bXA1ICsgdG1wNykgPj4gMSk7Ci0gICAgICAgICAgICBwdHJDKys7Ci0gICAgICAgICAgICBwdHJJbnQrKzsKLSAgICAgICAgfQotICAgICAgICBwdHJDICs9IDQqd2lkdGggLSBwYXJ0V2lkdGg7Ci0gICAgICAgIHB0clYgKz0gNCp3aWR0aCAtIHBhcnRXaWR0aDsKLSAgICAgICAgcHRySW50ICs9IDQqd2lkdGggLSBwYXJ0V2lkdGg7Ci0gICAgICAgIG1iICs9IDQqMTYgLSBwYXJ0V2lkdGg7Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEludGVycG9sYXRlSG9ySGFsZgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgRnVuY3Rpb24gdG8gcGVyZm9ybSBob3Jpem9udGFsIGludGVycG9sYXRpb24gb2YgcGl4ZWwgcG9zaXRpb24gJ2InCi0gICAgICAgICAgZm9yIGEgYmxvY2suIE92ZXJmaWxsaW5nIGlzIGRvbmUgb25seSBpZiBuZWVkZWQuIFJlZmVyZW5jZQotICAgICAgICAgIGltYWdlIChyZWYpIGlzIHJlYWQgYXQgY29ycmVjdCBwb3NpdGlvbiBhbmQgdGhlIHByZWRpY3RlZCBwYXJ0Ci0gICAgICAgICAgaXMgd3JpdHRlbiB0byBtYWNyb2Jsb2NrIGFycmF5IChtYikKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVIb3JIYWxmKAotICB1OCAqcmVmLAotICB1OCAqbWIsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0KQotewotICAgIHUzMiBwMVsyMSoyMS80KzFdOwotICAgIHU4ICpwdHJKOwotICAgIHUzMiB4LCB5OwotICAgIGkzMiB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OwotICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKLQotICAgIC8qIENvZGUgKi8KLQotICAgIEFTU0VSVChyZWYpOwotICAgIEFTU0VSVChtYik7Ci0gICAgQVNTRVJUKChwYXJ0V2lkdGgmMHgzKSA9PSAwKTsKLSAgICBBU1NFUlQoKHBhcnRIZWlnaHQmMHgzKSA9PSAwKTsKLQotICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtwYXJ0V2lkdGgrNSA+IHdpZHRoKSB8fAotICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtwYXJ0SGVpZ2h0ID4gaGVpZ2h0KSkKLSAgICB7Ci0gICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCAodTgqKXAxLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgcGFydFdpZHRoKzUsIHBhcnRIZWlnaHQsIHBhcnRXaWR0aCs1KTsKLQotICAgICAgICB4MCA9IDA7Ci0gICAgICAgIHkwID0gMDsKLSAgICAgICAgcmVmID0gKHU4KilwMTsKLSAgICAgICAgd2lkdGggPSBwYXJ0V2lkdGggKyA1OwotICAgIH0KLQotICAgIHJlZiArPSAodTMyKXkwICogd2lkdGggKyAodTMyKXgwOwotCi0gICAgcHRySiA9IHJlZiArIDU7Ci0KLSAgICBmb3IgKHkgPSBwYXJ0SGVpZ2h0OyB5OyB5LS0pCi0gICAgewotICAgICAgICB0bXA2ID0gKihwdHJKIC0gNSk7Ci0gICAgICAgIHRtcDUgPSAqKHB0ckogLSA0KTsKLSAgICAgICAgdG1wNCA9ICoocHRySiAtIDMpOwotICAgICAgICB0bXAzID0gKihwdHJKIC0gMik7Ci0gICAgICAgIHRtcDIgPSAqKHB0ckogLSAxKTsKLQotICAgICAgICAvKiBjYWxjdWxhdGUgNCBwZWxzIHBlciBpdGVyYXRpb24gKi8KLSAgICAgICAgZm9yICh4ID0gKHBhcnRXaWR0aCA+PiAyKTsgeDsgeC0tKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBGaXJzdCBwaXhlbCAqLwotICAgICAgICAgICAgdG1wNiArPSAxNjsKLSAgICAgICAgICAgIHRtcDcgPSB0bXAzICsgdG1wNDsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXA1OwotICAgICAgICAgICAgdG1wMSA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNiAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNiArPSB0bXAxOwotICAgICAgICAgICAgdG1wNiA9IGNscFt0bXA2Pj41XTsKLSAgICAgICAgICAgIC8qIFNlY29uZCBwaXhlbCAqLwotICAgICAgICAgICAgdG1wNSArPSAxNjsKLSAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wMzsKLSAgICAgICAgICAgICptYisrID0gKHU4KXRtcDY7Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNSArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXAxICsgdG1wNDsKLSAgICAgICAgICAgIHRtcDYgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wNSAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDUgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKLSAgICAgICAgICAgIHRtcDUgPSBjbHBbdG1wNT4+NV07Ci0gICAgICAgICAgICAvKiBUaGlyZCBwaXhlbCAqLwotICAgICAgICAgICAgdG1wNCArPSAxNjsKLSAgICAgICAgICAgIHRtcDcgPSB0bXAxICsgdG1wMjsKLSAgICAgICAgICAgICptYisrID0gKHU4KXRtcDU7Ci0gICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNCArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMzsKLSAgICAgICAgICAgIHRtcDUgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wNCAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDQgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDQgKz0gdG1wNTsKLSAgICAgICAgICAgIHRtcDQgPSBjbHBbdG1wND4+NV07Ci0gICAgICAgICAgICAvKiBGb3VydGggcGl4ZWwgKi8KLSAgICAgICAgICAgIHRtcDMgKz0gMTY7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNiArIHRtcDE7Ci0gICAgICAgICAgICAqbWIrKyA9ICh1OCl0bXA0OwotICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDMgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDI7Ci0gICAgICAgICAgICB0bXA0ID0gKnB0ckorKzsKLSAgICAgICAgICAgIHRtcDMgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAzIC09IHRtcDc7Ci0gICAgICAgICAgICB0bXAzICs9IHRtcDQ7Ci0gICAgICAgICAgICB0bXAzID0gY2xwW3RtcDM+PjVdOwotICAgICAgICAgICAgdG1wNyA9IHRtcDQ7Ci0gICAgICAgICAgICB0bXA0ID0gdG1wNjsKLSAgICAgICAgICAgIHRtcDYgPSB0bXAyOwotICAgICAgICAgICAgdG1wMiA9IHRtcDc7Ci0gICAgICAgICAgICAqbWIrKyA9ICh1OCl0bXAzOwotICAgICAgICAgICAgdG1wMyA9IHRtcDU7Ci0gICAgICAgICAgICB0bXA1ID0gdG1wMTsKLSAgICAgICAgfQotICAgICAgICBwdHJKICs9IHdpZHRoIC0gcGFydFdpZHRoOwotICAgICAgICBtYiArPSAxNiAtIHBhcnRXaWR0aDsKLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50ZXJwb2xhdGVIb3JRdWFydGVyCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBGdW5jdGlvbiB0byBwZXJmb3JtIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbiBvZiBwaXhlbCBwb3NpdGlvbiAnYScKLSAgICAgICAgICBvciAnYycgZm9yIGEgYmxvY2suIE92ZXJmaWxsaW5nIGlzIGRvbmUgb25seSBpZiBuZWVkZWQuIFJlZmVyZW5jZQotICAgICAgICAgIGltYWdlIChyZWYpIGlzIHJlYWQgYXQgY29ycmVjdCBwb3NpdGlvbiBhbmQgdGhlIHByZWRpY3RlZCBwYXJ0Ci0gICAgICAgICAgaXMgd3JpdHRlbiB0byBtYWNyb2Jsb2NrIGFycmF5IChtYikKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVIb3JRdWFydGVyKAotICB1OCAqcmVmLAotICB1OCAqbWIsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0LAotICB1MzIgaG9yT2Zmc2V0KSAvKiAwIGZvciBwaXhlbCBhLCAxIGZvciBwaXhlbCBjICovCi17Ci0gICAgdTMyIHAxWzIxKjIxLzQrMV07Ci0gICAgdTggKnB0cko7Ci0gICAgdTMyIHgsIHk7Ci0gICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7Ci0gICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOwotCi0gICAgLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHJlZik7Ci0gICAgQVNTRVJUKG1iKTsKLQotICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtwYXJ0V2lkdGgrNSA+IHdpZHRoKSB8fAotICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtwYXJ0SGVpZ2h0ID4gaGVpZ2h0KSkKLSAgICB7Ci0gICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCAodTgqKXAxLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgcGFydFdpZHRoKzUsIHBhcnRIZWlnaHQsIHBhcnRXaWR0aCs1KTsKLQotICAgICAgICB4MCA9IDA7Ci0gICAgICAgIHkwID0gMDsKLSAgICAgICAgcmVmID0gKHU4KilwMTsKLSAgICAgICAgd2lkdGggPSBwYXJ0V2lkdGggKyA1OwotICAgIH0KLQotICAgIHJlZiArPSAodTMyKXkwICogd2lkdGggKyAodTMyKXgwOwotCi0gICAgcHRySiA9IHJlZiArIDU7Ci0KLSAgICBmb3IgKHkgPSBwYXJ0SGVpZ2h0OyB5OyB5LS0pCi0gICAgewotICAgICAgICB0bXA2ID0gKihwdHJKIC0gNSk7Ci0gICAgICAgIHRtcDUgPSAqKHB0ckogLSA0KTsKLSAgICAgICAgdG1wNCA9ICoocHRySiAtIDMpOwotICAgICAgICB0bXAzID0gKihwdHJKIC0gMik7Ci0gICAgICAgIHRtcDIgPSAqKHB0ckogLSAxKTsKLQotICAgICAgICAvKiBjYWxjdWxhdGUgNCBwZWxzIHBlciBpdGVyYXRpb24gKi8KLSAgICAgICAgZm9yICh4ID0gKHBhcnRXaWR0aCA+PiAyKTsgeDsgeC0tKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBGaXJzdCBwaXhlbCAqLwotICAgICAgICAgICAgdG1wNiArPSAxNjsKLSAgICAgICAgICAgIHRtcDcgPSB0bXAzICsgdG1wNDsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXA1OwotICAgICAgICAgICAgdG1wMSA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNiAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNiArPSB0bXAxOwotICAgICAgICAgICAgdG1wNiA9IGNscFt0bXA2Pj41XTsKLSAgICAgICAgICAgIHRtcDUgKz0gMTY7Ci0gICAgICAgICAgICBpZiAoIWhvck9mZnNldCkKLSAgICAgICAgICAgICAgICB0bXA2ICs9IHRtcDQ7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdG1wNiArPSB0bXAzOwotICAgICAgICAgICAgKm1iKysgPSAodTgpKCh0bXA2ICsgMSkgPj4gMSk7Ci0gICAgICAgICAgICAvKiBTZWNvbmQgcGl4ZWwgKi8KLSAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wMzsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXA0OwotICAgICAgICAgICAgdG1wNiA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXA1IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNSAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNSArPSB0bXA2OwotICAgICAgICAgICAgdG1wNSA9IGNscFt0bXA1Pj41XTsKLSAgICAgICAgICAgIHRtcDQgKz0gMTY7Ci0gICAgICAgICAgICBpZiAoIWhvck9mZnNldCkKLSAgICAgICAgICAgICAgICB0bXA1ICs9IHRtcDM7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdG1wNSArPSB0bXAyOwotICAgICAgICAgICAgKm1iKysgPSAodTgpKCh0bXA1ICsgMSkgPj4gMSk7Ci0gICAgICAgICAgICAvKiBUaGlyZCBwaXhlbCAqLwotICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXAyOwotICAgICAgICAgICAgdG1wNCArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDQgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNiArIHRtcDM7Ci0gICAgICAgICAgICB0bXA1ID0gKnB0ckorKzsKLSAgICAgICAgICAgIHRtcDQgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA0IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA0ICs9IHRtcDU7Ci0gICAgICAgICAgICB0bXA0ID0gY2xwW3RtcDQ+PjVdOwotICAgICAgICAgICAgdG1wMyArPSAxNjsKLSAgICAgICAgICAgIGlmICghaG9yT2Zmc2V0KQotICAgICAgICAgICAgICAgIHRtcDQgKz0gdG1wMjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB0bXA0ICs9IHRtcDE7Ci0gICAgICAgICAgICAqbWIrKyA9ICh1OCkoKHRtcDQgKyAxKSA+PiAxKTsKLSAgICAgICAgICAgIC8qIEZvdXJ0aCBwaXhlbCAqLwotICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAxOwotICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDMgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDI7Ci0gICAgICAgICAgICB0bXA0ID0gKnB0ckorKzsKLSAgICAgICAgICAgIHRtcDMgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAzIC09IHRtcDc7Ci0gICAgICAgICAgICB0bXAzICs9IHRtcDQ7Ci0gICAgICAgICAgICB0bXAzID0gY2xwW3RtcDM+PjVdOwotICAgICAgICAgICAgaWYgKCFob3JPZmZzZXQpCi0gICAgICAgICAgICAgICAgdG1wMyArPSB0bXAxOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHRtcDMgKz0gdG1wNjsKLSAgICAgICAgICAgICptYisrID0gKHU4KSgodG1wMyArIDEpID4+IDEpOwotICAgICAgICAgICAgdG1wMyA9IHRtcDU7Ci0gICAgICAgICAgICB0bXA1ID0gdG1wMTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA0OwotICAgICAgICAgICAgdG1wNCA9IHRtcDY7Ci0gICAgICAgICAgICB0bXA2ID0gdG1wMjsKLSAgICAgICAgICAgIHRtcDIgPSB0bXA3OwotICAgICAgICB9Ci0gICAgICAgIHB0ckogKz0gd2lkdGggLSBwYXJ0V2lkdGg7Ci0gICAgICAgIG1iICs9IDE2IC0gcGFydFdpZHRoOwotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgaW50ZXJwb2xhdGlvbiBvZiBwaXhlbAotICAgICAgICAgIHBvc2l0aW9uICdlJywgJ2cnLCAncCcgb3IgJ3InIGZvciBhIGJsb2NrLiBPdmVyZmlsbGluZyBpcyBkb25lIG9ubHkKLSAgICAgICAgICBpZiBuZWVkZWQuIFJlZmVyZW5jZSBpbWFnZSAocmVmKSBpcyByZWFkIGF0IGNvcnJlY3QgcG9zaXRpb24gYW5kCi0gICAgICAgICAgdGhlIHByZWRpY3RlZCBwYXJ0IGlzIHdyaXR0ZW4gdG8gbWFjcm9ibG9jayBhcnJheSAobWIpCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZEludGVycG9sYXRlSG9yVmVyUXVhcnRlcigKLSAgdTggKnJlZiwKLSAgdTggKm1iLAotICBpMzIgeDAsCi0gIGkzMiB5MCwKLSAgdTMyIHdpZHRoLAotICB1MzIgaGVpZ2h0LAotICB1MzIgcGFydFdpZHRoLAotICB1MzIgcGFydEhlaWdodCwKLSAgdTMyIGhvclZlck9mZnNldCkgLyogMCBmb3IgcGl4ZWwgZSwgMSBmb3IgcGl4ZWwgZywKLSAgICAgICAgICAgICAgICAgICAgICAgMiBmb3IgcGl4ZWwgcCwgMyBmb3IgcGl4ZWwgciAqLwotewotICAgIHUzMiBwMVsyMSoyMS80KzFdOwotICAgIHU4ICpwdHJDLCAqcHRySiwgKnB0clY7Ci0gICAgdTMyIHgsIHk7Ci0gICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7Ci0gICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOwotCi0gICAgLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHJlZik7Ci0gICAgQVNTRVJUKG1iKTsKLQotICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtwYXJ0V2lkdGgrNSA+IHdpZHRoKSB8fAotICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtwYXJ0SGVpZ2h0KzUgPiBoZWlnaHQpKQotICAgIHsKLSAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsICh1OCopcDEsIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICBwYXJ0V2lkdGgrNSwgcGFydEhlaWdodCs1LCBwYXJ0V2lkdGgrNSk7Ci0KLSAgICAgICAgeDAgPSAwOwotICAgICAgICB5MCA9IDA7Ci0gICAgICAgIHJlZiA9ICh1OCopcDE7Ci0gICAgICAgIHdpZHRoID0gcGFydFdpZHRoKzU7Ci0gICAgfQotCi0gICAgLyogUmVmIHBvaW50cyB0byBHICsgKC0yLCAtMikgKi8KLSAgICByZWYgKz0gKHUzMil5MCAqIHdpZHRoICsgKHUzMil4MDsKLQotICAgIC8qIHB0ckogcG9pbnRzIHRvIGVpdGhlciBKIG9yIFEsIGRlcGVuZGluZyBvbiB2ZXJ0aWNhbCBvZmZzZXQgKi8KLSAgICBwdHJKID0gcmVmICsgKCgoaG9yVmVyT2Zmc2V0ICYgMHgyKSA+PiAxKSArIDIpICogd2lkdGggKyA1OwotCi0gICAgLyogcHRyQyBwb2ludHMgdG8gZWl0aGVyIEMgb3IgRCwgZGVwZW5kaW5nIG9uIGhvcml6b250YWwgb2Zmc2V0ICovCi0gICAgcHRyQyA9IHJlZiArIHdpZHRoICsgMiArIChob3JWZXJPZmZzZXQgJiAweDEpOwotCi0gICAgZm9yICh5ID0gcGFydEhlaWdodDsgeTsgeS0tKQotICAgIHsKLSAgICAgICAgdG1wNiA9ICoocHRySiAtIDUpOwotICAgICAgICB0bXA1ID0gKihwdHJKIC0gNCk7Ci0gICAgICAgIHRtcDQgPSAqKHB0ckogLSAzKTsKLSAgICAgICAgdG1wMyA9ICoocHRySiAtIDIpOwotICAgICAgICB0bXAyID0gKihwdHJKIC0gMSk7Ci0KLSAgICAgICAgLyogSG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uLCBjYWxjdWxhdGUgNCBwZWxzIHBlciBpdGVyYXRpb24gKi8KLSAgICAgICAgZm9yICh4ID0gKHBhcnRXaWR0aCA+PiAyKTsgeDsgeC0tKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBGaXJzdCBwaXhlbCAqLwotICAgICAgICAgICAgdG1wNiArPSAxNjsKLSAgICAgICAgICAgIHRtcDcgPSB0bXAzICsgdG1wNDsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXA1OwotICAgICAgICAgICAgdG1wMSA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNiAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNiArPSB0bXAxOwotICAgICAgICAgICAgdG1wNiA9IGNscFt0bXA2Pj41XTsKLSAgICAgICAgICAgIC8qIFNlY29uZCBwaXhlbCAqLwotICAgICAgICAgICAgdG1wNSArPSAxNjsKLSAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wMzsKLSAgICAgICAgICAgICptYisrID0gKHU4KXRtcDY7Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNSArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXAxICsgdG1wNDsKLSAgICAgICAgICAgIHRtcDYgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wNSAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDUgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKLSAgICAgICAgICAgIHRtcDUgPSBjbHBbdG1wNT4+NV07Ci0gICAgICAgICAgICAvKiBUaGlyZCBwaXhlbCAqLwotICAgICAgICAgICAgdG1wNCArPSAxNjsKLSAgICAgICAgICAgIHRtcDcgPSB0bXAxICsgdG1wMjsKLSAgICAgICAgICAgICptYisrID0gKHU4KXRtcDU7Ci0gICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNCArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMzsKLSAgICAgICAgICAgIHRtcDUgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wNCAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDQgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDQgKz0gdG1wNTsKLSAgICAgICAgICAgIHRtcDQgPSBjbHBbdG1wND4+NV07Ci0gICAgICAgICAgICAvKiBGb3VydGggcGl4ZWwgKi8KLSAgICAgICAgICAgIHRtcDMgKz0gMTY7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNiArIHRtcDE7Ci0gICAgICAgICAgICAqbWIrKyA9ICh1OCl0bXA0OwotICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDMgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDI7Ci0gICAgICAgICAgICB0bXA0ID0gKnB0ckorKzsKLSAgICAgICAgICAgIHRtcDMgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAzIC09IHRtcDc7Ci0gICAgICAgICAgICB0bXAzICs9IHRtcDQ7Ci0gICAgICAgICAgICB0bXAzID0gY2xwW3RtcDM+PjVdOwotICAgICAgICAgICAgdG1wNyA9IHRtcDQ7Ci0gICAgICAgICAgICB0bXA0ID0gdG1wNjsKLSAgICAgICAgICAgIHRtcDYgPSB0bXAyOwotICAgICAgICAgICAgdG1wMiA9IHRtcDc7Ci0gICAgICAgICAgICAqbWIrKyA9ICh1OCl0bXAzOwotICAgICAgICAgICAgdG1wMyA9IHRtcDU7Ci0gICAgICAgICAgICB0bXA1ID0gdG1wMTsKLSAgICAgICAgfQotICAgICAgICBwdHJKICs9IHdpZHRoIC0gcGFydFdpZHRoOwotICAgICAgICBtYiArPSAxNiAtIHBhcnRXaWR0aDsKLSAgICB9Ci0KLSAgICBtYiAtPSAxNipwYXJ0SGVpZ2h0OwotICAgIHB0clYgPSBwdHJDICsgNSp3aWR0aDsKLQotICAgIGZvciAoeSA9IChwYXJ0SGVpZ2h0ID4+IDIpOyB5OyB5LS0pCi0gICAgewotICAgICAgICAvKiBWZXJ0aWNhbCBpbnRlcnBvbGF0aW9uIGFuZCBhdmVyYWdpbmcsIDQgcGVscyBwZXIgaXRlcmF0aW9uICovCi0gICAgICAgIGZvciAoeCA9IHBhcnRXaWR0aDsgeDsgeC0tKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXA0ID0gcHRyVlstKGkzMil3aWR0aCoyXTsKLSAgICAgICAgICAgIHRtcDUgPSBwdHJWWy0oaTMyKXdpZHRoXTsKLSAgICAgICAgICAgIHRtcDEgPSBwdHJWW3dpZHRoXTsKLSAgICAgICAgICAgIHRtcDIgPSBwdHJWW3dpZHRoKjJdOwotICAgICAgICAgICAgdG1wNiA9ICpwdHJWKys7Ci0KLSAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMTsKLSAgICAgICAgICAgIHRtcDIgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAyIC09IHRtcDc7Ci0gICAgICAgICAgICB0bXAyICs9IDE2OwotICAgICAgICAgICAgdG1wNyA9IHRtcDUgKyB0bXA2OwotICAgICAgICAgICAgdG1wMyA9IHB0ckNbd2lkdGgqMl07Ci0gICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wMiArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDIgKz0gdG1wMzsKLSAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wMj4+NV07Ci0gICAgICAgICAgICB0bXAyID0gbWJbNDhdOwotICAgICAgICAgICAgdG1wMSArPSAxNjsKLSAgICAgICAgICAgIHRtcDcrKzsKLSAgICAgICAgICAgIG1iWzQ4XSA9ICh1OCkoKHRtcDIgKyB0bXA3KSA+PiAxKTsKLQotICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA2OwotICAgICAgICAgICAgdG1wMSAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDEgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wNTsKLSAgICAgICAgICAgIHRtcDIgPSBwdHJDW3dpZHRoXTsKLSAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMSArPSB0bXAyOwotICAgICAgICAgICAgdG1wNyA9IGNscFt0bXAxPj41XTsKLSAgICAgICAgICAgIHRtcDEgPSBtYlszMl07Ci0gICAgICAgICAgICB0bXA2ICs9IDE2OwotICAgICAgICAgICAgdG1wNysrOwotICAgICAgICAgICAgbWJbMzJdID0gKHU4KSgodG1wMSArIHRtcDcpID4+IDEpOwotCi0gICAgICAgICAgICB0bXAxID0gKnB0ckM7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7Ci0gICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNiAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAzOwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA2ICs9IHRtcDE7Ci0gICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDY+PjVdOwotICAgICAgICAgICAgdG1wNiA9IG1iWzE2XTsKLSAgICAgICAgICAgIHRtcDUgKz0gMTY7Ci0gICAgICAgICAgICB0bXA3Kys7Ci0gICAgICAgICAgICBtYlsxNl0gPSAodTgpKCh0bXA2ICsgdG1wNykgPj4gMSk7Ci0KLSAgICAgICAgICAgIHRtcDYgPSBwdHJDWy0oaTMyKXdpZHRoXTsKLSAgICAgICAgICAgIHRtcDEgKz0gdG1wNDsKLSAgICAgICAgICAgIHRtcDUgLT0gKHRtcDEgPDwgMik7Ci0gICAgICAgICAgICB0bXA1IC09IHRtcDE7Ci0gICAgICAgICAgICB0bXAzICs9IHRtcDI7Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDQpOwotICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKLSAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNT4+NV07Ci0gICAgICAgICAgICB0bXA1ID0gKm1iOwotICAgICAgICAgICAgdG1wNysrOwotICAgICAgICAgICAgKm1iKysgPSAodTgpKCh0bXA1ICsgdG1wNykgPj4gMSk7Ci0gICAgICAgICAgICBwdHJDKys7Ci0KLSAgICAgICAgfQotICAgICAgICBwdHJDICs9IDQqd2lkdGggLSBwYXJ0V2lkdGg7Ci0gICAgICAgIHB0clYgKz0gNCp3aWR0aCAtIHBhcnRXaWR0aDsKLSAgICAgICAgbWIgKz0gNCoxNiAtIHBhcnRXaWR0aDsKLSAgICB9Ci0KLX0KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJbnRlcnBvbGF0ZU1pZEhhbGYKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgaW50ZXJwb2xhdGlvbiBvZiBwaXhlbAotICAgICAgICAgIHBvc2l0aW9uICdqJyBmb3IgYSBibG9jay4gT3ZlcmZpbGxpbmcgaXMgZG9uZSBvbmx5IGlmIG5lZWRlZC4KLSAgICAgICAgICBSZWZlcmVuY2UgaW1hZ2UgKHJlZikgaXMgcmVhZCBhdCBjb3JyZWN0IHBvc2l0aW9uIGFuZCB0aGUgcHJlZGljdGVkCi0gICAgICAgICAgcGFydCBpcyB3cml0dGVuIHRvIG1hY3JvYmxvY2sgYXJyYXkgKG1iKQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RJbnRlcnBvbGF0ZU1pZEhhbGYoCi0gIHU4ICpyZWYsCi0gIHU4ICptYiwKLSAgaTMyIHgwLAotICBpMzIgeTAsCi0gIHUzMiB3aWR0aCwKLSAgdTMyIGhlaWdodCwKLSAgdTMyIHBhcnRXaWR0aCwKLSAgdTMyIHBhcnRIZWlnaHQpCi17Ci0gICAgdTMyIHAxWzIxKjIxLzQrMV07Ci0gICAgdTMyIHgsIHk7Ci0gICAgaTMyIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7Ci0gICAgaTMyICpwdHJDLCAqcHRyViwgKmIxOwotICAgIHU4ICAqcHRySjsKLSAgICBpMzIgdGFibGVbMjEqMTZdOwotICAgIGNvbnN0IHU4ICpjbHAgPSBoMjY0YnNkQ2xpcCArIDUxMjsKLQotICAgIC8qIENvZGUgKi8KLQotICAgIEFTU0VSVChyZWYpOwotICAgIEFTU0VSVChtYik7Ci0KLSAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArcGFydFdpZHRoKzUgPiB3aWR0aCkgfHwKLSAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArcGFydEhlaWdodCs1ID4gaGVpZ2h0KSkKLSAgICB7Ci0gICAgICAgIGgyNjRic2RGaWxsQmxvY2socmVmLCAodTgqKXAxLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgcGFydFdpZHRoKzUsIHBhcnRIZWlnaHQrNSwgcGFydFdpZHRoKzUpOwotCi0gICAgICAgIHgwID0gMDsKLSAgICAgICAgeTAgPSAwOwotICAgICAgICByZWYgPSAodTgqKXAxOwotICAgICAgICB3aWR0aCA9IHBhcnRXaWR0aCs1OwotICAgIH0KLQotICAgIHJlZiArPSAodTMyKXkwICogd2lkdGggKyAodTMyKXgwOwotCi0gICAgYjEgPSB0YWJsZTsKLSAgICBwdHJKID0gcmVmICsgNTsKLQotICAgIC8qIEZpcnN0IHN0ZXA6IGNhbGN1bGF0ZSBpbnRlcm1lZGlhdGUgdmFsdWVzIGZvcgotICAgICAqIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbiAqLwotICAgIGZvciAoeSA9IHBhcnRIZWlnaHQgKyA1OyB5OyB5LS0pCi0gICAgewotICAgICAgICB0bXA2ID0gKihwdHJKIC0gNSk7Ci0gICAgICAgIHRtcDUgPSAqKHB0ckogLSA0KTsKLSAgICAgICAgdG1wNCA9ICoocHRySiAtIDMpOwotICAgICAgICB0bXAzID0gKihwdHJKIC0gMik7Ci0gICAgICAgIHRtcDIgPSAqKHB0ckogLSAxKTsKLQotICAgICAgICAvKiA0IHBlbHMgcGVyIGl0ZXJhdGlvbiAqLwotICAgICAgICBmb3IgKHggPSAocGFydFdpZHRoID4+IDIpOyB4OyB4LS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEZpcnN0IHBpeGVsICovCi0gICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDQ7Ci0gICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wNTsKLSAgICAgICAgICAgIHRtcDEgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wNiAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDYgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDYgKz0gdG1wMTsKLSAgICAgICAgICAgICpiMSsrID0gdG1wNjsKLSAgICAgICAgICAgIC8qIFNlY29uZCBwaXhlbCAqLwotICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXAzOwotICAgICAgICAgICAgdG1wNSArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDQ7Ci0gICAgICAgICAgICB0bXA2ID0gKnB0ckorKzsKLSAgICAgICAgICAgIHRtcDUgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA1IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA1ICs9IHRtcDY7Ci0gICAgICAgICAgICAqYjErKyA9IHRtcDU7Ci0gICAgICAgICAgICAvKiBUaGlyZCBwaXhlbCAqLwotICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXAyOwotICAgICAgICAgICAgdG1wNCArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDQgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNiArIHRtcDM7Ci0gICAgICAgICAgICB0bXA1ID0gKnB0ckorKzsKLSAgICAgICAgICAgIHRtcDQgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA0IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA0ICs9IHRtcDU7Ci0gICAgICAgICAgICAqYjErKyA9IHRtcDQ7Ci0gICAgICAgICAgICAvKiBGb3VydGggcGl4ZWwgKi8KLSAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMTsKLSAgICAgICAgICAgIHRtcDMgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDUgKyB0bXAyOwotICAgICAgICAgICAgdG1wNCA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXAzIC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMyAtPSB0bXA3OwotICAgICAgICAgICAgdG1wMyArPSB0bXA0OwotICAgICAgICAgICAgKmIxKysgPSB0bXAzOwotICAgICAgICAgICAgdG1wNyA9IHRtcDQ7Ci0gICAgICAgICAgICB0bXA0ID0gdG1wNjsKLSAgICAgICAgICAgIHRtcDYgPSB0bXAyOwotICAgICAgICAgICAgdG1wMiA9IHRtcDc7Ci0gICAgICAgICAgICB0bXAzID0gdG1wNTsKLSAgICAgICAgICAgIHRtcDUgPSB0bXAxOwotICAgICAgICB9Ci0gICAgICAgIHB0ckogKz0gd2lkdGggLSBwYXJ0V2lkdGg7Ci0gICAgfQotCi0gICAgLyogU2Vjb25kIHN0ZXA6IGNhbGN1bGF0ZSB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uICovCi0gICAgcHRyQyA9IHRhYmxlICsgcGFydFdpZHRoOwotICAgIHB0clYgPSBwdHJDICsgNSpwYXJ0V2lkdGg7Ci0gICAgZm9yICh5ID0gKHBhcnRIZWlnaHQgPj4gMik7IHk7IHktLSkKLSAgICB7Ci0gICAgICAgIC8qIDQgcGVscyBwZXIgaXRlcmF0aW9uICovCi0gICAgICAgIGZvciAoeCA9IHBhcnRXaWR0aDsgeDsgeC0tKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXA0ID0gcHRyVlstKGkzMilwYXJ0V2lkdGgqMl07Ci0gICAgICAgICAgICB0bXA1ID0gcHRyVlstKGkzMilwYXJ0V2lkdGhdOwotICAgICAgICAgICAgdG1wMSA9IHB0clZbcGFydFdpZHRoXTsKLSAgICAgICAgICAgIHRtcDIgPSBwdHJWW3BhcnRXaWR0aCoyXTsKLSAgICAgICAgICAgIHRtcDYgPSAqcHRyVisrOwotCi0gICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDE7Ci0gICAgICAgICAgICB0bXAyIC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMiAtPSB0bXA3OwotICAgICAgICAgICAgdG1wMiArPSA1MTI7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDY7Ci0gICAgICAgICAgICB0bXAzID0gcHRyQ1twYXJ0V2lkdGgqMl07Ci0gICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wMiArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDIgKz0gdG1wMzsKLSAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wMj4+MTBdOwotICAgICAgICAgICAgdG1wMSArPSA1MTI7Ci0gICAgICAgICAgICBtYls0OF0gPSAodTgpdG1wNzsKLQotICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA2OwotICAgICAgICAgICAgdG1wMSAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDEgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wNTsKLSAgICAgICAgICAgIHRtcDIgPSBwdHJDW3BhcnRXaWR0aF07Ci0gICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDEgKz0gdG1wMjsKLSAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wMT4+MTBdOwotICAgICAgICAgICAgdG1wNiArPSA1MTI7Ci0gICAgICAgICAgICBtYlszMl0gPSAodTgpdG1wNzsKLQotICAgICAgICAgICAgdG1wMSA9ICpwdHJDOwotICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXA1OwotICAgICAgICAgICAgdG1wNiAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDYgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMzsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNiArPSB0bXAxOwotICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA2Pj4xMF07Ci0gICAgICAgICAgICB0bXA1ICs9IDUxMjsKLSAgICAgICAgICAgIG1iWzE2XSA9ICh1OCl0bXA3OwotCi0gICAgICAgICAgICB0bXA2ID0gcHRyQ1stKGkzMilwYXJ0V2lkdGhdOwotICAgICAgICAgICAgdG1wMSArPSB0bXA0OwotICAgICAgICAgICAgdG1wNSAtPSAodG1wMSA8PCAyKTsKLSAgICAgICAgICAgIHRtcDUgLT0gdG1wMTsKLSAgICAgICAgICAgIHRtcDMgKz0gdG1wMjsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgNCk7Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDIpOwotICAgICAgICAgICAgdG1wNSArPSB0bXA2OwotICAgICAgICAgICAgdG1wNyA9IGNscFt0bXA1Pj4xMF07Ci0gICAgICAgICAgICAqbWIrKyA9ICh1OCl0bXA3OwotICAgICAgICAgICAgcHRyQysrOwotICAgICAgICB9Ci0gICAgICAgIG1iICs9IDQqMTYgLSBwYXJ0V2lkdGg7Ci0gICAgICAgIHB0ckMgKz0gMypwYXJ0V2lkdGg7Ci0gICAgICAgIHB0clYgKz0gMypwYXJ0V2lkdGg7Ci0gICAgfQotCi19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50ZXJwb2xhdGVNaWRWZXJRdWFydGVyCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBGdW5jdGlvbiB0byBwZXJmb3JtIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGludGVycG9sYXRpb24gb2YgcGl4ZWwKLSAgICAgICAgICBwb3NpdGlvbiAnZicgb3IgJ3EnIGZvciBhIGJsb2NrLiBPdmVyZmlsbGluZyBpcyBkb25lIG9ubHkgaWYgbmVlZGVkLgotICAgICAgICAgIFJlZmVyZW5jZSBpbWFnZSAocmVmKSBpcyByZWFkIGF0IGNvcnJlY3QgcG9zaXRpb24gYW5kIHRoZSBwcmVkaWN0ZWQKLSAgICAgICAgICBwYXJ0IGlzIHdyaXR0ZW4gdG8gbWFjcm9ibG9jayBhcnJheSAobWIpCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZEludGVycG9sYXRlTWlkVmVyUXVhcnRlcigKLSAgdTggKnJlZiwKLSAgdTggKm1iLAotICBpMzIgeDAsCi0gIGkzMiB5MCwKLSAgdTMyIHdpZHRoLAotICB1MzIgaGVpZ2h0LAotICB1MzIgcGFydFdpZHRoLAotICB1MzIgcGFydEhlaWdodCwKLSAgdTMyIHZlck9mZnNldCkgICAgLyogMCBmb3IgcGl4ZWwgZiwgMSBmb3IgcGl4ZWwgcSAqLwotewotICAgIHUzMiBwMVsyMSoyMS80KzFdOwotICAgIHUzMiB4LCB5OwotICAgIGkzMiB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OwotICAgIGkzMiAqcHRyQywgKnB0clYsICpwdHJJbnQsICpiMTsKLSAgICB1OCAgKnB0cko7Ci0gICAgaTMyIHRhYmxlWzIxKjE2XTsKLSAgICBjb25zdCB1OCAqY2xwID0gaDI2NGJzZENsaXAgKyA1MTI7Ci0KLSAgICAvKiBDb2RlICovCi0KLSAgICBBU1NFUlQocmVmKTsKLSAgICBBU1NFUlQobWIpOwotCi0gICAgaWYgKCh4MCA8IDApIHx8ICgodTMyKXgwK3BhcnRXaWR0aCs1ID4gd2lkdGgpIHx8Ci0gICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK3BhcnRIZWlnaHQrNSA+IGhlaWdodCkpCi0gICAgewotICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZiwgKHU4KilwMSwgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgIHBhcnRXaWR0aCs1LCBwYXJ0SGVpZ2h0KzUsIHBhcnRXaWR0aCs1KTsKLQotICAgICAgICB4MCA9IDA7Ci0gICAgICAgIHkwID0gMDsKLSAgICAgICAgcmVmID0gKHU4KilwMTsKLSAgICAgICAgd2lkdGggPSBwYXJ0V2lkdGgrNTsKLSAgICB9Ci0KLSAgICByZWYgKz0gKHUzMil5MCAqIHdpZHRoICsgKHUzMil4MDsKLQotICAgIGIxID0gdGFibGU7Ci0gICAgcHRySiA9IHJlZiArIDU7Ci0KLSAgICAvKiBGaXJzdCBzdGVwOiBjYWxjdWxhdGUgaW50ZXJtZWRpYXRlIHZhbHVlcyBmb3IKLSAgICAgKiBob3Jpem9udGFsIGludGVycG9sYXRpb24gKi8KLSAgICBmb3IgKHkgPSBwYXJ0SGVpZ2h0ICsgNTsgeTsgeS0tKQotICAgIHsKLSAgICAgICAgdG1wNiA9ICoocHRySiAtIDUpOwotICAgICAgICB0bXA1ID0gKihwdHJKIC0gNCk7Ci0gICAgICAgIHRtcDQgPSAqKHB0ckogLSAzKTsKLSAgICAgICAgdG1wMyA9ICoocHRySiAtIDIpOwotICAgICAgICB0bXAyID0gKihwdHJKIC0gMSk7Ci0gICAgICAgIGZvciAoeCA9IChwYXJ0V2lkdGggPj4gMik7IHg7IHgtLSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogRmlyc3QgcGl4ZWwgKi8KLSAgICAgICAgICAgIHRtcDcgPSB0bXAzICsgdG1wNDsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXA1OwotICAgICAgICAgICAgdG1wMSA9ICpwdHJKKys7Ci0gICAgICAgICAgICB0bXA2IC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNiAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNiArPSB0bXAxOwotICAgICAgICAgICAgKmIxKysgPSB0bXA2OwotICAgICAgICAgICAgLyogU2Vjb25kIHBpeGVsICovCi0gICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDM7Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNSArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXAxICsgdG1wNDsKLSAgICAgICAgICAgIHRtcDYgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wNSAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDUgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKLSAgICAgICAgICAgICpiMSsrID0gdG1wNTsKLSAgICAgICAgICAgIC8qIFRoaXJkIHBpeGVsICovCi0gICAgICAgICAgICB0bXA3ID0gdG1wMSArIHRtcDI7Ci0gICAgICAgICAgICB0bXA0ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNCArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA2ICsgdG1wMzsKLSAgICAgICAgICAgIHRtcDUgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wNCAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDQgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDQgKz0gdG1wNTsKLSAgICAgICAgICAgICpiMSsrID0gdG1wNDsKLSAgICAgICAgICAgIC8qIEZvdXJ0aCBwaXhlbCAqLwotICAgICAgICAgICAgdG1wNyA9IHRtcDYgKyB0bXAxOwotICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDMgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNSArIHRtcDI7Ci0gICAgICAgICAgICB0bXA0ID0gKnB0ckorKzsKLSAgICAgICAgICAgIHRtcDMgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAzIC09IHRtcDc7Ci0gICAgICAgICAgICB0bXAzICs9IHRtcDQ7Ci0gICAgICAgICAgICAqYjErKyA9IHRtcDM7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNDsKLSAgICAgICAgICAgIHRtcDQgPSB0bXA2OwotICAgICAgICAgICAgdG1wNiA9IHRtcDI7Ci0gICAgICAgICAgICB0bXAyID0gdG1wNzsKLSAgICAgICAgICAgIHRtcDMgPSB0bXA1OwotICAgICAgICAgICAgdG1wNSA9IHRtcDE7Ci0gICAgICAgIH0KLSAgICAgICAgcHRySiArPSB3aWR0aCAtIHBhcnRXaWR0aDsKLSAgICB9Ci0KLSAgICAvKiBTZWNvbmQgc3RlcDogY2FsY3VsYXRlIHZlcnRpY2FsIGludGVycG9sYXRpb24gYW5kIGF2ZXJhZ2UgKi8KLSAgICBwdHJDID0gdGFibGUgKyBwYXJ0V2lkdGg7Ci0gICAgcHRyViA9IHB0ckMgKyA1KnBhcnRXaWR0aDsKLSAgICAvKiBQb2ludGVyIHRvIGludGVnZXIgc2FtcGxlIHBvc2l0aW9uLCBlaXRoZXIgTSBvciBSICovCi0gICAgcHRySW50ID0gcHRyQyArICgyK3Zlck9mZnNldCkqcGFydFdpZHRoOwotICAgIGZvciAoeSA9IChwYXJ0SGVpZ2h0ID4+IDIpOyB5OyB5LS0pCi0gICAgewotICAgICAgICBmb3IgKHggPSBwYXJ0V2lkdGg7IHg7IHgtLSkKLSAgICAgICAgewotICAgICAgICAgICAgdG1wNCA9IHB0clZbLShpMzIpcGFydFdpZHRoKjJdOwotICAgICAgICAgICAgdG1wNSA9IHB0clZbLShpMzIpcGFydFdpZHRoXTsKLSAgICAgICAgICAgIHRtcDEgPSBwdHJWW3BhcnRXaWR0aF07Ci0gICAgICAgICAgICB0bXAyID0gcHRyVltwYXJ0V2lkdGgqMl07Ci0gICAgICAgICAgICB0bXA2ID0gKnB0clYrKzsKLQotICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXAxOwotICAgICAgICAgICAgdG1wMiAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDIgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDIgKz0gNTEyOwotICAgICAgICAgICAgdG1wNyA9IHRtcDUgKyB0bXA2OwotICAgICAgICAgICAgdG1wMyA9IHB0ckNbcGFydFdpZHRoKjJdOwotICAgICAgICAgICAgdG1wMiArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDIgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gcHRySW50W3BhcnRXaWR0aCoyXTsKLSAgICAgICAgICAgIHRtcDIgKz0gdG1wMzsKLSAgICAgICAgICAgIHRtcDIgPSBjbHBbdG1wMj4+MTBdOwotICAgICAgICAgICAgdG1wNyArPSAxNjsKLSAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNz4+NV07Ci0gICAgICAgICAgICB0bXAxICs9IDUxMjsKLSAgICAgICAgICAgIHRtcDIrKzsKLSAgICAgICAgICAgIG1iWzQ4XSA9ICh1OCkoKHRtcDcgKyB0bXAyKSA+PiAxKTsKLQotICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA2OwotICAgICAgICAgICAgdG1wMSAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDEgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wNTsKLSAgICAgICAgICAgIHRtcDIgPSBwdHJDW3BhcnRXaWR0aF07Ci0gICAgICAgICAgICB0bXAxICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSBwdHJJbnRbcGFydFdpZHRoXTsKLSAgICAgICAgICAgIHRtcDEgKz0gdG1wMjsKLSAgICAgICAgICAgIHRtcDEgPSBjbHBbdG1wMT4+MTBdOwotICAgICAgICAgICAgdG1wNyArPSAxNjsKLSAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNz4+NV07Ci0gICAgICAgICAgICB0bXA2ICs9IDUxMjsKLSAgICAgICAgICAgIHRtcDErKzsKLSAgICAgICAgICAgIG1iWzMyXSA9ICh1OCkoKHRtcDcgKyB0bXAxKSA+PiAxKTsKLQotICAgICAgICAgICAgdG1wMSA9ICpwdHJDOwotICAgICAgICAgICAgdG1wNyA9IHRtcDIgKyB0bXA1OwotICAgICAgICAgICAgdG1wNiAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDYgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA0ICsgdG1wMzsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgNCk7Ci0gICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wNyA9ICpwdHJJbnQ7Ci0gICAgICAgICAgICB0bXA2ICs9IHRtcDE7Ci0gICAgICAgICAgICB0bXA2ID0gY2xwW3RtcDY+PjEwXTsKLSAgICAgICAgICAgIHRtcDcgKz0gMTY7Ci0gICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDc+PjVdOwotICAgICAgICAgICAgdG1wNSArPSA1MTI7Ci0gICAgICAgICAgICB0bXA2Kys7Ci0gICAgICAgICAgICBtYlsxNl0gPSAodTgpKCh0bXA3ICsgdG1wNikgPj4gMSk7Ci0KLSAgICAgICAgICAgIHRtcDYgPSBwdHJDWy0oaTMyKXBhcnRXaWR0aF07Ci0gICAgICAgICAgICB0bXAxICs9IHRtcDQ7Ci0gICAgICAgICAgICB0bXA1IC09ICh0bXAxIDw8IDIpOwotICAgICAgICAgICAgdG1wNSAtPSB0bXAxOwotICAgICAgICAgICAgdG1wMyArPSB0bXAyOwotICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDUgKz0gKHRtcDMgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gcHRySW50Wy0oaTMyKXBhcnRXaWR0aF07Ci0gICAgICAgICAgICB0bXA1ICs9IHRtcDY7Ci0gICAgICAgICAgICB0bXA1ID0gY2xwW3RtcDU+PjEwXTsKLSAgICAgICAgICAgIHRtcDcgKz0gMTY7Ci0gICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDc+PjVdOwotICAgICAgICAgICAgdG1wNSsrOwotICAgICAgICAgICAgKm1iKysgPSAodTgpKCh0bXA3ICsgdG1wNSkgPj4gMSk7Ci0gICAgICAgICAgICBwdHJDKys7Ci0gICAgICAgICAgICBwdHJJbnQrKzsKLSAgICAgICAgfQotICAgICAgICBtYiArPSA0KjE2IC0gcGFydFdpZHRoOwotICAgICAgICBwdHJDICs9IDMqcGFydFdpZHRoOwotICAgICAgICBwdHJWICs9IDMqcGFydFdpZHRoOwotICAgICAgICBwdHJJbnQgKz0gMypwYXJ0V2lkdGg7Ci0gICAgfQotCi19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkSW50ZXJwb2xhdGVNaWRIb3JRdWFydGVyCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBGdW5jdGlvbiB0byBwZXJmb3JtIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGludGVycG9sYXRpb24gb2YgcGl4ZWwKLSAgICAgICAgICBwb3NpdGlvbiAnaScgb3IgJ2snIGZvciBhIGJsb2NrLiBPdmVyZmlsbGluZyBpcyBkb25lIG9ubHkgaWYgbmVlZGVkLgotICAgICAgICAgIFJlZmVyZW5jZSBpbWFnZSAocmVmKSBpcyByZWFkIGF0IGNvcnJlY3QgcG9zaXRpb24gYW5kIHRoZSBwcmVkaWN0ZWQKLSAgICAgICAgICBwYXJ0IGlzIHdyaXR0ZW4gdG8gbWFjcm9ibG9jayBhcnJheSAobWIpCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZEludGVycG9sYXRlTWlkSG9yUXVhcnRlcigKLSAgdTggKnJlZiwKLSAgdTggKm1iLAotICBpMzIgeDAsCi0gIGkzMiB5MCwKLSAgdTMyIHdpZHRoLAotICB1MzIgaGVpZ2h0LAotICB1MzIgcGFydFdpZHRoLAotICB1MzIgcGFydEhlaWdodCwKLSAgdTMyIGhvck9mZnNldCkgICAgLyogMCBmb3IgcGl4ZWwgaSwgMSBmb3IgcGl4ZWwgayAqLwotewotICAgIHUzMiBwMVsyMSoyMS80KzFdOwotICAgIHUzMiB4LCB5OwotICAgIGkzMiB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OwotICAgIGkzMiAqcHRySiwgKnB0ckludCwgKmgxOwotICAgIHU4ICAqcHRyQywgKnB0clY7Ci0gICAgaTMyIHRhYmxlWzIxKjE2XTsKLSAgICBpMzIgdGFibGVXaWR0aCA9IChpMzIpcGFydFdpZHRoKzU7Ci0gICAgY29uc3QgdTggKmNscCA9IGgyNjRic2RDbGlwICsgNTEyOwotCi0gICAgLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHJlZik7Ci0gICAgQVNTRVJUKG1iKTsKLQotICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtwYXJ0V2lkdGgrNSA+IHdpZHRoKSB8fAotICAgICAgICAoeTAgPCAwKSB8fCAoKHUzMil5MCtwYXJ0SGVpZ2h0KzUgPiBoZWlnaHQpKQotICAgIHsKLSAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsICh1OCopcDEsIHgwLCB5MCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICBwYXJ0V2lkdGgrNSwgcGFydEhlaWdodCs1LCBwYXJ0V2lkdGgrNSk7Ci0KLSAgICAgICAgeDAgPSAwOwotICAgICAgICB5MCA9IDA7Ci0gICAgICAgIHJlZiA9ICh1OCopcDE7Ci0gICAgICAgIHdpZHRoID0gcGFydFdpZHRoKzU7Ci0gICAgfQotCi0gICAgcmVmICs9ICh1MzIpeTAgKiB3aWR0aCArICh1MzIpeDA7Ci0KLSAgICBoMSA9IHRhYmxlICsgdGFibGVXaWR0aDsKLSAgICBwdHJDID0gcmVmICsgd2lkdGg7Ci0gICAgcHRyViA9IHB0ckMgKyA1KndpZHRoOwotCi0gICAgLyogRmlyc3Qgc3RlcDogY2FsY3VsYXRlIGludGVybWVkaWF0ZSB2YWx1ZXMgZm9yCi0gICAgICogdmVydGljYWwgaW50ZXJwb2xhdGlvbiAqLwotICAgIGZvciAoeSA9IChwYXJ0SGVpZ2h0ID4+IDIpOyB5OyB5LS0pCi0gICAgewotICAgICAgICBmb3IgKHggPSAodTMyKXRhYmxlV2lkdGg7IHg7IHgtLSkKLSAgICAgICAgewotICAgICAgICAgICAgdG1wNCA9IHB0clZbLShpMzIpd2lkdGgqMl07Ci0gICAgICAgICAgICB0bXA1ID0gcHRyVlstKGkzMil3aWR0aF07Ci0gICAgICAgICAgICB0bXAxID0gcHRyVlt3aWR0aF07Ci0gICAgICAgICAgICB0bXAyID0gcHRyVlt3aWR0aCoyXTsKLSAgICAgICAgICAgIHRtcDYgPSAqcHRyVisrOwotCi0gICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDE7Ci0gICAgICAgICAgICB0bXAyIC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMiAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNyA9IHRtcDUgKyB0bXA2OwotICAgICAgICAgICAgdG1wMyA9IHB0ckNbd2lkdGgqMl07Ci0gICAgICAgICAgICB0bXAyICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wMiArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDIgKz0gdG1wMzsKLSAgICAgICAgICAgIGgxW3RhYmxlV2lkdGgqMl0gPSB0bXAyOwotCi0gICAgICAgICAgICB0bXA3ID0gdG1wMyArIHRtcDY7Ci0gICAgICAgICAgICB0bXAxIC09ICh0bXA3IDw8IDIpOwotICAgICAgICAgICAgdG1wMSAtPSB0bXA3OwotICAgICAgICAgICAgdG1wNyA9IHRtcDQgKyB0bXA1OwotICAgICAgICAgICAgdG1wMiA9IHB0ckNbd2lkdGhdOwotICAgICAgICAgICAgdG1wMSArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDEgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXAxICs9IHRtcDI7Ci0gICAgICAgICAgICBoMVt0YWJsZVdpZHRoXSA9IHRtcDE7Ci0KLSAgICAgICAgICAgIHRtcDEgPSAqcHRyQzsKLSAgICAgICAgICAgIHRtcDcgPSB0bXAyICsgdG1wNTsKLSAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA2IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNCArIHRtcDM7Ci0gICAgICAgICAgICB0bXA2ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDYgKz0gdG1wMTsKLSAgICAgICAgICAgICpoMSA9IHRtcDY7Ci0KLSAgICAgICAgICAgIHRtcDYgPSBwdHJDWy0oaTMyKXdpZHRoXTsKLSAgICAgICAgICAgIHRtcDEgKz0gdG1wNDsKLSAgICAgICAgICAgIHRtcDUgLT0gKHRtcDEgPDwgMik7Ci0gICAgICAgICAgICB0bXA1IC09IHRtcDE7Ci0gICAgICAgICAgICB0bXAzICs9IHRtcDI7Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXAzIDw8IDQpOwotICAgICAgICAgICAgdG1wNSArPSAodG1wMyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDUgKz0gdG1wNjsKLSAgICAgICAgICAgIGgxWy10YWJsZVdpZHRoXSA9IHRtcDU7Ci0gICAgICAgICAgICBoMSsrOwotICAgICAgICAgICAgcHRyQysrOwotICAgICAgICB9Ci0gICAgICAgIHB0ckMgKz0gNCp3aWR0aCAtIHBhcnRXaWR0aCAtIDU7Ci0gICAgICAgIHB0clYgKz0gNCp3aWR0aCAtIHBhcnRXaWR0aCAtIDU7Ci0gICAgICAgIGgxICs9IDMqdGFibGVXaWR0aDsKLSAgICB9Ci0KLSAgICAvKiBTZWNvbmQgc3RlcDogY2FsY3VsYXRlIGhvcml6b250YWwgaW50ZXJwb2xhdGlvbiBhbmQgYXZlcmFnZSAqLwotICAgIHB0ckogPSB0YWJsZSArIDU7Ci0gICAgLyogUG9pbnRlciB0byBpbnRlZ2VyIHNhbXBsZSBwb3NpdGlvbiwgZWl0aGVyIEcgb3IgSCAqLwotICAgIHB0ckludCA9IHRhYmxlICsgMiArIGhvck9mZnNldDsKLSAgICBmb3IgKHkgPSBwYXJ0SGVpZ2h0OyB5OyB5LS0pCi0gICAgewotICAgICAgICB0bXA2ID0gKihwdHJKIC0gNSk7Ci0gICAgICAgIHRtcDUgPSAqKHB0ckogLSA0KTsKLSAgICAgICAgdG1wNCA9ICoocHRySiAtIDMpOwotICAgICAgICB0bXAzID0gKihwdHJKIC0gMik7Ci0gICAgICAgIHRtcDIgPSAqKHB0ckogLSAxKTsKLSAgICAgICAgZm9yICh4ID0gKHBhcnRXaWR0aD4+Mik7IHg7IHgtLSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogRmlyc3QgcGl4ZWwgKi8KLSAgICAgICAgICAgIHRtcDYgKz0gNTEyOwotICAgICAgICAgICAgdG1wNyA9IHRtcDMgKyB0bXA0OwotICAgICAgICAgICAgdG1wNiArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDYgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDU7Ci0gICAgICAgICAgICB0bXAxID0gKnB0ckorKzsKLSAgICAgICAgICAgIHRtcDYgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA2IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA3ID0gKnB0ckludCsrOwotICAgICAgICAgICAgdG1wNiArPSB0bXAxOwotICAgICAgICAgICAgdG1wNiA9IGNscFt0bXA2ID4+IDEwXTsKLSAgICAgICAgICAgIHRtcDcgKz0gMTY7Ci0gICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDcgPj4gNV07Ci0gICAgICAgICAgICB0bXA1ICs9IDUxMjsKLSAgICAgICAgICAgIHRtcDYrKzsKLSAgICAgICAgICAgICptYisrID0gKHU4KSgodG1wNiArIHRtcDcpID4+IDEpOwotICAgICAgICAgICAgLyogU2Vjb25kIHBpeGVsICovCi0gICAgICAgICAgICB0bXA3ID0gdG1wMiArIHRtcDM7Ci0gICAgICAgICAgICB0bXA1ICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wNSArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXAxICsgdG1wNDsKLSAgICAgICAgICAgIHRtcDYgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wNSAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDUgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDcgPSAqcHRySW50Kys7Ci0gICAgICAgICAgICB0bXA1ICs9IHRtcDY7Ci0gICAgICAgICAgICB0bXA1ID0gY2xwW3RtcDUgPj4gMTBdOwotICAgICAgICAgICAgdG1wNyArPSAxNjsKLSAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNyA+PiA1XTsKLSAgICAgICAgICAgIHRtcDQgKz0gNTEyOwotICAgICAgICAgICAgdG1wNSsrOwotICAgICAgICAgICAgKm1iKysgPSAodTgpKCh0bXA1ICsgdG1wNykgPj4gMSk7Ci0gICAgICAgICAgICAvKiBUaGlyZCBwaXhlbCAqLwotICAgICAgICAgICAgdG1wNyA9IHRtcDEgKyB0bXAyOwotICAgICAgICAgICAgdG1wNCArPSAodG1wNyA8PCA0KTsKLSAgICAgICAgICAgIHRtcDQgKz0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA3ID0gdG1wNiArIHRtcDM7Ci0gICAgICAgICAgICB0bXA1ID0gKnB0ckorKzsKLSAgICAgICAgICAgIHRtcDQgLT0gKHRtcDcgPDwgMik7Ci0gICAgICAgICAgICB0bXA0IC09IHRtcDc7Ci0gICAgICAgICAgICB0bXA3ID0gKnB0ckludCsrOwotICAgICAgICAgICAgdG1wNCArPSB0bXA1OwotICAgICAgICAgICAgdG1wNCA9IGNscFt0bXA0ID4+IDEwXTsKLSAgICAgICAgICAgIHRtcDcgKz0gMTY7Ci0gICAgICAgICAgICB0bXA3ID0gY2xwW3RtcDcgPj4gNV07Ci0gICAgICAgICAgICB0bXAzICs9IDUxMjsKLSAgICAgICAgICAgIHRtcDQrKzsKLSAgICAgICAgICAgICptYisrID0gKHU4KSgodG1wNCArIHRtcDcpID4+IDEpOwotICAgICAgICAgICAgLyogRm91cnRoIHBpeGVsICovCi0gICAgICAgICAgICB0bXA3ID0gdG1wNiArIHRtcDE7Ci0gICAgICAgICAgICB0bXAzICs9ICh0bXA3IDw8IDQpOwotICAgICAgICAgICAgdG1wMyArPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA1ICsgdG1wMjsKLSAgICAgICAgICAgIHRtcDQgPSAqcHRySisrOwotICAgICAgICAgICAgdG1wMyAtPSAodG1wNyA8PCAyKTsKLSAgICAgICAgICAgIHRtcDMgLT0gdG1wNzsKLSAgICAgICAgICAgIHRtcDcgPSAqcHRySW50Kys7Ci0gICAgICAgICAgICB0bXAzICs9IHRtcDQ7Ci0gICAgICAgICAgICB0bXAzID0gY2xwW3RtcDMgPj4gMTBdOwotICAgICAgICAgICAgdG1wNyArPSAxNjsKLSAgICAgICAgICAgIHRtcDcgPSBjbHBbdG1wNyA+PiA1XTsKLSAgICAgICAgICAgIHRtcDMrKzsKLSAgICAgICAgICAgICptYisrID0gKHU4KSgodG1wMyArIHRtcDcpID4+IDEpOwotICAgICAgICAgICAgdG1wMyA9IHRtcDU7Ci0gICAgICAgICAgICB0bXA1ID0gdG1wMTsKLSAgICAgICAgICAgIHRtcDcgPSB0bXA0OwotICAgICAgICAgICAgdG1wNCA9IHRtcDY7Ci0gICAgICAgICAgICB0bXA2ID0gdG1wMjsKLSAgICAgICAgICAgIHRtcDIgPSB0bXA3OwotICAgICAgICB9Ci0gICAgICAgIHB0ckogKz0gNTsKLSAgICAgICAgcHRySW50ICs9IDU7Ci0gICAgICAgIG1iICs9IDE2IC0gcGFydFdpZHRoOwotICAgIH0KLQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZFByZWRpY3RTYW1wbGVzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHJlY29uc3RydWN0cyBhIHByZWRpY3Rpb24gZm9yIGEgbWFjcm9ibG9jayBwYXJ0aXRpb24uCi0gICAgICAgICAgVGhlIHByZWRpY3Rpb24gaXMgZWl0aGVyIGNvcGllZCBvciBpbnRlcnBvbGF0ZWQgdXNpbmcgdGhlIHJlZmVyZW5jZQotICAgICAgICAgIGZyYW1lIGFuZCB0aGUgbW90aW9uIHZlY3Rvci4gQm90aCBsdW1pbmFuY2UgYW5kIGNocm9taW5hbmNlIHBhcnRzIGFyZQotICAgICAgICAgIHByZWRpY3RlZC4gVGhlIHByZWRpY3Rpb24gaXMgc3RvcmVkIGluIGdpdmVuIG1hY3JvYmxvY2sgYXJyYXkgKGRhdGEpLgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgZGF0YSAgICAgICAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgYXJyYXkgKDM4NCBieXRlcykgZm9yIG91dHB1dAotICAgICAgICAgIG12ICAgICAgICAgICAgcG9pbnRlciB0byBtb3Rpb24gdmVjdG9yIHVzZWQgZm9yIHByZWRpY3Rpb24KLSAgICAgICAgICByZWZQaWMgICAgICAgIHBvaW50ZXIgdG8gcmVmZXJlbmNlIHBpY3R1cmUgc3RydWN0dXJlCi0gICAgICAgICAgeEEgICAgICAgICAgICB4LWNvb3JkaW5hdGUgZm9yIGN1cnJlbnQgbWFjcm9ibG9jawotICAgICAgICAgIHlBICAgICAgICAgICAgeS1jb29yZGluYXRlIGZvciBjdXJyZW50IG1hY3JvYmxvY2sKLSAgICAgICAgICBwYXJ0WCAgICAgICAgIHgtb2Zmc2V0IGZvciBwYXJ0aXRpb24gaW4gbWFjcm9ibG9jawotICAgICAgICAgIHBhcnRZICAgICAgICAgeS1vZmZzZXQgZm9yIHBhcnRpdGlvbiBpbiBtYWNyb2Jsb2NrCi0gICAgICAgICAgcGFydFdpZHRoICAgICB3aWR0aCBvZiBwYXJ0aXRpb24KLSAgICAgICAgICBwYXJ0SGVpZ2h0ICAgIGhlaWdodCBvZiBwYXJ0aXRpb24KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICBkYXRhICAgICAgICAgIG1hY3JvYmxvY2sgYXJyYXkgKDE2eDE2Kzh4OCs4eDgpIHdoZXJlIHByZWRpY3RlZAotICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uIGlzIHN0b3JlZCBhdCBjb3JyZWN0IHBvc2l0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZFByZWRpY3RTYW1wbGVzKAotICB1OCAqZGF0YSwKLSAgbXZfdCAqbXYsCi0gIGltYWdlX3QgKnJlZlBpYywKLSAgdTMyIHhBLAotICB1MzIgeUEsCi0gIHUzMiBwYXJ0WCwKLSAgdTMyIHBhcnRZLAotICB1MzIgcGFydFdpZHRoLAotICB1MzIgcGFydEhlaWdodCkKLQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB4RnJhYywgeUZyYWMsIHdpZHRoLCBoZWlnaHQ7Ci0gICAgaTMyIHhJbnQsIHlJbnQ7Ci0gICAgdTggKmx1bWFQYXJ0RGF0YTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGRhdGEpOwotICAgIEFTU0VSVChtdik7Ci0gICAgQVNTRVJUKHBhcnRXaWR0aCk7Ci0gICAgQVNTRVJUKHBhcnRIZWlnaHQpOwotICAgIEFTU0VSVChyZWZQaWMpOwotICAgIEFTU0VSVChyZWZQaWMtPmRhdGEpOwotICAgIEFTU0VSVChyZWZQaWMtPndpZHRoKTsKLSAgICBBU1NFUlQocmVmUGljLT5oZWlnaHQpOwotCi0gICAgLyogbHVtYSAqLwotICAgIGx1bWFQYXJ0RGF0YSA9IGRhdGEgKyAxNipwYXJ0WSArIHBhcnRYOwotCi0gICAgeEZyYWMgPSBtdi0+aG9yICYgMHgzOwotICAgIHlGcmFjID0gbXYtPnZlciAmIDB4MzsKLQotICAgIHdpZHRoID0gMTYgKiByZWZQaWMtPndpZHRoOwotICAgIGhlaWdodCA9IDE2ICogcmVmUGljLT5oZWlnaHQ7Ci0KLSAgICB4SW50ID0gKGkzMil4QSArIChpMzIpcGFydFggKyAobXYtPmhvciA+PiAyKTsKLSAgICB5SW50ID0gKGkzMil5QSArIChpMzIpcGFydFkgKyAobXYtPnZlciA+PiAyKTsKLQotICAgIEFTU0VSVChsdW1hRnJhY1Bvc1t4RnJhY11beUZyYWNdIDwgMTYpOwotCi0gICAgc3dpdGNoIChsdW1hRnJhY1Bvc1t4RnJhY11beUZyYWNdKQotICAgIHsKLSAgICAgICAgY2FzZSAwOiAvKiBHICovCi0gICAgICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAotICAgICAgICAgICAgICAgICAgICB4SW50LHlJbnQsd2lkdGgsaGVpZ2h0LHBhcnRXaWR0aCxwYXJ0SGVpZ2h0LDE2KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6IC8qIGQgKi8KLSAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZVZlclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCi0gICAgICAgICAgICAgICAgICAgIHhJbnQsIHlJbnQtMiwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0LCAwKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6IC8qIGggKi8KLSAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZVZlckhhbGYocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCi0gICAgICAgICAgICAgICAgICAgIHhJbnQsIHlJbnQtMiwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6IC8qIG4gKi8KLSAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZVZlclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCi0gICAgICAgICAgICAgICAgICAgIHhJbnQsIHlJbnQtMiwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0LCAxKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQ6IC8qIGEgKi8KLSAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZUhvclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCi0gICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludCwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0LCAwKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDU6IC8qIGUgKi8KLSAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZUhvclZlclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCi0gICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjogLyogaSAqLwotICAgICAgICAgICAgaDI2NGJzZEludGVycG9sYXRlTWlkSG9yUXVhcnRlcihyZWZQaWMtPmRhdGEsIGx1bWFQYXJ0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeEludC0yLCB5SW50LTIsIHdpZHRoLCBoZWlnaHQsIHBhcnRXaWR0aCwgcGFydEhlaWdodCwgMCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA3OiAvKiBwICovCi0gICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVIb3JWZXJRdWFydGVyKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAotICAgICAgICAgICAgICAgICAgICB4SW50LTIsIHlJbnQtMiwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0LCAyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDg6IC8qIGIgKi8KLSAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZUhvckhhbGYocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCi0gICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludCwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDk6IC8qIGYgKi8KLSAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZU1pZFZlclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCi0gICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA6IC8qIGogKi8KLSAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZU1pZEhhbGYocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCi0gICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE6IC8qIHEgKi8KLSAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZU1pZFZlclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCi0gICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludC0yLCB3aWR0aCwgaGVpZ2h0LCBwYXJ0V2lkdGgsIHBhcnRIZWlnaHQsIDEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI6IC8qIGMgKi8KLSAgICAgICAgICAgIGgyNjRic2RJbnRlcnBvbGF0ZUhvclF1YXJ0ZXIocmVmUGljLT5kYXRhLCBsdW1hUGFydERhdGEsCi0gICAgICAgICAgICAgICAgICAgIHhJbnQtMiwgeUludCwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0LCAxKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEzOiAvKiBnICovCi0gICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVIb3JWZXJRdWFydGVyKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAotICAgICAgICAgICAgICAgICAgICB4SW50LTIsIHlJbnQtMiwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0LCAxKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE0OiAvKiBrICovCi0gICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVNaWRIb3JRdWFydGVyKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAotICAgICAgICAgICAgICAgICAgICB4SW50LTIsIHlJbnQtMiwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0LCAxKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAvKiBjYXNlIDE1LCByICovCi0gICAgICAgICAgICBoMjY0YnNkSW50ZXJwb2xhdGVIb3JWZXJRdWFydGVyKHJlZlBpYy0+ZGF0YSwgbHVtYVBhcnREYXRhLAotICAgICAgICAgICAgICAgICAgICB4SW50LTIsIHlJbnQtMiwgd2lkdGgsIGhlaWdodCwgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0LCAzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qIGNocm9tYSAqLwotICAgIFByZWRpY3RDaHJvbWEoCi0gICAgICBkYXRhICsgMTYqMTYgKyAocGFydFk+PjEpKjggKyAocGFydFg+PjEpLAotICAgICAgeEEgKyBwYXJ0WCwKLSAgICAgIHlBICsgcGFydFksCi0gICAgICBwYXJ0V2lkdGgsCi0gICAgICBwYXJ0SGVpZ2h0LAotICAgICAgbXYsCi0gICAgICByZWZQaWMpOwotCi19Ci0KLSNlbHNlIC8qIEgyNjRERUNfT01YREwgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZFByZWRpY3RTYW1wbGVzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHJlY29uc3RydWN0cyBhIHByZWRpY3Rpb24gZm9yIGEgbWFjcm9ibG9jayBwYXJ0aXRpb24uCi0gICAgICAgICAgVGhlIHByZWRpY3Rpb24gaXMgZWl0aGVyIGNvcGllZCBvciBpbnRlcnBvbGF0ZWQgdXNpbmcgdGhlIHJlZmVyZW5jZQotICAgICAgICAgIGZyYW1lIGFuZCB0aGUgbW90aW9uIHZlY3Rvci4gQm90aCBsdW1pbmFuY2UgYW5kIGNocm9taW5hbmNlIHBhcnRzIGFyZQotICAgICAgICAgIHByZWRpY3RlZC4gVGhlIHByZWRpY3Rpb24gaXMgc3RvcmVkIGluIGdpdmVuIG1hY3JvYmxvY2sgYXJyYXkgKGRhdGEpLgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgZGF0YSAgICAgICAgICBwb2ludGVyIHRvIG1hY3JvYmxvY2sgYXJyYXkgKDM4NCBieXRlcykgZm9yIG91dHB1dAotICAgICAgICAgIG12ICAgICAgICAgICAgcG9pbnRlciB0byBtb3Rpb24gdmVjdG9yIHVzZWQgZm9yIHByZWRpY3Rpb24KLSAgICAgICAgICByZWZQaWMgICAgICAgIHBvaW50ZXIgdG8gcmVmZXJlbmNlIHBpY3R1cmUgc3RydWN0dXJlCi0gICAgICAgICAgeEEgICAgICAgICAgICB4LWNvb3JkaW5hdGUgZm9yIGN1cnJlbnQgbWFjcm9ibG9jawotICAgICAgICAgIHlBICAgICAgICAgICAgeS1jb29yZGluYXRlIGZvciBjdXJyZW50IG1hY3JvYmxvY2sKLSAgICAgICAgICBwYXJ0WCAgICAgICAgIHgtb2Zmc2V0IGZvciBwYXJ0aXRpb24gaW4gbWFjcm9ibG9jawotICAgICAgICAgIHBhcnRZICAgICAgICAgeS1vZmZzZXQgZm9yIHBhcnRpdGlvbiBpbiBtYWNyb2Jsb2NrCi0gICAgICAgICAgcGFydFdpZHRoICAgICB3aWR0aCBvZiBwYXJ0aXRpb24KLSAgICAgICAgICBwYXJ0SGVpZ2h0ICAgIGhlaWdodCBvZiBwYXJ0aXRpb24KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICBkYXRhICAgICAgICAgIG1hY3JvYmxvY2sgYXJyYXkgKDE2eDE2Kzh4OCs4eDgpIHdoZXJlIHByZWRpY3RlZAotICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uIGlzIHN0b3JlZCBhdCBjb3JyZWN0IHBvc2l0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qbGludCAtZXs1NTB9IFN5bWJvbCAncmVzJyBub3QgYWNjZXNzZWQgKi8KLXZvaWQgaDI2NGJzZFByZWRpY3RTYW1wbGVzKAotICB1OCAqZGF0YSwKLSAgbXZfdCAqbXYsCi0gIGltYWdlX3QgKnJlZlBpYywKLSAgdTMyIGNvbEFuZFJvdywKLSAgdTMyIHBhcnQsCi0gIHU4ICpwRmlsbCkKLQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB4RnJhYywgeUZyYWM7Ci0gICAgdTMyIHdpZHRoLCBoZWlnaHQ7Ci0gICAgaTMyIHhJbnQsIHlJbnQsIHgwLCB5MDsKLSAgICB1OCAqcGFydERhdGEsICpyZWY7Ci0gICAgT01YU2l6ZSByb2k7Ci0gICAgdTMyIGZpbGxXaWR0aDsKLSAgICB1MzIgZmlsbEhlaWdodDsKLSAgICBPTVhSZXN1bHQgcmVzOwotICAgIHUzMiB4QSwgeUE7Ci0gICAgdTMyIHBhcnRYLCBwYXJ0WTsKLSAgICB1MzIgcGFydFdpZHRoLCBwYXJ0SGVpZ2h0OwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQoZGF0YSk7Ci0gICAgQVNTRVJUKG12KTsKLSAgICBBU1NFUlQocmVmUGljKTsKLSAgICBBU1NFUlQocmVmUGljLT5kYXRhKTsKLSAgICBBU1NFUlQocmVmUGljLT53aWR0aCk7Ci0gICAgQVNTRVJUKHJlZlBpYy0+aGVpZ2h0KTsKLQotICAgIHhBID0gKGNvbEFuZFJvdyAmIDB4RkZGRjAwMDApID4+IDE2OwotICAgIHlBID0gKGNvbEFuZFJvdyAmIDB4MDAwMEZGRkYpOwotCi0gICAgcGFydFggPSAocGFydCAmIDB4RkYwMDAwMDApID4+IDI0OwotICAgIHBhcnRZID0gKHBhcnQgJiAweDAwRkYwMDAwKSA+PiAxNjsKLSAgICBwYXJ0V2lkdGggPSAocGFydCAmIDB4MDAwMEZGMDApID4+IDg7Ci0gICAgcGFydEhlaWdodCA9IChwYXJ0ICYgMHgwMDAwMDBGRik7Ci0KLSAgICBBU1NFUlQocGFydFdpZHRoKTsKLSAgICBBU1NFUlQocGFydEhlaWdodCk7Ci0KLSAgICAvKiBsdW1hICovCi0gICAgcGFydERhdGEgPSBkYXRhICsgMTYqcGFydFkgKyBwYXJ0WDsKLQotICAgIHhGcmFjID0gbXYtPmhvciAmIDB4MzsKLSAgICB5RnJhYyA9IG12LT52ZXIgJiAweDM7Ci0KLSAgICB3aWR0aCA9IDE2ICogcmVmUGljLT53aWR0aDsKLSAgICBoZWlnaHQgPSAxNiAqIHJlZlBpYy0+aGVpZ2h0OwotCi0gICAgeEludCA9IChpMzIpeEEgKyAoaTMyKXBhcnRYICsgKG12LT5ob3IgPj4gMik7Ci0gICAgeUludCA9IChpMzIpeUEgKyAoaTMyKXBhcnRZICsgKG12LT52ZXIgPj4gMik7Ci0KLSAgICB4MCA9ICh4RnJhYykgPyB4SW50LTIgOiB4SW50OwotICAgIHkwID0gKHlGcmFjKSA/IHlJbnQtMiA6IHlJbnQ7Ci0KLSAgICBpZiAoeEZyYWMpCi0gICAgewotICAgICAgICBpZiAocGFydFdpZHRoID09IDE2KQotICAgICAgICAgICAgZmlsbFdpZHRoID0gMzI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZpbGxXaWR0aCA9IDE2OwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIGZpbGxXaWR0aCA9IChwYXJ0V2lkdGgqMik7Ci0gICAgaWYgKHlGcmFjKQotICAgICAgICBmaWxsSGVpZ2h0ID0gcGFydEhlaWdodCs1OwotICAgIGVsc2UKLSAgICAgICAgZmlsbEhlaWdodCA9IHBhcnRIZWlnaHQ7Ci0KLQotICAgIGlmICgoeDAgPCAwKSB8fCAoKHUzMil4MCtmaWxsV2lkdGggPiB3aWR0aCkgfHwKLSAgICAgICAgKHkwIDwgMCkgfHwgKCh1MzIpeTArZmlsbEhlaWdodCA+IGhlaWdodCkpCi0gICAgewotICAgICAgICBoMjY0YnNkRmlsbEJsb2NrKHJlZlBpYy0+ZGF0YSwgKHU4KilwRmlsbCwgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgIGZpbGxXaWR0aCwgZmlsbEhlaWdodCwgZmlsbFdpZHRoKTsKLQotICAgICAgICB4MCA9IDA7Ci0gICAgICAgIHkwID0gMDsKLSAgICAgICAgcmVmID0gcEZpbGw7Ci0gICAgICAgIHdpZHRoID0gZmlsbFdpZHRoOwotICAgICAgICBpZiAoeUZyYWMpCi0gICAgICAgICAgICByZWYgKz0gMip3aWR0aDsKLSAgICAgICAgaWYgKHhGcmFjKQotICAgICAgICAgICAgcmVmICs9IDI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qbGludCAtLWUoNzM3KSBMb3NzIG9mIHNpZ24gKi8KLSAgICAgICAgcmVmID0gcmVmUGljLT5kYXRhICsgeUludCp3aWR0aCArIHhJbnQ7Ci0gICAgfQotICAgIC8qIEx1bWEgaW50ZXJwb2xhdGlvbiAqLwotICAgIHJvaS53aWR0aCA9IChpMzIpcGFydFdpZHRoOwotICAgIHJvaS5oZWlnaHQgPSAoaTMyKXBhcnRIZWlnaHQ7Ci0KLSAgICByZXMgPSBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYShyZWYsIChpMzIpd2lkdGgsIHBhcnREYXRhLCAxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyKXhGcmFjLCAoaTMyKXlGcmFjLCByb2kpOwotICAgIEFTU0VSVChyZXMgPT0gMCk7Ci0KLSAgICAvKiBDaHJvbWEgKi8KLSAgICB3aWR0aCAgPSA4ICogcmVmUGljLT53aWR0aDsKLSAgICBoZWlnaHQgPSA4ICogcmVmUGljLT5oZWlnaHQ7Ci0KLSAgICB4MCA9ICgoeEEgKyBwYXJ0WCkgPj4gMSkgKyAobXYtPmhvciA+PiAzKTsKLSAgICB5MCA9ICgoeUEgKyBwYXJ0WSkgPj4gMSkgKyAobXYtPnZlciA+PiAzKTsKLSAgICB4RnJhYyA9IG12LT5ob3IgJiAweDc7Ci0gICAgeUZyYWMgPSBtdi0+dmVyICYgMHg3OwotCi0gICAgcmVmID0gcmVmUGljLT5kYXRhICsgMjU2ICogcmVmUGljLT53aWR0aCAqIHJlZlBpYy0+aGVpZ2h0OwotCi0gICAgcm9pLndpZHRoID0gKGkzMikocGFydFdpZHRoID4+IDEpOwotICAgIGZpbGxXaWR0aCA9ICgocGFydFdpZHRoID4+IDEpICsgOCkgJiB+MHg3OwotICAgIHJvaS5oZWlnaHQgPSAoaTMyKShwYXJ0SGVpZ2h0ID4+IDEpOwotICAgIGZpbGxIZWlnaHQgPSAocGFydEhlaWdodCA+PiAxKSArIDE7Ci0KLSAgICBpZiAoKHgwIDwgMCkgfHwgKCh1MzIpeDArZmlsbFdpZHRoID4gd2lkdGgpIHx8Ci0gICAgICAgICh5MCA8IDApIHx8ICgodTMyKXkwK2ZpbGxIZWlnaHQgPiBoZWlnaHQpKQotICAgIHsKLSAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsIHBGaWxsLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICBmaWxsV2lkdGgsIGZpbGxIZWlnaHQsIGZpbGxXaWR0aCk7Ci0gICAgICAgIHJlZiArPSB3aWR0aCAqIGhlaWdodDsKLSAgICAgICAgaDI2NGJzZEZpbGxCbG9jayhyZWYsIHBGaWxsICsgZmlsbFdpZHRoKmZpbGxIZWlnaHQsCi0gICAgICAgICAgICB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsIGZpbGxXaWR0aCwKLSAgICAgICAgICAgIGZpbGxIZWlnaHQsIGZpbGxXaWR0aCk7Ci0KLSAgICAgICAgcmVmID0gcEZpbGw7Ci0gICAgICAgIHgwID0gMDsKLSAgICAgICAgeTAgPSAwOwotICAgICAgICB3aWR0aCA9IGZpbGxXaWR0aDsKLSAgICAgICAgaGVpZ2h0ID0gZmlsbEhlaWdodDsKLSAgICB9Ci0KLSAgICBwYXJ0RGF0YSA9IGRhdGEgKyAxNioxNiArIChwYXJ0WT4+MSkqOCArIChwYXJ0WD4+MSk7Ci0KLSAgICAvKiBDaHJvbWEgaW50ZXJwb2xhdGlvbiAqLwotICAgIC8qbGludCAtLWUoNzM3KSBMb3NzIG9mIHNpZ24gKi8KLSAgICByZWYgKz0geTAgKiB3aWR0aCArIHgwOwotICAgIHJlcyA9IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hKHJlZiwgd2lkdGgsIHBhcnREYXRhLCA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzIpcm9pLndpZHRoLCAodTMyKXJvaS5oZWlnaHQsIHhGcmFjLCB5RnJhYyk7Ci0gICAgQVNTRVJUKHJlcyA9PSAwKTsKLSAgICBwYXJ0RGF0YSArPSA4ICogODsKLSAgICByZWYgKz0gaGVpZ2h0ICogd2lkdGg7Ci0gICAgcmVzID0gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEocmVmLCB3aWR0aCwgcGFydERhdGEsIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMilyb2kud2lkdGgsICh1MzIpcm9pLmhlaWdodCwgeEZyYWMsIHlGcmFjKTsKLSAgICBBU1NFUlQocmVzID09IDApOwotCi19Ci0KLSNlbmRpZiAvKiBIMjY0REVDX09NWERMICovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBGaWxsUm93MQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIGEgcm93IG9mIHJlZmVyZW5jZSBwZWxzIGluIGEgJ25vcm1hbCcgY2FzZSB3aGVuIG5vCi0gICAgICAgICAgb3ZlcmZpbGxpbmcgaXMgbmVjZXNzYXJ5LgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdm9pZCBGaWxsUm93MSgKLSAgdTggKnJlZiwKLSAgdTggKmZpbGwsCi0gIGkzMiBsZWZ0LAotICBpMzIgY2VudGVyLAotICBpMzIgcmlnaHQpCi17Ci0gICAgVU5VU0VEKGxlZnQpOwotICAgIFVOVVNFRChyaWdodCk7Ci0gICAgQVNTRVJUKHJlZik7Ci0gICAgQVNTRVJUKGZpbGwpOwotCi0gICAgSDI2NFN3RGVjTWVtY3B5KGZpbGwsIHJlZiwgKHUzMiljZW50ZXIpOwotCi0gICAgLypsaW50IC1lKDcxNSkgKi8KLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RGaWxsUm93NwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIGEgcm93IG9mIHJlZmVyZW5jZSBwZWxzIHdoZW4gaG9yaXpvbnRhbCBjb29yZGluYXRlCi0gICAgICAgICAgaXMgcGFydGx5IG5lZ2F0aXZlIG9yIHBhcnRseSBncmVhdGVyIHRoYW4gcmVmZXJlbmNlIHBpY3R1cmUgd2lkdGgKLSAgICAgICAgICAob3ZlcmZpbGxpbmcgc29tZSBwZWxzIG9uIGxlZnQgYW5kL29yIHJpZ2h0IGVkZ2UpLgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgcmVmICAgICAgIHBvaW50ZXIgdG8gcmVmZXJlbmNlIHNhbXBsZXMKLSAgICAgICAgICBsZWZ0ICAgICAgYW1vdW50IG9mIHBpeGVscyB0byBvdmVyZmlsbCBvbiBsZWZ0LWVkZ2UKLSAgICAgICAgICBjZW50ZXIgICAgYW1vdW50IG9mIHBpeGVscyB0byBjb3B5Ci0gICAgICAgICAgcmlnaHQgICAgIGFtb3VudCBvZiBwaXhlbHMgdG8gb3ZlcmZpbGwgb24gcmlnaHQtZWRnZQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIGZpbGwgICAgICBwb2ludGVyIHdoZXJlIHNhbXBsZXMgYXJlIHN0b3JlZAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmbmRlZiBIMjY0REVDX05FT04KLXZvaWQgaDI2NGJzZEZpbGxSb3c3KAotICB1OCAqcmVmLAotICB1OCAqZmlsbCwKLSAgaTMyIGxlZnQsCi0gIGkzMiBjZW50ZXIsCi0gIGkzMiByaWdodCkKLXsKLSAgICB1OCB0bXA7Ci0KLSAgICBBU1NFUlQocmVmKTsKLSAgICBBU1NFUlQoZmlsbCk7Ci0KLSAgICBpZiAobGVmdCkKLSAgICAgICAgdG1wID0gKnJlZjsKLQotICAgIGZvciAoIDsgbGVmdDsgbGVmdC0tKQotICAgICAgICAvKmxpbnQgLWVzeW0oNjQ0LHRtcCkgIHRtcCBpcyBpbml0aWFsaXplZCBpZiB1c2VkICovCi0gICAgICAgICpmaWxsKysgPSB0bXA7Ci0KLSAgICBmb3IgKCA7IGNlbnRlcjsgY2VudGVyLS0pCi0gICAgICAgICpmaWxsKysgPSAqcmVmKys7Ci0KLSAgICBpZiAocmlnaHQpCi0gICAgICAgIHRtcCA9IHJlZlstMV07Ci0KLSAgICBmb3IgKCA7IHJpZ2h0OyByaWdodC0tKQotICAgICAgICAvKmxpbnQgLWVzeW0oNjQ0LHRtcCkgIHRtcCBpcyBpbml0aWFsaXplZCBpZiB1c2VkICovCi0gICAgICAgICpmaWxsKysgPSB0bXA7Ci19Ci0jZW5kaWYKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZEZpbGxCbG9jawotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIGEgYmxvY2sgb2YgcmVmZXJlbmNlIHBlbHMuIEl0IGRldGVybWluZXMgd2hldGhlcgotICAgICAgICAgIG92ZXJmaWxsaW5nIGlzIG5lZWRlZCBvciBub3QgYW5kIHJlcGVhdGVkbHkgY2FsbHMgYW4gYXBwcm9wcmlhdGUKLSAgICAgICAgICBmdW5jdGlvbiAoYnkgdXNpbmcgYSBmdW5jdGlvbiBwb2ludGVyKSB0aGF0IGZpbGxzIG9uZSByb3cgdGhlIGJsb2NrLgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgcmVmICAgICAgICAgICAgICAgcG9pbnRlciB0byByZWZlcmVuY2UgZnJhbWUKLSAgICAgICAgICB4MCAgICAgICAgICAgICAgICB4LWNvb3JkaW5hdGUgZm9yIGJsb2NrCi0gICAgICAgICAgeTAgICAgICAgICAgICAgICAgeS1jb29yZGluYXRlIGZvciBibG9jawotICAgICAgICAgIHdpZHRoICAgICAgICAgICAgIHdpZHRoIG9mIHJlZmVyZW5jZSBmcmFtZQotICAgICAgICAgIGhlaWdodCAgICAgICAgICAgIGhlaWdodCBvZiByZWZlcmVuY2UgZnJhbWUKLSAgICAgICAgICBibG9ja1dpZHRoICAgICAgICB3aWR0aCBvZiBibG9jawotICAgICAgICAgIGJsb2NrSGVpZ2h0ICAgICAgIGhlaWdodCBvZiBibG9jawotICAgICAgICAgIGZpbGxTY2FuTGVuZ3RoICAgIGxlbmd0aCBvZiBhIGxpbmUgaW4gb3V0cHV0IGFycmF5IChwaXhlbHMpCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgZmlsbCAgICAgICAgICAgICAgcG9pbnRlciB0byBhcnJheSB3aGVyZSBvdXRwdXQgYmxvY2sgaXMgd3JpdHRlbgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RGaWxsQmxvY2soCi0gIHU4ICpyZWYsCi0gIHU4ICpmaWxsLAotICBpMzIgeDAsCi0gIGkzMiB5MCwKLSAgdTMyIHdpZHRoLAotICB1MzIgaGVpZ2h0LAotICB1MzIgYmxvY2tXaWR0aCwKLSAgdTMyIGJsb2NrSGVpZ2h0LAotICB1MzIgZmlsbFNjYW5MZW5ndGgpCi0KLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICBpMzIgeHN0b3AsIHlzdG9wOwotICAgIHZvaWQgKCpmcCkodTgqLCB1OCosIGkzMiwgaTMyLCBpMzIpOwotICAgIGkzMiBsZWZ0LCB4LCByaWdodDsKLSAgICBpMzIgdG9wLCB5LCBib3R0b207Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChyZWYpOwotICAgIEFTU0VSVChmaWxsKTsKLSAgICBBU1NFUlQod2lkdGgpOwotICAgIEFTU0VSVChoZWlnaHQpOwotICAgIEFTU0VSVChmaWxsKTsKLSAgICBBU1NFUlQoYmxvY2tXaWR0aCk7Ci0gICAgQVNTRVJUKGJsb2NrSGVpZ2h0KTsKLQotICAgIHhzdG9wID0geDAgKyAoaTMyKWJsb2NrV2lkdGg7Ci0gICAgeXN0b3AgPSB5MCArIChpMzIpYmxvY2tIZWlnaHQ7Ci0KLSAgICAvKiBDaG9vc2UgY29ycmVjdCBmdW5jdGlvbiB3aGV0aGVyIG92ZXJmaWxsaW5nIG9uIGxlZnQtZWRnZSBvciByaWdodC1lZGdlCi0gICAgICogaXMgbmVlZGVkIG9yIG5vdCAqLwotICAgIGlmICh4MCA+PSAwICYmIHhzdG9wIDw9IChpMzIpd2lkdGgpCi0gICAgICAgIGZwID0gRmlsbFJvdzE7Ci0gICAgZWxzZQotICAgICAgICBmcCA9IGgyNjRic2RGaWxsUm93NzsKLQotICAgIGlmICh5c3RvcCA8IDApCi0gICAgICAgIHkwID0gLShpMzIpYmxvY2tIZWlnaHQ7Ci0KLSAgICBpZiAoeHN0b3AgPCAwKQotICAgICAgICB4MCA9IC0oaTMyKWJsb2NrV2lkdGg7Ci0KLSAgICBpZiAoeTAgPiAoaTMyKWhlaWdodCkKLSAgICAgICAgeTAgPSAoaTMyKWhlaWdodDsKLQotICAgIGlmICh4MCA+IChpMzIpd2lkdGgpCi0gICAgICAgIHgwID0gKGkzMil3aWR0aDsKLQotICAgIHhzdG9wID0geDAgKyAoaTMyKWJsb2NrV2lkdGg7Ci0gICAgeXN0b3AgPSB5MCArIChpMzIpYmxvY2tIZWlnaHQ7Ci0KLSAgICBpZiAoeDAgPiAwKQotICAgICAgICByZWYgKz0geDA7Ci0KLSAgICBpZiAoeTAgPiAwKQotICAgICAgICByZWYgKz0geTAgKiAoaTMyKXdpZHRoOwotCi0gICAgbGVmdCA9IHgwIDwgMCA/IC14MCA6IDA7Ci0gICAgcmlnaHQgPSB4c3RvcCA+IChpMzIpd2lkdGggPyB4c3RvcCAtIChpMzIpd2lkdGggOiAwOwotICAgIHggPSAoaTMyKWJsb2NrV2lkdGggLSBsZWZ0IC0gcmlnaHQ7Ci0KLSAgICB0b3AgPSB5MCA8IDAgPyAteTAgOiAwOwotICAgIGJvdHRvbSA9IHlzdG9wID4gKGkzMiloZWlnaHQgPyB5c3RvcCAtIChpMzIpaGVpZ2h0IDogMDsKLSAgICB5ID0gKGkzMilibG9ja0hlaWdodCAtIHRvcCAtIGJvdHRvbTsKLQotICAgIC8qIFRvcC1vdmVyZmlsbGluZyAqLwotICAgIGZvciAoIDsgdG9wOyB0b3AtLSApCi0gICAgewotICAgICAgICAoKmZwKShyZWYsIGZpbGwsIGxlZnQsIHgsIHJpZ2h0KTsKLSAgICAgICAgZmlsbCArPSBmaWxsU2Nhbkxlbmd0aDsKLSAgICB9Ci0KLSAgICAvKiBMaW5lcyBpbnNpZGUgcmVmZXJlbmNlIGltYWdlICovCi0gICAgZm9yICggOyB5OyB5LS0gKQotICAgIHsKLSAgICAgICAgKCpmcCkocmVmLCBmaWxsLCBsZWZ0LCB4LCByaWdodCk7Ci0gICAgICAgIHJlZiArPSB3aWR0aDsKLSAgICAgICAgZmlsbCArPSBmaWxsU2Nhbkxlbmd0aDsKLSAgICB9Ci0KLSAgICByZWYgLT0gd2lkdGg7Ci0KLSAgICAvKiBCb3R0b20tb3ZlcmZpbGxpbmcgKi8KLSAgICBmb3IgKCA7IGJvdHRvbTsgYm90dG9tLS0gKQotICAgIHsKLSAgICAgICAgKCpmcCkocmVmLCBmaWxsLCBsZWZ0LCB4LCByaWdodCk7Ci0gICAgICAgIGZpbGwgKz0gZmlsbFNjYW5MZW5ndGg7Ci0gICAgfQotfQotCi0vKmxpbnQgK2U3MDEgK2U3MDIgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfcmVjb25zdHJ1Y3QuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9yZWNvbnN0cnVjdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTFhMTQwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9yZWNvbnN0cnVjdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfUkVDT05TVFJVQ1RfSAotI2RlZmluZSBIMjY0U1dERUNfUkVDT05TVFJVQ1RfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9pbWFnZS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZm5kZWYgSDI2NERFQ19PTVhETAotdm9pZCBoMjY0YnNkUHJlZGljdFNhbXBsZXMoCi0gIHU4ICpkYXRhLAotICBtdl90ICptdiwKLSAgaW1hZ2VfdCAqcmVmUGljLAotICB1MzIgeEEsCi0gIHUzMiB5QSwKLSAgdTMyIHBhcnRYLAotICB1MzIgcGFydFksCi0gIHUzMiBwYXJ0V2lkdGgsCi0gIHUzMiBwYXJ0SGVpZ2h0KTsKLSNlbHNlCi12b2lkIGgyNjRic2RQcmVkaWN0U2FtcGxlcygKLSAgdTggKmRhdGEsCi0gIG12X3QgKm12LAotICBpbWFnZV90ICpyZWZQaWMsCi0gIHUzMiBjb2xBbmRSb3csLyogcGFja2FnZWQgZGF0YSB8IGNvbHVtbiAgICB8IHJvdyAgICAgICAgICAgICAgICB8Ki8KLSAgdTMyIHBhcnQsICAgICAvKiBwYWNrYWdlZCBkYXRhIHxwYXJ0WHxwYXJ0WXxwYXJ0V2lkdGh8cGFydEhlaWdodHwqLwotICB1OCAqcEZpbGwpOwotI2VuZGlmCi0KLXZvaWQgaDI2NGJzZEZpbGxCbG9jaygKLSAgdTggKiByZWYsCi0gIHU4ICogZmlsbCwKLSAgaTMyIHgwLAotICBpMzIgeTAsCi0gIHUzMiB3aWR0aCwKLSAgdTMyIGhlaWdodCwKLSAgdTMyIGJsb2NrV2lkdGgsCi0gIHUzMiBibG9ja0hlaWdodCwKLSAgdTMyIGZpbGxTY2FuTGVuZ3RoKTsKLQotdm9pZCBoMjY0YnNkSW50ZXJwb2xhdGVDaHJvbWFIb3IoCi0gIHU4ICpwUmVmLAotICB1OCAqcHJlZFBhcnRDaHJvbWEsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiB4RnJhYywKLSAgdTMyIGNocm9tYVBhcnRXaWR0aCwKLSAgdTMyIGNocm9tYVBhcnRIZWlnaHQpOwotCi12b2lkIGgyNjRic2RJbnRlcnBvbGF0ZUNocm9tYVZlcigKLSAgdTggKnBSZWYsCi0gIHU4ICpwcmVkUGFydENocm9tYSwKLSAgaTMyIHgwLAotICBpMzIgeTAsCi0gIHUzMiB3aWR0aCwKLSAgdTMyIGhlaWdodCwKLSAgdTMyIHlGcmFjLAotICB1MzIgY2hyb21hUGFydFdpZHRoLAotICB1MzIgY2hyb21hUGFydEhlaWdodCk7Ci0KLXZvaWQgaDI2NGJzZEludGVycG9sYXRlQ2hyb21hSG9yVmVyKAotICB1OCAqcmVmLAotICB1OCAqcHJlZFBhcnRDaHJvbWEsCi0gIGkzMiB4MCwKLSAgaTMyIHkwLAotICB1MzIgd2lkdGgsCi0gIHUzMiBoZWlnaHQsCi0gIHUzMiB4RnJhYywKLSAgdTMyIHlGcmFjLAotICB1MzIgY2hyb21hUGFydFdpZHRoLAotICB1MzIgY2hyb21hUGFydEhlaWdodCk7Ci0KLXZvaWQgaDI2NGJzZEludGVycG9sYXRlVmVySGFsZigKLSAgdTggKnJlZiwKLSAgdTggKm1iLAotICBpMzIgeDAsCi0gIGkzMiB5MCwKLSAgdTMyIHdpZHRoLAotICB1MzIgaGVpZ2h0LAotICB1MzIgcGFydFdpZHRoLAotICB1MzIgcGFydEhlaWdodCk7Ci0KLXZvaWQgaDI2NGJzZEludGVycG9sYXRlVmVyUXVhcnRlcigKLSAgdTggKnJlZiwKLSAgdTggKm1iLAotICBpMzIgeDAsCi0gIGkzMiB5MCwKLSAgdTMyIHdpZHRoLAotICB1MzIgaGVpZ2h0LAotICB1MzIgcGFydFdpZHRoLAotICB1MzIgcGFydEhlaWdodCwKLSAgdTMyIHZlck9mZnNldCk7Ci0KLXZvaWQgaDI2NGJzZEludGVycG9sYXRlSG9ySGFsZigKLSAgdTggKnJlZiwKLSAgdTggKm1iLAotICBpMzIgeDAsCi0gIGkzMiB5MCwKLSAgdTMyIHdpZHRoLAotICB1MzIgaGVpZ2h0LAotICB1MzIgcGFydFdpZHRoLAotICB1MzIgcGFydEhlaWdodCk7Ci0KLXZvaWQgaDI2NGJzZEludGVycG9sYXRlSG9yUXVhcnRlcigKLSAgdTggKnJlZiwKLSAgdTggKm1iLAotICBpMzIgeDAsCi0gIGkzMiB5MCwKLSAgdTMyIHdpZHRoLAotICB1MzIgaGVpZ2h0LAotICB1MzIgcGFydFdpZHRoLAotICB1MzIgcGFydEhlaWdodCwKLSAgdTMyIGhvck9mZnNldCk7Ci0KLXZvaWQgaDI2NGJzZEludGVycG9sYXRlSG9yVmVyUXVhcnRlcigKLSAgdTggKnJlZiwKLSAgdTggKm1iLAotICBpMzIgeDAsCi0gIGkzMiB5MCwKLSAgdTMyIHdpZHRoLAotICB1MzIgaGVpZ2h0LAotICB1MzIgcGFydFdpZHRoLAotICB1MzIgcGFydEhlaWdodCwKLSAgdTMyIGhvclZlck9mZnNldCk7Ci0KLXZvaWQgaDI2NGJzZEludGVycG9sYXRlTWlkSGFsZigKLSAgdTggKnJlZiwKLSAgdTggKm1iLAotICBpMzIgeDAsCi0gIGkzMiB5MCwKLSAgdTMyIHdpZHRoLAotICB1MzIgaGVpZ2h0LAotICB1MzIgcGFydFdpZHRoLAotICB1MzIgcGFydEhlaWdodCk7Ci0KLXZvaWQgaDI2NGJzZEludGVycG9sYXRlTWlkVmVyUXVhcnRlcigKLSAgdTggKnJlZiwKLSAgdTggKm1iLAotICBpMzIgeDAsCi0gIGkzMiB5MCwKLSAgdTMyIHdpZHRoLAotICB1MzIgaGVpZ2h0LAotICB1MzIgcGFydFdpZHRoLAotICB1MzIgcGFydEhlaWdodCwKLSAgdTMyIHZlck9mZnNldCk7Ci0KLXZvaWQgaDI2NGJzZEludGVycG9sYXRlTWlkSG9yUXVhcnRlcigKLSAgdTggKnJlZiwKLSAgdTggKm1iLAotICBpMzIgeDAsCi0gIGkzMiB5MCwKLSAgdTMyIHdpZHRoLAotICB1MzIgaGVpZ2h0LAotICB1MzIgcGFydFdpZHRoLAotICB1MzIgcGFydEhlaWdodCwKLSAgdTMyIGhvck9mZnNldCk7Ci0KLQotdm9pZCBoMjY0YnNkRmlsbFJvdzcoCi0gIHU4ICpyZWYsCi0gIHU4ICpmaWxsLAotICBpMzIgbGVmdCwKLSAgaTMyIGNlbnRlciwKLSAgaTMyIHJpZ2h0KTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfUkVDT05TVFJVQ1RfSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VpLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NTZjNDcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgaDI2NGJzZERlY29kZVNlaU1lc3NhZ2UKLSAgICAgICAgICBEZWNvZGVCdWZmZXJpbmdQZXJpb2QKLSAgICAgICAgICBEZWNvZGVQaWN0dXJlVGltaW5nCi0gICAgICAgICAgRGVjb2RlUGFuU2NhblJlY3RhbmdsZQotICAgICAgICAgIERlY29kZUZpbGxlclBheWxvYWQKLSAgICAgICAgICBEZWNvZGVVc2VyRGF0YVJlZ2lzdGVyZWRJVHVUVDM1Ci0gICAgICAgICAgRGVjb2RlVXNlckRhdGFVbnJlZ2lzdGVyZWQKLSAgICAgICAgICBEZWNvZGVSZWNvdmVyeVBvaW50Ci0gICAgICAgICAgRGVjb2RlRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24KLSAgICAgICAgICBEZWNvZGVTcGFyZVBpYwotICAgICAgICAgIERlY29kZVNjZW5lSW5mbwotICAgICAgICAgIERlY29kZVN1YlNlcUluZm8KLSAgICAgICAgICBEZWNvZGVTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcwotICAgICAgICAgIERlY29kZVN1YlNlcUNoYXJhY3RlcmlzdGljcwotICAgICAgICAgIERlY29kZUZ1bGxGcmFtZUZyZWV6ZQotICAgICAgICAgIERlY29kZUZ1bGxGcmFtZVNuYXBzaG90Ci0gICAgICAgICAgRGVjb2RlUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0Ci0gICAgICAgICAgRGVjb2RlUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZAotICAgICAgICAgIERlY29kZU1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldAotICAgICAgICAgIERlY29kZVJlc2VydmVkU2VpTWVzc2FnZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImgyNjRic2Rfc2VpLmgiCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgotI2luY2x1ZGUgImgyNjRic2RfdmxjLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9oZWFkZXIuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGNvbnN0IHUzMiBudW1DbG9ja1RTWzldID0gezEsMSwxLDIsMiwzLDMsMiwzfTsKLXN0YXRpYyBjb25zdCB1MzIgY2VpbExvZzJOdW1TbGljZUdyb3Vwc1s5XSA9IHswLDEsMSwyLDIsMywzLDMsM307Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBEZWNvZGVCdWZmZXJpbmdQZXJpb2QoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpQnVmZmVyaW5nUGVyaW9kX3QgKnBCdWZmZXJpbmdQZXJpb2QsCi0gIHUzMiBjcGJDbnQsCi0gIHUzMiBpbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoLAotICB1MzIgbmFsSHJkQnBQcmVzZW50RmxhZywKLSAgdTMyIHZjbEhyZEJwUHJlc2VudEZsYWcpOwotCi1zdGF0aWMgdTMyIERlY29kZVBpY3R1cmVUaW1pbmcoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpUGljVGltaW5nX3QgKnBQaWNUaW1pbmcsCi0gIHUzMiBjcGJSZW1vdmFsRGVsYXlMZW5ndGgsCi0gIHUzMiBkcGJPdXRwdXREZWxheUxlbmd0aCwKLSAgdTMyIHRpbWVPZmZzZXRMZW5ndGgsCi0gIHUzMiBjcGJEcGJEZWxheXNQcmVzZW50RmxhZywKLSAgdTMyIHBpY1N0cnVjdFByZXNlbnRGbGFnKTsKLQotc3RhdGljIHUzMiBEZWNvZGVQYW5TY2FuUmVjdGFuZ2xlKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVBhblNjYW5SZWN0X3QgKnBQYW5TY2FuUmVjdGFuZ2xlKTsKLQotc3RhdGljIHUzMiBEZWNvZGVGaWxsZXJQYXlsb2FkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyIHBheWxvYWRTaXplKTsKLQotc3RhdGljIHUzMiBEZWNvZGVVc2VyRGF0YVJlZ2lzdGVyZWRJVHVUVDM1KAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzVfdCAqcFVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzUsCi0gIHUzMiBwYXlsb2FkU2l6ZSk7Ci0KLXN0YXRpYyB1MzIgRGVjb2RlVXNlckRhdGFVbnJlZ2lzdGVyZWQoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpVXNlckRhdGFVbnJlZ2lzdGVyZWRfdCAqcFVzZXJEYXRhVW5yZWdpc3RlcmVkLAotICB1MzIgcGF5bG9hZFNpemUpOwotCi1zdGF0aWMgdTMyIERlY29kZVJlY292ZXJ5UG9pbnQoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpUmVjb3ZlcnlQb2ludF90ICpwUmVjb3ZlcnlQb2ludCk7Ci0KLXN0YXRpYyB1MzIgRGVjb2RlRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24oCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb25fdCAqcERlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uLAotICB1MzIgbnVtUmVmRnJhbWVzKTsKLQotc3RhdGljIHUzMiBEZWNvZGVTcGFyZVBpYygKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlTcGFyZVBpY190ICpwU3BhcmVQaWMsCi0gIHUzMiBwaWNTaXplSW5NYXBVbml0cyk7Ci0KLXN0YXRpYyB1MzIgRGVjb2RlU2NlbmVJbmZvKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVNjZW5lSW5mb190ICpwU2NlbmVJbmZvKTsKLQotc3RhdGljIHUzMiBEZWNvZGVTdWJTZXFJbmZvKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVN1YlNlcUluZm9fdCAqcFN1YlNlcUluZm8pOwotCi1zdGF0aWMgdTMyIERlY29kZVN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzX3QgKnBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcyk7Ci0KLXN0YXRpYyB1MzIgRGVjb2RlU3ViU2VxQ2hhcmFjdGVyaXN0aWNzKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVN1YlNlcUNoYXJhY3RlcmlzdGljc190ICpwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzKTsKLQotc3RhdGljIHUzMiBEZWNvZGVGdWxsRnJhbWVGcmVlemUoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpRnVsbEZyYW1lRnJlZXplX3QgKnBGdWxsRnJhbWVGcmVlemUpOwotCi1zdGF0aWMgdTMyIERlY29kZUZ1bGxGcmFtZVNuYXBzaG90KAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaUZ1bGxGcmFtZVNuYXBzaG90X3QgKnBGdWxsRnJhbWVTbmFwc2hvdCk7Ci0KLXN0YXRpYyB1MzIgRGVjb2RlUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0KAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydF90ICpwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0KTsKLQotc3RhdGljIHUzMiBEZWNvZGVQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmRfdCAqcFByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmQpOwotCi1zdGF0aWMgdTMyIERlY29kZU1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldCgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXRfdCAqcE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldCwKLSAgdTMyIG51bVNsaWNlR3JvdXBzKTsKLQotc3RhdGljIHUzMiBEZWNvZGVSZXNlcnZlZFNlaU1lc3NhZ2UoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpUmVzZXJ2ZWRTZWlNZXNzYWdlX3QgKnBSZXNlcnZlZFNlaU1lc3NhZ2UsCi0gIHUzMiBwYXlsb2FkU2l6ZSk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZERlY29kZVNlaU1lc3NhZ2UKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICA8Kys+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlU2VpTWVzc2FnZSgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCi0gIHNlaU1lc3NhZ2VfdCAqcFNlaU1lc3NhZ2UsCi0gIHUzMiBudW1TbGljZUdyb3VwcykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCBwYXlsb2FkVHlwZSwgcGF5bG9hZFNpemUsIHN0YXR1czsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBTZWlNZXNzYWdlKTsKLQotCi0gICAgSDI2NFN3RGVjTWVtc2V0KHBTZWlNZXNzYWdlLCAwLCBzaXplb2Yoc2VpTWVzc2FnZV90KSk7Ci0KLSAgICBkbwotICAgIHsKLSAgICAgICAgcGF5bG9hZFR5cGUgPSAwOwotICAgICAgICB3aGlsZSgodG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KSkgPT0gMHhGRikKLSAgICAgICAgewotICAgICAgICAgICAgcGF5bG9hZFR5cGUgKz0gMjU1OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcGF5bG9hZFR5cGUgKz0gdG1wOwotCi0gICAgICAgIHBheWxvYWRTaXplID0gMDsKLSAgICAgICAgd2hpbGUoKHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCkpID09IDB4RkYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBheWxvYWRTaXplICs9IDI1NTsKLSAgICAgICAgfQotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBheWxvYWRTaXplICs9IHRtcDsKLQotICAgICAgICBwU2VpTWVzc2FnZS0+cGF5bG9hZFR5cGUgPSBwYXlsb2FkVHlwZTsKLQotICAgICAgICBzd2l0Y2ggKHBheWxvYWRUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgQVNTRVJUKHBTZXFQYXJhbVNldCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlQnVmZmVyaW5nUGVyaW9kKAotICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAotICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5idWZmZXJpbmdQZXJpb2QsCi0gICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuY3BiQ250LAotICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzLgotICAgICAgICAgICAgICAgICAgaW5pdGlhbENwYlJlbW92YWxEZWxheUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVyc1ByZXNlbnRGbGFnLAotICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWcpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgQVNTRVJUKHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVyc1ByZXNlbnRGbGFnKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVQaWN0dXJlVGltaW5nKAotICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAotICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5waWNUaW1pbmcsCi0gICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuCi0gICAgICAgICAgICAgICAgICAgICAgY3BiUmVtb3ZhbERlbGF5TGVuZ3RoLAotICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzLgotICAgICAgICAgICAgICAgICAgICAgIGRwYk91dHB1dERlbGF5TGVuZ3RoLAotICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzLgotICAgICAgICAgICAgICAgICAgICB0aW1lT2Zmc2V0TGVuZ3RoLAotICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWcgfHwKLSAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVyc1ByZXNlbnRGbGFnID8KLSAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFLAotICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT5waWNTdHJ1Y3RQcmVzZW50RmxhZyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVQYW5TY2FuUmVjdGFuZ2xlKAotICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAotICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5wYW5TY2FuUmVjdCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVGaWxsZXJQYXlsb2FkKHBTdHJtRGF0YSwgcGF5bG9hZFNpemUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlVXNlckRhdGFSZWdpc3RlcmVkSVR1VFQzNSgKLSAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+dXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNSwKLSAgICAgICAgICAgICAgICAgIHBheWxvYWRTaXplKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVVzZXJEYXRhVW5yZWdpc3RlcmVkKAotICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAotICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT51c2VyRGF0YVVucmVnaXN0ZXJlZCwKLSAgICAgICAgICAgICAgICAgIHBheWxvYWRTaXplKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVJlY292ZXJ5UG9pbnQoCi0gICAgICAgICAgICAgICAgICBwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnJlY292ZXJ5UG9pbnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24oCi0gICAgICAgICAgICAgICAgICBwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPmRlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uLAotICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICAgICAgQVNTRVJUKHBTZXFQYXJhbVNldCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlU3BhcmVQaWMoCi0gICAgICAgICAgICAgICAgICBwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnNwYXJlUGljLAotICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5waWNXaWR0aEluTWJzICogcFNlcVBhcmFtU2V0LT5waWNIZWlnaHRJbk1icyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVTY2VuZUluZm8oCi0gICAgICAgICAgICAgICAgICBwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnNjZW5lSW5mbyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlU3ViU2VxSW5mbygKLSAgICAgICAgICAgICAgICAgIHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICZwU2VpTWVzc2FnZS0+c3ViU2VxSW5mbyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MoCi0gICAgICAgICAgICAgICAgICBwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVTdWJTZXFDaGFyYWN0ZXJpc3RpY3MoCi0gICAgICAgICAgICAgICAgICBwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnN1YlNlcUNoYXJhY3RlcmlzdGljcyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMTM6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlRnVsbEZyYW1lRnJlZXplKAotICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAotICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5mdWxsRnJhbWVGcmVlemUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDE0OiAvKiBUaGlzIFNFSSBkb2VzIG5vdCBjb250YWluIGRhdGEsIHdoYXQgdG8gZG8gPz8/ICovCi0gICAgICAgICAgICAgICAgc3RhdHVzID0gSEFOVFJPX09LOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZUZ1bGxGcmFtZVNuYXBzaG90KAotICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAotICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5mdWxsRnJhbWVTbmFwc2hvdCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0KAotICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAotICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5wcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDE3OgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmQoCi0gICAgICAgICAgICAgICAgICBwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAmcFNlaU1lc3NhZ2UtPnByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDE4OgotICAgICAgICAgICAgICAgIEFTU0VSVChudW1TbGljZUdyb3Vwcyk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0KAotICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAotICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5tb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQsCi0gICAgICAgICAgICAgICAgICBudW1TbGljZUdyb3Vwcyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlUmVzZXJ2ZWRTZWlNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgcFN0cm1EYXRhLAotICAgICAgICAgICAgICAgICAgJnBTZWlNZXNzYWdlLT5yZXNlcnZlZFNlaU1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICBwYXlsb2FkU2l6ZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3RhdHVzICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybihzdGF0dXMpOwotCi0gICAgICAgIHdoaWxlICghaDI2NGJzZElzQnl0ZUFsaWduZWQocFN0cm1EYXRhKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSkgIT0gMSkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICB3aGlsZSAoIWgyNjRic2RJc0J5dGVBbGlnbmVkKHBTdHJtRGF0YSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSB3aGlsZSAoaDI2NGJzZE1vcmVSYnNwRGF0YShwU3RybURhdGEpKTsKLQotICAgIHJldHVybihoMjY0YnNkUmJzcFRyYWlsaW5nQml0cyhwU3RybURhdGEpKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZUJ1ZmZlcmluZ1BlcmlvZAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgPCsrPgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgPCsrPgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIDwrKz4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBEZWNvZGVCdWZmZXJpbmdQZXJpb2QoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpQnVmZmVyaW5nUGVyaW9kX3QgKnBCdWZmZXJpbmdQZXJpb2QsCi0gIHUzMiBjcGJDbnQsCi0gIHUzMiBpbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoLAotICB1MzIgbmFsSHJkQnBQcmVzZW50RmxhZywKLSAgdTMyIHZjbEhyZEJwUHJlc2VudEZsYWcpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgaTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBCdWZmZXJpbmdQZXJpb2QpOwotICAgIEFTU0VSVChjcGJDbnQpOwotICAgIEFTU0VSVChpbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoKTsKLQotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICZwQnVmZmVyaW5nUGVyaW9kLT5zZXFQYXJhbWV0ZXJTZXRJZCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIGlmIChwQnVmZmVyaW5nUGVyaW9kLT5zZXFQYXJhbWV0ZXJTZXRJZCA+IDMxKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICBpZiAobmFsSHJkQnBQcmVzZW50RmxhZykKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjcGJDbnQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCBpbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoKTsKLSAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICBpZiAodG1wID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgcEJ1ZmZlcmluZ1BlcmlvZC0+aW5pdGlhbENwYlJlbW92YWxEZWxheVtpXSA9IHRtcDsKLQotICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCBpbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoKTsKLSAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICBwQnVmZmVyaW5nUGVyaW9kLT5pbml0aWFsQ3BiUmVtb3ZhbERlbGF5T2Zmc2V0W2ldID0gdG1wOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHZjbEhyZEJwUHJlc2VudEZsYWcpCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3BiQ250OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgaW5pdGlhbENwYlJlbW92YWxEZWxheUxlbmd0aCk7Ci0gICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgcEJ1ZmZlcmluZ1BlcmlvZC0+aW5pdGlhbENwYlJlbW92YWxEZWxheVtpXSA9IHRtcDsKLQotICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCBpbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoKTsKLSAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICBwQnVmZmVyaW5nUGVyaW9kLT5pbml0aWFsQ3BiUmVtb3ZhbERlbGF5T2Zmc2V0W2ldID0gdG1wOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVQaWN0dXJlVGltaW5nCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIElucHV0czoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgPCsrPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZVBpY3R1cmVUaW1pbmcoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpUGljVGltaW5nX3QgKnBQaWNUaW1pbmcsCi0gIHUzMiBjcGJSZW1vdmFsRGVsYXlMZW5ndGgsCi0gIHUzMiBkcGJPdXRwdXREZWxheUxlbmd0aCwKLSAgdTMyIHRpbWVPZmZzZXRMZW5ndGgsCi0gIHUzMiBjcGJEcGJEZWxheXNQcmVzZW50RmxhZywKLSAgdTMyIHBpY1N0cnVjdFByZXNlbnRGbGFnKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIGk7Ci0gICAgaTMyIGl0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwUGljVGltaW5nKTsKLQotCi0gICAgaWYgKGNwYkRwYkRlbGF5c1ByZXNlbnRGbGFnKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCBjcGJSZW1vdmFsRGVsYXlMZW5ndGgpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBQaWNUaW1pbmctPmNwYlJlbW92YWxEZWxheSA9IHRtcDsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIGRwYk91dHB1dERlbGF5TGVuZ3RoKTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwUGljVGltaW5nLT5kcGJPdXRwdXREZWxheSA9IHRtcDsKLSAgICB9Ci0KLSAgICBpZiAocGljU3RydWN0UHJlc2VudEZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDQpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIGlmICh0bXAgPiA4KQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwUGljVGltaW5nLT5waWNTdHJ1Y3QgPSB0bXA7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUNsb2NrVFNbcFBpY1RpbWluZy0+cGljU3RydWN0XTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHBQaWNUaW1pbmctPmNsb2NrVGltZVN0YW1wRmxhZ1tpXSA9IHRtcCA9PSAxID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgICAgICBpZiAocFBpY1RpbWluZy0+Y2xvY2tUaW1lU3RhbXBGbGFnW2ldKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMik7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+Y3RUeXBlW2ldID0gdG1wOwotCi0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5udWl0RmllbGRCYXNlZEZsYWdbaV0gPSB0bXAgPT0gMSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCA+IDYpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5jb3VudGluZ1R5cGVbaV0gPSB0bXA7Ci0KLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPmZ1bGxUaW1lU3RhbXBGbGFnW2ldID0gdG1wID09IDEgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPmRpc2NvbnRpbnVpdHlGbGFnW2ldID0gdG1wID09IDEgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPmNudERyb3BwZWRGbGFnW2ldID0gdG1wID09IDEgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpOwotICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPm5GcmFtZXNbaV0gPSB0bXA7Ci0KLSAgICAgICAgICAgICAgICBpZiAocFBpY1RpbWluZy0+ZnVsbFRpbWVTdGFtcEZsYWdbaV0pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDYpOwotICAgICAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPiA1OSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+c2Vjb25kc1ZhbHVlW2ldID0gdG1wOwotCi0gICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA+IDU5KQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5taW51dGVzVmFsdWVbaV0gPSB0bXA7Ci0KLSAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA1KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgICAgICBpZiAodG1wID4gMjMpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPmhvdXJzVmFsdWVbaV0gPSB0bXA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+c2Vjb25kc0ZsYWdbaV0gPSB0bXAgPT0gMSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocFBpY1RpbWluZy0+c2Vjb25kc0ZsYWdbaV0pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA+IDU5KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPnNlY29uZHNWYWx1ZVtpXSA9IHRtcDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5taW51dGVzRmxhZ1tpXSA9IHRtcCA9PSAxID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocFBpY1RpbWluZy0+bWludXRlc0ZsYWdbaV0pCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wID4gNTkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5taW51dGVzVmFsdWVbaV0gPSB0bXA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaWNUaW1pbmctPmhvdXJzRmxhZ1tpXSA9IHRtcCA9PSAxID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBQaWNUaW1pbmctPmhvdXJzRmxhZ1tpXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA+IDIzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGljVGltaW5nLT5ob3Vyc1ZhbHVlW2ldID0gdG1wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodGltZU9mZnNldExlbmd0aCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgdGltZU9mZnNldExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICAgICAgaXRtcCA9IChpMzIpdG1wOwotICAgICAgICAgICAgICAgICAgICAvKiBmb2xsb3dpbmcgImNvbnZlcnRzIiB0aW1lT2Zmc2V0TGVuZ3RoLWJpdCBzaWduZWQKLSAgICAgICAgICAgICAgICAgICAgICogaW50ZWdlciBpbnRvIGkzMiAqLwotICAgICAgICAgICAgICAgICAgICAvKmxpbnQgLXNhdmUgLWU3MDEgLWU3MDIgKi8KLSAgICAgICAgICAgICAgICAgICAgaXRtcCA8PD0gKDMyIC0gdGltZU9mZnNldExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGl0bXAgPj49ICgzMiAtIHRpbWVPZmZzZXRMZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAvKmxpbnQgLXJlc3RvcmUgKi8KLSAgICAgICAgICAgICAgICAgICAgcFBpY1RpbWluZy0+dGltZU9mZnNldFtpXSA9IGl0bXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBwUGljVGltaW5nLT50aW1lT2Zmc2V0W2ldID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlUGFuU2NhblJlY3RhbmdsZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgPCsrPgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgPCsrPgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIDwrKz4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBEZWNvZGVQYW5TY2FuUmVjdGFuZ2xlKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVBhblNjYW5SZWN0X3QgKnBQYW5TY2FuUmVjdGFuZ2xlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIGk7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwUGFuU2NhblJlY3RhbmdsZSk7Ci0KLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAmcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5SZWN0SWQpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5SZWN0Q2FuY2VsRmxhZyA9IHRtcCA9PSAxID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICBpZiAoIXBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuUmVjdENhbmNlbEZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICZwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhbkNudCk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIGlmIChwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhbkNudCA+IDIpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuQ250Kys7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuQ250OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICAgICAmcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5SZWN0TGVmdE9mZnNldFtpXSk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLQotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgICAgICZwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RSaWdodE9mZnNldFtpXSk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLQotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgICAgICZwUGFuU2NhblJlY3RhbmdsZS0+cGFuU2NhblJlY3RUb3BPZmZzZXRbaV0pOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICAgICAmcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5SZWN0Qm90dG9tT2Zmc2V0W2ldKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICB9Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgJnBQYW5TY2FuUmVjdGFuZ2xlLT5wYW5TY2FuUmVjdFJlcGV0aXRpb25QZXJpb2QpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICBpZiAocFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5SZWN0UmVwZXRpdGlvblBlcmlvZCA+IDE2Mzg0KQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBpZiAocFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5DbnQgPiAxICYmCi0gICAgICAgICAgcFBhblNjYW5SZWN0YW5nbGUtPnBhblNjYW5SZWN0UmVwZXRpdGlvblBlcmlvZCA+IDEpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlRmlsbGVyUGF5bG9hZAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgPCsrPgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgPCsrPgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIDwrKz4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBEZWNvZGVGaWxsZXJQYXlsb2FkKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyIHBheWxvYWRTaXplKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0KLQotICAgIGlmIChwYXlsb2FkU2l6ZSkKLSAgICAgICAgaWYgKGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLCA4ICogcGF5bG9hZFNpemUpID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZVVzZXJEYXRhUmVnaXN0ZXJlZElUdVRUMzUKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICA8Kys+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlVXNlckRhdGFSZWdpc3RlcmVkSVR1VFQzNSgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1X3QgKnBVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1LAotICB1MzIgcGF5bG9hZFNpemUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgaSwgajsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1KTsKLSAgICBBU1NFUlQocGF5bG9hZFNpemUpOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzUtPml0dVRUMzVDb3VudHJ5Q29kZSA9IHRtcDsKLQotICAgIGlmIChwVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNS0+aXR1VFQzNUNvdW50cnlDb2RlICE9IDB4RkYpCi0gICAgICAgIGkgPSAxOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzUtPml0dVRUMzVDb3VudHJ5Q29kZUV4dGVuc2lvbkJ5dGUgPSB0bXA7Ci0gICAgICAgIGkgPSAyOwotICAgIH0KLQotICAgIC8qIHdoZXJlIGNvcnJlc3BvbmRpbmcgRlJFRSgpID8/PyAqLwotICAgIEFMTE9DQVRFKHBVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1LT5pdHVUVDM1UGF5bG9hZEJ5dGUscGF5bG9hZFNpemUtaSx1OCk7Ci0gICAgcFVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzUtPm51bVBheWxvYWRCeXRlcyA9IHBheWxvYWRTaXplIC0gaTsKLSAgICBpZiAocFVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzUtPml0dVRUMzVQYXlsb2FkQnl0ZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOwotCi0gICAgaiA9IDA7Ci0gICAgZG8KLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFVzZXJEYXRhUmVnaXN0ZXJlZEl0dVRUMzUtPml0dVRUMzVQYXlsb2FkQnl0ZVtqXSA9ICh1OCl0bXA7Ci0gICAgICAgIGkrKzsKLSAgICAgICAgaisrOwotICAgIH0gd2hpbGUgKGkgPCBwYXlsb2FkU2l6ZSk7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZVVzZXJEYXRhVW5yZWdpc3RlcmVkCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIElucHV0czoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgPCsrPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZVVzZXJEYXRhVW5yZWdpc3RlcmVkKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVVzZXJEYXRhVW5yZWdpc3RlcmVkX3QgKnBVc2VyRGF0YVVucmVnaXN0ZXJlZCwKLSAgdTMyIHBheWxvYWRTaXplKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLCB0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwVXNlckRhdGFVbnJlZ2lzdGVyZWQpOwotCi0KLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgIHsKLSAgICAgICAgcFVzZXJEYXRhVW5yZWdpc3RlcmVkLT51dWlkSXNvSWVjMTE1NzhbaV0gPSBoMjY0YnNkU2hvd0JpdHMzMihwU3RybURhdGEpOwotICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsMzIpID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgLyogd2hlcmUgY29ycmVzcG9uZGluZyBGUkVFKCkgPz8/ICovCi0gICAgQUxMT0NBVEUocFVzZXJEYXRhVW5yZWdpc3RlcmVkLT51c2VyRGF0YVBheWxvYWRCeXRlLCBwYXlsb2FkU2l6ZSAtIDE2LCB1OCk7Ci0gICAgaWYgKHBVc2VyRGF0YVVucmVnaXN0ZXJlZC0+dXNlckRhdGFQYXlsb2FkQnl0ZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOwotCi0gICAgcFVzZXJEYXRhVW5yZWdpc3RlcmVkLT5udW1QYXlsb2FkQnl0ZXMgPSBwYXlsb2FkU2l6ZSAtIDE2OwotCi0gICAgZm9yIChpID0gMDsgaSA8IHBheWxvYWRTaXplIC0gMTY7IGkrKykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFVzZXJEYXRhVW5yZWdpc3RlcmVkLT51c2VyRGF0YVBheWxvYWRCeXRlW2ldID0gKHU4KXRtcDsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZVJlY292ZXJ5UG9pbnQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICA8Kys+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlUmVjb3ZlcnlQb2ludCgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlSZWNvdmVyeVBvaW50X3QgKnBSZWNvdmVyeVBvaW50KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwUmVjb3ZlcnlQb2ludCk7Ci0KLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICZwUmVjb3ZlcnlQb2ludC0+cmVjb3ZlcnlGcmFtZUNudCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwUmVjb3ZlcnlQb2ludC0+ZXhhY3RNYXRjaEZsYWcgPSB0bXAgPT0gMSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwUmVjb3ZlcnlQb2ludC0+YnJva2VuTGlua0ZsYWcgPSB0bXAgPT0gMSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAyKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBpZiAodG1wID4gMikKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBSZWNvdmVyeVBvaW50LT5jaGFuZ2luZ1NsaWNlR3JvdXBJZGMgPSB0bXA7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZURlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIElucHV0czoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgPCsrPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZURlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaURlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uX3QgKnBEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbiwKLSAgdTMyIG51bVJlZkZyYW1lcykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocERlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uKTsKLQotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwRGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb24tPm9yaWdpbmFsSWRyRmxhZyA9IHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgJnBEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbi0+b3JpZ2luYWxGcmFtZU51bSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogZnJhbWVfbWJzX29ubHlfZmxhZyBhc3N1bWVkIGFsd2F5cyB0cnVlIHNvIHNvbWUgZmllbGQgcmVsYXRlZCBzeW50YXgKLSAgICAgKiBlbGVtZW50cyBhcmUgc2tpcHBlZCwgc2VlIEguMjY0IHN0YW5kYXJkICovCi0gICAgdG1wID0gaDI2NGJzZERlY1JlZlBpY01hcmtpbmcocFN0cm1EYXRhLAotICAgICAgJnBEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbi0+ZGVjUmVmUGljTWFya2luZywgTkFMX1NFSSwgbnVtUmVmRnJhbWVzKTsKLQotICAgIHJldHVybih0bXApOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlU3BhcmVQaWMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICA8Kys+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlU3BhcmVQaWMoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpU3BhcmVQaWNfdCAqcFNwYXJlUGljLAotICB1MzIgcGljU2l6ZUluTWFwVW5pdHMpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgaSwgaiwgbWFwVW5pdENudDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBTcGFyZVBpYyk7Ci0KLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICZwU3BhcmVQaWMtPnRhcmdldEZyYW1lTnVtKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBTcGFyZVBpYy0+c3BhcmVGaWVsZEZsYWcgPSB0bXAgPT0gMSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotICAgIC8qIGRvIG5vdCBhY2NlcHQgZmllbGRzICovCi0gICAgaWYgKHBTcGFyZVBpYy0+c3BhcmVGaWVsZEZsYWcpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZwU3BhcmVQaWMtPm51bVNwYXJlUGljcyk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIHBTcGFyZVBpYy0+bnVtU3BhcmVQaWNzKys7Ci0gICAgaWYgKHBTcGFyZVBpYy0+bnVtU3BhcmVQaWNzID4gTUFYX05VTV9TUEFSRV9QSUNTKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcFNwYXJlUGljLT5udW1TcGFyZVBpY3M7IGkrKykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgJnBTcGFyZVBpYy0+ZGVsdGFTcGFyZUZyYW1lTnVtW2ldKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICAgJnBTcGFyZVBpYy0+c3BhcmVBcmVhSWRjW2ldKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgaWYgKHBTcGFyZVBpYy0+c3BhcmVBcmVhSWRjW2ldID4gMikKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgICAgICBpZiAocFNwYXJlUGljLT5zcGFyZUFyZWFJZGNbaV0gPT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogd2hlcmUgY29ycmVzcG9uZGluZyBGUkVFKCkgPz8/ICovCi0gICAgICAgICAgICBBTExPQ0FURShwU3BhcmVQaWMtPnNwYXJlVW5pdEZsYWdbaV0sIHBpY1NpemVJbk1hcFVuaXRzLCB1MzIpOwotICAgICAgICAgICAgaWYgKHBTcGFyZVBpYy0+c3BhcmVVbml0RmxhZ1tpXSA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7Ci0gICAgICAgICAgICBwU3BhcmVQaWMtPnplcm9SdW5MZW5ndGhbaV0gPSBOVUxMOwotCi0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcGljU2l6ZUluTWFwVW5pdHM7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIHBTcGFyZVBpYy0+c3BhcmVVbml0RmxhZ1tpXVtqXSA9IHRtcCA9PSAxID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBTcGFyZVBpYy0+c3BhcmVBcmVhSWRjW2ldID09IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHdoZXJlIGNvcnJlc3BvbmRpbmcgRlJFRSgpID8/PyAqLwotICAgICAgICAgICAgQUxMT0NBVEUocFNwYXJlUGljLT56ZXJvUnVuTGVuZ3RoW2ldLCBwaWNTaXplSW5NYXBVbml0cywgdTMyKTsKLSAgICAgICAgICAgIGlmIChwU3BhcmVQaWMtPnplcm9SdW5MZW5ndGhbaV0gPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOwotICAgICAgICAgICAgcFNwYXJlUGljLT5zcGFyZVVuaXRGbGFnW2ldID0gTlVMTDsKLQotICAgICAgICAgICAgZm9yIChqID0gMCwgbWFwVW5pdENudCA9IDA7IG1hcFVuaXRDbnQgPCBwaWNTaXplSW5NYXBVbml0czsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAmcFNwYXJlUGljLT56ZXJvUnVuTGVuZ3RoW2ldW2pdKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICAgICAgbWFwVW5pdENudCArPSBwU3BhcmVQaWMtPnplcm9SdW5MZW5ndGhbaV1bal0gKyAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogc2V0IHJlc3QgdG8gbnVsbCAqLwotICAgIGZvciAoaSA9IHBTcGFyZVBpYy0+bnVtU3BhcmVQaWNzOyBpIDwgTUFYX05VTV9TUEFSRV9QSUNTOyBpKyspCi0gICAgewotICAgICAgICBwU3BhcmVQaWMtPnNwYXJlVW5pdEZsYWdbaV0gPSBOVUxMOwotICAgICAgICBwU3BhcmVQaWMtPnplcm9SdW5MZW5ndGhbaV0gPSBOVUxMOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlU2NlbmVJbmZvCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIElucHV0czoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgPCsrPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZVNjZW5lSW5mbygKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlTY2VuZUluZm9fdCAqcFNjZW5lSW5mbykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFNjZW5lSW5mbyk7Ci0KLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFNjZW5lSW5mby0+c2NlbmVJbmZvUHJlc2VudEZsYWcgPSB0bXAgPT0gMSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgaWYgKHBTY2VuZUluZm8tPnNjZW5lSW5mb1ByZXNlbnRGbGFnKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnBTY2VuZUluZm8tPnNjZW5lSWQpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgJnBTY2VuZUluZm8tPnNjZW5lVHJhbnNpdGlvblR5cGUpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICBpZiAocFNjZW5lSW5mby0+c2NlbmVUcmFuc2l0aW9uVHlwZSA+IDYpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAgICAgaWYgKHBTY2VuZUluZm8tPnNjZW5lVHJhbnNpdGlvblR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgICAgICZwU2NlbmVJbmZvLT5zZWNvbmRTY2VuZUlkKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZVN1YlNlcUluZm8KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICA8Kys+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBEZWNvZGVTdWJTZXFJbmZvKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaVN1YlNlcUluZm9fdCAqcFN1YlNlcUluZm8pCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBTdWJTZXFJbmZvKTsKLQotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgJnBTdWJTZXFJbmZvLT5zdWJTZXFMYXllck51bSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIGlmIChwU3ViU2VxSW5mby0+c3ViU2VxTGF5ZXJOdW0gPiAyNTUpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZwU3ViU2VxSW5mby0+c3ViU2VxSWQpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBpZiAocFN1YlNlcUluZm8tPnN1YlNlcUlkID4gNjU1MzUpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFN1YlNlcUluZm8tPmZpcnN0UmVmUGljRmxhZyA9IHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBTdWJTZXFJbmZvLT5sZWFkaW5nTm9uUmVmUGljRmxhZyA9IHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBTdWJTZXFJbmZvLT5sYXN0UGljRmxhZyA9IHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBTdWJTZXFJbmZvLT5zdWJTZXFGcmFtZU51bUZsYWcgPSB0bXAgPT0gMSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgaWYgKHBTdWJTZXFJbmZvLT5zdWJTZXFGcmFtZU51bUZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICAgJnBTdWJTZXFJbmZvLT5zdWJTZXFGcmFtZU51bSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgPCsrPgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgPCsrPgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIDwrKz4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBEZWNvZGVTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcygKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljc190ICpwU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgaTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcyk7Ci0KLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAmcFN1YlNlcUxheWVyQ2hhcmFjdGVyaXN0aWNzLT5udW1TdWJTZXFMYXllcnMpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBwU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MtPm51bVN1YlNlcUxheWVycysrOwotICAgIGlmIChwU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MtPm51bVN1YlNlcUxheWVycyA+IE1BWF9OVU1fU1VCX1NFUV9MQVlFUlMpCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBwU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MtPm51bVN1YlNlcUxheWVyczsgaSsrKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MtPmFjY3VyYXRlU3RhdGlzdGljc0ZsYWdbaV0gPQotICAgICAgICAgICAgdG1wID09IDEgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDE2KTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3MtPmF2ZXJhZ2VCaXRSYXRlW2ldID0gdG1wOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMTYpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljcy0+YXZlcmFnZUZyYW1lUmF0ZVtpXSA9IHRtcDsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZVN1YlNlcUNoYXJhY3RlcmlzdGljcwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgPCsrPgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgPCsrPgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIDwrKz4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBEZWNvZGVTdWJTZXFDaGFyYWN0ZXJpc3RpY3MoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpU3ViU2VxQ2hhcmFjdGVyaXN0aWNzX3QgKnBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgaTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MpOwotCi0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgJnBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPnN1YlNlcUxheWVyTnVtKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgaWYgKHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPnN1YlNlcUxheWVyTnVtID4gTUFYX05VTV9TVUJfU0VRX0xBWUVSUy0xKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAmcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+c3ViU2VxSWQpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBpZiAocFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+c3ViU2VxSWQgPiA2NTUzNSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5kdXJhdGlvbkZsYWcgPSB0bXAgPT0gMSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICBpZiAocFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+ZHVyYXRpb25GbGFnKQotICAgIHsKLSAgICAgICAgcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+c3ViU2VxRHVyYXRpb24gPSBoMjY0YnNkU2hvd0JpdHMzMihwU3RybURhdGEpOwotICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsMzIpID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5hdmVyYWdlUmF0ZUZsYWcgPSB0bXAgPT0gMSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICBpZiAocFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+YXZlcmFnZVJhdGVGbGFnKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5hY2N1cmF0ZVN0YXRpc3RpY3NGbGFnID0KLSAgICAgICAgICAgIHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxNik7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+YXZlcmFnZUJpdFJhdGUgPSB0bXA7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxNik7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+YXZlcmFnZUZyYW1lUmF0ZSA9IHRtcDsKLSAgICB9Ci0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgJnBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPm51bVJlZmVyZW5jZWRTdWJzZXFzKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgaWYgKHBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPm51bVJlZmVyZW5jZWRTdWJzZXFzID4gTUFYX05VTV9TVUJfU0VRX0xBWUVSUy0xKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcFN1YlNlcUNoYXJhY3RlcmlzdGljcy0+bnVtUmVmZXJlbmNlZFN1YnNlcXM7IGkrKykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgJnBTdWJTZXFDaGFyYWN0ZXJpc3RpY3MtPnJlZlN1YlNlcUxheWVyTnVtW2ldKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICZwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5yZWZTdWJTZXFJZFtpXSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwU3ViU2VxQ2hhcmFjdGVyaXN0aWNzLT5yZWZTdWJTZXFEaXJlY3Rpb25baV0gPSB0bXA7Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVGdWxsRnJhbWVGcmVlemUKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICA8Kys+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlRnVsbEZyYW1lRnJlZXplKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlaUZ1bGxGcmFtZUZyZWV6ZV90ICpwRnVsbEZyYW1lRnJlZXplKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwRnVsbEZyYW1lRnJlZXplKTsKLQotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICZwRnVsbEZyYW1lRnJlZXplLT5mdWxsRnJhbWVGcmVlemVSZXBldGl0aW9uUGVyaW9kKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgaWYgKHBGdWxsRnJhbWVGcmVlemUtPmZ1bGxGcmFtZUZyZWV6ZVJlcGV0aXRpb25QZXJpb2QgPiAxNjM4NCkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVGdWxsRnJhbWVTbmFwc2hvdAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgPCsrPgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgPCsrPgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIDwrKz4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBEZWNvZGVGdWxsRnJhbWVTbmFwc2hvdCgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlGdWxsRnJhbWVTbmFwc2hvdF90ICpwRnVsbEZyYW1lU25hcHNob3QpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBGdWxsRnJhbWVTbmFwc2hvdCk7Ci0KLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICZwRnVsbEZyYW1lU25hcHNob3QtPnNuYXBTaG90SWQpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIElucHV0czoKLSAgICAgICAgICA8Kys+Ci0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgPCsrPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydCgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnRfdCAqcFByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydCk7Ci0KLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAmcFByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydC0+cHJvZ3Jlc3NpdmVSZWZpbmVtZW50SWQpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAmcFByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydC0+bnVtUmVmaW5lbWVudFN0ZXBzKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgcFByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRTdGFydC0+bnVtUmVmaW5lbWVudFN0ZXBzKys7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgIDwrKz4KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICA8Kys+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgRGVjb2RlUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZCgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZWlQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kX3QgKnBQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudEVuZCk7Ci0KLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAmcFByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmQtPnByb2dyZXNzaXZlUmVmaW5lbWVudElkKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZU1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgPCsrPgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgPCsrPgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIDwrKz4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBEZWNvZGVNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0X3QgKnBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQsCi0gIHUzMiBudW1TbGljZUdyb3VwcykKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLGk7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0KTsKLSAgICBBU1NFUlQobnVtU2xpY2VHcm91cHMgPCBNQVhfTlVNX1NMSUNFX0dST1VQUyk7Ci0KLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAmcE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldC0+bnVtU2xpY2VHcm91cHNJblNldCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIHBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQtPm51bVNsaWNlR3JvdXBzSW5TZXQrKzsKLSAgICBpZiAocE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldC0+bnVtU2xpY2VHcm91cHNJblNldCA+IG51bVNsaWNlR3JvdXBzKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldC0+bnVtU2xpY2VHcm91cHNJblNldDsgaSsrKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLAotICAgICAgICAgICAgY2VpbExvZzJOdW1TbGljZUdyb3Vwc1tudW1TbGljZUdyb3Vwc10pOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQtPnNsaWNlR3JvdXBJZFtpXSA9IHRtcDsKLSAgICAgICAgaWYgKHBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQtPnNsaWNlR3JvdXBJZFtpXSA+Ci0gICAgICAgICAgcE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldC0+bnVtU2xpY2VHcm91cHNJblNldC0xKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcE1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldC0+ZXhhY3RTYW1wbGVWYWx1ZU1hdGNoRmxhZyA9Ci0gICAgICAgIHRtcCA9PSAxID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXQtPnBhblNjYW5SZWN0RmxhZyA9IHRtcCA9PSAxID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIGlmIChwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5wYW5TY2FuUmVjdEZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICZwTW90aW9uQ29uc3RyYWluZWRTbGljZUdyb3VwU2V0LT5wYW5TY2FuUmVjdElkKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZVJlc2VydmVkU2VpTWVzc2FnZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgPCsrPgotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgPCsrPgotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgIDwrKz4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBEZWNvZGVSZXNlcnZlZFNlaU1lc3NhZ2UoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VpUmVzZXJ2ZWRTZWlNZXNzYWdlX3QgKnBSZXNlcnZlZFNlaU1lc3NhZ2UsCi0gIHUzMiBwYXlsb2FkU2l6ZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSwgdG1wOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFJlc2VydmVkU2VpTWVzc2FnZSk7Ci0KLQotICAgIC8qIHdoZXJlIGNvcnJlc3BvbmRpbmcgRlJFRSgpID8/PyAqLwotICAgIEFMTE9DQVRFKHBSZXNlcnZlZFNlaU1lc3NhZ2UtPnJlc2VydmVkU2VpTWVzc2FnZVBheWxvYWRCeXRlLHBheWxvYWRTaXplLHU4KTsKLSAgICBpZiAocFJlc2VydmVkU2VpTWVzc2FnZS0+cmVzZXJ2ZWRTZWlNZXNzYWdlUGF5bG9hZEJ5dGUgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKLQotICAgIHBSZXNlcnZlZFNlaU1lc3NhZ2UtPm51bVBheWxvYWRCeXRlcyA9IHBheWxvYWRTaXplOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHBheWxvYWRTaXplOyBpKyspCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsOCk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFJlc2VydmVkU2VpTWVzc2FnZS0+cmVzZXJ2ZWRTZWlNZXNzYWdlUGF5bG9hZEJ5dGVbaV0gPSAodTgpdG1wOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZWkuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZWkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZlNTQzYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19TRUlfSAotI2RlZmluZSBIMjY0U1dERUNfU0VJX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9oZWFkZXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3Z1aS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIE1BWF9QQU5fU0NBTl9DTlQgMzIKLSNkZWZpbmUgTUFYX05VTV9TUEFSRV9QSUNTIDE2Ci0jZGVmaW5lIE1BWF9OVU1fQ0xPQ0tfVFMgMwotI2RlZmluZSBNQVhfTlVNX1NVQl9TRVFfTEFZRVJTIDI1NgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIHNlcVBhcmFtZXRlclNldElkOwotICAgIHUzMiBpbml0aWFsQ3BiUmVtb3ZhbERlbGF5W01BWF9DUEJfQ05UXTsKLSAgICB1MzIgaW5pdGlhbENwYlJlbW92YWxEZWxheU9mZnNldFtNQVhfQ1BCX0NOVF07Ci19IHNlaUJ1ZmZlcmluZ1BlcmlvZF90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBjcGJSZW1vdmFsRGVsYXk7Ci0gICAgdTMyIGRwYk91dHB1dERlbGF5OwotICAgIHUzMiBwaWNTdHJ1Y3Q7Ci0gICAgdTMyIGNsb2NrVGltZVN0YW1wRmxhZ1tNQVhfTlVNX0NMT0NLX1RTXTsKLSAgICB1MzIgY2xvY2tUaW1lU3RhbXBbTUFYX05VTV9DTE9DS19UU107Ci0gICAgdTMyIGN0VHlwZVtNQVhfTlVNX0NMT0NLX1RTXTsKLSAgICB1MzIgbnVpdEZpZWxkQmFzZWRGbGFnW01BWF9OVU1fQ0xPQ0tfVFNdOwotICAgIHUzMiBjb3VudGluZ1R5cGVbTUFYX05VTV9DTE9DS19UU107Ci0gICAgdTMyIGZ1bGxUaW1lU3RhbXBGbGFnW01BWF9OVU1fQ0xPQ0tfVFNdOwotICAgIHUzMiBkaXNjb250aW51aXR5RmxhZ1tNQVhfTlVNX0NMT0NLX1RTXTsKLSAgICB1MzIgY250RHJvcHBlZEZsYWdbTUFYX05VTV9DTE9DS19UU107Ci0gICAgdTMyIG5GcmFtZXNbTUFYX05VTV9DTE9DS19UU107Ci0gICAgdTMyIHNlY29uZHNGbGFnW01BWF9OVU1fQ0xPQ0tfVFNdOwotICAgIHUzMiBzZWNvbmRzVmFsdWVbTUFYX05VTV9DTE9DS19UU107Ci0gICAgdTMyIG1pbnV0ZXNGbGFnW01BWF9OVU1fQ0xPQ0tfVFNdOwotICAgIHUzMiBtaW51dGVzVmFsdWVbTUFYX05VTV9DTE9DS19UU107Ci0gICAgdTMyIGhvdXJzRmxhZ1tNQVhfTlVNX0NMT0NLX1RTXTsKLSAgICB1MzIgaG91cnNWYWx1ZVtNQVhfTlVNX0NMT0NLX1RTXTsKLSAgICBpMzIgdGltZU9mZnNldFtNQVhfTlVNX0NMT0NLX1RTXTsKLX0gc2VpUGljVGltaW5nX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIHBhblNjYW5SZWN0SWQ7Ci0gICAgdTMyIHBhblNjYW5SZWN0Q2FuY2VsRmxhZzsKLSAgICB1MzIgcGFuU2NhbkNudDsKLSAgICBpMzIgcGFuU2NhblJlY3RMZWZ0T2Zmc2V0W01BWF9QQU5fU0NBTl9DTlRdOwotICAgIGkzMiBwYW5TY2FuUmVjdFJpZ2h0T2Zmc2V0W01BWF9QQU5fU0NBTl9DTlRdOwotICAgIGkzMiBwYW5TY2FuUmVjdFRvcE9mZnNldFtNQVhfUEFOX1NDQU5fQ05UXTsKLSAgICBpMzIgcGFuU2NhblJlY3RCb3R0b21PZmZzZXRbTUFYX1BBTl9TQ0FOX0NOVF07Ci0gICAgdTMyIHBhblNjYW5SZWN0UmVwZXRpdGlvblBlcmlvZDsKLX0gc2VpUGFuU2NhblJlY3RfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgaXR1VFQzNUNvdW50cnlDb2RlOwotICAgIHUzMiBpdHVUVDM1Q291bnRyeUNvZGVFeHRlbnNpb25CeXRlOwotICAgIHU4ICppdHVUVDM1UGF5bG9hZEJ5dGU7Ci0gICAgdTMyIG51bVBheWxvYWRCeXRlczsKLX0gc2VpVXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNV90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiB1dWlkSXNvSWVjMTE1NzhbNF07Ci0gICAgdTggKnVzZXJEYXRhUGF5bG9hZEJ5dGU7Ci0gICAgdTMyIG51bVBheWxvYWRCeXRlczsKLX0gc2VpVXNlckRhdGFVbnJlZ2lzdGVyZWRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgcmVjb3ZlcnlGcmFtZUNudDsKLSAgICB1MzIgZXhhY3RNYXRjaEZsYWc7Ci0gICAgdTMyIGJyb2tlbkxpbmtGbGFnOwotICAgIHUzMiBjaGFuZ2luZ1NsaWNlR3JvdXBJZGM7Ci19IHNlaVJlY292ZXJ5UG9pbnRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgb3JpZ2luYWxJZHJGbGFnOwotICAgIHUzMiBvcmlnaW5hbEZyYW1lTnVtOwotICAgIGRlY1JlZlBpY01hcmtpbmdfdCBkZWNSZWZQaWNNYXJraW5nOwotfSBzZWlEZWNSZWZQaWNNYXJraW5nUmVwZXRpdGlvbl90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiB0YXJnZXRGcmFtZU51bTsKLSAgICB1MzIgc3BhcmVGaWVsZEZsYWc7Ci0gICAgdTMyIHRhcmdldEJvdHRvbUZpZWxkRmxhZzsKLSAgICB1MzIgbnVtU3BhcmVQaWNzOwotICAgIHUzMiBkZWx0YVNwYXJlRnJhbWVOdW1bTUFYX05VTV9TUEFSRV9QSUNTXTsKLSAgICB1MzIgc3BhcmVCb3R0b21GaWVsZEZsYWdbTUFYX05VTV9TUEFSRV9QSUNTXTsKLSAgICB1MzIgc3BhcmVBcmVhSWRjW01BWF9OVU1fU1BBUkVfUElDU107Ci0gICAgdTMyICpzcGFyZVVuaXRGbGFnW01BWF9OVU1fU1BBUkVfUElDU107Ci0gICAgdTMyICp6ZXJvUnVuTGVuZ3RoW01BWF9OVU1fU1BBUkVfUElDU107Ci19IHNlaVNwYXJlUGljX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIHNjZW5lSW5mb1ByZXNlbnRGbGFnOwotICAgIHUzMiBzY2VuZUlkOwotICAgIHUzMiBzY2VuZVRyYW5zaXRpb25UeXBlOwotICAgIHUzMiBzZWNvbmRTY2VuZUlkOwotfSBzZWlTY2VuZUluZm9fdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgc3ViU2VxTGF5ZXJOdW07Ci0gICAgdTMyIHN1YlNlcUlkOwotICAgIHUzMiBmaXJzdFJlZlBpY0ZsYWc7Ci0gICAgdTMyIGxlYWRpbmdOb25SZWZQaWNGbGFnOwotICAgIHUzMiBsYXN0UGljRmxhZzsKLSAgICB1MzIgc3ViU2VxRnJhbWVOdW1GbGFnOwotICAgIHUzMiBzdWJTZXFGcmFtZU51bTsKLX0gc2VpU3ViU2VxSW5mb190OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBudW1TdWJTZXFMYXllcnM7Ci0gICAgdTMyIGFjY3VyYXRlU3RhdGlzdGljc0ZsYWdbTUFYX05VTV9TVUJfU0VRX0xBWUVSU107Ci0gICAgdTMyIGF2ZXJhZ2VCaXRSYXRlW01BWF9OVU1fU1VCX1NFUV9MQVlFUlNdOwotICAgIHUzMiBhdmVyYWdlRnJhbWVSYXRlW01BWF9OVU1fU1VCX1NFUV9MQVlFUlNdOwotfSBzZWlTdWJTZXFMYXllckNoYXJhY3RlcmlzdGljc190OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBzdWJTZXFMYXllck51bTsKLSAgICB1MzIgc3ViU2VxSWQ7Ci0gICAgdTMyIGR1cmF0aW9uRmxhZzsKLSAgICB1MzIgc3ViU2VxRHVyYXRpb247Ci0gICAgdTMyIGF2ZXJhZ2VSYXRlRmxhZzsKLSAgICB1MzIgYWNjdXJhdGVTdGF0aXN0aWNzRmxhZzsKLSAgICB1MzIgYXZlcmFnZUJpdFJhdGU7Ci0gICAgdTMyIGF2ZXJhZ2VGcmFtZVJhdGU7Ci0gICAgdTMyIG51bVJlZmVyZW5jZWRTdWJzZXFzOwotICAgIHUzMiByZWZTdWJTZXFMYXllck51bVtNQVhfTlVNX1NVQl9TRVFfTEFZRVJTXTsKLSAgICB1MzIgcmVmU3ViU2VxSWRbTUFYX05VTV9TVUJfU0VRX0xBWUVSU107Ci0gICAgdTMyIHJlZlN1YlNlcURpcmVjdGlvbltNQVhfTlVNX1NVQl9TRVFfTEFZRVJTXTsKLX0gc2VpU3ViU2VxQ2hhcmFjdGVyaXN0aWNzX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIGZ1bGxGcmFtZUZyZWV6ZVJlcGV0aXRpb25QZXJpb2Q7Ci19IHNlaUZ1bGxGcmFtZUZyZWV6ZV90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBzbmFwU2hvdElkOwotfSBzZWlGdWxsRnJhbWVTbmFwc2hvdF90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBwcm9ncmVzc2l2ZVJlZmluZW1lbnRJZDsKLSAgICB1MzIgbnVtUmVmaW5lbWVudFN0ZXBzOwotfSBzZWlQcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50U3RhcnRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgcHJvZ3Jlc3NpdmVSZWZpbmVtZW50SWQ7Ci19IHNlaVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgbnVtU2xpY2VHcm91cHNJblNldDsKLSAgICB1MzIgc2xpY2VHcm91cElkW01BWF9OVU1fU0xJQ0VfR1JPVVBTXTsKLSAgICB1MzIgZXhhY3RTYW1wbGVWYWx1ZU1hdGNoRmxhZzsKLSAgICB1MzIgcGFuU2NhblJlY3RGbGFnOwotICAgIHUzMiBwYW5TY2FuUmVjdElkOwotfSBzZWlNb3Rpb25Db25zdHJhaW5lZFNsaWNlR3JvdXBTZXRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1OCAqcmVzZXJ2ZWRTZWlNZXNzYWdlUGF5bG9hZEJ5dGU7Ci0gICAgdTMyIG51bVBheWxvYWRCeXRlczsKLX0gc2VpUmVzZXJ2ZWRTZWlNZXNzYWdlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIHBheWxvYWRUeXBlOwotICAgIHNlaUJ1ZmZlcmluZ1BlcmlvZF90IGJ1ZmZlcmluZ1BlcmlvZDsKLSAgICBzZWlQaWNUaW1pbmdfdCBwaWNUaW1pbmc7Ci0gICAgc2VpUGFuU2NhblJlY3RfdCBwYW5TY2FuUmVjdDsKLSAgICBzZWlVc2VyRGF0YVJlZ2lzdGVyZWRJdHVUVDM1X3QgdXNlckRhdGFSZWdpc3RlcmVkSXR1VFQzNTsKLSAgICBzZWlVc2VyRGF0YVVucmVnaXN0ZXJlZF90IHVzZXJEYXRhVW5yZWdpc3RlcmVkOwotICAgIHNlaVJlY292ZXJ5UG9pbnRfdCByZWNvdmVyeVBvaW50OwotICAgIHNlaURlY1JlZlBpY01hcmtpbmdSZXBldGl0aW9uX3QgZGVjUmVmUGljTWFya2luZ1JlcGV0aXRpb247Ci0gICAgc2VpU3BhcmVQaWNfdCBzcGFyZVBpYzsKLSAgICBzZWlTY2VuZUluZm9fdCBzY2VuZUluZm87Ci0gICAgc2VpU3ViU2VxSW5mb190IHN1YlNlcUluZm87Ci0gICAgc2VpU3ViU2VxTGF5ZXJDaGFyYWN0ZXJpc3RpY3NfdCBzdWJTZXFMYXllckNoYXJhY3RlcmlzdGljczsKLSAgICBzZWlTdWJTZXFDaGFyYWN0ZXJpc3RpY3NfdCBzdWJTZXFDaGFyYWN0ZXJpc3RpY3M7Ci0gICAgc2VpRnVsbEZyYW1lRnJlZXplX3QgZnVsbEZyYW1lRnJlZXplOwotICAgIHNlaUZ1bGxGcmFtZVNuYXBzaG90X3QgZnVsbEZyYW1lU25hcHNob3Q7Ci0gICAgc2VpUHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0X3QgcHJvZ3Jlc3NpdmVSZWZpbmVtZW50U2VnbWVudFN0YXJ0OwotICAgIHNlaVByb2dyZXNzaXZlUmVmaW5lbWVudFNlZ21lbnRFbmRfdCBwcm9ncmVzc2l2ZVJlZmluZW1lbnRTZWdtZW50RW5kOwotICAgIHNlaU1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldF90IG1vdGlvbkNvbnN0cmFpbmVkU2xpY2VHcm91cFNldDsKLSAgICBzZWlSZXNlcnZlZFNlaU1lc3NhZ2VfdCByZXNlcnZlZFNlaU1lc3NhZ2U7Ci19IHNlaU1lc3NhZ2VfdDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZVNlaU1lc3NhZ2UoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0LAotICBzZWlNZXNzYWdlX3QgKnBTZWlNZXNzYWdlLAotICB1MzIgbnVtU2xpY2VHcm91cHMpOwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19TRUlfSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VxX3BhcmFtX3NldC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NlcV9wYXJhbV9zZXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxMDUxYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VxX3BhcmFtX3NldC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBoMjY0YnNkRGVjb2RlU2VxUGFyYW1TZXQKLSAgICAgICAgICBHZXREcGJTaXplCi0gICAgICAgICAgaDI2NGJzZENvbXBhcmVTZXFQYXJhbVNldHMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJoMjY0YnNkX3NlcV9wYXJhbV9zZXQuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3ZsYy5oIgotI2luY2x1ZGUgImgyNjRic2RfdnVpLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9jZmcuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogZW51bWVyYXRpb24gdG8gaW5kaWNhdGUgaW52YWxpZCByZXR1cm4gdmFsdWUgZnJvbSB0aGUgR2V0RHBiU2l6ZSBmdW5jdGlvbiAqLwotZW51bSB7SU5WQUxJRF9EUEJfU0laRSA9IDB4N0ZGRkZGRkZ9OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgR2V0RHBiU2l6ZSh1MzIgcGljU2l6ZUluTWJzLCB1MzIgbGV2ZWxJZGMpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb24gbmFtZTogaDI2NGJzZERlY29kZVNlcVBhcmFtU2V0Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIERlY29kZSBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IGluZm9ybWF0aW9uIGZyb20gdGhlIHN0cmVhbS4KLQotICAgICAgICAgICAgRnVuY3Rpb24gYWxsb2NhdGVzIG1lbW9yeSBmb3Igb2Zmc2V0Rm9yUmVmRnJhbWUgYXJyYXkgaWYKLSAgICAgICAgICAgIHBpY3R1cmUgb3JkZXIgY291bnQgdHlwZSBpcyAxIGFuZCBudW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGUKLSAgICAgICAgICAgIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBwU2VxUGFyYW1TZXQgICAgZGVjb2RlZCBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGZhaWx1cmUsIGludmFsaWQgaW5mb3JtYXRpb24gb3IgZW5kIG9mIHN0cmVhbQotICAgICAgICAgICAgTUVNT1JZX0FMTE9DQVRJT05fRVJST1IgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVTZXFQYXJhbVNldChzdHJtRGF0YV90ICpwU3RybURhdGEsIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCBpLCB2YWx1ZTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBTZXFQYXJhbVNldCk7Ci0KLSAgICBIMjY0U3dEZWNNZW1zZXQocFNlcVBhcmFtU2V0LCAwLCBzaXplb2Yoc2VxUGFyYW1TZXRfdCkpOwotCi0gICAgLyogcHJvZmlsZV9pZGMgKi8KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIGlmICh0bXAgIT0gNjYpCi0gICAgewotICAgICAgICBERUJVRygoIk5PVCBCQVNFTElORSBQUk9GSUxFICVkXG4iLCB0bXApKTsKLSAgICB9Ci0gICAgcFNlcVBhcmFtU2V0LT5wcm9maWxlSWRjID0gdG1wOwotCi0gICAgLyogY29uc3RyYWluZWRfc2V0MF9mbGFnICovCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAvKiBjb25zdHJhaW5lZF9zZXQxX2ZsYWcgKi8KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIC8qIGNvbnN0cmFpbmVkX3NldDJfZmxhZyAqLwotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0KLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIC8qIHJlc2VydmVkX3plcm9fNWJpdHMsIHZhbHVlcyBvZiB0aGVzZSBiaXRzIHNoYWxsIGJlIGlnbm9yZWQgKi8KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDUpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwU2VxUGFyYW1TZXQtPmxldmVsSWRjID0gdG1wOwotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgJnBTZXFQYXJhbVNldC0+c2VxUGFyYW1ldGVyU2V0SWQpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBpZiAocFNlcVBhcmFtU2V0LT5zZXFQYXJhbWV0ZXJTZXRJZCA+PSBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTKQotICAgIHsKLSAgICAgICAgRVBSSU5UKCJzZXFfcGFyYW1fc2V0X2lkIik7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICAvKiBsb2cyX21heF9mcmFtZV9udW1fbWludXM0ICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgaWYgKHZhbHVlID4gMTIpCi0gICAgewotICAgICAgICBFUFJJTlQoImxvZzJfbWF4X2ZyYW1lX251bV9taW51czQiKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLSAgICAvKiBtYXhGcmFtZU51bSA9IDJeKGxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgKyA0KSAqLwotICAgIHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0gPSAxIDw8ICh2YWx1ZSs0KTsKLQotICAgIC8qIHZhbGlkIFBPQyB0eXBlcyBhcmUgMCwgMSBhbmQgMiAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIGlmICh2YWx1ZSA+IDIpCi0gICAgewotICAgICAgICBFUFJJTlQoInBpY19vcmRlcl9jbnRfdHlwZSIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotICAgIHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID0gdmFsdWU7Ci0KLSAgICBpZiAocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPT0gMCkKLSAgICB7Ci0gICAgICAgIC8qIGxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCAqLwotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICBpZiAodmFsdWUgPiAxMikKLSAgICAgICAgewotICAgICAgICAgICAgRVBSSU5UKCJsb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQiKTsKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotICAgICAgICAvKiBtYXhQaWNPcmRlckNudExzYiA9IDJeKGxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCArIDQpICovCi0gICAgICAgIHBTZXFQYXJhbVNldC0+bWF4UGljT3JkZXJDbnRMc2IgPSAxIDw8ICh2YWx1ZSs0KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPT0gMSkKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFNlcVBhcmFtU2V0LT5kZWx0YVBpY09yZGVyQWx3YXlzWmVyb0ZsYWcgPSAodG1wID09IDEpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICZwU2VxUGFyYW1TZXQtPm9mZnNldEZvck5vblJlZlBpYyk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgICAmcFNlcVBhcmFtU2V0LT5vZmZzZXRGb3JUb3BUb0JvdHRvbUZpZWxkKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICAgJnBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgaWYgKHBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlID4gMjU1KQotICAgICAgICB7Ci0gICAgICAgICAgICBFUFJJTlQoIm51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUiKTsKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogTk9URTogVGhpcyBoYXMgdG8gYmUgZnJlZWQgc29tZXdoZXJlISAqLwotICAgICAgICAgICAgQUxMT0NBVEUocFNlcVBhcmFtU2V0LT5vZmZzZXRGb3JSZWZGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlLCBpMzIpOwotICAgICAgICAgICAgaWYgKHBTZXFQYXJhbVNldC0+b2Zmc2V0Rm9yUmVmRnJhbWUgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXNJblBpY09yZGVyQ250Q3ljbGU7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXAgPSAgaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+b2Zmc2V0Rm9yUmVmRnJhbWUgKyBpKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwU2VxUGFyYW1TZXQtPm9mZnNldEZvclJlZkZyYW1lID0gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICZwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lcyk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIGlmIChwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lcyA+IE1BWF9OVU1fUkVGX1BJQ1MpCi0gICAgewotICAgICAgICBFUFJJTlQoIm51bV9yZWZfZnJhbWVzIik7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBTZXFQYXJhbVNldC0+Z2Fwc0luRnJhbWVOdW1WYWx1ZUFsbG93ZWRGbGFnID0gKHRtcCA9PSAxKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBwU2VxUGFyYW1TZXQtPnBpY1dpZHRoSW5NYnMgPSB2YWx1ZSArIDE7Ci0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBwU2VxUGFyYW1TZXQtPnBpY0hlaWdodEluTWJzID0gdmFsdWUgKyAxOwotCi0gICAgLyogZnJhbWVfbWJzX29ubHlfZmxhZywgc2hhbGwgYmUgMSBmb3IgYmFzZWxpbmUgcHJvZmlsZSAqLwotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgaWYgKCF0bXApCi0gICAgewotICAgICAgICBFUFJJTlQoImZyYW1lX21ic19vbmx5X2ZsYWciKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIC8qIGRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcgKi8KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwU2VxUGFyYW1TZXQtPmZyYW1lQ3JvcHBpbmdGbGFnID0gKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgaWYgKHBTZXFQYXJhbVNldC0+ZnJhbWVDcm9wcGluZ0ZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICAgJnBTZXFQYXJhbVNldC0+ZnJhbWVDcm9wTGVmdE9mZnNldCk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgICAmcFNlcVBhcmFtU2V0LT5mcmFtZUNyb3BSaWdodE9mZnNldCk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgICAmcFNlcVBhcmFtU2V0LT5mcmFtZUNyb3BUb3BPZmZzZXQpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICAgJnBTZXFQYXJhbVNldC0+ZnJhbWVDcm9wQm90dG9tT2Zmc2V0KTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLQotICAgICAgICAvKiBjaGVjayB0aGF0IGZyYW1lIGNyb3BwaW5nIHBhcmFtcyBhcmUgdmFsaWQsIHBhcmFtZXRlcnMgc2hhbGwKLSAgICAgICAgICogc3BlY2lmeSBub24tbmVnYXRpdmUgYXJlYSB3aXRoaW4gdGhlIG9yaWdpbmFsIHBpY3R1cmUgKi8KLSAgICAgICAgaWYgKCAoIChpMzIpcFNlcVBhcmFtU2V0LT5mcmFtZUNyb3BMZWZ0T2Zmc2V0ID4KLSAgICAgICAgICAgICAgICggOCAqIChpMzIpcFNlcVBhcmFtU2V0LT5waWNXaWR0aEluTWJzIC0KLSAgICAgICAgICAgICAgICAgKChpMzIpcFNlcVBhcmFtU2V0LT5mcmFtZUNyb3BSaWdodE9mZnNldCArIDEpICkgKSB8fAotICAgICAgICAgICAgICggKGkzMilwU2VxUGFyYW1TZXQtPmZyYW1lQ3JvcFRvcE9mZnNldCA+Ci0gICAgICAgICAgICAgICAoIDggKiAoaTMyKXBTZXFQYXJhbVNldC0+cGljSGVpZ2h0SW5NYnMgLQotICAgICAgICAgICAgICAgICAoKGkzMilwU2VxUGFyYW1TZXQtPmZyYW1lQ3JvcEJvdHRvbU9mZnNldCArIDEpICkgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVQUklOVCgiZnJhbWVfY3JvcHBpbmciKTsKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIGNoZWNrIHRoYXQgaW1hZ2UgZGltZW5zaW9ucyBhbmQgbGV2ZWxJZGMgbWF0Y2ggKi8KLSAgICB0bXAgPSBwU2VxUGFyYW1TZXQtPnBpY1dpZHRoSW5NYnMgKiBwU2VxUGFyYW1TZXQtPnBpY0hlaWdodEluTWJzOwotICAgIHZhbHVlID0gR2V0RHBiU2l6ZSh0bXAsIHBTZXFQYXJhbVNldC0+bGV2ZWxJZGMpOwotICAgIGlmICh2YWx1ZSA9PSBJTlZBTElEX0RQQl9TSVpFIHx8IHBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzID4gdmFsdWUpCi0gICAgewotICAgICAgICBERUJVRygoIldBUk5JTkchIEludmFsaWQgRFBCIHNpemUgYmFzZWQgb24gU1BTIExldmVsIVxuIikpOwotICAgICAgICBERUJVRygoIldBUk5JTkchIFVzaW5nIG51bV9yZWZfZnJhbWVzID0lZCBmb3IgRFBCIHNpemUhXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXMpKTsKLSAgICAgICAgdmFsdWUgPSBwU2VxUGFyYW1TZXQtPm51bVJlZkZyYW1lczsKLSAgICB9Ci0gICAgcFNlcVBhcmFtU2V0LT5tYXhEcGJTaXplID0gdmFsdWU7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVyc1ByZXNlbnRGbGFnID0gKHRtcCA9PSAxKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgLyogVlVJICovCi0gICAgaWYgKHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVyc1ByZXNlbnRGbGFnKQotICAgIHsKLSAgICAgICAgQUxMT0NBVEUocFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLCAxLCB2dWlQYXJhbWV0ZXJzX3QpOwotICAgICAgICBpZiAocFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOwotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlVnVpUGFyYW1ldGVycyhwU3RybURhdGEsCi0gICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAvKiBjaGVjayBudW1SZW9yZGVyRnJhbWVzIGFuZCBtYXhEZWNGcmFtZUJ1ZmZlcmluZyAqLwotICAgICAgICBpZiAocFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT5iaXRzdHJlYW1SZXN0cmljdGlvbkZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPm51bVJlb3JkZXJGcmFtZXMgPgotICAgICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPnZ1aVBhcmFtZXRlcnMtPm1heERlY0ZyYW1lQnVmZmVyaW5nIHx8Ci0gICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT5tYXhEZWNGcmFtZUJ1ZmZlcmluZyA8Ci0gICAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+bnVtUmVmRnJhbWVzIHx8Ci0gICAgICAgICAgICAgICAgcFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzLT5tYXhEZWNGcmFtZUJ1ZmZlcmluZyA+Ci0gICAgICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+bWF4RHBiU2l6ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIHN0YW5kYXJkIHNheXMgdGhhdCAidGhlIHNlcXVlbmNlIHNoYWxsIG5vdCByZXF1aXJlIGEgRFBCIHdpdGgKLSAgICAgICAgICAgICAqIHNpemUgb2YgbW9yZSB0aGFuIG1heCgxLCBtYXhEZWNGcmFtZUJ1ZmZlcmluZykgKi8KLSAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+bWF4RHBiU2l6ZSA9Ci0gICAgICAgICAgICAgICAgTUFYKDEsIHBTZXFQYXJhbVNldC0+dnVpUGFyYW1ldGVycy0+bWF4RGVjRnJhbWVCdWZmZXJpbmcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdG1wID0gaDI2NGJzZFJic3BUcmFpbGluZ0JpdHMocFN0cm1EYXRhKTsKLQotICAgIC8qIGlnbm9yZSBwb3NzaWJsZSBlcnJvcnMgaW4gdHJhaWxpbmcgYml0cyBvZiBwYXJhbWV0ZXJzIHNldHMgKi8KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IEdldERwYlNpemUKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgR2V0IHNpemUgb2YgdGhlIERQQiBpbiBmcmFtZXMuIFNpemUgaXMgZGV0ZXJtaW5lZCBiYXNlZCBvbiB0aGUKLSAgICAgICAgICAgIHBpY3R1cmUgc2l6ZSBhbmQgTWF4RFBCIGZvciB0aGUgc3BlY2lmaWVkIGxldmVsLiBUaGVzZSBkZXRlcm1pbmUKLSAgICAgICAgICAgIGhvdyBtYW55IHBpY3R1cmVzIG1heSBmaXQgaW50byB0byB0aGUgYnVmZmVyLiBIb3dldmVyLCB0aGUgc2l6ZQotICAgICAgICAgICAgaXMgYWxzbyBsaW1pdGVkIHRvIGEgbWF4aW11bSBvZiAxNiBmcmFtZXMgYW5kIHRoZXJlZm9yZSBmdW5jdGlvbgotICAgICAgICAgICAgcmV0dXJucyB0aGUgbWluaW11bSBvZiB0aGUgZGV0ZXJtaW5lZCBzaXplIGFuZCAxNi4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwaWNTaXplSW5NYnMgICAgbnVtYmVyIG9mIG1hY3JvYmxvY2tzIGluIHRoZSBwaWN0dXJlCi0gICAgICAgICAgICBsZXZlbElkYyAgICAgICAgaW5kaWNhdGVzIHRoZSBsZXZlbAotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIHNpemUgb2YgdGhlIERQQiBpbiBmcmFtZXMKLSAgICAgICAgICAgIElOVkFMSURfRFBCX1NJWkUgd2hlbiBpbnZhbGlkIGxldmVsSWRjIHNwZWNpZmllZCBvciBwaWNTaXplSW5NYnMKLSAgICAgICAgICAgIGlzIGhpZ2hlciB0aGFuIHN1cHBvcnRlZCBieSB0aGUgbGV2ZWwgaW4gcXVlc3Rpb24KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIEdldERwYlNpemUodTMyIHBpY1NpemVJbk1icywgdTMyIGxldmVsSWRjKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXA7Ci0gICAgdTMyIG1heFBpY1NpemVJbk1iczsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBpY1NpemVJbk1icyk7Ci0KLSAgICAvKiB1c2UgdG1wIGFzIHRoZSBzaXplIG9mIHRoZSBEUEIgaW4gYnl0ZXMsIGNvbXB1dGVzIGFzIDEwMjQgKiBNYXhEUEIKLSAgICAgKiAoZnJvbSB0YWJsZSBBLTEgaW4gQW5uZXggQSkgKi8KLSAgICBzd2l0Y2ggKGxldmVsSWRjKQotICAgIHsKLSAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgIHRtcCA9IDE1MjA2NDsKLSAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDk5OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgIHRtcCA9IDM0NTYwMDsKLSAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDM5NjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICB0bXAgPSA5MTIzODQ7Ci0gICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSAzOTY7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgdG1wID0gOTEyMzg0OwotICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gMzk2OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyMDoKLSAgICAgICAgICAgIHRtcCA9IDkxMjM4NDsKLSAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDM5NjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMjE6Ci0gICAgICAgICAgICB0bXAgPSAxODI0NzY4OwotICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gNzkyOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyMjoKLSAgICAgICAgICAgIHRtcCA9IDMxMTA0MDA7Ci0gICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSAxNjIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAzMDoKLSAgICAgICAgICAgIHRtcCA9IDMxMTA0MDA7Ci0gICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSAxNjIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAzMToKLSAgICAgICAgICAgIHRtcCA9IDY5MTIwMDA7Ci0gICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSAzNjAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgIHRtcCA9IDc4NjQzMjA7Ci0gICAgICAgICAgICBtYXhQaWNTaXplSW5NYnMgPSA1MTIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA0MDoKLSAgICAgICAgICAgIHRtcCA9IDEyNTgyOTEyOwotICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gODE5MjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgNDE6Ci0gICAgICAgICAgICB0bXAgPSAxMjU4MjkxMjsKLSAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDgxOTI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDQyOgotICAgICAgICAgICAgdG1wID0gMzQ4MTYqMzg0OwotICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gODcwNDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgNTA6Ci0gICAgICAgICAgICAvKiBzdGFuZGFyZCBzYXlzIDQyMzAxNDQwIGhlcmUsIGJ1dCBjb3JyaWdlbmR1bSAiY29ycmVjdHMiIHRoaXMgdG8KLSAgICAgICAgICAgICAqIDQyMzkzNjAwICovCi0gICAgICAgICAgICB0bXAgPSA0MjM5MzYwMDsKLSAgICAgICAgICAgIG1heFBpY1NpemVJbk1icyA9IDIyMDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA1MToKLSAgICAgICAgICAgIHRtcCA9IDcwNzc4ODgwOwotICAgICAgICAgICAgbWF4UGljU2l6ZUluTWJzID0gMzY4NjQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuKElOVkFMSURfRFBCX1NJWkUpOwotICAgIH0KLQotICAgIC8qIHRoaXMgaXMgbm90ICJjb3JyZWN0IiByZXR1cm4gdmFsdWUhIEhvd2V2ZXIsIGl0IHJlc3VsdHMgaW4gZXJyb3IgaW4KLSAgICAgKiBkZWNvZGluZyBhbmQgdGhpcyB3YXMgZWFzaWVzdCBwbGFjZSB0byBjaGVjayBwaWN0dXJlIHNpemUgKi8KLSAgICBpZiAocGljU2l6ZUluTWJzID4gbWF4UGljU2l6ZUluTWJzKQotICAgICAgICByZXR1cm4oSU5WQUxJRF9EUEJfU0laRSk7Ci0KLSAgICB0bXAgLz0gKHBpY1NpemVJbk1icyozODQpOwotCi0gICAgcmV0dXJuKE1JTih0bXAsIDE2KSk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6IGgyNjRic2RDb21wYXJlU2VxUGFyYW1TZXRzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIENvbXBhcmUgdHdvIHNlcXVlbmNlIHBhcmFtZXRlciBzZXRzLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTcHMxICAgcG9pbnRlciB0byBhIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQKLSAgICAgICAgICAgIHBTcHMyICAgcG9pbnRlciB0byBhbm90aGVyIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgMCAgICAgICBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0cyBhcmUgZXF1YWwKLSAgICAgICAgICAgIDEgICAgICAgb3RoZXJ3aXNlCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkQ29tcGFyZVNlcVBhcmFtU2V0cyhzZXFQYXJhbVNldF90ICpwU3BzMSwgc2VxUGFyYW1TZXRfdCAqcFNwczIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGk7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3BzMSk7Ci0gICAgQVNTRVJUKHBTcHMyKTsKLQotICAgIC8qIGZpcnN0IGNvbXBhcmUgcGFyYW1ldGVycyB3aG9zZSBleGlzdGVuY2UgZG9lcyBub3QgZGVwZW5kIG9uIG90aGVyCi0gICAgICogcGFyYW1ldGVycyBhbmQgb25seSBjb21wYXJlIHRoZSByZXN0IG9mIHRoZSBwYXJhbXMgaWYgdGhlc2UgYXJlIGVxdWFsICovCi0gICAgaWYgKHBTcHMxLT5wcm9maWxlSWRjICAgICAgICA9PSBwU3BzMi0+cHJvZmlsZUlkYyAmJgotICAgICAgICBwU3BzMS0+bGV2ZWxJZGMgICAgICAgICAgPT0gcFNwczItPmxldmVsSWRjICYmCi0gICAgICAgIHBTcHMxLT5tYXhGcmFtZU51bSAgICAgICA9PSBwU3BzMi0+bWF4RnJhbWVOdW0gJiYKLSAgICAgICAgcFNwczEtPnBpY09yZGVyQ250VHlwZSAgID09IHBTcHMyLT5waWNPcmRlckNudFR5cGUgJiYKLSAgICAgICAgcFNwczEtPm51bVJlZkZyYW1lcyAgICAgID09IHBTcHMyLT5udW1SZWZGcmFtZXMgJiYKLSAgICAgICAgcFNwczEtPmdhcHNJbkZyYW1lTnVtVmFsdWVBbGxvd2VkRmxhZyA9PQotICAgICAgICAgICAgcFNwczItPmdhcHNJbkZyYW1lTnVtVmFsdWVBbGxvd2VkRmxhZyAmJgotICAgICAgICBwU3BzMS0+cGljV2lkdGhJbk1icyAgICAgPT0gcFNwczItPnBpY1dpZHRoSW5NYnMgJiYKLSAgICAgICAgcFNwczEtPnBpY0hlaWdodEluTWJzICAgID09IHBTcHMyLT5waWNIZWlnaHRJbk1icyAmJgotICAgICAgICBwU3BzMS0+ZnJhbWVDcm9wcGluZ0ZsYWcgPT0gcFNwczItPmZyYW1lQ3JvcHBpbmdGbGFnICYmCi0gICAgICAgIHBTcHMxLT52dWlQYXJhbWV0ZXJzUHJlc2VudEZsYWcgPT0gcFNwczItPnZ1aVBhcmFtZXRlcnNQcmVzZW50RmxhZykKLSAgICB7Ci0gICAgICAgIGlmIChwU3BzMS0+cGljT3JkZXJDbnRUeXBlID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwU3BzMS0+bWF4UGljT3JkZXJDbnRMc2IgIT0gcFNwczItPm1heFBpY09yZGVyQ250THNiKQotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBTcHMxLT5waWNPcmRlckNudFR5cGUgPT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBTcHMxLT5kZWx0YVBpY09yZGVyQWx3YXlzWmVyb0ZsYWcgIT0KLSAgICAgICAgICAgICAgICAgICAgcFNwczItPmRlbHRhUGljT3JkZXJBbHdheXNaZXJvRmxhZyB8fAotICAgICAgICAgICAgICAgIHBTcHMxLT5vZmZzZXRGb3JOb25SZWZQaWMgIT0gcFNwczItPm9mZnNldEZvck5vblJlZlBpYyB8fAotICAgICAgICAgICAgICAgIHBTcHMxLT5vZmZzZXRGb3JUb3BUb0JvdHRvbUZpZWxkICE9Ci0gICAgICAgICAgICAgICAgICAgIHBTcHMyLT5vZmZzZXRGb3JUb3BUb0JvdHRvbUZpZWxkIHx8Ci0gICAgICAgICAgICAgICAgcFNwczEtPm51bVJlZkZyYW1lc0luUGljT3JkZXJDbnRDeWNsZSAhPQotICAgICAgICAgICAgICAgICAgICBwU3BzMi0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwU3BzMS0+bnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIGlmIChwU3BzMS0+b2Zmc2V0Rm9yUmVmRnJhbWVbaV0gIT0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBTcHMyLT5vZmZzZXRGb3JSZWZGcmFtZVtpXSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocFNwczEtPmZyYW1lQ3JvcHBpbmdGbGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocFNwczEtPmZyYW1lQ3JvcExlZnRPZmZzZXQgICAhPSBwU3BzMi0+ZnJhbWVDcm9wTGVmdE9mZnNldCB8fAotICAgICAgICAgICAgICAgIHBTcHMxLT5mcmFtZUNyb3BSaWdodE9mZnNldCAgIT0gcFNwczItPmZyYW1lQ3JvcFJpZ2h0T2Zmc2V0IHx8Ci0gICAgICAgICAgICAgICAgcFNwczEtPmZyYW1lQ3JvcFRvcE9mZnNldCAgICAhPSBwU3BzMi0+ZnJhbWVDcm9wVG9wT2Zmc2V0IHx8Ci0gICAgICAgICAgICAgICAgcFNwczEtPmZyYW1lQ3JvcEJvdHRvbU9mZnNldCAhPSBwU3BzMi0+ZnJhbWVDcm9wQm90dG9tT2Zmc2V0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIDE7Ci19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2VxX3BhcmFtX3NldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMThkZjk0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX1NFUV9QQVJBTV9TRVRfSAotI2RlZmluZSBIMjY0U1dERUNfU0VRX1BBUkFNX1NFVF9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgotI2luY2x1ZGUgImgyNjRic2RfdnVpLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogc3RydWN0dXJlIHRvIHN0b3JlIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgaW5mb3JtYXRpb24gZGVjb2RlZCBmcm9tIHRoZQotICogc3RyZWFtICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBwcm9maWxlSWRjOwotICAgIHUzMiBsZXZlbElkYzsKLSAgICB1MzIgc2VxUGFyYW1ldGVyU2V0SWQ7Ci0gICAgdTMyIG1heEZyYW1lTnVtOwotICAgIHUzMiBwaWNPcmRlckNudFR5cGU7Ci0gICAgdTMyIG1heFBpY09yZGVyQ250THNiOwotICAgIHUzMiBkZWx0YVBpY09yZGVyQWx3YXlzWmVyb0ZsYWc7Ci0gICAgaTMyIG9mZnNldEZvck5vblJlZlBpYzsKLSAgICBpMzIgb2Zmc2V0Rm9yVG9wVG9Cb3R0b21GaWVsZDsKLSAgICB1MzIgbnVtUmVmRnJhbWVzSW5QaWNPcmRlckNudEN5Y2xlOwotICAgIGkzMiAqb2Zmc2V0Rm9yUmVmRnJhbWU7Ci0gICAgdTMyIG51bVJlZkZyYW1lczsKLSAgICB1MzIgZ2Fwc0luRnJhbWVOdW1WYWx1ZUFsbG93ZWRGbGFnOwotICAgIHUzMiBwaWNXaWR0aEluTWJzOwotICAgIHUzMiBwaWNIZWlnaHRJbk1iczsKLSAgICB1MzIgZnJhbWVDcm9wcGluZ0ZsYWc7Ci0gICAgdTMyIGZyYW1lQ3JvcExlZnRPZmZzZXQ7Ci0gICAgdTMyIGZyYW1lQ3JvcFJpZ2h0T2Zmc2V0OwotICAgIHUzMiBmcmFtZUNyb3BUb3BPZmZzZXQ7Ci0gICAgdTMyIGZyYW1lQ3JvcEJvdHRvbU9mZnNldDsKLSAgICB1MzIgdnVpUGFyYW1ldGVyc1ByZXNlbnRGbGFnOwotICAgIHZ1aVBhcmFtZXRlcnNfdCAqdnVpUGFyYW1ldGVyczsKLSAgICB1MzIgbWF4RHBiU2l6ZTsKLX0gc2VxUGFyYW1TZXRfdDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZVNlcVBhcmFtU2V0KHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQpOwotCi11MzIgaDI2NGJzZENvbXBhcmVTZXFQYXJhbVNldHMoc2VxUGFyYW1TZXRfdCAqcFNwczEsIHNlcVBhcmFtU2V0X3QgKnBTcHMyKTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfU0VRX1BBUkFNX1NFVF9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9kYXRhLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZGF0YS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjg4ZDRiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9kYXRhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIGgyNjRic2REZWNvZGVTbGljZURhdGEKLSAgICAgICAgICBTZXRNYlBhcmFtcwotICAgICAgICAgIGgyNjRic2RNYXJrU2xpY2VDb3JydXB0ZWQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2RhdGEuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3ZsYy5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB2b2lkIFNldE1iUGFyYW1zKG1iU3RvcmFnZV90ICpwTWIsIHNsaWNlSGVhZGVyX3QgKnBTbGljZSwgdTMyIHNsaWNlSWQsCi0gICAgaTMyIGNocm9tYVFwSW5kZXhPZmZzZXQpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICA1LjEgIEZ1bmN0aW9uIG5hbWU6IGgyNjRic2REZWNvZGVTbGljZURhdGEKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRGVjb2RlIG9uZSBzbGljZS4gRnVuY3Rpb24gZGVjb2RlcyBzdHJlYW0gZGF0YSwgaS5lLiBtYWNyb2Jsb2NrcwotICAgICAgICAgICAgYW5kIHBvc3NpYmxlIHNraXBfcnVuIGZpZWxkcy4gaDI2NGJzZERlY29kZU1hY3JvYmxvY2sgZnVuY3Rpb24gaXMKLSAgICAgICAgICAgIGNhbGxlZCB0byBoYW5kbGUgYWxsIG90aGVyIG1hY3JvYmxvY2sgcmVsYXRlZCBwcm9jZXNzaW5nLgotICAgICAgICAgICAgTWFjcm9ibG9jayB0byBzbGljZSBncm91cCBtYXBwaW5nIGlzIGNvbnNpZGVyZWQgd2hlbiBuZXh0Ci0gICAgICAgICAgICBtYWNyb2Jsb2NrIHRvIHByb2Nlc3MgaXMgZGV0ZXJtaW5lZCAoaDI2NGJzZE5leHRNYkFkZHJlc3MgZnVuY3Rpb24pCi0gICAgICAgICAgICBtYXAKLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCi0gICAgICAgICAgICBjdXJySW1hZ2UgICAgICAgcG9pbnRlciB0byBjdXJyZW50IHByb2Nlc3NlZCBwaWN0dXJlLCBuZWVkZWQgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cmEgcHJlZGljdGlvbiBvZiB0aGUgbWFjcm9ibG9ja3MKLSAgICAgICAgICAgIHBTbGljZUhlYWRlciAgICBwb2ludGVyIHRvIHNsaWNlIGhlYWRlciBvZiB0aGUgY3VycmVudCBzbGljZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBjdXJySW1hZ2UgICAgICAgcHJvY2Vzc2VkIG1hY3JvYmxvY2tzIGFyZSB3cml0dGVuIHRvIGN1cnJlbnQgaW1hZ2UKLSAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICBtYlN0b3JhZ2Ugc3RydWN0dXJlIG9mIGVhY2ggcHJvY2Vzc2VkIG1hY3JvYmxvY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB1cGRhdGVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlU2xpY2VEYXRhKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgc3RvcmFnZV90ICpwU3RvcmFnZSwKLSAgICBpbWFnZV90ICpjdXJySW1hZ2UsIHNsaWNlSGVhZGVyX3QgKnBTbGljZUhlYWRlcikKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1OCBtYkRhdGFbMzg0ICsgMTUgKyAzMl07Ci0gICAgdTggKmRhdGE7Ci0gICAgdTMyIHRtcDsKLSAgICB1MzIgc2tpcFJ1bjsKLSAgICB1MzIgcHJldlNraXBwZWQ7Ci0gICAgdTMyIGN1cnJNYkFkZHI7Ci0gICAgdTMyIG1vcmVNYnM7Ci0gICAgdTMyIG1iQ291bnQ7Ci0gICAgaTMyIHFwWTsKLSAgICBtYWNyb2Jsb2NrTGF5ZXJfdCAqbWJMYXllcjsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBTbGljZUhlYWRlcik7Ci0gICAgQVNTRVJUKHBTdG9yYWdlKTsKLSAgICBBU1NFUlQocFNsaWNlSGVhZGVyLT5maXJzdE1iSW5TbGljZSA8IHBTdG9yYWdlLT5waWNTaXplSW5NYnMpOwotCi0gICAgLyogZW5zdXJlIDE2LWJ5dGUgYWxpZ25tZW50ICovCi0gICAgZGF0YSA9ICh1OCopQUxJR04obWJEYXRhLCAxNik7Ci0KLSAgICBtYkxheWVyID0gcFN0b3JhZ2UtPm1iTGF5ZXI7Ci0KLSAgICBjdXJyTWJBZGRyID0gcFNsaWNlSGVhZGVyLT5maXJzdE1iSW5TbGljZTsKLSAgICBza2lwUnVuID0gMDsKLSAgICBwcmV2U2tpcHBlZCA9IEhBTlRST19GQUxTRTsKLQotICAgIC8qIGluY3JlbWVudCBzbGljZSBpbmRleCwgd2lsbCBiZSBvbmUgZm9yIGRlY29kaW5nIG9mIHRoZSBmaXJzdCBzbGljZSBvZgotICAgICAqIHRoZSBwaWN0dXJlICovCi0gICAgcFN0b3JhZ2UtPnNsaWNlLT5zbGljZUlkKys7Ci0KLSAgICAvKiBsYXN0TWJBZGRyIHN0b3JlcyBhZGRyZXNzIG9mIHRoZSBtYWNyb2Jsb2NrIHRoYXQgd2FzIGxhc3Qgc3VjY2Vzc2Z1bGx5Ci0gICAgICogZGVjb2RlZCwgbmVlZGVkIGZvciBlcnJvciBoYW5kbGluZyAqLwotICAgIHBTdG9yYWdlLT5zbGljZS0+bGFzdE1iQWRkciA9IDA7Ci0KLSAgICBtYkNvdW50ID0gMDsKLSAgICAvKiBpbml0aWFsIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgZm9yIHRoZSBzbGljZSBpcyBvYnRhaW5lZCBhcyB0aGUgc3VtIG9mCi0gICAgICogaW5pdGlhbCBRUCBmb3IgdGhlIHBpY3R1cmUgYW5kIHNsaWNlUXBEZWx0YSBmb3IgdGhlIGN1cnJlbnQgc2xpY2UgKi8KLSAgICBxcFkgPSAoaTMyKXBTdG9yYWdlLT5hY3RpdmVQcHMtPnBpY0luaXRRcCArIHBTbGljZUhlYWRlci0+c2xpY2VRcERlbHRhOwotICAgIGRvCi0gICAgewotICAgICAgICAvKiBwcmltYXJ5IHBpY3R1cmUgYW5kIGFscmVhZHkgZGVjb2RlZCBtYWNyb2Jsb2NrIC0+IGVycm9yICovCi0gICAgICAgIGlmICghcFNsaWNlSGVhZGVyLT5yZWR1bmRhbnRQaWNDbnQgJiYgcFN0b3JhZ2UtPm1iW2N1cnJNYkFkZHJdLmRlY29kZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVQUklOVCgiUHJpbWFyeSBhbmQgYWxyZWFkeSBkZWNvZGVkIik7Ci0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLQotICAgICAgICBTZXRNYlBhcmFtcyhwU3RvcmFnZS0+bWIgKyBjdXJyTWJBZGRyLCBwU2xpY2VIZWFkZXIsCi0gICAgICAgICAgICBwU3RvcmFnZS0+c2xpY2UtPnNsaWNlSWQsIHBTdG9yYWdlLT5hY3RpdmVQcHMtPmNocm9tYVFwSW5kZXhPZmZzZXQpOwotCi0gICAgICAgIGlmICghSVNfSV9TTElDRShwU2xpY2VIZWFkZXItPnNsaWNlVHlwZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghcHJldlNraXBwZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnNraXBSdW4pOwotICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgICAgICAvKiBza2lwX3J1biBzaGFsbCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gbnVtYmVyIG9mCi0gICAgICAgICAgICAgICAgICogbWFjcm9ibG9ja3MgbGVmdCAqLwotICAgICAgICAgICAgICAgIGlmIChza2lwUnVuID4gKHBTdG9yYWdlLT5waWNTaXplSW5NYnMgLSBjdXJyTWJBZGRyKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEVQUklOVCgic2tpcF9ydW4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc2tpcFJ1bikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHByZXZTa2lwcGVkID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIEgyNjRTd0RlY01lbXNldCgmbWJMYXllci0+bWJQcmVkLCAwLCBzaXplb2YobWJQcmVkX3QpKTsKLSAgICAgICAgICAgICAgICAgICAgLyogbWFyayBjdXJyZW50IG1hY3JvYmxvY2sgc2tpcHBlZCAqLwotICAgICAgICAgICAgICAgICAgICBtYkxheWVyLT5tYlR5cGUgPSBQX1NraXA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNraXBSdW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIERFQlVHKCgiU2tpcHBpbmcgbWFjcm9ibG9jayAlZFxuIiwgY3Vyck1iQWRkcikpOwotICAgICAgICAgICAgc2tpcFJ1bi0tOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcHJldlNraXBwZWQgPSBIQU5UUk9fRkFMU0U7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlTWFjcm9ibG9ja0xheWVyKHBTdHJtRGF0YSwgbWJMYXllciwKLSAgICAgICAgICAgICAgICBwU3RvcmFnZS0+bWIgKyBjdXJyTWJBZGRyLCBwU2xpY2VIZWFkZXItPnNsaWNlVHlwZSwKLSAgICAgICAgICAgICAgICBwU2xpY2VIZWFkZXItPm51bVJlZklkeEwwQWN0aXZlKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVQUklOVCgibWFjcm9ibG9ja19sYXllciIpOwotICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZU1hY3JvYmxvY2socFN0b3JhZ2UtPm1iICsgY3Vyck1iQWRkciwgbWJMYXllciwKLSAgICAgICAgICAgIGN1cnJJbWFnZSwgcFN0b3JhZ2UtPmRwYiwgJnFwWSwgY3Vyck1iQWRkciwKLSAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHMtPmNvbnN0cmFpbmVkSW50cmFQcmVkRmxhZywgZGF0YSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICB7Ci0gICAgICAgICAgICBFUFJJTlQoIk1BQ1JPX0JMT0NLIik7Ci0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGluY3JlbWVudCBtYWNyb2Jsb2NrIGNvdW50IG9ubHkgZm9yIG1hY3JvYmxvY2tzIHRoYXQgd2VyZSBkZWNvZGVkCi0gICAgICAgICAqIGZvciB0aGUgZmlyc3QgdGltZSAocmVkdW5kYW50IHNsaWNlcykgKi8KLSAgICAgICAgaWYgKHBTdG9yYWdlLT5tYltjdXJyTWJBZGRyXS5kZWNvZGVkID09IDEpCi0gICAgICAgICAgICBtYkNvdW50Kys7Ci0KLSAgICAgICAgLyoga2VlcCBvbiBwcm9jZXNzaW5nIGFzIGxvbmcgYXMgdGhlcmUgaXMgc3RyZWFtIGRhdGEgbGVmdCBvcgotICAgICAgICAgKiBwcm9jZXNzaW5nIG9mIG1hY3JvYmxvY2tzIHRvIGJlIHNraXBwZWQgYmFzZWQgb24gdGhlIGxhc3Qgc2tpcFJ1biBpcwotICAgICAgICAgKiBub3QgZmluaXNoZWQgKi8KLSAgICAgICAgbW9yZU1icyA9IChoMjY0YnNkTW9yZVJic3BEYXRhKHBTdHJtRGF0YSkgfHwgc2tpcFJ1bikgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgIC8qIGxhc3RNYkFkZHIgaXMgb25seSB1cGRhdGVkIGZvciBpbnRyYSBzbGljZXMgKGFsbCBtYWNyb2Jsb2NrcyBvZgotICAgICAgICAgKiBpbnRlciBzbGljZXMgd2lsbCBiZSBsb3N0IGluIGNhc2Ugb2YgYW4gZXJyb3IpICovCi0gICAgICAgIGlmIChJU19JX1NMSUNFKHBTbGljZUhlYWRlci0+c2xpY2VUeXBlKSkKLSAgICAgICAgICAgIHBTdG9yYWdlLT5zbGljZS0+bGFzdE1iQWRkciA9IGN1cnJNYkFkZHI7Ci0KLSAgICAgICAgY3Vyck1iQWRkciA9IGgyNjRic2ROZXh0TWJBZGRyZXNzKHBTdG9yYWdlLT5zbGljZUdyb3VwTWFwLAotICAgICAgICAgICAgcFN0b3JhZ2UtPnBpY1NpemVJbk1icywgY3Vyck1iQWRkcik7Ci0gICAgICAgIC8qIGRhdGEgbGVmdCBpbiB0aGUgYnVmZmVyIGJ1dCBubyBtb3JlIG1hY3JvYmxvY2tzIGZvciBjdXJyZW50IHNsaWNlCi0gICAgICAgICAqIGdyb3VwIC0+IGVycm9yICovCi0gICAgICAgIGlmIChtb3JlTWJzICYmICFjdXJyTWJBZGRyKQotICAgICAgICB7Ci0gICAgICAgICAgICBFUFJJTlQoIk5leHQgbWIgYWRkcmVzcyIpOwotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICB9Ci0KLSAgICB9IHdoaWxlIChtb3JlTWJzKTsKLQotICAgIGlmICgocFN0b3JhZ2UtPnNsaWNlLT5udW1EZWNvZGVkTWJzICsgbWJDb3VudCkgPiBwU3RvcmFnZS0+cGljU2l6ZUluTWJzKQotICAgIHsKLSAgICAgICAgRVBSSU5UKCJOdW0gZGVjb2RlZCBtYnMiKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIHBTdG9yYWdlLT5zbGljZS0+bnVtRGVjb2RlZE1icyArPSBtYkNvdW50OwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgNS4yICBGdW5jdGlvbjogU2V0TWJQYXJhbXMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgU2V0IG1hY3JvYmxvY2sgcGFyYW1ldGVycyB0aGF0IHJlbWFpbiBjb25zdGFudCBmb3IgdGhpcyBzbGljZQotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTbGljZSAgICAgIHBvaW50ZXIgdG8gY3VycmVudCBzbGljZSBoZWFkZXIKLSAgICAgICAgICAgIHNsaWNlSWQgICAgIGlkIG9mIHRoZSBjdXJyZW50IHNsaWNlCi0gICAgICAgICAgICBjaHJvbWFRcEluZGV4T2Zmc2V0Ci0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHBNYiAgICAgICAgIHBvaW50ZXIgdG8gbWFjcm9ibG9jayBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXBkYXRlZAotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgU2V0TWJQYXJhbXMobWJTdG9yYWdlX3QgKnBNYiwgc2xpY2VIZWFkZXJfdCAqcFNsaWNlLCB1MzIgc2xpY2VJZCwKLSAgICBpMzIgY2hyb21hUXBJbmRleE9mZnNldCkKLXsKLQotLyogVmFyaWFibGVzICovCi0gICAgdTMyIHRtcDE7Ci0gICAgaTMyIHRtcDIsIHRtcDM7Ci0KLS8qIENvZGUgKi8KLQotICAgIHRtcDEgPSBwU2xpY2UtPmRpc2FibGVEZWJsb2NraW5nRmlsdGVySWRjOwotICAgIHRtcDIgPSBwU2xpY2UtPnNsaWNlQWxwaGFDME9mZnNldDsKLSAgICB0bXAzID0gcFNsaWNlLT5zbGljZUJldGFPZmZzZXQ7Ci0gICAgcE1iLT5zbGljZUlkID0gc2xpY2VJZDsKLSAgICBwTWItPmRpc2FibGVEZWJsb2NraW5nRmlsdGVySWRjID0gdG1wMTsKLSAgICBwTWItPmZpbHRlck9mZnNldEEgPSB0bXAyOwotICAgIHBNYi0+ZmlsdGVyT2Zmc2V0QiA9IHRtcDM7Ci0gICAgcE1iLT5jaHJvbWFRcEluZGV4T2Zmc2V0ID0gY2hyb21hUXBJbmRleE9mZnNldDsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICA1LjMgIEZ1bmN0aW9uIG5hbWU6IGgyNjRic2RNYXJrU2xpY2VDb3JydXB0ZWQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgTWFyayBtYWNyb2Jsb2NrcyBvZiB0aGUgc2xpY2UgY29ycnVwdGVkLiBJZiBsYXN0TWJBZGRyIGluIHRoZSBzbGljZQotICAgICAgICAgICAgc3RvcmFnZSBpcyBzZXQgLT4gcGljV2lkaHRJbk1icyAob3IgYXQgbGVhc3QgMTApIG1hY3JvYmxvY2tzIGJhY2sKLSAgICAgICAgICAgIGZyb20gIHRoZSBsYXN0TWJBZGRyIGFyZSBtYXJrZWQgY29ycnVwdGVkLiBIb3dldmVyLCBpZiBsYXN0TWJBZGRyCi0gICAgICAgICAgICBpcyBub3Qgc2V0IC0+IGFsbCBtYWNyb2Jsb2NrcyBvZiB0aGUgc2xpY2UgYXJlIG1hcmtlZC4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICAgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQotICAgICAgICAgICAgZmlyc3RNYkluU2xpY2UgIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IG1hY3JvYmxvY2sgaW4gdGhlIHNsaWNlLCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcyB0aGUgc2xpY2UgdG8gYmUgbWFya2VkIGNvcnJ1cHRlZAotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICAgICAgbWJTdG9yYWdlIGZvciB0aGUgY29ycnVwdGVkIG1hY3JvYmxvY2tzIHVwZGF0ZWQKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgbm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RNYXJrU2xpY2VDb3JydXB0ZWQoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyIGZpcnN0TWJJblNsaWNlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIGk7Ci0gICAgdTMyIHNsaWNlSWQ7Ci0gICAgdTMyIGN1cnJNYkFkZHI7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RvcmFnZSk7Ci0gICAgQVNTRVJUKGZpcnN0TWJJblNsaWNlIDwgcFN0b3JhZ2UtPnBpY1NpemVJbk1icyk7Ci0KLSAgICBjdXJyTWJBZGRyID0gZmlyc3RNYkluU2xpY2U7Ci0KLSAgICBzbGljZUlkID0gcFN0b3JhZ2UtPnNsaWNlLT5zbGljZUlkOwotCi0gICAgLyogRGVjb2RlU2xpY2VEYXRhIHNldHMgbGFzdE1iQWRkciBmb3IgSSBzbGljZXMgLT4gaWYgaXQgd2FzIHNldCwgZ28gYmFjawotICAgICAqIE1BWChwaWNXaWR0aEluTWJzLCAxMCkgbWFjcm9ibG9ja3MgYW5kIHN0YXJ0IG1hcmtpbmcgZnJvbSB0aGVyZSAqLwotICAgIGlmIChwU3RvcmFnZS0+c2xpY2UtPmxhc3RNYkFkZHIpCi0gICAgewotICAgICAgICBBU1NFUlQocFN0b3JhZ2UtPm1iW3BTdG9yYWdlLT5zbGljZS0+bGFzdE1iQWRkcl0uc2xpY2VJZCA9PSBzbGljZUlkKTsKLSAgICAgICAgaSA9IHBTdG9yYWdlLT5zbGljZS0+bGFzdE1iQWRkciAtIDE7Ci0gICAgICAgIHRtcCA9IDA7Ci0gICAgICAgIHdoaWxlIChpID4gY3Vyck1iQWRkcikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBTdG9yYWdlLT5tYltpXS5zbGljZUlkID09IHNsaWNlSWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wKys7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCA+PSBNQVgocFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljV2lkdGhJbk1icywgMTApKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGktLTsKLSAgICAgICAgfQotICAgICAgICBjdXJyTWJBZGRyID0gaTsKLSAgICB9Ci0KLSAgICBkbwotICAgIHsKLQotICAgICAgICBpZiAoIChwU3RvcmFnZS0+bWJbY3Vyck1iQWRkcl0uc2xpY2VJZCA9PSBzbGljZUlkKSAmJgotICAgICAgICAgICAgIChwU3RvcmFnZS0+bWJbY3Vyck1iQWRkcl0uZGVjb2RlZCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwU3RvcmFnZS0+bWJbY3Vyck1iQWRkcl0uZGVjb2RlZC0tOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjdXJyTWJBZGRyID0gaDI2NGJzZE5leHRNYkFkZHJlc3MocFN0b3JhZ2UtPnNsaWNlR3JvdXBNYXAsCi0gICAgICAgICAgICBwU3RvcmFnZS0+cGljU2l6ZUluTWJzLCBjdXJyTWJBZGRyKTsKLQotICAgIH0gd2hpbGUgKGN1cnJNYkFkZHIpOwotCi19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9kYXRhLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZGF0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjNkNDllLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9kYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX1NMSUNFX0RBVEFfSAotI2RlZmluZSBIMjY0U1dERUNfU0xJQ0VfREFUQV9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgotI2luY2x1ZGUgImgyNjRic2RfY2ZnLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9oZWFkZXIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3N0b3JhZ2UuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlU2xpY2VEYXRhKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgc3RvcmFnZV90ICpwU3RvcmFnZSwKLSAgICBpbWFnZV90ICpjdXJySW1hZ2UsIHNsaWNlSGVhZGVyX3QgKnBTbGljZUhlYWRlcik7Ci0KLXZvaWQgaDI2NGJzZE1hcmtTbGljZUNvcnJ1cHRlZChzdG9yYWdlX3QgKnBTdG9yYWdlLCB1MzIgZmlyc3RNYkluU2xpY2UpOwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19TTElDRV9EQVRBX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2dyb3VwX21hcC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2dyb3VwX21hcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2JiNTM0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9ncm91cF9tYXAuYworKysgL2Rldi9udWxsCkBAIC0xLDU4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgRGVjb2RlSW50ZXJsZWF2ZWRNYXAKLSAgICAgICAgICBEZWNvZGVEaXNwZXJzZWRNYXAKLSAgICAgICAgICBEZWNvZGVGb3JlZ3JvdW5kTGVmdE92ZXJNYXAKLSAgICAgICAgICBEZWNvZGVCb3hPdXRNYXAKLSAgICAgICAgICBEZWNvZGVSYXN0ZXJTY2FuTWFwCi0gICAgICAgICAgRGVjb2RlV2lwZU1hcAotICAgICAgICAgIGgyNjRic2REZWNvZGVTbGljZUdyb3VwTWFwCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2dyb3VwX21hcC5oIgotI2luY2x1ZGUgImgyNjRic2RfY2ZnLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9waWNfcGFyYW1fc2V0LmgiCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHZvaWQgRGVjb2RlSW50ZXJsZWF2ZWRNYXAoCi0gIHUzMiAqbWFwLAotICB1MzIgbnVtU2xpY2VHcm91cHMsCi0gIHUzMiAqcnVuTGVuZ3RoLAotICB1MzIgcGljU2l6ZSk7Ci0KLXN0YXRpYyB2b2lkIERlY29kZURpc3BlcnNlZE1hcCgKLSAgdTMyICptYXAsCi0gIHUzMiBudW1TbGljZUdyb3VwcywKLSAgdTMyIHBpY1dpZHRoLAotICB1MzIgcGljSGVpZ2h0KTsKLQotc3RhdGljIHZvaWQgRGVjb2RlRm9yZWdyb3VuZExlZnRPdmVyTWFwKAotICB1MzIgKm1hcCwKLSAgdTMyIG51bVNsaWNlR3JvdXBzLAotICB1MzIgKnRvcExlZnQsCi0gIHUzMiAqYm90dG9tUmlnaHQsCi0gIHUzMiBwaWNXaWR0aCwKLSAgdTMyIHBpY0hlaWdodCk7Ci0KLXN0YXRpYyB2b2lkIERlY29kZUJveE91dE1hcCgKLSAgdTMyICptYXAsCi0gIHUzMiBzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZywKLSAgdTMyIHVuaXRzSW5TbGljZUdyb3VwMCwKLSAgdTMyIHBpY1dpZHRoLAotICB1MzIgcGljSGVpZ2h0KTsKLQotc3RhdGljIHZvaWQgRGVjb2RlUmFzdGVyU2Nhbk1hcCgKLSAgdTMyICptYXAsCi0gIHUzMiBzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZywKLSAgdTMyIHNpemVPZlVwcGVyTGVmdEdyb3VwLAotICB1MzIgcGljU2l6ZSk7Ci0KLXN0YXRpYyB2b2lkIERlY29kZVdpcGVNYXAoCi0gIHUzMiAqbWFwLAotICB1MzIgc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcsCi0gIHUzMiBzaXplT2ZVcHBlckxlZnRHcm91cCwKLSAgdTMyIHBpY1dpZHRoLAotICB1MzIgcGljSGVpZ2h0KTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVJbnRlcmxlYXZlZE1hcAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgaW50ZXJsZWF2ZWQgc2xpY2UgZ3JvdXAgbWFwIHR5cGUsIGkuZS4gc2xpY2UKLSAgICAgICAgICAgIGdyb3VwIG1hcCB0eXBlIDAuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgbWFwICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG1hcAotICAgICAgICAgICAgbnVtU2xpY2VHcm91cHMgIG51bWJlciBvZiBzbGljZSBncm91cHMKLSAgICAgICAgICAgIHJ1bkxlbmd0aCAgICAgICBydW5fbGVuZ3RoW10gdmFsdWVzIGZvciBlYWNoIHNsaWNlIGdyb3VwCi0gICAgICAgICAgICBwaWNTaXplICAgICAgICAgcGljdHVyZSBzaXplIGluIG1hY3JvYmxvY2tzCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG1hcCAgICAgICAgICAgICBzbGljZSBncm91cCBtYXAgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgbm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIERlY29kZUludGVybGVhdmVkTWFwKAotICB1MzIgKm1hcCwKLSAgdTMyIG51bVNsaWNlR3JvdXBzLAotICB1MzIgKnJ1bkxlbmd0aCwKLSAgdTMyIHBpY1NpemUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksaiwgZ3JvdXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChtYXApOwotICAgIEFTU0VSVChudW1TbGljZUdyb3VwcyA+PSAxICYmIG51bVNsaWNlR3JvdXBzIDw9IE1BWF9OVU1fU0xJQ0VfR1JPVVBTKTsKLSAgICBBU1NFUlQocnVuTGVuZ3RoKTsKLQotICAgIGkgPSAwOwotCi0gICAgZG8gewotICAgICAgICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBudW1TbGljZUdyb3VwcyAmJiBpIDwgcGljU2l6ZTsKLSAgICAgICAgICBpICs9IHJ1bkxlbmd0aFtncm91cCsrXSkKLSAgICAgICAgewotICAgICAgICAgICAgQVNTRVJUKHJ1bkxlbmd0aFtncm91cF0gPD0gcGljU2l6ZSk7Ci0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcnVuTGVuZ3RoW2dyb3VwXSAmJiBpICsgaiA8IHBpY1NpemU7IGorKykKLSAgICAgICAgICAgICAgICBtYXBbaStqXSA9IGdyb3VwOwotICAgICAgICB9Ci0gICAgfSB3aGlsZSAoaSA8IHBpY1NpemUpOwotCi0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBEZWNvZGVEaXNwZXJzZWRNYXAKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gZGVjb2RlIGRpc3BlcnNlZCBzbGljZSBncm91cCBtYXAgdHlwZSwgaS5lLiBzbGljZQotICAgICAgICAgICAgZ3JvdXAgbWFwIHR5cGUgMS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBtYXAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBtYXAKLSAgICAgICAgICAgIG51bVNsaWNlR3JvdXBzICAgIG51bWJlciBvZiBzbGljZSBncm91cHMKLSAgICAgICAgICAgIHBpY1dpZHRoICAgICAgICAgIHBpY3R1cmUgd2lkdGggaW4gbWFjcm9ibG9ja3MKLSAgICAgICAgICAgIHBpY0hlaWdodCAgICAgICAgIHBpY3R1cmUgaGVpZ2h0IGluIG1hY3JvYmxvY2tzCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG1hcCAgICAgICAgICAgICAgIHNsaWNlIGdyb3VwIG1hcCBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgRGVjb2RlRGlzcGVyc2VkTWFwKAotICB1MzIgKm1hcCwKLSAgdTMyIG51bVNsaWNlR3JvdXBzLAotICB1MzIgcGljV2lkdGgsCi0gIHUzMiBwaWNIZWlnaHQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksIHBpY1NpemU7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChtYXApOwotICAgIEFTU0VSVChudW1TbGljZUdyb3VwcyA+PSAxICYmIG51bVNsaWNlR3JvdXBzIDw9IE1BWF9OVU1fU0xJQ0VfR1JPVVBTKTsKLSAgICBBU1NFUlQocGljV2lkdGgpOwotICAgIEFTU0VSVChwaWNIZWlnaHQpOwotCi0gICAgcGljU2l6ZSA9IHBpY1dpZHRoICogcGljSGVpZ2h0OwotCi0gICAgZm9yIChpID0gMDsgaSA8IHBpY1NpemU7IGkrKykKLSAgICAgICAgbWFwW2ldID0gKChpICUgcGljV2lkdGgpICsgKCgoaSAvIHBpY1dpZHRoKSAqIG51bVNsaWNlR3JvdXBzKSA+PiAxKSkgJQotICAgICAgICAgICAgbnVtU2xpY2VHcm91cHM7Ci0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZUZvcmVncm91bmRMZWZ0T3Zlck1hcAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgZm9yZWdyb3VuZCB3aXRoIGxlZnQtb3ZlciBzbGljZSBncm91cCBtYXAgdHlwZSwKLSAgICAgICAgICAgIGkuZS4gc2xpY2UgZ3JvdXAgbWFwIHR5cGUgMi4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBtYXAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBtYXAKLSAgICAgICAgICAgIG51bVNsaWNlR3JvdXBzICAgIG51bWJlciBvZiBzbGljZSBncm91cHMKLSAgICAgICAgICAgIHRvcExlZnQgICAgICAgICAgIHRvcF9sZWZ0W10gdmFsdWVzCi0gICAgICAgICAgICBib3R0b21SaWdodCAgICAgICBib3R0b21fcmlnaHRbXSB2YWx1ZXMKLSAgICAgICAgICAgIHBpY1dpZHRoICAgICAgICAgIHBpY3R1cmUgd2lkdGggaW4gbWFjcm9ibG9ja3MKLSAgICAgICAgICAgIHBpY0hlaWdodCAgICAgICAgIHBpY3R1cmUgaGVpZ2h0IGluIG1hY3JvYmxvY2tzCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG1hcCAgICAgICAgICAgICAgIHNsaWNlIGdyb3VwIG1hcCBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgRGVjb2RlRm9yZWdyb3VuZExlZnRPdmVyTWFwKAotICB1MzIgKm1hcCwKLSAgdTMyIG51bVNsaWNlR3JvdXBzLAotICB1MzIgKnRvcExlZnQsCi0gIHUzMiAqYm90dG9tUmlnaHQsCi0gIHUzMiBwaWNXaWR0aCwKLSAgdTMyIHBpY0hlaWdodCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaSx5LHgseVRvcExlZnQseUJvdHRvbVJpZ2h0LHhUb3BMZWZ0LHhCb3R0b21SaWdodCwgcGljU2l6ZTsKLSAgICB1MzIgZ3JvdXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChtYXApOwotICAgIEFTU0VSVChudW1TbGljZUdyb3VwcyA+PSAxICYmIG51bVNsaWNlR3JvdXBzIDw9IE1BWF9OVU1fU0xJQ0VfR1JPVVBTKTsKLSAgICBBU1NFUlQodG9wTGVmdCk7Ci0gICAgQVNTRVJUKGJvdHRvbVJpZ2h0KTsKLSAgICBBU1NFUlQocGljV2lkdGgpOwotICAgIEFTU0VSVChwaWNIZWlnaHQpOwotCi0gICAgcGljU2l6ZSA9IHBpY1dpZHRoICogcGljSGVpZ2h0OwotCi0gICAgZm9yIChpID0gMDsgaSA8IHBpY1NpemU7IGkrKykKLSAgICAgICAgbWFwW2ldID0gbnVtU2xpY2VHcm91cHMgLSAxOwotCi0gICAgZm9yIChncm91cCA9IG51bVNsaWNlR3JvdXBzIC0gMTsgZ3JvdXAtLTsgKQotICAgIHsKLSAgICAgICAgQVNTRVJUKCB0b3BMZWZ0W2dyb3VwXSA8PSBib3R0b21SaWdodFtncm91cF0gJiYKLSAgICAgICAgICAgICAgICBib3R0b21SaWdodFtncm91cF0gPCBwaWNTaXplICk7Ci0gICAgICAgIHlUb3BMZWZ0ID0gdG9wTGVmdFtncm91cF0gLyBwaWNXaWR0aDsKLSAgICAgICAgeFRvcExlZnQgPSB0b3BMZWZ0W2dyb3VwXSAlIHBpY1dpZHRoOwotICAgICAgICB5Qm90dG9tUmlnaHQgPSBib3R0b21SaWdodFtncm91cF0gLyBwaWNXaWR0aDsKLSAgICAgICAgeEJvdHRvbVJpZ2h0ID0gYm90dG9tUmlnaHRbZ3JvdXBdICUgcGljV2lkdGg7Ci0gICAgICAgIEFTU0VSVCh4VG9wTGVmdCA8PSB4Qm90dG9tUmlnaHQpOwotCi0gICAgICAgIGZvciAoeSA9IHlUb3BMZWZ0OyB5IDw9IHlCb3R0b21SaWdodDsgeSsrKQotICAgICAgICAgICAgZm9yICh4ID0geFRvcExlZnQ7IHggPD0geEJvdHRvbVJpZ2h0OyB4KyspCi0gICAgICAgICAgICAgICAgbWFwWyB5ICogcGljV2lkdGggKyB4IF0gPSBncm91cDsKLSAgICB9Ci0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZUJveE91dE1hcAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgYm94LW91dCBzbGljZSBncm91cCBtYXAgdHlwZSwgaS5lLiBzbGljZSBncm91cAotICAgICAgICAgICAgbWFwIHR5cGUgMy4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgbWFwCi0gICAgICAgICAgICBzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZyAgICAgc2xpY2VfZ3JvdXBfY2hhbmdlX2RpcmVjdGlvbl9mbGFnCi0gICAgICAgICAgICB1bml0c0luU2xpY2VHcm91cDAgICAgICAgICAgICAgICAgbWJzIG9uIHNsaWNlIGdyb3VwIDAKLSAgICAgICAgICAgIHBpY1dpZHRoICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIHdpZHRoIGluIG1hY3JvYmxvY2tzCi0gICAgICAgICAgICBwaWNIZWlnaHQgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSBoZWlnaHQgaW4gbWFjcm9ibG9ja3MKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlIGdyb3VwIG1hcCBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgRGVjb2RlQm94T3V0TWFwKAotICB1MzIgKm1hcCwKLSAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnLAotICB1MzIgdW5pdHNJblNsaWNlR3JvdXAwLAotICB1MzIgcGljV2lkdGgsCi0gIHUzMiBwaWNIZWlnaHQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksIGssIHBpY1NpemU7Ci0gICAgaTMyIHgsIHksIHhEaXIsIHlEaXIsIGxlZnRCb3VuZCwgdG9wQm91bmQsIHJpZ2h0Qm91bmQsIGJvdHRvbUJvdW5kOwotICAgIHUzMiBtYXBVbml0VmFjYW50OwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQobWFwKTsKLSAgICBBU1NFUlQocGljV2lkdGgpOwotICAgIEFTU0VSVChwaWNIZWlnaHQpOwotCi0gICAgcGljU2l6ZSA9IHBpY1dpZHRoICogcGljSGVpZ2h0OwotICAgIEFTU0VSVCh1bml0c0luU2xpY2VHcm91cDAgPD0gcGljU2l6ZSk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcGljU2l6ZTsgaSsrKQotICAgICAgICBtYXBbaV0gPSAxOwotCi0gICAgeCA9IChwaWNXaWR0aCAtICh1MzIpc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcpID4+IDE7Ci0gICAgeSA9IChwaWNIZWlnaHQgLSAodTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnKSA+PiAxOwotCi0gICAgbGVmdEJvdW5kID0geDsKLSAgICB0b3BCb3VuZCA9IHk7Ci0KLSAgICByaWdodEJvdW5kID0geDsKLSAgICBib3R0b21Cb3VuZCA9IHk7Ci0KLSAgICB4RGlyID0gKGkzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZyAtIDE7Ci0gICAgeURpciA9IChpMzIpc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWc7Ci0KLSAgICBmb3IgKGsgPSAwOyBrIDwgdW5pdHNJblNsaWNlR3JvdXAwOyBrICs9IG1hcFVuaXRWYWNhbnQgPyAxIDogMCkKLSAgICB7Ci0gICAgICAgIG1hcFVuaXRWYWNhbnQgPSAobWFwWyAodTMyKXkgKiBwaWNXaWR0aCArICh1MzIpeCBdID09IDEpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgICAgICBpZiAobWFwVW5pdFZhY2FudCkKLSAgICAgICAgICAgIG1hcFsgKHUzMil5ICogcGljV2lkdGggKyAodTMyKXggXSA9IDA7Ci0KLSAgICAgICAgaWYgKHhEaXIgPT0gLTEgJiYgeCA9PSBsZWZ0Qm91bmQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxlZnRCb3VuZCA9IE1BWChsZWZ0Qm91bmQgLSAxLCAwKTsKLSAgICAgICAgICAgIHggPSBsZWZ0Qm91bmQ7Ci0gICAgICAgICAgICB4RGlyID0gMDsKLSAgICAgICAgICAgIHlEaXIgPSAyICogKGkzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZyAtIDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoeERpciA9PSAxICYmIHggPT0gcmlnaHRCb3VuZCkKLSAgICAgICAgewotICAgICAgICAgICAgcmlnaHRCb3VuZCA9IE1JTihyaWdodEJvdW5kICsgMSwgKGkzMilwaWNXaWR0aCAtIDEpOwotICAgICAgICAgICAgeCA9IHJpZ2h0Qm91bmQ7Ci0gICAgICAgICAgICB4RGlyID0gMDsKLSAgICAgICAgICAgIHlEaXIgPSAxIC0gMiAqIChpMzIpc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWc7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoeURpciA9PSAtMSAmJiB5ID09IHRvcEJvdW5kKQotICAgICAgICB7Ci0gICAgICAgICAgICB0b3BCb3VuZCA9IE1BWCh0b3BCb3VuZCAtIDEsIDApOwotICAgICAgICAgICAgeSA9IHRvcEJvdW5kOwotICAgICAgICAgICAgeERpciA9IDEgLSAyICogKGkzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZzsKLSAgICAgICAgICAgIHlEaXIgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHlEaXIgPT0gMSAmJiB5ID09IGJvdHRvbUJvdW5kKQotICAgICAgICB7Ci0gICAgICAgICAgICBib3R0b21Cb3VuZCA9IE1JTihib3R0b21Cb3VuZCArIDEsIChpMzIpcGljSGVpZ2h0IC0gMSk7Ci0gICAgICAgICAgICB5ID0gYm90dG9tQm91bmQ7Ci0gICAgICAgICAgICB4RGlyID0gMiAqIChpMzIpc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcgLSAxOwotICAgICAgICAgICAgeURpciA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB4ICs9IHhEaXI7Ci0gICAgICAgICAgICB5ICs9IHlEaXI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZVJhc3RlclNjYW5NYXAKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gZGVjb2RlIHJhc3RlciBzY2FuIHNsaWNlIGdyb3VwIG1hcCB0eXBlLCBpLmUuIHNsaWNlCi0gICAgICAgICAgICBncm91cCBtYXAgdHlwZSA0LgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIG1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBtYXAKLSAgICAgICAgICAgIHNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnICAgICBzbGljZV9ncm91cF9jaGFuZ2VfZGlyZWN0aW9uX2ZsYWcKLSAgICAgICAgICAgIHNpemVPZlVwcGVyTGVmdEdyb3VwICAgICAgICAgICAgICBtYnMgaW4gdXBwZXJMZWZ0R3JvdXAKLSAgICAgICAgICAgIHBpY1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIHNpemUgaW4gbWFjcm9ibG9ja3MKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlIGdyb3VwIG1hcCBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgRGVjb2RlUmFzdGVyU2Nhbk1hcCgKLSAgdTMyICptYXAsCi0gIHUzMiBzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZywKLSAgdTMyIHNpemVPZlVwcGVyTGVmdEdyb3VwLAotICB1MzIgcGljU2l6ZSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgaTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKG1hcCk7Ci0gICAgQVNTRVJUKHBpY1NpemUpOwotICAgIEFTU0VSVChzaXplT2ZVcHBlckxlZnRHcm91cCA8PSBwaWNTaXplKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBwaWNTaXplOyBpKyspCi0gICAgICAgIGlmIChpIDwgc2l6ZU9mVXBwZXJMZWZ0R3JvdXApCi0gICAgICAgICAgICBtYXBbaV0gPSAodTMyKXNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtYXBbaV0gPSAxIC0gKHUzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZzsKLQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogRGVjb2RlV2lwZU1hcAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiB0byBkZWNvZGUgd2lwZSBzbGljZSBncm91cCBtYXAgdHlwZSwgaS5lLiBzbGljZSBncm91cCBtYXAKLSAgICAgICAgICAgIHR5cGUgNS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZyAgICAgc2xpY2VfZ3JvdXBfY2hhbmdlX2RpcmVjdGlvbl9mbGFnCi0gICAgICAgICAgICBzaXplT2ZVcHBlckxlZnRHcm91cCAgICAgICAgICAgICAgbWJzIGluIHVwcGVyTGVmdEdyb3VwCi0gICAgICAgICAgICBwaWNXaWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSB3aWR0aCBpbiBtYWNyb2Jsb2NrcwotICAgICAgICAgICAgcGljSGVpZ2h0ICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgaGVpZ2h0IGluIG1hY3JvYmxvY2tzCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZSBncm91cCBtYXAgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgbm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIERlY29kZVdpcGVNYXAoCi0gIHUzMiAqbWFwLAotICB1MzIgc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWcsCi0gIHUzMiBzaXplT2ZVcHBlckxlZnRHcm91cCwKLSAgdTMyIHBpY1dpZHRoLAotICB1MzIgcGljSGVpZ2h0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLGosazsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKG1hcCk7Ci0gICAgQVNTRVJUKHBpY1dpZHRoKTsKLSAgICBBU1NFUlQocGljSGVpZ2h0KTsKLSAgICBBU1NFUlQoc2l6ZU9mVXBwZXJMZWZ0R3JvdXAgPD0gcGljV2lkdGggKiBwaWNIZWlnaHQpOwotCi0gICAgayA9IDA7Ci0gICAgZm9yIChqID0gMDsgaiA8IHBpY1dpZHRoOyBqKyspCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaWNIZWlnaHQ7IGkrKykKLSAgICAgICAgICAgIGlmIChrKysgPCBzaXplT2ZVcHBlckxlZnRHcm91cCkKLSAgICAgICAgICAgICAgICBtYXBbIGkgKiBwaWNXaWR0aCArIGogXSA9ICh1MzIpc2xpY2VHcm91cENoYW5nZURpcmVjdGlvbkZsYWc7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbWFwWyBpICogcGljV2lkdGggKyBqIF0gPSAxIC0KLSAgICAgICAgICAgICAgICAgICAgKHUzMilzbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZzsKLQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZERlY29kZVNsaWNlR3JvdXBNYXAKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gdG8gZGVjb2RlIG1hY3JvYmxvY2sgdG8gc2xpY2UgZ3JvdXAgbWFwLiBDb25zdHJ1Y3Rpb24KLSAgICAgICAgICAgIG9mIGRpZmZlcmVudCBzbGljZSBncm91cCBtYXAgdHlwZXMgaXMgaGFuZGxlZCBieSBzZXBhcmF0ZQotICAgICAgICAgICAgZnVuY3Rpb25zIGRlZmluZWQgYWJvdmUuIFNlZSBzdGFuZGFyZCBmb3IgZGV0YWlscyBob3cgc2xpY2UgZ3JvdXAKLSAgICAgICAgICAgIG1hcHMgYXJlIGNvbXB1dGVkLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBwcyAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZSBwaWN0dXJlIHBhcmFtZXRlciBzZXQKLSAgICAgICAgICAgIHNsaWNlR3JvdXBDaGFuZ2VDeWNsZSAgIHNsaWNlX2dyb3VwX2NoYW5nZV9jeWNsZQotICAgICAgICAgICAgcGljV2lkdGggICAgICAgICAgICAgICAgcGljdHVyZSB3aWR0aCBpbiBtYWNyb2Jsb2NrcwotICAgICAgICAgICAgcGljSGVpZ2h0ICAgICAgICAgICAgICAgcGljdHVyZSBoZWlnaHQgaW4gbWFjcm9ibG9ja3MKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbWFwICAgICAgICAgICAgICAgICAgICAgc2xpY2UgZ3JvdXAgbWFwIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkRGVjb2RlU2xpY2VHcm91cE1hcCgKLSAgdTMyICptYXAsCi0gIHBpY1BhcmFtU2V0X3QgKnBwcywKLSAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VDeWNsZSwKLSAgdTMyIHBpY1dpZHRoLAotICB1MzIgcGljSGVpZ2h0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLCBwaWNTaXplLCB1bml0c0luU2xpY2VHcm91cDAgPSAwLCBzaXplT2ZVcHBlckxlZnRHcm91cCA9IDA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChtYXApOwotICAgIEFTU0VSVChwcHMpOwotICAgIEFTU0VSVChwaWNXaWR0aCk7Ci0gICAgQVNTRVJUKHBpY0hlaWdodCk7Ci0gICAgQVNTRVJUKHBwcy0+c2xpY2VHcm91cE1hcFR5cGUgPCA3KTsKLQotICAgIHBpY1NpemUgPSBwaWNXaWR0aCAqIHBpY0hlaWdodDsKLQotICAgIC8qIGp1c3Qgb25lIHNsaWNlIGdyb3VwIC0+IGFsbCBtYWNyb2Jsb2NrcyBiZWxvbmcgdG8gZ3JvdXAgMCAqLwotICAgIGlmIChwcHMtPm51bVNsaWNlR3JvdXBzID09IDEpCi0gICAgewotICAgICAgICBIMjY0U3dEZWNNZW1zZXQobWFwLCAwLCBwaWNTaXplICogc2l6ZW9mKHUzMikpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHBwcy0+c2xpY2VHcm91cE1hcFR5cGUgPiAyICYmIHBwcy0+c2xpY2VHcm91cE1hcFR5cGUgPCA2KQotICAgIHsKLSAgICAgICAgQVNTRVJUKHBwcy0+c2xpY2VHcm91cENoYW5nZVJhdGUgJiYKLSAgICAgICAgICAgICAgIHBwcy0+c2xpY2VHcm91cENoYW5nZVJhdGUgPD0gcGljU2l6ZSk7Ci0KLSAgICAgICAgdW5pdHNJblNsaWNlR3JvdXAwID0KLSAgICAgICAgICAgIE1JTihzbGljZUdyb3VwQ2hhbmdlQ3ljbGUgKiBwcHMtPnNsaWNlR3JvdXBDaGFuZ2VSYXRlLCBwaWNTaXplKTsKLQotICAgICAgICBpZiAocHBzLT5zbGljZUdyb3VwTWFwVHlwZSA9PSA0IHx8IHBwcy0+c2xpY2VHcm91cE1hcFR5cGUgPT0gNSkKLSAgICAgICAgICAgIHNpemVPZlVwcGVyTGVmdEdyb3VwID0gcHBzLT5zbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZyA/Ci0gICAgICAgICAgICAgICAgKHBpY1NpemUgLSB1bml0c0luU2xpY2VHcm91cDApIDogdW5pdHNJblNsaWNlR3JvdXAwOwotICAgIH0KLQotICAgIHN3aXRjaCAocHBzLT5zbGljZUdyb3VwTWFwVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIERlY29kZUludGVybGVhdmVkTWFwKG1hcCwgcHBzLT5udW1TbGljZUdyb3VwcywKLSAgICAgICAgICAgICAgcHBzLT5ydW5MZW5ndGgsIHBpY1NpemUpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgRGVjb2RlRGlzcGVyc2VkTWFwKG1hcCwgcHBzLT5udW1TbGljZUdyb3VwcywgcGljV2lkdGgsCi0gICAgICAgICAgICAgIHBpY0hlaWdodCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBEZWNvZGVGb3JlZ3JvdW5kTGVmdE92ZXJNYXAobWFwLCBwcHMtPm51bVNsaWNlR3JvdXBzLAotICAgICAgICAgICAgICBwcHMtPnRvcExlZnQsIHBwcy0+Ym90dG9tUmlnaHQsIHBpY1dpZHRoLCBwaWNIZWlnaHQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgRGVjb2RlQm94T3V0TWFwKG1hcCwgcHBzLT5zbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZywKLSAgICAgICAgICAgICAgdW5pdHNJblNsaWNlR3JvdXAwLCBwaWNXaWR0aCwgcGljSGVpZ2h0KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIERlY29kZVJhc3RlclNjYW5NYXAobWFwLAotICAgICAgICAgICAgICBwcHMtPnNsaWNlR3JvdXBDaGFuZ2VEaXJlY3Rpb25GbGFnLCBzaXplT2ZVcHBlckxlZnRHcm91cCwKLSAgICAgICAgICAgICAgcGljU2l6ZSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICBEZWNvZGVXaXBlTWFwKG1hcCwgcHBzLT5zbGljZUdyb3VwQ2hhbmdlRGlyZWN0aW9uRmxhZywKLSAgICAgICAgICAgICAgc2l6ZU9mVXBwZXJMZWZ0R3JvdXAsIHBpY1dpZHRoLCBwaWNIZWlnaHQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFTU0VSVChwcHMtPnNsaWNlR3JvdXBJZCk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGljU2l6ZTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFTU0VSVChwcHMtPnNsaWNlR3JvdXBJZFtpXSA8IHBwcy0+bnVtU2xpY2VHcm91cHMpOwotICAgICAgICAgICAgICAgIG1hcFtpXSA9IHBwcy0+c2xpY2VHcm91cElkW2ldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9ncm91cF9tYXAuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9ncm91cF9tYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJjYjZmMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfZ3JvdXBfbWFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX1NMSUNFX0dST1VQX01BUF9ICi0jZGVmaW5lIEgyNjRTV0RFQ19TTElDRV9HUk9VUF9NQVBfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9waWNfcGFyYW1fc2V0LmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBoMjY0YnNkRGVjb2RlU2xpY2VHcm91cE1hcCgKLSAgdTMyICptYXAsCi0gIHBpY1BhcmFtU2V0X3QgKnBwcywKLSAgdTMyIHNsaWNlR3JvdXBDaGFuZ2VDeWNsZSwKLSAgdTMyIHBpY1dpZHRoLAotICB1MzIgcGljSGVpZ2h0KTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfU0xJQ0VfR1JPVVBfTUFQX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2hlYWRlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2hlYWRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzQwMWM2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIGgyNjRic2REZWNvZGVTbGljZUhlYWRlcgotICAgICAgICAgIE51bVNsaWNlR3JvdXBDaGFuZ2VDeWNsZUJpdHMKLSAgICAgICAgICBSZWZQaWNMaXN0UmVvcmRlcmluZwotICAgICAgICAgIERlY1JlZlBpY01hcmtpbmcKLSAgICAgICAgICBDaGVja1Bwc0lkCi0gICAgICAgICAgQ2hlY2tGcmFtZU51bQotICAgICAgICAgIENoZWNrSWRyUGljSWQKLSAgICAgICAgICBDaGVja1BpY09yZGVyQ250THNiCi0gICAgICAgICAgQ2hlY2tEZWx0YVBpY09yZGVyQ250Qm90dG9tCi0gICAgICAgICAgQ2hlY2tEZWx0YVBpY09yZGVyQ250Ci0gICAgICAgICAgQ2hlY2tSZWR1bmRhbnRQaWNDbnQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotI2luY2x1ZGUgImgyNjRic2RfdmxjLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9uYWxfdW5pdC5oIgotI2luY2x1ZGUgImgyNjRic2RfZHBiLmgiCi0KLSNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB1MzIgUmVmUGljTGlzdFJlb3JkZXJpbmcoc3RybURhdGFfdCAqLCByZWZQaWNMaXN0UmVvcmRlcmluZ190ICosCi0gICAgdTMyLCB1MzIpOwotCi1zdGF0aWMgdTMyIE51bVNsaWNlR3JvdXBDaGFuZ2VDeWNsZUJpdHModTMyIHBpY1NpemVJbk1icywKLSAgICB1MzIgc2xpY2VHcm91cENoYW5nZVJhdGUpOwotCi1zdGF0aWMgdTMyIERlY1JlZlBpY01hcmtpbmcoc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICAgIGRlY1JlZlBpY01hcmtpbmdfdCAqcERlY1JlZlBpY01hcmtpbmcsIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCi0gICAgdTMyIG51bVJlZkZyYW1lcyk7Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6IGgyNjRic2REZWNvZGVTbGljZUhlYWRlcgotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBEZWNvZGUgc2xpY2UgaGVhZGVyIGRhdGEgZnJvbSB0aGUgc3RyZWFtLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgcFNlcVBhcmFtU2V0ICAgIHBvaW50ZXIgdG8gYWN0aXZlIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQKLSAgICAgICAgICAgIHBQaWNQYXJhbVNldCAgICBwb2ludGVyIHRvIGFjdGl2ZSBwaWN0dXJlIHBhcmFtZXRlciBzZXQKLSAgICAgICAgICAgIHBOYWxVbml0ICAgICAgICBwb2ludGVyIHRvIGN1cnJlbnQgTkFMIHVuaXQgc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHBTbGljZUhlYWRlciAgICBkZWNvZGVkIGRhdGEgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhIG9yIGVuZCBvZiBzdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVTbGljZUhlYWRlcihzdHJtRGF0YV90ICpwU3RybURhdGEsIHNsaWNlSGVhZGVyX3QgKnBTbGljZUhlYWRlciwKLSAgICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsIHBpY1BhcmFtU2V0X3QgKnBQaWNQYXJhbVNldCwKLSAgICBuYWxVbml0X3QgKnBOYWxVbml0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIGksIHZhbHVlOwotICAgIGkzMiBpdG1wOwotICAgIHUzMiBwaWNTaXplSW5NYnM7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwU2xpY2VIZWFkZXIpOwotICAgIEFTU0VSVChwU2VxUGFyYW1TZXQpOwotICAgIEFTU0VSVChwUGljUGFyYW1TZXQpOwotICAgIEFTU0VSVCggcE5hbFVuaXQtPm5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRSB8fAotICAgICAgICAgICAgcE5hbFVuaXQtPm5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIgKTsKLQotCi0gICAgSDI2NFN3RGVjTWVtc2V0KHBTbGljZUhlYWRlciwgMCwgc2l6ZW9mKHNsaWNlSGVhZGVyX3QpKTsKLQotICAgIHBpY1NpemVJbk1icyA9IHBTZXFQYXJhbVNldC0+cGljV2lkdGhJbk1icyAqIHBTZXFQYXJhbVNldC0+cGljSGVpZ2h0SW5NYnM7Ci0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgcFNsaWNlSGVhZGVyLT5maXJzdE1iSW5TbGljZSA9IHZhbHVlOwotICAgIGlmICh2YWx1ZSA+PSBwaWNTaXplSW5NYnMpCi0gICAgewotICAgICAgICBFUFJJTlQoImZpcnN0X21iX2luX3NsaWNlIik7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBwU2xpY2VIZWFkZXItPnNsaWNlVHlwZSA9IHZhbHVlOwotICAgIC8qIHNsaWNlIHR5cGUgaGFzIHRvIGJlIGVpdGhlciBJIG9yIFAgc2xpY2UuIFAgc2xpY2UgaXMgbm90IGFsbG93ZWQgd2hlbgotICAgICAqIGN1cnJlbnQgTkFMIHVuaXQgaXMgYW4gSURSIE5BTCB1bml0IG9yIG51bV9yZWZfZnJhbWVzIGlzIDAgKi8KLSAgICBpZiAoICFJU19JX1NMSUNFKHBTbGljZUhlYWRlci0+c2xpY2VUeXBlKSAmJgotICAgICAgICAgKCAhSVNfUF9TTElDRShwU2xpY2VIZWFkZXItPnNsaWNlVHlwZSkgfHwKLSAgICAgICAgICAgSVNfSURSX05BTF9VTklUKHBOYWxVbml0KSB8fAotICAgICAgICAgICAhcFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXMgKSApCi0gICAgewotICAgICAgICBFUFJJTlQoInNsaWNlX3R5cGUiKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIHBTbGljZUhlYWRlci0+cGljUGFyYW1ldGVyU2V0SWQgPSB2YWx1ZTsKLSAgICBpZiAocFNsaWNlSGVhZGVyLT5waWNQYXJhbWV0ZXJTZXRJZCAhPSBwUGljUGFyYW1TZXQtPnBpY1BhcmFtZXRlclNldElkKQotICAgIHsKLSAgICAgICAgRVBSSU5UKCJwaWNfcGFyYW1ldGVyX3NldF9pZCIpOwotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgLyogbG9nMihtYXhGcmFtZU51bSkgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IGZyYW1lX251bSAqLwotICAgIGkgPSAwOwotICAgIHdoaWxlIChwU2VxUGFyYW1TZXQtPm1heEZyYW1lTnVtID4+IGkpCi0gICAgICAgIGkrKzsKLSAgICBpLS07Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIGkpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIGlmIChJU19JRFJfTkFMX1VOSVQocE5hbFVuaXQpICYmIHRtcCAhPSAwKQotICAgIHsKLSAgICAgICAgRVBSSU5UKCJmcmFtZV9udW0iKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLSAgICBwU2xpY2VIZWFkZXItPmZyYW1lTnVtID0gdG1wOwotCi0gICAgaWYgKElTX0lEUl9OQUxfVU5JVChwTmFsVW5pdCkpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICBwU2xpY2VIZWFkZXItPmlkclBpY0lkID0gdmFsdWU7Ci0gICAgICAgIGlmICh2YWx1ZSA+IDY1NTM1KQotICAgICAgICB7Ci0gICAgICAgICAgICBFUFJJTlQoImlkcl9waWNfaWQiKTsKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9PSAwKQotICAgIHsKLSAgICAgICAgLyogbG9nMihtYXhQaWNPcmRlckNudExzYikgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IHBpY19vcmRlcl9jbnRfbHNiICovCi0gICAgICAgIGkgPSAwOwotICAgICAgICB3aGlsZSAocFNlcVBhcmFtU2V0LT5tYXhQaWNPcmRlckNudExzYiA+PiBpKQotICAgICAgICAgICAgaSsrOwotICAgICAgICBpLS07Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCBpKTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwU2xpY2VIZWFkZXItPnBpY09yZGVyQ250THNiID0gdG1wOwotCi0gICAgICAgIGlmIChwUGljUGFyYW1TZXQtPnBpY09yZGVyUHJlc2VudEZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgIHBTbGljZUhlYWRlci0+ZGVsdGFQaWNPcmRlckNudEJvdHRvbSA9IGl0bXA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBjaGVjayB0aGF0IHBpY09yZGVyQ250IGZvciBJRFIgcGljdHVyZSB3aWxsIGJlIHplcm8uIFNlZQotICAgICAgICAgKiBEZWNvZGVQaWNPcmRlckNudCBmdW5jdGlvbiB0byB1bmRlcnN0YW5kIHRoZSBsb2dpYyBoZXJlICovCi0gICAgICAgIGlmICggSVNfSURSX05BTF9VTklUKHBOYWxVbml0KSAmJgotICAgICAgICAgICAgICggKHBTbGljZUhlYWRlci0+cGljT3JkZXJDbnRMc2IgPgotICAgICAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+bWF4UGljT3JkZXJDbnRMc2IvMikgfHwKLSAgICAgICAgICAgICAgICBNSU4oKGkzMilwU2xpY2VIZWFkZXItPnBpY09yZGVyQ250THNiLAotICAgICAgICAgICAgICAgICAgICAoaTMyKXBTbGljZUhlYWRlci0+cGljT3JkZXJDbnRMc2IgKwotICAgICAgICAgICAgICAgICAgICBwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRCb3R0b20pICE9IDAgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICggKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID09IDEpICYmCi0gICAgICAgICAhcFNlcVBhcmFtU2V0LT5kZWx0YVBpY09yZGVyQWx3YXlzWmVyb0ZsYWcgKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgcFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250WzBdID0gaXRtcDsKLQotICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT5waWNPcmRlclByZXNlbnRGbGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHBTdHJtRGF0YSwgJml0bXApOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICBwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRbMV0gPSBpdG1wOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogY2hlY2sgdGhhdCBwaWNPcmRlckNudCBmb3IgSURSIHBpY3R1cmUgd2lsbCBiZSB6ZXJvLiBTZWUKLSAgICAgICAgICogRGVjb2RlUGljT3JkZXJDbnQgZnVuY3Rpb24gdG8gdW5kZXJzdGFuZCB0aGUgbG9naWMgaGVyZSAqLwotICAgICAgICBpZiAoIElTX0lEUl9OQUxfVU5JVChwTmFsVW5pdCkgJiYKLSAgICAgICAgICAgICBNSU4ocFNsaWNlSGVhZGVyLT5kZWx0YVBpY09yZGVyQ250WzBdLAotICAgICAgICAgICAgICAgICBwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRbMF0gKwotICAgICAgICAgICAgICAgICBwU2VxUGFyYW1TZXQtPm9mZnNldEZvclRvcFRvQm90dG9tRmllbGQgKwotICAgICAgICAgICAgICAgICBwU2xpY2VIZWFkZXItPmRlbHRhUGljT3JkZXJDbnRbMV0pICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChwUGljUGFyYW1TZXQtPnJlZHVuZGFudFBpY0NudFByZXNlbnRGbGFnKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgcFNsaWNlSGVhZGVyLT5yZWR1bmRhbnRQaWNDbnQgPSB2YWx1ZTsKLSAgICAgICAgaWYgKHZhbHVlID4gMTI3KQotICAgICAgICB7Ci0gICAgICAgICAgICBFUFJJTlQoInJlZHVuZGFudF9waWNfY250Iik7Ci0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoSVNfUF9TTElDRShwU2xpY2VIZWFkZXItPnNsaWNlVHlwZSkpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBTbGljZUhlYWRlci0+bnVtUmVmSWR4QWN0aXZlT3ZlcnJpZGVGbGFnID0gdG1wOwotCi0gICAgICAgIGlmIChwU2xpY2VIZWFkZXItPm51bVJlZklkeEFjdGl2ZU92ZXJyaWRlRmxhZykKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgaWYgKHZhbHVlID4gMTUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVBSSU5UKCJudW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5udW1SZWZJZHhMMEFjdGl2ZSA9IHZhbHVlICsgMTsKLSAgICAgICAgfQotICAgICAgICAvKiBzZXQgbnVtUmVmSWR4TDBBY3RpdmUgZnJvbSBwaWMgcGFyYW0gc2V0ICovCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogaWYgdmFsdWUgKG1pbnVzMSkgaW4gcGljdHVyZSBwYXJhbWV0ZXIgc2V0IGV4Y2VlZHMgMTUgaXQgc2hvdWxkCi0gICAgICAgICAgICAgKiBoYXZlIGJlZW4gb3ZlcnJpZGRlbiBoZXJlICovCi0gICAgICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT5udW1SZWZJZHhMMEFjdGl2ZSA+IDE2KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVQUklOVCgibnVtX3JlZl9pZHhfYWN0aXZlX292ZXJyaWRlX2ZsYWciKTsKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwU2xpY2VIZWFkZXItPm51bVJlZklkeEwwQWN0aXZlID0gcFBpY1BhcmFtU2V0LT5udW1SZWZJZHhMMEFjdGl2ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChJU19QX1NMSUNFKHBTbGljZUhlYWRlci0+c2xpY2VUeXBlKSkKLSAgICB7Ci0gICAgICAgIHRtcCA9IFJlZlBpY0xpc3RSZW9yZGVyaW5nKHBTdHJtRGF0YSwKLSAgICAgICAgICAgICZwU2xpY2VIZWFkZXItPnJlZlBpY0xpc3RSZW9yZGVyaW5nLAotICAgICAgICAgICAgcFNsaWNlSGVhZGVyLT5udW1SZWZJZHhMMEFjdGl2ZSwKLSAgICAgICAgICAgIHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0pOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgIH0KLQotICAgIGlmIChwTmFsVW5pdC0+bmFsUmVmSWRjICE9IDApCi0gICAgewotICAgICAgICB0bXAgPSBEZWNSZWZQaWNNYXJraW5nKHBTdHJtRGF0YSwgJnBTbGljZUhlYWRlci0+ZGVjUmVmUGljTWFya2luZywKLSAgICAgICAgICAgIHBOYWxVbml0LT5uYWxVbml0VHlwZSwgcFNlcVBhcmFtU2V0LT5udW1SZWZGcmFtZXMpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgIH0KLQotICAgIC8qIGRlY29kZSBzbGljZVFwRGVsdGEgYW5kIGNoZWNrIHRoYXQgaW5pdGlhbCBRUCBmb3IgdGhlIHNsaWNlIHdpbGwgYmUgb24KLSAgICAgKiB0aGUgcmFuZ2UgWzAsIDUxXSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotICAgIHBTbGljZUhlYWRlci0+c2xpY2VRcERlbHRhID0gaXRtcDsKLSAgICBpdG1wICs9IChpMzIpcFBpY1BhcmFtU2V0LT5waWNJbml0UXA7Ci0gICAgaWYgKCAoaXRtcCA8IDApIHx8IChpdG1wID4gNTEpICkKLSAgICB7Ci0gICAgICAgIEVQUklOVCgic2xpY2VfcXBfZGVsdGEiKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIGlmIChwUGljUGFyYW1TZXQtPmRlYmxvY2tpbmdGaWx0ZXJDb250cm9sUHJlc2VudEZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICBwU2xpY2VIZWFkZXItPmRpc2FibGVEZWJsb2NraW5nRmlsdGVySWRjID0gdmFsdWU7Ci0gICAgICAgIGlmIChwU2xpY2VIZWFkZXItPmRpc2FibGVEZWJsb2NraW5nRmlsdGVySWRjID4gMikKLSAgICAgICAgewotICAgICAgICAgICAgRVBSSU5UKCJkaXNhYmxlX2RlYmxvY2tpbmdfZmlsdGVyX2lkYyIpOwotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBTbGljZUhlYWRlci0+ZGlzYWJsZURlYmxvY2tpbmdGaWx0ZXJJZGMgIT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZChwU3RybURhdGEsICZpdG1wKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgaWYgKCAoaXRtcCA8IC02KSB8fCAoaXRtcCA+IDYpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIEVQUklOVCgic2xpY2VfYWxwaGFfYzBfb2Zmc2V0X2RpdjIiKTsKLSAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBTbGljZUhlYWRlci0+c2xpY2VBbHBoYUMwT2Zmc2V0ID0gaXRtcCAqIDI7Ci0KLSAgICAgICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQocFN0cm1EYXRhLCAmaXRtcCk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgIGlmICggKGl0bXAgPCAtNikgfHwgKGl0bXAgPiA2KSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBFUFJJTlQoInNsaWNlX2JldGFfb2Zmc2V0X2RpdjIiKTsKLSAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBTbGljZUhlYWRlci0+c2xpY2VCZXRhT2Zmc2V0ID0gaXRtcCAqIDI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIChwUGljUGFyYW1TZXQtPm51bVNsaWNlR3JvdXBzID4gMSkgJiYKLSAgICAgICAgIChwUGljUGFyYW1TZXQtPnNsaWNlR3JvdXBNYXBUeXBlID49IDMpICYmCi0gICAgICAgICAocFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwTWFwVHlwZSA8PSA1KSApCi0gICAgewotICAgICAgICAvKiBzZXQgdG1wIHRvIG51bWJlciBvZiBiaXRzIHVzZWQgdG8gcmVwcmVzZW50IHNsaWNlX2dyb3VwX2NoYW5nZV9jeWNsZQotICAgICAgICAgKiBpbiB0aGUgc3RyZWFtICovCi0gICAgICAgIHRtcCA9IE51bVNsaWNlR3JvdXBDaGFuZ2VDeWNsZUJpdHMocGljU2l6ZUluTWJzLAotICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwQ2hhbmdlUmF0ZSk7Ci0gICAgICAgIHZhbHVlID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCB0bXApOwotICAgICAgICBpZiAodmFsdWUgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFNsaWNlSGVhZGVyLT5zbGljZUdyb3VwQ2hhbmdlQ3ljbGUgPSB2YWx1ZTsKLQotICAgICAgICAvKiBjb3JyZXNwb25kcyB0byB0bXAgPSBDZWlsKHBpY1NpemVJbk1icyAvIHNsaWNlR3JvdXBDaGFuZ2VSYXRlKSAqLwotICAgICAgICB0bXAgPSAocGljU2l6ZUluTWJzICsgcFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwQ2hhbmdlUmF0ZSAtIDEpIC8KLSAgICAgICAgICAgICAgcFBpY1BhcmFtU2V0LT5zbGljZUdyb3VwQ2hhbmdlUmF0ZTsKLSAgICAgICAgaWYgKHBTbGljZUhlYWRlci0+c2xpY2VHcm91cENoYW5nZUN5Y2xlID4gdG1wKQotICAgICAgICB7Ci0gICAgICAgICAgICBFUFJJTlQoInNsaWNlX2dyb3VwX2NoYW5nZV9jeWNsZSIpOwotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBOdW1TbGljZUdyb3VwQ2hhbmdlQ3ljbGVCaXRzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIERldGVybWluZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgdG8gcmVwcmVzZW50Ci0gICAgICAgICAgICBzbGljZV9ncm91cF9jaGFuZ2VfY3ljbGUgaW4gdGhlIHN0cmVhbS4gVGhlIHN0YW5kYXJkIHN0YXRlcyB0aGF0Ci0gICAgICAgICAgICBzbGljZV9ncm91cF9jaGFuZ2VfY3ljbGUgaXMgcmVwcmVzZW50ZWQgYnkKLSAgICAgICAgICAgICAgICBDZWlsKCBMb2cyKCAocGljU2l6ZUluTWJzIC8gc2xpY2VHcm91cENoYW5nZVJhdGUpICsgMSkgKQotCi0gICAgICAgICAgICBiaXRzLiBEaXZpc2lvbiAiLyIgaW4gdGhlIGVxdWF0aW9uIGlzIG5vbi10cnVuY2F0aW5nIGRpdmlzaW9uLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBpY1NpemVJbk1icyAgICAgICAgICAgIHBpY3R1cmUgc2l6ZSBpbiBtYWNyb2Jsb2NrcwotICAgICAgICAgICAgc2xpY2VHcm91cENoYW5nZVJhdGUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBudW1iZXIgb2YgYml0cyBuZWVkZWQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIE51bVNsaWNlR3JvdXBDaGFuZ2VDeWNsZUJpdHModTMyIHBpY1NpemVJbk1icywgdTMyIHNsaWNlR3JvdXBDaGFuZ2VSYXRlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsbnVtQml0cyxtYXNrOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocGljU2l6ZUluTWJzKTsKLSAgICBBU1NFUlQoc2xpY2VHcm91cENoYW5nZVJhdGUpOwotICAgIEFTU0VSVChzbGljZUdyb3VwQ2hhbmdlUmF0ZSA8PSBwaWNTaXplSW5NYnMpOwotCi0gICAgLyogY29tcHV0ZSAocGljU2l6ZUluTWJzIC8gc2xpY2VHcm91cENoYW5nZVJhdGUgKyAxKSwgcm91bmRlZCB1cCAqLwotICAgIGlmIChwaWNTaXplSW5NYnMgJSBzbGljZUdyb3VwQ2hhbmdlUmF0ZSkKLSAgICAgICAgdG1wID0gMiArIHBpY1NpemVJbk1icy9zbGljZUdyb3VwQ2hhbmdlUmF0ZTsKLSAgICBlbHNlCi0gICAgICAgIHRtcCA9IDEgKyBwaWNTaXplSW5NYnMvc2xpY2VHcm91cENoYW5nZVJhdGU7Ci0KLSAgICBudW1CaXRzID0gMDsKLSAgICBtYXNrID0gfjBVOwotCi0gICAgLyogc2V0IG51bUJpdHMgdG8gcG9zaXRpb24gb2YgcmlnaHQtbW9zdCBub24temVybyBiaXQgKi8KLSAgICB3aGlsZSAodG1wICYgKG1hc2s8PCsrbnVtQml0cykpCi0gICAgICAgIDsKLSAgICBudW1CaXRzLS07Ci0KLSAgICAvKiBhZGQgb25lIG1vcmUgYml0IGlmIHZhbHVlIGdyZWF0ZXIgdGhhbiAyXm51bUJpdHMgKi8KLSAgICBpZiAodG1wICYgKCgxPDxudW1CaXRzKS0xKSkKLSAgICAgICAgbnVtQml0cysrOwotCi0gICAgcmV0dXJuKG51bUJpdHMpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogUmVmUGljTGlzdFJlb3JkZXJpbmcKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRGVjb2RlIHJlZmVyZW5jZSBwaWN0dXJlIGxpc3QgcmVvcmRlcmluZyBzeW50YXggZWxlbWVudHMgZnJvbQotICAgICAgICAgICAgdGhlIHN0cmVhbS4gTWF4IG51bWJlciBvZiByZW9yZGVyaW5nIGNvbW1hbmRzIGlzIG51bVJlZklkeEFjdGl2ZS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIG51bVJlZklkeEFjdGl2ZSBudW1iZXIgb2YgYWN0aXZlIHJlZmVyZW5jZSBpbmRpY2VzIHRvIGJlIHVzZWQgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBzbGljZQotICAgICAgICAgICAgbWF4UGljTnVtICAgICAgIG1heEZyYW1lTnVtIGZyb20gdGhlIGFjdGl2ZSBTUFMKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgcFJlZlBpY0xpc3RSZW9yZGVyaW5nICAgZGVjb2RlZCBkYXRhIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgUmVmUGljTGlzdFJlb3JkZXJpbmcoc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICAgIHJlZlBpY0xpc3RSZW9yZGVyaW5nX3QgKnBSZWZQaWNMaXN0UmVvcmRlcmluZywgdTMyIG51bVJlZklkeEFjdGl2ZSwKLSAgICB1MzIgbWF4UGljTnVtKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIHZhbHVlLCBpOwotICAgIHUzMiBjb21tYW5kOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFJlZlBpY0xpc3RSZW9yZGVyaW5nKTsKLSAgICBBU1NFUlQobnVtUmVmSWR4QWN0aXZlKTsKLSAgICBBU1NFUlQobWF4UGljTnVtKTsKLQotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIHBSZWZQaWNMaXN0UmVvcmRlcmluZy0+cmVmUGljTGlzdFJlb3JkZXJpbmdGbGFnTDAgPSB0bXA7Ci0KLSAgICBpZiAocFJlZlBpY0xpc3RSZW9yZGVyaW5nLT5yZWZQaWNMaXN0UmVvcmRlcmluZ0ZsYWdMMCkKLSAgICB7Ci0gICAgICAgIGkgPSAwOwotCi0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpID4gbnVtUmVmSWR4QWN0aXZlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVQUklOVCgiVG9vIG1hbnkgcmVvcmRlcmluZyBjb21tYW5kcyIpOwotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJmNvbW1hbmQpOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICBpZiAoY29tbWFuZCA+IDMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRVBSSU5UKCJyZW9yZGVyaW5nX29mX3BpY19udW1zX2lkYyIpOwotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcFJlZlBpY0xpc3RSZW9yZGVyaW5nLT5jb21tYW5kW2ldLnJlb3JkZXJpbmdPZlBpY051bXNJZGMgPSBjb21tYW5kOwotCi0gICAgICAgICAgICBpZiAoKGNvbW1hbmQgPT0gMCkgfHwgKGNvbW1hbmQgPT0gMSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID49IG1heFBpY051bSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEVQUklOVCgiYWJzX2RpZmZfcGljX251bV9taW51czEiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwUmVmUGljTGlzdFJlb3JkZXJpbmctPmNvbW1hbmRbaV0uYWJzRGlmZlBpY051bSA9IHZhbHVlICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjb21tYW5kID09IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICAgICAgcFJlZlBpY0xpc3RSZW9yZGVyaW5nLT5jb21tYW5kW2ldLmxvbmdUZXJtUGljTnVtID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgaSsrOwotICAgICAgICB9IHdoaWxlIChjb21tYW5kICE9IDMpOwotCi0gICAgICAgIC8qIHRoZXJlIHNoYWxsIGJlIGF0IGxlYXN0IG9uZSByZW9yZGVyaW5nIGNvbW1hbmQgaWYKLSAgICAgICAgICogcmVmUGljTGlzdFJlb3JkZXJpbmdGbGFnTDAgd2FzIHNldCAqLwotICAgICAgICBpZiAoaSA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBFUFJJTlQoInJlZl9waWNfbGlzdF9yZW9yZGVyaW5nIik7Ci0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY1JlZlBpY01hcmtpbmcKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRGVjb2RlIGRlY29kZWQgcmVmZXJlbmNlIHBpY3R1cmUgbWFya2luZyBzeW50YXggZWxlbWVudHMgZnJvbQotICAgICAgICAgICAgdGhlIHN0cmVhbS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIG5hbFVuaXRUeXBlICAgICB0eXBlIG9mIHRoZSBjdXJyZW50IE5BTCB1bml0Ci0gICAgICAgICAgICBudW1SZWZGcmFtZXMgICAgbWF4IG51bWJlciBvZiByZWZlcmVuY2UgZnJhbWVzIGZyb20gdGhlIGFjdGl2ZSBTUFMKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgcERlY1JlZlBpY01hcmtpbmcgICBkZWNvZGVkIGRhdGEgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBEZWNSZWZQaWNNYXJraW5nKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgICBkZWNSZWZQaWNNYXJraW5nX3QgKnBEZWNSZWZQaWNNYXJraW5nLCBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlLAotICAgIHUzMiBudW1SZWZGcmFtZXMpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgdmFsdWU7Ci0gICAgdTMyIGk7Ci0gICAgdTMyIG9wZXJhdGlvbjsKLSAgICAvKiB2YXJpYWJsZXMgZm9yIGVycm9yIGNoZWNraW5nIHB1cnBvc2VzLCBzdG9yZSBudW1iZXIgb2YgbWVtb3J5Ci0gICAgICogbWFuYWdlbWVudCBvcGVyYXRpb25zIG9mIGNlcnRhaW4gdHlwZSAqLwotICAgIHUzMiBudW00ID0gMCwgbnVtNSA9IDAsIG51bTYgPSAwLCBudW0xdG8zID0gMDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKCBuYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSIHx8Ci0gICAgICAgICAgICBuYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0UgfHwKLSAgICAgICAgICAgIG5hbFVuaXRUeXBlID09IE5BTF9TRUkgKTsKLQotCi0gICAgaWYgKG5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBEZWNSZWZQaWNNYXJraW5nLT5ub091dHB1dE9mUHJpb3JQaWNzRmxhZyA9IHRtcDsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBEZWNSZWZQaWNNYXJraW5nLT5sb25nVGVybVJlZmVyZW5jZUZsYWcgPSB0bXA7Ci0gICAgICAgIGlmICghbnVtUmVmRnJhbWVzICYmIHBEZWNSZWZQaWNNYXJraW5nLT5sb25nVGVybVJlZmVyZW5jZUZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVQUklOVCgibG9uZ190ZXJtX3JlZmVyZW5jZV9mbGFnIik7Ci0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwRGVjUmVmUGljTWFya2luZy0+YWRhcHRpdmVSZWZQaWNNYXJraW5nTW9kZUZsYWcgPSB0bXA7Ci0gICAgICAgIGlmIChwRGVjUmVmUGljTWFya2luZy0+YWRhcHRpdmVSZWZQaWNNYXJraW5nTW9kZUZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGkgPSAwOwotICAgICAgICAgICAgZG8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBzZWUgZXhwbGFuYXRpb24gb2YgdGhlIE1BWF9OVU1fTU1DX09QRVJBVElPTlMgaW4KLSAgICAgICAgICAgICAgICAgKiBzbGljZV9oZWFkZXIuaCAqLwotICAgICAgICAgICAgICAgIGlmIChpID4gKDIgKiBudW1SZWZGcmFtZXMgKyAyKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEVQUklOVCgiVG9vIG1hbnkgbWFuYWdlbWVudCBvcGVyYXRpb25zIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmb3BlcmF0aW9uKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA+IDYpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFUFJJTlQoIm1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwRGVjUmVmUGljTWFya2luZy0+b3BlcmF0aW9uW2ldLgotICAgICAgICAgICAgICAgICAgICBtZW1vcnlNYW5hZ2VtZW50Q29udHJvbE9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKLSAgICAgICAgICAgICAgICBpZiAoKG9wZXJhdGlvbiA9PSAxKSB8fCAob3BlcmF0aW9uID09IDMpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgICAgICAgICAgcERlY1JlZlBpY01hcmtpbmctPm9wZXJhdGlvbltpXS5kaWZmZXJlbmNlT2ZQaWNOdW1zID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICsgMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PSAyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgICAgICAgICAgcERlY1JlZlBpY01hcmtpbmctPm9wZXJhdGlvbltpXS5sb25nVGVybVBpY051bSA9IHZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKG9wZXJhdGlvbiA9PSAzKSB8fCAob3BlcmF0aW9uID09IDYpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgICAgICAgICAgICAgcERlY1JlZlBpY01hcmtpbmctPm9wZXJhdGlvbltpXS5sb25nVGVybUZyYW1lSWR4ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uID09IDQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICAgICAgICAgICAgICAvKiB2YWx1ZSBzaGFsbCBiZSBpbiByYW5nZSBbMCwgbnVtUmVmRnJhbWVzXSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPiBudW1SZWZGcmFtZXMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEVQUklOVCgibWF4X2xvbmdfdGVybV9mcmFtZV9pZHhfcGx1czEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcERlY1JlZlBpY01hcmtpbmctPm9wZXJhdGlvbltpXS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhMb25nVGVybUZyYW1lSWR4ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT19MT05HX1RFUk1fRlJBTUVfSU5ESUNFUzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNSZWZQaWNNYXJraW5nLT5vcGVyYXRpb25baV0uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TG9uZ1Rlcm1GcmFtZUlkeCA9IHZhbHVlIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBudW00Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb24gPT0gNSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG51bTUrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiAmJiBvcGVyYXRpb24gPD0gMykKLSAgICAgICAgICAgICAgICAgICAgbnVtMXRvMysrOwotICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb24gPT0gNikKLSAgICAgICAgICAgICAgICAgICAgbnVtNisrOwotCi0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgfSB3aGlsZSAob3BlcmF0aW9uICE9IDApOwotCi0gICAgICAgICAgICAvKiBlcnJvciBjaGVja2luZyAqLwotICAgICAgICAgICAgaWYgKG51bTQgPiAxIHx8IG51bTUgPiAxIHx8IG51bTYgPiAxIHx8IChudW0xdG8zICYmIG51bTUpKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbiBuYW1lOiBoMjY0YnNkQ2hlY2tQcHNJZAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBQZWVrIHZhbHVlIG9mIHBpY19wYXJhbWV0ZXJfc2V0X2lkIGZyb20gdGhlIHNsaWNlIGhlYWRlci4gRnVuY3Rpb24KLSAgICAgICAgICAgIGRvZXMgbm90IG1vZGlmeSBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbnMgYnV0IGNvcGllcyB0aGUgc3RyZWFtCi0gICAgICAgICAgICBkYXRhIHN0cnVjdHVyZSB0byB0bXAgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgd2hpbGUgYWNjZXNzaW5nCi0gICAgICAgICAgICBzdHJlYW0gZGF0YS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgcGljUGFyYW1TZXRJZCAgIHZhbHVlIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZENoZWNrUHBzSWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgKnBpY1BhcmFtU2V0SWQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgdmFsdWU7Ci0gICAgc3RybURhdGFfdCB0bXBTdHJtRGF0YVsxXTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0KLSAgICAvKiBkb24ndCB0b3VjaCBvcmlnaW5hbCBzdHJlYW0gcG9zaXRpb24gcGFyYW1zICovCi0gICAgKnRtcFN0cm1EYXRhID0gKnBTdHJtRGF0YTsKLQotICAgIC8qIGZpcnN0X21iX2luX3NsaWNlICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIHNsaWNlX3R5cGUgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICBpZiAodmFsdWUgPj0gTUFYX05VTV9QSUNfUEFSQU1fU0VUUykKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgKnBpY1BhcmFtU2V0SWQgPSB2YWx1ZTsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZENoZWNrRnJhbWVOdW0KLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgUGVlayB2YWx1ZSBvZiBmcmFtZV9udW0gZnJvbSB0aGUgc2xpY2UgaGVhZGVyLiBGdW5jdGlvbiBkb2VzIG5vdAotICAgICAgICAgICAgbW9kaWZ5IGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9ucyBidXQgY29waWVzIHRoZSBzdHJlYW0gZGF0YQotICAgICAgICAgICAgc3RydWN0dXJlIHRvIHRtcCBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCB3aGlsZSBhY2Nlc3Npbmcgc3RyZWFtCi0gICAgICAgICAgICBkYXRhLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgbWF4RnJhbWVOdW0KLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgZnJhbWVOdW0gICAgICAgIHZhbHVlIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZENoZWNrRnJhbWVOdW0oCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgdTMyIG1heEZyYW1lTnVtLAotICB1MzIgKmZyYW1lTnVtKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIHZhbHVlLCBpOwotICAgIHN0cm1EYXRhX3QgdG1wU3RybURhdGFbMV07Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChtYXhGcmFtZU51bSk7Ci0gICAgQVNTRVJUKGZyYW1lTnVtKTsKLQotICAgIC8qIGRvbid0IHRvdWNoIG9yaWdpbmFsIHN0cmVhbSBwb3NpdGlvbiBwYXJhbXMgKi8KLSAgICAqdG1wU3RybURhdGEgPSAqcFN0cm1EYXRhOwotCi0gICAgLyogc2tpcCBmaXJzdF9tYl9pbl9zbGljZSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBza2lwIHNsaWNlX3R5cGUgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogc2tpcCBwaWNfcGFyYW1ldGVyX3NldF9pZCAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBsb2cyKG1heEZyYW1lTnVtKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgZnJhbWVfbnVtICovCi0gICAgaSA9IDA7Ci0gICAgd2hpbGUgKG1heEZyYW1lTnVtID4+IGkpCi0gICAgICAgIGkrKzsKLSAgICBpLS07Ci0KLSAgICAvKiBmcmFtZV9udW0gKi8KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgKmZyYW1lTnVtID0gdG1wOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkQ2hlY2tJZHJQaWNJZAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBQZWVrIHZhbHVlIG9mIGlkcl9waWNfaWQgZnJvbSB0aGUgc2xpY2UgaGVhZGVyLiBGdW5jdGlvbiBkb2VzIG5vdAotICAgICAgICAgICAgbW9kaWZ5IGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9ucyBidXQgY29waWVzIHRoZSBzdHJlYW0gZGF0YQotICAgICAgICAgICAgc3RydWN0dXJlIHRvIHRtcCBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCB3aGlsZSBhY2Nlc3Npbmcgc3RyZWFtCi0gICAgICAgICAgICBkYXRhLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgbWF4RnJhbWVOdW0gICAgIG1heCBmcmFtZSBudW1iZXIgZnJvbSBhY3RpdmUgU1BTCi0gICAgICAgICAgICBuYWxVbml0VHlwZSAgICAgdHlwZSBvZiB0aGUgY3VycmVudCBOQUwgdW5pdAotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBpZHJQaWNJZCAgICAgICAgdmFsdWUgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkQ2hlY2tJZHJQaWNJZCgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICB1MzIgbWF4RnJhbWVOdW0sCi0gIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCi0gIHUzMiAqaWRyUGljSWQpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgdmFsdWUsIGk7Ci0gICAgc3RybURhdGFfdCB0bXBTdHJtRGF0YVsxXTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKG1heEZyYW1lTnVtKTsKLSAgICBBU1NFUlQoaWRyUGljSWQpOwotCi0gICAgLyogbmFsVW5pdFR5cGUgbXVzdCBiZSBlcXVhbCB0byA1IGJlY2F1c2Ugb3RoZXJ3aXNlIGlkclBpY0lkIGlzIG5vdAotICAgICAqIHByZXNlbnQgKi8KLSAgICBpZiAobmFsVW5pdFR5cGUgIT0gTkFMX0NPREVEX1NMSUNFX0lEUikKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgLyogZG9uJ3QgdG91Y2ggb3JpZ2luYWwgc3RyZWFtIHBvc2l0aW9uIHBhcmFtcyAqLwotICAgICp0bXBTdHJtRGF0YSA9ICpwU3RybURhdGE7Ci0KLSAgICAvKiBza2lwIGZpcnN0X21iX2luX3NsaWNlICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIHNraXAgc2xpY2VfdHlwZSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBza2lwIHBpY19wYXJhbWV0ZXJfc2V0X2lkICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIGxvZzIobWF4RnJhbWVOdW0pIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBmcmFtZV9udW0gKi8KLSAgICBpID0gMDsKLSAgICB3aGlsZSAobWF4RnJhbWVOdW0gPj4gaSkKLSAgICAgICAgaSsrOwotICAgIGktLTsKLQotICAgIC8qIHNraXAgZnJhbWVfbnVtICovCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIGkpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgLyogaWRyX3BpY19pZCAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgaWRyUGljSWQpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZENoZWNrUGljT3JkZXJDbnRMc2IKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgUGVlayB2YWx1ZSBvZiBwaWNfb3JkZXJfY250X2xzYiBmcm9tIHRoZSBzbGljZSBoZWFkZXIuIEZ1bmN0aW9uCi0gICAgICAgICAgICBkb2VzIG5vdCBtb2RpZnkgY3VycmVudCBzdHJlYW0gcG9zaXRpb25zIGJ1dCBjb3BpZXMgdGhlIHN0cmVhbQotICAgICAgICAgICAgZGF0YSBzdHJ1Y3R1cmUgdG8gdG1wIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIHdoaWxlIGFjY2Vzc2luZwotICAgICAgICAgICAgc3RyZWFtIGRhdGEuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgICBwU2VxUGFyYW1TZXQgICAgcG9pbnRlciB0byBhY3RpdmUgU1BTCi0gICAgICAgICAgICBuYWxVbml0VHlwZSAgICAgdHlwZSBvZiB0aGUgY3VycmVudCBOQUwgdW5pdAotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBwaWNPcmRlckNudExzYiAgdmFsdWUgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBpbnZhbGlkIHN0cmVhbSBkYXRhCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkQ2hlY2tQaWNPcmRlckNudExzYigKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCi0gIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCi0gIHUzMiAqcGljT3JkZXJDbnRMc2IpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgdmFsdWUsIGk7Ci0gICAgc3RybURhdGFfdCB0bXBTdHJtRGF0YVsxXTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBTZXFQYXJhbVNldCk7Ci0gICAgQVNTRVJUKHBpY09yZGVyQ250THNiKTsKLQotICAgIC8qIHBpY09yZGVyQ250VHlwZSBtdXN0IGJlIGVxdWFsIHRvIDAgKi8KLSAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPT0gMCk7Ci0gICAgQVNTRVJUKHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0pOwotICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPm1heFBpY09yZGVyQ250THNiKTsKLQotICAgIC8qIGRvbid0IHRvdWNoIG9yaWdpbmFsIHN0cmVhbSBwb3NpdGlvbiBwYXJhbXMgKi8KLSAgICAqdG1wU3RybURhdGEgPSAqcFN0cm1EYXRhOwotCi0gICAgLyogc2tpcCBmaXJzdF9tYl9pbl9zbGljZSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBza2lwIHNsaWNlX3R5cGUgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogc2tpcCBwaWNfcGFyYW1ldGVyX3NldF9pZCAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBsb2cyKG1heEZyYW1lTnVtKSAtPiBudW0gYml0cyB0byByZXByZXNlbnQgZnJhbWVfbnVtICovCi0gICAgaSA9IDA7Ci0gICAgd2hpbGUgKHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0gPj4gaSkKLSAgICAgICAgaSsrOwotICAgIGktLTsKLQotICAgIC8qIHNraXAgZnJhbWVfbnVtICovCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIGkpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgLyogc2tpcCBpZHJfcGljX2lkIHdoZW4gbmVjZXNzYXJ5ICovCi0gICAgaWYgKG5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgfQotCi0gICAgLyogbG9nMihtYXhQaWNPcmRlckNudExzYikgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IHBpY19vcmRlcl9jbnRfbHNiICovCi0gICAgaSA9IDA7Ci0gICAgd2hpbGUgKHBTZXFQYXJhbVNldC0+bWF4UGljT3JkZXJDbnRMc2IgPj4gaSkKLSAgICAgICAgaSsrOwotICAgIGktLTsKLQotICAgIC8qIHBpY19vcmRlcl9jbnRfbHNiICovCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIGkpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICpwaWNPcmRlckNudExzYiA9IHRtcDsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZENoZWNrRGVsdGFQaWNPcmRlckNudEJvdHRvbQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBQZWVrIHZhbHVlIG9mIGRlbHRhX3BpY19vcmRlcl9jbnRfYm90dG9tIGZyb20gdGhlIHNsaWNlIGhlYWRlci4KLSAgICAgICAgICAgIEZ1bmN0aW9uIGRvZXMgbm90IG1vZGlmeSBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbnMgYnV0IGNvcGllcyB0aGUKLSAgICAgICAgICAgIHN0cmVhbSBkYXRhIHN0cnVjdHVyZSB0byB0bXAgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgd2hpbGUKLSAgICAgICAgICAgIGFjY2Vzc2luZyBzdHJlYW0gZGF0YS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIHBTZXFQYXJhbVNldCAgICBwb2ludGVyIHRvIGFjdGl2ZSBTUFMKLSAgICAgICAgICAgIG5hbFVuaXRUeXBlICAgICB0eXBlIG9mIHRoZSBjdXJyZW50IE5BTCB1bml0Ci0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIGRlbHRhUGljT3JkZXJDbnRCb3R0b20gIHZhbHVlIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZENoZWNrRGVsdGFQaWNPcmRlckNudEJvdHRvbSgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCi0gIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCi0gIGkzMiAqZGVsdGFQaWNPcmRlckNudEJvdHRvbSkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCB2YWx1ZSwgaTsKLSAgICBzdHJtRGF0YV90IHRtcFN0cm1EYXRhWzFdOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFNlcVBhcmFtU2V0KTsKLSAgICBBU1NFUlQoZGVsdGFQaWNPcmRlckNudEJvdHRvbSk7Ci0KLSAgICAvKiBwaWNPcmRlckNudFR5cGUgbXVzdCBiZSBlcXVhbCB0byAwIGFuZCBwaWNPcmRlclByZXNlbnRGbGFnIG11c3QgYmUgVFJVRQotICAgICAqICovCi0gICAgQVNTRVJUKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID09IDApOwotICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPm1heEZyYW1lTnVtKTsKLSAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5tYXhQaWNPcmRlckNudExzYik7Ci0KLSAgICAvKiBkb24ndCB0b3VjaCBvcmlnaW5hbCBzdHJlYW0gcG9zaXRpb24gcGFyYW1zICovCi0gICAgKnRtcFN0cm1EYXRhID0gKnBTdHJtRGF0YTsKLQotICAgIC8qIHNraXAgZmlyc3RfbWJfaW5fc2xpY2UgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogc2tpcCBzbGljZV90eXBlICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIHNraXAgcGljX3BhcmFtZXRlcl9zZXRfaWQgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogbG9nMihtYXhGcmFtZU51bSkgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IGZyYW1lX251bSAqLwotICAgIGkgPSAwOwotICAgIHdoaWxlIChwU2VxUGFyYW1TZXQtPm1heEZyYW1lTnVtID4+IGkpCi0gICAgICAgIGkrKzsKLSAgICBpLS07Ci0KLSAgICAvKiBza2lwIGZyYW1lX251bSAqLwotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHRtcFN0cm1EYXRhLCBpKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIC8qIHNraXAgaWRyX3BpY19pZCB3aGVuIG5lY2Vzc2FyeSAqLwotICAgIGlmIChuYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgIH0KLQotICAgIC8qIGxvZzIobWF4UGljT3JkZXJDbnRMc2IpIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBwaWNfb3JkZXJfY250X2xzYiAqLwotICAgIGkgPSAwOwotICAgIHdoaWxlIChwU2VxUGFyYW1TZXQtPm1heFBpY09yZGVyQ250THNiID4+IGkpCi0gICAgICAgIGkrKzsKLSAgICBpLS07Ci0KLSAgICAvKiBza2lwIHBpY19vcmRlcl9jbnRfbHNiICovCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIGkpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgLyogZGVsdGFfcGljX29yZGVyX2NudF9ib3R0b20gKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHRtcFN0cm1EYXRhLCBkZWx0YVBpY09yZGVyQ250Qm90dG9tKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RDaGVja0RlbHRhUGljT3JkZXJDbnQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgUGVlayB2YWx1ZXMgZGVsdGFfcGljX29yZGVyX2NudFswXSBhbmQgZGVsdGFfcGljX29yZGVyX2NudFsxXQotICAgICAgICAgICAgZnJvbSB0aGUgc2xpY2UgaGVhZGVyLiBGdW5jdGlvbiBkb2VzIG5vdCBtb2RpZnkgY3VycmVudCBzdHJlYW0KLSAgICAgICAgICAgIHBvc2l0aW9ucyBidXQgY29waWVzIHRoZSBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUgdG8gdG1wIHN0cnVjdHVyZQotICAgICAgICAgICAgd2hpY2ggaXMgdXNlZCB3aGlsZSBhY2Nlc3Npbmcgc3RyZWFtIGRhdGEuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgICAgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIHBTZXFQYXJhbVNldCAgICAgICAgICAgIHBvaW50ZXIgdG8gYWN0aXZlIFNQUwotICAgICAgICAgICAgbmFsVW5pdFR5cGUgICAgICAgICAgICAgdHlwZSBvZiB0aGUgY3VycmVudCBOQUwgdW5pdAotICAgICAgICAgICAgcGljT3JkZXJQcmVzZW50RmxhZyAgICAgZmxhZyBpbmRpY2F0aW5nIGlmIGRlbHRhX3BpY19vcmRlcl9jbnRbMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHByZXNlbnQgaW4gdGhlIHN0cmVhbQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBkZWx0YVBpY09yZGVyQ250ICAgICAgICB2YWx1ZXMgYXJlIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICAgICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICAgICAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RDaGVja0RlbHRhUGljT3JkZXJDbnQoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0LAotICBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlLAotICB1MzIgcGljT3JkZXJQcmVzZW50RmxhZywKLSAgaTMyICpkZWx0YVBpY09yZGVyQ250KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIHZhbHVlLCBpOwotICAgIHN0cm1EYXRhX3QgdG1wU3RybURhdGFbMV07Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwU2VxUGFyYW1TZXQpOwotICAgIEFTU0VSVChkZWx0YVBpY09yZGVyQ250KTsKLQotICAgIC8qIHBpY09yZGVyQ250VHlwZSBtdXN0IGJlIGVxdWFsIHRvIDEgYW5kIGRlbHRhUGljT3JkZXJBbHdheXNaZXJvRmxhZyBtdXN0Ci0gICAgICogYmUgRkFMU0UgKi8KLSAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5waWNPcmRlckNudFR5cGUgPT0gMSk7Ci0gICAgQVNTRVJUKCFwU2VxUGFyYW1TZXQtPmRlbHRhUGljT3JkZXJBbHdheXNaZXJvRmxhZyk7Ci0gICAgQVNTRVJUKHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0pOwotCi0gICAgLyogZG9uJ3QgdG91Y2ggb3JpZ2luYWwgc3RyZWFtIHBvc2l0aW9uIHBhcmFtcyAqLwotICAgICp0bXBTdHJtRGF0YSA9ICpwU3RybURhdGE7Ci0KLSAgICAvKiBza2lwIGZpcnN0X21iX2luX3NsaWNlICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIHNraXAgc2xpY2VfdHlwZSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBza2lwIHBpY19wYXJhbWV0ZXJfc2V0X2lkICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIGxvZzIobWF4RnJhbWVOdW0pIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBmcmFtZV9udW0gKi8KLSAgICBpID0gMDsKLSAgICB3aGlsZSAocFNlcVBhcmFtU2V0LT5tYXhGcmFtZU51bSA+PiBpKQotICAgICAgICBpKys7Ci0gICAgaS0tOwotCi0gICAgLyogc2tpcCBmcmFtZV9udW0gKi8KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyh0bXBTdHJtRGF0YSwgaSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAvKiBza2lwIGlkcl9waWNfaWQgd2hlbiBuZWNlc3NhcnkgKi8KLSAgICBpZiAobmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUikKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICB9Ci0KLSAgICAvKiBkZWx0YV9waWNfb3JkZXJfY250WzBdICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZCh0bXBTdHJtRGF0YSwgJmRlbHRhUGljT3JkZXJDbnRbMF0pOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIGRlbHRhX3BpY19vcmRlcl9jbnRbMV0gaWYgcHJlc2VudCAqLwotICAgIGlmIChwaWNPcmRlclByZXNlbnRGbGFnKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZCh0bXBTdHJtRGF0YSwgJmRlbHRhUGljT3JkZXJDbnRbMV0pOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZENoZWNrUmVkdW5kYW50UGljQ250Ci0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIFBlZWsgdmFsdWUgb2YgcmVkdW5kYW50X3BpY19jbnQgZnJvbSB0aGUgc2xpY2UgaGVhZGVyLiBGdW5jdGlvbgotICAgICAgICAgICAgZG9lcyBub3QgbW9kaWZ5IGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9ucyBidXQgY29waWVzIHRoZSBzdHJlYW0KLSAgICAgICAgICAgIGRhdGEgc3RydWN0dXJlIHRvIHRtcCBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCB3aGlsZSBhY2Nlc3NpbmcKLSAgICAgICAgICAgIHN0cmVhbSBkYXRhLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgcFNlcVBhcmFtU2V0ICAgIHBvaW50ZXIgdG8gYWN0aXZlIFNQUwotICAgICAgICAgICAgcFBpY1BhcmFtU2V0ICAgIHBvaW50ZXIgdG8gYWN0aXZlIFBQUwotICAgICAgICAgICAgbmFsVW5pdFR5cGUgICAgIHR5cGUgb2YgdGhlIGN1cnJlbnQgTkFMIHVuaXQKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgcmVkdW5kYW50UGljQ250IHZhbHVlIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZENoZWNrUmVkdW5kYW50UGljQ250KAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKLSAgcGljUGFyYW1TZXRfdCAqcFBpY1BhcmFtU2V0LAotICBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlLAotICB1MzIgKnJlZHVuZGFudFBpY0NudCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICB1MzIgdG1wLCB2YWx1ZSwgaTsKLSAgICBpMzIgaXZhbHVlOwotICAgIHN0cm1EYXRhX3QgdG1wU3RybURhdGFbMV07Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwU2VxUGFyYW1TZXQpOwotICAgIEFTU0VSVChwUGljUGFyYW1TZXQpOwotICAgIEFTU0VSVChyZWR1bmRhbnRQaWNDbnQpOwotCi0gICAgLyogcmVkdW5kYW50X3BpY19jbnRfZmxhZyBtdXN0IGJlIFRSVUUgKi8KLSAgICBBU1NFUlQocFBpY1BhcmFtU2V0LT5yZWR1bmRhbnRQaWNDbnRQcmVzZW50RmxhZyk7Ci0gICAgQVNTRVJUKHBTZXFQYXJhbVNldC0+bWF4RnJhbWVOdW0pOwotICAgIEFTU0VSVChwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA+IDAgfHwKLSAgICAgICAgICAgcFNlcVBhcmFtU2V0LT5tYXhQaWNPcmRlckNudExzYik7Ci0KLSAgICAvKiBkb24ndCB0b3VjaCBvcmlnaW5hbCBzdHJlYW0gcG9zaXRpb24gcGFyYW1zICovCi0gICAgKnRtcFN0cm1EYXRhID0gKnBTdHJtRGF0YTsKLQotICAgIC8qIHNraXAgZmlyc3RfbWJfaW5fc2xpY2UgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogc2tpcCBzbGljZV90eXBlICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLQotICAgIC8qIHNraXAgcGljX3BhcmFtZXRlcl9zZXRfaWQgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogbG9nMihtYXhGcmFtZU51bSkgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IGZyYW1lX251bSAqLwotICAgIGkgPSAwOwotICAgIHdoaWxlIChwU2VxUGFyYW1TZXQtPm1heEZyYW1lTnVtID4+IGkpCi0gICAgICAgIGkrKzsKLSAgICBpLS07Ci0KLSAgICAvKiBza2lwIGZyYW1lX251bSAqLwotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHRtcFN0cm1EYXRhLCBpKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgIC8qIHNraXAgaWRyX3BpY19pZCB3aGVuIG5lY2Vzc2FyeSAqLwotICAgIGlmIChuYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgIH0KLQotICAgIGlmIChwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9PSAwKQotICAgIHsKLSAgICAgICAgLyogbG9nMihtYXhQaWNPcmRlckNudExzYikgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IHBpY19vcmRlcl9jbnRfbHNiICovCi0gICAgICAgIGkgPSAwOwotICAgICAgICB3aGlsZSAocFNlcVBhcmFtU2V0LT5tYXhQaWNPcmRlckNudExzYiA+PiBpKQotICAgICAgICAgICAgaSsrOwotICAgICAgICBpLS07Ci0KLSAgICAgICAgLyogcGljX29yZGVyX2NudF9sc2IgKi8KLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIGkpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAgICAgaWYgKHBQaWNQYXJhbVNldC0+cGljT3JkZXJQcmVzZW50RmxhZykKLSAgICAgICAgewotICAgICAgICAgICAgLyogc2tpcCBkZWx0YV9waWNfb3JkZXJfY250X2JvdHRvbSAqLwotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZCh0bXBTdHJtRGF0YSwgJml2YWx1ZSk7Ci0gICAgICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9PSAxICYmCi0gICAgICAhcFNlcVBhcmFtU2V0LT5kZWx0YVBpY09yZGVyQWx3YXlzWmVyb0ZsYWcpCi0gICAgewotICAgICAgICAvKiBkZWx0YV9waWNfb3JkZXJfY250WzBdICovCi0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQodG1wU3RybURhdGEsICZpdmFsdWUpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotCi0gICAgICAgIC8qIGRlbHRhX3BpY19vcmRlcl9jbnRbMV0gaWYgcHJlc2VudCAqLwotICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT5waWNPcmRlclByZXNlbnRGbGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHRtcFN0cm1EYXRhLCAmaXZhbHVlKTsKLSAgICAgICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogcmVkdW5kYW50X3BpY19jbnQgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsIHJlZHVuZGFudFBpY0NudCk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RDaGVja1ByaW9yUGljc0ZsYWcKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgUGVlayB2YWx1ZSBvZiBub19vdXRwdXRfb2ZfcHJpb3JfcGljc19mbGFnIGZyb20gdGhlIHNsaWNlIGhlYWRlci4KLSAgICAgICAgICAgIEZ1bmN0aW9uIGRvZXMgbm90IG1vZGlmeSBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbnMgYnV0IGNvcGllcwotICAgICAgICAgICAgdGhlIHN0cmVhbSBkYXRhIHN0cnVjdHVyZSB0byB0bXAgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgd2hpbGUKLSAgICAgICAgICAgIGFjY2Vzc2luZyBzdHJlYW0gZGF0YS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIHBTZXFQYXJhbVNldCAgICBwb2ludGVyIHRvIGFjdGl2ZSBTUFMKLSAgICAgICAgICAgIHBQaWNQYXJhbVNldCAgICBwb2ludGVyIHRvIGFjdGl2ZSBQUFMKLSAgICAgICAgICAgIG5hbFVuaXRUeXBlICAgICB0eXBlIG9mIHRoZSBjdXJyZW50IE5BTCB1bml0Ci0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnIHZhbHVlIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgaW52YWxpZCBzdHJlYW0gZGF0YQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLypsaW50IC1lNzE1IGRpc2FibGUgbGludCBpbmZvIG5hbFVuaXRUeXBlIG5vdCByZWZlcmVuY2VkICovCi11MzIgaDI2NGJzZENoZWNrUHJpb3JQaWNzRmxhZyh1MzIgKiBub091dHB1dE9mUHJpb3JQaWNzRmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cm1EYXRhX3QgKiBwU3RybURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXFQYXJhbVNldF90ICogcFNlcVBhcmFtU2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGljUGFyYW1TZXRfdCAqIHBQaWNQYXJhbVNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUpCi17Ci0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIHZhbHVlLCBpOwotICAgIGkzMiBpdmFsdWU7Ci0gICAgc3RybURhdGFfdCB0bXBTdHJtRGF0YVsxXTsKLSAgICBVTlVTRUQobmFsVW5pdFR5cGUpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQocFNlcVBhcmFtU2V0KTsKLSAgICBBU1NFUlQocFBpY1BhcmFtU2V0KTsKLSAgICBBU1NFUlQobm9PdXRwdXRPZlByaW9yUGljc0ZsYWcpOwotCi0gICAgLyogbXVzdCBiZSBJRFIgbHNpY2UgKi8KLSAgICBBU1NFUlQobmFsVW5pdFR5cGUgPT0gTkFMX0NPREVEX1NMSUNFX0lEUik7Ci0KLSAgICAvKiBkb24ndCB0b3VjaCBvcmlnaW5hbCBzdHJlYW0gcG9zaXRpb24gcGFyYW1zICovCi0gICAgKnRtcFN0cm1EYXRhID0gKnBTdHJtRGF0YTsKLQotICAgIC8qIHNraXAgZmlyc3RfbWJfaW5fc2xpY2UgKi8KLSAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgaWYodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuICh0bXApOwotCi0gICAgLyogc2xpY2VfdHlwZSAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZih0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4gKHRtcCk7Ci0KLSAgICAvKiBza2lwIHBpY19wYXJhbWV0ZXJfc2V0X2lkICovCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHRtcFN0cm1EYXRhLCAmdmFsdWUpOwotICAgIGlmKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybiAodG1wKTsKLQotICAgIC8qIGxvZzIobWF4RnJhbWVOdW0pIC0+IG51bSBiaXRzIHRvIHJlcHJlc2VudCBmcmFtZV9udW0gKi8KLSAgICBpID0gMDsKLSAgICB3aGlsZShwU2VxUGFyYW1TZXQtPm1heEZyYW1lTnVtID4+IGkpCi0gICAgICAgIGkrKzsKLSAgICBpLS07Ci0KLSAgICAvKiBza2lwIGZyYW1lX251bSAqLwotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHRtcFN0cm1EYXRhLCBpKTsKLSAgICBpZih0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKLQotICAgIC8qIHNraXAgaWRyX3BpY19pZCAqLwotICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCh0bXBTdHJtRGF0YSwgJnZhbHVlKTsKLSAgICBpZih0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4gKHRtcCk7Ci0KLSAgICBpZihwU2VxUGFyYW1TZXQtPnBpY09yZGVyQ250VHlwZSA9PSAwKQotICAgIHsKLSAgICAgICAgLyogbG9nMihtYXhQaWNPcmRlckNudExzYikgLT4gbnVtIGJpdHMgdG8gcmVwcmVzZW50IHBpY19vcmRlcl9jbnRfbHNiICovCi0gICAgICAgIGkgPSAwOwotICAgICAgICB3aGlsZShwU2VxUGFyYW1TZXQtPm1heFBpY09yZGVyQ250THNiID4+IGkpCi0gICAgICAgICAgICBpKys7Ci0gICAgICAgIGktLTsKLQotICAgICAgICAvKiBza2lwIHBpY19vcmRlcl9jbnRfbHNiICovCi0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHRtcFN0cm1EYXRhLCBpKTsKLSAgICAgICAgaWYodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOwotCi0gICAgICAgIGlmKHBQaWNQYXJhbVNldC0+cGljT3JkZXJQcmVzZW50RmxhZykKLSAgICAgICAgewotICAgICAgICAgICAgLyogc2tpcCBkZWx0YV9waWNfb3JkZXJfY250X2JvdHRvbSAqLwotICAgICAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZCh0bXBTdHJtRGF0YSwgJml2YWx1ZSk7Ci0gICAgICAgICAgICBpZih0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgICAgIHJldHVybiAodG1wKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHBTZXFQYXJhbVNldC0+cGljT3JkZXJDbnRUeXBlID09IDEgJiYKLSAgICAgICAhcFNlcVBhcmFtU2V0LT5kZWx0YVBpY09yZGVyQWx3YXlzWmVyb0ZsYWcpCi0gICAgewotICAgICAgICAvKiBza2lwIGRlbHRhX3BpY19vcmRlcl9jbnRbMF0gKi8KLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlNpZ25lZCh0bXBTdHJtRGF0YSwgJml2YWx1ZSk7Ci0gICAgICAgIGlmKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4gKHRtcCk7Ci0KLSAgICAgICAgLyogc2tpcCBkZWx0YV9waWNfb3JkZXJfY250WzFdIGlmIHByZXNlbnQgKi8KLSAgICAgICAgaWYocFBpY1BhcmFtU2V0LT5waWNPcmRlclByZXNlbnRGbGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkKHRtcFN0cm1EYXRhLCAmaXZhbHVlKTsKLSAgICAgICAgICAgIGlmKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuICh0bXApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogc2tpcCByZWR1bmRhbnRfcGljX2NudCAqLwotICAgIGlmKHBQaWNQYXJhbVNldC0+cmVkdW5kYW50UGljQ250UHJlc2VudEZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQodG1wU3RybURhdGEsICZ2YWx1ZSk7Ci0gICAgICAgIGlmKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4gKHRtcCk7Ci0gICAgfQotCi0gICAgKm5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnID0gaDI2NGJzZEdldEJpdHModG1wU3RybURhdGEsIDEpOwotICAgIGlmKCpub091dHB1dE9mUHJpb3JQaWNzRmxhZyA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOwotCi0gICAgcmV0dXJuIChIQU5UUk9fT0spOwotCi19Ci0vKmxpbnQgK2U3MTUgKi8KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfaGVhZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc2xpY2VfaGVhZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ODg5OGEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3NsaWNlX2hlYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfU0xJQ0VfSEVBREVSX0gKLSNkZWZpbmUgSDI2NFNXREVDX1NMSUNFX0hFQURFUl9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgotI2luY2x1ZGUgImgyNjRic2RfY2ZnLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9waWNfcGFyYW1fc2V0LmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9uYWxfdW5pdC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1lbnVtIHsKLSAgICBQX1NMSUNFID0gMCwKLSAgICBJX1NMSUNFID0gMgotfTsKLQotZW51bSB7Tk9fTE9OR19URVJNX0ZSQU1FX0lORElDRVMgPSAweEZGRkZ9OwotCi0vKiBtYWNybyB0byBkZXRlcm1pbmUgaWYgc2xpY2UgaXMgYW4gaW50ZXIgc2xpY2UsIHNsaWNlVHlwZXMgMCBhbmQgNSAqLwotI2RlZmluZSBJU19QX1NMSUNFKHNsaWNlVHlwZSkgKCgoc2xpY2VUeXBlKSA9PSBQX1NMSUNFKSB8fCBcCi0gICAgKChzbGljZVR5cGUpID09IFBfU0xJQ0UgKyA1KSkKLQotLyogbWFjcm8gdG8gZGV0ZXJtaW5lIGlmIHNsaWNlIGlzIGFuIGludHJhIHNsaWNlLCBzbGljZVR5cGVzIDIgYW5kIDcgKi8KLSNkZWZpbmUgSVNfSV9TTElDRShzbGljZVR5cGUpICgoKHNsaWNlVHlwZSkgPT0gSV9TTElDRSkgfHwgXAotICAgICgoc2xpY2VUeXBlKSA9PSBJX1NMSUNFICsgNSkpCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogc3RydWN0dXJlIHRvIHN0b3JlIGRhdGEgb2Ygb25lIHJlZmVyZW5jZSBwaWN0dXJlIGxpc3QgcmVvcmRlcmluZyBvcGVyYXRpb24gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIHJlb3JkZXJpbmdPZlBpY051bXNJZGM7Ci0gICAgdTMyIGFic0RpZmZQaWNOdW07Ci0gICAgdTMyIGxvbmdUZXJtUGljTnVtOwotfSByZWZQaWNMaXN0UmVvcmRlcmluZ09wZXJhdGlvbl90OwotCi0vKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgcmVmZXJlbmNlIHBpY3R1cmUgbGlzdCByZW9yZGVyaW5nIG9wZXJhdGlvbnMgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIHJlZlBpY0xpc3RSZW9yZGVyaW5nRmxhZ0wwOwotICAgIHJlZlBpY0xpc3RSZW9yZGVyaW5nT3BlcmF0aW9uX3QgY29tbWFuZFtNQVhfTlVNX1JFRl9QSUNTKzFdOwotfSByZWZQaWNMaXN0UmVvcmRlcmluZ190OwotCi0vKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgZGF0YSBvZiBvbmUgRFBCIG1lbW9yeSBtYW5hZ2VtZW50IGNvbnRyb2wgb3BlcmF0aW9uICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBtZW1vcnlNYW5hZ2VtZW50Q29udHJvbE9wZXJhdGlvbjsKLSAgICB1MzIgZGlmZmVyZW5jZU9mUGljTnVtczsKLSAgICB1MzIgbG9uZ1Rlcm1QaWNOdW07Ci0gICAgdTMyIGxvbmdUZXJtRnJhbWVJZHg7Ci0gICAgdTMyIG1heExvbmdUZXJtRnJhbWVJZHg7Ci19IG1lbW9yeU1hbmFnZW1lbnRPcGVyYXRpb25fdDsKLQotLyogd29yc3QgY2FzZSBzY2VuYXJpbzogYWxsIE1BWF9OVU1fUkVGX1BJQ1MgcGljdHVyZXMgaW4gdGhlIGJ1ZmZlciBhcmUKLSAqIHNob3J0IHRlcm0gcGljdHVyZXMsIGVhY2ggb25lIG9mIHRoZW0gaXMgZmlyc3QgbWFya2VkIGFzIGxvbmcgdGVybQotICogcmVmZXJlbmNlIHBpY3R1cmUgd2hpY2ggaXMgdGhlbiBtYXJrZWQgYXMgdW51c2VkIGZvciByZWZlcmVuY2UuCi0gKiBBZGRpdGlvbmFsbHksIG1heCBsb25nLXRlcm0gZnJhbWUgaW5kZXggaXMgc2V0IGFuZCBjdXJyZW50IHBpY3R1cmUgaXMKLSAqIG1hcmtlZCBhcyBsb25nIHRlcm0gcmVmZXJlbmNlIHBpY3R1cmUuIExhc3QgcG9zaXRpb24gcmVzZXJ2ZWQgZm9yCi0gKiBlbmQgbWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb24gY29tbWFuZCAqLwotI2RlZmluZSBNQVhfTlVNX01NQ19PUEVSQVRJT05TICgyKk1BWF9OVU1fUkVGX1BJQ1MrMisxKQotCi0vKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgZGVjb2RlZCByZWZlcmVuY2UgcGljdHVyZSBtYXJraW5nIGRhdGEgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdTMyIG5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnOwotICAgIHUzMiBsb25nVGVybVJlZmVyZW5jZUZsYWc7Ci0gICAgdTMyIGFkYXB0aXZlUmVmUGljTWFya2luZ01vZGVGbGFnOwotICAgIG1lbW9yeU1hbmFnZW1lbnRPcGVyYXRpb25fdCBvcGVyYXRpb25bTUFYX05VTV9NTUNfT1BFUkFUSU9OU107Ci19IGRlY1JlZlBpY01hcmtpbmdfdDsKLQotLyogc3RydWN0dXJlIHRvIHN0b3JlIHNsaWNlIGhlYWRlciBkYXRhIGRlY29kZWQgZnJvbSB0aGUgc3RyZWFtICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBmaXJzdE1iSW5TbGljZTsKLSAgICB1MzIgc2xpY2VUeXBlOwotICAgIHUzMiBwaWNQYXJhbWV0ZXJTZXRJZDsKLSAgICB1MzIgZnJhbWVOdW07Ci0gICAgdTMyIGlkclBpY0lkOwotICAgIHUzMiBwaWNPcmRlckNudExzYjsKLSAgICBpMzIgZGVsdGFQaWNPcmRlckNudEJvdHRvbTsKLSAgICBpMzIgZGVsdGFQaWNPcmRlckNudFsyXTsKLSAgICB1MzIgcmVkdW5kYW50UGljQ250OwotICAgIHUzMiBudW1SZWZJZHhBY3RpdmVPdmVycmlkZUZsYWc7Ci0gICAgdTMyIG51bVJlZklkeEwwQWN0aXZlOwotICAgIGkzMiBzbGljZVFwRGVsdGE7Ci0gICAgdTMyIGRpc2FibGVEZWJsb2NraW5nRmlsdGVySWRjOwotICAgIGkzMiBzbGljZUFscGhhQzBPZmZzZXQ7Ci0gICAgaTMyIHNsaWNlQmV0YU9mZnNldDsKLSAgICB1MzIgc2xpY2VHcm91cENoYW5nZUN5Y2xlOwotICAgIHJlZlBpY0xpc3RSZW9yZGVyaW5nX3QgcmVmUGljTGlzdFJlb3JkZXJpbmc7Ci0gICAgZGVjUmVmUGljTWFya2luZ190IGRlY1JlZlBpY01hcmtpbmc7Ci19IHNsaWNlSGVhZGVyX3Q7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVTbGljZUhlYWRlcihzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNsaWNlSGVhZGVyX3QgKnBTbGljZUhlYWRlciwKLSAgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0LAotICBwaWNQYXJhbVNldF90ICpwUGljUGFyYW1TZXQsCi0gIG5hbFVuaXRfdCAqcE5hbFVuaXQpOwotCi11MzIgaDI2NGJzZENoZWNrUHBzSWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgKnBwc0lkKTsKLQotdTMyIGgyNjRic2RDaGVja0ZyYW1lTnVtKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHUzMiBtYXhGcmFtZU51bSwKLSAgdTMyICpmcmFtZU51bSk7Ci0KLXUzMiBoMjY0YnNkQ2hlY2tJZHJQaWNJZCgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICB1MzIgbWF4RnJhbWVOdW0sCi0gIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCi0gIHUzMiAqaWRyUGljSWQpOwotCi11MzIgaDI2NGJzZENoZWNrUGljT3JkZXJDbnRMc2IoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0LAotICBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlLAotICB1MzIgKnBpY09yZGVyQ250THNiKTsKLQotdTMyIGgyNjRic2RDaGVja0RlbHRhUGljT3JkZXJDbnRCb3R0b20oCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0LAotICBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlLAotICBpMzIgKmRlbHRhUGljT3JkZXJDbnRCb3R0b20pOwotCi11MzIgaDI2NGJzZENoZWNrRGVsdGFQaWNPcmRlckNudCgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICBzZXFQYXJhbVNldF90ICpwU2VxUGFyYW1TZXQsCi0gIG5hbFVuaXRUeXBlX2UgbmFsVW5pdFR5cGUsCi0gIHUzMiBwaWNPcmRlclByZXNlbnRGbGFnLAotICBpMzIgKmRlbHRhUGljT3JkZXJDbnQpOwotCi11MzIgaDI2NGJzZENoZWNrUmVkdW5kYW50UGljQ250KAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIHNlcVBhcmFtU2V0X3QgKnBTZXFQYXJhbVNldCwKLSAgcGljUGFyYW1TZXRfdCAqcFBpY1BhcmFtU2V0LAotICBuYWxVbml0VHlwZV9lIG5hbFVuaXRUeXBlLAotICB1MzIgKnJlZHVuZGFudFBpY0NudCk7Ci0KLXUzMiBoMjY0YnNkQ2hlY2tQcmlvclBpY3NGbGFnKHUzMiAqIG5vT3V0cHV0T2ZQcmlvclBpY3NGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RybURhdGFfdCAqIHBTdHJtRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcVBhcmFtU2V0X3QgKiBwU2VxUGFyYW1TZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwaWNQYXJhbVNldF90ICogcFBpY1BhcmFtU2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFsVW5pdFR5cGVfZSBuYWxVbml0VHlwZSk7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1NMSUNFX0hFQURFUl9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdG9yYWdlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RvcmFnZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjdhNDJhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdG9yYWdlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIGgyNjRic2RJbml0U3RvcmFnZQotICAgICAgICAgIGgyNjRic2RTdG9yZVNlcVBhcmFtU2V0Ci0gICAgICAgICAgaDI2NGJzZFN0b3JlUGljUGFyYW1TZXQKLSAgICAgICAgICBoMjY0YnNkQWN0aXZhdGVQYXJhbVNldHMKLSAgICAgICAgICBoMjY0YnNkUmVzZXRTdG9yYWdlCi0gICAgICAgICAgaDI2NGJzZElzU3RhcnRPZlBpY3R1cmUKLSAgICAgICAgICBoMjY0YnNkSXNFbmRPZlBpY3R1cmUKLSAgICAgICAgICBoMjY0YnNkQ29tcHV0ZVNsaWNlR3JvdXBNYXAKLSAgICAgICAgICBoMjY0YnNkQ2hlY2tBY2Nlc3NVbml0Qm91bmRhcnkKLSAgICAgICAgICBDaGVja1BwcwotICAgICAgICAgIGgyNjRic2RWYWxpZFBhcmFtU2V0cwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImgyNjRic2Rfc3RvcmFnZS5oIgotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotI2luY2x1ZGUgImgyNjRic2RfbmVpZ2hib3VyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zbGljZV9ncm91cF9tYXAuaCIKLSNpbmNsdWRlICJoMjY0YnNkX2RwYi5oIgotI2luY2x1ZGUgImgyNjRic2RfbmFsX3VuaXQuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3NsaWNlX2hlYWRlci5oIgotI2luY2x1ZGUgImgyNjRic2Rfc2VxX3BhcmFtX3NldC5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIFVJTlQzMl9NQVgKLSNkZWZpbmUgVUlOVDMyX01BWCAgICAgICAoNDI5NDk2NzI5NVUpCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIENoZWNrUHBzKHBpY1BhcmFtU2V0X3QgKnBwcywgc2VxUGFyYW1TZXRfdCAqc3BzKTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uIG5hbWU6IGgyNjRic2RJbml0U3RvcmFnZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBJbml0aWFsaXplIHN0b3JhZ2Ugc3RydWN0dXJlLiBTZXRzIGNvbnRlbnRzIG9mIHRoZSBzdG9yYWdlIHRvICcwJwotICAgICAgICAgICAgZXhjZXB0IGZvciB0aGUgYWN0aXZlIHBhcmFtZXRlciBzZXQgaWRzLCB3aGljaCBhcmUgaW5pdGlhbGl6ZWQKLSAgICAgICAgICAgIHRvIGludmFsaWQgdmFsdWVzLgotCi0gICAgICAgIElucHV0czoKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgcFN0b3JhZ2UgICAgaW5pdGlhbGl6ZWQgZGF0YSBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZEluaXRTdG9yYWdlKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0b3JhZ2UpOwotCi0gICAgSDI2NFN3RGVjTWVtc2V0KHBTdG9yYWdlLCAwLCBzaXplb2Yoc3RvcmFnZV90KSk7Ci0KLSAgICBwU3RvcmFnZS0+YWN0aXZlU3BzSWQgPSBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTOwotICAgIHBTdG9yYWdlLT5hY3RpdmVQcHNJZCA9IE1BWF9OVU1fUElDX1BBUkFNX1NFVFM7Ci0KLSAgICBwU3RvcmFnZS0+YXViLT5maXJzdENhbGxGbGFnID0gSEFOVFJPX1RSVUU7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZFN0b3JlU2VxUGFyYW1TZXQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgU3RvcmUgc2VxdWVuY2UgcGFyYW1ldGVyIHNldCBpbnRvIHRoZSBzdG9yYWdlLiBJZiBhY3RpdmUgU1BTIGlzCi0gICAgICAgICAgICBvdmVyd3JpdHRlbiAtPiBjaGVjayBpZiBjb250ZW50cyBjaGFuZ2VzIGFuZCBpZiBpdCBkb2VzLCBzZXQKLSAgICAgICAgICAgIHBhcmFtZXRlcnMgdG8gZm9yY2UgcmVhY3RpdmF0aW9uIG9mIHBhcmFtZXRlciBzZXRzCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0b3JhZ2UgICAgICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIHBTZXFQYXJhbVNldCAgICBwb2ludGVyIHRvIHBhcmFtIHNldCB0byBiZSBzdG9yZWQKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgICAgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgTUVNT1JZX0FMTE9DQVRJT05fRVJST1IgIGZhaWx1cmUgaW4gbWVtb3J5IGFsbG9jYXRpb24KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZFN0b3JlU2VxUGFyYW1TZXQoc3RvcmFnZV90ICpwU3RvcmFnZSwgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpZDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdG9yYWdlKTsKLSAgICBBU1NFUlQocFNlcVBhcmFtU2V0KTsKLSAgICBBU1NFUlQocFNlcVBhcmFtU2V0LT5zZXFQYXJhbWV0ZXJTZXRJZCA8IE1BWF9OVU1fU0VRX1BBUkFNX1NFVFMpOwotCi0gICAgaWQgPSBwU2VxUGFyYW1TZXQtPnNlcVBhcmFtZXRlclNldElkOwotCi0gICAgLyogc2VxIHBhcmFtZXRlciBzZXQgd2l0aCBpZCBub3QgdXNlZCBiZWZvcmUgLT4gYWxsb2NhdGUgbWVtb3J5ICovCi0gICAgaWYgKHBTdG9yYWdlLT5zcHNbaWRdID09IE5VTEwpCi0gICAgewotICAgICAgICBBTExPQ0FURShwU3RvcmFnZS0+c3BzW2lkXSwgMSwgc2VxUGFyYW1TZXRfdCk7Ci0gICAgICAgIGlmIChwU3RvcmFnZS0+c3BzW2lkXSA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKLSAgICB9Ci0gICAgLyogc2VxdWVuY2UgcGFyYW1ldGVyIHNldCB3aXRoIGlkIGVxdWFsIHRvIGlkIG9mIGFjdGl2ZSBzcHMgKi8KLSAgICBlbHNlIGlmIChpZCA9PSBwU3RvcmFnZS0+YWN0aXZlU3BzSWQpCi0gICAgewotICAgICAgICAvKiBpZiBzZXEgcGFyYW1ldGVyIHNldCBjb250ZW50cyBjaGFuZ2VzCi0gICAgICAgICAqICAgIC0+IG92ZXJ3cml0ZSBhbmQgcmUtYWN0aXZhdGUgd2hlbiBuZXh0IElEUiBwaWN0dXJlIGRlY29kZWQKLSAgICAgICAgICogICAgaWRzIG9mIGFjdGl2ZSBwYXJhbSBzZXRzIHNldCB0byBpbnZhbGlkIHZhbHVlcyB0byBmb3JjZQotICAgICAgICAgKiAgICByZS1hY3RpdmF0aW9uLiBNZW1vcmllcyBhbGxvY2F0ZWQgZm9yIG9sZCBzcHMgZnJlZWQKLSAgICAgICAgICogb3RoZXJ3aXNlIGZyZWUgbWVtZXJpZXMgYWxsb2NhdGVkIGZvciBqdXN0IGRlY29kZWQgc3BzIGFuZAotICAgICAgICAgKiBjb250aW51ZSAqLwotICAgICAgICBpZiAoaDI2NGJzZENvbXBhcmVTZXFQYXJhbVNldHMocFNlcVBhcmFtU2V0LCBwU3RvcmFnZS0+YWN0aXZlU3BzKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBGUkVFKHBTdG9yYWdlLT5zcHNbaWRdLT5vZmZzZXRGb3JSZWZGcmFtZSk7Ci0gICAgICAgICAgICBGUkVFKHBTdG9yYWdlLT5zcHNbaWRdLT52dWlQYXJhbWV0ZXJzKTsKLSAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHNJZCA9IE1BWF9OVU1fU0VRX1BBUkFNX1NFVFMgKyAxOwotICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwc0lkID0gTUFYX05VTV9QSUNfUEFSQU1fU0VUUyArIDE7Ci0gICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzID0gTlVMTDsKLSAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHMgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgRlJFRShwU2VxUGFyYW1TZXQtPm9mZnNldEZvclJlZkZyYW1lKTsKLSAgICAgICAgICAgIEZSRUUocFNlcVBhcmFtU2V0LT52dWlQYXJhbWV0ZXJzKTsKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fT0spOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qIG92ZXJ3cml0ZSBzZXEgcGFyYW0gc2V0IG90aGVyIHRoYW4gYWN0aXZlIG9uZSAtPiBmcmVlIG1lbW9yaWVzCi0gICAgICogYWxsb2NhdGVkIGZvciBvbGQgcGFyYW0gc2V0ICovCi0gICAgZWxzZQotICAgIHsKLSAgICAgICAgRlJFRShwU3RvcmFnZS0+c3BzW2lkXS0+b2Zmc2V0Rm9yUmVmRnJhbWUpOwotICAgICAgICBGUkVFKHBTdG9yYWdlLT5zcHNbaWRdLT52dWlQYXJhbWV0ZXJzKTsKLSAgICB9Ci0KLSAgICAqcFN0b3JhZ2UtPnNwc1tpZF0gPSAqcFNlcVBhcmFtU2V0OwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkU3RvcmVQaWNQYXJhbVNldAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBTdG9yZSBwaWN0dXJlIHBhcmFtZXRlciBzZXQgaW50byB0aGUgc3RvcmFnZS4gSWYgYWN0aXZlIFBQUyBpcwotICAgICAgICAgICAgb3ZlcndyaXR0ZW4gLT4gY2hlY2sgaWYgYWN0aXZlIFNQUyBjaGFuZ2VzIGFuZCBpZiBpdCBkb2VzIC0+IHNldAotICAgICAgICAgICAgcGFyYW1ldGVycyB0byBmb3JjZSByZWFjdGl2YXRpb24gb2YgcGFyYW1ldGVyIHNldHMKLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICAgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQotICAgICAgICAgICAgcFBpY1BhcmFtU2V0ICAgIHBvaW50ZXIgdG8gcGFyYW0gc2V0IHRvIGJlIHN0b3JlZAotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICAgICAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBNRU1PUllfQUxMT0NBVElPTl9FUlJPUiAgZmFpbHVyZSBpbiBtZW1vcnkgYWxsb2NhdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZFN0b3JlUGljUGFyYW1TZXQoc3RvcmFnZV90ICpwU3RvcmFnZSwgcGljUGFyYW1TZXRfdCAqcFBpY1BhcmFtU2V0KQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpZDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdG9yYWdlKTsKLSAgICBBU1NFUlQocFBpY1BhcmFtU2V0KTsKLSAgICBBU1NFUlQocFBpY1BhcmFtU2V0LT5waWNQYXJhbWV0ZXJTZXRJZCA8IE1BWF9OVU1fUElDX1BBUkFNX1NFVFMpOwotICAgIEFTU0VSVChwUGljUGFyYW1TZXQtPnNlcVBhcmFtZXRlclNldElkIDwgTUFYX05VTV9TRVFfUEFSQU1fU0VUUyk7Ci0KLSAgICBpZCA9IHBQaWNQYXJhbVNldC0+cGljUGFyYW1ldGVyU2V0SWQ7Ci0KLSAgICAvKiBwaWMgcGFyYW1ldGVyIHNldCB3aXRoIGlkIG5vdCB1c2VkIGJlZm9yZSAtPiBhbGxvY2F0ZSBtZW1vcnkgKi8KLSAgICBpZiAocFN0b3JhZ2UtPnBwc1tpZF0gPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIEFMTE9DQVRFKHBTdG9yYWdlLT5wcHNbaWRdLCAxLCBwaWNQYXJhbVNldF90KTsKLSAgICAgICAgaWYgKHBTdG9yYWdlLT5wcHNbaWRdID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4oTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOwotICAgIH0KLSAgICAvKiBwaWN0dXJlIHBhcmFtZXRlciBzZXQgd2l0aCBpZCBlcXVhbCB0byBpZCBvZiBhY3RpdmUgcHBzICovCi0gICAgZWxzZSBpZiAoaWQgPT0gcFN0b3JhZ2UtPmFjdGl2ZVBwc0lkKQotICAgIHsKLSAgICAgICAgLyogY2hlY2sgd2hldGhlciBzZXEgcGFyYW0gc2V0IGNoYW5nZXMsIGZvcmNlIHJlLWFjdGl2YXRpb24gb2YKLSAgICAgICAgICogcGFyYW0gc2V0IGlmIGl0IGRvZXMuIFNldCBhY3RpdmVTcHNJZCB0byBpbnZhbGlkIHZhbHVlIHRvCi0gICAgICAgICAqIGFjY29tcGxpc2ggdGhpcyAqLwotICAgICAgICBpZiAocFBpY1BhcmFtU2V0LT5zZXFQYXJhbWV0ZXJTZXRJZCAhPSBwU3RvcmFnZS0+YWN0aXZlU3BzSWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHNJZCA9IE1BWF9OVU1fUElDX1BBUkFNX1NFVFMgKyAxOwotICAgICAgICB9Ci0gICAgICAgIC8qIGZyZWUgbWVtb3JpZXMgYWxsb2NhdGVkIGZvciBvbGQgcGFyYW0gc2V0ICovCi0gICAgICAgIEZSRUUocFN0b3JhZ2UtPnBwc1tpZF0tPnJ1bkxlbmd0aCk7Ci0gICAgICAgIEZSRUUocFN0b3JhZ2UtPnBwc1tpZF0tPnRvcExlZnQpOwotICAgICAgICBGUkVFKHBTdG9yYWdlLT5wcHNbaWRdLT5ib3R0b21SaWdodCk7Ci0gICAgICAgIEZSRUUocFN0b3JhZ2UtPnBwc1tpZF0tPnNsaWNlR3JvdXBJZCk7Ci0gICAgfQotICAgIC8qIG92ZXJ3cml0ZSBwaWMgcGFyYW0gc2V0IG90aGVyIHRoYW4gYWN0aXZlIG9uZSAtPiBmcmVlIG1lbW9yaWVzCi0gICAgICogYWxsb2NhdGVkIGZvciBvbGQgcGFyYW0gc2V0ICovCi0gICAgZWxzZQotICAgIHsKLSAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2lkXS0+cnVuTGVuZ3RoKTsKLSAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2lkXS0+dG9wTGVmdCk7Ci0gICAgICAgIEZSRUUocFN0b3JhZ2UtPnBwc1tpZF0tPmJvdHRvbVJpZ2h0KTsKLSAgICAgICAgRlJFRShwU3RvcmFnZS0+cHBzW2lkXS0+c2xpY2VHcm91cElkKTsKLSAgICB9Ci0KLSAgICAqcFN0b3JhZ2UtPnBwc1tpZF0gPSAqcFBpY1BhcmFtU2V0OwotCi0gICAgcmV0dXJuKEhBTlRST19PSyk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkQWN0aXZhdGVQYXJhbVNldHMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgQWN0aXZhdGUgY2VydGFpbiBTUFMvUFBTIGNvbWJpbmF0aW9uLiBUaGlzIGZ1bmN0aW9uIHNoYWxsIGJlCi0gICAgICAgICAgICBjYWxsZWQgaW4gdGhlIGJlZ2lubmluZyBvZiBlYWNoIHBpY3R1cmUuIFBpY3R1cmUgcGFyYW1ldGVyIHNldAotICAgICAgICAgICAgY2FuIGJlIGNoYW5nZWQgYXMgd2FudGVkLCBidXQgc2VxdWVuY2UgcGFyYW1ldGVyIHNldCBtYXkgb25seSBiZQotICAgICAgICAgICAgY2hhbmdlZCB3aGVuIHRoZSBzdGFydGluZyBwaWN0dXJlIGlzIGFuIElEUiBwaWN0dXJlLgotCi0gICAgICAgICAgICBXaGVuIG5ldyBTUFMgaXMgYWN0aXZhdGVkIHRoZSBmdW5jdGlvbiBhbGxvY2F0ZXMgbWVtb3J5IGZvcgotICAgICAgICAgICAgbWFjcm9ibG9jayBzdG9yYWdlcyBhbmQgc2xpY2UgZ3JvdXAgbWFwIGFuZCAocmUtKWluaXRpYWxpemVzIHRoZQotICAgICAgICAgICAgZGVjb2RlZCBwaWN0dXJlIGJ1ZmZlci4gSWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IGFjdGl2YXRpb24gdGhlIG9sZAotICAgICAgICAgICAgYWxsb2NhdGlvbnMgYXJlIGZyZWVkIGFuZCBGcmVlRHBiIGNhbGxlZCBiZWZvcmUgbmV3IGFsbG9jYXRpb25zLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdG9yYWdlICAgICAgICBwb2ludGVyIHRvIHN0b3JhZ2UgZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIHBwc0lkICAgICAgICAgICBpZGVudGlmaWVzIHRoZSBQUFMgdG8gYmUgYWN0aXZhdGVkLCBTUFMgaWQgb2J0YWluZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBQUFMKLSAgICAgICAgICAgIGlzSWRyICAgICAgICAgICBmbGFnIHRvIGluZGljYXRlIGlmIHRoZSBwaWN0dXJlIGlzIGFuIElEUiBwaWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBub24tZXhpc3Rpbmcgb3IgaW52YWxpZCBwYXJhbSBzZXQgY29tYmluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5aW5nIHRvIGNoYW5nZSBTUFMgd2l0aCBub24tSURSIHBpY3R1cmUKLSAgICAgICAgICAgIE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SICAgICBmYWlsdXJlIGluIG1lbW9yeSBhbGxvY2F0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkQWN0aXZhdGVQYXJhbVNldHMoc3RvcmFnZV90ICpwU3RvcmFnZSwgdTMyIHBwc0lkLCB1MzIgaXNJZHIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcDsKLSAgICB1MzIgZmxhZzsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdG9yYWdlKTsKLSAgICBBU1NFUlQocHBzSWQgPCBNQVhfTlVNX1BJQ19QQVJBTV9TRVRTKTsKLQotICAgIC8qIGNoZWNrIHRoYXQgcHBzIGFuZCBjb3JyZXNwb25kaW5nIHNwcyBleGlzdCAqLwotICAgIGlmICggKHBTdG9yYWdlLT5wcHNbcHBzSWRdID09IE5VTEwpIHx8Ci0gICAgICAgICAocFN0b3JhZ2UtPnNwc1twU3RvcmFnZS0+cHBzW3Bwc0lkXS0+c2VxUGFyYW1ldGVyU2V0SWRdID09IE5VTEwpICkKLSAgICB7Ci0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICB9Ci0KLSAgICAvKiBjaGVjayB0aGF0IHBwcyBwYXJhbWV0ZXJzIGRvIG5vdCB2aW9sYXRlIHBpY3R1cmUgc2l6ZSBjb25zdHJhaW50cyAqLwotICAgIHRtcCA9IENoZWNrUHBzKHBTdG9yYWdlLT5wcHNbcHBzSWRdLAotICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5zcHNbcFN0b3JhZ2UtPnBwc1twcHNJZF0tPnNlcVBhcmFtZXRlclNldElkXSk7Ci0gICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgIHJldHVybih0bXApOwotCi0gICAgLyogZmlyc3QgYWN0aXZhdGlvbiBwYXJ0MSAqLwotICAgIGlmIChwU3RvcmFnZS0+YWN0aXZlUHBzSWQgPT0gTUFYX05VTV9QSUNfUEFSQU1fU0VUUykKLSAgICB7Ci0gICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHNJZCA9IHBwc0lkOwotICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzID0gcFN0b3JhZ2UtPnBwc1twcHNJZF07Ci0gICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHNJZCA9IHBTdG9yYWdlLT5hY3RpdmVQcHMtPnNlcVBhcmFtZXRlclNldElkOwotICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzID0gcFN0b3JhZ2UtPnNwc1twU3RvcmFnZS0+YWN0aXZlU3BzSWRdOwotCi0gICAgICAgIC8qIHJlcG9ydCBlcnJvciBiZWZvcmUgbXVsdGlwbGljYXRpb24gdG8gcHJldmVudCBpbnRlZ2VyIG92ZXJmbG93ICovCi0gICAgICAgIGlmIChwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBTdG9yYWdlLT5waWNTaXplSW5NYnMgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY0hlaWdodEluTWJzID4KLSAgICAgICAgICAgICAgICAgVUlOVDMyX01BWCAvIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY1dpZHRoSW5NYnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybihNRU1PUllfQUxMT0NBVElPTl9FUlJPUik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwU3RvcmFnZS0+cGljU2l6ZUluTWJzID0KLSAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzICoKLSAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNIZWlnaHRJbk1iczsKLSAgICAgICAgfQotCi0gICAgICAgIHBTdG9yYWdlLT5jdXJySW1hZ2UtPndpZHRoID0gcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljV2lkdGhJbk1iczsKLSAgICAgICAgcFN0b3JhZ2UtPmN1cnJJbWFnZS0+aGVpZ2h0ID0gcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljSGVpZ2h0SW5NYnM7Ci0KLSAgICAgICAgcFN0b3JhZ2UtPnBlbmRpbmdBY3RpdmF0aW9uID0gSEFOVFJPX1RSVUU7Ci0gICAgfQotICAgIC8qIGZpcnN0IGFjdGl2YXRpb24gcGFydDIgKi8KLSAgICBlbHNlIGlmIChwU3RvcmFnZS0+cGVuZGluZ0FjdGl2YXRpb24pCi0gICAgewotICAgICAgICBwU3RvcmFnZS0+cGVuZGluZ0FjdGl2YXRpb24gPSBIQU5UUk9fRkFMU0U7Ci0KLSAgICAgICAgRlJFRShwU3RvcmFnZS0+bWIpOwotICAgICAgICBGUkVFKHBTdG9yYWdlLT5zbGljZUdyb3VwTWFwKTsKLQotICAgICAgICBBTExPQ0FURShwU3RvcmFnZS0+bWIsIHBTdG9yYWdlLT5waWNTaXplSW5NYnMsIG1iU3RvcmFnZV90KTsKLSAgICAgICAgQUxMT0NBVEUocFN0b3JhZ2UtPnNsaWNlR3JvdXBNYXAsIHBTdG9yYWdlLT5waWNTaXplSW5NYnMsIHUzMik7Ci0gICAgICAgIGlmIChwU3RvcmFnZS0+bWIgPT0gTlVMTCB8fCBwU3RvcmFnZS0+c2xpY2VHcm91cE1hcCA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuKE1FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKLQotICAgICAgICBIMjY0U3dEZWNNZW1zZXQocFN0b3JhZ2UtPm1iLCAwLAotICAgICAgICAgICAgcFN0b3JhZ2UtPnBpY1NpemVJbk1icyAqIHNpemVvZihtYlN0b3JhZ2VfdCkpOwotCi0gICAgICAgIGgyNjRic2RJbml0TWJOZWlnaGJvdXJzKHBTdG9yYWdlLT5tYiwKLSAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY1dpZHRoSW5NYnMsCi0gICAgICAgICAgICBwU3RvcmFnZS0+cGljU2l6ZUluTWJzKTsKLQotICAgICAgICAvKiBkcGIgb3V0cHV0IHJlb3JkZXJpbmcgZGlzYWJsZWQgaWYKLSAgICAgICAgICogMSkgYXBwbGljYXRpb24gc2V0IG5vUmVvcmRlcmluZyBmbGFnCi0gICAgICAgICAqIDIpIFBPQyB0eXBlIGVxdWFsIHRvIDIKLSAgICAgICAgICogMykgbnVtX3Jlb3JkZXJfZnJhbWVzIGluIHZ1aSBlcXVhbCB0byAwICovCi0gICAgICAgIGlmICggcFN0b3JhZ2UtPm5vUmVvcmRlcmluZyB8fAotICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY09yZGVyQ250VHlwZSA9PSAyIHx8Ci0gICAgICAgICAgICAgKHBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnNQcmVzZW50RmxhZyAmJgotICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT52dWlQYXJhbWV0ZXJzLT5iaXRzdHJlYW1SZXN0cmljdGlvbkZsYWcgJiYKLSAgICAgICAgICAgICAgIXBTdG9yYWdlLT5hY3RpdmVTcHMtPnZ1aVBhcmFtZXRlcnMtPm51bVJlb3JkZXJGcmFtZXMpICkKLSAgICAgICAgICAgIGZsYWcgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZmxhZyA9IEhBTlRST19GQUxTRTsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkUmVzZXREcGIocFN0b3JhZ2UtPmRwYiwKLSAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY1dpZHRoSW5NYnMgKgotICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljSGVpZ2h0SW5NYnMsCi0gICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5tYXhEcGJTaXplLAotICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+bnVtUmVmRnJhbWVzLAotICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+bWF4RnJhbWVOdW0sCi0gICAgICAgICAgICBmbGFnKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocHBzSWQgIT0gcFN0b3JhZ2UtPmFjdGl2ZVBwc0lkKQotICAgIHsKLSAgICAgICAgLyogc2VxdWVuY2UgcGFyYW1ldGVyIHNldCBzaGFsbCBub3QgY2hhbmdlIGJ1dCBiZWZvcmUgYW4gSURSIHBpY3R1cmUgKi8KLSAgICAgICAgaWYgKHBTdG9yYWdlLT5wcHNbcHBzSWRdLT5zZXFQYXJhbWV0ZXJTZXRJZCAhPSBwU3RvcmFnZS0+YWN0aXZlU3BzSWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERFQlVHKCgiU0VRIFBBUkFNIFNFVCBDSEFOR0lORy4uLlxuIikpOwotICAgICAgICAgICAgaWYgKGlzSWRyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHNJZCA9IHBwc0lkOwotICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHMgPSBwU3RvcmFnZS0+cHBzW3Bwc0lkXTsKLSAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzSWQgPSBwU3RvcmFnZS0+YWN0aXZlUHBzLT5zZXFQYXJhbWV0ZXJTZXRJZDsKLSAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzID0gcFN0b3JhZ2UtPnNwc1twU3RvcmFnZS0+YWN0aXZlU3BzSWRdOwotICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5waWNTaXplSW5NYnMgPQotICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlU3BzLT5waWNXaWR0aEluTWJzICoKLSAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljSGVpZ2h0SW5NYnM7Ci0KLSAgICAgICAgICAgICAgICBwU3RvcmFnZS0+Y3VyckltYWdlLT53aWR0aCA9IHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY1dpZHRoSW5NYnM7Ci0gICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmN1cnJJbWFnZS0+aGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljSGVpZ2h0SW5NYnM7Ci0KLSAgICAgICAgICAgICAgICBwU3RvcmFnZS0+cGVuZGluZ0FjdGl2YXRpb24gPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBERUJVRygoIlRSWUlORyBUTyBDSEFOR0UgU1BTIElOIE5PTi1JRFIgU0xJQ0VcbiIpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwU3RvcmFnZS0+YWN0aXZlUHBzSWQgPSBwcHNJZDsKLSAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVQcHMgPSBwU3RvcmFnZS0+cHBzW3Bwc0lkXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZFJlc2V0U3RvcmFnZQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBSZXNldCBjb250ZW50cyBvZiB0aGUgc3RvcmFnZS4gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZQotICAgICAgICAgICAgcHJvY2Vzc2luZyBvZiBuZXcgaW1hZ2UgaXMgc3RhcnRlZC4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgbm9uZQotCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZFJlc2V0U3RvcmFnZShzdG9yYWdlX3QgKnBTdG9yYWdlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0b3JhZ2UpOwotCi0gICAgcFN0b3JhZ2UtPnNsaWNlLT5udW1EZWNvZGVkTWJzID0gMDsKLSAgICBwU3RvcmFnZS0+c2xpY2UtPnNsaWNlSWQgPSAwOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHBTdG9yYWdlLT5waWNTaXplSW5NYnM7IGkrKykKLSAgICB7Ci0gICAgICAgIHBTdG9yYWdlLT5tYltpXS5zbGljZUlkID0gMDsKLSAgICAgICAgcFN0b3JhZ2UtPm1iW2ldLmRlY29kZWQgPSAwOwotICAgIH0KLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJc1N0YXJ0T2ZQaWN0dXJlCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIERldGVybWluZSBpZiB0aGUgZGVjb2RlciBpcyBpbiB0aGUgc3RhcnQgb2YgYSBwaWN0dXJlLiBUaGlzCi0gICAgICAgICAgICBpbmZvcm1hdGlvbiBpcyBuZWVkZWQgdG8gZGVjaWRlIGlmIGgyNjRic2RBY3RpdmF0ZVBhcmFtU2V0cyBhbmQKLSAgICAgICAgICAgIGgyNjRic2RDaGVja0dhcHNJbkZyYW1lTnVtIGZ1bmN0aW9ucyBzaG91bGQgYmUgY2FsbGVkLiBGdW5jdGlvbgotICAgICAgICAgICAgY29uc2lkZXJzIHRoYXQgbmV3IHBpY3R1cmUgaXMgc3RhcnRpbmcgaWYgbm8gc2xpY2UgaGVhZGVycwotICAgICAgICAgICAgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseSBkZWNvZGVkIGZvciB0aGUgY3VycmVudCBhY2Nlc3MgdW5pdC4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX1RSVUUgICAgICAgIG5ldyBwaWN0dXJlIGlzIHN0YXJ0aW5nCi0gICAgICAgICAgICBIQU5UUk9fRkFMU0UgICAgICAgbm90IHN0YXJ0aW5nCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkSXNTdGFydE9mUGljdHVyZShzdG9yYWdlX3QgKnBTdG9yYWdlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotCi0vKiBDb2RlICovCi0KLSAgICBpZiAocFN0b3JhZ2UtPnZhbGlkU2xpY2VJbkFjY2Vzc1VuaXQgPT0gSEFOVFJPX0ZBTFNFKQotICAgICAgICByZXR1cm4oSEFOVFJPX1RSVUUpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuKEhBTlRST19GQUxTRSk7Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkSXNFbmRPZlBpY3R1cmUKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRGV0ZXJtaW5lIGlmIHRoZSBkZWNvZGVyIGlzIGluIHRoZSBlbmQgb2YgYSBwaWN0dXJlLiBUaGlzCi0gICAgICAgICAgICBpbmZvcm1hdGlvbiBpcyBuZWVkZWQgdG8gZGV0ZXJtaW5lIHdoZW4gZGVibG9ja2luZyBmaWx0ZXJpbmcKLSAgICAgICAgICAgIGFuZCByZWZlcmVuY2UgcGljdHVyZSBtYXJraW5nIHByb2Nlc3NlcyBzaG91bGQgYmUgcGVyZm9ybWVkLgotCi0gICAgICAgICAgICBJZiB0aGUgZGVjb2RlciBpcyBwcm9jZXNzaW5nIHByaW1hcnkgc2xpY2VzIHRoZSByZXR1cm4gdmFsdWUKLSAgICAgICAgICAgIGlzIGRldGVybWluZWQgYnkgY2hlY2tpbmcgdGhlIHZhbHVlIG9mIG51bURlY29kZWRNYnMgaW4gdGhlCi0gICAgICAgICAgICBzdG9yYWdlLiBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlIGRlY29kZXIgaXMgcHJvY2Vzc2luZwotICAgICAgICAgICAgcmVkdW5kYW50IHNsaWNlcyB0aGUgbnVtRGVjb2RlZE1icyBtYXkgbm90IGNvbnRhaW4gdmFsaWQKLSAgICAgICAgICAgIGluZm9ybWF0aW9uYSBhbmQgZWFjaCBtYWNyb2Jsb2NrIGhhcyB0byBiZSBjaGVja2VkIHNlcGFyYXRlbHkuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0b3JhZ2UgICAgcG9pbnRlciB0byBzdG9yYWdlIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19UUlVFICAgICAgICBlbmQgb2YgcGljdHVyZQotICAgICAgICAgICAgSEFOVFJPX0ZBTFNFICAgICAgIG5vdXAKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RJc0VuZE9mUGljdHVyZShzdG9yYWdlX3QgKnBTdG9yYWdlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpLCB0bXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIC8qIHByaW1hcnkgcGljdHVyZSAqLwotICAgIGlmICghcFN0b3JhZ2UtPnNsaWNlSGVhZGVyWzBdLnJlZHVuZGFudFBpY0NudCkKLSAgICB7Ci0gICAgICAgIGlmIChwU3RvcmFnZS0+c2xpY2UtPm51bURlY29kZWRNYnMgPT0gcFN0b3JhZ2UtPnBpY1NpemVJbk1icykKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fVFJVRSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDAsIHRtcCA9IDA7IGkgPCBwU3RvcmFnZS0+cGljU2l6ZUluTWJzOyBpKyspCi0gICAgICAgICAgICB0bXAgKz0gcFN0b3JhZ2UtPm1iW2ldLmRlY29kZWQgPyAxIDogMDsKLQotICAgICAgICBpZiAodG1wID09IHBTdG9yYWdlLT5waWNTaXplSW5NYnMpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX1RSVUUpOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fRkFMU0UpOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZENvbXB1dGVTbGljZUdyb3VwTWFwCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIENvbXB1dGUgc2xpY2UgZ3JvdXAgbWFwLiBKdXN0IGNhbGwgaDI2NGJzZERlY29kZVNsaWNlR3JvdXBNYXAgd2l0aAotICAgICAgICAgICAgYXBwcm9wcmlhdGUgcGFyYW1ldGVycy4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCi0gICAgICAgICAgICBzbGljZUdyb3VwQ2hhbmdlQ3ljbGUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgaDI2NGJzZENvbXB1dGVTbGljZUdyb3VwTWFwKHN0b3JhZ2VfdCAqcFN0b3JhZ2UsIHUzMiBzbGljZUdyb3VwQ2hhbmdlQ3ljbGUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0KLS8qIENvZGUgKi8KLQotICAgIGgyNjRic2REZWNvZGVTbGljZUdyb3VwTWFwKHBTdG9yYWdlLT5zbGljZUdyb3VwTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVBwcywgc2xpY2VHcm91cENoYW5nZUN5Y2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgcFN0b3JhZ2UtPmFjdGl2ZVNwcy0+cGljV2lkdGhJbk1icywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTdG9yYWdlLT5hY3RpdmVTcHMtPnBpY0hlaWdodEluTWJzKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RDaGVja0FjY2Vzc1VuaXRCb3VuZGFyeQotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBDaGVjayBpZiBuZXh0IE5BTCB1bml0IHN0YXJ0cyBhIG5ldyBhY2Nlc3MgdW5pdC4gRm9sbG93aW5nCi0gICAgICAgICAgICBjb25kaXRpb25zIHNwZWNpZnkgc3RhcnQgb2YgYSBuZXcgYWNjZXNzIHVuaXQ6Ci0KLSAgICAgICAgICAgICAgICAtTkFMIHVuaXQgdHlwZXMgNi0xMSwgMTMtMTggKGUuZy4gU1BTLCBQUFMpCi0KLSAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgY2hlY2tlZCBvbmx5IGZvciBzbGljZSBOQUwgdW5pdHMsIHZhbHVlcwotICAgICAgICAgICBjb21wYXJlZCB0byBvbmVzIG9idGFpbmVkIGZyb20gcHJldmlvdXMgc2xpY2U6Ci0KLSAgICAgICAgICAgICAgICAtTkFMIHVuaXQgdHlwZSBkaWZmZXJzIChzbGljZSAvIElEUiBzbGljZSkKLSAgICAgICAgICAgICAgICAtZnJhbWVfbnVtIGRpZmZlcnMKLSAgICAgICAgICAgICAgICAtbmFsX3JlZl9pZGMgZGlmZmVycyBhbmQgb25lIG9mIHRoZSB2YWx1ZXMgaXMgMAotICAgICAgICAgICAgICAgIC1QT0MgaW5mb3JtYXRpb24gZGlmZmVycwotICAgICAgICAgICAgICAgIC1ib3RoIGFyZSBJRFIgc2xpY2VzIGFuZCBpZHJfcGljX2lkIGRpZmZlcnMKLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBzdHJtICAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotICAgICAgICAgICAgbnVOZXh0ICAgICAgcG9pbnRlciB0byBOQUwgdW5pdCBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIHN0b3JhZ2UgICAgIHBvaW50ZXIgdG8gc3RvcmFnZSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyAgdGhlIHJlc3VsdCBpcyBzdG9yZWQgaGVyZSwgVFJVRSBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VzcyB1bml0IGJvdW5kYXJ5LCBGQUxTRSBvdGhlcndpc2UKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgICAgIGZhaWx1cmUsIGludmFsaWQgc3RyZWFtIGRhdGEKLSAgICAgICAgICAgIFBBUkFNX1NFVF9FUlJPUiAgICAgaW52YWxpZCBwYXJhbSBzZXQgdXNhZ2UKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RDaGVja0FjY2Vzc1VuaXRCb3VuZGFyeSgKLSAgc3RybURhdGFfdCAqc3RybSwKLSAgbmFsVW5pdF90ICpudU5leHQsCi0gIHN0b3JhZ2VfdCAqc3RvcmFnZSwKLSAgdTMyICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB0bXAsIHBwc0lkLCBmcmFtZU51bSwgaWRyUGljSWQsIHBpY09yZGVyQ250THNiOwotICAgIGkzMiBkZWx0YVBpY09yZGVyQ250Qm90dG9tLCBkZWx0YVBpY09yZGVyQ250WzJdOwotICAgIHNlcVBhcmFtU2V0X3QgKnNwczsKLSAgICBwaWNQYXJhbVNldF90ICpwcHM7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChzdHJtKTsKLSAgICBBU1NFUlQobnVOZXh0KTsKLSAgICBBU1NFUlQoc3RvcmFnZSk7Ci0gICAgQVNTRVJUKHN0b3JhZ2UtPnNwcyk7Ci0gICAgQVNTRVJUKHN0b3JhZ2UtPnBwcyk7Ci0KLSAgICAvKiBpbml0aWFsaXplIGRlZmF1bHQgb3V0cHV0IHRvIEZBTFNFICovCi0gICAgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fRkFMU0U7Ci0KLSAgICBpZiAoICggKG51TmV4dC0+bmFsVW5pdFR5cGUgPiA1KSAmJiAobnVOZXh0LT5uYWxVbml0VHlwZSA8IDEyKSApIHx8Ci0gICAgICAgICAoIChudU5leHQtPm5hbFVuaXRUeXBlID4gMTIpICYmIChudU5leHQtPm5hbFVuaXRUeXBlIDw9IDE4KSApICkKLSAgICB7Ci0gICAgICAgICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgIHJldHVybihIQU5UUk9fT0spOwotICAgIH0KLSAgICBlbHNlIGlmICggbnVOZXh0LT5uYWxVbml0VHlwZSAhPSBOQUxfQ09ERURfU0xJQ0UgJiYKLSAgICAgICAgICAgICAgbnVOZXh0LT5uYWxVbml0VHlwZSAhPSBOQUxfQ09ERURfU0xJQ0VfSURSICkKLSAgICB7Ci0gICAgICAgIHJldHVybihIQU5UUk9fT0spOwotICAgIH0KLQotICAgIC8qIGNoZWNrIGlmIHRoaXMgaXMgdGhlIHZlcnkgZmlyc3QgY2FsbCB0byB0aGlzIGZ1bmN0aW9uICovCi0gICAgaWYgKHN0b3JhZ2UtPmF1Yi0+Zmlyc3RDYWxsRmxhZykKLSAgICB7Ci0gICAgICAgICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgIHN0b3JhZ2UtPmF1Yi0+Zmlyc3RDYWxsRmxhZyA9IEhBTlRST19GQUxTRTsKLSAgICB9Ci0KLSAgICAvKiBnZXQgcGljdHVyZSBwYXJhbWV0ZXIgc2V0IGlkICovCi0gICAgdG1wID0gaDI2NGJzZENoZWNrUHBzSWQoc3RybSwgJnBwc0lkKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAvKiBzdG9yZSBzcHMgYW5kIHBwcyBpbiBzZXBhcmF0ZSBwb2ludGVycyBqdXN0IHRvIG1ha2UgbmFtZXMgc2hvcnRlciAqLwotICAgIHBwcyA9IHN0b3JhZ2UtPnBwc1twcHNJZF07Ci0gICAgaWYgKCBwcHMgPT0gTlVMTCB8fCBzdG9yYWdlLT5zcHNbcHBzLT5zZXFQYXJhbWV0ZXJTZXRJZF0gPT0gTlVMTCAgfHwKLSAgICAgICAgIChzdG9yYWdlLT5hY3RpdmVTcHNJZCAhPSBNQVhfTlVNX1NFUV9QQVJBTV9TRVRTICYmCi0gICAgICAgICAgcHBzLT5zZXFQYXJhbWV0ZXJTZXRJZCAhPSBzdG9yYWdlLT5hY3RpdmVTcHNJZCAmJgotICAgICAgICAgIG51TmV4dC0+bmFsVW5pdFR5cGUgIT0gTkFMX0NPREVEX1NMSUNFX0lEUikgKQotICAgICAgICByZXR1cm4oUEFSQU1fU0VUX0VSUk9SKTsKLSAgICBzcHMgPSBzdG9yYWdlLT5zcHNbcHBzLT5zZXFQYXJhbWV0ZXJTZXRJZF07Ci0KLSAgICBpZiAoc3RvcmFnZS0+YXViLT5udVByZXYtPm5hbFJlZklkYyAhPSBudU5leHQtPm5hbFJlZklkYyAmJgotICAgICAgKHN0b3JhZ2UtPmF1Yi0+bnVQcmV2LT5uYWxSZWZJZGMgPT0gMCB8fCBudU5leHQtPm5hbFJlZklkYyA9PSAwKSkKLSAgICAgICAgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fVFJVRTsKLQotICAgIGlmICgoc3RvcmFnZS0+YXViLT5udVByZXYtPm5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIgJiYKLSAgICAgICAgICBudU5leHQtPm5hbFVuaXRUeXBlICE9IE5BTF9DT0RFRF9TTElDRV9JRFIpIHx8Ci0gICAgICAoc3RvcmFnZS0+YXViLT5udVByZXYtPm5hbFVuaXRUeXBlICE9IE5BTF9DT0RFRF9TTElDRV9JRFIgJiYKLSAgICAgICBudU5leHQtPm5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIpKQotICAgICAgICAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyA9IEhBTlRST19UUlVFOwotCi0gICAgdG1wID0gaDI2NGJzZENoZWNrRnJhbWVOdW0oc3RybSwgc3BzLT5tYXhGcmFtZU51bSwgJmZyYW1lTnVtKTsKLSAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgaWYgKHN0b3JhZ2UtPmF1Yi0+cHJldkZyYW1lTnVtICE9IGZyYW1lTnVtKQotICAgIHsKLSAgICAgICAgc3RvcmFnZS0+YXViLT5wcmV2RnJhbWVOdW0gPSBmcmFtZU51bTsKLSAgICAgICAgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcgPSBIQU5UUk9fVFJVRTsKLSAgICB9Ci0KLSAgICBpZiAobnVOZXh0LT5uYWxVbml0VHlwZSA9PSBOQUxfQ09ERURfU0xJQ0VfSURSKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZENoZWNrSWRyUGljSWQoc3RybSwgc3BzLT5tYXhGcmFtZU51bSwgbnVOZXh0LT5uYWxVbml0VHlwZSwKLSAgICAgICAgICAmaWRyUGljSWQpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgICAgICBpZiAoc3RvcmFnZS0+YXViLT5udVByZXYtPm5hbFVuaXRUeXBlID09IE5BTF9DT0RFRF9TTElDRV9JRFIgJiYKLSAgICAgICAgICBzdG9yYWdlLT5hdWItPnByZXZJZHJQaWNJZCAhPSBpZHJQaWNJZCkKLSAgICAgICAgICAgICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX1RSVUU7Ci0KLSAgICAgICAgc3RvcmFnZS0+YXViLT5wcmV2SWRyUGljSWQgPSBpZHJQaWNJZDsKLSAgICB9Ci0KLSAgICBpZiAoc3BzLT5waWNPcmRlckNudFR5cGUgPT0gMCkKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RDaGVja1BpY09yZGVyQ250THNiKHN0cm0sIHNwcywgbnVOZXh0LT5uYWxVbml0VHlwZSwKLSAgICAgICAgICAmcGljT3JkZXJDbnRMc2IpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgICAgICBpZiAoc3RvcmFnZS0+YXViLT5wcmV2UGljT3JkZXJDbnRMc2IgIT0gcGljT3JkZXJDbnRMc2IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0b3JhZ2UtPmF1Yi0+cHJldlBpY09yZGVyQ250THNiID0gcGljT3JkZXJDbnRMc2I7Ci0gICAgICAgICAgICAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyA9IEhBTlRST19UUlVFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBwcy0+cGljT3JkZXJQcmVzZW50RmxhZykKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gaDI2NGJzZENoZWNrRGVsdGFQaWNPcmRlckNudEJvdHRvbShzdHJtLCBzcHMsCi0gICAgICAgICAgICAgICAgbnVOZXh0LT5uYWxVbml0VHlwZSwgJmRlbHRhUGljT3JkZXJDbnRCb3R0b20pOwotICAgICAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9yYWdlLT5hdWItPnByZXZEZWx0YVBpY09yZGVyQ250Qm90dG9tICE9Ci0gICAgICAgICAgICAgICAgZGVsdGFQaWNPcmRlckNudEJvdHRvbSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdG9yYWdlLT5hdWItPnByZXZEZWx0YVBpY09yZGVyQ250Qm90dG9tID0KLSAgICAgICAgICAgICAgICAgICAgZGVsdGFQaWNPcmRlckNudEJvdHRvbTsKLSAgICAgICAgICAgICAgICAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyA9IEhBTlRST19UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHNwcy0+cGljT3JkZXJDbnRUeXBlID09IDEgJiYgIXNwcy0+ZGVsdGFQaWNPcmRlckFsd2F5c1plcm9GbGFnKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZENoZWNrRGVsdGFQaWNPcmRlckNudChzdHJtLCBzcHMsIG51TmV4dC0+bmFsVW5pdFR5cGUsCi0gICAgICAgICAgcHBzLT5waWNPcmRlclByZXNlbnRGbGFnLCBkZWx0YVBpY09yZGVyQ250KTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLQotICAgICAgICBpZiAoc3RvcmFnZS0+YXViLT5wcmV2RGVsdGFQaWNPcmRlckNudFswXSAhPSBkZWx0YVBpY09yZGVyQ250WzBdKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdG9yYWdlLT5hdWItPnByZXZEZWx0YVBpY09yZGVyQ250WzBdID0gZGVsdGFQaWNPcmRlckNudFswXTsKLSAgICAgICAgICAgICphY2Nlc3NVbml0Qm91bmRhcnlGbGFnID0gSEFOVFJPX1RSVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHBzLT5waWNPcmRlclByZXNlbnRGbGFnKQotICAgICAgICAgICAgaWYgKHN0b3JhZ2UtPmF1Yi0+cHJldkRlbHRhUGljT3JkZXJDbnRbMV0gIT0gZGVsdGFQaWNPcmRlckNudFsxXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdG9yYWdlLT5hdWItPnByZXZEZWx0YVBpY09yZGVyQ250WzFdID0gZGVsdGFQaWNPcmRlckNudFsxXTsKLSAgICAgICAgICAgICAgICAqYWNjZXNzVW5pdEJvdW5kYXJ5RmxhZyA9IEhBTlRST19UUlVFOwotICAgICAgICAgICAgfQotICAgIH0KLQotICAgICpzdG9yYWdlLT5hdWItPm51UHJldiA9ICpudU5leHQ7Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IENoZWNrUHBzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIENoZWNrIHBpY3R1cmUgcGFyYW1ldGVyIHNldC4gQ29udGVudHMgb2YgdGhlIHBpY3R1cmUgcGFyYW1ldGVyCi0gICAgICAgICAgICBzZXQgaW5mb3JtYXRpb24gdGhhdCBkZXBlbmRzIG9uIHRoZSBpbWFnZSBkaW1lbnNpb25zIGlzIGNoZWNrZWQKLSAgICAgICAgICAgIGFnYWluc3QgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIHNwcy4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwcHMgICAgIHBvaW50ZXIgdG8gcGljdHVyZSBwYXJhbXRlciBzZXQKLSAgICAgICAgICAgIHNwcyAgICAgcG9pbnRlciB0byBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0Ci0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgZXZlcnl0aGluZyBvawotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgaW52YWxpZCBkYXRhIGluIHBpY3R1cmUgcGFyYW1ldGVyIHNldAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIENoZWNrUHBzKHBpY1BhcmFtU2V0X3QgKnBwcywgc2VxUGFyYW1TZXRfdCAqc3BzKQotewotCi0gICAgdTMyIGk7Ci0gICAgdTMyIHBpY1NpemU7Ci0KLSAgICBwaWNTaXplID0gc3BzLT5waWNXaWR0aEluTWJzICogc3BzLT5waWNIZWlnaHRJbk1iczsKLQotICAgIC8qIGNoZWNrIHNsaWNlIGdyb3VwIHBhcmFtcyAqLwotICAgIGlmIChwcHMtPm51bVNsaWNlR3JvdXBzID4gMSkKLSAgICB7Ci0gICAgICAgIGlmIChwcHMtPnNsaWNlR3JvdXBNYXBUeXBlID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFTU0VSVChwcHMtPnJ1bkxlbmd0aCk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHBzLT5udW1TbGljZUdyb3VwczsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwcHMtPnJ1bkxlbmd0aFtpXSA+IHBpY1NpemUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwcHMtPnNsaWNlR3JvdXBNYXBUeXBlID09IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFTU0VSVChwcHMtPnRvcExlZnQpOwotICAgICAgICAgICAgQVNTRVJUKHBwcy0+Ym90dG9tUmlnaHQpOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBwcy0+bnVtU2xpY2VHcm91cHMtMTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwcHMtPnRvcExlZnRbaV0gPiBwcHMtPmJvdHRvbVJpZ2h0W2ldIHx8Ci0gICAgICAgICAgICAgICAgICAgIHBwcy0+Ym90dG9tUmlnaHRbaV0gPj0gcGljU2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgICAgICAgICAgICAgaWYgKCAocHBzLT50b3BMZWZ0W2ldICUgc3BzLT5waWNXaWR0aEluTWJzKSA+Ci0gICAgICAgICAgICAgICAgICAgICAocHBzLT5ib3R0b21SaWdodFtpXSAlIHNwcy0+cGljV2lkdGhJbk1icykgKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocHBzLT5zbGljZUdyb3VwTWFwVHlwZSA+IDIgJiYgcHBzLT5zbGljZUdyb3VwTWFwVHlwZSA8IDYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwcHMtPnNsaWNlR3JvdXBDaGFuZ2VSYXRlID4gcGljU2l6ZSkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocHBzLT5zbGljZUdyb3VwTWFwVHlwZSA9PSA2ICYmCi0gICAgICAgICAgICAgICAgIHBwcy0+cGljU2l6ZUluTWFwVW5pdHMgPCBwaWNTaXplKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RWYWxpZFBhcmFtU2V0cwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBDaGVjayBpZiBhbnkgdmFsaWQgU1BTL1BQUyBjb21iaW5hdGlvbiBleGlzdHMgaW4gdGhlIHN0b3JhZ2UuCi0gICAgICAgICAgICBGdW5jdGlvbiB0cmllcyBlYWNoIFBQUyBpbiB0aGUgYnVmZmVyIGFuZCBjaGVja3MgaWYgY29ycmVzcG9uZGluZwotICAgICAgICAgICAgU1BTIGV4aXN0cyBhbmQgY2FsbHMgQ2hlY2tQcHMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBQUFMgY29uZm9ybXMKLSAgICAgICAgICAgIHRvIGltYWdlIGRpbWVuc2lvbnMgb2YgdGhlIFNQUy4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RvcmFnZSAgICBwb2ludGVyIHRvIHN0b3JhZ2Ugc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIEhBTlRST19PSyAgIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSB2YWxpZCBjb21iaW5hdGlvbgotICAgICAgICAgICAgSEFOVFJPX05PSyAgbm8gdmFsaWQgY29tYmluYXRpb25zIGZvdW5kCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RWYWxpZFBhcmFtU2V0cyhzdG9yYWdlX3QgKnBTdG9yYWdlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBpOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0b3JhZ2UpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fUElDX1BBUkFNX1NFVFM7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmICggcFN0b3JhZ2UtPnBwc1tpXSAmJgotICAgICAgICAgICAgIHBTdG9yYWdlLT5zcHNbcFN0b3JhZ2UtPnBwc1tpXS0+c2VxUGFyYW1ldGVyU2V0SWRdICYmCi0gICAgICAgICAgICAgQ2hlY2tQcHMocFN0b3JhZ2UtPnBwc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICBwU3RvcmFnZS0+c3BzW3BTdG9yYWdlLT5wcHNbaV0tPnNlcVBhcmFtZXRlclNldElkXSkgPT0KLSAgICAgICAgICAgICAgICAgSEFOVFJPX09LKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RvcmFnZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0b3JhZ2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEzYjJkYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2Rfc3RvcmFnZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfU1RPUkFHRV9ICi0jZGVmaW5lIEgyNjRTV0RFQ19TVE9SQUdFX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2RfY2ZnLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9waWNfcGFyYW1fc2V0LmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9tYWNyb2Jsb2NrX2xheWVyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9uYWxfdW5pdC5oIgotI2luY2x1ZGUgImgyNjRic2Rfc2xpY2VfaGVhZGVyLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zZXFfcGFyYW1fc2V0LmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9kcGIuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3BpY19vcmRlcl9jbnQuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBzbGljZUlkOwotICAgIHUzMiBudW1EZWNvZGVkTWJzOwotICAgIHUzMiBsYXN0TWJBZGRyOwotfSBzbGljZVN0b3JhZ2VfdDsKLQotLyogc3RydWN0dXJlIHRvIHN0b3JlIHBhcmFtZXRlcnMgbmVlZGVkIGZvciBhY2Nlc3MgdW5pdCBib3VuZGFyeSBjaGVja2luZyAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBuYWxVbml0X3QgbnVQcmV2WzFdOwotICAgIHUzMiBwcmV2RnJhbWVOdW07Ci0gICAgdTMyIHByZXZJZHJQaWNJZDsKLSAgICB1MzIgcHJldlBpY09yZGVyQ250THNiOwotICAgIGkzMiBwcmV2RGVsdGFQaWNPcmRlckNudEJvdHRvbTsKLSAgICBpMzIgcHJldkRlbHRhUGljT3JkZXJDbnRbMl07Ci0gICAgdTMyIGZpcnN0Q2FsbEZsYWc7Ci19IGF1YkNoZWNrX3Q7Ci0KLS8qIHN0b3JhZ2UgZGF0YSBzdHJ1Y3R1cmUsIGhvbGRzIGFsbCBkYXRhIG9mIGEgZGVjb2RlciBpbnN0YW5jZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKiBhY3RpdmUgcGFyYW1ldCBzZXQgaWRzIGFuZCBwb2ludGVycyAqLwotICAgIHUzMiBvbGRTcHNJZDsKLSAgICB1MzIgYWN0aXZlUHBzSWQ7Ci0gICAgdTMyIGFjdGl2ZVNwc0lkOwotICAgIHBpY1BhcmFtU2V0X3QgKmFjdGl2ZVBwczsKLSAgICBzZXFQYXJhbVNldF90ICphY3RpdmVTcHM7Ci0gICAgc2VxUGFyYW1TZXRfdCAqc3BzW01BWF9OVU1fU0VRX1BBUkFNX1NFVFNdOwotICAgIHBpY1BhcmFtU2V0X3QgKnBwc1tNQVhfTlVNX1BJQ19QQVJBTV9TRVRTXTsKLQotICAgIC8qIGN1cnJlbnQgc2xpY2UgZ3JvdXAgbWFwLCByZWNvbXB1dGVkIGZvciBlYWNoIHNsaWNlICovCi0gICAgdTMyICpzbGljZUdyb3VwTWFwOwotCi0gICAgdTMyIHBpY1NpemVJbk1iczsKLQotICAgIC8qIHRoaXMgZmxhZyBpcyBzZXQgYWZ0ZXIgYWxsIG1hY3JvYmxvY2tzIG9mIGEgcGljdHVyZSBzdWNjZXNzZnVsbHkKLSAgICAgKiBkZWNvZGVkIC0+IHJlZHVuZGFudCBzbGljZXMgbm90IGRlY29kZWQgKi8KLSAgICB1MzIgc2tpcFJlZHVuZGFudFNsaWNlczsKLSAgICB1MzIgcGljU3RhcnRlZDsKLQotICAgIC8qIGZsYWcgdG8gaW5kaWNhdGUgaWYgY3VycmVudCBhY2Nlc3MgdW5pdCBjb250YWlucyBhbnkgdmFsaWQgc2xpY2VzICovCi0gICAgdTMyIHZhbGlkU2xpY2VJbkFjY2Vzc1VuaXQ7Ci0KLSAgICAvKiBzdG9yZSBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yIGhhbmRsaW5nIG9mIHNsaWNlIGRlY29kaW5nICovCi0gICAgc2xpY2VTdG9yYWdlX3Qgc2xpY2VbMV07Ci0KLSAgICAvKiBudW1iZXIgb2YgY29uY2VhbGVkIG1hY3JvYmxvY2tzIGluIHRoZSBjdXJyZW50IGltYWdlICovCi0gICAgdTMyIG51bUNvbmNlYWxlZE1iczsKLQotICAgIC8qIHBpY0lkIGdpdmVuIGJ5IGFwcGxpY2F0aW9uICovCi0gICAgdTMyIGN1cnJlbnRQaWNJZDsKLQotICAgIC8qIG1hY3JvYmxvY2sgc3BlY2lmaWMgc3RvcmFnZXMsIHNpemUgZGV0ZXJtaW5lZCBieSBpbWFnZSBkaW1lbnNpb25zICovCi0gICAgbWJTdG9yYWdlX3QgKm1iOwotCi0gICAgLyogZmxhZyB0byBzdG9yZSBub091dHB1dFJlb3JkZXJpbmcgZmxhZyBzZXQgYnkgdGhlIGFwcGxpY2F0aW9uICovCi0gICAgdTMyIG5vUmVvcmRlcmluZzsKLQotICAgIC8qIERQQiAqLwotICAgIGRwYlN0b3JhZ2VfdCBkcGJbMV07Ci0KLSAgICAvKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgcGljdHVyZSBvcmRlciBjb3VudCByZWxhdGVkIGluZm9ybWF0aW9uICovCi0gICAgcG9jU3RvcmFnZV90IHBvY1sxXTsKLQotICAgIC8qIGFjY2VzcyB1bml0IGJvdW5kYXJ5IGNoZWNraW5nIHJlbGF0ZWQgZGF0YSAqLwotICAgIGF1YkNoZWNrX3QgYXViWzFdOwotCi0gICAgLyogY3VycmVudCBwcm9jZXNzZWQgaW1hZ2UgKi8KLSAgICBpbWFnZV90IGN1cnJJbWFnZVsxXTsKLQotICAgIC8qIGxhc3QgdmFsaWQgTkFMIHVuaXQgaGVhZGVyIGlzIHN0b3JlZCBoZXJlICovCi0gICAgbmFsVW5pdF90IHByZXZOYWxVbml0WzFdOwotCi0gICAgLyogc2xpY2UgaGVhZGVyLCBzZWNvbmQgc3RydWN0dXJlIHVzZWQgYXMgYSB0ZW1wb3Jhcnkgc3RvcmFnZSB3aGlsZQotICAgICAqIGRlY29kaW5nIHNsaWNlIGhlYWRlciwgZmlyc3Qgb25lIHN0b3JlcyBsYXN0IHN1Y2Nlc3NmdWxseSBkZWNvZGVkCi0gICAgICogc2xpY2UgaGVhZGVyICovCi0gICAgc2xpY2VIZWFkZXJfdCBzbGljZUhlYWRlclsyXTsKLQotICAgIC8qIGZpZWxkcyB0byBzdG9yZSBvbGQgc3RyZWFtIGJ1ZmZlciBwb2ludGVycywgbmVlZGVkIHdoZW4gb25seSBwYXJ0IG9mCi0gICAgICogYSBzdHJlYW0gYnVmZmVyIGlzIHByb2Nlc3NlZCBieSBoMjY0YnNkRGVjb2RlIGZ1bmN0aW9uICovCi0gICAgdTMyIHByZXZCdWZOb3RGaW5pc2hlZDsKLSAgICB1OCAqcHJldkJ1ZlBvaW50ZXI7Ci0gICAgdTMyIHByZXZCeXRlc0NvbnN1bWVkOwotICAgIHN0cm1EYXRhX3Qgc3RybVsxXTsKLQotICAgIC8qIG1hY3JvYmxvY2sgbGF5ZXIgc3RydWN0dXJlLCB0aGVyZSBpcyBubyBuZWVkIHRvIHN0b3JlIHRoaXMgYnV0IGl0Ci0gICAgICogd291bGQgaGF2ZSBpbmNyZWFzZWQgdGhlIHN0YWNrIHNpemUgZXhjZXNzaXZlbHkgYW5kIG5lZWRlZCB0byBiZQotICAgICAqIGFsbG9jYXRlZCBmcm9tIGhlYWQgLT4gZWFzaWVzdCB0byBwdXQgaXQgaGVyZSAqLwotICAgIG1hY3JvYmxvY2tMYXllcl90ICptYkxheWVyOwotCi0gICAgdTMyIHBlbmRpbmdBY3RpdmF0aW9uOyAvKiBBY3RpdmF0ZSBwYXJhbWV0ZXIgc2V0cyBhZnRlciByZXR1cm5pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhFQURFUlNfUkRZIHRvIHRoZSB1c2VyICovCi0gICAgdTMyIGludHJhQ29uY2VhbG1lbnRGbGFnOyAvKiAwIGdyYXkgcGljdHVyZSBmb3IgY29ycnVwdGVkIGludHJhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIHByZXZpb3VzIGZyYW1lIHVzZWQgaWYgYXZhaWxhYmxlICovCi19IHN0b3JhZ2VfdDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIGgyNjRic2RJbml0U3RvcmFnZShzdG9yYWdlX3QgKnBTdG9yYWdlKTsKLXZvaWQgaDI2NGJzZFJlc2V0U3RvcmFnZShzdG9yYWdlX3QgKnBTdG9yYWdlKTsKLXUzMiBoMjY0YnNkSXNTdGFydE9mUGljdHVyZShzdG9yYWdlX3QgKnBTdG9yYWdlKTsKLXUzMiBoMjY0YnNkSXNFbmRPZlBpY3R1cmUoc3RvcmFnZV90ICpwU3RvcmFnZSk7Ci11MzIgaDI2NGJzZFN0b3JlU2VxUGFyYW1TZXQoc3RvcmFnZV90ICpwU3RvcmFnZSwgc2VxUGFyYW1TZXRfdCAqcFNlcVBhcmFtU2V0KTsKLXUzMiBoMjY0YnNkU3RvcmVQaWNQYXJhbVNldChzdG9yYWdlX3QgKnBTdG9yYWdlLCBwaWNQYXJhbVNldF90ICpwUGljUGFyYW1TZXQpOwotdTMyIGgyNjRic2RBY3RpdmF0ZVBhcmFtU2V0cyhzdG9yYWdlX3QgKnBTdG9yYWdlLCB1MzIgcHBzSWQsIHUzMiBpc0lkcik7Ci12b2lkIGgyNjRic2RDb21wdXRlU2xpY2VHcm91cE1hcChzdG9yYWdlX3QgKnBTdG9yYWdlLAotICAgIHUzMiBzbGljZUdyb3VwQ2hhbmdlQ3ljbGUpOwotCi11MzIgaDI2NGJzZENoZWNrQWNjZXNzVW5pdEJvdW5kYXJ5KAotICBzdHJtRGF0YV90ICpzdHJtLAotICBuYWxVbml0X3QgKm51TmV4dCwKLSAgc3RvcmFnZV90ICpzdG9yYWdlLAotICB1MzIgKmFjY2Vzc1VuaXRCb3VuZGFyeUZsYWcpOwotCi11MzIgaDI2NGJzZFZhbGlkUGFyYW1TZXRzKHN0b3JhZ2VfdCAqcFN0b3JhZ2UpOwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19TVE9SQUdFX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0cmVhbS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0cmVhbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGQxMDgzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdHJlYW0uYworKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgaDI2NGJzZEdldEJpdHMKLSAgICAgICAgICBoMjY0YnNkU2hvd0JpdHMzMgotICAgICAgICAgIGgyNjRic2RGbHVzaEJpdHMKLSAgICAgICAgICBoMjY0YnNkSXNCeXRlQWxpZ25lZAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImgyNjRic2RfdXRpbC5oIgotI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEZ1bmN0aW9uOiBoMjY0YnNkR2V0Qml0cwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBSZWFkIGFuZCByZW1vdmUgYml0cyBmcm9tIHRoZSBzdHJlYW0gYnVmZmVyLgotCi0gICAgICAgIElucHV0OgotICAgICAgICAgICAgcFN0cm1EYXRhICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIG51bUJpdHMgICAgIG51bWJlciBvZiBiaXRzIHRvIHJlYWQKLQotICAgICAgICBPdXRwdXQ6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIGJpdHMgcmVhZCBmcm9tIHN0cmVhbQotICAgICAgICAgICAgRU5EX09GX1NUUkVBTSBpZiBub3QgZW5vdWdoIGJpdHMgbGVmdAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZEdldEJpdHMoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgbnVtQml0cykKLXsKLQotICAgIHUzMiBvdXQ7Ci0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQobnVtQml0cyA8IDMyKTsKLQotICAgIG91dCA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSkgPj4gKDMyIC0gbnVtQml0cyk7Ci0KLSAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIG51bUJpdHMpID09IEhBTlRST19PSykKLSAgICB7Ci0gICAgICAgIHJldHVybihvdXQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4oRU5EX09GX1NUUkVBTSk7Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZFNob3dCaXRzMzIKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgUmVhZCAzMiBiaXRzIGZyb20gdGhlIHN0cmVhbSBidWZmZXIuIEJ1ZmZlciBpcyBsZWZ0IGFzIGl0IGlzLCBpLmUuCi0gICAgICAgICAgICBubyBiaXRzIGFyZSByZW1vdmVkLiBGaXJzdCBiaXQgcmVhZCBmcm9tIHRoZSBzdHJlYW0gaXMgdGhlIE1TQiBvZgotICAgICAgICAgICAgdGhlIHJldHVybiB2YWx1ZS4gSWYgdGhlcmUgaXMgbm90IGVub3VnaCBiaXRzIGluIHRoZSBidWZmZXIgLT4KLSAgICAgICAgICAgIGJpdHMgYmV5b25nIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBhcmUgc2V0IHRvICcwJyBpbiB0aGUgcmV0dXJuCi0gICAgICAgICAgICB2YWx1ZS4KLQotICAgICAgICBJbnB1dDoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0KLSAgICAgICAgT3V0cHV0OgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBiaXRzIHJlYWQgZnJvbSBzdHJlYW0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2RTaG93Qml0czMyKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSkKLXsKLQotICAgIGkzMiBiaXRzLCBzaGlmdDsKLSAgICB1MzIgb3V0OwotICAgIHU4ICpwU3RybTsKLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwU3RybURhdGEtPnBTdHJtQ3VyclBvcyk7Ci0gICAgQVNTRVJUKHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkIDwgOCk7Ci0gICAgQVNTRVJUKHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkID09Ci0gICAgICAgICAgIChwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHMgJiAweDcpKTsKLQotICAgIHBTdHJtID0gcFN0cm1EYXRhLT5wU3RybUN1cnJQb3M7Ci0KLSAgICAvKiBudW1iZXIgb2YgYml0cyBsZWZ0IGluIHRoZSBidWZmZXIgKi8KLSAgICBiaXRzID0gKGkzMilwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSo4IC0gKGkzMilwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHM7Ci0KLSAgICAvKiBhdCBsZWFzdCAzMi1iaXRzIGluIHRoZSBidWZmZXIgKi8KLSAgICBpZiAoYml0cyA+PSAzMikKLSAgICB7Ci0gICAgICAgIHUzMiBiaXRQb3NJbldvcmQgPSBwU3RybURhdGEtPmJpdFBvc0luV29yZDsKLSAgICAgICAgb3V0ID0gKCh1MzIpcFN0cm1bMF0gPDwgMjQpIHwgKCh1MzIpcFN0cm1bMV0gPDwgMTYpIHwKLSAgICAgICAgICAgICAgKCh1MzIpcFN0cm1bMl0gPDwgIDgpIHwgKCh1MzIpcFN0cm1bM10pOwotCi0gICAgICAgIGlmIChiaXRQb3NJbldvcmQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMiBieXRlID0gKHUzMilwU3RybVs0XTsKLSAgICAgICAgICAgIHUzMiB0bXAgPSAoOC1iaXRQb3NJbldvcmQpOwotICAgICAgICAgICAgb3V0IDw8PSBiaXRQb3NJbldvcmQ7Ci0gICAgICAgICAgICBvdXQgfD0gYnl0ZT4+dG1wOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAob3V0KTsKLSAgICB9Ci0gICAgLyogYXQgbGVhc3Qgb25lIGJpdCBpbiB0aGUgYnVmZmVyICovCi0gICAgZWxzZSBpZiAoYml0cyA+IDApCi0gICAgewotICAgICAgICBzaGlmdCA9IChpMzIpKDI0ICsgcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQpOwotICAgICAgICBvdXQgPSAodTMyKSgqcFN0cm0rKykgPDwgc2hpZnQ7Ci0gICAgICAgIGJpdHMgLT0gKGkzMikoOCAtIHBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKTsKLSAgICAgICAgd2hpbGUgKGJpdHMgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBzaGlmdCAtPSA4OwotICAgICAgICAgICAgb3V0IHw9ICh1MzIpKCpwU3RybSsrKSA8PCBzaGlmdDsKLSAgICAgICAgICAgIGJpdHMgLT0gODsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKG91dCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuICgwKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RGbHVzaEJpdHMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgUmVtb3ZlIGJpdHMgZnJvbSB0aGUgc3RyZWFtIGJ1ZmZlcgotCi0gICAgICAgIElucHV0OgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgICBudW1CaXRzICAgICAgICAgbnVtYmVyIG9mIGJpdHMgdG8gcmVtb3ZlCi0KLSAgICAgICAgT3V0cHV0OgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgRU5EX09GX1NUUkVBTSAgIG5vdCBlbm91Z2ggYml0cyBsZWZ0Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZuZGVmIEgyNjRERUNfTkVPTgotdTMyIGgyNjRic2RGbHVzaEJpdHMoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgbnVtQml0cykKLXsKLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwU3RybURhdGEtPnBTdHJtQnVmZlN0YXJ0KTsKLSAgICBBU1NFUlQocFN0cm1EYXRhLT5wU3RybUN1cnJQb3MpOwotICAgIEFTU0VSVChwU3RybURhdGEtPmJpdFBvc0luV29yZCA8IDgpOwotICAgIEFTU0VSVChwU3RybURhdGEtPmJpdFBvc0luV29yZCA9PSAocFN0cm1EYXRhLT5zdHJtQnVmZlJlYWRCaXRzICYgMHg3KSk7Ci0KLSAgICBwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHMgKz0gbnVtQml0czsKLSAgICBwU3RybURhdGEtPmJpdFBvc0luV29yZCA9IHBTdHJtRGF0YS0+c3RybUJ1ZmZSZWFkQml0cyAmIDB4NzsKLSAgICBpZiAoIChwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHMgKSA8PSAoOCpwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSkgKQotICAgIHsKLSAgICAgICAgcFN0cm1EYXRhLT5wU3RybUN1cnJQb3MgPSBwU3RybURhdGEtPnBTdHJtQnVmZlN0YXJ0ICsKLSAgICAgICAgICAgIChwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHMgPj4gMyk7Ci0gICAgICAgIHJldHVybihIQU5UUk9fT0spOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybihFTkRfT0ZfU1RSRUFNKTsKLQotfQotI2VuZGlmCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RJc0J5dGVBbGlnbmVkCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIENoZWNrIGlmIGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9uIGlzIGJ5dGUgYWxpZ25lZC4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIFRSVUUgICAgICAgIHN0cmVhbSBpcyBieXRlIGFsaWduZWQKLSAgICAgICAgICAgIEZBTFNFICAgICAgIHN0cmVhbSBpcyBub3QgYnl0ZSBhbGlnbmVkCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkSXNCeXRlQWxpZ25lZChzdHJtRGF0YV90ICpwU3RybURhdGEpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBpZiAoIXBTdHJtRGF0YS0+Yml0UG9zSW5Xb3JkKQotICAgICAgICByZXR1cm4oSEFOVFJPX1RSVUUpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuKEhBTlRST19GQUxTRSk7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0cmVhbS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3N0cmVhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDA0YjY2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF9zdHJlYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfU1RSRUFNX0gKLSNkZWZpbmUgSDI2NFNXREVDX1NUUkVBTV9ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIHU4ICAqcFN0cm1CdWZmU3RhcnQ7ICAgIC8qIHBvaW50ZXIgdG8gc3RhcnQgb2Ygc3RyZWFtIGJ1ZmZlciAqLwotICAgIHU4ICAqcFN0cm1DdXJyUG9zOyAgICAgIC8qIGN1cnJlbnQgcmVhZCBhZGRyZXNzIGluIHN0cmVhbSBidWZmZXIgKi8KLSAgICB1MzIgIGJpdFBvc0luV29yZDsgICAgICAvKiBiaXQgcG9zaXRpb24gaW4gc3RyZWFtIGJ1ZmZlciBieXRlICovCi0gICAgdTMyICBzdHJtQnVmZlNpemU7ICAgICAgLyogc2l6ZSBvZiBzdHJlYW0gYnVmZmVyIChieXRlcykgKi8KLSAgICB1MzIgIHN0cm1CdWZmUmVhZEJpdHM7ICAvKiBudW1iZXIgb2YgYml0cyByZWFkIGZyb20gc3RyZWFtIGJ1ZmZlciAqLwotfSBzdHJtRGF0YV90OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkR2V0Qml0cyhzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiBudW1CaXRzKTsKLQotdTMyIGgyNjRic2RTaG93Qml0czMyKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSk7Ci0KLXUzMiBoMjY0YnNkRmx1c2hCaXRzKHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwgdTMyIG51bUJpdHMpOwotCi11MzIgaDI2NGJzZElzQnl0ZUFsaWduZWQoc3RybURhdGFfdCAqKTsKLQotI2VuZGlmIC8qICNpZmRlZiBIMjY0U1dERUNfU1RSRUFNX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3RyYW5zZm9ybS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3RyYW5zZm9ybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWI2ZGQwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF90cmFuc2Zvcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDQwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgIDIuIEV4dGVybmFsIGNvbXBpbGVyIGZsYWdzCi0gICAgIDMuIE1vZHVsZSBkZWZpbmVzCi0gICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICAgNS4gRnVuY3Rpb25zCi0gICAgICAgICAgaDI2NGJzZFByb2Nlc3NCbG9jawotICAgICAgICAgIGgyNjRic2RQcm9jZXNzTHVtYURjCi0gICAgICAgICAgaDI2NGJzZFByb2Nlc3NDaHJvbWFEYwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF90cmFuc2Zvcm0uaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogU3dpdGNoIG9mZiB0aGUgZm9sbG93aW5nIExpbnQgbWVzc2FnZXMgZm9yIHRoaXMgZmlsZToKLSAqIEluZm8gNzAxOiBTaGlmdCBsZWZ0IG9mIHNpZ25lZCBxdWFudGl0eSAoaW50KQotICogSW5mbyA3MDI6IFNoaWZ0IHJpZ2h0IG9mIHNpZ25lZCBxdWFudGl0eSAoaW50KQotICovCi0vKmxpbnQgLWU3MDEgLWU3MDIgKi8KLQotLyogTGV2ZWxTY2FsZSBmdW5jdGlvbiAqLwotc3RhdGljIGNvbnN0IGkzMiBsZXZlbFNjYWxlWzZdWzNdID0gewotICAgIHsxMCwxMywxNn0sIHsxMSwxNCwxOH0sIHsxMywxNiwyMH0sIHsxNCwxOCwyM30sIHsxNiwyMCwyNX0sIHsxOCwyMywyOX19OwotCi0vKiBxcCAlIDYgYXMgYSBmdW5jdGlvbiBvZiBxcCAqLwotc3RhdGljIGNvbnN0IHU4IHFwTW9kNls1Ml0gPSB7MCwxLDIsMyw0LDUsMCwxLDIsMyw0LDUsMCwxLDIsMyw0LDUsMCwxLDIsMyw0LDUsCi0gICAgMCwxLDIsMyw0LDUsMCwxLDIsMyw0LDUsMCwxLDIsMyw0LDUsMCwxLDIsMyw0LDUsMCwxLDIsM307Ci0KLS8qIHFwIC8gNiBhcyBhIGZ1bmN0aW9uIG9mIHFwICovCi1zdGF0aWMgY29uc3QgdTggcXBEaXY2WzUyXSA9IHswLDAsMCwwLDAsMCwxLDEsMSwxLDEsMSwyLDIsMiwyLDIsMiwzLDMsMywzLDMsMywKLSAgICA0LDQsNCw0LDQsNCw1LDUsNSw1LDUsNSw2LDYsNiw2LDYsNiw3LDcsNyw3LDcsNyw4LDgsOCw4fTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RQcm9jZXNzQmxvY2sKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSB6aWctemFnIHNjYW4sIGludmVyc2Ugc2NhbGluZyBhbmQKLSAgICAgICAgICAgIGludmVyc2UgdHJhbnNmb3JtIGZvciBhIGx1bWEgb3IgYSBjaHJvbWEgcmVzaWR1YWwgYmxvY2sKLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBkYXRhICAgICAgICAgICAgcG9pbnRlciB0byBkYXRhIHRvIGJlIHByb2Nlc3NlZAotICAgICAgICAgICAgcXAgICAgICAgICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIKLSAgICAgICAgICAgIHNraXAgICAgICAgICAgICBza2lwIHByb2Nlc3Npbmcgb2YgZGF0YVswXSwgc2V0IHRvIG5vbi16ZXJvIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGMgY29lZmYgaGFubGVkIHNlcGFyYXRlbHkKLSAgICAgICAgICAgIGNvZWZmTWFwICAgICAgICAxNiBsc2IncyBpbmRpY2F0ZSB3aGljaCBjb2VmZnMgYXJlIG5vbi16ZXJvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdCAwIChsc2IpIGZvciBjb2VmZiAwLCBiaXQgMSBmb3IgY29lZmYgMSBldGMuCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIGRhdGEgICAgICAgICAgICBwcm9jZXNzZWQgZGF0YQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIHByb2Nlc3NlZCBkYXRhIG5vdCBpbiB2YWxpZCByYW5nZSBbLTUxMiwgNTExXQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdTMyIGgyNjRic2RQcm9jZXNzQmxvY2soaTMyICpkYXRhLCB1MzIgcXAsIHUzMiBza2lwLCB1MzIgY29lZmZNYXApCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgaTMyIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7Ci0gICAgaTMyIGQxLCBkMiwgZDM7Ci0gICAgdTMyIHJvdyxjb2w7Ci0gICAgdTMyIHFwRGl2OwotICAgIGkzMiAqcHRyOwotCi0vKiBDb2RlICovCi0KLSAgICBxcERpdiA9IHFwRGl2NltxcF07Ci0gICAgdG1wMSA9IGxldmVsU2NhbGVbcXBNb2Q2W3FwXV1bMF0gPDwgcXBEaXY7Ci0gICAgdG1wMiA9IGxldmVsU2NhbGVbcXBNb2Q2W3FwXV1bMV0gPDwgcXBEaXY7Ci0gICAgdG1wMyA9IGxldmVsU2NhbGVbcXBNb2Q2W3FwXV1bMl0gPDwgcXBEaXY7Ci0KLSAgICBpZiAoIXNraXApCi0gICAgICAgIGRhdGFbMF0gPSAoZGF0YVswXSAqIHRtcDEpOwotCi0gICAgLyogYXQgbGVhc3Qgb25lIG9mIHRoZSByb3dzIDEsIDIgb3IgMyBjb250YWluIG5vbi16ZXJvIGNvZWZmcywgbWFzayB0YWtlcwotICAgICAqIHRoZSBzY2FubmluZyBvcmRlciBpbnRvIGFjY291bnQgKi8KLSAgICBpZiAoY29lZmZNYXAgJiAweEZGOUMpCi0gICAgewotICAgICAgICAvKiBkbyB0aGUgemlnLXphZyBzY2FuIGFuZCBpbnZlcnNlIHF1YW50aXphdGlvbiAqLwotICAgICAgICBkMSA9IGRhdGFbMV07Ci0gICAgICAgIGQyID0gZGF0YVsxNF07Ci0gICAgICAgIGQzID0gZGF0YVsxNV07Ci0gICAgICAgIGRhdGFbMV0gPSAoZDEgKiB0bXAyKTsKLSAgICAgICAgZGF0YVsxNF0gPSAoZDIgKiB0bXAyKTsKLSAgICAgICAgZGF0YVsxNV0gPSAoZDMgKiB0bXAzKTsKLQotICAgICAgICBkMSA9IGRhdGFbMl07Ci0gICAgICAgIGQyID0gZGF0YVs1XTsKLSAgICAgICAgZDMgPSBkYXRhWzRdOwotICAgICAgICBkYXRhWzRdID0gKGQxICogdG1wMik7Ci0gICAgICAgIGRhdGFbMl0gID0gKGQyICogdG1wMSk7Ci0gICAgICAgIGRhdGFbNV0gPSAoZDMgKiB0bXAzKTsKLQotICAgICAgICBkMSA9IGRhdGFbOF07Ci0gICAgICAgIGQyID0gZGF0YVszXTsKLSAgICAgICAgZDMgPSBkYXRhWzZdOwotICAgICAgICB0bXAwID0gKGQxICogdG1wMik7Ci0gICAgICAgIGRhdGFbOF0gPSAoZDIgKiB0bXAxKTsKLSAgICAgICAgZGF0YVszXSAgPSAoZDMgKiB0bXAyKTsKLSAgICAgICAgZDEgPSBkYXRhWzddOwotICAgICAgICBkMiA9IGRhdGFbMTJdOwotICAgICAgICBkMyA9IGRhdGFbOV07Ci0gICAgICAgIGRhdGFbNl0gID0gKGQxICogdG1wMik7Ci0gICAgICAgIGRhdGFbN10gID0gKGQyICogdG1wMyk7Ci0gICAgICAgIGRhdGFbMTJdID0gKGQzICogdG1wMik7Ci0gICAgICAgIGRhdGFbOV0gID0gdG1wMDsKLQotICAgICAgICBkMSA9IGRhdGFbMTBdOwotICAgICAgICBkMiA9IGRhdGFbMTFdOwotICAgICAgICBkMyA9IGRhdGFbMTNdOwotICAgICAgICBkYXRhWzEzXSA9IChkMSAqIHRtcDMpOwotICAgICAgICBkYXRhWzEwXSA9IChkMiAqIHRtcDEpOwotICAgICAgICBkYXRhWzExXSA9IChkMyAqIHRtcDIpOwotCi0gICAgICAgIC8qIGhvcml6b250YWwgdHJhbnNmb3JtICovCi0gICAgICAgIGZvciAocm93ID0gNCwgcHRyID0gZGF0YTsgcm93LS07IHB0ciArPSA0KQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAwID0gcHRyWzBdICsgcHRyWzJdOwotICAgICAgICAgICAgdG1wMSA9IHB0clswXSAtIHB0clsyXTsKLSAgICAgICAgICAgIHRtcDIgPSAocHRyWzFdID4+IDEpIC0gcHRyWzNdOwotICAgICAgICAgICAgdG1wMyA9IHB0clsxXSArIChwdHJbM10gPj4gMSk7Ci0gICAgICAgICAgICBwdHJbMF0gPSB0bXAwICsgdG1wMzsKLSAgICAgICAgICAgIHB0clsxXSA9IHRtcDEgKyB0bXAyOwotICAgICAgICAgICAgcHRyWzJdID0gdG1wMSAtIHRtcDI7Ci0gICAgICAgICAgICBwdHJbM10gPSB0bXAwIC0gdG1wMzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qbGludCArZTY2MSArZTY2MiovCi0gICAgICAgIC8qIHRoZW4gdmVydGljYWwgdHJhbnNmb3JtICovCi0gICAgICAgIGZvciAoY29sID0gNDsgY29sLS07IGRhdGErKykKLSAgICAgICAgewotICAgICAgICAgICAgdG1wMCA9IGRhdGFbMF0gKyBkYXRhWzhdOwotICAgICAgICAgICAgdG1wMSA9IGRhdGFbMF0gLSBkYXRhWzhdOwotICAgICAgICAgICAgdG1wMiA9IChkYXRhWzRdID4+IDEpIC0gZGF0YVsxMl07Ci0gICAgICAgICAgICB0bXAzID0gZGF0YVs0XSArIChkYXRhWzEyXSA+PiAxKTsKLSAgICAgICAgICAgIGRhdGFbMCBdID0gKHRtcDAgKyB0bXAzICsgMzIpPj42OwotICAgICAgICAgICAgZGF0YVs0IF0gPSAodG1wMSArIHRtcDIgKyAzMik+PjY7Ci0gICAgICAgICAgICBkYXRhWzggXSA9ICh0bXAxIC0gdG1wMiArIDMyKT4+NjsKLSAgICAgICAgICAgIGRhdGFbMTJdID0gKHRtcDAgLSB0bXAzICsgMzIpPj42OwotICAgICAgICAgICAgLyogY2hlY2sgdGhhdCBlYWNoIHZhbHVlIGlzIGluIHRoZSByYW5nZSBbLTUxMiw1MTFdICovCi0gICAgICAgICAgICBpZiAoKCh1MzIpKGRhdGFbMF0gKyA1MTIpID4gMTAyMykgfHwKLSAgICAgICAgICAgICAgICAoKHUzMikoZGF0YVs0XSArIDUxMikgPiAxMDIzKSB8fAotICAgICAgICAgICAgICAgICgodTMyKShkYXRhWzhdICsgNTEyKSA+IDEwMjMpIHx8Ci0gICAgICAgICAgICAgICAgKCh1MzIpKGRhdGFbMTJdICsgNTEyKSA+IDEwMjMpICkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAvKiByb3dzIDEsIDIgYW5kIDMgYXJlIHplcm8gKi8KLSAgICB7Ci0gICAgICAgIC8qIG9ubHkgZGMtY29lZmYgaXMgbm9uLXplcm8sIGkuZS4gY29lZmZzIGF0IG9yaWdpbmFsIHBvc2l0aW9ucwotICAgICAgICAgKiAxLCA1IGFuZCA2IGFyZSB6ZXJvICovCi0gICAgICAgIGlmICgoY29lZmZNYXAgJiAweDYyKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXAwID0gKGRhdGFbMF0gKyAzMikgPj4gNjsKLSAgICAgICAgICAgIC8qIGNoZWNrIHRoYXQgdmFsdWUgaXMgaW4gdGhlIHJhbmdlIFstNTEyLDUxMV0gKi8KLSAgICAgICAgICAgIGlmICgodTMyKSh0bXAwICsgNTEyKSA+IDEwMjMpCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgZGF0YVswXSA9IGRhdGFbMV0gID0gZGF0YVsyXSAgPSBkYXRhWzNdICA9IGRhdGFbNF0gID0gZGF0YVs1XSAgPQotICAgICAgICAgICAgICAgICAgICAgIGRhdGFbNl0gID0gZGF0YVs3XSAgPSBkYXRhWzhdICA9IGRhdGFbOV0gID0gZGF0YVsxMF0gPQotICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMTFdID0gZGF0YVsxMl0gPSBkYXRhWzEzXSA9IGRhdGFbMTRdID0gZGF0YVsxNV0gPQotICAgICAgICAgICAgICAgICAgICAgIHRtcDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvKiBhdCBsZWFzdCBvbmUgb2YgdGhlIGNvZWZmcyAxLCA1IG9yIDYgaXMgbm9uLXplcm8gKi8KLSAgICAgICAgewotICAgICAgICAgICAgZGF0YVsxXSA9IChkYXRhWzFdICogdG1wMik7Ci0gICAgICAgICAgICBkYXRhWzJdID0gKGRhdGFbNV0gKiB0bXAxKTsKLSAgICAgICAgICAgIGRhdGFbM10gPSAoZGF0YVs2XSAqIHRtcDIpOwotICAgICAgICAgICAgdG1wMCA9IGRhdGFbMF0gKyBkYXRhWzJdOwotICAgICAgICAgICAgdG1wMSA9IGRhdGFbMF0gLSBkYXRhWzJdOwotICAgICAgICAgICAgdG1wMiA9IChkYXRhWzFdID4+IDEpIC0gZGF0YVszXTsKLSAgICAgICAgICAgIHRtcDMgPSBkYXRhWzFdICsgKGRhdGFbM10gPj4gMSk7Ci0gICAgICAgICAgICBkYXRhWzBdID0gKHRtcDAgKyB0bXAzICsgMzIpPj42OwotICAgICAgICAgICAgZGF0YVsxXSA9ICh0bXAxICsgdG1wMiArIDMyKT4+NjsKLSAgICAgICAgICAgIGRhdGFbMl0gPSAodG1wMSAtIHRtcDIgKyAzMik+PjY7Ci0gICAgICAgICAgICBkYXRhWzNdID0gKHRtcDAgLSB0bXAzICsgMzIpPj42OwotICAgICAgICAgICAgZGF0YVs0XSA9IGRhdGFbOF0gPSBkYXRhWzEyXSA9IGRhdGFbMF07Ci0gICAgICAgICAgICBkYXRhWzVdID0gZGF0YVs5XSA9IGRhdGFbMTNdID0gZGF0YVsxXTsKLSAgICAgICAgICAgIGRhdGFbNl0gPSBkYXRhWzEwXSA9IGRhdGFbMTRdID0gZGF0YVsyXTsKLSAgICAgICAgICAgIGRhdGFbN10gPSBkYXRhWzExXSA9IGRhdGFbMTVdID0gZGF0YVszXTsKLSAgICAgICAgICAgIC8qIGNoZWNrIHRoYXQgZWFjaCB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgWy01MTIsNTExXSAqLwotICAgICAgICAgICAgaWYgKCgodTMyKShkYXRhWzBdICsgNTEyKSA+IDEwMjMpIHx8Ci0gICAgICAgICAgICAgICAgKCh1MzIpKGRhdGFbMV0gKyA1MTIpID4gMTAyMykgfHwKLSAgICAgICAgICAgICAgICAoKHUzMikoZGF0YVsyXSArIDUxMikgPiAxMDIzKSB8fAotICAgICAgICAgICAgICAgICgodTMyKShkYXRhWzNdICsgNTEyKSA+IDEwMjMpICkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IGgyNjRic2RQcm9jZXNzTHVtYURjCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIEZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgemlnLXphZyBzY2FuLCBpbnZlcnNlIHRyYW5zZm9ybSBhbmQKLSAgICAgICAgICAgIGludmVyc2Ugc2NhbGluZyBmb3IgYSBsdW1hIERDIGNvZWZmaWNpZW50cyBibG9jawotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIGRhdGEgICAgICAgICAgICBwb2ludGVyIHRvIGRhdGEgdG8gYmUgcHJvY2Vzc2VkCi0gICAgICAgICAgICBxcCAgICAgICAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlcgotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBkYXRhICAgICAgICAgICAgcHJvY2Vzc2VkIGRhdGEKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgbm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBoMjY0YnNkUHJvY2Vzc0x1bWFEYyhpMzIgKmRhdGEsIHUzMiBxcCkKLXsKLQotLyogVmFyaWFibGVzICovCi0KLSAgICBpMzIgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKLSAgICB1MzIgcm93LGNvbDsKLSAgICB1MzIgcXBNb2QsIHFwRGl2OwotICAgIGkzMiBsZXZTY2FsZTsKLSAgICBpMzIgKnB0cjsKLQotLyogQ29kZSAqLwotCi0gICAgcXBNb2QgPSBxcE1vZDZbcXBdOwotICAgIHFwRGl2ID0gcXBEaXY2W3FwXTsKLQotICAgIC8qIHppZy16YWcgc2NhbiAqLwotICAgIHRtcDAgPSBkYXRhWzJdOwotICAgIGRhdGFbMl0gID0gZGF0YVs1XTsKLSAgICBkYXRhWzVdID0gZGF0YVs0XTsKLSAgICBkYXRhWzRdID0gdG1wMDsKLQotICAgIHRtcDAgPSBkYXRhWzhdOwotICAgIGRhdGFbOF0gPSBkYXRhWzNdOwotICAgIGRhdGFbM10gID0gZGF0YVs2XTsKLSAgICBkYXRhWzZdICA9IGRhdGFbN107Ci0gICAgZGF0YVs3XSAgPSBkYXRhWzEyXTsKLSAgICBkYXRhWzEyXSA9IGRhdGFbOV07Ci0gICAgZGF0YVs5XSAgPSB0bXAwOwotCi0gICAgdG1wMCA9IGRhdGFbMTBdOwotICAgIGRhdGFbMTBdID0gZGF0YVsxMV07Ci0gICAgZGF0YVsxMV0gPSBkYXRhWzEzXTsKLSAgICBkYXRhWzEzXSA9IHRtcDA7Ci0KLSAgICAvKiBob3Jpem9udGFsIHRyYW5zZm9ybSAqLwotICAgIGZvciAocm93ID0gNCwgcHRyID0gZGF0YTsgcm93LS07IHB0ciArPSA0KQotICAgIHsKLSAgICAgICAgdG1wMCA9IHB0clswXSArIHB0clsyXTsKLSAgICAgICAgdG1wMSA9IHB0clswXSAtIHB0clsyXTsKLSAgICAgICAgdG1wMiA9IHB0clsxXSAtIHB0clszXTsKLSAgICAgICAgdG1wMyA9IHB0clsxXSArIHB0clszXTsKLSAgICAgICAgcHRyWzBdID0gdG1wMCArIHRtcDM7Ci0gICAgICAgIHB0clsxXSA9IHRtcDEgKyB0bXAyOwotICAgICAgICBwdHJbMl0gPSB0bXAxIC0gdG1wMjsKLSAgICAgICAgcHRyWzNdID0gdG1wMCAtIHRtcDM7Ci0gICAgfQotCi0gICAgLypsaW50ICtlNjYxICtlNjYyKi8KLSAgICAvKiB0aGVuIHZlcnRpY2FsIHRyYW5zZm9ybSBhbmQgaW52ZXJzZSBzY2FsaW5nICovCi0gICAgbGV2U2NhbGUgPSBsZXZlbFNjYWxlWyBxcE1vZCBdWzBdOwotICAgIGlmIChxcCA+PSAxMikKLSAgICB7Ci0gICAgICAgIGxldlNjYWxlIDw8PSAocXBEaXYtMik7Ci0gICAgICAgIGZvciAoY29sID0gNDsgY29sLS07IGRhdGErKykKLSAgICAgICAgewotICAgICAgICAgICAgdG1wMCA9IGRhdGFbMF0gKyBkYXRhWzggXTsKLSAgICAgICAgICAgIHRtcDEgPSBkYXRhWzBdIC0gZGF0YVs4IF07Ci0gICAgICAgICAgICB0bXAyID0gZGF0YVs0XSAtIGRhdGFbMTJdOwotICAgICAgICAgICAgdG1wMyA9IGRhdGFbNF0gKyBkYXRhWzEyXTsKLSAgICAgICAgICAgIGRhdGFbMCBdID0gKCh0bXAwICsgdG1wMykqbGV2U2NhbGUpOwotICAgICAgICAgICAgZGF0YVs0IF0gPSAoKHRtcDEgKyB0bXAyKSpsZXZTY2FsZSk7Ci0gICAgICAgICAgICBkYXRhWzggXSA9ICgodG1wMSAtIHRtcDIpKmxldlNjYWxlKTsKLSAgICAgICAgICAgIGRhdGFbMTJdID0gKCh0bXAwIC0gdG1wMykqbGV2U2NhbGUpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGkzMiB0bXA7Ci0gICAgICAgIHRtcCA9ICgoMSAtIHFwRGl2KSA9PSAwKSA/IDEgOiAyOwotICAgICAgICBmb3IgKGNvbCA9IDQ7IGNvbC0tOyBkYXRhKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcDAgPSBkYXRhWzBdICsgZGF0YVs4IF07Ci0gICAgICAgICAgICB0bXAxID0gZGF0YVswXSAtIGRhdGFbOCBdOwotICAgICAgICAgICAgdG1wMiA9IGRhdGFbNF0gLSBkYXRhWzEyXTsKLSAgICAgICAgICAgIHRtcDMgPSBkYXRhWzRdICsgZGF0YVsxMl07Ci0gICAgICAgICAgICBkYXRhWzAgXSA9ICgodG1wMCArIHRtcDMpKmxldlNjYWxlK3RtcCkgPj4gKDItcXBEaXYpOwotICAgICAgICAgICAgZGF0YVs0IF0gPSAoKHRtcDEgKyB0bXAyKSpsZXZTY2FsZSt0bXApID4+ICgyLXFwRGl2KTsKLSAgICAgICAgICAgIGRhdGFbOCBdID0gKCh0bXAxIC0gdG1wMikqbGV2U2NhbGUrdG1wKSA+PiAoMi1xcERpdik7Ci0gICAgICAgICAgICBkYXRhWzEyXSA9ICgodG1wMCAtIHRtcDMpKmxldlNjYWxlK3RtcCkgPj4gKDItcXBEaXYpOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZFByb2Nlc3NDaHJvbWFEYwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBGdW5jdGlvbiBwZXJmb3JtcyBpbnZlcnNlIHRyYW5zZm9ybSBhbmQgaW52ZXJzZSBzY2FsaW5nIGZvciBhCi0gICAgICAgICAgICBjaHJvbWEgREMgY29lZmZpY2llbnRzIGJsb2NrCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgZGF0YSAgICAgICAgICAgIHBvaW50ZXIgdG8gZGF0YSB0byBiZSBwcm9jZXNzZWQKLSAgICAgICAgICAgIHFwICAgICAgICAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIGRhdGEgICAgICAgICAgICBwcm9jZXNzZWQgZGF0YQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBub25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIGgyNjRic2RQcm9jZXNzQ2hyb21hRGMoaTMyICpkYXRhLCB1MzIgcXApCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgaTMyIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7Ci0gICAgdTMyIHFwRGl2OwotICAgIGkzMiBsZXZTY2FsZTsKLSAgICB1MzIgbGV2U2hpZnQ7Ci0KLS8qIENvZGUgKi8KLQotICAgIHFwRGl2ID0gcXBEaXY2W3FwXTsKLSAgICBsZXZTY2FsZSA9IGxldmVsU2NhbGVbIHFwTW9kNltxcF0gXVswXTsKLQotICAgIGlmIChxcCA+PSA2KQotICAgIHsKLSAgICAgICAgbGV2U2NhbGUgPDw9IChxcERpdi0xKTsKLSAgICAgICAgbGV2U2hpZnQgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBsZXZTaGlmdCA9IDE7Ci0gICAgfQotCi0gICAgdG1wMCA9IGRhdGFbMF0gKyBkYXRhWzJdOwotICAgIHRtcDEgPSBkYXRhWzBdIC0gZGF0YVsyXTsKLSAgICB0bXAyID0gZGF0YVsxXSAtIGRhdGFbM107Ci0gICAgdG1wMyA9IGRhdGFbMV0gKyBkYXRhWzNdOwotICAgIGRhdGFbMF0gPSAoKHRtcDAgKyB0bXAzKSAqIGxldlNjYWxlKSA+PiBsZXZTaGlmdDsKLSAgICBkYXRhWzFdID0gKCh0bXAwIC0gdG1wMykgKiBsZXZTY2FsZSkgPj4gbGV2U2hpZnQ7Ci0gICAgZGF0YVsyXSA9ICgodG1wMSArIHRtcDIpICogbGV2U2NhbGUpID4+IGxldlNoaWZ0OwotICAgIGRhdGFbM10gPSAoKHRtcDEgLSB0bXAyKSAqIGxldlNjYWxlKSA+PiBsZXZTaGlmdDsKLSAgICB0bXAwID0gZGF0YVs0XSArIGRhdGFbNl07Ci0gICAgdG1wMSA9IGRhdGFbNF0gLSBkYXRhWzZdOwotICAgIHRtcDIgPSBkYXRhWzVdIC0gZGF0YVs3XTsKLSAgICB0bXAzID0gZGF0YVs1XSArIGRhdGFbN107Ci0gICAgZGF0YVs0XSA9ICgodG1wMCArIHRtcDMpICogbGV2U2NhbGUpID4+IGxldlNoaWZ0OwotICAgIGRhdGFbNV0gPSAoKHRtcDAgLSB0bXAzKSAqIGxldlNjYWxlKSA+PiBsZXZTaGlmdDsKLSAgICBkYXRhWzZdID0gKCh0bXAxICsgdG1wMikgKiBsZXZTY2FsZSkgPj4gbGV2U2hpZnQ7Ci0gICAgZGF0YVs3XSA9ICgodG1wMSAtIHRtcDIpICogbGV2U2NhbGUpID4+IGxldlNoaWZ0OwotCi19Ci0KLS8qbGludCArZTcwMSArZTcwMiAqLwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF90cmFuc2Zvcm0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF90cmFuc2Zvcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY0MWEyMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdHJhbnNmb3JtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIFRhYmxlIG9mIGNvbnRlbnRzCi0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotICAgIDMuIERhdGEgdHlwZXMKLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZm5kZWYgSDI2NFNXREVDX1RSQU5TRk9STV9ICi0jZGVmaW5lIEgyNjRTV0RFQ19UUkFOU0ZPUk1fSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gRGF0YSB0eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZFByb2Nlc3NCbG9jayhpMzIgKmRhdGEsIHUzMiBxcCwgdTMyIHNraXAsIHUzMiBjb2VmZk1hcCk7Ci12b2lkIGgyNjRic2RQcm9jZXNzTHVtYURjKGkzMiAqZGF0YSwgdTMyIHFwKTsKLXZvaWQgaDI2NGJzZFByb2Nlc3NDaHJvbWFEYyhpMzIgKmRhdGEsIHUzMiBxcCk7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1RSQU5TRk9STV9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF91dGlsLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdXRpbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjk3YTI4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF91dGlsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIGgyNjRic2RDb3VudExlYWRpbmdaZXJvcwotICAgICAgICAgIGgyNjRic2RSYnNwVHJhaWxpbmdCaXRzCi0gICAgICAgICAgaDI2NGJzZE1vcmVSYnNwRGF0YQotICAgICAgICAgIGgyNjRic2ROZXh0TWJBZGRyZXNzCi0gICAgICAgICAgaDI2NGJzZFNldEN1cnJJbWFnZU1iUG9pbnRlcnMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogbG9vay11cCB0YWJsZSBmb3IgZXhwZWN0ZWQgdmFsdWVzIG9mIHN0dWZmaW5nIGJpdHMgKi8KLXN0YXRpYyBjb25zdCB1MzIgc3R1ZmZpbmdUYWJsZVs4XSA9IHsweDEsMHgyLDB4NCwweDgsMHgxMCwweDIwLDB4NDAsMHg4MH07Ci0KLS8qIGxvb2stdXAgdGFibGUgZm9yIGNocm9tYSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGFzIGEgZnVuY3Rpb24gb2YgbHVtYSBRUCAqLwotY29uc3QgdTMyIGgyNjRic2RRcENbNTJdID0gezAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksCi0gICAgMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMjksMzAsMzEsMzIsMzIsMzMsMzQsMzQsMzUsMzUsMzYsMzYsMzcsMzcsMzcsCi0gICAgMzgsMzgsMzgsMzksMzksMzksMzl9OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIDUuMSAgRnVuY3Rpb246IGgyNjRic2RDb3VudExlYWRpbmdaZXJvcwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBDb3VudCBsZWFkaW5nIHplcm9zIGluIGEgY29kZSB3b3JkLiBDb2RlIHdvcmQgaXMgYXNzdW1lZCB0byBiZQotICAgICAgICAgICAgcmlnaHQtYWxpZ25lZCwgbGFzdCBiaXQgb2YgdGhlIGNvZGUgd29yZCBpbiB0aGUgbHNiIG9mIHRoZSB2YWx1ZS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICB2YWx1ZSAgIGNvZGUgd29yZAotICAgICAgICAgICAgbGVuZ3RoICBudW1iZXIgb2YgYml0cyBpbiB0aGUgY29kZSB3b3JkCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgbnVtYmVyIG9mIGxlYWRpbmcgemVyb3MgaW4gdGhlIGNvZGUgd29yZAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmbmRlZiBIMjY0REVDX05FT04KLXUzMiBoMjY0YnNkQ291bnRMZWFkaW5nWmVyb3ModTMyIHZhbHVlLCB1MzIgbGVuZ3RoKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiB6ZXJvcyA9IDA7Ci0gICAgdTMyIG1hc2sgPSAxIDw8IChsZW5ndGggLSAxKTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKGxlbmd0aCA8PSAzMik7Ci0KLSAgICB3aGlsZSAobWFzayAmJiAhKHZhbHVlICYgbWFzaykpCi0gICAgewotICAgICAgICB6ZXJvcysrOwotICAgICAgICBtYXNrID4+PSAxOwotICAgIH0KLSAgICByZXR1cm4oemVyb3MpOwotCi19Ci0jZW5kaWYKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIDUuMiAgRnVuY3Rpb246IGgyNjRic2RSYnNwVHJhaWxpbmdCaXRzCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIENoZWNrIFJhdyBCeXRlIFN0cmVhbSBQYXlsb2FkIChSQlNQKSB0cmFpbGluZyBiaXRzLCBpLmUuIHN0dWZmaW5nLgotICAgICAgICAgICAgUmVzdCBvZiB0aGUgY3VycmVudCBieXRlICh3aG9sZSBieXRlIGlmIGFsbHJlYWR5IGJ5dGUgYWxpZ25lZCkKLSAgICAgICAgICAgIGluIHRoZSBzdHJlYW0gYnVmZmVyIHNoYWxsIGNvbnRhaW4gYSAnMScgYml0IGZvbGxvd2VkIGJ5IHplcm8gb3IKLSAgICAgICAgICAgIG1vcmUgJzAnIGJpdHMuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICBSQlNQIHRyYWlsaW5nIGJpdHMgZm91bmQKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgIG90aGVyd2lzZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZFJic3BUcmFpbGluZ0JpdHMoc3RybURhdGFfdCAqcFN0cm1EYXRhKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBzdHVmZmluZzsKLSAgICB1MzIgc3R1ZmZpbmdMZW5ndGg7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwU3RybURhdGEtPmJpdFBvc0luV29yZCA8IDgpOwotCi0gICAgc3R1ZmZpbmdMZW5ndGggPSA4IC0gcFN0cm1EYXRhLT5iaXRQb3NJbldvcmQ7Ci0KLSAgICBzdHVmZmluZyA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgc3R1ZmZpbmdMZW5ndGgpOwotICAgIGlmIChzdHVmZmluZyA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICBpZiAoc3R1ZmZpbmcgIT0gc3R1ZmZpbmdUYWJsZVtzdHVmZmluZ0xlbmd0aCAtIDFdKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICA1LjMgIEZ1bmN0aW9uOiBoMjY0YnNkTW9yZVJic3BEYXRhCi0KLSAgICAgICAgRnVuY3Rpb25hbCBkZXNjcmlwdGlvbjoKLSAgICAgICAgICAgIENoZWNrIGlmIHRoZXJlIGlzIG1vcmUgZGF0YSBpbiB0aGUgY3VycmVudCBSQlNQLiBUaGUgc3RhbmRhcmQKLSAgICAgICAgICAgIGRlZmluZXMgdGhpcyBmdW5jdGlvbiBzbyB0aGF0IHRoZXJlIGlzIG1vcmUgZGF0YSBpZgotICAgICAgICAgICAgICAgIC1tb3JlIHRoYW4gOCBiaXRzIGxlZnQgb3IKLSAgICAgICAgICAgICAgICAtbGFzdCBiaXRzIGFyZSBub3QgUkJTUCB0cmFpbGluZyBiaXRzCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgbm9uZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fVFJVRSAgICB0aGVyZSBpcyBtb3JlIGRhdGEKLSAgICAgICAgICAgIEhBTlRST19GQUxTRSAgIG5vIG1vcmUgZGF0YQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZE1vcmVSYnNwRGF0YShzdHJtRGF0YV90ICpwU3RybURhdGEpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGJpdHM7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU3RybURhdGEpOwotICAgIEFTU0VSVChwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHMgPD0gOCAqIHBTdHJtRGF0YS0+c3RybUJ1ZmZTaXplKTsKLQotICAgIGJpdHMgPSBwU3RybURhdGEtPnN0cm1CdWZmU2l6ZSAqIDggLSBwU3RybURhdGEtPnN0cm1CdWZmUmVhZEJpdHM7Ci0KLSAgICBpZiAoYml0cyA9PSAwKQotICAgICAgICByZXR1cm4oSEFOVFJPX0ZBTFNFKTsKLQotICAgIGlmICggKGJpdHMgPiA4KSB8fAotICAgICAgICAgKChoMjY0YnNkU2hvd0JpdHMzMihwU3RybURhdGEpPj4oMzItYml0cykpICE9ICgxdWwgPDwgKGJpdHMtMSkpKSApCi0gICAgICAgIHJldHVybihIQU5UUk9fVFJVRSk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4oSEFOVFJPX0ZBTFNFKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICA1LjQgIEZ1bmN0aW9uOiBoMjY0YnNkTmV4dE1iQWRkcmVzcwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBHZXQgYWRkcmVzcyBvZiB0aGUgbmV4dCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHNsaWNlIGdyb3VwLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTbGljZUdyb3VwTWFwICAgICAgc2xpY2UgZ3JvdXAgZm9yIGVhY2ggbWFjcm9ibG9jawotICAgICAgICAgICAgcGljU2l6ZUluTWJzICAgICAgICBzaXplIG9mIHRoZSBwaWN0dXJlCi0gICAgICAgICAgICBjdXJyTWJBZGRyICAgICAgICAgIHdoZXJlIHRvIHN0YXJ0Ci0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIG5vbmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgYWRkcmVzcyBvZiB0aGUgbmV4dCBtYWNyb2Jsb2NrCi0gICAgICAgICAgICAwICAgaWYgbm9uZSBvZiB0aGUgZm9sbG93aW5nIG1hY3JvYmxvY2tzIGJlbG9uZyB0byBzYW1lIHNsaWNlCi0gICAgICAgICAgICAgICAgZ3JvdXAgYXMgY3Vyck1iQWRkcgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZE5leHRNYkFkZHJlc3ModTMyICpwU2xpY2VHcm91cE1hcCwgdTMyIHBpY1NpemVJbk1icywgdTMyIGN1cnJNYkFkZHIpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGksIHNsaWNlR3JvdXA7Ci0KLS8qIENvZGUgKi8KLQotICAgIEFTU0VSVChwU2xpY2VHcm91cE1hcCk7Ci0gICAgQVNTRVJUKHBpY1NpemVJbk1icyk7Ci0gICAgQVNTRVJUKGN1cnJNYkFkZHIgPCBwaWNTaXplSW5NYnMpOwotCi0gICAgc2xpY2VHcm91cCA9IHBTbGljZUdyb3VwTWFwW2N1cnJNYkFkZHJdOwotCi0gICAgaSA9IGN1cnJNYkFkZHIgKyAxOwotICAgIHdoaWxlICgoaSA8IHBpY1NpemVJbk1icykgJiYgKHBTbGljZUdyb3VwTWFwW2ldICE9IHNsaWNlR3JvdXApKQotICAgIHsKLSAgICAgICAgaSsrOwotICAgIH0KLQotICAgIGlmIChpID09IHBpY1NpemVJbk1icykKLSAgICAgICAgaSA9IDA7Ci0KLSAgICByZXR1cm4oaSk7Ci0KLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICA1LjUgIEZ1bmN0aW9uOiBoMjY0YnNkU2V0Q3VyckltYWdlTWJQb2ludGVycwotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBTZXQgbHVtYSBhbmQgY2hyb21hIHBvaW50ZXJzIGluIGltYWdlX3QgZm9yIGN1cnJlbnQgTUIKLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBpbWFnZSAgICAgICBDdXJyZW50IGltYWdlCi0gICAgICAgICAgICBtYk51bSAgICAgICBudW1iZXIgb2YgY3VycmVudCBNQgotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBub25lCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIG5vbmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIGgyNjRic2RTZXRDdXJySW1hZ2VNYlBvaW50ZXJzKGltYWdlX3QgKmltYWdlLCB1MzIgbWJOdW0pCi17Ci0gICAgdTMyIHdpZHRoLCBoZWlnaHQ7Ci0gICAgdTMyIHBpY1NpemU7Ci0gICAgdTMyIHJvdywgY29sOwotICAgIHUzMiB0bXA7Ci0KLSAgICB3aWR0aCA9IGltYWdlLT53aWR0aDsKLSAgICBoZWlnaHQgPSBpbWFnZS0+aGVpZ2h0OwotICAgIHJvdyA9IG1iTnVtIC8gd2lkdGg7Ci0gICAgY29sID0gbWJOdW0gJSB3aWR0aDsKLQotICAgIHRtcCA9IHJvdyAqIHdpZHRoOwotICAgIHBpY1NpemUgPSB3aWR0aCAqIGhlaWdodDsKLQotICAgIGltYWdlLT5sdW1hID0gKHU4KikoaW1hZ2UtPmRhdGEgKyBjb2wgKiAxNiArIHRtcCAqIDI1Nik7Ci0gICAgaW1hZ2UtPmNiID0gKHU4KikoaW1hZ2UtPmRhdGEgKyBwaWNTaXplICogMjU2ICsgdG1wICogNjQgKyBjb2wgKiA4KTsKLSAgICBpbWFnZS0+Y3IgPSAodTgqKShpbWFnZS0+Y2IgKyBwaWNTaXplICogNjQpOwotfQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF91dGlsLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdXRpbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDNjZjgyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF91dGlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19VVElMX0gKLSNkZWZpbmUgSDI2NFNXREVDX1VUSUxfSAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmIF9BU1NFUlRfVVNFRAotI2luY2x1ZGUgPGFzc2VydC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJIMjY0U3dEZWNBcGkuaCIKLQotI2lmIGRlZmluZWQoX1JBTkdFX0NIRUNLKSB8fCBkZWZpbmVkKF9ERUJVR19QUklOVCkgfHwgZGVmaW5lZChfRVJST1JfUFJJTlQpCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgotI2luY2x1ZGUgImgyNjRic2RfaW1hZ2UuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBIQU5UUk9fT0sgICAwCi0jZGVmaW5lIEhBTlRST19OT0sgIDEKLQotI2RlZmluZSBIQU5UUk9fVFJVRSAgICAgKDEpCi0jZGVmaW5lIEhBTlRST19GQUxTRSAgICAoMCkKLQotI2lmbmRlZiBOVUxMCi0jZGVmaW5lIE5VTEwgMAotI2VuZGlmCi0KLSNkZWZpbmUgTUVNT1JZX0FMTE9DQVRJT05fRVJST1IgMHhGRkZGCi0jZGVmaW5lIFBBUkFNX1NFVF9FUlJPUiAweEZGRjAKLQotLyogdmFsdWUgdG8gYmUgcmV0dXJuZWQgYnkgR2V0Qml0cyBpZiBzdHJlYW0gYnVmZmVyIGlzIGVtcHR5ICovCi0jZGVmaW5lIEVORF9PRl9TVFJFQU0gMHhGRkZGRkZGRlUKLQotI2RlZmluZSBFTVBUWV9SRVNJRFVBTF9JTkRJQ0FUT1IgMHhGRkZGRkYKLQotLyogbWFjcm8gdG8gbWFyayBhIHJlc2lkdWFsIGJsb2NrIGVtcHR5LCBpLmUuIGNvbnRhaW4gemVybyBjb2VmZmljaWVudHMgKi8KLSNkZWZpbmUgTUFSS19SRVNJRFVBTF9FTVBUWShyZXNpZHVhbCkgKChyZXNpZHVhbClbMF0gPSBFTVBUWV9SRVNJRFVBTF9JTkRJQ0FUT1IpCi0vKiBtYWNybyB0byBjaGVjayBpZiByZXNpZHVhbCBibG9jayBpcyBlbXB0eSAqLwotI2RlZmluZSBJU19SRVNJRFVBTF9FTVBUWShyZXNpZHVhbCkgKChyZXNpZHVhbClbMF0gPT0gRU1QVFlfUkVTSURVQUxfSU5ESUNBVE9SKQotCi0vKiBtYWNybyBmb3IgYXNzZXJ0aW9uLCB1c2VkIG9ubHkgaWYgY29tcGlsZXIgZmxhZyBfQVNTRVJUX1VTRUQgaXMgZGVmaW5lZCAqLwotI2lmZGVmIF9BU1NFUlRfVVNFRAotI2RlZmluZSBBU1NFUlQoZXhwcikgYXNzZXJ0KGV4cHIpCi0jZWxzZQotI2RlZmluZSBBU1NFUlQoZXhwcikKLSNlbmRpZgotCi0vKiBtYWNybyBmb3IgcmFuZ2UgY2hlY2tpbmcgYW4gdmFsdWUsIHVzZWQgb25seSBpZiBjb21waWxlciBmbGFnIF9SQU5HRV9DSEVDSwotICogaXMgZGVmaW5lZCAqLwotI2lmZGVmIF9SQU5HRV9DSEVDSwotI2RlZmluZSBSQU5HRV9DSEVDSyh2YWx1ZSwgbWluQm91bmQsIG1heEJvdW5kKSBcCi17IFwKLSAgICBpZiAoKHZhbHVlKSA8IChtaW5Cb3VuZCkgfHwgKHZhbHVlKSA+IChtYXhCb3VuZCkpIFwKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBWYWx1ZSBleGNlZWRzIGdpdmVuIGxpbWl0KHMpIVxuIik7IFwKLX0KLSNlbHNlCi0jZGVmaW5lIFJBTkdFX0NIRUNLKHZhbHVlLCBtaW5Cb3VuZCwgbWF4Qm91bmQpCi0jZW5kaWYKLQotLyogbWFjcm8gZm9yIHJhbmdlIGNoZWNraW5nIGFuIGFycmF5LCB1c2VkIG9ubHkgaWYgY29tcGlsZXIgZmxhZyBfUkFOR0VfQ0hFQ0sKLSAqIGlzIGRlZmluZWQgKi8KLSNpZmRlZiBfUkFOR0VfQ0hFQ0sKLSNkZWZpbmUgUkFOR0VfQ0hFQ0tfQVJSQVkoYXJyYXksIG1pbkJvdW5kLCBtYXhCb3VuZCwgbGVuZ3RoKSBcCi17IFwKLSAgICBpMzIgaTsgXAotICAgIGZvciAoaSA9IDA7IGkgPCAobGVuZ3RoKTsgaSsrKSBcCi0gICAgICAgIGlmICgoYXJyYXkpW2ldIDwgKG1pbkJvdW5kKSB8fCAoYXJyYXkpW2ldID4gKG1heEJvdW5kKSkgXAotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIldhcm5pbmc6IFZhbHVlIFslZF0gZXhjZWVkcyBnaXZlbiBsaW1pdChzKSFcbiIsaSk7IFwKLX0KLSNlbHNlCi0jZGVmaW5lIFJBTkdFX0NIRUNLX0FSUkFZKGFycmF5LCBtaW5Cb3VuZCwgbWF4Qm91bmQsIGxlbmd0aCkKLSNlbmRpZgotCi0vKiBtYWNybyBmb3IgZGVidWcgcHJpbnRpbmcsIHVzZWQgb25seSBpZiBjb21waWxlciBmbGFnIF9ERUJVR19QUklOVCBpcwotICogZGVmaW5lZCAqLwotI2lmZGVmIF9ERUJVR19QUklOVAotI2RlZmluZSBERUJVRyhhcmdzKSBwcmludGYgYXJncwotI2Vsc2UKLSNkZWZpbmUgREVCVUcoYXJncykKLSNlbmRpZgotCi0vKiBtYWNybyBmb3IgZXJyb3IgcHJpbnRpbmcsIHVzZWQgb25seSBpZiBjb21waWxlciBmbGFnIF9FUlJPUl9QUklOVCBpcwotICogZGVmaW5lZCAqLwotI2lmZGVmIF9FUlJPUl9QUklOVAotI2RlZmluZSBFUFJJTlQobXNnKSBmcHJpbnRmKHN0ZGVyciwiRVJST1I6ICVzXG4iLG1zZykKLSNlbHNlCi0jZGVmaW5lIEVQUklOVChtc2cpCi0jZW5kaWYKLQotLyogbWFjcm8gdG8gZ2V0IHNtYWxsZXIgb2YgdHdvIHZhbHVlcyAqLwotI2RlZmluZSBNSU4oYSwgYikgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQotCi0vKiBtYWNybyB0byBnZXQgZ3JlYXRlciBvZiB0d28gdmFsdWVzICovCi0jZGVmaW5lIE1BWChhLCBiKSAoKChhKSA+IChiKSkgPyAoYSkgOiAoYikpCi0KLS8qIG1hY3JvIHRvIGdldCBhYnNvbHV0ZSB2YWx1ZSAqLwotI2RlZmluZSBBQlMoYSkgKCgoYSkgPCAwKSA/IC0oYSkgOiAoYSkpCi0KLS8qIG1hY3JvIHRvIGNsaXAgYSB2YWx1ZSB6LCBzbyB0aGF0IHggPD0geiA9PCB5ICovCi0jZGVmaW5lIENMSVAzKHgseSx6KSAoKCh6KSA8ICh4KSkgPyAoeCkgOiAoKCh6KSA+ICh5KSkgPyAoeSkgOiAoeikpKQotCi0vKiBtYWNybyB0byBjbGlwIGEgdmFsdWUgeiwgc28gdGhhdCAwIDw9IHogPTwgMjU1ICovCi0jZGVmaW5lIENMSVAxKHopICgoKHopIDwgMCkgPyAwIDogKCgoeikgPiAyNTUpID8gMjU1IDogKHopKSkKLQotLyogbWFjcm8gdG8gYWxsb2NhdGUgbWVtb3J5ICovCi0jZGVmaW5lIEFMTE9DQVRFKHB0ciwgY291bnQsIHR5cGUpIFwKLXsgXAotICAgIChwdHIpID0gSDI2NFN3RGVjTWFsbG9jKHNpemVvZih0eXBlKSwgKGNvdW50KSk7IFwKLX0KLQotLyogbWFjcm8gdG8gZnJlZSBhbGxvY2F0ZWQgbWVtb3J5ICovCi0jZGVmaW5lIEZSRUUocHRyKSBcCi17IFwKLSAgICBIMjY0U3dEZWNGcmVlKChwdHIpKTsgKHB0cikgPSBOVUxMOyBcCi19Ci0KLSNkZWZpbmUgQUxJR04ocHRyLCBieXRlUG9zKSBcCi0gICAgICAgICgocHRyKSArICggKCgoYnl0ZVBvcykgLSAodWludHB0cl90KShwdHIpKSAmICgoYnl0ZVBvcykgLSAxKSkgLyBzaXplb2YoKihwdHIpKSApKQotCi1leHRlcm4gY29uc3QgdTMyIGgyNjRic2RRcENbNTJdOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDMuIERhdGEgdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZm5kZWYgSDI2NERFQ19ORU9OCi11MzIgaDI2NGJzZENvdW50TGVhZGluZ1plcm9zKHUzMiB2YWx1ZSwgdTMyIGxlbmd0aCk7Ci0jZWxzZQotdTMyIGgyNjRic2RDb3VudExlYWRpbmdaZXJvcyh1MzIgdmFsdWUpOwotI2VuZGlmCi11MzIgaDI2NGJzZFJic3BUcmFpbGluZ0JpdHMoc3RybURhdGFfdCAqc3RybURhdGEpOwotCi11MzIgaDI2NGJzZE1vcmVSYnNwRGF0YShzdHJtRGF0YV90ICpzdHJtRGF0YSk7Ci0KLXUzMiBoMjY0YnNkTmV4dE1iQWRkcmVzcyh1MzIgKnBTbGljZUdyb3VwTWFwLCB1MzIgcGljU2l6ZUluTWJzLCB1MzIgY3Vyck1iQWRkcik7Ci0KLXZvaWQgaDI2NGJzZFNldEN1cnJJbWFnZU1iUG9pbnRlcnMoaW1hZ2VfdCAqaW1hZ2UsIHUzMiBtYk51bSk7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1VUSUxfSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdmxjLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdmxjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MGYzNWUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3ZsYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLSAgICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLSAgICAgMy4gTW9kdWxlIGRlZmluZXMKLSAgICAgNC4gTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwotICAgICA1LiBGdW5jdGlvbnMKLSAgICAgICAgICBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQKLSAgICAgICAgICBoMjY0YnNkRGVjb2RlRXhwR29sb21iU2lnbmVkCi0gICAgICAgICAgaDI2NGJzZERlY29kZUV4cEdvbG9tYk1hcHBlZAotICAgICAgICAgIGgyNjRic2REZWNvZGVFeHBHb2xvbWJUcnVuY2F0ZWQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJoMjY0YnNkX3ZsYy5oIgotI2luY2x1ZGUgImJhc2V0eXBlLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF9zdHJlYW0uaCIKLSNpbmNsdWRlICJoMjY0YnNkX3V0aWwuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBNb2R1bGUgZGVmaW5lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogZGVmaW5pdGlvbiBvZiBzcGVjaWFsIGNvZGUgbnVtLCB0aGlzIGFsb25nIHdpdGggdGhlIHJldHVybiB2YWx1ZSBpcyB1c2VkCi0gKiB0byBoYW5kbGUgY29kZSBudW0gaW4gdGhlIHJhbmdlIFswLCAyXjMyXSBpbiB0aGUgRGVjb2RlRXhwR29sb21iVW5zaWduZWQKLSAqIGZ1bmN0aW9uICovCi0jZGVmaW5lIEJJR19DT0RFX05VTSAweEZGRkZGRkZGVQotCi0vKiBNYXBwaW5nIHRhYmxlcyBmb3IgY29kZWRfYmxvY2tfcGF0dGVybiwgdXNlZCBmb3IgZGVjb2Rpbmcgb2YgbWFwcGVkCi0gKiBFeHAtR29sb21iIGNvZGVzICovCi1zdGF0aWMgY29uc3QgdTggY29kZWRCbG9ja1BhdHRlcm5JbnRyYTR4NFs0OF0gPSB7Ci0gICAgNDcsMzEsMTUsMCwyMywyNywyOSwzMCw3LDExLDEzLDE0LDM5LDQzLDQ1LDQ2LDE2LDMsNSwxMCwxMiwxOSwyMSwyNiwyOCwzNSwKLSAgICAzNyw0Miw0NCwxLDIsNCw4LDE3LDE4LDIwLDI0LDYsOSwyMiwyNSwzMiwzMywzNCwzNiw0MCwzOCw0MX07Ci0KLXN0YXRpYyBjb25zdCB1OCBjb2RlZEJsb2NrUGF0dGVybkludGVyWzQ4XSA9IHsKLSAgICAwLDE2LDEsMiw0LDgsMzIsMyw1LDEwLDEyLDE1LDQ3LDcsMTEsMTMsMTQsNiw5LDMxLDM1LDM3LDQyLDQ0LDMzLDM0LDM2LDQwLAotICAgIDM5LDQzLDQ1LDQ2LDE3LDE4LDIwLDI0LDE5LDIxLDI2LDI4LDIzLDI3LDI5LDMwLDIyLDI1LDM4LDQxfTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICA1LjEgIEZ1bmN0aW9uOiBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRGVjb2RlIHVuc2lnbmVkIEV4cC1Hb2xvbWIgY29kZS4gVGhpcyBpcyB0aGUgc2FtZSBhcyBjb2RlTnVtIHVzZWQKLSAgICAgICAgICAgIGluIG90aGVyIEV4cC1Hb2xvbWIgY29kZSBtYXBwaW5ncy4gQ29kZSBudW0gKGkuZS4gdGhlIGRlY29kZWQKLSAgICAgICAgICAgIHN5bWJvbCkgaXMgZGV0ZXJtaW5lZCBhcwotCi0gICAgICAgICAgICAgICAgY29kZU51bSA9IDJebGVhZGluZ1plcm9zIC0gMSArIEdldEJpdHMobGVhZGluZ1plcm9zKQotCi0gICAgICAgICAgICBOb3JtYWwgZGVjb2RlZCBzeW1ib2xzIGFyZSBpbiB0aGUgcmFuZ2UgWzAsIDJeMzIgLSAyXS4gU3ltYm9sCi0gICAgICAgICAgICAyXjMyLTEgaXMgaW5kaWNhdGVkIGJ5IEJJR19DT0RFX05VTSB3aXRoIHJldHVybiB2YWx1ZSBIQU5UUk9fT0sKLSAgICAgICAgICAgIHdoaWxlIHN5bWJvbCAyXjMyICBpcyBpbmRpY2F0ZWQgYnkgQklHX0NPREVfTlVNIHdpdGggcmV0dXJuIHZhbHVlCi0gICAgICAgICAgICBIQU5UUk9fTk9LLiAgVGhlc2UgdHdvIHN5bWJvbHMgYXJlIHNwZWNpYWwgY2FzZXMgd2l0aCBjb2RlIGxlbmd0aAotICAgICAgICAgICAgb2YgNjUsIGkuZS4gIDMyICcwJyBiaXRzLCBhICcxJyBiaXQsIGFuZCBlaXRoZXIgMCBvciAxIHJlcHJlc2VudGVkCi0gICAgICAgICAgICBieSAzMiBiaXRzLgotCi0gICAgICAgICAgICBTeW1ib2wgMl4zMiBpcyBvdXQgb2YgdW5zaWduZWQgMzItYml0IHJhbmdlIGJ1dCBpcyBuZWVkZWQgZm9yCi0gICAgICAgICAgICBEZWNvZGVFeHBHb2xvbWJTaWduZWQgdG8gZXhwcmVzcyB2YWx1ZSAtMl4zMS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLQotICAgICAgICBPdXRwdXRzOgotICAgICAgICAgICAgY29kZU51bSAgICAgICAgIGRlY29kZWQgY29kZSB3b3JkIGlzIHN0b3JlZCBoZXJlCi0KLSAgICAgICAgUmV0dXJuczoKLSAgICAgICAgICAgIEhBTlRST19PSyAgICAgICBzdWNjZXNzCi0gICAgICAgICAgICBIQU5UUk9fTk9LICAgICAgZmFpbHVyZSwgbm8gdmFsaWQgY29kZSB3b3JkIGZvdW5kLCBub3RlIGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggQklHX0NPREVfTlVNCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgKmNvZGVOdW0pCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIGJpdHMsIG51bVplcm9zOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQoY29kZU51bSk7Ci0KLSAgICBiaXRzID0gaDI2NGJzZFNob3dCaXRzMzIocFN0cm1EYXRhKTsKLQotICAgIC8qIGZpcnN0IGJpdCBpcyAxIC0+IGNvZGUgbGVuZ3RoIDEgKi8KLSAgICBpZiAoYml0cyA+PSAweDgwMDAwMDAwKQotICAgIHsKLSAgICAgICAgaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICAqY29kZU51bSA9IDA7Ci0gICAgICAgIHJldHVybihIQU5UUk9fT0spOwotICAgIH0KLSAgICAvKiBzZWNvbmQgYml0IGlzIDEgLT4gY29kZSBsZW5ndGggMyAqLwotICAgIGVsc2UgaWYgKGJpdHMgPj0gMHg0MDAwMDAwMCkKLSAgICB7Ci0gICAgICAgIGlmIChoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwgMykgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgKmNvZGVOdW0gPSAxICsgKChiaXRzID4+IDI5KSAmIDB4MSk7Ci0gICAgICAgIHJldHVybihIQU5UUk9fT0spOwotICAgIH0KLSAgICAvKiB0aGlyZCBiaXQgaXMgMSAtPiBjb2RlIGxlbmd0aCA1ICovCi0gICAgZWxzZSBpZiAoYml0cyA+PSAweDIwMDAwMDAwKQotICAgIHsKLSAgICAgICAgaWYgKGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLCA1KSA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAqY29kZU51bSA9IDMgKyAoKGJpdHMgPj4gMjcpICYgMHgzKTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci0gICAgfQotICAgIC8qIGZvdXJ0aCBiaXQgaXMgMSAtPiBjb2RlIGxlbmd0aCA3ICovCi0gICAgZWxzZSBpZiAoYml0cyA+PSAweDEwMDAwMDAwKQotICAgIHsKLSAgICAgICAgaWYgKGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLCA3KSA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAqY29kZU51bSA9IDcgKyAoKGJpdHMgPj4gMjUpICYgMHg3KTsKLSAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci0gICAgfQotICAgIC8qIG90aGVyIGNvZGUgbGVuZ3RocyAqLwotICAgIGVsc2UKLSAgICB7Ci0jaWZuZGVmIEgyNjRERUNfTkVPTgotICAgICAgICBudW1aZXJvcyA9IDQgKyBoMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MoYml0cywgMjgpOwotI2Vsc2UKLSAgICAgICAgbnVtWmVyb3MgPSBoMjY0YnNkQ291bnRMZWFkaW5nWmVyb3MoYml0cyk7Ci0jZW5kaWYKLSAgICAgICAgLyogYWxsIDMyIGJpdHMgYXJlIHplcm8gKi8KLSAgICAgICAgaWYgKG51bVplcm9zID09IDMyKQotICAgICAgICB7Ci0gICAgICAgICAgICAqY29kZU51bSA9IDA7Ci0gICAgICAgICAgICBoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSwzMik7Ci0gICAgICAgICAgICBiaXRzID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgICAgIC8qIGNoZWNrIDMzcmQgYml0LCBtdXN0IGJlIDEgKi8KLSAgICAgICAgICAgIGlmIChiaXRzID09IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogY2Fubm90IHVzZSBoMjY0YnNkR2V0Qml0cywgbGltaXRlZCB0byAzMSBiaXRzICovCi0gICAgICAgICAgICAgICAgYml0cyA9IGgyNjRic2RTaG93Qml0czMyKHBTdHJtRGF0YSk7Ci0gICAgICAgICAgICAgICAgaWYgKGgyNjRic2RGbHVzaEJpdHMocFN0cm1EYXRhLCAzMikgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIC8qIGNvZGUgbnVtIDJeMzIgLSAxLCBuZWVkZWQgZm9yIHVuc2lnbmVkIG1hcHBpbmcgKi8KLSAgICAgICAgICAgICAgICBpZiAoYml0cyA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKmNvZGVOdW0gPSBCSUdfQ09ERV9OVU07Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fT0spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBjb2RlIG51bSAyXjMyLCBuZWVkZWQgZm9yIHVuc2lnbmVkIG1hcHBpbmcKLSAgICAgICAgICAgICAgICAgKiAocmVzdWx0cyBpbiAtMl4zMSkgKi8KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChiaXRzID09IDEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqY29kZU51bSA9IEJJR19DT0RFX05VTTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIGlmIG1vcmUgemVyb3MgdGhhbiAzMiwgaXQgaXMgYW4gZXJyb3IgKi8KLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBoMjY0YnNkRmx1c2hCaXRzKHBTdHJtRGF0YSxudW1aZXJvcysxKTsKLQotICAgICAgICBiaXRzID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCBudW1aZXJvcyk7Ci0gICAgICAgIGlmIChiaXRzID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICAgICAgKmNvZGVOdW0gPSAoMSA8PCBudW1aZXJvcykgLSAxICsgYml0czsKLQotICAgIH0KLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIDUuMiAgRnVuY3Rpb246IGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRGVjb2RlIHNpZ25lZCBFeHAtR29sb21iIGNvZGUuIENvZGUgbnVtIGlzIGRldGVybWluZWQgYnkKLSAgICAgICAgICAgIGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCBhbmQgdGhlbiBtYXBwZWQgdG8gc2lnbmVkCi0gICAgICAgICAgICByZXByZXNlbnRhdGlvbiBhcwotCi0gICAgICAgICAgICAgICAgc3ltYm9sID0gKC0xKV4oY29kZU51bSsxKSAqIChjb2RlTnVtKzEpLzIKLQotICAgICAgICAgICAgU2lnbmVkIHN5bWJvbHMgc2hhbGwgYmUgaW4gdGhlIHJhbmdlIFstMl4zMSwgMl4zMSAtIDFdLiBTeW1ib2wKLSAgICAgICAgICAgIC0yXjMxIGlzIG9idGFpbmVkIHdoZW4gY29kZU51bSBpcyAyXjMyLCB3aGljaCBjYW5ub3QgYmUgZXhwcmVzc2VkCi0gICAgICAgICAgICBieSB1bnNpZ25lZCAzMi1iaXQgdmFsdWUuIFRoaXMgaXMgc2lnbmFsZWQgYXMgYSBzcGVjaWFsIGNhc2UgZnJvbQotICAgICAgICAgICAgdGhlIGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCBieSBzZXR0aW5nIGNvZGVOdW0gdG8KLSAgICAgICAgICAgIEJJR19DT0RFX05VTSBhbmQgcmV0dXJuaW5nIEhBTlRST19OT0sgc3RhdHVzLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICB2YWx1ZSAgICAgICAgICAgZGVjb2RlZCBjb2RlIHdvcmQgaXMgc3RvcmVkIGhlcmUKLQotICAgICAgICBSZXR1cm5zOgotICAgICAgICAgICAgSEFOVFJPX09LICAgICAgIHN1Y2Nlc3MKLSAgICAgICAgICAgIEhBTlRST19OT0sgICAgICBmYWlsdXJlLCBubyB2YWxpZCBjb2RlIHdvcmQgZm91bmQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdTMyIGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBpMzIgKnZhbHVlKQotewotCi0vKiBWYXJpYWJsZXMgKi8KLQotICAgIHUzMiBzdGF0dXMsIGNvZGVOdW0gPSAwOwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQodmFsdWUpOwotCi0gICAgc3RhdHVzID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJmNvZGVOdW0pOwotCi0gICAgaWYgKGNvZGVOdW0gPT0gQklHX0NPREVfTlVNKQotICAgIHsKLSAgICAgICAgLyogQklHX0NPREVfTlVNIGFuZCBIQU5UUk9fT0sgc3RhdHVzIG1lYW5zIGNvZGVOdW0gMl4zMi0xIHdoaWNoIHdvdWxkCi0gICAgICAgICAqIHJlc3VsdCBpbiBzaWduZWQgaW50ZWdlciB2YWx1ZWQgMl4zMSAoaS5lLiBvdXQgb2YgMzItYml0IHNpZ25lZAotICAgICAgICAgKiBpbnRlZ2VyIHJhbmdlKSAqLwotICAgICAgICBpZiAoc3RhdHVzID09IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgLyogQklHX0NPREVfTlVNIGFuZCBIQU5UUk9fTk9LIHN0YXR1cyBtZWFucyBjb2RlTnVtIDJeMzIgd2hpY2ggcmVzdWx0cwotICAgICAgICAgKiBpbiBzaWduZWQgaW50ZWdlciB2YWx1ZWQgLTJeMzEgKi8KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAqdmFsdWUgPSAoaTMyKSgyMTQ3NDgzNjQ4VSk7Ci0gICAgICAgICAgICByZXR1cm4gKEhBTlRST19PSyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RhdHVzID09IEhBTlRST19PSykKLSAgICB7Ci0gICAgICAgIC8qICgtMSleKGNvZGVOdW0rMSkgcmVzdWx0cyBpbiBwb3NpdGl2ZSBzaWduIGlmIGNvZGVOdW0gaXMgb2RkLAotICAgICAgICAgKiBuZWdhdGl2ZSB3aGVuIGl0IGlzIGV2ZW4uIChjb2RlTnVtKzEpLzIgaXMgb2J0YWluZWQgYXMKLSAgICAgICAgICogKGNvZGVOdW0rMSk+PjEgd2hlbiB2YWx1ZSBpcyBwb3NpdGl2ZSBhbmQgYXMgKC1jb2RlTnVtKT4+MSBmb3IKLSAgICAgICAgICogbmVnYXRpdmUgdmFsdWUgKi8KLSAgICAgICAgLypsaW50IC1lNzAyICovCi0gICAgICAgICp2YWx1ZSA9IChjb2RlTnVtICYgMHgxKSA/IChpMzIpKChjb2RlTnVtICsgMSkgPj4gMSkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oaTMyKSgoY29kZU51bSArIDEpID4+IDEpOwotICAgICAgICAvKmxpbnQgK2U3MDIgKi8KLSAgICAgICAgcmV0dXJuKEhBTlRST19PSyk7Ci0gICAgfQotCi0gICAgcmV0dXJuKEhBTlRST19OT0spOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIDUuMyAgRnVuY3Rpb246IGgyNjRic2REZWNvZGVFeHBHb2xvbWJNYXBwZWQKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRGVjb2RlIG1hcHBlZCBFeHAtR29sb21iIGNvZGUuIENvZGUgbnVtIGlzIGRldGVybWluZWQgYnkKLSAgICAgICAgICAgIGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCBhbmQgdGhlbiBtYXBwZWQgdG8gY29kZWRCbG9ja1BhdHRlcm4KLSAgICAgICAgICAgIGVpdGhlciBmb3IgaW50cmEgb3IgaW50ZXIgbWFjcm9ibG9jay4gVGhlIG1hcHBpbmcgaXMgaW1wbGVtZW50ZWQgYnkKLSAgICAgICAgICAgIGxvb2stdXAgdGFibGVzIGRlZmluZWQgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KLQotICAgICAgICBJbnB1dHM6Ci0gICAgICAgICAgICBwU3RybURhdGEgICAgICAgcG9pbnRlciB0byBzdHJlYW0gZGF0YSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIGlzSW50cmEgICAgICAgICBmbGFnIHRvIGluZGljYXRlIGlmIGludHJhIG9yIGludGVyIG1hcHBpbmcgaXMgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB1c2VkCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHZhbHVlICAgICAgICAgICBkZWNvZGVkIGNvZGUgd29yZCBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGZhaWx1cmUsIG5vIHZhbGlkIGNvZGUgd29yZCBmb3VuZAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZUV4cEdvbG9tYk1hcHBlZChzdHJtRGF0YV90ICpwU3RybURhdGEsIHUzMiAqdmFsdWUsCi0gICAgdTMyIGlzSW50cmEpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHN0YXR1cywgY29kZU51bTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHZhbHVlKTsKLQotICAgIHN0YXR1cyA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsICZjb2RlTnVtKTsKLQotICAgIGlmIChzdGF0dXMgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4gKEhBTlRST19OT0spOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIHJhbmdlIG9mIHZhbGlkIGNvZGVOdW1zIFswLDQ3XSAqLwotICAgICAgICBpZiAoY29kZU51bSA+IDQ3KQotICAgICAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKLSAgICAgICAgaWYgKGlzSW50cmEpCi0gICAgICAgICAgICAqdmFsdWUgPSBjb2RlZEJsb2NrUGF0dGVybkludHJhNHg0W2NvZGVOdW1dOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAqdmFsdWUgPSBjb2RlZEJsb2NrUGF0dGVybkludGVyW2NvZGVOdW1dOwotICAgICAgICByZXR1cm4oSEFOVFJPX09LKTsKLSAgICB9Ci0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgNS40ICBGdW5jdGlvbjogaDI2NGJzZERlY29kZUV4cEdvbG9tYlRydW5jYXRlZAotCi0gICAgICAgIEZ1bmN0aW9uYWwgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICBEZWNvZGUgdHJ1bmNhdGVkIEV4cC1Hb2xvbWIgY29kZS4gZ3JlYXRlclRoYW5PbmUgZmxhZyBpbmRpY2F0ZXMKLSAgICAgICAgICAgIHRoZSByYW5nZSBvZiB0aGUgc3ltYm9sIHRvIGJlIGRlY29kZWQgYXMgZm9sbG93czoKLSAgICAgICAgICAgICAgICBGQUxTRSAgIC0+ICBbMCwxXQotICAgICAgICAgICAgICAgIFRSVUUgICAgLT4gIFswLDJeMzItMV0KLQotICAgICAgICAgICAgSWYgZmxhZyBpcyBmYWxzZSB0aGUgZGVjb2RpbmcgaXMgcGVyZm9ybWVkIGJ5IHJlYWRpbmcgb25lIGJpdAotICAgICAgICAgICAgZnJvbSB0aGUgc3RyZWFtIHdpdGggaDI2NGJzZEdldEJpdHMgYW5kIG1hcHBpbmcgdGhpcyB0byBkZWNvZGVkCi0gICAgICAgICAgICBzeW1ib2wgYXMKLSAgICAgICAgICAgICAgICBzeW1ib2wgPSBiaXQgPyAwIDogMQotCi0gICAgICAgICAgICBPdGhlcndpc2UsIGkuZS4gd2hlbiBmbGFnIGlzIFRSVUUsIGNvZGUgbnVtIGlzIGRldGVybWluZWQgYnkKLSAgICAgICAgICAgIGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZCBhbmQgdGhpcyBpcyB1c2VkIGFzIHRoZSBkZWNvZGVkCi0gICAgICAgICAgICBzeW1ib2wuCi0KLSAgICAgICAgSW5wdXRzOgotICAgICAgICAgICAgcFN0cm1EYXRhICAgICAgIHBvaW50ZXIgdG8gc3RyZWFtIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgICBncmVhdGVyVGhhbk9uZSAgZmxhZyB0byBpbmRpY2F0ZSBpZiByYW5nZSBpcyB3aWRlciB0aGFuIFswLDFdCi0KLSAgICAgICAgT3V0cHV0czoKLSAgICAgICAgICAgIHZhbHVlICAgICAgICAgICBkZWNvZGVkIGNvZGUgd29yZCBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGZhaWx1cmUsIG5vIHZhbGlkIGNvZGUgd29yZCBmb3VuZAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZUV4cEdvbG9tYlRydW5jYXRlZCgKLSAgc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICB1MzIgKnZhbHVlLAotICB1MzIgZ3JlYXRlclRoYW5PbmUpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0vKiBDb2RlICovCi0KLSAgICBBU1NFUlQocFN0cm1EYXRhKTsKLSAgICBBU1NFUlQodmFsdWUpOwotCi0gICAgaWYgKGdyZWF0ZXJUaGFuT25lKQotICAgIHsKLSAgICAgICAgcmV0dXJuKGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsIHZhbHVlKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgICp2YWx1ZSA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwxKTsKLSAgICAgICAgaWYgKCp2YWx1ZSA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuIChIQU5UUk9fTk9LKTsKLSAgICAgICAgKnZhbHVlIF49IDB4MTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKEhBTlRST19PSyk7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3ZsYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL3NvdXJjZS9oMjY0YnNkX3ZsYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzE2NzczLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92bGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgVGFibGUgb2YgY29udGVudHMKLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgIDIuIE1vZHVsZSBkZWZpbmVzCi0gICAgMy4gRGF0YSB0eXBlcwotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmbmRlZiBIMjY0U1dERUNfVkxDX0gKLSNkZWZpbmUgSDI2NFNXREVDX1ZMQ19ICi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3N0cmVhbS5oIgotI2luY2x1ZGUgImgyNjRic2RfdHJhbnNmb3JtLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDQuIEZ1bmN0aW9uIHByb3RvdHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUzMiBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgKnZhbHVlKTsKLQotdTMyIGgyNjRic2REZWNvZGVFeHBHb2xvbWJTaWduZWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCBpMzIgKnZhbHVlKTsKLQotdTMyIGgyNjRic2REZWNvZGVFeHBHb2xvbWJNYXBwZWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgKnZhbHVlLAotICAgIHUzMiBpc0ludHJhKTsKLQotdTMyIGgyNjRic2REZWNvZGVFeHBHb2xvbWJUcnVuY2F0ZWQoc3RybURhdGFfdCAqcFN0cm1EYXRhLCB1MzIgKnZhbHVlLAotICAgIHUzMiBncmVhdGVyVGhhbk9uZSk7Ci0KLSNlbmRpZiAvKiAjaWZkZWYgSDI2NFNXREVDX1ZMQ19IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92dWkuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92dWkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE5MzM1YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdnVpLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgIDEuIEluY2x1ZGUgaGVhZGVycwotICAgICAyLiBFeHRlcm5hbCBjb21waWxlciBmbGFncwotICAgICAzLiBNb2R1bGUgZGVmaW5lcwotICAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgIDUuIEZ1bmN0aW9ucwotICAgICAgICAgIGgyNjRic2REZWNvZGVWdWlQYXJhbWV0ZXJzCi0gICAgICAgICAgRGVjb2RlSHJkUGFyYW1ldGVycwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDEuIEluY2x1ZGUgaGVhZGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2luY2x1ZGUgImgyNjRic2RfdnVpLmgiCi0jaW5jbHVkZSAiYmFzZXR5cGUuaCIKLSNpbmNsdWRlICJoMjY0YnNkX3ZsYy5oIgotI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCi0jaW5jbHVkZSAiaDI2NGJzZF91dGlsLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gRXh0ZXJuYWwgY29tcGlsZXIgZmxhZ3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMy4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgTUFYX0RQQl9TSVpFIDE2Ci0jZGVmaW5lIE1BWF9CUiAgICAgICAyNDAwMDAgLyogZm9yIGxldmVsIDUuMSAqLwotI2RlZmluZSBNQVhfQ1BCICAgICAgMjQwMDAwIC8qIGZvciBsZXZlbCA1LjEgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdTMyIERlY29kZUhyZFBhcmFtZXRlcnMoCi0gIHN0cm1EYXRhX3QgKnBTdHJtRGF0YSwKLSAgaHJkUGFyYW1ldGVyc190ICpwSHJkUGFyYW1ldGVycyk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBGdW5jdGlvbjogaDI2NGJzZERlY29kZVZ1aVBhcmFtZXRlcnMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRGVjb2RlIFZVSSBwYXJhbWV0ZXJzIGZyb20gdGhlIHN0cmVhbS4gU2VlIHN0YW5kYXJkIGZvciBkZXRhaWxzLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBwVnVpUGFyYW1ldGVycyAgZGVjb2RlZCBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEgb3IgZW5kIG9mIHN0cmVhbQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZVZ1aVBhcmFtZXRlcnMoc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICAgIHZ1aVBhcmFtZXRlcnNfdCAqcFZ1aVBhcmFtZXRlcnMpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcDsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBWdWlQYXJhbWV0ZXJzKTsKLQotICAgIEgyNjRTd0RlY01lbXNldChwVnVpUGFyYW1ldGVycywgMCwgc2l6ZW9mKHZ1aVBhcmFtZXRlcnNfdCkpOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwVnVpUGFyYW1ldGVycy0+YXNwZWN0UmF0aW9QcmVzZW50RmxhZyA9ICh0bXAgPT0gMSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIGlmIChwVnVpUGFyYW1ldGVycy0+YXNwZWN0UmF0aW9QcmVzZW50RmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgOCk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPmFzcGVjdFJhdGlvSWRjID0gdG1wOwotCi0gICAgICAgIGlmIChwVnVpUGFyYW1ldGVycy0+YXNwZWN0UmF0aW9JZGMgPT0gQVNQRUNUX1JBVElPX0VYVEVOREVEX1NBUikKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxNik7Ci0gICAgICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnNhcldpZHRoID0gdG1wOwotCi0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDE2KTsKLSAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICBwVnVpUGFyYW1ldGVycy0+c2FySGVpZ2h0ID0gdG1wOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwVnVpUGFyYW1ldGVycy0+b3ZlcnNjYW5JbmZvUHJlc2VudEZsYWcgPSAodG1wID09IDEpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPm92ZXJzY2FuSW5mb1ByZXNlbnRGbGFnKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+b3ZlcnNjYW5BcHByb3ByaWF0ZUZsYWcgPSAodG1wID09IDEpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0gICAgfQotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwVnVpUGFyYW1ldGVycy0+dmlkZW9TaWduYWxUeXBlUHJlc2VudEZsYWcgPSAodG1wID09IDEpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPnZpZGVvU2lnbmFsVHlwZVByZXNlbnRGbGFnKQotICAgIHsKLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAzKTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+dmlkZW9Gb3JtYXQgPSB0bXA7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+dmlkZW9GdWxsUmFuZ2VGbGFnID0gKHRtcCA9PSAxKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPmNvbG91ckRlc2NyaXB0aW9uUHJlc2VudEZsYWcgPQotICAgICAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgICAgIGlmIChwVnVpUGFyYW1ldGVycy0+Y29sb3VyRGVzY3JpcHRpb25QcmVzZW50RmxhZykKLSAgICAgICAgewotICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKLSAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICBwVnVpUGFyYW1ldGVycy0+Y29sb3VyUHJpbWFyaWVzID0gdG1wOwotCi0gICAgICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDgpOwotICAgICAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT50cmFuc2ZlckNoYXJhY3RlcmlzdGljcyA9IHRtcDsKLQotICAgICAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA4KTsKLSAgICAgICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgICAgICBwVnVpUGFyYW1ldGVycy0+bWF0cml4Q29lZmZpY2llbnRzID0gdG1wOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPmNvbG91clByaW1hcmllcyAgICAgICAgID0gMjsKLSAgICAgICAgICAgIHBWdWlQYXJhbWV0ZXJzLT50cmFuc2ZlckNoYXJhY3RlcmlzdGljcyA9IDI7Ci0gICAgICAgICAgICBwVnVpUGFyYW1ldGVycy0+bWF0cml4Q29lZmZpY2llbnRzICAgICAgPSAyOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT52aWRlb0Zvcm1hdCAgICAgICAgICAgICA9IDU7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5jb2xvdXJQcmltYXJpZXMgICAgICAgICA9IDI7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT50cmFuc2ZlckNoYXJhY3RlcmlzdGljcyA9IDI7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5tYXRyaXhDb2VmZmljaWVudHMgICAgICA9IDI7Ci0gICAgfQotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwVnVpUGFyYW1ldGVycy0+Y2hyb21hTG9jSW5mb1ByZXNlbnRGbGFnID0KLSAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5jaHJvbWFMb2NJbmZvUHJlc2VudEZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICZwVnVpUGFyYW1ldGVycy0+Y2hyb21hU2FtcGxlTG9jVHlwZVRvcEZpZWxkKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICAgICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5jaHJvbWFTYW1wbGVMb2NUeXBlVG9wRmllbGQgPiA1KQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgJnBWdWlQYXJhbWV0ZXJzLT5jaHJvbWFTYW1wbGVMb2NUeXBlQm90dG9tRmllbGQpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPmNocm9tYVNhbXBsZUxvY1R5cGVCb3R0b21GaWVsZCA+IDUpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgfQotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwVnVpUGFyYW1ldGVycy0+dGltaW5nSW5mb1ByZXNlbnRGbGFnID0KLSAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT50aW1pbmdJbmZvUHJlc2VudEZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkU2hvd0JpdHMzMihwU3RybURhdGEpOwotICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDMyKSA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBpZiAodG1wID09IDApCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5udW1Vbml0c0luVGljayA9IHRtcDsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkU2hvd0JpdHMzMihwU3RybURhdGEpOwotICAgICAgICBpZiAoaDI2NGJzZEZsdXNoQml0cyhwU3RybURhdGEsIDMyKSA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBpZiAodG1wID09IDApCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT50aW1lU2NhbGUgPSB0bXA7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICAgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+Zml4ZWRGcmFtZVJhdGVGbGFnID0KLSAgICAgICAgICAgICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLSAgICB9Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBWdWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWcgPQotICAgICAgICAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0KLSAgICBpZiAocFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZykKLSAgICB7Ci0gICAgICAgIHRtcCA9IERlY29kZUhyZFBhcmFtZXRlcnMocFN0cm1EYXRhLCAmcFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnMpOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwVnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVycy5jcGJDbnQgICAgICAgICAgPSAxOwotICAgICAgICAvKiBNYXhCUiBhbmQgTWF4Q1BCIHNob3VsZCBiZSB0aGUgdmFsdWVzIGNvcnJlc3BvbmRpZyB0byB0aGUgbGV2ZWxJZGMKLSAgICAgICAgICogaW4gdGhlIFNQUyBjb250YWluaW5nIHRoZXNlIFZVSSBwYXJhbWV0ZXJzLiBIb3dldmVyLCB0aGVzZSB2YWx1ZXMKLSAgICAgICAgICogYXJlIG5vdCB1c2VkIGFueXdoZXJlIGFuZCBtYXhpbXVtIGZvciBhbnkgbGV2ZWwgd2lsbCBiZSB1c2VkIGhlcmUgKi8KLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnMuYml0UmF0ZVZhbHVlWzBdID0gMTIwMCAqIE1BWF9CUiArIDE7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzLmNwYlNpemVWYWx1ZVswXSA9IDEyMDAgKiBNQVhfQ1BCICsgMTsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnMuaW5pdGlhbENwYlJlbW92YWxEZWxheUxlbmd0aCA9IDI0OwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+bmFsSHJkUGFyYW1ldGVycy5jcGJSZW1vdmFsRGVsYXlMZW5ndGggICAgICAgID0gMjQ7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzLmRwYk91dHB1dERlbGF5TGVuZ3RoICAgICAgICAgPSAyNDsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm5hbEhyZFBhcmFtZXRlcnMudGltZU9mZnNldExlbmd0aCAgICAgICAgICAgICA9IDI0OwotICAgIH0KLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZyA9Ci0gICAgICAgICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgIGlmIChwVnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVyc1ByZXNlbnRGbGFnKQotICAgIHsKLSAgICAgICAgdG1wID0gRGVjb2RlSHJkUGFyYW1ldGVycyhwU3RybURhdGEsICZwVnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycyk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzLmNwYkNudCAgICAgICAgICA9IDE7Ci0gICAgICAgIC8qIE1heEJSIGFuZCBNYXhDUEIgc2hvdWxkIGJlIHRoZSB2YWx1ZXMgY29ycmVzcG9uZGlnIHRvIHRoZSBsZXZlbElkYwotICAgICAgICAgKiBpbiB0aGUgU1BTIGNvbnRhaW5pbmcgdGhlc2UgVlVJIHBhcmFtZXRlcnMuIEhvd2V2ZXIsIHRoZXNlIHZhbHVlcwotICAgICAgICAgKiBhcmUgbm90IHVzZWQgYW55d2hlcmUgYW5kIG1heGltdW0gZm9yIGFueSBsZXZlbCB3aWxsIGJlIHVzZWQgaGVyZSAqLwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy5iaXRSYXRlVmFsdWVbMF0gPSAxMDAwICogTUFYX0JSICsgMTsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuY3BiU2l6ZVZhbHVlWzBdID0gMTAwMCAqIE1BWF9DUEIgKyAxOwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy5pbml0aWFsQ3BiUmVtb3ZhbERlbGF5TGVuZ3RoID0gMjQ7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzLmNwYlJlbW92YWxEZWxheUxlbmd0aCAgICAgICAgPSAyNDsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPnZjbEhyZFBhcmFtZXRlcnMuZHBiT3V0cHV0RGVsYXlMZW5ndGggICAgICAgICA9IDI0OwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+dmNsSHJkUGFyYW1ldGVycy50aW1lT2Zmc2V0TGVuZ3RoICAgICAgICAgICAgID0gMjQ7Ci0gICAgfQotCi0gICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5uYWxIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWcgfHwKLSAgICAgIHBWdWlQYXJhbWV0ZXJzLT52Y2xIcmRQYXJhbWV0ZXJzUHJlc2VudEZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5sb3dEZWxheUhyZEZsYWcgPQotICAgICAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotICAgIH0KLQotICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgcFZ1aVBhcmFtZXRlcnMtPnBpY1N0cnVjdFByZXNlbnRGbGFnID0KLSAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCAxKTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwVnVpUGFyYW1ldGVycy0+Yml0c3RyZWFtUmVzdHJpY3Rpb25GbGFnID0KLSAgICAgICAgKHRtcCA9PSAxKSA/IEhBTlRST19UUlVFIDogSEFOVFJPX0ZBTFNFOwotCi0gICAgaWYgKHBWdWlQYXJhbWV0ZXJzLT5iaXRzdHJlYW1SZXN0cmljdGlvbkZsYWcpCi0gICAgewotICAgICAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDEpOwotICAgICAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5tb3Rpb25WZWN0b3JzT3ZlclBpY0JvdW5kYXJpZXNGbGFnID0KLSAgICAgICAgICAgICh0bXAgPT0gMSkgPyBIQU5UUk9fVFJVRSA6IEhBTlRST19GQUxTRTsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICZwVnVpUGFyYW1ldGVycy0+bWF4Qnl0ZXNQZXJQaWNEZW5vbSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIGlmIChwVnVpUGFyYW1ldGVycy0+bWF4Qnl0ZXNQZXJQaWNEZW5vbSA+IDE2KQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgJnBWdWlQYXJhbWV0ZXJzLT5tYXhCaXRzUGVyTWJEZW5vbSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIGlmIChwVnVpUGFyYW1ldGVycy0+bWF4Qml0c1Blck1iRGVub20gPiAxNikKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICZwVnVpUGFyYW1ldGVycy0+bG9nMk1heE12TGVuZ3RoSG9yaXpvbnRhbCk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIGlmIChwVnVpUGFyYW1ldGVycy0+bG9nMk1heE12TGVuZ3RoSG9yaXpvbnRhbCA+IDE2KQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgJnBWdWlQYXJhbWV0ZXJzLT5sb2cyTWF4TXZMZW5ndGhWZXJ0aWNhbCk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIGlmIChwVnVpUGFyYW1ldGVycy0+bG9nMk1heE12TGVuZ3RoVmVydGljYWwgPiAxNikKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLQotICAgICAgICB0bXAgPSBoMjY0YnNkRGVjb2RlRXhwR29sb21iVW5zaWduZWQocFN0cm1EYXRhLAotICAgICAgICAgICZwVnVpUGFyYW1ldGVycy0+bnVtUmVvcmRlckZyYW1lcyk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0KLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAmcFZ1aVBhcmFtZXRlcnMtPm1heERlY0ZyYW1lQnVmZmVyaW5nKTsKLSAgICAgICAgaWYgKHRtcCAhPSBIQU5UUk9fT0spCi0gICAgICAgICAgICByZXR1cm4odG1wKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm1vdGlvblZlY3RvcnNPdmVyUGljQm91bmRhcmllc0ZsYWcgPSBIQU5UUk9fVFJVRTsKLSAgICAgICAgcFZ1aVBhcmFtZXRlcnMtPm1heEJ5dGVzUGVyUGljRGVub20gICAgICAgPSAyOwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+bWF4Qml0c1Blck1iRGVub20gICAgICAgICA9IDE7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5sb2cyTWF4TXZMZW5ndGhIb3Jpem9udGFsID0gMTY7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5sb2cyTWF4TXZMZW5ndGhWZXJ0aWNhbCAgID0gMTY7Ci0gICAgICAgIHBWdWlQYXJhbWV0ZXJzLT5udW1SZW9yZGVyRnJhbWVzICAgICAgICAgID0gTUFYX0RQQl9TSVpFOwotICAgICAgICBwVnVpUGFyYW1ldGVycy0+bWF4RGVjRnJhbWVCdWZmZXJpbmcgICAgICA9IE1BWF9EUEJfU0laRTsKLSAgICB9Ci0KLSAgICByZXR1cm4oSEFOVFJPX09LKTsKLQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgRnVuY3Rpb246IERlY29kZUhyZFBhcmFtZXRlcnMKLQotICAgICAgICBGdW5jdGlvbmFsIGRlc2NyaXB0aW9uOgotICAgICAgICAgICAgRGVjb2RlIEhSRCBwYXJhbWV0ZXJzIGZyb20gdGhlIHN0cmVhbS4gU2VlIHN0YW5kYXJkIGZvciBkZXRhaWxzLgotCi0gICAgICAgIElucHV0czoKLSAgICAgICAgICAgIHBTdHJtRGF0YSAgICAgICBwb2ludGVyIHRvIHN0cmVhbSBkYXRhIHN0cnVjdHVyZQotCi0gICAgICAgIE91dHB1dHM6Ci0gICAgICAgICAgICBwSHJkUGFyYW1ldGVycyAgZGVjb2RlZCBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaGVyZQotCi0gICAgICAgIFJldHVybnM6Ci0gICAgICAgICAgICBIQU5UUk9fT0sgICAgICAgc3VjY2VzcwotICAgICAgICAgICAgSEFOVFJPX05PSyAgICAgIGludmFsaWQgc3RyZWFtIGRhdGEKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBEZWNvZGVIcmRQYXJhbWV0ZXJzKAotICBzdHJtRGF0YV90ICpwU3RybURhdGEsCi0gIGhyZFBhcmFtZXRlcnNfdCAqcEhyZFBhcmFtZXRlcnMpCi17Ci0KLS8qIFZhcmlhYmxlcyAqLwotCi0gICAgdTMyIHRtcCwgaTsKLQotLyogQ29kZSAqLwotCi0gICAgQVNTRVJUKHBTdHJtRGF0YSk7Ci0gICAgQVNTRVJUKHBIcmRQYXJhbWV0ZXJzKTsKLQotCi0gICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwgJnBIcmRQYXJhbWV0ZXJzLT5jcGJDbnQpOwotICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICByZXR1cm4odG1wKTsKLSAgICAvKiBjcGJDb3VudCA9IGNwYl9jbnRfbWludXMxICsgMSAqLwotICAgIHBIcmRQYXJhbWV0ZXJzLT5jcGJDbnQrKzsKLSAgICBpZiAocEhyZFBhcmFtZXRlcnMtPmNwYkNudCA+IE1BWF9DUEJfQ05UKQotICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDQpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBIcmRQYXJhbWV0ZXJzLT5iaXRSYXRlU2NhbGUgPSB0bXA7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDQpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBIcmRQYXJhbWV0ZXJzLT5jcGJTaXplU2NhbGUgPSB0bXA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcEhyZFBhcmFtZXRlcnMtPmNwYkNudDsgaSsrKQotICAgIHsKLSAgICAgICAgLyogYml0X3JhdGVfdmFsdWVfbWludXMxIGluIHRoZSByYW5nZSBbMCwgMl4zMiAtIDJdICovCi0gICAgICAgIHRtcCA9IGgyNjRic2REZWNvZGVFeHBHb2xvbWJVbnNpZ25lZChwU3RybURhdGEsCi0gICAgICAgICAgJnBIcmRQYXJhbWV0ZXJzLT5iaXRSYXRlVmFsdWVbaV0pOwotICAgICAgICBpZiAodG1wICE9IEhBTlRST19PSykKLSAgICAgICAgICAgIHJldHVybih0bXApOwotICAgICAgICBpZiAocEhyZFBhcmFtZXRlcnMtPmJpdFJhdGVWYWx1ZVtpXSA+IDQyOTQ5NjcyOTRVKQotICAgICAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgICAgICBwSHJkUGFyYW1ldGVycy0+Yml0UmF0ZVZhbHVlW2ldKys7Ci0gICAgICAgIC8qIHRoaXMgbWF5IHJlc3VsdCBpbiBvdmVyZmxvdywgYnV0IHRoaXMgdmFsdWUgaXMgbm90IHVzZWQgZm9yCi0gICAgICAgICAqIGFueXRoaW5nICovCi0gICAgICAgIHBIcmRQYXJhbWV0ZXJzLT5iaXRSYXRlVmFsdWVbaV0gKj0KLSAgICAgICAgICAgIDEgPDwgKDYgKyBwSHJkUGFyYW1ldGVycy0+Yml0UmF0ZVNjYWxlKTsKLQotICAgICAgICAvKiBjcGJfc2l6ZV92YWx1ZV9taW51czEgaW4gdGhlIHJhbmdlIFswLCAyXjMyIC0gMl0gKi8KLSAgICAgICAgdG1wID0gaDI2NGJzZERlY29kZUV4cEdvbG9tYlVuc2lnbmVkKHBTdHJtRGF0YSwKLSAgICAgICAgICAmcEhyZFBhcmFtZXRlcnMtPmNwYlNpemVWYWx1ZVtpXSk7Ci0gICAgICAgIGlmICh0bXAgIT0gSEFOVFJPX09LKQotICAgICAgICAgICAgcmV0dXJuKHRtcCk7Ci0gICAgICAgIGlmIChwSHJkUGFyYW1ldGVycy0+Y3BiU2l6ZVZhbHVlW2ldID4gNDI5NDk2NzI5NFUpCi0gICAgICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7Ci0gICAgICAgIHBIcmRQYXJhbWV0ZXJzLT5jcGJTaXplVmFsdWVbaV0rKzsKLSAgICAgICAgLyogdGhpcyBtYXkgcmVzdWx0IGluIG92ZXJmbG93LCBidXQgdGhpcyB2YWx1ZSBpcyBub3QgdXNlZCBmb3IKLSAgICAgICAgICogYW55dGhpbmcgKi8KLSAgICAgICAgcEhyZFBhcmFtZXRlcnMtPmNwYlNpemVWYWx1ZVtpXSAqPQotICAgICAgICAgICAgMSA8PCAoNCArIHBIcmRQYXJhbWV0ZXJzLT5jcGJTaXplU2NhbGUpOwotCi0gICAgICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgMSk7Ci0gICAgICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICAgICAgcEhyZFBhcmFtZXRlcnMtPmNickZsYWdbaV0gPSAodG1wID09IDEpID8gSEFOVFJPX1RSVUUgOiBIQU5UUk9fRkFMU0U7Ci0gICAgfQotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA1KTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwSHJkUGFyYW1ldGVycy0+aW5pdGlhbENwYlJlbW92YWxEZWxheUxlbmd0aCA9IHRtcCArIDE7Ci0KLSAgICB0bXAgPSBoMjY0YnNkR2V0Qml0cyhwU3RybURhdGEsIDUpOwotICAgIGlmICh0bXAgPT0gRU5EX09GX1NUUkVBTSkKLSAgICAgICAgcmV0dXJuKEhBTlRST19OT0spOwotICAgIHBIcmRQYXJhbWV0ZXJzLT5jcGJSZW1vdmFsRGVsYXlMZW5ndGggPSB0bXAgKyAxOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA1KTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwSHJkUGFyYW1ldGVycy0+ZHBiT3V0cHV0RGVsYXlMZW5ndGggPSB0bXAgKyAxOwotCi0gICAgdG1wID0gaDI2NGJzZEdldEJpdHMocFN0cm1EYXRhLCA1KTsKLSAgICBpZiAodG1wID09IEVORF9PRl9TVFJFQU0pCi0gICAgICAgIHJldHVybihIQU5UUk9fTk9LKTsKLSAgICBwSHJkUGFyYW1ldGVycy0+dGltZU9mZnNldExlbmd0aCA9IHRtcDsKLQotICAgIHJldHVybihIQU5UUk9fT0spOwotCi19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92dWkuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92dWkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVkNTJhNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdnVpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBUYWJsZSBvZiBjb250ZW50cwotCi0gICAgMS4gSW5jbHVkZSBoZWFkZXJzCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLSAgICAzLiBEYXRhIHR5cGVzCi0gICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZuZGVmIEgyNjRTV0RFQ19WVUlfSAotI2RlZmluZSBIMjY0U1dERUNfVlVJX0gKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAxLiBJbmNsdWRlIGhlYWRlcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlICJiYXNldHlwZS5oIgotI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgMi4gTW9kdWxlIGRlZmluZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgTUFYX0NQQl9DTlQgMzIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAzLiBEYXRhIHR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBlbnVtZXJhdGVkIHNhbXBsZSBhc3BlY3QgcmF0aW9zLCBBU1BFQ1RfUkFUSU9fTV9OIG1lYW5zIE06TiAqLwotZW51bQotewotICAgIEFTUEVDVF9SQVRJT19VTlNQRUNJRklFRCA9IDAsCi0gICAgQVNQRUNUX1JBVElPXzFfMSwKLSAgICBBU1BFQ1RfUkFUSU9fMTJfMTEsCi0gICAgQVNQRUNUX1JBVElPXzEwXzExLAotICAgIEFTUEVDVF9SQVRJT18xNl8xMSwKLSAgICBBU1BFQ1RfUkFUSU9fNDBfMzMsCi0gICAgQVNQRUNUX1JBVElPXzI0XzExLAotICAgIEFTUEVDVF9SQVRJT18yMF8xMSwKLSAgICBBU1BFQ1RfUkFUSU9fMzJfMTEsCi0gICAgQVNQRUNUX1JBVElPXzgwXzMzLAotICAgIEFTUEVDVF9SQVRJT18xOF8xMSwKLSAgICBBU1BFQ1RfUkFUSU9fMTVfMTEsCi0gICAgQVNQRUNUX1JBVElPXzY0XzMzLAotICAgIEFTUEVDVF9SQVRJT18xNjBfOTksCi0gICAgQVNQRUNUX1JBVElPX0VYVEVOREVEX1NBUiA9IDI1NQotfTsKLQotLyogc3RydWN0dXJlIHRvIHN0b3JlIEh5cG90aGV0aWNhbCBSZWZlcmVuY2UgRGVjb2RlciAoSFJEKSBwYXJhbWV0ZXJzICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIHUzMiBjcGJDbnQ7Ci0gICAgdTMyIGJpdFJhdGVTY2FsZTsKLSAgICB1MzIgY3BiU2l6ZVNjYWxlOwotICAgIHUzMiBiaXRSYXRlVmFsdWVbTUFYX0NQQl9DTlRdOwotICAgIHUzMiBjcGJTaXplVmFsdWVbTUFYX0NQQl9DTlRdOwotICAgIHUzMiBjYnJGbGFnW01BWF9DUEJfQ05UXTsKLSAgICB1MzIgaW5pdGlhbENwYlJlbW92YWxEZWxheUxlbmd0aDsKLSAgICB1MzIgY3BiUmVtb3ZhbERlbGF5TGVuZ3RoOwotICAgIHUzMiBkcGJPdXRwdXREZWxheUxlbmd0aDsKLSAgICB1MzIgdGltZU9mZnNldExlbmd0aDsKLX0gaHJkUGFyYW1ldGVyc190OwotCi0vKiBzdG9yYWdlIGZvciBWVUkgcGFyYW1ldGVycyAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1MzIgYXNwZWN0UmF0aW9QcmVzZW50RmxhZzsKLSAgICB1MzIgYXNwZWN0UmF0aW9JZGM7Ci0gICAgdTMyIHNhcldpZHRoOwotICAgIHUzMiBzYXJIZWlnaHQ7Ci0gICAgdTMyIG92ZXJzY2FuSW5mb1ByZXNlbnRGbGFnOwotICAgIHUzMiBvdmVyc2NhbkFwcHJvcHJpYXRlRmxhZzsKLSAgICB1MzIgdmlkZW9TaWduYWxUeXBlUHJlc2VudEZsYWc7Ci0gICAgdTMyIHZpZGVvRm9ybWF0OwotICAgIHUzMiB2aWRlb0Z1bGxSYW5nZUZsYWc7Ci0gICAgdTMyIGNvbG91ckRlc2NyaXB0aW9uUHJlc2VudEZsYWc7Ci0gICAgdTMyIGNvbG91clByaW1hcmllczsKLSAgICB1MzIgdHJhbnNmZXJDaGFyYWN0ZXJpc3RpY3M7Ci0gICAgdTMyIG1hdHJpeENvZWZmaWNpZW50czsKLSAgICB1MzIgY2hyb21hTG9jSW5mb1ByZXNlbnRGbGFnOwotICAgIHUzMiBjaHJvbWFTYW1wbGVMb2NUeXBlVG9wRmllbGQ7Ci0gICAgdTMyIGNocm9tYVNhbXBsZUxvY1R5cGVCb3R0b21GaWVsZDsKLSAgICB1MzIgdGltaW5nSW5mb1ByZXNlbnRGbGFnOwotICAgIHUzMiBudW1Vbml0c0luVGljazsKLSAgICB1MzIgdGltZVNjYWxlOwotICAgIHUzMiBmaXhlZEZyYW1lUmF0ZUZsYWc7Ci0gICAgdTMyIG5hbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZzsKLSAgICBocmRQYXJhbWV0ZXJzX3QgbmFsSHJkUGFyYW1ldGVyczsKLSAgICB1MzIgdmNsSHJkUGFyYW1ldGVyc1ByZXNlbnRGbGFnOwotICAgIGhyZFBhcmFtZXRlcnNfdCB2Y2xIcmRQYXJhbWV0ZXJzOwotICAgIHUzMiBsb3dEZWxheUhyZEZsYWc7Ci0gICAgdTMyIHBpY1N0cnVjdFByZXNlbnRGbGFnOwotICAgIHUzMiBiaXRzdHJlYW1SZXN0cmljdGlvbkZsYWc7Ci0gICAgdTMyIG1vdGlvblZlY3RvcnNPdmVyUGljQm91bmRhcmllc0ZsYWc7Ci0gICAgdTMyIG1heEJ5dGVzUGVyUGljRGVub207Ci0gICAgdTMyIG1heEJpdHNQZXJNYkRlbm9tOwotICAgIHUzMiBsb2cyTWF4TXZMZW5ndGhIb3Jpem9udGFsOwotICAgIHUzMiBsb2cyTWF4TXZMZW5ndGhWZXJ0aWNhbDsKLSAgICB1MzIgbnVtUmVvcmRlckZyYW1lczsKLSAgICB1MzIgbWF4RGVjRnJhbWVCdWZmZXJpbmc7Ci19IHZ1aVBhcmFtZXRlcnNfdDsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MzIgaDI2NGJzZERlY29kZVZ1aVBhcmFtZXRlcnMoc3RybURhdGFfdCAqcFN0cm1EYXRhLAotICAgIHZ1aVBhcmFtZXRlcnNfdCAqcFZ1aVBhcmFtZXRlcnMpOwotCi0jZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19WVUlfSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9BbmRyb2lkLmJwCmluZGV4IDg4ZDZlYzQuLjQzMzE4ZjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9BbmRyb2lkLmJwCkBAIC0xNCw3ICsxNCw2IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlib3B1cyIsCi0gICAgICAgICJsaWJtZWRpYV9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLApAQCAtMjMsNiArMjIsOCBAQAogCiAgICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKIAorICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAorCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvZXhwb3J0cy5sZHMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvZXhwb3J0cy5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI0ZjNmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9leHBvcnRzLmxkcwpAQCAtMCwwICsxLDUgQEAKK3sKKyAgICBnbG9iYWw6CisgICAgICAgIF9aMjJjcmVhdGVTb2Z0T01YQ29tcG9uZW50UEtjUEsxNk9NWF9DQUxMQkFDS1RZUEVQdlBQMTdPTVhfQ09NUE9ORU5UVFlQRTsKKyAgICBsb2NhbDogKjsKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L0FuZHJvaWQuYnAKaW5kZXggZjIxZDQ2Zi4uYzhkN2QwMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvQW5kcm9pZC5icApAQCAtMTQsNiArMTQsOCBAQAogCiAgICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKIAorICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAorCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L2V4cG9ydHMubGRzIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9leHBvcnRzLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjRmM2ZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9leHBvcnRzLmxkcwpAQCAtMCwwICsxLDUgQEAKK3sKKyAgICBnbG9iYWw6CisgICAgICAgIF9aMjJjcmVhdGVTb2Z0T01YQ29tcG9uZW50UEtjUEsxNk9NWF9DQUxMQkFDS1RZUEVQdlBQMTdPTVhfQ09NUE9ORU5UVFlQRTsKKyAgICBsb2NhbDogKjsKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvQW5kcm9pZC5icAppbmRleCA2MjhiMzZjLi5hOTI2NWNiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL0FuZHJvaWQuYnAKQEAgLTE0LDcgKzE0LDYgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJ2b3JiaXNpZGVjIiwKLSAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCkBAIC0yMyw2ICsyMiw4IEBACiAKICAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAogCisgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCisKICAgICBzYW5pdGl6ZTogewogICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL2V4cG9ydHMubGRzIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvZXhwb3J0cy5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI0ZjNmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL2V4cG9ydHMubGRzCkBAIC0wLDAgKzEsNSBAQAoreworICAgIGdsb2JhbDoKKyAgICAgICAgX1oyMmNyZWF0ZVNvZnRPTVhDb21wb25lbnRQS2NQSzE2T01YX0NBTExCQUNLVFlQRVB2UFAxN09NWF9DT01QT05FTlRUWVBFOworICAgIGxvY2FsOiAqOworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwCmluZGV4IDA5ODIwMDYuLjA1ZjQxMDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcApAQCAtMTksMTMgKzE5LDI4IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KIAogI2luY2x1ZGUgImxpYnl1di9jb252ZXJ0X2Zyb20uaCIKICNpbmNsdWRlICJsaWJ5dXYvdmlkZW9fY29tbW9uLmgiCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgogCiAjZGVmaW5lIFVTRV9MSUJZVVYKKyNkZWZpbmUgUEVSRl9QUk9GSUxJTkcgMAorCisKKyNpZiBkZWZpbmVkKF9fYWFyY2g2NF9fKSB8fCBkZWZpbmVkKF9fQVJNX05FT05fXykKKyNkZWZpbmUgVVNFX05FT05fWTQxMCAxCisjZWxzZQorI2RlZmluZSBVU0VfTkVPTl9ZNDEwIDAKKyNlbmRpZgorCisjaWYgVVNFX05FT05fWTQxMAorI2luY2x1ZGUgPGFybV9uZW9uLmg+CisjZW5kaWYKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00Myw2ICs1OCwxMSBAQAogCiBib29sIENvbG9yQ29udmVydGVyOjppc1ZhbGlkKCkgY29uc3QgewogICAgIHN3aXRjaCAobVNyY0Zvcm1hdCkgeworICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNjoKKyAgICAgICAgICAgIGlmIChtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0NDRZNDEwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBmYWxsLXRocnUKICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgogICAgICAgICAgICAgcmV0dXJuIG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1CiAgICAgICAgICAgICAgICAgICAgIHx8IG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODgKQEAgLTU5LDYgKzc5LDEyIEBACiAgICAgfQogfQogCitib29sIENvbG9yQ29udmVydGVyOjppc0RzdFJHQigpIGNvbnN0IHsKKyAgICByZXR1cm4gbURzdEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjUKKyAgICAgICAgICAgIHx8IG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODgKKyAgICAgICAgICAgIHx8IG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODg7Cit9CisKIENvbG9yQ29udmVydGVyOjpCaXRtYXBQYXJhbXM6OkJpdG1hcFBhcmFtcygKICAgICAgICAgdm9pZCAqYml0cywKICAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LApAQCAtODEsMTAgKzEwNywxNiBAQAogCiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODoKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQzMkJpdFJHQkE4ODg4OgorICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQ0NFk0MTA6CiAgICAgICAgIG1CcHAgPSA0OwogICAgICAgICBtU3RyaWRlID0gNCAqIG1XaWR0aDsKICAgICAgICAgYnJlYWs7CiAKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNjoKKyAgICAgICAgbUJwcCA9IDI7CisgICAgICAgIG1TdHJpZGUgPSAyICogbVdpZHRoOworICAgICAgICBicmVhazsKKwogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRDYllDclk6CiAgICAgY2FzZSBPTVhfUUNPTV9DT0xPUl9Gb3JtYXRZVlU0MjBTZW1pUGxhbmFyOgpAQCAtMTI5LDYgKzE2MSwxMiBAQAogICAgICAgICAgICAgZHN0V2lkdGgsIGRzdEhlaWdodCwKICAgICAgICAgICAgIGRzdENyb3BMZWZ0LCBkc3RDcm9wVG9wLCBkc3RDcm9wUmlnaHQsIGRzdENyb3BCb3R0b20sIG1Ec3RGb3JtYXQpOwogCisgICAgaWYgKCEoKHNyYy5tQ3JvcExlZnQgJiAxKSA9PSAwCisgICAgICAgICYmIHNyYy5jcm9wV2lkdGgoKSA9PSBkc3QuY3JvcFdpZHRoKCkKKyAgICAgICAgJiYgc3JjLmNyb3BIZWlnaHQoKSA9PSBkc3QuY3JvcEhlaWdodCgpKSkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCiAgICAgc3RhdHVzX3QgZXJyOwogCiAgICAgc3dpdGNoIChtU3JjRm9ybWF0KSB7CkBAIC0xNDAsNiArMTc4LDE5IEBACiAjZW5kaWYKICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjE2OgorICAgICAgICB7CisjaWYgUEVSRl9QUk9GSUxJTkcKKyAgICAgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworI2VuZGlmCisgICAgICAgICAgICBlcnIgPSBjb252ZXJ0WVVWNDIwUGxhbmFyMTYoc3JjLCBkc3QpOworI2lmIFBFUkZfUFJPRklMSU5HCisgICAgICAgICAgICBpbnQ2NF90IGVuZFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgICAgICAgICBBTE9HRCgiY29udmVydFlVVjQyMFBsYW5hcjE2IHRvb2sgJWxsZCB1cyIsIChsb25nIGxvbmcpIChlbmRUaW1lVXMgLSBzdGFydFRpbWVVcykpOworI2VuZGlmCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdENiWUNyWToKICAgICAgICAgICAgIGVyciA9IGNvbnZlcnRDYllDclkoc3JjLCBkc3QpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0xNzIsMTIgKzIyMyw2IEBACiAKICAgICB1aW50OF90ICprQWRqdXN0ZWRDbGlwID0gaW5pdENsaXAoKTsKIAotICAgIGlmICghKChzcmMubUNyb3BMZWZ0ICYgMSkgPT0gMAotICAgICAgICAmJiBzcmMuY3JvcFdpZHRoKCkgPT0gZHN0LmNyb3BXaWR0aCgpCi0gICAgICAgICYmIHNyYy5jcm9wSGVpZ2h0KCkgPT0gZHN0LmNyb3BIZWlnaHQoKSkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQogICAgIHVpbnQxNl90ICpkc3RfcHRyID0gKHVpbnQxNl90ICopZHN0Lm1CaXRzCiAgICAgICAgICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1XaWR0aCArIGRzdC5tQ3JvcExlZnQ7CiAKQEAgLTIzMiwxMiArMjc3LDYgQEAKIAogc3RhdHVzX3QgQ29sb3JDb252ZXJ0ZXI6OmNvbnZlcnRZVVY0MjBQbGFuYXJVc2VMaWJZVVYoCiAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCkgewotICAgIGlmICghKChzcmMubUNyb3BMZWZ0ICYgMSkgPT0gMAotICAgICAgICAgICAgJiYgc3JjLmNyb3BXaWR0aCgpID09IGRzdC5jcm9wV2lkdGgoKQotICAgICAgICAgICAgJiYgc3JjLmNyb3BIZWlnaHQoKSA9PSBkc3QuY3JvcEhlaWdodCgpKSkgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCiAgICAgdWludDhfdCAqZHN0X3B0ciA9ICh1aW50OF90ICopZHN0Lm1CaXRzCiAgICAgICAgICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1TdHJpZGUgKyBkc3QubUNyb3BMZWZ0ICogZHN0Lm1CcHA7CiAKQEAgLTI3NCw5MCArMzEzLDEyMCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBDb2xvckNvbnZlcnRlcjo6d3JpdGVUb0RzdCgKLSAgICAgICAgdm9pZCAqZHN0X3B0ciwgdWludDhfdCAqa0FkanVzdGVkQ2xpcCwgYm9vbCB1bmNyb3BwZWQsCi0gICAgICAgIHNpZ25lZCByMSwgc2lnbmVkIGcxLCBzaWduZWQgYjEsCi0gICAgICAgIHNpZ25lZCByMiwgc2lnbmVkIGcyLCBzaWduZWQgYjIpIHsKLSAgICBzd2l0Y2ggKG1Ec3RGb3JtYXQpIHsKK3N0ZDo6ZnVuY3Rpb248dm9pZCAodm9pZCAqLCB2b2lkICosIHZvaWQgKiwgc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICBzaWduZWQgKiwgc2lnbmVkICosIHNpZ25lZCAqLCBzaWduZWQgKik+CitnZXRSZWFkRnJvbVNyYyhPTVhfQ09MT1JfRk9STUFUVFlQRSBzcmNGb3JtYXQpIHsKKyAgICBzd2l0Y2goc3JjRm9ybWF0KSB7CisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgorICAgICAgICByZXR1cm4gW10odm9pZCAqc3JjX3ksIHZvaWQgKnNyY191LCB2b2lkICpzcmNfdiwgc2l6ZV90IHgsCisgICAgICAgICAgICAgICAgICBzaWduZWQgKnkxLCBzaWduZWQgKnkyLCBzaWduZWQgKnUsIHNpZ25lZCAqdikgeworICAgICAgICAgICAgKnkxID0gKCh1aW50OF90KilzcmNfeSlbeF0gLSAxNjsKKyAgICAgICAgICAgICp5MiA9ICgodWludDhfdCopc3JjX3kpW3ggKyAxXSAtIDE2OworICAgICAgICAgICAgKnUgPSAoKHVpbnQ4X3QqKXNyY191KVt4IC8gMl0gLSAxMjg7CisgICAgICAgICAgICAqdiA9ICgodWludDhfdCopc3JjX3YpW3ggLyAyXSAtIDEyODsKKyAgICAgICAgfTsKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNjoKKyAgICAgICAgcmV0dXJuIFtdKHZvaWQgKnNyY195LCB2b2lkICpzcmNfdSwgdm9pZCAqc3JjX3YsIHNpemVfdCB4LAorICAgICAgICAgICAgICAgIHNpZ25lZCAqeTEsIHNpZ25lZCAqeTIsIHNpZ25lZCAqdSwgc2lnbmVkICp2KSB7CisgICAgICAgICAgICAqeTEgPSAoc2lnbmVkKSgoKHVpbnQxNl90KilzcmNfeSlbeF0gPj4gMikgLSAxNjsKKyAgICAgICAgICAgICp5MiA9IChzaWduZWQpKCgodWludDE2X3QqKXNyY195KVt4ICsgMV0gPj4gMikgLSAxNjsKKyAgICAgICAgICAgICp1ID0gKHNpZ25lZCkoKCh1aW50MTZfdCopc3JjX3UpW3ggLyAyXSA+PiAyKSAtIDEyODsKKyAgICAgICAgICAgICp2ID0gKHNpZ25lZCkoKCh1aW50MTZfdCopc3JjX3YpW3ggLyAyXSA+PiAyKSAtIDEyODsKKyAgICAgICAgfTsKKyAgICBkZWZhdWx0OgorICAgICAgICBUUkVTUEFTUygpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworc3RkOjpmdW5jdGlvbjx2b2lkICh2b2lkICosIGJvb2wsIHNpZ25lZCwgc2lnbmVkLCBzaWduZWQsIHNpZ25lZCwgc2lnbmVkLCBzaWduZWQpPgorZ2V0V3JpdGVUb0RzdChPTVhfQ09MT1JfRk9STUFUVFlQRSBkc3RGb3JtYXQsIHVpbnQ4X3QgKmtBZGp1c3RlZENsaXApIHsKKyAgICBzd2l0Y2ggKGRzdEZvcm1hdCkgewogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1OgogICAgIHsKLSAgICAgICAgdWludDMyX3QgcmdiMSA9Ci0gICAgICAgICAgICAoKGtBZGp1c3RlZENsaXBbcjFdID4+IDMpIDw8IDExKQotICAgICAgICAgICAgfCAoKGtBZGp1c3RlZENsaXBbZzFdID4+IDIpIDw8IDUpCi0gICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW2IxXSA+PiAzKTsKKyAgICAgICAgcmV0dXJuIFtrQWRqdXN0ZWRDbGlwXSh2b2lkICpkc3RfcHRyLCBib29sIHVuY3JvcHBlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgcjEsIHNpZ25lZCBnMSwgc2lnbmVkIGIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCByMiwgc2lnbmVkIGcyLCBzaWduZWQgYjIpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJnYjEgPQorICAgICAgICAgICAgICAgICgoa0FkanVzdGVkQ2xpcFtyMV0gPj4gMykgPDwgMTEpCisgICAgICAgICAgICAgICAgfCAoKGtBZGp1c3RlZENsaXBbZzFdID4+IDIpIDw8IDUpCisgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtiMV0gPj4gMyk7CiAKLSAgICAgICAgaWYgKHVuY3JvcHBlZCkgewotICAgICAgICAgICAgdWludDMyX3QgcmdiMiA9Ci0gICAgICAgICAgICAgICAgKChrQWRqdXN0ZWRDbGlwW3IyXSA+PiAzKSA8PCAxMSkKLSAgICAgICAgICAgICAgICB8ICgoa0FkanVzdGVkQ2xpcFtnMl0gPj4gMikgPDwgNSkKLSAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW2IyXSA+PiAzKTsKKyAgICAgICAgICAgIGlmICh1bmNyb3BwZWQpIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCByZ2IyID0KKyAgICAgICAgICAgICAgICAgICAgKChrQWRqdXN0ZWRDbGlwW3IyXSA+PiAzKSA8PCAxMSkKKyAgICAgICAgICAgICAgICAgICAgfCAoKGtBZGp1c3RlZENsaXBbZzJdID4+IDIpIDw8IDUpCisgICAgICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbYjJdID4+IDMpOwogCi0gICAgICAgICAgICAqKHVpbnQzMl90ICopZHN0X3B0ciA9IChyZ2IyIDw8IDE2KSB8IHJnYjE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqKHVpbnQxNl90ICopZHN0X3B0ciA9IHJnYjE7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgKih1aW50MzJfdCAqKWRzdF9wdHIgPSAocmdiMiA8PCAxNikgfCByZ2IxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqKHVpbnQxNl90ICopZHN0X3B0ciA9IHJnYjE7CisgICAgICAgICAgICB9CisgICAgICAgIH07CiAgICAgfQogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODg6CiAgICAgewotICAgICAgICAoKHVpbnQzMl90ICopZHN0X3B0cilbMF0gPQotICAgICAgICAgICAgICAgIChrQWRqdXN0ZWRDbGlwW3IxXSkKLSAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW2cxXSA8PCA4KQotICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbYjFdIDw8IDE2KQotICAgICAgICAgICAgICAgIHwgKDB4RkYgPDwgMjQpOwotCi0gICAgICAgIGlmICh1bmNyb3BwZWQpIHsKLSAgICAgICAgICAgICgodWludDMyX3QgKilkc3RfcHRyKVsxXSA9Ci0gICAgICAgICAgICAgICAgICAgIChrQWRqdXN0ZWRDbGlwW3IyXSkKLSAgICAgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtnMl0gPDwgOCkKLSAgICAgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtiMl0gPDwgMTYpCisgICAgICAgIHJldHVybiBba0FkanVzdGVkQ2xpcF0odm9pZCAqZHN0X3B0ciwgYm9vbCB1bmNyb3BwZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIHIxLCBzaWduZWQgZzEsIHNpZ25lZCBiMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgcjIsIHNpZ25lZCBnMiwgc2lnbmVkIGIyKSB7CisgICAgICAgICAgICAoKHVpbnQzMl90ICopZHN0X3B0cilbMF0gPQorICAgICAgICAgICAgICAgICAgICAoa0FkanVzdGVkQ2xpcFtyMV0pCisgICAgICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbZzFdIDw8IDgpCisgICAgICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbYjFdIDw8IDE2KQogICAgICAgICAgICAgICAgICAgICB8ICgweEZGIDw8IDI0KTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKKworICAgICAgICAgICAgaWYgKHVuY3JvcHBlZCkgeworICAgICAgICAgICAgICAgICgodWludDMyX3QgKilkc3RfcHRyKVsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAoa0FkanVzdGVkQ2xpcFtyMl0pCisgICAgICAgICAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW2cyXSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtiMl0gPDwgMTYpCisgICAgICAgICAgICAgICAgICAgICAgICB8ICgweEZGIDw8IDI0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKICAgICB9CiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODoKICAgICB7Ci0gICAgICAgICgodWludDMyX3QgKilkc3RfcHRyKVswXSA9Ci0gICAgICAgICAgICAgICAgKGtBZGp1c3RlZENsaXBbYjFdKQotICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbZzFdIDw8IDgpCi0gICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtyMV0gPDwgMTYpCi0gICAgICAgICAgICAgICAgfCAoMHhGRiA8PCAyNCk7Ci0KLSAgICAgICAgaWYgKHVuY3JvcHBlZCkgewotICAgICAgICAgICAgKCh1aW50MzJfdCAqKWRzdF9wdHIpWzFdID0KLSAgICAgICAgICAgICAgICAgICAgKGtBZGp1c3RlZENsaXBbYjJdKQotICAgICAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW2cyXSA8PCA4KQotICAgICAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW3IyXSA8PCAxNikKKyAgICAgICAgcmV0dXJuIFtrQWRqdXN0ZWRDbGlwXSh2b2lkICpkc3RfcHRyLCBib29sIHVuY3JvcHBlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgcjEsIHNpZ25lZCBnMSwgc2lnbmVkIGIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZCByMiwgc2lnbmVkIGcyLCBzaWduZWQgYjIpIHsKKyAgICAgICAgICAgICgodWludDMyX3QgKilkc3RfcHRyKVswXSA9CisgICAgICAgICAgICAgICAgICAgIChrQWRqdXN0ZWRDbGlwW2IxXSkKKyAgICAgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtnMV0gPDwgOCkKKyAgICAgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtyMV0gPDwgMTYpCiAgICAgICAgICAgICAgICAgICAgIHwgKDB4RkYgPDwgMjQpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBpZiAodW5jcm9wcGVkKSB7CisgICAgICAgICAgICAgICAgKCh1aW50MzJfdCAqKWRzdF9wdHIpWzFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChrQWRqdXN0ZWRDbGlwW2IyXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgKGtBZGp1c3RlZENsaXBbZzJdIDw8IDgpCisgICAgICAgICAgICAgICAgICAgICAgICB8IChrQWRqdXN0ZWRDbGlwW3IyXSA8PCAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgKDB4RkYgPDwgMjQpOworICAgICAgICAgICAgfQorICAgICAgICB9OwogICAgIH0KICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKKyAgICAgICAgVFJFU1BBU1MoKTsKICAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7CiB9CisKIHN0YXR1c190IENvbG9yQ29udmVydGVyOjpjb252ZXJ0WVVWNDIwUGxhbmFyKAogICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpIHsKLSAgICBpZiAoISgoc3JjLm1Dcm9wTGVmdCAmIDEpID09IDAKLSAgICAgICAgICAgICYmIHNyYy5jcm9wV2lkdGgoKSA9PSBkc3QuY3JvcFdpZHRoKCkKLSAgICAgICAgICAgICYmIHNyYy5jcm9wSGVpZ2h0KCkgPT0gZHN0LmNyb3BIZWlnaHQoKSkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQogICAgIHVpbnQ4X3QgKmtBZGp1c3RlZENsaXAgPSBpbml0Q2xpcCgpOwogCisgICAgYXV0byByZWFkRnJvbVNyYyA9IGdldFJlYWRGcm9tU3JjKG1TcmNGb3JtYXQpOworICAgIGF1dG8gd3JpdGVUb0RzdCA9IGdldFdyaXRlVG9Ec3QobURzdEZvcm1hdCwga0FkanVzdGVkQ2xpcCk7CisKICAgICB1aW50OF90ICpkc3RfcHRyID0gKHVpbnQ4X3QgKilkc3QubUJpdHMKLSAgICAgICAgKyBkc3QubUNyb3BUb3AgKiBkc3QubVN0cmlkZSArIGRzdC5tQ3JvcExlZnQgKiBkc3QubUJwcDsKKyAgICAgICAgICAgICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1TdHJpZGUgKyBkc3QubUNyb3BMZWZ0ICogZHN0Lm1CcHA7CiAKLSAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9Ci0gICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1Dcm9wVG9wICogc3JjLm1TdHJpZGUgKyBzcmMubUNyb3BMZWZ0OworICAgIHVpbnQ4X3QgKnNyY195ID0gKHVpbnQ4X3QgKilzcmMubUJpdHMKKyAgICAgICAgICAgICsgc3JjLm1Dcm9wVG9wICogc3JjLm1TdHJpZGUgKyBzcmMubUNyb3BMZWZ0ICogc3JjLm1CcHA7CiAKLSAgICBjb25zdCB1aW50OF90ICpzcmNfdSA9Ci0gICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1TdHJpZGUgKiBzcmMubUhlaWdodAotICAgICAgICArIChzcmMubUNyb3BUb3AgLyAyKSAqIChzcmMubVN0cmlkZSAvIDIpICsgc3JjLm1Dcm9wTGVmdCAvIDI7CisgICAgdWludDhfdCAqc3JjX3UgPSAodWludDhfdCAqKXNyYy5tQml0cyArIHNyYy5tU3RyaWRlICogc3JjLm1IZWlnaHQKKyAgICAgICAgICAgICsgKHNyYy5tQ3JvcFRvcCAvIDIpICogKHNyYy5tU3RyaWRlIC8gMikgKyBzcmMubUNyb3BMZWZ0IC8gMiAqIHNyYy5tQnBwOwogCi0gICAgY29uc3QgdWludDhfdCAqc3JjX3YgPQotICAgICAgICBzcmNfdSArIChzcmMubVN0cmlkZSAvIDIpICogKHNyYy5tSGVpZ2h0IC8gMik7CisgICAgdWludDhfdCAqc3JjX3YgPSBzcmNfdSArIChzcmMubVN0cmlkZSAvIDIpICogKHNyYy5tSGVpZ2h0IC8gMik7CiAKICAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IHNyYy5jcm9wSGVpZ2h0KCk7ICsreSkgewogICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHNyYy5jcm9wV2lkdGgoKTsgeCArPSAyKSB7CkBAIC0zNzksMTEgKzQ0OCw4IEBACiAKICAgICAgICAgICAgIC8vIGNsaXAgcmFuZ2UgLTI3OCAuLiA1MzUKIAotICAgICAgICAgICAgc2lnbmVkIHkxID0gKHNpZ25lZClzcmNfeVt4XSAtIDE2OwotICAgICAgICAgICAgc2lnbmVkIHkyID0gKHNpZ25lZClzcmNfeVt4ICsgMV0gLSAxNjsKLQotICAgICAgICAgICAgc2lnbmVkIHUgPSAoc2lnbmVkKXNyY191W3ggLyAyXSAtIDEyODsKLSAgICAgICAgICAgIHNpZ25lZCB2ID0gKHNpZ25lZClzcmNfdlt4IC8gMl0gLSAxMjg7CisgICAgICAgICAgICBzaWduZWQgeTEsIHkyLCB1LCB2OworICAgICAgICAgICAgcmVhZEZyb21TcmMoc3JjX3ksIHNyY191LCBzcmNfdiwgeCwgJnkxLCAmeTIsICZ1LCAmdik7CiAKICAgICAgICAgICAgIHNpZ25lZCB1X2IgPSB1ICogNTE3OwogICAgICAgICAgICAgc2lnbmVkIHVfZyA9IC11ICogMTAwOwpAQCAtNDAxLDggKzQ2Nyw3IEBACiAgICAgICAgICAgICBzaWduZWQgcjIgPSAodG1wMiArIHZfcikgLyAyNTY7CiAKICAgICAgICAgICAgIGJvb2wgdW5jcm9wcGVkID0geCArIDEgPCBzcmMuY3JvcFdpZHRoKCk7Ci0gICAgICAgICAgICAodm9pZCl3cml0ZVRvRHN0KGRzdF9wdHIgKyB4ICogZHN0Lm1CcHAsCi0gICAgICAgICAgICAgICAgICAgIGtBZGp1c3RlZENsaXAsIHVuY3JvcHBlZCwgcjEsIGcxLCBiMSwgcjIsIGcyLCBiMik7CisgICAgICAgICAgICB3cml0ZVRvRHN0KGRzdF9wdHIgKyB4ICogZHN0Lm1CcHAsIHVuY3JvcHBlZCwgcjEsIGcxLCBiMSwgcjIsIGcyLCBiMik7CiAgICAgICAgIH0KIAogICAgICAgICBzcmNfeSArPSBzcmMubVN0cmlkZTsKQEAgLTQxOCwxNiArNDgzLDI0NyBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ29sb3JDb252ZXJ0ZXI6OmNvbnZlcnRZVVY0MjBQbGFuYXIxNigKKyAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KSB7CisgICAgaWYgKG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQ0NFk0MTApIHsKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMChzcmMsIGRzdCk7CisgICAgfQorCisgICAgcmV0dXJuIGNvbnZlcnRZVVY0MjBQbGFuYXIoc3JjLCBkc3QpOworfQorCisvKgorICogUGFjayAxMC1iaXQgWVVWIGludG8gUkdCQV8xMDEwMTAyLgorICoKKyAqIE1lZGlhIHNlbmRzIDEwLWJpdCBZVVYgaW4gYSBSR0JBXzEwMTAxMDIgZm9ybWF0IGJ1ZmZlci4gU0Ygd2lsbCBoYW5kbGUKKyAqIHRoZSBjb252ZXJzaW9uIHRvIFJHQiB1c2luZyBSZW5kZXJFbmdpbmUgZmFsbGJhY2suCisgKgorICogV2UgZG8gbm90IHBlcmZvcm0gYSBZVVYtPlJHQiBjb252ZXJzaW9uIGhlcmUsIGhvd2V2ZXIgdGhlIGNvbnZlcnNpb24gd2l0aAorICogQlQyMDIwIHRvIEZ1bGwgcmFuZ2UgaXMgYmVsb3cgZm9yIHJlZmVyZW5jZToKKyAqCisgKiAgIEIgPSAxLjE2OCAgKihZIC0gNjQpICsgMi4xNDggICooVSAtIDUxMikKKyAqICAgRyA9IDEuMTY4ICAqKFkgLSA2NCkgLSAwLjY1MiAgKihWIC0gNTEyKSAtIDAuMTg4ICAqKFUgLSA1MTIpCisgKiAgIFIgPSAxLjE2OCAgKihZIC0gNjQpICsgMS42ODMgICooViAtIDUxMikKKyAqCisgKiAgIEIgPSAxMTk2LzEwMjQgICooWSAtIDY0KSArIDIyMDAvMTAyNCAgKihVIC0gNTEyKQorICogICBHID0gLi4uLi4uLi4uLi4uLi4uLi4uLi4gLSAgNjY4LzEwMjQgICooViAtIDUxMikgLSAxOTIvMTAyNCAgKihVIC0gNTEyKQorICogICBSID0gLi4uLi4uLi4uLi4uLi4uLi4uLi4gKyAxNzIzLzEwMjQgICooViAtIDUxMikKKyAqCisgKiAgIG1pbl9CID0gKDExOTYgICooLSA2NCkgKyAyMjAwICAqKC0gNTEyKSkgLyAxMDI0ID0gLTExNzUKKyAqICAgbWluX0cgPSAoMTE5NiAgKigtIDY0KSAtIDY2OCAgKigxMDIzIC0gNTEyKSAtIDE5MiAgKigxMDIzIC0gNTEyKSkgLyAxMDI0ID0gLTUwNAorICogICBtaW5fUiA9ICgxMTk2ICAqKC0gNjQpICsgMTcyMyAgKigtIDUxMikpIC8gMTAyNCA9IC05MzcKKyAqCisgKiAgIG1heF9CID0gKDExOTYgICooMTAyMyAtIDY0KSArIDIyMDAgICooMTAyMyAtIDUxMikpIC8gMTAyNCA9IDIyMTgKKyAqICAgbWF4X0cgPSAoMTE5NiAgKigxMDIzIC0gNjQpIC0gNjY4ICAqKC0gNTEyKSAtIDE5MiAgKigtIDUxMikpIC8gMTAyNCA9IDE1NTEKKyAqICAgbWF4X1IgPSAoMTE5NiAgKigxMDIzIC0gNjQpICsgMTcyMyAgKigxMDIzIC0gNTEyKSkgLyAxMDI0ID0gMTk4MAorICoKKyAqICAgY2xpcCByYW5nZSAtMTE3NSAuLiAyMjE4CisgKgorICovCisKKyNpZiAhVVNFX05FT05fWTQxMAorCitzdGF0dXNfdCBDb2xvckNvbnZlcnRlcjo6Y29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKAorICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpIHsKKyAgICB1aW50OF90ICpkc3RfcHRyID0gKHVpbnQ4X3QgKilkc3QubUJpdHMKKyAgICAgICAgKyBkc3QubUNyb3BUb3AgKiBkc3QubVN0cmlkZSArIGRzdC5tQ3JvcExlZnQgKiBkc3QubUJwcDsKKworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0KKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubUNyb3BUb3AgKiBzcmMubVN0cmlkZSArIHNyYy5tQ3JvcExlZnQgKiBzcmMubUJwcDsKKworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY191ID0KKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubVN0cmlkZSAqIHNyYy5tSGVpZ2h0CisgICAgICAgICsgKHNyYy5tQ3JvcFRvcCAvIDIpICogKHNyYy5tU3RyaWRlIC8gMikgKyAoc3JjLm1Dcm9wTGVmdCAvIDIpICogc3JjLm1CcHA7CisKKyAgICBjb25zdCB1aW50OF90ICpzcmNfdiA9CisgICAgICAgIHNyY191ICsgKHNyYy5tU3RyaWRlIC8gMikgKiAoc3JjLm1IZWlnaHQgLyAyKTsKKworICAgIC8vIENvbnZlcnRpbmcgdHdvIGxpbmVzIGF0IGEgdGltZSwgc2xpZ2h0bHkgZmFzdGVyCisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBzcmMuY3JvcEhlaWdodCgpOyB5ICs9IDIpIHsKKyAgICAgICAgdWludDMyX3QgKmRzdF90b3AgPSAodWludDMyX3QgKikgZHN0X3B0cjsKKyAgICAgICAgdWludDMyX3QgKmRzdF9ib3QgPSAodWludDMyX3QgKikgKGRzdF9wdHIgKyBkc3QubVN0cmlkZSk7CisgICAgICAgIHVpbnQxNl90ICpwdHJfeXRvcCA9ICh1aW50MTZfdCopIHNyY195OworICAgICAgICB1aW50MTZfdCAqcHRyX3lib3QgPSAodWludDE2X3QqKSAoc3JjX3kgKyBzcmMubVN0cmlkZSk7CisgICAgICAgIHVpbnQxNl90ICpwdHJfdSA9ICh1aW50MTZfdCopIHNyY191OworICAgICAgICB1aW50MTZfdCAqcHRyX3YgPSAodWludDE2X3QqKSBzcmNfdjsKKworICAgICAgICB1aW50MzJfdCB1MDEsIHYwMSwgeTAxLCB5MjMsIHk0NSwgeTY3LCB1djAsIHV2MTsKKyAgICAgICAgc2l6ZV90IHggPSAwOworICAgICAgICBmb3IgKDsgeCA8IHNyYy5jcm9wV2lkdGgoKSAtIDM7IHggKz0gNCkgeworICAgICAgICAgICAgdTAxID0gKigodWludDMyX3QqKXB0cl91KTsgcHRyX3UgKz0gMjsKKyAgICAgICAgICAgIHYwMSA9ICooKHVpbnQzMl90KilwdHJfdik7IHB0cl92ICs9IDI7CisKKyAgICAgICAgICAgIHkwMSA9ICooKHVpbnQzMl90KilwdHJfeXRvcCk7IHB0cl95dG9wICs9IDI7CisgICAgICAgICAgICB5MjMgPSAqKCh1aW50MzJfdCopcHRyX3l0b3ApOyBwdHJfeXRvcCArPSAyOworICAgICAgICAgICAgeTQ1ID0gKigodWludDMyX3QqKXB0cl95Ym90KTsgcHRyX3lib3QgKz0gMjsKKyAgICAgICAgICAgIHk2NyA9ICooKHVpbnQzMl90KilwdHJfeWJvdCk7IHB0cl95Ym90ICs9IDI7CisKKyAgICAgICAgICAgIHV2MCA9ICh1MDEgJiAweDNGRikgfCAoKHYwMSAmIDB4M0ZGKSA8PCAyMCk7CisgICAgICAgICAgICB1djEgPSAodTAxID4+IDE2KSB8ICgodjAxID4+IDE2KSA8PCAyMCk7CisKKyAgICAgICAgICAgICpkc3RfdG9wKysgPSAoKHkwMSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0X3RvcCsrID0gKCh5MDEgPj4gMTYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RfdG9wKysgPSAoKHkyMyAmIDB4M0ZGKSA8PCAxMCkgfCB1djE7CisgICAgICAgICAgICAqZHN0X3RvcCsrID0gKCh5MjMgPj4gMTYpIDw8IDEwKSB8IHV2MTsKKworICAgICAgICAgICAgKmRzdF9ib3QrKyA9ICgoeTQ1ICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RfYm90KysgPSAoKHk0NSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdF9ib3QrKyA9ICgoeTY3ICYgMHgzRkYpIDw8IDEwKSB8IHV2MTsKKyAgICAgICAgICAgICpkc3RfYm90KysgPSAoKHk2NyA+PiAxNikgPDwgMTApIHwgdXYxOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlcmUgc2hvdWxkIGJlIGF0IG1vc3QgMiBtb3JlIHBpeGVscyB0byBwcm9jZXNzLiBOb3RlIHRoYXQgd2UgZG9uJ3QKKyAgICAgICAgLy8gbmVlZCB0byBjb25zaWRlciBvZGQgY2FzZSBhcyB0aGUgYnVmZmVyIGlzIGFsd2F5cyBhbGlnbmVkIHRvIGV2ZW4uCisgICAgICAgIGlmICh4IDwgc3JjLmNyb3BXaWR0aCgpKSB7CisgICAgICAgICAgICB1MDEgPSAqcHRyX3U7CisgICAgICAgICAgICB2MDEgPSAqcHRyX3Y7CisgICAgICAgICAgICB5MDEgPSAqKCh1aW50MzJfdCopcHRyX3l0b3ApOworICAgICAgICAgICAgeTQ1ID0gKigodWludDMyX3QqKXB0cl95Ym90KTsKKyAgICAgICAgICAgIHV2MCA9ICh1MDEgJiAweDNGRikgfCAoKHYwMSAmIDB4M0ZGKSA8PCAyMCk7CisgICAgICAgICAgICAqZHN0X3RvcCsrID0gKCh5MDEgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdF90b3ArKyA9ICgoeTAxID4+IDE2KSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0X2JvdCsrID0gKCh5NDUgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdF9ib3QrKyA9ICgoeTQ1ID4+IDE2KSA8PCAxMCkgfCB1djA7CisgICAgICAgIH0KKworICAgICAgICBzcmNfeSArPSBzcmMubVN0cmlkZSAqIDI7CisgICAgICAgIHNyY191ICs9IHNyYy5tU3RyaWRlIC8gMjsKKyAgICAgICAgc3JjX3YgKz0gc3JjLm1TdHJpZGUgLyAyOworICAgICAgICBkc3RfcHRyICs9IGRzdC5tU3RyaWRlICogMjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKKyNlbHNlCisKK3N0YXR1c190IENvbG9yQ29udmVydGVyOjpjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTAoCisgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCkgeworICAgIHVpbnQ4X3QgKm91dCA9ICh1aW50OF90ICopZHN0Lm1CaXRzCisgICAgICAgICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1TdHJpZGUgKyBkc3QubUNyb3BMZWZ0ICogZHN0Lm1CcHA7CisKKyAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9CisgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1Dcm9wVG9wICogc3JjLm1TdHJpZGUgKyBzcmMubUNyb3BMZWZ0ICogc3JjLm1CcHA7CisKKyAgICBjb25zdCB1aW50OF90ICpzcmNfdSA9CisgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1TdHJpZGUgKiBzcmMubUhlaWdodAorICAgICAgICArIChzcmMubUNyb3BUb3AgLyAyKSAqIChzcmMubVN0cmlkZSAvIDIpICsgKHNyYy5tQ3JvcExlZnQgLyAyKSAqIHNyYy5tQnBwOworCisgICAgY29uc3QgdWludDhfdCAqc3JjX3YgPQorICAgICAgICBzcmNfdSArIChzcmMubVN0cmlkZSAvIDIpICogKHNyYy5tSGVpZ2h0IC8gMik7CisKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IHNyYy5jcm9wSGVpZ2h0KCk7IHkrKykgeworICAgICAgICB1aW50MTZfdCAqcHRyX3kgPSAodWludDE2X3QqKSBzcmNfeTsKKyAgICAgICAgdWludDE2X3QgKnB0cl91ID0gKHVpbnQxNl90Kikgc3JjX3U7CisgICAgICAgIHVpbnQxNl90ICpwdHJfdiA9ICh1aW50MTZfdCopIHNyY192OworICAgICAgICB1aW50MzJfdCAqcHRyX291dCA9ICh1aW50MzJfdCAqKSBvdXQ7CisKKyAgICAgICAgLy8gUHJvY2VzcyAxNi1waXhlbCBhdCBhIHRpbWUuCisgICAgICAgIHVpbnQzMl90ICpwdHJfbGltaXQgPSBwdHJfb3V0ICsgKHNyYy5jcm9wV2lkdGgoKSAmIH4xNSk7CisgICAgICAgIHdoaWxlIChwdHJfb3V0IDwgcHRyX2xpbWl0KSB7CisgICAgICAgICAgICB1aW50MTZ4NF90IHUwMTIzID0gdmxkMV91MTYocHRyX3UpOyBwdHJfdSArPSA0OworICAgICAgICAgICAgdWludDE2eDRfdCB1NDU2NyA9IHZsZDFfdTE2KHB0cl91KTsgcHRyX3UgKz0gNDsKKyAgICAgICAgICAgIHVpbnQxNng0X3QgdjAxMjMgPSB2bGQxX3UxNihwdHJfdik7IHB0cl92ICs9IDQ7CisgICAgICAgICAgICB1aW50MTZ4NF90IHY0NTY3ID0gdmxkMV91MTYocHRyX3YpOyBwdHJfdiArPSA0OworICAgICAgICAgICAgdWludDE2eDRfdCB5MDEyMyA9IHZsZDFfdTE2KHB0cl95KTsgcHRyX3kgKz0gNDsKKyAgICAgICAgICAgIHVpbnQxNng0X3QgeTQ1NjcgPSB2bGQxX3UxNihwdHJfeSk7IHB0cl95ICs9IDQ7CisgICAgICAgICAgICB1aW50MTZ4NF90IHk4OWFiID0gdmxkMV91MTYocHRyX3kpOyBwdHJfeSArPSA0OworICAgICAgICAgICAgdWludDE2eDRfdCB5Y2RlZiA9IHZsZDFfdTE2KHB0cl95KTsgcHRyX3kgKz0gNDsKKworICAgICAgICAgICAgdWludDMyeDJfdCB1dnRlbXBsOworICAgICAgICAgICAgdWludDMyeDRfdCB1dnRlbXBxOworCisgICAgICAgICAgICB1dnRlbXBxID0gdmFkZHdfdTE2KHZzaGxsX25fdTE2KHYwMTIzLCAyMCksIHUwMTIzKTsKKworICAgICAgICAgICAgdXZ0ZW1wbCA9IHZnZXRfbG93X3UzMih1dnRlbXBxKTsKKyAgICAgICAgICAgIHVpbnQzMng0X3QgdXYwMDExID0gdnJlaW50ZXJwcmV0cV91MzJfdTY0KAorICAgICAgICAgICAgICAgICAgICB2YWRkd191MzIodnNobGxfbl91MzIodXZ0ZW1wbCwgMzIpLCB1dnRlbXBsKSk7CisKKyAgICAgICAgICAgIHV2dGVtcGwgPSB2Z2V0X2hpZ2hfdTMyKHV2dGVtcHEpOworICAgICAgICAgICAgdWludDMyeDRfdCB1djIyMzMgPSB2cmVpbnRlcnByZXRxX3UzMl91NjQoCisgICAgICAgICAgICAgICAgICAgIHZhZGR3X3UzMih2c2hsbF9uX3UzMih1dnRlbXBsLCAzMiksIHV2dGVtcGwpKTsKKworICAgICAgICAgICAgdXZ0ZW1wcSA9IHZhZGR3X3UxNih2c2hsbF9uX3UxNih2NDU2NywgMjApLCB1NDU2Nyk7CisKKyAgICAgICAgICAgIHV2dGVtcGwgPSB2Z2V0X2xvd191MzIodXZ0ZW1wcSk7CisgICAgICAgICAgICB1aW50MzJ4NF90IHV2NDQ1NSA9IHZyZWludGVycHJldHFfdTMyX3U2NCgKKyAgICAgICAgICAgICAgICAgICAgdmFkZHdfdTMyKHZzaGxsX25fdTMyKHV2dGVtcGwsIDMyKSwgdXZ0ZW1wbCkpOworCisgICAgICAgICAgICB1dnRlbXBsID0gdmdldF9oaWdoX3UzMih1dnRlbXBxKTsKKyAgICAgICAgICAgIHVpbnQzMng0X3QgdXY2Njc3ID0gdnJlaW50ZXJwcmV0cV91MzJfdTY0KAorICAgICAgICAgICAgICAgICAgICB2YWRkd191MzIodnNobGxfbl91MzIodXZ0ZW1wbCwgMzIpLCB1dnRlbXBsKSk7CisKKyAgICAgICAgICAgIHVpbnQzMng0X3QgZHN0dGVtcDsKKworICAgICAgICAgICAgZHN0dGVtcCA9IHZvcnJxX3UzMih1djAwMTEsIHZzaGxsX25fdTE2KHkwMTIzLCAxMCkpOworICAgICAgICAgICAgdnN0MXFfdTMyKHB0cl9vdXQsIGRzdHRlbXApOyBwdHJfb3V0ICs9IDQ7CisKKyAgICAgICAgICAgIGRzdHRlbXAgPSB2b3JycV91MzIodXYyMjMzLCB2c2hsbF9uX3UxNih5NDU2NywgMTApKTsKKyAgICAgICAgICAgIHZzdDFxX3UzMihwdHJfb3V0LCBkc3R0ZW1wKTsgcHRyX291dCArPSA0OworCisgICAgICAgICAgICBkc3R0ZW1wID0gdm9ycnFfdTMyKHV2NDQ1NSwgdnNobGxfbl91MTYoeTg5YWIsIDEwKSk7CisgICAgICAgICAgICB2c3QxcV91MzIocHRyX291dCwgZHN0dGVtcCk7IHB0cl9vdXQgKz0gNDsKKworICAgICAgICAgICAgZHN0dGVtcCA9IHZvcnJxX3UzMih1djY2NzcsIHZzaGxsX25fdTE2KHljZGVmLCAxMCkpOworICAgICAgICAgICAgdnN0MXFfdTMyKHB0cl9vdXQsIGRzdHRlbXApOyBwdHJfb3V0ICs9IDQ7CisgICAgICAgIH0KKworICAgICAgICBzcmNfeSArPSBzcmMubVN0cmlkZTsKKyAgICAgICAgaWYgKHkgJiAxKSB7CisgICAgICAgICAgICBzcmNfdSArPSBzcmMubVN0cmlkZSAvIDI7CisgICAgICAgICAgICBzcmNfdiArPSBzcmMubVN0cmlkZSAvIDI7CisgICAgICAgIH0KKyAgICAgICAgb3V0ICs9IGRzdC5tU3RyaWRlOworICAgIH0KKworICAgIC8vIFByb2Nlc3MgdGhlIGxlZnQtb3ZlcnMgb3V0LW9mLWxvb3AsIDItcGl4ZWwgYXQgYSB0aW1lLiBOb3RlIHRoYXQgd2UgZG9uJ3QKKyAgICAvLyBuZWVkIHRvIGNvbnNpZGVyIG9kZCBjYXNlIGFzIHRoZSBidWZmZXIgaXMgYWx3YXlzIGFsaWduZWQgdG8gZXZlbi4KKyAgICBpZiAoc3JjLmNyb3BXaWR0aCgpICYgMTUpIHsKKyAgICAgICAgc2l6ZV90IHhzdGFydCA9IChzcmMuY3JvcFdpZHRoKCkgJiB+MTUpOworCisgICAgICAgIHVpbnQ4X3QgKm91dCA9ICh1aW50OF90ICopZHN0Lm1CaXRzICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1TdHJpZGUKKyAgICAgICAgICAgICAgICArIChkc3QubUNyb3BMZWZ0ICsgeHN0YXJ0KSAqIGRzdC5tQnBwOworCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0gKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubUNyb3BUb3AgKiBzcmMubVN0cmlkZQorICAgICAgICAgICAgICAgICsgKHNyYy5tQ3JvcExlZnQgKyB4c3RhcnQpICogc3JjLm1CcHA7CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3UgPSAoY29uc3QgdWludDhfdCAqKXNyYy5tQml0cyArIHNyYy5tU3RyaWRlICogc3JjLm1IZWlnaHQKKyAgICAgICAgICAgICsgKHNyYy5tQ3JvcFRvcCAvIDIpICogKHNyYy5tU3RyaWRlIC8gMikKKyAgICAgICAgICAgICsgKChzcmMubUNyb3BMZWZ0ICsgeHN0YXJ0KSAvIDIpICogc3JjLm1CcHA7CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3YgPSBzcmNfdSArIChzcmMubVN0cmlkZSAvIDIpICogKHNyYy5tSGVpZ2h0IC8gMik7CisKKyAgICAgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBzcmMuY3JvcEhlaWdodCgpOyB5KyspIHsKKyAgICAgICAgICAgIHVpbnQxNl90ICpwdHJfeSA9ICh1aW50MTZfdCopIHNyY195OworICAgICAgICAgICAgdWludDE2X3QgKnB0cl91ID0gKHVpbnQxNl90Kikgc3JjX3U7CisgICAgICAgICAgICB1aW50MTZfdCAqcHRyX3YgPSAodWludDE2X3QqKSBzcmNfdjsKKyAgICAgICAgICAgIHVpbnQzMl90ICpwdHJfb3V0ID0gKHVpbnQzMl90ICopIG91dDsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IHggPSB4c3RhcnQ7IHggPCBzcmMuY3JvcFdpZHRoKCk7IHggKz0gMikgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IHUgPSAqcHRyX3UrKzsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCB2ID0gKnB0cl92Kys7CisgICAgICAgICAgICAgICAgdWludDMyX3QgeTAxID0gKigodWludDMyX3QqKXB0cl95KTsgcHRyX3kgKz0gMjsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB1diA9IHUgfCAoKCh1aW50MzJfdCl2KSA8PCAyMCk7CisgICAgICAgICAgICAgICAgKnB0cl9vdXQrKyA9ICgoeTAxICYgMHgzRkYpIDw8IDEwKSB8IHV2OworICAgICAgICAgICAgICAgICpwdHJfb3V0KysgPSAoKHkwMSA+PiAxNikgPDwgMTApIHwgdXY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcmNfeSArPSBzcmMubVN0cmlkZTsKKyAgICAgICAgICAgIGlmICh5ICYgMSkgeworICAgICAgICAgICAgICAgIHNyY191ICs9IHNyYy5tU3RyaWRlIC8gMjsKKyAgICAgICAgICAgICAgICBzcmNfdiArPSBzcmMubVN0cmlkZSAvIDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQgKz0gZHN0Lm1TdHJpZGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKKyNlbmRpZiAvLyBVU0VfTkVPTl9ZNDEwCisKIHN0YXR1c190IENvbG9yQ29udmVydGVyOjpjb252ZXJ0UUNPTVlVVjQyMFNlbWlQbGFuYXIoCiAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCkgewogICAgIHVpbnQ4X3QgKmtBZGp1c3RlZENsaXAgPSBpbml0Q2xpcCgpOwogCi0gICAgaWYgKCEoKHNyYy5tQ3JvcExlZnQgJiAxKSA9PSAwCi0gICAgICAgICAgICAmJiBzcmMuY3JvcFdpZHRoKCkgPT0gZHN0LmNyb3BXaWR0aCgpCi0gICAgICAgICAgICAmJiBzcmMuY3JvcEhlaWdodCgpID09IGRzdC5jcm9wSGVpZ2h0KCkpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KICAgICB1aW50MTZfdCAqZHN0X3B0ciA9ICh1aW50MTZfdCAqKWRzdC5tQml0cwogICAgICAgICArIGRzdC5tQ3JvcFRvcCAqIGRzdC5tV2lkdGggKyBkc3QubUNyb3BMZWZ0OwogCkBAIC00OTYsMTIgKzc5Miw2IEBACiAKICAgICB1aW50OF90ICprQWRqdXN0ZWRDbGlwID0gaW5pdENsaXAoKTsKIAotICAgIGlmICghKChzcmMubUNyb3BMZWZ0ICYgMSkgPT0gMAotICAgICAgICAgICAgJiYgc3JjLmNyb3BXaWR0aCgpID09IGRzdC5jcm9wV2lkdGgoKQotICAgICAgICAgICAgJiYgc3JjLmNyb3BIZWlnaHQoKSA9PSBkc3QuY3JvcEhlaWdodCgpKSkgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCiAgICAgdWludDE2X3QgKmRzdF9wdHIgPSAodWludDE2X3QgKilkc3QubUJpdHMKICAgICAgICAgKyBkc3QubUNyb3BUb3AgKiBkc3QubVdpZHRoICsgZHN0Lm1Dcm9wTGVmdDsKIApAQCAtNTY4LDE2ICs4NTgsMTEgQEAKICAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KSB7CiAgICAgdWludDhfdCAqa0FkanVzdGVkQ2xpcCA9IGluaXRDbGlwKCk7CiAKLSAgICBpZiAoISgoc3JjLm1Dcm9wTGVmdCAmIDEpID09IDAKLSAgICAgICAgICAgICYmIHNyYy5jcm9wV2lkdGgoKSA9PSBkc3QuY3JvcFdpZHRoKCkKLSAgICAgICAgICAgICYmIHNyYy5jcm9wSGVpZ2h0KCkgPT0gZHN0LmNyb3BIZWlnaHQoKSkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQogICAgIHVpbnQxNl90ICpkc3RfcHRyID0gKHVpbnQxNl90ICopZHN0Lm1CaXRzCiAgICAgICAgICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1XaWR0aCArIGRzdC5tQ3JvcExlZnQ7CiAKLSAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9IChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzOworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0KKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubUNyb3BUb3AgKiBzcmMubVdpZHRoICsgc3JjLm1Dcm9wTGVmdDsKIAogICAgIGNvbnN0IHVpbnQ4X3QgKnNyY191ID0KICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmNfeSArIHNyYy5tV2lkdGggKiAoc3JjLm1IZWlnaHQgLSBzcmMubUNyb3BUb3AgLyAyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcAppbmRleCBhMDc3ODdhLi42NTdhMDViIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCkBAIC0xOCwxMCArMTgsMTEgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oIgotCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4gLy8gZm9yIHByb3BlcnR5X2dldAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oPgogI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KICNpbmNsdWRlIDx1aS9GZW5jZS5oPgogI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXJNYXBwZXIuaD4KQEAgLTMwLDcgKzMxLDYgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0KIHN0YXRpYyBpbnQgQUxJR04oaW50IHgsIGludCB5KSB7CiAgICAgLy8geSBtdXN0IGJlIGEgcG93ZXIgb2YgMi4KICAgICByZXR1cm4gKHggKyB5IC0gMSkgJiB+KHkgLSAxKTsKQEAgLTUwLDcgKzUwLDkgQEAKICAgICAgIG1Dcm9wQm90dG9tKDApLAogICAgICAgbUNyb3BXaWR0aCgwKSwKICAgICAgIG1Dcm9wSGVpZ2h0KDApLAotICAgICAgbVJvdGF0aW9uRGVncmVlcyhyb3RhdGlvbikgeworICAgICAgbVJvdGF0aW9uRGVncmVlcyhyb3RhdGlvbiksCisgICAgICBtRGF0YVNwYWNlKEhBTF9EQVRBU1BBQ0VfVU5LTk9XTikgeworICAgIG1lbXNldCgmbUhEUlN0YXRpY0luZm8sIDAsIHNpemVvZihtSERSU3RhdGljSW5mbykpOwogfQogCiBTb2Z0d2FyZVJlbmRlcmVyOjp+U29mdHdhcmVSZW5kZXJlcigpIHsKQEAgLTU4LDcgKzYwLDggQEAKICAgICBtQ29udmVydGVyID0gTlVMTDsKIH0KIAotdm9pZCBTb2Z0d2FyZVJlbmRlcmVyOjpyZXNldEZvcm1hdElmQ2hhbmdlZChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgewordm9pZCBTb2Z0d2FyZVJlbmRlcmVyOjpyZXNldEZvcm1hdElmQ2hhbmdlZCgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIHNpemVfdCBudW1PdXRwdXRCdWZmZXJzKSB7CiAgICAgQ0hFQ0soZm9ybWF0ICE9IE5VTEwpOwogCiAgICAgaW50MzJfdCBjb2xvckZvcm1hdE5ldzsKQEAgLTc2LDEzICs3OSwyNiBAQAogICAgICAgICBjcm9wQm90dG9tTmV3ID0gaGVpZ2h0TmV3IC0gMTsKICAgICB9CiAKKyAgICAvLyBUaGUgbmF0aXZlIHdpbmRvdyBidWZmZXIgZm9ybWF0IGZvciBoaWdoLWJpdGRlcHRoIGNvbnRlbnQgY291bGQKKyAgICAvLyBkZXBlbmQgb24gdGhlIGRhdGFzcGFjZSBhbHNvLgorICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZTsKKyAgICBib29sIGRhdGFTcGFjZUNoYW5nZWRGb3JQbGFuYXIxNiA9IGZhbHNlOworICAgIGlmIChjb2xvckZvcm1hdE5ldyA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyMTYKKyAgICAgICAgICAgICYmIGZvcm1hdC0+ZmluZEludDMyKCJhbmRyb2lkLl9kYXRhc3BhY2UiLCAoaW50MzJfdCAqKSZkYXRhU3BhY2UpCisgICAgICAgICAgICAmJiBkYXRhU3BhY2UgIT0gbURhdGFTcGFjZSkgeworICAgICAgICAvLyBEbyBub3QgbW9kaWZ5IG1EYXRhU3BhY2UgaGVyZSwgaXQncyBvbmx5IG1vZGlmaWVkIGF0IGxhc3QKKyAgICAgICAgLy8gd2hlbiB3ZSBkbyBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RhdGFfc3BhY2UoKS4KKyAgICAgICAgZGF0YVNwYWNlQ2hhbmdlZEZvclBsYW5hcjE2ID0gdHJ1ZTsKKyAgICB9CisKICAgICBpZiAoc3RhdGljX2Nhc3Q8aW50MzJfdD4obUNvbG9yRm9ybWF0KSA9PSBjb2xvckZvcm1hdE5ldyAmJgogICAgICAgICBtV2lkdGggPT0gd2lkdGhOZXcgJiYKICAgICAgICAgbUhlaWdodCA9PSBoZWlnaHROZXcgJiYKICAgICAgICAgbUNyb3BMZWZ0ID09IGNyb3BMZWZ0TmV3ICYmCiAgICAgICAgIG1Dcm9wVG9wID09IGNyb3BUb3BOZXcgJiYKICAgICAgICAgbUNyb3BSaWdodCA9PSBjcm9wUmlnaHROZXcgJiYKLSAgICAgICAgbUNyb3BCb3R0b20gPT0gY3JvcEJvdHRvbU5ldykgeworICAgICAgICBtQ3JvcEJvdHRvbSA9PSBjcm9wQm90dG9tTmV3ICYmCisgICAgICAgICFkYXRhU3BhY2VDaGFuZ2VkRm9yUGxhbmFyMTYpIHsKICAgICAgICAgLy8gTm90aGluZyBjaGFuZ2VkLCBubyBuZWVkIHRvIHJlc2V0IHJlbmRlcmVyLgogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTMwLDYgKzE0NiwyMiBAQAogICAgICAgICAgICAgICAgIGJ1ZkhlaWdodCA9IChtQ3JvcEhlaWdodCArIDEpICYgfjE7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKChkYXRhU3BhY2UgJiBIQUxfREFUQVNQQUNFX1NUQU5EQVJEX01BU0spID09IEhBTF9EQVRBU1BBQ0VfU1RBTkRBUkRfQlQyMDIwKQorICAgICAgICAgICAgICAgICAmJiAoKGRhdGFTcGFjZSAmIEhBTF9EQVRBU1BBQ0VfVFJBTlNGRVJfTUFTSykgPT0gSEFMX0RBVEFTUEFDRV9UUkFOU0ZFUl9TVDIwODQpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEhlcmUgd2Ugd291bGQgY29udmVydCBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyMTYgaW50bworICAgICAgICAgICAgICAgICAgICAvLyBPTVhfQ09MT1JfRm9ybWF0WVVWNDQ0WTQxMCwgYW5kIHB1dCBpdCBpbnNpZGUgYSBidWZmZXIgd2l0aAorICAgICAgICAgICAgICAgICAgICAvLyBmb3JtYXQgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDIuIFN1cmZhY2VmbGluZ2VyIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHJlbmRlciBlbmdpbmUgdG8gY29udmVydCBpdCB0byBSR0IgaWYgbmVlZGVkLgorICAgICAgICAgICAgICAgICAgICBoYWxGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBoYWxGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1ZldpZHRoID0gKG1Dcm9wV2lkdGggKyAxKSAmIH4xOworICAgICAgICAgICAgICAgIGJ1ZkhlaWdodCA9IChtQ3JvcEhlaWdodCArIDEpICYgfjE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTQxLDYgKzE3MywxMCBAQAogICAgICAgICBtQ29udmVydGVyID0gbmV3IENvbG9yQ29udmVydGVyKAogICAgICAgICAgICAgICAgIG1Db2xvckZvcm1hdCwgT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1KTsKICAgICAgICAgQ0hFQ0sobUNvbnZlcnRlci0+aXNWYWxpZCgpKTsKKyAgICB9IGVsc2UgaWYgKGhhbEZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMikgeworICAgICAgICBtQ29udmVydGVyID0gbmV3IENvbG9yQ29udmVydGVyKAorICAgICAgICAgICAgICAgIG1Db2xvckZvcm1hdCwgT01YX0NPTE9SX0Zvcm1hdFlVVjQ0NFk0MTApOworICAgICAgICBDSEVDSyhtQ29udmVydGVyLT5pc1ZhbGlkKCkpOwogICAgIH0KIAogICAgIENIRUNLKG1OYXRpdmVXaW5kb3cgIT0gTlVMTCk7CkBAIC0xNTEsNyArMTg3LDcgQEAKICAgICBDSEVDS19FUSgwLAogICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UoCiAgICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLAotICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX05FVkVSIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTgorICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX05FVkVSIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9SQVJFTFkKICAgICAgICAgICAgIHwgR1JBTExPQ19VU0FHRV9IV19URVhUVVJFIHwgR1JBTExPQ19VU0FHRV9FWFRFUk5BTF9ESVNQKSk7CiAKICAgICBDSEVDS19FUSgwLApAQCAtMTY3LDYgKzIwMywxMSBAQAogICAgIENIRUNLX0VRKDAsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZm9ybWF0KAogICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksCiAgICAgICAgICAgICAgICAgaGFsRm9ybWF0KSk7CisgICAgaWYgKE9LICE9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudCgKKyAgICAgICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLCBudW1PdXRwdXRCdWZmZXJzICsgNCkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgbmF0aXZlIHdpbmRvdyBidWZmZXIgY291bnQgdG8gKCV6dSArIDQpIiwKKyAgICAgICAgICAgICAgICBudW1PdXRwdXRCdWZmZXJzKTsKKyAgICB9CiAKICAgICAvLyBOT1RFOiBuYXRpdmUgd2luZG93IHVzZXMgZXh0ZW5kZWQgcmlnaHQtYm90dG9tIGNvb3JkaW5hdGUKICAgICBhbmRyb2lkX25hdGl2ZV9yZWN0X3QgY3JvcDsKQEAgLTIwMiw4ICsyNDMsOCBAQAogCiBzdGQ6Omxpc3Q8RnJhbWVSZW5kZXJUcmFja2VyOjpJbmZvPiBTb2Z0d2FyZVJlbmRlcmVyOjpyZW5kZXIoCiAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCAsIGludDY0X3QgbWVkaWFUaW1lVXMsIG5zZWNzX3QgcmVuZGVyVGltZU5zLAotICAgICAgICB2b2lkKiAvKnBsYXRmb3JtUHJpdmF0ZSovLCBjb25zdCBzcDxBTWVzc2FnZT4mIGZvcm1hdCkgewotICAgIHJlc2V0Rm9ybWF0SWZDaGFuZ2VkKGZvcm1hdCk7CisgICAgICAgIHNpemVfdCBudW1PdXRwdXRCdWZmZXJzLCBjb25zdCBzcDxBTWVzc2FnZT4mIGZvcm1hdCkgeworICAgIHJlc2V0Rm9ybWF0SWZDaGFuZ2VkKGZvcm1hdCwgbnVtT3V0cHV0QnVmZmVycyk7CiAgICAgRnJhbWVSZW5kZXJUcmFja2VyOjpJbmZvICppbmZvID0gTlVMTDsKIAogICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIgKmJ1ZjsKQEAgLTIyNiw4ICsyNjcsOSBAQAogICAgIFJlY3QgYm91bmRzKG1Dcm9wV2lkdGgsIG1Dcm9wSGVpZ2h0KTsKIAogICAgIHZvaWQgKmRzdDsKLSAgICBDSEVDS19FUSgwLCBtYXBwZXIubG9jaygKLSAgICAgICAgICAgICAgICBidWYtPmhhbmRsZSwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgYm91bmRzLCAmZHN0KSk7CisgICAgQ0hFQ0tfRVEoMCwgbWFwcGVyLmxvY2soYnVmLT5oYW5kbGUsCisgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1JFQURfTkVWRVIgfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX1JBUkVMWSwKKyAgICAgICAgICAgIGJvdW5kcywgJmRzdCkpOwogCiAgICAgLy8gVE9ETyBtb3ZlIHRoZSBvdGhlciBjb252ZXJzaW9ucyBhbHNvIGludG8gQ29sb3JDb252ZXJ0ZXIsIGFuZAogICAgIC8vIGZpeCBjcm9wcGluZyBpc3N1ZXMgKHdoZW4gbUNyb3BMZWZ0L1RvcCAhPSAwIG9yIG1XaWR0aCAhPSBtQ3JvcFdpZHRoKQpAQCAtMjc2LDYgKzMxOCw0NiBAQAogICAgICAgICAgICAgZHN0X3UgKz0gZHN0X2Nfc3RyaWRlOwogICAgICAgICAgICAgZHN0X3YgKz0gZHN0X2Nfc3RyaWRlOwogICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjE2KSB7CisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNfeSA9IChjb25zdCB1aW50MTZfdCAqKWRhdGE7CisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNfdSA9IChjb25zdCB1aW50MTZfdCAqKWRhdGEgKyBtV2lkdGggKiBtSGVpZ2h0OworICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjX3YgPSBzcmNfdSArIChtV2lkdGggLyAyICogbUhlaWdodCAvIDIpOworCisgICAgICAgIHNyY195ICs9IG1Dcm9wTGVmdCArIG1Dcm9wVG9wICogbVdpZHRoOworICAgICAgICBzcmNfdSArPSAobUNyb3BMZWZ0ICsgbUNyb3BUb3AgKiBtV2lkdGggLyAyKSAvIDI7CisgICAgICAgIHNyY192ICs9IChtQ3JvcExlZnQgKyBtQ3JvcFRvcCAqIG1XaWR0aCAvIDIpIC8gMjsKKworICAgICAgICB1aW50OF90ICpkc3RfeSA9ICh1aW50OF90ICopZHN0OworICAgICAgICBzaXplX3QgZHN0X3lfc2l6ZSA9IGJ1Zi0+c3RyaWRlICogYnVmLT5oZWlnaHQ7CisgICAgICAgIHNpemVfdCBkc3RfY19zdHJpZGUgPSBBTElHTihidWYtPnN0cmlkZSAvIDIsIDE2KTsKKyAgICAgICAgc2l6ZV90IGRzdF9jX3NpemUgPSBkc3RfY19zdHJpZGUgKiBidWYtPmhlaWdodCAvIDI7CisgICAgICAgIHVpbnQ4X3QgKmRzdF92ID0gZHN0X3kgKyBkc3RfeV9zaXplOworICAgICAgICB1aW50OF90ICpkc3RfdSA9IGRzdF92ICsgZHN0X2Nfc2l6ZTsKKworICAgICAgICBkc3RfeSArPSBtQ3JvcFRvcCAqIGJ1Zi0+c3RyaWRlICsgbUNyb3BMZWZ0OworICAgICAgICBkc3RfdiArPSAobUNyb3BUb3AgLyAyKSAqIGRzdF9jX3N0cmlkZSArIG1Dcm9wTGVmdCAvIDI7CisgICAgICAgIGRzdF91ICs9IChtQ3JvcFRvcCAvIDIpICogZHN0X2Nfc3RyaWRlICsgbUNyb3BMZWZ0IC8gMjsKKworICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IG1Dcm9wSGVpZ2h0OyArK3kpIHsKKyAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgbUNyb3BXaWR0aDsgKyt4KSB7CisgICAgICAgICAgICAgICAgZHN0X3lbeF0gPSAodWludDhfdCkoc3JjX3lbeF0gPj4gMik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNyY195ICs9IG1XaWR0aDsKKyAgICAgICAgICAgIGRzdF95ICs9IGJ1Zi0+c3RyaWRlOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCAobUNyb3BIZWlnaHQgKyAxKSAvIDI7ICsreSkgeworICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCAobUNyb3BXaWR0aCArIDEpIC8gMjsgKyt4KSB7CisgICAgICAgICAgICAgICAgZHN0X3VbeF0gPSAodWludDhfdCkoc3JjX3VbeF0gPj4gMik7CisgICAgICAgICAgICAgICAgZHN0X3ZbeF0gPSAodWludDhfdCkoc3JjX3ZbeF0gPj4gMik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNyY191ICs9IG1XaWR0aCAvIDI7CisgICAgICAgICAgICBzcmNfdiArPSBtV2lkdGggLyAyOworICAgICAgICAgICAgZHN0X3UgKz0gZHN0X2Nfc3RyaWRlOworICAgICAgICAgICAgZHN0X3YgKz0gZHN0X2Nfc3RyaWRlOworICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtQ29sb3JGb3JtYXQgPT0gT01YX1RJX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIKICAgICAgICAgICAgIHx8IG1Db2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcikgewogICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9IChjb25zdCB1aW50OF90ICopZGF0YTsKQEAgLTM2NSwxMiArNDQ3LDI5IEBACiAgICAgLy8gY29sb3IgY29udmVyc2lvbiB0byBSR0IuIEZvciBub3csIGp1c3QgbWFyayBkYXRhc3BhY2UgZm9yIFlVViByZW5kZXJpbmcuCiAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlOwogICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigiYW5kcm9pZC5fZGF0YXNwYWNlIiwgKGludDMyX3QgKikmZGF0YVNwYWNlKSAmJiBkYXRhU3BhY2UgIT0gbURhdGFTcGFjZSkgeworICAgICAgICBtRGF0YVNwYWNlID0gZGF0YVNwYWNlOworCisgICAgICAgIGlmIChtQ29udmVydGVyICE9IE5VTEwgJiYgbUNvbnZlcnRlci0+aXNEc3RSR0IoKSkgeworICAgICAgICAgICAgLy8gZ3JhcGhpY3Mgb25seSBzdXBwb3J0cyBmdWxsIHJhbmdlIFJHQi4gQ29sb3JDb252ZXJ0ZXIgc2hvdWxkIGhhdmUKKyAgICAgICAgICAgIC8vIGNvbnZlcnRlZCBhbnkgWVVWIHRvIGZ1bGwgcmFuZ2UuCisgICAgICAgICAgICBkYXRhU3BhY2UgPSAoYW5kcm9pZF9kYXRhc3BhY2UpCisgICAgICAgICAgICAgICAgICAgICgoZGF0YVNwYWNlICYgfkhBTF9EQVRBU1BBQ0VfUkFOR0VfTUFTSykgfCBIQUxfREFUQVNQQUNFX1JBTkdFX0ZVTEwpOworICAgICAgICB9CisKICAgICAgICAgQUxPR0QoInNldHRpbmcgZGF0YXNwYWNlIG9uIG91dHB1dCBzdXJmYWNlIHRvICMleCIsIGRhdGFTcGFjZSk7CiAgICAgICAgIGlmICgoZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kYXRhX3NwYWNlKG1OYXRpdmVXaW5kb3cuZ2V0KCksIGRhdGFTcGFjZSkpKSB7CiAgICAgICAgICAgICBBTE9HVygiZmFpbGVkIHRvIHNldCBkYXRhc3BhY2Ugb24gc3VyZmFjZSAoJWQpIiwgZXJyKTsKICAgICAgICAgfQotICAgICAgICBtRGF0YVNwYWNlID0gZGF0YVNwYWNlOwogICAgIH0KKyAgICBpZiAoZm9ybWF0LT5jb250YWlucygiaGRyLXN0YXRpYy1pbmZvIikpIHsKKyAgICAgICAgSERSU3RhdGljSW5mbyBpbmZvOworICAgICAgICBpZiAoQ29sb3JVdGlsczo6Z2V0SERSU3RhdGljSW5mb0Zyb21Gb3JtYXQoZm9ybWF0LCAmaW5mbykKKyAgICAgICAgICAgICYmIG1lbWNtcCgmbUhEUlN0YXRpY0luZm8sICZpbmZvLCBzaXplb2YoaW5mbykpKSB7CisgICAgICAgICAgICBzZXROYXRpdmVXaW5kb3dIZHJNZXRhZGF0YShtTmF0aXZlV2luZG93LmdldCgpLCAmaW5mbyk7CisgICAgICAgICAgICBtSERSU3RhdGljSW5mbyA9IGluZm87CisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAoKGVyciA9IG1OYXRpdmVXaW5kb3ctPnF1ZXVlQnVmZmVyKG1OYXRpdmVXaW5kb3cuZ2V0KCksIGJ1ZiwgLTEpKSAhPSAwKSB7CiAgICAgICAgIEFMT0dXKCJTdXJmYWNlOjpxdWV1ZUJ1ZmZlciByZXR1cm5lZCBlcnJvciAlZCIsIGVycik7CiAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMi54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNzgwMTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzIueG1sCkBAIC0wLDAgKzEsMTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8TWVkaWFDb2RlY3M+CisgICAgPEluY2x1ZGUgaHJlZj0ibWVkaWFfY29kZWNzX2dvb2dsZV9jMl9hdWRpby54bWwiIC8+CisgICAgPEluY2x1ZGUgaHJlZj0ibWVkaWFfY29kZWNzX2dvb2dsZV9jMl92aWRlby54bWwiIC8+Cis8L01lZGlhQ29kZWNzPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX2F1ZGlvLnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl9hdWRpby54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI1NTRhMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl9hdWRpby54bWwKQEAgLTAsMCArMSw5NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxJbmNsdWRlZD4KKyAgICA8RGVjb2RlcnM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQubXAzLmRlY29kZXIiIHR5cGU9ImF1ZGlvL21wZWciPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLDExMDI1LDEyMDAwLDE2MDAwLDIyMDUwLDI0MDAwLDMyMDAwLDQ0MTAwLDQ4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI4MDAwLTMyMDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmFtcm5iLmRlY29kZXIiIHR5cGU9ImF1ZGlvLzNncHAiPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI0NzUwLTEyMjAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYW1yd2IuZGVjb2RlciIgdHlwZT0iYXVkaW8vYW1yLXdiIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iMTYwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjY2MDAtMjM4NTAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hYWMuZGVjb2RlciIgdHlwZT0iYXVkaW8vbXA0YS1sYXRtIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iNzM1MCw4MDAwLDExMDI1LDEyMDAwLDE2MDAwLDIyMDUwLDI0MDAwLDMyMDAwLDQ0MTAwLDQ4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI4MDAwLTk2MDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmc3MTEuYWxhdy5kZWNvZGVyIiB0eXBlPSJhdWRpby9nNzExLWFsYXciPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLTQ4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI2NDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmc3MTEubWxhdy5kZWNvZGVyIiB0eXBlPSJhdWRpby9nNzExLW1sYXciPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLTQ4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI2NDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLnZvcmJpcy5kZWNvZGVyIiB0eXBlPSJhdWRpby92b3JiaXMiPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iOCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLTk2MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIzMjAwMC01MDAwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5vcHVzLmRlY29kZXIiIHR5cGU9ImF1ZGlvL29wdXMiPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iOCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI0ODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNjAwMC01MTAwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5yYXcuZGVjb2RlciIgdHlwZT0iYXVkaW8vcmF3Ij4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMC05NjAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMDAwMDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmZsYWMuZGVjb2RlciIgdHlwZT0iYXVkaW8vZmxhYyI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjEtNjU1MzUwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTIxMDAwMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgPC9EZWNvZGVycz4KKyAgICA8RW5jb2RlcnM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYWFjLmVuY29kZXIiIHR5cGU9ImF1ZGlvL21wNGEtbGF0bSI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAsMTEwMjUsMTIwMDAsMTYwMDAsMjIwNTAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiIC8+CisgICAgICAgICAgICA8IS0tIGFsc28gbWF5IHN1cHBvcnQgNjQwMDAsIDg4MjAwICBhbmQgOTYwMDAgSHogLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjgwMDAtOTYwMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYW1ybmIuZW5jb2RlciIgdHlwZT0iYXVkaW8vM2dwcCI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjQ3NTAtMTIyMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iQ0JSIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYW1yd2IuZW5jb2RlciIgdHlwZT0iYXVkaW8vYW1yLXdiIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iMTYwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjY2MDAtMjM4NTAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iQ0JSIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuZmxhYy5lbmNvZGVyIiB0eXBlPSJhdWRpby9mbGFjIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iMS02NTUzNTAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMjEwMDAwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY29tcGxleGl0eSIgcmFuZ2U9IjAtOCIgIGRlZmF1bHQ9IjUiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iQ1EiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICA8L0VuY29kZXJzPgorPC9JbmNsdWRlZD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl92aWRlby54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfdmlkZW8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYjQ1YjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfdmlkZW8ueG1sCkBAIC0wLDAgKzEsMTIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEluY2x1ZGVkPgorICAgIDxEZWNvZGVycz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5tcGVnNC5kZWNvZGVyIiB0eXBlPSJ2aWRlby9tcDR2LWVzIj4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVTaW1wbGUgOiBMZXZlbDMgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMzUyeDI4OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMTItMTE4ODAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMzg0MDAwIiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5oMjYzLmRlY29kZXIiIHR5cGU9InZpZGVvLzNncHAiPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUJhc2VsaW5lIDogTGV2ZWwzMCwgUHJvZmlsZUJhc2VsaW5lIDogTGV2ZWw0NQorICAgICAgICAgICAgICAgICAgICBQcm9maWxlSVNXVjIgOiBMZXZlbDMwLCBQcm9maWxlSVNXVjIgOiBMZXZlbDQ1IC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjM1MngyODgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTM4NDAwMCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiIHR5cGU9InZpZGVvL2F2YyI+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlSGlnaCA6IExldmVsNTIgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iNDA4MHg0MDgwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTMyNzY4IiAvPiA8IS0tIG1heCA0MDk2eDIwNDggZXF1aXZhbGVudCAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMTk2NjA4MCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00ODAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuaGV2Yy5kZWNvZGVyIiB0eXBlPSJ2aWRlby9oZXZjIj4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTWFpblRpZXJMZXZlbDUxIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjQwOTZ4NDA5NiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9Ijh4OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMTk2NjA4IiAvPiA8IS0tIG1heCA0MDk2eDMwNzIgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTIwMDAwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTAwMDAwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLnZwOC5kZWNvZGVyIiB0eXBlPSJ2aWRlby94LXZuZC5vbjIudnA4Ij4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMTYzODQiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTEwMDAwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNDAwMDAwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLnZwOS5kZWNvZGVyIiB0eXBlPSJ2aWRlby94LXZuZC5vbjIudnA5Ij4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMTYzODQiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTUwMDAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00MDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgPC9EZWNvZGVycz4KKworICAgIDxFbmNvZGVycz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5oMjYzLmVuY29kZXIiIHR5cGU9InZpZGVvLzNncHAiPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUJhc2VsaW5lIDogTGV2ZWw0NSAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE3NngxNDQiIG1heD0iMTc2eDE0NCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMjgwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hdmMuZW5jb2RlciIgdHlwZT0idmlkZW8vYXZjIj4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVCYXNlbGluZSA6IExldmVsNDEgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIxNngxNiIgbWF4PSIyMDQ4eDIwNDgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtODE5MiIgLz4gPCEtLSBtYXggMjA0OHgxMDI0IC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0yNDU3NjAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTIwMDAwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJpbnRyYS1yZWZyZXNoIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQubXBlZzQuZW5jb2RlciIgdHlwZT0idmlkZW8vbXA0di1lcyI+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQ29yZSA6IExldmVsMiAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE2eDE2IiBtYXg9IjE3NngxNDQiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMTItMTQ4NSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS02NDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLnZwOC5lbmNvZGVyIiB0eXBlPSJ2aWRlby94LXZuZC5vbjIudnA4Ij4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTGV2ZWxfVmVyc2lvbjAtMyAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDwhLS0gMjAxNiBkZXZpY2VzIGNhbiBlbmNvZGUgYXQgYWJvdXQgMTBmcHMgYXQgdGhpcyBibG9jayBjb3VudCAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMTYzODQiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNDAwMDAwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iVkJSLENCUiIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLnZwOS5lbmNvZGVyIiB0eXBlPSJ2aWRlby94LXZuZC5vbjIudnA5Ij4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTGV2ZWxfVmVyc2lvbjAtMyAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDwhLS0gMjAxNiBkZXZpY2VzIGNhbiBlbmNvZGUgYXQgYWJvdXQgOGZwcyBhdCB0aGlzIGJsb2NrIGNvdW50IC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS0zNjAwIiAvPiA8IS0tIG1heCAxMjgweDcyMCAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00MDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImJpdHJhdGUtbW9kZXMiIHZhbHVlPSJWQlIsQ0JSIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgPC9FbmNvZGVycz4KKzwvSW5jbHVkZWQ+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9leHBvcnRzLmxkcyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZGZjNDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9leHBvcnRzLmxkcwpAQCAtMCwwICsxLDUwOCBAQAoreworICAgIGdsb2JhbDoKKyAgICAgICAgKjsKKyAgICBsb2NhbDoKKyAgICAgICAgX1pON2FuZHJvaWQ0RVNEUyo7CisgICAgICAgIF9aTks3YW5kcm9pZDRFU0RTKjsKKyAgICAgICAgX1pON2FuZHJvaWQxNENvbG9yQ29udmVydGVyKjsKKyAgICAgICAgX1pOSzdhbmRyb2lkMTRDb2xvckNvbnZlcnRlcio7CisgICAgICAgIF9aTjdhbmRyb2lkMTZTb2Z0d2FyZVJlbmRlcmVyKjsKKyAgICAgICAgQUJHUlRvQVJHQjsKKyAgICAgICAgQUJHUlRvSTQyMDsKKyAgICAgICAgQUJHUlRvVVZSb3dfQW55X05FT047CisgICAgICAgIEFCR1JUb1VWUm93X0M7CisgICAgICAgIEFCR1JUb1VWUm93X05FT047CisgICAgICAgIEFCR1JUb1lSb3dfQW55X05FT047CisgICAgICAgIEFCR1JUb1lSb3dfQzsKKyAgICAgICAgQUJHUlRvWVJvd19ORU9OOworICAgICAgICBBbmRyb2lkNDIwVG9JNDIwOworICAgICAgICBBUkdCMTU1NVRvQVJHQjsKKyAgICAgICAgQVJHQjE1NTVUb0FSR0JSb3dfQW55X05FT047CisgICAgICAgIEFSR0IxNTU1VG9BUkdCUm93X0M7CisgICAgICAgIEFSR0IxNTU1VG9BUkdCUm93X05FT047CisgICAgICAgIEFSR0IxNTU1VG9JNDIwOworICAgICAgICBBUkdCMTU1NVRvVVZSb3dfQW55X05FT047CisgICAgICAgIEFSR0IxNTU1VG9VVlJvd19DOworICAgICAgICBBUkdCMTU1NVRvVVZSb3dfTkVPTjsKKyAgICAgICAgQVJHQjE1NTVUb1lSb3dfQW55X05FT047CisgICAgICAgIEFSR0IxNTU1VG9ZUm93X0M7CisgICAgICAgIEFSR0IxNTU1VG9ZUm93X05FT047CisgICAgICAgIEFSR0I0NDQ0VG9BUkdCOworICAgICAgICBBUkdCNDQ0NFRvQVJHQlJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQjQ0NDRUb0FSR0JSb3dfQzsKKyAgICAgICAgQVJHQjQ0NDRUb0FSR0JSb3dfTkVPTjsKKyAgICAgICAgQVJHQjQ0NDRUb0k0MjA7CisgICAgICAgIEFSR0I0NDQ0VG9VVlJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQjQ0NDRUb1VWUm93X0M7CisgICAgICAgIEFSR0I0NDQ0VG9VVlJvd19ORU9OOworICAgICAgICBBUkdCNDQ0NFRvWVJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQjQ0NDRUb1lSb3dfQzsKKyAgICAgICAgQVJHQjQ0NDRUb1lSb3dfTkVPTjsKKyAgICAgICAgQVJHQkFkZDsKKyAgICAgICAgQVJHQkFkZFJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQkFkZFJvd19DOworICAgICAgICBBUkdCQWRkUm93X05FT047CisgICAgICAgIEFSR0JBZmZpbmVSb3dfQzsKKyAgICAgICAgQVJHQkF0dGVudWF0ZTsKKyAgICAgICAgQVJHQkF0dGVudWF0ZVJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQkF0dGVudWF0ZVJvd19DOworICAgICAgICBBUkdCQXR0ZW51YXRlUm93X05FT047CisgICAgICAgIEFSR0JCbGVuZDsKKyAgICAgICAgQVJHQkJsZW5kUm93X0M7CisgICAgICAgIEFSR0JCbGVuZFJvd19ORU9OOworICAgICAgICBBUkdCQmx1cjsKKyAgICAgICAgQVJHQkNvbG9yTWF0cml4OworICAgICAgICBBUkdCQ29sb3JNYXRyaXhSb3dfQzsKKyAgICAgICAgQVJHQkNvbG9yTWF0cml4Um93X05FT047CisgICAgICAgIEFSR0JDb2xvclRhYmxlOworICAgICAgICBBUkdCQ29sb3JUYWJsZVJvd19DOworICAgICAgICBBUkdCQ29tcHV0ZUN1bXVsYXRpdmVTdW07CisgICAgICAgIEFSR0JDb3B5OworICAgICAgICBBUkdCQ29weUFscGhhOworICAgICAgICBBUkdCQ29weUFscGhhUm93X0M7CisgICAgICAgIEFSR0JDb3B5WVRvQWxwaGE7CisgICAgICAgIEFSR0JDb3B5WVRvQWxwaGFSb3dfQzsKKyAgICAgICAgQVJHQkV4dHJhY3RBbHBoYTsKKyAgICAgICAgQVJHQkV4dHJhY3RBbHBoYVJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQkV4dHJhY3RBbHBoYVJvd19DOworICAgICAgICBBUkdCRXh0cmFjdEFscGhhUm93X05FT047CisgICAgICAgIEFSR0JHcmF5OworICAgICAgICBBUkdCR3JheVJvd19DOworICAgICAgICBBUkdCR3JheVJvd19ORU9OOworICAgICAgICBBUkdCR3JheVRvOworICAgICAgICBBUkdCSW50ZXJwb2xhdGU7CisgICAgICAgIEFSR0JMdW1hQ29sb3JUYWJsZTsKKyAgICAgICAgQVJHQkx1bWFDb2xvclRhYmxlUm93X0M7CisgICAgICAgIEFSR0JNaXJyb3I7CisgICAgICAgIEFSR0JNaXJyb3JSb3dfQW55X05FT047CisgICAgICAgIEFSR0JNaXJyb3JSb3dfQzsKKyAgICAgICAgQVJHQk1pcnJvclJvd19ORU9OOworICAgICAgICBBUkdCTXVsdGlwbHk7CisgICAgICAgIEFSR0JNdWx0aXBseVJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQk11bHRpcGx5Um93X0M7CisgICAgICAgIEFSR0JNdWx0aXBseVJvd19ORU9OOworICAgICAgICBBUkdCUG9seW5vbWlhbDsKKyAgICAgICAgQVJHQlBvbHlub21pYWxSb3dfQzsKKyAgICAgICAgQVJHQlF1YW50aXplOworICAgICAgICBBUkdCUXVhbnRpemVSb3dfQzsKKyAgICAgICAgQVJHQlF1YW50aXplUm93X05FT047CisgICAgICAgIEFSR0JSZWN0OworICAgICAgICBBUkdCU2VwaWE7CisgICAgICAgIEFSR0JTZXBpYVJvd19DOworICAgICAgICBBUkdCU2VwaWFSb3dfTkVPTjsKKyAgICAgICAgQVJHQlNldFJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQlNldFJvd19DOworICAgICAgICBBUkdCU2V0Um93X05FT047CisgICAgICAgIEFSR0JTaGFkZTsKKyAgICAgICAgQVJHQlNoYWRlUm93X0M7CisgICAgICAgIEFSR0JTaGFkZVJvd19ORU9OOworICAgICAgICBBUkdCU2h1ZmZsZTsKKyAgICAgICAgQVJHQlNodWZmbGVSb3dfQW55X05FT047CisgICAgICAgIEFSR0JTaHVmZmxlUm93X0M7CisgICAgICAgIEFSR0JTaHVmZmxlUm93X05FT047CisgICAgICAgIEFSR0JTb2JlbDsKKyAgICAgICAgQVJHQlNvYmVsVG9QbGFuZTsKKyAgICAgICAgQVJHQlNvYmVsWFk7CisgICAgICAgIEFSR0JTdWJ0cmFjdDsKKyAgICAgICAgQVJHQlN1YnRyYWN0Um93X0FueV9ORU9OOworICAgICAgICBBUkdCU3VidHJhY3RSb3dfQzsKKyAgICAgICAgQVJHQlN1YnRyYWN0Um93X05FT047CisgICAgICAgIEFSR0JUb0FCR1I7CisgICAgICAgIEFSR0JUb0FSR0IxNTU1Um93X0FueV9ORU9OOworICAgICAgICBBUkdCVG9BUkdCMTU1NVJvd19DOworICAgICAgICBBUkdCVG9BUkdCMTU1NVJvd19ORU9OOworICAgICAgICBBUkdCVG9BUkdCNDQ0NFJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQlRvQVJHQjQ0NDRSb3dfQzsKKyAgICAgICAgQVJHQlRvQVJHQjQ0NDRSb3dfTkVPTjsKKyAgICAgICAgQVJHQlRvQkdSQTsKKyAgICAgICAgQVJHQlRvSTQyMDsKKyAgICAgICAgQVJHQlRvUkFXUm93X0FueV9ORU9OOworICAgICAgICBBUkdCVG9SQVdSb3dfQzsKKyAgICAgICAgQVJHQlRvUkFXUm93X05FT047CisgICAgICAgIEFSR0JUb1JHQjI0Um93X0FueV9ORU9OOworICAgICAgICBBUkdCVG9SR0IyNFJvd19DOworICAgICAgICBBUkdCVG9SR0IyNFJvd19ORU9OOworICAgICAgICBBUkdCVG9SR0I1NjVEaXRoZXJSb3dfQW55X05FT047CisgICAgICAgIEFSR0JUb1JHQjU2NURpdGhlclJvd19DOworICAgICAgICBBUkdCVG9SR0I1NjVEaXRoZXJSb3dfTkVPTjsKKyAgICAgICAgQVJHQlRvUkdCNTY1Um93X0FueV9ORU9OOworICAgICAgICBBUkdCVG9SR0I1NjVSb3dfQzsKKyAgICAgICAgQVJHQlRvUkdCNTY1Um93X05FT047CisgICAgICAgIEFSR0JUb1VWNDQ0Um93X0FueV9ORU9OOworICAgICAgICBBUkdCVG9VVjQ0NFJvd19DOworICAgICAgICBBUkdCVG9VVjQ0NFJvd19ORU9OOworICAgICAgICBBUkdCVG9VVkpSb3dfQW55X05FT047CisgICAgICAgIEFSR0JUb1VWSlJvd19DOworICAgICAgICBBUkdCVG9VVkpSb3dfTkVPTjsKKyAgICAgICAgQVJHQlRvVVZSb3dfQW55X05FT047CisgICAgICAgIEFSR0JUb1VWUm93X0M7CisgICAgICAgIEFSR0JUb1VWUm93X05FT047CisgICAgICAgIEFSR0JUb1lKUm93X0FueV9ORU9OOworICAgICAgICBBUkdCVG9ZSlJvd19DOworICAgICAgICBBUkdCVG9ZSlJvd19ORU9OOworICAgICAgICBBUkdCVG9ZUm93X0FueV9ORU9OOworICAgICAgICBBUkdCVG9ZUm93X0M7CisgICAgICAgIEFSR0JUb1lSb3dfTkVPTjsKKyAgICAgICAgQVJHQlVuYXR0ZW51YXRlOworICAgICAgICBBUkdCVW5hdHRlbnVhdGVSb3dfQzsKKyAgICAgICAgQXJtQ3B1Q2FwczsKKyAgICAgICAgQkdSQVRvQVJHQjsKKyAgICAgICAgQkdSQVRvSTQyMDsKKyAgICAgICAgQkdSQVRvVVZSb3dfQW55X05FT047CisgICAgICAgIEJHUkFUb1VWUm93X0M7CisgICAgICAgIEJHUkFUb1VWUm93X05FT047CisgICAgICAgIEJHUkFUb1lSb3dfQW55X05FT047CisgICAgICAgIEJHUkFUb1lSb3dfQzsKKyAgICAgICAgQkdSQVRvWVJvd19ORU9OOworICAgICAgICBCbGVuZFBsYW5lOworICAgICAgICBCbGVuZFBsYW5lUm93X0M7CisgICAgICAgIENhbm9uaWNhbEZvdXJDQzsKKyAgICAgICAgQ29tcHV0ZUN1bXVsYXRpdmVTdW1Sb3dfQzsKKyAgICAgICAgQ29udmVydEZyb21JNDIwOworICAgICAgICBDb3B5UGxhbmU7CisgICAgICAgIENvcHlQbGFuZV8xNjsKKyAgICAgICAgQ29weVJvd18xNl9DOworICAgICAgICBDb3B5Um93X0FueV9ORU9OOworICAgICAgICBDb3B5Um93X0M7CisgICAgICAgIENvcHlSb3dfTkVPTjsKKyAgICAgICAgQ3B1SWQ7CisgICAgICAgIGNwdV9pbmZvXzsKKyAgICAgICAgQ3VtdWxhdGl2ZVN1bVRvQXZlcmFnZVJvd19DOworICAgICAgICBGaXhlZERpdjFfQzsKKyAgICAgICAgRml4ZWREaXZfQzsKKyAgICAgICAgZml4ZWRfaW52dGJsODsKKyAgICAgICAgR2V0QVJHQkJsZW5kOworICAgICAgICBINDIwVG9BQkdSOworICAgICAgICBINDIwVG9BUkdCOworICAgICAgICBINDIyVG9BQkdSOworICAgICAgICBINDIyVG9BUkdCOworICAgICAgICBIYWxmRmxvYXQxUm93X0FueV9ORU9OOworICAgICAgICBIYWxmRmxvYXQxUm93X05FT047CisgICAgICAgIEhhbGZGbG9hdFBsYW5lOworICAgICAgICBIYWxmRmxvYXRSb3dfQW55X05FT047CisgICAgICAgIEhhbGZGbG9hdFJvd19DOworICAgICAgICBIYWxmRmxvYXRSb3dfTkVPTjsKKyAgICAgICAgSTQwMENvcHk7CisgICAgICAgIEk0MDBNaXJyb3I7CisgICAgICAgIEk0MDBUb0FSR0I7CisgICAgICAgIEk0MDBUb0FSR0JSb3dfQW55X05FT047CisgICAgICAgIEk0MDBUb0FSR0JSb3dfQzsKKyAgICAgICAgSTQwMFRvQVJHQlJvd19ORU9OOworICAgICAgICBJNDAwVG9JNDAwOworICAgICAgICBJNDAwVG9JNDIwOworICAgICAgICBJNDIwQWxwaGFUb0FCR1I7CisgICAgICAgIEk0MjBBbHBoYVRvQVJHQjsKKyAgICAgICAgSTQyMEJsZW5kOworICAgICAgICBJNDIwQ29weTsKKyAgICAgICAgSTQyMEludGVycG9sYXRlOworICAgICAgICBJNDIwTWlycm9yOworICAgICAgICBJNDIwUmVjdDsKKyAgICAgICAgSTQyMFNjYWxlOworICAgICAgICBJNDIwU2NhbGVfMTY7CisgICAgICAgIEk0MjBUb0FCR1I7CisgICAgICAgIEk0MjBUb0FSR0I7CisgICAgICAgIEk0MjBUb0FSR0IxNTU1OworICAgICAgICBJNDIwVG9BUkdCNDQ0NDsKKyAgICAgICAgSTQyMFRvQkdSQTsKKyAgICAgICAgSTQyMFRvSTQwMDsKKyAgICAgICAgSTQyMFRvSTQyMjsKKyAgICAgICAgSTQyMFRvSTQ0NDsKKyAgICAgICAgSTQyMFRvTlYxMjsKKyAgICAgICAgSTQyMFRvTlYyMTsKKyAgICAgICAgSTQyMFRvUkFXOworICAgICAgICBJNDIwVG9SR0IyNDsKKyAgICAgICAgSTQyMFRvUkdCNTY1OworICAgICAgICBJNDIwVG9SR0I1NjVEaXRoZXI7CisgICAgICAgIEk0MjBUb1JHQkE7CisgICAgICAgIEk0MjBUb1VZVlk7CisgICAgICAgIEk0MjBUb1lVWTI7CisgICAgICAgIEk0MjJBbHBoYVRvQVJHQlJvd19BbnlfTkVPTjsKKyAgICAgICAgSTQyMkFscGhhVG9BUkdCUm93X0M7CisgICAgICAgIEk0MjJBbHBoYVRvQVJHQlJvd19ORU9OOworICAgICAgICBJNDIyQ29weTsKKyAgICAgICAgSTQyMlRvQUJHUjsKKyAgICAgICAgSTQyMlRvQVJHQjsKKyAgICAgICAgSTQyMlRvQVJHQjE1NTVSb3dfQW55X05FT047CisgICAgICAgIEk0MjJUb0FSR0IxNTU1Um93X0M7CisgICAgICAgIEk0MjJUb0FSR0IxNTU1Um93X05FT047CisgICAgICAgIEk0MjJUb0FSR0I0NDQ0Um93X0FueV9ORU9OOworICAgICAgICBJNDIyVG9BUkdCNDQ0NFJvd19DOworICAgICAgICBJNDIyVG9BUkdCNDQ0NFJvd19ORU9OOworICAgICAgICBJNDIyVG9BUkdCUm93X0FueV9ORU9OOworICAgICAgICBJNDIyVG9BUkdCUm93X0M7CisgICAgICAgIEk0MjJUb0FSR0JSb3dfTkVPTjsKKyAgICAgICAgSTQyMlRvQkdSQTsKKyAgICAgICAgSTQyMlRvSTQyMDsKKyAgICAgICAgSTQyMlRvUkdCMjRSb3dfQW55X05FT047CisgICAgICAgIEk0MjJUb1JHQjI0Um93X0M7CisgICAgICAgIEk0MjJUb1JHQjI0Um93X05FT047CisgICAgICAgIEk0MjJUb1JHQjU2NTsKKyAgICAgICAgSTQyMlRvUkdCNTY1Um93X0FueV9ORU9OOworICAgICAgICBJNDIyVG9SR0I1NjVSb3dfQzsKKyAgICAgICAgSTQyMlRvUkdCNTY1Um93X05FT047CisgICAgICAgIEk0MjJUb1JHQkE7CisgICAgICAgIEk0MjJUb1JHQkFSb3dfQW55X05FT047CisgICAgICAgIEk0MjJUb1JHQkFSb3dfQzsKKyAgICAgICAgSTQyMlRvUkdCQVJvd19ORU9OOworICAgICAgICBJNDIyVG9VWVZZOworICAgICAgICBJNDIyVG9VWVZZUm93X0FueV9ORU9OOworICAgICAgICBJNDIyVG9VWVZZUm93X0M7CisgICAgICAgIEk0MjJUb1VZVllSb3dfTkVPTjsKKyAgICAgICAgSTQyMlRvWVVZMjsKKyAgICAgICAgSTQyMlRvWVVZMlJvd19BbnlfTkVPTjsKKyAgICAgICAgSTQyMlRvWVVZMlJvd19DOworICAgICAgICBJNDIyVG9ZVVkyUm93X05FT047CisgICAgICAgIEk0NDRDb3B5OworICAgICAgICBJNDQ0VG9BQkdSOworICAgICAgICBJNDQ0VG9BUkdCOworICAgICAgICBJNDQ0VG9BUkdCUm93X0FueV9ORU9OOworICAgICAgICBJNDQ0VG9BUkdCUm93X0M7CisgICAgICAgIEk0NDRUb0FSR0JSb3dfTkVPTjsKKyAgICAgICAgSTQ0NFRvSTQyMDsKKyAgICAgICAgSW5pdENwdUZsYWdzOworICAgICAgICBJbnRlcnBvbGF0ZVBsYW5lOworICAgICAgICBJbnRlcnBvbGF0ZVJvd18xNl9DOworICAgICAgICBJbnRlcnBvbGF0ZVJvd19BbnlfTkVPTjsKKyAgICAgICAgSW50ZXJwb2xhdGVSb3dfQzsKKyAgICAgICAgSW50ZXJwb2xhdGVSb3dfTkVPTjsKKyAgICAgICAgSjQwMFRvQVJHQjsKKyAgICAgICAgSjQwMFRvQVJHQlJvd19BbnlfTkVPTjsKKyAgICAgICAgSjQwMFRvQVJHQlJvd19DOworICAgICAgICBKNDAwVG9BUkdCUm93X05FT047CisgICAgICAgIEo0MjBUb0FCR1I7CisgICAgICAgIEo0MjBUb0FSR0I7CisgICAgICAgIEo0MjJUb0FCR1I7CisgICAgICAgIEo0MjJUb0FSR0I7CisgICAgICAgIEo0NDRUb0FSR0I7CisgICAgICAgIGtZdXZINzA5Q29uc3RhbnRzOworICAgICAgICBrWXV2STYwMUNvbnN0YW50czsKKyAgICAgICAga1l1dkpQRUdDb25zdGFudHM7CisgICAgICAgIGtZdnVINzA5Q29uc3RhbnRzOworICAgICAgICBrWXZ1STYwMUNvbnN0YW50czsKKyAgICAgICAga1l2dUpQRUdDb25zdGFudHM7CisgICAgICAgIE00MjBUb0FSR0I7CisgICAgICAgIE00MjBUb0k0MjA7CisgICAgICAgIE1hc2tDcHVGbGFnczsKKyAgICAgICAgTWVyZ2VVVlBsYW5lOworICAgICAgICBNZXJnZVVWUm93X0FueV9ORU9OOworICAgICAgICBNZXJnZVVWUm93X0M7CisgICAgICAgIE1lcmdlVVZSb3dfTkVPTjsKKyAgICAgICAgTWlwc0NwdUNhcHM7CisgICAgICAgIE1pcnJvclBsYW5lOworICAgICAgICBNaXJyb3JSb3dfQW55X05FT047CisgICAgICAgIE1pcnJvclJvd19DOworICAgICAgICBNaXJyb3JSb3dfTkVPTjsKKyAgICAgICAgTWlycm9yVVZSb3dfQzsKKyAgICAgICAgTWlycm9yVVZSb3dfTkVPTjsKKyAgICAgICAgTlYxMlRvQVJHQlJvd19BbnlfTkVPTjsKKyAgICAgICAgTlYxMlRvQVJHQlJvd19DOworICAgICAgICBOVjEyVG9BUkdCUm93X05FT047CisgICAgICAgIE5WMTJUb0k0MjA7CisgICAgICAgIE5WMTJUb1JHQjU2NTsKKyAgICAgICAgTlYxMlRvUkdCNTY1Um93X0FueV9ORU9OOworICAgICAgICBOVjEyVG9SR0I1NjVSb3dfQzsKKyAgICAgICAgTlYxMlRvUkdCNTY1Um93X05FT047CisgICAgICAgIE5WMjFUb0FSR0I7CisgICAgICAgIE5WMjFUb0FSR0JSb3dfQW55X05FT047CisgICAgICAgIE5WMjFUb0FSR0JSb3dfQzsKKyAgICAgICAgTlYyMVRvQVJHQlJvd19ORU9OOworICAgICAgICBOVjIxVG9JNDIwOworICAgICAgICBSQVdUb0FSR0I7CisgICAgICAgIFJBV1RvQVJHQlJvd19BbnlfTkVPTjsKKyAgICAgICAgUkFXVG9BUkdCUm93X0M7CisgICAgICAgIFJBV1RvQVJHQlJvd19ORU9OOworICAgICAgICBSQVdUb0k0MjA7CisgICAgICAgIFJBV1RvUkdCMjQ7CisgICAgICAgIFJBV1RvUkdCMjRSb3dfQW55X05FT047CisgICAgICAgIFJBV1RvUkdCMjRSb3dfQzsKKyAgICAgICAgUkFXVG9SR0IyNFJvd19ORU9OOworICAgICAgICBSQVdUb1VWUm93X0FueV9ORU9OOworICAgICAgICBSQVdUb1VWUm93X0M7CisgICAgICAgIFJBV1RvVVZSb3dfTkVPTjsKKyAgICAgICAgUkFXVG9ZUm93X0FueV9ORU9OOworICAgICAgICBSQVdUb1lSb3dfQzsKKyAgICAgICAgUkFXVG9ZUm93X05FT047CisgICAgICAgIFJHQjI0VG9BUkdCOworICAgICAgICBSR0IyNFRvQVJHQlJvd19BbnlfTkVPTjsKKyAgICAgICAgUkdCMjRUb0FSR0JSb3dfQzsKKyAgICAgICAgUkdCMjRUb0FSR0JSb3dfTkVPTjsKKyAgICAgICAgUkdCMjRUb0k0MjA7CisgICAgICAgIFJHQjI0VG9VVlJvd19BbnlfTkVPTjsKKyAgICAgICAgUkdCMjRUb1VWUm93X0M7CisgICAgICAgIFJHQjI0VG9VVlJvd19ORU9OOworICAgICAgICBSR0IyNFRvWVJvd19BbnlfTkVPTjsKKyAgICAgICAgUkdCMjRUb1lSb3dfQzsKKyAgICAgICAgUkdCMjRUb1lSb3dfTkVPTjsKKyAgICAgICAgUkdCNTY1VG9BUkdCOworICAgICAgICBSR0I1NjVUb0FSR0JSb3dfQW55X05FT047CisgICAgICAgIFJHQjU2NVRvQVJHQlJvd19DOworICAgICAgICBSR0I1NjVUb0FSR0JSb3dfTkVPTjsKKyAgICAgICAgUkdCNTY1VG9JNDIwOworICAgICAgICBSR0I1NjVUb1VWUm93X0FueV9ORU9OOworICAgICAgICBSR0I1NjVUb1VWUm93X0M7CisgICAgICAgIFJHQjU2NVRvVVZSb3dfTkVPTjsKKyAgICAgICAgUkdCNTY1VG9ZUm93X0FueV9ORU9OOworICAgICAgICBSR0I1NjVUb1lSb3dfQzsKKyAgICAgICAgUkdCNTY1VG9ZUm93X05FT047CisgICAgICAgIFJHQkFUb0FSR0I7CisgICAgICAgIFJHQkFUb0k0MjA7CisgICAgICAgIFJHQkFUb1VWUm93X0FueV9ORU9OOworICAgICAgICBSR0JBVG9VVlJvd19DOworICAgICAgICBSR0JBVG9VVlJvd19ORU9OOworICAgICAgICBSR0JBVG9ZUm93X0FueV9ORU9OOworICAgICAgICBSR0JBVG9ZUm93X0M7CisgICAgICAgIFJHQkFUb1lSb3dfTkVPTjsKKyAgICAgICAgUkdCQ29sb3JNYXRyaXg7CisgICAgICAgIFJHQkNvbG9yVGFibGU7CisgICAgICAgIFJHQkNvbG9yVGFibGVSb3dfQzsKKyAgICAgICAgU2NhbGU7CisgICAgICAgIFNjYWxlQWRkUm93XzE2X0M7CisgICAgICAgIFNjYWxlQWRkUm93X0M7CisgICAgICAgIFNjYWxlQWRkUm93c19ORU9OOworICAgICAgICBTY2FsZUFSR0JDb2xzNjRfQzsKKyAgICAgICAgU2NhbGVBUkdCQ29sc19BbnlfTkVPTjsKKyAgICAgICAgU2NhbGVBUkdCQ29sc19DOworICAgICAgICBTY2FsZUFSR0JDb2xzX05FT047CisgICAgICAgIFNjYWxlQVJHQkNvbHNVcDJfQzsKKyAgICAgICAgU2NhbGVBUkdCRmlsdGVyQ29sczY0X0M7CisgICAgICAgIFNjYWxlQVJHQkZpbHRlckNvbHNfQW55X05FT047CisgICAgICAgIFNjYWxlQVJHQkZpbHRlckNvbHNfQzsKKyAgICAgICAgU2NhbGVBUkdCRmlsdGVyQ29sc19ORU9OOworICAgICAgICBTY2FsZUFSR0JSb3dEb3duMl9BbnlfTkVPTjsKKyAgICAgICAgU2NhbGVBUkdCUm93RG93bjJCb3hfQW55X05FT047CisgICAgICAgIFNjYWxlQVJHQlJvd0Rvd24yQm94X0M7CisgICAgICAgIFNjYWxlQVJHQlJvd0Rvd24yQm94X05FT047CisgICAgICAgIFNjYWxlQVJHQlJvd0Rvd24yX0M7CisgICAgICAgIFNjYWxlQVJHQlJvd0Rvd24yTGluZWFyX0FueV9ORU9OOworICAgICAgICBTY2FsZUFSR0JSb3dEb3duMkxpbmVhcl9DOworICAgICAgICBTY2FsZUFSR0JSb3dEb3duMkxpbmVhcl9ORU9OOworICAgICAgICBTY2FsZUFSR0JSb3dEb3duMl9ORU9OOworICAgICAgICBTY2FsZUFSR0JSb3dEb3duRXZlbl9BbnlfTkVPTjsKKyAgICAgICAgU2NhbGVBUkdCUm93RG93bkV2ZW5Cb3hfQW55X05FT047CisgICAgICAgIFNjYWxlQVJHQlJvd0Rvd25FdmVuQm94X0M7CisgICAgICAgIFNjYWxlQVJHQlJvd0Rvd25FdmVuQm94X05FT047CisgICAgICAgIFNjYWxlQVJHQlJvd0Rvd25FdmVuX0M7CisgICAgICAgIFNjYWxlQVJHQlJvd0Rvd25FdmVuX05FT047CisgICAgICAgIFNjYWxlQ29sc18xNl9DOworICAgICAgICBTY2FsZUNvbHNfQzsKKyAgICAgICAgU2NhbGVDb2xzVXAyXzE2X0M7CisgICAgICAgIFNjYWxlQ29sc1VwMl9DOworICAgICAgICBTY2FsZUZpbHRlckNvbHNfMTZfQzsKKyAgICAgICAgU2NhbGVGaWx0ZXJDb2xzNjRfMTZfQzsKKyAgICAgICAgU2NhbGVGaWx0ZXJDb2xzNjRfQzsKKyAgICAgICAgU2NhbGVGaWx0ZXJDb2xzX0FueV9ORU9OOworICAgICAgICBTY2FsZUZpbHRlckNvbHNfQzsKKyAgICAgICAgU2NhbGVGaWx0ZXJDb2xzX05FT047CisgICAgICAgIFNjYWxlRmlsdGVyUmVkdWNlOworICAgICAgICBTY2FsZUZpbHRlclJvd3NfTkVPTjsKKyAgICAgICAgU2NhbGVPZmZzZXQ7CisgICAgICAgIFNjYWxlUGxhbmU7CisgICAgICAgIFNjYWxlUGxhbmVfMTY7CisgICAgICAgIFNjYWxlUGxhbmVCaWxpbmVhckRvd247CisgICAgICAgIFNjYWxlUGxhbmVCaWxpbmVhckRvd25fMTY7CisgICAgICAgIFNjYWxlUGxhbmVCaWxpbmVhclVwOworICAgICAgICBTY2FsZVBsYW5lQmlsaW5lYXJVcF8xNjsKKyAgICAgICAgU2NhbGVQbGFuZVZlcnRpY2FsOworICAgICAgICBTY2FsZVBsYW5lVmVydGljYWxfMTY7CisgICAgICAgIFNjYWxlUm93RG93bjJfMTZfQzsKKyAgICAgICAgU2NhbGVSb3dEb3duMl9BbnlfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duMkJveF8xNl9DOworICAgICAgICBTY2FsZVJvd0Rvd24yQm94X0FueV9ORU9OOworICAgICAgICBTY2FsZVJvd0Rvd24yQm94X0M7CisgICAgICAgIFNjYWxlUm93RG93bjJCb3hfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duMkJveF9PZGRfQzsKKyAgICAgICAgU2NhbGVSb3dEb3duMkJveF9PZGRfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duMl9DOworICAgICAgICBTY2FsZVJvd0Rvd24yTGluZWFyXzE2X0M7CisgICAgICAgIFNjYWxlUm93RG93bjJMaW5lYXJfQW55X05FT047CisgICAgICAgIFNjYWxlUm93RG93bjJMaW5lYXJfQzsKKyAgICAgICAgU2NhbGVSb3dEb3duMkxpbmVhcl9ORU9OOworICAgICAgICBTY2FsZVJvd0Rvd24yX05FT047CisgICAgICAgIFNjYWxlUm93RG93bjM0XzBfQm94XzE2X0M7CisgICAgICAgIFNjYWxlUm93RG93bjM0XzBfQm94X0FueV9ORU9OOworICAgICAgICBTY2FsZVJvd0Rvd24zNF8wX0JveF9DOworICAgICAgICBTY2FsZVJvd0Rvd24zNF8wX0JveF9ORU9OOworICAgICAgICBTY2FsZVJvd0Rvd24zNF8xNl9DOworICAgICAgICBTY2FsZVJvd0Rvd24zNF8xX0JveF8xNl9DOworICAgICAgICBTY2FsZVJvd0Rvd24zNF8xX0JveF9BbnlfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duMzRfMV9Cb3hfQzsKKyAgICAgICAgU2NhbGVSb3dEb3duMzRfMV9Cb3hfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duMzRfQW55X05FT047CisgICAgICAgIFNjYWxlUm93RG93bjM0X0M7CisgICAgICAgIFNjYWxlUm93RG93bjM0X05FT047CisgICAgICAgIFNjYWxlUm93RG93bjM4XzE2X0M7CisgICAgICAgIFNjYWxlUm93RG93bjM4XzJfQm94XzE2X0M7CisgICAgICAgIFNjYWxlUm93RG93bjM4XzJfQm94X0FueV9ORU9OOworICAgICAgICBTY2FsZVJvd0Rvd24zOF8yX0JveF9DOworICAgICAgICBTY2FsZVJvd0Rvd24zOF8yX0JveF9ORU9OOworICAgICAgICBTY2FsZVJvd0Rvd24zOF8zX0JveF8xNl9DOworICAgICAgICBTY2FsZVJvd0Rvd24zOF8zX0JveF9BbnlfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duMzhfM19Cb3hfQzsKKyAgICAgICAgU2NhbGVSb3dEb3duMzhfM19Cb3hfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duMzhfQW55X05FT047CisgICAgICAgIFNjYWxlUm93RG93bjM4X0M7CisgICAgICAgIFNjYWxlUm93RG93bjM4X05FT047CisgICAgICAgIFNjYWxlUm93RG93bjRfMTZfQzsKKyAgICAgICAgU2NhbGVSb3dEb3duNF9BbnlfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duNEJveF8xNl9DOworICAgICAgICBTY2FsZVJvd0Rvd240Qm94X0FueV9ORU9OOworICAgICAgICBTY2FsZVJvd0Rvd240Qm94X0M7CisgICAgICAgIFNjYWxlUm93RG93bjRCb3hfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duNF9DOworICAgICAgICBTY2FsZVJvd0Rvd240X05FT047CisgICAgICAgIFNjYWxlU2xvcGU7CisgICAgICAgIFNldFBsYW5lOworICAgICAgICBTZXRSb3dfQW55X05FT047CisgICAgICAgIFNldFJvd19DOworICAgICAgICBTZXRSb3dfTkVPTjsKKyAgICAgICAgU29iZWxSb3dfQW55X05FT047CisgICAgICAgIFNvYmVsUm93X0M7CisgICAgICAgIFNvYmVsUm93X05FT047CisgICAgICAgIFNvYmVsVG9QbGFuZVJvd19BbnlfTkVPTjsKKyAgICAgICAgU29iZWxUb1BsYW5lUm93X0M7CisgICAgICAgIFNvYmVsVG9QbGFuZVJvd19ORU9OOworICAgICAgICBTb2JlbFhSb3dfQzsKKyAgICAgICAgU29iZWxYUm93X05FT047CisgICAgICAgIFNvYmVsWFlSb3dfQW55X05FT047CisgICAgICAgIFNvYmVsWFlSb3dfQzsKKyAgICAgICAgU29iZWxYWVJvd19ORU9OOworICAgICAgICBTb2JlbFlSb3dfQzsKKyAgICAgICAgU29iZWxZUm93X05FT047CisgICAgICAgIFNwbGl0VVZQbGFuZTsKKyAgICAgICAgU3BsaXRVVlJvd19BbnlfTkVPTjsKKyAgICAgICAgU3BsaXRVVlJvd19DOworICAgICAgICBTcGxpdFVWUm93X05FT047CisgICAgICAgIFVZVllUb0FSR0I7CisgICAgICAgIFVZVllUb0FSR0JSb3dfQW55X05FT047CisgICAgICAgIFVZVllUb0FSR0JSb3dfQzsKKyAgICAgICAgVVlWWVRvQVJHQlJvd19ORU9OOworICAgICAgICBVWVZZVG9JNDIwOworICAgICAgICBVWVZZVG9JNDIyOworICAgICAgICBVWVZZVG9OVjEyOworICAgICAgICBVWVZZVG9VVjQyMlJvd19BbnlfTkVPTjsKKyAgICAgICAgVVlWWVRvVVY0MjJSb3dfQzsKKyAgICAgICAgVVlWWVRvVVY0MjJSb3dfTkVPTjsKKyAgICAgICAgVVlWWVRvVVZSb3dfQW55X05FT047CisgICAgICAgIFVZVllUb1VWUm93X0M7CisgICAgICAgIFVZVllUb1VWUm93X05FT047CisgICAgICAgIFVZVllUb1lSb3dfQW55X05FT047CisgICAgICAgIFVZVllUb1lSb3dfQzsKKyAgICAgICAgVVlWWVRvWVJvd19ORU9OOworICAgICAgICBZVVkyVG9BUkdCOworICAgICAgICBZVVkyVG9BUkdCUm93X0FueV9ORU9OOworICAgICAgICBZVVkyVG9BUkdCUm93X0M7CisgICAgICAgIFlVWTJUb0FSR0JSb3dfTkVPTjsKKyAgICAgICAgWVVZMlRvSTQyMDsKKyAgICAgICAgWVVZMlRvSTQyMjsKKyAgICAgICAgWVVZMlRvTlYxMjsKKyAgICAgICAgWVVZMlRvVVY0MjJSb3dfQW55X05FT047CisgICAgICAgIFlVWTJUb1VWNDIyUm93X0M7CisgICAgICAgIFlVWTJUb1VWNDIyUm93X05FT047CisgICAgICAgIFlVWTJUb1VWUm93X0FueV9ORU9OOworICAgICAgICBZVVkyVG9VVlJvd19DOworICAgICAgICBZVVkyVG9VVlJvd19ORU9OOworICAgICAgICBZVVkyVG9ZOworICAgICAgICBZVVkyVG9ZUm93X0FueV9ORU9OOworICAgICAgICBZVVkyVG9ZUm93X0M7CisgICAgICAgIFlVWTJUb1lSb3dfTkVPTjsKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvQW5kcm9pZC5icAppbmRleCAxYjlmZTBmLi44ZDQ4NmNmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0FuZHJvaWQuYnAKQEAgLTEsNCArMSw0IEBACi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfZmxhY2RlYyIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICB2bmRrOiB7CkBAIC05LDYgKzksOCBAQAogICAgICAgICAiRkxBQ0RlY29kZXIuY3BwIiwKICAgICBdLAogCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyAiLiIgXSwKKwogICAgIGluY2x1ZGVfZGlyczogWwogICAgICAgICAiZXh0ZXJuYWwvZmxhYy9pbmNsdWRlIiwKICAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCkBAIC0yNywxMCArMjksMTUgQEAKICAgICAgICAgfSwKICAgICB9LAogCi0gICAgc3RhdGljX2xpYnM6IFsibGliRkxBQyJdLAorICAgIHN0YXRpYzogeworICAgICAgICB3aG9sZV9zdGF0aWNfbGliczogWyJsaWJGTEFDIl0sCisgICAgfSwKKworICAgIHNoYXJlZDogeworICAgICAgICBzdGF0aWNfbGliczogWyJsaWJGTEFDIl0sCisgICAgfSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuY3BwCmluZGV4IDhjNzEzN2MuLmEyYjZhYjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9GTEFDRGVjb2Rlci5jcHAKQEAgLTIyMCw5ICsyMjAsMTAgQEAKIH0KIAogLy8gc3RhdGljCi1zcDxGTEFDRGVjb2Rlcj4gRkxBQ0RlY29kZXI6OkNyZWF0ZSgpIHsKLSAgICBzcDxGTEFDRGVjb2Rlcj4gZGVjb2RlciA9IG5ldyBGTEFDRGVjb2RlcigpOwotICAgIGlmIChkZWNvZGVyLT5pbml0KCkgIT0gT0spIHsKK0ZMQUNEZWNvZGVyICpGTEFDRGVjb2Rlcjo6Q3JlYXRlKCkgeworICAgIEZMQUNEZWNvZGVyICpkZWNvZGVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIEZMQUNEZWNvZGVyKCk7CisgICAgaWYgKGRlY29kZXIgPT0gTlVMTCB8fCBkZWNvZGVyLT5pbml0KCkgIT0gT0spIHsKKyAgICAgICAgZGVsZXRlIGRlY29kZXI7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICByZXR1cm4gZGVjb2RlcjsKQEAgLTQyMiwyMiArNDIzLDE2IEBACiAgICAgICAgIHNob3J0ICpvdXRCdWZmZXIsIHNpemVfdCAqb3V0QnVmZmVyTGVuKSB7CiAgICAgQUxPR1YoImRlY29kZU9uZUZyYW1lOiBpbnB1dCBzaXplKCV6dSkiLCBpbkJ1ZmZlckxlbik7CiAKLSAgICBpZiAoaW5CdWZmZXJMZW4gPT0gMCkgewotICAgICAgICBBTE9HVigiZGVjb2RlT25lRnJhbWU6IG5vIGlucHV0IGRhdGEiKTsKLSAgICAgICAgaWYgKG91dEJ1ZmZlckxlbikgewotICAgICAgICAgICAgKm91dEJ1ZmZlckxlbiA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQogICAgIGlmICghbVN0cmVhbUluZm9WYWxpZCkgewogICAgICAgICBBTE9HVygiZGVjb2RlT25lRnJhbWU6IG5vIHN0cmVhbWluZm8gbWV0YWRhdGEgYmxvY2siKTsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBlcnIgPSBhZGREYXRhVG9CdWZmZXIoaW5CdWZmZXIsIGluQnVmZmVyTGVuKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIEFMT0dXKCJkZWNvZGVPbmVGcmFtZTogYWRkRGF0YVRvQnVmZmVyIHJldHVybnMgZXJyb3IgJWQiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOworICAgIGlmIChpbkJ1ZmZlckxlbiAhPSAwKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IGFkZERhdGFUb0J1ZmZlcihpbkJ1ZmZlciwgaW5CdWZmZXJMZW4pOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiZGVjb2RlT25lRnJhbWU6IGFkZERhdGFUb0J1ZmZlciByZXR1cm5zIGVycm9yICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KICAgICB9CiAKICAgICBtV3JpdGVSZXF1ZXN0ZWQgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmgKaW5kZXggMzYyODJhOC4uMWEzM2NhZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9GTEFDRGVjb2Rlci5oCkBAIC0yNiwxNCArMjYsMTQgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gcGFja2V0IGJhc2VkIEZMQUMgZGVjb2Rlciwgd3JhcHBzIGxpYkZMQUMgc3RyZWFtIGRlY29kZXIuCi1jbGFzcyBGTEFDRGVjb2RlciA6IHB1YmxpYyBSZWZCYXNlIHsKK2NsYXNzIEZMQUNEZWNvZGVyIHsKIAogcHVibGljOgogICAgIGVudW0gewogICAgICAgICBrTWF4Q2hhbm5lbHMgPSA4LAogICAgIH07CiAKLSAgICBzdGF0aWMgc3A8RkxBQ0RlY29kZXI+IENyZWF0ZSgpOworICAgIHN0YXRpYyBGTEFDRGVjb2RlciAqQ3JlYXRlKCk7CiAKICAgICBGTEFDX19TdHJlYW1NZXRhZGF0YV9TdHJlYW1JbmZvIGdldFN0cmVhbUluZm8oKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtU3RyZWFtSW5mbzsKQEAgLTQzLDEwICs0MywxMCBAQAogICAgIHN0YXR1c190IGRlY29kZU9uZUZyYW1lKGNvbnN0IHVpbnQ4X3QgKmluQnVmZmVyLCBzaXplX3QgaW5CdWZmZXJMZW4sCiAgICAgICAgICAgICBzaG9ydCAqb3V0QnVmZmVyLCBzaXplX3QgKm91dEJ1ZmZlckxlbik7CiAgICAgdm9pZCBmbHVzaCgpOworICAgIHZpcnR1YWwgfkZMQUNEZWNvZGVyKCk7CiAKIHByb3RlY3RlZDoKICAgICBGTEFDRGVjb2RlcigpOwotICAgIHZpcnR1YWwgfkZMQUNEZWNvZGVyKCkgb3ZlcnJpZGU7CiAKIHByaXZhdGU6CiAgICAgLy8gc3RyZWFtIHByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuY3BwCmluZGV4IDgwNDA0NmEuLmM4OTY1ZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmNwcApAQCAtMTksMTMgKzE5LDExIEBACiAjaW5jbHVkZSAiQURlYnVnLmgiCiAjaW5jbHVkZSAiQUxvb3Blci5oIgogI2luY2x1ZGUgIkFNZXNzYWdlLmgiCi0jaW5jbHVkZSAiTWVkaWFCdWZmZXJCYXNlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogQUJ1ZmZlcjo6QUJ1ZmZlcihzaXplX3QgY2FwYWNpdHkpCi0gICAgOiBtTWVkaWFCdWZmZXJCYXNlKE5VTEwpLAotICAgICAgbVJhbmdlT2Zmc2V0KDApLAorICAgIDogbVJhbmdlT2Zmc2V0KDApLAogICAgICAgbUludDMyRGF0YSgwKSwKICAgICAgIG1Pd25zRGF0YSh0cnVlKSB7CiAgICAgbURhdGEgPSBtYWxsb2MoY2FwYWNpdHkpOwpAQCAtMzksOCArMzcsNyBAQAogfQogCiBBQnVmZmVyOjpBQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBjYXBhY2l0eSkKLSAgICA6IG1NZWRpYUJ1ZmZlckJhc2UoTlVMTCksCi0gICAgICBtRGF0YShkYXRhKSwKKyAgICA6IG1EYXRhKGRhdGEpLAogICAgICAgbUNhcGFjaXR5KGNhcGFjaXR5KSwKICAgICAgIG1SYW5nZU9mZnNldCgwKSwKICAgICAgIG1SYW5nZUxlbmd0aChjYXBhY2l0eSksCkBAIC02Niw4ICs2Myw2IEBACiAgICAgICAgICAgICBtRGF0YSA9IE5VTEw7CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBzZXRNZWRpYUJ1ZmZlckJhc2UoTlVMTCk7CiB9CiAKIHZvaWQgQUJ1ZmZlcjo6c2V0UmFuZ2Uoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKQEAgLTg1LDE5ICs4MCw1IEBACiAgICAgcmV0dXJuIG1NZXRhOwogfQogCi1NZWRpYUJ1ZmZlckJhc2UgKkFCdWZmZXI6OmdldE1lZGlhQnVmZmVyQmFzZSgpIHsKLSAgICBpZiAobU1lZGlhQnVmZmVyQmFzZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1NZWRpYUJ1ZmZlckJhc2UtPmFkZF9yZWYoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1NZWRpYUJ1ZmZlckJhc2U7Ci19Ci0KLXZvaWQgQUJ1ZmZlcjo6c2V0TWVkaWFCdWZmZXJCYXNlKE1lZGlhQnVmZmVyQmFzZSAqbWVkaWFCdWZmZXIpIHsKLSAgICBpZiAobU1lZGlhQnVmZmVyQmFzZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1NZWRpYUJ1ZmZlckJhc2UtPnJlbGVhc2UoKTsKLSAgICB9Ci0gICAgbU1lZGlhQnVmZmVyQmFzZSA9IG1lZGlhQnVmZmVyOwotfQotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwCmluZGV4IGY1NWRlNjQuLjczOGYwNjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwCkBAIC05NDQsNCArOTQ0LDE2MyBAQAogICAgIHJldHVybiBtSXRlbXNbaW5kZXhdLm1OYW1lOwogfQogCitBTWVzc2FnZTo6SXRlbURhdGEgQU1lc3NhZ2U6OmdldEVudHJ5QXQoc2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgSXRlbURhdGEgaXQ7CisgICAgaWYgKGluZGV4IDwgbU51bUl0ZW1zKSB7CisgICAgICAgIHN3aXRjaCAobUl0ZW1zW2luZGV4XS5tVHlwZSkgeworICAgICAgICAgICAgY2FzZSBrVHlwZUludDMyOiAgICBpdC5zZXQobUl0ZW1zW2luZGV4XS51LmludDMyVmFsdWUpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga1R5cGVJbnQ2NDogICAgaXQuc2V0KG1JdGVtc1tpbmRleF0udS5pbnQ2NFZhbHVlKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtUeXBlU2l6ZTogICAgIGl0LnNldChtSXRlbXNbaW5kZXhdLnUuc2l6ZVZhbHVlKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtUeXBlRmxvYXQ6ICAgIGl0LnNldChtSXRlbXNbaW5kZXhdLnUuZmxvYXRWYWx1ZSk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBrVHlwZURvdWJsZTogICBpdC5zZXQobUl0ZW1zW2luZGV4XS51LmRvdWJsZVZhbHVlKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtUeXBlUG9pbnRlcjogIGl0LnNldChtSXRlbXNbaW5kZXhdLnUucHRyVmFsdWUpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga1R5cGVSZWN0OiAgICAgaXQuc2V0KG1JdGVtc1tpbmRleF0udS5yZWN0VmFsdWUpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga1R5cGVTdHJpbmc6ICAgaXQuc2V0KCptSXRlbXNbaW5kZXhdLnUuc3RyaW5nVmFsdWUpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga1R5cGVPYmplY3Q6IHsKKyAgICAgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmogPSBtSXRlbXNbaW5kZXhdLnUucmVmVmFsdWU7CisgICAgICAgICAgICAgICAgaXQuc2V0KG9iaik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIGtUeXBlTWVzc2FnZTogeworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBzdGF0aWNfY2FzdDxBTWVzc2FnZSAqPihtSXRlbXNbaW5kZXhdLnUucmVmVmFsdWUpOworICAgICAgICAgICAgICAgIGl0LnNldChtc2cpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBrVHlwZUJ1ZmZlcjogeworICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZiA9IHN0YXRpY19jYXN0PEFCdWZmZXIgKj4obUl0ZW1zW2luZGV4XS51LnJlZlZhbHVlKTsKKyAgICAgICAgICAgICAgICBpdC5zZXQoYnVmKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGl0OworfQorCitzdGF0dXNfdCBBTWVzc2FnZTo6c2V0RW50cnlOYW1lQXQoc2l6ZV90IGluZGV4LCBjb25zdCBjaGFyICpuYW1lKSB7CisgICAgaWYgKGluZGV4ID49IG1OdW1JdGVtcykgeworICAgICAgICByZXR1cm4gQkFEX0lOREVYOworICAgIH0KKyAgICBpZiAobmFtZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmICghc3RyY21wKG5hbWUsIG1JdGVtc1tpbmRleF0ubU5hbWUpKSB7CisgICAgICAgIHJldHVybiBPSzsgLy8gbmFtZSBoYXMgbm90IGNoYW5nZWQKKyAgICB9CisgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihuYW1lKTsKKyAgICBpZiAoZmluZEl0ZW1JbmRleChuYW1lLCBsZW4pIDwgbU51bUl0ZW1zKSB7CisgICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKKyAgICB9CisgICAgZGVsZXRlW10gbUl0ZW1zW2luZGV4XS5tTmFtZTsKKyAgICBtSXRlbXNbaW5kZXhdLm1OYW1lID0gbnVsbHB0cjsKKyAgICBtSXRlbXNbaW5kZXhdLnNldE5hbWUobmFtZSwgbGVuKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFNZXNzYWdlOjpzZXRFbnRyeUF0KHNpemVfdCBpbmRleCwgY29uc3QgSXRlbURhdGEgJml0ZW0pIHsKKyAgICBBU3RyaW5nIHN0cmluZ1ZhbHVlOworICAgIHNwPFJlZkJhc2U+IHJlZlZhbHVlOworICAgIHNwPEFNZXNzYWdlPiBtc2dWYWx1ZTsKKyAgICBzcDxBQnVmZmVyPiBidWZWYWx1ZTsKKworICAgIGlmIChpbmRleCA+PSBtTnVtSXRlbXMpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICB9CisgICAgaWYgKCFpdGVtLnVzZWQoKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBJdGVtICpkc3QgPSAmbUl0ZW1zW2luZGV4XTsKKyAgICBmcmVlSXRlbVZhbHVlKGRzdCk7CisKKyAgICAvLyBzb21lIHZhbHVlcyBjYW4gYmUgZGlyZWN0bHkgc2V0IHdpdGggdGhlIGdldHRlci4gb3RoZXJzIG5lZWQgaXRlbXMgdG8gYmUgYWxsb2NhdGVkCisgICAgaWYgKGl0ZW0uZmluZCgmZHN0LT51LmludDMyVmFsdWUpKSB7CisgICAgICAgIGRzdC0+bVR5cGUgPSBrVHlwZUludDMyOworICAgIH0gZWxzZSBpZiAoaXRlbS5maW5kKCZkc3QtPnUuaW50NjRWYWx1ZSkpIHsKKyAgICAgICAgZHN0LT5tVHlwZSA9IGtUeXBlSW50NjQ7CisgICAgfSBlbHNlIGlmIChpdGVtLmZpbmQoJmRzdC0+dS5zaXplVmFsdWUpKSB7CisgICAgICAgIGRzdC0+bVR5cGUgPSBrVHlwZVNpemU7CisgICAgfSBlbHNlIGlmIChpdGVtLmZpbmQoJmRzdC0+dS5mbG9hdFZhbHVlKSkgeworICAgICAgICBkc3QtPm1UeXBlID0ga1R5cGVGbG9hdDsKKyAgICB9IGVsc2UgaWYgKGl0ZW0uZmluZCgmZHN0LT51LmRvdWJsZVZhbHVlKSkgeworICAgICAgICBkc3QtPm1UeXBlID0ga1R5cGVEb3VibGU7CisgICAgfSBlbHNlIGlmIChpdGVtLmZpbmQoJmRzdC0+dS5wdHJWYWx1ZSkpIHsKKyAgICAgICAgZHN0LT5tVHlwZSA9IGtUeXBlUG9pbnRlcjsKKyAgICB9IGVsc2UgaWYgKGl0ZW0uZmluZCgmZHN0LT51LnJlY3RWYWx1ZSkpIHsKKyAgICAgICAgZHN0LT5tVHlwZSA9IGtUeXBlUmVjdDsKKyAgICB9IGVsc2UgaWYgKGl0ZW0uZmluZCgmc3RyaW5nVmFsdWUpKSB7CisgICAgICAgIGRzdC0+dS5zdHJpbmdWYWx1ZSA9IG5ldyBBU3RyaW5nKHN0cmluZ1ZhbHVlKTsKKyAgICAgICAgZHN0LT5tVHlwZSA9IGtUeXBlU3RyaW5nOworICAgIH0gZWxzZSBpZiAoaXRlbS5maW5kKCZyZWZWYWx1ZSkpIHsKKyAgICAgICAgaWYgKHJlZlZhbHVlICE9IE5VTEwpIHsgcmVmVmFsdWUtPmluY1N0cm9uZyh0aGlzKTsgfQorICAgICAgICBkc3QtPnUucmVmVmFsdWUgPSByZWZWYWx1ZS5nZXQoKTsKKyAgICAgICAgZHN0LT5tVHlwZSA9IGtUeXBlT2JqZWN0OworICAgIH0gZWxzZSBpZiAoaXRlbS5maW5kKCZtc2dWYWx1ZSkpIHsKKyAgICAgICAgaWYgKG1zZ1ZhbHVlICE9IE5VTEwpIHsgbXNnVmFsdWUtPmluY1N0cm9uZyh0aGlzKTsgfQorICAgICAgICBkc3QtPnUucmVmVmFsdWUgPSBtc2dWYWx1ZS5nZXQoKTsKKyAgICAgICAgZHN0LT5tVHlwZSA9IGtUeXBlTWVzc2FnZTsKKyAgICB9IGVsc2UgaWYgKGl0ZW0uZmluZCgmYnVmVmFsdWUpKSB7CisgICAgICAgIGlmIChidWZWYWx1ZSAhPSBOVUxMKSB7IGJ1ZlZhbHVlLT5pbmNTdHJvbmcodGhpcyk7IH0KKyAgICAgICAgZHN0LT51LnJlZlZhbHVlID0gYnVmVmFsdWUuZ2V0KCk7CisgICAgICAgIGRzdC0+bVR5cGUgPSBrVHlwZUJ1ZmZlcjsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyB1bnN1cHBvcnRlZCBpdGVtIC0gd2Ugc2hvdWxkIG5vdCBiZSBoZXJlLgorICAgICAgICBkc3QtPm1UeXBlID0ga1R5cGVJbnQzMjsKKyAgICAgICAgZHN0LT51LmludDMyVmFsdWUgPSAweERFQURERUFEOworICAgICAgICByZXR1cm4gQkFEX1RZUEU7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQU1lc3NhZ2U6OnJlbW92ZUVudHJ5QXQoc2l6ZV90IGluZGV4KSB7CisgICAgaWYgKGluZGV4ID49IG1OdW1JdGVtcykgeworICAgICAgICByZXR1cm4gQkFEX0lOREVYOworICAgIH0KKyAgICAvLyBkZWxldGUgZW50cnkgZGF0YSBhbmQgb2JqZWN0cworICAgIC0tbU51bUl0ZW1zOworICAgIGRlbGV0ZVtdIG1JdGVtc1tpbmRleF0ubU5hbWU7CisgICAgbUl0ZW1zW2luZGV4XS5tTmFtZSA9IG51bGxwdHI7CisgICAgZnJlZUl0ZW1WYWx1ZSgmbUl0ZW1zW2luZGV4XSk7CisKKyAgICAvLyBzd2FwIGVudHJ5IHdpdGggbGFzdCBlbnRyeSBhbmQgY2xlYXIgbGFzdCBlbnRyeSdzIGRhdGEKKyAgICBpZiAoaW5kZXggPCBtTnVtSXRlbXMpIHsKKyAgICAgICAgbUl0ZW1zW2luZGV4XSA9IG1JdGVtc1ttTnVtSXRlbXNdOworICAgICAgICBtSXRlbXNbbU51bUl0ZW1zXS5tTmFtZSA9IG51bGxwdHI7CisgICAgICAgIG1JdGVtc1ttTnVtSXRlbXNdLm1UeXBlID0ga1R5cGVJbnQzMjsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEFNZXNzYWdlOjpzZXRJdGVtKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IEl0ZW1EYXRhICZpdGVtKSB7CisgICAgaWYgKGl0ZW0udXNlZCgpKSB7CisgICAgICAgIEl0ZW0gKml0ID0gYWxsb2NhdGVJdGVtKG5hbWUpOworICAgICAgICBpZiAoaXQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc2V0RW50cnlBdChpdCAtIG1JdGVtcywgaXRlbSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0FNZXNzYWdlOjpJdGVtRGF0YSBBTWVzc2FnZTo6ZmluZEl0ZW0oY29uc3QgY2hhciAqbmFtZSkgY29uc3QgeworICAgIHJldHVybiBnZXRFbnRyeUF0KGZpbmRFbnRyeUJ5TmFtZShuYW1lKSk7Cit9CisKK3ZvaWQgQU1lc3NhZ2U6OmV4dGVuZChjb25zdCBzcDxBTWVzc2FnZT4gJm90aGVyKSB7CisgICAgLy8gaWdub3JlIG51bGwgbWVzc2FnZXMKKyAgICBpZiAob3RoZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IG90aGVyLT5tTnVtSXRlbXM7ICsraXgpIHsKKyAgICAgICAgSXRlbSAqaXQgPSBhbGxvY2F0ZUl0ZW0ob3RoZXItPm1JdGVtc1tpeF0ubU5hbWUpOworICAgICAgICBpZiAoaXQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgSXRlbURhdGEgZGF0YSA9IG90aGVyLT5nZXRFbnRyeUF0KGl4KTsKKyAgICAgICAgICAgIHNldEVudHJ5QXQoaXQgLSBtSXRlbXMsIGRhdGEpOworICAgICAgICB9CisgICAgfQorfQorCitzaXplX3QgQU1lc3NhZ2U6OmZpbmRFbnRyeUJ5TmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIG5hbWUgPT0gbnVsbHB0ciA/IGNvdW50RW50cmllcygpIDogZmluZEl0ZW1JbmRleChuYW1lLCBzdHJsZW4obmFtZSkpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uY3BwCmluZGV4IGY4YjdiNDEuLmVhZmRjMzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FOZXR3b3JrU2Vzc2lvbi5jcHAKQEAgLTMzLDIyICszMywxMSBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RhdGljIHVpbnQxNl90IFUxNl9BVChjb25zdCB1aW50OF90ICpwdHIpIHsKLSAgICByZXR1cm4gcHRyWzBdIDw8IDggfCBwdHJbMV07Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBVMzJfQVQoY29uc3QgdWludDhfdCAqcHRyKSB7Ci0gICAgcmV0dXJuIHB0clswXSA8PCAyNCB8IHB0clsxXSA8PCAxNiB8IHB0clsyXSA8PCA4IHwgcHRyWzNdOwotfQotCi1zdGF0aWMgdWludDY0X3QgVTY0X0FUKGNvbnN0IHVpbnQ4X3QgKnB0cikgewotICAgIHJldHVybiAoKHVpbnQ2NF90KVUzMl9BVChwdHIpKSA8PCAzMiB8IFUzMl9BVChwdHIgKyA0KTsKLX0KLQogc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4VURQU2l6ZSA9IDE1MDA7CiBzdGF0aWMgY29uc3QgaW50MzJfdCBrTWF4VURQUmV0cmllcyA9IDIwMDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BV2FrZUxvY2suY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BV2FrZUxvY2suY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTI3N2FjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVdha2VMb2NrLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJBV2FrZUxvY2siCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJBRGVidWcuaCIKLSNpbmNsdWRlICJBV2FrZUxvY2suaCIKLQotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxwb3dlcm1hbmFnZXIvUG93ZXJNYW5hZ2VyLmg+Ci0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1BV2FrZUxvY2s6OkFXYWtlTG9jaygpIDoKLSAgICBtUG93ZXJNYW5hZ2VyKE5VTEwpLAotICAgIG1XYWtlTG9ja1Rva2VuKE5VTEwpLAotICAgIG1XYWtlTG9ja0NvdW50KDApLAotICAgIG1EZWF0aFJlY2lwaWVudChuZXcgUE1EZWF0aFJlY2lwaWVudCh0aGlzKSkge30KLQotQVdha2VMb2NrOjp+QVdha2VMb2NrKCkgewotICAgIGlmIChtUG93ZXJNYW5hZ2VyICE9IE5VTEwpIHsKLSAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gSUludGVyZmFjZTo6YXNCaW5kZXIobVBvd2VyTWFuYWdlcik7Ci0gICAgICAgIGJpbmRlci0+dW5saW5rVG9EZWF0aChtRGVhdGhSZWNpcGllbnQpOwotICAgIH0KLSAgICBjbGVhclBvd2VyTWFuYWdlcigpOwotfQotCi1ib29sIEFXYWtlTG9jazo6YWNxdWlyZSgpIHsKLSAgICBpZiAobVdha2VMb2NrQ291bnQgPT0gMCkgewotICAgICAgICBDSEVDSyhtV2FrZUxvY2tUb2tlbiA9PSBOVUxMKTsKLSAgICAgICAgaWYgKG1Qb3dlck1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgLy8gdXNlIGNoZWNrU2VydmljZSgpIHRvIGF2b2lkIGJsb2NraW5nIGlmIHBvd2VyIHNlcnZpY2UgaXMgbm90IHVwIHlldAotICAgICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0KLSAgICAgICAgICAgICAgICBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Y2hlY2tTZXJ2aWNlKFN0cmluZzE2KCJwb3dlciIpKTsKLSAgICAgICAgICAgIGlmIChiaW5kZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjb3VsZCBub3QgZ2V0IHRoZSBwb3dlciBtYW5hZ2VyIHNlcnZpY2UiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVBvd2VyTWFuYWdlciA9IGludGVyZmFjZV9jYXN0PElQb3dlck1hbmFnZXI+KGJpbmRlcik7Ci0gICAgICAgICAgICAgICAgYmluZGVyLT5saW5rVG9EZWF0aChtRGVhdGhSZWNpcGllbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtUG93ZXJNYW5hZ2VyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IG5ldyBCQmluZGVyKCk7Ci0gICAgICAgICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1Qb3dlck1hbmFnZXItPmFjcXVpcmVXYWtlTG9jaygKLSAgICAgICAgICAgICAgICAgICAgUE9XRVJNQU5BR0VSX1BBUlRJQUxfV0FLRV9MT0NLLAotICAgICAgICAgICAgICAgICAgICBiaW5kZXIsIFN0cmluZzE2KCJBV2FrZUxvY2siKSwgU3RyaW5nMTYoIm1lZGlhIikpOwotICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgbVdha2VMb2NrVG9rZW4gPSBiaW5kZXI7Ci0gICAgICAgICAgICAgICAgbVdha2VMb2NrQ291bnQrKzsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1XYWtlTG9ja0NvdW50Kys7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgQVdha2VMb2NrOjpyZWxlYXNlKGJvb2wgZm9yY2UpIHsKLSAgICBpZiAobVdha2VMb2NrQ291bnQgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChmb3JjZSkgewotICAgICAgICAvLyBGb3JjZSB3YWtlbG9jayByZWxlYXNlIGJlbG93IGJ5IHNldHRpbmcgcmVmZXJlbmNlIGNvdW50IHRvIDEuCi0gICAgICAgIG1XYWtlTG9ja0NvdW50ID0gMTsKLSAgICB9Ci0gICAgaWYgKC0tbVdha2VMb2NrQ291bnQgPT0gMCkgewotICAgICAgICBDSEVDSyhtV2FrZUxvY2tUb2tlbiAhPSBOVUxMKTsKLSAgICAgICAgaWYgKG1Qb3dlck1hbmFnZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLT5yZWxlYXNlV2FrZUxvY2sobVdha2VMb2NrVG9rZW4sIDAgLyogZmxhZ3MgKi8pOwotICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7Ci0gICAgICAgIH0KLSAgICAgICAgbVdha2VMb2NrVG9rZW4uY2xlYXIoKTsKLSAgICB9Ci19Ci0KLXZvaWQgQVdha2VMb2NrOjpjbGVhclBvd2VyTWFuYWdlcigpIHsKLSAgICByZWxlYXNlKHRydWUpOwotICAgIG1Qb3dlck1hbmFnZXIuY2xlYXIoKTsKLX0KLQotdm9pZCBBV2FrZUxvY2s6OlBNRGVhdGhSZWNpcGllbnQ6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkgewotICAgIGlmIChtV2FrZUxvY2sgIT0gTlVMTCkgewotICAgICAgICBtV2FrZUxvY2stPmNsZWFyUG93ZXJNYW5hZ2VyKCk7Ci0gICAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwCmluZGV4IDIyMWFmMWQuLmY2NjM1NDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKQEAgLTQsNyArNCw3IEBACiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKIH0KIAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgdm5kazogewpAQCAtMTMsNiArMTMsOCBAQAogICAgIGluY2x1ZGVfZGlyczogWwogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIiwKICAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9hcmVjdC9pbmNsdWRlIiwKKyAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2xpYnMvbmF0aXZlYmFzZS9pbmNsdWRlIiwKICAgICBdLAogCiAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCkBAIC0yMiwxNSArMjQsMTYgQEAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliaGFyZHdhcmVfaGVhZGVycyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCiAgICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGlidWkiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKQEAgLTQyLDEwICs0NSw4IEBACiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJ1aSIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYnBvd2VybWFuYWdlciIsCiAgICAgXSwKIAogICAgIHNyY3M6IFsKQEAgLTYxLDIzICs2MiwxNiBAQAogICAgICAgICAiQU5ldHdvcmtTZXNzaW9uLmNwcCIsCiAgICAgICAgICJBU3RyaW5nLmNwcCIsCiAgICAgICAgICJBU3RyaW5nVXRpbHMuY3BwIiwKLSAgICAgICAgIkFXYWtlTG9jay5jcHAiLAorICAgICAgICAiQnl0ZVV0aWxzLmNwcCIsCiAgICAgICAgICJDb2xvclV0aWxzLmNwcCIsCi0gICAgICAgICJNZWRpYUJ1ZmZlci5jcHAiLAotICAgICAgICAiTWVkaWFCdWZmZXJHcm91cC5jcHAiLAotICAgICAgICAiTWV0YURhdGEuY3BwIiwKKyAgICAgICAgIk1lZGlhRGVmcy5jcHAiLAorICAgICAgICAiTWVkaWFLZXlzLmNwcCIsCiAgICAgICAgICJQYXJzZWRNZXNzYWdlLmNwcCIsCisgICAgICAgICJhdmNfdXRpbHMuY3BwIiwKICAgICAgICAgImJhc2U2NC5jcHAiLAogICAgICAgICAiaGV4ZHVtcC5jcHAiLAogICAgIF0sCiAKLSAgICB0YXJnZXQ6IHsKLSAgICAgICAgdmVuZG9yOiB7Ci0gICAgICAgICAgICBleGNsdWRlX3NoYXJlZF9saWJzOiBbImxpYnBvd2VybWFuYWdlciJdLAotICAgICAgICAgICAgZXhjbHVkZV9zcmNzOiBbIkFXYWtlTG9jay5jcHAiXSwKLSAgICAgICAgfSwKLSAgICB9LAotCiAgICAgY2xhbmc6IHRydWUsCiAKICAgICBzYW5pdGl6ZTogewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZDQwYWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5jcHAKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQnl0ZVV0aWxzIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1aW50MTZfdCBVMTZfQVQoY29uc3QgdWludDhfdCAqcHRyKSB7CisgICAgcmV0dXJuIHB0clswXSA8PCA4IHwgcHRyWzFdOworfQorCit1aW50MzJfdCBVMzJfQVQoY29uc3QgdWludDhfdCAqcHRyKSB7CisgICAgcmV0dXJuIHB0clswXSA8PCAyNCB8IHB0clsxXSA8PCAxNiB8IHB0clsyXSA8PCA4IHwgcHRyWzNdOworfQorCit1aW50NjRfdCBVNjRfQVQoY29uc3QgdWludDhfdCAqcHRyKSB7CisgICAgcmV0dXJuICgodWludDY0X3QpVTMyX0FUKHB0cikpIDw8IDMyIHwgVTMyX0FUKHB0ciArIDQpOworfQorCit1aW50MTZfdCBVMTZMRV9BVChjb25zdCB1aW50OF90ICpwdHIpIHsKKyAgICByZXR1cm4gcHRyWzBdIHwgKHB0clsxXSA8PCA4KTsKK30KKwordWludDMyX3QgVTMyTEVfQVQoY29uc3QgdWludDhfdCAqcHRyKSB7CisgICAgcmV0dXJuIHB0clszXSA8PCAyNCB8IHB0clsyXSA8PCAxNiB8IHB0clsxXSA8PCA4IHwgcHRyWzBdOworfQorCit1aW50NjRfdCBVNjRMRV9BVChjb25zdCB1aW50OF90ICpwdHIpIHsKKyAgICByZXR1cm4gKCh1aW50NjRfdClVMzJMRV9BVChwdHIgKyA0KSkgPDwgMzIgfCBVMzJMRV9BVChwdHIpOworfQorCisvLyBYWFggd2FybmluZzogdGhlc2Ugd29uJ3Qgd29yayBvbiBiaWctZW5kaWFuIGhvc3QuCit1aW50NjRfdCBudG9oNjQodWludDY0X3QgeCkgeworICAgIHJldHVybiAoKHVpbnQ2NF90KW50b2hsKHggJiAweGZmZmZmZmZmKSA8PCAzMikgfCBudG9obCh4ID4+IDMyKTsKK30KKwordWludDY0X3QgaHRvbjY0KHVpbnQ2NF90IHgpIHsKKyAgICByZXR1cm4gKCh1aW50NjRfdClodG9ubCh4ICYgMHhmZmZmZmZmZikgPDwgMzIpIHwgaHRvbmwoeCA+PiAzMik7Cit9CisKK3ZvaWQgTWFrZUZvdXJDQ1N0cmluZyh1aW50MzJfdCB4LCBjaGFyICpzKSB7CisgICAgc1swXSA9IHggPj4gMjQ7CisgICAgc1sxXSA9ICh4ID4+IDE2KSAmIDB4ZmY7CisgICAgc1syXSA9ICh4ID4+IDgpICYgMHhmZjsKKyAgICBzWzNdID0geCAmIDB4ZmY7CisgICAgc1s0XSA9ICdcMCc7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmNwcAppbmRleCA4OGE4MzUxLi5jNGVhYTI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5jcHAKQEAgLTM5OCw2ICszOTgsNyBAQAogfQogCiAvLyBUT0RPOiBtb3ZlIHRoaXMgaW50byBhIFZpZGVvIEhBTAorY29uc3Qgc3RhdGljCiBBTG9va3VwPENVOjpDb2xvclN0YW5kYXJkLCBzdGQ6OnBhaXI8Q0E6OlByaW1hcmllcywgQ0E6Ok1hdHJpeENvZWZmcz4+IHNTdGFuZGFyZEZhbGxiYWNrcyB7CiAgICAgewogICAgICAgICB7IENVOjprQ29sb3JTdGFuZGFyZEJUNjAxXzYyNSwgeyBDQTo6UHJpbWFyaWVzQlQ3MDlfNSwgQ0E6Ok1hdHJpeEJUNDcwXzZNIH0gfSwKQEAgLTQyMCw2ICs0MjEsNyBAQAogICAgIH0KIH07CiAKK2NvbnN0IHN0YXRpYwogQUxvb2t1cDxDVTo6Q29sb3JTdGFuZGFyZCwgQ0E6OlByaW1hcmllcz4gc1N0YW5kYXJkUHJpbWFyaWVzRmFsbGJhY2tzIHsKICAgICB7CiAgICAgICAgIHsgQ1U6OmtDb2xvclN0YW5kYXJkRmlsbSwgICAgICAgICAgICAgICAgIENBOjpQcmltYXJpZXNHZW5lcmljRmlsbSB9LApAQCAtNDMwLDcgKzQzMiw4IEBACiAgICAgfQogfTsKIAotc3RhdGljIEFMb29rdXA8YW5kcm9pZF9kYXRhc3BhY2UsIGFuZHJvaWRfZGF0YXNwYWNlPiBzTGVnYWN5RGF0YVNwYWNlVG9WMCB7Citjb25zdCBzdGF0aWMKK0FMb29rdXA8YW5kcm9pZF9kYXRhc3BhY2UsIGFuZHJvaWRfZGF0YXNwYWNlPiBzTGVnYWN5RGF0YVNwYWNlVG9WMCB7CiAgICAgewogICAgICAgICB7IEhBTF9EQVRBU1BBQ0VfU1JHQiwgSEFMX0RBVEFTUEFDRV9WMF9TUkdCIH0sCiAgICAgICAgIHsgSEFMX0RBVEFTUEFDRV9CVDcwOSwgSEFMX0RBVEFTUEFDRV9WMF9CVDcwOSB9LApAQCAtNDQxLDYgKzQ0NCw3MyBAQAogICAgIH0KIH07CiAKKyNkZWZpbmUgR0VUX0hBTF9FTlVNKGNsYXNzLCBuYW1lKSBIQUxfREFUQVNQQUNFXyMjY2xhc3MjI25hbWUKKyNkZWZpbmUgR0VUX0hBTF9CSVRGSUVMRChjbGFzcywgbmFtZSkgKEdFVF9IQUxfRU5VTShjbGFzcywgXyMjbmFtZSkgPj4gR0VUX0hBTF9FTlVNKGNsYXNzLCBfU0hJRlQpKQorCitjb25zdCBzdGF0aWMKK0FMb29rdXA8Q1U6OkNvbG9yU3RhbmRhcmQsIHVpbnQzMl90PiBzR2Z4U3RhbmRhcmRzIHsKKyAgICB7CisgICAgICAgIHsgQ1U6OmtDb2xvclN0YW5kYXJkVW5zcGVjaWZpZWQsICAgICAgICAgIEdFVF9IQUxfQklURklFTEQoU1RBTkRBUkQsIFVOU1BFQ0lGSUVEKSB9LAorICAgICAgICB7IENVOjprQ29sb3JTdGFuZGFyZEJUNzA5LCAgICAgICAgICAgICAgICBHRVRfSEFMX0JJVEZJRUxEKFNUQU5EQVJELCBCVDcwOSkgfSwKKyAgICAgICAgeyBDVTo6a0NvbG9yU3RhbmRhcmRCVDYwMV82MjUsICAgICAgICAgICAgR0VUX0hBTF9CSVRGSUVMRChTVEFOREFSRCwgQlQ2MDFfNjI1KSB9LAorICAgICAgICB7IENVOjprQ29sb3JTdGFuZGFyZEJUNjAxXzYyNV9VbmFkanVzdGVkLCBHRVRfSEFMX0JJVEZJRUxEKFNUQU5EQVJELCBCVDYwMV82MjVfVU5BREpVU1RFRCkgfSwKKyAgICAgICAgeyBDVTo6a0NvbG9yU3RhbmRhcmRCVDYwMV81MjUsICAgICAgICAgICAgR0VUX0hBTF9CSVRGSUVMRChTVEFOREFSRCwgQlQ2MDFfNTI1KSB9LAorICAgICAgICB7IENVOjprQ29sb3JTdGFuZGFyZEJUNjAxXzUyNV9VbmFkanVzdGVkLCBHRVRfSEFMX0JJVEZJRUxEKFNUQU5EQVJELCBCVDYwMV81MjVfVU5BREpVU1RFRCkgfSwKKyAgICAgICAgeyBDVTo6a0NvbG9yU3RhbmRhcmRCVDIwMjAsICAgICAgICAgICAgICAgR0VUX0hBTF9CSVRGSUVMRChTVEFOREFSRCwgQlQyMDIwKSB9LAorICAgICAgICB7IENVOjprQ29sb3JTdGFuZGFyZEJUMjAyMENvbnN0YW50LCAgICAgICBHRVRfSEFMX0JJVEZJRUxEKFNUQU5EQVJELCBCVDIwMjBfQ09OU1RBTlRfTFVNSU5BTkNFKSB9LAorICAgICAgICB7IENVOjprQ29sb3JTdGFuZGFyZEJUNDcwTSwgICAgICAgICAgICAgICBHRVRfSEFMX0JJVEZJRUxEKFNUQU5EQVJELCBCVDQ3ME0pIH0sCisgICAgICAgIHsgQ1U6OmtDb2xvclN0YW5kYXJkRmlsbSwgICAgICAgICAgICAgICAgIEdFVF9IQUxfQklURklFTEQoU1RBTkRBUkQsIEZJTE0pIH0sCisgICAgICAgIHsgQ1U6OmtDb2xvclN0YW5kYXJkRENJX1AzLCAgICAgICAgICAgICAgIEdFVF9IQUxfQklURklFTEQoU1RBTkRBUkQsIERDSV9QMykgfSwKKyAgICB9Cit9OworCisvLyB2ZXJpZnkgcHVibGljIHZhbHVlcyBhcmUgc3RhYmxlCitzdGF0aWNfYXNzZXJ0KENVOjprQ29sb3JTdGFuZGFyZFVuc3BlY2lmaWVkID09IDAsICJTREsgbWlzbWF0Y2giKTsgLy8gTgorc3RhdGljX2Fzc2VydChDVTo6a0NvbG9yU3RhbmRhcmRCVDcwOSA9PSAxLCAiU0RLIG1pc21hdGNoIik7IC8vIE4KK3N0YXRpY19hc3NlcnQoQ1U6OmtDb2xvclN0YW5kYXJkQlQ2MDFfNjI1ID09IDIsICJTREsgbWlzbWF0Y2giKTsgLy8gTgorc3RhdGljX2Fzc2VydChDVTo6a0NvbG9yU3RhbmRhcmRCVDYwMV81MjUgPT0gNCwgIlNESyBtaXNtYXRjaCIpOyAvLyBOCitzdGF0aWNfYXNzZXJ0KENVOjprQ29sb3JTdGFuZGFyZEJUMjAyMCA9PSA2LCAiU0RLIG1pc21hdGNoIik7IC8vIE4KKworY29uc3Qgc3RhdGljCitBTG9va3VwPENVOjpDb2xvclRyYW5zZmVyLCB1aW50MzJfdD4gc0dmeFRyYW5zZmVycyB7CisgICAgeworICAgICAgICB7IENVOjprQ29sb3JUcmFuc2ZlclVuc3BlY2lmaWVkLCBHRVRfSEFMX0JJVEZJRUxEKFRSQU5TRkVSLCBVTlNQRUNJRklFRCkgfSwKKyAgICAgICAgeyBDVTo6a0NvbG9yVHJhbnNmZXJMaW5lYXIsICAgICAgR0VUX0hBTF9CSVRGSUVMRChUUkFOU0ZFUiwgTElORUFSKSB9LAorICAgICAgICB7IENVOjprQ29sb3JUcmFuc2ZlclNSR0IsICAgICAgICBHRVRfSEFMX0JJVEZJRUxEKFRSQU5TRkVSLCBTUkdCKSB9LAorICAgICAgICB7IENVOjprQ29sb3JUcmFuc2ZlclNNUFRFXzE3ME0sICBHRVRfSEFMX0JJVEZJRUxEKFRSQU5TRkVSLCBTTVBURV8xNzBNKSB9LAorICAgICAgICB7IENVOjprQ29sb3JUcmFuc2ZlckdhbW1hMjIsICAgICBHRVRfSEFMX0JJVEZJRUxEKFRSQU5TRkVSLCBHQU1NQTJfMikgfSwKKyAgICAgICAgeyBDVTo6a0NvbG9yVHJhbnNmZXJHYW1tYTI4LCAgICAgR0VUX0hBTF9CSVRGSUVMRChUUkFOU0ZFUiwgR0FNTUEyXzgpIH0sCisgICAgICAgIHsgQ1U6OmtDb2xvclRyYW5zZmVyU1QyMDg0LCAgICAgIEdFVF9IQUxfQklURklFTEQoVFJBTlNGRVIsIFNUMjA4NCkgfSwKKyAgICAgICAgeyBDVTo6a0NvbG9yVHJhbnNmZXJITEcsICAgICAgICAgR0VUX0hBTF9CSVRGSUVMRChUUkFOU0ZFUiwgSExHKSB9LAorICAgIH0KK307CisKKy8vIHZlcmlmeSBwdWJsaWMgdmFsdWVzIGFyZSBzdGFibGUKK3N0YXRpY19hc3NlcnQoQ1U6OmtDb2xvclRyYW5zZmVyVW5zcGVjaWZpZWQgPT0gMCwgIlNESyBtaXNtYXRjaCIpOyAvLyBOCitzdGF0aWNfYXNzZXJ0KENVOjprQ29sb3JUcmFuc2ZlckxpbmVhciA9PSAxLCAiU0RLIG1pc21hdGNoIik7IC8vIE4KK3N0YXRpY19hc3NlcnQoQ1U6OmtDb2xvclRyYW5zZmVyU1JHQiA9PSAyLCAiU0RLIG1pc21hdGNoIik7IC8vIE4KK3N0YXRpY19hc3NlcnQoQ1U6OmtDb2xvclRyYW5zZmVyU01QVEVfMTcwTSA9PSAzLCAiU0RLIG1pc21hdGNoIik7IC8vIE4KK3N0YXRpY19hc3NlcnQoQ1U6OmtDb2xvclRyYW5zZmVyU1QyMDg0ID09IDYsICJTREsgbWlzbWF0Y2giKTsgLy8gTgorc3RhdGljX2Fzc2VydChDVTo6a0NvbG9yVHJhbnNmZXJITEcgPT0gNywgIlNESyBtaXNtYXRjaCIpOyAvLyBOCisKK2NvbnN0IHN0YXRpYworQUxvb2t1cDxDVTo6Q29sb3JSYW5nZSwgdWludDMyX3Q+IHNHZnhSYW5nZXMgeworICAgIHsKKyAgICAgICAgeyBDVTo6a0NvbG9yUmFuZ2VVbnNwZWNpZmllZCwgR0VUX0hBTF9CSVRGSUVMRChSQU5HRSwgVU5TUEVDSUZJRUQpIH0sCisgICAgICAgIHsgQ1U6OmtDb2xvclJhbmdlRnVsbCwgICAgICAgIEdFVF9IQUxfQklURklFTEQoUkFOR0UsIEZVTEwpIH0sCisgICAgICAgIHsgQ1U6OmtDb2xvclJhbmdlTGltaXRlZCwgICAgIEdFVF9IQUxfQklURklFTEQoUkFOR0UsIExJTUlURUQpIH0sCisgICAgfQorfTsKKworLy8gdmVyaWZ5IHB1YmxpYyB2YWx1ZXMgYXJlIHN0YWJsZQorc3RhdGljX2Fzc2VydChDVTo6a0NvbG9yUmFuZ2VVbnNwZWNpZmllZCA9PSAwLCAiU0RLIG1pc21hdGNoIik7IC8vIE4KK3N0YXRpY19hc3NlcnQoQ1U6OmtDb2xvclJhbmdlRnVsbCA9PSAxLCAiU0RLIG1pc21hdGNoIik7IC8vIE4KK3N0YXRpY19hc3NlcnQoQ1U6OmtDb2xvclJhbmdlTGltaXRlZCA9PSAyLCAiU0RLIG1pc21hdGNoIik7IC8vIE4KKworI3VuZGVmIEdFVF9IQUxfQklURklFTEQKKyN1bmRlZiBHRVRfSEFMX0VOVU0KKworCiBib29sIENvbG9yVXRpbHM6OmNvbnZlcnREYXRhU3BhY2VUb1YwKGFuZHJvaWRfZGF0YXNwYWNlICZkYXRhU3BhY2UpIHsKICAgICAodm9pZClzTGVnYWN5RGF0YVNwYWNlVG9WMC5sb29rdXAoZGF0YVNwYWNlLCAmZGF0YVNwYWNlKTsKICAgICByZXR1cm4gKGRhdGFTcGFjZSAmIDB4QzAwMEZGRkYpID09IDA7CkBAIC01MDcsOSArNTc3LDIzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBhc3N1bWUgMS10by0xIG1hcHBpbmcgdG8gSEFMIHZhbHVlcyAodG8gZGVhbCB3aXRoIHBvdGVudGlhbCB2ZW5kb3IgZXh0ZW5zaW9ucykKKyAgICB1aW50MzJfdCBnZnhSYW5nZSA9IHJhbmdlOworICAgIHVpbnQzMl90IGdmeFN0YW5kYXJkID0gc3RhbmRhcmQ7CisgICAgdWludDMyX3QgZ2Z4VHJhbnNmZXIgPSB0cmFuc2ZlcjsKKyAgICAvLyBUUklDS1k6IHVzZSAmIHRvIGVuc3VyZSBhbGwgdGhyZWUgbWFwcGluZ3MgYXJlIGNvbXBsZXRlZAorICAgIGlmICghKHNHZnhSYW5nZXMubWFwKHJhbmdlLCAmZ2Z4UmFuZ2UpICYgc0dmeFN0YW5kYXJkcy5tYXAoc3RhbmRhcmQsICZnZnhTdGFuZGFyZCkKKyAgICAgICAgICAgICYgc0dmeFRyYW5zZmVycy5tYXAodHJhbnNmZXIsICZnZnhUcmFuc2ZlcikpKSB7CisgICAgICAgIEFMT0dXKCJjb3VsZCBub3Qgc2FmZWx5IG1hcCBwbGF0Zm9ybSBjb2xvciBhc3BlY3RzIChSOiV1KCVzKSBTOiV1KCVzKSBUOiV1KCVzKSB0byAiCisgICAgICAgICAgICAgICJncmFwaGljcyBkYXRhc3BhY2UgKFI6JXUgUzoldSBUOiV1KSIsCisgICAgICAgICAgICAgIHJhbmdlLCBhc1N0cmluZyhyYW5nZSksIHN0YW5kYXJkLCBhc1N0cmluZyhzdGFuZGFyZCksIHRyYW5zZmVyLCBhc1N0cmluZyh0cmFuc2ZlciksCisgICAgICAgICAgICAgIGdmeFJhbmdlLCBnZnhTdGFuZGFyZCwgZ2Z4VHJhbnNmZXIpOworICAgIH0KKwogICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSA9IChhbmRyb2lkX2RhdGFzcGFjZSkoCi0gICAgICAgICAgICAocmFuZ2UgPDwgSEFMX0RBVEFTUEFDRV9SQU5HRV9TSElGVCkgfCAoc3RhbmRhcmQgPDwgSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9TSElGVCkgfAotICAgICAgICAgICAgKHRyYW5zZmVyIDw8IEhBTF9EQVRBU1BBQ0VfVFJBTlNGRVJfU0hJRlQpKTsKKyAgICAgICAgICAgIChnZnhSYW5nZSA8PCBIQUxfREFUQVNQQUNFX1JBTkdFX1NISUZUKSB8CisgICAgICAgICAgICAoZ2Z4U3RhbmRhcmQgPDwgSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9TSElGVCkgfAorICAgICAgICAgICAgKGdmeFRyYW5zZmVyIDw8IEhBTF9EQVRBU1BBQ0VfVFJBTlNGRVJfU0hJRlQpKTsKICAgICAodm9pZClzTGVnYWN5RGF0YVNwYWNlVG9WMC5ybG9va3VwKGRhdGFTcGFjZSwgJmRhdGFTcGFjZSk7CiAKICAgICBpZiAoIW1heUV4cGFuZCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhQnVmZmVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYwMDBlZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhQnVmZmVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJNZWRpYUJ1ZmZlciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0KLSNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLyogc3RhdGljICovCi1zdGQ6OmF0b21pY19pbnRfbGVhc3QzMl90IE1lZGlhQnVmZmVyOjptVXNlU2hhcmVkTWVtb3J5KDApOwotCi1NZWRpYUJ1ZmZlcjo6TWVkaWFCdWZmZXIodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpCi0gICAgOiBtT2JzZXJ2ZXIoTlVMTCksCi0gICAgICBtUmVmQ291bnQoMCksCi0gICAgICBtRGF0YShkYXRhKSwKLSAgICAgIG1TaXplKHNpemUpLAotICAgICAgbVJhbmdlT2Zmc2V0KDApLAotICAgICAgbVJhbmdlTGVuZ3RoKHNpemUpLAotICAgICAgbU93bnNEYXRhKGZhbHNlKSwKLSAgICAgIG1NZXRhRGF0YShuZXcgTWV0YURhdGEpLAotICAgICAgbU9yaWdpbmFsKE5VTEwpIHsKLX0KLQotTWVkaWFCdWZmZXI6Ok1lZGlhQnVmZmVyKHNpemVfdCBzaXplKQotICAgIDogbU9ic2VydmVyKE5VTEwpLAotICAgICAgbVJlZkNvdW50KDApLAotICAgICAgbURhdGEoTlVMTCksCi0gICAgICBtU2l6ZShzaXplKSwKLSAgICAgIG1SYW5nZU9mZnNldCgwKSwKLSAgICAgIG1SYW5nZUxlbmd0aChzaXplKSwKLSAgICAgIG1Pd25zRGF0YSh0cnVlKSwKLSAgICAgIG1NZXRhRGF0YShuZXcgTWV0YURhdGEpLAotICAgICAgbU9yaWdpbmFsKE5VTEwpIHsKLSAgICBpZiAoc2l6ZSA8IGtTaGFyZWRNZW1UaHJlc2hvbGQKLSAgICAgICAgICAgIHx8IHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoJm1Vc2VTaGFyZWRNZW1vcnksIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpID09IDApIHsKLSAgICAgICAgbURhdGEgPSBtYWxsb2Moc2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoImNyZWF0aW5nIG1lbW9yeURlYWxlciIpOwotICAgICAgICBzcDxNZW1vcnlEZWFsZXI+IG1lbW9yeURlYWxlciA9Ci0gICAgICAgICAgICAgICAgbmV3IE1lbW9yeURlYWxlcihzaXplICsgc2l6ZW9mKFNoYXJlZENvbnRyb2wpLCAiTWVkaWFCdWZmZXIiKTsKLSAgICAgICAgbU1lbW9yeSA9IG1lbW9yeURlYWxlci0+YWxsb2NhdGUoc2l6ZSArIHNpemVvZihTaGFyZWRDb250cm9sKSk7Ci0gICAgICAgIGlmIChtTWVtb3J5ID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gYWxsb2NhdGUgc2hhcmVkIG1lbW9yeSwgdHJ5aW5nIHJlZ3VsYXIgYWxsb2NhdGlvbiEiKTsKLSAgICAgICAgICAgIG1EYXRhID0gbWFsbG9jKHNpemUpOwotICAgICAgICAgICAgaWYgKG1EYXRhID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiT3V0IG9mIG1lbW9yeSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZ2V0U2hhcmVkQ29udHJvbCgpLT5jbGVhcigpOwotICAgICAgICAgICAgbURhdGEgPSAodWludDhfdCAqKW1NZW1vcnktPnBvaW50ZXIoKSArIHNpemVvZihTaGFyZWRDb250cm9sKTsKLSAgICAgICAgICAgIEFMT0dWKCJBbGxvY2F0ZWQgc2hhcmVkIG1lbSBidWZmZXIgb2Ygc2l6ZSAlenUgQCAlcCIsIHNpemUsIG1EYXRhKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotTWVkaWFCdWZmZXI6Ok1lZGlhQnVmZmVyKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBncmFwaGljQnVmZmVyKQotICAgIDogbU9ic2VydmVyKE5VTEwpLAotICAgICAgbVJlZkNvdW50KDApLAotICAgICAgbURhdGEoTlVMTCksCi0gICAgICBtU2l6ZSgxKSwKLSAgICAgIG1SYW5nZU9mZnNldCgwKSwKLSAgICAgIG1SYW5nZUxlbmd0aChtU2l6ZSksCi0gICAgICBtR3JhcGhpY0J1ZmZlcihncmFwaGljQnVmZmVyKSwKLSAgICAgIG1Pd25zRGF0YShmYWxzZSksCi0gICAgICBtTWV0YURhdGEobmV3IE1ldGFEYXRhKSwKLSAgICAgIG1PcmlnaW5hbChOVUxMKSB7Ci19Ci0KLU1lZGlhQnVmZmVyOjpNZWRpYUJ1ZmZlcihjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKQotICAgIDogbU9ic2VydmVyKE5VTEwpLAotICAgICAgbVJlZkNvdW50KDApLAotICAgICAgbURhdGEoYnVmZmVyLT5kYXRhKCkpLAotICAgICAgbVNpemUoYnVmZmVyLT5zaXplKCkpLAotICAgICAgbVJhbmdlT2Zmc2V0KDApLAotICAgICAgbVJhbmdlTGVuZ3RoKG1TaXplKSwKLSAgICAgIG1CdWZmZXIoYnVmZmVyKSwKLSAgICAgIG1Pd25zRGF0YShmYWxzZSksCi0gICAgICBtTWV0YURhdGEobmV3IE1ldGFEYXRhKSwKLSAgICAgIG1PcmlnaW5hbChOVUxMKSB7Ci19Ci0KLXZvaWQgTWVkaWFCdWZmZXI6OnJlbGVhc2UoKSB7Ci0gICAgaWYgKG1PYnNlcnZlciA9PSBOVUxMKSB7Ci0gICAgICAgIC8vIExlZ2FjeSBjb250cmFjdCBmb3IgTWVkaWFCdWZmZXIgd2l0aG91dCBhIE1lZGlhQnVmZmVyR3JvdXAuCi0gICAgICAgIENIRUNLX0VRKG1SZWZDb3VudCwgMCk7Ci0gICAgICAgIGRlbGV0ZSB0aGlzOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaW50IHByZXZDb3VudCA9IF9fc3luY19mZXRjaF9hbmRfc3ViKCZtUmVmQ291bnQsIDEpOwotICAgIGlmIChwcmV2Q291bnQgPT0gMSkgewotICAgICAgICBpZiAobU9ic2VydmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIGRlbGV0ZSB0aGlzOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbU9ic2VydmVyLT5zaWduYWxCdWZmZXJSZXR1cm5lZCh0aGlzKTsKLSAgICB9Ci0gICAgQ0hFQ0socHJldkNvdW50ID4gMCk7Ci19Ci0KLXZvaWQgTWVkaWFCdWZmZXI6OmNsYWltKCkgewotICAgIENIRUNLKG1PYnNlcnZlciAhPSBOVUxMKTsKLSAgICBDSEVDS19FUShtUmVmQ291bnQsIDEpOwotCi0gICAgbVJlZkNvdW50ID0gMDsKLX0KLQotdm9pZCBNZWRpYUJ1ZmZlcjo6YWRkX3JlZigpIHsKLSAgICAodm9pZCkgX19zeW5jX2ZldGNoX2FuZF9hZGQoJm1SZWZDb3VudCwgMSk7Ci19Ci0KLXZvaWQgKk1lZGlhQnVmZmVyOjpkYXRhKCkgY29uc3QgewotICAgIENIRUNLKG1HcmFwaGljQnVmZmVyID09IE5VTEwpOwotICAgIHJldHVybiBtRGF0YTsKLX0KLQotc2l6ZV90IE1lZGlhQnVmZmVyOjpzaXplKCkgY29uc3QgewotICAgIENIRUNLKG1HcmFwaGljQnVmZmVyID09IE5VTEwpOwotICAgIHJldHVybiBtU2l6ZTsKLX0KLQotc2l6ZV90IE1lZGlhQnVmZmVyOjpyYW5nZV9vZmZzZXQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1SYW5nZU9mZnNldDsKLX0KLQotc2l6ZV90IE1lZGlhQnVmZmVyOjpyYW5nZV9sZW5ndGgoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1SYW5nZUxlbmd0aDsKLX0KLQotdm9pZCBNZWRpYUJ1ZmZlcjo6c2V0X3JhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpIHsKLSAgICBpZiAoKG1HcmFwaGljQnVmZmVyID09IE5VTEwpICYmIChvZmZzZXQgKyBsZW5ndGggPiBtU2l6ZSkpIHsKLSAgICAgICAgQUxPR0UoIm9mZnNldCA9ICV6dSwgbGVuZ3RoID0gJXp1LCBtU2l6ZSA9ICV6dSIsIG9mZnNldCwgbGVuZ3RoLCBtU2l6ZSk7Ci0gICAgfQotICAgIENIRUNLKChtR3JhcGhpY0J1ZmZlciAhPSBOVUxMKSB8fCAob2Zmc2V0ICsgbGVuZ3RoIDw9IG1TaXplKSk7Ci0KLSAgICBtUmFuZ2VPZmZzZXQgPSBvZmZzZXQ7Ci0gICAgbVJhbmdlTGVuZ3RoID0gbGVuZ3RoOwotfQotCi1zcDxHcmFwaGljQnVmZmVyPiBNZWRpYUJ1ZmZlcjo6Z3JhcGhpY0J1ZmZlcigpIGNvbnN0IHsKLSAgICByZXR1cm4gbUdyYXBoaWNCdWZmZXI7Ci19Ci0KLXNwPE1ldGFEYXRhPiBNZWRpYUJ1ZmZlcjo6bWV0YV9kYXRhKCkgewotICAgIHJldHVybiBtTWV0YURhdGE7Ci19Ci0KLXZvaWQgTWVkaWFCdWZmZXI6OnJlc2V0KCkgewotICAgIG1NZXRhRGF0YS0+Y2xlYXIoKTsKLSAgICBzZXRfcmFuZ2UoMCwgbVNpemUpOwotfQotCi1NZWRpYUJ1ZmZlcjo6fk1lZGlhQnVmZmVyKCkgewotICAgIENIRUNLKG1PYnNlcnZlciA9PSBOVUxMKTsKLQotICAgIGlmIChtT3duc0RhdGEgJiYgbURhdGEgIT0gTlVMTCAmJiBtTWVtb3J5ID09IE5VTEwpIHsKLSAgICAgICAgZnJlZShtRGF0YSk7Ci0gICAgICAgIG1EYXRhID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAobU9yaWdpbmFsICE9IE5VTEwpIHsKLSAgICAgICAgbU9yaWdpbmFsLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1PcmlnaW5hbCA9IE5VTEw7Ci0gICAgfQotCi0gICBpZiAobU1lbW9yeS5nZXQoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgZ2V0U2hhcmVkQ29udHJvbCgpLT5zZXREZWFkT2JqZWN0KCk7Ci0gICB9Ci19Ci0KLXZvaWQgTWVkaWFCdWZmZXI6OnNldE9ic2VydmVyKE1lZGlhQnVmZmVyT2JzZXJ2ZXIgKm9ic2VydmVyKSB7Ci0gICAgQ0hFQ0sob2JzZXJ2ZXIgPT0gTlVMTCB8fCBtT2JzZXJ2ZXIgPT0gTlVMTCk7Ci0gICAgbU9ic2VydmVyID0gb2JzZXJ2ZXI7Ci19Ci0KLU1lZGlhQnVmZmVyICpNZWRpYUJ1ZmZlcjo6Y2xvbmUoKSB7Ci0gICAgQ0hFQ0sobUdyYXBoaWNCdWZmZXIgPT0gTlVMTCk7Ci0KLSAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKG1EYXRhLCBtU2l6ZSk7Ci0gICAgYnVmZmVyLT5zZXRfcmFuZ2UobVJhbmdlT2Zmc2V0LCBtUmFuZ2VMZW5ndGgpOwotICAgIGJ1ZmZlci0+bU1ldGFEYXRhID0gbmV3IE1ldGFEYXRhKCptTWV0YURhdGEuZ2V0KCkpOwotCi0gICAgYWRkX3JlZigpOwotICAgIGJ1ZmZlci0+bU9yaWdpbmFsID0gdGhpczsKLQotICAgIHJldHVybiBidWZmZXI7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhQnVmZmVyR3JvdXAuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlckdyb3VwLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I2MmQ5Mi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhQnVmZmVyR3JvdXAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIk1lZGlhQnVmZmVyR3JvdXAiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIHN0ZDo6bWluIGlzIG5vdCBjb25zdGV4cHIgaW4gQysrMTEKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1jb25zdGV4cHIgVCBNSU4oY29uc3QgVCAmYSwgY29uc3QgVCAmYikgeyByZXR1cm4gYSA8PSBiID8gYSA6IGI7IH0KLQotLy8gTWVkaWFCdWZmZXJHcm91cCBtYXkgY3JlYXRlIHNoYXJlZCBtZW1vcnkgYnVmZmVycyBhdCBhCi0vLyBzbWFsbGVyIHRocmVzaG9sZCB0aGFuIGFuIGlzb2xhdGVkIG5ldyBNZWRpYUJ1ZmZlci4KLXN0YXRpYyBjb25zdCBzaXplX3Qga1NoYXJlZE1lbW9yeVRocmVzaG9sZCA9IE1JTigKLSAgICAgICAgKHNpemVfdClNZWRpYUJ1ZmZlcjo6a1NoYXJlZE1lbVRocmVzaG9sZCwgKHNpemVfdCkoNCAqIDEwMjQpKTsKLQotTWVkaWFCdWZmZXJHcm91cDo6TWVkaWFCdWZmZXJHcm91cChzaXplX3QgZ3Jvd3RoTGltaXQpIDoKLSAgICBtR3Jvd3RoTGltaXQoZ3Jvd3RoTGltaXQpIHsKLX0KLQotTWVkaWFCdWZmZXJHcm91cDo6TWVkaWFCdWZmZXJHcm91cChzaXplX3QgYnVmZmVycywgc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgZ3Jvd3RoTGltaXQpCi0gICAgOiBtR3Jvd3RoTGltaXQoZ3Jvd3RoTGltaXQpIHsKLQotICAgIGlmIChtR3Jvd3RoTGltaXQgPiAwICYmIGJ1ZmZlcnMgPiBtR3Jvd3RoTGltaXQpIHsKLSAgICAgICAgQUxPR1coIlByZWFsbG9jYXRlZCBidWZmZXJzICV6dSA+IGdyb3d0aExpbWl0ICV6dSwgaW5jcmVhc2luZyBncm93dGhMaW1pdCIsCi0gICAgICAgICAgICAgICAgYnVmZmVycywgbUdyb3d0aExpbWl0KTsKLSAgICAgICAgbUdyb3d0aExpbWl0ID0gYnVmZmVyczsKLSAgICB9Ci0KLSAgICBpZiAoYnVmZmVyX3NpemUgPj0ga1NoYXJlZE1lbW9yeVRocmVzaG9sZCkgewotICAgICAgICBBTE9HRCgiY3JlYXRpbmcgTWVtb3J5RGVhbGVyIik7Ci0gICAgICAgIC8vIFVzaW5nIGEgc2luZ2xlIE1lbW9yeURlYWxlciBpcyBlZmZpY2llbnQgZm9yIGEgZ3JvdXAgb2Ygc2hhcmVkIG1lbW9yeSBvYmplY3RzLgotICAgICAgICAvLyBUaGlzIGxvb3AgZ3VhcmFudGVlcyB0aGF0IHdlIHVzZSBzaGFyZWQgbWVtb3J5IChubyBmYWxsYmFjayB0byBtYWxsb2MpLgotCi0gICAgICAgIHNpemVfdCBhbGlnbm1lbnQgPSBNZW1vcnlEZWFsZXI6OmdldEFsbG9jYXRpb25BbGlnbm1lbnQoKTsKLSAgICAgICAgc2l6ZV90IGF1Z21lbnRlZF9zaXplID0gYnVmZmVyX3NpemUgKyBzaXplb2YoTWVkaWFCdWZmZXI6OlNoYXJlZENvbnRyb2wpOwotICAgICAgICBzaXplX3QgdG90YWwgPSAoYXVnbWVudGVkX3NpemUgKyBhbGlnbm1lbnQgLSAxKSAvIGFsaWdubWVudCAqIGFsaWdubWVudCAqIGJ1ZmZlcnM7Ci0gICAgICAgIHNwPE1lbW9yeURlYWxlcj4gbWVtb3J5RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcih0b3RhbCwgIk1lZGlhQnVmZmVyR3JvdXAiKTsKLQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ1ZmZlcnM7ICsraSkgewotICAgICAgICAgICAgc3A8SU1lbW9yeT4gbWVtID0gbWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShhdWdtZW50ZWRfc2l6ZSk7Ci0gICAgICAgICAgICBpZiAobWVtLmdldCgpID09IG51bGxwdHIgfHwgbWVtLT5wb2ludGVyKCkgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dXKCJPbmx5IGFsbG9jYXRlZCAlenUgc2hhcmVkIGJ1ZmZlcnMgb2Ygc2l6ZSAlenUiLCBpLCBidWZmZXJfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKG1lbSk7Ci0gICAgICAgICAgICBidWZmZXItPmdldFNoYXJlZENvbnRyb2woKS0+Y2xlYXIoKTsKLSAgICAgICAgICAgIGFkZF9idWZmZXIoYnVmZmVyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gTm9uLXNoYXJlZCBtZW1vcnkgYWxsb2NhdGlvbi4KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ1ZmZlcnM7ICsraSkgewotICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKGJ1ZmZlcl9zaXplKTsKLSAgICAgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBidWZmZXI7IC8vIGRvbid0IGNhbGwgcmVsZWFzZSwgaXQncyBub3QgcHJvcGVybHkgZm9ybWVkCi0gICAgICAgICAgICBBTE9HVygiT25seSBhbGxvY2F0ZWQgJXp1IG1hbGxvYyBidWZmZXJzIG9mIHNpemUgJXp1IiwgaSwgYnVmZmVyX3NpemUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYWRkX2J1ZmZlcihidWZmZXIpOwotICAgIH0KLX0KLQotTWVkaWFCdWZmZXJHcm91cDo6fk1lZGlhQnVmZmVyR3JvdXAoKSB7Ci0gICAgZm9yIChNZWRpYUJ1ZmZlciAqYnVmZmVyIDogbUJ1ZmZlcnMpIHsKLSAgICAgICAgaWYgKGJ1ZmZlci0+cmVmY291bnQoKSAhPSAwKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQgbG9jYWxSZWZjb3VudCA9IGJ1ZmZlci0+bG9jYWxSZWZjb3VudCgpOwotICAgICAgICAgICAgY29uc3QgaW50IHJlbW90ZVJlZmNvdW50ID0gYnVmZmVyLT5yZW1vdGVSZWZjb3VudCgpOwotCi0gICAgICAgICAgICAvLyBGYXRhbCBpZiB3ZSBoYXZlIGEgbG9jYWwgcmVmY291bnQuCi0gICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGxvY2FsUmVmY291bnQgIT0gMCwKLSAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciglcCkgbG9jYWxSZWZjb3VudCAlZCAhPSAwLCByZW1vdGVSZWZjb3VudCAlZCIsCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgbG9jYWxSZWZjb3VudCwgcmVtb3RlUmVmY291bnQpOwotCi0gICAgICAgICAgICAvLyBMb2cgYW4gZXJyb3IgaWYgd2UgaGF2ZSBhIHJlbWFpbmluZyByZW1vdGUgcmVmY291bnQsCi0gICAgICAgICAgICAvLyBhcyB0aGUgcmVtb3RlIHByb2Nlc3MgbWF5IGhhdmUgZGllZCBvciBtYXkgaGF2ZSBpbmFwcHJvcHJpYXRlIGJlaGF2aW9yLgotICAgICAgICAgICAgLy8gVGhlIHNoYXJlZCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBNZWRpYUJ1ZmZlciB3aWxsCi0gICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGJlIHJlY2xhaW1lZCB3aGVuIHRoZXJlIGFyZSBubyByZW1haW5pbmcgZmRzCi0gICAgICAgICAgICAvLyBhc3NvY2lhdGVkIHdpdGggaXQuCi0gICAgICAgICAgICBBTE9HRSgiYnVmZmVyKCVwKSBoYXMgcmVzaWR1YWwgcmVtb3RlUmVmY291bnQgJWQiLAotICAgICAgICAgICAgICAgICAgICBidWZmZXIsIHJlbW90ZVJlZmNvdW50KTsKLSAgICAgICAgfQotICAgICAgICAvLyBncmFjZWZ1bGx5IGRlbGV0ZS4KLSAgICAgICAgYnVmZmVyLT5zZXRPYnNlcnZlcihudWxscHRyKTsKLSAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgfQotfQotCi12b2lkIE1lZGlhQnVmZmVyR3JvdXA6OmFkZF9idWZmZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAvLyBpZiB3ZSdyZSBhYm92ZSBvdXIgZ3Jvd3RoIGxpbWl0LCByZWxlYXNlIGJ1ZmZlcnMgaWYgd2UgY2FuCi0gICAgZm9yIChhdXRvIGl0ID0gbUJ1ZmZlcnMuYmVnaW4oKTsKLSAgICAgICAgICAgIG1Hcm93dGhMaW1pdCA+IDAKLSAgICAgICAgICAgICYmIG1CdWZmZXJzLnNpemUoKSA+PSBtR3Jvd3RoTGltaXQKLSAgICAgICAgICAgICYmIGl0ICE9IG1CdWZmZXJzLmVuZCgpOykgewotICAgICAgICBpZiAoKCppdCktPnJlZmNvdW50KCkgPT0gMCkgewotICAgICAgICAgICAgKCppdCktPnNldE9ic2VydmVyKG51bGxwdHIpOwotICAgICAgICAgICAgKCppdCktPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIGl0ID0gbUJ1ZmZlcnMuZXJhc2UoaXQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKytpdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJ1ZmZlci0+c2V0T2JzZXJ2ZXIodGhpcyk7Ci0gICAgbUJ1ZmZlcnMuZW1wbGFjZV9iYWNrKGJ1ZmZlcik7Ci19Ci0KLWJvb2wgTWVkaWFCdWZmZXJHcm91cDo6aGFzX2J1ZmZlcnMoKSB7Ci0gICAgaWYgKG1CdWZmZXJzLnNpemUoKSA8IG1Hcm93dGhMaW1pdCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gV2UgY2FuIGFkZCBtb3JlIGJ1ZmZlcnMgaW50ZXJuYWxseS4KLSAgICB9Ci0gICAgZm9yIChNZWRpYUJ1ZmZlciAqYnVmZmVyIDogbUJ1ZmZlcnMpIHsKLSAgICAgICAgaWYgKGJ1ZmZlci0+cmVmY291bnQoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXR1c190IE1lZGlhQnVmZmVyR3JvdXA6OmFjcXVpcmVfYnVmZmVyKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgYm9vbCBub25CbG9ja2luZywgc2l6ZV90IHJlcXVlc3RlZFNpemUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIGZvciAoOzspIHsKLSAgICAgICAgc2l6ZV90IHNtYWxsZXN0ID0gcmVxdWVzdGVkU2l6ZTsKLSAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9IG51bGxwdHI7Ci0gICAgICAgIGF1dG8gZnJlZSA9IG1CdWZmZXJzLmVuZCgpOwotICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtQnVmZmVycy5lbmQoKTsgKytpdCkgewotICAgICAgICAgICAgaWYgKCgqaXQpLT5yZWZjb3VudCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSA9ICgqaXQpLT5zaXplKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNpemUgPj0gcmVxdWVzdGVkU2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSAqaXQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IHNtYWxsZXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHNtYWxsZXN0ID0gc2l6ZTsgLy8gYWx3YXlzIGZyZWUgdGhlIHNtYWxsZXN0IGJ1ZgotICAgICAgICAgICAgICAgICAgICBmcmVlID0gaXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cgotICAgICAgICAgICAgICAgICYmIChmcmVlICE9IG1CdWZmZXJzLmVuZCgpIHx8IG1CdWZmZXJzLnNpemUoKSA8IG1Hcm93dGhMaW1pdCkpIHsKLSAgICAgICAgICAgIC8vIFdlIGFsbG9jIGJlZm9yZSB3ZSBmcmVlIHNvIGZhaWx1cmUgbGVhdmVzIGdyb3VwIHVuY2hhbmdlZC4KLSAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhbGxvY2F0ZVNpemUgPSByZXF1ZXN0ZWRTaXplIDwgU0laRV9NQVggLyAzICogMiAvKiBOQjogb3JkZXJpbmcgKi8gPwotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRTaXplICogMyAvIDIgOiByZXF1ZXN0ZWRTaXplOwotICAgICAgICAgICAgYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKGFsbG9jYXRlU2l6ZSk7Ci0gICAgICAgICAgICBpZiAoYnVmZmVyLT5kYXRhKCkgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUgZm9yIHNpemUgJXp1IiwgYWxsb2NhdGVTaXplKTsKLSAgICAgICAgICAgICAgICBkZWxldGUgYnVmZmVyOyAvLyBJbnZhbGlkIGFsbG9jLCBwcmVmZXIgbm90IHRvIGNhbGwgcmVsZWFzZS4KLSAgICAgICAgICAgICAgICBidWZmZXIgPSBudWxscHRyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWZmZXItPnNldE9ic2VydmVyKHRoaXMpOwotICAgICAgICAgICAgICAgIGlmIChmcmVlICE9IG1CdWZmZXJzLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJyZWFsbG9jYXRlIGJ1ZmZlciwgcmVxdWVzdGVkIHNpemUgJXp1IHZzIGF2YWlsYWJsZSAlenUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFNpemUsICgqZnJlZSktPnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICgqZnJlZSktPnNldE9ic2VydmVyKG51bGxwdHIpOwotICAgICAgICAgICAgICAgICAgICAoKmZyZWUpLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICpmcmVlID0gYnVmZmVyOyAvLyBpbi1wbGFjZSByZXBsYWNlCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImFsbG9jYXRlIGJ1ZmZlciwgcmVxdWVzdGVkIHNpemUgJXp1IiwgcmVxdWVzdGVkU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXJzLmVtcGxhY2VfYmFjayhidWZmZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoYnVmZmVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGJ1ZmZlci0+YWRkX3JlZigpOwotICAgICAgICAgICAgYnVmZmVyLT5yZXNldCgpOwotICAgICAgICAgICAgKm91dCA9IGJ1ZmZlcjsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgICAgICBpZiAobm9uQmxvY2tpbmcpIHsKLSAgICAgICAgICAgICpvdXQgPSBudWxscHRyOwotICAgICAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOwotICAgICAgICB9Ci0gICAgICAgIC8vIEFsbCBidWZmZXJzIGFyZSBpbiB1c2UsIGJsb2NrIHVudGlsIG9uZSBvZiB0aGVtIGlzIHJldHVybmVkLgotICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOwotICAgIH0KLSAgICAvLyBOZXZlciBnZXRzIGhlcmUuCi19Ci0KLXZvaWQgTWVkaWFCdWZmZXJHcm91cDo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIgKikgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjk1Yzc1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuY3BwCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9JTUFHRV9KUEVHID0gImltYWdlL2pwZWciOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDID0gImltYWdlL3ZuZC5hbmRyb2lkLmhlaWMiOworCitjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19WUDggPSAidmlkZW8veC12bmQub24yLnZwOCI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19WUDkgPSAidmlkZW8veC12bmQub24yLnZwOSI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19BVkMgPSAidmlkZW8vYXZjIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMgPSAidmlkZW8vaGV2YyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCA9ICJ2aWRlby9tcDR2LWVzIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMgPSAidmlkZW8vM2dwcCI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMiA9ICJ2aWRlby9tcGVnMiI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19SQVcgPSAidmlkZW8vcmF3IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0RPTEJZX1ZJU0lPTiA9ICJ2aWRlby9kb2xieS12aXNpb24iOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fU0NSQU1CTEVEID0gInZpZGVvL3NjcmFtYmxlZCI7CisKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiA9ICJhdWRpby8zZ3BwIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiA9ICJhdWRpby9hbXItd2IiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRyA9ICJhdWRpby9tcGVnIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01QRUdfTEFZRVJfSSA9ICJhdWRpby9tcGVnLUwxIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01QRUdfTEFZRVJfSUkgPSAiYXVkaW8vbXBlZy1MMiI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NSURJID0gImF1ZGlvL21pZGkiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDID0gImF1ZGlvL21wNGEtbGF0bSI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19RQ0VMUCA9ICJhdWRpby9xY2VscCI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMgPSAiYXVkaW8vdm9yYmlzIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX09QVVMgPSAiYXVkaW8vb3B1cyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcgPSAiYXVkaW8vZzcxMS1hbGF3IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVyA9ICJhdWRpby9nNzExLW1sYXciOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXID0gImF1ZGlvL3JhdyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDID0gImF1ZGlvL2ZsYWMiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFMgPSAiYXVkaW8vYWFjLWFkdHMiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVNHU00gPSAiYXVkaW8vZ3NtIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FDMyA9ICJhdWRpby9hYzMiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMyA9ICJhdWRpby9lYWMzIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1NDUkFNQkxFRCA9ICJhdWRpby9zY3JhbWJsZWQiOworCitjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzQgPSAidmlkZW8vbXA0IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9XQVYgPSAiYXVkaW8veC13YXYiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX09HRyA9ICJhcHBsaWNhdGlvbi9vZ2ciOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01BVFJPU0tBID0gInZpZGVvL3gtbWF0cm9za2EiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyVFMgPSAidmlkZW8vbXAydHMiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX0FWSSA9ICJ2aWRlby9hdmkiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyUFMgPSAidmlkZW8vbXAycCI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfSEVJRiA9ICJpbWFnZS9oZWlmIjsKKworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQID0gInRleHQvM2dwcC10dCI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUX1NVQlJJUCA9ICJhcHBsaWNhdGlvbi94LXN1YnJpcCI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUX1ZUVCA9ICJ0ZXh0L3Z0dCI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUX0NFQV82MDggPSAidGV4dC9jZWEtNjA4IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1RFWFRfQ0VBXzcwOCA9ICJ0ZXh0L2NlYS03MDgiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfREFUQV9USU1FRF9JRDMgPSAiYXBwbGljYXRpb24veC1pZDN2NCI7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhS2V5cy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhS2V5cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM5MjBjOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFLZXlzLmNwcApAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFLZXlzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3QgY2hhciAqY29uc3Qga0lTdHJlYW1MaXN0ZW5lcktleURpc2NvbnRpbnVpdHlNYXNrID0gImRpc2NvbnRpbnVpdHktbWFzayI7Citjb25zdCBjaGFyICpjb25zdCBrQVRTUGFyc2VyS2V5UmVzdW1lQXRQVFMgPSAicmVzdW1lLWF0LVBUUyI7Citjb25zdCBjaGFyICpjb25zdCBrQVRTUGFyc2VyS2V5TWVkaWFUaW1lVXMgPSAibWVkaWEtdGltZS11cyI7Citjb25zdCBjaGFyICpjb25zdCBrQVRTUGFyc2VyS2V5UmVjZW50TWVkaWFUaW1lVXMgPSAicmVjZW50LW1lZGlhLXRpbWUtdXMiOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZXRhRGF0YS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01ldGFEYXRhLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg5NjVmMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01ldGFEYXRhLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJNZXRhRGF0YSIKLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotTWV0YURhdGE6Ok1ldGFEYXRhKCkgewotfQotCi1NZXRhRGF0YTo6TWV0YURhdGEoY29uc3QgTWV0YURhdGEgJmZyb20pCi0gICAgOiBSZWZCYXNlKCksCi0gICAgICBtSXRlbXMoZnJvbS5tSXRlbXMpIHsKLX0KLQotTWV0YURhdGE6On5NZXRhRGF0YSgpIHsKLSAgICBjbGVhcigpOwotfQotCi12b2lkIE1ldGFEYXRhOjpjbGVhcigpIHsKLSAgICBtSXRlbXMuY2xlYXIoKTsKLX0KLQotYm9vbCBNZXRhRGF0YTo6cmVtb3ZlKHVpbnQzMl90IGtleSkgewotICAgIHNzaXplX3QgaSA9IG1JdGVtcy5pbmRleE9mS2V5KGtleSk7Ci0KLSAgICBpZiAoaSA8IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIG1JdGVtcy5yZW1vdmVJdGVtc0F0KGkpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgTWV0YURhdGE6OnNldENTdHJpbmcodWludDMyX3Qga2V5LCBjb25zdCBjaGFyICp2YWx1ZSkgewotICAgIHJldHVybiBzZXREYXRhKGtleSwgVFlQRV9DX1NUUklORywgdmFsdWUsIHN0cmxlbih2YWx1ZSkgKyAxKTsKLX0KLQotYm9vbCBNZXRhRGF0YTo6c2V0SW50MzIodWludDMyX3Qga2V5LCBpbnQzMl90IHZhbHVlKSB7Ci0gICAgcmV0dXJuIHNldERhdGEoa2V5LCBUWVBFX0lOVDMyLCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOwotfQotCi1ib29sIE1ldGFEYXRhOjpzZXRJbnQ2NCh1aW50MzJfdCBrZXksIGludDY0X3QgdmFsdWUpIHsKLSAgICByZXR1cm4gc2V0RGF0YShrZXksIFRZUEVfSU5UNjQsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Ci19Ci0KLWJvb2wgTWV0YURhdGE6OnNldEZsb2F0KHVpbnQzMl90IGtleSwgZmxvYXQgdmFsdWUpIHsKLSAgICByZXR1cm4gc2V0RGF0YShrZXksIFRZUEVfRkxPQVQsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Ci19Ci0KLWJvb2wgTWV0YURhdGE6OnNldFBvaW50ZXIodWludDMyX3Qga2V5LCB2b2lkICp2YWx1ZSkgewotICAgIHJldHVybiBzZXREYXRhKGtleSwgVFlQRV9QT0lOVEVSLCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOwotfQotCi1ib29sIE1ldGFEYXRhOjpzZXRSZWN0KAotICAgICAgICB1aW50MzJfdCBrZXksCi0gICAgICAgIGludDMyX3QgbGVmdCwgaW50MzJfdCB0b3AsCi0gICAgICAgIGludDMyX3QgcmlnaHQsIGludDMyX3QgYm90dG9tKSB7Ci0gICAgUmVjdCByOwotICAgIHIubUxlZnQgPSBsZWZ0OwotICAgIHIubVRvcCA9IHRvcDsKLSAgICByLm1SaWdodCA9IHJpZ2h0OwotICAgIHIubUJvdHRvbSA9IGJvdHRvbTsKLQotICAgIHJldHVybiBzZXREYXRhKGtleSwgVFlQRV9SRUNULCAmciwgc2l6ZW9mKHIpKTsKLX0KLQotLyoqCi0gKiBOb3RlIHRoYXQgdGhlIHJldHVybmVkIHBvaW50ZXIgYmVjb21lcyBpbnZhbGlkIHdoZW4gYWRkaXRpb25hbCBtZXRhZGF0YSBpcyBzZXQuCi0gKi8KLWJvb2wgTWV0YURhdGE6OmZpbmRDU3RyaW5nKHVpbnQzMl90IGtleSwgY29uc3QgY2hhciAqKnZhbHVlKSB7Ci0gICAgdWludDMyX3QgdHlwZTsKLSAgICBjb25zdCB2b2lkICpkYXRhOwotICAgIHNpemVfdCBzaXplOwotICAgIGlmICghZmluZERhdGEoa2V5LCAmdHlwZSwgJmRhdGEsICZzaXplKSB8fCB0eXBlICE9IFRZUEVfQ19TVFJJTkcpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgICp2YWx1ZSA9IChjb25zdCBjaGFyICopZGF0YTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIE1ldGFEYXRhOjpmaW5kSW50MzIodWludDMyX3Qga2V5LCBpbnQzMl90ICp2YWx1ZSkgewotICAgIHVpbnQzMl90IHR5cGUgPSAwOwotICAgIGNvbnN0IHZvaWQgKmRhdGE7Ci0gICAgc2l6ZV90IHNpemU7Ci0gICAgaWYgKCFmaW5kRGF0YShrZXksICZ0eXBlLCAmZGF0YSwgJnNpemUpIHx8IHR5cGUgIT0gVFlQRV9JTlQzMikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQ0hFQ0tfRVEoc2l6ZSwgc2l6ZW9mKCp2YWx1ZSkpOwotCi0gICAgKnZhbHVlID0gKihpbnQzMl90ICopZGF0YTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIE1ldGFEYXRhOjpmaW5kSW50NjQodWludDMyX3Qga2V5LCBpbnQ2NF90ICp2YWx1ZSkgewotICAgIHVpbnQzMl90IHR5cGUgPSAwOwotICAgIGNvbnN0IHZvaWQgKmRhdGE7Ci0gICAgc2l6ZV90IHNpemU7Ci0gICAgaWYgKCFmaW5kRGF0YShrZXksICZ0eXBlLCAmZGF0YSwgJnNpemUpIHx8IHR5cGUgIT0gVFlQRV9JTlQ2NCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQ0hFQ0tfRVEoc2l6ZSwgc2l6ZW9mKCp2YWx1ZSkpOwotCi0gICAgKnZhbHVlID0gKihpbnQ2NF90ICopZGF0YTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIE1ldGFEYXRhOjpmaW5kRmxvYXQodWludDMyX3Qga2V5LCBmbG9hdCAqdmFsdWUpIHsKLSAgICB1aW50MzJfdCB0eXBlID0gMDsKLSAgICBjb25zdCB2b2lkICpkYXRhOwotICAgIHNpemVfdCBzaXplOwotICAgIGlmICghZmluZERhdGEoa2V5LCAmdHlwZSwgJmRhdGEsICZzaXplKSB8fCB0eXBlICE9IFRZUEVfRkxPQVQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIENIRUNLX0VRKHNpemUsIHNpemVvZigqdmFsdWUpKTsKLQotICAgICp2YWx1ZSA9ICooZmxvYXQgKilkYXRhOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgTWV0YURhdGE6OmZpbmRQb2ludGVyKHVpbnQzMl90IGtleSwgdm9pZCAqKnZhbHVlKSB7Ci0gICAgdWludDMyX3QgdHlwZSA9IDA7Ci0gICAgY29uc3Qgdm9pZCAqZGF0YTsKLSAgICBzaXplX3Qgc2l6ZTsKLSAgICBpZiAoIWZpbmREYXRhKGtleSwgJnR5cGUsICZkYXRhLCAmc2l6ZSkgfHwgdHlwZSAhPSBUWVBFX1BPSU5URVIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIENIRUNLX0VRKHNpemUsIHNpemVvZigqdmFsdWUpKTsKLQotICAgICp2YWx1ZSA9ICoodm9pZCAqKilkYXRhOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgTWV0YURhdGE6OmZpbmRSZWN0KAotICAgICAgICB1aW50MzJfdCBrZXksCi0gICAgICAgIGludDMyX3QgKmxlZnQsIGludDMyX3QgKnRvcCwKLSAgICAgICAgaW50MzJfdCAqcmlnaHQsIGludDMyX3QgKmJvdHRvbSkgewotICAgIHVpbnQzMl90IHR5cGUgPSAwOwotICAgIGNvbnN0IHZvaWQgKmRhdGE7Ci0gICAgc2l6ZV90IHNpemU7Ci0gICAgaWYgKCFmaW5kRGF0YShrZXksICZ0eXBlLCAmZGF0YSwgJnNpemUpIHx8IHR5cGUgIT0gVFlQRV9SRUNUKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBDSEVDS19FUShzaXplLCBzaXplb2YoUmVjdCkpOwotCi0gICAgY29uc3QgUmVjdCAqciA9IChjb25zdCBSZWN0ICopZGF0YTsKLSAgICAqbGVmdCA9IHItPm1MZWZ0OwotICAgICp0b3AgPSByLT5tVG9wOwotICAgICpyaWdodCA9IHItPm1SaWdodDsKLSAgICAqYm90dG9tID0gci0+bUJvdHRvbTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIE1ldGFEYXRhOjpzZXREYXRhKAotICAgICAgICB1aW50MzJfdCBrZXksIHVpbnQzMl90IHR5cGUsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgYm9vbCBvdmVyd3JvdGVfZXhpc3RpbmcgPSB0cnVlOwotCi0gICAgc3NpemVfdCBpID0gbUl0ZW1zLmluZGV4T2ZLZXkoa2V5KTsKLSAgICBpZiAoaSA8IDApIHsKLSAgICAgICAgdHlwZWRfZGF0YSBpdGVtOwotICAgICAgICBpID0gbUl0ZW1zLmFkZChrZXksIGl0ZW0pOwotCi0gICAgICAgIG92ZXJ3cm90ZV9leGlzdGluZyA9IGZhbHNlOwotICAgIH0KLQotICAgIHR5cGVkX2RhdGEgJml0ZW0gPSBtSXRlbXMuZWRpdFZhbHVlQXQoaSk7Ci0KLSAgICBpdGVtLnNldERhdGEodHlwZSwgZGF0YSwgc2l6ZSk7Ci0KLSAgICByZXR1cm4gb3Zlcndyb3RlX2V4aXN0aW5nOwotfQotCi1ib29sIE1ldGFEYXRhOjpmaW5kRGF0YSh1aW50MzJfdCBrZXksIHVpbnQzMl90ICp0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqKmRhdGEsIHNpemVfdCAqc2l6ZSkgY29uc3QgewotICAgIHNzaXplX3QgaSA9IG1JdGVtcy5pbmRleE9mS2V5KGtleSk7Ci0KLSAgICBpZiAoaSA8IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNvbnN0IHR5cGVkX2RhdGEgJml0ZW0gPSBtSXRlbXMudmFsdWVBdChpKTsKLQotICAgIGl0ZW0uZ2V0RGF0YSh0eXBlLCBkYXRhLCBzaXplKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIE1ldGFEYXRhOjpoYXNEYXRhKHVpbnQzMl90IGtleSkgY29uc3QgewotICAgIHNzaXplX3QgaSA9IG1JdGVtcy5pbmRleE9mS2V5KGtleSk7Ci0KLSAgICBpZiAoaSA8IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1NZXRhRGF0YTo6dHlwZWRfZGF0YTo6dHlwZWRfZGF0YSgpCi0gICAgOiBtVHlwZSgwKSwKLSAgICAgIG1TaXplKDApIHsKLX0KLQotTWV0YURhdGE6OnR5cGVkX2RhdGE6On50eXBlZF9kYXRhKCkgewotICAgIGNsZWFyKCk7Ci19Ci0KLU1ldGFEYXRhOjp0eXBlZF9kYXRhOjp0eXBlZF9kYXRhKGNvbnN0IHR5cGVkX2RhdGEgJmZyb20pCi0gICAgOiBtVHlwZShmcm9tLm1UeXBlKSwKLSAgICAgIG1TaXplKDApIHsKLQotICAgIHZvaWQgKmRzdCA9IGFsbG9jYXRlU3RvcmFnZShmcm9tLm1TaXplKTsKLSAgICBpZiAoZHN0KSB7Ci0gICAgICAgIG1lbWNweShkc3QsIGZyb20uc3RvcmFnZSgpLCBtU2l6ZSk7Ci0gICAgfQotfQotCi1NZXRhRGF0YTo6dHlwZWRfZGF0YSAmTWV0YURhdGE6OnR5cGVkX2RhdGE6Om9wZXJhdG9yPSgKLSAgICAgICAgY29uc3QgTWV0YURhdGE6OnR5cGVkX2RhdGEgJmZyb20pIHsKLSAgICBpZiAodGhpcyAhPSAmZnJvbSkgewotICAgICAgICBjbGVhcigpOwotICAgICAgICBtVHlwZSA9IGZyb20ubVR5cGU7Ci0gICAgICAgIHZvaWQgKmRzdCA9IGFsbG9jYXRlU3RvcmFnZShmcm9tLm1TaXplKTsKLSAgICAgICAgaWYgKGRzdCkgewotICAgICAgICAgICAgbWVtY3B5KGRzdCwgZnJvbS5zdG9yYWdlKCksIG1TaXplKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAqdGhpczsKLX0KLQotdm9pZCBNZXRhRGF0YTo6dHlwZWRfZGF0YTo6Y2xlYXIoKSB7Ci0gICAgZnJlZVN0b3JhZ2UoKTsKLQotICAgIG1UeXBlID0gMDsKLX0KLQotdm9pZCBNZXRhRGF0YTo6dHlwZWRfZGF0YTo6c2V0RGF0YSgKLSAgICAgICAgdWludDMyX3QgdHlwZSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBjbGVhcigpOwotCi0gICAgbVR5cGUgPSB0eXBlOwotCi0gICAgdm9pZCAqZHN0ID0gYWxsb2NhdGVTdG9yYWdlKHNpemUpOwotICAgIGlmIChkc3QpIHsKLSAgICAgICAgbWVtY3B5KGRzdCwgZGF0YSwgc2l6ZSk7Ci0gICAgfQotfQotCi12b2lkIE1ldGFEYXRhOjp0eXBlZF9kYXRhOjpnZXREYXRhKAotICAgICAgICB1aW50MzJfdCAqdHlwZSwgY29uc3Qgdm9pZCAqKmRhdGEsIHNpemVfdCAqc2l6ZSkgY29uc3QgewotICAgICp0eXBlID0gbVR5cGU7Ci0gICAgKnNpemUgPSBtU2l6ZTsKLSAgICAqZGF0YSA9IHN0b3JhZ2UoKTsKLX0KLQotdm9pZCAqTWV0YURhdGE6OnR5cGVkX2RhdGE6OmFsbG9jYXRlU3RvcmFnZShzaXplX3Qgc2l6ZSkgewotICAgIG1TaXplID0gc2l6ZTsKLQotICAgIGlmICh1c2VzUmVzZXJ2b2lyKCkpIHsKLSAgICAgICAgcmV0dXJuICZ1LnJlc2Vydm9pcjsKLSAgICB9Ci0KLSAgICB1LmV4dF9kYXRhID0gbWFsbG9jKG1TaXplKTsKLSAgICBpZiAodS5leHRfZGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZG4ndCBhbGxvY2F0ZSAlenUgYnl0ZXMgZm9yIGl0ZW0iLCBzaXplKTsKLSAgICAgICAgbVNpemUgPSAwOwotICAgIH0KLSAgICByZXR1cm4gdS5leHRfZGF0YTsKLX0KLQotdm9pZCBNZXRhRGF0YTo6dHlwZWRfZGF0YTo6ZnJlZVN0b3JhZ2UoKSB7Ci0gICAgaWYgKCF1c2VzUmVzZXJ2b2lyKCkpIHsKLSAgICAgICAgaWYgKHUuZXh0X2RhdGEpIHsKLSAgICAgICAgICAgIGZyZWUodS5leHRfZGF0YSk7Ci0gICAgICAgICAgICB1LmV4dF9kYXRhID0gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1TaXplID0gMDsKLX0KLQotU3RyaW5nOCBNZXRhRGF0YTo6dHlwZWRfZGF0YTo6YXNTdHJpbmcoYm9vbCB2ZXJib3NlKSBjb25zdCB7Ci0gICAgU3RyaW5nOCBvdXQ7Ci0gICAgY29uc3Qgdm9pZCAqZGF0YSA9IHN0b3JhZ2UoKTsKLSAgICBzd2l0Y2gobVR5cGUpIHsKLSAgICAgICAgY2FzZSBUWVBFX05PTkU6Ci0gICAgICAgICAgICBvdXQgPSBTdHJpbmc4Ojpmb3JtYXQoIm5vIHR5cGUsIHNpemUgJXp1KSIsIG1TaXplKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRZUEVfQ19TVFJJTkc6Ci0gICAgICAgICAgICBvdXQgPSBTdHJpbmc4Ojpmb3JtYXQoIihjaGFyKikgJXMiLCAoY29uc3QgY2hhciAqKWRhdGEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFlQRV9JTlQzMjoKLSAgICAgICAgICAgIG91dCA9IFN0cmluZzg6OmZvcm1hdCgiKGludDMyX3QpICVkIiwgKihpbnQzMl90ICopZGF0YSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUWVBFX0lOVDY0OgotICAgICAgICAgICAgb3V0ID0gU3RyaW5nODo6Zm9ybWF0KCIoaW50NjRfdCkgJSIgUFJJZDY0LCAqKGludDY0X3QgKilkYXRhKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRZUEVfRkxPQVQ6Ci0gICAgICAgICAgICBvdXQgPSBTdHJpbmc4Ojpmb3JtYXQoIihmbG9hdCkgJWYiLCAqKGZsb2F0ICopZGF0YSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUWVBFX1BPSU5URVI6Ci0gICAgICAgICAgICBvdXQgPSBTdHJpbmc4Ojpmb3JtYXQoIih2b2lkKikgJXAiLCAqKHZvaWQgKiopZGF0YSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUWVBFX1JFQ1Q6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IFJlY3QgKnIgPSAoY29uc3QgUmVjdCAqKWRhdGE7Ci0gICAgICAgICAgICBvdXQgPSBTdHJpbmc4Ojpmb3JtYXQoIlJlY3QoJWQsICVkLCAlZCwgJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5tTGVmdCwgci0+bVRvcCwgci0+bVJpZ2h0LCByLT5tQm90dG9tKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIG91dCA9IFN0cmluZzg6OmZvcm1hdCgiKHVua25vd24gdHlwZSAlZCwgc2l6ZSAlenUpIiwgbVR5cGUsIG1TaXplKTsKLSAgICAgICAgICAgIGlmICh2ZXJib3NlICYmIG1TaXplIDw9IDQ4KSB7IC8vIGlmIGl0J3MgbGVzcyB0aGFuIHRocmVlIGxpbmVzIG9mIGhleCBkYXRhLCBkdW1wIGl0Ci0gICAgICAgICAgICAgICAgQVN0cmluZyBmb287Ci0gICAgICAgICAgICAgICAgaGV4ZHVtcChkYXRhLCBtU2l6ZSwgMCwgJmZvbyk7Ci0gICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKGZvby5jX3N0cigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gb3V0OwotfQotCi1zdGF0aWMgdm9pZCBNYWtlRm91ckNDU3RyaW5nKHVpbnQzMl90IHgsIGNoYXIgKnMpIHsKLSAgICBzWzBdID0geCA+PiAyNDsKLSAgICBzWzFdID0gKHggPj4gMTYpICYgMHhmZjsKLSAgICBzWzJdID0gKHggPj4gOCkgJiAweGZmOwotICAgIHNbM10gPSB4ICYgMHhmZjsKLSAgICBzWzRdID0gJ1wwJzsKLX0KLQotU3RyaW5nOCBNZXRhRGF0YTo6dG9TdHJpbmcoKSBjb25zdCB7Ci0gICAgU3RyaW5nOCBzOwotICAgIGZvciAoaW50IGkgPSBtSXRlbXMuc2l6ZSgpOyAtLWkgPj0gMDspIHsKLSAgICAgICAgaW50MzJfdCBrZXkgPSBtSXRlbXMua2V5QXQoaSk7Ci0gICAgICAgIGNoYXIgY2NbNV07Ci0gICAgICAgIE1ha2VGb3VyQ0NTdHJpbmcoa2V5LCBjYyk7Ci0gICAgICAgIGNvbnN0IHR5cGVkX2RhdGEgJml0ZW0gPSBtSXRlbXMudmFsdWVBdChpKTsKLSAgICAgICAgcy5hcHBlbmRGb3JtYXQoIiVzOiAlcyIsIGNjLCBpdGVtLmFzU3RyaW5nKGZhbHNlKS5zdHJpbmcoKSk7Ci0gICAgICAgIGlmIChpICE9IDApIHsKLSAgICAgICAgICAgIHMuYXBwZW5kKCIsICIpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzOwotfQotdm9pZCBNZXRhRGF0YTo6ZHVtcFRvTG9nKCkgY29uc3QgewotICAgIGZvciAoaW50IGkgPSBtSXRlbXMuc2l6ZSgpOyAtLWkgPj0gMDspIHsKLSAgICAgICAgaW50MzJfdCBrZXkgPSBtSXRlbXMua2V5QXQoaSk7Ci0gICAgICAgIGNoYXIgY2NbNV07Ci0gICAgICAgIE1ha2VGb3VyQ0NTdHJpbmcoa2V5LCBjYyk7Ci0gICAgICAgIGNvbnN0IHR5cGVkX2RhdGEgJml0ZW0gPSBtSXRlbXMudmFsdWVBdChpKTsKLSAgICAgICAgQUxPR0koIiVzOiAlcyIsIGNjLCBpdGVtLmFzU3RyaW5nKHRydWUgLyogdmVyYm9zZSAqLykuc3RyaW5nKCkpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgTWV0YURhdGE6OndyaXRlVG9QYXJjZWwoUGFyY2VsICZwYXJjZWwpIHsKLSAgICBzdGF0dXNfdCByZXQ7Ci0gICAgc2l6ZV90IG51bUl0ZW1zID0gbUl0ZW1zLnNpemUoKTsKLSAgICByZXQgPSBwYXJjZWwud3JpdGVVaW50MzIodWludDMyX3QobnVtSXRlbXMpKTsKLSAgICBpZiAocmV0KSB7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtSXRlbXM7IGkrKykgewotICAgICAgICBpbnQzMl90IGtleSA9IG1JdGVtcy5rZXlBdChpKTsKLSAgICAgICAgY29uc3QgdHlwZWRfZGF0YSAmaXRlbSA9IG1JdGVtcy52YWx1ZUF0KGkpOwotICAgICAgICB1aW50MzJfdCB0eXBlOwotICAgICAgICBjb25zdCB2b2lkICpkYXRhOwotICAgICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgICAgaXRlbS5nZXREYXRhKCZ0eXBlLCAmZGF0YSwgJnNpemUpOwotICAgICAgICByZXQgPSBwYXJjZWwud3JpdGVJbnQzMihrZXkpOwotICAgICAgICBpZiAocmV0KSB7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgICAgIHJldCA9IHBhcmNlbC53cml0ZVVpbnQzMih0eXBlKTsKLSAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotICAgICAgICBpZiAodHlwZSA9PSBUWVBFX05PTkUpIHsKLSAgICAgICAgICAgIGFuZHJvaWQ6OlBhcmNlbDo6V3JpdGFibGVCbG9iIGJsb2I7Ci0gICAgICAgICAgICByZXQgPSBwYXJjZWwud3JpdGVVaW50MzIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNpemUpKTsKLSAgICAgICAgICAgIGlmIChyZXQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0ID0gcGFyY2VsLndyaXRlQmxvYihzaXplLCBmYWxzZSwgJmJsb2IpOwotICAgICAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtZW1jcHkoYmxvYi5kYXRhKCksIGRhdGEsIHNpemUpOwotICAgICAgICAgICAgYmxvYi5yZWxlYXNlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXQgPSBwYXJjZWwud3JpdGVCeXRlQXJyYXkoc2l6ZSwgKHVpbnQ4X3QqKWRhdGEpOwotICAgICAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNZXRhRGF0YTo6dXBkYXRlRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCkgewotICAgIHVpbnQzMl90IG51bUl0ZW1zOwotICAgIGlmIChwYXJjZWwucmVhZFVpbnQzMigmbnVtSXRlbXMpID09IE9LKSB7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1JdGVtczsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQzMl90IGtleTsKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgICAgICAgICB1aW50MzJfdCBzaXplOwotICAgICAgICAgICAgc3RhdHVzX3QgcmV0ID0gcGFyY2VsLnJlYWRJbnQzMigma2V5KTsKLSAgICAgICAgICAgIHJldCB8PSBwYXJjZWwucmVhZFVpbnQzMigmdHlwZSk7Ci0gICAgICAgICAgICByZXQgfD0gcGFyY2VsLnJlYWRVaW50MzIoJnNpemUpOwotICAgICAgICAgICAgaWYgKHJldCAhPSBPSykgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gY29weSBkYXRhIGZyb20gQmxvYiwgd2hpY2ggbWF5IGJlIGlubGluZSBpbiBQYXJjZWwgc3RvcmFnZSwKLSAgICAgICAgICAgIC8vIHRoZW4gYWR2YW5jZSBwb3NpdGlvbgotICAgICAgICAgICAgaWYgKHR5cGUgPT0gVFlQRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDo6UGFyY2VsOjpSZWFkYWJsZUJsb2IgYmxvYjsKLSAgICAgICAgICAgICAgICByZXQgPSBwYXJjZWwucmVhZEJsb2Ioc2l6ZSwgJmJsb2IpOwotICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNldERhdGEoa2V5LCB0eXBlLCBibG9iLmRhdGEoKSwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgYmxvYi5yZWxlYXNlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGNvcHkgZGF0YSBkaXJlY3RseSBmcm9tIFBhcmNlbCBzdG9yYWdlLCB0aGVuIGFkdmFuY2UgcG9zaXRpb24KLSAgICAgICAgICAgICAgICBzZXREYXRhKGtleSwgdHlwZSwgcGFyY2VsLnJlYWRJbnBsYWNlKHNpemUpLCBzaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotICAgIEFMT0dXKCJubyBtZXRhZGF0YSBpbiBwYXJjZWwiKTsKLSAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLX0KLQotCi0vKiBzdGF0aWMgKi8KLXNwPE1ldGFEYXRhPiBNZXRhRGF0YTo6Y3JlYXRlRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCkgewotCi0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGEoKTsKLSAgICBtZXRhLT51cGRhdGVGcm9tUGFyY2VsKHBhcmNlbCk7Ci0gICAgcmV0dXJuIG1ldGE7Ci19Ci0KLQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThhNjA4MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmNwcApAQCAtMCwwICsxLDc3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiYXZjX3V0aWxzIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1bnNpZ25lZCBwYXJzZVVFKEFCaXRSZWFkZXIgKmJyKSB7CisgICAgdW5zaWduZWQgbnVtWmVyb2VzID0gMDsKKyAgICB3aGlsZSAoYnItPmdldEJpdHMoMSkgPT0gMCkgeworICAgICAgICArK251bVplcm9lczsKKyAgICB9CisKKyAgICB1bnNpZ25lZCB4ID0gYnItPmdldEJpdHMobnVtWmVyb2VzKTsKKworICAgIHJldHVybiB4ICsgKDF1IDw8IG51bVplcm9lcykgLSAxOworfQorCit1bnNpZ25lZCBwYXJzZVVFV2l0aEZhbGxiYWNrKEFCaXRSZWFkZXIgKmJyLCB1bnNpZ25lZCBmYWxsYmFjaykgeworICAgIHVuc2lnbmVkIG51bVplcm9lcyA9IDA7CisgICAgd2hpbGUgKGJyLT5nZXRCaXRzV2l0aEZhbGxiYWNrKDEsIDEpID09IDApIHsKKyAgICAgICAgKytudW1aZXJvZXM7CisgICAgfQorICAgIHVpbnQzMl90IHg7CisgICAgaWYgKG51bVplcm9lcyA8IDMyKSB7CisgICAgICAgIGlmIChici0+Z2V0Qml0c0dyYWNlZnVsKG51bVplcm9lcywgJngpKSB7CisgICAgICAgICAgICByZXR1cm4geCArICgxdSA8PCBudW1aZXJvZXMpIC0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxsYmFjazsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGJyLT5za2lwQml0cyhudW1aZXJvZXMpOworICAgICAgICByZXR1cm4gZmFsbGJhY2s7CisgICAgfQorfQorCitzaWduZWQgcGFyc2VTRShBQml0UmVhZGVyICpicikgeworICAgIHVuc2lnbmVkIGNvZGVOdW0gPSBwYXJzZVVFKGJyKTsKKworICAgIHJldHVybiAoY29kZU51bSAmIDEpID8gKGNvZGVOdW0gKyAxKSAvIDIgOiAtc2lnbmVkKGNvZGVOdW0gLyAyKTsKK30KKworc2lnbmVkIHBhcnNlU0VXaXRoRmFsbGJhY2soQUJpdFJlYWRlciAqYnIsIHNpZ25lZCBmYWxsYmFjaykgeworICAgIC8vIE5PVEU6IHBhcnNlVUUgY2Fubm90IG5vcm1hbGx5IHJldHVybiB+MCBhcyB0aGUgbWF4IHN1cHBvcnRlZCB2YWx1ZSBpcyAweEZGRkUKKyAgICB1bnNpZ25lZCBjb2RlTnVtID0gcGFyc2VVRVdpdGhGYWxsYmFjayhiciwgfjBVKTsKKyAgICBpZiAoY29kZU51bSA9PSB+MFUpIHsKKyAgICAgICAgcmV0dXJuIGZhbGxiYWNrOworICAgIH0KKyAgICByZXR1cm4gKGNvZGVOdW0gJiAxKSA/IChjb2RlTnVtICsgMSkgLyAyIDogLXNpZ25lZChjb2RlTnVtIC8gMik7Cit9CisKK3N0YXRpYyB2b2lkIHNraXBTY2FsaW5nTGlzdChBQml0UmVhZGVyICpiciwgc2l6ZV90IHNpemVPZlNjYWxpbmdMaXN0KSB7CisgICAgc2l6ZV90IGxhc3RTY2FsZSA9IDg7CisgICAgc2l6ZV90IG5leHRTY2FsZSA9IDg7CisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzaXplT2ZTY2FsaW5nTGlzdDsgKytqKSB7CisgICAgICAgIGlmIChuZXh0U2NhbGUgIT0gMCkgeworICAgICAgICAgICAgc2lnbmVkIGRlbHRhX3NjYWxlID0gcGFyc2VTRShicik7CisgICAgICAgICAgICAvLyBJU09fSUVDXzE0NDk2LTEwXzIwMTQwMi1JVFUsIDcuNC4yLjEuMS4xLCBUaGUgdmFsdWUgb2YgZGVsdGFfc2NhbGUKKyAgICAgICAgICAgIC8vIHNoYWxsIGJlIGluIHRoZSByYW5nZSBvZiDiiJIxMjggdG8gKzEyNywgaW5jbHVzaXZlLgorICAgICAgICAgICAgaWYgKGRlbHRhX3NjYWxlIDwgLTEyOCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJkZWx0YV9zY2FsZSAoJWQpIGlzIGJlbG93IHJhbmdlLCBjYXBwZWQgdG8gLTEyOCIsIGRlbHRhX3NjYWxlKTsKKyAgICAgICAgICAgICAgICBkZWx0YV9zY2FsZSA9IC0xMjg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRlbHRhX3NjYWxlID4gMTI3KSB7CisgICAgICAgICAgICAgICAgQUxPR1coImRlbHRhX3NjYWxlICglZCkgaXMgYWJvdmUgcmFuZ2UsIGNhcHBlZCB0byAxMjciLCBkZWx0YV9zY2FsZSk7CisgICAgICAgICAgICAgICAgZGVsdGFfc2NhbGUgPSAxMjc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXh0U2NhbGUgPSAobGFzdFNjYWxlICsgKGRlbHRhX3NjYWxlICsgMjU2KSkgJSAyNTY7CisgICAgICAgIH0KKworICAgICAgICBsYXN0U2NhbGUgPSAobmV4dFNjYWxlID09IDApID8gbGFzdFNjYWxlIDogbmV4dFNjYWxlOworICAgIH0KK30KKworLy8gRGV0ZXJtaW5lIHZpZGVvIGRpbWVuc2lvbnMgZnJvbSB0aGUgc2VxdWVuY2UgcGFyYW1ldGVyc2V0Lgordm9pZCBGaW5kQVZDRGltZW5zaW9ucygKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJnNlcVBhcmFtU2V0LAorICAgICAgICBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0LAorICAgICAgICBpbnQzMl90ICpzYXJXaWR0aCwgaW50MzJfdCAqc2FySGVpZ2h0KSB7CisgICAgQUJpdFJlYWRlciBicihzZXFQYXJhbVNldC0+ZGF0YSgpICsgMSwgc2VxUGFyYW1TZXQtPnNpemUoKSAtIDEpOworCisgICAgdW5zaWduZWQgcHJvZmlsZV9pZGMgPSBici5nZXRCaXRzKDgpOworICAgIGJyLnNraXBCaXRzKDE2KTsKKyAgICBwYXJzZVVFKCZicik7ICAvLyBzZXFfcGFyYW1ldGVyX3NldF9pZAorCisgICAgdW5zaWduZWQgY2hyb21hX2Zvcm1hdF9pZGMgPSAxOyAgLy8gNDoyOjAgY2hyb21hIGZvcm1hdAorCisgICAgaWYgKHByb2ZpbGVfaWRjID09IDEwMCB8fCBwcm9maWxlX2lkYyA9PSAxMTAKKyAgICAgICAgICAgIHx8IHByb2ZpbGVfaWRjID09IDEyMiB8fCBwcm9maWxlX2lkYyA9PSAyNDQKKyAgICAgICAgICAgIHx8IHByb2ZpbGVfaWRjID09IDQ0IHx8IHByb2ZpbGVfaWRjID09IDgzIHx8IHByb2ZpbGVfaWRjID09IDg2KSB7CisgICAgICAgIGNocm9tYV9mb3JtYXRfaWRjID0gcGFyc2VVRSgmYnIpOworICAgICAgICBpZiAoY2hyb21hX2Zvcm1hdF9pZGMgPT0gMykgeworICAgICAgICAgICAgYnIuc2tpcEJpdHMoMSk7ICAvLyByZXNpZHVhbF9jb2xvdXJfdHJhbnNmb3JtX2ZsYWcKKyAgICAgICAgfQorICAgICAgICBwYXJzZVVFKCZicik7ICAvLyBiaXRfZGVwdGhfbHVtYV9taW51czgKKyAgICAgICAgcGFyc2VVRSgmYnIpOyAgLy8gYml0X2RlcHRoX2Nocm9tYV9taW51czgKKyAgICAgICAgYnIuc2tpcEJpdHMoMSk7ICAvLyBxcHByaW1lX3lfemVyb190cmFuc2Zvcm1fYnlwYXNzX2ZsYWcKKworICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSkgeyAgLy8gc2VxX3NjYWxpbmdfbWF0cml4X3ByZXNlbnRfZmxhZworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA4OyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSkgeyAgLy8gc2VxX3NjYWxpbmdfbGlzdF9wcmVzZW50X2ZsYWdbaV0KKworICAgICAgICAgICAgICAgICAgICAvLyBXQVJOSU5HOiB0aGUgY29kZSBiZWxvdyBoYXMgbm90IGV2ZXIgYmVlbiBleGVyY2lzZWQuLi4KKyAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCBhIHJlYWwtd29ybGQgZXhhbXBsZS4KKworICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IDYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNjYWxpbmdMaXN0NHg0W2ldLDE2LC4uLgorICAgICAgICAgICAgICAgICAgICAgICAgc2tpcFNjYWxpbmdMaXN0KCZiciwgMTYpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2NhbGluZ0xpc3Q4eDhbaS02XSw2NCwuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXBTY2FsaW5nTGlzdCgmYnIsIDY0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHBhcnNlVUUoJmJyKTsgIC8vIGxvZzJfbWF4X2ZyYW1lX251bV9taW51czQKKyAgICB1bnNpZ25lZCBwaWNfb3JkZXJfY250X3R5cGUgPSBwYXJzZVVFKCZicik7CisKKyAgICBpZiAocGljX29yZGVyX2NudF90eXBlID09IDApIHsKKyAgICAgICAgcGFyc2VVRSgmYnIpOyAgLy8gbG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0CisgICAgfSBlbHNlIGlmIChwaWNfb3JkZXJfY250X3R5cGUgPT0gMSkgeworICAgICAgICAvLyBvZmZzZXRfZm9yX25vbl9yZWZfcGljLCBvZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGQgYW5kCisgICAgICAgIC8vIG9mZnNldF9mb3JfcmVmX2ZyYW1lIGFyZSB0ZWNobmljYWxseSBzZSh2KSwgYnV0IHNpbmNlIHdlIGFyZQorICAgICAgICAvLyBqdXN0IHNraXBwaW5nIG92ZXIgdGhlbSB0aGUgbWlkcG9pbnQgZG9lcyBub3QgbWF0dGVyLgorCisgICAgICAgIGJyLmdldEJpdHMoMSk7ICAvLyBkZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZworICAgICAgICBwYXJzZVVFKCZicik7ICAvLyBvZmZzZXRfZm9yX25vbl9yZWZfcGljCisgICAgICAgIHBhcnNlVUUoJmJyKTsgIC8vIG9mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZAorCisgICAgICAgIHVuc2lnbmVkIG51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUgPSBwYXJzZVVFKCZicik7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlOyArK2kpIHsKKyAgICAgICAgICAgIHBhcnNlVUUoJmJyKTsgIC8vIG9mZnNldF9mb3JfcmVmX2ZyYW1lCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwYXJzZVVFKCZicik7ICAvLyBudW1fcmVmX2ZyYW1lcworICAgIGJyLmdldEJpdHMoMSk7ICAvLyBnYXBzX2luX2ZyYW1lX251bV92YWx1ZV9hbGxvd2VkX2ZsYWcKKworICAgIHVuc2lnbmVkIHBpY193aWR0aF9pbl9tYnNfbWludXMxID0gcGFyc2VVRSgmYnIpOworICAgIHVuc2lnbmVkIHBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMSA9IHBhcnNlVUUoJmJyKTsKKyAgICB1bnNpZ25lZCBmcmFtZV9tYnNfb25seV9mbGFnID0gYnIuZ2V0Qml0cygxKTsKKworICAgICp3aWR0aCA9IHBpY193aWR0aF9pbl9tYnNfbWludXMxICogMTYgKyAxNjsKKworICAgICpoZWlnaHQgPSAoMiAtIGZyYW1lX21ic19vbmx5X2ZsYWcpCisgICAgICAgICogKHBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMSAqIDE2ICsgMTYpOworCisgICAgaWYgKCFmcmFtZV9tYnNfb25seV9mbGFnKSB7CisgICAgICAgIGJyLmdldEJpdHMoMSk7ICAvLyBtYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mbGFnCisgICAgfQorCisgICAgYnIuZ2V0Qml0cygxKTsgIC8vIGRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcKKworICAgIGlmIChici5nZXRCaXRzKDEpKSB7ICAvLyBmcmFtZV9jcm9wcGluZ19mbGFnCisgICAgICAgIHVuc2lnbmVkIGZyYW1lX2Nyb3BfbGVmdF9vZmZzZXQgPSBwYXJzZVVFKCZicik7CisgICAgICAgIHVuc2lnbmVkIGZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0ID0gcGFyc2VVRSgmYnIpOworICAgICAgICB1bnNpZ25lZCBmcmFtZV9jcm9wX3RvcF9vZmZzZXQgPSBwYXJzZVVFKCZicik7CisgICAgICAgIHVuc2lnbmVkIGZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCA9IHBhcnNlVUUoJmJyKTsKKworICAgICAgICB1bnNpZ25lZCBjcm9wVW5pdFgsIGNyb3BVbml0WTsKKyAgICAgICAgaWYgKGNocm9tYV9mb3JtYXRfaWRjID09IDAgIC8qIG1vbm9jaHJvbWUgKi8pIHsKKyAgICAgICAgICAgIGNyb3BVbml0WCA9IDE7CisgICAgICAgICAgICBjcm9wVW5pdFkgPSAyIC0gZnJhbWVfbWJzX29ubHlfZmxhZzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIHN1YldpZHRoQyA9IChjaHJvbWFfZm9ybWF0X2lkYyA9PSAzKSA/IDEgOiAyOworICAgICAgICAgICAgdW5zaWduZWQgc3ViSGVpZ2h0QyA9IChjaHJvbWFfZm9ybWF0X2lkYyA9PSAxKSA/IDIgOiAxOworCisgICAgICAgICAgICBjcm9wVW5pdFggPSBzdWJXaWR0aEM7CisgICAgICAgICAgICBjcm9wVW5pdFkgPSBzdWJIZWlnaHRDICogKDIgLSBmcmFtZV9tYnNfb25seV9mbGFnKTsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJmcmFtZV9jcm9wID0gKCV1LCAldSwgJXUsICV1KSwgY3JvcFVuaXRYID0gJXUsIGNyb3BVbml0WSA9ICV1IiwKKyAgICAgICAgICAgICBmcmFtZV9jcm9wX2xlZnRfb2Zmc2V0LCBmcmFtZV9jcm9wX3JpZ2h0X29mZnNldCwKKyAgICAgICAgICAgICBmcmFtZV9jcm9wX3RvcF9vZmZzZXQsIGZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCwKKyAgICAgICAgICAgICBjcm9wVW5pdFgsIGNyb3BVbml0WSk7CisKKworICAgICAgICAvLyAqd2lkdGggLT0gKGZyYW1lX2Nyb3BfbGVmdF9vZmZzZXQgKyBmcmFtZV9jcm9wX3JpZ2h0X29mZnNldCkgKiBjcm9wVW5pdFg7CisgICAgICAgIGlmKF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3coZnJhbWVfY3JvcF9sZWZ0X29mZnNldCwgZnJhbWVfY3JvcF9yaWdodF9vZmZzZXQsICZmcmFtZV9jcm9wX2xlZnRfb2Zmc2V0KSB8fAorICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhmcmFtZV9jcm9wX2xlZnRfb2Zmc2V0LCBjcm9wVW5pdFgsICZmcmFtZV9jcm9wX2xlZnRfb2Zmc2V0KSB8fAorICAgICAgICAgICAgX19idWlsdGluX3N1Yl9vdmVyZmxvdygqd2lkdGgsIGZyYW1lX2Nyb3BfbGVmdF9vZmZzZXQsIHdpZHRoKSB8fAorICAgICAgICAgICAgKndpZHRoIDwgMCkgeworICAgICAgICAgICAgKndpZHRoID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vKmhlaWdodCAtPSAoZnJhbWVfY3JvcF90b3Bfb2Zmc2V0ICsgZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0KSAqIGNyb3BVbml0WTsKKyAgICAgICAgaWYoX19idWlsdGluX2FkZF9vdmVyZmxvdyhmcmFtZV9jcm9wX3RvcF9vZmZzZXQsIGZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCwgJmZyYW1lX2Nyb3BfdG9wX29mZnNldCkgfHwKKyAgICAgICAgICAgIF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3coZnJhbWVfY3JvcF90b3Bfb2Zmc2V0LCBjcm9wVW5pdFksICZmcmFtZV9jcm9wX3RvcF9vZmZzZXQpIHx8CisgICAgICAgICAgICBfX2J1aWx0aW5fc3ViX292ZXJmbG93KCpoZWlnaHQsIGZyYW1lX2Nyb3BfdG9wX29mZnNldCwgaGVpZ2h0KSB8fAorICAgICAgICAgICAgKmhlaWdodCA8IDApIHsKKyAgICAgICAgICAgICpoZWlnaHQgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNhcldpZHRoICE9IE5VTEwpIHsKKyAgICAgICAgKnNhcldpZHRoID0gMDsKKyAgICB9CisKKyAgICBpZiAoc2FySGVpZ2h0ICE9IE5VTEwpIHsKKyAgICAgICAgKnNhckhlaWdodCA9IDA7CisgICAgfQorCisgICAgaWYgKGJyLmdldEJpdHMoMSkpIHsgIC8vIHZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZworICAgICAgICB1bnNpZ25lZCBzYXJfd2lkdGggPSAwLCBzYXJfaGVpZ2h0ID0gMDsKKworICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSkgeyAgLy8gYXNwZWN0X3JhdGlvX2luZm9fcHJlc2VudF9mbGFnCisgICAgICAgICAgICB1bnNpZ25lZCBhc3BlY3RfcmF0aW9faWRjID0gYnIuZ2V0Qml0cyg4KTsKKworICAgICAgICAgICAgaWYgKGFzcGVjdF9yYXRpb19pZGMgPT0gMjU1IC8qIGV4dGVuZGVkU0FSICovKSB7CisgICAgICAgICAgICAgICAgc2FyX3dpZHRoID0gYnIuZ2V0Qml0cygxNik7CisgICAgICAgICAgICAgICAgc2FyX2hlaWdodCA9IGJyLmdldEJpdHMoMTYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsgdW5zaWduZWQgd2lkdGgsIGhlaWdodDsgfSBrRml4ZWRTQVJzW10gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICB7ICAgMCwgIDAgfSwgLy8gSW52YWxpZAorICAgICAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7ICAxMiwgMTEgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgIDEwLCAxMSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAgMTYsIDExIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7ICA0MCwgMzMgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgIDI0LCAxMSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAgMjAsIDExIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7ICAzMiwgMTEgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgIDgwLCAzMyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAgMTgsIDExIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7ICAxNSwgMTEgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgIDY0LCAzMyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAxNjAsIDk5IH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7ICAgNCwgIDMgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgICAzLCAgMiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAgIDIsICAxIH0sCisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIGlmIChhc3BlY3RfcmF0aW9faWRjID4gMCAmJiBhc3BlY3RfcmF0aW9faWRjIDwgTkVMRU0oa0ZpeGVkU0FScykpIHsKKyAgICAgICAgICAgICAgICAgICAgc2FyX3dpZHRoID0ga0ZpeGVkU0FSc1thc3BlY3RfcmF0aW9faWRjXS53aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgc2FyX2hlaWdodCA9IGtGaXhlZFNBUnNbYXNwZWN0X3JhdGlvX2lkY10uaGVpZ2h0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJzYW1wbGUgYXNwZWN0IHJhdGlvID0gJXUgOiAldSIsIHNhcl93aWR0aCwgc2FyX2hlaWdodCk7CisKKyAgICAgICAgaWYgKHNhcldpZHRoICE9IE5VTEwpIHsKKyAgICAgICAgICAgICpzYXJXaWR0aCA9IHNhcl93aWR0aDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzYXJIZWlnaHQgIT0gTlVMTCkgeworICAgICAgICAgICAgKnNhckhlaWdodCA9IHNhcl9oZWlnaHQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IGdldE5leHROQUxVbml0KAorICAgICAgICBjb25zdCB1aW50OF90ICoqX2RhdGEsIHNpemVfdCAqX3NpemUsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipuYWxTdGFydCwgc2l6ZV90ICpuYWxTaXplLAorICAgICAgICBib29sIHN0YXJ0Q29kZUZvbGxvd3MpIHsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gKl9kYXRhOworICAgIHNpemVfdCBzaXplID0gKl9zaXplOworCisgICAgKm5hbFN0YXJ0ID0gTlVMTDsKKyAgICAqbmFsU2l6ZSA9IDA7CisKKyAgICBpZiAoc2l6ZSA8IDMpIHsKKyAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgfQorCisgICAgc2l6ZV90IG9mZnNldCA9IDA7CisKKyAgICAvLyBBIHZhbGlkIHN0YXJ0Y29kZSBjb25zaXN0cyBvZiBhdCBsZWFzdCB0d28gMHgwMCBieXRlcyBmb2xsb3dlZCBieSAweDAxLgorICAgIGZvciAoOyBvZmZzZXQgKyAyIDwgc2l6ZTsgKytvZmZzZXQpIHsKKyAgICAgICAgaWYgKGRhdGFbb2Zmc2V0ICsgMl0gPT0gMHgwMSAmJiBkYXRhW29mZnNldF0gPT0gMHgwMAorICAgICAgICAgICAgICAgICYmIGRhdGFbb2Zmc2V0ICsgMV0gPT0gMHgwMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG9mZnNldCArIDIgPj0gc2l6ZSkgeworICAgICAgICAqX2RhdGEgPSAmZGF0YVtvZmZzZXRdOworICAgICAgICAqX3NpemUgPSAyOworICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICB9CisgICAgb2Zmc2V0ICs9IDM7CisKKyAgICBzaXplX3Qgc3RhcnRPZmZzZXQgPSBvZmZzZXQ7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHdoaWxlIChvZmZzZXQgPCBzaXplICYmIGRhdGFbb2Zmc2V0XSAhPSAweDAxKSB7CisgICAgICAgICAgICArK29mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvZmZzZXQgPT0gc2l6ZSkgeworICAgICAgICAgICAgaWYgKHN0YXJ0Q29kZUZvbGxvd3MpIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplICsgMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIC1FQUdBSU47CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGF0YVtvZmZzZXQgLSAxXSA9PSAweDAwICYmIGRhdGFbb2Zmc2V0IC0gMl0gPT0gMHgwMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICArK29mZnNldDsKKyAgICB9CisKKyAgICBzaXplX3QgZW5kT2Zmc2V0ID0gb2Zmc2V0IC0gMjsKKyAgICB3aGlsZSAoZW5kT2Zmc2V0ID4gc3RhcnRPZmZzZXQgKyAxICYmIGRhdGFbZW5kT2Zmc2V0IC0gMV0gPT0gMHgwMCkgeworICAgICAgICAtLWVuZE9mZnNldDsKKyAgICB9CisKKyAgICAqbmFsU3RhcnQgPSAmZGF0YVtzdGFydE9mZnNldF07CisgICAgKm5hbFNpemUgPSBlbmRPZmZzZXQgLSBzdGFydE9mZnNldDsKKworICAgIGlmIChvZmZzZXQgKyAyIDwgc2l6ZSkgeworICAgICAgICAqX2RhdGEgPSAmZGF0YVtvZmZzZXQgLSAyXTsKKyAgICAgICAgKl9zaXplID0gc2l6ZSAtIG9mZnNldCArIDI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKl9kYXRhID0gTlVMTDsKKyAgICAgICAgKl9zaXplID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXRpYyBzcDxBQnVmZmVyPiBGaW5kTkFMKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplLCB1bnNpZ25lZCBuYWxUeXBlKSB7CisgICAgY29uc3QgdWludDhfdCAqbmFsU3RhcnQ7CisgICAgc2l6ZV90IG5hbFNpemU7CisgICAgd2hpbGUgKGdldE5leHROQUxVbml0KCZkYXRhLCAmc2l6ZSwgJm5hbFN0YXJ0LCAmbmFsU2l6ZSwgdHJ1ZSkgPT0gT0spIHsKKyAgICAgICAgaWYgKG5hbFNpemUgPiAwICYmIChuYWxTdGFydFswXSAmIDB4MWYpID09IG5hbFR5cGUpIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKG5hbFNpemUpOworICAgICAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpLCBuYWxTdGFydCwgbmFsU2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gYnVmZmVyOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2NvbnN0IGNoYXIgKkFWQ1Byb2ZpbGVUb1N0cmluZyh1aW50OF90IHByb2ZpbGUpIHsKKyAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKKyAgICAgICAgY2FzZSBrQVZDUHJvZmlsZUJhc2VsaW5lOgorICAgICAgICAgICAgcmV0dXJuICJCYXNlbGluZSI7CisgICAgICAgIGNhc2Uga0FWQ1Byb2ZpbGVNYWluOgorICAgICAgICAgICAgcmV0dXJuICJNYWluIjsKKyAgICAgICAgY2FzZSBrQVZDUHJvZmlsZUV4dGVuZGVkOgorICAgICAgICAgICAgcmV0dXJuICJFeHRlbmRlZCI7CisgICAgICAgIGNhc2Uga0FWQ1Byb2ZpbGVIaWdoOgorICAgICAgICAgICAgcmV0dXJuICJIaWdoIjsKKyAgICAgICAgY2FzZSBrQVZDUHJvZmlsZUhpZ2gxMDoKKyAgICAgICAgICAgIHJldHVybiAiSGlnaCAxMCI7CisgICAgICAgIGNhc2Uga0FWQ1Byb2ZpbGVIaWdoNDIyOgorICAgICAgICAgICAgcmV0dXJuICJIaWdoIDQyMiI7CisgICAgICAgIGNhc2Uga0FWQ1Byb2ZpbGVIaWdoNDQ0OgorICAgICAgICAgICAgcmV0dXJuICJIaWdoIDQ0NCI7CisgICAgICAgIGNhc2Uga0FWQ1Byb2ZpbGVDQVZMQzQ0NEludHJhOgorICAgICAgICAgICAgcmV0dXJuICJDQVZMQyA0NDQgSW50cmEiOworICAgICAgICBkZWZhdWx0OiAgIHJldHVybiAiVW5rbm93biI7CisgICAgfQorfQorCitzcDxBQnVmZmVyPiBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0LCBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0LAorICAgICAgICBpbnQzMl90ICpzYXJXaWR0aCwgaW50MzJfdCAqc2FySGVpZ2h0KSB7CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGFjY2Vzc1VuaXQtPmRhdGEoKTsKKyAgICBzaXplX3Qgc2l6ZSA9IGFjY2Vzc1VuaXQtPnNpemUoKTsKKworICAgIHNwPEFCdWZmZXI+IHNlcVBhcmFtU2V0ID0gRmluZE5BTChkYXRhLCBzaXplLCA3KTsKKyAgICBpZiAoc2VxUGFyYW1TZXQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBGaW5kQVZDRGltZW5zaW9ucygKKyAgICAgICAgICAgIHNlcVBhcmFtU2V0LCB3aWR0aCwgaGVpZ2h0LCBzYXJXaWR0aCwgc2FySGVpZ2h0KTsKKworICAgIHNwPEFCdWZmZXI+IHBpY1BhcmFtU2V0ID0gRmluZE5BTChkYXRhLCBzaXplLCA4KTsKKyAgICBDSEVDSyhwaWNQYXJhbVNldCAhPSBOVUxMKTsKKworICAgIHNpemVfdCBjc2RTaXplID0KKyAgICAgICAgMSArIDMgKyAxICsgMQorICAgICAgICArIDIgKiAxICsgc2VxUGFyYW1TZXQtPnNpemUoKQorICAgICAgICArIDEgKyAyICogMSArIHBpY1BhcmFtU2V0LT5zaXplKCk7CisKKyAgICBzcDxBQnVmZmVyPiBjc2QgPSBuZXcgQUJ1ZmZlcihjc2RTaXplKTsKKyAgICB1aW50OF90ICpvdXQgPSBjc2QtPmRhdGEoKTsKKworICAgICpvdXQrKyA9IDB4MDE7ICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbgorICAgIG1lbWNweShvdXQsIHNlcVBhcmFtU2V0LT5kYXRhKCkgKyAxLCAzKTsgIC8vIHByb2ZpbGUvbGV2ZWwuLi4KKworICAgIHVpbnQ4X3QgcHJvZmlsZSA9IG91dFswXTsKKyAgICB1aW50OF90IGxldmVsID0gb3V0WzJdOworCisgICAgb3V0ICs9IDM7CisgICAgKm91dCsrID0gKDB4M2YgPDwgMikgfCAxOyAgLy8gbGVuZ3RoU2l6ZSA9PSAyIGJ5dGVzCisgICAgKm91dCsrID0gMHhlMCB8IDE7CisKKyAgICAqb3V0KysgPSBzZXFQYXJhbVNldC0+c2l6ZSgpID4+IDg7CisgICAgKm91dCsrID0gc2VxUGFyYW1TZXQtPnNpemUoKSAmIDB4ZmY7CisgICAgbWVtY3B5KG91dCwgc2VxUGFyYW1TZXQtPmRhdGEoKSwgc2VxUGFyYW1TZXQtPnNpemUoKSk7CisgICAgb3V0ICs9IHNlcVBhcmFtU2V0LT5zaXplKCk7CisKKyAgICAqb3V0KysgPSAxOworCisgICAgKm91dCsrID0gcGljUGFyYW1TZXQtPnNpemUoKSA+PiA4OworICAgICpvdXQrKyA9IHBpY1BhcmFtU2V0LT5zaXplKCkgJiAweGZmOworICAgIG1lbWNweShvdXQsIHBpY1BhcmFtU2V0LT5kYXRhKCksIHBpY1BhcmFtU2V0LT5zaXplKCkpOworCisjaWYgMAorICAgIEFMT0dJKCJBVkMgc2VxIHBhcmFtIHNldCIpOworICAgIGhleGR1bXAoc2VxUGFyYW1TZXQtPmRhdGEoKSwgc2VxUGFyYW1TZXQtPnNpemUoKSk7CisjZW5kaWYKKworCisgICAgaWYgKHNhcldpZHRoICE9IG51bGxwdHIgJiYgc2FySGVpZ2h0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKCgqc2FyV2lkdGggPiAwICYmICpzYXJIZWlnaHQgPiAwKSAmJiAoKnNhcldpZHRoICE9IDEgfHwgKnNhckhlaWdodCAhPSAxKSkgeworICAgICAgICAgICAgQUxPR0koImZvdW5kIEFWQyBjb2RlYyBjb25maWcgKCVkIHggJWQsICVzLXByb2ZpbGUgbGV2ZWwgJWQuJWQpICIKKyAgICAgICAgICAgICAgICAgICAgIlNBUiAlZCA6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgKndpZHRoLAorICAgICAgICAgICAgICAgICAgICAqaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBBVkNQcm9maWxlVG9TdHJpbmcocHJvZmlsZSksCisgICAgICAgICAgICAgICAgICAgIGxldmVsIC8gMTAsCisgICAgICAgICAgICAgICAgICAgIGxldmVsICUgMTAsCisgICAgICAgICAgICAgICAgICAgICpzYXJXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgKnNhckhlaWdodCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBXZSB0cmVhdCAqOjAgYW5kIDA6KiAodW5zcGVjaWZpZWQpIGFzIDE6MS4KKyAgICAgICAgICAgICpzYXJXaWR0aCA9IDA7CisgICAgICAgICAgICAqc2FySGVpZ2h0ID0gMDsKKyAgICAgICAgICAgIEFMT0dJKCJmb3VuZCBBVkMgY29kZWMgY29uZmlnICglZCB4ICVkLCAlcy1wcm9maWxlIGxldmVsICVkLiVkKSIsCisgICAgICAgICAgICAgICAgICAgICp3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgKmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgQVZDUHJvZmlsZVRvU3RyaW5nKHByb2ZpbGUpLAorICAgICAgICAgICAgICAgICAgICBsZXZlbCAvIDEwLAorICAgICAgICAgICAgICAgICAgICBsZXZlbCAlIDEwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjc2Q7Cit9CisKK2Jvb2wgSXNJRFIoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKy8vICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKKy8vICAgIHNpemVfdCBzaXplID0gYnVmZmVyLT5zaXplKCk7CisgICAgYm9vbCBmb3VuZElEUiA9IGZhbHNlOworCisgICAgY29uc3QgdWludDhfdCAqbmFsU3RhcnQ7CisgICAgc2l6ZV90IG5hbFNpemU7CisgICAgd2hpbGUgKGdldE5leHROQUxVbml0KCZkYXRhLCAmc2l6ZSwgJm5hbFN0YXJ0LCAmbmFsU2l6ZSwgdHJ1ZSkgPT0gT0spIHsKKyAgICAgICAgaWYgKG5hbFNpemUgPT0gMHUpIHsKKyAgICAgICAgICAgIEFMT0dXKCJza2lwcGluZyBlbXB0eSBuYWwgdW5pdCBmcm9tIHBvdGVudGlhbGx5IG1hbGZvcm1lZCBiaXRzdHJlYW0iKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgdW5zaWduZWQgbmFsVHlwZSA9IG5hbFN0YXJ0WzBdICYgMHgxZjsKKworICAgICAgICBpZiAobmFsVHlwZSA9PSA1KSB7CisgICAgICAgICAgICBmb3VuZElEUiA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmb3VuZElEUjsKK30KKworYm9vbCBJc0FWQ1JlZmVyZW5jZUZyYW1lKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KSB7CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGFjY2Vzc1VuaXQtPmRhdGEoKTsKKyAgICBzaXplX3Qgc2l6ZSA9IGFjY2Vzc1VuaXQtPnNpemUoKTsKKyAgICBpZiAoZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJJc0FWQ1JlZmVyZW5jZUZyYW1lOiBjYWxsZWQgb24gTlVMTCBkYXRhICglcCwgJXp1KSIsIGFjY2Vzc1VuaXQuZ2V0KCksIHNpemUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgdWludDhfdCAqbmFsU3RhcnQ7CisgICAgc2l6ZV90IG5hbFNpemU7CisgICAgd2hpbGUgKGdldE5leHROQUxVbml0KCZkYXRhLCAmc2l6ZSwgJm5hbFN0YXJ0LCAmbmFsU2l6ZSwgdHJ1ZSkgPT0gT0spIHsKKyAgICAgICAgaWYgKG5hbFNpemUgPT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIklzQVZDUmVmZXJlbmNlRnJhbWU6IGludmFsaWQgbmFsU2l6ZTogMCAoJXAsICV6dSkiLCBhY2Nlc3NVbml0LmdldCgpLCBzaXplKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHVuc2lnbmVkIG5hbFR5cGUgPSBuYWxTdGFydFswXSAmIDB4MWY7CisKKyAgICAgICAgaWYgKG5hbFR5cGUgPT0gNSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAobmFsVHlwZSA9PSAxKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBuYWxfcmVmX2lkYyA9IChuYWxTdGFydFswXSA+PiA1KSAmIDM7CisgICAgICAgICAgICByZXR1cm4gbmFsX3JlZl9pZGMgIT0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit1aW50MzJfdCBGaW5kQVZDTGF5ZXJJZChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIENIRUNLKGRhdGEgIT0gTlVMTCk7CisKKyAgICBjb25zdCB1bnNpZ25lZCBrU3ZjTmFsVHlwZSA9IDB4RTsKKyAgICBjb25zdCB1bnNpZ25lZCBrU3ZjTmFsU2VhcmNoUmFuZ2UgPSAzMjsKKyAgICAvLyBTVkMgTkFMCisgICAgLy8gfC0tLTAgMTExMHwxLS0tIC0tLS18LS0tLSAtLS0tfGlpaS0gLS0tfAorICAgIC8vICAgICAgIF4gICAgICAgICAgICAgICAgICAgICAgICBeCisgICAgLy8gICBOQUwtdHlwZSA9IDB4RSAgICAgICAgICAgICAgIGxheWVyLUlkCisgICAgLy8KKyAgICAvLyBsYXllcl9pZCAwIGlzIGZvciBiYXNlIGxheWVyLCB3aGlsZSAxLCAyLCAuLi4gYXJlIGVuaGFuY2VtZW50IGxheWVycy4KKyAgICAvLyBMYXllciBuIHVzZXMgcmVmZXJlbmNlIGZyYW1lcyBmcm9tIGxheWVyIDAsIDEsIC4uLiwgbi0xLgorCisgICAgdWludDMyX3QgbGF5ZXJJZCA9IDA7CisgICAgc3A8QUJ1ZmZlcj4gc3ZjTkFMID0gRmluZE5BTCgKKyAgICAgICAgICAgIGRhdGEsIHNpemUgPiBrU3ZjTmFsU2VhcmNoUmFuZ2UgPyBrU3ZjTmFsU2VhcmNoUmFuZ2UgOiBzaXplLCBrU3ZjTmFsVHlwZSk7CisgICAgaWYgKHN2Y05BTCAhPSBOVUxMICYmIHN2Y05BTC0+c2l6ZSgpID49IDQpIHsKKyAgICAgICAgbGF5ZXJJZCA9ICgqKHN2Y05BTC0+ZGF0YSgpICsgMykgPj4gNSkgJiAweDc7CisgICAgfQorICAgIHJldHVybiBsYXllcklkOworfQorCitib29sIEV4dHJhY3REaW1lbnNpb25zRnJvbVZPTEhlYWRlcigKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUsIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQpIHsKKyAgICBBQml0UmVhZGVyIGJyKCZkYXRhWzRdLCBzaXplIC0gNCk7CisgICAgYnIuc2tpcEJpdHMoMSk7ICAvLyByYW5kb21fYWNjZXNzaWJsZV92b2wKKyAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfdHlwZV9pbmRpY2F0aW9uID0gYnIuZ2V0Qml0cyg4KTsKKworICAgIENIRUNLX05FKHZpZGVvX29iamVjdF90eXBlX2luZGljYXRpb24sCisgICAgICAgICAgICAgMHgyMXUgLyogRmluZSBHcmFudWxhcml0eSBTY2FsYWJsZSAqLyk7CisKKyAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfbGF5ZXJfdmVyaWQgX191bnVzZWQ7CisgICAgdW5zaWduZWQgdmlkZW9fb2JqZWN0X2xheWVyX3ByaW9yaXR5IF9fdW51c2VkOworICAgIGlmIChici5nZXRCaXRzKDEpKSB7CisgICAgICAgIHZpZGVvX29iamVjdF9sYXllcl92ZXJpZCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgIHZpZGVvX29iamVjdF9sYXllcl9wcmlvcml0eSA9IGJyLmdldEJpdHMoMyk7CisgICAgfQorICAgIHVuc2lnbmVkIGFzcGVjdF9yYXRpb19pbmZvID0gYnIuZ2V0Qml0cyg0KTsKKyAgICBpZiAoYXNwZWN0X3JhdGlvX2luZm8gPT0gMHgwZiAvKiBleHRlbmRlZCBQQVIgKi8pIHsKKyAgICAgICAgYnIuc2tpcEJpdHMoOCk7ICAvLyBwYXJfd2lkdGgKKyAgICAgICAgYnIuc2tpcEJpdHMoOCk7ICAvLyBwYXJfaGVpZ2h0CisgICAgfQorICAgIGlmIChici5nZXRCaXRzKDEpKSB7ICAvLyB2b2xfY29udHJvbF9wYXJhbWV0ZXJzCisgICAgICAgIGJyLnNraXBCaXRzKDIpOyAgLy8gY2hyb21hX2Zvcm1hdAorICAgICAgICBici5za2lwQml0cygxKTsgIC8vIGxvd19kZWxheQorICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSkgeyAgLy8gdmJ2X3BhcmFtZXRlcnMKKyAgICAgICAgICAgIGJyLnNraXBCaXRzKDE1KTsgIC8vIGZpcnN0X2hhbGZfYml0X3JhdGUKKyAgICAgICAgICAgIENIRUNLKGJyLmdldEJpdHMoMSkpOyAgLy8gbWFya2VyX2JpdAorICAgICAgICAgICAgYnIuc2tpcEJpdHMoMTUpOyAgLy8gbGF0dGVyX2hhbGZfYml0X3JhdGUKKyAgICAgICAgICAgIENIRUNLKGJyLmdldEJpdHMoMSkpOyAgLy8gbWFya2VyX2JpdAorICAgICAgICAgICAgYnIuc2tpcEJpdHMoMTUpOyAgLy8gZmlyc3RfaGFsZl92YnZfYnVmZmVyX3NpemUKKyAgICAgICAgICAgIENIRUNLKGJyLmdldEJpdHMoMSkpOyAgLy8gbWFya2VyX2JpdAorICAgICAgICAgICAgYnIuc2tpcEJpdHMoMyk7ICAvLyBsYXR0ZXJfaGFsZl92YnZfYnVmZmVyX3NpemUKKyAgICAgICAgICAgIGJyLnNraXBCaXRzKDExKTsgIC8vIGZpcnN0X2hhbGZfdmJ2X29jY3VwYW5jeQorICAgICAgICAgICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0CisgICAgICAgICAgICBici5za2lwQml0cygxNSk7ICAvLyBsYXR0ZXJfaGFsZl92YnZfb2NjdXBhbmN5CisgICAgICAgICAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKKyAgICAgICAgfQorICAgIH0KKyAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPSBici5nZXRCaXRzKDIpOworICAgIENIRUNLX0VRKHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSwgMHgwMHUgLyogcmVjdGFuZ3VsYXIgKi8pOworCisgICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0CisgICAgdW5zaWduZWQgdm9wX3RpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24gPSBici5nZXRCaXRzKDE2KTsKKyAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKKworICAgIGlmIChici5nZXRCaXRzKDEpKSB7ICAvLyBmaXhlZF92b3BfcmF0ZQorICAgICAgICAvLyByYW5nZSBbMC4udm9wX3RpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24pCisKKyAgICAgICAgLy8gdm9wX3RpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24KKyAgICAgICAgLy8gMiA9PiAwLi4xLCAxIGJpdAorICAgICAgICAvLyAzID0+IDAuLjIsIDIgYml0cworICAgICAgICAvLyA0ID0+IDAuLjMsIDIgYml0cworICAgICAgICAvLyA1ID0+IDAuLjQsIDMgYml0cworICAgICAgICAvLyAuLi4KKworICAgICAgICBDSEVDS19HVCh2b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiwgMHUpOworICAgICAgICAtLXZvcF90aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uOworCisgICAgICAgIHVuc2lnbmVkIG51bUJpdHMgPSAwOworICAgICAgICB3aGlsZSAodm9wX3RpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24gPiAwKSB7CisgICAgICAgICAgICArK251bUJpdHM7CisgICAgICAgICAgICB2b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiA+Pj0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGJyLnNraXBCaXRzKG51bUJpdHMpOyAgLy8gZml4ZWRfdm9wX3RpbWVfaW5jcmVtZW50CisgICAgfQorCisgICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0CisgICAgdW5zaWduZWQgdmlkZW9fb2JqZWN0X2xheWVyX3dpZHRoID0gYnIuZ2V0Qml0cygxMyk7CisgICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0CisgICAgdW5zaWduZWQgdmlkZW9fb2JqZWN0X2xheWVyX2hlaWdodCA9IGJyLmdldEJpdHMoMTMpOworICAgIENIRUNLKGJyLmdldEJpdHMoMSkpOyAgLy8gbWFya2VyX2JpdAorCisgICAgdW5zaWduZWQgaW50ZXJsYWNlZCBfX3VudXNlZCA9IGJyLmdldEJpdHMoMSk7CisKKyAgICAqd2lkdGggPSB2aWRlb19vYmplY3RfbGF5ZXJfd2lkdGg7CisgICAgKmhlaWdodCA9IHZpZGVvX29iamVjdF9sYXllcl9oZWlnaHQ7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBHZXRNUEVHQXVkaW9GcmFtZVNpemUoCisgICAgICAgIHVpbnQzMl90IGhlYWRlciwgc2l6ZV90ICpmcmFtZV9zaXplLAorICAgICAgICBpbnQgKm91dF9zYW1wbGluZ19yYXRlLCBpbnQgKm91dF9jaGFubmVscywKKyAgICAgICAgaW50ICpvdXRfYml0cmF0ZSwgaW50ICpvdXRfbnVtX3NhbXBsZXMpIHsKKyAgICAqZnJhbWVfc2l6ZSA9IDA7CisKKyAgICBpZiAob3V0X3NhbXBsaW5nX3JhdGUpIHsKKyAgICAgICAgKm91dF9zYW1wbGluZ19yYXRlID0gMDsKKyAgICB9CisKKyAgICBpZiAob3V0X2NoYW5uZWxzKSB7CisgICAgICAgICpvdXRfY2hhbm5lbHMgPSAwOworICAgIH0KKworICAgIGlmIChvdXRfYml0cmF0ZSkgeworICAgICAgICAqb3V0X2JpdHJhdGUgPSAwOworICAgIH0KKworICAgIGlmIChvdXRfbnVtX3NhbXBsZXMpIHsKKyAgICAgICAgKm91dF9udW1fc2FtcGxlcyA9IDExNTI7CisgICAgfQorCisgICAgaWYgKChoZWFkZXIgJiAweGZmZTAwMDAwKSAhPSAweGZmZTAwMDAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCB2ZXJzaW9uID0gKGhlYWRlciA+PiAxOSkgJiAzOworCisgICAgaWYgKHZlcnNpb24gPT0gMHgwMSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdW5zaWduZWQgbGF5ZXIgPSAoaGVhZGVyID4+IDE3KSAmIDM7CisKKyAgICBpZiAobGF5ZXIgPT0gMHgwMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdW5zaWduZWQgcHJvdGVjdGlvbiBfX3VudXNlZCA9IChoZWFkZXIgPj4gMTYpICYgMTsKKworICAgIHVuc2lnbmVkIGJpdHJhdGVfaW5kZXggPSAoaGVhZGVyID4+IDEyKSAmIDB4MGY7CisKKyAgICBpZiAoYml0cmF0ZV9pbmRleCA9PSAwIHx8IGJpdHJhdGVfaW5kZXggPT0gMHgwZikgeworICAgICAgICAvLyBEaXNhbGxvdyAiZnJlZSIgYml0cmF0ZS4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVuc2lnbmVkIHNhbXBsaW5nX3JhdGVfaW5kZXggPSAoaGVhZGVyID4+IDEwKSAmIDM7CisKKyAgICBpZiAoc2FtcGxpbmdfcmF0ZV9pbmRleCA9PSAzKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgaW50IGtTYW1wbGluZ1JhdGVWMVtdID0geyA0NDEwMCwgNDgwMDAsIDMyMDAwIH07CisgICAgaW50IHNhbXBsaW5nX3JhdGUgPSBrU2FtcGxpbmdSYXRlVjFbc2FtcGxpbmdfcmF0ZV9pbmRleF07CisgICAgaWYgKHZlcnNpb24gPT0gMiAvKiBWMiAqLykgeworICAgICAgICBzYW1wbGluZ19yYXRlIC89IDI7CisgICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDAgLyogVjIuNSAqLykgeworICAgICAgICBzYW1wbGluZ19yYXRlIC89IDQ7CisgICAgfQorCisgICAgdW5zaWduZWQgcGFkZGluZyA9IChoZWFkZXIgPj4gOSkgJiAxOworCisgICAgaWYgKGxheWVyID09IDMpIHsKKyAgICAgICAgLy8gbGF5ZXIgSQorCisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMVtdID0geworICAgICAgICAgICAgMzIsIDY0LCA5NiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYsCisgICAgICAgICAgICAyODgsIDMyMCwgMzUyLCAzODQsIDQxNiwgNDQ4CisgICAgICAgIH07CisKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYyW10gPSB7CisgICAgICAgICAgICAzMiwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwKKyAgICAgICAgICAgIDE0NCwgMTYwLCAxNzYsIDE5MiwgMjI0LCAyNTYKKyAgICAgICAgfTsKKworICAgICAgICBpbnQgYml0cmF0ZSA9CisgICAgICAgICAgICAodmVyc2lvbiA9PSAzIC8qIFYxICovKQorICAgICAgICAgICAgICAgID8ga0JpdHJhdGVWMVtiaXRyYXRlX2luZGV4IC0gMV0KKyAgICAgICAgICAgICAgICA6IGtCaXRyYXRlVjJbYml0cmF0ZV9pbmRleCAtIDFdOworCisgICAgICAgIGlmIChvdXRfYml0cmF0ZSkgeworICAgICAgICAgICAgKm91dF9iaXRyYXRlID0gYml0cmF0ZTsKKyAgICAgICAgfQorCisgICAgICAgICpmcmFtZV9zaXplID0gKDEyMDAwICogYml0cmF0ZSAvIHNhbXBsaW5nX3JhdGUgKyBwYWRkaW5nKSAqIDQ7CisKKyAgICAgICAgaWYgKG91dF9udW1fc2FtcGxlcykgeworICAgICAgICAgICAgKm91dF9udW1fc2FtcGxlcyA9IDM4NDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGxheWVyIElJIG9yIElJSQorCisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMUwyW10gPSB7CisgICAgICAgICAgICAzMiwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwKKyAgICAgICAgICAgIDE2MCwgMTkyLCAyMjQsIDI1NiwgMzIwLCAzODQKKyAgICAgICAgfTsKKworICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjFMM1tdID0geworICAgICAgICAgICAgMzIsIDQwLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwKKyAgICAgICAgICAgIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2LCAzMjAKKyAgICAgICAgfTsKKworICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjJbXSA9IHsKKyAgICAgICAgICAgIDgsIDE2LCAyNCwgMzIsIDQwLCA0OCwgNTYsIDY0LAorICAgICAgICAgICAgODAsIDk2LCAxMTIsIDEyOCwgMTQ0LCAxNjAKKyAgICAgICAgfTsKKworICAgICAgICBpbnQgYml0cmF0ZTsKKyAgICAgICAgaWYgKHZlcnNpb24gPT0gMyAvKiBWMSAqLykgeworICAgICAgICAgICAgYml0cmF0ZSA9IChsYXllciA9PSAyIC8qIEwyICovKQorICAgICAgICAgICAgICAgID8ga0JpdHJhdGVWMUwyW2JpdHJhdGVfaW5kZXggLSAxXQorICAgICAgICAgICAgICAgIDoga0JpdHJhdGVWMUwzW2JpdHJhdGVfaW5kZXggLSAxXTsKKworICAgICAgICAgICAgaWYgKG91dF9udW1fc2FtcGxlcykgeworICAgICAgICAgICAgICAgICpvdXRfbnVtX3NhbXBsZXMgPSAxMTUyOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVjIgKG9yIDIuNSkKKworICAgICAgICAgICAgYml0cmF0ZSA9IGtCaXRyYXRlVjJbYml0cmF0ZV9pbmRleCAtIDFdOworICAgICAgICAgICAgaWYgKG91dF9udW1fc2FtcGxlcykgeworICAgICAgICAgICAgICAgICpvdXRfbnVtX3NhbXBsZXMgPSAobGF5ZXIgPT0gMSAvKiBMMyAqLykgPyA1NzYgOiAxMTUyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dF9iaXRyYXRlKSB7CisgICAgICAgICAgICAqb3V0X2JpdHJhdGUgPSBiaXRyYXRlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZlcnNpb24gPT0gMyAvKiBWMSAqLykgeworICAgICAgICAgICAgKmZyYW1lX3NpemUgPSAxNDQwMDAgKiBiaXRyYXRlIC8gc2FtcGxpbmdfcmF0ZSArIHBhZGRpbmc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBWMiBvciBWMi41CisgICAgICAgICAgICBzaXplX3QgdG1wID0gKGxheWVyID09IDEgLyogTDMgKi8pID8gNzIwMDAgOiAxNDQwMDA7CisgICAgICAgICAgICAqZnJhbWVfc2l6ZSA9IHRtcCAqIGJpdHJhdGUgLyBzYW1wbGluZ19yYXRlICsgcGFkZGluZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvdXRfc2FtcGxpbmdfcmF0ZSkgeworICAgICAgICAqb3V0X3NhbXBsaW5nX3JhdGUgPSBzYW1wbGluZ19yYXRlOworICAgIH0KKworICAgIGlmIChvdXRfY2hhbm5lbHMpIHsKKyAgICAgICAgaW50IGNoYW5uZWxfbW9kZSA9IChoZWFkZXIgPj4gNikgJiAzOworCisgICAgICAgICpvdXRfY2hhbm5lbHMgPSAoY2hhbm5lbF9tb2RlID09IDMpID8gMSA6IDI7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaAppbmRleCBlZjExNDM0Li44ZmU5ZjhkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oCkBAIC0yNyw3ICsyNyw2IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBTWVzc2FnZTsKLWNsYXNzIE1lZGlhQnVmZmVyQmFzZTsKIAogc3RydWN0IEFCdWZmZXIgOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgZXhwbGljaXQgQUJ1ZmZlcihzaXplX3QgY2FwYWNpdHkpOwpAQCAtNDksMTcgKzQ4LDEyIEBACiAKICAgICBzcDxBTWVzc2FnZT4gbWV0YSgpOwogCi0gICAgTWVkaWFCdWZmZXJCYXNlICpnZXRNZWRpYUJ1ZmZlckJhc2UoKTsKLSAgICB2b2lkIHNldE1lZGlhQnVmZmVyQmFzZShNZWRpYUJ1ZmZlckJhc2UgKm1lZGlhQnVmZmVyKTsKLQogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFCdWZmZXIoKTsKIAogcHJpdmF0ZToKICAgICBzcDxBTWVzc2FnZT4gbU1ldGE7CiAKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKm1NZWRpYUJ1ZmZlckJhc2U7Ci0KICAgICB2b2lkICptRGF0YTsKICAgICBzaXplX3QgbUNhcGFjaXR5OwogICAgIHNpemVfdCBtUmFuZ2VPZmZzZXQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGF0YS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURhdGEuaAppbmRleCA0OWFhMGRjLi41YWNjNmQ2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGF0YS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEYXRhLmgKQEAgLTI1LDYgKzI1LDkgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL1R5cGVUcmFpdHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0ZsYWdnZWQuaD4KIAorI3VuZGVmIEhJREUKKyNkZWZpbmUgSElERSBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLyoqCkBAIC03OCw3ICs4MSw3IEBACiAgKiBUaGlzIGNsYXNzIGlzIG5lZWRlZCBhcyBtZW1iZXIgZnVuY3Rpb24gc3BlY2lhbGl6YXRpb24gaXMgbm90IGFsbG93ZWQgZm9yIGEKICAqIHRlbXBsYXRlZCBjbGFzcy4KICAqLwotc3RydWN0IF9BVW5pb25faW1wbCB7CitzdHJ1Y3QgSElERSBfQVVuaW9uX2ltcGwgewogICAgIC8qKgogICAgICAqIENhbGxzIHBsYWNlbWVudCBjb25zdHVjdG9yIGZvciB0eXBlIFQgd2l0aCBhcmJpdHJhcnkgYXJndW1lbnRzIGZvciBhIHN0b3JhZ2UgYXQgYW4gYWRkcmVzcy4KICAgICAgKiBTdG9yYWdlIE1VU1QgYmUgbGFyZ2UgZW5vdWdoIHRvIGNvbnRhaW4gVC4KQEAgLTExMywxMyArMTE2LDEzIEBACiAKIC8qKiBDb25zdHJ1Y3RvciBzcGVjaWFsaXphdGlvbiBmb3Igdm9pZCB0eXBlICovCiB0ZW1wbGF0ZTw+Ci1pbmxpbmUgdm9pZCBfQVVuaW9uX2ltcGw6OmVtcGxhY2U8dm9pZD4oc2l6ZV90IHRvdGFsU2l6ZSwgdm9pZCAqYWRkcikgeworSElERSBpbmxpbmUgdm9pZCBfQVVuaW9uX2ltcGw6OmVtcGxhY2U8dm9pZD4oc2l6ZV90IHRvdGFsU2l6ZSwgdm9pZCAqYWRkcikgewogICAgIG1lbXNldChhZGRyLCAwLCB0b3RhbFNpemUpOwogfQogCiAvKiogRGVzdHJ1Y3RvciBzcGVjaWFsaXphdGlvbiBmb3Igdm9pZCB0eXBlICovCiB0ZW1wbGF0ZTw+Ci1pbmxpbmUgdm9pZCBfQVVuaW9uX2ltcGw6OmRlbDx2b2lkPih2b2lkICopIHsKK0hJREUgaW5saW5lIHZvaWQgX0FVbmlvbl9pbXBsOjpkZWw8dm9pZD4odm9pZCAqKSB7CiB9CiAKIC8vLyBcZW5kY29uZApAQCAtMjIxLDcgKzIyNCw3IEBACiB0ZW1wbGF0ZTwKICAgICAgICAgdHlwZW5hbWUgVCwKICAgICAgICAgYm9vbD1zdGQ6OmlzX2NvcHlfYXNzaWduYWJsZTxUPjo6dmFsdWU+Ci1zdHJ1Y3QgX0FEYXRhX2NvcGllciB7CitzdHJ1Y3QgSElERSBfQURhdGFfY29waWVyIHsKICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfY29weV9hc3NpZ25hYmxlPFQ+Ojp2YWx1ZSwgIlQgbXVzdCBiZSBjb3B5IGFzc2lnbmFibGUgaGVyZSIpOwogCiAgICAgLyoqCkBAIC0yOTQsNyArMjk3LDcgQEAKICAqCiAgKi8KIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgX0FEYXRhX2NvcGllcjxULCBmYWxzZT4geworc3RydWN0IEhJREUgX0FEYXRhX2NvcGllcjxULCBmYWxzZT4gewogICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfY29weV9hc3NpZ25hYmxlPFQ+Ojp2YWx1ZSwgIlQgbXVzdCBub3QgYmUgY29weSBhc3NpZ25hYmxlIGhlcmUiKTsKICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfY29weV9jb25zdHJ1Y3RpYmxlPFQ+Ojp2YWx1ZSwgIlQgbXVzdCBiZSBjb3B5IGNvbnN0cnVjdGlibGUgaGVyZSIpOwogCkBAIC0zMTgsNyArMzIxLDcgQEAKIHRlbXBsYXRlPAogICAgICAgICB0eXBlbmFtZSBULAogICAgICAgICBib29sPXN0ZDo6aXNfbW92ZV9hc3NpZ25hYmxlPFQ+Ojp2YWx1ZT4KLXN0cnVjdCBfQURhdGFfbW92ZXIgeworc3RydWN0IEhJREUgX0FEYXRhX21vdmVyIHsKICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfbW92ZV9hc3NpZ25hYmxlPFQ+Ojp2YWx1ZSwgIlQgbXVzdCBiZSBtb3ZlIGFzc2lnbmFibGUgaGVyZSIpOwogCiAgICAgLyoqCkBAIC0zODksNyArMzkyLDcgQEAKICAqCiAgKi8KIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgX0FEYXRhX21vdmVyPFQsIGZhbHNlPiB7CitzdHJ1Y3QgSElERSBfQURhdGFfbW92ZXI8VCwgZmFsc2U+IHsKICAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX21vdmVfYXNzaWduYWJsZTxUPjo6dmFsdWUsICJUIG11c3Qgbm90IGJlIG1vdmUgYXNzaWduYWJsZSBoZXJlIik7CiAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX21vdmVfY29uc3RydWN0aWJsZTxUPjo6dmFsdWUsICJUIG11c3QgYmUgbW92ZSBjb25zdHJ1Y3RpYmxlIGhlcmUiKTsKIApAQCAtNDA3LDEzICs0MTAsMTMgQEAKICAqIFxwYXJhbSBUcyB0eXBlcyB0byBjb25zaWRlciBmb3IgdGhlIG1lbWJlcgogICovCiB0ZW1wbGF0ZTx0eXBlbmFtZSBGbGFnZ2VyLCB0eXBlbmFtZSBVLCB0eXBlbmFtZSAuLi5Ucz4KLXN0cnVjdCBfQURhdGFfZGVsZXRlcjsKK3N0cnVjdCBISURFIF9BRGF0YV9kZWxldGVyOwogCiAvKioKICAqIFRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHdoZW4gdGhlcmUgYXJlIHN0aWxsIHR5cGVzIHRvIGNvbnNpZGVyIChUIGFuZCByZXN0KQogICovCiB0ZW1wbGF0ZTx0eXBlbmFtZSBGbGFnZ2VyLCB0eXBlbmFtZSBVLCB0eXBlbmFtZSBULCB0eXBlbmFtZSAuLi5Ucz4KLXN0cnVjdCBfQURhdGFfZGVsZXRlcjxGbGFnZ2VyLCBVLCBULCBUcy4uLj4geworc3RydWN0IEhJREUgX0FEYXRhX2RlbGV0ZXI8RmxhZ2dlciwgVSwgVCwgVHMuLi4+IHsKICAgICBzdGF0aWMgYm9vbCBkZWwodHlwZW5hbWUgRmxhZ2dlcjo6dHlwZSBmbGFncywgVSAmZGF0YSkgewogICAgICAgICBpZiAoRmxhZ2dlcjo6Y2FuRGVsZXRlQXMoZmxhZ3MsIEZsYWdnZXI6OmZsYWdGb3IoKFQqKTApKSkgewogICAgICAgICAgICAgZGF0YS50ZW1wbGF0ZSBkZWw8VD4oKTsKQEAgLTQyNyw3ICs0MzAsNyBAQAogICogVGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gd2hlbiB0aGVyZSBhcmUgbm8gbW9yZSB0eXBlcyB0byBjb25zaWRlci4KICAqLwogdGVtcGxhdGU8dHlwZW5hbWUgRmxhZ2dlciwgdHlwZW5hbWUgVT4KLXN0cnVjdCBfQURhdGFfZGVsZXRlcjxGbGFnZ2VyLCBVPiB7CitzdHJ1Y3QgSElERSBfQURhdGFfZGVsZXRlcjxGbGFnZ2VyLCBVPiB7CiAgICAgaW5saW5lIHN0YXRpYyBib29sIGRlbCh0eXBlbmFtZSBGbGFnZ2VyOjp0eXBlLCBVICYpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmgKaW5kZXggYjQ5OGM5MS4uYmFjOGZhOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmgKQEAgLTgyLDYgKzgyLDEwIEBACiBNQUtFX0NPTVBBUkFUT1IoTFQsPCkKIE1BS0VfQ09NUEFSQVRPUihHVCw+KQogCisjaWZkZWYgQ0hFQ0tfT1AKKyN1bmRlZiBDSEVDS19PUAorI2VuZGlmCisKICNkZWZpbmUgQ0hFQ0tfT1AoeCx5LHN1ZmZpeCxvcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgQVN0cmluZyBfX19yZXMgPSBDb21wYXJlXyMjc3VmZml4KHgsIHkpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oCmluZGV4IDg1ODBlYjUuLjc0MjY1MWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaApAQCAtMTksNiArMTksNyBAQAogI2RlZmluZSBBX01FU1NBR0VfSF8KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CkBAIC0xNTUsNiArMTU2LDkgQEAKICAgICAvLyB0aGVpciByZWZjb3VudCBpbmNyZW1lbnRlZC4KICAgICBzcDxBTWVzc2FnZT4gZHVwKCkgY29uc3Q7CiAKKyAgICAvLyBBZGRzIGFsbCBpdGVtcyBmcm9tIG90aGVyIGludG8gdGhpcy4KKyAgICB2b2lkIGV4dGVuZChjb25zdCBzcDxBTWVzc2FnZT4gJm90aGVyKTsKKwogICAgIC8vIFBlcmZvcm1zIGEgc2hhbGxvdyBvciBkZWVwIGNvbXBhcmlzb24gb2YgfHRoaXN8IGFuZCB8b3RoZXJ8IGFuZCByZXR1cm5zCiAgICAgLy8gYW4gQU1lc3NhZ2Ugd2l0aCB0aGUgZGlmZmVyZW5jZXMuCiAgICAgLy8gV2FybmluZzogUmVmQmFzZSBpdGVtcywgaS5lLiAib2JqZWN0cyIgYXJlIF9ub3RfIGNvcGllZCBidXQgb25seSBoYXZlCkBAIC0xODAsOSArMTg0LDgxIEBACiAgICAgICAgIGtUeXBlQnVmZmVyLAogICAgIH07CiAKKyAgICBzdHJ1Y3QgUmVjdCB7CisgICAgICAgIGludDMyX3QgbUxlZnQsIG1Ub3AsIG1SaWdodCwgbUJvdHRvbTsKKyAgICB9OworCiAgICAgc2l6ZV90IGNvdW50RW50cmllcygpIGNvbnN0OwogICAgIGNvbnN0IGNoYXIgKmdldEVudHJ5TmFtZUF0KHNpemVfdCBpbmRleCwgVHlwZSAqdHlwZSkgY29uc3Q7CiAKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGl0ZW0gYXQgYSBzcGVjaWZpYyBpbmRleC4KKyAgICAgKi8KKyAgICB0eXBlZGVmIEFEYXRhPAorICAgICAgICBpbnQzMl90LCBpbnQ2NF90LCBzaXplX3QsIGZsb2F0LCBkb3VibGUsIFJlY3QsIEFTdHJpbmcsCisgICAgICAgIHZvaWQgKiwgc3A8QU1lc3NhZ2U+LCBzcDxBQnVmZmVyPiwgc3A8UmVmQmFzZT4+OjpCYXNpYyBJdGVtRGF0YTsKKworICAgIC8qKgorICAgICAqIEZpbmRzIGFuIGl0ZW0gYnkgbmFtZS4gVGhpcyBjYW4gYmUgdXNlZCBpZiB0aGUgdHlwZSBpcyB1bmtub3duLgorICAgICAqCisgICAgICogXHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgaXRlbQorICAgICAqIFJldHVybnMgYW4gZW1wdHkgaXRlbSBpZiBubyBpdGVtIGlzIHByZXNlbnQgd2l0aCB0aGF0IG5hbWUuCisgICAgICovCisgICAgSXRlbURhdGEgZmluZEl0ZW0oY29uc3QgY2hhciAqbmFtZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGFuIGl0ZW0gb2YgYXJiaXRyYXJ5IHR5cGUuIERvZXMgbm90aGluZyBpZiB0aGUgaXRlbSB2YWx1ZSBpcyBlbXB0eS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIGl0ZW0KKyAgICAgKiBccGFyYW0gaXRlbSB2YWx1ZSBvZiB0aGUgaXRlbQorICAgICAqLworICAgIHZvaWQgc2V0SXRlbShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBJdGVtRGF0YSAmaXRlbSk7CisKKyAgICBJdGVtRGF0YSBnZXRFbnRyeUF0KHNpemVfdCBpbmRleCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBGaW5kcyBhbiBlbnRyeSBieSBuYW1lIGFuZCByZXR1cm5zIGl0cyBpbmRleC4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgY291bnRFbnRyaWVzKCkgaWYgdGhlIGVudHJ5IGlzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBzaXplX3QgZmluZEVudHJ5QnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0OworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbmFtZSBvZiBhbiBlbnRyeSBiYXNlZCBvbiBpbmRleC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpbmRleCBpbmRleCBvZiB0aGUgZW50cnkKKyAgICAgKiBccGFyYW0gbmFtZSAobmV3KSBuYW1lIG9mIHRoZSBlbnRyeQorICAgICAqCisgICAgICogXHJldHZhbCBPSyB0aGUgbmFtZSB3YXMgc2V0IHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQkFEX0lOREVYIGludmFsaWQgaW5kZXgKKyAgICAgKiBccmV0dmFsIEJBRF9WQUxVRSBuYW1lIGlzIGludmFsaWQgKG51bGwpCisgICAgICogXHJldHZhbCBBTFJFQURZX0VYSVNUUyBuYW1lIGlzIGFscmVhZHkgdXNlZCBieSBhbm90aGVyIGVudHJ5CisgICAgICovCisgICAgc3RhdHVzX3Qgc2V0RW50cnlOYW1lQXQoc2l6ZV90IGluZGV4LCBjb25zdCBjaGFyICpuYW1lKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGl0ZW0gb2YgYW4gZW50cnkgYmFzZWQgb24gaW5kZXguCisgICAgICoKKyAgICAgKiBccGFyYW0gaW5kZXggaW5kZXggb2YgdGhlIGVudHJ5CisgICAgICogXHBhcmFtIGl0ZW0gbmV3IGl0ZW0gb2YgdGhlIGVudHJ5CisgICAgICoKKyAgICAgKiBccmV0dmFsIE9LIHRoZSBpdGVtIHdhcyBzZXQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBCQURfSU5ERVggaW52YWxpZCBpbmRleAorICAgICAqIFxyZXR2YWwgQkFEX1ZBTFVFIGl0ZW0gaXMgaW52YWxpZCAobnVsbCkKKyAgICAgKiBccmV0dmFsIEJBRF9UWVBFIHR5cGUgaXMgdW5zdXBwb3J0ZWQgKHNob3VsZCBub3QgaGFwcGVuKQorICAgICAqLworICAgIHN0YXR1c190IHNldEVudHJ5QXQoc2l6ZV90IGluZGV4LCBjb25zdCBJdGVtRGF0YSAmaXRlbSk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGFuIGVudHJ5IGJhc2VkIG9uIGluZGV4LgorICAgICAqCisgICAgICogXHBhcmFtIGluZGV4IGluZGV4IG9mIHRoZSBlbnRyeQorICAgICAqCisgICAgICogXHJldHZhbCBPSyB0aGUgZW50cnkgd2FzIHJlbW92ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBCQURfSU5ERVggaW52YWxpZCBpbmRleAorICAgICAqLworICAgIHN0YXR1c190IHJlbW92ZUVudHJ5QXQoc2l6ZV90IGluZGV4KTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFNZXNzYWdlKCk7CiAKQEAgLTE5NywxMCArMjczLDYgQEAKICAgICB3cDxBSGFuZGxlcj4gbUhhbmRsZXI7CiAgICAgd3A8QUxvb3Blcj4gbUxvb3BlcjsKIAotICAgIHN0cnVjdCBSZWN0IHsKLSAgICAgICAgaW50MzJfdCBtTGVmdCwgbVRvcCwgbVJpZ2h0LCBtQm90dG9tOwotICAgIH07Ci0KICAgICBzdHJ1Y3QgSXRlbSB7CiAgICAgICAgIHVuaW9uIHsKICAgICAgICAgICAgIGludDMyX3QgaW50MzJWYWx1ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmgKaW5kZXggMjU1YTBmNC4uYWY2YjM1NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmgKQEAgLTIyLDI4ICsyMiwyOCBAQAogCiAvKiBUIG11c3QgYmUgaW50ZWdlciB0eXBlLCBkZW4gbXVzdCBub3QgYmUgMCAqLwogdGVtcGxhdGU8Y2xhc3MgVD4KLWlubGluZSBzdGF0aWMgY29uc3QgVCBkaXZSb3VuZChjb25zdCBUICZub20sIGNvbnN0IFQgJmRlbikgewotICAgIGlmICgobm9tID49IDApIF4gKGRlbiA+PSAwKSkgewotICAgICAgICByZXR1cm4gKG5vbSAtIGRlbiAvIDIpIC8gZGVuOworaW5saW5lIHN0YXRpYyBjb25zdCBUIGRpdlJvdW5kKGNvbnN0IFQgJm51bSwgY29uc3QgVCAmZGVuKSB7CisgICAgaWYgKChudW0gPj0gMCkgXiAoZGVuID49IDApKSB7CisgICAgICAgIHJldHVybiAobnVtIC0gZGVuIC8gMikgLyBkZW47CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIChub20gKyBkZW4gLyAyKSAvIGRlbjsKKyAgICAgICAgcmV0dXJuIChudW0gKyBkZW4gLyAyKSAvIGRlbjsKICAgICB9CiB9CiAKLS8qID09IGNlaWwobm9tIC8gZGVuKS4gVCBtdXN0IGJlIGludGVnZXIgdHlwZSwgZGVuIG11c3Qgbm90IGJlIDAgKi8KKy8qID09IGNlaWwobnVtIC8gZGVuKS4gVCBtdXN0IGJlIGludGVnZXIgdHlwZSwgZGVuIG11c3Qgbm90IGJlIDAgKi8KIHRlbXBsYXRlPGNsYXNzIFQ+Ci1pbmxpbmUgc3RhdGljIGNvbnN0IFQgZGl2VXAoY29uc3QgVCAmbm9tLCBjb25zdCBUICZkZW4pIHsKK2lubGluZSBzdGF0aWMgY29uc3QgVCBkaXZVcChjb25zdCBUICZudW0sIGNvbnN0IFQgJmRlbikgewogICAgIGlmIChkZW4gPCAwKSB7Ci0gICAgICAgIHJldHVybiAobm9tIDwgMCA/IG5vbSArIGRlbiArIDEgOiBub20pIC8gZGVuOworICAgICAgICByZXR1cm4gKG51bSA8IDAgPyBudW0gKyBkZW4gKyAxIDogbnVtKSAvIGRlbjsKICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gKG5vbSA8IDAgPyBub20gOiBub20gKyBkZW4gLSAxKSAvIGRlbjsKKyAgICAgICAgcmV0dXJuIChudW0gPCAwID8gbnVtIDogbnVtICsgZGVuIC0gMSkgLyBkZW47CiAgICAgfQogfQogCi0vKiA9PSBjZWlsKG5vbSAvIGRlbikgKiBkZW4uIFQgbXVzdCBiZSBpbnRlZ2VyIHR5cGUsIGFsaWdubWVudCBtdXN0IGJlIHBvc2l0aXZlIHBvd2VyIG9mIDIgKi8KKy8qID09IGNlaWwobnVtIC8gZGVuKSAqIGRlbi4gVCBtdXN0IGJlIGludGVnZXIgdHlwZSwgYWxpZ25tZW50IG11c3QgYmUgcG9zaXRpdmUgcG93ZXIgb2YgMiAqLwogdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KLWlubGluZSBzdGF0aWMgY29uc3QgVCBhbGlnbihjb25zdCBUICZub20sIGNvbnN0IFUgJmRlbikgewotICAgIHJldHVybiAobm9tICsgKFQpKGRlbiAtIDEpKSAmIChUKX4oZGVuIC0gMSk7CitpbmxpbmUgc3RhdGljIGNvbnN0IFQgYWxpZ24oY29uc3QgVCAmbnVtLCBjb25zdCBVICZkZW4pIHsKKyAgICByZXR1cm4gKG51bSArIChUKShkZW4gLSAxKSkgJiAoVCl+KGRlbiAtIDEpOwogfQogCiB0ZW1wbGF0ZTxjbGFzcyBUPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDM0ZjgxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQllURV9VVElMU19ICisKKyNkZWZpbmUgQllURV9VVElMU19ICisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgaW50IEZPVVJDQyh1bnNpZ25lZCBjaGFyIGMxLCB1bnNpZ25lZCBjaGFyIGMyLCB1bnNpZ25lZCBjaGFyIGMzLCB1bnNpZ25lZCBjaGFyIGM0KSB7CisgICAgcmV0dXJuICgoYzEpIDw8IDI0IHwgKGMyKSA8PCAxNiB8IChjMykgPDwgOCB8IChjNCkpOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IE4+Citjb25zdGV4cHIgaW50MzJfdCBGT1VSQ0MoY29uc3QgY2hhciAoJnMpIFtOXSkgeworICAgIHN0YXRpY19hc3NlcnQoTiA9PSA1LCAiZm91cmNjOiB3cm9uZyBsZW5ndGgiKTsKKyAgICByZXR1cm4KKyAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKSBzWzBdIDw8IDI0IHwKKyAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKSBzWzFdIDw8IDE2IHwKKyAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKSBzWzJdIDw8IDggfAorICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpIHNbM10gPDwgMDsKK30KKworCit1aW50MTZfdCBVMTZfQVQoY29uc3QgdWludDhfdCAqcHRyKTsKK3VpbnQzMl90IFUzMl9BVChjb25zdCB1aW50OF90ICpwdHIpOwordWludDY0X3QgVTY0X0FUKGNvbnN0IHVpbnQ4X3QgKnB0cik7CisKK3VpbnQxNl90IFUxNkxFX0FUKGNvbnN0IHVpbnQ4X3QgKnB0cik7Cit1aW50MzJfdCBVMzJMRV9BVChjb25zdCB1aW50OF90ICpwdHIpOwordWludDY0X3QgVTY0TEVfQVQoY29uc3QgdWludDhfdCAqcHRyKTsKKwordWludDY0X3QgbnRvaDY0KHVpbnQ2NF90IHgpOwordWludDY0X3QgaHRvbjY0KHVpbnQ2NF90IHgpOworCit2b2lkIE1ha2VGb3VyQ0NTdHJpbmcodWludDMyX3QgeCwgY2hhciAqcyk7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQllURV9VVElMU19ICisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaAppbmRleCBiODg5YTAyLi5kNmM3NjhkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oCkBAIC0zOSwyNiArMzksMjggQEAKICAgICAgKiB2ZW5kb3ItZXh0ZW5zaW9uIHNlY3Rpb24gc28gdGhleSB3b24ndCBjb2xsaWRlIHdpdGggZnV0dXJlIHBsYXRmb3JtIHZhbHVlcy4KICAgICAgKi8KIAotI2RlZmluZSBHRVRfSEFMX0VOVU0oY2xhc3MsIG5hbWUpIEhBTF9EQVRBU1BBQ0VfIyNjbGFzcyMjbmFtZQotI2RlZmluZSBHRVRfSEFMX0JJVEZJRUxEKGNsYXNzLCBuYW1lKSAoR0VUX0hBTF9FTlVNKGNsYXNzLCBfIyNuYW1lKSA+PiBHRVRfSEFMX0VOVU0oY2xhc3MsIF9TSElGVCkpCi0KKyAgICAvKioKKyAgICAgKiBncmFwaGljLmggY29uc3RhbnRzIGNoYW5nZWQgaW4gQW5kcm9pZCA4LjAgYWZ0ZXIgQ29sb3JTdGFuZGFyZCB2YWx1ZXMgd2VyZSBhbHJlYWR5IHB1YmxpYworICAgICAqIGluIEFuZHJvaWQgNy4wLiBXZSB3aWxsIG5vdCBkZWFsIHdpdGggdGhlIGJyZWFrIGluIGdyYXBoaWMuaCBoZXJlLCBidXQgbGlzdCB0aGUgcHVibGljCisgICAgICogQW5kcm9pZCBTREsgTWVkaWFGb3JtYXQgdmFsdWVzIGhlcmUuCisgICAgICovCiAgICAgZW51bSBDb2xvclN0YW5kYXJkIDogdWludDMyX3QgewotICAgICAgICBrQ29sb3JTdGFuZGFyZFVuc3BlY2lmaWVkID0gICAgICAgICAgR0VUX0hBTF9CSVRGSUVMRChTVEFOREFSRCwgVU5TUEVDSUZJRUQpLAotICAgICAgICBrQ29sb3JTdGFuZGFyZEJUNzA5ID0gICAgICAgICAgICAgICAgR0VUX0hBTF9CSVRGSUVMRChTVEFOREFSRCwgQlQ3MDkpLAotICAgICAgICBrQ29sb3JTdGFuZGFyZEJUNjAxXzYyNSA9ICAgICAgICAgICAgR0VUX0hBTF9CSVRGSUVMRChTVEFOREFSRCwgQlQ2MDFfNjI1KSwKLSAgICAgICAga0NvbG9yU3RhbmRhcmRCVDYwMV82MjVfVW5hZGp1c3RlZCA9IEdFVF9IQUxfQklURklFTEQoU1RBTkRBUkQsIEJUNjAxXzYyNV9VTkFESlVTVEVEKSwKLSAgICAgICAga0NvbG9yU3RhbmRhcmRCVDYwMV81MjUgPSAgICAgICAgICAgIEdFVF9IQUxfQklURklFTEQoU1RBTkRBUkQsIEJUNjAxXzUyNSksCi0gICAgICAgIGtDb2xvclN0YW5kYXJkQlQ2MDFfNTI1X1VuYWRqdXN0ZWQgPSBHRVRfSEFMX0JJVEZJRUxEKFNUQU5EQVJELCBCVDYwMV81MjVfVU5BREpVU1RFRCksCi0gICAgICAgIGtDb2xvclN0YW5kYXJkQlQyMDIwID0gICAgICAgICAgICAgICBHRVRfSEFMX0JJVEZJRUxEKFNUQU5EQVJELCBCVDIwMjApLAotICAgICAgICBrQ29sb3JTdGFuZGFyZEJUMjAyMENvbnN0YW50ID0gICAgICAgR0VUX0hBTF9CSVRGSUVMRChTVEFOREFSRCwgQlQyMDIwX0NPTlNUQU5UX0xVTUlOQU5DRSksCi0gICAgICAgIGtDb2xvclN0YW5kYXJkQlQ0NzBNID0gICAgICAgICAgICAgICBHRVRfSEFMX0JJVEZJRUxEKFNUQU5EQVJELCBCVDQ3ME0pLAotICAgICAgICBrQ29sb3JTdGFuZGFyZEZpbG0gPSAgICAgICAgICAgICAgICAgR0VUX0hBTF9CSVRGSUVMRChTVEFOREFSRCwgRklMTSksCi0gICAgICAgIGtDb2xvclN0YW5kYXJkTWF4ID0gICAgICAgICAgICAgICAgICBHRVRfSEFMX0JJVEZJRUxEKFNUQU5EQVJELCBNQVNLKSwKKyAgICAgICAga0NvbG9yU3RhbmRhcmRVbnNwZWNpZmllZCA9ICAgICAgICAgIDAsCisgICAgICAgIGtDb2xvclN0YW5kYXJkQlQ3MDkgPSAgICAgICAgICAgICAgICAxLAorICAgICAgICBrQ29sb3JTdGFuZGFyZEJUNjAxXzYyNSA9ICAgICAgICAgICAgMiwKKyAgICAgICAga0NvbG9yU3RhbmRhcmRCVDYwMV82MjVfVW5hZGp1c3RlZCA9IDMsIC8vIG5vdCBpbiBTREsKKyAgICAgICAga0NvbG9yU3RhbmRhcmRCVDYwMV81MjUgPSAgICAgICAgICAgIDQsCisgICAgICAgIGtDb2xvclN0YW5kYXJkQlQ2MDFfNTI1X1VuYWRqdXN0ZWQgPSA1LCAvLyBub3QgaW4gU0RLCisgICAgICAgIGtDb2xvclN0YW5kYXJkQlQyMDIwID0gICAgICAgICAgICAgICA2LAorICAgICAgICBrQ29sb3JTdGFuZGFyZEJUMjAyMENvbnN0YW50ID0gICAgICAgNywgLy8gbm90IGluIFNESworICAgICAgICBrQ29sb3JTdGFuZGFyZEJUNDcwTSA9ICAgICAgICAgICAgICAgOCwgLy8gbm90IGluIFNESworICAgICAgICBrQ29sb3JTdGFuZGFyZEZpbG0gPSAgICAgICAgICAgICAgICAgOSwgLy8gbm90IGluIFNESworICAgICAgICBrQ29sb3JTdGFuZGFyZERDSV9QMyA9ICAgICAgICAgICAgICAgMTAsIC8vIG5vdCBpbiBTREssIG5ldyBpbiBBbmRyb2lkIDguMAogCiAgICAgICAgIC8qIFRoaXMgbWFya3MgYSBzZWN0aW9uIG9mIGNvbG9yLXN0YW5kYXJkIHZhbHVlcyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IGdyYXBoaWNzIEhBTCwKICAgICAgICAgICAgYnV0IHRyYWNrIGRlZmluZWQgY29sb3IgcHJpbWFyaWVzLW1hdHJpeCBjb2VmZmljaWVudCBjb21iaW5hdGlvbnMgaW4gbWVkaWEuCiAgICAgICAgICAgIFRoZXNlIGFyZSBzdGFibGUgZm9yIGEgZ2l2ZW4gcmVsZWFzZS4gKi8KLSAgICAgICAga0NvbG9yU3RhbmRhcmRFeHRlbmRlZFN0YXJ0ID0ga0NvbG9yU3RhbmRhcmRNYXggKyAxLAorICAgICAgICBrQ29sb3JTdGFuZGFyZEV4dGVuZGVkU3RhcnQgPSA2NCwKIAogICAgICAgICAvKiBUaGlzIG1hcmtzIGEgc2VjdGlvbiBvZiBjb2xvci1zdGFuZGFyZCB2YWx1ZXMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSBncmFwaGljcyBIQUwKICAgICAgICAgICAgbm9yIHVzaW5nIG1lZGlhIGRlZmluZWQgY29sb3IgcHJpbWFyaWVzIG9yIG1hdHJpeCBjb2VmZmljaWVudHMuIFRoZXNlIG1heSBkaWZmZXIgcGVyCkBAIC02NywxOSArNjksMTkgQEAKICAgICB9OwogCiAgICAgZW51bSBDb2xvclRyYW5zZmVyIDogdWludDMyX3QgIHsKLSAgICAgICAga0NvbG9yVHJhbnNmZXJVbnNwZWNpZmllZCA9IEdFVF9IQUxfQklURklFTEQoVFJBTlNGRVIsIFVOU1BFQ0lGSUVEKSwKLSAgICAgICAga0NvbG9yVHJhbnNmZXJMaW5lYXIgPSAgICAgIEdFVF9IQUxfQklURklFTEQoVFJBTlNGRVIsIExJTkVBUiksCi0gICAgICAgIGtDb2xvclRyYW5zZmVyU1JHQiA9ICAgICAgICBHRVRfSEFMX0JJVEZJRUxEKFRSQU5TRkVSLCBTUkdCKSwKLSAgICAgICAga0NvbG9yVHJhbnNmZXJTTVBURV8xNzBNID0gIEdFVF9IQUxfQklURklFTEQoVFJBTlNGRVIsIFNNUFRFXzE3ME0pLAotICAgICAgICBrQ29sb3JUcmFuc2ZlckdhbW1hMjIgPSAgICAgR0VUX0hBTF9CSVRGSUVMRChUUkFOU0ZFUiwgR0FNTUEyXzIpLAotICAgICAgICBrQ29sb3JUcmFuc2ZlckdhbW1hMjggPSAgICAgR0VUX0hBTF9CSVRGSUVMRChUUkFOU0ZFUiwgR0FNTUEyXzgpLAotICAgICAgICBrQ29sb3JUcmFuc2ZlclNUMjA4NCA9ICAgICAgR0VUX0hBTF9CSVRGSUVMRChUUkFOU0ZFUiwgU1QyMDg0KSwKLSAgICAgICAga0NvbG9yVHJhbnNmZXJITEcgPSAgICAgICAgIEdFVF9IQUxfQklURklFTEQoVFJBTlNGRVIsIEhMRyksCi0gICAgICAgIGtDb2xvclRyYW5zZmVyTWF4ID0gICAgICAgICBHRVRfSEFMX0JJVEZJRUxEKFRSQU5TRkVSLCBNQVNLKSwKKyAgICAgICAga0NvbG9yVHJhbnNmZXJVbnNwZWNpZmllZCA9IDAsCisgICAgICAgIGtDb2xvclRyYW5zZmVyTGluZWFyID0gICAgICAxLAorICAgICAgICBrQ29sb3JUcmFuc2ZlclNSR0IgPSAgICAgICAgMiwKKyAgICAgICAga0NvbG9yVHJhbnNmZXJTTVBURV8xNzBNID0gIDMsIC8vIG5vdCBpbiBTREsKKyAgICAgICAga0NvbG9yVHJhbnNmZXJHYW1tYTIyID0gICAgIDQsIC8vIG5vdCBpbiBTREsKKyAgICAgICAga0NvbG9yVHJhbnNmZXJHYW1tYTI4ID0gICAgIDUsIC8vIG5vdCBpbiBTREsKKyAgICAgICAga0NvbG9yVHJhbnNmZXJTVDIwODQgPSAgICAgIDYsCisgICAgICAgIGtDb2xvclRyYW5zZmVySExHID0gICAgICAgICA3LAorICAgICAgICBrQ29sb3JUcmFuc2ZlckdhbW1hMjYgPSAgICAgOCwgLy8gbm90IGluIFNESywgbmV3IGluIEFuZHJvaWQgOC4wCiAKICAgICAgICAgLyogVGhpcyBtYXJrcyBhIHNlY3Rpb24gb2YgY29sb3ItdHJhbnNmZXIgdmFsdWVzIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgZ3JhcGhpY3MgSEFMLAogICAgICAgICAgICBidXQgdHJhY2sgbWVkaWEtZGVmaW5lZCBjb2xvci10cmFuc2Zlci4gVGhlc2UgYXJlIHN0YWJsZSBmb3IgYSBnaXZlbiByZWxlYXNlLiAqLwotICAgICAgICBrQ29sb3JUcmFuc2ZlckV4dGVuZGVkU3RhcnQgPSBrQ29sb3JUcmFuc2Zlck1heCArIDEsCisgICAgICAgIGtDb2xvclRyYW5zZmVyRXh0ZW5kZWRTdGFydCA9IDMyLAogCiAgICAgICAgIC8qIFRoaXMgbWFya3MgYSBzZWN0aW9uIG9mIGNvbG9yLXRyYW5zZmVyIHZhbHVlcyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IGdyYXBoaWNzIEhBTAogICAgICAgICAgICBub3IgZGVmaW5lZCBieSBtZWRpYS4gVGhlc2UgbWF5IGRpZmZlciBwZXIgZGV2aWNlLiAqLwpAQCAtODcsMjMgKzg5LDE5IEBACiAgICAgfTsKIAogICAgIGVudW0gQ29sb3JSYW5nZSA6IHVpbnQzMl90ICB7Ci0gICAgICAgIGtDb2xvclJhbmdlVW5zcGVjaWZpZWQgPSBHRVRfSEFMX0JJVEZJRUxEKFJBTkdFLCBVTlNQRUNJRklFRCksCi0gICAgICAgIGtDb2xvclJhbmdlRnVsbCA9ICAgICAgICBHRVRfSEFMX0JJVEZJRUxEKFJBTkdFLCBGVUxMKSwKLSAgICAgICAga0NvbG9yUmFuZ2VMaW1pdGVkID0gICAgIEdFVF9IQUxfQklURklFTEQoUkFOR0UsIExJTUlURUQpLAotICAgICAgICBrQ29sb3JSYW5nZU1heCA9ICAgICAgICAgR0VUX0hBTF9CSVRGSUVMRChSQU5HRSwgTUFTSyksCisgICAgICAgIGtDb2xvclJhbmdlVW5zcGVjaWZpZWQgPSAwLAorICAgICAgICBrQ29sb3JSYW5nZUZ1bGwgPSAgICAgICAgMSwKKyAgICAgICAga0NvbG9yUmFuZ2VMaW1pdGVkID0gICAgIDIsCiAKICAgICAgICAgLyogVGhpcyBtYXJrcyBhIHNlY3Rpb24gb2YgY29sb3ItdHJhbnNmZXIgdmFsdWVzIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgZ3JhcGhpY3MgSEFMLAogICAgICAgICAgICBidXQgdHJhY2sgbWVkaWEtZGVmaW5lZCBjb2xvci10cmFuc2Zlci4gVGhlc2UgYXJlIHN0YWJsZSBmb3IgYSBnaXZlbiByZWxlYXNlLiAqLwotICAgICAgICBrQ29sb3JSYW5nZUV4dGVuZGVkU3RhcnQgPSBrQ29sb3JSYW5nZU1heCArIDEsCisgICAgICAgIGtDb2xvclJhbmdlRXh0ZW5kZWRTdGFydCA9IDgsCiAKICAgICAgICAgLyogVGhpcyBtYXJrcyBhIHNlY3Rpb24gb2YgY29sb3ItdHJhbnNmZXIgdmFsdWVzIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgZ3JhcGhpY3MgSEFMCiAgICAgICAgICAgIG5vciBkZWZpbmVkIGJ5IG1lZGlhLiBUaGVzZSBtYXkgZGlmZmVyIHBlciBkZXZpY2UuICovCiAgICAgICAgIGtDb2xvclJhbmdlVmVuZG9yU3RhcnQgPSAweDEwMDAwLAogICAgIH07CiAKLSN1bmRlZiBHRVRfSEFMX0JJVEZJRUxECi0jdW5kZWYgR0VUX0hBTF9FTlVNCi0KICAgICAvKgogICAgICAqIFN0YXRpYyB1dGlsaXRpZXMgZm9yIGNvZGVjIHN1cHBvcnQKICAgICAgKi8KQEAgLTE5Nyw3ICsxOTUsOCBAQAogICAgICAgICBjYXNlIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQyMDIwQ29uc3RhbnQ6ICAgICAgIHJldHVybiAiQlQyMDIwQ29uc3RhbnQiOwogICAgICAgICBjYXNlIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQ0NzBNOiAgICAgICAgICAgICAgIHJldHVybiAiQlQ0NzBNIjsKICAgICAgICAgY2FzZSBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEZpbG06ICAgICAgICAgICAgICAgICByZXR1cm4gIkZpbG0iOwotICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICAgICAgY2FzZSBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZERDSV9QMzogICAgICAgICAgICAgICByZXR1cm4gIkRDSV9QMyI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKICAgICB9CiB9CiAKQEAgLTIxMiw3ICsyMTEsOCBAQAogICAgICAgICBjYXNlIENvbG9yVXRpbHM6OmtDb2xvclRyYW5zZmVyR2FtbWEyODogICAgIHJldHVybiAiR2FtbWEyOCI7CiAgICAgICAgIGNhc2UgQ29sb3JVdGlsczo6a0NvbG9yVHJhbnNmZXJTVDIwODQ6ICAgICAgcmV0dXJuICJTVDIwODQiOwogICAgICAgICBjYXNlIENvbG9yVXRpbHM6OmtDb2xvclRyYW5zZmVySExHOiAgICAgICAgIHJldHVybiAiSExHIjsKLSAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgICAgIGNhc2UgQ29sb3JVdGlsczo6a0NvbG9yVHJhbnNmZXJHYW1tYTI2OiAgICAgcmV0dXJuICJHYW1tYTI2IjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOwogICAgIH0KIH0KIApAQCAtMjIyLDcgKzIyMiw3IEBACiAgICAgICAgIGNhc2UgQ29sb3JVdGlsczo6a0NvbG9yUmFuZ2VVbnNwZWNpZmllZDogcmV0dXJuICJVbnNwZWNpZmllZCI7CiAgICAgICAgIGNhc2UgQ29sb3JVdGlsczo6a0NvbG9yUmFuZ2VGdWxsOiAgICAgICAgcmV0dXJuICJGdWxsIjsKICAgICAgICAgY2FzZSBDb2xvclV0aWxzOjprQ29sb3JSYW5nZUxpbWl0ZWQ6ICAgICByZXR1cm4gIkxpbWl0ZWQiOwotICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXJCYXNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlckJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk0MThmYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlckJhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfQlVGRkVSX0JBU0VfSF8KLQotI2RlZmluZSBNRURJQV9CVUZGRVJfQkFTRV9IXwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1lZGlhQnVmZmVyQmFzZSB7Ci1wdWJsaWM6Ci0gICAgTWVkaWFCdWZmZXJCYXNlKCkge30KLQotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBhZGRfcmVmKCkgPSAwOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+TWVkaWFCdWZmZXJCYXNlKCkge30KLQotcHJpdmF0ZToKLSAgICBNZWRpYUJ1ZmZlckJhc2UoY29uc3QgTWVkaWFCdWZmZXJCYXNlICYpOwotICAgIE1lZGlhQnVmZmVyQmFzZSAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhQnVmZmVyQmFzZSAmKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTUVESUFfQlVGRkVSX0JBU0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViZTg5ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0RFRlNfSF8KKworI2RlZmluZSBNRURJQV9ERUZTX0hfCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0lNQUdFX0pQRUc7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDOworCitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fVlA4OworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOTsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19BVkM7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNDsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1JBVzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT047CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fU0NSQU1CTEVEOworCitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05COworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQjsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHOyAgICAgICAgICAgLy8gbGF5ZXIgSUlJCitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01QRUdfTEFZRVJfSUk7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTUlESTsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUM7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fUUNFTFA7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX09QVVM7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19SQVc7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUUzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NU0dTTTsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQzM7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQ7CisKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzQ7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dBVjsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfT0dHOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NQVRST1NLQTsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJUUzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfQVZJOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlBTOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9IRUlGOworCitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1RFWFRfU1VCUklQOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1RFWFRfVlRUOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1RFWFRfQ0VBXzYwODsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9URVhUX0NFQV83MDg7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfREFUQV9USU1FRF9JRDM7CisKKy8vIFRoZXNlIGFyZSB2YWx1ZXMgZXhwb3J0ZWQgdG8gSkFWQSBBUEkgdGhhdCBuZWVkIHRvIGJlIGluIHN5bmMgd2l0aAorLy8gZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb0Zvcm1hdC5qYXZhLiBVbmZvcnR1bmF0ZWx5LAorLy8gdGhleSBhcmUgbm90IGRlZmluZWQgaW4gZnJhbWV3b3Jrcy9hdiwgc28gZGVmaW5pbmcgdGhlbSBoZXJlLgorZW51bSBBdWRpb0VuY29kaW5nIHsKKyAgICBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0ID0gMiwKKyAgICBrQXVkaW9FbmNvZGluZ1BjbThiaXQgPSAzLAorICAgIGtBdWRpb0VuY29kaW5nUGNtRmxvYXQgPSA0LAorfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9ERUZTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUtleXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhS2V5cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOTI0YmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUtleXMuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9LRVlTX0hfCisKKyNkZWZpbmUgTUVESUFfS0VZU19IXworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIFdoZW4gc2lnbmFsbGluZyBhIGRpc2NvbnRpbnVpdHkgdG8gSVN0cmVhbUxpc3RlbmVyIHlvdSBjYW4gb3B0aW9uYWxseQorLy8gc3BlY2lmeSB0aGUgdHlwZShzKSBvZiBkaXNjb250aW51aXR5LCBpLmUuIGlmIHRoZSBhdWRpbyBmb3JtYXQgaGFzIGNoYW5nZWQsCisvLyB0aGUgdmlkZW8gZm9ybWF0IGhhcyBjaGFuZ2VkLCB0aW1lIGhhcyBqdW1wZWQgb3IgYW55IGNvbWJpbmF0aW9uIHRoZXJlb2YuCisvLyBUbyBkbyBzbywgaW5jbHVkZSBhIG5vbi16ZXJvIGludDMyX3QgdmFsdWUgdW5kZXIgdGhlIGtleQorLy8gImtJU3RyZWFtTGlzdGVuZXJLZXlEaXNjb250aW51aXR5TWFzayIgd2hlbiBpc3N1aW5nIHRoZQorLy8gSVN0cmVhbUxpc3RlbmVyOjpESVNDT05USU5VSVRZIGNvbW1hbmQuCisvLyBJZiB0aGVyZSBpcyBhIGNoYW5nZSBpbiBhdWRpby92aWRlbyBmb3JtYXQsIFRoZSBuZXcgbG9naWNhbCBzdHJlYW0KKy8vIG11c3Qgc3RhcnQgd2l0aCBwcm9wZXIgY29kZWMgaW5pdGlhbGl6YXRpb24KKy8vIGluZm9ybWF0aW9uIGZvciBwbGF5YmFjayB0byBjb250aW51ZSwgaS5lLiBTUFMgYW5kIFBQUyBpbiB0aGUgY2FzZQorLy8gb2YgQVZDIHZpZGVvIGV0Yy4KKy8vIElmIHRoaXMga2V5IGlzIG5vdCBwcmVzZW50LCBvbmx5IGEgdGltZSBkaXNjb250aW51aXR5IGlzIGFzc3VtZWQuCisvLyBUaGUgdmFsdWUgc2hvdWxkIGJlIGEgYml0bWFzayBvZiB2YWx1ZXMgZnJvbQorLy8gQVRTUGFyc2VyOjpEaXNjb250aW51aXR5VHlwZS4KK2V4dGVybiBjb25zdCBjaGFyICpjb25zdCBrSVN0cmVhbUxpc3RlbmVyS2V5RGlzY29udGludWl0eU1hc2s7CisKKy8vIFdoZW4gc2lnbmFsbGluZyBhIGRpc2NvbnRpbnVpdHkgdG8gQVRTUGFyc2VyIHlvdSBjYW4gb3B0aW9uYWxseQorLy8gc3BlY2lmeSBhbiBpbnQ2NF90IFBUUyB0aW1lc3RhbXAgaW4gImV4dHJhIi4KKy8vIElmIHByZXNlbnQsIHJlbmRlcmluZyBvZiBkYXRhIGZvbGxvd2luZyB0aGUgZGlzY29udGludWl0eQorLy8gd2lsbCBiZSBzdXBwcmVzc2VkIHVudGlsIG1lZGlhIHRpbWUgcmVhY2hlcyB0aGlzIHRpbWVzdGFtcC4KK2V4dGVybiBjb25zdCBjaGFyICpjb25zdCBrQVRTUGFyc2VyS2V5UmVzdW1lQXRQVFM7CisKKy8vIFdoZW4gc2lnbmFsbGluZyBhIGRpc2NvbnRpbnVpdHkgdG8gQVRTUGFyc2VyIHlvdSBjYW4gb3B0aW9uYWxseQorLy8gc3BlY2lmeSBhbiBpbnQ2NF90IFBUUyB0aW1lc3RhbXAgaW4gImV4dHJhIi4KKy8vIEl0IGluZGljYXRlcyB0aGUgbWVkaWEgdGltZSAoaW4gdXMpIHRvIGJlIGFzc29jaWF0ZWQKKy8vIHdpdGggdGhlIG5leHQgUFRTIG9jY3VyaW5nIGluIHRoZSBzdHJlYW0uIFRoZSB2YWx1ZSBpcyBvZiB0eXBlIGludDY0X3QuCitleHRlcm4gY29uc3QgY2hhciAqY29uc3Qga0FUU1BhcnNlcktleU1lZGlhVGltZVVzOworCisvLyBXaGVuIHNpZ25hbGxpbmcgYSBkaXNjb250aW51aXR5IHRvIEFUU1BhcnNlciB5b3UgY2FuIG9wdGlvbmFsbHkKKy8vIHNwZWNpZnkgYW4gaW50NjRfdCBQVFMgdGltZXN0YW1wIGluICJleHRyYSIuCisvLyBJdCBpbmRpY2F0ZXMgdGhlIG1lZGlhIHRpbWUgKGluIHVzKSBvZiBhIHJlY2VudAorLy8gc2FtcGxlIGZyb20gdGhlIHNhbWUgY29udGVudCwgYW5kIGlzIHVzZWQgYXMgYSBoaW50IGZvciB0aGUgcGFyc2VyIHRvCisvLyBoYW5kbGUgUFRTIHdyYXBhcm91bmQuIFRoaXMgaXMgcmVxdWlyZWQgd2hlbiBhIG5ldyBwYXJzZXIgaXMgY3JlYXRlZAorLy8gdG8gY29udGludWUgcGFyc2luZyBjb250ZW50IGZyb20gdGhlIHNhbWUgdGltZWxpbmUuCitleHRlcm4gY29uc3QgY2hhciAqY29uc3Qga0FUU1BhcnNlcktleVJlY2VudE1lZGlhVGltZVVzOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX0tFWVNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL1R5cGVUcmFpdHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL1R5cGVUcmFpdHMuaAppbmRleCAxMjUwZTliLi4yMDQxYjIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9UeXBlVHJhaXRzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vVHlwZVRyYWl0cy5oCkBAIC0xOSw2ICsxOSw5IEBACiAKICNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KIAorI3VuZGVmIEhJREUKKyNkZWZpbmUgSElERSBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLyoqCkBAIC0zMSw3ICszNCw3IEBACiAgKiBUeXBlIHN1cHBvcnQgdXRpbGl0eSBjbGFzcyB0byBjaGVjayBpZiBhIHR5cGUgaXMgYW4gaW50ZWdyYWwgdHlwZSBvciBhbiBlbnVtLgogICovCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3RydWN0IGlzX2ludGVncmFsX29yX2VudW0KK3N0cnVjdCBISURFIGlzX2ludGVncmFsX29yX2VudW0KICAgICA6IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgc3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUgfHwgc3RkOjppc19lbnVtPFQ+Ojp2YWx1ZT4geyB9OwogCiAvKioKQEAgLTQ2LDcgKzQ5LDcgQEAKICAgICAgICAgdHlwZW5hbWUgVT10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxpc19pbnRlZ3JhbF9vcl9lbnVtPFQ+Ojp2YWx1ZT46OnR5cGUsCiAgICAgICAgIGJvb2w9c3RkOjppc19lbnVtPFQ+Ojp2YWx1ZSwKICAgICAgICAgYm9vbD1zdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZT4KLXN0cnVjdCB1bmRlcmx5aW5nX2ludGVncmFsX3R5cGUgeworc3RydWN0IEhJREUgdW5kZXJseWluZ19pbnRlZ3JhbF90eXBlIHsKICAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX2VudW08VD46OnZhbHVlLCAiVCBzaG91bGQgbm90IGJlIGVudW0gaGVyZSIpOwogICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfaW50ZWdyYWw8VD46OnZhbHVlLCAiVCBzaG91bGQgbm90IGJlIGludGVncmFsIGhlcmUiKTsKICAgICB0eXBlZGVmIFUgdHlwZTsKQEAgLTU0LDcgKzU3LDcgQEAKIAogLyoqIFNwZWNpYWxpemF0aW9uIGZvciBlbnVtcy4gKi8KIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Ci1zdHJ1Y3QgdW5kZXJseWluZ19pbnRlZ3JhbF90eXBlPFQsIFUsIHRydWUsIGZhbHNlPiB7CitzdHJ1Y3QgSElERSB1bmRlcmx5aW5nX2ludGVncmFsX3R5cGU8VCwgVSwgdHJ1ZSwgZmFsc2U+IHsKICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZW51bTxUPjo6dmFsdWUsICJUIHNob3VsZCBiZSBlbnVtIGhlcmUiKTsKICAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSwgIlQgc2hvdWxkIG5vdCBiZSBpbnRlZ3JhbCBoZXJlIik7CiAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxUPjo6dHlwZSB0eXBlOwpAQCAtNjIsNyArNjUsNyBAQAogCiAvKiogU3BlY2lhbGl6YXRpb24gZm9yIG5vbi1lbnVtIHN0ZC1pbnRlZ3JhbCB0eXBlcy4gKi8KIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+Ci1zdHJ1Y3QgdW5kZXJseWluZ19pbnRlZ3JhbF90eXBlPFQsIFUsIGZhbHNlLCB0cnVlPiB7CitzdHJ1Y3QgSElERSB1bmRlcmx5aW5nX2ludGVncmFsX3R5cGU8VCwgVSwgZmFsc2UsIHRydWU+IHsKICAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX2VudW08VD46OnZhbHVlLCAiVCBzaG91bGQgbm90IGJlIGVudW0gaGVyZSIpOwogICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUsICJUIHNob3VsZCBiZSBpbnRlZ3JhbCBoZXJlIik7CiAgICAgdHlwZWRlZiBUIHR5cGU7CkBAIC03Miw3ICs3NSw3IEBACiAgKiBUeXBlIHN1cHBvcnQgdXRpbGl0eSBjbGFzcyB0byBjaGVjayBpZiB0aGUgdW5kZXJseWluZyBpbnRlZ3JhbCB0eXBlIGlzIHNpZ25lZC4KICAqLwogdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXN0cnVjdCBpc19zaWduZWRfaW50ZWdyYWwKK3N0cnVjdCBISURFIGlzX3NpZ25lZF9pbnRlZ3JhbAogICAgIDogc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLCBzdGQ6OmlzX3NpZ25lZDwKICAgICAgICAgICAgIHR5cGVuYW1lIHVuZGVybHlpbmdfaW50ZWdyYWxfdHlwZTxULCB1bnNpZ25lZD46OnR5cGU+Ojp2YWx1ZT4geyB9OwogCkBAIC04MCw3ICs4Myw3IEBACiAgKiBUeXBlIHN1cHBvcnQgdXRpbGl0eSBjbGFzcyB0byBjaGVjayBpZiB0aGUgdW5kZXJseWluZyBpbnRlZ3JhbCB0eXBlIGlzIHVuc2lnbmVkLgogICovCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3RydWN0IGlzX3Vuc2lnbmVkX2ludGVncmFsCitzdHJ1Y3QgSElERSBpc191bnNpZ25lZF9pbnRlZ3JhbAogICAgIDogc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLCBzdGQ6OmlzX3Vuc2lnbmVkPAogICAgICAgICAgICAgdHlwZW5hbWUgdW5kZXJseWluZ19pbnRlZ3JhbF90eXBlPFQsIHNpZ25lZD46OnR5cGU+Ojp2YWx1ZT4gewogfTsKQEAgLTkyLDI2ICs5NSwyNiBAQAogICogbWVtYmVyIGNvbnN0YW50IHx2YWx1ZXwgZXF1YWwgdG8gdHJ1ZS4gT3RoZXJ3aXNlIHZhbHVlIGlzIGZhbHNlLgogICovCiB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSAuLi5Vcz4KLXN0cnVjdCBpc19vbmVfb2Y7CitzdHJ1Y3QgSElERSBpc19vbmVfb2Y7CiAKIC8vLyBcaWYgMAogLyoqCiAgKiBUZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB3aGVuIGZpcnN0IHR5cGUgbWF0Y2hlcyB0aGUgc2VhcmNoZWQgdHlwZS4KICAqLwogdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgLi4uVXM+Ci1zdHJ1Y3QgaXNfb25lX29mPFQsIFQsIFVzLi4uPiA6IHN0ZDo6dHJ1ZV90eXBlIHt9Oworc3RydWN0IEhJREUgaXNfb25lX29mPFQsIFQsIFVzLi4uPiA6IHN0ZDo6dHJ1ZV90eXBlIHt9OwogCiAvKioKICAqIFRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHdoZW4gZmlyc3QgdHlwZSBkb2VzIG5vdCBtYXRjaCB0aGUgc2VhcmNoZWQgdHlwZS4KICAqLwogdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUgLi4uVXM+Ci1zdHJ1Y3QgaXNfb25lX29mPFQsIFUsIFVzLi4uPiA6IGlzX29uZV9vZjxULCBVcy4uLj4ge307CitzdHJ1Y3QgSElERSBpc19vbmVfb2Y8VCwgVSwgVXMuLi4+IDogaXNfb25lX29mPFQsIFVzLi4uPiB7fTsKIAogLyoqCiAgKiBUZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB3aGVuIHRoZXJlIGFyZSBubyB0eXBlcyB0byBzZWFyY2guCiAgKi8KIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgaXNfb25lX29mPFQ+IDogc3RkOjpmYWxzZV90eXBlIHt9Oworc3RydWN0IEhJREUgaXNfb25lX29mPFQ+IDogc3RkOjpmYWxzZV90eXBlIHt9OwogLy8vIFxlbmRpZgogCiAvKioKQEAgLTEyMSw0NCArMTI0LDQ0IEBACiAgKiBPdGhlcndpc2UgdmFsdWUgaXMgZmFsc2UuCiAgKi8KIHRlbXBsYXRlPHR5cGVuYW1lIC4uLlVzPgotc3RydWN0IGFyZV91bmlxdWU7CitzdHJ1Y3QgSElERSBhcmVfdW5pcXVlOwogCiAvLy8gXGlmIDAKIC8qKgogICogVGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gd2hlbiB0aGVyZSBhcmUgbm8gdHlwZXMuCiAgKi8KIHRlbXBsYXRlPD4KLXN0cnVjdCBhcmVfdW5pcXVlPD4gOiBzdGQ6OnRydWVfdHlwZSB7fTsKK3N0cnVjdCBISURFIGFyZV91bmlxdWU8PiA6IHN0ZDo6dHJ1ZV90eXBlIHt9OwogCiAvKioKICAqIFRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHdoZW4gdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHR5cGUgdG8gY2hlY2suCiAgKi8KIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIC4uLlVzPgotc3RydWN0IGFyZV91bmlxdWU8VCwgVXMuLi4+CitzdHJ1Y3QgSElERSBhcmVfdW5pcXVlPFQsIFVzLi4uPgogICAgIDogc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLCBhcmVfdW5pcXVlPFVzLi4uPjo6dmFsdWUgJiYgIWlzX29uZV9vZjxULCBVcy4uLj46OnZhbHVlPiB7fTsKIC8vLyBcZW5kaWYKIAogLy8vIFxpZiAwCiB0ZW1wbGF0ZTxzaXplX3QgQmFzZSwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgLi4uVXM+Ci1zdHJ1Y3QgX2ZpbmRfZmlyc3RfaW1wbDsKK3N0cnVjdCBISURFIF9maW5kX2ZpcnN0X2ltcGw7CiAKIC8qKgogICogVGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gd2hlbiB0aGVyZSBhcmUgbm8gdHlwZXMgdG8gc2VhcmNoLgogICovCiB0ZW1wbGF0ZTxzaXplX3QgQmFzZSwgdHlwZW5hbWUgVD4KLXN0cnVjdCBfZmluZF9maXJzdF9pbXBsPEJhc2UsIFQ+IDogc3RkOjppbnRlZ3JhbF9jb25zdGFudDxzaXplX3QsIDA+IHt9Oworc3RydWN0IEhJREUgX2ZpbmRfZmlyc3RfaW1wbDxCYXNlLCBUPiA6IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8c2l6ZV90LCAwPiB7fTsKIAogLyoqCiAgKiBUZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB3aGVuIFQgaXMgdGhlIGZpcnN0IHR5cGUgaW4gVXMuCiAgKi8KIHRlbXBsYXRlPHNpemVfdCBCYXNlLCB0eXBlbmFtZSBULCB0eXBlbmFtZSAuLi5Vcz4KLXN0cnVjdCBfZmluZF9maXJzdF9pbXBsPEJhc2UsIFQsIFQsIFVzLi4uPiA6IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8c2l6ZV90LCBCYXNlPiB7fTsKK3N0cnVjdCBISURFIF9maW5kX2ZpcnN0X2ltcGw8QmFzZSwgVCwgVCwgVXMuLi4+IDogc3RkOjppbnRlZ3JhbF9jb25zdGFudDxzaXplX3QsIEJhc2U+IHt9OwogCiAvKioKICAqIFRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHdoZW4gVCBpcyBub3QgdGhlIGZpcnN0IHR5cGUgaW4gVXMuCiAgKi8KIHRlbXBsYXRlPHNpemVfdCBCYXNlLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZSAuLi5Vcz4KLXN0cnVjdCBfZmluZF9maXJzdF9pbXBsPEJhc2UsIFQsIFUsIFVzLi4uPgorc3RydWN0IEhJREUgX2ZpbmRfZmlyc3RfaW1wbDxCYXNlLCBULCBVLCBVcy4uLj4KICAgICA6IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8c2l6ZV90LCBfZmluZF9maXJzdF9pbXBsPEJhc2UgKyAxLCBULCBVcy4uLj46OnZhbHVlPiB7fTsKIAogLy8vIFxlbmRpZgpAQCAtMTY5LDcgKzE3Miw3IEBACiAgKiBJZiBUIG9jY3VycyBpbiBVcywgaW5kZXggaXMgdGhlIDEtYmFzZWQgbGVmdC1tb3N0IGluZGV4IG9mIFQgaW4gVXMuIE90aGVyd2lzZSwgaW5kZXggaXMgMC4KICAqLwogdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgLi4uVXM+Ci1zdHJ1Y3QgZmluZF9maXJzdCB7CitzdHJ1Y3QgSElERSBmaW5kX2ZpcnN0IHsKICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBpbmRleCA9IF9maW5kX2ZpcnN0X2ltcGw8MSwgVCwgVXMuLi4+Ojp2YWx1ZTsKIH07CiAKQEAgLTE4MCwxMyArMTgzLDEzIEBACiAgKiBBZGRzIGEgYmFzZSBpbmRleC4KICAqLwogdGVtcGxhdGU8c2l6ZV90IEJhc2UsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIC4uLlVzPgotc3RydWN0IF9maW5kX2ZpcnN0X2NvbnZlcnRpYmxlX3RvX2hlbHBlcjsKK3N0cnVjdCBISURFIF9maW5kX2ZpcnN0X2NvbnZlcnRpYmxlX3RvX2hlbHBlcjsKIAogLyoqCiAgKiBUZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBmb3Igd2hlbiB0aGVyZSBhcmUgbW9yZSB0eXBlcyB0byBjb25zaWRlcgogICovCiB0ZW1wbGF0ZTxzaXplX3QgQmFzZSwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUgLi4uVXM+Ci1zdHJ1Y3QgX2ZpbmRfZmlyc3RfY29udmVydGlibGVfdG9faGVscGVyPEJhc2UsIFQsIFUsIFVzLi4uPiB7CitzdHJ1Y3QgSElERSBfZmluZF9maXJzdF9jb252ZXJ0aWJsZV90b19oZWxwZXI8QmFzZSwgVCwgVSwgVXMuLi4+IHsKICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBpbmRleCA9CiAgICAgICAgIHN0ZDo6aXNfY29udmVydGlibGU8VCwgVT46OnZhbHVlID8gQmFzZSA6CiAgICAgICAgICAgICAgICAgX2ZpbmRfZmlyc3RfY29udmVydGlibGVfdG9faGVscGVyPEJhc2UgKyAxLCBULCBVcy4uLj46OmluZGV4OwpAQCAtMTk5LDcgKzIwMiw3IEBACiAgKiBUZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBmb3Igd2hlbiB0aGVyZSBhcmUgbm8gbW9yZSB0eXBlcyB0byBjb25zaWRlcgogICovCiB0ZW1wbGF0ZTxzaXplX3QgQmFzZSwgdHlwZW5hbWUgVD4KLXN0cnVjdCBfZmluZF9maXJzdF9jb252ZXJ0aWJsZV90b19oZWxwZXI8QmFzZSwgVD4geworc3RydWN0IEhJREUgX2ZpbmRfZmlyc3RfY29udmVydGlibGVfdG9faGVscGVyPEJhc2UsIFQ+IHsKICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBpbmRleCA9IDA7CiAgICAgdHlwZWRlZiB2b2lkIHR5cGU7CiB9OwpAQCAtMjE2LDcgKzIxOSw3IEBACiAgKiBccGFyYW0gVXMgdHlwZXMgaW50byB3aGljaCB0aGUgY29udmVyc2lvbiBpcyBjb25zaWRlcmVkCiAgKi8KIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIC4uLlVzPgotc3RydWN0IGZpbmRfZmlyc3RfY29udmVydGlibGVfdG8gOiBwdWJsaWMgX2ZpbmRfZmlyc3RfY29udmVydGlibGVfdG9faGVscGVyPDEsIFQsIFVzLi4uPiB7IH07CitzdHJ1Y3QgSElERSBmaW5kX2ZpcnN0X2NvbnZlcnRpYmxlX3RvIDogcHVibGljIF9maW5kX2ZpcnN0X2NvbnZlcnRpYmxlX3RvX2hlbHBlcjwxLCBULCBVcy4uLj4geyB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyODc1NTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaApAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQVZDX1VUSUxTX0hfCisKKyNkZWZpbmUgQVZDX1VUSUxTX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBBQml0UmVhZGVyOworCitlbnVtIHsKKyAgICBrQVZDUHJvZmlsZUJhc2VsaW5lICAgICAgPSAweDQyLAorICAgIGtBVkNQcm9maWxlTWFpbiAgICAgICAgICA9IDB4NGQsCisgICAga0FWQ1Byb2ZpbGVFeHRlbmRlZCAgICAgID0gMHg1OCwKKyAgICBrQVZDUHJvZmlsZUhpZ2ggICAgICAgICAgPSAweDY0LAorICAgIGtBVkNQcm9maWxlSGlnaDEwICAgICAgICA9IDB4NmUsCisgICAga0FWQ1Byb2ZpbGVIaWdoNDIyICAgICAgID0gMHg3YSwKKyAgICBrQVZDUHJvZmlsZUhpZ2g0NDQgICAgICAgPSAweGY0LAorICAgIGtBVkNQcm9maWxlQ0FWTEM0NDRJbnRyYSA9IDB4MmMKK307CisKK3N0cnVjdCBOQUxQb3NpdGlvbiB7CisgICAgdWludDMyX3QgbmFsT2Zmc2V0OworICAgIHVpbnQzMl90IG5hbFNpemU7Cit9OworCisvLyBPcHRpb25hbGx5IHJldHVybnMgc2FtcGxlIGFzcGVjdCByYXRpbyBhcyB3ZWxsLgordm9pZCBGaW5kQVZDRGltZW5zaW9ucygKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJnNlcVBhcmFtU2V0LAorICAgICAgICBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0LAorICAgICAgICBpbnQzMl90ICpzYXJXaWR0aCA9IE5VTEwsIGludDMyX3QgKnNhckhlaWdodCA9IE5VTEwpOworCisvLyBHZXRzIGFuZCByZXR1cm5zIGFuIHVuc2lnbmVkIGV4cC1nb2xvbWIgKHVlKSB2YWx1ZSBmcm9tIGEgYml0IHJlYWRlciB8YnJ8LiBBYm9ydHMgaWYgdGhlIHZhbHVlCisvLyBpcyBtb3JlIHRoYW4gNjQgYml0cyBsb25nICg+PTB4RkZGRiAoISkpIG9yIHRoZSBiaXQgcmVhZGVyIG92ZXJmbG93cy4KK3Vuc2lnbmVkIHBhcnNlVUUoQUJpdFJlYWRlciAqYnIpOworCisvLyBHZXRzIGFuZCByZXR1cm5zIGEgc2lnbmVkIGV4cC1nb2xvbWIgKHNlKSB2YWx1ZSBmcm9tIGEgYml0IHJlYWRlciB8YnJ8LiBBYm9ydHMgaWYgdGhlIHZhbHVlIGlzCisvLyBtb3JlIHRoYW4gNjQgYml0cyBsb25nICg+MHg3RkZGIHx8IDwtMHg3RkZGICghKSkgb3IgdGhlIGJpdCByZWFkZXIgb3ZlcmZsb3dzLgorc2lnbmVkIHBhcnNlU0UoQUJpdFJlYWRlciAqYnIpOworCisvLyBHZXRzIGFuIHVuc2lnbmVkIGV4cC1nb2xvbWIgKHVlKSB2YWx1ZSBmcm9tIGEgYml0IHJlYWRlciB8YnJ8LCBhbmQgcmV0dXJucyBpdCBpZiBpdCB3YXMKKy8vIHN1Y2Nlc3NmdWwuIFJldHVybnMgfGZhbGxiYWNrfCBpZiBpdCB3YXMgdW5zdWNjZXNzZnVsLiBOb3RlOiBpZiB0aGUgdmFsdWUgd2FzIGxvbmdlciB0aGF0IDY0CisvLyBiaXRzLCBpdCByZWFkcyBwYXN0IHRoZSB2YWx1ZSBhbmQgc3RpbGwgcmV0dXJucyB8ZmFsbGJhY2t8LgordW5zaWduZWQgcGFyc2VVRVdpdGhGYWxsYmFjayhBQml0UmVhZGVyICpiciwgdW5zaWduZWQgZmFsbGJhY2spOworCisvLyBHZXRzIGEgc2lnbmVkIGV4cC1nb2xvbWIgKHNlKSB2YWx1ZSBmcm9tIGEgYml0IHJlYWRlciB8YnJ8LCBhbmQgcmV0dXJucyBpdCBpZiBpdCB3YXMgc3VjY2Vzc2Z1bC4KKy8vIFJldHVybnMgfGZhbGxiYWNrfCBpZiBpdCB3YXMgdW5zdWNjZXNzZnVsLiBOb3RlOiBpZiB0aGUgdmFsdWUgd2FzIGxvbmdlciB0aGF0IDY0IGJpdHMsIGl0IHJlYWRzCisvLyBwYXN0IHRoZSB2YWx1ZSBhbmQgc3RpbGwgcmV0dXJucyB8ZmFsbGJhY2t8Lgorc2lnbmVkIHBhcnNlU0VXaXRoRmFsbGJhY2soQUJpdFJlYWRlciAqYnIsIHNpZ25lZCBmYWxsYmFjayk7CisKKy8vIFNraXBzIGFuIHVuc2lnbmVkIGV4cC1nb2xvbWIgKHVlKSB2YWx1ZSBmcm9tIGJpdCByZWFkZXIgfGJyfC4KK2lubGluZSB2b2lkIHNraXBVRShBQml0UmVhZGVyICpicikgeworICAgICh2b2lkKXBhcnNlVUVXaXRoRmFsbGJhY2soYnIsIDBVKTsKK30KKworLy8gU2tpcHMgYSBzaWduZWQgZXhwLWdvbG9tYiAoc2UpIHZhbHVlIGZyb20gYml0IHJlYWRlciB8YnJ8LgoraW5saW5lIHZvaWQgc2tpcFNFKEFCaXRSZWFkZXIgKmJyKSB7CisgICAgKHZvaWQpcGFyc2VTRVdpdGhGYWxsYmFjayhiciwgMCk7Cit9CisKK3N0YXR1c190IGdldE5leHROQUxVbml0KAorICAgICAgICBjb25zdCB1aW50OF90ICoqX2RhdGEsIHNpemVfdCAqX3NpemUsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipuYWxTdGFydCwgc2l6ZV90ICpuYWxTaXplLAorICAgICAgICBib29sIHN0YXJ0Q29kZUZvbGxvd3MgPSBmYWxzZSk7CisKK3NwPEFCdWZmZXI+IE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQsIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQsCisgICAgICAgIGludDMyX3QgKnNhcldpZHRoID0gbnVsbHB0ciwgaW50MzJfdCAqc2FySGVpZ2h0ID0gbnVsbHB0cik7CisKK2Jvb2wgSXNJRFIoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworYm9vbCBJc0FWQ1JlZmVyZW5jZUZyYW1lKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KTsKK3VpbnQzMl90IEZpbmRBVkNMYXllcklkKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKworY29uc3QgY2hhciAqQVZDUHJvZmlsZVRvU3RyaW5nKHVpbnQ4X3QgcHJvZmlsZSk7CisKKy8vIEdpdmVuIGFuIE1QRUc0IHZpZGVvIFZPTC1oZWFkZXIgY2h1bmsgKHN0YXJ0aW5nIHdpdGggMHgwMCAweDAwIDB4MDEgMHgyPykKKy8vIHBhcnNlIGl0IGFuZCBmaWxsIGluIGRpbWVuc2lvbnMsIHJldHVybnMgdHJ1ZSBpZmYgc3VjY2Vzc2Z1bC4KK2Jvb2wgRXh0cmFjdERpbWVuc2lvbnNGcm9tVk9MSGVhZGVyKAorICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50MzJfdCAqd2lkdGgsIGludDMyX3QgKmhlaWdodCk7CisKK2Jvb2wgR2V0TVBFR0F1ZGlvRnJhbWVTaXplKAorICAgICAgICB1aW50MzJfdCBoZWFkZXIsIHNpemVfdCAqZnJhbWVfc2l6ZSwKKyAgICAgICAgaW50ICpvdXRfc2FtcGxpbmdfcmF0ZSA9IE5VTEwsIGludCAqb3V0X2NoYW5uZWxzID0gTlVMTCwKKyAgICAgICAgaW50ICpvdXRfYml0cmF0ZSA9IE5VTEwsIGludCAqb3V0X251bV9zYW1wbGVzID0gTlVMTCk7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQVZDX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL1V0aWxzX3Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9VdGlsc190ZXN0LmNwcAppbmRleCAwNDM5ZDVjLi5mYzJlMDQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL1V0aWxzX3Rlc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvVXRpbHNfdGVzdC5jcHAKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZ1V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPiAvLyBmb3IgRk9VUkNDCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4gLy8gZm9yIEZPVVJDQwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQW5kcm9pZC5icAppbmRleCA1ZDkwYjBhLi4yZTQ5ZmM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9BbmRyb2lkLmJwCkBAIC0xMiw3ICsxMiw2IEBACiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliYW5kcm9pZF9ydW50aW1lIiwKICAgICAgICAgImxpYm1lZGlhIiwKICAgICBdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9NZWRpYUhUVFAuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9NZWRpYUhUVFAuY3BwCmluZGV4IDViMTg4MTQuLjdjOTI0N2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAKQEAgLTI1LDExICsyNSwxMSBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUENvbm5lY3Rpb24uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1NZWRpYUhUVFA6Ok1lZGlhSFRUUChjb25zdCBzcDxJTWVkaWFIVFRQQ29ubmVjdGlvbj4gJmNvbm4pCitNZWRpYUhUVFA6Ok1lZGlhSFRUUChjb25zdCBzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiAmY29ubikKICAgICA6IG1Jbml0Q2hlY2soKGNvbm4gIT0gTlVMTCkgPyBPSyA6IE5PX0lOSVQpLAogICAgICAgbUhUVFBDb25uZWN0aW9uKGNvbm4pLAogICAgICAgbUNhY2hlZFNpemVWYWxpZChmYWxzZSksCkBAIC0xNzYsMTIgKzE3Niw2IEBACiAgICAgcmV0dXJuIG1EZWNyeXB0SGFuZGxlOwogfQogCi12b2lkIE1lZGlhSFRUUDo6Z2V0RHJtSW5mbygKLSAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gJmhhbmRsZSwgRHJtTWFuYWdlckNsaWVudCAqKmNsaWVudCkgewotICAgIGhhbmRsZSA9IG1EZWNyeXB0SGFuZGxlOwotICAgICpjbGllbnQgPSBtRHJtTWFuYWdlckNsaWVudDsKLX0KLQogU3RyaW5nOCBNZWRpYUhUVFA6OmdldFVyaSgpIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewogICAgICAgICByZXR1cm4gU3RyaW5nODo6ZW1wdHkoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLmJwCmluZGV4IGU0MTUzMzQuLjhhNzc0MDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5icApAQCAtMSw0ICsxLDQgQEAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9odHRwbGl2ZSIsCiAKICAgICBzcmNzOiBbCkBAIC0zNiw4ICszNiwyMCBAQAogICAgICAgICAibGliY3J5cHRvIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhc0AxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXMubmF0aXZlQDEuMCIsCiAgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9pZDMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfbWV0YWRhdGF1dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnQiLAorICAgIF0sCisKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0hUVFBEb3dubG9hZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0hUVFBEb3dubG9hZGVyLmNwcAppbmRleCA3OTM2OTVhLi43MjYwNGUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9IVFRQRG93bmxvYWRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvSFRUUERvd25sb2FkZXIuY3BwCkBAIC0yMSwxMiArMjEsMTIgQEAKICNpbmNsdWRlICJIVFRQRG93bmxvYWRlci5oIgogI2luY2x1ZGUgIk0zVVBhcnNlci5oIgogCi0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgogI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CkBAIC0zNiw3ICszNiw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIEhUVFBEb3dubG9hZGVyOjpIVFRQRG93bmxvYWRlcigKLSAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAmaGVhZGVycykgOgogICAgIG1IVFRQRGF0YVNvdXJjZShuZXcgTWVkaWFIVFRQKGh0dHBTZXJ2aWNlLT5tYWtlSFRUUENvbm5lY3Rpb24oKSkpLAogICAgIG1FeHRyYUhlYWRlcnMoaGVhZGVycyksCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9IVFRQRG93bmxvYWRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvSFRUUERvd25sb2FkZXIuaAppbmRleCAxZGI0YTQ4Li4wZDRiZDMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9IVFRQRG93bmxvYWRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0hUVFBEb3dubG9hZGVyLmgKQEAgLTI4LDEyICsyOCwxMiBAQAogc3RydWN0IEFCdWZmZXI7CiBjbGFzcyBEYXRhU291cmNlOwogc3RydWN0IEhUVFBCYXNlOwotc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOworc3RydWN0IE1lZGlhSFRUUFNlcnZpY2U7CiBzdHJ1Y3QgTTNVUGFyc2VyOwogCiBzdHJ1Y3QgSFRUUERvd25sb2FkZXIgOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgSFRUUERvd25sb2FkZXIoCi0gICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gJmhlYWRlcnMpOwogCiAgICAgdm9pZCByZWNvbm5lY3QoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVEYXRhU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlRGF0YVNvdXJjZS5oCmluZGV4IGI3YmU2MzcuLjkxZTlmOWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVEYXRhU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZURhdGFTb3VyY2UuaApAQCAtMTgsOCArMTgsOCBAQAogCiAjZGVmaW5lIExJVkVfREFUQV9TT1VSQ0VfSF8KIAorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcAppbmRleCAxNDNmZDU5Li43ZWZmOGViIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSAibXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgiCiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgpAQCAtNDksNiArNDksMTAgQEAKIGNvbnN0IGludDY0X3QgTGl2ZVNlc3Npb246OmtVcFN3aXRjaE1hcmdpblVzID0gNTAwMDAwMGxsOwogY29uc3QgaW50NjRfdCBMaXZlU2Vzc2lvbjo6a1Jlc3VtZVRocmVzaG9sZFVzID0gMTAwMDAwbGw7CiAKKy8vVE9ETzogcmVkZWZpbmUgdGhpcyBtYXJrIHRvIGEgZmFpciB2YWx1ZQorLy8gZGVmYXVsdCBidWZmZXIgdW5kZXJmbG93IG1hcmsKK3N0YXRpYyBjb25zdCBpbnQga1VuZGVyZmxvd01hcmtNcyA9IDEwMDA7ICAvLyAxIHNlY29uZAorCiBzdHJ1Y3QgTGl2ZVNlc3Npb246OkJhbmR3aWR0aEVzdGltYXRvciA6IHB1YmxpYyBSZWZCYXNlIHsKICAgICBCYW5kd2lkdGhFc3RpbWF0b3IoKTsKIApAQCAtMjcwLDcgKzI3NCw3IEBACiAKIExpdmVTZXNzaW9uOjpMaXZlU2Vzc2lvbigKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIHVpbnQzMl90IGZsYWdzLAotICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKQorICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UpCiAgICAgOiBtTm90aWZ5KG5vdGlmeSksCiAgICAgICBtRmxhZ3MoZmxhZ3MpLAogICAgICAgbUhUVFBTZXJ2aWNlKGh0dHBTZXJ2aWNlKSwKQEAgLTg0MCw3ICs4NDQsNyBAQAogICAgICAgICAgICAgICAgICAgICAvLyAoSWYgd2UgZG9uJ3QgaGF2ZSB0aGF0IGN1c2hpb24gd2UnZCByYXRoZXIgY2FuY2VsIGFuZCB0cnkgYWdhaW4uKQogICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPQogICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoVXAgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtQnVmZmVyaW5nU2V0dGluZ3MubVJlYnVmZmVyaW5nV2F0ZXJtYXJrTG93TXMgKiAxMDAwbGwgKyAxMDAwMDAwbGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtVbmRlcmZsb3dNYXJrTXMgKiAxMDAwbGwgKyAxMDAwMDAwbGwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwOwogICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRSZXN1bWVVbnRpbCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gc3RvcFBhcmFtcyA9IG1zZzsKQEAgLTEwMTAsNyArMTAxNCw4IEBACiAgICAgICAgIG1GZXRjaGVyTG9vcGVyID0gbmV3IEFMb29wZXIoKTsKIAogICAgICAgICBtRmV0Y2hlckxvb3Blci0+c2V0TmFtZSgiRmV0Y2hlciIpOwotICAgICAgICBtRmV0Y2hlckxvb3Blci0+c3RhcnQoZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgbUZldGNoZXJMb29wZXItPnN0YXJ0KGZhbHNlLCAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgIC8qIGNhbkNhbGxKYXZhICovKTsKICAgICB9CiAKICAgICAvLyBjcmVhdGUgZmV0Y2hlciB0byBmZXRjaCB0aGUgbWFzdGVyIHBsYXlsaXN0CkBAIC0yMjAyLDE0ICsyMjA3LDE0IEBACiAgICAgICAgICsrYWN0aXZlQ291bnQ7CiAgICAgICAgIGludDY0X3QgcmVhZHlNYXJrVXMgPQogICAgICAgICAgICAgKG1JblByZXBhcmF0aW9uUGhhc2UgPwotICAgICAgICAgICAgICAgIG1CdWZmZXJpbmdTZXR0aW5ncy5tSW5pdGlhbFdhdGVybWFya01zIDoKLSAgICAgICAgICAgICAgICBtQnVmZmVyaW5nU2V0dGluZ3MubVJlYnVmZmVyaW5nV2F0ZXJtYXJrSGlnaE1zKSAqIDEwMDBsbDsKKyAgICAgICAgICAgICAgICBtQnVmZmVyaW5nU2V0dGluZ3MubUluaXRpYWxNYXJrTXMgOgorICAgICAgICAgICAgICAgIG1CdWZmZXJpbmdTZXR0aW5ncy5tUmVzdW1lUGxheWJhY2tNYXJrTXMpICogMTAwMGxsOwogICAgICAgICBpZiAoYnVmZmVyZWREdXJhdGlvblVzID4gcmVhZHlNYXJrVXMKICAgICAgICAgICAgICAgICB8fCBtUGFja2V0U291cmNlc1tpXS0+aXNGaW5pc2hlZCgwKSkgewogICAgICAgICAgICAgKytyZWFkeUNvdW50OwogICAgICAgICB9CiAgICAgICAgIGlmICghbVBhY2tldFNvdXJjZXNbaV0tPmlzRmluaXNoZWQoMCkpIHsKLSAgICAgICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPCBtQnVmZmVyaW5nU2V0dGluZ3MubVJlYnVmZmVyaW5nV2F0ZXJtYXJrTG93TXMgKiAxMDAwbGwpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPCBrVW5kZXJmbG93TWFya01zICogMTAwMGxsKSB7CiAgICAgICAgICAgICAgICAgKyt1bmRlcmZsb3dDb3VudDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPiBtVXBTd2l0Y2hNYXJrKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uaAppbmRleCBhYmY4Y2YwLi43YTZkNDg3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmgKQEAgLTMzLDcgKzMzLDcgQEAKIHN0cnVjdCBBbm90aGVyUGFja2V0U291cmNlOwogY2xhc3MgRGF0YVNvdXJjZTsKIHN0cnVjdCBIVFRQQmFzZTsKLXN0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKK3N0cnVjdCBNZWRpYUhUVFBTZXJ2aWNlOwogc3RydWN0IExpdmVEYXRhU291cmNlOwogc3RydWN0IE0zVVBhcnNlcjsKIHN0cnVjdCBQbGF5bGlzdEZldGNoZXI7CkBAIC03MSw3ICs3MSw3IEBACiAgICAgTGl2ZVNlc3Npb24oCiAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAotICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSk7CisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UpOwogCiAgICAgdm9pZCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyAmYnVmZmVyaW5nKTsKIApAQCAtMTg3LDcgKzE4Nyw3IEBACiAKICAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKICAgICB1aW50MzJfdCBtRmxhZ3M7Ci0gICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IG1IVFRQU2VydmljZTsKKyAgICBzcDxNZWRpYUhUVFBTZXJ2aWNlPiBtSFRUUFNlcnZpY2U7CiAKICAgICBib29sIG1CdWZmZXJpbmc7CiAgICAgYm9vbCBtSW5QcmVwYXJhdGlvblBoYXNlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKaW5kZXggMjE0ZmVhYi4uOWJkZjg5NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KQEAgLTQ4Myw2ICs0ODQsOSBAQAogICAgICAgICAvLyBCYXNlIFVSTCBtdXN0IGJlIGFic29sdXRlCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CisgICAgaWYgKCFzdHJuY2FzZWNtcCgiZGF0YToiLCB1cmwsIDUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAgICAgY29uc3Qgc2l6ZV90IHNjaGVtZUVuZCA9IChzdHJzdHIoYmFzZVVSTCwgIi8vIikgLSBiYXNlVVJMKSArIDI7CiAgICAgQ0hFQ0soc2NoZW1lRW5kID09IDcgfHwgc2NoZW1lRW5kID09IDgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcAppbmRleCAwMGNmMTQyLi5mMjkyYzQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlICJIVFRQRG93bmxvYWRlci5oIgogI2luY2x1ZGUgIkxpdmVTZXNzaW9uLmgiCiAjaW5jbHVkZSAiTTNVUGFyc2VyLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKICNpbmNsdWRlICJpbmNsdWRlL0lEMy5oIgogI2luY2x1ZGUgIm1wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oIgogI2luY2x1ZGUgIm1wZWcydHMvSGxzU2FtcGxlRGVjcnlwdG9yLmgiCkBAIC0zMSw4ICszMCwxMyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhS2V5cy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVVSSVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAKICNpbmNsdWRlIDxjdHlwZS5oPgpAQCAtMzQ0LDYgKzM0OCwxNiBAQAogICAgIHNwPEFCdWZmZXI+IGtleTsKICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICBrZXkgPSBtQUVTS2V5Rm9yVVJJLnZhbHVlQXQoaW5kZXgpOworICAgIH0gZWxzZSBpZiAoa2V5VVJJLnN0YXJ0c1dpdGgoImRhdGE6IikpIHsKKyAgICAgICAgc3A8RGF0YVNvdXJjZT4ga2V5U3JjID0gRGF0YVVSSVNvdXJjZTo6Q3JlYXRlKGtleVVSSS5jX3N0cigpKTsKKyAgICAgICAgb2ZmNjRfdCBrZXlMZW47CisgICAgICAgIGlmIChrZXlTcmMgPT0gTlVMTCB8fCBrZXlTcmMtPmdldFNpemUoJmtleUxlbikgIT0gT0sgfHwga2V5TGVuIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIk1hbGZvcm1lZCBjaXBoZXIga2V5IGRhdGEgdXJpLiIpOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICBrZXkgPSBuZXcgQUJ1ZmZlcihrZXlMZW4pOworICAgICAgICBrZXlTcmMtPnJlYWRBdCgwLCBrZXktPmRhdGEoKSwga2V5TGVuKTsKKyAgICAgICAga2V5LT5zZXRSYW5nZSgwLCBrZXlMZW4pOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHNzaXplX3QgZXJyID0gbUhUVFBEb3dubG9hZGVyLT5mZXRjaEZpbGUoa2V5VVJJLmNfc3RyKCksICZrZXkpOwogCkBAIC0xNjkyLDEyICsxNzA2LDEyIEBACiAgICAgICAgIHNwPEFNZXNzYWdlPiBleHRyYSA9IG5ldyBBTWVzc2FnZTsKICAgICAgICAgLy8gU2luY2Ugd2UgYXJlIHVzaW5nIGFic29sdXRlIHRpbWVzdGFtcHMsIHNpZ25hbCBhbiBvZmZzZXQgb2YgMCB0byBwcmV2ZW50CiAgICAgICAgIC8vIEFUU1BhcnNlciBmcm9tIHNrZXdpbmcgdGhlIHRpbWVzdGFtcHMgb2YgYWNjZXNzIHVuaXRzLgotICAgICAgICBleHRyYS0+c2V0SW50NjQoSVN0cmVhbUxpc3RlbmVyOjprS2V5TWVkaWFUaW1lVXMsIDApOworICAgICAgICBleHRyYS0+c2V0SW50NjQoa0FUU1BhcnNlcktleU1lZGlhVGltZVVzLCAwKTsKIAogICAgICAgICAvLyBXaGVuIGFkYXB0aW5nLCBzaWduYWwgYSByZWNlbnQgbWVkaWEgdGltZSB0byB0aGUgcGFyc2VyLAogICAgICAgICAvLyBzbyB0aGF0IFBUUyB3cmFwIGFyb3VuZCBpcyBoYW5kbGVkIGZvciB0aGUgbmV3IHZhcmlhbnQuCiAgICAgICAgIGlmIChtU3RhcnRUaW1lVXMgPj0gMCAmJiAhbVN0YXJ0VGltZVVzUmVsYXRpdmUpIHsKLSAgICAgICAgICAgIGV4dHJhLT5zZXRJbnQ2NChJU3RyZWFtTGlzdGVuZXI6OmtLZXlSZWNlbnRNZWRpYVRpbWVVcywgbVN0YXJ0VGltZVVzKTsKKyAgICAgICAgICAgIGV4dHJhLT5zZXRJbnQ2NChrQVRTUGFyc2VyS2V5UmVjZW50TWVkaWFUaW1lVXMsIG1TdGFydFRpbWVVcyk7CiAgICAgICAgIH0KIAogICAgICAgICBtVFNQYXJzZXItPnNpZ25hbERpc2NvbnRpbnVpdHkoCkBAIC0xODI4LDcgKzE4NDIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZVVzIC0gbVN0YXJ0VGltZVVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JRFJGb3VuZCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpc0F2YykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElzSURSKGFjY2Vzc1VuaXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSXNJRFIoYWNjZXNzVW5pdC0+ZGF0YSgpLCBhY2Nlc3NVbml0LT5zaXplKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTTE9HVihzdHJlYW0sICJmb3VuZCBJRFIsIGNsZWFyIG1WaWRlb0J1ZmZlciIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JRFJGb3VuZCA9IHRydWU7CkBAIC0yMDYzLDcgKzIwNzcsOCBAQAogICAgICAgICBDSEVDS19ORShjaGFubmVsX2NvbmZpZ3VyYXRpb24sIDB1KTsKICAgICAgICAgYml0cy5za2lwQml0cygyKTsgIC8vIG9yaWdpbmFsX2NvcHksIGhvbWUKIAotICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGEoKTsKKyAgICAgICAgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKCptZXRhLAogICAgICAgICAgICAgICAgIHByb2ZpbGUsIHNhbXBsaW5nX2ZyZXFfaW5kZXgsIGNoYW5uZWxfY29uZmlndXJhdGlvbik7CiAKICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUlzQURUUywgdHJ1ZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9BbmRyb2lkLmJwCmluZGV4IDMwMDA4ZDkuLjM3ZjlkNTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9BbmRyb2lkLmJwCkBAIC0xNiw4ICsxNiw2IEBACiAgICAgICAgICAgICBjZmk6IHRydWUsCiAgICAgICAgIH0sCiAgICAgfSwKLQotICAgIHNoYXJlZF9saWJzOiBbImxpYm1lZGlhIl0sCiB9CiAKIC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcAppbmRleCBlODk3YjY3Li5mNjE1NTAwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcApAQCAtMjAsOSArMjAsOSBAQAogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9JRDMuaCIKIAorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CiAKQEAgLTMwLDcgKzMwLDcgQEAKIAogc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4TWV0YWRhdGFTaXplID0gMyAqIDEwMjQgKiAxMDI0OwogCi1zdHJ1Y3QgTWVtb3J5U291cmNlIDogcHVibGljIERhdGFTb3VyY2Ugeworc3RydWN0IE1lbW9yeVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlQmFzZSB7CiAgICAgTWVtb3J5U291cmNlKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKQogICAgICAgICA6IG1EYXRhKGRhdGEpLAogICAgICAgICAgIG1TaXplKHNpemUpIHsKQEAgLTU2LDcgKzU2LDcgQEAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZW1vcnlTb3VyY2UpOwogfTsKIAotSUQzOjpJRDMoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgYm9vbCBpZ25vcmVWMSwgb2ZmNjRfdCBvZmZzZXQpCitJRDM6OklEMyhEYXRhU291cmNlQmFzZSAqc291cmNlLCBib29sIGlnbm9yZVYxLCBvZmY2NF90IG9mZnNldCkKICAgICA6IG1Jc1ZhbGlkKGZhbHNlKSwKICAgICAgIG1EYXRhKE5VTEwpLAogICAgICAgbVNpemUoMCksCkBAIC03Nyw3ICs3Nyw3IEBACiAgICAgICBtRmlyc3RGcmFtZU9mZnNldCgwKSwKICAgICAgIG1WZXJzaW9uKElEM19VTktOT1dOKSwKICAgICAgIG1SYXdTaXplKDApIHsKLSAgICBzcDxNZW1vcnlTb3VyY2U+IHNvdXJjZSA9IG5ldyAoc3RkOjpub3Rocm93KSBNZW1vcnlTb3VyY2UoZGF0YSwgc2l6ZSk7CisgICAgTWVtb3J5U291cmNlICpzb3VyY2UgPSBuZXcgKHN0ZDo6bm90aHJvdykgTWVtb3J5U291cmNlKGRhdGEsIHNpemUpOwogCiAgICAgaWYgKHNvdXJjZSA9PSBOVUxMKQogICAgICAgICByZXR1cm47CkBAIC04Nyw2ICs4Nyw3IEBACiAgICAgaWYgKCFtSXNWYWxpZCAmJiAhaWdub3JlVjEpIHsKICAgICAgICAgbUlzVmFsaWQgPSBwYXJzZVYxKHNvdXJjZSk7CiAgICAgfQorICAgIGRlbGV0ZSBzb3VyY2U7CiB9CiAKIElEMzo6fklEMygpIHsKQEAgLTExOCw3ICsxMTksNyBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIElEMzo6cGFyc2VWMihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBvZmY2NF90IG9mZnNldCkgeworYm9vbCBJRDM6OnBhcnNlVjIoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgb2ZmNjRfdCBvZmZzZXQpIHsKIHN0cnVjdCBpZDNfaGVhZGVyIHsKICAgICBjaGFyIGlkWzNdOwogICAgIHVpbnQ4X3QgdmVyc2lvbl9tYWpvcjsKQEAgLTk3Myw3ICs5NzQsNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1ib29sIElEMzo6cGFyc2VWMShjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKSB7Citib29sIElEMzo6cGFyc2VWMShEYXRhU291cmNlQmFzZSAqc291cmNlKSB7CiAgICAgY29uc3Qgc2l6ZV90IFYxX1RBR19TSVpFID0gMTI4OwogCiAgICAgb2ZmNjRfdCBzaXplOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3RpZDMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3RpZDMuY3BwCmluZGV4IDQ0MmEzZmYuLjg2ZTZhZGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0aWQzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvdGVzdGlkMy5jcHAKQEAgLTcyLDcgKzcyLDcgQEAKICAgICBzcDxGaWxlU291cmNlPiBmaWxlID0gbmV3IEZpbGVTb3VyY2UocGF0aCk7CiAgICAgQ0hFQ0tfRVEoZmlsZS0+aW5pdENoZWNrKCksIChzdGF0dXNfdClPSyk7CiAKLSAgICBJRDMgdGFnKGZpbGUpOworICAgIElEMyB0YWcoZmlsZS5nZXQoKSk7CiAgICAgaWYgKCF0YWcuaXNWYWxpZCgpKSB7CiAgICAgICAgIHByaW50ZigiRkFJTCAlc1xuIiwgcGF0aCk7CiAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQUFDRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BQUNFbmNvZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MmU5MDUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BQUNFbmNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBQUNfRU5DT0RFUl9ICi0jZGVmaW5lIEFBQ19FTkNPREVSX0gKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLQotc3RydWN0IFZPX0FVRElPX0NPREVDQVBJOwotc3RydWN0IFZPX01FTV9PUEVSQVRPUjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBNZWRpYUJ1ZmZlckdyb3VwOwotCi1jbGFzcyBBQUNFbmNvZGVyOiBwdWJsaWMgQm5NZWRpYVNvdXJjZSB7Ci0gICAgcHVibGljOgotICAgICAgICBBQUNFbmNvZGVyKGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSwgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhKTsKLQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOwotCi0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIHZpcnR1YWwgfkFBQ0VuY29kZXIoKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIHNwPElNZWRpYVNvdXJjZT4gICBtU291cmNlOwotICAgICAgICBzcDxNZXRhRGF0YT4gICAgICBtTWV0YTsKLSAgICAgICAgYm9vbCAgICAgICAgICAgICAgbVN0YXJ0ZWQ7Ci0gICAgICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1CdWZmZXJHcm91cDsKLSAgICAgICAgTWVkaWFCdWZmZXIgICAgICAqbUlucHV0QnVmZmVyOwotICAgICAgICBzdGF0dXNfdCAgICAgICAgICBtSW5pdENoZWNrOwotICAgICAgICBpbnQzMl90ICAgICAgICAgICBtU2FtcGxlUmF0ZTsKLSAgICAgICAgaW50MzJfdCAgICAgICAgICAgbUNoYW5uZWxzOwotICAgICAgICBpbnQzMl90ICAgICAgICAgICBtQml0UmF0ZTsKLSAgICAgICAgaW50MzJfdCAgICAgICAgICAgbUZyYW1lQ291bnQ7Ci0KLSAgICAgICAgaW50NjRfdCAgICAgICAgICAgbUFuY2hvclRpbWVVczsKLSAgICAgICAgaW50NjRfdCAgICAgICAgICAgbU51bUlucHV0U2FtcGxlczsKLQotICAgICAgICBlbnVtIHsKLSAgICAgICAgICAgIGtOdW1TYW1wbGVzUGVyRnJhbWUgPSAxMDI0LAotICAgICAgICB9OwotCi0gICAgICAgIGludDE2X3QgICAgICAgICAgICptSW5wdXRGcmFtZTsKLQotICAgICAgICB1aW50OF90ICAgICAgICAgICBtQXVkaW9TcGVjaWZpY0NvbmZpZ0RhdGFbMl07IC8vIGF1aWRvIHNwZWNpZmljIGRhdGEKLSAgICAgICAgdm9pZCAgICAgICAgICAgICAqbUVuY29kZXJIYW5kbGU7Ci0gICAgICAgIFZPX0FVRElPX0NPREVDQVBJICptQXBpSGFuZGxlOwotICAgICAgICBWT19NRU1fT1BFUkFUT1IgICptTWVtT3BlcmF0b3I7Ci0KLSAgICAgICAgc3RhdHVzX3Qgc2V0QXVkaW9TcGVjaWZpY0NvbmZpZ0RhdGEoKTsKLSAgICAgICAgc3RhdHVzX3QgaW5pdENoZWNrKCk7Ci0KLSAgICAgICAgQUFDRW5jb2RlciYgb3BlcmF0b3I9KGNvbnN0IEFBQ0VuY29kZXIgJnJocyk7Ci0gICAgICAgIEFBQ0VuY29kZXIoY29uc3QgQUFDRW5jb2RlciYgY29weSk7Ci0KLX07Ci0KLX0KLQotI2VuZGlmICAvLyNpZm5kZWYgQUFDX0VOQ09ERVJfSAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FBQ0V4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BQUNFeHRyYWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0YzQxYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FBQ0V4dHJhY3Rvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQUFDX0VYVFJBQ1RPUl9IXwotCi0jZGVmaW5lIEFBQ19FWFRSQUNUT1JfSF8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgQU1lc3NhZ2U7Ci1jbGFzcyBTdHJpbmc4OwotCi1jbGFzcyBBQUNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewotcHVibGljOgotICAgIEFBQ0V4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBjb25zdCBzcDxBTWVzc2FnZT4gJm1ldGEpOwotCi0gICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIHNwPElNZWRpYVNvdXJjZT4gZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRUcmFja01ldGFEYXRhKHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwotCi0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0TWV0YURhdGEoKTsKLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIkFBQ0V4dHJhY3RvciI7IH0KLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkFBQ0V4dHJhY3RvcigpOwotCi1wcml2YXRlOgotICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwotICAgIHNwPE1ldGFEYXRhPiBtTWV0YTsKLSAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwotCi0gICAgVmVjdG9yPHVpbnQ2NF90PiBtT2Zmc2V0VmVjdG9yOwotICAgIGludDY0X3QgbUZyYW1lRHVyYXRpb25VczsKLQotICAgIEFBQ0V4dHJhY3Rvcihjb25zdCBBQUNFeHRyYWN0b3IgJik7Ci0gICAgQUFDRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgQUFDRXh0cmFjdG9yICYpOwotfTsKLQotYm9vbCBTbmlmZkFBQygKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICBzcDxBTWVzc2FnZT4gKik7Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQUFDX0VYVFJBQ1RPUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BQ29kZWNCdWZmZXJDaGFubmVsLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FDb2RlY0J1ZmZlckNoYW5uZWwuaAppbmRleCBmMjUzYTUyLi43YzAxZTQ1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FDb2RlY0J1ZmZlckNoYW5uZWwuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FDb2RlY0J1ZmZlckNoYW5uZWwuaApAQCAtMjksOCArMjksMTAgQEAKICNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdXNpbmcgaGFyZHdhcmU6OmhpZGxfbWVtb3J5OworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK2NsYXNzIEhpZGxNZW1vcnk7Cit9OwordXNpbmcgaGFyZHdhcmU6OkhpZGxNZW1vcnk7CiAKIC8qKgogICogQnVmZmVyQ2hhbm5lbEJhc2UgaW1wbGVtZW50YXRpb24gZm9yIEFDb2RlYy4KQEAgLTExOSw3ICsxMjEsNyBAQAogICAgIHNwPE1lbW9yeURlYWxlcj4gbURlYWxlcjsKICAgICBzcDxJTWVtb3J5PiBtRGVjcnlwdERlc3RpbmF0aW9uOwogICAgIGludDMyX3QgbUhlYXBTZXFOdW07Ci0gICAgaGlkbF9tZW1vcnkgbUhpZGxNZW1vcnk7CisgICAgc3A8SGlkbE1lbW9yeT4gbUhpZGxNZW1vcnk7CiAKICAgICAvLyBUaGVzZSBzaG91bGQgb25seSBiZSBhY2Nlc3NlZCB2aWEgc3RkOjphdG9taWNfKiBmdW5jdGlvbnMuCiAgICAgLy8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQU1SRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FNUkV4dHJhY3Rvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWJjYjEyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQU1SRXh0cmFjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTVJfRVhUUkFDVE9SX0hfCi0KLSNkZWZpbmUgQU1SX0VYVFJBQ1RPUl9IXwotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgQU1lc3NhZ2U7Ci1jbGFzcyBTdHJpbmc4OwotI2RlZmluZSBPRkZTRVRfVEFCTEVfTEVOICAgIDMwMAotCi1jbGFzcyBBTVJFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewotcHVibGljOgotICAgIGV4cGxpY2l0IEFNUkV4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKTsKLQotICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBzcDxJTWVkaWFTb3VyY2U+IGdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0VHJhY2tNZXRhRGF0YShzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKLQotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldE1ldGFEYXRhKCk7Ci0gICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJBTVJFeHRyYWN0b3IiOyB9Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5BTVJFeHRyYWN0b3IoKTsKLQotcHJpdmF0ZToKLSAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKLSAgICBzcDxNZXRhRGF0YT4gbU1ldGE7Ci0gICAgc3RhdHVzX3QgbUluaXRDaGVjazsKLSAgICBib29sIG1Jc1dpZGU7Ci0KLSAgICBvZmY2NF90IG1PZmZzZXRUYWJsZVtPRkZTRVRfVEFCTEVfTEVOXTsgLy81IG1pbgotICAgIHNpemVfdCBtT2Zmc2V0VGFibGVMZW5ndGg7Ci0KLSAgICBBTVJFeHRyYWN0b3IoY29uc3QgQU1SRXh0cmFjdG9yICYpOwotICAgIEFNUkV4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IEFNUkV4dHJhY3RvciAmKTsKLX07Ci0KLWJvb2wgU25pZmZBTVIoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgc3A8QU1lc3NhZ2U+ICopOwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFNUl9FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQVZJRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FWSUV4dHJhY3Rvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmU1MDVjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQVZJRXh0cmFjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQVZJX0VYVFJBQ1RPUl9IXwotCi0jZGVmaW5lIEFWSV9FWFRSQUNUT1JfSF8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEFWSUV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7Ci0gICAgQVZJRXh0cmFjdG9yKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZkYXRhU291cmNlKTsKLQotICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0KLSAgICB2aXJ0dWFsIHNwPE1lZGlhU291cmNlPiBnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotCi0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwotCi0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0TWV0YURhdGEoKTsKLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIkFWSUV4dHJhY3RvciI7IH0KLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkFWSUV4dHJhY3RvcigpOwotCi1wcml2YXRlOgotICAgIHN0cnVjdCBBVklTb3VyY2U7Ci0gICAgc3RydWN0IE1QM1NwbGl0dGVyOwotCi0gICAgc3RydWN0IFNhbXBsZUluZm8gewotICAgICAgICB1aW50MzJfdCBtT2Zmc2V0OwotICAgICAgICBib29sIG1Jc0tleTsKLSAgICB9OwotCi0gICAgc3RydWN0IFRyYWNrIHsKLSAgICAgICAgc3A8TWV0YURhdGE+IG1NZXRhOwotICAgICAgICBWZWN0b3I8U2FtcGxlSW5mbz4gbVNhbXBsZXM7Ci0gICAgICAgIHVpbnQzMl90IG1SYXRlOwotICAgICAgICB1aW50MzJfdCBtU2NhbGU7Ci0KLSAgICAgICAgLy8gSWYgYnl0ZXMgcGVyIHNhbXBsZSA9PSAwLCBlYWNoIGNodW5rIHJlcHJlc2VudHMgYSBzaW5nbGUgc2FtcGxlLAotICAgICAgICAvLyBvdGhlcndpc2UgZWFjaCBjaHVuayBzaG91bGQgbWUgYSBtdWx0aXBsZSBvZiBieXRlcy1wZXItc2FtcGxlIGluCi0gICAgICAgIC8vIHNpemUuCi0gICAgICAgIHVpbnQzMl90IG1CeXRlc1BlclNhbXBsZTsKLQotICAgICAgICBlbnVtIEtpbmQgewotICAgICAgICAgICAgQVVESU8sCi0gICAgICAgICAgICBWSURFTywKLSAgICAgICAgICAgIE9USEVSCi0KLSAgICAgICAgfSBtS2luZDsKLQotICAgICAgICBzaXplX3QgbU51bVN5bmNTYW1wbGVzOwotICAgICAgICBzaXplX3QgbVRodW1ibmFpbFNhbXBsZVNpemU7Ci0gICAgICAgIHNzaXplX3QgbVRodW1ibmFpbFNhbXBsZUluZGV4OwotICAgICAgICBzaXplX3QgbU1heFNhbXBsZVNpemU7Ci0KLSAgICAgICAgLy8gSWYgbUJ5dGVzUGVyU2FtcGxlID4gMDoKLSAgICAgICAgZG91YmxlIG1BdmdDaHVua1NpemU7Ci0gICAgICAgIHNpemVfdCBtRmlyc3RDaHVua1NpemU7Ci0gICAgfTsKLQotICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwotICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7Ci0gICAgVmVjdG9yPFRyYWNrPiBtVHJhY2tzOwotCi0gICAgb2ZmNjRfdCBtTW92aWVPZmZzZXQ7Ci0gICAgYm9vbCBtRm91bmRJbmRleDsKLSAgICBib29sIG1PZmZzZXRzQXJlQWJzb2x1dGU7Ci0KLSAgICBzc2l6ZV90IHBhcnNlQ2h1bmsob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3Qgc2l6ZSwgaW50IGRlcHRoID0gMCk7Ci0gICAgc3RhdHVzX3QgcGFyc2VTdHJlYW1IZWFkZXIob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKLSAgICBzdGF0dXNfdCBwYXJzZVN0cmVhbUZvcm1hdChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwotICAgIHN0YXR1c190IHBhcnNlSW5kZXgob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHBhcnNlSGVhZGVycygpOwotCi0gICAgc3RhdHVzX3QgZ2V0U2FtcGxlSW5mbygKLSAgICAgICAgICAgIHNpemVfdCB0cmFja0luZGV4LCBzaXplX3Qgc2FtcGxlSW5kZXgsCi0gICAgICAgICAgICBvZmY2NF90ICpvZmZzZXQsIHNpemVfdCAqc2l6ZSwgYm9vbCAqaXNLZXksCi0gICAgICAgICAgICBpbnQ2NF90ICpzYW1wbGVUaW1lVXMpOwotCi0gICAgc3RhdHVzX3QgZ2V0U2FtcGxlVGltZSgKLSAgICAgICAgICAgIHNpemVfdCB0cmFja0luZGV4LCBzaXplX3Qgc2FtcGxlSW5kZXgsIGludDY0X3QgKnNhbXBsZVRpbWVVcyk7Ci0KLSAgICBzdGF0dXNfdCBnZXRTYW1wbGVJbmRleEF0VGltZSgKLSAgICAgICAgICAgIHNpemVfdCB0cmFja0luZGV4LAotICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMsIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZSwKLSAgICAgICAgICAgIHNpemVfdCAqc2FtcGxlSW5kZXgpIGNvbnN0OwotCi0gICAgc3RhdHVzX3QgYWRkTVBFRzRDb2RlY1NwZWNpZmljRGF0YShzaXplX3QgdHJhY2tJbmRleCk7Ci0gICAgc3RhdHVzX3QgYWRkSDI2NENvZGVjU3BlY2lmaWNEYXRhKHNpemVfdCB0cmFja0luZGV4KTsKLQotICAgIHN0YXRpYyBib29sIElzQ29ycmVjdENodW5rVHlwZSgKLSAgICAgICAgc3NpemVfdCB0cmFja0luZGV4LCBUcmFjazo6S2luZCBraW5kLCB1aW50MzJfdCBjaHVua1R5cGUpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQVZJRXh0cmFjdG9yKTsKLX07Ci0KLWNsYXNzIFN0cmluZzg7Ci1zdHJ1Y3QgQU1lc3NhZ2U7Ci0KLWJvb2wgU25pZmZBVkkoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgc3A8QU1lc3NhZ2U+ICopOwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFWSV9FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQ2FsbGJhY2tEYXRhU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0NhbGxiYWNrRGF0YVNvdXJjZS5oCmluZGV4IDBkNzc1ZTYuLjlmNDEzY2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQ2FsbGJhY2tEYXRhU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9DYWxsYmFja0RhdGFTb3VyY2UuaApAQCAtMTcsNyArMTcsNyBAQAogI2lmbmRlZiBBTkRST0lEX0NBTExCQUNLREFUQVNPVVJDRV9ICiAjZGVmaW5lIEFORFJPSURfQ0FMTEJBQ0tEQVRBU09VUkNFX0gKIAotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9GTEFDRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0ZMQUNFeHRyYWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFiYzEzOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0ZMQUNFeHRyYWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEZMQUNfRVhUUkFDVE9SX0hfCi0jZGVmaW5lIEZMQUNfRVhUUkFDVE9SX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRkxBQ1BhcnNlcjsKLQotY2xhc3MgRkxBQ0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7Ci0KLXB1YmxpYzoKLSAgICAvLyBFeHRyYWN0b3IgYXNzdW1lcyBvd25lcnNoaXAgb2Ygc291cmNlCi0gICAgZXhwbGljaXQgRkxBQ0V4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKTsKLQotICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBzcDxJTWVkaWFTb3VyY2U+IGdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0VHJhY2tNZXRhRGF0YShzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKLQotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldE1ldGFEYXRhKCk7Ci0gICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJGTEFDRXh0cmFjdG9yIjsgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+RkxBQ0V4dHJhY3RvcigpOwotCi1wcml2YXRlOgotICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwotICAgIHNwPEZMQUNQYXJzZXI+IG1QYXJzZXI7Ci0gICAgc3RhdHVzX3QgbUluaXRDaGVjazsKLSAgICBzcDxNZXRhRGF0YT4gbUZpbGVNZXRhZGF0YTsKLQotICAgIC8vIFRoZXJlIGlzIG9ubHkgb25lIHRyYWNrCi0gICAgc3A8TWV0YURhdGE+IG1UcmFja01ldGFkYXRhOwotCi0gICAgc3RhdHVzX3QgaW5pdCgpOwotCi0gICAgRkxBQ0V4dHJhY3Rvcihjb25zdCBGTEFDRXh0cmFjdG9yICYpOwotICAgIEZMQUNFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBGTEFDRXh0cmFjdG9yICYpOwotCi19OwotCi1ib29sIFNuaWZmRkxBQyhjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwKLSAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsIHNwPEFNZXNzYWdlPiAqKTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBGTEFDX0VYVFJBQ1RPUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9GcmFtZURlY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRnJhbWVEZWNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM1OGMxNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRnJhbWVEZWNvZGVyLmgKQEAgLTAsMCArMSwxODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZSQU1FX0RFQ09ERVJfSF8KKyNkZWZpbmUgRlJBTUVfREVDT0RFUl9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX1ZpZGVvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLWJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQU1lc3NhZ2U7CitjbGFzcyBNZWRpYUNvZGVjQnVmZmVyOworY2xhc3MgSU1lZGlhU291cmNlOworY2xhc3MgVmlkZW9GcmFtZTsKK3N0cnVjdCBNZWRpYUNvZGVjOworCitzdHJ1Y3QgRnJhbWVSZWN0IHsKKyAgICBpbnQzMl90IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTsKK307CisKK3N0cnVjdCBGcmFtZURlY29kZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgRnJhbWVEZWNvZGVyKAorICAgICAgICAgICAgY29uc3QgQVN0cmluZyAmY29tcG9uZW50TmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmdHJhY2tNZXRhLAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlKTsKKworICAgIHN0YXR1c190IGluaXQoCisgICAgICAgICAgICBpbnQ2NF90IGZyYW1lVGltZVVzLCBzaXplX3QgbnVtRnJhbWVzLCBpbnQgb3B0aW9uLCBpbnQgY29sb3JGb3JtYXQpOworCisgICAgc3A8SU1lbW9yeT4gZXh0cmFjdEZyYW1lKEZyYW1lUmVjdCAqcmVjdCA9IE5VTEwpOworCisgICAgc3RhdHVzX3QgZXh0cmFjdEZyYW1lcyhzdGQ6OnZlY3RvcjxzcDxJTWVtb3J5PiA+KiBmcmFtZXMpOworCisgICAgc3RhdGljIHNwPElNZW1vcnk+IGdldE1ldGFkYXRhT25seSgKKyAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmdHJhY2tNZXRhLCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgdGh1bWJuYWlsID0gZmFsc2UpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+RnJhbWVEZWNvZGVyKCk7CisKKyAgICB2aXJ0dWFsIHNwPEFNZXNzYWdlPiBvbkdldEZvcm1hdEFuZFNlZWtPcHRpb25zKAorICAgICAgICAgICAgaW50NjRfdCBmcmFtZVRpbWVVcywKKyAgICAgICAgICAgIHNpemVfdCBudW1GcmFtZXMsCisgICAgICAgICAgICBpbnQgc2Vla01vZGUsCisgICAgICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25FeHRyYWN0UmVjdChGcmFtZVJlY3QgKnJlY3QpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25JbnB1dFJlY2VpdmVkKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmNvZGVjQnVmZmVyLAorICAgICAgICAgICAgTWV0YURhdGFCYXNlICZzYW1wbGVNZXRhLAorICAgICAgICAgICAgYm9vbCBmaXJzdFNhbXBsZSwKKyAgICAgICAgICAgIHVpbnQzMl90ICpmbGFncykgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBvbk91dHB1dFJlY2VpdmVkKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJnZpZGVvRnJhbWVCdWZmZXIsCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCwKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzLAorICAgICAgICAgICAgYm9vbCAqZG9uZSkgPSAwOworCisgICAgc3A8TWV0YURhdGE+IHRyYWNrTWV0YSgpICAgICBjb25zdCAgICAgIHsgcmV0dXJuIG1UcmFja01ldGE7IH0KKyAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBkc3RGb3JtYXQoKSBjb25zdCAgeyByZXR1cm4gbURzdEZvcm1hdDsgfQorICAgIGludDMyX3QgZHN0QnBwKCkgICAgICAgICAgICAgY29uc3QgICAgICB7IHJldHVybiBtRHN0QnBwOyB9CisKKyAgICB2b2lkIGFkZEZyYW1lKGNvbnN0IHNwPElNZW1vcnk+ICZmcmFtZSkgeworICAgICAgICBtRnJhbWVzLnB1c2hfYmFjayhmcmFtZSk7CisgICAgfQorCitwcml2YXRlOgorICAgIEFTdHJpbmcgbUNvbXBvbmVudE5hbWU7CisgICAgc3A8TWV0YURhdGE+IG1UcmFja01ldGE7CisgICAgc3A8SU1lZGlhU291cmNlPiBtU291cmNlOworICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIG1Ec3RGb3JtYXQ7CisgICAgaW50MzJfdCBtRHN0QnBwOworICAgIHN0ZDo6dmVjdG9yPHNwPElNZW1vcnk+ID4gbUZyYW1lczsKKyAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgbVJlYWRPcHRpb25zOworICAgIHNwPE1lZGlhQ29kZWM+IG1EZWNvZGVyOworICAgIHNwPEFNZXNzYWdlPiBtT3V0cHV0Rm9ybWF0OworICAgIGJvb2wgbUhhdmVNb3JlSW5wdXRzOworICAgIGJvb2wgbUZpcnN0U2FtcGxlOworCisgICAgc3RhdHVzX3QgZXh0cmFjdEludGVybmFsKCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhGcmFtZURlY29kZXIpOworfTsKKworc3RydWN0IFZpZGVvRnJhbWVEZWNvZGVyIDogcHVibGljIEZyYW1lRGVjb2RlciB7CisgICAgVmlkZW9GcmFtZURlY29kZXIoCisgICAgICAgICAgICBjb25zdCBBU3RyaW5nICZjb21wb25lbnROYW1lLAorICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZ0cmFja01ldGEsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCBzcDxBTWVzc2FnZT4gb25HZXRGb3JtYXRBbmRTZWVrT3B0aW9ucygKKyAgICAgICAgICAgIGludDY0X3QgZnJhbWVUaW1lVXMsCisgICAgICAgICAgICBzaXplX3QgbnVtRnJhbWVzLAorICAgICAgICAgICAgaW50IHNlZWtNb2RlLAorICAgICAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25FeHRyYWN0UmVjdChGcmFtZVJlY3QgKnJlY3QpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gUmVjdCBleHRyYWN0aW9uIGZvciBzZXF1ZW5jZXMgaXMgbm90IHN1cHBvcnRlZCBmb3Igbm93LgorICAgICAgICByZXR1cm4gKHJlY3QgPT0gTlVMTCkgPyBPSyA6IEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25JbnB1dFJlY2VpdmVkKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmNvZGVjQnVmZmVyLAorICAgICAgICAgICAgTWV0YURhdGFCYXNlICZzYW1wbGVNZXRhLAorICAgICAgICAgICAgYm9vbCBmaXJzdFNhbXBsZSwKKyAgICAgICAgICAgIHVpbnQzMl90ICpmbGFncykgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uT3V0cHV0UmVjZWl2ZWQoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmdmlkZW9GcmFtZUJ1ZmZlciwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMsCisgICAgICAgICAgICBib29sICpkb25lKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBib29sIG1Jc0F2Y09ySGV2YzsKKyAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1TZWVrTW9kZTsKKyAgICBpbnQ2NF90IG1UYXJnZXRUaW1lVXM7CisgICAgc2l6ZV90IG1OdW1GcmFtZXM7CisgICAgc2l6ZV90IG1OdW1GcmFtZXNEZWNvZGVkOworfTsKKworc3RydWN0IEltYWdlRGVjb2RlciA6IHB1YmxpYyBGcmFtZURlY29kZXIgeworICAgIEltYWdlRGVjb2RlcigKKyAgICAgICAgICAgIGNvbnN0IEFTdHJpbmcgJmNvbXBvbmVudE5hbWUsCisgICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJnRyYWNrTWV0YSwKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHNwPEFNZXNzYWdlPiBvbkdldEZvcm1hdEFuZFNlZWtPcHRpb25zKAorICAgICAgICAgICAgaW50NjRfdCBmcmFtZVRpbWVVcywKKyAgICAgICAgICAgIHNpemVfdCBudW1GcmFtZXMsCisgICAgICAgICAgICBpbnQgc2Vla01vZGUsCisgICAgICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBvbkV4dHJhY3RSZWN0KEZyYW1lUmVjdCAqcmVjdCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uSW5wdXRSZWNlaXZlZCgKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZjb2RlY0J1ZmZlciBfX3VudXNlZCwKKyAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmc2FtcGxlTWV0YSBfX3VudXNlZCwKKyAgICAgICAgICAgIGJvb2wgZmlyc3RTYW1wbGUgX191bnVzZWQsCisgICAgICAgICAgICB1aW50MzJfdCAqZmxhZ3MgX191bnVzZWQpIG92ZXJyaWRlIHsgcmV0dXJuIE9LOyB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uT3V0cHV0UmVjZWl2ZWQoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmdmlkZW9GcmFtZUJ1ZmZlciwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMsCisgICAgICAgICAgICBib29sICpkb25lKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBWaWRlb0ZyYW1lICptRnJhbWU7CisgICAgaW50MzJfdCBtV2lkdGg7CisgICAgaW50MzJfdCBtSGVpZ2h0OworICAgIGludDMyX3QgbUdyaWRSb3dzOworICAgIGludDMyX3QgbUdyaWRDb2xzOworICAgIGludDMyX3QgbVRpbGVXaWR0aDsKKyAgICBpbnQzMl90IG1UaWxlSGVpZ2h0OworICAgIGludDMyX3QgbVRpbGVzRGVjb2RlZDsKKyAgICBpbnQzMl90IG1UYXJnZXRUaWxlczsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gRlJBTUVfREVDT0RFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oCmluZGV4IGQzMjVlMzAuLmE5MjQxOTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgKQEAgLTE4LDkgKzE4LDEwIEBACiAKICNkZWZpbmUgSFRUUF9CQVNFX0hfCiAKKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSUQzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0lEMy5oCmluZGV4IDExNjgyZjguLjdjMjM5MWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSUQzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JRDMuaApAQCAtMjIsNyArMjIsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIERhdGFTb3VyY2U7CitjbGFzcyBEYXRhU291cmNlQmFzZTsKIGNsYXNzIFN0cmluZzg7CiAKIHN0cnVjdCBJRDMgewpAQCAtMzUsNyArMzUsNyBAQAogICAgICAgICBJRDNfVjJfNCwKICAgICB9OwogCi0gICAgZXhwbGljaXQgSUQzKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIGJvb2wgaWdub3JlVjEgPSBmYWxzZSwgb2ZmNjRfdCBvZmZzZXQgPSAwKTsKKyAgICBleHBsaWNpdCBJRDMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgYm9vbCBpZ25vcmVWMSA9IGZhbHNlLCBvZmY2NF90IG9mZnNldCA9IDApOwogICAgIElEMyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSwgYm9vbCBpZ25vcmVWMSA9IGZhbHNlKTsKICAgICB+SUQzKCk7CiAKQEAgLTg1LDggKzg1LDggQEAKICAgICAvLyBvbmx5IHZhbGlkIGZvciBJRFYyKwogICAgIHNpemVfdCBtUmF3U2l6ZTsKIAotICAgIGJvb2wgcGFyc2VWMShjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKTsKLSAgICBib29sIHBhcnNlVjIoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgb2ZmNjRfdCBvZmZzZXQpOworICAgIGJvb2wgcGFyc2VWMShEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKyAgICBib29sIHBhcnNlVjIoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgb2ZmNjRfdCBvZmZzZXQpOwogICAgIHZvaWQgcmVtb3ZlVW5zeW5jaHJvbml6YXRpb24oKTsKICAgICBib29sIHJlbW92ZVVuc3luY2hyb25pemF0aW9uVjJfNChib29sIGlUdW5lc0hhY2spOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0l0ZW1UYWJsZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JdGVtVGFibGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE2YWY1ZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0l0ZW1UYWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgSVRFTV9UQUJMRV9IXwotI2RlZmluZSBJVEVNX1RBQkxFX0hfCi0KLSNpbmNsdWRlIDxzZXQ+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERhdGFTb3VyY2U7Ci1jbGFzcyBNZXRhRGF0YTsKLQotbmFtZXNwYWNlIGhlaWYgewotCi1zdHJ1Y3QgQXNzb2NpYXRpb25FbnRyeTsKLXN0cnVjdCBJbWFnZUl0ZW07Ci1zdHJ1Y3QgSXRlbUxvYzsKLXN0cnVjdCBJdGVtSW5mbzsKLXN0cnVjdCBJdGVtUHJvcGVydHk7Ci1zdHJ1Y3QgSXRlbVJlZmVyZW5jZTsKLQotLyoKLSAqIEl0ZW1UYWJsZSBrZWVwcyB0cmFjayBvZiBhbGwgaW1hZ2UgaXRlbXMgKGluY2x1ZGluZyBjb2RlZCBpbWFnZXMsIGdyaWRzIGFuZAotICogdGlsZXMpIGluc2lkZSBhIEhFSUYgc3RpbGwgaW1hZ2UgKElTTy9JRUMgRkRJUyAyMzAwOC0xMi4yOjIwMTcoRSkpLgotICovCi0KLWNsYXNzIEl0ZW1UYWJsZSA6IHB1YmxpYyBSZWZCYXNlIHsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBJdGVtVGFibGUoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwotCi0gICAgYm9vbCBpc1ZhbGlkKCkgeyByZXR1cm4gbUltYWdlSXRlbXNWYWxpZDsgfQotICAgIHNwPE1ldGFEYXRhPiBnZXRJbWFnZU1ldGEoKTsKLSAgICB1aW50MzJfdCBjb3VudEltYWdlcygpIGNvbnN0OwotICAgIHN0YXR1c190IGZpbmRQcmltYXJ5SW1hZ2UodWludDMyX3QgKmltYWdlSW5kZXgpOwotICAgIHN0YXR1c190IGZpbmRUaHVtYm5haWwodWludDMyX3QgKnRodW1ibmFpbEluZGV4KTsKLSAgICBzdGF0dXNfdCBnZXRJbWFnZU9mZnNldEFuZFNpemUoCi0gICAgICAgICAgICB1aW50MzJfdCAqaW1hZ2VJbmRleCwgb2ZmNjRfdCAqb2Zmc2V0LCBzaXplX3QgKnNpemUpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgfkl0ZW1UYWJsZSgpOwotCi1wcml2YXRlOgotICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwotCi0gICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIEl0ZW1Mb2M+IG1JdGVtTG9jczsKLSAgICBWZWN0b3I8SXRlbUluZm8+IG1JdGVtSW5mb3M7Ci0gICAgVmVjdG9yPEFzc29jaWF0aW9uRW50cnk+IG1Bc3NvY2lhdGlvbnM7Ci0gICAgVmVjdG9yPHNwPEl0ZW1Qcm9wZXJ0eT4gPiBtSXRlbVByb3BlcnRpZXM7Ci0gICAgVmVjdG9yPHNwPEl0ZW1SZWZlcmVuY2U+ID4gbUl0ZW1SZWZlcmVuY2VzOwotCi0gICAgdWludDMyX3QgbVByaW1hcnlJdGVtSWQ7Ci0gICAgb2ZmNjRfdCBtSWRhdE9mZnNldDsKLSAgICBzaXplX3QgbUlkYXRTaXplOwotCi0gICAgc3RkOjpzZXQ8dWludDMyX3Q+IG1SZXF1aXJlZEJveGVzOwotICAgIHN0ZDo6c2V0PHVpbnQzMl90PiBtQm94ZXNTZWVuOwotCi0gICAgYm9vbCBtSW1hZ2VJdGVtc1ZhbGlkOwotICAgIHVpbnQzMl90IG1DdXJyZW50SW1hZ2VJbmRleDsKLSAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSW1hZ2VJdGVtPiBtSXRlbUlkVG9JbWFnZU1hcDsKLQotICAgIHN0YXR1c190IHBhcnNlSWxvY0JveChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwotICAgIHN0YXR1c190IHBhcnNlSWluZkJveChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwotICAgIHN0YXR1c190IHBhcnNlUGl0bUJveChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwotICAgIHN0YXR1c190IHBhcnNlSXBycEJveChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwotICAgIHN0YXR1c190IHBhcnNlSWRhdEJveChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwotICAgIHN0YXR1c190IHBhcnNlSXJlZkJveChvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwotCi0gICAgdm9pZCBhdHRhY2hQcm9wZXJ0eShjb25zdCBBc3NvY2lhdGlvbkVudHJ5ICZhc3NvY2lhdGlvbik7Ci0gICAgc3RhdHVzX3QgYnVpbGRJbWFnZUl0ZW1zSWZQb3NzaWJsZSh1aW50MzJfdCB0eXBlKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEl0ZW1UYWJsZSk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBoZWlmCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gSVRFTV9UQUJMRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUDNFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVAzRXh0cmFjdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZDA0ZjIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUDNFeHRyYWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1QM19FWFRSQUNUT1JfSF8KLQotI2RlZmluZSBNUDNfRVhUUkFDVE9SX0hfCi0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBBTWVzc2FnZTsKLWNsYXNzIERhdGFTb3VyY2U7Ci1zdHJ1Y3QgTVAzU2Vla2VyOwotY2xhc3MgU3RyaW5nODsKLQotY2xhc3MgTVAzRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKLXB1YmxpYzoKLSAgICAvLyBFeHRyYWN0b3IgYXNzdW1lcyBvd25lcnNoaXAgb2YgInNvdXJjZSIuCi0gICAgTVAzRXh0cmFjdG9yKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIGNvbnN0IHNwPEFNZXNzYWdlPiAmbWV0YSk7Ci0KLSAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgc3A8SU1lZGlhU291cmNlPiBnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldFRyYWNrTWV0YURhdGEoc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7Ci0KLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRNZXRhRGF0YSgpOwotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiTVAzRXh0cmFjdG9yIjsgfQotCi1wcml2YXRlOgotICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7Ci0KLSAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKLSAgICBvZmY2NF90IG1GaXJzdEZyYW1lUG9zOwotICAgIHNwPE1ldGFEYXRhPiBtTWV0YTsKLSAgICB1aW50MzJfdCBtRml4ZWRIZWFkZXI7Ci0gICAgc3A8TVAzU2Vla2VyPiBtU2Vla2VyOwotCi0gICAgTVAzRXh0cmFjdG9yKGNvbnN0IE1QM0V4dHJhY3RvciAmKTsKLSAgICBNUDNFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBNUDNFeHRyYWN0b3IgJik7Ci19OwotCi1ib29sIFNuaWZmTVAzKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsCi0gICAgICAgIHNwPEFNZXNzYWdlPiAqbWV0YSk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTVAzX0VYVFJBQ1RPUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUDNTZWVrZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVAzU2Vla2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5OTU0MmUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUDNTZWVrZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1QM19TRUVLRVJfSF8KLQotI2RlZmluZSBNUDNfU0VFS0VSX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBNUDNTZWVrZXIgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgTVAzU2Vla2VyKCkge30KLQotICAgIHZpcnR1YWwgYm9vbCBnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKSA9IDA7Ci0KLSAgICAvLyBHaXZlbiBhIHJlcXVlc3Qgc2VlayB0aW1lIGluICIqdGltZVVzIiwgZmluZCB0aGUgYnl0ZSBvZmZzZXQgY2xvc2VzdAotICAgIC8vIHRvIHRoYXQgcG9zaXRpb24gYW5kIHJldHVybiBpdCBpbiAiKnBvcyIuIFVwZGF0ZSAiKnRpbWVVcyIgdG8gcmVmbGVjdAotICAgIC8vIHRoZSBhY3R1YWwgdGltZSB0aGF0IHNlZWtwb2ludCByZXByZXNlbnRzLgotICAgIHZpcnR1YWwgYm9vbCBnZXRPZmZzZXRGb3JUaW1lKGludDY0X3QgKnRpbWVVcywgb2ZmNjRfdCAqcG9zKSA9IDA7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5NUDNTZWVrZXIoKSB7fQotCi1wcml2YXRlOgotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1QM1NlZWtlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE1QM19TRUVLRVJfSF8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHMlBTRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyUFNFeHRyYWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU0NzFiMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyUFNFeHRyYWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1QRUcyX1BTX0VYVFJBQ1RPUl9IXwotCi0jZGVmaW5lIE1QRUcyX1BTX0VYVFJBQ1RPUl9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEFCdWZmZXI7Ci1zdHJ1Y3QgQU1lc3NhZ2U7Ci1zdHJ1Y3QgVHJhY2s7Ci1jbGFzcyBTdHJpbmc4OwotCi1zdHJ1Y3QgTVBFRzJQU0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7Ci0gICAgZXhwbGljaXQgTVBFRzJQU0V4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKTsKLQotICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBzcDxJTWVkaWFTb3VyY2U+IGdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0VHJhY2tNZXRhRGF0YShzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKLQotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldE1ldGFEYXRhKCk7Ci0KLSAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJNUEVHMlBTRXh0cmFjdG9yIjsgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+TVBFRzJQU0V4dHJhY3RvcigpOwotCi1wcml2YXRlOgotICAgIHN0cnVjdCBUcmFjazsKLSAgICBzdHJ1Y3QgV3JhcHBlZFRyYWNrOwotCi0gICAgbXV0YWJsZSBNdXRleCBtTG9jazsKLSAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKLQotICAgIG9mZjY0X3QgbU9mZnNldDsKLSAgICBzdGF0dXNfdCBtRmluYWxSZXN1bHQ7Ci0gICAgc3A8QUJ1ZmZlcj4gbUJ1ZmZlcjsKLSAgICBLZXllZFZlY3Rvcjx1bnNpZ25lZCwgc3A8VHJhY2s+ID4gbVRyYWNrczsKLSAgICBib29sIG1TY2FubmluZzsKLQotICAgIGJvb2wgbVByb2dyYW1TdHJlYW1NYXBWYWxpZDsKLSAgICBLZXllZFZlY3Rvcjx1bnNpZ25lZCwgdW5zaWduZWQ+IG1TdHJlYW1UeXBlQnlFU0lEOwotCi0gICAgc3RhdHVzX3QgZmVlZE1vcmUoKTsKLQotICAgIHN0YXR1c190IGRlcXVldWVDaHVuaygpOwotICAgIHNzaXplX3QgZGVxdWV1ZVBhY2soKTsKLSAgICBzc2l6ZV90IGRlcXVldWVTeXN0ZW1IZWFkZXIoKTsKLSAgICBzc2l6ZV90IGRlcXVldWVQRVMoKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1QRUcyUFNFeHRyYWN0b3IpOwotfTsKLQotYm9vbCBTbmlmZk1QRUcyUFMoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgc3A8QU1lc3NhZ2U+ICopOwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE1QRUcyX1BTX0VYVFJBQ1RPUl9IXwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzkzYjVlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1QRUcyX1RTX0VYVFJBQ1RPUl9IXwotCi0jZGVmaW5lIE1QRUcyX1RTX0VYVFJBQ1RPUl9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotI2luY2x1ZGUgIm1wZWcydHMvQVRTUGFyc2VyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEFNZXNzYWdlOwotc3RydWN0IEFub3RoZXJQYWNrZXRTb3VyY2U7Ci1zdHJ1Y3QgQVRTUGFyc2VyOwotY2xhc3MgRGF0YVNvdXJjZTsKLXN0cnVjdCBNUEVHMlRTU291cmNlOwotY2xhc3MgU3RyaW5nODsKLQotc3RydWN0IE1QRUcyVFNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewotICAgIGV4cGxpY2l0IE1QRUcyVFNFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSk7Ci0KLSAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgc3A8SU1lZGlhU291cmNlPiBnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldFRyYWNrTWV0YURhdGEoc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7Ci0KLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRNZXRhRGF0YSgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBISW50ZXJmYWNlVG9rZW4gJmNhc1Rva2VuKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1QRUcyVFNFeHRyYWN0b3IiOyB9Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIHN0cnVjdCBNUEVHMlRTU291cmNlOwotCi0gICAgbXV0YWJsZSBNdXRleCBtTG9jazsKLQotICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwotCi0gICAgc3A8QVRTUGFyc2VyPiBtUGFyc2VyOwotCi0gICAgLy8gVXNlZCB0byByZW1lbWJlciBTeW5jRXZlbnQgb2NjdXJyZWQgaW4gZmVlZE1vcmUoKSB3aGVuIGNhbGxlZCBmcm9tIGluaXQoKSwKLSAgICAvLyBiZWNhdXNlIGluaXQoKSBuZWVkcyB0byB1cGRhdGUgfG1Tb3VyY2VJbXBsc3wgYmVmb3JlIGFkZGluZyBTeW5jUG9pbnQuCi0gICAgQVRTUGFyc2VyOjpTeW5jRXZlbnQgbUxhc3RTeW5jRXZlbnQ7Ci0KLSAgICBWZWN0b3I8c3A8QW5vdGhlclBhY2tldFNvdXJjZT4gPiBtU291cmNlSW1wbHM7Ci0KLSAgICBWZWN0b3I8S2V5ZWRWZWN0b3I8aW50NjRfdCwgb2ZmNjRfdD4gPiBtU3luY1BvaW50czsKLSAgICAvLyBTeW5jIHBvaW50cyB1c2VkIGZvciBzZWVraW5nIC0tLSBub3JtYWxseSBvbmUgZm9yIHZpZGVvIHRyYWNrIGlzIHVzZWQuCi0gICAgLy8gSWYgbm8gdmlkZW8gdHJhY2sgaXMgcHJlc2VudCwgYXVkaW8gdHJhY2sgd2lsbCBiZSB1c2VkIGluc3RlYWQuCi0gICAgS2V5ZWRWZWN0b3I8aW50NjRfdCwgb2ZmNjRfdD4gKm1TZWVrU3luY1BvaW50czsKLQotICAgIG9mZjY0X3QgbU9mZnNldDsKLQotICAgIHN0YXRpYyBib29sIGlzU2NyYW1ibGVkRm9ybWF0KGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0KTsKLQotICAgIHZvaWQgaW5pdCgpOwotICAgIHZvaWQgYWRkU291cmNlKGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsKTsKLSAgICAvLyBUcnkgdG8gZmVlZCBtb3JlIGRhdGEgZnJvbSBzb3VyY2UgdG8gcGFyc2VyLgotICAgIC8vIHxpc0luaXR8IG1lYW5zIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluc2lkZSBpbml0KCkuIFRoaXMgaXMgYSBzaWduYWwgdG8KLSAgICAvLyBzYXZlIFN5bmNFdmVudCBzbyB0aGF0IGluaXQoKSBjYW4gYWRkIFN5bmNQb2ludCBhZnRlciBpdCB1cGRhdGVzIHxtU291cmNlSW1wbHN8LgotICAgIC8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBPSyBpZiBleHBlY3RlZCBhbW91bnQgb2YgZGF0YSBpcyBmZWQgZnJvbSBEYXRhU291cmNlIHRvCi0gICAgLy8gcGFyc2VyIGFuZCBpcyBzdWNjZXNzZnVsbHkgcGFyc2VkLiBPdGhlcndpc2UsIHZhcmlvdXMgZXJyb3IgY29kZXMgY291bGQgYmUKLSAgICAvLyByZXR1cm5lZCwgZS5nLiwgRVJST1JfRU5EX09GX1NUUkVBTSwgb3Igbm8gZGF0YSBhdmFpbGFsYmUgZnJvbSBEYXRhU291cmNlLCBvcgotICAgIC8vIHRoZSBkYXRhIGhhcyBzeW50YXggZXJyb3IgZHVyaW5nIHBhcnNpbmcsIGV0Yy4KLSAgICBzdGF0dXNfdCBmZWVkTW9yZShib29sIGlzSW5pdCA9IGZhbHNlKTsKLSAgICBzdGF0dXNfdCBzZWVrKGludDY0X3Qgc2Vla1RpbWVVcywKLSAgICAgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUmIHNlZWtNb2RlKTsKLSAgICBzdGF0dXNfdCBxdWV1ZURpc2NvbnRpbnVpdHlGb3JTZWVrKGludDY0X3QgYWN0dWFsU2Vla1RpbWVVcyk7Ci0gICAgc3RhdHVzX3Qgc2Vla0JleW9uZChpbnQ2NF90IHNlZWtUaW1lVXMpOwotCi0gICAgc3RhdHVzX3QgZmVlZFVudGlsQnVmZmVyQXZhaWxhYmxlKGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsKTsKLQotICAgIC8vIEFkZCBhIFN5blBvaW50IGRlcml2ZWQgZnJvbSB8ZXZlbnR8LgotICAgIHZvaWQgYWRkU3luY1BvaW50X2woY29uc3QgQVRTUGFyc2VyOjpTeW5jRXZlbnQgJmV2ZW50KTsKLQotICAgIHN0YXR1c190ICBlc3RpbWF0ZUR1cmF0aW9uc0Zyb21UaW1lc1VzQXRFbmQoKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1QRUcyVFNFeHRyYWN0b3IpOwotfTsKLQotYm9vbCBTbmlmZk1QRUcyVFMoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgc3A8QU1lc3NhZ2U+ICopOwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE1QRUcyX1RTX0VYVFJBQ1RPUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWQ3ZGRlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNUEVHNF9FWFRSQUNUT1JfSF8KLQotI2RlZmluZSBNUEVHNF9FWFRSQUNUT1JfSF8KLQotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KLSNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1zdHJ1Y3QgQU1lc3NhZ2U7Ci1jbGFzcyBEYXRhU291cmNlOwotY2xhc3MgU2FtcGxlVGFibGU7Ci1jbGFzcyBTdHJpbmc4OwotbmFtZXNwYWNlIGhlaWYgewotY2xhc3MgSXRlbVRhYmxlOwotfQotdXNpbmcgaGVpZjo6SXRlbVRhYmxlOwotCi1zdHJ1Y3QgU2lkeEVudHJ5IHsKLSAgICBzaXplX3QgbVNpemU7Ci0gICAgdWludDMyX3QgbUR1cmF0aW9uVXM7Ci19OwotCi1zdHJ1Y3QgVHJleCB7Ci0gICAgdWludDMyX3QgdHJhY2tfSUQ7Ci0gICAgdWludDMyX3QgZGVmYXVsdF9zYW1wbGVfZGVzY3JpcHRpb25faW5kZXg7Ci0gICAgdWludDMyX3QgZGVmYXVsdF9zYW1wbGVfZHVyYXRpb247Ci0gICAgdWludDMyX3QgZGVmYXVsdF9zYW1wbGVfc2l6ZTsKLSAgICB1aW50MzJfdCBkZWZhdWx0X3NhbXBsZV9mbGFnczsKLX07Ci0KLWNsYXNzIE1QRUc0RXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKLXB1YmxpYzoKLSAgICAvLyBFeHRyYWN0b3IgYXNzdW1lcyBvd25lcnNoaXAgb2YgInNvdXJjZSIuCi0gICAgZXhwbGljaXQgTVBFRzRFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSk7Ci0KLSAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgc3A8SU1lZGlhU291cmNlPiBnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldFRyYWNrTWV0YURhdGEoc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7Ci0KLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRNZXRhRGF0YSgpOwotICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1QRUc0RXh0cmFjdG9yIjsgfQotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCk7Ci0KLSAgICAvLyBmb3IgRFJNCi0gICAgdmlydHVhbCBjaGFyKiBnZXREcm1UcmFja0luZm8oc2l6ZV90IHRyYWNrSUQsIGludCAqbGVuKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfk1QRUc0RXh0cmFjdG9yKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcG9wdWxhdGVNZXRyaWNzKCk7Ci0KLXByaXZhdGU6Ci0KLSAgICBzdHJ1Y3QgUHNzaEluZm8gewotICAgICAgICB1aW50OF90IHV1aWRbMTZdOwotICAgICAgICB1aW50MzJfdCBkYXRhbGVuOwotICAgICAgICB1aW50OF90ICpkYXRhOwotICAgIH07Ci0gICAgc3RydWN0IFRyYWNrIHsKLSAgICAgICAgVHJhY2sgKm5leHQ7Ci0gICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhOwotICAgICAgICB1aW50MzJfdCB0aW1lc2NhbGU7Ci0gICAgICAgIHNwPFNhbXBsZVRhYmxlPiBzYW1wbGVUYWJsZTsKLSAgICAgICAgYm9vbCBpbmNsdWRlc19leHBlbnNpdmVfbWV0YWRhdGE7Ci0gICAgICAgIGJvb2wgc2tpcFRyYWNrOwotICAgIH07Ci0KLSAgICBWZWN0b3I8U2lkeEVudHJ5PiBtU2lkeEVudHJpZXM7Ci0gICAgb2ZmNjRfdCBtTW9vZk9mZnNldDsKLSAgICBib29sIG1Nb29mRm91bmQ7Ci0gICAgYm9vbCBtTWRhdEZvdW5kOwotCi0gICAgVmVjdG9yPFBzc2hJbmZvPiBtUHNzaDsKLQotICAgIFZlY3RvcjxUcmV4PiBtVHJleDsKLQotICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwotICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7Ci0gICAgdWludDMyX3QgbUhlYWRlclRpbWVzY2FsZTsKLSAgICBib29sIG1Jc1FUOwotICAgIGJvb2wgbUlzSEVJRjsKLQotICAgIFRyYWNrICptRmlyc3RUcmFjaywgKm1MYXN0VHJhY2s7Ci0KLSAgICBzcDxNZXRhRGF0YT4gbUZpbGVNZXRhRGF0YTsKLQotICAgIFZlY3Rvcjx1aW50MzJfdD4gbVBhdGg7Ci0gICAgU3RyaW5nOCBtTGFzdENvbW1lbnRNZWFuOwotICAgIFN0cmluZzggbUxhc3RDb21tZW50TmFtZTsKLSAgICBTdHJpbmc4IG1MYXN0Q29tbWVudERhdGE7Ci0KLSAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgQVN0cmluZz4gbU1ldGFLZXlNYXA7Ci0KLSAgICBzdGF0dXNfdCByZWFkTWV0YURhdGEoKTsKLSAgICBzdGF0dXNfdCBwYXJzZUNodW5rKG9mZjY0X3QgKm9mZnNldCwgaW50IGRlcHRoKTsKLSAgICBzdGF0dXNfdCBwYXJzZUlUdW5lc01ldGFEYXRhKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7Ci0gICAgc3RhdHVzX3QgcGFyc2VDb2xvckluZm8ob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKLSAgICBzdGF0dXNfdCBwYXJzZTNHUFBNZXRhRGF0YShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUsIGludCBkZXB0aCk7Ci0gICAgdm9pZCBwYXJzZUlEM3YyTWV0YURhdGEob2ZmNjRfdCBvZmZzZXQpOwotICAgIHN0YXR1c190IHBhcnNlUVRNZXRhS2V5KG9mZjY0X3QgZGF0YV9vZmZzZXQsIHNpemVfdCBkYXRhX3NpemUpOwotICAgIHN0YXR1c190IHBhcnNlUVRNZXRhVmFsKGludDMyX3Qga2V5SWQsIG9mZjY0X3QgZGF0YV9vZmZzZXQsIHNpemVfdCBkYXRhX3NpemUpOwotCi0gICAgc3RhdHVzX3QgdXBkYXRlQXVkaW9UcmFja0luZm9Gcm9tRVNEU19NUEVHNEF1ZGlvKAotICAgICAgICAgICAgY29uc3Qgdm9pZCAqZXNkc19kYXRhLCBzaXplX3QgZXNkc19zaXplKTsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCB2ZXJpZnlUcmFjayhUcmFjayAqdHJhY2spOwotCi0gICAgc3RydWN0IFNJTkYgewotICAgICAgICBTSU5GICpuZXh0OwotICAgICAgICB1aW50MTZfdCB0cmFja0lEOwotICAgICAgICB1aW50OF90IElQTVBEZXNjcmlwdG9ySUQ7Ci0gICAgICAgIHNzaXplX3QgbGVuOwotICAgICAgICBjaGFyICpJUE1QRGF0YTsKLSAgICB9OwotCi0gICAgU0lORiAqbUZpcnN0U0lORjsKLQotICAgIGJvb2wgbUlzRHJtOwotICAgIHNwPEl0ZW1UYWJsZT4gbUl0ZW1UYWJsZTsKLQotICAgIHN0YXR1c190IHBhcnNlRHJtU0lORihvZmY2NF90ICpvZmZzZXQsIG9mZjY0X3QgZGF0YV9vZmZzZXQpOwotCi0gICAgc3RhdHVzX3QgcGFyc2VUcmFja0hlYWRlcihvZmY2NF90IGRhdGFfb2Zmc2V0LCBvZmY2NF90IGRhdGFfc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZVNlZ21lbnRJbmRleChvZmY2NF90IGRhdGFfb2Zmc2V0LCBzaXplX3QgZGF0YV9zaXplKTsKLQotICAgIFRyYWNrICpmaW5kVHJhY2tCeU1pbWVQcmVmaXgoY29uc3QgY2hhciAqbWltZVByZWZpeCk7Ci0KLSAgICBzdGF0dXNfdCBwYXJzZUFDM1NhbXBsZUVudHJ5KG9mZjY0X3Qgb2Zmc2V0KTsKLSAgICBzdGF0dXNfdCBwYXJzZUFDM1NwZWNpZmljQm94KG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCBzYW1wbGVSYXRlKTsKLQotICAgIE1QRUc0RXh0cmFjdG9yKGNvbnN0IE1QRUc0RXh0cmFjdG9yICYpOwotICAgIE1QRUc0RXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgTVBFRzRFeHRyYWN0b3IgJik7Ci19OwotCi1ib29sIFNuaWZmTVBFRzQoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgc3A8QU1lc3NhZ2U+ICopOwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE1QRUc0X0VYVFJBQ1RPUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NaWRpRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01pZGlFeHRyYWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRkMmQwOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01pZGlFeHRyYWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1JRElfRVhUUkFDVE9SX0hfCi0jZGVmaW5lIE1JRElfRVhUUkFDVE9SX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9NaWRpSW9XcmFwcGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPGxpYnNvbml2b3gvZWFzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTWlkaUVuZ2luZSA6IHB1YmxpYyBSZWZCYXNlIHsKLXB1YmxpYzoKLSAgICBNaWRpRW5naW5lKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZkYXRhU291cmNlLAotICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZmaWxlTWV0YWRhdGEsCi0gICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJnRyYWNrTWV0YWRhdGEpOwotICAgIH5NaWRpRW5naW5lKCk7Ci0KLSAgICBzdGF0dXNfdCBpbml0Q2hlY2soKTsKLQotICAgIHN0YXR1c190IGFsbG9jYXRlQnVmZmVycygpOwotICAgIHN0YXR1c190IHJlbGVhc2VCdWZmZXJzKCk7Ci0gICAgc3RhdHVzX3Qgc2Vla1RvKGludDY0X3QgcG9zaXRpb25Vcyk7Ci0gICAgTWVkaWFCdWZmZXIqIHJlYWRCdWZmZXIoKTsKLXByaXZhdGU6Ci0gICAgc3A8TWlkaUlvV3JhcHBlcj4gbUlvV3JhcHBlcjsKLSAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7Ci0gICAgRUFTX0RBVEFfSEFORExFIG1FYXNEYXRhOwotICAgIEVBU19IQU5ETEUgbUVhc0hhbmRsZTsKLSAgICBjb25zdCBTX0VBU19MSUJfQ09ORklHKiBtRWFzQ29uZmlnOwotICAgIGJvb2wgbUlzSW5pdGlhbGl6ZWQ7Ci19OwotCi1jbGFzcyBNaWRpRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKLQotcHVibGljOgotICAgIC8vIEV4dHJhY3RvciBhc3N1bWVzIG93bmVyc2hpcCBvZiBzb3VyY2UKLSAgICBleHBsaWNpdCBNaWRpRXh0cmFjdG9yKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpOwotCi0gICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIHNwPElNZWRpYVNvdXJjZT4gZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRUcmFja01ldGFEYXRhKHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwotCi0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0TWV0YURhdGEoKTsKLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1pZGlFeHRyYWN0b3IiOyB9Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5NaWRpRXh0cmFjdG9yKCk7Ci0KLXByaXZhdGU6Ci0gICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7Ci0gICAgc3RhdHVzX3QgbUluaXRDaGVjazsKLSAgICBzcDxNZXRhRGF0YT4gbUZpbGVNZXRhZGF0YTsKLQotICAgIC8vIFRoZXJlIGlzIG9ubHkgb25lIHRyYWNrCi0gICAgc3A8TWV0YURhdGE+IG1UcmFja01ldGFkYXRhOwotCi0gICAgc3A8TWlkaUVuZ2luZT4gbUVuZ2luZTsKLQotICAgIEVBU19EQVRBX0hBTkRMRSAgICAgbUVhc0RhdGE7Ci0gICAgRUFTX0hBTkRMRSAgICAgICAgICBtRWFzSGFuZGxlOwotICAgIEVBU19QQ00qICAgICAgICAgICAgbUF1ZGlvQnVmZmVyOwotICAgIEVBU19JMzIgICAgICAgICAgICAgbVBsYXlUaW1lOwotICAgIEVBU19JMzIgICAgICAgICAgICAgbUR1cmF0aW9uOwotICAgIEVBU19TVEFURSAgICAgICAgICAgbVN0YXRlOwotICAgIEVBU19GSUxFICAgICAgICAgICAgbUZpbGVMb2NhdG9yOwotCi0gICAgTWlkaUV4dHJhY3Rvcihjb25zdCBNaWRpRXh0cmFjdG9yICYpOwotICAgIE1pZGlFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBNaWRpRXh0cmFjdG9yICYpOwotCi19OwotCi1ib29sIFNuaWZmTWlkaShjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwKLSAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsIHNwPEFNZXNzYWdlPiAqKTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNSURJX0VYVFJBQ1RPUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgKaW5kZXggMjYzOTI4MC4uZjQzOWExYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oCkBAIC0xOCw5ICsxOCw5IEBACiAKICNkZWZpbmUgTlVfQ0FDSEVEX1NPVVJDRV8yX0hfCiAKKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXJSZWZsZWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDMsNyArNDMsNiBAQAogICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKTsKIAogICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gRHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciogbWltZSk7Ci0gICAgdmlydHVhbCB2b2lkIGdldERybUluZm8oc3A8RGVjcnlwdEhhbmRsZT4gJmhhbmRsZSwgRHJtTWFuYWdlckNsaWVudCAqKmNsaWVudCk7CiAgICAgdmlydHVhbCBTdHJpbmc4IGdldFVyaSgpOwogCiAgICAgdmlydHVhbCBTdHJpbmc4IGdldE1JTUVUeXBlKCkgY29uc3Q7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09nZ0V4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PZ2dFeHRyYWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVhYWZlZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09nZ0V4dHJhY3Rvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgT0dHX0VYVFJBQ1RPUl9IXwotCi0jZGVmaW5lIE9HR19FWFRSQUNUT1JfSF8KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEFNZXNzYWdlOwotY2xhc3MgRGF0YVNvdXJjZTsKLWNsYXNzIFN0cmluZzg7Ci0KLXN0cnVjdCBNeU9nZ0V4dHJhY3RvcjsKLXN0cnVjdCBPZ2dTb3VyY2U7Ci0KLXN0cnVjdCBPZ2dFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewotICAgIGV4cGxpY2l0IE9nZ0V4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKTsKLQotICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBzcDxJTWVkaWFTb3VyY2U+IGdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0VHJhY2tNZXRhRGF0YShzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKLQotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldE1ldGFEYXRhKCk7Ci0gICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJPZ2dFeHRyYWN0b3IiOyB9Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5PZ2dFeHRyYWN0b3IoKTsKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgc3RydWN0IE9nZ1NvdXJjZTsKLQotICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwotICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7Ci0KLSAgICBNeU9nZ0V4dHJhY3RvciAqbUltcGw7Ci0KLSAgICBPZ2dFeHRyYWN0b3IoY29uc3QgT2dnRXh0cmFjdG9yICYpOwotICAgIE9nZ0V4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE9nZ0V4dHJhY3RvciAmKTsKLX07Ci0KLWJvb2wgU25pZmZPZ2coCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgc3A8QU1lc3NhZ2U+ICopOwotCi12b2lkIHBhcnNlVm9yYmlzQ29tbWVudCgKLSAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZmaWxlTWV0YSwgY29uc3QgY2hhciAqY29tbWVudCwgc2l6ZV90IGNvbW1lbnRMZW5ndGgpOwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE9HR19FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT214Tm9kZU93bmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09teE5vZGVPd25lci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGVjN2Y3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT214Tm9kZU93bmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBPTVhfTk9ERV9PV05FUl9IXwotCi0jZGVmaW5lIE9NWF9OT0RFX09XTkVSX0hfCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IE9NWE5vZGVJbnN0YW5jZTsKLQotLyoqCi0gKiBUaGlzIHN0cnVjdCBpcyBuZWVkZWQgdG8gc2VwYXJhdGUgT01YIGZyb20gT01YTm9kZUluc3RhbmNlLgotICoKLSAqIFRPRE86IFRoaXMgbWlnaHQgbm90IGJlIG5lZWRlZCBhZnRlciBUcmVibGUgdHJhbnNpdGlvbiBpcyBjb21wbGV0ZS4KLSAqLwotc3RydWN0IE9teE5vZGVPd25lciB7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBmcmVlTm9kZShjb25zdCBzcDxPTVhOb2RlSW5zdGFuY2U+ICZpbnN0YW5jZSkgPSAwOwotICAgIHZpcnR1YWwgfk9teE5vZGVPd25lcigpIHt9Ci19OwotCi19Ci0KLSNlbmRpZiAgLy8gT01YX05PREVfT1dORVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU0RQTG9hZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NEUExvYWRlci5oCmluZGV4IDJjNGY1NDMuLmI5MDFjOTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU0RQTG9hZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TRFBMb2FkZXIuaApAQCAtMjUsNyArMjUsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgSFRUUEJhc2U7Ci1zdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CitzdHJ1Y3QgTWVkaWFIVFRQU2VydmljZTsKIAogc3RydWN0IFNEUExvYWRlciA6IHB1YmxpYyBBSGFuZGxlciB7CiAgICAgZW51bSBGbGFncyB7CkBAIC0zOCw3ICszOCw3IEBACiAgICAgU0RQTG9hZGVyKAogICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCiAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKLSAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UpOworICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKTsKIAogICAgIHZvaWQgbG9hZChjb25zdCBjaGFyKiB1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TYW1wbGVUYWJsZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TYW1wbGVUYWJsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjFhNjc0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2FtcGxlVGFibGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBTQU1QTEVfVEFCTEVfSF8KLQotI2RlZmluZSBTQU1QTEVfVEFCTEVfSF8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERhdGFTb3VyY2U7Ci1zdHJ1Y3QgU2FtcGxlSXRlcmF0b3I7Ci0KLWNsYXNzIFNhbXBsZVRhYmxlIDogcHVibGljIFJlZkJhc2UgewotcHVibGljOgotICAgIGV4cGxpY2l0IFNhbXBsZVRhYmxlKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpOwotCi0gICAgYm9vbCBpc1ZhbGlkKCkgY29uc3Q7Ci0KLSAgICAvLyB0eXBlIGNhbiBiZSAnc3Rjbycgb3IgJ2NvNjQnLgotICAgIHN0YXR1c190IHNldENodW5rT2Zmc2V0UGFyYW1zKAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgb2ZmNjRfdCBkYXRhX29mZnNldCwgc2l6ZV90IGRhdGFfc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBzZXRTYW1wbGVUb0NodW5rUGFyYW1zKG9mZjY0X3QgZGF0YV9vZmZzZXQsIHNpemVfdCBkYXRhX3NpemUpOwotCi0gICAgLy8gdHlwZSBjYW4gYmUgJ3N0c3onIG9yICdzdHoyJy4KLSAgICBzdGF0dXNfdCBzZXRTYW1wbGVTaXplUGFyYW1zKAotICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgb2ZmNjRfdCBkYXRhX29mZnNldCwgc2l6ZV90IGRhdGFfc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBzZXRUaW1lVG9TYW1wbGVQYXJhbXMob2ZmNjRfdCBkYXRhX29mZnNldCwgc2l6ZV90IGRhdGFfc2l6ZSk7Ci0KLSAgICBzdGF0dXNfdCBzZXRDb21wb3NpdGlvblRpbWVUb1NhbXBsZVBhcmFtcygKLSAgICAgICAgICAgIG9mZjY0X3QgZGF0YV9vZmZzZXQsIHNpemVfdCBkYXRhX3NpemUpOwotCi0gICAgc3RhdHVzX3Qgc2V0U3luY1NhbXBsZVBhcmFtcyhvZmY2NF90IGRhdGFfb2Zmc2V0LCBzaXplX3QgZGF0YV9zaXplKTsKLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIHVpbnQzMl90IGNvdW50Q2h1bmtPZmZzZXRzKCkgY29uc3Q7Ci0KLSAgICB1aW50MzJfdCBjb3VudFNhbXBsZXMoKSBjb25zdDsKLQotICAgIHN0YXR1c190IGdldE1heFNhbXBsZVNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIHN0YXR1c190IGdldE1ldGFEYXRhRm9yU2FtcGxlKAotICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXgsCi0gICAgICAgICAgICBvZmY2NF90ICpvZmZzZXQsCi0gICAgICAgICAgICBzaXplX3QgKnNpemUsCi0gICAgICAgICAgICB1aW50MzJfdCAqY29tcG9zaXRpb25UaW1lLAotICAgICAgICAgICAgYm9vbCAqaXNTeW5jU2FtcGxlID0gTlVMTCwKLSAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVEdXJhdGlvbiA9IE5VTEwpOwotCi0gICAgZW51bSB7Ci0gICAgICAgIGtGbGFnQmVmb3JlLAotICAgICAgICBrRmxhZ0FmdGVyLAotICAgICAgICBrRmxhZ0Nsb3Nlc3QKLSAgICB9OwotICAgIHN0YXR1c190IGZpbmRTYW1wbGVBdFRpbWUoCi0gICAgICAgICAgICB1aW50NjRfdCByZXFfdGltZSwgdWludDY0X3Qgc2NhbGVfbnVtLCB1aW50NjRfdCBzY2FsZV9kZW4sCi0gICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlX2luZGV4LCB1aW50MzJfdCBmbGFncyk7Ci0KLSAgICBzdGF0dXNfdCBmaW5kU3luY1NhbXBsZU5lYXIoCi0gICAgICAgICAgICB1aW50MzJfdCBzdGFydF9zYW1wbGVfaW5kZXgsIHVpbnQzMl90ICpzYW1wbGVfaW5kZXgsCi0gICAgICAgICAgICB1aW50MzJfdCBmbGFncyk7Ci0KLSAgICBzdGF0dXNfdCBmaW5kVGh1bWJuYWlsU2FtcGxlKHVpbnQzMl90ICpzYW1wbGVfaW5kZXgpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgflNhbXBsZVRhYmxlKCk7Ci0KLXByaXZhdGU6Ci0gICAgc3RydWN0IENvbXBvc2l0aW9uRGVsdGFMb29rdXA7Ci0KLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga0NodW5rT2Zmc2V0VHlwZTMyOwotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrQ2h1bmtPZmZzZXRUeXBlNjQ7Ci0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtTYW1wbGVTaXplVHlwZTMyOwotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrU2FtcGxlU2l6ZVR5cGVDb21wYWN0OwotCi0gICAgLy8gTGltaXQgdGhlIHRvdGFsIHNpemUgb2YgYWxsIGludGVybmFsIHRhYmxlcyB0byAyMDBNaUIuCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4VG90YWxTaXplID0gMjAwICogKDEgPDwgMjApOwotCi0gICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7Ci0gICAgTXV0ZXggbUxvY2s7Ci0KLSAgICBvZmY2NF90IG1DaHVua09mZnNldE9mZnNldDsKLSAgICB1aW50MzJfdCBtQ2h1bmtPZmZzZXRUeXBlOwotICAgIHVpbnQzMl90IG1OdW1DaHVua09mZnNldHM7Ci0KLSAgICBvZmY2NF90IG1TYW1wbGVUb0NodW5rT2Zmc2V0OwotICAgIHVpbnQzMl90IG1OdW1TYW1wbGVUb0NodW5rT2Zmc2V0czsKLQotICAgIG9mZjY0X3QgbVNhbXBsZVNpemVPZmZzZXQ7Ci0gICAgdWludDMyX3QgbVNhbXBsZVNpemVGaWVsZFNpemU7Ci0gICAgdWludDMyX3QgbURlZmF1bHRTYW1wbGVTaXplOwotICAgIHVpbnQzMl90IG1OdW1TYW1wbGVTaXplczsKLQotICAgIGJvb2wgbUhhc1RpbWVUb1NhbXBsZTsKLSAgICB1aW50MzJfdCBtVGltZVRvU2FtcGxlQ291bnQ7Ci0gICAgdWludDMyX3QqIG1UaW1lVG9TYW1wbGU7Ci0KLSAgICBzdHJ1Y3QgU2FtcGxlVGltZUVudHJ5IHsKLSAgICAgICAgdWludDMyX3QgbVNhbXBsZUluZGV4OwotICAgICAgICB1aW50MzJfdCBtQ29tcG9zaXRpb25UaW1lOwotICAgIH07Ci0gICAgU2FtcGxlVGltZUVudHJ5ICptU2FtcGxlVGltZUVudHJpZXM7Ci0KLSAgICBpbnQzMl90ICptQ29tcG9zaXRpb25UaW1lRGVsdGFFbnRyaWVzOwotICAgIHNpemVfdCBtTnVtQ29tcG9zaXRpb25UaW1lRGVsdGFFbnRyaWVzOwotICAgIENvbXBvc2l0aW9uRGVsdGFMb29rdXAgKm1Db21wb3NpdGlvbkRlbHRhTG9va3VwOwotCi0gICAgb2ZmNjRfdCBtU3luY1NhbXBsZU9mZnNldDsKLSAgICB1aW50MzJfdCBtTnVtU3luY1NhbXBsZXM7Ci0gICAgdWludDMyX3QgKm1TeW5jU2FtcGxlczsKLSAgICBzaXplX3QgbUxhc3RTeW5jU2FtcGxlSW5kZXg7Ci0KLSAgICBTYW1wbGVJdGVyYXRvciAqbVNhbXBsZUl0ZXJhdG9yOwotCi0gICAgc3RydWN0IFNhbXBsZVRvQ2h1bmtFbnRyeSB7Ci0gICAgICAgIHVpbnQzMl90IHN0YXJ0Q2h1bms7Ci0gICAgICAgIHVpbnQzMl90IHNhbXBsZXNQZXJDaHVuazsKLSAgICAgICAgdWludDMyX3QgY2h1bmtEZXNjOwotICAgIH07Ci0gICAgU2FtcGxlVG9DaHVua0VudHJ5ICptU2FtcGxlVG9DaHVua0VudHJpZXM7Ci0KLSAgICAvLyBBcHByb3hpbWF0ZSBzaXplIG9mIGFsbCB0YWJsZXMgY29tYmluZWQuCi0gICAgdWludDY0X3QgbVRvdGFsU2l6ZTsKLQotICAgIGZyaWVuZCBzdHJ1Y3QgU2FtcGxlSXRlcmF0b3I7Ci0KLSAgICAvLyBub3JtYWxseSB3ZSBkb24ndCByb3VuZAotICAgIGlubGluZSB1aW50NjRfdCBnZXRTYW1wbGVUaW1lKAotICAgICAgICAgICAgc2l6ZV90IHNhbXBsZV9pbmRleCwgdWludDY0X3Qgc2NhbGVfbnVtLCB1aW50NjRfdCBzY2FsZV9kZW4pIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIChzYW1wbGVfaW5kZXggPCAoc2l6ZV90KW1OdW1TYW1wbGVTaXplcyAmJiBtU2FtcGxlVGltZUVudHJpZXMgIT0gTlVMTAotICAgICAgICAgICAgICAgICYmIHNjYWxlX2RlbiAhPSAwKQotICAgICAgICAgICAgICAgID8gKG1TYW1wbGVUaW1lRW50cmllc1tzYW1wbGVfaW5kZXhdLm1Db21wb3NpdGlvblRpbWUgKiBzY2FsZV9udW0pIC8gc2NhbGVfZGVuIDogMDsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBnZXRTYW1wbGVTaXplX2wodWludDMyX3Qgc2FtcGxlX2luZGV4LCBzaXplX3QgKnNhbXBsZV9zaXplKTsKLSAgICBpbnQzMl90IGdldENvbXBvc2l0aW9uVGltZU9mZnNldCh1aW50MzJfdCBzYW1wbGVJbmRleCk7Ci0KLSAgICBzdGF0aWMgaW50IENvbXBhcmVJbmNyZWFzaW5nVGltZShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKik7Ci0KLSAgICB2b2lkIGJ1aWxkU2FtcGxlRW50cmllc1RhYmxlKCk7Ci0KLSAgICBTYW1wbGVUYWJsZShjb25zdCBTYW1wbGVUYWJsZSAmKTsKLSAgICBTYW1wbGVUYWJsZSAmb3BlcmF0b3I9KGNvbnN0IFNhbXBsZVRhYmxlICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBTQU1QTEVfVEFCTEVfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmgKaW5kZXggMjU4NTExYS4uYzI4NjUxNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmgKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GcmFtZVJlbmRlclRyYWNrZXIuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CiAKICNpbmNsdWRlIDxsaXN0PgogCkBAIC0zOCw3ICszOSw3IEBACiAKICAgICBzdGQ6Omxpc3Q8RnJhbWVSZW5kZXJUcmFja2VyOjpJbmZvPiByZW5kZXIoCiAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50NjRfdCBtZWRpYVRpbWVVcywgbnNlY3NfdCByZW5kZXJUaW1lTnMsCi0gICAgICAgICAgICB2b2lkICpwbGF0Zm9ybVByaXZhdGUsIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKKyAgICAgICAgICAgIHNpemVfdCBudW1PdXRwdXRCdWZmZXJzLCBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CiAgICAgdm9pZCBjbGVhclRyYWNrZXIoKTsKIAogcHJpdmF0ZToKQEAgLTU1LDEyICs1NiwxNCBAQAogICAgIGludDMyX3QgbUNyb3BXaWR0aCwgbUNyb3BIZWlnaHQ7CiAgICAgaW50MzJfdCBtUm90YXRpb25EZWdyZWVzOwogICAgIGFuZHJvaWRfZGF0YXNwYWNlIG1EYXRhU3BhY2U7CisgICAgSERSU3RhdGljSW5mbyBtSERSU3RhdGljSW5mbzsKICAgICBGcmFtZVJlbmRlclRyYWNrZXIgbVJlbmRlclRyYWNrZXI7CiAKKyAgICB2b2lkIHJlc2V0Rm9ybWF0SWZDaGFuZ2VkKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIHNpemVfdCBudW1PdXRwdXRCdWZmZXJzKTsKKwogICAgIFNvZnR3YXJlUmVuZGVyZXIoY29uc3QgU29mdHdhcmVSZW5kZXJlciAmKTsKICAgICBTb2Z0d2FyZVJlbmRlcmVyICZvcGVyYXRvcj0oY29uc3QgU29mdHdhcmVSZW5kZXJlciAmKTsKLQotICAgIHZvaWQgcmVzZXRGb3JtYXRJZkNoYW5nZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmgKaW5kZXggMjc3ZWIzZS4uZjc4ZTEyNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmgKQEAgLTI3LDggKzI3LDEwIEBACiAKIGNsYXNzIERhdGFTb3VyY2U7CiBjbGFzcyBNZWRpYUV4dHJhY3RvcjsKK3N0cnVjdCBJbWFnZURlY29kZXI7CitzdHJ1Y3QgRnJhbWVSZWN0OwogCi1zdHJ1Y3QgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlciA6IHB1YmxpYyBNZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlIHsKK3N0cnVjdCBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyIDogcHVibGljIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXJCYXNlIHsKICAgICBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyKCk7CiAgICAgdmlydHVhbCB+U3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcigpOwogCkBAIC00MCw3ICs0MiwxNiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2U+JiBzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpOwogCi0gICAgdmlydHVhbCBWaWRlb0ZyYW1lICpnZXRGcmFtZUF0VGltZShpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbiwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5KTsKKyAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGdldEZyYW1lQXRUaW1lKAorICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24sIGludCBjb2xvckZvcm1hdCwgYm9vbCBtZXRhT25seSk7CisgICAgdmlydHVhbCBzcDxJTWVtb3J5PiBnZXRJbWFnZUF0SW5kZXgoCisgICAgICAgICAgICBpbnQgaW5kZXgsIGludCBjb2xvckZvcm1hdCwgYm9vbCBtZXRhT25seSwgYm9vbCB0aHVtYm5haWwpOworICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gZ2V0SW1hZ2VSZWN0QXRJbmRleCgKKyAgICAgICAgICAgIGludCBpbmRleCwgaW50IGNvbG9yRm9ybWF0LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lQXRJbmRleCgKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNwPElNZW1vcnk+ID4qIGZyYW1lcywKKyAgICAgICAgICAgIGludCBmcmFtZUluZGV4LCBpbnQgbnVtRnJhbWVzLCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHkpOworCiAgICAgdmlydHVhbCBNZWRpYUFsYnVtQXJ0ICpleHRyYWN0QWxidW1BcnQoKTsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmV4dHJhY3RNZXRhZGF0YShpbnQga2V5Q29kZSk7CiAKQEAgLTUyLDEwICs2MywxOCBAQAogICAgIEtleWVkVmVjdG9yPGludCwgU3RyaW5nOD4gbU1ldGFEYXRhOwogICAgIE1lZGlhQWxidW1BcnQgKm1BbGJ1bUFydDsKIAorICAgIHNwPEltYWdlRGVjb2Rlcj4gbUltYWdlRGVjb2RlcjsKKyAgICBpbnQgbUxhc3RJbWFnZUluZGV4OwogICAgIHZvaWQgcGFyc2VNZXRhRGF0YSgpOwogICAgIC8vIERlbGV0ZSBhbGJ1bSBhcnQgYW5kIGNsZWFyIG1ldGFkYXRhLgogICAgIHZvaWQgY2xlYXJNZXRhZGF0YSgpOwogCisgICAgc3RhdHVzX3QgZ2V0RnJhbWVJbnRlcm5hbCgKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzLCBpbnQgbnVtRnJhbWVzLCBpbnQgb3B0aW9uLCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHksCisgICAgICAgICAgICBzcDxJTWVtb3J5Piogb3V0RnJhbWUsIHN0ZDo6dmVjdG9yPHNwPElNZW1vcnk+ID4qIG91dEZyYW1lcyk7CisgICAgdmlydHVhbCBzcDxJTWVtb3J5PiBnZXRJbWFnZUludGVybmFsKAorICAgICAgICAgICAgaW50IGluZGV4LCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHksIGJvb2wgdGh1bWJuYWlsLCBGcmFtZVJlY3QqIHJlY3QpOworCiAgICAgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcihjb25zdCBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyICYpOwogCiAgICAgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlciAmb3BlcmF0b3I9KApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9UaHJvdHRsZWRTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvVGhyb3R0bGVkU291cmNlLmgKaW5kZXggNjczMjY4Yi4uNzFlNjJmNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9UaHJvdHRsZWRTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1Rocm90dGxlZFNvdXJjZS5oCkBAIC0xOCw3ICsxOCw3IEBACiAKICNkZWZpbmUgVEhST1RUTEVEX1NPVVJDRV9IXwogCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTU4LDEwICs1OCw2IEBACiAgICAgICAgIHJldHVybiBtU291cmNlLT5Ecm1Jbml0aWFsaXphdGlvbihtaW1lKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgZ2V0RHJtSW5mbyhzcDxEZWNyeXB0SGFuZGxlPiAmaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KSB7Ci0gICAgICAgIG1Tb3VyY2UtPmdldERybUluZm8oaGFuZGxlLCBjbGllbnQpOwotICAgIH07Ci0KICAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtU291cmNlLT5nZXRNSU1FVHlwZSgpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvVkJSSVNlZWtlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9WQlJJU2Vla2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1N2Q1NzEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9WQlJJU2Vla2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBWQlJJX1NFRUtFUl9IXwotCi0jZGVmaW5lIFZCUklfU0VFS0VSX0hfCi0KLSNpbmNsdWRlICJpbmNsdWRlL01QM1NlZWtlci5oIgotCi0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGF0YVNvdXJjZTsKLQotc3RydWN0IFZCUklTZWVrZXIgOiBwdWJsaWMgTVAzU2Vla2VyIHsKLSAgICBzdGF0aWMgc3A8VkJSSVNlZWtlcj4gQ3JlYXRlRnJvbVNvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIG9mZjY0X3QgcG9zdF9pZDNfcG9zKTsKLQotICAgIHZpcnR1YWwgYm9vbCBnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKTsKLSAgICB2aXJ0dWFsIGJvb2wgZ2V0T2Zmc2V0Rm9yVGltZShpbnQ2NF90ICp0aW1lVXMsIG9mZjY0X3QgKnBvcyk7Ci0KLXByaXZhdGU6Ci0gICAgb2ZmNjRfdCBtQmFzZVBvczsKLSAgICBpbnQ2NF90IG1EdXJhdGlvblVzOwotICAgIFZlY3Rvcjx1aW50MzJfdD4gbVNlZ21lbnRzOwotCi0gICAgVkJSSVNlZWtlcigpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVkJSSVNlZWtlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIFZCUklfU0VFS0VSX0hfCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9XQVZFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvV0FWRXh0cmFjdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYWQ0NDEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9XQVZFeHRyYWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFdBVl9FWFRSQUNUT1JfSF8KLQotI2RlZmluZSBXQVZfRVhUUkFDVE9SX0hfCi0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBBTWVzc2FnZTsKLWNsYXNzIERhdGFTb3VyY2U7Ci1jbGFzcyBTdHJpbmc4OwotCi1jbGFzcyBXQVZFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewotcHVibGljOgotICAgIC8vIEV4dHJhY3RvciBhc3N1bWVzIG93bmVyc2hpcCBvZiAic291cmNlIi4KLSAgICBleHBsaWNpdCBXQVZFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSk7Ci0KLSAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgc3A8SU1lZGlhU291cmNlPiBnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldFRyYWNrTWV0YURhdGEoc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7Ci0KLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRNZXRhRGF0YSgpOwotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiV0FWRXh0cmFjdG9yIjsgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+V0FWRXh0cmFjdG9yKCk7Ci0KLXByaXZhdGU6Ci0gICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7Ci0gICAgc3RhdHVzX3QgbUluaXRDaGVjazsKLSAgICBib29sIG1WYWxpZEZvcm1hdDsKLSAgICB1aW50MTZfdCBtV2F2ZUZvcm1hdDsKLSAgICB1aW50MTZfdCBtTnVtQ2hhbm5lbHM7Ci0gICAgdWludDMyX3QgbUNoYW5uZWxNYXNrOwotICAgIHVpbnQzMl90IG1TYW1wbGVSYXRlOwotICAgIHVpbnQxNl90IG1CaXRzUGVyU2FtcGxlOwotICAgIG9mZjY0X3QgbURhdGFPZmZzZXQ7Ci0gICAgc2l6ZV90IG1EYXRhU2l6ZTsKLSAgICBzcDxNZXRhRGF0YT4gbVRyYWNrTWV0YTsKLQotICAgIHN0YXR1c190IGluaXQoKTsKLQotICAgIFdBVkV4dHJhY3Rvcihjb25zdCBXQVZFeHRyYWN0b3IgJik7Ci0gICAgV0FWRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgV0FWRXh0cmFjdG9yICYpOwotfTsKLQotYm9vbCBTbmlmZldBVigKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICBzcDxBTWVzc2FnZT4gKik7Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gV0FWX0VYVFJBQ1RPUl9IXwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1hJTkdTZWVrZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvWElOR1NlZWtlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2UwNGYwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvWElOR1NlZWtlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgWElOR19TRUVLRVJfSF8KLQotI2RlZmluZSBYSU5HX1NFRUtFUl9IXwotCi0jaW5jbHVkZSAiaW5jbHVkZS9NUDNTZWVrZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEYXRhU291cmNlOwotCi1zdHJ1Y3QgWElOR1NlZWtlciA6IHB1YmxpYyBNUDNTZWVrZXIgewotICAgIHN0YXRpYyBzcDxYSU5HU2Vla2VyPiBDcmVhdGVGcm9tU291cmNlKAotICAgICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgb2ZmNjRfdCBmaXJzdF9mcmFtZV9wb3MpOwotCi0gICAgdmlydHVhbCBib29sIGdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpOwotICAgIHZpcnR1YWwgYm9vbCBnZXRPZmZzZXRGb3JUaW1lKGludDY0X3QgKnRpbWVVcywgb2ZmNjRfdCAqcG9zKTsKLQotICAgIHZpcnR1YWwgaW50MzJfdCBnZXRFbmNvZGVyRGVsYXkoKTsKLSAgICB2aXJ0dWFsIGludDMyX3QgZ2V0RW5jb2RlclBhZGRpbmcoKTsKLQotcHJpdmF0ZToKLSAgICBpbnQ2NF90IG1GaXJzdEZyYW1lUG9zOwotICAgIGludDY0X3QgbUR1cmF0aW9uVXM7Ci0gICAgaW50MzJfdCBtU2l6ZUJ5dGVzOwotICAgIGludDMyX3QgbUVuY29kZXJEZWxheTsKLSAgICBpbnQzMl90IG1FbmNvZGVyUGFkZGluZzsKLQotICAgIC8vIFRPQyBlbnRyaWVzIGluIFhJTkcgaGVhZGVyLiBTa2lwIHRoZSBmaXJzdCBvbmUgc2luY2UgaXQncyBhbHdheXMgMC4KLSAgICB1bnNpZ25lZCBjaGFyIG1UT0NbOTldOwotICAgIGJvb2wgbVRPQ1ZhbGlkOwotCi0gICAgWElOR1NlZWtlcigpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoWElOR1NlZWtlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIFhJTkdfU0VFS0VSX0hfCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvYXZjX3V0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL2F2Y191dGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDU5MDZhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvYXZjX3V0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQVZDX1VUSUxTX0hfCi0KLSNkZWZpbmUgQVZDX1VUSUxTX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgQUJpdFJlYWRlcjsKLQotZW51bSB7Ci0gICAga0FWQ1Byb2ZpbGVCYXNlbGluZSAgICAgID0gMHg0MiwKLSAgICBrQVZDUHJvZmlsZU1haW4gICAgICAgICAgPSAweDRkLAotICAgIGtBVkNQcm9maWxlRXh0ZW5kZWQgICAgICA9IDB4NTgsCi0gICAga0FWQ1Byb2ZpbGVIaWdoICAgICAgICAgID0gMHg2NCwKLSAgICBrQVZDUHJvZmlsZUhpZ2gxMCAgICAgICAgPSAweDZlLAotICAgIGtBVkNQcm9maWxlSGlnaDQyMiAgICAgICA9IDB4N2EsCi0gICAga0FWQ1Byb2ZpbGVIaWdoNDQ0ICAgICAgID0gMHhmNCwKLSAgICBrQVZDUHJvZmlsZUNBVkxDNDQ0SW50cmEgPSAweDJjCi19OwotCi1zdHJ1Y3QgTkFMUG9zaXRpb24gewotICAgIHVpbnQzMl90IG5hbE9mZnNldDsKLSAgICB1aW50MzJfdCBuYWxTaXplOwotfTsKLQotLy8gT3B0aW9uYWxseSByZXR1cm5zIHNhbXBsZSBhc3BlY3QgcmF0aW8gYXMgd2VsbC4KLXZvaWQgRmluZEFWQ0RpbWVuc2lvbnMoCi0gICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZzZXFQYXJhbVNldCwKLSAgICAgICAgaW50MzJfdCAqd2lkdGgsIGludDMyX3QgKmhlaWdodCwKLSAgICAgICAgaW50MzJfdCAqc2FyV2lkdGggPSBOVUxMLCBpbnQzMl90ICpzYXJIZWlnaHQgPSBOVUxMKTsKLQotLy8gR2V0cyBhbmQgcmV0dXJucyBhbiB1bnNpZ25lZCBleHAtZ29sb21iICh1ZSkgdmFsdWUgZnJvbSBhIGJpdCByZWFkZXIgfGJyfC4gQWJvcnRzIGlmIHRoZSB2YWx1ZQotLy8gaXMgbW9yZSB0aGFuIDY0IGJpdHMgbG9uZyAoPj0weEZGRkYgKCEpKSBvciB0aGUgYml0IHJlYWRlciBvdmVyZmxvd3MuCi11bnNpZ25lZCBwYXJzZVVFKEFCaXRSZWFkZXIgKmJyKTsKLQotLy8gR2V0cyBhbmQgcmV0dXJucyBhIHNpZ25lZCBleHAtZ29sb21iIChzZSkgdmFsdWUgZnJvbSBhIGJpdCByZWFkZXIgfGJyfC4gQWJvcnRzIGlmIHRoZSB2YWx1ZSBpcwotLy8gbW9yZSB0aGFuIDY0IGJpdHMgbG9uZyAoPjB4N0ZGRiB8fCA8LTB4N0ZGRiAoISkpIG9yIHRoZSBiaXQgcmVhZGVyIG92ZXJmbG93cy4KLXNpZ25lZCBwYXJzZVNFKEFCaXRSZWFkZXIgKmJyKTsKLQotLy8gR2V0cyBhbiB1bnNpZ25lZCBleHAtZ29sb21iICh1ZSkgdmFsdWUgZnJvbSBhIGJpdCByZWFkZXIgfGJyfCwgYW5kIHJldHVybnMgaXQgaWYgaXQgd2FzCi0vLyBzdWNjZXNzZnVsLiBSZXR1cm5zIHxmYWxsYmFja3wgaWYgaXQgd2FzIHVuc3VjY2Vzc2Z1bC4gTm90ZTogaWYgdGhlIHZhbHVlIHdhcyBsb25nZXIgdGhhdCA2NAotLy8gYml0cywgaXQgcmVhZHMgcGFzdCB0aGUgdmFsdWUgYW5kIHN0aWxsIHJldHVybnMgfGZhbGxiYWNrfC4KLXVuc2lnbmVkIHBhcnNlVUVXaXRoRmFsbGJhY2soQUJpdFJlYWRlciAqYnIsIHVuc2lnbmVkIGZhbGxiYWNrKTsKLQotLy8gR2V0cyBhIHNpZ25lZCBleHAtZ29sb21iIChzZSkgdmFsdWUgZnJvbSBhIGJpdCByZWFkZXIgfGJyfCwgYW5kIHJldHVybnMgaXQgaWYgaXQgd2FzIHN1Y2Nlc3NmdWwuCi0vLyBSZXR1cm5zIHxmYWxsYmFja3wgaWYgaXQgd2FzIHVuc3VjY2Vzc2Z1bC4gTm90ZTogaWYgdGhlIHZhbHVlIHdhcyBsb25nZXIgdGhhdCA2NCBiaXRzLCBpdCByZWFkcwotLy8gcGFzdCB0aGUgdmFsdWUgYW5kIHN0aWxsIHJldHVybnMgfGZhbGxiYWNrfC4KLXNpZ25lZCBwYXJzZVNFV2l0aEZhbGxiYWNrKEFCaXRSZWFkZXIgKmJyLCBzaWduZWQgZmFsbGJhY2spOwotCi0vLyBTa2lwcyBhbiB1bnNpZ25lZCBleHAtZ29sb21iICh1ZSkgdmFsdWUgZnJvbSBiaXQgcmVhZGVyIHxicnwuCi1pbmxpbmUgdm9pZCBza2lwVUUoQUJpdFJlYWRlciAqYnIpIHsKLSAgICAodm9pZClwYXJzZVVFV2l0aEZhbGxiYWNrKGJyLCAwVSk7Ci19Ci0KLS8vIFNraXBzIGEgc2lnbmVkIGV4cC1nb2xvbWIgKHNlKSB2YWx1ZSBmcm9tIGJpdCByZWFkZXIgfGJyfC4KLWlubGluZSB2b2lkIHNraXBTRShBQml0UmVhZGVyICpicikgewotICAgICh2b2lkKXBhcnNlU0VXaXRoRmFsbGJhY2soYnIsIDApOwotfQotCi1zdGF0dXNfdCBnZXROZXh0TkFMVW5pdCgKLSAgICAgICAgY29uc3QgdWludDhfdCAqKl9kYXRhLCBzaXplX3QgKl9zaXplLAotICAgICAgICBjb25zdCB1aW50OF90ICoqbmFsU3RhcnQsIHNpemVfdCAqbmFsU2l6ZSwKLSAgICAgICAgYm9vbCBzdGFydENvZGVGb2xsb3dzID0gZmFsc2UpOwotCi1jbGFzcyBNZXRhRGF0YTsKLXNwPE1ldGFEYXRhPiBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpOwotCi1ib29sIElzSURSKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KTsKLWJvb2wgSXNJRFIoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmFjY2Vzc1VuaXQpOwotYm9vbCBJc0FWQ1JlZmVyZW5jZUZyYW1lKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KTsKLXVpbnQzMl90IEZpbmRBVkNMYXllcklkKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKLQotY29uc3QgY2hhciAqQVZDUHJvZmlsZVRvU3RyaW5nKHVpbnQ4X3QgcHJvZmlsZSk7Ci0KLXNwPE1ldGFEYXRhPiBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoCi0gICAgICAgIHVuc2lnbmVkIHByb2ZpbGUsIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXgsCi0gICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbik7Ci0KLS8vIEdpdmVuIGFuIE1QRUc0IHZpZGVvIFZPTC1oZWFkZXIgY2h1bmsgKHN0YXJ0aW5nIHdpdGggMHgwMCAweDAwIDB4MDEgMHgyPykKLS8vIHBhcnNlIGl0IGFuZCBmaWxsIGluIGRpbWVuc2lvbnMsIHJldHVybnMgdHJ1ZSBpZmYgc3VjY2Vzc2Z1bC4KLWJvb2wgRXh0cmFjdERpbWVuc2lvbnNGcm9tVk9MSGVhZGVyKAotICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50MzJfdCAqd2lkdGgsIGludDMyX3QgKmhlaWdodCk7Ci0KLWJvb2wgR2V0TVBFR0F1ZGlvRnJhbWVTaXplKAotICAgICAgICB1aW50MzJfdCBoZWFkZXIsIHNpemVfdCAqZnJhbWVfc2l6ZSwKLSAgICAgICAgaW50ICpvdXRfc2FtcGxpbmdfcmF0ZSA9IE5VTEwsIGludCAqb3V0X2NoYW5uZWxzID0gTlVMTCwKLSAgICAgICAgaW50ICpvdXRfYml0cmF0ZSA9IE5VTEwsIGludCAqb3V0X251bV9zYW1wbGVzID0gTlVMTCk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQVZDX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FBQ1dyaXRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQUNXcml0ZXIuaAppbmRleCBhMWY2M2Q3Li43YzYzZGRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FBQ1dyaXRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmgKQEAgLTI0LDE0ICsyNCwxMyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgTWVkaWFTb3VyY2U7Ci1jbGFzcyBNZXRhRGF0YTsKIAogc3RydWN0IEFBQ1dyaXRlciA6IHB1YmxpYyBNZWRpYVdyaXRlciB7CiAgICAgQUFDV3JpdGVyKGludCBmZCk7CiAKICAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlKGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpOwogICAgIHZpcnR1YWwgYm9vbCByZWFjaGVkRU9TKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgeyByZXR1cm4gcmVzZXQoKTsgfQpAQCAtNDgsNyArNDcsNyBAQAogCiAgICAgaW50ICAgbUZkOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7Ci0gICAgc3A8SU1lZGlhU291cmNlPiBtU291cmNlOworICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOwogICAgIGJvb2wgbVN0YXJ0ZWQ7CiAgICAgdm9sYXRpbGUgYm9vbCBtUGF1c2VkOwogICAgIHZvbGF0aWxlIGJvb2wgbVJlc3VtZWQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaAppbmRleCA0MjQyNDZkLi45N2QxNWE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKQEAgLTk1LDExICs5NSw2IEBACiAKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0T01YQ2hhbm5lbE1hcHBpbmcoc2l6ZV90IG51bUNoYW5uZWxzLCBPTVhfQVVESU9fQ0hBTk5FTFRZUEUgbWFwW10pOwogCi0gICAgLy8gU2F2ZSB0aGUgZmxhZy4KLSAgICB2b2lkIHNldFRyZWJsZUZsYWcoYm9vbCB0cmVibGVGbGFnKTsKLSAgICAvLyBSZXR1cm4gdGhlIHNhdmVkIGZsYWcuCi0gICAgYm9vbCBnZXRUcmVibGVGbGFnKCkgY29uc3Q7Ci0KIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BQ29kZWMoKTsKIApAQCAtMjMzLDE1ICsyMjgsMTQgQEAKICAgICBzcDxJT01YPiBtT01YOwogICAgIHNwPElPTVhOb2RlPiBtT01YTm9kZTsKICAgICBpbnQzMl90IG1Ob2RlR2VuZXJhdGlvbjsKLSAgICBib29sIG1UcmVibGVGbGFnOwogICAgIHNwPFRBbGxvY2F0b3I+IG1BbGxvY2F0b3JbMl07Ci0gICAgc3A8TWVtb3J5RGVhbGVyPiBtRGVhbGVyWzJdOwogCiAgICAgYm9vbCBtVXNpbmdOYXRpdmVXaW5kb3c7CiAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gbU5hdGl2ZVdpbmRvdzsKICAgICBpbnQgbU5hdGl2ZVdpbmRvd1VzYWdlQml0czsKICAgICBhbmRyb2lkX25hdGl2ZV9yZWN0X3QgbUxhc3ROYXRpdmVXaW5kb3dDcm9wOwogICAgIGludDMyX3QgbUxhc3ROYXRpdmVXaW5kb3dEYXRhU3BhY2U7CisgICAgSERSU3RhdGljSW5mbyBtTGFzdEhEUlN0YXRpY0luZm87CiAgICAgc3A8QU1lc3NhZ2U+IG1Db25maWdGb3JtYXQ7CiAgICAgc3A8QU1lc3NhZ2U+IG1JbnB1dEZvcm1hdDsKICAgICBzcDxBTWVzc2FnZT4gbU91dHB1dEZvcm1hdDsKQEAgLTI1OSw2ICsyNTMsNyBAQAogCiAgICAgc3A8QU1lc3NhZ2U+IG1MYXN0T3V0cHV0Rm9ybWF0OwogICAgIGJvb2wgbUlzVmlkZW87CisgICAgYm9vbCBtSXNJbWFnZTsKICAgICBib29sIG1Jc0VuY29kZXI7CiAgICAgYm9vbCBtRmF0YWxFcnJvcjsKICAgICBib29sIG1TaHV0ZG93bkluUHJvZ3Jlc3M7CkBAIC00NTEsNiArNDQ2LDcgQEAKICAgICAgICAgaW50MzJfdCBoZWF2eUNvbXByZXNzaW9uOwogICAgICAgICBpbnQzMl90IHRhcmdldFJlZkxldmVsOwogICAgICAgICBpbnQzMl90IGVuY29kZWRUYXJnZXRMZXZlbDsKKyAgICAgICAgaW50MzJfdCBlZmZlY3RUeXBlOwogICAgIH0gZHJjUGFyYW1zX3Q7CiAKICAgICBzdGF0dXNfdCBzZXR1cEFBQ0NvZGVjKApAQCAtNDk1LDEzICs0OTEsMTUgQEAKICAgICBzdGF0dXNfdCBzZXR1cE1QRUc0RW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHN0YXR1c190IHNldHVwSDI2M0VuY29kZXJQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICBzdGF0dXNfdCBzZXR1cEFWQ0VuY29kZXJQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLSAgICBzdGF0dXNfdCBzZXR1cEhFVkNFbmNvZGVyUGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgc3RhdHVzX3Qgc2V0dXBIRVZDRW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0KTsKICAgICBzdGF0dXNfdCBzZXR1cFZQWEVuY29kZXJQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCk7CiAKLSAgICBzdGF0dXNfdCB2ZXJpZnlTdXBwb3J0Rm9yUHJvZmlsZUFuZExldmVsKGludDMyX3QgcHJvZmlsZSwgaW50MzJfdCBsZXZlbCk7CisgICAgc3RhdHVzX3QgdmVyaWZ5U3VwcG9ydEZvclByb2ZpbGVBbmRMZXZlbCgKKyAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBpbnQzMl90IHByb2ZpbGUsIGludDMyX3QgbGV2ZWwpOwogCisgICAgc3RhdHVzX3QgY29uZmlndXJlSW1hZ2VHcmlkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCk7CiAgICAgc3RhdHVzX3QgY29uZmlndXJlQml0cmF0ZSgKLSAgICAgICAgICAgIGludDMyX3QgYml0cmF0ZSwgT01YX1ZJREVPX0NPTlRST0xSQVRFVFlQRSBiaXRyYXRlTW9kZSk7CisgICAgICAgICAgICBPTVhfVklERU9fQ09OVFJPTFJBVEVUWVBFIGJpdHJhdGVNb2RlLCBpbnQzMl90IGJpdHJhdGUsIGludDMyX3QgcXVhbGl0eSA9IDApOwogICAgIHZvaWQgY29uZmlndXJlRW5jb2RlckxhdGVuY3koY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCiAgICAgc3RhdHVzX3Qgc2V0dXBFcnJvckNvcnJlY3Rpb25QYXJhbWV0ZXJzKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FNUldyaXRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BTVJXcml0ZXIuaAppbmRleCBmYmJkZjJlLi4yZWEyZjc4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FNUldyaXRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmgKQEAgLTIwLDIwICsyMCwxNyBAQAogCiAjaW5jbHVkZSA8c3RkaW8uaD4KIAotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhV3JpdGVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIE1ldGFEYXRhOwotCiBzdHJ1Y3QgQU1SV3JpdGVyIDogcHVibGljIE1lZGlhV3JpdGVyIHsKICAgICBBTVJXcml0ZXIoaW50IGZkKTsKIAogICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTb3VyY2UoY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CiAgICAgdmlydHVhbCBib29sIHJlYWNoZWRFT1MoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSB7IHJldHVybiByZXNldCgpOyB9CkBAIC00NSw3ICs0Miw3IEBACiBwcml2YXRlOgogICAgIGludCAgIG1GZDsKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwotICAgIHNwPElNZWRpYVNvdXJjZT4gbVNvdXJjZTsKKyAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKICAgICBib29sIG1TdGFydGVkOwogICAgIHZvbGF0aWxlIGJvb2wgbVBhdXNlZDsKICAgICB2b2xhdGlsZSBib29sIG1SZXN1bWVkOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oCmluZGV4IGY3NDk5YjYuLjdjMmMzNmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmgKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2RlZmluZSBBVURJT19QTEFZRVJfSF8KIAotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KQEAgLTUwLDcgKzUwLDcgQEAKICAgICB2aXJ0dWFsIH5BdWRpb1BsYXllcigpOwogCiAgICAgLy8gQ2FsbGVyIHJldGFpbnMgb3duZXJzaGlwIG9mICJzb3VyY2UiLgotICAgIHZvaWQgc2V0U291cmNlKGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CisgICAgdm9pZCBzZXRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpOwogCiAgICAgc3RhdHVzX3Qgc3RhcnQoYm9vbCBzb3VyY2VBbHJlYWR5U3RhcnRlZCA9IGZhbHNlKTsKIApAQCAtNjYsMTAgKzY2LDEwIEBACiAgICAgc3RhdHVzX3QgZ2V0UGxheWJhY2tSYXRlKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlIC8qIG5vbm51bGwgKi8pOwogCiBwcml2YXRlOgotICAgIHNwPElNZWRpYVNvdXJjZT4gbVNvdXJjZTsKKyAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKICAgICBzcDxBdWRpb1RyYWNrPiBtQXVkaW9UcmFjazsKIAotICAgIE1lZGlhQnVmZmVyICptSW5wdXRCdWZmZXI7CisgICAgTWVkaWFCdWZmZXJCYXNlICptSW5wdXRCdWZmZXI7CiAKICAgICBpbnQgbVNhbXBsZVJhdGU7CiAgICAgaW50NjRfdCBtTGF0ZW5jeVVzOwpAQCAtOTEsNyArOTEsNyBAQAogCiAgICAgYm9vbCBtSXNGaXJzdEJ1ZmZlcjsKICAgICBzdGF0dXNfdCBtRmlyc3RCdWZmZXJSZXN1bHQ7Ci0gICAgTWVkaWFCdWZmZXIgKm1GaXJzdEJ1ZmZlcjsKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKm1GaXJzdEJ1ZmZlcjsKIAogICAgIHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiBtQXVkaW9TaW5rOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmgKaW5kZXggMTU5NWJlNC4uMjA2ZDMyMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaApAQCAtMjAsMTIgKzIwLDE1IEBACiAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1JlY29yZC5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01pY3JvcGhvbmVJbmZvLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAorI2luY2x1ZGUgPHZlY3Rvcj4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBBdWRpb1JlY29yZDsKQEAgLTQwLDcgKzQzLDggQEAKICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxzLAogICAgICAgICAgICAgdWludDMyX3Qgb3V0U2FtcGxlUmF0ZSA9IDAsCiAgICAgICAgICAgICB1aWRfdCB1aWQgPSAtMSwKLSAgICAgICAgICAgIHBpZF90IHBpZCA9IC0xKTsKKyAgICAgICAgICAgIHBpZF90IHBpZCA9IC0xLAorICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CiAKICAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKIApAQCAtNTIsMTEgKzU2LDE5IEBACiAgICAgaW50MTZfdCBnZXRNYXhBbXBsaXR1ZGUoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RvcFRpbWVVcyhpbnQ2NF90IHN0b3BUaW1lVXMpOwogCiAgICAgc3RhdHVzX3QgZGF0YUNhbGxiYWNrKGNvbnN0IEF1ZGlvUmVjb3JkOjpCdWZmZXImIGJ1ZmZlcik7Ci0gICAgdmlydHVhbCB2b2lkIHNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyICpidWZmZXIpOworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7CisKKyAgICBzdGF0dXNfdCBzZXRJbnB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKKyAgICBzdGF0dXNfdCBnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCk7CisgICAgc3RhdHVzX3QgYWRkQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKTsKKyAgICBzdGF0dXNfdCByZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spOworCisgICAgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpOworCiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BdWRpb1NvdXJjZSgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYWxsYmFja01lZGlhU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbGxiYWNrTWVkaWFTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzQ1M2ZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYWxsYmFja01lZGlhU291cmNlLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDQUxMQkFDS19NRURJQV9TT1VSQ0VfSF8KKyNkZWZpbmUgQ0FMTEJBQ0tfTUVESUFfU09VUkNFX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJTWVkaWFTb3VyY2U7CisKKy8vIEEgc3RhZ2VmcmlnaHQgTWVkaWFTb3VyY2UgdGhhdCB3cmFwcyBhIGJpbmRlciBJTWVkaWFTb3VyY2UuCitjbGFzcyBDYWxsYmFja01lZGlhU291cmNlIDogcHVibGljIE1lZGlhU291cmNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBDYWxsYmFja01lZGlhU291cmNlKGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CisgICAgdmlydHVhbCB+Q2FsbGJhY2tNZWRpYVNvdXJjZSgpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CisKK3ByaXZhdGU6CisgICAgc3A8SU1lZGlhU291cmNlPiBtU291cmNlOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ2FsbGJhY2tNZWRpYVNvdXJjZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENBTExCQUNLX01FRElBX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmgKaW5kZXggZDYxNDljMC4uNDc1OTc2YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oCkBAIC0xOSw4ICsxOSw4IEBACiAjZGVmaW5lIENBTUVSQV9TT1VSQ0VfSF8KIAogI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPGNhbWVyYS9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmEuaD4KICNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYVJlY29yZGluZ1Byb3h5Lmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyLmg+CkBAIC05Nyw3ICs5Nyw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgeyByZXR1cm4gcmVzZXQoKTsgfQogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RvcFRpbWVVcyhpbnQ2NF90IHN0b3BUaW1lVXMpOwogCiAgICAgLyoqCkBAIC0xMjcsNyArMTI3LDcgQEAKICAgICAgKi8KICAgICBNZXRhZGF0YUJ1ZmZlclR5cGUgbWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycygpIGNvbnN0OwogCi0gICAgdmlydHVhbCB2b2lkIHNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyKiBidWZmZXIpOworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlckJhc2UqIGJ1ZmZlcik7CiAKIHByb3RlY3RlZDoKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmgKaW5kZXggYjA2NmY5YS4uNTMzZTMzYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5oCkBAIC0xMDcsNyArMTA3LDcgQEAKIAogICAgIC8vIFN0b3JlcyBhIGNvcHkgb2YgdGhlIE1lZGlhQnVmZmVyIHJlYWQgaW4gdGhlIGxhc3QgcmVhZCgpIGNhbGwgYWZ0ZXIKICAgICAvLyBtUXVpY2tTdG9wIHdhcyB0cnVlLgotICAgIE1lZGlhQnVmZmVyKiBtTGFzdFJlYWRCdWZmZXJDb3B5OworICAgIE1lZGlhQnVmZmVyQmFzZSogbUxhc3RSZWFkQnVmZmVyQ29weTsKIAogICAgIC8vIFN0YXR1cyBjb2RlIGZvciBsYXN0IHJlYWQuCiAgICAgc3RhdHVzX3QgbUxhc3RSZWFkU3RhdHVzOwpAQCAtMTI4LDEwICsxMjgsMTAgQEAKICAgICAvLyBXcmFwcGVyIG92ZXIgQ2FtZXJhU291cmNlOjpzaWduYWxCdWZmZXJSZXR1cm5lZCgpIHRvIGltcGxlbWVudCBxdWljayBzdG9wLgogICAgIC8vIEl0IG9ubHkgaGFuZGxlcyB0aGUgY2FzZSB3aGVuIG1MYXN0UmVhZEJ1ZmZlckNvcHkgaXMgc2lnbmFsbGVkLiBPdGhlcndpc2UKICAgICAvLyBpdCBjYWxscyB0aGUgYmFzZSBjbGFzcycgZnVuY3Rpb24uCi0gICAgdmlydHVhbCB2b2lkIHNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyKiBidWZmZXIpOworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlckJhc2UqIGJ1ZmZlcik7CiAKICAgICAvLyBXcmFwcGVyIG92ZXIgQ2FtZXJhU291cmNlOjpyZWFkKCkgdG8gaW1wbGVtZW50IHF1aWNrIHN0b3AuCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKICAgICAvLyBtU2tpcEN1cnJlbnRGcmFtZSBpcyBzZXQgdG8gdHJ1ZSBpbiBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoKSBpZiB0aGUgY3VycmVudAogICAgIC8vIGZyYW1lIG5lZWRzIHRvIGJlIHNraXBwZWQgYW5kIHRoaXMgZnVuY3Rpb24ganVzdCByZXR1cm5zIHRoZSB2YWx1ZSBvZiBtU2tpcEN1cnJlbnRGcmFtZS4KQEAgLTE3MCw3ICsxNzAsNyBAQAogCiAgICAgLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gZmlsbCBtTGFzdFJlYWRCdWZmZXJDb3B5IGZyb20gdGhlIGp1c3QgcmVhZAogICAgIC8vIGJ1ZmZlci4KLSAgICB2b2lkIGZpbGxMYXN0UmVhZEJ1ZmZlckNvcHkoTWVkaWFCdWZmZXImIHNvdXJjZUJ1ZmZlcik7CisgICAgdm9pZCBmaWxsTGFzdFJlYWRCdWZmZXJDb3B5KE1lZGlhQnVmZmVyQmFzZSYgc291cmNlQnVmZmVyKTsKIAogICAgIC8vIElmIHRoZSBwYXNzZWQgaW4gc2l6ZSAod2lkdGggeCBoZWlnaHQpIGlzIGEgc3VwcG9ydGVkIHZpZGVvL3ByZXZpZXcgc2l6ZSwKICAgICAvLyB0aGUgZnVuY3Rpb24gc2V0cyB0aGUgY2FtZXJhJ3MgdmlkZW8vcHJldmlldyBzaXplIHRvIGl0IGFuZCByZXR1cm5zIHRydWUuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaAppbmRleCA5MTk3ZjdiLi4xY2JmODY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmgKQEAgLTE4LDYgKzE4LDcgQEAKIAogI2RlZmluZSBDT0RFQ19CQVNFX0hfCiAKKyNpbmNsdWRlIDxsaXN0PgogI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgPHN0ZGludC5oPgpAQCAtMjYsNyArMjcsNiBAQAogCiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvQ3J5cHRvQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KLSNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0luZm8uaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CkBAIC0yMjIsOSArMjIyLDcgQEAKICAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgPSAwOwogICAgIHZpcnR1YWwgdm9pZCBzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgPSAwOwogCi0gICAgLyoKLSAgICAgKiBDb2RlYy1yZWxhdGVkIGRlZmluZXMKLSAgICAgKi8KKyAgICB0eXBlZGVmIENvZGVjQmFzZSAqKCpDcmVhdGVDb2RlY0Z1bmMpKHZvaWQpOwogCiBwcm90ZWN0ZWQ6CiAgICAgQ29kZWNCYXNlKCkgPSBkZWZhdWx0OwpAQCAtMzI0LDQgKzMyMiwzIEBACiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIENPREVDX0JBU0VfSF8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oCmluZGV4IDdhYzliMzcuLjViMzU0M2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmgKQEAgLTMzLDYgKzMzLDggQEAKIAogICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0OwogCisgICAgYm9vbCBpc0RzdFJHQigpIGNvbnN0OworCiAgICAgc3RhdHVzX3QgY29udmVydCgKICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnNyY0JpdHMsCiAgICAgICAgICAgICBzaXplX3Qgc3JjV2lkdGgsIHNpemVfdCBzcmNIZWlnaHQsCkBAIC03Niw2ICs3OCwxNSBAQAogICAgIHN0YXR1c190IGNvbnZlcnRZVVY0MjBQbGFuYXJVc2VMaWJZVVYoCiAgICAgICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpOwogCisgICAgc3RhdHVzX3QgY29udmVydFlVVjQyMFBsYW5hcjE2KAorICAgICAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KTsKKworICAgIHN0YXR1c190IGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMCgKKyAgICAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCk7CisKKyAgICBzdGF0dXNfdCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1JHQigKKyAgICAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCk7CisKICAgICBzdGF0dXNfdCBjb252ZXJ0UUNPTVlVVjQyMFNlbWlQbGFuYXIoCiAgICAgICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpOwogCkBAIC04NSwxMCArOTYsNiBAQAogICAgIHN0YXR1c190IGNvbnZlcnRUSVlVVjQyMFBhY2tlZFNlbWlQbGFuYXIoCiAgICAgICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpOwogCi0gICAgdm9pZCB3cml0ZVRvRHN0KHZvaWQgKmRzdF9wdHIsIHVpbnQ4X3QgKmtBZGp1c3RlZENsaXAsIGJvb2wgdW5jcm9wcGVkLAotICAgICAgICAgICAgc2lnbmVkIHIxLCBzaWduZWQgZzEsIHNpZ25lZCBiMSwKLSAgICAgICAgICAgIHNpZ25lZCByMiwgc2lnbmVkIGcyLCBzaWduZWQgYjIpOwotCiAgICAgQ29sb3JDb252ZXJ0ZXIoY29uc3QgQ29sb3JDb252ZXJ0ZXIgJik7CiAgICAgQ29sb3JDb252ZXJ0ZXIgJm9wZXJhdG9yPShjb25zdCBDb2xvckNvbnZlcnRlciAmKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDg2M2JhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIERBVEFfU09VUkNFX0hfCi0KLSNkZWZpbmUgREFUQV9TT1VSQ0VfSF8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPGRybS9Ecm1NYW5hZ2VyQ2xpZW50Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEFNZXNzYWdlOwotc3RydWN0IEFTdHJpbmc7Ci1jbGFzcyAgSURhdGFTb3VyY2U7Ci1zdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7Ci1jbGFzcyBTdHJpbmc4Owotc3RydWN0IEhUVFBCYXNlOwotCi1jbGFzcyBEYXRhU291cmNlIDogcHVibGljIFJlZkJhc2UgewotcHVibGljOgotICAgIGVudW0gRmxhZ3MgewotICAgICAgICBrV2FudHNQcmVmZXRjaGluZyAgICAgID0gMSwKLSAgICAgICAga1N0cmVhbWVkRnJvbUxvY2FsSG9zdCA9IDIsCi0gICAgICAgIGtJc0NhY2hpbmdEYXRhU291cmNlICAgPSA0LAotICAgICAgICBrSXNIVFRQQmFzZWRTb3VyY2UgICAgID0gOCwKLSAgICAgICAga0lzTG9jYWxGaWxlU291cmNlICAgICA9IDE2LAotICAgIH07Ci0KLSAgICBzdGF0aWMgc3A8RGF0YVNvdXJjZT4gQ3JlYXRlRnJvbVVSSSgKLSAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmksCi0gICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwsCi0gICAgICAgICAgICBTdHJpbmc4ICpjb250ZW50VHlwZSA9IE5VTEwsCi0gICAgICAgICAgICBIVFRQQmFzZSAqaHR0cFNvdXJjZSA9IE5VTEwpOwotCi0gICAgc3RhdGljIHNwPERhdGFTb3VyY2U+IENyZWF0ZU1lZGlhSFRUUChjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKTsKLSAgICBzdGF0aWMgc3A8RGF0YVNvdXJjZT4gQ3JlYXRlRnJvbUlEYXRhU291cmNlKGNvbnN0IHNwPElEYXRhU291cmNlPiAmc291cmNlKTsKLSAgICBzdGF0aWMgc3A8RGF0YVNvdXJjZT4gQ3JlYXRlRnJvbUZkKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKLQotICAgIERhdGFTb3VyY2UoKSB7fQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdCA9IDA7Ci0KLSAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgLTEgb24gZmFpbHVyZS4gSXQncyBub3QgYW4gZXJyb3IgaWYKLSAgICAvLyB0aGlzIHJldHVybnMgemVybzsgaXQganVzdCBtZWFucyB0aGUgZ2l2ZW4gb2Zmc2V0IGlzIGVxdWFsIHRvLCBvcgotICAgIC8vIGJleW9uZCwgdGhlIGVuZCBvZiB0aGUgc291cmNlLgotICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSA9IDA7Ci0KLSAgICAvLyBDb252ZW5pZW5jZSBtZXRob2RzOgotICAgIGJvb2wgZ2V0VUludDE2KG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCk7Ci0gICAgYm9vbCBnZXRVSW50MjQob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KTsgLy8gMyBieXRlIGludCwgcmV0dXJuZWQgYXMgYSAzMi1iaXQgaW50Ci0gICAgYm9vbCBnZXRVSW50MzIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KTsKLSAgICBib29sIGdldFVJbnQ2NChvZmY2NF90IG9mZnNldCwgdWludDY0X3QgKngpOwotCi0gICAgLy8gcmVhZCBlaXRoZXIgaW50PE4+IG9yIGludDwyTj4gaW50byBhIHVpbnQ8Mk4+X3QsIHNpemUgaXMgdGhlIGludCBzaXplIGluIGJ5dGVzLgotICAgIGJvb2wgZ2V0VUludDE2VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCwgc2l6ZV90IHNpemUpOwotICAgIGJvb2wgZ2V0VUludDMyVmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCwgc2l6ZV90IHNpemUpOwotICAgIGJvb2wgZ2V0VUludDY0VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCwgc2l6ZV90IHNpemUpOwotCi0gICAgLy8gUmVhZHMgaW4gImNvdW50IiBlbnRyaWVzIG9mIHR5cGUgVCBpbnRvIHZlY3RvciAqeC4KLSAgICAvLyBSZXR1cm5zIHRydWUgaWYgImNvdW50IiBlbnRyaWVzIGNhbiBiZSByZWFkLgotICAgIC8vIElmIGZld2VyIHRoYW4gImNvdW50IiBlbnRyaWVzIGNhbiBiZSByZWFkLCByZXR1cm4gZmFsc2UuIEluIHRoaXMgY2FzZSwKLSAgICAvLyB0aGUgb3V0cHV0IHZlY3RvciAqeCB3aWxsIHN0aWxsIGhhdmUgdGhvc2UgZW50cmllcyB0aGF0IHdlcmUgcmVhZC4gQ2FsbAotICAgIC8vIHgtPnNpemUoKSB0byBvYnRhaW4gdGhlIG51bWJlciBvZiBlbnRyaWVzIHJlYWQuCi0gICAgLy8gVGhlIG9wdGlvbmFsIHBhcmFtZXRlciBjaHVua1NpemUgc3BlY2lmaWVzIGhvdyBtYW55IGVudHJpZXMgc2hvdWxkIGJlCi0gICAgLy8gcmVhZCBmcm9tIHRoZSBkYXRhIHNvdXJjZSBhdCBvbmUgdGltZSBpbnRvIGEgdGVtcG9yYXJ5IGJ1ZmZlci4gSW5jcmVhc2luZwotICAgIC8vIGNodW5rU2l6ZSBjYW4gaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2UgYXQgdGhlIGNvc3Qgb2YgZXh0cmEgbWVtb3J5IHVzYWdlLgotICAgIC8vIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBjaHVua1NpemUgaXMgc2V0IHRvIHJlYWQgYXQgbGVhc3QgNGsgYnl0ZXMgYXQgYQotICAgIC8vIHRpbWUsIGRlcGVuZGluZyBvbiBzaXplb2YoVCkuCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gICAgYm9vbCBnZXRWZWN0b3Iob2ZmNjRfdCBvZmZzZXQsIFZlY3RvcjxUPiogeCwgc2l6ZV90IGNvdW50LAotICAgICAgICAgICAgICAgICAgIHNpemVfdCBjaHVua1NpemUgPSAoNDA5NSAvIHNpemVvZihUKSkgKyAxKTsKLQotICAgIC8vIE1heSByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOwotCi0gICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gU3RyaW5nOCgiPHVuc3BlY2lmaWVkPiIpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCAvKm9mZnNldCovKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAvLyBmb3IgRFJNCi0gICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyICogLyptaW1lKi8gPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgZ2V0RHJtSW5mbyhzcDxEZWNyeXB0SGFuZGxlPiAmLypoYW5kbGUqLywgRHJtTWFuYWdlckNsaWVudCAqKiAvKmNsaWVudCovKSB7fTsKLQotICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmc4KCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBTdHJpbmc4IGdldE1JTUVUeXBlKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSB7fTsKLQotICAgIC8vIGNyZWF0ZXMgYW4gSURhdGFTb3VyY2Ugd3JhcHBlciB0byB0aGUgRGF0YVNvdXJjZS4KLSAgICB2aXJ0dWFsIHNwPElEYXRhU291cmNlPiBhc0lEYXRhU291cmNlKCk7Ci0KLSAgICAvLyByZXR1cm5zIGEgcG9pbnRlciB0byBJRGF0YVNvdXJjZSBpZiBpdCBpcyB3cmFwcGVkLgotICAgIHZpcnR1YWwgc3A8SURhdGFTb3VyY2U+IGdldElEYXRhU291cmNlKCkgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5EYXRhU291cmNlKCkge30KLQotcHJpdmF0ZToKLSAgICBEYXRhU291cmNlKGNvbnN0IERhdGFTb3VyY2UgJik7Ci0gICAgRGF0YVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IERhdGFTb3VyY2UgJik7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWJvb2wgRGF0YVNvdXJjZTo6Z2V0VmVjdG9yKG9mZjY0X3Qgb2Zmc2V0LCBWZWN0b3I8VD4qIHgsIHNpemVfdCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjaHVua1NpemUpCi17Ci0gICAgeC0+Y2xlYXIoKTsKLSAgICBpZiAoY2h1bmtTaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBUIHRtcFtjaHVua1NpemVdOwotICAgIHNzaXplX3QgbnVtQnl0ZXNSZWFkOwotICAgIHNpemVfdCBudW1CeXRlc1BlckNodW5rID0gY2h1bmtTaXplICogc2l6ZW9mKFQpOwotICAgIHNpemVfdCBpOwotCi0gICAgZm9yIChpID0gMDsgaSArIGNodW5rU2l6ZSA8IGNvdW50OyBpICs9IGNodW5rU2l6ZSkgewotICAgICAgICAvLyBUaGlzIGxvb3BzIGlzIGV4ZWN1dGVkIHdoZW4gbW9yZSB0aGFuIGNodW5rU2l6ZSByZWNvcmRzIG5lZWQgdG8gYmUKLSAgICAgICAgLy8gcmVhZC4KLSAgICAgICAgbnVtQnl0ZXNSZWFkID0gdGhpcy0+cmVhZEF0KG9mZnNldCwgKHZvaWQqKSZ0bXAsIG51bUJ5dGVzUGVyQ2h1bmspOwotICAgICAgICBpZiAobnVtQnl0ZXNSZWFkID09IC0xKSB7IC8vIElmIHJlYWRBdCgpIHJldHVybnMgLTEsIHRoZXJlIGlzIGFuIGVycm9yLgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KG51bUJ5dGVzUmVhZCkgPCBudW1CeXRlc1BlckNodW5rKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGNhc2UgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIHN0cmVhbSBlbmRzIGJlZm9yZSB0aGUgd2hvbGUKLSAgICAgICAgICAgIC8vIGNodW5rIGlzIHJlYWQuCi0gICAgICAgICAgICB4LT5hcHBlbmRBcnJheSh0bXAsIChzaXplX3QpbnVtQnl0ZXNSZWFkIC8gc2l6ZW9mKFQpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICB4LT5hcHBlbmRBcnJheSh0bXAsIGNodW5rU2l6ZSk7Ci0gICAgICAgIG9mZnNldCArPSBudW1CeXRlc1BlckNodW5rOwotICAgIH0KLQotICAgIC8vIFRoZXJlIGFyZSAoY291bnQgLSBpKSBtb3JlIHJlY29yZHMgdG8gcmVhZC4KLSAgICAvLyBSaWdodCBub3csIChjb3VudCAtIGkpIDw9IGNodW5rU2l6ZS4KLSAgICAvLyBXZSBkbyB0aGUgc2FtZSB0aGluZyBhcyBhYm92ZSwgYnV0IHdpdGggY2h1bmtTaXplIHJlcGxhY2VkIGJ5IGNvdW50IC0gaS4KLSAgICBudW1CeXRlc1JlYWQgPSB0aGlzLT5yZWFkQXQob2Zmc2V0LCAodm9pZCopJnRtcCwgKGNvdW50IC0gaSkgKiBzaXplb2YoVCkpOwotICAgIGlmIChudW1CeXRlc1JlYWQgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICB4LT5hcHBlbmRBcnJheSh0bXAsIChzaXplX3QpbnVtQnl0ZXNSZWFkIC8gc2l6ZW9mKFQpKTsKLSAgICByZXR1cm4geC0+c2l6ZSgpID09IGNvdW50OwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIERBVEFfU09VUkNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VGYWN0b3J5LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VGYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmExZDQ5MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBEQVRBX1NPVVJDRV9GQUNUT1JZX0hfCisKKyNkZWZpbmUgREFUQV9TT1VSQ0VfRkFDVE9SWV9IXworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBNZWRpYUhUVFBTZXJ2aWNlOworY2xhc3MgU3RyaW5nODsKK3N0cnVjdCBIVFRQQmFzZTsKKworY2xhc3MgRGF0YVNvdXJjZUZhY3RvcnkgeworcHVibGljOgorICAgIHN0YXRpYyBzcDxEYXRhU291cmNlPiBDcmVhdGVGcm9tVVJJKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMLAorICAgICAgICAgICAgU3RyaW5nOCAqY29udGVudFR5cGUgPSBOVUxMLAorICAgICAgICAgICAgSFRUUEJhc2UgKmh0dHBTb3VyY2UgPSBOVUxMKTsKKworICAgIHN0YXRpYyBzcDxEYXRhU291cmNlPiBDcmVhdGVNZWRpYUhUVFAoY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKTsKKyAgICBzdGF0aWMgc3A8RGF0YVNvdXJjZT4gQ3JlYXRlRnJvbUZkKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gREFUQV9TT1VSQ0VfRkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhVVJJU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuaAppbmRleCA2OTM1NjJlLi5jZjhkNjhlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIERBVEFfVVJJX1NPVVJDRV9IXwogCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVVyaVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhVXJpU291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMjNjMDYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhVXJpU291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBEQVRBX1VSSV9TT1VSQ0VfSF8KLQotI2RlZmluZSBEQVRBX1VSSV9TT1VSQ0VfSF8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEYXRhVXJpU291cmNlIDogcHVibGljIERhdGFTb3VyY2UgewotcHVibGljOgotICAgIERhdGFVcmlTb3VyY2UoY29uc3QgY2hhciAqdXJpKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbUluaXRlZDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSkgewotICAgICAgICBpZiAobUluaXRlZCAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIG1Jbml0ZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAqc2l6ZSA9IG1EYXRhLnNpemUoKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKSB7Ci0gICAgICAgIHJldHVybiBtRGF0YVVyaTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtTWltZVR5cGU7Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+RGF0YVVyaVNvdXJjZSgpIHsKLSAgICAgICAgLy8gTm90aGluZyB0byBkZWxldGUuCi0gICAgfQotCi1wcml2YXRlOgotICAgIGNvbnN0IFN0cmluZzggbURhdGFVcmk7Ci0KLSAgICBTdHJpbmc4IG1NaW1lVHlwZTsKLSAgICAvLyBVc2UgQVN0cmluZyBiZWNhdXNlIGluZGl2aWR1YWwgYnl0ZXMgbWF5IG5vdCBiZSB2YWxpZCBVVEY4IGNoYXJzLgotICAgIEFTdHJpbmcgbURhdGE7Ci0gICAgc3RhdHVzX3QgbUluaXRlZDsKLQotICAgIC8vIERpc2FsbG93IGNvcHkgYW5kIGFzc2lnbi4KLSAgICBEYXRhVXJpU291cmNlKGNvbnN0IERhdGFVcmlTb3VyY2UgJik7Ci0gICAgRGF0YVVyaVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IERhdGFVcmlTb3VyY2UgJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIERBVEFfVVJJX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaAppbmRleCA3MjY3ZTlhLi44NjA0ODkwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaApAQCAtMjAsNyArMjAsNyBAQAogCiAjaW5jbHVkZSA8c3RkaW8uaD4KIAotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8ZHJtL0RybU1hbmFnZXJDbGllbnQuaD4KQEAgLTQ1LDggKzQ1LDYgQEAKIAogICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gRHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciAqbWltZSk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgZ2V0RHJtSW5mbyhzcDxEZWNyeXB0SGFuZGxlPiAmaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KTsKLQogICAgIHZpcnR1YWwgU3RyaW5nOCB0b1N0cmluZygpIHsKICAgICAgICAgcmV0dXJuIG1OYW1lOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGViZDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOVEVSRkFDRV9VVElMU19IXworI2RlZmluZSBJTlRFUkZBQ0VfVVRJTFNfSF8KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFTb3VyY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEYXRhU291cmNlOworY2xhc3MgTWVkaWFFeHRyYWN0b3I7CitzdHJ1Y3QgTWVkaWFTb3VyY2U7CitjbGFzcyBJRGF0YVNvdXJjZTsKK2NsYXNzIElNZWRpYUV4dHJhY3RvcjsKK2NsYXNzIElNZWRpYVNvdXJjZTsKKworLy8gQ3JlYXRlcyBhIERhdGFTb3VyY2Ugd2hpY2ggd3JhcHMgdGhlIGdpdmVuIElEYXRhU291cmNlIG9iamVjdC4KK3NwPERhdGFTb3VyY2U+IENyZWF0ZURhdGFTb3VyY2VGcm9tSURhdGFTb3VyY2UoY29uc3Qgc3A8SURhdGFTb3VyY2U+ICZzb3VyY2UpOworCisvLyBjcmVhdGVzIGFuIElEYXRhU291cmNlIHdyYXBwZXIgdG8gdGhlIERhdGFTb3VyY2UuCitzcDxJRGF0YVNvdXJjZT4gQ3JlYXRlSURhdGFTb3VyY2VGcm9tRGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKTsKKworLy8gQ3JlYXRlcyBhbiBJTWVkaWFFeHRyYWN0b3Igd3JhcHBlciB0byB0aGUgZ2l2ZW4gTWVkaWFFeHRyYWN0b3IuCitzcDxJTWVkaWFFeHRyYWN0b3I+IENyZWF0ZUlNZWRpYUV4dHJhY3RvckZyb21NZWRpYUV4dHJhY3RvcigKKyAgICAgICAgTWVkaWFFeHRyYWN0b3IgKmV4dHJhY3RvciwKKyAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgY29uc3Qgc3A8UmVmQmFzZT4gJnBsdWdpbik7CisKKy8vIENyZWF0ZXMgYSBNZWRpYVNvdXJjZSB3aGljaCB3cmFwcyB0aGUgZ2l2ZW4gSU1lZGlhU291cmNlIG9iamVjdC4KK3NwPE1lZGlhU291cmNlPiBDcmVhdGVNZWRpYVNvdXJjZUZyb21JTWVkaWFTb3VyY2UoY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlKTsKKworLy8gQ3JlYXRlcyBhbiBJTWVkaWFTb3VyY2Ugd3JhcHBlciB0byB0aGUgZ2l2ZW4gTWVkaWFTb3VyY2UuCitzcDxJTWVkaWFTb3VyY2U+IENyZWF0ZUlNZWRpYVNvdXJjZUZyb21NZWRpYVNvdXJjZUJhc2UoCisgICAgICAgIGNvbnN0IHNwPFJlbW90ZU1lZGlhRXh0cmFjdG9yPiAmZXh0cmFjdG9yLAorICAgICAgICBNZWRpYVRyYWNrICpzb3VyY2UsIGNvbnN0IHNwPFJlZkJhc2U+ICZwbHVnaW4pOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIElOVEVSRkFDRV9VVElMU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9KUEVHU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0pQRUdTb3VyY2UuaAppbmRleCAxYjdlOTFiLi44YWIzZDExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0pQRUdTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0pQRUdTb3VyY2UuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIEpQRUdfU09VUkNFX0hfCiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzMsNyArMzMsNyBAQAogICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5KUEVHU291cmNlKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5oCmluZGV4IDQ1MTZmYjYuLjNkNzk2MGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5oCkBAIC0zNCw3ICszNCw3IEBACiAgICAgICAgICAgICB2b2lkICpjb29raWUsCiAgICAgICAgICAgICBzc2l6ZV90ICgqd3JpdGUpKHZvaWQgKmNvb2tpZSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlKGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtID0gTlVMTCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgeyByZXR1cm4gcmVzZXQoKTsgfQogICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaAppbmRleCAxYzdiNGE2Li43YjQxMzYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oCkBAIC0yMCw3ICsyMCw2IEBACiAKICNpbmNsdWRlIDxzdGRpby5oPgogCi0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgpAQCAtMzEsNyArMzAsNyBAQAogCiBzdHJ1Y3QgQU1lc3NhZ2U7CiBjbGFzcyBNZWRpYUJ1ZmZlcjsKLWNsYXNzIE1ldGFEYXRhOworc3RydWN0IEFCdWZmZXI7CiAKIGNsYXNzIE1QRUc0V3JpdGVyIDogcHVibGljIE1lZGlhV3JpdGVyIHsKIHB1YmxpYzoKQEAgLTQwLDcgKzM5LDcgQEAKICAgICAvLyBMaW1pdGF0aW9ucwogICAgIC8vIE5vIG1vcmUgdGhhbiBvbmUgdmlkZW8gYW5kL29yIG9uZSBhdWRpbyBzb3VyY2UgY2FuIGJlIGFkZGVkLCBidXQKICAgICAvLyBtdWx0aXBsZSBtZXRhZGF0YSBzb3VyY2VzIGNhbiBiZSBhZGRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFNvdXJjZShjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKTsKIAogICAgIC8vIFJldHVybnMgSU5WQUxJRF9PUEVSQVRJT04gaWYgdGhlcmUgaXMgbm8gc291cmNlIG9yIHRyYWNrLgogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtID0gTlVMTCk7CkBAIC0xMDEsMTIgKzEwMCwxMiBAQAogICAgIGJvb2wgbVNlbmROb3RpZnk7CiAgICAgb2ZmNjRfdCBtT2Zmc2V0OwogICAgIG9mZl90IG1NZGF0T2Zmc2V0OwotICAgIHVpbnQ4X3QgKm1Nb292Qm94QnVmZmVyOwotICAgIG9mZjY0X3QgbU1vb3ZCb3hCdWZmZXJPZmZzZXQ7Ci0gICAgYm9vbCAgbVdyaXRlTW9vdkJveFRvTWVtb3J5OworICAgIHVpbnQ4X3QgKm1Jbk1lbW9yeUNhY2hlOworICAgIG9mZjY0X3QgbUluTWVtb3J5Q2FjaGVPZmZzZXQ7CisgICAgb2ZmNjRfdCBtSW5NZW1vcnlDYWNoZVNpemU7CisgICAgYm9vbCAgbVdyaXRlQm94VG9NZW1vcnk7CiAgICAgb2ZmNjRfdCBtRnJlZUJveE9mZnNldDsKICAgICBib29sIG1TdHJlYW1hYmxlRmlsZTsKLSAgICBvZmY2NF90IG1Fc3RpbWF0ZWRNb292Qm94U2l6ZTsKICAgICBvZmY2NF90IG1Nb292RXh0cmFTaXplOwogICAgIHVpbnQzMl90IG1JbnRlcmxlYXZlRHVyYXRpb25VczsKICAgICBpbnQzMl90IG1UaW1lU2NhbGU7CkBAIC0xMzMsNiArMTMyLDggQEAKICAgICBzdGF0dXNfdCBzdGFydFRyYWNrcyhNZXRhRGF0YSAqcGFyYW1zKTsKICAgICBzaXplX3QgbnVtVHJhY2tzKCk7CiAgICAgaW50NjRfdCBlc3RpbWF0ZU1vb3ZCb3hTaXplKGludDMyX3QgYml0UmF0ZSk7CisgICAgaW50NjRfdCBlc3RpbWF0ZUZpbGVMZXZlbE1ldGFTaXplKCk7CisgICAgdm9pZCB3cml0ZUNhY2hlZEJveFRvRmlsZShjb25zdCBjaGFyICp0eXBlKTsKIAogICAgIHN0cnVjdCBDaHVuayB7CiAgICAgICAgIFRyYWNrICAgICAgICAgICAgICAgKm1UcmFjazsgICAgICAgIC8vIE93bmVyCkBAIC0xNjUsNiArMTY2LDQ3IEBACiAgICAgTGlzdDxDaHVua0luZm8+IG1DaHVua0luZm9zOyAgICAgICAgICAgIC8vIENodW5rIGluZm9zCiAgICAgQ29uZGl0aW9uICAgICAgIG1DaHVua1JlYWR5Q29uZGl0aW9uOyAgIC8vIFNpZ25hbCB0aGF0IGNodW5rcyBhcmUgYXZhaWxhYmxlCiAKKyAgICAvLyBIRUlGIHdyaXRpbmcKKyAgICB0eXBlZGVmIHN0cnVjdCBfSXRlbUluZm8geworICAgICAgICBib29sIGlzR3JpZCgpIGNvbnN0IHsgcmV0dXJuICFzdHJjbXAoImdyaWQiLCBpdGVtVHlwZSk7IH0KKyAgICAgICAgY29uc3QgY2hhciAqaXRlbVR5cGU7CisgICAgICAgIHVpbnQxNl90IGl0ZW1JZDsKKyAgICAgICAgYm9vbCBpc1ByaW1hcnk7CisgICAgICAgIGJvb2wgaXNIaWRkZW47CisgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgIC8vIGltYWdlIGl0ZW0KKyAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0OworICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemU7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgLy8gZ3JpZCBpdGVtCisgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHJvd3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgY29sczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aDsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgICAgICAgICB9OworICAgICAgICB9OworICAgICAgICBWZWN0b3I8dWludDE2X3Q+IHByb3BlcnRpZXM7CisgICAgICAgIFZlY3Rvcjx1aW50MTZfdD4gZGltZ1JlZnM7CisgICAgfSBJdGVtSW5mbzsKKworICAgIHR5cGVkZWYgc3RydWN0IF9JdGVtUHJvcGVydHkgeworICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICBpbnQzMl90IHdpZHRoOworICAgICAgICBpbnQzMl90IGhlaWdodDsKKyAgICAgICAgaW50MzJfdCByb3RhdGlvbjsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gaHZjYzsKKyAgICB9IEl0ZW1Qcm9wZXJ0eTsKKworICAgIGJvb2wgbUhhc0ZpbGVMZXZlbE1ldGE7CisgICAgYm9vbCBtSGFzTW9vdkJveDsKKyAgICB1aW50MzJfdCBtUHJpbWFyeUl0ZW1JZDsKKyAgICB1aW50MzJfdCBtQXNzb2NpYXRpb25FbnRyeUNvdW50OworICAgIHVpbnQzMl90IG1OdW1HcmlkczsKKyAgICBWZWN0b3I8SXRlbUluZm8+IG1JdGVtczsKKyAgICBWZWN0b3I8SXRlbVByb3BlcnR5PiBtUHJvcGVydGllczsKKwogICAgIC8vIFdyaXRlciB0aHJlYWQgaGFuZGxpbmcKICAgICBzdGF0dXNfdCBzdGFydFdyaXRlclRocmVhZCgpOwogICAgIHZvaWQgc3RvcFdyaXRlclRocmVhZCgpOwpAQCAtMjEwLDkgKzI1MiwxMSBAQAogICAgIHZvaWQgaW5pdEludGVybmFsKGludCBmZCwgYm9vbCBpc0ZpcnN0U2Vzc2lvbik7CiAKICAgICAvLyBBY3F1aXJlIGxvY2sgYmVmb3JlIGNhbGxpbmcgdGhlc2UgbWV0aG9kcwotICAgIG9mZjY0X3QgYWRkU2FtcGxlX2woTWVkaWFCdWZmZXIgKmJ1ZmZlcik7Ci0gICAgb2ZmNjRfdCBhZGRMZW5ndGhQcmVmaXhlZFNhbXBsZV9sKE1lZGlhQnVmZmVyICpidWZmZXIpOwotICAgIG9mZjY0X3QgYWRkTXVsdGlwbGVMZW5ndGhQcmVmaXhlZFNhbXBsZXNfbChNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKKyAgICBvZmY2NF90IGFkZFNhbXBsZV9sKE1lZGlhQnVmZmVyICpidWZmZXIsIGJvb2wgdXNlUHJlZml4LCBzaXplX3QgKmJ5dGVzV3JpdHRlbik7CisgICAgdm9pZCBhZGRMZW5ndGhQcmVmaXhlZFNhbXBsZV9sKE1lZGlhQnVmZmVyICpidWZmZXIpOworICAgIHZvaWQgYWRkTXVsdGlwbGVMZW5ndGhQcmVmaXhlZFNhbXBsZXNfbChNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKKyAgICB1aW50MTZfdCBhZGRQcm9wZXJ0eV9sKGNvbnN0IEl0ZW1Qcm9wZXJ0eSAmKTsKKyAgICB1aW50MTZfdCBhZGRJdGVtX2woY29uc3QgSXRlbUluZm8gJik7CiAKICAgICBib29sIGV4Y2VlZHNGaWxlU2l6ZUxpbWl0KCk7CiAgICAgYm9vbCB1c2UzMkJpdEZpbGVPZmZzZXQoKSBjb25zdDsKQEAgLTIzMSwxMCArMjc1LDIzIEBACiAgICAgdm9pZCBmaW5pc2hDdXJyZW50U2Vzc2lvbigpOwogCiAgICAgdm9pZCBhZGREZXZpY2VNZXRhKCk7Ci0gICAgdm9pZCB3cml0ZUhkbHIoKTsKKyAgICB2b2lkIHdyaXRlSGRscihjb25zdCBjaGFyICpoYW5kbGVyVHlwZSk7CiAgICAgdm9pZCB3cml0ZUtleXMoKTsKICAgICB2b2lkIHdyaXRlSWxzdCgpOwotICAgIHZvaWQgd3JpdGVNZXRhQm94KCk7CisgICAgdm9pZCB3cml0ZU1vb3ZMZXZlbE1ldGFCb3goKTsKKworICAgIC8vIEhFSUYgd3JpdGluZworICAgIHZvaWQgd3JpdGVJbG9jQm94KCk7CisgICAgdm9pZCB3cml0ZUluZmVCb3godWludDE2X3QgaXRlbUlkLCBjb25zdCBjaGFyICp0eXBlLCB1aW50MzJfdCBmbGFncyk7CisgICAgdm9pZCB3cml0ZUlpbmZCb3goKTsKKyAgICB2b2lkIHdyaXRlSXBjb0JveCgpOworICAgIHZvaWQgd3JpdGVJcG1hQm94KCk7CisgICAgdm9pZCB3cml0ZUlwcnBCb3goKTsKKyAgICB2b2lkIHdyaXRlSWRhdEJveCgpOworICAgIHZvaWQgd3JpdGVJcmVmQm94KCk7CisgICAgdm9pZCB3cml0ZVBpdG1Cb3goKTsKKyAgICB2b2lkIHdyaXRlRmlsZUxldmVsTWV0YUJveCgpOworCiAgICAgdm9pZCBzZW5kU2Vzc2lvblN1bW1hcnkoKTsKICAgICB2b2lkIHJlbGVhc2UoKTsKICAgICBzdGF0dXNfdCBzd2l0Y2hGZCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUFkYXB0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFBZGFwdGVyLmgKaW5kZXggMzY5ZmNlNi4uNTg5YzgyNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUFkYXB0ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQWRhcHRlci5oCkBAIC0xNyw4ICsxNyw4IEBACiAjaWZuZGVmIE1FRElBX0FEQVBURVJfSAogI2RlZmluZSBNRURJQV9BREFQVEVSX0gKIAorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KQEAgLTQwLDEzICs0MCwxMyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwogICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgIC8vIEluaGVyaXRlZCBmdW5jdGlvbnMgZnJvbSBNZWRpYUJ1ZmZlck9ic2VydmVyCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi0gICAgdmlydHVhbCB2b2lkIHNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyICpidWZmZXIpOworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7CiAKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgLy8gTm9uLWluaGVyaXRlZCBmdW5jdGlvbnM6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NDQxMGQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX0JVRkZFUl9IXwotCi0jZGVmaW5lIE1FRElBX0JVRkZFUl9IXwotCi0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlckJhc2UuaD4KLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEFCdWZmZXI7Ci1jbGFzcyBHcmFwaGljQnVmZmVyOwotY2xhc3MgTWVkaWFCdWZmZXI7Ci1jbGFzcyBNZWRpYUJ1ZmZlck9ic2VydmVyOwotY2xhc3MgTWV0YURhdGE7Ci0KLWNsYXNzIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgewotcHVibGljOgotICAgIE1lZGlhQnVmZmVyT2JzZXJ2ZXIoKSB7fQotICAgIHZpcnR1YWwgfk1lZGlhQnVmZmVyT2JzZXJ2ZXIoKSB7fQotCi0gICAgdmlydHVhbCB2b2lkIHNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyICpidWZmZXIpID0gMDsKLQotcHJpdmF0ZToKLSAgICBNZWRpYUJ1ZmZlck9ic2VydmVyKGNvbnN0IE1lZGlhQnVmZmVyT2JzZXJ2ZXIgJik7Ci0gICAgTWVkaWFCdWZmZXJPYnNlcnZlciAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhQnVmZmVyT2JzZXJ2ZXIgJik7Ci19OwotCi1jbGFzcyBNZWRpYUJ1ZmZlciA6IHB1YmxpYyBNZWRpYUJ1ZmZlckJhc2UgewotcHVibGljOgotICAgIC8vIGFsbG9jYXRpb25zIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIHRoaXMgd2lsbCB1c2Ugc2hhcmVkIG1lbW9yeS4KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtTaGFyZWRNZW1UaHJlc2hvbGQgPSA2NCAqIDEwMjQ7Ci0KLSAgICAvLyBUaGUgdW5kZXJseWluZyBkYXRhIHJlbWFpbnMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIhCi0gICAgTWVkaWFCdWZmZXIodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwotCi0gICAgZXhwbGljaXQgTWVkaWFCdWZmZXIoc2l6ZV90IHNpemUpOwotCi0gICAgZXhwbGljaXQgTWVkaWFCdWZmZXIoY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGdyYXBoaWNCdWZmZXIpOwotCi0gICAgZXhwbGljaXQgTWVkaWFCdWZmZXIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7Ci0KLSAgICBNZWRpYUJ1ZmZlcihjb25zdCBzcDxJTWVtb3J5PiAmbWVtKSA6Ci0gICAgICAgIE1lZGlhQnVmZmVyKCh1aW50OF90ICopbWVtLT5wb2ludGVyKCkgKyBzaXplb2YoU2hhcmVkQ29udHJvbCksIG1lbS0+c2l6ZSgpKSB7Ci0gICAgICAgIC8vIGRlbGVnYXRlIGFuZCBvdmVycmlkZSBtTWVtb3J5Ci0gICAgICAgIG1NZW1vcnkgPSBtZW07Ci0gICAgfQotCi0gICAgLy8gSWYgTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQsIGRlY3JlbWVudCB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50OwotICAgIC8vIGlmIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gMCwgcmV0dXJuIHRoZSBidWZmZXIgdG8gdGhlCi0gICAgLy8gYXNzb2NpYXRlZCBNZWRpYUJ1ZmZlckdyb3VwLgotICAgIC8vCi0gICAgLy8gSWYgbm8gTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQsIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQgbXVzdCBiZSB6ZXJvCi0gICAgLy8gd2hlbiBjYWxsZWQsIHdoZXJldXBvbiB0aGUgTWVkaWFCdWZmZXIgaXMgZGVsZXRlZC4KLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpOwotCi0gICAgLy8gSW5jcmVtZW50cyB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50LgotICAgIC8vIFVzZSBvbmx5IHdoZW4gTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQuCi0gICAgdmlydHVhbCB2b2lkIGFkZF9yZWYoKTsKLQotICAgIHZvaWQgKmRhdGEoKSBjb25zdDsKLSAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0OwotCi0gICAgc2l6ZV90IHJhbmdlX29mZnNldCgpIGNvbnN0OwotICAgIHNpemVfdCByYW5nZV9sZW5ndGgoKSBjb25zdDsKLQotICAgIHZvaWQgc2V0X3JhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpOwotCi0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlcigpIGNvbnN0OwotCi0gICAgc3A8TWV0YURhdGE+IG1ldGFfZGF0YSgpOwotCi0gICAgLy8gQ2xlYXJzIG1ldGEgZGF0YSBhbmQgcmVzZXRzIHRoZSByYW5nZSB0byB0aGUgZnVsbCBleHRlbnQuCi0gICAgdm9pZCByZXNldCgpOwotCi0gICAgdm9pZCBzZXRPYnNlcnZlcihNZWRpYUJ1ZmZlck9ic2VydmVyICpncm91cCk7Ci0KLSAgICAvLyBSZXR1cm5zIGEgY2xvbmUgb2YgdGhpcyBNZWRpYUJ1ZmZlciBpbmNyZWFzaW5nIGl0cyByZWZlcmVuY2UgY291bnQuCi0gICAgLy8gVGhlIGNsb25lIHJlZmVyZW5jZXMgdGhlIHNhbWUgZGF0YSBidXQgaGFzIGl0cyBvd24gcmFuZ2UgYW5kCi0gICAgLy8gTWV0YURhdGEuCi0gICAgTWVkaWFCdWZmZXIgKmNsb25lKCk7Ci0KLSAgICAvLyBzdW0gb2YgbG9jYWxSZWZjb3VudCgpIGFuZCByZW1vdGVSZWZjb3VudCgpCi0gICAgaW50IHJlZmNvdW50KCkgY29uc3QgewotICAgICAgICByZXR1cm4gbG9jYWxSZWZjb3VudCgpICsgcmVtb3RlUmVmY291bnQoKTsKLSAgICB9Ci0KLSAgICBpbnQgbG9jYWxSZWZjb3VudCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1SZWZDb3VudDsKLSAgICB9Ci0KLSAgICBpbnQgcmVtb3RlUmVmY291bnQoKSBjb25zdCB7Ci0gICAgICAgIGlmIChtTWVtb3J5LmdldCgpID09IG51bGxwdHIgfHwgbU1lbW9yeS0+cG9pbnRlcigpID09IG51bGxwdHIpIHJldHVybiAwOwotICAgICAgICBpbnQzMl90IHJlbW90ZVJlZmNvdW50ID0KLSAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFNoYXJlZENvbnRyb2wgKj4obU1lbW9yeS0+cG9pbnRlcigpKS0+Z2V0UmVtb3RlUmVmY291bnQoKTsKLSAgICAgICAgLy8gU2FuaXR5IGNoZWNrIHNvIHRoYXQgcmVtb3RlUmVmQ291bnQoKSBpcyBub24tbmVnYXRpdmUuCi0gICAgICAgIHJldHVybiByZW1vdGVSZWZjb3VudCA+PSAwID8gcmVtb3RlUmVmY291bnQgOiAwOyAvLyBkbyBub3QgYWxsb3cgY29ycnVwdGVkIGRhdGEuCi0gICAgfQotCi0gICAgLy8gcmV0dXJucyBvbGQgdmFsdWUKLSAgICBpbnQgYWRkUmVtb3RlUmVmY291bnQoaW50MzJfdCB2YWx1ZSkgewotICAgICAgICBpZiAobU1lbW9yeS5nZXQoKSA9PSBudWxscHRyIHx8IG1NZW1vcnktPnBvaW50ZXIoKSA9PSBudWxscHRyKSByZXR1cm4gMDsKLSAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U2hhcmVkQ29udHJvbCAqPihtTWVtb3J5LT5wb2ludGVyKCkpLT5hZGRSZW1vdGVSZWZjb3VudCh2YWx1ZSk7Ci0gICAgfQotCi0gICAgYm9vbCBpc0RlYWRPYmplY3QoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBpc0RlYWRPYmplY3QobU1lbW9yeSk7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2wgaXNEZWFkT2JqZWN0KGNvbnN0IHNwPElNZW1vcnk+ICZtZW1vcnkpIHsKLSAgICAgICAgaWYgKG1lbW9yeS5nZXQoKSA9PSBudWxscHRyIHx8IG1lbW9yeS0+cG9pbnRlcigpID09IG51bGxwdHIpIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U2hhcmVkQ29udHJvbCAqPihtZW1vcnktPnBvaW50ZXIoKSktPmlzRGVhZE9iamVjdCgpOwotICAgIH0KLQotICAgIC8vIFN0aWNreSBvbiBlbmFibGluZyBvZiBzaGFyZWQgbWVtb3J5IE1lZGlhQnVmZmVycy4gQnkgZGVmYXVsdCB3ZSBkb24ndCB1c2UKLSAgICAvLyBzaGFyZWQgbWVtb3J5IGZvciBNZWRpYUJ1ZmZlcnMsIGJ1dCB3ZSBlbmFibGUgdGhpcyBmb3IgdGhvc2UgcHJvY2Vzc2VzCi0gICAgLy8gdGhhdCBleHBvcnQgTWVkaWFCdWZmZXJzLgotICAgIHN0YXRpYyB2b2lkIHVzZVNoYXJlZE1lbW9yeSgpIHsKLSAgICAgICAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoCi0gICAgICAgICAgICAgICAgJm1Vc2VTaGFyZWRNZW1vcnksIChpbnRfbGVhc3QzMl90KTEsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOwotICAgIH0KLQotcHJvdGVjdGVkOgotICAgIC8vIHRydWUgaWYgTWVkaWFCdWZmZXIgaXMgb2JzZXJ2ZWQgKHBhcnQgb2YgYSBNZWRpYUJ1ZmZlckdyb3VwKS4KLSAgICBpbmxpbmUgYm9vbCBpc09ic2VydmVkKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbU9ic2VydmVyICE9IG51bGxwdHI7Ci0gICAgfQotCi0gICAgdmlydHVhbCB+TWVkaWFCdWZmZXIoKTsKLQotICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIE1lZGlhQnVmZmVyR3JvdXA7Ci0gICAgZnJpZW5kIGNsYXNzIE9NWERlY29kZXI7Ci0gICAgZnJpZW5kIGNsYXNzIEJuTWVkaWFTb3VyY2U7Ci0gICAgZnJpZW5kIGNsYXNzIEJwTWVkaWFTb3VyY2U7Ci0KLSAgICAvLyBGb3IgdXNlIGJ5IE9NWERlY29kZXIsIHJlZmVyZW5jZSBjb3VudCBtdXN0IGJlIDEsIGRyb3AgcmVmZXJlbmNlCi0gICAgLy8gY291bnQgdG8gMCB3aXRob3V0IHNpZ25hbGxpbmcgdGhlIG9ic2VydmVyLgotICAgIHZvaWQgY2xhaW0oKTsKLQotICAgIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgKm1PYnNlcnZlcjsKLSAgICBpbnQgbVJlZkNvdW50OwotCi0gICAgdm9pZCAqbURhdGE7Ci0gICAgc2l6ZV90IG1TaXplLCBtUmFuZ2VPZmZzZXQsIG1SYW5nZUxlbmd0aDsKLSAgICBzcDxHcmFwaGljQnVmZmVyPiBtR3JhcGhpY0J1ZmZlcjsKLSAgICBzcDxBQnVmZmVyPiBtQnVmZmVyOwotCi0gICAgYm9vbCBtT3duc0RhdGE7Ci0KLSAgICBzcDxNZXRhRGF0YT4gbU1ldGFEYXRhOwotCi0gICAgTWVkaWFCdWZmZXIgKm1PcmlnaW5hbDsKLQotICAgIHN0YXRpYyBzdGQ6OmF0b21pY19pbnRfbGVhc3QzMl90IG1Vc2VTaGFyZWRNZW1vcnk7Ci0KLSAgICBNZWRpYUJ1ZmZlcihjb25zdCBNZWRpYUJ1ZmZlciAmKTsKLSAgICBNZWRpYUJ1ZmZlciAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhQnVmZmVyICYpOwotCi0gICAgLy8gU2hhcmVkQ29udHJvbCBibG9jayBhdCB0aGUgc3RhcnQgb2YgSU1lbW9yeS4KLSAgICBzdHJ1Y3QgU2hhcmVkQ29udHJvbCB7Ci0gICAgICAgIGVudW0gewotICAgICAgICAgICAgRkxBR19ERUFEX09CSkVDVCA9ICgxIDw8IDApLAotICAgICAgICB9OwotCi0gICAgICAgIC8vIHJldHVybnMgb2xkIHZhbHVlCi0gICAgICAgIGlubGluZSBpbnQzMl90IGFkZFJlbW90ZVJlZmNvdW50KGludDMyX3QgdmFsdWUpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGQ6OmF0b21pY19mZXRjaF9hZGRfZXhwbGljaXQoCi0gICAgICAgICAgICAgICAgICAgICZtUmVtb3RlUmVmY291bnQsIChpbnRfbGVhc3QzMl90KXZhbHVlLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlubGluZSBpbnQzMl90IGdldFJlbW90ZVJlZmNvdW50KCkgY29uc3QgewotICAgICAgICAgICAgcmV0dXJuIHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoJm1SZW1vdGVSZWZjb3VudCwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmxpbmUgdm9pZCBzZXRSZW1vdGVSZWZjb3VudChpbnQzMl90IHZhbHVlKSB7Ci0gICAgICAgICAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCgKLSAgICAgICAgICAgICAgICAgICAgJm1SZW1vdGVSZWZjb3VudCwgKGludF9sZWFzdDMyX3QpdmFsdWUsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5saW5lIGJvb2wgaXNEZWFkT2JqZWN0KCkgY29uc3QgewotICAgICAgICAgICAgcmV0dXJuIChzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KAotICAgICAgICAgICAgICAgICAgICAmbUZsYWdzLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KSAmIEZMQUdfREVBRF9PQkpFQ1QpICE9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmxpbmUgdm9pZCBzZXREZWFkT2JqZWN0KCkgewotICAgICAgICAgICAgKHZvaWQpc3RkOjphdG9taWNfZmV0Y2hfb3JfZXhwbGljaXQoCi0gICAgICAgICAgICAgICAgICAgICZtRmxhZ3MsIChpbnRfbGVhc3QzMl90KUZMQUdfREVBRF9PQkpFQ1QsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5saW5lIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgICAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCgKLSAgICAgICAgICAgICAgICAgICAgJm1GbGFncywgKGludF9sZWFzdDMyX3QpMCwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7Ci0gICAgICAgICAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCgKLSAgICAgICAgICAgICAgICAgICAgJm1SZW1vdGVSZWZjb3VudCwgKGludF9sZWFzdDMyX3QpMCwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIC8vIENhdXRpb246IGF0b21pY19pbnRfZmFzdDMyX3QgaXMgNjQgYml0cyBvbiBMUDY0LgotICAgICAgICBzdGQ6OmF0b21pY19pbnRfbGVhc3QzMl90IG1GbGFnczsKLSAgICAgICAgc3RkOjphdG9taWNfaW50X2xlYXN0MzJfdCBtUmVtb3RlUmVmY291bnQ7Ci0gICAgICAgIGludDMyX3QgdW51c2VkWzZdIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKTsgLy8gYWRkaXRpb25hbCBidWZmZXIgc3BhY2UKLSAgICB9OwotCi0gICAgaW5saW5lIFNoYXJlZENvbnRyb2wgKmdldFNoYXJlZENvbnRyb2woKSBjb25zdCB7Ci0gICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTaGFyZWRDb250cm9sICo+KG1NZW1vcnktPnBvaW50ZXIoKSk7Ci0gICAgIH0KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTUVESUFfQlVGRkVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMWQ0OWMxYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi8uLi9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi44MGU0OWIwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi8uLi9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA1MTQwNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX0JVRkZFUl9HUk9VUF9IXwotCi0jZGVmaW5lIE1FRElBX0JVRkZFUl9HUk9VUF9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTWVkaWFCdWZmZXI7Ci1jbGFzcyBNZXRhRGF0YTsKLQotY2xhc3MgTWVkaWFCdWZmZXJHcm91cCA6IHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyIHsKLXB1YmxpYzoKLSAgICBNZWRpYUJ1ZmZlckdyb3VwKHNpemVfdCBncm93dGhMaW1pdCA9IDApOwotCi0gICAgLy8gY3JlYXRlIGEgbWVkaWEgYnVmZmVyIGdyb3VwIHdpdGggcHJlYWxsb2NhdGVkIGJ1ZmZlcnMKLSAgICBNZWRpYUJ1ZmZlckdyb3VwKHNpemVfdCBidWZmZXJzLCBzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCBncm93dGhMaW1pdCA9IDApOwotCi0gICAgfk1lZGlhQnVmZmVyR3JvdXAoKTsKLQotICAgIHZvaWQgYWRkX2J1ZmZlcihNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKLQotICAgIGJvb2wgaGFzX2J1ZmZlcnMoKTsKLQotICAgIC8vIElmIG5vbkJsb2NraW5nIGlzIGZhbHNlLCBpdCBibG9ja3MgdW50aWwgYSBidWZmZXIgaXMgYXZhaWxhYmxlIGFuZAotICAgIC8vIHBhc3NlcyBpdCB0byB0aGUgY2FsbGVyIGluICpidWZmZXIsIHdoaWxlIHJldHVybmluZyBPSy4KLSAgICAvLyBUaGUgcmV0dXJuZWQgYnVmZmVyIHdpbGwgaGF2ZSBhIHJlZmVyZW5jZSBjb3VudCBvZiAxLgotICAgIC8vIElmIG5vbkJsb2NraW5nIGlzIHRydWUgYW5kIGEgYnVmZmVyIGlzIG5vdCBpbW1lZGlhdGVseSBhdmFpbGFibGUsCi0gICAgLy8gYnVmZmVyIGlzIHNldCB0byBOVUxMIGFuZCBpdCByZXR1cm5zIFdPVUxEX0JMT0NLLgotICAgIC8vIElmIHJlcXVlc3RlZFNpemUgaXMgMCwgYW55IGZyZWUgTWVkaWFCdWZmZXIgd2lsbCBiZSByZXR1cm5lZC4KLSAgICAvLyBJZiByZXF1ZXN0ZWRTaXplIGlzID4gMCwgdGhlIHJldHVybmVkIE1lZGlhQnVmZmVyIHNob3VsZCBoYXZlIGJ1ZmZlcgotICAgIC8vIHNpemUgb2YgYXQgbGVhc3QgcmVxdXN0ZWRTaXplLgotICAgIHN0YXR1c190IGFjcXVpcmVfYnVmZmVyKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGJvb2wgbm9uQmxvY2tpbmcgPSBmYWxzZSwgc2l6ZV90IHJlcXVlc3RlZFNpemUgPSAwKTsKLQotICAgIHNpemVfdCBidWZmZXJzKCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlcnMuc2l6ZSgpOyB9Ci0KLSAgICAvLyBJZiBidWZmZXIgaXMgbnVsbHB0ciwgaGF2ZSBhY3F1aXJlX2J1ZmZlcigpIGNoZWNrIGZvciByZW1vdGUgcmVsZWFzZS4KLSAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIE1lZGlhQnVmZmVyOwotCi0gICAgTXV0ZXggbUxvY2s7Ci0gICAgQ29uZGl0aW9uIG1Db25kaXRpb247Ci0gICAgc2l6ZV90IG1Hcm93dGhMaW1pdDsgIC8vIERvIG5vdCBhdXRvbWF0aWNhbGx5IGdyb3cgZ3JvdXAgbGFyZ2VyIHRoYW4gdGhpcy4KLSAgICBzdGQ6Omxpc3Q8TWVkaWFCdWZmZXIgKj4gbUJ1ZmZlcnM7Ci0KLSAgICBNZWRpYUJ1ZmZlckdyb3VwKGNvbnN0IE1lZGlhQnVmZmVyR3JvdXAgJik7Ci0gICAgTWVkaWFCdWZmZXJHcm91cCAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhQnVmZmVyR3JvdXAgJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE1FRElBX0JVRkZFUl9HUk9VUF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4wMDliM2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vLi4vbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ2xvY2suaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5oCmluZGV4IGRkMWE4MDkuLjNkZGViODIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5oCkBAIC0xOCw3ICsxOCw4IEBACiAKICNkZWZpbmUgTUVESUFfQ0xPQ0tfSF8KIAotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KICNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIApAQCAtMjYsOCArMjcsMTQgQEAKIAogc3RydWN0IEFNZXNzYWdlOwogCi1zdHJ1Y3QgTWVkaWFDbG9jayA6IHB1YmxpYyBSZWZCYXNlIHsKK3N0cnVjdCBNZWRpYUNsb2NrIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICBlbnVtIHsKKyAgICAgICAgVElNRVJfUkVBU09OX1JFQUNIRUQgPSAwLAorICAgICAgICBUSU1FUl9SRUFTT05fUkVTRVQgPSAxLAorICAgIH07CisKICAgICBNZWRpYUNsb2NrKCk7CisgICAgdm9pZCBpbml0KCk7CiAKICAgICB2b2lkIHNldFN0YXJ0aW5nVGltZU1lZGlhKGludDY0X3Qgc3RhcnRpbmdUaW1lTWVkaWFVcyk7CiAKQEAgLTU0LDE1ICs2MSw0NSBAQAogICAgIC8vIFRoZSByZXN1bHQgaXMgc2F2ZWQgaW4gfG91dFJlYWxVc3wuCiAgICAgc3RhdHVzX3QgZ2V0UmVhbFRpbWVGb3IoaW50NjRfdCB0YXJnZXRNZWRpYVVzLCBpbnQ2NF90ICpvdXRSZWFsVXMpIGNvbnN0OwogCisgICAgLy8gcmVxdWVzdCB0byBzZXQgdXAgYSB0aW1lci4gVGhlIHRhcmdldCB0aW1lIGlzIHxtZWRpYVRpbWVVc3wsIGFkanVzdGVkIGJ5CisgICAgLy8gc3lzdGVtIHRpbWUgb2YgfGFkanVzdFJlYWxVc3wuIEluIG90aGVyIHdvcmRzLCB0aGUgd2FrZSB1cCB0aW1lIGlzCisgICAgLy8gbWVkaWFUaW1lVXMgKyAoYWRqdXN0UmVhbFVzIC8gcGxheWJhY2tSYXRlKQorICAgIHZvaWQgYWRkVGltZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGludDY0X3QgbWVkaWFUaW1lVXMsIGludDY0X3QgYWRqdXN0UmVhbFVzID0gMCk7CisKKyAgICB2b2lkIHNldE5vdGlmaWNhdGlvbk1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCisgICAgdm9pZCByZXNldCgpOworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TWVkaWFDbG9jaygpOwogCisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKwogcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRUaW1lSXNVcCA9ICd0SXNVJywKKyAgICB9OworCisgICAgc3RydWN0IFRpbWVyIHsKKyAgICAgICAgVGltZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGludDY0X3QgbWVkaWFUaW1lVXMsIGludDY0X3QgYWRqdXN0UmVhbFVzKTsKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CisgICAgICAgIGludDY0X3QgbU1lZGlhVGltZVVzOworICAgICAgICBpbnQ2NF90IG1BZGp1c3RSZWFsVXM7CisgICAgfTsKKwogICAgIHN0YXR1c190IGdldE1lZGlhVGltZV9sKAogICAgICAgICAgICAgaW50NjRfdCByZWFsVXMsCiAgICAgICAgICAgICBpbnQ2NF90ICpvdXRNZWRpYVVzLAogICAgICAgICAgICAgYm9vbCBhbGxvd1Bhc3RNYXhUaW1lKSBjb25zdDsKIAorICAgIHZvaWQgcHJvY2Vzc1RpbWVyc19sKCk7CisKKyAgICB2b2lkIHVwZGF0ZUFuY2hvclRpbWVzQW5kUGxheWJhY2tSYXRlX2woCisgICAgICAgICAgICBpbnQ2NF90IGFuY2hvclRpbWVNZWRpYVVzLCBpbnQ2NF90IGFuY2hvclRpbWVSZWFsVXMgLCBmbG9hdCBwbGF5YmFja1JhdGUpOworCisgICAgdm9pZCBub3RpZnlEaXNjb250aW51aXR5X2woKTsKKworICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CiAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKIAogICAgIGludDY0X3QgbUFuY2hvclRpbWVNZWRpYVVzOwpAQCAtNzIsNiArMTA5LDEwIEBACiAKICAgICBmbG9hdCBtUGxheWJhY2tSYXRlOwogCisgICAgaW50MzJfdCBtR2VuZXJhdGlvbjsKKyAgICBzdGQ6Omxpc3Q8VGltZXI+IG1UaW1lcnM7CisgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CisKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZWRpYUNsb2NrKTsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmgKaW5kZXggMTAzMDQwNy4uNjc4MDhmMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmgKQEAgLTE4NCw2ICsxODQsOCBAQAogCiAgICAgc3RhdHVzX3QgZ2V0TmFtZShBU3RyaW5nICpjb21wb25lbnROYW1lKSBjb25zdDsKIAorICAgIHN0YXR1c190IGdldENvZGVjSW5mbyhzcDxNZWRpYUNvZGVjSW5mbz4gKmNvZGVjSW5mbykgY29uc3Q7CisKICAgICBzdGF0dXNfdCBnZXRNZXRyaWNzKE1lZGlhQW5hbHl0aWNzSXRlbSAqICZyZXBseSk7CiAKICAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKTsKQEAgLTIxNyw2ICsyMTksNyBAQAogICAgICAgICBTVE9QUElORywKICAgICAgICAgUkVMRUFTSU5HLAogICAgIH07CisgICAgc3RkOjpzdHJpbmcgc3RhdGVTdHJpbmcoU3RhdGUgc3RhdGUpOwogCiAgICAgZW51bSB7CiAgICAgICAgIGtQb3J0SW5kZXhJbnB1dCAgICAgICAgID0gMCwKQEAgLTI0Nyw2ICsyNTAsNyBAQAogICAgICAgICBrV2hhdFJlcXVlc3RJRFJGcmFtZSAgICAgICAgICAgICAgICA9ICdyaWRyJywKICAgICAgICAga1doYXRSZXF1ZXN0QWN0aXZpdHlOb3RpZmljYXRpb24gICAgPSAncmFjTicsCiAgICAgICAgIGtXaGF0R2V0TmFtZSAgICAgICAgICAgICAgICAgICAgICAgID0gJ2dldE4nLAorICAgICAgICBrV2hhdEdldENvZGVjSW5mbyAgICAgICAgICAgICAgICAgICA9ICdnQ29JJywKICAgICAgICAga1doYXRTZXRQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgPSAnc2V0UCcsCiAgICAgICAgIGtXaGF0U2V0Q2FsbGJhY2sgICAgICAgICAgICAgICAgICAgID0gJ3NldEMnLAogICAgICAgICBrV2hhdFNldE5vdGlmaWNhdGlvbiAgICAgICAgICAgICAgICA9ICdzZXROJywKQEAgLTMwNyw2ICszMTEsNyBAQAogICAgIHNwPEFMb29wZXI+IG1Db2RlY0xvb3BlcjsKICAgICBzcDxDb2RlY0Jhc2U+IG1Db2RlYzsKICAgICBBU3RyaW5nIG1Db21wb25lbnROYW1lOworICAgIHNwPE1lZGlhQ29kZWNJbmZvPiBtQ29kZWNJbmZvOwogICAgIHNwPEFSZXBseVRva2VuPiBtUmVwbHlJRDsKICAgICB1aW50MzJfdCBtRmxhZ3M7CiAgICAgc3RhdHVzX3QgbVN0aWNreUVycm9yOwpAQCAtMzE1LDcgKzMyMCw5IEBACiAKICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKm1BbmFseXRpY3NJdGVtOwogICAgIHZvaWQgaW5pdEFuYWx5dGljc0l0ZW0oKTsKKyAgICB2b2lkIHVwZGF0ZUFuYWx5dGljc0l0ZW0oKTsKICAgICB2b2lkIGZsdXNoQW5hbHl0aWNzSXRlbSgpOworICAgIHZvaWQgdXBkYXRlRXBoZW1lcmFsQW5hbHl0aWNzKE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSk7CiAKICAgICBzcDxBTWVzc2FnZT4gbU91dHB1dEZvcm1hdDsKICAgICBzcDxBTWVzc2FnZT4gbUlucHV0Rm9ybWF0OwpAQCAtMzMzLDggKzM0MCw2IEBACiAKICAgICAvLyBpbml0aWFsIGNyZWF0ZSBwYXJhbWV0ZXJzCiAgICAgQVN0cmluZyBtSW5pdE5hbWU7Ci0gICAgYm9vbCBtSW5pdE5hbWVJc1R5cGU7Ci0gICAgYm9vbCBtSW5pdElzRW5jb2RlcjsKIAogICAgIC8vIGNvbmZpZ3VyZSBwYXJhbWV0ZXIKICAgICBzcDxBTWVzc2FnZT4gbUNvbmZpZ3VyZU1zZzsKQEAgLTM2NCwxOSArMzY5LDIwIEBACiAKICAgICBib29sIG1IYXZlSW5wdXRTdXJmYWNlOwogICAgIGJvb2wgbUhhdmVQZW5kaW5nSW5wdXRCdWZmZXJzOworICAgIGJvb2wgbUNwdUJvb3N0UmVxdWVzdGVkOwogCiAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlckNoYW5uZWxCYXNlPiBtQnVmZmVyQ2hhbm5lbDsKIAogICAgIE1lZGlhQ29kZWMoY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpOwogCi0gICAgc3RhdGljIHNwPENvZGVjQmFzZT4gR2V0Q29kZWNCYXNlKGNvbnN0IEFTdHJpbmcgJm5hbWUsIGJvb2wgbmFtZUlzVHlwZSA9IGZhbHNlKTsKKyAgICBzdGF0aWMgc3A8Q29kZWNCYXNlPiBHZXRDb2RlY0Jhc2UoY29uc3QgQVN0cmluZyAmbmFtZSk7CiAKICAgICBzdGF0aWMgc3RhdHVzX3QgUG9zdEFuZEF3YWl0UmVzcG9uc2UoCiAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgc3A8QU1lc3NhZ2U+ICpyZXNwb25zZSk7CiAKICAgICB2b2lkIFBvc3RSZXBseVdpdGhFcnJvcihjb25zdCBzcDxBUmVwbHlUb2tlbj4gJnJlcGx5SUQsIGludDMyX3QgZXJyKTsKIAotICAgIHN0YXR1c190IGluaXQoY29uc3QgQVN0cmluZyAmbmFtZSwgYm9vbCBuYW1lSXNUeXBlLCBib29sIGVuY29kZXIpOworICAgIHN0YXR1c190IGluaXQoY29uc3QgQVN0cmluZyAmbmFtZSk7CiAKICAgICB2b2lkIHNldFN0YXRlKFN0YXRlIG5ld1N0YXRlKTsKICAgICB2b2lkIHJldHVybkJ1ZmZlcnNUb0NvZGVjKGJvb2wgaXNSZWNsYWltID0gZmFsc2UpOwpAQCAtNDIwLDYgKzQyNiw3IEBACiAKICAgICB1aW50NjRfdCBnZXRHcmFwaGljQnVmZmVyU2l6ZSgpOwogICAgIHZvaWQgYWRkUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlLCBNZWRpYVJlc291cmNlOjpTdWJUeXBlIHN1YnR5cGUsIHVpbnQ2NF90IHZhbHVlKTsKKyAgICB2b2lkIHJlcXVlc3RDcHVCb29zdElmTmVlZGVkKCk7CiAKICAgICBib29sIGhhc1BlbmRpbmdCdWZmZXIoaW50IHBvcnRJbmRleCk7CiAgICAgYm9vbCBoYXNQZW5kaW5nQnVmZmVyKCk7CkBAIC00MzgsNiArNDQ1LDYzIEBACiAKICAgICB2b2lkIG9uUmVsZWFzZUNyeXB0byhjb25zdCBzcDxBTWVzc2FnZT4mIG1zZyk7CiAKKyAgICAvLyBtYW5hZ2luZyB0aW1lLW9mLWZsaWdodCBha2EgbGF0ZW5jeQorICAgIHR5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgICAgIGludDY0X3QgcHJlc2VudGF0aW9uVXM7CisgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0ZWROczsKKyAgICB9IEJ1ZmZlckZsaWdodFRpbWluZ190OworICAgIHN0ZDo6ZGVxdWU8QnVmZmVyRmxpZ2h0VGltaW5nX3Q+IG1CdWZmZXJzSW5GbGlnaHQ7CisgICAgTXV0ZXggbUxhdGVuY3lMb2NrOworICAgIGludDY0X3QgbUxhdGVuY3lVbmtub3duOyAgICAvLyBidWZmZXJzIGZvciB3aGljaCB3ZSBjb3VsZG4ndCBjYWxjdWxhdGUgbGF0ZW5jeQorCisgICAgdm9pZCBzdGF0c0J1ZmZlclNlbnQoaW50NjRfdCBwcmVzZW50YXRpb25Vcyk7CisgICAgdm9pZCBzdGF0c0J1ZmZlclJlY2VpdmVkKGludDY0X3QgcHJlc2VudGF0aW9uVXMpOworCisgICAgZW51bSB7CisgICAgICAgIC8vIHRoZSBkZWZhdWx0IHNoYXBlIG9mIG91ciBsYXRlbmN5IGhpc3RvZ3JhbSBidWNrZXRzCisgICAgICAgIC8vIFhYWDogc2hvdWxkIHRoZXNlIGJlIGNvbmZpZ3VyYWJsZSBpbiBzb21lIHdheT8KKyAgICAgICAga0xhdGVuY3lIaXN0QnVja2V0cyA9IDIwLAorICAgICAgICBrTGF0ZW5jeUhpc3RXaWR0aCA9IDIwMDAsCisgICAgICAgIGtMYXRlbmN5SGlzdEZsb29yID0gMjAwMCwKKworICAgICAgICAvLyBob3cgbWFueSBzYW1wbGVzIGFyZSBpbiB0aGUgJ3JlY2VudCBsYXRlbmN5JyBoaXN0b2dyYW0KKyAgICAgICAgLy8gMzAwIGZyYW1lcyA9IDUgc2VjIEAgNjBmcHMgb3IgfjEyIHNlYyBAIDI0ZnBzCisgICAgICAgIGtSZWNlbnRMYXRlbmN5RnJhbWVzID0gMzAwLAorCisgICAgICAgIC8vIGhvdyB3ZSBpbml0aWFsaXplIG1SZWNlbnRTYW1wbGVzCisgICAgICAgIGtSZWNlbnRTYW1wbGVJbnZhbGlkID0gLTEsCisgICAgfTsKKworICAgIGludDY0X3QgbVJlY2VudFNhbXBsZXNba1JlY2VudExhdGVuY3lGcmFtZXNdOworICAgIGludCBtUmVjZW50SGVhZDsKKyAgICBNdXRleCBtUmVjZW50TG9jazsKKworICAgIGNsYXNzIEhpc3RvZ3JhbSB7CisgICAgICBwdWJsaWM6CisgICAgICAgIEhpc3RvZ3JhbSgpIDogbUZsb29yKDApLCBtV2lkdGgoMCksIG1CZWxvdygwKSwgbUFib3ZlKDApLAorICAgICAgICAgICAgICAgICAgICAgIG1NaW4oSU5UNjRfTUFYKSwgbU1heChJTlQ2NF9NSU4pLCBtU3VtKDApLCBtQ291bnQoMCksCisgICAgICAgICAgICAgICAgICAgICAgbUJ1Y2tldENvdW50KDApLCBtQnVja2V0cyhOVUxMKSB7fTsKKyAgICAgICAgfkhpc3RvZ3JhbSgpIHsgY2xlYXIoKTsgfTsKKyAgICAgICAgdm9pZCBjbGVhcigpIHsgaWYgKG1CdWNrZXRzICE9IE5VTEwpIGZyZWUobUJ1Y2tldHMpOyBtQnVja2V0cyA9IE5VTEw7IH07CisgICAgICAgIGJvb2wgc2V0dXAoaW50IG5idWNrZXRzLCBpbnQ2NF90IHdpZHRoLCBpbnQ2NF90IGZsb29yID0gMCk7CisgICAgICAgIHZvaWQgaW5zZXJ0KGludDY0X3Qgc2FtcGxlKTsKKyAgICAgICAgaW50NjRfdCBnZXRNaW4oKSBjb25zdCB7IHJldHVybiBtTWluOyB9CisgICAgICAgIGludDY0X3QgZ2V0TWF4KCkgY29uc3QgeyByZXR1cm4gbU1heDsgfQorICAgICAgICBpbnQ2NF90IGdldENvdW50KCkgY29uc3QgeyByZXR1cm4gbUNvdW50OyB9CisgICAgICAgIGludDY0X3QgZ2V0U3VtKCkgY29uc3QgeyByZXR1cm4gbVN1bTsgfQorICAgICAgICBpbnQ2NF90IGdldEF2ZygpIGNvbnN0IHsgcmV0dXJuIG1TdW0gLyAobUNvdW50ID09IDAgPyAxIDogbUNvdW50KTsgfQorICAgICAgICBzdGQ6OnN0cmluZyBlbWl0KCk7CisgICAgICBwcml2YXRlOgorICAgICAgICBpbnQ2NF90IG1GbG9vciwgbUNlaWxpbmcsIG1XaWR0aDsKKyAgICAgICAgaW50NjRfdCBtQmVsb3csIG1BYm92ZTsKKyAgICAgICAgaW50NjRfdCBtTWluLCBtTWF4LCBtU3VtLCBtQ291bnQ7CisKKyAgICAgICAgaW50IG1CdWNrZXRDb3VudDsKKyAgICAgICAgaW50NjRfdCAqbUJ1Y2tldHM7CisgICAgfTsKKworICAgIEhpc3RvZ3JhbSBtTGF0ZW5jeUhpc3Q7CisKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZWRpYUNvZGVjKTsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VmNGMwZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCkBAIC0wLDAgKzEsNDIwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisjaWZuZGVmIE1FRElBX0NPREVDX0NPTlNUQU5UU19IXworI2RlZmluZSBNRURJQV9DT0RFQ19DT05TVEFOVFNfSF8KKworbmFtZXNwYWNlIHsKKworLy8gZnJvbSBNZWRpYUNvZGVjSW5mby5qYXZhCitjb25zdGV4cHIgaW50MzJfdCBBVkNQcm9maWxlQmFzZWxpbmUgPSAweDAxOworY29uc3RleHByIGludDMyX3QgQVZDUHJvZmlsZU1haW4gICAgID0gMHgwMjsKK2NvbnN0ZXhwciBpbnQzMl90IEFWQ1Byb2ZpbGVFeHRlbmRlZCA9IDB4MDQ7Citjb25zdGV4cHIgaW50MzJfdCBBVkNQcm9maWxlSGlnaCAgICAgPSAweDA4OworY29uc3RleHByIGludDMyX3QgQVZDUHJvZmlsZUhpZ2gxMCAgID0gMHgxMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWQ1Byb2ZpbGVIaWdoNDIyICA9IDB4MjA7Citjb25zdGV4cHIgaW50MzJfdCBBVkNQcm9maWxlSGlnaDQ0NCAgPSAweDQwOworY29uc3RleHByIGludDMyX3QgQVZDUHJvZmlsZUNvbnN0cmFpbmVkQmFzZWxpbmUgPSAweDEwMDAwOworY29uc3RleHByIGludDMyX3QgQVZDUHJvZmlsZUNvbnN0cmFpbmVkSGlnaCAgICAgPSAweDgwMDAwOworCitjb25zdGV4cHIgaW50MzJfdCBBVkNMZXZlbDEgICAgICAgPSAweDAxOworY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWwxYiAgICAgID0gMHgwMjsKK2NvbnN0ZXhwciBpbnQzMl90IEFWQ0xldmVsMTEgICAgICA9IDB4MDQ7Citjb25zdGV4cHIgaW50MzJfdCBBVkNMZXZlbDEyICAgICAgPSAweDA4OworY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWwxMyAgICAgID0gMHgxMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWQ0xldmVsMiAgICAgICA9IDB4MjA7Citjb25zdGV4cHIgaW50MzJfdCBBVkNMZXZlbDIxICAgICAgPSAweDQwOworY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWwyMiAgICAgID0gMHg4MDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWQ0xldmVsMyAgICAgICA9IDB4MTAwOworY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWwzMSAgICAgID0gMHgyMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVkNMZXZlbDMyICAgICAgPSAweDQwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWQ0xldmVsNCAgICAgICA9IDB4ODAwOworY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWw0MSAgICAgID0gMHgxMDAwOworY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWw0MiAgICAgID0gMHgyMDAwOworY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWw1ICAgICAgID0gMHg0MDAwOworY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWw1MSAgICAgID0gMHg4MDAwOworY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWw1MiAgICAgID0gMHgxMDAwMDsKKworY29uc3RleHByIGludDMyX3QgSDI2M1Byb2ZpbGVCYXNlbGluZSAgICAgICAgICAgICA9IDB4MDE7Citjb25zdGV4cHIgaW50MzJfdCBIMjYzUHJvZmlsZUgzMjBDb2RpbmcgICAgICAgICAgID0gMHgwMjsKK2NvbnN0ZXhwciBpbnQzMl90IEgyNjNQcm9maWxlQmFja3dhcmRDb21wYXRpYmxlICAgPSAweDA0OworY29uc3RleHByIGludDMyX3QgSDI2M1Byb2ZpbGVJU1dWMiAgICAgICAgICAgICAgICA9IDB4MDg7Citjb25zdGV4cHIgaW50MzJfdCBIMjYzUHJvZmlsZUlTV1YzICAgICAgICAgICAgICAgID0gMHgxMDsKK2NvbnN0ZXhwciBpbnQzMl90IEgyNjNQcm9maWxlSGlnaENvbXByZXNzaW9uICAgICAgPSAweDIwOworY29uc3RleHByIGludDMyX3QgSDI2M1Byb2ZpbGVJbnRlcm5ldCAgICAgICAgICAgICA9IDB4NDA7Citjb25zdGV4cHIgaW50MzJfdCBIMjYzUHJvZmlsZUludGVybGFjZSAgICAgICAgICAgID0gMHg4MDsKK2NvbnN0ZXhwciBpbnQzMl90IEgyNjNQcm9maWxlSGlnaExhdGVuY3kgICAgICAgICAgPSAweDEwMDsKKworY29uc3RleHByIGludDMyX3QgSDI2M0xldmVsMTAgICAgICA9IDB4MDE7Citjb25zdGV4cHIgaW50MzJfdCBIMjYzTGV2ZWwyMCAgICAgID0gMHgwMjsKK2NvbnN0ZXhwciBpbnQzMl90IEgyNjNMZXZlbDMwICAgICAgPSAweDA0OworY29uc3RleHByIGludDMyX3QgSDI2M0xldmVsNDAgICAgICA9IDB4MDg7Citjb25zdGV4cHIgaW50MzJfdCBIMjYzTGV2ZWw0NSAgICAgID0gMHgxMDsKK2NvbnN0ZXhwciBpbnQzMl90IEgyNjNMZXZlbDUwICAgICAgPSAweDIwOworY29uc3RleHByIGludDMyX3QgSDI2M0xldmVsNjAgICAgICA9IDB4NDA7Citjb25zdGV4cHIgaW50MzJfdCBIMjYzTGV2ZWw3MCAgICAgID0gMHg4MDsKKworY29uc3RleHByIGludDMyX3QgTVBFRzRQcm9maWxlU2ltcGxlICAgICAgICAgICAgICA9IDB4MDE7Citjb25zdGV4cHIgaW50MzJfdCBNUEVHNFByb2ZpbGVTaW1wbGVTY2FsYWJsZSAgICAgID0gMHgwMjsKK2NvbnN0ZXhwciBpbnQzMl90IE1QRUc0UHJvZmlsZUNvcmUgICAgICAgICAgICAgICAgPSAweDA0OworY29uc3RleHByIGludDMyX3QgTVBFRzRQcm9maWxlTWFpbiAgICAgICAgICAgICAgICA9IDB4MDg7Citjb25zdGV4cHIgaW50MzJfdCBNUEVHNFByb2ZpbGVOYml0ICAgICAgICAgICAgICAgID0gMHgxMDsKK2NvbnN0ZXhwciBpbnQzMl90IE1QRUc0UHJvZmlsZVNjYWxhYmxlVGV4dHVyZSAgICAgPSAweDIwOworY29uc3RleHByIGludDMyX3QgTVBFRzRQcm9maWxlU2ltcGxlRmFjZSAgICAgICAgICA9IDB4NDA7Citjb25zdGV4cHIgaW50MzJfdCBNUEVHNFByb2ZpbGVTaW1wbGVGQkEgICAgICAgICAgID0gMHg4MDsKK2NvbnN0ZXhwciBpbnQzMl90IE1QRUc0UHJvZmlsZUJhc2ljQW5pbWF0ZWQgICAgICAgPSAweDEwMDsKK2NvbnN0ZXhwciBpbnQzMl90IE1QRUc0UHJvZmlsZUh5YnJpZCAgICAgICAgICAgICAgPSAweDIwMDsKK2NvbnN0ZXhwciBpbnQzMl90IE1QRUc0UHJvZmlsZUFkdmFuY2VkUmVhbFRpbWUgICAgPSAweDQwMDsKK2NvbnN0ZXhwciBpbnQzMl90IE1QRUc0UHJvZmlsZUNvcmVTY2FsYWJsZSAgICAgICAgPSAweDgwMDsKK2NvbnN0ZXhwciBpbnQzMl90IE1QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nICAgICAgPSAweDEwMDA7Citjb25zdGV4cHIgaW50MzJfdCBNUEVHNFByb2ZpbGVBZHZhbmNlZENvcmUgICAgICAgID0gMHgyMDAwOworY29uc3RleHByIGludDMyX3QgTVBFRzRQcm9maWxlQWR2YW5jZWRTY2FsYWJsZSAgICA9IDB4NDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IE1QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlICAgICAgPSAweDgwMDA7CisKK2NvbnN0ZXhwciBpbnQzMl90IE1QRUc0TGV2ZWwwICAgICAgPSAweDAxOworY29uc3RleHByIGludDMyX3QgTVBFRzRMZXZlbDBiICAgICA9IDB4MDI7Citjb25zdGV4cHIgaW50MzJfdCBNUEVHNExldmVsMSAgICAgID0gMHgwNDsKK2NvbnN0ZXhwciBpbnQzMl90IE1QRUc0TGV2ZWwyICAgICAgPSAweDA4OworY29uc3RleHByIGludDMyX3QgTVBFRzRMZXZlbDMgICAgICA9IDB4MTA7Citjb25zdGV4cHIgaW50MzJfdCBNUEVHNExldmVsM2IgICAgID0gMHgxODsKK2NvbnN0ZXhwciBpbnQzMl90IE1QRUc0TGV2ZWw0ICAgICAgPSAweDIwOworY29uc3RleHByIGludDMyX3QgTVBFRzRMZXZlbDRhICAgICA9IDB4NDA7Citjb25zdGV4cHIgaW50MzJfdCBNUEVHNExldmVsNSAgICAgID0gMHg4MDsKK2NvbnN0ZXhwciBpbnQzMl90IE1QRUc0TGV2ZWw2ICAgICAgPSAweDEwMDsKKworY29uc3RleHByIGludDMyX3QgTVBFRzJQcm9maWxlU2ltcGxlICAgICAgICAgICAgICA9IDB4MDA7Citjb25zdGV4cHIgaW50MzJfdCBNUEVHMlByb2ZpbGVNYWluICAgICAgICAgICAgICAgID0gMHgwMTsKK2NvbnN0ZXhwciBpbnQzMl90IE1QRUcyUHJvZmlsZTQyMiAgICAgICAgICAgICAgICAgPSAweDAyOworY29uc3RleHByIGludDMyX3QgTVBFRzJQcm9maWxlU05SICAgICAgICAgICAgICAgICA9IDB4MDM7Citjb25zdGV4cHIgaW50MzJfdCBNUEVHMlByb2ZpbGVTcGF0aWFsICAgICAgICAgICAgID0gMHgwNDsKK2NvbnN0ZXhwciBpbnQzMl90IE1QRUcyUHJvZmlsZUhpZ2ggICAgICAgICAgICAgICAgPSAweDA1OworCitjb25zdGV4cHIgaW50MzJfdCBNUEVHMkxldmVsTEwgICAgID0gMHgwMDsKK2NvbnN0ZXhwciBpbnQzMl90IE1QRUcyTGV2ZWxNTCAgICAgPSAweDAxOworY29uc3RleHByIGludDMyX3QgTVBFRzJMZXZlbEgxNCAgICA9IDB4MDI7Citjb25zdGV4cHIgaW50MzJfdCBNUEVHMkxldmVsSEwgICAgID0gMHgwMzsKK2NvbnN0ZXhwciBpbnQzMl90IE1QRUcyTGV2ZWxIUCAgICAgPSAweDA0OworCitjb25zdGV4cHIgaW50MzJfdCBBQUNPYmplY3RNYWluICAgICAgID0gMTsKK2NvbnN0ZXhwciBpbnQzMl90IEFBQ09iamVjdExDICAgICAgICAgPSAyOworY29uc3RleHByIGludDMyX3QgQUFDT2JqZWN0U1NSICAgICAgICA9IDM7Citjb25zdGV4cHIgaW50MzJfdCBBQUNPYmplY3RMVFAgICAgICAgID0gNDsKK2NvbnN0ZXhwciBpbnQzMl90IEFBQ09iamVjdEhFICAgICAgICAgPSA1OworY29uc3RleHByIGludDMyX3QgQUFDT2JqZWN0U2NhbGFibGUgICA9IDY7Citjb25zdGV4cHIgaW50MzJfdCBBQUNPYmplY3RFUkxDICAgICAgID0gMTc7Citjb25zdGV4cHIgaW50MzJfdCBBQUNPYmplY3RFUlNjYWxhYmxlID0gMjA7Citjb25zdGV4cHIgaW50MzJfdCBBQUNPYmplY3RMRCAgICAgICAgID0gMjM7Citjb25zdGV4cHIgaW50MzJfdCBBQUNPYmplY3RIRV9QUyAgICAgID0gMjk7Citjb25zdGV4cHIgaW50MzJfdCBBQUNPYmplY3RFTEQgICAgICAgID0gMzk7Citjb25zdGV4cHIgaW50MzJfdCBBQUNPYmplY3RYSEUgICAgICAgID0gNDI7CisKK2NvbnN0ZXhwciBpbnQzMl90IFZQOExldmVsX1ZlcnNpb24wID0gMHgwMTsKK2NvbnN0ZXhwciBpbnQzMl90IFZQOExldmVsX1ZlcnNpb24xID0gMHgwMjsKK2NvbnN0ZXhwciBpbnQzMl90IFZQOExldmVsX1ZlcnNpb24yID0gMHgwNDsKK2NvbnN0ZXhwciBpbnQzMl90IFZQOExldmVsX1ZlcnNpb24zID0gMHgwODsKKworY29uc3RleHByIGludDMyX3QgVlA4UHJvZmlsZU1haW4gPSAweDAxOworCitjb25zdGV4cHIgaW50MzJfdCBWUDlQcm9maWxlMCA9IDB4MDE7Citjb25zdGV4cHIgaW50MzJfdCBWUDlQcm9maWxlMSA9IDB4MDI7Citjb25zdGV4cHIgaW50MzJfdCBWUDlQcm9maWxlMiA9IDB4MDQ7Citjb25zdGV4cHIgaW50MzJfdCBWUDlQcm9maWxlMyA9IDB4MDg7Citjb25zdGV4cHIgaW50MzJfdCBWUDlQcm9maWxlMkhEUiA9IDB4MTAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUzSERSID0gMHgyMDAwOworCitjb25zdGV4cHIgaW50MzJfdCBWUDlMZXZlbDEgID0gMHgxOworY29uc3RleHByIGludDMyX3QgVlA5TGV2ZWwxMSA9IDB4MjsKK2NvbnN0ZXhwciBpbnQzMl90IFZQOUxldmVsMiAgPSAweDQ7Citjb25zdGV4cHIgaW50MzJfdCBWUDlMZXZlbDIxID0gMHg4OworY29uc3RleHByIGludDMyX3QgVlA5TGV2ZWwzICA9IDB4MTA7Citjb25zdGV4cHIgaW50MzJfdCBWUDlMZXZlbDMxID0gMHgyMDsKK2NvbnN0ZXhwciBpbnQzMl90IFZQOUxldmVsNCAgPSAweDQwOworY29uc3RleHByIGludDMyX3QgVlA5TGV2ZWw0MSA9IDB4ODA7Citjb25zdGV4cHIgaW50MzJfdCBWUDlMZXZlbDUgID0gMHgxMDA7Citjb25zdGV4cHIgaW50MzJfdCBWUDlMZXZlbDUxID0gMHgyMDA7Citjb25zdGV4cHIgaW50MzJfdCBWUDlMZXZlbDUyID0gMHg0MDA7Citjb25zdGV4cHIgaW50MzJfdCBWUDlMZXZlbDYgID0gMHg4MDA7Citjb25zdGV4cHIgaW50MzJfdCBWUDlMZXZlbDYxID0gMHgxMDAwOworY29uc3RleHByIGludDMyX3QgVlA5TGV2ZWw2MiA9IDB4MjAwMDsKKworY29uc3RleHByIGludDMyX3QgSEVWQ1Byb2ZpbGVNYWluICAgICAgICA9IDB4MDE7Citjb25zdGV4cHIgaW50MzJfdCBIRVZDUHJvZmlsZU1haW4xMCAgICAgID0gMHgwMjsKK2NvbnN0ZXhwciBpbnQzMl90IEhFVkNQcm9maWxlTWFpblN0aWxsICAgPSAweDA0OworY29uc3RleHByIGludDMyX3QgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMCA9IDB4MTAwMDsKKworY29uc3RleHByIGludDMyX3QgSEVWQ01haW5UaWVyTGV2ZWwxICA9IDB4MTsKK2NvbnN0ZXhwciBpbnQzMl90IEhFVkNIaWdoVGllckxldmVsMSAgPSAweDI7Citjb25zdGV4cHIgaW50MzJfdCBIRVZDTWFpblRpZXJMZXZlbDIgID0gMHg0OworY29uc3RleHByIGludDMyX3QgSEVWQ0hpZ2hUaWVyTGV2ZWwyICA9IDB4ODsKK2NvbnN0ZXhwciBpbnQzMl90IEhFVkNNYWluVGllckxldmVsMjEgPSAweDEwOworY29uc3RleHByIGludDMyX3QgSEVWQ0hpZ2hUaWVyTGV2ZWwyMSA9IDB4MjA7Citjb25zdGV4cHIgaW50MzJfdCBIRVZDTWFpblRpZXJMZXZlbDMgID0gMHg0MDsKK2NvbnN0ZXhwciBpbnQzMl90IEhFVkNIaWdoVGllckxldmVsMyAgPSAweDgwOworY29uc3RleHByIGludDMyX3QgSEVWQ01haW5UaWVyTGV2ZWwzMSA9IDB4MTAwOworY29uc3RleHByIGludDMyX3QgSEVWQ0hpZ2hUaWVyTGV2ZWwzMSA9IDB4MjAwOworY29uc3RleHByIGludDMyX3QgSEVWQ01haW5UaWVyTGV2ZWw0ICA9IDB4NDAwOworY29uc3RleHByIGludDMyX3QgSEVWQ0hpZ2hUaWVyTGV2ZWw0ICA9IDB4ODAwOworY29uc3RleHByIGludDMyX3QgSEVWQ01haW5UaWVyTGV2ZWw0MSA9IDB4MTAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEhFVkNIaWdoVGllckxldmVsNDEgPSAweDIwMDA7Citjb25zdGV4cHIgaW50MzJfdCBIRVZDTWFpblRpZXJMZXZlbDUgID0gMHg0MDAwOworY29uc3RleHByIGludDMyX3QgSEVWQ0hpZ2hUaWVyTGV2ZWw1ICA9IDB4ODAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEhFVkNNYWluVGllckxldmVsNTEgPSAweDEwMDAwOworY29uc3RleHByIGludDMyX3QgSEVWQ0hpZ2hUaWVyTGV2ZWw1MSA9IDB4MjAwMDA7Citjb25zdGV4cHIgaW50MzJfdCBIRVZDTWFpblRpZXJMZXZlbDUyID0gMHg0MDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEhFVkNIaWdoVGllckxldmVsNTIgPSAweDgwMDAwOworY29uc3RleHByIGludDMyX3QgSEVWQ01haW5UaWVyTGV2ZWw2ICA9IDB4MTAwMDAwOworY29uc3RleHByIGludDMyX3QgSEVWQ0hpZ2hUaWVyTGV2ZWw2ICA9IDB4MjAwMDAwOworY29uc3RleHByIGludDMyX3QgSEVWQ01haW5UaWVyTGV2ZWw2MSA9IDB4NDAwMDAwOworY29uc3RleHByIGludDMyX3QgSEVWQ0hpZ2hUaWVyTGV2ZWw2MSA9IDB4ODAwMDAwOworY29uc3RleHByIGludDMyX3QgSEVWQ01haW5UaWVyTGV2ZWw2MiA9IDB4MTAwMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEhFVkNIaWdoVGllckxldmVsNjIgPSAweDIwMDAwMDA7CisKK2NvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZQZXIgPSAweDE7Citjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvblByb2ZpbGVEdmF2UGVuID0gMHgyOworY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25Qcm9maWxlRHZoZURlciA9IDB4NDsKK2NvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEZW4gPSAweDg7Citjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRyID0gMHgxMDsKK2NvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdG4gPSAweDIwOworY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25Qcm9maWxlRHZoZUR0aCA9IDB4NDA7Citjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRiID0gMHg4MDsKK2NvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdCA9IDB4MTAwOworY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlNlID0gMHgyMDA7CisKK2NvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uTGV2ZWxIZDI0ICAgID0gMHgxOworY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25MZXZlbEhkMzAgICAgPSAweDI7Citjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvbkxldmVsRmhkMjQgICA9IDB4NDsKK2NvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uTGV2ZWxGaGQzMCAgID0gMHg4OworY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25MZXZlbEZoZDYwICAgPSAweDEwOworY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25MZXZlbFVoZDI0ICAgPSAweDIwOworY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25MZXZlbFVoZDMwICAgPSAweDQwOworY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25MZXZlbFVoZDQ4ICAgPSAweDgwOworY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25MZXZlbFVoZDYwICAgPSAweDEwMDsKKworY29uc3RleHByIGludDMyX3QgQklUUkFURV9NT0RFX0NCUiA9IDI7Citjb25zdGV4cHIgaW50MzJfdCBCSVRSQVRFX01PREVfQ1EgPSAwOworY29uc3RleHByIGludDMyX3QgQklUUkFURV9NT0RFX1ZCUiA9IDE7CisKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdDEyYml0UkdCNDQ0ICAgICAgICAgICAgID0gMzsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdDE2Yml0QVJHQjE1NTUgICAgICAgICAgID0gNTsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdDE2Yml0QVJHQjQ0NDQgICAgICAgICAgID0gNDsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdDE2Yml0QkdSNTY1ICAgICAgICAgICAgID0gNzsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1ICAgICAgICAgICAgID0gNjsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdDE4Yml0QVJHQjE2NjUgICAgICAgICAgID0gOTsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdDE4Qml0QkdSNjY2ICAgICAgICAgICAgID0gNDE7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQxOGJpdFJHQjY2NiAgICAgICAgICAgICA9IDg7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQxOWJpdEFSR0IxNjY2ICAgICAgICAgICA9IDEwOworY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0MjRCaXRBQkdSNjY2NiAgICAgICAgICAgPSA0MzsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdDI0Yml0QVJHQjE4ODcgICAgICAgICAgID0gMTM7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQyNEJpdEFSR0I2NjY2ICAgICAgICAgICA9IDQyOworY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0MjRiaXRCR1I4ODggICAgICAgICAgICAgPSAxMjsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdDI0Yml0UkdCODg4ICAgICAgICAgICAgID0gMTE7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQyNWJpdEFSR0IxODg4ICAgICAgICAgICA9IDE0OworY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0MzJiaXRBQkdSODg4OCAgICAgICAgICAgPSAweDdGMDBBMDAwOworY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0MzJiaXRBUkdCODg4OCAgICAgICAgICAgPSAxNjsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODggICAgICAgICAgID0gMTU7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQ4Yml0UkdCMzMyICAgICAgICAgICAgICA9IDI7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXRDYllDclkgICAgICAgICAgICAgICAgICA9IDI3OworY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0Q3JZQ2JZICAgICAgICAgICAgICAgICAgPSAyODsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdEwxNiAgICAgICAgICAgICAgICAgICAgID0gMzY7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXRMMiAgICAgICAgICAgICAgICAgICAgICA9IDMzOworY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0TDI0ICAgICAgICAgICAgICAgICAgICAgPSAzNzsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdEwzMiAgICAgICAgICAgICAgICAgICAgID0gMzg7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXRMNCAgICAgICAgICAgICAgICAgICAgICA9IDM0OworY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0TDggICAgICAgICAgICAgICAgICAgICAgPSAzNTsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdE1vbm9jaHJvbWUgICAgICAgICAgICAgID0gMTsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdFJhd0JheWVyMTBiaXQgICAgICAgICAgID0gMzE7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXRSYXdCYXllcjhiaXQgICAgICAgICAgICA9IDMwOworY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0UmF3QmF5ZXI4Yml0Y29tcHJlc3NlZCAgPSAzMjsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdFJHQkFGbGV4aWJsZSAgICAgICAgICAgID0gMHg3RjM2QTg4ODsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdFJHQkZsZXhpYmxlICAgICAgICAgICAgID0gMHg3RjM2Qjg4ODsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdFN1cmZhY2UgICAgICAgICAgICAgICAgID0gMHg3RjAwMDc4OTsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdFlDYllDciAgICAgICAgICAgICAgICAgID0gMjU7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXRZQ3JZQ2IgICAgICAgICAgICAgICAgICA9IDI2OworY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0WVVWNDExUGFja2VkUGxhbmFyICAgICAgPSAxODsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdFlVVjQxMVBsYW5hciAgICAgICAgICAgID0gMTc7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZSAgICAgICAgICA9IDB4N0Y0MjA4ODg7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRQbGFuYXIgICAgICA9IDIwOworY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hciAgPSAzOTsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciAgICAgICAgICAgID0gMTk7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyICAgICAgICA9IDIxOworY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0WVVWNDIyRmxleGlibGUgICAgICAgICAgPSAweDdGNDIyODg4OworY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0WVVWNDIyUGFja2VkUGxhbmFyICAgICAgPSAyMzsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdFlVVjQyMlBhY2tlZFNlbWlQbGFuYXIgID0gNDA7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXRZVVY0MjJQbGFuYXIgICAgICAgICAgICA9IDIyOworY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0WVVWNDIyU2VtaVBsYW5hciAgICAgICAgPSAyNDsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdFlVVjQ0NEZsZXhpYmxlICAgICAgICAgID0gMHg3RjQ0NDg4ODsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdFlVVjQ0NEludGVybGVhdmVkICAgICAgID0gMjk7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9RQ09NX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIgICA9IDB4N2ZhMzBjMDA7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9USV9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyID0gMHg3ZjAwMDEwMDsKKworY29uc3RleHByIGNoYXIgRkVBVFVSRV9BZGFwdGl2ZVBsYXliYWNrW10gICAgICAgPSAiYWRhcHRpdmUtcGxheWJhY2siOworY29uc3RleHByIGNoYXIgRkVBVFVSRV9JbnRyYVJlZnJlc2hbXSA9ICJpbnRyYS1yZWZyZXNoIjsKK2NvbnN0ZXhwciBjaGFyIEZFQVRVUkVfUGFydGlhbEZyYW1lW10gPSAicGFydGlhbC1mcmFtZSI7Citjb25zdGV4cHIgY2hhciBGRUFUVVJFX1NlY3VyZVBsYXliYWNrW10gICAgICAgICA9ICJzZWN1cmUtcGxheWJhY2siOworY29uc3RleHByIGNoYXIgRkVBVFVSRV9UdW5uZWxlZFBsYXliYWNrW10gICAgICAgPSAidHVubmVsZWQtcGxheWJhY2siOworCisvLyBmcm9tIE1lZGlhRm9ybWF0LmphdmEKK2NvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX1ZJREVPX1ZQOFtdID0gInZpZGVvL3gtdm5kLm9uMi52cDgiOworY29uc3RleHByIGNoYXIgTUlNRVRZUEVfVklERU9fVlA5W10gPSAidmlkZW8veC12bmQub24yLnZwOSI7Citjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9WSURFT19BVkNbXSA9ICJ2aWRlby9hdmMiOworY29uc3RleHByIGNoYXIgTUlNRVRZUEVfVklERU9fSEVWQ1tdID0gInZpZGVvL2hldmMiOworY29uc3RleHByIGNoYXIgTUlNRVRZUEVfVklERU9fTVBFRzRbXSA9ICJ2aWRlby9tcDR2LWVzIjsKK2NvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX1ZJREVPX0gyNjNbXSA9ICJ2aWRlby8zZ3BwIjsKK2NvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX1ZJREVPX01QRUcyW10gPSAidmlkZW8vbXBlZzIiOworY29uc3RleHByIGNoYXIgTUlNRVRZUEVfVklERU9fUkFXW10gPSAidmlkZW8vcmF3IjsKK2NvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX1ZJREVPX0RPTEJZX1ZJU0lPTltdID0gInZpZGVvL2RvbGJ5LXZpc2lvbiI7Citjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9WSURFT19TQ1JBTUJMRURbXSA9ICJ2aWRlby9zY3JhbWJsZWQiOworCitjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9BVURJT19BTVJfTkJbXSA9ICJhdWRpby8zZ3BwIjsKK2NvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX0FVRElPX0FNUl9XQltdID0gImF1ZGlvL2Ftci13YiI7Citjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9BVURJT19NUEVHW10gPSAiYXVkaW8vbXBlZyI7Citjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9BVURJT19BQUNbXSA9ICJhdWRpby9tcDRhLWxhdG0iOworY29uc3RleHByIGNoYXIgTUlNRVRZUEVfQVVESU9fUUNFTFBbXSA9ICJhdWRpby9xY2VscCI7Citjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9BVURJT19WT1JCSVNbXSA9ICJhdWRpby92b3JiaXMiOworY29uc3RleHByIGNoYXIgTUlNRVRZUEVfQVVESU9fT1BVU1tdID0gImF1ZGlvL29wdXMiOworY29uc3RleHByIGNoYXIgTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXW10gPSAiYXVkaW8vZzcxMS1hbGF3IjsKK2NvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX0FVRElPX0c3MTFfTUxBV1tdID0gImF1ZGlvL2c3MTEtbWxhdyI7Citjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9BVURJT19SQVdbXSA9ICJhdWRpby9yYXciOworY29uc3RleHByIGNoYXIgTUlNRVRZUEVfQVVESU9fRkxBQ1tdID0gImF1ZGlvL2ZsYWMiOworY29uc3RleHByIGNoYXIgTUlNRVRZUEVfQVVESU9fTVNHU01bXSA9ICJhdWRpby9nc20iOworY29uc3RleHByIGNoYXIgTUlNRVRZUEVfQVVESU9fQUMzW10gPSAiYXVkaW8vYWMzIjsKK2NvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX0FVRElPX0VBQzNbXSA9ICJhdWRpby9lYWMzIjsKK2NvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX0FVRElPX1NDUkFNQkxFRFtdID0gImF1ZGlvL3NjcmFtYmxlZCI7CisKK2NvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQ1tdID0gImltYWdlL3ZuZC5hbmRyb2lkLmhlaWMiOworCitjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9URVhUX0NFQV82MDhbXSA9ICJ0ZXh0L2NlYS02MDgiOworY29uc3RleHByIGNoYXIgTUlNRVRZUEVfVEVYVF9DRUFfNzA4W10gPSAidGV4dC9jZWEtNzA4IjsKK2NvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX1RFWFRfU1VCUklQW10gPSAiYXBwbGljYXRpb24veC1zdWJyaXAiOworY29uc3RleHByIGNoYXIgTUlNRVRZUEVfVEVYVF9WVFRbXSA9ICJ0ZXh0L3Z0dCI7CisKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX1JBTkdFX0ZVTEwgPSAxOworY29uc3RleHByIGludDMyX3QgQ09MT1JfUkFOR0VfTElNSVRFRCA9IDI7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9TVEFOREFSRF9CVDIwMjAgPSA2OworY29uc3RleHByIGludDMyX3QgQ09MT1JfU1RBTkRBUkRfQlQ2MDFfTlRTQyA9IDQ7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9TVEFOREFSRF9CVDYwMV9QQUwgPSAyOworY29uc3RleHByIGludDMyX3QgQ09MT1JfU1RBTkRBUkRfQlQ3MDkgPSAxOworY29uc3RleHByIGludDMyX3QgQ09MT1JfVFJBTlNGRVJfSExHID0gNzsKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX1RSQU5TRkVSX0xJTkVBUiA9IDE7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9UUkFOU0ZFUl9TRFJfVklERU8gPSAzOworY29uc3RleHByIGludDMyX3QgQ09MT1JfVFJBTlNGRVJfU1QyMDg0ID0gNjsKKworY29uc3RleHByIGNoYXIgS0VZX0FBQ19EUkNfQVRURU5VQVRJT05fRkFDVE9SW10gPSAiYWFjLWRyYy1jdXQtbGV2ZWwiOworY29uc3RleHByIGNoYXIgS0VZX0FBQ19EUkNfQk9PU1RfRkFDVE9SW10gPSAiYWFjLWRyYy1ib29zdC1sZXZlbCI7Citjb25zdGV4cHIgY2hhciBLRVlfQUFDX0RSQ19FRkZFQ1RfVFlQRVtdID0gImFhYy1kcmMtZWZmZWN0LXR5cGUiOworY29uc3RleHByIGNoYXIgS0VZX0FBQ19EUkNfSEVBVllfQ09NUFJFU1NJT05bXSA9ICJhYWMtZHJjLWhlYXZ5LWNvbXByZXNzaW9uIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9BQUNfRFJDX1RBUkdFVF9SRUZFUkVOQ0VfTEVWRUxbXSA9ICJhYWMtdGFyZ2V0LXJlZi1sZXZlbCI7Citjb25zdGV4cHIgY2hhciBLRVlfQUFDX0VOQ09ERURfVEFSR0VUX0xFVkVMW10gPSAiYWFjLWVuY29kZWQtdGFyZ2V0LWxldmVsIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9BQUNfTUFYX09VVFBVVF9DSEFOTkVMX0NPVU5UW10gPSAiYWFjLW1heC1vdXRwdXQtY2hhbm5lbF9jb3VudCI7Citjb25zdGV4cHIgY2hhciBLRVlfQUFDX1BST0ZJTEVbXSA9ICJhYWMtcHJvZmlsZSI7Citjb25zdGV4cHIgY2hhciBLRVlfQUFDX1NCUl9NT0RFW10gPSAiYWFjLXNici1tb2RlIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9BVURJT19TRVNTSU9OX0lEW10gPSAiYXVkaW8tc2Vzc2lvbi1pZCI7Citjb25zdGV4cHIgY2hhciBLRVlfQklUX1JBVEVbXSA9ICJiaXRyYXRlIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9CSVRSQVRFX01PREVbXSA9ICJiaXRyYXRlLW1vZGUiOworY29uc3RleHByIGNoYXIgS0VZX0NBX1NFU1NJT05fSURbXSA9ICJjYS1zZXNzaW9uLWlkIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9DQV9TWVNURU1fSURbXSA9ICJjYS1zeXN0ZW0taWQiOworY29uc3RleHByIGNoYXIgS0VZX0NBUFRVUkVfUkFURVtdID0gImNhcHR1cmUtcmF0ZSI7Citjb25zdGV4cHIgY2hhciBLRVlfQ0hBTk5FTF9DT1VOVFtdID0gImNoYW5uZWwtY291bnQiOworY29uc3RleHByIGNoYXIgS0VZX0NIQU5ORUxfTUFTS1tdID0gImNoYW5uZWwtbWFzayI7Citjb25zdGV4cHIgY2hhciBLRVlfQ09MT1JfRk9STUFUW10gPSAiY29sb3ItZm9ybWF0IjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9DT0xPUl9SQU5HRVtdID0gImNvbG9yLXJhbmdlIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9DT0xPUl9TVEFOREFSRFtdID0gImNvbG9yLXN0YW5kYXJkIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9DT0xPUl9UUkFOU0ZFUltdID0gImNvbG9yLXRyYW5zZmVyIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9DT01QTEVYSVRZW10gPSAiY29tcGxleGl0eSI7Citjb25zdGV4cHIgY2hhciBLRVlfRFVSQVRJT05bXSA9ICJkdXJhdGlvblVzIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9GRUFUVVJFX1tdID0gImZlYXR1cmUtIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9GTEFDX0NPTVBSRVNTSU9OX0xFVkVMW10gPSAiZmxhYy1jb21wcmVzc2lvbi1sZXZlbCI7Citjb25zdGV4cHIgY2hhciBLRVlfRlJBTUVfUkFURVtdID0gImZyYW1lLXJhdGUiOworY29uc3RleHByIGNoYXIgS0VZX0dSSURfQ09MVU1OU1tdID0gImdyaWQtY29scyI7Citjb25zdGV4cHIgY2hhciBLRVlfR1JJRF9ST1dTW10gPSAiZ3JpZC1yb3dzIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9IRFJfU1RBVElDX0lORk9bXSA9ICJoZHItc3RhdGljLWluZm8iOworY29uc3RleHByIGNoYXIgS0VZX0hFSUdIVFtdID0gImhlaWdodCI7Citjb25zdGV4cHIgY2hhciBLRVlfSV9GUkFNRV9JTlRFUlZBTFtdID0gImktZnJhbWUtaW50ZXJ2YWwiOworY29uc3RleHByIGNoYXIgS0VZX0lOVFJBX1JFRlJFU0hfUEVSSU9EW10gPSAiaW50cmEtcmVmcmVzaC1wZXJpb2QiOworY29uc3RleHByIGNoYXIgS0VZX0lTX0FEVFNbXSA9ICJpcy1hZHRzIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9JU19BVVRPU0VMRUNUW10gPSAiaXMtYXV0b3NlbGVjdCI7Citjb25zdGV4cHIgY2hhciBLRVlfSVNfREVGQVVMVFtdID0gImlzLWRlZmF1bHQiOworY29uc3RleHByIGNoYXIgS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRVtdID0gImlzLWZvcmNlZC1zdWJ0aXRsZSI7Citjb25zdGV4cHIgY2hhciBLRVlfSVNfVElNRURfVEVYVFtdID0gImlzLXRpbWVkLXRleHQiOworY29uc3RleHByIGNoYXIgS0VZX0xBTkdVQUdFW10gPSAibGFuZ3VhZ2UiOworY29uc3RleHByIGNoYXIgS0VZX0xBVEVOQ1lbXSA9ICJsYXRlbmN5IjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9MRVZFTFtdID0gImxldmVsIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9NQVhfQklUX1JBVEVbXSA9ICJtYXgtYml0cmF0ZSI7Citjb25zdGV4cHIgY2hhciBLRVlfTUFYX0hFSUdIVFtdID0gIm1heC1oZWlnaHQiOworY29uc3RleHByIGNoYXIgS0VZX01BWF9JTlBVVF9TSVpFW10gPSAibWF4LWlucHV0LXNpemUiOworY29uc3RleHByIGNoYXIgS0VZX01BWF9XSURUSFtdID0gIm1heC13aWR0aCI7Citjb25zdGV4cHIgY2hhciBLRVlfTUlNRVtdID0gIm1pbWUiOworY29uc3RleHByIGNoYXIgS0VZX09QRVJBVElOR19SQVRFW10gPSAib3BlcmF0aW5nLXJhdGUiOworY29uc3RleHByIGNoYXIgS0VZX09VVFBVVF9SRU9SREVSX0RFUFRIW10gPSAib3V0cHV0LXJlb3JkZXItZGVwdGgiOworY29uc3RleHByIGNoYXIgS0VZX1BDTV9FTkNPRElOR1tdID0gInBjbS1lbmNvZGluZyI7Citjb25zdGV4cHIgY2hhciBLRVlfUFJJT1JJVFlbXSA9ICJwcmlvcml0eSI7Citjb25zdGV4cHIgY2hhciBLRVlfUFJPRklMRVtdID0gInByb2ZpbGUiOworY29uc3RleHByIGNoYXIgS0VZX1BVU0hfQkxBTktfQlVGRkVSU19PTl9TVE9QW10gPSAicHVzaC1ibGFuay1idWZmZXJzLW9uLXNodXRkb3duIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9RVUFMSVRZW10gPSAicXVhbGl0eSI7Citjb25zdGV4cHIgY2hhciBLRVlfUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0FGVEVSW10gPSAicmVwZWF0LXByZXZpb3VzLWZyYW1lLWFmdGVyIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9ST1RBVElPTltdID0gInJvdGF0aW9uLWRlZ3JlZXMiOworY29uc3RleHByIGNoYXIgS0VZX1NBTVBMRV9SQVRFW10gPSAic2FtcGxlLXJhdGUiOworY29uc3RleHByIGNoYXIgS0VZX1NMSUNFX0hFSUdIVFtdID0gInNsaWNlLWhlaWdodCI7Citjb25zdGV4cHIgY2hhciBLRVlfU1RSSURFW10gPSAic3RyaWRlIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9URU1QT1JBTF9MQVlFUklOR1tdID0gInRzLXNjaGVtYSI7Citjb25zdGV4cHIgY2hhciBLRVlfVElMRV9IRUlHSFRbXSA9ICJ0aWxlLWhlaWdodCI7Citjb25zdGV4cHIgY2hhciBLRVlfVElMRV9XSURUSFtdID0gInRpbGUtd2lkdGgiOworY29uc3RleHByIGNoYXIgS0VZX1RSQUNLX0lEW10gPSAidHJhY2staWQiOworY29uc3RleHByIGNoYXIgS0VZX1dJRFRIW10gPSAid2lkdGgiOworCisvLyBmcm9tIE1lZGlhQ29kZWMuamF2YQorY29uc3RleHByIGludDMyX3QgRVJST1JfSU5TVUZGSUNJRU5UX09VVFBVVF9QUk9URUNUSU9OID0gNDsKK2NvbnN0ZXhwciBpbnQzMl90IEVSUk9SX0lOU1VGRklDSUVOVF9SRVNPVVJDRSA9IDExMDA7Citjb25zdGV4cHIgaW50MzJfdCBFUlJPUl9LRVlfRVhQSVJFRCA9IDI7Citjb25zdGV4cHIgaW50MzJfdCBFUlJPUl9OT19LRVkgPSAxOworY29uc3RleHByIGludDMyX3QgRVJST1JfUkVDTEFJTUVEID0gMTEwMTsKK2NvbnN0ZXhwciBpbnQzMl90IEVSUk9SX1JFU09VUkNFX0JVU1kgPSAzOworY29uc3RleHByIGludDMyX3QgRVJST1JfU0VTU0lPTl9OT1RfT1BFTkVEID0gNTsKK2NvbnN0ZXhwciBpbnQzMl90IEVSUk9SX1VOU1VQUE9SVEVEX09QRVJBVElPTiA9IDY7Citjb25zdGV4cHIgY2hhciBDT0RFQ1tdID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5jb2RlYyI7Citjb25zdGV4cHIgY2hhciBFTkNPREVSW10gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmVuY29kZXIiOworY29uc3RleHByIGNoYXIgSEVJR0hUW10gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmhlaWdodCI7Citjb25zdGV4cHIgY2hhciBNSU1FX1RZUEVbXSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMubWltZSI7Citjb25zdGV4cHIgY2hhciBNT0RFW10gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLm1vZGUiOworY29uc3RleHByIGNoYXIgTU9ERV9BVURJT1tdID0gImF1ZGlvIjsKK2NvbnN0ZXhwciBjaGFyIE1PREVfVklERU9bXSA9ICJ2aWRlbyI7Citjb25zdGV4cHIgY2hhciBST1RBVElPTltdID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5yb3RhdGlvbiI7Citjb25zdGV4cHIgY2hhciBTRUNVUkVbXSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuc2VjdXJlIjsKK2NvbnN0ZXhwciBjaGFyIFdJRFRIW10gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLndpZHRoIjsKKworY29uc3RleHByIGludDMyX3QgQlVGRkVSX0ZMQUdfQ09ERUNfQ09ORklHID0gMjsKK2NvbnN0ZXhwciBpbnQzMl90IEJVRkZFUl9GTEFHX0VORF9PRl9TVFJFQU0gPSA0OworY29uc3RleHByIGludDMyX3QgQlVGRkVSX0ZMQUdfS0VZX0ZSQU1FID0gMTsKK2NvbnN0ZXhwciBpbnQzMl90IEJVRkZFUl9GTEFHX1BBUlRJQUxfRlJBTUUgPSA4OworY29uc3RleHByIGludDMyX3QgQlVGRkVSX0ZMQUdfU1lOQ19GUkFNRSA9IDE7Citjb25zdGV4cHIgaW50MzJfdCBDT05GSUdVUkVfRkxBR19FTkNPREUgPSAxOworY29uc3RleHByIGludDMyX3QgQ1JZUFRPX01PREVfQUVTX0NCQyAgICAgPSAyOworY29uc3RleHByIGludDMyX3QgQ1JZUFRPX01PREVfQUVTX0NUUiAgICAgPSAxOworY29uc3RleHByIGludDMyX3QgQ1JZUFRPX01PREVfVU5FTkNSWVBURUQgPSAwOworY29uc3RleHByIGludDMyX3QgSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEID0gLTM7Citjb25zdGV4cHIgaW50MzJfdCBJTkZPX09VVFBVVF9GT1JNQVRfQ0hBTkdFRCAgPSAtMjsKK2NvbnN0ZXhwciBpbnQzMl90IElORk9fVFJZX0FHQUlOX0xBVEVSICAgICAgICA9IC0xOworY29uc3RleHByIGludDMyX3QgVklERU9fU0NBTElOR19NT0RFX1NDQUxFX1RPX0ZJVCAgICAgICAgICAgICAgID0gMTsKK2NvbnN0ZXhwciBpbnQzMl90IFZJREVPX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19GSVRfV0lUSF9DUk9QUElORyA9IDI7Citjb25zdGV4cHIgY2hhciBQQVJBTUVURVJfS0VZX1JFUVVFU1RfU1lOQ19GUkFNRVtdID0gInJlcXVlc3Qtc3luYyI7Citjb25zdGV4cHIgY2hhciBQQVJBTUVURVJfS0VZX1NVU1BFTkRbXSA9ICJkcm9wLWlucHV0LWZyYW1lcyI7Citjb25zdGV4cHIgY2hhciBQQVJBTUVURVJfS0VZX1ZJREVPX0JJVFJBVEVbXSA9ICJ2aWRlby1iaXRyYXRlIjsKKworfQorCisjZW5kaWYgIC8vIE1FRElBX0NPREVDX0NPTlNUQU5UU19IXworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmgKaW5kZXggZjJiZDQ5Ni4uZTQ0YjBhNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaApAQCAtMTgsOCArMTgsMTEgQEAKIAogI2RlZmluZSBNRURJQV9DT0RFQ19MSVNUX0hfCiAKKyNpbmNsdWRlIDx2ZWN0b3I+CisKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY0xpc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjSW5mby5oPgogCkBAIC0zNSw4ICszOCw2IEBACiAKIHN0cnVjdCBBTWVzc2FnZTsKIAotc3RydWN0IE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2U7Ci0KIHN0cnVjdCBNZWRpYUNvZGVjTGlzdCA6IHB1YmxpYyBCbk1lZGlhQ29kZWNMaXN0IHsKICAgICBzdGF0aWMgc3A8SU1lZGlhQ29kZWNMaXN0PiBnZXRJbnN0YW5jZSgpOwogCkBAIC03Miw4ICs3Myw3IEBACiAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lLAogICAgICAgICAgICAgYm9vbCBjcmVhdGVFbmNvZGVyLAogICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCi0gICAgICAgICAgICBWZWN0b3I8QVN0cmluZz4gKm1hdGNoaW5nQ29kZWNzLAotICAgICAgICAgICAgVmVjdG9yPEFTdHJpbmc+ICpvd25lcnMgPSBudWxscHRyKTsKKyAgICAgICAgICAgIFZlY3RvcjxBU3RyaW5nPiAqbWF0Y2hpbmdDb2RlY3MpOwogCiAgICAgc3RhdGljIGJvb2wgaXNTb2Z0d2FyZUNvZGVjKGNvbnN0IEFTdHJpbmcgJmNvbXBvbmVudE5hbWUpOwogCkBAIC05NCw5ICs5NCw5IEBACiAKICAgICAvKioKICAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIHdpbGwgY2FsbCBgYnVpbGRNZWRpYUNvZGVjTGlzdCgpYCBmcm9tIHRoZSBnaXZlbgotICAgICAqIGBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlYCBvYmplY3QuCisgICAgICogYE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2VgIG9iamVjdHMuCiAgICAgICovCi0gICAgTWVkaWFDb2RlY0xpc3QoTWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZSogYnVpbGRlcik7CisgICAgTWVkaWFDb2RlY0xpc3Qoc3RkOjp2ZWN0b3I8TWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZSo+IGJ1aWxkZXJzKTsKIAogICAgIH5NZWRpYUNvZGVjTGlzdCgpOwogCkBAIC0xMDQsNjYgKzEwNCw2IEBACiAKICAgICBNZWRpYUNvZGVjTGlzdChjb25zdCBNZWRpYUNvZGVjTGlzdCYpID0gZGVsZXRlOwogICAgIE1lZGlhQ29kZWNMaXN0JiBvcGVyYXRvcj0oY29uc3QgTWVkaWFDb2RlY0xpc3QmKSA9IGRlbGV0ZTsKLQotICAgIGZyaWVuZCBNZWRpYUNvZGVjTGlzdFdyaXRlcjsKLX07Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB0byBiZSB1c2VkIGJ5IGEgYE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2VgIGluc3RhbmNlIHRvIGFkZAotICogaW5mb3JtYXRpb24gdG8gdGhlIGFzc29jaWF0ZWQgYE1lZGlhQ29kZWNMaXN0YCBvYmplY3QuCi0gKi8KLXN0cnVjdCBNZWRpYUNvZGVjTGlzdFdyaXRlciB7Ci0gICAgLyoqCi0gICAgICogQWRkIGEga2V5LXZhbHVlIHBhaXIgdG8gYSBgTWVkaWFDb2RlY0xpc3RgJ3MgZ2xvYmFsIHNldHRpbmdzLgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSBLZXkuCi0gICAgICogQHBhcmFtIHZhbHVlIFZhbHVlLgotICAgICAqLwotICAgIHZvaWQgYWRkR2xvYmFsU2V0dGluZyhjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gYWRkIGEgbmV3IGBNZWRpYUNvZGVjSW5mb2Agb2JqZWN0IHRvIGEgYE1lZGlhQ29kZWNMaXN0YCwgYW5kCi0gICAgICogcmV0dXJuIGEgYE1lZGlhQ29kZWNJbmZvV3JpdGVyYCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXdseSBhZGRlZAotICAgICAqIGBNZWRpYUNvZGVjSW5mb2AuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBgTWVkaWFDb2RlY0luZm9Xcml0ZXJgIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIG5ld2x5Ci0gICAgICogYWRkZWQgYE1lZGlhQ29kZWNJbmZvYCBvYmplY3QuCi0gICAgICovCi0gICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvV3JpdGVyPiBhZGRNZWRpYUNvZGVjSW5mbygpOwotcHJpdmF0ZToKLSAgICAvKioKLSAgICAgKiBUaGUgYXNzb2NpYXRlZCBgTWVkaWFDb2RlY0xpc3RgIG9iamVjdC4KLSAgICAgKi8KLSAgICBNZWRpYUNvZGVjTGlzdCogbUxpc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgdGhpcyB3cml0ZXIgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gYE1lZGlhQ29kZWNMaXN0YAotICAgICAqIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0IFRoZSAiYmFzZSIgYE1lZGlhQ29kZWNMaXN0YCBvYmplY3QuCi0gICAgICovCi0gICAgTWVkaWFDb2RlY0xpc3RXcml0ZXIoTWVkaWFDb2RlY0xpc3QqIGxpc3QpOwotCi0gICAgZnJpZW5kIE1lZGlhQ29kZWNMaXN0OwotfTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB0byBiZSB1c2VkIGJ5IGBNZWRpYUNvZGVjTGlzdGAgdG8gZmlsbCBpdHMgbWVtYmVycyB3aXRoCi0gKiBhcHByb3ByaWF0ZSBpbmZvcm1hdGlvbi4gYGJ1aWxkTWVkaWFDb2RlY0xpc3QoKWAgd2lsbCBiZSBjYWxsZWQgZnJvbSBhCi0gKiBgTWVkaWFDb2RlY0xpc3RgIG9iamVjdCBkdXJpbmcgaXRzIGNvbnN0cnVjdGlvbi4KLSAqLwotc3RydWN0IE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2UgewotICAgIC8qKgotICAgICAqIEJ1aWxkIHRoZSBgTWVkaWFDb2RlY0xpc3RgIHZpYSB0aGUgZ2l2ZW4gYE1lZGlhQ29kZWNMaXN0V3JpdGVyYCBpbnRlcmZhY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gd3JpdGVyIFRoZSB3cml0ZXIgaW50ZXJmYWNlLgotICAgICAqIEByZXR1cm4gVGhlIHN0YXR1cyBvZiB0aGUgY29uc3RydWN0aW9uLiBgTk9fRVJST1JgIG1lYW5zIHN1Y2Nlc3MuCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBidWlsZE1lZGlhQ29kZWNMaXN0KE1lZGlhQ29kZWNMaXN0V3JpdGVyKiB3cml0ZXIpID0gMDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IGRlc3RydWN0b3IgZG9lcyBub3RoaW5nLgotICAgICAqLwotICAgIHZpcnR1YWwgfk1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2UoKTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlmNTdjNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuaApAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0NPREVDX0xJU1RfV1JJVEVSX0hfCisKKyNkZWZpbmUgTUVESUFfQ09ERUNfTElTVF9XUklURVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdFdyaXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNJbmZvLmg+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHRvIGJlIHVzZWQgYnkgYSBgTWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZWAgaW5zdGFuY2UgdG8gYWRkCisgKiBpbmZvcm1hdGlvbiB0byB0aGUgZGVzdGluYXRpb24gYE1lZGlhQ29kZWNMaXN0YCBvYmplY3QuCisgKi8KK3N0cnVjdCBNZWRpYUNvZGVjTGlzdFdyaXRlciB7CisgICAgLyoqCisgICAgICogQWRkIGEga2V5LXZhbHVlIHBhaXIgdG8gYSBgTWVkaWFDb2RlY0xpc3RgJ3MgZ2xvYmFsIHNldHRpbmdzLgorICAgICAqCisgICAgICogQHBhcmFtIGtleSBLZXkuCisgICAgICogQHBhcmFtIHZhbHVlIFZhbHVlLgorICAgICAqLworICAgIHZvaWQgYWRkR2xvYmFsU2V0dGluZyhjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gYWRkIGEgbmV3IGBNZWRpYUNvZGVjSW5mb2Agb2JqZWN0IGZvciBhIGBNZWRpYUNvZGVjTGlzdGAsIGFuZAorICAgICAqIHJldHVybiBhIGBNZWRpYUNvZGVjSW5mb1dyaXRlcmAgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV3bHkgYWRkZWQKKyAgICAgKiBgTWVkaWFDb2RlY0luZm9gLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgYE1lZGlhQ29kZWNJbmZvV3JpdGVyYCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXdseQorICAgICAqIGFkZGVkIGBNZWRpYUNvZGVjSW5mb2Agb2JqZWN0LgorICAgICAqLworICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4gYWRkTWVkaWFDb2RlY0luZm8oKTsKK3ByaXZhdGU6CisgICAgTWVkaWFDb2RlY0xpc3RXcml0ZXIoKSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIHdyaXRlR2xvYmFsU2V0dGluZ3MoY29uc3Qgc3A8QU1lc3NhZ2U+ICZnbG9iYWxTZXR0aW5ncykgY29uc3Q7CisgICAgdm9pZCB3cml0ZUNvZGVjSW5mb3Moc3RkOjp2ZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+PiAqY29kZWNJbmZvcykgY29uc3Q7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gbUdsb2JhbFNldHRpbmdzOworICAgIHN0ZDo6dmVjdG9yPHNwPE1lZGlhQ29kZWNJbmZvPj4gbUNvZGVjSW5mb3M7CisKKyAgICBmcmllbmQgc3RydWN0IE1lZGlhQ29kZWNMaXN0OworfTsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBpcyB0byBiZSB1c2VkIGJ5IGBNZWRpYUNvZGVjTGlzdGAgdG8gZmlsbCBpdHMgbWVtYmVycyB3aXRoCisgKiBhcHByb3ByaWF0ZSBpbmZvcm1hdGlvbi4gYGJ1aWxkTWVkaWFDb2RlY0xpc3QoKWAgd2lsbCBiZSBjYWxsZWQgZnJvbSBhCisgKiBgTWVkaWFDb2RlY0xpc3RgIG9iamVjdCBkdXJpbmcgaXRzIGNvbnN0cnVjdGlvbi4KKyAqLworc3RydWN0IE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2UgeworICAgIC8qKgorICAgICAqIEJ1aWxkIHRoZSBgTWVkaWFDb2RlY0xpc3RgIHZpYSB0aGUgZ2l2ZW4gYE1lZGlhQ29kZWNMaXN0V3JpdGVyYCBpbnRlcmZhY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JpdGVyIFRoZSB3cml0ZXIgaW50ZXJmYWNlLgorICAgICAqIEByZXR1cm4gVGhlIHN0YXR1cyBvZiB0aGUgY29uc3RydWN0aW9uLiBgTk9fRVJST1JgIG1lYW5zIHN1Y2Nlc3MuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBidWlsZE1lZGlhQ29kZWNMaXN0KE1lZGlhQ29kZWNMaXN0V3JpdGVyKiB3cml0ZXIpID0gMDsKKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGRlc3RydWN0b3IgZG9lcyBub3RoaW5nLgorICAgICAqLworICAgIHZpcnR1YWwgfk1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2UoKSA9IGRlZmF1bHQ7CisKKyAgICB0eXBlZGVmIE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2UgKigqQ3JlYXRlQnVpbGRlckZ1bmMpKHZvaWQpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9DT0RFQ19MSVNUX1dSSVRFUl9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5oCmluZGV4IDNhYzUzOWUuLmE2OGNjMTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5oCkBAIC0xNywxMCArMTcsMTAgQEAKICNpZm5kZWYgTWVkaWFDb2RlY1NvdXJjZV9IXwogI2RlZmluZSBNZWRpYUNvZGVjU291cmNlX0hfCiAKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyUmVmbGVjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NdXRleGVkLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9QZXJzaXN0ZW50U3VyZmFjZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0zMCw3ICszMCw2IEBACiBzdHJ1Y3QgQVJlcGx5VG9rZW47CiBjbGFzcyBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwogc3RydWN0IE1lZGlhQ29kZWM7Ci1jbGFzcyBNZXRhRGF0YTsKIAogc3RydWN0IE1lZGlhQ29kZWNTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyIHsKQEAgLTU4LDEzICs1NywxMyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoTWV0YURhdGEgKnBhcmFtcyk7CiAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsCiAgICAgICAgICAgICBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RvcFRpbWVVcyhpbnQ2NF90IHN0b3BUaW1lVXMpOwogCiAKICAgICAvLyBNZWRpYUJ1ZmZlck9ic2VydmVyCi0gICAgdmlydHVhbCB2b2lkIHNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyICpidWZmZXIpOworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7CiAKICAgICAvLyBmb3IgQUhhbmRsZXJSZWZsZWN0b3IKICAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKQEAgLTEzNyw3ICsxMzYsNyBAQAogICAgIHNwPEFNZXNzYWdlPiBtRW5jb2RlckFjdGl2aXR5Tm90aWZ5OwogICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1HcmFwaGljQnVmZmVyUHJvZHVjZXI7CiAgICAgc3A8UGVyc2lzdGVudFN1cmZhY2U+IG1QZXJzaXN0ZW50U3VyZmFjZTsKLSAgICBMaXN0PE1lZGlhQnVmZmVyICo+IG1JbnB1dEJ1ZmZlclF1ZXVlOworICAgIExpc3Q8TWVkaWFCdWZmZXJCYXNlICo+IG1JbnB1dEJ1ZmZlclF1ZXVlOwogICAgIExpc3Q8c2l6ZV90PiBtQXZhaWxFbmNvZGVySW5wdXRJbmRpY2VzOwogICAgIExpc3Q8aW50NjRfdD4gbURlY29kaW5nVGltZVF1ZXVlOyAvLyBkZWNvZGluZyB0aW1lICh1cykgZm9yIHZpZGVvCiAgICAgaW50NjRfdCBtSW5wdXRCdWZmZXJUaW1lT2Zmc2V0VXM7CkBAIC0xNTAsNyArMTQ5LDcgQEAKIAogICAgIHN0cnVjdCBPdXRwdXQgewogICAgICAgICBPdXRwdXQoKTsKLSAgICAgICAgTGlzdDxNZWRpYUJ1ZmZlcio+IG1CdWZmZXJRdWV1ZTsKKyAgICAgICAgTGlzdDxNZWRpYUJ1ZmZlckJhc2UqPiBtQnVmZmVyUXVldWU7CiAgICAgICAgIGJvb2wgbUVuY29kZXJSZWFjaGVkRU9TOwogICAgICAgICBzdGF0dXNfdCBtRXJyb3JDb2RlOwogICAgICAgICBDb25kaXRpb24gbUNvbmQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaAppbmRleCAzNTlmYjY5Li5kMjBjNWRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmgKQEAgLTI2LDYgKzI2LDYgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgPG1lZGlhL01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CiAKICNlbmRpZiAgLy8gU1RBR0VGUklHSFRfTUVESUFfREVGU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWM3ZWFmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9FWFRSQUNUT1JfSF8KLQotI2RlZmluZSBNRURJQV9FWFRSQUNUT1JfSF8KLQotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1jbGFzcyBEYXRhU291cmNlOwotc3RydWN0IE1lZGlhU291cmNlOwotY2xhc3MgTWV0YURhdGE7Ci0KLWNsYXNzIE1lZGlhRXh0cmFjdG9yIDogcHVibGljIEJuTWVkaWFFeHRyYWN0b3IgewotcHVibGljOgotICAgIHN0YXRpYyBzcDxJTWVkaWFFeHRyYWN0b3I+IENyZWF0ZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUgPSBOVUxMKTsKLSAgICBzdGF0aWMgc3A8TWVkaWFFeHRyYWN0b3I+IENyZWF0ZUZyb21TZXJ2aWNlKAotICAgICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSA9IE5VTEwpOwotCi0gICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKSA9IDA7Ci0gICAgdmlydHVhbCBzcDxJTWVkaWFTb3VyY2U+IGdldFRyYWNrKHNpemVfdCBpbmRleCkgPSAwOwotCi0gICAgZW51bSBHZXRUcmFja01ldGFEYXRhRmxhZ3MgewotICAgICAgICBrSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhID0gMQotICAgIH07Ci0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MgPSAwKSA9IDA7Ci0KLSAgICAvLyBSZXR1cm4gY29udGFpbmVyIHNwZWNpZmljIG1ldGEtZGF0YS4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLSAgICAvLyByZXR1cm5zIGFuIGVtcHR5IG1ldGFkYXRhIG9iamVjdC4KLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRNZXRhRGF0YSgpOwotCi0gICAgc3RhdHVzX3QgZ2V0TWV0cmljcyhQYXJjZWwgKnJlcGx5KTsKLQotICAgIGVudW0gRmxhZ3MgewotICAgICAgICBDQU5fU0VFS19CQUNLV0FSRCAgPSAxLCAgLy8gdGhlICJzZWVrIDEwc2VjcyBiYWNrIGJ1dHRvbiIKLSAgICAgICAgQ0FOX1NFRUtfRk9SV0FSRCAgID0gMiwgIC8vIHRoZSAic2VlayAxMHNlY3MgZm9yd2FyZCBidXR0b24iCi0gICAgICAgIENBTl9QQVVTRSAgICAgICAgICA9IDQsCi0gICAgICAgIENBTl9TRUVLICAgICAgICAgICA9IDgsICAvLyB0aGUgInNlZWsgYmFyIgotICAgIH07Ci0KLSAgICAvLyBJZiBzdWJjbGFzc2VzIGRvIF9ub3RfIG92ZXJyaWRlIHRoaXMsIHRoZSBkZWZhdWx0IGlzCi0gICAgLy8gQ0FOX1NFRUtfQkFDS1dBUkQgfCBDQU5fU0VFS19GT1JXQVJEIHwgQ0FOX1NFRUsgfCBDQU5fUEFVU0UKLSAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7Ci0KLSAgICAvLyBmb3IgRFJNCi0gICAgdmlydHVhbCBjaGFyKiBnZXREcm1UcmFja0luZm8oc2l6ZV90IC8qdHJhY2tJRCovLCBpbnQgKiAvKmxlbiovKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0VUlEKHVpZF90IC8qdWlkKi8pIHsKLSAgICB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBISW50ZXJmYWNlVG9rZW4gJi8qY2FzVG9rZW4qLykgb3ZlcnJpZGUgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICI8dW5zcGVjaWZpZWQ+IjsgfQotCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSB7fQotCi1wcm90ZWN0ZWQ6Ci0gICAgTWVkaWFFeHRyYWN0b3IoKTsKLSAgICB2aXJ0dWFsIH5NZWRpYUV4dHJhY3RvcigpOwotCi0gICAgTWVkaWFBbmFseXRpY3NJdGVtICptQW5hbHl0aWNzSXRlbTsKLQotICAgIHZpcnR1YWwgdm9pZCBwb3B1bGF0ZU1ldHJpY3MoKTsKLQotcHJpdmF0ZToKLQotICAgIHR5cGVkZWYgYm9vbCAoKlNuaWZmZXJGdW5jKSgKLSAgICAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLAotICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsIHNwPEFNZXNzYWdlPiAqbWV0YSk7Ci0KLSAgICBzdGF0aWMgTXV0ZXggZ1NuaWZmZXJNdXRleDsKLSAgICBzdGF0aWMgTGlzdDxTbmlmZmVyRnVuYz4gZ1NuaWZmZXJzOwotICAgIHN0YXRpYyBib29sIGdTbmlmZmVyc1JlZ2lzdGVyZWQ7Ci0KLSAgICAvLyBUaGUgc25pZmZlciBjYW4gb3B0aW9uYWxseSBmaWxsIGluICJtZXRhIiB3aXRoIGFuIEFNZXNzYWdlIGNvbnRhaW5pbmcKLSAgICAvLyBhIGRpY3Rpb25hcnkgb2YgdmFsdWVzIHRoYXQgaGVscHMgdGhlIGNvcnJlc3BvbmRpbmcgZXh0cmFjdG9yIGluaXRpYWxpemUKLSAgICAvLyBpdHMgc3RhdGUgd2l0aG91dCBkdXBsaWNhdGluZyBlZmZvcnQgYWxyZWFkeSBleGVydGVkIGJ5IHRoZSBzbmlmZmVyLgotICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyU25pZmZlcl9sKFNuaWZmZXJGdW5jIGZ1bmMpOwotCi0gICAgc3RhdGljIGJvb2wgc25pZmYoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwKLSAgICAgICAgICAgIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwgc3A8QU1lc3NhZ2U+ICptZXRhKTsKLQotICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyRGVmYXVsdFNuaWZmZXJzKCk7Ci0KLSAgICBNZWRpYUV4dHJhY3Rvcihjb25zdCBNZWRpYUV4dHJhY3RvciAmKTsKLSAgICBNZWRpYUV4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhRXh0cmFjdG9yICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNRURJQV9FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiOWY1YmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0VYVFJBQ1RPUl9GQUNUT1JZX0hfCisKKyNkZWZpbmUgTUVESUFfRVhUUkFDVE9SX0ZBQ1RPUllfSF8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEYXRhU291cmNlOworc3RydWN0IEV4dHJhY3RvclBsdWdpbjsKKworY2xhc3MgTWVkaWFFeHRyYWN0b3JGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgc3A8SU1lZGlhRXh0cmFjdG9yPiBDcmVhdGUoCisgICAgICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBjb25zdCBjaGFyICptaW1lID0gTlVMTCk7CisgICAgc3RhdGljIHNwPElNZWRpYUV4dHJhY3Rvcj4gQ3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBjb25zdCBjaGFyICptaW1lID0gTlVMTCk7CisgICAgc3RhdGljIHZvaWQgTG9hZFBsdWdpbnMoY29uc3QgOjpzdGQ6OnN0cmluZyYgYXBrUGF0aCk7CisgICAgc3RhdGljIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgTXV0ZXggZ1BsdWdpbk11dGV4OworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8TGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+Pj4gZ1BsdWdpbnM7CisgICAgc3RhdGljIGJvb2wgZ1BsdWdpbnNSZWdpc3RlcmVkOworCisgICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJFeHRyYWN0b3JzSW5BcGsoCisgICAgICAgICAgICBjb25zdCBjaGFyICphcGtQYXRoLCBMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KTsKKyAgICBzdGF0aWMgdm9pZCBSZWdpc3RlckV4dHJhY3RvcnNJblN5c3RlbSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxpYkRpclBhdGgsIExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpOworICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyRXh0cmFjdG9yKAorICAgICAgICAgICAgY29uc3Qgc3A8RXh0cmFjdG9yUGx1Z2luPiAmcGx1Z2luLCBMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KTsKKworICAgIHN0YXRpYyBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgc25pZmYoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLCB2b2lkICoqbWV0YSwgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqZnJlZU1ldGEsCisgICAgICAgICAgICBzcDxFeHRyYWN0b3JQbHVnaW4+ICZwbHVnaW4pOworCisgICAgc3RhdGljIHZvaWQgVXBkYXRlRXh0cmFjdG9ycyhjb25zdCBjaGFyICpuZXdVcGRhdGVBcGtQYXRoKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfRVhUUkFDVE9SX0ZBQ1RPUllfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFGaWx0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFGaWx0ZXIuaAppbmRleCAwYzEwZDExLi5hMjhjNDlkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRmlsdGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUZpbHRlci5oCkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgICAgICAgICBPV05FRF9CWV9VUFNUUkVBTSwKICAgICAgICAgfTsKIAotICAgICAgICBJT01YOjpidWZmZXJfaWQgbUJ1ZmZlcklEOworICAgICAgICB1aW50MzJfdCBtQnVmZmVySUQ7CiAgICAgICAgIGludDMyX3QgbUdlbmVyYXRpb247CiAgICAgICAgIGludDMyX3QgbU91dHB1dEZsYWdzOwogICAgICAgICBTdGF0dXMgbVN0YXR1czsKQEAgLTEyMSw3ICsxMjEsNyBAQAogCiAgICAgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXJzT25Qb3J0KE9NWF9VMzIgcG9ydEluZGV4KTsKICAgICBCdWZmZXJJbmZvICpmaW5kQnVmZmVyQnlJRCgKLSAgICAgICAgICAgIHVpbnQzMl90IHBvcnRJbmRleCwgSU9NWDo6YnVmZmVyX2lkIGJ1ZmZlcklELAorICAgICAgICAgICAgdWludDMyX3QgcG9ydEluZGV4LCB1aW50MzJfdCBidWZmZXJJRCwKICAgICAgICAgICAgIHNzaXplX3QgKmluZGV4ID0gTlVMTCk7CiAgICAgdm9pZCBwb3N0RmlsbFRoaXNCdWZmZXIoQnVmZmVySW5mbyAqaW5mbyk7CiAgICAgdm9pZCBwb3N0RHJhaW5UaGlzQnVmZmVyKEJ1ZmZlckluZm8gKmluZm8pOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmgKaW5kZXggMDA2ZDhkOC4uZmUwZTYxMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oCkBAIC0yNCwxMCArMjQsMTAgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgSU1lZGlhSFRUUENvbm5lY3Rpb247CitzdHJ1Y3QgTWVkaWFIVFRQQ29ubmVjdGlvbjsKIAogc3RydWN0IE1lZGlhSFRUUCA6IHB1YmxpYyBIVFRQQmFzZSB7Ci0gICAgTWVkaWFIVFRQKGNvbnN0IHNwPElNZWRpYUhUVFBDb25uZWN0aW9uPiAmY29ubik7CisgICAgTWVkaWFIVFRQKGNvbnN0IHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+ICZjb25uKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdCgKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKQEAgLTUwLDEzICs1MCwxMiBAQAogICAgIHZpcnR1YWwgfk1lZGlhSFRUUCgpOwogCiAgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyKiBtaW1lKTsKLSAgICB2aXJ0dWFsIHZvaWQgZ2V0RHJtSW5mbyhzcDxEZWNyeXB0SGFuZGxlPiAmaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KTsKICAgICB2aXJ0dWFsIFN0cmluZzggZ2V0VXJpKCk7CiAgICAgdmlydHVhbCBTdHJpbmc4IGdldE1JTUVUeXBlKCkgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKLSAgICBzcDxJTWVkaWFIVFRQQ29ubmVjdGlvbj4gbUhUVFBDb25uZWN0aW9uOworICAgIHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+IG1IVFRQQ29ubmVjdGlvbjsKIAogICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1MYXN0SGVhZGVyczsKICAgICBBU3RyaW5nIG1MYXN0VVJJOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaAppbmRleCA2M2MzY2E1Li42NmY0ZDcyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaApAQCAtNDgsNiArNDgsNyBAQAogICAgICAgICBPVVRQVVRfRk9STUFUX01QRUdfNCAgICAgID0gMCwKICAgICAgICAgT1VUUFVUX0ZPUk1BVF9XRUJNICAgICAgICA9IDEsCiAgICAgICAgIE9VVFBVVF9GT1JNQVRfVEhSRUVfR1BQICAgPSAyLAorICAgICAgICBPVVRQVVRfRk9STUFUX0hFSUYgICAgICAgID0gMywKICAgICAgICAgT1VUUFVUX0ZPUk1BVF9MSVNUX0VORCAvLyBtdXN0IGJlIGxhc3QgLSB1c2VkIHRvIHZhbGlkYXRlIGZvcm1hdCB0eXBlCiAgICAgfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGFkYjA1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9TT1VSQ0VfSF8KLQotI2RlZmluZSBNRURJQV9TT1VSQ0VfSF8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTWVkaWFCdWZmZXI7Ci1jbGFzcyBNZXRhRGF0YTsKLQotc3RydWN0IE1lZGlhU291cmNlIDogcHVibGljIEJuTWVkaWFTb3VyY2UgewotICAgIE1lZGlhU291cmNlKCk7Ci0KLSAgICAvLyBUbyBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBtZXRob2RzIG9uIHRoaXMgb2JqZWN0LCBleGNlcHQKLSAgICAvLyBnZXRGb3JtYXQoKS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKSA9IDA7Ci0KLSAgICAvLyBBbnkgYmxvY2tpbmcgcmVhZCBjYWxsIHJldHVybnMgaW1tZWRpYXRlbHkgd2l0aCBhIHJlc3VsdCBvZiBOT19JTklULgotICAgIC8vIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgYW55IG1ldGhvZHMgb3RoZXIgdGhhbiBzdGFydCBhZnRlciB0aGlzIGNhbGwKLSAgICAvLyByZXR1cm5zLiBBbnkgYnVmZmVycyB0aGUgb2JqZWN0IG1heSBiZSBob2xkaW5nIG9udG8gYXQgdGhlIHRpbWUgb2YKLSAgICAvLyB0aGUgc3RvcCgpIGNhbGwgYXJlIHJlbGVhc2VkLgotICAgIC8vIEFsc28sIGl0IGlzIGltcGVyYXRpdmUgdGhhdCBhbnkgYnVmZmVycyBvdXRwdXQgYnkgdGhpcyBvYmplY3QgYW5kCi0gICAgLy8gaGVsZCBvbnRvIGJ5IGNhbGxlcnMgYmUgcmVsZWFzZWQgYmVmb3JlIGEgY2FsbCB0byBzdG9wKCkgISEhCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgPSAwOwotCi0gICAgLy8gUmV0dXJucyB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhIG91dHB1dCBieSB0aGlzIG1lZGlhIHNvdXJjZS4KLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKSA9IDA7Ci0KLSAgICAvLyBSZXR1cm5zIGEgbmV3IGJ1ZmZlciBvZiBkYXRhLiBDYWxsIGJsb2NrcyB1bnRpbCBhCi0gICAgLy8gYnVmZmVyIGlzIGF2YWlsYWJsZSwgYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQgb2YgdGhlIGVuZCBvZiB0aGUgc3RyZWFtCi0gICAgLy8gaXMgcmVhY2hlZC4KLSAgICAvLyBFbmQgb2Ygc3RyZWFtIGlzIHNpZ25hbGxlZCBieSBhIHJlc3VsdCBvZiBFUlJPUl9FTkRfT0ZfU1RSRUFNLgotICAgIC8vIEEgcmVzdWx0IG9mIElORk9fRk9STUFUX0NIQU5HRUQgaW5kaWNhdGVzIHRoYXQgdGhlIGZvcm1hdCBvZiB0aGlzCi0gICAgLy8gTWVkaWFTb3VyY2UgaGFzIGNoYW5nZWQgbWlkLXN0cmVhbSwgdGhlIGNsaWVudCBjYW4gY29udGludWUgcmVhZGluZwotICAgIC8vIGJ1dCBzaG91bGQgYmUgcHJlcGFyZWQgZm9yIGJ1ZmZlcnMgb2YgdGhlIG5ldyBjb25maWd1cmF0aW9uLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpID0gMDsKLQotICAgIC8vIENhdXNlcyB0aGlzIHNvdXJjZSB0byBzdXNwZW5kIHB1bGxpbmcgZGF0YSBmcm9tIGl0cyB1cHN0cmVhbSBzb3VyY2UKLSAgICAvLyB1bnRpbCBhIHN1YnNlcXVlbnQgcmVhZC13aXRoLXNlZWsuIFRoaXMgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQKLSAgICAvLyBhcyBzdWNoIGJ5IGFueSBzb3VyY2UuIEUuZy4gTWVkaWFDb2RlY1NvdXJjZSBkb2VzIG5vdCBzdXNwZW5kIGl0cwotICAgIC8vIHVwc3RyZWFtIHNvdXJjZSwgYW5kIGluc3RlYWQgZGlzY2FyZCB1cHN0cmVhbSBkYXRhIHdoaWxlIHBhdXNlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCkgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgLy8gVGhlIGNvbnN1bWVyIG9mIHRoaXMgbWVkaWEgc291cmNlIHJlcXVlc3RzIHRoYXQgdGhlIGdpdmVuIGJ1ZmZlcnMKLSAgICAvLyBhcmUgdG8gYmUgcmV0dXJuZWQgZXhjbHVzaXZlbHkgaW4gcmVzcG9uc2UgdG8gcmVhZCBjYWxscy4KLSAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBzdGFydCgpIGFuZCBiZWZvcmUgdGhlCi0gICAgLy8gZmlyc3QgcmVhZCgpIGNhbGwuCi0gICAgLy8gQ2FsbGVlIGFzc3VtZXMgb3duZXJzaGlwIG9mIHRoZSBidWZmZXJzIGlmIG5vIGVycm9yIGlzIHJldHVybmVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVycyhjb25zdCBWZWN0b3I8TWVkaWFCdWZmZXIgKj4gJiAvKiBidWZmZXJzICovKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICAvLyBUaGUgY29uc3VtZXIgb2YgdGhpcyBtZWRpYSBzb3VyY2UgcmVxdWVzdHMgdGhlIHNvdXJjZSBzdG9wcyBzZW5kaW5nCi0gICAgLy8gYnVmZmVycyB3aXRoIHRpbWVzdGFtcCBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byBzdG9wVGltZVVzLiBzdG9wVGltZVVzCi0gICAgLy8gbXVzdCBiZSBpbiB0aGUgc2FtZSB0aW1lIGJhc2UgYXMgdGhlIHN0YXJ0VGltZSBwYXNzZWQgaW4gc3RhcnQoKS4gSWYKLSAgICAvLyBzb3VyY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIHJlcXVlc3QsIEVSUk9SX1VOU1VQUE9SVEVEIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgLy8gSWYgc3RvcFRpbWVVcyBpcyBpbnZhbGlkLCBCQURfVkFMVUUgd2lsbCBiZSByZXR1cm5lZC4gVGhpcyBjb3VsZCBiZQotICAgIC8vIGNhbGxlZCBhdCBhbnkgdGltZSBldmVuIGJlZm9yZSBzb3VyY2Ugc3RhcnRzIGFuZCBpdCBjb3VsZCBiZSBjYWxsZWQKLSAgICAvLyBtdWx0aXBsZSB0aW1lcy4gU2V0dGluZyBzdG9wVGltZVVzIHRvIGJlIC0xIHdpbGwgZWZmZWN0aXZlbHkgY2FuY2VsIHRoZSBzdG9wVGltZVVzCi0gICAgLy8gc2V0IHByZXZpb3VzbHkuIElmIHN0b3BUaW1lVXMgaXMgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gbGFzdCBidWZmZXIncyB0aW1lc3RhbXAsCi0gICAgLy8gc291cmNlIHdpbGwgc3RhcnQgdG8gZHJvcCBidWZmZXIgd2hlbiBpdCBnZXRzIGEgYnVmZmVyIHdpdGggdGltZXN0YW1wIGxhcmdlcgotICAgIC8vIHRoYW4gb3IgZXF1YWwgdG8gc3RvcFRpbWVVcy4gSWYgc3RvcFRpbWVVcyBpcyBzbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG8gbGFzdAotICAgIC8vIGJ1ZmZlcidzIHRpbWVzdGFtcCwgc291cmNlIHdpbGwgZHJvcCBhbGwgdGhlIGluY29taW5nIGJ1ZmZlcnMgaW1tZWRpYXRlbHkuCi0gICAgLy8gQWZ0ZXIgc2V0dGluZyBzdG9wVGltZVVzLCBzb3VyY2UgbWF5IHN0aWxsIHN0b3Agc2VuZGluZyBidWZmZXJzIHdpdGggdGltZXN0YW1wCi0gICAgLy8gbGVzcyB0aGFuIHN0b3BUaW1lVXMgaWYgaXQgaXMgc3RvcHBlZCBieSB0aGUgY29uc3VtZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdG9wVGltZVVzKGludDY0X3QgLyogc3RvcFRpbWVVcyAqLykgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+TWVkaWFTb3VyY2UoKTsKLQotcHJpdmF0ZToKLSAgICBNZWRpYVNvdXJjZShjb25zdCBNZWRpYVNvdXJjZSAmKTsKLSAgICBNZWRpYVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhU291cmNlICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNRURJQV9TT1VSQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaAppbmRleCBjZDRhZjRkLi4yYzEyYTg3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhV3JpdGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVdyaXRlci5oCkBAIC0xOSwyMCArMTksMTggQEAKICNkZWZpbmUgTUVESUFfV1JJVEVSX0hfCiAKICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFSZWNvcmRlckNsaWVudC5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVNvdXJjZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIE1ldGFEYXRhOwotCiBzdHJ1Y3QgTWVkaWFXcml0ZXIgOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgTWVkaWFXcml0ZXIoKQogICAgICAgICA6IG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMoMCksCiAgICAgICAgICAgbU1heEZpbGVEdXJhdGlvbkxpbWl0VXMoMCkgewogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlKGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKSA9IDA7CiAgICAgdmlydHVhbCBib29sIHJlYWNoZWRFT1MoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIxMTNmNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVUQV9EQVRBX0hfCi0KLSNkZWZpbmUgTUVUQV9EQVRBX0hfCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBUaGUgZm9sbG93aW5nIGtleXMgbWFwIHRvIGludDMyX3QgZGF0YSB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLWVudW0gewotICAgIGtLZXlNSU1FVHlwZSAgICAgICAgICA9ICdtaW1lJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5V2lkdGggICAgICAgICAgICAgPSAnd2lkdCcsICAvLyBpbnQzMl90LCBpbWFnZSBwaXhlbAotICAgIGtLZXlIZWlnaHQgICAgICAgICAgICA9ICdoZWlnJywgIC8vIGludDMyX3QsIGltYWdlIHBpeGVsCi0gICAga0tleURpc3BsYXlXaWR0aCAgICAgID0gJ2RXaWQnLCAgLy8gaW50MzJfdCwgZGlzcGxheS9wcmVzZW50YXRpb24KLSAgICBrS2V5RGlzcGxheUhlaWdodCAgICAgPSAnZEhndCcsICAvLyBpbnQzMl90LCBkaXNwbGF5L3ByZXNlbnRhdGlvbgotICAgIGtLZXlTQVJXaWR0aCAgICAgICAgICA9ICdzYXJXJywgIC8vIGludDMyX3QsIHNhbXBsZUFzcGVjdFJhdGlvIHdpZHRoCi0gICAga0tleVNBUkhlaWdodCAgICAgICAgID0gJ3NhckgnLCAgLy8gaW50MzJfdCwgc2FtcGxlQXNwZWN0UmF0aW8gaGVpZ2h0Ci0gICAga0tleVRodW1ibmFpbFdpZHRoICAgID0gJ3RoYlcnLCAgLy8gaW50MzJfdCwgdGh1bWJuYWlsIHdpZHRoCi0gICAga0tleVRodW1ibmFpbEhlaWdodCAgID0gJ3RoYkgnLCAgLy8gaW50MzJfdCwgdGh1bWJuYWlsIGhlaWdodAotCi0gICAgLy8gYSByZWN0YW5nbGUsIGlmIGFic2VudCBhc3N1bWVkIHRvIGJlICgwLCAwLCB3aWR0aCAtIDEsIGhlaWdodCAtIDEpCi0gICAga0tleUNyb3BSZWN0ICAgICAgICAgID0gJ2Nyb3AnLAotCi0gICAga0tleVJvdGF0aW9uICAgICAgICAgID0gJ3JvdEEnLCAgLy8gaW50MzJfdCAoYW5nbGUgaW4gZGVncmVlcykKLSAgICBrS2V5SUZyYW1lc0ludGVydmFsICAgPSAnaWZpdicsICAvLyBpbnQzMl90Ci0gICAga0tleVN0cmlkZSAgICAgICAgICAgID0gJ3N0cmQnLCAgLy8gaW50MzJfdAotICAgIGtLZXlTbGljZUhlaWdodCAgICAgICA9ICdzbGh0JywgIC8vIGludDMyX3QKLSAgICBrS2V5Q2hhbm5lbENvdW50ICAgICAgPSAnI2NobicsICAvLyBpbnQzMl90Ci0gICAga0tleUNoYW5uZWxNYXNrICAgICAgID0gJ2Nobm0nLCAgLy8gaW50MzJfdAotICAgIGtLZXlTYW1wbGVSYXRlICAgICAgICA9ICdzcnRlJywgIC8vIGludDMyX3QgKGF1ZGlvIHNhbXBsaW5nIHJhdGUgSHopCi0gICAga0tleVBjbUVuY29kaW5nICAgICAgID0gJ1BDTWUnLCAgLy8gaW50MzJfdCAoYXVkaW8gZW5jb2RpbmcgZW51bSkKLSAgICBrS2V5RnJhbWVSYXRlICAgICAgICAgPSAnZnJtUicsICAvLyBpbnQzMl90ICh2aWRlbyBmcmFtZSByYXRlIGZwcykKLSAgICBrS2V5Qml0UmF0ZSAgICAgICAgICAgPSAnYnJ0ZScsICAvLyBpbnQzMl90IChicHMpCi0gICAga0tleU1heEJpdFJhdGUgICAgICAgID0gJ214QnInLCAgLy8gaW50MzJfdCAoYnBzKQotICAgIGtLZXlTdHJlYW1IZWFkZXIgICAgICA9ICdzdEhkJywgIC8vIHJhdyBkYXRhCi0gICAga0tleUVTRFMgICAgICAgICAgICAgID0gJ2VzZHMnLCAgLy8gcmF3IGRhdGEKLSAgICBrS2V5QUFDUHJvZmlsZSAgICAgICAgPSAnYWFjcCcsICAvLyBpbnQzMl90Ci0gICAga0tleUFWQ0MgICAgICAgICAgICAgID0gJ2F2Y2MnLCAgLy8gcmF3IGRhdGEKLSAgICBrS2V5SFZDQyAgICAgICAgICAgICAgPSAnaHZjYycsICAvLyByYXcgZGF0YQotICAgIGtLZXlUaHVtYm5haWxIVkNDICAgICA9ICd0aHZjJywgIC8vIHJhdyBkYXRhCi0gICAga0tleUQyNjMgICAgICAgICAgICAgID0gJ2QyNjMnLCAgLy8gcmF3IGRhdGEKLSAgICBrS2V5Vm9yYmlzSW5mbyAgICAgICAgPSAndmluZicsICAvLyByYXcgZGF0YQotICAgIGtLZXlWb3JiaXNCb29rcyAgICAgICA9ICd2Ym9vJywgIC8vIHJhdyBkYXRhCi0gICAga0tleU9wdXNIZWFkZXIgICAgICAgID0gJ29oZHInLCAgLy8gcmF3IGRhdGEKLSAgICBrS2V5T3B1c0NvZGVjRGVsYXkgICAgPSAnb2NvZCcsICAvLyB1aW50NjRfdCAoY29kZWMgZGVsYXkgaW4gbnMpCi0gICAga0tleU9wdXNTZWVrUHJlUm9sbCAgID0gJ29zcHInLCAgLy8gdWludDY0X3QgKHNlZWsgcHJlcm9sbCBpbiBucykKLSAgICBrS2V5RmxhY01ldGFkYXRhICAgICAgPSAnZmxNZCcsICAvLyByYXcgZGF0YQotICAgIGtLZXlWcDlDb2RlY1ByaXZhdGUgICA9ICd2cDlwJywgIC8vIHJhdyBkYXRhICh2cDkgY3NkIGluZm9ybWF0aW9uKQotICAgIGtLZXlXYW50c05BTEZyYWdtZW50cyA9ICdOQUxmJywKLSAgICBrS2V5SXNTeW5jRnJhbWUgICAgICAgPSAnc3luYycsICAvLyBpbnQzMl90IChib29sKQotICAgIGtLZXlJc0NvZGVjQ29uZmlnICAgICA9ICdjb25mJywgIC8vIGludDMyX3QgKGJvb2wpCi0gICAga0tleVRpbWUgICAgICAgICAgICAgID0gJ3RpbWUnLCAgLy8gaW50NjRfdCAodXNlY3MpCi0gICAga0tleURlY29kaW5nVGltZSAgICAgID0gJ2RlY1QnLCAgLy8gaW50NjRfdCAoZGVjb2RpbmcgdGltZXN0YW1wIGluIHVzZWNzKQotICAgIGtLZXlOVFBUaW1lICAgICAgICAgICA9ICdudHBUJywgIC8vIHVpbnQ2NF90IChudHAtdGltZXN0YW1wKQotICAgIGtLZXlUYXJnZXRUaW1lICAgICAgICA9ICd0YXJUJywgIC8vIGludDY0X3QgKHVzZWNzKQotICAgIGtLZXlEcmlmdFRpbWUgICAgICAgICA9ICdkZnRUJywgIC8vIGludDY0X3QgKHVzZWNzKQotICAgIGtLZXlBbmNob3JUaW1lICAgICAgICA9ICdhbmNUJywgIC8vIGludDY0X3QgKHVzZWNzKQotICAgIGtLZXlEdXJhdGlvbiAgICAgICAgICA9ICdkdXJhJywgIC8vIGludDY0X3QgKHVzZWNzKQotICAgIGtLZXlQaXhlbEZvcm1hdCAgICAgICA9ICdwaXhmJywgIC8vIGludDMyX3QKLSAgICBrS2V5Q29sb3JGb3JtYXQgICAgICAgPSAnY29sZicsICAvLyBpbnQzMl90Ci0gICAga0tleUNvbG9yU3BhY2UgICAgICAgID0gJ2NvbHMnLCAgLy8gaW50MzJfdAotICAgIGtLZXlQbGF0Zm9ybVByaXZhdGUgICA9ICdwcml2JywgIC8vIHBvaW50ZXIKLSAgICBrS2V5RGVjb2RlckNvbXBvbmVudCAgPSAnZGVjQycsICAvLyBjc3RyaW5nCi0gICAga0tleUJ1ZmZlcklEICAgICAgICAgID0gJ2JmSUQnLAotICAgIGtLZXlNYXhJbnB1dFNpemUgICAgICA9ICdpbnBTJywKLSAgICBrS2V5TWF4V2lkdGggICAgICAgICAgPSAnbWF4VycsCi0gICAga0tleU1heEhlaWdodCAgICAgICAgID0gJ21heEgnLAotICAgIGtLZXlUaHVtYm5haWxUaW1lICAgICA9ICd0aGJUJywgIC8vIGludDY0X3QgKHVzZWNzKQotICAgIGtLZXlUcmFja0lEICAgICAgICAgICA9ICd0cklEJywKLSAgICBrS2V5SXNEUk0gICAgICAgICAgICAgPSAnaWRybScsICAvLyBpbnQzMl90IChib29sKQotICAgIGtLZXlFbmNvZGVyRGVsYXkgICAgICA9ICdlbmNkJywgIC8vIGludDMyX3QgKGZyYW1lcykKLSAgICBrS2V5RW5jb2RlclBhZGRpbmcgICAgPSAnZW5jcCcsICAvLyBpbnQzMl90IChmcmFtZXMpCi0KLSAgICBrS2V5QWxidW0gICAgICAgICAgICAgPSAnYWxidScsICAvLyBjc3RyaW5nCi0gICAga0tleUFydGlzdCAgICAgICAgICAgID0gJ2FydGknLCAgLy8gY3N0cmluZwotICAgIGtLZXlBbGJ1bUFydGlzdCAgICAgICA9ICdhYXJ0JywgIC8vIGNzdHJpbmcKLSAgICBrS2V5Q29tcG9zZXIgICAgICAgICAgPSAnY29tcCcsICAvLyBjc3RyaW5nCi0gICAga0tleUdlbnJlICAgICAgICAgICAgID0gJ2dlbnInLCAgLy8gY3N0cmluZwotICAgIGtLZXlUaXRsZSAgICAgICAgICAgICA9ICd0aXRsJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5WWVhciAgICAgICAgICAgICAgPSAneWVhcicsICAvLyBjc3RyaW5nCi0gICAga0tleUFsYnVtQXJ0ICAgICAgICAgID0gJ2FsYkEnLCAgLy8gY29tcHJlc3NlZCBpbWFnZSBkYXRhCi0gICAga0tleUFsYnVtQXJ0TUlNRSAgICAgID0gJ2FsQU0nLCAgLy8gY3N0cmluZwotICAgIGtLZXlBdXRob3IgICAgICAgICAgICA9ICdhdXRoJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5Q0RUcmFja051bWJlciAgICAgPSAnY2R0cicsICAvLyBjc3RyaW5nCi0gICAga0tleURpc2NOdW1iZXIgICAgICAgID0gJ2RudW0nLCAgLy8gY3N0cmluZwotICAgIGtLZXlEYXRlICAgICAgICAgICAgICA9ICdkYXRlJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5V3JpdGVyICAgICAgICAgICAgPSAnd3JpdCcsICAvLyBjc3RyaW5nCi0gICAga0tleUNvbXBpbGF0aW9uICAgICAgID0gJ2NwaWwnLCAgLy8gY3N0cmluZwotICAgIGtLZXlMb2NhdGlvbiAgICAgICAgICA9ICdsb2MgJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5VGltZVNjYWxlICAgICAgICAgPSAndG1zbCcsICAvLyBpbnQzMl90Ci0gICAga0tleUNhcHR1cmVGcmFtZXJhdGUgID0gJ2NhcEYnLCAgLy8gZmxvYXQgKGNhcHR1cmUgZnBzKQotCi0gICAgLy8gdmlkZW8gcHJvZmlsZSBhbmQgbGV2ZWwKLSAgICBrS2V5VmlkZW9Qcm9maWxlICAgICAgPSAndnByZicsICAvLyBpbnQzMl90Ci0gICAga0tleVZpZGVvTGV2ZWwgICAgICAgID0gJ3ZsZXYnLCAgLy8gaW50MzJfdAotCi0gICAgLy8gU2V0IHRoaXMga2V5IHRvIGVuYWJsZSBhdXRob3JpbmcgZmlsZXMgaW4gNjQtYml0IG9mZnNldAotICAgIGtLZXk2NEJpdEZpbGVPZmZzZXQgICA9ICdmb2J0JywgIC8vIGludDMyX3QgKGJvb2wpCi0gICAga0tleTJCeXRlTmFsTGVuZ3RoICAgID0gJzJOQUwnLCAgLy8gaW50MzJfdCAoYm9vbCkKLQotICAgIC8vIElkZW50aWZ5IHRoZSBmaWxlIG91dHB1dCBmb3JtYXQgZm9yIGF1dGhvcmluZwotICAgIC8vIFBsZWFzZSBzZWUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4gZm9yIHRoZSBzdXBwb3J0ZWQKLSAgICAvLyBmaWxlIG91dHB1dCBmb3JtYXRzLgotICAgIGtLZXlGaWxlVHlwZSAgICAgICAgICA9ICdmdHlwJywgIC8vIGludDMyX3QKLQotICAgIC8vIFRyYWNrIGF1dGhvcmluZyBwcm9ncmVzcyBzdGF0dXMKLSAgICAvLyBrS2V5VHJhY2tUaW1lU3RhdHVzIGlzIHVzZWQgdG8gdHJhY2sgcHJvZ3Jlc3MgaW4gZWxhcHNlZCB0aW1lCi0gICAga0tleVRyYWNrVGltZVN0YXR1cyAgID0gJ3RrdG0nLCAgLy8gaW50NjRfdAotCi0gICAga0tleVJlYWxUaW1lUmVjb3JkaW5nID0gJ3J0cmMnLCAgLy8gYm9vbCAoaW50MzJfdCkKLSAgICBrS2V5TnVtQnVmZmVycyAgICAgICAgPSAnbmJiZicsICAvLyBpbnQzMl90Ci0KLSAgICAvLyBPZ2cgZmlsZXMgY2FuIGJlIHRhZ2dlZCB0byBiZSBhdXRvbWF0aWNhbGx5IGxvb3BpbmcuLi4KLSAgICBrS2V5QXV0b0xvb3AgICAgICAgICAgPSAnYXV0TCcsICAvLyBib29sIChpbnQzMl90KQotCi0gICAga0tleVZhbGlkU2FtcGxlcyAgICAgID0gJ3ZhbEQnLCAgLy8gaW50MzJfdAotCi0gICAga0tleUlzVW5yZWFkYWJsZSAgICAgID0gJ3VucmUnLCAgLy8gYm9vbCAoaW50MzJfdCkKLQotICAgIC8vIEFuIGluZGljYXRpb24gdGhhdCBhIHZpZGVvIGJ1ZmZlciBoYXMgYmVlbiByZW5kZXJlZC4KLSAgICBrS2V5UmVuZGVyZWQgICAgICAgICAgPSAncmVuZCcsICAvLyBib29sIChpbnQzMl90KQotCi0gICAgLy8gVGhlIGxhbmd1YWdlIGNvZGUgZm9yIHRoaXMgbWVkaWEKLSAgICBrS2V5TWVkaWFMYW5ndWFnZSAgICAgPSAnbGFuZycsICAvLyBjc3RyaW5nCi0KLSAgICAvLyBUbyBzdG9yZSB0aGUgdGltZWQgdGV4dCBmb3JtYXQgZGF0YQotICAgIGtLZXlUZXh0Rm9ybWF0RGF0YSAgICA9ICd0ZXh0JywgIC8vIHJhdyBkYXRhCi0KLSAgICBrS2V5UmVxdWlyZXNTZWN1cmVCdWZmZXJzID0gJ3NlY3UnLCAgLy8gYm9vbCAoaW50MzJfdCkKLQotICAgIGtLZXlJc0FEVFMgICAgICAgICAgICA9ICdhZHRzJywgIC8vIGJvb2wgKGludDMyX3QpCi0gICAga0tleUFBQ0FPVCAgICAgICAgICAgID0gJ2Fhb3QnLCAgLy8gaW50MzJfdAotCi0gICAgLy8gSWYgYSBNZWRpYUJ1ZmZlcidzIGRhdGEgcmVwcmVzZW50cyAoYXQgbGVhc3QgcGFydGlhbGx5KSBlbmNyeXB0ZWQKLSAgICAvLyBkYXRhLCB0aGUgZm9sbG93aW5nIGZpZWxkcyBhaWQgaW4gZGVjcnlwdGlvbi4KLSAgICAvLyBUaGUgZGF0YSBjYW4gYmUgdGhvdWdodCBvZiBhcyBwYWlycyBvZiBwbGFpbiBhbmQgZW5jcnlwdGVkIGRhdGEKLSAgICAvLyBmcmFnbWVudHMsIGkuZS4gcGxhaW4gYW5kIGVuY3J5cHRlZCBkYXRhIGFsdGVybmF0ZS4KLSAgICAvLyBUaGUgZmlyc3QgZnJhZ21lbnQgaXMgYnkgY29udmVudGlvbiBwbGFpbiBkYXRhIChpZiB0aGF0J3Mgbm90IHRoZQotICAgIC8vIGNhc2UsIHNpbXBseSBzcGVjaWZ5IHBsYWluIGZyYWdtZW50IHNpemUgb2YgMCkuCi0gICAgLy8ga0tleUVuY3J5cHRlZFNpemVzIGFuZCBrS2V5UGxhaW5TaXplcyBlYWNoIG1hcCB0byBhbiBhcnJheSBvZgotICAgIC8vIHNpemVfdCB2YWx1ZXMuIFRoZSBzdW0gdG90YWwgb2YgYWxsIHNpemVfdCB2YWx1ZXMgb2YgYm90aCBhcnJheXMKLSAgICAvLyBtdXN0IGVxdWFsIHRoZSBhbW91bnQgb2YgZGF0YSAoaS5lLiBNZWRpYUJ1ZmZlcidzIHJhbmdlX2xlbmd0aCgpKS4KLSAgICAvLyBJZiBib3RoIGFycmF5cyBhcmUgcHJlc2VudCwgdGhleSBtdXN0IGJlIG9mIHRoZSBzYW1lIHNpemUuCi0gICAgLy8gSWYgb25seSBlbmNyeXB0ZWQgc2l6ZXMgYXJlIHByZXNlbnQgaXQgaXMgYXNzdW1lZCB0aGF0IGFsbAotICAgIC8vIHBsYWluIHNpemVzIGFyZSAwLCBpLmUuIGFsbCBmcmFnbWVudHMgYXJlIGVuY3J5cHRlZC4KLSAgICAvLyBUbyBwcm9ncmFtbWF0aWNhbGx5IHNldCB0aGVzZSBhcnJheSwgdXNlIHRoZSBNZXRhRGF0YTo6c2V0RGF0YSBBUEksIGkuZS4KLSAgICAvLyBjb25zdCBzaXplX3QgZW5jU2l6ZXNbXTsKLSAgICAvLyBtZXRhLT5zZXREYXRhKAotICAgIC8vICBrS2V5RW5jcnlwdGVkU2l6ZXMsIDAgLyogdHlwZSAqLywgZW5jU2l6ZXMsIHNpemVvZihlbmNTaXplcykpOwotICAgIC8vIEEgcGxhaW4gc2l6ZXMgYXJyYXkgYnkgaXRzZWxmIG1ha2VzIG5vIHNlbnNlLgotICAgIGtLZXlFbmNyeXB0ZWRTaXplcyAgICA9ICdlbmNyJywgIC8vIHNpemVfdFtdCi0gICAga0tleVBsYWluU2l6ZXMgICAgICAgID0gJ3BsYWknLCAgLy8gc2l6ZV90W10KLSAgICBrS2V5Q3J5cHRvS2V5ICAgICAgICAgPSAnY3J5SycsICAvLyB1aW50OF90WzE2XQotICAgIGtLZXlDcnlwdG9JViAgICAgICAgICA9ICdjcnlJJywgIC8vIHVpbnQ4X3RbMTZdCi0gICAga0tleUNyeXB0b01vZGUgICAgICAgID0gJ2NyeU0nLCAgLy8gaW50MzJfdAotCi0gICAga0tleUNyeXB0b0RlZmF1bHRJVlNpemUgPSAnY3J5UycsICAvLyBpbnQzMl90Ci0KLSAgICBrS2V5UHNzaCAgICAgICAgICAgICAgPSAncHNzaCcsICAvLyByYXcgZGF0YQotICAgIGtLZXlDQVN5c3RlbUlEICAgICAgICA9ICdjYWlkJywgIC8vIGludDMyX3QKLSAgICBrS2V5Q0FTZXNzaW9uSUQgICAgICAgPSAnc2VpZCcsICAvLyByYXcgZGF0YQotCi0gICAgLy8gUGxlYXNlIHNlZSBNZWRpYUZvcm1hdC5LRVlfSVNfQVVUT1NFTEVDVC4KLSAgICBrS2V5VHJhY2tJc0F1dG9zZWxlY3QgPSAnYXV0bycsIC8vIGJvb2wgKGludDMyX3QpCi0gICAgLy8gUGxlYXNlIHNlZSBNZWRpYUZvcm1hdC5LRVlfSVNfREVGQVVMVC4KLSAgICBrS2V5VHJhY2tJc0RlZmF1bHQgICAgPSAnZGZsdCcsIC8vIGJvb2wgKGludDMyX3QpCi0gICAgLy8gU2ltaWxhciB0byBNZWRpYUZvcm1hdC5LRVlfSVNfRk9SQ0VEX1NVQlRJVExFIGJ1dCBwZXJ0YWlucyB0byBhdiB0cmFja3MgYXMgd2VsbC4KLSAgICBrS2V5VHJhY2tJc0ZvcmNlZCAgICAgPSAnZnJjZCcsIC8vIGJvb2wgKGludDMyX3QpCi0KLSAgICAvLyBIMjY0IHN1cHBsZW1lbnRhbCBlbmhhbmNlbWVudCBpbmZvcm1hdGlvbiBvZmZzZXRzL3NpemVzCi0gICAga0tleVNFSSAgICAgICAgICAgICAgID0gJ3NlaSAnLCAvLyByYXcgZGF0YQotCi0gICAgLy8gTVBFRyB1c2VyIGRhdGEgb2Zmc2V0cwotICAgIGtLZXlNcGVnVXNlckRhdGEgICAgICA9ICdtcHVkJywgLy8gc2l6ZV90W10KLQotICAgIC8vIFNpemUgb2YgTkFMVSBsZW5ndGggaW4gbWt2L21wNAotICAgIGtLZXlOYWxMZW5ndGhTaXplICAgICA9ICduYWxzJywgLy8gaW50MzJfdAotCi0gICAgLy8gSERSIHJlbGF0ZWQKLSAgICBrS2V5SGRyU3RhdGljSW5mbyAgICA9ICdoZHJTJywgLy8gSERSU3RhdGljSW5mbwotCi0gICAgLy8gY29sb3IgYXNwZWN0cwotICAgIGtLZXlDb2xvclJhbmdlICAgICAgID0gJ2NSbmcnLCAvLyBpbnQzMl90LCBjb2xvciByYW5nZSwgdmFsdWUgZGVmaW5lZCBieSBDb2xvckFzcGVjdHMuUmFuZ2UKLSAgICBrS2V5Q29sb3JQcmltYXJpZXMgICA9ICdjUHJtJywgLy8gaW50MzJfdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sb3IgUHJpbWFyaWVzLCB2YWx1ZSBkZWZpbmVkIGJ5IENvbG9yQXNwZWN0cy5QcmltYXJpZXMKLSAgICBrS2V5VHJhbnNmZXJGdW5jdGlvbiA9ICd0RnVuJywgLy8gaW50MzJfdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhbnNmZXIgRnVuY3Rpb24sIHZhbHVlIGRlZmluZWQgYnkgQ29sb3JBc3BlY3RzLlRyYW5zZmVyLgotICAgIGtLZXlDb2xvck1hdHJpeCAgICAgID0gJ2NNdHgnLCAvLyBpbnQzMl90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xvciBNYXRyaXgsIHZhbHVlIGRlZmluZWQgYnkgQ29sb3JBc3BlY3RzLk1hdHJpeENvZWZmcy4KLSAgICBrS2V5VGVtcG9yYWxMYXllcklkICA9ICdpTHlyJywgLy8gaW50MzJfdCwgdGVtcG9yYWwgbGF5ZXItaWQuIDAtYmFzZWQgKDAgPT4gYmFzZSBsYXllcikKLSAgICBrS2V5VGVtcG9yYWxMYXllckNvdW50ID0gJ2NMeXInLCAvLyBpbnQzMl90LCBudW1iZXIgb2YgdGVtcG9yYWwgbGF5ZXJzIGVuY29kZWQKLQotICAgIGtLZXlHcmlkV2lkdGggICAgICAgID0gJ2dyZFcnLCAvLyBpbnQzMl90LCBIRUlGIGdyaWQgd2lkdGgKLSAgICBrS2V5R3JpZEhlaWdodCAgICAgICA9ICdncmRIJywgLy8gaW50MzJfdCwgSEVJRiBncmlkIGhlaWdodAotICAgIGtLZXlHcmlkUm93cyAgICAgICAgID0gJ2dyZFInLCAvLyBpbnQzMl90LCBIRUlGIGdyaWQgcm93cwotICAgIGtLZXlHcmlkQ29scyAgICAgICAgID0gJ2dyZEMnLCAvLyBpbnQzMl90LCBIRUlGIGdyaWQgY29sdW1ucwotICAgIGtLZXlJY2NQcm9maWxlICAgICAgID0gJ3Byb2YnLCAvLyByYXcgZGF0YSwgSUNDIHByaWZpbGUgZGF0YQotfTsKLQotZW51bSB7Ci0gICAga1R5cGVFU0RTICAgICAgICA9ICdlc2RzJywKLSAgICBrVHlwZUFWQ0MgICAgICAgID0gJ2F2Y2MnLAotICAgIGtUeXBlSFZDQyAgICAgICAgPSAnaHZjYycsCi0gICAga1R5cGVEMjYzICAgICAgICA9ICdkMjYzJywKLX07Ci0KLWNsYXNzIE1ldGFEYXRhIDogcHVibGljIFJlZkJhc2UgewotcHVibGljOgotICAgIE1ldGFEYXRhKCk7Ci0gICAgTWV0YURhdGEoY29uc3QgTWV0YURhdGEgJmZyb20pOwotCi0gICAgZW51bSBUeXBlIHsKLSAgICAgICAgVFlQRV9OT05FICAgICA9ICdub25lJywKLSAgICAgICAgVFlQRV9DX1NUUklORyA9ICdjc3RyJywKLSAgICAgICAgVFlQRV9JTlQzMiAgICA9ICdpbjMyJywKLSAgICAgICAgVFlQRV9JTlQ2NCAgICA9ICdpbjY0JywKLSAgICAgICAgVFlQRV9GTE9BVCAgICA9ICdmbG9hJywKLSAgICAgICAgVFlQRV9QT0lOVEVSICA9ICdwdHIgJywKLSAgICAgICAgVFlQRV9SRUNUICAgICA9ICdyZWN0JywKLSAgICB9OwotCi0gICAgdm9pZCBjbGVhcigpOwotICAgIGJvb2wgcmVtb3ZlKHVpbnQzMl90IGtleSk7Ci0KLSAgICBib29sIHNldENTdHJpbmcodWludDMyX3Qga2V5LCBjb25zdCBjaGFyICp2YWx1ZSk7Ci0gICAgYm9vbCBzZXRJbnQzMih1aW50MzJfdCBrZXksIGludDMyX3QgdmFsdWUpOwotICAgIGJvb2wgc2V0SW50NjQodWludDMyX3Qga2V5LCBpbnQ2NF90IHZhbHVlKTsKLSAgICBib29sIHNldEZsb2F0KHVpbnQzMl90IGtleSwgZmxvYXQgdmFsdWUpOwotICAgIGJvb2wgc2V0UG9pbnRlcih1aW50MzJfdCBrZXksIHZvaWQgKnZhbHVlKTsKLQotICAgIGJvb2wgc2V0UmVjdCgKLSAgICAgICAgICAgIHVpbnQzMl90IGtleSwKLSAgICAgICAgICAgIGludDMyX3QgbGVmdCwgaW50MzJfdCB0b3AsCi0gICAgICAgICAgICBpbnQzMl90IHJpZ2h0LCBpbnQzMl90IGJvdHRvbSk7Ci0KLSAgICBib29sIGZpbmRDU3RyaW5nKHVpbnQzMl90IGtleSwgY29uc3QgY2hhciAqKnZhbHVlKTsKLSAgICBib29sIGZpbmRJbnQzMih1aW50MzJfdCBrZXksIGludDMyX3QgKnZhbHVlKTsKLSAgICBib29sIGZpbmRJbnQ2NCh1aW50MzJfdCBrZXksIGludDY0X3QgKnZhbHVlKTsKLSAgICBib29sIGZpbmRGbG9hdCh1aW50MzJfdCBrZXksIGZsb2F0ICp2YWx1ZSk7Ci0gICAgYm9vbCBmaW5kUG9pbnRlcih1aW50MzJfdCBrZXksIHZvaWQgKip2YWx1ZSk7Ci0KLSAgICBib29sIGZpbmRSZWN0KAotICAgICAgICAgICAgdWludDMyX3Qga2V5LAotICAgICAgICAgICAgaW50MzJfdCAqbGVmdCwgaW50MzJfdCAqdG9wLAotICAgICAgICAgICAgaW50MzJfdCAqcmlnaHQsIGludDMyX3QgKmJvdHRvbSk7Ci0KLSAgICBib29sIHNldERhdGEodWludDMyX3Qga2V5LCB1aW50MzJfdCB0eXBlLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICBib29sIGZpbmREYXRhKHVpbnQzMl90IGtleSwgdWludDMyX3QgKnR5cGUsCi0gICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICoqZGF0YSwgc2l6ZV90ICpzaXplKSBjb25zdDsKLQotICAgIGJvb2wgaGFzRGF0YSh1aW50MzJfdCBrZXkpIGNvbnN0OwotCi0gICAgU3RyaW5nOCB0b1N0cmluZygpIGNvbnN0OwotICAgIHZvaWQgZHVtcFRvTG9nKCkgY29uc3Q7Ci0KLSAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAmcGFyY2VsKTsKLSAgICBzdGF0dXNfdCB1cGRhdGVGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKTsKLSAgICBzdGF0aWMgc3A8TWV0YURhdGE+IGNyZWF0ZUZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+TWV0YURhdGEoKTsKLQotcHJpdmF0ZToKLSAgICBzdHJ1Y3QgdHlwZWRfZGF0YSB7Ci0gICAgICAgIHR5cGVkX2RhdGEoKTsKLSAgICAgICAgfnR5cGVkX2RhdGEoKTsKLQotICAgICAgICB0eXBlZF9kYXRhKGNvbnN0IE1ldGFEYXRhOjp0eXBlZF9kYXRhICYpOwotICAgICAgICB0eXBlZF9kYXRhICZvcGVyYXRvcj0oY29uc3QgTWV0YURhdGE6OnR5cGVkX2RhdGEgJik7Ci0KLSAgICAgICAgdm9pZCBjbGVhcigpOwotICAgICAgICB2b2lkIHNldERhdGEodWludDMyX3QgdHlwZSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwotICAgICAgICB2b2lkIGdldERhdGEodWludDMyX3QgKnR5cGUsIGNvbnN0IHZvaWQgKipkYXRhLCBzaXplX3QgKnNpemUpIGNvbnN0OwotICAgICAgICAvLyBtYXkgaW5jbHVkZSBoZXhkdW1wIG9mIGJpbmFyeSBkYXRhIGlmIHZlcmJvc2U9dHJ1ZQotICAgICAgICBTdHJpbmc4IGFzU3RyaW5nKGJvb2wgdmVyYm9zZSkgY29uc3Q7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICB1aW50MzJfdCBtVHlwZTsKLSAgICAgICAgc2l6ZV90IG1TaXplOwotCi0gICAgICAgIHVuaW9uIHsKLSAgICAgICAgICAgIHZvaWQgKmV4dF9kYXRhOwotICAgICAgICAgICAgZmxvYXQgcmVzZXJ2b2lyOwotICAgICAgICB9IHU7Ci0KLSAgICAgICAgYm9vbCB1c2VzUmVzZXJ2b2lyKCkgY29uc3QgewotICAgICAgICAgICAgcmV0dXJuIG1TaXplIDw9IHNpemVvZih1LnJlc2Vydm9pcik7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkICphbGxvY2F0ZVN0b3JhZ2Uoc2l6ZV90IHNpemUpOwotICAgICAgICB2b2lkIGZyZWVTdG9yYWdlKCk7Ci0KLSAgICAgICAgdm9pZCAqc3RvcmFnZSgpIHsKLSAgICAgICAgICAgIHJldHVybiB1c2VzUmVzZXJ2b2lyKCkgPyAmdS5yZXNlcnZvaXIgOiB1LmV4dF9kYXRhOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3Qgdm9pZCAqc3RvcmFnZSgpIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiB1c2VzUmVzZXJ2b2lyKCkgPyAmdS5yZXNlcnZvaXIgOiB1LmV4dF9kYXRhOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHN0cnVjdCBSZWN0IHsKLSAgICAgICAgaW50MzJfdCBtTGVmdCwgbVRvcCwgbVJpZ2h0LCBtQm90dG9tOwotICAgIH07Ci0KLSAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgdHlwZWRfZGF0YT4gbUl0ZW1zOwotCi0gICAgLy8gTWV0YURhdGEgJm9wZXJhdG9yPShjb25zdCBNZXRhRGF0YSAmKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTUVUQV9EQVRBX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMTYwZjhkMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi8uLi9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4xZTEyMTkzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi8uLi9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWE4MDgwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRVRBX0RBVEFfVVRJTFNfSF8KKworI2RlZmluZSBNRVRBX0RBVEFfVVRJTFNfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFCdWZmZXI7Citib29sIE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKK2Jvb2wgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSwgdW5zaWduZWQgcHJvZmlsZSwgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCwKKyAgICAgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uKTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRVRBX0RBVEFfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTmRrVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTmRrVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjg4ODRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OZGtVdGlscy5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE5ES19VVElMU19IXworCisjZGVmaW5lIE5ES19VVElMU19IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtXcmFwcGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3A8TWV0YURhdGE+IGNvbnZlcnRNZWRpYUZvcm1hdFdyYXBwZXJUb01ldGFEYXRhKAorICAgICAgICBjb25zdCBzcDxBTWVkaWFGb3JtYXRXcmFwcGVyPiAmZm10KTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBOREtfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmgKaW5kZXggNmE5M2JkNS4uNTRhNzA5NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmgKQEAgLTE3LDkgKzE3LDExIEBACiAjaWZuZGVmIE5VX01FRElBX0VYVFJBQ1RPUl9IXwogI2RlZmluZSBOVV9NRURJQV9FWFRSQUNUT1JfSF8KIAorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgpAQCAtMzIsNyArMzQsNyBAQAogc3RydWN0IEFCdWZmZXI7CiBzdHJ1Y3QgQU1lc3NhZ2U7CiBjbGFzcyBEYXRhU291cmNlOwotc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOworc3RydWN0IE1lZGlhSFRUUFNlcnZpY2U7CiBjbGFzcyBNZWRpYUJ1ZmZlcjsKIGNsYXNzIE1lZGlhRXh0cmFjdG9yOwogc3RydWN0IE1lZGlhU291cmNlOwpAQCAtNTIsNyArNTQsNyBAQAogICAgIE51TWVkaWFFeHRyYWN0b3IoKTsKIAogICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqcGF0aCwKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCk7CiAKQEAgLTYyLDEyICs2NCwxOCBAQAogCiAgICAgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgSEludGVyZmFjZVRva2VuICZjYXNUb2tlbik7CiAKKyAgICB2b2lkIGRpc2Nvbm5lY3QoKTsKKwogICAgIHNpemVfdCBjb3VudFRyYWNrcygpIGNvbnN0OwogICAgIHN0YXR1c190IGdldFRyYWNrRm9ybWF0KHNpemVfdCBpbmRleCwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQsIHVpbnQzMl90IGZsYWdzID0gMCkgY29uc3Q7CiAKICAgICBzdGF0dXNfdCBnZXRGaWxlRm9ybWF0KHNwPEFNZXNzYWdlPiAqZm9ybWF0KSBjb25zdDsKIAotICAgIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgc3RhdHVzX3QgZ2V0RXhpZk9mZnNldFNpemUob2ZmNjRfdCAqb2Zmc2V0LCBzaXplX3QgKnNpemUpIGNvbnN0OworCisgICAgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IGluZGV4LCBpbnQ2NF90IHN0YXJ0VGltZVVzID0gLTFsbCwKKyAgICAgICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZSA9CisgICAgICAgICAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQyk7CiAgICAgc3RhdHVzX3QgdW5zZWxlY3RUcmFjayhzaXplX3QgaW5kZXgpOwogCiAgICAgc3RhdHVzX3Qgc2Vla1RvKApAQCAtNzUsOCArODMsMTMgQEAKICAgICAgICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZSA9CiAgICAgICAgICAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQyk7CiAKKyAgICAvLyBFYWNoIHNlbGVjdGVkIHRyYWNrIGhhcyBhIHJlYWQgcG9pbnRlci4KKyAgICAvLyBhZHZhbmNlKCkgYWR2YW5jZXMgdGhlIHJlYWQgcG9pbnRlciB3aXRoIHRoZSBsb3dlc3QgdGltZXN0YW1wLgogICAgIHN0YXR1c190IGFkdmFuY2UoKTsKKyAgICAvLyByZWFkU2FtcGxlRGF0YSgpIHJlYWRzIHRoZSBzYW1wbGUgd2l0aCB0aGUgbG93ZXN0IHRpbWVzdGFtcC4KICAgICBzdGF0dXNfdCByZWFkU2FtcGxlRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKworICAgIHN0YXR1c190IGdldFNhbXBsZVNpemUoc2l6ZV90ICpzYW1wbGVTaXplKTsKICAgICBzdGF0dXNfdCBnZXRTYW1wbGVUcmFja0luZGV4KHNpemVfdCAqdHJhY2tJbmRleCk7CiAgICAgc3RhdHVzX3QgZ2V0U2FtcGxlVGltZShpbnQ2NF90ICpzYW1wbGVUaW1lVXMpOwogICAgIHN0YXR1c190IGdldFNhbXBsZU1ldGEoc3A8TWV0YURhdGE+ICpzYW1wbGVNZXRhKTsKQEAgLTk2LDEyICsxMDksMjAgQEAKICAgICAgICAga01heFRyYWNrQ291bnQgPSAxNjM4NCwKICAgICB9OwogCisgICAgc3RydWN0IFNhbXBsZSB7CisgICAgICAgIFNhbXBsZSgpOworICAgICAgICBTYW1wbGUoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIsIGludDY0X3QgdGltZVVzKTsKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICptQnVmZmVyOworICAgICAgICBpbnQ2NF90IG1TYW1wbGVUaW1lVXM7CisgICAgfTsKKwogICAgIHN0cnVjdCBUcmFja0luZm8gewogICAgICAgICBzcDxJTWVkaWFTb3VyY2U+IG1Tb3VyY2U7CiAgICAgICAgIHNpemVfdCBtVHJhY2tJbmRleDsKKyAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSBtVHJhY2tUeXBlOworICAgICAgICBzaXplX3QgbU1heEZldGNoQ291bnQ7CiAgICAgICAgIHN0YXR1c190IG1GaW5hbFJlc3VsdDsKLSAgICAgICAgTWVkaWFCdWZmZXIgKm1TYW1wbGU7Ci0gICAgICAgIGludDY0X3QgbVNhbXBsZVRpbWVVczsKKyAgICAgICAgc3RkOjpsaXN0PFNhbXBsZT4gbVNhbXBsZXM7CiAKICAgICAgICAgdWludDMyX3QgbVRyYWNrRmxhZ3M7ICAvLyBiaXRtYXNrIG9mICJUcmFja0ZsYWdzIgogICAgIH07CkBAIC0xMTcsMTYgKzEzOCwyMyBAQAogICAgIGludDY0X3QgbVRvdGFsQml0cmF0ZTsgIC8vIGluIGJpdHMvc2VjCiAgICAgaW50NjRfdCBtRHVyYXRpb25VczsKIAotICAgIHNzaXplX3QgZmV0Y2hUcmFja1NhbXBsZXMoCisgICAgc3NpemVfdCBmZXRjaEFsbFRyYWNrU2FtcGxlcygKKyAgICAgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVcyA9IC0xbGwsCisgICAgICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGUgPQorICAgICAgICAgICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkMpOworICAgIHZvaWQgZmV0Y2hUcmFja1NhbXBsZXMoCisgICAgICAgICAgICBUcmFja0luZm8gKmluZm8sCiAgICAgICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXMgPSAtMWxsLAogICAgICAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlID0KICAgICAgICAgICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DKTsKIAotICAgIHZvaWQgcmVsZWFzZVRyYWNrU2FtcGxlcygpOworICAgIHZvaWQgcmVsZWFzZU9uZVNhbXBsZShUcmFja0luZm8gKmluZm8pOworICAgIHZvaWQgcmVsZWFzZVRyYWNrU2FtcGxlcyhUcmFja0luZm8gKmluZm8pOworICAgIHZvaWQgcmVsZWFzZUFsbFRyYWNrU2FtcGxlcygpOwogCiAgICAgYm9vbCBnZXRUb3RhbEJpdHJhdGUoaW50NjRfdCAqYml0UmF0ZSkgY29uc3Q7CiAgICAgc3RhdHVzX3QgdXBkYXRlRHVyYXRpb25BbmRCaXRyYXRlKCk7Ci0gICAgc3RhdHVzX3QgYXBwZW5kVm9yYmlzTnVtUGFnZVNhbXBsZXMoVHJhY2tJbmZvICppbmZvLCBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKyAgICBzdGF0dXNfdCBhcHBlbmRWb3JiaXNOdW1QYWdlU2FtcGxlcyhNZWRpYUJ1ZmZlckJhc2UgKm1idWYsIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTnVNZWRpYUV4dHJhY3Rvcik7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50LmgKaW5kZXggMmYxNTliMC4uYmIxMzNkMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oCkBAIC0yNywxNiArMjcsMTAgQEAKICAgICBPTVhDbGllbnQoKTsKIAogICAgIHN0YXR1c190IGNvbm5lY3QoKTsKLSAgICBzdGF0dXNfdCBjb25uZWN0KGJvb2wqIHRyZWJsZUZsYWcpOwotICAgIHN0YXR1c190IGNvbm5lY3QoY29uc3QgY2hhciogbmFtZSwgYm9vbCogdHJlYmxlRmxhZyA9IG51bGxwdHIpOwotCi0gICAgc3RhdHVzX3QgY29ubmVjdExlZ2FjeSgpOwotICAgIHN0YXR1c190IGNvbm5lY3RUcmVibGUoY29uc3QgY2hhciogbmFtZSA9ICJkZWZhdWx0Iik7CisgICAgc3RhdHVzX3QgY29ubmVjdChjb25zdCBjaGFyKiBuYW1lKTsKICAgICB2b2lkIGRpc2Nvbm5lY3QoKTsKIAotICAgIHNwPElPTVg+IGludGVyZmFjZSgpIHsKLSAgICAgICAgcmV0dXJuIG1PTVg7Ci0gICAgfQorICAgIHNwPElPTVg+IGludGVyZmFjZSgpOwogCiBwcml2YXRlOgogICAgIHNwPElPTVg+IG1PTVg7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmgKaW5kZXggMWI0ZDg3My4uMjhmNjA5NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuaApAQCAtMjUsNiArMjUsNyBAQAogY2xhc3MgT214SW5mb0J1aWxkZXIgOiBwdWJsaWMgTWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZSB7CiBwdWJsaWM6CiAgICAgT214SW5mb0J1aWxkZXIoKTsKKyAgICB+T214SW5mb0J1aWxkZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CiAgICAgc3RhdHVzX3QgYnVpbGRNZWRpYUNvZGVjTGlzdChNZWRpYUNvZGVjTGlzdFdyaXRlciogd3JpdGVyKSBvdmVycmlkZTsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlRGF0YVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVEYXRhU291cmNlLmgKaW5kZXggYzkxZGRmYy4uZTE5MWU2YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVEYXRhU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVEYXRhU291cmNlLmgKQEAgLTE5LDggKzE5LDggQEAKIAogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA5ZTY2OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFFeHRyYWN0b3IuaApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFJFTU9URV9NRURJQV9FWFRSQUNUT1JfSF8KKyNkZWZpbmUgUkVNT1RFX01FRElBX0VYVFJBQ1RPUl9IXworCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTWVkaWFBbmFseXRpY3NJdGVtOworCisvLyBJTWVkaWFFeHRyYWN0b3Igd3JhcHBlciB0byB0aGUgTWVkaWFFeHRyYWN0b3IuCitjbGFzcyBSZW1vdGVNZWRpYUV4dHJhY3RvciA6IHB1YmxpYyBCbk1lZGlhRXh0cmFjdG9yIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgc3A8SU1lZGlhRXh0cmFjdG9yPiB3cmFwKAorICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3IgKmV4dHJhY3RvciwKKyAgICAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgICAgICBjb25zdCBzcDxSZWZCYXNlPiAmcGx1Z2luKTsKKworICAgIHZpcnR1YWwgflJlbW90ZU1lZGlhRXh0cmFjdG9yKCk7CisgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKKyAgICB2aXJ0dWFsIHNwPElNZWRpYVNvdXJjZT4gZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRUcmFja01ldGFEYXRhKHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MgPSAwKTsKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRNZXRhRGF0YSgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0cmljcyhQYXJjZWwgKnJlcGx5KTsKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBISW50ZXJmYWNlVG9rZW4gJmNhc1Rva2VuKTsKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCk7CisKK3ByaXZhdGU6CisgICAgTWVkaWFFeHRyYWN0b3IgKm1FeHRyYWN0b3I7CisgICAgc3A8RGF0YVNvdXJjZT4gbVNvdXJjZTsKKyAgICBzcDxSZWZCYXNlPiBtRXh0cmFjdG9yUGx1Z2luOworCisgICAgTWVkaWFBbmFseXRpY3NJdGVtICptQW5hbHl0aWNzSXRlbTsKKworICAgIGV4cGxpY2l0IFJlbW90ZU1lZGlhRXh0cmFjdG9yKAorICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3IgKmV4dHJhY3RvciwKKyAgICAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgICAgICBjb25zdCBzcDxSZWZCYXNlPiAmcGx1Z2luKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlbW90ZU1lZGlhRXh0cmFjdG9yKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gUkVNT1RFX01FRElBX0VYVFJBQ1RPUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNzIwYWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmgKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBSRU1PVEVfTUVESUFfU09VUkNFX0hfCisjZGVmaW5lIFJFTU9URV9NRURJQV9TT1VSQ0VfSF8KKworI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIElNZWRpYVNyb3VjZSB3cmFwcGVyIHRvIHRoZSBNZWRpYVNvdXJjZS4KK2NsYXNzIFJlbW90ZU1lZGlhU291cmNlIDogcHVibGljIEJuTWVkaWFTb3VyY2UgeworcHVibGljOgorICAgIHN0YXRpYyBzcDxJTWVkaWFTb3VyY2U+IHdyYXAoCisgICAgICAgICAgICBjb25zdCBzcDxSZW1vdGVNZWRpYUV4dHJhY3Rvcj4gJmV4dHJhY3RvciwKKyAgICAgICAgICAgIE1lZGlhVHJhY2sgKnNvdXJjZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPFJlZkJhc2U+ICZwbHVnaW4pOworICAgIHZpcnR1YWwgflJlbW90ZU1lZGlhU291cmNlKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLAorICAgICAgICAgICAgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RvcFRpbWVVcyhpbnQ2NF90IHN0b3BUaW1lVXMpOworCitwcml2YXRlOgorICAgIHNwPFJlbW90ZU1lZGlhRXh0cmFjdG9yPiBtRXh0cmFjdG9yOworICAgIE1lZGlhVHJhY2sgKm1Tb3VyY2U7CisgICAgc3A8UmVmQmFzZT4gbUV4dHJhY3RvclBsdWdpbjsKKworICAgIGV4cGxpY2l0IFJlbW90ZU1lZGlhU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8UmVtb3RlTWVkaWFFeHRyYWN0b3I+ICZleHRyYWN0b3IsCisgICAgICAgICAgICBNZWRpYVRyYWNrICpzb3VyY2UsCisgICAgICAgICAgICBjb25zdCBzcDxSZWZCYXNlPiAmcGx1Z2luKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlbW90ZU1lZGlhU291cmNlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gUkVNT1RFX01FRElBX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TaW1wbGVEZWNvZGluZ1NvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TaW1wbGVEZWNvZGluZ1NvdXJjZS5oCmluZGV4IGEwMDBmZGUuLjIzZGVmYjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmgKQEAgLTE3LDcgKzE3LDcgQEAKICNpZm5kZWYgU0lNUExFX0RFQ09ESU5HX1NPVVJDRV9IXwogI2RlZmluZSBTSU1QTEVfREVDT0RJTkdfU09VUkNFX0hfCiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NdXRleGVkLmg+CiAKQEAgLTQ1LDEyICs0NSwxMyBAQAogICAgIC8vIGRvZXMgbm90IHN1cHBvcnQgc2VjdXJlIGlucHV0IG9yIHBhdXNpbmcuCiAgICAgLy8gaWYgfGRlc2lyZWRDb2RlY3wgaXMgZ2l2ZW4sIHVzZSB0aGlzIHNwZWNpZmljIGNvZGVjLgogICAgIHN0YXRpYyBzcDxTaW1wbGVEZWNvZGluZ1NvdXJjZT4gQ3JlYXRlKAotICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlLCB1aW50MzJfdCBmbGFncywKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLCB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgIGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmVXaW5kb3csCi0gICAgICAgICAgICBjb25zdCBjaGFyICpkZXNpcmVkQ29kZWMgPSBOVUxMKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRlc2lyZWRDb2RlYyA9IE5VTEwsCisgICAgICAgICAgICBib29sIHNraXBNZWRpYUNvZGVjTGlzdCA9IGZhbHNlKTsKIAogICAgIHN0YXRpYyBzcDxTaW1wbGVEZWNvZGluZ1NvdXJjZT4gQ3JlYXRlKAotICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlLCB1aW50MzJfdCBmbGFncyA9IDApOworICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsIHVpbnQzMl90IGZsYWdzID0gMCk7CiAKICAgICB2aXJ0dWFsIH5TaW1wbGVEZWNvZGluZ1NvdXJjZSgpOwogCkBAIC02NCwyMCArNjUsMTkgQEAKICAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKIAogICAgIC8vIHJlYWRzIGZyb20gdGhlIHNvdXJjZS4gVGhpcyBjYWxsIGFsd2F5cyBibG9ja3MuCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOwogCiAgICAgLy8gdW5zdXBwb3J0ZWQgbWV0aG9kcwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVycyhjb25zdCBWZWN0b3I8TWVkaWFCdWZmZXIgKj4gJikgeyByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047IH0KIAogcHJpdmF0ZToKICAgICAvLyBDb25zdHJ1Y3QgdGhpcyB1c2luZyBhIGNvZGVjLCBzb3VyY2UgYW5kIGxvb3Blci4KICAgICBTaW1wbGVEZWNvZGluZ1NvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWM+ICZjb2RlYywgY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlLCBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlYz4gJmNvZGVjLCBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwKICAgICAgICAgICAgIGJvb2wgdXNpbmdTdXJmYWNlLCBib29sIGlzVm9yYmlzLCBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CiAKICAgICBzcDxNZWRpYUNvZGVjPiBtQ29kZWM7Ci0gICAgc3A8SU1lZGlhU291cmNlPiBtU291cmNlOworICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOwogICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CiAgICAgYm9vbCBtVXNpbmdTdXJmYWNlOwogICAgIGJvb2wgbUlzVm9yYmlzOwpAQCAtMTA0LDcgKzEwNCw4IEBACiAKICAgICAvLyBkbyB0aGUgYWN0dWFsIHJlYWRpbmcKICAgICBzdGF0dXNfdCBkb1JlYWQoCi0gICAgICAgICAgICBNdXRleGVkPFByb3RlY3RlZFN0YXRlPjo6TG9ja2VkICZtZSwgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKKyAgICAgICAgICAgIE11dGV4ZWQ8UHJvdGVjdGVkU3RhdGU+OjpMb2NrZWQgJm1lLCBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsCisgICAgICAgICAgICBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyk7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE2NzdmYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VNZWRpYVNvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfR1VJX1NVUkZBQ0VNRURJQVNPVVJDRV9ICi0jZGVmaW5lIEFORFJPSURfR1VJX1NVUkZBQ0VNRURJQVNPVVJDRV9ICi0KLSNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgotI2luY2x1ZGUgPGd1aS9CdWZmZXJRdWV1ZS5oPgotCi0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLQotI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgotCi0jaW5jbHVkZSAiZm91bmRhdGlvbi9BQmFzZS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFN0cmluZzg7Ci1jbGFzcyBHcmFwaGljQnVmZmVyOwotCi0vLyBBU1NVTVBUSU9OUwotLy8gMS4gU3VyZmFjZU1lZGlhU291cmNlIGlzIGluaXRpYWxpemVkIHdpdGggd2lkdGgqaGVpZ2h0IHdoaWNoCi0vLyBjYW4gbmV2ZXIgY2hhbmdlLiAgSG93ZXZlciwgZGVxZXVldWUgYnVmZmVyIGRvZXMgbm90IGN1cnJlbnRseQotLy8gZW5mb3JjZSB0aGlzIGFzIGluIEJ1ZmZlclF1ZXVlLCBkZXF1ZXVlIGNhbiBiZSB1c2VkIGJ5IFN1cmZhY2UKLS8vIHdoaWNoIGNhbiBtb2RpZnkgdGhlIGRlZmF1bHQgd2lkdGggYW5kIGhlZ2h0LiAgQWxzbyBuZWl0aGVyIHRoZSB3aWR0aAotLy8gbm9yIGhlaWdodCBjYW4gYmUgMC4KLS8vIDIuIHNldFN5bmNocm9ub3VzTW9kZSBpcyBuZXZlciB1c2VkIChiYXNpY2FsbHkgbm8gb25lIHNob3VsZCBjYWxsCi0vLyBzZXRTeW5jaHJvbm91c01vZGUoZmFsc2UpCi0vLyAzLiBzZXRDcm9wLCBzZXRUcmFuc2Zvcm0sIHNldFNjYWxpbmdNb2RlIHNob3VsZCBuZXZlciBiZSB1c2VkCi0vLyA0LiBxdWV1ZUJ1ZmZlciByZXR1cm5zIGEgZmlsbGVkIGJ1ZmZlciB0byB0aGUgU3VyZmFjZU1lZGlhU291cmNlLiBJbiBhZGRpdGlvbiwgYQotLy8gdGltZXN0YW1wIG11c3QgYmUgcHJvdmlkZWQgZm9yIHRoZSBidWZmZXIuIFRoZSB0aW1lc3RhbXAgaXMgaW4KLS8vIG5hbm9zZWNvbmRzLCBhbmQgbXVzdCBiZSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcuIEl0cyBvdGhlciBzZW1hbnRpY3MKLS8vICh6ZXJvIHBvaW50LCBldGMpIGFyZSBjbGllbnQtZGVwZW5kZW50IGFuZCBzaG91bGQgYmUgZG9jdW1lbnRlZCBieSB0aGUKLS8vIGNsaWVudC4KLS8vIDUuIE9uY2UgZGlzY29ubmVjdGVkLCBTdXJmYWNlTWVkaWFTb3VyY2UgY2FuIGJlIHJldXNlZCAoY2FuIG5vdAotLy8gY29ubmVjdCBhZ2FpbikKLS8vIDYuIFN0b3AgaXMgYSBoYXJkIHN0b3AsIHRoZSBsYXN0IGZldyBmcmFtZXMgaGVsZCBieSB0aGUgZW5jb2RlcgotLy8gbWF5IGJlIGRyb3BwZWQuICBJdCBpcyBwb3NzaWJsZSB0byB3YWl0IGZvciB0aGUgYnVmZmVycyB0byBiZQotLy8gcmV0dXJuZWQgKGJ1dCBub3QgaW1wbGVtZW50ZWQpCi0KLSNkZWZpbmUgREVCVUdfUEVORElOR19CVUZGRVJTICAgMAotCi1jbGFzcyBTdXJmYWNlTWVkaWFTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgQ29uc3VtZXJMaXN0ZW5lciB7Ci1wdWJsaWM6Ci0gICAgZW51bSB7IE1JTl9VTkRFUVVFVUVEX0JVRkZFUlMgPSA0fTsKLQotICAgIHN0cnVjdCBGcmFtZUF2YWlsYWJsZUxpc3RlbmVyIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSB7Ci0gICAgICAgIC8vIG9uRnJhbWVBdmFpbGFibGUoKSBpcyBjYWxsZWQgZnJvbSBxdWV1ZUJ1ZmZlcigpIGlzIHRoZSBGSUZPIGlzCi0gICAgICAgIC8vIGVtcHR5LiBZb3UgY2FuIHVzZSBTdXJmYWNlTWVkaWFTb3VyY2U6OmdldFF1ZXVlZENvdW50KCkgdG8KLSAgICAgICAgLy8gZmlndXJlIG91dCBpZiB0aGVyZSBhcmUgbW9yZSBmcmFtZXMgd2FpdGluZy4KLSAgICAgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2l0aG91dCBhbnkgbG9jayBoZWxkIGNhbiBiZSBjYWxsZWQgY29uY3VycmVudGx5IGJ5Ci0gICAgICAgIC8vIG11bHRpcGxlIHRocmVhZHMuCi0gICAgICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKCkgPSAwOwotICAgIH07Ci0KLSAgICBTdXJmYWNlTWVkaWFTb3VyY2UodWludDMyX3QgYnVmZmVyV2lkdGgsIHVpbnQzMl90IGJ1ZmZlckhlaWdodCk7Ci0KLSAgICB2aXJ0dWFsIH5TdXJmYWNlTWVkaWFTb3VyY2UoKTsKLQotICAgIC8vIEZvciB0aGUgTWVkaWFTb3VyY2UgaW50ZXJmYWNlIGZvciB1c2UgYnkgU3RhZ2VGcmlnaHRSZWNvcmRlcjoKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoTWVkaWFCdWZmZXIgKipidWZmZXIsCi0gICAgICAgICAgICBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwotCi0gICAgLy8gR2V0IC8gU2V0IHRoZSBmcmFtZSByYXRlIHVzZWQgZm9yIGVuY29kaW5nLiBEZWZhdWx0IGZwcyA9IDMwCi0gICAgc3RhdHVzX3Qgc2V0RnJhbWVSYXRlKGludDMyX3QgZnBzKSA7Ci0gICAgaW50MzJfdCBnZXRGcmFtZVJhdGUoICkgY29uc3Q7Ci0KLSAgICAvLyBUaGUgY2FsbCBmb3IgdGhlIFN0YWdlRnJpZ2h0UmVjb3JkZXIgdG8gdGVsbCB1cyB0aGF0Ci0gICAgLy8gaXQgaXMgZG9uZSB1c2luZyB0aGUgTWVkaWFCdWZmZXIgZGF0YSBzbyB0aGF0IGl0cyBzdGF0ZQotICAgIC8vIGNhbiBiZSBzZXQgdG8gRlJFRSBmb3IgZGVxdWV1aW5nCi0gICAgdmlydHVhbCB2b2lkIHNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyKiBidWZmZXIpOwotICAgIC8vIGVuZCBvZiBNZWRpYVNvdXJjZSBpbnRlcmZhY2UKLQotICAgIC8vIGdldFRpbWVzdGFtcCByZXRyaWV2ZXMgdGhlIHRpbWVzdGFtcCBhc3NvY2lhdGVkIHdpdGggdGhlIGltYWdlCi0gICAgLy8gc2V0IGJ5IHRoZSBtb3N0IHJlY2VudCBjYWxsIHRvIHJlYWQoKQotICAgIC8vCi0gICAgLy8gVGhlIHRpbWVzdGFtcCBpcyBpbiBuYW5vc2Vjb25kcywgYW5kIGlzIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZy4gSXRzCi0gICAgLy8gb3RoZXIgc2VtYW50aWNzICh6ZXJvIHBvaW50LCBldGMpIGFyZSBzb3VyY2UtZGVwZW5kZW50IGFuZCBzaG91bGQgYmUKLSAgICAvLyBkb2N1bWVudGVkIGJ5IHRoZSBzb3VyY2UuCi0gICAgaW50NjRfdCBnZXRUaW1lc3RhbXAoKTsKLQotICAgIC8vIHNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIgc2V0cyB0aGUgbGlzdGVuZXIgb2JqZWN0IHRoYXQgd2lsbCBiZSBub3RpZmllZAotICAgIC8vIHdoZW4gYSBuZXcgZnJhbWUgYmVjb21lcyBhdmFpbGFibGUuCi0gICAgdm9pZCBzZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKGNvbnN0IHNwPEZyYW1lQXZhaWxhYmxlTGlzdGVuZXI+JiBsaXN0ZW5lcik7Ci0KLSAgICAvLyBkdW1wIG91ciBzdGF0ZSBpbiBhIFN0cmluZwotICAgIHZvaWQgZHVtcFN0YXRlKFN0cmluZzgmIHJlc3VsdCkgY29uc3Q7Ci0gICAgdm9pZCBkdW1wU3RhdGUoU3RyaW5nOCYgcmVzdWx0LCBjb25zdCBjaGFyKiBwcmVmaXgsIGNoYXIqIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgU0laRSkgY29uc3Q7Ci0KLSAgICAvLyBtZXRhRGF0YVN0b3JlZEluVmlkZW9CdWZmZXJzIHRlbGxzIHRoZSBlbmNvZGVyIHdoYXQga2luZCBvZiBtZXRhZGF0YQotICAgIC8vIGlzIHBhc3NlZCB0aHJvdWdoIHRoZSBidWZmZXJzLiBDdXJyZW50bHksIGl0IGlzIHNldCB0byBBTldCdWZmZXIKLSAgICBNZXRhZGF0YUJ1ZmZlclR5cGUgbWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycygpIGNvbnN0OwotCi0gICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2V0UHJvZHVjZXIoKSBjb25zdCB7IHJldHVybiBtUHJvZHVjZXI7IH0KLQotICAgIC8vIFRvIGJlIGNhbGxlZCBiZWZvcmUgc3RhcnQoKQotICAgIHN0YXR1c190IHNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQoc2l6ZV90IGNvdW50KTsKLQotICAgIC8vIFRvIGJlIGNhbGxlZCBiZWZvcmUgc3RhcnQoKQotICAgIHN0YXR1c190IHNldFVzZUFic29sdXRlVGltZXN0YW1wcygpOwotCi1wcm90ZWN0ZWQ6Ci0KLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgQnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXIgaW50ZXJmYWNlLiAgVGhlc2UKLSAgICAvLyBjYWxscyBhcmUgdXNlZCB0byBub3RpZnkgdGhlIFN1cmZhY2Ugb2YgYXN5bmNocm9ub3VzIGV2ZW50cyBpbiB0aGUKLSAgICAvLyBCdWZmZXJRdWV1ZS4KLSAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiBpdGVtKTsKLQotICAgIC8vIFVzZWQgYXMgYSBob29rIHRvIEJ1ZmZlclF1ZXVlOjpkaXNjb25uZWN0KCkKLSAgICAvLyBUaGlzIGlzIGNhbGxlZCBieSB0aGUgY2xpZW50IHNpZGUgd2hlbiBpdCBpcyBkb25lCi0gICAgLy8gVE9ETzogQ3VycmVudGx5LCB0aGlzIGFsc28gc2V0cyBtU3RvcHBlZCB0byB0cnVlIHdoaWNoCi0gICAgLy8gaXMgbmVlZGVkIGZvciB1bmJsb2NraW5nIHRoZSBlbmNvZGVyIHdoaWNoIG1pZ2h0IGJlCi0gICAgLy8gd2FpdGluZyB0byByZWFkIG1vcmUgZnJhbWVzLiBTbyBpZiBvbiB0aGUgY2xpZW50IHNpZGUsCi0gICAgLy8gdGhlIHNhbWUgdGhyZWFkIHN1cHBsaWVzIHRoZSBmcmFtZXMgYW5kIGFsc28gY2FsbHMgc3RvcAotICAgIC8vIG9uIHRoZSBlbmNvZGVyLCB0aGUgY2xpZW50IGhhcyB0byBjYWxsIGRpc2Nvbm5lY3QgYmVmb3JlCi0gICAgLy8gaXQgY2FsbHMgc3RvcC4KLSAgICAvLyBJbiB0aGUgY2FzZSBvZiB0aGUgY2FtZXJhLAotICAgIC8vIHRoYXQgbmVlZCBub3QgYmUgcmVxdWlyZWQgc2luY2UgdGhlIHRocmVhZCBzdXBwbHlpbmcgdGhlCi0gICAgLy8gZnJhbWVzIGlzIHNlcGFyYXRlIHRoYW4gdGhlIG9uZSBjYWxsaW5nIHN0b3AuCi0gICAgdmlydHVhbCB2b2lkIG9uQnVmZmVyc1JlbGVhc2VkKCk7Ci0KLSAgICAvLyBTdXJmYWNlTWVkaWFTb3VyY2UgY2FuJ3QgaGFuZGxlIHNpZGViYW5kIHN0cmVhbXMsIHNvIHRoaXMgaXMgbm90IGV4cGVjdGVkCi0gICAgLy8gdG8gZXZlciBiZSBjYWxsZWQuIERvZXMgbm90aGluZy4KLSAgICB2aXJ0dWFsIHZvaWQgb25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKTsKLQotICAgIHN0YXRpYyBib29sIGlzRXh0ZXJuYWxGb3JtYXQodWludDMyX3QgZm9ybWF0KTsKLQotcHJpdmF0ZToKLSAgICAvLyBBIEJ1ZmZlclF1ZXVlLCByZXByZXNlbnRlZCBieSB0aGVzZSBpbnRlcmZhY2VzLCBpcyB0aGUgZXhjaGFuZ2UgcG9pbnQKLSAgICAvLyBiZXR3ZWVuIHRoZSBwcm9kdWNlciBhbmQgdGhpcyBjb25zdW1lcgotICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1Qcm9kdWNlcjsKLSAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBtQ29uc3VtZXI7Ci0KLSAgICBzdHJ1Y3QgU2xvdERhdGEgewotICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBtR3JhcGhpY0J1ZmZlcjsKLSAgICAgICAgdWludDY0X3QgbUZyYW1lTnVtYmVyOwotICAgIH07Ci0KLSAgICAvLyBtU2xvdHMgY2FjaGVzIEdyYXBoaWNCdWZmZXJzIGFuZCBmcmFtZU51bWJlcnMgZnJvbSB0aGUgYnVmZmVyIHF1ZXVlCi0gICAgU2xvdERhdGEgbVNsb3RzW0J1ZmZlclF1ZXVlOjpOVU1fQlVGRkVSX1NMT1RTXTsKLQotICAgIC8vIFRoZSBwZXJtZW5lbnQgd2lkdGggYW5kIGhlaWdodCBvZiBTTVMgYnVmZmVycwotICAgIGludCBtV2lkdGg7Ci0gICAgaW50IG1IZWlnaHQ7Ci0KLSAgICAvLyBtQ3VycmVudFNsb3QgaXMgdGhlIGJ1ZmZlciBzbG90IGluZGV4IG9mIHRoZSBidWZmZXIgdGhhdCBpcyBjdXJyZW50bHkKLSAgICAvLyBiZWluZyB1c2VkIGJ5IGJ1ZmZlciBjb25zdW1lcgotICAgIC8vIChlLmcuIFN0YWdlRnJpZ2h0UmVjb3JkZXIgaW4gdGhlIGNhc2Ugb2YgU3VyZmFjZU1lZGlhU291cmNlIG9yIEdMVGV4dHVyZQotICAgIC8vIGluIHRoZSBjYXNlIG9mIFN1cmZhY2UpLgotICAgIC8vIEl0IGlzIGluaXRpYWxpemVkIHRvIElOVkFMSURfQlVGRkVSX1NMT1QsCi0gICAgLy8gaW5kaWNhdGluZyB0aGF0IG5vIGJ1ZmZlciBzbG90IGlzIGN1cnJlbnRseSBib3VuZCB0byB0aGUgdGV4dHVyZS4gTm90ZSwKLSAgICAvLyBob3dldmVyLCB0aGF0IGEgdmFsdWUgb2YgSU5WQUxJRF9CVUZGRVJfU0xPVCBkb2VzIG5vdCBuZWNlc3NhcmlseSBtZWFuCi0gICAgLy8gdGhhdCBubyBidWZmZXIgaXMgYm91bmQgdG8gdGhlIHRleHR1cmUuIEEgY2FsbCB0byBzZXRCdWZmZXJDb3VudCB3aWxsCi0gICAgLy8gcmVzZXQgbUN1cnJlbnRUZXh0dXJlIHRvIElOVkFMSURfQlVGRkVSX1NMT1QuCi0gICAgaW50IG1DdXJyZW50U2xvdDsKLQotICAgIC8vIG1DdXJyZW50QnVmZmVycyBpcyBhIGxpc3Qgb2YgdGhlIGdyYXBoaWMgYnVmZmVycyB0aGF0IGFyZSBiZWluZyB1c2VkIGJ5Ci0gICAgLy8gYnVmZmVyIGNvbnN1bWVyIChpLmUuIHRoZSB2aWRlbyBlbmNvZGVyKS4gSXQncyBwb3NzaWJsZSB0aGF0IHRoZXNlCi0gICAgLy8gYnVmZmVycyBhcmUgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgYnVmZmVyIHNsb3RzLCBzbyB3ZSBtdXN0IHRyYWNrIHRoZW0KLSAgICAvLyBzZXBhcmF0ZWx5LiAgQnVmZmVycyBhcmUgYWRkZWQgdG8gdGhpcyBsaXN0IGluIHJlYWQsIGFuZCByZW1vdmVkIGZyb20KLSAgICAvLyB0aGlzIGxpc3QgaW4gc2lnbmFsQnVmZmVyUmV0dXJuZWQKLSAgICBWZWN0b3I8c3A8R3JhcGhpY0J1ZmZlcj4gPiBtQ3VycmVudEJ1ZmZlcnM7Ci0KLSAgICBzaXplX3QgbU51bVBlbmRpbmdCdWZmZXJzOwotCi0jaWYgREVCVUdfUEVORElOR19CVUZGRVJTCi0gICAgVmVjdG9yPE1lZGlhQnVmZmVyICo+IG1QZW5kaW5nQnVmZmVyczsKLSNlbmRpZgotCi0gICAgLy8gbUN1cnJlbnRUaW1lc3RhbXAgaXMgdGhlIHRpbWVzdGFtcCBmb3IgdGhlIGN1cnJlbnQgdGV4dHVyZS4gSXQKLSAgICAvLyBnZXRzIHNldCB0byBtTGFzdFF1ZXVlZFRpbWVzdGFtcCBlYWNoIHRpbWUgdXBkYXRlVGV4SW1hZ2UgaXMgY2FsbGVkLgotICAgIGludDY0X3QgbUN1cnJlbnRUaW1lc3RhbXA7Ci0KLSAgICAvLyBtRnJhbWVBdmFpbGFibGVMaXN0ZW5lciBpcyB0aGUgbGlzdGVuZXIgb2JqZWN0IHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiBhCi0gICAgLy8gbmV3IGZyYW1lIGJlY29tZXMgYXZhaWxhYmxlLiBJZiBpdCBpcyBub3QgTlVMTCBpdCB3aWxsIGJlIGNhbGxlZCBmcm9tCi0gICAgLy8gcXVldWVCdWZmZXIuCi0gICAgc3A8RnJhbWVBdmFpbGFibGVMaXN0ZW5lcj4gbUZyYW1lQXZhaWxhYmxlTGlzdGVuZXI7Ci0KLSAgICAvLyBtTXV0ZXggaXMgdGhlIG11dGV4IHVzZWQgdG8gcHJldmVudCBjb25jdXJyZW50IGFjY2VzcyB0byB0aGUgbWVtYmVyCi0gICAgLy8gdmFyaWFibGVzIG9mIFN1cmZhY2VNZWRpYVNvdXJjZSBvYmplY3RzLiBJdCBtdXN0IGJlIGxvY2tlZCB3aGVuZXZlciB0aGUKLSAgICAvLyBtZW1iZXIgdmFyaWFibGVzIGFyZSBhY2Nlc3NlZC4KLSAgICBtdXRhYmxlIE11dGV4IG1NdXRleDsKLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEZvciBNZWRpYVNvdXJjZQotICAgIC8vIFNldCB0byBhIGRlZmF1bHQgb2YgMzAgZnBzIGlmIG5vdCBzcGVjaWZpZWQgYnkgdGhlIGNsaWVudCBzaWRlCi0gICAgaW50MzJfdCBtRnJhbWVSYXRlOwotCi0gICAgLy8gbVN0YXJ0ZWQgaXMgYSBmbGFnIHRvIGNoZWNrIGlmIHRoZSByZWNvcmRpbmcgaXMgZ29pbmcgb24KLSAgICBib29sIG1TdGFydGVkOwotCi0gICAgLy8gbU51bUZyYW1lc1JlY2VpdmVkIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyByZWNpZXZlZCBmcm9tCi0gICAgLy8gdGhlIGNsaWVudCBzaWRlCi0gICAgaW50IG1OdW1GcmFtZXNSZWNlaXZlZDsKLSAgICAvLyBtTnVtRnJhbWVzRW5jb2RlZCBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBmcmFtZXMgcGFzc2VkIG9uIHRvIHRoZQotICAgIC8vIGVuY29kZXIKLSAgICBpbnQgbU51bUZyYW1lc0VuY29kZWQ7Ci0KLSAgICAvLyBtRmlyc3RGcmFtZVRpbWVzdGFtcCBpcyB0aGUgdGltZXN0YW1wIG9mIHRoZSBmaXJzdCByZWNlaXZlZCBmcmFtZS4KLSAgICAvLyBJdCBpcyB1c2VkIHRvIG9mZnNldCB0aGUgb3V0cHV0IHRpbWVzdGFtcHMgc28gcmVjb3JkaW5nIHN0YXJ0cyBhdCB0aW1lIDAuCi0gICAgaW50NjRfdCBtRmlyc3RGcmFtZVRpbWVzdGFtcDsKLSAgICAvLyBtU3RhcnRUaW1lTnMgaXMgdGhlIHN0YXJ0IHRpbWUgcGFzc2VkIGludG8gdGhlIHNvdXJjZSBhdCBzdGFydCwgdXNlZCB0bwotICAgIC8vIG9mZnNldCB0aW1lc3RhbXBzLgotICAgIGludDY0X3QgbVN0YXJ0VGltZU5zOwotCi0gICAgc2l6ZV90IG1NYXhBY3F1aXJlZEJ1ZmZlckNvdW50OwotCi0gICAgYm9vbCBtVXNlQWJzb2x1dGVUaW1lc3RhbXBzOwotCi0gICAgLy8gbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uIGNvbmRpdGlvbiB1c2VkIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlcmUKLSAgICAvLyBpcyBhIGZyYW1lIGF2YWlsYWJsZSBmb3IgZGVxdWV1aW5nCi0gICAgQ29uZGl0aW9uIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbjsKLQotICAgIENvbmRpdGlvbiBtTWVkaWFCdWZmZXJzQXZhaWxhYmxlQ29uZGl0aW9uOwotCi0gICAgLy8gQWxsb2NhdGUgYW5kIHJldHVybiBhIG5ldyBNZWRpYUJ1ZmZlciBhbmQgcGFzcyB0aGUgQU5XIGJ1ZmZlciBhcyBtZXRhZGF0YSBpbnRvIGl0LgotICAgIHZvaWQgcGFzc01ldGFkYXRhQnVmZmVyX2woTWVkaWFCdWZmZXIgKipidWZmZXIsIEFOYXRpdmVXaW5kb3dCdWZmZXIgKmJ1ZmZlckhhbmRsZSkgY29uc3Q7Ci0KLSAgICAvLyBBdm9pZCBjb3B5aW5nIGFuZCBlcXVhdGluZyBhbmQgZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFN1cmZhY2VNZWRpYVNvdXJjZSk7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9HVUlfU1VSRkFDRU1FRElBU09VUkNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oCmluZGV4IGE3NzQ3YzcuLjY4OWU0NTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuaApAQCAtMjQsNiArMjQsOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0cnVjdCBIRFJTdGF0aWNJbmZvOworCiAvKioKICAqIENvbmZpZ3VyZXMgfG5hdGl2ZVdpbmRvd3wgZm9yIGdpdmVuIHx3aWR0aHx4fGhlaWdodHwsIHBpeGVsIHxmb3JtYXR8LCB8cm90YXRpb258IGFuZCB8dXNhZ2V8LgogICogSWYgfHJlY29ubmVjdHwgaXMgdHJ1ZSwgcmVjb25uZWN0cyB0byB0aGUgbmF0aXZlIHdpbmRvdyBiZWZvcmUgaGFuZC4KQEAgLTMyLDYgKzM0LDggQEAKIHN0YXR1c190IHNldE5hdGl2ZVdpbmRvd1NpemVGb3JtYXRBbmRVc2FnZSgKICAgICAgICAgQU5hdGl2ZVdpbmRvdyAqbmF0aXZlV2luZG93IC8qIG5vbm51bGwgKi8sCiAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZvcm1hdCwgaW50IHJvdGF0aW9uLCBpbnQgdXNhZ2UsIGJvb2wgcmVjb25uZWN0KTsKK3ZvaWQgc2V0TmF0aXZlV2luZG93SGRyTWV0YWRhdGEoCisgICAgICAgIEFOYXRpdmVXaW5kb3cgKm5hdGl2ZVdpbmRvdyAvKiBub25udWxsICovLCBIRFJTdGF0aWNJbmZvICppbmZvIC8qIG5vbm51bGwgKi8pOwogc3RhdHVzX3QgcHVzaEJsYW5rQnVmZmVyc1RvTmF0aXZlV2luZG93KEFOYXRpdmVXaW5kb3cgKm5hdGl2ZVdpbmRvdyAvKiBub25udWxsICovKTsKIHN0YXR1c190IG5hdGl2ZVdpbmRvd0Nvbm5lY3QoQU5hdGl2ZVdpbmRvdyAqc3VyZmFjZSwgY29uc3QgY2hhciAqcmVhc29uKTsKIHN0YXR1c190IG5hdGl2ZVdpbmRvd0Rpc2Nvbm5lY3QoQU5hdGl2ZVdpbmRvdyAqc3VyZmFjZSwgY29uc3QgY2hhciAqcmVhc29uKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaAppbmRleCA3N2NiZDRjLi42YTI4ZTBiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oCkBAIC0yOCwyMSArMjgsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLSNkZWZpbmUgRk9VUkNDKGMxLCBjMiwgYzMsIGM0KSBcCi0gICAgKChjMSkgPDwgMjQgfCAoYzIpIDw8IDE2IHwgKGMzKSA8PCA4IHwgKGM0KSkKLQotdWludDE2X3QgVTE2X0FUKGNvbnN0IHVpbnQ4X3QgKnB0cik7Ci11aW50MzJfdCBVMzJfQVQoY29uc3QgdWludDhfdCAqcHRyKTsKLXVpbnQ2NF90IFU2NF9BVChjb25zdCB1aW50OF90ICpwdHIpOwotCi11aW50MTZfdCBVMTZMRV9BVChjb25zdCB1aW50OF90ICpwdHIpOwotdWludDMyX3QgVTMyTEVfQVQoY29uc3QgdWludDhfdCAqcHRyKTsKLXVpbnQ2NF90IFU2NExFX0FUKGNvbnN0IHVpbnQ4X3QgKnB0cik7Ci0KLXVpbnQ2NF90IG50b2g2NCh1aW50NjRfdCB4KTsKLXVpbnQ2NF90IGh0b242NCh1aW50NjRfdCB4KTsKLQotY2xhc3MgTWV0YURhdGE7CiBzdHJ1Y3QgQU1lc3NhZ2U7CiBzdGF0dXNfdCBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UoCiAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQpOwpAQCAtOTUsNyArODAsNiBAQAogdm9pZCByZWFkRnJvbUFNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBCdWZmZXJpbmdTZXR0aW5ncyAqYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pOwogCiBBU3RyaW5nIG5hbWVGb3JGZChpbnQgZmQpOwotdm9pZCBNYWtlRm91ckNDU3RyaW5nKHVpbnQzMl90IHgsIGNoYXIgKnMpOwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBVVElMU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMmZiNGIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbWF0cm9za2EiLAotCi0gICAgc3JjczogWyJNYXRyb3NrYUV4dHJhY3Rvci5jcHAiXSwKLQotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZXh0ZXJuYWwvZmxhYy9pbmNsdWRlIiwKLSAgICAgICAgImV4dGVybmFsL2xpYnZweC9saWJ3ZWJtIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgXSwKLQotICAgIGNmbGFnczogWwotICAgICAgICAiLVduby1tdWx0aWNoYXIiLAotICAgICAgICAiLVdlcnJvciIsCi0gICAgICAgICItV2FsbCIsCi0gICAgXSwKLQotICAgIHNhbml0aXplOiB7Ci0gICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCi0gICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICBdLAotICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKLSAgICB9LAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYm1lZGlhIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZsYWNkZWMiCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEzYTI1Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIk1hdHJvc2thRXh0cmFjdG9yIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRkxBQ0RlY29kZXIuaCIKLSNpbmNsdWRlICJNYXRyb3NrYUV4dHJhY3Rvci5oIgotI2luY2x1ZGUgImF2Y191dGlscy5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgRGF0YVNvdXJjZVJlYWRlciA6IHB1YmxpYyBta3ZwYXJzZXI6OklNa3ZSZWFkZXIgewotICAgIGV4cGxpY2l0IERhdGFTb3VyY2VSZWFkZXIoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkKLSAgICAgICAgOiBtU291cmNlKHNvdXJjZSkgewotICAgIH0KLQotICAgIHZpcnR1YWwgaW50IFJlYWQobG9uZyBsb25nIHBvc2l0aW9uLCBsb25nIGxlbmd0aCwgdW5zaWduZWQgY2hhciogYnVmZmVyKSB7Ci0gICAgICAgIENIRUNLKHBvc2l0aW9uID49IDApOwotICAgICAgICBDSEVDSyhsZW5ndGggPj0gMCk7Ci0KLSAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHNzaXplX3QgbiA9IG1Tb3VyY2UtPnJlYWRBdChwb3NpdGlvbiwgYnVmZmVyLCBsZW5ndGgpOwotCi0gICAgICAgIGlmIChuIDw9IDApIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHZpcnR1YWwgaW50IExlbmd0aChsb25nIGxvbmcqIHRvdGFsLCBsb25nIGxvbmcqIGF2YWlsYWJsZSkgewotICAgICAgICBvZmY2NF90IHNpemU7Ci0gICAgICAgIGlmIChtU291cmNlLT5nZXRTaXplKCZzaXplKSAhPSBPSykgewotICAgICAgICAgICAgKnRvdGFsID0gLTE7Ci0gICAgICAgICAgICAqYXZhaWxhYmxlID0gKGxvbmcgbG9uZykoKDF1bGwgPDwgNjMpIC0gMSk7Ci0KLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRvdGFsKSB7Ci0gICAgICAgICAgICAqdG90YWwgPSBzaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGF2YWlsYWJsZSkgewotICAgICAgICAgICAgKmF2YWlsYWJsZSA9IHNpemU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgc3A8RGF0YVNvdXJjZT4gbVNvdXJjZTsKLQotICAgIERhdGFTb3VyY2VSZWFkZXIoY29uc3QgRGF0YVNvdXJjZVJlYWRlciAmKTsKLSAgICBEYXRhU291cmNlUmVhZGVyICZvcGVyYXRvcj0oY29uc3QgRGF0YVNvdXJjZVJlYWRlciAmKTsKLX07Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLXN0cnVjdCBCbG9ja0l0ZXJhdG9yIHsKLSAgICBCbG9ja0l0ZXJhdG9yKE1hdHJvc2thRXh0cmFjdG9yICpleHRyYWN0b3IsIHVuc2lnbmVkIGxvbmcgdHJhY2tOdW0sIHVuc2lnbmVkIGxvbmcgaW5kZXgpOwotCi0gICAgYm9vbCBlb3MoKSBjb25zdDsKLQotICAgIHZvaWQgYWR2YW5jZSgpOwotICAgIHZvaWQgcmVzZXQoKTsKLQotICAgIHZvaWQgc2VlaygKLSAgICAgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVcywgYm9vbCBpc0F1ZGlvLAotICAgICAgICAgICAgaW50NjRfdCAqYWN0dWFsRnJhbWVUaW1lVXMpOwotCi0gICAgY29uc3QgbWt2cGFyc2VyOjpCbG9jayAqYmxvY2soKSBjb25zdDsKLSAgICBpbnQ2NF90IGJsb2NrVGltZVVzKCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgTWF0cm9za2FFeHRyYWN0b3IgKm1FeHRyYWN0b3I7Ci0gICAgbG9uZyBsb25nIG1UcmFja051bTsKLSAgICB1bnNpZ25lZCBsb25nIG1JbmRleDsKLQotICAgIGNvbnN0IG1rdnBhcnNlcjo6Q2x1c3RlciAqbUNsdXN0ZXI7Ci0gICAgY29uc3QgbWt2cGFyc2VyOjpCbG9ja0VudHJ5ICptQmxvY2tFbnRyeTsKLSAgICBsb25nIG1CbG9ja0VudHJ5SW5kZXg7Ci0KLSAgICB2b2lkIGFkdmFuY2VfbCgpOwotCi0gICAgQmxvY2tJdGVyYXRvcihjb25zdCBCbG9ja0l0ZXJhdG9yICYpOwotICAgIEJsb2NrSXRlcmF0b3IgJm9wZXJhdG9yPShjb25zdCBCbG9ja0l0ZXJhdG9yICYpOwotfTsKLQotc3RydWN0IE1hdHJvc2thU291cmNlIDogcHVibGljIE1lZGlhU291cmNlIHsKLSAgICBNYXRyb3NrYVNvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPE1hdHJvc2thRXh0cmFjdG9yPiAmZXh0cmFjdG9yLCBzaXplX3QgaW5kZXgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLQotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfk1hdHJvc2thU291cmNlKCk7Ci0KLXByaXZhdGU6Ci0gICAgZW51bSBUeXBlIHsKLSAgICAgICAgQVZDLAotICAgICAgICBBQUMsCi0gICAgICAgIE9USEVSCi0gICAgfTsKLQotICAgIHNwPE1hdHJvc2thRXh0cmFjdG9yPiBtRXh0cmFjdG9yOwotICAgIHNpemVfdCBtVHJhY2tJbmRleDsKLSAgICBUeXBlIG1UeXBlOwotICAgIGJvb2wgbUlzQXVkaW87Ci0gICAgQmxvY2tJdGVyYXRvciBtQmxvY2tJdGVyOwotICAgIHNzaXplX3QgbU5BTFNpemVMZW47ICAvLyBmb3IgdHlwZSBBVkMKLQotICAgIExpc3Q8TWVkaWFCdWZmZXIgKj4gbVBlbmRpbmdGcmFtZXM7Ci0KLSAgICBzdGF0dXNfdCBhZHZhbmNlKCk7Ci0KLSAgICBzdGF0dXNfdCBzZXRXZWJtQmxvY2tDcnlwdG9JbmZvKE1lZGlhQnVmZmVyICptYnVmKTsKLSAgICBzdGF0dXNfdCByZWFkQmxvY2soKTsKLSAgICB2b2lkIGNsZWFyUGVuZGluZ0ZyYW1lcygpOwotCi0gICAgTWF0cm9za2FTb3VyY2UoY29uc3QgTWF0cm9za2FTb3VyY2UgJik7Ci0gICAgTWF0cm9za2FTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBNYXRyb3NrYVNvdXJjZSAmKTsKLX07Ci0KLWNvbnN0IG1rdnBhcnNlcjo6VHJhY2sqIE1hdHJvc2thRXh0cmFjdG9yOjpUcmFja0luZm86OmdldFRyYWNrKCkgY29uc3QgewotICAgIHJldHVybiBtRXh0cmFjdG9yLT5tU2VnbWVudC0+R2V0VHJhY2tzKCktPkdldFRyYWNrQnlOdW1iZXIobVRyYWNrTnVtKTsKLX0KLQotLy8gVGhpcyBmdW5jdGlvbiBkb2VzIGV4YWN0bHkgdGhlIHNhbWUgYXMgbWt2cGFyc2VyOjpDdWVzOjpGaW5kLCBleGNlcHQgdGhhdCBpdAotLy8gc2VhcmNoZXMgaW4gb3VyIG93biB0cmFjayBiYXNlZCB2ZWN0b3JzLiBXZSBzaG91bGQgbm90IG5lZWQgdGhpcyBvbmNlIG1rdnBhcnNlcgotLy8gYWRkcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5LgotY29uc3QgbWt2cGFyc2VyOjpDdWVQb2ludDo6VHJhY2tQb3NpdGlvbiAqTWF0cm9za2FFeHRyYWN0b3I6OlRyYWNrSW5mbzo6ZmluZCgKLSAgICAgICAgbG9uZyBsb25nIHRpbWVOcykgY29uc3QgewotICAgIEFMT0dWKCJtQ3VlUG9pbnRzLnNpemUgJXp1IiwgbUN1ZVBvaW50cy5zaXplKCkpOwotICAgIGlmIChtQ3VlUG9pbnRzLmVtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgY29uc3QgbWt2cGFyc2VyOjpDdWVQb2ludCogY3AgPSBtQ3VlUG9pbnRzLml0ZW1BdCgwKTsKLSAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrKiB0cmFjayA9IGdldFRyYWNrKCk7Ci0gICAgaWYgKHRpbWVOcyA8PSBjcC0+R2V0VGltZShtRXh0cmFjdG9yLT5tU2VnbWVudCkpIHsKLSAgICAgICAgcmV0dXJuIGNwLT5GaW5kKHRyYWNrKTsKLSAgICB9Ci0KLSAgICAvLyBCaW5hcnkgc2VhcmNoZXMgdGhyb3VnaCByZWxldmFudCBjdWVzOyBhc3N1bWVzIGN1ZXMgYXJlIG9yZGVyZWQgYnkgdGltZWNvZGUuCi0gICAgLy8gSWYgd2UgZG8gZGV0ZWN0IG91dC1vZi1vcmRlciBjdWVzLCByZXR1cm4gTlVMTC4KLSAgICBzaXplX3QgbG8gPSAwOwotICAgIHNpemVfdCBoaSA9IG1DdWVQb2ludHMuc2l6ZSgpOwotICAgIHdoaWxlIChsbyA8IGhpKSB7Ci0gICAgICAgIGNvbnN0IHNpemVfdCBtaWQgPSBsbyArIChoaSAtIGxvKSAvIDI7Ci0gICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQqIGNvbnN0IG1pZENwID0gbUN1ZVBvaW50cy5pdGVtQXQobWlkKTsKLSAgICAgICAgY29uc3QgbG9uZyBsb25nIGN1ZVRpbWVOcyA9IG1pZENwLT5HZXRUaW1lKG1FeHRyYWN0b3ItPm1TZWdtZW50KTsKLSAgICAgICAgaWYgKGN1ZVRpbWVOcyA8PSB0aW1lTnMpIHsKLSAgICAgICAgICAgIGxvID0gbWlkICsgMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGhpID0gbWlkOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGxvID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgY3AgPSBtQ3VlUG9pbnRzLml0ZW1BdChsbyAtIDEpOwotICAgIGlmIChjcC0+R2V0VGltZShtRXh0cmFjdG9yLT5tU2VnbWVudCkgPiB0aW1lTnMpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNwLT5GaW5kKHRyYWNrKTsKLX0KLQotTWF0cm9za2FTb3VyY2U6Ok1hdHJvc2thU291cmNlKAotICAgICAgICBjb25zdCBzcDxNYXRyb3NrYUV4dHJhY3Rvcj4gJmV4dHJhY3Rvciwgc2l6ZV90IGluZGV4KQotICAgIDogbUV4dHJhY3RvcihleHRyYWN0b3IpLAotICAgICAgbVRyYWNrSW5kZXgoaW5kZXgpLAotICAgICAgbVR5cGUoT1RIRVIpLAotICAgICAgbUlzQXVkaW8oZmFsc2UpLAotICAgICAgbUJsb2NrSXRlcihtRXh0cmFjdG9yLmdldCgpLAotICAgICAgICAgICAgICAgICBtRXh0cmFjdG9yLT5tVHJhY2tzLml0ZW1BdChpbmRleCkubVRyYWNrTnVtLAotICAgICAgICAgICAgICAgICBpbmRleCksCi0gICAgICBtTkFMU2l6ZUxlbigtMSkgewotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQoaW5kZXgpLm1NZXRhOwotCi0gICAgY29uc3QgY2hhciAqbWltZTsKLSAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7Ci0KLSAgICBtSXNBdWRpbyA9ICFzdHJuY2FzZWNtcCgiYXVkaW8vIiwgbWltZSwgNik7Ci0KLSAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSkgewotICAgICAgICBtVHlwZSA9IEFWQzsKLQotICAgICAgICB1aW50MzJfdCBkdW1teTsKLSAgICAgICAgY29uc3QgdWludDhfdCAqYXZjYzsKLSAgICAgICAgc2l6ZV90IGF2Y2NTaXplOwotICAgICAgICBpbnQzMl90IG5hbFNpemVMZW4gPSAwOwotICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlOYWxMZW5ndGhTaXplLCAmbmFsU2l6ZUxlbikpIHsKLSAgICAgICAgICAgIGlmIChuYWxTaXplTGVuID49IDAgJiYgbmFsU2l6ZUxlbiA8PSA0KSB7Ci0gICAgICAgICAgICAgICAgbU5BTFNpemVMZW4gPSBuYWxTaXplTGVuOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlBVkNDLCAmZHVtbXksIChjb25zdCB2b2lkICoqKSZhdmNjLCAmYXZjY1NpemUpCi0gICAgICAgICAgICAgICAgJiYgYXZjY1NpemUgPj0gNXUpIHsKLSAgICAgICAgICAgIG1OQUxTaXplTGVuID0gMSArIChhdmNjWzRdICYgMyk7Ci0gICAgICAgICAgICBBTE9HVigibU5BTFNpemVMZW4gPSAlemQiLCBtTkFMU2l6ZUxlbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiTm8gbU5BTFNpemVMZW4iKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkgewotICAgICAgICBtVHlwZSA9IEFBQzsKLSAgICB9Ci19Ci0KLU1hdHJvc2thU291cmNlOjp+TWF0cm9za2FTb3VyY2UoKSB7Ci0gICAgY2xlYXJQZW5kaW5nRnJhbWVzKCk7Ci19Ci0KLXN0YXR1c190IE1hdHJvc2thU291cmNlOjpzdGFydChNZXRhRGF0YSAqIC8qIHBhcmFtcyAqLykgewotICAgIGlmIChtVHlwZSA9PSBBVkMgJiYgbU5BTFNpemVMZW4gPCAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgbUJsb2NrSXRlci5yZXNldCgpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6c3RvcCgpIHsKLSAgICBjbGVhclBlbmRpbmdGcmFtZXMoKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3A8TWV0YURhdGE+IE1hdHJvc2thU291cmNlOjpnZXRGb3JtYXQoKSB7Ci0gICAgcmV0dXJuIG1FeHRyYWN0b3ItPm1UcmFja3MuaXRlbUF0KG1UcmFja0luZGV4KS5tTWV0YTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotQmxvY2tJdGVyYXRvcjo6QmxvY2tJdGVyYXRvcigKLSAgICAgICAgTWF0cm9za2FFeHRyYWN0b3IgKmV4dHJhY3RvciwgdW5zaWduZWQgbG9uZyB0cmFja051bSwgdW5zaWduZWQgbG9uZyBpbmRleCkKLSAgICA6IG1FeHRyYWN0b3IoZXh0cmFjdG9yKSwKLSAgICAgIG1UcmFja051bSh0cmFja051bSksCi0gICAgICBtSW5kZXgoaW5kZXgpLAotICAgICAgbUNsdXN0ZXIoTlVMTCksCi0gICAgICBtQmxvY2tFbnRyeShOVUxMKSwKLSAgICAgIG1CbG9ja0VudHJ5SW5kZXgoMCkgewotICAgIHJlc2V0KCk7Ci19Ci0KLWJvb2wgQmxvY2tJdGVyYXRvcjo6ZW9zKCkgY29uc3QgewotICAgIHJldHVybiBtQ2x1c3RlciA9PSBOVUxMIHx8IG1DbHVzdGVyLT5FT1MoKTsKLX0KLQotdm9pZCBCbG9ja0l0ZXJhdG9yOjphZHZhbmNlKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtRXh0cmFjdG9yLT5tTG9jayk7Ci0gICAgYWR2YW5jZV9sKCk7Ci19Ci0KLXZvaWQgQmxvY2tJdGVyYXRvcjo6YWR2YW5jZV9sKCkgewotICAgIGZvciAoOzspIHsKLSAgICAgICAgbG9uZyByZXMgPSBtQ2x1c3Rlci0+R2V0RW50cnkobUJsb2NrRW50cnlJbmRleCwgbUJsb2NrRW50cnkpOwotICAgICAgICBBTE9HVigiR2V0RW50cnkgcmV0dXJuZWQgJWxkIiwgcmVzKTsKLQotICAgICAgICBsb25nIGxvbmcgcG9zOwotICAgICAgICBsb25nIGxlbjsKLSAgICAgICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgICAgIC8vIE5lZWQgdG8gcGFyc2UgdGhpcyBjbHVzdGVyIHNvbWUgbW9yZQotCi0gICAgICAgICAgICBDSEVDS19FUShyZXMsIG1rdnBhcnNlcjo6RV9CVUZGRVJfTk9UX0ZVTEwpOwotCi0gICAgICAgICAgICByZXMgPSBtQ2x1c3Rlci0+UGFyc2UocG9zLCBsZW4pOwotICAgICAgICAgICAgQUxPR1YoIlBhcnNlIHJldHVybmVkICVsZCIsIHJlcyk7Ci0KLSAgICAgICAgICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gSS9PIGVycm9yCi0KLSAgICAgICAgICAgICAgICBBTE9HRSgiQ2x1c3Rlcjo6UGFyc2UgcmV0dXJuZWQgcmVzdWx0ICVsZCIsIHJlcyk7Ci0KLSAgICAgICAgICAgICAgICBtQ2x1c3RlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9IGVsc2UgaWYgKHJlcyA9PSAwKSB7Ci0gICAgICAgICAgICAvLyBXZSdyZSBkb25lIHdpdGggdGhpcyBjbHVzdGVyCi0KLSAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q2x1c3RlciAqbmV4dENsdXN0ZXI7Ci0gICAgICAgICAgICByZXMgPSBtRXh0cmFjdG9yLT5tU2VnbWVudC0+UGFyc2VOZXh0KAotICAgICAgICAgICAgICAgICAgICBtQ2x1c3RlciwgbmV4dENsdXN0ZXIsIHBvcywgbGVuKTsKLSAgICAgICAgICAgIEFMT0dWKCJQYXJzZU5leHQgcmV0dXJuZWQgJWxkIiwgcmVzKTsKLQotICAgICAgICAgICAgaWYgKHJlcyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gRU9GIG9yIGVycm9yCi0KLSAgICAgICAgICAgICAgICBtQ2x1c3RlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENIRUNLX0VRKHJlcywgMCk7Ci0gICAgICAgICAgICBDSEVDSyhuZXh0Q2x1c3RlciAhPSBOVUxMKTsKLSAgICAgICAgICAgIENIRUNLKCFuZXh0Q2x1c3Rlci0+RU9TKCkpOwotCi0gICAgICAgICAgICBtQ2x1c3RlciA9IG5leHRDbHVzdGVyOwotCi0gICAgICAgICAgICByZXMgPSBtQ2x1c3Rlci0+UGFyc2UocG9zLCBsZW4pOwotICAgICAgICAgICAgQUxPR1YoIlBhcnNlICgyKSByZXR1cm5lZCAlbGQiLCByZXMpOwotICAgICAgICAgICAgQ0hFQ0tfR0UocmVzLCAwKTsKLQotICAgICAgICAgICAgbUJsb2NrRW50cnlJbmRleCA9IDA7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIENIRUNLKG1CbG9ja0VudHJ5ICE9IE5VTEwpOwotICAgICAgICBDSEVDSyhtQmxvY2tFbnRyeS0+R2V0QmxvY2soKSAhPSBOVUxMKTsKLSAgICAgICAgKyttQmxvY2tFbnRyeUluZGV4OwotCi0gICAgICAgIGlmIChtQmxvY2tFbnRyeS0+R2V0QmxvY2soKS0+R2V0VHJhY2tOdW1iZXIoKSA9PSBtVHJhY2tOdW0pIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIEJsb2NrSXRlcmF0b3I6OnJlc2V0KCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtRXh0cmFjdG9yLT5tTG9jayk7Ci0KLSAgICBtQ2x1c3RlciA9IG1FeHRyYWN0b3ItPm1TZWdtZW50LT5HZXRGaXJzdCgpOwotICAgIG1CbG9ja0VudHJ5ID0gTlVMTDsKLSAgICBtQmxvY2tFbnRyeUluZGV4ID0gMDsKLQotICAgIGRvIHsKLSAgICAgICAgYWR2YW5jZV9sKCk7Ci0gICAgfSB3aGlsZSAoIWVvcygpICYmIGJsb2NrKCktPkdldFRyYWNrTnVtYmVyKCkgIT0gbVRyYWNrTnVtKTsKLX0KLQotdm9pZCBCbG9ja0l0ZXJhdG9yOjpzZWVrKAotICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXMsIGJvb2wgaXNBdWRpbywKLSAgICAgICAgaW50NjRfdCAqYWN0dWFsRnJhbWVUaW1lVXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUV4dHJhY3Rvci0+bUxvY2spOwotCi0gICAgKmFjdHVhbEZyYW1lVGltZVVzID0gLTFsbDsKLQotICAgIGlmIChzZWVrVGltZVVzID4gSU5UNjRfTUFYIC8gMTAwMGxsIHx8Ci0gICAgICAgICAgICBzZWVrVGltZVVzIDwgSU5UNjRfTUlOIC8gMTAwMGxsIHx8Ci0gICAgICAgICAgICAobUV4dHJhY3Rvci0+bVNlZWtQcmVSb2xsTnMgPiAwICYmCi0gICAgICAgICAgICAgICAgICAgIChzZWVrVGltZVVzICogMTAwMGxsKSA8IElOVDY0X01JTiArIG1FeHRyYWN0b3ItPm1TZWVrUHJlUm9sbE5zKSB8fAotICAgICAgICAgICAgKG1FeHRyYWN0b3ItPm1TZWVrUHJlUm9sbE5zIDwgMCAmJgotICAgICAgICAgICAgICAgICAgICAoc2Vla1RpbWVVcyAqIDEwMDBsbCkgPiBJTlQ2NF9NQVggKyBtRXh0cmFjdG9yLT5tU2Vla1ByZVJvbGxOcykpIHsKLSAgICAgICAgQUxPR0UoImNhbm5vdCBzZWVrIHRvICVsbGQiLCAobG9uZyBsb25nKSBzZWVrVGltZVVzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNvbnN0IGludDY0X3Qgc2Vla1RpbWVOcyA9IHNlZWtUaW1lVXMgKiAxMDAwbGwgLSBtRXh0cmFjdG9yLT5tU2Vla1ByZVJvbGxOczsKLQotICAgIG1rdnBhcnNlcjo6U2VnbWVudCogY29uc3QgcFNlZ21lbnQgPSBtRXh0cmFjdG9yLT5tU2VnbWVudDsKLQotICAgIC8vIFNwZWNpYWwgY2FzZSB0aGUgMCBzZWVrIHRvIGF2b2lkIGxvYWRpbmcgQ3VlcyB3aGVuIHRoZSBhcHBsaWNhdGlvbgotICAgIC8vIGV4dHJhbmVvdXNseSBzZWVrcyB0byAwIGJlZm9yZSBwbGF5aW5nLgotICAgIGlmIChzZWVrVGltZU5zIDw9IDApIHsKLSAgICAgICAgQUxPR1YoIlNlZWsgdG8gYmVnaW5uaW5nOiAlIiBQUklkNjQsIHNlZWtUaW1lVXMpOwotICAgICAgICBtQ2x1c3RlciA9IHBTZWdtZW50LT5HZXRGaXJzdCgpOwotICAgICAgICBtQmxvY2tFbnRyeUluZGV4ID0gMDsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgYWR2YW5jZV9sKCk7Ci0gICAgICAgIH0gd2hpbGUgKCFlb3MoKSAmJiBibG9jaygpLT5HZXRUcmFja051bWJlcigpICE9IG1UcmFja051bSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBTE9HVigiU2Vla2luZyB0bzogJSIgUFJJZDY0LCBzZWVrVGltZVVzKTsKLQotICAgIC8vIElmIHRoZSBDdWVzIGhhdmUgbm90IGJlZW4gbG9jYXRlZCB0aGVuIGZpbmQgdGhlbS4KLSAgICBjb25zdCBta3ZwYXJzZXI6OkN1ZXMqIHBDdWVzID0gcFNlZ21lbnQtPkdldEN1ZXMoKTsKLSAgICBjb25zdCBta3ZwYXJzZXI6OlNlZWtIZWFkKiBwU0ggPSBwU2VnbWVudC0+R2V0U2Vla0hlYWQoKTsKLSAgICBpZiAoIXBDdWVzICYmIHBTSCkgewotICAgICAgICBjb25zdCBzaXplX3QgY291bnQgPSBwU0gtPkdldENvdW50KCk7Ci0gICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6U2Vla0hlYWQ6OkVudHJ5KiBwRW50cnk7Ci0gICAgICAgIEFMT0dWKCJObyBDdWVzIHlldCIpOwotCi0gICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKykgewotICAgICAgICAgICAgcEVudHJ5ID0gcFNILT5HZXRFbnRyeShpbmRleCk7Ci0KLSAgICAgICAgICAgIGlmIChwRW50cnktPmlkID09IDB4MEM1M0JCNkIpIHsgLy8gQ3VlcyBJRAotICAgICAgICAgICAgICAgIGxvbmcgbGVuOyBsb25nIGxvbmcgcG9zOwotICAgICAgICAgICAgICAgIHBTZWdtZW50LT5QYXJzZUN1ZXMocEVudHJ5LT5wb3MsIHBvcywgbGVuKTsKLSAgICAgICAgICAgICAgICBwQ3VlcyA9IHBTZWdtZW50LT5HZXRDdWVzKCk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIkN1ZXMgZm91bmQiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghcEN1ZXMpIHsKLSAgICAgICAgICAgIEFMT0dFKCJObyBDdWVzIGluIGZpbGUiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICghcFNIKSB7Ci0gICAgICAgIEFMT0dFKCJObyBTZWVrSGVhZCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY29uc3QgbWt2cGFyc2VyOjpDdWVQb2ludCogcENQOwotICAgIG1rdnBhcnNlcjo6VHJhY2tzIGNvbnN0ICpwVHJhY2tzID0gcFNlZ21lbnQtPkdldFRyYWNrcygpOwotICAgIHdoaWxlICghcEN1ZXMtPkRvbmVQYXJzaW5nKCkpIHsKLSAgICAgICAgcEN1ZXMtPkxvYWRDdWVQb2ludCgpOwotICAgICAgICBwQ1AgPSBwQ3Vlcy0+R2V0TGFzdCgpOwotICAgICAgICBDSEVDSyhwQ1ApOwotCi0gICAgICAgIHNpemVfdCB0cmFja0NvdW50ID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5zaXplKCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCB0cmFja0NvdW50OyArK2luZGV4KSB7Ci0gICAgICAgICAgICBNYXRyb3NrYUV4dHJhY3Rvcjo6VHJhY2tJbmZvJiB0cmFjayA9IG1FeHRyYWN0b3ItPm1UcmFja3MuZWRpdEl0ZW1BdChpbmRleCk7Ci0gICAgICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrICpwVHJhY2sgPSBwVHJhY2tzLT5HZXRUcmFja0J5TnVtYmVyKHRyYWNrLm1UcmFja051bSk7Ci0gICAgICAgICAgICBpZiAocFRyYWNrICYmIHBUcmFjay0+R2V0VHlwZSgpID09IDEgJiYgcENQLT5GaW5kKHBUcmFjaykpIHsgLy8gVklERU9fVFJBQ0sKLSAgICAgICAgICAgICAgICB0cmFjay5tQ3VlUG9pbnRzLnB1c2hfYmFjayhwQ1ApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBDUC0+R2V0VGltZShwU2VnbWVudCkgPj0gc2Vla1RpbWVOcykgewotICAgICAgICAgICAgQUxPR1YoIlBhcnNlZCBwYXN0IHJlbGV2YW50IEN1ZSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjb25zdCBta3ZwYXJzZXI6OkN1ZVBvaW50OjpUcmFja1Bvc2l0aW9uICpwVFAgPSBOVUxMOwotICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2sgKnRoaXNUcmFjayA9IHBUcmFja3MtPkdldFRyYWNrQnlOdW1iZXIobVRyYWNrTnVtKTsKLSAgICBpZiAodGhpc1RyYWNrLT5HZXRUeXBlKCkgPT0gMSkgeyAvLyB2aWRlbwotICAgICAgICBNYXRyb3NrYUV4dHJhY3Rvcjo6VHJhY2tJbmZvJiB0cmFjayA9IG1FeHRyYWN0b3ItPm1UcmFja3MuZWRpdEl0ZW1BdChtSW5kZXgpOwotICAgICAgICBwVFAgPSB0cmFjay5maW5kKHNlZWtUaW1lTnMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFRoZSBDdWUgaW5kZXggaXMgYnVpbHQgYXJvdW5kIHZpZGVvIGtleWZyYW1lcwotICAgICAgICB1bnNpZ25lZCBsb25nIGludCB0cmFja0NvdW50ID0gcFRyYWNrcy0+R2V0VHJhY2tzQ291bnQoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHRyYWNrQ291bnQ7ICsraW5kZXgpIHsKLSAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2sgKnBUcmFjayA9IHBUcmFja3MtPkdldFRyYWNrQnlJbmRleChpbmRleCk7Ci0gICAgICAgICAgICBpZiAocFRyYWNrICYmIHBUcmFjay0+R2V0VHlwZSgpID09IDEgJiYgcEN1ZXMtPkZpbmQoc2Vla1RpbWVOcywgcFRyYWNrLCBwQ1AsIHBUUCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW8gdHJhY2sgbG9jYXRlZCBhdCAlenUiLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8vIEFsd2F5cyAqc2VhcmNoKiBiYXNlZCBvbiB0aGUgdmlkZW8gdHJhY2ssIGJ1dCBmaW5hbGl6ZSBiYXNlZCBvbiBtVHJhY2tOdW0KLSAgICBpZiAoIXBUUCkgewotICAgICAgICBBTE9HRSgiRGlkIG5vdCBsb2NhdGUgdGhlIHZpZGVvIHRyYWNrIGZvciBzZWVraW5nIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtQ2x1c3RlciA9IHBTZWdtZW50LT5GaW5kT3JQcmVsb2FkQ2x1c3RlcihwVFAtPm1fcG9zKTsKLQotICAgIENIRUNLKG1DbHVzdGVyKTsKLSAgICBDSEVDSyghbUNsdXN0ZXItPkVPUygpKTsKLQotICAgIC8vIG1CbG9ja0VudHJ5SW5kZXggc3RhcnRzIGF0IDAgYnV0IG1fYmxvY2sgc3RhcnRzIGF0IDEKLSAgICBDSEVDS19HVChwVFAtPm1fYmxvY2ssIDApOwotICAgIG1CbG9ja0VudHJ5SW5kZXggPSBwVFAtPm1fYmxvY2sgLSAxOwotCi0gICAgZm9yICg7OykgewotICAgICAgICBhZHZhbmNlX2woKTsKLQotICAgICAgICBpZiAoZW9zKCkpIGJyZWFrOwotCi0gICAgICAgIGlmIChpc0F1ZGlvIHx8IGJsb2NrKCktPklzS2V5KCkpIHsKLSAgICAgICAgICAgIC8vIEFjY2VwdCB0aGUgZmlyc3Qga2V5IGZyYW1lCi0gICAgICAgICAgICBpbnQ2NF90IGZyYW1lVGltZVVzID0gKGJsb2NrKCktPkdldFRpbWUobUNsdXN0ZXIpICsgNTAwTEwpIC8gMTAwMExMOwotICAgICAgICAgICAgaWYgKHRoaXNUcmFjay0+R2V0VHlwZSgpID09IDEgfHwgZnJhbWVUaW1lVXMgPj0gc2Vla1RpbWVVcykgewotICAgICAgICAgICAgICAgICphY3R1YWxGcmFtZVRpbWVVcyA9IGZyYW1lVGltZVVzOwotICAgICAgICAgICAgICAgIEFMT0dWKCJSZXF1ZXN0ZWQgc2VlayBwb2ludDogJSIgUFJJZDY0ICIgYWN0dWFsOiAlIiBQUklkNjQsCi0gICAgICAgICAgICAgICAgICAgICAgc2Vla1RpbWVVcywgKmFjdHVhbEZyYW1lVGltZVVzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotY29uc3QgbWt2cGFyc2VyOjpCbG9jayAqQmxvY2tJdGVyYXRvcjo6YmxvY2soKSBjb25zdCB7Ci0gICAgQ0hFQ0soIWVvcygpKTsKLQotICAgIHJldHVybiBtQmxvY2tFbnRyeS0+R2V0QmxvY2soKTsKLX0KLQotaW50NjRfdCBCbG9ja0l0ZXJhdG9yOjpibG9ja1RpbWVVcygpIGNvbnN0IHsKLSAgICBpZiAobUNsdXN0ZXIgPT0gTlVMTCB8fCBtQmxvY2tFbnRyeSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIChtQmxvY2tFbnRyeS0+R2V0QmxvY2soKS0+R2V0VGltZShtQ2x1c3RlcikgKyA1MDBsbCkgLyAxMDAwbGw7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLXN0YXRpYyB1bnNpZ25lZCBVMjRfQVQoY29uc3QgdWludDhfdCAqcHRyKSB7Ci0gICAgcmV0dXJuIHB0clswXSA8PCAxNiB8IHB0clsxXSA8PCA4IHwgcHRyWzJdOwotfQotCi12b2lkIE1hdHJvc2thU291cmNlOjpjbGVhclBlbmRpbmdGcmFtZXMoKSB7Ci0gICAgd2hpbGUgKCFtUGVuZGluZ0ZyYW1lcy5lbXB0eSgpKSB7Ci0gICAgICAgIE1lZGlhQnVmZmVyICpmcmFtZSA9ICptUGVuZGluZ0ZyYW1lcy5iZWdpbigpOwotICAgICAgICBtUGVuZGluZ0ZyYW1lcy5lcmFzZShtUGVuZGluZ0ZyYW1lcy5iZWdpbigpKTsKLQotICAgICAgICBmcmFtZS0+cmVsZWFzZSgpOwotICAgICAgICBmcmFtZSA9IE5VTEw7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6c2V0V2VibUJsb2NrQ3J5cHRvSW5mbyhNZWRpYUJ1ZmZlciAqbWJ1ZikgewotICAgIGlmIChtYnVmLT5yYW5nZV9sZW5ndGgoKSA8IDEgfHwgbWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSAxID4gSU5UMzJfTUFYKSB7Ci0gICAgICAgIC8vIDEtYnl0ZSBzaWduYWwKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBjb25zdCB1aW50OF90ICpkYXRhID0gKGNvbnN0IHVpbnQ4X3QgKiltYnVmLT5kYXRhKCkgKyBtYnVmLT5yYW5nZV9vZmZzZXQoKTsKLSAgICBib29sIGJsb2NrRW5jcnlwdGVkID0gZGF0YVswXSAmIDB4MTsKLSAgICBpZiAoYmxvY2tFbmNyeXB0ZWQgJiYgbWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgPCA5KSB7Ci0gICAgICAgIC8vIDEtYnl0ZSBzaWduYWwgKyA4LWJ5dGUgSVYKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1idWYtPm1ldGFfZGF0YSgpOwotICAgIGlmIChibG9ja0VuY3J5cHRlZCkgewotICAgICAgICAvKgotICAgICAgICAgKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMwotICAgICAgICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCi0gICAgICAgICAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICAgICAgICAgKiAgfCAgU2lnbmFsIEJ5dGUgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAgICogICstKy0rLSstKy0rLSstKy0rICAgICAgICAgICAgIElWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICAgKiAgfCAgICAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgICogIHwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAqICB8LSstKy0rLSstKy0rLSstKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICAgKiAgOiAgICAgICAgICAgICAgIEJ5dGVzIDEuLk4gb2YgZW5jcnlwdGVkIGZyYW1lICAgICAgICAgICAgICAgICAgIDoKLSAgICAgICAgICogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICAgKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgICovCi0gICAgICAgIGludDMyX3QgcGxhaW5TaXplc1tdID0geyAwIH07Ci0gICAgICAgIGludDMyX3QgZW5jcnlwdGVkU2l6ZXNbXSA9IHsgc3RhdGljX2Nhc3Q8aW50MzJfdD4obWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSA5KSB9OwotICAgICAgICB1aW50OF90IGN0ckNvdW50ZXJbMTZdID0geyAwIH07Ci0gICAgICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmtleUlkOwotICAgICAgICBzaXplX3Qga2V5SWRTaXplOwotICAgICAgICBzcDxNZXRhRGF0YT4gdHJhY2tNZXRhID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQobVRyYWNrSW5kZXgpLm1NZXRhOwotICAgICAgICBDSEVDSyh0cmFja01ldGEtPmZpbmREYXRhKGtLZXlDcnlwdG9LZXksICZ0eXBlLCAoY29uc3Qgdm9pZCAqKikma2V5SWQsICZrZXlJZFNpemUpKTsKLSAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5Q3J5cHRvS2V5LCAwLCBrZXlJZCwga2V5SWRTaXplKTsKLSAgICAgICAgbWVtY3B5KGN0ckNvdW50ZXIsIGRhdGEgKyAxLCA4KTsKLSAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5Q3J5cHRvSVYsIDAsIGN0ckNvdW50ZXIsIDE2KTsKLSAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5UGxhaW5TaXplcywgMCwgcGxhaW5TaXplcywgc2l6ZW9mKHBsYWluU2l6ZXMpKTsKLSAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsIDAsIGVuY3J5cHRlZFNpemVzLCBzaXplb2YoZW5jcnlwdGVkU2l6ZXMpKTsKLSAgICAgICAgbWJ1Zi0+c2V0X3JhbmdlKDksIG1idWYtPnJhbmdlX2xlbmd0aCgpIC0gOSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKLSAgICAgICAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQotICAgICAgICAgKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgICogIHwgIFNpZ25hbCBCeXRlICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAqICArLSstKy0rLSstKy0rLSstKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICAgKiAgOiAgICAgICAgICAgICAgIEJ5dGVzIDEuLk4gb2YgdW5lbmNyeXB0ZWQgZnJhbWUgICAgICAgICAgICAgICAgIDoKLSAgICAgICAgICogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICAgKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgICovCi0gICAgICAgIGludDMyX3QgcGxhaW5TaXplc1tdID0geyBzdGF0aWNfY2FzdDxpbnQzMl90PihtYnVmLT5yYW5nZV9sZW5ndGgoKSAtIDEpIH07Ci0gICAgICAgIGludDMyX3QgZW5jcnlwdGVkU2l6ZXNbXSA9IHsgMCB9OwotICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlQbGFpblNpemVzLCAwLCBwbGFpblNpemVzLCBzaXplb2YocGxhaW5TaXplcykpOwotICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgMCwgZW5jcnlwdGVkU2l6ZXMsIHNpemVvZihlbmNyeXB0ZWRTaXplcykpOwotICAgICAgICBtYnVmLT5zZXRfcmFuZ2UoMSwgbWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSAxKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE1hdHJvc2thU291cmNlOjpyZWFkQmxvY2soKSB7Ci0gICAgQ0hFQ0sobVBlbmRpbmdGcmFtZXMuZW1wdHkoKSk7Ci0KLSAgICBpZiAobUJsb2NrSXRlci5lb3MoKSkgewotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICB9Ci0KLSAgICBjb25zdCBta3ZwYXJzZXI6OkJsb2NrICpibG9jayA9IG1CbG9ja0l0ZXIuYmxvY2soKTsKLQotICAgIGludDY0X3QgdGltZVVzID0gbUJsb2NrSXRlci5ibG9ja1RpbWVVcygpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBibG9jay0+R2V0RnJhbWVDb3VudCgpOyArK2kpIHsKLSAgICAgICAgTWF0cm9za2FFeHRyYWN0b3I6OlRyYWNrSW5mbyAqdHJhY2tJbmZvID0gJm1FeHRyYWN0b3ItPm1UcmFja3MuZWRpdEl0ZW1BdChtVHJhY2tJbmRleCk7Ci0gICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6QmxvY2s6OkZyYW1lICZmcmFtZSA9IGJsb2NrLT5HZXRGcmFtZShpKTsKLSAgICAgICAgc2l6ZV90IGxlbiA9IGZyYW1lLmxlbjsKLSAgICAgICAgaWYgKFNJWkVfTUFYIC0gbGVuIDwgdHJhY2tJbmZvLT5tSGVhZGVyTGVuKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgbGVuICs9IHRyYWNrSW5mby0+bUhlYWRlckxlbjsKLSAgICAgICAgTWVkaWFCdWZmZXIgKm1idWYgPSBuZXcgTWVkaWFCdWZmZXIobGVuKTsKLSAgICAgICAgdWludDhfdCAqZGF0YSA9IHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4obWJ1Zi0+ZGF0YSgpKTsKLSAgICAgICAgaWYgKHRyYWNrSW5mby0+bUhlYWRlcikgewotICAgICAgICAgICAgbWVtY3B5KGRhdGEsIHRyYWNrSW5mby0+bUhlYWRlciwgdHJhY2tJbmZvLT5tSGVhZGVyTGVuKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKLSAgICAgICAgbWJ1Zi0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgYmxvY2stPklzS2V5KCkpOwotCi0gICAgICAgIHN0YXR1c190IGVyciA9IGZyYW1lLlJlYWQobUV4dHJhY3Rvci0+bVJlYWRlciwgZGF0YSArIHRyYWNrSW5mby0+bUhlYWRlckxlbik7Ci0gICAgICAgIGlmIChlcnIgPT0gT0sKLSAgICAgICAgICAgICAgICAmJiBtRXh0cmFjdG9yLT5tSXNXZWJtCi0gICAgICAgICAgICAgICAgJiYgdHJhY2tJbmZvLT5tRW5jcnlwdGVkKSB7Ci0gICAgICAgICAgICBlcnIgPSBzZXRXZWJtQmxvY2tDcnlwdG9JbmZvKG1idWYpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgbVBlbmRpbmdGcmFtZXMuY2xlYXIoKTsKLQotICAgICAgICAgICAgbUJsb2NrSXRlci5hZHZhbmNlKCk7Ci0gICAgICAgICAgICBtYnVmLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgbVBlbmRpbmdGcmFtZXMucHVzaF9iYWNrKG1idWYpOwotICAgIH0KLQotICAgIG1CbG9ja0l0ZXIuYWR2YW5jZSgpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7Ci0gICAgKm91dCA9IE5VTEw7Ci0KLSAgICBpbnQ2NF90IHRhcmdldFNhbXBsZVRpbWVVcyA9IC0xbGw7Ci0KLSAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7Ci0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkKLSAgICAgICAgICAgICYmICFtRXh0cmFjdG9yLT5pc0xpdmVTdHJlYW1pbmcoKSkgewotICAgICAgICBjbGVhclBlbmRpbmdGcmFtZXMoKTsKLQotICAgICAgICAvLyBUaGUgYXVkaW8gd2Ugd2FudCBpcyBsb2NhdGVkIGJ5IHVzaW5nIHRoZSBDdWVzIHRvIHNlZWsgdGhlIHZpZGVvCi0gICAgICAgIC8vIHN0cmVhbSB0byBmaW5kIHRoZSB0YXJnZXQgQ2x1c3RlciB0aGVuIGl0ZXJhdGluZyB0byBmaW5hbGl6ZSBmb3IKLSAgICAgICAgLy8gYXVkaW8uCi0gICAgICAgIGludDY0X3QgYWN0dWFsRnJhbWVUaW1lVXM7Ci0gICAgICAgIG1CbG9ja0l0ZXIuc2VlayhzZWVrVGltZVVzLCBtSXNBdWRpbywgJmFjdHVhbEZyYW1lVGltZVVzKTsKLQotICAgICAgICBpZiAobW9kZSA9PSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUKSB7Ci0gICAgICAgICAgICB0YXJnZXRTYW1wbGVUaW1lVXMgPSBhY3R1YWxGcmFtZVRpbWVVczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHdoaWxlIChtUGVuZGluZ0ZyYW1lcy5lbXB0eSgpKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IHJlYWRCbG9jaygpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIGNsZWFyUGVuZGluZ0ZyYW1lcygpOwotCi0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgTWVkaWFCdWZmZXIgKmZyYW1lID0gKm1QZW5kaW5nRnJhbWVzLmJlZ2luKCk7Ci0gICAgbVBlbmRpbmdGcmFtZXMuZXJhc2UobVBlbmRpbmdGcmFtZXMuYmVnaW4oKSk7Ci0KLSAgICBpZiAobVR5cGUgIT0gQVZDIHx8IG1OQUxTaXplTGVuID09IDApIHsKLSAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwbGwpIHsKLSAgICAgICAgICAgIGZyYW1lLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCB0YXJnZXRTYW1wbGVUaW1lVXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgKm91dCA9IGZyYW1lOwotCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICAvLyBFYWNoIGlucHV0IGZyYW1lIGNvbnRhaW5zIG9uZSBvciBtb3JlIE5BTCBmcmFnbWVudHMsIGVhY2ggZnJhZ21lbnQKLSAgICAvLyBpcyBwcmVmaXhlZCBieSBtTkFMU2l6ZUxlbiBieXRlcyBnaXZpbmcgdGhlIGZyYWdtZW50IGxlbmd0aCwKLSAgICAvLyBmb2xsb3dlZCBieSBhIGNvcnJlc3BvbmRpbmcgbnVtYmVyIG9mIGJ5dGVzIGNvbnRhaW5pbmcgdGhlIGZyYWdtZW50LgotICAgIC8vIFdlIG91dHB1dCBhbGwgdGhlc2UgZnJhZ21lbnRzIGludG8gYSBzaW5nbGUgbGFyZ2UgYnVmZmVyIHNlcGFyYXRlZAotICAgIC8vIGJ5IHN0YXJ0Y29kZXMgKDB4MDAgMHgwMCAweDAwIDB4MDEpLgotICAgIC8vCi0gICAgLy8gV2hlbiBtTkFMU2l6ZUxlbiBpcyAwLCB3ZSBhc3N1bWUgdGhlIGRhdGEgaXMgYWxyZWFkeSBpbiB0aGUgZm9ybWF0Ci0gICAgLy8gZGVzaXJlZC4KLQotICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1B0ciA9Ci0gICAgICAgIChjb25zdCB1aW50OF90ICopZnJhbWUtPmRhdGEoKSArIGZyYW1lLT5yYW5nZV9vZmZzZXQoKTsKLQotICAgIHNpemVfdCBzcmNTaXplID0gZnJhbWUtPnJhbmdlX2xlbmd0aCgpOwotCi0gICAgc2l6ZV90IGRzdFNpemUgPSAwOwotICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBOVUxMOwotICAgIHVpbnQ4X3QgKmRzdFB0ciA9IE5VTEw7Ci0KLSAgICBmb3IgKGludDMyX3QgcGFzcyA9IDA7IHBhc3MgPCAyOyArK3Bhc3MpIHsKLSAgICAgICAgc2l6ZV90IHNyY09mZnNldCA9IDA7Ci0gICAgICAgIHNpemVfdCBkc3RPZmZzZXQgPSAwOwotICAgICAgICB3aGlsZSAoc3JjT2Zmc2V0ICsgbU5BTFNpemVMZW4gPD0gc3JjU2l6ZSkgewotICAgICAgICAgICAgc2l6ZV90IE5BTHNpemU7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1OQUxTaXplTGVuKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiBOQUxzaXplID0gc3JjUHRyW3NyY09mZnNldF07IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjogTkFMc2l6ZSA9IFUxNl9BVChzcmNQdHIgKyBzcmNPZmZzZXQpOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDM6IE5BTHNpemUgPSBVMjRfQVQoc3JjUHRyICsgc3JjT2Zmc2V0KTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA0OiBOQUxzaXplID0gVTMyX0FUKHNyY1B0ciArIHNyY09mZnNldCk7IGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzcmNPZmZzZXQgKyBtTkFMU2l6ZUxlbiArIE5BTHNpemUgPD0gc3JjT2Zmc2V0ICsgbU5BTFNpemVMZW4pIHsKLSAgICAgICAgICAgICAgICBmcmFtZS0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIGZyYW1lID0gTlVMTDsKLQotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNyY09mZnNldCArIG1OQUxTaXplTGVuICsgTkFMc2l6ZSA+IHNyY1NpemUpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBhc3MgPT0gMSkgewotICAgICAgICAgICAgICAgIG1lbWNweSgmZHN0UHRyW2RzdE9mZnNldF0sICJceDAwXHgwMFx4MDBceDAxIiwgNCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZnJhbWUgIT0gYnVmZmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgmZHN0UHRyW2RzdE9mZnNldCArIDRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY1B0cltzcmNPZmZzZXQgKyBtTkFMU2l6ZUxlbl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBOQUxzaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRzdE9mZnNldCArPSA0OyAgLy8gMHgwMCAwMCAwMCAwMQotICAgICAgICAgICAgZHN0T2Zmc2V0ICs9IE5BTHNpemU7Ci0KLSAgICAgICAgICAgIHNyY09mZnNldCArPSBtTkFMU2l6ZUxlbiArIE5BTHNpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3JjT2Zmc2V0IDwgc3JjU2l6ZSkgewotICAgICAgICAgICAgLy8gVGhlcmUgd2VyZSB0cmFpbGluZyBieXRlcyBvciBub3QgZW5vdWdoIGRhdGEgdG8gY29tcGxldGUKLSAgICAgICAgICAgIC8vIGEgZnJhZ21lbnQuCi0KLSAgICAgICAgICAgIGZyYW1lLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBmcmFtZSA9IE5VTEw7Ci0KLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGFzcyA9PSAwKSB7Ci0gICAgICAgICAgICBkc3RTaXplID0gZHN0T2Zmc2V0OwotCi0gICAgICAgICAgICBpZiAoZHN0U2l6ZSA9PSBzcmNTaXplICYmIG1OQUxTaXplTGVuID09IDQpIHsKLSAgICAgICAgICAgICAgICAvLyBJbiB0aGlzIHNwZWNpYWwgY2FzZSB3ZSBjYW4gcmUtdXNlIHRoZSBpbnB1dCBidWZmZXIgYnkgc3Vic3RpdHV0aW5nCi0gICAgICAgICAgICAgICAgLy8gZWFjaCA0LWJ5dGUgbmFsIHNpemUgd2l0aCBhIDQtYnl0ZSBzdGFydCBjb2RlCi0gICAgICAgICAgICAgICAgYnVmZmVyID0gZnJhbWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihkc3RTaXplKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgICAgICBDSEVDSyhmcmFtZS0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwotICAgICAgICAgICAgaW50MzJfdCBpc1N5bmM7Ci0gICAgICAgICAgICBDSEVDSyhmcmFtZS0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsICZpc1N5bmMpKTsKLQotICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7Ci0gICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIGlzU3luYyk7Ci0KLSAgICAgICAgICAgIGRzdFB0ciA9ICh1aW50OF90ICopYnVmZmVyLT5kYXRhKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZnJhbWUgIT0gYnVmZmVyKSB7Ci0gICAgICAgIGZyYW1lLT5yZWxlYXNlKCk7Ci0gICAgICAgIGZyYW1lID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDBsbCkgewotICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICBrS2V5VGFyZ2V0VGltZSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKLSAgICB9Ci0KLSAgICAqb3V0ID0gYnVmZmVyOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1NYXRyb3NrYUV4dHJhY3Rvcjo6TWF0cm9za2FFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkKLSAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCi0gICAgICBtUmVhZGVyKG5ldyBEYXRhU291cmNlUmVhZGVyKG1EYXRhU291cmNlKSksCi0gICAgICBtU2VnbWVudChOVUxMKSwKLSAgICAgIG1FeHRyYWN0ZWRUaHVtYm5haWxzKGZhbHNlKSwKLSAgICAgIG1Jc1dlYm0oZmFsc2UpLAotICAgICAgbVNlZWtQcmVSb2xsTnMoMCkgewotICAgIG9mZjY0X3Qgc2l6ZTsKLSAgICBtSXNMaXZlU3RyZWFtaW5nID0KLSAgICAgICAgKG1EYXRhU291cmNlLT5mbGFncygpCi0gICAgICAgICAgICAmIChEYXRhU291cmNlOjprV2FudHNQcmVmZXRjaGluZwotICAgICAgICAgICAgICAgIHwgRGF0YVNvdXJjZTo6a0lzQ2FjaGluZ0RhdGFTb3VyY2UpKQotICAgICAgICAmJiBtRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSkgIT0gT0s7Ci0KLSAgICBta3ZwYXJzZXI6OkVCTUxIZWFkZXIgZWJtbEhlYWRlcjsKLSAgICBsb25nIGxvbmcgcG9zOwotICAgIGlmIChlYm1sSGVhZGVyLlBhcnNlKG1SZWFkZXIsIHBvcykgPCAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoZWJtbEhlYWRlci5tX2RvY1R5cGUgJiYgIXN0cmNtcCgid2VibSIsIGVibWxIZWFkZXIubV9kb2NUeXBlKSkgewotICAgICAgICBtSXNXZWJtID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBsb25nIGxvbmcgcmV0ID0KLSAgICAgICAgbWt2cGFyc2VyOjpTZWdtZW50OjpDcmVhdGVJbnN0YW5jZShtUmVhZGVyLCBwb3MsIG1TZWdtZW50KTsKLQotICAgIGlmIChyZXQpIHsKLSAgICAgICAgQ0hFQ0sobVNlZ21lbnQgPT0gTlVMTCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBmcm9tIG1rdnBhcnNlcjo6U2VnbWVudDo6TG9hZCgpLCBidXQgc3RvcCBhdCBmaXJzdCBjbHVzdGVyCi0gICAgcmV0ID0gbVNlZ21lbnQtPlBhcnNlSGVhZGVycygpOwotICAgIGlmIChyZXQgPT0gMCkgewotICAgICAgICBsb25nIGxlbjsKLSAgICAgICAgcmV0ID0gbVNlZ21lbnQtPkxvYWRDbHVzdGVyKHBvcywgbGVuKTsKLSAgICAgICAgaWYgKHJldCA+PSAxKSB7Ci0gICAgICAgICAgICAvLyBubyBtb3JlIGNsdXN0ZXJzCi0gICAgICAgICAgICByZXQgPSAwOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7Ci0gICAgICAgIHJldCA9IG1rdnBhcnNlcjo6RV9CVUZGRVJfTk9UX0ZVTEw7Ci0gICAgfQotCi0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgQUxPR1coIkNvcnJ1cHQgJXMgc291cmNlOiAlcyIsIG1Jc1dlYm0gPyAid2VibSIgOiAibWF0cm9za2EiLAotICAgICAgICAgICAgICAgIHVyaURlYnVnU3RyaW5nKG1EYXRhU291cmNlLT5nZXRVcmkoKSkuY19zdHIoKSk7Ci0gICAgICAgIGRlbGV0ZSBtU2VnbWVudDsKLSAgICAgICAgbVNlZ21lbnQgPSBOVUxMOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0jaWYgMAotICAgIGNvbnN0IG1rdnBhcnNlcjo6U2VnbWVudEluZm8gKmluZm8gPSBtU2VnbWVudC0+R2V0SW5mbygpOwotICAgIEFMT0dJKCJtdXhpbmcgYXBwOiAlcywgd3JpdGluZyBhcHA6ICVzIiwKLSAgICAgICAgIGluZm8tPkdldE11eGluZ0FwcEFzVVRGOCgpLAotICAgICAgICAgaW5mby0+R2V0V3JpdGluZ0FwcEFzVVRGOCgpKTsKLSNlbmRpZgotCi0gICAgYWRkVHJhY2tzKCk7Ci19Ci0KLU1hdHJvc2thRXh0cmFjdG9yOjp+TWF0cm9za2FFeHRyYWN0b3IoKSB7Ci0gICAgZGVsZXRlIG1TZWdtZW50OwotICAgIG1TZWdtZW50ID0gTlVMTDsKLQotICAgIGRlbGV0ZSBtUmVhZGVyOwotICAgIG1SZWFkZXIgPSBOVUxMOwotfQotCi1zaXplX3QgTWF0cm9za2FFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewotICAgIHJldHVybiBtVHJhY2tzLnNpemUoKTsKLX0KLQotc3A8SU1lZGlhU291cmNlPiBNYXRyb3NrYUV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7Ci0gICAgaWYgKGluZGV4ID49IG1UcmFja3Muc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBuZXcgTWF0cm9za2FTb3VyY2UodGhpcywgaW5kZXgpOwotfQotCi1zcDxNZXRhRGF0YT4gTWF0cm9za2FFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKLSAgICBpZiAoaW5kZXggPj0gbVRyYWNrcy5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKChmbGFncyAmIGtJbmNsdWRlRXh0ZW5zaXZlTWV0YURhdGEpICYmICFtRXh0cmFjdGVkVGh1bWJuYWlscwotICAgICAgICAgICAgJiYgIWlzTGl2ZVN0cmVhbWluZygpKSB7Ci0gICAgICAgIGZpbmRUaHVtYm5haWxzKCk7Ci0gICAgICAgIG1FeHRyYWN0ZWRUaHVtYm5haWxzID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbVRyYWNrcy5pdGVtQXQoaW5kZXgpLm1NZXRhOwotfQotCi1ib29sIE1hdHJvc2thRXh0cmFjdG9yOjppc0xpdmVTdHJlYW1pbmcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Jc0xpdmVTdHJlYW1pbmc7Ci19Ci0KLXN0YXRpYyBpbnQgYnl0ZXNGb3JTaXplKHNpemVfdCBzaXplKSB7Ci0gICAgLy8gdXNlIGF0IG1vc3QgMjggYml0cyAoNCB0aW1lcyA3KQotICAgIENIRUNLKHNpemUgPD0gMHhmZmZmZmZmKTsKLQotICAgIGlmIChzaXplID4gMHgxZmZmZmYpIHsKLSAgICAgICAgcmV0dXJuIDQ7Ci0gICAgfSBlbHNlIGlmIChzaXplID4gMHgzZmZmKSB7Ci0gICAgICAgIHJldHVybiAzOwotICAgIH0gZWxzZSBpZiAoc2l6ZSA+IDB4N2YpIHsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotICAgIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBzdG9yZVNpemUodWludDhfdCAqZGF0YSwgc2l6ZV90ICZpZHgsIHNpemVfdCBzaXplKSB7Ci0gICAgaW50IG51bUJ5dGVzID0gYnl0ZXNGb3JTaXplKHNpemUpOwotICAgIGlkeCArPSBudW1CeXRlczsKLQotICAgIGRhdGEgKz0gaWR4OwotICAgIHNpemVfdCBuZXh0ID0gMDsKLSAgICB3aGlsZSAobnVtQnl0ZXMtLSkgewotICAgICAgICAqLS1kYXRhID0gKHNpemUgJiAweDdmKSB8IG5leHQ7Ci0gICAgICAgIHNpemUgPj49IDc7Ci0gICAgICAgIG5leHQgPSAweDgwOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgYWRkRVNEU0Zyb21Db2RlY1ByaXZhdGUoCi0gICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSwKLSAgICAgICAgYm9vbCBpc0F1ZGlvLCBjb25zdCB2b2lkICpwcml2LCBzaXplX3QgcHJpdlNpemUpIHsKLQotICAgIGludCBwcml2U2l6ZUJ5dGVzUmVxdWlyZWQgPSBieXRlc0ZvclNpemUocHJpdlNpemUpOwotICAgIGludCBlc2RzU2l6ZTIgPSAxNCArIHByaXZTaXplQnl0ZXNSZXF1aXJlZCArIHByaXZTaXplOwotICAgIGludCBlc2RzU2l6ZTJCeXRlc1JlcXVpcmVkID0gYnl0ZXNGb3JTaXplKGVzZHNTaXplMik7Ci0gICAgaW50IGVzZHNTaXplMSA9IDQgKyBlc2RzU2l6ZTJCeXRlc1JlcXVpcmVkICsgZXNkc1NpemUyOwotICAgIGludCBlc2RzU2l6ZTFCeXRlc1JlcXVpcmVkID0gYnl0ZXNGb3JTaXplKGVzZHNTaXplMSk7Ci0gICAgc2l6ZV90IGVzZHNTaXplID0gMSArIGVzZHNTaXplMUJ5dGVzUmVxdWlyZWQgKyBlc2RzU2l6ZTE7Ci0gICAgdWludDhfdCAqZXNkcyA9IG5ldyB1aW50OF90W2VzZHNTaXplXTsKLQotICAgIHNpemVfdCBpZHggPSAwOwotICAgIGVzZHNbaWR4KytdID0gMHgwMzsKLSAgICBzdG9yZVNpemUoZXNkcywgaWR4LCBlc2RzU2l6ZTEpOwotICAgIGVzZHNbaWR4KytdID0gMHgwMDsgLy8gRVNfSUQKLSAgICBlc2RzW2lkeCsrXSA9IDB4MDA7IC8vIEVTX0lECi0gICAgZXNkc1tpZHgrK10gPSAweDAwOyAvLyBzdHJlYW1EZXBlbmRlbmNlRmxhZywgVVJMX0ZsYWcsIE9DUnN0cmVhbUZsYWcKLSAgICBlc2RzW2lkeCsrXSA9IDB4MDQ7Ci0gICAgc3RvcmVTaXplKGVzZHMsIGlkeCwgZXNkc1NpemUyKTsKLSAgICBlc2RzW2lkeCsrXSA9IGlzQXVkaW8gPyAweDQwICAgLy8gQXVkaW8gSVNPL0lFQyAxNDQ5Ni0zCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDogMHgyMDsgIC8vIFZpc3VhbCBJU08vSUVDIDE0NDk2LTIKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDEyOyBpKyspIHsKLSAgICAgICAgZXNkc1tpZHgrK10gPSAweDAwOwotICAgIH0KLSAgICBlc2RzW2lkeCsrXSA9IDB4MDU7Ci0gICAgc3RvcmVTaXplKGVzZHMsIGlkeCwgcHJpdlNpemUpOwotICAgIG1lbWNweShlc2RzICsgaWR4LCBwcml2LCBwcml2U2l6ZSk7Ci0KLSAgICBtZXRhLT5zZXREYXRhKGtLZXlFU0RTLCAwLCBlc2RzLCBlc2RzU2l6ZSk7Ci0KLSAgICBkZWxldGVbXSBlc2RzOwotICAgIGVzZHMgPSBOVUxMOwotfQotCi1zdGF0dXNfdCBhZGRWb3JiaXNDb2RlY0luZm8oCi0gICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSwKLSAgICAgICAgY29uc3Qgdm9pZCAqX2NvZGVjUHJpdmF0ZSwgc2l6ZV90IGNvZGVjUHJpdmF0ZVNpemUpIHsKLSAgICAvLyBoZXhkdW1wKF9jb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwotCi0gICAgaWYgKGNvZGVjUHJpdmF0ZVNpemUgPCAxKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgY29uc3QgdWludDhfdCAqY29kZWNQcml2YXRlID0gKGNvbnN0IHVpbnQ4X3QgKilfY29kZWNQcml2YXRlOwotCi0gICAgaWYgKGNvZGVjUHJpdmF0ZVswXSAhPSAweDAyKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgLy8gY29kZWNJbmZvIHN0YXJ0cyB3aXRoIHR3byBsZW5ndGhzLCBsZW4xIGFuZCBsZW4yLCB0aGF0IGFyZQotICAgIC8vICJYaXBoLXN0eWxlLWxhY2luZyBlbmNvZGVkIi4uLgotCi0gICAgc2l6ZV90IG9mZnNldCA9IDE7Ci0gICAgc2l6ZV90IGxlbjEgPSAwOwotICAgIHdoaWxlIChvZmZzZXQgPCBjb2RlY1ByaXZhdGVTaXplICYmIGNvZGVjUHJpdmF0ZVtvZmZzZXRdID09IDB4ZmYpIHsKLSAgICAgICAgaWYgKGxlbjEgPiAoU0laRV9NQVggLSAweGZmKSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsgLy8gd291bGQgb3ZlcmZsb3cKLSAgICAgICAgfQotICAgICAgICBsZW4xICs9IDB4ZmY7Ci0gICAgICAgICsrb2Zmc2V0OwotICAgIH0KLSAgICBpZiAob2Zmc2V0ID49IGNvZGVjUHJpdmF0ZVNpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0gICAgaWYgKGxlbjEgPiAoU0laRV9NQVggLSBjb2RlY1ByaXZhdGVbb2Zmc2V0XSkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsgLy8gd291bGQgb3ZlcmZsb3cKLSAgICB9Ci0gICAgbGVuMSArPSBjb2RlY1ByaXZhdGVbb2Zmc2V0KytdOwotCi0gICAgc2l6ZV90IGxlbjIgPSAwOwotICAgIHdoaWxlIChvZmZzZXQgPCBjb2RlY1ByaXZhdGVTaXplICYmIGNvZGVjUHJpdmF0ZVtvZmZzZXRdID09IDB4ZmYpIHsKLSAgICAgICAgaWYgKGxlbjIgPiAoU0laRV9NQVggLSAweGZmKSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsgLy8gd291bGQgb3ZlcmZsb3cKLSAgICAgICAgfQotICAgICAgICBsZW4yICs9IDB4ZmY7Ci0gICAgICAgICsrb2Zmc2V0OwotICAgIH0KLSAgICBpZiAob2Zmc2V0ID49IGNvZGVjUHJpdmF0ZVNpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0gICAgaWYgKGxlbjIgPiAoU0laRV9NQVggLSBjb2RlY1ByaXZhdGVbb2Zmc2V0XSkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsgLy8gd291bGQgb3ZlcmZsb3cKLSAgICB9Ci0gICAgbGVuMiArPSBjb2RlY1ByaXZhdGVbb2Zmc2V0KytdOwotCi0gICAgaWYgKGxlbjEgPiBTSVpFX01BWCAtIGxlbjIgfHwgb2Zmc2V0ID4gU0laRV9NQVggLSAobGVuMSArIGxlbjIpIHx8Ci0gICAgICAgICAgICBjb2RlY1ByaXZhdGVTaXplIDwgb2Zmc2V0ICsgbGVuMSArIGxlbjIpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAoY29kZWNQcml2YXRlW29mZnNldF0gIT0gMHgwMSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLSAgICBtZXRhLT5zZXREYXRhKGtLZXlWb3JiaXNJbmZvLCAwLCAmY29kZWNQcml2YXRlW29mZnNldF0sIGxlbjEpOwotCi0gICAgb2Zmc2V0ICs9IGxlbjE7Ci0gICAgaWYgKGNvZGVjUHJpdmF0ZVtvZmZzZXRdICE9IDB4MDMpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBvZmZzZXQgKz0gbGVuMjsKLSAgICBpZiAoY29kZWNQcml2YXRlW29mZnNldF0gIT0gMHgwNSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIG1ldGEtPnNldERhdGEoCi0gICAgICAgICAgICBrS2V5Vm9yYmlzQm9va3MsIDAsICZjb2RlY1ByaXZhdGVbb2Zmc2V0XSwKLSAgICAgICAgICAgIGNvZGVjUHJpdmF0ZVNpemUgLSBvZmZzZXQpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0aWMgc3RhdHVzX3QgYWRkRmxhY01ldGFkYXRhKAotICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsCi0gICAgICAgIGNvbnN0IHZvaWQgKmNvZGVjUHJpdmF0ZSwgc2l6ZV90IGNvZGVjUHJpdmF0ZVNpemUpIHsKLSAgICAvLyBoZXhkdW1wKGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7Ci0KLSAgICBtZXRhLT5zZXREYXRhKGtLZXlGbGFjTWV0YWRhdGEsIDAsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7Ci0KLSAgICBpbnQzMl90IG1heElucHV0U2l6ZSA9IDY0IDw8IDEwOwotICAgIHNwPEZMQUNEZWNvZGVyPiBmbGFjRGVjb2RlciA9IEZMQUNEZWNvZGVyOjpDcmVhdGUoKTsKLSAgICBpZiAoZmxhY0RlY29kZXIgIT0gTlVMTAotICAgICAgICAgICAgJiYgZmxhY0RlY29kZXItPnBhcnNlTWV0YWRhdGEoKGNvbnN0IHVpbnQ4X3QqKWNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSkgPT0gT0spIHsKLSAgICAgICAgRkxBQ19fU3RyZWFtTWV0YWRhdGFfU3RyZWFtSW5mbyBzdHJlYW1JbmZvID0gZmxhY0RlY29kZXItPmdldFN0cmVhbUluZm8oKTsKLSAgICAgICAgbWF4SW5wdXRTaXplID0gc3RyZWFtSW5mby5tYXhfZnJhbWVzaXplOwotICAgICAgICBpZiAobWF4SW5wdXRTaXplID09IDApIHsKLSAgICAgICAgICAgIC8vIEluIGNhc2UgbWF4IGZyYW1lc2l6ZSBpcyBub3QgYXZhaWxhYmxlLCB1c2UgcmF3IGRhdGEgc2l6ZSBhcyBtYXggZnJhbWVzaXplLAotICAgICAgICAgICAgLy8gYXNzdW1pbmcgdGhlcmUgaXMgbm8gZXhwYW5zaW9uLgotICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8ubWF4X2Jsb2Nrc2l6ZSAhPSAwCi0gICAgICAgICAgICAgICAgICAgICYmIHN0cmVhbUluZm8uY2hhbm5lbHMgIT0gMAotICAgICAgICAgICAgICAgICAgICAmJiAoKHN0cmVhbUluZm8uYml0c19wZXJfc2FtcGxlICsgNykgLyA4KSA+Ci0gICAgICAgICAgICAgICAgICAgICAgICBJTlQzMl9NQVggLyBzdHJlYW1JbmZvLm1heF9ibG9ja3NpemUgLyBzdHJlYW1JbmZvLmNoYW5uZWxzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1heElucHV0U2l6ZSA9ICgoc3RyZWFtSW5mby5iaXRzX3Blcl9zYW1wbGUgKyA3KSAvIDgpCi0gICAgICAgICAgICAgICAgKiBzdHJlYW1JbmZvLm1heF9ibG9ja3NpemUgKiBzdHJlYW1JbmZvLmNoYW5uZWxzOwotICAgICAgICB9Ci0gICAgfQotICAgIG1ldGEtPnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIG1heElucHV0U2l6ZSk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE1hdHJvc2thRXh0cmFjdG9yOjpzeW50aGVzaXplQVZDQyhUcmFja0luZm8gKnRyYWNrSW5mbywgc2l6ZV90IGluZGV4KSB7Ci0gICAgQmxvY2tJdGVyYXRvciBpdGVyKHRoaXMsIHRyYWNrSW5mby0+bVRyYWNrTnVtLCBpbmRleCk7Ci0gICAgaWYgKGl0ZXIuZW9zKCkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBjb25zdCBta3ZwYXJzZXI6OkJsb2NrICpibG9jayA9IGl0ZXIuYmxvY2soKTsKLSAgICBpZiAoYmxvY2stPkdldEZyYW1lQ291bnQoKSA8PSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgY29uc3QgbWt2cGFyc2VyOjpCbG9jazo6RnJhbWUgJmZyYW1lID0gYmxvY2stPkdldEZyYW1lKDApOwotICAgIHNwPEFCdWZmZXI+IGFidWYgPSBuZXcgQUJ1ZmZlcihmcmFtZS5sZW4pOwotICAgIGxvbmcgbiA9IGZyYW1lLlJlYWQobVJlYWRlciwgYWJ1Zi0+ZGF0YSgpKTsKLSAgICBpZiAobiAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgc3A8TWV0YURhdGE+IGF2Y01ldGEgPSBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoYWJ1Zik7Ci0gICAgaWYgKGF2Y01ldGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIC8vIE92ZXJyaWRlIHRoZSBzeW50aGVzaXplZCBuYWwgbGVuZ3RoIHNpemUsIHdoaWNoIGlzIGFyYml0cmFyeQotICAgIGF2Y01ldGEtPnNldEludDMyKGtLZXlOYWxMZW5ndGhTaXplLCAwKTsKLSAgICB0cmFja0luZm8tPm1NZXRhID0gYXZjTWV0YTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc1ZhbGlkSW50MzJDb2xvdXJWYWx1ZShsb25nIGxvbmcgdmFsdWUpIHsKLSAgICByZXR1cm4gdmFsdWUgIT0gbWt2cGFyc2VyOjpDb2xvdXI6OmtWYWx1ZU5vdFByZXNlbnQKLSAgICAgICAgICAgICYmIHZhbHVlID49IElOVDMyX01JTgotICAgICAgICAgICAgJiYgdmFsdWUgPD0gSU5UMzJfTUFYOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgaXNWYWxpZFVpbnQxNkNvbG91clZhbHVlKGxvbmcgbG9uZyB2YWx1ZSkgewotICAgIHJldHVybiB2YWx1ZSAhPSBta3ZwYXJzZXI6OkNvbG91cjo6a1ZhbHVlTm90UHJlc2VudAotICAgICAgICAgICAgJiYgdmFsdWUgPj0gMAotICAgICAgICAgICAgJiYgdmFsdWUgPD0gVUlOVDE2X01BWDsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGlzVmFsaWRQcmltYXJ5KGNvbnN0IG1rdnBhcnNlcjo6UHJpbWFyeUNocm9tYXRpY2l0eSAqcHJpbWFyeSkgewotICAgIHJldHVybiBwcmltYXJ5ICE9IE5VTEwgJiYgcHJpbWFyeS0+eCA+PSAwICYmIHByaW1hcnktPnggPD0gMQotICAgICAgICAgICAgICYmIHByaW1hcnktPnkgPj0gMCAmJiBwcmltYXJ5LT55IDw9IDE7Ci19Ci0KLXZvaWQgTWF0cm9za2FFeHRyYWN0b3I6OmdldENvbG9ySW5mb3JtYXRpb24oCi0gICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VmlkZW9UcmFjayAqdnRyYWNrLCBzcDxNZXRhRGF0YT4gJm1ldGEpIHsKLSAgICBjb25zdCBta3ZwYXJzZXI6OkNvbG91ciAqY29sb3IgPSB2dHJhY2stPkdldENvbG91cigpOwotICAgIGlmIChjb2xvciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBDb2xvciBBc3BlY3RzCi0gICAgewotICAgICAgICBpbnQzMl90IHByaW1hcmllcyA9IDI7IC8vIElTTyB1bnNwZWNpZmllZAotICAgICAgICBpbnQzMl90IHRyYW5zZmVyID0gMjsgLy8gSVNPIHVuc3BlY2lmaWVkCi0gICAgICAgIGludDMyX3QgY29lZmZzID0gMjsgLy8gSVNPIHVuc3BlY2lmaWVkCi0gICAgICAgIGJvb2wgZnVsbFJhbmdlID0gZmFsc2U7IC8vIGRlZmF1bHQKLSAgICAgICAgYm9vbCByYW5nZVNwZWNpZmllZCA9IGZhbHNlOwotCi0gICAgICAgIGlmIChpc1ZhbGlkSW50MzJDb2xvdXJWYWx1ZShjb2xvci0+cHJpbWFyaWVzKSkgewotICAgICAgICAgICAgcHJpbWFyaWVzID0gY29sb3ItPnByaW1hcmllczsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNWYWxpZEludDMyQ29sb3VyVmFsdWUoY29sb3ItPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljcykpIHsKLSAgICAgICAgICAgIHRyYW5zZmVyID0gY29sb3ItPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljczsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNWYWxpZEludDMyQ29sb3VyVmFsdWUoY29sb3ItPm1hdHJpeF9jb2VmZmljaWVudHMpKSB7Ci0gICAgICAgICAgICBjb2VmZnMgPSBjb2xvci0+bWF0cml4X2NvZWZmaWNpZW50czsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29sb3ItPnJhbmdlICE9IG1rdnBhcnNlcjo6Q29sb3VyOjprVmFsdWVOb3RQcmVzZW50Ci0gICAgICAgICAgICAgICAgJiYgY29sb3ItPnJhbmdlICE9IDAgLyogTUtWIHVuc3BlY2lmaWVkICovKSB7Ci0gICAgICAgICAgICAvLyBXZSBvbmx5IHN1cHBvcnQgTUtWIGJyb2FkY2FzdCByYW5nZSAoPT0gbGltaXRlZCkgYW5kIGZ1bGwgcmFuZ2UuCi0gICAgICAgICAgICAvLyBXZSB0cmVhdCBhbGwgb3RoZXIgdmFsdWUgYXMgdGhlIGRlZmF1bHQgbGltaXRlZCByYW5nZS4KLSAgICAgICAgICAgIGZ1bGxSYW5nZSA9IGNvbG9yLT5yYW5nZSA9PSAyIC8qIE1LViBmdWxsUmFuZ2UgKi87Ci0gICAgICAgICAgICByYW5nZVNwZWNpZmllZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBDb2xvckFzcGVjdHMgYXNwZWN0czsKLSAgICAgICAgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvQ29kZWNBc3BlY3RzKAotICAgICAgICAgICAgICAgIHByaW1hcmllcywgdHJhbnNmZXIsIGNvZWZmcywgZnVsbFJhbmdlLCBhc3BlY3RzKTsKLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNvbG9yUHJpbWFyaWVzLCBhc3BlY3RzLm1QcmltYXJpZXMpOwotICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VHJhbnNmZXJGdW5jdGlvbiwgYXNwZWN0cy5tVHJhbnNmZXIpOwotICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5Q29sb3JNYXRyaXgsIGFzcGVjdHMubU1hdHJpeENvZWZmcyk7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKAotICAgICAgICAgICAgICAgIGtLZXlDb2xvclJhbmdlLCByYW5nZVNwZWNpZmllZCA/IGFzcGVjdHMubVJhbmdlIDogQ29sb3JBc3BlY3RzOjpSYW5nZVVuc3BlY2lmaWVkKTsKLSAgICB9Ci0KLSAgICAvLyBIRFIgU3RhdGljIEluZm8KLSAgICB7Ci0gICAgICAgIEhEUlN0YXRpY0luZm8gaW5mbywgbnVsbEluZm87IC8vIG51bGxJbmZvIGlzIGEgZnVsbHkgdW5zcGVjaWZpZWQgc3RhdGljIGluZm8KLSAgICAgICAgbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOwotICAgICAgICBtZW1zZXQoJm51bGxJbmZvLCAwLCBzaXplb2YobnVsbEluZm8pKTsKLSAgICAgICAgaWYgKGlzVmFsaWRVaW50MTZDb2xvdXJWYWx1ZShjb2xvci0+bWF4X2NsbCkpIHsKLSAgICAgICAgICAgIGluZm8uc1R5cGUxLm1NYXhDb250ZW50TGlnaHRMZXZlbCA9IGNvbG9yLT5tYXhfY2xsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc1ZhbGlkVWludDE2Q29sb3VyVmFsdWUoY29sb3ItPm1heF9mYWxsKSkgewotICAgICAgICAgICAgaW5mby5zVHlwZTEubU1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWwgPSBjb2xvci0+bWF4X2ZhbGw7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpNYXN0ZXJpbmdNZXRhZGF0YSAqbWFzdGVyaW5nID0gY29sb3ItPm1hc3RlcmluZ19tZXRhZGF0YTsKLSAgICAgICAgaWYgKG1hc3RlcmluZyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAvLyBDb252ZXJ0IG1hdHJvc2thIHZhbHVlcyB0byBIRFJTdGF0aWNJbmZvIGVxdWl2YWxlbnQgdmFsdWVzIGZvciBlYWNoIGZ1bGx5IHNwZWNpZmllZAotICAgICAgICAgICAgLy8gZ3JvdXAuIFNlZSBDVEEtNjgxLjMgc2VjdGlvbiAzLjIuMSBmb3IgbW9yZSBpbmZvLgotICAgICAgICAgICAgaWYgKG1hc3RlcmluZy0+bHVtaW5hbmNlX21heCA+PSAwLjUgJiYgbWFzdGVyaW5nLT5sdW1pbmFuY2VfbWF4IDwgNjU1MzUuNSkgewotICAgICAgICAgICAgICAgIGluZm8uc1R5cGUxLm1NYXhEaXNwbGF5THVtaW5hbmNlID0gKHVpbnQxNl90KShtYXN0ZXJpbmctPmx1bWluYW5jZV9tYXggKyAwLjUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1hc3RlcmluZy0+bHVtaW5hbmNlX21pbiA+PSAwLjAwMDA1ICYmIG1hc3RlcmluZy0+bHVtaW5hbmNlX21pbiA8IDYuNTUzNTUpIHsKLSAgICAgICAgICAgICAgICAvLyBIRFJTdGF0aWNJbmZvIFR5cGUxIHN0b3JlcyBtaW4gbHVtaW5hbmNlIHNjYWxlZCAxMDAwMDoxCi0gICAgICAgICAgICAgICAgaW5mby5zVHlwZTEubU1pbkRpc3BsYXlMdW1pbmFuY2UgPQotICAgICAgICAgICAgICAgICAgICAodWludDE2X3QpKDEwMDAwICogbWFzdGVyaW5nLT5sdW1pbmFuY2VfbWluICsgMC41KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEhEUlN0YXRpY0luZm8gVHlwZTEgc3RvcmVzIHByaW1hcmllcyBzY2FsZWQgNTAwMDA6MQotICAgICAgICAgICAgaWYgKGlzVmFsaWRQcmltYXJ5KG1hc3RlcmluZy0+d2hpdGVfcG9pbnQpKSB7Ci0gICAgICAgICAgICAgICAgaW5mby5zVHlwZTEubVcueCA9ICh1aW50MTZfdCkoNTAwMDAgKiBtYXN0ZXJpbmctPndoaXRlX3BvaW50LT54ICsgMC41KTsKLSAgICAgICAgICAgICAgICBpbmZvLnNUeXBlMS5tVy55ID0gKHVpbnQxNl90KSg1MDAwMCAqIG1hc3RlcmluZy0+d2hpdGVfcG9pbnQtPnkgKyAwLjUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlzVmFsaWRQcmltYXJ5KG1hc3RlcmluZy0+cikgJiYgaXNWYWxpZFByaW1hcnkobWFzdGVyaW5nLT5nKQotICAgICAgICAgICAgICAgICAgICAmJiBpc1ZhbGlkUHJpbWFyeShtYXN0ZXJpbmctPmIpKSB7Ci0gICAgICAgICAgICAgICAgaW5mby5zVHlwZTEubVIueCA9ICh1aW50MTZfdCkoNTAwMDAgKiBtYXN0ZXJpbmctPnItPnggKyAwLjUpOwotICAgICAgICAgICAgICAgIGluZm8uc1R5cGUxLm1SLnkgPSAodWludDE2X3QpKDUwMDAwICogbWFzdGVyaW5nLT5yLT55ICsgMC41KTsKLSAgICAgICAgICAgICAgICBpbmZvLnNUeXBlMS5tRy54ID0gKHVpbnQxNl90KSg1MDAwMCAqIG1hc3RlcmluZy0+Zy0+eCArIDAuNSk7Ci0gICAgICAgICAgICAgICAgaW5mby5zVHlwZTEubUcueSA9ICh1aW50MTZfdCkoNTAwMDAgKiBtYXN0ZXJpbmctPmctPnkgKyAwLjUpOwotICAgICAgICAgICAgICAgIGluZm8uc1R5cGUxLm1CLnggPSAodWludDE2X3QpKDUwMDAwICogbWFzdGVyaW5nLT5iLT54ICsgMC41KTsKLSAgICAgICAgICAgICAgICBpbmZvLnNUeXBlMS5tQi55ID0gKHVpbnQxNl90KSg1MDAwMCAqIG1hc3RlcmluZy0+Yi0+eSArIDAuNSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gT25seSBhZHZlcnRpc2Ugc3RhdGljIGluZm8gaWYgYXQgbGVhc3Qgb25lIG9mIHRoZSBncm91cHMgaGF2ZSBiZWVuIHNwZWNpZmllZC4KLSAgICAgICAgaWYgKG1lbWNtcCgmaW5mbywgJm51bGxJbmZvLCBzaXplb2YoaW5mbykpICE9IDApIHsKLSAgICAgICAgICAgIGluZm8ubUlEID0gSERSU3RhdGljSW5mbzo6a1R5cGUxOwotICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5SGRyU3RhdGljSW5mbywgJ2hkclMnLCAmaW5mbywgc2l6ZW9mKGluZm8pKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdHVzX3QgTWF0cm9za2FFeHRyYWN0b3I6OmluaXRUcmFja0luZm8oCi0gICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2sgKnRyYWNrLCBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsIFRyYWNrSW5mbyAqdHJhY2tJbmZvKSB7Ci0gICAgdHJhY2tJbmZvLT5tVHJhY2tOdW0gPSB0cmFjay0+R2V0TnVtYmVyKCk7Ci0gICAgdHJhY2tJbmZvLT5tTWV0YSA9IG1ldGE7Ci0gICAgdHJhY2tJbmZvLT5tRXh0cmFjdG9yID0gdGhpczsKLSAgICB0cmFja0luZm8tPm1FbmNyeXB0ZWQgPSBmYWxzZTsKLSAgICB0cmFja0luZm8tPm1IZWFkZXIgPSBOVUxMOwotICAgIHRyYWNrSW5mby0+bUhlYWRlckxlbiA9IDA7Ci0KLSAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgdHJhY2stPkdldENvbnRlbnRFbmNvZGluZ0NvdW50KCk7IGkrKykgewotICAgICAgICBjb25zdCBta3ZwYXJzZXI6OkNvbnRlbnRFbmNvZGluZyAqZW5jb2RpbmcgPSB0cmFjay0+R2V0Q29udGVudEVuY29kaW5nQnlJbmRleChpKTsKLSAgICAgICAgZm9yKHNpemVfdCBqID0gMDsgaiA8IGVuY29kaW5nLT5HZXRFbmNyeXB0aW9uQ291bnQoKTsgaisrKSB7Ci0gICAgICAgICAgICBjb25zdCBta3ZwYXJzZXI6OkNvbnRlbnRFbmNvZGluZzo6Q29udGVudEVuY3J5cHRpb24gKmVuY3J5cHRpb247Ci0gICAgICAgICAgICBlbmNyeXB0aW9uID0gZW5jb2RpbmctPkdldEVuY3J5cHRpb25CeUluZGV4KGopOwotICAgICAgICAgICAgdHJhY2tJbmZvLT5tTWV0YS0+c2V0RGF0YShrS2V5Q3J5cHRvS2V5LCAwLCBlbmNyeXB0aW9uLT5rZXlfaWQsIGVuY3J5cHRpb24tPmtleV9pZF9sZW4pOwotICAgICAgICAgICAgdHJhY2tJbmZvLT5tRW5jcnlwdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yKHNpemVfdCBqID0gMDsgaiA8IGVuY29kaW5nLT5HZXRDb21wcmVzc2lvbkNvdW50KCk7IGorKykgewotICAgICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpDb250ZW50RW5jb2Rpbmc6OkNvbnRlbnRDb21wcmVzc2lvbiAqY29tcHJlc3Npb247Ci0gICAgICAgICAgICBjb21wcmVzc2lvbiA9IGVuY29kaW5nLT5HZXRDb21wcmVzc2lvbkJ5SW5kZXgoaik7Ci0gICAgICAgICAgICBBTE9HVigiY29tcHJlc3Npb24gYWxnbyAlbGx1IHNldHRpbmdzX2xlbiAlbGxkIiwKLSAgICAgICAgICAgICAgICBjb21wcmVzc2lvbi0+YWxnbywgY29tcHJlc3Npb24tPnNldHRpbmdzX2xlbik7Ci0gICAgICAgICAgICBpZiAoY29tcHJlc3Npb24tPmFsZ28gPT0gMwotICAgICAgICAgICAgICAgICAgICAmJiBjb21wcmVzc2lvbi0+c2V0dGluZ3MKLSAgICAgICAgICAgICAgICAgICAgJiYgY29tcHJlc3Npb24tPnNldHRpbmdzX2xlbiA+IDApIHsKLSAgICAgICAgICAgICAgICB0cmFja0luZm8tPm1IZWFkZXIgPSBjb21wcmVzc2lvbi0+c2V0dGluZ3M7Ci0gICAgICAgICAgICAgICAgdHJhY2tJbmZvLT5tSGVhZGVyTGVuID0gY29tcHJlc3Npb24tPnNldHRpbmdzX2xlbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBNYXRyb3NrYUV4dHJhY3Rvcjo6YWRkVHJhY2tzKCkgewotICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2tzICp0cmFja3MgPSBtU2VnbWVudC0+R2V0VHJhY2tzKCk7Ci0KLSAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgdHJhY2tzLT5HZXRUcmFja3NDb3VudCgpOyArK2luZGV4KSB7Ci0gICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2sgKnRyYWNrID0gdHJhY2tzLT5HZXRUcmFja0J5SW5kZXgoaW5kZXgpOwotCi0gICAgICAgIGlmICh0cmFjayA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAvLyBBcHBhcmVudGx5IHRoaXMgaXMgY3VycmVudGx5IHZhbGlkIChpZiB1bmV4cGVjdGVkKSBiZWhhdmlvdXIKLSAgICAgICAgICAgIC8vIG9mIHRoZSBta3YgcGFyc2VyIGxpYi4KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgY2hhciAqY29uc3QgY29kZWNJRCA9IHRyYWNrLT5HZXRDb2RlY0lkKCk7Ci0gICAgICAgIEFMT0dWKCJjb2RlYyBpZCA9ICVzIiwgY29kZWNJRCk7Ci0gICAgICAgIEFMT0dWKCJjb2RlYyBuYW1lID0gJXMiLCB0cmFjay0+R2V0Q29kZWNOYW1lQXNVVEY4KCkpOwotCi0gICAgICAgIGlmIChjb2RlY0lEID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dXKCJ1bmtub3duIGNvZGVjSUQgaXMgbm90IHN1cHBvcnRlZC4iKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZV90IGNvZGVjUHJpdmF0ZVNpemU7Ci0gICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvZGVjUHJpdmF0ZSA9Ci0gICAgICAgICAgICB0cmFjay0+R2V0Q29kZWNQcml2YXRlKGNvZGVjUHJpdmF0ZVNpemUpOwotCi0gICAgICAgIGVudW0geyBWSURFT19UUkFDSyA9IDEsIEFVRElPX1RSQUNLID0gMiB9OwotCi0gICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotCi0gICAgICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgICAgIHN3aXRjaCAodHJhY2stPkdldFR5cGUoKSkgewotICAgICAgICAgICAgY2FzZSBWSURFT19UUkFDSzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlZpZGVvVHJhY2sgKnZ0cmFjayA9Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IG1rdnBhcnNlcjo6VmlkZW9UcmFjayAqPih0cmFjayk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcCgiVl9NUEVHNC9JU08vQVZDIiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUFWQ0MsIDAsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJWX01QRUc0L0lTTy9BU1AiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29kZWNQcml2YXRlU2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldENTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWRkRVNEU0Zyb21Db2RlY1ByaXZhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIGZhbHNlLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzIGlzIGRldGVjdGVkLCBidXQgZG9lcyBub3QgaGF2ZSBjb25maWd1cmF0aW9uLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjSUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIlZfVlA4IiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJWX1ZQOSIsIGNvZGVjSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19WUDkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29kZWNQcml2YXRlU2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAvLyAnY3NkLTAnIGZvciBWUDkgaXMgdGhlIEJsb2Igb2YgQ29kZWMgUHJpdmF0ZSBkYXRhIGFzCi0gICAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lmaWVkIGluIGh0dHA6Ly93d3cud2VibXByb2plY3Qub3JnL3ZwOS9wcm9maWxlcy8uCi0gICAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlWcDlDb2RlY1ByaXZhdGUsIDAsIGNvZGVjUHJpdmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjUHJpdmF0ZVNpemUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzIGlzIG5vdCBzdXBwb3J0ZWQuIiwgY29kZWNJRCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNvbnN0IGxvbmcgbG9uZyB3aWR0aCA9IHZ0cmFjay0+R2V0V2lkdGgoKTsKLSAgICAgICAgICAgICAgICBjb25zdCBsb25nIGxvbmcgaGVpZ2h0ID0gdnRyYWNrLT5HZXRIZWlnaHQoKTsKLSAgICAgICAgICAgICAgICBpZiAod2lkdGggPD0gMCB8fCB3aWR0aCA+IElOVDMyX01BWCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygidHJhY2sgd2lkdGggZXhjZWVkcyBpbnQzMl90LCAlbGxkIiwgd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGhlaWdodCA8PSAwIHx8IGhlaWdodCA+IElOVDMyX01BWCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygidHJhY2sgaGVpZ2h0IGV4Y2VlZHMgaW50MzJfdCwgJWxsZCIsIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIChpbnQzMl90KXdpZHRoKTsKLSAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCAoaW50MzJfdCloZWlnaHQpOwotCi0gICAgICAgICAgICAgICAgLy8gc2V0dGluZyBkaXNwbGF5IHdpZHRoL2hlaWdodCBpcyBvcHRpb25hbAotICAgICAgICAgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBkaXNwbGF5VW5pdCA9IHZ0cmFjay0+R2V0RGlzcGxheVVuaXQoKTsKLSAgICAgICAgICAgICAgICBjb25zdCBsb25nIGxvbmcgZGlzcGxheVdpZHRoID0gdnRyYWNrLT5HZXREaXNwbGF5V2lkdGgoKTsKLSAgICAgICAgICAgICAgICBjb25zdCBsb25nIGxvbmcgZGlzcGxheUhlaWdodCA9IHZ0cmFjay0+R2V0RGlzcGxheUhlaWdodCgpOwotICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5V2lkdGggPiAwICYmIGRpc3BsYXlXaWR0aCA8PSBJTlQzMl9NQVgKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGRpc3BsYXlIZWlnaHQgPiAwICYmIGRpc3BsYXlIZWlnaHQgPD0gSU5UMzJfTUFYKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGlzcGxheVVuaXQpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiAvLyBwaXhlbHMKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlEaXNwbGF5V2lkdGgsIChpbnQzMl90KWRpc3BsYXlXaWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5RGlzcGxheUhlaWdodCwgKGludDMyX3QpZGlzcGxheUhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiAvLyBjZW50aW1ldGVycwotICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IC8vIGluY2hlcwotICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IC8vIGFzcGVjdCByYXRpbwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBQaHlzaWNhbCBsYXlvdXQgc2l6ZSBpcyB0cmVhdGVkIHRoZSBzYW1lIGFzIGFzcGVjdCByYXRpby4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IGRpc3BsYXlXaWR0aCBhbmQgZGlzcGxheUhlaWdodCBhcmUgbmV2ZXIgemVybyBhcyB0aGV5IGFyZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2tlZCBpbiB0aGUgaWYgYWJvdmUuCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb25nIGxvbmcgY29tcHV0ZWRXaWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWF4KHdpZHRoLCBoZWlnaHQgKiBkaXNwbGF5V2lkdGggLyBkaXNwbGF5SGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBjb21wdXRlZEhlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWF4KGhlaWdodCwgd2lkdGggKiBkaXNwbGF5SGVpZ2h0IC8gZGlzcGxheVdpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wdXRlZFdpZHRoIDw9IElOVDMyX01BWCAmJiBjb21wdXRlZEhlaWdodCA8PSBJTlQzMl9NQVgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5RGlzcGxheVdpZHRoLCAoaW50MzJfdCljb21wdXRlZFdpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5RGlzcGxheUhlaWdodCwgKGludDMyX3QpY29tcHV0ZWRIZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogLy8gdW5rbm93biBkaXNwbGF5IHVuaXRzLCBwZXJoYXBzIGZ1dHVyZSB2ZXJzaW9uIG9mIHNwZWMuCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGdldENvbG9ySW5mb3JtYXRpb24odnRyYWNrLCBtZXRhKTsKLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIEFVRElPX1RSQUNLOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6QXVkaW9UcmFjayAqYXRyYWNrID0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgbWt2cGFyc2VyOjpBdWRpb1RyYWNrICo+KHRyYWNrKTsKLQotICAgICAgICAgICAgICAgIGlmICghc3RyY21wKCJBX0FBQyIsIGNvZGVjSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhjb2RlY1ByaXZhdGVTaXplID49IDIpOwotCi0gICAgICAgICAgICAgICAgICAgIGFkZEVTRFNGcm9tQ29kZWNQcml2YXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIHRydWUsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJBX1ZPUkJJUyIsIGNvZGVjSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpOwotCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IGFkZFZvcmJpc0NvZGVjSW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiQV9PUFVTIiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpOwotICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlPcHVzSGVhZGVyLCAwLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwotICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5T3B1c0NvZGVjRGVsYXksIHRyYWNrLT5HZXRDb2RlY0RlbGF5KCkpOwotICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5T3B1c1NlZWtQcmVSb2xsLCB0cmFjay0+R2V0U2Vla1ByZVJvbGwoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1TZWVrUHJlUm9sbE5zID0gdHJhY2stPkdldFNlZWtQcmVSb2xsKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJBX01QRUcvTDMiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJBX0ZMQUMiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQyk7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IGFkZEZsYWNNZXRhZGF0YShtZXRhLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBpcyBub3Qgc3VwcG9ydGVkLiIsIGNvZGVjSUQpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgYXRyYWNrLT5HZXRTYW1wbGluZ1JhdGUoKSk7Ci0gICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgYXRyYWNrLT5HZXRDaGFubmVscygpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJza2lwcGluZyB0cmFjaywgY29kZWMgc3BlY2lmaWMgZGF0YSB3YXMgbWFsZm9ybWVkLiIpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIGxvbmcgZHVyYXRpb25OcyA9IG1TZWdtZW50LT5HZXREdXJhdGlvbigpOwotICAgICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIChkdXJhdGlvbk5zICsgNTAwKSAvIDEwMDApOwotCi0gICAgICAgIG1UcmFja3MucHVzaCgpOwotICAgICAgICBzaXplX3QgbiA9IG1UcmFja3Muc2l6ZSgpIC0gMTsKLSAgICAgICAgVHJhY2tJbmZvICp0cmFja0luZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KG4pOwotICAgICAgICBpbml0VHJhY2tJbmZvKHRyYWNrLCBtZXRhLCB0cmFja0luZm8pOwotCi0gICAgICAgIGlmICghc3RyY21wKCJWX01QRUc0L0lTTy9BVkMiLCBjb2RlY0lEKSAmJiBjb2RlY1ByaXZhdGVTaXplID09IDApIHsKLSAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gcmVjb3ZlciBmcm9tIEFWQyB0cmFjayB3aXRob3V0IGNvZGVjIHByaXZhdGUgZGF0YQotICAgICAgICAgICAgZXJyID0gc3ludGhlc2l6ZUFWQ0ModHJhY2tJbmZvLCBuKTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBtVHJhY2tzLnBvcCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIE1hdHJvc2thRXh0cmFjdG9yOjpmaW5kVGh1bWJuYWlscygpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MuZWRpdEl0ZW1BdChpKTsKLQotICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICBDSEVDSyhpbmZvLT5tTWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwotCi0gICAgICAgIGlmIChzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgQmxvY2tJdGVyYXRvciBpdGVyKHRoaXMsIGluZm8tPm1UcmFja051bSwgaSk7Ci0gICAgICAgIGludDMyX3QgaiA9IDA7Ci0gICAgICAgIGludDY0X3QgdGh1bWJuYWlsVGltZVVzID0gMDsKLSAgICAgICAgc2l6ZV90IG1heEJsb2NrU2l6ZSA9IDA7Ci0gICAgICAgIHdoaWxlICghaXRlci5lb3MoKSAmJiBqIDwgMjApIHsKLSAgICAgICAgICAgIGlmIChpdGVyLmJsb2NrKCktPklzS2V5KCkpIHsKLSAgICAgICAgICAgICAgICArK2o7Ci0KLSAgICAgICAgICAgICAgICBzaXplX3QgYmxvY2tTaXplID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGl0ZXIuYmxvY2soKS0+R2V0RnJhbWVDb3VudCgpOyArK2spIHsKLSAgICAgICAgICAgICAgICAgICAgYmxvY2tTaXplICs9IGl0ZXIuYmxvY2soKS0+R2V0RnJhbWUoaykubGVuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChibG9ja1NpemUgPiBtYXhCbG9ja1NpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgbWF4QmxvY2tTaXplID0gYmxvY2tTaXplOwotICAgICAgICAgICAgICAgICAgICB0aHVtYm5haWxUaW1lVXMgPSBpdGVyLmJsb2NrVGltZVVzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaXRlci5hZHZhbmNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW5mby0+bU1ldGEtPnNldEludDY0KGtLZXlUaHVtYm5haWxUaW1lLCB0aHVtYm5haWxUaW1lVXMpOwotICAgIH0KLX0KLQotc3A8TWV0YURhdGE+IE1hdHJvc2thRXh0cmFjdG9yOjpnZXRNZXRhRGF0YSgpIHsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKLQotICAgIG1ldGEtPnNldENTdHJpbmcoCi0gICAgICAgICAgICBrS2V5TUlNRVR5cGUsCi0gICAgICAgICAgICBtSXNXZWJtID8gInZpZGVvL3dlYm0iIDogTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01BVFJPU0tBKTsKLQotICAgIHJldHVybiBtZXRhOwotfQotCi11aW50MzJfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6ZmxhZ3MoKSBjb25zdCB7Ci0gICAgdWludDMyX3QgeCA9IENBTl9QQVVTRTsKLSAgICBpZiAoIWlzTGl2ZVN0cmVhbWluZygpKSB7Ci0gICAgICAgIHggfD0gQ0FOX1NFRUtfQkFDS1dBUkQgfCBDQU5fU0VFS19GT1JXQVJEIHwgQ0FOX1NFRUs7Ci0gICAgfQotCi0gICAgcmV0dXJuIHg7Ci19Ci0KLWJvb2wgU25pZmZNYXRyb3NrYSgKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICBzcDxBTWVzc2FnZT4gKikgewotICAgIERhdGFTb3VyY2VSZWFkZXIgcmVhZGVyKHNvdXJjZSk7Ci0gICAgbWt2cGFyc2VyOjpFQk1MSGVhZGVyIGVibWxIZWFkZXI7Ci0gICAgbG9uZyBsb25nIHBvczsKLSAgICBpZiAoZWJtbEhlYWRlci5QYXJzZSgmcmVhZGVyLCBwb3MpIDwgMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgbWltZVR5cGUtPnNldFRvKE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NQVRST1NLQSk7Ci0gICAgKmNvbmZpZGVuY2UgPSAwLjY7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTc3NWNlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUFUUk9TS0FfRVhUUkFDVE9SX0hfCi0KLSNkZWZpbmUgTUFUUk9TS0FfRVhUUkFDVE9SX0hfCi0KLSNpbmNsdWRlICJta3ZwYXJzZXIvbWt2cGFyc2VyLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgQU1lc3NhZ2U7Ci1jbGFzcyBTdHJpbmc4OwotCi1jbGFzcyBNZXRhRGF0YTsKLXN0cnVjdCBEYXRhU291cmNlUmVhZGVyOwotc3RydWN0IE1hdHJvc2thU291cmNlOwotCi1zdHJ1Y3QgTWF0cm9za2FFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewotICAgIGV4cGxpY2l0IE1hdHJvc2thRXh0cmFjdG9yKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpOwotCi0gICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLQotICAgIHZpcnR1YWwgc3A8SU1lZGlhU291cmNlPiBnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotCi0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwotCi0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0TWV0YURhdGEoKTsKLQotICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiTWF0cm9za2FFeHRyYWN0b3IiOyB9Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5NYXRyb3NrYUV4dHJhY3RvcigpOwotCi1wcml2YXRlOgotICAgIGZyaWVuZCBzdHJ1Y3QgTWF0cm9za2FTb3VyY2U7Ci0gICAgZnJpZW5kIHN0cnVjdCBCbG9ja0l0ZXJhdG9yOwotCi0gICAgc3RydWN0IFRyYWNrSW5mbyB7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgbVRyYWNrTnVtOwotICAgICAgICBib29sIG1FbmNyeXB0ZWQ7Ci0gICAgICAgIHNwPE1ldGFEYXRhPiBtTWV0YTsKLSAgICAgICAgY29uc3QgTWF0cm9za2FFeHRyYWN0b3IgKm1FeHRyYWN0b3I7Ci0gICAgICAgIFZlY3Rvcjxjb25zdCBta3ZwYXJzZXI6OkN1ZVBvaW50Kj4gbUN1ZVBvaW50czsKLQotICAgICAgICAvLyBtSGVhZGVyIHBvaW50cyB0byBtZW1vcnkgbWFuYWdlZCBieSBta3ZwYXJzZXI7Ci0gICAgICAgIC8vIG1IZWFkZXIgd291bGQgYmUgZGVsZXRlZCB3aGVuIG1TZWdtZW50IGlzIGRlbGV0ZWQKLSAgICAgICAgLy8gaW4gfk1hdHJvc2thRXh0cmFjdG9yLgotICAgICAgICB1bnNpZ25lZCBjaGFyICptSGVhZGVyOwotICAgICAgICBzaXplX3QgbUhlYWRlckxlbjsKLQotICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrKiBnZXRUcmFjaygpIGNvbnN0OwotICAgICAgICBjb25zdCBta3ZwYXJzZXI6OkN1ZVBvaW50OjpUcmFja1Bvc2l0aW9uICpmaW5kKGxvbmcgbG9uZyB0aW1lTnMpIGNvbnN0OwotICAgIH07Ci0KLSAgICBNdXRleCBtTG9jazsKLSAgICBWZWN0b3I8VHJhY2tJbmZvPiBtVHJhY2tzOwotCi0gICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7Ci0gICAgRGF0YVNvdXJjZVJlYWRlciAqbVJlYWRlcjsKLSAgICBta3ZwYXJzZXI6OlNlZ21lbnQgKm1TZWdtZW50OwotICAgIGJvb2wgbUV4dHJhY3RlZFRodW1ibmFpbHM7Ci0gICAgYm9vbCBtSXNMaXZlU3RyZWFtaW5nOwotICAgIGJvb2wgbUlzV2VibTsKLSAgICBpbnQ2NF90IG1TZWVrUHJlUm9sbE5zOwotCi0gICAgc3RhdHVzX3Qgc3ludGhlc2l6ZUFWQ0MoVHJhY2tJbmZvICp0cmFja0luZm8sIHNpemVfdCBpbmRleCk7Ci0gICAgc3RhdHVzX3QgaW5pdFRyYWNrSW5mbyhjb25zdCBta3ZwYXJzZXI6OlRyYWNrICp0cmFjaywgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhLCBUcmFja0luZm8gKnRyYWNrSW5mbyk7Ci0gICAgdm9pZCBhZGRUcmFja3MoKTsKLSAgICB2b2lkIGZpbmRUaHVtYm5haWxzKCk7Ci0gICAgdm9pZCBnZXRDb2xvckluZm9ybWF0aW9uKGNvbnN0IG1rdnBhcnNlcjo6VmlkZW9UcmFjayAqdnRyYWNrLCBzcDxNZXRhRGF0YT4gJm1ldGEpOwotICAgIGJvb2wgaXNMaXZlU3RyZWFtaW5nKCkgY29uc3Q7Ci0KLSAgICBNYXRyb3NrYUV4dHJhY3Rvcihjb25zdCBNYXRyb3NrYUV4dHJhY3RvciAmKTsKLSAgICBNYXRyb3NrYUV4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE1hdHJvc2thRXh0cmFjdG9yICYpOwotfTsKLQotYm9vbCBTbmlmZk1hdHJvc2thKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsCi0gICAgICAgIHNwPEFNZXNzYWdlPiAqKTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNQVRST1NLQV9FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcAppbmRleCBhMjU2YTRkLi41Y2M1MDkzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCkBAIC0yMSwxOSArMjEsMjQgQEAKICNpbmNsdWRlICJBbm90aGVyUGFja2V0U291cmNlLmgiCiAjaW5jbHVkZSAiQ2FzTWFuYWdlci5oIgogI2luY2x1ZGUgIkVTUXVldWUuaCIKLSNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgogCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvbmF0aXZlLzEuMC9JRGVzY3JhbWJsZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPGhpZGxtZW1vcnkvRnJhbWV3b3JrVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9jYXMvRGVzY3JhbWJsZXJBUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFLZXlzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9JU3RyZWFtU291cmNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KQEAgLTQxLDEwICs0NiwxMCBAQAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLXVzaW5nIGhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKLXVzaW5nIGhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIGhhcmR3YXJlOjpmcm9tSGVhcDsKIHVzaW5nIGhhcmR3YXJlOjpoaWRsX3N0cmluZzsKIHVzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIGhhcmR3YXJlOjpIaWRsTWVtb3J5OwogdXNpbmcgbmFtZXNwYWNlIGhhcmR3YXJlOjpjYXM6OlYxXzA7CiB1c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOwogCkBAIC03Niw3ICs4MSw3IEBACiAKICAgICB2b2lkIHNpZ25hbEVPUyhzdGF0dXNfdCBmaW5hbFJlc3VsdCk7CiAKLSAgICBzcDxNZWRpYVNvdXJjZT4gZ2V0U291cmNlKFNvdXJjZVR5cGUgdHlwZSk7CisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gZ2V0U291cmNlKFNvdXJjZVR5cGUgdHlwZSk7CiAgICAgYm9vbCBoYXNTb3VyY2UoU291cmNlVHlwZSB0eXBlKSBjb25zdDsKIAogICAgIGludDY0X3QgY29udmVydFBUU1RvVGltZXN0YW1wKHVpbnQ2NF90IFBUUyk7CkBAIC0xNjksNyArMTc0LDcgQEAKICAgICB2b2lkIHNpZ25hbEVPUyhzdGF0dXNfdCBmaW5hbFJlc3VsdCk7CiAKICAgICBTb3VyY2VUeXBlIGdldFNvdXJjZVR5cGUoKTsKLSAgICBzcDxNZWRpYVNvdXJjZT4gZ2V0U291cmNlKFNvdXJjZVR5cGUgdHlwZSk7CisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gZ2V0U291cmNlKFNvdXJjZVR5cGUgdHlwZSk7CiAKICAgICBib29sIGlzQXVkaW8oKSBjb25zdDsKICAgICBib29sIGlzVmlkZW8oKSBjb25zdDsKQEAgLTIwNyw2ICsyMTIsNyBAQAogICAgIHNwPEFNZXNzYWdlPiBtU2FtcGxlQWVzS2V5SXRlbTsKICAgICBzcDxJTWVtb3J5PiBtTWVtOwogICAgIHNwPE1lbW9yeURlYWxlcj4gbURlYWxlcjsKKyAgICBzcDxIaWRsTWVtb3J5PiBtSGlkbE1lbW9yeTsKICAgICBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA6OlNoYXJlZEJ1ZmZlciBtRGVzY3JhbWJsZXJTcmNCdWZmZXI7CiAgICAgc3A8QUJ1ZmZlcj4gbURlc2NyYW1ibGVkQnVmZmVyOwogICAgIExpc3Q8U3ViU2FtcGxlSW5mbz4gbVN1YlNhbXBsZXM7CkBAIC0yNzMsNyArMjc5LDcgQEAKIEFUU1BhcnNlcjo6U3luY0V2ZW50OjpTeW5jRXZlbnQob2ZmNjRfdCBvZmZzZXQpCiAgICAgOiBtSGFzUmV0dXJuZWREYXRhKGZhbHNlKSwgbU9mZnNldChvZmZzZXQpLCBtVGltZVVzKDApIHt9CiAKLXZvaWQgQVRTUGFyc2VyOjpTeW5jRXZlbnQ6OmluaXQob2ZmNjRfdCBvZmZzZXQsIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLAordm9pZCBBVFNQYXJzZXI6OlN5bmNFdmVudDo6aW5pdChvZmY2NF90IG9mZnNldCwgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJnNvdXJjZSwKICAgICAgICAgaW50NjRfdCB0aW1lVXMsIFNvdXJjZVR5cGUgdHlwZSkgewogICAgIG1IYXNSZXR1cm5lZERhdGEgPSB0cnVlOwogICAgIG1PZmZzZXQgPSBvZmZzZXQ7CkBAIC0zNDEsNyArMzQ3LDcgQEAKICAgICBpZiAoKHR5cGUgJiBESVNDT05USU5VSVRZX1RJTUUpCiAgICAgICAgICAgICAmJiBleHRyYSAhPSBOVUxMCiAgICAgICAgICAgICAmJiBleHRyYS0+ZmluZEludDY0KAotICAgICAgICAgICAgICAgIElTdHJlYW1MaXN0ZW5lcjo6a0tleU1lZGlhVGltZVVzLCAmbWVkaWFUaW1lVXMpKSB7CisgICAgICAgICAgICAgICAga0FUU1BhcnNlcktleU1lZGlhVGltZVVzLCAmbWVkaWFUaW1lVXMpKSB7CiAgICAgICAgIG1GaXJzdFBUU1ZhbGlkID0gZmFsc2U7CiAgICAgfQogCkBAIC02NDAsOSArNjQ2LDkgQEAKICAgICByZXR1cm4gbUxhc3RSZWNvdmVyZWRQVFM7CiB9CiAKLXNwPE1lZGlhU291cmNlPiBBVFNQYXJzZXI6OlByb2dyYW06OmdldFNvdXJjZShTb3VyY2VUeXBlIHR5cGUpIHsKK3NwPEFub3RoZXJQYWNrZXRTb3VyY2U+IEFUU1BhcnNlcjo6UHJvZ3JhbTo6Z2V0U291cmNlKFNvdXJjZVR5cGUgdHlwZSkgewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVN0cmVhbXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSA9IG1TdHJlYW1zLmVkaXRWYWx1ZUF0KGkpLT5nZXRTb3VyY2UodHlwZSk7CisgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9IG1TdHJlYW1zLmVkaXRWYWx1ZUF0KGkpLT5nZXRTb3VyY2UodHlwZSk7CiAgICAgICAgIGlmIChzb3VyY2UgIT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIHNvdXJjZTsKICAgICAgICAgfQpAQCAtODQ5LDE0ICs4NTUsOSBAQAogICAgICAgICBpZiAoaGVhcCA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBuYXRpdmVIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKLSAgICAgICAgaWYgKCFuYXRpdmVIYW5kbGUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJbc3RyZWFtICVkXSBmYWlsZWQgdG8gY3JlYXRlIG5hdGl2ZSBoYW5kbGUiLCBtRWxlbWVudGFyeVBJRCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgbmF0aXZlSGFuZGxlLT5kYXRhWzBdID0gaGVhcC0+Z2V0SGVhcElEKCk7Ci0gICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5oZWFwQmFzZSA9IGhpZGxfbWVtb3J5KCJhc2htZW0iLAotICAgICAgICAgICAgICAgIGhpZGxfaGFuZGxlKG5hdGl2ZUhhbmRsZSksIGhlYXAtPmdldFNpemUoKSk7CisKKyAgICAgICAgbUhpZGxNZW1vcnkgPSBmcm9tSGVhcChoZWFwKTsKKyAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLmhlYXBCYXNlID0gKm1IaWRsTWVtb3J5OwogICAgICAgICBtRGVzY3JhbWJsZXJTcmNCdWZmZXIub2Zmc2V0ID0gKHVpbnQ2NF90KSBvZmZzZXQ7CiAgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5zaXplID0gKHVpbnQ2NF90KSBzaXplOwogCkBAIC0xMDMyLDcgKzEwMzMsNyBAQAogICAgICAgICB1aW50NjRfdCByZXN1bWVBdFBUUzsKICAgICAgICAgaWYgKGV4dHJhICE9IE5VTEwKICAgICAgICAgICAgICAgICAmJiBleHRyYS0+ZmluZEludDY0KAotICAgICAgICAgICAgICAgICAgICBJU3RyZWFtTGlzdGVuZXI6OmtLZXlSZXN1bWVBdFBUUywKKyAgICAgICAgICAgICAgICAgICAga0FUU1BhcnNlcktleVJlc3VtZUF0UFRTLAogICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCAqKSZyZXN1bWVBdFBUUykpIHsKICAgICAgICAgICAgIGludDY0X3QgcmVzdW1lQXRNZWRpYVRpbWVVcyA9CiAgICAgICAgICAgICAgICAgbVByb2dyYW0tPmNvbnZlcnRQVFNUb1RpbWVzdGFtcChyZXN1bWVBdFBUUyk7CkBAIC0xMzg3LDYgKzEzODgsOSBAQAogCiAgICAgdWludDMyX3Qgc2N0cmwgPSB0c1NjcmFtYmxpbmdDb250cm9sICE9IDAgPwogICAgICAgICAgICAgdHNTY3JhbWJsaW5nQ29udHJvbCA6IHBlc1NjcmFtYmxpbmdDb250cm9sOworICAgIGlmIChtUXVldWUtPmlzU2NyYW1ibGVkKCkpIHsKKyAgICAgICAgc2N0cmwgfD0gRGVzY3JhbWJsZXJQbHVnaW46OmtTY3JhbWJsaW5nX0ZsYWdfUGVzSGVhZGVyOworICAgIH0KIAogICAgIC8vIFBlcmZvcm0gdGhlIDFzdCBwYXNzIGRlc2NyYW1ibGluZyBpZiBuZWVkZWQKICAgICBpZiAoZGVzY3JhbWJsZUJ5dGVzID4gMCkgewpAQCAtMTYwNiw3ICsxNjEwLDcgQEAKICAgICByZXR1cm4gTlVNX1NPVVJDRV9UWVBFUzsKIH0KIAotc3A8TWVkaWFTb3VyY2U+IEFUU1BhcnNlcjo6U3RyZWFtOjpnZXRTb3VyY2UoU291cmNlVHlwZSB0eXBlKSB7CitzcDxBbm90aGVyUGFja2V0U291cmNlPiBBVFNQYXJzZXI6OlN0cmVhbTo6Z2V0U291cmNlKFNvdXJjZVR5cGUgdHlwZSkgewogICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgICBjYXNlIFZJREVPOgogICAgICAgICB7CkBAIC0xNjk0LDEyICsxNjk4LDEyIEBACiAgICAgICAgIERpc2NvbnRpbnVpdHlUeXBlIHR5cGUsIGNvbnN0IHNwPEFNZXNzYWdlPiAmZXh0cmEpIHsKICAgICBpbnQ2NF90IG1lZGlhVGltZVVzOwogICAgIGlmICgodHlwZSAmIERJU0NPTlRJTlVJVFlfVElNRSkgJiYgZXh0cmEgIT0gTlVMTCkgewotICAgICAgICBpZiAoZXh0cmEtPmZpbmRJbnQ2NChJU3RyZWFtTGlzdGVuZXI6OmtLZXlNZWRpYVRpbWVVcywgJm1lZGlhVGltZVVzKSkgeworICAgICAgICBpZiAoZXh0cmEtPmZpbmRJbnQ2NChrQVRTUGFyc2VyS2V5TWVkaWFUaW1lVXMsICZtZWRpYVRpbWVVcykpIHsKICAgICAgICAgICAgIG1BYnNvbHV0ZVRpbWVBbmNob3JVcyA9IG1lZGlhVGltZVVzOwogICAgICAgICB9CiAgICAgICAgIGlmICgobUZsYWdzICYgVFNfVElNRVNUQU1QU19BUkVfQUJTT0xVVEUpCiAgICAgICAgICAgICAgICAgJiYgZXh0cmEtPmZpbmRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgSVN0cmVhbUxpc3RlbmVyOjprS2V5UmVjZW50TWVkaWFUaW1lVXMsICZtZWRpYVRpbWVVcykpIHsKKyAgICAgICAgICAgICAgICAgICAga0FUU1BhcnNlcktleVJlY2VudE1lZGlhVGltZVVzLCAmbWVkaWFUaW1lVXMpKSB7CiAgICAgICAgICAgICBpZiAobUFic29sdXRlVGltZUFuY2hvclVzID49IDBsbCkgewogICAgICAgICAgICAgICAgIG1lZGlhVGltZVVzIC09IG1BYnNvbHV0ZVRpbWVBbmNob3JVczsKICAgICAgICAgICAgIH0KQEAgLTIwNDEsMTEgKzIwNDUsMTEgQEAKICAgICByZXR1cm4gZXJyOwogfQogCi1zcDxNZWRpYVNvdXJjZT4gQVRTUGFyc2VyOjpnZXRTb3VyY2UoU291cmNlVHlwZSB0eXBlKSB7Ci0gICAgc3A8TWVkaWFTb3VyY2U+IGZpcnN0U291cmNlRm91bmQ7CitzcDxBbm90aGVyUGFja2V0U291cmNlPiBBVFNQYXJzZXI6OmdldFNvdXJjZShTb3VyY2VUeXBlIHR5cGUpIHsKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBmaXJzdFNvdXJjZUZvdW5kOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVByb2dyYW1zLnNpemUoKTsgKytpKSB7CiAgICAgICAgIGNvbnN0IHNwPFByb2dyYW0+ICZwcm9ncmFtID0gbVByb2dyYW1zLmVkaXRJdGVtQXQoaSk7Ci0gICAgICAgIHNwPE1lZGlhU291cmNlPiBzb3VyY2UgPSBwcm9ncmFtLT5nZXRTb3VyY2UodHlwZSk7CisgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9IHByb2dyYW0tPmdldFNvdXJjZSh0eXBlKTsKICAgICAgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKaW5kZXggNDFjMTljZC4uNDVjYTA2YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCkBAIC0yMCw5ICsyMCw5IEBACiAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgpAQCAtODEsMTMgKzgxLDEzIEBACiAgICAgc3RydWN0IFN5bmNFdmVudCB7CiAgICAgICAgIGV4cGxpY2l0IFN5bmNFdmVudChvZmY2NF90IG9mZnNldCk7CiAKLSAgICAgICAgdm9pZCBpbml0KG9mZjY0X3Qgb2Zmc2V0LCBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgdm9pZCBpbml0KG9mZjY0X3Qgb2Zmc2V0LCBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmc291cmNlLAogICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVVzLCBTb3VyY2VUeXBlIHR5cGUpOwogCiAgICAgICAgIGJvb2wgaGFzUmV0dXJuZWREYXRhKCkgY29uc3QgeyByZXR1cm4gbUhhc1JldHVybmVkRGF0YTsgfQogICAgICAgICB2b2lkIHJlc2V0KCk7CiAgICAgICAgIG9mZjY0X3QgZ2V0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbU9mZnNldDsgfQotICAgICAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJmdldE1lZGlhU291cmNlKCkgY29uc3QgeyByZXR1cm4gbU1lZGlhU291cmNlOyB9CisgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZnZXRNZWRpYVNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIG1NZWRpYVNvdXJjZTsgfQogICAgICAgICBpbnQ2NF90IGdldFRpbWVVcygpIGNvbnN0IHsgcmV0dXJuIG1UaW1lVXM7IH0KICAgICAgICAgU291cmNlVHlwZSBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gbVR5cGU7IH0KIApAQCAtMTAwLDcgKzEwMCw3IEBACiAgICAgICAgICAqLwogICAgICAgICBvZmY2NF90IG1PZmZzZXQ7CiAgICAgICAgIC8qIFRoZSBtZWRpYSBzb3VyY2Ugb2JqZWN0IGZvciB0aGlzIGV2ZW50LiAqLwotICAgICAgICBzcDxNZWRpYVNvdXJjZT4gbU1lZGlhU291cmNlOworICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBtTWVkaWFTb3VyY2U7CiAgICAgICAgIC8qIFRoZSB0aW1lc3RhbXAgb2YgdGhlIHN5bmMgZnJhbWUuICovCiAgICAgICAgIGludDY0X3QgbVRpbWVVczsKICAgICAgICAgU291cmNlVHlwZSBtVHlwZTsKQEAgLTEyNiw3ICsxMjYsNyBAQAogCiAgICAgdm9pZCBzaWduYWxFT1Moc3RhdHVzX3QgZmluYWxSZXN1bHQpOwogCi0gICAgc3A8TWVkaWFTb3VyY2U+IGdldFNvdXJjZShTb3VyY2VUeXBlIHR5cGUpOworICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IGdldFNvdXJjZShTb3VyY2VUeXBlIHR5cGUpOwogICAgIGJvb2wgaGFzU291cmNlKFNvdXJjZVR5cGUgdHlwZSkgY29uc3Q7CiAKICAgICBib29sIFBUU1RpbWVEZWx0YUVzdGFibGlzaGVkKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAKaW5kZXggMjEyNTljNC4uZmJmMTQ5NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icApAQCAtMSw1ICsxLDUgQEAKIGNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbXBlZzJ0cyIsCisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydCIsCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJBbm90aGVyUGFja2V0U291cmNlLmNwcCIsCkBAIC03LDggKzcsNiBAQAogICAgICAgICAiQ2FzTWFuYWdlci5jcHAiLAogICAgICAgICAiRVNRdWV1ZS5jcHAiLAogICAgICAgICAiSGxzU2FtcGxlRGVjcnlwdG9yLmNwcCIsCi0gICAgICAgICJNUEVHMlBTRXh0cmFjdG9yLmNwcCIsCi0gICAgICAgICJNUEVHMlRTRXh0cmFjdG9yLmNwcCIsCiAgICAgXSwKIAogICAgIGluY2x1ZGVfZGlyczogWwpAQCAtMzUsOCArMzMsMTIgQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliY3J5cHRvIiwKICAgICAgICAgImxpYm1lZGlhIiwKLSAgICAgICAgImxpYmhpZGxtZW1vcnkiLAorICAgICAgICAibGliaGlkbGFsbG9jYXRvcnV0aWxzIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzLm5hdGl2ZUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAogICAgIF0sCisKKyAgICB3aG9sZV9zdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfbWV0YWRhdGF1dGlscyIsCisgICAgXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuY3BwCmluZGV4IDQzM2IxZmMuLmVjZTA2OTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmNwcApAQCAtMTksMTMgKzE5LDEyIEBACiAKICNpbmNsdWRlICJBbm90aGVyUGFja2V0U291cmNlLmgiCiAKLSNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgotCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CkBAIC0xNjQsNyArMTYzLDcgQEAKIH0KIAogc3RhdHVzX3QgQW5vdGhlclBhY2tldFNvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICopIHsKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqKSB7CiAgICAgKm91dCA9IE5VTEw7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwpAQCAtMjAzLDI0ICsyMDIsMjQgQEAKICAgICAgICAgICAgIHNlZy5tTWF4RGVxdWVUaW1lVXMgPSB0aW1lVXM7CiAgICAgICAgIH0KIAotICAgICAgICBNZWRpYUJ1ZmZlciAqbWVkaWFCdWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoYnVmZmVyKTsKLSAgICAgICAgc3A8TWV0YURhdGE+IGJ1Zm1ldGEgPSBtZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqbWVkaWFCdWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoYnVmZmVyKTsKKyAgICAgICAgTWV0YURhdGFCYXNlICZidWZtZXRhID0gbWVkaWFCdWZmZXItPm1ldGFfZGF0YSgpOwogCi0gICAgICAgIGJ1Zm1ldGEtPnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgICAgICBidWZtZXRhLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOwogCiAgICAgICAgIGludDMyX3QgaXNTeW5jOwogICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiaXNTeW5jIiwgJmlzU3luYykpIHsKLSAgICAgICAgICAgIGJ1Zm1ldGEtPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgaXNTeW5jKTsKKyAgICAgICAgICAgIGJ1Zm1ldGEuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCBpc1N5bmMpOwogICAgICAgICB9CiAKICAgICAgICAgc3A8QUJ1ZmZlcj4gc2VpOwogICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRCdWZmZXIoInNlaSIsICZzZWkpICYmIHNlaSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBidWZtZXRhLT5zZXREYXRhKGtLZXlTRUksIDAsIHNlaS0+ZGF0YSgpLCBzZWktPnNpemUoKSk7CisgICAgICAgICAgICBidWZtZXRhLnNldERhdGEoa0tleVNFSSwgMCwgc2VpLT5kYXRhKCksIHNlaS0+c2l6ZSgpKTsKICAgICAgICAgfQogCiAgICAgICAgIHNwPEFCdWZmZXI+IG1wZWdVc2VyRGF0YTsKLSAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kQnVmZmVyKCJtcGVnVXNlckRhdGEiLCAmbXBlZ1VzZXJEYXRhKSAmJiBtcGVnVXNlckRhdGEgIT0gTlVMTCkgewotICAgICAgICAgICAgYnVmbWV0YS0+c2V0RGF0YSgKKyAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kQnVmZmVyKCJtcGVnLXVzZXItZGF0YSIsICZtcGVnVXNlckRhdGEpICYmIG1wZWdVc2VyRGF0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICBidWZtZXRhLnNldERhdGEoCiAgICAgICAgICAgICAgICAgICAgIGtLZXlNcGVnVXNlckRhdGEsIDAsIG1wZWdVc2VyRGF0YS0+ZGF0YSgpLCBtcGVnVXNlckRhdGEtPnNpemUoKSk7CiAgICAgICAgIH0KIApAQCAtMjM1LDE4ICsyMzQsMTggQEAKICAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kQnVmZmVyKCJlbmNCeXRlcyIsICZlbmNCeXRlc0J1ZmZlcikKICAgICAgICAgICAgICAgICAgICAgJiYgZW5jQnl0ZXNCdWZmZXIgIT0gTlVMTCk7CiAKLSAgICAgICAgICAgIGJ1Zm1ldGEtPnNldEludDMyKGtLZXlDcnlwdG9Nb2RlLCBjcnlwdG9Nb2RlKTsKKyAgICAgICAgICAgIGJ1Zm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b01vZGUsIGNyeXB0b01vZGUpOwogCiAgICAgICAgICAgICB1aW50OF90IGFycmF5WzE2XSA9IHswfTsKLSAgICAgICAgICAgIGJ1Zm1ldGEtPnNldERhdGEoa0tleUNyeXB0b0lWLCAwLCBhcnJheSwgMTYpOworICAgICAgICAgICAgYnVmbWV0YS5zZXREYXRhKGtLZXlDcnlwdG9JViwgMCwgYXJyYXksIDE2KTsKIAogICAgICAgICAgICAgYXJyYXlbMF0gPSAodWludDhfdCkgKGNyeXB0b0tleSAmIDB4ZmYpOwotICAgICAgICAgICAgYnVmbWV0YS0+c2V0RGF0YShrS2V5Q3J5cHRvS2V5LCAwLCBhcnJheSwgMTYpOworICAgICAgICAgICAgYnVmbWV0YS5zZXREYXRhKGtLZXlDcnlwdG9LZXksIDAsIGFycmF5LCAxNik7CiAKLSAgICAgICAgICAgIGJ1Zm1ldGEtPnNldERhdGEoa0tleVBsYWluU2l6ZXMsIDAsCisgICAgICAgICAgICBidWZtZXRhLnNldERhdGEoa0tleVBsYWluU2l6ZXMsIDAsCiAgICAgICAgICAgICAgICAgICAgIGNsZWFyQnl0ZXNCdWZmZXItPmRhdGEoKSwgY2xlYXJCeXRlc0J1ZmZlci0+c2l6ZSgpKTsKIAotICAgICAgICAgICAgYnVmbWV0YS0+c2V0RGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsIDAsCisgICAgICAgICAgICBidWZtZXRhLnNldERhdGEoa0tleUVuY3J5cHRlZFNpemVzLCAwLAogICAgICAgICAgICAgICAgICAgICBlbmNCeXRlc0J1ZmZlci0+ZGF0YSgpLCBlbmNCeXRlc0J1ZmZlci0+c2l6ZSgpKTsKICAgICAgICAgfQogCkBAIC02NjMsNyArNjYyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICYmICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGlzQXZjICYmICFJc0lEUihidWZmZXIpKSB7CisgICAgICAgIGlmIChpc0F2YyAmJiAhSXNJRFIoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKSkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaAppbmRleCBiMDg5MGQ3Li5mNGE2YWNiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaApAQCAtMTgsOCArMTgsOCBAQAogCiAjZGVmaW5lIEFOT1RIRVJfUEFDS0VUX1NPVVJDRV9IXwogCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgogCkBAIC0zOSw3ICszOSw3IEBACiAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKIAogICAgIHZvaWQgY2xlYXIoKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAKaW5kZXggMTFmM2VkMS4uMGZhOWZjYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCkBAIC0yNCwxNSArMjQsMTUgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9jYXMvRGVzY3JhbWJsZXJBUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9DcnlwdG9BUEkuaD4KIAotI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCi0KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KIApAQCAtNjMzLDcgKzYzMywxMCBAQAogICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkgLSBpbmZvLm1MZW5ndGgpOwogCiAgICAgICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1Gb3JtYXQgPSBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoYWNjZXNzVW5pdCk7CisgICAgICAgICAgICBtRm9ybWF0ID0gbmV3IE1ldGFEYXRhOworICAgICAgICAgICAgaWYgKCFNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoKm1Gb3JtYXQsIGFjY2Vzc1VuaXQtPmRhdGEoKSwgYWNjZXNzVW5pdC0+c2l6ZSgpKSkgeworICAgICAgICAgICAgICAgIG1Gb3JtYXQuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBhY2Nlc3NVbml0OwpAQCAtODYyLDcgKzg2NSw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBiaXRzLnNraXBCaXRzKDIpOyAgLy8gb3JpZ2luYWxfY29weSwgaG9tZQogCi0gICAgICAgICAgICBtRm9ybWF0ID0gTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKAorICAgICAgICAgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKKyAgICAgICAgICAgIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgqbUZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSwgc2FtcGxpbmdfZnJlcV9pbmRleCwgY2hhbm5lbF9jb25maWd1cmF0aW9uKTsKIAogICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUlzQURUUywgdHJ1ZSk7CkBAIC0xMDA1LDkgKzEwMDksOSBAQAogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1Gb3JtYXQgPT0gTlVMTCkgewotICAgICAgICAgICAgbUZvcm1hdCA9IE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShtQnVmZmVyKTsKLSAgICAgICAgICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgiQ3JlYXRpbmcgZHVtbXkgQVZDIGZvcm1hdCBmb3Igc2NyYW1ibGVkIGNvbnRlbnQiKTsKKyAgICAgICAgICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7CisgICAgICAgICAgICBpZiAoIU1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YSgqbUZvcm1hdCwgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIkNyZWF0aW5nIGR1bW15IEFWQyBmb3JtYXQgZm9yIHNjcmFtYmxlZCBjb250ZW50Iik7CiAgICAgICAgICAgICAgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKICAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKICAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5V2lkdGgsIDEyODApOwpAQCAtMTE2Nyw3ICsxMTcxLDEyIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtRm9ybWF0ID0gTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKGFjY2Vzc1VuaXQpOworICAgICAgICAgICAgICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7CisgICAgICAgICAgICAgICAgaWYgKCFNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoKm1Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5zaXplKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtU2FtcGxlRGVjcnlwdG9yICE9IE5VTEwgJiYgc2hydW5rQnl0ZXMgPiAwKSB7CkBAIC0xNDY4LDcgKzE0NzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBlZ1VzZXJEYXRhLT5kYXRhKCkgKyBpICogc2l6ZW9mKHNpemVfdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlckRhdGFQb3NpdGlvbnNbaV0sIHNpemVvZihzaXplX3QpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0QnVmZmVyKCJtcGVnVXNlckRhdGEiLCBtcGVnVXNlckRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRCdWZmZXIoIm1wZWctdXNlci1kYXRhIiwgbXBlZ1VzZXJEYXRhKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlBTRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJQU0V4dHJhY3Rvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OGE1ZjAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlBTRXh0cmFjdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc3MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJNUEVHMlBTRXh0cmFjdG9yIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiaW5jbHVkZS9NUEVHMlBTRXh0cmFjdG9yLmgiCi0KLSNpbmNsdWRlICJBbm90aGVyUGFja2V0U291cmNlLmgiCi0jaW5jbHVkZSAiRVNRdWV1ZS5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2sgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewotICAgIFRyYWNrKE1QRUcyUFNFeHRyYWN0b3IgKmV4dHJhY3RvciwKLSAgICAgICAgICB1bnNpZ25lZCBzdHJlYW1faWQsIHVuc2lnbmVkIHN0cmVhbV90eXBlKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+VHJhY2soKTsKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgc3RydWN0IE1QRUcyUFNFeHRyYWN0b3I7Ci0KLSAgICBNUEVHMlBTRXh0cmFjdG9yICptRXh0cmFjdG9yOwotCi0gICAgdW5zaWduZWQgbVN0cmVhbUlEOwotICAgIHVuc2lnbmVkIG1TdHJlYW1UeXBlOwotICAgIEVsZW1lbnRhcnlTdHJlYW1RdWV1ZSAqbVF1ZXVlOwotICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IG1Tb3VyY2U7Ci0KLSAgICBzdGF0dXNfdCBhcHBlbmRQRVNEYXRhKAotICAgICAgICAgICAgdW5zaWduZWQgUFRTX0RUU19mbGFncywKLSAgICAgICAgICAgIHVpbnQ2NF90IFBUUywgdWludDY0X3QgRFRTLAotICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVHJhY2spOwotfTsKLQotc3RydWN0IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjayA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7Ci0gICAgV3JhcHBlZFRyYWNrKGNvbnN0IHNwPE1QRUcyUFNFeHRyYWN0b3I+ICZleHRyYWN0b3IsIGNvbnN0IHNwPFRyYWNrPiAmdHJhY2spOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5XcmFwcGVkVHJhY2soKTsKLQotcHJpdmF0ZToKLSAgICBzcDxNUEVHMlBTRXh0cmFjdG9yPiBtRXh0cmFjdG9yOwotICAgIHNwPE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrPiBtVHJhY2s7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhXcmFwcGVkVHJhY2spOwotfTsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotTVBFRzJQU0V4dHJhY3Rvcjo6TVBFRzJQU0V4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKQotICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKLSAgICAgIG1PZmZzZXQoMCksCi0gICAgICBtRmluYWxSZXN1bHQoT0spLAotICAgICAgbUJ1ZmZlcihuZXcgQUJ1ZmZlcigwKSksCi0gICAgICBtU2Nhbm5pbmcodHJ1ZSksCi0gICAgICBtUHJvZ3JhbVN0cmVhbU1hcFZhbGlkKGZhbHNlKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA1MDA7ICsraSkgewotICAgICAgICBpZiAoZmVlZE1vcmUoKSAhPSBPSykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZW1vdmUgYWxsIHRyYWNrcyB0aGF0IHdlcmUgdW5hYmxlIHRvIGRldGVybWluZSB0aGVpciBmb3JtYXQuCi0gICAgZm9yIChzaXplX3QgaSA9IG1UcmFja3Muc2l6ZSgpOyBpID4gMDspIHsKLSAgICAgICAgaS0tOwotICAgICAgICBpZiAobVRyYWNrcy52YWx1ZUF0KGkpLT5nZXRGb3JtYXQoKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtVHJhY2tzLnJlbW92ZUl0ZW1zQXQoaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtU2Nhbm5pbmcgPSBmYWxzZTsKLX0KLQotTVBFRzJQU0V4dHJhY3Rvcjo6fk1QRUcyUFNFeHRyYWN0b3IoKSB7Ci19Ci0KLXNpemVfdCBNUEVHMlBTRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKLSAgICByZXR1cm4gbVRyYWNrcy5zaXplKCk7Ci19Ci0KLXNwPElNZWRpYVNvdXJjZT4gTVBFRzJQU0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7Ci0gICAgaWYgKGluZGV4ID49IG1UcmFja3Muc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBuZXcgV3JhcHBlZFRyYWNrKHRoaXMsIG1UcmFja3MudmFsdWVBdChpbmRleCkpOwotfQotCi1zcDxNZXRhRGF0YT4gTVBFRzJQU0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewotICAgIGlmIChpbmRleCA+PSBtVHJhY2tzLnNpemUoKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbVRyYWNrcy52YWx1ZUF0KGluZGV4KS0+Z2V0Rm9ybWF0KCk7Ci19Ci0KLXNwPE1ldGFEYXRhPiBNUEVHMlBTRXh0cmFjdG9yOjpnZXRNZXRhRGF0YSgpIHsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyUFMpOwotCi0gICAgcmV0dXJuIG1ldGE7Ci19Ci0KLXVpbnQzMl90IE1QRUcyUFNFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgewotICAgIHJldHVybiBDQU5fUEFVU0U7Ci19Ci0KLXN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OmZlZWRNb3JlKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAvLyBIb3cgbXVjaCBkYXRhIHdlJ3JlIHJlYWRpbmcgYXQgYSB0aW1lCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrQ2h1bmtTaXplID0gODE5MjsKLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gZGVxdWV1ZUNodW5rKCk7Ci0KLSAgICAgICAgaWYgKGVyciA9PSAtRUFHQUlOICYmIG1GaW5hbFJlc3VsdCA9PSBPSykgewotICAgICAgICAgICAgbWVtbW92ZShtQnVmZmVyLT5iYXNlKCksIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKTsKLSAgICAgICAgICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIG1CdWZmZXItPnNpemUoKSk7Ci0KLSAgICAgICAgICAgIGlmIChtQnVmZmVyLT5zaXplKCkgKyBrQ2h1bmtTaXplID4gbUJ1ZmZlci0+Y2FwYWNpdHkoKSkgewotICAgICAgICAgICAgICAgIHNpemVfdCBuZXdDYXBhY2l0eSA9IG1CdWZmZXItPmNhcGFjaXR5KCkgKyBrQ2h1bmtTaXplOwotICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IG5ld0J1ZmZlciA9IG5ldyBBQnVmZmVyKG5ld0NhcGFjaXR5KTsKLSAgICAgICAgICAgICAgICBtZW1jcHkobmV3QnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBuZXdCdWZmZXItPnNldFJhbmdlKDAsIG1CdWZmZXItPnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3NpemVfdCBuID0gbURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgbU9mZnNldCwgbUJ1ZmZlci0+ZGF0YSgpICsgbUJ1ZmZlci0+c2l6ZSgpLCBrQ2h1bmtTaXplKTsKLQotICAgICAgICAgICAgaWYgKG4gPCAoc3NpemVfdClrQ2h1bmtTaXplKSB7Ci0gICAgICAgICAgICAgICAgbUZpbmFsUmVzdWx0ID0gKG4gPCAwKSA/IChzdGF0dXNfdCluIDogRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUZpbmFsUmVzdWx0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZShtQnVmZmVyLT5vZmZzZXQoKSwgbUJ1ZmZlci0+c2l6ZSgpICsgbik7Ci0gICAgICAgICAgICBtT2Zmc2V0ICs9IG47Ci0gICAgICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBtRmluYWxSZXN1bHQgPSBlcnI7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpkZXF1ZXVlQ2h1bmsoKSB7Ci0gICAgaWYgKG1CdWZmZXItPnNpemUoKSA8IDQpIHsKLSAgICAgICAgcmV0dXJuIC1FQUdBSU47Ci0gICAgfQotCi0gICAgaWYgKG1lbWNtcCgiXHgwMFx4MDBceDAxIiwgbUJ1ZmZlci0+ZGF0YSgpLCAzKSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIHVuc2lnbmVkIGNodW5rVHlwZSA9IG1CdWZmZXItPmRhdGEoKVszXTsKLQotICAgIHNzaXplX3QgcmVzOwotCi0gICAgc3dpdGNoIChjaHVua1R5cGUpIHsKLSAgICAgICAgY2FzZSAweGJhOgotICAgICAgICB7Ci0gICAgICAgICAgICByZXMgPSBkZXF1ZXVlUGFjaygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIDB4YmI6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcyA9IGRlcXVldWVTeXN0ZW1IZWFkZXIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgcmVzID0gZGVxdWV1ZVBFUygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocmVzID4gMCkgewotICAgICAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpIDwgKHNpemVfdClyZXMpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUFHQUlOOwotICAgICAgICB9Ci0KLSAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UobUJ1ZmZlci0+b2Zmc2V0KCkgKyByZXMsIG1CdWZmZXItPnNpemUoKSAtIHJlcyk7Ci0gICAgICAgIHJlcyA9IE9LOwotICAgIH0KLQotICAgIHJldHVybiByZXM7Ci19Ci0KLXNzaXplX3QgTVBFRzJQU0V4dHJhY3Rvcjo6ZGVxdWV1ZVBhY2soKSB7Ci0gICAgLy8gMzIgKyAyICsgMyArIDEgKyAxNSArIDEgKyAxNSsgMSArIDkgKyAxICsgMjIgKyAxICsgMSB8ICs1Ci0KLSAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpIDwgMTQpIHsKLSAgICAgICAgcmV0dXJuIC1FQUdBSU47Ci0gICAgfQotCi0gICAgdW5zaWduZWQgcGFja19zdHVmZmluZ19sZW5ndGggPSBtQnVmZmVyLT5kYXRhKClbMTNdICYgNzsKLQotICAgIHJldHVybiBwYWNrX3N0dWZmaW5nX2xlbmd0aCArIDE0OwotfQotCi1zc2l6ZV90IE1QRUcyUFNFeHRyYWN0b3I6OmRlcXVldWVTeXN0ZW1IZWFkZXIoKSB7Ci0gICAgaWYgKG1CdWZmZXItPnNpemUoKSA8IDYpIHsKLSAgICAgICAgcmV0dXJuIC1FQUdBSU47Ci0gICAgfQotCi0gICAgdW5zaWduZWQgaGVhZGVyX2xlbmd0aCA9IFUxNl9BVChtQnVmZmVyLT5kYXRhKCkgKyA0KTsKLQotICAgIHJldHVybiBoZWFkZXJfbGVuZ3RoICsgNjsKLX0KLQotc3NpemVfdCBNUEVHMlBTRXh0cmFjdG9yOjpkZXF1ZXVlUEVTKCkgewotICAgIGlmIChtQnVmZmVyLT5zaXplKCkgPCA2KSB7Ci0gICAgICAgIHJldHVybiAtRUFHQUlOOwotICAgIH0KLQotICAgIHVuc2lnbmVkIFBFU19wYWNrZXRfbGVuZ3RoID0gVTE2X0FUKG1CdWZmZXItPmRhdGEoKSArIDQpOwotICAgIGlmIChQRVNfcGFja2V0X2xlbmd0aCA9PSAwdSkgewotICAgICAgICBBTE9HRSgiUEVTX3BhY2tldF9sZW5ndGggaXMgMCIpOwotICAgICAgICByZXR1cm4gLUVBR0FJTjsKLSAgICB9Ci0KLSAgICBzaXplX3QgbiA9IFBFU19wYWNrZXRfbGVuZ3RoICsgNjsKLQotICAgIGlmIChtQnVmZmVyLT5zaXplKCkgPCBuKSB7Ci0gICAgICAgIHJldHVybiAtRUFHQUlOOwotICAgIH0KLQotICAgIEFCaXRSZWFkZXIgYnIobUJ1ZmZlci0+ZGF0YSgpLCBuKTsKLQotICAgIHVuc2lnbmVkIHBhY2tldF9zdGFydGNvZGVfcHJlZml4ID0gYnIuZ2V0Qml0cygyNCk7Ci0KLSAgICBBTE9HVigicGFja2V0X3N0YXJ0Y29kZV9wcmVmaXggPSAweCUwOHgiLCBwYWNrZXRfc3RhcnRjb2RlX3ByZWZpeCk7Ci0KLSAgICBpZiAocGFja2V0X3N0YXJ0Y29kZV9wcmVmaXggIT0gMSkgewotICAgICAgICBBTE9HVigiU3VwcG9zZWRseSBwYXlsb2FkX3VuaXRfc3RhcnQ9MSB1bml0IGRvZXMgbm90IHN0YXJ0ICIKLSAgICAgICAgICAgICAid2l0aCBzdGFydGNvZGUuIik7Ci0KLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAocGFja2V0X3N0YXJ0Y29kZV9wcmVmaXggIT0gMHgwMDAwMDF1KSB7Ci0gICAgICAgIEFMT0dFKCJXcm9uZyBQRVMgcHJlZml4Iik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdW5zaWduZWQgc3RyZWFtX2lkID0gYnIuZ2V0Qml0cyg4KTsKLSAgICBBTE9HVigic3RyZWFtX2lkID0gMHglMDJ4Iiwgc3RyZWFtX2lkKTsKLQotICAgIC8qIHVuc2lnbmVkIFBFU19wYWNrZXRfbGVuZ3RoID0gKi9ici5nZXRCaXRzKDE2KTsKLQotICAgIGlmIChzdHJlYW1faWQgPT0gMHhiYykgewotICAgICAgICAvLyBwcm9ncmFtX3N0cmVhbV9tYXAKLQotICAgICAgICBpZiAoIW1TY2FubmluZykgewotICAgICAgICAgICAgcmV0dXJuIG47Ci0gICAgICAgIH0KLQotICAgICAgICBtU3RyZWFtVHlwZUJ5RVNJRC5jbGVhcigpOwotCi0gICAgICAgIC8qIHVuc2lnbmVkIGN1cnJlbnRfbmV4dF9pbmRpY2F0b3IgPSAqL2JyLmdldEJpdHMoMSk7Ci0gICAgICAgIC8qIHVuc2lnbmVkIHJlc2VydmVkID0gKi9ici5nZXRCaXRzKDIpOwotICAgICAgICAvKiB1bnNpZ25lZCBwcm9ncmFtX3N0cmVhbV9tYXBfdmVyc2lvbiA9ICovYnIuZ2V0Qml0cyg1KTsKLSAgICAgICAgLyogdW5zaWduZWQgcmVzZXJ2ZWQgPSAqL2JyLmdldEJpdHMoNyk7Ci0gICAgICAgIC8qIHVuc2lnbmVkIG1hcmtlcl9iaXQgPSAqL2JyLmdldEJpdHMoMSk7Ci0gICAgICAgIHVuc2lnbmVkIHByb2dyYW1fc3RyZWFtX2luZm9fbGVuZ3RoID0gYnIuZ2V0Qml0cygxNik7Ci0KLSAgICAgICAgc2l6ZV90IG9mZnNldCA9IDA7Ci0gICAgICAgIHdoaWxlIChvZmZzZXQgPCBwcm9ncmFtX3N0cmVhbV9pbmZvX2xlbmd0aCkgewotICAgICAgICAgICAgaWYgKG9mZnNldCArIDIgPiBwcm9ncmFtX3N0cmVhbV9pbmZvX2xlbmd0aCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVuc2lnbmVkIGRlc2NyaXB0b3JfdGFnID0gYnIuZ2V0Qml0cyg4KTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGRlc2NyaXB0b3JfbGVuZ3RoID0gYnIuZ2V0Qml0cyg4KTsKLQotICAgICAgICAgICAgQUxPR0koImZvdW5kIGRlc2NyaXB0b3IgdGFnIDB4JTAyeCBvZiBsZW5ndGggJXUiLAotICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3RhZywgZGVzY3JpcHRvcl9sZW5ndGgpOwotCi0gICAgICAgICAgICBpZiAob2Zmc2V0ICsgMiArIGRlc2NyaXB0b3JfbGVuZ3RoID4gcHJvZ3JhbV9zdHJlYW1faW5mb19sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBici5za2lwQml0cyg4ICogZGVzY3JpcHRvcl9sZW5ndGgpOwotCi0gICAgICAgICAgICBvZmZzZXQgKz0gMiArIGRlc2NyaXB0b3JfbGVuZ3RoOwotICAgICAgICB9Ci0KLSAgICAgICAgdW5zaWduZWQgZWxlbWVudGFyeV9zdHJlYW1fbWFwX2xlbmd0aCA9IGJyLmdldEJpdHMoMTYpOwotCi0gICAgICAgIG9mZnNldCA9IDA7Ci0gICAgICAgIHdoaWxlIChvZmZzZXQgPCBlbGVtZW50YXJ5X3N0cmVhbV9tYXBfbGVuZ3RoKSB7Ci0gICAgICAgICAgICBpZiAob2Zmc2V0ICsgNCA+IGVsZW1lbnRhcnlfc3RyZWFtX21hcF9sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1bnNpZ25lZCBzdHJlYW1fdHlwZSA9IGJyLmdldEJpdHMoOCk7Ci0gICAgICAgICAgICB1bnNpZ25lZCBlbGVtZW50YXJ5X3N0cmVhbV9pZCA9IGJyLmdldEJpdHMoOCk7Ci0KLSAgICAgICAgICAgIEFMT0dJKCJlbGVtZW50YXJ5IHN0cmVhbSBpZCAweCUwMnggaGFzIHN0cmVhbSB0eXBlIDB4JTAyeCIsCi0gICAgICAgICAgICAgICAgIGVsZW1lbnRhcnlfc3RyZWFtX2lkLCBzdHJlYW1fdHlwZSk7Ci0KLSAgICAgICAgICAgIG1TdHJlYW1UeXBlQnlFU0lELmFkZChlbGVtZW50YXJ5X3N0cmVhbV9pZCwgc3RyZWFtX3R5cGUpOwotCi0gICAgICAgICAgICB1bnNpZ25lZCBlbGVtZW50YXJ5X3N0cmVhbV9pbmZvX2xlbmd0aCA9IGJyLmdldEJpdHMoMTYpOwotCi0gICAgICAgICAgICBpZiAob2Zmc2V0ICsgNCArIGVsZW1lbnRhcnlfc3RyZWFtX2luZm9fbGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgID4gZWxlbWVudGFyeV9zdHJlYW1fbWFwX2xlbmd0aCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9mZnNldCArPSA0ICsgZWxlbWVudGFyeV9zdHJlYW1faW5mb19sZW5ndGg7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiB1bnNpZ25lZCBDUkMzMiA9ICovYnIuZ2V0Qml0cygzMik7Ci0KLSAgICAgICAgbVByb2dyYW1TdHJlYW1NYXBWYWxpZCA9IHRydWU7Ci0gICAgfSBlbHNlIGlmIChzdHJlYW1faWQgIT0gMHhiZSAgLy8gcGFkZGluZ19zdHJlYW0KLSAgICAgICAgICAgICYmIHN0cmVhbV9pZCAhPSAweGJmICAvLyBwcml2YXRlX3N0cmVhbV8yCi0gICAgICAgICAgICAmJiBzdHJlYW1faWQgIT0gMHhmMCAgLy8gRUNNCi0gICAgICAgICAgICAmJiBzdHJlYW1faWQgIT0gMHhmMSAgLy8gRU1NCi0gICAgICAgICAgICAmJiBzdHJlYW1faWQgIT0gMHhmZiAgLy8gcHJvZ3JhbV9zdHJlYW1fZGlyZWN0b3J5Ci0gICAgICAgICAgICAmJiBzdHJlYW1faWQgIT0gMHhmMiAgLy8gRFNNQ0MKLSAgICAgICAgICAgICYmIHN0cmVhbV9pZCAhPSAweGY4KSB7ICAvLyBILjIyMi4xIHR5cGUgRQotICAgICAgICAvKiB1bnNpZ25lZCBQRVNfbWFya2VyX2JpdHMgPSAqL2JyLmdldEJpdHMoMik7ICAvLyBzaG91bGQgYmUgMHgyKGhleCkKLSAgICAgICAgLyogdW5zaWduZWQgUEVTX3NjcmFtYmxpbmdfY29udHJvbCA9ICovYnIuZ2V0Qml0cygyKTsKLSAgICAgICAgLyogdW5zaWduZWQgUEVTX3ByaW9yaXR5ID0gKi9ici5nZXRCaXRzKDEpOwotICAgICAgICAvKiB1bnNpZ25lZCBkYXRhX2FsaWdubWVudF9pbmRpY2F0b3IgPSAqL2JyLmdldEJpdHMoMSk7Ci0gICAgICAgIC8qIHVuc2lnbmVkIGNvcHlyaWdodCA9ICovYnIuZ2V0Qml0cygxKTsKLSAgICAgICAgLyogdW5zaWduZWQgb3JpZ2luYWxfb3JfY29weSA9ICovYnIuZ2V0Qml0cygxKTsKLQotICAgICAgICB1bnNpZ25lZCBQVFNfRFRTX2ZsYWdzID0gYnIuZ2V0Qml0cygyKTsKLSAgICAgICAgQUxPR1YoIlBUU19EVFNfZmxhZ3MgPSAldSIsIFBUU19EVFNfZmxhZ3MpOwotCi0gICAgICAgIHVuc2lnbmVkIEVTQ1JfZmxhZyA9IGJyLmdldEJpdHMoMSk7Ci0gICAgICAgIEFMT0dWKCJFU0NSX2ZsYWcgPSAldSIsIEVTQ1JfZmxhZyk7Ci0KLSAgICAgICAgdW5zaWduZWQgRVNfcmF0ZV9mbGFnID0gYnIuZ2V0Qml0cygxKTsKLSAgICAgICAgQUxPR1YoIkVTX3JhdGVfZmxhZyA9ICV1IiwgRVNfcmF0ZV9mbGFnKTsKLQotICAgICAgICB1bnNpZ25lZCBEU01fdHJpY2tfbW9kZV9mbGFnID0gYnIuZ2V0Qml0cygxKTsKLSAgICAgICAgQUxPR1YoIkRTTV90cmlja19tb2RlX2ZsYWcgPSAldSIsIERTTV90cmlja19tb2RlX2ZsYWcpOwotCi0gICAgICAgIHVuc2lnbmVkIGFkZGl0aW9uYWxfY29weV9pbmZvX2ZsYWcgPSBici5nZXRCaXRzKDEpOwotICAgICAgICBBTE9HVigiYWRkaXRpb25hbF9jb3B5X2luZm9fZmxhZyA9ICV1IiwgYWRkaXRpb25hbF9jb3B5X2luZm9fZmxhZyk7Ci0KLSAgICAgICAgLyogdW5zaWduZWQgUEVTX0NSQ19mbGFnID0gKi9ici5nZXRCaXRzKDEpOwotICAgICAgICAvKiBQRVNfZXh0ZW5zaW9uX2ZsYWcgPSAqL2JyLmdldEJpdHMoMSk7Ci0KLSAgICAgICAgdW5zaWduZWQgUEVTX2hlYWRlcl9kYXRhX2xlbmd0aCA9IGJyLmdldEJpdHMoOCk7Ci0gICAgICAgIEFMT0dWKCJQRVNfaGVhZGVyX2RhdGFfbGVuZ3RoID0gJXUiLCBQRVNfaGVhZGVyX2RhdGFfbGVuZ3RoKTsKLQotICAgICAgICB1bnNpZ25lZCBvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgPSBQRVNfaGVhZGVyX2RhdGFfbGVuZ3RoOwotCi0gICAgICAgIHVpbnQ2NF90IFBUUyA9IDAsIERUUyA9IDA7Ci0KLSAgICAgICAgaWYgKFBUU19EVFNfZmxhZ3MgPT0gMiB8fCBQVFNfRFRTX2ZsYWdzID09IDMpIHsKLSAgICAgICAgICAgIGlmIChvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgPCA1dSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDQpICE9IFBUU19EVFNfZmxhZ3MpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBQVFMgPSAoKHVpbnQ2NF90KWJyLmdldEJpdHMoMykpIDw8IDMwOwotICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkgIT0gMXUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUFRTIHw9ICgodWludDY0X3QpYnIuZ2V0Qml0cygxNSkpIDw8IDE1OwotICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkgIT0gMXUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUFRTIHw9IGJyLmdldEJpdHMoMTUpOwotICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkgIT0gMXUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBTE9HVigiUFRTID0gJSIgUFJJdTY0LCBQVFMpOwotICAgICAgICAgICAgLy8gQUxPR0koIlBUUyA9ICUuMmYgc2VjcyIsIFBUUyAvIDkwMDAwLjBmKTsKLQotICAgICAgICAgICAgb3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIC09IDU7Ci0KLSAgICAgICAgICAgIGlmIChQVFNfRFRTX2ZsYWdzID09IDMpIHsKLSAgICAgICAgICAgICAgICBpZiAob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIDwgNXUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cyg0KSAhPSAxdSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIERUUyA9ICgodWludDY0X3QpYnIuZ2V0Qml0cygzKSkgPDwgMzA7Ci0gICAgICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkgIT0gMXUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRFRTIHw9ICgodWludDY0X3QpYnIuZ2V0Qml0cygxNSkpIDw8IDE1OwotICAgICAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDEpICE9IDF1KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIERUUyB8PSBici5nZXRCaXRzKDE1KTsKLSAgICAgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSAhPSAxdSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEFMT0dWKCJEVFMgPSAlIiBQUkl1NjQsIERUUyk7Ci0KLSAgICAgICAgICAgICAgICBvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgLT0gNTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChFU0NSX2ZsYWcpIHsKLSAgICAgICAgICAgIGlmIChvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgPCA2dSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyLmdldEJpdHMoMik7Ci0KLSAgICAgICAgICAgIHVpbnQ2NF90IEVTQ1IgPSAoKHVpbnQ2NF90KWJyLmdldEJpdHMoMykpIDw8IDMwOwotICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkgIT0gMXUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRVNDUiB8PSAoKHVpbnQ2NF90KWJyLmdldEJpdHMoMTUpKSA8PCAxNTsKLSAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDEpICE9IDF1KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEVTQ1IgfD0gYnIuZ2V0Qml0cygxNSk7Ci0gICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSAhPSAxdSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFMT0dWKCJFU0NSID0gJSIgUFJJdTY0LCBFU0NSKTsKLSAgICAgICAgICAgIC8qIHVuc2lnbmVkIEVTQ1JfZXh0ZW5zaW9uID0gKi9ici5nZXRCaXRzKDkpOwotCi0gICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSAhPSAxdSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyAtPSA2OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKEVTX3JhdGVfZmxhZykgewotICAgICAgICAgICAgaWYgKG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyA8IDN1KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkgIT0gMXUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogdW5zaWduZWQgRVNfcmF0ZSA9ICovYnIuZ2V0Qml0cygyMik7Ci0gICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSAhPSAxdSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyAtPSAzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCBvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgKiA4KSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgYnIuc2tpcEJpdHMob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nICogOCk7Ci0KLSAgICAgICAgLy8gRVMgZGF0YSBmb2xsb3dzLgotCi0gICAgICAgIGlmIChQRVNfcGFja2V0X2xlbmd0aCA8IFBFU19oZWFkZXJfZGF0YV9sZW5ndGggKyAzKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgdW5zaWduZWQgZGF0YUxlbmd0aCA9Ci0gICAgICAgICAgICBQRVNfcGFja2V0X2xlbmd0aCAtIDMgLSBQRVNfaGVhZGVyX2RhdGFfbGVuZ3RoOwotCi0gICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgZGF0YUxlbmd0aCAqIDgpIHsKLSAgICAgICAgICAgIEFMT0dFKCJQRVMgcGFja2V0IGRvZXMgbm90IGNhcnJ5IGVub3VnaCBkYXRhIHRvIGNvbnRhaW4gIgotICAgICAgICAgICAgICAgICAicGF5bG9hZC4gKG51bUJpdHNMZWZ0ID0gJXp1LCByZXF1aXJlZCA9ICV1KSIsCi0gICAgICAgICAgICAgICAgIGJyLm51bUJpdHNMZWZ0KCksIGRhdGFMZW5ndGggKiA4KTsKLQotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgZGF0YUxlbmd0aCAqIDgpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBzc2l6ZV90IGluZGV4ID0gbVRyYWNrcy5pbmRleE9mS2V5KHN0cmVhbV9pZCk7Ci0gICAgICAgIGlmIChpbmRleCA8IDAgJiYgbVNjYW5uaW5nKSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBzdHJlYW1UeXBlOwotCi0gICAgICAgICAgICBzc2l6ZV90IHN0cmVhbVR5cGVJbmRleDsKLSAgICAgICAgICAgIGlmIChtUHJvZ3JhbVN0cmVhbU1hcFZhbGlkCi0gICAgICAgICAgICAgICAgICAgICYmIChzdHJlYW1UeXBlSW5kZXggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlQnlFU0lELmluZGV4T2ZLZXkoc3RyZWFtX2lkKSkgPj0gMCkgewotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBtU3RyZWFtVHlwZUJ5RVNJRC52YWx1ZUF0KHN0cmVhbVR5cGVJbmRleCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChzdHJlYW1faWQgJiB+MHgxZikgPT0gMHhjMCkgewotICAgICAgICAgICAgICAgIC8vIElTTy9JRUMgMTM4MTgtMyBvciBJU08vSUVDIDExMTcyLTMgb3IgSVNPL0lFQyAxMzgxOC03Ci0gICAgICAgICAgICAgICAgLy8gb3IgSVNPL0lFQyAxNDQ5Ni0zIGF1ZGlvCi0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IEFUU1BhcnNlcjo6U1RSRUFNVFlQRV9NUEVHMl9BVURJTzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKHN0cmVhbV9pZCAmIH4weDBmKSA9PSAweGUwKSB7Ci0gICAgICAgICAgICAgICAgLy8gSVNPL0lFQyAxMzgxOC0yIG9yIElTTy9JRUMgMTExNzItMiBvciBJU08vSUVDIDE0NDk2LTIgdmlkZW8KLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gQVRTUGFyc2VyOjpTVFJFQU1UWVBFX01QRUcyX1ZJREVPOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gQVRTUGFyc2VyOjpTVFJFQU1UWVBFX1JFU0VSVkVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbmRleCA9IG1UcmFja3MuYWRkKAotICAgICAgICAgICAgICAgICAgICBzdHJlYW1faWQsIG5ldyBUcmFjayh0aGlzLCBzdHJlYW1faWQsIHN0cmVhbVR5cGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBlcnIgPQotICAgICAgICAgICAgICAgIG1UcmFja3MuZWRpdFZhbHVlQXQoaW5kZXgpLT5hcHBlbmRQRVNEYXRhKAotICAgICAgICAgICAgICAgICAgICBQVFNfRFRTX2ZsYWdzLCBQVFMsIERUUywgYnIuZGF0YSgpLCBkYXRhTGVuZ3RoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJyLnNraXBCaXRzKGRhdGFMZW5ndGggKiA4KTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChzdHJlYW1faWQgPT0gMHhiZSkgeyAgLy8gcGFkZGluZ19zdHJlYW0KLSAgICAgICAgaWYgKFBFU19wYWNrZXRfbGVuZ3RoID09IDB1KSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgICAgIGJyLnNraXBCaXRzKFBFU19wYWNrZXRfbGVuZ3RoICogOCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKFBFU19wYWNrZXRfbGVuZ3RoID09IDB1KSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgICAgIGJyLnNraXBCaXRzKFBFU19wYWNrZXRfbGVuZ3RoICogOCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG47Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLU1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjpUcmFjaygKLSAgICAgICAgTVBFRzJQU0V4dHJhY3RvciAqZXh0cmFjdG9yLCB1bnNpZ25lZCBzdHJlYW1faWQsIHVuc2lnbmVkIHN0cmVhbV90eXBlKQotICAgIDogbUV4dHJhY3RvcihleHRyYWN0b3IpLAotICAgICAgbVN0cmVhbUlEKHN0cmVhbV9pZCksCi0gICAgICBtU3RyZWFtVHlwZShzdHJlYW1fdHlwZSksCi0gICAgICBtUXVldWUoTlVMTCkgewotICAgIGJvb2wgc3VwcG9ydGVkID0gdHJ1ZTsKLSAgICBFbGVtZW50YXJ5U3RyZWFtUXVldWU6Ok1vZGUgbW9kZTsKLQotICAgIHN3aXRjaCAobVN0cmVhbVR5cGUpIHsKLSAgICAgICAgY2FzZSBBVFNQYXJzZXI6OlNUUkVBTVRZUEVfSDI2NDoKLSAgICAgICAgICAgIG1vZGUgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OkgyNjQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBVFNQYXJzZXI6OlNUUkVBTVRZUEVfTVBFRzJfQVVESU9fQURUUzoKLSAgICAgICAgICAgIG1vZGUgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OkFBQzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFUU1BhcnNlcjo6U1RSRUFNVFlQRV9NUEVHMV9BVURJTzoKLSAgICAgICAgY2FzZSBBVFNQYXJzZXI6OlNUUkVBTVRZUEVfTVBFRzJfQVVESU86Ci0gICAgICAgICAgICBtb2RlID0gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpNUEVHX0FVRElPOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBBVFNQYXJzZXI6OlNUUkVBTVRZUEVfTVBFRzFfVklERU86Ci0gICAgICAgIGNhc2UgQVRTUGFyc2VyOjpTVFJFQU1UWVBFX01QRUcyX1ZJREVPOgotICAgICAgICAgICAgbW9kZSA9IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6TVBFR19WSURFTzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQVRTUGFyc2VyOjpTVFJFQU1UWVBFX01QRUc0X1ZJREVPOgotICAgICAgICAgICAgbW9kZSA9IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6TVBFRzRfVklERU87Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgc3VwcG9ydGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoc3VwcG9ydGVkKSB7Ci0gICAgICAgIG1RdWV1ZSA9IG5ldyBFbGVtZW50YXJ5U3RyZWFtUXVldWUobW9kZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0koInVuc3VwcG9ydGVkIHN0cmVhbSBJRCAweCUwMngiLCBzdHJlYW1faWQpOwotICAgIH0KLX0KLQotTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6On5UcmFjaygpIHsKLSAgICBkZWxldGUgbVF1ZXVlOwotICAgIG1RdWV1ZSA9IE5VTEw7Ci19Ci0KLXN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7Ci0gICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbVNvdXJjZS0+c3RhcnQocGFyYW1zKTsKLX0KLQotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OnN0b3AoKSB7Ci0gICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbVNvdXJjZS0+c3RvcCgpOwotfQotCi1zcDxNZXRhRGF0YT4gTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OmdldEZvcm1hdCgpIHsKLSAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBtU291cmNlLT5nZXRGb3JtYXQoKTsKLX0KLQotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZmluYWxSZXN1bHQ7Ci0gICAgd2hpbGUgKCFtU291cmNlLT5oYXNCdWZmZXJBdmFpbGFibGUoJmZpbmFsUmVzdWx0KSkgewotICAgICAgICBpZiAoZmluYWxSZXN1bHQgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+ZmVlZE1vcmUoKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBtU291cmNlLT5zaWduYWxFT1MoZXJyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBtU291cmNlLT5yZWFkKGJ1ZmZlciwgb3B0aW9ucyk7Ci19Ci0KLXN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjphcHBlbmRQRVNEYXRhKAotICAgICAgICB1bnNpZ25lZCBQVFNfRFRTX2ZsYWdzLAotICAgICAgICB1aW50NjRfdCBQVFMsIHVpbnQ2NF90IC8qIERUUyAqLywKLSAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBpZiAobVF1ZXVlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGludDY0X3QgdGltZVVzOwotICAgIGlmIChQVFNfRFRTX2ZsYWdzID09IDIgfHwgUFRTX0RUU19mbGFncyA9PSAzKSB7Ci0gICAgICAgIHRpbWVVcyA9IChQVFMgKiAxMDApIC8gOTsKLSAgICB9IGVsc2UgewotICAgICAgICB0aW1lVXMgPSAwOwotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IG1RdWV1ZS0+YXBwZW5kRGF0YShkYXRhLCBzaXplLCB0aW1lVXMpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQ7Ci0gICAgd2hpbGUgKChhY2Nlc3NVbml0ID0gbVF1ZXVlLT5kZXF1ZXVlQWNjZXNzVW5pdCgpKSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVF1ZXVlLT5nZXRGb3JtYXQoKTsKLQotICAgICAgICAgICAgaWYgKG1ldGEgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJTdHJlYW0gSUQgMHglMDJ4IG5vdyBoYXMgZGF0YS4iLCBtU3RyZWFtSUQpOwotCi0gICAgICAgICAgICAgICAgbVNvdXJjZSA9IG5ldyBBbm90aGVyUGFja2V0U291cmNlKG1ldGEpOwotICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtUXVldWUtPmdldEZvcm1hdCgpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1Tb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpXcmFwcGVkVHJhY2soCi0gICAgICAgIGNvbnN0IHNwPE1QRUcyUFNFeHRyYWN0b3I+ICZleHRyYWN0b3IsIGNvbnN0IHNwPFRyYWNrPiAmdHJhY2spCi0gICAgOiBtRXh0cmFjdG9yKGV4dHJhY3RvciksCi0gICAgICBtVHJhY2sodHJhY2spIHsKLX0KLQotTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjp+V3JhcHBlZFRyYWNrKCkgewotfQotCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKLSAgICByZXR1cm4gbVRyYWNrLT5zdGFydChwYXJhbXMpOwotfQotCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6OnN0b3AoKSB7Ci0gICAgcmV0dXJuIG1UcmFjay0+c3RvcCgpOwotfQotCi1zcDxNZXRhRGF0YT4gTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpnZXRGb3JtYXQoKSB7Ci0gICAgcmV0dXJuIG1UcmFjay0+Z2V0Rm9ybWF0KCk7Ci19Ci0KLXN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7Ci0gICAgcmV0dXJuIG1UcmFjay0+cmVhZChidWZmZXIsIG9wdGlvbnMpOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1ib29sIFNuaWZmTVBFRzJQUygKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICBzcDxBTWVzc2FnZT4gKikgewotICAgIHVpbnQ4X3QgaGVhZGVyWzVdOwotICAgIGlmIChzb3VyY2UtPnJlYWRBdCgwLCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKSA8IChzc2l6ZV90KXNpemVvZihoZWFkZXIpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAobWVtY21wKCJceDAwXHgwMFx4MDFceGJhIiwgaGVhZGVyLCA0KSB8fCAoaGVhZGVyWzRdID4+IDYpICE9IDEpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgICpjb25maWRlbmNlID0gMC4yNWY7ICAvLyBTbGlnaHRseSBsYXJnZXIgdGhhbiAubXAzIGV4dHJhY3RvcidzIGNvbmZpZGVuY2UKLQotICAgIG1pbWVUeXBlLT5zZXRUbyhNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJQUyk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJUU0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyVFNFeHRyYWN0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDY4NGUwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJUU0V4dHJhY3Rvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTVBFRzJUU0V4dHJhY3RvciIKLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaCIKLSNpbmNsdWRlICJpbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9JU3RyZWFtU291cmNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi0jaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgotI2luY2x1ZGUgIkFUU1BhcnNlci5oIgotCi0jaW5jbHVkZSA8aGlkbC9IeWJyaWRJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy8xLjAvSUNhcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXVzaW5nIGhhcmR3YXJlOjpjYXM6OlYxXzA6OklDYXM7Ci0KLXN0YXRpYyBjb25zdCBzaXplX3Qga1RTUGFja2V0U2l6ZSA9IDE4ODsKLXN0YXRpYyBjb25zdCBpbnQga01heER1cmF0aW9uUmVhZFNpemUgPSAyNTAwMDBMTDsKLXN0YXRpYyBjb25zdCBpbnQga01heER1cmF0aW9uUmV0cnkgPSA2OwotCi1zdHJ1Y3QgTVBFRzJUU1NvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7Ci0gICAgTVBFRzJUU1NvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPE1QRUcyVFNFeHRyYWN0b3I+ICZleHRyYWN0b3IsCi0gICAgICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCwKLSAgICAgICAgICAgIGJvb2wgZG9lc1NlZWspOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKLQotcHJpdmF0ZToKLSAgICBzcDxNUEVHMlRTRXh0cmFjdG9yPiBtRXh0cmFjdG9yOwotICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IG1JbXBsOwotCi0gICAgLy8gSWYgdGhlcmUgYXJlIGJvdGggYXVkaW8gYW5kIHZpZGVvIHN0cmVhbXMsIG9ubHkgdGhlIHZpZGVvIHN0cmVhbQotICAgIC8vIHdpbGwgc2lnbmFsIHNlZWsgb24gdGhlIGV4dHJhY3Rvcjsgb3RoZXJ3aXNlIHRoZSBzaW5nbGUgc3RyZWFtIHdpbGwgc2Vlay4KLSAgICBib29sIG1Eb2VzU2VlazsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1QRUcyVFNTb3VyY2UpOwotfTsKLQotTVBFRzJUU1NvdXJjZTo6TVBFRzJUU1NvdXJjZSgKLSAgICAgICAgY29uc3Qgc3A8TVBFRzJUU0V4dHJhY3Rvcj4gJmV4dHJhY3RvciwKLSAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwsCi0gICAgICAgIGJvb2wgZG9lc1NlZWspCi0gICAgOiBtRXh0cmFjdG9yKGV4dHJhY3RvciksCi0gICAgICBtSW1wbChpbXBsKSwKLSAgICAgIG1Eb2VzU2Vlayhkb2VzU2VlaykgewotfQotCi1zdGF0dXNfdCBNUEVHMlRTU291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7Ci0gICAgcmV0dXJuIG1JbXBsLT5zdGFydChwYXJhbXMpOwotfQotCi1zdGF0dXNfdCBNUEVHMlRTU291cmNlOjpzdG9wKCkgewotICAgIHJldHVybiBtSW1wbC0+c3RvcCgpOwotfQotCi1zcDxNZXRhRGF0YT4gTVBFRzJUU1NvdXJjZTo6Z2V0Rm9ybWF0KCkgewotICAgIHJldHVybiBtSW1wbC0+Z2V0Rm9ybWF0KCk7Ci19Ci0KLXN0YXR1c190IE1QRUcyVFNTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotICAgICpvdXQgPSBOVUxMOwotCi0gICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBzZWVrTW9kZTsKLSAgICBpZiAobURvZXNTZWVrICYmIG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmc2Vla01vZGUpKSB7Ci0gICAgICAgIC8vIHNlZWsgaXMgbmVlZGVkCi0gICAgICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPnNlZWsoc2Vla1RpbWVVcywgc2Vla01vZGUpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1FeHRyYWN0b3ItPmZlZWRVbnRpbEJ1ZmZlckF2YWlsYWJsZShtSW1wbCkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgfQotCi0gICAgcmV0dXJuIG1JbXBsLT5yZWFkKG91dCwgb3B0aW9ucyk7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLU1QRUcyVFNFeHRyYWN0b3I6Ok1QRUcyVFNFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkKLSAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCi0gICAgICBtUGFyc2VyKG5ldyBBVFNQYXJzZXIpLAotICAgICAgbUxhc3RTeW5jRXZlbnQoMCksCi0gICAgICBtT2Zmc2V0KDApIHsKLSAgICBpbml0KCk7Ci19Ci0KLXNpemVfdCBNUEVHMlRTRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKLSAgICByZXR1cm4gbVNvdXJjZUltcGxzLnNpemUoKTsKLX0KLQotc3A8SU1lZGlhU291cmNlPiBNUEVHMlRTRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKLSAgICBpZiAoaW5kZXggPj0gbVNvdXJjZUltcGxzLnNpemUoKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvLyBUaGUgc2VlayByZWZlcmVuY2UgdHJhY2sgKHZpZGVvIGlmIHByZXNlbnQ7IGF1ZGlvIG90aGVyd2lzZSkgcGVyZm9ybXMKLSAgICAvLyBzZWVrIHJlcXVlc3RzLCB3aGlsZSBvdGhlciB0cmFja3MgaWdub3JlIHJlcXVlc3RzLgotICAgIHJldHVybiBuZXcgTVBFRzJUU1NvdXJjZSh0aGlzLCBtU291cmNlSW1wbHMuZWRpdEl0ZW1BdChpbmRleCksCi0gICAgICAgICAgICAobVNlZWtTeW5jUG9pbnRzID09ICZtU3luY1BvaW50cy5lZGl0SXRlbUF0KGluZGV4KSkpOwotfQotCi1zcDxNZXRhRGF0YT4gTVBFRzJUU0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewotICAgIHJldHVybiBpbmRleCA8IG1Tb3VyY2VJbXBscy5zaXplKCkKLSAgICAgICAgPyBtU291cmNlSW1wbHMuZWRpdEl0ZW1BdChpbmRleCktPmdldEZvcm1hdCgpIDogTlVMTDsKLX0KLQotc3A8TWV0YURhdGE+IE1QRUcyVFNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKCkgewotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJUUyk7Ci0KLSAgICByZXR1cm4gbWV0YTsKLX0KLQotLy9zdGF0aWMKLWJvb2wgTVBFRzJUU0V4dHJhY3Rvcjo6aXNTY3JhbWJsZWRGb3JtYXQoY29uc3Qgc3A8TWV0YURhdGE+ICZmb3JtYXQpIHsKLSAgICBjb25zdCBjaGFyICptaW1lOwotICAgIHJldHVybiBmb3JtYXQtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpCi0gICAgICAgICAgICAmJiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fU0NSQU1CTEVELCBtaW1lKQotICAgICAgICAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQsIG1pbWUpKTsKLX0KLQotc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6c2V0TWVkaWFDYXMoY29uc3QgSEludGVyZmFjZVRva2VuICZjYXNUb2tlbikgewotICAgIEhhbFRva2VuIGhhbFRva2VuOwotICAgIGhhbFRva2VuLnNldFRvRXh0ZXJuYWwoKHVpbnQ4X3QqKWNhc1Rva2VuLmRhdGEoKSwgY2FzVG9rZW4uc2l6ZSgpKTsKLSAgICBzcDxJQ2FzPiBjYXMgPSBJQ2FzOjpjYXN0RnJvbShyZXRyaWV2ZUhhbEludGVyZmFjZShoYWxUb2tlbikpOwotICAgIEFMT0dEKCJzZXRNZWRpYUNhczogJXAiLCBjYXMuZ2V0KCkpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gbVBhcnNlci0+c2V0TWVkaWFDYXMoY2FzKTsKLSAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgIEFMT0dJKCJBbGwgdHJhY2tzIG5vdyBoYXZlIGRlc2NyYW1ibGVycyIpOwotICAgICAgICBpbml0KCk7Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXZvaWQgTVBFRzJUU0V4dHJhY3Rvcjo6YWRkU291cmNlKGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsKSB7Ci0gICAgYm9vbCBmb3VuZCA9IGZhbHNlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNvdXJjZUltcGxzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtU291cmNlSW1wbHNbaV0gPT0gaW1wbCkgewotICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFmb3VuZCkgewotICAgICAgICBtU291cmNlSW1wbHMucHVzaChpbXBsKTsKLSAgICB9Ci19Ci0KLXZvaWQgTVBFRzJUU0V4dHJhY3Rvcjo6aW5pdCgpIHsKLSAgICBib29sIGhhdmVBdWRpbyA9IGZhbHNlOwotICAgIGJvb2wgaGF2ZVZpZGVvID0gZmFsc2U7Ci0gICAgaW50NjRfdCBzdGFydFRpbWUgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotCi0gICAgc3RhdHVzX3QgZXJyOwotICAgIHdoaWxlICgoZXJyID0gZmVlZE1vcmUodHJ1ZSAvKiBpc0luaXQgKi8pKSA9PSBPSwotICAgICAgICAgICAgfHwgZXJyID09IEVSUk9SX0RSTV9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVEKSB7Ci0gICAgICAgIGlmIChoYXZlQXVkaW8gJiYgaGF2ZVZpZGVvKSB7Ci0gICAgICAgICAgICBhZGRTeW5jUG9pbnRfbChtTGFzdFN5bmNFdmVudCk7Ci0gICAgICAgICAgICBtTGFzdFN5bmNFdmVudC5yZXNldCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFoYXZlVmlkZW8pIHsKLSAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IGltcGwgPQotICAgICAgICAgICAgICAgIChBbm90aGVyUGFja2V0U291cmNlICopbVBhcnNlci0+Z2V0U291cmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpWSURFTykuZ2V0KCk7Ci0KLSAgICAgICAgICAgIGlmIChpbXBsICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ID0gaW1wbC0+Z2V0Rm9ybWF0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhdmVWaWRlbyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFNvdXJjZShpbXBsKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NjcmFtYmxlZEZvcm1hdChmb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3luY1BvaW50cy5wdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2Vla1N5bmNQb2ludHMgPSAmbVN5bmNQb2ludHMuZWRpdFRvcCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFoYXZlQXVkaW8pIHsKLSAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IGltcGwgPQotICAgICAgICAgICAgICAgIChBbm90aGVyUGFja2V0U291cmNlICopbVBhcnNlci0+Z2V0U291cmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpBVURJTykuZ2V0KCk7Ci0KLSAgICAgICAgICAgIGlmIChpbXBsICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ID0gaW1wbC0+Z2V0Rm9ybWF0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhdmVBdWRpbyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFNvdXJjZShpbXBsKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NjcmFtYmxlZEZvcm1hdChmb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3luY1BvaW50cy5wdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhdmVWaWRlbykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWVrU3luY1BvaW50cyA9ICZtU3luY1BvaW50cy5lZGl0VG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRTeW5jUG9pbnRfbChtTGFzdFN5bmNFdmVudCk7Ci0gICAgICAgIG1MYXN0U3luY0V2ZW50LnJlc2V0KCk7Ci0KLSAgICAgICAgLy8gRVJST1JfRFJNX0RFQ1JZUFRfVU5JVF9OT1RfSU5JVElBTElaRUQgaXMgcmV0dXJuZWQgd2hlbiB0aGUgbXBlZzJ0cwotICAgICAgICAvLyBpcyBzY3JhbWJsZWQgYnV0IHdlIGRvbid0IGhhdmUgYSBNZWRpYUNhcyBvYmplY3Qgc2V0LiBUaGUgZXh0cmFjdGlvbgotICAgICAgICAvLyB3aWxsIG9ubHkgY29udGludWUgd2hlbiBzZXRNZWRpYUNhcygpIGlzIGNhbGxlZCBzdWNjZXNzZnVsbHkuCi0gICAgICAgIGlmIChlcnIgPT0gRVJST1JfRFJNX0RFQ1JZUFRfVU5JVF9OT1RfSU5JVElBTElaRUQpIHsKLSAgICAgICAgICAgIEFMT0dJKCJzdG9wcGVkIHBhcnNpbmcgc2NyYW1ibGVkIGNvbnRlbnQsICIKLSAgICAgICAgICAgICAgICAgICJoYXZlQXVkaW89JWQsIGhhdmVWaWRlbz0lZCwgZWxhc3BlZFRpbWU9JSIgUFJJZDY0LAotICAgICAgICAgICAgICAgICAgICBoYXZlQXVkaW8sIGhhdmVWaWRlbywgQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXYWl0IG9ubHkgZm9yIDIgc2Vjb25kcyB0byBkZXRlY3QgYXVkaW8vdmlkZW8gc3RyZWFtcy4KLSAgICAgICAgaWYgKEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWUgPiAyMDAwMDAwbGwpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgb2ZmNjRfdCBzaXplOwotICAgIGlmIChtRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSkgPT0gT0sgJiYgKGhhdmVBdWRpbyB8fCBoYXZlVmlkZW8pKSB7Ci0gICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IGltcGwgPSBoYXZlVmlkZW8KLSAgICAgICAgICAgICAgICA/IChBbm90aGVyUGFja2V0U291cmNlICopbVBhcnNlci0+Z2V0U291cmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpWSURFTykuZ2V0KCkKLSAgICAgICAgICAgICAgICA6IChBbm90aGVyUGFja2V0U291cmNlICopbVBhcnNlci0+Z2V0U291cmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpBVURJTykuZ2V0KCk7Ci0gICAgICAgIHNpemVfdCBwcmV2U3luY1NpemUgPSAxOwotICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSAtMTsKLSAgICAgICAgTGlzdDxpbnQ2NF90PiBkdXJhdGlvbnM7Ci0gICAgICAgIC8vIEVzdGltYXRlIGR1cmF0aW9uIC0tLSBzdGFiaWxpemUgdW50aWwgeW91IGdldCA8NTAwbXMgZGV2aWF0aW9uLgotICAgICAgICB3aGlsZSAoZmVlZE1vcmUoKSA9PSBPSwotICAgICAgICAgICAgICAgICYmIEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWUgPD0gMjAwMDAwMGxsKSB7Ci0gICAgICAgICAgICBpZiAobVNlZWtTeW5jUG9pbnRzLT5zaXplKCkgPiBwcmV2U3luY1NpemUpIHsKLSAgICAgICAgICAgICAgICBwcmV2U3luY1NpemUgPSBtU2Vla1N5bmNQb2ludHMtPnNpemUoKTsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IGRpZmZVcyA9IG1TZWVrU3luY1BvaW50cy0+a2V5QXQocHJldlN5bmNTaXplIC0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC0gbVNlZWtTeW5jUG9pbnRzLT5rZXlBdCgwKTsKLSAgICAgICAgICAgICAgICBvZmY2NF90IGRpZmZPZmZzZXQgPSBtU2Vla1N5bmNQb2ludHMtPnZhbHVlQXQocHJldlN5bmNTaXplIC0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC0gbVNlZWtTeW5jUG9pbnRzLT52YWx1ZUF0KDApOwotICAgICAgICAgICAgICAgIGludDY0X3QgY3VycmVudER1cmF0aW9uVXMgPSBzaXplICogZGlmZlVzIC8gZGlmZk9mZnNldDsKLSAgICAgICAgICAgICAgICBkdXJhdGlvbnMucHVzaF9iYWNrKGN1cnJlbnREdXJhdGlvblVzKTsKLSAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb25zLnNpemUoKSA+IDUpIHsKLSAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25zLmVyYXNlKGR1cmF0aW9ucy5iZWdpbigpKTsKLSAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBtaW4gPSAqZHVyYXRpb25zLmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgIGludDY0X3QgbWF4ID0gKmR1cmF0aW9ucy5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8gZHVyYXRpb24gOiBkdXJhdGlvbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaW4gPiBkdXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbiA9IGR1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1heCA8IGR1cmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4ID0gZHVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1heCAtIG1pbiA8IDUwMCAqIDEwMDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uVXMgPSBjdXJyZW50RHVyYXRpb25VczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHN0YXR1c190IGVycjsKLSAgICAgICAgaW50NjRfdCBidWZmZXJlZER1cmF0aW9uVXM7Ci0gICAgICAgIGJ1ZmZlcmVkRHVyYXRpb25VcyA9IGltcGwtPmdldEJ1ZmZlcmVkRHVyYXRpb25VcygmZXJyKTsKLSAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICBkdXJhdGlvblVzID0gYnVmZmVyZWREdXJhdGlvblVzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkdXJhdGlvblVzID4gMCkgewotICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+IG1ldGEgPSBpbXBsLT5nZXRGb3JtYXQoKTsKLSAgICAgICAgICAgIG1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7Ci0gICAgICAgICAgICBpbXBsLT5zZXRGb3JtYXQobWV0YSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlc3RpbWF0ZUR1cmF0aW9uc0Zyb21UaW1lc1VzQXRFbmQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEFMT0dJKCJoYXZlQXVkaW89JWQsIGhhdmVWaWRlbz0lZCwgZWxhc3BlZFRpbWU9JSIgUFJJZDY0LAotICAgICAgICAgICAgaGF2ZUF1ZGlvLCBoYXZlVmlkZW8sIEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWUpOwotfQotCi1zdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpmZWVkTW9yZShib29sIGlzSW5pdCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICB1aW50OF90IHBhY2tldFtrVFNQYWNrZXRTaXplXTsKLSAgICBzc2l6ZV90IG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG1PZmZzZXQsIHBhY2tldCwga1RTUGFja2V0U2l6ZSk7Ci0KLSAgICBpZiAobiA8IChzc2l6ZV90KWtUU1BhY2tldFNpemUpIHsKLSAgICAgICAgaWYgKG4gPj0gMCkgewotICAgICAgICAgICAgbVBhcnNlci0+c2lnbmFsRU9TKEVSUk9SX0VORF9PRl9TVFJFQU0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAobiA8IDApID8gKHN0YXR1c190KW4gOiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgIH0KLQotICAgIEFUU1BhcnNlcjo6U3luY0V2ZW50IGV2ZW50KG1PZmZzZXQpOwotICAgIG1PZmZzZXQgKz0gbjsKLSAgICBzdGF0dXNfdCBlcnIgPSBtUGFyc2VyLT5mZWVkVFNQYWNrZXQocGFja2V0LCBrVFNQYWNrZXRTaXplLCAmZXZlbnQpOwotICAgIGlmIChldmVudC5oYXNSZXR1cm5lZERhdGEoKSkgewotICAgICAgICBpZiAoaXNJbml0KSB7Ci0gICAgICAgICAgICBtTGFzdFN5bmNFdmVudCA9IGV2ZW50OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWRkU3luY1BvaW50X2woZXZlbnQpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXZvaWQgTVBFRzJUU0V4dHJhY3Rvcjo6YWRkU3luY1BvaW50X2woY29uc3QgQVRTUGFyc2VyOjpTeW5jRXZlbnQgJmV2ZW50KSB7Ci0gICAgaWYgKCFldmVudC5oYXNSZXR1cm5lZERhdGEoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU291cmNlSW1wbHMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgaWYgKG1Tb3VyY2VJbXBsc1tpXS5nZXQoKSA9PSBldmVudC5nZXRNZWRpYVNvdXJjZSgpLmdldCgpKSB7Ci0gICAgICAgICAgICBLZXllZFZlY3RvcjxpbnQ2NF90LCBvZmY2NF90PiAqc3luY1BvaW50cyA9ICZtU3luY1BvaW50cy5lZGl0SXRlbUF0KGkpOwotICAgICAgICAgICAgc3luY1BvaW50cy0+YWRkKGV2ZW50LmdldFRpbWVVcygpLCBldmVudC5nZXRPZmZzZXQoKSk7Ci0gICAgICAgICAgICAvLyBXZSdyZSBrZWVwaW5nIHRoZSBzaXplIG9mIHRoZSBzeW5jIHBvaW50cyBhdCBtb3N0IDVtYiBwZXIgYSB0cmFjay4KLSAgICAgICAgICAgIHNpemVfdCBzaXplID0gc3luY1BvaW50cy0+c2l6ZSgpOwotICAgICAgICAgICAgaWYgKHNpemUgPj0gMzI3NjgwKSB7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCBmaXJzdFRpbWVVcyA9IHN5bmNQb2ludHMtPmtleUF0KDApOwotICAgICAgICAgICAgICAgIGludDY0X3QgbGFzdFRpbWVVcyA9IHN5bmNQb2ludHMtPmtleUF0KHNpemUgLSAxKTsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0VGltZVVzKCkgLSBmaXJzdFRpbWVVcyA+IGxhc3RUaW1lVXMgLSBldmVudC5nZXRUaW1lVXMoKSkgewotICAgICAgICAgICAgICAgICAgICBzeW5jUG9pbnRzLT5yZW1vdmVJdGVtc0F0KDAsIDQwOTYpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNQb2ludHMtPnJlbW92ZUl0ZW1zQXQoc2l6ZSAtIDQwOTYsIDQwOTYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjplc3RpbWF0ZUR1cmF0aW9uc0Zyb21UaW1lc1VzQXRFbmQoKSAgewotICAgIGlmICghKG1EYXRhU291cmNlLT5mbGFncygpICYgRGF0YVNvdXJjZTo6a0lzTG9jYWxGaWxlU291cmNlKSkgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgb2ZmNjRfdCBzaXplID0gMDsKLSAgICBzdGF0dXNfdCBlcnIgPSBtRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHVpbnQ4X3QgcGFja2V0W2tUU1BhY2tldFNpemVdOwotICAgIGNvbnN0IG9mZjY0X3QgemVybyA9IDA7Ci0gICAgb2ZmNjRfdCBvZmZzZXQgPSBtYXgoemVybywgc2l6ZSAtIGtNYXhEdXJhdGlvblJlYWRTaXplKTsKLSAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsICZwYWNrZXQsIDApIDwgMCkgewotICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgfQotCi0gICAgaW50IHJldHJ5ID0gMDsKLSAgICBib29sIGFsbER1cmF0aW9uc0ZvdW5kID0gZmFsc2U7Ci0gICAgaW50NjRfdCB0aW1lQW5jaG9yVXMgPSBtUGFyc2VyLT5nZXRGaXJzdFBUU1RpbWVVcygpOwotICAgIGRvIHsKLSAgICAgICAgaW50IGJ5dGVzUmVhZCA9IDA7Ci0gICAgICAgIHNwPEFUU1BhcnNlcj4gcGFyc2VyID0gbmV3IEFUU1BhcnNlcihBVFNQYXJzZXI6OlRTX1RJTUVTVEFNUFNfQVJFX0FCU09MVVRFKTsKLSAgICAgICAgQVRTUGFyc2VyOjpTeW5jRXZlbnQgZXYoMCk7Ci0gICAgICAgIG9mZnNldCA9IG1heCh6ZXJvLCBzaXplIC0gKGtNYXhEdXJhdGlvblJlYWRTaXplIDw8IHJldHJ5KSk7Ci0gICAgICAgIG9mZnNldCA9IChvZmZzZXQgLyBrVFNQYWNrZXRTaXplKSAqIGtUU1BhY2tldFNpemU7Ci0gICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgIGlmIChieXRlc1JlYWQgPj0ga01heER1cmF0aW9uUmVhZFNpemUgPDwgbWF4KDAsIHJldHJ5IC0gMSkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3NpemVfdCBuID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIHBhY2tldCwga1RTUGFja2V0U2l6ZSk7Ci0gICAgICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobiA8IChzc2l6ZV90KWtUU1BhY2tldFNpemUpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb2Zmc2V0ICs9IGtUU1BhY2tldFNpemU7Ci0gICAgICAgICAgICBieXRlc1JlYWQgKz0ga1RTUGFja2V0U2l6ZTsKLSAgICAgICAgICAgIGVyciA9IHBhcnNlci0+ZmVlZFRTUGFja2V0KHBhY2tldCwga1RTUGFja2V0U2l6ZSwgJmV2KTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZXYuaGFzUmV0dXJuZWREYXRhKCkpIHsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSBldi5nZXRUaW1lVXMoKTsKLSAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OlNvdXJjZVR5cGUgdHlwZSA9IGV2LmdldFR5cGUoKTsKLSAgICAgICAgICAgICAgICBldi5yZXNldCgpOwotCi0gICAgICAgICAgICAgICAgaW50NjRfdCBmaXJzdFRpbWVVczsKLSAgICAgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzcmMgPQotICAgICAgICAgICAgICAgICAgICAoQW5vdGhlclBhY2tldFNvdXJjZSAqKW1QYXJzZXItPmdldFNvdXJjZSh0eXBlKS5nZXQoKTsKLSAgICAgICAgICAgICAgICBpZiAoc3JjID09IE5VTEwgfHwgc3JjLT5uZXh0QnVmZmVyVGltZSgmZmlyc3RUaW1lVXMpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkdXJhdGlvblVzICs9IHNyYy0+Z2V0RXN0aW1hdGVkQnVmZmVyRHVyYXRpb25VcygpOwotICAgICAgICAgICAgICAgIGR1cmF0aW9uVXMgLT0gdGltZUFuY2hvclVzOwotICAgICAgICAgICAgICAgIGR1cmF0aW9uVXMgLT0gZmlyc3RUaW1lVXM7Ci0gICAgICAgICAgICAgICAgaWYgKGR1cmF0aW9uVXMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludDY0X3Qgb3JpZ0R1cmF0aW9uVXMsIGxhc3REdXJhdGlvblVzOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gbWV0YSA9IHNyYy0+Z2V0Rm9ybWF0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGtLZXlMYXN0RHVyYXRpb24gPSAnbGR1cic7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFJlcXVpcmUgdHdvIGNvbnNlY3V0aXZlIGR1cmF0aW9uIGNhbGN1bGF0aW9ucyB0byBiZSB3aXRoaW4gMSBzZWMgYmVmb3JlCi0gICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0aW5nOyB1c2UgTWV0YURhdGEgdG8gc3RvcmUgcHJldmlvdXMgZHVyYXRpb24gZXN0aW1hdGUgaW4gcGVyLXN0cmVhbQotICAgICAgICAgICAgICAgICAgICAvLyBjb250ZXh0LgotICAgICAgICAgICAgICAgICAgICBpZiAoIW1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZvcmlnRHVyYXRpb25VcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhbWV0YS0+ZmluZEludDY0KGtLZXlMYXN0RHVyYXRpb24sICZsYXN0RHVyYXRpb25VcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAob3JpZ0R1cmF0aW9uVXMgPCBkdXJhdGlvblVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGFicyhkdXJhdGlvblVzIC0gbGFzdER1cmF0aW9uVXMpIDwgNjAwMDAwMDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDY0KGtLZXlMYXN0RHVyYXRpb24sIGR1cmF0aW9uVXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghYWxsRHVyYXRpb25zRm91bmQpIHsKLSAgICAgICAgICAgIGFsbER1cmF0aW9uc0ZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvciAoYXV0byB0OiB7QVRTUGFyc2VyOjpWSURFTywgQVRTUGFyc2VyOjpBVURJT30pIHsKLSAgICAgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzcmMgPSAoQW5vdGhlclBhY2tldFNvdXJjZSAqKW1QYXJzZXItPmdldFNvdXJjZSh0KS5nZXQoKTsKLSAgICAgICAgICAgICAgICBpZiAoc3JjID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICAgICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gbWV0YSA9IHNyYy0+Z2V0Rm9ybWF0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFtZXRhLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKLSAgICAgICAgICAgICAgICAgICAgYWxsRHVyYXRpb25zRm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgKytyZXRyeTsKLSAgICB9IHdoaWxlKCFhbGxEdXJhdGlvbnNGb3VuZCAmJiBvZmZzZXQgPiAwICYmIHJldHJ5IDw9IGtNYXhEdXJhdGlvblJldHJ5KTsKLQotICAgIHJldHVybiBhbGxEdXJhdGlvbnNGb3VuZD8gT0sgOiBFUlJPUl9VTlNVUFBPUlRFRDsKLX0KLQotdWludDMyX3QgTVBFRzJUU0V4dHJhY3Rvcjo6ZmxhZ3MoKSBjb25zdCB7Ci0gICAgcmV0dXJuIENBTl9QQVVTRSB8IENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRDsKLX0KLQotc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6c2VlayhpbnQ2NF90IHNlZWtUaW1lVXMsCi0gICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgJnNlZWtNb2RlKSB7Ci0gICAgaWYgKG1TZWVrU3luY1BvaW50cyA9PSBOVUxMIHx8IG1TZWVrU3luY1BvaW50cy0+aXNFbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dXKCJObyBzeW5jIHBvaW50IHRvIHNlZWsgdG8uIik7Ci0gICAgICAgIC8vIC4uLiBhbmQgdGhlcmVmb3JlIHdlIGhhdmUgbm90aGluZyB1c2VmdWwgdG8gZG8gaGVyZS4KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIC8vIERldGVybWluZSB3aGV0aGVyIHdlJ3JlIHNlZWtpbmcgYmV5b25kIHRoZSBrbm93biBhcmVhLgotICAgIGJvb2wgc2hvdWxkU2Vla0JleW9uZCA9Ci0gICAgICAgICAgICAoc2Vla1RpbWVVcyA+IG1TZWVrU3luY1BvaW50cy0+a2V5QXQobVNlZWtTeW5jUG9pbnRzLT5zaXplKCkgLSAxKSk7Ci0KLSAgICAvLyBEZXRlcm1pbmUgdGhlIHN5bmMgcG9pbnQgdG8gc2Vlay4KLSAgICBzaXplX3QgaW5kZXggPSAwOwotICAgIGZvciAoOyBpbmRleCA8IG1TZWVrU3luY1BvaW50cy0+c2l6ZSgpOyArK2luZGV4KSB7Ci0gICAgICAgIGludDY0X3QgdGltZVVzID0gbVNlZWtTeW5jUG9pbnRzLT5rZXlBdChpbmRleCk7Ci0gICAgICAgIGlmICh0aW1lVXMgPiBzZWVrVGltZVVzKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN3aXRjaCAoc2Vla01vZGUpIHsKLSAgICAgICAgY2FzZSBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfTkVYVF9TWU5DOgotICAgICAgICAgICAgaWYgKGluZGV4ID09IG1TZWVrU3luY1BvaW50cy0+c2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIk5leHQgc3luYyBub3QgZm91bmQ7IHN0YXJ0aW5nIGZyb20gdGhlIGxhdGVzdCBzeW5jLiIpOwotICAgICAgICAgICAgICAgIC0taW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DOgotICAgICAgICBjYXNlIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUOgotICAgICAgICAgICAgQUxPR1coInNlZWtNb2RlIG5vdCBzdXBwb3J0ZWQ6ICVkOyBmYWxsaW5nIGJhY2sgdG8gUFJFVklPVVNfU1lOQyIsCi0gICAgICAgICAgICAgICAgICAgIHNlZWtNb2RlKTsKLSAgICAgICAgICAgIC8vIGZhbGwtdGhyb3VnaAotICAgICAgICBjYXNlIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DOgotICAgICAgICAgICAgaWYgKGluZGV4ID09IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiUHJldmlvdXMgc3luYyBub3QgZm91bmQ7IHN0YXJ0aW5nIGZyb20gdGhlIGVhcmxpZXN0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJzeW5jLiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAtLWluZGV4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmICghc2hvdWxkU2Vla0JleW9uZCB8fCBtT2Zmc2V0IDw9IG1TZWVrU3luY1BvaW50cy0+dmFsdWVBdChpbmRleCkpIHsKLSAgICAgICAgaW50NjRfdCBhY3R1YWxTZWVrVGltZVVzID0gbVNlZWtTeW5jUG9pbnRzLT5rZXlBdChpbmRleCk7Ci0gICAgICAgIG1PZmZzZXQgPSBtU2Vla1N5bmNQb2ludHMtPnZhbHVlQXQoaW5kZXgpOwotICAgICAgICBzdGF0dXNfdCBlcnIgPSBxdWV1ZURpc2NvbnRpbnVpdHlGb3JTZWVrKGFjdHVhbFNlZWtUaW1lVXMpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHNob3VsZFNlZWtCZXlvbmQpIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gc2Vla0JleW9uZChzZWVrVGltZVVzKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEZhc3QtZm9yd2FyZCB0byBzeW5jIGZyYW1lLgotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNvdXJjZUltcGxzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsID0gbVNvdXJjZUltcGxzW2ldOwotICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgIGZlZWRVbnRpbEJ1ZmZlckF2YWlsYWJsZShpbXBsKTsKLSAgICAgICAgd2hpbGUgKGltcGwtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZXJyKSkgewotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1ldGEgPSBpbXBsLT5nZXRNZXRhQWZ0ZXJMYXN0RGVxdWV1ZWQoMCk7Ci0gICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7Ci0gICAgICAgICAgICBpZiAobWV0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQzMl90IHN5bmM7Ci0gICAgICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKCJpc1N5bmMiLCAmc3luYykgJiYgc3luYykgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXJyID0gaW1wbC0+ZGVxdWV1ZUFjY2Vzc1VuaXQoJmJ1ZmZlcik7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZlZWRVbnRpbEJ1ZmZlckF2YWlsYWJsZShpbXBsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6cXVldWVEaXNjb250aW51aXR5Rm9yU2VlayhpbnQ2NF90IGFjdHVhbFNlZWtUaW1lVXMpIHsKLSAgICAvLyBTaWduYWwgZGlzY29udGludWl0eQotICAgIHNwPEFNZXNzYWdlPiBleHRyYShuZXcgQU1lc3NhZ2UpOwotICAgIGV4dHJhLT5zZXRJbnQ2NChJU3RyZWFtTGlzdGVuZXI6OmtLZXlNZWRpYVRpbWVVcywgYWN0dWFsU2Vla1RpbWVVcyk7Ci0gICAgbVBhcnNlci0+c2lnbmFsRGlzY29udGludWl0eShBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfVElNRSwgZXh0cmEpOwotCi0gICAgLy8gQWZ0ZXIgZGlzY29udGludWl0eSwgaW1wbCBzaG91bGQgb25seSBoYXZlIGRpc2NvbnRpbnVpdGllcwotICAgIC8vIHdpdGggdGhlIGxhc3QgYmVpbmcgd2hhdCB3ZSBxdWV1ZWQuIERlcXVldWUgdGhlbSBhbGwgaGVyZS4KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Tb3VyY2VJbXBscy5zaXplKCk7ICsraSkgewotICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCA9IG1Tb3VyY2VJbXBscy5pdGVtQXQoaSk7Ci0gICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKLSAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICB3aGlsZSAoaW1wbC0+aGFzQnVmZmVyQXZhaWxhYmxlKCZlcnIpKSB7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVyciA9IGltcGwtPmRlcXVldWVBY2Nlc3NVbml0KCZidWZmZXIpOwotICAgICAgICAgICAgLy8gSWYgdGhlIHNvdXJjZSBjb250YWlucyBhbnl0aGluZyBidXQgZGlzY29udGludWl0eSwgdGhhdCdzCi0gICAgICAgICAgICAvLyBhIHByb2dyYW1taW5nIG1pc3Rha2UuCi0gICAgICAgICAgICBDSEVDSyhlcnIgPT0gSU5GT19ESVNDT05USU5VSVRZKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEZlZWQgdW50aWwgd2UgaGF2ZSBhIGJ1ZmZlciBmb3IgZWFjaCBzb3VyY2UuCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU291cmNlSW1wbHMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwgPSBtU291cmNlSW1wbHMuaXRlbUF0KGkpOwotICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IGZlZWRVbnRpbEJ1ZmZlckF2YWlsYWJsZShpbXBsKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6c2Vla0JleW9uZChpbnQ2NF90IHNlZWtUaW1lVXMpIHsKLSAgICAvLyBJZiB3ZSdyZSBzZWVraW5nIGJleW9uZCB3aGVyZSB3ZSBrbm93IC0tLSByZWFkIHVudGlsIHdlIHJlYWNoIHRoZXJlLgotICAgIHNpemVfdCBzeW5jUG9pbnRzU2l6ZSA9IG1TZWVrU3luY1BvaW50cy0+c2l6ZSgpOwotCi0gICAgd2hpbGUgKHNlZWtUaW1lVXMgPiBtU2Vla1N5bmNQb2ludHMtPmtleUF0KAotICAgICAgICAgICAgbVNlZWtTeW5jUG9pbnRzLT5zaXplKCkgLSAxKSkgewotICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgIGlmIChzeW5jUG9pbnRzU2l6ZSA8IG1TZWVrU3luY1BvaW50cy0+c2l6ZSgpKSB7Ci0gICAgICAgICAgICBzeW5jUG9pbnRzU2l6ZSA9IG1TZWVrU3luY1BvaW50cy0+c2l6ZSgpOwotICAgICAgICAgICAgaW50NjRfdCBzeW5jVGltZVVzID0gbVNlZWtTeW5jUG9pbnRzLT5rZXlBdChzeW5jUG9pbnRzU2l6ZSAtIDEpOwotICAgICAgICAgICAgLy8gRGVxdWV1ZSBidWZmZXJzIGJlZm9yZSBzeW5jIHBvaW50IGluIG9yZGVyIHRvIGF2b2lkIHRvbyBtdWNoCi0gICAgICAgICAgICAvLyBjYWNoZSBidWlsZGluZyB1cC4KLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNvdXJjZUltcGxzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwgPSBtU291cmNlSW1wbHNbaV07Ci0gICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKChlcnIgPSBpbXBsLT5uZXh0QnVmZmVyVGltZSgmdGltZVVzKSkgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVVcyA8IHN5bmNUaW1lVXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGwtPmRlcXVldWVBY2Nlc3NVbml0KCZidWZmZXIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSyAmJiBlcnIgIT0gLUVXT1VMREJMT0NLKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChmZWVkTW9yZSgpICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6ZmVlZFVudGlsQnVmZmVyQXZhaWxhYmxlKAotICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCkgewotICAgIHN0YXR1c190IGZpbmFsUmVzdWx0OwotICAgIHdoaWxlICghaW1wbC0+aGFzQnVmZmVyQXZhaWxhYmxlKCZmaW5hbFJlc3VsdCkpIHsKLSAgICAgICAgaWYgKGZpbmFsUmVzdWx0ICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmluYWxSZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0dXNfdCBlcnIgPSBmZWVkTW9yZSgpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBpbXBsLT5zaWduYWxFT1MoZXJyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLWJvb2wgU25pZmZNUEVHMlRTKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsCi0gICAgICAgIHNwPEFNZXNzYWdlPiAqKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKLSAgICAgICAgY2hhciBoZWFkZXI7Ci0gICAgICAgIGlmIChzb3VyY2UtPnJlYWRBdChrVFNQYWNrZXRTaXplICogaSwgJmhlYWRlciwgMSkgIT0gMQotICAgICAgICAgICAgICAgIHx8IGhlYWRlciAhPSAweDQ3KSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAqY29uZmlkZW5jZSA9IDAuMWY7Ci0gICAgbWltZVR5cGUtPnNldFRvKE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlRTKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXguY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXguY3BwCmluZGV4IGZlNTA2NTYuLjRlMmQzOTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teC5jcHAKQEAgLTI0LDcgKzI0LDcgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PbXhHcmFwaGljQnVmZmVyU291cmNlLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhOb2RlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XT214T2JzZXJ2ZXIuaD4KQEAgLTE0OCw3ICsxNDgsNyBAQAogUmV0dXJuPHZvaWQ+IE9teDo6Y3JlYXRlSW5wdXRTdXJmYWNlKGNyZWF0ZUlucHV0U3VyZmFjZV9jYiBfaGlkbF9jYikgewogICAgIHNwPDo6YW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gYnVmZmVyUHJvZHVjZXI7CiAKLSAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBncmFwaGljQnVmZmVyU291cmNlID0gbmV3IEdyYXBoaWNCdWZmZXJTb3VyY2UoKTsKKyAgICBzcDxPbXhHcmFwaGljQnVmZmVyU291cmNlPiBncmFwaGljQnVmZmVyU291cmNlID0gbmV3IE9teEdyYXBoaWNCdWZmZXJTb3VyY2UoKTsKICAgICBzdGF0dXNfdCBlcnIgPSBncmFwaGljQnVmZmVyU291cmNlLT5pbml0Q2hlY2soKTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBjcmVhdGUgcGVyc2lzdGVudCBpbnB1dCBzdXJmYWNlOiAiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ0OTlkYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIldHcmFwaGljQnVmZmVyUHJvZHVjZXItaW1wbCIKLQotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dQcm9kdWNlckxpc3RlbmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9Db252ZXJzaW9uLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgaGFyZHdhcmUgewotbmFtZXNwYWNlIG1lZGlhIHsKLW5hbWVzcGFjZSBvbXggewotbmFtZXNwYWNlIFYxXzAgewotbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKLQotLy8gVFdHcmFwaGljQnVmZmVyUHJvZHVjZXIKLVRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcigKLSAgICAgICAgc3A8QkdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gY29uc3QmIGJhc2UpOgotICAgIG1CYXNlKGJhc2UpIHsKLX0KLQotUmV0dXJuPHZvaWQ+IFRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpyZXF1ZXN0QnVmZmVyKAotICAgICAgICBpbnQzMl90IHNsb3QsIHJlcXVlc3RCdWZmZXJfY2IgX2hpZGxfY2IpIHsKLSAgICBzcDxHcmFwaGljQnVmZmVyPiBidWY7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbUJhc2UtPnJlcXVlc3RCdWZmZXIoc2xvdCwgJmJ1Zik7Ci0gICAgQW53QnVmZmVyIGFud0J1ZmZlcjsKLSAgICBpZiAoYnVmICE9IG51bGxwdHIpIHsKLSAgICAgICAgd3JhcEFzKCZhbndCdWZmZXIsICpidWYpOwotICAgIH0KLSAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLCBhbndCdWZmZXIpOwotICAgIHJldHVybiBWb2lkKCk7Ci19Ci0KLVJldHVybjxpbnQzMl90PiBUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6c2V0TWF4RGVxdWV1ZWRCdWZmZXJDb3VudCgKLSAgICAgICAgaW50MzJfdCBtYXhEZXF1ZXVlZEJ1ZmZlcnMpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUJhc2UtPnNldE1heERlcXVldWVkQnVmZmVyQ291bnQoCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KG1heERlcXVldWVkQnVmZmVycykpKTsKLX0KLQotUmV0dXJuPGludDMyX3Q+IFRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpzZXRBc3luY01vZGUoYm9vbCBhc3luYykgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtQmFzZS0+c2V0QXN5bmNNb2RlKGFzeW5jKSk7Ci19Ci0KLVJldHVybjx2b2lkPiBUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6ZGVxdWV1ZUJ1ZmZlcigKLSAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKLSAgICAgICAgUGl4ZWxGb3JtYXQgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSwKLSAgICAgICAgYm9vbCBnZXRGcmFtZVRpbWVzdGFtcHMsIGRlcXVldWVCdWZmZXJfY2IgX2hpZGxfY2IpIHsKLSAgICBpbnQgc2xvdDsKLSAgICBzcDxGZW5jZT4gZmVuY2U7Ci0gICAgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIG91dFRpbWVzdGFtcHM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbUJhc2UtPmRlcXVldWVCdWZmZXIoCi0gICAgICAgICZzbG90LCAmZmVuY2UsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgIHN0YXRpY19jYXN0PDo6YW5kcm9pZDo6UGl4ZWxGb3JtYXQ+KGZvcm1hdCksIHVzYWdlLCBudWxscHRyLAotICAgICAgICBnZXRGcmFtZVRpbWVzdGFtcHMgPyAmb3V0VGltZXN0YW1wcyA6IG51bGxwdHIpOwotICAgIGhpZGxfaGFuZGxlIHRGZW5jZTsKLSAgICBGcmFtZUV2ZW50SGlzdG9yeURlbHRhIHRPdXRUaW1lc3RhbXBzOwotCi0gICAgbmF0aXZlX2hhbmRsZV90KiBuaCA9IG51bGxwdHI7Ci0gICAgaWYgKChmZW5jZSA9PSBudWxscHRyKSB8fCAhd3JhcEFzKCZ0RmVuY2UsICZuaCwgKmZlbmNlKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6ZGVxdWV1ZUJ1ZmZlciAtICIKLSAgICAgICAgICAgICAgICAiSW52YWxpZCBvdXRwdXQgZmVuY2UiOwotICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLAotICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihzbG90KSwKLSAgICAgICAgICAgICAgICAgdEZlbmNlLAotICAgICAgICAgICAgICAgICB0T3V0VGltZXN0YW1wcyk7Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+ID4gbmhBQTsKLSAgICBpZiAoZ2V0RnJhbWVUaW1lc3RhbXBzICYmICF3cmFwQXMoJnRPdXRUaW1lc3RhbXBzLCAmbmhBQSwgb3V0VGltZXN0YW1wcykpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmRlcXVldWVCdWZmZXIgLSAiCi0gICAgICAgICAgICAgICAgIkludmFsaWQgb3V0cHV0IHRpbWVzdGFtcHMiOwotICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLAotICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihzbG90KSwKLSAgICAgICAgICAgICAgICAgdEZlbmNlLAotICAgICAgICAgICAgICAgICB0T3V0VGltZXN0YW1wcyk7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oc2xvdCksCi0gICAgICAgICAgICB0RmVuY2UsCi0gICAgICAgICAgICB0T3V0VGltZXN0YW1wcyk7Ci0gICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOwotICAgIGlmIChnZXRGcmFtZVRpbWVzdGFtcHMpIHsKLSAgICAgICAgZm9yIChhdXRvJiBuaEEgOiBuaEFBKSB7Ci0gICAgICAgICAgICBmb3IgKGF1dG8mIGhhbmRsZSA6IG5oQSkgewotICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFZvaWQoKTsKLX0KLQotUmV0dXJuPGludDMyX3Q+IFRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpkZXRhY2hCdWZmZXIoaW50MzJfdCBzbG90KSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1CYXNlLT5kZXRhY2hCdWZmZXIoc2xvdCkpOwotfQotCi1SZXR1cm48dm9pZD4gVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmRldGFjaE5leHRCdWZmZXIoCi0gICAgICAgIGRldGFjaE5leHRCdWZmZXJfY2IgX2hpZGxfY2IpIHsKLSAgICBzcDxHcmFwaGljQnVmZmVyPiBvdXRCdWZmZXI7Ci0gICAgc3A8RmVuY2U+IG91dEZlbmNlOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1CYXNlLT5kZXRhY2hOZXh0QnVmZmVyKCZvdXRCdWZmZXIsICZvdXRGZW5jZSk7Ci0gICAgQW53QnVmZmVyIHRCdWZmZXI7Ci0gICAgaGlkbF9oYW5kbGUgdEZlbmNlOwotCi0gICAgaWYgKG91dEJ1ZmZlciA9PSBudWxscHRyKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpkZXRhY2hOZXh0QnVmZmVyIC0gIgotICAgICAgICAgICAgICAgICJJbnZhbGlkIG91dHB1dCBidWZmZXIiOwotICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLCB0QnVmZmVyLCB0RmVuY2UpOwotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLSAgICB3cmFwQXMoJnRCdWZmZXIsICpvdXRCdWZmZXIpOwotICAgIG5hdGl2ZV9oYW5kbGVfdCogbmggPSBudWxscHRyOwotICAgIGlmICgob3V0RmVuY2UgIT0gbnVsbHB0cikgJiYgIXdyYXBBcygmdEZlbmNlLCAmbmgsICpvdXRGZW5jZSkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmRldGFjaE5leHRCdWZmZXIgLSAiCi0gICAgICAgICAgICAgICAgIkludmFsaWQgb3V0cHV0IGZlbmNlIjsKLSAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwgdEJ1ZmZlciwgdEZlbmNlKTsKLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLCB0QnVmZmVyLCB0RmVuY2UpOwotICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKLSAgICByZXR1cm4gVm9pZCgpOwotfQotCi1SZXR1cm48dm9pZD4gVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmF0dGFjaEJ1ZmZlcigKLSAgICAgICAgY29uc3QgQW53QnVmZmVyJiBidWZmZXIsCi0gICAgICAgIGF0dGFjaEJ1ZmZlcl9jYiBfaGlkbF9jYikgewotICAgIGludCBvdXRTbG90OwotICAgIHNwPEdyYXBoaWNCdWZmZXI+IGxCdWZmZXIgPSBuZXcgR3JhcGhpY0J1ZmZlcigpOwotICAgIGlmICghY29udmVydFRvKGxCdWZmZXIuZ2V0KCksIGJ1ZmZlcikpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmF0dGFjaEJ1ZmZlciAtICIKLSAgICAgICAgICAgICAgICAiSW52YWxpZCBpbnB1dCBuYXRpdmUgd2luZG93IGJ1ZmZlciI7Ci0gICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KEJBRF9WQUxVRSksIC0xKTsKLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbUJhc2UtPmF0dGFjaEJ1ZmZlcigmb3V0U2xvdCwgbEJ1ZmZlcik7Ci0KLSAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLCBzdGF0aWNfY2FzdDxpbnQzMl90PihvdXRTbG90KSk7Ci0gICAgcmV0dXJuIFZvaWQoKTsKLX0KLQotUmV0dXJuPHZvaWQ+IFRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpxdWV1ZUJ1ZmZlcigKLSAgICAgICAgaW50MzJfdCBzbG90LCBjb25zdCBRdWV1ZUJ1ZmZlcklucHV0JiBpbnB1dCwKLSAgICAgICAgcXVldWVCdWZmZXJfY2IgX2hpZGxfY2IpIHsKLSAgICBRdWV1ZUJ1ZmZlck91dHB1dCB0T3V0cHV0OwotICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgbElucHV0KAotICAgICAgICAgICAgMCwgZmFsc2UsIEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiwKLSAgICAgICAgICAgIDo6YW5kcm9pZDo6UmVjdCgwLCAwLCAxLCAxKSwKLSAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX0ZSRUVaRSwKLSAgICAgICAgICAgIDAsIDo6YW5kcm9pZDo6RmVuY2U6Ok5PX0ZFTkNFKTsKLSAgICBpZiAoIWNvbnZlcnRUbygmbElucHV0LCBpbnB1dCkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OnF1ZXVlQnVmZmVyIC0gIgotICAgICAgICAgICAgICAgICJJbnZhbGlkIGlucHV0IjsKLSAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oQkFEX1ZBTFVFKSwgdE91dHB1dCk7Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IGxPdXRwdXQ7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbUJhc2UtPnF1ZXVlQnVmZmVyKAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzbG90KSwgbElucHV0LCAmbE91dHB1dCk7Ci0KLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiA+IG5oQUE7Ci0gICAgaWYgKCF3cmFwQXMoJnRPdXRwdXQsICZuaEFBLCBsT3V0cHV0KSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6cXVldWVCdWZmZXIgLSAiCi0gICAgICAgICAgICAgICAgIkludmFsaWQgb3V0cHV0IjsKLSAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oQkFEX1ZBTFVFKSwgdE91dHB1dCk7Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwgdE91dHB1dCk7Ci0gICAgZm9yIChhdXRvJiBuaEEgOiBuaEFBKSB7Ci0gICAgICAgIGZvciAoYXV0byYgbmggOiBuaEEpIHsKLSAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVm9pZCgpOwotfQotCi1SZXR1cm48aW50MzJfdD4gVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmNhbmNlbEJ1ZmZlcigKLSAgICAgICAgaW50MzJfdCBzbG90LCBjb25zdCBoaWRsX2hhbmRsZSYgZmVuY2UpIHsKLSAgICBzcDxGZW5jZT4gbEZlbmNlID0gbmV3IEZlbmNlKCk7Ci0gICAgaWYgKCFjb252ZXJ0VG8obEZlbmNlLmdldCgpLCBmZW5jZSkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmNhbmNlbEJ1ZmZlciAtICIKLSAgICAgICAgICAgICAgICAiSW52YWxpZCBpbnB1dCBmZW5jZSI7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihCQURfVkFMVUUpOwotICAgIH0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUJhc2UtPmNhbmNlbEJ1ZmZlcihzdGF0aWNfY2FzdDxpbnQ+KHNsb3QpLCBsRmVuY2UpKTsKLX0KLQotUmV0dXJuPHZvaWQ+IFRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpxdWVyeShpbnQzMl90IHdoYXQsIHF1ZXJ5X2NiIF9oaWRsX2NiKSB7Ci0gICAgaW50IGxWYWx1ZTsKLSAgICBpbnQgbFJldHVybiA9IG1CYXNlLT5xdWVyeShzdGF0aWNfY2FzdDxpbnQ+KHdoYXQpLCAmbFZhbHVlKTsKLSAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihsUmV0dXJuKSwgc3RhdGljX2Nhc3Q8aW50MzJfdD4obFZhbHVlKSk7Ci0gICAgcmV0dXJuIFZvaWQoKTsKLX0KLQotUmV0dXJuPHZvaWQ+IFRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpjb25uZWN0KAotICAgICAgICBjb25zdCBzcDxIUHJvZHVjZXJMaXN0ZW5lcj4mIGxpc3RlbmVyLAotICAgICAgICBpbnQzMl90IGFwaSwgYm9vbCBwcm9kdWNlckNvbnRyb2xsZWRCeUFwcCwgY29ubmVjdF9jYiBfaGlkbF9jYikgewotICAgIHNwPEJQcm9kdWNlckxpc3RlbmVyPiBsTGlzdGVuZXIgPSBsaXN0ZW5lciA9PSBudWxscHRyID8KLSAgICAgICAgICAgIG51bGxwdHIgOiBuZXcgTFdQcm9kdWNlckxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCBsT3V0cHV0OwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1CYXNlLT5jb25uZWN0KGxMaXN0ZW5lciwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oYXBpKSwKLSAgICAgICAgICAgIHByb2R1Y2VyQ29udHJvbGxlZEJ5QXBwLAotICAgICAgICAgICAgJmxPdXRwdXQpOwotCi0gICAgUXVldWVCdWZmZXJPdXRwdXQgdE91dHB1dDsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiA+IG5oQUE7Ci0gICAgaWYgKCF3cmFwQXMoJnRPdXRwdXQsICZuaEFBLCBsT3V0cHV0KSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6Y29ubmVjdCAtICIKLSAgICAgICAgICAgICAgICAiSW52YWxpZCBvdXRwdXQiOwotICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLCB0T3V0cHV0KTsKLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLCB0T3V0cHV0KTsKLSAgICBmb3IgKGF1dG8mIG5oQSA6IG5oQUEpIHsKLSAgICAgICAgZm9yIChhdXRvJiBuaCA6IG5oQSkgewotICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBWb2lkKCk7Ci19Ci0KLVJldHVybjxpbnQzMl90PiBUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6ZGlzY29ubmVjdCgKLSAgICAgICAgaW50MzJfdCBhcGksIERpc2Nvbm5lY3RNb2RlIG1vZGUpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUJhc2UtPmRpc2Nvbm5lY3QoCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGFwaSksCi0gICAgICAgICAgICB0b0d1aURpc2Nvbm5lY3RNb2RlKG1vZGUpKSk7Ci19Ci0KLVJldHVybjxpbnQzMl90PiBUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6c2V0U2lkZWJhbmRTdHJlYW0oY29uc3QgaGlkbF9oYW5kbGUmIHN0cmVhbSkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtQmFzZS0+c2V0U2lkZWJhbmRTdHJlYW0oTmF0aXZlSGFuZGxlOjpjcmVhdGUoCi0gICAgICAgICAgICBzdHJlYW0gPyBuYXRpdmVfaGFuZGxlX2Nsb25lKHN0cmVhbSkgOiBOVUxMLCB0cnVlKSkpOwotfQotCi1SZXR1cm48dm9pZD4gVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmFsbG9jYXRlQnVmZmVycygKLSAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgUGl4ZWxGb3JtYXQgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSkgewotICAgIG1CYXNlLT5hbGxvY2F0ZUJ1ZmZlcnMoCi0gICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8OjphbmRyb2lkOjpQaXhlbEZvcm1hdD4oZm9ybWF0KSwKLSAgICAgICAgICAgIHVzYWdlKTsKLSAgICByZXR1cm4gVm9pZCgpOwotfQotCi1SZXR1cm48aW50MzJfdD4gVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmFsbG93QWxsb2NhdGlvbihib29sIGFsbG93KSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1CYXNlLT5hbGxvd0FsbG9jYXRpb24oYWxsb3cpKTsKLX0KLQotUmV0dXJuPGludDMyX3Q+IFRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpzZXRHZW5lcmF0aW9uTnVtYmVyKHVpbnQzMl90IGdlbmVyYXRpb25OdW1iZXIpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUJhc2UtPnNldEdlbmVyYXRpb25OdW1iZXIoZ2VuZXJhdGlvbk51bWJlcikpOwotfQotCi1SZXR1cm48dm9pZD4gVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmdldENvbnN1bWVyTmFtZShnZXRDb25zdW1lck5hbWVfY2IgX2hpZGxfY2IpIHsKLSAgICBfaGlkbF9jYihtQmFzZS0+Z2V0Q29uc3VtZXJOYW1lKCkuc3RyaW5nKCkpOwotICAgIHJldHVybiBWb2lkKCk7Ci19Ci0KLVJldHVybjxpbnQzMl90PiBUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6c2V0U2hhcmVkQnVmZmVyTW9kZShib29sIHNoYXJlZEJ1ZmZlck1vZGUpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUJhc2UtPnNldFNoYXJlZEJ1ZmZlck1vZGUoc2hhcmVkQnVmZmVyTW9kZSkpOwotfQotCi1SZXR1cm48aW50MzJfdD4gVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OnNldEF1dG9SZWZyZXNoKGJvb2wgYXV0b1JlZnJlc2gpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUJhc2UtPnNldEF1dG9SZWZyZXNoKGF1dG9SZWZyZXNoKSk7Ci19Ci0KLVJldHVybjxpbnQzMl90PiBUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6c2V0RGVxdWV1ZVRpbWVvdXQoaW50NjRfdCB0aW1lb3V0TnMpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUJhc2UtPnNldERlcXVldWVUaW1lb3V0KHRpbWVvdXROcykpOwotfQotCi1SZXR1cm48dm9pZD4gVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmdldExhc3RRdWV1ZWRCdWZmZXIoCi0gICAgICAgIGdldExhc3RRdWV1ZWRCdWZmZXJfY2IgX2hpZGxfY2IpIHsKLSAgICBzcDxHcmFwaGljQnVmZmVyPiBsT3V0QnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKLSAgICBzcDxGZW5jZT4gbE91dEZlbmNlID0gbmV3IEZlbmNlKCk7Ci0gICAgZmxvYXQgbE91dFRyYW5zZm9ybU1hdHJpeFsxNl07Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbUJhc2UtPmdldExhc3RRdWV1ZWRCdWZmZXIoCi0gICAgICAgICAgICAmbE91dEJ1ZmZlciwgJmxPdXRGZW5jZSwgbE91dFRyYW5zZm9ybU1hdHJpeCk7Ci0KLSAgICBBbndCdWZmZXIgdE91dEJ1ZmZlcjsKLSAgICBpZiAobE91dEJ1ZmZlciAhPSBudWxscHRyKSB7Ci0gICAgICAgIHdyYXBBcygmdE91dEJ1ZmZlciwgKmxPdXRCdWZmZXIpOwotICAgIH0KLSAgICBoaWRsX2hhbmRsZSB0T3V0RmVuY2U7Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBuaCA9IG51bGxwdHI7Ci0gICAgaWYgKChsT3V0RmVuY2UgPT0gbnVsbHB0cikgfHwgIXdyYXBBcygmdE91dEZlbmNlLCAmbmgsICpsT3V0RmVuY2UpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpnZXRMYXN0UXVldWVkQnVmZmVyIC0gIgotICAgICAgICAgICAgICAgICJJbnZhbGlkIG91dHB1dCBmZW5jZSI7Ci0gICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksCi0gICAgICAgICAgICAgICAgdE91dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICB0T3V0RmVuY2UsCi0gICAgICAgICAgICAgICAgaGlkbF9hcnJheTxmbG9hdCwgMTY+KCkpOwotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLSAgICBoaWRsX2FycmF5PGZsb2F0LCAxNj4gdE91dFRyYW5zZm9ybU1hdHJpeChsT3V0VHJhbnNmb3JtTWF0cml4KTsKLQotICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksIHRPdXRCdWZmZXIsIHRPdXRGZW5jZSwgdE91dFRyYW5zZm9ybU1hdHJpeCk7Ci0gICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOwotICAgIHJldHVybiBWb2lkKCk7Ci19Ci0KLVJldHVybjx2b2lkPiBUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6Z2V0RnJhbWVUaW1lc3RhbXBzKAotICAgICAgICBnZXRGcmFtZVRpbWVzdGFtcHNfY2IgX2hpZGxfY2IpIHsKLSAgICA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEgbERlbHRhOwotICAgIG1CYXNlLT5nZXRGcmFtZVRpbWVzdGFtcHMoJmxEZWx0YSk7Ci0KLSAgICBGcmFtZUV2ZW50SGlzdG9yeURlbHRhIHREZWx0YTsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiA+IG5oQUE7Ci0gICAgaWYgKCF3cmFwQXMoJnREZWx0YSwgJm5oQUEsIGxEZWx0YSkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmdldEZyYW1lVGltZXN0YW1wcyAtICIKLSAgICAgICAgICAgICAgICAiSW52YWxpZCBvdXRwdXQgZnJhbWUgdGltZXN0YW1wcyI7Ci0gICAgICAgIF9oaWRsX2NiKHREZWx0YSk7Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gICAgX2hpZGxfY2IodERlbHRhKTsKLSAgICBmb3IgKGF1dG8mIG5oQSA6IG5oQUEpIHsKLSAgICAgICAgZm9yIChhdXRvJiBuaCA6IG5oQSkgewotICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBWb2lkKCk7Ci19Ci0KLVJldHVybjx2b2lkPiBUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6Z2V0VW5pcXVlSWQoZ2V0VW5pcXVlSWRfY2IgX2hpZGxfY2IpIHsKLSAgICB1aW50NjRfdCBvdXRJZDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQmFzZS0+Z2V0VW5pcXVlSWQoJm91dElkKTsKLSAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLCBvdXRJZCk7Ci0gICAgcmV0dXJuIFZvaWQoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCi19ICAvLyBuYW1lc3BhY2UgVjFfMAotfSAgLy8gbmFtZXNwYWNlIG9teAotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi19ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCmluZGV4IDMyMDFjMzIuLmVkMjcyYmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCkBAIC03OSw5ICs3OSw5IEBACiB9OwogCiBzdHJ1Y3QgVFdHcmFwaGljQnVmZmVyU291cmNlOjpUV09teEJ1ZmZlclNvdXJjZSA6IHB1YmxpYyBJT214QnVmZmVyU291cmNlIHsKLSAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBtU291cmNlOworICAgIHNwPE9teEdyYXBoaWNCdWZmZXJTb3VyY2U+IG1Tb3VyY2U7CiAKLSAgICBUV09teEJ1ZmZlclNvdXJjZShjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiAmc291cmNlKTogbVNvdXJjZShzb3VyY2UpIHsKKyAgICBUV09teEJ1ZmZlclNvdXJjZShjb25zdCBzcDxPbXhHcmFwaGljQnVmZmVyU291cmNlPiAmc291cmNlKTogbVNvdXJjZShzb3VyY2UpIHsKICAgICB9CiAKICAgICBSZXR1cm48dm9pZD4gb25PbXhFeGVjdXRpbmcoKSBvdmVycmlkZSB7CkBAIC0xMTUsNyArMTE1LDcgQEAKIAogLy8gVFdHcmFwaGljQnVmZmVyU291cmNlCiBUV0dyYXBoaWNCdWZmZXJTb3VyY2U6OlRXR3JhcGhpY0J1ZmZlclNvdXJjZSgKLSAgICAgICAgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gY29uc3QmIGJhc2UpIDoKKyAgICAgICAgc3A8T214R3JhcGhpY0J1ZmZlclNvdXJjZT4gY29uc3QmIGJhc2UpIDoKICAgICBtQmFzZShiYXNlKSwKICAgICBtT214QnVmZmVyU291cmNlKG5ldyBUV09teEJ1ZmZlclNvdXJjZShiYXNlKSkgewogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9XUHJvZHVjZXJMaXN0ZW5lci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dQcm9kdWNlckxpc3RlbmVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRjM2FhMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dQcm9kdWNlckxpc3RlbmVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XUHJvZHVjZXJMaXN0ZW5lci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgaGFyZHdhcmUgewotbmFtZXNwYWNlIG1lZGlhIHsKLW5hbWVzcGFjZSBvbXggewotbmFtZXNwYWNlIFYxXzAgewotbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKLQotLy8gVFdQcm9kdWNlckxpc3RlbmVyCi1UV1Byb2R1Y2VyTGlzdGVuZXI6OlRXUHJvZHVjZXJMaXN0ZW5lcigKLSAgICAgICAgc3A8QlByb2R1Y2VyTGlzdGVuZXI+IGNvbnN0JiBiYXNlKToKLSAgICBtQmFzZShiYXNlKSB7Ci19Ci0KLVJldHVybjx2b2lkPiBUV1Byb2R1Y2VyTGlzdGVuZXI6Om9uQnVmZmVyUmVsZWFzZWQoKSB7Ci0gICAgbUJhc2UtPm9uQnVmZmVyUmVsZWFzZWQoKTsKLSAgICByZXR1cm4gVm9pZCgpOwotfQotCi1SZXR1cm48Ym9vbD4gVFdQcm9kdWNlckxpc3RlbmVyOjpuZWVkc1JlbGVhc2VOb3RpZnkoKSB7Ci0gICAgcmV0dXJuIG1CYXNlLT5uZWVkc1JlbGVhc2VOb3RpZnkoKTsKLX0KLQotLy8gTFdQcm9kdWNlckxpc3RlbmVyCi1MV1Byb2R1Y2VyTGlzdGVuZXI6OkxXUHJvZHVjZXJMaXN0ZW5lcigKLSAgICAgICAgc3A8SFByb2R1Y2VyTGlzdGVuZXI+IGNvbnN0JiBiYXNlKToKLSAgICBtQmFzZShiYXNlKSB7Ci19Ci0KLXZvaWQgTFdQcm9kdWNlckxpc3RlbmVyOjpvbkJ1ZmZlclJlbGVhc2VkKCkgewotICAgIG1CYXNlLT5vbkJ1ZmZlclJlbGVhc2VkKCk7Ci19Ci0KLWJvb2wgTFdQcm9kdWNlckxpc3RlbmVyOjpuZWVkc1JlbGVhc2VOb3RpZnkoKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KG1CYXNlLT5uZWVkc1JlbGVhc2VOb3RpZnkoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgotfSAgLy8gbmFtZXNwYWNlIFYxXzAKLX0gIC8vIG5hbWVzcGFjZSBvbXgKLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5icAppbmRleCBkNGNkZjY5Li4zZTY5NDJiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5icApAQCAtNiwxNCArNiwxMSBAQAogICAgIH0sCiAKICAgICBzcmNzOiBbCi0gICAgICAgICJGcmFtZURyb3BwZXIuY3BwIiwKLSAgICAgICAgIkdyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIiwKICAgICAgICAgIkJXR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAiLAotICAgICAgICAiT01YLmNwcCIsCi0gICAgICAgICJPTVhTdG9yZS5jcHAiLAogICAgICAgICAiT01YTWFzdGVyLmNwcCIsCiAgICAgICAgICJPTVhOb2RlSW5zdGFuY2UuY3BwIiwKICAgICAgICAgIk9NWFV0aWxzLmNwcCIsCisgICAgICAgICJPbXhHcmFwaGljQnVmZmVyU291cmNlLmNwcCIsCiAgICAgICAgICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcCIsCiAgICAgICAgICJTb2Z0T01YQ29tcG9uZW50LmNwcCIsCiAgICAgICAgICJTb2Z0T01YUGx1Z2luLmNwcCIsCkBAIC0yMSw4ICsxOCw2IEBACiAgICAgICAgICJTb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmNwcCIsCiAgICAgICAgICIxLjAvT214LmNwcCIsCiAgICAgICAgICIxLjAvT214U3RvcmUuY3BwIiwKLSAgICAgICAgIjEuMC9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmNwcCIsCi0gICAgICAgICIxLjAvV1Byb2R1Y2VyTGlzdGVuZXIuY3BwIiwKICAgICAgICAgIjEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAiLAogICAgICAgICAiMS4wL1dPbXhOb2RlLmNwcCIsCiAgICAgICAgICIxLjAvV09teE9ic2VydmVyLmNwcCIsCkBAIC01MSwyNSArNDYsMjMgQEAKICAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZV9oZWxwZXIiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIiwKICAgICAgICAgImxpYmRsIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCiAgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLCAvLyBUT0RPKGIvNjI5MjM0NzkpOiB1c2UgaGVhZGVyIGxpYnJhcnkKLSAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKLSAgICAgICAgImFuZHJvaWQuaGlkbC50b2tlbkAxLjAtdXRpbHMiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYUAxLjAiLAorICAgICAgICAibGlidm5ka3N1cHBvcnQiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuY29tbW9uQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKLSAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKICAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlciIsCisgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpAQCAtMTA5LDYgKzEwMiw3IEBACiAgICAgXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlibG9nIiwKICAgICBdLAogICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKQEAgLTEyNCw2ICsxMTgsNyBAQAogICAgICAgICAgICAgY2ZpOiB0cnVlLAogICAgICAgICB9LAogICAgIH0sCisgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKIH0KIAogLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQldHcmFwaGljQnVmZmVyU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9CV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCmluZGV4IDk0ZWY1OTguLmZhMzBhNDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9CV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9CV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCkBAIC01NSw5ICs1NSw5IEBACiB9OwogCiBzdHJ1Y3QgQldHcmFwaGljQnVmZmVyU291cmNlOjpCV09NWEJ1ZmZlclNvdXJjZSA6IHB1YmxpYyBCbk9NWEJ1ZmZlclNvdXJjZSB7Ci0gICAgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gbVNvdXJjZTsKKyAgICBzcDxPbXhHcmFwaGljQnVmZmVyU291cmNlPiBtU291cmNlOwogCi0gICAgQldPTVhCdWZmZXJTb3VyY2UoY29uc3Qgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gJnNvdXJjZSk6IG1Tb3VyY2Uoc291cmNlKSB7CisgICAgQldPTVhCdWZmZXJTb3VyY2UoY29uc3Qgc3A8T214R3JhcGhpY0J1ZmZlclNvdXJjZT4gJnNvdXJjZSk6IG1Tb3VyY2Uoc291cmNlKSB7CiAgICAgfQogCiAgICAgU3RhdHVzIG9uT214RXhlY3V0aW5nKCkgb3ZlcnJpZGUgewpAQCAtODMsNyArODMsNyBAQAogfTsKIAogQldHcmFwaGljQnVmZmVyU291cmNlOjpCV0dyYXBoaWNCdWZmZXJTb3VyY2UoCi0gICAgICAgIHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IGNvbnN0JiBiYXNlKSA6CisgICAgICAgIHNwPE9teEdyYXBoaWNCdWZmZXJTb3VyY2U+IGNvbnN0JiBiYXNlKSA6CiAgICAgbUJhc2UoYmFzZSksCiAgICAgbU9NWEJ1ZmZlclNvdXJjZShuZXcgQldPTVhCdWZmZXJTb3VyY2UoYmFzZSkpIHsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9GcmFtZURyb3BwZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0ZyYW1lRHJvcHBlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNTBjNTguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0ZyYW1lRHJvcHBlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJGcmFtZURyb3BwZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvRnJhbWVEcm9wcGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgY29uc3QgaW50NjRfdCBrTWF4Sml0dGVyVXMgPSAyMDAwOwotCi1GcmFtZURyb3BwZXI6OkZyYW1lRHJvcHBlcigpCi0gICAgOiBtRGVzaXJlZE1pblRpbWVVcygtMSksCi0gICAgICBtTWluSW50ZXJ2YWxVcygwKSB7Ci19Ci0KLUZyYW1lRHJvcHBlcjo6fkZyYW1lRHJvcHBlcigpIHsKLX0KLQotc3RhdHVzX3QgRnJhbWVEcm9wcGVyOjpzZXRNYXhGcmFtZVJhdGUoZmxvYXQgbWF4RnJhbWVSYXRlKSB7Ci0gICAgaWYgKG1heEZyYW1lUmF0ZSA8PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJmcmFtZXJhdGUgc2hvdWxkIGJlIHBvc2l0aXZlIGJ1dCBnb3QgJWYuIiwgbWF4RnJhbWVSYXRlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgbU1pbkludGVydmFsVXMgPSAoaW50NjRfdCkgKDEwMDAwMDAuMGYgLyBtYXhGcmFtZVJhdGUpOwotICAgIHJldHVybiBPSzsKLX0KLQotYm9vbCBGcmFtZURyb3BwZXI6OnNob3VsZERyb3AoaW50NjRfdCB0aW1lVXMpIHsKLSAgICBpZiAobU1pbkludGVydmFsVXMgPD0gMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKG1EZXNpcmVkTWluVGltZVVzIDwgMCkgewotICAgICAgICBtRGVzaXJlZE1pblRpbWVVcyA9IHRpbWVVcyArIG1NaW5JbnRlcnZhbFVzOwotICAgICAgICBBTE9HVigiZmlyc3QgZnJhbWUgJWxsZCwgbmV4dCBkZXNpcmVkIGZyYW1lICVsbGQiLAotICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZVVzLCAobG9uZyBsb25nKW1EZXNpcmVkTWluVGltZVVzKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICh0aW1lVXMgPCAobURlc2lyZWRNaW5UaW1lVXMgLSBrTWF4Sml0dGVyVXMpKSB7Ci0gICAgICAgIEFMT0dWKCJkcm9wIGZyYW1lICVsbGQsIGRlc2lyZWQgZnJhbWUgJWxsZCwgZGlmZiAlbGxkIiwKLSAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVVcywgKGxvbmcgbG9uZyltRGVzaXJlZE1pblRpbWVVcywKLSAgICAgICAgICAgICAgICAobG9uZyBsb25nKShtRGVzaXJlZE1pblRpbWVVcyAtIHRpbWVVcykpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IG4gPSAodGltZVVzIC0gbURlc2lyZWRNaW5UaW1lVXMgKyBrTWF4Sml0dGVyVXMpIC8gbU1pbkludGVydmFsVXM7Ci0gICAgbURlc2lyZWRNaW5UaW1lVXMgKz0gKG4gKyAxKSAqIG1NaW5JbnRlcnZhbFVzOwotICAgIEFMT0dWKCJrZWVwIGZyYW1lICVsbGQsIG5leHQgZGVzaXJlZCBmcmFtZSAlbGxkLCBkaWZmICVsbGQiLAotICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lVXMsIChsb25nIGxvbmcpbURlc2lyZWRNaW5UaW1lVXMsCi0gICAgICAgICAgICAobG9uZyBsb25nKShtRGVzaXJlZE1pblRpbWVVcyAtIHRpbWVVcykpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkxN2QyYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQotI2RlZmluZSBMT0dfVEFHICJHcmFwaGljQnVmZmVyU291cmNlIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jZGVmaW5lIFNUUklOR0lGWV9FTlVNUyAvLyBmb3IgYXNTdHJpbmcgaW4gSGFyZHdhcmVBUEkuaC9WaWRlb0FQSS5oCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9GcmFtZURyb3BwZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0ZpbGVEZXNjcmlwdG9yLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KLSNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+Ci0jaW5jbHVkZSA8Z3VpL0J1ZmZlckl0ZW0uaD4KLSNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgotI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0NvbXBvbmVudC5oPgotI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0luZGV4RXh0Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvT01YQnVmZmVyLmg+Ci0KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotCi0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8Y21hdGg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLyoqCi0gKiBBIGNvcGlhYmxlIG9iamVjdCBtYW5hZ2luZyBhIGJ1ZmZlciBpbiB0aGUgYnVmZmVyIGNhY2hlIG1hbmFnZWQgYnkgdGhlIHByb2R1Y2VyLiBUaGlzIG9iamVjdAotICogaG9sZHMgYSByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciwgYW5kIG1haW50YWlucyB3aGljaCBidWZmZXIgc2xvdCBpdCBiZWxvbmdzIHRvIChpZiBhbnkpLCBhbmQKLSAqIHdoZXRoZXIgaXQgaXMgc3RpbGwgaW4gYSBidWZmZXIgc2xvdC4gSXQgYWxzbyBtYWludGFpbnMgd2hldGhlciB0aGVyZSBhcmUgYW55IG91dHN0YW5naW5nIGFjcXVpcmUKLSAqIHJlZmVyZW5jZXMgdG8gaXQgKGJ5IGJ1ZmZlcnMgYWNxdWlyZWQgZnJvbSB0aGUgc2xvdCkgbWFpbmx5IHNvIHRoYXQgd2UgY2FuIGtlZXAgYSBkZWJ1ZwotICogY291bnQgb2YgaG93IG1hbnkgYnVmZmVycyB3ZSBuZWVkIHRvIHN0aWxsIHJlbGVhc2UgYmFjayB0byB0aGUgcHJvZHVjZXIuCi0gKi8KLXN0cnVjdCBHcmFwaGljQnVmZmVyU291cmNlOjpDYWNoZWRCdWZmZXIgewotICAgIC8qKgotICAgICAqIFRva2VuIHRoYXQgaXMgdXNlZCB0byB0cmFjayBhY3F1aXJlIGNvdW50cyAoYXMgb3Bwb3NlZCB0byBhbGwgcmVmZXJlbmNlcyB0byB0aGlzIG9iamVjdCkuCi0gICAgICovCi0gICAgc3RydWN0IEFjcXVpcmFibGUgeyB9OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHVzaW5nIGEgYnVmZmVyIGNhY2hlZCBpbiBhIHNsb3QuCi0gICAgICovCi0gICAgQ2FjaGVkQnVmZmVyKHNsb3RfaWQgc2xvdCwgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmdyYXBoaWNCdWZmZXIpCi0gICAgICAgIDogbUlzQ2FjaGVkKHRydWUpLAotICAgICAgICAgIG1TbG90KHNsb3QpLAotICAgICAgICAgIG1HcmFwaGljQnVmZmVyKGdyYXBoaWNCdWZmZXIpLAotICAgICAgICAgIG1BY3F1aXJhYmxlKHN0ZDo6bWFrZV9zaGFyZWQ8QWNxdWlyYWJsZT4oKSkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNhY2hlIHNsb3QgdGhhdCB0aGlzIGJ1ZmZlciBpcyBjYWNoZWQgaW4sIG9yIC0xIGlmIGl0IGlzIG5vIGxvbmdlciBjYWNoZWQuCi0gICAgICoKLSAgICAgKiBUaGlzIGFzc3VtZXMgdGhhdCAtMSBzbG90IGlkIGlzIGludmFsaWQ7IHRob3VnaCwgaXQgaXMganVzdCBhIGJlbmlnbiBjb2xsaXNpb24gdXNlZCBmb3IKLSAgICAgKiBkZWJ1Z2dpbmcuIFRoaXMgb2JqZWN0IGV4cGxpY2l0bHkgbWFuYWdlcyB3aGV0aGVyIGl0IGlzIHN0aWxsIGNhY2hlZC4KLSAgICAgKi8KLSAgICBzbG90X2lkIGdldFNsb3QoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtSXNDYWNoZWQgPyBtU2xvdCA6IC0xOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNhY2hlZCBidWZmZXIuCi0gICAgICovCi0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ2V0R3JhcGhpY0J1ZmZlcigpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1HcmFwaGljQnVmZmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoaXMgYnVmZmVyIGlzIHN0aWxsIGluIHRoZSBidWZmZXIgY2FjaGUuCi0gICAgICovCi0gICAgYm9vbCBpc0NhY2hlZCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1Jc0NhY2hlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGlzIGJ1ZmZlciBoYXMgYW4gYWNxdWlyZWQgcmVmZXJlbmNlLgotICAgICAqLwotICAgIGJvb2wgaXNBY3F1aXJlZCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1BY3F1aXJhYmxlLnVzZV9jb3VudCgpID4gMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuZCByZXR1cm5zIGEgc2hhcmVkIGFjcXVpcmVkIHJlZmVyZW5jZS4KLSAgICAgKi8KLSAgICBzdGQ6OnNoYXJlZF9wdHI8QWNxdWlyYWJsZT4gZ2V0QWNxdWlyYWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1BY3F1aXJhYmxlOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBmcmllbmQgdm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpkaXNjYXJkQnVmZmVyQXRTbG90SW5kZXhfbChzc2l6ZV90KTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBidWZmZXIgaXMgbm8gbG9uZ2VyIGluIHRoZSBidWZmZXIgY2FjaGUuCi0gICAgICogQ2FsbGVkIGZyb20gZGlzY2FyZEJ1ZmZlckF0U2xvdEluZGV4X2wuCi0gICAgICovCi0gICAgdm9pZCBvbkRyb3BwZWRGcm9tQ2FjaGUoKSB7Ci0gICAgICAgIENIRUNLX0RCRyhtSXNDYWNoZWQpOwotICAgICAgICBtSXNDYWNoZWQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sIG1Jc0NhY2hlZDsKLSAgICBzbG90X2lkIG1TbG90OwotICAgIHNwPEdyYXBoaWNCdWZmZXI+IG1HcmFwaGljQnVmZmVyOwotICAgIHN0ZDo6c2hhcmVkX3B0cjxBY3F1aXJhYmxlPiBtQWNxdWlyYWJsZTsKLX07Ci0KLS8qKgotICogQSBjb3BpYWJsZSBvYmplY3QgbWFuYWdpbmcgYSBidWZmZXIgYWNxdWlyZWQgZnJvbSB0aGUgcHJvZHVjZXIuIFRoaXMgbXVzdCBhbHdheXMgYmUgYSBjYWNoZWQKLSAqIGJ1ZmZlci4gVGhpcyBvYmplY3RzIGFsc28gbWFuYWdlcyBpdHMgYWNxdWlyZSBmZW5jZSBhbmQgYW55IHJlbGVhc2UgZmVuY2VzIHRoYXQgbWF5IGJlIHJldHVybmVkCi0gKiBieSB0aGUgZW5jb2RlciBmb3IgdGhpcyBidWZmZXIgKHRoaXMgYnVmZmVyIG1heSBiZSBxdWV1ZWQgdG8gdGhlIGVuY29kZXIgbXVsdGlwbGUgdGltZXMpLgotICogSWYgbm8gcmVsZWFzZSBmZW5jZXMgYXJlIGFkZGVkIGJ5IHRoZSBlbmNvZGVyLCB0aGUgYWNxdWlyZSBmZW5jZSBpcyByZXR1cm5lZCBhcyB0aGUgcmVsZWFzZQotICogZmVuY2UgZm9yIHRoaXMgLSBhcyBpdCBpcyBhc3N1bWVkIHRoYXQgbm9vbmUgd2FpdGVkIGZvciB0aGUgYWNxdWlyZSBmZW5jZS4gT3RoZXJ3aXNlLCBpdCBpcwotICogYXNzdW1lZCB0aGF0IHRoZSBlbmNvZGVyIGhhcyB3YWl0ZWQgZm9yIHRoZSBhY3F1aXJlIGZlbmNlIChvciByZXR1cm5lZCBpdCBhcyB0aGUgcmVsZWFzZQotICogZmVuY2UpLgotICovCi1zdHJ1Y3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6QWNxdWlyZWRCdWZmZXIgewotICAgIEFjcXVpcmVkQnVmZmVyKAotICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENhY2hlZEJ1ZmZlcj4gJmJ1ZmZlciwKLSAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChBY3F1aXJlZEJ1ZmZlciAqKT4gb25SZWxlYXNlZCwKLSAgICAgICAgICAgIGNvbnN0IHNwPEZlbmNlPiAmYWNxdWlyZUZlbmNlKQotICAgICAgICA6IG1CdWZmZXIoYnVmZmVyKSwKLSAgICAgICAgICBtQWNxdWlyYWJsZShidWZmZXItPmdldEFjcXVpcmFibGUoKSksCi0gICAgICAgICAgbUFjcXVpcmVGZW5jZShhY3F1aXJlRmVuY2UpLAotICAgICAgICAgIG1Hb3RSZWxlYXNlRmVuY2VzKGZhbHNlKSwKLSAgICAgICAgICBtT25SZWxlYXNlZChvblJlbGVhc2VkKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHJlbGVhc2UgZmVuY2UgcmV0dXJuZWQgYnkgdGhlIGVuY29kZXIgdG8gdGhpcyBvYmplY3QuIElmIHRoaXMgaXMgY2FsbGVkIHdpdGggYW4KLSAgICAgKiB2YWxpZCBmaWxlIGRlc2NyaXB0b3IsIGl0IGlzIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHJlbGVhc2UgZmVuY2VzLiBUaGVzZSBhcmUgcmV0dXJuZWQgdG8gdGhlCi0gICAgICogcHJvZHVjZXIgb24gcmVsZWFzZSgpIGFzIGEgbWVyZ2VkIGZlbmNlLiBSZWdhcmRsZXNzIG9mIHRoZSB2YWxpZGl0eSBvZiB0aGUgZmlsZSBkZXNjcmlwdG9yLAotICAgICAqIHdlIHRha2Ugbm90ZSB0aGF0IGEgcmVsZWFzZSBmZW5jZSB3YXMgYXR0ZW1wdGVkIHRvIGJlIGFkZGVkIGFuZCB0aGUgYWNxdWlyZSBmZW5jZSBjYW4gbm93IGJlCi0gICAgICogYXNzdW1lZCBhcyBhY3F1aXJlZC4KLSAgICAgKi8KLSAgICB2b2lkIGFkZFJlbGVhc2VGZW5jZUZkKGludCBmZW5jZUZkKSB7Ci0gICAgICAgIC8vIHNhdmUgYWxsIHJlbGVhc2UgZmVuY2VzIC0gdGhlc2Ugd2lsbCBiZSBwcm9wYWdhdGVkIHRvIHRoZSBwcm9kdWNlciBpZiB0aGlzIGJ1ZmZlciBpcwotICAgICAgICAvLyBldmVyIHJlbGVhc2VkIHRvIGl0Ci0gICAgICAgIGlmIChmZW5jZUZkID49IDApIHsKLSAgICAgICAgICAgIG1SZWxlYXNlRmVuY2VGZHMucHVzaF9iYWNrKGZlbmNlRmQpOwotICAgICAgICB9Ci0gICAgICAgIG1Hb3RSZWxlYXNlRmVuY2VzID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhY3F1aXJlIGZlbmNlIGZpbGUgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuCi0gICAgICovCi0gICAgaW50IGdldEFjcXVpcmVGZW5jZUZkKCkgewotICAgICAgICBpZiAobUFjcXVpcmVGZW5jZSA9PSBudWxscHRyIHx8ICFtQWNxdWlyZUZlbmNlLT5pc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUFjcXVpcmVGZW5jZS0+ZHVwKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBidWZmZXIgaXMgc3RpbGwgaW4gdGhlIGJ1ZmZlciBjYWNoZS4KLSAgICAgKi8KLSAgICBib29sIGlzQ2FjaGVkKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbUJ1ZmZlci0+aXNDYWNoZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhY3F1aXJlZCBidWZmZXIuCi0gICAgICovCi0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ2V0R3JhcGhpY0J1ZmZlcigpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1CdWZmZXItPmdldEdyYXBoaWNCdWZmZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzbG90IHRoYXQgdGhpcyBidWZmZXIgaXMgY2FjaGVkIGF0LCBvciAtMSBvdGhlcndpc2UuCi0gICAgICoKLSAgICAgKiBUaGlzIGFzc3VtZXMgdGhhdCAtMSBzbG90IGlkIGlzIGludmFsaWQ7IHRob3VnaCwgaXQgaXMganVzdCBhIGJlbmlnbiBjb2xsaXNpb24gdXNlZCBmb3IKLSAgICAgKiBkZWJ1Z2dpbmcuIFRoaXMgb2JqZWN0IGV4cGxpY2l0bHkgbWFuYWdlcyB3aGV0aGVyIGl0IGlzIHN0aWxsIGNhY2hlZC4KLSAgICAgKi8KLSAgICBzbG90X2lkIGdldFNsb3QoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtQnVmZmVyLT5nZXRTbG90KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHJlbGVhc2UgZmVuY2Ugb2JqZWN0IGZyb20gdGhlIGFjcXVpcmUgZmVuY2UgYW5kL29yIGFueSByZWxlYXNlIGZlbmNlcwotICAgICAqIGFkZGVkLiBJZiBubyByZWxlYXNlIGZlbmNlcyB3ZXJlIGFkZGVkIChldmVuIGlmIGludmFsaWQpLCByZXR1cm5zIHRoZSBhY3F1aXJlIGZlbmNlLgotICAgICAqIE90aGVyd2lzZSwgaXQgcmV0dXJucyBhIG1lcmdlZCBmZW5jZSBmcm9tIGFsbCB0aGUgdmFsaWQgcmVsZWFzZSBmZW5jZXMgYWRkZWQuCi0gICAgICovCi0gICAgc3A8RmVuY2U+IGdldFJlbGVhc2VGZW5jZSgpIHsKLSAgICAgICAgLy8gSWYgZGlkIG5vdCByZWNlaXZlIHJlbGVhc2UgZmVuY2VzLCB3ZSBhc3N1bWUgdGhpcyBidWZmZXIgd2FzIG5vdCBjb25zdW1lZCAoaXQgd2FzCi0gICAgICAgIC8vIGRpc2NhcmRlZCBvciBkcm9wcGVkKS4gSW4gdGhpcyBjYXNlIHJlbGVhc2UgdGhlIGFjcXVpcmUgZmVuY2UgYXMgdGhlIHJlbGVhc2UgZmVuY2UuCi0gICAgICAgIC8vIFdlIGRvIHRoaXMgaGVyZSB0byBhdm9pZCBhIGR1cCwgY2xvc2UgYW5kIHJlY3JlYXRpb24gb2YgdGhlIEZlbmNlIG9iamVjdC4KLSAgICAgICAgaWYgKCFtR290UmVsZWFzZUZlbmNlcykgewotICAgICAgICAgICAgcmV0dXJuIG1BY3F1aXJlRmVuY2U7Ci0gICAgICAgIH0KLSAgICAgICAgc3A8RmVuY2U+IHJldCA9IGdldFJlbGVhc2VGZW5jZSgwLCBtUmVsZWFzZUZlbmNlRmRzLnNpemUoKSk7Ci0gICAgICAgIC8vIGNsZWFyIGZkcyBhcyBmZW5jZSB0b29rIG93bmVyc2hpcCBvZiB0aGVtCi0gICAgICAgIG1SZWxlYXNlRmVuY2VGZHMuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICAvLyB0aGlzIHZpZGVvIGJ1ZmZlciBpcyBubyBsb25nZXIgcmVmZXJlbmNlZCBieSB0aGUgY29kZWMgKG9yIGtlcHQgZm9yIGxhdGVyIGVuY29kaW5nKQotICAgIC8vIGl0IGlzIG5vdyBzYWZlIHRvIHJlbGVhc2UgdG8gdGhlIHByb2R1Y2VyCi0gICAgfkFjcXVpcmVkQnVmZmVyKCkgewotICAgICAgICAvL21BY3F1aXJhYmxlLmNsZWFyKCk7Ci0gICAgICAgIG1PblJlbGVhc2VkKHRoaXMpOwotICAgICAgICAvLyBtT25SZWxlYXNlIG1ldGhvZCBzaG91bGQgY2FsbCBnZXRSZWxlYXNlRmVuY2UoKSB0aGF0IHJlbGVhc2VzIGFsbCBmZHMgYnV0IGp1c3QgaW4gY2FzZQotICAgICAgICBBTE9HV19JRighbVJlbGVhc2VGZW5jZUZkcy5lbXB0eSgpLCAicmVsZWFzZSBmZW5jZXMgd2VyZSBub3Qgb2J0YWluZWQsIGNsb3NpbmcgZmRzIik7Ci0gICAgICAgIGZvciAoaW50IGZpbGRlcyA6IG1SZWxlYXNlRmVuY2VGZHMpIHsKLSAgICAgICAgICAgIDo6Y2xvc2UoZmlsZGVzKTsKLSAgICAgICAgICAgIFRSRVNQQVNTX0RCRygpOwotICAgICAgICB9Ci0gICAgfQotCi1wcml2YXRlOgotICAgIHN0ZDo6c2hhcmVkX3B0cjxHcmFwaGljQnVmZmVyU291cmNlOjpDYWNoZWRCdWZmZXI+IG1CdWZmZXI7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPEdyYXBoaWNCdWZmZXJTb3VyY2U6OkNhY2hlZEJ1ZmZlcjo6QWNxdWlyYWJsZT4gbUFjcXVpcmFibGU7Ci0gICAgc3A8RmVuY2U+IG1BY3F1aXJlRmVuY2U7Ci0gICAgVmVjdG9yPGludD4gbVJlbGVhc2VGZW5jZUZkczsKLSAgICBib29sIG1Hb3RSZWxlYXNlRmVuY2VzOwotICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChBY3F1aXJlZEJ1ZmZlciAqKT4gbU9uUmVsZWFzZWQ7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgcmVsZWFzZSBmZW5jZSBmcm9tIDAgb3IgbW9yZSByZWxlYXNlIGZlbmNlIGZpbGUgZGVzY3JpcHRvcnMgaW4gZnJvbQotICAgICAqIHRoZSBzcGVjaWZpZWQgcmFuZ2UgaW4gdGhlIGFycmF5LgotICAgICAqCi0gICAgICogQHBhcmFtIHN0YXJ0IHN0YXJ0IGluZGV4Ci0gICAgICogQHBhcmFtIG51bSAgIG51bWJlciBvZiByZWxlYXNlIGZkcyB0byBtZXJnZQotICAgICAqLwotICAgIHNwPEZlbmNlPiBnZXRSZWxlYXNlRmVuY2Uoc2l6ZV90IHN0YXJ0LCBzaXplX3QgbnVtKSBjb25zdCB7Ci0gICAgICAgIGlmIChudW0gPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIEZlbmNlOjpOT19GRU5DRTsKLSAgICAgICAgfSBlbHNlIGlmIChudW0gPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBGZW5jZShtUmVsZWFzZUZlbmNlRmRzW3N0YXJ0XSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gRmVuY2U6Om1lcmdlKCJHQlM6OkFCIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVsZWFzZUZlbmNlKHN0YXJ0LCBudW0gPj4gMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlbGVhc2VGZW5jZShzdGFydCArIChudW0gPj4gMSksIG51bSAtIChudW0gPj4gMSkpKTsKLSAgICAgICAgfQotICAgIH0KLX07Ci0KLUdyYXBoaWNCdWZmZXJTb3VyY2U6OkdyYXBoaWNCdWZmZXJTb3VyY2UoKSA6Ci0gICAgbUluaXRDaGVjayhVTktOT1dOX0VSUk9SKSwKLSAgICBtTnVtQXZhaWxhYmxlVW5hY3F1aXJlZEJ1ZmZlcnMoMCksCi0gICAgbU51bU91dHN0YW5kaW5nQWNxdWlyZXMoMCksCi0gICAgbUVuZE9mU3RyZWFtKGZhbHNlKSwKLSAgICBtRW5kT2ZTdHJlYW1TZW50KGZhbHNlKSwKLSAgICBtTGFzdERhdGFzcGFjZShIQUxfREFUQVNQQUNFX1VOS05PV04pLAotICAgIG1FeGVjdXRpbmcoZmFsc2UpLAotICAgIG1TdXNwZW5kZWQoZmFsc2UpLAotICAgIG1MYXN0RnJhbWVUaW1lc3RhbXBVcygtMSksCi0gICAgbVN0b3BUaW1lVXMoLTEpLAotICAgIG1MYXN0QWN0aW9uVGltZVVzKC0xbGwpLAotICAgIG1Ta2lwRnJhbWVzQmVmb3JlTnMoLTFsbCksCi0gICAgbUZyYW1lUmVwZWF0SW50ZXJ2YWxVcygtMWxsKSwKLSAgICBtUmVwZWF0TGFzdEZyYW1lR2VuZXJhdGlvbigwKSwKLSAgICBtT3V0c3RhbmRpbmdGcmFtZVJlcGVhdENvdW50KDApLAotICAgIG1GcmFtZVJlcGVhdEJsb2NrZWRPbkNvZGVjQnVmZmVyKGZhbHNlKSwKLSAgICBtRnBzKC0xLjApLAotICAgIG1DYXB0dXJlRnBzKC0xLjApLAotICAgIG1CYXNlQ2FwdHVyZVVzKC0xbGwpLAotICAgIG1CYXNlRnJhbWVVcygtMWxsKSwKLSAgICBtRnJhbWVDb3VudCgwKSwKLSAgICBtUHJldkNhcHR1cmVVcygtMWxsKSwKLSAgICBtUHJldkZyYW1lVXMoLTFsbCksCi0gICAgbUlucHV0QnVmZmVyVGltZU9mZnNldFVzKDBsbCkgewotICAgIEFMT0dWKCJHcmFwaGljQnVmZmVyU291cmNlIik7Ci0KLSAgICBTdHJpbmc4IG5hbWUoIkdyYXBoaWNCdWZmZXJTb3VyY2UiKTsKLQotICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmbVByb2R1Y2VyLCAmbUNvbnN1bWVyKTsKLSAgICBtQ29uc3VtZXItPnNldENvbnN1bWVyTmFtZShuYW1lKTsKLQotICAgIC8vIE5vdGUgdGhhdCB3ZSBjYW4ndCBjcmVhdGUgYW4gc3A8Li4uPih0aGlzKSBpbiBhIGN0b3IgdGhhdCB3aWxsIG5vdCBrZWVwIGEKLSAgICAvLyByZWZlcmVuY2Ugb25jZSB0aGUgY3RvciBlbmRzLCBhcyB0aGF0IHdvdWxkIGNhdXNlIHRoZSByZWZjb3VudCBvZiAndGhpcycKLSAgICAvLyBkcm9wcGluZyB0byAwIGF0IHRoZSBlbmQgb2YgdGhlIGN0b3IuICBTaW5jZSBhbGwgd2UgbmVlZCBpcyBhIHdwPC4uLj4KLSAgICAvLyB0aGF0J3Mgd2hhdCB3ZSBjcmVhdGUuCi0gICAgd3A8QnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXI+IGxpc3RlbmVyID0KLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyKj4odGhpcyk7Ci0gICAgc3A8SUNvbnN1bWVyTGlzdGVuZXI+IHByb3h5ID0KLSAgICAgICAgICAgIG5ldyBCdWZmZXJRdWV1ZTo6UHJveHlDb25zdW1lckxpc3RlbmVyKGxpc3RlbmVyKTsKLQotICAgIG1Jbml0Q2hlY2sgPSBtQ29uc3VtZXItPmNvbnN1bWVyQ29ubmVjdChwcm94eSwgZmFsc2UpOwotICAgIGlmIChtSW5pdENoZWNrICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJFcnJvciBjb25uZWN0aW5nIHRvIEJ1ZmZlclF1ZXVlOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBzdHJlcnJvcigtbUluaXRDaGVjayksIG1Jbml0Q2hlY2spOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbWVtc2V0KCZtRGVmYXVsdENvbG9yQXNwZWN0c1BhY2tlZCwgMCwgc2l6ZW9mKG1EZWZhdWx0Q29sb3JBc3BlY3RzUGFja2VkKSk7Ci0KLSAgICBDSEVDSyhtSW5pdENoZWNrID09IE5PX0VSUk9SKTsKLX0KLQotR3JhcGhpY0J1ZmZlclNvdXJjZTo6fkdyYXBoaWNCdWZmZXJTb3VyY2UoKSB7Ci0gICAgQUxPR1YoIn5HcmFwaGljQnVmZmVyU291cmNlIik7Ci0gICAgewotICAgICAgICAvLyBhbGwgYWNxdWlyZWQgYnVmZmVycyBtdXN0IGJlIGZyZWVkIHdpdGggdGhlIG11dGV4IGxvY2tlZCBvdGhlcndpc2Ugb3VyIGRlYnVnIGFzc2VydGlvbgotICAgICAgICAvLyBtYXkgdHJpZ2dlcgotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKLSAgICAgICAgbUF2YWlsYWJsZUJ1ZmZlcnMuY2xlYXIoKTsKLSAgICAgICAgbVN1Ym1pdHRlZENvZGVjQnVmZmVycy5jbGVhcigpOwotICAgICAgICBtTGF0ZXN0QnVmZmVyLm1CdWZmZXIucmVzZXQoKTsKLSAgICB9Ci0KLSAgICBpZiAobU51bU91dHN0YW5kaW5nQWNxdWlyZXMgIT0gMCkgewotICAgICAgICBBTE9HVygicG90ZW50aWFsIGJ1ZmZlciBsZWFrOiBhY3F1aXJlZD0lZCIsIG1OdW1PdXRzdGFuZGluZ0FjcXVpcmVzKTsKLSAgICAgICAgVFJFU1BBU1NfREJHKCk7Ci0gICAgfQotICAgIGlmIChtQ29uc3VtZXIgIT0gTlVMTCkgewotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29uc3VtZXItPmNvbnN1bWVyRGlzY29ubmVjdCgpOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HVygiY29uc3VtZXJEaXNjb25uZWN0IGZhaWxlZDogJWQiLCBlcnIpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1TdGF0dXMgR3JhcGhpY0J1ZmZlclNvdXJjZTo6b25PbXhFeGVjdXRpbmcoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7Ci0gICAgQUxPR1YoIi0tPiBleGVjdXRpbmc7IGF2YWlsYWJsZT0lenUsIHN1Ym1pdHRhYmxlPSV6ZCIsCi0gICAgICAgICAgICBtQXZhaWxhYmxlQnVmZmVycy5zaXplKCksIG1GcmVlQ29kZWNCdWZmZXJzLnNpemUoKSk7Ci0gICAgQ0hFQ0soIW1FeGVjdXRpbmcpOwotICAgIG1FeGVjdXRpbmcgPSB0cnVlOwotICAgIG1MYXN0RGF0YXNwYWNlID0gSEFMX0RBVEFTUEFDRV9VTktOT1dOOwotICAgIEFMT0dWKCJjbGVhcmluZyBsYXN0IGRhdGFTcGFjZSIpOwotCi0gICAgLy8gU3RhcnQgYnkgbG9hZGluZyB1cCBhcyBtYW55IGJ1ZmZlcnMgYXMgcG9zc2libGUuICBXZSB3YW50IHRvIGRvIHRoaXMsCi0gICAgLy8gcmF0aGVyIHRoYW4ganVzdCBzdWJtaXQgdGhlIGZpcnN0IGJ1ZmZlciwgdG8gYXZvaWQgYSBkZWdlbmVyYXRlIGNhc2U6Ci0gICAgLy8gaWYgYWxsIEJRIGJ1ZmZlcnMgYXJyaXZlIGJlZm9yZSB3ZSBzdGFydCBleGVjdXRpbmcsIGFuZCB3ZSBvbmx5IHN1Ym1pdAotICAgIC8vIG9uZSBoZXJlLCB0aGUgb3RoZXIgQlEgYnVmZmVycyB3aWxsIGp1c3Qgc2l0IHVudGlsIHdlIGdldCBub3RpZmllZAotICAgIC8vIHRoYXQgdGhlIGNvZGVjIGJ1ZmZlciBoYXMgYmVlbiByZWxlYXNlZC4gIFdlJ2QgdGhlbiBhY3F1aXJlIGFuZAotICAgIC8vIHN1Ym1pdCBhIHNpbmdsZSBhZGRpdGlvbmFsIGJ1ZmZlciwgcmVwZWF0ZWRseSwgbmV2ZXIgdXNpbmcgbW9yZSB0aGFuCi0gICAgLy8gb25lIGNvZGVjIGJ1ZmZlciBzaW11bHRhbmVvdXNseS4gIChXZSBjb3VsZCBpbnN0ZWFkIHRyeSB0byBzdWJtaXQKLSAgICAvLyBhbGwgQlEgYnVmZmVycyB3aGVuZXZlciBhbnkgY29kZWMgYnVmZmVyIGlzIGZyZWVkLCBidXQgaWYgd2UgZ2V0IHRoZQotICAgIC8vIGluaXRpYWwgY29uZGl0aW9ucyByaWdodCB0aGF0IHdpbGwgbmV2ZXIgYmUgdXNlZnVsLikKLSAgICB3aGlsZSAoaGF2ZUF2YWlsYWJsZUJ1ZmZlcnNfbCgpKSB7Ci0gICAgICAgIGlmICghZmlsbENvZGVjQnVmZmVyX2woKSkgewotICAgICAgICAgICAgQUxPR1YoInN0b3AgbG9hZCB3aXRoIGF2YWlsYWJsZT0lenUrJWQiLAotICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlQnVmZmVycy5zaXplKCksIG1OdW1BdmFpbGFibGVVbmFjcXVpcmVkQnVmZmVycyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEFMT0dWKCJkb25lIGxvYWRpbmcgaW5pdGlhbCBmcmFtZXMsIGF2YWlsYWJsZT0lenUrJWQiLAotICAgICAgICAgICAgbUF2YWlsYWJsZUJ1ZmZlcnMuc2l6ZSgpLCBtTnVtQXZhaWxhYmxlVW5hY3F1aXJlZEJ1ZmZlcnMpOwotCi0gICAgLy8gSWYgRU9TIGhhcyBhbHJlYWR5IGJlZW4gc2lnbmFsZWQsIGFuZCB0aGVyZSBhcmUgbm8gbW9yZSBmcmFtZXMgdG8KLSAgICAvLyBzdWJtaXQsIHRyeSB0byBzZW5kIEVPUyBub3cgYXMgd2VsbC4KLSAgICBpZiAobVN0b3BUaW1lVXMgPT0gLTEgJiYgbUVuZE9mU3RyZWFtICYmICFoYXZlQXZhaWxhYmxlQnVmZmVyc19sKCkpIHsKLSAgICAgICAgc3VibWl0RW5kT2ZJbnB1dFN0cmVhbV9sKCk7Ci0gICAgfQotCi0gICAgaWYgKG1GcmFtZVJlcGVhdEludGVydmFsVXMgPiAwbGwgJiYgbUxvb3BlciA9PSBOVUxMKSB7Ci0gICAgICAgIG1SZWZsZWN0b3IgPSBuZXcgQUhhbmRsZXJSZWZsZWN0b3I8R3JhcGhpY0J1ZmZlclNvdXJjZT4odGhpcyk7Ci0KLSAgICAgICAgbUxvb3BlciA9IG5ldyBBTG9vcGVyOwotICAgICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobVJlZmxlY3Rvcik7Ci0gICAgICAgIG1Mb29wZXItPnN0YXJ0KCk7Ci0KLSAgICAgICAgaWYgKG1MYXRlc3RCdWZmZXIubUJ1ZmZlciAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBxdWV1ZUZyYW1lUmVwZWF0X2woKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBHcmFwaGljQnVmZmVyU291cmNlOjpvbk9teElkbGUoKSB7Ci0gICAgQUxPR1YoIm9teElkbGUiKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwotCi0gICAgaWYgKG1FeGVjdXRpbmcpIHsKLSAgICAgICAgLy8gV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgdHJhbnNpdGlvbiBmcm9tIGV4ZWN1dGluZy0+aWRsZSwKLSAgICAgICAgLy8gbm90IGxvYWRlZC0+aWRsZS4KLSAgICAgICAgbUV4ZWN1dGluZyA9IGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgR3JhcGhpY0J1ZmZlclNvdXJjZTo6b25PbXhMb2FkZWQoKXsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKLSAgICBpZiAobUxvb3BlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1SZWZsZWN0b3ItPmlkKCkpOwotICAgICAgICBtUmVmbGVjdG9yLmNsZWFyKCk7Ci0KLSAgICAgICAgbUxvb3Blci0+c3RvcCgpOwotICAgICAgICBtTG9vcGVyLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgQUxPR1YoIi0tPiBsb2FkZWQ7IGF2YWlsYWJsZT0lenUrJWQgZW9zPSVkIGVvc1NlbnQ9JWQgYWNxdWlyZWQ9JWQiLAotICAgICAgICAgICAgbUF2YWlsYWJsZUJ1ZmZlcnMuc2l6ZSgpLCBtTnVtQXZhaWxhYmxlVW5hY3F1aXJlZEJ1ZmZlcnMsCi0gICAgICAgICAgICBtRW5kT2ZTdHJlYW0sIG1FbmRPZlN0cmVhbVNlbnQsIG1OdW1PdXRzdGFuZGluZ0FjcXVpcmVzKTsKLQotICAgIC8vIENvZGVjIGlzIG5vIGxvbmdlciBleGVjdXRpbmcuICBSZWxlYXNpbmcgYWxsIGJ1ZmZlcnMgdG8gYnEuCi0gICAgbUZyZWVDb2RlY0J1ZmZlcnMuY2xlYXIoKTsKLSAgICBtU3VibWl0dGVkQ29kZWNCdWZmZXJzLmNsZWFyKCk7Ci0gICAgbUxhdGVzdEJ1ZmZlci5tQnVmZmVyLnJlc2V0KCk7Ci0gICAgbU9NWE5vZGUuY2xlYXIoKTsKLSAgICBtRXhlY3V0aW5nID0gZmFsc2U7Ci0KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgR3JhcGhpY0J1ZmZlclNvdXJjZTo6b25JbnB1dEJ1ZmZlckFkZGVkKGNvZGVjX2J1ZmZlcl9pZCBidWZmZXJJZCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwotCi0gICAgaWYgKG1FeGVjdXRpbmcpIHsKLSAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIC0tIGJ1ZmZlcnMgY2FuIG9ubHkgYmUgYWxsb2NhdGVkIHdoZW4KLSAgICAgICAgLy8gdHJhbnNpdGlvbmluZyBmcm9tICJsb2FkZWQiIHRvICJpZGxlIi4KLSAgICAgICAgQUxPR0UoImFkZENvZGVjQnVmZmVyOiBidWZmZXIgYWRkZWQgd2hpbGUgZXhlY3V0aW5nIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihJTlZBTElEX09QRVJBVElPTik7Ci0gICAgfQotCi0gICAgQUxPR1YoImFkZENvZGVjQnVmZmVyOiBidWZmZXJJZD0ldSIsIGJ1ZmZlcklkKTsKLQotICAgIG1GcmVlQ29kZWNCdWZmZXJzLnB1c2hfYmFjayhidWZmZXJJZCk7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIEdyYXBoaWNCdWZmZXJTb3VyY2U6Om9uSW5wdXRCdWZmZXJFbXB0aWVkKGNvZGVjX2J1ZmZlcl9pZCBidWZmZXJJZCwgaW50IGZlbmNlRmQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKLSAgICBGaWxlRGVzY3JpcHRvcjo6QXV0b2Nsb3NlIGZlbmNlKGZlbmNlRmQpOwotCi0gICAgc3NpemVfdCBjYmkgPSBtU3VibWl0dGVkQ29kZWNCdWZmZXJzLmluZGV4T2ZLZXkoYnVmZmVySWQpOwotICAgIGlmIChjYmkgPCAwKSB7Ci0gICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4KLSAgICAgICAgQUxPR0UoIm9uSW5wdXRCdWZmZXJFbXB0aWVkOiBidWZmZXIgbm90IHJlY29nbml6ZWQgKGJ1ZmZlcklkPSV1KSIsIGJ1ZmZlcklkKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKEJBRF9WQUxVRSk7Ci0gICAgfQotCi0gICAgc3RkOjpzaGFyZWRfcHRyPEFjcXVpcmVkQnVmZmVyPiBidWZmZXIgPSBtU3VibWl0dGVkQ29kZWNCdWZmZXJzLnZhbHVlQXQoY2JpKTsKLQotICAgIC8vIE1vdmUgYnVmZmVyIHRvIGF2YWlsYWJsZSBidWZmZXJzCi0gICAgbVN1Ym1pdHRlZENvZGVjQnVmZmVycy5yZW1vdmVJdGVtc0F0KGNiaSk7Ci0gICAgbUZyZWVDb2RlY0J1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcklkKTsKLQotICAgIC8vIGhlYWRlci0+bkZpbGxlZExlbiBtYXkgbm90IGJlIHRoZSBvcmlnaW5hbCB2YWx1ZSwgc28gd2UgY2FuJ3QgY29tcGFyZQotICAgIC8vIHRoYXQgdG8gemVybyB0byBzZWUgb2YgdGhpcyB3YXMgdGhlIEVPUyBidWZmZXIuICBJbnN0ZWFkIHdlIGp1c3QKLSAgICAvLyBzZWUgaWYgdGhlcmUgaXMgYSBudWxsIEFjcXVpcmVkQnVmZmVyLCB3aGljaCBzaG91bGQgb25seSBldmVyIGhhcHBlbiBmb3IgRU9TLgotICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgewotICAgICAgICBpZiAoIShtRW5kT2ZTdHJlYW0gJiYgbUVuZE9mU3RyZWFtU2VudCkpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGJyb2tlbiBjb2RlIHNlbmRzIHVzIHRoZSBzYW1lIGJ1ZmZlciB0d2ljZSBpbiBhIHJvdy4KLSAgICAgICAgICAgIEFMT0dFKCJvbklucHV0QnVmZmVyRW1wdGllZDogbm9uLUVPUyBudWxsIGJ1ZmZlciAoYnVmZmVySWQ9JXUpIiwgYnVmZmVySWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1YoIm9uSW5wdXRCdWZmZXJFbXB0aWVkOiBFT1MgbnVsbCBidWZmZXIgKGJ1ZmZlcklkPSV1QCV6ZCkiLCBidWZmZXJJZCwgY2JpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBObyBHcmFwaGljQnVmZmVyIHRvIGRlYWwgd2l0aCwgbm8gYWRkaXRpb25hbCBpbnB1dCBvciBvdXRwdXQgaXMgZXhwZWN0ZWQsIHNvIGp1c3QgcmV0dXJuLgotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoQkFEX1ZBTFVFKTsKLSAgICB9Ci0KLSAgICBpZiAoIW1FeGVjdXRpbmcpIHsKLSAgICAgICAgLy8gdGhpcyBpcyBmaW5lIHNpbmNlIHRoaXMgY291bGQgaGFwcGVuIHdoZW4gZ29pbmcgZnJvbSBJZGxlIHRvIExvYWRlZAotICAgICAgICBBTE9HVigib25JbnB1dEJ1ZmZlckVtcHRpZWQ6IG5vIGxvbmdlciBleGVjdXRpbmcgKGJ1ZmZlcklkPSV1QCV6ZCkiLCBidWZmZXJJZCwgY2JpKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKE9LKTsKLSAgICB9Ci0KLSAgICBBTE9HVigib25JbnB1dEJ1ZmZlckVtcHRpZWQ6IGJ1ZmZlcklkPSVkQCV6ZCBbc2xvdD0lZCwgdXNlQ291bnQ9JWxkLCBoYW5kbGU9JXBdIGFjcXVpcmVkPSVkIiwKLSAgICAgICAgICAgIGJ1ZmZlcklkLCBjYmksIGJ1ZmZlci0+Z2V0U2xvdCgpLCBidWZmZXIudXNlX2NvdW50KCksIGJ1ZmZlci0+Z2V0R3JhcGhpY0J1ZmZlcigpLT5oYW5kbGUsCi0gICAgICAgICAgICBtTnVtT3V0c3RhbmRpbmdBY3F1aXJlcyk7Ci0KLSAgICBidWZmZXItPmFkZFJlbGVhc2VGZW5jZUZkKGZlbmNlLnJlbGVhc2UoKSk7Ci0gICAgLy8gcmVsZWFzZSBjb2RlYyByZWZlcmVuY2UgZm9yIHZpZGVvIGJ1ZmZlciBqdXN0IGluIGNhc2UgcmVtb3ZlIGRvZXMgbm90IGl0Ci0gICAgYnVmZmVyLnJlc2V0KCk7Ci0KLSAgICBpZiAoaGF2ZUF2YWlsYWJsZUJ1ZmZlcnNfbCgpKSB7Ci0gICAgICAgIC8vIEZpbGwgdGhpcyBjb2RlYyBidWZmZXIuCi0gICAgICAgIENIRUNLKCFtRW5kT2ZTdHJlYW1TZW50KTsKLSAgICAgICAgQUxPR1YoIm9uSW5wdXRCdWZmZXJFbXB0aWVkOiBidWZmZXIgZnJlZWQsIGZlZWRpbmcgY29kZWMgKGF2YWlsYWJsZT0lenUrJWQsIGVvcz0lZCkiLAotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVCdWZmZXJzLnNpemUoKSwgbU51bUF2YWlsYWJsZVVuYWNxdWlyZWRCdWZmZXJzLCBtRW5kT2ZTdHJlYW0pOwotICAgICAgICBmaWxsQ29kZWNCdWZmZXJfbCgpOwotICAgIH0gZWxzZSBpZiAobUVuZE9mU3RyZWFtICYmIG1TdG9wVGltZVVzID09IC0xKSB7Ci0gICAgICAgIC8vIE5vIGZyYW1lcyBhdmFpbGFibGUsIGJ1dCBFT1MgaXMgcGVuZGluZyBhbmQgbm8gc3RvcCB0aW1lLCBzbyB1c2UgdGhpcyBidWZmZXIgdG8KLSAgICAgICAgLy8gc2VuZCB0aGF0LgotICAgICAgICBBTE9HVigib25JbnB1dEJ1ZmZlckVtcHRpZWQ6IGJ1ZmZlciBmcmVlZCwgc3VibWl0dGluZyBFT1MiKTsKLSAgICAgICAgc3VibWl0RW5kT2ZJbnB1dFN0cmVhbV9sKCk7Ci0gICAgfSBlbHNlIGlmIChtRnJhbWVSZXBlYXRCbG9ja2VkT25Db2RlY0J1ZmZlcikgewotICAgICAgICBib29sIHN1Y2Nlc3MgPSByZXBlYXRMYXRlc3RCdWZmZXJfbCgpOwotICAgICAgICBBTE9HVigib25JbnB1dEJ1ZmZlckVtcHRpZWQ6IGNvbXBsZXRpbmcgZGVmZXJyZWQgcmVwZWF0TGF0ZXN0QnVmZmVyX2wgJXMiLAotICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPyAiU1VDQ0VTUyIgOiAiRkFJTFVSRSIpOwotICAgICAgICBtRnJhbWVSZXBlYXRCbG9ja2VkT25Db2RlY0J1ZmZlciA9IGZhbHNlOwotICAgIH0KLQotICAgIC8vIHJlbGVhc2VSZWxlYXNhYmxlQnVmZmVyc19sKCk7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotdm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpvbkRhdGFzcGFjZUNoYW5nZWRfbCgKLSAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YXNwYWNlLCBhbmRyb2lkX3BpeGVsX2Zvcm1hdCBwaXhlbEZvcm1hdCkgewotICAgIEFMT0dEKCJnb3QgYnVmZmVyIHdpdGggbmV3IGRhdGFTcGFjZSAjJXgiLCBkYXRhc3BhY2UpOwotICAgIG1MYXN0RGF0YXNwYWNlID0gZGF0YXNwYWNlOwotCi0gICAgaWYgKENvbG9yVXRpbHM6OmNvbnZlcnREYXRhU3BhY2VUb1YwKGRhdGFzcGFjZSkpIHsKLSAgICAgICAgbU9NWE5vZGUtPmRpc3BhdGNoRGF0YVNwYWNlQ2hhbmdlZChtTGFzdERhdGFzcGFjZSwgbURlZmF1bHRDb2xvckFzcGVjdHNQYWNrZWQsIHBpeGVsRm9ybWF0KTsKLSAgICB9Ci19Ci0KLWJvb2wgR3JhcGhpY0J1ZmZlclNvdXJjZTo6ZmlsbENvZGVjQnVmZmVyX2woKSB7Ci0gICAgQ0hFQ0sobUV4ZWN1dGluZyAmJiBoYXZlQXZhaWxhYmxlQnVmZmVyc19sKCkpOwotCi0gICAgaWYgKG1GcmVlQ29kZWNCdWZmZXJzLmVtcHR5KCkpIHsKLSAgICAgICAgLy8gTm8gYnVmZmVycyBhdmFpbGFibGUsIGJhaWwuCi0gICAgICAgIEFMT0dWKCJmaWxsQ29kZWNCdWZmZXJfbDogbm8gY29kZWMgYnVmZmVycywgYXZhaWxhYmxlPSV6dSslZCIsCi0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZUJ1ZmZlcnMuc2l6ZSgpLCBtTnVtQXZhaWxhYmxlVW5hY3F1aXJlZEJ1ZmZlcnMpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgVmlkZW9CdWZmZXIgaXRlbTsKLSAgICBpZiAobUF2YWlsYWJsZUJ1ZmZlcnMuZW1wdHkoKSkgewotICAgICAgICBBTE9HVigiZmlsbENvZGVjQnVmZmVyX2w6IGFjcXVpcmluZyBhdmFpbGFibGUgYnVmZmVyLCBhdmFpbGFibGU9JXp1KyVkIiwKLSAgICAgICAgICAgICAgICBtQXZhaWxhYmxlQnVmZmVycy5zaXplKCksIG1OdW1BdmFpbGFibGVVbmFjcXVpcmVkQnVmZmVycyk7Ci0gICAgICAgIGlmIChhY3F1aXJlQnVmZmVyX2woJml0ZW0pICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZmlsbENvZGVjQnVmZmVyX2w6IGZhaWxlZCB0byBhY3F1aXJlIGF2YWlsYWJsZSBidWZmZXIiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJmaWxsQ29kZWNCdWZmZXJfbDogZ2V0dGluZyBhdmFpbGFibGUgYnVmZmVyLCBhdmFpbGFibGU9JXp1KyVkIiwKLSAgICAgICAgICAgICAgICBtQXZhaWxhYmxlQnVmZmVycy5zaXplKCksIG1OdW1BdmFpbGFibGVVbmFjcXVpcmVkQnVmZmVycyk7Ci0gICAgICAgIGl0ZW0gPSAqbUF2YWlsYWJsZUJ1ZmZlcnMuYmVnaW4oKTsKLSAgICAgICAgbUF2YWlsYWJsZUJ1ZmZlcnMuZXJhc2UobUF2YWlsYWJsZUJ1ZmZlcnMuYmVnaW4oKSk7Ci0gICAgfQotCi0gICAgaW50NjRfdCBpdGVtVGltZVVzID0gaXRlbS5tVGltZXN0YW1wTnMgLyAxMDAwOwotCi0gICAgLy8gUHJvY2VzcyBBY3Rpb25JdGVtIGluIHRoZSBRdWV1ZSBpZiB0aGVyZSBpcyBhbnkuIElmIGEgYnVmZmVyJ3MgdGltZXN0YW1wCi0gICAgLy8gaXMgc21hbGxlciB0aGFuIHRoZSBmaXJzdCBhY3Rpb24ncyB0aW1lc3RhbXAsIG5vIGFjdGlvbiBuZWVkIHRvIGJlIHBlcmZvcm1lZC4KLSAgICAvLyBJZiBidWZmZXIncyB0aW1lc3RhbXAgaXMgbGFyZ2VyIG9yIGVxdWFsIHRoYW4gdGhlIGxhc3QgYWN0aW9uJ3MgdGltZXN0YW1wLAotICAgIC8vIG9ubHkgdGhlIGxhc3QgYWN0aW9uIG5lZWRzIHRvIGJlIHBlcmZvcm1lZCBhcyBhbGwgdGhlIGFjaXRpb25zIGJlZm9yZSB0aGUKLSAgICAvLyB0aGUgYWN0aW9uIGFyZSBvdmVycmlkZGVuIGJ5IHRoZSBsYXN0IGFjdGlvbi4gRm9yIHRoZSBvdGhlciBjYXNlcywgdHJhdmVyc2UKLSAgICAvLyB0aGUgUXVldWUgdG8gZmluZCB0aGUgbmV3ZXN0IGFjdGlvbiB0aGF0IHdpdGggdGltZXN0YW1wIHNtYWxsZXIgb3IgZXF1YWwgdG8KLSAgICAvLyB0aGUgYnVmZmVyJ3MgdGltZXN0YW1wLiBGb3IgZXhhbXBsZSwgYW4gYWN0aW9uIHF1ZXVlIGxpa2UKLSAgICAvLyBbcGF1c2UgMXVzXSwgW3Jlc3VtZSAydXNdLCBbcGF1c2UgM3VzXSwgW3Jlc3VtZSA0dXNdLCBbcGF1c2UgNXVzXS4uLi4gVXBvbgotICAgIC8vIHJlY2VpdmluZyBhIGJ1ZmZlciB3aXRoIHRpbWVzdGFtcCAzLjV1cywgb25seSB0aGUgYWN0aW9uIFtwYXVzZSwgM3VzXSBuZWVkcwotICAgIC8vIHRvIGJlIGhhbmRsZWQgYW5kIFtwYXVzZSwgMXVzXSwgW3Jlc3VtZSAydXNdIHdpbGwgYmUgZGlzY2FyZGVkLgotICAgIGJvb2wgZG9uZSA9IGZhbHNlOwotICAgIGJvb2wgc2VlU3RvcEFjdGlvbiA9IGZhbHNlOwotICAgIGlmICghbUFjdGlvblF1ZXVlLmVtcHR5KCkpIHsKLSAgICAgICAgLy8gRmlyc3Qgc2NhbiB0byBjaGVjayBpZiBidWZmZXJUaW1lc3RhbXAgaXMgc21hbGxlciB0aGFuIGZpcnN0IGFjdGlvbidzIHRpbWVzdGFtcC4KLSAgICAgICAgQWN0aW9uSXRlbSBuZXh0QWN0aW9uID0gKihtQWN0aW9uUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgIGlmIChpdGVtVGltZVVzIDwgbmV4dEFjdGlvbi5tQWN0aW9uVGltZVVzKSB7Ci0gICAgICAgICAgICBBTE9HVigiTm8gYWN0aW9uLiBidWZmZXIgdGltZXN0YW1wICVsbGQgdXMgPCBhY3Rpb24gdGltZXN0YW1wOiAlbGxkIHVzIiwKLSAgICAgICAgICAgICAgICAobG9uZyBsb25nKWl0ZW1UaW1lVXMsIChsb25nIGxvbmcpbmV4dEFjdGlvbi5tQWN0aW9uVGltZVVzKTsKLSAgICAgICAgICAgIC8vIEFsbCB0aGUgYWN0aW9ucyBhcmUgYWhlYWQuIE5vIGFjdGlvbiBuZWVkIHRvIHBlcmZvcm0gbm93LgotICAgICAgICAgICAgLy8gUmVsZWFzZSB0aGUgYnVmZmVyIGlmIGlzIGluIHN1c3BlbmRlZCBzdGF0ZSwgb3IgcHJvY2VzcyB0aGUgYnVmZmVyCi0gICAgICAgICAgICAvLyBpZiBub3QgaW4gc3VzcGVuZGVkIHN0YXRlLgotICAgICAgICAgICAgZG9uZSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWRvbmUpIHsKLSAgICAgICAgICAgIC8vIEZpbmQgdGhlIG5ld2VzdCBhY3Rpb24gdGhhdCB3aXRoIHRpbWVzdGFtcCBzbWFsbGVyIHRoYW4gaXRlbVRpbWVVcy4gVGhlbgotICAgICAgICAgICAgLy8gcmVtb3ZlIGFsbCB0aGUgYWN0aW9ucyBiZWZvcmUgYW5kIGluY2x1ZGUgdGhlIG5ld2VzdCBhY3Rpb24uCi0gICAgICAgICAgICBMaXN0PEFjdGlvbkl0ZW0+OjppdGVyYXRvciBpdCA9IG1BY3Rpb25RdWV1ZS5iZWdpbigpOwotICAgICAgICAgICAgd2hpbGUgKGl0ICE9IG1BY3Rpb25RdWV1ZS5lbmQoKSAmJiBpdC0+bUFjdGlvblRpbWVVcyA8PSBpdGVtVGltZVVzCi0gICAgICAgICAgICAgICAgICAgICYmIG5leHRBY3Rpb24ubUFjdGlvbiAhPSBBY3Rpb25JdGVtOjpTVE9QKSB7Ci0gICAgICAgICAgICAgICAgbmV4dEFjdGlvbiA9ICppdDsKLSAgICAgICAgICAgICAgICArK2l0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUFjdGlvblF1ZXVlLmVyYXNlKG1BY3Rpb25RdWV1ZS5iZWdpbigpLCBpdCk7Ci0KLSAgICAgICAgICAgIENIRUNLKGl0ZW1UaW1lVXMgPj0gbmV4dEFjdGlvbi5tQWN0aW9uVGltZVVzKTsKLSAgICAgICAgICAgIHN3aXRjaCAobmV4dEFjdGlvbi5tQWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBBY3Rpb25JdGVtOjpQQVVTRToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdXNwZW5kZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiUlVOTklORy9QQVVTRSAtPiBQQVVTRSBhdCBidWZmZXIgJWxsZCB1cyAgUEFVU0UgVGltZTogJWxsZCB1cyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylpdGVtVGltZVVzLCAobG9uZyBsb25nKW5leHRBY3Rpb24ubUFjdGlvblRpbWVVcyk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIEFjdGlvbkl0ZW06OlJFU1VNRToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdXNwZW5kZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlBBVVNFL1JVTk5JTkcgLT4gUlVOTklORyBhdCBidWZmZXIgJWxsZCB1cyAgUkVTVU1FIFRpbWU6ICVsbGQgdXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpaXRlbVRpbWVVcywgKGxvbmcgbG9uZyluZXh0QWN0aW9uLm1BY3Rpb25UaW1lVXMpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBBY3Rpb25JdGVtOjpTVE9QOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlJVTk5JTkcvUEFVU0UgLT4gU1RPUCBhdCBidWZmZXIgJWxsZCB1cyAgU1RPUCBUaW1lOiAlbGxkIHVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWl0ZW1UaW1lVXMsIChsb25nIGxvbmcpbmV4dEFjdGlvbi5tQWN0aW9uVGltZVVzKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIHdob2xlIEFjdGlvblF1ZXVlIGFzIHJlY29yZGluZyBpcyBkb25lCi0gICAgICAgICAgICAgICAgICAgIG1BY3Rpb25RdWV1ZS5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICBzZWVTdG9wQWN0aW9uID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIFRSRVNQQVNTX0RCRygiVW5rbm93biBhY3Rpb24gdHlwZSIpOwotICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdHJ1ZSBoZXJlIGJlY2F1c2Ugd2UgZGlkIGNvbnN1bWUgYW4gYXZhaWxhYmxlIGJ1ZmZlciwgc28gdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIGxvb3AgaW4gb25PbXhFeGVjdXRpbmcgd2lsbCBldmVudHVhbGx5IHRlcm1pbmF0ZSBldmVuIGlmIHdlIGhpdCB0aGlzLgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoc2VlU3RvcEFjdGlvbikgewotICAgICAgICAvLyBDbGVhciBhbGwgdGhlIGJ1ZmZlcnMgYmVmb3JlIHNldHRpbmcgbUVuZE9mU3RyZWFtIGFuZCBzaWduYWwgRW5kT2ZJbnB1dFN0cmVhbS4KLSAgICAgICAgcmVsZWFzZUFsbEF2YWlsYWJsZUJ1ZmZlcnNfbCgpOwotICAgICAgICBtRW5kT2ZTdHJlYW0gPSB0cnVlOwotICAgICAgICBzdWJtaXRFbmRPZklucHV0U3RyZWFtX2woKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaWYgKG1TdXNwZW5kZWQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaW50IGVyciA9IFVOS05PV05fRVJST1I7Ci0KLSAgICAvLyBvbmx5IHN1Ym1pdCBzYW1wbGUgaWYgc3RhcnQgdGltZSBpcyB1bnNwZWNpZmllZCwgb3Igc2FtcGxlCi0gICAgLy8gaXMgcXVldWVkIGFmdGVyIHRoZSBzcGVjaWZpZWQgc3RhcnQgdGltZQotICAgIGlmIChtU2tpcEZyYW1lc0JlZm9yZU5zIDwgMGxsIHx8IGl0ZW0ubVRpbWVzdGFtcE5zID49IG1Ta2lwRnJhbWVzQmVmb3JlTnMpIHsKLSAgICAgICAgLy8gaWYgc3RhcnQgdGltZSBpcyBzZXQsIG9mZnNldCB0aW1lIHN0YW1wIGJ5IHN0YXJ0IHRpbWUKLSAgICAgICAgaWYgKG1Ta2lwRnJhbWVzQmVmb3JlTnMgPiAwKSB7Ci0gICAgICAgICAgICBpdGVtLm1UaW1lc3RhbXBOcyAtPSBtU2tpcEZyYW1lc0JlZm9yZU5zOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50NjRfdCB0aW1lVXMgPSBpdGVtLm1UaW1lc3RhbXBOcyAvIDEwMDA7Ci0gICAgICAgIGlmIChtRnJhbWVEcm9wcGVyICE9IE5VTEwgJiYgbUZyYW1lRHJvcHBlci0+c2hvdWxkRHJvcCh0aW1lVXMpKSB7Ci0gICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgZnJhbWUgKCVsbGQpIHRvIG1lZXQgbWF4IGZyYW1lcmF0ZSIsIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4odGltZVVzKSk7Ci0gICAgICAgICAgICAvLyBzZXQgZXJyIHRvIE9LIHNvIHRoYXQgdGhlIHNraXBwZWQgZnJhbWUgY2FuIHN0aWxsIGJlIHNhdmVkIGFzIHRoZSBsYXN0ZXN0IGZyYW1lCi0gICAgICAgICAgICBlcnIgPSBPSzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVyciA9IHN1Ym1pdEJ1ZmZlcl9sKGl0ZW0pOyAvLyB0aGlzIHRha2VzIHNoYXJlZCBvd25lcnNoaXAgb2YgdGhlIGFjcXVpcmVkIGJ1ZmZlciBvbiBzdWNjZWVzcwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HVigic3VibWl0QnVmZmVyX2wgZmFpbGVkLCB3aWxsIHJlbGVhc2UgYnEgc2xvdCAlZCIsIGl0ZW0ubUJ1ZmZlci0+Z2V0U2xvdCgpKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gRG9uJ3Qgc2V0IHRoZSBsYXN0IGJ1ZmZlciBpZCBpZiB3ZSdyZSBub3QgcmVwZWF0aW5nLAotICAgICAgICAvLyB3ZSdsbCBiZSBob2xkaW5nIG9uIHRvIHRoZSBsYXN0IGJ1ZmZlciBmb3Igbm90aGluZy4KLSAgICAgICAgaWYgKG1GcmFtZVJlcGVhdEludGVydmFsVXMgPiAwbGwpIHsKLSAgICAgICAgICAgIHNldExhdGVzdEJ1ZmZlcl9sKGl0ZW0pOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJidWZmZXIgc3VibWl0dGVkIFtzbG90PSVkLCB1c2VDb3VudD0lbGRdIGFjcXVpcmVkPSVkIiwKLSAgICAgICAgICAgICAgICBpdGVtLm1CdWZmZXItPmdldFNsb3QoKSwgaXRlbS5tQnVmZmVyLnVzZV9jb3VudCgpLCBtTnVtT3V0c3RhbmRpbmdBY3F1aXJlcyk7Ci0gICAgICAgIG1MYXN0RnJhbWVUaW1lc3RhbXBVcyA9IGl0ZW1UaW1lVXM7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgR3JhcGhpY0J1ZmZlclNvdXJjZTo6cmVwZWF0TGF0ZXN0QnVmZmVyX2woKSB7Ci0gICAgQ0hFQ0sobUV4ZWN1dGluZyAmJiAhaGF2ZUF2YWlsYWJsZUJ1ZmZlcnNfbCgpKTsKLQotICAgIGlmIChtTGF0ZXN0QnVmZmVyLm1CdWZmZXIgPT0gbnVsbHB0ciB8fCBtU3VzcGVuZGVkKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAobUZyZWVDb2RlY0J1ZmZlcnMuZW1wdHkoKSkgewotICAgICAgICAvLyBObyBidWZmZXJzIGF2YWlsYWJsZSwgYmFpbC4KLSAgICAgICAgQUxPR1YoInJlcGVhdExhdGVzdEJ1ZmZlcl9sOiBubyBjb2RlYyBidWZmZXJzLiIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCFtTGF0ZXN0QnVmZmVyLm1CdWZmZXItPmlzQ2FjaGVkKCkpIHsKLSAgICAgICAgQUxPR1YoInJlcGVhdExhdGVzdEJ1ZmZlcl9sOiBzbG90IHdhcyBkaXNjYXJkZWQsIGJ1dCByZXBlYXRpbmcgb3VyIG93biByZWZlcmVuY2UiKTsKLSAgICB9Ci0KLSAgICAvLyBpdCBpcyBvayB0byB1cGRhdGUgdGhlIHRpbWVzdGFtcCBvZiBsYXRlc3QgYnVmZmVyIGFzIGl0IGlzIG9ubHkgdXNlZCBmb3Igc3VibWlzc2lvbgotICAgIHN0YXR1c190IGVyciA9IHN1Ym1pdEJ1ZmZlcl9sKG1MYXRlc3RCdWZmZXIpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qIHJlcGVhdCBsYXN0IGZyYW1lIHVwIHRvIGtSZXBlYXRMYXN0RnJhbWVDb3VudCB0aW1lcy4KLSAgICAgKiBpbiBjYXNlIG9mIHN0YXRpYyBzY2VuZSwgYSBzaW5nbGUgcmVwZWF0IG1pZ2h0IG5vdCBnZXQgcmlkIG9mIGVuY29kZXIKLSAgICAgKiBnaG9zdGluZyBjb21wbGV0ZWx5LCByZWZyZXNoIGEgY291cGxlIG1vcmUgdGltZXMgdG8gZ2V0IGJldHRlciBxdWFsaXR5Ci0gICAgICovCi0gICAgaWYgKC0tbU91dHN0YW5kaW5nRnJhbWVSZXBlYXRDb3VudCA+IDApIHsKLSAgICAgICAgLy8gc2V0IHVwIHRpbWVzdGFtcCBmb3IgcmVwZWF0IGZyYW1lCi0gICAgICAgIG1MYXRlc3RCdWZmZXIubVRpbWVzdGFtcE5zICs9IG1GcmFtZVJlcGVhdEludGVydmFsVXMgKiAxMDAwOwotICAgICAgICBxdWV1ZUZyYW1lUmVwZWF0X2woKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpzZXRMYXRlc3RCdWZmZXJfbChjb25zdCBWaWRlb0J1ZmZlciAmaXRlbSkgewotICAgIG1MYXRlc3RCdWZmZXIgPSBpdGVtOwotCi0gICAgQUxPR1YoInNldExhdGVzdEJ1ZmZlcl9sOiBbc2xvdD0lZCwgdXNlQ291bnQ9JWxkXSIsCi0gICAgICAgICAgICBtTGF0ZXN0QnVmZmVyLm1CdWZmZXItPmdldFNsb3QoKSwgbUxhdGVzdEJ1ZmZlci5tQnVmZmVyLnVzZV9jb3VudCgpKTsKLQotICAgIG1PdXRzdGFuZGluZ0ZyYW1lUmVwZWF0Q291bnQgPSBrUmVwZWF0TGFzdEZyYW1lQ291bnQ7Ci0gICAgLy8gc2V0IHVwIHRpbWVzdGFtcCBmb3IgcmVwZWF0IGZyYW1lCi0gICAgbUxhdGVzdEJ1ZmZlci5tVGltZXN0YW1wTnMgKz0gbUZyYW1lUmVwZWF0SW50ZXJ2YWxVcyAqIDEwMDA7Ci0gICAgcXVldWVGcmFtZVJlcGVhdF9sKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6cXVldWVGcmFtZVJlcGVhdF9sKCkgewotICAgIG1GcmFtZVJlcGVhdEJsb2NrZWRPbkNvZGVjQnVmZmVyID0gZmFsc2U7Ci0KLSAgICBpZiAobVJlZmxlY3RvciAhPSBOVUxMKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZXBlYXRMYXN0RnJhbWUsIG1SZWZsZWN0b3IpOwotICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgKyttUmVwZWF0TGFzdEZyYW1lR2VuZXJhdGlvbik7Ci0gICAgICAgIG1zZy0+cG9zdChtRnJhbWVSZXBlYXRJbnRlcnZhbFVzKTsKLSAgICB9Ci19Ci0KLWJvb2wgR3JhcGhpY0J1ZmZlclNvdXJjZTo6Y2FsY3VsYXRlQ29kZWNUaW1lc3RhbXBfbCgKLSAgICAgICAgbnNlY3NfdCBidWZmZXJUaW1lTnMsIGludDY0X3QgKmNvZGVjVGltZVVzKSB7Ci0gICAgaW50NjRfdCB0aW1lVXMgPSBidWZmZXJUaW1lTnMgLyAxMDAwOwotICAgIHRpbWVVcyArPSBtSW5wdXRCdWZmZXJUaW1lT2Zmc2V0VXM7Ci0KLSAgICBpZiAobUNhcHR1cmVGcHMgPiAwLgotICAgICAgICAgICAgJiYgKG1GcHMgPiAyICogbUNhcHR1cmVGcHMKLSAgICAgICAgICAgIHx8IG1DYXB0dXJlRnBzID4gMiAqIG1GcHMpKSB7Ci0gICAgICAgIC8vIFRpbWUgbGFwc2Ugb3Igc2xvdyBtb3Rpb24gbW9kZQotICAgICAgICBpZiAobVByZXZDYXB0dXJlVXMgPCAwbGwpIHsKLSAgICAgICAgICAgIC8vIGZpcnN0IGNhcHR1cmUKLSAgICAgICAgICAgIG1QcmV2Q2FwdHVyZVVzID0gbUJhc2VDYXB0dXJlVXMgPSB0aW1lVXM7Ci0gICAgICAgICAgICAvLyBhZGp1c3QgdGhlIGZpcnN0IHNhbXBsZSB0aW1lc3RhbXAuCi0gICAgICAgICAgICBtUHJldkZyYW1lVXMgPSBtQmFzZUZyYW1lVXMgPQotICAgICAgICAgICAgICAgICAgICBzdGQ6Omxscm91bmQoKHRpbWVVcyAqIG1DYXB0dXJlRnBzKSAvIG1GcHMpOwotICAgICAgICAgICAgbUZyYW1lQ291bnQgPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gc25hcCB0byBuZWFyZXN0IGNhcHR1cmUgcG9pbnQKLSAgICAgICAgICAgIGludDY0X3QgbkZyYW1lcyA9IHN0ZDo6bGxyb3VuZCgKLSAgICAgICAgICAgICAgICAgICAgKHRpbWVVcyAtIG1QcmV2Q2FwdHVyZVVzKSAqIG1DYXB0dXJlRnBzIC8gMTAwMDAwMCk7Ci0gICAgICAgICAgICBpZiAobkZyYW1lcyA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gc2tpcCB0aGlzIGZyYW1lIGFzIGl0J3MgdG9vIGNsb3NlIHRvIHByZXZpb3VzIGNhcHR1cmUKLSAgICAgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgZnJhbWUsIHRpbWVVcyAlbGxkIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih0aW1lVXMpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRnJhbWVDb3VudCArPSBuRnJhbWVzOwotICAgICAgICAgICAgbVByZXZDYXB0dXJlVXMgPSBtQmFzZUNhcHR1cmVVcyArIHN0ZDo6bGxyb3VuZCgKLSAgICAgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQgKiAxMDAwMDAwIC8gbUNhcHR1cmVGcHMpOwotICAgICAgICAgICAgbVByZXZGcmFtZVVzID0gbUJhc2VGcmFtZVVzICsgc3RkOjpsbHJvdW5kKAotICAgICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCAqIDEwMDAwMDAgLyBtRnBzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFMT0dWKCJ0aW1lVXMgJWxsZCwgY2FwdHVyZVVzICVsbGQsIGZyYW1lVXMgJWxsZCIsCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih0aW1lVXMpLAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4obVByZXZDYXB0dXJlVXMpLAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4obVByZXZGcmFtZVVzKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHRpbWVVcyA8PSBtUHJldkZyYW1lVXMpIHsKLSAgICAgICAgICAgIC8vIERyb3AgdGhlIGZyYW1lIGlmIGl0J3MgZ29pbmcgYmFja3dhcmQgaW4gdGltZS4gQmFkIHRpbWVzdGFtcAotICAgICAgICAgICAgLy8gY291bGQgZGlzcnVwdCBlbmNvZGVyJ3MgcmF0ZSBjb250cm9sIGNvbXBsZXRlbHkuCi0gICAgICAgICAgICBBTE9HVygiRHJvcHBpbmcgZnJhbWUgdGhhdCdzIGdvaW5nIGJhY2t3YXJkIGluIHRpbWUiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIG1QcmV2RnJhbWVVcyA9IHRpbWVVczsKLSAgICB9Ci0KLSAgICAqY29kZWNUaW1lVXMgPSBtUHJldkZyYW1lVXM7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXR1c190IEdyYXBoaWNCdWZmZXJTb3VyY2U6OnN1Ym1pdEJ1ZmZlcl9sKGNvbnN0IFZpZGVvQnVmZmVyICZpdGVtKSB7Ci0gICAgQ0hFQ0soIW1GcmVlQ29kZWNCdWZmZXJzLmVtcHR5KCkpOwotICAgIElPTVg6OmJ1ZmZlcl9pZCBjb2RlY0J1ZmZlcklkID0gKm1GcmVlQ29kZWNCdWZmZXJzLmJlZ2luKCk7Ci0KLSAgICBBTE9HVigic3VibWl0QnVmZmVyX2wgW3Nsb3Q9JWQsIGJ1ZmZlcklkPSVkXSIsIGl0ZW0ubUJ1ZmZlci0+Z2V0U2xvdCgpLCBjb2RlY0J1ZmZlcklkKTsKLQotICAgIGludDY0X3QgY29kZWNUaW1lVXM7Ci0gICAgaWYgKCFjYWxjdWxhdGVDb2RlY1RpbWVzdGFtcF9sKGl0ZW0ubVRpbWVzdGFtcE5zLCAmY29kZWNUaW1lVXMpKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIGlmICgoYW5kcm9pZF9kYXRhc3BhY2UpaXRlbS5tRGF0YXNwYWNlICE9IG1MYXN0RGF0YXNwYWNlKSB7Ci0gICAgICAgIG9uRGF0YXNwYWNlQ2hhbmdlZF9sKAotICAgICAgICAgICAgICAgIGl0ZW0ubURhdGFzcGFjZSwKLSAgICAgICAgICAgICAgICAoYW5kcm9pZF9waXhlbF9mb3JtYXQpaXRlbS5tQnVmZmVyLT5nZXRHcmFwaGljQnVmZmVyKCktPmZvcm1hdCk7Ci0gICAgfQotCi0gICAgc3RkOjpzaGFyZWRfcHRyPEFjcXVpcmVkQnVmZmVyPiBidWZmZXIgPSBpdGVtLm1CdWZmZXI7Ci0gICAgLy8gdXNlIGEgR3JhcGhpY0J1ZmZlciBmb3Igbm93IGFzIE9NWE5vZGVJbnN0YW5jZSBpcyB1c2luZyBHcmFwaGljQnVmZmVycyB0byBob2xkIHJlZmVyZW5jZXMKLSAgICAvLyBhbmQgaXQgcmVxdWlyZXMgdGhpcyBncmFwaGljIGJ1ZmZlciB0byBiZSBhYmxlIHRvIGhvbGQgaXRzIHJlZmVyZW5jZQotICAgIC8vIGFuZCB0aHVzIHdlIHdvdWxkIG5lZWQgdG8gY3JlYXRlIGEgbmV3IEdyYXBoaWNCdWZmZXIgZnJvbSBhbiBBTldCdWZmZXIgc2VwYXJhdGUgZnJvbSB0aGUKLSAgICAvLyBhY3F1aXJlZCBHcmFwaGljQnVmZmVyLgotICAgIC8vIFRPRE86IHRoaXMgY2FuIGJlIHJld29ya2VkIGdsb2JhbGx5IHRvIHVzZSBBTldCdWZmZXIgcmVmZXJlbmNlcwotICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdyYXBoaWNCdWZmZXIgPSBidWZmZXItPmdldEdyYXBoaWNCdWZmZXIoKTsKLSAgICBzdGF0dXNfdCBlcnIgPSBtT01YTm9kZS0+ZW1wdHlCdWZmZXIoCi0gICAgICAgICAgICBjb2RlY0J1ZmZlcklkLCBPTVhfQlVGRkVSRkxBR19FTkRPRkZSQU1FLCBncmFwaGljQnVmZmVyLCBjb2RlY1RpbWVVcywKLSAgICAgICAgICAgIGJ1ZmZlci0+Z2V0QWNxdWlyZUZlbmNlRmQoKSk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIEFMT0dXKCJXQVJOSU5HOiBlbXB0eUdyYXBoaWNCdWZmZXIgZmFpbGVkOiAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBtRnJlZUNvZGVjQnVmZmVycy5lcmFzZShtRnJlZUNvZGVjQnVmZmVycy5iZWdpbigpKTsKLQotICAgIHNzaXplX3QgY2JpeCA9IG1TdWJtaXR0ZWRDb2RlY0J1ZmZlcnMuYWRkKGNvZGVjQnVmZmVySWQsIGJ1ZmZlcik7Ci0gICAgQUxPR1YoImVtcHR5R3JhcGhpY0J1ZmZlciBzdWNjZWVkZWQsIGJ1ZmZlcklkPSV1QCV6ZCBidWZoYW5kbGU9JXAiLAotICAgICAgICAgICAgY29kZWNCdWZmZXJJZCwgY2JpeCwgZ3JhcGhpY0J1ZmZlci0+aGFuZGxlKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c3VibWl0RW5kT2ZJbnB1dFN0cmVhbV9sKCkgewotICAgIENIRUNLKG1FbmRPZlN0cmVhbSk7Ci0gICAgaWYgKG1FbmRPZlN0cmVhbVNlbnQpIHsKLSAgICAgICAgQUxPR1YoIkVPUyBhbHJlYWR5IHNlbnQiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtRnJlZUNvZGVjQnVmZmVycy5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dWKCJzdWJtaXRFbmRPZklucHV0U3RyZWFtX2w6IG5vIGNvZGVjIGJ1ZmZlcnMgYXZhaWxhYmxlIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgSU9NWDo6YnVmZmVyX2lkIGNvZGVjQnVmZmVySWQgPSAqbUZyZWVDb2RlY0J1ZmZlcnMuYmVnaW4oKTsKLQotICAgIC8vIFdlIHJlamVjdCBhbnkgYWRkaXRpb25hbCBpbmNvbWluZyBncmFwaGljIGJ1ZmZlcnMuIFRoZXJlIGlzIG5vIGFjcXVpcmVkIGJ1ZmZlciB1c2VkIGZvciBFT1MKLSAgICBzdGF0dXNfdCBlcnIgPSBtT01YTm9kZS0+ZW1wdHlCdWZmZXIoCi0gICAgICAgICAgICBjb2RlY0J1ZmZlcklkLCBPTVhfQlVGRkVSRkxBR19FTkRPRkZSQU1FIHwgT01YX0JVRkZFUkZMQUdfRU9TKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIEFMT0dXKCJlbXB0eURpcmVjdEJ1ZmZlciBFT1MgZmFpbGVkOiAweCV4IiwgZXJyKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtRnJlZUNvZGVjQnVmZmVycy5lcmFzZShtRnJlZUNvZGVjQnVmZmVycy5iZWdpbigpKTsKLSAgICAgICAgc3NpemVfdCBjYml4ID0gbVN1Ym1pdHRlZENvZGVjQnVmZmVycy5hZGQoY29kZWNCdWZmZXJJZCwgbnVsbHB0cik7Ci0gICAgICAgIEFMT0dWKCJzdWJtaXRFbmRPZklucHV0U3RyZWFtX2w6IGJ1ZmZlciBzdWJtaXR0ZWQsIGJ1ZmZlcklkPSV1QCV6ZCIsIGNvZGVjQnVmZmVySWQsIGNiaXgpOwotICAgICAgICBtRW5kT2ZTdHJlYW1TZW50ID0gdHJ1ZTsKLQotICAgICAgICAvLyBubyBuZWVkIHRvIGhvbGQgb250byBhbnkgYnVmZmVycyBmb3IgZnJhbWUgcmVwZWF0aW5nCi0gICAgICAgICsrbVJlcGVhdExhc3RGcmFtZUdlbmVyYXRpb247Ci0gICAgICAgIG1MYXRlc3RCdWZmZXIubUJ1ZmZlci5yZXNldCgpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6YWNxdWlyZUJ1ZmZlcl9sKFZpZGVvQnVmZmVyICphYikgewotICAgIEJ1ZmZlckl0ZW0gYmk7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUNvbnN1bWVyLT5hY3F1aXJlQnVmZmVyKCZiaSwgMCk7Ci0gICAgaWYgKGVyciA9PSBCdWZmZXJRdWV1ZTo6Tk9fQlVGRkVSX0FWQUlMQUJMRSkgewotICAgICAgICAvLyBzaG91bGRuJ3QgaGFwcGVuCi0gICAgICAgIEFMT0dXKCJhY3F1aXJlQnVmZmVyX2w6IGZyYW1lIHdhcyBub3QgYXZhaWxhYmxlIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR1coImFjcXVpcmVCdWZmZXJfbDogZmFpbGVkIHdpdGggZXJyPSVkIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgLS1tTnVtQXZhaWxhYmxlVW5hY3F1aXJlZEJ1ZmZlcnM7Ci0KLSAgICAvLyBNYW5hZ2Ugb3VyIGJ1ZmZlciBjYWNoZS4KLSAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FjaGVkQnVmZmVyPiBidWZmZXI7Ci0gICAgc3NpemVfdCBic2kgPSBtQnVmZmVyU2xvdHMuaW5kZXhPZktleShiaS5tU2xvdCk7Ci0gICAgaWYgKGJpLm1HcmFwaGljQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgLy8gcmVwbGFjZS9pbml0aWFsaXplIHNsb3Qgd2l0aCBuZXcgYnVmZmVyCi0gICAgICAgIEFMT0dWKCJhY3F1aXJlQnVmZmVyX2w6ICVzIGJ1ZmZlciBzbG90ICVkIiwgYnNpIDwgMCA/ICJzZXR0aW5nIiA6ICJVUERBVElORyIsIGJpLm1TbG90KTsKLSAgICAgICAgaWYgKGJzaSA+PSAwKSB7Ci0gICAgICAgICAgICBkaXNjYXJkQnVmZmVyQXRTbG90SW5kZXhfbChic2kpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnNpID0gbUJ1ZmZlclNsb3RzLmFkZChiaS5tU2xvdCwgbnVsbHB0cik7Ci0gICAgICAgIH0KLSAgICAgICAgYnVmZmVyID0gc3RkOjptYWtlX3NoYXJlZDxDYWNoZWRCdWZmZXI+KGJpLm1TbG90LCBiaS5tR3JhcGhpY0J1ZmZlcik7Ci0gICAgICAgIG1CdWZmZXJTbG90cy5yZXBsYWNlVmFsdWVBdChic2ksIGJ1ZmZlcik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYnVmZmVyID0gbUJ1ZmZlclNsb3RzLnZhbHVlQXQoYnNpKTsKLSAgICB9Ci0gICAgaW50NjRfdCBmcmFtZU51bSA9IGJpLm1GcmFtZU51bWJlcjsKLQotICAgIHN0ZDo6c2hhcmVkX3B0cjxBY3F1aXJlZEJ1ZmZlcj4gYWNxdWlyZWRCdWZmZXIgPQotICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEFjcXVpcmVkQnVmZmVyPigKLSAgICAgICAgICAgICAgICBidWZmZXIsCi0gICAgICAgICAgICAgICAgW2ZyYW1lTnVtLCB0aGlzXShBY3F1aXJlZEJ1ZmZlciAqYnVmZmVyKXsKLSAgICAgICAgICAgICAgICAgICAgLy8gQWNxdWlyZWRCdWZmZXIncyBkZXN0cnVjdG9yIHNob3VsZCBhbHdheXMgYmUgY2FsbGVkIHdoZW4gbU11dGV4IGlzIGxvY2tlZC4KLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGFkIGEgcmVlbnRyYW50IG11dGV4LCB3ZSBjb3VsZCBqdXN0IGxvY2sgaXQgYWdhaW4gdG8gZW5zdXJlIHRoaXMuCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTXV0ZXgudHJ5TG9jaygpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRSRVNQQVNTX0RCRygpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU11dGV4LnVubG9jaygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2FuIHJlbGVhc2UgYnVmZmVycyBpbW1lZGlhdGVseSBpZiBub3QgdXNpbmcgYWRhcHRlcnMKLSAgICAgICAgICAgICAgICAgICAgLy8gYWx0ZXJuYXRlbHksIHdlIGNvdWxkIGFkZCB0aGVtIHRvIG1TbG90c1RvUmVsZWFzZSwgYnV0IHdlIHdvdWxkCi0gICAgICAgICAgICAgICAgICAgIC8vIHNvbWVob3cgbmVlZCB0byBwcm9wYWdhdGUgZnJhbWUgbnVtYmVyIHRvIHRoYXQgcXVldWUKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlci0+aXNDYWNoZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLS1tTnVtT3V0c3RhbmRpbmdBY3F1aXJlczsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5nZXRTbG90KCksIGZyYW1lTnVtLCBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NZTkNfS0hSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXItPmdldFJlbGVhc2VGZW5jZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgYmkubUZlbmNlKTsKLSAgICBWaWRlb0J1ZmZlciB2aWRlb0J1ZmZlcnthY3F1aXJlZEJ1ZmZlciwgYmkubVRpbWVzdGFtcCwgYmkubURhdGFTcGFjZX07Ci0gICAgKmFiID0gdmlkZW9CdWZmZXI7Ci0gICAgKyttTnVtT3V0c3RhbmRpbmdBY3F1aXJlczsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIGNhbGxiYWNrCi12b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6Om9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgaXRlbSBfX3VudXNlZCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwotCi0gICAgQUxPR1YoIm9uRnJhbWVBdmFpbGFibGU6IGV4ZWN1dGluZz0lZCBhdmFpbGFibGU9JXp1KyVkIiwKLSAgICAgICAgICAgIG1FeGVjdXRpbmcsIG1BdmFpbGFibGVCdWZmZXJzLnNpemUoKSwgbU51bUF2YWlsYWJsZVVuYWNxdWlyZWRCdWZmZXJzKTsKLSAgICArK21OdW1BdmFpbGFibGVVbmFjcXVpcmVkQnVmZmVyczsKLQotICAgIC8vIEZvciBCdWZmZXJRdWV1ZSB3ZSBjYW5ub3QgYWNxdWlyZSBhIGJ1ZmZlciBpZiB3ZSBjYW5ub3QgaW1tZWRpYXRlbHkgZmVlZCBpdCB0byB0aGUgY29kZWMKLSAgICAvLyBVTkxFU1Mgd2UgYXJlIGRpc2NhcmRpbmcgdGhpcyBidWZmZXIgKGFjcXVpcmluZyBhbmQgaW1tZWRpYXRlbHkgcmVsZWFzaW5nIGl0KSwgd2hpY2ggbWFrZXMKLSAgICAvLyB0aGlzIGFuIHVnbHkgbG9naWMuCi0gICAgLy8gTk9URTogV2UgY291bGQgYWxzbyByZWx5IG9uIG91ciBkZWJ1ZyBjb3VudGVyIGJ1dCB0aGF0IGlzIG1lYW50IG9ubHkgYXMgYSBkZWJ1ZyBjb3VudGVyLgotICAgIGlmICghYXJlV2VEaXNjYXJkaW5nQXZhaWxhYmxlQnVmZmVyc19sKCkgJiYgbUZyZWVDb2RlY0J1ZmZlcnMuZW1wdHkoKSkgewotICAgICAgICAvLyB3ZSBtYXkgbm90IGJlIGFsbG93ZWQgdG8gYWNxdWlyZSBhIHBvc3NpYmx5IGVuY29kYWJsZSBidWZmZXIsIHNvIGp1c3Qgbm90ZSB0aGF0Ci0gICAgICAgIC8vIGl0IGlzIGF2YWlsYWJsZQotICAgICAgICBBTE9HVigib25GcmFtZUF2YWlsYWJsZTogY2Fubm90IGFjcXVpcmUgYnVmZmVyIHJpZ2h0IG5vdywgZG8gaXQgbGF0ZXIiKTsKLQotICAgICAgICArK21SZXBlYXRMYXN0RnJhbWVHZW5lcmF0aW9uOyAvLyBjYW5jZWwgYW55IHBlbmRpbmcgZnJhbWUgcmVwZWF0Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBWaWRlb0J1ZmZlciBidWZmZXI7Ci0gICAgc3RhdHVzX3QgZXJyID0gYWNxdWlyZUJ1ZmZlcl9sKCZidWZmZXIpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIm9uRnJhbWVBdmFpbGFibGU6IGFjcXVpcmVCdWZmZXIgcmV0dXJuZWQgZXJyPSVkIiwgZXJyKTsKLSAgICB9IGVsc2UgewotICAgICAgICBvbkJ1ZmZlckFjcXVpcmVkX2woYnVmZmVyKTsKLSAgICB9Ci19Ci0KLWJvb2wgR3JhcGhpY0J1ZmZlclNvdXJjZTo6YXJlV2VEaXNjYXJkaW5nQXZhaWxhYmxlQnVmZmVyc19sKCkgewotICAgIHJldHVybiBtRW5kT2ZTdHJlYW1TZW50IC8vIGFscmVhZHkgc2VudCBFT1MgdG8gY29kZWMKLSAgICAgICAgICAgIHx8IG1PTVhOb2RlID09IG51bGxwdHIgLy8gdGhlcmUgaXMgbm8gY29kZWMgY29ubmVjdGVkCi0gICAgICAgICAgICB8fCAobVN1c3BlbmRlZCAmJiBtQWN0aW9uUXVldWUuZW1wdHkoKSkgLy8gd2UgYXJlIHN1c3BlbmRlZCBhbmQgbm90IHdhaXRpbmcgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW55IGZ1cnRoZXIgYWN0aW9uCi0gICAgICAgICAgICB8fCAhbUV4ZWN1dGluZzsKLX0KLQotdm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpvbkJ1ZmZlckFjcXVpcmVkX2woY29uc3QgVmlkZW9CdWZmZXIgJmJ1ZmZlcikgewotICAgIGlmIChtRW5kT2ZTdHJlYW1TZW50KSB7Ci0gICAgICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgcG9zc2libGUgaWYgYSBuZXcgYnVmZmVyIHdhcyBxdWV1ZWQgYWZ0ZXIKLSAgICAgICAgLy8gRU9TIHdhcyBzaWduYWxlZCwgaS5lLiB0aGUgYXBwIGlzIG1pc2JlaGF2aW5nLgotICAgICAgICBBTE9HVygib25GcmFtZUF2YWlsYWJsZTogRU9TIGlzIHNlbnQsIGlnbm9yaW5nIGZyYW1lIik7Ci0gICAgfSBlbHNlIGlmIChtT01YTm9kZSA9PSBOVUxMIHx8IChtU3VzcGVuZGVkICYmIG1BY3Rpb25RdWV1ZS5lbXB0eSgpKSkgewotICAgICAgICAvLyBGSVhNRTogaWYgd2UgYXJlIHN1c3BlbmRlZCBidXQgaGF2ZSBhIHJlc3VtZSBxdWV1ZWQgd2Ugd2lsbCBzdG9wIHJlcGVhdGluZyB0aGUgbGFzdAotICAgICAgICAvLyBmcmFtZS4gSXMgdGhhdCB0aGUgZGVzaXJlZCBiZWhhdmlvcj8KLSAgICAgICAgQUxPR1YoIm9uRnJhbWVBdmFpbGFibGU6IHN1c3BlbmRlZCwgaWdub3JpbmcgZnJhbWUiKTsKLSAgICB9IGVsc2UgewotICAgICAgICArK21SZXBlYXRMYXN0RnJhbWVHZW5lcmF0aW9uOyAvLyBjYW5jZWwgYW55IHBlbmRpbmcgZnJhbWUgcmVwZWF0Ci0gICAgICAgIG1BdmFpbGFibGVCdWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOwotICAgICAgICBpZiAobUV4ZWN1dGluZykgewotICAgICAgICAgICAgZmlsbENvZGVjQnVmZmVyX2woKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gQnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXIgY2FsbGJhY2sKLXZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6b25CdWZmZXJzUmVsZWFzZWQoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLQotICAgIHVpbnQ2NF90IHNsb3RNYXNrOwotICAgIHVpbnQ2NF90IHJlbGVhc2VNYXNrOwotICAgIGlmIChtQ29uc3VtZXItPmdldFJlbGVhc2VkQnVmZmVycygmcmVsZWFzZU1hc2spICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHNsb3RNYXNrID0gMHhmZmZmZmZmZmZmZmZmZmZmVUxMOwotICAgICAgICBBTE9HVygib25CdWZmZXJzUmVsZWFzZWQ6IHVuYWJsZSB0byBnZXQgcmVsZWFzZWQgYnVmZmVyIHNldCIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNsb3RNYXNrID0gcmVsZWFzZU1hc2s7Ci0gICAgICAgIEFMT0dWKCJvbkJ1ZmZlcnNSZWxlYXNlZDogMHglMDE2IiBQUkl4NjQsIHNsb3RNYXNrKTsKLSAgICB9Ci0KLSAgICBBU3RyaW5nIHVucG9wdWxhdGVkOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQnVmZmVyUXVldWU6Ok5VTV9CVUZGRVJfU0xPVFM7IGkrKykgewotICAgICAgICBpZiAoKHNsb3RNYXNrICYgMHgwMSkgIT0gMCkgewotICAgICAgICAgICAgaWYgKCFkaXNjYXJkQnVmZmVySW5TbG90X2woaSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXVucG9wdWxhdGVkLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdW5wb3B1bGF0ZWQuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1bnBvcHVsYXRlZC5hcHBlbmQoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc2xvdE1hc2sgPj49IDE7Ci0gICAgfQotICAgIGlmICghdW5wb3B1bGF0ZWQuZW1wdHkoKSkgewotICAgICAgICBBTE9HVygicmVsZWFzZWQgdW5wb3B1bGF0ZWQgc2xvdHM6IFslc10iLCB1bnBvcHVsYXRlZC5jX3N0cigpKTsKLSAgICB9Ci19Ci0KLWJvb2wgR3JhcGhpY0J1ZmZlclNvdXJjZTo6ZGlzY2FyZEJ1ZmZlckluU2xvdF9sKEdyYXBoaWNCdWZmZXJTb3VyY2U6OnNsb3RfaWQgaSkgewotICAgIHNzaXplX3QgYnNpID0gbUJ1ZmZlclNsb3RzLmluZGV4T2ZLZXkoaSk7Ci0gICAgaWYgKGJzaSA8IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRpc2NhcmRCdWZmZXJBdFNsb3RJbmRleF9sKGJzaSk7Ci0gICAgICAgIG1CdWZmZXJTbG90cy5yZW1vdmVJdGVtc0F0KGJzaSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KLQotdm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpkaXNjYXJkQnVmZmVyQXRTbG90SW5kZXhfbChzc2l6ZV90IGJzaSkgewotICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDYWNoZWRCdWZmZXI+JiBidWZmZXIgPSBtQnVmZmVyU2xvdHMudmFsdWVBdChic2kpOwotICAgIC8vIHVzZSAtMiBpZiB0aGVyZSBpcyBubyBsYXRlc3QgYnVmZmVyLCBhbmQgLTEgaWYgaXQgaXMgbm8gbG9uZ2VyIGNhY2hlZAotICAgIHNsb3RfaWQgbGF0ZXN0QnVmZmVyU2xvdCA9Ci0gICAgICAgIG1MYXRlc3RCdWZmZXIubUJ1ZmZlciA9PSBudWxscHRyID8gLTIgOiBtTGF0ZXN0QnVmZmVyLm1CdWZmZXItPmdldFNsb3QoKTsKLSAgICBBTE9HVigicmVsZWFzaW5nIGFjcXVpcmVkIGJ1ZmZlcjogW3Nsb3Q9JWQsIHVzZUNvdW50PSVsZF0sIGxhdGVzdDogW3Nsb3Q9JWRdIiwKLSAgICAgICAgICAgIG1CdWZmZXJTbG90cy5rZXlBdChic2kpLCBidWZmZXIudXNlX2NvdW50KCksIGxhdGVzdEJ1ZmZlclNsb3QpOwotICAgIG1CdWZmZXJTbG90cy52YWx1ZUF0KGJzaSktPm9uRHJvcHBlZEZyb21DYWNoZSgpOwotCi0gICAgLy8gSWYgdGhlIHNsb3Qgb2YgYW4gYWNxdWlyZWQgYnVmZmVyIGlzIGRpc2NhcmRlZCwgdGhhdCBidWZmZXIgd2lsbCBub3QgaGF2ZSB0byBiZQotICAgIC8vIHJlbGVhc2VkIHRvIHRoZSBwcm9kdWNlciwgc28gYWNjb3VudCBpdCBoZXJlLiBIb3dldmVyLCBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZQotICAgIC8vIGFjcXVpcmVkIGJ1ZmZlciBoYXMgYWxyZWFkeSBiZWVuIGRpc2NhcmRlZCBzbyBjaGVjayBpZiBpdCBzdGlsbCBpcy4KLSAgICBpZiAoYnVmZmVyLT5pc0FjcXVpcmVkKCkpIHsKLSAgICAgICAgLS1tTnVtT3V0c3RhbmRpbmdBY3F1aXJlczsKLSAgICB9Ci0KLSAgICAvLyBjbGVhciB0aGUgYnVmZmVyIHJlZmVyZW5jZSAobm90IHRlY2huaWNhbGx5IG5lZWRlZCBhcyBjYWxsZXIgZWl0aGVyIHJlcGxhY2VzIG9yIGRlbGV0ZXMKLSAgICAvLyBpdDsgZG9uZSBoZXJlIGZvciBzYWZldHkpLgotICAgIG1CdWZmZXJTbG90cy5lZGl0VmFsdWVBdChic2kpLnJlc2V0KCk7Ci0gICAgQ0hFQ0tfREJHKGJ1ZmZlciA9PSBudWxscHRyKTsKLX0KLQotdm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpyZWxlYXNlQWxsQXZhaWxhYmxlQnVmZmVyc19sKCkgewotICAgIG1BdmFpbGFibGVCdWZmZXJzLmNsZWFyKCk7Ci0gICAgd2hpbGUgKG1OdW1BdmFpbGFibGVVbmFjcXVpcmVkQnVmZmVycyA+IDApIHsKLSAgICAgICAgVmlkZW9CdWZmZXIgaXRlbTsKLSAgICAgICAgaWYgKGFjcXVpcmVCdWZmZXJfbCgmaXRlbSkgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlQWxsQXZhaWxhYmxlQnVmZmVyczogZmFpbGVkIHRvIGFjcXVpcmUgYXZhaWxhYmxlIHVuYWNxdWlyZWQgYnVmZmVyIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gQnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXIgY2FsbGJhY2sKLXZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6b25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKSB7Ci0gICAgQUxPR19BU1NFUlQoZmFsc2UsICJHcmFwaGljQnVmZmVyU291cmNlIGNhbid0IGNvbnN1bWUgc2lkZWJhbmQgc3RyZWFtcyIpOwotfQotCi1zdGF0dXNfdCBHcmFwaGljQnVmZmVyU291cmNlOjpjb25maWd1cmUoCi0gICAgICAgIGNvbnN0IHNwPElPbXhOb2RlV3JhcHBlcj4mIG9teE5vZGUsCi0gICAgICAgIGludDMyX3QgZGF0YVNwYWNlLAotICAgICAgICBpbnQzMl90IGJ1ZmZlckNvdW50LAotICAgICAgICB1aW50MzJfdCBmcmFtZVdpZHRoLAotICAgICAgICB1aW50MzJfdCBmcmFtZUhlaWdodCwKLSAgICAgICAgdWludDMyX3QgY29uc3VtZXJVc2FnZSkgewotICAgIGlmIChvbXhOb2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLQotICAgIC8vIENhbGwgc2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudCB3aXRob3V0IGxvY2suCi0gICAgLy8gc2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudCBjb3VsZCBjYWxsIGJhY2sgdG8gb25CdWZmZXJzUmVsZWFzZWQKLSAgICAvLyBpZiB0aGUgYnVmZmVyIGNvdW50IGNoYW5nZSByZXN1bHRzIGluIHJlbGVhc2luZyBvZiBleGlzdGluZyBidWZmZXJzLAotICAgIC8vIHdoaWNoIHdvdWxkIGxlYWQgdG8gZGVhZGxvY2suCi0gICAgc3RhdHVzX3QgZXJyID0gbUNvbnN1bWVyLT5zZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KGJ1ZmZlckNvdW50KTsKLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IEJRIG1heCBhY3F1aXJlZCBidWZmZXIgY291bnQgdG8gJXU6ICVkIiwKLSAgICAgICAgICAgICAgICBidWZmZXJDb3VudCwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwotICAgICAgICBtT01YTm9kZSA9IG9teE5vZGU7Ci0KLSAgICAgICAgZXJyID0gbUNvbnN1bWVyLT5zZXREZWZhdWx0QnVmZmVyU2l6ZShmcmFtZVdpZHRoLCBmcmFtZUhlaWdodCk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IEJRIGRlZmF1bHQgYnVmZmVyIHNpemUgdG8gJXV4JXU6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgZnJhbWVXaWR0aCwgZnJhbWVIZWlnaHQsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3VtZXJVc2FnZSB8PSBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVI7Ci0gICAgICAgIG1Db25zdW1lci0+c2V0Q29uc3VtZXJVc2FnZUJpdHMoY29uc3VtZXJVc2FnZSk7Ci0KLSAgICAgICAgLy8gU2V0cyB0aGUgZGVmYXVsdCBidWZmZXIgZGF0YSBzcGFjZQotICAgICAgICBBTE9HRCgic2V0dGluZyBkYXRhc3BhY2U6ICUjeCwgYWNxdWlyZWQ9JWQiLCBkYXRhU3BhY2UsIG1OdW1PdXRzdGFuZGluZ0FjcXVpcmVzKTsKLSAgICAgICAgbUNvbnN1bWVyLT5zZXREZWZhdWx0QnVmZmVyRGF0YVNwYWNlKChhbmRyb2lkX2RhdGFzcGFjZSlkYXRhU3BhY2UpOwotICAgICAgICBtTGFzdERhdGFzcGFjZSA9IChhbmRyb2lkX2RhdGFzcGFjZSlkYXRhU3BhY2U7Ci0KLSAgICAgICAgbUV4ZWN1dGluZyA9IGZhbHNlOwotICAgICAgICBtU3VzcGVuZGVkID0gZmFsc2U7Ci0gICAgICAgIG1FbmRPZlN0cmVhbSA9IGZhbHNlOwotICAgICAgICBtRW5kT2ZTdHJlYW1TZW50ID0gZmFsc2U7Ci0gICAgICAgIG1Ta2lwRnJhbWVzQmVmb3JlTnMgPSAtMWxsOwotICAgICAgICBtRnJhbWVSZXBlYXRJbnRlcnZhbFVzID0gLTFsbDsKLSAgICAgICAgbVJlcGVhdExhc3RGcmFtZUdlbmVyYXRpb24gPSAwOwotICAgICAgICBtT3V0c3RhbmRpbmdGcmFtZVJlcGVhdENvdW50ID0gMDsKLSAgICAgICAgbUxhdGVzdEJ1ZmZlci5tQnVmZmVyLnJlc2V0KCk7Ci0gICAgICAgIG1GcmFtZVJlcGVhdEJsb2NrZWRPbkNvZGVjQnVmZmVyID0gZmFsc2U7Ci0gICAgICAgIG1GcHMgPSAtMS4wOwotICAgICAgICBtQ2FwdHVyZUZwcyA9IC0xLjA7Ci0gICAgICAgIG1CYXNlQ2FwdHVyZVVzID0gLTFsbDsKLSAgICAgICAgbUJhc2VGcmFtZVVzID0gLTFsbDsKLSAgICAgICAgbVByZXZDYXB0dXJlVXMgPSAtMWxsOwotICAgICAgICBtUHJldkZyYW1lVXMgPSAtMWxsOwotICAgICAgICBtRnJhbWVDb3VudCA9IDA7Ci0gICAgICAgIG1JbnB1dEJ1ZmZlclRpbWVPZmZzZXRVcyA9IDA7Ci0gICAgICAgIG1TdG9wVGltZVVzID0gLTE7Ci0gICAgICAgIG1BY3Rpb25RdWV1ZS5jbGVhcigpOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0U3VzcGVuZChib29sIHN1c3BlbmQsIGludDY0X3Qgc3VzcGVuZFN0YXJ0VGltZVVzKSB7Ci0gICAgQUxPR1YoInNldFN1c3BlbmQ9JWQgYXQgdGltZSAlbGxkIHVzIiwgc3VzcGVuZCwgKGxvbmcgbG9uZylzdXNwZW5kU3RhcnRUaW1lVXMpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7Ci0KLSAgICBpZiAobVN0b3BUaW1lVXMgIT0gLTEpIHsKLSAgICAgICAgQUxPR0UoInNldFN1c3BlbmQgZmFpbGVkIGFzIFNUT1AgYWN0aW9uIGlzIHBlbmRpbmciKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIC8vIFB1c2ggdGhlIGFjdGlvbiB0byB0aGUgcXVldWUuCi0gICAgaWYgKHN1c3BlbmRTdGFydFRpbWVVcyAhPSAtMSkgewotICAgICAgICAvLyBzdXNwZW5kU3RhcnRUaW1lVXMgbXVzdCBiZSBzbWFsbGVyIG9yIGVxdWFsIHRvIGN1cnJlbnQgc3lzdGVtVGltZS4KLSAgICAgICAgaW50NjRfdCBjdXJyZW50U3lzdGVtVGltZVVzID0gc3lzdGVtVGltZSgpIC8gMTAwMDsKLSAgICAgICAgaWYgKHN1c3BlbmRTdGFydFRpbWVVcyA+IGN1cnJlbnRTeXN0ZW1UaW1lVXMpIHsKLSAgICAgICAgICAgIEFMT0dFKCJzZXRTdXNwZW5kIGZhaWxlZC4gJWxsZCBpcyBsYXJnZXIgdGhhbiBjdXJyZW50IHN5c3RlbSB0aW1lICVsbGQgdXMiLAotICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXN1c3BlbmRTdGFydFRpbWVVcywgKGxvbmcgbG9uZyljdXJyZW50U3lzdGVtVGltZVVzKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgICAgICBpZiAobUxhc3RBY3Rpb25UaW1lVXMgIT0gLTEgJiYgc3VzcGVuZFN0YXJ0VGltZVVzIDwgbUxhc3RBY3Rpb25UaW1lVXMpIHsKLSAgICAgICAgICAgIEFMT0dFKCJzZXRTdXNwZW5kIGZhaWxlZC4gJWxsZCBpcyBzbWFsbGVyIHRoYW4gbGFzdCBhY3Rpb24gdGltZSAlbGxkIHVzIiwKLSAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzdXNwZW5kU3RhcnRUaW1lVXMsIChsb25nIGxvbmcpbUxhc3RBY3Rpb25UaW1lVXMpOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgICAgIG1MYXN0QWN0aW9uVGltZVVzID0gc3VzcGVuZFN0YXJ0VGltZVVzOwotICAgICAgICBBY3Rpb25JdGVtIGFjdGlvbjsKLSAgICAgICAgYWN0aW9uLm1BY3Rpb24gPSBzdXNwZW5kID8gQWN0aW9uSXRlbTo6UEFVU0UgOiBBY3Rpb25JdGVtOjpSRVNVTUU7Ci0gICAgICAgIGFjdGlvbi5tQWN0aW9uVGltZVVzID0gc3VzcGVuZFN0YXJ0VGltZVVzOwotICAgICAgICBBTE9HVigiUHVzaCAlcyBhY3Rpb24gaW50byBhY3Rpb25RdWV1ZSIsIHN1c3BlbmQgPyAiUEFVU0UiIDogIlJFU1VNRSIpOwotICAgICAgICBtQWN0aW9uUXVldWUucHVzaF9iYWNrKGFjdGlvbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHN1c3BlbmQpIHsKLSAgICAgICAgICAgIG1TdXNwZW5kZWQgPSB0cnVlOwotICAgICAgICAgICAgcmVsZWFzZUFsbEF2YWlsYWJsZUJ1ZmZlcnNfbCgpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVN1c3BlbmRlZCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKG1FeGVjdXRpbmcgJiYgIWhhdmVBdmFpbGFibGVCdWZmZXJzX2woKQotICAgICAgICAgICAgICAgICAgICAmJiBtRnJhbWVSZXBlYXRCbG9ja2VkT25Db2RlY0J1ZmZlcikgewotICAgICAgICAgICAgICAgIGlmIChyZXBlYXRMYXRlc3RCdWZmZXJfbCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzdXNwZW5kL2RlZmVycmVkIHJlcGVhdExhdGVzdEJ1ZmZlcl9sIFNVQ0NFU1MiKTsKLSAgICAgICAgICAgICAgICAgICAgbUZyYW1lUmVwZWF0QmxvY2tlZE9uQ29kZWNCdWZmZXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigic3VzcGVuZC9kZWZlcnJlZCByZXBlYXRMYXRlc3RCdWZmZXJfbCBGQUlMVVJFIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0UmVwZWF0UHJldmlvdXNGcmFtZURlbGF5VXMoaW50NjRfdCByZXBlYXRBZnRlclVzKSB7Ci0gICAgQUxPR1YoInNldFJlcGVhdFByZXZpb3VzRnJhbWVEZWxheVVzOiBkZWxheVVzPSVsbGQiLCAobG9uZyBsb25nKXJlcGVhdEFmdGVyVXMpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7Ci0KLSAgICBpZiAobUV4ZWN1dGluZyB8fCByZXBlYXRBZnRlclVzIDw9IDBsbCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgbUZyYW1lUmVwZWF0SW50ZXJ2YWxVcyA9IHJlcGVhdEFmdGVyVXM7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBHcmFwaGljQnVmZmVyU291cmNlOjpzZXRUaW1lT2Zmc2V0VXMoaW50NjRfdCB0aW1lT2Zmc2V0VXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKLQotICAgIC8vIHRpbWVPZmZzZXRVcyBtdXN0IGJlIG5lZ2F0aXZlIGZvciBhZGp1c3RtZW50LgotICAgIGlmICh0aW1lT2Zmc2V0VXMgPj0gMGxsKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBtSW5wdXRCdWZmZXJUaW1lT2Zmc2V0VXMgPSB0aW1lT2Zmc2V0VXM7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBHcmFwaGljQnVmZmVyU291cmNlOjpzZXRNYXhGcHMoZmxvYXQgbWF4RnBzKSB7Ci0gICAgQUxPR1YoInNldE1heEZwczogbWF4RnBzPSVsbGQiLCAobG9uZyBsb25nKW1heEZwcyk7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKLQotICAgIGlmIChtRXhlY3V0aW5nKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBtRnJhbWVEcm9wcGVyID0gbmV3IEZyYW1lRHJvcHBlcigpOwotICAgIHN0YXR1c190IGVyciA9IG1GcmFtZURyb3BwZXItPnNldE1heEZyYW1lUmF0ZShtYXhGcHMpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgbUZyYW1lRHJvcHBlci5jbGVhcigpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0U3RhcnRUaW1lVXMoaW50NjRfdCBza2lwRnJhbWVzQmVmb3JlVXMpIHsKLSAgICBBTE9HVigic2V0U3RhcnRUaW1lVXM6IHNraXBGcmFtZXNCZWZvcmVVcz0lbGxkIiwgKGxvbmcgbG9uZylza2lwRnJhbWVzQmVmb3JlVXMpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7Ci0KLSAgICBtU2tpcEZyYW1lc0JlZm9yZU5zID0KLSAgICAgICAgICAgIChza2lwRnJhbWVzQmVmb3JlVXMgPiAwKSA/IChza2lwRnJhbWVzQmVmb3JlVXMgKiAxMDAwKSA6IC0xbGw7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEdyYXBoaWNCdWZmZXJTb3VyY2U6OnNldFN0b3BUaW1lVXMoaW50NjRfdCBzdG9wVGltZVVzKSB7Ci0gICAgQUxPR1YoInNldFN0b3BUaW1lVXM6ICVsbGQgdXMiLCAobG9uZyBsb25nKXN0b3BUaW1lVXMpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwotCi0gICAgaWYgKG1TdG9wVGltZVVzICE9IC0xKSB7Ci0gICAgICAgIC8vIElnbm9yZSBpZiBzdG9wIHRpbWUgaGFzIGFscmVhZHkgYmVlbiBzZXQKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIC8vIHN0b3BUaW1lVXMgbXVzdCBiZSBzbWFsbGVyIG9yIGVxdWFsIHRvIGN1cnJlbnQgc3lzdGVtVGltZS4KLSAgICBpbnQ2NF90IGN1cnJlbnRTeXN0ZW1UaW1lVXMgPSBzeXN0ZW1UaW1lKCkgLyAxMDAwOwotICAgIGlmIChzdG9wVGltZVVzID4gY3VycmVudFN5c3RlbVRpbWVVcykgewotICAgICAgICBBTE9HRSgic2V0U3RvcFRpbWVVcyBmYWlsZWQuICVsbGQgaXMgbGFyZ2VyIHRoYW4gY3VycmVudCBzeXN0ZW0gdGltZSAlbGxkIHVzIiwKLSAgICAgICAgICAgIChsb25nIGxvbmcpc3RvcFRpbWVVcywgKGxvbmcgbG9uZyljdXJyZW50U3lzdGVtVGltZVVzKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBpZiAobUxhc3RBY3Rpb25UaW1lVXMgIT0gLTEgJiYgc3RvcFRpbWVVcyA8IG1MYXN0QWN0aW9uVGltZVVzKSB7Ci0gICAgICAgIEFMT0dFKCJzZXRTdXNwZW5kIGZhaWxlZC4gJWxsZCBpcyBzbWFsbGVyIHRoYW4gbGFzdCBhY3Rpb24gdGltZSAlbGxkIHVzIiwKLSAgICAgICAgICAgIChsb25nIGxvbmcpc3RvcFRpbWVVcywgKGxvbmcgbG9uZyltTGFzdEFjdGlvblRpbWVVcyk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgbUxhc3RBY3Rpb25UaW1lVXMgPSBzdG9wVGltZVVzOwotICAgIEFjdGlvbkl0ZW0gYWN0aW9uOwotICAgIGFjdGlvbi5tQWN0aW9uID0gQWN0aW9uSXRlbTo6U1RPUDsKLSAgICBhY3Rpb24ubUFjdGlvblRpbWVVcyA9IHN0b3BUaW1lVXM7Ci0gICAgbUFjdGlvblF1ZXVlLnB1c2hfYmFjayhhY3Rpb24pOwotICAgIG1TdG9wVGltZVVzID0gc3RvcFRpbWVVczsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEdyYXBoaWNCdWZmZXJTb3VyY2U6OmdldFN0b3BUaW1lT2Zmc2V0VXMoaW50NjRfdCAqc3RvcFRpbWVPZmZzZXRVcykgewotICAgIEFMT0dWKCJnZXRTdG9wVGltZU9mZnNldFVzIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7Ci0gICAgaWYgKG1TdG9wVGltZVVzID09IC0xKSB7Ci0gICAgICAgIEFMT0dXKCJGYWlsIHRvIHJldHVybiBzdG9wVGltZU9mZnNldFVzIGFzIHN0b3AgdGltZSBpcyBub3Qgc2V0Iik7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgKnN0b3BUaW1lT2Zmc2V0VXMgPQotICAgICAgICBtTGFzdEZyYW1lVGltZXN0YW1wVXMgPT0gLTEgPyAwIDogbVN0b3BUaW1lVXMgLSBtTGFzdEZyYW1lVGltZXN0YW1wVXM7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBHcmFwaGljQnVmZmVyU291cmNlOjpzZXRUaW1lTGFwc2VDb25maWcoZG91YmxlIGZwcywgZG91YmxlIGNhcHR1cmVGcHMpIHsKLSAgICBBTE9HVigic2V0VGltZUxhcHNlQ29uZmlnOiBmcHM9JWxnLCBjYXB0dXJlRnBzPSVsZyIsCi0gICAgICAgICAgICBmcHMsIGNhcHR1cmVGcHMpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwotCi0gICAgaWYgKG1FeGVjdXRpbmcgfHwgIShmcHMgPiAwKSB8fCAhKGNhcHR1cmVGcHMgPiAwKSkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgbUZwcyA9IGZwczsKLSAgICBtQ2FwdHVyZUZwcyA9IGNhcHR1cmVGcHM7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEdyYXBoaWNCdWZmZXJTb3VyY2U6OnNldENvbG9yQXNwZWN0cyhpbnQzMl90IGFzcGVjdHNQYWNrZWQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKLSAgICBtRGVmYXVsdENvbG9yQXNwZWN0c1BhY2tlZCA9IGFzcGVjdHNQYWNrZWQ7Ci0gICAgQ29sb3JBc3BlY3RzIGNvbG9yQXNwZWN0cyA9IENvbG9yVXRpbHM6OnVucGFja1RvQ29sb3JBc3BlY3RzKGFzcGVjdHNQYWNrZWQpOwotICAgIEFMT0dEKCJyZXF1ZXN0aW5nIGNvbG9yIGFzcGVjdHMgKFI6JWQoJXMpLCBQOiVkKCVzKSwgTTolZCglcyksIFQ6JWQoJXMpKSIsCi0gICAgICAgICAgICBjb2xvckFzcGVjdHMubVJhbmdlLCBhc1N0cmluZyhjb2xvckFzcGVjdHMubVJhbmdlKSwKLSAgICAgICAgICAgIGNvbG9yQXNwZWN0cy5tUHJpbWFyaWVzLCBhc1N0cmluZyhjb2xvckFzcGVjdHMubVByaW1hcmllcyksCi0gICAgICAgICAgICBjb2xvckFzcGVjdHMubU1hdHJpeENvZWZmcywgYXNTdHJpbmcoY29sb3JBc3BlY3RzLm1NYXRyaXhDb2VmZnMpLAotICAgICAgICAgICAgY29sb3JBc3BlY3RzLm1UcmFuc2ZlciwgYXNTdHJpbmcoY29sb3JBc3BlY3RzLm1UcmFuc2ZlcikpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBHcmFwaGljQnVmZmVyU291cmNlOjpzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwotICAgIEFMT0dWKCJzaWduYWxFbmRPZklucHV0U3RyZWFtOiBleGVjdXRpbmc9JWQgYXZhaWxhYmxlPSV6dSslZCBlb3M9JWQiLAotICAgICAgICAgICAgbUV4ZWN1dGluZywgbUF2YWlsYWJsZUJ1ZmZlcnMuc2l6ZSgpLCBtTnVtQXZhaWxhYmxlVW5hY3F1aXJlZEJ1ZmZlcnMsIG1FbmRPZlN0cmVhbSk7Ci0KLSAgICBpZiAobUVuZE9mU3RyZWFtKSB7Ci0gICAgICAgIEFMT0dFKCJFT1Mgd2FzIGFscmVhZHkgc2lnbmFsZWQiKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIC8vIFNldCB0aGUgZW5kLW9mLXN0cmVhbSBmbGFnLiAgSWYgbm8gZnJhbWVzIGFyZSBwZW5kaW5nIGZyb20gdGhlCi0gICAgLy8gQnVmZmVyUXVldWUsIGFuZCBhIGNvZGVjIGJ1ZmZlciBpcyBhdmFpbGFibGUsIGFuZCB3ZSdyZSBleGVjdXRpbmcsCi0gICAgLy8gYW5kIHRoZXJlIGlzIG5vIHN0b3AgdGltZXN0YW1wLCB3ZSBpbml0aWF0ZSB0aGUgRU9TIGZyb20gaGVyZS4KLSAgICAvLyBPdGhlcndpc2UsIHdlJ2xsIGxldCBjb2RlY0J1ZmZlckVtcHRpZWQoKSAob3Igb214RXhlY3V0aW5nKSBkbyBpdC4KLSAgICAvLwotICAgIC8vIE5vdGU6IGlmIHRoZXJlIGFyZSBubyBwZW5kaW5nIGZyYW1lcyBhbmQgYWxsIGNvZGVjIGJ1ZmZlcnMgYXJlCi0gICAgLy8gYXZhaWxhYmxlLCB3ZSAqbXVzdCogc3VibWl0IHRoZSBFT1MgZnJvbSBoZXJlIG9yIHdlJ2xsIGp1c3QKLSAgICAvLyBzdGFsbCBzaW5jZSBubyBmdXR1cmUgZXZlbnRzIGFyZSBleHBlY3RlZC4KLSAgICBtRW5kT2ZTdHJlYW0gPSB0cnVlOwotCi0gICAgaWYgKG1TdG9wVGltZVVzID09IC0xICYmIG1FeGVjdXRpbmcgJiYgIWhhdmVBdmFpbGFibGVCdWZmZXJzX2woKSkgewotICAgICAgICBzdWJtaXRFbmRPZklucHV0U3RyZWFtX2woKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7Ci0gICAgICAgIGNhc2Uga1doYXRSZXBlYXRMYXN0RnJhbWU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwotCi0gICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IG1SZXBlYXRMYXN0RnJhbWVHZW5lcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgLy8gc3RhbGUKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFtRXhlY3V0aW5nIHx8IGhhdmVBdmFpbGFibGVCdWZmZXJzX2woKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBib29sIHN1Y2Nlc3MgPSByZXBlYXRMYXRlc3RCdWZmZXJfbCgpOwotICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigicmVwZWF0TGF0ZXN0QnVmZmVyX2wgU1VDQ0VTUyIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVigicmVwZWF0TGF0ZXN0QnVmZmVyX2wgRkFJTFVSRSIpOwotICAgICAgICAgICAgICAgIG1GcmFtZVJlcGVhdEJsb2NrZWRPbkNvZGVjQnVmZmVyID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDljNDAxOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiT01YIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8ZGxmY24uaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVguaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L0JXR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIG5vZGUgaWRzIGFyZSBjcmVhdGVkIGJ5IGNvbmNhdGVuYXRpbmcgdGhlIHBpZCB3aXRoIGEgMTYtYml0IGNvdW50ZXIKLXN0YXRpYyBzaXplX3Qga01heE5vZGVJbnN0YW5jZXMgPSAoMSA8PCAxNik7Ci0KLU9NWDo6T01YKCkgOiBtTWFzdGVyKG5ldyBPTVhNYXN0ZXIpLCBtUGFyc2VyKCkgewotfQotCi1PTVg6On5PTVgoKSB7Ci0gICAgZGVsZXRlIG1NYXN0ZXI7Ci0gICAgbU1hc3RlciA9IE5VTEw7Ci19Ci0KLXZvaWQgT01YOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ0aGVfbGF0ZV93aG8pIHsKLSAgICBzcDxPTVhOb2RlSW5zdGFuY2U+IGluc3RhbmNlOwotCi0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgICAgIHNzaXplX3QgaW5kZXggPSBtTGl2ZU5vZGVzLmluZGV4T2ZLZXkodGhlX2xhdGVfd2hvKTsKLQotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiYi8yNzU5NzEwMywgbm9uZXhpc3RlbnQgb2JzZXJ2ZXIgb24gYmluZGVyRGllZCIpOwotICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzU5NzEwMyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5zdGFuY2UgPSBtTGl2ZU5vZGVzLmVkaXRWYWx1ZUF0KGluZGV4KTsKLSAgICAgICAgbUxpdmVOb2Rlcy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKLSAgICB9Ci0KLSAgICBpbnN0YW5jZS0+b25PYnNlcnZlckRpZWQoKTsKLX0KLQotc3RhdHVzX3QgT01YOjpsaXN0Tm9kZXMoTGlzdDxDb21wb25lbnRJbmZvPiAqbGlzdCkgewotICAgIGxpc3QtPmNsZWFyKCk7Ci0KLSAgICBPTVhfVTMyIGluZGV4ID0gMDsKLSAgICBjaGFyIGNvbXBvbmVudE5hbWVbMjU2XTsKLSAgICB3aGlsZSAobU1hc3Rlci0+ZW51bWVyYXRlQ29tcG9uZW50cygKLSAgICAgICAgICAgICAgICBjb21wb25lbnROYW1lLCBzaXplb2YoY29tcG9uZW50TmFtZSksIGluZGV4KSA9PSBPTVhfRXJyb3JOb25lKSB7Ci0gICAgICAgIGxpc3QtPnB1c2hfYmFjayhDb21wb25lbnRJbmZvKCkpOwotICAgICAgICBDb21wb25lbnRJbmZvICZpbmZvID0gKi0tbGlzdC0+ZW5kKCk7Ci0KLSAgICAgICAgaW5mby5tTmFtZSA9IGNvbXBvbmVudE5hbWU7Ci0KLSAgICAgICAgVmVjdG9yPFN0cmluZzg+IHJvbGVzOwotICAgICAgICBPTVhfRVJST1JUWVBFIGVyciA9Ci0gICAgICAgICAgICBtTWFzdGVyLT5nZXRSb2xlc09mQ29tcG9uZW50KGNvbXBvbmVudE5hbWUsICZyb2xlcyk7Ci0KLSAgICAgICAgaWYgKGVyciA9PSBPTVhfRXJyb3JOb25lKSB7Ci0gICAgICAgICAgICBmb3IgKE9NWF9VMzIgaSA9IDA7IGkgPCByb2xlcy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgICAgIGluZm8ubVJvbGVzLnB1c2hfYmFjayhyb2xlc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICArK2luZGV4OwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgT01YOjphbGxvY2F0ZU5vZGUoCi0gICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHNwPElPTVhPYnNlcnZlcj4gJm9ic2VydmVyLAotICAgICAgICBzcDxJT01YTm9kZT4gKm9teE5vZGUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgb214Tm9kZS0+Y2xlYXIoKTsKLQotICAgIGlmIChtTGl2ZU5vZGVzLnNpemUoKSA9PSBrTWF4Tm9kZUluc3RhbmNlcykgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLQotICAgIHNwPE9NWE5vZGVJbnN0YW5jZT4gaW5zdGFuY2UgPSBuZXcgT01YTm9kZUluc3RhbmNlKHRoaXMsIG9ic2VydmVyLCBuYW1lKTsKLQotICAgIE9NWF9DT01QT05FTlRUWVBFICpoYW5kbGU7Ci0gICAgT01YX0VSUk9SVFlQRSBlcnIgPSBtTWFzdGVyLT5tYWtlQ29tcG9uZW50SW5zdGFuY2UoCi0gICAgICAgICAgICBuYW1lLCAmT01YTm9kZUluc3RhbmNlOjprQ2FsbGJhY2tzLAotICAgICAgICAgICAgaW5zdGFuY2UuZ2V0KCksICZoYW5kbGUpOwotCi0gICAgaWYgKGVyciAhPSBPTVhfRXJyb3JOb25lKSB7Ci0gICAgICAgIEFMT0dFKCJGQUlMRUQgdG8gYWxsb2NhdGUgb214IGNvbXBvbmVudCAnJXMnIGVycj0lcyglI3gpIiwgbmFtZSwgYXNTdHJpbmcoZXJyKSwgZXJyKTsKLQotICAgICAgICByZXR1cm4gU3RhdHVzRnJvbU9NWEVycm9yKGVycik7Ci0gICAgfQotICAgIGluc3RhbmNlLT5zZXRIYW5kbGUoaGFuZGxlKTsKLQotICAgIC8vIEZpbmQgcXVpcmtzIGZyb20gbVBhcnNlcgotICAgIGNvbnN0IGF1dG8mIGNvZGVjID0gbVBhcnNlci5nZXRDb2RlY01hcCgpLmZpbmQobmFtZSk7Ci0gICAgaWYgKGNvZGVjID09IG1QYXJzZXIuZ2V0Q29kZWNNYXAoKS5jZW5kKCkpIHsKLSAgICAgICAgQUxPR1coIkZhaWxlZCB0byBvYnRhaW4gcXVpcmtzIGZvciBvbXggY29tcG9uZW50ICclcycgZnJvbSBYTUwgZmlsZXMiLAotICAgICAgICAgICAgICAgIG5hbWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHVpbnQzMl90IHF1aXJrcyA9IDA7Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byYgcXVpcmsgOiBjb2RlYy0+c2Vjb25kLnF1aXJrU2V0KSB7Ci0gICAgICAgICAgICBpZiAocXVpcmsgPT0gInJlcXVpcmVzLWFsbG9jYXRlLW9uLWlucHV0LXBvcnRzIikgewotICAgICAgICAgICAgICAgIHF1aXJrcyB8PSBPTVhOb2RlSW5zdGFuY2U6OgotICAgICAgICAgICAgICAgICAgICAgICAga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbklucHV0UG9ydHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocXVpcmsgPT0gInJlcXVpcmVzLWFsbG9jYXRlLW9uLW91dHB1dC1wb3J0cyIpIHsKLSAgICAgICAgICAgICAgICBxdWlya3MgfD0gT01YTm9kZUluc3RhbmNlOjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25PdXRwdXRQb3J0czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnN0YW5jZS0+c2V0UXVpcmtzKHF1aXJrcyk7Ci0gICAgfQotCi0gICAgbUxpdmVOb2Rlcy5hZGQoSUludGVyZmFjZTo6YXNCaW5kZXIob2JzZXJ2ZXIpLCBpbnN0YW5jZSk7Ci0gICAgSUludGVyZmFjZTo6YXNCaW5kZXIob2JzZXJ2ZXIpLT5saW5rVG9EZWF0aCh0aGlzKTsKLQotICAgICpvbXhOb2RlID0gaW5zdGFuY2U7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE9NWDo6ZnJlZU5vZGUoY29uc3Qgc3A8T01YTm9kZUluc3RhbmNlPiAmaW5zdGFuY2UpIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUxpdmVOb2Rlcy5pbmRleE9mS2V5KElJbnRlcmZhY2U6OmFzQmluZGVyKGluc3RhbmNlLT5vYnNlcnZlcigpKSk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIC8vIFRoaXMgY291bGQgY29uY2VpdmFibHkgaGFwcGVuIGlmIHRoZSBvYnNlcnZlciBkaWVzIGF0IHJvdWdobHkgdGhlCi0gICAgICAgICAgICAvLyBzYW1lIHRpbWUgdGhhdCBhIGNsaWVudCBhdHRlbXB0cyB0byBmcmVlIHRoZSBub2RlIGV4cGxpY2l0bHkuCi0KLSAgICAgICAgICAgIC8vIE5PVEU6IGl0J3MgZ3VhcmFudGVlZCB0aGF0IHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdCBtb3N0IG9uY2UgcGVyCi0gICAgICAgICAgICAvLyAgICAgICBpbnN0YW5jZS4KLSAgICAgICAgICAgIEFMT0dWKCJmcmVlTm9kZTogaW5zdGFuY2UgYWxyZWFkeSByZW1vdmVkIGZyb20gYm9vay1rZWVwaW5nLiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUxpdmVOb2Rlcy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKLSAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGluc3RhbmNlLT5vYnNlcnZlcigpKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIENIRUNLKGluc3RhbmNlLT5oYW5kbGUoKSAhPSBOVUxMKTsKLSAgICBPTVhfRVJST1JUWVBFIGVyciA9IG1NYXN0ZXItPmRlc3Ryb3lDb21wb25lbnRJbnN0YW5jZSgKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PE9NWF9DT01QT05FTlRUWVBFICo+KGluc3RhbmNlLT5oYW5kbGUoKSkpOwotICAgIEFMT0dWKCJmcmVlTm9kZTogaGFuZGxlIGRlc3Ryb3llZDogJXAiLCBpbnN0YW5jZS0+aGFuZGxlKCkpOwotCi0gICAgcmV0dXJuIFN0YXR1c0Zyb21PTVhFcnJvcihlcnIpOwotfQotCi1zdGF0dXNfdCBPTVg6OmNyZWF0ZUlucHV0U3VyZmFjZSgKLSAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKmJ1ZmZlclByb2R1Y2VyLAotICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclNvdXJjZT4gKmJ1ZmZlclNvdXJjZSkgewotICAgIGlmIChidWZmZXJQcm9kdWNlciA9PSBOVUxMIHx8IGJ1ZmZlclNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJiLzI1ODg0MDU2Iik7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gZ3JhcGhpY0J1ZmZlclNvdXJjZSA9IG5ldyBHcmFwaGljQnVmZmVyU291cmNlKCk7Ci0gICAgc3RhdHVzX3QgZXJyID0gZ3JhcGhpY0J1ZmZlclNvdXJjZS0+aW5pdENoZWNrKCk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBwZXJzaXN0ZW50IGlucHV0IHN1cmZhY2U6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgICpidWZmZXJQcm9kdWNlciA9IGdyYXBoaWNCdWZmZXJTb3VyY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKTsKLSAgICAqYnVmZmVyU291cmNlID0gbmV3IEJXR3JhcGhpY0J1ZmZlclNvdXJjZShncmFwaGljQnVmZmVyU291cmNlKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5jcHAKaW5kZXggZmQ5N2ZkYy4uMDk2N2I1ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5jcHAKQEAgLTIyLDYgKzIyLDggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAKKyNpbmNsdWRlIDx2bmRrc3VwcG9ydC9saW5rZXIuaD4KKwogI2luY2x1ZGUgPGRsZmNuLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KIApAQCAtNjcsNyArNjksNyBAQAogfQogCiB2b2lkIE9NWE1hc3Rlcjo6YWRkUGx1Z2luKGNvbnN0IGNoYXIgKmxpYm5hbWUpIHsKLSAgICBtVmVuZG9yTGliSGFuZGxlID0gZGxvcGVuKGxpYm5hbWUsIFJUTERfTk9XKTsKKyAgICBtVmVuZG9yTGliSGFuZGxlID0gYW5kcm9pZF9sb2FkX3NwaGFsX2xpYnJhcnkobGlibmFtZSwgUlRMRF9OT1cpOwogCiAgICAgaWYgKG1WZW5kb3JMaWJIYW5kbGUgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCmluZGV4IDRmMzhkZWUuLjIyN2QzM2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCkBAIC0zNDQsNyArMzQ0LDcgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIE9NWE5vZGVJbnN0YW5jZTo6T01YTm9kZUluc3RhbmNlKAotICAgICAgICBPbXhOb2RlT3duZXIgKm93bmVyLCBjb25zdCBzcDxJT01YT2JzZXJ2ZXI+ICZvYnNlcnZlciwgY29uc3QgY2hhciAqbmFtZSkKKyAgICAgICAgT214ICpvd25lciwgY29uc3Qgc3A8SU9NWE9ic2VydmVyPiAmb2JzZXJ2ZXIsIGNvbnN0IGNoYXIgKm5hbWUpCiAgICAgOiBtT3duZXIob3duZXIpLAogICAgICAgbUhhbmRsZShOVUxMKSwKICAgICAgIG1PYnNlcnZlcihvYnNlcnZlciksCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ1MzM2ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIk9NWFN0b3JlIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1uYW1lc3BhY2UgewotICAgIHN0cnVjdCBSb2xlUHJvcGVydGllcyB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHR5cGU7Ci0gICAgICAgIGJvb2wgaXNFbmNvZGVyOwotICAgICAgICBib29sIHByZWZlclBsYXRmb3JtTm9kZXM7Ci0gICAgICAgIHN0ZDo6bXVsdGltYXA8c2l6ZV90LCBJT01YU3RvcmU6Ok5vZGVJbmZvPiBub2RlTGlzdDsKLSAgICB9OwotfSAgLy8gVW5uYW1lZCBuYW1lc3BhY2UKLQotT01YU3RvcmU6Ok9NWFN0b3JlKAotICAgICAgICBjb25zdCBjaGFyKiBvd25lciwKLSAgICAgICAgY29uc3QgY2hhciogY29uc3QqIHNlYXJjaERpcnMsCi0gICAgICAgIGNvbnN0IGNoYXIqIG1haW5YbWxOYW1lLAotICAgICAgICBjb25zdCBjaGFyKiBwZXJmb3JtYW5jZVhtbE5hbWUsCi0gICAgICAgIGNvbnN0IGNoYXIqIHByb2ZpbGluZ1Jlc3VsdHNYbWxQYXRoKSB7Ci0gICAgTWVkaWFDb2RlY3NYbWxQYXJzZXIgcGFyc2VyKAotICAgICAgICAgICAgc2VhcmNoRGlycywKLSAgICAgICAgICAgIG1haW5YbWxOYW1lLAotICAgICAgICAgICAgcGVyZm9ybWFuY2VYbWxOYW1lLAotICAgICAgICAgICAgcHJvZmlsaW5nUmVzdWx0c1htbFBhdGgpOwotICAgIG1QYXJzaW5nU3RhdHVzID0gcGFyc2VyLmdldFBhcnNpbmdTdGF0dXMoKTsKLQotICAgIGNvbnN0IGF1dG8mIHNlcnZpY2VBdHRyaWJ1dGVNYXAgPSBwYXJzZXIuZ2V0U2VydmljZUF0dHJpYnV0ZU1hcCgpOwotICAgIG1TZXJ2aWNlQXR0cmlidXRlTGlzdC5yZXNlcnZlKHNlcnZpY2VBdHRyaWJ1dGVNYXAuc2l6ZSgpKTsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGF0dHJpYnV0ZVBhaXIgOiBzZXJ2aWNlQXR0cmlidXRlTWFwKSB7Ci0gICAgICAgIEF0dHJpYnV0ZSBhdHRyaWJ1dGU7Ci0gICAgICAgIGF0dHJpYnV0ZS5rZXkgPSBhdHRyaWJ1dGVQYWlyLmZpcnN0OwotICAgICAgICBhdHRyaWJ1dGUudmFsdWUgPSBhdHRyaWJ1dGVQYWlyLnNlY29uZDsKLSAgICAgICAgbVNlcnZpY2VBdHRyaWJ1dGVMaXN0LnB1c2hfYmFjayhzdGQ6Om1vdmUoYXR0cmlidXRlKSk7Ci0gICAgfQotCi0gICAgY29uc3QgYXV0byYgcm9sZU1hcCA9IHBhcnNlci5nZXRSb2xlTWFwKCk7Ci0gICAgbVJvbGVMaXN0LnJlc2VydmUocm9sZU1hcC5zaXplKCkpOwotICAgIGZvciAoY29uc3QgYXV0byYgcm9sZVBhaXIgOiByb2xlTWFwKSB7Ci0gICAgICAgIFJvbGVJbmZvIHJvbGU7Ci0gICAgICAgIHJvbGUucm9sZSA9IHJvbGVQYWlyLmZpcnN0OwotICAgICAgICByb2xlLnR5cGUgPSByb2xlUGFpci5zZWNvbmQudHlwZTsKLSAgICAgICAgcm9sZS5pc0VuY29kZXIgPSByb2xlUGFpci5zZWNvbmQuaXNFbmNvZGVyOwotICAgICAgICAvLyBUT0RPOiBDdXJyZW50bHksIHByZWZlclBsYXRmb3JtTm9kZXMgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSBpbgotICAgICAgICAvLyB0aGUgeG1sIGZpbGUuIE9uY2Ugd2UgaGF2ZSBhIHdheSB0byBwcm92aWRlIHRoaXMgaW5mb3JtYXRpb24sIGl0Ci0gICAgICAgIC8vIHNob3VsZCBiZSBwYXJzZWQgcHJvcGVybHkuCi0gICAgICAgIHJvbGUucHJlZmVyUGxhdGZvcm1Ob2RlcyA9IHJvbGVQYWlyLmZpcnN0LmNvbXBhcmUoMCwgNSwgImF1ZGlvIikgPT0gMDsKLSAgICAgICAgc3RkOjp2ZWN0b3I8Tm9kZUluZm8+JiBub2RlTGlzdCA9IHJvbGUubm9kZXM7Ci0gICAgICAgIG5vZGVMaXN0LnJlc2VydmUocm9sZVBhaXIuc2Vjb25kLm5vZGVMaXN0LnNpemUoKSk7Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byYgbm9kZVBhaXIgOiByb2xlUGFpci5zZWNvbmQubm9kZUxpc3QpIHsKLSAgICAgICAgICAgIE5vZGVJbmZvIG5vZGU7Ci0gICAgICAgICAgICBub2RlLm5hbWUgPSBub2RlUGFpci5zZWNvbmQubmFtZTsKLSAgICAgICAgICAgIG5vZGUub3duZXIgPSBvd25lcjsKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEF0dHJpYnV0ZT4mIGF0dHJpYnV0ZUxpc3QgPSBub2RlLmF0dHJpYnV0ZXM7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVMaXN0LnJlc2VydmUobm9kZVBhaXIuc2Vjb25kLmF0dHJpYnV0ZUxpc3Quc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgYXR0cmlidXRlUGFpciA6IG5vZGVQYWlyLnNlY29uZC5hdHRyaWJ1dGVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgQXR0cmlidXRlIGF0dHJpYnV0ZTsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGUua2V5ID0gYXR0cmlidXRlUGFpci5maXJzdDsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGUudmFsdWUgPSBhdHRyaWJ1dGVQYWlyLnNlY29uZDsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVMaXN0LnB1c2hfYmFjayhzdGQ6Om1vdmUoYXR0cmlidXRlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBub2RlTGlzdC5wdXNoX2JhY2soc3RkOjptb3ZlKG5vZGUpKTsKLSAgICAgICAgfQotICAgICAgICBtUm9sZUxpc3QucHVzaF9iYWNrKHN0ZDo6bW92ZShyb2xlKSk7Ci0gICAgfQotCi0gICAgbVByZWZpeCA9IHBhcnNlci5nZXRDb21tb25QcmVmaXgoKTsKLX0KLQotc3RhdHVzX3QgT01YU3RvcmU6Omxpc3RTZXJ2aWNlQXR0cmlidXRlcyhzdGQ6OnZlY3RvcjxBdHRyaWJ1dGU+KiBhdHRyaWJ1dGVzKSB7Ci0gICAgKmF0dHJpYnV0ZXMgPSBtU2VydmljZUF0dHJpYnV0ZUxpc3Q7Ci0gICAgcmV0dXJuIG1QYXJzaW5nU3RhdHVzOwotfQotCi1zdGF0dXNfdCBPTVhTdG9yZTo6Z2V0Tm9kZVByZWZpeChzdGQ6OnN0cmluZyogcHJlZml4KSB7Ci0gICAgKnByZWZpeCA9IG1QcmVmaXg7Ci0gICAgcmV0dXJuIG1QYXJzaW5nU3RhdHVzOwotfQotCi1zdGF0dXNfdCBPTVhTdG9yZTo6bGlzdFJvbGVzKHN0ZDo6dmVjdG9yPFJvbGVJbmZvPiogcm9sZUxpc3QpIHsKLSAgICAqcm9sZUxpc3QgPSBtUm9sZUxpc3Q7Ci0gICAgcmV0dXJuIG1QYXJzaW5nU3RhdHVzOwotfQotCi1zdGF0dXNfdCBPTVhTdG9yZTo6Z2V0T214KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBzcDxJT01YPiogb214KSB7Ci0gICAgKm9teCA9IG5ldyBPTVgoKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLU9NWFN0b3JlOjp+T01YU3RvcmUoKSB7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuY3BwCmluZGV4IDU4OTQ4MzcuLmY3YjU2OWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmNwcApAQCAtMjIsOSArMjIsOSBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MtYmFzZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0xNjMsNiArMTYzLDggQEAKICAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLmFjMyIsICJhdWRpb19lbmNvZGVyLmFjMyIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzLAogICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIuZWFjMyIsICJhdWRpb19lbmNvZGVyLmVhYzMiIH0sCisgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDLAorICAgICAgICAgICAgImltYWdlX2RlY29kZXIuaGVpYyIsICJpbWFnZV9lbmNvZGVyLmhlaWMiIH0sCiAgICAgfTsKIAogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga051bU1pbWVUb1JvbGUgPQpAQCAtMjE1LDYgKzIxNyw5IEBACiAgICAgICAgIGZtdCAhPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hciAmJgogICAgICAgICBmbXQgIT0gKE9NWF9DT0xPUl9GT1JNQVRUWVBFKUhBTF9QSVhFTF9GT1JNQVRfWVYxMikgewogICAgICAgICBBTE9HVygiZG8gbm90IGtub3cgY29sb3IgZm9ybWF0IDB4JXggPSAlZCIsIGZtdCwgZm10KTsKKyAgICAgICAgaWYgKGZtdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyMTYpIHsKKyAgICAgICAgICAgIEFMT0dXKCJDYW5ub3QgZGVzY3JpYmUgY29sb3IgZm9ybWF0IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNiIpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PbXhHcmFwaGljQnVmZmVyU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PbXhHcmFwaGljQnVmZmVyU291cmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGUxZjRmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09teEdyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2RlZmluZSBMT0dfVEFHICJPbXhHcmFwaGljQnVmZmVyU291cmNlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29tcG9uZW50V3JhcHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT214R3JhcGhpY0J1ZmZlclNvdXJjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE9teENvbXBvbmVudFdyYXBwZXIgOiBwdWJsaWMgQ29tcG9uZW50V3JhcHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgT214Q29tcG9uZW50V3JhcHBlcihjb25zdCBzcDxJT214Tm9kZVdyYXBwZXI+ICZub2RlKQorICAgICAgICA6IG1PbXhOb2RlKG5vZGUpIHt9CisgICAgdmlydHVhbCB+T214Q29tcG9uZW50V3JhcHBlcigpID0gZGVmYXVsdDsKKworICAgIHN0YXR1c190IHN1Ym1pdEJ1ZmZlcigKKyAgICAgICAgICAgIGludDMyX3QgYnVmZmVySWQsIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCwgaW50IGZlbmNlRmQpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1PbXhOb2RlLT5lbXB0eUJ1ZmZlcigKKyAgICAgICAgICAgICAgICBidWZmZXJJZCwgT01YX0JVRkZFUkZMQUdfRU5ET0ZGUkFNRSwgYnVmZmVyLCB0aW1lc3RhbXAsIGZlbmNlRmQpOworICAgIH0KKworICAgIHN0YXR1c190IHN1Ym1pdEVvcyhpbnQzMl90IGJ1ZmZlcklkKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtT214Tm9kZS0+ZW1wdHlCdWZmZXIoYnVmZmVySWQsIE9NWF9CVUZGRVJGTEFHX0VORE9GRlJBTUUgfCBPTVhfQlVGRkVSRkxBR19FT1MpOworICAgIH0KKworICAgIHZvaWQgZGlzcGF0Y2hEYXRhU3BhY2VDaGFuZ2VkKAorICAgICAgICAgICAgaW50MzJfdCBkYXRhU3BhY2UsIGludDMyX3QgYXNwZWN0cywgaW50MzJfdCBwaXhlbEZvcm1hdCkgb3ZlcnJpZGUgeworICAgICAgICBtT214Tm9kZS0+ZGlzcGF0Y2hEYXRhU3BhY2VDaGFuZ2VkKGRhdGFTcGFjZSwgYXNwZWN0cywgcGl4ZWxGb3JtYXQpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzcDxJT214Tm9kZVdyYXBwZXI+IG1PbXhOb2RlOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoT214Q29tcG9uZW50V3JhcHBlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworU3RhdHVzIE9teEdyYXBoaWNCdWZmZXJTb3VyY2U6Om9uT214RXhlY3V0aW5nKCkgeworICAgIHJldHVybiBzdGFydCgpOworfQorCitTdGF0dXMgT214R3JhcGhpY0J1ZmZlclNvdXJjZTo6b25PbXhJZGxlKCkgeworICAgIHJldHVybiBzdG9wKCk7Cit9CisKK1N0YXR1cyBPbXhHcmFwaGljQnVmZmVyU291cmNlOjpvbk9teExvYWRlZCgpeworICAgIHJldHVybiByZWxlYXNlKCk7Cit9CisKK3N0YXR1c190IE9teEdyYXBoaWNCdWZmZXJTb3VyY2U6OmNvbmZpZ3VyZSgKKyAgICAgICAgY29uc3Qgc3A8SU9teE5vZGVXcmFwcGVyPiYgb214Tm9kZSwKKyAgICAgICAgaW50MzJfdCBkYXRhU3BhY2UsCisgICAgICAgIGludDMyX3QgYnVmZmVyQ291bnQsCisgICAgICAgIHVpbnQzMl90IGZyYW1lV2lkdGgsCisgICAgICAgIHVpbnQzMl90IGZyYW1lSGVpZ2h0LAorICAgICAgICB1aW50MzJfdCBjb25zdW1lclVzYWdlKSB7CisgICAgaWYgKG9teE5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHJldHVybiBHcmFwaGljQnVmZmVyU291cmNlOjpjb25maWd1cmUoCisgICAgICAgICAgICBuZXcgT214Q29tcG9uZW50V3JhcHBlcihvbXhOb2RlKSwgZGF0YVNwYWNlLCBidWZmZXJDb3VudCwKKyAgICAgICAgICAgIGZyYW1lV2lkdGgsIGZyYW1lSGVpZ2h0LCBjb25zdW1lclVzYWdlKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcAppbmRleCA4N2MyNDExLi41NWFmZTA0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuY3BwCkBAIC00MSw3ICs0MSw3IEBACiAgICAgbUxvb3Blci0+c3RhcnQoCiAgICAgICAgICAgICBmYWxzZSwgLy8gcnVuT25DYWxsaW5nVGhyZWFkCiAgICAgICAgICAgICBmYWxzZSwgLy8gY2FuQ2FsbEphdmEKLSAgICAgICAgICAgIEFORFJPSURfUFJJT1JJVFlfRk9SRUdST1VORCk7CisgICAgICAgICAgICBBTkRST0lEX1BSSU9SSVRZX1ZJREVPKTsKIH0KIAogdm9pZCBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpwcmVwYXJlRm9yRGVzdHJ1Y3Rpb24oKSB7CkBAIC00NTgsNyArNDU4LDEyIEBACiAgICAgICAgIHN0YXRlID0gT01YX1N0YXRlTG9hZGVkOwogICAgIH0KIAotICAgIENIRUNLX0VRKChpbnQpbVN0YXRlLCAoaW50KW1UYXJnZXRTdGF0ZSk7CisgICAgaWYgKG1TdGF0ZSAhPSBtVGFyZ2V0U3RhdGUpIHsKKyAgICAgICAgQUxPR0UoIlN0YXRlIGNoYW5nZSB0byBzdGF0ZSAlZCByZXF1ZXN0ZWQgd2hpbGUgc3RpbGwgdHJhbnNpdGlvbmluZyBmcm9tIHN0YXRlICVkIHRvICVkIiwKKyAgICAgICAgICAgICAgICBzdGF0ZSwgbVN0YXRlLCBtVGFyZ2V0U3RhdGUpOworICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICBzd2l0Y2ggKG1TdGF0ZSkgewogICAgICAgICBjYXNlIE9NWF9TdGF0ZUxvYWRlZDoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcAppbmRleCBjYjgxMWEwLi5jZDBmNzVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwCkBAIC0yNiw4ICsyNiw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRGVmcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTYxLDYgKzYxLDcgQEAKICAgICAgICAgbUNyb3BUb3AoMCksCiAgICAgICAgIG1Dcm9wV2lkdGgod2lkdGgpLAogICAgICAgICBtQ3JvcEhlaWdodChoZWlnaHQpLAorICAgICAgICBtT3V0cHV0Rm9ybWF0KE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpLAogICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlKE5PTkUpLAogICAgICAgICBtVXBkYXRlQ29sb3JBc3BlY3RzKGZhbHNlKSwKICAgICAgICAgbU1pbklucHV0QnVmZmVyU2l6ZSgzODQpLCAvLyBhcmJpdHJhcnksIHVzaW5nIG9uZSB1bmNvbXByZXNzZWQgbWFjcm9ibG9jawpAQCAtNzQsNiArNzUsNyBAQAogICAgIG1lbXNldCgmbURlZmF1bHRDb2xvckFzcGVjdHMsIDAsIHNpemVvZihDb2xvckFzcGVjdHMpKTsKICAgICBtZW1zZXQoJm1CaXRzdHJlYW1Db2xvckFzcGVjdHMsIDAsIHNpemVvZihDb2xvckFzcGVjdHMpKTsKICAgICBtZW1zZXQoJm1GaW5hbENvbG9yQXNwZWN0cywgMCwgc2l6ZW9mKENvbG9yQXNwZWN0cykpOworICAgIG1lbXNldCgmbUhkclN0YXRpY0luZm8sIDAsIHNpemVvZihIRFJTdGF0aWNJbmZvKSk7CiB9CiAKIHZvaWQgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6aW5pdFBvcnRzKApAQCAtMTQwLDcgKzE0Miw2IEBACiAgICAgZGVmLmZvcm1hdC52aWRlby54RnJhbWVyYXRlID0gMDsKICAgICBkZWYuZm9ybWF0LnZpZGVvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKICAgICBkZWYuZm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7Ci0gICAgZGVmLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOwogICAgIGRlZi5mb3JtYXQudmlkZW8ucE5hdGl2ZVdpbmRvdyA9IE5VTEw7CiAKICAgICBhZGRQb3J0KGRlZik7CkBAIC0xNTIsMTEgKzE1MywxMyBAQAogICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKm91dERlZiA9ICZlZGl0UG9ydEluZm8oa091dHB1dFBvcnRJbmRleCktPm1EZWY7CiAgICAgb3V0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBvdXRwdXRCdWZmZXJXaWR0aCgpOwogICAgIG91dERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG91dHB1dEJ1ZmZlckhlaWdodCgpOworICAgIG91dERlZi0+Zm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IG1PdXRwdXRGb3JtYXQ7CiAgICAgb3V0RGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSA9IG91dERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOwogICAgIG91dERlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IG91dERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKIAorICAgIGludDMyX3QgYnBwID0gKG1PdXRwdXRGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjE2KSA/IDIgOiAxOwogICAgIG91dERlZi0+bkJ1ZmZlclNpemUgPQotICAgICAgICAob3V0RGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSAqIG91dERlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCAqIDMpIC8gMjsKKyAgICAgICAgKG91dERlZi0+Zm9ybWF0LnZpZGVvLm5TdHJpZGUgKiBvdXREZWYtPmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgKiBicHAgKiAzKSAvIDI7CiAKICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICppbkRlZiA9ICZlZGl0UG9ydEluZm8oa0lucHV0UG9ydEluZGV4KS0+bURlZjsKICAgICBpbkRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOwpAQCAtMTkxLDkgKzE5NCwxMSBAQAogCiB2b2lkIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OmhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgKICAgICAgICAgYm9vbCAqcG9ydFdpbGxSZXNldCwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgb3V0cHV0Rm9ybWF0LAogICAgICAgICBDcm9wU2V0dGluZ3NNb2RlIGNyb3BTZXR0aW5nc01vZGUsIGJvb2wgZmFrZVN0cmlkZSkgewogICAgICpwb3J0V2lsbFJlc2V0ID0gZmFsc2U7CiAgICAgYm9vbCBzaXplQ2hhbmdlZCA9ICh3aWR0aCAhPSBtV2lkdGggfHwgaGVpZ2h0ICE9IG1IZWlnaHQpOworICAgIGJvb2wgZm9ybWF0Q2hhbmdlZCA9IChvdXRwdXRGb3JtYXQgIT0gbU91dHB1dEZvcm1hdCk7CiAgICAgYm9vbCB1cGRhdGVDcm9wID0gKGNyb3BTZXR0aW5nc01vZGUgPT0ga0Nyb3BVblNldCk7CiAgICAgYm9vbCBjcm9wQ2hhbmdlZCA9IChjcm9wU2V0dGluZ3NNb2RlID09IGtDcm9wQ2hhbmdlZCk7CiAgICAgYm9vbCBzdHJpZGVDaGFuZ2VkID0gZmFsc2U7CkBAIC0yMDUsMTMgKzIxMCwxOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKHNpemVDaGFuZ2VkIHx8IGNyb3BDaGFuZ2VkIHx8IHN0cmlkZUNoYW5nZWQpIHsKKyAgICBpZiAoZm9ybWF0Q2hhbmdlZCB8fCBzaXplQ2hhbmdlZCB8fCBjcm9wQ2hhbmdlZCB8fCBzdHJpZGVDaGFuZ2VkKSB7CisgICAgICAgIGlmIChmb3JtYXRDaGFuZ2VkKSB7CisgICAgICAgICAgICBBTE9HRCgiZm9ybWF0Q2hhbmdlZDogMHglMDh4IC0+IDB4JTA4eCIsIG1PdXRwdXRGb3JtYXQsIG91dHB1dEZvcm1hdCk7CisgICAgICAgIH0KKyAgICAgICAgbU91dHB1dEZvcm1hdCA9IG91dHB1dEZvcm1hdDsKICAgICAgICAgbVdpZHRoID0gd2lkdGg7CiAgICAgICAgIG1IZWlnaHQgPSBoZWlnaHQ7CiAKICAgICAgICAgaWYgKChzaXplQ2hhbmdlZCAmJiAhbUlzQWRhcHRpdmUpCiAgICAgICAgICAgICB8fCB3aWR0aCA+IG1BZGFwdGl2ZU1heFdpZHRoCi0gICAgICAgICAgICB8fCBoZWlnaHQgPiBtQWRhcHRpdmVNYXhIZWlnaHQpIHsKKyAgICAgICAgICAgIHx8IGhlaWdodCA+IG1BZGFwdGl2ZU1heEhlaWdodAorICAgICAgICAgICAgfHwgZm9ybWF0Q2hhbmdlZCkgewogICAgICAgICAgICAgaWYgKG1Jc0FkYXB0aXZlKSB7CiAgICAgICAgICAgICAgICAgaWYgKHdpZHRoID4gbUFkYXB0aXZlTWF4V2lkdGgpIHsKICAgICAgICAgICAgICAgICAgICAgbUFkYXB0aXZlTWF4V2lkdGggPSB3aWR0aDsKQEAgLTMwNSwyNyArMzE1LDMwIEBACiB2b2lkIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OmNvcHlZVjEyRnJhbWVUb091dHB1dEJ1ZmZlcigKICAgICAgICAgdWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNZLCBjb25zdCB1aW50OF90ICpzcmNVLCBjb25zdCB1aW50OF90ICpzcmNWLAogICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlKSB7Ci0gICAgc2l6ZV90IGRzdFlTdHJpZGUgPSBvdXRwdXRCdWZmZXJXaWR0aCgpOworICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKm91dERlZiA9ICZlZGl0UG9ydEluZm8oa091dHB1dFBvcnRJbmRleCktPm1EZWY7CisgICAgaW50MzJfdCBicHAgPSAob3V0RGVmLT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNikgPyAyIDogMTsKKworICAgIHNpemVfdCBkc3RZU3RyaWRlID0gb3V0cHV0QnVmZmVyV2lkdGgoKSAqIGJwcDsKICAgICBzaXplX3QgZHN0VVZTdHJpZGUgPSBkc3RZU3RyaWRlIC8gMjsKICAgICBzaXplX3QgZHN0SGVpZ2h0ID0gb3V0cHV0QnVmZmVySGVpZ2h0KCk7CiAgICAgdWludDhfdCAqZHN0U3RhcnQgPSBkc3Q7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1IZWlnaHQ7ICsraSkgewotICAgICAgICAgbWVtY3B5KGRzdCwgc3JjWSwgbVdpZHRoKTsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyY1ksIG1XaWR0aCAqIGJwcCk7CiAgICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGU7CiAgICAgICAgICBkc3QgKz0gZHN0WVN0cmlkZTsKICAgICB9CiAKICAgICBkc3QgPSBkc3RTdGFydCArIGRzdFlTdHJpZGUgKiBkc3RIZWlnaHQ7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSGVpZ2h0IC8gMjsgKytpKSB7Ci0gICAgICAgICBtZW1jcHkoZHN0LCBzcmNVLCBtV2lkdGggLyAyKTsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyY1UsIG1XaWR0aCAvIDIgKiBicHApOwogICAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOwogICAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOwogICAgIH0KIAogICAgIGRzdCA9IGRzdFN0YXJ0ICsgKDUgKiBkc3RZU3RyaWRlICogZHN0SGVpZ2h0KSAvIDQ7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSGVpZ2h0IC8gMjsgKytpKSB7Ci0gICAgICAgICBtZW1jcHkoZHN0LCBzcmNWLCBtV2lkdGggLyAyKTsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyY1YsIG1XaWR0aCAvIDIgKiBicHApOwogICAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOwogICAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOwogICAgIH0KQEAgLTU1MCw2ICs1NjMsMTAgQEAKICAgICAgICAgICAgIERlc2NyaWJlQ29sb3JBc3BlY3RzUGFyYW1zKiBjb2xvckFzcGVjdHNQYXJhbXMgPQogICAgICAgICAgICAgICAgICAgICAoRGVzY3JpYmVDb2xvckFzcGVjdHNQYXJhbXMgKilwYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGNvbG9yQXNwZWN0c1BhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoY29sb3JBc3BlY3RzUGFyYW1zLT5uUG9ydEluZGV4ICE9IGtPdXRwdXRQb3J0SW5kZXgpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwogICAgICAgICAgICAgfQpAQCAtNTYyLDYgKzU3OSwyOCBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtEZXNjcmliZUhkclN0YXRpY0luZm9JbmRleDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFzdXBwb3J0RGVzY3JpYmVIZHJTdGF0aWNJbmZvKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRGVzY3JpYmVIRFJTdGF0aWNJbmZvUGFyYW1zKiBoZHJTdGF0aWNJbmZvUGFyYW1zID0KKyAgICAgICAgICAgICAgICAgICAgKERlc2NyaWJlSERSU3RhdGljSW5mb1BhcmFtcyAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oaGRyU3RhdGljSW5mb1BhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaGRyU3RhdGljSW5mb1BhcmFtcy0+blBvcnRJbmRleCAhPSBrT3V0cHV0UG9ydEluZGV4KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGRyU3RhdGljSW5mb1BhcmFtcy0+c0luZm8gPSBtSGRyU3RhdGljSW5mbzsKKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CiAgICAgfQpAQCAtNTk1LDYgKzYzNCwzMCBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtEZXNjcmliZUhkclN0YXRpY0luZm9JbmRleDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFzdXBwb3J0RGVzY3JpYmVIZHJTdGF0aWNJbmZvKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3QgRGVzY3JpYmVIRFJTdGF0aWNJbmZvUGFyYW1zKiBoZHJTdGF0aWNJbmZvUGFyYW1zID0KKyAgICAgICAgICAgICAgICAgICAgKERlc2NyaWJlSERSU3RhdGljSW5mb1BhcmFtcyAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oaGRyU3RhdGljSW5mb1BhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaGRyU3RhdGljSW5mb1BhcmFtcy0+blBvcnRJbmRleCAhPSBrT3V0cHV0UG9ydEluZGV4KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbU91dHB1dEZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNjsKKyAgICAgICAgICAgIG1IZHJTdGF0aWNJbmZvID0gaGRyU3RhdGljSW5mb1BhcmFtcy0+c0luZm87CisgICAgICAgICAgICB1cGRhdGVQb3J0RGVmaW5pdGlvbnMoZmFsc2UpOworCisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKICAgICB9CkBAIC02MTAsNiArNjczLDEwIEBACiAgICAgICAgICAgICAgICAgJiYgc3VwcG9ydHNEZXNjcmliZUNvbG9yQXNwZWN0cygpKSB7CiAgICAgICAgICooaW50MzJfdCopaW5kZXggPSBrRGVzY3JpYmVDb2xvckFzcGVjdHNJbmRleDsKICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguZGVzY3JpYmVIRFJTdGF0aWNJbmZvIikKKyAgICAgICAgICAgICYmIHN1cHBvcnREZXNjcmliZUhkclN0YXRpY0luZm8oKSkgeworICAgICAgICAqKGludDMyX3QqKWluZGV4ID0ga0Rlc2NyaWJlSGRyU3RhdGljSW5mb0luZGV4OworICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICB9CiAKICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6Z2V0RXh0ZW5zaW9uSW5kZXgobmFtZSwgaW5kZXgpOwpAQCAtNjIzLDYgKzY5MCwxMCBAQAogICAgIHJldHVybiBrTm90U3VwcG9ydGVkOwogfQogCitib29sIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OnN1cHBvcnREZXNjcmliZUhkclN0YXRpY0luZm8oKSB7CisgICAgcmV0dXJuIGZhbHNlOworfQorCiB2b2lkIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6Om9uUmVzZXQoKSB7CiAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IE5PTkU7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAKaW5kZXggNmU1NjNiNy4uMmZiYmI0NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmNwcApAQCAtMjYsOSArMjYsOSBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9JbmRleEV4dC5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRGVmcy5oPgogCiAjaW5jbHVkZSA8dWkvRmVuY2UuaD4KICNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyTWFwcGVyLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oCmluZGV4IDhkOGEyZDkuLmE5ZmNlNTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPGxpc3Q+CiAKKyNpbmNsdWRlIDxjaW50dHlwZXM+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgpAQCAtMzUsNiArMzYsOCBAQAogI2luY2x1ZGUgPG1lZGlhL09NWEZlbmNlUGFyY2VsYWJsZS5oPgogI2luY2x1ZGUgPG1lZGlhL09NWEJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9Db252ZXJzaW9uLmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9idWZmZXJxdWV1ZS8xLjAvSVByb2R1Y2VyTGlzdGVuZXIuaD4KQEAgLTk5LDUxICsxMDIsMTMgQEAKIHR5cGVkZWYgOjphbmRyb2lkOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyCiAgICAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI7CiAKLS8vIG5hdGl2ZV9oYW5kbGVfdCBoZWxwZXIgZnVuY3Rpb25zLgorLy8gV2Ugd2FudCB0byB1c2UgYWxsIGZ1bmN0aW9ucyBkZWNsYXJlZCBpbiA6OmFuZHJvaWQ6OmNvbnZlcnNpb24KK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmNvbnZlcnNpb247CiAKLS8qKgotICogXGJyaWVmIFRha2UgYW4gZmQgYW5kIGNyZWF0ZSBhIG5hdGl2ZSBoYW5kbGUgY29udGFpbmluZyBvbmx5IHRoZSBnaXZlbiBmZC4KLSAqIFRoZSBjcmVhdGVkIGhhbmRsZSB3aWxsIG5lZWQgdG8gYmUgZGVsZXRlZCBtYW51YWxseSB3aXRoCi0gKiBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAuCi0gKgotICogXHBhcmFtW2luXSBmZCBUaGUgc291cmNlIGZpbGUgZGVzY3JpcHRvciAob2YgdHlwZSBgaW50YCkuCi0gKiBccmV0dXJuIFRoZSBjcmVhdGUgYG5hdGl2ZV9oYW5kbGVfdCpgIHRoYXQgY29udGFpbnMgdGhlIGdpdmVuIFxwIGZkLiBJZiB0aGUKLSAqIHN1cHBsaWVkIFxwIGZkIGlzIG5lZ2F0aXZlLCB0aGUgY3JlYXRlZCBuYXRpdmUgaGFuZGxlIHdpbGwgY29udGFpbiBubyBmaWxlCi0gKiBkZXNjcmlwdG9ycy4KLSAqCi0gKiBJZiB0aGUgbmF0aXZlIGhhbmRsZSBjYW5ub3QgYmUgY3JlYXRlZCwgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlCi0gKiBgbnVsbHB0cmAuCi0gKgotICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBkdXBsaWNhdGUgdGhlIGZpbGUgZGVzY3JpcHRvci4KLSAqLwotaW5saW5lIG5hdGl2ZV9oYW5kbGVfdCogbmF0aXZlX2hhbmRsZV9jcmVhdGVfZnJvbV9mZChpbnQgZmQpIHsKLSAgICBpZiAoZmQgPCAwKSB7Ci0gICAgICAgIHJldHVybiBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgwLCAwKTsKLSAgICB9Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBuaCA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOwotICAgIGlmIChuaCA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgICBuaC0+ZGF0YVswXSA9IGZkOwotICAgIHJldHVybiBuaDsKLX0KLQotLyoqCi0gKiBcYnJpZWYgRXh0cmFjdCBhIGZpbGUgZGVzY3JpcHRvciBmcm9tIGEgbmF0aXZlIGhhbmRsZS4KLSAqCi0gKiBccGFyYW1baW5dIG5oIFRoZSBzb3VyY2UgYG5hdGl2ZV9oYW5kbGVfdCpgLgotICogXHBhcmFtW2luXSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGZpbGUgZGVzY3JpcHRvciBpbiBccCBuaCB0byByZWFkIGZyb20uIFRoaXMKLSAqIGlucHV0IGhhcyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBgMGAuCi0gKiBccmV0dXJuIFRoZSBgaW5kZXhgLXRoIGZpbGUgZGVzY3JpcHRvciBpbiBccCBuaC4gSWYgXHAgbmggZG9lcyBub3QgaGF2ZQotICogZW5vdWdoIGZpbGUgZGVzY3JpcHRvcnMsIHRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlIGAtMWAuCi0gKgotICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBkdXBsaWNhdGUgdGhlIGZpbGUgZGVzY3JpcHRvci4KLSAqLwotaW5saW5lIGludCBuYXRpdmVfaGFuZGxlX3JlYWRfZmQobmF0aXZlX2hhbmRsZV90IGNvbnN0KiBuaCwgaW50IGluZGV4ID0gMCkgewotICAgIHJldHVybiAoKG5oID09IG51bGxwdHIpIHx8IChuaC0+bnVtRmRzID09IDApIHx8Ci0gICAgICAgICAgICAobmgtPm51bUZkcyA8PSBpbmRleCkgfHwgKGluZGV4IDwgMCkpID8KLSAgICAgICAgICAgIC0xIDogbmgtPmRhdGFbaW5kZXhdOwotfQorLy8gTm93IHNwZWNpZmljYWxseSBpbmplY3QgdGhlc2UgdHdvIGZ1bmN0aW9ucyBoZXJlLCBiZWNhdXNlIHdlJ3JlIGdvaW5nIHRvCisvLyBkZWNsYXJlIGZ1bmN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gdGhpcyBuYW1lc3BhY2UuCit1c2luZyA6OmFuZHJvaWQ6OmNvbnZlcnNpb246OmNvbnZlcnRUbzsKK3VzaW5nIDo6YW5kcm9pZDo6Y29udmVyc2lvbjo6dG9TdGF0dXNUOwogCiAvKioKICAqIENvbnZlcnNpb24gZnVuY3Rpb25zCkBAIC0xNzgsMTcgKzE0MywzNCBAQAogICovCiAKIC8qKgotICogXGJyaWVmIENvbnZlcnQgYFJldHVybjx2b2lkPmAgdG8gYGJpbmRlcjo6U3RhdHVzYC4KKyAqIFxicmllZiBDb252ZXJ0IGBTdGF0dXNgIHRvIGBzdGF0dXNfdGAuIFRoaXMgaXMgZm9yIGxlZ2FjeSBiaW5kZXIgY2FsbHMuCiAgKgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYFJldHVybjx2b2lkPmAuCi0gKiBccmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGBiaW5kZXI6OlN0YXR1c2AuCisgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgU3RhdHVzYC4KKyAqIFxyZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgYHN0YXR1c190YC4KICAqLwotLy8gY29udmVydDogUmV0dXJuPHZvaWQ+IC0+IDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMKLWlubGluZSA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIHRvQmluZGVyU3RhdHVzKAotICAgICAgICBSZXR1cm48dm9pZD4gY29uc3QmIHQpIHsKLSAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoCi0gICAgICAgICAgICB0LmlzT2soKSA/IE9LIDogVU5LTk9XTl9FUlJPUiwKLSAgICAgICAgICAgIHQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKy8vIGNvbnZlcnQ6IFN0YXR1cyAtPiBzdGF0dXNfdAoraW5saW5lIHN0YXR1c190IHRvU3RhdHVzVChTdGF0dXMgY29uc3QmIHQpIHsKKyAgICBzd2l0Y2ggKHQpIHsKKyAgICBjYXNlIFN0YXR1czo6Tk9fRVJST1I6CisgICAgY2FzZSBTdGF0dXM6Ok5BTUVfTk9UX0ZPVU5EOgorICAgIGNhc2UgU3RhdHVzOjpXT1VMRF9CTE9DSzoKKyAgICBjYXNlIFN0YXR1czo6Tk9fTUVNT1JZOgorICAgIGNhc2UgU3RhdHVzOjpBTFJFQURZX0VYSVNUUzoKKyAgICBjYXNlIFN0YXR1czo6Tk9fSU5JVDoKKyAgICBjYXNlIFN0YXR1czo6QkFEX1ZBTFVFOgorICAgIGNhc2UgU3RhdHVzOjpERUFEX09CSkVDVDoKKyAgICBjYXNlIFN0YXR1czo6SU5WQUxJRF9PUEVSQVRJT046CisgICAgY2FzZSBTdGF0dXM6OlRJTUVEX09VVDoKKyAgICBjYXNlIFN0YXR1czo6RVJST1JfVU5TVVBQT1JURUQ6CisgICAgY2FzZSBTdGF0dXM6OlVOS05PV05fRVJST1I6CisgICAgY2FzZSBTdGF0dXM6OlJFTEVBU0VfQUxMX0JVRkZFUlM6CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzdGF0dXNfdD4odCk7CisgICAgY2FzZSBTdGF0dXM6OkJVRkZFUl9ORUVEU19SRUFMTE9DQVRJT046CisgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR1coIlVucmVjb2duaXplZCBzdGF0dXMgdmFsdWU6ICUiIFBSSWQzMiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4odCkpOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHQpOworICAgIH0KIH0KIAogLyoqCkBAIC0yMDgsMjkgKzE5MCw3IEBACiAgKi8KIC8vIGNvbnZlcnQ6IFN0YXR1cyAtPiBzdGF0dXNfdAogaW5saW5lIHN0YXR1c190IHRvU3RhdHVzVChSZXR1cm48U3RhdHVzPiBjb25zdCYgdCkgewotICAgIHJldHVybiB0LmlzT2soKSA/IHN0YXRpY19jYXN0PHN0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHQpKSA6IFVOS05PV05fRVJST1I7Ci19Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYFJldHVybjx2b2lkPmAgdG8gYHN0YXR1c190YC4gVGhpcyBpcyBmb3IgbGVnYWN5IGJpbmRlciBjYWxscy4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgUmV0dXJuPHZvaWQ+YC4KLSAqIFxyZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgYHN0YXR1c190YC4KLSAqLwotLy8gY29udmVydDogUmV0dXJuPHZvaWQ+IC0+IHN0YXR1c190Ci1pbmxpbmUgc3RhdHVzX3QgdG9TdGF0dXNUKFJldHVybjx2b2lkPiBjb25zdCYgdCkgewotICAgIHJldHVybiB0LmlzT2soKSA/IE9LIDogVU5LTk9XTl9FUlJPUjsKLX0KLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgU3RhdHVzYCB0byBgc3RhdHVzX3RgLiBUaGlzIGlzIGZvciBsZWdhY3kgYmluZGVyIGNhbGxzLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBTdGF0dXNgLgotICogXHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBgc3RhdHVzX3RgLgotICovCi0vLyBjb252ZXJ0OiBTdGF0dXMgLT4gc3RhdHVzX3QKLWlubGluZSBzdGF0dXNfdCB0b1N0YXR1c1QoU3RhdHVzIGNvbnN0JiB0KSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PHN0YXR1c190Pih0KTsKKyAgICByZXR1cm4gdC5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdGljX2Nhc3Q8U3RhdHVzPih0KSkgOiBVTktOT1dOX0VSUk9SOwogfQogCiAvKioKQEAgLTI0MSwxOCArMjAxLDI4IEBACiAgKi8KIC8vIGNvbnZlcnQ6IHN0YXR1c190IC0+IFN0YXR1cwogaW5saW5lIFN0YXR1cyB0b1N0YXR1cyhzdGF0dXNfdCBsKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0YXR1cz4obCk7Ci19Ci0KLS8qKgotICogXGJyaWVmIFdyYXAgYG5hdGl2ZV9oYW5kbGVfdCpgIGluIGBoaWRsX2hhbmRsZWAuCi0gKgotICogXHBhcmFtW2luXSBuaCBUaGUgc291cmNlIGBuYXRpdmVfaGFuZGxlX3QqYC4KLSAqIFxyZXR1cm4gVGhlIGBoaWRsX2hhbmRsZWAgdGhhdCBwb2ludHMgdG8gXHAgbmguCi0gKi8KLS8vIHdyYXA6IG5hdGl2ZV9oYW5kbGVfdCogLT4gaGlkbF9oYW5kbGUKLWlubGluZSBoaWRsX2hhbmRsZSBpbkhpZGxIYW5kbGUobmF0aXZlX2hhbmRsZV90IGNvbnN0KiBuaCkgewotICAgIHJldHVybiBoaWRsX2hhbmRsZShuaCk7CisgICAgc3dpdGNoIChsKSB7CisgICAgY2FzZSBOT19FUlJPUjoKKyAgICBjYXNlIE5BTUVfTk9UX0ZPVU5EOgorICAgIGNhc2UgV09VTERfQkxPQ0s6CisgICAgY2FzZSBOT19NRU1PUlk6CisgICAgY2FzZSBBTFJFQURZX0VYSVNUUzoKKyAgICBjYXNlIE5PX0lOSVQ6CisgICAgY2FzZSBCQURfVkFMVUU6CisgICAgY2FzZSBERUFEX09CSkVDVDoKKyAgICBjYXNlIElOVkFMSURfT1BFUkFUSU9OOgorICAgIGNhc2UgVElNRURfT1VUOgorICAgIGNhc2UgRVJST1JfVU5TVVBQT1JURUQ6CisgICAgY2FzZSBVTktOT1dOX0VSUk9SOgorICAgIGNhc2UgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UkVMRUFTRV9BTExfQlVGRkVSUzoKKyAgICBjYXNlIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkJVRkZFUl9ORUVEU19SRUFMTE9DQVRJT046CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdGF0dXM+KGwpOworICAgIGNhc2UgTk9UX0VOT1VHSF9EQVRBOgorICAgICAgICByZXR1cm4gU3RhdHVzOjpCVUZGRVJfTkVFRFNfUkVBTExPQ0FUSU9OOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dXKCJVbnJlY29nbml6ZWQgc3RhdHVzIHZhbHVlOiAlIiBQUklkMzIsIHN0YXRpY19jYXN0PGludDMyX3Q+KGwpKTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0YXR1cz4obCk7CisgICAgfQogfQogCiAvKioKQEAgLTQ5MCwxMjggKzQ2MCw2IEBACiB9CiAKIC8qKgotICogXGJyaWVmIENvbnZlcnQgYGludDMyX3RgIHRvIGBEYXRhc3BhY2VgLgotICoKLSAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBpbnQzMl90YC4KLSAqIFxyZXN1bHQgVGhlIGNvcnJlc3BvbmRpbmcgYERhdGFzcGFjZWAuCi0gKi8KLS8vIGNvbnZlcnQ6IGludDMyX3QgLT4gRGF0YXNwYWNlCi1pbmxpbmUgRGF0YXNwYWNlIHRvSGFyZHdhcmVEYXRhc3BhY2UoaW50MzJfdCBsKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PERhdGFzcGFjZT4obCk7Ci19Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYERhdGFzcGFjZWAgdG8gYGludDMyX3RgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBEYXRhc3BhY2VgLgotICogXHJlc3VsdCBUaGUgY29ycmVzcG9uZGluZyBgaW50MzJfdGAuCi0gKi8KLS8vIGNvbnZlcnQ6IERhdGFzcGFjZSAtPiBpbnQzMl90Ci1pbmxpbmUgaW50MzJfdCB0b1Jhd0RhdGFzcGFjZShEYXRhc3BhY2UgY29uc3QmIHQpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4odCk7Ci19Ci0KLS8qKgotICogXGJyaWVmIFdyYXAgYW4gb3BhcXVlIGJ1ZmZlciBpbnNpZGUgYSBgaGlkbF92ZWM8dWludDhfdD5gLgotICoKLSAqIFxwYXJhbVtpbl0gbCBUaGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvcGFxdWUgYnVmZmVyLgotICogXHBhcmFtW2luXSBzaXplIFRoZSBzaXplIG9mIHRoZSBidWZmZXIuCi0gKiBccmV0dXJuIEEgYGhpZGxfdmVjPHVpbnQ4X3Q+YCB0aGF0IHBvaW50cyB0byB0aGUgYnVmZmVyLgotICovCi0vLyB3cmFwOiB2b2lkKiwgc2l6ZV90IC0+IGhpZGxfdmVjPHVpbnQ4X3Q+Ci1pbmxpbmUgaGlkbF92ZWM8dWludDhfdD4gaW5IaWRsQnl0ZXModm9pZCBjb25zdCogbCwgc2l6ZV90IHNpemUpIHsKLSAgICBoaWRsX3ZlYzx1aW50OF90PiB0OwotICAgIHQuc2V0VG9FeHRlcm5hbChzdGF0aWNfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDx2b2lkKj4obCkpLCBzaXplLCBmYWxzZSk7Ci0gICAgcmV0dXJuIHQ7Ci19Ci0KLS8qKgotICogXGJyaWVmIENyZWF0ZSBhIGBoaWRsX3ZlYzx1aW50OF90PmAgdGhhdCBpcyBhIGNvcHkgb2YgYW4gb3BhcXVlIGJ1ZmZlci4KLSAqCi0gKiBccGFyYW1baW5dIGwgVGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3BhcXVlIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbl0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyLgotICogXHJldHVybiBBIGBoaWRsX3ZlYzx1aW50OF90PmAgdGhhdCBpcyBhIGNvcHkgb2YgdGhlIGlucHV0IGJ1ZmZlci4KLSAqLwotLy8gY29udmVydDogdm9pZCosIHNpemVfdCAtPiBoaWRsX3ZlYzx1aW50OF90PgotaW5saW5lIGhpZGxfdmVjPHVpbnQ4X3Q+IHRvSGlkbEJ5dGVzKHZvaWQgY29uc3QqIGwsIHNpemVfdCBzaXplKSB7Ci0gICAgaGlkbF92ZWM8dWludDhfdD4gdDsKLSAgICB0LnJlc2l6ZShzaXplKTsKLSAgICB1aW50OF90IGNvbnN0KiBzcmMgPSBzdGF0aWNfY2FzdDx1aW50OF90IGNvbnN0Kj4obCk7Ci0gICAgc3RkOjpjb3B5KHNyYywgc3JjICsgc2l6ZSwgdC5kYXRhKCkpOwotICAgIHJldHVybiB0OwotfQotCi0vKioKLSAqIFxicmllZiBXcmFwIGBHcmFwaGljQnVmZmVyYCBpbiBgQW53QnVmZmVyYC4KLSAqCi0gKiBccGFyYW1bb3V0XSB0IFRoZSB3cmFwcGVyIG9mIHR5cGUgYEFud0J1ZmZlcmAuCi0gKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgR3JhcGhpY0J1ZmZlcmAuCi0gKi8KLS8vIHdyYXA6IEdyYXBoaWNCdWZmZXIgLT4gQW53QnVmZmVyCi1pbmxpbmUgdm9pZCB3cmFwQXMoQW53QnVmZmVyKiB0LCBHcmFwaGljQnVmZmVyIGNvbnN0JiBsKSB7Ci0gICAgdC0+YXR0ci53aWR0aCA9IGwuZ2V0V2lkdGgoKTsKLSAgICB0LT5hdHRyLmhlaWdodCA9IGwuZ2V0SGVpZ2h0KCk7Ci0gICAgdC0+YXR0ci5zdHJpZGUgPSBsLmdldFN0cmlkZSgpOwotICAgIHQtPmF0dHIuZm9ybWF0ID0gc3RhdGljX2Nhc3Q8UGl4ZWxGb3JtYXQ+KGwuZ2V0UGl4ZWxGb3JtYXQoKSk7Ci0gICAgdC0+YXR0ci5sYXllckNvdW50ID0gbC5nZXRMYXllckNvdW50KCk7Ci0gICAgdC0+YXR0ci51c2FnZSA9IGwuZ2V0VXNhZ2UoKTsKLSAgICB0LT5hdHRyLmlkID0gbC5nZXRJZCgpOwotICAgIHQtPmF0dHIuZ2VuZXJhdGlvbk51bWJlciA9IGwuZ2V0R2VuZXJhdGlvbk51bWJlcigpOwotICAgIHQtPm5hdGl2ZUhhbmRsZSA9IGhpZGxfaGFuZGxlKGwuaGFuZGxlKTsKLX0KLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgQW53QnVmZmVyYCB0byBgR3JhcGhpY0J1ZmZlcmAuCi0gKgotICogXHBhcmFtW291dF0gbCBUaGUgZGVzdGluYXRpb24gYEdyYXBoaWNCdWZmZXJgLgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEFud0J1ZmZlcmAuCi0gKgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSBhbGwgZmlsZSBkZXNjcmlwdG9ycyBpbiBccCB0LgotICovCi0vLyBjb252ZXJ0OiBBbndCdWZmZXIgLT4gR3JhcGhpY0J1ZmZlcgotLy8gUmVmOiBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL3VpL0dyYXBoaWNCdWZmZXIuY3BwOiBHcmFwaGljQnVmZmVyOjpmbGF0dGVuCi1pbmxpbmUgYm9vbCBjb252ZXJ0VG8oR3JhcGhpY0J1ZmZlciogbCwgQW53QnVmZmVyIGNvbnN0JiB0KSB7Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSB0Lm5hdGl2ZUhhbmRsZSA9PSBudWxscHRyID8KLSAgICAgICAgICAgIG51bGxwdHIgOiBuYXRpdmVfaGFuZGxlX2Nsb25lKHQubmF0aXZlSGFuZGxlKTsKLQotICAgIHNpemVfdCBjb25zdCBudW1JbnRzID0gMTIgKyAoaGFuZGxlID8gaGFuZGxlLT5udW1JbnRzIDogMCk7Ci0gICAgaW50MzJfdCogaW50cyA9IG5ldyBpbnQzMl90W251bUludHNdOwotCi0gICAgc2l6ZV90IG51bUZkcyA9IHN0YXRpY19jYXN0PHNpemVfdD4oaGFuZGxlID8gaGFuZGxlLT5udW1GZHMgOiAwKTsKLSAgICBpbnQqIGZkcyA9IG5ldyBpbnRbbnVtRmRzXTsKLQotICAgIGludHNbMF0gPSAnR0JGUic7Ci0gICAgaW50c1sxXSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHQuYXR0ci53aWR0aCk7Ci0gICAgaW50c1syXSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHQuYXR0ci5oZWlnaHQpOwotICAgIGludHNbM10gPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmF0dHIuc3RyaWRlKTsKLSAgICBpbnRzWzRdID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4odC5hdHRyLmZvcm1hdCk7Ci0gICAgaW50c1s1XSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHQuYXR0ci5sYXllckNvdW50KTsKLSAgICBpbnRzWzZdID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4odC5hdHRyLnVzYWdlKTsKLSAgICBpbnRzWzddID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4odC5hdHRyLmlkID4+IDMyKTsKLSAgICBpbnRzWzhdID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4odC5hdHRyLmlkICYgMHhGRkZGRkZGRik7Ci0gICAgaW50c1s5XSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHQuYXR0ci5nZW5lcmF0aW9uTnVtYmVyKTsKLSAgICBpbnRzWzEwXSA9IDA7Ci0gICAgaW50c1sxMV0gPSAwOwotICAgIGlmIChoYW5kbGUpIHsKLSAgICAgICAgaW50c1sxMF0gPSBzdGF0aWNfY2FzdDxpbnQzMl90PihoYW5kbGUtPm51bUZkcyk7Ci0gICAgICAgIGludHNbMTFdID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFuZGxlLT5udW1JbnRzKTsKLSAgICAgICAgaW50KiBpbnRzU3RhcnQgPSBoYW5kbGUtPmRhdGEgKyBoYW5kbGUtPm51bUZkczsKLSAgICAgICAgc3RkOjpjb3B5KGhhbmRsZS0+ZGF0YSwgaW50c1N0YXJ0LCBmZHMpOwotICAgICAgICBzdGQ6OmNvcHkoaW50c1N0YXJ0LCBpbnRzU3RhcnQgKyBoYW5kbGUtPm51bUludHMsICZpbnRzWzEyXSk7Ci0gICAgfQotCi0gICAgdm9pZCBjb25zdCogY29uc3RCdWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkIGNvbnN0Kj4oaW50cyk7Ci0gICAgc2l6ZV90IHNpemUgPSBudW1JbnRzICogc2l6ZW9mKGludDMyX3QpOwotICAgIGludCBjb25zdCogY29uc3RGZHMgPSBzdGF0aWNfY2FzdDxpbnQgY29uc3QqPihmZHMpOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGwtPnVuZmxhdHRlbihjb25zdEJ1ZmZlciwgc2l6ZSwgY29uc3RGZHMsIG51bUZkcyk7Ci0KLSAgICBkZWxldGUgW10gZmRzOwotICAgIGRlbGV0ZSBbXSBpbnRzOwotICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7Ci0gICAgcmV0dXJuIHN0YXR1cyA9PSBOT19FUlJPUjsKLX0KLQotLyoqCiAgKiBcYnJpZWYgV3JhcCBgR3JhcGhpY0J1ZmZlcmAgaW4gYENvZGVjQnVmZmVyYC4KICAqCiAgKiBccGFyYW1bb3V0XSB0IFRoZSB3cmFwcGVyIG9mIHR5cGUgYENvZGVjQnVmZmVyYC4KQEAgLTg5NiwxMjgxICs3NDQsNiBAQAogI2VuZGlmCiB9CiAKLS8qKgotICogQ29udmVyc2lvbiBmdW5jdGlvbnMgZm9yIHR5cGVzIG91dHNpZGUgbWVkaWEKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogU29tZSBvYmplY3RzIGluIGxpYnVpIGFuZCBsaWJndWkgdGhhdCB3ZXJlIG1hZGUgdG8gZ28gdGhyb3VnaCBiaW5kZXIgY2FsbHMgZG8KLSAqIG5vdCBleHBvc2Ugd2F5cyB0byByZWFkIG9yIHdyaXRlIHRoZWlyIGZpZWxkcyB0byB0aGUgcHVibGljLiBUbyBwYXNzIGFuCi0gKiBvYmplY3Qgb2YgdGhpcyBraW5kIHRocm91Z2ggdGhlIEhJREwgYm91bmRhcnksIHRyYW5zbGF0aW9uIGZ1bmN0aW9ucyBuZWVkIHRvCi0gKiB3b3JrIGFyb3VuZCB0aGUgYWNjZXNzIHJlc3RyaWN0aW9uIGJ5IHVzaW5nIHRoZSBwdWJsaWNseSBhdmFpbGFibGUKLSAqIGBmbGF0dGVuKClgIGFuZCBgdW5mbGF0dGVuKClgIGZ1bmN0aW9ucy4KLSAqCi0gKiBBbGwgYGZsYXR0ZW4oKWAgYW5kIGB1bmZsYXR0ZW4oKWAgb3ZlcmxvYWRzIGZvbGxvdyB0aGUgc2FtZSBjb252ZW50aW9uIGFzCi0gKiBmb2xsb3dzOgotICoKLSAqICAgICBzdGF0dXNfdCBmbGF0dGVuKE9iamVjdFR5cGUgY29uc3QmIG9iamVjdCwKLSAqICAgICAgICAgICAgICAgICAgICAgIFtPdGhlclR5cGUgY29uc3QmIG90aGVyLCAuLi5dCi0gKiAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUsCi0gKiAgICAgICAgICAgICAgICAgICAgICBpbnQqJiBmZHMsIHNpemVfdCYgbnVtRmRzKQotICoKLSAqICAgICBzdGF0dXNfdCB1bmZsYXR0ZW4oT2JqZWN0VHlwZSogb2JqZWN0LAotICogICAgICAgICAgICAgICAgICAgICAgICBbT3RoZXJUeXBlKiBvdGhlciwgLi4uLF0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLAotICogICAgICAgICAgICAgICAgICAgICAgICBpbnQqJiBmZHMsIHNpemVfdCYgbnVtRmRzKQotICoKLSAqIFRoZSBudW1iZXIgb2YgYG90aGVyYCBwYXJhbWV0ZXJzIHZhcmllcyBkZXBlbmRpbmcgb24gdGhlIGBPYmplY3RUeXBlYC4gRm9yCi0gKiBleGFtcGxlLCBpbiB0aGUgcHJvY2VzcyBvZiB1bmZsYXR0ZW5pbmcgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMKLSAqIGBoaWRsX2hhbmRsZWAsIGBvdGhlcmAgaXMgbmVlZGVkIHRvIGhvbGQgYG5hdGl2ZV9oYW5kbGVfdGAgb2JqZWN0cyB0aGF0IHdpbGwKLSAqIGJlIGNyZWF0ZWQuCi0gKgotICogVGhlIGxhc3QgZm91ciBwYXJhbWV0ZXJzIGFsd2F5cyB3b3JrIHRoZSBzYW1lIHdheSBpbiBhbGwgb3ZlcmxvYWRzIG9mCi0gKiBgZmxhdHRlbigpYCBhbmQgYHVuZmxhdHRlbigpYDoKLSAqIC0gRm9yIGBmbGF0dGVuKClgLCBgYnVmZmVyYCBpcyB0aGUgcG9pbnRlciB0byB0aGUgbm9uLWZkIGJ1ZmZlciB0byBiZSBmaWxsZWQsCi0gKiAgIGBzaXplYCBpcyB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSBub24tZmQgYnVmZmVyIHBvaW50ZWQgdG8gYnkgYGJ1ZmZlcmAsCi0gKiAgIGBmZHNgIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBmZCBidWZmZXIgdG8gYmUgZmlsbGVkLCBhbmQgYG51bUZkc2AgaXMgdGhlCi0gKiAgIHNpemUgKGluIGludHMpIG9mIHRoZSBmZCBidWZmZXIgcG9pbnRlZCB0byBieSBgZmRzYC4KLSAqIC0gRm9yIGB1bmZsYXR0ZW4oKWAsIGBidWZmZXJgIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBub24tZmQgYnVmZmVyIHRvIGJlIHJlYWQKLSAqICAgZnJvbSwgYHNpemVgIGlzIHRoZSBzaXplIChpbiBieXRlcykgb2YgdGhlIG5vbi1mZCBidWZmZXIgcG9pbnRlZCB0byBieQotICogICBgYnVmZmVyYCwgYGZkc2AgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIGZkIGJ1ZmZlciB0byBiZSByZWFkIGZyb20sIGFuZAotICogICBgbnVtRmRzYCBpcyB0aGUgc2l6ZSAoaW4gaW50cykgb2YgdGhlIGZkIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IGBmZHNgLgotICogLSBBZnRlciBhIHN1Y2Nlc3NmdWwgY2FsbCB0byBgZmxhdHRlbigpYCBvciBgdW5mbGF0dGVuKClgLCBgYnVmZmVyYCBhbmQgYGZkc2AKLSAqICAgd2lsbCBiZSBhZHZhbmNlZCwgd2hpbGUgYHNpemVgIGFuZCBgbnVtRmRzYCB3aWxsIGJlIGRlY3JlYXNlZCB0byByZWZsZWN0Ci0gKiAgIGhvdyBtdWNoIHN0b3JhZ2UvZGF0YSBvZiB0aGUgdHdvIGJ1ZmZlcnMgKGZkIGFuZCBub24tZmQpIGhhdmUgYmVlbiB1c2VkLgotICogLSBBZnRlciBhbiB1bnN1Y2Nlc3NmdWwgY2FsbCwgdGhlIHZhbHVlcyBvZiBgYnVmZmVyYCwgYHNpemVgLCBgZmRzYCBhbmQKLSAqICAgYG51bUZkc2AgYXJlIGludmFsaWQuCi0gKgotICogVGhlIHJldHVybiB2YWx1ZSBvZiBhIHN1Y2Nlc3NmdWwgYGZsYXR0ZW4oKWAgb3IgYHVuZmxhdHRlbigpYCBjYWxsIHdpbGwgYmUKLSAqIGBPS2AgKGFsc28gYWxpYXNlZCBhcyBgTk9fRVJST1JgKS4gQW55IG90aGVyIHZhbHVlcyBpbmRpY2F0ZSBhIGZhaWx1cmUuCi0gKgotICogRm9yIGVhY2ggb2JqZWN0IHR5cGUgdGhhdCBzdXBwb3J0cyBmbGF0dGVuaW5nLCB0aGVyZSB3aWxsIGJlIHR3byBhY2NvbXBhbnlpbmcKLSAqIGZ1bmN0aW9uczogYGdldEZsYXR0ZW5lZFNpemUoKWAgYW5kIGBnZXRGZENvdW50KClgLiBgZ2V0RmxhdHRlbmVkU2l6ZSgpYCB3aWxsCi0gKiByZXR1cm4gdGhlIHNpemUgb2YgdGhlIG5vbi1mZCBidWZmZXIgdGhhdCB0aGUgb2JqZWN0IHdpbGwgbmVlZCBmb3IKLSAqIGZsYXR0ZW5pbmcuIGBnZXRGZENvdW50KClgIHdpbGwgcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBmZCBidWZmZXIgdGhhdCB0aGUKLSAqIG9iamVjdCB3aWxsIG5lZWQgZm9yIGZsYXR0ZW5pbmcuCi0gKgotICogVGhlIHNldCBvZiB0aGVzZSBmb3VyIGZ1bmN0aW9ucywgYGdldEZsYXR0ZW5lZFNpemUoKWAsIGBnZXRGZENvdW50KClgLAotICogYGZsYXR0ZW4oKWAgYW5kIGB1bmZsYXR0ZW4oKWAsIGFyZSBzaW1pbGFyIHRvIGZ1bmN0aW9ucyBvZiB0aGUgc2FtZSBuYW1lIGluCi0gKiB0aGUgYWJzdHJhY3QgY2xhc3MgYEZsYXR0ZW5hYmxlYC4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGF0IGZ1bmN0aW9ucyBpbgotICogdGhpcyBmaWxlIGFyZSBub3QgbWVtYmVyIGZ1bmN0aW9ucyBvZiB0aGUgb2JqZWN0IHR5cGUuIEZvciBleGFtcGxlLCB3ZSB3cml0ZQotICoKLSAqICAgICBmbGF0dGVuKHgsIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpCi0gKgotICogaW5zdGVhZCBvZgotICoKLSAqICAgICB4LmZsYXR0ZW4oYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcykKLSAqCi0gKiBiZWNhdXNlIHdlIGNhbm5vdCBtb2RpZnkgdGhlIHR5cGUgb2YgYHhgLgotICoKLSAqIFRoZXJlIGlzIG9uZSBleGNlcHRpb24gdG8gdGhlIG5hbWluZyBjb252ZW50aW9uOiBgaGlkbF9oYW5kbGVgIHRoYXQKLSAqIHJlcHJlc2VudHMgYSBmZW5jZS4gVGhlIGZvdXIgZnVuY3Rpb25zIGZvciB0aGlzICJGZW5jZSIgdHlwZSBoYXZlIHRoZSB3b3JkCi0gKiAiRmVuY2UiIGF0dGNoZWQgdG8gdGhlaXIgbmFtZXMgYmVjYXVzZSB0aGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzCi0gKiBgaGlkbF9oYW5kbGVgLCBkb2VzIG5vdCBjYXJyeSB0aGUgc3BlY2lhbCBtZWFuaW5nIHRoYXQgdGhlIG9iamVjdCBpdHNlbGYgY2FuCi0gKiBvbmx5IGNvbnRhaW4gemVybyBvciBvbmUgZmlsZSBkZXNjcmlwdG9yLgotICovCi0KLS8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy91aS9GZW5jZS5jcHAKLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub24tZmQgYnVmZmVyIHJlcXVpcmVkIHRvIGZsYXR0ZW4gYSBmZW5jZS4KLSAqCi0gKiBccGFyYW1baW5dIGZlbmNlIFRoZSBpbnB1dCBmZW5jZSBvZiB0eXBlIGBoaWRsX2hhbmRsZWAuCi0gKiBccmV0dXJuIFRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KLSAqCi0gKiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgNCwgd2hpY2ggaXMgdGhlIG51bWJlciBvZgotICogYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiB0aGUgZmQKLSAqIHBhcnQgb2YgdGhlIGZsYXQgYnVmZmVyLgotICovCi1pbmxpbmUgc2l6ZV90IGdldEZlbmNlRmxhdHRlbmVkU2l6ZShoaWRsX2hhbmRsZSBjb25zdCYgLyogZmVuY2UgKi8pIHsKLSAgICByZXR1cm4gNDsKLX07Ci0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIGEgZmVuY2UuCi0gKgotICogXHBhcmFtW2luXSBmZW5jZSBUaGUgaW5wdXQgZmVuY2Ugb2YgdHlwZSBgaGlkbF9oYW5kbGVgLgotICogXHJldHVybiBgMGAgaWYgXHAgZmVuY2UgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvciwgb3IgYDFgCi0gKiBvdGhlcndpc2UuCi0gKi8KLWlubGluZSBzaXplX3QgZ2V0RmVuY2VGZENvdW50KGhpZGxfaGFuZGxlIGNvbnN0JiBmZW5jZSkgewotICAgIHJldHVybiBuYXRpdmVfaGFuZGxlX3JlYWRfZmQoZmVuY2UpID09IC0xID8gMCA6IDE7Ci19Ci0KLS8qKgotICogXGJyaWVmIFVuZmxhdHRlbiBgRmVuY2VgIHRvIGBoaWRsX2hhbmRsZWAuCi0gKgotICogXHBhcmFtW291dF0gZmVuY2UgVGhlIGRlc3RpbmF0aW9uIGBoaWRsX2hhbmRsZWAuCi0gKiBccGFyYW1bb3V0XSBuaCBUaGUgdW5kZXJseWluZyBuYXRpdmUgaGFuZGxlLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICoKLSAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYE5PX0VSUk9SYCwgXHAgbmggd2lsbCBwb2ludCB0byBhIG5ld2x5IGNyZWF0ZWQKLSAqIG5hdGl2ZSBoYW5kbGUsIHdoaWNoIG5lZWRzIHRvIGJlIGRlbGV0ZWQgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAKLSAqIGFmdGVyd2FyZHMuCi0gKi8KLWlubGluZSBzdGF0dXNfdCB1bmZsYXR0ZW5GZW5jZShoaWRsX2hhbmRsZSogZmVuY2UsIG5hdGl2ZV9oYW5kbGVfdCoqIG5oLAotICAgICAgICB2b2lkIGNvbnN0KiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludCBjb25zdComIGZkcywgc2l6ZV90JiBudW1GZHMpIHsKLSAgICBpZiAoc2l6ZSA8IDQpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBudW1GZHNJbkhhbmRsZTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgbnVtRmRzSW5IYW5kbGUpOwotCi0gICAgaWYgKG51bUZkc0luSGFuZGxlID4gMSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIGlmIChudW1GZHMgPCBudW1GZHNJbkhhbmRsZSkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLQotICAgIGlmIChudW1GZHNJbkhhbmRsZSkgewotICAgICAgICAqbmggPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZV9mcm9tX2ZkKCpmZHMpOwotICAgICAgICBpZiAoKm5oID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgIH0KLSAgICAgICAgKmZlbmNlID0gKm5oOwotICAgICAgICArK2ZkczsKLSAgICAgICAgLS1udW1GZHM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKm5oID0gbnVsbHB0cjsKLSAgICAgICAgKmZlbmNlID0gaGlkbF9oYW5kbGUoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8qKgotICogXGJyaWVmIEZsYXR0ZW4gYGhpZGxfaGFuZGxlYCBhcyBgRmVuY2VgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBoaWRsX2hhbmRsZWAuCi0gKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKi8KLWlubGluZSBzdGF0dXNfdCBmbGF0dGVuRmVuY2UoaGlkbF9oYW5kbGUgY29uc3QmIGZlbmNlLAotICAgICAgICB2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludComIGZkcywgc2l6ZV90JiBudW1GZHMpIHsKLSAgICBpZiAoc2l6ZSA8IGdldEZlbmNlRmxhdHRlbmVkU2l6ZShmZW5jZSkgfHwKLSAgICAgICAgICAgIG51bUZkcyA8IGdldEZlbmNlRmRDb3VudChmZW5jZSkpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0gICAgLy8gQ2FzdCB0byB1aW50MzJfdCBzaW5jZSB0aGUgc2l6ZSBvZiBhIHNpemVfdCBjYW4gdmFyeSBiZXR3ZWVuIDMyLSBhbmQKLSAgICAvLyA2NC1iaXQgcHJvY2Vzc2VzCi0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGdldEZlbmNlRmRDb3VudChmZW5jZSkpKTsKLSAgICBpbnQgZmQgPSBuYXRpdmVfaGFuZGxlX3JlYWRfZmQoZmVuY2UpOwotICAgIGlmIChmZCAhPSAtMSkgewotICAgICAgICAqZmRzID0gZmQ7Ci0gICAgICAgICsrZmRzOwotICAgICAgICAtLW51bUZkczsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vKioKLSAqIFxicmllZiBXcmFwIGBGZW5jZWAgaW4gYGhpZGxfaGFuZGxlYC4KLSAqCi0gKiBccGFyYW1bb3V0XSB0IFRoZSB3cmFwcGVyIG9mIHR5cGUgYGhpZGxfaGFuZGxlYC4KLSAqIFxwYXJhbVtvdXRdIG5oIFRoZSBuYXRpdmUgaGFuZGxlIHBvaW50ZWQgdG8gYnkgXHAgdC4KLSAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBGZW5jZWAuCi0gKgotICogT24gc3VjY2VzcywgXHAgbmggd2lsbCBob2xkIGEgbmV3bHkgY3JlYXRlZCBuYXRpdmUgaGFuZGxlLCB3aGljaCBtdXN0IGJlCi0gKiBkZWxldGVkIG1hbnVhbGx5IHdpdGggYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgIGFmdGVyd2FyZHMuCi0gKi8KLS8vIHdyYXA6IEZlbmNlIC0+IGhpZGxfaGFuZGxlCi1pbmxpbmUgYm9vbCB3cmFwQXMoaGlkbF9oYW5kbGUqIHQsIG5hdGl2ZV9oYW5kbGVfdCoqIG5oLCBGZW5jZSBjb25zdCYgbCkgewotICAgIHNpemVfdCBjb25zdCBiYXNlU2l6ZSA9IGwuZ2V0RmxhdHRlbmVkU2l6ZSgpOwotICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJhc2VCdWZmZXIoCi0gICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtiYXNlU2l6ZV0pOwotICAgIGlmICghYmFzZUJ1ZmZlcikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc2l6ZV90IGNvbnN0IGJhc2VOdW1GZHMgPSBsLmdldEZkQ291bnQoKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8aW50W10+IGJhc2VGZHMoCi0gICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgaW50W2Jhc2VOdW1GZHNdKTsKLSAgICBpZiAoIWJhc2VGZHMpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQqIGJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQqPihiYXNlQnVmZmVyLmdldCgpKTsKLSAgICBzaXplX3Qgc2l6ZSA9IGJhc2VTaXplOwotICAgIGludCogZmRzID0gc3RhdGljX2Nhc3Q8aW50Kj4oYmFzZUZkcy5nZXQoKSk7Ci0gICAgc2l6ZV90IG51bUZkcyA9IGJhc2VOdW1GZHM7Ci0gICAgaWYgKGwuZmxhdHRlbihidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCBjb25zdCogY29uc3RCdWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkIGNvbnN0Kj4oYmFzZUJ1ZmZlci5nZXQoKSk7Ci0gICAgc2l6ZSA9IGJhc2VTaXplOwotICAgIGludCBjb25zdCogY29uc3RGZHMgPSBzdGF0aWNfY2FzdDxpbnQgY29uc3QqPihiYXNlRmRzLmdldCgpKTsKLSAgICBudW1GZHMgPSBiYXNlTnVtRmRzOwotICAgIGlmICh1bmZsYXR0ZW5GZW5jZSh0LCBuaCwgY29uc3RCdWZmZXIsIHNpemUsIGNvbnN0RmRzLCBudW1GZHMpCi0gICAgICAgICAgICAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYGhpZGxfaGFuZGxlYCB0byBgRmVuY2VgLgotICoKLSAqIFxwYXJhbVtvdXRdIGwgVGhlIGRlc3RpbmF0aW9uIGBGZW5jZWAuIGBsYCBtdXN0IG5vdCBoYXZlIGJlZW4gdXNlZAotICogKGBsLT5pc1ZhbGlkKClgIG11c3QgcmV0dXJuIGBmYWxzZWApIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBoaWRsX2hhbmRsZWAuCi0gKgotICogSWYgXHAgdCBjb250YWlucyBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvciwgaXQgd2lsbCBiZSBkdXBsaWNhdGVkLgotICovCi0vLyBjb252ZXJ0OiBoaWRsX2hhbmRsZSAtPiBGZW5jZQotaW5saW5lIGJvb2wgY29udmVydFRvKEZlbmNlKiBsLCBoaWRsX2hhbmRsZSBjb25zdCYgdCkgewotICAgIGludCBmZCA9IG5hdGl2ZV9oYW5kbGVfcmVhZF9mZCh0KTsKLSAgICBpZiAoZmQgIT0gLTEpIHsKLSAgICAgICAgZmQgPSBkdXAoZmQpOwotICAgICAgICBpZiAoZmQgPT0gLTEpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBuYXRpdmVfaGFuZGxlX3QqIG5oID0gbmF0aXZlX2hhbmRsZV9jcmVhdGVfZnJvbV9mZChmZCk7Ci0gICAgaWYgKG5oID09IG51bGxwdHIpIHsKLSAgICAgICAgaWYgKGZkICE9IC0xKSB7Ci0gICAgICAgICAgICBjbG9zZShmZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHNpemVfdCBjb25zdCBiYXNlU2l6ZSA9IGdldEZlbmNlRmxhdHRlbmVkU2l6ZSh0KTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBiYXNlQnVmZmVyKAotICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3RbYmFzZVNpemVdKTsKLSAgICBpZiAoIWJhc2VCdWZmZXIpIHsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc2l6ZV90IGNvbnN0IGJhc2VOdW1GZHMgPSBnZXRGZW5jZUZkQ291bnQodCk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPGludFtdPiBiYXNlRmRzKAotICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIGludFtiYXNlTnVtRmRzXSk7Ci0gICAgaWYgKCFiYXNlRmRzKSB7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQqIGJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQqPihiYXNlQnVmZmVyLmdldCgpKTsKLSAgICBzaXplX3Qgc2l6ZSA9IGJhc2VTaXplOwotICAgIGludCogZmRzID0gc3RhdGljX2Nhc3Q8aW50Kj4oYmFzZUZkcy5nZXQoKSk7Ci0gICAgc2l6ZV90IG51bUZkcyA9IGJhc2VOdW1GZHM7Ci0gICAgaWYgKGZsYXR0ZW5GZW5jZShoaWRsX2hhbmRsZShuaCksIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7Ci0KLSAgICB2b2lkIGNvbnN0KiBjb25zdEJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQgY29uc3QqPihiYXNlQnVmZmVyLmdldCgpKTsKLSAgICBzaXplID0gYmFzZVNpemU7Ci0gICAgaW50IGNvbnN0KiBjb25zdEZkcyA9IHN0YXRpY19jYXN0PGludCBjb25zdCo+KGJhc2VGZHMuZ2V0KCkpOwotICAgIG51bUZkcyA9IGJhc2VOdW1GZHM7Ci0gICAgaWYgKGwtPnVuZmxhdHRlbihjb25zdEJ1ZmZlciwgc2l6ZSwgY29uc3RGZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvdWkvRmVuY2VUaW1lLmNwcDogRmVuY2VUaW1lOjpTbmFwc2hvdAotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIG5vbi1mZCBidWZmZXIgcmVxdWlyZWQgdG8gZmxhdHRlbgotICogYEZlbmNlVGltZVNuYXBzaG90YC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBGZW5jZVRpbWVTbmFwc2hvdGAuCi0gKiBccmV0dXJuIFRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KLSAqLwotaW5saW5lIHNpemVfdCBnZXRGbGF0dGVuZWRTaXplKAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdCBjb25zdCYgdCkgewotICAgIGNvbnN0ZXhwciBzaXplX3QgbWluID0gc2l6ZW9mKHQuc3RhdGUpOwotICAgIHN3aXRjaCAodC5zdGF0ZSkgewotICAgICAgICBjYXNlIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90OjpTdGF0ZTo6RU1QVFk6Ci0gICAgICAgICAgICByZXR1cm4gbWluOwotICAgICAgICBjYXNlIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90OjpTdGF0ZTo6RkVOQ0U6Ci0gICAgICAgICAgICByZXR1cm4gbWluICsgZ2V0RmVuY2VGbGF0dGVuZWRTaXplKHQuZmVuY2UpOwotICAgICAgICBjYXNlIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90OjpTdGF0ZTo6U0lHTkFMX1RJTUU6Ci0gICAgICAgICAgICByZXR1cm4gbWluICsgc2l6ZW9mKAotICAgICAgICAgICAgICAgICAgICA6OmFuZHJvaWQ6OkZlbmNlVGltZTo6U25hcHNob3Q6OnNpZ25hbFRpbWUpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4KLSAqIGBGZW5jZVRpbWVTbmFwc2hvdGAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgRmVuY2VUaW1lU25hcHNob3RgLgotICogXHJldHVybiBUaGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHNuYXBzaG90LgotICovCi1pbmxpbmUgc2l6ZV90IGdldEZkQ291bnQoCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90IGNvbnN0JiB0KSB7Ci0gICAgcmV0dXJuIHQuc3RhdGUgPT0KLSAgICAgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90OjpTdGF0ZTo6RkVOQ0UgPwotICAgICAgICAgICAgZ2V0RmVuY2VGZENvdW50KHQuZmVuY2UpIDogMDsKLX0KLQotLyoqCi0gKiBcYnJpZWYgRmxhdHRlbiBgRmVuY2VUaW1lU25hcHNob3RgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBGZW5jZVRpbWVTbmFwc2hvdGAuCi0gKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSB0aGUgZmlsZSBkZXNjcmlwdG9yIGluIGB0LmZlbmNlYCBpZiBgdC5zdGF0ZSA9PQotICogRkVOQ0VgLgotICovCi1pbmxpbmUgc3RhdHVzX3QgZmxhdHRlbihIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdCBjb25zdCYgdCwKLSAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQqJiBmZHMsIHNpemVfdCYgbnVtRmRzKSB7Ci0gICAgaWYgKHNpemUgPCBnZXRGbGF0dGVuZWRTaXplKHQpKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotCi0gICAgc3dpdGNoICh0LnN0YXRlKSB7Ci0gICAgICAgIGNhc2UgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3Q6OlN0YXRlOjpFTVBUWToKLSAgICAgICAgICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgOjphbmRyb2lkOjpGZW5jZVRpbWU6OlNuYXBzaG90OjpTdGF0ZTo6RU1QVFkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICBjYXNlIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90OjpTdGF0ZTo6RkVOQ0U6Ci0gICAgICAgICAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsCi0gICAgICAgICAgICAgICAgICAgIDo6YW5kcm9pZDo6RmVuY2VUaW1lOjpTbmFwc2hvdDo6U3RhdGU6OkZFTkNFKTsKLSAgICAgICAgICAgIHJldHVybiBmbGF0dGVuRmVuY2UodC5mZW5jZSwgYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcyk7Ci0gICAgICAgIGNhc2UgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3Q6OlN0YXRlOjpTSUdOQUxfVElNRToKLSAgICAgICAgICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgOjphbmRyb2lkOjpGZW5jZVRpbWU6OlNuYXBzaG90OjpTdGF0ZTo6U0lHTkFMX1RJTUUpOwotICAgICAgICAgICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0LnNpZ25hbFRpbWVOcyk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLyoqCi0gKiBcYnJpZWYgVW5mbGF0dGVuIGBGZW5jZVRpbWVTbmFwc2hvdGAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgZGVzdGluYXRpb24gYEZlbmNlVGltZVNuYXBzaG90YC4KLSAqIFxwYXJhbVtvdXRdIG5oIFRoZSB1bmRlcmx5aW5nIG5hdGl2ZSBoYW5kbGUuCi0gKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKgotICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBgTk9fRVJST1JgIGFuZCB0aGUgY29uc3RydWN0ZWQgc25hcHNob3QgY29udGFpbnMgYQotICogZmlsZSBkZXNjcmlwdG9yLCBccCBuaCB3aWxsIGJlIGNyZWF0ZWQgdG8gaG9sZCB0aGF0IGZpbGUgZGVzY3JpcHRvci4gSW4gdGhpcwotICogY2FzZSwgXHAgbmggbmVlZHMgdG8gYmUgZGVsZXRlZCB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYCBhZnRlcndhcmRzLgotICovCi1pbmxpbmUgc3RhdHVzX3QgdW5mbGF0dGVuKAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdCogdCwgbmF0aXZlX2hhbmRsZV90KiogbmgsCi0gICAgICAgIHZvaWQgY29uc3QqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50IGNvbnN0KiYgZmRzLCBzaXplX3QmIG51bUZkcykgewotICAgIGlmIChzaXplIDwgc2l6ZW9mKHQtPnN0YXRlKSkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLQotICAgICpuaCA9IG51bGxwdHI7Ci0gICAgOjphbmRyb2lkOjpGZW5jZVRpbWU6OlNuYXBzaG90OjpTdGF0ZSBzdGF0ZTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgc3RhdGUpOwotICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgY2FzZSA6OmFuZHJvaWQ6OkZlbmNlVGltZTo6U25hcHNob3Q6OlN0YXRlOjpFTVBUWToKLSAgICAgICAgICAgIHQtPnN0YXRlID0gSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3Q6OlN0YXRlOjpFTVBUWTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgY2FzZSA6OmFuZHJvaWQ6OkZlbmNlVGltZTo6U25hcHNob3Q6OlN0YXRlOjpGRU5DRToKLSAgICAgICAgICAgIHQtPnN0YXRlID0gSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3Q6OlN0YXRlOjpGRU5DRTsKLSAgICAgICAgICAgIHJldHVybiB1bmZsYXR0ZW5GZW5jZSgmdC0+ZmVuY2UsIG5oLCBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKTsKLSAgICAgICAgY2FzZSA6OmFuZHJvaWQ6OkZlbmNlVGltZTo6U25hcHNob3Q6OlN0YXRlOjpTSUdOQUxfVElNRToKLSAgICAgICAgICAgIHQtPnN0YXRlID0gSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3Q6OlN0YXRlOjpTSUdOQUxfVElNRTsKLSAgICAgICAgICAgIGlmIChzaXplIDwgc2l6ZW9mKHQtPnNpZ25hbFRpbWVOcykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHQtPnNpZ25hbFRpbWVOcyk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy8gUmVmOiBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL2d1aS9GcmFtZVRpbWVzdGFtcHMuY3BwOiBGcmFtZUV2ZW50c0RlbHRhCi0KLS8qKgotICogXGJyaWVmIFJldHVybiBhIGxvd2VyIGJvdW5kIG9uIHRoZSBzaXplIG9mIHRoZSBub24tZmQgYnVmZmVyIHJlcXVpcmVkIHRvCi0gKiBmbGF0dGVuIGBGcmFtZUV2ZW50c0RlbHRhYC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBGcmFtZUV2ZW50c0RlbHRhYC4KLSAqIFxyZXR1cm4gQSBsb3dlciBib3VuZCBvbiB0aGUgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCi0gKi8KLWNvbnN0ZXhwciBzaXplX3QgbWluRmxhdHRlbmVkU2l6ZSgKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudHNEZWx0YSBjb25zdCYgLyogdCAqLykgewotICAgIHJldHVybiBzaXplb2YodWludDY0X3QpICsgLy8gbUZyYW1lTnVtYmVyCi0gICAgICAgICAgICBzaXplb2YodWludDhfdCkgKyAvLyBtSW5kZXgKLSAgICAgICAgICAgIHNpemVvZih1aW50OF90KSArIC8vIG1BZGRQb3N0Q29tcG9zaXRlQ2FsbGVkCi0gICAgICAgICAgICBzaXplb2YodWludDhfdCkgKyAvLyBtQWRkUmV0aXJlQ2FsbGVkCi0gICAgICAgICAgICBzaXplb2YodWludDhfdCkgKyAvLyBtQWRkUmVsZWFzZUNhbGxlZAotICAgICAgICAgICAgc2l6ZW9mKG5zZWNzX3QpICsgLy8gbVBvc3RlZFRpbWUKLSAgICAgICAgICAgIHNpemVvZihuc2Vjc190KSArIC8vIG1SZXF1ZXN0ZWRQcmVzZW50VGltZQotICAgICAgICAgICAgc2l6ZW9mKG5zZWNzX3QpICsgLy8gbUxhdGNoVGltZQotICAgICAgICAgICAgc2l6ZW9mKG5zZWNzX3QpICsgLy8gbUZpcnN0UmVmcmVzaFN0YXJ0VGltZQotICAgICAgICAgICAgc2l6ZW9mKG5zZWNzX3QpOyAvLyBtTGFzdFJlZnJlc2hTdGFydFRpbWUKLX0KLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub24tZmQgYnVmZmVyIHJlcXVpcmVkIHRvIGZsYXR0ZW4KLSAqIGBGcmFtZUV2ZW50c0RlbHRhYC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBGcmFtZUV2ZW50c0RlbHRhYC4KLSAqIFxyZXR1cm4gVGhlIHJlcXVpcmVkIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgotICovCi1pbmxpbmUgc2l6ZV90IGdldEZsYXR0ZW5lZFNpemUoCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRzRGVsdGEgY29uc3QmIHQpIHsKLSAgICByZXR1cm4gbWluRmxhdHRlbmVkU2l6ZSh0KSArCi0gICAgICAgICAgICBnZXRGbGF0dGVuZWRTaXplKHQuZ3B1Q29tcG9zaXRpb25Eb25lRmVuY2UpICsKLSAgICAgICAgICAgIGdldEZsYXR0ZW5lZFNpemUodC5kaXNwbGF5UHJlc2VudEZlbmNlKSArCi0gICAgICAgICAgICBnZXRGbGF0dGVuZWRTaXplKHQuZGlzcGxheVJldGlyZUZlbmNlKSArCi0gICAgICAgICAgICBnZXRGbGF0dGVuZWRTaXplKHQucmVsZWFzZUZlbmNlKTsKLX07Ci0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluCi0gKiBgRnJhbWVFdmVudHNEZWx0YWAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgRnJhbWVFdmVudHNEZWx0YWAuCi0gKiBccmV0dXJuIFRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gXHAgdC4KLSAqLwotaW5saW5lIHNpemVfdCBnZXRGZENvdW50KAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50c0RlbHRhIGNvbnN0JiB0KSB7Ci0gICAgcmV0dXJuIGdldEZkQ291bnQodC5ncHVDb21wb3NpdGlvbkRvbmVGZW5jZSkgKwotICAgICAgICAgICAgZ2V0RmRDb3VudCh0LmRpc3BsYXlQcmVzZW50RmVuY2UpICsKLSAgICAgICAgICAgIGdldEZkQ291bnQodC5kaXNwbGF5UmV0aXJlRmVuY2UpICsKLSAgICAgICAgICAgIGdldEZkQ291bnQodC5yZWxlYXNlRmVuY2UpOwotfTsKLQotLyoqCi0gKiBcYnJpZWYgVW5mbGF0dGVuIGBGcmFtZUV2ZW50c0RlbHRhYC4KLSAqCi0gKiBccGFyYW1bb3V0XSB0IFRoZSBkZXN0aW5hdGlvbiBgRnJhbWVFdmVudHNEZWx0YWAuCi0gKiBccGFyYW1bb3V0XSBuaCBUaGUgdW5kZXJseWluZyBhcnJheSBvZiBuYXRpdmUgaGFuZGxlcy4KLSAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KLSAqCi0gKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGBOT19FUlJPUmAsIFxwIG5oIHdpbGwgaGF2ZSBsZW5ndGggNCwgYW5kIGl0IHdpbGwgYmUKLSAqIHBvcHVsYXRlZCB3aXRoIGBudWxscHRyYCBvciBuZXdseSBjcmVhdGVkIGhhbmRsZXMuIEVhY2ggbm9uLW51bGwgc2xvdCBpbiBccAotICogbmggd2lsbCBuZWVkIHRvIGJlIGRlbGV0ZWQgbWFudWFsbHkgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAuCi0gKi8KLWlubGluZSBzdGF0dXNfdCB1bmZsYXR0ZW4oSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudHNEZWx0YSogdCwKLSAgICAgICAgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4qIG5oLAotICAgICAgICB2b2lkIGNvbnN0KiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludCBjb25zdComIGZkcywgc2l6ZV90JiBudW1GZHMpIHsKLSAgICBpZiAoc2l6ZSA8IG1pbkZsYXR0ZW5lZFNpemUoKnQpKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5mcmFtZU51bWJlcik7Ci0KLSAgICAvLyBUaGVzZSB3ZXJlIHdyaXR0ZW4gYXMgdWludDhfdCBmb3IgYWxpZ25tZW50LgotICAgIHVpbnQ4X3QgdGVtcCA9IDA7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHRlbXApOwotICAgIHNpemVfdCBpbmRleCA9IHN0YXRpY19jYXN0PHNpemVfdD4odGVtcCk7Ci0gICAgaWYgKGluZGV4ID49IDo6YW5kcm9pZDo6RnJhbWVFdmVudEhpc3Rvcnk6Ok1BWF9GUkFNRV9ISVNUT1JZKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHQtPmluZGV4ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGluZGV4KTsKLQotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0ZW1wKTsKLSAgICB0LT5hZGRQb3N0Q29tcG9zaXRlQ2FsbGVkID0gc3RhdGljX2Nhc3Q8Ym9vbD4odGVtcCk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHRlbXApOwotICAgIHQtPmFkZFJldGlyZUNhbGxlZCA9IHN0YXRpY19jYXN0PGJvb2w+KHRlbXApOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0ZW1wKTsKLSAgICB0LT5hZGRSZWxlYXNlQ2FsbGVkID0gc3RhdGljX2Nhc3Q8Ym9vbD4odGVtcCk7Ci0KLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdC0+cG9zdGVkVGltZU5zKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdC0+cmVxdWVzdGVkUHJlc2VudFRpbWVOcyk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHQtPmxhdGNoVGltZU5zKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdC0+Zmlyc3RSZWZyZXNoU3RhcnRUaW1lTnMpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5sYXN0UmVmcmVzaFN0YXJ0VGltZU5zKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdC0+ZGVxdWV1ZVJlYWR5VGltZSk7Ci0KLSAgICAvLyBGZW5jZXMKLSAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdCogdFNuYXBzaG90WzRdOwotICAgIHRTbmFwc2hvdFswXSA9ICZ0LT5ncHVDb21wb3NpdGlvbkRvbmVGZW5jZTsKLSAgICB0U25hcHNob3RbMV0gPSAmdC0+ZGlzcGxheVByZXNlbnRGZW5jZTsKLSAgICB0U25hcHNob3RbMl0gPSAmdC0+ZGlzcGxheVJldGlyZUZlbmNlOwotICAgIHRTbmFwc2hvdFszXSA9ICZ0LT5yZWxlYXNlRmVuY2U7Ci0gICAgbmgtPnJlc2l6ZSg0KTsKLSAgICBmb3IgKHNpemVfdCBzbmFwc2hvdEluZGV4ID0gMDsgc25hcHNob3RJbmRleCA8IDQ7ICsrc25hcHNob3RJbmRleCkgewotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSB1bmZsYXR0ZW4oCi0gICAgICAgICAgICAgICAgdFNuYXBzaG90W3NuYXBzaG90SW5kZXhdLCAmKCgqbmgpW3NuYXBzaG90SW5kZXhdKSwKLSAgICAgICAgICAgICAgICBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgd2hpbGUgKHNuYXBzaG90SW5kZXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgLS1zbmFwc2hvdEluZGV4OwotICAgICAgICAgICAgICAgIGlmICgoKm5oKVtzbmFwc2hvdEluZGV4XSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKCgqbmgpW3NuYXBzaG90SW5kZXhdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLyoqCi0gKiBcYnJpZWYgRmxhdHRlbiBgRnJhbWVFdmVudHNEZWx0YWAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEZyYW1lRXZlbnRzRGVsdGFgLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gXHAgdC4KLSAqLwotLy8gUmVmOiBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL2d1aS9GcmFtZVRpbWVzdGFtcC5jcHA6Ci0vLyAgICAgIEZyYW1lRXZlbnRzRGVsdGE6OmZsYXR0ZW4KLWlubGluZSBzdGF0dXNfdCBmbGF0dGVuKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRzRGVsdGEgY29uc3QmIHQsCi0gICAgICAgIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50KiYgZmRzLCBzaXplX3QgbnVtRmRzKSB7Ci0gICAgLy8gQ2hlY2sgdGhhdCB0LmluZGV4IGlzIHdpdGhpbiBhIHZhbGlkIHJhbmdlLgotICAgIGlmICh0LmluZGV4ID49IHN0YXRpY19jYXN0PHVpbnQzMl90PihGcmFtZUV2ZW50SGlzdG9yeTo6TUFYX0ZSQU1FX0hJU1RPUlkpCi0gICAgICAgICAgICB8fCB0LmluZGV4ID4gc3RkOjpudW1lcmljX2xpbWl0czx1aW50OF90Pjo6bWF4KCkpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHQuZnJhbWVOdW1iZXIpOwotCi0gICAgLy8gVGhlc2UgYXJlIHN0YXRpY19jYXN0IHRvIHVpbnQ4X3QgZm9yIGFsaWdubWVudC4KLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHQuaW5kZXgpKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZSgKLSAgICAgICAgICAgIGJ1ZmZlciwgc2l6ZSwgc3RhdGljX2Nhc3Q8dWludDhfdD4odC5hZGRQb3N0Q29tcG9zaXRlQ2FsbGVkKSk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoCi0gICAgICAgICAgICBidWZmZXIsIHNpemUsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHQuYWRkUmV0aXJlQ2FsbGVkKSk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoCi0gICAgICAgICAgICBidWZmZXIsIHNpemUsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHQuYWRkUmVsZWFzZUNhbGxlZCkpOwotCi0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0LnBvc3RlZFRpbWVOcyk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0LnJlcXVlc3RlZFByZXNlbnRUaW1lTnMpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5sYXRjaFRpbWVOcyk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0LmZpcnN0UmVmcmVzaFN0YXJ0VGltZU5zKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHQubGFzdFJlZnJlc2hTdGFydFRpbWVOcyk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0LmRlcXVldWVSZWFkeVRpbWUpOwotCi0gICAgLy8gRmVuY2VzCi0gICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3QgY29uc3QqIHRTbmFwc2hvdFs0XTsKLSAgICB0U25hcHNob3RbMF0gPSAmdC5ncHVDb21wb3NpdGlvbkRvbmVGZW5jZTsKLSAgICB0U25hcHNob3RbMV0gPSAmdC5kaXNwbGF5UHJlc2VudEZlbmNlOwotICAgIHRTbmFwc2hvdFsyXSA9ICZ0LmRpc3BsYXlSZXRpcmVGZW5jZTsKLSAgICB0U25hcHNob3RbM10gPSAmdC5yZWxlYXNlRmVuY2U7Ci0gICAgZm9yIChzaXplX3Qgc25hcHNob3RJbmRleCA9IDA7IHNuYXBzaG90SW5kZXggPCA0OyArK3NuYXBzaG90SW5kZXgpIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZmxhdHRlbigKLSAgICAgICAgICAgICAgICAqKHRTbmFwc2hvdFtzbmFwc2hvdEluZGV4XSksIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy8gUmVmOiBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL2d1aS9GcmFtZVRpbWVzdGFtcHMuY3BwOiBGcmFtZUV2ZW50SGlzdG9yeURlbHRhCi0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbm9uLWZkIGJ1ZmZlciByZXF1aXJlZCB0byBmbGF0dGVuCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKiBccmV0dXJuIFRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KLSAqLwotaW5saW5lIHNpemVfdCBnZXRGbGF0dGVuZWRTaXplKAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIGNvbnN0JiB0KSB7Ci0gICAgc2l6ZV90IHNpemUgPSA0ICsgLy8gbURlbHRhcy5zaXplKCkKLSAgICAgICAgICAgIHNpemVvZih0LmNvbXBvc2l0b3JUaW1pbmcpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdC5kZWx0YXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgc2l6ZSArPSBnZXRGbGF0dGVuZWRTaXplKHQuZGVsdGFzW2ldKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNpemU7Ci19Ci0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKiBccmV0dXJuIFRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gXHAgdC4KLSAqLwotaW5saW5lIHNpemVfdCBnZXRGZENvdW50KAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIGNvbnN0JiB0KSB7Ci0gICAgc2l6ZV90IG51bUZkcyA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0LmRlbHRhcy5zaXplKCk7ICsraSkgewotICAgICAgICBudW1GZHMgKz0gZ2V0RmRDb3VudCh0LmRlbHRhc1tpXSk7Ci0gICAgfQotICAgIHJldHVybiBudW1GZHM7Ci19Ci0KLS8qKgotICogXGJyaWVmIFVuZmxhdHRlbiBgRnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgZGVzdGluYXRpb24gYEZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICogXHBhcmFtW291dF0gbmggVGhlIHVuZGVybHlpbmcgYXJyYXkgb2YgYXJyYXlzIG9mIG5hdGl2ZSBoYW5kbGVzLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICoKLSAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYE5PX0VSUk9SYCwgXHAgbmggd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCBgbnVsbHB0cmAgb3IKLSAqIG5ld2x5IGNyZWF0ZWQgaGFuZGxlcy4gVGhlIHNlY29uZCBkaW1lbnNpb24gb2YgXHAgbmggd2lsbCBiZSA0LiBFYWNoIG5vbi1udWxsCi0gKiBzbG90IGluIFxwIG5oIHdpbGwgbmVlZCB0byBiZSBkZWxldGVkIG1hbnVhbGx5IHdpdGggYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgLgotICovCi1pbmxpbmUgc3RhdHVzX3QgdW5mbGF0dGVuKAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhKiB0LAotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiA+KiBuaCwKLSAgICAgICAgdm9pZCBjb25zdComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQgY29uc3QqJiBmZHMsIHNpemVfdCYgbnVtRmRzKSB7Ci0gICAgaWYgKHNpemUgPCA0KSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotCi0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHQtPmNvbXBvc2l0b3JUaW1pbmcpOwotCi0gICAgdWludDMyX3QgZGVsdGFDb3VudCA9IDA7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIGRlbHRhQ291bnQpOwotICAgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KGRlbHRhQ291bnQpID4KLSAgICAgICAgICAgIDo6YW5kcm9pZDo6RnJhbWVFdmVudEhpc3Rvcnk6Ok1BWF9GUkFNRV9ISVNUT1JZKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHQtPmRlbHRhcy5yZXNpemUoZGVsdGFDb3VudCk7Ci0gICAgbmgtPnJlc2l6ZShkZWx0YUNvdW50KTsKLSAgICBmb3IgKHNpemVfdCBkZWx0YUluZGV4ID0gMDsgZGVsdGFJbmRleCA8IGRlbHRhQ291bnQ7ICsrZGVsdGFJbmRleCkgewotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSB1bmZsYXR0ZW4oCi0gICAgICAgICAgICAgICAgJih0LT5kZWx0YXNbZGVsdGFJbmRleF0pLCAmKCgqbmgpW2RlbHRhSW5kZXhdKSwKLSAgICAgICAgICAgICAgICBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8qKgotICogXGJyaWVmIEZsYXR0ZW4gYEZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZHVwbGljYXRlIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCi0gKi8KLWlubGluZSBzdGF0dXNfdCBmbGF0dGVuKAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIGNvbnN0JiB0LAotICAgICAgICB2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludComIGZkcywgc2l6ZV90JiBudW1GZHMpIHsKLSAgICBpZiAodC5kZWx0YXMuc2l6ZSgpID4gOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeTo6TUFYX0ZSQU1FX0hJU1RPUlkpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgaWYgKHNpemUgPCBnZXRGbGF0dGVuZWRTaXplKHQpKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotCi0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0LmNvbXBvc2l0b3JUaW1pbmcpOwotCi0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4odC5kZWx0YXMuc2l6ZSgpKSk7Ci0gICAgZm9yIChzaXplX3QgZGVsdGFJbmRleCA9IDA7IGRlbHRhSW5kZXggPCB0LmRlbHRhcy5zaXplKCk7ICsrZGVsdGFJbmRleCkgewotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBmbGF0dGVuKHQuZGVsdGFzW2RlbHRhSW5kZXhdLCBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8qKgotICogXGJyaWVmIFdyYXAgYDo6YW5kcm9pZDo6RnJhbWVFdmVudEhpc3RvcnlEYXRhYCBpbgotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICoKLSAqIFxwYXJhbVtvdXRdIHQgVGhlIHdyYXBwZXIgb2YgdHlwZQotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICogXHBhcmFtW291dF0gbmggVGhlIGFycmF5IG9mIGFycmF5IG9mIG5hdGl2ZSBoYW5kbGVzIHRoYXQgYXJlIHJlZmVycmVkIHRvIGJ5Ci0gKiBtZW1iZXJzIG9mIFxwIHQuCi0gKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqCi0gKiBPbiBzdWNjZXNzLCBlYWNoIG1lbWJlciBvZiBccCBuaCB3aWxsIGJlIGVpdGhlciBgbnVsbHB0cmAgb3IgYSBuZXdseSBjcmVhdGVkCi0gKiBuYXRpdmUgaGFuZGxlLiBBbGwgdGhlIG5vbi1gbnVsbHB0cmAgZWxlbWVudHMgbXVzdCBiZSBkZWxldGVkIGluZGl2aWR1YWxseQotICogd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAuCi0gKi8KLWlubGluZSBib29sIHdyYXBBcyhIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhKiB0LAotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiA+KiBuaCwKLSAgICAgICAgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIGNvbnN0JiBsKSB7Ci0KLSAgICBzaXplX3QgY29uc3QgYmFzZVNpemUgPSBsLmdldEZsYXR0ZW5lZFNpemUoKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBiYXNlQnVmZmVyKAotICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3RbYmFzZVNpemVdKTsKLSAgICBpZiAoIWJhc2VCdWZmZXIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHNpemVfdCBjb25zdCBiYXNlTnVtRmRzID0gbC5nZXRGZENvdW50KCk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPGludFtdPiBiYXNlRmRzKAotICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIGludFtiYXNlTnVtRmRzXSk7Ci0gICAgaWYgKCFiYXNlRmRzKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkKiBidWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkKj4oYmFzZUJ1ZmZlci5nZXQoKSk7Ci0gICAgc2l6ZV90IHNpemUgPSBiYXNlU2l6ZTsKLSAgICBpbnQqIGZkcyA9IGJhc2VGZHMuZ2V0KCk7Ci0gICAgc2l6ZV90IG51bUZkcyA9IGJhc2VOdW1GZHM7Ci0gICAgaWYgKGwuZmxhdHRlbihidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCBjb25zdCogY29uc3RCdWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkIGNvbnN0Kj4oYmFzZUJ1ZmZlci5nZXQoKSk7Ci0gICAgc2l6ZSA9IGJhc2VTaXplOwotICAgIGludCBjb25zdCogY29uc3RGZHMgPSBzdGF0aWNfY2FzdDxpbnQgY29uc3QqPihiYXNlRmRzLmdldCgpKTsKLSAgICBudW1GZHMgPSBiYXNlTnVtRmRzOwotICAgIGlmICh1bmZsYXR0ZW4odCwgbmgsIGNvbnN0QnVmZmVyLCBzaXplLCBjb25zdEZkcywgbnVtRmRzKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgIHRvCi0gKiBgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqCi0gKiBccGFyYW1bb3V0XSBsIFRoZSBkZXN0aW5hdGlvbiBgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZHVwbGljYXRlIGFsbCBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCB0LgotICovCi1pbmxpbmUgYm9vbCBjb252ZXJ0VG8oCi0gICAgICAgIDo6YW5kcm9pZDo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSogbCwKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSBjb25zdCYgdCkgewotCi0gICAgc2l6ZV90IGNvbnN0IGJhc2VTaXplID0gZ2V0RmxhdHRlbmVkU2l6ZSh0KTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBiYXNlQnVmZmVyKAotICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3RbYmFzZVNpemVdKTsKLSAgICBpZiAoIWJhc2VCdWZmZXIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHNpemVfdCBjb25zdCBiYXNlTnVtRmRzID0gZ2V0RmRDb3VudCh0KTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8aW50W10+IGJhc2VGZHMoCi0gICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgaW50W2Jhc2VOdW1GZHNdKTsKLSAgICBpZiAoIWJhc2VGZHMpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQqIGJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQqPihiYXNlQnVmZmVyLmdldCgpKTsKLSAgICBzaXplX3Qgc2l6ZSA9IGJhc2VTaXplOwotICAgIGludCogZmRzID0gc3RhdGljX2Nhc3Q8aW50Kj4oYmFzZUZkcy5nZXQoKSk7Ci0gICAgc2l6ZV90IG51bUZkcyA9IGJhc2VOdW1GZHM7Ci0gICAgaWYgKGZsYXR0ZW4odCwgYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQgY29uc3QqIGNvbnN0QnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCBjb25zdCo+KGJhc2VCdWZmZXIuZ2V0KCkpOwotICAgIHNpemUgPSBiYXNlU2l6ZTsKLSAgICBpbnQgY29uc3QqIGNvbnN0RmRzID0gc3RhdGljX2Nhc3Q8aW50IGNvbnN0Kj4oYmFzZUZkcy5nZXQoKSk7Ci0gICAgbnVtRmRzID0gYmFzZU51bUZkczsKLSAgICBpZiAobC0+dW5mbGF0dGVuKGNvbnN0QnVmZmVyLCBzaXplLCBjb25zdEZkcywgbnVtRmRzKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy91aS9SZWdpb24uY3BwCi0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHJlcXVpcmVkIHRvIGZsYXR0ZW4gYFJlZ2lvbmAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgUmVnaW9uYC4KLSAqIFxyZXR1cm4gVGhlIHJlcXVpcmVkIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgotICovCi1pbmxpbmUgc2l6ZV90IGdldEZsYXR0ZW5lZFNpemUoUmVnaW9uIGNvbnN0JiB0KSB7Ci0gICAgcmV0dXJuIHNpemVvZih1aW50MzJfdCkgKyB0LnNpemUoKSAqIHNpemVvZig6OmFuZHJvaWQ6OlJlY3QpOwotfQotCi0vKioKLSAqIFxicmllZiBVbmZsYXR0ZW4gYFJlZ2lvbmAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgZGVzdGluYXRpb24gYFJlZ2lvbmAuCi0gKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCi0gKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KLSAqLwotaW5saW5lIHN0YXR1c190IHVuZmxhdHRlbihSZWdpb24qIHQsIHZvaWQgY29uc3QqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSkgewotICAgIGlmIChzaXplIDwgc2l6ZW9mKHVpbnQzMl90KSkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLQotICAgIHVpbnQzMl90IG51bVJlY3RzID0gMDsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgbnVtUmVjdHMpOwotICAgIGlmIChzaXplIDwgbnVtUmVjdHMgKiBzaXplb2YoUmVjdCkpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0gICAgaWYgKG51bVJlY3RzID4gKFVJTlQzMl9NQVggLyBzaXplb2YoUmVjdCkpKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotCi0gICAgdC0+cmVzaXplKG51bVJlY3RzKTsKLSAgICBmb3IgKHNpemVfdCByID0gMDsgciA8IG51bVJlY3RzOyArK3IpIHsKLSAgICAgICAgOjphbmRyb2lkOjpSZWN0IHJlY3QoOjphbmRyb2lkOjpSZWN0OjpFTVBUWV9SRUNUKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVjdC51bmZsYXR0ZW4oYnVmZmVyLCBzaXplKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBGbGF0dGVuYWJsZVV0aWxzOjphZHZhbmNlKGJ1ZmZlciwgc2l6ZSwgc2l6ZW9mKHJlY3QpKTsKLSAgICAgICAgKCp0KVtyXSA9IFJlY3R7Ci0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVjdC5sZWZ0KSwKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihyZWN0LnRvcCksCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVjdC5yaWdodCksCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVjdC5ib3R0b20pfTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vKioKLSAqIFxicmllZiBGbGF0dGVuIGBSZWdpb25gLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBSZWdpb25gLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKi8KLWlubGluZSBzdGF0dXNfdCBmbGF0dGVuKFJlZ2lvbiBjb25zdCYgdCwgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplKSB7Ci0gICAgaWYgKHNpemUgPCBnZXRGbGF0dGVuZWRTaXplKHQpKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotCi0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4odC5zaXplKCkpKTsKLSAgICBmb3IgKHNpemVfdCByID0gMDsgciA8IHQuc2l6ZSgpOyArK3IpIHsKLSAgICAgICAgOjphbmRyb2lkOjpSZWN0IHJlY3QoCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4odFtyXS5sZWZ0KSwKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90Pih0W3JdLnRvcCksCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4odFtyXS5yaWdodCksCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4odFtyXS5ib3R0b20pKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVjdC5mbGF0dGVuKGJ1ZmZlciwgc2l6ZSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgRmxhdHRlbmFibGVVdGlsczo6YWR2YW5jZShidWZmZXIsIHNpemUsIHNpemVvZihyZWN0KSk7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgOjphbmRyb2lkOjpSZWdpb25gIHRvIGBSZWdpb25gLgotICoKLSAqIFxwYXJhbVtvdXRdIHQgVGhlIGRlc3RpbmF0aW9uIGBSZWdpb25gLgotICogXHBhcmFtW2luXSBsIFRoZSBzb3VyY2UgYDo6YW5kcm9pZDo6UmVnaW9uYC4KLSAqLwotLy8gY29udmVydDogOjphbmRyb2lkOjpSZWdpb24gLT4gUmVnaW9uCi1pbmxpbmUgYm9vbCBjb252ZXJ0VG8oUmVnaW9uKiB0LCA6OmFuZHJvaWQ6OlJlZ2lvbiBjb25zdCYgbCkgewotICAgIHNpemVfdCBjb25zdCBiYXNlU2l6ZSA9IGwuZ2V0RmxhdHRlbmVkU2l6ZSgpOwotICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJhc2VCdWZmZXIoCi0gICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtiYXNlU2l6ZV0pOwotICAgIGlmICghYmFzZUJ1ZmZlcikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCogYnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCo+KGJhc2VCdWZmZXIuZ2V0KCkpOwotICAgIHNpemVfdCBzaXplID0gYmFzZVNpemU7Ci0gICAgaWYgKGwuZmxhdHRlbihidWZmZXIsIHNpemUpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkIGNvbnN0KiBjb25zdEJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQgY29uc3QqPihiYXNlQnVmZmVyLmdldCgpKTsKLSAgICBzaXplID0gYmFzZVNpemU7Ci0gICAgaWYgKHVuZmxhdHRlbih0LCBjb25zdEJ1ZmZlciwgc2l6ZSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGBSZWdpb25gIHRvIGA6OmFuZHJvaWQ6OlJlZ2lvbmAuCi0gKgotICogXHBhcmFtW291dF0gbCBUaGUgZGVzdGluYXRpb24gYDo6YW5kcm9pZDo6UmVnaW9uYC4KLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBSZWdpb25gLgotICovCi0vLyBjb252ZXJ0OiBSZWdpb24gLT4gOjphbmRyb2lkOjpSZWdpb24KLWlubGluZSBib29sIGNvbnZlcnRUbyg6OmFuZHJvaWQ6OlJlZ2lvbiogbCwgUmVnaW9uIGNvbnN0JiB0KSB7Ci0gICAgc2l6ZV90IGNvbnN0IGJhc2VTaXplID0gZ2V0RmxhdHRlbmVkU2l6ZSh0KTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBiYXNlQnVmZmVyKAotICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3RbYmFzZVNpemVdKTsKLSAgICBpZiAoIWJhc2VCdWZmZXIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQqIGJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQqPihiYXNlQnVmZmVyLmdldCgpKTsKLSAgICBzaXplX3Qgc2l6ZSA9IGJhc2VTaXplOwotICAgIGlmIChmbGF0dGVuKHQsIGJ1ZmZlciwgc2l6ZSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQgY29uc3QqIGNvbnN0QnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCBjb25zdCo+KGJhc2VCdWZmZXIuZ2V0KCkpOwotICAgIHNpemUgPSBiYXNlU2l6ZTsKLSAgICBpZiAobC0+dW5mbGF0dGVuKGNvbnN0QnVmZmVyLCBzaXplKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9ndWkvQkdyYXBoaWNCdWZmZXJQcm9kdWNlci5jcHA6Ci0vLyAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQKLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIGEgbG93ZXIgYm91bmQgb24gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciByZXF1aXJlZCB0byBmbGF0dGVuCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKiBccmV0dXJuIEEgbG93ZXIgYm91bmQgb24gdGhlIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgotICovCi1jb25zdGV4cHIgc2l6ZV90IG1pbkZsYXR0ZW5lZFNpemUoCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgY29uc3QmIC8qIHQgKi8pIHsKLSAgICByZXR1cm4gc2l6ZW9mKGludDY0X3QpICsgLy8gdGltZXN0YW1wCi0gICAgICAgICAgICBzaXplb2YoaW50KSArIC8vIGlzQXV0b1RpbWVzdGFtcAotICAgICAgICAgICAgc2l6ZW9mKGFuZHJvaWRfZGF0YXNwYWNlKSArIC8vIGRhdGFTcGFjZQotICAgICAgICAgICAgc2l6ZW9mKDo6YW5kcm9pZDo6UmVjdCkgKyAvLyBjcm9wCi0gICAgICAgICAgICBzaXplb2YoaW50KSArIC8vIHNjYWxpbmdNb2RlCi0gICAgICAgICAgICBzaXplb2YodWludDMyX3QpICsgLy8gdHJhbnNmb3JtCi0gICAgICAgICAgICBzaXplb2YodWludDMyX3QpICsgLy8gc3RpY2t5VHJhbnNmb3JtCi0gICAgICAgICAgICBzaXplb2YoYm9vbCk7IC8vIGdldEZyYW1lVGltZXN0YW1wcwotfQotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciByZXF1aXJlZCB0byBmbGF0dGVuCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKiBccmV0dXJuIFRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KLSAqLwotaW5saW5lIHNpemVfdCBnZXRGbGF0dGVuZWRTaXplKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgY29uc3QmIHQpIHsKLSAgICByZXR1cm4gbWluRmxhdHRlbmVkU2l6ZSh0KSArCi0gICAgICAgICAgICBnZXRGZW5jZUZsYXR0ZW5lZFNpemUodC5mZW5jZSkgKwotICAgICAgICAgICAgZ2V0RmxhdHRlbmVkU2l6ZSh0LnN1cmZhY2VEYW1hZ2UpOwotfQotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbgotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICogXHJldHVybiBUaGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCi0gKi8KLWlubGluZSBzaXplX3QgZ2V0RmRDb3VudCgKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBjb25zdCYgdCkgewotICAgIHJldHVybiBnZXRGZW5jZUZkQ291bnQodC5mZW5jZSk7Ci19Ci0KLS8qKgotICogXGJyaWVmIEZsYXR0ZW4gYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqIFxwYXJhbVtvdXRdIG5oIFRoZSBuYXRpdmUgaGFuZGxlIGNsb25lZCBmcm9tIGB0LmZlbmNlYC4KLSAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZHVwbGljYXRlIHRoZSBmaWxlIGRlc2NyaXB0b3IgaW4gYHQuZmVuY2VgLiAqLwotaW5saW5lIHN0YXR1c190IGZsYXR0ZW4oSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBjb25zdCYgdCwKLSAgICAgICAgbmF0aXZlX2hhbmRsZV90KiogbmgsCi0gICAgICAgIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50KiYgZmRzLCBzaXplX3QmIG51bUZkcykgewotICAgIGlmIChzaXplIDwgZ2V0RmxhdHRlbmVkU2l6ZSh0KSkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLQotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC50aW1lc3RhbXApOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgc3RhdGljX2Nhc3Q8aW50Pih0LmlzQXV0b1RpbWVzdGFtcCkpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGFuZHJvaWRfZGF0YXNwYWNlX3Q+KHQuZGF0YVNwYWNlKSk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCA6OmFuZHJvaWQ6OlJlY3QoCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmNyb3AubGVmdCksCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmNyb3AudG9wKSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHQuY3JvcC5yaWdodCksCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmNyb3AuYm90dG9tKSkpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgc3RhdGljX2Nhc3Q8aW50Pih0LnNjYWxpbmdNb2RlKSk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0LnRyYW5zZm9ybSk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0LnN0aWNreVRyYW5zZm9ybSk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0LmdldEZyYW1lVGltZXN0YW1wcyk7Ci0KLSAgICAqbmggPSB0LmZlbmNlLmdldE5hdGl2ZUhhbmRsZSgpID09IG51bGxwdHIgPwotICAgICAgICAgICAgbnVsbHB0ciA6IG5hdGl2ZV9oYW5kbGVfY2xvbmUodC5mZW5jZSk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gZmxhdHRlbkZlbmNlKGhpZGxfaGFuZGxlKCpuaCksIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgcmV0dXJuIGZsYXR0ZW4odC5zdXJmYWNlRGFtYWdlLCBidWZmZXIsIHNpemUpOwotfQotCi0vKioKLSAqIFxicmllZiBVbmZsYXR0ZW4gYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICoKLSAqIFxwYXJhbVtvdXRdIHQgVGhlIGRlc3RpbmF0aW9uIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqIFxwYXJhbVtvdXRdIG5oIFRoZSB1bmRlcmx5aW5nIG5hdGl2ZSBoYW5kbGUgZm9yIGB0LT5mZW5jZWAuCi0gKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKgotICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBgTk9fRVJST1JgIGFuZCBgdC0+ZmVuY2VgIGNvbnRhaW5zIGEgdmFsaWQgZmlsZQotICogZGVzY3JpcHRvciwgXHAgbmggd2lsbCBiZSBhIG5ld2x5IGNyZWF0ZWQgbmF0aXZlIGhhbmRsZSBob2xkaW5nIHRoYXQgZmlsZQotICogZGVzY3JpcHRvci4gXHAgbmggbmVlZHMgdG8gYmUgZGVsZXRlZCB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYAotICogYWZ0ZXJ3YXJkcy4KLSAqLwotaW5saW5lIHN0YXR1c190IHVuZmxhdHRlbigKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCogdCwgbmF0aXZlX2hhbmRsZV90KiogbmgsCi0gICAgICAgIHZvaWQgY29uc3QqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50IGNvbnN0KiYgZmRzLCBzaXplX3QmIG51bUZkcykgewotICAgIGlmIChzaXplIDwgbWluRmxhdHRlbmVkU2l6ZSgqdCkpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0KLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdC0+dGltZXN0YW1wKTsKLSAgICBpbnQgbElzQXV0b1RpbWVzdGFtcDsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgbElzQXV0b1RpbWVzdGFtcCk7Ci0gICAgdC0+aXNBdXRvVGltZXN0YW1wID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4obElzQXV0b1RpbWVzdGFtcCk7Ci0gICAgYW5kcm9pZF9kYXRhc3BhY2VfdCBsRGF0YVNwYWNlOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCBsRGF0YVNwYWNlKTsKLSAgICB0LT5kYXRhU3BhY2UgPSBzdGF0aWNfY2FzdDxEYXRhc3BhY2U+KGxEYXRhU3BhY2UpOwotICAgIFJlY3QgbENyb3A7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIGxDcm9wKTsKLSAgICB0LT5jcm9wID0gUmVjdHsKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGxDcm9wLmxlZnQpLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4obENyb3AudG9wKSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGxDcm9wLnJpZ2h0KSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGxDcm9wLmJvdHRvbSl9OwotICAgIGludCBsU2NhbGluZ01vZGU7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIGxTY2FsaW5nTW9kZSk7Ci0gICAgdC0+c2NhbGluZ01vZGUgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihsU2NhbGluZ01vZGUpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT50cmFuc2Zvcm0pOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5zdGlja3lUcmFuc2Zvcm0pOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5nZXRGcmFtZVRpbWVzdGFtcHMpOwotCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gdW5mbGF0dGVuRmVuY2UoJih0LT5mZW5jZSksIG5oLAotICAgICAgICAgICAgYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICByZXR1cm4gdW5mbGF0dGVuKCYodC0+c3VyZmFjZURhbWFnZSksIGJ1ZmZlciwgc2l6ZSk7Ci19Ci0KLS8qKgotICogXGJyaWVmIFdyYXAgYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgIGluCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgd3JhcHBlciBvZiB0eXBlCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKiBccGFyYW1bb3V0XSBuaCBUaGUgdW5kZXJseWluZyBuYXRpdmUgaGFuZGxlIGZvciBgdC0+ZmVuY2VgLgotICogXHBhcmFtW2luXSBsIFRoZSBzb3VyY2UgYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICoKLSAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYHRydWVgIGFuZCBgdC0+ZmVuY2VgIGNvbnRhaW5zIGEgdmFsaWQgZmlsZQotICogZGVzY3JpcHRvciwgXHAgbmggd2lsbCBiZSBhIG5ld2x5IGNyZWF0ZWQgbmF0aXZlIGhhbmRsZSBob2xkaW5nIHRoYXQgZmlsZQotICogZGVzY3JpcHRvci4gXHAgbmggbmVlZHMgdG8gYmUgZGVsZXRlZCB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYAotICogYWZ0ZXJ3YXJkcy4KLSAqLwotaW5saW5lIGJvb2wgd3JhcEFzKAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0KiB0LAotICAgICAgICBuYXRpdmVfaGFuZGxlX3QqKiBuaCwKLSAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBjb25zdCYgbCkgewotCi0gICAgc2l6ZV90IGNvbnN0IGJhc2VTaXplID0gbC5nZXRGbGF0dGVuZWRTaXplKCk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gYmFzZUJ1ZmZlcigKLSAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W2Jhc2VTaXplXSk7Ci0gICAgaWYgKCFiYXNlQnVmZmVyKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzaXplX3QgY29uc3QgYmFzZU51bUZkcyA9IGwuZ2V0RmRDb3VudCgpOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxpbnRbXT4gYmFzZUZkcygKLSAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSBpbnRbYmFzZU51bUZkc10pOwotICAgIGlmICghYmFzZUZkcykgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCogYnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCo+KGJhc2VCdWZmZXIuZ2V0KCkpOwotICAgIHNpemVfdCBzaXplID0gYmFzZVNpemU7Ci0gICAgaW50KiBmZHMgPSBiYXNlRmRzLmdldCgpOwotICAgIHNpemVfdCBudW1GZHMgPSBiYXNlTnVtRmRzOwotICAgIGlmIChsLmZsYXR0ZW4oYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQgY29uc3QqIGNvbnN0QnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCBjb25zdCo+KGJhc2VCdWZmZXIuZ2V0KCkpOwotICAgIHNpemUgPSBiYXNlU2l6ZTsKLSAgICBpbnQgY29uc3QqIGNvbnN0RmRzID0gc3RhdGljX2Nhc3Q8aW50IGNvbnN0Kj4oYmFzZUZkcy5nZXQoKSk7Ci0gICAgbnVtRmRzID0gYmFzZU51bUZkczsKLSAgICBpZiAodW5mbGF0dGVuKHQsIG5oLCBjb25zdEJ1ZmZlciwgc2l6ZSwgY29uc3RGZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YCB0bwotICogYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICoKLSAqIFxwYXJhbVtvdXRdIGwgVGhlIGRlc3RpbmF0aW9uIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqCi0gKiBJZiBgdC5mZW5jZWAgaGFzIGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yLCBpdCB3aWxsIGJlIGR1cGxpY2F0ZWQuCi0gKi8KLWlubGluZSBib29sIGNvbnZlcnRUbygKLSAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCogbCwKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBjb25zdCYgdCkgewotCi0gICAgc2l6ZV90IGNvbnN0IGJhc2VTaXplID0gZ2V0RmxhdHRlbmVkU2l6ZSh0KTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBiYXNlQnVmZmVyKAotICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3RbYmFzZVNpemVdKTsKLSAgICBpZiAoIWJhc2VCdWZmZXIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHNpemVfdCBjb25zdCBiYXNlTnVtRmRzID0gZ2V0RmRDb3VudCh0KTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8aW50W10+IGJhc2VGZHMoCi0gICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgaW50W2Jhc2VOdW1GZHNdKTsKLSAgICBpZiAoIWJhc2VGZHMpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQqIGJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQqPihiYXNlQnVmZmVyLmdldCgpKTsKLSAgICBzaXplX3Qgc2l6ZSA9IGJhc2VTaXplOwotICAgIGludCogZmRzID0gYmFzZUZkcy5nZXQoKTsKLSAgICBzaXplX3QgbnVtRmRzID0gYmFzZU51bUZkczsKLSAgICBuYXRpdmVfaGFuZGxlX3QqIG5oOwotICAgIGlmIChmbGF0dGVuKHQsICZuaCwgYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQgY29uc3QqIGNvbnN0QnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCBjb25zdCo+KGJhc2VCdWZmZXIuZ2V0KCkpOwotICAgIHNpemUgPSBiYXNlU2l6ZTsKLSAgICBpbnQgY29uc3QqIGNvbnN0RmRzID0gc3RhdGljX2Nhc3Q8aW50IGNvbnN0Kj4oYmFzZUZkcy5nZXQoKSk7Ci0gICAgbnVtRmRzID0gYmFzZU51bUZkczsKLSAgICBpZiAobC0+dW5mbGF0dGVuKGNvbnN0QnVmZmVyLCBzaXplLCBjb25zdEZkcywgbnVtRmRzKSAhPSBOT19FUlJPUikgewotICAgICAgICBpZiAobmggIT0gbnVsbHB0cikgewotICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShuaCk7Ci0gICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gUmVmOiBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL2d1aS9CR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmNwcDoKLS8vICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQKLQotLyoqCi0gKiBcYnJpZWYgV3JhcCBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgIGluCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgLgotICoKLSAqIFxwYXJhbVtvdXRdIHQgVGhlIHdyYXBwZXIgb2YgdHlwZQotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0YC4KLSAqIFxwYXJhbVtvdXRdIG5oIFRoZSBhcnJheSBvZiBhcnJheSBvZiBuYXRpdmUgaGFuZGxlcyB0aGF0IGFyZSByZWZlcnJlZCB0byBieQotICogbWVtYmVycyBvZiBccCB0LgotICogXHBhcmFtW2luXSBsIFRoZSBzb3VyY2UgYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0YC4KLSAqCi0gKiBPbiBzdWNjZXNzLCBlYWNoIG1lbWJlciBvZiBccCBuaCB3aWxsIGJlIGVpdGhlciBgbnVsbHB0cmAgb3IgYSBuZXdseSBjcmVhdGVkCi0gKiBuYXRpdmUgaGFuZGxlLiBBbGwgdGhlIG5vbi1gbnVsbHB0cmAgZWxlbWVudHMgbXVzdCBiZSBkZWxldGVkIGluZGl2aWR1YWxseQotICogd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAuCi0gKi8KLS8vIHdyYXA6IEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IC0+Ci0vLyBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dAotaW5saW5lIGJvb2wgd3JhcEFzKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0KiB0LAotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiA+KiBuaCwKLSAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgY29uc3QmIGwpIHsKLSAgICBpZiAoIXdyYXBBcygmKHQtPmZyYW1lVGltZXN0YW1wcyksIG5oLCBsLmZyYW1lVGltZXN0YW1wcykpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICB0LT53aWR0aCA9IGwud2lkdGg7Ci0gICAgdC0+aGVpZ2h0ID0gbC5oZWlnaHQ7Ci0gICAgdC0+dHJhbnNmb3JtSGludCA9IGwudHJhbnNmb3JtSGludDsKLSAgICB0LT5udW1QZW5kaW5nQnVmZmVycyA9IGwubnVtUGVuZGluZ0J1ZmZlcnM7Ci0gICAgdC0+bmV4dEZyYW1lTnVtYmVyID0gbC5uZXh0RnJhbWVOdW1iZXI7Ci0gICAgdC0+YnVmZmVyUmVwbGFjZWQgPSBsLmJ1ZmZlclJlcGxhY2VkOwotICAgIHJldHVybiB0cnVlOwotfQotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAgdG8KLSAqIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAuCi0gKgotICogXHBhcmFtW291dF0gbCBUaGUgZGVzdGluYXRpb24gYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0YC4KLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAuCi0gKgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSBhbGwgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gXHAgdC4KLSAqLwotLy8gY29udmVydDogSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgLT4KLS8vIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0Ci1pbmxpbmUgYm9vbCBjb252ZXJ0VG8oCi0gICAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0KiBsLAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCBjb25zdCYgdCkgewotICAgIGlmICghY29udmVydFRvKCYobC0+ZnJhbWVUaW1lc3RhbXBzKSwgdC5mcmFtZVRpbWVzdGFtcHMpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgbC0+d2lkdGggPSB0LndpZHRoOwotICAgIGwtPmhlaWdodCA9IHQuaGVpZ2h0OwotICAgIGwtPnRyYW5zZm9ybUhpbnQgPSB0LnRyYW5zZm9ybUhpbnQ7Ci0gICAgbC0+bnVtUGVuZGluZ0J1ZmZlcnMgPSB0Lm51bVBlbmRpbmdCdWZmZXJzOwotICAgIGwtPm5leHRGcmFtZU51bWJlciA9IHQubmV4dEZyYW1lTnVtYmVyOwotICAgIGwtPmJ1ZmZlclJlcGxhY2VkID0gdC5idWZmZXJSZXBsYWNlZDsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgIHRvCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgotICoKLSAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZWAuCi0gKiBccmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZWAuCi0gKi8KLWlubGluZSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZSB0b09teERpc2Nvbm5lY3RNb2RlKAotICAgICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZSBsKSB7Ci0gICAgc3dpdGNoIChsKSB7Ci0gICAgICAgIGNhc2UgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGU6OkFwaToKLSAgICAgICAgICAgIHJldHVybiBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZTo6QVBJOwotICAgICAgICBjYXNlIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlOjpBbGxMb2NhbDoKLSAgICAgICAgICAgIHJldHVybiBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZTo6QUxMX0xPQ0FMOwotICAgIH0KLSAgICByZXR1cm4gSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGU6OkFQSTsKLX0KLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgIHRvCi0gKiBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgotICoKLSAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZWAuCi0gKiBccmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZWAuCi0gKi8KLWlubGluZSBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZSB0b0d1aURpc2Nvbm5lY3RNb2RlKAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZSB0KSB7Ci0gICAgc3dpdGNoICh0KSB7Ci0gICAgICAgIGNhc2UgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGU6OkFQSToKLSAgICAgICAgICAgIHJldHVybiBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZTo6QXBpOwotICAgICAgICBjYXNlIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlOjpBTExfTE9DQUw6Ci0gICAgICAgICAgICByZXR1cm4gQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGU6OkFsbExvY2FsOwotICAgIH0KLSAgICByZXR1cm4gQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGU6OkFwaTsKLX0KLQogfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCiB9ICAvLyBuYW1lc3BhY2UgVjFfMAogfSAgLy8gbmFtZXNwYWNlIG9teApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214LmgKaW5kZXggYTZhOWQzZS4uNWE0NmIyNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXguaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teC5oCkBAIC0yMCwxMyArMjAsMTUgQEAKICNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXguaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IE9NWE1hc3RlcjsKK3N0cnVjdCBPTVhOb2RlSW5zdGFuY2U7CiAKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgbWVkaWEgewpAQCAtNTAsMTAgKzUyLDkgQEAKIHVzaW5nIDo6YW5kcm9pZDo6d3A7CiAKIHVzaW5nIDo6YW5kcm9pZDo6T01YTWFzdGVyOwotdXNpbmcgOjphbmRyb2lkOjpPbXhOb2RlT3duZXI7CiB1c2luZyA6OmFuZHJvaWQ6Ok9NWE5vZGVJbnN0YW5jZTsKIAotc3RydWN0IE9teCA6IHB1YmxpYyBJT214LCBwdWJsaWMgaGlkbF9kZWF0aF9yZWNpcGllbnQsIHB1YmxpYyBPbXhOb2RlT3duZXIgeworc3RydWN0IE9teCA6IHB1YmxpYyBJT214LCBwdWJsaWMgaGlkbF9kZWF0aF9yZWNpcGllbnQgewogICAgIE9teCgpOwogICAgIHZpcnR1YWwgfk9teCgpOwogCkBAIC02OCw4ICs2OSw4IEBACiAgICAgLy8gTWV0aG9kIGZyb20gaGlkbF9kZWF0aF9yZWNpcGllbnQKICAgICB2b2lkIHNlcnZpY2VEaWVkKHVpbnQ2NF90IGNvb2tpZSwgY29uc3Qgd3A8SUJhc2U+JiB3aG8pIG92ZXJyaWRlOwogCi0gICAgLy8gTWV0aG9kIGZyb20gT214Tm9kZU93bmVyCi0gICAgdmlydHVhbCBzdGF0dXNfdCBmcmVlTm9kZShzcDxPTVhOb2RlSW5zdGFuY2U+IGNvbnN0JiBpbnN0YW5jZSkgb3ZlcnJpZGU7CisgICAgLy8gTWV0aG9kIGZvciBPTVhOb2RlSW5zdGFuY2UKKyAgICBzdGF0dXNfdCBmcmVlTm9kZShzcDxPTVhOb2RlSW5zdGFuY2U+IGNvbnN0JiBpbnN0YW5jZSk7CiAKIHByb3RlY3RlZDoKICAgICBPTVhNYXN0ZXIqIG1NYXN0ZXI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oCmluZGV4IDRhM2ZlMGMuLjMyMmE2OTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDE2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTcsMTQgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9PTVhfVjFfMF9XR1JBUEhJQ0JVRkZFUlBST0RVQ0VSX0gKICNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9PTVhfVjFfMF9XR1JBUEhJQ0JVRkZFUlBST0RVQ0VSX0gKIAotI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9CaW5kZXIuaD4KLSNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgotI2luY2x1ZGUgPGd1aS9JUHJvZHVjZXJMaXN0ZW5lci5oPgotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9idWZmZXJxdWV1ZS8xLjAvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKQEAgLTMzLDY3ICsyNiw4IEBACiBuYW1lc3BhY2UgVjFfMCB7CiBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24gewogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpWMV8wOjpBbndCdWZmZXI7Ci11c2luZyA6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Ci11c2luZyA6OmFuZHJvaWQ6OnNwOwotCi10eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6Ci0gICAgICAgIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKLXR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjoKLSAgICAgICAgSVByb2R1Y2VyTGlzdGVuZXIgSFByb2R1Y2VyTGlzdGVuZXI7Ci0KLXR5cGVkZWYgOjphbmRyb2lkOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI7Ci10eXBlZGVmIDo6YW5kcm9pZDo6SVByb2R1Y2VyTGlzdGVuZXIgQlByb2R1Y2VyTGlzdGVuZXI7Ci11c2luZyA6OmFuZHJvaWQ6OkJuR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwotCi1zdHJ1Y3QgVFdHcmFwaGljQnVmZmVyUHJvZHVjZXIgOiBwdWJsaWMgSEdyYXBoaWNCdWZmZXJQcm9kdWNlciB7Ci0gICAgc3A8QkdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbUJhc2U7Ci0gICAgVFdHcmFwaGljQnVmZmVyUHJvZHVjZXIoc3A8QkdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gY29uc3QmIGJhc2UpOwotICAgIFJldHVybjx2b2lkPiByZXF1ZXN0QnVmZmVyKGludDMyX3Qgc2xvdCwgcmVxdWVzdEJ1ZmZlcl9jYiBfaGlkbF9jYikKLSAgICAgICAgICAgIG92ZXJyaWRlOwotICAgIFJldHVybjxpbnQzMl90PiBzZXRNYXhEZXF1ZXVlZEJ1ZmZlckNvdW50KGludDMyX3QgbWF4RGVxdWV1ZWRCdWZmZXJzKQotICAgICAgICAgICAgb3ZlcnJpZGU7Ci0gICAgUmV0dXJuPGludDMyX3Q+IHNldEFzeW5jTW9kZShib29sIGFzeW5jKSBvdmVycmlkZTsKLSAgICBSZXR1cm48dm9pZD4gZGVxdWV1ZUJ1ZmZlcigKLSAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIFBpeGVsRm9ybWF0IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UsCi0gICAgICAgICAgICBib29sIGdldEZyYW1lVGltZXN0YW1wcywgZGVxdWV1ZUJ1ZmZlcl9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7Ci0gICAgUmV0dXJuPGludDMyX3Q+IGRldGFjaEJ1ZmZlcihpbnQzMl90IHNsb3QpIG92ZXJyaWRlOwotICAgIFJldHVybjx2b2lkPiBkZXRhY2hOZXh0QnVmZmVyKGRldGFjaE5leHRCdWZmZXJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOwotICAgIFJldHVybjx2b2lkPiBhdHRhY2hCdWZmZXIoY29uc3QgQW53QnVmZmVyJiBidWZmZXIsIGF0dGFjaEJ1ZmZlcl9jYiBfaGlkbF9jYikKLSAgICAgICAgICAgIG92ZXJyaWRlOwotICAgIFJldHVybjx2b2lkPiBxdWV1ZUJ1ZmZlcigKLSAgICAgICAgICAgIGludDMyX3Qgc2xvdCwgY29uc3QgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCYgaW5wdXQsCi0gICAgICAgICAgICBxdWV1ZUJ1ZmZlcl9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7Ci0gICAgUmV0dXJuPGludDMyX3Q+IGNhbmNlbEJ1ZmZlcihpbnQzMl90IHNsb3QsIGNvbnN0IGhpZGxfaGFuZGxlJiBmZW5jZSkKLSAgICAgICAgICAgIG92ZXJyaWRlOwotICAgIFJldHVybjx2b2lkPiBxdWVyeShpbnQzMl90IHdoYXQsIHF1ZXJ5X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKLSAgICBSZXR1cm48dm9pZD4gY29ubmVjdChjb25zdCBzcDxIUHJvZHVjZXJMaXN0ZW5lcj4mIGxpc3RlbmVyLAotICAgICAgICAgICAgaW50MzJfdCBhcGksIGJvb2wgcHJvZHVjZXJDb250cm9sbGVkQnlBcHAsCi0gICAgICAgICAgICBjb25uZWN0X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKLSAgICBSZXR1cm48aW50MzJfdD4gZGlzY29ubmVjdCgKLSAgICAgICAgICAgIGludDMyX3QgYXBpLAotICAgICAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGUgbW9kZSkgb3ZlcnJpZGU7Ci0gICAgUmV0dXJuPGludDMyX3Q+IHNldFNpZGViYW5kU3RyZWFtKGNvbnN0IGhpZGxfaGFuZGxlJiBzdHJlYW0pIG92ZXJyaWRlOwotICAgIFJldHVybjx2b2lkPiBhbGxvY2F0ZUJ1ZmZlcnMoCi0gICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgUGl4ZWxGb3JtYXQgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSkgb3ZlcnJpZGU7Ci0gICAgUmV0dXJuPGludDMyX3Q+IGFsbG93QWxsb2NhdGlvbihib29sIGFsbG93KSBvdmVycmlkZTsKLSAgICBSZXR1cm48aW50MzJfdD4gc2V0R2VuZXJhdGlvbk51bWJlcih1aW50MzJfdCBnZW5lcmF0aW9uTnVtYmVyKSBvdmVycmlkZTsKLSAgICBSZXR1cm48dm9pZD4gZ2V0Q29uc3VtZXJOYW1lKGdldENvbnN1bWVyTmFtZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7Ci0gICAgUmV0dXJuPGludDMyX3Q+IHNldFNoYXJlZEJ1ZmZlck1vZGUoYm9vbCBzaGFyZWRCdWZmZXJNb2RlKSBvdmVycmlkZTsKLSAgICBSZXR1cm48aW50MzJfdD4gc2V0QXV0b1JlZnJlc2goYm9vbCBhdXRvUmVmcmVzaCkgb3ZlcnJpZGU7Ci0gICAgUmV0dXJuPGludDMyX3Q+IHNldERlcXVldWVUaW1lb3V0KGludDY0X3QgdGltZW91dE5zKSBvdmVycmlkZTsKLSAgICBSZXR1cm48dm9pZD4gZ2V0TGFzdFF1ZXVlZEJ1ZmZlcihnZXRMYXN0UXVldWVkQnVmZmVyX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKLSAgICBSZXR1cm48dm9pZD4gZ2V0RnJhbWVUaW1lc3RhbXBzKGdldEZyYW1lVGltZXN0YW1wc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7Ci0gICAgUmV0dXJuPHZvaWQ+IGdldFVuaXF1ZUlkKGdldFVuaXF1ZUlkX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKLX07Cit1c2luZyBUV0dyYXBoaWNCdWZmZXJQcm9kdWNlciA9IDo6YW5kcm9pZDo6VFdHcmFwaGljQnVmZmVyUHJvZHVjZXI8CisgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPjsKIAogfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCiB9ICAvLyBuYW1lc3BhY2UgVjFfMApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5oCmluZGV4IGI5ZjIyYWIuLjRlNTZjOTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmgKQEAgLTI4LDcgKzI4LDcgQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQvQm5HcmFwaGljQnVmZmVyU291cmNlLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PbXhHcmFwaGljQnVmZmVyU291cmNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CkBAIC0zNyw3ICszNyw3IEBACiBuYW1lc3BhY2UgVjFfMCB7CiBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24gewogCi11c2luZyA6OmFuZHJvaWQ6OkdyYXBoaWNCdWZmZXJTb3VyY2U7Cit1c2luZyA6OmFuZHJvaWQ6Ok9teEdyYXBoaWNCdWZmZXJTb3VyY2U7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpEYXRhc3BhY2U7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjpDb2xvckFzcGVjdHM7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjpJR3JhcGhpY0J1ZmZlclNvdXJjZTsKQEAgLTY5LDEwICs2OSwxMCBAQAogc3RydWN0IFRXR3JhcGhpY0J1ZmZlclNvdXJjZSA6IHB1YmxpYyBUR3JhcGhpY0J1ZmZlclNvdXJjZSB7CiAgICAgc3RydWN0IFRXT214Tm9kZVdyYXBwZXI7CiAgICAgc3RydWN0IFRXT214QnVmZmVyU291cmNlOwotICAgIHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IG1CYXNlOworICAgIHNwPE9teEdyYXBoaWNCdWZmZXJTb3VyY2U+IG1CYXNlOwogICAgIHNwPElPbXhCdWZmZXJTb3VyY2U+IG1PbXhCdWZmZXJTb3VyY2U7CiAKLSAgICBUV0dyYXBoaWNCdWZmZXJTb3VyY2Uoc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gY29uc3QmIGJhc2UpOworICAgIFRXR3JhcGhpY0J1ZmZlclNvdXJjZShzcDxPbXhHcmFwaGljQnVmZmVyU291cmNlPiBjb25zdCYgYmFzZSk7CiAgICAgUmV0dXJuPFN0YXR1cz4gY29uZmlndXJlKAogICAgICAgICAgICAgY29uc3Qgc3A8SU9teE5vZGU+JiBvbXhOb2RlLCBEYXRhc3BhY2UgZGF0YXNwYWNlKSBvdmVycmlkZTsKICAgICBSZXR1cm48U3RhdHVzPiBzZXRTdXNwZW5kKGJvb2wgc3VzcGVuZCwgaW50NjRfdCB0aW1lVXMpIG92ZXJyaWRlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XUHJvZHVjZXJMaXN0ZW5lci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XUHJvZHVjZXJMaXN0ZW5lci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzVlNDhhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV1Byb2R1Y2VyTGlzdGVuZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfT01YX1YxXzBfV09NWFBST0RVQ0VSTElTVEVORVJfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX09NWF9WMV8wX1dPTVhQUk9EVUNFUkxJU1RFTkVSX0gKLQotI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+Ci0jaW5jbHVkZSA8Z3VpL0lQcm9kdWNlckxpc3RlbmVyLmg+Ci0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2J1ZmZlcnF1ZXVlLzEuMC9JUHJvZHVjZXJMaXN0ZW5lci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgaGFyZHdhcmUgewotbmFtZXNwYWNlIG1lZGlhIHsKLW5hbWVzcGFjZSBvbXggewotbmFtZXNwYWNlIFYxXzAgewotbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKLQotdXNpbmcgOjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwotdXNpbmcgOjphbmRyb2lkOjpzcDsKLQotdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OklQcm9kdWNlckxpc3RlbmVyCi0gICAgICAgIEhQcm9kdWNlckxpc3RlbmVyOwotdHlwZWRlZiA6OmFuZHJvaWQ6OklQcm9kdWNlckxpc3RlbmVyCi0gICAgICAgIEJQcm9kdWNlckxpc3RlbmVyOwotdXNpbmcgOjphbmRyb2lkOjpCblByb2R1Y2VyTGlzdGVuZXI7Ci0KLXN0cnVjdCBUV1Byb2R1Y2VyTGlzdGVuZXIgOiBwdWJsaWMgSFByb2R1Y2VyTGlzdGVuZXIgewotICAgIHNwPEJQcm9kdWNlckxpc3RlbmVyPiBtQmFzZTsKLSAgICBUV1Byb2R1Y2VyTGlzdGVuZXIoc3A8QlByb2R1Y2VyTGlzdGVuZXI+IGNvbnN0JiBiYXNlKTsKLSAgICBSZXR1cm48dm9pZD4gb25CdWZmZXJSZWxlYXNlZCgpIG92ZXJyaWRlOwotICAgIFJldHVybjxib29sPiBuZWVkc1JlbGVhc2VOb3RpZnkoKSBvdmVycmlkZTsKLX07Ci0KLWNsYXNzIExXUHJvZHVjZXJMaXN0ZW5lciA6IHB1YmxpYyBCblByb2R1Y2VyTGlzdGVuZXIgewotcHVibGljOgotICAgIHNwPEhQcm9kdWNlckxpc3RlbmVyPiBtQmFzZTsKLSAgICBMV1Byb2R1Y2VyTGlzdGVuZXIoc3A8SFByb2R1Y2VyTGlzdGVuZXI+IGNvbnN0JiBiYXNlKTsKLSAgICB2b2lkIG9uQnVmZmVyUmVsZWFzZWQoKSBvdmVycmlkZTsKLSAgICBib29sIG5lZWRzUmVsZWFzZU5vdGlmeSgpIG92ZXJyaWRlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCi19ICAvLyBuYW1lc3BhY2UgVjFfMAotfSAgLy8gbmFtZXNwYWNlIG9teAotfSAgLy8gbmFtZXNwYWNlIG1lZGlhCi19ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9PTVhfVjFfMF9XT01YUFJPRFVDRVJMSVNURU5FUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvQldHcmFwaGljQnVmZmVyU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvQldHcmFwaGljQnVmZmVyU291cmNlLmgKaW5kZXggMGY3OGViNi4uMGVmZmYyMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L0JXR3JhcGhpY0J1ZmZlclNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9CV0dyYXBoaWNCdWZmZXJTb3VyY2UuaApAQCAtMjMsMTQgKzIzLDE0IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9Cbk9NWEJ1ZmZlclNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KIAotI2luY2x1ZGUgIkdyYXBoaWNCdWZmZXJTb3VyY2UuaCIKKyNpbmNsdWRlICJPbXhHcmFwaGljQnVmZmVyU291cmNlLmgiCiAjaW5jbHVkZSAiSU9teE5vZGVXcmFwcGVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogdXNpbmcgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czsKIHVzaW5nIDo6YW5kcm9pZDo6Qm5HcmFwaGljQnVmZmVyU291cmNlOwotdXNpbmcgOjphbmRyb2lkOjpHcmFwaGljQnVmZmVyU291cmNlOwordXNpbmcgOjphbmRyb2lkOjpPbXhHcmFwaGljQnVmZmVyU291cmNlOwogdXNpbmcgOjphbmRyb2lkOjpJT01YTm9kZTsKIHVzaW5nIDo6YW5kcm9pZDo6c3A7CiAKQEAgLTM4LDEwICszOCwxMCBAQAogICAgIHN0cnVjdCBCV09NWEJ1ZmZlclNvdXJjZTsKICAgICBzdHJ1Y3QgQldPbXhOb2RlV3JhcHBlcjsKIAotICAgIHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IG1CYXNlOworICAgIHNwPE9teEdyYXBoaWNCdWZmZXJTb3VyY2U+IG1CYXNlOwogICAgIHNwPElPTVhCdWZmZXJTb3VyY2U+IG1PTVhCdWZmZXJTb3VyY2U7CiAKLSAgICBCV0dyYXBoaWNCdWZmZXJTb3VyY2Uoc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gY29uc3QgJmJhc2UpOworICAgIEJXR3JhcGhpY0J1ZmZlclNvdXJjZShzcDxPbXhHcmFwaGljQnVmZmVyU291cmNlPiBjb25zdCAmYmFzZSk7CiAKICAgICBTdGF0dXMgY29uZmlndXJlKAogICAgICAgICAgICAgY29uc3Qgc3A8SU9NWE5vZGU+JiBvbXhOb2RlLCBpbnQzMl90IGRhdGFTcGFjZSkgb3ZlcnJpZGU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRmZWU2Zi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEdSQVBISUNfQlVGRkVSX1NPVVJDRV9IXwotCi0jZGVmaW5lIEdSQVBISUNfQlVGRkVSX1NPVVJDRV9IXwotCi0jaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KLSNpbmNsdWRlIDxndWkvQnVmZmVyUXVldWUuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgotI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KLSNpbmNsdWRlIDxtZWRpYS9PTVhGZW5jZVBhcmNlbGFibGUuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlclJlZmxlY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgotCi0jaW5jbHVkZSA8YW5kcm9pZC9CbkdyYXBoaWNCdWZmZXJTb3VyY2UuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL0JuT01YQnVmZmVyU291cmNlLmg+Ci0KLSNpbmNsdWRlICJJT214Tm9kZVdyYXBwZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi11c2luZyA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOwotCi1zdHJ1Y3QgRnJhbWVEcm9wcGVyOwotCi0vKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGZlZWQgT01YIGNvZGVjcyBmcm9tIGEgU3VyZmFjZSB2aWEgQnVmZmVyUXVldWUgb3IKLSAqIEhXIHByb2R1Y2VyLgotICoKLSAqIEluc3RhbmNlcyBvZiB0aGUgY2xhc3MgZG9uJ3QgcnVuIG9uIGEgZGVkaWNhdGVkIHRocmVhZC4gIEluc3RlYWQsCi0gKiB2YXJpb3VzIGV2ZW50cyB0cmlnZ2VyIGRhdGEgbW92ZW1lbnQ6Ci0gKgotICogIC0gQXZhaWxhYmlsaXR5IG9mIGEgbmV3IGZyYW1lIG9mIGRhdGEgZnJvbSB0aGUgQnVmZmVyUXVldWUgKG5vdGlmaWVkCi0gKiAgICB2aWEgdGhlIG9uRnJhbWVBdmFpbGFibGUgY2FsbGJhY2spLgotICogIC0gVGhlIHJldHVybiBvZiBhIGNvZGVjIGJ1ZmZlciAodmlhIE9uRW1wdHlCdWZmZXJEb25lKS4KLSAqICAtIEFwcGxpY2F0aW9uIHNpZ25hbGluZyBlbmQtb2Ytc3RyZWFtLgotICogIC0gVHJhbnNpdGlvbiB0byBvciBmcm9tICJleGVjdXRpbmciIHN0YXRlLgotICoKLSAqIEZyYW1lcyBvZiBkYXRhIChhbmQsIHBlcmhhcHMsIHRoZSBlbmQtb2Ytc3RyZWFtIGluZGljYXRpb24pIGNhbiBhcnJpdmUKLSAqIGJlZm9yZSB0aGUgY29kZWMgaXMgaW4gdGhlICJleGVjdXRpbmciIHN0YXRlLCBzbyB3ZSBuZWVkIHRvIHF1ZXVlCi0gKiB0aGluZ3MgdXAgdW50aWwgd2UncmUgcmVhZHkgdG8gZ28uCi0gKgotICogVGhlIEdyYXBoaWNCdWZmZXJTb3VyY2UgY2FuIGJlIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0byBkaXNjYXJkIGZyYW1lcwotICogZnJvbSB0aGUgc291cmNlOgotICoKLSAqIC0gaWYgdGhlaXIgdGltZXN0YW1wIGlzIGxlc3MgdGhhbiBhIHN0YXJ0IHRpbWUKLSAqIC0gaWYgdGhlIHNvdXJjZSBpcyBzdXNwZW5kZWQgb3Igc3RvcHBlZCBhbmQgdGhlIHN1c3BlbmQvc3RvcC10aW1lIGlzIHJlYWNoZWQKLSAqIC0gaWYgRU9TIHdhcyBzaWduYWxlZAotICogLSBpZiB0aGVyZSBpcyBubyBlbmNvZGVyIGNvbm5lY3RlZCB0byBpdAotICoKLSAqIFRoZSBzb3VyY2UsIGZ1cnRoZXJtb3JlLCBtYXkgY2hvb3NlIHRvIG5vdCBlbmNvZGUgKGRyb3ApIGZyYW1lcyBpZjoKLSAqCi0gKiAtIHRvIHRocm90dGxlIHRoZSBmcmFtZSByYXRlIChrZWVwIGl0IHVuZGVyIGEgY2VydGFpbiBsaW1pdCkKLSAqCi0gKiBGaW5hbGx5IHRoZSBzb3VyY2UgbWF5IG9wdGlvbmFsbHkgaG9sZCBvbnRvIHRoZSBsYXN0IG5vbi1kaXNjYXJkZWQgZnJhbWUKLSAqIChldmVuIGlmIGl0IHdhcyBkcm9wcGVkKSB0byByZWVuY29kZSBpdCBhZnRlciBhbiBpbnRlcnZhbCBpZiBubyBmdXJ0aGVyCi0gKiBmcmFtZXMgYXJlIHNlbnQgYnkgdGhlIHByb2R1Y2VyLgotICovCi1jbGFzcyBHcmFwaGljQnVmZmVyU291cmNlIDogcHVibGljIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIHsKLXB1YmxpYzoKLSAgICBHcmFwaGljQnVmZmVyU291cmNlKCk7Ci0KLSAgICB2aXJ0dWFsIH5HcmFwaGljQnVmZmVyU291cmNlKCk7Ci0KLSAgICAvLyBXZSBjYW4ndCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbnN0cnVjdG9yIGZhaWxzLCBzbyB3ZSBqdXN0IHNldAotICAgIC8vIHRoaXMgYW5kIHJlcXVpcmUgdGhhdCB0aGUgY2FsbGVyIHRlc3QgdGhlIHZhbHVlLgotICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJucyB0aGUgaGFuZGxlIHRvIHRoZSBwcm9kdWNlciBzaWRlIG9mIHRoZSBCdWZmZXJRdWV1ZS4gIEJ1ZmZlcnMKLSAgICAvLyBxdWV1ZWQgb24gdGhpcyB3aWxsIGJlIHJlY2VpdmVkIGJ5IEdyYXBoaWNCdWZmZXJTb3VyY2UuCi0gICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1Qcm9kdWNlcjsKLSAgICB9Ci0KLSAgICAvLyBPbXhCdWZmZXJTb3VyY2UgaW50ZXJmYWNlCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIE9NWCB0cmFuc2l0aW9ucyB0byBPTVhfU3RhdGVFeGVjdXRpbmcsIHdoaWNoIG1lYW5zCi0gICAgLy8gd2UgY2FuIHN0YXJ0IGhhbmRpbmcgaXQgYnVmZmVycy4gIElmIHdlIGFscmVhZHkgaGF2ZSBidWZmZXJzIG9mIGRhdGEKLSAgICAvLyBzaXR0aW5nIGluIHRoZSBCdWZmZXJRdWV1ZSwgdGhpcyB3aWxsIHNlbmQgdGhlbSB0byB0aGUgY29kZWMuCi0gICAgU3RhdHVzIG9uT214RXhlY3V0aW5nKCk7Ci0KLSAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIE9NWCB0cmFuc2l0aW9ucyB0byBPTVhfU3RhdGVJZGxlLCBpbmRpY2F0aW5nIHRoYXQKLSAgICAvLyB0aGUgY29kZWMgaXMgbWVhbnQgdG8gcmV0dXJuIGFsbCBidWZmZXJzIGJhY2sgdG8gdGhlIGNsaWVudCBmb3IgdGhlbQotICAgIC8vIHRvIGJlIGZyZWVkLiBEbyBOT1Qgc3VibWl0IGFueSBtb3JlIGJ1ZmZlcnMgdG8gdGhlIGNvbXBvbmVudC4KLSAgICBTdGF0dXMgb25PbXhJZGxlKCk7Ci0KLSAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIE9NWCB0cmFuc2l0aW9ucyB0byBPTVhfU3RhdGVMb2FkZWQsIGluZGljYXRpbmcgdGhhdAotICAgIC8vIHdlIGFyZSBzaHV0dGluZyBkb3duLgotICAgIFN0YXR1cyBvbk9teExvYWRlZCgpOwotCi0gICAgLy8gQSAiY29kZWMgYnVmZmVyIiwgaS5lLiBhIGJ1ZmZlciB0aGF0IGNhbiBiZSB1c2VkIHRvIHBhc3MgZGF0YSBpbnRvCi0gICAgLy8gdGhlIGVuY29kZXIsIGhhcyBiZWVuIGFsbG9jYXRlZC4gIChUaGlzIGNhbGwgZG9lcyBub3QgY2FsbCBiYWNrIGludG8KLSAgICAvLyBPTVhOb2RlSW5zdGFuY2UuKQotICAgIFN0YXR1cyBvbklucHV0QnVmZmVyQWRkZWQoaW50MzJfdCBidWZmZXJJZCk7Ci0KLSAgICAvLyBDYWxsZWQgZnJvbSBPbkVtcHR5QnVmZmVyRG9uZS4gIElmIHdlIGhhdmUgYSBCUSBidWZmZXIgYXZhaWxhYmxlLAotICAgIC8vIGZpbGwgaXQgd2l0aCBhIG5ldyBmcmFtZSBvZiBkYXRhOyBvdGhlcndpc2UsIGp1c3QgbWFyayBpdCBhcyBhdmFpbGFibGUuCi0gICAgU3RhdHVzIG9uSW5wdXRCdWZmZXJFbXB0aWVkKGludDMyX3QgYnVmZmVySWQsIGludCBmZW5jZUZkKTsKLQotICAgIC8vIElHcmFwaGljQnVmZmVyU291cmNlIGludGVyZmFjZQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gQ29uZmlndXJlIHRoZSBidWZmZXIgc291cmNlIHRvIGJlIHVzZWQgd2l0aCBhbiBPTVggbm9kZSB3aXRoIHRoZSBkZWZhdWx0Ci0gICAgLy8gZGF0YSBzcGFjZS4KLSAgICBzdGF0dXNfdCBjb25maWd1cmUoCi0gICAgICAgIGNvbnN0IHNwPElPbXhOb2RlV3JhcHBlcj4gJm9teE5vZGUsCi0gICAgICAgIGludDMyX3QgZGF0YVNwYWNlLAotICAgICAgICBpbnQzMl90IGJ1ZmZlckNvdW50LAotICAgICAgICB1aW50MzJfdCBmcmFtZVdpZHRoLAotICAgICAgICB1aW50MzJfdCBmcmFtZUhlaWdodCwKLSAgICAgICAgdWludDMyX3QgY29uc3VtZXJVc2FnZSk7Ci0KLSAgICAvLyBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgbGFzdCBpbnB1dCBmcmFtZSBoYXMgYmVlbiBzdWJtaXR0ZWQgb3IgYnVmZmVyCi0gICAgLy8gdGltZXN0YW1wIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiBzdG9wVGltZVVzLiBXZSBuZWVkIHRvIHN1Ym1pdCBhbiBlbXB0eQotICAgIC8vIGJ1ZmZlciB3aXRoIHRoZSBFT1MgZmxhZyBzZXQuICBJZiB3ZSBkb24ndCBoYXZlIGEgY29kZWMgYnVmZmVyIHJlYWR5LAotICAgIC8vIHdlIGp1c3Qgc2V0IHRoZSBtRW5kT2ZTdHJlYW0gZmxhZy4KLSAgICBzdGF0dXNfdCBzaWduYWxFbmRPZklucHV0U3RyZWFtKCk7Ci0KLSAgICAvLyBJZiBzdXNwZW5kIGlzIHRydWUsIGFsbCBpbmNvbWluZyBidWZmZXJzIChpbmNsdWRpbmcgdGhvc2UgY3VycmVudGx5Ci0gICAgLy8gaW4gdGhlIEJ1ZmZlclF1ZXVlKSB3aXRoIHRpbWVzdGFtcCBsYXJnZXIgdGhhbiB0aW1lVXMgd2lsbCBiZSBkaXNjYXJkZWQKLSAgICAvLyB1bnRpbCB0aGUgc3VzcGVuc2lvbiBpcyBsaWZ0ZWQuIElmIHN1c3BlbmQgaXMgZmFsc2UsIGFsbCBpbmNvbWluZyBidWZmZXJzCi0gICAgLy8gaW5jbHVkaW5nIHRob3NlIGN1cnJlbnRseSBpbiB0aGUgQnVmZmVyUXVldWUpIHdpdGggdGltZXN0YW1wIGxhcmdlciB0aGFuCi0gICAgLy8gdGltZVVzIHdpbGwgYmUgcHJvY2Vzc2VkLiB0aW1lVXMgdXNlcyBTWVNURU1fVElNRV9NT05PVE9OSUMgdGltZSBiYXNlLgotICAgIHN0YXR1c190IHNldFN1c3BlbmQoYm9vbCBzdXNwZW5kLCBpbnQ2NF90IHRpbWVVcyk7Ci0KLSAgICAvLyBTcGVjaWZpZXMgdGhlIGludGVydmFsIGFmdGVyIHdoaWNoIHdlIHJlcXVldWUgdGhlIGJ1ZmZlciBwcmV2aW91c2x5Ci0gICAgLy8gcXVldWVkIHRvIHRoZSBlbmNvZGVyLiBUaGlzIGlzIHVzZWZ1bCBpbiB0aGUgY2FzZSBvZiBzdXJmYWNlIGZsaW5nZXIKLSAgICAvLyBwcm92aWRpbmcgdGhlIGlucHV0IHN1cmZhY2UgaWYgdGhlIHJlc3VsdGluZyBlbmNvZGVkIHN0cmVhbSBpcyB0bwotICAgIC8vIGJlIGRpc3BsYXllZCAibGl2ZSIuIElmIHdlIHdlcmUgbm90IHRvIHB1c2ggdGhyb3VnaCB0aGUgZXh0cmEgZnJhbWUKLSAgICAvLyB0aGUgZGVjb2RlciBvbiB0aGUgcmVtb3RlIGVuZCB3b3VsZCBiZSB1bmFibGUgdG8gZGVjb2RlIHRoZSBsYXRlc3QgZnJhbWUuCi0gICAgLy8gVGhpcyBBUEkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRyYW5zaXRpb25pbmcgdGhlIGVuY29kZXIgdG8gImV4ZWN1dGluZyIKLSAgICAvLyBzdGF0ZSBhbmQgb25jZSB0aGlzIGJlaGF2aW91ciBpcyBzcGVjaWZpZWQgaXQgY2Fubm90IGJlIHJlc2V0LgotICAgIHN0YXR1c190IHNldFJlcGVhdFByZXZpb3VzRnJhbWVEZWxheVVzKGludDY0X3QgcmVwZWF0QWZ0ZXJVcyk7Ci0KLSAgICAvLyBTZXRzIHRoZSBpbnB1dCBidWZmZXIgdGltZXN0YW1wIG9mZnNldC4KLSAgICAvLyBXaGVuIHNldCwgdGhlIHNhbXBsZSdzIHRpbWVzdGFtcCB3aWxsIGJlIGFkanVzdGVkIHdpdGggdGhlIHRpbWVPZmZzZXRVcy4KLSAgICBzdGF0dXNfdCBzZXRUaW1lT2Zmc2V0VXMoaW50NjRfdCB0aW1lT2Zmc2V0VXMpOwotCi0gICAgLy8gV2hlbiBzZXQsIHRoZSBtYXggZnJhbWUgcmF0ZSBmZWQgdG8gdGhlIGVuY29kZXIgd2lsbCBiZSBjYXBwZWQgYXQgbWF4RnBzLgotICAgIHN0YXR1c190IHNldE1heEZwcyhmbG9hdCBtYXhGcHMpOwotCi0gICAgLy8gU2V0cyB0aGUgdGltZSBsYXBzZSAob3Igc2xvdyBtb3Rpb24pIHBhcmFtZXRlcnMuCi0gICAgLy8gV2hlbiBzZXQsIHRoZSBzYW1wbGUncyB0aW1lc3RhbXAgd2lsbCBiZSBtb2RpZmllZCB0byBwbGF5YmFjayBmcmFtZXJhdGUsCi0gICAgLy8gYW5kIGNhcHR1cmUgdGltZXN0YW1wIHdpbGwgYmUgbW9kaWZpZWQgdG8gY2FwdHVyZSByYXRlLgotICAgIHN0YXR1c190IHNldFRpbWVMYXBzZUNvbmZpZyhkb3VibGUgZnBzLCBkb3VibGUgY2FwdHVyZUZwcyk7Ci0KLSAgICAvLyBTZXRzIHRoZSBzdGFydCB0aW1lIHVzIChpbiBzeXN0ZW0gdGltZSksIHNhbXBsZXMgYmVmb3JlIHdoaWNoIHNob3VsZAotICAgIC8vIGJlIGRyb3BwZWQgYW5kIG5vdCBzdWJtaXR0ZWQgdG8gZW5jb2RlcgotICAgIHN0YXR1c190IHNldFN0YXJ0VGltZVVzKGludDY0X3Qgc3RhcnRUaW1lVXMpOwotCi0gICAgLy8gU2V0cyB0aGUgc3RvcCB0aW1lIHVzIChpbiBzeXN0ZW0gdGltZSksIHNhbXBsZXMgYWZ0ZXIgd2hpY2ggc2hvdWxkIGJlIGRyb3BwZWQKLSAgICAvLyBhbmQgbm90IHN1Ym1pdHRlZCB0byBlbmNvZGVyLiB0aW1lVXMgdXNlcyBTWVNURU1fVElNRV9NT05PVE9OSUMgdGltZSBiYXNlLgotICAgIHN0YXR1c190IHNldFN0b3BUaW1lVXMoaW50NjRfdCBzdG9wVGltZVVzKTsKLQotICAgIC8vIEdldHMgdGhlIHN0b3AgdGltZSBvZmZzZXQgaW4gdXMuIFRoaXMgaXMgdGhlIHRpbWUgb2Zmc2V0IGJldHdlZW4gbGF0ZXN0IGJ1ZmZlcgotICAgIC8vIHRpbWUgYW5kIHRoZSBzdG9wVGltZVVzLiBJZiBzdG9wIHRpbWUgaXMgbm90IHNldCwgSU5WQUxJRF9PUEVSQVRJT04gd2lsbCBiZSByZXR1cm5lZC4KLSAgICAvLyBJZiByZXR1cm4gaXMgT0ssICpzdG9wVGltZU9mZnNldFVzIHdpbGwgY29udGFpbiB0aGUgdmFsaWQgb2Zmc2V0LiBPdGhlcndpc2UsCi0gICAgLy8gKnN0b3BUaW1lT2Zmc2V0VXMgd2lsbCBub3QgYmUgbW9kaWZpZWQuIFBvc2l0aXZlIHN0b3BUaW1lT2Zmc2V0VXMgbWVhbnMgYnVmZmVyIHRpbWUKLSAgICAvLyBsYXJnZXIgdGhhbiBzdG9wVGltZVVzLgotICAgIHN0YXR1c190IGdldFN0b3BUaW1lT2Zmc2V0VXMoaW50NjRfdCAqc3RvcFRpbWVPZmZzZXRVcyk7Ci0KLSAgICAvLyBTZXRzIHRoZSBkZXNpcmVkIGNvbG9yIGFzcGVjdHMsIGUuZy4gdG8gYmUgdXNlZCB3aGVuIHByb2R1Y2VyIGRvZXMgbm90IHNwZWNpZnkgYSBkYXRhc3BhY2UuCi0gICAgc3RhdHVzX3Qgc2V0Q29sb3JBc3BlY3RzKGludDMyX3QgYXNwZWN0c1BhY2tlZCk7Ci0KLXByb3RlY3RlZDoKLSAgICAvLyBCUTo6Q29uc3VtZXJMaXN0ZW5lciBpbnRlcmZhY2UKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIGludGVyZmFjZSwgY2FsbGVkIHdoZW4gYSBuZXcgZnJhbWUgb2YKLSAgICAvLyBkYXRhIGlzIGF2YWlsYWJsZS4gIElmIHdlJ3JlIGV4ZWN1dGluZyBhbmQgYSBjb2RlYyBidWZmZXIgaXMKLSAgICAvLyBhdmFpbGFibGUsIHdlIGFjcXVpcmUgdGhlIGJ1ZmZlciwgY29weSB0aGUgR3JhcGhpY0J1ZmZlciByZWZlcmVuY2UKLSAgICAvLyBpbnRvIHRoZSBjb2RlYyBidWZmZXIsIGFuZCBjYWxsIEVtcHR5W1RoaXNdQnVmZmVyLiAgSWYgd2UncmUgbm90IHlldAotICAgIC8vIGV4ZWN1dGluZyBvciB0aGVyZSdzIG5vIGNvZGVjIGJ1ZmZlciBhdmFpbGFibGUsIHdlIGp1c3QgaW5jcmVtZW50Ci0gICAgLy8gbU51bUZyYW1lc0F2YWlsYWJsZSBhbmQgcmV0dXJuLgotICAgIHZvaWQgb25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiBpdGVtKSBvdmVycmlkZTsKLQotICAgIC8vIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIGludGVyZmFjZSwgY2FsbGVkIHdoZW4gdGhlIGNsaWVudCBoYXMKLSAgICAvLyByZWxlYXNlZCBvbmUgb3IgbW9yZSBHcmFwaGljQnVmZmVycy4gIFdlIGNsZWFyIG91dCB0aGUgYXBwcm9wcmlhdGUKLSAgICAvLyBzZXQgb2YgbUJ1ZmZlclNsb3QgZW50cmllcy4KLSAgICB2b2lkIG9uQnVmZmVyc1JlbGVhc2VkKCkgb3ZlcnJpZGU7Ci0KLSAgICAvLyBCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lciBpbnRlcmZhY2UsIGNhbGxlZCB3aGVuIHRoZSBjbGllbnQgaGFzCi0gICAgLy8gY2hhbmdlZCB0aGUgc2lkZWJhbmQgc3RyZWFtLiBHcmFwaGljQnVmZmVyU291cmNlIGRvZXNuJ3QgaGFuZGxlIHNpZGViYW5kCi0gICAgLy8gc3RyZWFtcyBzbyB0aGlzIGlzIGEgbm8tb3AgKGFuZCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkKS4KLSAgICB2b2lkIG9uU2lkZWJhbmRTdHJlYW1DaGFuZ2VkKCkgb3ZlcnJpZGU7Ci0KLXByaXZhdGU6Ci0gICAgLy8gTG9jaywgY292ZXJzIGFsbCBtZW1iZXIgdmFyaWFibGVzLgotICAgIG11dGFibGUgTXV0ZXggbU11dGV4OwotCi0gICAgLy8gVXNlZCB0byByZXBvcnQgY29uc3RydWN0b3IgZmFpbHVyZS4KLSAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwotCi0gICAgLy8gR3JhcGhpYyBidWZmZXIgcmVmZXJlbmNlIG9iamVjdHMKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gVGhlc2UgYXJlIHVzZWQgdG8ga2VlcCBhIHNoYXJlZCByZWZlcmVuY2UgdG8gR3JhcGhpY0J1ZmZlcnMgYW5kIGdyYWxsb2MgaGFuZGxlcyBvd25lZCBieSB0aGUKLSAgICAvLyBHcmFwaGljQnVmZmVyU291cmNlIGFzIHdlbGwgYXMgdG8gbWFuYWdlIHRoZSBjYWNoZSBzbG90cy4gU2VwYXJhdGUgcmVmZXJlbmNlcyBhcmUgb3duZWQgYnkKLSAgICAvLyB0aGUgYnVmZmVyIGNhY2hlIChjb250cm9sbGVkIGJ5IHRoZSBidWZmZXIgcXVldWUvYnVmZmVyIHByb2R1Y2VyKSBhbmQgdGhlIGNvZGVjLgotCi0gICAgLy8gV2hlbiB3ZSBnZXQgYSBidWZmZXIgZnJvbSB0aGUgcHJvZHVjZXIgKEJRKSBpdCBkZXNpZ25hdGVzIHRoZW0gdG8gYmUgY2FjaGVkIGludG8gc3BlY2lmaWMKLSAgICAvLyBzbG90cy4gRWFjaCBzbG90IG93bnMgYSBzaGFyZWQgcmVmZXJlbmNlIHRvIHRoZSBncmFwaGljIGJ1ZmZlciAod2UgdHJhY2sgdGhlc2UgdXNpbmcKLSAgICAvLyBDYWNoZWRCdWZmZXIpIHRoYXQgaXMgaW4gdGhhdCBzbG90LCBidXQgdGhlIHByb2R1Y2VyIGNvbnRyb2xzIHRoZSBzbG90cy4KLSAgICBzdHJ1Y3QgQ2FjaGVkQnVmZmVyOwotCi0gICAgLy8gV2hlbiB3ZSBhY3F1aXJlIGEgYnVmZmVyLCB3ZSBtdXN0IHJlbGVhc2UgaXQgYmFjayB0byB0aGUgcHJvZHVjZXIgb25jZSB3ZSAob3IgdGhlIGNvZGVjKQotICAgIC8vIG5vIGxvbmdlciB1c2VzIGl0IChhcyBsb25nIGFzIHRoZSBidWZmZXIgaXMgc3RpbGwgaW4gdGhlIGNhY2hlIHNsb3QpLiBXZSB1c2Ugc2hhcmVkCi0gICAgLy8gQWNxdWlyZWRCdWZmZXIgaW5zdGFuY2VzIGZvciB0aGlzIHB1cnBvc2UgLSBhbmQgd2UgY2FsbCByZWxlYXNlIGJ1ZmZlciB3aGVuIHRoZSBsYXN0Ci0gICAgLy8gcmVmZXJlbmNlIGlzIHJlbGlucXVpc2hlZC4KLSAgICBzdHJ1Y3QgQWNxdWlyZWRCdWZmZXI7Ci0KLSAgICAvLyBXZSBhbHNvIG5lZWQgdG8ga2VlcCBzb21lIGV4dHJhIG1ldGFkYXRhIChvdGhlciB0aGFuIHRoZSBidWZmZXIgcmVmZXJlbmNlKSBmb3IgYWNxdWlyZWQKLSAgICAvLyBidWZmZXJzLiBUaGVzZSBhcmUgdHJhY2tlZCBpbiBWaWRlb0J1ZmZlciBzdHJ1Y3QuCi0gICAgc3RydWN0IFZpZGVvQnVmZmVyIHsKLSAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEFjcXVpcmVkQnVmZmVyPiBtQnVmZmVyOwotICAgICAgICBuc2Vjc190IG1UaW1lc3RhbXBOczsKLSAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2VfdCBtRGF0YXNwYWNlOwotICAgIH07Ci0KLSAgICAvLyBDYWNoZWQgYW5kIGFxdWlyZWQgYnVmZmVycwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICB0eXBlZGVmIGludCBzbG90X2lkOwotCi0gICAgLy8gTWFwcyBhIHNsb3QgdG8gdGhlIGNhY2hlZCBidWZmZXIgaW4gdGhhdCBzbG90Ci0gICAgS2V5ZWRWZWN0b3I8c2xvdF9pZCwgc3RkOjpzaGFyZWRfcHRyPENhY2hlZEJ1ZmZlcj4+IG1CdWZmZXJTbG90czsKLQotICAgIC8vIFF1ZXVlIG9mIGJ1ZmZlcnMgYWNxdWlyZWQgaW4gY2hyb25vbG9naWNhbCBvcmRlciB0aGF0IGFyZSBub3QgeWV0IHN1Ym1pdHRlZCB0byB0aGUgY29kZWMKLSAgICBMaXN0PFZpZGVvQnVmZmVyPiBtQXZhaWxhYmxlQnVmZmVyczsKLQotICAgIC8vIE51bWJlciBvZiBidWZmZXJzIHRoYXQgaGF2ZSBiZWVuIHNpZ25hbGVkIGJ5IHRoZSBwcm9kdWNlciB0aGF0IHRoZXkgYXJlIGF2YWlsYWJsZSwgYnV0Ci0gICAgLy8gd2UndmUgYmVlbiB1bmFibGUgdG8gYWNxdWlyZSB0aGVtIGR1ZSB0byBvdXIgbWF4IGFjcXVpcmUgY291bnQKLSAgICBpbnQzMl90IG1OdW1BdmFpbGFibGVVbmFjcXVpcmVkQnVmZmVyczsKLQotICAgIC8vIE51bWJlciBvZiBmcmFtZXMgYWNxdWlyZWQgZnJvbSBjb25zdW1lciAoZGVidWcgb25seSkKLSAgICAvLyAoYXMgaW4gYXF1aXJlQnVmZmVyIGNhbGxlZCwgYW5kIHJlbGVhc2UgbmVlZHMgdG8gYmUgY2FsbGVkKQotICAgIGludDMyX3QgbU51bU91dHN0YW5kaW5nQWNxdWlyZXM7Ci0KLSAgICAvLyBBY3F1aXJlIGEgYnVmZmVyIGZyb20gdGhlIEJRIGFuZCBzdG9yZSBpdCBpbiB8aXRlbXwgaWYgc3VjY2Vzc2Z1bAotICAgIC8vIFxyZXR1cm4gT0sgb24gc3VjY2Vzcywgb3IgZXJyb3Igb24gZmFpbHVyZS4KLSAgICBzdGF0dXNfdCBhY3F1aXJlQnVmZmVyX2woVmlkZW9CdWZmZXIgKml0ZW0pOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gYSBidWZmZXIgd2FzIGFjcXVpcmVkIGZyb20gdGhlIHByb2R1Y2VyCi0gICAgdm9pZCBvbkJ1ZmZlckFjcXVpcmVkX2woY29uc3QgVmlkZW9CdWZmZXIgJmJ1ZmZlcik7Ci0KLSAgICAvLyBtYXJrcyB0aGUgYnVmZmVyIGF0IHRoZSBzbG90IG5vIGxvbmdlciBjYWNoZWQsIGFuZCBhY2NvdW50cyBmb3IgdGhlIG91dHN0YW5kaW5nCi0gICAgLy8gYWNxdWlyZSBjb3VudC4gUmV0dXJucyB0cnVlIGlmIHRoZSBzbG90IHdhcyBwb3B1bGF0ZWQ7IG90aGVyd2lzZSwgZmFsc2UuCi0gICAgYm9vbCBkaXNjYXJkQnVmZmVySW5TbG90X2woc2xvdF9pZCBpKTsKLQotICAgIC8vIG1hcmtzIHRoZSBidWZmZXIgYXQgdGhlIHNsb3QgaW5kZXggbm8gbG9uZ2VyIGNhY2hlZCwgYW5kIGFjY291bnRzIGZvciB0aGUgb3V0c3RhbmRpbmcKLSAgICAvLyBhY3F1aXJlIGNvdW50Ci0gICAgdm9pZCBkaXNjYXJkQnVmZmVyQXRTbG90SW5kZXhfbChzc2l6ZV90IGJzaSk7Ci0KLSAgICAvLyByZWxlYXNlIGFsbCBhY3F1aXJlZCBhbmQgdW5hY3F1aXJlZCBhdmFpbGFibGUgYnVmZmVycwotICAgIC8vIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGlmIGl0IGZhaWxzIHRvIGFjcXVpcmUgYW4gdW5hY3F1aXJlZCBhdmFpbGFibGUgYnVmZmVyLCB3aGljaCB3aWxsCi0gICAgLy8gbGVhdmUgbU51bUF2YWlsYWJsZVVuYWNxdWlyZWRCdWZmZXJzIHBvc2l0aXZlIG9uIHJldHVybi4KLSAgICB2b2lkIHJlbGVhc2VBbGxBdmFpbGFibGVCdWZmZXJzX2woKTsKLQotICAgIC8vIHJldHVybnMgd2hldGhlciB3ZSBoYXZlIGFueSBhdmFpbGFibGUgYnVmZmVycyAoYWNxdWlyZWQgb3Igbm90LXlldC1hY3F1aXJlZCkKLSAgICBib29sIGhhdmVBdmFpbGFibGVCdWZmZXJzX2woKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAhbUF2YWlsYWJsZUJ1ZmZlcnMuZW1wdHkoKSB8fCBtTnVtQXZhaWxhYmxlVW5hY3F1aXJlZEJ1ZmZlcnMgPiAwOwotICAgIH0KLQotICAgIC8vIENvZGVjIGJ1ZmZlcnMKLSAgICAvLyAtLS0tLS0tLS0tLS0tCi0KLSAgICAvLyBXaGVuIHdlIHF1ZXVlIGJ1ZmZlcnMgdG8gdGhlIGVuY29kZXIsIHdlIG11c3QgaG9sZCB0aGUgcmVmZXJlbmNlcyB0byB0aGUgZ3JhcGhpYyBidWZmZXJzCi0gICAgLy8gaW4gdGhvc2UgYnVmZmVycyAtIGFzIHRoZSBwcm9kdWNlciBtYXkgZnJlZSB0aGUgc2xvdHMuCi0KLSAgICB0eXBlZGVmIGludDMyX3QgY29kZWNfYnVmZmVyX2lkOwotCi0gICAgLy8gc2V0IG9mIGNvZGVjIGJ1ZmZlciBJRC1zIG9mIGJ1ZmZlcnMgYXZhaWxhYmxlIHRvIGZpbGwKLSAgICBMaXN0PGNvZGVjX2J1ZmZlcl9pZD4gbUZyZWVDb2RlY0J1ZmZlcnM7Ci0KLSAgICAvLyBtYXBzIGNvZGVjIGJ1ZmZlciBJRC1zIHRvIGJ1ZmZlciBpbmZvIHN1Ym1pdHRlZCB0byB0aGUgY29kZWMuIFVzZWQgdG8ga2VlcCBhIHJlZmVyZW5jZSBmb3IKLSAgICAvLyB0aGUgZ3JhcGhpY3MgYnVmZmVyLgotICAgIEtleWVkVmVjdG9yPGNvZGVjX2J1ZmZlcl9pZCwgc3RkOjpzaGFyZWRfcHRyPEFjcXVpcmVkQnVmZmVyPj4gbVN1Ym1pdHRlZENvZGVjQnVmZmVyczsKLQotICAgIC8vIFByb2Nlc3NlcyB0aGUgbmV4dCBhY3F1aXJlZCBmcmFtZS4gSWYgdGhlcmUgaXMgbm8gYXZhaWxhYmxlIGNvZGVjIGJ1ZmZlciwgaXQgcmV0dXJucyBmYWxzZQotICAgIC8vIHdpdGhvdXQgYW55IGZ1cnRoZXIgYWN0aW9uLgotICAgIC8vCi0gICAgLy8gT3RoZXJ3aXNlLCBpdCBjb25zdW1lcyB0aGUgbmV4dCBhY3F1aXJlZCBmcmFtZSBhbmQgZGV0ZXJtaW5lcyBpZiBpdCBuZWVkcyB0byBiZSBkaXNjYXJkZWQgb3IKLSAgICAvLyBkcm9wcGVkLiBJZiBuZWl0aGVyIGFyZSBuZWVkZWQsIGl0IHN1Ym1pdHMgaXQgdG8gdGhlIGNvZGVjLiBJdCBhbHNvIHNhdmVzIHRoZSBsYXRlc3QKLSAgICAvLyBub24tZHJvcHBlZCBmcmFtZSBhbmQgc3VibWl0cyBpdCBmb3IgcmVwZWF0IGVuY29kaW5nIChpZiB0aGlzIGlzIGVuYWJsZWQpLgotICAgIC8vCi0gICAgLy8gXHJlcXVpcmUgdGhlcmUgbXVzdCBiZSBhbiBhY3F1aXJlZCBmcmFtZSAoaS5lLiB3ZSdyZSBpbiB0aGUgb25GcmFtZUF2YWlsYWJsZSBjYWxsYmFjaywKLSAgICAvLyBvciBpZiB3ZSdyZSBpbiBjb2RlY0J1ZmZlckVtcHRpZWQgYW5kIG1OdW1GcmFtZXNBdmFpbGFibGUgaXMgbm9uemVybykuCi0gICAgLy8gXHJlcXVpcmUgY29kZWMgbXVzdCBiZSBleGVjdXRpbmcKLSAgICAvLyBccmV0dXJucyB0cnVlIGlmIGFjcXVpcmVkIChhbmQgaGFuZGxlZCkgdGhlIG5leHQgZnJhbWUuIE90aGVyd2lzZSwgZmFsc2UuCi0gICAgYm9vbCBmaWxsQ29kZWNCdWZmZXJfbCgpOwotCi0gICAgLy8gQ2FsY3VsYXRlcyB0aGUgbWVkaWEgdGltZXN0YW1wIGZvciB8aXRlbXwgYW5kIG9uIHN1Y2Nlc3MgaXQgc3VibWl0cyB0aGUgYnVmZmVyIHRvIHRoZSBjb2RlYywKLSAgICAvLyB3aGlsZSBhbHNvIGtlZXBpbmcgYSByZWZlcmVuY2UgZm9yIGl0IGluIG1TdWJtaXR0ZWRDb2RlY0J1ZmZlcnMuCi0gICAgLy8gUmV0dXJucyBVTktOT1dOX0VSUk9SIGlmIHRoZSBidWZmZXIgd2FzIG5vdCBzdWJtaXR0ZWQgZHVlIHRvIGJ1ZmZlciB0aW1lc3RhbXAuIE90aGVyd2lzZSwKLSAgICAvLyBpdCByZXR1cm5zIGFueSBzdWJtaXQgc3VjY2VzcyBvciBlcnJvciB2YWx1ZSByZXR1cm5lZCBieSB0aGUgY29kZWMuCi0gICAgc3RhdHVzX3Qgc3VibWl0QnVmZmVyX2woY29uc3QgVmlkZW9CdWZmZXIgJml0ZW0pOwotCi0gICAgLy8gU3VibWl0cyBhbiBlbXB0eSBidWZmZXIsIHdpdGggdGhlIEVPUyBmbGFnIHNldCBpZiB0aGVyZSBpcyBhbiBhdmFpbGFibGUgY29kZWMgYnVmZmVyIGFuZAotICAgIC8vIHNldHMgbUVuZE9mU3RyZWFtU2VudCBmbGFnLiBEb2VzIG5vdGhpbmcgaWYgdGhlcmUgaXMgbm8gY29kZWMgYnVmZmVyIGF2YWlsYWJsZS4KLSAgICB2b2lkIHN1Ym1pdEVuZE9mSW5wdXRTdHJlYW1fbCgpOwotCi0gICAgLy8gU2V0IHRvIHRydWUgaWYgd2Ugd2FudCB0byBzZW5kIGVuZC1vZi1zdHJlYW0gYWZ0ZXIgd2UgcnVuIG91dCBvZiBhdmFpbGFibGUgZnJhbWVzIGZyb20gdGhlCi0gICAgLy8gcHJvZHVjZXIKLSAgICBib29sIG1FbmRPZlN0cmVhbTsKLQotICAgIC8vIEZsYWcgdGhhdCB0aGUgRU9TIHdhcyBzdWJtaXR0ZWQgdG8gdGhlIGVuY29kZXIKLSAgICBib29sIG1FbmRPZlN0cmVhbVNlbnQ7Ci0KLSAgICAvLyBEYXRhc3BhY2UgZm9yIHRoZSBsYXN0IGZyYW1lIHN1Ym1pdHRlZCB0byB0aGUgY29kZWMKLSAgICBhbmRyb2lkX2RhdGFzcGFjZSBtTGFzdERhdGFzcGFjZTsKLQotICAgIC8vIERlZmF1bHQgY29sb3IgYXNwZWN0cyBmb3IgdGhpcyBzb3VyY2UKLSAgICBpbnQzMl90IG1EZWZhdWx0Q29sb3JBc3BlY3RzUGFja2VkOwotCi0gICAgLy8gY2FsbGVkIHdoZW4gdGhlIGRhdGEgc3BhY2Ugb2YgdGhlIGlucHV0IGJ1ZmZlciBjaGFuZ2VzCi0gICAgdm9pZCBvbkRhdGFzcGFjZUNoYW5nZWRfbChhbmRyb2lkX2RhdGFzcGFjZSBkYXRhc3BhY2UsIGFuZHJvaWRfcGl4ZWxfZm9ybWF0IHBpeGVsRm9ybWF0KTsKLQotICAgIC8vIFBvaW50ZXIgYmFjayB0byB0aGUgT214IG5vZGUgdGhhdCBjcmVhdGVkIHVzLiAgV2Ugc2VuZCBidWZmZXJzIGhlcmUuCi0gICAgc3A8SU9teE5vZGVXcmFwcGVyPiBtT01YTm9kZTsKLQotICAgIC8vIFNldCBieSBvbXhFeGVjdXRpbmcoKSAvIG9teElkbGluZygpLgotICAgIGJvb2wgbUV4ZWN1dGluZzsKLQotICAgIGJvb2wgbVN1c3BlbmRlZDsKLQotICAgIC8vIHJldHVybnMgdHJ1ZSBpZiB0aGlzIHNvdXJjZSBpcyB1bmNvbmRpdGlvbmFsbHkgZGlzY2FyZGluZyBhY3F1aXJlZCBidWZmZXJzIGF0IHRoZSBtb21lbnQKLSAgICAvLyByZWdhcmRsZXNzIG9mIHRoZSBtZXRhZGF0YSBvZiB0aG9zZSBidWZmZXJzCi0gICAgYm9vbCBhcmVXZURpc2NhcmRpbmdBdmFpbGFibGVCdWZmZXJzX2woKTsKLQotICAgIGludDY0X3QgbUxhc3RGcmFtZVRpbWVzdGFtcFVzOwotCi0gICAgLy8gT3VyIEJ1ZmZlclF1ZXVlIGludGVyZmFjZXMuIG1Qcm9kdWNlciBpcyBwYXNzZWQgdG8gdGhlIHByb2R1Y2VyIHRocm91Z2gKLSAgICAvLyBnZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyLCBhbmQgbUNvbnN1bWVyIGlzIHVzZWQgaW50ZXJuYWxseSB0byByZXRyaWV2ZQotICAgIC8vIHRoZSBidWZmZXJzIHF1ZXVlZCBieSB0aGUgcHJvZHVjZXIuCi0gICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbVByb2R1Y2VyOwotICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IG1Db25zdW1lcjsKLQotICAgIC8vIFRoZSB0aW1lIHRvIHN0b3Agc2VuZGluZyBidWZmZXJzLgotICAgIGludDY0X3QgbVN0b3BUaW1lVXM7Ci0KLSAgICBzdHJ1Y3QgQWN0aW9uSXRlbSB7Ci0gICAgICAgIHR5cGVkZWYgZW51bSB7Ci0gICAgICAgICAgICBQQVVTRSwKLSAgICAgICAgICAgIFJFU1VNRSwKLSAgICAgICAgICAgIFNUT1AKLSAgICAgICAgfSBBY3Rpb25UeXBlOwotICAgICAgICBBY3Rpb25UeXBlIG1BY3Rpb247Ci0gICAgICAgIGludDY0X3QgbUFjdGlvblRpbWVVczsKLSAgICB9OwotCi0gICAgLy8gTWFpbnRhaW4gbGFzdCBhY3Rpb24gdGltZXN0YW1wIHRvIGVuc3VyZSBhbGwgdGhlIGFjdGlvbiB0aW1lc3RhbXBzIGFyZQotICAgIC8vIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZy4KLSAgICBpbnQ2NF90IG1MYXN0QWN0aW9uVGltZVVzOwotCi0gICAgLy8gQW4gYWN0aW9uIHF1ZXVlIHRoYXQgcXVldWUgdXAgYWxsIHRoZSBhY3Rpb25zIHNlbnQgdG8gR3JhcGhpY0J1ZmZlclNvdXJjZS4KLSAgICAvLyBTVE9QIGFjdGlvbiBzaG91bGQgb25seSBzaG93IHVwIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgYXMgYWxsIHRoZSBhY3Rpb25zCi0gICAgLy8gYWZ0ZXIgYSBTVE9QIGFjdGlvbiB3aWxsIGJlIGRpc2NhcmRlZC4gbUFjdGlvblF1ZXVlIGlzIHByb3RlY3RlZCBieSBtTXV0ZXguCi0gICAgTGlzdDxBY3Rpb25JdGVtPiBtQWN0aW9uUXVldWU7Ci0KLSAgICAvLy8vCi0gICAgZnJpZW5kIHN0cnVjdCBBSGFuZGxlclJlZmxlY3RvcjxHcmFwaGljQnVmZmVyU291cmNlPjsKLQotICAgIGVudW0gewotICAgICAgICBrV2hhdFJlcGVhdExhc3RGcmFtZSwgICAvLy88IHF1ZXVlIGxhc3QgZnJhbWUgZm9yIHJlZW5jb2RpbmcKLSAgICB9OwotICAgIGVudW0gewotICAgICAgICBrUmVwZWF0TGFzdEZyYW1lQ291bnQgPSAxMCwKLSAgICB9OwotCi0gICAgaW50NjRfdCBtU2tpcEZyYW1lc0JlZm9yZU5zOwotCi0gICAgc3A8RnJhbWVEcm9wcGVyPiBtRnJhbWVEcm9wcGVyOwotCi0gICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKLSAgICBzcDxBSGFuZGxlclJlZmxlY3RvcjxHcmFwaGljQnVmZmVyU291cmNlPiA+IG1SZWZsZWN0b3I7Ci0KLSAgICAvLyBSZXBlYXQgbGFzdCBmcmFtZSBmZWF0dXJlCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyOiByZXBlYXQgaW50ZXJ2YWwgZm9yIGZyYW1lIHJlcGVhdGluZyAoPDAgaWYgcmVwZWF0aW5nIGlzIGRpc2FibGVkKQotICAgIGludDY0X3QgbUZyYW1lUmVwZWF0SW50ZXJ2YWxVczsKLQotICAgIC8vIGN1cnJlbnQgZnJhbWUgcmVwZWF0IGdlbmVyYXRpb24gLSB1c2VkIHRvIGNhbmNlbCBhIHBlbmRpbmcgZnJhbWUgcmVwZWF0Ci0gICAgaW50MzJfdCBtUmVwZWF0TGFzdEZyYW1lR2VuZXJhdGlvbjsKLQotICAgIC8vIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgbGF0ZXN0IGZyYW1lICgwID0gbm9uZSkKLSAgICBpbnQzMl90IG1PdXRzdGFuZGluZ0ZyYW1lUmVwZWF0Q291bnQ7Ci0KLSAgICAvLyBUaGUgcHJldmlvdXMgYnVmZmVyIHNob3VsZCd2ZSBiZWVuIHJlcGVhdGVkIGJ1dAotICAgIC8vIG5vIGNvZGVjIGJ1ZmZlciB3YXMgYXZhaWxhYmxlIGF0IHRoZSB0aW1lLgotICAgIGJvb2wgbUZyYW1lUmVwZWF0QmxvY2tlZE9uQ29kZWNCdWZmZXI7Ci0KLSAgICAvLyBob2xkIGEgcmVmZXJlbmNlIHRvIHRoZSBsYXN0IGFjcXVpcmVkIChhbmQgbm90IGRpc2NhcmRlZCkgZnJhbWUgZm9yIGZyYW1lIHJlcGVhdGluZwotICAgIFZpZGVvQnVmZmVyIG1MYXRlc3RCdWZmZXI7Ci0KLSAgICAvLyBxdWV1ZSBsYXN0IGZyYW1lIGZvciByZWVuY29kZSBhZnRlciB0aGUgcmVwZWF0IGludGVydmFsLgotICAgIHZvaWQgcXVldWVGcmFtZVJlcGVhdF9sKCk7Ci0KLSAgICAvLyBzYXZlIHxpdGVtfCBhcyB0aGUgbGF0ZXN0IGJ1ZmZlciBhbmQgcXVldWUgaXQgZm9yIHJlZW5jb2RlIChyZXBlYXQpCi0gICAgdm9pZCBzZXRMYXRlc3RCdWZmZXJfbChjb25zdCBWaWRlb0J1ZmZlciAmaXRlbSk7Ci0KLSAgICAvLyBzdWJtaXQgbGFzdCBmcmFtZSB0byBlbmNvZGVyIGFuZCBxdWV1ZSBpdCBmb3IgcmVlbmNvZGUKLSAgICAvLyBccmV0dXJuIHRydWUgaWYgYnVmZmVyIHdhcyBzdWJtaXR0ZWQsIGZhbHNlIGlmIGl0IHdhc24ndCAoZS5nLiBzb3VyY2UgaXMgc3VzcGVuZGVkLCB0aGVyZQotICAgIC8vIGlzIG5vIGF2YWlsYWJsZSBjb2RlYyBidWZmZXIpCi0gICAgYm9vbCByZXBlYXRMYXRlc3RCdWZmZXJfbCgpOwotCi0gICAgLy8gVGltZSBsYXBzZSAvIHNsb3cgbW90aW9uIGNvbmZpZ3VyYXRpb24KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gZGVzaXJlZCBmcmFtZSByYXRlIGZvciBlbmNvZGluZyAtIHZhbHVlIDw9IDAgaWYgdW5kZWZpbmVkCi0gICAgZG91YmxlIG1GcHM7Ci0KLSAgICAvLyBkZXNpcmVkIGZyYW1lIHJhdGUgZm9yIGNhcHR1cmUgLSB2YWx1ZSA8PSAwIGlmIHVuZGVmaW5lZAotICAgIGRvdWJsZSBtQ2FwdHVyZUZwczsKLQotICAgIC8vIFRpbWUgbGFwc2UgbW9kZSBpcyBlbmFibGVkIGlmIHRoZSBjYXB0dXJlIGZyYW1lIHJhdGUgaXMgZGVmaW5lZCBhbmQgaXQgaXMKLSAgICAvLyBzbWFsbGVyIHRoYW4gaGFsZiB0aGUgZW5jb2RpbmcgZnJhbWUgcmF0ZSAoaWYgZGVmaW5lZCkuIEluIHRoaXMgbW9kZSwKLSAgICAvLyBmcmFtZXMgdGhhdCBjb21lIGluIGJldHdlZW4gdGhlIGNhcHR1cmUgaW50ZXJ2YWwgKHRoZSByZWNpcHJvY2FsIG9mIHRoZQotICAgIC8vIGNhcHR1cmUgZnJhbWUgcmF0ZSkgYXJlIGRyb3BwZWQgYW5kIHRoZSBlbmNvZGluZyB0aW1lc3RhbXAgaXMgYWRqdXN0ZWQgdG8KLSAgICAvLyBtYXRjaCB0aGUgZGVzaXJlZCBlbmNvZGluZyBmcmFtZSByYXRlLgotICAgIC8vCi0gICAgLy8gU2xvdyBtb3Rpb24gbW9kZSBpcyBlbmFibGVkIGlmIGJvdGggZW5jb2RpbmcgYW5kIGNhcHR1cmUgZnJhbWUgcmF0ZXMgYXJlCi0gICAgLy8gZGVmaW5lZCBhbmQgdGhlIGVuY29kaW5nIGZyYW1lIHJhdGUgaXMgbGVzcyB0aGFuIGhhbGYgdGhlIGNhcHR1cmUgZnJhbWUKLSAgICAvLyByYXRlLiBJbiB0aGlzIG1vZGUsIHRoZSBzb3VyY2UgaXMgZXhwZWN0ZWQgdG8gcHJvZHVjZSBmcmFtZXMgd2l0aCBhbiBldmVuCi0gICAgLy8gdGltZXN0YW1wIGludGVydmFsIChhZnRlciByb3VuZGluZykgd2l0aCB0aGUgY29uZmlndXJlZCBjYXB0dXJlIGZwcy4gVGhlCi0gICAgLy8gZmlyc3Qgc291cmNlIHRpbWVzdGFtcCBpcyB1c2VkIGFzIHRoZSBzb3VyY2UgYmFzZSB0aW1lLiBBZnRlcndhcmRzLCB0aGUKLSAgICAvLyB0aW1lc3RhbXAgb2YgZWFjaCBzb3VyY2UgZnJhbWUgaXMgc25hcHBlZCB0byB0aGUgbmVhcmVzdCBleHBlY3RlZCBjYXB0dXJlCi0gICAgLy8gdGltZXN0YW1wIGFuZCBzY2FsZWQgdG8gbWF0Y2ggdGhlIGNvbmZpZ3VyZWQgZW5jb2RpbmcgZnJhbWUgcmF0ZS4KLQotICAgIC8vIFRoZXNlIG1vZGVzIG11c3QgYmUgZW5hYmxlZCBiZWZvcmUgdXNpbmcgdGhpcyBzb3VyY2UuCi0KLSAgICAvLyBhZGp1c3RlZCBjYXB0dXJlIHRpbWVzdGFtcCBvZiB0aGUgYmFzZSBmcmFtZQotICAgIGludDY0X3QgbUJhc2VDYXB0dXJlVXM7Ci0KLSAgICAvLyBhZGp1c3RlZCBlbmNvZGluZyB0aW1lc3RhbXAgb2YgdGhlIGJhc2UgZnJhbWUKLSAgICBpbnQ2NF90IG1CYXNlRnJhbWVVczsKLQotICAgIC8vIG51bWJlciBvZiBmcmFtZXMgZnJvbSB0aGUgYmFzZSB0aW1lCi0gICAgaW50NjRfdCBtRnJhbWVDb3VudDsKLQotICAgIC8vIGFkanVzdGVkIGNhcHR1cmUgdGltZXN0YW1wIGZvciBwcmV2aW91cyBmcmFtZSAobmVnYXRpdmUgaWYgdGhlcmUgd2VyZQotICAgIC8vIG5vbmUpCi0gICAgaW50NjRfdCBtUHJldkNhcHR1cmVVczsKLQotICAgIC8vIGFkanVzdGVkIG1lZGlhIHRpbWVzdGFtcCBmb3IgcHJldmlvdXMgZnJhbWUgKG5lZ2F0aXZlIGlmIHRoZXJlIHdlcmUgbm9uZSkKLSAgICBpbnQ2NF90IG1QcmV2RnJhbWVVczsKLQotICAgIC8vIGRlc2lyZWQgb2Zmc2V0IGJldHdlZW4gbWVkaWEgdGltZSBhbmQgY2FwdHVyZSB0aW1lCi0gICAgaW50NjRfdCBtSW5wdXRCdWZmZXJUaW1lT2Zmc2V0VXM7Ci0KLSAgICAvLyBDYWxjdWxhdGVzIGFuZCBvdXRwdXRzIHRoZSB0aW1lc3RhbXAgdG8gdXNlIGZvciBhIGJ1ZmZlciB3aXRoIGEgc3BlY2lmaWMgYnVmZmVyIHRpbWVzdGFtcAotICAgIC8vIHxidWZmZXJUaW1lc3RhbXBOc3wuIFJldHVybnMgZmFsc2Ugb24gZmFpbHVyZSAoYnVmZmVyIHRvbyBjbG9zZSBvciB0aW1lc3RhbXAgaXMgbW92aW5nCi0gICAgLy8gYmFja3dhcmRzKS4gT3RoZXJ3aXNlLCBzdG9yZXMgdGhlIG1lZGlhIHRpbWVzdGFtcCBpbiB8KmNvZGVjVGltZVVzfCBhbmQgcmV0dXJucyB0cnVlLgotICAgIC8vCi0gICAgLy8gVGhpcyBtZXRob2QgdGFrZXMgaW50byBhY2NvdW50IHRoZSBzdGFydCB0aW1lIG9mZnNldCBhbmQgYW55IHRpbWUgbGFwc2Ugb3Igc2xvdyBtb3Rpb24gdGltZQotICAgIC8vIGFkanVzdG1lbnQgcmVxdWVzdHMuCi0gICAgYm9vbCBjYWxjdWxhdGVDb2RlY1RpbWVzdGFtcF9sKG5zZWNzX3QgYnVmZmVyVGltZU5zLCBpbnQ2NF90ICpjb2RlY1RpbWVVcyk7Ci0KLSAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEdyYXBoaWNCdWZmZXJTb3VyY2UpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBHUkFQSElDX0JVRkZFUl9TT1VSQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0YjRjMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX09NWF9IXwotI2RlZmluZSBBTkRST0lEX09NWF9IXwotCi0jaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgotI2luY2x1ZGUgIk9teE5vZGVPd25lci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBPTVhNYXN0ZXI7Ci1zdHJ1Y3QgT01YTm9kZUluc3RhbmNlOwotCi1jbGFzcyBPTVggOiBwdWJsaWMgQm5PTVgsCi0gICAgICAgICAgICBwdWJsaWMgT214Tm9kZU93bmVyLAotICAgICAgICAgICAgcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKLXB1YmxpYzoKLSAgICBPTVgoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdE5vZGVzKExpc3Q8Q29tcG9uZW50SW5mbz4gKmxpc3QpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhbGxvY2F0ZU5vZGUoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBzcDxJT01YT2JzZXJ2ZXI+ICZvYnNlcnZlciwKLSAgICAgICAgICAgIHNwPElPTVhOb2RlPiAqb214Tm9kZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUlucHV0U3VyZmFjZSgKLSAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpidWZmZXJQcm9kdWNlciwKLSAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyU291cmNlPiAqYnVmZmVyU291cmNlKTsKLQotICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ0aGVfbGF0ZV93aG8pOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBmcmVlTm9kZShjb25zdCBzcDxPTVhOb2RlSW5zdGFuY2U+JiBpbnN0YW5jZSk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5PTVgoKTsKLQotcHJpdmF0ZToKLSAgICBNdXRleCBtTG9jazsKLSAgICBPTVhNYXN0ZXIgKm1NYXN0ZXI7Ci0gICAgTWVkaWFDb2RlY3NYbWxQYXJzZXIgbVBhcnNlcjsKLQotICAgIEtleWVkVmVjdG9yPHdwPElCaW5kZXI+LCBzcDxPTVhOb2RlSW5zdGFuY2U+ID4gbUxpdmVOb2RlczsKLQotICAgIE9NWChjb25zdCBPTVggJik7Ci0gICAgT01YICZvcGVyYXRvcj0oY29uc3QgT01YICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBBTkRST0lEX09NWF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5oCmluZGV4IDEwNjVjYTUuLmM0MzYxMjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmgKQEAgLTI1LDkgKzI1LDkgQEAKICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KLSNpbmNsdWRlICJPbXhOb2RlT3duZXIuaCIKIAogI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tZW1vcnkvMS4wL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBjbGFzcyBHcmFwaGljQnVmZmVyOwpAQCAtMzUsMTEgKzM1LDEyIEBACiBjbGFzcyBJT01YT2JzZXJ2ZXI7CiBzdHJ1Y3QgT01YTWFzdGVyOwogY2xhc3MgT01YQnVmZmVyOwotdHlwZWRlZiBoaWRsOjptZW1vcnk6OlYxXzA6OklNZW1vcnkgSUhpZGxNZW1vcnk7Cit1c2luZyBJSGlkbE1lbW9yeSA9IGhpZGw6Om1lbW9yeTo6VjFfMDo6SU1lbW9yeTsKK3VzaW5nIGhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6T214OwogCiBzdHJ1Y3QgT01YTm9kZUluc3RhbmNlIDogcHVibGljIEJuT01YTm9kZSB7CiAgICAgT01YTm9kZUluc3RhbmNlKAotICAgICAgICAgICAgT214Tm9kZU93bmVyICpvd25lciwgY29uc3Qgc3A8SU9NWE9ic2VydmVyPiAmb2JzZXJ2ZXIsIGNvbnN0IGNoYXIgKm5hbWUpOworICAgICAgICAgICAgT214ICpvd25lciwgY29uc3Qgc3A8SU9NWE9ic2VydmVyPiAmb2JzZXJ2ZXIsIGNvbnN0IGNoYXIgKm5hbWUpOwogCiAgICAgdm9pZCBzZXRIYW5kbGUoT01YX0hBTkRMRVRZUEUgaGFuZGxlKTsKIApAQCAtMTIyLDcgKzEyMyw3IEBACiAKICAgICBNdXRleCBtTG9jazsKIAotICAgIE9teE5vZGVPd25lciAqbU93bmVyOworICAgIE9teCAqbU93bmVyOwogICAgIE9NWF9IQU5ETEVUWVBFIG1IYW5kbGU7CiAgICAgc3A8SU9NWE9ic2VydmVyPiBtT2JzZXJ2ZXI7CiAgICAgc3A8Q2FsbGJhY2tEaXNwYXRjaGVyPiBtRGlzcGF0Y2hlcjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMGQ3MTMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX09NWFNUT1JFX0hfCi0jZGVmaW5lIEFORFJPSURfT01YU1RPUkVfSF8KLQotI2luY2x1ZGUgPG1lZGlhL0lPTVhTdG9yZS5oPgotI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaD4KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgT01YU3RvcmUgOiBwdWJsaWMgQm5PTVhTdG9yZSB7Ci1wdWJsaWM6Ci0gICAgT01YU3RvcmUoCi0gICAgICAgICAgICBjb25zdCBjaGFyKiBvd25lciA9ICJkZWZhdWx0IiwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0KiBzZWFyY2hEaXJzCi0gICAgICAgICAgICAgICAgPSBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZGVmYXVsdFNlYXJjaERpcnMsCi0gICAgICAgICAgICBjb25zdCBjaGFyKiBtYWluWG1sTmFtZQotICAgICAgICAgICAgICAgID0gTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRNYWluWG1sTmFtZSwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBlcmZvcm1hbmNlWG1sTmFtZQotICAgICAgICAgICAgICAgID0gTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRQZXJmb3JtYW5jZVhtbE5hbWUsCi0gICAgICAgICAgICBjb25zdCBjaGFyKiBwcm9maWxpbmdSZXN1bHRzWG1sUGF0aAotICAgICAgICAgICAgICAgID0gTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRQcm9maWxpbmdSZXN1bHRzWG1sUGF0aCk7Ci0KLSAgICBzdGF0dXNfdCBsaXN0U2VydmljZUF0dHJpYnV0ZXMoCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxBdHRyaWJ1dGU+KiBhdHRyaWJ1dGVzKSBvdmVycmlkZTsKLQotICAgIHN0YXR1c190IGdldE5vZGVQcmVmaXgoc3RkOjpzdHJpbmcqIHByZWZpeCkgb3ZlcnJpZGU7Ci0KLSAgICBzdGF0dXNfdCBsaXN0Um9sZXMoc3RkOjp2ZWN0b3I8Um9sZUluZm8+KiByb2xlTGlzdCkgb3ZlcnJpZGU7Ci0KLSAgICBzdGF0dXNfdCBnZXRPbXgoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHNwPElPTVg+KiBvbXgpIG92ZXJyaWRlOwotCi0gICAgfk9NWFN0b3JlKCkgb3ZlcnJpZGU7Ci0KLXByb3RlY3RlZDoKLSAgICBzdGF0dXNfdCBtUGFyc2luZ1N0YXR1czsKLSAgICBzdGQ6OnN0cmluZyBtUHJlZml4OwotICAgIHN0ZDo6dmVjdG9yPEF0dHJpYnV0ZT4gbVNlcnZpY2VBdHRyaWJ1dGVMaXN0OwotICAgIHN0ZDo6dmVjdG9yPFJvbGVJbmZvPiBtUm9sZUxpc3Q7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFORFJPSURfT01YU1RPUkVfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PbXhHcmFwaGljQnVmZmVyU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT214R3JhcGhpY0J1ZmZlclNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxOGUwY2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT214R3JhcGhpY0J1ZmZlclNvdXJjZS5oCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE9NWF9HUkFQSElDX0JVRkZFUl9TT1VSQ0VfSF8KKworI2RlZmluZSBPTVhfR1JBUEhJQ19CVUZGRVJfU09VUkNFX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9CbkdyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL0JuT01YQnVmZmVyU291cmNlLmg+CisKKyNpbmNsdWRlICJJT214Tm9kZVdyYXBwZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOworCisvKgorICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGZlZWQgT01YIGNvZGVjcyBmcm9tIGEgU3VyZmFjZSB2aWEgQnVmZmVyUXVldWUgb3IKKyAqIEhXIHByb2R1Y2VyLgorICoKKyAqIFNlZSBtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmggZm9yIGRvY3VtZW50YXRpb24uCisgKi8KK2NsYXNzIE9teEdyYXBoaWNCdWZmZXJTb3VyY2UgOiBwdWJsaWMgR3JhcGhpY0J1ZmZlclNvdXJjZSB7CitwdWJsaWM6CisgICAgT214R3JhcGhpY0J1ZmZlclNvdXJjZSgpID0gZGVmYXVsdDsKKyAgICB2aXJ0dWFsIH5PbXhHcmFwaGljQnVmZmVyU291cmNlKCkgPSBkZWZhdWx0OworCisgICAgLy8gT214QnVmZmVyU291cmNlIGludGVyZmFjZQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiBPTVggdHJhbnNpdGlvbnMgdG8gT01YX1N0YXRlRXhlY3V0aW5nLCB3aGljaCBtZWFucworICAgIC8vIHdlIGNhbiBzdGFydCBoYW5kaW5nIGl0IGJ1ZmZlcnMuICBJZiB3ZSBhbHJlYWR5IGhhdmUgYnVmZmVycyBvZiBkYXRhCisgICAgLy8gc2l0dGluZyBpbiB0aGUgQnVmZmVyUXVldWUsIHRoaXMgd2lsbCBzZW5kIHRoZW0gdG8gdGhlIGNvZGVjLgorICAgIFN0YXR1cyBvbk9teEV4ZWN1dGluZygpOworCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiBPTVggdHJhbnNpdGlvbnMgdG8gT01YX1N0YXRlSWRsZSwgaW5kaWNhdGluZyB0aGF0CisgICAgLy8gdGhlIGNvZGVjIGlzIG1lYW50IHRvIHJldHVybiBhbGwgYnVmZmVycyBiYWNrIHRvIHRoZSBjbGllbnQgZm9yIHRoZW0KKyAgICAvLyB0byBiZSBmcmVlZC4gRG8gTk9UIHN1Ym1pdCBhbnkgbW9yZSBidWZmZXJzIHRvIHRoZSBjb21wb25lbnQuCisgICAgU3RhdHVzIG9uT214SWRsZSgpOworCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiBPTVggdHJhbnNpdGlvbnMgdG8gT01YX1N0YXRlTG9hZGVkLCBpbmRpY2F0aW5nIHRoYXQKKyAgICAvLyB3ZSBhcmUgc2h1dHRpbmcgZG93bi4KKyAgICBTdGF0dXMgb25PbXhMb2FkZWQoKTsKKworICAgIC8vIFJlc3Qgb2YgdGhlIGludGVyZmFjZSBpbiBHcmFwaGljQnVmZmVyU291cmNlLgorCisgICAgLy8gSUdyYXBoaWNCdWZmZXJTb3VyY2UgaW50ZXJmYWNlCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvLyBDb25maWd1cmUgdGhlIGJ1ZmZlciBzb3VyY2UgdG8gYmUgdXNlZCB3aXRoIGFuIE9NWCBub2RlIHdpdGggdGhlIGRlZmF1bHQKKyAgICAvLyBkYXRhIHNwYWNlLgorICAgIHN0YXR1c190IGNvbmZpZ3VyZSgKKyAgICAgICAgY29uc3Qgc3A8SU9teE5vZGVXcmFwcGVyPiAmb214Tm9kZSwKKyAgICAgICAgaW50MzJfdCBkYXRhU3BhY2UsCisgICAgICAgIGludDMyX3QgYnVmZmVyQ291bnQsCisgICAgICAgIHVpbnQzMl90IGZyYW1lV2lkdGgsCisgICAgICAgIHVpbnQzMl90IGZyYW1lSGVpZ2h0LAorICAgICAgICB1aW50MzJfdCBjb25zdW1lclVzYWdlKTsKKworICAgIC8vIFJlc3Qgb2YgdGhlIGludGVyZmFjZSBpbiBHcmFwaGljQnVmZmVyU291cmNlLgorCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE9teEdyYXBoaWNCdWZmZXJTb3VyY2UpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBPTVhfR1JBUEhJQ19CVUZGRVJfU09VUkNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaAppbmRleCBjOWZkNzQ1Li41NmZjNjkxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyUmVmbGVjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CiAKICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgpAQCAtNDYsNiArNDcsNyBAQAogcHJvdGVjdGVkOgogICAgIGVudW0gewogICAgICAgICBrRGVzY3JpYmVDb2xvckFzcGVjdHNJbmRleCA9IGtQcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFja0luZGV4ICsgMSwKKyAgICAgICAga0Rlc2NyaWJlSGRyU3RhdGljSW5mb0luZGV4ID0ga1ByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrSW5kZXggKyAyLAogICAgIH07CiAKICAgICBlbnVtIHsKQEAgLTc2LDYgKzc4LDggQEAKIAogICAgIHZpcnR1YWwgaW50IGdldENvbG9yQXNwZWN0UHJlZmVyZW5jZSgpOwogCisgICAgdmlydHVhbCBib29sIHN1cHBvcnREZXNjcmliZUhkclN0YXRpY0luZm8oKTsKKwogICAgIC8vIFRoaXMgZnVuY3Rpb24gc2V0cyBib3RoIG1pbmltdW0gYnVmZmVyIGNvdW50IGFuZCBhY3R1YWwgYnVmZmVyIGNvdW50IG9mCiAgICAgLy8gaW5wdXQgcG9ydCB0byBiZSB8bnVtSW5wdXRCdWZmZXJzfC4gSXQgd2lsbCBhbHNvIHNldCBib3RoIG1pbmltdW0gYnVmZmVyCiAgICAgLy8gY291bnQgYW5kIGFjdHVhbCBidWZmZXIgY291bnQgb2Ygb3V0cHV0IHBvcnQgdG8gYmUgfG51bU91dHB1dEJ1ZmZlcnN8LgpAQCAtMTEzLDcgKzExNyw5IEBACiAgICAgLy8gSXQgd2lsbCB0cmlnZ2VyIE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQgZXZlbnQgaWYgbmVjZXNzYXJ5LgogICAgIHZvaWQgaGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKAogICAgICAgICAgICAgYm9vbCAqcG9ydFdpbGxSZXNldCwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKLSAgICAgICAgICAgIENyb3BTZXR0aW5nc01vZGUgY3JvcFNldHRpbmdzTW9kZSA9IGtDcm9wVW5TZXQsIGJvb2wgZmFrZVN0cmlkZSA9IGZhbHNlKTsKKyAgICAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIG91dHB1dEZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIsCisgICAgICAgICAgICBDcm9wU2V0dGluZ3NNb2RlIGNyb3BTZXR0aW5nc01vZGUgPSBrQ3JvcFVuU2V0LAorICAgICAgICAgICAgYm9vbCBmYWtlU3RyaWRlID0gZmFsc2UpOwogCiAgICAgdm9pZCBjb3B5WVYxMkZyYW1lVG9PdXRwdXRCdWZmZXIoCiAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyY1ksIGNvbnN0IHVpbnQ4X3QgKnNyY1UsIGNvbnN0IHVpbnQ4X3QgKnNyY1YsCkBAIC0xMjksNyArMTM1LDggQEAKICAgICB1aW50MzJfdCBtQWRhcHRpdmVNYXhXaWR0aCwgbUFkYXB0aXZlTWF4SGVpZ2h0OwogICAgIHVpbnQzMl90IG1XaWR0aCwgbUhlaWdodDsKICAgICB1aW50MzJfdCBtQ3JvcExlZnQsIG1Dcm9wVG9wLCBtQ3JvcFdpZHRoLCBtQ3JvcEhlaWdodDsKLQorICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIG1PdXRwdXRGb3JtYXQ7CisgICAgSERSU3RhdGljSW5mbyBtSGRyU3RhdGljSW5mbzsKICAgICBlbnVtIHsKICAgICAgICAgTk9ORSwKICAgICAgICAgQVdBSVRJTkdfRElTQUJMRUQsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDhiY2I5OWUuLjNiNTIxYWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLmJwCkBAIC04LDYgKzgsOCBAQAogICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCkBAIC0zMiwyMSArMzQsMyBAQAogCiAgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KLQotY2NfdGVzdCB7Ci0gICAgbmFtZTogIkZyYW1lRHJvcHBlcl90ZXN0IiwKLQotICAgIHNyY3M6IFsiRnJhbWVEcm9wcGVyX3Rlc3QuY3BwIl0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICBdLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214Il0sCi0KLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1XZXJyb3IiLAotICAgICAgICAiLVdhbGwiLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvRnJhbWVEcm9wcGVyX3Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0ZyYW1lRHJvcHBlcl90ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkyNWRhNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvRnJhbWVEcm9wcGVyX3Rlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkZyYW1lRHJvcHBlcl90ZXN0IgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9GcmFtZURyb3BwZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBUZXN0RnJhbWUgewotICBpbnQ2NF90IHRpbWVVczsKLSAgYm9vbCBzaG91bGREcm9wOwotfTsKLQotc3RhdGljIGNvbnN0IFRlc3RGcmFtZSB0ZXN0RnJhbWVzMjBGcHNbXSA9IHsKLSAgICB7MTAwMDAwMCwgZmFsc2V9LCB7MTA1MDAwMCwgZmFsc2V9LCB7MTEwMDAwMCwgZmFsc2V9LCB7MTE1MDAwMCwgZmFsc2V9LAotICAgIHsxMjAwMDAwLCBmYWxzZX0sIHsxMjUwMDAwLCBmYWxzZX0sIHsxMzAwMDAwLCBmYWxzZX0sIHsxMzUwMDAwLCBmYWxzZX0sCi0gICAgezE0MDAwMDAsIGZhbHNlfSwgezE0NTAwMDAsIGZhbHNlfSwgezE1MDAwMDAsIGZhbHNlfSwgezE1NTAwMDAsIGZhbHNlfSwKLSAgICB7MTYwMDAwMCwgZmFsc2V9LCB7MTY1MDAwMCwgZmFsc2V9LCB7MTcwMDAwMCwgZmFsc2V9LCB7MTc1MDAwMCwgZmFsc2V9LAotICAgIHsxODAwMDAwLCBmYWxzZX0sIHsxODUwMDAwLCBmYWxzZX0sIHsxOTAwMDAwLCBmYWxzZX0sIHsxOTUwMDAwLCBmYWxzZX0sCi19OwotCi1zdGF0aWMgY29uc3QgVGVzdEZyYW1lIHRlc3RGcmFtZXMzMEZwc1tdID0gewotICAgIHsxMDAwMDAwLCBmYWxzZX0sIHsxMDMzMzMzLCBmYWxzZX0sIHsxMDY2NjY3LCBmYWxzZX0sIHsxMTAwMDAwLCBmYWxzZX0sCi0gICAgezExMzMzMzMsIGZhbHNlfSwgezExNjY2NjcsIGZhbHNlfSwgezEyMDAwMDAsIGZhbHNlfSwgezEyMzMzMzMsIGZhbHNlfSwKLSAgICB7MTI2NjY2NywgZmFsc2V9LCB7MTMwMDAwMCwgZmFsc2V9LCB7MTMzMzMzMywgZmFsc2V9LCB7MTM2NjY2NywgZmFsc2V9LAotICAgIHsxNDAwMDAwLCBmYWxzZX0sIHsxNDMzMzMzLCBmYWxzZX0sIHsxNDY2NjY3LCBmYWxzZX0sIHsxNTAwMDAwLCBmYWxzZX0sCi0gICAgezE1MzMzMzMsIGZhbHNlfSwgezE1NjY2NjcsIGZhbHNlfSwgezE2MDAwMDAsIGZhbHNlfSwgezE2MzMzMzMsIGZhbHNlfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBUZXN0RnJhbWUgdGVzdEZyYW1lczQwRnBzW10gPSB7Ci0gICAgezEwMDAwMDAsIGZhbHNlfSwgezEwMjUwMDAsIHRydWV9LCB7MTA1MDAwMCwgZmFsc2V9LCB7MTA3NTAwMCwgZmFsc2V9LAotICAgIHsxMTAwMDAwLCBmYWxzZX0sIHsxMTI1MDAwLCB0cnVlfSwgezExNTAwMDAsIGZhbHNlfSwgezExNzUwMDAsIGZhbHNlfSwKLSAgICB7MTIwMDAwMCwgZmFsc2V9LCB7MTIyNTAwMCwgdHJ1ZX0sIHsxMjUwMDAwLCBmYWxzZX0sIHsxMjc1MDAwLCBmYWxzZX0sCi0gICAgezEzMDAwMDAsIGZhbHNlfSwgezEzMjUwMDAsIHRydWV9LCB7MTM1MDAwMCwgZmFsc2V9LCB7MTM3NTAwMCwgZmFsc2V9LAotICAgIHsxNDAwMDAwLCBmYWxzZX0sIHsxNDI1MDAwLCB0cnVlfSwgezE0NTAwMDAsIGZhbHNlfSwgezE0NzUwMDAsIGZhbHNlfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBUZXN0RnJhbWUgdGVzdEZyYW1lczYwRnBzW10gPSB7Ci0gICAgezEwMDAwMDAsIGZhbHNlfSwgezEwMTY2NjcsIHRydWV9LCB7MTAzMzMzMywgZmFsc2V9LCB7MTA1MDAwMCwgdHJ1ZX0sCi0gICAgezEwNjY2NjcsIGZhbHNlfSwgezEwODMzMzMsIHRydWV9LCB7MTEwMDAwMCwgZmFsc2V9LCB7MTExNjY2NywgdHJ1ZX0sCi0gICAgezExMzMzMzMsIGZhbHNlfSwgezExNTAwMDAsIHRydWV9LCB7MTE2NjY2NywgZmFsc2V9LCB7MTE4MzMzMywgdHJ1ZX0sCi0gICAgezEyMDAwMDAsIGZhbHNlfSwgezEyMTY2NjcsIHRydWV9LCB7MTIzMzMzMywgZmFsc2V9LCB7MTI1MDAwMCwgdHJ1ZX0sCi0gICAgezEyNjY2NjcsIGZhbHNlfSwgezEyODMzMzMsIHRydWV9LCB7MTMwMDAwMCwgZmFsc2V9LCB7MTMxNjY2NywgdHJ1ZX0sCi19OwotCi1zdGF0aWMgY29uc3QgVGVzdEZyYW1lIHRlc3RGcmFtZXNWYXJpYWJsZUZwc1tdID0gewotICAgIC8vIDQwZnBzCi0gICAgezEwMDAwMDAsIGZhbHNlfSwgezEwMjUwMDAsIHRydWV9LCB7MTA1MDAwMCwgZmFsc2V9LCB7MTA3NTAwMCwgZmFsc2V9LAotICAgIHsxMTAwMDAwLCBmYWxzZX0sIHsxMTI1MDAwLCB0cnVlfSwgezExNTAwMDAsIGZhbHNlfSwgezExNzUwMDAsIGZhbHNlfSwKLSAgICB7MTIwMDAwMCwgZmFsc2V9LCB7MTIyNTAwMCwgdHJ1ZX0sIHsxMjUwMDAwLCBmYWxzZX0sIHsxMjc1MDAwLCBmYWxzZX0sCi0gICAgezEzMDAwMDAsIGZhbHNlfSwgezEzMjUwMDAsIHRydWV9LCB7MTM1MDAwMCwgZmFsc2V9LCB7MTM3NTAwMCwgZmFsc2V9LAotICAgIHsxNDAwMDAwLCBmYWxzZX0sIHsxNDI1MDAwLCB0cnVlfSwgezE0NTAwMDAsIGZhbHNlfSwgezE0NzUwMDAsIGZhbHNlfSwKLSAgICAvLyBhIHRpbWVzdGFtcCBqdW1wIHBsdXMgc3dpdGNoIHRvIDIwZnBzCi0gICAgezIwMDAwMDAsIGZhbHNlfSwgezIwNTAwMDAsIGZhbHNlfSwgezIxMDAwMDAsIGZhbHNlfSwgezIxNTAwMDAsIGZhbHNlfSwKLSAgICB7MjIwMDAwMCwgZmFsc2V9LCB7MjI1MDAwMCwgZmFsc2V9LCB7MjMwMDAwMCwgZmFsc2V9LCB7MjM1MDAwMCwgZmFsc2V9LAotICAgIHsyNDAwMDAwLCBmYWxzZX0sIHsyNDUwMDAwLCBmYWxzZX0sIHsyNTAwMDAwLCBmYWxzZX0sIHsyNTUwMDAwLCBmYWxzZX0sCi0gICAgezI2MDAwMDAsIGZhbHNlfSwgezI2NTAwMDAsIGZhbHNlfSwgezI3MDAwMDAsIGZhbHNlfSwgezI3NTAwMDAsIGZhbHNlfSwKLSAgICB7MjgwMDAwMCwgZmFsc2V9LCB7Mjg1MDAwMCwgZmFsc2V9LCB7MjkwMDAwMCwgZmFsc2V9LCB7Mjk1MDAwMCwgZmFsc2V9LAotICAgIC8vIDYwZnBzCi0gICAgezI5NjY2NjcsIGZhbHNlfSwgezI5ODMzMzMsIHRydWV9LCB7MzAwMDAwMCwgZmFsc2V9LCB7MzAxNjY2NywgdHJ1ZX0sCi0gICAgezMwMzMzMzMsIGZhbHNlfSwgezMwNTAwMDAsIHRydWV9LCB7MzA2NjY2NywgZmFsc2V9LCB7MzA4MzMzMywgdHJ1ZX0sCi0gICAgezMxMDAwMDAsIGZhbHNlfSwgezMxMTY2NjcsIHRydWV9LCB7MzEzMzMzMywgZmFsc2V9LCB7MzE1MDAwMCwgdHJ1ZX0sCi0gICAgezMxNjY2NjcsIGZhbHNlfSwgezMxODMzMzMsIHRydWV9LCB7MzIwMDAwMCwgZmFsc2V9LCB7MzIxNjY2NywgdHJ1ZX0sCi0gICAgezMyMzMzMzMsIGZhbHNlfSwgezMyNTAwMDAsIHRydWV9LCB7MzI2NjY2NywgZmFsc2V9LCB7MzI4MzMzMywgdHJ1ZX0sCi19OwotCi1zdGF0aWMgY29uc3QgaW50IGtNYXhUZXN0Sml0dGVyVXMgPSAyMDAwOwotLy8gcmV0dXJuIG9uZSBvZiAxMDAwLCAwLCAtMTAwMCBhcyBqaXR0ZXIuCi1zdGF0aWMgaW50IEdldEppdHRlcihzaXplX3QgaSkgewotICAgIHJldHVybiAoMSAtIChpICUgMykpICogKGtNYXhUZXN0Sml0dGVyVXMgLyAyKTsKLX0KLQotY2xhc3MgRnJhbWVEcm9wcGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotcHVibGljOgotICAgIEZyYW1lRHJvcHBlclRlc3QoKSA6IG1GcmFtZURyb3BwZXIobmV3IEZyYW1lRHJvcHBlcigpKSB7Ci0gICAgICAgIEVYUEVDVF9FUShPSywgbUZyYW1lRHJvcHBlci0+c2V0TWF4RnJhbWVSYXRlKDMwLjApKTsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICB2b2lkIFJ1blRlc3QoY29uc3QgVGVzdEZyYW1lKiBmcmFtZXMsIHNpemVfdCBzaXplKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgICAgICAgICBpbnQgaml0dGVyID0gR2V0Sml0dGVyKGkpOwotICAgICAgICAgICAgaW50NjRfdCB0ZXN0VGltZVVzID0gZnJhbWVzW2ldLnRpbWVVcyArIGppdHRlcjsKLSAgICAgICAgICAgIHByaW50ZigidGltZSAlbGxkLCB0ZXN0VGltZSAlbGxkLCBqaXR0ZXIgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZnJhbWVzW2ldLnRpbWVVcywgKGxvbmcgbG9uZyl0ZXN0VGltZVVzLCBqaXR0ZXIpOwotICAgICAgICAgICAgRVhQRUNUX0VRKGZyYW1lc1tpXS5zaG91bGREcm9wLCBtRnJhbWVEcm9wcGVyLT5zaG91bGREcm9wKHRlc3RUaW1lVXMpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHNwPEZyYW1lRHJvcHBlcj4gbUZyYW1lRHJvcHBlcjsKLX07Ci0KLVRFU1RfRihGcmFtZURyb3BwZXJUZXN0LCBUZXN0SW52YWxpZE1heEZyYW1lUmF0ZSkgewotICAgIEVYUEVDVF9ORShPSywgbUZyYW1lRHJvcHBlci0+c2V0TWF4RnJhbWVSYXRlKC0xLjApKTsKLSAgICBFWFBFQ1RfTkUoT0ssIG1GcmFtZURyb3BwZXItPnNldE1heEZyYW1lUmF0ZSgwKSk7Ci19Ci0KLVRFU1RfRihGcmFtZURyb3BwZXJUZXN0LCBUZXN0MjBGcHMpIHsKLSAgICBSdW5UZXN0KHRlc3RGcmFtZXMyMEZwcywgQVJSQVlfU0laRSh0ZXN0RnJhbWVzMjBGcHMpKTsKLX0KLQotVEVTVF9GKEZyYW1lRHJvcHBlclRlc3QsIFRlc3QzMEZwcykgewotICAgIFJ1blRlc3QodGVzdEZyYW1lczMwRnBzLCBBUlJBWV9TSVpFKHRlc3RGcmFtZXMzMEZwcykpOwotfQotCi1URVNUX0YoRnJhbWVEcm9wcGVyVGVzdCwgVGVzdDQwRnBzKSB7Ci0gICAgUnVuVGVzdCh0ZXN0RnJhbWVzNDBGcHMsIEFSUkFZX1NJWkUodGVzdEZyYW1lczQwRnBzKSk7Ci19Ci0KLVRFU1RfRihGcmFtZURyb3BwZXJUZXN0LCBUZXN0NjBGcHMpIHsKLSAgICBSdW5UZXN0KHRlc3RGcmFtZXM2MEZwcywgQVJSQVlfU0laRSh0ZXN0RnJhbWVzNjBGcHMpKTsKLX0KLQotVEVTVF9GKEZyYW1lRHJvcHBlclRlc3QsIFRlc3RWYXJpYWJsZUZwcykgewotICAgIFJ1blRlc3QodGVzdEZyYW1lc1ZhcmlhYmxlRnBzLCBBUlJBWV9TSVpFKHRlc3RGcmFtZXNWYXJpYWJsZUZwcykpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAKaW5kZXggMzI2NjQzOS4uODk1YTRjZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcApAQCAtMjUsMjAgKzI1LDIyIEBACiAKICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUNvZGVjU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9PTVhCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvT01YQnVmZmVyLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXguaD4KICNpbmNsdWRlIDxtZWRpYS9vbXgvMS4wL1dPbXguaD4KICNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+CkBAIC02Nyw3ICs2OSw3IEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogSGFybmVzczo6SGFybmVzcygpCi0gICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpLCBtVXNlVHJlYmxlKGZhbHNlKSB7CisgICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpIHsKICAgICBtSW5pdENoZWNrID0gaW5pdE9NWCgpOwogfQogCkBAIC03OSwyMSArODEsMTIgQEAKIH0KIAogc3RhdHVzX3QgSGFybmVzczo6aW5pdE9NWCgpIHsKLSAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QubWVkaWEudHJlYmxlX29teCIsIHRydWUpKSB7Ci0gICAgICAgIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOwotICAgICAgICBzcDxJT214PiB0T214ID0gSU9teDo6Z2V0U2VydmljZSgpOwotICAgICAgICBpZiAodE9teCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotICAgICAgICBtT01YID0gbmV3IHV0aWxzOjpMV09teCh0T214KTsKLSAgICAgICAgbVVzZVRyZWJsZSA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwotICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBzbS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEuY29kZWMiKSk7Ci0gICAgICAgIHNwPElNZWRpYUNvZGVjU2VydmljZT4gc2VydmljZSA9IGludGVyZmFjZV9jYXN0PElNZWRpYUNvZGVjU2VydmljZT4oYmluZGVyKTsKLSAgICAgICAgbU9NWCA9IHNlcnZpY2UtPmdldE9NWCgpOwotICAgICAgICBtVXNlVHJlYmxlID0gZmFsc2U7CisgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA7CisgICAgc3A8SU9teD4gdE9teCA9IElPbXg6OmdldFNlcnZpY2UoKTsKKyAgICBpZiAodE9teCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KKyAgICBtT01YID0gbmV3IHV0aWxzOjpMV09teCh0T214KTsKIAogICAgIHJldHVybiBtT01YICE9IDAgPyBPSyA6IE5PX0lOSVQ7CiB9CkBAIC0yMjEsMjUgKzIxNCwxOSBAQAogICAgIGZvciAoT01YX1UzMiBpID0gMDsgaSA8IGRlZi5uQnVmZmVyQ291bnRBY3R1YWw7ICsraSkgewogICAgICAgICBCdWZmZXIgYnVmZmVyOwogICAgICAgICBidWZmZXIubUZsYWdzID0gMDsKLSAgICAgICAgaWYgKG1Vc2VUcmVibGUpIHsKLSAgICAgICAgICAgIGJvb2wgc3VjY2VzczsKLSAgICAgICAgICAgIGF1dG8gdHJhbnNTdGF0dXMgPSBtQWxsb2NhdG9yLT5hbGxvY2F0ZShkZWYubkJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgIFsmc3VjY2VzcywgJmJ1ZmZlcl0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfbWVtb3J5IGNvbnN0JiBtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5tSGlkbE1lbW9yeSA9IG07Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgRVhQRUNUKHRyYW5zU3RhdHVzLmlzT2soKSwKLSAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjYWxsIGFsbG9jYXRvciIpOwotICAgICAgICAgICAgRVhQRUNUKHN1Y2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5Iik7Ci0gICAgICAgICAgICBlcnIgPSBtT01YTm9kZS0+dXNlQnVmZmVyKHBvcnRJbmRleCwgYnVmZmVyLm1IaWRsTWVtb3J5LCAmYnVmZmVyLm1JRCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBidWZmZXIubU1lbW9yeSA9IG1EZWFsZXItPmFsbG9jYXRlKGRlZi5uQnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICBDSEVDSyhidWZmZXIubU1lbW9yeSAhPSBOVUxMKTsKLSAgICAgICAgICAgIGVyciA9IG1PTVhOb2RlLT51c2VCdWZmZXIocG9ydEluZGV4LCBidWZmZXIubU1lbW9yeSwgJmJ1ZmZlci5tSUQpOwotICAgICAgICB9CisgICAgICAgIGJvb2wgc3VjY2VzczsKKyAgICAgICAgYXV0byB0cmFuc1N0YXR1cyA9IG1BbGxvY2F0b3ItPmFsbG9jYXRlKGRlZi5uQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICBbJnN1Y2Nlc3MsICZidWZmZXJdKAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzLAorICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF9tZW1vcnkgY29uc3QmIG0pIHsKKyAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHM7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5tSGlkbE1lbW9yeSA9IG07CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIEVYUEVDVCh0cmFuc1N0YXR1cy5pc09rKCksCisgICAgICAgICAgICAgICAgIkNhbm5vdCBjYWxsIGFsbG9jYXRvciIpOworICAgICAgICBFWFBFQ1Qoc3VjY2VzcywKKyAgICAgICAgICAgICAgICAiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSIpOworICAgICAgICBlcnIgPSBtT01YTm9kZS0+dXNlQnVmZmVyKHBvcnRJbmRleCwgYnVmZmVyLm1IaWRsTWVtb3J5LCAmYnVmZmVyLm1JRCk7CiAKICAgICAgICAgRVhQRUNUX1NVQ0NFU1MoZXJyLCAidXNlQnVmZmVyIik7CiAKQEAgLTI5MSwxMyArMjc4LDEzIEBACiAKIHN0YXRpYyBzcDxJTWVkaWFFeHRyYWN0b3I+IENyZWF0ZUV4dHJhY3RvckZyb21VUkkoY29uc3QgY2hhciAqdXJpKSB7CiAgICAgc3A8RGF0YVNvdXJjZT4gc291cmNlID0KLSAgICAgICAgRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSShOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCB1cmkpOworICAgICAgICBEYXRhU291cmNlRmFjdG9yeTo6Q3JlYXRlRnJvbVVSSShOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCB1cmkpOwogCiAgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIHJldHVybiBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKHNvdXJjZSk7CisgICAgcmV0dXJuIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Q3JlYXRlKHNvdXJjZSk7CiB9CiAKIHN0YXR1c190IEhhcm5lc3M6OnRlc3RTdGF0ZVRyYW5zaXRpb25zKApAQCAtMzA4LDEzICsyOTUsMTEgQEAKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAotICAgIGlmIChtVXNlVHJlYmxlKSB7Ci0gICAgICAgIG1BbGxvY2F0b3IgPSBJQWxsb2NhdG9yOjpnZXRTZXJ2aWNlKCJhc2htZW0iKTsKLSAgICAgICAgRVhQRUNUKG1BbGxvY2F0b3IgIT0gbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAiQ2Fubm90IG9idGFpbiBoaWRsIEFzaG1lbUFsbG9jYXRvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1EZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKDE2ICogMTAyNCAqIDEwMjQsICJPTVhIYXJuZXNzIik7Ci0gICAgfQorICAgIG1BbGxvY2F0b3IgPSBJQWxsb2NhdG9yOjpnZXRTZXJ2aWNlKCJhc2htZW0iKTsKKyAgICBFWFBFQ1QobUFsbG9jYXRvciAhPSBudWxscHRyLAorICAgICAgICAgICAgIkNhbm5vdCBvYnRhaW4gaGlkbCBBc2htZW1BbGxvY2F0b3IiKTsKKyAgICAvLyBUT0RPOiBXaGVuIFRyZWJsZSBoYXMgTWVtb3J5SGVhcC9NZW1vcnlEZWFsZXIsIHdlIHNob3VsZCBzcGVjaWZ5IHRoZSBoZWFwCisgICAgLy8gc2l6ZSB0byBiZSAxNiAqIDEwMjQgKiAxMDI0LgogCiAgICAgc3A8Q29kZWNPYnNlcnZlcj4gb2JzZXJ2ZXIgPSBuZXcgQ29kZWNPYnNlcnZlcih0aGlzLCArK21DdXJHZW5lcmF0aW9uKTsKIApAQCAtNTQzLDcgKzUyOCw3IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBzcDxJTWVkaWFTb3VyY2U+IENyZWF0ZVNvdXJjZUZvck1pbWUoY29uc3QgY2hhciAqbWltZSkgeworc3RhdGljIHNwPE1lZGlhU291cmNlPiBDcmVhdGVTb3VyY2VGb3JNaW1lKGNvbnN0IGNoYXIgKm1pbWUpIHsKICAgICBjb25zdCBjaGFyICp1cmwgPSBHZXRVUkxGb3JNaW1lKG1pbWUpOwogCiAgICAgaWYgKHVybCA9PSBOVUxMKSB7CkBAIC01NjQsNyArNTQ5LDcgQEAKICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmdHJhY2tNaW1lKSk7CiAKICAgICAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIHRyYWNrTWltZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBleHRyYWN0b3ItPmdldFRyYWNrKGkpOworICAgICAgICAgICAgcmV0dXJuIENyZWF0ZU1lZGlhU291cmNlRnJvbUlNZWRpYVNvdXJjZShleHRyYWN0b3ItPmdldFRyYWNrKGkpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjEwLDcgKzU5NSw3IEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICBzcDxJTWVkaWFTb3VyY2U+IHNvdXJjZSA9IENyZWF0ZVNvdXJjZUZvck1pbWUobWltZSk7CisgICAgc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSA9IENyZWF0ZVNvdXJjZUZvck1pbWUobWltZSk7CiAKICAgICBpZiAoc291cmNlID09IE5VTEwpIHsKICAgICAgICAgcHJpbnRmKCIgICogVW5hYmxlIHRvIG9wZW4gdGVzdCBjb250ZW50IGZvciB0eXBlICclcycsICIKQEAgLTYyMCwxNCArNjA1LDE0IEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICBzcDxJTWVkaWFTb3VyY2U+IHNlZWtTb3VyY2UgPSBDcmVhdGVTb3VyY2VGb3JNaW1lKG1pbWUpOworICAgIHNwPE1lZGlhU291cmNlPiBzZWVrU291cmNlID0gQ3JlYXRlU291cmNlRm9yTWltZShtaW1lKTsKICAgICBpZiAoc291cmNlID09IE5VTEwgfHwgc2Vla1NvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAogICAgIENIRUNLX0VRKHNlZWtTb3VyY2UtPnN0YXJ0KCksIChzdGF0dXNfdClPSyk7CiAKLSAgICBzcDxJTWVkaWFTb3VyY2U+IGNvZGVjID0gU2ltcGxlRGVjb2RpbmdTb3VyY2U6OkNyZWF0ZSgKKyAgICBzcDxNZWRpYVNvdXJjZT4gY29kZWMgPSBTaW1wbGVEZWNvZGluZ1NvdXJjZTo6Q3JlYXRlKAogICAgICAgICAgICAgc291cmNlLCAwIC8qIGZsYWdzICovLCBOVUxMIC8qIG5hdGl2ZVdpbmRvdyAqLywgY29tcG9uZW50TmFtZSk7CiAKICAgICBDSEVDSyhjb2RlYyAhPSBOVUxMKTsKQEAgLTY3Myw3ICs2NTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkU2Vla1RpbWVVcywgcmVxdWVzdGVkU2Vla1RpbWVVcyAvIDFFNik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBOVUxMOworICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIgPSBOVUxMOwogICAgICAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8oCiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFNlZWtUaW1lVXMsIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19ORVhUX1NZTkMpOwogCkBAIC02ODIsNyArNjY3LDcgQEAKICAgICAgICAgICAgICAgICBhY3R1YWxTZWVrVGltZVVzID0gLTE7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIENIRUNLKGJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZhY3R1YWxTZWVrVGltZVVzKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZhY3R1YWxTZWVrVGltZVVzKSk7CiAgICAgICAgICAgICAgICAgQ0hFQ0soYWN0dWFsU2Vla1RpbWVVcyA+PSAwKTsKIAogICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwpAQCAtNjk0LDcgKzY3OSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXI7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOwogICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgICBlcnIgPSBjb2RlYy0+cmVhZCgmYnVmZmVyLCAmb3B0aW9ucyk7CiAgICAgICAgICAgICBvcHRpb25zLmNsZWFyU2Vla1RvKCk7CkBAIC03NDMsNyArNzI4LDcgQEAKICAgICAgICAgICAgIENIRUNLKGJ1ZmZlciAhPSBOVUxMKTsKIAogICAgICAgICAgICAgaW50NjRfdCBidWZmZXJUaW1lVXM7Ci0gICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZidWZmZXJUaW1lVXMpKTsKKyAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCkuZmluZEludDY0KGtLZXlUaW1lLCAmYnVmZmVyVGltZVVzKSk7CiAgICAgICAgICAgICBpZiAoIUNsb3NlRW5vdWdoKGJ1ZmZlclRpbWVVcywgYWN0dWFsU2Vla1RpbWVVcykpIHsKICAgICAgICAgICAgICAgICBwcmludGYoIlxuICAqIEF0dGVtcHRlZCBzZWVraW5nIHRvICUiIFBSSWQ2NCAiIHVzICglLjJmIHNlY3MpIiwKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkU2Vla1RpbWVVcywgcmVxdWVzdGVkU2Vla1RpbWVVcyAvIDFFNik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuaAppbmRleCA0ZmMwZjc5Li5kY2E3ODdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmgKQEAgLTkzLDggKzkzLDYgQEAKICAgICBDb25kaXRpb24gbU1lc3NhZ2VBZGRlZENvbmRpdGlvbjsKICAgICBpbnQzMl90IG1MYXN0TXNnR2VuZXJhdGlvbjsKICAgICBpbnQzMl90IG1DdXJHZW5lcmF0aW9uOwotICAgIGJvb2wgbVVzZVRyZWJsZTsKLSAgICBzcDxNZW1vcnlEZWFsZXI+IG1EZWFsZXI7CiAgICAgc3A8SUFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKIAogICAgIHN0YXR1c190IGluaXRPTVgoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUgyNjNBc3NlbWJsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BSDI2M0Fzc2VtYmxlci5jcHAKaW5kZXggNzVjZDkxMS4uMzQzNmU5NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BSDI2M0Fzc2VtYmxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BSDI2M0Fzc2VtYmxlci5jcHAKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzJUU0Fzc2VtYmxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHMlRTQXNzZW1ibGVyLmNwcAppbmRleCBkY2E1Yzg5Li4wOTg4Nzc0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHMlRTQXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHMlRTQXNzZW1ibGVyLmNwcApAQCAtMjYsMTAgKzI2LDEwIEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzJUU0Fzc2VtYmxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzJUU0Fzc2VtYmxlci5oCmluZGV4IGYzOWMyYjUuLmM5ODdiNWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUcyVFNBc3NlbWJsZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHMlRTQXNzZW1ibGVyLmgKQEAgLTI0LDcgKzI0LDYgQEAKIAogc3RydWN0IEFNZXNzYWdlOwogc3RydWN0IEFTdHJpbmc7Ci1jbGFzcyBNZXRhRGF0YTsKIAogc3RydWN0IEFNUEVHMlRTQXNzZW1ibGVyIDogcHVibGljIEFSVFBBc3NlbWJsZXIgewogICAgIEFNUEVHMlRTQXNzZW1ibGVyKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlci5jcHAKaW5kZXggMTU2MDA0Yy4uMWU0MzRjYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIuY3BwCkBAIC0yNyw4ICsyNyw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogCiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuY3BwCmluZGV4IDhiYTllMDIuLjIwMWE1ZGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmNwcApAQCAtMjMsOCArMjMsNiBAQAogI2luY2x1ZGUgIkFSYXdBdWRpb0Fzc2VtYmxlci5oIgogI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKIAotI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCi0KICNpbmNsdWRlIDxjdHlwZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CkBAIC0zMiw2ICszMCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgpAQCAtMjIwLDcgKzIxOSw3IEBACiAgICAgcmV0dXJuIGNzZDsKIH0KIAotc3A8QUJ1ZmZlcj4gTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKGNvbnN0IGNoYXIgKnBhcmFtcykgeworc3RhdGljIHNwPEFCdWZmZXI+IE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShjb25zdCBjaGFyICpwYXJhbXMpIHsKICAgICBBU3RyaW5nIHZhbDsKICAgICBDSEVDSyhHZXRBdHRyaWJ1dGUocGFyYW1zLCAiY29uZmlnIiwgJnZhbCkpOwogCkBAIC0yNTgsNyArMjU3LDcgQEAKIH0KIAogLy8gRnJvbSBtcGVnNC1nZW5lcmljIGNvbmZpZ3VyYXRpb24gZGF0YS4KLXNwPEFCdWZmZXI+IE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YTIoY29uc3QgY2hhciAqcGFyYW1zKSB7CitzdGF0aWMgc3A8QUJ1ZmZlcj4gTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhMihjb25zdCBjaGFyICpwYXJhbXMpIHsKICAgICBBU3RyaW5nIHZhbDsKICAgICB1bnNpZ25lZCBsb25nIG9iamVjdFR5cGU7CiAgICAgaWYgKEdldEF0dHJpYnV0ZShwYXJhbXMsICJvYmplY3RUeXBlIiwgJnZhbCkpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuY3BwCmluZGV4IDU3NmEwYTQuLjQ4MjdjZDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmNwcApAQCAtNDMsNyArNDMsMTAgQEAKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCiAgICAgOiBtSUQoaWQpLAogICAgICAgbUhpZ2hlc3RTZXFOdW1iZXIoMCksCisgICAgICBtUHJldkV4cGVjdGVkKDApLAorICAgICAgbUJhc2VTZXFOdW1iZXIoMCksCiAgICAgICBtTnVtQnVmZmVyc1JlY2VpdmVkKDApLAorICAgICAgbVByZXZOdW1CdWZmZXJzUmVjZWl2ZWQoMCksCiAgICAgICBtTGFzdE5UUFRpbWUoMCksCiAgICAgICBtTGFzdE5UUFRpbWVVcGRhdGVVcygwKSwKICAgICAgIG1Jc3N1ZUZJUlJlcXVlc3RzKGZhbHNlKSwKQEAgLTEwNyw2ICsxMTAsNyBAQAogCiAgICAgaWYgKG1OdW1CdWZmZXJzUmVjZWl2ZWQrKyA9PSAwKSB7CiAgICAgICAgIG1IaWdoZXN0U2VxTnVtYmVyID0gc2VxTnVtOworICAgICAgICBtQmFzZVNlcU51bWJlciA9IHNlcU51bTsKICAgICAgICAgbVF1ZXVlLnB1c2hfYmFjayhidWZmZXIpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC0yMjYsNiArMjMwLDIyIEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICB1aW50OF90IGZyYWN0aW9uID0gMDsKKworICAgIC8vIEFjY29yZGluZyB0byBhcHBlbmRpeCBBLjMgaW4gUkZDIDM1NTAKKyAgICB1aW50MzJfdCBleHBlY3RlZCA9IG1IaWdoZXN0U2VxTnVtYmVyIC0gbUJhc2VTZXFOdW1iZXIgKyAxOworICAgIGludDY0X3QgaW50ZXJ2YWxFeHBlY3RlZCA9IGV4cGVjdGVkIC0gbVByZXZFeHBlY3RlZDsKKyAgICBpbnQ2NF90IGludGVydmFsUmVjZWl2ZWQgPSBtTnVtQnVmZmVyc1JlY2VpdmVkIC0gbVByZXZOdW1CdWZmZXJzUmVjZWl2ZWQ7CisgICAgaW50NjRfdCBpbnRlcnZhbFBhY2tldExvc3QgPSBpbnRlcnZhbEV4cGVjdGVkIC0gaW50ZXJ2YWxSZWNlaXZlZDsKKworICAgIGlmIChpbnRlcnZhbEV4cGVjdGVkID4gMCAmJiBpbnRlcnZhbFBhY2tldExvc3QgPiAwKSB7CisgICAgICAgIGZyYWN0aW9uID0gKGludGVydmFsUGFja2V0TG9zdCA8PCA4KSAvIGludGVydmFsRXhwZWN0ZWQ7CisgICAgfQorCisgICAgbVByZXZFeHBlY3RlZCA9IGV4cGVjdGVkOworICAgIG1QcmV2TnVtQnVmZmVyc1JlY2VpdmVkID0gbU51bUJ1ZmZlcnNSZWNlaXZlZDsKKyAgICBpbnQzMl90IGN1bXVsYXRpdmVQYWNrZXRMb3N0ID0gKGludDMyX3QpZXhwZWN0ZWQgLSBtTnVtQnVmZmVyc1JlY2VpdmVkOworCiAgICAgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5zaXplKCk7CiAKICAgICBkYXRhWzBdID0gMHg4MCB8IDE7CkBAIC0yNDIsMTEgKzI2MiwxMSBAQAogICAgIGRhdGFbMTBdID0gKG1JRCA+PiA4KSAmIDB4ZmY7CiAgICAgZGF0YVsxMV0gPSBtSUQgJiAweGZmOwogCi0gICAgZGF0YVsxMl0gPSAweDAwOyAgLy8gZnJhY3Rpb24gbG9zdAorICAgIGRhdGFbMTJdID0gZnJhY3Rpb247ICAvLyBmcmFjdGlvbiBsb3N0CiAKLSAgICBkYXRhWzEzXSA9IDB4MDA7ICAvLyBjdW11bGF0aXZlIGxvc3QKLSAgICBkYXRhWzE0XSA9IDB4MDA7Ci0gICAgZGF0YVsxNV0gPSAweDAwOworICAgIGRhdGFbMTNdID0gY3VtdWxhdGl2ZVBhY2tldExvc3QgPj4gMTY7ICAvLyBjdW11bGF0aXZlIGxvc3QKKyAgICBkYXRhWzE0XSA9IChjdW11bGF0aXZlUGFja2V0TG9zdCA+PiA4KSAmIDB4ZmY7CisgICAgZGF0YVsxNV0gPSBjdW11bGF0aXZlUGFja2V0TG9zdCAmIDB4ZmY7CiAKICAgICBkYXRhWzE2XSA9IG1IaWdoZXN0U2VxTnVtYmVyID4+IDI0OwogICAgIGRhdGFbMTddID0gKG1IaWdoZXN0U2VxTnVtYmVyID4+IDE2KSAmIDB4ZmY7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oCmluZGV4IGI3MGY5NGUuLmY0NGU4M2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oCkBAIC00OSw3ICs0OSwxMCBAQAogcHJpdmF0ZToKICAgICB1aW50MzJfdCBtSUQ7CiAgICAgdWludDMyX3QgbUhpZ2hlc3RTZXFOdW1iZXI7CisgICAgdWludDMyX3QgbVByZXZFeHBlY3RlZDsKKyAgICB1aW50MzJfdCBtQmFzZVNlcU51bWJlcjsKICAgICBpbnQzMl90IG1OdW1CdWZmZXJzUmVjZWl2ZWQ7CisgICAgaW50MzJfdCBtUHJldk51bUJ1ZmZlcnNSZWNlaXZlZDsKIAogICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPiBtUXVldWU7CiAgICAgc3A8QVJUUEFzc2VtYmxlcj4gbUFzc2VtYmxlcjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuY3BwCmluZGV4IDFmNmI2ZjcuLjA2NjdkZjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmNwcApAQCAtMjIsMTMgKzIyLDEzIEBACiAKICNpbmNsdWRlIDxmY250bC5oPgogCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDx1dGlscy9CeXRlT3JkZXIuaD4KIApAQCAtMTA0LDcgKzEwNCw3IEBACiAgICAgbUZkID0gLTE7CiB9CiAKLXN0YXR1c190IEFSVFBXcml0ZXI6OmFkZFNvdXJjZShjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKK3N0YXR1c190IEFSVFBXcml0ZXI6OmFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgewogICAgIG1Tb3VyY2UgPSBzb3VyY2U7CiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMTczLDcgKzE3Myw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0aWMgdm9pZCBTdHJpcFN0YXJ0Y29kZShNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7CitzdGF0aWMgdm9pZCBTdHJpcFN0YXJ0Y29kZShNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgewogICAgIGlmIChidWZmZXItPnJhbmdlX2xlbmd0aCgpIDwgNCkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTk1LDcgKzE5NSw3IEBACiAKICNpZiAwCiAgICAgICAgICAgICBpZiAobU1vZGUgPT0gSDI2NCkgewotICAgICAgICAgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXI7CisgICAgICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7CiAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobVNvdXJjZS0+cmVhZCgmYnVmZmVyKSwgKHN0YXR1c190KU9LKTsKIAogICAgICAgICAgICAgICAgIFN0cmlwU3RhcnRjb2RlKGJ1ZmZlcik7CkBAIC0yNjUsNyArMjY1LDcgQEAKIH0KIAogdm9pZCBBUlRQV3JpdGVyOjpvblJlYWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBNZWRpYUJ1ZmZlciAqbWVkaWFCdWY7CisgICAgTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1ZjsKICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5yZWFkKCZtZWRpYUJ1Zik7CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC01MjMsNyArNTIzLDcgQEAKICAgICBBTE9HSSgiJXMiLCBzZHAuY19zdHIoKSk7CiB9CiAKLXZvaWQgQVJUUFdyaXRlcjo6bWFrZUgyNjRTUHJvcFBhcmFtU2V0cyhNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7Cit2b2lkIEFSVFBXcml0ZXI6Om1ha2VIMjY0U1Byb3BQYXJhbVNldHMoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIHsKICAgICBzdGF0aWMgY29uc3QgY2hhciBrU3RhcnRDb2RlW10gPSAiXHgwMFx4MDBceDAwXHgwMSI7CiAKICAgICBjb25zdCB1aW50OF90ICpkYXRhID0KQEAgLTU2NywxMiArNTY3LDEyIEBACiAgICAgc2VuZChidWZmZXIsIHRydWUgLyogaXNSVENQICovKTsKIH0KIAotdm9pZCBBUlRQV3JpdGVyOjpzZW5kQVZDRGF0YShNZWRpYUJ1ZmZlciAqbWVkaWFCdWYpIHsKK3ZvaWQgQVJUUFdyaXRlcjo6c2VuZEFWQ0RhdGEoTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1ZikgewogICAgIC8vIDEyIGJ5dGVzIFJUUCBoZWFkZXIgKyAyIGJ5dGVzIGZvciB0aGUgRlUtaW5kaWNhdG9yIGFuZCBGVS1oZWFkZXIuCiAgICAgQ0hFQ0tfR0Uoa01heFBhY2tldFNpemUsIDEydSArIDJ1KTsKIAogICAgIGludDY0X3QgdGltZVVzOwotICAgIENIRUNLKG1lZGlhQnVmLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CisgICAgQ0hFQ0sobWVkaWFCdWYtPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwogCiAgICAgdWludDMyX3QgcnRwVGltZSA9IG1SVFBUaW1lQmFzZSArICh0aW1lVXMgKiA5IC8gMTAwbGwpOwogCkBAIC02NjMsMTEgKzY2MywxMSBAQAogICAgIG1MYXN0TlRQVGltZSA9IEdldE5vd05UUCgpOwogfQogCi12b2lkIEFSVFBXcml0ZXI6OnNlbmRIMjYzRGF0YShNZWRpYUJ1ZmZlciAqbWVkaWFCdWYpIHsKK3ZvaWQgQVJUUFdyaXRlcjo6c2VuZEgyNjNEYXRhKE1lZGlhQnVmZmVyQmFzZSAqbWVkaWFCdWYpIHsKICAgICBDSEVDS19HRShrTWF4UGFja2V0U2l6ZSwgMTJ1ICsgMnUpOwogCiAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgQ0hFQ0sobWVkaWFCdWYtPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKKyAgICBDSEVDSyhtZWRpYUJ1Zi0+bWV0YV9kYXRhKCkuZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CiAKICAgICB1aW50MzJfdCBydHBUaW1lID0gbVJUUFRpbWVCYXNlICsgKHRpbWVVcyAqIDkgLyAxMDBsbCk7CiAKQEAgLTc0MSw3ICs3NDEsNyBAQAogICAgIHJldHVybiBmcmFtZVNpemU7CiB9CiAKLXZvaWQgQVJUUFdyaXRlcjo6c2VuZEFNUkRhdGEoTWVkaWFCdWZmZXIgKm1lZGlhQnVmKSB7Cit2b2lkIEFSVFBXcml0ZXI6OnNlbmRBTVJEYXRhKE1lZGlhQnVmZmVyQmFzZSAqbWVkaWFCdWYpIHsKICAgICBjb25zdCB1aW50OF90ICptZWRpYURhdGEgPQogICAgICAgICAoY29uc3QgdWludDhfdCAqKW1lZGlhQnVmLT5kYXRhKCkgKyBtZWRpYUJ1Zi0+cmFuZ2Vfb2Zmc2V0KCk7CiAKQEAgLTc1Miw3ICs3NTIsNyBAQAogICAgIGNvbnN0IGJvb2wgaXNXaWRlID0gKG1Nb2RlID09IEFNUl9XQik7CiAKICAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBDSEVDSyhtZWRpYUJ1Zi0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOworICAgIENIRUNLKG1lZGlhQnVmLT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKICAgICB1aW50MzJfdCBydHBUaW1lID0gbVJUUFRpbWVCYXNlICsgKHRpbWVVcyAvIChpc1dpZGUgPyAyNTAgOiAxMjUpKTsKIAogICAgIC8vIGhleGR1bXAobWVkaWFEYXRhLCBtZWRpYUxlbmd0aCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5oCmluZGV4IDNjNzA0MmUuLjJmMTM0ODYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5oCkBAIC0zNyw3ICszNyw3IEBACiBzdHJ1Y3QgQVJUUFdyaXRlciA6IHB1YmxpYyBNZWRpYVdyaXRlciB7CiAgICAgZXhwbGljaXQgQVJUUFdyaXRlcihpbnQgZmQpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTb3VyY2UoY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CiAgICAgdmlydHVhbCBib29sIHJlYWNoZWRFT1MoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwpAQCAtNzIsNyArNzIsNyBAQAogICAgIGludCBtUlRDUEZkOwogI2VuZGlmCiAKLSAgICBzcDxJTWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CiAgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKICAgICBzcDxBSGFuZGxlclJlZmxlY3RvcjxBUlRQV3JpdGVyPiA+IG1SZWZsZWN0b3I7CiAKQEAgLTExMCwxMyArMTEwLDEzIEBACiAgICAgdm9pZCBhZGRTUihjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKICAgICB2b2lkIGFkZFNERVMoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CiAKLSAgICB2b2lkIG1ha2VIMjY0U1Byb3BQYXJhbVNldHMoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CisgICAgdm9pZCBtYWtlSDI2NFNQcm9wUGFyYW1TZXRzKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKTsKICAgICB2b2lkIGR1bXBTZXNzaW9uRGVzYygpOwogCiAgICAgdm9pZCBzZW5kQnllKCk7Ci0gICAgdm9pZCBzZW5kQVZDRGF0YShNZWRpYUJ1ZmZlciAqbWVkaWFCdWYpOwotICAgIHZvaWQgc2VuZEgyNjNEYXRhKE1lZGlhQnVmZmVyICptZWRpYUJ1Zik7Ci0gICAgdm9pZCBzZW5kQU1SRGF0YShNZWRpYUJ1ZmZlciAqbWVkaWFCdWYpOworICAgIHZvaWQgc2VuZEFWQ0RhdGEoTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1Zik7CisgICAgdm9pZCBzZW5kSDI2M0RhdGEoTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1Zik7CisgICAgdm9pZCBzZW5kQU1SRGF0YShNZWRpYUJ1ZmZlckJhc2UgKm1lZGlhQnVmKTsKIAogICAgIHZvaWQgc2VuZChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyLCBib29sIGlzUlRDUCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcAppbmRleCAwZjQ2YzgzLi5kNDU5Y2JkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwCkBAIC0yMiw4ICsyMiw4IEBACiAKICNpbmNsdWRlICJBU2Vzc2lvbkRlc2NyaXB0aW9uLmgiCiAKLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtMzYsNyArMzYsNyBAQAogU0RQTG9hZGVyOjpTRFBMb2FkZXIoCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAogICAgICAgICB1aW50MzJfdCBmbGFncywKLSAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSkKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKQogICAgIDogbU5vdGlmeShub3RpZnkpLAogICAgICAgbUZsYWdzKGZsYWdzKSwKICAgICAgIG1OZXRMb29wZXIobmV3IEFMb29wZXIpLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9WaWRlb1NvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9WaWRlb1NvdXJjZS5oCmluZGV4IGFlMGM4NWIuLjRiZTliZjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvVmlkZW9Tb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1ZpZGVvU291cmNlLmgKQEAgLTE4LDkgKzE4LDkgQEAKIAogI2RlZmluZSBWSURFT19TT1VSQ0VfSF8KIAorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9ydHBfdGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL3J0cF90ZXN0LmNwcAppbmRleCBlNjEyYThkLi40NTkwNjk5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL3J0cF90ZXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL3J0cF90ZXN0LmNwcApAQCAtMjAsMTIgKzIwLDExIEBACiAKICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuaD4KIAogI2luY2x1ZGUgIkFSVFBTZXNzaW9uLmgiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvQW5kcm9pZC5icAppbmRleCAzNTExOWMyLi5iZTEwZmRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTEsNDUgKzEsNiBAQAogLy8gQnVpbGQgdGhlIHVuaXQgdGVzdHMuCiAKIGNjX3Rlc3QgewotICAgIG5hbWU6ICJTdXJmYWNlTWVkaWFTb3VyY2VfdGVzdCIsCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJTdXJmYWNlTWVkaWFTb3VyY2VfdGVzdC5jcHAiLAotICAgICAgICAiRHVtbXlSZWNvcmRlci5jcHAiLAotICAgIF0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliRUdMIiwKLSAgICAgICAgImxpYkdMRVN2MiIsCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmd1aSIsCi0gICAgICAgICJsaWJtZWRpYSIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodCIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCi0gICAgICAgICJsaWJzeW5jIiwKLSAgICAgICAgImxpYnVpIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLQotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvaGFyZHdhcmUiLAotICAgIF0sCi0KLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1XZXJyb3IiLAotICAgICAgICAiLVdhbGwiLAotICAgIF0sCi0KLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAotfQotCi1jY190ZXN0IHsKICAgICBuYW1lOiAiTWVkaWFDb2RlY0xpc3RPdmVycmlkZXNfdGVzdCIsCiAKICAgICBzcmNzOiBbIk1lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzX3Rlc3QuY3BwIl0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9EdW1teVJlY29yZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0R1bW15UmVjb3JkZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjE3MDg4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0R1bW15UmVjb3JkZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRHVtbXlSZWNvcmRlciIKLS8vICNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSAiRHVtbXlSZWNvcmRlci5oIgotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gc3RhdGljCi12b2lkICpEdW1teVJlY29yZGVyOjp0aHJlYWRXcmFwcGVyKHZvaWQgKnB0aGlzKSB7Ci0gICAgQUxPR1YoIlRocmVhZFdyYXBwZXI6ICVwIiwgcHRoaXMpOwotICAgIER1bW15UmVjb3JkZXIgKndyaXRlciA9IHN0YXRpY19jYXN0PER1bW15UmVjb3JkZXIgKj4ocHRoaXMpOwotICAgIHdyaXRlci0+cmVhZEZyb21Tb3VyY2UoKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotCi1zdGF0dXNfdCBEdW1teVJlY29yZGVyOjpzdGFydCgpIHsKLSAgICBBTE9HVigiU3RhcnQiKTsKLSAgICBtU3RhcnRlZCA9IHRydWU7Ci0KLSAgICBtU291cmNlLT5zdGFydCgpOwotCi0gICAgcHRocmVhZF9hdHRyX3QgYXR0cjsKLSAgICBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7Ci0gICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSk7Ci0gICAgaW50IGVyciA9IHB0aHJlYWRfY3JlYXRlKCZtVGhyZWFkLCAmYXR0ciwgdGhyZWFkV3JhcHBlciwgdGhpcyk7Ci0gICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0dHIpOwotCi0gICAgaWYgKGVycikgewotICAgICAgICBBTE9HRSgiRXJyb3IgY3JlYXRpbmcgdGhyZWFkISIpOwotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi0KLXN0YXR1c190IER1bW15UmVjb3JkZXI6OnN0b3AoKSB7Ci0gICAgQUxPR1YoIlN0b3AiKTsKLSAgICBtU3RhcnRlZCA9IGZhbHNlOwotCi0gICAgbVNvdXJjZS0+c3RvcCgpOwotICAgIHZvaWQgKmR1bW15OwotICAgIHB0aHJlYWRfam9pbihtVGhyZWFkLCAmZHVtbXkpOwotICAgIHN0YXR1c190IGVyciA9IHN0YXRpY19jYXN0PHN0YXR1c190PihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oZHVtbXkpKTsKLQotICAgIEFMT0dWKCJFbmRpbmcgdGhlIHJlYWRpbmcgdGhyZWFkIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLy8gcHJldGVuZCB0byByZWFkIHRoZSBzb3VyY2UgYnVmZmVycwotdm9pZCBEdW1teVJlY29yZGVyOjpyZWFkRnJvbVNvdXJjZSgpIHsKLSAgICBBTE9HVigiUmVhZEZyb21Tb3VyY2UiKTsKLSAgICBpZiAoIW1TdGFydGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOwotICAgIEFMT0dWKCJBIGZha2Ugd3JpdGVyIGFjY2Vzc2luZyB0aGUgZnJhbWVzIik7Ci0gICAgd2hpbGUgKG1TdGFydGVkICYmIChlcnIgPSBtU291cmNlLT5yZWFkKCZidWZmZXIpKSA9PSBPSyl7Ci0gICAgICAgIC8vIGlmIG5vdCBnZXR0aW5nIGEgdmFsaWQgYnVmZmVyIGZyb20gc291cmNlLCB0aGVuIGV4aXQKLSAgICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIGJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotfQotCi0KLX0gLy8gZW5kIG9mIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9EdW1teVJlY29yZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9EdW1teVJlY29yZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NTk3NzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRHVtbXlSZWNvcmRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgRFVNTVlfUkVDT1JERVJfSF8KLSNkZWZpbmUgRFVNTVlfUkVDT1JERVJfSF8KLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IE1lZGlhU291cmNlOwotY2xhc3MgTWVkaWFCdWZmZXI7Ci0KLWNsYXNzIER1bW15UmVjb3JkZXIgewotICAgIHB1YmxpYzoKLSAgICAvLyBUaGUgbWVkaWEgc291cmNlIGZyb20gd2hpY2ggdGhpcyB3aWxsIHJlY2VpdmUgZnJhbWVzCi0gICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7Ci0gICAgYm9vbCBtU3RhcnRlZDsKLSAgICBwdGhyZWFkX3QgbVRocmVhZDsKLQotICAgIHN0YXR1c190IHN0YXJ0KCk7Ci0gICAgc3RhdHVzX3Qgc3RvcCgpOwotCi0gICAgLy8gYWN0dWFsIGVudHJ5IHBvaW50IGZvciB0aGUgdGhyZWFkCi0gICAgdm9pZCByZWFkRnJvbVNvdXJjZSgpOwotCi0gICAgLy8gc3RhdGljIGZ1bmN0aW9uIHRvIHdyYXAgdGhlIGFjdHVhbCB0aHJlYWQgZW50cnkgcG9pbnQKLSAgICBzdGF0aWMgdm9pZCAqdGhyZWFkV3JhcHBlcih2b2lkICpwdGhpcyk7Ci0KLSAgICBleHBsaWNpdCBEdW1teVJlY29yZGVyKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKSA6IG1Tb3VyY2Uoc291cmNlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgbVN0YXJ0ZWQoZmFsc2UpIHt9Ci0gICAgfkR1bW15UmVjb3JkZXIoICkge30KLQotICAgIHByaXZhdGU6Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEdW1teVJlY29yZGVyKTsKLX07Ci0KLX0gLy8gZW5kIG9mIG5hbWVzcGFjZSBhbmRyb2lkCi0jZW5kaWYKLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9TdXJmYWNlTWVkaWFTb3VyY2VfdGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9TdXJmYWNlTWVkaWFTb3VyY2VfdGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNDY0ZmYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvU3VyZmFjZU1lZGlhU291cmNlX3Rlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIlN1cmZhY2VNZWRpYVNvdXJjZV90ZXN0IgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8R0xFUzIvZ2wyLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+Ci0KLSNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KLSNpbmNsdWRlIDxndWkvSVN1cmZhY2VDb21wb3Nlci5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5oPgotCi0jaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+Ci0KLSNpbmNsdWRlICJEdW1teVJlY29yZGVyLmgiCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBHTFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLXByb3RlY3RlZDoKLQotICAgIEdMVGVzdCgpOgotICAgICAgICAgICAgbUVnbERpc3BsYXkoRUdMX05PX0RJU1BMQVkpLAotICAgICAgICAgICAgbUVnbFN1cmZhY2UoRUdMX05PX1NVUkZBQ0UpLAotICAgICAgICAgICAgbUVnbENvbnRleHQoRUdMX05PX0NPTlRFWFQpIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgICAgIEFMT0dWKCJHTFRlc3Q6OlNldFVwKCkiKTsKLSAgICAgICAgbUVnbERpc3BsYXkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOwotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgICAgICBBU1NFUlRfTkUoRUdMX05PX0RJU1BMQVksIG1FZ2xEaXNwbGF5KTsKLQotICAgICAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOwotICAgICAgICBFR0xpbnQgbWlub3JWZXJzaW9uOwotICAgICAgICBFWFBFQ1RfVFJVRShlZ2xJbml0aWFsaXplKG1FZ2xEaXNwbGF5LCAmbWFqb3JWZXJzaW9uLCAmbWlub3JWZXJzaW9uKSk7Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgICAgIFJlY29yZFByb3BlcnR5KCJFZ2xWZXJzaW9uTWFqb3IiLCBtYWpvclZlcnNpb24pOwotICAgICAgICBSZWNvcmRQcm9wZXJ0eSgiRWdsVmVyc2lvbk1ham9yIiwgbWlub3JWZXJzaW9uKTsKLQotICAgICAgICBFR0xpbnQgbnVtQ29uZmlncyA9IDA7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGVnbENob29zZUNvbmZpZyhtRWdsRGlzcGxheSwgZ2V0Q29uZmlnQXR0cmlicygpLCAmbUdsQ29uZmlnLAotICAgICAgICAgICAgICAgIDEsICZudW1Db25maWdzKSk7Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0KLSAgICAgICAgY2hhciogZGlzcGxheVNlY3NFbnYgPSBnZXRlbnYoIkdMVEVTVF9ESVNQTEFZX1NFQ1MiKTsKLSAgICAgICAgaWYgKGRpc3BsYXlTZWNzRW52ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1EaXNwbGF5U2VjcyA9IGF0b2koZGlzcGxheVNlY3NFbnYpOwotICAgICAgICAgICAgaWYgKG1EaXNwbGF5U2VjcyA8IDApIHsKLSAgICAgICAgICAgICAgICBtRGlzcGxheVNlY3MgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbURpc3BsYXlTZWNzID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtRGlzcGxheVNlY3MgPiAwKSB7Ci0gICAgICAgICAgICBtQ29tcG9zZXJDbGllbnQgPSBuZXcgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OwotICAgICAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQ29tcG9zZXJDbGllbnQtPmluaXRDaGVjaygpKTsKLQotICAgICAgICAgICAgbVN1cmZhY2VDb250cm9sID0gbUNvbXBvc2VyQ2xpZW50LT5jcmVhdGVTdXJmYWNlKAotICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCJUZXN0IFN1cmZhY2UiKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0U3VyZmFjZVdpZHRoKCksIGdldFN1cmZhY2VIZWlnaHQoKSwKLSAgICAgICAgICAgICAgICAgICAgUElYRUxfRk9STUFUX1JHQl84ODgsIDApOwotCi0gICAgICAgICAgICBBU1NFUlRfVFJVRShtU3VyZmFjZUNvbnRyb2wgIT0gTlVMTCk7Ci0gICAgICAgICAgICBBU1NFUlRfVFJVRShtU3VyZmFjZUNvbnRyb2wtPmlzVmFsaWQoKSk7Ci0KLSAgICAgICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6b3Blbkdsb2JhbFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1TdXJmYWNlQ29udHJvbC0+c2V0TGF5ZXIoMHg3RkZGRkZGRikpOwotICAgICAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtU3VyZmFjZUNvbnRyb2wtPnNob3coKSk7Ci0gICAgICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmNsb3NlR2xvYmFsVHJhbnNhY3Rpb24oKTsKLQotICAgICAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gd2luZG93ID0gbVN1cmZhY2VDb250cm9sLT5nZXRTdXJmYWNlKCk7Ci0gICAgICAgICAgICBtRWdsU3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UobUVnbERpc3BsYXksIG1HbENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgd2luZG93LmdldCgpLCBOVUxMKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dWKCJObyBhY3R1YWwgZGlzcGxheS4gQ2hvb3NpbmcgRUdMU3VyZmFjZSBiYXNlZCBvbiBTdXJmYWNlTWVkaWFTb3VyY2UiKTsKLSAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHNtcyA9IChuZXcgU3VyZmFjZU1lZGlhU291cmNlKAotICAgICAgICAgICAgICAgICAgICBnZXRTdXJmYWNlV2lkdGgoKSwgZ2V0U3VyZmFjZUhlaWdodCgpKSktPmdldFByb2R1Y2VyKCk7Ci0gICAgICAgICAgICBzcDxTdXJmYWNlPiBzdGMgPSBuZXcgU3VyZmFjZShzbXMpOwotICAgICAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gd2luZG93ID0gc3RjOwotCi0gICAgICAgICAgICBtRWdsU3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UobUVnbERpc3BsYXksIG1HbENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgd2luZG93LmdldCgpLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgICAgICBBU1NFUlRfTkUoRUdMX05PX1NVUkZBQ0UsIG1FZ2xTdXJmYWNlKTsKLQotICAgICAgICBtRWdsQ29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQobUVnbERpc3BsYXksIG1HbENvbmZpZywgRUdMX05PX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgZ2V0Q29udGV4dEF0dHJpYnMoKSk7Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgICAgIEFTU0VSVF9ORShFR0xfTk9fQ09OVEVYVCwgbUVnbENvbnRleHQpOwotCi0gICAgICAgIEVYUEVDVF9UUlVFKGVnbE1ha2VDdXJyZW50KG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSwgbUVnbFN1cmZhY2UsCi0gICAgICAgICAgICAgICAgbUVnbENvbnRleHQpKTsKLSAgICAgICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLQotICAgICAgICBFR0xpbnQgdywgaDsKLSAgICAgICAgRVhQRUNUX1RSVUUoZWdsUXVlcnlTdXJmYWNlKG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSwgRUdMX1dJRFRILCAmdykpOwotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgICAgICBFWFBFQ1RfVFJVRShlZ2xRdWVyeVN1cmZhY2UobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlLCBFR0xfSEVJR0hULCAmaCkpOwotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgICAgICBSZWNvcmRQcm9wZXJ0eSgiRWdsU3VyZmFjZVdpZHRoIiwgdyk7Ci0gICAgICAgIFJlY29yZFByb3BlcnR5KCJFZ2xTdXJmYWNlSGVpZ2h0IiwgaCk7Ci0KLSAgICAgICAgZ2xWaWV3cG9ydCgwLCAwLCB3LCBoKTsKLSAgICAgICAgQVNTRVJUX0VRKEdMZW51bShHTF9OT19FUlJPUiksIGdsR2V0RXJyb3IoKSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgICAgICAvLyBEaXNwbGF5IHRoZSByZXN1bHQKLSAgICAgICAgaWYgKG1EaXNwbGF5U2VjcyA+IDAgJiYgbUVnbFN1cmZhY2UgIT0gRUdMX05PX1NVUkZBQ0UpIHsKLSAgICAgICAgICAgIGVnbFN3YXBCdWZmZXJzKG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSk7Ci0gICAgICAgICAgICBzbGVlcChtRGlzcGxheVNlY3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1Db21wb3NlckNsaWVudCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtQ29tcG9zZXJDbGllbnQtPmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUVnbENvbnRleHQgIT0gRUdMX05PX0NPTlRFWFQpIHsKLSAgICAgICAgICAgIGVnbERlc3Ryb3lDb250ZXh0KG1FZ2xEaXNwbGF5LCBtRWdsQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1FZ2xTdXJmYWNlICE9IEVHTF9OT19TVVJGQUNFKSB7Ci0gICAgICAgICAgICBlZ2xEZXN0cm95U3VyZmFjZShtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRWdsRGlzcGxheSAhPSBFR0xfTk9fRElTUExBWSkgewotICAgICAgICAgICAgZWdsVGVybWluYXRlKG1FZ2xEaXNwbGF5KTsKLSAgICAgICAgfQotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgRUdMaW50IGNvbnN0KiBnZXRDb25maWdBdHRyaWJzKCkgewotICAgICAgICBBTE9HVigiR0xUZXN0IGdldENvbmZpZ0F0dHJpYnMiKTsKLSAgICAgICAgc3RhdGljIEVHTGludCBzRGVmYXVsdENvbmZpZ0F0dHJpYnNbXSA9IHsKLSAgICAgICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsIEVHTF9QQlVGRkVSX0JJVCwKLSAgICAgICAgICAgIEVHTF9SRU5ERVJBQkxFX1RZUEUsIEVHTF9PUEVOR0xfRVMyX0JJVCwKLSAgICAgICAgICAgIEVHTF9SRURfU0laRSwgOCwKLSAgICAgICAgICAgIEVHTF9HUkVFTl9TSVpFLCA4LAotICAgICAgICAgICAgRUdMX0JMVUVfU0laRSwgOCwKLSAgICAgICAgICAgIEVHTF9BTFBIQV9TSVpFLCA4LAotICAgICAgICAgICAgRUdMX0RFUFRIX1NJWkUsIDE2LAotICAgICAgICAgICAgRUdMX1NURU5DSUxfU0laRSwgOCwKLSAgICAgICAgICAgIEVHTF9OT05FIH07Ci0KLSAgICAgICAgcmV0dXJuIHNEZWZhdWx0Q29uZmlnQXR0cmliczsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIEVHTGludCBjb25zdCogZ2V0Q29udGV4dEF0dHJpYnMoKSB7Ci0gICAgICAgIHN0YXRpYyBFR0xpbnQgc0RlZmF1bHRDb250ZXh0QXR0cmlic1tdID0gewotICAgICAgICAgICAgRUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04sIDIsCi0gICAgICAgICAgICBFR0xfTk9ORSB9OwotCi0gICAgICAgIHJldHVybiBzRGVmYXVsdENvbnRleHRBdHRyaWJzOwotICAgIH0KLQotICAgIHZpcnR1YWwgRUdMaW50IGdldFN1cmZhY2VXaWR0aCgpIHsKLSAgICAgICAgcmV0dXJuIDUxMjsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIEVHTGludCBnZXRTdXJmYWNlSGVpZ2h0KCkgewotICAgICAgICByZXR1cm4gNTEyOwotICAgIH0KLQotICAgIHZvaWQgbG9hZFNoYWRlcihHTGVudW0gc2hhZGVyVHlwZSwgY29uc3QgY2hhciogcFNvdXJjZSwgR0x1aW50KiBvdXRTaGFkZXIpIHsKLSAgICAgICAgR0x1aW50IHNoYWRlciA9IGdsQ3JlYXRlU2hhZGVyKHNoYWRlclR5cGUpOwotICAgICAgICBBU1NFUlRfRVEoR0xlbnVtKEdMX05PX0VSUk9SKSwgZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgaWYgKHNoYWRlcikgewotICAgICAgICAgICAgZ2xTaGFkZXJTb3VyY2Uoc2hhZGVyLCAxLCAmcFNvdXJjZSwgTlVMTCk7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoR0xlbnVtKEdMX05PX0VSUk9SKSwgZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgICAgIGdsQ29tcGlsZVNoYWRlcihzaGFkZXIpOwotICAgICAgICAgICAgQVNTRVJUX0VRKEdMZW51bShHTF9OT19FUlJPUiksIGdsR2V0RXJyb3IoKSk7Ci0gICAgICAgICAgICBHTGludCBjb21waWxlZCA9IDA7Ci0gICAgICAgICAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfQ09NUElMRV9TVEFUVVMsICZjb21waWxlZCk7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoR0xlbnVtKEdMX05PX0VSUk9SKSwgZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgICAgIGlmICghY29tcGlsZWQpIHsKLSAgICAgICAgICAgICAgICBHTGludCBpbmZvTGVuID0gMDsKLSAgICAgICAgICAgICAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfSU5GT19MT0dfTEVOR1RILCAmaW5mb0xlbik7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX0VRKEdMZW51bShHTF9OT19FUlJPUiksIGdsR2V0RXJyb3IoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGluZm9MZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciogYnVmID0gKGNoYXIqKSBtYWxsb2MoaW5mb0xlbik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChidWYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdsR2V0U2hhZGVySW5mb0xvZyhzaGFkZXIsIGluZm9MZW4sIE5VTEwsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlNoYWRlciBjb21waWxlIGxvZzpcbiVzXG4iLCBidWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShidWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgRkFJTCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciogYnVmID0gKGNoYXIqKSBtYWxsb2MoMHgxMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZikgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2xHZXRTaGFkZXJJbmZvTG9nKHNoYWRlciwgMHgxMDAwLCBOVUxMLCBidWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJTaGFkZXIgY29tcGlsZSBsb2c6XG4lc1xuIiwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZBSUwoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBnbERlbGV0ZVNoYWRlcihzaGFkZXIpOwotICAgICAgICAgICAgICAgIHNoYWRlciA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQVNTRVJUX1RSVUUoc2hhZGVyICE9IDApOwotICAgICAgICAqb3V0U2hhZGVyID0gc2hhZGVyOwotICAgIH0KLQotICAgIHZvaWQgY3JlYXRlUHJvZ3JhbShjb25zdCBjaGFyKiBwVmVydGV4U291cmNlLCBjb25zdCBjaGFyKiBwRnJhZ21lbnRTb3VyY2UsCi0gICAgICAgICAgICBHTHVpbnQqIG91dFBnbSkgewotICAgICAgICBHTHVpbnQgdmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlcjsKLSAgICAgICAgewotICAgICAgICAgICAgU0NPUEVEX1RSQUNFKCJjb21waWxpbmcgdmVydGV4IHNoYWRlciIpOwotICAgICAgICAgICAgbG9hZFNoYWRlcihHTF9WRVJURVhfU0hBREVSLCBwVmVydGV4U291cmNlLCAmdmVydGV4U2hhZGVyKTsKLSAgICAgICAgICAgIGlmIChIYXNGYXRhbEZhaWx1cmUoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB7Ci0gICAgICAgICAgICBTQ09QRURfVFJBQ0UoImNvbXBpbGluZyBmcmFnbWVudCBzaGFkZXIiKTsKLSAgICAgICAgICAgIGxvYWRTaGFkZXIoR0xfRlJBR01FTlRfU0hBREVSLCBwRnJhZ21lbnRTb3VyY2UsICZmcmFnbWVudFNoYWRlcik7Ci0gICAgICAgICAgICBpZiAoSGFzRmF0YWxGYWlsdXJlKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBHTHVpbnQgcHJvZ3JhbSA9IGdsQ3JlYXRlUHJvZ3JhbSgpOwotICAgICAgICBBU1NFUlRfRVEoR0xlbnVtKEdMX05PX0VSUk9SKSwgZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgaWYgKHByb2dyYW0pIHsKLSAgICAgICAgICAgIGdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIHZlcnRleFNoYWRlcik7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoR0xlbnVtKEdMX05PX0VSUk9SKSwgZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgICAgIGdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIGZyYWdtZW50U2hhZGVyKTsKLSAgICAgICAgICAgIEFTU0VSVF9FUShHTGVudW0oR0xfTk9fRVJST1IpLCBnbEdldEVycm9yKCkpOwotICAgICAgICAgICAgZ2xMaW5rUHJvZ3JhbShwcm9ncmFtKTsKLSAgICAgICAgICAgIEdMaW50IGxpbmtTdGF0dXMgPSBHTF9GQUxTRTsKLSAgICAgICAgICAgIGdsR2V0UHJvZ3JhbWl2KHByb2dyYW0sIEdMX0xJTktfU1RBVFVTLCAmbGlua1N0YXR1cyk7Ci0gICAgICAgICAgICBpZiAobGlua1N0YXR1cyAhPSBHTF9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgR0xpbnQgYnVmTGVuZ3RoID0gMDsKLSAgICAgICAgICAgICAgICBnbEdldFByb2dyYW1pdihwcm9ncmFtLCBHTF9JTkZPX0xPR19MRU5HVEgsICZidWZMZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmIChidWZMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciogYnVmID0gKGNoYXIqKSBtYWxsb2MoYnVmTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZikgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2xHZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtLCBidWZMZW5ndGgsIE5VTEwsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlByb2dyYW0gbGluayBsb2c6XG4lc1xuIiwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZBSUwoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBnbERlbGV0ZVByb2dyYW0ocHJvZ3JhbSk7Ci0gICAgICAgICAgICAgICAgcHJvZ3JhbSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZ2xEZWxldGVTaGFkZXIodmVydGV4U2hhZGVyKTsKLSAgICAgICAgZ2xEZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOwotICAgICAgICBBU1NFUlRfVFJVRShwcm9ncmFtICE9IDApOwotICAgICAgICAqb3V0UGdtID0gcHJvZ3JhbTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgaW50IGFicyhpbnQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlID4gMCA/IHZhbHVlIDogLXZhbHVlOwotICAgIH0KLQotICAgIDo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IGNoZWNrUGl4ZWwoaW50IHgsIGludCB5LCBpbnQgciwKLSAgICAgICAgICAgIGludCBnLCBpbnQgYiwgaW50IGEsIGludCB0b2xlcmFuY2U9MikgewotICAgICAgICBHTHVieXRlIHBpeGVsWzRdOwotICAgICAgICBTdHJpbmc4IG1zZzsKLSAgICAgICAgZ2xSZWFkUGl4ZWxzKHgsIHksIDEsIDEsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIHBpeGVsKTsKLSAgICAgICAgR0xlbnVtIGVyciA9IGdsR2V0RXJyb3IoKTsKLSAgICAgICAgaWYgKGVyciAhPSBHTF9OT19FUlJPUikgewotICAgICAgICAgICAgbXNnICs9IFN0cmluZzg6OmZvcm1hdCgiZXJyb3IgcmVhZGluZyBwaXhlbDogJSN4IiwgZXJyKTsKLSAgICAgICAgICAgIHdoaWxlICgoZXJyID0gZ2xHZXRFcnJvcigpKSAhPSBHTF9OT19FUlJPUikgewotICAgICAgICAgICAgICAgIG1zZyArPSBTdHJpbmc4Ojpmb3JtYXQoIiwgJSN4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicGl4ZWwgY2hlY2sgZmFpbHVyZTogJXNcbiIsIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKAotICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6Ok1lc3NhZ2UobXNnLnN0cmluZygpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHIgPj0gMCAmJiBhYnMociAtIGludChwaXhlbFswXSkpID4gdG9sZXJhbmNlKSB7Ci0gICAgICAgICAgICBtc2cgKz0gU3RyaW5nODo6Zm9ybWF0KCJyKCVkIGlzbid0ICVkKSIsIHBpeGVsWzBdLCByKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZyA+PSAwICYmIGFicyhnIC0gaW50KHBpeGVsWzFdKSkgPiB0b2xlcmFuY2UpIHsKLSAgICAgICAgICAgIGlmICghbXNnLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1zZyArPSAiICI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtc2cgKz0gU3RyaW5nODo6Zm9ybWF0KCJnKCVkIGlzbid0ICVkKSIsIHBpeGVsWzFdLCBnKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYiA+PSAwICYmIGFicyhiIC0gaW50KHBpeGVsWzJdKSkgPiB0b2xlcmFuY2UpIHsKLSAgICAgICAgICAgIGlmICghbXNnLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1zZyArPSAiICI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtc2cgKz0gU3RyaW5nODo6Zm9ybWF0KCJiKCVkIGlzbid0ICVkKSIsIHBpeGVsWzJdLCBiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYSA+PSAwICYmIGFicyhhIC0gaW50KHBpeGVsWzNdKSkgPiB0b2xlcmFuY2UpIHsKLSAgICAgICAgICAgIGlmICghbXNnLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1zZyArPSAiICI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtc2cgKz0gU3RyaW5nODo6Zm9ybWF0KCJhKCVkIGlzbid0ICVkKSIsIHBpeGVsWzNdLCBhKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1zZy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicGl4ZWwgY2hlY2sgZmFpbHVyZTogJXNcbiIsIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKAotICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6Ok1lc3NhZ2UobXNnLnN0cmluZygpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQgbURpc3BsYXlTZWNzOwotICAgIHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4gbUNvbXBvc2VyQ2xpZW50OwotICAgIHNwPFN1cmZhY2VDb250cm9sPiBtU3VyZmFjZUNvbnRyb2w7Ci0KLSAgICBFR0xEaXNwbGF5IG1FZ2xEaXNwbGF5OwotICAgIEVHTFN1cmZhY2UgbUVnbFN1cmZhY2U7Ci0gICAgRUdMQ29udGV4dCBtRWdsQ29udGV4dDsKLSAgICBFR0xDb25maWcgIG1HbENvbmZpZzsKLX07Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyAgICBDbGFzcyBmb3IgIHRoZSBOT04tR0wgdGVzdHMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1jbGFzcyBTdXJmYWNlTWVkaWFTb3VyY2VUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci1wdWJsaWM6Ci0KLSAgICBTdXJmYWNlTWVkaWFTb3VyY2VUZXN0KCApOiBtWXV2VGV4V2lkdGgoMTc2KSwgbVl1dlRleEhlaWdodCgxNDQpIHsgfQotICAgIHZvaWQgb25lQnVmZmVyUGFzcyhpbnQgd2lkdGgsIGludCBoZWlnaHQgKTsKLSAgICB2b2lkIG9uZUJ1ZmZlclBhc3NOb0ZpbGwoaW50IHdpZHRoLCBpbnQgaGVpZ2h0ICk7Ci0gICAgc3RhdGljIHZvaWQgZmlsbFlWMTJCdWZmZXIodWludDhfdCogYnVmLCBpbnQgdywgaW50IGgsIGludCBzdHJpZGUpIDsKLSAgICBzdGF0aWMgdm9pZCBmaWxsWVYxMkJ1ZmZlclJlY3QodWludDhfdCogYnVmLCBpbnQgdywgaW50IGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBjb25zdCBhbmRyb2lkX25hdGl2ZV9yZWN0X3QmIHJlY3QpIDsKLXByb3RlY3RlZDoKLQotICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICAgICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwotICAgICAgICBtU01TID0gbmV3IFN1cmZhY2VNZWRpYVNvdXJjZShtWXV2VGV4V2lkdGgsIG1ZdXZUZXhIZWlnaHQpOwotICAgICAgICBtU1RDID0gbmV3IFN1cmZhY2UobVNNUy0+Z2V0UHJvZHVjZXIoKSk7Ci0gICAgICAgIG1BTlcgPSBtU1RDOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICAgICAgbVNNUy5jbGVhcigpOwotICAgICAgICBtU1RDLmNsZWFyKCk7Ci0gICAgICAgIG1BTlcuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBjb25zdCBpbnQgbVl1dlRleFdpZHRoOwotICAgIGNvbnN0IGludCBtWXV2VGV4SGVpZ2h0OwotCi0gICAgc3A8U3VyZmFjZU1lZGlhU291cmNlPiBtU01TOwotICAgIHNwPFN1cmZhY2U+IG1TVEM7Ci0gICAgc3A8QU5hdGl2ZVdpbmRvdz4gbUFOVzsKLX07Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyAgICBDbGFzcyBmb3IgIHRoZSBHTCB0ZXN0cwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLWNsYXNzIFN1cmZhY2VNZWRpYVNvdXJjZUdMVGVzdCA6IHB1YmxpYyBHTFRlc3QgewotcHVibGljOgotCi0gICAgU3VyZmFjZU1lZGlhU291cmNlR0xUZXN0KCApOiBtWXV2VGV4V2lkdGgoMTc2KSwgbVl1dlRleEhlaWdodCgxNDQpIHsgfQotICAgIHZpcnR1YWwgRUdMaW50IGNvbnN0KiBnZXRDb25maWdBdHRyaWJzKCk7Ci0gICAgdm9pZCBvbmVCdWZmZXJQYXNzR0woaW50IG51bSA9IDApOwotICAgIHN0YXRpYyBzcDxNZWRpYVJlY29yZGVyPiBzZXRVcE1lZGlhUmVjb3JkZXIoaW50IGZpbGVEZXNjcmlwdG9yLCBpbnQgdmlkZW9Tb3VyY2UsCi0gICAgICAgIGludCBvdXRwdXRGb3JtYXQsIGludCB2aWRlb0VuY29kZXIsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZwcyk7Ci1wcm90ZWN0ZWQ6Ci0KLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgICAgIEFMT0dWKCJTTVMtR0xUZXN0OjpTZXRVcCgpIik7Ci0gICAgICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKLSAgICAgICAgbVNNUyA9IG5ldyBTdXJmYWNlTWVkaWFTb3VyY2UobVl1dlRleFdpZHRoLCBtWXV2VGV4SGVpZ2h0KTsKLSAgICAgICAgbVNUQyA9IG5ldyBTdXJmYWNlKG1TTVMtPmdldFByb2R1Y2VyKCkpOwotICAgICAgICBtQU5XID0gbVNUQzsKLQotICAgICAgICAvLyBEb2luZyB0aGUgc2V0dXAgcmVsYXRlZCB0byB0aGUgR0wgU2lkZQotICAgICAgICBHTFRlc3Q6OlNldFVwKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgICAgICBtU01TLmNsZWFyKCk7Ci0gICAgICAgIG1TVEMuY2xlYXIoKTsKLSAgICAgICAgbUFOVy5jbGVhcigpOwotICAgICAgICBHTFRlc3Q6OlRlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRVcEVHTFN1cmZhY2VGcm9tTWVkaWFSZWNvcmRlcihzcDxNZWRpYVJlY29yZGVyPiYgbXIpOwotCi0gICAgY29uc3QgaW50IG1ZdXZUZXhXaWR0aDsKLSAgICBjb25zdCBpbnQgbVl1dlRleEhlaWdodDsKLQotICAgIHNwPFN1cmZhY2VNZWRpYVNvdXJjZT4gbVNNUzsKLSAgICBzcDxTdXJmYWNlPiBtU1RDOwotICAgIHNwPEFOYXRpdmVXaW5kb3c+IG1BTlc7Ci19OwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIE1ldGhvZHMgaW4gU3VyZmFjZU1lZGlhU291cmNlR0xUZXN0Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLUVHTGludCBjb25zdCogU3VyZmFjZU1lZGlhU291cmNlR0xUZXN0OjpnZXRDb25maWdBdHRyaWJzKCkgewotICAgICAgICBBTE9HVigiU3VyZmFjZU1lZGlhU291cmNlR0xUZXN0IGdldENvbmZpZ0F0dHJpYnMiKTsKLSAgICBzdGF0aWMgRUdMaW50IHNEZWZhdWx0Q29uZmlnQXR0cmlic1tdID0gewotICAgICAgICBFR0xfU1VSRkFDRV9UWVBFLCBFR0xfV0lORE9XX0JJVCwKLSAgICAgICAgRUdMX1JFTkRFUkFCTEVfVFlQRSwgRUdMX09QRU5HTF9FUzJfQklULAotICAgICAgICBFR0xfUkVEX1NJWkUsIDgsCi0gICAgICAgIEVHTF9HUkVFTl9TSVpFLCA4LAotICAgICAgICBFR0xfQkxVRV9TSVpFLCA4LAotICAgICAgICBFR0xfUkVDT1JEQUJMRV9BTkRST0lELCBFR0xfVFJVRSwKLSAgICAgICAgRUdMX05PTkUgfTsKLQotICAgIHJldHVybiBzRGVmYXVsdENvbmZpZ0F0dHJpYnM7Ci19Ci0KLS8vIE9uZSBwYXNzIG9mIGRlcXVldWluZyBhbmQgcXVldWluZyBhIEdMQnVmZmVyCi12b2lkIFN1cmZhY2VNZWRpYVNvdXJjZUdMVGVzdDo6b25lQnVmZmVyUGFzc0dMKGludCBudW0pIHsKLSAgICBpbnQgZCA9IG51bSAlIDUwOwotICAgIGZsb2F0IGYgPSAwLjJmOyAvLyAwLjFmICogZDsKLQotICAgIGdsQ2xlYXJDb2xvcigwLCAwLjMsIDAsIDAuNik7Ci0gICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLQotICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci0gICAgZ2xTY2lzc29yKDQgKyBkLCA0ICsgZCwgNCwgNCk7Ci0gICAgZ2xDbGVhckNvbG9yKDEuMCAtIGYsIGYsIGYsIDEuMCk7Ci0gICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLQotICAgIGdsU2Npc3NvcigyNCArIGQsIDQ4ICsgZCwgNCwgNCk7Ci0gICAgZ2xDbGVhckNvbG9yKGYsIDEuMCAtIGYsIGYsIDEuMCk7Ci0gICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLQotICAgIGdsU2Npc3NvcigzNyArIGQsIDE3ICsgZCwgNCwgNCk7Ci0gICAgZ2xDbGVhckNvbG9yKGYsIGYsIDEuMCAtIGYsIDEuMCk7Ci0gICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLQotICAgIC8vIFRoZSBmb2xsb3dpbmcgY2FsbCBkZXF1ZXVlcyBhbmQgcXVldWVzIHRoZSBidWZmZXIKLSAgICBlZ2xTd2FwQnVmZmVycyhtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpOwotICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgZ2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci19Ci0KLS8vIFNldCB1cCB0aGUgTWVkaWFSZWNvcmRlciB3aGljaCBydW5zIGluIHRoZSBzYW1lIHByb2Nlc3MgYXMgbWVkaWFzZXJ2ZXIKLXNwPE1lZGlhUmVjb3JkZXI+IFN1cmZhY2VNZWRpYVNvdXJjZUdMVGVzdDo6c2V0VXBNZWRpYVJlY29yZGVyKGludCBmZCwgaW50IHZpZGVvU291cmNlLAotICAgICAgICBpbnQgb3V0cHV0Rm9ybWF0LCBpbnQgdmlkZW9FbmNvZGVyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmcHMpIHsKLSAgICBzcDxNZWRpYVJlY29yZGVyPiBtciA9IG5ldyBNZWRpYVJlY29yZGVyKFN0cmluZzE2KCkpOwotICAgIG1yLT5zZXRWaWRlb1NvdXJjZSh2aWRlb1NvdXJjZSk7Ci0gICAgbXItPnNldE91dHB1dEZvcm1hdChvdXRwdXRGb3JtYXQpOwotICAgIG1yLT5zZXRWaWRlb0VuY29kZXIodmlkZW9FbmNvZGVyKTsKLSAgICBtci0+c2V0T3V0cHV0RmlsZShmZCk7Ci0gICAgbXItPnNldFZpZGVvU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKLSAgICBtci0+c2V0VmlkZW9GcmFtZVJhdGUoZnBzKTsKLSAgICBtci0+cHJlcGFyZSgpOwotICAgIEFMT0dWKCJTdGFydGluZyBNZWRpYVJlY29yZGVyLi4uIik7Ci0gICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBtci0+c3RhcnQoKSk7Ci0gICAgcmV0dXJuIG1yOwotfQotCi0vLyBxdWVyeSB0aGUgbWVkaWFyZWNvcmRlciBmb3IgYSBzdXJmYWNlbWVpZGFzb3VyY2UgYW5kIGNyZWF0ZSBhbiBlZ2wgc3VyZmFjZSB3aXRoIHRoYXQKLXZvaWQgU3VyZmFjZU1lZGlhU291cmNlR0xUZXN0OjpzZXRVcEVHTFN1cmZhY2VGcm9tTWVkaWFSZWNvcmRlcihzcDxNZWRpYVJlY29yZGVyPiYgbXIpIHsKLSAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBpU1QgPSBtci0+cXVlcnlTdXJmYWNlTWVkaWFTb3VyY2VGcm9tTWVkaWFTZXJ2ZXIoKTsKLSAgICBtU1RDID0gbmV3IFN1cmZhY2UoaVNUKTsKLSAgICBtQU5XID0gbVNUQzsKLQotICAgIGlmIChtRWdsU3VyZmFjZSAhPSBFR0xfTk9fU1VSRkFDRSkgewotICAgICAgICBFWFBFQ1RfVFJVRShlZ2xEZXN0cm95U3VyZmFjZShtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpKTsKLSAgICAgICAgbUVnbFN1cmZhY2UgPSBFR0xfTk9fU1VSRkFDRTsKLSAgICB9Ci0gICAgbUVnbFN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKG1FZ2xEaXNwbGF5LCBtR2xDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BTlcuZ2V0KCksIE5VTEwpOwotICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgQVNTRVJUX05FKEVHTF9OT19TVVJGQUNFLCBtRWdsU3VyZmFjZSkgOwotCi0gICAgRVhQRUNUX1RSVUUoZWdsTWFrZUN1cnJlbnQobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlLCBtRWdsU3VyZmFjZSwKLSAgICAgICAgICAgIG1FZ2xDb250ZXh0KSk7Ci0gICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLX0KLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIE1ldGhvZHMgaW4gU3VyZmFjZU1lZGlhU291cmNlVGVzdAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLS8vIE9uZSBwYXNzIG9mIGRlcXVldWluZyBhbmQgcXVldWluZyB0aGUgYnVmZmVyLiBGaWxsIGl0IGluIHdpdGgKLS8vIGNwdSBZVjEyIGJ1ZmZlcgotdm9pZCBTdXJmYWNlTWVkaWFTb3VyY2VUZXN0OjpvbmVCdWZmZXJQYXNzKGludCB3aWR0aCwgaW50IGhlaWdodCApIHsKLSAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBhbmI7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X2RlcXVldWVfYnVmZmVyX2FuZF93YWl0KG1BTlcuZ2V0KCksICZhbmIpKTsKLSAgICBBU1NFUlRfVFJVRShhbmIgIT0gTlVMTCk7Ci0KLQotICAgIC8vIEZpbGwgdGhlIGJ1ZmZlciB3aXRoIHRoZSBhIGNoZWNrZXJib2FyZCBwYXR0ZXJuCi0gICAgdWludDhfdCogaW1nID0gTlVMTDsKLSAgICBzcDxHcmFwaGljQnVmZmVyPiBidWYoR3JhcGhpY0J1ZmZlcjo6ZnJvbShhbmIpKTsKLSAgICBidWYtPmxvY2soR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgKHZvaWQqKikoJmltZykpOwotICAgIFN1cmZhY2VNZWRpYVNvdXJjZVRlc3Q6OmZpbGxZVjEyQnVmZmVyKGltZywgd2lkdGgsIGhlaWdodCwgYnVmLT5nZXRTdHJpZGUoKSk7Ci0gICAgYnVmLT51bmxvY2soKTsKLQotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmLT5nZXROYXRpdmVCdWZmZXIoKSwKLSAgICAgICAgICAgIC0xKSk7Ci19Ci0KLS8vIERlcXVldWluZyBhbmQgcXVldWluZyB0aGUgYnVmZmVyIHdpdGhvdXQgcmVhbGx5IGZpbGxpbmcgaXQgaW4uCi12b2lkIFN1cmZhY2VNZWRpYVNvdXJjZVRlc3Q6Om9uZUJ1ZmZlclBhc3NOb0ZpbGwoCi0gICAgICAgIGludCAvKiB3aWR0aCAqLywgaW50IC8qIGhlaWdodCAgKi8pIHsKLSAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBhbmI7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X2RlcXVldWVfYnVmZmVyX2FuZF93YWl0KG1BTlcuZ2V0KCksICZhbmIpKTsKLSAgICBBU1NFUlRfVFJVRShhbmIgIT0gTlVMTCk7Ci0KLSAgICAvLyBXZSBkbyBub3QgZmlsbCB0aGUgYnVmZmVyIGluLiBKdXN0IHF1ZXVlIGl0IGJhY2suCi0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmKEdyYXBoaWNCdWZmZXI6OmZyb20oYW5iKSk7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWYtPmdldE5hdGl2ZUJ1ZmZlcigpLAotICAgICAgICAgICAgLTEpKTsKLX0KLQotLy8gRmlsbCBhIFlWMTIgYnVmZmVyIHdpdGggYSBtdWx0aS1jb2xvcmVkIGNoZWNrZXJib2FyZCBwYXR0ZXJuCi12b2lkIFN1cmZhY2VNZWRpYVNvdXJjZVRlc3Q6OmZpbGxZVjEyQnVmZmVyKHVpbnQ4X3QqIGJ1ZiwgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlKSB7Ci0gICAgY29uc3QgaW50IGJsb2NrV2lkdGggPSB3ID4gMTYgPyB3IC8gMTYgOiAxOwotICAgIGNvbnN0IGludCBibG9ja0hlaWdodCA9IGggPiAxNiA/IGggLyAxNiA6IDE7Ci0gICAgY29uc3QgaW50IHl1dlRleE9mZnNldFkgPSAwOwotICAgIGludCB5dXZUZXhTdHJpZGVZID0gc3RyaWRlOwotICAgIGludCB5dXZUZXhPZmZzZXRWID0geXV2VGV4U3RyaWRlWSAqIGg7Ci0gICAgaW50IHl1dlRleFN0cmlkZVYgPSAoeXV2VGV4U3RyaWRlWS8yICsgMHhmKSAmIH4weGY7Ci0gICAgaW50IHl1dlRleE9mZnNldFUgPSB5dXZUZXhPZmZzZXRWICsgeXV2VGV4U3RyaWRlViAqIGgvMjsKLSAgICBpbnQgeXV2VGV4U3RyaWRlVSA9IHl1dlRleFN0cmlkZVY7Ci0gICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyB4KyspIHsKLSAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoOyB5KyspIHsKLSAgICAgICAgICAgIGludCBwYXJpdHlYID0gKHggLyBibG9ja1dpZHRoKSAmIDE7Ci0gICAgICAgICAgICBpbnQgcGFyaXR5WSA9ICh5IC8gYmxvY2tIZWlnaHQpICYgMTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgaW50ZW5zaXR5ID0gKHBhcml0eVggXiBwYXJpdHlZKSA/IDYzIDogMTkxOwotICAgICAgICAgICAgYnVmW3l1dlRleE9mZnNldFkgKyAoeSAqIHl1dlRleFN0cmlkZVkpICsgeF0gPSBpbnRlbnNpdHk7Ci0gICAgICAgICAgICBpZiAoeCA8IHcgLyAyICYmIHkgPCBoIC8gMikgewotICAgICAgICAgICAgICAgIGJ1Zlt5dXZUZXhPZmZzZXRVICsgKHkgKiB5dXZUZXhTdHJpZGVVKSArIHhdID0gaW50ZW5zaXR5OwotICAgICAgICAgICAgICAgIGlmICh4ICogMiA8IHcgLyAyICYmIHkgKiAyIDwgaCAvIDIpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmW3l1dlRleE9mZnNldFYgKyAoeSoyICogeXV2VGV4U3RyaWRlVikgKyB4KjIgKyAwXSA9Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zlt5dXZUZXhPZmZzZXRWICsgKHkqMiAqIHl1dlRleFN0cmlkZVYpICsgeCoyICsgMV0gPQotICAgICAgICAgICAgICAgICAgICBidWZbeXV2VGV4T2Zmc2V0ViArICgoeSoyKzEpICogeXV2VGV4U3RyaWRlVikgKyB4KjIgKyAwXSA9Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zlt5dXZUZXhPZmZzZXRWICsgKCh5KjIrMSkgKiB5dXZUZXhTdHJpZGVWKSArIHgqMiArIDFdID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVuc2l0eTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIEZpbGwgYSBZVjEyIGJ1ZmZlciB3aXRoIHJlZCBvdXRzaWRlIGEgZ2l2ZW4gcmVjdGFuZ2xlIGFuZCBncmVlbiBpbnNpZGUgaXQuCi12b2lkIFN1cmZhY2VNZWRpYVNvdXJjZVRlc3Q6OmZpbGxZVjEyQnVmZmVyUmVjdCh1aW50OF90KiBidWYsIGludCB3LAotICAgICAgICAgICAgICAgICAgaW50IGgsIGludCBzdHJpZGUsIGNvbnN0IGFuZHJvaWRfbmF0aXZlX3JlY3RfdCYgcmVjdCkgewotICAgIGNvbnN0IGludCB5dXZUZXhPZmZzZXRZID0gMDsKLSAgICBpbnQgeXV2VGV4U3RyaWRlWSA9IHN0cmlkZTsKLSAgICBpbnQgeXV2VGV4T2Zmc2V0ViA9IHl1dlRleFN0cmlkZVkgKiBoOwotICAgIGludCB5dXZUZXhTdHJpZGVWID0gKHl1dlRleFN0cmlkZVkvMiArIDB4ZikgJiB+MHhmOwotICAgIGludCB5dXZUZXhPZmZzZXRVID0geXV2VGV4T2Zmc2V0ViArIHl1dlRleFN0cmlkZVYgKiBoLzI7Ci0gICAgaW50IHl1dlRleFN0cmlkZVUgPSB5dXZUZXhTdHJpZGVWOwotICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKSB7Ci0gICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgeSsrKSB7Ci0gICAgICAgICAgICBib29sIGluc2lkZSA9IHJlY3QubGVmdCA8PSB4ICYmIHggPCByZWN0LnJpZ2h0ICYmCi0gICAgICAgICAgICAgICAgICAgIHJlY3QudG9wIDw9IHkgJiYgeSA8IHJlY3QuYm90dG9tOwotICAgICAgICAgICAgYnVmW3l1dlRleE9mZnNldFkgKyAoeSAqIHl1dlRleFN0cmlkZVkpICsgeF0gPSBpbnNpZGUgPyAyNDAgOiA2NDsKLSAgICAgICAgICAgIGlmICh4IDwgdyAvIDIgJiYgeSA8IGggLyAyKSB7Ci0gICAgICAgICAgICAgICAgYm9vbCBpbnNpZGUgPSByZWN0LmxlZnQgPD0gMip4ICYmIDIqeCA8IHJlY3QucmlnaHQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QudG9wIDw9IDIqeSAmJiAyKnkgPCByZWN0LmJvdHRvbTsKLSAgICAgICAgICAgICAgICBidWZbeXV2VGV4T2Zmc2V0VSArICh5ICogeXV2VGV4U3RyaWRlVSkgKyB4XSA9IDE2OwotICAgICAgICAgICAgICAgIGJ1Zlt5dXZUZXhPZmZzZXRWICsgKHkgKiB5dXZUZXhTdHJpZGVWKSArIHhdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2lkZSA/IDE2IDogMjU1OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfSAgLy8vLy8vLy8vIEVuZCBvZiBjbGFzcyBTdXJmYWNlTWVkaWFTb3VyY2VUZXN0Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIENsYXNzIHRvIGltaXRhdGUgdGhlIHJlY29yZGluZyAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXN0cnVjdCBTaW1wbGVEdW1teVJlY29yZGVyIHsKLSAgICAgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7Ci0KLSAgICAgICAgZXhwbGljaXQgU2ltcGxlRHVtbXlSZWNvcmRlcgotICAgICAgICAgICAgICAgIChjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk6IG1Tb3VyY2Uoc291cmNlKSB7fQotCi0gICAgICAgIHN0YXR1c190IHN0YXJ0KCkgeyByZXR1cm4gbVNvdXJjZS0+c3RhcnQoKTt9Ci0gICAgICAgIHN0YXR1c190IHN0b3AoKSAgeyByZXR1cm4gbVNvdXJjZS0+c3RvcCgpO30KLQotICAgICAgICAvLyBmYWtlcyByZWFkaW5nIGZyb20gYSBtZWRpYSBzb3VyY2UKLSAgICAgICAgc3RhdHVzX3QgcmVhZEZyb21Tb3VyY2UoKSB7Ci0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOwotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+cmVhZCgmYnVmZmVyKTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBidWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci19OwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gICAgICAgICAgIFRFU1RTCi0vLyBTdXJmYWNlTWVkaWFTb3VyY2VUZXN0IGNsYXNzIGNvbnRhaW5zIHRlc3RzIHRoYXQgZmlsbCB0aGUgYnVmZmVycwotLy8gdXNpbmcgdGhlIGNwdSBjYWxscwotLy8gU3VyZmFjZU1lZGlhU291cmNlR0xUZXN0IGNsYXNzIGNvbnRhaW5zIHRlc3RzIHRoYXQgZmlsbCB0aGUgYnVmZmVycwotLy8gdXNpbmcgdGhlIEdMIGNhbGxzLgotLy8gVE9ETzogTm9uZSBvZiB0aGUgdGVzdHMgYWN0dWFsbHkgdmVyaWZ5IHRoZSBlbmNvZGVkIGltYWdlcy4uIHNvIGF0IHRoaXMgcG9pbnQsCi0vLyB0aGVzZSBhcmUgbW9zdGx5IGZ1bmN0aW9uYWxpdHkgdGVzdHMgKyB2aXN1YWwgaW5zcGVjdGlvbgotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0vLyBKdXN0IHBhc3Mgb25lIGJ1ZmZlciBmcm9tIHRoZSBuYXRpdmVfd2luZG93IHRvIHRoZSBTdXJmYWNlTWVkaWFTb3VyY2UKLS8vIER1bW15IEVuY29kZXIKLXN0YXRpYyBpbnQgdGVzdElkID0gMTsKLVRFU1RfRihTdXJmYWNlTWVkaWFTb3VyY2VUZXN0LCBESVNBQkxFRF9EdW1teUVuY29kaW5nRnJvbUNwdUZpbGxlZFlWMTJCdWZmZXJOcG90T25lQnVmZmVyUGFzcykgewotICAgIEFMT0dWKCJUZXN0ICMgJWQiLCB0ZXN0SWQrKyk7Ci0gICAgQUxPR1YoIlRlc3RpbmcgT25lQnVmZmVyUGFzcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsKLQotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19mb3JtYXQobUFOVy5nZXQoKSwKLSAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWVYxMikpOwotICAgIG9uZUJ1ZmZlclBhc3MobVl1dlRleFdpZHRoLCBtWXV2VGV4SGVpZ2h0KTsKLX0KLQotLy8gUGFzcyB0aGUgYnVmZmVyIHdpdGggdGhlIHdyb25nIGhlaWdodCBhbmQgd2VpZ2h0IGFuZCBzaG91bGQgbm90IGJlIGFjY2VwdGVkCi0vLyBEdW1teSBFbmNvZGVyCi1URVNUX0YoU3VyZmFjZU1lZGlhU291cmNlVGVzdCwgRElTQUJMRURfRHVtbXlFbmNvZGluZ0Zyb21DcHVGaWxsZWRZVjEyQnVmZmVyTnBvdFdyb25nU2l6ZUJ1ZmZlclBhc3MpIHsKLSAgICBBTE9HVigiVGVzdCAjICVkIiwgdGVzdElkKyspOwotICAgIEFMT0dWKCJUZXN0aW5nIFdyb25nIHNpemUgQnVmZmVyUGFzcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsKLQotICAgIC8vIHNldHRpbmcgdGhlIGNsaWVudCBzaWRlIGJ1ZmZlciBzaXplIGRpZmZlcmVudCB0aGFuIHRoZSBzZXJ2ZXIgc2l6ZQotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kaW1lbnNpb25zKG1BTlcuZ2V0KCksCi0gICAgICAgICAgICAgMTAsIDEwKSk7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2Zvcm1hdChtQU5XLmdldCgpLAotICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyKSk7Ci0KLSAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBhbmI7Ci0KLSAgICAvLyBOb3RlOiBtYWtlIHN1cmUgd2UgZ2V0IGFuIEVSUk9SIGJhY2sgd2hlbiBkZXF1ZXVpbmchCi0gICAgQVNTRVJUX05FKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X2RlcXVldWVfYnVmZmVyX2FuZF93YWl0KG1BTlcuZ2V0KCksICZhbmIpKTsKLX0KLQotLy8gcGFzcyBtdWx0aXBsZSBidWZmZXJzIGZyb20gdGhlIG5hdGl2ZV93aW5kb3cgdGhlIFN1cmZhY2VNZWRpYVNvdXJjZQotLy8gRHVtbXkgRW5jb2RlcgotVEVTVF9GKFN1cmZhY2VNZWRpYVNvdXJjZVRlc3QsICBESVNBQkxFRF9EdW1teUVuY29kaW5nRnJvbUNwdUZpbGxlZFlWMTJCdWZmZXJOcG90TXVsdGlCdWZmZXJQYXNzKSB7Ci0gICAgQUxPR1YoIlRlc3QgIyAlZCIsIHRlc3RJZCsrKTsKLSAgICBBTE9HVigiVGVzdGluZyBNdWx0aUJ1ZmZlclBhc3MsIER1bW15IFJlY29yZGVyICoqKioqKioqKioqKioqKioqKioqKiIpOwotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19mb3JtYXQobUFOVy5nZXQoKSwKLSAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWVYxMikpOwotCi0gICAgU2ltcGxlRHVtbXlSZWNvcmRlciB3cml0ZXIobVNNUyk7Ci0gICAgd3JpdGVyLnN0YXJ0KCk7Ci0KLSAgICBpbnQzMl90IG5GcmFtZXNDb3VudCA9IDA7Ci0gICAgd2hpbGUgKG5GcmFtZXNDb3VudCA8IDMwMCkgewotICAgICAgICBvbmVCdWZmZXJQYXNzKG1ZdXZUZXhXaWR0aCwgbVl1dlRleEhlaWdodCk7Ci0KLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCB3cml0ZXIucmVhZEZyb21Tb3VyY2UoKSk7Ci0KLSAgICAgICAgbkZyYW1lc0NvdW50Kys7Ci0gICAgfQotICAgIHdyaXRlci5zdG9wKCk7Ci19Ci0KLS8vIERlbGF5ZWQgcGFzcyBvZiBtdWx0aXBsZSBidWZmZXJzIGZyb20gdGhlIG5hdGl2ZV93aW5kb3cgdGhlIFN1cmZhY2VNZWRpYVNvdXJjZQotLy8gRHVtbXkgRW5jb2RlcgotVEVTVF9GKFN1cmZhY2VNZWRpYVNvdXJjZVRlc3QsICBEdW1teUxhZ0VuY29kaW5nRnJvbUNwdUZpbGxlZFlWMTJCdWZmZXJOcG90TXVsdGlCdWZmZXJQYXNzKSB7Ci0gICAgQUxPR1YoIlRlc3QgIyAlZCIsIHRlc3RJZCsrKTsKLSAgICBBTE9HVigiVGVzdGluZyBNdWx0aUJ1ZmZlclBhc3MsIER1bW15IFJlY29yZGVyIExhZ2dpbmcgKioqKioqKioqKioqKioiKTsKLQotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19mb3JtYXQobUFOVy5nZXQoKSwKLSAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWVYxMikpOwotCi0gICAgU2ltcGxlRHVtbXlSZWNvcmRlciB3cml0ZXIobVNNUyk7Ci0gICAgd3JpdGVyLnN0YXJ0KCk7Ci0KLSAgICBpbnQzMl90IG5GcmFtZXNDb3VudCA9IDE7Ci0gICAgY29uc3QgaW50IEZSQU1FU19MQUcgPSBTdXJmYWNlTWVkaWFTb3VyY2U6Ok1JTl9VTkRFUVVFVUVEX0JVRkZFUlM7Ci0KLSAgICB3aGlsZSAobkZyYW1lc0NvdW50IDw9IDMwMCkgewotICAgICAgICBBTE9HVigiRnJhbWU6ICVkIiwgbkZyYW1lc0NvdW50KTsKLSAgICAgICAgb25lQnVmZmVyUGFzcyhtWXV2VGV4V2lkdGgsIG1ZdXZUZXhIZWlnaHQpOwotICAgICAgICAvLyBGb3JjaW5nIHRoZSB3cml0ZXIgdG8gbGFnIGJlaGluZCBhIGZldyBmcmFtZXMKLSAgICAgICAgaWYgKG5GcmFtZXNDb3VudCA+IEZSQU1FU19MQUcpIHsKLSAgICAgICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgd3JpdGVyLnJlYWRGcm9tU291cmNlKCkpOwotICAgICAgICB9Ci0gICAgICAgIG5GcmFtZXNDb3VudCsrOwotICAgIH0KLSAgICB3cml0ZXIuc3RvcCgpOwotfQotCi0vLyBwYXNzIG11bHRpcGxlIGJ1ZmZlcnMgZnJvbSB0aGUgbmF0aXZlX3dpbmRvdyB0aGUgU3VyZmFjZU1lZGlhU291cmNlCi0vLyBBIGR1bW15IHdyaXRlciAoTVVMVElUSFJFQURFRCkgaXMgdXNlZCB0byBzaW11bGF0ZSBhY3R1YWwgTVBFRzRXcml0ZXIKLVRFU1RfRihTdXJmYWNlTWVkaWFTb3VyY2VUZXN0LCBEdW1teVRocmVhZGVkRW5jb2RpbmdGcm9tQ3B1RmlsbGVkWVYxMkJ1ZmZlck5wb3RNdWx0aUJ1ZmZlclBhc3MpIHsKLSAgICBBTE9HVigiVGVzdCAjICVkIiwgdGVzdElkKyspOwotICAgIEFMT0dWKCJUZXN0aW5nIE11bHRpQnVmZmVyUGFzcywgRHVtbXkgUmVjb3JkZXIgTXVsdGktVGhyZWFkZWQgKioqKioqKioqKiIpOwotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19mb3JtYXQobUFOVy5nZXQoKSwKLSAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWVYxMikpOwotCi0gICAgRHVtbXlSZWNvcmRlciB3cml0ZXIobVNNUyk7Ci0gICAgd3JpdGVyLnN0YXJ0KCk7Ci0KLSAgICBpbnQzMl90IG5GcmFtZXNDb3VudCA9IDA7Ci0gICAgd2hpbGUgKG5GcmFtZXNDb3VudCA8PSAzMDApIHsKLSAgICAgICAgQUxPR1YoIkZyYW1lOiAlZCIsIG5GcmFtZXNDb3VudCk7Ci0gICAgICAgIG9uZUJ1ZmZlclBhc3MobVl1dlRleFdpZHRoLCBtWXV2VGV4SGVpZ2h0KTsKLQotICAgICAgICBuRnJhbWVzQ291bnQrKzsKLSAgICB9Ci0gICAgd3JpdGVyLnN0b3AoKTsKLX0KLQotLy8gVGVzdCB0byBleGFtaW5lIGFjdHVhbCBlbmNvZGluZyB1c2luZyBtZWRpYXJlY29yZGVyCi0vLyBXZSB1c2UgdGhlIG1lZGlhc2VydmVyIHRvIGNyZWF0ZSBhIG1lZGlhcmVjb3JkZXIgYW5kIHNlbmQKLS8vIGl0IGJhY2sgdG8gdXMuIFNvIFN1cmZhY2VNZWRpYVNvdXJjZSBsaXZlcyBpbiB0aGUgc2FtZSBwcm9jZXNzCi0vLyBhcyB0aGUgbWVkaWFzZXJ2ZXIuCi0vLyBWZXJ5IGNsb3NlIHRvIHRoZSBhY3R1YWwgY2FtZXJhLCBleGNlcHQgdGhhdCB0aGUKLS8vIGJ1ZmZlcnMgYXJlIGZpbGxlZCBhbmQgcXVldWV1ZCBieSB0aGUgQ1BVIGluc3RlYWQgb2YgR0wuCi1URVNUX0YoU3VyZmFjZU1lZGlhU291cmNlVGVzdCwgRElTQUJMRURfRW5jb2RpbmdGcm9tQ3B1WVYxMkJ1ZmZlck5wb3RXcml0ZU1lZGlhU2VydmVyKSB7Ci0gICAgQUxPR1YoIlRlc3QgIyAlZCIsIHRlc3RJZCsrKTsKLSAgICBBTE9HVigiKioqKioqKioqKioqKiogVGVzdGluZyB0aGUgd2hvbGUgcGlwZWxpbmUgd2l0aCBhY3R1YWwgTWVkaWFSZWNvcmRlciAqKioqKioqKioqKiIpOwotICAgIEFMT0dWKCIqKioqKioqKioqKioqKiBTdXJmYWNlTWVkaWFTb3VyY2UgaXMgc2FtZSBwcm9jZXNzIGFzIG1lZGlhc2VydmVyICAgICoqKioqKioqKioqIik7Ci0KLSAgICBjb25zdCBjaGFyICpmaWxlTmFtZSA9ICIvc2RjYXJkL291dHB1dFN1cmZFbmNNU291cmNlLm1wNCI7Ci0gICAgaW50IGZkID0gb3BlbihmaWxlTmFtZSwgT19SRFdSIHwgT19DUkVBVCwgMDc0NCk7Ci0gICAgaWYgKGZkIDwgMCkgewotICAgICAgICBBTE9HRSgiRVJST1I6IENvdWxkIG5vdCBvcGVuIHRoZSB0aGUgZmlsZSAlcywgZmQgPSAlZCAhISIsIGZpbGVOYW1lLCBmZCk7Ci0gICAgfQotICAgIENIRUNLKGZkID49IDApOwotCi0gICAgc3A8TWVkaWFSZWNvcmRlcj4gbXIgPSBTdXJmYWNlTWVkaWFTb3VyY2VHTFRlc3Q6OnNldFVwTWVkaWFSZWNvcmRlcihmZCwKLSAgICAgICAgICAgIFZJREVPX1NPVVJDRV9TVVJGQUNFLCBPVVRQVVRfRk9STUFUX01QRUdfNCwgVklERU9fRU5DT0RFUl9IMjY0LAotICAgICAgICAgICAgbVl1dlRleFdpZHRoLCBtWXV2VGV4SGVpZ2h0LCAzMCk7Ci0gICAgLy8gZ2V0IHRoZSByZWZlcmVuY2UgdG8gdGhlIHN1cmZhY2VtZWRpYXNvdXJjZSBsaXZpbmcgaW4KLSAgICAvLyBtZWRpYXNlcnZlciB0aGF0IGlzIGNyZWF0ZWQgYnkgc3RhZ2VmcmlnaHRyZWNvcmRlcgotICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGlTVCA9IG1yLT5xdWVyeVN1cmZhY2VNZWRpYVNvdXJjZUZyb21NZWRpYVNlcnZlcigpOwotICAgIG1TVEMgPSBuZXcgU3VyZmFjZShpU1QpOwotICAgIG1BTlcgPSBtU1RDOwotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19hcGlfY29ubmVjdChtQU5XLmdldCgpLCBOQVRJVkVfV0lORE9XX0FQSV9DUFUpKTsKLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZm9ybWF0KG1BTlcuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lWMTIpKTsKLQotICAgIGludDMyX3QgbkZyYW1lc0NvdW50ID0gMDsKLSAgICB3aGlsZSAobkZyYW1lc0NvdW50IDw9IDMwMCkgewotICAgICAgICBvbmVCdWZmZXJQYXNzTm9GaWxsKG1ZdXZUZXhXaWR0aCwgbVl1dlRleEhlaWdodCk7Ci0gICAgICAgIG5GcmFtZXNDb3VudCsrOwotICAgICAgICBBTE9HVigiZnJhbWVzQ291bnQgPSAlZCIsIG5GcmFtZXNDb3VudCk7Ci0gICAgfQotCi0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KG1BTlcuZ2V0KCksIE5BVElWRV9XSU5ET1dfQVBJX0NQVSkpOwotICAgIEFMT0dWKCJTdG9wcGluZyBNZWRpYVJlY29yZGVyLi4uIik7Ci0gICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBtci0+c3RvcCgpKTsKLSAgICBtci5jbGVhcigpOwotICAgIGNsb3NlKGZkKTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gR0wgdGVzdHMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0vLyBUZXN0IHRvIGV4YW1pbmUgd2hldGhlciB3ZSBjYW4gY2hvb3NlIHRoZSBSZWNvcmRhYmxlIEFuZHJvaWQgR0xDb25maWcKLS8vIER1bW15UmVjb3JkZXIgdXNlZC0gbm8gcmVhbCBlbmNvZGluZyBoZXJlCi1URVNUX0YoU3VyZmFjZU1lZGlhU291cmNlR0xUZXN0LCBDaG9vc2VBbmRyb2lkUmVjb3JkYWJsZUVHTENvbmZpZ0R1bW15V3JpdGVyKSB7Ci0gICAgQUxPR1YoIlRlc3QgIyAlZCIsIHRlc3RJZCsrKTsKLSAgICBBTE9HVigiVmVyaWZ5IGNyZWF0aW5nIGEgc3VyZmFjZSB3LyByaWdodCBjb25maWcgKyBkdW1teSB3cml0ZXIqKioqKioqKioiKTsKLQotICAgIG1TTVMgPSBuZXcgU3VyZmFjZU1lZGlhU291cmNlKG1ZdXZUZXhXaWR0aCwgbVl1dlRleEhlaWdodCk7Ci0gICAgbVNUQyA9IG5ldyBTdXJmYWNlKG1TTVMtPmdldFByb2R1Y2VyKCkpOwotICAgIG1BTlcgPSBtU1RDOwotCi0gICAgRHVtbXlSZWNvcmRlciB3cml0ZXIobVNNUyk7Ci0gICAgd3JpdGVyLnN0YXJ0KCk7Ci0KLSAgICBpZiAobUVnbFN1cmZhY2UgIT0gRUdMX05PX1NVUkZBQ0UpIHsKLSAgICAgICAgRVhQRUNUX1RSVUUoZWdsRGVzdHJveVN1cmZhY2UobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlKSk7Ci0gICAgICAgIG1FZ2xTdXJmYWNlID0gRUdMX05PX1NVUkZBQ0U7Ci0gICAgfQotCi0gICAgbUVnbFN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKG1FZ2xEaXNwbGF5LCBtR2xDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BTlcuZ2V0KCksIE5VTEwpOwotICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgQVNTRVJUX05FKEVHTF9OT19TVVJGQUNFLCBtRWdsU3VyZmFjZSkgOwotCi0gICAgRVhQRUNUX1RSVUUoZWdsTWFrZUN1cnJlbnQobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlLCBtRWdsU3VyZmFjZSwKLSAgICAgICAgICAgIG1FZ2xDb250ZXh0KSk7Ci0gICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLQotICAgIGludDMyX3QgbkZyYW1lc0NvdW50ID0gMDsKLSAgICB3aGlsZSAobkZyYW1lc0NvdW50IDw9IDMwMCkgewotICAgICAgICBvbmVCdWZmZXJQYXNzR0woKTsKLSAgICAgICAgbkZyYW1lc0NvdW50Kys7Ci0gICAgICAgIEFMT0dWKCJmcmFtZXNDb3VudCA9ICVkIiwgbkZyYW1lc0NvdW50KTsKLSAgICB9Ci0KLSAgICBFWFBFQ1RfVFJVRShlZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19TVVJGQUNFLAotICAgICAgICAgICAgRUdMX05PX0NPTlRFWFQpKTsKLSAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgIGVnbERlc3Ryb3lTdXJmYWNlKG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSk7Ci0gICAgbUVnbFN1cmZhY2UgPSBFR0xfTk9fU1VSRkFDRTsKLQotICAgIHdyaXRlci5zdG9wKCk7Ci19Ci0vLyBUZXN0IHRvIGV4YW1pbmUgd2hldGhlciB3ZSBjYW4gcmVuZGVyIEdMIGJ1ZmZlcnMgaW4gdG8gdGhlIHN1cmZhY2UKLS8vIGNyZWF0ZWQgd2l0aCB0aGUgbmF0aXZlIHdpbmRvdyBoYW5kbGUKLVRFU1RfRihTdXJmYWNlTWVkaWFTb3VyY2VHTFRlc3QsIFJlbmRlcmluZ1RvUmVjb3JkYWJsZUVHTFN1cmZhY2VXb3JrcykgewotICAgIEFMT0dWKCJUZXN0ICMgJWQiLCB0ZXN0SWQrKyk7Ci0gICAgQUxPR1YoIlJlbmRlcmluZ1RvUmVjb3JkYWJsZUVHTFN1cmZhY2VXb3JrcyAqKioqKioqKioqKioqKioqKioqKioiKTsKLSAgICAvLyBEbyB0aGUgcHJvZHVjZXIgc2lkZSBvZiB0aGluZ3MKLSAgICBnbENsZWFyQ29sb3IoMC42LCAwLjYsIDAuNiwgMC42KTsKLSAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotCi0gICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKLSAgICBnbFNjaXNzb3IoNCwgNCwgNCwgNCk7Ci0gICAgZ2xDbGVhckNvbG9yKDEuMCwgMC4wLCAwLjAsIDEuMCk7Ci0gICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLQotICAgIGdsU2Npc3NvcigyNCwgNDgsIDQsIDQpOwotICAgIGdsQ2xlYXJDb2xvcigwLjAsIDEuMCwgMC4wLCAxLjApOwotICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0KLSAgICBnbFNjaXNzb3IoMzcsIDE3LCA0LCA0KTsKLSAgICBnbENsZWFyQ29sb3IoMC4wLCAwLjAsIDEuMCwgMS4wKTsKLSAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotCi0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCggMCwgIDAsIDE1MywgMTUzLCAxNTMsIDE1MykpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNjMsICAwLCAxNTMsIDE1MywgMTUzLCAxNTMpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDYzLCA2MywgMTUzLCAxNTMsIDE1MywgMTUzKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCggMCwgNjMsIDE1MywgMTUzLCAxNTMsIDE1MykpOwotCi0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCggNCwgIDcsIDI1NSwgICAwLCAgIDAsIDI1NSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMjUsIDUxLCAgIDAsIDI1NSwgICAwLCAyNTUpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDQwLCAxOSwgICAwLCAgIDAsIDI1NSwgMjU1KSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgyOSwgNTEsIDE1MywgMTUzLCAxNTMsIDE1MykpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoIDUsIDMyLCAxNTMsIDE1MywgMTUzLCAxNTMpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDEzLCAgOCwgMTUzLCAxNTMsIDE1MywgMTUzKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg0NiwgIDMsIDE1MywgMTUzLCAxNTMsIDE1MykpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMzAsIDMzLCAxNTMsIDE1MywgMTUzLCAxNTMpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKCA2LCA1MiwgMTUzLCAxNTMsIDE1MywgMTUzKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg1NSwgMzMsIDE1MywgMTUzLCAxNTMsIDE1MykpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMTYsIDI5LCAxNTMsIDE1MywgMTUzLCAxNTMpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKCAxLCAzMCwgMTUzLCAxNTMsIDE1MywgMTUzKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg0MSwgMzcsIDE1MywgMTUzLCAxNTMsIDE1MykpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNDYsIDI5LCAxNTMsIDE1MywgMTUzLCAxNTMpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDE1LCAyNSwgMTUzLCAxNTMsIDE1MywgMTUzKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCggMywgNTIsIDE1MywgMTUzLCAxNTMsIDE1MykpOwotfQotCi0vLyBUZXN0IHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBlbmNvZGluZyB3aXRoIEdMIGJ1ZmZlcnMKLS8vIEFjdHVhbCBlbmNvZGVyLCBBY3R1YWwgR0wgQnVmZmVycyBGaWxsZWQgU3VyZmFjZU1lZGlhU291cmNlCi0vLyBUaGUgc2FtZSBwYXR0ZXJuIGlzIHJlbmRlcmVkIGV2ZXJ5IGZyYW1lCi1URVNUX0YoU3VyZmFjZU1lZGlhU291cmNlR0xUZXN0LCBFbmNvZGluZ0Zyb21HTFJnYmFTYW1lSW1hZ2VFYWNoQnVmTnBvdFdyaXRlKSB7Ci0gICAgQUxPR1YoIlRlc3QgIyAlZCIsIHRlc3RJZCsrKTsKLSAgICBBTE9HVigiKioqKioqKioqKioqKiogVGVzdGluZyB0aGUgd2hvbGUgcGlwZWxpbmUgd2l0aCBhY3R1YWwgUmVjb3JkZXIgKioqKioqKioqKioiKTsKLSAgICBBTE9HVigiKioqKioqKioqKioqKiogR0wgRmlsbGluZyB0aGUgYnVmZmVycyAqKioqKioqKioqKiIpOwotICAgIC8vIE5vdGU6IE5vIG5lZWQgdG8gc2V0IHRoZSBjb2xvcmZvcm1hdCBmb3IgdGhlIGJ1ZmZlcnMuIFRoZSBjb2xvcmZvcm1hdCBpcwotICAgIC8vIGluIHRoZSBHUkFsbG9jIGJ1ZmZlcnMgaXRzZWxmLgotCi0gICAgY29uc3QgY2hhciAqZmlsZU5hbWUgPSAiL3NkY2FyZC9vdXRwdXRTdXJmRW5jTVNvdXJjZUdMLm1wNCI7Ci0gICAgaW50IGZkID0gb3BlbihmaWxlTmFtZSwgT19SRFdSIHwgT19DUkVBVCwgMDc0NCk7Ci0gICAgaWYgKGZkIDwgMCkgewotICAgICAgICBBTE9HRSgiRVJST1I6IENvdWxkIG5vdCBvcGVuIHRoZSB0aGUgZmlsZSAlcywgZmQgPSAlZCAhISIsIGZpbGVOYW1lLCBmZCk7Ci0gICAgfQotICAgIENIRUNLKGZkID49IDApOwotCi0gICAgc3A8TWVkaWFSZWNvcmRlcj4gbXIgPSBzZXRVcE1lZGlhUmVjb3JkZXIoZmQsIFZJREVPX1NPVVJDRV9TVVJGQUNFLAotICAgICAgICAgICAgT1VUUFVUX0ZPUk1BVF9NUEVHXzQsIFZJREVPX0VOQ09ERVJfSDI2NCwgbVl1dlRleFdpZHRoLCBtWXV2VGV4SGVpZ2h0LCAzMCk7Ci0KLSAgICAvLyBnZXQgdGhlIHJlZmVyZW5jZSB0byB0aGUgc3VyZmFjZW1lZGlhc291cmNlIGxpdmluZyBpbgotICAgIC8vIG1lZGlhc2VydmVyIHRoYXQgaXMgY3JlYXRlZCBieSBzdGFnZWZyaWdodHJlY29yZGVyCi0gICAgc2V0VXBFR0xTdXJmYWNlRnJvbU1lZGlhUmVjb3JkZXIobXIpOwotCi0gICAgaW50MzJfdCBuRnJhbWVzQ291bnQgPSAwOwotICAgIHdoaWxlIChuRnJhbWVzQ291bnQgPD0gMzAwKSB7Ci0gICAgICAgIG9uZUJ1ZmZlclBhc3NHTCgpOwotICAgICAgICBuRnJhbWVzQ291bnQrKzsKLSAgICAgICAgQUxPR1YoImZyYW1lc0NvdW50ID0gJWQiLCBuRnJhbWVzQ291bnQpOwotICAgIH0KLQotICAgIEVYUEVDVF9UUlVFKGVnbE1ha2VDdXJyZW50KG1FZ2xEaXNwbGF5LCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX1NVUkZBQ0UsCi0gICAgICAgICAgICBFR0xfTk9fQ09OVEVYVCkpOwotICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgZWdsRGVzdHJveVN1cmZhY2UobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlKTsKLSAgICBtRWdsU3VyZmFjZSA9IEVHTF9OT19TVVJGQUNFOwotCi0gICAgQUxPR1YoIlN0b3BwaW5nIE1lZGlhUmVjb3JkZXIuLi4iKTsKLSAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIG1yLT5zdG9wKCkpOwotICAgIG1yLmNsZWFyKCk7Ci0gICAgY2xvc2UoZmQpOwotfQotCi0vLyBUZXN0IHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBlbmNvZGluZyBmcm9tIHRoZSBHTCBCdWZmZXJzCi0vLyBBY3R1YWwgZW5jb2RlciwgQWN0dWFsIEdMIEJ1ZmZlcnMgRmlsbGVkIFN1cmZhY2VNZWRpYVNvdXJjZQotLy8gQSBkaWZmZXJlbnQgcGF0dGVybiBpcyByZW5kZXJlZCBldmVyeSBmcmFtZQotVEVTVF9GKFN1cmZhY2VNZWRpYVNvdXJjZUdMVGVzdCwgRW5jb2RpbmdGcm9tR0xSZ2JhRGlmZkltYWdlRWFjaEJ1Zk5wb3RXcml0ZSkgewotICAgIEFMT0dWKCJUZXN0ICMgJWQiLCB0ZXN0SWQrKyk7Ci0gICAgQUxPR1YoIioqKioqKioqKioqKioqIFRlc3RpbmcgdGhlIHdob2xlIHBpcGVsaW5lIHdpdGggYWN0dWFsIFJlY29yZGVyICoqKioqKioqKioqIik7Ci0gICAgQUxPR1YoIioqKioqKioqKioqKioqIERpZmYgR0wgRmlsbGluZyB0aGUgYnVmZmVycyAqKioqKioqKioqKiIpOwotICAgIC8vIE5vdGU6IE5vIG5lZWQgdG8gc2V0IHRoZSBjb2xvcmZvcm1hdCBmb3IgdGhlIGJ1ZmZlcnMuIFRoZSBjb2xvcmZvcm1hdCBpcwotICAgIC8vIGluIHRoZSBHUkFsbG9jIGJ1ZmZlcnMgaXRzZWxmLgotCi0gICAgY29uc3QgY2hhciAqZmlsZU5hbWUgPSAiL3NkY2FyZC9vdXRwdXRTdXJmRW5jTVNvdXJjZUdMRGlmZi5tcDQiOwotICAgIGludCBmZCA9IG9wZW4oZmlsZU5hbWUsIE9fUkRXUiB8IE9fQ1JFQVQsIDA3NDQpOwotICAgIGlmIChmZCA8IDApIHsKLSAgICAgICAgQUxPR0UoIkVSUk9SOiBDb3VsZCBub3Qgb3BlbiB0aGUgdGhlIGZpbGUgJXMsIGZkID0gJWQgISEiLCBmaWxlTmFtZSwgZmQpOwotICAgIH0KLSAgICBDSEVDSyhmZCA+PSAwKTsKLQotICAgIHNwPE1lZGlhUmVjb3JkZXI+IG1yID0gc2V0VXBNZWRpYVJlY29yZGVyKGZkLCBWSURFT19TT1VSQ0VfU1VSRkFDRSwKLSAgICAgICAgICAgIE9VVFBVVF9GT1JNQVRfTVBFR180LCBWSURFT19FTkNPREVSX0gyNjQsIG1ZdXZUZXhXaWR0aCwgbVl1dlRleEhlaWdodCwgMzApOwotCi0gICAgLy8gZ2V0IHRoZSByZWZlcmVuY2UgdG8gdGhlIHN1cmZhY2VtZWRpYXNvdXJjZSBsaXZpbmcgaW4KLSAgICAvLyBtZWRpYXNlcnZlciB0aGF0IGlzIGNyZWF0ZWQgYnkgc3RhZ2VmcmlnaHRyZWNvcmRlcgotICAgIHNldFVwRUdMU3VyZmFjZUZyb21NZWRpYVJlY29yZGVyKG1yKTsKLQotICAgIGludDMyX3QgbkZyYW1lc0NvdW50ID0gMDsKLSAgICB3aGlsZSAobkZyYW1lc0NvdW50IDw9IDMwMCkgewotICAgICAgICBvbmVCdWZmZXJQYXNzR0wobkZyYW1lc0NvdW50KTsKLSAgICAgICAgbkZyYW1lc0NvdW50Kys7Ci0gICAgICAgIEFMT0dWKCJmcmFtZXNDb3VudCA9ICVkIiwgbkZyYW1lc0NvdW50KTsKLSAgICB9Ci0KLSAgICBFWFBFQ1RfVFJVRShlZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19TVVJGQUNFLAotICAgICAgICAgICAgRUdMX05PX0NPTlRFWFQpKTsKLSAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgIGVnbERlc3Ryb3lTdXJmYWNlKG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSk7Ci0gICAgbUVnbFN1cmZhY2UgPSBFR0xfTk9fU1VSRkFDRTsKLQotICAgIEFMT0dWKCJTdG9wcGluZyBNZWRpYVJlY29yZGVyLi4uIik7Ci0gICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBtci0+c3RvcCgpKTsKLSAgICBtci5jbGVhcigpOwotICAgIGNsb3NlKGZkKTsKLX0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zLmNwcAppbmRleCBjNzYyYTc0Li4wODhlYWFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGV4dERlc2NyaXB0aW9ucy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMuY3BwCkBAIC0xNSw3ICsxNSw3IEBACiAgKi8KIAogI2luY2x1ZGUgIlRleHREZXNjcmlwdGlvbnMuaCIKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWUuY3BwCmluZGV4IGU1MTM0ZWQuLjRiMGQ0N2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZS5jcHAKQEAgLTI3LDcgKzI3LDcgQEAKIHVzaW5nIG5hbWVzcGFjZSB3ZWJtOwogCiBuYW1lc3BhY2Ugewotc3A8QUJ1ZmZlcj4gdG9BQnVmZmVyKE1lZGlhQnVmZmVyICptYnVmKSB7CitzcDxBQnVmZmVyPiB0b0FCdWZmZXIoTWVkaWFCdWZmZXJCYXNlICptYnVmKSB7CiAgICAgc3A8QUJ1ZmZlcj4gYWJ1ZiA9IG5ldyBBQnVmZmVyKG1idWYtPnJhbmdlX2xlbmd0aCgpKTsKICAgICBtZW1jcHkoYWJ1Zi0+ZGF0YSgpLCAodWludDhfdCopIG1idWYtPmRhdGEoKSArIG1idWYtPnJhbmdlX29mZnNldCgpLCBtYnVmLT5yYW5nZV9sZW5ndGgoKSk7CiAgICAgcmV0dXJuIGFidWY7CkBAIC00Niw3ICs0Niw3IEBACiAgICAgICBtRW9zKHRydWUpIHsKIH0KIAotV2VibUZyYW1lOjpXZWJtRnJhbWUoaW50IHR5cGUsIGJvb2wga2V5LCB1aW50NjRfdCBhYnNUaW1lY29kZSwgTWVkaWFCdWZmZXIgKm1idWYpCitXZWJtRnJhbWU6OldlYm1GcmFtZShpbnQgdHlwZSwgYm9vbCBrZXksIHVpbnQ2NF90IGFic1RpbWVjb2RlLCBNZWRpYUJ1ZmZlckJhc2UgKm1idWYpCiAgICAgOiBtVHlwZSh0eXBlKSwKICAgICAgIG1LZXkoa2V5KSwKICAgICAgIG1BYnNUaW1lY29kZShhYnNUaW1lY29kZSksCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWUuaAppbmRleCA0ZjBiMDU1Li5hNDEwYTg3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lLmgKQEAgLTMwLDcgKzMwLDcgQEAKICAgICBjb25zdCBib29sIG1Fb3M7CiAKICAgICBXZWJtRnJhbWUoKTsKLSAgICBXZWJtRnJhbWUoaW50IHR5cGUsIGJvb2wga2V5LCB1aW50NjRfdCBhYnNUaW1lY29kZSwgTWVkaWFCdWZmZXIgKmJ1Zik7CisgICAgV2VibUZyYW1lKGludCB0eXBlLCBib29sIGtleSwgdWludDY0X3QgYWJzVGltZWNvZGUsIE1lZGlhQnVmZmVyQmFzZSAqYnVmKTsKICAgICB+V2VibUZyYW1lKCkge30KIAogICAgIHNwPFdlYm1FbGVtZW50PiBTaW1wbGVCbG9jayh1aW50NjRfdCBiYXNlVGltZWNvZGUpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuY3BwCmluZGV4IDcxYmZiYzkuLjIzMjY5YWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lVGhyZWFkLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZVRocmVhZC5jcHAKQEAgLTI1Miw3ICsyNTIsNyBAQAogfQogCiBXZWJtRnJhbWVNZWRpYVNvdXJjZVRocmVhZDo6V2VibUZyYW1lTWVkaWFTb3VyY2VUaHJlYWQoCi0gICAgICAgIGNvbnN0IHNwPElNZWRpYVNvdXJjZT4mIHNvdXJjZSwKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+JiBzb3VyY2UsCiAgICAgICAgIGludCB0eXBlLAogICAgICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgc2luaywKICAgICAgICAgdWludDY0X3QgdGltZUNvZGVTY2FsZSwKQEAgLTMzNyw3ICszMzcsNyBAQAogICAgIG1TdGFydFRpbWVVcyA9IGtVbmluaXRpYWxpemVkOwogCiAgICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKICAgICB3aGlsZSAoIW1Eb25lICYmIChlcnIgPSBtU291cmNlLT5yZWFkKCZidWZmZXIsIE5VTEwpKSA9PSBPSykgewogICAgICAgICBpZiAoYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA9PSAwKSB7CiAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKQEAgLTM0NSw4ICszNDUsOCBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICBzcDxNZXRhRGF0YT4gbWQgPSBidWZmZXItPm1ldGFfZGF0YSgpOwotICAgICAgICBDSEVDSyhtZC0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZXN0YW1wVXMpKTsKKyAgICAgICAgTWV0YURhdGFCYXNlICZtZCA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgIENIRUNLKG1kLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVzdGFtcFVzKSk7CiAgICAgICAgIGlmIChtU3RhcnRUaW1lVXMgPT0ga1VuaW5pdGlhbGl6ZWQpIHsKICAgICAgICAgICAgIG1TdGFydFRpbWVVcyA9IHRpbWVzdGFtcFVzOwogICAgICAgICB9CkBAIC0zNzQsNyArMzc0LDcgQEAKICAgICAgICAgQ0hFQ0tfR0UodGltZXN0YW1wVXMsIDBsbCk7CiAKICAgICAgICAgaW50MzJfdCBpc1N5bmMgPSBmYWxzZTsKLSAgICAgICAgbWQtPmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsICZpc1N5bmMpOworICAgICAgICBtZC5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLCAmaXNTeW5jKTsKICAgICAgICAgY29uc3Qgc3A8V2VibUZyYW1lPiBmID0gbmV3IFdlYm1GcmFtZSgKICAgICAgICAgICAgIG1UeXBlLAogICAgICAgICAgICAgaXNTeW5jLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lVGhyZWFkLmgKaW5kZXggNTI4OTg0Zi4uNzZjOTFmMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZVRocmVhZC5oCkBAIC0yMCw4ICsyMCw4IEBACiAjaW5jbHVkZSAiV2VibUZyYW1lLmgiCiAjaW5jbHVkZSAiTGlua2VkQmxvY2tpbmdRdWV1ZS5oIgogCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KIAogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KQEAgLTEyMyw3ICsxMjMsNyBAQAogY2xhc3MgV2VibUZyYW1lTWVkaWFTb3VyY2VUaHJlYWQ6IHB1YmxpYyBXZWJtRnJhbWVTb3VyY2VUaHJlYWQgewogcHVibGljOgogICAgIFdlYm1GcmFtZU1lZGlhU291cmNlVGhyZWFkKAotICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhU291cmNlPiYgc291cmNlLAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+JiBzb3VyY2UsCiAgICAgICAgICAgICBpbnQgdHlwZSwKICAgICAgICAgICAgIExpbmtlZEJsb2NraW5nUXVldWU8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBzaW5rLAogICAgICAgICAgICAgdWludDY0X3QgdGltZUNvZGVTY2FsZSwKQEAgLTE0Miw3ICsxNDIsNyBAQAogICAgIH0KIAogcHJpdmF0ZToKLSAgICBjb25zdCBzcDxJTWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CiAgICAgY29uc3QgdWludDY0X3QgbVRpbWVDb2RlU2NhbGU7CiAgICAgdWludDY0X3QgbVN0YXJ0VGltZVVzOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmNwcAppbmRleCBkNmM2OTMwLi40ZDczZWI4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5jcHAKQEAgLTM2MCw3ICszNjAsNyBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKLXN0YXR1c190IFdlYm1Xcml0ZXI6OmFkZFNvdXJjZShjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKK3N0YXR1c190IFdlYm1Xcml0ZXI6OmFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKICAgICBpZiAobVN0YXJ0ZWQpIHsKICAgICAgICAgQUxPR0UoIkF0dGVtcHQgdG8gYWRkIHNvdXJjZSBBRlRFUiByZWNvcmRpbmcgaXMgc3RhcnRlZCIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuaAppbmRleCA5ZjNiMTlmLi5mZmU0Yzc5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuaApAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgIldlYm1GcmFtZVRocmVhZC5oIgogI2luY2x1ZGUgIkxpbmtlZEJsb2NraW5nUXVldWUuaCIKIAotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVdyaXRlci5oPgogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CkBAIC00MCw3ICs0MCw3IEBACiAgICAgfldlYm1Xcml0ZXIoKSB7IHJlc2V0KCk7IH0KIAogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTb3VyY2UoY29uc3Qgc3A8SU1lZGlhU291cmNlPiAmc291cmNlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW0gPSBOVUxMKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CkBAIC04NSw3ICs4NSw3IEBACiAgICAgICAgIGNvbnN0IGNoYXIgKm1OYW1lOwogICAgICAgICBzcDxXZWJtRWxlbWVudD4gKCptTWFrZVRyYWNrKShjb25zdCBzcDxNZXRhRGF0YT4mKTsKIAotICAgICAgICBzcDxJTWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisgICAgICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOwogICAgICAgICBzcDxXZWJtRWxlbWVudD4gbVRyYWNrRW50cnk7CiAgICAgICAgIHNwPFdlYm1GcmFtZVNvdXJjZVRocmVhZD4gbVRocmVhZDsKICAgICAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZTxjb25zdCBzcDxXZWJtRnJhbWU+ID4gbVNpbms7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjA4YzViLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotY2NfbGlicmFyeV9zaGFyZWQgewotICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF93ZmQiLAotCi0gICAgc3JjczogWwotICAgICAgICAiTWVkaWFTZW5kZXIuY3BwIiwKLSAgICAgICAgIlBhcmFtZXRlcnMuY3BwIiwKLSAgICAgICAgInJ0cC9SVFBTZW5kZXIuY3BwIiwKLSAgICAgICAgInNvdXJjZS9Db252ZXJ0ZXIuY3BwIiwKLSAgICAgICAgInNvdXJjZS9NZWRpYVB1bGxlci5jcHAiLAotICAgICAgICAic291cmNlL1BsYXliYWNrU2Vzc2lvbi5jcHAiLAotICAgICAgICAic291cmNlL1JlcGVhdGVyU291cmNlLmNwcCIsCi0gICAgICAgICJzb3VyY2UvVFNQYWNrZXRpemVyLmNwcCIsCi0gICAgICAgICJzb3VyY2UvV2lmaURpc3BsYXlTb3VyY2UuY3BwIiwKLSAgICAgICAgIlZpZGVvRm9ybWF0cy5jcHAiLAotICAgIF0sCi0KLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvaGFyZHdhcmUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzIiwKLSAgICBdLAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidWkiLAotICAgICAgICAibGliZ3VpIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICBdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV25vLW11bHRpY2hhciIsCi0gICAgICAgICItV2Vycm9yIiwKLSAgICAgICAgIi1XYWxsIiwKLSAgICBdLAotCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKLSAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgICAgIF0sCi0gICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAotICAgIH0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvTWVkaWFTZW5kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L01lZGlhU2VuZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M0MTJmNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvTWVkaWFTZW5kZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTWVkaWFTZW5kZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJNZWRpYVNlbmRlci5oIgotCi0jaW5jbHVkZSAicnRwL1JUUFNlbmRlci5oIgotI2luY2x1ZGUgInNvdXJjZS9UU1BhY2tldGl6ZXIuaCIKLQotI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9JSERDUC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uaD4KLSNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotTWVkaWFTZW5kZXI6Ok1lZGlhU2VuZGVyKAotICAgICAgICBjb25zdCBzcDxBTmV0d29ya1Nlc3Npb24+ICZuZXRTZXNzaW9uLAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSkKLSAgICA6IG1OZXRTZXNzaW9uKG5ldFNlc3Npb24pLAotICAgICAgbU5vdGlmeShub3RpZnkpLAotICAgICAgbU1vZGUoTU9ERV9VTkRFRklORUQpLAotICAgICAgbUdlbmVyYXRpb24oMCksCi0gICAgICBtUHJldlRpbWVVcygtMWxsKSwKLSAgICAgIG1Jbml0RG9uZUNvdW50KDApLAotICAgICAgbUxvZ0ZpbGUoTlVMTCkgewotICAgIC8vIG1Mb2dGaWxlID0gZm9wZW4oIi9kYXRhL21pc2MvbG9nLnRzIiwgIndiIik7Ci19Ci0KLU1lZGlhU2VuZGVyOjp+TWVkaWFTZW5kZXIoKSB7Ci0gICAgaWYgKG1Mb2dGaWxlICE9IE5VTEwpIHsKLSAgICAgICAgZmNsb3NlKG1Mb2dGaWxlKTsKLSAgICAgICAgbUxvZ0ZpbGUgPSBOVUxMOwotICAgIH0KLX0KLQotc3RhdHVzX3QgTWVkaWFTZW5kZXI6OnNldEhEQ1AoY29uc3Qgc3A8SUhEQ1A+ICZoZGNwKSB7Ci0gICAgaWYgKG1Nb2RlICE9IE1PREVfVU5ERUZJTkVEKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBtSERDUCA9IGhkY3A7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXNzaXplX3QgTWVkaWFTZW5kZXI6OmFkZFRyYWNrKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCB1aW50MzJfdCBmbGFncykgewotICAgIGlmIChtTW9kZSAhPSBNT0RFX1VOREVGSU5FRCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgVHJhY2tJbmZvIGluZm87Ci0gICAgaW5mby5tRm9ybWF0ID0gZm9ybWF0OwotICAgIGluZm8ubUZsYWdzID0gZmxhZ3M7Ci0gICAgaW5mby5tUGFja2V0aXplclRyYWNrSW5kZXggPSAtMTsKLQotICAgIEFTdHJpbmcgbWltZTsKLSAgICBDSEVDSyhmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOwotICAgIGluZm8ubUlzQXVkaW8gPSAhc3RybmNhc2VjbXAoImF1ZGlvLyIsIG1pbWUuY19zdHIoKSwgNik7Ci0KLSAgICBzaXplX3QgaW5kZXggPSBtVHJhY2tJbmZvcy5zaXplKCk7Ci0gICAgbVRyYWNrSW5mb3MucHVzaF9iYWNrKGluZm8pOwotCi0gICAgcmV0dXJuIGluZGV4OwotfQotCi1zdGF0dXNfdCBNZWRpYVNlbmRlcjo6aW5pdEFzeW5jKAotICAgICAgICBzc2l6ZV90IHRyYWNrSW5kZXgsCi0gICAgICAgIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsCi0gICAgICAgIGludDMyX3QgcmVtb3RlUlRQUG9ydCwKLSAgICAgICAgUlRQU2VuZGVyOjpUcmFuc3BvcnRNb2RlIHJ0cE1vZGUsCi0gICAgICAgIGludDMyX3QgcmVtb3RlUlRDUFBvcnQsCi0gICAgICAgIFJUUFNlbmRlcjo6VHJhbnNwb3J0TW9kZSBydGNwTW9kZSwKLSAgICAgICAgaW50MzJfdCAqbG9jYWxSVFBQb3J0KSB7Ci0gICAgaWYgKHRyYWNrSW5kZXggPCAwKSB7Ci0gICAgICAgIGlmIChtTW9kZSAhPSBNT0RFX1VOREVGSU5FRCkgewotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0KLSAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOwotICAgICAgICBpZiAobUhEQ1AgIT0gTlVMTCkgewotICAgICAgICAgICAgLy8gWFhYIERldGVybWluZSBwcm9wZXIgSERDUCB2ZXJzaW9uLgotICAgICAgICAgICAgZmxhZ3MgfD0gVFNQYWNrZXRpemVyOjpFTUlUX0hEQ1AyMF9ERVNDUklQVE9SOwotICAgICAgICB9Ci0gICAgICAgIG1UU1BhY2tldGl6ZXIgPSBuZXcgVFNQYWNrZXRpemVyKGZsYWdzKTsKLQotICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tJbmZvcy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja0luZm9zLmVkaXRJdGVtQXQoaSk7Ci0KLSAgICAgICAgICAgIHNzaXplX3QgcGFja2V0aXplclRyYWNrSW5kZXggPQotICAgICAgICAgICAgICAgIG1UU1BhY2tldGl6ZXItPmFkZFRyYWNrKGluZm8tPm1Gb3JtYXQpOwotCi0gICAgICAgICAgICBpZiAocGFja2V0aXplclRyYWNrSW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcGFja2V0aXplclRyYWNrSW5kZXg7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGluZm8tPm1QYWNrZXRpemVyVHJhY2tJbmRleCA9IHBhY2tldGl6ZXJUcmFja0luZGV4OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbmRlck5vdGlmeSwgdGhpcyk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUdlbmVyYXRpb24pOwotICAgICAgICAgICAgbVRTU2VuZGVyID0gbmV3IFJUUFNlbmRlcihtTmV0U2Vzc2lvbiwgbm90aWZ5KTsKLSAgICAgICAgICAgIGxvb3BlcigpLT5yZWdpc3RlckhhbmRsZXIobVRTU2VuZGVyKTsKLQotICAgICAgICAgICAgZXJyID0gbVRTU2VuZGVyLT5pbml0QXN5bmMoCi0gICAgICAgICAgICAgICAgICAgIHJlbW90ZUhvc3QsCi0gICAgICAgICAgICAgICAgICAgIHJlbW90ZVJUUFBvcnQsCi0gICAgICAgICAgICAgICAgICAgIHJ0cE1vZGUsCi0gICAgICAgICAgICAgICAgICAgIHJlbW90ZVJUQ1BQb3J0LAotICAgICAgICAgICAgICAgICAgICBydGNwTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxSVFBQb3J0KTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIGxvb3BlcigpLT51bnJlZ2lzdGVySGFuZGxlcihtVFNTZW5kZXItPmlkKCkpOwotICAgICAgICAgICAgICAgIG1UU1NlbmRlci5jbGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tJbmZvcy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tJbmZvcy5lZGl0SXRlbUF0KGkpOwotICAgICAgICAgICAgICAgIGluZm8tPm1QYWNrZXRpemVyVHJhY2tJbmRleCA9IC0xOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtVFNQYWNrZXRpemVyLmNsZWFyKCk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgbU1vZGUgPSBNT0RFX1RSQU5TUE9SVF9TVFJFQU07Ci0gICAgICAgIG1Jbml0RG9uZUNvdW50ID0gMTsKLQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgaWYgKG1Nb2RlID09IE1PREVfVFJBTlNQT1JUX1NUUkVBTSkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgaWYgKChzaXplX3QpdHJhY2tJbmRleCA+PSBtVHJhY2tJbmZvcy5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIC1FUkFOR0U7Ci0gICAgfQotCi0gICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja0luZm9zLmVkaXRJdGVtQXQodHJhY2tJbmRleCk7Ci0KLSAgICBpZiAoaW5mby0+bVNlbmRlciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZGVyTm90aWZ5LCB0aGlzKTsKLSAgICBub3RpZnktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUdlbmVyYXRpb24pOwotICAgIG5vdGlmeS0+c2V0U2l6ZSgidHJhY2tJbmRleCIsIHRyYWNrSW5kZXgpOwotCi0gICAgaW5mby0+bVNlbmRlciA9IG5ldyBSVFBTZW5kZXIobU5ldFNlc3Npb24sIG5vdGlmeSk7Ci0gICAgbG9vcGVyKCktPnJlZ2lzdGVySGFuZGxlcihpbmZvLT5tU2VuZGVyKTsKLQotICAgIHN0YXR1c190IGVyciA9IGluZm8tPm1TZW5kZXItPmluaXRBc3luYygKLSAgICAgICAgICAgIHJlbW90ZUhvc3QsCi0gICAgICAgICAgICByZW1vdGVSVFBQb3J0LAotICAgICAgICAgICAgcnRwTW9kZSwKLSAgICAgICAgICAgIHJlbW90ZVJUQ1BQb3J0LAotICAgICAgICAgICAgcnRjcE1vZGUsCi0gICAgICAgICAgICBsb2NhbFJUUFBvcnQpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBsb29wZXIoKS0+dW5yZWdpc3RlckhhbmRsZXIoaW5mby0+bVNlbmRlci0+aWQoKSk7Ci0gICAgICAgIGluZm8tPm1TZW5kZXIuY2xlYXIoKTsKLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChtTW9kZSA9PSBNT0RFX1VOREVGSU5FRCkgewotICAgICAgICBtSW5pdERvbmVDb3VudCA9IG1UcmFja0luZm9zLnNpemUoKTsKLSAgICB9Ci0KLSAgICBtTW9kZSA9IE1PREVfRUxFTUVOVEFSWV9TVFJFQU1TOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNZWRpYVNlbmRlcjo6cXVldWVBY2Nlc3NVbml0KAotICAgICAgICBzaXplX3QgdHJhY2tJbmRleCwgY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpIHsKLSAgICBpZiAobU1vZGUgPT0gTU9ERV9VTkRFRklORUQpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIGlmICh0cmFja0luZGV4ID49IG1UcmFja0luZm9zLnNpemUoKSkgewotICAgICAgICByZXR1cm4gLUVSQU5HRTsKLSAgICB9Ci0KLSAgICBpZiAobU1vZGUgPT0gTU9ERV9UUkFOU1BPUlRfU1RSRUFNKSB7Ci0gICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tJbmZvcy5lZGl0SXRlbUF0KHRyYWNrSW5kZXgpOwotICAgICAgICBpbmZvLT5tQWNjZXNzVW5pdHMucHVzaF9iYWNrKGFjY2Vzc1VuaXQpOwotCi0gICAgICAgIG1UU1BhY2tldGl6ZXItPmV4dHJhY3RDU0RJZk5lY2Vzc2FyeShpbmZvLT5tUGFja2V0aXplclRyYWNrSW5kZXgpOwotCi0gICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgIHNzaXplX3QgbWluVHJhY2tJbmRleCA9IC0xOwotICAgICAgICAgICAgaW50NjRfdCBtaW5UaW1lVXMgPSAtMWxsOwotCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja0luZm9zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgVHJhY2tJbmZvICZpbmZvID0gbVRyYWNrSW5mb3MuaXRlbUF0KGkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGluZm8ubUFjY2Vzc1VuaXRzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWluVHJhY2tJbmRleCA9IC0xOwotICAgICAgICAgICAgICAgICAgICBtaW5UaW1lVXMgPSAtMWxsOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKLSAgICAgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCA9ICppbmZvLm1BY2Nlc3NVbml0cy5iZWdpbigpOwotICAgICAgICAgICAgICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobWluVHJhY2tJbmRleCA8IDAgfHwgdGltZVVzIDwgbWluVGltZVVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1pblRyYWNrSW5kZXggPSBpOwotICAgICAgICAgICAgICAgICAgICBtaW5UaW1lVXMgPSB0aW1lVXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobWluVHJhY2tJbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tJbmZvcy5lZGl0SXRlbUF0KG1pblRyYWNrSW5kZXgpOwotICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9ICppbmZvLT5tQWNjZXNzVW5pdHMuYmVnaW4oKTsKLSAgICAgICAgICAgIGluZm8tPm1BY2Nlc3NVbml0cy5lcmFzZShpbmZvLT5tQWNjZXNzVW5pdHMuYmVnaW4oKSk7Ci0KLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IHRzUGFja2V0czsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhY2tldGl6ZUFjY2Vzc1VuaXQoCi0gICAgICAgICAgICAgICAgICAgIG1pblRyYWNrSW5kZXgsIGFjY2Vzc1VuaXQsICZ0c1BhY2tldHMpOwotCi0gICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Mb2dGaWxlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgZndyaXRlKHRzUGFja2V0cy0+ZGF0YSgpLCAxLCB0c1BhY2tldHMtPnNpemUoKSwgbUxvZ0ZpbGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOwotICAgICAgICAgICAgICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7Ci0gICAgICAgICAgICAgICAgdHNQYWNrZXRzLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwotCi0gICAgICAgICAgICAgICAgZXJyID0gbVRTU2VuZGVyLT5xdWV1ZUJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIHRzUGFja2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgIDMzIC8qIHBhY2tldFR5cGUgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICBSVFBTZW5kZXI6OlBBQ0tFVElaQVRJT05fVFJBTlNQT1JUX1NUUkVBTSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja0luZm9zLmVkaXRJdGVtQXQodHJhY2tJbmRleCk7Ci0KLSAgICByZXR1cm4gaW5mby0+bVNlbmRlci0+cXVldWVCdWZmZXIoCi0gICAgICAgICAgICBhY2Nlc3NVbml0LAotICAgICAgICAgICAgaW5mby0+bUlzQXVkaW8gPyA5NiA6IDk3IC8qIHBhY2tldFR5cGUgKi8sCi0gICAgICAgICAgICBpbmZvLT5tSXNBdWRpbwotICAgICAgICAgICAgICAgID8gUlRQU2VuZGVyOjpQQUNLRVRJWkFUSU9OX0FBQyA6IFJUUFNlbmRlcjo6UEFDS0VUSVpBVElPTl9IMjY0KTsKLX0KLQotdm9pZCBNZWRpYVNlbmRlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7Ci0gICAgICAgIGNhc2Uga1doYXRTZW5kZXJOb3RpZnk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKLSAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IG1HZW5lcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9uU2VuZGVyTm90aWZ5KG1zZyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBUUkVTUEFTUygpOwotICAgIH0KLX0KLQotdm9pZCBNZWRpYVNlbmRlcjo6b25TZW5kZXJOb3RpZnkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBpbnQzMl90IHdoYXQ7Ci0gICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIndoYXQiLCAmd2hhdCkpOwotCi0gICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgICAgIGNhc2UgUlRQU2VuZGVyOjprV2hhdEluaXREb25lOgotICAgICAgICB7Ci0gICAgICAgICAgICAtLW1Jbml0RG9uZUNvdW50OwotCi0gICAgICAgICAgICBpbnQzMl90IGVycjsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBub3RpZnlJbml0RG9uZShlcnIpOwotICAgICAgICAgICAgICAgICsrbUdlbmVyYXRpb247Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtSW5pdERvbmVDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5SW5pdERvbmUoT0spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFJUUFNlbmRlcjo6a1doYXRFcnJvcjoKLSAgICAgICAgewotICAgICAgICAgICAgaW50MzJfdCBlcnI7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOwotCi0gICAgICAgICAgICBub3RpZnlFcnJvcihlcnIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0TmV0d29ya1N0YWxsOgotICAgICAgICB7Ci0gICAgICAgICAgICBzaXplX3QgbnVtQnl0ZXNRdWV1ZWQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJudW1CeXRlc1F1ZXVlZCIsICZudW1CeXRlc1F1ZXVlZCkpOwotCi0gICAgICAgICAgICBub3RpZnlOZXR3b3JrU3RhbGwobnVtQnl0ZXNRdWV1ZWQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0SW5mb3JtU2VuZGVyOgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQ2NF90IGF2Z0xhdGVuY3lVczsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJhdmdMYXRlbmN5VXMiLCAmYXZnTGF0ZW5jeVVzKSk7Ci0KLSAgICAgICAgICAgIGludDY0X3QgbWF4TGF0ZW5jeVVzOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoIm1heExhdGVuY3lVcyIsICZtYXhMYXRlbmN5VXMpKTsKLQotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0SW5mb3JtU2VuZGVyKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50NjQoImF2Z0xhdGVuY3lVcyIsIGF2Z0xhdGVuY3lVcyk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDY0KCJtYXhMYXRlbmN5VXMiLCBtYXhMYXRlbmN5VXMpOwotICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBUUkVTUEFTUygpOwotICAgIH0KLX0KLQotdm9pZCBNZWRpYVNlbmRlcjo6bm90aWZ5SW5pdERvbmUoc3RhdHVzX3QgZXJyKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEluaXREb25lKTsKLSAgICBub3RpZnktPnNldEludDMyKCJlcnIiLCBlcnIpOwotICAgIG5vdGlmeS0+cG9zdCgpOwotfQotCi12b2lkIE1lZGlhU2VuZGVyOjpub3RpZnlFcnJvcihzdGF0dXNfdCBlcnIpIHsKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RXJyb3IpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0gICAgbm90aWZ5LT5wb3N0KCk7Ci19Ci0KLXZvaWQgTWVkaWFTZW5kZXI6Om5vdGlmeU5ldHdvcmtTdGFsbChzaXplX3QgbnVtQnl0ZXNRdWV1ZWQpIHsKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0TmV0d29ya1N0YWxsKTsKLSAgICBub3RpZnktPnNldFNpemUoIm51bUJ5dGVzUXVldWVkIiwgbnVtQnl0ZXNRdWV1ZWQpOwotICAgIG5vdGlmeS0+cG9zdCgpOwotfQotCi1zdGF0dXNfdCBNZWRpYVNlbmRlcjo6cGFja2V0aXplQWNjZXNzVW5pdCgKLSAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXgsCi0gICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQsCi0gICAgICAgIHNwPEFCdWZmZXI+ICp0c1BhY2tldHMpIHsKLSAgICBjb25zdCBUcmFja0luZm8gJmluZm8gPSBtVHJhY2tJbmZvcy5pdGVtQXQodHJhY2tJbmRleCk7Ci0KLSAgICB1aW50MzJfdCBmbGFncyA9IDA7Ci0KLSAgICBib29sIGlzSERDUEVuY3J5cHRlZCA9IGZhbHNlOwotICAgIHVpbnQ2NF90IGlucHV0Q1RSOwotICAgIHVpbnQ4X3QgSERDUF9wcml2YXRlX2RhdGFbMTZdOwotCi0gICAgYm9vbCBtYW51YWxseVByZXBlbmRTUFNQUFMgPQotICAgICAgICAhaW5mby5tSXNBdWRpbwotICAgICAgICAmJiAoaW5mby5tRmxhZ3MgJiBGTEFHX01BTlVBTExZX1BSRVBFTkRfU1BTX1BQUykKLSAgICAgICAgJiYgSXNJRFIoYWNjZXNzVW5pdCk7Ci0KLSAgICBpZiAobUhEQ1AgIT0gTlVMTCAmJiAhaW5mby5tSXNBdWRpbykgewotICAgICAgICBpc0hEQ1BFbmNyeXB0ZWQgPSB0cnVlOwotCi0gICAgICAgIGlmIChtYW51YWxseVByZXBlbmRTUFNQUFMpIHsKLSAgICAgICAgICAgIGFjY2Vzc1VuaXQgPSBtVFNQYWNrZXRpemVyLT5wcmVwZW5kQ1NEKAotICAgICAgICAgICAgICAgICAgICBpbmZvLm1QYWNrZXRpemVyVHJhY2tJbmRleCwgYWNjZXNzVW5pdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlOwotICAgICAgICBpZiAoYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kUG9pbnRlcigiaGFuZGxlIiwgKHZvaWQqKikmaGFuZGxlKQotICAgICAgICAgICAgICAgICYmIGhhbmRsZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpbnQzMl90IHJhbmdlTGVuZ3RoLCByYW5nZU9mZnNldDsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnk7Ci0gICAgICAgICAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQzMigicmFuZ2VPZmZzZXQiLCAmcmFuZ2VPZmZzZXQpKTsKLSAgICAgICAgICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDMyKCJyYW5nZUxlbmd0aCIsICZyYW5nZUxlbmd0aCkpOwotICAgICAgICAgICAgQ0hFQ0soYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kTWVzc2FnZSgibm90aWZ5IiwgJm5vdGlmeSkKLSAgICAgICAgICAgICAgICAgICAgJiYgbm90aWZ5ICE9IE5VTEwpOwotICAgICAgICAgICAgQ0hFQ0tfR0UoKGludDMyX3QpYWNjZXNzVW5pdC0+c2l6ZSgpLCByYW5nZUxlbmd0aCk7Ci0KLSAgICAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdyYnVmKG5ldyBHcmFwaGljQnVmZmVyKAotICAgICAgICAgICAgICAgICAgICByYW5nZU9mZnNldCArIHJhbmdlTGVuZ3RoIC8qIHdpZHRoICovLCAxIC8qIGhlaWdodCAqLywKLSAgICAgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZOCwgMSAvKiBsYXllckNvdW50ICovLAotICAgICAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIsCi0gICAgICAgICAgICAgICAgICAgIHJhbmdlT2Zmc2V0ICsgcmFuZ2VMZW5ndGggLyogc3RyaWRlICovLCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGtlZXBPd25lcnNoaXAgKi8pKTsKLQotICAgICAgICAgICAgZXJyID0gbUhEQ1AtPmVuY3J5cHROYXRpdmUoCi0gICAgICAgICAgICAgICAgICAgIGdyYnVmLCByYW5nZU9mZnNldCwgcmFuZ2VMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgIHRyYWNrSW5kZXggIC8qIHN0cmVhbUNUUiAqLywKLSAgICAgICAgICAgICAgICAgICAgJmlucHV0Q1RSLAotICAgICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5kYXRhKCkpOwotICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlcnIgPSBtSERDUC0+ZW5jcnlwdCgKLSAgICAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+ZGF0YSgpLCBhY2Nlc3NVbml0LT5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgIHRyYWNrSW5kZXggIC8qIHN0cmVhbUNUUiAqLywKLSAgICAgICAgICAgICAgICAgICAgJmlucHV0Q1RSLAotICAgICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5kYXRhKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBIRENQLWVuY3J5cHQgbWVkaWEgZGF0YSAoZXJyICVkKSIsCi0gICAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgSERDUF9wcml2YXRlX2RhdGFbMF0gPSAweDAwOwotCi0gICAgICAgIEhEQ1BfcHJpdmF0ZV9kYXRhWzFdID0KLSAgICAgICAgICAgICgoKHRyYWNrSW5kZXggPj4gMzApICYgMykgPDwgMSkgfCAxOwotCi0gICAgICAgIEhEQ1BfcHJpdmF0ZV9kYXRhWzJdID0gKHRyYWNrSW5kZXggPj4gMjIpICYgMHhmZjsKLQotICAgICAgICBIRENQX3ByaXZhdGVfZGF0YVszXSA9Ci0gICAgICAgICAgICAoKCh0cmFja0luZGV4ID4+IDE1KSAmIDB4N2YpIDw8IDEpIHwgMTsKLQotICAgICAgICBIRENQX3ByaXZhdGVfZGF0YVs0XSA9ICh0cmFja0luZGV4ID4+IDcpICYgMHhmZjsKLQotICAgICAgICBIRENQX3ByaXZhdGVfZGF0YVs1XSA9Ci0gICAgICAgICAgICAoKHRyYWNrSW5kZXggJiAweDdmKSA8PCAxKSB8IDE7Ci0KLSAgICAgICAgSERDUF9wcml2YXRlX2RhdGFbNl0gPSAweDAwOwotCi0gICAgICAgIEhEQ1BfcHJpdmF0ZV9kYXRhWzddID0KLSAgICAgICAgICAgICgoKGlucHV0Q1RSID4+IDYwKSAmIDB4MGYpIDw8IDEpIHwgMTsKLQotICAgICAgICBIRENQX3ByaXZhdGVfZGF0YVs4XSA9IChpbnB1dENUUiA+PiA1MikgJiAweGZmOwotCi0gICAgICAgIEhEQ1BfcHJpdmF0ZV9kYXRhWzldID0KLSAgICAgICAgICAgICgoKGlucHV0Q1RSID4+IDQ1KSAmIDB4N2YpIDw8IDEpIHwgMTsKLQotICAgICAgICBIRENQX3ByaXZhdGVfZGF0YVsxMF0gPSAoaW5wdXRDVFIgPj4gMzcpICYgMHhmZjsKLQotICAgICAgICBIRENQX3ByaXZhdGVfZGF0YVsxMV0gPQotICAgICAgICAgICAgKCgoaW5wdXRDVFIgPj4gMzApICYgMHg3ZikgPDwgMSkgfCAxOwotCi0gICAgICAgIEhEQ1BfcHJpdmF0ZV9kYXRhWzEyXSA9IChpbnB1dENUUiA+PiAyMikgJiAweGZmOwotCi0gICAgICAgIEhEQ1BfcHJpdmF0ZV9kYXRhWzEzXSA9Ci0gICAgICAgICAgICAoKChpbnB1dENUUiA+PiAxNSkgJiAweDdmKSA8PCAxKSB8IDE7Ci0KLSAgICAgICAgSERDUF9wcml2YXRlX2RhdGFbMTRdID0gKGlucHV0Q1RSID4+IDcpICYgMHhmZjsKLQotICAgICAgICBIRENQX3ByaXZhdGVfZGF0YVsxNV0gPQotICAgICAgICAgICAgKChpbnB1dENUUiAmIDB4N2YpIDw8IDEpIHwgMTsKLQotICAgICAgICBmbGFncyB8PSBUU1BhY2tldGl6ZXI6OklTX0VOQ1JZUFRFRDsKLSAgICB9IGVsc2UgaWYgKG1hbnVhbGx5UHJlcGVuZFNQU1BQUykgewotICAgICAgICBmbGFncyB8PSBUU1BhY2tldGl6ZXI6OlBSRVBFTkRfU1BTX1BQU19UT19JRFJfRlJBTUVTOwotICAgIH0KLQotICAgIGludDY0X3QgdGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICBpZiAobVByZXZUaW1lVXMgPCAwbGwgfHwgbVByZXZUaW1lVXMgKyAxMDAwMDBsbCA8PSB0aW1lVXMpIHsKLSAgICAgICAgZmxhZ3MgfD0gVFNQYWNrZXRpemVyOjpFTUlUX1BDUjsKLSAgICAgICAgZmxhZ3MgfD0gVFNQYWNrZXRpemVyOjpFTUlUX1BBVF9BTkRfUE1UOwotCi0gICAgICAgIG1QcmV2VGltZVVzID0gdGltZVVzOwotICAgIH0KLQotICAgIG1UU1BhY2tldGl6ZXItPnBhY2tldGl6ZSgKLSAgICAgICAgICAgIGluZm8ubVBhY2tldGl6ZXJUcmFja0luZGV4LAotICAgICAgICAgICAgYWNjZXNzVW5pdCwKLSAgICAgICAgICAgIHRzUGFja2V0cywKLSAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgIWlzSERDUEVuY3J5cHRlZCA/IE5VTEwgOiBIRENQX3ByaXZhdGVfZGF0YSwKLSAgICAgICAgICAgICFpc0hEQ1BFbmNyeXB0ZWQgPyAwIDogc2l6ZW9mKEhEQ1BfcHJpdmF0ZV9kYXRhKSwKLSAgICAgICAgICAgIGluZm8ubUlzQXVkaW8gPyAyIDogMCAvKiBudW1TdHVmZmluZ0J5dGVzICovKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L01lZGlhU2VuZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvTWVkaWFTZW5kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ1MzhlYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvTWVkaWFTZW5kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX1NFTkRFUl9IXwotCi0jZGVmaW5lIE1FRElBX1NFTkRFUl9IXwotCi0jaW5jbHVkZSAicnRwL1JUUFNlbmRlci5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgQUJ1ZmZlcjsKLXN0cnVjdCBBTmV0d29ya1Nlc3Npb247Ci1zdHJ1Y3QgQU1lc3NhZ2U7Ci1zdHJ1Y3QgSUhEQ1A7Ci1zdHJ1Y3QgVFNQYWNrZXRpemVyOwotCi0vLyBUaGlzIGNsYXNzIGZhY2lsaXRhdGVzIHNlbmRpbmcgb2YgZGF0YSBmcm9tIG9uZSBvciBtb3JlIG1lZGlhIHRyYWNrcwotLy8gdGhyb3VnaCBvbmUgb3IgbW9yZSBSVFAgY2hhbm5lbHMsIGVpdGhlciBwcm92aWRpbmcgYSAxOjEgbWFwcGluZyBmcm9tCi0vLyB0cmFjayB0byBSVFAgY2hhbm5lbCBvciBtdXhpbmcgYWxsIHRyYWNrcyBpbnRvIGEgc2luZ2xlIFJUUCBjaGFubmVsIGFuZAotLy8gdXNpbmcgdHJhbnNwb3J0IHN0cmVhbSBlbmNhcHN1bGF0aW9uLgotLy8gT3B0aW9uYWxseSB0aGUgKHZpZGVvKSBkYXRhIGlzIGVuY3J5cHRlZCB1c2luZyB0aGUgcHJvdmlkZWQgaGRjcCBvYmplY3QuCi1zdHJ1Y3QgTWVkaWFTZW5kZXIgOiBwdWJsaWMgQUhhbmRsZXIgewotICAgIGVudW0gewotICAgICAgICBrV2hhdEluaXREb25lLAotICAgICAgICBrV2hhdEVycm9yLAotICAgICAgICBrV2hhdE5ldHdvcmtTdGFsbCwKLSAgICAgICAga1doYXRJbmZvcm1TZW5kZXIsCi0gICAgfTsKLQotICAgIE1lZGlhU2VuZGVyKAotICAgICAgICAgICAgY29uc3Qgc3A8QU5ldHdvcmtTZXNzaW9uPiAmbmV0U2Vzc2lvbiwKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KTsKLQotICAgIHN0YXR1c190IHNldEhEQ1AoY29uc3Qgc3A8SUhEQ1A+ICZoZGNwKTsKLQotICAgIGVudW0gRmxhZ0JpdHMgewotICAgICAgICBGTEFHX01BTlVBTExZX1BSRVBFTkRfU1BTX1BQUyA9IDEsCi0gICAgfTsKLSAgICBzc2l6ZV90IGFkZFRyYWNrKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCB1aW50MzJfdCBmbGFncyk7Ci0KLSAgICAvLyBJZiB0cmFja0luZGV4ID09IC0xLCBpbml0aWFsaXplIGZvciB0cmFuc3BvcnQgc3RyZWFtIG11eGluZy4KLSAgICBzdGF0dXNfdCBpbml0QXN5bmMoCi0gICAgICAgICAgICBzc2l6ZV90IHRyYWNrSW5kZXgsCi0gICAgICAgICAgICBjb25zdCBjaGFyICpyZW1vdGVIb3N0LAotICAgICAgICAgICAgaW50MzJfdCByZW1vdGVSVFBQb3J0LAotICAgICAgICAgICAgUlRQU2VuZGVyOjpUcmFuc3BvcnRNb2RlIHJ0cE1vZGUsCi0gICAgICAgICAgICBpbnQzMl90IHJlbW90ZVJUQ1BQb3J0LAotICAgICAgICAgICAgUlRQU2VuZGVyOjpUcmFuc3BvcnRNb2RlIHJ0Y3BNb2RlLAotICAgICAgICAgICAgaW50MzJfdCAqbG9jYWxSVFBQb3J0KTsKLQotICAgIHN0YXR1c190IHF1ZXVlQWNjZXNzVW5pdCgKLSAgICAgICAgICAgIHNpemVfdCB0cmFja0luZGV4LCBjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotICAgIHZpcnR1YWwgfk1lZGlhU2VuZGVyKCk7Ci0KLXByaXZhdGU6Ci0gICAgZW51bSB7Ci0gICAgICAgIGtXaGF0U2VuZGVyTm90aWZ5LAotICAgIH07Ci0KLSAgICBlbnVtIE1vZGUgewotICAgICAgICBNT0RFX1VOREVGSU5FRCwKLSAgICAgICAgTU9ERV9UUkFOU1BPUlRfU1RSRUFNLAotICAgICAgICBNT0RFX0VMRU1FTlRBUllfU1RSRUFNUywKLSAgICB9OwotCi0gICAgc3RydWN0IFRyYWNrSW5mbyB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0OwotICAgICAgICB1aW50MzJfdCBtRmxhZ3M7Ci0gICAgICAgIHNwPFJUUFNlbmRlcj4gbVNlbmRlcjsKLSAgICAgICAgTGlzdDxzcDxBQnVmZmVyPiA+IG1BY2Nlc3NVbml0czsKLSAgICAgICAgc3NpemVfdCBtUGFja2V0aXplclRyYWNrSW5kZXg7Ci0gICAgICAgIGJvb2wgbUlzQXVkaW87Ci0gICAgfTsKLQotICAgIHNwPEFOZXR3b3JrU2Vzc2lvbj4gbU5ldFNlc3Npb247Ci0gICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7Ci0KLSAgICBzcDxJSERDUD4gbUhEQ1A7Ci0KLSAgICBNb2RlIG1Nb2RlOwotICAgIGludDMyX3QgbUdlbmVyYXRpb247Ci0KLSAgICBWZWN0b3I8VHJhY2tJbmZvPiBtVHJhY2tJbmZvczsKLQotICAgIHNwPFRTUGFja2V0aXplcj4gbVRTUGFja2V0aXplcjsKLSAgICBzcDxSVFBTZW5kZXI+IG1UU1NlbmRlcjsKLSAgICBpbnQ2NF90IG1QcmV2VGltZVVzOwotCi0gICAgc2l6ZV90IG1Jbml0RG9uZUNvdW50OwotCi0gICAgRklMRSAqbUxvZ0ZpbGU7Ci0KLSAgICB2b2lkIG9uU2VuZGVyTm90aWZ5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLQotICAgIHZvaWQgbm90aWZ5SW5pdERvbmUoc3RhdHVzX3QgZXJyKTsKLSAgICB2b2lkIG5vdGlmeUVycm9yKHN0YXR1c190IGVycik7Ci0gICAgdm9pZCBub3RpZnlOZXR3b3JrU3RhbGwoc2l6ZV90IG51bUJ5dGVzUXVldWVkKTsKLQotICAgIHN0YXR1c190IHBhY2tldGl6ZUFjY2Vzc1VuaXQoCi0gICAgICAgICAgICBzaXplX3QgdHJhY2tJbmRleCwKLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQsCi0gICAgICAgICAgICBzcDxBQnVmZmVyPiAqdHNQYWNrZXRzKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lZGlhU2VuZGVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTUVESUFfU0VOREVSX0hfCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9QYXJhbWV0ZXJzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9QYXJhbWV0ZXJzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJhNjFlYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvUGFyYW1ldGVycy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiUGFyYW1ldGVycy5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBzdGF0aWMKLXNwPFBhcmFtZXRlcnM+IFBhcmFtZXRlcnM6OlBhcnNlKGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgc3A8UGFyYW1ldGVycz4gcGFyYW1zID0gbmV3IFBhcmFtZXRlcnM7Ci0gICAgc3RhdHVzX3QgZXJyID0gcGFyYW1zLT5wYXJzZShkYXRhLCBzaXplKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIHBhcmFtczsKLX0KLQotUGFyYW1ldGVyczo6UGFyYW1ldGVycygpIHt9Ci0KLVBhcmFtZXRlcnM6On5QYXJhbWV0ZXJzKCkge30KLQotc3RhdHVzX3QgUGFyYW1ldGVyczo6cGFyc2UoY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBzaXplX3QgaSA9IDA7Ci0gICAgd2hpbGUgKGkgPCBzaXplKSB7Ci0gICAgICAgIHNpemVfdCBuYW1lU3RhcnQgPSBpOwotICAgICAgICB3aGlsZSAoaSA8IHNpemUgJiYgZGF0YVtpXSAhPSAnOicpIHsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpID09IHNpemUgfHwgaSA9PSBuYW1lU3RhcnQpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBBU3RyaW5nIG5hbWUoJmRhdGFbbmFtZVN0YXJ0XSwgaSAtIG5hbWVTdGFydCk7Ci0gICAgICAgIG5hbWUudHJpbSgpOwotICAgICAgICBuYW1lLnRvbG93ZXIoKTsKLQotICAgICAgICArK2k7Ci0KLSAgICAgICAgc2l6ZV90IHZhbHVlU3RhcnQgPSBpOwotCi0gICAgICAgIHdoaWxlIChpICsgMSA8IHNpemUgJiYgKGRhdGFbaV0gIT0gJ1xyJyB8fCBkYXRhW2kgKyAxXSAhPSAnXG4nKSkgewotICAgICAgICAgICAgKytpOwotICAgICAgICB9Ci0KLSAgICAgICAgQVN0cmluZyB2YWx1ZSgmZGF0YVt2YWx1ZVN0YXJ0XSwgaSAtIHZhbHVlU3RhcnQpOwotICAgICAgICB2YWx1ZS50cmltKCk7Ci0KLSAgICAgICAgbURpY3QuYWRkKG5hbWUsIHZhbHVlKTsKLQotICAgICAgICB3aGlsZSAoaSArIDEgPCBzaXplICYmIGRhdGFbaV0gPT0gJ1xyJyAmJiBkYXRhW2kgKyAxXSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICBpICs9IDI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLWJvb2wgUGFyYW1ldGVyczo6ZmluZFBhcmFtZXRlcihjb25zdCBjaGFyICpuYW1lLCBBU3RyaW5nICp2YWx1ZSkgY29uc3QgewotICAgIEFTdHJpbmcga2V5ID0gbmFtZTsKLSAgICBrZXkudG9sb3dlcigpOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1EaWN0LmluZGV4T2ZLZXkoa2V5KTsKLQotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgdmFsdWUtPmNsZWFyKCk7Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgICp2YWx1ZSA9IG1EaWN0LnZhbHVlQXQoaW5kZXgpOwotICAgIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L1BhcmFtZXRlcnMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9QYXJhbWV0ZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZTc4N2UuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L1BhcmFtZXRlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IFBhcmFtZXRlcnMgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgc3RhdGljIHNwPFBhcmFtZXRlcnM+IFBhcnNlKGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIGJvb2wgZmluZFBhcmFtZXRlcihjb25zdCBjaGFyICpuYW1lLCBBU3RyaW5nICp2YWx1ZSkgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5QYXJhbWV0ZXJzKCk7Ci0KLXByaXZhdGU6Ci0gICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgQVN0cmluZz4gbURpY3Q7Ci0KLSAgICBQYXJhbWV0ZXJzKCk7Ci0gICAgc3RhdHVzX3QgcGFyc2UoY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUGFyYW1ldGVycyk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L1ZpZGVvRm9ybWF0cy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvVmlkZW9Gb3JtYXRzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJjNTExYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvVmlkZW9Gb3JtYXRzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIlZpZGVvRm9ybWF0cyIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIlZpZGVvRm9ybWF0cy5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBzdGF0aWMKLWNvbnN0IFZpZGVvRm9ybWF0czo6Y29uZmlnX3QgVmlkZW9Gb3JtYXRzOjptUmVzb2x1dGlvblRhYmxlW11bMzJdID0gewotICAgIHsKLSAgICAgICAgLy8gQ0VBIFJlc29sdXRpb25zCi0gICAgICAgIHsgNjQwLCA0ODAsIDYwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgNzIwLCA0ODAsIDYwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgNzIwLCA0ODAsIDYwLCB0cnVlLCAwLCAwfSwKLSAgICAgICAgeyA3MjAsIDU3NiwgNTAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyA3MjAsIDU3NiwgNTAsIHRydWUsIDAsIDB9LAotICAgICAgICB7IDEyODAsIDcyMCwgMzAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAxMjgwLCA3MjAsIDYwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMTkyMCwgMTA4MCwgMzAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAxOTIwLCAxMDgwLCA2MCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDE5MjAsIDEwODAsIDYwLCB0cnVlLCAwLCAwfSwKLSAgICAgICAgeyAxMjgwLCA3MjAsIDI1LCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMTI4MCwgNzIwLCA1MCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDE5MjAsIDEwODAsIDI1LCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMTkyMCwgMTA4MCwgNTAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAxOTIwLCAxMDgwLCA1MCwgdHJ1ZSwgMCwgMH0sCi0gICAgICAgIHsgMTI4MCwgNzIwLCAyNCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDE5MjAsIDEwODAsIDI0LCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMCwgMCwgMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDAsIDAsIDAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAwLCAwLCAwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMCwgMCwgMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDAsIDAsIDAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAwLCAwLCAwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMCwgMCwgMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDAsIDAsIDAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAwLCAwLCAwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMCwgMCwgMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDAsIDAsIDAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAwLCAwLCAwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMCwgMCwgMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDAsIDAsIDAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAwLCAwLCAwLCBmYWxzZSwgMCwgMH0sCi0gICAgfSwKLSAgICB7Ci0gICAgICAgIC8vIFZFU0EgUmVzb2x1dGlvbnMKLSAgICAgICAgeyA4MDAsIDYwMCwgMzAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyA4MDAsIDYwMCwgNjAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAxMDI0LCA3NjgsIDMwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMTAyNCwgNzY4LCA2MCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDExNTIsIDg2NCwgMzAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAxMTUyLCA4NjQsIDYwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMTI4MCwgNzY4LCAzMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDEyODAsIDc2OCwgNjAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAxMjgwLCA4MDAsIDMwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMTI4MCwgODAwLCA2MCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDEzNjAsIDc2OCwgMzAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAxMzYwLCA3NjgsIDYwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMTM2NiwgNzY4LCAzMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDEzNjYsIDc2OCwgNjAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAxMjgwLCAxMDI0LCAzMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDEyODAsIDEwMjQsIDYwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMTQwMCwgMTA1MCwgMzAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAxNDAwLCAxMDUwLCA2MCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDE0NDAsIDkwMCwgMzAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAxNDQwLCA5MDAsIDYwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMTYwMCwgOTAwLCAzMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDE2MDAsIDkwMCwgNjAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAxNjAwLCAxMjAwLCAzMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDE2MDAsIDEyMDAsIDYwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMTY4MCwgMTAyNCwgMzAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAxNjgwLCAxMDI0LCA2MCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDE2ODAsIDEwNTAsIDMwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMTY4MCwgMTA1MCwgNjAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAxOTIwLCAxMjAwLCAzMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDE5MjAsIDEyMDAsIDYwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMCwgMCwgMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDAsIDAsIDAsIGZhbHNlLCAwLCAwfSwKLSAgICB9LAotICAgIHsKLSAgICAgICAgLy8gSEggUmVzb2x1dGlvbnMKLSAgICAgICAgeyA4MDAsIDQ4MCwgMzAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyA4MDAsIDQ4MCwgNjAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyA4NTQsIDQ4MCwgMzAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyA4NTQsIDQ4MCwgNjAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyA4NjQsIDQ4MCwgMzAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyA4NjQsIDQ4MCwgNjAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyA2NDAsIDM2MCwgMzAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyA2NDAsIDM2MCwgNjAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyA5NjAsIDU0MCwgMzAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyA5NjAsIDU0MCwgNjAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyA4NDgsIDQ4MCwgMzAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyA4NDgsIDQ4MCwgNjAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAwLCAwLCAwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMCwgMCwgMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDAsIDAsIDAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAwLCAwLCAwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMCwgMCwgMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDAsIDAsIDAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAwLCAwLCAwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMCwgMCwgMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDAsIDAsIDAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAwLCAwLCAwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMCwgMCwgMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDAsIDAsIDAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAwLCAwLCAwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMCwgMCwgMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDAsIDAsIDAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAwLCAwLCAwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMCwgMCwgMCwgZmFsc2UsIDAsIDB9LAotICAgICAgICB7IDAsIDAsIDAsIGZhbHNlLCAwLCAwfSwKLSAgICAgICAgeyAwLCAwLCAwLCBmYWxzZSwgMCwgMH0sCi0gICAgICAgIHsgMCwgMCwgMCwgZmFsc2UsIDAsIDB9LAotICAgIH0KLX07Ci0KLVZpZGVvRm9ybWF0czo6VmlkZW9Gb3JtYXRzKCkgewotICAgIG1lbWNweShtQ29uZmlncywgbVJlc29sdXRpb25UYWJsZSwgc2l6ZW9mKG1Db25maWdzKSk7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1SZXNvbHV0aW9uVHlwZXM7ICsraSkgewotICAgICAgICBtUmVzb2x1dGlvbkVuYWJsZWRbaV0gPSAwOwotICAgIH0KLQotICAgIHNldE5hdGl2ZVJlc29sdXRpb24oUkVTT0xVVElPTl9DRUEsIDApOyAgLy8gZGVmYXVsdCB0byA2NDB4NDgwIHA2MAotfQotCi12b2lkIFZpZGVvRm9ybWF0czo6c2V0TmF0aXZlUmVzb2x1dGlvbihSZXNvbHV0aW9uVHlwZSB0eXBlLCBzaXplX3QgaW5kZXgpIHsKLSAgICBDSEVDS19MVCh0eXBlLCBrTnVtUmVzb2x1dGlvblR5cGVzKTsKLSAgICBDSEVDSyhHZXRDb25maWd1cmF0aW9uKHR5cGUsIGluZGV4LCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSk7Ci0KLSAgICBtTmF0aXZlVHlwZSA9IHR5cGU7Ci0gICAgbU5hdGl2ZUluZGV4ID0gaW5kZXg7Ci0KLSAgICBzZXRSZXNvbHV0aW9uRW5hYmxlZCh0eXBlLCBpbmRleCk7Ci19Ci0KLXZvaWQgVmlkZW9Gb3JtYXRzOjpnZXROYXRpdmVSZXNvbHV0aW9uKAotICAgICAgICBSZXNvbHV0aW9uVHlwZSAqdHlwZSwgc2l6ZV90ICppbmRleCkgY29uc3QgewotICAgICp0eXBlID0gbU5hdGl2ZVR5cGU7Ci0gICAgKmluZGV4ID0gbU5hdGl2ZUluZGV4OwotfQotCi12b2lkIFZpZGVvRm9ybWF0czo6ZGlzYWJsZUFsbCgpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1SZXNvbHV0aW9uVHlwZXM7ICsraSkgewotICAgICAgICBtUmVzb2x1dGlvbkVuYWJsZWRbaV0gPSAwOwotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IDMyOyBqKyspIHsKLSAgICAgICAgICAgIG1Db25maWdzW2ldW2pdLnByb2ZpbGUgPSBtQ29uZmlnc1tpXVtqXS5sZXZlbCA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgVmlkZW9Gb3JtYXRzOjplbmFibGVBbGwoKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtUmVzb2x1dGlvblR5cGVzOyArK2kpIHsKLSAgICAgICAgbVJlc29sdXRpb25FbmFibGVkW2ldID0gMHhmZmZmZmZmZjsKLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCAzMjsgaisrKSB7Ci0gICAgICAgICAgICBtQ29uZmlnc1tpXVtqXS5wcm9maWxlID0gKDF1bCA8PCBQUk9GSUxFX0NCUCk7Ci0gICAgICAgICAgICBtQ29uZmlnc1tpXVtqXS5sZXZlbCA9ICgxdWwgPDwgTEVWRUxfMzEpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIFZpZGVvRm9ybWF0czo6ZW5hYmxlUmVzb2x1dGlvblVwdG8oCi0gICAgICAgIFJlc29sdXRpb25UeXBlIHR5cGUsIHNpemVfdCBpbmRleCwKLSAgICAgICAgUHJvZmlsZVR5cGUgcHJvZmlsZSwgTGV2ZWxUeXBlIGxldmVsKSB7Ci0gICAgc2l6ZV90IHdpZHRoLCBoZWlnaHQsIGZwcywgc2NvcmU7Ci0gICAgYm9vbCBpbnRlcmxhY2VkOwotICAgIGlmICghR2V0Q29uZmlndXJhdGlvbih0eXBlLCBpbmRleCwgJndpZHRoLCAmaGVpZ2h0LAotICAgICAgICAgICAgJmZwcywgJmludGVybGFjZWQpKSB7Ci0gICAgICAgIEFMT0dFKCJNYXhpbXVtIHJlc29sdXRpb24gbm90IGZvdW5kISIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHNjb3JlID0gd2lkdGggKiBoZWlnaHQgKiBmcHMgKiAoIWludGVybGFjZWQgKyAxKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1SZXNvbHV0aW9uVHlwZXM7ICsraSkgewotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IDMyOyBqKyspIHsKLSAgICAgICAgICAgIGlmIChHZXRDb25maWd1cmF0aW9uKChSZXNvbHV0aW9uVHlwZSlpLCBqLAotICAgICAgICAgICAgICAgICAgICAmd2lkdGgsICZoZWlnaHQsICZmcHMsICZpbnRlcmxhY2VkKQotICAgICAgICAgICAgICAgICAgICAmJiBzY29yZSA+PSB3aWR0aCAqIGhlaWdodCAqIGZwcyAqICghaW50ZXJsYWNlZCArIDEpKSB7Ci0gICAgICAgICAgICAgICAgc2V0UmVzb2x1dGlvbkVuYWJsZWQoKFJlc29sdXRpb25UeXBlKWksIGopOwotICAgICAgICAgICAgICAgIHNldFByb2ZpbGVMZXZlbCgoUmVzb2x1dGlvblR5cGUpaSwgaiwgcHJvZmlsZSwgbGV2ZWwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIFZpZGVvRm9ybWF0czo6c2V0UmVzb2x1dGlvbkVuYWJsZWQoCi0gICAgICAgIFJlc29sdXRpb25UeXBlIHR5cGUsIHNpemVfdCBpbmRleCwgYm9vbCBlbmFibGVkKSB7Ci0gICAgQ0hFQ0tfTFQodHlwZSwga051bVJlc29sdXRpb25UeXBlcyk7Ci0gICAgQ0hFQ0soR2V0Q29uZmlndXJhdGlvbih0eXBlLCBpbmRleCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkpOwotCi0gICAgaWYgKGVuYWJsZWQpIHsKLSAgICAgICAgbVJlc29sdXRpb25FbmFibGVkW3R5cGVdIHw9ICgxdWwgPDwgaW5kZXgpOwotICAgICAgICBtQ29uZmlnc1t0eXBlXVtpbmRleF0ucHJvZmlsZSA9ICgxdWwgPDwgUFJPRklMRV9DQlApOwotICAgICAgICBtQ29uZmlnc1t0eXBlXVtpbmRleF0ubGV2ZWwgPSAoMXVsIDw8IExFVkVMXzMxKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtUmVzb2x1dGlvbkVuYWJsZWRbdHlwZV0gJj0gfigxdWwgPDwgaW5kZXgpOwotICAgICAgICBtQ29uZmlnc1t0eXBlXVtpbmRleF0ucHJvZmlsZSA9IDA7Ci0gICAgICAgIG1Db25maWdzW3R5cGVdW2luZGV4XS5sZXZlbCA9IDA7Ci0gICAgfQotfQotCi12b2lkIFZpZGVvRm9ybWF0czo6c2V0UHJvZmlsZUxldmVsKAotICAgICAgICBSZXNvbHV0aW9uVHlwZSB0eXBlLCBzaXplX3QgaW5kZXgsCi0gICAgICAgIFByb2ZpbGVUeXBlIHByb2ZpbGUsIExldmVsVHlwZSBsZXZlbCkgewotICAgIENIRUNLX0xUKHR5cGUsIGtOdW1SZXNvbHV0aW9uVHlwZXMpOwotICAgIENIRUNLKEdldENvbmZpZ3VyYXRpb24odHlwZSwgaW5kZXgsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpKTsKLQotICAgIG1Db25maWdzW3R5cGVdW2luZGV4XS5wcm9maWxlID0gKDF1bCA8PCBwcm9maWxlKTsKLSAgICBtQ29uZmlnc1t0eXBlXVtpbmRleF0ubGV2ZWwgPSAoMXVsIDw8IGxldmVsKTsKLX0KLQotdm9pZCBWaWRlb0Zvcm1hdHM6OmdldFByb2ZpbGVMZXZlbCgKLSAgICAgICAgUmVzb2x1dGlvblR5cGUgdHlwZSwgc2l6ZV90IGluZGV4LAotICAgICAgICBQcm9maWxlVHlwZSAqcHJvZmlsZSwgTGV2ZWxUeXBlICpsZXZlbCkgY29uc3R7Ci0gICAgQ0hFQ0tfTFQodHlwZSwga051bVJlc29sdXRpb25UeXBlcyk7Ci0gICAgQ0hFQ0soR2V0Q29uZmlndXJhdGlvbih0eXBlLCBpbmRleCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkpOwotCi0gICAgaW50IGksIGJlc3RQcm9maWxlID0gLTEsIGJlc3RMZXZlbCA9IC0xOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGtOdW1Qcm9maWxlVHlwZXM7ICsraSkgewotICAgICAgICBpZiAobUNvbmZpZ3NbdHlwZV1baW5kZXhdLnByb2ZpbGUgJiAoMXVsIDw8IGkpKSB7Ci0gICAgICAgICAgICBiZXN0UHJvZmlsZSA9IGk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwga051bUxldmVsVHlwZXM7ICsraSkgewotICAgICAgICBpZiAobUNvbmZpZ3NbdHlwZV1baW5kZXhdLmxldmVsICYgKDF1bCA8PCBpKSkgewotICAgICAgICAgICAgYmVzdExldmVsID0gaTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChiZXN0UHJvZmlsZSA9PSAtMSB8fCBiZXN0TGV2ZWwgPT0gLTEpIHsKLSAgICAgICAgQUxPR0UoIlByb2ZpbGUgb3IgbGV2ZWwgbm90IHNldCBmb3IgcmVzb2x1dGlvbiB0eXBlICVkLCBpbmRleCAlenUiLAotICAgICAgICAgICAgICAgIHR5cGUsIGluZGV4KTsKLSAgICAgICAgYmVzdFByb2ZpbGUgPSBQUk9GSUxFX0NCUDsKLSAgICAgICAgYmVzdExldmVsID0gTEVWRUxfMzE7Ci0gICAgfQotCi0gICAgKnByb2ZpbGUgPSAoUHJvZmlsZVR5cGUpIGJlc3RQcm9maWxlOwotICAgICpsZXZlbCA9IChMZXZlbFR5cGUpIGJlc3RMZXZlbDsKLX0KLQotYm9vbCBWaWRlb0Zvcm1hdHM6OmlzUmVzb2x1dGlvbkVuYWJsZWQoCi0gICAgICAgIFJlc29sdXRpb25UeXBlIHR5cGUsIHNpemVfdCBpbmRleCkgY29uc3QgewotICAgIENIRUNLX0xUKHR5cGUsIGtOdW1SZXNvbHV0aW9uVHlwZXMpOwotICAgIENIRUNLKEdldENvbmZpZ3VyYXRpb24odHlwZSwgaW5kZXgsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpKTsKLQotICAgIHJldHVybiBtUmVzb2x1dGlvbkVuYWJsZWRbdHlwZV0gJiAoMXVsIDw8IGluZGV4KTsKLX0KLQotLy8gc3RhdGljCi1ib29sIFZpZGVvRm9ybWF0czo6R2V0Q29uZmlndXJhdGlvbigKLSAgICAgICAgUmVzb2x1dGlvblR5cGUgdHlwZSwKLSAgICAgICAgc2l6ZV90IGluZGV4LAotICAgICAgICBzaXplX3QgKndpZHRoLCBzaXplX3QgKmhlaWdodCwgc2l6ZV90ICpmcmFtZXNQZXJTZWNvbmQsCi0gICAgICAgIGJvb2wgKmludGVybGFjZWQpIHsKLSAgICBDSEVDS19MVCh0eXBlLCBrTnVtUmVzb2x1dGlvblR5cGVzKTsKLQotICAgIGlmIChpbmRleCA+PSAzMikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY29uc3QgY29uZmlnX3QgKmNvbmZpZyA9ICZtUmVzb2x1dGlvblRhYmxlW3R5cGVdW2luZGV4XTsKLQotICAgIGlmIChjb25maWctPndpZHRoID09IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICh3aWR0aCkgewotICAgICAgICAqd2lkdGggPSBjb25maWctPndpZHRoOwotICAgIH0KLQotICAgIGlmIChoZWlnaHQpIHsKLSAgICAgICAgKmhlaWdodCA9IGNvbmZpZy0+aGVpZ2h0OwotICAgIH0KLQotICAgIGlmIChmcmFtZXNQZXJTZWNvbmQpIHsKLSAgICAgICAgKmZyYW1lc1BlclNlY29uZCA9IGNvbmZpZy0+ZnJhbWVzUGVyU2Vjb25kOwotICAgIH0KLQotICAgIGlmIChpbnRlcmxhY2VkKSB7Ci0gICAgICAgICppbnRlcmxhY2VkID0gY29uZmlnLT5pbnRlcmxhY2VkOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFZpZGVvRm9ybWF0czo6cGFyc2VIMjY0Q29kZWMoY29uc3QgY2hhciAqc3BlYykgewotICAgIHVuc2lnbmVkIHByb2ZpbGUsIGxldmVsLCByZXNbM107Ci0KLSAgICBpZiAoc3NjYW5mKAotICAgICAgICAgICAgc3BlYywKLSAgICAgICAgICAgICIlMDJ4ICUwMnggJTA4WCAlMDhYICUwOFgiLAotICAgICAgICAgICAgJnByb2ZpbGUsCi0gICAgICAgICAgICAmbGV2ZWwsCi0gICAgICAgICAgICAmcmVzWzBdLAotICAgICAgICAgICAgJnJlc1sxXSwKLSAgICAgICAgICAgICZyZXNbMl0pICE9IDUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bVJlc29sdXRpb25UeXBlczsgKytpKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgMzI7ICsraikgewotICAgICAgICAgICAgaWYgKHJlc1tpXSAmICgxdWwgPDwgaikpewotICAgICAgICAgICAgICAgIG1SZXNvbHV0aW9uRW5hYmxlZFtpXSB8PSAoMXVsIDw8IGopOwotICAgICAgICAgICAgICAgIGlmIChwcm9maWxlID4gbUNvbmZpZ3NbaV1bal0ucHJvZmlsZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBwcmVmZXIgaGlnaGVyIHByb2ZpbGUgKGV2ZW4gaWYgbGV2ZWwgaXMgbG93ZXIpCi0gICAgICAgICAgICAgICAgICAgIG1Db25maWdzW2ldW2pdLnByb2ZpbGUgPSBwcm9maWxlOwotICAgICAgICAgICAgICAgICAgICBtQ29uZmlnc1tpXVtqXS5sZXZlbCA9IGxldmVsOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZSA9PSBtQ29uZmlnc1tpXVtqXS5wcm9maWxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA+IG1Db25maWdzW2ldW2pdLmxldmVsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db25maWdzW2ldW2pdLmxldmVsID0gbGV2ZWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIHN0YXRpYwotYm9vbCBWaWRlb0Zvcm1hdHM6OkdldFByb2ZpbGVMZXZlbCgKLSAgICAgICAgUHJvZmlsZVR5cGUgcHJvZmlsZSwgTGV2ZWxUeXBlIGxldmVsLCB1bnNpZ25lZCAqcHJvZmlsZUlkYywKLSAgICAgICAgdW5zaWduZWQgKmxldmVsSWRjLCB1bnNpZ25lZCAqY29uc3RyYWludFNldCkgewotICAgIENIRUNLX0xUKHByb2ZpbGUsIGtOdW1Qcm9maWxlVHlwZXMpOwotICAgIENIRUNLX0xUKGxldmVsLCBrTnVtTGV2ZWxUeXBlcyk7Ci0KLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQga1Byb2ZpbGVJRENba051bVByb2ZpbGVUeXBlc10gPSB7Ci0gICAgICAgIDY2LCAgICAgLy8gUFJPRklMRV9DQlAKLSAgICAgICAgMTAwLCAgICAvLyBQUk9GSUxFX0NIUAotICAgIH07Ci0KLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQga0xldmVsSURDW2tOdW1MZXZlbFR5cGVzXSA9IHsKLSAgICAgICAgMzEsICAgICAvLyBMRVZFTF8zMQotICAgICAgICAzMiwgICAgIC8vIExFVkVMXzMyCi0gICAgICAgIDQwLCAgICAgLy8gTEVWRUxfNDAKLSAgICAgICAgNDEsICAgICAvLyBMRVZFTF80MQotICAgICAgICA0MiwgICAgIC8vIExFVkVMXzQyCi0gICAgfTsKLQotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBrQ29uc3RyYWludFNldFtrTnVtUHJvZmlsZVR5cGVzXSA9IHsKLSAgICAgICAgMHhjMCwgICAvLyBQUk9GSUxFX0NCUAotICAgICAgICAweDBjLCAgIC8vIFBST0ZJTEVfQ0hQCi0gICAgfTsKLQotICAgIGlmIChwcm9maWxlSWRjKSB7Ci0gICAgICAgICpwcm9maWxlSWRjID0ga1Byb2ZpbGVJRENbcHJvZmlsZV07Ci0gICAgfQotCi0gICAgaWYgKGxldmVsSWRjKSB7Ci0gICAgICAgICpsZXZlbElkYyA9IGtMZXZlbElEQ1tsZXZlbF07Ci0gICAgfQotCi0gICAgaWYgKGNvbnN0cmFpbnRTZXQpIHsKLSAgICAgICAgKmNvbnN0cmFpbnRTZXQgPSBrQ29uc3RyYWludFNldFtwcm9maWxlXTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBWaWRlb0Zvcm1hdHM6OnBhcnNlRm9ybWF0U3BlYyhjb25zdCBjaGFyICpzcGVjKSB7Ci0gICAgQ0hFQ0tfRVEoa051bVJlc29sdXRpb25UeXBlcywgMyk7Ci0KLSAgICBkaXNhYmxlQWxsKCk7Ci0KLSAgICB1bnNpZ25lZCBuYXRpdmUsIGR1bW15OwotICAgIHNpemVfdCBzaXplID0gc3RybGVuKHNwZWMpOwotICAgIHNpemVfdCBvZmZzZXQgPSAwOwotCi0gICAgaWYgKHNzY2FuZihzcGVjLCAiJTAyeCAlMDJ4ICIsICZuYXRpdmUsICZkdW1teSkgIT0gMikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgb2Zmc2V0ICs9IDY7IC8vIHNraXAgbmF0aXZlIGFuZCBwcmVmZXJyZWQtZGlzcGxheS1tb2RlLXN1cHBvcnRlZAotICAgIENIRUNLX0xFKG9mZnNldCArIDU4LCBzaXplKTsKLSAgICB3aGlsZSAob2Zmc2V0IDwgc2l6ZSkgewotICAgICAgICBwYXJzZUgyNjRDb2RlYyhzcGVjICsgb2Zmc2V0KTsKLSAgICAgICAgb2Zmc2V0ICs9IDYwOyAvLyBza2lwIEguMjY0LWNvZGVjICsgIiwgIgotICAgIH0KLQotICAgIG1OYXRpdmVJbmRleCA9IG5hdGl2ZSA+PiAzOwotICAgIG1OYXRpdmVUeXBlID0gKFJlc29sdXRpb25UeXBlKShuYXRpdmUgJiA3KTsKLQotICAgIGJvb2wgc3VjY2VzczsKLSAgICBpZiAobU5hdGl2ZVR5cGUgPj0ga051bVJlc29sdXRpb25UeXBlcykgewotICAgICAgICBzdWNjZXNzID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3VjY2VzcyA9IEdldENvbmZpZ3VyYXRpb24oCi0gICAgICAgICAgICAgICAgbU5hdGl2ZVR5cGUsIG1OYXRpdmVJbmRleCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7Ci0gICAgfQotCi0gICAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgICAgIEFMT0dXKCJzaW5rIGFkdmVydGlzZWQgYW4gaWxsZWdhbCBuYXRpdmUgcmVzb2x1dGlvbiwgZm9ydHVuYXRlbHkgIgotICAgICAgICAgICAgICAidGhpcyB2YWx1ZSBpcyBpZ25vcmVkIGZvciB0aGUgdGltZSBiZWluZy4uLiIpOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1BU3RyaW5nIFZpZGVvRm9ybWF0czo6Z2V0Rm9ybWF0U3BlYyhib29sIGZvck00TWVzc2FnZSkgY29uc3QgewotICAgIENIRUNLX0VRKGtOdW1SZXNvbHV0aW9uVHlwZXMsIDMpOwotCi0gICAgLy8gd2ZkX3ZpZGVvX2Zvcm1hdHM6Ci0gICAgLy8gMSBieXRlICJuYXRpdmUiCi0gICAgLy8gMSBieXRlICJwcmVmZXJyZWQtZGlzcGxheS1tb2RlLXN1cHBvcnRlZCIgMCBvciAxCi0gICAgLy8gb25lIG9yIG1vcmUgYXZjIGNvZGVjIHN0cnVjdHVyZXMKLSAgICAvLyAgIDEgYnl0ZSBwcm9maWxlCi0gICAgLy8gICAxIGJ5dGUgbGV2ZWwKLSAgICAvLyAgIDQgYnl0ZSBDRUEgbWFzawotICAgIC8vICAgNCBieXRlIFZFU0EgbWFzawotICAgIC8vICAgNCBieXRlIEhIIG1hc2sKLSAgICAvLyAgIDEgYnl0ZSBsYXRlbmN5Ci0gICAgLy8gICAyIGJ5dGUgbWluLXNsaWNlLXNsaWNlCi0gICAgLy8gICAyIGJ5dGUgc2xpY2UtZW5jLXBhcmFtcwotICAgIC8vICAgMSBieXRlIGZyYW1lcmF0ZS1jb250cm9sLXN1cHBvcnQKLSAgICAvLyAgIG1heC1ocmVzIChub25lIG9yIDIgYnl0ZSkKLSAgICAvLyAgIG1heC12cmVzIChub25lIG9yIDIgYnl0ZSkKLQotICAgIHJldHVybiBBU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgIiUwMnggMDAgJTAyeCAlMDJ4ICUwOHggJTA4eCAlMDh4IDAwIDAwMDAgMDAwMCAwMCBub25lIG5vbmUiLAotICAgICAgICAgICAgZm9yTTRNZXNzYWdlID8gMHgwMCA6ICgobU5hdGl2ZUluZGV4IDw8IDMpIHwgbU5hdGl2ZVR5cGUpLAotICAgICAgICAgICAgbUNvbmZpZ3NbbU5hdGl2ZVR5cGVdW21OYXRpdmVJbmRleF0ucHJvZmlsZSwKLSAgICAgICAgICAgIG1Db25maWdzW21OYXRpdmVUeXBlXVttTmF0aXZlSW5kZXhdLmxldmVsLAotICAgICAgICAgICAgbVJlc29sdXRpb25FbmFibGVkWzBdLAotICAgICAgICAgICAgbVJlc29sdXRpb25FbmFibGVkWzFdLAotICAgICAgICAgICAgbVJlc29sdXRpb25FbmFibGVkWzJdKTsKLX0KLQotLy8gc3RhdGljCi1ib29sIFZpZGVvRm9ybWF0czo6UGlja0Jlc3RGb3JtYXQoCi0gICAgICAgIGNvbnN0IFZpZGVvRm9ybWF0cyAmc2lua1N1cHBvcnRlZCwKLSAgICAgICAgY29uc3QgVmlkZW9Gb3JtYXRzICZzb3VyY2VTdXBwb3J0ZWQsCi0gICAgICAgIFJlc29sdXRpb25UeXBlICpjaG9zZW5UeXBlLAotICAgICAgICBzaXplX3QgKmNob3NlbkluZGV4LAotICAgICAgICBQcm9maWxlVHlwZSAqY2hvc2VuUHJvZmlsZSwKLSAgICAgICAgTGV2ZWxUeXBlICpjaG9zZW5MZXZlbCkgewotI2lmIDAKLSAgICAvLyBTdXBwb3J0IGZvciB0aGUgbmF0aXZlIGZvcm1hdCBpcyBhIGdyZWF0IGlkZWEsIHRoZSBzcGVjIGluY2x1ZGVzCi0gICAgLy8gdGhlc2UgZmVhdHVyZXMsIGJ1dCBub2JvZHkgc3VwcG9ydHMgaXQgYW5kIHRoZSB0ZXN0cyBkb24ndCB2YWxpZGF0ZSBpdC4KLQotICAgIFJlc29sdXRpb25UeXBlIG5hdGl2ZVR5cGU7Ci0gICAgc2l6ZV90IG5hdGl2ZUluZGV4OwotICAgIHNpbmtTdXBwb3J0ZWQuZ2V0TmF0aXZlUmVzb2x1dGlvbigmbmF0aXZlVHlwZSwgJm5hdGl2ZUluZGV4KTsKLSAgICBpZiAoc2lua1N1cHBvcnRlZC5pc1Jlc29sdXRpb25FbmFibGVkKG5hdGl2ZVR5cGUsIG5hdGl2ZUluZGV4KSkgewotICAgICAgICBpZiAoc291cmNlU3VwcG9ydGVkLmlzUmVzb2x1dGlvbkVuYWJsZWQobmF0aXZlVHlwZSwgbmF0aXZlSW5kZXgpKSB7Ci0gICAgICAgICAgICBBTE9HSSgiQ2hvb3Npbmcgc2luaydzIG5hdGl2ZSByZXNvbHV0aW9uIik7Ci0gICAgICAgICAgICAqY2hvc2VuVHlwZSA9IG5hdGl2ZVR5cGU7Ci0gICAgICAgICAgICAqY2hvc2VuSW5kZXggPSBuYXRpdmVJbmRleDsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1coIlNpbmsgYWR2ZXJ0aXNlZCBuYXRpdmUgcmVzb2x1dGlvbiB0aGF0IGl0IGRvZXNuJ3QgIgotICAgICAgICAgICAgICAiYWN0dWFsbHkgc3VwcG9ydC4uLiBpZ25vcmluZyIpOwotICAgIH0KLQotICAgIHNvdXJjZVN1cHBvcnRlZC5nZXROYXRpdmVSZXNvbHV0aW9uKCZuYXRpdmVUeXBlLCAmbmF0aXZlSW5kZXgpOwotICAgIGlmIChzb3VyY2VTdXBwb3J0ZWQuaXNSZXNvbHV0aW9uRW5hYmxlZChuYXRpdmVUeXBlLCBuYXRpdmVJbmRleCkpIHsKLSAgICAgICAgaWYgKHNpbmtTdXBwb3J0ZWQuaXNSZXNvbHV0aW9uRW5hYmxlZChuYXRpdmVUeXBlLCBuYXRpdmVJbmRleCkpIHsKLSAgICAgICAgICAgIEFMT0dJKCJDaG9vc2luZyBzb3VyY2UncyBuYXRpdmUgcmVzb2x1dGlvbiIpOwotICAgICAgICAgICAgKmNob3NlblR5cGUgPSBuYXRpdmVUeXBlOwotICAgICAgICAgICAgKmNob3NlbkluZGV4ID0gbmF0aXZlSW5kZXg7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dXKCJTb3VyY2UgYWR2ZXJ0aXNlZCBuYXRpdmUgcmVzb2x1dGlvbiB0aGF0IGl0IGRvZXNuJ3QgIgotICAgICAgICAgICAgICAiYWN0dWFsbHkgc3VwcG9ydC4uLiBpZ25vcmluZyIpOwotICAgIH0KLSNlbmRpZgotCi0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgdWludDMyX3QgYmVzdFNjb3JlID0gMDsKLSAgICBzaXplX3QgYmVzdFR5cGUgPSAwOwotICAgIHNpemVfdCBiZXN0SW5kZXggPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bVJlc29sdXRpb25UeXBlczsgKytpKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgMzI7ICsraikgewotICAgICAgICAgICAgc2l6ZV90IHdpZHRoLCBoZWlnaHQsIGZyYW1lc1BlclNlY29uZDsKLSAgICAgICAgICAgIGJvb2wgaW50ZXJsYWNlZDsKLSAgICAgICAgICAgIGlmICghR2V0Q29uZmlndXJhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIChSZXNvbHV0aW9uVHlwZSlpLAotICAgICAgICAgICAgICAgICAgICAgICAgaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCwgJmhlaWdodCwgJmZyYW1lc1BlclNlY29uZCwgJmludGVybGFjZWQpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghc2lua1N1cHBvcnRlZC5pc1Jlc29sdXRpb25FbmFibGVkKChSZXNvbHV0aW9uVHlwZSlpLCBqKQotICAgICAgICAgICAgICAgICAgICB8fCAhc291cmNlU3VwcG9ydGVkLmlzUmVzb2x1dGlvbkVuYWJsZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAoUmVzb2x1dGlvblR5cGUpaSwgaikpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQUxPR1YoInR5cGUgJXp1LCBpbmRleCAlenUsICV6dSB4ICV6dSAlYyV6dSBzdXBwb3J0ZWQiLAotICAgICAgICAgICAgICAgICAgaSwgaiwgd2lkdGgsIGhlaWdodCwgaW50ZXJsYWNlZCA/ICdpJyA6ICdwJywgZnJhbWVzUGVyU2Vjb25kKTsKLQotICAgICAgICAgICAgdWludDMyX3Qgc2NvcmUgPSB3aWR0aCAqIGhlaWdodCAqIGZyYW1lc1BlclNlY29uZDsKLSAgICAgICAgICAgIGlmICghaW50ZXJsYWNlZCkgewotICAgICAgICAgICAgICAgIHNjb3JlICo9IDI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmaXJzdCB8fCBzY29yZSA+IGJlc3RTY29yZSkgewotICAgICAgICAgICAgICAgIGJlc3RTY29yZSA9IHNjb3JlOwotICAgICAgICAgICAgICAgIGJlc3RUeXBlID0gaTsKLSAgICAgICAgICAgICAgICBiZXN0SW5kZXggPSBqOwotCi0gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChmaXJzdCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgKmNob3NlblR5cGUgPSAoUmVzb2x1dGlvblR5cGUpYmVzdFR5cGU7Ci0gICAgKmNob3NlbkluZGV4ID0gYmVzdEluZGV4OwotCi0gICAgLy8gUGljayB0aGUgYmVzdCBwcm9maWxlL2xldmVsIHN1cHBvcnRlZCBieSBib3RoIHNpbmsgYW5kIHNvdXJjZS4KLSAgICBQcm9maWxlVHlwZSBzcmNQcm9maWxlLCBzaW5rUHJvZmlsZTsKLSAgICBMZXZlbFR5cGUgc3JjTGV2ZWwsIHNpbmtMZXZlbDsKLSAgICBzb3VyY2VTdXBwb3J0ZWQuZ2V0UHJvZmlsZUxldmVsKAotICAgICAgICAgICAgICAgICAgICAgICAgKFJlc29sdXRpb25UeXBlKWJlc3RUeXBlLCBiZXN0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAmc3JjUHJvZmlsZSwgJnNyY0xldmVsKTsKLSAgICBzaW5rU3VwcG9ydGVkLmdldFByb2ZpbGVMZXZlbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIChSZXNvbHV0aW9uVHlwZSliZXN0VHlwZSwgYmVzdEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgJnNpbmtQcm9maWxlLCAmc2lua0xldmVsKTsKLSAgICAqY2hvc2VuUHJvZmlsZSA9IHNyY1Byb2ZpbGUgPCBzaW5rUHJvZmlsZSA/IHNyY1Byb2ZpbGUgOiBzaW5rUHJvZmlsZTsKLSAgICAqY2hvc2VuTGV2ZWwgPSBzcmNMZXZlbCA8IHNpbmtMZXZlbCA/IHNyY0xldmVsIDogc2lua0xldmVsOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9WaWRlb0Zvcm1hdHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9WaWRlb0Zvcm1hdHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQzOGZkMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvVmlkZW9Gb3JtYXRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEzLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBWSURFT19GT1JNQVRTX0hfCi0KLSNkZWZpbmUgVklERU9fRk9STUFUU19IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEFTdHJpbmc7Ci0KLS8vIFRoaXMgY2xhc3MgZW5jYXBzdWxhdGVzIHRoYXQgdmlkZW8gcmVzb2x1dGlvbiBjYXBhYmlsaXRpZXMgb2YgYSB3ZmQgc291cmNlCi0vLyBvciBzaW5rIGFzIG91dGxpbmVkIGluIHRoZSB3ZmQgc3BlY3MuIEN1cnJlbnRseSB0aHJlZSBzZXRzIG9mIHJlc29sdXRpb25zCi0vLyBhcmUgc3BlY2lmaWVkLCBlYWNoIG9mIHdoaWNoIHN1cHBvcnRzIHVwIHRvIDMyIHJlc29sdXRpb25zLgotLy8gSW4gYWRkaXRpb24gdG8gaXRzIGNhcGFiaWxpdGllcyBlYWNoIHNpbmsvc291cmNlIGFsc28gcHVibGlzaGVzIGl0cwotLy8gIm5hdGl2ZSIgcmVzb2x1dGlvbiwgcHJlc3VtYWJseSBvbmUgdGhhdCBpcyBwcmVmZXJyZWQgYW1vbmcgYWxsIG90aGVycwotLy8gYmVjYXVzZSBpdCB3b3VsZG4ndCByZXF1aXJlIGFueSBzY2FsaW5nIGFuZCBkaXJlY3RseSBjb3JyZXNwb25kcyB0byB0aGUKLS8vIGRpc3BsYXkgY2FwYWJpbGl0aWVzL3BpeGVscy4KLXN0cnVjdCBWaWRlb0Zvcm1hdHMgewotICAgIFZpZGVvRm9ybWF0cygpOwotCi0gICAgc3RydWN0IGNvbmZpZ190IHsKLSAgICAgICAgc2l6ZV90IHdpZHRoLCBoZWlnaHQsIGZyYW1lc1BlclNlY29uZDsKLSAgICAgICAgYm9vbCBpbnRlcmxhY2VkOwotICAgICAgICB1bnNpZ25lZCBjaGFyIHByb2ZpbGUsIGxldmVsOwotICAgIH07Ci0KLSAgICBlbnVtIFByb2ZpbGVUeXBlIHsKLSAgICAgICAgUFJPRklMRV9DQlAgPSAwLAotICAgICAgICBQUk9GSUxFX0NIUCwKLSAgICAgICAga051bVByb2ZpbGVUeXBlcywKLSAgICB9OwotCi0gICAgZW51bSBMZXZlbFR5cGUgewotICAgICAgICBMRVZFTF8zMSA9IDAsCi0gICAgICAgIExFVkVMXzMyLAotICAgICAgICBMRVZFTF80MCwKLSAgICAgICAgTEVWRUxfNDEsCi0gICAgICAgIExFVkVMXzQyLAotICAgICAgICBrTnVtTGV2ZWxUeXBlcywKLSAgICB9OwotCi0gICAgZW51bSBSZXNvbHV0aW9uVHlwZSB7Ci0gICAgICAgIFJFU09MVVRJT05fQ0VBLAotICAgICAgICBSRVNPTFVUSU9OX1ZFU0EsCi0gICAgICAgIFJFU09MVVRJT05fSEgsCi0gICAgICAgIGtOdW1SZXNvbHV0aW9uVHlwZXMsCi0gICAgfTsKLQotICAgIHZvaWQgc2V0TmF0aXZlUmVzb2x1dGlvbihSZXNvbHV0aW9uVHlwZSB0eXBlLCBzaXplX3QgaW5kZXgpOwotICAgIHZvaWQgZ2V0TmF0aXZlUmVzb2x1dGlvbihSZXNvbHV0aW9uVHlwZSAqdHlwZSwgc2l6ZV90ICppbmRleCkgY29uc3Q7Ci0KLSAgICB2b2lkIGRpc2FibGVBbGwoKTsKLSAgICB2b2lkIGVuYWJsZUFsbCgpOwotICAgIHZvaWQgZW5hYmxlUmVzb2x1dGlvblVwdG8oCi0gICAgICAgICAgICBSZXNvbHV0aW9uVHlwZSB0eXBlLCBzaXplX3QgaW5kZXgsCi0gICAgICAgICAgICBQcm9maWxlVHlwZSBwcm9maWxlLCBMZXZlbFR5cGUgbGV2ZWwpOwotCi0gICAgdm9pZCBzZXRSZXNvbHV0aW9uRW5hYmxlZCgKLSAgICAgICAgICAgIFJlc29sdXRpb25UeXBlIHR5cGUsIHNpemVfdCBpbmRleCwgYm9vbCBlbmFibGVkID0gdHJ1ZSk7Ci0KLSAgICBib29sIGlzUmVzb2x1dGlvbkVuYWJsZWQoUmVzb2x1dGlvblR5cGUgdHlwZSwgc2l6ZV90IGluZGV4KSBjb25zdDsKLQotICAgIHZvaWQgc2V0UHJvZmlsZUxldmVsKAotICAgICAgICAgICAgUmVzb2x1dGlvblR5cGUgdHlwZSwgc2l6ZV90IGluZGV4LAotICAgICAgICAgICAgUHJvZmlsZVR5cGUgcHJvZmlsZSwgTGV2ZWxUeXBlIGxldmVsKTsKLQotICAgIHZvaWQgZ2V0UHJvZmlsZUxldmVsKAotICAgICAgICAgICAgUmVzb2x1dGlvblR5cGUgdHlwZSwgc2l6ZV90IGluZGV4LAotICAgICAgICAgICAgUHJvZmlsZVR5cGUgKnByb2ZpbGUsIExldmVsVHlwZSAqbGV2ZWwpIGNvbnN0OwotCi0gICAgc3RhdGljIGJvb2wgR2V0Q29uZmlndXJhdGlvbigKLSAgICAgICAgICAgIFJlc29sdXRpb25UeXBlIHR5cGUsIHNpemVfdCBpbmRleCwKLSAgICAgICAgICAgIHNpemVfdCAqd2lkdGgsIHNpemVfdCAqaGVpZ2h0LCBzaXplX3QgKmZyYW1lc1BlclNlY29uZCwKLSAgICAgICAgICAgIGJvb2wgKmludGVybGFjZWQpOwotCi0gICAgc3RhdGljIGJvb2wgR2V0UHJvZmlsZUxldmVsKAotICAgICAgICAgICAgUHJvZmlsZVR5cGUgcHJvZmlsZSwgTGV2ZWxUeXBlIGxldmVsLAotICAgICAgICAgICAgdW5zaWduZWQgKnByb2ZpbGVJZGMsIHVuc2lnbmVkICpsZXZlbElkYywKLSAgICAgICAgICAgIHVuc2lnbmVkICpjb25zdHJhaW50U2V0KTsKLQotICAgIGJvb2wgcGFyc2VGb3JtYXRTcGVjKGNvbnN0IGNoYXIgKnNwZWMpOwotICAgIEFTdHJpbmcgZ2V0Rm9ybWF0U3BlYyhib29sIGZvck00TWVzc2FnZSA9IGZhbHNlKSBjb25zdDsKLQotICAgIHN0YXRpYyBib29sIFBpY2tCZXN0Rm9ybWF0KAotICAgICAgICAgICAgY29uc3QgVmlkZW9Gb3JtYXRzICZzaW5rU3VwcG9ydGVkLAotICAgICAgICAgICAgY29uc3QgVmlkZW9Gb3JtYXRzICZzb3VyY2VTdXBwb3J0ZWQsCi0gICAgICAgICAgICBSZXNvbHV0aW9uVHlwZSAqY2hvc2VuVHlwZSwKLSAgICAgICAgICAgIHNpemVfdCAqY2hvc2VuSW5kZXgsCi0gICAgICAgICAgICBQcm9maWxlVHlwZSAqY2hvc2VuUHJvZmlsZSwKLSAgICAgICAgICAgIExldmVsVHlwZSAqY2hvc2VuTGV2ZWwpOwotCi1wcml2YXRlOgotICAgIGJvb2wgcGFyc2VIMjY0Q29kZWMoY29uc3QgY2hhciAqc3BlYyk7Ci0gICAgUmVzb2x1dGlvblR5cGUgbU5hdGl2ZVR5cGU7Ci0gICAgc2l6ZV90IG1OYXRpdmVJbmRleDsKLQotICAgIHVpbnQzMl90IG1SZXNvbHV0aW9uRW5hYmxlZFtrTnVtUmVzb2x1dGlvblR5cGVzXTsKLSAgICBzdGF0aWMgY29uc3QgY29uZmlnX3QgbVJlc29sdXRpb25UYWJsZVtrTnVtUmVzb2x1dGlvblR5cGVzXVszMl07Ci0gICAgY29uZmlnX3QgbUNvbmZpZ3Nba051bVJlc29sdXRpb25UeXBlc11bMzJdOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVmlkZW9Gb3JtYXRzKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gVklERU9fRk9STUFUU19IXwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvcnRwL1JUUEJhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9ydHAvUlRQQmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTRmMWVlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9ydHAvUlRQQmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEzLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBSVFBfQkFTRV9IXwotCi0jZGVmaW5lIFJUUF9CQVNFX0hfCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IFJUUEJhc2UgewotICAgIGVudW0gUGFja2V0aXphdGlvbk1vZGUgewotICAgICAgICBQQUNLRVRJWkFUSU9OX1RSQU5TUE9SVF9TVFJFQU0sCi0gICAgICAgIFBBQ0tFVElaQVRJT05fSDI2NCwKLSAgICAgICAgUEFDS0VUSVpBVElPTl9BQUMsCi0gICAgICAgIFBBQ0tFVElaQVRJT05fTk9ORSwKLSAgICB9OwotCi0gICAgZW51bSBUcmFuc3BvcnRNb2RlIHsKLSAgICAgICAgVFJBTlNQT1JUX1VOREVGSU5FRCwKLSAgICAgICAgVFJBTlNQT1JUX05PTkUsCi0gICAgICAgIFRSQU5TUE9SVF9VRFAsCi0gICAgICAgIFRSQU5TUE9SVF9UQ1AsCi0gICAgICAgIFRSQU5TUE9SVF9UQ1BfSU5URVJMRUFWRUQsCi0gICAgfTsKLQotICAgIC8vIFJlYWxseSBVRFAgX3BheWxvYWRfIHNpemUKLSAgICBjb25zdCB1bnNpZ25lZCBpbnQga01heFVEUFBhY2tldFNpemUgPSAxNDcyOyAgIC8vIDE0NzIgZ29vZCwgMTQ3MyBiYWQgb24gQW5kcm9pZEBIb21lCi0KLSAgICBzdGF0aWMgaW50MzJfdCBQaWNrUmFuZG9tUlRQUG9ydCgpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBSVFBfQkFTRV9IXwotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9ydHAvUlRQU2VuZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9ydHAvUlRQU2VuZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E5ZmRkMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvcnRwL1JUUFNlbmRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEzLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJSVFBTZW5kZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJSVFBTZW5kZXIuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotCi0jaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1SVFBTZW5kZXI6OlJUUFNlbmRlcigKLSAgICAgICAgY29uc3Qgc3A8QU5ldHdvcmtTZXNzaW9uPiAmbmV0U2Vzc2lvbiwKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCi0gICAgOiBtTmV0U2Vzc2lvbihuZXRTZXNzaW9uKSwKLSAgICAgIG1Ob3RpZnkobm90aWZ5KSwKLSAgICAgIG1SVFBNb2RlKFRSQU5TUE9SVF9VTkRFRklORUQpLAotICAgICAgbVJUQ1BNb2RlKFRSQU5TUE9SVF9VTkRFRklORUQpLAotICAgICAgbVJUUFNlc3Npb25JRCgwKSwKLSAgICAgIG1SVENQU2Vzc2lvbklEKDApLAotICAgICAgbVJUUENvbm5lY3RlZChmYWxzZSksCi0gICAgICBtUlRDUENvbm5lY3RlZChmYWxzZSksCi0gICAgICBtTGFzdE5UUFRpbWUoMCksCi0gICAgICBtTGFzdFJUUFRpbWUoMCksCi0gICAgICBtTnVtUlRQU2VudCgwKSwKLSAgICAgIG1OdW1SVFBPY3RldHNTZW50KDApLAotICAgICAgbU51bVNSc1NlbnQoMCksCi0gICAgICBtUlRQU2VxTm8oMCksCi0gICAgICBtSGlzdG9yeVNpemUoMCkgewotfQotCi1SVFBTZW5kZXI6On5SVFBTZW5kZXIoKSB7Ci0gICAgaWYgKG1SVENQU2Vzc2lvbklEICE9IDApIHsKLSAgICAgICAgbU5ldFNlc3Npb24tPmRlc3Ryb3lTZXNzaW9uKG1SVENQU2Vzc2lvbklEKTsKLSAgICAgICAgbVJUQ1BTZXNzaW9uSUQgPSAwOwotICAgIH0KLQotICAgIGlmIChtUlRQU2Vzc2lvbklEICE9IDApIHsKLSAgICAgICAgbU5ldFNlc3Npb24tPmRlc3Ryb3lTZXNzaW9uKG1SVFBTZXNzaW9uSUQpOwotICAgICAgICBtUlRQU2Vzc2lvbklEID0gMDsKLSAgICB9Ci19Ci0KLS8vIHN0YXRpYwotaW50MzJfdCBSVFBCYXNlOjpQaWNrUmFuZG9tUlRQUG9ydCgpIHsKLSAgICAvLyBQaWNrIGFuIGV2ZW4gaW50ZWdlciBpbiByYW5nZSBbMTAyNCwgNjU1MzQpCi0KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtSYW5nZSA9ICg2NTUzNCAtIDEwMjQpIC8gMjsKLQotICAgIHJldHVybiAoaW50MzJfdCkoKChmbG9hdCkoa1JhbmdlICsgMSkgKiByYW5kKCkpIC8gUkFORF9NQVgpICogMiArIDEwMjQ7Ci19Ci0KLXN0YXR1c190IFJUUFNlbmRlcjo6aW5pdEFzeW5jKAotICAgICAgICBjb25zdCBjaGFyICpyZW1vdGVIb3N0LAotICAgICAgICBpbnQzMl90IHJlbW90ZVJUUFBvcnQsCi0gICAgICAgIFRyYW5zcG9ydE1vZGUgcnRwTW9kZSwKLSAgICAgICAgaW50MzJfdCByZW1vdGVSVENQUG9ydCwKLSAgICAgICAgVHJhbnNwb3J0TW9kZSBydGNwTW9kZSwKLSAgICAgICAgaW50MzJfdCAqb3V0TG9jYWxSVFBQb3J0KSB7Ci0gICAgaWYgKG1SVFBNb2RlICE9IFRSQU5TUE9SVF9VTkRFRklORUQKLSAgICAgICAgICAgIHx8IHJ0cE1vZGUgPT0gVFJBTlNQT1JUX1VOREVGSU5FRAotICAgICAgICAgICAgfHwgcnRwTW9kZSA9PSBUUkFOU1BPUlRfTk9ORQotICAgICAgICAgICAgfHwgcnRjcE1vZGUgPT0gVFJBTlNQT1JUX1VOREVGSU5FRCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgQ0hFQ0tfTkUocnRwTW9kZSwgVFJBTlNQT1JUX1RDUF9JTlRFUkxFQVZFRCk7Ci0gICAgQ0hFQ0tfTkUocnRjcE1vZGUsIFRSQU5TUE9SVF9UQ1BfSU5URVJMRUFWRUQpOwotCi0gICAgaWYgKChydGNwTW9kZSA9PSBUUkFOU1BPUlRfTk9ORSAmJiByZW1vdGVSVENQUG9ydCA+PSAwKQotICAgICAgICAgICAgfHwgKHJ0Y3BNb2RlICE9IFRSQU5TUE9SVF9OT05FICYmIHJlbW90ZVJUQ1BQb3J0IDwgMCkpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHNwPEFNZXNzYWdlPiBydHBOb3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSVFBOb3RpZnksIHRoaXMpOwotCi0gICAgc3A8QU1lc3NhZ2U+IHJ0Y3BOb3RpZnk7Ci0gICAgaWYgKHJlbW90ZVJUQ1BQb3J0ID49IDApIHsKLSAgICAgICAgcnRjcE5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFJUQ1BOb3RpZnksIHRoaXMpOwotICAgIH0KLQotICAgIENIRUNLX0VRKG1SVFBTZXNzaW9uSUQsIDApOwotICAgIENIRUNLX0VRKG1SVENQU2Vzc2lvbklELCAwKTsKLQotICAgIGludDMyX3QgbG9jYWxSVFBQb3J0OwotCi0gICAgZm9yICg7OykgewotICAgICAgICBsb2NhbFJUUFBvcnQgPSBQaWNrUmFuZG9tUlRQUG9ydCgpOwotCi0gICAgICAgIHN0YXR1c190IGVycjsKLSAgICAgICAgaWYgKHJ0cE1vZGUgPT0gVFJBTlNQT1JUX1VEUCkgewotICAgICAgICAgICAgZXJyID0gbU5ldFNlc3Npb24tPmNyZWF0ZVVEUFNlc3Npb24oCi0gICAgICAgICAgICAgICAgICAgIGxvY2FsUlRQUG9ydCwKLSAgICAgICAgICAgICAgICAgICAgcmVtb3RlSG9zdCwKLSAgICAgICAgICAgICAgICAgICAgcmVtb3RlUlRQUG9ydCwKLSAgICAgICAgICAgICAgICAgICAgcnRwTm90aWZ5LAotICAgICAgICAgICAgICAgICAgICAmbVJUUFNlc3Npb25JRCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDSEVDS19FUShydHBNb2RlLCBUUkFOU1BPUlRfVENQKTsKLSAgICAgICAgICAgIGVyciA9IG1OZXRTZXNzaW9uLT5jcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb24oCi0gICAgICAgICAgICAgICAgICAgIGxvY2FsUlRQUG9ydCwKLSAgICAgICAgICAgICAgICAgICAgcmVtb3RlSG9zdCwKLSAgICAgICAgICAgICAgICAgICAgcmVtb3RlUlRQUG9ydCwKLSAgICAgICAgICAgICAgICAgICAgcnRwTm90aWZ5LAotICAgICAgICAgICAgICAgICAgICAmbVJUUFNlc3Npb25JRCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZW1vdGVSVENQUG9ydCA8IDApIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJ0Y3BNb2RlID09IFRSQU5TUE9SVF9VRFApIHsKLSAgICAgICAgICAgIGVyciA9IG1OZXRTZXNzaW9uLT5jcmVhdGVVRFBTZXNzaW9uKAotICAgICAgICAgICAgICAgICAgICBsb2NhbFJUUFBvcnQgKyAxLAotICAgICAgICAgICAgICAgICAgICByZW1vdGVIb3N0LAotICAgICAgICAgICAgICAgICAgICByZW1vdGVSVENQUG9ydCwKLSAgICAgICAgICAgICAgICAgICAgcnRjcE5vdGlmeSwKLSAgICAgICAgICAgICAgICAgICAgJm1SVENQU2Vzc2lvbklEKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENIRUNLX0VRKHJ0Y3BNb2RlLCBUUkFOU1BPUlRfVENQKTsKLSAgICAgICAgICAgIGVyciA9IG1OZXRTZXNzaW9uLT5jcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb24oCi0gICAgICAgICAgICAgICAgICAgIGxvY2FsUlRQUG9ydCArIDEsCi0gICAgICAgICAgICAgICAgICAgIHJlbW90ZUhvc3QsCi0gICAgICAgICAgICAgICAgICAgIHJlbW90ZVJUQ1BQb3J0LAotICAgICAgICAgICAgICAgICAgICBydGNwTm90aWZ5LAotICAgICAgICAgICAgICAgICAgICAmbVJUQ1BTZXNzaW9uSUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBtTmV0U2Vzc2lvbi0+ZGVzdHJveVNlc3Npb24obVJUUFNlc3Npb25JRCk7Ci0gICAgICAgIG1SVFBTZXNzaW9uSUQgPSAwOwotICAgIH0KLQotICAgIGlmIChydHBNb2RlID09IFRSQU5TUE9SVF9VRFApIHsKLSAgICAgICAgbVJUUENvbm5lY3RlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKHJ0Y3BNb2RlID09IFRSQU5TUE9SVF9VRFApIHsKLSAgICAgICAgbVJUQ1BDb25uZWN0ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIG1SVFBNb2RlID0gcnRwTW9kZTsKLSAgICBtUlRDUE1vZGUgPSBydGNwTW9kZTsKLSAgICAqb3V0TG9jYWxSVFBQb3J0ID0gbG9jYWxSVFBQb3J0OwotCi0gICAgaWYgKG1SVFBNb2RlID09IFRSQU5TUE9SVF9VRFAKLSAgICAgICAgICAgICYmIChtUlRDUE1vZGUgPT0gVFJBTlNQT1JUX1VEUCB8fCBtUlRDUE1vZGUgPT0gVFJBTlNQT1JUX05PTkUpKSB7Ci0gICAgICAgIG5vdGlmeUluaXREb25lKE9LKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFJUUFNlbmRlcjo6cXVldWVCdWZmZXIoCi0gICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsIHVpbnQ4X3QgcGFja2V0VHlwZSwgUGFja2V0aXphdGlvbk1vZGUgbW9kZSkgewotICAgIHN0YXR1c190IGVycjsKLQotICAgIHN3aXRjaCAobW9kZSkgewotICAgICAgICBjYXNlIFBBQ0tFVElaQVRJT05fTk9ORToKLSAgICAgICAgICAgIGVyciA9IHF1ZXVlUmF3UGFja2V0KGJ1ZmZlciwgcGFja2V0VHlwZSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFBBQ0tFVElaQVRJT05fVFJBTlNQT1JUX1NUUkVBTToKLSAgICAgICAgICAgIGVyciA9IHF1ZXVlVFNQYWNrZXRzKGJ1ZmZlciwgcGFja2V0VHlwZSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFBBQ0tFVElaQVRJT05fSDI2NDoKLSAgICAgICAgICAgIGVyciAgPSBxdWV1ZUFWQ0J1ZmZlcihidWZmZXIsIHBhY2tldFR5cGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgUlRQU2VuZGVyOjpxdWV1ZVJhd1BhY2tldCgKLSAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJnBhY2tldCwgdWludDhfdCBwYWNrZXRUeXBlKSB7Ci0gICAgQ0hFQ0tfTEUocGFja2V0LT5zaXplKCksIGtNYXhVRFBQYWNrZXRTaXplIC0gMTIpOwotCi0gICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgQ0hFQ0socGFja2V0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwotCi0gICAgc3A8QUJ1ZmZlcj4gdWRwUGFja2V0ID0gbmV3IEFCdWZmZXIoMTIgKyBwYWNrZXQtPnNpemUoKSk7Ci0KLSAgICB1ZHBQYWNrZXQtPnNldEludDMyRGF0YShtUlRQU2VxTm8pOwotCi0gICAgdWludDhfdCAqcnRwID0gdWRwUGFja2V0LT5kYXRhKCk7Ci0gICAgcnRwWzBdID0gMHg4MDsKLSAgICBydHBbMV0gPSBwYWNrZXRUeXBlOwotCi0gICAgcnRwWzJdID0gKG1SVFBTZXFObyA+PiA4KSAmIDB4ZmY7Ci0gICAgcnRwWzNdID0gbVJUUFNlcU5vICYgMHhmZjsKLSAgICArK21SVFBTZXFObzsKLQotICAgIHVpbnQzMl90IHJ0cFRpbWUgPSAodGltZVVzICogOSkgLyAxMDBsbDsKLQotICAgIHJ0cFs0XSA9IHJ0cFRpbWUgPj4gMjQ7Ci0gICAgcnRwWzVdID0gKHJ0cFRpbWUgPj4gMTYpICYgMHhmZjsKLSAgICBydHBbNl0gPSAocnRwVGltZSA+PiA4KSAmIDB4ZmY7Ci0gICAgcnRwWzddID0gcnRwVGltZSAmIDB4ZmY7Ci0KLSAgICBydHBbOF0gPSBrU291cmNlSUQgPj4gMjQ7Ci0gICAgcnRwWzldID0gKGtTb3VyY2VJRCA+PiAxNikgJiAweGZmOwotICAgIHJ0cFsxMF0gPSAoa1NvdXJjZUlEID4+IDgpICYgMHhmZjsKLSAgICBydHBbMTFdID0ga1NvdXJjZUlEICYgMHhmZjsKLQotICAgIG1lbWNweSgmcnRwWzEyXSwgcGFja2V0LT5kYXRhKCksIHBhY2tldC0+c2l6ZSgpKTsKLQotICAgIHJldHVybiBzZW5kUlRQUGFja2V0KAotICAgICAgICAgICAgdWRwUGFja2V0LAotICAgICAgICAgICAgdHJ1ZSAvKiBzdG9yZUluSGlzdG9yeSAqLywKLSAgICAgICAgICAgIHRydWUgLyogdGltZVZhbGlkICovLAotICAgICAgICAgICAgQUxvb3Blcjo6R2V0Tm93VXMoKSk7Ci19Ci0KLXN0YXR1c190IFJUUFNlbmRlcjo6cXVldWVUU1BhY2tldHMoCi0gICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZ0c1BhY2tldHMsIHVpbnQ4X3QgcGFja2V0VHlwZSkgewotICAgIENIRUNLX0VRKDB1LCB0c1BhY2tldHMtPnNpemUoKSAlIDE4OCk7Ci0KLSAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBDSEVDSyh0c1BhY2tldHMtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7Ci0KLSAgICBzaXplX3Qgc3JjT2Zmc2V0ID0gMDsKLSAgICB3aGlsZSAoc3JjT2Zmc2V0IDwgdHNQYWNrZXRzLT5zaXplKCkpIHsKLSAgICAgICAgc3A8QUJ1ZmZlcj4gdWRwUGFja2V0ID0KLSAgICAgICAgICAgIG5ldyBBQnVmZmVyKDEyICsga01heE51bVRTUGFja2V0c1BlclJUUFBhY2tldCAqIDE4OCk7Ci0KLSAgICAgICAgdWRwUGFja2V0LT5zZXRJbnQzMkRhdGEobVJUUFNlcU5vKTsKLQotICAgICAgICB1aW50OF90ICpydHAgPSB1ZHBQYWNrZXQtPmRhdGEoKTsKLSAgICAgICAgcnRwWzBdID0gMHg4MDsKLSAgICAgICAgcnRwWzFdID0gcGFja2V0VHlwZTsKLQotICAgICAgICBydHBbMl0gPSAobVJUUFNlcU5vID4+IDgpICYgMHhmZjsKLSAgICAgICAgcnRwWzNdID0gbVJUUFNlcU5vICYgMHhmZjsKLSAgICAgICAgKyttUlRQU2VxTm87Ci0KLSAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgICAgIHVpbnQzMl90IHJ0cFRpbWUgPSAobm93VXMgKiA5KSAvIDEwMGxsOwotCi0gICAgICAgIHJ0cFs0XSA9IHJ0cFRpbWUgPj4gMjQ7Ci0gICAgICAgIHJ0cFs1XSA9IChydHBUaW1lID4+IDE2KSAmIDB4ZmY7Ci0gICAgICAgIHJ0cFs2XSA9IChydHBUaW1lID4+IDgpICYgMHhmZjsKLSAgICAgICAgcnRwWzddID0gcnRwVGltZSAmIDB4ZmY7Ci0KLSAgICAgICAgcnRwWzhdID0ga1NvdXJjZUlEID4+IDI0OwotICAgICAgICBydHBbOV0gPSAoa1NvdXJjZUlEID4+IDE2KSAmIDB4ZmY7Ci0gICAgICAgIHJ0cFsxMF0gPSAoa1NvdXJjZUlEID4+IDgpICYgMHhmZjsKLSAgICAgICAgcnRwWzExXSA9IGtTb3VyY2VJRCAmIDB4ZmY7Ci0KLSAgICAgICAgc2l6ZV90IG51bVRTUGFja2V0cyA9ICh0c1BhY2tldHMtPnNpemUoKSAtIHNyY09mZnNldCkgLyAxODg7Ci0gICAgICAgIGlmIChudW1UU1BhY2tldHMgPiBrTWF4TnVtVFNQYWNrZXRzUGVyUlRQUGFja2V0KSB7Ci0gICAgICAgICAgICBudW1UU1BhY2tldHMgPSBrTWF4TnVtVFNQYWNrZXRzUGVyUlRQUGFja2V0OwotICAgICAgICB9Ci0KLSAgICAgICAgbWVtY3B5KCZydHBbMTJdLCB0c1BhY2tldHMtPmRhdGEoKSArIHNyY09mZnNldCwgbnVtVFNQYWNrZXRzICogMTg4KTsKLQotICAgICAgICB1ZHBQYWNrZXQtPnNldFJhbmdlKDAsIDEyICsgbnVtVFNQYWNrZXRzICogMTg4KTsKLQotICAgICAgICBzcmNPZmZzZXQgKz0gbnVtVFNQYWNrZXRzICogMTg4OwotICAgICAgICBib29sIGlzTGFzdFBhY2tldCA9IChzcmNPZmZzZXQgPT0gdHNQYWNrZXRzLT5zaXplKCkpOwotCi0gICAgICAgIHN0YXR1c190IGVyciA9IHNlbmRSVFBQYWNrZXQoCi0gICAgICAgICAgICAgICAgdWRwUGFja2V0LAotICAgICAgICAgICAgICAgIHRydWUgLyogc3RvcmVJbkhpc3RvcnkgKi8sCi0gICAgICAgICAgICAgICAgaXNMYXN0UGFja2V0IC8qIHRpbWVWYWxpZCAqLywKLSAgICAgICAgICAgICAgICB0aW1lVXMpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFJUUFNlbmRlcjo6cXVldWVBVkNCdWZmZXIoCi0gICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0LCB1aW50OF90IHBhY2tldFR5cGUpIHsKLSAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwotCi0gICAgdWludDMyX3QgcnRwVGltZSA9ICh0aW1lVXMgKiA5IC8gMTAwbGwpOwotCi0gICAgTGlzdDxzcDxBQnVmZmVyPiA+IHBhY2tldHM7Ci0KLSAgICBzcDxBQnVmZmVyPiBvdXQgPSBuZXcgQUJ1ZmZlcihrTWF4VURQUGFja2V0U2l6ZSk7Ci0gICAgc2l6ZV90IG91dEJ5dGVzVXNlZCA9IDEyOyAgLy8gUGxhY2Vob2xkZXIgZm9yIFJUUCBoZWFkZXIuCi0KLSAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYWNjZXNzVW5pdC0+ZGF0YSgpOwotICAgIHNpemVfdCBzaXplID0gYWNjZXNzVW5pdC0+c2l6ZSgpOwotICAgIGNvbnN0IHVpbnQ4X3QgKm5hbFN0YXJ0OwotICAgIHNpemVfdCBuYWxTaXplOwotICAgIHdoaWxlIChnZXROZXh0TkFMVW5pdCgKLSAgICAgICAgICAgICAgICAmZGF0YSwgJnNpemUsICZuYWxTdGFydCwgJm5hbFNpemUsCi0gICAgICAgICAgICAgICAgdHJ1ZSAvKiBzdGFydENvZGVGb2xsb3dzICovKSA9PSBPSykgewotICAgICAgICBzaXplX3QgYnl0ZXNOZWVkZWQgPSBuYWxTaXplICsgMjsKLSAgICAgICAgaWYgKG91dEJ5dGVzVXNlZCA9PSAxMikgewotICAgICAgICAgICAgKytieXRlc05lZWRlZDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvdXRCeXRlc1VzZWQgKyBieXRlc05lZWRlZCA+IG91dC0+Y2FwYWNpdHkoKSkgewotICAgICAgICAgICAgYm9vbCBlbWl0U2luZ2xlTkFMUGFja2V0ID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIGlmIChvdXRCeXRlc1VzZWQgPT0gMTIKLSAgICAgICAgICAgICAgICAgICAgJiYgb3V0Qnl0ZXNVc2VkICsgbmFsU2l6ZSA8PSBvdXQtPmNhcGFjaXR5KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBoYXZlbid0IGVtaXR0ZWQgYW55dGhpbmcgaW50byB0aGUgY3VycmVudCBwYWNrZXQgeWV0IGFuZAotICAgICAgICAgICAgICAgIC8vIHRoaXMgTkFMIHVuaXQgZml0cyBpbnRvIGEgc2luZ2xlLU5BTC11bml0LXBhY2tldCB3aGlsZQotICAgICAgICAgICAgICAgIC8vIGl0IHdvdWxkbid0IGhhdmUgZml0IGFzIHBhcnQgb2YgYSBTVEFQLUEgcGFja2V0LgotCi0gICAgICAgICAgICAgICAgbWVtY3B5KG91dC0+ZGF0YSgpICsgb3V0Qnl0ZXNVc2VkLCBuYWxTdGFydCwgbmFsU2l6ZSk7Ci0gICAgICAgICAgICAgICAgb3V0Qnl0ZXNVc2VkICs9IG5hbFNpemU7Ci0KLSAgICAgICAgICAgICAgICBlbWl0U2luZ2xlTkFMUGFja2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG91dEJ5dGVzVXNlZCA+IDEyKSB7Ci0gICAgICAgICAgICAgICAgb3V0LT5zZXRSYW5nZSgwLCBvdXRCeXRlc1VzZWQpOwotICAgICAgICAgICAgICAgIHBhY2tldHMucHVzaF9iYWNrKG91dCk7Ci0gICAgICAgICAgICAgICAgb3V0ID0gbmV3IEFCdWZmZXIoa01heFVEUFBhY2tldFNpemUpOwotICAgICAgICAgICAgICAgIG91dEJ5dGVzVXNlZCA9IDEyOyAgLy8gUGxhY2Vob2xkZXIgZm9yIFJUUCBoZWFkZXIKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGVtaXRTaW5nbGVOQUxQYWNrZXQpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvdXRCeXRlc1VzZWQgKyBieXRlc05lZWRlZCA8PSBvdXQtPmNhcGFjaXR5KCkpIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IG91dC0+ZGF0YSgpICsgb3V0Qnl0ZXNVc2VkOwotCi0gICAgICAgICAgICBpZiAob3V0Qnl0ZXNVc2VkID09IDEyKSB7Ci0gICAgICAgICAgICAgICAgKmRzdCsrID0gMjQ7ICAvLyBTVEFQLUEgaGVhZGVyCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICpkc3QrKyA9IChuYWxTaXplID4+IDgpICYgMHhmZjsKLSAgICAgICAgICAgICpkc3QrKyA9IG5hbFNpemUgJiAweGZmOwotICAgICAgICAgICAgbWVtY3B5KGRzdCwgbmFsU3RhcnQsIG5hbFNpemUpOwotCi0gICAgICAgICAgICBvdXRCeXRlc1VzZWQgKz0gYnl0ZXNOZWVkZWQ7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoaXMgc2luZ2xlIE5BTCB1bml0IGRvZXMgbm90IGZpdCBpbnRvIGEgc2luZ2xlIFJUUCBwYWNrZXQsCi0gICAgICAgIC8vIHdlIG5lZWQgdG8gZW1pdCBhbiBGVS1BLgotCi0gICAgICAgIENIRUNLX0VRKG91dEJ5dGVzVXNlZCwgMTJ1KTsKLQotICAgICAgICB1aW50OF90IG5hbFR5cGUgPSBuYWxTdGFydFswXSAmIDB4MWY7Ci0gICAgICAgIHVpbnQ4X3QgbnJpID0gKG5hbFN0YXJ0WzBdID4+IDUpICYgMzsKLQotICAgICAgICBzaXplX3Qgc3JjT2Zmc2V0ID0gMTsKLSAgICAgICAgd2hpbGUgKHNyY09mZnNldCA8IG5hbFNpemUpIHsKLSAgICAgICAgICAgIHNpemVfdCBjb3B5ID0gb3V0LT5jYXBhY2l0eSgpIC0gb3V0Qnl0ZXNVc2VkIC0gMjsKLSAgICAgICAgICAgIGlmIChjb3B5ID4gbmFsU2l6ZSAtIHNyY09mZnNldCkgewotICAgICAgICAgICAgICAgIGNvcHkgPSBuYWxTaXplIC0gc3JjT2Zmc2V0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1aW50OF90ICpkc3QgPSBvdXQtPmRhdGEoKSArIG91dEJ5dGVzVXNlZDsKLSAgICAgICAgICAgIGRzdFswXSA9IChucmkgPDwgNSkgfCAyODsKLQotICAgICAgICAgICAgZHN0WzFdID0gbmFsVHlwZTsKLQotICAgICAgICAgICAgaWYgKHNyY09mZnNldCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgZHN0WzFdIHw9IDB4ODA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzcmNPZmZzZXQgKyBjb3B5ID09IG5hbFNpemUpIHsKLSAgICAgICAgICAgICAgICBkc3RbMV0gfD0gMHg0MDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWVtY3B5KCZkc3RbMl0sIG5hbFN0YXJ0ICsgc3JjT2Zmc2V0LCBjb3B5KTsKLSAgICAgICAgICAgIHNyY09mZnNldCArPSBjb3B5OwotCi0gICAgICAgICAgICBvdXQtPnNldFJhbmdlKDAsIG91dEJ5dGVzVXNlZCArIGNvcHkgKyAyKTsKLQotICAgICAgICAgICAgcGFja2V0cy5wdXNoX2JhY2sob3V0KTsKLSAgICAgICAgICAgIG91dCA9IG5ldyBBQnVmZmVyKGtNYXhVRFBQYWNrZXRTaXplKTsKLSAgICAgICAgICAgIG91dEJ5dGVzVXNlZCA9IDEyOyAgLy8gUGxhY2Vob2xkZXIgZm9yIFJUUCBoZWFkZXIKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChvdXRCeXRlc1VzZWQgPiAxMikgewotICAgICAgICBvdXQtPnNldFJhbmdlKDAsIG91dEJ5dGVzVXNlZCk7Ci0gICAgICAgIHBhY2tldHMucHVzaF9iYWNrKG91dCk7Ci0gICAgfQotCi0gICAgd2hpbGUgKCFwYWNrZXRzLmVtcHR5KCkpIHsKLSAgICAgICAgc3A8QUJ1ZmZlcj4gb3V0ID0gKnBhY2tldHMuYmVnaW4oKTsKLSAgICAgICAgcGFja2V0cy5lcmFzZShwYWNrZXRzLmJlZ2luKCkpOwotCi0gICAgICAgIG91dC0+c2V0SW50MzJEYXRhKG1SVFBTZXFObyk7Ci0KLSAgICAgICAgYm9vbCBsYXN0ID0gcGFja2V0cy5lbXB0eSgpOwotCi0gICAgICAgIHVpbnQ4X3QgKmRzdCA9IG91dC0+ZGF0YSgpOwotCi0gICAgICAgIGRzdFswXSA9IDB4ODA7Ci0KLSAgICAgICAgZHN0WzFdID0gcGFja2V0VHlwZTsKLSAgICAgICAgaWYgKGxhc3QpIHsKLSAgICAgICAgICAgIGRzdFsxXSB8PSAxIDw8IDc7ICAvLyBNLWJpdAotICAgICAgICB9Ci0KLSAgICAgICAgZHN0WzJdID0gKG1SVFBTZXFObyA+PiA4KSAmIDB4ZmY7Ci0gICAgICAgIGRzdFszXSA9IG1SVFBTZXFObyAmIDB4ZmY7Ci0gICAgICAgICsrbVJUUFNlcU5vOwotCi0gICAgICAgIGRzdFs0XSA9IHJ0cFRpbWUgPj4gMjQ7Ci0gICAgICAgIGRzdFs1XSA9IChydHBUaW1lID4+IDE2KSAmIDB4ZmY7Ci0gICAgICAgIGRzdFs2XSA9IChydHBUaW1lID4+IDgpICYgMHhmZjsKLSAgICAgICAgZHN0WzddID0gcnRwVGltZSAmIDB4ZmY7Ci0gICAgICAgIGRzdFs4XSA9IGtTb3VyY2VJRCA+PiAyNDsKLSAgICAgICAgZHN0WzldID0gKGtTb3VyY2VJRCA+PiAxNikgJiAweGZmOwotICAgICAgICBkc3RbMTBdID0gKGtTb3VyY2VJRCA+PiA4KSAmIDB4ZmY7Ci0gICAgICAgIGRzdFsxMV0gPSBrU291cmNlSUQgJiAweGZmOwotCi0gICAgICAgIHN0YXR1c190IGVyciA9IHNlbmRSVFBQYWNrZXQob3V0LCB0cnVlIC8qIHN0b3JlSW5IaXN0b3J5ICovKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBSVFBTZW5kZXI6OnNlbmRSVFBQYWNrZXQoCi0gICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsIGJvb2wgc3RvcmVJbkhpc3RvcnksCi0gICAgICAgIGJvb2wgdGltZVZhbGlkLCBpbnQ2NF90IHRpbWVVcykgewotICAgIENIRUNLKG1SVFBDb25uZWN0ZWQpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gbU5ldFNlc3Npb24tPnNlbmRSZXF1ZXN0KAotICAgICAgICAgICAgbVJUUFNlc3Npb25JRCwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpLAotICAgICAgICAgICAgdGltZVZhbGlkLCB0aW1lVXMpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1MYXN0TlRQVGltZSA9IEdldE5vd05UUCgpOwotICAgIG1MYXN0UlRQVGltZSA9IFUzMl9BVChidWZmZXItPmRhdGEoKSArIDQpOwotCi0gICAgKyttTnVtUlRQU2VudDsKLSAgICBtTnVtUlRQT2N0ZXRzU2VudCArPSBidWZmZXItPnNpemUoKSAtIDEyOwotCi0gICAgaWYgKHN0b3JlSW5IaXN0b3J5KSB7Ci0gICAgICAgIGlmIChtSGlzdG9yeVNpemUgPT0ga01heEhpc3RvcnlTaXplKSB7Ci0gICAgICAgICAgICBtSGlzdG9yeS5lcmFzZShtSGlzdG9yeS5iZWdpbigpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICsrbUhpc3RvcnlTaXplOwotICAgICAgICB9Ci0gICAgICAgIG1IaXN0b3J5LnB1c2hfYmFjayhidWZmZXIpOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotLy8gc3RhdGljCi11aW50NjRfdCBSVFBTZW5kZXI6OkdldE5vd05UUCgpIHsKLSAgICBzdHJ1Y3QgdGltZXZhbCB0djsKLSAgICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMIC8qIHRpbWV6b25lICovKTsKLQotICAgIHVpbnQ2NF90IG5vd1VzID0gdHYudHZfc2VjICogMTAwMDAwMGxsICsgdHYudHZfdXNlYzsKLQotICAgIG5vd1VzICs9ICgoNzBsbCAqIDM2NSArIDE3KSAqIDI0KSAqIDYwICogNjAgKiAxMDAwMDAwbGw7Ci0KLSAgICB1aW50NjRfdCBoaSA9IG5vd1VzIC8gMTAwMDAwMGxsOwotICAgIHVpbnQ2NF90IGxvID0gKCgxbGwgPDwgMzIpICogKG5vd1VzICUgMTAwMDAwMGxsKSkgLyAxMDAwMDAwbGw7Ci0KLSAgICByZXR1cm4gKGhpIDw8IDMyKSB8IGxvOwotfQotCi12b2lkIFJUUFNlbmRlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7Ci0gICAgICAgIGNhc2Uga1doYXRSVFBOb3RpZnk6Ci0gICAgICAgIGNhc2Uga1doYXRSVENQTm90aWZ5OgotICAgICAgICAgICAgb25OZXROb3RpZnkobXNnLT53aGF0KCkgPT0ga1doYXRSVFBOb3RpZnksIG1zZyk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVFJFU1BBU1MoKTsKLSAgICB9Ci19Ci0KLXZvaWQgUlRQU2VuZGVyOjpvbk5ldE5vdGlmeShib29sIGlzUlRQLCBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewotICAgIGludDMyX3QgcmVhc29uOwotICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZWFzb24iLCAmcmVhc29uKSk7Ci0KLSAgICBzd2l0Y2ggKHJlYXNvbikgewotICAgICAgICBjYXNlIEFOZXR3b3JrU2Vzc2lvbjo6a1doYXRFcnJvcjoKLSAgICAgICAgewotICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic2Vzc2lvbklEIiwgJnNlc3Npb25JRCkpOwotCi0gICAgICAgICAgICBpbnQzMl90IGVycjsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7Ci0KLSAgICAgICAgICAgIGludDMyX3QgZXJyb3JPY2N1cmVkRHVyaW5nU2VuZDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzZW5kIiwgJmVycm9yT2NjdXJlZER1cmluZ1NlbmQpKTsKLQotICAgICAgICAgICAgQVN0cmluZyBkZXRhaWw7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoImRldGFpbCIsICZkZXRhaWwpKTsKLQotICAgICAgICAgICAgQUxPR0UoIkFuIGVycm9yIG9jY3VycmVkIGR1cmluZyAlcyBpbiBzZXNzaW9uICVkICIKLSAgICAgICAgICAgICAgICAgICIoJWQsICclcycgKCVzKSkuIiwKLSAgICAgICAgICAgICAgICAgIGVycm9yT2NjdXJlZER1cmluZ1NlbmQgPyAic2VuZCIgOiAicmVjZWl2ZSIsCi0gICAgICAgICAgICAgICAgICBzZXNzaW9uSUQsCi0gICAgICAgICAgICAgICAgICBlcnIsCi0gICAgICAgICAgICAgICAgICBkZXRhaWwuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpKTsKLQotICAgICAgICAgICAgbU5ldFNlc3Npb24tPmRlc3Ryb3lTZXNzaW9uKHNlc3Npb25JRCk7Ci0KLSAgICAgICAgICAgIGlmIChzZXNzaW9uSUQgPT0gbVJUUFNlc3Npb25JRCkgewotICAgICAgICAgICAgICAgIG1SVFBTZXNzaW9uSUQgPSAwOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzZXNzaW9uSUQgPT0gbVJUQ1BTZXNzaW9uSUQpIHsKLSAgICAgICAgICAgICAgICBtUlRDUFNlc3Npb25JRCA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghbVJUUENvbm5lY3RlZAotICAgICAgICAgICAgICAgICAgICB8fCAobVJUUE1vZGUgIT0gVFJBTlNQT1JUX05PTkUgJiYgIW1SVENQQ29ubmVjdGVkKSkgewotICAgICAgICAgICAgICAgIC8vIFdlIGhhdmVuJ3QgY29tcGxldGVkIGluaXRpYWxpemF0aW9uLCBhdHRhY2ggdGhlIGVycm9yCi0gICAgICAgICAgICAgICAgLy8gdG8gdGhlIG5vdGlmaWNhdGlvbiBpbnN0ZWFkLgotICAgICAgICAgICAgICAgIG5vdGlmeUluaXREb25lKGVycik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG5vdGlmeUVycm9yKGVycik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgQU5ldHdvcmtTZXNzaW9uOjprV2hhdERhdGFncmFtOgotICAgICAgICB7Ci0gICAgICAgICAgICBzcDxBQnVmZmVyPiBkYXRhOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kQnVmZmVyKCJkYXRhIiwgJmRhdGEpKTsKLQotICAgICAgICAgICAgaWYgKGlzUlRQKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIkh1aD8gUmVjZWl2ZWQgZGF0YSBvbiBSVFAgY29ubmVjdGlvbi4uLiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvblJUQ1BEYXRhKGRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEFOZXR3b3JrU2Vzc2lvbjo6a1doYXRDb25uZWN0ZWQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInNlc3Npb25JRCIsICZzZXNzaW9uSUQpKTsKLQotICAgICAgICAgICAgaWYgIChpc1JUUCkgewotICAgICAgICAgICAgICAgIENIRUNLX0VRKG1SVFBNb2RlLCBUUkFOU1BPUlRfVENQKTsKLSAgICAgICAgICAgICAgICBDSEVDS19FUShzZXNzaW9uSUQsIG1SVFBTZXNzaW9uSUQpOwotICAgICAgICAgICAgICAgIG1SVFBDb25uZWN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDSEVDS19FUShtUlRDUE1vZGUsIFRSQU5TUE9SVF9UQ1ApOwotICAgICAgICAgICAgICAgIENIRUNLX0VRKHNlc3Npb25JRCwgbVJUQ1BTZXNzaW9uSUQpOwotICAgICAgICAgICAgICAgIG1SVENQQ29ubmVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1SVFBDb25uZWN0ZWQKLSAgICAgICAgICAgICAgICAgICAgJiYgKG1SVENQTW9kZSA9PSBUUkFOU1BPUlRfTk9ORSB8fCBtUlRDUENvbm5lY3RlZCkpIHsKLSAgICAgICAgICAgICAgICBub3RpZnlJbml0RG9uZShPSyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgQU5ldHdvcmtTZXNzaW9uOjprV2hhdE5ldHdvcmtTdGFsbDoKLSAgICAgICAgewotICAgICAgICAgICAgc2l6ZV90IG51bUJ5dGVzUXVldWVkOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgibnVtQnl0ZXNRdWV1ZWQiLCAmbnVtQnl0ZXNRdWV1ZWQpKTsKLQotICAgICAgICAgICAgbm90aWZ5TmV0d29ya1N0YWxsKG51bUJ5dGVzUXVldWVkKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBSVFBTZW5kZXI6Om9uUlRDUERhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgewotICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKLSAgICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpOwotCi0gICAgd2hpbGUgKHNpemUgPiAwKSB7Ci0gICAgICAgIGlmIChzaXplIDwgOCkgewotICAgICAgICAgICAgLy8gVG9vIHNob3J0IHRvIGJlIGEgdmFsaWQgUlRDUCBoZWFkZXIKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKGRhdGFbMF0gPj4gNikgIT0gMikgewotICAgICAgICAgICAgLy8gVW5zdXBwb3J0ZWQgdmVyc2lvbi4KLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkYXRhWzBdICYgMHgyMCkgewotICAgICAgICAgICAgLy8gUGFkZGluZyBwcmVzZW50LgotCi0gICAgICAgICAgICBzaXplX3QgcGFkZGluZ0xlbmd0aCA9IGRhdGFbc2l6ZSAtIDFdOwotCi0gICAgICAgICAgICBpZiAocGFkZGluZ0xlbmd0aCArIDEyID4gc2l6ZSkgewotICAgICAgICAgICAgICAgIC8vIElmIHdlIHJlbW92ZWQgdGhpcyBtdWNoIHBhZGRpbmcgd2UnZCBlbmQgdXAgd2l0aCBzb21ldGhpbmcKLSAgICAgICAgICAgICAgICAvLyB0aGF0J3MgdG9vIHNob3J0IHRvIGJlIGEgdmFsaWQgUlRQIGhlYWRlci4KLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzaXplIC09IHBhZGRpbmdMZW5ndGg7Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgaGVhZGVyTGVuZ3RoID0gNCAqIChkYXRhWzJdIDw8IDggfCBkYXRhWzNdKSArIDQ7Ci0KLSAgICAgICAgaWYgKHNpemUgPCBoZWFkZXJMZW5ndGgpIHsKLSAgICAgICAgICAgIC8vIE9ubHkgcmVjZWl2ZWQgYSBwYXJ0aWFsIHBhY2tldD8KLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKGRhdGFbMV0pIHsKLSAgICAgICAgICAgIGNhc2UgMjAwOgotICAgICAgICAgICAgY2FzZSAyMDE6ICAvLyBSUgotICAgICAgICAgICAgICAgIHBhcnNlUmVjZWl2ZXJSZXBvcnQoZGF0YSwgaGVhZGVyTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAyMDI6ICAvLyBTREVTCi0gICAgICAgICAgICBjYXNlIDIwMzoKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAyMDQ6ICAvLyBBUFAKLSAgICAgICAgICAgICAgICBwYXJzZUFQUChkYXRhLCBoZWFkZXJMZW5ndGgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDIwNTogIC8vIFRTRkIgKHRyYW5zcG9ydCBsYXllciBzcGVjaWZpYyBmZWVkYmFjaykKLSAgICAgICAgICAgICAgICBwYXJzZVRTRkIoZGF0YSwgaGVhZGVyTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAyMDY6ICAvLyBQU0ZCIChwYXlsb2FkIHNwZWNpZmljIGZlZWRiYWNrKQotICAgICAgICAgICAgICAgIC8vIGhleGR1bXAoZGF0YSwgaGVhZGVyTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiVW5rbm93biBSVENQIHBhY2tldCB0eXBlICV1IG9mIHNpemUgJXp1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClkYXRhWzFdLCBoZWFkZXJMZW5ndGgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZGF0YSArPSBoZWFkZXJMZW5ndGg7Ci0gICAgICAgIHNpemUgLT0gaGVhZGVyTGVuZ3RoOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUlRQU2VuZGVyOjpwYXJzZVJlY2VpdmVyUmVwb3J0KAotICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgLyogc2l6ZSAqLykgewotICAgIGZsb2F0IGZyYWN0aW9uTG9zdCA9IGRhdGFbMTJdIC8gMjU2LjBmOwotCi0gICAgQUxPR0koImxvc3QgJS4yZiAlJSBvZiBwYWNrZXRzIGR1cmluZyByZXBvcnQgaW50ZXJ2YWwuIiwKLSAgICAgICAgICAxMDAuMGYgKiBmcmFjdGlvbkxvc3QpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBSVFBTZW5kZXI6OnBhcnNlVFNGQihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIGlmICgoZGF0YVswXSAmIDB4MWYpICE9IDEpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOyAgLy8gV2Ugb25seSBzdXBwb3J0IE5BQ0sgZm9yIG5vdy4KLSAgICB9Ci0KLSAgICB1aW50MzJfdCBzcmNJZCA9IFUzMl9BVCgmZGF0YVs4XSk7Ci0gICAgaWYgKHNyY0lkICE9IGtTb3VyY2VJRCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAxMjsgaSA8IHNpemU7IGkgKz0gNCkgewotICAgICAgICB1aW50MTZfdCBzZXFObyA9IFUxNl9BVCgmZGF0YVtpXSk7Ci0gICAgICAgIHVpbnQxNl90IGJscCA9IFUxNl9BVCgmZGF0YVtpICsgMl0pOwotCi0gICAgICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBtSGlzdG9yeS5iZWdpbigpOwotICAgICAgICBib29sIGZvdW5kU2VxTm8gPSBmYWxzZTsKLSAgICAgICAgd2hpbGUgKGl0ICE9IG1IaXN0b3J5LmVuZCgpKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyID0gKml0OwotCi0gICAgICAgICAgICB1aW50MTZfdCBidWZmZXJTZXFObyA9IGJ1ZmZlci0+aW50MzJEYXRhKCkgJiAweGZmZmY7Ci0KLSAgICAgICAgICAgIGJvb2wgcmV0cmFuc21pdCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKGJ1ZmZlclNlcU5vID09IHNlcU5vKSB7Ci0gICAgICAgICAgICAgICAgcmV0cmFuc21pdCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGJscCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxNjsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoYmxwICYgKDEgPDwgaSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoYnVmZmVyU2VxTm8gPT0gKChzZXFObyArIGkgKyAxKSAmIDB4ZmZmZikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBibHAgJj0gfigxIDw8IGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmFuc21pdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZXRyYW5zbWl0KSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInJldHJhbnNtaXR0aW5nIHNlcU5vICVkIiwgYnVmZmVyU2VxTm8pOwotCi0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRSVFBQYWNrZXQoYnVmZmVyLCBmYWxzZSAvKiBzdG9yZUluSGlzdG9yeSAqLykpOwotCi0gICAgICAgICAgICAgICAgaWYgKGJ1ZmZlclNlcU5vID09IHNlcU5vKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kU2VxTm8gPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChmb3VuZFNlcU5vICYmIGJscCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgKytpdDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghZm91bmRTZXFObyB8fCBibHAgIT0gMCkgewotICAgICAgICAgICAgQUxPR0koIlNvbWUgc2VxdWVuY2UgbnVtYmVycyB3ZXJlIG5vIGxvbmdlciBhdmFpbGFibGUgZm9yICIKLSAgICAgICAgICAgICAgICAgICJyZXRyYW5zbWlzc2lvbiAoc2VxTm8gPSAlZCwgZm91bmRTZXFObyA9ICVkLCBibHAgPSAweCUwNHgpIiwKLSAgICAgICAgICAgICAgICAgIHNlcU5vLCBmb3VuZFNlcU5vLCBibHApOwotCi0gICAgICAgICAgICBpZiAoIW1IaXN0b3J5LmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IGVhcmxpZXN0ID0gKCptSGlzdG9yeS5iZWdpbigpKS0+aW50MzJEYXRhKCkgJiAweGZmZmY7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBsYXRlc3QgPSAoKi0tbUhpc3RvcnkuZW5kKCkpLT5pbnQzMkRhdGEoKSAmIDB4ZmZmZjsKLQotICAgICAgICAgICAgICAgIEFMT0dJKCJoYXZlIHNlcSBudW1iZXJzIGZyb20gJWQgLSAlZCIsIGVhcmxpZXN0LCBsYXRlc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBSVFBTZW5kZXI6OnBhcnNlQVBQKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBsYXRlX29mZnNldCA9IDg7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgbGF0ZV9zdHJpbmdbXSA9ICJsYXRlIjsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGF2Z0xhdGVuY3lVc19vZmZzZXQgPSBsYXRlX29mZnNldCArIHNpemVvZihsYXRlX3N0cmluZykgLSAxOwotICAgIHN0YXRpYyBjb25zdCBzaXplX3QgbWF4TGF0ZW5jeVVzX29mZnNldCA9IGF2Z0xhdGVuY3lVc19vZmZzZXQgKyBzaXplb2YoaW50NjRfdCk7Ci0KLSAgICBpZiAoKHNpemUgPj0gKG1heExhdGVuY3lVc19vZmZzZXQgKyBzaXplb2YoaW50NjRfdCkpKQotICAgICAgICAgICAgJiYgIW1lbWNtcChsYXRlX3N0cmluZywgJmRhdGFbbGF0ZV9vZmZzZXRdLCBzaXplb2YobGF0ZV9zdHJpbmcpIC0gMSkpIHsKLSAgICAgICAgaW50NjRfdCBhdmdMYXRlbmN5VXMgPSAoaW50NjRfdClVNjRfQVQoJmRhdGFbYXZnTGF0ZW5jeVVzX29mZnNldF0pOwotICAgICAgICBpbnQ2NF90IG1heExhdGVuY3lVcyA9IChpbnQ2NF90KVU2NF9BVCgmZGF0YVttYXhMYXRlbmN5VXNfb2Zmc2V0XSk7Ci0KLSAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRJbmZvcm1TZW5kZXIpOwotICAgICAgICBub3RpZnktPnNldEludDY0KCJhdmdMYXRlbmN5VXMiLCBhdmdMYXRlbmN5VXMpOwotICAgICAgICBub3RpZnktPnNldEludDY0KCJtYXhMYXRlbmN5VXMiLCBtYXhMYXRlbmN5VXMpOwotICAgICAgICBub3RpZnktPnBvc3QoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgUlRQU2VuZGVyOjpub3RpZnlJbml0RG9uZShzdGF0dXNfdCBlcnIpIHsKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0SW5pdERvbmUpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0gICAgbm90aWZ5LT5wb3N0KCk7Ci19Ci0KLXZvaWQgUlRQU2VuZGVyOjpub3RpZnlFcnJvcihzdGF0dXNfdCBlcnIpIHsKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RXJyb3IpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0gICAgbm90aWZ5LT5wb3N0KCk7Ci19Ci0KLXZvaWQgUlRQU2VuZGVyOjpub3RpZnlOZXR3b3JrU3RhbGwoc2l6ZV90IG51bUJ5dGVzUXVldWVkKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdE5ldHdvcmtTdGFsbCk7Ci0gICAgbm90aWZ5LT5zZXRTaXplKCJudW1CeXRlc1F1ZXVlZCIsIG51bUJ5dGVzUXVldWVkKTsKLSAgICBub3RpZnktPnBvc3QoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3J0cC9SVFBTZW5kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9ydHAvUlRQU2VuZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZGZkMDEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3J0cC9SVFBTZW5kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFJUUF9TRU5ERVJfSF8KLQotI2RlZmluZSBSVFBfU0VOREVSX0hfCi0KLSNpbmNsdWRlICJSVFBCYXNlLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEFCdWZmZXI7Ci1zdHJ1Y3QgQU5ldHdvcmtTZXNzaW9uOwotCi0vLyBBbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBmYWNpbGl0YXRlcyBzZW5kaW5nIG9mIG1lZGlhIGRhdGEgb3ZlciBhbiBSVFAKLS8vIGNoYW5uZWwuIFRoZSBjaGFubmVsIGlzIGVzdGFibGlzaGVkIG92ZXIgYSBVRFAgb3IgVENQIGNvbm5lY3Rpb24gZGVwZW5kaW5nCi0vLyBvbiB3aGljaCAiVHJhbnNwb3J0TW9kZSIgd2FzIGNob3Nlbi4gSW4gYWRkaXRpb24gZGlmZmVyZW50IFJUUCBwYWNrZXRpemF0aW9uCi0vLyBzY2hlbWVzIGFyZSBzdXBwb3J0ZWQgc3VjaCBhcyAiVHJhbnNwb3J0IFN0cmVhbSBQYWNrZXRzIG92ZXIgUlRQIiwKLS8vIG9yICJBVkMvSC4yNjQgZW5jYXBzdWxhdGlvbiBhcyBzcGVjaWZpZWQgaW4gUkZDIDM5ODQgKG5vbi1pbnRlcmxlYXZlZCBtb2RlKSIKLXN0cnVjdCBSVFBTZW5kZXIgOiBwdWJsaWMgUlRQQmFzZSwgcHVibGljIEFIYW5kbGVyIHsKLSAgICBlbnVtIHsKLSAgICAgICAga1doYXRJbml0RG9uZSwKLSAgICAgICAga1doYXRFcnJvciwKLSAgICAgICAga1doYXROZXR3b3JrU3RhbGwsCi0gICAgICAgIGtXaGF0SW5mb3JtU2VuZGVyLAotICAgIH07Ci0gICAgUlRQU2VuZGVyKAotICAgICAgICAgICAgY29uc3Qgc3A8QU5ldHdvcmtTZXNzaW9uPiAmbmV0U2Vzc2lvbiwKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KTsKLQotICAgIHN0YXR1c190IGluaXRBc3luYygKLSAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmVtb3RlSG9zdCwKLSAgICAgICAgICAgICAgaW50MzJfdCByZW1vdGVSVFBQb3J0LAotICAgICAgICAgICAgICBUcmFuc3BvcnRNb2RlIHJ0cE1vZGUsCi0gICAgICAgICAgICAgIGludDMyX3QgcmVtb3RlUlRDUFBvcnQsCi0gICAgICAgICAgICAgIFRyYW5zcG9ydE1vZGUgcnRjcE1vZGUsCi0gICAgICAgICAgICAgIGludDMyX3QgKm91dExvY2FsUlRQUG9ydCk7Ci0KLSAgICBzdGF0dXNfdCBxdWV1ZUJ1ZmZlcigKLSAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsCi0gICAgICAgICAgICB1aW50OF90IHBhY2tldFR5cGUsCi0gICAgICAgICAgICBQYWNrZXRpemF0aW9uTW9kZSBtb2RlKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgflJUUFNlbmRlcigpOwotICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0KLXByaXZhdGU6Ci0gICAgZW51bSB7Ci0gICAgICAgIGtXaGF0UlRQTm90aWZ5LAotICAgICAgICBrV2hhdFJUQ1BOb3RpZnksCi0gICAgfTsKLQotICAgIGNvbnN0IHVuc2lnbmVkIGludCBrTWF4TnVtVFNQYWNrZXRzUGVyUlRQUGFja2V0ID0gKGtNYXhVRFBQYWNrZXRTaXplIC0gMTIpIC8gMTg4OwotICAgIGNvbnN0IHVuc2lnbmVkIGludCBrTWF4SGlzdG9yeVNpemUgICAgICAgICAgICAgID0gMTAyNDsKLSAgICBjb25zdCB1bnNpZ25lZCBpbnQga1NvdXJjZUlEICAgICAgICAgICAgICAgICAgICA9IDB4ZGVhZGJlZWY7Ci0KLSAgICBzcDxBTmV0d29ya1Nlc3Npb24+IG1OZXRTZXNzaW9uOwotICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OwotICAgIFRyYW5zcG9ydE1vZGUgbVJUUE1vZGU7Ci0gICAgVHJhbnNwb3J0TW9kZSBtUlRDUE1vZGU7Ci0gICAgaW50MzJfdCBtUlRQU2Vzc2lvbklEOwotICAgIGludDMyX3QgbVJUQ1BTZXNzaW9uSUQ7Ci0gICAgYm9vbCBtUlRQQ29ubmVjdGVkOwotICAgIGJvb2wgbVJUQ1BDb25uZWN0ZWQ7Ci0KLSAgICB1aW50NjRfdCBtTGFzdE5UUFRpbWU7Ci0gICAgdWludDMyX3QgbUxhc3RSVFBUaW1lOwotICAgIHVpbnQzMl90IG1OdW1SVFBTZW50OwotICAgIHVpbnQzMl90IG1OdW1SVFBPY3RldHNTZW50OwotICAgIHVpbnQzMl90IG1OdW1TUnNTZW50OwotCi0gICAgdWludDMyX3QgbVJUUFNlcU5vOwotCi0gICAgTGlzdDxzcDxBQnVmZmVyPiA+IG1IaXN0b3J5OwotICAgIHNpemVfdCBtSGlzdG9yeVNpemU7Ci0KLSAgICBzdGF0aWMgdWludDY0X3QgR2V0Tm93TlRQKCk7Ci0KLSAgICBzdGF0dXNfdCBxdWV1ZVJhd1BhY2tldChjb25zdCBzcDxBQnVmZmVyPiAmdHNQYWNrZXRzLCB1aW50OF90IHBhY2tldFR5cGUpOwotICAgIHN0YXR1c190IHF1ZXVlVFNQYWNrZXRzKGNvbnN0IHNwPEFCdWZmZXI+ICZ0c1BhY2tldHMsIHVpbnQ4X3QgcGFja2V0VHlwZSk7Ci0gICAgc3RhdHVzX3QgcXVldWVBVkNCdWZmZXIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQsIHVpbnQ4X3QgcGFja2V0VHlwZSk7Ci0KLSAgICBzdGF0dXNfdCBzZW5kUlRQUGFja2V0KAotICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJnBhY2tldCwgYm9vbCBzdG9yZUluSGlzdG9yeSwKLSAgICAgICAgICAgIGJvb2wgdGltZVZhbGlkID0gZmFsc2UsIGludDY0X3QgdGltZVVzID0gLTFsbCk7Ci0KLSAgICB2b2lkIG9uTmV0Tm90aWZ5KGJvb2wgaXNSVFAsIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLQotICAgIHN0YXR1c190IG9uUlRDUERhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmRhdGEpOwotICAgIHN0YXR1c190IHBhcnNlUmVjZWl2ZXJSZXBvcnQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOwotICAgIHN0YXR1c190IHBhcnNlVFNGQihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0gICAgc3RhdHVzX3QgcGFyc2VBUFAoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOwotCi0gICAgdm9pZCBub3RpZnlJbml0RG9uZShzdGF0dXNfdCBlcnIpOwotICAgIHZvaWQgbm90aWZ5RXJyb3Ioc3RhdHVzX3QgZXJyKTsKLSAgICB2b2lkIG5vdGlmeU5ldHdvcmtTdGFsbChzaXplX3QgbnVtQnl0ZXNRdWV1ZWQpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUlRQU2VuZGVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gUlRQX1NFTkRFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9Db252ZXJ0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9Db252ZXJ0ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzNhZjE4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvQ29udmVydGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDgyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkNvbnZlcnRlciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnRlci5oIgotCi0jaW5jbHVkZSAiTWVkaWFQdWxsZXIuaCIKLSNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgotCi0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgotI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLQotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotCi0jaW5jbHVkZSA8T01YX1ZpZGVvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotQ29udmVydGVyOjpDb252ZXJ0ZXIoCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmY29kZWNMb29wZXIsCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0LAotICAgICAgICB1aW50MzJfdCBmbGFncykKLSAgICA6IG1Ob3RpZnkobm90aWZ5KSwKLSAgICAgIG1Db2RlY0xvb3Blcihjb2RlY0xvb3BlciksCi0gICAgICBtT3V0cHV0Rm9ybWF0KG91dHB1dEZvcm1hdCksCi0gICAgICBtRmxhZ3MoZmxhZ3MpLAotICAgICAgbUlzVmlkZW8oZmFsc2UpLAotICAgICAgbUlzSDI2NChmYWxzZSksCi0gICAgICBtSXNQQ01BdWRpbyhmYWxzZSksCi0gICAgICBtTmVlZFRvTWFudWFsbHlQcmVwZW5kU1BTUFBTKGZhbHNlKSwKLSAgICAgIG1Eb01vcmVXb3JrUGVuZGluZyhmYWxzZSkKLSNpZiBFTkFCTEVfU0lMRU5DRV9ERVRFQ1RJT04KLSAgICAgICxtRmlyc3RTaWxlbnRGcmFtZVVzKC0xbGwpCi0gICAgICAsbUluU2lsZW50TW9kZShmYWxzZSkKLSNlbmRpZgotICAgICAgLG1QcmV2VmlkZW9CaXRyYXRlKC0xKQotICAgICAgLG1OdW1GcmFtZXNUb0Ryb3AoMCkKLSAgICAgICxtRW5jb2RpbmdTdXNwZW5kZWQoZmFsc2UpCi0gICAgewotICAgIEFTdHJpbmcgbWltZTsKLSAgICBDSEVDSyhtT3V0cHV0Rm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKLQotICAgIGlmICghc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUuY19zdHIoKSwgNikpIHsKLSAgICAgICAgbUlzVmlkZW8gPSB0cnVlOwotCi0gICAgICAgIG1Jc0gyNjQgPSAhc3RyY2FzZWNtcChtaW1lLmNfc3RyKCksIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7Ci0gICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19SQVcsIG1pbWUuY19zdHIoKSkpIHsKLSAgICAgICAgbUlzUENNQXVkaW8gPSB0cnVlOwotICAgIH0KLX0KLQotdm9pZCBDb252ZXJ0ZXI6OnJlbGVhc2VFbmNvZGVyKCkgewotICAgIGlmIChtRW5jb2RlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtRW5jb2Rlci0+cmVsZWFzZSgpOwotICAgIG1FbmNvZGVyLmNsZWFyKCk7Ci0KLSAgICBtSW5wdXRCdWZmZXJRdWV1ZS5jbGVhcigpOwotICAgIG1FbmNvZGVySW5wdXRCdWZmZXJzLmNsZWFyKCk7Ci0gICAgbUVuY29kZXJPdXRwdXRCdWZmZXJzLmNsZWFyKCk7Ci19Ci0KLUNvbnZlcnRlcjo6fkNvbnZlcnRlcigpIHsKLSAgICBDSEVDSyhtRW5jb2RlciA9PSBOVUxMKTsKLX0KLQotdm9pZCBDb252ZXJ0ZXI6OnNodXRkb3duQXN5bmMoKSB7Ci0gICAgQUxPR1YoInNodXRkb3duIik7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFNodXRkb3duLCB0aGlzKSktPnBvc3QoKTsKLX0KLQotc3RhdHVzX3QgQ29udmVydGVyOjppbml0KCkgewotICAgIHN0YXR1c190IGVyciA9IGluaXRFbmNvZGVyKCk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJlbGVhc2VFbmNvZGVyKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gQ29udmVydGVyOjpnZXRHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSB7Ci0gICAgQ0hFQ0sobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCk7Ci0gICAgcmV0dXJuIG1HcmFwaGljQnVmZmVyUHJvZHVjZXI7Ci19Ci0KLXNpemVfdCBDb252ZXJ0ZXI6OmdldElucHV0QnVmZmVyQ291bnQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1FbmNvZGVySW5wdXRCdWZmZXJzLnNpemUoKTsKLX0KLQotc3A8QU1lc3NhZ2U+IENvbnZlcnRlcjo6Z2V0T3V0cHV0Rm9ybWF0KCkgY29uc3QgewotICAgIHJldHVybiBtT3V0cHV0Rm9ybWF0OwotfQotCi1ib29sIENvbnZlcnRlcjo6bmVlZFRvTWFudWFsbHlQcmVwZW5kU1BTUFBTKCkgY29uc3QgewotICAgIHJldHVybiBtTmVlZFRvTWFudWFsbHlQcmVwZW5kU1BTUFBTOwotfQotCi0vLyBzdGF0aWMKLWludDMyX3QgQ29udmVydGVyOjpHZXRJbnQzMlByb3BlcnR5KAotICAgICAgICBjb25zdCBjaGFyICpwcm9wTmFtZSwgaW50MzJfdCBkZWZhdWx0VmFsdWUpIHsKLSAgICBjaGFyIHZhbFtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIGlmIChwcm9wZXJ0eV9nZXQocHJvcE5hbWUsIHZhbCwgTlVMTCkpIHsKLSAgICAgICAgY2hhciAqZW5kOwotICAgICAgICB1bnNpZ25lZCBsb25nIHggPSBzdHJ0b3VsKHZhbCwgJmVuZCwgMTApOwotCi0gICAgICAgIGlmICgqZW5kID09ICdcMCcgJiYgZW5kID4gdmFsICYmIHggPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4geDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Ci19Ci0KLXN0YXR1c190IENvbnZlcnRlcjo6aW5pdEVuY29kZXIoKSB7Ci0gICAgQVN0cmluZyBvdXRwdXRNSU1FOwotICAgIENIRUNLKG1PdXRwdXRGb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmb3V0cHV0TUlNRSkpOwotCi0gICAgYm9vbCBpc0F1ZGlvID0gIXN0cm5jYXNlY21wKG91dHB1dE1JTUUuY19zdHIoKSwgImF1ZGlvLyIsIDYpOwotCi0gICAgaWYgKCFtSXNQQ01BdWRpbykgewotICAgICAgICBtRW5jb2RlciA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5VHlwZSgKLSAgICAgICAgICAgICAgICBtQ29kZWNMb29wZXIsIG91dHB1dE1JTUUuY19zdHIoKSwgdHJ1ZSAvKiBlbmNvZGVyICovKTsKLQotICAgICAgICBpZiAobUVuY29kZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1Jc1BDTUF1ZGlvKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGF1ZGlvQml0cmF0ZSA9IEdldEludDMyUHJvcGVydHkoIm1lZGlhLndmZC5hdWRpby1iaXRyYXRlIiwgMTI4MDAwKTsKLSAgICBpbnQzMl90IHZpZGVvQml0cmF0ZSA9IEdldEludDMyUHJvcGVydHkoIm1lZGlhLndmZC52aWRlby1iaXRyYXRlIiwgNTAwMDAwMCk7Ci0gICAgbVByZXZWaWRlb0JpdHJhdGUgPSB2aWRlb0JpdHJhdGU7Ci0KLSAgICBBTE9HSSgidXNpbmcgYXVkaW8gYml0cmF0ZSBvZiAlZCBicHMsIHZpZGVvIGJpdHJhdGUgb2YgJWQgYnBzIiwKLSAgICAgICAgICBhdWRpb0JpdHJhdGUsIHZpZGVvQml0cmF0ZSk7Ci0KLSAgICBpZiAoaXNBdWRpbykgewotICAgICAgICBtT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigiYml0cmF0ZSIsIGF1ZGlvQml0cmF0ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoImJpdHJhdGUiLCB2aWRlb0JpdHJhdGUpOwotICAgICAgICBtT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigiYml0cmF0ZS1tb2RlIiwgT01YX1ZpZGVvX0NvbnRyb2xSYXRlQ29uc3RhbnQpOwotICAgICAgICBtT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigiZnJhbWUtcmF0ZSIsIDMwKTsKLSAgICAgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoImktZnJhbWUtaW50ZXJ2YWwiLCAxNSk7ICAvLyBJZnJhbWVzIGV2ZXJ5IDE1IHNlY3MKLQotICAgICAgICAvLyBDb25maWd1cmUgZW5jb2RlciB0byB1c2UgaW50cmEgbWFjcm9ibG9jayByZWZyZXNoIG1vZGUKLSAgICAgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoImludHJhLXJlZnJlc2gtbW9kZSIsIE9NWF9WSURFT19JbnRyYVJlZnJlc2hDeWNsaWMpOwotCi0gICAgICAgIGludCB3aWR0aCwgaGVpZ2h0LCBtYnM7Ci0gICAgICAgIGlmICghbU91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkKLSAgICAgICAgICAgICAgICB8fCAhbU91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVXBkYXRlIG1hY3JvYmxvY2tzIGluIGEgY3ljbGljIGZhc2hpb24gd2l0aCAxMCUgb2YgYWxsIE1CcyB3aXRoaW4KLSAgICAgICAgLy8gZnJhbWUgZ2V0cyB1cGRhdGVkIGF0IG9uZSB0aW1lLiBJdCB0YWtlcyBhYm91dCAxMCBmcmFtZXMgdG8KLSAgICAgICAgLy8gY29tcGxldGVseSB1cGRhdGUgYSB3aG9sZSB2aWRlbyBmcmFtZS4gSWYgdGhlIGZyYW1lIHJhdGUgaXMgMzAsCi0gICAgICAgIC8vIGl0IHRha2VzIGFib3V0IDMzMyBtcyBpbiB0aGUgYmVzdCBjYXNlIChpZiBuZXh0IGZyYW1lIGlzIG5vdCBhbiBJRFIpCi0gICAgICAgIC8vIHRvIHJlY292ZXIgZnJvbSBhIGxvc3QvY29ycnVwdGVkIHBhY2tldC4KLSAgICAgICAgbWJzID0gKCgod2lkdGggKyAxNSkgLyAxNikgKiAoKGhlaWdodCArIDE1KSAvIDE2KSAqIDEwKSAvIDEwMDsKLSAgICAgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoImludHJhLXJlZnJlc2gtQ0lSLW1icyIsIG1icyk7Ci0gICAgfQotCi0gICAgQUxPR1YoIm91dHB1dCBmb3JtYXQgaXMgJyVzJyIsIG1PdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKDApLmNfc3RyKCkpOwotCi0gICAgbU5lZWRUb01hbnVhbGx5UHJlcGVuZFNQU1BQUyA9IGZhbHNlOwotCi0gICAgc3RhdHVzX3QgZXJyID0gTk9fSU5JVDsKLQotICAgIGlmICghaXNBdWRpbykgewotICAgICAgICBzcDxBTWVzc2FnZT4gdG1wID0gbU91dHB1dEZvcm1hdC0+ZHVwKCk7Ci0gICAgICAgIHRtcC0+c2V0SW50MzIoInByZXBlbmQtc3BzLXBwcy10by1pZHItZnJhbWVzIiwgMSk7Ci0KLSAgICAgICAgZXJyID0gbUVuY29kZXItPmNvbmZpZ3VyZSgKLSAgICAgICAgICAgICAgICB0bXAsCi0gICAgICAgICAgICAgICAgTlVMTCAvKiBuYXRpdmVXaW5kb3cgKi8sCi0gICAgICAgICAgICAgICAgTlVMTCAvKiBjcnlwdG8gKi8sCi0gICAgICAgICAgICAgICAgTWVkaWFDb2RlYzo6Q09ORklHVVJFX0ZMQUdfRU5DT0RFKTsKLQotICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAvLyBFbmNvZGVyIHN1cHBvcnRlZCBwcmVwZW5kaW5nIFNQUy9QUFMsIHdlIGRvbid0IG5lZWQgdG8gZW11bGF0ZQotICAgICAgICAgICAgLy8gaXQuCi0gICAgICAgICAgICBtT3V0cHV0Rm9ybWF0ID0gdG1wOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU5lZWRUb01hbnVhbGx5UHJlcGVuZFNQU1BQUyA9IHRydWU7Ci0KLSAgICAgICAgICAgIEFMT0dJKCJXZSBnb2luZyB0byBtYW51YWxseSBwcmVwZW5kIFNQUyBhbmQgUFBTIHRvIElEUiBmcmFtZXMuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIC8vIFdlJ2xsIGdldCBoZXJlIGZvciBhdWRpbyBvciBpZiB3ZSBmYWlsZWQgdG8gY29uZmlndXJlIHRoZSBlbmNvZGVyCi0gICAgICAgIC8vIHRvIGF1dG9tYXRpY2FsbHkgcHJlcGVuZCBTUFMvUFBTIGluIHRoZSBjYXNlIG9mIHZpZGVvLgotCi0gICAgICAgIGVyciA9IG1FbmNvZGVyLT5jb25maWd1cmUoCi0gICAgICAgICAgICAgICAgICAgIG1PdXRwdXRGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgIE5VTEwgLyogbmF0aXZlV2luZG93ICovLAotICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIGNyeXB0byAqLywKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFDb2RlYzo6Q09ORklHVVJFX0ZMQUdfRU5DT0RFKTsKLSAgICB9Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpIHsKLSAgICAgICAgQ0hFQ0sobUlzVmlkZW8pOwotCi0gICAgICAgIGVyciA9IG1FbmNvZGVyLT5jcmVhdGVJbnB1dFN1cmZhY2UoJm1HcmFwaGljQnVmZmVyUHJvZHVjZXIpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBlcnIgPSBtRW5jb2Rlci0+c3RhcnQoKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSBtRW5jb2Rlci0+Z2V0SW5wdXRCdWZmZXJzKCZtRW5jb2RlcklucHV0QnVmZmVycyk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gbUVuY29kZXItPmdldE91dHB1dEJ1ZmZlcnMoJm1FbmNvZGVyT3V0cHV0QnVmZmVycyk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpIHsKLSAgICAgICAgc2NoZWR1bGVEb01vcmVXb3JrKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIENvbnZlcnRlcjo6bm90aWZ5RXJyb3Ioc3RhdHVzX3QgZXJyKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEVycm9yKTsKLSAgICBub3RpZnktPnNldEludDMyKCJlcnIiLCBlcnIpOwotICAgIG5vdGlmeS0+cG9zdCgpOwotfQotCi0vLyBzdGF0aWMKLWJvb2wgQ29udmVydGVyOjpJc1NpbGVuY2UoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpIHsKLSAgICBjb25zdCB1aW50OF90ICpwdHIgPSBhY2Nlc3NVbml0LT5kYXRhKCk7Ci0gICAgY29uc3QgdWludDhfdCAqZW5kID0gcHRyICsgYWNjZXNzVW5pdC0+c2l6ZSgpOwotICAgIHdoaWxlIChwdHIgPCBlbmQpIHsKLSAgICAgICAgaWYgKCpwdHIgIT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgICsrcHRyOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIENvbnZlcnRlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7Ci0gICAgICAgIGNhc2Uga1doYXRNZWRpYVB1bGxlck5vdGlmeToKLSAgICAgICAgewotICAgICAgICAgICAgaW50MzJfdCB3aGF0OwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIndoYXQiLCAmd2hhdCkpOwotCi0gICAgICAgICAgICBpZiAoIW1Jc1BDTUF1ZGlvICYmIG1FbmNvZGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiZ290IG1zZyAnJXMnIGFmdGVyIGVuY29kZXIgc2h1dGRvd24uIiwKLSAgICAgICAgICAgICAgICAgICAgICBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVB1bGxlcjo6a1doYXRBY2Nlc3NVbml0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQ7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEJ1ZmZlcigiYWNjZXNzVW5pdCIsICZhY2Nlc3NVbml0KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+c2V0TWVkaWFCdWZmZXJCYXNlKE5VTEwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHdoYXQgPT0gTWVkaWFQdWxsZXI6OmtXaGF0RU9TKSB7Ci0gICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyUXVldWUucHVzaF9iYWNrKE5VTEwpOwotCi0gICAgICAgICAgICAgICAgZmVlZEVuY29kZXJJbnB1dEJ1ZmZlcnMoKTsKLQotICAgICAgICAgICAgICAgIHNjaGVkdWxlRG9Nb3JlV29yaygpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDSEVDS19FUSh3aGF0LCBNZWRpYVB1bGxlcjo6a1doYXRBY2Nlc3NVbml0KTsKLQotICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQ7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kQnVmZmVyKCJhY2Nlc3NVbml0IiwgJmFjY2Vzc1VuaXQpKTsKLQotICAgICAgICAgICAgICAgIGlmIChtTnVtRnJhbWVzVG9Ecm9wID4gMCB8fCBtRW5jb2RpbmdTdXNwZW5kZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1OdW1GcmFtZXNUb0Ryb3AgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAtLW1OdW1GcmFtZXNUb0Ryb3A7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgiZHJvcHBpbmcgZnJhbWUuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5zZXRNZWRpYUJ1ZmZlckJhc2UoTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotI2lmIDAKLSAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqbWJ1ZiA9Ci0gICAgICAgICAgICAgICAgICAgIChNZWRpYUJ1ZmZlciAqKShhY2Nlc3NVbml0LT5nZXRNZWRpYUJ1ZmZlckJhc2UoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1idWYgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HSSgicXVldWVpbmcgbWJ1ZiAlcCIsIG1idWYpOwotICAgICAgICAgICAgICAgICAgICBtYnVmLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgfQotI2VuZGlmCi0KLSNpZiBFTkFCTEVfU0lMRU5DRV9ERVRFQ1RJT04KLSAgICAgICAgICAgICAgICBpZiAoIW1Jc1ZpZGVvKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChJc1NpbGVuY2UoYWNjZXNzVW5pdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSW5TaWxlbnRNb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZpcnN0U2lsZW50RnJhbWVVcyA8IDBsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaXJzdFNpbGVudEZyYW1lVXMgPSBub3dVczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm93VXMgPj0gbUZpcnN0U2lsZW50RnJhbWVVcyArIDEwMDAwMDAwbGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5TaWxlbnRNb2RlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgiYXVkaW8gaW4gc2lsZW50IG1vZGUgbm93LiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1JblNpbGVudE1vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgiYXVkaW8gbm8gbG9uZ2VyIGluIHNpbGVudCBtb2RlLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbUluU2lsZW50TW9kZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0U2lsZW50RnJhbWVVcyA9IC0xbGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlclF1ZXVlLnB1c2hfYmFjayhhY2Nlc3NVbml0KTsKLQotICAgICAgICAgICAgICAgIGZlZWRFbmNvZGVySW5wdXRCdWZmZXJzKCk7Ci0KLSAgICAgICAgICAgICAgICBzY2hlZHVsZURvTW9yZVdvcmsoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdEVuY29kZXJBY3Rpdml0eToKLSAgICAgICAgewotI2lmIDAKLSAgICAgICAgICAgIGludDY0X3Qgd2hlblVzOwotICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDY0KCJ3aGVuVXMiLCAmd2hlblVzKSkgewotICAgICAgICAgICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotICAgICAgICAgICAgICAgIEFMT0dJKCJbJXNdIGtXaGF0RW5jb2RlckFjdGl2aXR5IGFmdGVyICVsbGQgdXMiLAotICAgICAgICAgICAgICAgICAgICAgIG1Jc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIsIG5vd1VzIC0gd2hlblVzKTsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgICAgICBtRG9Nb3JlV29ya1BlbmRpbmcgPSBmYWxzZTsKLQotICAgICAgICAgICAgaWYgKG1FbmNvZGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gZG9Nb3JlV29yaygpOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoZXJyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2NoZWR1bGVEb01vcmVXb3JrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRSZXF1ZXN0SURSRnJhbWU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtRW5jb2RlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtSXNWaWRlbykgewotICAgICAgICAgICAgICAgIEFMT0dWKCJyZXF1ZXN0aW5nIElEUiBmcmFtZSIpOwotICAgICAgICAgICAgICAgIG1FbmNvZGVyLT5yZXF1ZXN0SURSRnJhbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFNodXRkb3duOgotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HSSgic2h1dHRpbmcgZG93biAlcyBlbmNvZGVyIiwgbUlzVmlkZW8gPyAidmlkZW8iIDogImF1ZGlvIik7Ci0KLSAgICAgICAgICAgIHJlbGVhc2VFbmNvZGVyKCk7Ci0KLSAgICAgICAgICAgIEFTdHJpbmcgbWltZTsKLSAgICAgICAgICAgIENIRUNLKG1PdXRwdXRGb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOwotICAgICAgICAgICAgQUxPR0koImVuY29kZXIgKCVzKSBzaHV0IGRvd24uIiwgbWltZS5jX3N0cigpKTsKLQotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0U2h1dGRvd25Db21wbGV0ZWQpOwotICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXREcm9wQUZyYW1lOgotICAgICAgICB7Ci0gICAgICAgICAgICArK21OdW1GcmFtZXNUb0Ryb3A7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRSZWxlYXNlT3V0cHV0QnVmZmVyOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobUVuY29kZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJJbmRleDsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYnVmZmVySW5kZXgiLCAoaW50MzJfdCopJmJ1ZmZlckluZGV4KSk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soYnVmZmVySW5kZXggPCBtRW5jb2Rlck91dHB1dEJ1ZmZlcnMuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBtRW5jb2Rlci0+cmVsZWFzZU91dHB1dEJ1ZmZlcihidWZmZXJJbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRTdXNwZW5kRW5jb2Rpbmc6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGludDMyX3Qgc3VzcGVuZDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzdXNwZW5kIiwgJnN1c3BlbmQpKTsKLQotICAgICAgICAgICAgbUVuY29kaW5nU3VzcGVuZGVkID0gc3VzcGVuZDsKLQotICAgICAgICAgICAgaWYgKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpIHsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoImRyb3AtaW5wdXQtZnJhbWVzIixzdXNwZW5kKTsKLSAgICAgICAgICAgICAgICBtRW5jb2Rlci0+c2V0UGFyYW1ldGVycyhwYXJhbXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVFJFU1BBU1MoKTsKLSAgICB9Ci19Ci0KLXZvaWQgQ29udmVydGVyOjpzY2hlZHVsZURvTW9yZVdvcmsoKSB7Ci0gICAgaWYgKG1Jc1BDTUF1ZGlvKSB7Ci0gICAgICAgIC8vIFRoZXJlJ3Mgbm8gZW5jb2RlciBpbnZvbHZlZCBpbiB0aGlzIGNhc2UuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobURvTW9yZVdvcmtQZW5kaW5nKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtRG9Nb3JlV29ya1BlbmRpbmcgPSB0cnVlOwotCi0jaWYgMQotICAgIGlmIChtRW5jb2RlckFjdGl2aXR5Tm90aWZ5ID09IE5VTEwpIHsKLSAgICAgICAgbUVuY29kZXJBY3Rpdml0eU5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdEVuY29kZXJBY3Rpdml0eSwgdGhpcyk7Ci0gICAgfQotICAgIG1FbmNvZGVyLT5yZXF1ZXN0QWN0aXZpdHlOb3RpZmljYXRpb24obUVuY29kZXJBY3Rpdml0eU5vdGlmeS0+ZHVwKCkpOwotI2Vsc2UKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0RW5jb2RlckFjdGl2aXR5LCB0aGlzKTsKLSAgICBub3RpZnktPnNldEludDY0KCJ3aGVuVXMiLCBBTG9vcGVyOjpHZXROb3dVcygpKTsKLSAgICBtRW5jb2Rlci0+cmVxdWVzdEFjdGl2aXR5Tm90aWZpY2F0aW9uKG5vdGlmeSk7Ci0jZW5kaWYKLX0KLQotc3RhdHVzX3QgQ29udmVydGVyOjpmZWVkUmF3QXVkaW9JbnB1dEJ1ZmZlcnMoKSB7Ci0gICAgLy8gU3BsaXQgaW5jb21pbmcgUENNIGF1ZGlvIGludG8gYnVmZmVycyBvZiA2IEFVcyBvZiA4MCBhdWRpbyBmcmFtZXMgZWFjaAotICAgIC8vIGFuZCBhZGQgYSA0IGJ5dGUgaGVhZGVyIGFjY29yZGluZyB0byB0aGUgd2lmaSBkaXNwbGF5IHNwZWNzLgotCi0gICAgd2hpbGUgKCFtSW5wdXRCdWZmZXJRdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9ICptSW5wdXRCdWZmZXJRdWV1ZS5iZWdpbigpOwotICAgICAgICBtSW5wdXRCdWZmZXJRdWV1ZS5lcmFzZShtSW5wdXRCdWZmZXJRdWV1ZS5iZWdpbigpKTsKLQotICAgICAgICBpbnQxNl90ICpwdHIgPSAoaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpOwotICAgICAgICBpbnQxNl90ICpzdG9wID0gKGludDE2X3QgKikoYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnNpemUoKSk7Ci0gICAgICAgIHdoaWxlIChwdHIgPCBzdG9wKSB7Ci0gICAgICAgICAgICAqcHRyID0gaHRvbnMoKnB0cik7Ci0gICAgICAgICAgICArK3B0cjsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0ZyYW1lU2l6ZSA9IDIgKiBzaXplb2YoaW50MTZfdCk7ICAvLyBzdGVyZW8KLSAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrRnJhbWVzUGVyQVUgPSA4MDsKLSAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTnVtQVVzUGVyUEVTUGFja2V0ID0gNjsKLQotICAgICAgICBpZiAobVBhcnRpYWxBdWRpb0FVICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHNpemVfdCBieXRlc01pc3NpbmdGb3JGdWxsQVUgPQotICAgICAgICAgICAgICAgIGtOdW1BVXNQZXJQRVNQYWNrZXQgKiBrRnJhbWVzUGVyQVUgKiBrRnJhbWVTaXplCi0gICAgICAgICAgICAgICAgLSBtUGFydGlhbEF1ZGlvQVUtPnNpemUoKSArIDQ7Ci0KLSAgICAgICAgICAgIHNpemVfdCBjb3B5ID0gYnVmZmVyLT5zaXplKCk7Ci0gICAgICAgICAgICBpZihjb3B5ID4gYnl0ZXNNaXNzaW5nRm9yRnVsbEFVKSB7Ci0gICAgICAgICAgICAgICAgY29weSA9IGJ5dGVzTWlzc2luZ0ZvckZ1bGxBVTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWVtY3B5KG1QYXJ0aWFsQXVkaW9BVS0+ZGF0YSgpICsgbVBhcnRpYWxBdWRpb0FVLT5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgY29weSk7Ci0KLSAgICAgICAgICAgIG1QYXJ0aWFsQXVkaW9BVS0+c2V0UmFuZ2UoMCwgbVBhcnRpYWxBdWRpb0FVLT5zaXplKCkgKyBjb3B5KTsKLQotICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZShidWZmZXItPm9mZnNldCgpICsgY29weSwgYnVmZmVyLT5zaXplKCkgLSBjb3B5KTsKLQotICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7Ci0KLSAgICAgICAgICAgIGludDY0X3QgY29weVVzID0gKGludDY0X3QpKChjb3B5IC8ga0ZyYW1lU2l6ZSkgKiAxRTYgLyA0ODAwMC4wKTsKLSAgICAgICAgICAgIHRpbWVVcyArPSBjb3B5VXM7Ci0gICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7Ci0KLSAgICAgICAgICAgIGlmIChieXRlc01pc3NpbmdGb3JGdWxsQVUgPT0gY29weSkgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRBY2Nlc3NVbml0KTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEJ1ZmZlcigiYWNjZXNzVW5pdCIsIG1QYXJ0aWFsQXVkaW9BVSk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0KLSAgICAgICAgICAgICAgICBtUGFydGlhbEF1ZGlvQVUuY2xlYXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlIChidWZmZXItPnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IHBhcnRpYWxBdWRpb0FVID0KLSAgICAgICAgICAgICAgICBuZXcgQUJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIDQKLSAgICAgICAgICAgICAgICAgICAgICAgICsga051bUFVc1BlclBFU1BhY2tldCAqIGtGcmFtZVNpemUgKiBrRnJhbWVzUGVyQVUpOwotCi0gICAgICAgICAgICB1aW50OF90ICpwdHIgPSBwYXJ0aWFsQXVkaW9BVS0+ZGF0YSgpOwotICAgICAgICAgICAgcHRyWzBdID0gMHhhMDsgIC8vIDEwMTAwMDAwYgotICAgICAgICAgICAgcHRyWzFdID0ga051bUFVc1BlclBFU1BhY2tldDsKLSAgICAgICAgICAgIHB0clsyXSA9IDA7ICAvLyByZXNlcnZlZCwgYXVkaW8gX2VtcGhhc2lzX2ZsYWcgPSAwCi0KLSAgICAgICAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBrUXVhbnRpemF0aW9uV29yZExlbmd0aCA9IDA7ICAvLyAxNi1iaXQKLSAgICAgICAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBrQXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSA9IDI7ICAvLyA0OEtoegotICAgICAgICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGtOdW1iZXJPZkF1ZGlvQ2hhbm5lbHMgPSAxOyAgLy8gc3RlcmVvCi0KLSAgICAgICAgICAgIHB0clszXSA9IChrUXVhbnRpemF0aW9uV29yZExlbmd0aCA8PCA2KQotICAgICAgICAgICAgICAgICAgICB8IChrQXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSA8PCAzKQotICAgICAgICAgICAgICAgICAgICB8IGtOdW1iZXJPZkF1ZGlvQ2hhbm5lbHM7Ci0KLSAgICAgICAgICAgIHNpemVfdCBjb3B5ID0gYnVmZmVyLT5zaXplKCk7Ci0gICAgICAgICAgICBpZiAoY29weSA+IHBhcnRpYWxBdWRpb0FVLT5zaXplKCkgLSA0KSB7Ci0gICAgICAgICAgICAgICAgY29weSA9IHBhcnRpYWxBdWRpb0FVLT5zaXplKCkgLSA0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtZW1jcHkoJnB0cls0XSwgYnVmZmVyLT5kYXRhKCksIGNvcHkpOwotCi0gICAgICAgICAgICBwYXJ0aWFsQXVkaW9BVS0+c2V0UmFuZ2UoMCwgNCArIGNvcHkpOwotICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZShidWZmZXItPm9mZnNldCgpICsgY29weSwgYnVmZmVyLT5zaXplKCkgLSBjb3B5KTsKLQotICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7Ci0KLSAgICAgICAgICAgIHBhcnRpYWxBdWRpb0FVLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwotCi0gICAgICAgICAgICBpbnQ2NF90IGNvcHlVcyA9IChpbnQ2NF90KSgoY29weSAvIGtGcmFtZVNpemUpICogMUU2IC8gNDgwMDAuMCk7Ci0gICAgICAgICAgICB0aW1lVXMgKz0gY29weVVzOwotICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwotCi0gICAgICAgICAgICBpZiAoY29weSA9PSBwYXJ0aWFsQXVkaW9BVS0+Y2FwYWNpdHkoKSAtIDQpIHsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0QWNjZXNzVW5pdCk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRCdWZmZXIoImFjY2Vzc1VuaXQiLCBwYXJ0aWFsQXVkaW9BVSk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0KLSAgICAgICAgICAgICAgICBwYXJ0aWFsQXVkaW9BVS5jbGVhcigpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtUGFydGlhbEF1ZGlvQVUgPSBwYXJ0aWFsQXVkaW9BVTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQ29udmVydGVyOjpmZWVkRW5jb2RlcklucHV0QnVmZmVycygpIHsKLSAgICBpZiAobUlzUENNQXVkaW8pIHsKLSAgICAgICAgcmV0dXJuIGZlZWRSYXdBdWRpb0lucHV0QnVmZmVycygpOwotICAgIH0KLQotICAgIHdoaWxlICghbUlucHV0QnVmZmVyUXVldWUuZW1wdHkoKQotICAgICAgICAgICAgJiYgIW1BdmFpbEVuY29kZXJJbnB1dEluZGljZXMuZW1wdHkoKSkgewotICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSAqbUlucHV0QnVmZmVyUXVldWUuYmVnaW4oKTsKLSAgICAgICAgbUlucHV0QnVmZmVyUXVldWUuZXJhc2UobUlucHV0QnVmZmVyUXVldWUuYmVnaW4oKSk7Ci0KLSAgICAgICAgc2l6ZV90IGJ1ZmZlckluZGV4ID0gKm1BdmFpbEVuY29kZXJJbnB1dEluZGljZXMuYmVnaW4oKTsKLSAgICAgICAgbUF2YWlsRW5jb2RlcklucHV0SW5kaWNlcy5lcmFzZShtQXZhaWxFbmNvZGVySW5wdXRJbmRpY2VzLmJlZ2luKCkpOwotCi0gICAgICAgIGludDY0X3QgdGltZVVzID0gMGxsOwotICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7Ci0KLSAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7Ci0KLSAgICAgICAgICAgIG1lbWNweShtRW5jb2RlcklucHV0QnVmZmVycy5pdGVtQXQoYnVmZmVySW5kZXgpLT5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgYnVmZmVyLT5zaXplKCkpOwotCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqbWVkaWFCdWZmZXIgPQotICAgICAgICAgICAgICAgIChNZWRpYUJ1ZmZlciAqKShidWZmZXItPmdldE1lZGlhQnVmZmVyQmFzZSgpKTsKLSAgICAgICAgICAgIGlmIChtZWRpYUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbUVuY29kZXJJbnB1dEJ1ZmZlcnMuaXRlbUF0KGJ1ZmZlckluZGV4KS0+c2V0TWVkaWFCdWZmZXJCYXNlKAotICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFCdWZmZXIpOwotCi0gICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRNZWRpYUJ1ZmZlckJhc2UoTlVMTCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmbGFncyA9IE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUzsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXR1c190IGVyciA9IG1FbmNvZGVyLT5xdWV1ZUlucHV0QnVmZmVyKAotICAgICAgICAgICAgICAgIGJ1ZmZlckluZGV4LCAwLCAoYnVmZmVyID09IE5VTEwpID8gMCA6IGJ1ZmZlci0+c2l6ZSgpLAotICAgICAgICAgICAgICAgIHRpbWVVcywgZmxhZ3MpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXNwPEFCdWZmZXI+IENvbnZlcnRlcjo6cHJlcGVuZENTRChjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCkgY29uc3QgewotICAgIENIRUNLKG1DU0QwICE9IE5VTEwpOwotCi0gICAgc3A8QUJ1ZmZlcj4gZHVwID0gbmV3IEFCdWZmZXIoYWNjZXNzVW5pdC0+c2l6ZSgpICsgbUNTRDAtPnNpemUoKSk7Ci0gICAgbWVtY3B5KGR1cC0+ZGF0YSgpLCBtQ1NEMC0+ZGF0YSgpLCBtQ1NEMC0+c2l6ZSgpKTsKLSAgICBtZW1jcHkoZHVwLT5kYXRhKCkgKyBtQ1NEMC0+c2l6ZSgpLCBhY2Nlc3NVbml0LT5kYXRhKCksIGFjY2Vzc1VuaXQtPnNpemUoKSk7Ci0KLSAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwotCi0gICAgZHVwLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwotCi0gICAgcmV0dXJuIGR1cDsKLX0KLQotc3RhdHVzX3QgQ29udmVydGVyOjpkb01vcmVXb3JrKCkgewotICAgIHN0YXR1c190IGVycjsKLQotICAgIGlmICghKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpKSB7Ci0gICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgIHNpemVfdCBidWZmZXJJbmRleDsKLSAgICAgICAgICAgIGVyciA9IG1FbmNvZGVyLT5kZXF1ZXVlSW5wdXRCdWZmZXIoJmJ1ZmZlckluZGV4KTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQXZhaWxFbmNvZGVySW5wdXRJbmRpY2VzLnB1c2hfYmFjayhidWZmZXJJbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmZWVkRW5jb2RlcklucHV0QnVmZmVycygpOwotICAgIH0KLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgc2l6ZV90IGJ1ZmZlckluZGV4OwotICAgICAgICBzaXplX3Qgb2Zmc2V0OwotICAgICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgIHVpbnQzMl90IGZsYWdzOwotICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IE5VTEw7Ci0gICAgICAgIGVyciA9IG1FbmNvZGVyLT5kZXF1ZXVlT3V0cHV0QnVmZmVyKAotICAgICAgICAgICAgICAgICZidWZmZXJJbmRleCwgJm9mZnNldCwgJnNpemUsICZ0aW1lVXMsICZmbGFncyk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBJTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQpIHsKLSAgICAgICAgICAgICAgICBtRW5jb2Rlci0+Z2V0T3V0cHV0QnVmZmVycygmbUVuY29kZXJPdXRwdXRCdWZmZXJzKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGVyciA9PSAtRUFHQUlOKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmbGFncyAmIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUykgewotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RU9TKTsKLSAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwotICAgICAgICB9IGVsc2UgewotI2lmIDAKLSAgICAgICAgICAgIGlmIChtSXNWaWRlbykgewotICAgICAgICAgICAgICAgIGludDMyX3QgdmlkZW9CaXRyYXRlID0gR2V0SW50MzJQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJtZWRpYS53ZmQudmlkZW8tYml0cmF0ZSIsIDUwMDAwMDApOwotCi0gICAgICAgICAgICAgICAgc2V0VmlkZW9CaXRyYXRlKHZpZGVvQml0cmF0ZSk7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOwotICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gb3V0YnVmID0gbUVuY29kZXJPdXRwdXRCdWZmZXJzLml0ZW1BdChidWZmZXJJbmRleCk7Ci0KLSAgICAgICAgICAgIGlmIChvdXRidWYtPm1ldGEoKS0+ZmluZFBvaW50ZXIoImhhbmRsZSIsICh2b2lkKiopJmhhbmRsZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IHJhbmdlTGVuZ3RoLCByYW5nZU9mZnNldDsKLSAgICAgICAgICAgICAgICBDSEVDSyhvdXRidWYtPm1ldGEoKS0+ZmluZEludDMyKCJyYW5nZU9mZnNldCIsICZyYW5nZU9mZnNldCkpOwotICAgICAgICAgICAgICAgIENIRUNLKG91dGJ1Zi0+bWV0YSgpLT5maW5kSW50MzIoInJhbmdlTGVuZ3RoIiwgJnJhbmdlTGVuZ3RoKSk7Ci0gICAgICAgICAgICAgICAgb3V0YnVmLT5tZXRhKCktPnNldFBvaW50ZXIoImhhbmRsZSIsIE5VTEwpOwotCi0gICAgICAgICAgICAgICAgLy8gTWVkaWFTZW5kZXIgd2lsbCBwb3N0IHRoZSBmb2xsb3dpbmcgbWVzc2FnZSB3aGVuIEhEQ1AKLSAgICAgICAgICAgICAgICAvLyBpcyBkb25lLCB0byByZWxlYXNlIHRoZSBvdXRwdXQgYnVmZmVyIGJhY2sgdG8gZW5jb2Rlci4KLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5KG5ldyBBTWVzc2FnZShrV2hhdFJlbGVhc2VPdXRwdXRCdWZmZXIsIHRoaXMpKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJidWZmZXJJbmRleCIsIGJ1ZmZlckluZGV4KTsKLQotICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBBQnVmZmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VMZW5ndGggPiAoaW50MzJfdClzaXplID8gcmFuZ2VMZW5ndGggOiBzaXplKTsKLSAgICAgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0UG9pbnRlcigiaGFuZGxlIiwgaGFuZGxlKTsKLSAgICAgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoInJhbmdlT2Zmc2V0IiwgcmFuZ2VPZmZzZXQpOwotICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigicmFuZ2VMZW5ndGgiLCByYW5nZUxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldE1lc3NhZ2UoIm5vdGlmeSIsIG5vdGlmeSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBBQnVmZmVyKHNpemUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7Ci0KLSAgICAgICAgICAgIEFMT0dWKCJbJXNdIHRpbWUgJWxsZCB1cyAoJS4yZiBzZWNzKSIsCi0gICAgICAgICAgICAgICAgICAgIG1Jc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIsIChsb25nIGxvbmcpdGltZVVzLCB0aW1lVXMgLyAxRTYpOwotCi0gICAgICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIG91dGJ1Zi0+YmFzZSgpICsgb2Zmc2V0LCBzaXplKTsKLQotICAgICAgICAgICAgaWYgKGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfQ09ERUNDT05GSUcpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobUlzSDI2NCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUNTRDAgPSBidWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbU91dHB1dEZvcm1hdC0+c2V0QnVmZmVyKCJjc2QtMCIsIGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobU5lZWRUb01hbnVhbGx5UHJlcGVuZFNQU1BQUwotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUlzSDI2NAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1GbGFncyAmIEZMQUdfUFJFUEVORF9DU0RfSUZfTkVDRVNTQVJZKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgSXNJRFIoYnVmZmVyKSkgewotICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBwcmVwZW5kQ1NEKGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEFjY2Vzc1VuaXQpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJhY2Nlc3NVbml0IiwgYnVmZmVyKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaGFuZGxlKSB7Ci0gICAgICAgICAgICBtRW5jb2Rlci0+cmVsZWFzZU91dHB1dEJ1ZmZlcihidWZmZXJJbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1MpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotdm9pZCBDb252ZXJ0ZXI6OnJlcXVlc3RJRFJGcmFtZSgpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVxdWVzdElEUkZyYW1lLCB0aGlzKSktPnBvc3QoKTsKLX0KLQotdm9pZCBDb252ZXJ0ZXI6OmRyb3BBRnJhbWUoKSB7Ci0gICAgLy8gVW5zdXBwb3J0ZWQgaW4gc3VyZmFjZSBpbnB1dCBtb2RlLgotICAgIENIRUNLKCEobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkpOwotCi0gICAgKG5ldyBBTWVzc2FnZShrV2hhdERyb3BBRnJhbWUsIHRoaXMpKS0+cG9zdCgpOwotfQotCi12b2lkIENvbnZlcnRlcjo6c3VzcGVuZEVuY29kaW5nKGJvb2wgc3VzcGVuZCkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdXNwZW5kRW5jb2RpbmcsIHRoaXMpOwotICAgIG1zZy0+c2V0SW50MzIoInN1c3BlbmQiLCBzdXNwZW5kKTsKLSAgICBtc2ctPnBvc3QoKTsKLX0KLQotaW50MzJfdCBDb252ZXJ0ZXI6OmdldFZpZGVvQml0cmF0ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVByZXZWaWRlb0JpdHJhdGU7Ci19Ci0KLXZvaWQgQ29udmVydGVyOjpzZXRWaWRlb0JpdHJhdGUoaW50MzJfdCBiaXRSYXRlKSB7Ci0gICAgaWYgKG1Jc1ZpZGVvICYmIG1FbmNvZGVyICE9IE5VTEwgJiYgYml0UmF0ZSAhPSBtUHJldlZpZGVvQml0cmF0ZSkgewotICAgICAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gbmV3IEFNZXNzYWdlOwotICAgICAgICBwYXJhbXMtPnNldEludDMyKCJ2aWRlby1iaXRyYXRlIiwgYml0UmF0ZSk7Ci0KLSAgICAgICAgbUVuY29kZXItPnNldFBhcmFtZXRlcnMocGFyYW1zKTsKLQotICAgICAgICBtUHJldlZpZGVvQml0cmF0ZSA9IGJpdFJhdGU7Ci0gICAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9Db252ZXJ0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvQ29udmVydGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOTVhYjUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9Db252ZXJ0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIENPTlZFUlRFUl9IXwotCi0jZGVmaW5lIENPTlZFUlRFUl9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBBQnVmZmVyOwotY2xhc3MgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKLXN0cnVjdCBNZWRpYUNvZGVjOwotY2xhc3MgTWVkaWFDb2RlY0J1ZmZlcjsKLQotI2RlZmluZSBFTkFCTEVfU0lMRU5DRV9ERVRFQ1RJT04gICAgICAgIDAKLQotLy8gVXRpbGl0eSBjbGFzcyB0aGF0IHJlY2VpdmVzIG1lZGlhIGFjY2VzcyB1bml0cyBhbmQgY29udmVydHMgdGhlbSBpbnRvCi0vLyBtZWRpYSBhY2Nlc3MgdW5pdCBvZiBhIGRpZmZlcmVudCBmb3JtYXQuCi0vLyBSaWdodCBub3cgdGhpcydsbCBjb252ZXJ0IHJhdyB2aWRlbyBpbnRvIEguMjY0IGFuZCByYXcgYXVkaW8gaW50byBBQUMuCi1zdHJ1Y3QgQ29udmVydGVyIDogcHVibGljIEFIYW5kbGVyIHsKLSAgICBlbnVtIHsKLSAgICAgICAga1doYXRBY2Nlc3NVbml0LAotICAgICAgICBrV2hhdEVPUywKLSAgICAgICAga1doYXRFcnJvciwKLSAgICAgICAga1doYXRTaHV0ZG93bkNvbXBsZXRlZCwKLSAgICB9OwotCi0gICAgZW51bSBGbGFnQml0cyB7Ci0gICAgICAgIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQgICAgICAgICAgPSAxLAotICAgICAgICBGTEFHX1BSRVBFTkRfQ1NEX0lGX05FQ0VTU0FSWSAgID0gMiwKLSAgICB9OwotICAgIENvbnZlcnRlcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmNvZGVjTG9vcGVyLAotICAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCwKLSAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLQotICAgIHN0YXR1c190IGluaXQoKTsKLQotICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpOwotCi0gICAgc2l6ZV90IGdldElucHV0QnVmZmVyQ291bnQoKSBjb25zdDsKLQotICAgIHNwPEFNZXNzYWdlPiBnZXRPdXRwdXRGb3JtYXQoKSBjb25zdDsKLSAgICBib29sIG5lZWRUb01hbnVhbGx5UHJlcGVuZFNQU1BQUygpIGNvbnN0OwotCi0gICAgdm9pZCBmZWVkQWNjZXNzVW5pdChjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCk7Ci0gICAgdm9pZCBzaWduYWxFT1MoKTsKLQotICAgIHZvaWQgcmVxdWVzdElEUkZyYW1lKCk7Ci0KLSAgICB2b2lkIGRyb3BBRnJhbWUoKTsKLSAgICB2b2lkIHN1c3BlbmRFbmNvZGluZyhib29sIHN1c3BlbmQpOwotCi0gICAgdm9pZCBzaHV0ZG93bkFzeW5jKCk7Ci0KLSAgICBpbnQzMl90IGdldFZpZGVvQml0cmF0ZSgpIGNvbnN0OwotICAgIHZvaWQgc2V0VmlkZW9CaXRyYXRlKGludDMyX3QgYml0cmF0ZSk7Ci0KLSAgICBzdGF0aWMgaW50MzJfdCBHZXRJbnQzMlByb3BlcnR5KGNvbnN0IGNoYXIgKnByb3BOYW1lLCBpbnQzMl90IGRlZmF1bHRWYWx1ZSk7Ci0KLSAgICBlbnVtIHsKLSAgICAgICAgLy8gTVVTVCBub3QgY29uZmxpY3Qgd2l0aCBwcml2YXRlIGVudW1zIGJlbG93LgotICAgICAgICBrV2hhdE1lZGlhUHVsbGVyTm90aWZ5ID0gJ3B1bE4nLAotICAgIH07Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5Db252ZXJ0ZXIoKTsKLSAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotCi1wcml2YXRlOgotICAgIGVudW0gewotICAgICAgICBrV2hhdERvTW9yZVdvcmssCi0gICAgICAgIGtXaGF0UmVxdWVzdElEUkZyYW1lLAotICAgICAgICBrV2hhdFN1c3BlbmRFbmNvZGluZywKLSAgICAgICAga1doYXRTaHV0ZG93biwKLSAgICAgICAga1doYXRFbmNvZGVyQWN0aXZpdHksCi0gICAgICAgIGtXaGF0RHJvcEFGcmFtZSwKLSAgICAgICAga1doYXRSZWxlYXNlT3V0cHV0QnVmZmVyLAotICAgIH07Ci0KLSAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKLSAgICBzcDxBTG9vcGVyPiBtQ29kZWNMb29wZXI7Ci0gICAgc3A8QU1lc3NhZ2U+IG1PdXRwdXRGb3JtYXQ7Ci0gICAgdWludDMyX3QgbUZsYWdzOwotICAgIGJvb2wgbUlzVmlkZW87Ci0gICAgYm9vbCBtSXNIMjY0OwotICAgIGJvb2wgbUlzUENNQXVkaW87Ci0gICAgYm9vbCBtTmVlZFRvTWFudWFsbHlQcmVwZW5kU1BTUFBTOwotCi0gICAgc3A8TWVkaWFDb2RlYz4gbUVuY29kZXI7Ci0gICAgc3A8QU1lc3NhZ2U+IG1FbmNvZGVyQWN0aXZpdHlOb3RpZnk7Ci0KLSAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwotCi0gICAgVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+ID4gbUVuY29kZXJJbnB1dEJ1ZmZlcnM7Ci0gICAgVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+ID4gbUVuY29kZXJPdXRwdXRCdWZmZXJzOwotCi0gICAgTGlzdDxzaXplX3Q+IG1BdmFpbEVuY29kZXJJbnB1dEluZGljZXM7Ci0KLSAgICBMaXN0PHNwPEFCdWZmZXI+ID4gbUlucHV0QnVmZmVyUXVldWU7Ci0KLSAgICBzcDxBQnVmZmVyPiBtQ1NEMDsKLQotICAgIGJvb2wgbURvTW9yZVdvcmtQZW5kaW5nOwotCi0jaWYgRU5BQkxFX1NJTEVOQ0VfREVURUNUSU9OCi0gICAgaW50NjRfdCBtRmlyc3RTaWxlbnRGcmFtZVVzOwotICAgIGJvb2wgbUluU2lsZW50TW9kZTsKLSNlbmRpZgotCi0gICAgc3A8QUJ1ZmZlcj4gbVBhcnRpYWxBdWRpb0FVOwotCi0gICAgaW50MzJfdCBtUHJldlZpZGVvQml0cmF0ZTsKLQotICAgIGludDMyX3QgbU51bUZyYW1lc1RvRHJvcDsKLSAgICBib29sIG1FbmNvZGluZ1N1c3BlbmRlZDsKLQotICAgIHN0YXR1c190IGluaXRFbmNvZGVyKCk7Ci0gICAgdm9pZCByZWxlYXNlRW5jb2RlcigpOwotCi0gICAgc3RhdHVzX3QgZmVlZEVuY29kZXJJbnB1dEJ1ZmZlcnMoKTsKLQotICAgIHZvaWQgc2NoZWR1bGVEb01vcmVXb3JrKCk7Ci0gICAgc3RhdHVzX3QgZG9Nb3JlV29yaygpOwotCi0gICAgdm9pZCBub3RpZnlFcnJvcihzdGF0dXNfdCBlcnIpOwotCi0gICAgLy8gUGFja2V0aXplcyByYXcgUENNIGF1ZGlvIGRhdGEgYXZhaWxhYmxlIGluIG1JbnB1dEJ1ZmZlclF1ZXVlCi0gICAgLy8gaW50byBhIGZvcm1hdCBzdWl0YWJsZSBmb3IgdHJhbnNwb3J0IHN0cmVhbSBpbmNsdXNpb24gYW5kCi0gICAgLy8gbm90aWZpZXMgdGhlIG9ic2VydmVyLgotICAgIHN0YXR1c190IGZlZWRSYXdBdWRpb0lucHV0QnVmZmVycygpOwotCi0gICAgc3RhdGljIGJvb2wgSXNTaWxlbmNlKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KTsKLQotICAgIHNwPEFCdWZmZXI+IHByZXBlbmRDU0QoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpIGNvbnN0OwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ29udmVydGVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQ09OVkVSVEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL01lZGlhUHVsbGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvTWVkaWFQdWxsZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTA3YTRlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvTWVkaWFQdWxsZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTWVkaWFQdWxsZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJNZWRpYVB1bGxlci5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotTWVkaWFQdWxsZXI6Ok1lZGlhUHVsbGVyKAotICAgICAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCi0gICAgOiBtU291cmNlKHNvdXJjZSksCi0gICAgICBtTm90aWZ5KG5vdGlmeSksCi0gICAgICBtUHVsbEdlbmVyYXRpb24oMCksCi0gICAgICBtSXNBdWRpbyhmYWxzZSksCi0gICAgICBtUGF1c2VkKGZhbHNlKSB7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBzb3VyY2UtPmdldEZvcm1hdCgpOwotICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwotCi0gICAgbUlzQXVkaW8gPSAhc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpOwotfQotCi1NZWRpYVB1bGxlcjo6fk1lZGlhUHVsbGVyKCkgewotfQotCi1zdGF0dXNfdCBNZWRpYVB1bGxlcjo6cG9zdFN5bmNocm9ub3VzbHlBbmRSZXR1cm5FcnJvcigKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7Ci0gICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmICghcmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpIHsKLSAgICAgICAgZXJyID0gT0s7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgTWVkaWFQdWxsZXI6OnN0YXJ0KCkgewotICAgIHJldHVybiBwb3N0U3luY2hyb25vdXNseUFuZFJldHVybkVycm9yKG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCB0aGlzKSk7Ci19Ci0KLXZvaWQgTWVkaWFQdWxsZXI6OnN0b3BBc3luYyhjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCB0aGlzKTsKLSAgICBtc2ctPnNldE1lc3NhZ2UoIm5vdGlmeSIsIG5vdGlmeSk7Ci0gICAgbXNnLT5wb3N0KCk7Ci19Ci0KLXZvaWQgTWVkaWFQdWxsZXI6OnBhdXNlKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQYXVzZSwgdGhpcykpLT5wb3N0KCk7Ci19Ci0KLXZvaWQgTWVkaWFQdWxsZXI6OnJlc3VtZSgpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCB0aGlzKSktPnBvc3QoKTsKLX0KLQotdm9pZCBNZWRpYVB1bGxlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7Ci0gICAgICAgIGNhc2Uga1doYXRTdGFydDoKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICAgICAgaWYgKG1Jc0F1ZGlvKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBhdHJvY2l0eSBjYXVzZXMgQXVkaW9Tb3VyY2UgdG8gZGVsaXZlciBhYnNvbHV0ZQotICAgICAgICAgICAgICAgIC8vIHN5c3RlbVRpbWUoKSBiYXNlZCB0aW1lc3RhbXBzIChvZmYgYnkgMSB1cykuCi0gICAgICAgICAgICAgICAgc3A8TWV0YURhdGE+IHBhcmFtcyA9IG5ldyBNZXRhRGF0YTsKLSAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEludDY0KGtLZXlUaW1lLCAxbGwpOwotICAgICAgICAgICAgICAgIGVyciA9IG1Tb3VyY2UtPnN0YXJ0KHBhcmFtcy5nZXQoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVyciA9IG1Tb3VyY2UtPnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgic291cmNlIGZhaWxlZCB0byBzdGFydCB3LyBlcnIgJWQiLCBlcnIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgIHNjaGVkdWxlUHVsbCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0KLSAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFN0b3A6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICp0bXA7Ci0gICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZ0bXApKTsKLSAgICAgICAgICAgIEFTdHJpbmcgbWltZSA9IHRtcDsKLQotICAgICAgICAgICAgQUxPR0koIk1lZGlhUHVsbGVyKCVzKSBzdG9wcGluZy4iLCBtaW1lLmNfc3RyKCkpOwotICAgICAgICAgICAgbVNvdXJjZS0+c3RvcCgpOwotICAgICAgICAgICAgQUxPR0koIk1lZGlhUHVsbGVyKCVzKSBzdG9wcGVkLiIsIG1pbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICArK21QdWxsR2VuZXJhdGlvbjsKLQotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeTsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoIm5vdGlmeSIsICZub3RpZnkpKTsKLSAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0UHVsbDoKLSAgICAgICAgewotICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOwotCi0gICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtUHVsbEdlbmVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKm1idWY7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5yZWFkKCZtYnVmKTsKLQotICAgICAgICAgICAgaWYgKG1QYXVzZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1idWYtPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbWJ1ZiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc2NoZWR1bGVQdWxsKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0koInN0cmVhbSBlbmRlZC4iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZXJyb3IgJWQgcmVhZGluZyBzdHJlYW0uIiwgZXJyKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RU9TKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobWJ1Zi0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwotCi0gICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKG1idWYtPnJhbmdlX2xlbmd0aCgpKTsKLQotICAgICAgICAgICAgICAgIG1lbWNweShhY2Nlc3NVbml0LT5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbWJ1Zi0+ZGF0YSgpICsgbWJ1Zi0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgIG1idWYtPnJhbmdlX2xlbmd0aCgpKTsKLQotICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobUlzQXVkaW8pIHsKLSAgICAgICAgICAgICAgICAgICAgbWJ1Zi0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBtYnVmID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyB2aWRlbyBlbmNvZGVyIHdpbGwgcmVsZWFzZSBNZWRpYUJ1ZmZlciB3aGVuIGRvbmUKLSAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCB1bmRlcmx5aW5nIGRhdGEuCi0gICAgICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPnNldE1lZGlhQnVmZmVyQmFzZShtYnVmKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0KLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRBY2Nlc3NVbml0KTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEJ1ZmZlcigiYWNjZXNzVW5pdCIsIGFjY2Vzc1VuaXQpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1idWYgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigicG9zdGVkIG1idWYgJXAiLCBtYnVmKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzY2hlZHVsZVB1bGwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFBhdXNlOgotICAgICAgICB7Ci0gICAgICAgICAgICBtUGF1c2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFJlc3VtZToKLSAgICAgICAgewotICAgICAgICAgICAgbVBhdXNlZCA9IGZhbHNlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVFJFU1BBU1MoKTsKLSAgICB9Ci19Ci0KLXZvaWQgTWVkaWFQdWxsZXI6OnNjaGVkdWxlUHVsbCgpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UHVsbCwgdGhpcyk7Ci0gICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1QdWxsR2VuZXJhdGlvbik7Ci0gICAgbXNnLT5wb3N0KCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvTWVkaWFQdWxsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvTWVkaWFQdWxsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI5MWJiMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL01lZGlhUHVsbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX1BVTExFUl9IXwotCi0jZGVmaW5lIE1FRElBX1BVTExFUl9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBNZWRpYVNvdXJjZTsKLQotc3RydWN0IE1lZGlhUHVsbGVyIDogcHVibGljIEFIYW5kbGVyIHsKLSAgICBlbnVtIHsKLSAgICAgICAga1doYXRFT1MsCi0gICAgICAgIGtXaGF0QWNjZXNzVW5pdAotICAgIH07Ci0KLSAgICBNZWRpYVB1bGxlcihjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOwotCi0gICAgc3RhdHVzX3Qgc3RhcnQoKTsKLSAgICB2b2lkIHN0b3BBc3luYyhjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7Ci0KLSAgICB2b2lkIHBhdXNlKCk7Ci0gICAgdm9pZCByZXN1bWUoKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0gICAgdmlydHVhbCB+TWVkaWFQdWxsZXIoKTsKLQotcHJpdmF0ZToKLSAgICBlbnVtIHsKLSAgICAgICAga1doYXRTdGFydCwKLSAgICAgICAga1doYXRTdG9wLAotICAgICAgICBrV2hhdFB1bGwsCi0gICAgICAgIGtXaGF0UGF1c2UsCi0gICAgICAgIGtXaGF0UmVzdW1lLAotICAgIH07Ci0KLSAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKLSAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKLSAgICBpbnQzMl90IG1QdWxsR2VuZXJhdGlvbjsKLSAgICBib29sIG1Jc0F1ZGlvOwotICAgIGJvb2wgbVBhdXNlZDsKLQotICAgIHN0YXR1c190IHBvc3RTeW5jaHJvbm91c2x5QW5kUmV0dXJuRXJyb3IoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotICAgIHZvaWQgc2NoZWR1bGVQdWxsKCk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZWRpYVB1bGxlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE1FRElBX1BVTExFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWVjY2EwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUGxheWJhY2tTZXNzaW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExMTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJQbGF5YmFja1Nlc3Npb24iCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJQbGF5YmFja1Nlc3Npb24uaCIKLQotI2luY2x1ZGUgIkNvbnZlcnRlci5oIgotI2luY2x1ZGUgIk1lZGlhUHVsbGVyLmgiCi0jaW5jbHVkZSAiUmVwZWF0ZXJTb3VyY2UuaCIKLSNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgotI2luY2x1ZGUgIldpZmlEaXNwbGF5U291cmNlLmgiCi0KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9JSERDUC5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZU1lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KLQotI2luY2x1ZGUgPE9NWF9JVkNvbW1vbi5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBXaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpUcmFjayA6IHB1YmxpYyBBSGFuZGxlciB7Ci0gICAgZW51bSB7Ci0gICAgICAgIGtXaGF0U3RvcHBlZCwKLSAgICB9OwotCi0gICAgVHJhY2soY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJnB1bGxMb29wZXIsCi0gICAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmNvZGVjTG9vcGVyLAotICAgICAgICAgIGNvbnN0IHNwPE1lZGlhUHVsbGVyPiAmbWVkaWFQdWxsZXIsCi0gICAgICAgICAgY29uc3Qgc3A8Q29udmVydGVyPiAmY29udmVydGVyKTsKLQotICAgIFRyYWNrKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7Ci0KLSAgICB2b2lkIHNldFJlcGVhdGVyU291cmNlKGNvbnN0IHNwPFJlcGVhdGVyU291cmNlPiAmc291cmNlKTsKLQotICAgIHNwPEFNZXNzYWdlPiBnZXRGb3JtYXQoKTsKLSAgICBib29sIGlzQXVkaW8oKSBjb25zdDsKLQotICAgIGNvbnN0IHNwPENvbnZlcnRlcj4gJmNvbnZlcnRlcigpIGNvbnN0OwotICAgIGNvbnN0IHNwPFJlcGVhdGVyU291cmNlPiAmcmVwZWF0ZXJTb3VyY2UoKSBjb25zdDsKLQotICAgIHNzaXplX3QgbWVkaWFTZW5kZXJUcmFja0luZGV4KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRNZWRpYVNlbmRlclRyYWNrSW5kZXgoc2l6ZV90IGluZGV4KTsKLQotICAgIHN0YXR1c190IHN0YXJ0KCk7Ci0gICAgdm9pZCBzdG9wQXN5bmMoKTsKLQotICAgIHZvaWQgcGF1c2UoKTsKLSAgICB2b2lkIHJlc3VtZSgpOwotCi0gICAgdm9pZCBxdWV1ZUFjY2Vzc1VuaXQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpOwotICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0KCk7Ci0KLSAgICBib29sIGhhc091dHB1dEJ1ZmZlcihpbnQ2NF90ICp0aW1lVXMpIGNvbnN0OwotICAgIHZvaWQgcXVldWVPdXRwdXRCdWZmZXIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpOwotICAgIHNwPEFCdWZmZXI+IGRlcXVldWVPdXRwdXRCdWZmZXIoKTsKLQotI2lmIFNVU1BFTkRfVklERU9fSUZfSURMRQotICAgIGJvb2wgaXNTdXNwZW5kZWQoKSBjb25zdDsKLSNlbmRpZgotCi0gICAgc2l6ZV90IGNvdW50UXVldWVkT3V0cHV0QnVmZmVycygpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1RdWV1ZWRPdXRwdXRCdWZmZXJzLnNpemUoKTsKLSAgICB9Ci0KLSAgICB2b2lkIHJlcXVlc3RJRFJGcmFtZSgpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLSAgICB2aXJ0dWFsIH5UcmFjaygpOwotCi1wcml2YXRlOgotICAgIGVudW0gewotICAgICAgICBrV2hhdE1lZGlhUHVsbGVyU3RvcHBlZCwKLSAgICB9OwotCi0gICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7Ci0gICAgc3A8QUxvb3Blcj4gbVB1bGxMb29wZXI7Ci0gICAgc3A8QUxvb3Blcj4gbUNvZGVjTG9vcGVyOwotICAgIHNwPE1lZGlhUHVsbGVyPiBtTWVkaWFQdWxsZXI7Ci0gICAgc3A8Q29udmVydGVyPiBtQ29udmVydGVyOwotICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0OwotICAgIGJvb2wgbVN0YXJ0ZWQ7Ci0gICAgc3NpemVfdCBtTWVkaWFTZW5kZXJUcmFja0luZGV4OwotICAgIGJvb2wgbUlzQXVkaW87Ci0gICAgTGlzdDxzcDxBQnVmZmVyPiA+IG1RdWV1ZWRBY2Nlc3NVbml0czsKLSAgICBzcDxSZXBlYXRlclNvdXJjZT4gbVJlcGVhdGVyU291cmNlOwotICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPiBtUXVldWVkT3V0cHV0QnVmZmVyczsKLSAgICBpbnQ2NF90IG1MYXN0T3V0cHV0QnVmZmVyUXVldWVkVGltZVVzOwotCi0gICAgc3RhdGljIGJvb2wgSXNBdWRpb0Zvcm1hdChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUcmFjayk7Ci19OwotCi1XaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpUcmFjazo6VHJhY2soCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmcHVsbExvb3BlciwKLSAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmNvZGVjTG9vcGVyLAotICAgICAgICBjb25zdCBzcDxNZWRpYVB1bGxlcj4gJm1lZGlhUHVsbGVyLAotICAgICAgICBjb25zdCBzcDxDb252ZXJ0ZXI+ICZjb252ZXJ0ZXIpCi0gICAgOiBtTm90aWZ5KG5vdGlmeSksCi0gICAgICBtUHVsbExvb3BlcihwdWxsTG9vcGVyKSwKLSAgICAgIG1Db2RlY0xvb3Blcihjb2RlY0xvb3BlciksCi0gICAgICBtTWVkaWFQdWxsZXIobWVkaWFQdWxsZXIpLAotICAgICAgbUNvbnZlcnRlcihjb252ZXJ0ZXIpLAotICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbUlzQXVkaW8oSXNBdWRpb0Zvcm1hdChtQ29udmVydGVyLT5nZXRPdXRwdXRGb3JtYXQoKSkpLAotICAgICAgbUxhc3RPdXRwdXRCdWZmZXJRdWV1ZWRUaW1lVXMoLTFsbCkgewotfQotCi1XaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpUcmFjazo6VHJhY2soCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkKLSAgICA6IG1Ob3RpZnkobm90aWZ5KSwKLSAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKLSAgICAgIG1TdGFydGVkKGZhbHNlKSwKLSAgICAgIG1Jc0F1ZGlvKElzQXVkaW9Gb3JtYXQoZm9ybWF0KSksCi0gICAgICBtTGFzdE91dHB1dEJ1ZmZlclF1ZXVlZFRpbWVVcygtMWxsKSB7Ci19Ci0KLVdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OlRyYWNrOjp+VHJhY2soKSB7Ci0gICAgQ0hFQ0soIW1TdGFydGVkKTsKLX0KLQotLy8gc3RhdGljCi1ib29sIFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OlRyYWNrOjpJc0F1ZGlvRm9ybWF0KAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgewotICAgIEFTdHJpbmcgbWltZTsKLSAgICBDSEVDSyhmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOwotCi0gICAgcmV0dXJuICFzdHJuY2FzZWNtcChtaW1lLmNfc3RyKCksICJhdWRpby8iLCA2KTsKLX0KLQotc3A8QU1lc3NhZ2U+IFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OlRyYWNrOjpnZXRGb3JtYXQoKSB7Ci0gICAgcmV0dXJuIG1Gb3JtYXQgIT0gTlVMTCA/IG1Gb3JtYXQgOiBtQ29udmVydGVyLT5nZXRPdXRwdXRGb3JtYXQoKTsKLX0KLQotYm9vbCBXaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpUcmFjazo6aXNBdWRpbygpIGNvbnN0IHsKLSAgICByZXR1cm4gbUlzQXVkaW87Ci19Ci0KLWNvbnN0IHNwPENvbnZlcnRlcj4gJldpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OlRyYWNrOjpjb252ZXJ0ZXIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Db252ZXJ0ZXI7Ci19Ci0KLWNvbnN0IHNwPFJlcGVhdGVyU291cmNlPiAmCi1XaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpUcmFjazo6cmVwZWF0ZXJTb3VyY2UoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1SZXBlYXRlclNvdXJjZTsKLX0KLQotc3NpemVfdCBXaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpUcmFjazo6bWVkaWFTZW5kZXJUcmFja0luZGV4KCkgY29uc3QgewotICAgIENIRUNLX0dFKG1NZWRpYVNlbmRlclRyYWNrSW5kZXgsIDApOwotICAgIHJldHVybiBtTWVkaWFTZW5kZXJUcmFja0luZGV4OwotfQotCi12b2lkIFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OlRyYWNrOjpzZXRNZWRpYVNlbmRlclRyYWNrSW5kZXgoCi0gICAgICAgIHNpemVfdCBpbmRleCkgewotICAgIG1NZWRpYVNlbmRlclRyYWNrSW5kZXggPSBpbmRleDsKLX0KLQotc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6VHJhY2s6OnN0YXJ0KCkgewotICAgIEFMT0dWKCJUcmFjazo6c3RhcnQgaXNBdWRpbz0lZCIsIG1Jc0F1ZGlvKTsKLQotICAgIENIRUNLKCFtU3RhcnRlZCk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIGlmIChtTWVkaWFQdWxsZXIgIT0gTlVMTCkgewotICAgICAgICBlcnIgPSBtTWVkaWFQdWxsZXItPnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICBtU3RhcnRlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotdm9pZCBXaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpUcmFjazo6c3RvcEFzeW5jKCkgewotICAgIEFMT0dWKCJUcmFjazo6c3RvcEFzeW5jIGlzQXVkaW89JWQiLCBtSXNBdWRpbyk7Ci0KLSAgICBpZiAobUNvbnZlcnRlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1Db252ZXJ0ZXItPnNodXRkb3duQXN5bmMoKTsKLSAgICB9Ci0KLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0TWVkaWFQdWxsZXJTdG9wcGVkLCB0aGlzKTsKLQotICAgIGlmIChtU3RhcnRlZCAmJiBtTWVkaWFQdWxsZXIgIT0gTlVMTCkgewotICAgICAgICBpZiAobVJlcGVhdGVyU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIC8vIExldCdzIHVuYmxvY2sgTWVkaWFQdWxsZXIncyBNZWRpYVNvdXJjZTo6cmVhZCgpLgotICAgICAgICAgICAgbVJlcGVhdGVyU291cmNlLT53YWtlVXAoKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1NZWRpYVB1bGxlci0+c3RvcEFzeW5jKG1zZyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICAgICAgbXNnLT5wb3N0KCk7Ci0gICAgfQotfQotCi12b2lkIFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OlRyYWNrOjpwYXVzZSgpIHsKLSAgICBtTWVkaWFQdWxsZXItPnBhdXNlKCk7Ci19Ci0KLXZvaWQgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6VHJhY2s6OnJlc3VtZSgpIHsKLSAgICBtTWVkaWFQdWxsZXItPnJlc3VtZSgpOwotfQotCi12b2lkIFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OlRyYWNrOjpvbk1lc3NhZ2VSZWNlaXZlZCgKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7Ci0gICAgICAgIGNhc2Uga1doYXRNZWRpYVB1bGxlclN0b3BwZWQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1Db252ZXJ0ZXIuY2xlYXIoKTsKLQotICAgICAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLQotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0U3RvcHBlZCk7Ci0gICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLQotICAgICAgICAgICAgQUxPR0koImtXaGF0U3RvcHBlZCAlcyBwb3N0ZWQiLCBtSXNBdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgfQotfQotCi12b2lkIFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OlRyYWNrOjpxdWV1ZUFjY2Vzc1VuaXQoCi0gICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KSB7Ci0gICAgbVF1ZXVlZEFjY2Vzc1VuaXRzLnB1c2hfYmFjayhhY2Nlc3NVbml0KTsKLX0KLQotc3A8QUJ1ZmZlcj4gV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6VHJhY2s6OmRlcXVldWVBY2Nlc3NVbml0KCkgewotICAgIGlmIChtUXVldWVkQWNjZXNzVW5pdHMuZW1wdHkoKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gKm1RdWV1ZWRBY2Nlc3NVbml0cy5iZWdpbigpOwotICAgIENIRUNLKGFjY2Vzc1VuaXQgIT0gTlVMTCk7Ci0KLSAgICBtUXVldWVkQWNjZXNzVW5pdHMuZXJhc2UobVF1ZXVlZEFjY2Vzc1VuaXRzLmJlZ2luKCkpOwotCi0gICAgcmV0dXJuIGFjY2Vzc1VuaXQ7Ci19Ci0KLXZvaWQgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6VHJhY2s6OnNldFJlcGVhdGVyU291cmNlKAotICAgICAgICBjb25zdCBzcDxSZXBlYXRlclNvdXJjZT4gJnNvdXJjZSkgewotICAgIG1SZXBlYXRlclNvdXJjZSA9IHNvdXJjZTsKLX0KLQotdm9pZCBXaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpUcmFjazo6cmVxdWVzdElEUkZyYW1lKCkgewotICAgIGlmIChtSXNBdWRpbykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1SZXBlYXRlclNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1SZXBlYXRlclNvdXJjZS0+d2FrZVVwKCk7Ci0gICAgfQotCi0gICAgbUNvbnZlcnRlci0+cmVxdWVzdElEUkZyYW1lKCk7Ci19Ci0KLWJvb2wgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6VHJhY2s6Omhhc091dHB1dEJ1ZmZlcigKLSAgICAgICAgaW50NjRfdCAqdGltZVVzKSBjb25zdCB7Ci0gICAgKnRpbWVVcyA9IDBsbDsKLQotICAgIGlmIChtUXVldWVkT3V0cHV0QnVmZmVycy5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjb25zdCBzcDxBQnVmZmVyPiAmb3V0cHV0QnVmZmVyID0gKm1RdWV1ZWRPdXRwdXRCdWZmZXJzLmJlZ2luKCk7Ci0KLSAgICBDSEVDSyhvdXRwdXRCdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OlRyYWNrOjpxdWV1ZU91dHB1dEJ1ZmZlcigKLSAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpIHsKLSAgICBtUXVldWVkT3V0cHV0QnVmZmVycy5wdXNoX2JhY2soYWNjZXNzVW5pdCk7Ci0gICAgbUxhc3RPdXRwdXRCdWZmZXJRdWV1ZWRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotfQotCi1zcDxBQnVmZmVyPiBXaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpUcmFjazo6ZGVxdWV1ZU91dHB1dEJ1ZmZlcigpIHsKLSAgICBDSEVDSyghbVF1ZXVlZE91dHB1dEJ1ZmZlcnMuZW1wdHkoKSk7Ci0KLSAgICBzcDxBQnVmZmVyPiBvdXRwdXRCdWZmZXIgPSAqbVF1ZXVlZE91dHB1dEJ1ZmZlcnMuYmVnaW4oKTsKLSAgICBtUXVldWVkT3V0cHV0QnVmZmVycy5lcmFzZShtUXVldWVkT3V0cHV0QnVmZmVycy5iZWdpbigpKTsKLQotICAgIHJldHVybiBvdXRwdXRCdWZmZXI7Ci19Ci0KLSNpZiBTVVNQRU5EX1ZJREVPX0lGX0lETEUKLWJvb2wgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6VHJhY2s6OmlzU3VzcGVuZGVkKCkgY29uc3QgewotICAgIGlmICghbVF1ZXVlZE91dHB1dEJ1ZmZlcnMuZW1wdHkoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKG1MYXN0T3V0cHV0QnVmZmVyUXVldWVkVGltZVVzIDwgMGxsKSB7Ci0gICAgICAgIC8vIFdlJ3ZlIG5ldmVyIHNlZW4gYW4gb3V0cHV0IGJ1ZmZlciBxdWV1ZWQsIGJ1dCB0cmFja3Mgc3RhcnQKLSAgICAgICAgLy8gb3V0IGxpdmUsIG5vdCBzdXNwZW5kZWQuCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBJZiB3ZSd2ZSBub3Qgc2VlbiBuZXcgb3V0cHV0IGRhdGEgZm9yIDYwbXMgb3IgbW9yZSwgd2UgY29uc2lkZXIKLSAgICAvLyB0aGlzIHRyYWNrIHN1c3BlbmRlZCBmb3IgdGhlIHRpbWUgYmVpbmcuCi0gICAgcmV0dXJuIChBTG9vcGVyOjpHZXROb3dVcygpIC0gbUxhc3RPdXRwdXRCdWZmZXJRdWV1ZWRUaW1lVXMpID4gNjAwMDBsbDsKLX0KLSNlbmRpZgotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1XaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpQbGF5YmFja1Nlc3Npb24oCi0gICAgICAgIGNvbnN0IFN0cmluZzE2ICZvcFBhY2thZ2VOYW1lLAotICAgICAgICBjb25zdCBzcDxBTmV0d29ya1Nlc3Npb24+ICZuZXRTZXNzaW9uLAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgY29uc3QgaW5fYWRkciAmaW50ZXJmYWNlQWRkciwKLSAgICAgICAgY29uc3Qgc3A8SUhEQ1A+ICZoZGNwLAotICAgICAgICBjb25zdCBjaGFyICpwYXRoKQotICAgIDogbU9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSksCi0gICAgICBtTmV0U2Vzc2lvbihuZXRTZXNzaW9uKSwKLSAgICAgIG1Ob3RpZnkobm90aWZ5KSwKLSAgICAgIG1JbnRlcmZhY2VBZGRyKGludGVyZmFjZUFkZHIpLAotICAgICAgbUhEQ1AoaGRjcCksCi0gICAgICBtTG9jYWxSVFBQb3J0KC0xKSwKLSAgICAgIG1XZUFyZURlYWQoZmFsc2UpLAotICAgICAgbVBhdXNlZChmYWxzZSksCi0gICAgICBtTGFzdExpZmVzaWduVXMoKSwKLSAgICAgIG1WaWRlb1RyYWNrSW5kZXgoLTEpLAotICAgICAgbVByZXZUaW1lVXMoLTFsbCksCi0gICAgICBtUHVsbEV4dHJhY3RvclBlbmRpbmcoZmFsc2UpLAotICAgICAgbVB1bGxFeHRyYWN0b3JHZW5lcmF0aW9uKDApLAotICAgICAgbUZpcnN0U2FtcGxlVGltZVJlYWxVcygtMWxsKSwKLSAgICAgIG1GaXJzdFNhbXBsZVRpbWVVcygtMWxsKSB7Ci0gICAgaWYgKHBhdGggIT0gTlVMTCkgewotICAgICAgICBtTWVkaWFQYXRoLnNldFRvKHBhdGgpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6aW5pdCgKLSAgICAgICAgY29uc3QgY2hhciAqY2xpZW50SVAsCi0gICAgICAgIGludDMyX3QgY2xpZW50UnRwLAotICAgICAgICBSVFBTZW5kZXI6OlRyYW5zcG9ydE1vZGUgcnRwTW9kZSwKLSAgICAgICAgaW50MzJfdCBjbGllbnRSdGNwLAotICAgICAgICBSVFBTZW5kZXI6OlRyYW5zcG9ydE1vZGUgcnRjcE1vZGUsCi0gICAgICAgIGJvb2wgZW5hYmxlQXVkaW8sCi0gICAgICAgIGJvb2wgdXNlUENNQXVkaW8sCi0gICAgICAgIGJvb2wgZW5hYmxlVmlkZW8sCi0gICAgICAgIFZpZGVvRm9ybWF0czo6UmVzb2x1dGlvblR5cGUgdmlkZW9SZXNvbHV0aW9uVHlwZSwKLSAgICAgICAgc2l6ZV90IHZpZGVvUmVzb2x1dGlvbkluZGV4LAotICAgICAgICBWaWRlb0Zvcm1hdHM6OlByb2ZpbGVUeXBlIHZpZGVvUHJvZmlsZVR5cGUsCi0gICAgICAgIFZpZGVvRm9ybWF0czo6TGV2ZWxUeXBlIHZpZGVvTGV2ZWxUeXBlKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdE1lZGlhU2VuZGVyTm90aWZ5LCB0aGlzKTsKLSAgICBtTWVkaWFTZW5kZXIgPSBuZXcgTWVkaWFTZW5kZXIobU5ldFNlc3Npb24sIG5vdGlmeSk7Ci0gICAgbG9vcGVyKCktPnJlZ2lzdGVySGFuZGxlcihtTWVkaWFTZW5kZXIpOwotCi0gICAgbU1lZGlhU2VuZGVyLT5zZXRIRENQKG1IRENQKTsKLQotICAgIHN0YXR1c190IGVyciA9IHNldHVwUGFja2V0aXplcigKLSAgICAgICAgICAgIGVuYWJsZUF1ZGlvLAotICAgICAgICAgICAgdXNlUENNQXVkaW8sCi0gICAgICAgICAgICBlbmFibGVWaWRlbywKLSAgICAgICAgICAgIHZpZGVvUmVzb2x1dGlvblR5cGUsCi0gICAgICAgICAgICB2aWRlb1Jlc29sdXRpb25JbmRleCwKLSAgICAgICAgICAgIHZpZGVvUHJvZmlsZVR5cGUsCi0gICAgICAgICAgICB2aWRlb0xldmVsVHlwZSk7Ci0KLSAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgIGVyciA9IG1NZWRpYVNlbmRlci0+aW5pdEFzeW5jKAotICAgICAgICAgICAgICAgIC0xIC8qIHRyYWNrSW5kZXggKi8sCi0gICAgICAgICAgICAgICAgY2xpZW50SVAsCi0gICAgICAgICAgICAgICAgY2xpZW50UnRwLAotICAgICAgICAgICAgICAgIHJ0cE1vZGUsCi0gICAgICAgICAgICAgICAgY2xpZW50UnRjcCwKLSAgICAgICAgICAgICAgICBydGNwTW9kZSwKLSAgICAgICAgICAgICAgICAmbUxvY2FsUlRQUG9ydCk7Ci0gICAgfQotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBtTG9jYWxSVFBQb3J0ID0gLTE7Ci0KLSAgICAgICAgbG9vcGVyKCktPnVucmVnaXN0ZXJIYW5kbGVyKG1NZWRpYVNlbmRlci0+aWQoKSk7Ci0gICAgICAgIG1NZWRpYVNlbmRlci5jbGVhcigpOwotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgdXBkYXRlTGl2ZW5lc3MoKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6flBsYXliYWNrU2Vzc2lvbigpIHsKLX0KLQotaW50MzJfdCBXaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpnZXRSVFBQb3J0KCkgY29uc3QgewotICAgIHJldHVybiBtTG9jYWxSVFBQb3J0OwotfQotCi1pbnQ2NF90IFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OmdldExhc3RMaWZlc2lnblVzKCkgY29uc3QgewotICAgIHJldHVybiBtTGFzdExpZmVzaWduVXM7Ci19Ci0KLXZvaWQgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6dXBkYXRlTGl2ZW5lc3MoKSB7Ci0gICAgbUxhc3RMaWZlc2lnblVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLX0KLQotc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6cGxheSgpIHsKLSAgICB1cGRhdGVMaXZlbmVzcygpOwotCi0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlc3VtZSwgdGhpcykpLT5wb3N0KCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246Om9uTWVkaWFTZW5kZXJJbml0aWFsaXplZCgpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBtVHJhY2tzLmVkaXRWYWx1ZUF0KGkpLT5zdGFydCgpKTsKLSAgICB9Ci0KLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0U2Vzc2lvbkVzdGFibGlzaGVkKTsKLSAgICBub3RpZnktPnBvc3QoKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6cGF1c2UoKSB7Ci0gICAgdXBkYXRlTGl2ZW5lc3MoKTsKLQotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQYXVzZSwgdGhpcykpLT5wb3N0KCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6ZGVzdHJveUFzeW5jKCkgewotICAgIEFMT0dJKCJkZXN0cm95QXN5bmMiKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgewotICAgICAgICBtVHJhY2tzLnZhbHVlQXQoaSktPnN0b3BBc3luYygpOwotICAgIH0KLX0KLQotdm9pZCBXaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uOjpvbk1lc3NhZ2VSZWNlaXZlZCgKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7Ci0gICAgICAgIGNhc2Uga1doYXRDb252ZXJ0ZXJOb3RpZnk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtV2VBcmVEZWFkKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImRyb3BwaW5nIG1zZyAnJXMnIGJlY2F1c2Ugd2UncmUgZGVhZCIsCi0gICAgICAgICAgICAgICAgICAgICAgbXNnLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOwotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludDMyX3Qgd2hhdDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aGF0IiwgJndoYXQpKTsKLQotICAgICAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXg7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJ0cmFja0luZGV4IiwgJnRyYWNrSW5kZXgpKTsKLQotICAgICAgICAgICAgaWYgKHdoYXQgPT0gQ29udmVydGVyOjprV2hhdEFjY2Vzc1VuaXQpIHsKLSAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0OwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEJ1ZmZlcigiYWNjZXNzVW5pdCIsICZhY2Nlc3NVbml0KSk7Ci0KLSAgICAgICAgICAgICAgICBjb25zdCBzcDxUcmFjaz4gJnRyYWNrID0gbVRyYWNrcy52YWx1ZUZvcih0cmFja0luZGV4KTsKLQotICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1NZWRpYVNlbmRlci0+cXVldWVBY2Nlc3NVbml0KAotICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1lZGlhU2VuZGVyVHJhY2tJbmRleCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeVNlc3Npb25EZWFkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IENvbnZlcnRlcjo6a1doYXRFT1MpIHsKLSAgICAgICAgICAgICAgICBDSEVDS19FUSh3aGF0LCBDb252ZXJ0ZXI6OmtXaGF0RU9TKTsKLQotICAgICAgICAgICAgICAgIEFMT0dJKCJvdXRwdXQgRU9TIG9uIHRyYWNrICV6dSIsIHRyYWNrSW5kZXgpOwotCi0gICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1UcmFja3MuaW5kZXhPZktleSh0cmFja0luZGV4KTsKLSAgICAgICAgICAgICAgICBDSEVDS19HRShpbmRleCwgMCk7Ci0KLSAgICAgICAgICAgICAgICBjb25zdCBzcDxDb252ZXJ0ZXI+ICZjb252ZXJ0ZXIgPQotICAgICAgICAgICAgICAgICAgICBtVHJhY2tzLnZhbHVlQXQoaW5kZXgpLT5jb252ZXJ0ZXIoKTsKLSAgICAgICAgICAgICAgICBsb29wZXIoKS0+dW5yZWdpc3RlckhhbmRsZXIoY29udmVydGVyLT5pZCgpKTsKLQotICAgICAgICAgICAgICAgIG1UcmFja3MucmVtb3ZlSXRlbXNBdChpbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobVRyYWNrcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0koIlJlYWNoZWQgRU9TIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ICE9IENvbnZlcnRlcjo6a1doYXRTaHV0ZG93bkNvbXBsZXRlZCkgewotICAgICAgICAgICAgICAgIENIRUNLX0VRKHdoYXQsIENvbnZlcnRlcjo6a1doYXRFcnJvcik7Ci0KLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKLQotICAgICAgICAgICAgICAgIEFMT0dFKCJjb252ZXJ0ZXIgc2lnbmFsZWQgZXJyb3IgJWQiLCBlcnIpOwotCi0gICAgICAgICAgICAgICAgbm90aWZ5U2Vzc2lvbkRlYWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdE1lZGlhU2VuZGVyTm90aWZ5OgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IHdoYXQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigid2hhdCIsICZ3aGF0KSk7Ci0KLSAgICAgICAgICAgIGlmICh3aGF0ID09IE1lZGlhU2VuZGVyOjprV2hhdEluaXREb25lKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uTWVkaWFTZW5kZXJJbml0aWFsaXplZCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeVNlc3Npb25EZWFkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IE1lZGlhU2VuZGVyOjprV2hhdEVycm9yKSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5U2Vzc2lvbkRlYWQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBNZWRpYVNlbmRlcjo6a1doYXROZXR3b3JrU3RhbGwpIHsKLSAgICAgICAgICAgICAgICBzaXplX3QgbnVtQnl0ZXNRdWV1ZWQ7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgibnVtQnl0ZXNRdWV1ZWQiLCAmbnVtQnl0ZXNRdWV1ZWQpKTsKLQotICAgICAgICAgICAgICAgIGlmIChtVmlkZW9UcmFja0luZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8VHJhY2s+ICZ2aWRlb1RyYWNrID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja3MudmFsdWVGb3IobVZpZGVvVHJhY2tJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3A8Q29udmVydGVyPiBjb252ZXJ0ZXIgPSB2aWRlb1RyYWNrLT5jb252ZXJ0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnZlcnRlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXItPmRyb3BBRnJhbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBNZWRpYVNlbmRlcjo6a1doYXRJbmZvcm1TZW5kZXIpIHsKLSAgICAgICAgICAgICAgICBvblNpbmtGZWVkYmFjayhtc2cpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBUUkVTUEFTUygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0VHJhY2tOb3RpZnk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGludDMyX3Qgd2hhdDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aGF0IiwgJndoYXQpKTsKLQotICAgICAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXg7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJ0cmFja0luZGV4IiwgJnRyYWNrSW5kZXgpKTsKLQotICAgICAgICAgICAgaWYgKHdoYXQgPT0gVHJhY2s6OmtXaGF0U3RvcHBlZCkgewotICAgICAgICAgICAgICAgIEFMT0dJKCJUcmFjayAlenUgc3RvcHBlZCIsIHRyYWNrSW5kZXgpOwotCi0gICAgICAgICAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbVRyYWNrcy52YWx1ZUZvcih0cmFja0luZGV4KTsKLSAgICAgICAgICAgICAgICBsb29wZXIoKS0+dW5yZWdpc3RlckhhbmRsZXIodHJhY2stPmlkKCkpOwotICAgICAgICAgICAgICAgIG1UcmFja3MucmVtb3ZlSXRlbSh0cmFja0luZGV4KTsKLSAgICAgICAgICAgICAgICB0cmFjay5jbGVhcigpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFtVHJhY2tzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HSSgibm90IGFsbCB0cmFja3MgYXJlIHN0b3BwZWQgeWV0Iik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGxvb3BlcigpLT51bnJlZ2lzdGVySGFuZGxlcihtTWVkaWFTZW5kZXItPmlkKCkpOwotICAgICAgICAgICAgICAgIG1NZWRpYVNlbmRlci5jbGVhcigpOwotCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFNlc3Npb25EZXN0cm95ZWQpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0UGF1c2U6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtRXh0cmFjdG9yICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICArK21QdWxsRXh0cmFjdG9yR2VuZXJhdGlvbjsKLSAgICAgICAgICAgICAgICBtRmlyc3RTYW1wbGVUaW1lUmVhbFVzID0gLTFsbDsKLSAgICAgICAgICAgICAgICBtRmlyc3RTYW1wbGVUaW1lVXMgPSAtMWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVBhdXNlZCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgICAgICBtVHJhY2tzLmVkaXRWYWx1ZUF0KGkpLT5wYXVzZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtUGF1c2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFJlc3VtZToKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1FeHRyYWN0b3IgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHNjaGVkdWxlUHVsbEV4dHJhY3RvcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIW1QYXVzZWQpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgbVRyYWNrcy5lZGl0VmFsdWVBdChpKS0+cmVzdW1lKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1QYXVzZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFB1bGxFeHRyYWN0b3JTYW1wbGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKLQotICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT0gbVB1bGxFeHRyYWN0b3JHZW5lcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1QdWxsRXh0cmFjdG9yUGVuZGluZyA9IGZhbHNlOwotCi0gICAgICAgICAgICBvblB1bGxFeHRyYWN0b3IoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgfQotfQotCi12b2lkIFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246Om9uU2lua0ZlZWRiYWNrKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgaW50NjRfdCBhdmdMYXRlbmN5VXM7Ci0gICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoImF2Z0xhdGVuY3lVcyIsICZhdmdMYXRlbmN5VXMpKTsKLQotICAgIGludDY0X3QgbWF4TGF0ZW5jeVVzOwotICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJtYXhMYXRlbmN5VXMiLCAmbWF4TGF0ZW5jeVVzKSk7Ci0KLSAgICBBTE9HSSgic2luayByZXBvcnRzIGF2Zy4gbGF0ZW5jeSBvZiAlbGxkIG1zIChtYXggJWxsZCBtcykiLAotICAgICAgICAgIGF2Z0xhdGVuY3lVcyAvIDEwMDBsbCwKLSAgICAgICAgICBtYXhMYXRlbmN5VXMgLyAxMDAwbGwpOwotCi0gICAgaWYgKG1WaWRlb1RyYWNrSW5kZXggPj0gMCkgewotICAgICAgICBjb25zdCBzcDxUcmFjaz4gJnZpZGVvVHJhY2sgPSBtVHJhY2tzLnZhbHVlRm9yKG1WaWRlb1RyYWNrSW5kZXgpOwotICAgICAgICBzcDxDb252ZXJ0ZXI+IGNvbnZlcnRlciA9IHZpZGVvVHJhY2stPmNvbnZlcnRlcigpOwotCi0gICAgICAgIGlmIChjb252ZXJ0ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgaW50MzJfdCB2aWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgIENvbnZlcnRlcjo6R2V0SW50MzJQcm9wZXJ0eSgibWVkaWEud2ZkLnZpZGVvLWJpdHJhdGUiLCAtMSk7Ci0KLSAgICAgICAgICAgIGNoYXIgdmFsW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgICAgICAgICBpZiAodmlkZW9CaXRyYXRlIDwgMAotICAgICAgICAgICAgICAgICAgICAmJiBwcm9wZXJ0eV9nZXQoIm1lZGlhLndmZC52aWRlby1iaXRyYXRlIiwgdmFsLCBOVUxMKQotICAgICAgICAgICAgICAgICAgICAmJiAhc3RyY2FzZWNtcCgiYWRhcHRpdmUiLCB2YWwpKSB7Ci0gICAgICAgICAgICAgICAgdmlkZW9CaXRyYXRlID0gY29udmVydGVyLT5nZXRWaWRlb0JpdHJhdGUoKTsKLQotICAgICAgICAgICAgICAgIGlmIChhdmdMYXRlbmN5VXMgPiAzMDAwMDBsbCkgewotICAgICAgICAgICAgICAgICAgICB2aWRlb0JpdHJhdGUgKj0gMC42OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXZnTGF0ZW5jeVVzIDwgMTAwMDAwbGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW9CaXRyYXRlICo9IDEuMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh2aWRlb0JpdHJhdGUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZpZGVvQml0cmF0ZSA8IDUwMDAwMCkgewotICAgICAgICAgICAgICAgICAgICB2aWRlb0JpdHJhdGUgPSA1MDAwMDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2aWRlb0JpdHJhdGUgPiAxMDAwMDAwMCkgewotICAgICAgICAgICAgICAgICAgICB2aWRlb0JpdHJhdGUgPSAxMDAwMDAwMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAodmlkZW9CaXRyYXRlICE9IGNvbnZlcnRlci0+Z2V0VmlkZW9CaXRyYXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0koInNldHRpbmcgdmlkZW8gYml0cmF0ZSB0byAlZCBicHMiLCB2aWRlb0JpdHJhdGUpOwotCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlci0+c2V0VmlkZW9CaXRyYXRlKHZpZGVvQml0cmF0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc3A8UmVwZWF0ZXJTb3VyY2U+IHJlcGVhdGVyU291cmNlID0gdmlkZW9UcmFjay0+cmVwZWF0ZXJTb3VyY2UoKTsKLSAgICAgICAgaWYgKHJlcGVhdGVyU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGRvdWJsZSByYXRlSHogPQotICAgICAgICAgICAgICAgIENvbnZlcnRlcjo6R2V0SW50MzJQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJtZWRpYS53ZmQudmlkZW8tZnJhbWVyYXRlIiwgLTEpOwotCi0gICAgICAgICAgICBjaGFyIHZhbFtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgICAgICAgICAgaWYgKHJhdGVIeiA8IDAuMAotICAgICAgICAgICAgICAgICAgICAmJiBwcm9wZXJ0eV9nZXQoIm1lZGlhLndmZC52aWRlby1mcmFtZXJhdGUiLCB2YWwsIE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICYmICFzdHJjYXNlY21wKCJhZGFwdGl2ZSIsIHZhbCkpIHsKLSAgICAgICAgICAgICAgICAgcmF0ZUh6ID0gcmVwZWF0ZXJTb3VyY2UtPmdldEZyYW1lUmF0ZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGF2Z0xhdGVuY3lVcyA+IDMwMDAwMGxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJhdGVIeiAqPSAwLjk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhdmdMYXRlbmN5VXMgPCAyMDAwMDBsbCkgewotICAgICAgICAgICAgICAgICAgICByYXRlSHogKj0gMS4xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJhdGVIeiA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAocmF0ZUh6IDwgNS4wKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJhdGVIeiA9IDUuMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJhdGVIeiA+IDMwLjApIHsKLSAgICAgICAgICAgICAgICAgICAgcmF0ZUh6ID0gMzAuMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocmF0ZUh6ICE9IHJlcGVhdGVyU291cmNlLT5nZXRGcmFtZVJhdGUoKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HSSgic2V0dGluZyBmcmFtZSByYXRlIHRvICUuMmYgSHoiLCByYXRlSHopOwotCi0gICAgICAgICAgICAgICAgICAgIHJlcGVhdGVyU291cmNlLT5zZXRGcmFtZVJhdGUocmF0ZUh6KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXR1c190IFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OnNldHVwTWVkaWFQYWNrZXRpemVyKAotICAgICAgICBib29sIGVuYWJsZUF1ZGlvLCBib29sIGVuYWJsZVZpZGVvKSB7Ci0gICAgbUV4dHJhY3RvciA9IG5ldyBOdU1lZGlhRXh0cmFjdG9yOwotCi0gICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgICAgIE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIG1NZWRpYVBhdGguY19zdHIoKSk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgc2l6ZV90IG4gPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOwotICAgIGJvb2wgaGF2ZUF1ZGlvID0gZmFsc2U7Ci0gICAgYm9vbCBoYXZlVmlkZW8gPSBmYWxzZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47ICsraSkgewotICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OwotICAgICAgICBlcnIgPSBtRXh0cmFjdG9yLT5nZXRUcmFja0Zvcm1hdChpLCAmZm9ybWF0KTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIEFTdHJpbmcgbWltZTsKLSAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKLQotICAgICAgICBib29sIGlzQXVkaW8gPSAhc3RybmNhc2VjbXAobWltZS5jX3N0cigpLCAiYXVkaW8vIiwgNik7Ci0gICAgICAgIGJvb2wgaXNWaWRlbyA9ICFzdHJuY2FzZWNtcChtaW1lLmNfc3RyKCksICJ2aWRlby8iLCA2KTsKLQotICAgICAgICBpZiAoaXNBdWRpbyAmJiBlbmFibGVBdWRpbyAmJiAhaGF2ZUF1ZGlvKSB7Ci0gICAgICAgICAgICBoYXZlQXVkaW8gPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKGlzVmlkZW8gJiYgZW5hYmxlVmlkZW8gJiYgIWhhdmVWaWRlbykgewotICAgICAgICAgICAgaGF2ZVZpZGVvID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gbUV4dHJhY3Rvci0+c2VsZWN0VHJhY2soaSk7Ci0KLSAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXggPSBtVHJhY2tzLnNpemUoKTsKLQotICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0VHJhY2tOb3RpZnksIHRoaXMpOwotICAgICAgICBub3RpZnktPnNldFNpemUoInRyYWNrSW5kZXgiLCB0cmFja0luZGV4KTsKLQotICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBuZXcgVHJhY2sobm90aWZ5LCBmb3JtYXQpOwotICAgICAgICBsb29wZXIoKS0+cmVnaXN0ZXJIYW5kbGVyKHRyYWNrKTsKLQotICAgICAgICBtVHJhY2tzLmFkZCh0cmFja0luZGV4LCB0cmFjayk7Ci0KLSAgICAgICAgbUV4dHJhY3RvclRyYWNrVG9JbnRlcm5hbFRyYWNrLmFkZChpLCB0cmFja0luZGV4KTsKLQotICAgICAgICBpZiAoaXNWaWRlbykgewotICAgICAgICAgICAgbVZpZGVvVHJhY2tJbmRleCA9IHRyYWNrSW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICB1aW50MzJfdCBmbGFncyA9IE1lZGlhU2VuZGVyOjpGTEFHX01BTlVBTExZX1BSRVBFTkRfU1BTX1BQUzsKLQotICAgICAgICBzc2l6ZV90IG1lZGlhU2VuZGVyVHJhY2tJbmRleCA9Ci0gICAgICAgICAgICBtTWVkaWFTZW5kZXItPmFkZFRyYWNrKGZvcm1hdCwgZmxhZ3MpOwotICAgICAgICBDSEVDS19HRShtZWRpYVNlbmRlclRyYWNrSW5kZXgsIDApOwotCi0gICAgICAgIHRyYWNrLT5zZXRNZWRpYVNlbmRlclRyYWNrSW5kZXgobWVkaWFTZW5kZXJUcmFja0luZGV4KTsKLQotICAgICAgICBpZiAoKGhhdmVBdWRpbyB8fCAhZW5hYmxlQXVkaW8pICYmIChoYXZlVmlkZW8gfHwgIWVuYWJsZVZpZGVvKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6c2NoZWR1bGVQdWxsRXh0cmFjdG9yKCkgewotICAgIGlmIChtUHVsbEV4dHJhY3RvclBlbmRpbmcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGludDY0X3QgZGVsYXlVcyA9IDEwMDAwMDA7IC8vIGRlZmF1bHQgZGVsYXkgaXMgMSBzZWMKLSAgICBpbnQ2NF90IHNhbXBsZVRpbWVVczsKLSAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5nZXRTYW1wbGVUaW1lKCZzYW1wbGVUaW1lVXMpOwotCi0gICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLQotICAgICAgICBpZiAobUZpcnN0U2FtcGxlVGltZVJlYWxVcyA8IDBsbCkgewotICAgICAgICAgICAgbUZpcnN0U2FtcGxlVGltZVJlYWxVcyA9IG5vd1VzOwotICAgICAgICAgICAgbUZpcnN0U2FtcGxlVGltZVVzID0gc2FtcGxlVGltZVVzOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50NjRfdCB3aGVuVXMgPSBzYW1wbGVUaW1lVXMgLSBtRmlyc3RTYW1wbGVUaW1lVXMgKyBtRmlyc3RTYW1wbGVUaW1lUmVhbFVzOwotICAgICAgICBkZWxheVVzID0gd2hlblVzIC0gbm93VXM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1coImNvdWxkIG5vdCBnZXQgc2FtcGxlIHRpbWUgKCVkKSIsIGVycik7Ci0gICAgfQotCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFB1bGxFeHRyYWN0b3JTYW1wbGUsIHRoaXMpOwotICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtUHVsbEV4dHJhY3RvckdlbmVyYXRpb24pOwotICAgIG1zZy0+cG9zdChkZWxheVVzKTsKLQotICAgIG1QdWxsRXh0cmFjdG9yUGVuZGluZyA9IHRydWU7Ci19Ci0KLXZvaWQgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6b25QdWxsRXh0cmFjdG9yKCkgewotICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSBuZXcgQUJ1ZmZlcigxMDI0ICogMTAyNCk7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+cmVhZFNhbXBsZURhdGEoYWNjZXNzVW5pdCk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAvLyBFT1MuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIG1FeHRyYWN0b3ItPmdldFNhbXBsZVRpbWUoJnRpbWVVcykpOwotCi0gICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgKLSAgICAgICAgICAgICJ0aW1lVXMiLCBtRmlyc3RTYW1wbGVUaW1lUmVhbFVzICsgdGltZVVzIC0gbUZpcnN0U2FtcGxlVGltZVVzKTsKLQotICAgIHNpemVfdCB0cmFja0luZGV4OwotICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgbUV4dHJhY3Rvci0+Z2V0U2FtcGxlVHJhY2tJbmRleCgmdHJhY2tJbmRleCkpOwotCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbnZlcnRlck5vdGlmeSwgdGhpcyk7Ci0KLSAgICBtc2ctPnNldFNpemUoCi0gICAgICAgICAgICAidHJhY2tJbmRleCIsIG1FeHRyYWN0b3JUcmFja1RvSW50ZXJuYWxUcmFjay52YWx1ZUZvcih0cmFja0luZGV4KSk7Ci0KLSAgICBtc2ctPnNldEludDMyKCJ3aGF0IiwgQ29udmVydGVyOjprV2hhdEFjY2Vzc1VuaXQpOwotICAgIG1zZy0+c2V0QnVmZmVyKCJhY2Nlc3NVbml0IiwgYWNjZXNzVW5pdCk7Ci0gICAgbXNnLT5wb3N0KCk7Ci0KLSAgICBtRXh0cmFjdG9yLT5hZHZhbmNlKCk7Ci0KLSAgICBzY2hlZHVsZVB1bGxFeHRyYWN0b3IoKTsKLX0KLQotc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6c2V0dXBQYWNrZXRpemVyKAotICAgICAgICBib29sIGVuYWJsZUF1ZGlvLAotICAgICAgICBib29sIHVzZVBDTUF1ZGlvLAotICAgICAgICBib29sIGVuYWJsZVZpZGVvLAotICAgICAgICBWaWRlb0Zvcm1hdHM6OlJlc29sdXRpb25UeXBlIHZpZGVvUmVzb2x1dGlvblR5cGUsCi0gICAgICAgIHNpemVfdCB2aWRlb1Jlc29sdXRpb25JbmRleCwKLSAgICAgICAgVmlkZW9Gb3JtYXRzOjpQcm9maWxlVHlwZSB2aWRlb1Byb2ZpbGVUeXBlLAotICAgICAgICBWaWRlb0Zvcm1hdHM6OkxldmVsVHlwZSB2aWRlb0xldmVsVHlwZSkgewotICAgIENIRUNLKGVuYWJsZUF1ZGlvIHx8IGVuYWJsZVZpZGVvKTsKLQotICAgIGlmICghbU1lZGlhUGF0aC5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBzZXR1cE1lZGlhUGFja2V0aXplcihlbmFibGVBdWRpbywgZW5hYmxlVmlkZW8pOwotICAgIH0KLQotICAgIGlmIChlbmFibGVWaWRlbykgewotICAgICAgICBzdGF0dXNfdCBlcnIgPSBhZGRWaWRlb1NvdXJjZSgKLSAgICAgICAgICAgICAgICB2aWRlb1Jlc29sdXRpb25UeXBlLCB2aWRlb1Jlc29sdXRpb25JbmRleCwgdmlkZW9Qcm9maWxlVHlwZSwKLSAgICAgICAgICAgICAgICB2aWRlb0xldmVsVHlwZSk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghZW5hYmxlQXVkaW8pIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHJldHVybiBhZGRBdWRpb1NvdXJjZSh1c2VQQ01BdWRpbyk7Ci19Ci0KLXN0YXR1c190IFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OmFkZFNvdXJjZSgKLSAgICAgICAgYm9vbCBpc1ZpZGVvLCBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwgYm9vbCBpc1JlcGVhdGVyU291cmNlLAotICAgICAgICBib29sIHVzZVBDTUF1ZGlvLCB1bnNpZ25lZCBwcm9maWxlSWRjLCB1bnNpZ25lZCBsZXZlbElkYywKLSAgICAgICAgdW5zaWduZWQgY29uc3RyYWludFNldCwgc2l6ZV90ICpudW1JbnB1dEJ1ZmZlcnMpIHsKLSAgICBDSEVDSyghdXNlUENNQXVkaW8gfHwgIWlzVmlkZW8pOwotICAgIENIRUNLKCFpc1JlcGVhdGVyU291cmNlIHx8IGlzVmlkZW8pOwotICAgIENIRUNLKCFwcm9maWxlSWRjIHx8IGlzVmlkZW8pOwotICAgIENIRUNLKCFsZXZlbElkYyB8fCBpc1ZpZGVvKTsKLSAgICBDSEVDSyghY29uc3RyYWludFNldCB8fCBpc1ZpZGVvKTsKLQotICAgIHNwPEFMb29wZXI+IHB1bGxMb29wZXIgPSBuZXcgQUxvb3BlcjsKLSAgICBwdWxsTG9vcGVyLT5zZXROYW1lKCJwdWxsX2xvb3BlciIpOwotCi0gICAgcHVsbExvb3Blci0+c3RhcnQoCi0gICAgICAgICAgICBmYWxzZSAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8sCi0gICAgICAgICAgICBmYWxzZSAvKiBjYW5DYWxsSmF2YSAqLywKLSAgICAgICAgICAgIFBSSU9SSVRZX0FVRElPKTsKLQotICAgIHNwPEFMb29wZXI+IGNvZGVjTG9vcGVyID0gbmV3IEFMb29wZXI7Ci0gICAgY29kZWNMb29wZXItPnNldE5hbWUoImNvZGVjX2xvb3BlciIpOwotCi0gICAgY29kZWNMb29wZXItPnN0YXJ0KAotICAgICAgICAgICAgZmFsc2UgLyogcnVuT25DYWxsaW5nVGhyZWFkICovLAotICAgICAgICAgICAgZmFsc2UgLyogY2FuQ2FsbEphdmEgKi8sCi0gICAgICAgICAgICBQUklPUklUWV9BVURJTyk7Ci0KLSAgICBzaXplX3QgdHJhY2tJbmRleDsKLQotICAgIHNwPEFNZXNzYWdlPiBub3RpZnk7Ci0KLSAgICB0cmFja0luZGV4ID0gbVRyYWNrcy5zaXplKCk7Ci0KLSAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OwotICAgIHN0YXR1c190IGVyciA9IGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShzb3VyY2UtPmdldEZvcm1hdCgpLCAmZm9ybWF0KTsKLSAgICBDSEVDS19FUShlcnIsIChzdGF0dXNfdClPSyk7Ci0KLSAgICBpZiAoaXNWaWRlbykgewotICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7Ci0gICAgICAgIGZvcm1hdC0+c2V0SW50MzIoCi0gICAgICAgICAgICAgICAgImFuZHJvaWQuX2lucHV0LW1ldGFkYXRhLWJ1ZmZlci10eXBlIiwga01ldGFkYXRhQnVmZmVyVHlwZUFOV0J1ZmZlcik7Ci0gICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImFuZHJvaWQuX3N0b3JlLW1ldGFkYXRhLWluLWJ1ZmZlcnMtb3V0cHV0IiwgKG1IRENQICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgJiYgKG1IRENQLT5nZXRDYXBzKCkgJiBIRENQTW9kdWxlOjpIRENQX0NBUFNfRU5DUllQVF9OQVRJVkUpKTsKLSAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigKLSAgICAgICAgICAgICAgICAiY29sb3ItZm9ybWF0IiwgT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRPcGFxdWUpOwotICAgICAgICBmb3JtYXQtPnNldEludDMyKCJwcm9maWxlLWlkYyIsIHByb2ZpbGVJZGMpOwotICAgICAgICBmb3JtYXQtPnNldEludDMyKCJsZXZlbC1pZGMiLCBsZXZlbElkYyk7Ci0gICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImNvbnN0cmFpbnQtc2V0IiwgY29uc3RyYWludFNldCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHVzZVBDTUF1ZGlvKSB7Ci0gICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJwY20tZW5jb2RpbmciLCBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0KTsKLSAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdENvbnZlcnRlck5vdGlmeSwgdGhpcyk7Ci0gICAgbm90aWZ5LT5zZXRTaXplKCJ0cmFja0luZGV4IiwgdHJhY2tJbmRleCk7Ci0KLSAgICBzcDxDb252ZXJ0ZXI+IGNvbnZlcnRlciA9IG5ldyBDb252ZXJ0ZXIobm90aWZ5LCBjb2RlY0xvb3BlciwgZm9ybWF0KTsKLQotICAgIGxvb3BlcigpLT5yZWdpc3RlckhhbmRsZXIoY29udmVydGVyKTsKLQotICAgIGVyciA9IGNvbnZlcnRlci0+aW5pdCgpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzIGNvbnZlcnRlciByZXR1cm5lZCBlcnIgJWQiLCBpc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIsIGVycik7Ci0KLSAgICAgICAgbG9vcGVyKCktPnVucmVnaXN0ZXJIYW5kbGVyKGNvbnZlcnRlci0+aWQoKSk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbm90aWZ5ID0gbmV3IEFNZXNzYWdlKENvbnZlcnRlcjo6a1doYXRNZWRpYVB1bGxlck5vdGlmeSwgY29udmVydGVyKTsKLSAgICBub3RpZnktPnNldFNpemUoInRyYWNrSW5kZXgiLCB0cmFja0luZGV4KTsKLQotICAgIHNwPE1lZGlhUHVsbGVyPiBwdWxsZXIgPSBuZXcgTWVkaWFQdWxsZXIoc291cmNlLCBub3RpZnkpOwotICAgIHB1bGxMb29wZXItPnJlZ2lzdGVySGFuZGxlcihwdWxsZXIpOwotCi0gICAgaWYgKG51bUlucHV0QnVmZmVycyAhPSBOVUxMKSB7Ci0gICAgICAgICpudW1JbnB1dEJ1ZmZlcnMgPSBjb252ZXJ0ZXItPmdldElucHV0QnVmZmVyQ291bnQoKTsKLSAgICB9Ci0KLSAgICBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRUcmFja05vdGlmeSwgdGhpcyk7Ci0gICAgbm90aWZ5LT5zZXRTaXplKCJ0cmFja0luZGV4IiwgdHJhY2tJbmRleCk7Ci0KLSAgICBzcDxUcmFjaz4gdHJhY2sgPSBuZXcgVHJhY2soCi0gICAgICAgICAgICBub3RpZnksIHB1bGxMb29wZXIsIGNvZGVjTG9vcGVyLCBwdWxsZXIsIGNvbnZlcnRlcik7Ci0KLSAgICBpZiAoaXNSZXBlYXRlclNvdXJjZSkgewotICAgICAgICB0cmFjay0+c2V0UmVwZWF0ZXJTb3VyY2Uoc3RhdGljX2Nhc3Q8UmVwZWF0ZXJTb3VyY2UgKj4oc291cmNlLmdldCgpKSk7Ci0gICAgfQotCi0gICAgbG9vcGVyKCktPnJlZ2lzdGVySGFuZGxlcih0cmFjayk7Ci0KLSAgICBtVHJhY2tzLmFkZCh0cmFja0luZGV4LCB0cmFjayk7Ci0KLSAgICBpZiAoaXNWaWRlbykgewotICAgICAgICBtVmlkZW9UcmFja0luZGV4ID0gdHJhY2tJbmRleDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBmbGFncyA9IDA7Ci0gICAgaWYgKGNvbnZlcnRlci0+bmVlZFRvTWFudWFsbHlQcmVwZW5kU1BTUFBTKCkpIHsKLSAgICAgICAgZmxhZ3MgfD0gTWVkaWFTZW5kZXI6OkZMQUdfTUFOVUFMTFlfUFJFUEVORF9TUFNfUFBTOwotICAgIH0KLQotICAgIHNzaXplX3QgbWVkaWFTZW5kZXJUcmFja0luZGV4ID0KLSAgICAgICAgbU1lZGlhU2VuZGVyLT5hZGRUcmFjayhjb252ZXJ0ZXItPmdldE91dHB1dEZvcm1hdCgpLCBmbGFncyk7Ci0gICAgQ0hFQ0tfR0UobWVkaWFTZW5kZXJUcmFja0luZGV4LCAwKTsKLQotICAgIHRyYWNrLT5zZXRNZWRpYVNlbmRlclRyYWNrSW5kZXgobWVkaWFTZW5kZXJUcmFja0luZGV4KTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6YWRkVmlkZW9Tb3VyY2UoCi0gICAgICAgIFZpZGVvRm9ybWF0czo6UmVzb2x1dGlvblR5cGUgdmlkZW9SZXNvbHV0aW9uVHlwZSwKLSAgICAgICAgc2l6ZV90IHZpZGVvUmVzb2x1dGlvbkluZGV4LAotICAgICAgICBWaWRlb0Zvcm1hdHM6OlByb2ZpbGVUeXBlIHZpZGVvUHJvZmlsZVR5cGUsCi0gICAgICAgIFZpZGVvRm9ybWF0czo6TGV2ZWxUeXBlIHZpZGVvTGV2ZWxUeXBlKSB7Ci0gICAgc2l6ZV90IHdpZHRoLCBoZWlnaHQsIGZyYW1lc1BlclNlY29uZDsKLSAgICBib29sIGludGVybGFjZWQ7Ci0gICAgQ0hFQ0soVmlkZW9Gb3JtYXRzOjpHZXRDb25maWd1cmF0aW9uKAotICAgICAgICAgICAgICAgIHZpZGVvUmVzb2x1dGlvblR5cGUsCi0gICAgICAgICAgICAgICAgdmlkZW9SZXNvbHV0aW9uSW5kZXgsCi0gICAgICAgICAgICAgICAgJndpZHRoLAotICAgICAgICAgICAgICAgICZoZWlnaHQsCi0gICAgICAgICAgICAgICAgJmZyYW1lc1BlclNlY29uZCwKLSAgICAgICAgICAgICAgICAmaW50ZXJsYWNlZCkpOwotCi0gICAgdW5zaWduZWQgcHJvZmlsZUlkYywgbGV2ZWxJZGMsIGNvbnN0cmFpbnRTZXQ7Ci0gICAgQ0hFQ0soVmlkZW9Gb3JtYXRzOjpHZXRQcm9maWxlTGV2ZWwoCi0gICAgICAgICAgICAgICAgdmlkZW9Qcm9maWxlVHlwZSwKLSAgICAgICAgICAgICAgICB2aWRlb0xldmVsVHlwZSwKLSAgICAgICAgICAgICAgICAmcHJvZmlsZUlkYywKLSAgICAgICAgICAgICAgICAmbGV2ZWxJZGMsCi0gICAgICAgICAgICAgICAgJmNvbnN0cmFpbnRTZXQpKTsKLQotICAgIHNwPFN1cmZhY2VNZWRpYVNvdXJjZT4gc291cmNlID0gbmV3IFN1cmZhY2VNZWRpYVNvdXJjZSh3aWR0aCwgaGVpZ2h0KTsKLQotICAgIHNvdXJjZS0+c2V0VXNlQWJzb2x1dGVUaW1lc3RhbXBzKCk7Ci0KLSAgICBzcDxSZXBlYXRlclNvdXJjZT4gdmlkZW9Tb3VyY2UgPQotICAgICAgICBuZXcgUmVwZWF0ZXJTb3VyY2Uoc291cmNlLCBmcmFtZXNQZXJTZWNvbmQpOwotCi0gICAgc2l6ZV90IG51bUlucHV0QnVmZmVyczsKLSAgICBzdGF0dXNfdCBlcnIgPSBhZGRTb3VyY2UoCi0gICAgICAgICAgICB0cnVlIC8qIGlzVmlkZW8gKi8sIHZpZGVvU291cmNlLCB0cnVlIC8qIGlzUmVwZWF0ZXJTb3VyY2UgKi8sCi0gICAgICAgICAgICBmYWxzZSAvKiB1c2VQQ01BdWRpbyAqLywgcHJvZmlsZUlkYywgbGV2ZWxJZGMsIGNvbnN0cmFpbnRTZXQsCi0gICAgICAgICAgICAmbnVtSW5wdXRCdWZmZXJzKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSBzb3VyY2UtPnNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQobnVtSW5wdXRCdWZmZXJzKTsKLSAgICBDSEVDS19FUShlcnIsIChzdGF0dXNfdClPSyk7Ci0KLSAgICBtUHJvZHVjZXIgPSBzb3VyY2UtPmdldFByb2R1Y2VyKCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OmFkZEF1ZGlvU291cmNlKGJvb2wgdXNlUENNQXVkaW8pIHsKLSAgICBzcDxBdWRpb1NvdXJjZT4gYXVkaW9Tb3VyY2UgPSBuZXcgQXVkaW9Tb3VyY2UoCi0gICAgICAgICAgICBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWCwKLSAgICAgICAgICAgIG1PcFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlUmF0ZSAqLywKLSAgICAgICAgICAgIDIgLyogY2hhbm5lbENvdW50ICovKTsKLQotICAgIGlmIChhdWRpb1NvdXJjZS0+aW5pdENoZWNrKCkgPT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGFkZFNvdXJjZSgKLSAgICAgICAgICAgICAgICBmYWxzZSAvKiBpc1ZpZGVvICovLCBhdWRpb1NvdXJjZSwgZmFsc2UgLyogaXNSZXBlYXRlclNvdXJjZSAqLywKLSAgICAgICAgICAgICAgICB1c2VQQ01BdWRpbywgMCAvKiBwcm9maWxlSWRjICovLCAwIC8qIGxldmVsSWRjICovLAotICAgICAgICAgICAgICAgIDAgLyogY29uc3RyYWludFNldCAqLywgTlVMTCAvKiBudW1JbnB1dEJ1ZmZlcnMgKi8pOwotICAgIH0KLQotICAgIEFMT0dXKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgYXVkaW8gc291cmNlIik7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IFdpZmlEaXNwbGF5U291cmNlOjpQbGF5YmFja1Nlc3Npb246OmdldFN1cmZhY2VUZXh0dXJlKCkgewotICAgIHJldHVybiBtUHJvZHVjZXI7Ci19Ci0KLXZvaWQgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6cmVxdWVzdElEUkZyYW1lKCkgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgewotICAgICAgICBjb25zdCBzcDxUcmFjaz4gJnRyYWNrID0gbVRyYWNrcy52YWx1ZUF0KGkpOwotCi0gICAgICAgIHRyYWNrLT5yZXF1ZXN0SURSRnJhbWUoKTsKLSAgICB9Ci19Ci0KLXZvaWQgV2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbjo6bm90aWZ5U2Vzc2lvbkRlYWQoKSB7Ci0gICAgLy8gSW5mb3JtIFdpZmlEaXNwbGF5U291cmNlIG9mIG91ciBwcmVtYXR1cmUgZGVhdGggKHdpc2gpLgotICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRTZXNzaW9uRGVhZCk7Ci0gICAgbm90aWZ5LT5wb3N0KCk7Ci0KLSAgICBtV2VBcmVEZWFkID0gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUGxheWJhY2tTZXNzaW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NjczZGYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9QbGF5YmFja1Nlc3Npb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFBMQVlCQUNLX1NFU1NJT05fSF8KLQotI2RlZmluZSBQTEFZQkFDS19TRVNTSU9OX0hfCi0KLSNpbmNsdWRlICJNZWRpYVNlbmRlci5oIgotI2luY2x1ZGUgIlZpZGVvRm9ybWF0cy5oIgotI2luY2x1ZGUgIldpZmlEaXNwbGF5U291cmNlLmgiCi0KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBBQnVmZmVyOwotc3RydWN0IElIRENQOwotY2xhc3MgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKLXN0cnVjdCBNZWRpYVB1bGxlcjsKLXN0cnVjdCBNZWRpYVNvdXJjZTsKLXN0cnVjdCBNZWRpYVNlbmRlcjsKLXN0cnVjdCBOdU1lZGlhRXh0cmFjdG9yOwotCi0vLyBFbmNhcHN1bGF0ZXMgdGhlIHN0YXRlIG9mIGFuIFJUUC9SVENQIHNlc3Npb24gaW4gdGhlIGNvbnRleHQgb2Ygd2lmaQotLy8gZGlzcGxheS4KLXN0cnVjdCBXaWZpRGlzcGxheVNvdXJjZTo6UGxheWJhY2tTZXNzaW9uIDogcHVibGljIEFIYW5kbGVyIHsKLSAgICBQbGF5YmFja1Nlc3Npb24oCi0gICAgICAgICAgICBjb25zdCBTdHJpbmcxNiAmb3BQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIGNvbnN0IHNwPEFOZXR3b3JrU2Vzc2lvbj4gJm5ldFNlc3Npb24sCi0gICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICZpbnRlcmZhY2VBZGRyLAotICAgICAgICAgICAgY29uc3Qgc3A8SUhEQ1A+ICZoZGNwLAotICAgICAgICAgICAgY29uc3QgY2hhciAqcGF0aCA9IE5VTEwpOwotCi0gICAgc3RhdHVzX3QgaW5pdCgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNsaWVudElQLAotICAgICAgICAgICAgaW50MzJfdCBjbGllbnRSdHAsCi0gICAgICAgICAgICBSVFBTZW5kZXI6OlRyYW5zcG9ydE1vZGUgcnRwTW9kZSwKLSAgICAgICAgICAgIGludDMyX3QgY2xpZW50UnRjcCwKLSAgICAgICAgICAgIFJUUFNlbmRlcjo6VHJhbnNwb3J0TW9kZSBydGNwTW9kZSwKLSAgICAgICAgICAgIGJvb2wgZW5hYmxlQXVkaW8sCi0gICAgICAgICAgICBib29sIHVzZVBDTUF1ZGlvLAotICAgICAgICAgICAgYm9vbCBlbmFibGVWaWRlbywKLSAgICAgICAgICAgIFZpZGVvRm9ybWF0czo6UmVzb2x1dGlvblR5cGUgdmlkZW9SZXNvbHV0aW9uVHlwZSwKLSAgICAgICAgICAgIHNpemVfdCB2aWRlb1Jlc29sdXRpb25JbmRleCwKLSAgICAgICAgICAgIFZpZGVvRm9ybWF0czo6UHJvZmlsZVR5cGUgdmlkZW9Qcm9maWxlVHlwZSwKLSAgICAgICAgICAgIFZpZGVvRm9ybWF0czo6TGV2ZWxUeXBlIHZpZGVvTGV2ZWxUeXBlKTsKLQotICAgIHZvaWQgZGVzdHJveUFzeW5jKCk7Ci0KLSAgICBpbnQzMl90IGdldFJUUFBvcnQoKSBjb25zdDsKLQotICAgIGludDY0X3QgZ2V0TGFzdExpZmVzaWduVXMoKSBjb25zdDsKLSAgICB2b2lkIHVwZGF0ZUxpdmVuZXNzKCk7Ci0KLSAgICBzdGF0dXNfdCBwbGF5KCk7Ci0gICAgc3RhdHVzX3QgZmluaXNoUGxheSgpOwotICAgIHN0YXR1c190IHBhdXNlKCk7Ci0KLSAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnZXRTdXJmYWNlVGV4dHVyZSgpOwotCi0gICAgdm9pZCByZXF1ZXN0SURSRnJhbWUoKTsKLQotICAgIGVudW0gewotICAgICAgICBrV2hhdFNlc3Npb25EZWFkLAotICAgICAgICBrV2hhdEJpbmFyeURhdGEsCi0gICAgICAgIGtXaGF0U2Vzc2lvbkVzdGFibGlzaGVkLAotICAgICAgICBrV2hhdFNlc3Npb25EZXN0cm95ZWQsCi0gICAgfTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0gICAgdmlydHVhbCB+UGxheWJhY2tTZXNzaW9uKCk7Ci0KLXByaXZhdGU6Ci0gICAgc3RydWN0IFRyYWNrOwotCi0gICAgZW51bSB7Ci0gICAgICAgIGtXaGF0TWVkaWFQdWxsZXJOb3RpZnksCi0gICAgICAgIGtXaGF0Q29udmVydGVyTm90aWZ5LAotICAgICAgICBrV2hhdFRyYWNrTm90aWZ5LAotICAgICAgICBrV2hhdFVwZGF0ZVN1cmZhY2UsCi0gICAgICAgIGtXaGF0UGF1c2UsCi0gICAgICAgIGtXaGF0UmVzdW1lLAotICAgICAgICBrV2hhdE1lZGlhU2VuZGVyTm90aWZ5LAotICAgICAgICBrV2hhdFB1bGxFeHRyYWN0b3JTYW1wbGUsCi0gICAgfTsKLQotICAgIFN0cmluZzE2IG1PcFBhY2thZ2VOYW1lOwotCi0gICAgc3A8QU5ldHdvcmtTZXNzaW9uPiBtTmV0U2Vzc2lvbjsKLSAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKLSAgICBpbl9hZGRyIG1JbnRlcmZhY2VBZGRyOwotICAgIHNwPElIRENQPiBtSERDUDsKLSAgICBBU3RyaW5nIG1NZWRpYVBhdGg7Ci0KLSAgICBzcDxNZWRpYVNlbmRlcj4gbU1lZGlhU2VuZGVyOwotICAgIGludDMyX3QgbUxvY2FsUlRQUG9ydDsKLQotICAgIGJvb2wgbVdlQXJlRGVhZDsKLSAgICBib29sIG1QYXVzZWQ7Ci0KLSAgICBpbnQ2NF90IG1MYXN0TGlmZXNpZ25VczsKLQotICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1Qcm9kdWNlcjsKLQotICAgIEtleWVkVmVjdG9yPHNpemVfdCwgc3A8VHJhY2s+ID4gbVRyYWNrczsKLSAgICBzc2l6ZV90IG1WaWRlb1RyYWNrSW5kZXg7Ci0KLSAgICBpbnQ2NF90IG1QcmV2VGltZVVzOwotCi0gICAgc3A8TnVNZWRpYUV4dHJhY3Rvcj4gbUV4dHJhY3RvcjsKLSAgICBLZXllZFZlY3RvcjxzaXplX3QsIHNpemVfdD4gbUV4dHJhY3RvclRyYWNrVG9JbnRlcm5hbFRyYWNrOwotICAgIGJvb2wgbVB1bGxFeHRyYWN0b3JQZW5kaW5nOwotICAgIGludDMyX3QgbVB1bGxFeHRyYWN0b3JHZW5lcmF0aW9uOwotICAgIGludDY0X3QgbUZpcnN0U2FtcGxlVGltZVJlYWxVczsKLSAgICBpbnQ2NF90IG1GaXJzdFNhbXBsZVRpbWVVczsKLQotICAgIHN0YXR1c190IHNldHVwTWVkaWFQYWNrZXRpemVyKGJvb2wgZW5hYmxlQXVkaW8sIGJvb2wgZW5hYmxlVmlkZW8pOwotCi0gICAgc3RhdHVzX3Qgc2V0dXBQYWNrZXRpemVyKAotICAgICAgICAgICAgYm9vbCBlbmFibGVBdWRpbywKLSAgICAgICAgICAgIGJvb2wgdXNlUENNQXVkaW8sCi0gICAgICAgICAgICBib29sIGVuYWJsZVZpZGVvLAotICAgICAgICAgICAgVmlkZW9Gb3JtYXRzOjpSZXNvbHV0aW9uVHlwZSB2aWRlb1Jlc29sdXRpb25UeXBlLAotICAgICAgICAgICAgc2l6ZV90IHZpZGVvUmVzb2x1dGlvbkluZGV4LAotICAgICAgICAgICAgVmlkZW9Gb3JtYXRzOjpQcm9maWxlVHlwZSB2aWRlb1Byb2ZpbGVUeXBlLAotICAgICAgICAgICAgVmlkZW9Gb3JtYXRzOjpMZXZlbFR5cGUgdmlkZW9MZXZlbFR5cGUpOwotCi0gICAgc3RhdHVzX3QgYWRkU291cmNlKAotICAgICAgICAgICAgYm9vbCBpc1ZpZGVvLAotICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsCi0gICAgICAgICAgICBib29sIGlzUmVwZWF0ZXJTb3VyY2UsCi0gICAgICAgICAgICBib29sIHVzZVBDTUF1ZGlvLAotICAgICAgICAgICAgdW5zaWduZWQgcHJvZmlsZUlkYywKLSAgICAgICAgICAgIHVuc2lnbmVkIGxldmVsSWRjLAotICAgICAgICAgICAgdW5zaWduZWQgY29udHJhaW50U2V0LAotICAgICAgICAgICAgc2l6ZV90ICpudW1JbnB1dEJ1ZmZlcnMpOwotCi0gICAgc3RhdHVzX3QgYWRkVmlkZW9Tb3VyY2UoCi0gICAgICAgICAgICBWaWRlb0Zvcm1hdHM6OlJlc29sdXRpb25UeXBlIHZpZGVvUmVzb2x1dGlvblR5cGUsCi0gICAgICAgICAgICBzaXplX3QgdmlkZW9SZXNvbHV0aW9uSW5kZXgsCi0gICAgICAgICAgICBWaWRlb0Zvcm1hdHM6OlByb2ZpbGVUeXBlIHZpZGVvUHJvZmlsZVR5cGUsCi0gICAgICAgICAgICBWaWRlb0Zvcm1hdHM6OkxldmVsVHlwZSB2aWRlb0xldmVsVHlwZSk7Ci0KLSAgICBzdGF0dXNfdCBhZGRBdWRpb1NvdXJjZShib29sIHVzZVBDTUF1ZGlvKTsKLQotICAgIHN0YXR1c190IG9uTWVkaWFTZW5kZXJJbml0aWFsaXplZCgpOwotCi0gICAgdm9pZCBub3RpZnlTZXNzaW9uRGVhZCgpOwotCi0gICAgdm9pZCBzY2hlZHVsZVB1bGxFeHRyYWN0b3IoKTsKLSAgICB2b2lkIG9uUHVsbEV4dHJhY3RvcigpOwotCi0gICAgdm9pZCBvblNpbmtGZWVkYmFjayhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQbGF5YmFja1Nlc3Npb24pOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBQTEFZQkFDS19TRVNTSU9OX0hfCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvUmVwZWF0ZXJTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9SZXBlYXRlclNvdXJjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNmI2NjMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9SZXBlYXRlclNvdXJjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJSZXBlYXRlclNvdXJjZSIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIlJlcGVhdGVyU291cmNlLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotUmVwZWF0ZXJTb3VyY2U6OlJlcGVhdGVyU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLCBkb3VibGUgcmF0ZUh6KQotICAgIDogbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbVNvdXJjZShzb3VyY2UpLAotICAgICAgbVJhdGVIeihyYXRlSHopLAotICAgICAgbUJ1ZmZlcihOVUxMKSwKLSAgICAgIG1SZXN1bHQoT0spLAotICAgICAgbUxhc3RCdWZmZXJVcGRhdGVVcygtMWxsKSwKLSAgICAgIG1TdGFydFRpbWVVcygtMWxsKSwKLSAgICAgIG1GcmFtZUNvdW50KDApIHsKLX0KLQotUmVwZWF0ZXJTb3VyY2U6On5SZXBlYXRlclNvdXJjZSgpIHsKLSAgICBDSEVDSyghbVN0YXJ0ZWQpOwotfQotCi1kb3VibGUgUmVwZWF0ZXJTb3VyY2U6OmdldEZyYW1lUmF0ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVJhdGVIejsKLX0KLQotdm9pZCBSZXBlYXRlclNvdXJjZTo6c2V0RnJhbWVSYXRlKGRvdWJsZSByYXRlSHopIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKHJhdGVIeiA9PSBtUmF0ZUh6KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobVN0YXJ0VGltZVVzID49IDBsbCkgewotICAgICAgICBpbnQ2NF90IG5leHRUaW1lVXMgPSBtU3RhcnRUaW1lVXMgKyAobUZyYW1lQ291bnQgKiAxMDAwMDAwbGwpIC8gbVJhdGVIejsKLSAgICAgICAgbVN0YXJ0VGltZVVzID0gbmV4dFRpbWVVczsKLSAgICAgICAgbUZyYW1lQ291bnQgPSAwOwotICAgIH0KLSAgICBtUmF0ZUh6ID0gcmF0ZUh6OwotfQotCi1zdGF0dXNfdCBSZXBlYXRlclNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgewotICAgIENIRUNLKCFtU3RhcnRlZCk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdGFydChwYXJhbXMpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1CdWZmZXIgPSBOVUxMOwotICAgIG1SZXN1bHQgPSBPSzsKLSAgICBtU3RhcnRUaW1lVXMgPSAtMWxsOwotICAgIG1GcmFtZUNvdW50ID0gMDsKLQotICAgIG1Mb29wZXIgPSBuZXcgQUxvb3BlcjsKLSAgICBtTG9vcGVyLT5zZXROYW1lKCJyZXBlYXRlcl9sb29wZXIiKTsKLSAgICBtTG9vcGVyLT5zdGFydCgpOwotCi0gICAgbVJlZmxlY3RvciA9IG5ldyBBSGFuZGxlclJlZmxlY3RvcjxSZXBlYXRlclNvdXJjZT4odGhpcyk7Ci0gICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1SZWZsZWN0b3IpOwotCi0gICAgcG9zdFJlYWQoKTsKLQotICAgIG1TdGFydGVkID0gdHJ1ZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUmVwZWF0ZXJTb3VyY2U6OnN0b3AoKSB7Ci0gICAgQ0hFQ0sobVN0YXJ0ZWQpOwotCi0gICAgQUxPR1YoInN0b3BwaW5nIik7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdG9wKCk7Ci0KLSAgICBpZiAobUxvb3BlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1Mb29wZXItPnN0b3AoKTsKLSAgICAgICAgbUxvb3Blci5jbGVhcigpOwotCi0gICAgICAgIG1SZWZsZWN0b3IuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBpZiAobUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJyZWxlYXNpbmcgbWJ1ZiAlcCIsIG1CdWZmZXIpOwotICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgIH0KLQotCi0gICAgQUxPR1YoInN0b3BwZWQiKTsKLQotICAgIG1TdGFydGVkID0gZmFsc2U7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zcDxNZXRhRGF0YT4gUmVwZWF0ZXJTb3VyY2U6OmdldEZvcm1hdCgpIHsKLSAgICByZXR1cm4gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci19Ci0KLXN0YXR1c190IFJlcGVhdGVyU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIHNlZWtNb2RlOwotICAgIENIRUNLKG9wdGlvbnMgPT0gTlVMTCB8fCAhb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmc2Vla01vZGUpKTsKLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgaW50NjRfdCBidWZmZXJUaW1lVXMgPSAtMWxsOwotCi0gICAgICAgIGlmIChtU3RhcnRUaW1lVXMgPCAwbGwpIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgICAgICB3aGlsZSAoKG1MYXN0QnVmZmVyVXBkYXRlVXMgPCAwbGwgfHwgbUJ1ZmZlciA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAmJiBtUmVzdWx0ID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQUxPR1YoIm5vdyByZXN1bWluZy4iKTsKLSAgICAgICAgICAgIG1TdGFydFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgICAgICAgICBidWZmZXJUaW1lVXMgPSBtU3RhcnRUaW1lVXM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBidWZmZXJUaW1lVXMgPSBtU3RhcnRUaW1lVXMgKyAobUZyYW1lQ291bnQgKiAxMDAwMDAwbGwpIC8gbVJhdGVIejsKLQotICAgICAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPSBidWZmZXJUaW1lVXMgLSBub3dVczsKLQotICAgICAgICAgICAgaWYgKGRlbGF5VXMgPiAwbGwpIHsKLSAgICAgICAgICAgICAgICB1c2xlZXAoZGVsYXlVcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBib29sIHN0YWxlID0gZmFsc2U7Ci0KLSAgICAgICAgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgICAgIGlmIChtUmVzdWx0ICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciA9PSBOVUxMKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVJlc3VsdDsKLSAgICAgICAgICAgIH0KLQotI2lmIFNVU1BFTkRfVklERU9fSUZfSURMRQotICAgICAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgICAgICAgICBpZiAobm93VXMgLSBtTGFzdEJ1ZmZlclVwZGF0ZVVzID4gMTAwMDAwMGxsKSB7Ci0gICAgICAgICAgICAgICAgbUxhc3RCdWZmZXJVcGRhdGVVcyA9IC0xbGw7Ci0gICAgICAgICAgICAgICAgc3RhbGUgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5hZGRfcmVmKCk7Ci0gICAgICAgICAgICAgICAgKmJ1ZmZlciA9IG1CdWZmZXI7Ci0gICAgICAgICAgICAgICAgKCpidWZmZXIpLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIGJ1ZmZlclRpbWVVcyk7Ci0gICAgICAgICAgICAgICAgKyttRnJhbWVDb3VudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghc3RhbGUpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgbVN0YXJ0VGltZVVzID0gLTFsbDsKLSAgICAgICAgbUZyYW1lQ291bnQgPSAwOwotICAgICAgICBBTE9HVigibm93IGRvcm1hbnQiKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgUmVwZWF0ZXJTb3VyY2U6OnBvc3RSZWFkKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZWFkLCBtUmVmbGVjdG9yKSktPnBvc3QoKTsKLX0KLQotdm9pZCBSZXBlYXRlclNvdXJjZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7Ci0gICAgICAgIGNhc2Uga1doYXRSZWFkOgotICAgICAgICB7Ci0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOwotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+cmVhZCgmYnVmZmVyKTsKLQotICAgICAgICAgICAgQUxPR1YoInJlYWQgbWJ1ZiAlcCIsIGJ1ZmZlcik7Ci0KLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgICAgICBpZiAobUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICAgICAgICAgIG1SZXN1bHQgPSBlcnI7Ci0gICAgICAgICAgICBtTGFzdEJ1ZmZlclVwZGF0ZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLQotICAgICAgICAgICAgbUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKLQotICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgIHBvc3RSZWFkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBUUkVTUEFTUygpOwotICAgIH0KLX0KLQotdm9pZCBSZXBlYXRlclNvdXJjZTo6d2FrZVVwKCkgewotICAgIEFMT0dWKCJ3YWtlVXAiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIGlmIChtTGFzdEJ1ZmZlclVwZGF0ZVVzIDwgMGxsICYmIG1CdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBtTGFzdEJ1ZmZlclVwZGF0ZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICAgICAgbUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKLSAgICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1JlcGVhdGVyU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1JlcGVhdGVyU291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNDE0ZmQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9SZXBlYXRlclNvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotI2lmbmRlZiBSRVBFQVRFUl9TT1VSQ0VfSF8KLQotI2RlZmluZSBSRVBFQVRFUl9TT1VSQ0VfSF8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyUmVmbGVjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLQotI2RlZmluZSBTVVNQRU5EX1ZJREVPX0lGX0lETEUgICAwCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gVGhpcyBNZWRpYVNvdXJjZSBkZWxpdmVycyBmcmFtZXMgYXQgYSBjb25zdGFudCByYXRlIGJ5IHJlcGVhdGluZyBidWZmZXJzCi0vLyBpZiBuZWNlc3NhcnkuCi1zdHJ1Y3QgUmVwZWF0ZXJTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewotICAgIFJlcGVhdGVyU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLCBkb3VibGUgcmF0ZUh6KTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOwotCi0gICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0KLSAgICAvLyBJZiBSZXBlYXRlclNvdXJjZSBpcyBjdXJyZW50bHkgZG9ybWFudCwgYmVjYXVzZSBTdXJmYWNlRmxpbmdlciBkaWRuJ3QKLSAgICAvLyBzZW5kIHVwZGF0ZXMgaW4gYSB3aGlsZSwgdGhpcyBpcyBpdHMgd2FrZXVwIGNhbGwuCi0gICAgdm9pZCB3YWtlVXAoKTsKLQotICAgIGRvdWJsZSBnZXRGcmFtZVJhdGUoKSBjb25zdDsKLSAgICB2b2lkIHNldEZyYW1lUmF0ZShkb3VibGUgcmF0ZUh6KTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgflJlcGVhdGVyU291cmNlKCk7Ci0KLXByaXZhdGU6Ci0gICAgZW51bSB7Ci0gICAgICAgIGtXaGF0UmVhZCwKLSAgICB9OwotCi0gICAgTXV0ZXggbUxvY2s7Ci0gICAgQ29uZGl0aW9uIG1Db25kaXRpb247Ci0KLSAgICBib29sIG1TdGFydGVkOwotCi0gICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7Ci0gICAgZG91YmxlIG1SYXRlSHo7Ci0KLSAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwotICAgIHNwPEFIYW5kbGVyUmVmbGVjdG9yPFJlcGVhdGVyU291cmNlPiA+IG1SZWZsZWN0b3I7Ci0KLSAgICBNZWRpYUJ1ZmZlciAqbUJ1ZmZlcjsKLSAgICBzdGF0dXNfdCBtUmVzdWx0OwotICAgIGludDY0X3QgbUxhc3RCdWZmZXJVcGRhdGVVczsKLQotICAgIGludDY0X3QgbVN0YXJ0VGltZVVzOwotICAgIGludDMyX3QgbUZyYW1lQ291bnQ7Ci0KLSAgICB2b2lkIHBvc3RSZWFkKCk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZXBlYXRlclNvdXJjZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gUkVQRUFURVJfU09VUkNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1RTUGFja2V0aXplci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1RTUGFja2V0aXplci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NWJhOTQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9UU1BhY2tldGl6ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTA1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIlRTUGFja2V0aXplciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIlRTUGFja2V0aXplci5oIgotI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotCi0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IFRTUGFja2V0aXplcjo6VHJhY2sgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgVHJhY2soY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCi0gICAgICAgICAgdW5zaWduZWQgUElELCB1bnNpZ25lZCBzdHJlYW1UeXBlLCB1bnNpZ25lZCBzdHJlYW1JRCk7Ci0KLSAgICB1bnNpZ25lZCBQSUQoKSBjb25zdDsKLSAgICB1bnNpZ25lZCBzdHJlYW1UeXBlKCkgY29uc3Q7Ci0gICAgdW5zaWduZWQgc3RyZWFtSUQoKSBjb25zdDsKLQotICAgIC8vIFJldHVybnMgdGhlIHByZXZpb3VzIHZhbHVlLgotICAgIHVuc2lnbmVkIGluY3JlbWVudENvbnRpbnVpdHlDb3VudGVyKCk7Ci0KLSAgICBib29sIGlzQXVkaW8oKSBjb25zdDsKLSAgICBib29sIGlzVmlkZW8oKSBjb25zdDsKLQotICAgIGJvb2wgaXNIMjY0KCkgY29uc3Q7Ci0gICAgYm9vbCBpc0FBQygpIGNvbnN0OwotICAgIGJvb2wgbGFja3NBRFRTSGVhZGVyKCkgY29uc3Q7Ci0gICAgYm9vbCBpc1BDTUF1ZGlvKCkgY29uc3Q7Ci0KLSAgICBzcDxBQnVmZmVyPiBwcmVwZW5kQ1NEKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KSBjb25zdDsKLSAgICBzcDxBQnVmZmVyPiBwcmVwZW5kQURUU0hlYWRlcihjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCkgY29uc3Q7Ci0KLSAgICBzaXplX3QgY291bnREZXNjcmlwdG9ycygpIGNvbnN0OwotICAgIHNwPEFCdWZmZXI+IGRlc2NyaXB0b3JBdChzaXplX3QgaW5kZXgpIGNvbnN0OwotCi0gICAgdm9pZCBmaW5hbGl6ZSgpOwotICAgIHZvaWQgZXh0cmFjdENTRElmTmVjZXNzYXJ5KCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5UcmFjaygpOwotCi1wcml2YXRlOgotICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0OwotCi0gICAgdW5zaWduZWQgbVBJRDsKLSAgICB1bnNpZ25lZCBtU3RyZWFtVHlwZTsKLSAgICB1bnNpZ25lZCBtU3RyZWFtSUQ7Ci0gICAgdW5zaWduZWQgbUNvbnRpbnVpdHlDb3VudGVyOwotCi0gICAgQVN0cmluZyBtTUlNRTsKLSAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiBtQ1NEOwotCi0gICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gbURlc2NyaXB0b3JzOwotCi0gICAgYm9vbCBtQXVkaW9MYWNrc0FURFNIZWFkZXJzOwotICAgIGJvb2wgbUZpbmFsaXplZDsKLSAgICBib29sIG1FeHRyYWN0ZWRDU0Q7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUcmFjayk7Ci19OwotCi1UU1BhY2tldGl6ZXI6OlRyYWNrOjpUcmFjaygKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCi0gICAgICAgIHVuc2lnbmVkIFBJRCwgdW5zaWduZWQgc3RyZWFtVHlwZSwgdW5zaWduZWQgc3RyZWFtSUQpCi0gICAgOiBtRm9ybWF0KGZvcm1hdCksCi0gICAgICBtUElEKFBJRCksCi0gICAgICBtU3RyZWFtVHlwZShzdHJlYW1UeXBlKSwKLSAgICAgIG1TdHJlYW1JRChzdHJlYW1JRCksCi0gICAgICBtQ29udGludWl0eUNvdW50ZXIoMCksCi0gICAgICBtQXVkaW9MYWNrc0FURFNIZWFkZXJzKGZhbHNlKSwKLSAgICAgIG1GaW5hbGl6ZWQoZmFsc2UpLAotICAgICAgbUV4dHJhY3RlZENTRChmYWxzZSkgewotICAgIENIRUNLKGZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtTUlNRSkpOwotfQotCi12b2lkIFRTUGFja2V0aXplcjo6VHJhY2s6OmV4dHJhY3RDU0RJZk5lY2Vzc2FyeSgpIHsKLSAgICBpZiAobUV4dHJhY3RlZENTRCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCFzdHJjYXNlY21wKG1NSU1FLmNfc3RyKCksIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykKLSAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKG1NSU1FLmNfc3RyKCksIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7OyArK2kpIHsKLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IGNzZDsKLSAgICAgICAgICAgIGlmICghbUZvcm1hdC0+ZmluZEJ1ZmZlcihBU3RyaW5nUHJpbnRmKCJjc2QtJWQiLCBpKS5jX3N0cigpLCAmY3NkKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQ1NELnB1c2goY3NkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghc3RyY2FzZWNtcChtTUlNRS5jX3N0cigpLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKSB7Ci0gICAgICAgICAgICBpbnQzMl90IGlzQURUUzsKLSAgICAgICAgICAgIGlmICghbUZvcm1hdC0+ZmluZEludDMyKCJpcy1hZHRzIiwgJmlzQURUUykgfHwgaXNBRFRTID09IDApIHsKLSAgICAgICAgICAgICAgICBtQXVkaW9MYWNrc0FURFNIZWFkZXJzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIG1FeHRyYWN0ZWRDU0QgPSB0cnVlOwotfQotCi1UU1BhY2tldGl6ZXI6OlRyYWNrOjp+VHJhY2soKSB7Ci19Ci0KLXVuc2lnbmVkIFRTUGFja2V0aXplcjo6VHJhY2s6OlBJRCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVBJRDsKLX0KLQotdW5zaWduZWQgVFNQYWNrZXRpemVyOjpUcmFjazo6c3RyZWFtVHlwZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVN0cmVhbVR5cGU7Ci19Ci0KLXVuc2lnbmVkIFRTUGFja2V0aXplcjo6VHJhY2s6OnN0cmVhbUlEKCkgY29uc3QgewotICAgIHJldHVybiBtU3RyZWFtSUQ7Ci19Ci0KLXVuc2lnbmVkIFRTUGFja2V0aXplcjo6VHJhY2s6OmluY3JlbWVudENvbnRpbnVpdHlDb3VudGVyKCkgewotICAgIHVuc2lnbmVkIHByZXZDb3VudGVyID0gbUNvbnRpbnVpdHlDb3VudGVyOwotCi0gICAgaWYgKCsrbUNvbnRpbnVpdHlDb3VudGVyID09IDE2KSB7Ci0gICAgICAgIG1Db250aW51aXR5Q291bnRlciA9IDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIHByZXZDb3VudGVyOwotfQotCi1ib29sIFRTUGFja2V0aXplcjo6VHJhY2s6OmlzQXVkaW8oKSBjb25zdCB7Ci0gICAgcmV0dXJuICFzdHJuY2FzZWNtcCgiYXVkaW8vIiwgbU1JTUUuY19zdHIoKSwgNik7Ci19Ci0KLWJvb2wgVFNQYWNrZXRpemVyOjpUcmFjazo6aXNWaWRlbygpIGNvbnN0IHsKLSAgICByZXR1cm4gIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtTUlNRS5jX3N0cigpLCA2KTsKLX0KLQotYm9vbCBUU1BhY2tldGl6ZXI6OlRyYWNrOjppc0gyNjQoKSBjb25zdCB7Ci0gICAgcmV0dXJuICFzdHJjYXNlY21wKG1NSU1FLmNfc3RyKCksIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7Ci19Ci0KLWJvb2wgVFNQYWNrZXRpemVyOjpUcmFjazo6aXNBQUMoKSBjb25zdCB7Ci0gICAgcmV0dXJuICFzdHJjYXNlY21wKG1NSU1FLmNfc3RyKCksIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7Ci19Ci0KLWJvb2wgVFNQYWNrZXRpemVyOjpUcmFjazo6aXNQQ01BdWRpbygpIGNvbnN0IHsKLSAgICByZXR1cm4gIXN0cmNhc2VjbXAobU1JTUUuY19zdHIoKSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKLX0KLQotYm9vbCBUU1BhY2tldGl6ZXI6OlRyYWNrOjpsYWNrc0FEVFNIZWFkZXIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1BdWRpb0xhY2tzQVREU0hlYWRlcnM7Ci19Ci0KLXNwPEFCdWZmZXI+IFRTUGFja2V0aXplcjo6VHJhY2s6OnByZXBlbmRDU0QoCi0gICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KSBjb25zdCB7Ci0gICAgc2l6ZV90IHNpemUgPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNTRC5zaXplKCk7ICsraSkgewotICAgICAgICBzaXplICs9IG1DU0QuaXRlbUF0KGkpLT5zaXplKCk7Ci0gICAgfQotCi0gICAgc3A8QUJ1ZmZlcj4gZHVwID0gbmV3IEFCdWZmZXIoYWNjZXNzVW5pdC0+c2l6ZSgpICsgc2l6ZSk7Ci0gICAgc2l6ZV90IG9mZnNldCA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ1NELnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZjc2QgPSBtQ1NELml0ZW1BdChpKTsKLQotICAgICAgICBtZW1jcHkoZHVwLT5kYXRhKCkgKyBvZmZzZXQsIGNzZC0+ZGF0YSgpLCBjc2QtPnNpemUoKSk7Ci0gICAgICAgIG9mZnNldCArPSBjc2QtPnNpemUoKTsKLSAgICB9Ci0KLSAgICBtZW1jcHkoZHVwLT5kYXRhKCkgKyBvZmZzZXQsIGFjY2Vzc1VuaXQtPmRhdGEoKSwgYWNjZXNzVW5pdC0+c2l6ZSgpKTsKLQotICAgIHJldHVybiBkdXA7Ci19Ci0KLXNwPEFCdWZmZXI+IFRTUGFja2V0aXplcjo6VHJhY2s6OnByZXBlbmRBRFRTSGVhZGVyKAotICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCkgY29uc3QgewotICAgIENIRUNLX0VRKG1DU0Quc2l6ZSgpLCAxdSk7Ci0KLSAgICBjb25zdCB1aW50OF90ICpjb2RlY19zcGVjaWZpY19kYXRhID0gbUNTRC5pdGVtQXQoMCktPmRhdGEoKTsKLQotICAgIGNvbnN0IHVpbnQzMl90IGFhY19mcmFtZV9sZW5ndGggPSBhY2Nlc3NVbml0LT5zaXplKCkgKyA3OwotCi0gICAgc3A8QUJ1ZmZlcj4gZHVwID0gbmV3IEFCdWZmZXIoYWFjX2ZyYW1lX2xlbmd0aCk7Ci0KLSAgICB1bnNpZ25lZCBwcm9maWxlID0gKGNvZGVjX3NwZWNpZmljX2RhdGFbMF0gPj4gMykgLSAxOwotCi0gICAgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCA9Ci0gICAgICAgICgoY29kZWNfc3BlY2lmaWNfZGF0YVswXSAmIDcpIDw8IDEpCi0gICAgICAgIHwgKGNvZGVjX3NwZWNpZmljX2RhdGFbMV0gPj4gNyk7Ci0KLSAgICB1bnNpZ25lZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24gPQotICAgICAgICAoY29kZWNfc3BlY2lmaWNfZGF0YVsxXSA+PiAzKSAmIDB4MGY7Ci0KLSAgICB1aW50OF90ICpwdHIgPSBkdXAtPmRhdGEoKTsKLQotICAgICpwdHIrKyA9IDB4ZmY7Ci0gICAgKnB0cisrID0gMHhmOTsgIC8vIGIxMTExMTAwMSwgSUQ9MShNUEVHLTIpLCBsYXllcj0wLCBwcm90ZWN0aW9uX2Fic2VudD0xCi0KLSAgICAqcHRyKysgPQotICAgICAgICBwcm9maWxlIDw8IDYKLSAgICAgICAgfCBzYW1wbGluZ19mcmVxX2luZGV4IDw8IDIKLSAgICAgICAgfCAoKGNoYW5uZWxfY29uZmlndXJhdGlvbiA+PiAyKSAmIDEpOyAgLy8gcHJpdmF0ZV9iaXQ9MAotCi0gICAgLy8gb3JpZ2luYWxfY29weT0wLCBob21lPTAsIGNvcHlyaWdodF9pZF9iaXQ9MCwgY29weXJpZ2h0X2lkX3N0YXJ0PTAKLSAgICAqcHRyKysgPQotICAgICAgICAoY2hhbm5lbF9jb25maWd1cmF0aW9uICYgMykgPDwgNgotICAgICAgICB8IGFhY19mcmFtZV9sZW5ndGggPj4gMTE7Ci0gICAgKnB0cisrID0gKGFhY19mcmFtZV9sZW5ndGggPj4gMykgJiAweGZmOwotICAgICpwdHIrKyA9IChhYWNfZnJhbWVfbGVuZ3RoICYgNykgPDwgNTsKLQotICAgIC8vIGFkdHNfYnVmZmVyX2Z1bGxuZXNzPTAsIG51bWJlcl9vZl9yYXdfZGF0YV9ibG9ja3NfaW5fZnJhbWU9MAotICAgICpwdHIrKyA9IDA7Ci0KLSAgICBtZW1jcHkocHRyLCBhY2Nlc3NVbml0LT5kYXRhKCksIGFjY2Vzc1VuaXQtPnNpemUoKSk7Ci0KLSAgICByZXR1cm4gZHVwOwotfQotCi1zaXplX3QgVFNQYWNrZXRpemVyOjpUcmFjazo6Y291bnREZXNjcmlwdG9ycygpIGNvbnN0IHsKLSAgICByZXR1cm4gbURlc2NyaXB0b3JzLnNpemUoKTsKLX0KLQotc3A8QUJ1ZmZlcj4gVFNQYWNrZXRpemVyOjpUcmFjazo6ZGVzY3JpcHRvckF0KHNpemVfdCBpbmRleCkgY29uc3QgewotICAgIENIRUNLX0xUKGluZGV4LCBtRGVzY3JpcHRvcnMuc2l6ZSgpKTsKLSAgICByZXR1cm4gbURlc2NyaXB0b3JzLml0ZW1BdChpbmRleCk7Ci19Ci0KLXZvaWQgVFNQYWNrZXRpemVyOjpUcmFjazo6ZmluYWxpemUoKSB7Ci0gICAgaWYgKG1GaW5hbGl6ZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChpc0gyNjQoKSkgewotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBVkMgdmlkZW8gZGVzY3JpcHRvciAoNDApCi0KLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IGRlc2NyaXB0b3IgPSBuZXcgQUJ1ZmZlcig2KTsKLSAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBkZXNjcmlwdG9yLT5kYXRhKCk7Ci0gICAgICAgICAgICBkYXRhWzBdID0gNDA7ICAvLyBkZXNjcmlwdG9yX3RhZwotICAgICAgICAgICAgZGF0YVsxXSA9IDQ7ICAvLyBkZXNjcmlwdG9yX2xlbmd0aAotCi0gICAgICAgICAgICBpZiAobUNTRC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfR0UobUNTRC5zaXplKCksIDF1KTsKLSAgICAgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmc3BzID0gbUNTRC5pdGVtQXQoMCk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soIW1lbWNtcCgiXHgwMFx4MDBceDAwXHgwMSIsIHNwcy0+ZGF0YSgpLCA0KSk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfR0Uoc3BzLT5zaXplKCksIDd1KTsKLSAgICAgICAgICAgICAgICAvLyBwcm9maWxlX2lkYywgY29uc3RyYWludF9zZXQqLCBsZXZlbF9pZGMKLSAgICAgICAgICAgICAgICBtZW1jcHkoJmRhdGFbMl0sIHNwcy0+ZGF0YSgpICsgNCwgMyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludDMyX3QgcHJvZmlsZUlkYywgbGV2ZWxJZGMsIGNvbnN0cmFpbnRTZXQ7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobUZvcm1hdC0+ZmluZEludDMyKCJwcm9maWxlLWlkYyIsICZwcm9maWxlSWRjKSk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobUZvcm1hdC0+ZmluZEludDMyKCJsZXZlbC1pZGMiLCAmbGV2ZWxJZGMpKTsKLSAgICAgICAgICAgICAgICBDSEVDSyhtRm9ybWF0LT5maW5kSW50MzIoImNvbnN0cmFpbnQtc2V0IiwgJmNvbnN0cmFpbnRTZXQpKTsKLSAgICAgICAgICAgICAgICBDSEVDS19HRShwcm9maWxlSWRjLCAwKTsKLSAgICAgICAgICAgICAgICBDSEVDS19HRShsZXZlbElkYywgMCk7Ci0gICAgICAgICAgICAgICAgZGF0YVsyXSA9IHByb2ZpbGVJZGM7ICAgIC8vIHByb2ZpbGVfaWRjCi0gICAgICAgICAgICAgICAgZGF0YVszXSA9IGNvbnN0cmFpbnRTZXQ7IC8vIGNvbnN0cmFpbnRfc2V0KgotICAgICAgICAgICAgICAgIGRhdGFbNF0gPSBsZXZlbElkYzsgICAgICAvLyBsZXZlbF9pZGMKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQVZDX3N0aWxsX3ByZXNlbnQ9MCwgQVZDXzI0X2hvdXJfcGljdHVyZV9mbGFnPTAsIHJlc2VydmVkCi0gICAgICAgICAgICBkYXRhWzVdID0gMHgzZjsKLQotICAgICAgICAgICAgbURlc2NyaXB0b3JzLnB1c2hfYmFjayhkZXNjcmlwdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFWQyB0aW1pbmcgYW5kIEhSRCBkZXNjcmlwdG9yICg0MikKLQotICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gZGVzY3JpcHRvciA9IG5ldyBBQnVmZmVyKDQpOwotICAgICAgICAgICAgdWludDhfdCAqZGF0YSA9IGRlc2NyaXB0b3ItPmRhdGEoKTsKLSAgICAgICAgICAgIGRhdGFbMF0gPSA0MjsgIC8vIGRlc2NyaXB0b3JfdGFnCi0gICAgICAgICAgICBkYXRhWzFdID0gMjsgIC8vIGRlc2NyaXB0b3JfbGVuZ3RoCi0KLSAgICAgICAgICAgIC8vIGhyZF9tYW5hZ2VtZW50X3ZhbGlkX2ZsYWcgPSAwCi0gICAgICAgICAgICAvLyByZXNlcnZlZCA9IDExMTExMWIKLSAgICAgICAgICAgIC8vIHBpY3R1cmVfYW5kX3RpbWluZ19pbmZvX3ByZXNlbnQgPSAwCi0KLSAgICAgICAgICAgIGRhdGFbMl0gPSAweDdlOwotCi0gICAgICAgICAgICAvLyBmaXhlZF9mcmFtZV9yYXRlX2ZsYWcgPSAwCi0gICAgICAgICAgICAvLyB0ZW1wb3JhbF9wb2NfZmxhZyA9IDAKLSAgICAgICAgICAgIC8vIHBpY3R1cmVfdG9fZGlzcGxheV9jb252ZXJzaW9uX2ZsYWcgPSAwCi0gICAgICAgICAgICAvLyByZXNlcnZlZCA9IDExMTExYgotICAgICAgICAgICAgZGF0YVszXSA9IDB4MWY7Ci0KLSAgICAgICAgICAgIG1EZXNjcmlwdG9ycy5wdXNoX2JhY2soZGVzY3JpcHRvcik7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGlzUENNQXVkaW8oKSkgewotICAgICAgICAvLyBMUENNIGF1ZGlvIHN0cmVhbSBkZXNjcmlwdG9yICgweDgzKQotCi0gICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50OwotICAgICAgICBDSEVDSyhtRm9ybWF0LT5maW5kSW50MzIoImNoYW5uZWwtY291bnQiLCAmY2hhbm5lbENvdW50KSk7Ci0gICAgICAgIENIRUNLX0VRKGNoYW5uZWxDb3VudCwgMik7Ci0KLSAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOwotICAgICAgICBDSEVDSyhtRm9ybWF0LT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKTsKLSAgICAgICAgQ0hFQ0soc2FtcGxlUmF0ZSA9PSA0NDEwMCB8fCBzYW1wbGVSYXRlID09IDQ4MDAwKTsKLQotICAgICAgICBzcDxBQnVmZmVyPiBkZXNjcmlwdG9yID0gbmV3IEFCdWZmZXIoNCk7Ci0gICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBkZXNjcmlwdG9yLT5kYXRhKCk7Ci0gICAgICAgIGRhdGFbMF0gPSAweDgzOyAgLy8gZGVzY3JpcHRvcl90YWcKLSAgICAgICAgZGF0YVsxXSA9IDI7ICAvLyBkZXNjcmlwdG9yX2xlbmd0aAotCi0gICAgICAgIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXF1ZW5jeSA9IChzYW1wbGVSYXRlID09IDQ0MTAwKSA/IDEgOiAyOwotCi0gICAgICAgIGRhdGFbMl0gPSAoc2FtcGxpbmdfZnJlcXVlbmN5IDw8IDUpCi0gICAgICAgICAgICAgICAgICAgIHwgKDMgLyogcmVzZXJ2ZWQgKi8gPDwgMSkKLSAgICAgICAgICAgICAgICAgICAgfCAwIC8qIGVtcGhhc2lzX2ZsYWcgKi87Ci0KLSAgICAgICAgZGF0YVszXSA9Ci0gICAgICAgICAgICAoMSAvKiBudW1iZXJfb2ZfY2hhbm5lbHMgPSBzdGVyZW8gKi8gPDwgNSkKLSAgICAgICAgICAgIHwgMHhmIC8qIHJlc2VydmVkICovOwotCi0gICAgICAgIG1EZXNjcmlwdG9ycy5wdXNoX2JhY2soZGVzY3JpcHRvcik7Ci0gICAgfQotCi0gICAgbUZpbmFsaXplZCA9IHRydWU7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLVRTUGFja2V0aXplcjo6VFNQYWNrZXRpemVyKHVpbnQzMl90IGZsYWdzKQotICAgIDogbUZsYWdzKGZsYWdzKSwKLSAgICAgIG1QQVRDb250aW51aXR5Q291bnRlcigwKSwKLSAgICAgIG1QTVRDb250aW51aXR5Q291bnRlcigwKSB7Ci0gICAgaW5pdENyY1RhYmxlKCk7Ci0KLSAgICBpZiAoZmxhZ3MgJiAoRU1JVF9IRENQMjBfREVTQ1JJUFRPUiB8IEVNSVRfSERDUDIxX0RFU0NSSVBUT1IpKSB7Ci0gICAgICAgIGludDMyX3QgaGRjcFZlcnNpb247Ci0gICAgICAgIGlmIChmbGFncyAmIEVNSVRfSERDUDIwX0RFU0NSSVBUT1IpIHsKLSAgICAgICAgICAgIENIRUNLKCEoZmxhZ3MgJiBFTUlUX0hEQ1AyMV9ERVNDUklQVE9SKSk7Ci0gICAgICAgICAgICBoZGNwVmVyc2lvbiA9IDB4MjA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDSEVDSyghKGZsYWdzICYgRU1JVF9IRENQMjBfREVTQ1JJUFRPUikpOwotCi0gICAgICAgICAgICAvLyBIRENQMi4wIF9hbmRfIEhEQ1AgMi4xIHNwZWNzIHNheSB0byBzZXQgdGhlIHZlcnNpb24KLSAgICAgICAgICAgIC8vIGluc2lkZSB0aGUgSERDUCBkZXNjcmlwdG9yIHRvIDB4MjAhISEKLSAgICAgICAgICAgIGhkY3BWZXJzaW9uID0gMHgyMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEhEQ1AgZGVzY3JpcHRvcgotICAgICAgICBzcDxBQnVmZmVyPiBkZXNjcmlwdG9yID0gbmV3IEFCdWZmZXIoNyk7Ci0gICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBkZXNjcmlwdG9yLT5kYXRhKCk7Ci0gICAgICAgIGRhdGFbMF0gPSAweDA1OyAgLy8gZGVzY3JpcHRvcl90YWcKLSAgICAgICAgZGF0YVsxXSA9IDU7ICAvLyBkZXNjcmlwdG9yX2xlbmd0aAotICAgICAgICBkYXRhWzJdID0gJ0gnOwotICAgICAgICBkYXRhWzNdID0gJ0QnOwotICAgICAgICBkYXRhWzRdID0gJ0MnOwotICAgICAgICBkYXRhWzVdID0gJ1AnOwotICAgICAgICBkYXRhWzZdID0gaGRjcFZlcnNpb247Ci0KLSAgICAgICAgbVByb2dyYW1JbmZvRGVzY3JpcHRvcnMucHVzaF9iYWNrKGRlc2NyaXB0b3IpOwotICAgIH0KLX0KLQotVFNQYWNrZXRpemVyOjp+VFNQYWNrZXRpemVyKCkgewotfQotCi1zc2l6ZV90IFRTUGFja2V0aXplcjo6YWRkVHJhY2soY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKLSAgICBBU3RyaW5nIG1pbWU7Ci0gICAgQ0hFQ0soZm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKLQotICAgIHVuc2lnbmVkIFBJRFN0YXJ0OwotICAgIGJvb2wgaXNWaWRlbyA9ICFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZS5jX3N0cigpLCA2KTsKLSAgICBib29sIGlzQXVkaW8gPSAhc3RybmNhc2VjbXAoImF1ZGlvLyIsIG1pbWUuY19zdHIoKSwgNik7Ci0KLSAgICBpZiAoaXNWaWRlbykgewotICAgICAgICBQSURTdGFydCA9IDB4MTAxMTsKLSAgICB9IGVsc2UgaWYgKGlzQXVkaW8pIHsKLSAgICAgICAgUElEU3RhcnQgPSAweDExMDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHVuc2lnbmVkIHN0cmVhbVR5cGU7Ci0gICAgdW5zaWduZWQgc3RyZWFtSURTdGFydDsKLSAgICB1bnNpZ25lZCBzdHJlYW1JRFN0b3A7Ci0KLSAgICBpZiAoIXN0cmNhc2VjbXAobWltZS5jX3N0cigpLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7Ci0gICAgICAgIHN0cmVhbVR5cGUgPSAweDFiOwotICAgICAgICBzdHJlYW1JRFN0YXJ0ID0gMHhlMDsKLSAgICAgICAgc3RyZWFtSURTdG9wID0gMHhlZjsKLSAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUuY19zdHIoKSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkgewotICAgICAgICBzdHJlYW1UeXBlID0gMHgwZjsKLSAgICAgICAgc3RyZWFtSURTdGFydCA9IDB4YzA7Ci0gICAgICAgIHN0cmVhbUlEU3RvcCA9IDB4ZGY7Ci0gICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLmNfc3RyKCksIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpIHsKLSAgICAgICAgc3RyZWFtVHlwZSA9IDB4ODM7Ci0gICAgICAgIHN0cmVhbUlEU3RhcnQgPSAweGJkOwotICAgICAgICBzdHJlYW1JRFN0b3AgPSAweGJkOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBzaXplX3QgbnVtVHJhY2tzT2ZUaGlzVHlwZSA9IDA7Ci0gICAgdW5zaWduZWQgUElEID0gUElEU3RhcnQ7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgY29uc3Qgc3A8VHJhY2s+ICZ0cmFjayA9IG1UcmFja3MuaXRlbUF0KGkpOwotCi0gICAgICAgIGlmICh0cmFjay0+c3RyZWFtVHlwZSgpID09IHN0cmVhbVR5cGUpIHsKLSAgICAgICAgICAgICsrbnVtVHJhY2tzT2ZUaGlzVHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoaXNBdWRpbyAmJiB0cmFjay0+aXNBdWRpbygpKSB8fCAoaXNWaWRlbyAmJiB0cmFjay0+aXNWaWRlbygpKSkgewotICAgICAgICAgICAgKytQSUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB1bnNpZ25lZCBzdHJlYW1JRCA9IHN0cmVhbUlEU3RhcnQgKyBudW1UcmFja3NPZlRoaXNUeXBlOwotICAgIGlmIChzdHJlYW1JRCA+IHN0cmVhbUlEU3RvcCkgewotICAgICAgICByZXR1cm4gLUVSQU5HRTsKLSAgICB9Ci0KLSAgICBzcDxUcmFjaz4gdHJhY2sgPSBuZXcgVHJhY2soZm9ybWF0LCBQSUQsIHN0cmVhbVR5cGUsIHN0cmVhbUlEKTsKLSAgICByZXR1cm4gbVRyYWNrcy5hZGQodHJhY2spOwotfQotCi1zdGF0dXNfdCBUU1BhY2tldGl6ZXI6OmV4dHJhY3RDU0RJZk5lY2Vzc2FyeShzaXplX3QgdHJhY2tJbmRleCkgewotICAgIGlmICh0cmFja0luZGV4ID49IG1UcmFja3Muc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiAtRVJBTkdFOwotICAgIH0KLQotICAgIGNvbnN0IHNwPFRyYWNrPiAmdHJhY2sgPSBtVHJhY2tzLml0ZW1BdCh0cmFja0luZGV4KTsKLSAgICB0cmFjay0+ZXh0cmFjdENTRElmTmVjZXNzYXJ5KCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFRTUGFja2V0aXplcjo6cGFja2V0aXplKAotICAgICAgICBzaXplX3QgdHJhY2tJbmRleCwKLSAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJl9hY2Nlc3NVbml0LAotICAgICAgICBzcDxBQnVmZmVyPiAqcGFja2V0cywKLSAgICAgICAgdWludDMyX3QgZmxhZ3MsCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKlBFU19wcml2YXRlX2RhdGEsIHNpemVfdCBQRVNfcHJpdmF0ZV9kYXRhX2xlbiwKLSAgICAgICAgc2l6ZV90IG51bVN0dWZmaW5nQnl0ZXMpIHsKLSAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gX2FjY2Vzc1VuaXQ7Ci0KLSAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwotCi0gICAgcGFja2V0cy0+Y2xlYXIoKTsKLQotICAgIGlmICh0cmFja0luZGV4ID49IG1UcmFja3Muc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiAtRVJBTkdFOwotICAgIH0KLQotICAgIGNvbnN0IHNwPFRyYWNrPiAmdHJhY2sgPSBtVHJhY2tzLml0ZW1BdCh0cmFja0luZGV4KTsKLQotICAgIGlmICh0cmFjay0+aXNIMjY0KCkgJiYgKGZsYWdzICYgUFJFUEVORF9TUFNfUFBTX1RPX0lEUl9GUkFNRVMpCi0gICAgICAgICAgICAmJiBJc0lEUihhY2Nlc3NVbml0KSkgewotICAgICAgICAvLyBwcmVwZW5kIGNvZGVjIHNwZWNpZmljIGRhdGEsIGkuZS4gU1BTIGFuZCBQUFMuCi0gICAgICAgIGFjY2Vzc1VuaXQgPSB0cmFjay0+cHJlcGVuZENTRChhY2Nlc3NVbml0KTsKLSAgICB9IGVsc2UgaWYgKHRyYWNrLT5pc0FBQygpICYmIHRyYWNrLT5sYWNrc0FEVFNIZWFkZXIoKSkgewotICAgICAgICBDSEVDSyghKGZsYWdzICYgSVNfRU5DUllQVEVEKSk7Ci0gICAgICAgIGFjY2Vzc1VuaXQgPSB0cmFjay0+cHJlcGVuZEFEVFNIZWFkZXIoYWNjZXNzVW5pdCk7Ci0gICAgfQotCi0gICAgLy8gMHg0NwotICAgIC8vIHRyYW5zcG9ydF9lcnJvcl9pbmRpY2F0b3IgPSBiMAotICAgIC8vIHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IgPSBiMQotICAgIC8vIHRyYW5zcG9ydF9wcmlvcml0eSA9IGIwCi0gICAgLy8gUElECi0gICAgLy8gdHJhbnNwb3J0X3NjcmFtYmxpbmdfY29udHJvbCA9IGIwMAotICAgIC8vIGFkYXB0YXRpb25fZmllbGRfY29udHJvbCA9IGI/PwotICAgIC8vIGNvbnRpbnVpdHlfY291bnRlciA9IGI/Pz8/Ci0gICAgLy8gLS0gcGF5bG9hZCBmb2xsb3dzCi0gICAgLy8gcGFja2V0X3N0YXJ0Y29kZV9wcmVmaXggPSAweDAwMDAwMQotICAgIC8vIHN0cmVhbV9pZAotICAgIC8vIFBFU19wYWNrZXRfbGVuZ3RoID0gMHg/Pz8/Ci0gICAgLy8gcmVzZXJ2ZWQgPSBiMTAKLSAgICAvLyBQRVNfc2NyYW1ibGluZ19jb250cm9sID0gYjAwCi0gICAgLy8gUEVTX3ByaW9yaXR5ID0gYjAKLSAgICAvLyBkYXRhX2FsaWdubWVudF9pbmRpY2F0b3IgPSBiMQotICAgIC8vIGNvcHlyaWdodCA9IGIwCi0gICAgLy8gb3JpZ2luYWxfb3JfY29weSA9IGIwCi0gICAgLy8gUFRTX0RUU19mbGFncyA9IGIxMCAgKFBUUyBvbmx5KQotICAgIC8vIEVTQ1JfZmxhZyA9IGIwCi0gICAgLy8gRVNfcmF0ZV9mbGFnID0gYjAKLSAgICAvLyBEU01fdHJpY2tfbW9kZV9mbGFnID0gYjAKLSAgICAvLyBhZGRpdGlvbmFsX2NvcHlfaW5mb19mbGFnID0gYjAKLSAgICAvLyBQRVNfQ1JDX2ZsYWcgPSBiMAotICAgIC8vIFBFU19leHRlbnNpb25fZmxhZyA9IGIwCi0gICAgLy8gUEVTX2hlYWRlcl9kYXRhX2xlbmd0aCA9IDB4MDUKLSAgICAvLyByZXNlcnZlZCA9IGIwMDEwIChQVFMpCi0gICAgLy8gUFRTWzMyLi4zMF0gPSBiPz8/Ci0gICAgLy8gcmVzZXJ2ZWQgPSBiMQotICAgIC8vIFBUU1syOS4uMTVdID0gYj8/PyA/Pz8/ID8/Pz8gPz8/PyAoMTUgYml0cykKLSAgICAvLyByZXNlcnZlZCA9IGIxCi0gICAgLy8gUFRTWzE0Li4wXSA9IGI/Pz8gPz8/PyA/Pz8/ID8/Pz8gKDE1IGJpdHMpCi0gICAgLy8gcmVzZXJ2ZWQgPSBiMQotICAgIC8vIHRoZSBmaXJzdCBmcmFnbWVudCBvZiAiYnVmZmVyIiBmb2xsb3dzCi0KLSAgICAvLyBFYWNoIHRyYW5zcG9ydCBwYWNrZXQgKGV4Y2VwdCBmb3IgdGhlIGxhc3Qgb25lIGNvbnRyaWJ1dGluZyB0byB0aGUgUEVTCi0gICAgLy8gcGF5bG9hZCkgbXVzdCBjb250YWluIGEgbXVsdGlwbGUgb2YgMTYgYnl0ZXMgb2YgcGF5bG9hZCBwZXIgSERDUCBzcGVjLgotICAgIGJvb2wgYWxpZ25QYXlsb2FkID0KLSAgICAgICAgKG1GbGFncyAmIChFTUlUX0hEQ1AyMF9ERVNDUklQVE9SIHwgRU1JVF9IRENQMjFfREVTQ1JJUFRPUikpOwotCi0gICAgLyoKLSAgICAgICBhKSBUaGUgdmVyeSBmaXJzdCBQRVMgdHJhbnNwb3J0IHN0cmVhbSBwYWNrZXQgY29udGFpbnMKLQotICAgICAgIDQgYnl0ZXMgb2YgVFMgaGVhZGVyCi0gICAgICAgLi4uIHBhZGRpbmcKLSAgICAgICAxNCBieXRlcyBvZiBzdGF0aWMgUEVTIGhlYWRlcgotICAgICAgIFBFU19wcml2YXRlX2RhdGFfbGVuICsgMSBieXRlcyAob25seSBpZiBQRVNfcHJpdmF0ZV9kYXRhX2xlbiA+IDApCi0gICAgICAgbnVtU3R1ZmZpbmdCeXRlcyBieXRlcwotCi0gICAgICAgZm9sbG93ZWQgYnkgdGhlIHBheWxvYWQKLQotICAgICAgIGIpIFN1YnNlcXVlbnQgUEVTIHRyYW5zcG9ydCBzdHJlYW0gcGFja2V0cyBjb250YWluCi0KLSAgICAgICA0IGJ5dGVzIG9mIFRTIGhlYWRlcgotICAgICAgIC4uLiBwYWRkaW5nCi0KLSAgICAgICBmb2xsb3dlZCBieSB0aGUgcGF5bG9hZAotICAgICovCi0KLSAgICBzaXplX3QgUEVTX3BhY2tldF9sZW5ndGggPSBhY2Nlc3NVbml0LT5zaXplKCkgKyA4ICsgbnVtU3R1ZmZpbmdCeXRlczsKLSAgICBpZiAoUEVTX3ByaXZhdGVfZGF0YV9sZW4gPiAwKSB7Ci0gICAgICAgIFBFU19wYWNrZXRfbGVuZ3RoICs9IFBFU19wcml2YXRlX2RhdGFfbGVuICsgMTsKLSAgICB9Ci0KLSAgICBzaXplX3QgbnVtVFNQYWNrZXRzID0gMTsKLQotICAgIHsKLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBQRVMgaGVhZGVyIGZpdHMgaW50byBhIHNpbmdsZSBUUyBwYWNrZXQ6Ci0gICAgICAgIHNpemVfdCBQRVNfaGVhZGVyX3NpemUgPSAxNCArIG51bVN0dWZmaW5nQnl0ZXM7Ci0gICAgICAgIGlmIChQRVNfcHJpdmF0ZV9kYXRhX2xlbiA+IDApIHsKLSAgICAgICAgICAgIFBFU19oZWFkZXJfc2l6ZSArPSBQRVNfcHJpdmF0ZV9kYXRhX2xlbiArIDE7Ci0gICAgICAgIH0KLQotICAgICAgICBDSEVDS19MRShQRVNfaGVhZGVyX3NpemUsIDE4OHUgLSA0dSk7Ci0KLSAgICAgICAgc2l6ZV90IHNpemVBdmFpbGFibGVGb3JQYXlsb2FkID0gMTg4IC0gNCAtIFBFU19oZWFkZXJfc2l6ZTsKLSAgICAgICAgc2l6ZV90IG51bUJ5dGVzT2ZQYXlsb2FkID0gYWNjZXNzVW5pdC0+c2l6ZSgpOwotCi0gICAgICAgIGlmIChudW1CeXRlc09mUGF5bG9hZCA+IHNpemVBdmFpbGFibGVGb3JQYXlsb2FkKSB7Ci0gICAgICAgICAgICBudW1CeXRlc09mUGF5bG9hZCA9IHNpemVBdmFpbGFibGVGb3JQYXlsb2FkOwotCi0gICAgICAgICAgICBpZiAoYWxpZ25QYXlsb2FkICYmIG51bUJ5dGVzT2ZQYXlsb2FkID4gMTYpIHsKLSAgICAgICAgICAgICAgICBudW1CeXRlc09mUGF5bG9hZCAtPSAobnVtQnl0ZXNPZlBheWxvYWQgJSAxNik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgbnVtUGFkZGluZ0J5dGVzID0gc2l6ZUF2YWlsYWJsZUZvclBheWxvYWQgLSBudW1CeXRlc09mUGF5bG9hZDsKLSAgICAgICAgQUxPR1YoInBhY2tldCAxIGNvbnRhaW5zICV6ZCBwYWRkaW5nIGJ5dGVzIGFuZCAlemQgYnl0ZXMgb2YgcGF5bG9hZCIsCi0gICAgICAgICAgICAgIG51bVBhZGRpbmdCeXRlcywgbnVtQnl0ZXNPZlBheWxvYWQpOwotCi0gICAgICAgIHNpemVfdCBudW1CeXRlc09mUGF5bG9hZFJlbWFpbmluZyA9IGFjY2Vzc1VuaXQtPnNpemUoKSAtIG51bUJ5dGVzT2ZQYXlsb2FkOwotCi0jaWYgMAotICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGhvcGVmdWxseSBpbGx1c3RyYXRlcyB0aGUgbG9naWMgdGhhdCBsZWQgdG8gdGhlCi0gICAgICAgIC8vIG1vcmUgZWZmaWNpZW50IGNvbXB1dGF0aW9uIGluIHRoZSAjZWxzZSBibG9jay4uLgotCi0gICAgICAgIHdoaWxlIChudW1CeXRlc09mUGF5bG9hZFJlbWFpbmluZyA+IDApIHsKLSAgICAgICAgICAgIHNpemVfdCBzaXplQXZhaWxhYmxlRm9yUGF5bG9hZCA9IDE4OCAtIDQ7Ci0KLSAgICAgICAgICAgIHNpemVfdCBudW1CeXRlc09mUGF5bG9hZCA9IG51bUJ5dGVzT2ZQYXlsb2FkUmVtYWluaW5nOwotCi0gICAgICAgICAgICBpZiAobnVtQnl0ZXNPZlBheWxvYWQgPiBzaXplQXZhaWxhYmxlRm9yUGF5bG9hZCkgewotICAgICAgICAgICAgICAgIG51bUJ5dGVzT2ZQYXlsb2FkID0gc2l6ZUF2YWlsYWJsZUZvclBheWxvYWQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYWxpZ25QYXlsb2FkICYmIG51bUJ5dGVzT2ZQYXlsb2FkID4gMTYpIHsKLSAgICAgICAgICAgICAgICAgICAgbnVtQnl0ZXNPZlBheWxvYWQgLT0gKG51bUJ5dGVzT2ZQYXlsb2FkICUgMTYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2l6ZV90IG51bVBhZGRpbmdCeXRlcyA9IHNpemVBdmFpbGFibGVGb3JQYXlsb2FkIC0gbnVtQnl0ZXNPZlBheWxvYWQ7Ci0gICAgICAgICAgICBBTE9HSSgicGFja2V0ICV6ZCBjb250YWlucyAlemQgcGFkZGluZyBieXRlcyBhbmQgJXpkIGJ5dGVzIG9mIHBheWxvYWQiLAotICAgICAgICAgICAgICAgICAgICBudW1UU1BhY2tldHMgKyAxLCBudW1QYWRkaW5nQnl0ZXMsIG51bUJ5dGVzT2ZQYXlsb2FkKTsKLQotICAgICAgICAgICAgbnVtQnl0ZXNPZlBheWxvYWRSZW1haW5pbmcgLT0gbnVtQnl0ZXNPZlBheWxvYWQ7Ci0gICAgICAgICAgICArK251bVRTUGFja2V0czsKLSAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgLy8gVGhpcyBpcyBob3cgbWFueSBieXRlcyBvZiBwYXlsb2FkIGVhY2ggc3Vic2VxdWVudCBUUyBwYWNrZXQKLSAgICAgICAgLy8gY2FuIGNvbnRhaW4gYXQgbW9zdC4KLSAgICAgICAgc2l6ZUF2YWlsYWJsZUZvclBheWxvYWQgPSAxODggLSA0OwotICAgICAgICBzaXplX3Qgc2l6ZUF2YWlsYWJsZUZvckFsaWduZWRQYXlsb2FkID0gc2l6ZUF2YWlsYWJsZUZvclBheWxvYWQ7Ci0gICAgICAgIGlmIChhbGlnblBheWxvYWQpIHsKLSAgICAgICAgICAgIC8vIFdlJ3JlIG9ubHkgZ29pbmcgdG8gdXNlIGEgc3Vic2V0IG9mIHRoZSBhdmFpbGFibGUgc3BhY2UKLSAgICAgICAgICAgIC8vIHNpbmNlIHdlIG5lZWQgdG8gbWFrZSBlYWNoIGZyYWdtZW50IGEgbXVsdGlwbGUgb2YgMTYgaW4gc2l6ZS4KLSAgICAgICAgICAgIHNpemVBdmFpbGFibGVGb3JBbGlnbmVkUGF5bG9hZCAtPQotICAgICAgICAgICAgICAgIChzaXplQXZhaWxhYmxlRm9yQWxpZ25lZFBheWxvYWQgJSAxNik7Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgbnVtRnVsbFRTUGFja2V0cyA9Ci0gICAgICAgICAgICBudW1CeXRlc09mUGF5bG9hZFJlbWFpbmluZyAvIHNpemVBdmFpbGFibGVGb3JBbGlnbmVkUGF5bG9hZDsKLQotICAgICAgICBudW1UU1BhY2tldHMgKz0gbnVtRnVsbFRTUGFja2V0czsKLQotICAgICAgICBudW1CeXRlc09mUGF5bG9hZFJlbWFpbmluZyAtPQotICAgICAgICAgICAgbnVtRnVsbFRTUGFja2V0cyAqIHNpemVBdmFpbGFibGVGb3JBbGlnbmVkUGF5bG9hZDsKLQotICAgICAgICAvLyBudW1CeXRlc09mUGF5bG9hZFJlbWFpbmluZyA8IHNpemVBdmFpbGFibGVGb3JBbGlnbmVkUGF5bG9hZAotICAgICAgICBpZiAobnVtRnVsbFRTUGFja2V0cyA9PSAwICYmIG51bUJ5dGVzT2ZQYXlsb2FkUmVtYWluaW5nID4gMCkgewotICAgICAgICAgICAgLy8gVGhlcmUgd2Fzbid0IGVub3VnaCBwYXlsb2FkIGxlZnQgdG8gZm9ybSBhIGZ1bGwgYWxpZ25lZCBwYXlsb2FkLAotICAgICAgICAgICAgLy8gdGhlIGxhc3QgcGFja2V0IGRvZXNuJ3QgaGF2ZSB0byBiZSBhbGlnbmVkLgotICAgICAgICAgICAgKytudW1UU1BhY2tldHM7Ci0gICAgICAgIH0gZWxzZSBpZiAobnVtRnVsbFRTUGFja2V0cyA+IDAKLSAgICAgICAgICAgICAgICAmJiBudW1CeXRlc09mUGF5bG9hZFJlbWFpbmluZwotICAgICAgICAgICAgICAgICAgICArIHNpemVBdmFpbGFibGVGb3JBbGlnbmVkUGF5bG9hZCA+IHNpemVBdmFpbGFibGVGb3JQYXlsb2FkKSB7Ci0gICAgICAgICAgICAvLyBUaGUgbGFzdCBwYWNrZXQgZW1pdHRlZCBoYWQgYSBmdWxsIGFsaWduZWQgcGF5bG9hZCBhbmQgdG9nZXRoZXIKLSAgICAgICAgICAgIC8vIHdpdGggdGhlIGJ5dGVzIHJlbWFpbmluZyBkb2VzIGV4Y2VlZCB0aGUgdW5hbGlnbmVkIHBheWxvYWQKLSAgICAgICAgICAgIC8vIHNpemUsIHNvIHdlIG5lZWQgYW5vdGhlciBwYWNrZXQuCi0gICAgICAgICAgICArK251bVRTUGFja2V0czsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgfQotCi0gICAgaWYgKGZsYWdzICYgRU1JVF9QQVRfQU5EX1BNVCkgewotICAgICAgICBudW1UU1BhY2tldHMgKz0gMjsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBFTUlUX1BDUikgewotICAgICAgICArK251bVRTUGFja2V0czsKLSAgICB9Ci0KLSAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihudW1UU1BhY2tldHMgKiAxODgpOwotICAgIHVpbnQ4X3QgKnBhY2tldERhdGFTdGFydCA9IGJ1ZmZlci0+ZGF0YSgpOwotCi0gICAgaWYgKGZsYWdzICYgRU1JVF9QQVRfQU5EX1BNVCkgewotICAgICAgICAvLyBQcm9ncmFtIEFzc29jaWF0aW9uIFRhYmxlIChQQVQpOgotICAgICAgICAvLyAweDQ3Ci0gICAgICAgIC8vIHRyYW5zcG9ydF9lcnJvcl9pbmRpY2F0b3IgPSBiMAotICAgICAgICAvLyBwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yID0gYjEKLSAgICAgICAgLy8gdHJhbnNwb3J0X3ByaW9yaXR5ID0gYjAKLSAgICAgICAgLy8gUElEID0gYjAwMDAwMDAwMDAwMDAgKDEzIGJpdHMpCi0gICAgICAgIC8vIHRyYW5zcG9ydF9zY3JhbWJsaW5nX2NvbnRyb2wgPSBiMDAKLSAgICAgICAgLy8gYWRhcHRhdGlvbl9maWVsZF9jb250cm9sID0gYjAxIChubyBhZGFwdGF0aW9uIGZpZWxkLCBwYXlsb2FkIG9ubHkpCi0gICAgICAgIC8vIGNvbnRpbnVpdHlfY291bnRlciA9IGI/Pz8/Ci0gICAgICAgIC8vIHNraXAgPSAweDAwCi0gICAgICAgIC8vIC0tLSBwYXlsb2FkIGZvbGxvd3MKLSAgICAgICAgLy8gdGFibGVfaWQgPSAweDAwCi0gICAgICAgIC8vIHNlY3Rpb25fc3ludGF4X2luZGljYXRvciA9IGIxCi0gICAgICAgIC8vIG11c3RfYmVfemVybyA9IGIwCi0gICAgICAgIC8vIHJlc2VydmVkID0gYjExCi0gICAgICAgIC8vIHNlY3Rpb25fbGVuZ3RoID0gMHgwMGQKLSAgICAgICAgLy8gdHJhbnNwb3J0X3N0cmVhbV9pZCA9IDB4MDAwMAotICAgICAgICAvLyByZXNlcnZlZCA9IGIxMQotICAgICAgICAvLyB2ZXJzaW9uX251bWJlciA9IGIwMDAwMQotICAgICAgICAvLyBjdXJyZW50X25leHRfaW5kaWNhdG9yID0gYjEKLSAgICAgICAgLy8gc2VjdGlvbl9udW1iZXIgPSAweDAwCi0gICAgICAgIC8vIGxhc3Rfc2VjdGlvbl9udW1iZXIgPSAweDAwCi0gICAgICAgIC8vICAgb25lIHByb2dyYW0gZm9sbG93czoKLSAgICAgICAgLy8gICBwcm9ncmFtX251bWJlciA9IDB4MDAwMQotICAgICAgICAvLyAgIHJlc2VydmVkID0gYjExMQotICAgICAgICAvLyAgIHByb2dyYW1fbWFwX1BJRCA9IGtQSURfUE1UICgxMyBiaXRzISkKLSAgICAgICAgLy8gQ1JDID0gMHg/Pz8/Pz8/PwotCi0gICAgICAgIGlmICgrK21QQVRDb250aW51aXR5Q291bnRlciA9PSAxNikgewotICAgICAgICAgICAgbVBBVENvbnRpbnVpdHlDb3VudGVyID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHVpbnQ4X3QgKnB0ciA9IHBhY2tldERhdGFTdGFydDsKLSAgICAgICAgKnB0cisrID0gMHg0NzsKLSAgICAgICAgKnB0cisrID0gMHg0MDsKLSAgICAgICAgKnB0cisrID0gMHgwMDsKLSAgICAgICAgKnB0cisrID0gMHgxMCB8IG1QQVRDb250aW51aXR5Q291bnRlcjsKLSAgICAgICAgKnB0cisrID0gMHgwMDsKLQotICAgICAgICB1aW50OF90ICpjcmNEYXRhU3RhcnQgPSBwdHI7Ci0gICAgICAgICpwdHIrKyA9IDB4MDA7Ci0gICAgICAgICpwdHIrKyA9IDB4YjA7Ci0gICAgICAgICpwdHIrKyA9IDB4MGQ7Ci0gICAgICAgICpwdHIrKyA9IDB4MDA7Ci0gICAgICAgICpwdHIrKyA9IDB4MDA7Ci0gICAgICAgICpwdHIrKyA9IDB4YzM7Ci0gICAgICAgICpwdHIrKyA9IDB4MDA7Ci0gICAgICAgICpwdHIrKyA9IDB4MDA7Ci0gICAgICAgICpwdHIrKyA9IDB4MDA7Ci0gICAgICAgICpwdHIrKyA9IDB4MDE7Ci0gICAgICAgICpwdHIrKyA9IDB4ZTAgfCAoa1BJRF9QTVQgPj4gOCk7Ci0gICAgICAgICpwdHIrKyA9IGtQSURfUE1UICYgMHhmZjsKLQotICAgICAgICBDSEVDS19FUShwdHIgLSBjcmNEYXRhU3RhcnQsIDEyKTsKLSAgICAgICAgdWludDMyX3QgY3JjID0gaHRvbmwoY3JjMzIoY3JjRGF0YVN0YXJ0LCBwdHIgLSBjcmNEYXRhU3RhcnQpKTsKLSAgICAgICAgbWVtY3B5KHB0ciwgJmNyYywgNCk7Ci0gICAgICAgIHB0ciArPSA0OwotCi0gICAgICAgIHNpemVfdCBzaXplTGVmdCA9IHBhY2tldERhdGFTdGFydCArIDE4OCAtIHB0cjsKLSAgICAgICAgbWVtc2V0KHB0ciwgMHhmZiwgc2l6ZUxlZnQpOwotCi0gICAgICAgIHBhY2tldERhdGFTdGFydCArPSAxODg7Ci0KLSAgICAgICAgLy8gUHJvZ3JhbSBNYXAgKFBNVCk6Ci0gICAgICAgIC8vIDB4NDcKLSAgICAgICAgLy8gdHJhbnNwb3J0X2Vycm9yX2luZGljYXRvciA9IGIwCi0gICAgICAgIC8vIHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IgPSBiMQotICAgICAgICAvLyB0cmFuc3BvcnRfcHJpb3JpdHkgPSBiMAotICAgICAgICAvLyBQSUQgPSBrUElEX1BNVCAoMTMgYml0cykKLSAgICAgICAgLy8gdHJhbnNwb3J0X3NjcmFtYmxpbmdfY29udHJvbCA9IGIwMAotICAgICAgICAvLyBhZGFwdGF0aW9uX2ZpZWxkX2NvbnRyb2wgPSBiMDEgKG5vIGFkYXB0YXRpb24gZmllbGQsIHBheWxvYWQgb25seSkKLSAgICAgICAgLy8gY29udGludWl0eV9jb3VudGVyID0gYj8/Pz8KLSAgICAgICAgLy8gc2tpcCA9IDB4MDAKLSAgICAgICAgLy8gLS0gcGF5bG9hZCBmb2xsb3dzCi0gICAgICAgIC8vIHRhYmxlX2lkID0gMHgwMgotICAgICAgICAvLyBzZWN0aW9uX3N5bnRheF9pbmRpY2F0b3IgPSBiMQotICAgICAgICAvLyBtdXN0X2JlX3plcm8gPSBiMAotICAgICAgICAvLyByZXNlcnZlZCA9IGIxMQotICAgICAgICAvLyBzZWN0aW9uX2xlbmd0aCA9IDB4Pz8/Ci0gICAgICAgIC8vIHByb2dyYW1fbnVtYmVyID0gMHgwMDAxCi0gICAgICAgIC8vIHJlc2VydmVkID0gYjExCi0gICAgICAgIC8vIHZlcnNpb25fbnVtYmVyID0gYjAwMDAxCi0gICAgICAgIC8vIGN1cnJlbnRfbmV4dF9pbmRpY2F0b3IgPSBiMQotICAgICAgICAvLyBzZWN0aW9uX251bWJlciA9IDB4MDAKLSAgICAgICAgLy8gbGFzdF9zZWN0aW9uX251bWJlciA9IDB4MDAKLSAgICAgICAgLy8gcmVzZXJ2ZWQgPSBiMTExCi0gICAgICAgIC8vIFBDUl9QSUQgPSBrUENSX1BJRCAoMTMgYml0cykKLSAgICAgICAgLy8gcmVzZXJ2ZWQgPSBiMTExMQotICAgICAgICAvLyBwcm9ncmFtX2luZm9fbGVuZ3RoID0gMHg/Pz8KLSAgICAgICAgLy8gICBwcm9ncmFtX2luZm9fZGVzY3JpcHRvcnMgZm9sbG93Ci0gICAgICAgIC8vIG9uZSBvciBtb3JlIGVsZW1lbnRhcnkgc3RyZWFtIGRlc2NyaXB0aW9ucyBmb2xsb3c6Ci0gICAgICAgIC8vICAgc3RyZWFtX3R5cGUgPSAweD8/Ci0gICAgICAgIC8vICAgcmVzZXJ2ZWQgPSBiMTExCi0gICAgICAgIC8vICAgZWxlbWVudGFyeV9QSUQgPSBiPyA/Pz8/ID8/Pz8gPz8/PyAoMTMgYml0cykKLSAgICAgICAgLy8gICByZXNlcnZlZCA9IGIxMTExCi0gICAgICAgIC8vICAgRVNfaW5mb19sZW5ndGggPSAweDAwMAotICAgICAgICAvLyBDUkMgPSAweD8/Pz8/Pz8/Ci0KLSAgICAgICAgaWYgKCsrbVBNVENvbnRpbnVpdHlDb3VudGVyID09IDE2KSB7Ci0gICAgICAgICAgICBtUE1UQ29udGludWl0eUNvdW50ZXIgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHRyID0gcGFja2V0RGF0YVN0YXJ0OwotICAgICAgICAqcHRyKysgPSAweDQ3OwotICAgICAgICAqcHRyKysgPSAweDQwIHwgKGtQSURfUE1UID4+IDgpOwotICAgICAgICAqcHRyKysgPSBrUElEX1BNVCAmIDB4ZmY7Ci0gICAgICAgICpwdHIrKyA9IDB4MTAgfCBtUE1UQ29udGludWl0eUNvdW50ZXI7Ci0gICAgICAgICpwdHIrKyA9IDB4MDA7Ci0KLSAgICAgICAgY3JjRGF0YVN0YXJ0ID0gcHRyOwotICAgICAgICAqcHRyKysgPSAweDAyOwotCi0gICAgICAgICpwdHIrKyA9IDB4MDA7ICAvLyBzZWN0aW9uX2xlbmd0aCB0byBiZSBmaWxsZWQgaW4gYmVsb3cuCi0gICAgICAgICpwdHIrKyA9IDB4MDA7Ci0KLSAgICAgICAgKnB0cisrID0gMHgwMDsKLSAgICAgICAgKnB0cisrID0gMHgwMTsKLSAgICAgICAgKnB0cisrID0gMHhjMzsKLSAgICAgICAgKnB0cisrID0gMHgwMDsKLSAgICAgICAgKnB0cisrID0gMHgwMDsKLSAgICAgICAgKnB0cisrID0gMHhlMCB8IChrUElEX1BDUiA+PiA4KTsKLSAgICAgICAgKnB0cisrID0ga1BJRF9QQ1IgJiAweGZmOwotCi0gICAgICAgIHNpemVfdCBwcm9ncmFtX2luZm9fbGVuZ3RoID0gMDsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUHJvZ3JhbUluZm9EZXNjcmlwdG9ycy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgcHJvZ3JhbV9pbmZvX2xlbmd0aCArPSBtUHJvZ3JhbUluZm9EZXNjcmlwdG9ycy5pdGVtQXQoaSktPnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIENIRUNLX0xUKHByb2dyYW1faW5mb19sZW5ndGgsIDB4NDAwdSk7Ci0gICAgICAgICpwdHIrKyA9IDB4ZjAgfCAocHJvZ3JhbV9pbmZvX2xlbmd0aCA+PiA4KTsKLSAgICAgICAgKnB0cisrID0gKHByb2dyYW1faW5mb19sZW5ndGggJiAweGZmKTsKLQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Qcm9ncmFtSW5mb0Rlc2NyaXB0b3JzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmZGVzYyA9IG1Qcm9ncmFtSW5mb0Rlc2NyaXB0b3JzLml0ZW1BdChpKTsKLSAgICAgICAgICAgIG1lbWNweShwdHIsIGRlc2MtPmRhdGEoKSwgZGVzYy0+c2l6ZSgpKTsKLSAgICAgICAgICAgIHB0ciArPSBkZXNjLT5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrPiAmdHJhY2sgPSBtVHJhY2tzLml0ZW1BdChpKTsKLQotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGFsbCB0aGUgZGVjcmlwdG9ycyBoYXZlIGJlZW4gYWRkZWQuCi0gICAgICAgICAgICB0cmFjay0+ZmluYWxpemUoKTsKLQotICAgICAgICAgICAgKnB0cisrID0gdHJhY2stPnN0cmVhbVR5cGUoKTsKLSAgICAgICAgICAgICpwdHIrKyA9IDB4ZTAgfCAodHJhY2stPlBJRCgpID4+IDgpOwotICAgICAgICAgICAgKnB0cisrID0gdHJhY2stPlBJRCgpICYgMHhmZjsKLQotICAgICAgICAgICAgc2l6ZV90IEVTX2luZm9fbGVuZ3RoID0gMDsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdHJhY2stPmNvdW50RGVzY3JpcHRvcnMoKTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgRVNfaW5mb19sZW5ndGggKz0gdHJhY2stPmRlc2NyaXB0b3JBdChpKS0+c2l6ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ0hFQ0tfTEUoRVNfaW5mb19sZW5ndGgsIDB4ZmZmdSk7Ci0KLSAgICAgICAgICAgICpwdHIrKyA9IDB4ZjAgfCAoRVNfaW5mb19sZW5ndGggPj4gOCk7Ci0gICAgICAgICAgICAqcHRyKysgPSAoRVNfaW5mb19sZW5ndGggJiAweGZmKTsKLQotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0cmFjay0+Y291bnREZXNjcmlwdG9ycygpOyArK2kpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmZGVzY3JpcHRvciA9IHRyYWNrLT5kZXNjcmlwdG9yQXQoaSk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KHB0ciwgZGVzY3JpcHRvci0+ZGF0YSgpLCBkZXNjcmlwdG9yLT5zaXplKCkpOwotICAgICAgICAgICAgICAgIHB0ciArPSBkZXNjcmlwdG9yLT5zaXplKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3Qgc2VjdGlvbl9sZW5ndGggPSBwdHIgLSAoY3JjRGF0YVN0YXJ0ICsgMykgKyA0IC8qIENSQyAqLzsKLQotICAgICAgICBjcmNEYXRhU3RhcnRbMV0gPSAweGIwIHwgKHNlY3Rpb25fbGVuZ3RoID4+IDgpOwotICAgICAgICBjcmNEYXRhU3RhcnRbMl0gPSBzZWN0aW9uX2xlbmd0aCAmIDB4ZmY7Ci0KLSAgICAgICAgY3JjID0gaHRvbmwoY3JjMzIoY3JjRGF0YVN0YXJ0LCBwdHIgLSBjcmNEYXRhU3RhcnQpKTsKLSAgICAgICAgbWVtY3B5KHB0ciwgJmNyYywgNCk7Ci0gICAgICAgIHB0ciArPSA0OwotCi0gICAgICAgIHNpemVMZWZ0ID0gcGFja2V0RGF0YVN0YXJ0ICsgMTg4IC0gcHRyOwotICAgICAgICBtZW1zZXQocHRyLCAweGZmLCBzaXplTGVmdCk7Ci0KLSAgICAgICAgcGFja2V0RGF0YVN0YXJ0ICs9IDE4ODsKLSAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBFTUlUX1BDUikgewotICAgICAgICAvLyBQQ1Igc3RyZWFtCi0gICAgICAgIC8vIDB4NDcKLSAgICAgICAgLy8gdHJhbnNwb3J0X2Vycm9yX2luZGljYXRvciA9IGIwCi0gICAgICAgIC8vIHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IgPSBiMQotICAgICAgICAvLyB0cmFuc3BvcnRfcHJpb3JpdHkgPSBiMAotICAgICAgICAvLyBQSUQgPSBrUENSX1BJRCAoMTMgYml0cykKLSAgICAgICAgLy8gdHJhbnNwb3J0X3NjcmFtYmxpbmdfY29udHJvbCA9IGIwMAotICAgICAgICAvLyBhZGFwdGF0aW9uX2ZpZWxkX2NvbnRyb2wgPSBiMTAgKGFkYXB0YXRpb24gZmllbGQgb25seSwgbm8gcGF5bG9hZCkKLSAgICAgICAgLy8gY29udGludWl0eV9jb3VudGVyID0gYjAwMDAgKGRvZXMgbm90IGluY3JlbWVudCkKLSAgICAgICAgLy8gYWRhcHRhdGlvbl9maWVsZF9sZW5ndGggPSAxODMKLSAgICAgICAgLy8gZGlzY29udGludWl0eV9pbmRpY2F0b3IgPSBiMAotICAgICAgICAvLyByYW5kb21fYWNjZXNzX2luZGljYXRvciA9IGIwCi0gICAgICAgIC8vIGVsZW1lbnRhcnlfc3RyZWFtX3ByaW9yaXR5X2luZGljYXRvciA9IGIwCi0gICAgICAgIC8vIFBDUl9mbGFnID0gYjEKLSAgICAgICAgLy8gT1BDUl9mbGFnID0gYjAKLSAgICAgICAgLy8gc3BsaWNpbmdfcG9pbnRfZmxhZyA9IGIwCi0gICAgICAgIC8vIHRyYW5zcG9ydF9wcml2YXRlX2RhdGFfZmxhZyA9IGIwCi0gICAgICAgIC8vIGFkYXB0YXRpb25fZmllbGRfZXh0ZW5zaW9uX2ZsYWcgPSBiMAotICAgICAgICAvLyBwcm9ncmFtX2Nsb2NrX3JlZmVyZW5jZV9iYXNlID0gYj8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/PwotICAgICAgICAvLyByZXNlcnZlZCA9IGIxMTExMTEKLSAgICAgICAgLy8gcHJvZ3JhbV9jbG9ja19yZWZlcmVuY2VfZXh0ZW5zaW9uID0gYj8/Pz8/Pz8/PwotCi0gICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotCi0gICAgICAgIHVpbnQ2NF90IFBDUiA9IG5vd1VzICogMjc7ICAvLyBQQ1IgYmFzZWQgb24gYSAyN01IeiBjbG9jawotICAgICAgICB1aW50NjRfdCBQQ1JfYmFzZSA9IFBDUiAvIDMwMDsKLSAgICAgICAgdWludDMyX3QgUENSX2V4dCA9IFBDUiAlIDMwMDsKLQotICAgICAgICB1aW50OF90ICpwdHIgPSBwYWNrZXREYXRhU3RhcnQ7Ci0gICAgICAgICpwdHIrKyA9IDB4NDc7Ci0gICAgICAgICpwdHIrKyA9IDB4NDAgfCAoa1BJRF9QQ1IgPj4gOCk7Ci0gICAgICAgICpwdHIrKyA9IGtQSURfUENSICYgMHhmZjsKLSAgICAgICAgKnB0cisrID0gMHgyMDsKLSAgICAgICAgKnB0cisrID0gMHhiNzsgIC8vIGFkYXB0YXRpb25fZmllbGRfbGVuZ3RoCi0gICAgICAgICpwdHIrKyA9IDB4MTA7Ci0gICAgICAgICpwdHIrKyA9IChQQ1JfYmFzZSA+PiAyNSkgJiAweGZmOwotICAgICAgICAqcHRyKysgPSAoUENSX2Jhc2UgPj4gMTcpICYgMHhmZjsKLSAgICAgICAgKnB0cisrID0gKFBDUl9iYXNlID4+IDkpICYgMHhmZjsKLSAgICAgICAgKnB0cisrID0gKChQQ1JfYmFzZSAmIDEpIDw8IDcpIHwgMHg3ZSB8ICgoUENSX2V4dCA+PiA4KSAmIDEpOwotICAgICAgICAqcHRyKysgPSAoUENSX2V4dCAmIDB4ZmYpOwotCi0gICAgICAgIHNpemVfdCBzaXplTGVmdCA9IHBhY2tldERhdGFTdGFydCArIDE4OCAtIHB0cjsKLSAgICAgICAgbWVtc2V0KHB0ciwgMHhmZiwgc2l6ZUxlZnQpOwotCi0gICAgICAgIHBhY2tldERhdGFTdGFydCArPSAxODg7Ci0gICAgfQotCi0gICAgdWludDY0X3QgUFRTID0gKHRpbWVVcyAqIDlsbCkgLyAxMDBsbDsKLQotICAgIGlmIChQRVNfcGFja2V0X2xlbmd0aCA+PSA2NTUzNikgewotICAgICAgICAvLyBUaGlzIHJlYWxseSBzaG91bGQgb25seSBoYXBwZW4gZm9yIHZpZGVvLgotICAgICAgICBDSEVDSyh0cmFjay0+aXNWaWRlbygpKTsKLQotICAgICAgICAvLyBJdCdzIHZhbGlkIHRvIHNldCB0aGlzIHRvIDAgZm9yIHZpZGVvIGFjY29yZGluZyB0byB0aGUgc3BlY3MuCi0gICAgICAgIFBFU19wYWNrZXRfbGVuZ3RoID0gMDsKLSAgICB9Ci0KLSAgICBzaXplX3Qgc2l6ZUF2YWlsYWJsZUZvclBheWxvYWQgPSAxODggLSA0IC0gMTQgLSBudW1TdHVmZmluZ0J5dGVzOwotICAgIGlmIChQRVNfcHJpdmF0ZV9kYXRhX2xlbiA+IDApIHsKLSAgICAgICAgc2l6ZUF2YWlsYWJsZUZvclBheWxvYWQgLT0gUEVTX3ByaXZhdGVfZGF0YV9sZW4gKyAxOwotICAgIH0KLQotICAgIHNpemVfdCBjb3B5ID0gYWNjZXNzVW5pdC0+c2l6ZSgpOwotCi0gICAgaWYgKGNvcHkgPiBzaXplQXZhaWxhYmxlRm9yUGF5bG9hZCkgewotICAgICAgICBjb3B5ID0gc2l6ZUF2YWlsYWJsZUZvclBheWxvYWQ7Ci0KLSAgICAgICAgaWYgKGFsaWduUGF5bG9hZCAmJiBjb3B5ID4gMTYpIHsKLSAgICAgICAgICAgIGNvcHkgLT0gKGNvcHkgJSAxNik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzaXplX3QgbnVtUGFkZGluZ0J5dGVzID0gc2l6ZUF2YWlsYWJsZUZvclBheWxvYWQgLSBjb3B5OwotCi0gICAgdWludDhfdCAqcHRyID0gcGFja2V0RGF0YVN0YXJ0OwotICAgICpwdHIrKyA9IDB4NDc7Ci0gICAgKnB0cisrID0gMHg0MCB8ICh0cmFjay0+UElEKCkgPj4gOCk7Ci0gICAgKnB0cisrID0gdHJhY2stPlBJRCgpICYgMHhmZjsKLQotICAgICpwdHIrKyA9IChudW1QYWRkaW5nQnl0ZXMgPiAwID8gMHgzMCA6IDB4MTApCi0gICAgICAgICAgICAgICAgfCB0cmFjay0+aW5jcmVtZW50Q29udGludWl0eUNvdW50ZXIoKTsKLQotICAgIGlmIChudW1QYWRkaW5nQnl0ZXMgPiAwKSB7Ci0gICAgICAgICpwdHIrKyA9IG51bVBhZGRpbmdCeXRlcyAtIDE7Ci0gICAgICAgIGlmIChudW1QYWRkaW5nQnl0ZXMgPj0gMikgewotICAgICAgICAgICAgKnB0cisrID0gMHgwMDsKLSAgICAgICAgICAgIG1lbXNldChwdHIsIDB4ZmYsIG51bVBhZGRpbmdCeXRlcyAtIDIpOwotICAgICAgICAgICAgcHRyICs9IG51bVBhZGRpbmdCeXRlcyAtIDI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAqcHRyKysgPSAweDAwOwotICAgICpwdHIrKyA9IDB4MDA7Ci0gICAgKnB0cisrID0gMHgwMTsKLSAgICAqcHRyKysgPSB0cmFjay0+c3RyZWFtSUQoKTsKLSAgICAqcHRyKysgPSBQRVNfcGFja2V0X2xlbmd0aCA+PiA4OwotICAgICpwdHIrKyA9IFBFU19wYWNrZXRfbGVuZ3RoICYgMHhmZjsKLSAgICAqcHRyKysgPSAweDg0OwotICAgICpwdHIrKyA9IChQRVNfcHJpdmF0ZV9kYXRhX2xlbiA+IDApID8gMHg4MSA6IDB4ODA7Ci0KLSAgICBzaXplX3QgaGVhZGVyTGVuZ3RoID0gMHgwNSArIG51bVN0dWZmaW5nQnl0ZXM7Ci0gICAgaWYgKFBFU19wcml2YXRlX2RhdGFfbGVuID4gMCkgewotICAgICAgICBoZWFkZXJMZW5ndGggKz0gMSArIFBFU19wcml2YXRlX2RhdGFfbGVuOwotICAgIH0KLQotICAgICpwdHIrKyA9IGhlYWRlckxlbmd0aDsKLQotICAgICpwdHIrKyA9IDB4MjAgfCAoKChQVFMgPj4gMzApICYgNykgPDwgMSkgfCAxOwotICAgICpwdHIrKyA9IChQVFMgPj4gMjIpICYgMHhmZjsKLSAgICAqcHRyKysgPSAoKChQVFMgPj4gMTUpICYgMHg3ZikgPDwgMSkgfCAxOwotICAgICpwdHIrKyA9IChQVFMgPj4gNykgJiAweGZmOwotICAgICpwdHIrKyA9ICgoUFRTICYgMHg3ZikgPDwgMSkgfCAxOwotCi0gICAgaWYgKFBFU19wcml2YXRlX2RhdGFfbGVuID4gMCkgewotICAgICAgICAqcHRyKysgPSAweDhlOyAgLy8gUEVTX3ByaXZhdGVfZGF0YV9mbGFnLCByZXNlcnZlZC4KLSAgICAgICAgbWVtY3B5KHB0ciwgUEVTX3ByaXZhdGVfZGF0YSwgUEVTX3ByaXZhdGVfZGF0YV9sZW4pOwotICAgICAgICBwdHIgKz0gUEVTX3ByaXZhdGVfZGF0YV9sZW47Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdHVmZmluZ0J5dGVzOyArK2kpIHsKLSAgICAgICAgKnB0cisrID0gMHhmZjsKLSAgICB9Ci0KLSAgICBtZW1jcHkocHRyLCBhY2Nlc3NVbml0LT5kYXRhKCksIGNvcHkpOwotICAgIHB0ciArPSBjb3B5OwotCi0gICAgQ0hFQ0tfRVEocHRyLCBwYWNrZXREYXRhU3RhcnQgKyAxODgpOwotICAgIHBhY2tldERhdGFTdGFydCArPSAxODg7Ci0KLSAgICBzaXplX3Qgb2Zmc2V0ID0gY29weTsKLSAgICB3aGlsZSAob2Zmc2V0IDwgYWNjZXNzVW5pdC0+c2l6ZSgpKSB7Ci0gICAgICAgIC8vIGZvciBzdWJzZXF1ZW50IGZyYWdtZW50cyBvZiAiYnVmZmVyIjoKLSAgICAgICAgLy8gMHg0NwotICAgICAgICAvLyB0cmFuc3BvcnRfZXJyb3JfaW5kaWNhdG9yID0gYjAKLSAgICAgICAgLy8gcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciA9IGIwCi0gICAgICAgIC8vIHRyYW5zcG9ydF9wcmlvcml0eSA9IGIwCi0gICAgICAgIC8vIFBJRCA9IGIwIDAwMDEgMTExMCA/Pz8/ICgxMyBiaXRzKSBbMHgxZTAgKyAxICsgc291cmNlSW5kZXhdCi0gICAgICAgIC8vIHRyYW5zcG9ydF9zY3JhbWJsaW5nX2NvbnRyb2wgPSBiMDAKLSAgICAgICAgLy8gYWRhcHRhdGlvbl9maWVsZF9jb250cm9sID0gYj8/Ci0gICAgICAgIC8vIGNvbnRpbnVpdHlfY291bnRlciA9IGI/Pz8/Ci0gICAgICAgIC8vIHRoZSBmcmFnbWVudCBvZiAiYnVmZmVyIiBmb2xsb3dzLgotCi0gICAgICAgIHNpemVfdCBzaXplQXZhaWxhYmxlRm9yUGF5bG9hZCA9IDE4OCAtIDQ7Ci0KLSAgICAgICAgc2l6ZV90IGNvcHkgPSBhY2Nlc3NVbml0LT5zaXplKCkgLSBvZmZzZXQ7Ci0KLSAgICAgICAgaWYgKGNvcHkgPiBzaXplQXZhaWxhYmxlRm9yUGF5bG9hZCkgewotICAgICAgICAgICAgY29weSA9IHNpemVBdmFpbGFibGVGb3JQYXlsb2FkOwotCi0gICAgICAgICAgICBpZiAoYWxpZ25QYXlsb2FkICYmIGNvcHkgPiAxNikgewotICAgICAgICAgICAgICAgIGNvcHkgLT0gKGNvcHkgJSAxNik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgbnVtUGFkZGluZ0J5dGVzID0gc2l6ZUF2YWlsYWJsZUZvclBheWxvYWQgLSBjb3B5OwotCi0gICAgICAgIHVpbnQ4X3QgKnB0ciA9IHBhY2tldERhdGFTdGFydDsKLSAgICAgICAgKnB0cisrID0gMHg0NzsKLSAgICAgICAgKnB0cisrID0gMHgwMCB8ICh0cmFjay0+UElEKCkgPj4gOCk7Ci0gICAgICAgICpwdHIrKyA9IHRyYWNrLT5QSUQoKSAmIDB4ZmY7Ci0KLSAgICAgICAgKnB0cisrID0gKG51bVBhZGRpbmdCeXRlcyA+IDAgPyAweDMwIDogMHgxMCkKLSAgICAgICAgICAgICAgICAgICAgfCB0cmFjay0+aW5jcmVtZW50Q29udGludWl0eUNvdW50ZXIoKTsKLQotICAgICAgICBpZiAobnVtUGFkZGluZ0J5dGVzID4gMCkgewotICAgICAgICAgICAgKnB0cisrID0gbnVtUGFkZGluZ0J5dGVzIC0gMTsKLSAgICAgICAgICAgIGlmIChudW1QYWRkaW5nQnl0ZXMgPj0gMikgewotICAgICAgICAgICAgICAgICpwdHIrKyA9IDB4MDA7Ci0gICAgICAgICAgICAgICAgbWVtc2V0KHB0ciwgMHhmZiwgbnVtUGFkZGluZ0J5dGVzIC0gMik7Ci0gICAgICAgICAgICAgICAgcHRyICs9IG51bVBhZGRpbmdCeXRlcyAtIDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtZW1jcHkocHRyLCBhY2Nlc3NVbml0LT5kYXRhKCkgKyBvZmZzZXQsIGNvcHkpOwotICAgICAgICBwdHIgKz0gY29weTsKLSAgICAgICAgQ0hFQ0tfRVEocHRyLCBwYWNrZXREYXRhU3RhcnQgKyAxODgpOwotCi0gICAgICAgIG9mZnNldCArPSBjb3B5OwotICAgICAgICBwYWNrZXREYXRhU3RhcnQgKz0gMTg4OwotICAgIH0KLQotICAgIENIRUNLKHBhY2tldERhdGFTdGFydCA9PSBidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+Y2FwYWNpdHkoKSk7Ci0KLSAgICAqcGFja2V0cyA9IGJ1ZmZlcjsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBUU1BhY2tldGl6ZXI6OmluaXRDcmNUYWJsZSgpIHsKLSAgICB1aW50MzJfdCBwb2x5ID0gMHgwNEMxMURCNzsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLSAgICAgICAgdWludDMyX3QgY3JjID0gaSA8PCAyNDsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA4OyBqKyspIHsKLSAgICAgICAgICAgIGNyYyA9IChjcmMgPDwgMSkgXiAoKGNyYyAmIDB4ODAwMDAwMDApID8gKHBvbHkpIDogMCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUNyY1RhYmxlW2ldID0gY3JjOwotICAgIH0KLX0KLQotdWludDMyX3QgVFNQYWNrZXRpemVyOjpjcmMzMihjb25zdCB1aW50OF90ICpzdGFydCwgc2l6ZV90IHNpemUpIGNvbnN0IHsKLSAgICB1aW50MzJfdCBjcmMgPSAweEZGRkZGRkZGOwotICAgIGNvbnN0IHVpbnQ4X3QgKnA7Ci0KLSAgICBmb3IgKHAgPSBzdGFydDsgcCA8IHN0YXJ0ICsgc2l6ZTsgKytwKSB7Ci0gICAgICAgIGNyYyA9IChjcmMgPDwgOCkgXiBtQ3JjVGFibGVbKChjcmMgPj4gMjQpIF4gKnApICYgMHhGRl07Ci0gICAgfQotCi0gICAgcmV0dXJuIGNyYzsKLX0KLQotc3A8QUJ1ZmZlcj4gVFNQYWNrZXRpemVyOjpwcmVwZW5kQ1NEKAotICAgICAgICBzaXplX3QgdHJhY2tJbmRleCwgY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpIGNvbnN0IHsKLSAgICBDSEVDS19MVCh0cmFja0luZGV4LCBtVHJhY2tzLnNpemUoKSk7Ci0KLSAgICBjb25zdCBzcDxUcmFjaz4gJnRyYWNrID0gbVRyYWNrcy5pdGVtQXQodHJhY2tJbmRleCk7Ci0gICAgQ0hFQ0sodHJhY2stPmlzSDI2NCgpICYmIElzSURSKGFjY2Vzc1VuaXQpKTsKLQotICAgIGludDY0X3QgdGltZVVzOwotICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7Ci0KLSAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0MiA9IHRyYWNrLT5wcmVwZW5kQ1NEKGFjY2Vzc1VuaXQpOwotCi0gICAgYWNjZXNzVW5pdDItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7Ci0KLSAgICByZXR1cm4gYWNjZXNzVW5pdDI7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvVFNQYWNrZXRpemVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1RTUGFja2V0aXplci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGNiMTc5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvVFNQYWNrZXRpemVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRTX1BBQ0tFVElaRVJfSF8KLQotI2RlZmluZSBUU19QQUNLRVRJWkVSX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBBQnVmZmVyOwotc3RydWN0IEFNZXNzYWdlOwotCi0vLyBGb3JtcyB0aGUgcGFja2V0cyBvZiBhIHRyYW5zcG9ydCBzdHJlYW0gZ2l2ZW4gYWNjZXNzIHVuaXRzLgotLy8gRW1pdHMgbWV0YWRhdGEgdGFibGVzIChQQVQgYW5kIFBNVCkgYW5kIHRpbWVzdGFtcCBzdHJlYW0gKFBDUikgYmFzZWQKLS8vIG9uIGZsYWdzLgotc3RydWN0IFRTUGFja2V0aXplciA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBlbnVtIHsKLSAgICAgICAgRU1JVF9IRENQMjBfREVTQ1JJUFRPUiA9IDEsCi0gICAgICAgIEVNSVRfSERDUDIxX0RFU0NSSVBUT1IgPSAyLAotICAgIH07Ci0gICAgZXhwbGljaXQgVFNQYWNrZXRpemVyKHVpbnQzMl90IGZsYWdzKTsKLQotICAgIC8vIFJldHVybnMgdHJhY2tJbmRleCBvciBlcnJvci4KLSAgICBzc2l6ZV90IGFkZFRyYWNrKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKLQotICAgIGVudW0gewotICAgICAgICBFTUlUX1BBVF9BTkRfUE1UICAgICAgICAgICAgICAgID0gMSwKLSAgICAgICAgRU1JVF9QQ1IgICAgICAgICAgICAgICAgICAgICAgICA9IDIsCi0gICAgICAgIElTX0VOQ1JZUFRFRCAgICAgICAgICAgICAgICAgICAgPSA0LAotICAgICAgICBQUkVQRU5EX1NQU19QUFNfVE9fSURSX0ZSQU1FUyAgID0gOCwKLSAgICB9OwotICAgIHN0YXR1c190IHBhY2tldGl6ZSgKLSAgICAgICAgICAgIHNpemVfdCB0cmFja0luZGV4LCBjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCwKLSAgICAgICAgICAgIHNwPEFCdWZmZXI+ICpwYWNrZXRzLAotICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCi0gICAgICAgICAgICBjb25zdCB1aW50OF90ICpQRVNfcHJpdmF0ZV9kYXRhLCBzaXplX3QgUEVTX3ByaXZhdGVfZGF0YV9sZW4sCi0gICAgICAgICAgICBzaXplX3QgbnVtU3R1ZmZpbmdCeXRlcyA9IDApOwotCi0gICAgc3RhdHVzX3QgZXh0cmFjdENTRElmTmVjZXNzYXJ5KHNpemVfdCB0cmFja0luZGV4KTsKLQotICAgIC8vIFhYWCB0byBiZSByZW1vdmVkIG9uY2UgZW5jb2RlciBjb25maWcgb3B0aW9uIHRha2VzIGNhcmUgb2YgdGhpcyBmb3IKLSAgICAvLyBlbmNyeXB0ZWQgbW9kZS4KLSAgICBzcDxBQnVmZmVyPiBwcmVwZW5kQ1NEKAotICAgICAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXgsIGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KSBjb25zdDsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgflRTUGFja2V0aXplcigpOwotCi1wcml2YXRlOgotICAgIGVudW0gewotICAgICAgICBrUElEX1BNVCA9IDB4MTAwLAotICAgICAgICBrUElEX1BDUiA9IDB4MTAwMCwKLSAgICB9OwotCi0gICAgc3RydWN0IFRyYWNrOwotCi0gICAgdWludDMyX3QgbUZsYWdzOwotICAgIFZlY3RvcjxzcDxUcmFjaz4gPiBtVHJhY2tzOwotCi0gICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gbVByb2dyYW1JbmZvRGVzY3JpcHRvcnM7Ci0KLSAgICB1bnNpZ25lZCBtUEFUQ29udGludWl0eUNvdW50ZXI7Ci0gICAgdW5zaWduZWQgbVBNVENvbnRpbnVpdHlDb3VudGVyOwotCi0gICAgdWludDMyX3QgbUNyY1RhYmxlWzI1Nl07Ci0KLSAgICB2b2lkIGluaXRDcmNUYWJsZSgpOwotICAgIHVpbnQzMl90IGNyYzMyKGNvbnN0IHVpbnQ4X3QgKnN0YXJ0LCBzaXplX3Qgc2l6ZSkgY29uc3Q7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUU1BhY2tldGl6ZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBUU19QQUNLRVRJWkVSX0hfCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvV2lmaURpc3BsYXlTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9XaWZpRGlzcGxheVNvdXJjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2OTVlNWQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9XaWZpRGlzcGxheVNvdXJjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiV2lmaURpc3BsYXlTb3VyY2UiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJXaWZpRGlzcGxheVNvdXJjZS5oIgotI2luY2x1ZGUgIlBsYXliYWNrU2Vzc2lvbi5oIgotI2luY2x1ZGUgIlBhcmFtZXRlcnMuaCIKLSNpbmNsdWRlICJydHAvUlRQU2VuZGVyLmgiCi0KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9JSERDUC5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9JUmVtb3RlRGlzcGxheUNsaWVudC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vUGFyc2VkTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KLQotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIHN0YXRpYwotY29uc3QgaW50NjRfdCBXaWZpRGlzcGxheVNvdXJjZTo6a1JlYXBlckludGVydmFsVXM7Ci1jb25zdCBpbnQ2NF90IFdpZmlEaXNwbGF5U291cmNlOjprVGVhcmRvd25UcmlnZ2VyVGltZW91U2VjczsKLWNvbnN0IGludDY0X3QgV2lmaURpc3BsYXlTb3VyY2U6OmtQbGF5YmFja1Nlc3Npb25UaW1lb3V0U2VjczsKLWNvbnN0IGludDY0X3QgV2lmaURpc3BsYXlTb3VyY2U6OmtQbGF5YmFja1Nlc3Npb25UaW1lb3V0VXM7Ci1jb25zdCBBU3RyaW5nIFdpZmlEaXNwbGF5U291cmNlOjpzVXNlckFnZW50ID0gTWFrZVVzZXJBZ2VudCgpOwotCi1XaWZpRGlzcGxheVNvdXJjZTo6V2lmaURpc3BsYXlTb3VyY2UoCi0gICAgICAgIGNvbnN0IFN0cmluZzE2ICZvcFBhY2thZ2VOYW1lLAotICAgICAgICBjb25zdCBzcDxBTmV0d29ya1Nlc3Npb24+ICZuZXRTZXNzaW9uLAotICAgICAgICBjb25zdCBzcDxJUmVtb3RlRGlzcGxheUNsaWVudD4gJmNsaWVudCwKLSAgICAgICAgY29uc3QgY2hhciAqcGF0aCkKLSAgICA6IG1PcFBhY2thZ2VOYW1lKG9wUGFja2FnZU5hbWUpLAotICAgICAgbVN0YXRlKElOSVRJQUxJWkVEKSwKLSAgICAgIG1OZXRTZXNzaW9uKG5ldFNlc3Npb24pLAotICAgICAgbUNsaWVudChjbGllbnQpLAotICAgICAgbVNlc3Npb25JRCgwKSwKLSAgICAgIG1TdG9wUmVwbHlJRChOVUxMKSwKLSAgICAgIG1DaG9zZW5SVFBQb3J0KC0xKSwKLSAgICAgIG1Vc2luZ1BDTUF1ZGlvKGZhbHNlKSwKLSAgICAgIG1DbGllbnRTZXNzaW9uSUQoMCksCi0gICAgICBtUmVhcGVyUGVuZGluZyhmYWxzZSksCi0gICAgICBtTmV4dENTZXEoMSksCi0gICAgICBtVXNpbmdIRENQKGZhbHNlKSwKLSAgICAgIG1Jc0hEQ1AyXzAoZmFsc2UpLAotICAgICAgbUhEQ1BQb3J0KDApLAotICAgICAgbUhEQ1BJbml0aWFsaXphdGlvbkNvbXBsZXRlKGZhbHNlKSwKLSAgICAgIG1TZXR1cFRyaWdnZXJEZWZlcnJlZChmYWxzZSksCi0gICAgICBtUGxheWJhY2tTZXNzaW9uRXN0YWJsaXNoZWQoZmFsc2UpIHsKLSAgICBpZiAocGF0aCAhPSBOVUxMKSB7Ci0gICAgICAgIG1NZWRpYVBhdGguc2V0VG8ocGF0aCk7Ci0gICAgfQotCi0gICAgbVN1cHBvcnRlZFNvdXJjZVZpZGVvRm9ybWF0cy5kaXNhYmxlQWxsKCk7Ci0KLSAgICBtU3VwcG9ydGVkU291cmNlVmlkZW9Gb3JtYXRzLnNldE5hdGl2ZVJlc29sdXRpb24oCi0gICAgICAgICAgICBWaWRlb0Zvcm1hdHM6OlJFU09MVVRJT05fQ0VBLCA1KTsgIC8vIDEyODB4NzIwIHAzMAotCi0gICAgLy8gRW5hYmxlIGFsbCByZXNvbHV0aW9ucyB1cCB0byAxMjgweDcyMHAzMAotICAgIG1TdXBwb3J0ZWRTb3VyY2VWaWRlb0Zvcm1hdHMuZW5hYmxlUmVzb2x1dGlvblVwdG8oCi0gICAgICAgICAgICBWaWRlb0Zvcm1hdHM6OlJFU09MVVRJT05fQ0VBLCA1LAotICAgICAgICAgICAgVmlkZW9Gb3JtYXRzOjpQUk9GSUxFX0NIUCwgIC8vIENvbnN0cmFpbmVkIEhpZ2ggUHJvZmlsZQotICAgICAgICAgICAgVmlkZW9Gb3JtYXRzOjpMRVZFTF8zMik7ICAgIC8vIExldmVsIDMuMgotfQotCi1XaWZpRGlzcGxheVNvdXJjZTo6fldpZmlEaXNwbGF5U291cmNlKCkgewotfQotCi1zdGF0aWMgc3RhdHVzX3QgUG9zdEFuZEF3YWl0UmVzcG9uc2UoCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBzcDxBTWVzc2FnZT4gKnJlc3BvbnNlKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZShyZXNwb25zZSk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKHJlc3BvbnNlID09IE5VTEwgfHwgISgqcmVzcG9uc2UpLT5maW5kSW50MzIoImVyciIsICZlcnIpKSB7Ci0gICAgICAgIGVyciA9IE9LOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IFdpZmlEaXNwbGF5U291cmNlOjpzdGFydChjb25zdCBjaGFyICppZmFjZSkgewotICAgIENIRUNLX0VRKG1TdGF0ZSwgSU5JVElBTElaRUQpOwotCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCB0aGlzKTsKLSAgICBtc2ctPnNldFN0cmluZygiaWZhY2UiLCBpZmFjZSk7Ci0KLSAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7Ci0gICAgcmV0dXJuIFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKLX0KLQotc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6OnN0b3AoKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0b3AsIHRoaXMpOwotCi0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgIHJldHVybiBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7Ci19Ci0KLXN0YXR1c190IFdpZmlEaXNwbGF5U291cmNlOjpwYXVzZSgpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UGF1c2UsIHRoaXMpOwotCi0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgIHJldHVybiBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7Ci19Ci0KLXN0YXR1c190IFdpZmlEaXNwbGF5U291cmNlOjpyZXN1bWUoKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlc3VtZSwgdGhpcyk7Ci0KLSAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7Ci0gICAgcmV0dXJuIFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKLX0KLQotdm9pZCBXaWZpRGlzcGxheVNvdXJjZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7Ci0gICAgICAgIGNhc2Uga1doYXRTdGFydDoKLSAgICAgICAgewotICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7Ci0KLSAgICAgICAgICAgIEFTdHJpbmcgaWZhY2U7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoImlmYWNlIiwgJmlmYWNlKSk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgICAgICAgICBzc2l6ZV90IGNvbG9uUG9zID0gaWZhY2UuZmluZCgiOiIpOwotCi0gICAgICAgICAgICB1bnNpZ25lZCBsb25nIHBvcnQ7Ci0KLSAgICAgICAgICAgIGlmIChjb2xvblBvcyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcyA9IGlmYWNlLmNfc3RyKCkgKyBjb2xvblBvcyArIDE7Ci0KLSAgICAgICAgICAgICAgICBjaGFyICplbmQ7Ci0gICAgICAgICAgICAgICAgcG9ydCA9IHN0cnRvdWwocywgJmVuZCwgMTApOwotCi0gICAgICAgICAgICAgICAgaWYgKGVuZCA9PSBzIHx8ICplbmQgIT0gJ1wwJyB8fCBwb3J0ID4gNjU1MzUpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZmFjZS5lcmFzZShjb2xvblBvcywgaWZhY2Uuc2l6ZSgpIC0gY29sb25Qb3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcG9ydCA9IGtXaWZpRGlzcGxheURlZmF1bHRQb3J0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZXRfYXRvbihpZmFjZS5jX3N0cigpLCAmbUludGVyZmFjZUFkZHIpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFJUU1BOb3RpZnksIHRoaXMpOwotCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IG1OZXRTZXNzaW9uLT5jcmVhdGVSVFNQU2VydmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnRlcmZhY2VBZGRyLCBwb3J0LCBub3RpZnksICZtU2Vzc2lvbklEKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSAtRUlOVkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVN0YXRlID0gQVdBSVRJTkdfQ0xJRU5UX0NPTk5FQ1RJT047Ci0KLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRSVFNQTm90aWZ5OgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IHJlYXNvbjsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZWFzb24iLCAmcmVhc29uKSk7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAocmVhc29uKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBBTmV0d29ya1Nlc3Npb246OmtXaGF0RXJyb3I6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JRDsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInNlc3Npb25JRCIsICZzZXNzaW9uSUQpKTsKLQotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVycjsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKLQotICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIGRldGFpbDsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJkZXRhaWwiLCAmZGV0YWlsKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkFuIGVycm9yIG9jY3VycmVkIGluIHNlc3Npb24gJWQgKCVkLCAnJXMvJXMnKS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGVyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpKTsKLQotICAgICAgICAgICAgICAgICAgICBtTmV0U2Vzc2lvbi0+ZGVzdHJveVNlc3Npb24oc2Vzc2lvbklEKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbklEID09IG1DbGllbnRTZXNzaW9uSUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRTZXNzaW9uSUQgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50LT5vbkRpc3BsYXlFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJlbW90ZURpc3BsYXlDbGllbnQ6OmtEaXNwbGF5RXJyb3JVbmtub3duKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYXNlIEFOZXR3b3JrU2Vzc2lvbjo6a1doYXRDbGllbnRDb25uZWN0ZWQ6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JRDsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInNlc3Npb25JRCIsICZzZXNzaW9uSUQpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobUNsaWVudFNlc3Npb25JRCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJBIGNsaWVudCB0cmllZCB0byBjb25uZWN0LCBidXQgd2UgYWxyZWFkeSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGF2ZSBvbmUuIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1OZXRTZXNzaW9uLT5kZXN0cm95U2Vzc2lvbihzZXNzaW9uSUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtU3RhdGUsIEFXQUlUSU5HX0NMSUVOVF9DT05ORUNUSU9OKTsKLQotICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoImNsaWVudC1pcCIsICZtQ2xpZW50SW5mby5tUmVtb3RlSVApKTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJzZXJ2ZXItaXAiLCAmbUNsaWVudEluZm8ubUxvY2FsSVApKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobUNsaWVudEluZm8ubVJlbW90ZUlQID09IG1DbGllbnRJbmZvLm1Mb2NhbElQKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBEaXNhbGxvdyBjb25uZWN0aW9ucyBmcm9tIHRoZSBsb2NhbCBpbnRlcmZhY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBzZWN1cml0eSByZWFzb25zLgotICAgICAgICAgICAgICAgICAgICAgICAgbU5ldFNlc3Npb24tPmRlc3Ryb3lTZXNzaW9uKHNlc3Npb25JRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VydmVyLXBvcnQiLCAmbUNsaWVudEluZm8ubUxvY2FsUG9ydCkpOwotICAgICAgICAgICAgICAgICAgICBtQ2xpZW50SW5mby5tUGxheWJhY2tTZXNzaW9uSUQgPSAtMTsKLQotICAgICAgICAgICAgICAgICAgICBtQ2xpZW50U2Vzc2lvbklEID0gc2Vzc2lvbklEOwotCi0gICAgICAgICAgICAgICAgICAgIEFMT0dJKCJXZSBub3cgaGF2ZSBhIGNsaWVudCAoJWQpIGNvbm5lY3RlZC4iLCBzZXNzaW9uSUQpOwotCi0gICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IEFXQUlUSU5HX0NMSUVOVF9TRVRVUDsKLQotICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZW5kTTEoc2Vzc2lvbklEKTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoZXJyLCAoc3RhdHVzX3QpT0spOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYXNlIEFOZXR3b3JrU2Vzc2lvbjo6a1doYXREYXRhOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gb25SZWNlaXZlQ2xpZW50RGF0YShtc2cpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnQtPm9uRGlzcGxheUVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUmVtb3RlRGlzcGxheUNsaWVudDo6a0Rpc3BsYXlFcnJvclVua25vd24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSNpZiAwCi0gICAgICAgICAgICAgICAgICAgIC8vIHRlc3Rpbmcgb25seS4KLSAgICAgICAgICAgICAgICAgICAgY2hhciB2YWxbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5X2dldCgibWVkaWEud2ZkLnRyaWdnZXIiLCB2YWwsIE5VTEwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAodmFsLCAicGF1c2UiKSAmJiBtU3RhdGUgPT0gUExBWUlORykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFBMQVlJTkdfVE9fUEFVU0VEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRUcmlnZ2VyKG1DbGllbnRTZXNzaW9uSUQsIFRSSUdHRVJfUEFVU0UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcCh2YWwsICJwbGF5IikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1TdGF0ZSA9PSBQQVVTRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBQQVVTRURfVE9fUExBWUlORzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kVHJpZ2dlcihtQ2xpZW50U2Vzc2lvbklELCBUUklHR0VSX1BMQVkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBBTmV0d29ya1Nlc3Npb246OmtXaGF0TmV0d29ya1N0YWxsOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFN0b3A6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJm1TdG9wUmVwbHlJRCkpOwotCi0gICAgICAgICAgICBDSEVDS19MVChtU3RhdGUsIEFXQUlUSU5HX0NMSUVOVF9URUFSRE9XTik7Ci0KLSAgICAgICAgICAgIGlmIChtU3RhdGUgPj0gQVdBSVRJTkdfQ0xJRU5UX1BMQVkpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgc2Vzc2lvbiwgaS5lLiBhIHByZXZpb3VzIFNFVFVQIHN1Y2NlZWRlZC4KLQotICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHNlbmRUcmlnZ2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudFNlc3Npb25JRCwgVFJJR0dFUl9URUFSRE9XTik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IEFXQUlUSU5HX0NMSUVOVF9URUFSRE9XTjsKLQotICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0VGVhcmRvd25UcmlnZ2VyVGltZWRPdXQsIHRoaXMpKS0+cG9zdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVGVhcmRvd25UcmlnZ2VyVGltZW91U2VjcyAqIDEwMDAwMDBsbCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoLgotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5pc2hTdG9wKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRQYXVzZToKLSAgICAgICAgewotICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgICAgICAgICBpZiAobVN0YXRlICE9IFBMQVlJTkcpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVN0YXRlID0gUExBWUlOR19UT19QQVVTRUQ7Ci0gICAgICAgICAgICAgICAgc2VuZFRyaWdnZXIobUNsaWVudFNlc3Npb25JRCwgVFJJR0dFUl9QQVVTRSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRSZXN1bWU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBQQVVTRUQpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVN0YXRlID0gUEFVU0VEX1RPX1BMQVlJTkc7Ci0gICAgICAgICAgICAgICAgc2VuZFRyaWdnZXIobUNsaWVudFNlc3Npb25JRCwgVFJJR0dFUl9QTEFZKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwotICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFJlYXBEZWFkQ2xpZW50czoKLSAgICAgICAgewotICAgICAgICAgICAgbVJlYXBlclBlbmRpbmcgPSBmYWxzZTsKLQotICAgICAgICAgICAgaWYgKG1DbGllbnRTZXNzaW9uSUQgPT0gMAotICAgICAgICAgICAgICAgICAgICB8fCBtQ2xpZW50SW5mby5tUGxheWJhY2tTZXNzaW9uID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1DbGllbnRJbmZvLm1QbGF5YmFja1Nlc3Npb24tPmdldExhc3RMaWZlc2lnblVzKCkKLSAgICAgICAgICAgICAgICAgICAgKyBrUGxheWJhY2tTZXNzaW9uVGltZW91dFVzIDwgQUxvb3Blcjo6R2V0Tm93VXMoKSkgewotICAgICAgICAgICAgICAgIEFMT0dJKCJwbGF5YmFjayBzZXNzaW9uIHRpbWVkIG91dCwgcmVhcGluZy4iKTsKLQotICAgICAgICAgICAgICAgIG1OZXRTZXNzaW9uLT5kZXN0cm95U2Vzc2lvbihtQ2xpZW50U2Vzc2lvbklEKTsKLSAgICAgICAgICAgICAgICBtQ2xpZW50U2Vzc2lvbklEID0gMDsKLQotICAgICAgICAgICAgICAgIG1DbGllbnQtPm9uRGlzcGxheUVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgSVJlbW90ZURpc3BsYXlDbGllbnQ6OmtEaXNwbGF5RXJyb3JVbmtub3duKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2NoZWR1bGVSZWFwZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFBsYXliYWNrU2Vzc2lvbk5vdGlmeToKLSAgICAgICAgewotICAgICAgICAgICAgaW50MzJfdCBwbGF5YmFja1Nlc3Npb25JRDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJwbGF5YmFja1Nlc3Npb25JRCIsICZwbGF5YmFja1Nlc3Npb25JRCkpOwotCi0gICAgICAgICAgICBpbnQzMl90IHdoYXQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigid2hhdCIsICZ3aGF0KSk7Ci0KLSAgICAgICAgICAgIGlmICh3aGF0ID09IFBsYXliYWNrU2Vzc2lvbjo6a1doYXRTZXNzaW9uRGVhZCkgewotICAgICAgICAgICAgICAgIEFMT0dJKCJwbGF5YmFjayBzZXNzaW9uIHdhbnRzIHRvIHF1aXQuIik7Ci0KLSAgICAgICAgICAgICAgICBtQ2xpZW50LT5vbkRpc3BsYXlFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIElSZW1vdGVEaXNwbGF5Q2xpZW50OjprRGlzcGxheUVycm9yVW5rbm93bik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gUGxheWJhY2tTZXNzaW9uOjprV2hhdFNlc3Npb25Fc3RhYmxpc2hlZCkgewotICAgICAgICAgICAgICAgIG1QbGF5YmFja1Nlc3Npb25Fc3RhYmxpc2hlZCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICBpZiAobUNsaWVudCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbVNpbmtTdXBwb3J0c1ZpZGVvKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50LT5vbkRpc3BsYXlDb25uZWN0ZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAvLyBTdXJmYWNlVGV4dHVyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvLyB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLy8gaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVXNpbmdIRENQCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IElSZW1vdGVEaXNwbGF5Q2xpZW50OjprRGlzcGxheUZsYWdTZWN1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgd2lkdGgsIGhlaWdodDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soVmlkZW9Gb3JtYXRzOjpHZXRDb25maWd1cmF0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNob3NlblZpZGVvUmVzb2x1dGlvblR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hvc2VuVmlkZW9SZXNvbHV0aW9uSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAvKiBmcmFtZXNQZXJTZWNvbmQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIGludGVybGFjZWQgKi8pKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudC0+b25EaXNwbGF5Q29ubmVjdGVkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50SW5mby5tUGxheWJhY2tTZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmdldFN1cmZhY2VUZXh0dXJlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Vc2luZ0hEQ1AKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gSVJlbW90ZURpc3BsYXlDbGllbnQ6OmtEaXNwbGF5RmxhZ1NlY3VyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1Nlc3Npb25JRCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmaW5pc2hQbGF5KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IEFCT1VUX1RPX1BMQVkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gUExBWUlORzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gUGxheWJhY2tTZXNzaW9uOjprV2hhdFNlc3Npb25EZXN0cm95ZWQpIHsKLSAgICAgICAgICAgICAgICBkaXNjb25uZWN0Q2xpZW50MigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDSEVDS19FUSh3aGF0LCBQbGF5YmFja1Nlc3Npb246OmtXaGF0QmluYXJ5RGF0YSk7Ci0KLSAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWw7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImNoYW5uZWwiLCAmY2hhbm5lbCkpOwotCi0gICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gZGF0YTsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRCdWZmZXIoImRhdGEiLCAmZGF0YSkpOwotCi0gICAgICAgICAgICAgICAgQ0hFQ0tfTEUoY2hhbm5lbCwgMHhmZik7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfTEUoZGF0YS0+c2l6ZSgpLCAweGZmZmZ1KTsKLQotICAgICAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklEOwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzZXNzaW9uSUQiLCAmc2Vzc2lvbklEKSk7Ci0KLSAgICAgICAgICAgICAgICBjaGFyIGhlYWRlcls0XTsKLSAgICAgICAgICAgICAgICBoZWFkZXJbMF0gPSAnJCc7Ci0gICAgICAgICAgICAgICAgaGVhZGVyWzFdID0gY2hhbm5lbDsKLSAgICAgICAgICAgICAgICBoZWFkZXJbMl0gPSBkYXRhLT5zaXplKCkgPj4gODsKLSAgICAgICAgICAgICAgICBoZWFkZXJbM10gPSBkYXRhLT5zaXplKCkgJiAweGZmOwotCi0gICAgICAgICAgICAgICAgbU5ldFNlc3Npb24tPnNlbmRSZXF1ZXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklELCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKTsKLQotICAgICAgICAgICAgICAgIG1OZXRTZXNzaW9uLT5zZW5kUmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JRCwgZGF0YS0+ZGF0YSgpLCBkYXRhLT5zaXplKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0S2VlcEFsaXZlOgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JRDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzZXNzaW9uSUQiLCAmc2Vzc2lvbklEKSk7Ci0KLSAgICAgICAgICAgIGlmIChtQ2xpZW50U2Vzc2lvbklEICE9IHNlc3Npb25JRCkgewotICAgICAgICAgICAgICAgIC8vIE9ic29sZXRlIGV2ZW50LCBjbGllbnQgaXMgYWxyZWFkeSBnb25lLgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZW5kTTE2KHNlc3Npb25JRCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRUZWFyZG93blRyaWdnZXJUaW1lZE91dDoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBBV0FJVElOR19DTElFTlRfVEVBUkRPV04pIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgiVEVBUkRPV04gdHJpZ2dlciB0aW1lZCBvdXQsIGZvcmNpbmcgZGlzY29ubmVjdGlvbi4iKTsKLQotICAgICAgICAgICAgICAgIENIRUNLKG1TdG9wUmVwbHlJRCAhPSBOVUxMKTsKLSAgICAgICAgICAgICAgICBmaW5pc2hTdG9wKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRIRENQTm90aWZ5OgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IG1zZ0NvZGUsIGV4dDEsIGV4dDI7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigibXNnIiwgJm1zZ0NvZGUpKTsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJleHQxIiwgJmV4dDEpKTsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJleHQyIiwgJmV4dDIpKTsKLQotICAgICAgICAgICAgQUxPR0koIlNhdyBIRENQIG5vdGlmaWNhdGlvbiBjb2RlICVkLCBleHQxICVkLCBleHQyICVkIiwKLSAgICAgICAgICAgICAgICAgICAgbXNnQ29kZSwgZXh0MSwgZXh0Mik7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAobXNnQ29kZSkgewotICAgICAgICAgICAgICAgIGNhc2UgSERDUE1vZHVsZTo6SERDUF9JTklUSUFMSVpBVElPTl9DT01QTEVURToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1IRENQSW5pdGlhbGl6YXRpb25Db21wbGV0ZSA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TZXR1cFRyaWdnZXJEZWZlcnJlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNldHVwVHJpZ2dlckRlZmVycmVkID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRUcmlnZ2VyKG1DbGllbnRTZXNzaW9uSUQsIFRSSUdHRVJfU0VUVVApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNhc2UgSERDUE1vZHVsZTo6SERDUF9TSFVURE9XTl9DT01QTEVURToKLSAgICAgICAgICAgICAgICBjYXNlIEhEQ1BNb2R1bGU6OkhEQ1BfU0hVVERPV05fRkFJTEVEOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVWdseSBoYWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjYWxsIHRvCi0gICAgICAgICAgICAgICAgICAgIC8vIEhEQ1BPYnNlcnZlcjo6bm90aWZ5IGlzIGNvbXBsZXRlbHkgaGFuZGxlZCBiZWZvcmUKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2xlYXIgdGhlIEhEQ1AgaW5zdGFuY2UgYW5kIHVubG9hZCB0aGUgc2hhcmVkCi0gICAgICAgICAgICAgICAgICAgIC8vIGxpYnJhcnkgOigKLSAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdEZpbmlzaFN0b3AyLCB0aGlzKSktPnBvc3QoMzAwMDAwbGwpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkhEQ1AgZmFpbHVyZSwgc2h1dHRpbmcgZG93bi4iKTsKLQotICAgICAgICAgICAgICAgICAgICBtQ2xpZW50LT5vbkRpc3BsYXlFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUmVtb3RlRGlzcGxheUNsaWVudDo6a0Rpc3BsYXlFcnJvclVua25vd24pOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRGaW5pc2hTdG9wMjoKLSAgICAgICAgewotICAgICAgICAgICAgZmluaXNoU3RvcDIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgfQotfQotCi12b2lkIFdpZmlEaXNwbGF5U291cmNlOjpyZWdpc3RlclJlc3BvbnNlSGFuZGxlcigKLSAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsIGludDMyX3QgY3NlcSwgSGFuZGxlUlRTUFJlc3BvbnNlRnVuYyBmdW5jKSB7Ci0gICAgUmVzcG9uc2VJRCBpZDsKLSAgICBpZC5tU2Vzc2lvbklEID0gc2Vzc2lvbklEOwotICAgIGlkLm1DU2VxID0gY3NlcTsKLSAgICBtUmVzcG9uc2VIYW5kbGVycy5hZGQoaWQsIGZ1bmMpOwotfQotCi1zdGF0dXNfdCBXaWZpRGlzcGxheVNvdXJjZTo6c2VuZE0xKGludDMyX3Qgc2Vzc2lvbklEKSB7Ci0gICAgQVN0cmluZyByZXF1ZXN0ID0gIk9QVElPTlMgKiBSVFNQLzEuMFxyXG4iOwotICAgIEFwcGVuZENvbW1vblJlc3BvbnNlKCZyZXF1ZXN0LCBtTmV4dENTZXEpOwotCi0gICAgcmVxdWVzdC5hcHBlbmQoCi0gICAgICAgICAgICAiUmVxdWlyZTogb3JnLndmYS53ZmQxLjBcclxuIgotICAgICAgICAgICAgIlxyXG4iKTsKLQotICAgIHN0YXR1c190IGVyciA9Ci0gICAgICAgIG1OZXRTZXNzaW9uLT5zZW5kUmVxdWVzdChzZXNzaW9uSUQsIHJlcXVlc3QuY19zdHIoKSwgcmVxdWVzdC5zaXplKCkpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJlZ2lzdGVyUmVzcG9uc2VIYW5kbGVyKAotICAgICAgICAgICAgc2Vzc2lvbklELCBtTmV4dENTZXEsICZXaWZpRGlzcGxheVNvdXJjZTo6b25SZWNlaXZlTTFSZXNwb25zZSk7Ci0KLSAgICArK21OZXh0Q1NlcTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6OnNlbmRNMyhpbnQzMl90IHNlc3Npb25JRCkgewotICAgIEFTdHJpbmcgYm9keSA9Ci0gICAgICAgICJ3ZmRfY29udGVudF9wcm90ZWN0aW9uXHJcbiIKLSAgICAgICAgIndmZF92aWRlb19mb3JtYXRzXHJcbiIKLSAgICAgICAgIndmZF9hdWRpb19jb2RlY3NcclxuIgotICAgICAgICAid2ZkX2NsaWVudF9ydHBfcG9ydHNcclxuIjsKLQotICAgIEFTdHJpbmcgcmVxdWVzdCA9ICJHRVRfUEFSQU1FVEVSIHJ0c3A6Ly9sb2NhbGhvc3Qvd2ZkMS4wIFJUU1AvMS4wXHJcbiI7Ci0gICAgQXBwZW5kQ29tbW9uUmVzcG9uc2UoJnJlcXVlc3QsIG1OZXh0Q1NlcSk7Ci0KLSAgICByZXF1ZXN0LmFwcGVuZCgiQ29udGVudC1UeXBlOiB0ZXh0L3BhcmFtZXRlcnNcclxuIik7Ci0gICAgcmVxdWVzdC5hcHBlbmQoQVN0cmluZ1ByaW50ZigiQ29udGVudC1MZW5ndGg6ICVkXHJcbiIsIGJvZHkuc2l6ZSgpKSk7Ci0gICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKLSAgICByZXF1ZXN0LmFwcGVuZChib2R5KTsKLQotICAgIHN0YXR1c190IGVyciA9Ci0gICAgICAgIG1OZXRTZXNzaW9uLT5zZW5kUmVxdWVzdChzZXNzaW9uSUQsIHJlcXVlc3QuY19zdHIoKSwgcmVxdWVzdC5zaXplKCkpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJlZ2lzdGVyUmVzcG9uc2VIYW5kbGVyKAotICAgICAgICAgICAgc2Vzc2lvbklELCBtTmV4dENTZXEsICZXaWZpRGlzcGxheVNvdXJjZTo6b25SZWNlaXZlTTNSZXNwb25zZSk7Ci0KLSAgICArK21OZXh0Q1NlcTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6OnNlbmRNNChpbnQzMl90IHNlc3Npb25JRCkgewotICAgIENIRUNLX0VRKHNlc3Npb25JRCwgbUNsaWVudFNlc3Npb25JRCk7Ci0KLSAgICBBU3RyaW5nIGJvZHk7Ci0KLSAgICBpZiAobVNpbmtTdXBwb3J0c1ZpZGVvKSB7Ci0gICAgICAgIGJvZHkuYXBwZW5kKCJ3ZmRfdmlkZW9fZm9ybWF0czogIik7Ci0KLSAgICAgICAgVmlkZW9Gb3JtYXRzIGNob3NlblZpZGVvRm9ybWF0OwotICAgICAgICBjaG9zZW5WaWRlb0Zvcm1hdC5kaXNhYmxlQWxsKCk7Ci0gICAgICAgIGNob3NlblZpZGVvRm9ybWF0LnNldE5hdGl2ZVJlc29sdXRpb24oCi0gICAgICAgICAgICAgICAgbUNob3NlblZpZGVvUmVzb2x1dGlvblR5cGUsIG1DaG9zZW5WaWRlb1Jlc29sdXRpb25JbmRleCk7Ci0gICAgICAgIGNob3NlblZpZGVvRm9ybWF0LnNldFByb2ZpbGVMZXZlbCgKLSAgICAgICAgICAgICAgICBtQ2hvc2VuVmlkZW9SZXNvbHV0aW9uVHlwZSwgbUNob3NlblZpZGVvUmVzb2x1dGlvbkluZGV4LAotICAgICAgICAgICAgICAgIG1DaG9zZW5WaWRlb1Byb2ZpbGUsIG1DaG9zZW5WaWRlb0xldmVsKTsKLQotICAgICAgICBib2R5LmFwcGVuZChjaG9zZW5WaWRlb0Zvcm1hdC5nZXRGb3JtYXRTcGVjKHRydWUgLyogZm9yTTRNZXNzYWdlICovKSk7Ci0gICAgICAgIGJvZHkuYXBwZW5kKCJcclxuIik7Ci0gICAgfQotCi0gICAgaWYgKG1TaW5rU3VwcG9ydHNBdWRpbykgewotICAgICAgICBib2R5LmFwcGVuZCgKLSAgICAgICAgICAgICAgICBBU3RyaW5nUHJpbnRmKCJ3ZmRfYXVkaW9fY29kZWNzOiAlc1xyXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVVzaW5nUENNQXVkaW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiTFBDTSAwMDAwMDAwMiAwMCIgLy8gMiBjaCBQQ00gNDhrSHoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiQUFDIDAwMDAwMDAxIDAwIikpKTsgIC8vIDIgY2ggQUFDIDQ4a0h6Ci0gICAgfQotCi0gICAgYm9keS5hcHBlbmQoCi0gICAgICAgICAgICBBU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICJ3ZmRfcHJlc2VudGF0aW9uX1VSTDogcnRzcDovLyVzL3dmZDEuMC9zdHJlYW1pZD0wIG5vbmVcclxuIiwKLSAgICAgICAgICAgICAgICBtQ2xpZW50SW5mby5tTG9jYWxJUC5jX3N0cigpKSk7Ci0KLSAgICBib2R5LmFwcGVuZCgKLSAgICAgICAgICAgIEFTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgIndmZF9jbGllbnRfcnRwX3BvcnRzOiAlc1xyXG4iLCBtV2ZkQ2xpZW50UnRwUG9ydHMuY19zdHIoKSkpOwotCi0gICAgQVN0cmluZyByZXF1ZXN0ID0gIlNFVF9QQVJBTUVURVIgcnRzcDovL2xvY2FsaG9zdC93ZmQxLjAgUlRTUC8xLjBcclxuIjsKLSAgICBBcHBlbmRDb21tb25SZXNwb25zZSgmcmVxdWVzdCwgbU5leHRDU2VxKTsKLQotICAgIHJlcXVlc3QuYXBwZW5kKCJDb250ZW50LVR5cGU6IHRleHQvcGFyYW1ldGVyc1xyXG4iKTsKLSAgICByZXF1ZXN0LmFwcGVuZChBU3RyaW5nUHJpbnRmKCJDb250ZW50LUxlbmd0aDogJWRcclxuIiwgYm9keS5zaXplKCkpKTsKLSAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwotICAgIHJlcXVlc3QuYXBwZW5kKGJvZHkpOwotCi0gICAgc3RhdHVzX3QgZXJyID0KLSAgICAgICAgbU5ldFNlc3Npb24tPnNlbmRSZXF1ZXN0KHNlc3Npb25JRCwgcmVxdWVzdC5jX3N0cigpLCByZXF1ZXN0LnNpemUoKSk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmVnaXN0ZXJSZXNwb25zZUhhbmRsZXIoCi0gICAgICAgICAgICBzZXNzaW9uSUQsIG1OZXh0Q1NlcSwgJldpZmlEaXNwbGF5U291cmNlOjpvblJlY2VpdmVNNFJlc3BvbnNlKTsKLQotICAgICsrbU5leHRDU2VxOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBXaWZpRGlzcGxheVNvdXJjZTo6c2VuZFRyaWdnZXIoCi0gICAgICAgIGludDMyX3Qgc2Vzc2lvbklELCBUcmlnZ2VyVHlwZSB0cmlnZ2VyVHlwZSkgewotICAgIEFTdHJpbmcgYm9keSA9ICJ3ZmRfdHJpZ2dlcl9tZXRob2Q6ICI7Ci0gICAgc3dpdGNoICh0cmlnZ2VyVHlwZSkgewotICAgICAgICBjYXNlIFRSSUdHRVJfU0VUVVA6Ci0gICAgICAgICAgICBib2R5LmFwcGVuZCgiU0VUVVAiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRSSUdHRVJfVEVBUkRPV046Ci0gICAgICAgICAgICBBTE9HSSgiU2VuZGluZyBURUFSRE9XTiB0cmlnZ2VyLiIpOwotICAgICAgICAgICAgYm9keS5hcHBlbmQoIlRFQVJET1dOIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUUklHR0VSX1BBVVNFOgotICAgICAgICAgICAgYm9keS5hcHBlbmQoIlBBVVNFIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUUklHR0VSX1BMQVk6Ci0gICAgICAgICAgICBib2R5LmFwcGVuZCgiUExBWSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBUUkVTUEFTUygpOwotICAgIH0KLQotICAgIGJvZHkuYXBwZW5kKCJcclxuIik7Ci0KLSAgICBBU3RyaW5nIHJlcXVlc3QgPSAiU0VUX1BBUkFNRVRFUiBydHNwOi8vbG9jYWxob3N0L3dmZDEuMCBSVFNQLzEuMFxyXG4iOwotICAgIEFwcGVuZENvbW1vblJlc3BvbnNlKCZyZXF1ZXN0LCBtTmV4dENTZXEpOwotCi0gICAgcmVxdWVzdC5hcHBlbmQoIkNvbnRlbnQtVHlwZTogdGV4dC9wYXJhbWV0ZXJzXHJcbiIpOwotICAgIHJlcXVlc3QuYXBwZW5kKEFTdHJpbmdQcmludGYoIkNvbnRlbnQtTGVuZ3RoOiAlZFxyXG4iLCBib2R5LnNpemUoKSkpOwotICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7Ci0gICAgcmVxdWVzdC5hcHBlbmQoYm9keSk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPQotICAgICAgICBtTmV0U2Vzc2lvbi0+c2VuZFJlcXVlc3Qoc2Vzc2lvbklELCByZXF1ZXN0LmNfc3RyKCksIHJlcXVlc3Quc2l6ZSgpKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZWdpc3RlclJlc3BvbnNlSGFuZGxlcigKLSAgICAgICAgICAgIHNlc3Npb25JRCwgbU5leHRDU2VxLCAmV2lmaURpc3BsYXlTb3VyY2U6Om9uUmVjZWl2ZU01UmVzcG9uc2UpOwotCi0gICAgKyttTmV4dENTZXE7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFdpZmlEaXNwbGF5U291cmNlOjpzZW5kTTE2KGludDMyX3Qgc2Vzc2lvbklEKSB7Ci0gICAgQVN0cmluZyByZXF1ZXN0ID0gIkdFVF9QQVJBTUVURVIgcnRzcDovL2xvY2FsaG9zdC93ZmQxLjAgUlRTUC8xLjBcclxuIjsKLSAgICBBcHBlbmRDb21tb25SZXNwb25zZSgmcmVxdWVzdCwgbU5leHRDU2VxKTsKLQotICAgIENIRUNLX0VRKHNlc3Npb25JRCwgbUNsaWVudFNlc3Npb25JRCk7Ci0gICAgcmVxdWVzdC5hcHBlbmQoCi0gICAgICAgICAgICBBU3RyaW5nUHJpbnRmKCJTZXNzaW9uOiAlZFxyXG4iLCBtQ2xpZW50SW5mby5tUGxheWJhY2tTZXNzaW9uSUQpKTsKLSAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOyAgLy8gRW1wdHkgYm9keQotCi0gICAgc3RhdHVzX3QgZXJyID0KLSAgICAgICAgbU5ldFNlc3Npb24tPnNlbmRSZXF1ZXN0KHNlc3Npb25JRCwgcmVxdWVzdC5jX3N0cigpLCByZXF1ZXN0LnNpemUoKSk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmVnaXN0ZXJSZXNwb25zZUhhbmRsZXIoCi0gICAgICAgICAgICBzZXNzaW9uSUQsIG1OZXh0Q1NlcSwgJldpZmlEaXNwbGF5U291cmNlOjpvblJlY2VpdmVNMTZSZXNwb25zZSk7Ci0KLSAgICArK21OZXh0Q1NlcTsKLQotICAgIHNjaGVkdWxlS2VlcEFsaXZlKHNlc3Npb25JRCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFdpZmlEaXNwbGF5U291cmNlOjpvblJlY2VpdmVNMVJlc3BvbnNlKAotICAgICAgICBpbnQzMl90IC8qIHNlc3Npb25JRCAqLywgY29uc3Qgc3A8UGFyc2VkTWVzc2FnZT4gJm1zZykgewotICAgIGludDMyX3Qgc3RhdHVzQ29kZTsKLSAgICBpZiAoIW1zZy0+Z2V0U3RhdHVzQ29kZSgmc3RhdHVzQ29kZSkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdHVzQ29kZSAhPSAyMDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotLy8gc2lua19hdWRpb19saXN0IDo9ICgiTFBDTSJ8IkFBQyJ8IkFDMyIgSEVYRElHSVQqOCBIRVhESUdJVCoyKQotLy8gICAgICAgICAgICAgICAgICAgICAgICgiLCAiIHNpbmtfYXVkaW9fbGlzdCkqCi1zdGF0aWMgdm9pZCBHZXRBdWRpb01vZGVzKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnByZWZpeCwgdWludDMyX3QgKm1vZGVzKSB7Ci0gICAgKm1vZGVzID0gMDsKLQotICAgIHNpemVfdCBwcmVmaXhMZW4gPSBzdHJsZW4ocHJlZml4KTsKLQotICAgIHdoaWxlICgqcyAhPSAnMCcpIHsKLSAgICAgICAgaWYgKCFzdHJuY21wKHMsIHByZWZpeCwgcHJlZml4TGVuKSAmJiBzW3ByZWZpeExlbl0gPT0gJyAnKSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBsYXRlbmN5OwotICAgICAgICAgICAgaWYgKHNzY2FuZigmc1twcmVmaXhMZW4gKyAxXSwgIiUwOHggJTAyeCIsIG1vZGVzLCAmbGF0ZW5jeSkgIT0gMikgewotICAgICAgICAgICAgICAgICptb2RlcyA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IGNoYXIgKmNvbW1hUG9zID0gc3RyY2hyKHMsICcsJyk7Ci0gICAgICAgIGlmIChjb21tYVBvcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBzID0gY29tbWFQb3MgKyAxOwotCi0gICAgICAgICAgICB3aGlsZSAoaXNzcGFjZSgqcykpIHsKLSAgICAgICAgICAgICAgICArK3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6Om9uUmVjZWl2ZU0zUmVzcG9uc2UoCi0gICAgICAgIGludDMyX3Qgc2Vzc2lvbklELCBjb25zdCBzcDxQYXJzZWRNZXNzYWdlPiAmbXNnKSB7Ci0gICAgaW50MzJfdCBzdGF0dXNDb2RlOwotICAgIGlmICghbXNnLT5nZXRTdGF0dXNDb2RlKCZzdGF0dXNDb2RlKSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmIChzdGF0dXNDb2RlICE9IDIwMCkgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgc3A8UGFyYW1ldGVycz4gcGFyYW1zID0KLSAgICAgICAgUGFyYW1ldGVyczo6UGFyc2UobXNnLT5nZXRDb250ZW50KCksIHN0cmxlbihtc2ctPmdldENvbnRlbnQoKSkpOwotCi0gICAgaWYgKHBhcmFtcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgQVN0cmluZyB2YWx1ZTsKLSAgICBpZiAoIXBhcmFtcy0+ZmluZFBhcmFtZXRlcigid2ZkX2NsaWVudF9ydHBfcG9ydHMiLCAmdmFsdWUpKSB7Ci0gICAgICAgIEFMT0dFKCJTaW5rIGRvZXNuJ3QgcmVwb3J0IGl0cyBjaG9pY2Ugb2Ygd2ZkX2NsaWVudF9ydHBfcG9ydHMuIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgdW5zaWduZWQgcG9ydDAgPSAwLCBwb3J0MSA9IDA7Ci0gICAgaWYgKHNzY2FuZih2YWx1ZS5jX3N0cigpLAotICAgICAgICAgICAgICAgIlJUUC9BVlAvVURQO3VuaWNhc3QgJXUgJXUgbW9kZT1wbGF5IiwKLSAgICAgICAgICAgICAgICZwb3J0MCwKLSAgICAgICAgICAgICAgICZwb3J0MSkgPT0gMgotICAgICAgICB8fCBzc2NhbmYodmFsdWUuY19zdHIoKSwKLSAgICAgICAgICAgICAgICJSVFAvQVZQL1RDUDt1bmljYXN0ICV1ICV1IG1vZGU9cGxheSIsCi0gICAgICAgICAgICAgICAmcG9ydDAsCi0gICAgICAgICAgICAgICAmcG9ydDEpID09IDIpIHsKLSAgICAgICAgICAgIGlmIChwb3J0MCA9PSAwIHx8IHBvcnQwID4gNjU1MzUgfHwgcG9ydDEgIT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJTaW5rIGNob3NlIGl0cyB3ZmRfY2xpZW50X3J0cF9wb3J0cyBwb29ybHkgKCVzKSIsCi0gICAgICAgICAgICAgICAgICAgICAgdmFsdWUuY19zdHIoKSk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoc3RyY21wKHZhbHVlLmNfc3RyKCksICJSVFAvQVZQL1RDUDtpbnRlcmxlYXZlZCBtb2RlPXBsYXkiKSkgewotICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgdmFsdWUgZm9yIHdmZF9jbGllbnRfcnRwX3BvcnRzICglcykiLAotICAgICAgICAgICAgICB2YWx1ZS5jX3N0cigpKTsKLQotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgbVdmZENsaWVudFJ0cFBvcnRzID0gdmFsdWU7Ci0gICAgbUNob3NlblJUUFBvcnQgPSBwb3J0MDsKLQotICAgIGlmICghcGFyYW1zLT5maW5kUGFyYW1ldGVyKCJ3ZmRfdmlkZW9fZm9ybWF0cyIsICZ2YWx1ZSkpIHsKLSAgICAgICAgQUxPR0UoIlNpbmsgZG9lc24ndCByZXBvcnQgaXRzIGNob2ljZSBvZiB3ZmRfdmlkZW9fZm9ybWF0cy4iKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBtU2lua1N1cHBvcnRzVmlkZW8gPSBmYWxzZTsKLQotICAgIGlmICAoISh2YWx1ZSA9PSAibm9uZSIpKSB7Ci0gICAgICAgIG1TaW5rU3VwcG9ydHNWaWRlbyA9IHRydWU7Ci0gICAgICAgIGlmICghbVN1cHBvcnRlZFNpbmtWaWRlb0Zvcm1hdHMucGFyc2VGb3JtYXRTcGVjKHZhbHVlLmNfc3RyKCkpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHBhcnNlIHNpbmsgcHJvdmlkZWQgd2ZkX3ZpZGVvX2Zvcm1hdHMgKCVzKSIsCi0gICAgICAgICAgICAgICAgICB2YWx1ZS5jX3N0cigpKTsKLQotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghVmlkZW9Gb3JtYXRzOjpQaWNrQmVzdEZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgbVN1cHBvcnRlZFNpbmtWaWRlb0Zvcm1hdHMsCi0gICAgICAgICAgICAgICAgICAgIG1TdXBwb3J0ZWRTb3VyY2VWaWRlb0Zvcm1hdHMsCi0gICAgICAgICAgICAgICAgICAgICZtQ2hvc2VuVmlkZW9SZXNvbHV0aW9uVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgJm1DaG9zZW5WaWRlb1Jlc29sdXRpb25JbmRleCwKLSAgICAgICAgICAgICAgICAgICAgJm1DaG9zZW5WaWRlb1Byb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICZtQ2hvc2VuVmlkZW9MZXZlbCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJTaW5rIGFuZCBzb3VyY2Ugc2hhcmUgbm8gY29tbW9ubHkgc3VwcG9ydGVkIHZpZGVvICIKLSAgICAgICAgICAgICAgICAgICJmb3JtYXRzLiIpOwotCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3Qgd2lkdGgsIGhlaWdodCwgZnJhbWVzUGVyU2Vjb25kOwotICAgICAgICBib29sIGludGVybGFjZWQ7Ci0gICAgICAgIENIRUNLKFZpZGVvRm9ybWF0czo6R2V0Q29uZmlndXJhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgbUNob3NlblZpZGVvUmVzb2x1dGlvblR5cGUsCi0gICAgICAgICAgICAgICAgICAgIG1DaG9zZW5WaWRlb1Jlc29sdXRpb25JbmRleCwKLSAgICAgICAgICAgICAgICAgICAgJndpZHRoLAotICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAmZnJhbWVzUGVyU2Vjb25kLAotICAgICAgICAgICAgICAgICAgICAmaW50ZXJsYWNlZCkpOwotCi0gICAgICAgIEFMT0dJKCJQaWNrZWQgdmlkZW8gcmVzb2x1dGlvbiAlenUgeCAlenUgJWMlenUiLAotICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBpbnRlcmxhY2VkID8gJ2knIDogJ3AnLCBmcmFtZXNQZXJTZWNvbmQpOwotCi0gICAgICAgIEFMT0dJKCJQaWNrZWQgQVZDIHByb2ZpbGUgJWQsIGxldmVsICVkIiwKLSAgICAgICAgICAgICAgbUNob3NlblZpZGVvUHJvZmlsZSwgbUNob3NlblZpZGVvTGV2ZWwpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dJKCJTaW5rIGRvZXNuJ3Qgc3VwcG9ydCB2aWRlbyBhdCBhbGwuIik7Ci0gICAgfQotCi0gICAgaWYgKCFwYXJhbXMtPmZpbmRQYXJhbWV0ZXIoIndmZF9hdWRpb19jb2RlY3MiLCAmdmFsdWUpKSB7Ci0gICAgICAgIEFMT0dFKCJTaW5rIGRvZXNuJ3QgcmVwb3J0IGl0cyBjaG9pY2Ugb2Ygd2ZkX2F1ZGlvX2NvZGVjcy4iKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBtU2lua1N1cHBvcnRzQXVkaW8gPSBmYWxzZTsKLQotICAgIGlmICAoISh2YWx1ZSA9PSAibm9uZSIpKSB7Ci0gICAgICAgIG1TaW5rU3VwcG9ydHNBdWRpbyA9IHRydWU7Ci0KLSAgICAgICAgdWludDMyX3QgbW9kZXM7Ci0gICAgICAgIEdldEF1ZGlvTW9kZXModmFsdWUuY19zdHIoKSwgIkFBQyIsICZtb2Rlcyk7Ci0KLSAgICAgICAgYm9vbCBzdXBwb3J0c0FBQyA9IChtb2RlcyAmIDEpICE9IDA7ICAvLyBBQUMgMmNoIDQ4a0h6Ci0KLSAgICAgICAgR2V0QXVkaW9Nb2Rlcyh2YWx1ZS5jX3N0cigpLCAiTFBDTSIsICZtb2Rlcyk7Ci0KLSAgICAgICAgYm9vbCBzdXBwb3J0c1BDTSA9IChtb2RlcyAmIDIpICE9IDA7ICAvLyBMUENNIDJjaCA0OGtIegotCi0gICAgICAgIGlmIChzdXBwb3J0c1BDTQotICAgICAgICAgICAgICAgICYmIHByb3BlcnR5X2dldF9ib29sKCJtZWRpYS53ZmQudXNlLXBjbS1hdWRpbyIsIGZhbHNlKSkgewotICAgICAgICAgICAgQUxPR0koIlVzaW5nIFBDTSBhdWRpby4iKTsKLSAgICAgICAgICAgIG1Vc2luZ1BDTUF1ZGlvID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChzdXBwb3J0c0FBQykgewotICAgICAgICAgICAgQUxPR0koIlVzaW5nIEFBQyBhdWRpby4iKTsKLSAgICAgICAgICAgIG1Vc2luZ1BDTUF1ZGlvID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydHNQQ00pIHsKLSAgICAgICAgICAgIEFMT0dJKCJVc2luZyBQQ00gYXVkaW8uIik7Ci0gICAgICAgICAgICBtVXNpbmdQQ01BdWRpbyA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HSSgiU2luayBkb2Vzbid0IHN1cHBvcnQgYW4gYXVkaW8gZm9ybWF0IHdlIGRvLiIpOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0koIlNpbmsgZG9lc24ndCBzdXBwb3J0IGF1ZGlvIGF0IGFsbC4iKTsKLSAgICB9Ci0KLSAgICBpZiAoIW1TaW5rU3VwcG9ydHNWaWRlbyAmJiAhbVNpbmtTdXBwb3J0c0F1ZGlvKSB7Ci0gICAgICAgIEFMT0dFKCJTaW5rIHN1cHBvcnRzIG5laXRoZXIgdmlkZW8gbm9yIGF1ZGlvLi4uIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBtVXNpbmdIRENQID0gZmFsc2U7Ci0gICAgaWYgKCFwYXJhbXMtPmZpbmRQYXJhbWV0ZXIoIndmZF9jb250ZW50X3Byb3RlY3Rpb24iLCAmdmFsdWUpKSB7Ci0gICAgICAgIEFMT0dJKCJTaW5rIGRvZXNuJ3QgYXBwZWFyIHRvIHN1cHBvcnQgY29udGVudCBwcm90ZWN0aW9uLiIpOwotICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gIm5vbmUiKSB7Ci0gICAgICAgIEFMT0dJKCJTaW5rIGRvZXMgbm90IHN1cHBvcnQgY29udGVudCBwcm90ZWN0aW9uLiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1Vc2luZ0hEQ1AgPSB0cnVlOwotCi0gICAgICAgIGJvb2wgaXNIRENQMl8wID0gZmFsc2U7Ci0gICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCJIRENQMi4wICIpKSB7Ci0gICAgICAgICAgICBpc0hEQ1AyXzAgPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKCF2YWx1ZS5zdGFydHNXaXRoKCJIRENQMi4xICIpKSB7Ci0gICAgICAgICAgICBBTE9HRSgibWFsZm9ybWVkIHdmZF9jb250ZW50X3Byb3RlY3Rpb246ICclcyciLCB2YWx1ZS5jX3N0cigpKTsKLQotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIGludDMyX3QgaGRjcFBvcnQ7Ci0gICAgICAgIGlmICghUGFyc2VkTWVzc2FnZTo6R2V0SW50MzJBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlLmNfc3RyKCkgKyA4LCAicG9ydCIsICZoZGNwUG9ydCkKLSAgICAgICAgICAgICAgICB8fCBoZGNwUG9ydCA8IDEgfHwgaGRjcFBvcnQgPiA2NTUzNSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIG1Jc0hEQ1AyXzAgPSBpc0hEQ1AyXzA7Ci0gICAgICAgIG1IRENQUG9ydCA9IGhkY3BQb3J0OwotCi0gICAgICAgIHN0YXR1c190IGVyciA9IG1ha2VIRENQKCk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgSERDUCBjb21wb25lbnQuICIKLSAgICAgICAgICAgICAgICAgICJOb3QgdXNpbmcgSERDUCBhZnRlciBhbGwuIik7Ci0KLSAgICAgICAgICAgIG1Vc2luZ0hEQ1AgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBzZW5kTTQoc2Vzc2lvbklEKTsKLX0KLQotc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6Om9uUmVjZWl2ZU00UmVzcG9uc2UoCi0gICAgICAgIGludDMyX3Qgc2Vzc2lvbklELCBjb25zdCBzcDxQYXJzZWRNZXNzYWdlPiAmbXNnKSB7Ci0gICAgaW50MzJfdCBzdGF0dXNDb2RlOwotICAgIGlmICghbXNnLT5nZXRTdGF0dXNDb2RlKCZzdGF0dXNDb2RlKSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmIChzdGF0dXNDb2RlICE9IDIwMCkgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgaWYgKG1Vc2luZ0hEQ1AgJiYgIW1IRENQSW5pdGlhbGl6YXRpb25Db21wbGV0ZSkgewotICAgICAgICBBTE9HSSgiRGVmZXJyaW5nIFNFVFVQIHRyaWdnZXIgdW50aWwgSERDUCBpbml0aWFsaXphdGlvbiBjb21wbGV0ZXMuIik7Ci0KLSAgICAgICAgbVNldHVwVHJpZ2dlckRlZmVycmVkID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHJldHVybiBzZW5kVHJpZ2dlcihzZXNzaW9uSUQsIFRSSUdHRVJfU0VUVVApOwotfQotCi1zdGF0dXNfdCBXaWZpRGlzcGxheVNvdXJjZTo6b25SZWNlaXZlTTVSZXNwb25zZSgKLSAgICAgICAgaW50MzJfdCAvKiBzZXNzaW9uSUQgKi8sIGNvbnN0IHNwPFBhcnNlZE1lc3NhZ2U+ICZtc2cpIHsKLSAgICBpbnQzMl90IHN0YXR1c0NvZGU7Ci0gICAgaWYgKCFtc2ctPmdldFN0YXR1c0NvZGUoJnN0YXR1c0NvZGUpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKHN0YXR1c0NvZGUgIT0gMjAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFdpZmlEaXNwbGF5U291cmNlOjpvblJlY2VpdmVNMTZSZXNwb25zZSgKLSAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsIGNvbnN0IHNwPFBhcnNlZE1lc3NhZ2U+ICYgLyogbXNnICovKSB7Ci0gICAgLy8gSWYgb25seSB0aGUgcmVzcG9uc2Ugd2FzIHJlcXVpcmVkIHRvIGluY2x1ZGUgYSAiU2Vzc2lvbjoiIGhlYWRlci4uLgotCi0gICAgQ0hFQ0tfRVEoc2Vzc2lvbklELCBtQ2xpZW50U2Vzc2lvbklEKTsKLQotICAgIGlmIChtQ2xpZW50SW5mby5tUGxheWJhY2tTZXNzaW9uICE9IE5VTEwpIHsKLSAgICAgICAgbUNsaWVudEluZm8ubVBsYXliYWNrU2Vzc2lvbi0+dXBkYXRlTGl2ZW5lc3MoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgV2lmaURpc3BsYXlTb3VyY2U6OnNjaGVkdWxlUmVhcGVyKCkgewotICAgIGlmIChtUmVhcGVyUGVuZGluZykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbVJlYXBlclBlbmRpbmcgPSB0cnVlOwotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZWFwRGVhZENsaWVudHMsIHRoaXMpKS0+cG9zdChrUmVhcGVySW50ZXJ2YWxVcyk7Ci19Ci0KLXZvaWQgV2lmaURpc3BsYXlTb3VyY2U6OnNjaGVkdWxlS2VlcEFsaXZlKGludDMyX3Qgc2Vzc2lvbklEKSB7Ci0gICAgLy8gV2UgbmVlZCB0byBzZW5kIHVwZGF0ZXMgYXQgbGVhc3QgNSBzZWNzIGJlZm9yZSB0aGUgdGltZW91dCBpcyBzZXQgdG8KLSAgICAvLyBleHBpcmUsIG1ha2Ugc3VyZSB0aGUgdGltZW91dCBpcyBncmVhdGVyIHRoYW4gNSBzZWNzIHRvIGJlZ2luIHdpdGguCi0gICAgQ0hFQ0tfR1Qoa1BsYXliYWNrU2Vzc2lvblRpbWVvdXRVcywgNTAwMDAwMGxsKTsKLQotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRLZWVwQWxpdmUsIHRoaXMpOwotICAgIG1zZy0+c2V0SW50MzIoInNlc3Npb25JRCIsIHNlc3Npb25JRCk7Ci0gICAgbXNnLT5wb3N0KGtQbGF5YmFja1Nlc3Npb25UaW1lb3V0VXMgLSA1MDAwMDAwbGwpOwotfQotCi1zdGF0dXNfdCBXaWZpRGlzcGxheVNvdXJjZTo6b25SZWNlaXZlQ2xpZW50RGF0YShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewotICAgIGludDMyX3Qgc2Vzc2lvbklEOwotICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzZXNzaW9uSUQiLCAmc2Vzc2lvbklEKSk7Ci0KLSAgICBzcDxSZWZCYXNlPiBvYmo7Ci0gICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJkYXRhIiwgJm9iaikpOwotCi0gICAgc3A8UGFyc2VkTWVzc2FnZT4gZGF0YSA9Ci0gICAgICAgIHN0YXRpY19jYXN0PFBhcnNlZE1lc3NhZ2UgKj4ob2JqLmdldCgpKTsKLQotICAgIEFMT0dWKCJzZXNzaW9uICVkIHJlY2VpdmVkICclcyciLAotICAgICAgICAgIHNlc3Npb25JRCwgZGF0YS0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKLQotICAgIEFTdHJpbmcgbWV0aG9kOwotICAgIEFTdHJpbmcgdXJpOwotICAgIGRhdGEtPmdldFJlcXVlc3RGaWVsZCgwLCAmbWV0aG9kKTsKLQotICAgIGludDMyX3QgY3NlcTsKLSAgICBpZiAoIWRhdGEtPmZpbmRJbnQzMigiY3NlcSIsICZjc2VxKSkgewotICAgICAgICBzZW5kRXJyb3JSZXNwb25zZShzZXNzaW9uSUQsICI0MDAgQmFkIFJlcXVlc3QiLCAtMSAvKiBjc2VxICovKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAobWV0aG9kLnN0YXJ0c1dpdGgoIlJUU1AvIikpIHsKLSAgICAgICAgLy8gVGhpcyBpcyBhIHJlc3BvbnNlLgotCi0gICAgICAgIFJlc3BvbnNlSUQgaWQ7Ci0gICAgICAgIGlkLm1TZXNzaW9uSUQgPSBzZXNzaW9uSUQ7Ci0gICAgICAgIGlkLm1DU2VxID0gY3NlcTsKLQotICAgICAgICBzc2l6ZV90IGluZGV4ID0gbVJlc3BvbnNlSGFuZGxlcnMuaW5kZXhPZktleShpZCk7Ci0KLSAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgQUxPR1coIlJlY2VpdmVkIHVuc29saWNpdGVkIHNlcnZlciByZXNwb25zZSwgY3NlcSAlZCIsIGNzZXEpOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIEhhbmRsZVJUU1BSZXNwb25zZUZ1bmMgZnVuYyA9IG1SZXNwb25zZUhhbmRsZXJzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICBtUmVzcG9uc2VIYW5kbGVycy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKLQotICAgICAgICBzdGF0dXNfdCBlcnIgPSAodGhpcy0+KmZ1bmMpKHNlc3Npb25JRCwgZGF0YSk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR1coIlJlc3BvbnNlIGhhbmRsZXIgZm9yIHNlc3Npb24gJWQsIGNzZXEgJWQgcmV0dXJuZWQgIgotICAgICAgICAgICAgICAgICAgImVyciAlZCAoJXMpIiwKLSAgICAgICAgICAgICAgICAgIHNlc3Npb25JRCwgY3NlcSwgZXJyLCBzdHJlcnJvcigtZXJyKSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgQVN0cmluZyB2ZXJzaW9uOwotICAgIGRhdGEtPmdldFJlcXVlc3RGaWVsZCgyLCAmdmVyc2lvbik7Ci0gICAgaWYgKCEodmVyc2lvbiA9PSBBU3RyaW5nKCJSVFNQLzEuMCIpKSkgewotICAgICAgICBzZW5kRXJyb3JSZXNwb25zZShzZXNzaW9uSUQsICI1MDUgUlRTUCBWZXJzaW9uIG5vdCBzdXBwb3J0ZWQiLCBjc2VxKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHN0YXR1c190IGVycjsKLSAgICBpZiAobWV0aG9kID09ICJPUFRJT05TIikgewotICAgICAgICBlcnIgPSBvbk9wdGlvbnNSZXF1ZXN0KHNlc3Npb25JRCwgY3NlcSwgZGF0YSk7Ci0gICAgfSBlbHNlIGlmIChtZXRob2QgPT0gIlNFVFVQIikgewotICAgICAgICBlcnIgPSBvblNldHVwUmVxdWVzdChzZXNzaW9uSUQsIGNzZXEsIGRhdGEpOwotICAgIH0gZWxzZSBpZiAobWV0aG9kID09ICJQTEFZIikgewotICAgICAgICBlcnIgPSBvblBsYXlSZXF1ZXN0KHNlc3Npb25JRCwgY3NlcSwgZGF0YSk7Ci0gICAgfSBlbHNlIGlmIChtZXRob2QgPT0gIlBBVVNFIikgewotICAgICAgICBlcnIgPSBvblBhdXNlUmVxdWVzdChzZXNzaW9uSUQsIGNzZXEsIGRhdGEpOwotICAgIH0gZWxzZSBpZiAobWV0aG9kID09ICJURUFSRE9XTiIpIHsKLSAgICAgICAgZXJyID0gb25UZWFyZG93blJlcXVlc3Qoc2Vzc2lvbklELCBjc2VxLCBkYXRhKTsKLSAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PSAiR0VUX1BBUkFNRVRFUiIpIHsKLSAgICAgICAgZXJyID0gb25HZXRQYXJhbWV0ZXJSZXF1ZXN0KHNlc3Npb25JRCwgY3NlcSwgZGF0YSk7Ci0gICAgfSBlbHNlIGlmIChtZXRob2QgPT0gIlNFVF9QQVJBTUVURVIiKSB7Ci0gICAgICAgIGVyciA9IG9uU2V0UGFyYW1ldGVyUmVxdWVzdChzZXNzaW9uSUQsIGNzZXEsIGRhdGEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNlbmRFcnJvclJlc3BvbnNlKHNlc3Npb25JRCwgIjQwNSBNZXRob2QgTm90IEFsbG93ZWQiLCBjc2VxKTsKLQotICAgICAgICBlcnIgPSBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBXaWZpRGlzcGxheVNvdXJjZTo6b25PcHRpb25zUmVxdWVzdCgKLSAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsCi0gICAgICAgIGludDMyX3QgY3NlcSwKLSAgICAgICAgY29uc3Qgc3A8UGFyc2VkTWVzc2FnZT4gJmRhdGEpIHsKLSAgICBpbnQzMl90IHBsYXliYWNrU2Vzc2lvbklEOwotICAgIHNwPFBsYXliYWNrU2Vzc2lvbj4gcGxheWJhY2tTZXNzaW9uID0KLSAgICAgICAgZmluZFBsYXliYWNrU2Vzc2lvbihkYXRhLCAmcGxheWJhY2tTZXNzaW9uSUQpOwotCi0gICAgaWYgKHBsYXliYWNrU2Vzc2lvbiAhPSBOVUxMKSB7Ci0gICAgICAgIHBsYXliYWNrU2Vzc2lvbi0+dXBkYXRlTGl2ZW5lc3MoKTsKLSAgICB9Ci0KLSAgICBBU3RyaW5nIHJlc3BvbnNlID0gIlJUU1AvMS4wIDIwMCBPS1xyXG4iOwotICAgIEFwcGVuZENvbW1vblJlc3BvbnNlKCZyZXNwb25zZSwgY3NlcSk7Ci0KLSAgICByZXNwb25zZS5hcHBlbmQoCi0gICAgICAgICAgICAiUHVibGljOiBvcmcud2ZhLndmZDEuMCwgU0VUVVAsIFRFQVJET1dOLCBQTEFZLCBQQVVTRSwgIgotICAgICAgICAgICAgIkdFVF9QQVJBTUVURVIsIFNFVF9QQVJBTUVURVJcclxuIik7Ci0KLSAgICByZXNwb25zZS5hcHBlbmQoIlxyXG4iKTsKLQotICAgIHN0YXR1c190IGVyciA9IG1OZXRTZXNzaW9uLT5zZW5kUmVxdWVzdChzZXNzaW9uSUQsIHJlc3BvbnNlLmNfc3RyKCkpOwotCi0gICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICBlcnIgPSBzZW5kTTMoc2Vzc2lvbklEKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBXaWZpRGlzcGxheVNvdXJjZTo6b25TZXR1cFJlcXVlc3QoCi0gICAgICAgIGludDMyX3Qgc2Vzc2lvbklELAotICAgICAgICBpbnQzMl90IGNzZXEsCi0gICAgICAgIGNvbnN0IHNwPFBhcnNlZE1lc3NhZ2U+ICZkYXRhKSB7Ci0gICAgQ0hFQ0tfRVEoc2Vzc2lvbklELCBtQ2xpZW50U2Vzc2lvbklEKTsKLSAgICBpZiAobUNsaWVudEluZm8ubVBsYXliYWNrU2Vzc2lvbklEICE9IC0xKSB7Ci0gICAgICAgIC8vIFdlIG9ubHkgc3VwcG9ydCBhIHNpbmdsZSBwbGF5YmFjayBzZXNzaW9uIHBlciBjbGllbnQuCi0gICAgICAgIC8vIFRoaXMgaXMgZHVlIHRvIHRoZSByZXZlcnNlZCBrZWVwLWFsaXZlIGRlc2lnbiBpbiB0aGUgd2ZkIHNwZWNzLi4uCi0gICAgICAgIHNlbmRFcnJvclJlc3BvbnNlKHNlc3Npb25JRCwgIjQwMCBCYWQgUmVxdWVzdCIsIGNzZXEpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIEFTdHJpbmcgdHJhbnNwb3J0OwotICAgIGlmICghZGF0YS0+ZmluZFN0cmluZygidHJhbnNwb3J0IiwgJnRyYW5zcG9ydCkpIHsKLSAgICAgICAgc2VuZEVycm9yUmVzcG9uc2Uoc2Vzc2lvbklELCAiNDAwIEJhZCBSZXF1ZXN0IiwgY3NlcSk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgUlRQU2VuZGVyOjpUcmFuc3BvcnRNb2RlIHJ0cE1vZGUgPSBSVFBTZW5kZXI6OlRSQU5TUE9SVF9VRFA7Ci0KLSAgICBpbnQgY2xpZW50UnRwLCBjbGllbnRSdGNwOwotICAgIGlmICh0cmFuc3BvcnQuc3RhcnRzV2l0aCgiUlRQL0FWUC9UQ1A7IikpIHsKLSAgICAgICAgQVN0cmluZyBpbnRlcmxlYXZlZDsKLSAgICAgICAgaWYgKFBhcnNlZE1lc3NhZ2U6OkdldEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LmNfc3RyKCksICJpbnRlcmxlYXZlZCIsICZpbnRlcmxlYXZlZCkKLSAgICAgICAgICAgICAgICAmJiBzc2NhbmYoaW50ZXJsZWF2ZWQuY19zdHIoKSwgIiVkLSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsaWVudFJ0cCwgJmNsaWVudFJ0Y3ApID09IDIpIHsKLSAgICAgICAgICAgIHJ0cE1vZGUgPSBSVFBTZW5kZXI6OlRSQU5TUE9SVF9UQ1BfSU5URVJMRUFWRUQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBib29sIGJhZFJlcXVlc3QgPSBmYWxzZTsKLQotICAgICAgICAgICAgQVN0cmluZyBjbGllbnRQb3J0OwotICAgICAgICAgICAgaWYgKCFQYXJzZWRNZXNzYWdlOjpHZXRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQuY19zdHIoKSwgImNsaWVudF9wb3J0IiwgJmNsaWVudFBvcnQpKSB7Ci0gICAgICAgICAgICAgICAgYmFkUmVxdWVzdCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNzY2FuZihjbGllbnRQb3J0LmNfc3RyKCksICIlZC0lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2xpZW50UnRwLCAmY2xpZW50UnRjcCkgPT0gMikgewotICAgICAgICAgICAgfSBlbHNlIGlmIChzc2NhbmYoY2xpZW50UG9ydC5jX3N0cigpLCAiJWQiLCAmY2xpZW50UnRwKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm8gUlRDUC4KLSAgICAgICAgICAgICAgICBjbGllbnRSdGNwID0gLTE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJhZFJlcXVlc3QgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYmFkUmVxdWVzdCkgewotICAgICAgICAgICAgICAgIHNlbmRFcnJvclJlc3BvbnNlKHNlc3Npb25JRCwgIjQwMCBCYWQgUmVxdWVzdCIsIGNzZXEpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJ0cE1vZGUgPSBSVFBTZW5kZXI6OlRSQU5TUE9SVF9UQ1A7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydC5zdGFydHNXaXRoKCJSVFAvQVZQO3VuaWNhc3Q7IikKLSAgICAgICAgICAgIHx8IHRyYW5zcG9ydC5zdGFydHNXaXRoKCJSVFAvQVZQL1VEUDt1bmljYXN0OyIpKSB7Ci0gICAgICAgIGJvb2wgYmFkUmVxdWVzdCA9IGZhbHNlOwotCi0gICAgICAgIEFTdHJpbmcgY2xpZW50UG9ydDsKLSAgICAgICAgaWYgKCFQYXJzZWRNZXNzYWdlOjpHZXRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5jX3N0cigpLCAiY2xpZW50X3BvcnQiLCAmY2xpZW50UG9ydCkpIHsKLSAgICAgICAgICAgIGJhZFJlcXVlc3QgPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKHNzY2FuZihjbGllbnRQb3J0LmNfc3RyKCksICIlZC0lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZjbGllbnRSdHAsICZjbGllbnRSdGNwKSA9PSAyKSB7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3NjYW5mKGNsaWVudFBvcnQuY19zdHIoKSwgIiVkIiwgJmNsaWVudFJ0cCkgPT0gMSkgewotICAgICAgICAgICAgLy8gTm8gUlRDUC4KLSAgICAgICAgICAgIGNsaWVudFJ0Y3AgPSAtMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJhZFJlcXVlc3QgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJhZFJlcXVlc3QpIHsKLSAgICAgICAgICAgIHNlbmRFcnJvclJlc3BvbnNlKHNlc3Npb25JRCwgIjQwMCBCYWQgUmVxdWVzdCIsIGNzZXEpOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotI2lmIDEKLSAgICAvLyBUaGUgb2xkZXIgTEcgZG9uZ2xlcyBkb2Vzbid0IHNwZWNpZnkgY2xpZW50X3BvcnQ9eHh4IGFwcGFyZW50bHkuCi0gICAgfSBlbHNlIGlmICh0cmFuc3BvcnQgPT0gIlJUUC9BVlAvVURQO3VuaWNhc3QiKSB7Ci0gICAgICAgIGNsaWVudFJ0cCA9IDE5MDAwOwotICAgICAgICBjbGllbnRSdGNwID0gLTE7Ci0jZW5kaWYKLSAgICB9IGVsc2UgewotICAgICAgICBzZW5kRXJyb3JSZXNwb25zZShzZXNzaW9uSUQsICI0NjEgVW5zdXBwb3J0ZWQgVHJhbnNwb3J0IiwgY3NlcSk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBpbnQzMl90IHBsYXliYWNrU2Vzc2lvbklEID0gbWFrZVVuaXF1ZVBsYXliYWNrU2Vzc2lvbklEKCk7Ci0KLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0UGxheWJhY2tTZXNzaW9uTm90aWZ5LCB0aGlzKTsKLSAgICBub3RpZnktPnNldEludDMyKCJwbGF5YmFja1Nlc3Npb25JRCIsIHBsYXliYWNrU2Vzc2lvbklEKTsKLSAgICBub3RpZnktPnNldEludDMyKCJzZXNzaW9uSUQiLCBzZXNzaW9uSUQpOwotCi0gICAgc3A8UGxheWJhY2tTZXNzaW9uPiBwbGF5YmFja1Nlc3Npb24gPQotICAgICAgICBuZXcgUGxheWJhY2tTZXNzaW9uKAotICAgICAgICAgICAgICAgIG1PcFBhY2thZ2VOYW1lLCBtTmV0U2Vzc2lvbiwgbm90aWZ5LCBtSW50ZXJmYWNlQWRkciwgbUhEQ1AsIG1NZWRpYVBhdGguY19zdHIoKSk7Ci0KLSAgICBsb29wZXIoKS0+cmVnaXN0ZXJIYW5kbGVyKHBsYXliYWNrU2Vzc2lvbik7Ci0KLSAgICBBU3RyaW5nIHVyaTsKLSAgICBkYXRhLT5nZXRSZXF1ZXN0RmllbGQoMSwgJnVyaSk7Ci0KLSAgICBpZiAoc3RybmNhc2VjbXAoInJ0c3A6Ly8iLCB1cmkuY19zdHIoKSwgNykpIHsKLSAgICAgICAgc2VuZEVycm9yUmVzcG9uc2Uoc2Vzc2lvbklELCAiNDAwIEJhZCBSZXF1ZXN0IiwgY3NlcSk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgaWYgKCEodXJpLnN0YXJ0c1dpdGgoInJ0c3A6Ly8iKSAmJiB1cmkuZW5kc1dpdGgoIi93ZmQxLjAvc3RyZWFtaWQ9MCIpKSkgewotICAgICAgICBzZW5kRXJyb3JSZXNwb25zZShzZXNzaW9uSUQsICI0MDQgTm90IGZvdW5kIiwgY3NlcSk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgUlRQU2VuZGVyOjpUcmFuc3BvcnRNb2RlIHJ0Y3BNb2RlID0gUlRQU2VuZGVyOjpUUkFOU1BPUlRfVURQOwotICAgIGlmIChjbGllbnRSdGNwIDwgMCkgewotICAgICAgICBydGNwTW9kZSA9IFJUUFNlbmRlcjo6VFJBTlNQT1JUX05PTkU7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gcGxheWJhY2tTZXNzaW9uLT5pbml0KAotICAgICAgICAgICAgbUNsaWVudEluZm8ubVJlbW90ZUlQLmNfc3RyKCksCi0gICAgICAgICAgICBjbGllbnRSdHAsCi0gICAgICAgICAgICBydHBNb2RlLAotICAgICAgICAgICAgY2xpZW50UnRjcCwKLSAgICAgICAgICAgIHJ0Y3BNb2RlLAotICAgICAgICAgICAgbVNpbmtTdXBwb3J0c0F1ZGlvLAotICAgICAgICAgICAgbVVzaW5nUENNQXVkaW8sCi0gICAgICAgICAgICBtU2lua1N1cHBvcnRzVmlkZW8sCi0gICAgICAgICAgICBtQ2hvc2VuVmlkZW9SZXNvbHV0aW9uVHlwZSwKLSAgICAgICAgICAgIG1DaG9zZW5WaWRlb1Jlc29sdXRpb25JbmRleCwKLSAgICAgICAgICAgIG1DaG9zZW5WaWRlb1Byb2ZpbGUsCi0gICAgICAgICAgICBtQ2hvc2VuVmlkZW9MZXZlbCk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIGxvb3BlcigpLT51bnJlZ2lzdGVySGFuZGxlcihwbGF5YmFja1Nlc3Npb24tPmlkKCkpOwotICAgICAgICBwbGF5YmFja1Nlc3Npb24uY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGVycikgewotICAgICAgICBjYXNlIE9LOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgLUVOT0VOVDoKLSAgICAgICAgICAgIHNlbmRFcnJvclJlc3BvbnNlKHNlc3Npb25JRCwgIjQwNCBOb3QgRm91bmQiLCBjc2VxKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBzZW5kRXJyb3JSZXNwb25zZShzZXNzaW9uSUQsICI0MDMgRm9yYmlkZGVuIiwgY3NlcSk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1DbGllbnRJbmZvLm1QbGF5YmFja1Nlc3Npb25JRCA9IHBsYXliYWNrU2Vzc2lvbklEOwotICAgIG1DbGllbnRJbmZvLm1QbGF5YmFja1Nlc3Npb24gPSBwbGF5YmFja1Nlc3Npb247Ci0KLSAgICBBU3RyaW5nIHJlc3BvbnNlID0gIlJUU1AvMS4wIDIwMCBPS1xyXG4iOwotICAgIEFwcGVuZENvbW1vblJlc3BvbnNlKCZyZXNwb25zZSwgY3NlcSwgcGxheWJhY2tTZXNzaW9uSUQpOwotCi0gICAgaWYgKHJ0cE1vZGUgPT0gUlRQU2VuZGVyOjpUUkFOU1BPUlRfVENQX0lOVEVSTEVBVkVEKSB7Ci0gICAgICAgIHJlc3BvbnNlLmFwcGVuZCgKLSAgICAgICAgICAgICAgICBBU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICAgICAiVHJhbnNwb3J0OiBSVFAvQVZQL1RDUDtpbnRlcmxlYXZlZD0lZC0lZDsiLAotICAgICAgICAgICAgICAgICAgICBjbGllbnRSdHAsIGNsaWVudFJ0Y3ApKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpbnQzMl90IHNlcnZlclJ0cCA9IHBsYXliYWNrU2Vzc2lvbi0+Z2V0UlRQUG9ydCgpOwotCi0gICAgICAgIEFTdHJpbmcgdHJhbnNwb3J0U3RyaW5nID0gIlVEUCI7Ci0gICAgICAgIGlmIChydHBNb2RlID09IFJUUFNlbmRlcjo6VFJBTlNQT1JUX1RDUCkgewotICAgICAgICAgICAgdHJhbnNwb3J0U3RyaW5nID0gIlRDUCI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2xpZW50UnRjcCA+PSAwKSB7Ci0gICAgICAgICAgICByZXNwb25zZS5hcHBlbmQoCi0gICAgICAgICAgICAgICAgICAgIEFTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgICAgICAgICAiVHJhbnNwb3J0OiBSVFAvQVZQLyVzO3VuaWNhc3Q7Y2xpZW50X3BvcnQ9JWQtJWQ7IgotICAgICAgICAgICAgICAgICAgICAgICAgInNlcnZlcl9wb3J0PSVkLSVkXHJcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRTdHJpbmcuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFJ0cCwgY2xpZW50UnRjcCwgc2VydmVyUnRwLCBzZXJ2ZXJSdHAgKyAxKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXNwb25zZS5hcHBlbmQoCi0gICAgICAgICAgICAgICAgICAgIEFTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgICAgICAgICAiVHJhbnNwb3J0OiBSVFAvQVZQLyVzO3VuaWNhc3Q7Y2xpZW50X3BvcnQ9JWQ7IgotICAgICAgICAgICAgICAgICAgICAgICAgInNlcnZlcl9wb3J0PSVkXHJcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRTdHJpbmcuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFJ0cCwgc2VydmVyUnRwKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXNwb25zZS5hcHBlbmQoIlxyXG4iKTsKLQotICAgIGVyciA9IG1OZXRTZXNzaW9uLT5zZW5kUmVxdWVzdChzZXNzaW9uSUQsIHJlc3BvbnNlLmNfc3RyKCkpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1TdGF0ZSA9IEFXQUlUSU5HX0NMSUVOVF9QTEFZOwotCi0gICAgc2NoZWR1bGVSZWFwZXIoKTsKLSAgICBzY2hlZHVsZUtlZXBBbGl2ZShzZXNzaW9uSUQpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBXaWZpRGlzcGxheVNvdXJjZTo6b25QbGF5UmVxdWVzdCgKLSAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsCi0gICAgICAgIGludDMyX3QgY3NlcSwKLSAgICAgICAgY29uc3Qgc3A8UGFyc2VkTWVzc2FnZT4gJmRhdGEpIHsKLSAgICBpbnQzMl90IHBsYXliYWNrU2Vzc2lvbklEOwotICAgIHNwPFBsYXliYWNrU2Vzc2lvbj4gcGxheWJhY2tTZXNzaW9uID0KLSAgICAgICAgZmluZFBsYXliYWNrU2Vzc2lvbihkYXRhLCAmcGxheWJhY2tTZXNzaW9uSUQpOwotCi0gICAgaWYgKHBsYXliYWNrU2Vzc2lvbiA9PSBOVUxMKSB7Ci0gICAgICAgIHNlbmRFcnJvclJlc3BvbnNlKHNlc3Npb25JRCwgIjQ1NCBTZXNzaW9uIE5vdCBGb3VuZCIsIGNzZXEpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmIChtU3RhdGUgIT0gQVdBSVRJTkdfQ0xJRU5UX1BMQVkKLSAgICAgJiYgbVN0YXRlICE9IFBBVVNFRF9UT19QTEFZSU5HCi0gICAgICYmIG1TdGF0ZSAhPSBQQVVTRUQpIHsKLSAgICAgICAgQUxPR1coIlJlY2VpdmVkIFBMQVkgcmVxdWVzdCBidXQgd2UncmUgaW4gc3RhdGUgJWQiLCBtU3RhdGUpOwotCi0gICAgICAgIHNlbmRFcnJvclJlc3BvbnNlKAotICAgICAgICAgICAgICAgIHNlc3Npb25JRCwgIjQ1NSBNZXRob2QgTm90IFZhbGlkIGluIFRoaXMgU3RhdGUiLCBjc2VxKTsKLQotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgQUxPR0koIlJlY2VpdmVkIFBMQVkgcmVxdWVzdC4iKTsKLSAgICBpZiAobVBsYXliYWNrU2Vzc2lvbkVzdGFibGlzaGVkKSB7Ci0gICAgICAgIGZpbmlzaFBsYXkoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HSSgiZGVmZXJyaW5nIFBMQVkgcmVxdWVzdCB1bnRpbCBzZXNzaW9uIGVzdGFibGlzaGVkLiIpOwotICAgIH0KLQotICAgIEFTdHJpbmcgcmVzcG9uc2UgPSAiUlRTUC8xLjAgMjAwIE9LXHJcbiI7Ci0gICAgQXBwZW5kQ29tbW9uUmVzcG9uc2UoJnJlc3BvbnNlLCBjc2VxLCBwbGF5YmFja1Nlc3Npb25JRCk7Ci0gICAgcmVzcG9uc2UuYXBwZW5kKCJSYW5nZTogbnB0PW5vdy1cclxuIik7Ci0gICAgcmVzcG9uc2UuYXBwZW5kKCJcclxuIik7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtTmV0U2Vzc2lvbi0+c2VuZFJlcXVlc3Qoc2Vzc2lvbklELCByZXNwb25zZS5jX3N0cigpKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAobVN0YXRlID09IFBBVVNFRF9UT19QTEFZSU5HIHx8IG1QbGF5YmFja1Nlc3Npb25Fc3RhYmxpc2hlZCkgewotICAgICAgICBtU3RhdGUgPSBQTEFZSU5HOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgQ0hFQ0tfRVEobVN0YXRlLCBBV0FJVElOR19DTElFTlRfUExBWSk7Ci0gICAgbVN0YXRlID0gQUJPVVRfVE9fUExBWTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBXaWZpRGlzcGxheVNvdXJjZTo6ZmluaXNoUGxheSgpIHsKLSAgICBjb25zdCBzcDxQbGF5YmFja1Nlc3Npb24+ICZwbGF5YmFja1Nlc3Npb24gPQotICAgICAgICBtQ2xpZW50SW5mby5tUGxheWJhY2tTZXNzaW9uOwotCi0gICAgc3RhdHVzX3QgZXJyID0gcGxheWJhY2tTZXNzaW9uLT5wbGF5KCk7Ci0gICAgQ0hFQ0tfRVEoZXJyLCAoc3RhdHVzX3QpT0spOwotfQotCi1zdGF0dXNfdCBXaWZpRGlzcGxheVNvdXJjZTo6b25QYXVzZVJlcXVlc3QoCi0gICAgICAgIGludDMyX3Qgc2Vzc2lvbklELAotICAgICAgICBpbnQzMl90IGNzZXEsCi0gICAgICAgIGNvbnN0IHNwPFBhcnNlZE1lc3NhZ2U+ICZkYXRhKSB7Ci0gICAgaW50MzJfdCBwbGF5YmFja1Nlc3Npb25JRDsKLSAgICBzcDxQbGF5YmFja1Nlc3Npb24+IHBsYXliYWNrU2Vzc2lvbiA9Ci0gICAgICAgIGZpbmRQbGF5YmFja1Nlc3Npb24oZGF0YSwgJnBsYXliYWNrU2Vzc2lvbklEKTsKLQotICAgIGlmIChwbGF5YmFja1Nlc3Npb24gPT0gTlVMTCkgewotICAgICAgICBzZW5kRXJyb3JSZXNwb25zZShzZXNzaW9uSUQsICI0NTQgU2Vzc2lvbiBOb3QgRm91bmQiLCBjc2VxKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBBTE9HSSgiUmVjZWl2ZWQgUEFVU0UgcmVxdWVzdC4iKTsKLQotICAgIGlmIChtU3RhdGUgIT0gUExBWUlOR19UT19QQVVTRUQgJiYgbVN0YXRlICE9IFBMQVlJTkcpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IHBsYXliYWNrU2Vzc2lvbi0+cGF1c2UoKTsKLSAgICBDSEVDS19FUShlcnIsIChzdGF0dXNfdClPSyk7Ci0KLSAgICBBU3RyaW5nIHJlc3BvbnNlID0gIlJUU1AvMS4wIDIwMCBPS1xyXG4iOwotICAgIEFwcGVuZENvbW1vblJlc3BvbnNlKCZyZXNwb25zZSwgY3NlcSwgcGxheWJhY2tTZXNzaW9uSUQpOwotICAgIHJlc3BvbnNlLmFwcGVuZCgiXHJcbiIpOwotCi0gICAgZXJyID0gbU5ldFNlc3Npb24tPnNlbmRSZXF1ZXN0KHNlc3Npb25JRCwgcmVzcG9uc2UuY19zdHIoKSk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbVN0YXRlID0gUEFVU0VEOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6Om9uVGVhcmRvd25SZXF1ZXN0KAotICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwKLSAgICAgICAgaW50MzJfdCBjc2VxLAotICAgICAgICBjb25zdCBzcDxQYXJzZWRNZXNzYWdlPiAmZGF0YSkgewotICAgIEFMT0dJKCJSZWNlaXZlZCBURUFSRE9XTiByZXF1ZXN0LiIpOwotCi0gICAgaW50MzJfdCBwbGF5YmFja1Nlc3Npb25JRDsKLSAgICBzcDxQbGF5YmFja1Nlc3Npb24+IHBsYXliYWNrU2Vzc2lvbiA9Ci0gICAgICAgIGZpbmRQbGF5YmFja1Nlc3Npb24oZGF0YSwgJnBsYXliYWNrU2Vzc2lvbklEKTsKLQotICAgIGlmIChwbGF5YmFja1Nlc3Npb24gPT0gTlVMTCkgewotICAgICAgICBzZW5kRXJyb3JSZXNwb25zZShzZXNzaW9uSUQsICI0NTQgU2Vzc2lvbiBOb3QgRm91bmQiLCBjc2VxKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBBU3RyaW5nIHJlc3BvbnNlID0gIlJUU1AvMS4wIDIwMCBPS1xyXG4iOwotICAgIEFwcGVuZENvbW1vblJlc3BvbnNlKCZyZXNwb25zZSwgY3NlcSwgcGxheWJhY2tTZXNzaW9uSUQpOwotICAgIHJlc3BvbnNlLmFwcGVuZCgiQ29ubmVjdGlvbjogY2xvc2VcclxuIik7Ci0gICAgcmVzcG9uc2UuYXBwZW5kKCJcclxuIik7Ci0KLSAgICBtTmV0U2Vzc2lvbi0+c2VuZFJlcXVlc3Qoc2Vzc2lvbklELCByZXNwb25zZS5jX3N0cigpKTsKLQotICAgIGlmIChtU3RhdGUgPT0gQVdBSVRJTkdfQ0xJRU5UX1RFQVJET1dOKSB7Ci0gICAgICAgIENIRUNLKG1TdG9wUmVwbHlJRCAhPSBOVUxMKTsKLSAgICAgICAgZmluaXNoU3RvcCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1DbGllbnQtPm9uRGlzcGxheUVycm9yKElSZW1vdGVEaXNwbGF5Q2xpZW50OjprRGlzcGxheUVycm9yVW5rbm93bik7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIFdpZmlEaXNwbGF5U291cmNlOjpmaW5pc2hTdG9wKCkgewotICAgIEFMT0dWKCJmaW5pc2hTdG9wIik7Ci0KLSAgICBtU3RhdGUgPSBTVE9QUElORzsKLQotICAgIGRpc2Nvbm5lY3RDbGllbnRBc3luYygpOwotfQotCi12b2lkIFdpZmlEaXNwbGF5U291cmNlOjpmaW5pc2hTdG9wQWZ0ZXJEaXNjb25uZWN0aW5nQ2xpZW50KCkgewotICAgIEFMT0dWKCJmaW5pc2hTdG9wQWZ0ZXJEaXNjb25uZWN0aW5nQ2xpZW50Iik7Ci0KLSAgICBpZiAobUhEQ1AgIT0gTlVMTCkgewotICAgICAgICBBTE9HSSgiSW5pdGlhdGluZyBIRENQIHNodXRkb3duLiIpOwotICAgICAgICBtSERDUC0+c2h1dGRvd25Bc3luYygpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZmluaXNoU3RvcDIoKTsKLX0KLQotdm9pZCBXaWZpRGlzcGxheVNvdXJjZTo6ZmluaXNoU3RvcDIoKSB7Ci0gICAgQUxPR1YoImZpbmlzaFN0b3AyIik7Ci0KLSAgICBpZiAobUhEQ1AgIT0gTlVMTCkgewotICAgICAgICBtSERDUC0+c2V0T2JzZXJ2ZXIoTlVMTCk7Ci0gICAgICAgIG1IRENQT2JzZXJ2ZXIuY2xlYXIoKTsKLSAgICAgICAgbUhEQ1AuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBpZiAobVNlc3Npb25JRCAhPSAwKSB7Ci0gICAgICAgIG1OZXRTZXNzaW9uLT5kZXN0cm95U2Vzc2lvbihtU2Vzc2lvbklEKTsKLSAgICAgICAgbVNlc3Npb25JRCA9IDA7Ci0gICAgfQotCi0gICAgQUxPR0koIldlJ3JlIHN0b3BwZWQuIik7Ci0gICAgbVN0YXRlID0gU1RPUFBFRDsKLQotICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLSAgICByZXNwb25zZS0+cG9zdFJlcGx5KG1TdG9wUmVwbHlJRCk7Ci19Ci0KLXN0YXR1c190IFdpZmlEaXNwbGF5U291cmNlOjpvbkdldFBhcmFtZXRlclJlcXVlc3QoCi0gICAgICAgIGludDMyX3Qgc2Vzc2lvbklELAotICAgICAgICBpbnQzMl90IGNzZXEsCi0gICAgICAgIGNvbnN0IHNwPFBhcnNlZE1lc3NhZ2U+ICZkYXRhKSB7Ci0gICAgaW50MzJfdCBwbGF5YmFja1Nlc3Npb25JRDsKLSAgICBzcDxQbGF5YmFja1Nlc3Npb24+IHBsYXliYWNrU2Vzc2lvbiA9Ci0gICAgICAgIGZpbmRQbGF5YmFja1Nlc3Npb24oZGF0YSwgJnBsYXliYWNrU2Vzc2lvbklEKTsKLQotICAgIGlmIChwbGF5YmFja1Nlc3Npb24gPT0gTlVMTCkgewotICAgICAgICBzZW5kRXJyb3JSZXNwb25zZShzZXNzaW9uSUQsICI0NTQgU2Vzc2lvbiBOb3QgRm91bmQiLCBjc2VxKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBwbGF5YmFja1Nlc3Npb24tPnVwZGF0ZUxpdmVuZXNzKCk7Ci0KLSAgICBBU3RyaW5nIHJlc3BvbnNlID0gIlJUU1AvMS4wIDIwMCBPS1xyXG4iOwotICAgIEFwcGVuZENvbW1vblJlc3BvbnNlKCZyZXNwb25zZSwgY3NlcSwgcGxheWJhY2tTZXNzaW9uSUQpOwotICAgIHJlc3BvbnNlLmFwcGVuZCgiXHJcbiIpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gbU5ldFNlc3Npb24tPnNlbmRSZXF1ZXN0KHNlc3Npb25JRCwgcmVzcG9uc2UuY19zdHIoKSk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgV2lmaURpc3BsYXlTb3VyY2U6Om9uU2V0UGFyYW1ldGVyUmVxdWVzdCgKLSAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsCi0gICAgICAgIGludDMyX3QgY3NlcSwKLSAgICAgICAgY29uc3Qgc3A8UGFyc2VkTWVzc2FnZT4gJmRhdGEpIHsKLSAgICBpbnQzMl90IHBsYXliYWNrU2Vzc2lvbklEOwotICAgIHNwPFBsYXliYWNrU2Vzc2lvbj4gcGxheWJhY2tTZXNzaW9uID0KLSAgICAgICAgZmluZFBsYXliYWNrU2Vzc2lvbihkYXRhLCAmcGxheWJhY2tTZXNzaW9uSUQpOwotCi0gICAgaWYgKHBsYXliYWNrU2Vzc2lvbiA9PSBOVUxMKSB7Ci0gICAgICAgIHNlbmRFcnJvclJlc3BvbnNlKHNlc3Npb25JRCwgIjQ1NCBTZXNzaW9uIE5vdCBGb3VuZCIsIGNzZXEpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmIChzdHJzdHIoZGF0YS0+Z2V0Q29udGVudCgpLCAid2ZkX2lkcl9yZXF1ZXN0XHJcbiIpKSB7Ci0gICAgICAgIHBsYXliYWNrU2Vzc2lvbi0+cmVxdWVzdElEUkZyYW1lKCk7Ci0gICAgfQotCi0gICAgcGxheWJhY2tTZXNzaW9uLT51cGRhdGVMaXZlbmVzcygpOwotCi0gICAgQVN0cmluZyByZXNwb25zZSA9ICJSVFNQLzEuMCAyMDAgT0tcclxuIjsKLSAgICBBcHBlbmRDb21tb25SZXNwb25zZSgmcmVzcG9uc2UsIGNzZXEsIHBsYXliYWNrU2Vzc2lvbklEKTsKLSAgICByZXNwb25zZS5hcHBlbmQoIlxyXG4iKTsKLQotICAgIHN0YXR1c190IGVyciA9IG1OZXRTZXNzaW9uLT5zZW5kUmVxdWVzdChzZXNzaW9uSUQsIHJlc3BvbnNlLmNfc3RyKCkpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBXaWZpRGlzcGxheVNvdXJjZTo6QXBwZW5kQ29tbW9uUmVzcG9uc2UoCi0gICAgICAgIEFTdHJpbmcgKnJlc3BvbnNlLCBpbnQzMl90IGNzZXEsIGludDMyX3QgcGxheWJhY2tTZXNzaW9uSUQpIHsKLSAgICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKLSAgICBzdHJ1Y3QgdG0gKm5vdzIgPSBnbXRpbWUoJm5vdyk7Ci0gICAgY2hhciBidWZbMTI4XTsKLSAgICBzdHJmdGltZShidWYsIHNpemVvZihidWYpLCAiJWEsICVkICViICVZICVIOiVNOiVTICV6Iiwgbm93Mik7Ci0KLSAgICByZXNwb25zZS0+YXBwZW5kKCJEYXRlOiAiKTsKLSAgICByZXNwb25zZS0+YXBwZW5kKGJ1Zik7Ci0gICAgcmVzcG9uc2UtPmFwcGVuZCgiXHJcbiIpOwotCi0gICAgcmVzcG9uc2UtPmFwcGVuZChBU3RyaW5nUHJpbnRmKCJTZXJ2ZXI6ICVzXHJcbiIsIHNVc2VyQWdlbnQuY19zdHIoKSkpOwotCi0gICAgaWYgKGNzZXEgPj0gMCkgewotICAgICAgICByZXNwb25zZS0+YXBwZW5kKEFTdHJpbmdQcmludGYoIkNTZXE6ICVkXHJcbiIsIGNzZXEpKTsKLSAgICB9Ci0KLSAgICBpZiAocGxheWJhY2tTZXNzaW9uSUQgPj0gMGxsKSB7Ci0gICAgICAgIHJlc3BvbnNlLT5hcHBlbmQoCi0gICAgICAgICAgICAgICAgQVN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAgICAgIlNlc3Npb246ICVkO3RpbWVvdXQ9JWxsZFxyXG4iLAotICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1Nlc3Npb25JRCwga1BsYXliYWNrU2Vzc2lvblRpbWVvdXRTZWNzKSk7Ci0gICAgfQotfQotCi12b2lkIFdpZmlEaXNwbGF5U291cmNlOjpzZW5kRXJyb3JSZXNwb25zZSgKLSAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsCi0gICAgICAgIGNvbnN0IGNoYXIgKmVycm9yRGV0YWlsLAotICAgICAgICBpbnQzMl90IGNzZXEpIHsKLSAgICBBU3RyaW5nIHJlc3BvbnNlOwotICAgIHJlc3BvbnNlLmFwcGVuZCgiUlRTUC8xLjAgIik7Ci0gICAgcmVzcG9uc2UuYXBwZW5kKGVycm9yRGV0YWlsKTsKLSAgICByZXNwb25zZS5hcHBlbmQoIlxyXG4iKTsKLQotICAgIEFwcGVuZENvbW1vblJlc3BvbnNlKCZyZXNwb25zZSwgY3NlcSk7Ci0KLSAgICByZXNwb25zZS5hcHBlbmQoIlxyXG4iKTsKLQotICAgIG1OZXRTZXNzaW9uLT5zZW5kUmVxdWVzdChzZXNzaW9uSUQsIHJlc3BvbnNlLmNfc3RyKCkpOwotfQotCi1pbnQzMl90IFdpZmlEaXNwbGF5U291cmNlOjptYWtlVW5pcXVlUGxheWJhY2tTZXNzaW9uSUQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHJhbmQoKTsKLX0KLQotc3A8V2lmaURpc3BsYXlTb3VyY2U6OlBsYXliYWNrU2Vzc2lvbj4gV2lmaURpc3BsYXlTb3VyY2U6OmZpbmRQbGF5YmFja1Nlc3Npb24oCi0gICAgICAgIGNvbnN0IHNwPFBhcnNlZE1lc3NhZ2U+ICZkYXRhLCBpbnQzMl90ICpwbGF5YmFja1Nlc3Npb25JRCkgY29uc3QgewotICAgIGlmICghZGF0YS0+ZmluZEludDMyKCJzZXNzaW9uIiwgcGxheWJhY2tTZXNzaW9uSUQpKSB7Ci0gICAgICAgIC8vIFhYWCB0aGUgb2xkZXIgZG9uZ2xlcyBkbyBub3QgYWx3YXlzIGluY2x1ZGUgYSAiU2Vzc2lvbjoiIGhlYWRlci4KLSAgICAgICAgKnBsYXliYWNrU2Vzc2lvbklEID0gbUNsaWVudEluZm8ubVBsYXliYWNrU2Vzc2lvbklEOwotICAgICAgICByZXR1cm4gbUNsaWVudEluZm8ubVBsYXliYWNrU2Vzc2lvbjsKLSAgICB9Ci0KLSAgICBpZiAoKnBsYXliYWNrU2Vzc2lvbklEICE9IG1DbGllbnRJbmZvLm1QbGF5YmFja1Nlc3Npb25JRCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbUNsaWVudEluZm8ubVBsYXliYWNrU2Vzc2lvbjsKLX0KLQotdm9pZCBXaWZpRGlzcGxheVNvdXJjZTo6ZGlzY29ubmVjdENsaWVudEFzeW5jKCkgewotICAgIEFMT0dWKCJkaXNjb25uZWN0Q2xpZW50Iik7Ci0KLSAgICBpZiAobUNsaWVudEluZm8ubVBsYXliYWNrU2Vzc2lvbiA9PSBOVUxMKSB7Ci0gICAgICAgIGRpc2Nvbm5lY3RDbGllbnQyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobUNsaWVudEluZm8ubVBsYXliYWNrU2Vzc2lvbiAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJEZXN0cm95aW5nIFBsYXliYWNrU2Vzc2lvbiIpOwotICAgICAgICBtQ2xpZW50SW5mby5tUGxheWJhY2tTZXNzaW9uLT5kZXN0cm95QXN5bmMoKTsKLSAgICB9Ci19Ci0KLXZvaWQgV2lmaURpc3BsYXlTb3VyY2U6OmRpc2Nvbm5lY3RDbGllbnQyKCkgewotICAgIEFMT0dWKCJkaXNjb25uZWN0Q2xpZW50MiIpOwotCi0gICAgaWYgKG1DbGllbnRJbmZvLm1QbGF5YmFja1Nlc3Npb24gIT0gTlVMTCkgewotICAgICAgICBsb29wZXIoKS0+dW5yZWdpc3RlckhhbmRsZXIobUNsaWVudEluZm8ubVBsYXliYWNrU2Vzc2lvbi0+aWQoKSk7Ci0gICAgICAgIG1DbGllbnRJbmZvLm1QbGF5YmFja1Nlc3Npb24uY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBpZiAobUNsaWVudFNlc3Npb25JRCAhPSAwKSB7Ci0gICAgICAgIG1OZXRTZXNzaW9uLT5kZXN0cm95U2Vzc2lvbihtQ2xpZW50U2Vzc2lvbklEKTsKLSAgICAgICAgbUNsaWVudFNlc3Npb25JRCA9IDA7Ci0gICAgfQotCi0gICAgbUNsaWVudC0+b25EaXNwbGF5RGlzY29ubmVjdGVkKCk7Ci0KLSAgICBmaW5pc2hTdG9wQWZ0ZXJEaXNjb25uZWN0aW5nQ2xpZW50KCk7Ci19Ci0KLXN0cnVjdCBXaWZpRGlzcGxheVNvdXJjZTo6SERDUE9ic2VydmVyIDogcHVibGljIEJuSERDUE9ic2VydmVyIHsKLSAgICBleHBsaWNpdCBIRENQT2JzZXJ2ZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOwotCi0gICAgdmlydHVhbCB2b2lkIG5vdGlmeSgKLSAgICAgICAgICAgIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopOwotCi1wcml2YXRlOgotICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSERDUE9ic2VydmVyKTsKLX07Ci0KLVdpZmlEaXNwbGF5U291cmNlOjpIRENQT2JzZXJ2ZXI6OkhEQ1BPYnNlcnZlcigKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCi0gICAgOiBtTm90aWZ5KG5vdGlmeSkgewotfQotCi12b2lkIFdpZmlEaXNwbGF5U291cmNlOjpIRENQT2JzZXJ2ZXI6Om5vdGlmeSgKLSAgICAgICAgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKiAvKiBvYmogKi8pIHsKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigibXNnIiwgbXNnKTsKLSAgICBub3RpZnktPnNldEludDMyKCJleHQxIiwgZXh0MSk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigiZXh0MiIsIGV4dDIpOwotICAgIG5vdGlmeS0+cG9zdCgpOwotfQotCi1zdGF0dXNfdCBXaWZpRGlzcGxheVNvdXJjZTo6bWFrZUhEQ1AoKSB7Ci0gICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwotICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5wbGF5ZXIiKSk7Ci0KLSAgICBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiBzZXJ2aWNlID0KLSAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhUGxheWVyU2VydmljZT4oYmluZGVyKTsKLQotICAgIENIRUNLKHNlcnZpY2UgIT0gTlVMTCk7Ci0KLSAgICBtSERDUCA9IHNlcnZpY2UtPm1ha2VIRENQKHRydWUgLyogY3JlYXRlRW5jcnlwdGlvbk1vZHVsZSAqLyk7Ci0KLSAgICBpZiAobUhEQ1AgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdEhEQ1BOb3RpZnksIHRoaXMpOwotICAgIG1IRENQT2JzZXJ2ZXIgPSBuZXcgSERDUE9ic2VydmVyKG5vdGlmeSk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtSERDUC0+c2V0T2JzZXJ2ZXIobUhEQ1BPYnNlcnZlcik7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEhEQ1Agb2JzZXJ2ZXIuIik7Ci0KLSAgICAgICAgbUhEQ1BPYnNlcnZlci5jbGVhcigpOwotICAgICAgICBtSERDUC5jbGVhcigpOwotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgQUxPR0koIkluaXRpYXRpbmcgSERDUCBuZWdvdGlhdGlvbiB3LyBob3N0ICVzOiVkIiwKLSAgICAgICAgICAgIG1DbGllbnRJbmZvLm1SZW1vdGVJUC5jX3N0cigpLCBtSERDUFBvcnQpOwotCi0gICAgZXJyID0gbUhEQ1AtPmluaXRBc3luYyhtQ2xpZW50SW5mby5tUmVtb3RlSVAuY19zdHIoKSwgbUhEQ1BQb3J0KTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvV2lmaURpc3BsYXlTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvV2lmaURpc3BsYXlTb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI1YTY3NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1dpZmlEaXNwbGF5U291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBXSUZJX0RJU1BMQVlfU09VUkNFX0hfCi0KLSNkZWZpbmUgV0lGSV9ESVNQTEFZX1NPVVJDRV9IXwotCi0jaW5jbHVkZSAiVmlkZW9Gb3JtYXRzLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uaD4KLQotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLQotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEFSZXBseVRva2VuOwotc3RydWN0IElIRENQOwotY2xhc3MgSVJlbW90ZURpc3BsYXlDbGllbnQ7Ci1zdHJ1Y3QgUGFyc2VkTWVzc2FnZTsKLQotLy8gUmVwcmVzZW50cyB0aGUgUlRTUCBzZXJ2ZXIgYWN0aW5nIGFzIGEgd2lmaSBkaXNwbGF5IHNvdXJjZS4KLS8vIE1hbmFnZXMgaW5jb21pbmcgY29ubmVjdGlvbnMsIHNldHMgdXAgUGxheWJhY2sgc2Vzc2lvbnMgYXMgbmVjZXNzYXJ5Lgotc3RydWN0IFdpZmlEaXNwbGF5U291cmNlIDogcHVibGljIEFIYW5kbGVyIHsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQga1dpZmlEaXNwbGF5RGVmYXVsdFBvcnQgPSA3MjM2OwotCi0gICAgV2lmaURpc3BsYXlTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBTdHJpbmcxNiAmb3BQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIGNvbnN0IHNwPEFOZXR3b3JrU2Vzc2lvbj4gJm5ldFNlc3Npb24sCi0gICAgICAgICAgICBjb25zdCBzcDxJUmVtb3RlRGlzcGxheUNsaWVudD4gJmNsaWVudCwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGggPSBOVUxMKTsKLQotICAgIHN0YXR1c190IHN0YXJ0KGNvbnN0IGNoYXIgKmlmYWNlKTsKLSAgICBzdGF0dXNfdCBzdG9wKCk7Ci0KLSAgICBzdGF0dXNfdCBwYXVzZSgpOwotICAgIHN0YXR1c190IHJlc3VtZSgpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+V2lmaURpc3BsYXlTb3VyY2UoKTsKLSAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotCi1wcml2YXRlOgotICAgIHN0cnVjdCBQbGF5YmFja1Nlc3Npb247Ci0gICAgc3RydWN0IEhEQ1BPYnNlcnZlcjsKLQotICAgIGVudW0gU3RhdGUgewotICAgICAgICBJTklUSUFMSVpFRCwKLSAgICAgICAgQVdBSVRJTkdfQ0xJRU5UX0NPTk5FQ1RJT04sCi0gICAgICAgIEFXQUlUSU5HX0NMSUVOVF9TRVRVUCwKLSAgICAgICAgQVdBSVRJTkdfQ0xJRU5UX1BMQVksCi0gICAgICAgIEFCT1VUX1RPX1BMQVksCi0gICAgICAgIFBMQVlJTkcsCi0gICAgICAgIFBMQVlJTkdfVE9fUEFVU0VELAotICAgICAgICBQQVVTRUQsCi0gICAgICAgIFBBVVNFRF9UT19QTEFZSU5HLAotICAgICAgICBBV0FJVElOR19DTElFTlRfVEVBUkRPV04sCi0gICAgICAgIFNUT1BQSU5HLAotICAgICAgICBTVE9QUEVELAotICAgIH07Ci0KLSAgICBlbnVtIHsKLSAgICAgICAga1doYXRTdGFydCwKLSAgICAgICAga1doYXRSVFNQTm90aWZ5LAotICAgICAgICBrV2hhdFN0b3AsCi0gICAgICAgIGtXaGF0UGF1c2UsCi0gICAgICAgIGtXaGF0UmVzdW1lLAotICAgICAgICBrV2hhdFJlYXBEZWFkQ2xpZW50cywKLSAgICAgICAga1doYXRQbGF5YmFja1Nlc3Npb25Ob3RpZnksCi0gICAgICAgIGtXaGF0S2VlcEFsaXZlLAotICAgICAgICBrV2hhdEhEQ1BOb3RpZnksCi0gICAgICAgIGtXaGF0RmluaXNoU3RvcDIsCi0gICAgICAgIGtXaGF0VGVhcmRvd25UcmlnZ2VyVGltZWRPdXQsCi0gICAgfTsKLQotICAgIHN0cnVjdCBSZXNwb25zZUlEIHsKLSAgICAgICAgaW50MzJfdCBtU2Vzc2lvbklEOwotICAgICAgICBpbnQzMl90IG1DU2VxOwotCi0gICAgICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFJlc3BvbnNlSUQgJm90aGVyKSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gbVNlc3Npb25JRCA8IG90aGVyLm1TZXNzaW9uSUQKLSAgICAgICAgICAgICAgICB8fCAobVNlc3Npb25JRCA9PSBvdGhlci5tU2Vzc2lvbklECi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBtQ1NlcSA8IG90aGVyLm1DU2VxKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICB0eXBlZGVmIHN0YXR1c190IChXaWZpRGlzcGxheVNvdXJjZTo6KkhhbmRsZVJUU1BSZXNwb25zZUZ1bmMpKAotICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsIGNvbnN0IHNwPFBhcnNlZE1lc3NhZ2U+ICZtc2cpOwotCi0gICAgc3RhdGljIGNvbnN0IGludDY0X3Qga1JlYXBlckludGVydmFsVXMgPSAxMDAwMDAwbGw7Ci0KLSAgICAvLyBXZSByZXF1ZXN0IHRoYXQgdGhlIGRvbmdsZSBzZW5kIHVzIGEgIlRFQVJET1dOIiBpbiBvcmRlciB0bwotICAgIC8vIHBlcmZvcm0gYW4gb3JkZXJseSBzaHV0ZG93bi4gV2UncmUgd2lsbGluZyB0byB3YWl0IHVwIHRvIDIgc2VjcwotICAgIC8vIGZvciB0aGlzIG1lc3NhZ2UgdG8gYXJyaXZlLCBhZnRlciB0aGF0IHdlJ2xsIGZvcmNlIGEgZGlzY29ubmVjdAotICAgIC8vIGluc3RlYWQuCi0gICAgc3RhdGljIGNvbnN0IGludDY0X3Qga1RlYXJkb3duVHJpZ2dlclRpbWVvdVNlY3MgPSAyOwotCi0gICAgc3RhdGljIGNvbnN0IGludDY0X3Qga1BsYXliYWNrU2Vzc2lvblRpbWVvdXRTZWNzID0gMzA7Ci0KLSAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrUGxheWJhY2tTZXNzaW9uVGltZW91dFVzID0KLSAgICAgICAga1BsYXliYWNrU2Vzc2lvblRpbWVvdXRTZWNzICogMTAwMDAwMGxsOwotCi0gICAgc3RhdGljIGNvbnN0IEFTdHJpbmcgc1VzZXJBZ2VudDsKLQotICAgIFN0cmluZzE2IG1PcFBhY2thZ2VOYW1lOwotCi0gICAgU3RhdGUgbVN0YXRlOwotICAgIFZpZGVvRm9ybWF0cyBtU3VwcG9ydGVkU291cmNlVmlkZW9Gb3JtYXRzOwotICAgIHNwPEFOZXR3b3JrU2Vzc2lvbj4gbU5ldFNlc3Npb247Ci0gICAgc3A8SVJlbW90ZURpc3BsYXlDbGllbnQ+IG1DbGllbnQ7Ci0gICAgQVN0cmluZyBtTWVkaWFQYXRoOwotICAgIHN0cnVjdCBpbl9hZGRyIG1JbnRlcmZhY2VBZGRyOwotICAgIGludDMyX3QgbVNlc3Npb25JRDsKLQotICAgIHNwPEFSZXBseVRva2VuPiBtU3RvcFJlcGx5SUQ7Ci0KLSAgICBBU3RyaW5nIG1XZmRDbGllbnRSdHBQb3J0czsKLSAgICBpbnQzMl90IG1DaG9zZW5SVFBQb3J0OyAgLy8gZXh0cmFjdGVkIGZyb20gIndmZF9jbGllbnRfcnRwX3BvcnRzIgotCi0gICAgYm9vbCBtU2lua1N1cHBvcnRzVmlkZW87Ci0gICAgVmlkZW9Gb3JtYXRzIG1TdXBwb3J0ZWRTaW5rVmlkZW9Gb3JtYXRzOwotCi0gICAgVmlkZW9Gb3JtYXRzOjpSZXNvbHV0aW9uVHlwZSBtQ2hvc2VuVmlkZW9SZXNvbHV0aW9uVHlwZTsKLSAgICBzaXplX3QgbUNob3NlblZpZGVvUmVzb2x1dGlvbkluZGV4OwotICAgIFZpZGVvRm9ybWF0czo6UHJvZmlsZVR5cGUgbUNob3NlblZpZGVvUHJvZmlsZTsKLSAgICBWaWRlb0Zvcm1hdHM6OkxldmVsVHlwZSBtQ2hvc2VuVmlkZW9MZXZlbDsKLQotICAgIGJvb2wgbVNpbmtTdXBwb3J0c0F1ZGlvOwotCi0gICAgYm9vbCBtVXNpbmdQQ01BdWRpbzsKLSAgICBpbnQzMl90IG1DbGllbnRTZXNzaW9uSUQ7Ci0KLSAgICBzdHJ1Y3QgQ2xpZW50SW5mbyB7Ci0gICAgICAgIEFTdHJpbmcgbVJlbW90ZUlQOwotICAgICAgICBBU3RyaW5nIG1Mb2NhbElQOwotICAgICAgICBpbnQzMl90IG1Mb2NhbFBvcnQ7Ci0gICAgICAgIGludDMyX3QgbVBsYXliYWNrU2Vzc2lvbklEOwotICAgICAgICBzcDxQbGF5YmFja1Nlc3Npb24+IG1QbGF5YmFja1Nlc3Npb247Ci0gICAgfTsKLSAgICBDbGllbnRJbmZvIG1DbGllbnRJbmZvOwotCi0gICAgYm9vbCBtUmVhcGVyUGVuZGluZzsKLQotICAgIGludDMyX3QgbU5leHRDU2VxOwotCi0gICAgS2V5ZWRWZWN0b3I8UmVzcG9uc2VJRCwgSGFuZGxlUlRTUFJlc3BvbnNlRnVuYz4gbVJlc3BvbnNlSGFuZGxlcnM7Ci0KLSAgICAvLyBIRENQIHNwZWNpZmljIHNlY3Rpb24gPj4+PgotICAgIGJvb2wgbVVzaW5nSERDUDsKLSAgICBib29sIG1Jc0hEQ1AyXzA7Ci0gICAgaW50MzJfdCBtSERDUFBvcnQ7Ci0gICAgc3A8SUhEQ1A+IG1IRENQOwotICAgIHNwPEhEQ1BPYnNlcnZlcj4gbUhEQ1BPYnNlcnZlcjsKLQotICAgIGJvb2wgbUhEQ1BJbml0aWFsaXphdGlvbkNvbXBsZXRlOwotICAgIGJvb2wgbVNldHVwVHJpZ2dlckRlZmVycmVkOwotCi0gICAgYm9vbCBtUGxheWJhY2tTZXNzaW9uRXN0YWJsaXNoZWQ7Ci0KLSAgICBzdGF0dXNfdCBtYWtlSERDUCgpOwotICAgIC8vIDw8PDwgSERDUCBzcGVjaWZpYyBzZWN0aW9uCi0KLSAgICBzdGF0dXNfdCBzZW5kTTEoaW50MzJfdCBzZXNzaW9uSUQpOwotICAgIHN0YXR1c190IHNlbmRNMyhpbnQzMl90IHNlc3Npb25JRCk7Ci0gICAgc3RhdHVzX3Qgc2VuZE00KGludDMyX3Qgc2Vzc2lvbklEKTsKLQotICAgIGVudW0gVHJpZ2dlclR5cGUgewotICAgICAgICBUUklHR0VSX1NFVFVQLAotICAgICAgICBUUklHR0VSX1RFQVJET1dOLAotICAgICAgICBUUklHR0VSX1BBVVNFLAotICAgICAgICBUUklHR0VSX1BMQVksCi0gICAgfTsKLQotICAgIC8vIE01Ci0gICAgc3RhdHVzX3Qgc2VuZFRyaWdnZXIoaW50MzJfdCBzZXNzaW9uSUQsIFRyaWdnZXJUeXBlIHRyaWdnZXJUeXBlKTsKLQotICAgIHN0YXR1c190IHNlbmRNMTYoaW50MzJfdCBzZXNzaW9uSUQpOwotCi0gICAgc3RhdHVzX3Qgb25SZWNlaXZlTTFSZXNwb25zZSgKLSAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklELCBjb25zdCBzcDxQYXJzZWRNZXNzYWdlPiAmbXNnKTsKLQotICAgIHN0YXR1c190IG9uUmVjZWl2ZU0zUmVzcG9uc2UoCi0gICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwgY29uc3Qgc3A8UGFyc2VkTWVzc2FnZT4gJm1zZyk7Ci0KLSAgICBzdGF0dXNfdCBvblJlY2VpdmVNNFJlc3BvbnNlKAotICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsIGNvbnN0IHNwPFBhcnNlZE1lc3NhZ2U+ICZtc2cpOwotCi0gICAgc3RhdHVzX3Qgb25SZWNlaXZlTTVSZXNwb25zZSgKLSAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklELCBjb25zdCBzcDxQYXJzZWRNZXNzYWdlPiAmbXNnKTsKLQotICAgIHN0YXR1c190IG9uUmVjZWl2ZU0xNlJlc3BvbnNlKAotICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsIGNvbnN0IHNwPFBhcnNlZE1lc3NhZ2U+ICZtc2cpOwotCi0gICAgdm9pZCByZWdpc3RlclJlc3BvbnNlSGFuZGxlcigKLSAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklELCBpbnQzMl90IGNzZXEsIEhhbmRsZVJUU1BSZXNwb25zZUZ1bmMgZnVuYyk7Ci0KLSAgICBzdGF0dXNfdCBvblJlY2VpdmVDbGllbnREYXRhKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLQotICAgIHN0YXR1c190IG9uT3B0aW9uc1JlcXVlc3QoCi0gICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwKLSAgICAgICAgICAgIGludDMyX3QgY3NlcSwKLSAgICAgICAgICAgIGNvbnN0IHNwPFBhcnNlZE1lc3NhZ2U+ICZkYXRhKTsKLQotICAgIHN0YXR1c190IG9uU2V0dXBSZXF1ZXN0KAotICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsCi0gICAgICAgICAgICBpbnQzMl90IGNzZXEsCi0gICAgICAgICAgICBjb25zdCBzcDxQYXJzZWRNZXNzYWdlPiAmZGF0YSk7Ci0KLSAgICBzdGF0dXNfdCBvblBsYXlSZXF1ZXN0KAotICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsCi0gICAgICAgICAgICBpbnQzMl90IGNzZXEsCi0gICAgICAgICAgICBjb25zdCBzcDxQYXJzZWRNZXNzYWdlPiAmZGF0YSk7Ci0KLSAgICBzdGF0dXNfdCBvblBhdXNlUmVxdWVzdCgKLSAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklELAotICAgICAgICAgICAgaW50MzJfdCBjc2VxLAotICAgICAgICAgICAgY29uc3Qgc3A8UGFyc2VkTWVzc2FnZT4gJmRhdGEpOwotCi0gICAgc3RhdHVzX3Qgb25UZWFyZG93blJlcXVlc3QoCi0gICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwKLSAgICAgICAgICAgIGludDMyX3QgY3NlcSwKLSAgICAgICAgICAgIGNvbnN0IHNwPFBhcnNlZE1lc3NhZ2U+ICZkYXRhKTsKLQotICAgIHN0YXR1c190IG9uR2V0UGFyYW1ldGVyUmVxdWVzdCgKLSAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklELAotICAgICAgICAgICAgaW50MzJfdCBjc2VxLAotICAgICAgICAgICAgY29uc3Qgc3A8UGFyc2VkTWVzc2FnZT4gJmRhdGEpOwotCi0gICAgc3RhdHVzX3Qgb25TZXRQYXJhbWV0ZXJSZXF1ZXN0KAotICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsCi0gICAgICAgICAgICBpbnQzMl90IGNzZXEsCi0gICAgICAgICAgICBjb25zdCBzcDxQYXJzZWRNZXNzYWdlPiAmZGF0YSk7Ci0KLSAgICB2b2lkIHNlbmRFcnJvclJlc3BvbnNlKAotICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsCi0gICAgICAgICAgICBjb25zdCBjaGFyICplcnJvckRldGFpbCwKLSAgICAgICAgICAgIGludDMyX3QgY3NlcSk7Ci0KLSAgICBzdGF0aWMgdm9pZCBBcHBlbmRDb21tb25SZXNwb25zZSgKLSAgICAgICAgICAgIEFTdHJpbmcgKnJlc3BvbnNlLCBpbnQzMl90IGNzZXEsIGludDMyX3QgcGxheWJhY2tTZXNzaW9uSUQgPSAtMWxsKTsKLQotICAgIHZvaWQgc2NoZWR1bGVSZWFwZXIoKTsKLSAgICB2b2lkIHNjaGVkdWxlS2VlcEFsaXZlKGludDMyX3Qgc2Vzc2lvbklEKTsKLQotICAgIGludDMyX3QgbWFrZVVuaXF1ZVBsYXliYWNrU2Vzc2lvbklEKCkgY29uc3Q7Ci0KLSAgICBzcDxQbGF5YmFja1Nlc3Npb24+IGZpbmRQbGF5YmFja1Nlc3Npb24oCi0gICAgICAgICAgICBjb25zdCBzcDxQYXJzZWRNZXNzYWdlPiAmZGF0YSwgaW50MzJfdCAqcGxheWJhY2tTZXNzaW9uSUQpIGNvbnN0OwotCi0gICAgdm9pZCBmaW5pc2hTdG9wKCk7Ci0gICAgdm9pZCBkaXNjb25uZWN0Q2xpZW50QXN5bmMoKTsKLSAgICB2b2lkIGRpc2Nvbm5lY3RDbGllbnQyKCk7Ci0gICAgdm9pZCBmaW5pc2hTdG9wQWZ0ZXJEaXNjb25uZWN0aW5nQ2xpZW50KCk7Ci0gICAgdm9pZCBmaW5pc2hTdG9wMigpOwotCi0gICAgdm9pZCBmaW5pc2hQbGF5KCk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhXaWZpRGlzcGxheVNvdXJjZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIFdJRklfRElTUExBWV9TT1VSQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAKaW5kZXggMzUwNzI4NC4uYTRmYTM0MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAKQEAgLTE1LDEwICsxNSw3IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliZXhwYXQiLAotICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teF91dGlscyIsCiAgICAgXSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL0FuZHJvaWQuYnAgYi9tZWRpYS9tdHAvQW5kcm9pZC5icAppbmRleCA1ZDVhZTQ5Li4yY2Y5YjgyIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvQW5kcm9pZC5icAorKysgYi9tZWRpYS9tdHAvQW5kcm9pZC5icApAQCAtMTcsMTMgKzE3LDE0IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYm10cCIsCiAgICAgc3JjczogWwotICAgICAgICAiQXN5bmNJTy5jcHAiLAogICAgICAgICAiTXRwRGF0YVBhY2tldC5jcHAiLAogICAgICAgICAiTXRwRGVidWcuY3BwIiwKKyAgICAgICAgIk10cERlc2NyaXB0b3JzLmNwcCIsCiAgICAgICAgICJNdHBEZXZIYW5kbGUuY3BwIiwKICAgICAgICAgIk10cERldmljZS5jcHAiLAogICAgICAgICAiTXRwRGV2aWNlSW5mby5jcHAiLAogICAgICAgICAiTXRwRXZlbnRQYWNrZXQuY3BwIiwKKyAgICAgICAgIk10cEZmc0NvbXBhdEhhbmRsZS5jcHAiLAogICAgICAgICAiTXRwRmZzSGFuZGxlLmNwcCIsCiAgICAgICAgICJNdHBPYmplY3RJbmZvLmNwcCIsCiAgICAgICAgICJNdHBQYWNrZXQuY3BwIiwKQEAgLTM1LDYgKzM2LDcgQEAKICAgICAgICAgIk10cFN0b3JhZ2VJbmZvLmNwcCIsCiAgICAgICAgICJNdHBTdHJpbmdCdWZmZXIuY3BwIiwKICAgICAgICAgIk10cFV0aWxzLmNwcCIsCisgICAgICAgICJQb3NpeEFzeW5jSU8uY3BwIiwKICAgICBdLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAogICAgIGNmbGFnczogWwpAQCAtNDUsOCArNDcsOCBAQAogICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXN5bmNpbyIsCiAgICAgICAgICJsaWJiYXNlIiwKLSAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJ1c2Job3N0IiwKICAgICBdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL0FzeW5jSU8uY3BwIGIvbWVkaWEvbXRwL0FzeW5jSU8uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmIwN2RjLi4wMDAwMDAwCi0tLSBhL21lZGlhL210cC9Bc3luY0lPLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxtdXRleD4KLSNpbmNsdWRlIDxxdWV1ZT4KLQotI2luY2x1ZGUgIkFzeW5jSU8uaCIKLQotbmFtZXNwYWNlIHsKLQotdm9pZCByZWFkX2Z1bmMoc3RydWN0IGFpb2NiICphaW9jYnApIHsKLSAgICBhaW9jYnAtPnJldCA9IFRFTVBfRkFJTFVSRV9SRVRSWShwcmVhZChhaW9jYnAtPmFpb19maWxkZXMsCi0gICAgICAgICAgICAgICAgYWlvY2JwLT5haW9fYnVmLCBhaW9jYnAtPmFpb19uYnl0ZXMsIGFpb2NicC0+YWlvX29mZnNldCkpOwotICAgIGlmIChhaW9jYnAtPnJldCA9PSAtMSkgYWlvY2JwLT5lcnJvciA9IGVycm5vOwotfQotCi12b2lkIHdyaXRlX2Z1bmMoc3RydWN0IGFpb2NiICphaW9jYnApIHsKLSAgICBhaW9jYnAtPnJldCA9IFRFTVBfRkFJTFVSRV9SRVRSWShwd3JpdGUoYWlvY2JwLT5haW9fZmlsZGVzLAotICAgICAgICAgICAgICAgIGFpb2NicC0+YWlvX2J1ZiwgYWlvY2JwLT5haW9fbmJ5dGVzLCBhaW9jYnAtPmFpb19vZmZzZXQpKTsKLSAgICBpZiAoYWlvY2JwLT5yZXQgPT0gLTEpIGFpb2NicC0+ZXJyb3IgPSBlcnJubzsKLX0KLQotdm9pZCBzcGxpY2VfcmVhZF9mdW5jKHN0cnVjdCBhaW9jYiAqYWlvY2JwKSB7Ci0gICAgbG9mZl90IGxvbmdfb2Zmc2V0ID0gYWlvY2JwLT5haW9fb2Zmc2V0OwotICAgIGFpb2NicC0+cmV0ID0gVEVNUF9GQUlMVVJFX1JFVFJZKHNwbGljZShhaW9jYnAtPmFpb19maWxkZXMsCi0gICAgICAgICAgICAgICAgJmxvbmdfb2Zmc2V0LCBhaW9jYnAtPmFpb19zaW5rLAotICAgICAgICAgICAgICAgIE5VTEwsIGFpb2NicC0+YWlvX25ieXRlcywgMCkpOwotICAgIGlmIChhaW9jYnAtPnJldCA9PSAtMSkgYWlvY2JwLT5lcnJvciA9IGVycm5vOwotfQotCi12b2lkIHNwbGljZV93cml0ZV9mdW5jKHN0cnVjdCBhaW9jYiAqYWlvY2JwKSB7Ci0gICAgbG9mZl90IGxvbmdfb2Zmc2V0ID0gYWlvY2JwLT5haW9fb2Zmc2V0OwotICAgIGFpb2NicC0+cmV0ID0gVEVNUF9GQUlMVVJFX1JFVFJZKHNwbGljZShhaW9jYnAtPmFpb19maWxkZXMsIE5VTEwsCi0gICAgICAgICAgICAgICAgYWlvY2JwLT5haW9fc2luaywgJmxvbmdfb2Zmc2V0LAotICAgICAgICAgICAgICAgIGFpb2NicC0+YWlvX25ieXRlcywgMCkpOwotICAgIGlmIChhaW9jYnAtPnJldCA9PSAtMSkgYWlvY2JwLT5lcnJvciA9IGVycm5vOwotfQotCi1zdGQ6OnF1ZXVlPHN0ZDo6dW5pcXVlX3B0cjxzdHJ1Y3QgYWlvY2I+PiBxdWV1ZTsKLXN0ZDo6bXV0ZXggcXVldWVfbG9jazsKLXN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIHF1ZXVlX2NvbmQ7Ci1zdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSB3cml0ZV9jb25kOwotaW50IGRvbmUgPSAxOwotdm9pZCBzcGxpY2Vfd3JpdGVfcG9vbF9mdW5jKGludCkgewotICAgIHdoaWxlKDEpIHsKLSAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsayhxdWV1ZV9sb2NrKTsKLSAgICAgICAgcXVldWVfY29uZC53YWl0KGxrLCBbXXtyZXR1cm4gIXF1ZXVlLmVtcHR5KCkgfHwgZG9uZTt9KTsKLSAgICAgICAgaWYgKHF1ZXVlLmVtcHR5KCkgJiYgZG9uZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxzdHJ1Y3QgYWlvY2I+IGFpb2NicCA9IHN0ZDo6bW92ZShxdWV1ZS5mcm9udCgpKTsKLSAgICAgICAgcXVldWUucG9wKCk7Ci0gICAgICAgIGxrLnVubG9jaygpOwotICAgICAgICB3cml0ZV9jb25kLm5vdGlmeV9vbmUoKTsKLSAgICAgICAgc3BsaWNlX3dyaXRlX2Z1bmMoYWlvY2JwLmdldCgpKTsKLSAgICAgICAgY2xvc2UoYWlvY2JwLT5haW9fZmlsZGVzKTsKLSAgICB9Ci19Ci0KLXZvaWQgd3JpdGVfcG9vbF9mdW5jKGludCkgewotICAgIHdoaWxlKDEpIHsKLSAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsayhxdWV1ZV9sb2NrKTsKLSAgICAgICAgcXVldWVfY29uZC53YWl0KGxrLCBbXXtyZXR1cm4gIXF1ZXVlLmVtcHR5KCkgfHwgZG9uZTt9KTsKLSAgICAgICAgaWYgKHF1ZXVlLmVtcHR5KCkgJiYgZG9uZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxzdHJ1Y3QgYWlvY2I+IGFpb2NicCA9IHN0ZDo6bW92ZShxdWV1ZS5mcm9udCgpKTsKLSAgICAgICAgcXVldWUucG9wKCk7Ci0gICAgICAgIGxrLnVubG9jaygpOwotICAgICAgICB3cml0ZV9jb25kLm5vdGlmeV9vbmUoKTsKLSAgICAgICAgYWlvY2JwLT5yZXQgPSBURU1QX0ZBSUxVUkVfUkVUUlkocHdyaXRlKGFpb2NicC0+YWlvX2ZpbGRlcywKLSAgICAgICAgICAgICAgICAgICAgYWlvY2JwLT5haW9fcG9vbF9idWYuZ2V0KCksIGFpb2NicC0+YWlvX25ieXRlcywgYWlvY2JwLT5haW9fb2Zmc2V0KSk7Ci0gICAgICAgIGlmIChhaW9jYnAtPnJldCA9PSAtMSkgYWlvY2JwLT5lcnJvciA9IGVycm5vOwotICAgIH0KLX0KLQotY29uc3RleHByIGludCBOVU1fVEhSRUFEUyA9IDE7Ci1jb25zdGV4cHIgaW50IE1BWF9RVUVVRV9TSVpFID0gMTA7Ci1zdGQ6OnRocmVhZCBwb29sW05VTV9USFJFQURTXTsKLQotfSAvLyBlbmQgYW5vbnltb3VzIG5hbWVzcGFjZQotCi1haW9jYjo6fmFpb2NiKCkgewotICAgIENIRUNLKCF0aHJlYWQuam9pbmFibGUoKSk7Ci19Ci0KLXZvaWQgYWlvX3Bvb2xfaW5pdCh2b2lkKGYpKGludCkpIHsKLSAgICBDSEVDSyhkb25lID09IDEpOwotICAgIGRvbmUgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RIUkVBRFM7IGkrKykgewotICAgICAgICBwb29sW2ldID0gc3RkOjp0aHJlYWQoZiwgaSk7Ci0gICAgfQotfQotCi12b2lkIGFpb19wb29sX3NwbGljZV9pbml0KCkgewotICAgIGFpb19wb29sX2luaXQoc3BsaWNlX3dyaXRlX3Bvb2xfZnVuYyk7Ci19Ci0KLXZvaWQgYWlvX3Bvb2xfd3JpdGVfaW5pdCgpIHsKLSAgICBhaW9fcG9vbF9pbml0KHdyaXRlX3Bvb2xfZnVuYyk7Ci19Ci0KLXZvaWQgYWlvX3Bvb2xfZW5kKCkgewotICAgIGRvbmUgPSAxOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RIUkVBRFM7IGkrKykgewotICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxrKHF1ZXVlX2xvY2spOwotICAgICAgICBsay51bmxvY2soKTsKLSAgICAgICAgcXVldWVfY29uZC5ub3RpZnlfb25lKCk7Ci0gICAgfQotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fVEhSRUFEUzsgaSsrKSB7Ci0gICAgICAgIHBvb2xbaV0uam9pbigpOwotICAgIH0KLX0KLQotLy8gdXNlZCBmb3IgYm90aCB3cml0ZXMgYW5kIHNwbGljZXMgZGVwZW5kaW5nIG9uIHdoaWNoIGluaXQgd2FzIHVzZWQgYmVmb3JlLgotaW50IGFpb19wb29sX3dyaXRlKHN0cnVjdCBhaW9jYiAqYWlvY2JwKSB7Ci0gICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsayhxdWV1ZV9sb2NrKTsKLSAgICB3cml0ZV9jb25kLndhaXQobGssIFtde3JldHVybiBxdWV1ZS5zaXplKCkgPCBNQVhfUVVFVUVfU0laRTt9KTsKLSAgICBxdWV1ZS5wdXNoKHN0ZDo6dW5pcXVlX3B0cjxzdHJ1Y3QgYWlvY2I+KGFpb2NicCkpOwotICAgIGxrLnVubG9jaygpOwotICAgIHF1ZXVlX2NvbmQubm90aWZ5X29uZSgpOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgYWlvX3JlYWQoc3RydWN0IGFpb2NiICphaW9jYnApIHsKLSAgICBhaW9jYnAtPnRocmVhZCA9IHN0ZDo6dGhyZWFkKHJlYWRfZnVuYywgYWlvY2JwKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGFpb193cml0ZShzdHJ1Y3QgYWlvY2IgKmFpb2NicCkgewotICAgIGFpb2NicC0+dGhyZWFkID0gc3RkOjp0aHJlYWQod3JpdGVfZnVuYywgYWlvY2JwKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGFpb19zcGxpY2VfcmVhZChzdHJ1Y3QgYWlvY2IgKmFpb2NicCkgewotICAgIGFpb2NicC0+dGhyZWFkID0gc3RkOjp0aHJlYWQoc3BsaWNlX3JlYWRfZnVuYywgYWlvY2JwKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGFpb19zcGxpY2Vfd3JpdGUoc3RydWN0IGFpb2NiICphaW9jYnApIHsKLSAgICBhaW9jYnAtPnRocmVhZCA9IHN0ZDo6dGhyZWFkKHNwbGljZV93cml0ZV9mdW5jLCBhaW9jYnApOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgYWlvX2Vycm9yKGNvbnN0IHN0cnVjdCBhaW9jYiAqYWlvY2JwKSB7Ci0gICAgcmV0dXJuIGFpb2NicC0+ZXJyb3I7Ci19Ci0KLXNzaXplX3QgYWlvX3JldHVybihzdHJ1Y3QgYWlvY2IgKmFpb2NicCkgewotICAgIHJldHVybiBhaW9jYnAtPnJldDsKLX0KLQotaW50IGFpb19zdXNwZW5kKHN0cnVjdCBhaW9jYiAqYWlvY2JwW10sIGludCBuLAotICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKikgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgIGFpb2NicFtpXS0+dGhyZWFkLmpvaW4oKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBhaW9fY2FuY2VsKGludCwgc3RydWN0IGFpb2NiICopIHsKLSAgICAvLyBOb3QgaW1wbGVtZW50ZWQKLSAgICByZXR1cm4gLTE7Ci19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL210cC9Bc3luY0lPLmggYi9tZWRpYS9tdHAvQXN5bmNJTy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDgwODI4Li4wMDAwMDAwCi0tLSBhL21lZGlhL210cC9Bc3luY0lPLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfQVNZTkNJT19ICi0jZGVmaW5lIF9BU1lOQ0lPX0gKLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8bGludXgvYWlvX2FiaS5oPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8dGhyZWFkPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0vKioKLSAqIFByb3ZpZGVzIGEgc3Vic2V0IG9mIFBPU0lYIGFpbyBvcGVyYXRpb25zLCBhcyB3ZWxsCi0gKiBhcyBzaW1pbGFyIG9wZXJhdGlvbnMgd2l0aCBzcGxpY2UgYW5kIHRocmVhZHBvb2xzLgotICovCi0KLXN0cnVjdCBhaW9jYiB7Ci0gICAgaW50IGFpb19maWxkZXM7ICAgICAvLyBBc3N1bWVkIHRvIGJlIHRoZSBzb3VyY2UgZm9yIHNwbGljZXMKLSAgICB2b2lkICphaW9fYnVmOyAgICAgIC8vIFVudXNlZCBmb3Igc3BsaWNlcwotCi0gICAgLy8gVXNlZCBmb3IgdGhyZWFkcG9vbCBvcGVyYXRpb25zIG9ubHksIGZyZWVkIGF1dG9tYXRpY2FsbHkKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Y2hhcltdPiBhaW9fcG9vbF9idWY7Ci0KLSAgICBvZmZfdCBhaW9fb2Zmc2V0OwotICAgIHNpemVfdCBhaW9fbmJ5dGVzOwotCi0gICAgaW50IGFpb19zaW5rOyAgICAgICAvLyBVbnVzZWQgZm9yIG5vbiBzcGxpY2Ugci93Ci0KLSAgICAvLyBVc2VkIGludGVybmFsbHkKLSAgICBzdGQ6OnRocmVhZCB0aHJlYWQ7Ci0gICAgc3NpemVfdCByZXQ7Ci0gICAgaW50IGVycm9yOwotCi0gICAgfmFpb2NiKCk7Ci19OwotCi0vLyBTdWJtaXQgYSByZXF1ZXN0IGZvciBJTyB0byBiZSBjb21wbGV0ZWQKLWludCBhaW9fcmVhZChzdHJ1Y3QgYWlvY2IgKik7Ci1pbnQgYWlvX3dyaXRlKHN0cnVjdCBhaW9jYiAqKTsKLWludCBhaW9fc3BsaWNlX3JlYWQoc3RydWN0IGFpb2NiICopOwotaW50IGFpb19zcGxpY2Vfd3JpdGUoc3RydWN0IGFpb2NiICopOwotCi0vLyBTdXNwZW5kIGN1cnJlbnQgdGhyZWFkIHVudGlsIGdpdmVuIElPIGlzIGNvbXBsZXRlLCBhdCB3aGljaCBwb2ludAotLy8gaXRzIHJldHVybiB2YWx1ZSBhbmQgYW55IGVycm9ycyBjYW4gYmUgYWNjZXNzZWQKLS8vIEFsbCBzdWJtaXR0ZWQgcmVxdWVzdHMgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBzdXNwZW5kLgotLy8gYWlvY2ItPmFpb19idWYgbXVzdCByZWZlciB0byB2YWxpZCBtZW1vcnkgdW50aWwgYWZ0ZXIgdGhlIHN1c3BlbmQgY2FsbAotaW50IGFpb19zdXNwZW5kKHN0cnVjdCBhaW9jYiAqW10sIGludCwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICopOwotaW50IGFpb19lcnJvcihjb25zdCBzdHJ1Y3QgYWlvY2IgKik7Ci1zc2l6ZV90IGFpb19yZXR1cm4oc3RydWN0IGFpb2NiICopOwotCi0vLyAoQ3VycmVudGx5IHVuaW1wbGVtZW50ZWQpCi1pbnQgYWlvX2NhbmNlbChpbnQsIHN0cnVjdCBhaW9jYiAqKTsKLQotLy8gSW5pdGlhbGl6ZSBhIHRocmVhZHBvb2wgdG8gcGVyZm9ybSBJTy4gT25seSBvbmUgcG9vbCBjYW4gYmUKLS8vIHJ1bm5pbmcgYXQgYSB0aW1lLgotdm9pZCBhaW9fcG9vbF93cml0ZV9pbml0KCk7Ci12b2lkIGFpb19wb29sX3NwbGljZV9pbml0KCk7Ci0vLyBTdXNwZW5kIGN1cnJlbnQgdGhyZWFkIHVudGlsIGFsbCBxdWV1ZWQgd29yayBpcyBjb21wbGV0ZSwgdGhlbiBlbmRzIHRoZSB0aHJlYWRwb29sCi12b2lkIGFpb19wb29sX2VuZCgpOwotLy8gU3VibWl0IElPIHdvcmsgZm9yIHRoZSB0aHJlYWRwb29sIHRvIGNvbXBsZXRlLiBNZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSB3b3JrIGlzCi0vLyBmcmVlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHdvcmsgaXMgY29tcGxldGUuCi1pbnQgYWlvX3Bvb2xfd3JpdGUoc3RydWN0IGFpb2NiICopOwotCi0jZW5kaWYgLy8gQVNZTkNJT19ICi0KZGlmZiAtLWdpdCBhL21lZGlhL210cC9JTXRwRGF0YWJhc2UuaCBiL21lZGlhL210cC9JTXRwRGF0YWJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjQ1MDkyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL0lNdHBEYXRhYmFzZS5oCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfSV9NVFBfREFUQUJBU0VfSAorI2RlZmluZSBfSV9NVFBfREFUQUJBU0VfSAorCisjaW5jbHVkZSAiTXRwVHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEYXRhUGFja2V0OworY2xhc3MgTXRwUHJvcGVydHk7CitjbGFzcyBNdHBPYmplY3RJbmZvOworY2xhc3MgTXRwU3RyaW5nQnVmZmVyOworCitjbGFzcyBJTXRwRGF0YWJhc2UgeworcHVibGljOgorICAgIHZpcnR1YWwgfklNdHBEYXRhYmFzZSgpIHt9CisKKyAgICAvLyBDYWxsZWQgZnJvbSBTZW5kT2JqZWN0SW5mbyB0byByZXNlcnZlIGEgZGF0YWJhc2UgZW50cnkgZm9yIHRoZSBpbmNvbWluZyBmaWxlLgorICAgIHZpcnR1YWwgTXRwT2JqZWN0SGFuZGxlICAgICAgICAgYmVnaW5TZW5kT2JqZWN0KGNvbnN0IGNoYXIqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlKSA9IDA7CisKKyAgICAvLyBDYWxsZWQgdG8gcmVwb3J0IHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiB0aGUgU2VuZE9iamVjdCBmaWxlIHRyYW5zZmVyLgorICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgZW5kU2VuZE9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2NlZWRlZCkgPSAwOworICAgIAorICAgIC8vIENhbGxlZCB0byByZXNjYW4gYSBmaWxlLCBzdWNoIGFzIGFmdGVyIGFuIGVkaXQuCisgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgICAgICByZXNjYW5GaWxlKGNvbnN0IGNoYXIqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQpID0gMDsKKworICAgIHZpcnR1YWwgTXRwT2JqZWN0SGFuZGxlTGlzdCogICAgZ2V0T2JqZWN0TGlzdChNdHBTdG9yYWdlSUQgc3RvcmFnZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50KSA9IDA7CisKKyAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICAgICAgICAgIGdldE51bU9iamVjdHMoTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCkgPSAwOworCisgICAgLy8gY2FsbGVlIHNob3VsZCBkZWxldGVbXSB0aGUgcmVzdWx0cyBmcm9tIHRoZXNlCisgICAgLy8gcmVzdWx0cyBjYW4gYmUgTlVMTAorICAgIHZpcnR1YWwgTXRwT2JqZWN0Rm9ybWF0TGlzdCogICAgZ2V0U3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzKCkgPSAwOworICAgIHZpcnR1YWwgTXRwT2JqZWN0Rm9ybWF0TGlzdCogICAgZ2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHMoKSA9IDA7CisgICAgdmlydHVhbCBNdHBPYmplY3RQcm9wZXJ0eUxpc3QqICBnZXRTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzKE10cE9iamVjdEZvcm1hdCBmb3JtYXQpID0gMDsKKyAgICB2aXJ0dWFsIE10cERldmljZVByb3BlcnR5TGlzdCogIGdldFN1cHBvcnRlZERldmljZVByb3BlcnRpZXMoKSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdFByb3BlcnR5VmFsdWUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgPSAwOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBzZXRPYmplY3RQcm9wZXJ0eVZhbHVlKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpID0gMDsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgZ2V0RGV2aWNlUHJvcGVydHlWYWx1ZShNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIHNldERldmljZVByb3BlcnR5VmFsdWUoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgPSAwOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICByZXNldERldmljZVByb3BlcnR5KE10cERldmljZVByb3BlcnR5IHByb3BlcnR5KSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdFByb3BlcnR5TGlzdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsIHVpbnQzMl90IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3JvdXBDb2RlLCBpbnQgZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgPSAwOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBnZXRPYmplY3RJbmZvKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEluZm8mIGluZm8pID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCogICAgICAgICAgICAgICAgICAgZ2V0VGh1bWJuYWlsKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIHNpemVfdCYgb3V0VGh1bWJTaXplKSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdEZpbGVQYXRoKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0cmluZ0J1ZmZlciYgb3V0RmlsZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QmIG91dEZpbGVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCYgb3V0Rm9ybWF0KSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGJlZ2luRGVsZXRlT2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIGVuZERlbGV0ZU9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBib29sIHN1Y2NlZWRlZCkgPSAwOworCisgICAgdmlydHVhbCBNdHBPYmplY3RIYW5kbGVMaXN0KiAgICBnZXRPYmplY3RSZWZlcmVuY2VzKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpID0gMDsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgc2V0T2JqZWN0UmVmZXJlbmNlcyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiByZWZlcmVuY2VzKSA9IDA7CisKKyAgICB2aXJ0dWFsIE10cFByb3BlcnR5KiAgICAgICAgICAgIGdldE9iamVjdFByb3BlcnR5RGVzYyhNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCkgPSAwOworCisgICAgdmlydHVhbCBNdHBQcm9wZXJ0eSogICAgICAgICAgICBnZXREZXZpY2VQcm9wZXJ0eURlc2MoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkpID0gMDsKKworICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgYmVnaW5Nb3ZlT2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIE10cE9iamVjdEhhbmRsZSBuZXdQYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBuZXdTdG9yYWdlKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIGVuZE1vdmVPYmplY3QoTXRwT2JqZWN0SGFuZGxlIG9sZFBhcmVudCwgTXRwT2JqZWN0SGFuZGxlIG5ld1BhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUlEIG9sZFN0b3JhZ2UsIE10cFN0b3JhZ2VJRCBuZXdTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBib29sIHN1Y2NlZWRlZCkgPSAwOworCisgICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBiZWdpbkNvcHlPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgTXRwT2JqZWN0SGFuZGxlIG5ld1BhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUlEIG5ld1N0b3JhZ2UpOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgZW5kQ29weU9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBib29sIHN1Y2NlZWRlZCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX0lfTVRQX0RBVEFCQVNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9JTXRwSGFuZGxlLmggYi9tZWRpYS9tdHAvSU10cEhhbmRsZS5oCmluZGV4IDA1NTc1OTYuLmZkMTRiMTggMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9JTXRwSGFuZGxlLmgKKysrIGIvbWVkaWEvbXRwL0lNdHBIYW5kbGUuaApAQCAtMTgsMTMgKzE4LDEzIEBACiAKICNpbmNsdWRlIDxsaW51eC91c2IvZl9tdHAuaD4KIAotY29uc3RleHByIGNoYXIgRkZTX01UUF9FUDBbXSA9ICIvZGV2L3VzYi1mZnMvbXRwL2VwMCI7CituYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIElNdHBIYW5kbGUgewogcHVibGljOgogICAgIC8vIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgcmVhZC93cml0dGVuLCBvciAtMSBhbmQgZXJybm8gaXMgc2V0Ci0gICAgdmlydHVhbCBpbnQgcmVhZCh2b2lkICpkYXRhLCBpbnQgbGVuKSA9IDA7Ci0gICAgdmlydHVhbCBpbnQgd3JpdGUoY29uc3Qgdm9pZCAqZGF0YSwgaW50IGxlbikgPSAwOworICAgIHZpcnR1YWwgaW50IHJlYWQodm9pZCAqZGF0YSwgc2l6ZV90IGxlbikgPSAwOworICAgIHZpcnR1YWwgaW50IHdyaXRlKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pID0gMDsKIAogICAgIC8vIFJldHVybiAwIGlmIHNlbmQvcmVjZWl2ZSBpcyBzdWNjZXNzZnVsLCBvciAtMSBhbmQgZXJybm8gaXMgc2V0CiAgICAgdmlydHVhbCBpbnQgcmVjZWl2ZUZpbGUobXRwX2ZpbGVfcmFuZ2UgbWZyLCBib29sIHplcm9fcGFja2V0KSA9IDA7CkBAIC0zMiwxNiArMzIsMTQgQEAKICAgICB2aXJ0dWFsIGludCBzZW5kRXZlbnQobXRwX2V2ZW50IG1lKSA9IDA7CiAKICAgICAvLyBSZXR1cm4gMCBpZiBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bCwgb3IgLTEgZWxzZQotICAgIHZpcnR1YWwgaW50IHN0YXJ0KCkgPSAwOwotICAgIHZpcnR1YWwgaW50IGNvbmZpZ3VyZShib29sIHB0cCkgPSAwOworICAgIHZpcnR1YWwgaW50IHN0YXJ0KGJvb2wgcHRwKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSA9IDA7CiAKICAgICB2aXJ0dWFsIH5JTXRwSGFuZGxlKCkge30KIH07CiAKLUlNdHBIYW5kbGUgKmdldF9mZnNfaGFuZGxlKCk7Ci1JTXRwSGFuZGxlICpnZXRfbXRwX2hhbmRsZSgpOworfQogCiAjZW5kaWYgLy8gX0lNVFBfSEFORExFX0gKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuY3BwIGIvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuY3BwCmluZGV4IGQxYzcxZDcuLjk5MmRjOWEgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmNwcAorKysgYi9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CkBAIC0xMjksNyArMTMwLDcgQEAKICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHQ7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICByZXN1bHQtPnB1c2godmFsdWUpOworICAgICAgICByZXN1bHQtPnB1c2hfYmFjayh2YWx1ZSk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CkBAIC0xNDUsNyArMTQ2LDcgQEAKICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHQ7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICByZXN1bHQtPnB1c2godmFsdWUpOworICAgICAgICByZXN1bHQtPnB1c2hfYmFjayh2YWx1ZSk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CkBAIC0xNjEsNyArMTYyLDcgQEAKICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHQ7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICByZXN1bHQtPnB1c2godmFsdWUpOworICAgICAgICByZXN1bHQtPnB1c2hfYmFjayh2YWx1ZSk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CkBAIC0xNzcsNyArMTc4LDcgQEAKICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHQ7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICByZXN1bHQtPnB1c2godmFsdWUpOworICAgICAgICByZXN1bHQtPnB1c2hfYmFjayh2YWx1ZSk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CkBAIC0xOTMsNyArMTk0LDcgQEAKICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHQ7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICByZXN1bHQtPnB1c2godmFsdWUpOworICAgICAgICByZXN1bHQtPnB1c2hfYmFjayh2YWx1ZSk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CkBAIC0yMDksNyArMjEwLDcgQEAKICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHQ7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICByZXN1bHQtPnB1c2godmFsdWUpOworICAgICAgICByZXN1bHQtPnB1c2hfYmFjayh2YWx1ZSk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CkBAIC0yMjUsNyArMjI2LDcgQEAKICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHQ7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICByZXN1bHQtPnB1c2godmFsdWUpOworICAgICAgICByZXN1bHQtPnB1c2hfYmFjayh2YWx1ZSk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CkBAIC0yNDEsNyArMjQyLDcgQEAKICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHQ7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICByZXN1bHQtPnB1c2godmFsdWUpOworICAgICAgICByZXN1bHQtPnB1c2hfYmFjayh2YWx1ZSk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5oIGIvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuaAppbmRleCBhNDQ5ZDZmLi4xZGRiODIxIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5oCisrKyBiL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmgKQEAgLTIwLDEyICsyMCwxMiBAQAogI2luY2x1ZGUgIk10cFBhY2tldC5oIgogI2luY2x1ZGUgIm10cC5oIgogCi1jbGFzcyBJTXRwSGFuZGxlOwogc3RydWN0IHVzYl9kZXZpY2U7CiBzdHJ1Y3QgdXNiX3JlcXVlc3Q7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY2xhc3MgSU10cEhhbmRsZTsKIGNsYXNzIE10cFN0cmluZ0J1ZmZlcjsKIAogY2xhc3MgTXRwRGF0YVBhY2tldCA6IHB1YmxpYyBNdHBQYWNrZXQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERhdGFiYXNlLmggYi9tZWRpYS9tdHAvTXRwRGF0YWJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU2YWM3YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9tdHAvTXRwRGF0YWJhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfTVRQX0RBVEFCQVNFX0gKLSNkZWZpbmUgX01UUF9EQVRBQkFTRV9ICi0KLSNpbmNsdWRlICJNdHBUeXBlcy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE10cERhdGFQYWNrZXQ7Ci1jbGFzcyBNdHBQcm9wZXJ0eTsKLWNsYXNzIE10cE9iamVjdEluZm87Ci0KLWNsYXNzIE10cERhdGFiYXNlIHsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5NdHBEYXRhYmFzZSgpIHt9Ci0KLSAgICAvLyBjYWxsZWQgZnJvbSBTZW5kT2JqZWN0SW5mbyB0byByZXNlcnZlIGEgZGF0YWJhc2UgZW50cnkgZm9yIHRoZSBpbmNvbWluZyBmaWxlCi0gICAgdmlydHVhbCBNdHBPYmplY3RIYW5kbGUgICAgICAgICBiZWdpblNlbmRPYmplY3QoY29uc3QgY2hhciogcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfdCBtb2RpZmllZCkgPSAwOwotCi0gICAgLy8gY2FsbGVkIHRvIHJlcG9ydCBzdWNjZXNzIG9yIGZhaWx1cmUgb2YgdGhlIFNlbmRPYmplY3QgZmlsZSB0cmFuc2ZlcgotICAgIC8vIHN1Y2Nlc3Mgc2hvdWxkIHNpZ25hbCBhIG5vdGlmaWNhdGlvbiBvZiB0aGUgbmV3IG9iamVjdCdzIGNyZWF0aW9uLAotICAgIC8vIGZhaWx1cmUgc2hvdWxkIHJlbW92ZSB0aGUgZGF0YWJhc2UgZW50cnkgY3JlYXRlZCBpbiBiZWdpblNlbmRPYmplY3QKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIGVuZFNlbmRPYmplY3QoY29uc3QgY2hhciogcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZWVkZWQpID0gMDsKLQotICAgIHZpcnR1YWwgTXRwT2JqZWN0SGFuZGxlTGlzdCogICAgZ2V0T2JqZWN0TGlzdChNdHBTdG9yYWdlSUQgc3RvcmFnZUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50KSA9IDA7Ci0KLSAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICAgICAgICAgIGdldE51bU9iamVjdHMoTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCkgPSAwOwotCi0gICAgLy8gY2FsbGVlIHNob3VsZCBkZWxldGVbXSB0aGUgcmVzdWx0cyBmcm9tIHRoZXNlCi0gICAgLy8gcmVzdWx0cyBjYW4gYmUgTlVMTAotICAgIHZpcnR1YWwgTXRwT2JqZWN0Rm9ybWF0TGlzdCogICAgZ2V0U3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzKCkgPSAwOwotICAgIHZpcnR1YWwgTXRwT2JqZWN0Rm9ybWF0TGlzdCogICAgZ2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHMoKSA9IDA7Ci0gICAgdmlydHVhbCBNdHBPYmplY3RQcm9wZXJ0eUxpc3QqICBnZXRTdXBwb3J0ZWRPYmplY3RQcm9wZXJ0aWVzKE10cE9iamVjdEZvcm1hdCBmb3JtYXQpID0gMDsKLSAgICB2aXJ0dWFsIE10cERldmljZVByb3BlcnR5TGlzdCogIGdldFN1cHBvcnRlZERldmljZVByb3BlcnRpZXMoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdFByb3BlcnR5VmFsdWUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgPSAwOwotCi0gICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBzZXRPYmplY3RQcm9wZXJ0eVZhbHVlKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpID0gMDsKLQotICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgZ2V0RGV2aWNlUHJvcGVydHlWYWx1ZShNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSA9IDA7Ci0KLSAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIHNldERldmljZVByb3BlcnR5VmFsdWUoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgPSAwOwotCi0gICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICByZXNldERldmljZVByb3BlcnR5KE10cERldmljZVByb3BlcnR5IHByb3BlcnR5KSA9IDA7Ci0KLSAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdFByb3BlcnR5TGlzdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsIHVpbnQzMl90IHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3JvdXBDb2RlLCBpbnQgZGVwdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCkgPSAwOwotCi0gICAgdmlydHVhbCBNdHBSZXNwb25zZUNvZGUgICAgICAgICBnZXRPYmplY3RJbmZvKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEluZm8mIGluZm8pID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCogICAgICAgICAgICAgICAgICAgZ2V0VGh1bWJuYWlsKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIHNpemVfdCYgb3V0VGh1bWJTaXplKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGdldE9iamVjdEZpbGVQYXRoKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0cmluZyYgb3V0RmlsZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QmIG91dEZpbGVMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEZvcm1hdCYgb3V0Rm9ybWF0KSA9IDA7Ci0KLSAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGRlbGV0ZUZpbGUoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgPSAwOwotCi0gICAgdmlydHVhbCBNdHBPYmplY3RIYW5kbGVMaXN0KiAgICBnZXRPYmplY3RSZWZlcmVuY2VzKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpID0gMDsKLQotICAgIHZpcnR1YWwgTXRwUmVzcG9uc2VDb2RlICAgICAgICAgc2V0T2JqZWN0UmVmZXJlbmNlcyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiByZWZlcmVuY2VzKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIE10cFByb3BlcnR5KiAgICAgICAgICAgIGdldE9iamVjdFByb3BlcnR5RGVzYyhNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCkgPSAwOwotCi0gICAgdmlydHVhbCBNdHBQcm9wZXJ0eSogICAgICAgICAgICBnZXREZXZpY2VQcm9wZXJ0eURlc2MoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkpID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblN0YXJ0ZWQoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIHNlc3Npb25FbmRlZCgpID0gMDsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBfTVRQX0RBVEFCQVNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEZWJ1Zy5oIGIvbWVkaWEvbXRwL010cERlYnVnLmgKaW5kZXggNWI1M2UzMS4uOGQ0ODI3MyAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cERlYnVnLmgKKysrIGIvbWVkaWEvbXRwL010cERlYnVnLmgKQEAgLTE4LDEwICsxOCwxMCBAQAogI2RlZmluZSBfTVRQX0RFQlVHX0gKIAogLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQogI2luY2x1ZGUgIk10cFR5cGVzLmgiCiAKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgTXRwRGVidWcgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERlc2NyaXB0b3JzLmNwcCBiL21lZGlhL210cC9NdHBEZXNjcmlwdG9ycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEzMzZjOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEZXNjcmlwdG9ycy5jcHAKQEAgLTAsMCArMSwyODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIk10cERlc2NyaXB0b3JzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3Qgc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciBtdHBfaW50ZXJmYWNlX2Rlc2MgPSB7CisgICAgLmJMZW5ndGggPSBVU0JfRFRfSU5URVJGQUNFX1NJWkUsCisgICAgLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9JTlRFUkZBQ0UsCisgICAgLmJJbnRlcmZhY2VOdW1iZXIgPSAwLAorICAgIC5iTnVtRW5kcG9pbnRzID0gMywKKyAgICAuYkludGVyZmFjZUNsYXNzID0gVVNCX0NMQVNTX1NUSUxMX0lNQUdFLAorICAgIC5iSW50ZXJmYWNlU3ViQ2xhc3MgPSAxLAorICAgIC5iSW50ZXJmYWNlUHJvdG9jb2wgPSAxLAorICAgIC5pSW50ZXJmYWNlID0gMSwKK307CisKK2NvbnN0IHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgcHRwX2ludGVyZmFjZV9kZXNjID0geworICAgIC5iTGVuZ3RoID0gVVNCX0RUX0lOVEVSRkFDRV9TSVpFLAorICAgIC5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfSU5URVJGQUNFLAorICAgIC5iSW50ZXJmYWNlTnVtYmVyID0gMCwKKyAgICAuYk51bUVuZHBvaW50cyA9IDMsCisgICAgLmJJbnRlcmZhY2VDbGFzcyA9IFVTQl9DTEFTU19TVElMTF9JTUFHRSwKKyAgICAuYkludGVyZmFjZVN1YkNsYXNzID0gMSwKKyAgICAuYkludGVyZmFjZVByb3RvY29sID0gMSwKK307CisKK2NvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBmc19zaW5rID0geworICAgIC5iTGVuZ3RoID0gVVNCX0RUX0VORFBPSU5UX1NJWkUsCisgICAgLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9FTkRQT0lOVCwKKyAgICAuYkVuZHBvaW50QWRkcmVzcyA9IDEgfCBVU0JfRElSX0lOLAorICAgIC5ibUF0dHJpYnV0ZXMgPSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAorICAgIC53TWF4UGFja2V0U2l6ZSA9IE1BWF9QQUNLRVRfU0laRV9GUywKK307CisKK2NvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBmc19zb3VyY2UgPSB7CisgICAgLmJMZW5ndGggPSBVU0JfRFRfRU5EUE9JTlRfU0laRSwKKyAgICAuYkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0VORFBPSU5ULAorICAgIC5iRW5kcG9pbnRBZGRyZXNzID0gMiB8IFVTQl9ESVJfT1VULAorICAgIC5ibUF0dHJpYnV0ZXMgPSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAorICAgIC53TWF4UGFja2V0U2l6ZSA9IE1BWF9QQUNLRVRfU0laRV9GUywKK307CisKK2NvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBpbnRyID0geworICAgIC5iTGVuZ3RoID0gVVNCX0RUX0VORFBPSU5UX1NJWkUsCisgICAgLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9FTkRQT0lOVCwKKyAgICAuYkVuZHBvaW50QWRkcmVzcyA9IDMgfCBVU0JfRElSX0lOLAorICAgIC5ibUF0dHJpYnV0ZXMgPSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQsCisgICAgLndNYXhQYWNrZXRTaXplID0gTUFYX1BBQ0tFVF9TSVpFX0VWLAorICAgIC5iSW50ZXJ2YWwgPSA2LAorfTsKKworY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yX25vX2F1ZGlvIGhzX3NpbmsgPSB7CisgICAgLmJMZW5ndGggPSBVU0JfRFRfRU5EUE9JTlRfU0laRSwKKyAgICAuYkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0VORFBPSU5ULAorICAgIC5iRW5kcG9pbnRBZGRyZXNzID0gMSB8IFVTQl9ESVJfSU4sCisgICAgLmJtQXR0cmlidXRlcyA9IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCisgICAgLndNYXhQYWNrZXRTaXplID0gTUFYX1BBQ0tFVF9TSVpFX0hTLAorfTsKKworY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yX25vX2F1ZGlvIGhzX3NvdXJjZSA9IHsKKyAgICAuYkxlbmd0aCA9IFVTQl9EVF9FTkRQT0lOVF9TSVpFLAorICAgIC5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfRU5EUE9JTlQsCisgICAgLmJFbmRwb2ludEFkZHJlc3MgPSAyIHwgVVNCX0RJUl9PVVQsCisgICAgLmJtQXR0cmlidXRlcyA9IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCisgICAgLndNYXhQYWNrZXRTaXplID0gTUFYX1BBQ0tFVF9TSVpFX0hTLAorfTsKKworY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yX25vX2F1ZGlvIHNzX3NpbmsgPSB7CisgICAgLmJMZW5ndGggPSBVU0JfRFRfRU5EUE9JTlRfU0laRSwKKyAgICAuYkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0VORFBPSU5ULAorICAgIC5iRW5kcG9pbnRBZGRyZXNzID0gMSB8IFVTQl9ESVJfSU4sCisgICAgLmJtQXR0cmlidXRlcyA9IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCisgICAgLndNYXhQYWNrZXRTaXplID0gTUFYX1BBQ0tFVF9TSVpFX1NTLAorfTsKKworY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yX25vX2F1ZGlvIHNzX3NvdXJjZSA9IHsKKyAgICAuYkxlbmd0aCA9IFVTQl9EVF9FTkRQT0lOVF9TSVpFLAorICAgIC5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfRU5EUE9JTlQsCisgICAgLmJFbmRwb2ludEFkZHJlc3MgPSAyIHwgVVNCX0RJUl9PVVQsCisgICAgLmJtQXR0cmlidXRlcyA9IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCisgICAgLndNYXhQYWNrZXRTaXplID0gTUFYX1BBQ0tFVF9TSVpFX1NTLAorfTsKKworY29uc3Qgc3RydWN0IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0b3Igc3Nfc2lua19jb21wID0geworICAgIC5iTGVuZ3RoID0gc2l6ZW9mKHNzX3NpbmtfY29tcCksCisgICAgLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9TU19FTkRQT0lOVF9DT01QLAorICAgIC5iTWF4QnVyc3QgPSA2LAorfTsKKworY29uc3Qgc3RydWN0IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0b3Igc3Nfc291cmNlX2NvbXAgPSB7CisgICAgLmJMZW5ndGggPSBzaXplb2Yoc3Nfc291cmNlX2NvbXApLAorICAgIC5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfU1NfRU5EUE9JTlRfQ09NUCwKKyAgICAuYk1heEJ1cnN0ID0gNiwKK307CisKK2NvbnN0IHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yIHNzX2ludHJfY29tcCA9IHsKKyAgICAuYkxlbmd0aCA9IHNpemVvZihzc19pbnRyX2NvbXApLAorICAgIC5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfU1NfRU5EUE9JTlRfQ09NUCwKK307CisKK2NvbnN0IHN0cnVjdCBmdW5jX2Rlc2MgbXRwX2ZzX2Rlc2NyaXB0b3JzID0geworICAgIC5pbnRmID0gbXRwX2ludGVyZmFjZV9kZXNjLAorICAgIC5zaW5rID0gZnNfc2luaywKKyAgICAuc291cmNlID0gZnNfc291cmNlLAorICAgIC5pbnRyID0gaW50ciwKK307CisKK2NvbnN0IHN0cnVjdCBmdW5jX2Rlc2MgbXRwX2hzX2Rlc2NyaXB0b3JzID0geworICAgIC5pbnRmID0gbXRwX2ludGVyZmFjZV9kZXNjLAorICAgIC5zaW5rID0gaHNfc2luaywKKyAgICAuc291cmNlID0gaHNfc291cmNlLAorICAgIC5pbnRyID0gaW50ciwKK307CisKK2NvbnN0IHN0cnVjdCBzc19mdW5jX2Rlc2MgbXRwX3NzX2Rlc2NyaXB0b3JzID0geworICAgIC5pbnRmID0gbXRwX2ludGVyZmFjZV9kZXNjLAorICAgIC5zaW5rID0gc3Nfc2luaywKKyAgICAuc2lua19jb21wID0gc3Nfc2lua19jb21wLAorICAgIC5zb3VyY2UgPSBzc19zb3VyY2UsCisgICAgLnNvdXJjZV9jb21wID0gc3Nfc291cmNlX2NvbXAsCisgICAgLmludHIgPSBpbnRyLAorICAgIC5pbnRyX2NvbXAgPSBzc19pbnRyX2NvbXAsCit9OworCitjb25zdCBzdHJ1Y3QgZnVuY19kZXNjIHB0cF9mc19kZXNjcmlwdG9ycyA9IHsKKyAgICAuaW50ZiA9IHB0cF9pbnRlcmZhY2VfZGVzYywKKyAgICAuc2luayA9IGZzX3NpbmssCisgICAgLnNvdXJjZSA9IGZzX3NvdXJjZSwKKyAgICAuaW50ciA9IGludHIsCit9OworCitjb25zdCBzdHJ1Y3QgZnVuY19kZXNjIHB0cF9oc19kZXNjcmlwdG9ycyA9IHsKKyAgICAuaW50ZiA9IHB0cF9pbnRlcmZhY2VfZGVzYywKKyAgICAuc2luayA9IGhzX3NpbmssCisgICAgLnNvdXJjZSA9IGhzX3NvdXJjZSwKKyAgICAuaW50ciA9IGludHIsCit9OworCitjb25zdCBzdHJ1Y3Qgc3NfZnVuY19kZXNjIHB0cF9zc19kZXNjcmlwdG9ycyA9IHsKKyAgICAuaW50ZiA9IHB0cF9pbnRlcmZhY2VfZGVzYywKKyAgICAuc2luayA9IHNzX3NpbmssCisgICAgLnNpbmtfY29tcCA9IHNzX3NpbmtfY29tcCwKKyAgICAuc291cmNlID0gc3Nfc291cmNlLAorICAgIC5zb3VyY2VfY29tcCA9IHNzX3NvdXJjZV9jb21wLAorICAgIC5pbnRyID0gaW50ciwKKyAgICAuaW50cl9jb21wID0gc3NfaW50cl9jb21wLAorfTsKKworY29uc3Qgc3RydWN0IGZ1bmN0aW9uZnNfc3RyaW5ncyBtdHBfc3RyaW5ncyA9IHsKKyAgICAuaGVhZGVyID0geworICAgICAgICAubWFnaWMgPSBodG9sZTMyKEZVTkNUSU9ORlNfU1RSSU5HU19NQUdJQyksCisgICAgICAgIC5sZW5ndGggPSBodG9sZTMyKHNpemVvZihtdHBfc3RyaW5ncykpLAorICAgICAgICAuc3RyX2NvdW50ID0gaHRvbGUzMigxKSwKKyAgICAgICAgLmxhbmdfY291bnQgPSBodG9sZTMyKDEpLAorICAgIH0sCisgICAgLmxhbmcwID0geworICAgICAgICAuY29kZSA9IGh0b2xlMTYoMHgwNDA5KSwKKyAgICAgICAgLnN0cjEgPSBTVFJfSU5URVJGQUNFLAorICAgIH0sCit9OworCitjb25zdCBzdHJ1Y3QgdXNiX29zX2Rlc2NfaGVhZGVyIG10cF9vc19kZXNjX2hlYWRlciA9IHsKKyAgICAuaW50ZXJmYWNlID0gaHRvbGUzMigxKSwKKyAgICAuZHdMZW5ndGggPSBodG9sZTMyKHNpemVvZih1c2Jfb3NfZGVzY19oZWFkZXIpICsgc2l6ZW9mKHVzYl9leHRfY29tcGF0X2Rlc2MpKSwKKyAgICAuYmNkVmVyc2lvbiA9IGh0b2xlMTYoMSksCisgICAgLndJbmRleCA9IGh0b2xlMTYoNCksCisgICAgLmJDb3VudCA9IGh0b2xlMTYoMSksCisgICAgLlJlc2VydmVkID0gaHRvbGUxNigwKSwKK307CisKK2NvbnN0IHN0cnVjdCB1c2JfZXh0X2NvbXBhdF9kZXNjIG10cF9vc19kZXNjX2NvbXBhdCA9IHsKKyAgICAuYkZpcnN0SW50ZXJmYWNlTnVtYmVyID0gMCwKKyAgICAuUmVzZXJ2ZWQxID0gaHRvbGUzMigxKSwKKyAgICAuQ29tcGF0aWJsZUlEID0geyAnTScsICdUJywgJ1AnIH0sCisgICAgLlN1YkNvbXBhdGlibGVJRCA9IHswfSwKKyAgICAuUmVzZXJ2ZWQyID0gezB9LAorfTsKKworY29uc3Qgc3RydWN0IHVzYl9leHRfY29tcGF0X2Rlc2MgcHRwX29zX2Rlc2NfY29tcGF0ID0geworICAgIC5iRmlyc3RJbnRlcmZhY2VOdW1iZXIgPSAwLAorICAgIC5SZXNlcnZlZDEgPSBodG9sZTMyKDEpLAorICAgIC5Db21wYXRpYmxlSUQgPSB7ICdQJywgJ1QnLCAnUCcgfSwKKyAgICAuU3ViQ29tcGF0aWJsZUlEID0gezB9LAorICAgIC5SZXNlcnZlZDIgPSB7MH0sCit9OworCitjb25zdCBzdHJ1Y3QgZGVzY192MiBtdHBfZGVzY192MiA9IHsKKyAgICAuaGVhZGVyID0geworICAgICAgICAubWFnaWMgPSBodG9sZTMyKEZVTkNUSU9ORlNfREVTQ1JJUFRPUlNfTUFHSUNfVjIpLAorICAgICAgICAubGVuZ3RoID0gaHRvbGUzMihzaXplb2Yoc3RydWN0IGRlc2NfdjIpKSwKKyAgICAgICAgLmZsYWdzID0gRlVOQ1RJT05GU19IQVNfRlNfREVTQyB8IEZVTkNUSU9ORlNfSEFTX0hTX0RFU0MgfAorICAgICAgICAgICAgICAgICBGVU5DVElPTkZTX0hBU19TU19ERVNDIHwgRlVOQ1RJT05GU19IQVNfTVNfT1NfREVTQywKKyAgICB9LAorICAgIC5mc19jb3VudCA9IDQsCisgICAgLmhzX2NvdW50ID0gNCwKKyAgICAuc3NfY291bnQgPSA3LAorICAgIC5vc19jb3VudCA9IDEsCisgICAgLmZzX2Rlc2NzID0gbXRwX2ZzX2Rlc2NyaXB0b3JzLAorICAgIC5oc19kZXNjcyA9IG10cF9oc19kZXNjcmlwdG9ycywKKyAgICAuc3NfZGVzY3MgPSBtdHBfc3NfZGVzY3JpcHRvcnMsCisgICAgLm9zX2hlYWRlciA9IG10cF9vc19kZXNjX2hlYWRlciwKKyAgICAub3NfZGVzYyA9IG10cF9vc19kZXNjX2NvbXBhdCwKK307CisKK2NvbnN0IHN0cnVjdCBkZXNjX3YyIHB0cF9kZXNjX3YyID0geworICAgIC5oZWFkZXIgPSB7CisgICAgICAgIC5tYWdpYyA9IGh0b2xlMzIoRlVOQ1RJT05GU19ERVNDUklQVE9SU19NQUdJQ19WMiksCisgICAgICAgIC5sZW5ndGggPSBodG9sZTMyKHNpemVvZihzdHJ1Y3QgZGVzY192MikpLAorICAgICAgICAuZmxhZ3MgPSBGVU5DVElPTkZTX0hBU19GU19ERVNDIHwgRlVOQ1RJT05GU19IQVNfSFNfREVTQyB8CisgICAgICAgICAgICAgICAgIEZVTkNUSU9ORlNfSEFTX1NTX0RFU0MgfCBGVU5DVElPTkZTX0hBU19NU19PU19ERVNDLAorICAgIH0sCisgICAgLmZzX2NvdW50ID0gNCwKKyAgICAuaHNfY291bnQgPSA0LAorICAgIC5zc19jb3VudCA9IDcsCisgICAgLm9zX2NvdW50ID0gMSwKKyAgICAuZnNfZGVzY3MgPSBwdHBfZnNfZGVzY3JpcHRvcnMsCisgICAgLmhzX2Rlc2NzID0gcHRwX2hzX2Rlc2NyaXB0b3JzLAorICAgIC5zc19kZXNjcyA9IHB0cF9zc19kZXNjcmlwdG9ycywKKyAgICAub3NfaGVhZGVyID0gbXRwX29zX2Rlc2NfaGVhZGVyLAorICAgIC5vc19kZXNjID0gcHRwX29zX2Rlc2NfY29tcGF0LAorfTsKKworY29uc3Qgc3RydWN0IGRlc2NfdjEgbXRwX2Rlc2NfdjEgPSB7CisgICAgLmhlYWRlciA9IHsKKyAgICAgICAgLm1hZ2ljID0gaHRvbGUzMihGVU5DVElPTkZTX0RFU0NSSVBUT1JTX01BR0lDKSwKKyAgICAgICAgLmxlbmd0aCA9IGh0b2xlMzIoc2l6ZW9mKHN0cnVjdCBkZXNjX3YxKSksCisgICAgICAgIC5mc19jb3VudCA9IDQsCisgICAgICAgIC5oc19jb3VudCA9IDQsCisgICAgfSwKKyAgICAuZnNfZGVzY3MgPSBtdHBfZnNfZGVzY3JpcHRvcnMsCisgICAgLmhzX2Rlc2NzID0gbXRwX2hzX2Rlc2NyaXB0b3JzLAorfTsKKworY29uc3Qgc3RydWN0IGRlc2NfdjEgcHRwX2Rlc2NfdjEgPSB7CisgICAgLmhlYWRlciA9IHsKKyAgICAgICAgLm1hZ2ljID0gaHRvbGUzMihGVU5DVElPTkZTX0RFU0NSSVBUT1JTX01BR0lDKSwKKyAgICAgICAgLmxlbmd0aCA9IGh0b2xlMzIoc2l6ZW9mKHN0cnVjdCBkZXNjX3YxKSksCisgICAgICAgIC5mc19jb3VudCA9IDQsCisgICAgICAgIC5oc19jb3VudCA9IDQsCisgICAgfSwKKyAgICAuZnNfZGVzY3MgPSBwdHBfZnNfZGVzY3JpcHRvcnMsCisgICAgLmhzX2Rlc2NzID0gcHRwX2hzX2Rlc2NyaXB0b3JzLAorfTsKKworYm9vbCB3cml0ZURlc2NyaXB0b3JzKGludCBmZCwgYm9vbCBwdHApIHsKKyAgICBzc2l6ZV90IHJldCA9IFRFTVBfRkFJTFVSRV9SRVRSWSh3cml0ZShmZCwKKyAgICAgICAgICAgICAgICAmKHB0cCA/IHB0cF9kZXNjX3YyIDogbXRwX2Rlc2NfdjIpLCBzaXplb2YoZGVzY192MikpKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCBmZCA8PCAiU3dpdGNoaW5nIHRvIFYxIGRlc2NyaXB0b3IgZm9ybWF0IjsKKyAgICAgICAgcmV0ID0gVEVNUF9GQUlMVVJFX1JFVFJZKHdyaXRlKGZkLAorICAgICAgICAgICAgICAgICAgICAmKHB0cCA/IHB0cF9kZXNjX3YxIDogbXRwX2Rlc2NfdjEpLCBzaXplb2YoZGVzY192MSkpKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8IGZkIDw8ICJXcml0aW5nIGRlc2NyaXB0b3JzIGZhaWxlZCI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0ID0gVEVNUF9GQUlMVVJFX1JFVFJZKHdyaXRlKGZkLCAmbXRwX3N0cmluZ3MsIHNpemVvZihtdHBfc3RyaW5ncykpKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCBmZCA8PCAiV3JpdGluZyBzdHJpbmdzIGZhaWxlZCI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGVzY3JpcHRvcnMuaCBiL21lZGlhL210cC9NdHBEZXNjcmlwdG9ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MDBhMjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvTXRwRGVzY3JpcHRvcnMuaApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTVRQX0RFU0NSSVBUT1JTX0gKKyNkZWZpbmUgTVRQX0RFU0NSSVBUT1JTX0gKKworI2luY2x1ZGUgPGxpbnV4L3VzYi9jaDkuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvZnVuY3Rpb25mcy5oPgorI2luY2x1ZGUgPHN5cy9lbmRpYW4uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBGRlNfTVRQX0VQMFtdID0gIi9kZXYvdXNiLWZmcy9tdHAvZXAwIjsKK2NvbnN0ZXhwciBjaGFyIEZGU19NVFBfRVBfSU5bXSA9ICIvZGV2L3VzYi1mZnMvbXRwL2VwMSI7Citjb25zdGV4cHIgY2hhciBGRlNfTVRQX0VQX09VVFtdID0gIi9kZXYvdXNiLWZmcy9tdHAvZXAyIjsKK2NvbnN0ZXhwciBjaGFyIEZGU19NVFBfRVBfSU5UUltdID0gIi9kZXYvdXNiLWZmcy9tdHAvZXAzIjsKKworY29uc3RleHByIGNoYXIgRkZTX1BUUF9FUDBbXSA9ICIvZGV2L3VzYi1mZnMvcHRwL2VwMCI7Citjb25zdGV4cHIgY2hhciBGRlNfUFRQX0VQX0lOW10gPSAiL2Rldi91c2ItZmZzL3B0cC9lcDEiOworY29uc3RleHByIGNoYXIgRkZTX1BUUF9FUF9PVVRbXSA9ICIvZGV2L3VzYi1mZnMvcHRwL2VwMiI7Citjb25zdGV4cHIgY2hhciBGRlNfUFRQX0VQX0lOVFJbXSA9ICIvZGV2L3VzYi1mZnMvcHRwL2VwMyI7CisKK2NvbnN0ZXhwciBpbnQgTUFYX1BBQ0tFVF9TSVpFX0ZTID0gNjQ7Citjb25zdGV4cHIgaW50IE1BWF9QQUNLRVRfU0laRV9IUyA9IDUxMjsKK2NvbnN0ZXhwciBpbnQgTUFYX1BBQ0tFVF9TSVpFX1NTID0gMTAyNDsKK2NvbnN0ZXhwciBpbnQgTUFYX1BBQ0tFVF9TSVpFX0VWID0gMjg7CisKK3N0cnVjdCBmdW5jX2Rlc2MgeworICAgIHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgaW50ZjsKKyAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Jfbm9fYXVkaW8gc2luazsKKyAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Jfbm9fYXVkaW8gc291cmNlOworICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBpbnRyOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNzX2Z1bmNfZGVzYyB7CisgICAgc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciBpbnRmOworICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBzaW5rOworICAgIHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yIHNpbmtfY29tcDsKKyAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Jfbm9fYXVkaW8gc291cmNlOworICAgIHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yIHNvdXJjZV9jb21wOworICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBpbnRyOworICAgIHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yIGludHJfY29tcDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBkZXNjX3YxIHsKKyAgICBzdHJ1Y3QgdXNiX2Z1bmN0aW9uZnNfZGVzY3NfaGVhZF92MSB7CisgICAgICAgIF9fbGUzMiBtYWdpYzsKKyAgICAgICAgX19sZTMyIGxlbmd0aDsKKyAgICAgICAgX19sZTMyIGZzX2NvdW50OworICAgICAgICBfX2xlMzIgaHNfY291bnQ7CisgICAgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBoZWFkZXI7CisgICAgc3RydWN0IGZ1bmNfZGVzYyBmc19kZXNjcywgaHNfZGVzY3M7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgZGVzY192MiB7CisgICAgc3RydWN0IHVzYl9mdW5jdGlvbmZzX2Rlc2NzX2hlYWRfdjIgaGVhZGVyOworICAgIC8vIFRoZSByZXN0IG9mIHRoZSBzdHJ1Y3R1cmUgZGVwZW5kcyBvbiB0aGUgZmxhZ3MgaW4gdGhlIGhlYWRlci4KKyAgICBfX2xlMzIgZnNfY291bnQ7CisgICAgX19sZTMyIGhzX2NvdW50OworICAgIF9fbGUzMiBzc19jb3VudDsKKyAgICBfX2xlMzIgb3NfY291bnQ7CisgICAgc3RydWN0IGZ1bmNfZGVzYyBmc19kZXNjcywgaHNfZGVzY3M7CisgICAgc3RydWN0IHNzX2Z1bmNfZGVzYyBzc19kZXNjczsKKyAgICBzdHJ1Y3QgdXNiX29zX2Rlc2NfaGVhZGVyIG9zX2hlYWRlcjsKKyAgICBzdHJ1Y3QgdXNiX2V4dF9jb21wYXRfZGVzYyBvc19kZXNjOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLy8gT1MgZGVzY3JpcHRvciBjb250ZW50cyBzaG91bGQgbm90IGJlIGNoYW5nZWQuIFNlZSBiLzY0NzkwNTM2Lgorc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IGRlc2NfdjIpID09IHNpemVvZih1c2JfZnVuY3Rpb25mc19kZXNjc19oZWFkX3YyKSArCisgICAgICAgIDE2ICsgMiAqIHNpemVvZihzdHJ1Y3QgZnVuY19kZXNjKSArIHNpemVvZihzdHJ1Y3Qgc3NfZnVuY19kZXNjKSArCisgICAgICAgIHNpemVvZih1c2Jfb3NfZGVzY19oZWFkZXIpICsgc2l6ZW9mKHVzYl9leHRfY29tcGF0X2Rlc2MpLAorICAgICAgICAiU2l6ZSBvZiBtdHAgZGVzY3JpcHRvciBpcyBpbmNvcnJlY3QhIik7CisKKyNkZWZpbmUgU1RSX0lOVEVSRkFDRSAiTVRQIgorc3RydWN0IGZ1bmN0aW9uZnNfbGFuZyB7CisgICAgX19sZTE2IGNvZGU7CisgICAgY2hhciBzdHIxW3NpemVvZihTVFJfSU5URVJGQUNFKV07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgZnVuY3Rpb25mc19zdHJpbmdzIHsKKyAgICBzdHJ1Y3QgdXNiX2Z1bmN0aW9uZnNfc3RyaW5nc19oZWFkIGhlYWRlcjsKKyAgICBzdHJ1Y3QgZnVuY3Rpb25mc19sYW5nIGxhbmcwOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBkZXNjX3YyIG10cF9kZXNjX3YyOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBkZXNjX3YyIHB0cF9kZXNjX3YyOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBkZXNjX3YxIG10cF9kZXNjX3YxOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBkZXNjX3YxIHB0cF9kZXNjX3YxOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmdW5jdGlvbmZzX3N0cmluZ3MgbXRwX3N0cmluZ3M7CisKK2Jvb2wgd3JpdGVEZXNjcmlwdG9ycyhpbnQgZmQsIGJvb2wgcHRwKTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIE1UUF9ERVNDUklQVE9SU19ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGV2SGFuZGxlLmNwcCBiL21lZGlhL210cC9NdHBEZXZIYW5kbGUuY3BwCmluZGV4IDlhYTBhZWMuLmU4YmRmODAgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBEZXZIYW5kbGUuY3BwCisrKyBiL21lZGlhL210cC9NdHBEZXZIYW5kbGUuY3BwCkBAIC0xNCw1NyArMTQsMzcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGRpcmVudC5oPgogI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9lbmRpYW4uaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgotI2luY2x1ZGUgIklNdHBIYW5kbGUuaCIKKyNpbmNsdWRlICJNdHBEZXZIYW5kbGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjb25zdGV4cHIgY2hhciBtdHBfZGV2X3BhdGhbXSA9ICIvZGV2L210cF91c2IiOwogCi1jbGFzcyBNdHBEZXZIYW5kbGUgOiBwdWJsaWMgSU10cEhhbmRsZSB7Ci1wcml2YXRlOgotICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBtRmQ7Ci0KLXB1YmxpYzoKLSAgICBNdHBEZXZIYW5kbGUoKTsKLSAgICB+TXRwRGV2SGFuZGxlKCk7Ci0gICAgaW50IHJlYWQodm9pZCAqZGF0YSwgaW50IGxlbik7Ci0gICAgaW50IHdyaXRlKGNvbnN0IHZvaWQgKmRhdGEsIGludCBsZW4pOwotCi0gICAgaW50IHJlY2VpdmVGaWxlKG10cF9maWxlX3JhbmdlIG1mciwgYm9vbCk7Ci0gICAgaW50IHNlbmRGaWxlKG10cF9maWxlX3JhbmdlIG1mcik7Ci0gICAgaW50IHNlbmRFdmVudChtdHBfZXZlbnQgbWUpOwotCi0gICAgaW50IHN0YXJ0KCk7Ci0gICAgdm9pZCBjbG9zZSgpOwotCi0gICAgaW50IGNvbmZpZ3VyZShib29sIHB0cCk7Ci19OwotCiBNdHBEZXZIYW5kbGU6Ok10cERldkhhbmRsZSgpCiAgICAgOiBtRmQoLTEpIHt9OwogCiBNdHBEZXZIYW5kbGU6On5NdHBEZXZIYW5kbGUoKSB7fQogCi1pbnQgTXRwRGV2SGFuZGxlOjpyZWFkKHZvaWQgKmRhdGEsIGludCBsZW4pIHsKK2ludCBNdHBEZXZIYW5kbGU6OnJlYWQodm9pZCAqZGF0YSwgc2l6ZV90IGxlbikgewogICAgIHJldHVybiA6OnJlYWQobUZkLCBkYXRhLCBsZW4pOwogfQogCi1pbnQgTXRwRGV2SGFuZGxlOjp3cml0ZShjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKSB7CitpbnQgTXRwRGV2SGFuZGxlOjp3cml0ZShjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKSB7CiAgICAgcmV0dXJuIDo6d3JpdGUobUZkLCBkYXRhLCBsZW4pOwogfQogCkBAIC04MCw4ICs2MCw4IEBACiAgICAgcmV0dXJuIGlvY3RsKG1GZCwgTVRQX1NFTkRfRVZFTlQsIHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgbG9uZz4oJm1lKSk7CiB9CiAKLWludCBNdHBEZXZIYW5kbGU6OnN0YXJ0KCkgewotICAgIG1GZCA9IGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZChURU1QX0ZBSUxVUkVfUkVUUlkob3BlbihtdHBfZGV2X3BhdGgsIE9fUkRXUikpKTsKK2ludCBNdHBEZXZIYW5kbGU6OnN0YXJ0KGJvb2wgLyogcHRwICovKSB7CisgICAgbUZkLnJlc2V0KFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKG10cF9kZXZfcGF0aCwgT19SRFdSKSkpOwogICAgIGlmIChtRmQgPT0gLTEpIHJldHVybiAtMTsKICAgICByZXR1cm4gMDsKIH0KQEAgLTkwLDExICs3MCw0IEBACiAgICAgbUZkLnJlc2V0KCk7CiB9CiAKLWludCBNdHBEZXZIYW5kbGU6OmNvbmZpZ3VyZShib29sKSB7Ci0gICAgLy8gTm90aGluZyB0byBkbywgZHJpdmVyIGNhbiBjb25maWd1cmUgaXRzZWxmCi0gICAgcmV0dXJuIDA7Ci19Ci0KLUlNdHBIYW5kbGUgKmdldF9tdHBfaGFuZGxlKCkgewotICAgIHJldHVybiBuZXcgTXRwRGV2SGFuZGxlKCk7Ci19Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGV2SGFuZGxlLmggYi9tZWRpYS9tdHAvTXRwRGV2SGFuZGxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQwYWM4NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBEZXZIYW5kbGUuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0RFVl9IQU5ETEVfSAorI2RlZmluZSBfTVRQX0RFVl9IQU5ETEVfSAorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgorI2luY2x1ZGUgIklNdHBIYW5kbGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBEZXZIYW5kbGUgOiBwdWJsaWMgSU10cEhhbmRsZSB7Citwcml2YXRlOgorICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBtRmQ7CisKK3B1YmxpYzoKKyAgICBNdHBEZXZIYW5kbGUoKTsKKyAgICB+TXRwRGV2SGFuZGxlKCk7CisgICAgaW50IHJlYWQodm9pZCAqZGF0YSwgc2l6ZV90IGxlbik7CisgICAgaW50IHdyaXRlKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pOworCisgICAgaW50IHJlY2VpdmVGaWxlKG10cF9maWxlX3JhbmdlIG1mciwgYm9vbCk7CisgICAgaW50IHNlbmRGaWxlKG10cF9maWxlX3JhbmdlIG1mcik7CisgICAgaW50IHNlbmRFdmVudChtdHBfZXZlbnQgbWUpOworCisgICAgaW50IHN0YXJ0KGJvb2wgcHRwKTsKKyAgICB2b2lkIGNsb3NlKCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX0ZGU19IQU5ETEVfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERldmljZS5jcHAgYi9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcAppbmRleCAwYmY3ODU0Li45OTM3OTdhIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcApAQCAtMjYyLDcgKzI2Miw3IEBACiAgICAgICAgICAgICAgICAgTXRwRGV2aWNlUHJvcGVydHkgcHJvcENvZGUgPSAoKm1EZXZpY2VJbmZvLT5tRGV2aWNlUHJvcGVydGllcylbaV07CiAgICAgICAgICAgICAgICAgTXRwUHJvcGVydHkqIHByb3BlcnR5ID0gZ2V0RGV2aWNlUHJvcERlc2MocHJvcENvZGUpOwogICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eSkKLSAgICAgICAgICAgICAgICAgICAgbURldmljZVByb3BlcnRpZXMucHVzaChwcm9wZXJ0eSk7CisgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VQcm9wZXJ0aWVzLnB1c2hfYmFjayhwcm9wZXJ0eSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0zMjcsNyArMzI3LDcgQEAKIH0KIAogYm9vbCBNdHBEZXZpY2U6Om9wZW5TZXNzaW9uKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsZyhtTXV0ZXgpOwogCiAgICAgbVNlc3Npb25JRCA9IDA7CiAgICAgbVRyYW5zYWN0aW9uSUQgPSAwOwpAQCAtMzUzLDcgKzM1Myw3IEBACiB9CiAKIE10cERldmljZUluZm8qIE10cERldmljZTo6Z2V0RGV2aWNlSW5mbygpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbGcobU11dGV4KTsKIAogICAgIG1SZXF1ZXN0LnJlc2V0KCk7CiAgICAgaWYgKCFzZW5kUmVxdWVzdChNVFBfT1BFUkFUSU9OX0dFVF9ERVZJQ0VfSU5GTykpCkBAIC0zNzIsNyArMzcyLDcgQEAKIH0KIAogTXRwU3RvcmFnZUlETGlzdCogTXRwRGV2aWNlOjpnZXRTdG9yYWdlSURzKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsZyhtTXV0ZXgpOwogCiAgICAgbVJlcXVlc3QucmVzZXQoKTsKICAgICBpZiAoIXNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fR0VUX1NUT1JBR0VfSURTKSkKQEAgLTM4Nyw3ICszODcsNyBAQAogfQogCiBNdHBTdG9yYWdlSW5mbyogTXRwRGV2aWNlOjpnZXRTdG9yYWdlSW5mbyhNdHBTdG9yYWdlSUQgc3RvcmFnZUlEKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxnKG1NdXRleCk7CiAKICAgICBtUmVxdWVzdC5yZXNldCgpOwogICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigxLCBzdG9yYWdlSUQpOwpAQCAtNDA4LDcgKzQwOCw3IEBACiAKIE10cE9iamVjdEhhbmRsZUxpc3QqIE10cERldmljZTo6Z2V0T2JqZWN0SGFuZGxlcyhNdHBTdG9yYWdlSUQgc3RvcmFnZUlELAogICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsZyhtTXV0ZXgpOwogCiAgICAgbVJlcXVlc3QucmVzZXQoKTsKICAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgc3RvcmFnZUlEKTsKQEAgLTQyNiw3ICs0MjYsNyBAQAogfQogCiBNdHBPYmplY3RJbmZvKiBNdHBEZXZpY2U6OmdldE9iamVjdEluZm8oTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsZyhtTXV0ZXgpOwogCiAgICAgLy8gRklYTUUgLSB3ZSBtaWdodCB3YW50IHRvIGFkZCBzb21lIGNhY2hpbmcgaGVyZQogCkBAIC00NDgsNyArNDQ4LDcgQEAKIH0KIAogdm9pZCogTXRwRGV2aWNlOjpnZXRUaHVtYm5haWwoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgaW50JiBvdXRMZW5ndGgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbGcobU11dGV4KTsKIAogICAgIG1SZXF1ZXN0LnJlc2V0KCk7CiAgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIGhhbmRsZSk7CkBAIC00NjMsNyArNDYzLDcgQEAKIH0KIAogTXRwT2JqZWN0SGFuZGxlIE10cERldmljZTo6c2VuZE9iamVjdEluZm8oTXRwT2JqZWN0SW5mbyogaW5mbykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsZyhtTXV0ZXgpOwogCiAgICAgbVJlcXVlc3QucmVzZXQoKTsKICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50ID0gaW5mby0+bVBhcmVudDsKQEAgLTUxNyw3ICs1MTcsNyBAQAogfQogCiBib29sIE10cERldmljZTo6c2VuZE9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBpbnQgc2l6ZSwgaW50IHNyY0ZEKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxnKG1NdXRleCk7CiAKICAgICBpZiAobUxhc3RTZW5kT2JqZWN0SW5mb1RyYW5zYWN0aW9uSUQgKyAxICE9IG1UcmFuc2FjdGlvbklEIHx8CiAgICAgICAgICAgICBtTGFzdFNlbmRPYmplY3RJbmZvT2JqZWN0SGFuZGxlICE9IGhhbmRsZSkgewpAQCAtNTM3LDcgKzUzNyw3IEBACiB9CiAKIGJvb2wgTXRwRGV2aWNlOjpkZWxldGVPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsZyhtTXV0ZXgpOwogCiAgICAgbVJlcXVlc3QucmVzZXQoKTsKICAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgaGFuZGxlKTsKQEAgLTU3Miw3ICs1NzIsNyBAQAogfQogCiBNdHBPYmplY3RQcm9wZXJ0eUxpc3QqIE10cERldmljZTo6Z2V0T2JqZWN0UHJvcHNTdXBwb3J0ZWQoTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsZyhtTXV0ZXgpOwogCiAgICAgbVJlcXVlc3QucmVzZXQoKTsKICAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgZm9ybWF0KTsKQEAgLTU4OSw3ICs1ODksNyBAQAogfQogCiBNdHBQcm9wZXJ0eSogTXRwRGV2aWNlOjpnZXREZXZpY2VQcm9wRGVzYyhNdHBEZXZpY2VQcm9wZXJ0eSBjb2RlKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxnKG1NdXRleCk7CiAKICAgICBtUmVxdWVzdC5yZXNldCgpOwogICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigxLCBjb2RlKTsKQEAgLTYwOSw3ICs2MDksNyBAQAogfQogCiBNdHBQcm9wZXJ0eSogTXRwRGV2aWNlOjpnZXRPYmplY3RQcm9wRGVzYyhNdHBPYmplY3RQcm9wZXJ0eSBjb2RlLCBNdHBPYmplY3RGb3JtYXQgZm9ybWF0KSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxnKG1NdXRleCk7CiAKICAgICBtUmVxdWVzdC5yZXNldCgpOwogICAgIG1SZXF1ZXN0LnNldFBhcmFtZXRlcigxLCBjb2RlKTsKQEAgLTYzMyw3ICs2MzMsNyBAQAogICAgIGlmIChwcm9wZXJ0eSA9PSBudWxscHRyKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbGcobU11dGV4KTsKIAogICAgIG1SZXF1ZXN0LnJlc2V0KCk7CiAgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIGhhbmRsZSk7CkBAIC02ODQsNyArNjg0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZE9iamVjdENhbGxiYWNrIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogZXhwZWN0ZWRMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNsaWVudERhdGEpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbGcobU11dGV4KTsKIAogICAgIG1SZXF1ZXN0LnJlc2V0KCk7CiAgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIGhhbmRsZSk7CkBAIC04MDYsNyArODA2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqd3JpdHRlblNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZE9iamVjdENhbGxiYWNrIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNsaWVudERhdGEpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbGcobU11dGV4KTsKIAogICAgIG1SZXF1ZXN0LnJlc2V0KCk7CiAgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIGhhbmRsZSk7CkBAIC04MjgsNyArODI4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICp3cml0dGVuU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRPYmplY3RDYWxsYmFjayBjYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNsaWVudERhdGEpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbGcobU11dGV4KTsKIAogICAgIG1SZXF1ZXN0LnJlc2V0KCk7CiAgICAgbVJlcXVlc3Quc2V0UGFyYW1ldGVyKDEsIGhhbmRsZSk7CkBAIC05MDgsNyArOTA4LDcgQEAKIH0KIAogaW50IE10cERldmljZTo6c3VibWl0RXZlbnRSZXF1ZXN0KCkgewotICAgIGlmIChtRXZlbnRNdXRleC50cnlMb2NrKCkpIHsKKyAgICBpZiAoIW1FdmVudE11dGV4LnRyeV9sb2NrKCkpIHsKICAgICAgICAgLy8gQW4gZXZlbnQgaXMgYmVpbmcgcmVhcGVkIG9uIGFub3RoZXIgdGhyZWFkLgogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtOTE2LDcgKzkxNiw3IEBACiAgICAgICAgIC8vIEFuIGV2ZW50IHJlcXVlc3Qgd2FzIHN1Ym1pdHRlZCwgYnV0IG5vIHJlYXBFdmVudFJlcXVlc3QgY2FsbGVkIHNvIGZhci4KICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUV2ZW50TXV0ZXhGb3JJbnRlcnJ1cHQpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsZyhtRXZlbnRNdXRleEZvckludGVycnVwdCk7CiAgICAgbUV2ZW50UGFja2V0LnNlbmRSZXF1ZXN0KG1SZXF1ZXN0SW50cik7CiAgICAgY29uc3QgaW50IGN1cnJlbnRIYW5kbGUgPSArK21DdXJyZW50RXZlbnRIYW5kbGU7CiAgICAgbVByb2Nlc3NpbmdFdmVudCA9IHRydWU7CkBAIC05MjUsNyArOTI1LDcgQEAKIH0KIAogaW50IE10cERldmljZTo6cmVhcEV2ZW50UmVxdWVzdChpbnQgaGFuZGxlLCB1aW50MzJfdCAoKnBhcmFtZXRlcnMpWzNdKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1FdmVudE11dGV4KTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbGcobUV2ZW50TXV0ZXgpOwogICAgIGlmICghbVByb2Nlc3NpbmdFdmVudCB8fCBtQ3VycmVudEV2ZW50SGFuZGxlICE9IGhhbmRsZSB8fCAhcGFyYW1ldGVycykgewogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtOTQwLDcgKzk0MCw3IEBACiB9CiAKIHZvaWQgTXRwRGV2aWNlOjpkaXNjYXJkRXZlbnRSZXF1ZXN0KGludCBoYW5kbGUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUV2ZW50TXV0ZXhGb3JJbnRlcnJ1cHQpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsZyhtRXZlbnRNdXRleEZvckludGVycnVwdCk7CiAgICAgaWYgKG1DdXJyZW50RXZlbnRIYW5kbGUgIT0gaGFuZGxlKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGV2aWNlLmggYi9tZWRpYS9tdHAvTXRwRGV2aWNlLmgKaW5kZXggYTlhM2UwZS4uOGNmOWU1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cERldmljZS5oCisrKyBiL21lZGlhL210cC9NdHBEZXZpY2UuaApAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgIk10cFJlc3BvbnNlUGFja2V0LmgiCiAjaW5jbHVkZSAiTXRwVHlwZXMuaCIKIAotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDxtdXRleD4KIAogc3RydWN0IHVzYl9kZXZpY2U7CiBzdHJ1Y3QgdXNiX3JlcXVlc3Q7CkBAIC02Nyw5ICs2Nyw5IEBACiAgICAgTXRwT2JqZWN0SGFuZGxlICAgICAgICAgbUxhc3RTZW5kT2JqZWN0SW5mb09iamVjdEhhbmRsZTsKIAogICAgIC8vIHRvIGVuc3VyZSBvbmx5IG9uZSBNVFAgdHJhbnNhY3Rpb24gYXQgYSB0aW1lCi0gICAgTXV0ZXggICAgICAgICAgICAgICAgICAgbU11dGV4OwotICAgIE11dGV4ICAgICAgICAgICAgICAgICAgIG1FdmVudE11dGV4OwotICAgIE11dGV4ICAgICAgICAgICAgICAgICAgIG1FdmVudE11dGV4Rm9ySW50ZXJydXB0OworICAgIHN0ZDo6bXV0ZXggICAgICAgICAgICAgIG1NdXRleDsKKyAgICBzdGQ6Om11dGV4ICAgICAgICAgICAgICBtRXZlbnRNdXRleDsKKyAgICBzdGQ6Om11dGV4ICAgICAgICAgICAgICBtRXZlbnRNdXRleEZvckludGVycnVwdDsKIAogICAgIC8vIFJlbWVtYmVyIHRoZSBkZXZpY2UncyBwYWNrZXQgZGl2aXNpb24gbW9kZS4KICAgICBVcmJQYWNrZXREaXZpc2lvbk1vZGUgICBtUGFja2V0RGl2aXNpb25Nb2RlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cEV2ZW50UGFja2V0LmggYi9tZWRpYS9tdHAvTXRwRXZlbnRQYWNrZXQuaAppbmRleCAzZjNiNmEzLi45NGQ2ZWJmIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwRXZlbnRQYWNrZXQuaAorKysgYi9tZWRpYS9tdHAvTXRwRXZlbnRQYWNrZXQuaApAQCAtMjAsNiArMjAsOCBAQAogI2luY2x1ZGUgIk10cFBhY2tldC5oIgogI2luY2x1ZGUgIm10cC5oIgogCisjaW5jbHVkZSA8ZXJybm8uaD4KKwogY2xhc3MgSU10cEhhbmRsZTsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cEZmc0NvbXBhdEhhbmRsZS5jcHAgYi9tZWRpYS9tdHAvTXRwRmZzQ29tcGF0SGFuZGxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmIzNDJjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL010cEZmc0NvbXBhdEhhbmRsZS5jcHAKQEAgLTAsMCArMSwzNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2Z1bmN0aW9uZnMuaD4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9lbmRpYW4uaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJQb3NpeEFzeW5jSU8uaCIKKyNpbmNsdWRlICJNdHBGZnNDb21wYXRIYW5kbGUuaCIKKyNpbmNsdWRlICJtdHAuaCIKKworI2RlZmluZSBGVU5DVElPTkZTX0VORFBPSU5UX0FMTE9DICAgICAgIF9JT1IoJ2cnLCAyMzEsIF9fdTMyKQorCituYW1lc3BhY2UgeworCisvLyBNdXN0IGJlIGRpdmlzaWJsZSBieSBhbGwgbWF4IHBhY2tldCBzaXplIHZhbHVlcworY29uc3RleHByIGludCBNQVhfRklMRV9DSFVOS19TSVpFID0gMzE0NTcyODsKKworLy8gU2FmZSB2YWx1ZXMgc2luY2Ugc29tZSBkZXZpY2VzIGNhbm5vdCBoYW5kbGUgbGFyZ2UgRE1BcworLy8gVG8gZ2V0IGdvb2QgcGVyZm9ybWFuY2UsIG92ZXJyaWRlIHRoZXNlIHdpdGgKKy8vIGhpZ2hlciB2YWx1ZXMgcGVyIGRldmljZSB1c2luZyB0aGUgcHJvcGVydGllcworLy8gc3lzLnVzYi5mZnMubWF4X3JlYWQgYW5kIHN5cy51c2IuZmZzLm1heF93cml0ZQorY29uc3RleHByIGludCBVU0JfRkZTX01BWF9XUklURSA9IE1UUF9CVUZGRVJfU0laRTsKK2NvbnN0ZXhwciBpbnQgVVNCX0ZGU19NQVhfUkVBRCA9IE1UUF9CVUZGRVJfU0laRTsKKworc3RhdGljX2Fzc2VydChVU0JfRkZTX01BWF9XUklURSA+IDAsICJNYXggci93IHZhbHVlcyBtdXN0IGJlID4gMCEiKTsKK3N0YXRpY19hc3NlcnQoVVNCX0ZGU19NQVhfUkVBRCA+IDAsICJNYXggci93IHZhbHVlcyBtdXN0IGJlID4gMCEiKTsKKworY29uc3RleHByIHVuc2lnbmVkIGludCBNQVhfTVRQX0ZJTEVfU0laRSA9IDB4RkZGRkZGRkY7CisKK2NvbnN0ZXhwciBzaXplX3QgRU5EUE9JTlRfQUxMT0NfUkVUUklFUyA9IDEwOworCit9IC8vIGFub255bW91cyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNdHBGZnNDb21wYXRIYW5kbGU6Ok10cEZmc0NvbXBhdEhhbmRsZShpbnQgY29udHJvbEZkKSA6CisgICAgTXRwRmZzSGFuZGxlKGNvbnRyb2xGZCksCisgICAgbU1heFdyaXRlKFVTQl9GRlNfTUFYX1dSSVRFKSwKKyAgICBtTWF4UmVhZChVU0JfRkZTX01BWF9SRUFEKSB7fQorCitNdHBGZnNDb21wYXRIYW5kbGU6On5NdHBGZnNDb21wYXRIYW5kbGUoKSB7fQorCitpbnQgTXRwRmZzQ29tcGF0SGFuZGxlOjp3cml0ZUhhbmRsZShpbnQgZmQsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBsZW4pIHsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBjb25zdCBjaGFyKiBidWYgPSBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oZGF0YSk7CisgICAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICAgICAgaW50IHdyaXRlX2xlbiA9IHN0ZDo6bWluKG1NYXhXcml0ZSwgbGVuKTsKKyAgICAgICAgaW50IG4gPSBURU1QX0ZBSUxVUkVfUkVUUlkoOjp3cml0ZShmZCwgYnVmLCB3cml0ZV9sZW4pKTsKKworICAgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJ3cml0ZSBFUlJPUjogZmQgPSAiIDw8IGZkIDw8ICIsIG4gPSAiIDw8IG47CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZSBpZiAobiA8IHdyaXRlX2xlbikgeworICAgICAgICAgICAgZXJybm8gPSBFSU87CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAibGVzcyB3cml0dGVuIHRoYW4gZXhwZWN0ZWQiOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGJ1ZiArPSBuOworICAgICAgICBsZW4gLT0gbjsKKyAgICAgICAgcmV0ICs9IG47CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBNdHBGZnNDb21wYXRIYW5kbGU6OnJlYWRIYW5kbGUoaW50IGZkLCB2b2lkKiBkYXRhLCBzaXplX3QgbGVuKSB7CisgICAgaW50IHJldCA9IDA7CisgICAgY2hhciogYnVmID0gc3RhdGljX2Nhc3Q8Y2hhcio+KGRhdGEpOworICAgIHdoaWxlIChsZW4gPiAwKSB7CisgICAgICAgIGludCByZWFkX2xlbiA9IHN0ZDo6bWluKG1NYXhSZWFkLCBsZW4pOworICAgICAgICBpbnQgbiA9IFRFTVBfRkFJTFVSRV9SRVRSWSg6OnJlYWQoZmQsIGJ1ZiwgcmVhZF9sZW4pKTsKKyAgICAgICAgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAicmVhZCBFUlJPUjogZmQgPSAiIDw8IGZkIDw8ICIsIG4gPSAiIDw8IG47CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmV0ICs9IG47CisgICAgICAgIGlmIChuIDwgcmVhZF9sZW4pIC8vIGRvbmUgcmVhZGluZyBlYXJseQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGJ1ZiArPSBuOworICAgICAgICBsZW4gLT0gbjsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IE10cEZmc0NvbXBhdEhhbmRsZTo6c3RhcnQoYm9vbCBwdHApIHsKKyAgICBpZiAoIW9wZW5FbmRwb2ludHMocHRwKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE5VTV9JT19CVUZTOyBpKyspIHsKKyAgICAgICAgbUlvYnVmW2ldLmJ1ZnMucmVzaXplKE1BWF9GSUxFX0NIVU5LX1NJWkUpOworICAgICAgICBwb3NpeF9tYWR2aXNlKG1Jb2J1ZltpXS5idWZzLmRhdGEoKSwgTUFYX0ZJTEVfQ0hVTktfU0laRSwKKyAgICAgICAgICAgICAgICBQT1NJWF9NQURWX1NFUVVFTlRJQUwgfCBQT1NJWF9NQURWX1dJTExORUVEKTsKKyAgICB9CisKKyAgICAvLyBHZXQgZGV2aWNlIHNwZWNpZmljIHIvdyBzaXplCisgICAgbU1heFdyaXRlID0gYW5kcm9pZDo6YmFzZTo6R2V0SW50UHJvcGVydHkoInN5cy51c2IuZmZzLm1heF93cml0ZSIsIFVTQl9GRlNfTUFYX1dSSVRFKTsKKyAgICBtTWF4UmVhZCA9IGFuZHJvaWQ6OmJhc2U6OkdldEludFByb3BlcnR5KCJzeXMudXNiLmZmcy5tYXhfcmVhZCIsIFVTQl9GRlNfTUFYX1JFQUQpOworCisgICAgc2l6ZV90IGF0dGVtcHRzID0gMDsKKyAgICB3aGlsZSAobU1heFdyaXRlID49IFVTQl9GRlNfTUFYX1dSSVRFICYmIG1NYXhSZWFkID49IFVTQl9GRlNfTUFYX1JFQUQgJiYKKyAgICAgICAgICAgIGF0dGVtcHRzIDwgRU5EUE9JTlRfQUxMT0NfUkVUUklFUykgeworICAgICAgICAvLyBJZiBsYXJnZXIgY29udGlndW91cyBjaHVua3Mgb2YgbWVtb3J5IGFyZW4ndCBhdmFpbGFibGUsIGF0dGVtcHQgdG8gdHJ5CisgICAgICAgIC8vIHNtYWxsZXIgYWxsb2NhdGlvbnMuCisgICAgICAgIGlmIChpb2N0bChtQnVsa0luLCBGVU5DVElPTkZTX0VORFBPSU5UX0FMTE9DLCBzdGF0aWNfY2FzdDxfX3UzMj4obU1heFdyaXRlKSkgfHwKKyAgICAgICAgICAgIGlvY3RsKG1CdWxrT3V0LCBGVU5DVElPTkZTX0VORFBPSU5UX0FMTE9DLCBzdGF0aWNfY2FzdDxfX3UzMj4obU1heFJlYWQpKSkgeworICAgICAgICAgICAgaWYgKGVycm5vID09IEVOT0RFVikgeworICAgICAgICAgICAgICAgIC8vIERyaXZlciBoYXNuJ3QgZW5hYmxlZCBlbmRwb2ludHMgeWV0LgorICAgICAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMCkpOworICAgICAgICAgICAgICAgIGF0dGVtcHRzICs9IDE7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTWF4V3JpdGUgLz0gMjsKKyAgICAgICAgICAgIG1NYXhSZWFkIC89MjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIC8vIFRyeSB0byBzdGFydCBNdHBTZXJ2ZXIgYW55d2F5LCB3aXRoIHRoZSBzbWFsbGVzdCBtYXggci93IHZhbHVlcworICAgIG1NYXhXcml0ZSA9IFVTQl9GRlNfTUFYX1dSSVRFOworICAgIG1NYXhSZWFkID0gVVNCX0ZGU19NQVhfUkVBRDsKKyAgICBQTE9HKEVSUk9SKSA8PCAiRnVuY3Rpb25mcyBjb3VsZCBub3QgYWxsb2NhdGUgYW55IG1lbW9yeSEiOworICAgIHJldHVybiAwOworfQorCitpbnQgTXRwRmZzQ29tcGF0SGFuZGxlOjpyZWFkKHZvaWQqIGRhdGEsIHNpemVfdCBsZW4pIHsKKyAgICByZXR1cm4gcmVhZEhhbmRsZShtQnVsa091dCwgZGF0YSwgbGVuKTsKK30KKworaW50IE10cEZmc0NvbXBhdEhhbmRsZTo6d3JpdGUoY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IGxlbikgeworICAgIHJldHVybiB3cml0ZUhhbmRsZShtQnVsa0luLCBkYXRhLCBsZW4pOworfQorCitpbnQgTXRwRmZzQ29tcGF0SGFuZGxlOjpyZWNlaXZlRmlsZShtdHBfZmlsZV9yYW5nZSBtZnIsIGJvb2wgemVyb19wYWNrZXQpIHsKKyAgICAvLyBXaGVuIHJlY2VpdmluZyBmaWxlcywgdGhlIGluY29taW5nIGxlbmd0aCBpcyBnaXZlbiBpbiAzMiBiaXRzLgorICAgIC8vIEEgPjRHIGZpbGUgaXMgZ2l2ZW4gYXMgMHhGRkZGRkZGRgorICAgIHVpbnQzMl90IGZpbGVfbGVuZ3RoID0gbWZyLmxlbmd0aDsKKyAgICB1aW50NjRfdCBvZmZzZXQgPSBtZnIub2Zmc2V0OworICAgIGludCBwYWNrZXRfc2l6ZSA9IGdldFBhY2tldFNpemUobUJ1bGtPdXQpOworCisgICAgdW5zaWduZWQgY2hhciAqZGF0YSA9IG1Jb2J1ZlswXS5idWZzLmRhdGEoKTsKKyAgICB1bnNpZ25lZCBjaGFyICpkYXRhMiA9IG1Jb2J1ZlsxXS5idWZzLmRhdGEoKTsKKworICAgIHN0cnVjdCBhaW9jYiBhaW87CisgICAgYWlvLmFpb19maWxkZXMgPSBtZnIuZmQ7CisgICAgYWlvLmFpb19idWYgPSBudWxscHRyOworICAgIHN0cnVjdCBhaW9jYiAqYWlvbFtdID0geyZhaW99OworICAgIGludCByZXQgPSAtMTsKKyAgICBzaXplX3QgbGVuZ3RoOworICAgIGJvb2wgcmVhZCA9IGZhbHNlOworICAgIGJvb2wgd3JpdGUgPSBmYWxzZTsKKworICAgIHBvc2l4X2ZhZHZpc2UobWZyLmZkLCAwLCAwLCBQT1NJWF9GQURWX1NFUVVFTlRJQUwgfCBQT1NJWF9GQURWX05PUkVVU0UpOworCisgICAgLy8gQnJlYWsgZG93biB0aGUgZmlsZSBpbnRvIHBpZWNlcyB0aGF0IGZpdCBpbiBidWZmZXJzCisgICAgd2hpbGUgKGZpbGVfbGVuZ3RoID4gMCB8fCB3cml0ZSkgeworICAgICAgICBpZiAoZmlsZV9sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBsZW5ndGggPSBzdGQ6Om1pbihzdGF0aWNfY2FzdDx1aW50MzJfdD4oTUFYX0ZJTEVfQ0hVTktfU0laRSksIGZpbGVfbGVuZ3RoKTsKKworICAgICAgICAgICAgLy8gUmVhZCBkYXRhIGZyb20gVVNCLCBoYW5kbGUgZXJyb3JzIGFmdGVyIHdhaXRpbmcgZm9yIHdyaXRlIHRocmVhZC4KKyAgICAgICAgICAgIHJldCA9IHJlYWRIYW5kbGUobUJ1bGtPdXQsIGRhdGEsIGxlbmd0aCk7CisKKyAgICAgICAgICAgIGlmIChmaWxlX2xlbmd0aCAhPSBNQVhfTVRQX0ZJTEVfU0laRSAmJiByZXQgPCBzdGF0aWNfY2FzdDxpbnQ+KGxlbmd0aCkpIHsKKyAgICAgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgICAgICBlcnJubyA9IEVJTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlYWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHdyaXRlKSB7CisgICAgICAgICAgICAvLyBnZXQgdGhlIHJldHVybiBzdGF0dXMgb2YgdGhlIGxhc3Qgd3JpdGUgcmVxdWVzdAorICAgICAgICAgICAgYWlvX3N1c3BlbmQoYWlvbCwgMSwgbnVsbHB0cik7CisKKyAgICAgICAgICAgIGludCB3cml0dGVuID0gYWlvX3JldHVybigmYWlvKTsKKyAgICAgICAgICAgIGlmICh3cml0dGVuID09IC0xKSB7CisgICAgICAgICAgICAgICAgZXJybm8gPSBhaW9fZXJyb3IoJmFpbyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PHNpemVfdD4od3JpdHRlbikgPCBhaW8uYWlvX25ieXRlcykgeworICAgICAgICAgICAgICAgIGVycm5vID0gRUlPOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyBhYm92ZQorICAgICAgICBpZiAocmV0ID09IC0xKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVhZCkgeworICAgICAgICAgICAgaWYgKGZpbGVfbGVuZ3RoID09IE1BWF9NVFBfRklMRV9TSVpFKSB7CisgICAgICAgICAgICAgICAgLy8gRm9yIGxhcmdlciBmaWxlcywgcmVjZWl2ZSB1bnRpbCBhIHNob3J0IHBhY2tldCBpcyByZWNlaXZlZC4KKyAgICAgICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXQpIDwgbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbGVfbGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpbGVfbGVuZ3RoIC09IHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEVucXVldWUgYSBuZXcgd3JpdGUgcmVxdWVzdAorICAgICAgICAgICAgYWlvX3ByZXBhcmUoJmFpbywgZGF0YSwgbGVuZ3RoLCBvZmZzZXQpOworICAgICAgICAgICAgYWlvX3dyaXRlKCZhaW8pOworCisgICAgICAgICAgICBvZmZzZXQgKz0gcmV0OworICAgICAgICAgICAgc3RkOjpzd2FwKGRhdGEsIGRhdGEyKTsKKworICAgICAgICAgICAgd3JpdGUgPSB0cnVlOworICAgICAgICAgICAgcmVhZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIC8vIFJlY2VpdmUgYW4gZW1wdHkgcGFja2V0IGlmIHNpemUgaXMgYSBtdWx0aXBsZSBvZiB0aGUgZW5kcG9pbnQgc2l6ZS4KKyAgICBpZiAocmV0ICUgcGFja2V0X3NpemUgPT0gMCB8fCB6ZXJvX3BhY2tldCkgeworICAgICAgICBpZiAoVEVNUF9GQUlMVVJFX1JFVFJZKDo6cmVhZChtQnVsa091dCwgZGF0YSwgcGFja2V0X3NpemUpKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBNdHBGZnNDb21wYXRIYW5kbGU6OnNlbmRGaWxlKG10cF9maWxlX3JhbmdlIG1mcikgeworICAgIHVpbnQ2NF90IGZpbGVfbGVuZ3RoID0gbWZyLmxlbmd0aDsKKyAgICB1aW50MzJfdCBnaXZlbl9sZW5ndGggPSBzdGQ6Om1pbihzdGF0aWNfY2FzdDx1aW50NjRfdD4oTUFYX01UUF9GSUxFX1NJWkUpLAorICAgICAgICAgICAgZmlsZV9sZW5ndGggKyBzaXplb2YobXRwX2RhdGFfaGVhZGVyKSk7CisgICAgdWludDY0X3Qgb2Zmc2V0ID0gbWZyLm9mZnNldDsKKyAgICBpbnQgcGFja2V0X3NpemUgPSBnZXRQYWNrZXRTaXplKG1CdWxrSW4pOworCisgICAgLy8gSWYgZmlsZV9sZW5ndGggaXMgbGFyZ2VyIHRoYW4gYSBzaXplX3QsIHRydW5jYXRpbmcgd291bGQgcHJvZHVjZSB0aGUgd3JvbmcgY29tcGFyaXNvbi4KKyAgICAvLyBJbnN0ZWFkLCBwcm9tb3RlIHRoZSBsZWZ0IHNpZGUgdG8gNjQgYml0cywgdGhlbiB0cnVuY2F0ZSB0aGUgc21hbGwgcmVzdWx0LgorICAgIGludCBpbml0X3JlYWRfbGVuID0gc3RkOjptaW4oCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocGFja2V0X3NpemUgLSBzaXplb2YobXRwX2RhdGFfaGVhZGVyKSksIGZpbGVfbGVuZ3RoKTsKKworICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEgPSBtSW9idWZbMF0uYnVmcy5kYXRhKCk7CisgICAgdW5zaWduZWQgY2hhciAqZGF0YTIgPSBtSW9idWZbMV0uYnVmcy5kYXRhKCk7CisKKyAgICBwb3NpeF9mYWR2aXNlKG1mci5mZCwgMCwgMCwgUE9TSVhfRkFEVl9TRVFVRU5USUFMIHwgUE9TSVhfRkFEVl9OT1JFVVNFKTsKKworICAgIHN0cnVjdCBhaW9jYiBhaW87CisgICAgYWlvLmFpb19maWxkZXMgPSBtZnIuZmQ7CisgICAgc3RydWN0IGFpb2NiICphaW9sW10gPSB7JmFpb307CisgICAgaW50IHJldCwgbGVuZ3RoOworICAgIGludCBlcnJvciA9IDA7CisgICAgYm9vbCByZWFkID0gZmFsc2U7CisgICAgYm9vbCB3cml0ZSA9IGZhbHNlOworCisgICAgLy8gU2VuZCB0aGUgaGVhZGVyIGRhdGEKKyAgICBtdHBfZGF0YV9oZWFkZXIgKmhlYWRlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8bXRwX2RhdGFfaGVhZGVyKj4oZGF0YSk7CisgICAgaGVhZGVyLT5sZW5ndGggPSBodG9sZTMyKGdpdmVuX2xlbmd0aCk7CisgICAgaGVhZGVyLT50eXBlID0gaHRvbGUxNigyKTsgLyogZGF0YSBwYWNrZXQgKi8KKyAgICBoZWFkZXItPmNvbW1hbmQgPSBodG9sZTE2KG1mci5jb21tYW5kKTsKKyAgICBoZWFkZXItPnRyYW5zYWN0aW9uX2lkID0gaHRvbGUzMihtZnIudHJhbnNhY3Rpb25faWQpOworCisgICAgLy8gU29tZSBob3N0cyBkb24ndCBzdXBwb3J0IGhlYWRlci9kYXRhIHNlcGFyYXRpb24gZXZlbiB0aG91Z2ggTVRQIGFsbG93cyBpdAorICAgIC8vIEhhbmRsZSBieSBmaWxsaW5nIGZpcnN0IHBhY2tldCB3aXRoIGluaXRpYWwgZmlsZSBkYXRhCisgICAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWShwcmVhZChtZnIuZmQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGRhdGEpICsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG10cF9kYXRhX2hlYWRlciksIGluaXRfcmVhZF9sZW4sIG9mZnNldCkpCisgICAgICAgICAgICAhPSBpbml0X3JlYWRfbGVuKSByZXR1cm4gLTE7CisgICAgaWYgKHdyaXRlSGFuZGxlKG1CdWxrSW4sIGRhdGEsIHNpemVvZihtdHBfZGF0YV9oZWFkZXIpICsgaW5pdF9yZWFkX2xlbikgPT0gLTEpIHJldHVybiAtMTsKKyAgICBmaWxlX2xlbmd0aCAtPSBpbml0X3JlYWRfbGVuOworICAgIG9mZnNldCArPSBpbml0X3JlYWRfbGVuOworICAgIHJldCA9IGluaXRfcmVhZF9sZW4gKyBzaXplb2YobXRwX2RhdGFfaGVhZGVyKTsKKworICAgIC8vIEJyZWFrIGRvd24gdGhlIGZpbGUgaW50byBwaWVjZXMgdGhhdCBmaXQgaW4gYnVmZmVycworICAgIHdoaWxlIChmaWxlX2xlbmd0aCA+IDApIHsKKyAgICAgICAgaWYgKHJlYWQpIHsKKyAgICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBwcmV2aW91cyByZWFkIHRvIGZpbmlzaAorICAgICAgICAgICAgYWlvX3N1c3BlbmQoYWlvbCwgMSwgbnVsbHB0cik7CisgICAgICAgICAgICByZXQgPSBhaW9fcmV0dXJuKCZhaW8pOworICAgICAgICAgICAgaWYgKHJldCA9PSAtMSkgeworICAgICAgICAgICAgICAgIGVycm5vID0gYWlvX2Vycm9yKCZhaW8pOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KHJldCkgPCBhaW8uYWlvX25ieXRlcykgeworICAgICAgICAgICAgICAgIGVycm5vID0gRUlPOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmlsZV9sZW5ndGggLT0gcmV0OworICAgICAgICAgICAgb2Zmc2V0ICs9IHJldDsKKyAgICAgICAgICAgIHN0ZDo6c3dhcChkYXRhLCBkYXRhMik7CisgICAgICAgICAgICByZWFkID0gZmFsc2U7CisgICAgICAgICAgICB3cml0ZSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyb3IgPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmaWxlX2xlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGxlbmd0aCA9IHN0ZDo6bWluKHN0YXRpY19jYXN0PHVpbnQ2NF90PihNQVhfRklMRV9DSFVOS19TSVpFKSwgZmlsZV9sZW5ndGgpOworICAgICAgICAgICAgLy8gUXVldWUgdXAgYW5vdGhlciByZWFkCisgICAgICAgICAgICBhaW9fcHJlcGFyZSgmYWlvLCBkYXRhLCBsZW5ndGgsIG9mZnNldCk7CisgICAgICAgICAgICBhaW9fcmVhZCgmYWlvKTsKKyAgICAgICAgICAgIHJlYWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHdyaXRlKSB7CisgICAgICAgICAgICBpZiAod3JpdGVIYW5kbGUobUJ1bGtJbiwgZGF0YTIsIHJldCkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBlcnJvciA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGUgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyZXQgJSBwYWNrZXRfc2l6ZSA9PSAwKSB7CisgICAgICAgIC8vIElmIHRoZSBsYXN0IHBhY2tldCB3YXNuJ3Qgc2hvcnQsIHNlbmQgYSBmaW5hbCBlbXB0eSBwYWNrZXQKKyAgICAgICAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWSg6OndyaXRlKG1CdWxrSW4sIGRhdGEsIDApKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRmZzQ29tcGF0SGFuZGxlLmggYi9tZWRpYS9tdHAvTXRwRmZzQ29tcGF0SGFuZGxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk4MmQ2MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9NdHBGZnNDb21wYXRIYW5kbGUuaApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX0ZGU19DT01QQVRfSEFORExFX0gKKyNkZWZpbmUgX01UUF9GRlNfQ09NUEFUX0hBTkRMRV9ICisKKyNpbmNsdWRlIDxNdHBGZnNIYW5kbGUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgTXRwRmZzSGFuZGxlVGVzdDsKKworY2xhc3MgTXRwRmZzQ29tcGF0SGFuZGxlIDogcHVibGljIE10cEZmc0hhbmRsZSB7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGZyaWVuZCBjbGFzcyBhbmRyb2lkOjpNdHBGZnNIYW5kbGVUZXN0OworcHJpdmF0ZToKKyAgICBpbnQgd3JpdGVIYW5kbGUoaW50IGZkLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKTsKKyAgICBpbnQgcmVhZEhhbmRsZShpbnQgZmQsIHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pOworCisgICAgc2l6ZV90IG1NYXhXcml0ZTsKKyAgICBzaXplX3QgbU1heFJlYWQ7CisKK3B1YmxpYzoKKyAgICBpbnQgcmVhZCh2b2lkKiBkYXRhLCBzaXplX3QgbGVuKSBvdmVycmlkZTsKKyAgICBpbnQgd3JpdGUoY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IGxlbikgb3ZlcnJpZGU7CisgICAgaW50IHJlY2VpdmVGaWxlKG10cF9maWxlX3JhbmdlIG1mciwgYm9vbCB6ZXJvX3BhY2tldCkgb3ZlcnJpZGU7CisgICAgaW50IHNlbmRGaWxlKG10cF9maWxlX3JhbmdlIG1mcikgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBPcGVuIGZmcyBlbmRwb2ludHMgYW5kIGFsbG9jYXRlIG5lY2Vzc2FyeSBrZXJuZWwgYW5kIHVzZXIgbWVtb3J5LgorICAgICAqIFdpbGwgc2xlZXAgdW50aWwgZW5kcG9pbnRzIGFyZSBlbmFibGVkLCBmb3IgdXAgdG8gMSBzZWNvbmQuCisgICAgICovCisgICAgaW50IHN0YXJ0KGJvb2wgcHRwKSBvdmVycmlkZTsKKworICAgIE10cEZmc0NvbXBhdEhhbmRsZShpbnQgY29udHJvbEZkKTsKKyAgICB+TXRwRmZzQ29tcGF0SGFuZGxlKCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTVRQX0ZGU19DT01QQVRfSEFORExFX0gKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5jcHAgYi9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmNwcAppbmRleCA5MTM5OTI1Li45NTJiOTA3IDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmNwcApAQCAtMTYsMzA2ICsxNiwzOSBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGFzeW5jaW8vQXN5bmNJTy5oPgogI2luY2x1ZGUgPGRpcmVudC5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiL2Z1bmN0aW9uZnMuaD4KLSNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvZW5kaWFuLmg+CisjaW5jbHVkZSA8c3lzL2V2ZW50ZmQuaD4KICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KICNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDx2ZWN0b3I+CiAKLSNpbmNsdWRlICJBc3luY0lPLmgiCisjaW5jbHVkZSAiUG9zaXhBc3luY0lPLmgiCisjaW5jbHVkZSAiTXRwRGVzY3JpcHRvcnMuaCIKICNpbmNsdWRlICJNdHBGZnNIYW5kbGUuaCIKICNpbmNsdWRlICJtdHAuaCIKIAotI2RlZmluZSBjcHVfdG9fbGUxNih4KSAgaHRvbGUxNih4KQotI2RlZmluZSBjcHVfdG9fbGUzMih4KSAgaHRvbGUzMih4KQotCi0jZGVmaW5lIEZVTkNUSU9ORlNfRU5EUE9JTlRfQUxMT0MgICAgICAgX0lPUignZycsIDIzMSwgX191MzIpCi0KIG5hbWVzcGFjZSB7CiAKLWNvbnN0ZXhwciBjaGFyIEZGU19NVFBfRVBfSU5bXSA9ICIvZGV2L3VzYi1mZnMvbXRwL2VwMSI7Ci1jb25zdGV4cHIgY2hhciBGRlNfTVRQX0VQX09VVFtdID0gIi9kZXYvdXNiLWZmcy9tdHAvZXAyIjsKLWNvbnN0ZXhwciBjaGFyIEZGU19NVFBfRVBfSU5UUltdID0gIi9kZXYvdXNiLWZmcy9tdHAvZXAzIjsKLQotY29uc3RleHByIGludCBNQVhfUEFDS0VUX1NJWkVfRlMgPSA2NDsKLWNvbnN0ZXhwciBpbnQgTUFYX1BBQ0tFVF9TSVpFX0hTID0gNTEyOwotY29uc3RleHByIGludCBNQVhfUEFDS0VUX1NJWkVfU1MgPSAxMDI0OwotCi0vLyBNdXN0IGJlIGRpdmlzaWJsZSBieSBhbGwgbWF4IHBhY2tldCBzaXplIHZhbHVlcwotY29uc3RleHByIGludCBNQVhfRklMRV9DSFVOS19TSVpFID0gMzE0NTcyODsKLQotLy8gU2FmZSB2YWx1ZXMgc2luY2Ugc29tZSBkZXZpY2VzIGNhbm5vdCBoYW5kbGUgbGFyZ2UgRE1BcwotLy8gVG8gZ2V0IGdvb2QgcGVyZm9ybWFuY2UsIG92ZXJyaWRlIHRoZXNlIHdpdGgKLS8vIGhpZ2hlciB2YWx1ZXMgcGVyIGRldmljZSB1c2luZyB0aGUgcHJvcGVydGllcwotLy8gc3lzLnVzYi5mZnMubWF4X3JlYWQgYW5kIHN5cy51c2IuZmZzLm1heF93cml0ZQotY29uc3RleHByIGludCBVU0JfRkZTX01BWF9XUklURSA9IE1UUF9CVUZGRVJfU0laRTsKLWNvbnN0ZXhwciBpbnQgVVNCX0ZGU19NQVhfUkVBRCA9IE1UUF9CVUZGRVJfU0laRTsKK2NvbnN0ZXhwciB1bnNpZ25lZCBBSU9fQlVGU19NQVggPSAxMjg7Citjb25zdGV4cHIgdW5zaWduZWQgQUlPX0JVRl9MRU4gPSAxNjM4NDsKIAogY29uc3RleHByIHVuc2lnbmVkIEZGU19OVU1fRVZFTlRTID0gNTsKIAotc3RhdGljX2Fzc2VydChVU0JfRkZTX01BWF9XUklURSA+IDAsICJNYXggci93IHZhbHVlcyBtdXN0IGJlID4gMCEiKTsKLXN0YXRpY19hc3NlcnQoVVNCX0ZGU19NQVhfUkVBRCA+IDAsICJNYXggci93IHZhbHVlcyBtdXN0IGJlID4gMCEiKTsKK2NvbnN0ZXhwciB1bnNpZ25lZCBNQVhfRklMRV9DSFVOS19TSVpFID0gQUlPX0JVRlNfTUFYICogQUlPX0JVRl9MRU47CiAKLWNvbnN0ZXhwciB1bnNpZ25lZCBpbnQgTUFYX01UUF9GSUxFX1NJWkUgPSAweEZGRkZGRkZGOworY29uc3RleHByIHVpbnQzMl90IE1BWF9NVFBfRklMRV9TSVpFID0gMHhGRkZGRkZGRjsKIAotY29uc3RleHByIHNpemVfdCBFTkRQT0lOVF9BTExPQ19SRVRSSUVTID0gMTA7Ci0KLXN0cnVjdCBmdW5jX2Rlc2MgewotICAgIHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgaW50ZjsKLSAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Jfbm9fYXVkaW8gc2luazsKLSAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Jfbm9fYXVkaW8gc291cmNlOwotICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBpbnRyOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IHNzX2Z1bmNfZGVzYyB7Ci0gICAgc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciBpbnRmOwotICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBzaW5rOwotICAgIHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yIHNpbmtfY29tcDsKLSAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Jfbm9fYXVkaW8gc291cmNlOwotICAgIHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yIHNvdXJjZV9jb21wOwotICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBpbnRyOwotICAgIHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yIGludHJfY29tcDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBkZXNjX3YxIHsKLSAgICBzdHJ1Y3QgdXNiX2Z1bmN0aW9uZnNfZGVzY3NfaGVhZF92MSB7Ci0gICAgICAgIF9fbGUzMiBtYWdpYzsKLSAgICAgICAgX19sZTMyIGxlbmd0aDsKLSAgICAgICAgX19sZTMyIGZzX2NvdW50OwotICAgICAgICBfX2xlMzIgaHNfY291bnQ7Ci0gICAgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBoZWFkZXI7Ci0gICAgc3RydWN0IGZ1bmNfZGVzYyBmc19kZXNjcywgaHNfZGVzY3M7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgZGVzY192MiB7Ci0gICAgc3RydWN0IHVzYl9mdW5jdGlvbmZzX2Rlc2NzX2hlYWRfdjIgaGVhZGVyOwotICAgIC8vIFRoZSByZXN0IG9mIHRoZSBzdHJ1Y3R1cmUgZGVwZW5kcyBvbiB0aGUgZmxhZ3MgaW4gdGhlIGhlYWRlci4KLSAgICBfX2xlMzIgZnNfY291bnQ7Ci0gICAgX19sZTMyIGhzX2NvdW50OwotICAgIF9fbGUzMiBzc19jb3VudDsKLSAgICBfX2xlMzIgb3NfY291bnQ7Ci0gICAgc3RydWN0IGZ1bmNfZGVzYyBmc19kZXNjcywgaHNfZGVzY3M7Ci0gICAgc3RydWN0IHNzX2Z1bmNfZGVzYyBzc19kZXNjczsKLSAgICBzdHJ1Y3QgdXNiX29zX2Rlc2NfaGVhZGVyIG9zX2hlYWRlcjsKLSAgICBzdHJ1Y3QgdXNiX2V4dF9jb21wYXRfZGVzYyBvc19kZXNjOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotY29uc3Qgc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciBtdHBfaW50ZXJmYWNlX2Rlc2MgPSB7Ci0gICAgLmJMZW5ndGggPSBVU0JfRFRfSU5URVJGQUNFX1NJWkUsCi0gICAgLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9JTlRFUkZBQ0UsCi0gICAgLmJJbnRlcmZhY2VOdW1iZXIgPSAwLAotICAgIC5iTnVtRW5kcG9pbnRzID0gMywKLSAgICAuYkludGVyZmFjZUNsYXNzID0gVVNCX0NMQVNTX1NUSUxMX0lNQUdFLAotICAgIC5iSW50ZXJmYWNlU3ViQ2xhc3MgPSAxLAotICAgIC5iSW50ZXJmYWNlUHJvdG9jb2wgPSAxLAotICAgIC5pSW50ZXJmYWNlID0gMSwKLX07Ci0KLWNvbnN0IHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgcHRwX2ludGVyZmFjZV9kZXNjID0gewotICAgIC5iTGVuZ3RoID0gVVNCX0RUX0lOVEVSRkFDRV9TSVpFLAotICAgIC5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfSU5URVJGQUNFLAotICAgIC5iSW50ZXJmYWNlTnVtYmVyID0gMCwKLSAgICAuYk51bUVuZHBvaW50cyA9IDMsCi0gICAgLmJJbnRlcmZhY2VDbGFzcyA9IFVTQl9DTEFTU19TVElMTF9JTUFHRSwKLSAgICAuYkludGVyZmFjZVN1YkNsYXNzID0gMSwKLSAgICAuYkludGVyZmFjZVByb3RvY29sID0gMSwKLX07Ci0KLWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBmc19zaW5rID0gewotICAgIC5iTGVuZ3RoID0gVVNCX0RUX0VORFBPSU5UX1NJWkUsCi0gICAgLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9FTkRQT0lOVCwKLSAgICAuYkVuZHBvaW50QWRkcmVzcyA9IDEgfCBVU0JfRElSX0lOLAotICAgIC5ibUF0dHJpYnV0ZXMgPSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAotICAgIC53TWF4UGFja2V0U2l6ZSA9IE1BWF9QQUNLRVRfU0laRV9GUywKLX07Ci0KLWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBmc19zb3VyY2UgPSB7Ci0gICAgLmJMZW5ndGggPSBVU0JfRFRfRU5EUE9JTlRfU0laRSwKLSAgICAuYkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0VORFBPSU5ULAotICAgIC5iRW5kcG9pbnRBZGRyZXNzID0gMiB8IFVTQl9ESVJfT1VULAotICAgIC5ibUF0dHJpYnV0ZXMgPSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAotICAgIC53TWF4UGFja2V0U2l6ZSA9IE1BWF9QQUNLRVRfU0laRV9GUywKLX07Ci0KLWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl9ub19hdWRpbyBmc19pbnRyID0gewotICAgIC5iTGVuZ3RoID0gVVNCX0RUX0VORFBPSU5UX1NJWkUsCi0gICAgLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9FTkRQT0lOVCwKLSAgICAuYkVuZHBvaW50QWRkcmVzcyA9IDMgfCBVU0JfRElSX0lOLAotICAgIC5ibUF0dHJpYnV0ZXMgPSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQsCi0gICAgLndNYXhQYWNrZXRTaXplID0gTUFYX1BBQ0tFVF9TSVpFX0ZTLAotICAgIC5iSW50ZXJ2YWwgPSA2LAotfTsKLQotY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yX25vX2F1ZGlvIGhzX3NpbmsgPSB7Ci0gICAgLmJMZW5ndGggPSBVU0JfRFRfRU5EUE9JTlRfU0laRSwKLSAgICAuYkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0VORFBPSU5ULAotICAgIC5iRW5kcG9pbnRBZGRyZXNzID0gMSB8IFVTQl9ESVJfSU4sCi0gICAgLmJtQXR0cmlidXRlcyA9IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCi0gICAgLndNYXhQYWNrZXRTaXplID0gTUFYX1BBQ0tFVF9TSVpFX0hTLAotfTsKLQotY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yX25vX2F1ZGlvIGhzX3NvdXJjZSA9IHsKLSAgICAuYkxlbmd0aCA9IFVTQl9EVF9FTkRQT0lOVF9TSVpFLAotICAgIC5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfRU5EUE9JTlQsCi0gICAgLmJFbmRwb2ludEFkZHJlc3MgPSAyIHwgVVNCX0RJUl9PVVQsCi0gICAgLmJtQXR0cmlidXRlcyA9IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCi0gICAgLndNYXhQYWNrZXRTaXplID0gTUFYX1BBQ0tFVF9TSVpFX0hTLAotfTsKLQotY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yX25vX2F1ZGlvIGhzX2ludHIgPSB7Ci0gICAgLmJMZW5ndGggPSBVU0JfRFRfRU5EUE9JTlRfU0laRSwKLSAgICAuYkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0VORFBPSU5ULAotICAgIC5iRW5kcG9pbnRBZGRyZXNzID0gMyB8IFVTQl9ESVJfSU4sCi0gICAgLmJtQXR0cmlidXRlcyA9IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCwKLSAgICAud01heFBhY2tldFNpemUgPSBNQVhfUEFDS0VUX1NJWkVfSFMsCi0gICAgLmJJbnRlcnZhbCA9IDYsCi19OwotCi1jb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Jfbm9fYXVkaW8gc3Nfc2luayA9IHsKLSAgICAuYkxlbmd0aCA9IFVTQl9EVF9FTkRQT0lOVF9TSVpFLAotICAgIC5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfRU5EUE9JTlQsCi0gICAgLmJFbmRwb2ludEFkZHJlc3MgPSAxIHwgVVNCX0RJUl9JTiwKLSAgICAuYm1BdHRyaWJ1dGVzID0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKLSAgICAud01heFBhY2tldFNpemUgPSBNQVhfUEFDS0VUX1NJWkVfU1MsCi19OwotCi1jb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Jfbm9fYXVkaW8gc3Nfc291cmNlID0gewotICAgIC5iTGVuZ3RoID0gVVNCX0RUX0VORFBPSU5UX1NJWkUsCi0gICAgLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9FTkRQT0lOVCwKLSAgICAuYkVuZHBvaW50QWRkcmVzcyA9IDIgfCBVU0JfRElSX09VVCwKLSAgICAuYm1BdHRyaWJ1dGVzID0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKLSAgICAud01heFBhY2tldFNpemUgPSBNQVhfUEFDS0VUX1NJWkVfU1MsCi19OwotCi1jb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Jfbm9fYXVkaW8gc3NfaW50ciA9IHsKLSAgICAuYkxlbmd0aCA9IFVTQl9EVF9FTkRQT0lOVF9TSVpFLAotICAgIC5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfRU5EUE9JTlQsCi0gICAgLmJFbmRwb2ludEFkZHJlc3MgPSAzIHwgVVNCX0RJUl9JTiwKLSAgICAuYm1BdHRyaWJ1dGVzID0gVVNCX0VORFBPSU5UX1hGRVJfSU5ULAotICAgIC53TWF4UGFja2V0U2l6ZSA9IE1BWF9QQUNLRVRfU0laRV9TUywKLSAgICAuYkludGVydmFsID0gNiwKLX07Ci0KLWNvbnN0IHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yIHNzX3NpbmtfY29tcCA9IHsKLSAgICAuYkxlbmd0aCA9IHNpemVvZihzc19zaW5rX2NvbXApLAotICAgIC5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfU1NfRU5EUE9JTlRfQ09NUCwKLSAgICAuYk1heEJ1cnN0ID0gNiwKLX07Ci0KLWNvbnN0IHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yIHNzX3NvdXJjZV9jb21wID0gewotICAgIC5iTGVuZ3RoID0gc2l6ZW9mKHNzX3NvdXJjZV9jb21wKSwKLSAgICAuYkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX1NTX0VORFBPSU5UX0NPTVAsCi0gICAgLmJNYXhCdXJzdCA9IDYsCi19OwotCi1jb25zdCBzdHJ1Y3QgdXNiX3NzX2VwX2NvbXBfZGVzY3JpcHRvciBzc19pbnRyX2NvbXAgPSB7Ci0gICAgLmJMZW5ndGggPSBzaXplb2Yoc3NfaW50cl9jb21wKSwKLSAgICAuYkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX1NTX0VORFBPSU5UX0NPTVAsCi19OwotCi1jb25zdCBzdHJ1Y3QgZnVuY19kZXNjIG10cF9mc19kZXNjcmlwdG9ycyA9IHsKLSAgICAuaW50ZiA9IG10cF9pbnRlcmZhY2VfZGVzYywKLSAgICAuc2luayA9IGZzX3NpbmssCi0gICAgLnNvdXJjZSA9IGZzX3NvdXJjZSwKLSAgICAuaW50ciA9IGZzX2ludHIsCi19OwotCi1jb25zdCBzdHJ1Y3QgZnVuY19kZXNjIG10cF9oc19kZXNjcmlwdG9ycyA9IHsKLSAgICAuaW50ZiA9IG10cF9pbnRlcmZhY2VfZGVzYywKLSAgICAuc2luayA9IGhzX3NpbmssCi0gICAgLnNvdXJjZSA9IGhzX3NvdXJjZSwKLSAgICAuaW50ciA9IGhzX2ludHIsCi19OwotCi1jb25zdCBzdHJ1Y3Qgc3NfZnVuY19kZXNjIG10cF9zc19kZXNjcmlwdG9ycyA9IHsKLSAgICAuaW50ZiA9IG10cF9pbnRlcmZhY2VfZGVzYywKLSAgICAuc2luayA9IHNzX3NpbmssCi0gICAgLnNpbmtfY29tcCA9IHNzX3NpbmtfY29tcCwKLSAgICAuc291cmNlID0gc3Nfc291cmNlLAotICAgIC5zb3VyY2VfY29tcCA9IHNzX3NvdXJjZV9jb21wLAotICAgIC5pbnRyID0gc3NfaW50ciwKLSAgICAuaW50cl9jb21wID0gc3NfaW50cl9jb21wLAotfTsKLQotY29uc3Qgc3RydWN0IGZ1bmNfZGVzYyBwdHBfZnNfZGVzY3JpcHRvcnMgPSB7Ci0gICAgLmludGYgPSBwdHBfaW50ZXJmYWNlX2Rlc2MsCi0gICAgLnNpbmsgPSBmc19zaW5rLAotICAgIC5zb3VyY2UgPSBmc19zb3VyY2UsCi0gICAgLmludHIgPSBmc19pbnRyLAotfTsKLQotY29uc3Qgc3RydWN0IGZ1bmNfZGVzYyBwdHBfaHNfZGVzY3JpcHRvcnMgPSB7Ci0gICAgLmludGYgPSBwdHBfaW50ZXJmYWNlX2Rlc2MsCi0gICAgLnNpbmsgPSBoc19zaW5rLAotICAgIC5zb3VyY2UgPSBoc19zb3VyY2UsCi0gICAgLmludHIgPSBoc19pbnRyLAotfTsKLQotY29uc3Qgc3RydWN0IHNzX2Z1bmNfZGVzYyBwdHBfc3NfZGVzY3JpcHRvcnMgPSB7Ci0gICAgLmludGYgPSBwdHBfaW50ZXJmYWNlX2Rlc2MsCi0gICAgLnNpbmsgPSBzc19zaW5rLAotICAgIC5zaW5rX2NvbXAgPSBzc19zaW5rX2NvbXAsCi0gICAgLnNvdXJjZSA9IHNzX3NvdXJjZSwKLSAgICAuc291cmNlX2NvbXAgPSBzc19zb3VyY2VfY29tcCwKLSAgICAuaW50ciA9IHNzX2ludHIsCi0gICAgLmludHJfY29tcCA9IHNzX2ludHJfY29tcCwKLX07Ci0KLSNkZWZpbmUgU1RSX0lOVEVSRkFDRSAiTVRQIgotY29uc3Qgc3RydWN0IHsKLSAgICBzdHJ1Y3QgdXNiX2Z1bmN0aW9uZnNfc3RyaW5nc19oZWFkIGhlYWRlcjsKLSAgICBzdHJ1Y3QgewotICAgICAgICBfX2xlMTYgY29kZTsKLSAgICAgICAgY29uc3QgY2hhciBzdHIxW3NpemVvZihTVFJfSU5URVJGQUNFKV07Ci0gICAgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBsYW5nMDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc3RyaW5ncyA9IHsKLSAgICAuaGVhZGVyID0gewotICAgICAgICAubWFnaWMgPSBjcHVfdG9fbGUzMihGVU5DVElPTkZTX1NUUklOR1NfTUFHSUMpLAotICAgICAgICAubGVuZ3RoID0gY3B1X3RvX2xlMzIoc2l6ZW9mKHN0cmluZ3MpKSwKLSAgICAgICAgLnN0cl9jb3VudCA9IGNwdV90b19sZTMyKDEpLAotICAgICAgICAubGFuZ19jb3VudCA9IGNwdV90b19sZTMyKDEpLAotICAgIH0sCi0gICAgLmxhbmcwID0gewotICAgICAgICAuY29kZSA9IGNwdV90b19sZTE2KDB4MDQwOSksCi0gICAgICAgIC5zdHIxID0gU1RSX0lOVEVSRkFDRSwKLSAgICB9LAotfTsKLQotc3RydWN0IHVzYl9vc19kZXNjX2hlYWRlciBtdHBfb3NfZGVzY19oZWFkZXIgPSB7Ci0gICAgLmludGVyZmFjZSA9IGh0b2xlMzIoMSksCi0gICAgLmR3TGVuZ3RoID0gaHRvbGUzMihzaXplb2YodXNiX29zX2Rlc2NfaGVhZGVyKSArIHNpemVvZih1c2JfZXh0X2NvbXBhdF9kZXNjKSksCi0gICAgLmJjZFZlcnNpb24gPSBodG9sZTE2KDEpLAotICAgIC53SW5kZXggPSBodG9sZTE2KDQpLAotICAgIC5iQ291bnQgPSBodG9sZTE2KDEpLAotICAgIC5SZXNlcnZlZCA9IGh0b2xlMTYoMCksCi19OwotCi1zdHJ1Y3QgdXNiX2V4dF9jb21wYXRfZGVzYyBtdHBfb3NfZGVzY19jb21wYXQgPSB7Ci0gICAgLmJGaXJzdEludGVyZmFjZU51bWJlciA9IDAsCi0gICAgLlJlc2VydmVkMSA9IGh0b2xlMzIoMSksCi0gICAgLkNvbXBhdGlibGVJRCA9IHsgJ00nLCAnVCcsICdQJyB9LAotICAgIC5TdWJDb21wYXRpYmxlSUQgPSB7MH0sCi0gICAgLlJlc2VydmVkMiA9IHswfSwKLX07Ci0KLXN0cnVjdCB1c2JfZXh0X2NvbXBhdF9kZXNjIHB0cF9vc19kZXNjX2NvbXBhdCA9IHsKLSAgICAuYkZpcnN0SW50ZXJmYWNlTnVtYmVyID0gMCwKLSAgICAuUmVzZXJ2ZWQxID0gaHRvbGUzMigxKSwKLSAgICAuQ29tcGF0aWJsZUlEID0geyAnUCcsICdUJywgJ1AnIH0sCi0gICAgLlN1YkNvbXBhdGlibGVJRCA9IHswfSwKLSAgICAuUmVzZXJ2ZWQyID0gezB9LAotfTsKK3N0cnVjdCB0aW1lc3BlYyBaRVJPX1RJTUVPVVQgPSB7IDAsIDAgfTsKIAogc3RydWN0IG10cF9kZXZpY2Vfc3RhdHVzIHsKICAgICB1aW50MTZfdCAgd0xlbmd0aDsKQEAgLTMyNiw5ICs1OSwxOSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLU10cEZmc0hhbmRsZTo6TXRwRmZzSGFuZGxlKCkgOgotICAgIG1NYXhXcml0ZShVU0JfRkZTX01BWF9XUklURSksCi0gICAgbU1heFJlYWQoVVNCX0ZGU19NQVhfUkVBRCkge30KK2ludCBNdHBGZnNIYW5kbGU6OmdldFBhY2tldFNpemUoaW50IGZmc19mZCkgeworICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBkZXNjOworICAgIGlmIChpb2N0bChmZnNfZmQsIEZVTkNUSU9ORlNfRU5EUE9JTlRfREVTQywgcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBsb25nPigmZGVzYykpKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgZ2V0IEZGUyBidWxrLWluIGRlc2NyaXB0b3IiOworICAgICAgICByZXR1cm4gTUFYX1BBQ0tFVF9TSVpFX0hTOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBkZXNjLndNYXhQYWNrZXRTaXplOworICAgIH0KK30KKworTXRwRmZzSGFuZGxlOjpNdHBGZnNIYW5kbGUoaW50IGNvbnRyb2xGZCkgeworICAgIG1Db250cm9sLnJlc2V0KGNvbnRyb2xGZCk7Cit9CiAKIE10cEZmc0hhbmRsZTo6fk10cEZmc0hhbmRsZSgpIHt9CiAKQEAgLTMzOCw3MyArODEsNzcgQEAKICAgICBtQnVsa091dC5yZXNldCgpOwogfQogCi1ib29sIE10cEZmc0hhbmRsZTo6aW5pdEZ1bmN0aW9uZnMoKSB7Ci0gICAgc3NpemVfdCByZXQ7Ci0gICAgc3RydWN0IGRlc2NfdjEgdjFfZGVzY3JpcHRvcjsKLSAgICBzdHJ1Y3QgZGVzY192MiB2Ml9kZXNjcmlwdG9yOwotCi0gICAgdjJfZGVzY3JpcHRvci5oZWFkZXIubWFnaWMgPSBjcHVfdG9fbGUzMihGVU5DVElPTkZTX0RFU0NSSVBUT1JTX01BR0lDX1YyKTsKLSAgICB2Ml9kZXNjcmlwdG9yLmhlYWRlci5sZW5ndGggPSBjcHVfdG9fbGUzMihzaXplb2YodjJfZGVzY3JpcHRvcikpOwotICAgIHYyX2Rlc2NyaXB0b3IuaGVhZGVyLmZsYWdzID0gRlVOQ1RJT05GU19IQVNfRlNfREVTQyB8IEZVTkNUSU9ORlNfSEFTX0hTX0RFU0MgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlVOQ1RJT05GU19IQVNfU1NfREVTQyB8IEZVTkNUSU9ORlNfSEFTX01TX09TX0RFU0M7Ci0gICAgdjJfZGVzY3JpcHRvci5mc19jb3VudCA9IDQ7Ci0gICAgdjJfZGVzY3JpcHRvci5oc19jb3VudCA9IDQ7Ci0gICAgdjJfZGVzY3JpcHRvci5zc19jb3VudCA9IDc7Ci0gICAgdjJfZGVzY3JpcHRvci5vc19jb3VudCA9IDE7Ci0gICAgdjJfZGVzY3JpcHRvci5mc19kZXNjcyA9IG1QdHAgPyBwdHBfZnNfZGVzY3JpcHRvcnMgOiBtdHBfZnNfZGVzY3JpcHRvcnM7Ci0gICAgdjJfZGVzY3JpcHRvci5oc19kZXNjcyA9IG1QdHAgPyBwdHBfaHNfZGVzY3JpcHRvcnMgOiBtdHBfaHNfZGVzY3JpcHRvcnM7Ci0gICAgdjJfZGVzY3JpcHRvci5zc19kZXNjcyA9IG1QdHAgPyBwdHBfc3NfZGVzY3JpcHRvcnMgOiBtdHBfc3NfZGVzY3JpcHRvcnM7Ci0gICAgdjJfZGVzY3JpcHRvci5vc19oZWFkZXIgPSBtdHBfb3NfZGVzY19oZWFkZXI7Ci0gICAgdjJfZGVzY3JpcHRvci5vc19kZXNjID0gbVB0cCA/IHB0cF9vc19kZXNjX2NvbXBhdCA6IG10cF9vc19kZXNjX2NvbXBhdDsKLQotICAgIGlmIChtQ29udHJvbCA8IDApIHsgLy8gbWlnaHQgaGF2ZSBhbHJlYWR5IGRvbmUgdGhpcyBiZWZvcmUKLSAgICAgICAgbUNvbnRyb2wucmVzZXQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oRkZTX01UUF9FUDAsIE9fUkRXUikpKTsKLSAgICAgICAgaWYgKG1Db250cm9sIDwgMCkgewotICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgRkZTX01UUF9FUDAgPDwgIjogY2Fubm90IG9wZW4gY29udHJvbCBlbmRwb2ludCI7Ci0gICAgICAgICAgICBnb3RvIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldCA9IFRFTVBfRkFJTFVSRV9SRVRSWSg6OndyaXRlKG1Db250cm9sLCAmdjJfZGVzY3JpcHRvciwgc2l6ZW9mKHYyX2Rlc2NyaXB0b3IpKSk7Ci0gICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICB2MV9kZXNjcmlwdG9yLmhlYWRlci5tYWdpYyA9IGNwdV90b19sZTMyKEZVTkNUSU9ORlNfREVTQ1JJUFRPUlNfTUFHSUMpOwotICAgICAgICAgICAgdjFfZGVzY3JpcHRvci5oZWFkZXIubGVuZ3RoID0gY3B1X3RvX2xlMzIoc2l6ZW9mKHYxX2Rlc2NyaXB0b3IpKTsKLSAgICAgICAgICAgIHYxX2Rlc2NyaXB0b3IuaGVhZGVyLmZzX2NvdW50ID0gNDsKLSAgICAgICAgICAgIHYxX2Rlc2NyaXB0b3IuaGVhZGVyLmhzX2NvdW50ID0gNDsKLSAgICAgICAgICAgIHYxX2Rlc2NyaXB0b3IuZnNfZGVzY3MgPSBtUHRwID8gcHRwX2ZzX2Rlc2NyaXB0b3JzIDogbXRwX2ZzX2Rlc2NyaXB0b3JzOwotICAgICAgICAgICAgdjFfZGVzY3JpcHRvci5oc19kZXNjcyA9IG1QdHAgPyBwdHBfaHNfZGVzY3JpcHRvcnMgOiBtdHBfaHNfZGVzY3JpcHRvcnM7Ci0gICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCBGRlNfTVRQX0VQMCA8PCAiU3dpdGNoaW5nIHRvIFYxIGRlc2NyaXB0b3IgZm9ybWF0IjsKLSAgICAgICAgICAgIHJldCA9IFRFTVBfRkFJTFVSRV9SRVRSWSg6OndyaXRlKG1Db250cm9sLCAmdjFfZGVzY3JpcHRvciwgc2l6ZW9mKHYxX2Rlc2NyaXB0b3IpKSk7Ci0gICAgICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8IEZGU19NVFBfRVAwIDw8ICJXcml0aW5nIGRlc2NyaXB0b3JzIGZhaWxlZCI7Ci0gICAgICAgICAgICAgICAgZ290byBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0ID0gVEVNUF9GQUlMVVJFX1JFVFJZKDo6d3JpdGUobUNvbnRyb2wsICZzdHJpbmdzLCBzaXplb2Yoc3RyaW5ncykpKTsKLSAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8IEZGU19NVFBfRVAwIDw8ICJXcml0aW5nIHN0cmluZ3MgZmFpbGVkIjsKLSAgICAgICAgICAgIGdvdG8gZXJyOworYm9vbCBNdHBGZnNIYW5kbGU6Om9wZW5FbmRwb2ludHMoYm9vbCBwdHApIHsKKyAgICBpZiAobUJ1bGtJbiA8IDApIHsKKyAgICAgICAgbUJ1bGtJbi5yZXNldChURU1QX0ZBSUxVUkVfUkVUUlkob3BlbihwdHAgPyBGRlNfUFRQX0VQX0lOIDogRkZTX01UUF9FUF9JTiwgT19SRFdSKSkpOworICAgICAgICBpZiAobUJ1bGtJbiA8IDApIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8IChwdHAgPyBGRlNfUFRQX0VQX0lOIDogRkZTX01UUF9FUF9JTikgPDwgIjogY2Fubm90IG9wZW4gYnVsayBpbiBlcCI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKG1CdWxrSW4gPiAtMSB8fCBtQnVsa091dCA+IC0xIHx8IG1JbnRyID4gLTEpCi0gICAgICAgIExPRyhXQVJOSU5HKSA8PCAiRW5kcG9pbnRzIHdlcmUgbm90IGNsb3NlZCBiZWZvcmUgY29uZmlndXJlISI7CiAKKyAgICBpZiAobUJ1bGtPdXQgPCAwKSB7CisgICAgICAgIG1CdWxrT3V0LnJlc2V0KFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKHB0cCA/IEZGU19QVFBfRVBfT1VUIDogRkZTX01UUF9FUF9PVVQsIE9fUkRXUikpKTsKKyAgICAgICAgaWYgKG1CdWxrT3V0IDwgMCkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgKHB0cCA/IEZGU19QVFBfRVBfT1VUIDogRkZTX01UUF9FUF9PVVQpIDw8ICI6IGNhbm5vdCBvcGVuIGJ1bGsgb3V0IGVwIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtSW50ciA8IDApIHsKKyAgICAgICAgbUludHIucmVzZXQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4ocHRwID8gRkZTX1BUUF9FUF9JTlRSIDogRkZTX01UUF9FUF9JTlRSLCBPX1JEV1IpKSk7CisgICAgICAgIGlmIChtSW50ciA8IDApIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8IChwdHAgPyBGRlNfUFRQX0VQX0lOVFIgOiBGRlNfTVRQX0VQX0lOVFIpIDw8ICI6IGNhbm5vdCBvcGVuIGludHIgZXAiOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQogICAgIHJldHVybiB0cnVlOworfQogCi1lcnI6Ci0gICAgY2xvc2VDb25maWcoKTsKLSAgICByZXR1cm4gZmFsc2U7Cit2b2lkIE10cEZmc0hhbmRsZTo6YWR2aXNlKGludCBmZCkgeworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOVU1fSU9fQlVGUzsgaSsrKSB7CisgICAgICAgIGlmIChwb3NpeF9tYWR2aXNlKG1Jb2J1ZltpXS5idWZzLmRhdGEoKSwgTUFYX0ZJTEVfQ0hVTktfU0laRSwKKyAgICAgICAgICAgICAgICBQT1NJWF9NQURWX1NFUVVFTlRJQUwgfCBQT1NJWF9NQURWX1dJTExORUVEKSA8IDApCisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG1hZHZpc2UiOworICAgIH0KKyAgICBpZiAocG9zaXhfZmFkdmlzZShmZCwgMCwgMCwKKyAgICAgICAgICAgICAgICBQT1NJWF9GQURWX1NFUVVFTlRJQUwgfCBQT1NJWF9GQURWX05PUkVVU0UgfCBQT1NJWF9GQURWX1dJTExORUVEKSA8IDApCisgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZmFkdmlzZSI7Cit9CisKK2Jvb2wgTXRwRmZzSGFuZGxlOjp3cml0ZURlc2NyaXB0b3JzKGJvb2wgcHRwKSB7CisgICAgcmV0dXJuIDo6YW5kcm9pZDo6d3JpdGVEZXNjcmlwdG9ycyhtQ29udHJvbCwgcHRwKTsKIH0KIAogdm9pZCBNdHBGZnNIYW5kbGU6OmNsb3NlQ29uZmlnKCkgewogICAgIG1Db250cm9sLnJlc2V0KCk7CiB9CiAKLXZvaWQgTXRwRmZzSGFuZGxlOjpjb250cm9sTG9vcCgpIHsKLSAgICB3aGlsZSAoIWhhbmRsZUV2ZW50KCkpIHt9Ci0gICAgTE9HKERFQlVHKSA8PCAiTXRwIHNlcnZlciBzaHV0dGluZyBkb3duIjsKK2ludCBNdHBGZnNIYW5kbGU6OmRvQXN5bmModm9pZCogZGF0YSwgc2l6ZV90IGxlbiwgYm9vbCByZWFkKSB7CisgICAgc3RydWN0IGlvX2V2ZW50IGlvZXZzWzFdOworICAgIGlmIChsZW4gPiBBSU9fQlVGX0xFTikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJNdHAgcmVhZC93cml0ZSB0b28gbGFyZ2UgIiA8PCBsZW47CisgICAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1Jb2J1ZlswXS5idWZbMF0gPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGNoYXIqPihkYXRhKTsKKyAgICBpZiAoaW9idWZTdWJtaXQoJm1Jb2J1ZlswXSwgcmVhZCA/IG1CdWxrT3V0IDogbUJ1bGtJbiwgbGVuLCByZWFkKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGludCByZXQgPSB3YWl0RXZlbnRzKCZtSW9idWZbMF0sIDEsIGlvZXZzLCBudWxscHRyKTsKKyAgICBtSW9idWZbMF0uYnVmWzBdID0gbUlvYnVmWzBdLmJ1ZnMuZGF0YSgpOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBNdHBGZnNIYW5kbGU6OnJlYWQodm9pZCogZGF0YSwgc2l6ZV90IGxlbikgeworICAgIHJldHVybiBkb0FzeW5jKGRhdGEsIGxlbiwgdHJ1ZSk7Cit9CisKK2ludCBNdHBGZnNIYW5kbGU6OndyaXRlKGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBsZW4pIHsKKyAgICByZXR1cm4gZG9Bc3luYyhjb25zdF9jYXN0PHZvaWQqPihkYXRhKSwgbGVuLCBmYWxzZSk7CiB9CiAKIGludCBNdHBGZnNIYW5kbGU6OmhhbmRsZUV2ZW50KCkgeworCiAgICAgc3RkOjp2ZWN0b3I8dXNiX2Z1bmN0aW9uZnNfZXZlbnQ+IGV2ZW50cyhGRlNfTlVNX0VWRU5UUyk7CiAgICAgdXNiX2Z1bmN0aW9uZnNfZXZlbnQgKmV2ZW50ID0gZXZlbnRzLmRhdGEoKTsKICAgICBpbnQgbmJ5dGVzID0gVEVNUF9GQUlMVVJFX1JFVFJZKDo6cmVhZChtQ29udHJvbCwgZXZlbnQsCkBAIC00MTcsMTEgKzE2NCw5IEBACiAgICAgICAgIHN3aXRjaCAoZXZlbnQtPnR5cGUpIHsKICAgICAgICAgY2FzZSBGVU5DVElPTkZTX0JJTkQ6CiAgICAgICAgIGNhc2UgRlVOQ1RJT05GU19FTkFCTEU6Ci0gICAgICAgIGNhc2UgRlVOQ1RJT05GU19SRVNVTUU6CiAgICAgICAgICAgICByZXQgPSAwOwogICAgICAgICAgICAgZXJybm8gPSAwOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlVOQ1RJT05GU19TVVNQRU5EOgogICAgICAgICBjYXNlIEZVTkNUSU9ORlNfVU5CSU5EOgogICAgICAgICBjYXNlIEZVTkNUSU9ORlNfRElTQUJMRToKICAgICAgICAgICAgIGVycm5vID0gRVNIVVRET1dOOwpAQCAtNDMxLDggKzE3NiwxMSBAQAogICAgICAgICAgICAgaWYgKGhhbmRsZUNvbnRyb2xSZXF1ZXN0KCZldmVudC0+dS5zZXR1cCkgPT0gLTEpCiAgICAgICAgICAgICAgICAgcmV0ID0gLTE7CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGVU5DVElPTkZTX1NVU1BFTkQ6CisgICAgICAgIGNhc2UgRlVOQ1RJT05GU19SRVNVTUU6CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPRyhERUJVRykgPDwgIk10cCBFdmVudCAiIDw8IGV2ZW50LT50eXBlIDw8ICIgKHVua25vd24pIjsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk10cCBFdmVudCAiIDw8IGV2ZW50LT50eXBlIDw8ICIgKHVua25vd24pIjsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gcmV0OwpAQCAtNDQ2LDQwMSArMTk0LDQ0NCBAQAogICAgIHVpbnQxNl90IHZhbHVlID0gc2V0dXAtPndWYWx1ZTsKICAgICBzdGQ6OnZlY3RvcjxjaGFyPiBidWY7CiAgICAgYnVmLnJlc2l6ZShsZW5ndGgpOworICAgIGludCByZXQgPSAwOwogCiAgICAgaWYgKCEodHlwZSAmIFVTQl9ESVJfSU4pKSB7CiAgICAgICAgIGlmICg6OnJlYWQobUNvbnRyb2wsIGJ1Zi5kYXRhKCksIGxlbmd0aCkgIT0gbGVuZ3RoKSB7Ci0gICAgICAgICAgICBQTE9HKERFQlVHKSA8PCAiTXRwIGVycm9yIGN0cmxyZXEgcmVhZCBkYXRhIjsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJNdHAgZXJyb3IgY3RybHJlcSByZWFkIGRhdGEiOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKCh0eXBlICYgVVNCX1RZUEVfTUFTSykgPT0gVVNCX1RZUEVfQ0xBU1MgJiYgaW5kZXggPT0gMCAmJiB2YWx1ZSA9PSAwKSB7CiAgICAgICAgIHN3aXRjaChjb2RlKSB7CisgICAgICAgIGNhc2UgTVRQX1JFUV9SRVNFVDoKKyAgICAgICAgY2FzZSBNVFBfUkVRX0NBTkNFTDoKKyAgICAgICAgICAgIGVycm5vID0gRUNBTkNFTEVEOworICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBNVFBfUkVRX0dFVF9ERVZJQ0VfU1RBVFVTOgogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBtdHBfZGV2aWNlX3N0YXR1cykpIHsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPCBzaXplb2Yoc3RydWN0IG10cF9kZXZpY2Vfc3RhdHVzKSArIDQpIHsKKyAgICAgICAgICAgICAgICBlcnJubyA9IEVJTlZBTDsKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzdHJ1Y3QgbXRwX2RldmljZV9zdGF0dXMgKnN0ID0gcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QgbXRwX2RldmljZV9zdGF0dXMqPihidWYuZGF0YSgpKTsKICAgICAgICAgICAgIHN0LT53TGVuZ3RoID0gaHRvbGUxNihzaXplb2Yoc3QpKTsKLSAgICAgICAgICAgIHN0LT53Q29kZSA9IE1UUF9SRVNQT05TRV9PSzsKKyAgICAgICAgICAgIGlmIChtQ2FuY2VsZWQpIHsKKyAgICAgICAgICAgICAgICBzdC0+d0xlbmd0aCArPSA0OworICAgICAgICAgICAgICAgIHN0LT53Q29kZSA9IE1UUF9SRVNQT05TRV9UUkFOU0FDVElPTl9DQU5DRUxMRUQ7CisgICAgICAgICAgICAgICAgdWludDE2X3QgKmVuZHBvaW50cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QqPihzdCArIDEpOworICAgICAgICAgICAgICAgIGVuZHBvaW50c1swXSA9IGlvY3RsKG1CdWxrSW4sIEZVTkNUSU9ORlNfRU5EUE9JTlRfUkVWTUFQKTsKKyAgICAgICAgICAgICAgICBlbmRwb2ludHNbMV0gPSBpb2N0bChtQnVsa091dCwgRlVOQ1RJT05GU19FTkRQT0lOVF9SRVZNQVApOworICAgICAgICAgICAgICAgIG1DYW5jZWxlZCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdC0+d0NvZGUgPSBNVFBfUkVTUE9OU0VfT0s7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBsZW5ndGggPSBzdC0+d0xlbmd0aDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0coREVCVUcpIDw8ICJVbnJlY29nbml6ZWQgTXRwIGNsYXNzIHJlcXVlc3QhICIgPDwgY29kZTsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlVucmVjb2duaXplZCBNdHAgY2xhc3MgcmVxdWVzdCEgIiA8PCBjb2RlOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgTE9HKERFQlVHKSA8PCAiVW5yZWNvZ25pemVkIHJlcXVlc3QgdHlwZSAiIDw8IHR5cGU7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVucmVjb2duaXplZCByZXF1ZXN0IHR5cGUgIiA8PCB0eXBlOwogICAgIH0KIAogICAgIGlmICh0eXBlICYgVVNCX0RJUl9JTikgewogICAgICAgICBpZiAoOjp3cml0ZShtQ29udHJvbCwgYnVmLmRhdGEoKSwgbGVuZ3RoKSAhPSBsZW5ndGgpIHsKLSAgICAgICAgICAgIFBMT0coREVCVUcpIDw8ICJNdHAgZXJyb3IgY3RybHJlcSB3cml0ZSBkYXRhIjsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJNdHAgZXJyb3IgY3RybHJlcSB3cml0ZSBkYXRhIjsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gMDsKIH0KIAotaW50IE10cEZmc0hhbmRsZTo6d3JpdGVIYW5kbGUoaW50IGZkLCBjb25zdCB2b2lkKiBkYXRhLCBpbnQgbGVuKSB7Ci0gICAgTE9HKFZFUkJPU0UpIDw8ICJNVFAgYWJvdXQgdG8gd3JpdGUgZmQgPSAiIDw8IGZkIDw8ICIsIGxlbj0iIDw8IGxlbjsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBjb25zdCBjaGFyKiBidWYgPSBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oZGF0YSk7Ci0gICAgd2hpbGUgKGxlbiA+IDApIHsKLSAgICAgICAgaW50IHdyaXRlX2xlbiA9IHN0ZDo6bWluKG1NYXhXcml0ZSwgbGVuKTsKLSAgICAgICAgaW50IG4gPSBURU1QX0ZBSUxVUkVfUkVUUlkoOjp3cml0ZShmZCwgYnVmLCB3cml0ZV9sZW4pKTsKK2ludCBNdHBGZnNIYW5kbGU6OnN0YXJ0KGJvb2wgcHRwKSB7CisgICAgaWYgKCFvcGVuRW5kcG9pbnRzKHB0cCkpCisgICAgICAgIHJldHVybiAtMTsKIAotICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJ3cml0ZSBFUlJPUjogZmQgPSAiIDw8IGZkIDw8ICIsIG4gPSAiIDw8IG47Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0gZWxzZSBpZiAobiA8IHdyaXRlX2xlbikgewotICAgICAgICAgICAgZXJybm8gPSBFSU87Ci0gICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAibGVzcyB3cml0dGVuIHRoYW4gZXhwZWN0ZWQiOwotICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOVU1fSU9fQlVGUzsgaSsrKSB7CisgICAgICAgIG1Jb2J1ZltpXS5idWZzLnJlc2l6ZShNQVhfRklMRV9DSFVOS19TSVpFKTsKKyAgICAgICAgbUlvYnVmW2ldLmlvY2IucmVzaXplKEFJT19CVUZTX01BWCk7CisgICAgICAgIG1Jb2J1ZltpXS5pb2Nicy5yZXNpemUoQUlPX0JVRlNfTUFYKTsKKyAgICAgICAgbUlvYnVmW2ldLmJ1Zi5yZXNpemUoQUlPX0JVRlNfTUFYKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IEFJT19CVUZTX01BWDsgaisrKSB7CisgICAgICAgICAgICBtSW9idWZbaV0uYnVmW2pdID0gbUlvYnVmW2ldLmJ1ZnMuZGF0YSgpICsgaiAqIEFJT19CVUZfTEVOOworICAgICAgICAgICAgbUlvYnVmW2ldLmlvY2Jbal0gPSAmbUlvYnVmW2ldLmlvY2JzW2pdOwogICAgICAgICB9Ci0gICAgICAgIGJ1ZiArPSBuOwotICAgICAgICBsZW4gLT0gbjsKLSAgICAgICAgcmV0ICs9IG47CiAgICAgfQotICAgIHJldHVybiByZXQ7Ci19CiAKLWludCBNdHBGZnNIYW5kbGU6OnJlYWRIYW5kbGUoaW50IGZkLCB2b2lkKiBkYXRhLCBpbnQgbGVuKSB7Ci0gICAgTE9HKFZFUkJPU0UpIDw8ICJNVFAgYWJvdXQgdG8gcmVhZCBmZCA9ICIgPDwgZmQgPDwgIiwgbGVuPSIgPDwgbGVuOwotICAgIGludCByZXQgPSAwOwotICAgIGNoYXIqIGJ1ZiA9IHN0YXRpY19jYXN0PGNoYXIqPihkYXRhKTsKLSAgICB3aGlsZSAobGVuID4gMCkgewotICAgICAgICBpbnQgcmVhZF9sZW4gPSBzdGQ6Om1pbihtTWF4UmVhZCwgbGVuKTsKLSAgICAgICAgaW50IG4gPSBURU1QX0ZBSUxVUkVfUkVUUlkoOjpyZWFkKGZkLCBidWYsIHJlYWRfbGVuKSk7Ci0gICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgInJlYWQgRVJST1I6IGZkID0gIiA8PCBmZCA8PCAiLCBuID0gIiA8PCBuOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHJldCArPSBuOwotICAgICAgICBpZiAobiA8IHJlYWRfbGVuKSAvLyBkb25lIHJlYWRpbmcgZWFybHkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBidWYgKz0gbjsKLSAgICAgICAgbGVuIC09IG47Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLWludCBNdHBGZnNIYW5kbGU6OnNwbGljZVJlYWRIYW5kbGUoaW50IGZkLCBpbnQgcGlwZV9vdXQsIGludCBsZW4pIHsKLSAgICBMT0coVkVSQk9TRSkgPDwgIk1UUCBhYm91dCB0byBzcGxpY2UgcmVhZCBmZCA9ICIgPDwgZmQgPDwgIiwgbGVuPSIgPDwgbGVuOwotICAgIGludCByZXQgPSAwOwotICAgIGxvZmZfdCBkdW1teW9mZjsKLSAgICB3aGlsZSAobGVuID4gMCkgewotICAgICAgICBpbnQgcmVhZF9sZW4gPSBzdGQ6Om1pbihtTWF4UmVhZCwgbGVuKTsKLSAgICAgICAgZHVtbXlvZmYgPSAwOwotICAgICAgICBpbnQgbiA9IFRFTVBfRkFJTFVSRV9SRVRSWShzcGxpY2UoZmQsICZkdW1teW9mZiwgcGlwZV9vdXQsIG51bGxwdHIsIHJlYWRfbGVuLCAwKSk7Ci0gICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgInNwbGljZSByZWFkIEVSUk9SOiBmZCA9ICIgPDwgZmQgPDwgIiwgbiA9ICIgPDwgbjsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXQgKz0gbjsKLSAgICAgICAgaWYgKG4gPCByZWFkX2xlbikgLy8gZG9uZSByZWFkaW5nIGVhcmx5Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgbGVuIC09IG47Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLWludCBNdHBGZnNIYW5kbGU6OnJlYWQodm9pZCogZGF0YSwgaW50IGxlbikgewotICAgIHJldHVybiByZWFkSGFuZGxlKG1CdWxrT3V0LCBkYXRhLCBsZW4pOwotfQotCi1pbnQgTXRwRmZzSGFuZGxlOjp3cml0ZShjb25zdCB2b2lkKiBkYXRhLCBpbnQgbGVuKSB7Ci0gICAgcmV0dXJuIHdyaXRlSGFuZGxlKG1CdWxrSW4sIGRhdGEsIGxlbik7Ci19Ci0KLWludCBNdHBGZnNIYW5kbGU6OnN0YXJ0KCkgewotICAgIG1Mb2NrLmxvY2soKTsKLQotICAgIG1CdWxrSW4ucmVzZXQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oRkZTX01UUF9FUF9JTiwgT19SRFdSKSkpOwotICAgIGlmIChtQnVsa0luIDwgMCkgewotICAgICAgICBQTE9HKEVSUk9SKSA8PCBGRlNfTVRQX0VQX0lOIDw8ICI6IGNhbm5vdCBvcGVuIGJ1bGsgaW4gZXAiOworICAgIG1lbXNldCgmbUN0eCwgMCwgc2l6ZW9mKG1DdHgpKTsKKyAgICBpZiAoaW9fc2V0dXAoQUlPX0JVRlNfTUFYLCAmbUN0eCkgPCAwKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJ1bmFibGUgdG8gc2V0dXAgYWlvIjsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KKyAgICBtRXZlbnRGZC5yZXNldChldmVudGZkKDAsIEVGRF9OT05CTE9DSykpOworICAgIG1Qb2xsRmRzWzBdLmZkID0gbUNvbnRyb2w7CisgICAgbVBvbGxGZHNbMF0uZXZlbnRzID0gUE9MTElOOworICAgIG1Qb2xsRmRzWzFdLmZkID0gbUV2ZW50RmQ7CisgICAgbVBvbGxGZHNbMV0uZXZlbnRzID0gUE9MTElOOwogCi0gICAgbUJ1bGtPdXQucmVzZXQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oRkZTX01UUF9FUF9PVVQsIE9fUkRXUikpKTsKLSAgICBpZiAobUJ1bGtPdXQgPCAwKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8IEZGU19NVFBfRVBfT1VUIDw8ICI6IGNhbm5vdCBvcGVuIGJ1bGsgb3V0IGVwIjsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIG1JbnRyLnJlc2V0KFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKEZGU19NVFBfRVBfSU5UUiwgT19SRFdSKSkpOwotICAgIGlmIChtSW50ciA8IDApIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgRkZTX01UUF9FUDAgPDwgIjogY2Fubm90IG9wZW4gaW50ciBlcCI7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBtQnVmZmVyMS5yZXNpemUoTUFYX0ZJTEVfQ0hVTktfU0laRSk7Ci0gICAgbUJ1ZmZlcjIucmVzaXplKE1BWF9GSUxFX0NIVU5LX1NJWkUpOwotICAgIHBvc2l4X21hZHZpc2UobUJ1ZmZlcjEuZGF0YSgpLCBNQVhfRklMRV9DSFVOS19TSVpFLAotICAgICAgICAgICAgUE9TSVhfTUFEVl9TRVFVRU5USUFMIHwgUE9TSVhfTUFEVl9XSUxMTkVFRCk7Ci0gICAgcG9zaXhfbWFkdmlzZShtQnVmZmVyMi5kYXRhKCksIE1BWF9GSUxFX0NIVU5LX1NJWkUsCi0gICAgICAgICAgICBQT1NJWF9NQURWX1NFUVVFTlRJQUwgfCBQT1NJWF9NQURWX1dJTExORUVEKTsKLQotICAgIC8vIEhhbmRsZSBjb250cm9sIHJlcXVlc3RzLgotICAgIHN0ZDo6dGhyZWFkIHQoW3RoaXNdKCkgeyB0aGlzLT5jb250cm9sTG9vcCgpOyB9KTsKLSAgICB0LmRldGFjaCgpOwotCi0gICAgLy8gR2V0IGRldmljZSBzcGVjaWZpYyByL3cgc2l6ZQotICAgIG1NYXhXcml0ZSA9IGFuZHJvaWQ6OmJhc2U6OkdldEludFByb3BlcnR5KCJzeXMudXNiLmZmcy5tYXhfd3JpdGUiLCBVU0JfRkZTX01BWF9XUklURSk7Ci0gICAgbU1heFJlYWQgPSBhbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eSgic3lzLnVzYi5mZnMubWF4X3JlYWQiLCBVU0JfRkZTX01BWF9SRUFEKTsKLQotICAgIHNpemVfdCBhdHRlbXB0cyA9IDA7Ci0gICAgd2hpbGUgKG1NYXhXcml0ZSA+PSBVU0JfRkZTX01BWF9XUklURSAmJiBtTWF4UmVhZCA+PSBVU0JfRkZTX01BWF9SRUFEICYmCi0gICAgICAgICAgICBhdHRlbXB0cyA8IEVORFBPSU5UX0FMTE9DX1JFVFJJRVMpIHsKLSAgICAgICAgLy8gSWYgbGFyZ2VyIGNvbnRpZ3VvdXMgY2h1bmtzIG9mIG1lbW9yeSBhcmVuJ3QgYXZhaWxhYmxlLCBhdHRlbXB0IHRvIHRyeQotICAgICAgICAvLyBzbWFsbGVyIGFsbG9jYXRpb25zLgotICAgICAgICBpZiAoaW9jdGwobUJ1bGtJbiwgRlVOQ1RJT05GU19FTkRQT0lOVF9BTExPQywgc3RhdGljX2Nhc3Q8X191MzI+KG1NYXhXcml0ZSkpIHx8Ci0gICAgICAgICAgICBpb2N0bChtQnVsa091dCwgRlVOQ1RJT05GU19FTkRQT0lOVF9BTExPQywgc3RhdGljX2Nhc3Q8X191MzI+KG1NYXhSZWFkKSkpIHsKLSAgICAgICAgICAgIGlmIChlcnJubyA9PSBFTk9ERVYpIHsKLSAgICAgICAgICAgICAgICAvLyBEcml2ZXIgaGFzbid0IGVuYWJsZWQgZW5kcG9pbnRzIHlldC4KLSAgICAgICAgICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDApKTsKLSAgICAgICAgICAgICAgICBhdHRlbXB0cyArPSAxOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU1heFdyaXRlIC89IDI7Ci0gICAgICAgICAgICBtTWF4UmVhZCAvPTI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLyBUcnkgdG8gc3RhcnQgTXRwU2VydmVyIGFueXdheSwgd2l0aCB0aGUgc21hbGxlc3QgbWF4IHIvdyB2YWx1ZXMKLSAgICBQTE9HKEVSUk9SKSA8PCAiRnVuY3Rpb25mcyBjb3VsZCBub3QgYWxsb2NhdGUgYW55IG1lbW9yeSEiOworICAgIG1DYW5jZWxlZCA9IGZhbHNlOwogICAgIHJldHVybiAwOwogfQogCi1pbnQgTXRwRmZzSGFuZGxlOjpjb25maWd1cmUoYm9vbCB1c2VQdHApIHsKLSAgICAvLyBXYWl0IHRpbGwgcHJldmlvdXMgc2VydmVyIGludm9jYXRpb24gaGFzIGNsb3NlZAotICAgIGlmICghbUxvY2sudHJ5X2xvY2tfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMzAwKSkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiTXRwU2VydmVyIHdhcyB1bmFibGUgdG8gZ2V0IGNvbmZpZ3VyZSBsb2NrIjsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpbnQgcmV0ID0gMDsKLQotICAgIC8vIElmIHB0cCBpcyBjaGFuZ2VkLCB0aGUgY29uZmlndXJhdGlvbiBtdXN0IGJlIHJld3JpdHRlbgotICAgIGlmIChtUHRwICE9IHVzZVB0cCkgewotICAgICAgICBjbG9zZUVuZHBvaW50cygpOwotICAgICAgICBjbG9zZUNvbmZpZygpOwotICAgIH0KLSAgICBtUHRwID0gdXNlUHRwOwotCi0gICAgaWYgKCFpbml0RnVuY3Rpb25mcygpKSB7Ci0gICAgICAgIHJldCA9IC0xOwotICAgIH0KLSAgICBtTG9jay51bmxvY2soKTsKLSAgICByZXR1cm4gcmV0OwotfQotCiB2b2lkIE10cEZmc0hhbmRsZTo6Y2xvc2UoKSB7CisgICAgaW9fZGVzdHJveShtQ3R4KTsKICAgICBjbG9zZUVuZHBvaW50cygpOwotICAgIG1Mb2NrLnVubG9jaygpOworICAgIGNsb3NlQ29uZmlnKCk7CiB9CiAKLS8qIFJlYWQgZnJvbSBVU0IgYW5kIHdyaXRlIHRvIGEgbG9jYWwgZmlsZS4gKi8KLWludCBNdHBGZnNIYW5kbGU6OnJlY2VpdmVGaWxlKG10cF9maWxlX3JhbmdlIG1mciwgYm9vbCB6ZXJvX3BhY2tldCkgewotICAgIC8vIFdoZW4gcmVjZWl2aW5nIGZpbGVzLCB0aGUgaW5jb21pbmcgbGVuZ3RoIGlzIGdpdmVuIGluIDMyIGJpdHMuCi0gICAgLy8gQSA+NEcgZmlsZSBpcyBnaXZlbiBhcyAweEZGRkZGRkZGCi0gICAgdWludDMyX3QgZmlsZV9sZW5ndGggPSBtZnIubGVuZ3RoOwotICAgIHVpbnQ2NF90IG9mZnNldCA9IG1mci5vZmZzZXQ7Ci0gICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yIG1CdWxrT3V0X2Rlc2M7Ci0gICAgaW50IHBhY2tldF9zaXplOworaW50IE10cEZmc0hhbmRsZTo6d2FpdEV2ZW50cyhzdHJ1Y3QgaW9fYnVmZmVyICpidWYsIGludCBtaW5fZXZlbnRzLCBzdHJ1Y3QgaW9fZXZlbnQgKmV2ZW50cywKKyAgICAgICAgaW50ICpjb3VudGVyKSB7CisgICAgaW50IG51bV9ldmVudHMgPSAwOworICAgIGludCByZXQgPSAwOworICAgIGludCBlcnJvciA9IDA7CiAKLSAgICBpZiAoaW9jdGwobUJ1bGtPdXQsIEZVTkNUSU9ORlNfRU5EUE9JTlRfREVTQywgcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBsb25nPigmbUJ1bGtPdXRfZGVzYykpKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgZ2V0IEZGUyBidWxrLW91dCBkZXNjcmlwdG9yIjsKLSAgICAgICAgcGFja2V0X3NpemUgPSBNQVhfUEFDS0VUX1NJWkVfSFM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcGFja2V0X3NpemUgPSBtQnVsa091dF9kZXNjLndNYXhQYWNrZXRTaXplOworICAgIHdoaWxlIChudW1fZXZlbnRzIDwgbWluX2V2ZW50cykgeworICAgICAgICBpZiAocG9sbChtUG9sbEZkcywgMiwgMCkgPT0gLTEpIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJNdHAgZXJyb3IgZHVyaW5nIHBvbGwoKSI7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Qb2xsRmRzWzBdLnJldmVudHMgJiBQT0xMSU4pIHsKKyAgICAgICAgICAgIG1Qb2xsRmRzWzBdLnJldmVudHMgPSAwOworICAgICAgICAgICAgaWYgKGhhbmRsZUV2ZW50KCkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBlcnJvciA9IGVycm5vOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtUG9sbEZkc1sxXS5yZXZlbnRzICYgUE9MTElOKSB7CisgICAgICAgICAgICBtUG9sbEZkc1sxXS5yZXZlbnRzID0gMDsKKyAgICAgICAgICAgIHVpbnQ2NF90IGV2X2NudCA9IDA7CisKKyAgICAgICAgICAgIGlmICg6OnJlYWQobUV2ZW50RmQsICZldl9jbnQsIHNpemVvZihldl9jbnQpKSA9PSAtMSkgeworICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJNdHAgdW5hYmxlIHRvIHJlYWQgZXZlbnRmZCI7CisgICAgICAgICAgICAgICAgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IGlvX2dldGV2ZW50cyB3aWxsIHJldHVybiBtb3JlIGV2ZW50cyB0aGFuIHRoZSBldmVudEZkIHJlcG9ydGVkLAorICAgICAgICAgICAgLy8gc2luY2UgZXZlbnRzIG1heSBhcHBlYXIgaW4gdGhlIHRpbWUgYmV0d2VlbiB0aGUgY2FsbHMuIEluIHRoaXMgY2FzZSwgdGhlIGV2ZW50RmQgd2lsbAorICAgICAgICAgICAgLy8gc2hvdyB1cCBhcyByZWFkYWJsZSBuZXh0IGl0ZXJhdGlvbiwgYnV0IHRoZXJlIHdpbGwgYmUgZmV3ZXIgb3Igbm8gZXZlbnRzIHRvIGFjdHVhbGx5CisgICAgICAgICAgICAvLyB3YWl0IGZvci4gVGh1cyB3ZSBuZXZlciB3YW50IGlvX2dldGV2ZW50cyB0byBibG9jay4KKyAgICAgICAgICAgIGludCB0aGlzX2V2ZW50cyA9IFRFTVBfRkFJTFVSRV9SRVRSWShpb19nZXRldmVudHMobUN0eCwgMCwgQUlPX0JVRlNfTUFYLCBldmVudHMsICZaRVJPX1RJTUVPVVQpKTsKKyAgICAgICAgICAgIGlmICh0aGlzX2V2ZW50cyA9PSAtMSkgeworICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJNdHAgZXJyb3IgZ2V0dGluZyBldmVudHMiOworICAgICAgICAgICAgICAgIGVycm9yID0gZXJybm87CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBBZGQgdXAgdGhlIHRvdGFsIGFtb3VudCBvZiBkYXRhIGFuZCBmaW5kIGVycm9ycyBvbiB0aGUgd2F5LgorICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IHN0YXRpY19jYXN0PHVuc2lnbmVkPih0aGlzX2V2ZW50cyk7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChldmVudHNbal0ucmVzIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBlcnJubyA9IC1ldmVudHNbal0ucmVzOworICAgICAgICAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiTXRwIGdvdCBlcnJvciBldmVudCBhdCAiIDw8IGogPDwgIiBhbmQgIiA8PCBidWYtPmFjdHVhbCA8PCAiIHRvdGFsIjsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0ICs9IGV2ZW50c1tqXS5yZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBudW1fZXZlbnRzICs9IHRoaXNfZXZlbnRzOworICAgICAgICAgICAgaWYgKGNvdW50ZXIpCisgICAgICAgICAgICAgICAgKmNvdW50ZXIgKz0gdGhpc19ldmVudHM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICAgICBlcnJubyA9IGVycm9yOworICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIE10cEZmc0hhbmRsZTo6Y2FuY2VsVHJhbnNhY3Rpb24oKSB7CisgICAgLy8gRGV2aWNlIGNhbmNlbHMgYnkgc3RhbGxpbmcgYm90aCBidWxrIGVuZHBvaW50cy4KKyAgICBpZiAoOjpyZWFkKG1CdWxrSW4sIG51bGxwdHIsIDApICE9IC0xIHx8IGVycm5vICE9IEVCQURNU0cpCisgICAgICAgIFBMT0coRVJST1IpIDw8ICJNdHAgc3RhbGwgZmFpbGVkIG9uIGJ1bGsgaW4iOworICAgIGlmICg6OndyaXRlKG1CdWxrT3V0LCBudWxscHRyLCAwKSAhPSAtMSB8fCBlcnJubyAhPSBFQkFETVNHKQorICAgICAgICBQTE9HKEVSUk9SKSA8PCAiTXRwIHN0YWxsIGZhaWxlZCBvbiBidWxrIG91dCI7CisgICAgbUNhbmNlbGVkID0gdHJ1ZTsKKyAgICBlcnJubyA9IEVDQU5DRUxFRDsKK30KKworaW50IE10cEZmc0hhbmRsZTo6Y2FuY2VsRXZlbnRzKHN0cnVjdCBpb2NiICoqaW9jYiwgc3RydWN0IGlvX2V2ZW50ICpldmVudHMsIHVuc2lnbmVkIHN0YXJ0LAorICAgICAgICB1bnNpZ25lZCBlbmQpIHsKKyAgICAvLyBTb21lIG1hbnBhZ2VzIGZvciBpb19jYW5jZWwgYXJlIG91dCBvZiBkYXRlIGFuZCBpbmNvcnJlY3QuCisgICAgLy8gaW9fY2FuY2VsIHdpbGwgcmV0dXJuIC1FSU5QUk9HUkVTUyBvbiBzdWNjZXNzIGFuZCBkb2VzCisgICAgLy8gbm90IHBsYWNlIHRoZSBldmVudCBpbiB0aGUgZ2l2ZW4gbWVtb3J5LiBXZSBoYXZlIHRvIHVzZQorICAgIC8vIGlvX2dldGV2ZW50cyB0byB3YWl0IGZvciBhbGwgdGhlIGV2ZW50cyB3ZSBjYW5jZWxsZWQuCisgICAgaW50IHJldCA9IDA7CisgICAgdW5zaWduZWQgbnVtX2V2ZW50cyA9IDA7CisgICAgaW50IHNhdmVfZXJybm8gPSBlcnJubzsKKyAgICBlcnJubyA9IDA7CisKKyAgICBmb3IgKHVuc2lnbmVkIGogPSBzdGFydDsgaiA8IGVuZDsgaisrKSB7CisgICAgICAgIGlmIChpb19jYW5jZWwobUN0eCwgaW9jYltqXSwgbnVsbHB0cikgIT0gLTEgfHwgZXJybm8gIT0gRUlOUFJPR1JFU1MpIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJNdHAgY291bGRuJ3QgY2FuY2VsIHJlcXVlc3QgIiA8PCBqOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbnVtX2V2ZW50cysrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChudW1fZXZlbnRzICE9IGVuZCAtIHN0YXJ0KSB7CisgICAgICAgIHJldCA9IC0xOworICAgICAgICBlcnJubyA9IEVJTzsKKyAgICB9CisgICAgaW50IGV2cyA9IFRFTVBfRkFJTFVSRV9SRVRSWShpb19nZXRldmVudHMobUN0eCwgbnVtX2V2ZW50cywgQUlPX0JVRlNfTUFYLCBldmVudHMsIG51bGxwdHIpKTsKKyAgICBpZiAoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGV2cykgIT0gbnVtX2V2ZW50cykgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiTXRwIGNvdWxkbid0IGNhbmNlbCBhbGwgcmVxdWVzdHMsIGdvdCAiIDw8IGV2czsKKyAgICAgICAgcmV0ID0gLTE7CiAgICAgfQogCi0gICAgY2hhciAqZGF0YSA9IG1CdWZmZXIxLmRhdGEoKTsKLSAgICBjaGFyICpkYXRhMiA9IG1CdWZmZXIyLmRhdGEoKTsKKyAgICB1aW50NjRfdCBldl9jbnQgPSAwOworICAgIGlmIChudW1fZXZlbnRzICYmIDo6cmVhZChtRXZlbnRGZCwgJmV2X2NudCwgc2l6ZW9mKGV2X2NudCkpID09IC0xKQorICAgICAgICBQTE9HKEVSUk9SKSA8PCAiTXRwIFVuYWJsZSB0byByZWFkIGV2ZW50IGZkIjsKKworICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICAvLyBSZXN0b3JlIGVycm5vIHNpbmNlIGl0IHByb2JhYmx5IGdvdCBvdmVycmlkZW4gd2l0aCBFSU5QUk9HUkVTUy4KKyAgICAgICAgZXJybm8gPSBzYXZlX2Vycm5vOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgTXRwRmZzSGFuZGxlOjppb2J1ZlN1Ym1pdChzdHJ1Y3QgaW9fYnVmZmVyICpidWYsIGludCBmZCwgdW5zaWduZWQgbGVuZ3RoLCBib29sIHJlYWQpIHsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBidWYtPmFjdHVhbCA9IEFJT19CVUZTX01BWDsKKyAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgQUlPX0JVRlNfTUFYOyBqKyspIHsKKyAgICAgICAgdW5zaWduZWQgcnFfbGVuZ3RoID0gc3RkOjptaW4oQUlPX0JVRl9MRU4sIGxlbmd0aCAtIEFJT19CVUZfTEVOICogaik7CisgICAgICAgIGlvX3ByZXAoYnVmLT5pb2NiW2pdLCBmZCwgYnVmLT5idWZbal0sIHJxX2xlbmd0aCwgMCwgcmVhZCk7CisgICAgICAgIGJ1Zi0+aW9jYltqXS0+YWlvX2ZsYWdzIHw9IElPQ0JfRkxBR19SRVNGRDsKKyAgICAgICAgYnVmLT5pb2NiW2pdLT5haW9fcmVzZmQgPSBtRXZlbnRGZDsKKworICAgICAgICAvLyBOb3QgZW5vdWdoIGRhdGEsIHNvIHRhYmxlIGlzIHRydW5jYXRlZC4KKyAgICAgICAgaWYgKHJxX2xlbmd0aCA8IEFJT19CVUZfTEVOIHx8IGxlbmd0aCA9PSBBSU9fQlVGX0xFTiAqIChqICsgMSkpIHsKKyAgICAgICAgICAgIGJ1Zi0+YWN0dWFsID0gaiArIDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldCA9IGlvX3N1Ym1pdChtQ3R4LCBidWYtPmFjdHVhbCwgYnVmLT5pb2NiLmRhdGEoKSk7CisgICAgaWYgKHJldCAhPSBzdGF0aWNfY2FzdDxpbnQ+KGJ1Zi0+YWN0dWFsKSkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiTXRwIGlvX3N1Ym1pdCBnb3QgIiA8PCByZXQgPDwgIiBleHBlY3RlZCAiIDw8IGJ1Zi0+YWN0dWFsOworICAgICAgICBpZiAocmV0ICE9IC0xKSB7CisgICAgICAgICAgICBlcnJubyA9IEVJTzsKKyAgICAgICAgfQorICAgICAgICByZXQgPSAtMTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IE10cEZmc0hhbmRsZTo6cmVjZWl2ZUZpbGUobXRwX2ZpbGVfcmFuZ2UgbWZyLCBib29sIHplcm9fcGFja2V0KSB7CisgICAgLy8gV2hlbiByZWNlaXZpbmcgZmlsZXMsIHRoZSBpbmNvbWluZyBsZW5ndGggaXMgZ2l2ZW4gaW4gMzIgYml0cy4KKyAgICAvLyBBID49NEcgZmlsZSBpcyBnaXZlbiBhcyAweEZGRkZGRkZGCisgICAgdWludDMyX3QgZmlsZV9sZW5ndGggPSBtZnIubGVuZ3RoOworICAgIHVpbnQ2NF90IG9mZnNldCA9IG1mci5vZmZzZXQ7CiAKICAgICBzdHJ1Y3QgYWlvY2IgYWlvOwogICAgIGFpby5haW9fZmlsZGVzID0gbWZyLmZkOwogICAgIGFpby5haW9fYnVmID0gbnVsbHB0cjsKICAgICBzdHJ1Y3QgYWlvY2IgKmFpb2xbXSA9IHsmYWlvfTsKLSAgICBpbnQgcmV0ID0gLTE7Ci0gICAgc2l6ZV90IGxlbmd0aDsKLSAgICBib29sIHJlYWQgPSBmYWxzZTsKLSAgICBib29sIHdyaXRlID0gZmFsc2U7Ci0gICAgYm9vbCBzaG9ydF9wYWNrZXQgPSBmYWxzZTsKIAotICAgIHBvc2l4X2ZhZHZpc2UobWZyLmZkLCAwLCAwLCBQT1NJWF9GQURWX1NFUVVFTlRJQUwgfCBQT1NJWF9GQURWX05PUkVVU0UpOworICAgIGludCByZXQgPSAtMTsKKyAgICB1bnNpZ25lZCBpID0gMDsKKyAgICBzaXplX3QgbGVuZ3RoOworICAgIHN0cnVjdCBpb19ldmVudCBpb2V2c1tBSU9fQlVGU19NQVhdOworICAgIGJvb2wgaGFzX3dyaXRlID0gZmFsc2U7CisgICAgYm9vbCBlcnJvciA9IGZhbHNlOworICAgIGJvb2wgd3JpdGVfZXJyb3IgPSBmYWxzZTsKKyAgICBpbnQgcGFja2V0X3NpemUgPSBnZXRQYWNrZXRTaXplKG1CdWxrT3V0KTsKKyAgICBib29sIHNob3J0X3BhY2tldCA9IGZhbHNlOworICAgIGFkdmlzZShtZnIuZmQpOwogCiAgICAgLy8gQnJlYWsgZG93biB0aGUgZmlsZSBpbnRvIHBpZWNlcyB0aGF0IGZpdCBpbiBidWZmZXJzCi0gICAgd2hpbGUgKGZpbGVfbGVuZ3RoID4gMCB8fCB3cml0ZSkgeworICAgIHdoaWxlIChmaWxlX2xlbmd0aCA+IDAgfHwgaGFzX3dyaXRlKSB7CisgICAgICAgIC8vIFF1ZXVlIGFuIGFzeW5jaHJvbm91cyByZWFkIGZyb20gVVNCLgogICAgICAgICBpZiAoZmlsZV9sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICBsZW5ndGggPSBzdGQ6Om1pbihzdGF0aWNfY2FzdDx1aW50MzJfdD4oTUFYX0ZJTEVfQ0hVTktfU0laRSksIGZpbGVfbGVuZ3RoKTsKLQotICAgICAgICAgICAgLy8gUmVhZCBkYXRhIGZyb20gVVNCLCBoYW5kbGUgZXJyb3JzIGFmdGVyIHdhaXRpbmcgZm9yIHdyaXRlIHRocmVhZC4KLSAgICAgICAgICAgIHJldCA9IHJlYWRIYW5kbGUobUJ1bGtPdXQsIGRhdGEsIGxlbmd0aCk7Ci0KLSAgICAgICAgICAgIGlmIChmaWxlX2xlbmd0aCAhPSBNQVhfTVRQX0ZJTEVfU0laRSAmJiByZXQgPCBzdGF0aWNfY2FzdDxpbnQ+KGxlbmd0aCkpIHsKLSAgICAgICAgICAgICAgICByZXQgPSAtMTsKLSAgICAgICAgICAgICAgICBlcnJubyA9IEVJTzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlYWQgPSB0cnVlOworICAgICAgICAgICAgaWYgKGlvYnVmU3VibWl0KCZtSW9idWZbaV0sIG1CdWxrT3V0LCBsZW5ndGgsIHRydWUpID09IC0xKQorICAgICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh3cml0ZSkgewotICAgICAgICAgICAgLy8gZ2V0IHRoZSByZXR1cm4gc3RhdHVzIG9mIHRoZSBsYXN0IHdyaXRlIHJlcXVlc3QKKyAgICAgICAgLy8gR2V0IHRoZSByZXR1cm4gc3RhdHVzIG9mIHRoZSBsYXN0IHdyaXRlIHJlcXVlc3QuCisgICAgICAgIGlmIChoYXNfd3JpdGUpIHsKICAgICAgICAgICAgIGFpb19zdXNwZW5kKGFpb2wsIDEsIG51bGxwdHIpOwotCiAgICAgICAgICAgICBpbnQgd3JpdHRlbiA9IGFpb19yZXR1cm4oJmFpbyk7Ci0gICAgICAgICAgICBpZiAod3JpdHRlbiA9PSAtMSkgewotICAgICAgICAgICAgICAgIGVycm5vID0gYWlvX2Vycm9yKCZhaW8pOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KHdyaXR0ZW4pIDwgYWlvLmFpb19uYnl0ZXMpIHsKLSAgICAgICAgICAgICAgICBlcnJubyA9IEVJTzsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgZXJybm8gPSB3cml0dGVuID09IC0xID8gYWlvX2Vycm9yKCZhaW8pIDogRUlPOworICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJNdHAgZXJyb3Igd3JpdGluZyB0byBkaXNrIjsKKyAgICAgICAgICAgICAgICB3cml0ZV9lcnJvciA9IHRydWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB3cml0ZSA9IGZhbHNlOworICAgICAgICAgICAgaGFzX3dyaXRlID0gZmFsc2U7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyBhYm92ZQotICAgICAgICBpZiAocmV0ID09IC0xKSB7CisgICAgICAgIGlmIChlcnJvcikgewogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHJlYWQpIHsKKyAgICAgICAgLy8gR2V0IHRoZSByZXN1bHQgb2YgdGhlIHJlYWQgcmVxdWVzdCwgYW5kIHF1ZXVlIGEgd3JpdGUgdG8gZGlzay4KKyAgICAgICAgaWYgKGZpbGVfbGVuZ3RoID4gMCkgeworICAgICAgICAgICAgdW5zaWduZWQgbnVtX2V2ZW50cyA9IDA7CisgICAgICAgICAgICByZXQgPSAwOworICAgICAgICAgICAgdW5zaWduZWQgc2hvcnRfaSA9IG1Jb2J1ZltpXS5hY3R1YWw7CisgICAgICAgICAgICB3aGlsZSAobnVtX2V2ZW50cyA8IHNob3J0X2kpIHsKKyAgICAgICAgICAgICAgICAvLyBHZXQgYWxsIGV2ZW50cyB1cCB0byB0aGUgc2hvcnQgcmVhZCwgaWYgdGhlcmUgaXMgb25lLgorICAgICAgICAgICAgICAgIC8vIFdlIG11c3Qgd2FpdCBmb3IgZWFjaCBldmVudCBzaW5jZSBkYXRhIHRyYW5zZmVyIGNvdWxkIGVuZCBhdCBhbnkgdGltZS4KKyAgICAgICAgICAgICAgICBpbnQgdGhpc19ldmVudHMgPSAwOworICAgICAgICAgICAgICAgIGludCBldmVudF9yZXQgPSB3YWl0RXZlbnRzKCZtSW9idWZbaV0sIDEsIGlvZXZzLCAmdGhpc19ldmVudHMpOworICAgICAgICAgICAgICAgIG51bV9ldmVudHMgKz0gdGhpc19ldmVudHM7CisKKyAgICAgICAgICAgICAgICBpZiAoZXZlbnRfcmV0ID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbmNlbEV2ZW50cyhtSW9idWZbaV0uaW9jYi5kYXRhKCksIGlvZXZzLCBudW1fZXZlbnRzLCBtSW9idWZbaV0uYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXQgKz0gZXZlbnRfcmV0OworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdGhpc19ldmVudHM7IGorKykgeworICAgICAgICAgICAgICAgICAgICAvLyBzdHJ1Y3QgaW9fZXZlbnQgY29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSBhc3NvY2lhdGVkIHN0cnVjdCBpb2NiIGFzIGEgX191NjQuCisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxfX3U2ND4oaW9ldnNbal0ucmVzKSA8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QgaW9jYio+KGlvZXZzW2pdLm9iaiktPmFpb19uYnl0ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3ZlIGZvdW5kIGEgc2hvcnQgZXZlbnQuIFN0b3JlIHRoZSBpbmRleCBzaW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzIHdvbid0IG5lY2Vzc2FyaWx5IGFycml2ZSBpbiB0aGUgb3JkZXIgdGhleSBhcmUgcXVldWVkLgorICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRfaSA9IChpb2V2c1tqXS5vYmogLSByZWludGVycHJldF9jYXN0PHVpbnQ2NF90PihtSW9idWZbaV0uaW9jYnMuZGF0YSgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIHNpemVvZihzdHJ1Y3QgaW9jYikgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRfcGFja2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaG9ydF9wYWNrZXQpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FuY2VsRXZlbnRzKG1Jb2J1ZltpXS5pb2NiLmRhdGEoKSwgaW9ldnMsIHNob3J0X2ksIG1Jb2J1ZltpXS5hY3R1YWwpKSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlX2Vycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZmlsZV9sZW5ndGggPT0gTUFYX01UUF9GSUxFX1NJWkUpIHsKICAgICAgICAgICAgICAgICAvLyBGb3IgbGFyZ2VyIGZpbGVzLCByZWNlaXZlIHVudGlsIGEgc2hvcnQgcGFja2V0IGlzIHJlY2VpdmVkLgogICAgICAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KHJldCkgPCBsZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgZmlsZV9sZW5ndGggPSAwOwotICAgICAgICAgICAgICAgICAgICBzaG9ydF9wYWNrZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0IDwgc3RhdGljX2Nhc3Q8aW50PihsZW5ndGgpKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgZmlsZSBpcyBsZXNzIHRoYW4gNEcgYW5kIHdlIGdldCBhIHNob3J0IHBhY2tldCwgaXQncyBhbiBlcnJvci4KKyAgICAgICAgICAgICAgICBlcnJubyA9IEVJTzsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJNdHAgZ290IHVuZXhwZWN0ZWQgc2hvcnQgcGFja2V0IjsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFJlY2VpdmUgYW4gZW1wdHkgcGFja2V0IGlmIHNpemUgaXMgYSBtdWx0aXBsZSBvZiB0aGUgZW5kcG9pbnQgc2l6ZS4KICAgICAgICAgICAgICAgICBmaWxlX2xlbmd0aCAtPSByZXQ7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh3cml0ZV9lcnJvcikgeworICAgICAgICAgICAgICAgIGNhbmNlbFRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvLyBFbnF1ZXVlIGEgbmV3IHdyaXRlIHJlcXVlc3QKLSAgICAgICAgICAgIGFpby5haW9fYnVmID0gZGF0YTsKLSAgICAgICAgICAgIGFpby5haW9fc2luayA9IG1mci5mZDsKLSAgICAgICAgICAgIGFpby5haW9fb2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICAgICAgYWlvLmFpb19uYnl0ZXMgPSByZXQ7CisgICAgICAgICAgICBhaW9fcHJlcGFyZSgmYWlvLCBtSW9idWZbaV0uYnVmcy5kYXRhKCksIHJldCwgb2Zmc2V0KTsKICAgICAgICAgICAgIGFpb193cml0ZSgmYWlvKTsKIAogICAgICAgICAgICAgb2Zmc2V0ICs9IHJldDsKLSAgICAgICAgICAgIHN0ZDo6c3dhcChkYXRhLCBkYXRhMik7Ci0KLSAgICAgICAgICAgIHdyaXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIHJlYWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGkgPSAoaSArIDEpICUgTlVNX0lPX0JVRlM7CisgICAgICAgICAgICBoYXNfd3JpdGUgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQogICAgIGlmICgocmV0ICUgcGFja2V0X3NpemUgPT0gMCAmJiAhc2hvcnRfcGFja2V0KSB8fCB6ZXJvX3BhY2tldCkgewotICAgICAgICBpZiAoVEVNUF9GQUlMVVJFX1JFVFJZKDo6cmVhZChtQnVsa091dCwgZGF0YSwgcGFja2V0X3NpemUpKSAhPSAwKSB7CisgICAgICAgIC8vIFJlY2VpdmUgYW4gZW1wdHkgcGFja2V0IGlmIHNpemUgaXMgYSBtdWx0aXBsZSBvZiB0aGUgZW5kcG9pbnQgc2l6ZQorICAgICAgICAvLyBhbmQgd2UgZGlkbid0IGFscmVhZHkgZ2V0IGFuIGVtcHR5IHBhY2tldCBmcm9tIHRoZSBoZWFkZXIgb3IgbGFyZ2UgZmlsZS4KKyAgICAgICAgaWYgKHJlYWQobUlvYnVmWzBdLmJ1ZnMuZGF0YSgpLCBwYWNrZXRfc2l6ZSkgIT0gMCkgewogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiAwOwogfQogCi0vKiBSZWFkIGZyb20gYSBsb2NhbCBmaWxlIGFuZCBzZW5kIG92ZXIgVVNCLiAqLwogaW50IE10cEZmc0hhbmRsZTo6c2VuZEZpbGUobXRwX2ZpbGVfcmFuZ2UgbWZyKSB7CiAgICAgdWludDY0X3QgZmlsZV9sZW5ndGggPSBtZnIubGVuZ3RoOwogICAgIHVpbnQzMl90IGdpdmVuX2xlbmd0aCA9IHN0ZDo6bWluKHN0YXRpY19jYXN0PHVpbnQ2NF90PihNQVhfTVRQX0ZJTEVfU0laRSksCiAgICAgICAgICAgICBmaWxlX2xlbmd0aCArIHNpemVvZihtdHBfZGF0YV9oZWFkZXIpKTsKICAgICB1aW50NjRfdCBvZmZzZXQgPSBtZnIub2Zmc2V0OwotICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBtQnVsa0luX2Rlc2M7Ci0gICAgaW50IHBhY2tldF9zaXplOwotCi0gICAgaWYgKGlvY3RsKG1CdWxrSW4sIEZVTkNUSU9ORlNfRU5EUE9JTlRfREVTQywgcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBsb25nPigmbUJ1bGtJbl9kZXNjKSkpIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBnZXQgRkZTIGJ1bGstaW4gZGVzY3JpcHRvciI7Ci0gICAgICAgIHBhY2tldF9zaXplID0gTUFYX1BBQ0tFVF9TSVpFX0hTOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBhY2tldF9zaXplID0gbUJ1bGtJbl9kZXNjLndNYXhQYWNrZXRTaXplOwotICAgIH0KKyAgICBpbnQgcGFja2V0X3NpemUgPSBnZXRQYWNrZXRTaXplKG1CdWxrSW4pOwogCiAgICAgLy8gSWYgZmlsZV9sZW5ndGggaXMgbGFyZ2VyIHRoYW4gYSBzaXplX3QsIHRydW5jYXRpbmcgd291bGQgcHJvZHVjZSB0aGUgd3JvbmcgY29tcGFyaXNvbi4KICAgICAvLyBJbnN0ZWFkLCBwcm9tb3RlIHRoZSBsZWZ0IHNpZGUgdG8gNjQgYml0cywgdGhlbiB0cnVuY2F0ZSB0aGUgc21hbGwgcmVzdWx0LgogICAgIGludCBpbml0X3JlYWRfbGVuID0gc3RkOjptaW4oCiAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocGFja2V0X3NpemUgLSBzaXplb2YobXRwX2RhdGFfaGVhZGVyKSksIGZpbGVfbGVuZ3RoKTsKIAotICAgIGNoYXIgKmRhdGEgPSBtQnVmZmVyMS5kYXRhKCk7Ci0gICAgY2hhciAqZGF0YTIgPSBtQnVmZmVyMi5kYXRhKCk7Ci0KLSAgICBwb3NpeF9mYWR2aXNlKG1mci5mZCwgMCwgMCwgUE9TSVhfRkFEVl9TRVFVRU5USUFMIHwgUE9TSVhfRkFEVl9OT1JFVVNFKTsKKyAgICBhZHZpc2UobWZyLmZkKTsKIAogICAgIHN0cnVjdCBhaW9jYiBhaW87CiAgICAgYWlvLmFpb19maWxkZXMgPSBtZnIuZmQ7CiAgICAgc3RydWN0IGFpb2NiICphaW9sW10gPSB7JmFpb307Ci0gICAgaW50IHJldCwgbGVuZ3RoOwotICAgIGludCBlcnJvciA9IDA7Ci0gICAgYm9vbCByZWFkID0gZmFsc2U7Ci0gICAgYm9vbCB3cml0ZSA9IGZhbHNlOworICAgIGludCByZXQgPSAwOworICAgIGludCBsZW5ndGgsIG51bV9yZWFkOworICAgIHVuc2lnbmVkIGkgPSAwOworICAgIHN0cnVjdCBpb19ldmVudCBpb2V2c1tBSU9fQlVGU19NQVhdOworICAgIGJvb2wgZXJyb3IgPSBmYWxzZTsKKyAgICBib29sIGhhc193cml0ZSA9IGZhbHNlOwogCiAgICAgLy8gU2VuZCB0aGUgaGVhZGVyIGRhdGEKLSAgICBtdHBfZGF0YV9oZWFkZXIgKmhlYWRlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8bXRwX2RhdGFfaGVhZGVyKj4oZGF0YSk7Ci0gICAgaGVhZGVyLT5sZW5ndGggPSBfX2NwdV90b19sZTMyKGdpdmVuX2xlbmd0aCk7Ci0gICAgaGVhZGVyLT50eXBlID0gX19jcHVfdG9fbGUxNigyKTsgLyogZGF0YSBwYWNrZXQgKi8KLSAgICBoZWFkZXItPmNvbW1hbmQgPSBfX2NwdV90b19sZTE2KG1mci5jb21tYW5kKTsKLSAgICBoZWFkZXItPnRyYW5zYWN0aW9uX2lkID0gX19jcHVfdG9fbGUzMihtZnIudHJhbnNhY3Rpb25faWQpOworICAgIG10cF9kYXRhX2hlYWRlciAqaGVhZGVyID0gcmVpbnRlcnByZXRfY2FzdDxtdHBfZGF0YV9oZWFkZXIqPihtSW9idWZbMF0uYnVmcy5kYXRhKCkpOworICAgIGhlYWRlci0+bGVuZ3RoID0gaHRvbGUzMihnaXZlbl9sZW5ndGgpOworICAgIGhlYWRlci0+dHlwZSA9IGh0b2xlMTYoMik7IC8vIGRhdGEgcGFja2V0CisgICAgaGVhZGVyLT5jb21tYW5kID0gaHRvbGUxNihtZnIuY29tbWFuZCk7CisgICAgaGVhZGVyLT50cmFuc2FjdGlvbl9pZCA9IGh0b2xlMzIobWZyLnRyYW5zYWN0aW9uX2lkKTsKIAogICAgIC8vIFNvbWUgaG9zdHMgZG9uJ3Qgc3VwcG9ydCBoZWFkZXIvZGF0YSBzZXBhcmF0aW9uIGV2ZW4gdGhvdWdoIE1UUCBhbGxvd3MgaXQKICAgICAvLyBIYW5kbGUgYnkgZmlsbGluZyBmaXJzdCBwYWNrZXQgd2l0aCBpbml0aWFsIGZpbGUgZGF0YQotICAgIGlmIChURU1QX0ZBSUxVUkVfUkVUUlkocHJlYWQobWZyLmZkLCByZWludGVycHJldF9jYXN0PGNoYXIqPihkYXRhKSArCisgICAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWShwcmVhZChtZnIuZmQsIG1Jb2J1ZlswXS5idWZzLmRhdGEoKSArCiAgICAgICAgICAgICAgICAgICAgIHNpemVvZihtdHBfZGF0YV9oZWFkZXIpLCBpbml0X3JlYWRfbGVuLCBvZmZzZXQpKQogICAgICAgICAgICAgIT0gaW5pdF9yZWFkX2xlbikgcmV0dXJuIC0xOwotICAgIGlmICh3cml0ZUhhbmRsZShtQnVsa0luLCBkYXRhLCBzaXplb2YobXRwX2RhdGFfaGVhZGVyKSArIGluaXRfcmVhZF9sZW4pID09IC0xKSByZXR1cm4gLTE7CisgICAgaWYgKHdyaXRlKG1Jb2J1ZlswXS5idWZzLmRhdGEoKSwgc2l6ZW9mKG10cF9kYXRhX2hlYWRlcikgKyBpbml0X3JlYWRfbGVuKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC0xOwogICAgIGZpbGVfbGVuZ3RoIC09IGluaXRfcmVhZF9sZW47CiAgICAgb2Zmc2V0ICs9IGluaXRfcmVhZF9sZW47CiAgICAgcmV0ID0gaW5pdF9yZWFkX2xlbiArIHNpemVvZihtdHBfZGF0YV9oZWFkZXIpOwogCiAgICAgLy8gQnJlYWsgZG93biB0aGUgZmlsZSBpbnRvIHBpZWNlcyB0aGF0IGZpdCBpbiBidWZmZXJzCi0gICAgd2hpbGUoZmlsZV9sZW5ndGggPiAwKSB7Ci0gICAgICAgIGlmIChyZWFkKSB7Ci0gICAgICAgICAgICAvLyBXYWl0IGZvciB0aGUgcHJldmlvdXMgcmVhZCB0byBmaW5pc2gKLSAgICAgICAgICAgIGFpb19zdXNwZW5kKGFpb2wsIDEsIG51bGxwdHIpOwotICAgICAgICAgICAgcmV0ID0gYWlvX3JldHVybigmYWlvKTsKLSAgICAgICAgICAgIGlmIChyZXQgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBlcnJubyA9IGFpb19lcnJvcigmYWlvKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXQpIDwgYWlvLmFpb19uYnl0ZXMpIHsKLSAgICAgICAgICAgICAgICBlcnJubyA9IEVJTzsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbGVfbGVuZ3RoIC09IHJldDsKLSAgICAgICAgICAgIG9mZnNldCArPSByZXQ7Ci0gICAgICAgICAgICBzdGQ6OnN3YXAoZGF0YSwgZGF0YTIpOwotICAgICAgICAgICAgcmVhZCA9IGZhbHNlOwotICAgICAgICAgICAgd3JpdGUgPSB0cnVlOworICAgIHdoaWxlKGZpbGVfbGVuZ3RoID4gMCB8fCBoYXNfd3JpdGUpIHsKKyAgICAgICAgaWYgKGZpbGVfbGVuZ3RoID4gMCkgeworICAgICAgICAgICAgLy8gUXVldWUgdXAgYSByZWFkIGZyb20gZGlzay4KKyAgICAgICAgICAgIGxlbmd0aCA9IHN0ZDo6bWluKHN0YXRpY19jYXN0PHVpbnQ2NF90PihNQVhfRklMRV9DSFVOS19TSVpFKSwgZmlsZV9sZW5ndGgpOworICAgICAgICAgICAgYWlvX3ByZXBhcmUoJmFpbywgbUlvYnVmW2ldLmJ1ZnMuZGF0YSgpLCBsZW5ndGgsIG9mZnNldCk7CisgICAgICAgICAgICBhaW9fcmVhZCgmYWlvKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChlcnJvciA9PSAtMSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoaGFzX3dyaXRlKSB7CisgICAgICAgICAgICAvLyBXYWl0IGZvciB1c2Igd3JpdGUuIENhbmNlbCB1bndyaXR0ZW4gcG9ydGlvbiBpZiB0aGVyZSdzIGFuIGVycm9yLgorICAgICAgICAgICAgaW50IG51bV9ldmVudHMgPSAwOworICAgICAgICAgICAgaWYgKHdhaXRFdmVudHMoJm1Jb2J1ZlsoaS0xKSVOVU1fSU9fQlVGU10sIG1Jb2J1ZlsoaS0xKSVOVU1fSU9fQlVGU10uYWN0dWFsLCBpb2V2cywKKyAgICAgICAgICAgICAgICAgICAgICAgICZudW1fZXZlbnRzKSAhPSByZXQpIHsKKyAgICAgICAgICAgICAgICBlcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgY2FuY2VsRXZlbnRzKG1Jb2J1ZlsoaS0xKSVOVU1fSU9fQlVGU10uaW9jYi5kYXRhKCksIGlvZXZzLCBudW1fZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgbUlvYnVmWyhpLTEpJU5VTV9JT19CVUZTXS5hY3R1YWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGFzX3dyaXRlID0gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZmlsZV9sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBsZW5ndGggPSBzdGQ6Om1pbihzdGF0aWNfY2FzdDx1aW50NjRfdD4oTUFYX0ZJTEVfQ0hVTktfU0laRSksIGZpbGVfbGVuZ3RoKTsKLSAgICAgICAgICAgIC8vIFF1ZXVlIHVwIGFub3RoZXIgcmVhZAotICAgICAgICAgICAgYWlvLmFpb19idWYgPSBkYXRhOwotICAgICAgICAgICAgYWlvLmFpb19vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICAgICAgICBhaW8uYWlvX25ieXRlcyA9IGxlbmd0aDsKLSAgICAgICAgICAgIGFpb19yZWFkKCZhaW8pOwotICAgICAgICAgICAgcmVhZCA9IHRydWU7CisgICAgICAgICAgICAvLyBXYWl0IGZvciB0aGUgcHJldmlvdXMgcmVhZCB0byBmaW5pc2gKKyAgICAgICAgICAgIGFpb19zdXNwZW5kKGFpb2wsIDEsIG51bGxwdHIpOworICAgICAgICAgICAgbnVtX3JlYWQgPSBhaW9fcmV0dXJuKCZhaW8pOworICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PHNpemVfdD4obnVtX3JlYWQpIDwgYWlvLmFpb19uYnl0ZXMpIHsKKyAgICAgICAgICAgICAgICBlcnJubyA9IG51bV9yZWFkID09IC0xID8gYWlvX2Vycm9yKCZhaW8pIDogRUlPOworICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJNdHAgZXJyb3IgcmVhZGluZyBmcm9tIGRpc2siOworICAgICAgICAgICAgICAgIGNhbmNlbFRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaWxlX2xlbmd0aCAtPSBudW1fcmVhZDsKKyAgICAgICAgICAgIG9mZnNldCArPSBudW1fcmVhZDsKKworICAgICAgICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBRdWV1ZSB1cCBhIHdyaXRlIHRvIHVzYi4KKyAgICAgICAgICAgIGlmIChpb2J1ZlN1Ym1pdCgmbUlvYnVmW2ldLCBtQnVsa0luLCBudW1fcmVhZCwgZmFsc2UpID09IC0xKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGFzX3dyaXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldCA9IG51bV9yZWFkOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHdyaXRlKSB7Ci0gICAgICAgICAgICBpZiAod3JpdGVIYW5kbGUobUJ1bGtJbiwgZGF0YTIsIHJldCkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBlcnJvciA9IC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd3JpdGUgPSBmYWxzZTsKLSAgICAgICAgfQorICAgICAgICBpID0gKGkgKyAxKSAlIE5VTV9JT19CVUZTOwogICAgIH0KIAogICAgIGlmIChyZXQgJSBwYWNrZXRfc2l6ZSA9PSAwKSB7CiAgICAgICAgIC8vIElmIHRoZSBsYXN0IHBhY2tldCB3YXNuJ3Qgc2hvcnQsIHNlbmQgYSBmaW5hbCBlbXB0eSBwYWNrZXQKLSAgICAgICAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWSg6OndyaXRlKG1CdWxrSW4sIGRhdGEsIDApKSAhPSAwKSB7CisgICAgICAgIGlmICh3cml0ZShtSW9idWZbMF0uYnVmcy5kYXRhKCksIDApICE9IDApIHsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogICAgIH0KLQogICAgIHJldHVybiAwOwogfQogCkBAIC04NjUsNyArNjU2LDMgQEAKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCi1JTXRwSGFuZGxlICpnZXRfZmZzX2hhbmRsZSgpIHsKLSAgICByZXR1cm4gbmV3IGFuZHJvaWQ6Ok10cEZmc0hhbmRsZSgpOwotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmggYi9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmgKaW5kZXggZGEwY2Q5Zi4uMjRhOGJkNSAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5oCisrKyBiL21lZGlhL210cC9NdHBGZnNIYW5kbGUuaApAQCAtMTgsMzAgKzE4LDQ1IEBACiAjZGVmaW5lIF9NVFBfRkZTX0hBTkRMRV9ICiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CisjaW5jbHVkZSA8bGludXgvYWlvX2FiaS5oPgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKICNpbmNsdWRlIDxJTXRwSGFuZGxlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgTXRwRmZzSGFuZGxlVGVzdDsKK2NvbnN0ZXhwciBpbnQgTlVNX0lPX0JVRlMgPSAyOworCitzdHJ1Y3QgaW9fYnVmZmVyIHsKKyAgICBzdGQ6OnZlY3RvcjxzdHJ1Y3QgaW9jYj4gaW9jYnM7ICAgICAvLyBIb2xkcyBtZW1vcnkgZm9yIGFsbCBpb2Nicy4gTm90IHVzZWQgZGlyZWN0bHkuCisgICAgc3RkOjp2ZWN0b3I8c3RydWN0IGlvY2IqPiBpb2NiOyAgICAgLy8gUG9pbnRlcnMgdG8gaW5kaXZpZHVhbCBpb2NicywgZm9yIHN5c2NhbGxzCisgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4gYnVmczsgICAgLy8gQSBsYXJnZSBidWZmZXIsIHVzZWQgd2l0aCBmaWxlc3lzdGVtIGlvCisgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcio+IGJ1ZjsgICAgLy8gUG9pbnRlcnMgd2l0aGluIHRoZSBsYXJnZXIgYnVmZmVyLCBmb3Igc3lzY2FsbHMKKyAgICB1bnNpZ25lZCBhY3R1YWw7ICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIGJ1ZmZlcnMgc3VibWl0dGVkIGZvciB0aGlzIHJlcXVlc3QKK307CisKK3RlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBNdHBGZnNIYW5kbGVUZXN0OwogCiBjbGFzcyBNdHBGZnNIYW5kbGUgOiBwdWJsaWMgSU10cEhhbmRsZSB7Ci0gICAgZnJpZW5kIGNsYXNzIGFuZHJvaWQ6Ok10cEZmc0hhbmRsZVRlc3Q7Ci1wcml2YXRlOgotICAgIGludCB3cml0ZUhhbmRsZShpbnQgZmQsIGNvbnN0IHZvaWQgKmRhdGEsIGludCBsZW4pOwotICAgIGludCByZWFkSGFuZGxlKGludCBmZCwgdm9pZCAqZGF0YSwgaW50IGxlbik7Ci0gICAgaW50IHNwbGljZVJlYWRIYW5kbGUoaW50IGZkLCBpbnQgZmRfb3V0LCBpbnQgbGVuKTsKLSAgICBib29sIGluaXRGdW5jdGlvbmZzKCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IGZyaWVuZCBjbGFzcyBNdHBGZnNIYW5kbGVUZXN0OworcHJvdGVjdGVkOgogICAgIHZvaWQgY2xvc2VDb25maWcoKTsKICAgICB2b2lkIGNsb3NlRW5kcG9pbnRzKCk7Ci0gICAgdm9pZCBkb1NlbmRFdmVudChtdHBfZXZlbnQgbWUpOwotCi0gICAgdm9pZCBjb250cm9sTG9vcCgpOworICAgIHZvaWQgYWR2aXNlKGludCBmZCk7CisgICAgaW50IGhhbmRsZUNvbnRyb2xSZXF1ZXN0KGNvbnN0IHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKnJlcXVlc3QpOworICAgIGludCBkb0FzeW5jKHZvaWQqIGRhdGEsIHNpemVfdCBsZW4sIGJvb2wgcmVhZCk7CiAgICAgaW50IGhhbmRsZUV2ZW50KCk7Ci0gICAgaW50IGhhbmRsZUNvbnRyb2xSZXF1ZXN0KGNvbnN0IHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKnNldHVwKTsKKyAgICB2b2lkIGNhbmNlbFRyYW5zYWN0aW9uKCk7CisgICAgdm9pZCBkb1NlbmRFdmVudChtdHBfZXZlbnQgbWUpOworICAgIGJvb2wgb3BlbkVuZHBvaW50cyhib29sIHB0cCk7CiAKLSAgICBib29sIG1QdHA7CisgICAgc3RhdGljIGludCBnZXRQYWNrZXRTaXplKGludCBmZnNfZmQpOwogCi0gICAgc3RkOjp0aW1lZF9tdXRleCBtTG9jazsKKyAgICBib29sIG1DYW5jZWxlZDsKIAogICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBtQ29udHJvbDsKICAgICAvLyAiaW4iIGZyb20gdGhlIGhvc3QncyBwZXJzcGVjdGl2ZSA9PiBzaW5rIGZvciBtdHAgc2VydmVyCkBAIC01MCwzMCArNjUsMzcgQEAKICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgbUJ1bGtPdXQ7CiAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIG1JbnRyOwogCi0gICAgaW50IG1NYXhXcml0ZTsKLSAgICBpbnQgbU1heFJlYWQ7CisgICAgYWlvX2NvbnRleHRfdCBtQ3R4OwogCi0gICAgc3RkOjp2ZWN0b3I8Y2hhcj4gbUJ1ZmZlcjE7Ci0gICAgc3RkOjp2ZWN0b3I8Y2hhcj4gbUJ1ZmZlcjI7CisgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIG1FdmVudEZkOworICAgIHN0cnVjdCBwb2xsZmQgbVBvbGxGZHNbMl07CisKKyAgICBzdHJ1Y3QgaW9fYnVmZmVyIG1Jb2J1ZltOVU1fSU9fQlVGU107CisKKyAgICAvLyBTdWJtaXQgYW4gaW8gcmVxdWVzdCBvZiBnaXZlbiBsZW5ndGguIFJldHVybiBhbW91bnQgc3VibWl0dGVkIG9yIC0xLgorICAgIGludCBpb2J1ZlN1Ym1pdChzdHJ1Y3QgaW9fYnVmZmVyICpidWYsIGludCBmZCwgdW5zaWduZWQgbGVuZ3RoLCBib29sIHJlYWQpOworCisgICAgLy8gQ2FuY2VsIHN1Ym1pdHRlZCByZXF1ZXN0cyBmcm9tIHN0YXJ0IHRvIGVuZCBpbiB0aGUgZ2l2ZW4gYXJyYXkuIFJldHVybiAwIG9yIC0xLgorICAgIGludCBjYW5jZWxFdmVudHMoc3RydWN0IGlvY2IgKippb2NiLCBzdHJ1Y3QgaW9fZXZlbnQgKmV2ZW50cywgdW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIGVuZCk7CisKKyAgICAvLyBXYWl0IGZvciBhdCBtaW5pbXVtIHRoZSBnaXZlbiBudW1iZXIgb2YgZXZlbnRzLiBSZXR1cm5zIHRoZSBhbW91bnQgb2YgZGF0YSBpbiB0aGUgcmV0dXJuZWQKKyAgICAvLyBldmVudHMuIEluY3JlbWVudHMgY291bnRlciBieSB0aGUgbnVtYmVyIG9mIGV2ZW50cyByZXR1cm5lZC4KKyAgICBpbnQgd2FpdEV2ZW50cyhzdHJ1Y3QgaW9fYnVmZmVyICpidWYsIGludCBtaW5fZXZlbnRzLCBzdHJ1Y3QgaW9fZXZlbnQgKmV2ZW50cywgaW50ICpjb3VudGVyKTsKIAogcHVibGljOgotICAgIGludCByZWFkKHZvaWQgKmRhdGEsIGludCBsZW4pOwotICAgIGludCB3cml0ZShjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKTsKKyAgICBpbnQgcmVhZCh2b2lkICpkYXRhLCBzaXplX3QgbGVuKSBvdmVycmlkZTsKKyAgICBpbnQgd3JpdGUoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbikgb3ZlcnJpZGU7CiAKLSAgICBpbnQgcmVjZWl2ZUZpbGUobXRwX2ZpbGVfcmFuZ2UgbWZyLCBib29sIHplcm9fcGFja2V0KTsKLSAgICBpbnQgc2VuZEZpbGUobXRwX2ZpbGVfcmFuZ2UgbWZyKTsKLSAgICBpbnQgc2VuZEV2ZW50KG10cF9ldmVudCBtZSk7CisgICAgaW50IHJlY2VpdmVGaWxlKG10cF9maWxlX3JhbmdlIG1mciwgYm9vbCB6ZXJvX3BhY2tldCkgb3ZlcnJpZGU7CisgICAgaW50IHNlbmRGaWxlKG10cF9maWxlX3JhbmdlIG1mcikgb3ZlcnJpZGU7CisgICAgaW50IHNlbmRFdmVudChtdHBfZXZlbnQgbWUpIG92ZXJyaWRlOwogCi0gICAgLyoqCi0gICAgICogT3BlbiBmZnMgZW5kcG9pbnRzIGFuZCBhbGxvY2F0ZSBuZWNlc3Nhcnkga2VybmVsIGFuZCB1c2VyIG1lbW9yeS4KLSAgICAgKiBXaWxsIHNsZWVwIHVudGlsIGVuZHBvaW50cyBhcmUgZW5hYmxlZCwgZm9yIHVwIHRvIDEgc2Vjb25kLgotICAgICAqLwotICAgIGludCBzdGFydCgpOwotICAgIHZvaWQgY2xvc2UoKTsKKyAgICBpbnQgc3RhcnQoYm9vbCBwdHApIG92ZXJyaWRlOworICAgIHZvaWQgY2xvc2UoKSBvdmVycmlkZTsKIAotICAgIGludCBjb25maWd1cmUoYm9vbCBwdHApOworICAgIGJvb2wgd3JpdGVEZXNjcmlwdG9ycyhib29sIHB0cCk7CiAKLSAgICBNdHBGZnNIYW5kbGUoKTsKKyAgICBNdHBGZnNIYW5kbGUoaW50IGNvbnRyb2xGZCk7CiAgICAgfk10cEZmc0hhbmRsZSgpOwogfTsKIApAQCAtOTAsNSArMTEyLDUgQEAKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCi0jZW5kaWYgLy8gX01UUF9GRl9IQU5ETEVfSAorI2VuZGlmIC8vIF9NVFBfRkZTX0hBTkRMRV9ICiAKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBQYWNrZXQuaCBiL21lZGlhL210cC9NdHBQYWNrZXQuaAppbmRleCBkNDdjOTFkLi45ODQyYjI4IDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwUGFja2V0LmgKKysrIGIvbWVkaWEvbXRwL010cFBhY2tldC5oCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAKKyNpbmNsdWRlICJNdHBEZWJ1Zy5oIgogI2luY2x1ZGUgIk10cFR5cGVzLmgiCiAKIHN0cnVjdCB1c2JfZGV2aWNlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFByb3BlcnR5LmNwcCBiL21lZGlhL210cC9NdHBQcm9wZXJ0eS5jcHAKaW5kZXggMDM5ZTRmNS4uNWMwMmEwZCAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFByb3BlcnR5LmNwcAorKysgYi9tZWRpYS9tdHAvTXRwUHJvcGVydHkuY3BwCkBAIC0xOCw2ICsxOCwxMCBAQAogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorCiAjaW5jbHVkZSAiTXRwRGF0YVBhY2tldC5oIgogI2luY2x1ZGUgIk10cERlYnVnLmgiCiAjaW5jbHVkZSAiTXRwUHJvcGVydHkuaCIKQEAgLTMzNiw3ICszNDAsNyBAQAogfQogCiB2b2lkIE10cFByb3BlcnR5OjpwcmludCgpIHsKLSAgICBNdHBTdHJpbmcgYnVmZmVyOworICAgIHN0ZDo6c3RyaW5nIGJ1ZmZlcjsKICAgICBib29sIGRldmljZVByb3AgPSBpc0RldmljZVByb3BlcnR5KCk7CiAgICAgaWYgKGRldmljZVByb3ApCiAgICAgICAgIEFMT0dJKCIgICAgJXMgKCUwNFgpIiwgTXRwRGVidWc6OmdldERldmljZVByb3BDb2RlTmFtZShtQ29kZSksIG1Db2RlKTsKQEAgLTM0NiwxMSArMzUwLDExIEBACiAgICAgQUxPR0koIiAgICB3cml0ZWFibGUgJXMiLCAobVdyaXRlYWJsZSA/ICJ0cnVlIiA6ICJmYWxzZSIpKTsKICAgICBidWZmZXIgPSAiICAgIGRlZmF1bHQgdmFsdWU6ICI7CiAgICAgcHJpbnQobURlZmF1bHRWYWx1ZSwgYnVmZmVyKTsKLSAgICBBTE9HSSgiJXMiLCAoY29uc3QgY2hhciAqKWJ1ZmZlcik7CisgICAgQUxPR0koIiVzIiwgYnVmZmVyLmNfc3RyKCkpOwogICAgIGlmIChkZXZpY2VQcm9wKSB7CiAgICAgICAgIGJ1ZmZlciA9ICIgICAgY3VycmVudCB2YWx1ZTogIjsKICAgICAgICAgcHJpbnQobUN1cnJlbnRWYWx1ZSwgYnVmZmVyKTsKLSAgICAgICAgQUxPR0koIiVzIiwgKGNvbnN0IGNoYXIgKilidWZmZXIpOworICAgICAgICBBTE9HSSgiJXMiLCBidWZmZXIuY19zdHIoKSk7CiAgICAgfQogICAgIHN3aXRjaCAobUZvcm1GbGFnKSB7CiAgICAgICAgIGNhc2Uga0Zvcm1Ob25lOgpAQCAtMzYzLDcgKzM2Nyw3IEBACiAgICAgICAgICAgICBidWZmZXIgKz0gIiwgIjsKICAgICAgICAgICAgIHByaW50KG1TdGVwU2l6ZSwgYnVmZmVyKTsKICAgICAgICAgICAgIGJ1ZmZlciArPSAiKSI7Ci0gICAgICAgICAgICBBTE9HSSgiJXMiLCAoY29uc3QgY2hhciAqKWJ1ZmZlcik7CisgICAgICAgICAgICBBTE9HSSgiJXMiLCBidWZmZXIuY19zdHIoKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBrRm9ybUVudW06CiAgICAgICAgICAgICBidWZmZXIgPSAiICAgIEVudW0geyAiOwpAQCAtMzcyLDcgKzM3Niw3IEBACiAgICAgICAgICAgICAgICAgYnVmZmVyICs9ICIgIjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJ1ZmZlciArPSAifSI7Ci0gICAgICAgICAgICBBTE9HSSgiJXMiLCAoY29uc3QgY2hhciAqKWJ1ZmZlcik7CisgICAgICAgICAgICBBTE9HSSgiJXMiLCBidWZmZXIuY19zdHIoKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBrRm9ybURhdGVUaW1lOgogICAgICAgICAgICAgQUxPR0koIiAgICBEYXRlVGltZVxuIik7CkBAIC0zODMsNDIgKzM4Nyw0NyBAQAogICAgIH0KIH0KIAotdm9pZCBNdHBQcm9wZXJ0eTo6cHJpbnQoTXRwUHJvcGVydHlWYWx1ZSYgdmFsdWUsIE10cFN0cmluZyYgYnVmZmVyKSB7Cit2b2lkIE10cFByb3BlcnR5OjpwcmludChNdHBQcm9wZXJ0eVZhbHVlJiB2YWx1ZSwgc3RkOjpzdHJpbmcmIGJ1ZmZlcikgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzOwogICAgIHN3aXRjaCAobVR5cGUpIHsKICAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ4OgotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZEZvcm1hdCgiJWQiLCB2YWx1ZS51Lmk4KTsKKyAgICAgICAgICAgIGJ1ZmZlciArPSBzdGQ6OnRvX3N0cmluZyh2YWx1ZS51Lmk4KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ4OgotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZEZvcm1hdCgiJWQiLCB2YWx1ZS51LnU4KTsKKyAgICAgICAgICAgIGJ1ZmZlciArPSBzdGQ6OnRvX3N0cmluZyh2YWx1ZS51LnU4KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDE2OgotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZEZvcm1hdCgiJWQiLCB2YWx1ZS51LmkxNik7CisgICAgICAgICAgICBidWZmZXIgKz0gc3RkOjp0b19zdHJpbmcodmFsdWUudS5pMTYpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTVRQX1RZUEVfVUlOVDE2OgotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZEZvcm1hdCgiJWQiLCB2YWx1ZS51LnUxNik7CisgICAgICAgICAgICBidWZmZXIgKz0gc3RkOjp0b19zdHJpbmcodmFsdWUudS51MTYpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTVRQX1RZUEVfSU5UMzI6Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kRm9ybWF0KCIlZCIsIHZhbHVlLnUuaTMyKTsKKyAgICAgICAgICAgIGJ1ZmZlciArPSBzdGQ6OnRvX3N0cmluZyh2YWx1ZS51LmkzMik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBNVFBfVFlQRV9VSU5UMzI6Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kRm9ybWF0KCIlZCIsIHZhbHVlLnUudTMyKTsKKyAgICAgICAgICAgIGJ1ZmZlciArPSBzdGQ6OnRvX3N0cmluZyh2YWx1ZS51LnUzMik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBNVFBfVFlQRV9JTlQ2NDoKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmRGb3JtYXQoIiUiIFBSSWQ2NCwgdmFsdWUudS5pNjQpOworICAgICAgICAgICAgYnVmZmVyICs9IHN0ZDo6dG9fc3RyaW5nKHZhbHVlLnUuaTY0KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQ2NDoKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmRGb3JtYXQoIiUiIFBSSXU2NCwgdmFsdWUudS51NjQpOworICAgICAgICAgICAgYnVmZmVyICs9IHN0ZDo6dG9fc3RyaW5nKHZhbHVlLnUudTY0KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE1UUF9UWVBFX0lOVDEyODoKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmRGb3JtYXQoIiUwOFglMDhYJTA4WCUwOFgiLCB2YWx1ZS51LmkxMjhbMF0sIHZhbHVlLnUuaTEyOFsxXSwKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUudS5pMTI4WzJdLCB2YWx1ZS51LmkxMjhbM10pOworICAgICAgICAgICAgZm9yIChhdXRvIGkgOiB2YWx1ZS51LmkxMjgpIHsKKyAgICAgICAgICAgICAgICBzIDw8IHN0ZDo6aGV4IDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6dXBwZXJjYXNlIDw8IGk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXIgKz0gcy5zdHIoKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE1UUF9UWVBFX1VJTlQxMjg6Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kRm9ybWF0KCIlMDhYJTA4WCUwOFglMDhYIiwgdmFsdWUudS51MTI4WzBdLCB2YWx1ZS51LnUxMjhbMV0sCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlLnUudTEyOFsyXSwgdmFsdWUudS51MTI4WzNdKTsKKyAgICAgICAgICAgIGZvciAoYXV0byBpIDogdmFsdWUudS51MTI4KSB7CisgICAgICAgICAgICAgICAgcyA8PCBzdGQ6OmhleCA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OnVwcGVyY2FzZSA8PCBpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVyICs9IHMuc3RyKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBNVFBfVFlQRV9TVFI6Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kRm9ybWF0KCIlcyIsIHZhbHVlLnN0cik7CisgICAgICAgICAgICBidWZmZXIgKz0gdmFsdWUuc3RyOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HRSgidW5zdXBwb3J0ZWQgdHlwZSBmb3IgTXRwUHJvcGVydHk6OnByaW50XG4iKTsKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBQcm9wZXJ0eS5oIGIvbWVkaWEvbXRwL010cFByb3BlcnR5LmgKaW5kZXggMDNjMDhlMS4uYmZkNWY3ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFByb3BlcnR5LmgKKysrIGIvbWVkaWEvbXRwL010cFByb3BlcnR5LmgKQEAgLTE5LDYgKzE5LDggQEAKIAogI2luY2x1ZGUgIk10cFR5cGVzLmgiCiAKKyNpbmNsdWRlIDxzdHJpbmc+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgTXRwRGF0YVBhY2tldDsKQEAgLTk3LDcgKzk5LDYgQEAKICAgICB2b2lkICAgICAgICAgICAgICAgIHNldEZvcm1EYXRlVGltZSgpOwogCiAgICAgdm9pZCAgICAgICAgICAgICAgICBwcmludCgpOwotICAgIHZvaWQgICAgICAgICAgICAgICAgcHJpbnQoTXRwUHJvcGVydHlWYWx1ZSYgdmFsdWUsIE10cFN0cmluZyYgYnVmZmVyKTsKIAogICAgIGlubGluZSBib29sICAgICAgICAgaXNEZXZpY2VQcm9wZXJ0eSgpIGNvbnN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCAgICgobUNvZGUgJiAweEYwMDApID09IDB4NTAwMCkKQEAgLTExMCw2ICsxMTEsNyBAQAogICAgIE10cFByb3BlcnR5VmFsdWUqICAgcmVhZEFycmF5VmFsdWVzKE10cERhdGFQYWNrZXQmIHBhY2tldCwgdWludDMyX3QmIGxlbmd0aCk7CiAgICAgdm9pZCAgICAgICAgICAgICAgICB3cml0ZUFycmF5VmFsdWVzKE10cERhdGFQYWNrZXQmIHBhY2tldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwUHJvcGVydHlWYWx1ZSogdmFsdWVzLCB1aW50MzJfdCBsZW5ndGgpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcHJpbnQoTXRwUHJvcGVydHlWYWx1ZSYgdmFsdWUsIHN0ZDo6c3RyaW5nJiBidWZmZXIpOwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwIGIvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKaW5kZXggNjdmZDIyMS4uODZkNTlkZCAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKKysrIGIvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKQEAgLTE0LDYgKzE0LDggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGNocm9ubz4KICNpbmNsdWRlIDxkaXJlbnQuaD4KQEAgLTMwLDcgKzMyLDExIEBACiAjZGVmaW5lIExPR19UQUcgIk10cFNlcnZlciIKIAogI2luY2x1ZGUgIk10cERlYnVnLmgiCi0jaW5jbHVkZSAiTXRwRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJJTXRwRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJNdHBEZXNjcmlwdG9ycy5oIgorI2luY2x1ZGUgIk10cERldkhhbmRsZS5oIgorI2luY2x1ZGUgIk10cEZmc0NvbXBhdEhhbmRsZS5oIgorI2luY2x1ZGUgIk10cEZmc0hhbmRsZS5oIgogI2luY2x1ZGUgIk10cE9iamVjdEluZm8uaCIKICNpbmNsdWRlICJNdHBQcm9wZXJ0eS5oIgogI2luY2x1ZGUgIk10cFNlcnZlci5oIgpAQCAtNjQsOCArNzAsOCBAQAogICAgIE1UUF9PUEVSQVRJT05fU0VUX0RFVklDRV9QUk9QX1ZBTFVFLAogICAgIE1UUF9PUEVSQVRJT05fUkVTRVRfREVWSUNFX1BST1BfVkFMVUUsCiAvLyAgICBNVFBfT1BFUkFUSU9OX1RFUk1JTkFURV9PUEVOX0NBUFRVUkUsCi0vLyAgICBNVFBfT1BFUkFUSU9OX01PVkVfT0JKRUNULAotLy8gICAgTVRQX09QRVJBVElPTl9DT1BZX09CSkVDVCwKKyAgICBNVFBfT1BFUkFUSU9OX01PVkVfT0JKRUNULAorICAgIE1UUF9PUEVSQVRJT05fQ09QWV9PQkpFQ1QsCiAgICAgTVRQX09QRVJBVElPTl9HRVRfUEFSVElBTF9PQkpFQ1QsCiAvLyAgICBNVFBfT1BFUkFUSU9OX0lOSVRJQVRFX09QRU5fQ0FQVFVSRSwKICAgICBNVFBfT1BFUkFUSU9OX0dFVF9PQkpFQ1RfUFJPUFNfU1VQUE9SVEVELApAQCAtOTUsMTcgKzEwMSwxMyBAQAogICAgIE1UUF9FVkVOVF9ERVZJQ0VfUFJPUF9DSEFOR0VELAogfTsKIAotTXRwU2VydmVyOjpNdHBTZXJ2ZXIoTXRwRGF0YWJhc2UqIGRhdGFiYXNlLCBib29sIHB0cCwKLSAgICAgICAgICAgICAgICAgICAgaW50IGZpbGVHcm91cCwgaW50IGZpbGVQZXJtLCBpbnQgZGlyZWN0b3J5UGVybSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgTXRwU3RyaW5nJiBkZXZpY2VJbmZvTWFudWZhY3R1cmVyLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBNdHBTdHJpbmcmIGRldmljZUluZm9Nb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgTXRwU3RyaW5nJiBkZXZpY2VJbmZvRGV2aWNlVmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgTXRwU3RyaW5nJiBkZXZpY2VJbmZvU2VyaWFsTnVtYmVyKQorTXRwU2VydmVyOjpNdHBTZXJ2ZXIoSU10cERhdGFiYXNlKiBkYXRhYmFzZSwgaW50IGNvbnRyb2xGZCwgYm9vbCBwdHAsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZUluZm9NYW51ZmFjdHVyZXIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZUluZm9Nb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlSW5mb0RldmljZVZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZUluZm9TZXJpYWxOdW1iZXIpCiAgICAgOiAgIG1EYXRhYmFzZShkYXRhYmFzZSksCiAgICAgICAgIG1QdHAocHRwKSwKLSAgICAgICAgbUZpbGVHcm91cChmaWxlR3JvdXApLAotICAgICAgICBtRmlsZVBlcm1pc3Npb24oZmlsZVBlcm0pLAotICAgICAgICBtRGlyZWN0b3J5UGVybWlzc2lvbihkaXJlY3RvcnlQZXJtKSwKICAgICAgICAgbURldmljZUluZm9NYW51ZmFjdHVyZXIoZGV2aWNlSW5mb01hbnVmYWN0dXJlciksCiAgICAgICAgIG1EZXZpY2VJbmZvTW9kZWwoZGV2aWNlSW5mb01vZGVsKSwKICAgICAgICAgbURldmljZUluZm9EZXZpY2VWZXJzaW9uKGRldmljZUluZm9EZXZpY2VWZXJzaW9uKSwKQEAgLTExNyw1MCArMTE5LDM4IEBACiAgICAgICAgIG1TZW5kT2JqZWN0RmlsZVNpemUoMCksCiAgICAgICAgIG1TZW5kT2JqZWN0TW9kaWZpZWRUaW1lKDApCiB7CisgICAgYm9vbCBmZnNfb2sgPSBhY2Nlc3MoRkZTX01UUF9FUDAsIFdfT0spID09IDA7CisgICAgaWYgKGZmc19vaykgeworICAgICAgICBib29sIGFpb19jb21wYXQgPSBhbmRyb2lkOjpiYXNlOjpHZXRCb29sUHJvcGVydHkoInN5cy51c2IuZmZzLmFpb19jb21wYXQiLCBmYWxzZSk7CisgICAgICAgIG1IYW5kbGUgPSBhaW9fY29tcGF0ID8gbmV3IE10cEZmc0NvbXBhdEhhbmRsZShjb250cm9sRmQpIDogbmV3IE10cEZmc0hhbmRsZShjb250cm9sRmQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1IYW5kbGUgPSBuZXcgTXRwRGV2SGFuZGxlKCk7CisgICAgfQogfQogCiBNdHBTZXJ2ZXI6On5NdHBTZXJ2ZXIoKSB7CiB9CiAKLUlNdHBIYW5kbGUqIE10cFNlcnZlcjo6c0hhbmRsZSA9IG51bGxwdHI7Ci0KLWludCBNdHBTZXJ2ZXI6OmNvbmZpZ3VyZShib29sIHVzZVB0cCkgewotICAgIGlmIChzSGFuZGxlID09IG51bGxwdHIpIHsKLSAgICAgICAgYm9vbCBmZnNfb2sgPSBhY2Nlc3MoRkZTX01UUF9FUDAsIFdfT0spID09IDA7Ci0gICAgICAgIHNIYW5kbGUgPSBmZnNfb2sgPyBnZXRfZmZzX2hhbmRsZSgpIDogZ2V0X210cF9oYW5kbGUoKTsKLSAgICB9Ci0KLSAgICBpbnQgcmV0ID0gc0hhbmRsZS0+Y29uZmlndXJlKHVzZVB0cCk7Ci0gICAgaWYgKHJldCkgQUxPR0UoIkZhaWxlZCB0byBjb25maWd1cmUgTVRQIGRyaXZlciEiKTsKLSAgICBhbmRyb2lkOjpiYXNlOjpTZXRQcm9wZXJ0eSgic3lzLnVzYi5mZnMubXRwLnJlYWR5IiwgIjEiKTsKLQotICAgIHJldHVybiByZXQ7Ci19Ci0KIHZvaWQgTXRwU2VydmVyOjphZGRTdG9yYWdlKE10cFN0b3JhZ2UqIHN0b3JhZ2UpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbGcobU11dGV4KTsKIAotICAgIG1TdG9yYWdlcy5wdXNoKHN0b3JhZ2UpOworICAgIG1TdG9yYWdlcy5wdXNoX2JhY2soc3RvcmFnZSk7CiAgICAgc2VuZFN0b3JlQWRkZWQoc3RvcmFnZS0+Z2V0U3RvcmFnZUlEKCkpOwogfQogCiB2b2lkIE10cFNlcnZlcjo6cmVtb3ZlU3RvcmFnZShNdHBTdG9yYWdlKiBzdG9yYWdlKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdG9yYWdlcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAobVN0b3JhZ2VzW2ldID09IHN0b3JhZ2UpIHsKLSAgICAgICAgICAgIG1TdG9yYWdlcy5yZW1vdmVBdChpKTsKLSAgICAgICAgICAgIHNlbmRTdG9yZVJlbW92ZWQoc3RvcmFnZS0+Z2V0U3RvcmFnZUlEKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbGcobU11dGV4KTsKKyAgICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmQobVN0b3JhZ2VzLmJlZ2luKCksIG1TdG9yYWdlcy5lbmQoKSwgc3RvcmFnZSk7CisgICAgaWYgKGl0ZXIgIT0gbVN0b3JhZ2VzLmVuZCgpKSB7CisgICAgICAgIHNlbmRTdG9yZVJlbW92ZWQoc3RvcmFnZS0+Z2V0U3RvcmFnZUlEKCkpOworICAgICAgICBtU3RvcmFnZXMuZXJhc2UoaXRlcik7CiAgICAgfQogfQogCiBNdHBTdG9yYWdlKiBNdHBTZXJ2ZXI6OmdldFN0b3JhZ2UoTXRwU3RvcmFnZUlEIGlkKSB7CiAgICAgaWYgKGlkID09IDApCiAgICAgICAgIHJldHVybiBtU3RvcmFnZXNbMF07Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3RvcmFnZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgTXRwU3RvcmFnZSogc3RvcmFnZSA9IG1TdG9yYWdlc1tpXTsKKyAgICBmb3IgKE10cFN0b3JhZ2UgKnN0b3JhZ2UgOiBtU3RvcmFnZXMpIHsKICAgICAgICAgaWYgKHN0b3JhZ2UtPmdldFN0b3JhZ2VJRCgpID09IGlkKQogICAgICAgICAgICAgcmV0dXJuIHN0b3JhZ2U7CiAgICAgfQpAQCAtMTc0LDE5ICsxNjQsMTQgQEAKIH0KIAogdm9pZCBNdHBTZXJ2ZXI6OnJ1bigpIHsKLSAgICBpZiAoIXNIYW5kbGUpIHsKLSAgICAgICAgQUxPR0UoIk10cFNlcnZlciB3YXMgbmV2ZXIgY29uZmlndXJlZCEiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChzSGFuZGxlLT5zdGFydCgpKSB7CisgICAgaWYgKG1IYW5kbGUtPnN0YXJ0KG1QdHApKSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc3RhcnQgdXNiIGRyaXZlciEiKTsKLSAgICAgICAgc0hhbmRsZS0+Y2xvc2UoKTsKKyAgICAgICAgbUhhbmRsZS0+Y2xvc2UoKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGludCByZXQgPSBtUmVxdWVzdC5yZWFkKHNIYW5kbGUpOworICAgICAgICBpbnQgcmV0ID0gbVJlcXVlc3QucmVhZChtSGFuZGxlKTsKICAgICAgICAgaWYgKHJldCA8IDApIHsKICAgICAgICAgICAgIEFMT0dFKCJyZXF1ZXN0IHJlYWQgcmV0dXJuZWQgJWQsIGVycm5vOiAlZCIsIHJldCwgZXJybm8pOwogICAgICAgICAgICAgaWYgKGVycm5vID09IEVDQU5DRUxFRCkgewpAQCAtMjA1LDcgKzE5MCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHx8IG9wZXJhdGlvbiA9PSBNVFBfT1BFUkFUSU9OX1NFVF9PQkpFQ1RfUFJPUF9WQUxVRQogICAgICAgICAgICAgICAgICAgICB8fCBvcGVyYXRpb24gPT0gTVRQX09QRVJBVElPTl9TRVRfREVWSUNFX1BST1BfVkFMVUUpOwogICAgICAgICBpZiAoZGF0YUluKSB7Ci0gICAgICAgICAgICBpbnQgcmV0ID0gbURhdGEucmVhZChzSGFuZGxlKTsKKyAgICAgICAgICAgIGludCByZXQgPSBtRGF0YS5yZWFkKG1IYW5kbGUpOwogICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiZGF0YSByZWFkIHJldHVybmVkICVkLCBlcnJubzogJWQiLCByZXQsIGVycm5vKTsKICAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUNBTkNFTEVEKSB7CkBAIC0yMjQsNyArMjA5LDcgQEAKICAgICAgICAgICAgICAgICBtRGF0YS5zZXRPcGVyYXRpb25Db2RlKG9wZXJhdGlvbik7CiAgICAgICAgICAgICAgICAgbURhdGEuc2V0VHJhbnNhY3Rpb25JRCh0cmFuc2FjdGlvbik7CiAgICAgICAgICAgICAgICAgQUxPR1YoInNlbmRpbmcgZGF0YToiKTsKLSAgICAgICAgICAgICAgICByZXQgPSBtRGF0YS53cml0ZShzSGFuZGxlKTsKKyAgICAgICAgICAgICAgICByZXQgPSBtRGF0YS53cml0ZShtSGFuZGxlKTsKICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HRSgicmVxdWVzdCB3cml0ZSByZXR1cm5lZCAlZCwgZXJybm86ICVkIiwgcmV0LCBlcnJubyk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJubyA9PSBFQ0FOQ0VMRUQpIHsKQEAgLTIzNyw3ICsyMjIsNyBAQAogCiAgICAgICAgICAgICBtUmVzcG9uc2Uuc2V0VHJhbnNhY3Rpb25JRCh0cmFuc2FjdGlvbik7CiAgICAgICAgICAgICBBTE9HVigic2VuZGluZyByZXNwb25zZSAlMDRYIiwgbVJlc3BvbnNlLmdldFJlc3BvbnNlQ29kZSgpKTsKLSAgICAgICAgICAgIHJldCA9IG1SZXNwb25zZS53cml0ZShzSGFuZGxlKTsKKyAgICAgICAgICAgIHJldCA9IG1SZXNwb25zZS53cml0ZShtSGFuZGxlKTsKICAgICAgICAgICAgIGNvbnN0IGludCBzYXZlZEVycm5vID0gZXJybm87CiAgICAgICAgICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJyZXF1ZXN0IHdyaXRlIHJldHVybmVkICVkLCBlcnJubzogJWQiLCByZXQsIGVycm5vKTsKQEAgLTI2MSwxMCArMjQ2LDcgQEAKICAgICB9CiAgICAgbU9iamVjdEVkaXRMaXN0LmNsZWFyKCk7CiAKLSAgICBpZiAobVNlc3Npb25PcGVuKQotICAgICAgICBtRGF0YWJhc2UtPnNlc3Npb25FbmRlZCgpOwotCi0gICAgc0hhbmRsZS0+Y2xvc2UoKTsKKyAgICBtSGFuZGxlLT5jbG9zZSgpOwogfQogCiB2b2lkIE10cFNlcnZlcjo6c2VuZE9iamVjdEFkZGVkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKQEAgLTI5NywxNSArMjc5LDE1IEBACiAgICAgICAgIG1FdmVudC5zZXRFdmVudENvZGUoY29kZSk7CiAgICAgICAgIG1FdmVudC5zZXRUcmFuc2FjdGlvbklEKG1SZXF1ZXN0LmdldFRyYW5zYWN0aW9uSUQoKSk7CiAgICAgICAgIG1FdmVudC5zZXRQYXJhbWV0ZXIoMSwgcGFyYW0xKTsKLSAgICAgICAgaWYgKG1FdmVudC53cml0ZShzSGFuZGxlKSkKKyAgICAgICAgaWYgKG1FdmVudC53cml0ZShtSGFuZGxlKSkKICAgICAgICAgICAgIEFMT0dFKCJNdHAgc2VuZCBldmVudCBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICB9CiB9CiAKLXZvaWQgTXRwU2VydmVyOjphZGRFZGl0T2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIE10cFN0cmluZyYgcGF0aCwKK3ZvaWQgTXRwU2VydmVyOjphZGRFZGl0T2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIE10cFN0cmluZ0J1ZmZlciYgcGF0aCwKICAgICAgICAgdWludDY0X3Qgc2l6ZSwgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwgaW50IGZkKSB7CiAgICAgT2JqZWN0RWRpdCogIGVkaXQgPSBuZXcgT2JqZWN0RWRpdChoYW5kbGUsIHBhdGgsIHNpemUsIGZvcm1hdCwgZmQpOwotICAgIG1PYmplY3RFZGl0TGlzdC5hZGQoZWRpdCk7CisgICAgbU9iamVjdEVkaXRMaXN0LnB1c2hfYmFjayhlZGl0KTsKIH0KIAogTXRwU2VydmVyOjpPYmplY3RFZGl0KiBNdHBTZXJ2ZXI6OmdldEVkaXRPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSkgewpAQCAtMzIzLDcgKzMwNSw3IEBACiAgICAgICAgIE9iamVjdEVkaXQqIGVkaXQgPSBtT2JqZWN0RWRpdExpc3RbaV07CiAgICAgICAgIGlmIChlZGl0LT5tSGFuZGxlID09IGhhbmRsZSkgewogICAgICAgICAgICAgZGVsZXRlIGVkaXQ7Ci0gICAgICAgICAgICBtT2JqZWN0RWRpdExpc3QucmVtb3ZlQXQoaSk7CisgICAgICAgICAgICBtT2JqZWN0RWRpdExpc3QuZXJhc2UobU9iamVjdEVkaXRMaXN0LmJlZ2luKCkgKyBpKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgIH0KQEAgLTMzMSwxMiArMzEzLDEyIEBACiB9CiAKIHZvaWQgTXRwU2VydmVyOjpjb21taXRFZGl0KE9iamVjdEVkaXQqIGVkaXQpIHsKLSAgICBtRGF0YWJhc2UtPmVuZFNlbmRPYmplY3QoKGNvbnN0IGNoYXIgKillZGl0LT5tUGF0aCwgZWRpdC0+bUhhbmRsZSwgZWRpdC0+bUZvcm1hdCwgdHJ1ZSk7CisgICAgbURhdGFiYXNlLT5yZXNjYW5GaWxlKChjb25zdCBjaGFyICopZWRpdC0+bVBhdGgsIGVkaXQtPm1IYW5kbGUsIGVkaXQtPm1Gb3JtYXQpOwogfQogCiAKIGJvb2wgTXRwU2VydmVyOjpoYW5kbGVSZXF1ZXN0KCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsZyhtTXV0ZXgpOwogCiAgICAgTXRwT3BlcmF0aW9uQ29kZSBvcGVyYXRpb24gPSBtUmVxdWVzdC5nZXRPcGVyYXRpb25Db2RlKCk7CiAgICAgTXRwUmVzcG9uc2VDb2RlIHJlc3BvbnNlOwpAQCAtMzQ0LDkgKzMyNiw5IEBACiAgICAgbVJlc3BvbnNlLnJlc2V0KCk7CiAKICAgICBpZiAobVNlbmRPYmplY3RIYW5kbGUgIT0ga0ludmFsaWRPYmplY3RIYW5kbGUgJiYgb3BlcmF0aW9uICE9IE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1QpIHsKLSAgICAgICAgLy8gRklYTUUgLSBuZWVkIHRvIGRlbGV0ZSBtU2VuZE9iamVjdEhhbmRsZSBmcm9tIHRoZSBkYXRhYmFzZQotICAgICAgICBBTE9HRSgiZXhwZWN0ZWQgU2VuZE9iamVjdCBhZnRlciBTZW5kT2JqZWN0SW5mbyIpOwogICAgICAgICBtU2VuZE9iamVjdEhhbmRsZSA9IGtJbnZhbGlkT2JqZWN0SGFuZGxlOworICAgICAgICBtU2VuZE9iamVjdEZvcm1hdCA9IDA7CisgICAgICAgIG1TZW5kT2JqZWN0TW9kaWZpZWRUaW1lID0gMDsKICAgICB9CiAKICAgICBpbnQgY29udGFpbmVydHlwZSA9IG1SZXF1ZXN0LmdldENvbnRhaW5lclR5cGUoKTsKQEAgLTQyOSw2ICs0MTEsMTIgQEAKICAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0RFTEVURV9PQkpFQ1Q6CiAgICAgICAgICAgICByZXNwb25zZSA9IGRvRGVsZXRlT2JqZWN0KCk7CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVFBfT1BFUkFUSU9OX0NPUFlfT0JKRUNUOgorICAgICAgICAgICAgcmVzcG9uc2UgPSBkb0NvcHlPYmplY3QoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1UUF9PUEVSQVRJT05fTU9WRV9PQkpFQ1Q6CisgICAgICAgICAgICByZXNwb25zZSA9IGRvTW92ZU9iamVjdCgpOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTVRQX09QRVJBVElPTl9HRVRfT0JKRUNUX1BST1BfREVTQzoKICAgICAgICAgICAgIHJlc3BvbnNlID0gZG9HZXRPYmplY3RQcm9wRGVzYygpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC01MTYsOCArNTA0LDYgQEAKICAgICBtU2Vzc2lvbklEID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOwogICAgIG1TZXNzaW9uT3BlbiA9IHRydWU7CiAKLSAgICBtRGF0YWJhc2UtPnNlc3Npb25TdGFydGVkKCk7Ci0KICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOwogfQogCkBAIC01MjYsNyArNTEyLDYgQEAKICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9TRVNTSU9OX05PVF9PUEVOOwogICAgIG1TZXNzaW9uSUQgPSAwOwogICAgIG1TZXNzaW9uT3BlbiA9IGZhbHNlOwotICAgIG1EYXRhYmFzZS0+c2Vzc2lvbkVuZGVkKCk7CiAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKIH0KIApAQCAtNTk0LDYgKzU3OSw4IEBACiAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9TVE9SQUdFX0lEOwogCiAgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogaGFuZGxlcyA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0TGlzdChzdG9yYWdlSUQsIGZvcm1hdCwgcGFyZW50KTsKKyAgICBpZiAoaGFuZGxlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRTsKICAgICBtRGF0YS5wdXRBVUludDMyKGhhbmRsZXMpOwogICAgIGRlbGV0ZSBoYW5kbGVzOwogICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7CkBAIC03ODIsNyArNzY5LDcgQEAKICAgICBpZiAobVJlcXVlc3QuZ2V0UGFyYW1ldGVyQ291bnQoKSA8IDEpCiAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKLSAgICBNdHBTdHJpbmcgcGF0aEJ1ZjsKKyAgICBNdHBTdHJpbmdCdWZmZXIgcGF0aEJ1ZjsKICAgICBpbnQ2NF90IGZpbGVMZW5ndGg7CiAgICAgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdDsKICAgICBpbnQgcmVzdWx0ID0gbURhdGFiYXNlLT5nZXRPYmplY3RGaWxlUGF0aChoYW5kbGUsIHBhdGhCdWYsIGZpbGVMZW5ndGgsIGZvcm1hdCk7CkBAIC04MDMsNyArNzkwLDcgQEAKICAgICBtZnIudHJhbnNhY3Rpb25faWQgPSBtUmVxdWVzdC5nZXRUcmFuc2FjdGlvbklEKCk7CiAKICAgICAvLyB0aGVuIHRyYW5zZmVyIHRoZSBmaWxlCi0gICAgaW50IHJldCA9IHNIYW5kbGUtPnNlbmRGaWxlKG1mcik7CisgICAgaW50IHJldCA9IG1IYW5kbGUtPnNlbmRGaWxlKG1mcik7CiAgICAgaWYgKHJldCA8IDApIHsKICAgICAgICAgQUxPR0UoIk10cCBzZW5kIGZpbGUgZ290IGVycm9yICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgaWYgKGVycm5vID09IEVDQU5DRUxFRCkgewpAQCAtODM2LDcgKzgyMyw3IEBACiAgICAgICAgIC8vIHNlbmQgZGF0YQogICAgICAgICBtRGF0YS5zZXRPcGVyYXRpb25Db2RlKG1SZXF1ZXN0LmdldE9wZXJhdGlvbkNvZGUoKSk7CiAgICAgICAgIG1EYXRhLnNldFRyYW5zYWN0aW9uSUQobVJlcXVlc3QuZ2V0VHJhbnNhY3Rpb25JRCgpKTsKLSAgICAgICAgbURhdGEud3JpdGVEYXRhKHNIYW5kbGUsIHRodW1iLCB0aHVtYlNpemUpOworICAgICAgICBtRGF0YS53cml0ZURhdGEobUhhbmRsZSwgdGh1bWIsIHRodW1iU2l6ZSk7CiAgICAgICAgIGZyZWUodGh1bWIpOwogICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOwogICAgIH0gZWxzZSB7CkBAIC04NjgsNyArODU1LDcgQEAKICAgICAgICAgLy8gc3RhbmRhcmQgR2V0UGFydGlhbE9iamVjdAogICAgICAgICBsZW5ndGggPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMyk7CiAgICAgfQotICAgIE10cFN0cmluZyBwYXRoQnVmOworICAgIE10cFN0cmluZ0J1ZmZlciBwYXRoQnVmOwogICAgIGludDY0X3QgZmlsZUxlbmd0aDsKICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0OwogICAgIGludCByZXN1bHQgPSBtRGF0YWJhc2UtPmdldE9iamVjdEZpbGVQYXRoKGhhbmRsZSwgcGF0aEJ1ZiwgZmlsZUxlbmd0aCwgZm9ybWF0KTsKQEAgLTg3OCw2ICs4NjUsNyBAQAogICAgICAgICBsZW5ndGggPSBmaWxlTGVuZ3RoIC0gb2Zmc2V0OwogCiAgICAgY29uc3QgY2hhciogZmlsZVBhdGggPSAoY29uc3QgY2hhciAqKXBhdGhCdWY7CisgICAgQUxPR1YoInNlbmRpbmcgcGFydGlhbCAlcyAlIiBQUkl1NjQgIiAlIiBQUkl1MzIsIGZpbGVQYXRoLCBvZmZzZXQsIGxlbmd0aCk7CiAgICAgbXRwX2ZpbGVfcmFuZ2UgIG1mcjsKICAgICBtZnIuZmQgPSBvcGVuKGZpbGVQYXRoLCBPX1JET05MWSk7CiAgICAgaWYgKG1mci5mZCA8IDApIHsKQEAgLTg5MCw3ICs4NzgsNyBAQAogICAgIG1SZXNwb25zZS5zZXRQYXJhbWV0ZXIoMSwgbGVuZ3RoKTsKIAogICAgIC8vIHRyYW5zZmVyIHRoZSBmaWxlCi0gICAgaW50IHJldCA9IHNIYW5kbGUtPnNlbmRGaWxlKG1mcik7CisgICAgaW50IHJldCA9IG1IYW5kbGUtPnNlbmRGaWxlKG1mcik7CiAgICAgQUxPR1YoIk1UUF9TRU5EX0ZJTEVfV0lUSF9IRUFERVIgcmV0dXJuZWQgJWRcbiIsIHJldCk7CiAgICAgcmVzdWx0ID0gTVRQX1JFU1BPTlNFX09LOwogICAgIGlmIChyZXQgPCAwKSB7CkBAIC05MDQsNyArODkyLDcgQEAKIH0KIAogTXRwUmVzcG9uc2VDb2RlIE10cFNlcnZlcjo6ZG9TZW5kT2JqZWN0SW5mbygpIHsKLSAgICBNdHBTdHJpbmcgcGF0aDsKKyAgICBNdHBTdHJpbmdCdWZmZXIgcGF0aDsKICAgICB1aW50MTZfdCB0ZW1wMTY7CiAgICAgdWludDMyX3QgdGVtcDMyOwogCkBAIC05MTgsNyArOTA2LDcgQEAKIAogICAgIC8vIHNwZWNpYWwgY2FzZSB0aGUgcm9vdAogICAgIGlmIChwYXJlbnQgPT0gTVRQX1BBUkVOVF9ST09UKSB7Ci0gICAgICAgIHBhdGggPSBzdG9yYWdlLT5nZXRQYXRoKCk7CisgICAgICAgIHBhdGguc2V0KHN0b3JhZ2UtPmdldFBhdGgoKSk7CiAgICAgICAgIHBhcmVudCA9IDA7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaW50NjRfdCBsZW5ndGg7CkBAIC05NTAsNyArOTM4LDcgQEAKICAgICBpZiAoIW1EYXRhLmdldFVJbnQzMih0ZW1wMzIpKSByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfUEFSQU1FVEVSOyAgLy8gc2VxdWVuY2UgbnVtYmVyCiAgICAgTXRwU3RyaW5nQnVmZmVyIG5hbWUsIGNyZWF0ZWQsIG1vZGlmaWVkOwogICAgIGlmICghbURhdGEuZ2V0U3RyaW5nKG5hbWUpKSByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfUEFSQU1FVEVSOyAgICAvLyBmaWxlIG5hbWUKLSAgICBpZiAobmFtZS5nZXRDaGFyQ291bnQoKSA9PSAwKSB7CisgICAgaWYgKG5hbWUuaXNFbXB0eSgpKSB7CiAgICAgICAgIEFMT0dFKCJlbXB0eSBuYW1lIik7CiAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgfQpAQCAtOTY0LDggKzk1Miw4IEBACiAgICAgICAgIG1vZGlmaWVkVGltZSA9IDA7CiAKICAgICBpZiAocGF0aFtwYXRoLnNpemUoKSAtIDFdICE9ICcvJykKLSAgICAgICAgcGF0aCArPSAiLyI7Ci0gICAgcGF0aCArPSAoY29uc3QgY2hhciAqKW5hbWU7CisgICAgICAgIHBhdGguYXBwZW5kKCIvIik7CisgICAgcGF0aC5hcHBlbmQobmFtZSk7CiAKICAgICAvLyBjaGVjayBzcGFjZSBmaXJzdAogICAgIGlmIChtU2VuZE9iamVjdEZpbGVTaXplID4gc3RvcmFnZS0+Z2V0RnJlZVNwYWNlKCkpCkBAIC05ODAsMjkgKzk2OCwyNSBAQAogICAgIH0KIAogICAgIEFMT0dEKCJwYXRoOiAlcyBwYXJlbnQ6ICVkIHN0b3JhZ2VJRDogJTA4WCIsIChjb25zdCBjaGFyKilwYXRoLCBwYXJlbnQsIHN0b3JhZ2VJRCk7Ci0gICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1EYXRhYmFzZS0+YmVnaW5TZW5kT2JqZWN0KChjb25zdCBjaGFyKilwYXRoLAotICAgICAgICAgICAgZm9ybWF0LCBwYXJlbnQsIHN0b3JhZ2VJRCwgbVNlbmRPYmplY3RGaWxlU2l6ZSwgbW9kaWZpZWRUaW1lKTsKKyAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gbURhdGFiYXNlLT5iZWdpblNlbmRPYmplY3QoKGNvbnN0IGNoYXIqKXBhdGgsIGZvcm1hdCwKKyAgICAgICAgICAgIHBhcmVudCwgc3RvcmFnZUlEKTsKICAgICBpZiAoaGFuZGxlID09IGtJbnZhbGlkT2JqZWN0SGFuZGxlKSB7CiAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKICAgICB9CiAKLSAgaWYgKGZvcm1hdCA9PSBNVFBfRk9STUFUX0FTU09DSUFUSU9OKSB7Ci0gICAgICAgIG1vZGVfdCBtYXNrID0gdW1hc2soMCk7Ci0gICAgICAgIGludCByZXQgPSBta2RpcigoY29uc3QgY2hhciAqKXBhdGgsIG1EaXJlY3RvcnlQZXJtaXNzaW9uKTsKLSAgICAgICAgdW1hc2sobWFzayk7Ci0gICAgICAgIGlmIChyZXQgJiYgcmV0ICE9IC1FRVhJU1QpCisgICAgaWYgKGZvcm1hdCA9PSBNVFBfRk9STUFUX0FTU09DSUFUSU9OKSB7CisgICAgICAgIGludCByZXQgPSBtYWtlRm9sZGVyKChjb25zdCBjaGFyICopcGF0aCk7CisgICAgICAgIGlmIChyZXQpCiAgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7Ci0gICAgICAgIGNob3duKChjb25zdCBjaGFyICopcGF0aCwgZ2V0dWlkKCksIG1GaWxlR3JvdXApOwogCiAgICAgICAgIC8vIFNlbmRPYmplY3QgZG9lcyBub3QgZ2V0IHNlbnQgZm9yIGRpcmVjdG9yaWVzLCBzbyBjYWxsIGVuZFNlbmRPYmplY3QgaGVyZSBpbnN0ZWFkCi0gICAgICAgIG1EYXRhYmFzZS0+ZW5kU2VuZE9iamVjdChwYXRoLCBoYW5kbGUsIE1UUF9GT1JNQVRfQVNTT0NJQVRJT04sIE1UUF9SRVNQT05TRV9PSyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbVNlbmRPYmplY3RGaWxlUGF0aCA9IHBhdGg7Ci0gICAgICAgIC8vIHNhdmUgdGhlIGhhbmRsZSBmb3IgdGhlIFNlbmRPYmplY3QgY2FsbCwgd2hpY2ggc2hvdWxkIGZvbGxvdwotICAgICAgICBtU2VuZE9iamVjdEhhbmRsZSA9IGhhbmRsZTsKLSAgICAgICAgbVNlbmRPYmplY3RGb3JtYXQgPSBmb3JtYXQ7Ci0gICAgICAgIG1TZW5kT2JqZWN0TW9kaWZpZWRUaW1lID0gbW9kaWZpZWRUaW1lOworICAgICAgICBtRGF0YWJhc2UtPmVuZFNlbmRPYmplY3QoaGFuZGxlLCBNVFBfUkVTUE9OU0VfT0spOwogICAgIH0KKyAgICBtU2VuZE9iamVjdEZpbGVQYXRoID0gcGF0aDsKKyAgICAvLyBzYXZlIHRoZSBoYW5kbGUgZm9yIHRoZSBTZW5kT2JqZWN0IGNhbGwsIHdoaWNoIHNob3VsZCBmb2xsb3cKKyAgICBtU2VuZE9iamVjdEhhbmRsZSA9IGhhbmRsZTsKKyAgICBtU2VuZE9iamVjdEZvcm1hdCA9IGZvcm1hdDsKKyAgICBtU2VuZE9iamVjdE1vZGlmaWVkVGltZSA9IG1vZGlmaWVkVGltZTsKIAogICAgIG1SZXNwb25zZS5zZXRQYXJhbWV0ZXIoMSwgc3RvcmFnZUlEKTsKICAgICBtUmVzcG9uc2Uuc2V0UGFyYW1ldGVyKDIsIHBhcmVudCk7CkBAIC0xMDExLDYgKzk5NSwxNTMgQEAKICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOwogfQogCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb01vdmVPYmplY3QoKSB7CisgICAgaWYgKCFoYXNTdG9yYWdlKCkpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICBpZiAobVJlcXVlc3QuZ2V0UGFyYW1ldGVyQ291bnQoKSA8IDMpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgTXRwT2JqZWN0SGFuZGxlIG9iamVjdEhhbmRsZSA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsKKyAgICBNdHBTdG9yYWdlSUQgc3RvcmFnZUlEID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDIpOworICAgIE10cFN0b3JhZ2UqIHN0b3JhZ2UgPSBnZXRTdG9yYWdlKHN0b3JhZ2VJRCk7CisgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigzKTsKKyAgICBpZiAoIXN0b3JhZ2UpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9TVE9SQUdFX0lEOworICAgIE10cFN0cmluZ0J1ZmZlciBwYXRoOworICAgIE10cFJlc3BvbnNlQ29kZSByZXN1bHQ7CisKKyAgICBNdHBTdHJpbmdCdWZmZXIgZnJvbVBhdGg7CisgICAgaW50NjRfdCBmaWxlTGVuZ3RoOworICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQ7CisgICAgTXRwT2JqZWN0SW5mbyBpbmZvKG9iamVjdEhhbmRsZSk7CisgICAgcmVzdWx0ID0gbURhdGFiYXNlLT5nZXRPYmplY3RJbmZvKG9iamVjdEhhbmRsZSwgaW5mbyk7CisgICAgaWYgKHJlc3VsdCAhPSBNVFBfUkVTUE9OU0VfT0spCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgcmVzdWx0ID0gbURhdGFiYXNlLT5nZXRPYmplY3RGaWxlUGF0aChvYmplY3RIYW5kbGUsIGZyb21QYXRoLCBmaWxlTGVuZ3RoLCBmb3JtYXQpOworICAgIGlmIChyZXN1bHQgIT0gTVRQX1JFU1BPTlNFX09LKQorICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgLy8gc3BlY2lhbCBjYXNlIHRoZSByb290CisgICAgaWYgKHBhcmVudCA9PSAwKSB7CisgICAgICAgIHBhdGguc2V0KHN0b3JhZ2UtPmdldFBhdGgoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50NjRfdCBwYXJlbnRMZW5ndGg7CisgICAgICAgIE10cE9iamVjdEZvcm1hdCBwYXJlbnRGb3JtYXQ7CisgICAgICAgIHJlc3VsdCA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0RmlsZVBhdGgocGFyZW50LCBwYXRoLCBwYXJlbnRMZW5ndGgsIHBhcmVudEZvcm1hdCk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gTVRQX1JFU1BPTlNFX09LKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgaWYgKHBhcmVudEZvcm1hdCAhPSBNVFBfRk9STUFUX0FTU09DSUFUSU9OKQorICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX1BBUkVOVF9PQkpFQ1Q7CisgICAgfQorCisgICAgaWYgKHBhdGhbcGF0aC5zaXplKCkgLSAxXSAhPSAnLycpCisgICAgICAgIHBhdGguYXBwZW5kKCIvIik7CisgICAgcGF0aC5hcHBlbmQoaW5mby5tTmFtZSk7CisKKyAgICByZXN1bHQgPSBtRGF0YWJhc2UtPmJlZ2luTW92ZU9iamVjdChvYmplY3RIYW5kbGUsIHBhcmVudCwgc3RvcmFnZUlEKTsKKyAgICBpZiAocmVzdWx0ICE9IE1UUF9SRVNQT05TRV9PSykKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgIGlmIChpbmZvLm1TdG9yYWdlSUQgPT0gc3RvcmFnZUlEKSB7CisgICAgICAgIEFMT0dWKCJNb3ZpbmcgZmlsZSBmcm9tICVzIHRvICVzIiwgKGNvbnN0IGNoYXIqKWZyb21QYXRoLCAoY29uc3QgY2hhciopcGF0aCk7CisgICAgICAgIGlmIChyZW5hbWUoZnJvbVBhdGgsIHBhdGgpKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAicmVuYW1lKCkgZmFpbGVkIGZyb20gIiA8PCBmcm9tUGF0aCA8PCAiIHRvICIgPDwgcGF0aDsKKyAgICAgICAgICAgIHJlc3VsdCA9IE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIk1vdmluZyBhY3Jvc3Mgc3RvcmFnZXMgZnJvbSAlcyB0byAlcyIsIChjb25zdCBjaGFyKilmcm9tUGF0aCwgKGNvbnN0IGNoYXIqKXBhdGgpOworICAgICAgICBpZiAoZm9ybWF0ID09IE1UUF9GT1JNQVRfQVNTT0NJQVRJT04pIHsKKyAgICAgICAgICAgIGludCByZXQgPSBtYWtlRm9sZGVyKChjb25zdCBjaGFyICopcGF0aCk7CisgICAgICAgICAgICByZXQgKz0gY29weVJlY3Vyc2l2ZShmcm9tUGF0aCwgcGF0aCk7CisgICAgICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRlbGV0ZVBhdGgoZnJvbVBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGNvcHlGaWxlKGZyb21QYXRoLCBwYXRoKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZWxldGVQYXRoKGZyb21QYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIElmIHRoZSBtb3ZlIGZhaWxlZCwgdW5kbyB0aGUgZGF0YWJhc2UgY2hhbmdlCisgICAgbURhdGFiYXNlLT5lbmRNb3ZlT2JqZWN0KGluZm8ubVBhcmVudCwgcGFyZW50LCBpbmZvLm1TdG9yYWdlSUQsIHN0b3JhZ2VJRCwgb2JqZWN0SGFuZGxlLAorICAgICAgICAgICAgcmVzdWx0ID09IE1UUF9SRVNQT05TRV9PSyk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0NvcHlPYmplY3QoKSB7CisgICAgaWYgKCFoYXNTdG9yYWdlKCkpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICBNdHBSZXNwb25zZUNvZGUgcmVzdWx0ID0gTVRQX1JFU1BPTlNFX09LOworICAgIGlmIChtUmVxdWVzdC5nZXRQYXJhbWV0ZXJDb3VudCgpIDwgMykKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICBNdHBPYmplY3RIYW5kbGUgb2JqZWN0SGFuZGxlID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOworICAgIE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMik7CisgICAgTXRwU3RvcmFnZSogc3RvcmFnZSA9IGdldFN0b3JhZ2Uoc3RvcmFnZUlEKTsKKyAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDMpOworICAgIGlmICghc3RvcmFnZSkKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX1NUT1JBR0VfSUQ7CisgICAgTXRwU3RyaW5nQnVmZmVyIHBhdGg7CisKKyAgICBNdHBTdHJpbmdCdWZmZXIgZnJvbVBhdGg7CisgICAgaW50NjRfdCBmaWxlTGVuZ3RoOworICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQ7CisgICAgTXRwT2JqZWN0SW5mbyBpbmZvKG9iamVjdEhhbmRsZSk7CisgICAgcmVzdWx0ID0gbURhdGFiYXNlLT5nZXRPYmplY3RJbmZvKG9iamVjdEhhbmRsZSwgaW5mbyk7CisgICAgaWYgKHJlc3VsdCAhPSBNVFBfUkVTUE9OU0VfT0spCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgcmVzdWx0ID0gbURhdGFiYXNlLT5nZXRPYmplY3RGaWxlUGF0aChvYmplY3RIYW5kbGUsIGZyb21QYXRoLCBmaWxlTGVuZ3RoLCBmb3JtYXQpOworICAgIGlmIChyZXN1bHQgIT0gTVRQX1JFU1BPTlNFX09LKQorICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgLy8gc3BlY2lhbCBjYXNlIHRoZSByb290CisgICAgaWYgKHBhcmVudCA9PSAwKSB7CisgICAgICAgIHBhdGguc2V0KHN0b3JhZ2UtPmdldFBhdGgoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50NjRfdCBwYXJlbnRMZW5ndGg7CisgICAgICAgIE10cE9iamVjdEZvcm1hdCBwYXJlbnRGb3JtYXQ7CisgICAgICAgIHJlc3VsdCA9IG1EYXRhYmFzZS0+Z2V0T2JqZWN0RmlsZVBhdGgocGFyZW50LCBwYXRoLCBwYXJlbnRMZW5ndGgsIHBhcmVudEZvcm1hdCk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gTVRQX1JFU1BPTlNFX09LKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgaWYgKHBhcmVudEZvcm1hdCAhPSBNVFBfRk9STUFUX0FTU09DSUFUSU9OKQorICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX1BBUkVOVF9PQkpFQ1Q7CisgICAgfQorCisgICAgLy8gY2hlY2sgc3BhY2UgZmlyc3QKKyAgICBpZiAoKHVpbnQ2NF90KSBmaWxlTGVuZ3RoID4gc3RvcmFnZS0+Z2V0RnJlZVNwYWNlKCkpCisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfU1RPUkFHRV9GVUxMOworCisgICAgaWYgKHBhdGhbcGF0aC5zaXplKCkgLSAxXSAhPSAnLycpCisgICAgICAgIHBhdGguYXBwZW5kKCIvIik7CisgICAgcGF0aC5hcHBlbmQoaW5mby5tTmFtZSk7CisKKyAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gbURhdGFiYXNlLT5iZWdpbkNvcHlPYmplY3Qob2JqZWN0SGFuZGxlLCBwYXJlbnQsIHN0b3JhZ2VJRCk7CisgICAgaWYgKGhhbmRsZSA9PSBrSW52YWxpZE9iamVjdEhhbmRsZSkgeworICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgfQorCisgICAgQUxPR1YoIkNvcHlpbmcgZmlsZSBmcm9tICVzIHRvICVzIiwgKGNvbnN0IGNoYXIqKWZyb21QYXRoLCAoY29uc3QgY2hhciopcGF0aCk7CisgICAgaWYgKGZvcm1hdCA9PSBNVFBfRk9STUFUX0FTU09DSUFUSU9OKSB7CisgICAgICAgIGludCByZXQgPSBtYWtlRm9sZGVyKChjb25zdCBjaGFyICopcGF0aCk7CisgICAgICAgIHJldCArPSBjb3B5UmVjdXJzaXZlKGZyb21QYXRoLCBwYXRoKTsKKyAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgcmVzdWx0ID0gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoY29weUZpbGUoZnJvbVBhdGgsIHBhdGgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1EYXRhYmFzZS0+ZW5kQ29weU9iamVjdChoYW5kbGUsIHJlc3VsdCk7CisgICAgbVJlc3BvbnNlLnNldFBhcmFtZXRlcigxLCBoYW5kbGUpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKIE10cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvU2VuZE9iamVjdCgpIHsKICAgICBpZiAoIWhhc1N0b3JhZ2UoKSkKICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOwpAQCAtMTAyOSwyMyArMTE2MCwzMiBAQAogICAgIH0KIAogICAgIC8vIHJlYWQgdGhlIGhlYWRlciwgYW5kIHBvc3NpYmx5IHNvbWUgZGF0YQotICAgIHJldCA9IG1EYXRhLnJlYWQoc0hhbmRsZSk7CisgICAgcmV0ID0gbURhdGEucmVhZChtSGFuZGxlKTsKICAgICBpZiAocmV0IDwgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSkgewogICAgICAgICByZXN1bHQgPSBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKICAgICAgICAgZ290byBkb25lOwogICAgIH0KICAgICBpbml0aWFsRGF0YSA9IHJldCAtIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkU7CiAKKyAgICBpZiAobVNlbmRPYmplY3RGb3JtYXQgPT0gTVRQX0ZPUk1BVF9BU1NPQ0lBVElPTikgeworICAgICAgICBpZiAoaW5pdGlhbERhdGEgIT0gMCkKKyAgICAgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBmb2xkZXIgc2l6ZSB0byBiZSAwISIpOworICAgICAgICBtU2VuZE9iamVjdEhhbmRsZSA9IGtJbnZhbGlkT2JqZWN0SGFuZGxlOworICAgICAgICBtU2VuZE9iamVjdEZvcm1hdCA9IDA7CisgICAgICAgIG1TZW5kT2JqZWN0TW9kaWZpZWRUaW1lID0gMDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKICAgICBtdHBfZmlsZV9yYW5nZSAgbWZyOwogICAgIG1mci5mZCA9IG9wZW4obVNlbmRPYmplY3RGaWxlUGF0aCwgT19SRFdSIHwgT19DUkVBVCB8IE9fVFJVTkMsIFNfSVJVU1IgfCBTX0lXVVNSKTsKICAgICBpZiAobWZyLmZkIDwgMCkgewogICAgICAgICByZXN1bHQgPSBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKICAgICAgICAgZ290byBkb25lOwogICAgIH0KLSAgICBmY2hvd24obWZyLmZkLCBnZXR1aWQoKSwgbUZpbGVHcm91cCk7CisgICAgZmNob3duKG1mci5mZCwgZ2V0dWlkKCksIEZJTEVfR1JPVVApOwogICAgIC8vIHNldCBwZXJtaXNzaW9ucwogICAgIG1hc2sgPSB1bWFzaygwKTsKLSAgICBmY2htb2QobWZyLmZkLCBtRmlsZVBlcm1pc3Npb24pOworICAgIGZjaG1vZChtZnIuZmQsIEZJTEVfUEVSTSk7CiAgICAgdW1hc2sobWFzayk7CiAKICAgICBpZiAoaW5pdGlhbERhdGEgPiAwKSB7CkBAIC0xMDY4LDcgKzEyMDgsNyBAQAogICAgICAgICBtZnIudHJhbnNhY3Rpb25faWQgPSAwOwogCiAgICAgICAgIC8vIHRyYW5zZmVyIHRoZSBmaWxlCi0gICAgICAgIHJldCA9IHNIYW5kbGUtPnJlY2VpdmVGaWxlKG1mciwgbWZyLmxlbmd0aCA9PSAwICYmCisgICAgICAgIHJldCA9IG1IYW5kbGUtPnJlY2VpdmVGaWxlKG1mciwgbWZyLmxlbmd0aCA9PSAwICYmCiAgICAgICAgICAgICAgICAgaW5pdGlhbERhdGEgPT0gTVRQX0JVRkZFUl9TSVpFIC0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CiAgICAgICAgIGlmICgocmV0IDwgMCkgJiYgKGVycm5vID09IEVDQU5DRUxFRCkpIHsKICAgICAgICAgICAgIGlzQ2FuY2VsZWQgPSB0cnVlOwpAQCAtMTEwMSw4ICsxMjQxLDcgQEAKICAgICAvLyByZXNldCBzbyB3ZSBkb24ndCBhdHRlbXB0IHRvIHNlbmQgdGhlIGRhdGEgYmFjawogICAgIG1EYXRhLnJlc2V0KCk7CiAKLSAgICBtRGF0YWJhc2UtPmVuZFNlbmRPYmplY3QobVNlbmRPYmplY3RGaWxlUGF0aCwgbVNlbmRPYmplY3RIYW5kbGUsIG1TZW5kT2JqZWN0Rm9ybWF0LAotICAgICAgICAgICAgcmVzdWx0ID09IE1UUF9SRVNQT05TRV9PSyk7CisgICAgbURhdGFiYXNlLT5lbmRTZW5kT2JqZWN0KG1TZW5kT2JqZWN0SGFuZGxlLCByZXN1bHQgPT0gTVRQX1JFU1BPTlNFX09LKTsKICAgICBtU2VuZE9iamVjdEhhbmRsZSA9IGtJbnZhbGlkT2JqZWN0SGFuZGxlOwogICAgIG1TZW5kT2JqZWN0Rm9ybWF0ID0gMDsKICAgICBtU2VuZE9iamVjdE1vZGlmaWVkVGltZSA9IDA7CkBAIC0xMTE1LDY1ICsxMjU0LDYgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgdm9pZCBkZWxldGVSZWN1cnNpdmUoY29uc3QgY2hhciogcGF0aCkgewotICAgIGNoYXIgcGF0aGJ1ZltQQVRIX01BWF07Ci0gICAgc2l6ZV90IHBhdGhMZW5ndGggPSBzdHJsZW4ocGF0aCk7Ci0gICAgaWYgKHBhdGhMZW5ndGggPj0gc2l6ZW9mKHBhdGhidWYpIC0gMSkgewotICAgICAgICBBTE9HRSgicGF0aCB0b28gbG9uZzogJXNcbiIsIHBhdGgpOwotICAgIH0KLSAgICBzdHJjcHkocGF0aGJ1ZiwgcGF0aCk7Ci0gICAgaWYgKHBhdGhidWZbcGF0aExlbmd0aCAtIDFdICE9ICcvJykgewotICAgICAgICBwYXRoYnVmW3BhdGhMZW5ndGgrK10gPSAnLyc7Ci0gICAgfQotICAgIGNoYXIqIGZpbGVTcG90ID0gcGF0aGJ1ZiArIHBhdGhMZW5ndGg7Ci0gICAgaW50IHBhdGhSZW1haW5pbmcgPSBzaXplb2YocGF0aGJ1ZikgLSBwYXRoTGVuZ3RoIC0gMTsKLQotICAgIERJUiogZGlyID0gb3BlbmRpcihwYXRoKTsKLSAgICBpZiAoIWRpcikgewotICAgICAgICBBTE9HRSgib3BlbmRpciAlcyBmYWlsZWQ6ICVzIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN0cnVjdCBkaXJlbnQqIGVudHJ5OwotICAgIHdoaWxlICgoZW50cnkgPSByZWFkZGlyKGRpcikpKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBlbnRyeS0+ZF9uYW1lOwotCi0gICAgICAgIC8vIGlnbm9yZSAiLiIgYW5kICIuLiIKLSAgICAgICAgaWYgKG5hbWVbMF0gPT0gJy4nICYmIChuYW1lWzFdID09IDAgfHwgKG5hbWVbMV0gPT0gJy4nICYmIG5hbWVbMl0gPT0gMCkpKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBuYW1lTGVuZ3RoID0gc3RybGVuKG5hbWUpOwotICAgICAgICBpZiAobmFtZUxlbmd0aCA+IHBhdGhSZW1haW5pbmcpIHsKLSAgICAgICAgICAgIEFMT0dFKCJwYXRoICVzLyVzIHRvbyBsb25nXG4iLCBwYXRoLCBuYW1lKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHN0cmNweShmaWxlU3BvdCwgbmFtZSk7Ci0KLSAgICAgICAgaWYgKGVudHJ5LT5kX3R5cGUgPT0gRFRfRElSKSB7Ci0gICAgICAgICAgICBkZWxldGVSZWN1cnNpdmUocGF0aGJ1Zik7Ci0gICAgICAgICAgICBybWRpcihwYXRoYnVmKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVubGluayhwYXRoYnVmKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBjbG9zZWRpcihkaXIpOwotfQotCi1zdGF0aWMgdm9pZCBkZWxldGVQYXRoKGNvbnN0IGNoYXIqIHBhdGgpIHsKLSAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwotICAgIGlmIChzdGF0KHBhdGgsICZzdGF0YnVmKSA9PSAwKSB7Ci0gICAgICAgIGlmIChTX0lTRElSKHN0YXRidWYuc3RfbW9kZSkpIHsKLSAgICAgICAgICAgIGRlbGV0ZVJlY3Vyc2l2ZShwYXRoKTsKLSAgICAgICAgICAgIHJtZGlyKHBhdGgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdW5saW5rKHBhdGgpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoImRlbGV0ZVBhdGggc3RhdCBmYWlsZWQgZm9yICVzOiAlcyIsIHBhdGgsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgfQotfQotCiBNdHBSZXNwb25zZUNvZGUgTXRwU2VydmVyOjpkb0RlbGV0ZU9iamVjdCgpIHsKICAgICBpZiAoIWhhc1N0b3JhZ2UoKSkKICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9IQU5ETEU7CkBAIC0xMTg0LDE5ICsxMjY0LDIxIEBACiAgICAgLy8gRklYTUUgLSBzdXBwb3J0IGRlbGV0aW5nIGFsbCBvYmplY3RzIGlmIGhhbmRsZSBpcyAweEZGRkZGRkZGCiAgICAgLy8gRklYTUUgLSBpbXBsZW1lbnQgZGVsZXRpbmcgb2JqZWN0cyBieSBmb3JtYXQKIAotICAgIE10cFN0cmluZyBmaWxlUGF0aDsKKyAgICBNdHBTdHJpbmdCdWZmZXIgZmlsZVBhdGg7CiAgICAgaW50NjRfdCBmaWxlTGVuZ3RoOwogICAgIGludCByZXN1bHQgPSBtRGF0YWJhc2UtPmdldE9iamVjdEZpbGVQYXRoKGhhbmRsZSwgZmlsZVBhdGgsIGZpbGVMZW5ndGgsIGZvcm1hdCk7Ci0gICAgaWYgKHJlc3VsdCA9PSBNVFBfUkVTUE9OU0VfT0spIHsKLSAgICAgICAgQUxPR1YoImRlbGV0aW5nICVzIiwgKGNvbnN0IGNoYXIgKilmaWxlUGF0aCk7Ci0gICAgICAgIHJlc3VsdCA9IG1EYXRhYmFzZS0+ZGVsZXRlRmlsZShoYW5kbGUpOwotICAgICAgICAvLyBEb24ndCBkZWxldGUgdGhlIGFjdHVhbCBmaWxlcyB1bmxlc3MgdGhlIGRhdGFiYXNlIGRlbGV0aW9uIGlzIGFsbG93ZWQKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBNVFBfUkVTUE9OU0VfT0spIHsKLSAgICAgICAgICAgIGRlbGV0ZVBhdGgoKGNvbnN0IGNoYXIgKilmaWxlUGF0aCk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgaWYgKHJlc3VsdCAhPSBNVFBfUkVTUE9OU0VfT0spCisgICAgICAgIHJldHVybiByZXN1bHQ7CiAKLSAgICByZXR1cm4gcmVzdWx0OworICAgIC8vIERvbid0IGRlbGV0ZSB0aGUgYWN0dWFsIGZpbGVzIHVubGVzcyB0aGUgZGF0YWJhc2UgZGVsZXRpb24gaXMgYWxsb3dlZAorICAgIHJlc3VsdCA9IG1EYXRhYmFzZS0+YmVnaW5EZWxldGVPYmplY3QoaGFuZGxlKTsKKyAgICBpZiAocmVzdWx0ICE9IE1UUF9SRVNQT05TRV9PSykKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgIGJvb2wgc3VjY2VzcyA9IGRlbGV0ZVBhdGgoKGNvbnN0IGNoYXIgKilmaWxlUGF0aCk7CisKKyAgICBtRGF0YWJhc2UtPmVuZERlbGV0ZU9iamVjdChoYW5kbGUsIHN1Y2Nlc3MpOworICAgIHJldHVybiBzdWNjZXNzID8gcmVzdWx0IDogTVRQX1JFU1BPTlNFX1BBUlRJQUxfREVMRVRJT047CiB9CiAKIE10cFJlc3BvbnNlQ29kZSBNdHBTZXJ2ZXI6OmRvR2V0T2JqZWN0UHJvcERlc2MoKSB7CkBAIC0xMjU1LDcgKzEzMzcsNyBAQAogICAgIEFMT0dWKCJyZWNlaXZpbmcgcGFydGlhbCAlcyAlIiBQUkl1NjQgIiAlIiBQUkl1MzIsIGZpbGVQYXRoLCBvZmZzZXQsIGxlbmd0aCk7CiAKICAgICAvLyByZWFkIHRoZSBoZWFkZXIsIGFuZCBwb3NzaWJseSBzb21lIGRhdGEKLSAgICBpbnQgcmV0ID0gbURhdGEucmVhZChzSGFuZGxlKTsKKyAgICBpbnQgcmV0ID0gbURhdGEucmVhZChtSGFuZGxlKTsKICAgICBpZiAocmV0IDwgTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSkKICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOwogICAgIGludCBpbml0aWFsRGF0YSA9IHJldCAtIE1UUF9DT05UQUlORVJfSEVBREVSX1NJWkU7CkBAIC0xMjc4LDcgKzEzNjAsNyBAQAogICAgICAgICBtZnIudHJhbnNhY3Rpb25faWQgPSAwOwogCiAgICAgICAgIC8vIHRyYW5zZmVyIHRoZSBmaWxlCi0gICAgICAgIHJldCA9IHNIYW5kbGUtPnJlY2VpdmVGaWxlKG1mciwgbWZyLmxlbmd0aCA9PSAwICYmCisgICAgICAgIHJldCA9IG1IYW5kbGUtPnJlY2VpdmVGaWxlKG1mciwgbWZyLmxlbmd0aCA9PSAwICYmCiAgICAgICAgICAgICAgICAgaW5pdGlhbERhdGEgPT0gTVRQX0JVRkZFUl9TSVpFIC0gTVRQX0NPTlRBSU5FUl9IRUFERVJfU0laRSk7CiAgICAgICAgIGlmICgocmV0IDwgMCkgJiYgKGVycm5vID09IEVDQU5DRUxFRCkpIHsKICAgICAgICAgICAgIGlzQ2FuY2VsZWQgPSB0cnVlOwpAQCAtMTMzMiw3ICsxNDE0LDcgQEAKICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOwogICAgIH0KIAotICAgIE10cFN0cmluZyBwYXRoOworICAgIE10cFN0cmluZ0J1ZmZlciBwYXRoOwogICAgIGludDY0X3QgZmlsZUxlbmd0aDsKICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0OwogICAgIGludCByZXN1bHQgPSBtRGF0YWJhc2UtPmdldE9iamVjdEZpbGVQYXRoKGhhbmRsZSwgcGF0aCwgZmlsZUxlbmd0aCwgZm9ybWF0KTsKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTZXJ2ZXIuaCBiL21lZGlhL210cC9NdHBTZXJ2ZXIuaAppbmRleCAwOGE5ZTRhLi5mNjkzOWQ3IDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwU2VydmVyLmgKKysrIGIvbWVkaWEvbXRwL010cFNlcnZlci5oCkBAIC0yMSw0MiArMjEsMzYgQEAKICNpbmNsdWRlICJNdHBEYXRhUGFja2V0LmgiCiAjaW5jbHVkZSAiTXRwUmVzcG9uc2VQYWNrZXQuaCIKICNpbmNsdWRlICJNdHBFdmVudFBhY2tldC5oIgorI2luY2x1ZGUgIk10cFN0cmluZ0J1ZmZlci5oIgogI2luY2x1ZGUgIm10cC5oIgogI2luY2x1ZGUgIk10cFV0aWxzLmgiCiAjaW5jbHVkZSAiSU10cEhhbmRsZS5oIgogCi0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHF1ZXVlPgogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxxdWV1ZT4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBNdHBEYXRhYmFzZTsKK2NsYXNzIElNdHBEYXRhYmFzZTsKIGNsYXNzIE10cFN0b3JhZ2U7CiAKIGNsYXNzIE10cFNlcnZlciB7CiAKIHByaXZhdGU6Ci0gICAgTXRwRGF0YWJhc2UqICAgICAgICBtRGF0YWJhc2U7CisgICAgSU10cERhdGFiYXNlKiAgICAgICBtRGF0YWJhc2U7CiAKICAgICAvLyBhcHBlYXIgYXMgYSBQVFAgZGV2aWNlCiAgICAgYm9vbCAgICAgICAgICAgICAgICBtUHRwOwogCi0gICAgLy8gZ3JvdXAgdG8gb3duIG5ldyBmaWxlcyBhbmQgZm9sZGVycwotICAgIGludCAgICAgICAgICAgICAgICAgbUZpbGVHcm91cDsKLSAgICAvLyBwZXJtaXNzaW9ucyBmb3IgbmV3IGZpbGVzIGFuZCBkaXJlY3RvcmllcwotICAgIGludCAgICAgICAgICAgICAgICAgbUZpbGVQZXJtaXNzaW9uOwotICAgIGludCAgICAgICAgICAgICAgICAgbURpcmVjdG9yeVBlcm1pc3Npb247Ci0KICAgICAvLyBNYW51ZmFjdHVyZXIgdG8gcmVwb3J0IGluIERldmljZUluZm8KLSAgICBNdHBTdHJpbmcgICAgICAgICAgIG1EZXZpY2VJbmZvTWFudWZhY3R1cmVyOworICAgIE10cFN0cmluZ0J1ZmZlciAgICAgbURldmljZUluZm9NYW51ZmFjdHVyZXI7CiAgICAgLy8gTW9kZWwgdG8gcmVwb3J0IGluIERldmljZUluZm8KLSAgICBNdHBTdHJpbmcgICAgICAgICAgIG1EZXZpY2VJbmZvTW9kZWw7CisgICAgTXRwU3RyaW5nQnVmZmVyICAgICBtRGV2aWNlSW5mb01vZGVsOwogICAgIC8vIERldmljZSB2ZXJzaW9uIHRvIHJlcG9ydCBpbiBEZXZpY2VJbmZvCi0gICAgTXRwU3RyaW5nICAgICAgICAgICBtRGV2aWNlSW5mb0RldmljZVZlcnNpb247CisgICAgTXRwU3RyaW5nQnVmZmVyICAgICBtRGV2aWNlSW5mb0RldmljZVZlcnNpb247CiAgICAgLy8gU2VyaWFsIG51bWJlciB0byByZXBvcnQgaW4gRGV2aWNlSW5mbwotICAgIE10cFN0cmluZyAgICAgICAgICAgbURldmljZUluZm9TZXJpYWxOdW1iZXI7CisgICAgTXRwU3RyaW5nQnVmZmVyICAgICBtRGV2aWNlSW5mb1NlcmlhbE51bWJlcjsKIAogICAgIC8vIGN1cnJlbnQgc2Vzc2lvbiBJRAogICAgIE10cFNlc3Npb25JRCAgICAgICAgbVNlc3Npb25JRDsKQEAgLTcxLDIzICs2NSwyMyBAQAogCiAgICAgTXRwU3RvcmFnZUxpc3QgICAgICBtU3RvcmFnZXM7CiAKLSAgICBzdGF0aWMgSU10cEhhbmRsZSogIHNIYW5kbGU7CisgICAgSU10cEhhbmRsZSogICAgICAgICBtSGFuZGxlOwogCiAgICAgLy8gaGFuZGxlIGZvciBuZXcgb2JqZWN0LCBzZXQgYnkgU2VuZE9iamVjdEluZm8gYW5kIHVzZWQgYnkgU2VuZE9iamVjdAogICAgIE10cE9iamVjdEhhbmRsZSAgICAgbVNlbmRPYmplY3RIYW5kbGU7CiAgICAgTXRwT2JqZWN0Rm9ybWF0ICAgICBtU2VuZE9iamVjdEZvcm1hdDsKLSAgICBNdHBTdHJpbmcgICAgICAgICAgIG1TZW5kT2JqZWN0RmlsZVBhdGg7CisgICAgTXRwU3RyaW5nQnVmZmVyICAgICBtU2VuZE9iamVjdEZpbGVQYXRoOwogICAgIHNpemVfdCAgICAgICAgICAgICAgbVNlbmRPYmplY3RGaWxlU2l6ZTsKICAgICB0aW1lX3QgICAgICAgICAgICAgIG1TZW5kT2JqZWN0TW9kaWZpZWRUaW1lOwogCi0gICAgTXV0ZXggICAgICAgICAgICAgICBtTXV0ZXg7CisgICAgc3RkOjptdXRleCAgICAgICAgICBtTXV0ZXg7CiAKICAgICAvLyByZXByZXNlbnRzIGFuIE1UUCBvYmplY3QgdGhhdCBpcyBiZWluZyBlZGl0ZWQgdXNpbmcgdGhlIGFuZHJvaWQgZXh0ZW5zaW9ucwogICAgIC8vIGZvciBkaXJlY3QgZWRpdGluZyAoQmVnaW5FZGl0T2JqZWN0LCBTZW5kUGFydGlhbE9iamVjdCwgVHJ1bmNhdGVPYmplY3QgYW5kIEVuZEVkaXRPYmplY3QpCiAgICAgY2xhc3MgT2JqZWN0RWRpdCB7CiAgICAgICAgIHB1YmxpYzoKICAgICAgICAgTXRwT2JqZWN0SGFuZGxlICAgICBtSGFuZGxlOwotICAgICAgICBNdHBTdHJpbmcgICAgICAgICAgIG1QYXRoOworICAgICAgICBNdHBTdHJpbmdCdWZmZXIgICAgICAgICAgIG1QYXRoOwogICAgICAgICB1aW50NjRfdCAgICAgICAgICAgIG1TaXplOwogICAgICAgICBNdHBPYmplY3RGb3JtYXQgICAgIG1Gb3JtYXQ7CiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbUZEOwpAQCAtMTAxLDE1ICs5NSwxNCBAQAogICAgICAgICAgICAgY2xvc2UobUZEKTsKICAgICAgICAgfQogICAgIH07Ci0gICAgVmVjdG9yPE9iamVjdEVkaXQqPiAgbU9iamVjdEVkaXRMaXN0OworICAgIHN0ZDo6dmVjdG9yPE9iamVjdEVkaXQqPiAgbU9iamVjdEVkaXRMaXN0OwogCiBwdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBNdHBTZXJ2ZXIoTXRwRGF0YWJhc2UqIGRhdGFiYXNlLCBib29sIHB0cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxlR3JvdXAsIGludCBmaWxlUGVybSwgaW50IGRpcmVjdG9yeVBlcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNdHBTdHJpbmcmIGRldmljZUluZm9NYW51ZmFjdHVyZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNdHBTdHJpbmcmIGRldmljZUluZm9Nb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE10cFN0cmluZyYgZGV2aWNlSW5mb0RldmljZVZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNdHBTdHJpbmcmIGRldmljZUluZm9TZXJpYWxOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgTXRwU2VydmVyKElNdHBEYXRhYmFzZSogZGF0YWJhc2UsIGludCBjb250cm9sRmQsIGJvb2wgcHRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlSW5mb01hbnVmYWN0dXJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZUluZm9Nb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZUluZm9EZXZpY2VWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlSW5mb1NlcmlhbE51bWJlcik7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+TXRwU2VydmVyKCk7CiAKICAgICBNdHBTdG9yYWdlKiAgICAgICAgIGdldFN0b3JhZ2UoTXRwU3RvcmFnZUlEIGlkKTsKQEAgLTExOCw3ICsxMTEsNiBAQAogICAgIHZvaWQgICAgICAgICAgICAgICAgYWRkU3RvcmFnZShNdHBTdG9yYWdlKiBzdG9yYWdlKTsKICAgICB2b2lkICAgICAgICAgICAgICAgIHJlbW92ZVN0b3JhZ2UoTXRwU3RvcmFnZSogc3RvcmFnZSk7CiAKLSAgICBzdGF0aWMgaW50ICAgICAgICAgIGNvbmZpZ3VyZShib29sIHVzZVB0cCk7CiAgICAgdm9pZCAgICAgICAgICAgICAgICBydW4oKTsKIAogICAgIHZvaWQgICAgICAgICAgICAgICAgc2VuZE9iamVjdEFkZGVkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOwpAQCAtMTMwLDcgKzEyMiw3IEBACiAgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kU3RvcmVSZW1vdmVkKE10cFN0b3JhZ2VJRCBpZCk7CiAgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kRXZlbnQoTXRwRXZlbnRDb2RlIGNvZGUsIHVpbnQzMl90IHBhcmFtMSk7CiAKLSAgICB2b2lkICAgICAgICAgICAgICAgIGFkZEVkaXRPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgTXRwU3RyaW5nJiBwYXRoLAorICAgIHZvaWQgICAgICAgICAgICAgICAgYWRkRWRpdE9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBNdHBTdHJpbmdCdWZmZXImIHBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNpemUsIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsIGludCBmZCk7CiAgICAgT2JqZWN0RWRpdCogICAgICAgICBnZXRFZGl0T2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOwogICAgIHZvaWQgICAgICAgICAgICAgICAgcmVtb3ZlRWRpdE9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKQEAgLTE2MSw2ICsxNTMsOCBAQAogICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9TZW5kT2JqZWN0SW5mbygpOwogICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9TZW5kT2JqZWN0KCk7CiAgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0RlbGV0ZU9iamVjdCgpOworICAgIE10cFJlc3BvbnNlQ29kZSAgICAgZG9Nb3ZlT2JqZWN0KCk7CisgICAgTXRwUmVzcG9uc2VDb2RlICAgICBkb0NvcHlPYmplY3QoKTsKICAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0T2JqZWN0UHJvcERlc2MoKTsKICAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvR2V0RGV2aWNlUHJvcERlc2MoKTsKICAgICBNdHBSZXNwb25zZUNvZGUgICAgIGRvU2VuZFBhcnRpYWxPYmplY3QoKTsKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTdG9yYWdlLmNwcCBiL21lZGlhL210cC9NdHBTdG9yYWdlLmNwcAppbmRleCBkNzdjYTcyLi5hMTQ3MzI1IDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwU3RvcmFnZS5jcHAKKysrIGIvbWVkaWEvbXRwL010cFN0b3JhZ2UuY3BwCkBAIC0xNyw3ICsxNyw2IEBACiAjZGVmaW5lIExPR19UQUcgIk10cFN0b3JhZ2UiCiAKICNpbmNsdWRlICJNdHBEZWJ1Zy5oIgotI2luY2x1ZGUgIk10cERhdGFiYXNlLmgiCiAjaW5jbHVkZSAiTXRwU3RvcmFnZS5oIgogCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CkBAIC0zMywxNCArMzIsMTIgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogTXRwU3RvcmFnZTo6TXRwU3RvcmFnZShNdHBTdG9yYWdlSUQgaWQsIGNvbnN0IGNoYXIqIGZpbGVQYXRoLAotICAgICAgICBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbiwgdWludDY0X3QgcmVzZXJ2ZVNwYWNlLAotICAgICAgICBib29sIHJlbW92YWJsZSwgdWludDY0X3QgbWF4RmlsZVNpemUpCisgICAgICAgIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uLCBib29sIHJlbW92YWJsZSwgdWludDY0X3QgbWF4RmlsZVNpemUpCiAgICAgOiAgIG1TdG9yYWdlSUQoaWQpLAogICAgICAgICBtRmlsZVBhdGgoZmlsZVBhdGgpLAogICAgICAgICBtRGVzY3JpcHRpb24oZGVzY3JpcHRpb24pLAogICAgICAgICBtTWF4Q2FwYWNpdHkoMCksCiAgICAgICAgIG1NYXhGaWxlU2l6ZShtYXhGaWxlU2l6ZSksCi0gICAgICAgIG1SZXNlcnZlU3BhY2UocmVzZXJ2ZVNwYWNlKSwKICAgICAgICAgbVJlbW92YWJsZShyZW1vdmFibGUpCiB7CiAgICAgQUxPR1YoIk10cFN0b3JhZ2UgaWQ6ICVkIHBhdGg6ICVzXG4iLCBpZCwgZmlsZVBhdGgpOwpAQCAtNzUsOCArNzIsNyBAQAogICAgIHN0cnVjdCBzdGF0ZnMgICBzdGF0OwogICAgIGlmIChzdGF0ZnMoZ2V0UGF0aCgpLCAmc3RhdCkpCiAgICAgICAgIHJldHVybiAtMTsKLSAgICB1aW50NjRfdCBmcmVlU3BhY2UgPSAodWludDY0X3Qpc3RhdC5mX2JhdmFpbCAqICh1aW50NjRfdClzdGF0LmZfYnNpemU7Ci0gICAgcmV0dXJuIChmcmVlU3BhY2UgPiBtUmVzZXJ2ZVNwYWNlID8gZnJlZVNwYWNlIC0gbVJlc2VydmVTcGFjZSA6IDApOworICAgIHJldHVybiAodWludDY0X3Qpc3RhdC5mX2JhdmFpbCAqICh1aW50NjRfdClzdGF0LmZfYnNpemU7CiB9CiAKIGNvbnN0IGNoYXIqIE10cFN0b3JhZ2U6OmdldERlc2NyaXB0aW9uKCkgY29uc3QgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFN0b3JhZ2UuaCBiL21lZGlhL210cC9NdHBTdG9yYWdlLmgKaW5kZXggZTVhMmU1Ny4uZTk1MThkZCAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFN0b3JhZ2UuaAorKysgYi9tZWRpYS9tdHAvTXRwU3RvcmFnZS5oCkBAIC0xNyw2ICsxNyw3IEBACiAjaWZuZGVmIF9NVFBfU1RPUkFHRV9ICiAjZGVmaW5lIF9NVFBfU1RPUkFHRV9ICiAKKyNpbmNsdWRlICJNdHBTdHJpbmdCdWZmZXIuaCIKICNpbmNsdWRlICJNdHBUeXBlcy5oIgogI2luY2x1ZGUgIm10cC5oIgogCkBAIC0yOCwxNyArMjksMTUgQEAKIAogcHJpdmF0ZToKICAgICBNdHBTdG9yYWdlSUQgICAgICAgICAgICBtU3RvcmFnZUlEOwotICAgIE10cFN0cmluZyAgICAgICAgICAgICAgIG1GaWxlUGF0aDsKLSAgICBNdHBTdHJpbmcgICAgICAgICAgICAgICBtRGVzY3JpcHRpb247CisgICAgTXRwU3RyaW5nQnVmZmVyICAgICAgICAgbUZpbGVQYXRoOworICAgIE10cFN0cmluZ0J1ZmZlciAgICAgICAgIG1EZXNjcmlwdGlvbjsKICAgICB1aW50NjRfdCAgICAgICAgICAgICAgICBtTWF4Q2FwYWNpdHk7CiAgICAgdWludDY0X3QgICAgICAgICAgICAgICAgbU1heEZpbGVTaXplOwotICAgIC8vIGFtb3VudCBvZiBmcmVlIHNwYWNlIHRvIGxlYXZlIHVuYWxsb2NhdGVkCi0gICAgdWludDY0X3QgICAgICAgICAgICAgICAgbVJlc2VydmVTcGFjZTsKICAgICBib29sICAgICAgICAgICAgICAgICAgICBtUmVtb3ZhYmxlOwogCiBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZShNdHBTdG9yYWdlSUQgaWQsIGNvbnN0IGNoYXIqIGZpbGVQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGVzY3JpcHRpb24sIHVpbnQ2NF90IHJlc2VydmVTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZW1vdmFibGUsIHVpbnQ2NF90IG1heEZpbGVTaXplKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+TXRwU3RvcmFnZSgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU3RyaW5nQnVmZmVyLmNwcCBiL21lZGlhL210cC9NdHBTdHJpbmdCdWZmZXIuY3BwCmluZGV4IGRmMDQ2OTQuLmNkMzc5YmYgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBTdHJpbmdCdWZmZXIuY3BwCisrKyBiL21lZGlhL210cC9NdHBTdHJpbmdCdWZmZXIuY3BwCkBAIC0xNiwxNjggKzE2LDk3IEBACiAKICNkZWZpbmUgTE9HX1RBRyAiTXRwU3RyaW5nQnVmZmVyIgogCi0jaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y29kZWN2dD4KKyNpbmNsdWRlIDxsb2NhbGU+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgIk10cERhdGFQYWNrZXQuaCIKICNpbmNsdWRlICJNdHBTdHJpbmdCdWZmZXIuaCIKIAotbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHsKIAotTXRwU3RyaW5nQnVmZmVyOjpNdHBTdHJpbmdCdWZmZXIoKQotICAgIDogICBtQ2hhckNvdW50KDApLAotICAgICAgICBtQnl0ZUNvdW50KDEpCi17Ci0gICAgbUJ1ZmZlclswXSA9IDA7CitzdGQ6OndzdHJpbmdfY29udmVydDxzdGQ6OmNvZGVjdnRfdXRmOF91dGYxNjxjaGFyMTZfdD4sY2hhcjE2X3Q+IGdDb252ZXJ0OworCitzdGF0aWMgc3RkOjpzdHJpbmcgdXRmMTZUb1V0Zjgoc3RkOjp1MTZzdHJpbmcgaW5wdXRfc3RyKSB7CisgICAgcmV0dXJuIGdDb252ZXJ0LnRvX2J5dGVzKGlucHV0X3N0cik7CiB9CiAKK3N0YXRpYyBzdGQ6OnUxNnN0cmluZyB1dGY4VG9VdGYxNihzdGQ6OnN0cmluZyBpbnB1dF9zdHIpIHsKKyAgICByZXR1cm4gZ0NvbnZlcnQuZnJvbV9ieXRlcyhpbnB1dF9zdHIpOworfQorCit9IC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKIE10cFN0cmluZ0J1ZmZlcjo6TXRwU3RyaW5nQnVmZmVyKGNvbnN0IGNoYXIqIHNyYykKLSAgICA6ICAgbUNoYXJDb3VudCgwKSwKLSAgICAgICAgbUJ5dGVDb3VudCgxKQogewogICAgIHNldChzcmMpOwogfQogCiBNdHBTdHJpbmdCdWZmZXI6Ok10cFN0cmluZ0J1ZmZlcihjb25zdCB1aW50MTZfdCogc3JjKQotICAgIDogICBtQ2hhckNvdW50KDApLAotICAgICAgICBtQnl0ZUNvdW50KDEpCiB7CiAgICAgc2V0KHNyYyk7CiB9CiAKIE10cFN0cmluZ0J1ZmZlcjo6TXRwU3RyaW5nQnVmZmVyKGNvbnN0IE10cFN0cmluZ0J1ZmZlciYgc3JjKQotICAgIDogICBtQ2hhckNvdW50KHNyYy5tQ2hhckNvdW50KSwKLSAgICAgICAgbUJ5dGVDb3VudChzcmMubUJ5dGVDb3VudCkKIHsKLSAgICBtZW1jcHkobUJ1ZmZlciwgc3JjLm1CdWZmZXIsIG1CeXRlQ291bnQpOwotfQotCi0KLU10cFN0cmluZ0J1ZmZlcjo6fk10cFN0cmluZ0J1ZmZlcigpIHsKKyAgICBtU3RyaW5nID0gc3JjLm1TdHJpbmc7CiB9CiAKIHZvaWQgTXRwU3RyaW5nQnVmZmVyOjpzZXQoY29uc3QgY2hhciogc3JjKSB7Ci0gICAgLy8gY291bnQgdGhlIGNoYXJhY3RlcnMKLSAgICBpbnQgY291bnQgPSAwOwotICAgIGNoYXIgY2g7Ci0gICAgY2hhciogZGVzdCA9IChjaGFyKiltQnVmZmVyOwotCi0gICAgd2hpbGUgKChjaCA9ICpzcmMrKykgIT0gMCAmJiBjb3VudCA8IE1UUF9TVFJJTkdfTUFYX0NIQVJBQ1RFUl9OVU1CRVIpIHsKLSAgICAgICAgaWYgKChjaCAmIDB4ODApID09IDApIHsKLSAgICAgICAgICAgIC8vIHNpbmdsZSBieXRlIGNoYXJhY3RlcgotICAgICAgICAgICAgKmRlc3QrKyA9IGNoOwotICAgICAgICB9IGVsc2UgaWYgKChjaCAmIDB4RTApID09IDB4QzApIHsKLSAgICAgICAgICAgIC8vIHR3byBieXRlIGNoYXJhY3RlcgotICAgICAgICAgICAgY2hhciBjaDEgPSAqc3JjKys7Ci0gICAgICAgICAgICBpZiAoISBjaDEpIHsKLSAgICAgICAgICAgICAgICAvLyBsYXN0IGNoYXJhY3RlciB3YXMgdHJ1bmNhdGVkLCBzbyBpZ25vcmUgbGFzdCBieXRlCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICpkZXN0KysgPSBjaDsKLSAgICAgICAgICAgICpkZXN0KysgPSBjaDE7Ci0gICAgICAgIH0gZWxzZSBpZiAoKGNoICYgMHhGMCkgPT0gMHhFMCkgewotICAgICAgICAgICAgLy8gMyBieXRlIGNoYXIKLSAgICAgICAgICAgIGNoYXIgY2gxID0gKnNyYysrOwotICAgICAgICAgICAgaWYgKCEgY2gxKSB7Ci0gICAgICAgICAgICAgICAgLy8gbGFzdCBjaGFyYWN0ZXIgd2FzIHRydW5jYXRlZCwgc28gaWdub3JlIGxhc3QgYnl0ZQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hhciBjaDIgPSAqc3JjKys7Ci0gICAgICAgICAgICBpZiAoISBjaDIpIHsKLSAgICAgICAgICAgICAgICAvLyBsYXN0IGNoYXJhY3RlciB3YXMgdHJ1bmNhdGVkLCBzbyBpZ25vcmUgbGFzdCBieXRlCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICpkZXN0KysgPSBjaDsKLSAgICAgICAgICAgICpkZXN0KysgPSBjaDE7Ci0gICAgICAgICAgICAqZGVzdCsrID0gY2gyOwotICAgICAgICB9Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgfQotCi0gICAgKmRlc3QrKyA9IDA7Ci0gICAgbUJ5dGVDb3VudCA9IGRlc3QgLSAoY2hhciopbUJ1ZmZlcjsKLSAgICBtQ2hhckNvdW50ID0gY291bnQ7CisgICAgbVN0cmluZyA9IHN0ZDo6c3RyaW5nKHNyYyk7CiB9CiAKIHZvaWQgTXRwU3RyaW5nQnVmZmVyOjpzZXQoY29uc3QgdWludDE2X3QqIHNyYykgewotICAgIGludCBjb3VudCA9IDA7Ci0gICAgdWludDE2X3QgY2g7Ci0gICAgdWludDhfdCogZGVzdCA9IG1CdWZmZXI7Ci0KLSAgICB3aGlsZSAoKGNoID0gKnNyYysrKSAhPSAwICYmIGNvdW50IDwgTVRQX1NUUklOR19NQVhfQ0hBUkFDVEVSX05VTUJFUikgewotICAgICAgICBpZiAoY2ggPj0gMHgwODAwKSB7Ci0gICAgICAgICAgICAqZGVzdCsrID0gKHVpbnQ4X3QpKDB4RTAgfCAoY2ggPj4gMTIpKTsKLSAgICAgICAgICAgICpkZXN0KysgPSAodWludDhfdCkoMHg4MCB8ICgoY2ggPj4gNikgJiAweDNGKSk7Ci0gICAgICAgICAgICAqZGVzdCsrID0gKHVpbnQ4X3QpKDB4ODAgfCAoY2ggJiAweDNGKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gMHg4MCkgewotICAgICAgICAgICAgKmRlc3QrKyA9ICh1aW50OF90KSgweEMwIHwgKGNoID4+IDYpKTsKLSAgICAgICAgICAgICpkZXN0KysgPSAodWludDhfdCkoMHg4MCB8IChjaCAmIDB4M0YpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpkZXN0KysgPSBjaDsKLSAgICAgICAgfQotICAgICAgICBjb3VudCsrOwotICAgIH0KLSAgICAqZGVzdCsrID0gMDsKLSAgICBtQ2hhckNvdW50ID0gY291bnQ7Ci0gICAgbUJ5dGVDb3VudCA9IGRlc3QgLSBtQnVmZmVyOworICAgIG1TdHJpbmcgPSB1dGYxNlRvVXRmOChzdGQ6OnUxNnN0cmluZygoY29uc3QgY2hhcjE2X3QqKXNyYykpOwogfQogCiBib29sIE10cFN0cmluZ0J1ZmZlcjo6cmVhZEZyb21QYWNrZXQoTXRwRGF0YVBhY2tldCogcGFja2V0KSB7CiAgICAgdWludDhfdCBjb3VudDsKICAgICBpZiAoIXBhY2tldC0+Z2V0VUludDgoY291bnQpKQogICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGNvdW50ID09IDApCisgICAgICAgIHJldHVybiB0cnVlOwogCi0gICAgdWludDhfdCogZGVzdCA9IG1CdWZmZXI7CisgICAgc3RkOjp2ZWN0b3I8Y2hhcjE2X3Q+IGJ1ZmZlcihjb3VudCk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgIHVpbnQxNl90IGNoOwotCiAgICAgICAgIGlmICghcGFja2V0LT5nZXRVSW50MTYoY2gpKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoY2ggPj0gMHgwODAwKSB7Ci0gICAgICAgICAgICAqZGVzdCsrID0gKHVpbnQ4X3QpKDB4RTAgfCAoY2ggPj4gMTIpKTsKLSAgICAgICAgICAgICpkZXN0KysgPSAodWludDhfdCkoMHg4MCB8ICgoY2ggPj4gNikgJiAweDNGKSk7Ci0gICAgICAgICAgICAqZGVzdCsrID0gKHVpbnQ4X3QpKDB4ODAgfCAoY2ggJiAweDNGKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gMHg4MCkgewotICAgICAgICAgICAgKmRlc3QrKyA9ICh1aW50OF90KSgweEMwIHwgKGNoID4+IDYpKTsKLSAgICAgICAgICAgICpkZXN0KysgPSAodWludDhfdCkoMHg4MCB8IChjaCAmIDB4M0YpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpkZXN0KysgPSBjaDsKLSAgICAgICAgfQorICAgICAgICBidWZmZXJbaV0gPSBjaDsKICAgICB9Ci0gICAgKmRlc3QrKyA9IDA7Ci0gICAgbUNoYXJDb3VudCA9IGNvdW50OwotICAgIG1CeXRlQ291bnQgPSBkZXN0IC0gbUJ1ZmZlcjsKKyAgICBpZiAoYnVmZmVyW2NvdW50LTFdICE9ICdcMCcpIHsKKyAgICAgICAgQUxPR0UoIk10cCBzdHJpbmcgbm90IG51bGwgdGVybWluYXRlZFxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbVN0cmluZyA9IHV0ZjE2VG9VdGY4KHN0ZDo6dTE2c3RyaW5nKGJ1ZmZlci5kYXRhKCkpKTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBNdHBTdHJpbmdCdWZmZXI6OndyaXRlVG9QYWNrZXQoTXRwRGF0YVBhY2tldCogcGFja2V0KSBjb25zdCB7Ci0gICAgaW50IGNvdW50ID0gbUNoYXJDb3VudDsKLSAgICBjb25zdCB1aW50OF90KiBzcmMgPSBtQnVmZmVyOwotICAgIHBhY2tldC0+cHV0VUludDgoY291bnQgPiAwID8gY291bnQgKyAxIDogMCk7CisgICAgc3RkOjp1MTZzdHJpbmcgc3JjMTYgPSB1dGY4VG9VdGYxNihtU3RyaW5nKTsKKyAgICBpbnQgY291bnQgPSBzcmMxNi5sZW5ndGgoKTsKIAotICAgIC8vIGV4cGFuZCB1dGY4IHRvIDE2IGJpdCBjaGFycwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICB1aW50MTZfdCBjaDsKLSAgICAgICAgdWludDE2X3QgY2gxID0gKnNyYysrOwotICAgICAgICBpZiAoKGNoMSAmIDB4ODApID09IDApIHsKLSAgICAgICAgICAgIC8vIHNpbmdsZSBieXRlIGNoYXJhY3RlcgotICAgICAgICAgICAgY2ggPSBjaDE7Ci0gICAgICAgIH0gZWxzZSBpZiAoKGNoMSAmIDB4RTApID09IDB4QzApIHsKLSAgICAgICAgICAgIC8vIHR3byBieXRlIGNoYXJhY3RlcgotICAgICAgICAgICAgdWludDE2X3QgY2gyID0gKnNyYysrOwotICAgICAgICAgICAgY2ggPSAoKGNoMSAmIDB4MUYpIDw8IDYpIHwgKGNoMiAmIDB4M0YpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gdGhyZWUgYnl0ZSBjaGFyYWN0ZXIKLSAgICAgICAgICAgIHVpbnQxNl90IGNoMiA9ICpzcmMrKzsKLSAgICAgICAgICAgIHVpbnQxNl90IGNoMyA9ICpzcmMrKzsKLSAgICAgICAgICAgIGNoID0gKChjaDEgJiAweDBGKSA8PCAxMikgfCAoKGNoMiAmIDB4M0YpIDw8IDYpIHwgKGNoMyAmIDB4M0YpOworICAgIGlmIChjb3VudCA9PSAwKSB7CisgICAgICAgIHBhY2tldC0+cHV0VUludDgoMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcGFja2V0LT5wdXRVSW50OChzdGQ6Om1pbihjb3VudCArIDEsIE1UUF9TVFJJTkdfTUFYX0NIQVJBQ1RFUl9OVU1CRVIpKTsKKworICAgIGludCBpID0gMDsKKyAgICBmb3IgKGNoYXIxNl90ICZjIDogc3JjMTYpIHsKKyAgICAgICAgaWYgKGkgPT0gTVRQX1NUUklOR19NQVhfQ0hBUkFDVEVSX05VTUJFUiAtIDEpIHsKKyAgICAgICAgICAgIC8vIExlYXZlIGEgc2xvdCBmb3IgbnVsbCB0ZXJtaW5hdGlvbi4KKyAgICAgICAgICAgIEFMT0dJKCJNdHAgdHJ1bmNhdGluZyBsb25nIHN0cmluZ1xuIik7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBwYWNrZXQtPnB1dFVJbnQxNihjaCk7CisgICAgICAgIHBhY2tldC0+cHV0VUludDE2KGMpOworICAgICAgICBpKys7CiAgICAgfQogICAgIC8vIG9ubHkgdGVybWluYXRlIHdpdGggemVybyBpZiBzdHJpbmcgaXMgbm90IGVtcHR5Ci0gICAgaWYgKGNvdW50ID4gMCkKLSAgICAgICAgcGFja2V0LT5wdXRVSW50MTYoMCk7CisgICAgcGFja2V0LT5wdXRVSW50MTYoMCk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU3RyaW5nQnVmZmVyLmggYi9tZWRpYS9tdHAvTXRwU3RyaW5nQnVmZmVyLmgKaW5kZXggYmNmMmE0OC4uNGNlYzU4YSAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFN0cmluZ0J1ZmZlci5oCisrKyBiL21lZGlhL210cC9NdHBTdHJpbmdCdWZmZXIuaApAQCAtMTcsNyArMTcsOSBAQAogI2lmbmRlZiBfTVRQX1NUUklOR19CVUZGRVJfSAogI2RlZmluZSBfTVRQX1NUUklOR19CVUZGRVJfSAogCisjaW5jbHVkZSA8bG9nL2xvZy5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZz4KIAogLy8gTWF4IENoYXJhY3RlciBudW1iZXIgb2YgYSBNVFAgU3RyaW5nCiAjZGVmaW5lIE1UUF9TVFJJTkdfTUFYX0NIQVJBQ1RFUl9OVU1CRVIgICAgICAgICAgICAgMjU1CkBAIC0zMCwzMSArMzIsMzkgQEAKIGNsYXNzIE10cFN0cmluZ0J1ZmZlciB7CiAKIHByaXZhdGU6Ci0gICAgLy8gbUJ1ZmZlciBjb250YWlucyBzdHJpbmcgaW4gVVRGOCBmb3JtYXQKLSAgICAvLyBtYXhpbXVtIDMgYnl0ZXMvY2hhcmFjdGVyLCB3aXRoIDEgZXh0cmEgZm9yIHplcm8gdGVybWluYXRpb24KLSAgICB1aW50OF90ICAgICAgICAgbUJ1ZmZlcltNVFBfU1RSSU5HX01BWF9DSEFSQUNURVJfTlVNQkVSICogMyArIDFdOwotICAgIGludCAgICAgICAgICAgICBtQ2hhckNvdW50OwotICAgIGludCAgICAgICAgICAgICBtQnl0ZUNvdW50OworICAgIHN0ZDo6c3RyaW5nICAgICBtU3RyaW5nOwogCiBwdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgIE10cFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgICAgICAgICBNdHBTdHJpbmdCdWZmZXIoKSB7fTsKKyAgICAgICAgICAgICAgICAgICAgfk10cFN0cmluZ0J1ZmZlcigpIHt9OworCiAgICAgZXhwbGljaXQgICAgICAgIE10cFN0cmluZ0J1ZmZlcihjb25zdCBjaGFyKiBzcmMpOwogICAgIGV4cGxpY2l0ICAgICAgICBNdHBTdHJpbmdCdWZmZXIoY29uc3QgdWludDE2X3QqIHNyYyk7CiAgICAgICAgICAgICAgICAgICAgIE10cFN0cmluZ0J1ZmZlcihjb25zdCBNdHBTdHJpbmdCdWZmZXImIHNyYyk7Ci0gICAgdmlydHVhbCAgICAgICAgIH5NdHBTdHJpbmdCdWZmZXIoKTsKIAogICAgIHZvaWQgICAgICAgICAgICBzZXQoY29uc3QgY2hhciogc3JjKTsKICAgICB2b2lkICAgICAgICAgICAgc2V0KGNvbnN0IHVpbnQxNl90KiBzcmMpOwogCisgICAgaW5saW5lIHZvaWQgICAgIGFwcGVuZChjb25zdCBjaGFyKiBvdGhlcik7CisgICAgaW5saW5lIHZvaWQgICAgIGFwcGVuZChNdHBTdHJpbmdCdWZmZXIgJm90aGVyKTsKKwogICAgIGJvb2wgICAgICAgICAgICByZWFkRnJvbVBhY2tldChNdHBEYXRhUGFja2V0KiBwYWNrZXQpOwogICAgIHZvaWQgICAgICAgICAgICB3cml0ZVRvUGFja2V0KE10cERhdGFQYWNrZXQqIHBhY2tldCkgY29uc3Q7CiAKLSAgICBpbmxpbmUgaW50ICAgICAgZ2V0Q2hhckNvdW50KCkgY29uc3QgeyByZXR1cm4gbUNoYXJDb3VudDsgfQotICAgIGlubGluZSBpbnQgICAgICBnZXRCeXRlQ291bnQoKSBjb25zdCB7IHJldHVybiBtQnl0ZUNvdW50OyB9CisgICAgaW5saW5lIGJvb2wgICAgIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBtU3RyaW5nLmVtcHR5KCk7IH0KKyAgICBpbmxpbmUgaW50ICAgICAgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1TdHJpbmcubGVuZ3RoKCk7IH0KIAotCWlubGluZSBvcGVyYXRvciBjb25zdCBjaGFyKigpIGNvbnN0IHsgcmV0dXJuIChjb25zdCBjaGFyICopbUJ1ZmZlcjsgfQorICAgIGlubGluZSBvcGVyYXRvciBjb25zdCBjaGFyKigpIGNvbnN0IHsgcmV0dXJuIG1TdHJpbmcuY19zdHIoKTsgfQogfTsKIAoraW5saW5lIHZvaWQgTXRwU3RyaW5nQnVmZmVyOjphcHBlbmQoY29uc3QgY2hhciogb3RoZXIpIHsKKyAgICBtU3RyaW5nICs9IG90aGVyOworfQorCitpbmxpbmUgdm9pZCBNdHBTdHJpbmdCdWZmZXI6OmFwcGVuZChNdHBTdHJpbmdCdWZmZXIgJm90aGVyKSB7CisgICAgbVN0cmluZyArPSBvdGhlci5tU3RyaW5nOworfQorCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLy8gX01UUF9TVFJJTkdfQlVGRkVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBUeXBlcy5oIGIvbWVkaWEvbXRwL010cFR5cGVzLmgKaW5kZXggYzc0OWM2Ni4uZTZhYzIzYyAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFR5cGVzLmgKKysrIGIvbWVkaWEvbXRwL010cFR5cGVzLmgKQEAgLTE4LDggKzE4LDcgQEAKICNkZWZpbmUgX01UUF9UWVBFU19ICiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlICJ1dGlscy9TdHJpbmc4LmgiCi0jaW5jbHVkZSAidXRpbHMvVmVjdG9yLmgiCisjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTUxLDE4ICs1MCwxOCBAQAogY2xhc3MgTXRwRGV2aWNlOwogY2xhc3MgTXRwUHJvcGVydHk7CiAKLXR5cGVkZWYgVmVjdG9yPE10cFN0b3JhZ2UgKj4gTXRwU3RvcmFnZUxpc3Q7Ci10eXBlZGVmIFZlY3RvcjxNdHBEZXZpY2UqPiBNdHBEZXZpY2VMaXN0OwotdHlwZWRlZiBWZWN0b3I8TXRwUHJvcGVydHkqPiBNdHBQcm9wZXJ0eUxpc3Q7Cit0eXBlZGVmIHN0ZDo6dmVjdG9yPE10cFN0b3JhZ2UgKj4gTXRwU3RvcmFnZUxpc3Q7Cit0eXBlZGVmIHN0ZDo6dmVjdG9yPE10cERldmljZSo+IE10cERldmljZUxpc3Q7Cit0eXBlZGVmIHN0ZDo6dmVjdG9yPE10cFByb3BlcnR5Kj4gTXRwUHJvcGVydHlMaXN0OwogCi10eXBlZGVmIFZlY3Rvcjx1aW50OF90PiBVSW50OExpc3Q7Ci10eXBlZGVmIFZlY3Rvcjx1aW50MTZfdD4gVUludDE2TGlzdDsKLXR5cGVkZWYgVmVjdG9yPHVpbnQzMl90PiBVSW50MzJMaXN0OwotdHlwZWRlZiBWZWN0b3I8dWludDY0X3Q+IFVJbnQ2NExpc3Q7Ci10eXBlZGVmIFZlY3RvcjxpbnQ4X3Q+IEludDhMaXN0OwotdHlwZWRlZiBWZWN0b3I8aW50MTZfdD4gSW50MTZMaXN0OwotdHlwZWRlZiBWZWN0b3I8aW50MzJfdD4gSW50MzJMaXN0OwotdHlwZWRlZiBWZWN0b3I8aW50NjRfdD4gSW50NjRMaXN0OwordHlwZWRlZiBzdGQ6OnZlY3Rvcjx1aW50OF90PiBVSW50OExpc3Q7Cit0eXBlZGVmIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBVSW50MTZMaXN0OwordHlwZWRlZiBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gVUludDMyTGlzdDsKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IFVJbnQ2NExpc3Q7Cit0eXBlZGVmIHN0ZDo6dmVjdG9yPGludDhfdD4gSW50OExpc3Q7Cit0eXBlZGVmIHN0ZDo6dmVjdG9yPGludDE2X3Q+IEludDE2TGlzdDsKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8aW50MzJfdD4gSW50MzJMaXN0OwordHlwZWRlZiBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBJbnQ2NExpc3Q7CiAKIHR5cGVkZWYgVUludDE2TGlzdCBNdHBPYmplY3RQcm9wZXJ0eUxpc3Q7CiB0eXBlZGVmIFVJbnQxNkxpc3QgTXRwRGV2aWNlUHJvcGVydHlMaXN0OwpAQCAtNzEsOCArNzAsNiBAQAogdHlwZWRlZiBVSW50MTZMaXN0IE10cE9iamVjdFByb3BlcnR5TGlzdDsKIHR5cGVkZWYgVUludDMyTGlzdCBNdHBTdG9yYWdlSURMaXN0OwogCi10eXBlZGVmIFN0cmluZzggICAgTXRwU3RyaW5nOwotCiBlbnVtIFVyYlBhY2tldERpdmlzaW9uTW9kZSB7CiAgICAgLy8gRmlyc3QgcGFja2V0IG9ubHkgY29udGFpbnMgYSBoZWFkZXIuCiAgICAgRklSU1RfUEFDS0VUX09OTFlfSEVBREVSLApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFV0aWxzLmNwcCBiL21lZGlhL210cC9NdHBVdGlscy5jcHAKaW5kZXggZWJmMzYwMS4uNTFjZmQ3ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFV0aWxzLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwVXRpbHMuY3BwCkBAIC0xNiwxMyArMTYsMjYgQEAKIAogI2RlZmluZSBMT0dfVEFHICJNdHBVdGlscyIKIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN5cy9zZW5kZmlsZS5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlICJNdHBVdGlscy5oIgogCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK2NvbnN0ZXhwciB1bnNpZ25lZCBsb25nIEZJTEVfQ09QWV9TSVpFID0gMjYyMTQ0OworCiAvKgogRGF0ZVRpbWUgc3RyaW5ncyBmb2xsb3cgYSBjb21wYXRpYmxlIHN1YnNldCBvZiB0aGUgZGVmaW5pdGlvbiBmb3VuZCBpbiBJU08gODYwMSwgYW5kCiB0YWtlIHRoZSBmb3JtIG9mIGEgVW5pY29kZSBzdHJpbmcgZm9ybWF0dGVkIGFzOiAiWVlZWU1NRERUaGhtbXNzLnMiLiBJbiB0aGlzCkBAIC03OCw0ICs5MSwxNTIgQEAKICAgICAgICAgdG0udG1fbWRheSwgdG0udG1faG91ciwgdG0udG1fbWluLCB0bS50bV9zZWMpOwogfQogCitpbnQgbWFrZUZvbGRlcihjb25zdCBjaGFyICpwYXRoKSB7CisgICAgbW9kZV90IG1hc2sgPSB1bWFzaygwKTsKKyAgICBpbnQgcmV0ID0gbWtkaXIoKGNvbnN0IGNoYXIgKilwYXRoLCBESVJfUEVSTSk7CisgICAgdW1hc2sobWFzayk7CisgICAgaWYgKHJldCAmJiByZXQgIT0gLUVFWElTVCkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBmb2xkZXIgIiA8PCBwYXRoOworICAgICAgICByZXQgPSAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICBjaG93bigoY29uc3QgY2hhciAqKXBhdGgsIGdldHVpZCgpLCBGSUxFX0dST1VQKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBDb3BpZXMgdGFyZ2V0IHBhdGggYW5kIGFsbCBjaGlsZHJlbiB0byBkZXN0aW5hdGlvbiBwYXRoLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgdmFsdWUgaW5kaWNhdGluZyBudW1iZXIgb2YgZmFpbHVyZXMKKyAqLworaW50IGNvcHlSZWN1cnNpdmUoY29uc3QgY2hhciAqZnJvbVBhdGgsIGNvbnN0IGNoYXIgKnRvUGF0aCkgeworICAgIGludCByZXQgPSAwOworICAgIHN0cmluZyBmcm9tUGF0aFN0cihmcm9tUGF0aCk7CisgICAgc3RyaW5nIHRvUGF0aFN0cih0b1BhdGgpOworCisgICAgRElSKiBkaXIgPSBvcGVuZGlyKGZyb21QYXRoKTsKKyAgICBpZiAoIWRpcikgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAib3BlbmRpciAiIDw8IGZyb21QYXRoIDw8ICIgZmFpbGVkIjsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoZnJvbVBhdGhTdHJbZnJvbVBhdGhTdHIuc2l6ZSgpLTFdICE9ICcvJykKKyAgICAgICAgZnJvbVBhdGhTdHIgKz0gJy8nOworICAgIGlmICh0b1BhdGhTdHJbdG9QYXRoU3RyLnNpemUoKS0xXSAhPSAnLycpCisgICAgICAgIHRvUGF0aFN0ciArPSAnLyc7CisKKyAgICBzdHJ1Y3QgZGlyZW50KiBlbnRyeTsKKyAgICB3aGlsZSAoKGVudHJ5ID0gcmVhZGRpcihkaXIpKSkgeworICAgICAgICBjb25zdCBjaGFyKiBuYW1lID0gZW50cnktPmRfbmFtZTsKKworICAgICAgICAvLyBpZ25vcmUgIi4iIGFuZCAiLi4iCisgICAgICAgIGlmIChuYW1lWzBdID09ICcuJyAmJiAobmFtZVsxXSA9PSAwIHx8IChuYW1lWzFdID09ICcuJyAmJiBuYW1lWzJdID09IDApKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3RyaW5nIG9sZEZpbGUgPSBmcm9tUGF0aFN0ciArIG5hbWU7CisgICAgICAgIHN0cmluZyBuZXdGaWxlID0gdG9QYXRoU3RyICsgbmFtZTsKKworICAgICAgICBpZiAoZW50cnktPmRfdHlwZSA9PSBEVF9ESVIpIHsKKyAgICAgICAgICAgIHJldCArPSBtYWtlRm9sZGVyKG5ld0ZpbGUuY19zdHIoKSk7CisgICAgICAgICAgICByZXQgKz0gY29weVJlY3Vyc2l2ZShvbGRGaWxlLmNfc3RyKCksIG5ld0ZpbGUuY19zdHIoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgKz0gY29weUZpbGUob2xkRmlsZS5jX3N0cigpLCBuZXdGaWxlLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBjb3B5RmlsZShjb25zdCBjaGFyICpmcm9tUGF0aCwgY29uc3QgY2hhciAqdG9QYXRoKSB7CisgICAgYXV0byBzdGFydCA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOworCisgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGZyb21GZChvcGVuKGZyb21QYXRoLCBPX1JET05MWSkpOworICAgIGlmIChmcm9tRmQgPT0gLTEpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBvcGVuIGNvcHkgZnJvbSAiIDw8IGZyb21QYXRoOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCB0b0ZkKG9wZW4odG9QYXRoLCBPX0NSRUFUIHwgT19XUk9OTFksIEZJTEVfUEVSTSkpOworICAgIGlmICh0b0ZkID09IC0xKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gb3BlbiBjb3B5IHRvICIgPDwgdG9QYXRoOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG9mZl90IG9mZnNldCA9IDA7CisKKyAgICBzdHJ1Y3Qgc3RhdCBzc3RhdCA9IHt9OworICAgIGlmIChzdGF0KGZyb21QYXRoLCAmc3N0YXQpID09IC0xKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBvZmZfdCBsZW5ndGggPSBzc3RhdC5zdF9zaXplOworICAgIGludCByZXQgPSAwOworCisgICAgd2hpbGUgKG9mZnNldCA8IGxlbmd0aCkgeworICAgICAgICBzc2l6ZV90IHRyYW5zZmVyX2xlbmd0aCA9IHN0ZDo6bWluKGxlbmd0aCAtIG9mZnNldCwgKG9mZl90KSBGSUxFX0NPUFlfU0laRSk7CisgICAgICAgIHJldCA9IHNlbmRmaWxlKHRvRmQsIGZyb21GZCwgJm9mZnNldCwgdHJhbnNmZXJfbGVuZ3RoKTsKKyAgICAgICAgaWYgKHJldCAhPSB0cmFuc2Zlcl9sZW5ndGgpIHsKKyAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkNvcHlpbmcgZmFpbGVkISI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdXRvIGVuZCA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOworICAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGU+IGRpZmYgPSBlbmQgLSBzdGFydDsKKyAgICBMT0coREVCVUcpIDw8ICJDb3BpZWQgYSBmaWxlIHdpdGggTVRQLiBUaW1lOiAiIDw8IGRpZmYuY291bnQoKSA8PCAiIHMsIFNpemU6ICIgPDwgbGVuZ3RoIDw8CisgICAgICAgICIsIFJhdGU6ICIgPDwgKChkb3VibGUpIGxlbmd0aCkgLyBkaWZmLmNvdW50KCkgPDwgIiBieXRlcy9zIjsKKyAgICBjaG93bih0b1BhdGgsIGdldHVpZCgpLCBGSUxFX0dST1VQKTsKKyAgICByZXR1cm4gcmV0ID09IC0xID8gLTEgOiAwOworfQorCit2b2lkIGRlbGV0ZVJlY3Vyc2l2ZShjb25zdCBjaGFyKiBwYXRoKSB7CisgICAgc3RyaW5nIHBhdGhTdHIocGF0aCk7CisgICAgaWYgKHBhdGhTdHJbcGF0aFN0ci5zaXplKCktMV0gIT0gJy8nKSB7CisgICAgICAgIHBhdGhTdHIgKz0gJy8nOworICAgIH0KKworICAgIERJUiogZGlyID0gb3BlbmRpcihwYXRoKTsKKyAgICBpZiAoIWRpcikgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAib3BlbmRpciAiIDw8IHBhdGggPDwgIiBmYWlsZWQiOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RydWN0IGRpcmVudCogZW50cnk7CisgICAgd2hpbGUgKChlbnRyeSA9IHJlYWRkaXIoZGlyKSkpIHsKKyAgICAgICAgY29uc3QgY2hhciogbmFtZSA9IGVudHJ5LT5kX25hbWU7CisKKyAgICAgICAgLy8gaWdub3JlICIuIiBhbmQgIi4uIgorICAgICAgICBpZiAobmFtZVswXSA9PSAnLicgJiYgKG5hbWVbMV0gPT0gMCB8fCAobmFtZVsxXSA9PSAnLicgJiYgbmFtZVsyXSA9PSAwKSkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0cmluZyBjaGlsZFBhdGggPSBwYXRoU3RyICsgbmFtZTsKKyAgICAgICAgaW50IHN1Y2Nlc3M7CisgICAgICAgIGlmIChlbnRyeS0+ZF90eXBlID09IERUX0RJUikgeworICAgICAgICAgICAgZGVsZXRlUmVjdXJzaXZlKGNoaWxkUGF0aC5jX3N0cigpKTsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBybWRpcihjaGlsZFBhdGguY19zdHIoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdWNjZXNzID0gdW5saW5rKGNoaWxkUGF0aC5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3VjY2VzcyA9PSAtMSkKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJEZWxldGluZyBwYXRoICIgPDwgY2hpbGRQYXRoIDw8ICIgZmFpbGVkIjsKKyAgICB9CisgICAgY2xvc2VkaXIoZGlyKTsKK30KKworYm9vbCBkZWxldGVQYXRoKGNvbnN0IGNoYXIqIHBhdGgpIHsKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworICAgIGludCBzdWNjZXNzOworICAgIGlmIChzdGF0KHBhdGgsICZzdGF0YnVmKSA9PSAwKSB7CisgICAgICAgIGlmIChTX0lTRElSKHN0YXRidWYuc3RfbW9kZSkpIHsKKyAgICAgICAgICAgIC8vIHJtZGlyIHdpbGwgZmFpbCBpZiB0aGUgZGlyZWN0b3J5IGlzIG5vbiBlbXB0eSwgc28KKyAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIG5lZWQgdG8ga2VlcCBlcnJvcnMgZnJvbSBkZWxldGVSZWN1cnNpdmUKKyAgICAgICAgICAgIGRlbGV0ZVJlY3Vyc2l2ZShwYXRoKTsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBybWRpcihwYXRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSB1bmxpbmsocGF0aCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiZGVsZXRlUGF0aCBzdGF0IGZhaWxlZCBmb3IgIiA8PCBwYXRoOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChzdWNjZXNzID09IC0xKQorICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRGVsZXRpbmcgcGF0aCAiIDw8IHBhdGggPDwgIiBmYWlsZWQiOworICAgIHJldHVybiBzdWNjZXNzID09IDA7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwVXRpbHMuaCBiL21lZGlhL210cC9NdHBVdGlscy5oCmluZGV4IDYxZjkwNTUuLjc0NDU0NmIgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBVdGlscy5oCisrKyBiL21lZGlhL210cC9NdHBVdGlscy5oCkBAIC0xNywxMyArMTcsMjQgQEAKICNpZm5kZWYgX01UUF9VVElMU19ICiAjZGVmaW5lIF9NVFBfVVRJTFNfSAogCisjaW5jbHVkZSAicHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmgiCisKICNpbmNsdWRlIDxzdGRpbnQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitjb25zdGV4cHIgaW50IEZJTEVfR1JPVVAgPSBBSURfTUVESUFfUlc7Citjb25zdGV4cHIgaW50IEZJTEVfUEVSTSA9IDA2NjQ7Citjb25zdGV4cHIgaW50IERJUl9QRVJNID0gMDc3NTsKKwogYm9vbCBwYXJzZURhdGVUaW1lKGNvbnN0IGNoYXIqIGRhdGVUaW1lLCB0aW1lX3QmIG91dFNlY29uZHMpOwogdm9pZCBmb3JtYXREYXRlVGltZSh0aW1lX3Qgc2Vjb25kcywgY2hhciogYnVmZmVyLCBpbnQgYnVmZmVyTGVuZ3RoKTsKIAoraW50IG1ha2VGb2xkZXIoY29uc3QgY2hhciAqcGF0aCk7CitpbnQgY29weVJlY3Vyc2l2ZShjb25zdCBjaGFyICpmcm9tUGF0aCwgY29uc3QgY2hhciAqdG9QYXRoKTsKK2ludCBjb3B5RmlsZShjb25zdCBjaGFyICpmcm9tUGF0aCwgY29uc3QgY2hhciAqdG9QYXRoKTsKK2Jvb2wgZGVsZXRlUGF0aChjb25zdCBjaGFyKiBwYXRoKTsKKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vIF9NVFBfVVRJTFNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL09XTkVSUyBiL21lZGlhL210cC9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE5MzA3YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9PV05FUlMKQEAgLTAsMCArMSBAQAoremhhbmdqZXJyeUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvUG9zaXhBc3luY0lPLmNwcCBiL21lZGlhL210cC9Qb3NpeEFzeW5jSU8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2N2M1NjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvUG9zaXhBc3luY0lPLmNwcApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIlBvc2l4QXN5bmNJTy5oIgorCituYW1lc3BhY2UgeworCit2b2lkIHJlYWRfZnVuYyhzdHJ1Y3QgYWlvY2IgKmFpb2NicCkgeworICAgIGFpb2NicC0+cmV0ID0gVEVNUF9GQUlMVVJFX1JFVFJZKHByZWFkKGFpb2NicC0+YWlvX2ZpbGRlcywKKyAgICAgICAgICAgICAgICBhaW9jYnAtPmFpb19idWYsIGFpb2NicC0+YWlvX25ieXRlcywgYWlvY2JwLT5haW9fb2Zmc2V0KSk7CisgICAgaWYgKGFpb2NicC0+cmV0ID09IC0xKSBhaW9jYnAtPmVycm9yID0gZXJybm87Cit9CisKK3ZvaWQgd3JpdGVfZnVuYyhzdHJ1Y3QgYWlvY2IgKmFpb2NicCkgeworICAgIGFpb2NicC0+cmV0ID0gVEVNUF9GQUlMVVJFX1JFVFJZKHB3cml0ZShhaW9jYnAtPmFpb19maWxkZXMsCisgICAgICAgICAgICAgICAgYWlvY2JwLT5haW9fYnVmLCBhaW9jYnAtPmFpb19uYnl0ZXMsIGFpb2NicC0+YWlvX29mZnNldCkpOworICAgIGlmIChhaW9jYnAtPnJldCA9PSAtMSkgYWlvY2JwLT5lcnJvciA9IGVycm5vOworfQorCit9IC8vIGVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2Fpb2NiOjp+YWlvY2IoKSB7CisgICAgQ0hFQ0soIXRocmVhZC5qb2luYWJsZSgpKTsKK30KKworaW50IGFpb19yZWFkKHN0cnVjdCBhaW9jYiAqYWlvY2JwKSB7CisgICAgYWlvY2JwLT50aHJlYWQgPSBzdGQ6OnRocmVhZChyZWFkX2Z1bmMsIGFpb2NicCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBhaW9fd3JpdGUoc3RydWN0IGFpb2NiICphaW9jYnApIHsKKyAgICBhaW9jYnAtPnRocmVhZCA9IHN0ZDo6dGhyZWFkKHdyaXRlX2Z1bmMsIGFpb2NicCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBhaW9fZXJyb3IoY29uc3Qgc3RydWN0IGFpb2NiICphaW9jYnApIHsKKyAgICByZXR1cm4gYWlvY2JwLT5lcnJvcjsKK30KKworc3NpemVfdCBhaW9fcmV0dXJuKHN0cnVjdCBhaW9jYiAqYWlvY2JwKSB7CisgICAgcmV0dXJuIGFpb2NicC0+cmV0OworfQorCitpbnQgYWlvX3N1c3BlbmQoc3RydWN0IGFpb2NiICphaW9jYnBbXSwgaW50IG4sCisgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgYWlvY2JwW2ldLT50aHJlYWQuam9pbigpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBhaW9fcHJlcGFyZShzdHJ1Y3QgYWlvY2IgKmFpb2NicCwgdm9pZCogYnVmLCBzaXplX3QgY291bnQsIG9mZl90IG9mZnNldCkgeworICAgIGFpb2NicC0+YWlvX2J1ZiA9IGJ1ZjsKKyAgICBhaW9jYnAtPmFpb19vZmZzZXQgPSBvZmZzZXQ7CisgICAgYWlvY2JwLT5haW9fbmJ5dGVzID0gY291bnQ7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvUG9zaXhBc3luY0lPLmggYi9tZWRpYS9tdHAvUG9zaXhBc3luY0lPLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkwYWFlZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC9Qb3NpeEFzeW5jSU8uaApAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfUE9TSVhBU1lOQ0lPX0gKKyNkZWZpbmUgX1BPU0lYQVNZTkNJT19ICisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisvKioKKyAqIFByb3ZpZGVzIGEgc3Vic2V0IG9mIFBPU0lYIGFpbyBvcGVyYXRpb25zLgorICovCisKK3N0cnVjdCBhaW9jYiB7CisgICAgaW50IGFpb19maWxkZXM7CisgICAgdm9pZCAqYWlvX2J1ZjsKKworICAgIG9mZl90IGFpb19vZmZzZXQ7CisgICAgc2l6ZV90IGFpb19uYnl0ZXM7CisKKyAgICAvLyBVc2VkIGludGVybmFsbHkKKyAgICBzdGQ6OnRocmVhZCB0aHJlYWQ7CisgICAgc3NpemVfdCByZXQ7CisgICAgaW50IGVycm9yOworCisgICAgfmFpb2NiKCk7Cit9OworCisvLyBTdWJtaXQgYSByZXF1ZXN0IGZvciBJTyB0byBiZSBjb21wbGV0ZWQKK2ludCBhaW9fcmVhZChzdHJ1Y3QgYWlvY2IgKik7CitpbnQgYWlvX3dyaXRlKHN0cnVjdCBhaW9jYiAqKTsKKworLy8gU3VzcGVuZCBjdXJyZW50IHRocmVhZCB1bnRpbCBnaXZlbiBJTyBpcyBjb21wbGV0ZSwgYXQgd2hpY2ggcG9pbnQKKy8vIGl0cyByZXR1cm4gdmFsdWUgYW5kIGFueSBlcnJvcnMgY2FuIGJlIGFjY2Vzc2VkCisvLyBBbGwgc3VibWl0dGVkIHJlcXVlc3RzIG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgc3VzcGVuZC4KKy8vIGFpb2NiLT5haW9fYnVmIG11c3QgcmVmZXIgdG8gdmFsaWQgbWVtb3J5IHVudGlsIGFmdGVyIHRoZSBzdXNwZW5kIGNhbGwKK2ludCBhaW9fc3VzcGVuZChzdHJ1Y3QgYWlvY2IgKltdLCBpbnQsIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqKTsKK2ludCBhaW9fZXJyb3IoY29uc3Qgc3RydWN0IGFpb2NiICopOworc3NpemVfdCBhaW9fcmV0dXJuKHN0cnVjdCBhaW9jYiAqKTsKKworLy8gSGVscGVyIG1ldGhvZCBmb3Igc2V0dGluZyBhaW9jYiBtZW1iZXJzCit2b2lkIGFpb19wcmVwYXJlKHN0cnVjdCBhaW9jYiAqLCB2b2lkKiwgc2l6ZV90LCBvZmZfdCk7CisKKyNlbmRpZiAvLyBQT1NJWEFTWU5DSU9fSAorCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL210cC90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGZlNzAxOGIuLjA3NTAyMDggMTAwNjQ0Ci0tLSBhL21lZGlhL210cC90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL210cC90ZXN0cy9BbmRyb2lkLmJwCkBAIC0zMSw4ICszMSw5IEBACiB9CiAKIGNjX3Rlc3QgewotICAgIG5hbWU6ICJhc3luY19pb190ZXN0IiwKLSAgICBzcmNzOiBbIkFzeW5jSU9fdGVzdC5jcHAiXSwKKyAgICBuYW1lOiAicG9zaXhfYXN5bmNfaW9fdGVzdCIsCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCisgICAgc3JjczogWyJQb3NpeEFzeW5jSU9fdGVzdC5jcHAiXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJtdHAiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL3Rlc3RzL0FzeW5jSU9fdGVzdC5jcHAgYi9tZWRpYS9tdHAvdGVzdHMvQXN5bmNJT190ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVmNDUzOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9tdHAvdGVzdHMvQXN5bmNJT190ZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2RlZmluZSBMT0dfVEFHICJBc3luY0lPX3Rlc3QuY3BwIgotCi0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Rlc3RfdXRpbHMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQXN5bmNJTy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNvbnN0ZXhwciBpbnQgVEVTVF9QQUNLRVRfU0laRSA9IDUxMjsKLWNvbnN0ZXhwciBpbnQgUE9PTF9DT1VOVCA9IDEwOwotCi1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgZHVtbXlEYXRhU3RyID0KLSAgICAiLypcbiAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3RcbiAqXG4gKiBMaWNlbnNlZCB1biIKLSAgICAiZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1cyIKLSAgICAiZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgYyIKLSAgICAib3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSIKLSAgICAiLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgcyIKLSAgICAib2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiICIKLSAgICAiQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3MgbyIKLSAgICAiciBpbXBsaWVkLlxuICogU2UiOwotCi0KLWNsYXNzIEFzeW5jSU9UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci1wcm90ZWN0ZWQ6Ci0gICAgVGVtcG9yYXJ5RmlsZSBkdW1teV9maWxlOwotCi0gICAgQXN5bmNJT1Rlc3QoKSB7fQotICAgIH5Bc3luY0lPVGVzdCgpIHt9Ci19OwotCi1URVNUX0YoQXN5bmNJT1Rlc3QsIHRlc3RSZWFkKSB7Ci0gICAgY2hhciBidWZbVEVTVF9QQUNLRVRfU0laRSArIDFdOwotICAgIGJ1ZltURVNUX1BBQ0tFVF9TSVpFXSA9ICdcMCc7Ci0gICAgRVhQRUNUX0VRKHdyaXRlKGR1bW15X2ZpbGUuZmQsIGR1bW15RGF0YVN0ci5jX3N0cigpLCBURVNUX1BBQ0tFVF9TSVpFKSwgVEVTVF9QQUNLRVRfU0laRSk7Ci0gICAgc3RydWN0IGFpb2NiIGFpbzsKLSAgICBzdHJ1Y3QgYWlvY2IgKmFpb2xbXSA9IHsmYWlvfTsKLSAgICBhaW8uYWlvX2ZpbGRlcyA9IGR1bW15X2ZpbGUuZmQ7Ci0gICAgYWlvLmFpb19idWYgPSBidWY7Ci0gICAgYWlvLmFpb19vZmZzZXQgPSAwOwotICAgIGFpby5haW9fbmJ5dGVzID0gVEVTVF9QQUNLRVRfU0laRTsKLQotICAgIEVYUEVDVF9FUShhaW9fcmVhZCgmYWlvKSwgMCk7Ci0gICAgRVhQRUNUX0VRKGFpb19zdXNwZW5kKGFpb2wsIDEsIG51bGxwdHIpLCAwKTsKLSAgICBFWFBFQ1RfRVEoYWlvX3JldHVybigmYWlvKSwgVEVTVF9QQUNLRVRfU0laRSk7Ci0gICAgRVhQRUNUX1NUUkVRKGJ1ZiwgZHVtbXlEYXRhU3RyLmNfc3RyKCkpOwotfQotCi1URVNUX0YoQXN5bmNJT1Rlc3QsIHRlc3RXcml0ZSkgewotICAgIGNoYXIgYnVmW1RFU1RfUEFDS0VUX1NJWkUgKyAxXTsKLSAgICBidWZbVEVTVF9QQUNLRVRfU0laRV0gPSAnXDAnOwotICAgIHN0cnVjdCBhaW9jYiBhaW87Ci0gICAgc3RydWN0IGFpb2NiICphaW9sW10gPSB7JmFpb307Ci0gICAgYWlvLmFpb19maWxkZXMgPSBkdW1teV9maWxlLmZkOwotICAgIGFpby5haW9fYnVmID0gY29uc3RfY2FzdDxjaGFyKj4oZHVtbXlEYXRhU3RyLmNfc3RyKCkpOwotICAgIGFpby5haW9fb2Zmc2V0ID0gMDsKLSAgICBhaW8uYWlvX25ieXRlcyA9IFRFU1RfUEFDS0VUX1NJWkU7Ci0KLSAgICBFWFBFQ1RfRVEoYWlvX3dyaXRlKCZhaW8pLCAwKTsKLSAgICBFWFBFQ1RfRVEoYWlvX3N1c3BlbmQoYWlvbCwgMSwgbnVsbHB0ciksIDApOwotICAgIEVYUEVDVF9FUShhaW9fcmV0dXJuKCZhaW8pLCBURVNUX1BBQ0tFVF9TSVpFKTsKLSAgICBFWFBFQ1RfRVEocmVhZChkdW1teV9maWxlLmZkLCBidWYsIFRFU1RfUEFDS0VUX1NJWkUpLCBURVNUX1BBQ0tFVF9TSVpFKTsKLSAgICBFWFBFQ1RfU1RSRVEoYnVmLCBkdW1teURhdGFTdHIuY19zdHIoKSk7Ci19Ci0KLVRFU1RfRihBc3luY0lPVGVzdCwgdGVzdEVycm9yKSB7Ci0gICAgY2hhciBidWZbVEVTVF9QQUNLRVRfU0laRSArIDFdOwotICAgIGJ1ZltURVNUX1BBQ0tFVF9TSVpFXSA9ICdcMCc7Ci0gICAgc3RydWN0IGFpb2NiIGFpbzsKLSAgICBzdHJ1Y3QgYWlvY2IgKmFpb2xbXSA9IHsmYWlvfTsKLSAgICBhaW8uYWlvX2ZpbGRlcyA9IC0xOwotICAgIGFpby5haW9fYnVmID0gY29uc3RfY2FzdDxjaGFyKj4oZHVtbXlEYXRhU3RyLmNfc3RyKCkpOwotICAgIGFpby5haW9fb2Zmc2V0ID0gMDsKLSAgICBhaW8uYWlvX25ieXRlcyA9IFRFU1RfUEFDS0VUX1NJWkU7Ci0KLSAgICBFWFBFQ1RfRVEoYWlvX3dyaXRlKCZhaW8pLCAwKTsKLSAgICBFWFBFQ1RfRVEoYWlvX3N1c3BlbmQoYWlvbCwgMSwgbnVsbHB0ciksIDApOwotICAgIEVYUEVDVF9FUShhaW9fcmV0dXJuKCZhaW8pLCAtMSk7Ci0gICAgRVhQRUNUX0VRKGFpb19lcnJvcigmYWlvKSwgRUJBREYpOwotfQotCi1URVNUX0YoQXN5bmNJT1Rlc3QsIHRlc3RTcGxpY2VSZWFkKSB7Ci0gICAgY2hhciBidWZbVEVTVF9QQUNLRVRfU0laRSArIDFdOwotICAgIGJ1ZltURVNUX1BBQ0tFVF9TSVpFXSA9ICdcMCc7Ci0gICAgaW50IHBpcGVGZFsyXTsKLSAgICBFWFBFQ1RfRVEocGlwZShwaXBlRmQpLCAwKTsKLSAgICBFWFBFQ1RfRVEod3JpdGUoZHVtbXlfZmlsZS5mZCwgZHVtbXlEYXRhU3RyLmNfc3RyKCksIFRFU1RfUEFDS0VUX1NJWkUpLCBURVNUX1BBQ0tFVF9TSVpFKTsKLSAgICBzdHJ1Y3QgYWlvY2IgYWlvOwotICAgIHN0cnVjdCBhaW9jYiAqYWlvbFtdID0geyZhaW99OwotICAgIGFpby5haW9fZmlsZGVzID0gZHVtbXlfZmlsZS5mZDsKLSAgICBhaW8uYWlvX3NpbmsgPSBwaXBlRmRbMV07Ci0gICAgYWlvLmFpb19vZmZzZXQgPSAwOwotICAgIGFpby5haW9fbmJ5dGVzID0gVEVTVF9QQUNLRVRfU0laRTsKLQotICAgIEVYUEVDVF9FUShhaW9fc3BsaWNlX3JlYWQoJmFpbyksIDApOwotICAgIEVYUEVDVF9FUShhaW9fc3VzcGVuZChhaW9sLCAxLCBudWxscHRyKSwgMCk7Ci0gICAgRVhQRUNUX0VRKGFpb19yZXR1cm4oJmFpbyksIFRFU1RfUEFDS0VUX1NJWkUpOwotCi0gICAgRVhQRUNUX0VRKHJlYWQocGlwZUZkWzBdLCBidWYsIFRFU1RfUEFDS0VUX1NJWkUpLCBURVNUX1BBQ0tFVF9TSVpFKTsKLSAgICBFWFBFQ1RfU1RSRVEoYnVmLCBkdW1teURhdGFTdHIuY19zdHIoKSk7Ci19Ci0KLVRFU1RfRihBc3luY0lPVGVzdCwgdGVzdFNwbGljZVdyaXRlKSB7Ci0gICAgY2hhciBidWZbVEVTVF9QQUNLRVRfU0laRSArIDFdOwotICAgIGJ1ZltURVNUX1BBQ0tFVF9TSVpFXSA9ICdcMCc7Ci0gICAgaW50IHBpcGVGZFsyXTsKLSAgICBFWFBFQ1RfRVEocGlwZShwaXBlRmQpLCAwKTsKLSAgICBFWFBFQ1RfRVEod3JpdGUocGlwZUZkWzFdLCBkdW1teURhdGFTdHIuY19zdHIoKSwgVEVTVF9QQUNLRVRfU0laRSksIFRFU1RfUEFDS0VUX1NJWkUpOwotICAgIHN0cnVjdCBhaW9jYiBhaW87Ci0gICAgc3RydWN0IGFpb2NiICphaW9sW10gPSB7JmFpb307Ci0gICAgYWlvLmFpb19maWxkZXMgPSBwaXBlRmRbMF07Ci0gICAgYWlvLmFpb19zaW5rID0gZHVtbXlfZmlsZS5mZDsKLSAgICBhaW8uYWlvX29mZnNldCA9IDA7Ci0gICAgYWlvLmFpb19uYnl0ZXMgPSBURVNUX1BBQ0tFVF9TSVpFOwotCi0gICAgRVhQRUNUX0VRKGFpb19zcGxpY2Vfd3JpdGUoJmFpbyksIDApOwotICAgIEVYUEVDVF9FUShhaW9fc3VzcGVuZChhaW9sLCAxLCBudWxscHRyKSwgMCk7Ci0gICAgRVhQRUNUX0VRKGFpb19yZXR1cm4oJmFpbyksIFRFU1RfUEFDS0VUX1NJWkUpOwotICAgIEVYUEVDVF9FUShyZWFkKGR1bW15X2ZpbGUuZmQsIGJ1ZiwgVEVTVF9QQUNLRVRfU0laRSksIFRFU1RfUEFDS0VUX1NJWkUpOwotICAgIEVYUEVDVF9TVFJFUShidWYsIGR1bW15RGF0YVN0ci5jX3N0cigpKTsKLX0KLQotVEVTVF9GKEFzeW5jSU9UZXN0LCB0ZXN0UG9vbFdyaXRlKSB7Ci0gICAgYWlvX3Bvb2xfd3JpdGVfaW5pdCgpOwotICAgIGNoYXIgYnVmW1RFU1RfUEFDS0VUX1NJWkUgKiBQT09MX0NPVU5UICsgMV07Ci0gICAgYnVmW1RFU1RfUEFDS0VUX1NJWkUgKiBQT09MX0NPVU5UXSA9ICdcMCc7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IFBPT0xfQ09VTlQ7IGkrKykgewotICAgICAgICBzdHJ1Y3QgYWlvY2IgKmFpb3AgPSBuZXcgc3RydWN0IGFpb2NiOwotICAgICAgICBhaW9wLT5haW9fZmlsZGVzID0gZHVtbXlfZmlsZS5mZDsKLSAgICAgICAgYWlvcC0+YWlvX3Bvb2xfYnVmID0gc3RkOjp1bmlxdWVfcHRyPGNoYXJbXT4obmV3IGNoYXJbVEVTVF9QQUNLRVRfU0laRV0pOwotICAgICAgICBtZW1jcHkoYWlvcC0+YWlvX3Bvb2xfYnVmLmdldCgpLCBkdW1teURhdGFTdHIuY19zdHIoKSwgVEVTVF9QQUNLRVRfU0laRSk7Ci0gICAgICAgIGFpb3AtPmFpb19vZmZzZXQgPSBpICogVEVTVF9QQUNLRVRfU0laRTsKLSAgICAgICAgYWlvcC0+YWlvX25ieXRlcyA9IFRFU1RfUEFDS0VUX1NJWkU7Ci0gICAgICAgIEVYUEVDVF9FUShhaW9fcG9vbF93cml0ZShhaW9wKSwgMCk7Ci0gICAgfQotICAgIGFpb19wb29sX2VuZCgpOwotICAgIEVYUEVDVF9FUShyZWFkKGR1bW15X2ZpbGUuZmQsIGJ1ZiwgVEVTVF9QQUNLRVRfU0laRSAqIFBPT0xfQ09VTlQpLCBURVNUX1BBQ0tFVF9TSVpFICogUE9PTF9DT1VOVCk7Ci0KLSAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IFBPT0xfQ09VTlQ7IGkrKykKLSAgICAgICAgc3MgPDwgZHVtbXlEYXRhU3RyOwotCi0gICAgRVhQRUNUX1NUUkVRKGJ1Ziwgc3Muc3RyKCkuY19zdHIoKSk7Ci19Ci0KLVRFU1RfRihBc3luY0lPVGVzdCwgdGVzdFNwbGljZVBvb2xXcml0ZSkgewotICAgIGFpb19wb29sX3NwbGljZV9pbml0KCk7Ci0gICAgY2hhciBidWZbVEVTVF9QQUNLRVRfU0laRSAqIFBPT0xfQ09VTlQgKyAxXTsKLSAgICBidWZbVEVTVF9QQUNLRVRfU0laRSAqIFBPT0xfQ09VTlRdID0gJ1wwJzsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUE9PTF9DT1VOVDsgaSsrKSB7Ci0gICAgICAgIGludCBwaXBlRmRbMl07Ci0gICAgICAgIEVYUEVDVF9FUShwaXBlKHBpcGVGZCksIDApOwotICAgICAgICBFWFBFQ1RfRVEod3JpdGUocGlwZUZkWzFdLCBkdW1teURhdGFTdHIuY19zdHIoKSwgVEVTVF9QQUNLRVRfU0laRSksIFRFU1RfUEFDS0VUX1NJWkUpOwotICAgICAgICBzdHJ1Y3QgYWlvY2IgKmFpb3AgPSBuZXcgc3RydWN0IGFpb2NiOwotICAgICAgICBhaW9wLT5haW9fZmlsZGVzID0gcGlwZUZkWzBdOwotICAgICAgICBhaW9wLT5haW9fc2luayA9IGR1bW15X2ZpbGUuZmQ7Ci0gICAgICAgIGFpb3AtPmFpb19vZmZzZXQgPSBpICogVEVTVF9QQUNLRVRfU0laRTsKLSAgICAgICAgYWlvcC0+YWlvX25ieXRlcyA9IFRFU1RfUEFDS0VUX1NJWkU7Ci0gICAgICAgIEVYUEVDVF9FUShhaW9fcG9vbF93cml0ZShhaW9wKSwgMCk7Ci0gICAgfQotICAgIGFpb19wb29sX2VuZCgpOwotICAgIEVYUEVDVF9FUShyZWFkKGR1bW15X2ZpbGUuZmQsIGJ1ZiwgVEVTVF9QQUNLRVRfU0laRSAqIFBPT0xfQ09VTlQpLCBURVNUX1BBQ0tFVF9TSVpFICogUE9PTF9DT1VOVCk7Ci0KLSAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IFBPT0xfQ09VTlQ7IGkrKykKLSAgICAgICAgc3MgPDwgZHVtbXlEYXRhU3RyOwotCi0gICAgRVhQRUNUX1NUUkVRKGJ1Ziwgc3Muc3RyKCkuY19zdHIoKSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC90ZXN0cy9NdHBGZnNIYW5kbGVfdGVzdC5jcHAgYi9tZWRpYS9tdHAvdGVzdHMvTXRwRmZzSGFuZGxlX3Rlc3QuY3BwCmluZGV4IDU1NGY4NjcuLmQxMWZlMDcgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC90ZXN0cy9NdHBGZnNIYW5kbGVfdGVzdC5jcHAKKysrIGIvbWVkaWEvbXRwL3Rlc3RzL010cEZmc0hhbmRsZV90ZXN0LmNwcApAQCAtMjMsMTUgKzIzLDE1IEBACiAjaW5jbHVkZSA8cmFuZG9tPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKKyNpbmNsdWRlICJNdHBEZXNjcmlwdG9ycy5oIgogI2luY2x1ZGUgIk10cEZmc0hhbmRsZS5oIgorI2luY2x1ZGUgIk10cEZmc0NvbXBhdEhhbmRsZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNvbnN0ZXhwciBpbnQgTUFYX0ZJTEVfQ0hVTktfU0laRSA9IDMgKiAxMDI0ICogMTAyNDsKLQotY29uc3RleHByIGludCBURVNUX1BBQ0tFVF9TSVpFID0gNTEyOworY29uc3RleHByIGludCBURVNUX1BBQ0tFVF9TSVpFID0gNTAwOwogY29uc3RleHByIGludCBTTUFMTF9NVUxUID0gMzA7CiBjb25zdGV4cHIgaW50IE1FRF9NVUxUID0gNTEwOwogCkBAIC00MywxNyArNDMsMTkgQEAKICAgICAiLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgcyIKICAgICAib2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiICIKICAgICAiQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3MgbyIKLSAgICAiciBpbXBsaWVkLlxuICogU2UiOworICAgICJyIGltIjsKIAogLyoqCiAgKiBGdW5jdGlvbmFsIHRlc3RzIGZvciB0aGUgTXRwRmZzSGFuZGxlIGNsYXNzLiBFbnN1cmVzIGhlYWRlciBhbmQgZGF0YSBpbnRlZ3JpdHkKICAqIGJ5IG1vY2tpbmcgZmZzIGVuZHBvaW50cyBhcyBwaXBlcyB0byBjYXB0dXJlIGlucHV0IC8gb3V0cHV0LgogICovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KIGNsYXNzIE10cEZmc0hhbmRsZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKIHByb3RlY3RlZDoKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8SU10cEhhbmRsZT4gaGFuZGxlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxNdHBGZnNIYW5kbGU+IGhhbmRsZTsKIAogICAgIC8vIFBpcGVzIGZvciByZWFkaW5nIGVuZHBvaW50IGRhdGEKKyAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgY29udHJvbDsKICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgYnVsa19pbjsKICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgYnVsa19vdXQ7CiAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGludHI7CkBAIC02Miw4OCArNjQsMTY0IEBACiAKICAgICBNdHBGZnNIYW5kbGVUZXN0KCkgewogICAgICAgICBpbnQgZmRbMl07Ci0gICAgICAgIGhhbmRsZSA9IHN0ZDo6dW5pcXVlX3B0cjxJTXRwSGFuZGxlPihnZXRfZmZzX2hhbmRsZSgpKTsKLSAgICAgICAgTXRwRmZzSGFuZGxlICpmZnNfaGFuZGxlID0gc3RhdGljX2Nhc3Q8TXRwRmZzSGFuZGxlKj4oaGFuZGxlLmdldCgpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoZmZzX2hhbmRsZSAhPSBOVUxMKTsKKyAgICAgICAgaGFuZGxlID0gc3RkOjptYWtlX3VuaXF1ZTxUPigtMSk7CisKKyAgICAgICAgRVhQRUNUX0VRKHBpcGUoZmQpLCAwKTsKKyAgICAgICAgY29udHJvbC5yZXNldChmZFswXSk7CisgICAgICAgIGhhbmRsZS0+bUNvbnRyb2wucmVzZXQoZmRbMV0pOwogCiAgICAgICAgIEVYUEVDVF9FUShwaXBlKGZkKSwgMCk7CiAgICAgICAgIEVYUEVDVF9FUShmY250bChmZFswXSwgRl9TRVRQSVBFX1NaLCAxMDQ4NTc2KSwgMTA0ODU3Nik7CiAgICAgICAgIGJ1bGtfaW4ucmVzZXQoZmRbMF0pOwotICAgICAgICBmZnNfaGFuZGxlLT5tQnVsa0luLnJlc2V0KGZkWzFdKTsKKyAgICAgICAgaGFuZGxlLT5tQnVsa0luLnJlc2V0KGZkWzFdKTsKIAogICAgICAgICBFWFBFQ1RfRVEocGlwZShmZCksIDApOwogICAgICAgICBFWFBFQ1RfRVEoZmNudGwoZmRbMF0sIEZfU0VUUElQRV9TWiwgMTA0ODU3NiksIDEwNDg1NzYpOwogICAgICAgICBidWxrX291dC5yZXNldChmZFsxXSk7Ci0gICAgICAgIGZmc19oYW5kbGUtPm1CdWxrT3V0LnJlc2V0KGZkWzBdKTsKKyAgICAgICAgaGFuZGxlLT5tQnVsa091dC5yZXNldChmZFswXSk7CiAKICAgICAgICAgRVhQRUNUX0VRKHBpcGUoZmQpLCAwKTsKICAgICAgICAgaW50ci5yZXNldChmZFswXSk7Ci0gICAgICAgIGZmc19oYW5kbGUtPm1JbnRyLnJlc2V0KGZkWzFdKTsKKyAgICAgICAgaGFuZGxlLT5tSW50ci5yZXNldChmZFsxXSk7CiAKLSAgICAgICAgZmZzX2hhbmRsZS0+bUJ1ZmZlcjEucmVzaXplKE1BWF9GSUxFX0NIVU5LX1NJWkUpOwotICAgICAgICBmZnNfaGFuZGxlLT5tQnVmZmVyMi5yZXNpemUoTUFYX0ZJTEVfQ0hVTktfU0laRSk7CisgICAgICAgIEVYUEVDVF9FUShoYW5kbGUtPnN0YXJ0KGZhbHNlKSwgMCk7CiAgICAgfQogCi0gICAgfk10cEZmc0hhbmRsZVRlc3QoKSB7fQorICAgIH5NdHBGZnNIYW5kbGVUZXN0KCkgeworICAgICAgICBoYW5kbGUtPmNsb3NlKCk7CisgICAgfQogfTsKIAotVEVTVF9GKE10cEZmc0hhbmRsZVRlc3QsIHRlc3RSZWFkKSB7Ci0gICAgRVhQRUNUX0VRKHdyaXRlKGJ1bGtfb3V0LCBkdW1teURhdGFTdHIuY19zdHIoKSwgVEVTVF9QQUNLRVRfU0laRSksIFRFU1RfUEFDS0VUX1NJWkUpOwordHlwZWRlZiA6OnRlc3Rpbmc6OlR5cGVzPE10cEZmc0hhbmRsZSwgTXRwRmZzQ29tcGF0SGFuZGxlPiBtdHBIYW5kbGVzOworVFlQRURfVEVTVF9DQVNFKE10cEZmc0hhbmRsZVRlc3QsIG10cEhhbmRsZXMpOworCitUWVBFRF9URVNUKE10cEZmc0hhbmRsZVRlc3QsIHRlc3RNdHBDb250cm9sKSB7CisgICAgRVhQRUNUX1RSVUUodGhpcy0+aGFuZGxlLT53cml0ZURlc2NyaXB0b3JzKGZhbHNlKSk7CisgICAgc3RydWN0IGRlc2NfdjIgZGVzYzsKKyAgICBzdHJ1Y3QgZnVuY3Rpb25mc19zdHJpbmdzIHN0cmluZ3M7CisgICAgRVhQRUNUX0VRKHJlYWQodGhpcy0+Y29udHJvbCwgJmRlc2MsIHNpemVvZihkZXNjKSksIChsb25nKXNpemVvZihkZXNjKSk7CisgICAgRVhQRUNUX0VRKHJlYWQodGhpcy0+Y29udHJvbCwgJnN0cmluZ3MsIHNpemVvZihzdHJpbmdzKSksIChsb25nKXNpemVvZihzdHJpbmdzKSk7CisgICAgRVhQRUNUX1RSVUUoc3RkOjptZW1jbXAoJmRlc2MsICZtdHBfZGVzY192Miwgc2l6ZW9mKGRlc2MpKSA9PSAwKTsKKyAgICBFWFBFQ1RfVFJVRShzdGQ6Om1lbWNtcCgmc3RyaW5ncywgJm10cF9zdHJpbmdzLCBzaXplb2Yoc3RyaW5ncykpID09IDApOworfQorCitUWVBFRF9URVNUKE10cEZmc0hhbmRsZVRlc3QsIHRlc3RQdHBDb250cm9sKSB7CisgICAgRVhQRUNUX1RSVUUodGhpcy0+aGFuZGxlLT53cml0ZURlc2NyaXB0b3JzKHRydWUpKTsKKyAgICBzdHJ1Y3QgZGVzY192MiBkZXNjOworICAgIHN0cnVjdCBmdW5jdGlvbmZzX3N0cmluZ3Mgc3RyaW5nczsKKyAgICBFWFBFQ1RfRVEocmVhZCh0aGlzLT5jb250cm9sLCAmZGVzYywgc2l6ZW9mKGRlc2MpKSwgKGxvbmcpc2l6ZW9mKGRlc2MpKTsKKyAgICBFWFBFQ1RfRVEocmVhZCh0aGlzLT5jb250cm9sLCAmc3RyaW5ncywgc2l6ZW9mKHN0cmluZ3MpKSwgKGxvbmcpc2l6ZW9mKHN0cmluZ3MpKTsKKyAgICBFWFBFQ1RfVFJVRShzdGQ6Om1lbWNtcCgmZGVzYywgJnB0cF9kZXNjX3YyLCBzaXplb2YoZGVzYykpID09IDApOworICAgIEVYUEVDVF9UUlVFKHN0ZDo6bWVtY21wKCZzdHJpbmdzLCAmbXRwX3N0cmluZ3MsIHNpemVvZihzdHJpbmdzKSkgPT0gMCk7Cit9CisKK1RZUEVEX1RFU1QoTXRwRmZzSGFuZGxlVGVzdCwgdGVzdFJlYWQpIHsKKyAgICBFWFBFQ1RfRVEod3JpdGUodGhpcy0+YnVsa19vdXQsIGR1bW15RGF0YVN0ci5jX3N0cigpLCBURVNUX1BBQ0tFVF9TSVpFKSwgVEVTVF9QQUNLRVRfU0laRSk7CiAgICAgY2hhciBidWZbVEVTVF9QQUNLRVRfU0laRSArIDFdOwogICAgIGJ1ZltURVNUX1BBQ0tFVF9TSVpFXSA9ICdcMCc7Ci0gICAgRVhQRUNUX0VRKGhhbmRsZS0+cmVhZChidWYsIFRFU1RfUEFDS0VUX1NJWkUpLCBURVNUX1BBQ0tFVF9TSVpFKTsKKyAgICBFWFBFQ1RfRVEodGhpcy0+aGFuZGxlLT5yZWFkKGJ1ZiwgVEVTVF9QQUNLRVRfU0laRSksIFRFU1RfUEFDS0VUX1NJWkUpOwogICAgIEVYUEVDVF9TVFJFUShidWYsIGR1bW15RGF0YVN0ci5jX3N0cigpKTsKIH0KIAotVEVTVF9GKE10cEZmc0hhbmRsZVRlc3QsIHRlc3RXcml0ZSkgeworVFlQRURfVEVTVChNdHBGZnNIYW5kbGVUZXN0LCB0ZXN0V3JpdGUpIHsKICAgICBjaGFyIGJ1ZltURVNUX1BBQ0tFVF9TSVpFICsgMV07CiAgICAgYnVmW1RFU1RfUEFDS0VUX1NJWkVdID0gJ1wwJzsKLSAgICBFWFBFQ1RfRVEoaGFuZGxlLT53cml0ZShkdW1teURhdGFTdHIuY19zdHIoKSwgVEVTVF9QQUNLRVRfU0laRSksIFRFU1RfUEFDS0VUX1NJWkUpOwotICAgIEVYUEVDVF9FUShyZWFkKGJ1bGtfaW4sIGJ1ZiwgVEVTVF9QQUNLRVRfU0laRSksIFRFU1RfUEFDS0VUX1NJWkUpOworICAgIEVYUEVDVF9FUSh0aGlzLT5oYW5kbGUtPndyaXRlKGR1bW15RGF0YVN0ci5jX3N0cigpLCBURVNUX1BBQ0tFVF9TSVpFKSwgVEVTVF9QQUNLRVRfU0laRSk7CisgICAgRVhQRUNUX0VRKHJlYWQodGhpcy0+YnVsa19pbiwgYnVmLCBURVNUX1BBQ0tFVF9TSVpFKSwgVEVTVF9QQUNLRVRfU0laRSk7CiAgICAgRVhQRUNUX1NUUkVRKGJ1ZiwgZHVtbXlEYXRhU3RyLmNfc3RyKCkpOwogfQogCi1URVNUX0YoTXRwRmZzSGFuZGxlVGVzdCwgdGVzdFJlY2VpdmVGaWxlU21hbGwpIHsKK1RZUEVEX1RFU1QoTXRwRmZzSGFuZGxlVGVzdCwgdGVzdFJlY2VpdmVGaWxlRW1wdHkpIHsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICBtdHBfZmlsZV9yYW5nZSBtZnI7CisgICAgaW50IHNpemUgPSAwOworICAgIGNoYXIgYnVmW3NpemUgKyAxXTsKKyAgICBidWZbc2l6ZV0gPSAnXDAnOworCisgICAgbWZyLm9mZnNldCA9IDA7CisgICAgbWZyLmxlbmd0aCA9IHNpemU7CisgICAgbWZyLmZkID0gdGhpcy0+ZHVtbXlfZmlsZS5mZDsKKworICAgIEVYUEVDVF9FUSh3cml0ZSh0aGlzLT5idWxrX291dCwgc3Muc3RyKCkuY19zdHIoKSwgc2l6ZSksIHNpemUpOworICAgIEVYUEVDVF9FUSh0aGlzLT5oYW5kbGUtPnJlY2VpdmVGaWxlKG1mciwgZmFsc2UpLCAwKTsKKworICAgIEVYUEVDVF9FUShyZWFkKHRoaXMtPmR1bW15X2ZpbGUuZmQsIGJ1Ziwgc2l6ZSksIHNpemUpOworfQorCitUWVBFRF9URVNUKE10cEZmc0hhbmRsZVRlc3QsIHRlc3RSZWNlaXZlRmlsZVNtYWxsKSB7CiAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CiAgICAgbXRwX2ZpbGVfcmFuZ2UgbWZyOwogICAgIGludCBzaXplID0gVEVTVF9QQUNLRVRfU0laRSAqIFNNQUxMX01VTFQ7CiAgICAgY2hhciBidWZbc2l6ZSArIDFdOwogICAgIGJ1ZltzaXplXSA9ICdcMCc7CiAKKyAgICBtZnIub2Zmc2V0ID0gMDsKICAgICBtZnIubGVuZ3RoID0gc2l6ZTsKLSAgICBtZnIuZmQgPSBkdW1teV9maWxlLmZkOworICAgIG1mci5mZCA9IHRoaXMtPmR1bW15X2ZpbGUuZmQ7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTTUFMTF9NVUxUOyBpKyspCiAgICAgICAgIHNzIDw8IGR1bW15RGF0YVN0cjsKIAotICAgIEVYUEVDVF9FUSh3cml0ZShidWxrX291dCwgc3Muc3RyKCkuY19zdHIoKSwgc2l6ZSksIHNpemUpOwotICAgIEVYUEVDVF9FUShoYW5kbGUtPnJlY2VpdmVGaWxlKG1mciwgZmFsc2UpLCAwKTsKKyAgICBFWFBFQ1RfRVEod3JpdGUodGhpcy0+YnVsa19vdXQsIHNzLnN0cigpLmNfc3RyKCksIHNpemUpLCBzaXplKTsKKyAgICBFWFBFQ1RfRVEodGhpcy0+aGFuZGxlLT5yZWNlaXZlRmlsZShtZnIsIGZhbHNlKSwgMCk7CiAKLSAgICBFWFBFQ1RfRVEocmVhZChkdW1teV9maWxlLmZkLCBidWYsIHNpemUpLCBzaXplKTsKKyAgICBFWFBFQ1RfRVEocmVhZCh0aGlzLT5kdW1teV9maWxlLmZkLCBidWYsIHNpemUpLCBzaXplKTsKIAogICAgIEVYUEVDVF9TVFJFUShidWYsIHNzLnN0cigpLmNfc3RyKCkpOwogfQogCi1URVNUX0YoTXRwRmZzSGFuZGxlVGVzdCwgdGVzdFJlY2VpdmVGaWxlTWVkKSB7CitUWVBFRF9URVNUKE10cEZmc0hhbmRsZVRlc3QsIHRlc3RSZWNlaXZlRmlsZU1lZCkgewogICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwogICAgIG10cF9maWxlX3JhbmdlIG1mcjsKICAgICBpbnQgc2l6ZSA9IFRFU1RfUEFDS0VUX1NJWkUgKiBNRURfTVVMVDsKICAgICBjaGFyIGJ1ZltzaXplICsgMV07CiAgICAgYnVmW3NpemVdID0gJ1wwJzsKIAorICAgIG1mci5vZmZzZXQgPSAwOwogICAgIG1mci5sZW5ndGggPSBzaXplOwotICAgIG1mci5mZCA9IGR1bW15X2ZpbGUuZmQ7CisgICAgbWZyLmZkID0gdGhpcy0+ZHVtbXlfZmlsZS5mZDsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1FRF9NVUxUOyBpKyspCiAgICAgICAgIHNzIDw8IGR1bW15RGF0YVN0cjsKIAotICAgIEVYUEVDVF9FUSh3cml0ZShidWxrX291dCwgc3Muc3RyKCkuY19zdHIoKSwgc2l6ZSksIHNpemUpOwotICAgIEVYUEVDVF9FUShoYW5kbGUtPnJlY2VpdmVGaWxlKG1mciwgZmFsc2UpLCAwKTsKKyAgICBFWFBFQ1RfRVEod3JpdGUodGhpcy0+YnVsa19vdXQsIHNzLnN0cigpLmNfc3RyKCksIHNpemUpLCBzaXplKTsKKyAgICBFWFBFQ1RfRVEodGhpcy0+aGFuZGxlLT5yZWNlaXZlRmlsZShtZnIsIGZhbHNlKSwgMCk7CiAKLSAgICBFWFBFQ1RfRVEocmVhZChkdW1teV9maWxlLmZkLCBidWYsIHNpemUpLCBzaXplKTsKKyAgICBFWFBFQ1RfRVEocmVhZCh0aGlzLT5kdW1teV9maWxlLmZkLCBidWYsIHNpemUpLCBzaXplKTsKIAogICAgIEVYUEVDVF9TVFJFUShidWYsIHNzLnN0cigpLmNfc3RyKCkpOwogfQogCi1URVNUX0YoTXRwRmZzSGFuZGxlVGVzdCwgdGVzdFNlbmRGaWxlU21hbGwpIHsKK1RZUEVEX1RFU1QoTXRwRmZzSGFuZGxlVGVzdCwgdGVzdFJlY2VpdmVGaWxlTWVkUGFydGlhbCkgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgIG10cF9maWxlX3JhbmdlIG1mcjsKKyAgICBpbnQgc2l6ZSA9IFRFU1RfUEFDS0VUX1NJWkUgKiBNRURfTVVMVDsKKyAgICBjaGFyIGJ1ZltzaXplICsgMV07CisgICAgYnVmW3NpemVdID0gJ1wwJzsKKworICAgIG1mci5mZCA9IHRoaXMtPmR1bW15X2ZpbGUuZmQ7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNRURfTVVMVDsgaSsrKQorICAgICAgICBzcyA8PCBkdW1teURhdGFTdHI7CisKKyAgICBFWFBFQ1RfRVEod3JpdGUodGhpcy0+YnVsa19vdXQsIHNzLnN0cigpLmNfc3RyKCksIHNpemUpLCBzaXplKTsKKworICAgIHN0ZDo6cmFuZG9tX2RldmljZSByZDsKKyAgICBzdGQ6Om10MTk5MzcgZ2VuKHJkKCkpOworICAgIHN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPD4gZGlzKDEsIFRFU1RfUEFDS0VUX1NJWkUpOworICAgIGludCBvZmZzZXQgPSAwOworICAgIHdoaWxlIChvZmZzZXQgIT0gc2l6ZSkgeworICAgICAgICBtZnIub2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICBpbnQgbGVuZ3RoID0gc3RkOjptaW4oc2l6ZSAtIG9mZnNldCwgZGlzKGdlbikpOworICAgICAgICBtZnIubGVuZ3RoID0gbGVuZ3RoOworCisgICAgICAgIEVYUEVDVF9FUSh0aGlzLT5oYW5kbGUtPnJlY2VpdmVGaWxlKG1mciwgZmFsc2UpLCAwKTsKKyAgICAgICAgb2Zmc2V0ICs9IGxlbmd0aDsKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEocmVhZCh0aGlzLT5kdW1teV9maWxlLmZkLCBidWYsIHNpemUpLCBzaXplKTsKKworICAgIEVYUEVDVF9TVFJFUShidWYsIHNzLnN0cigpLmNfc3RyKCkpOworfQorCitUWVBFRF9URVNUKE10cEZmc0hhbmRsZVRlc3QsIHRlc3RTZW5kRmlsZVNtYWxsKSB7CiAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CiAgICAgbXRwX2ZpbGVfcmFuZ2UgbWZyOwogICAgIG1mci5jb21tYW5kID0gNDI7CkBAIC0xNTQsMTQgKzIzMiwxNCBAQAogICAgIGJ1ZltzaXplICsgc2l6ZW9mKG10cF9kYXRhX2hlYWRlcildID0gJ1wwJzsKIAogICAgIG1mci5sZW5ndGggPSBzaXplOwotICAgIG1mci5mZCA9IGR1bW15X2ZpbGUuZmQ7CisgICAgbWZyLmZkID0gdGhpcy0+ZHVtbXlfZmlsZS5mZDsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNNQUxMX01VTFQ7IGkrKykKICAgICAgICAgc3MgPDwgZHVtbXlEYXRhU3RyOwogCi0gICAgRVhQRUNUX0VRKHdyaXRlKGR1bW15X2ZpbGUuZmQsIHNzLnN0cigpLmNfc3RyKCksIHNpemUpLCBzaXplKTsKLSAgICBFWFBFQ1RfRVEoaGFuZGxlLT5zZW5kRmlsZShtZnIpLCAwKTsKKyAgICBFWFBFQ1RfRVEod3JpdGUodGhpcy0+ZHVtbXlfZmlsZS5mZCwgc3Muc3RyKCkuY19zdHIoKSwgc2l6ZSksIHNpemUpOworICAgIEVYUEVDVF9FUSh0aGlzLT5oYW5kbGUtPnNlbmRGaWxlKG1mciksIDApOwogCi0gICAgRVhQRUNUX0VRKHJlYWQoYnVsa19pbiwgYnVmLCBzaXplICsgc2l6ZW9mKG10cF9kYXRhX2hlYWRlcikpLAorICAgIEVYUEVDVF9FUShyZWFkKHRoaXMtPmJ1bGtfaW4sIGJ1Ziwgc2l6ZSArIHNpemVvZihtdHBfZGF0YV9oZWFkZXIpKSwKICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmc+KHNpemUgKyBzaXplb2YobXRwX2RhdGFfaGVhZGVyKSkpOwogCiAgICAgc3RydWN0IG10cF9kYXRhX2hlYWRlciAqaGVhZGVyID0gcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QgbXRwX2RhdGFfaGVhZGVyKj4oYnVmKTsKQEAgLTE3Miw3ICsyNTAsNyBAQAogICAgIEVYUEVDVF9FUShoZWFkZXItPnRyYW5zYWN0aW9uX2lkLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KDEzMzcpKTsKIH0KIAotVEVTVF9GKE10cEZmc0hhbmRsZVRlc3QsIHRlc3RTZW5kRmlsZU1lZCkgeworVFlQRURfVEVTVChNdHBGZnNIYW5kbGVUZXN0LCB0ZXN0U2VuZEZpbGVNZWQpIHsKICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKICAgICBtdHBfZmlsZV9yYW5nZSBtZnI7CiAgICAgbWZyLmNvbW1hbmQgPSA0MjsKQEAgLTE4MywxNCArMjYxLDE0IEBACiAgICAgYnVmW3NpemUgKyBzaXplb2YobXRwX2RhdGFfaGVhZGVyKV0gPSAnXDAnOwogCiAgICAgbWZyLmxlbmd0aCA9IHNpemU7Ci0gICAgbWZyLmZkID0gZHVtbXlfZmlsZS5mZDsKKyAgICBtZnIuZmQgPSB0aGlzLT5kdW1teV9maWxlLmZkOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUVEX01VTFQ7IGkrKykKICAgICAgICAgc3MgPDwgZHVtbXlEYXRhU3RyOwogCi0gICAgRVhQRUNUX0VRKHdyaXRlKGR1bW15X2ZpbGUuZmQsIHNzLnN0cigpLmNfc3RyKCksIHNpemUpLCBzaXplKTsKLSAgICBFWFBFQ1RfRVEoaGFuZGxlLT5zZW5kRmlsZShtZnIpLCAwKTsKKyAgICBFWFBFQ1RfRVEod3JpdGUodGhpcy0+ZHVtbXlfZmlsZS5mZCwgc3Muc3RyKCkuY19zdHIoKSwgc2l6ZSksIHNpemUpOworICAgIEVYUEVDVF9FUSh0aGlzLT5oYW5kbGUtPnNlbmRGaWxlKG1mciksIDApOwogCi0gICAgRVhQRUNUX0VRKHJlYWQoYnVsa19pbiwgYnVmLCBzaXplICsgc2l6ZW9mKG10cF9kYXRhX2hlYWRlcikpLAorICAgIEVYUEVDVF9FUShyZWFkKHRoaXMtPmJ1bGtfaW4sIGJ1Ziwgc2l6ZSArIHNpemVvZihtdHBfZGF0YV9oZWFkZXIpKSwKICAgICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmc+KHNpemUgKyBzaXplb2YobXRwX2RhdGFfaGVhZGVyKSkpOwogCiAgICAgc3RydWN0IG10cF9kYXRhX2hlYWRlciAqaGVhZGVyID0gcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QgbXRwX2RhdGFfaGVhZGVyKj4oYnVmKTsKQEAgLTIwMSwxMCArMjc5LDEwIEBACiAgICAgRVhQRUNUX0VRKGhlYWRlci0+dHJhbnNhY3Rpb25faWQsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oMTMzNykpOwogfQogCi1URVNUX0YoTXRwRmZzSGFuZGxlVGVzdCwgdGVzdFNlbmRGaWxlTWVkUGFydGlhbCkgeworVFlQRURfVEVTVChNdHBGZnNIYW5kbGVUZXN0LCB0ZXN0U2VuZEZpbGVNZWRQYXJ0aWFsKSB7CiAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CiAgICAgbXRwX2ZpbGVfcmFuZ2UgbWZyOwotICAgIG1mci5mZCA9IGR1bW15X2ZpbGUuZmQ7CisgICAgbWZyLmZkID0gdGhpcy0+ZHVtbXlfZmlsZS5mZDsKICAgICBtZnIuY29tbWFuZCA9IDQyOwogICAgIG1mci50cmFuc2FjdGlvbl9pZCA9IDEzMzc7CiAgICAgaW50IHNpemUgPSBURVNUX1BBQ0tFVF9TSVpFICogTUVEX01VTFQ7CkBAIC0yMTQsNyArMjkyLDcgQEAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1FRF9NVUxUOyBpKyspCiAgICAgICAgIHNzIDw8IGR1bW15RGF0YVN0cjsKIAotICAgIEVYUEVDVF9FUSh3cml0ZShkdW1teV9maWxlLmZkLCBzcy5zdHIoKS5jX3N0cigpLCBzaXplKSwgc2l6ZSk7CisgICAgRVhQRUNUX0VRKHdyaXRlKHRoaXMtPmR1bW15X2ZpbGUuZmQsIHNzLnN0cigpLmNfc3RyKCksIHNpemUpLCBzaXplKTsKIAogICAgIHN0ZDo6cmFuZG9tX2RldmljZSByZDsKICAgICBzdGQ6Om10MTk5MzcgZ2VuKHJkKCkpOwpAQCAtMjI1LDkgKzMwMyw5IEBACiAgICAgICAgIGludCBsZW5ndGggPSBzdGQ6Om1pbihzaXplIC0gb2Zmc2V0LCBkaXMoZ2VuKSk7CiAgICAgICAgIG1mci5sZW5ndGggPSBsZW5ndGg7CiAgICAgICAgIGNoYXIgdGVtcF9idWZbbGVuZ3RoICsgc2l6ZW9mKG10cF9kYXRhX2hlYWRlcildOwotICAgICAgICBFWFBFQ1RfRVEoaGFuZGxlLT5zZW5kRmlsZShtZnIpLCAwKTsKKyAgICAgICAgRVhQRUNUX0VRKHRoaXMtPmhhbmRsZS0+c2VuZEZpbGUobWZyKSwgMCk7CiAKLSAgICAgICAgRVhQRUNUX0VRKHJlYWQoYnVsa19pbiwgdGVtcF9idWYsIGxlbmd0aCArIHNpemVvZihtdHBfZGF0YV9oZWFkZXIpKSwKKyAgICAgICAgRVhQRUNUX0VRKHJlYWQodGhpcy0+YnVsa19pbiwgdGVtcF9idWYsIGxlbmd0aCArIHNpemVvZihtdHBfZGF0YV9oZWFkZXIpKSwKICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nPihsZW5ndGggKyBzaXplb2YobXRwX2RhdGFfaGVhZGVyKSkpOwogCiAgICAgICAgIHN0cnVjdCBtdHBfZGF0YV9oZWFkZXIgKmhlYWRlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IG10cF9kYXRhX2hlYWRlcio+KHRlbXBfYnVmKTsKQEAgLTI0MSw3ICszMTksNyBAQAogICAgIEVYUEVDVF9TVFJFUShidWYsIHNzLnN0cigpLmNfc3RyKCkpOwogfQogCi1URVNUX0YoTXRwRmZzSGFuZGxlVGVzdCwgdGVzdFNlbmRGaWxlRW1wdHkpIHsKK1RZUEVEX1RFU1QoTXRwRmZzSGFuZGxlVGVzdCwgdGVzdFNlbmRGaWxlRW1wdHkpIHsKICAgICBtdHBfZmlsZV9yYW5nZSBtZnI7CiAgICAgbWZyLmNvbW1hbmQgPSA0MjsKICAgICBtZnIudHJhbnNhY3Rpb25faWQgPSAxMzM3OwpAQCAtMjUxLDExICszMjksMTEgQEAKICAgICBidWZbc2l6ZSArIHNpemVvZihtdHBfZGF0YV9oZWFkZXIpXSA9ICdcMCc7CiAKICAgICBtZnIubGVuZ3RoID0gc2l6ZTsKLSAgICBtZnIuZmQgPSBkdW1teV9maWxlLmZkOworICAgIG1mci5mZCA9IHRoaXMtPmR1bW15X2ZpbGUuZmQ7CiAKLSAgICBFWFBFQ1RfRVEoaGFuZGxlLT5zZW5kRmlsZShtZnIpLCAwKTsKKyAgICBFWFBFQ1RfRVEodGhpcy0+aGFuZGxlLT5zZW5kRmlsZShtZnIpLCAwKTsKIAotICAgIEVYUEVDVF9FUShyZWFkKGJ1bGtfaW4sIGJ1Ziwgc2l6ZSArIHNpemVvZihtdHBfZGF0YV9oZWFkZXIpKSwKKyAgICBFWFBFQ1RfRVEocmVhZCh0aGlzLT5idWxrX2luLCBidWYsIHNpemUgKyBzaXplb2YobXRwX2RhdGFfaGVhZGVyKSksCiAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nPihzaXplICsgc2l6ZW9mKG10cF9kYXRhX2hlYWRlcikpKTsKIAogICAgIHN0cnVjdCBtdHBfZGF0YV9oZWFkZXIgKmhlYWRlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IG10cF9kYXRhX2hlYWRlcio+KGJ1Zik7CkBAIC0yNjUsMTUgKzM0MywxNSBAQAogICAgIEVYUEVDVF9FUShoZWFkZXItPnRyYW5zYWN0aW9uX2lkLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KDEzMzcpKTsKIH0KIAotVEVTVF9GKE10cEZmc0hhbmRsZVRlc3QsIHRlc3RTZW5kRXZlbnQpIHsKK1RZUEVEX1RFU1QoTXRwRmZzSGFuZGxlVGVzdCwgdGVzdFNlbmRFdmVudCkgewogICAgIHN0cnVjdCBtdHBfZXZlbnQgZXZlbnQ7CiAgICAgZXZlbnQubGVuZ3RoID0gVEVTVF9QQUNLRVRfU0laRTsKICAgICBldmVudC5kYXRhID0gY29uc3RfY2FzdDxjaGFyKj4oZHVtbXlEYXRhU3RyLmNfc3RyKCkpOwogICAgIGNoYXIgYnVmW1RFU1RfUEFDS0VUX1NJWkUgKyAxXTsKICAgICBidWZbVEVTVF9QQUNLRVRfU0laRV0gPSAnXDAnOwogCi0gICAgaGFuZGxlLT5zZW5kRXZlbnQoZXZlbnQpOwotICAgIHJlYWQoaW50ciwgYnVmLCBURVNUX1BBQ0tFVF9TSVpFKTsKKyAgICB0aGlzLT5oYW5kbGUtPnNlbmRFdmVudChldmVudCk7CisgICAgcmVhZCh0aGlzLT5pbnRyLCBidWYsIFRFU1RfUEFDS0VUX1NJWkUpOwogICAgIEVYUEVDVF9TVFJFUShidWYsIGR1bW15RGF0YVN0ci5jX3N0cigpKTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL3Rlc3RzL1Bvc2l4QXN5bmNJT190ZXN0LmNwcCBiL21lZGlhL210cC90ZXN0cy9Qb3NpeEFzeW5jSU9fdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUzMzdhYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC90ZXN0cy9Qb3NpeEFzeW5jSU9fdGVzdC5jcHAKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIExPR19UQUcgIlBvc2l4QXN5bmNJT190ZXN0LmNwcCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS90ZXN0X3V0aWxzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlICJQb3NpeEFzeW5jSU8uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgaW50IFRFU1RfUEFDS0VUX1NJWkUgPSA1MTI7CisKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBkdW1teURhdGFTdHIgPQorICAgICIvKlxuICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdFxuICpcbiAqIExpY2Vuc2VkIHVuIgorICAgICJkZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzIgorICAgICJlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjIgorICAgICJvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIgorICAgICItMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzIgorICAgICJvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgIgorICAgICJCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvIgorICAgICJyIGltcGxpZWQuXG4gKiBTZSI7CisKKworY2xhc3MgUG9zaXhBc3luY0lPVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHJvdGVjdGVkOgorICAgIFRlbXBvcmFyeUZpbGUgZHVtbXlfZmlsZTsKKworICAgIFBvc2l4QXN5bmNJT1Rlc3QoKSB7fQorICAgIH5Qb3NpeEFzeW5jSU9UZXN0KCkge30KK307CisKK1RFU1RfRihQb3NpeEFzeW5jSU9UZXN0LCB0ZXN0UmVhZCkgeworICAgIGNoYXIgYnVmW1RFU1RfUEFDS0VUX1NJWkUgKyAxXTsKKyAgICBidWZbVEVTVF9QQUNLRVRfU0laRV0gPSAnXDAnOworICAgIEVYUEVDVF9FUSh3cml0ZShkdW1teV9maWxlLmZkLCBkdW1teURhdGFTdHIuY19zdHIoKSwgVEVTVF9QQUNLRVRfU0laRSksIFRFU1RfUEFDS0VUX1NJWkUpOworICAgIHN0cnVjdCBhaW9jYiBhaW87CisgICAgc3RydWN0IGFpb2NiICphaW9sW10gPSB7JmFpb307CisgICAgYWlvLmFpb19maWxkZXMgPSBkdW1teV9maWxlLmZkOworICAgIGFpby5haW9fYnVmID0gYnVmOworICAgIGFpby5haW9fb2Zmc2V0ID0gMDsKKyAgICBhaW8uYWlvX25ieXRlcyA9IFRFU1RfUEFDS0VUX1NJWkU7CisKKyAgICBFWFBFQ1RfRVEoYWlvX3JlYWQoJmFpbyksIDApOworICAgIEVYUEVDVF9FUShhaW9fc3VzcGVuZChhaW9sLCAxLCBudWxscHRyKSwgMCk7CisgICAgRVhQRUNUX0VRKGFpb19yZXR1cm4oJmFpbyksIFRFU1RfUEFDS0VUX1NJWkUpOworICAgIEVYUEVDVF9TVFJFUShidWYsIGR1bW15RGF0YVN0ci5jX3N0cigpKTsKK30KKworVEVTVF9GKFBvc2l4QXN5bmNJT1Rlc3QsIHRlc3RXcml0ZSkgeworICAgIGNoYXIgYnVmW1RFU1RfUEFDS0VUX1NJWkUgKyAxXTsKKyAgICBidWZbVEVTVF9QQUNLRVRfU0laRV0gPSAnXDAnOworICAgIHN0cnVjdCBhaW9jYiBhaW87CisgICAgc3RydWN0IGFpb2NiICphaW9sW10gPSB7JmFpb307CisgICAgYWlvLmFpb19maWxkZXMgPSBkdW1teV9maWxlLmZkOworICAgIGFpby5haW9fYnVmID0gY29uc3RfY2FzdDxjaGFyKj4oZHVtbXlEYXRhU3RyLmNfc3RyKCkpOworICAgIGFpby5haW9fb2Zmc2V0ID0gMDsKKyAgICBhaW8uYWlvX25ieXRlcyA9IFRFU1RfUEFDS0VUX1NJWkU7CisKKyAgICBFWFBFQ1RfRVEoYWlvX3dyaXRlKCZhaW8pLCAwKTsKKyAgICBFWFBFQ1RfRVEoYWlvX3N1c3BlbmQoYWlvbCwgMSwgbnVsbHB0ciksIDApOworICAgIEVYUEVDVF9FUShhaW9fcmV0dXJuKCZhaW8pLCBURVNUX1BBQ0tFVF9TSVpFKTsKKyAgICBFWFBFQ1RfRVEocmVhZChkdW1teV9maWxlLmZkLCBidWYsIFRFU1RfUEFDS0VUX1NJWkUpLCBURVNUX1BBQ0tFVF9TSVpFKTsKKyAgICBFWFBFQ1RfU1RSRVEoYnVmLCBkdW1teURhdGFTdHIuY19zdHIoKSk7Cit9CisKK1RFU1RfRihQb3NpeEFzeW5jSU9UZXN0LCB0ZXN0RXJyb3IpIHsKKyAgICBjaGFyIGJ1ZltURVNUX1BBQ0tFVF9TSVpFICsgMV07CisgICAgYnVmW1RFU1RfUEFDS0VUX1NJWkVdID0gJ1wwJzsKKyAgICBzdHJ1Y3QgYWlvY2IgYWlvOworICAgIHN0cnVjdCBhaW9jYiAqYWlvbFtdID0geyZhaW99OworICAgIGFpby5haW9fZmlsZGVzID0gLTE7CisgICAgYWlvLmFpb19idWYgPSBjb25zdF9jYXN0PGNoYXIqPihkdW1teURhdGFTdHIuY19zdHIoKSk7CisgICAgYWlvLmFpb19vZmZzZXQgPSAwOworICAgIGFpby5haW9fbmJ5dGVzID0gVEVTVF9QQUNLRVRfU0laRTsKKworICAgIEVYUEVDVF9FUShhaW9fd3JpdGUoJmFpbyksIDApOworICAgIEVYUEVDVF9FUShhaW9fc3VzcGVuZChhaW9sLCAxLCBudWxscHRyKSwgMCk7CisgICAgRVhQRUNUX0VRKGFpb19yZXR1cm4oJmFpbyksIC0xKTsKKyAgICBFWFBFQ1RfRVEoYWlvX2Vycm9yKCZhaW8pLCBFQkFERik7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL25kay9BbmRyb2lkLmJwIGIvbWVkaWEvbmRrL0FuZHJvaWQuYnAKaW5kZXggMGQ0OGRlMS4uNGEzNjY4MSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbmRrL0FuZHJvaWQuYnAKQEAgLTM3LDYgKzM3LDcgQEAKICAgICBzcmNzOiBbCiAgICAgICAgICJOZGtNZWRpYUNvZGVjLmNwcCIsCiAgICAgICAgICJOZGtNZWRpYUNyeXB0by5jcHAiLAorICAgICAgICAiTmRrTWVkaWFEYXRhU291cmNlLmNwcCIsCiAgICAgICAgICJOZGtNZWRpYUV4dHJhY3Rvci5jcHAiLAogICAgICAgICAiTmRrTWVkaWFGb3JtYXQuY3BwIiwKICAgICAgICAgIk5ka01lZGlhTXV4ZXIuY3BwIiwKQEAgLTY3LDkgKzY4LDEwIEBACiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAogICAgICAgICAibGlibWVkaWFfam5pIiwKICAgICAgICAgImxpYm1lZGlhZHJtIiwKLSAgICAgICAgImxpYnNraWEiLAorICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJsb2ciLApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka0ltYWdlLmNwcCBiL21lZGlhL25kay9OZGtJbWFnZS5jcHAKaW5kZXggYzRmZjUzNy4uMjBiMTY2NyAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka0ltYWdlLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrSW1hZ2UuY3BwCkBAIC0zNyw4ICszNyw4IEBACiAgICAgICAgIG1UaW1lc3RhbXAodGltZXN0YW1wKSwgbVdpZHRoKHdpZHRoKSwgbUhlaWdodChoZWlnaHQpLCBtTnVtUGxhbmVzKG51bVBsYW5lcykgewogfQogCi0vLyBDYW4gb25seSBiZSBjYWxsZWQgYnkgZnJlZSgpIHdpdGggbUxvY2sgaG9sZAogQUltYWdlOjp+QUltYWdlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKCFtSXNDbG9zZWQpIHsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgKICAgICAgICAgICAgICAgICAiRXJyb3I6IEFJbWFnZSAlcCBpcyBkZWxldGVkIGJlZm9yZSByZXR1cm5pbmcgYnVmZmVyIHRvIEFJbWFnZVJlYWRlciEiLCB0aGlzKTsKQEAgLTc4LDcgKzc4LDYgQEAKICAgICAgICAgQUxPR0UoIkNhbm5vdCBmcmVlIEFJbWFnZSBiZWZvcmUgY2xvc2UhIik7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBkZWxldGUgdGhpczsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyLmNwcCBiL21lZGlhL25kay9OZGtJbWFnZVJlYWRlci5jcHAKaW5kZXggZmQ2ZWNiNS4uYmU2MzVmZiAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXIuY3BwCkBAIC02NTcsNyArNjU3LDcgQEAKIAogRVhQT1JUCiBtZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfZ2V0V2luZG93KEFJbWFnZVJlYWRlciogcmVhZGVyLCAvKm91dCovQU5hdGl2ZVdpbmRvdyoqIHdpbmRvdykgewotICAgIEFMT0dFKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKICAgICBpZiAocmVhZGVyID09IG51bGxwdHIgfHwgd2luZG93ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIGFyZ3VtZW50LiByZWFkZXIgJXAsIHdpbmRvdyAlcCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZWFkZXIsIHdpbmRvdyk7CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAKaW5kZXggMTI4ZWRiYS4uNmIyMGJjYSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhQ29kZWMuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcApAQCAtNTIsNiArNTIsNyBAQAogCiBlbnVtIHsKICAgICBrV2hhdEFjdGl2aXR5Tm90aWZ5LAorICAgIGtXaGF0QXN5bmNOb3RpZnksCiAgICAga1doYXRSZXF1ZXN0QWN0aXZpdHlOb3RpZmljYXRpb25zLAogICAgIGtXaGF0U3RvcEFjdGl2aXR5Tm90aWZpY2F0aW9ucywKIH07CkBAIC04OCw2ICs4OSwxMSBAQAogICAgIGJvb2wgbVJlcXVlc3RlZEFjdGl2aXR5Tm90aWZpY2F0aW9uOwogICAgIE9uQ29kZWNFdmVudCBtQ2FsbGJhY2s7CiAgICAgdm9pZCAqbUNhbGxiYWNrVXNlckRhdGE7CisKKyAgICBzcDxBTWVzc2FnZT4gbUFzeW5jTm90aWZ5OworICAgIG11dGFibGUgTXV0ZXggbUFzeW5jQ2FsbGJhY2tMb2NrOworICAgIEFNZWRpYUNvZGVjT25Bc3luY05vdGlmeUNhbGxiYWNrIG1Bc3luY0NhbGxiYWNrOworICAgIHZvaWQgKm1Bc3luY0NhbGxiYWNrVXNlckRhdGE7CiB9OwogCiBDb2RlY0hhbmRsZXI6OkNvZGVjSGFuZGxlcihBTWVkaWFDb2RlYyAqY29kZWMpIHsKQEAgLTEyOCw2ICsxMzQsMTQ3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRBc3luY05vdGlmeToKKyAgICAgICAgeworICAgICAgICAgICAgIGludDMyX3QgY2JJRDsKKyAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJjYWxsYmFja0lEIiwgJmNiSUQpKSB7CisgICAgICAgICAgICAgICAgIEFMT0dFKCJrV2hhdEFzeW5jTm90aWZ5OiBjYWxsYmFja0lEIGlzIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICBBTE9HVigia1doYXRBc3luY05vdGlmeTogY2JJRCA9ICVkIiwgY2JJRCk7CisKKyAgICAgICAgICAgICBzd2l0Y2ggKGNiSUQpIHsKKyAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvZGVjOjpDQl9JTlBVVF9BVkFJTEFCTEU6CisgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXg7CisgICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJpbmRleCIsICZpbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ0JfSU5QVVRfQVZBSUxBQkxFOiBpbmRleCBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2tMb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29kZWMtPm1Bc3luY0NhbGxiYWNrVXNlckRhdGEgIT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2sub25Bc3luY0lucHV0QXZhaWxhYmxlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Bc3luY0NhbGxiYWNrLm9uQXN5bmNJbnB1dEF2YWlsYWJsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2tVc2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29kZWM6OkNCX09VVFBVVF9BVkFJTEFCTEU6CisgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXg7CisgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZmxhZ3M7CisKKyAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImluZGV4IiwgJmluZGV4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDQl9PVVRQVVRfQVZBSUxBQkxFOiBpbmRleCBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kU2l6ZSgib2Zmc2V0IiwgJm9mZnNldCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ0JfT1VUUFVUX0FWQUlMQUJMRTogb2Zmc2V0IGlzIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRTaXplKCJzaXplIiwgJnNpemUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNCX09VVFBVVF9BVkFJTEFCTEU6IHNpemUgaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDQl9PVVRQVVRfQVZBSUxBQkxFOiB0aW1lVXMgaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJmbGFncyIsICZmbGFncykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ0JfT1VUUFVUX0FWQUlMQUJMRTogZmxhZ3MgaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUNvZGVjQnVmZmVySW5mbyBidWZmZXJJbmZvID0geworICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KW9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpZmxhZ3N9OworCisgICAgICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNvZGVjLT5tQXN5bmNDYWxsYmFja0xvY2spOworICAgICAgICAgICAgICAgICAgICAgaWYgKG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2tVc2VyRGF0YSAhPSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbUNvZGVjLT5tQXN5bmNDYWxsYmFjay5vbkFzeW5jT3V0cHV0QXZhaWxhYmxlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Bc3luY0NhbGxiYWNrLm9uQXN5bmNPdXRwdXRBdmFpbGFibGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Bc3luY0NhbGxiYWNrVXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJJbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29kZWM6OkNCX09VVFBVVF9GT1JNQVRfQ0hBTkdFRDoKKyAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ0JfT1VUUFVUX0ZPUk1BVF9DSEFOR0VEOiBmb3JtYXQgaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqYU1lZGlhRm9ybWF0ID0gQU1lZGlhRm9ybWF0X2Zyb21Nc2coJmZvcm1hdCk7CisKKyAgICAgICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ29kZWMtPm1Bc3luY0NhbGxiYWNrTG9jayk7CisgICAgICAgICAgICAgICAgICAgICBpZiAobUNvZGVjLT5tQXN5bmNDYWxsYmFja1VzZXJEYXRhICE9IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtQ29kZWMtPm1Bc3luY0NhbGxiYWNrLm9uQXN5bmNGb3JtYXRDaGFuZ2VkICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Bc3luY0NhbGxiYWNrLm9uQXN5bmNGb3JtYXRDaGFuZ2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQXN5bmNDYWxsYmFja1VzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYU1lZGlhRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29kZWM6OkNCX0VSUk9SOgorICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGFjdGlvbkNvZGU7CisgICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIGRldGFpbDsKKyAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNCX0VSUk9SOiBlcnIgaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJhY3Rpb24iLCAmYWN0aW9uQ29kZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ0JfRVJST1I6IGFjdGlvbiBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIG1zZy0+ZmluZFN0cmluZygiZGV0YWlsIiwgJmRldGFpbCk7CisgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRGVjb2RlciByZXBvcnRlZCBlcnJvcigweCV4KSwgYWN0aW9uQ29kZSglZCksIGRldGFpbCglcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLCBhY3Rpb25Db2RlLCBkZXRhaWwuY19zdHIoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ29kZWMtPm1Bc3luY0NhbGxiYWNrTG9jayk7CisgICAgICAgICAgICAgICAgICAgICBpZiAobUNvZGVjLT5tQXN5bmNDYWxsYmFja1VzZXJEYXRhICE9IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtQ29kZWMtPm1Bc3luY0NhbGxiYWNrLm9uQXN5bmNFcnJvciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQXN5bmNDYWxsYmFjay5vbkFzeW5jRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Bc3luY0NhbGxiYWNrVXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVfZXJyb3IoZXJyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWwuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImtXaGF0QXN5bmNOb3RpZnk6IGNhbGxiYWNrSUQoJWQpIGlzIHVuZXhwZWN0ZWQuIiwgY2JJRCk7CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2Uga1doYXRTdG9wQWN0aXZpdHlOb3RpZmljYXRpb25zOgogICAgICAgICB7CiAgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKQEAgLTE2Miw3ICszMDksNyBAQAogICAgIHNpemVfdCByZXMgPSBtRGF0YS0+bUxvb3Blci0+c3RhcnQoCiAgICAgICAgICAgICBmYWxzZSwgICAgICAvLyBydW5PbkNhbGxpbmdUaHJlYWQKICAgICAgICAgICAgIHRydWUsICAgICAgIC8vIGNhbkNhbGxKYXZhIFhYWAotICAgICAgICAgICAgUFJJT1JJVFlfRk9SRUdST1VORCk7CisgICAgICAgICAgICBQUklPUklUWV9BVURJTyk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHN0YXJ0IHRoZSBsb29wZXIiKTsKICAgICAgICAgQU1lZGlhQ29kZWNfZGVsZXRlKG1EYXRhKTsKQEAgLTE4Myw2ICszMzAsOSBAQAogICAgIG1EYXRhLT5tUmVxdWVzdGVkQWN0aXZpdHlOb3RpZmljYXRpb24gPSBmYWxzZTsKICAgICBtRGF0YS0+bUNhbGxiYWNrID0gTlVMTDsKIAorICAgIG1EYXRhLT5tQXN5bmNDYWxsYmFjayA9IHt9OworICAgIG1EYXRhLT5tQXN5bmNDYWxsYmFja1VzZXJEYXRhID0gTlVMTDsKKwogICAgIHJldHVybiBtRGF0YTsKIH0KIApAQCAtMjIyLDYgKzM3MiwzMiBAQAogfQogCiBFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX2dldE5hbWUoCisgICAgICAgIEFNZWRpYUNvZGVjICptRGF0YSwKKyAgICAgICAgY2hhcioqIG91dF9uYW1lKSB7CisgICAgaWYgKG91dF9uYW1lID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBBU3RyaW5nIGNvbXBOYW1lOworICAgIHN0YXR1c190IGVyciA9IG1EYXRhLT5tQ29kZWMtPmdldE5hbWUoJmNvbXBOYW1lKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IoZXJyKTsKKyAgICB9CisgICAgKm91dF9uYW1lID0gc3RyZHVwKGNvbXBOYW1lLmNfc3RyKCkpOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK0VYUE9SVAordm9pZCBBTWVkaWFDb2RlY19yZWxlYXNlTmFtZSgKKyAgICAgICAgQU1lZGlhQ29kZWMgKiAvKiBtRGF0YSAqLywKKyAgICAgICAgY2hhciogbmFtZSkgeworICAgIGlmIChuYW1lICE9IE5VTEwpIHsKKyAgICAgICAgZnJlZShuYW1lKTsKKyAgICB9Cit9CisKK0VYUE9SVAogbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfY29uZmlndXJlKAogICAgICAgICBBTWVkaWFDb2RlYyAqbURhdGEsCiAgICAgICAgIGNvbnN0IEFNZWRpYUZvcm1hdCogZm9ybWF0LApAQCAtMjM2LDggKzQxMiw0MCBAQAogICAgICAgICBzdXJmYWNlID0gKFN1cmZhY2UqKSB3aW5kb3c7CiAgICAgfQogCi0gICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihtRGF0YS0+bUNvZGVjLT5jb25maWd1cmUobmF0aXZlRm9ybWF0LCBzdXJmYWNlLAotICAgICAgICAgICAgY3J5cHRvID8gY3J5cHRvLT5tQ3J5cHRvIDogTlVMTCwgZmxhZ3MpKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtRGF0YS0+bUNvZGVjLT5jb25maWd1cmUobmF0aXZlRm9ybWF0LCBzdXJmYWNlLAorICAgICAgICAgICAgY3J5cHRvID8gY3J5cHRvLT5tQ3J5cHRvIDogTlVMTCwgZmxhZ3MpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImNvbmZpZ3VyZTogZXJyKCVkKSwgZmFpbGVkIHdpdGggZm9ybWF0OiAlcyIsCisgICAgICAgICAgICAgIGVyciwgbmF0aXZlRm9ybWF0LT5kZWJ1Z1N0cmluZygwKS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihlcnIpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3NldEFzeW5jTm90aWZ5Q2FsbGJhY2soCisgICAgICAgIEFNZWRpYUNvZGVjICptRGF0YSwKKyAgICAgICAgQU1lZGlhQ29kZWNPbkFzeW5jTm90aWZ5Q2FsbGJhY2sgY2FsbGJhY2ssCisgICAgICAgIHZvaWQgKnVzZXJkYXRhKSB7CisgICAgaWYgKG1EYXRhLT5tQXN5bmNOb3RpZnkgPT0gTlVMTCAmJiB1c2VyZGF0YSAhPSBOVUxMKSB7CisgICAgICAgIG1EYXRhLT5tQXN5bmNOb3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRBc3luY05vdGlmeSwgbURhdGEtPm1IYW5kbGVyKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbURhdGEtPm1Db2RlYy0+c2V0Q2FsbGJhY2sobURhdGEtPm1Bc3luY05vdGlmeSk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJzZXRBc3luY05vdGlmeUNhbGxiYWNrOiBlcnIoJWQpLCBmYWlsZWQgdG8gc2V0IGFzeW5jIGNhbGxiYWNrIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IoZXJyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGF0YS0+bUFzeW5jQ2FsbGJhY2tMb2NrKTsKKyAgICBtRGF0YS0+bUFzeW5jQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICBtRGF0YS0+bUFzeW5jQ2FsbGJhY2tVc2VyRGF0YSA9IHVzZXJkYXRhOworCisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3JlbGVhc2VDcnlwdG8oQU1lZGlhQ29kZWMgKm1EYXRhKSB7CisgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihtRGF0YS0+bUNvZGVjLT5yZWxlYXNlQ3J5cHRvKCkpOwogfQogCiBFWFBPUlQKQEAgLTI4Miw2ICs0OTAsMTkgQEAKIAogRVhQT1JUCiB1aW50OF90KiBBTWVkaWFDb2RlY19nZXRJbnB1dEJ1ZmZlcihBTWVkaWFDb2RlYyAqbURhdGEsIHNpemVfdCBpZHgsIHNpemVfdCAqb3V0X3NpemUpIHsKKyAgICBpZiAobURhdGEtPm1Bc3luY05vdGlmeSAhPSBOVUxMKSB7CisgICAgICAgIC8vIEFzeW5jaHJvbm91cyBtb2RlCisgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGFidWY7CisgICAgICAgIGlmIChtRGF0YS0+bUNvZGVjLT5nZXRJbnB1dEJ1ZmZlcihpZHgsICZhYnVmKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvdXRfc2l6ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAqb3V0X3NpemUgPSBhYnVmLT5jYXBhY2l0eSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhYnVmLT5kYXRhKCk7CisgICAgfQorCiAgICAgYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Ok1lZGlhQ29kZWNCdWZmZXI+ID4gYWJ1ZnM7CiAgICAgaWYgKG1EYXRhLT5tQ29kZWMtPmdldElucHV0QnVmZmVycygmYWJ1ZnMpID09IDApIHsKICAgICAgICAgc2l6ZV90IG4gPSBhYnVmcy5zaXplKCk7CkBAIC0zMDQsNiArNTI1LDE5IEBACiAKIEVYUE9SVAogdWludDhfdCogQU1lZGlhQ29kZWNfZ2V0T3V0cHV0QnVmZmVyKEFNZWRpYUNvZGVjICptRGF0YSwgc2l6ZV90IGlkeCwgc2l6ZV90ICpvdXRfc2l6ZSkgeworICAgIGlmIChtRGF0YS0+bUFzeW5jTm90aWZ5ICE9IE5VTEwpIHsKKyAgICAgICAgLy8gQXN5bmNocm9ub3VzIG1vZGUKKyAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYWJ1ZjsKKyAgICAgICAgaWYgKG1EYXRhLT5tQ29kZWMtPmdldE91dHB1dEJ1ZmZlcihpZHgsICZhYnVmKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvdXRfc2l6ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAqb3V0X3NpemUgPSBhYnVmLT5jYXBhY2l0eSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhYnVmLT5kYXRhKCk7CisgICAgfQorCiAgICAgYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Ok1lZGlhQ29kZWNCdWZmZXI+ID4gYWJ1ZnM7CiAgICAgaWYgKG1EYXRhLT5tQ29kZWMtPmdldE91dHB1dEJ1ZmZlcnMoJmFidWZzKSA9PSAwKSB7CiAgICAgICAgIHNpemVfdCBuID0gYWJ1ZnMuc2l6ZSgpOwpAQCAtMzY3LDYgKzYwMSwyMCBAQAogfQogCiBFWFBPUlQKK0FNZWRpYUZvcm1hdCogQU1lZGlhQ29kZWNfZ2V0SW5wdXRGb3JtYXQoQU1lZGlhQ29kZWMgKm1EYXRhKSB7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICBtRGF0YS0+bUNvZGVjLT5nZXRJbnB1dEZvcm1hdCgmZm9ybWF0KTsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2Zyb21Nc2coJmZvcm1hdCk7Cit9CisKK0VYUE9SVAorQU1lZGlhRm9ybWF0KiBBTWVkaWFDb2RlY19nZXRCdWZmZXJGb3JtYXQoQU1lZGlhQ29kZWMgKm1EYXRhLCBzaXplX3QgaW5kZXgpIHsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgIG1EYXRhLT5tQ29kZWMtPmdldE91dHB1dEZvcm1hdChpbmRleCwgJmZvcm1hdCk7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9mcm9tTXNnKCZmb3JtYXQpOworfQorCitFWFBPUlQKIG1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3JlbGVhc2VPdXRwdXRCdWZmZXIoQU1lZGlhQ29kZWMgKm1EYXRhLCBzaXplX3QgaWR4LCBib29sIHJlbmRlcikgewogICAgIGlmIChyZW5kZXIpIHsKICAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihtRGF0YS0+bUNvZGVjLT5yZW5kZXJPdXRwdXRCdWZmZXJBbmRSZWxlYXNlKGlkeCkpOwpAQCAtNTM1LDYgKzc4MywxNiBAQAogICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IoZXJyKTsKIH0KIAorRVhQT1JUCitib29sIEFNZWRpYUNvZGVjQWN0aW9uQ29kZV9pc1JlY292ZXJhYmxlKGludDMyX3QgYWN0aW9uQ29kZSkgeworICAgIHJldHVybiAoYWN0aW9uQ29kZSA9PSBBQ1RJT05fQ09ERV9SRUNPVkVSQUJMRSk7Cit9CisKK0VYUE9SVAorYm9vbCBBTWVkaWFDb2RlY0FjdGlvbkNvZGVfaXNUcmFuc2llbnQoaW50MzJfdCBhY3Rpb25Db2RlKSB7CisgICAgcmV0dXJuIChhY3Rpb25Db2RlID09IEFDVElPTl9DT0RFX1RSQU5TSUVOVCk7Cit9CisKIAogRVhQT1JUCiB2b2lkIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19zZXRQYXR0ZXJuKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyAqaW5mbywKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQwMGU1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2UuY3BwCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOZGtNZWRpYURhdGFTb3VyY2UiCisKKyNpbmNsdWRlICJOZGtNZWRpYURhdGFTb3VyY2VQcml2LmgiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGpuaS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgorCisjaW5jbHVkZSAiLi4vLi4vbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oIgorI2luY2x1ZGUgIi4uLy4uL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitzdHJ1Y3QgQU1lZGlhRGF0YVNvdXJjZSB7CisgICAgdm9pZCAqdXNlcmRhdGE7CisgICAgQU1lZGlhRGF0YVNvdXJjZVJlYWRBdCByZWFkQXQ7CisgICAgQU1lZGlhRGF0YVNvdXJjZUdldFNpemUgZ2V0U2l6ZTsKKyAgICBBTWVkaWFEYXRhU291cmNlQ2xvc2UgY2xvc2U7Cit9OworCitOZGtEYXRhU291cmNlOjpOZGtEYXRhU291cmNlKEFNZWRpYURhdGFTb3VyY2UgKmRhdGFTb3VyY2UpCisgICAgOiBtRGF0YVNvdXJjZShBTWVkaWFEYXRhU291cmNlX25ldygpKSB7CisgICAgICBBTWVkaWFEYXRhU291cmNlX3NldFJlYWRBdChtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+cmVhZEF0KTsKKyAgICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0U2l6ZShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+Z2V0U2l6ZSk7CisgICAgICBBTWVkaWFEYXRhU291cmNlX3NldENsb3NlKG1EYXRhU291cmNlLCBkYXRhU291cmNlLT5jbG9zZSk7CisgICAgICBBTWVkaWFEYXRhU291cmNlX3NldFVzZXJkYXRhKG1EYXRhU291cmNlLCBkYXRhU291cmNlLT51c2VyZGF0YSk7Cit9CisKK05ka0RhdGFTb3VyY2U6On5OZGtEYXRhU291cmNlKCkgeworICAgIEFNZWRpYURhdGFTb3VyY2VfZGVsZXRlKG1EYXRhU291cmNlKTsKK30KKworc3RhdHVzX3QgTmRrRGF0YVNvdXJjZTo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBPSzsKK30KKworc3NpemVfdCBOZGtEYXRhU291cmNlOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIGlmIChtRGF0YVNvdXJjZS0+Z2V0U2l6ZSA9PSBOVUxMIHx8IG1EYXRhU291cmNlLT51c2VyZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIG1EYXRhU291cmNlLT5yZWFkQXQobURhdGFTb3VyY2UtPnVzZXJkYXRhLCBvZmZzZXQsIGRhdGEsIHNpemUpOworfQorCitzdGF0dXNfdCBOZGtEYXRhU291cmNlOjpnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgaWYgKG1EYXRhU291cmNlLT5nZXRTaXplID09IE5VTEwgfHwgbURhdGFTb3VyY2UtPnVzZXJkYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmIChzaXplICE9IE5VTEwpIHsKKyAgICAgICAgKnNpemUgPSBtRGF0YVNvdXJjZS0+Z2V0U2l6ZShtRGF0YVNvdXJjZS0+dXNlcmRhdGEpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK1N0cmluZzggTmRrRGF0YVNvdXJjZTo6dG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIFN0cmluZzg6OmZvcm1hdCgiTmRrRGF0YVNvdXJjZShwaWQgJWQsIHVpZCAlZCkiLCBnZXRwaWQoKSwgZ2V0dWlkKCkpOworfQorCitTdHJpbmc4IE5ka0RhdGFTb3VyY2U6OmdldE1JTUVUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKK30KKwordm9pZCBOZGtEYXRhU291cmNlOjpjbG9zZSgpIHsKKyAgICBpZiAobURhdGFTb3VyY2UtPmNsb3NlICE9IE5VTEwgJiYgbURhdGFTb3VyY2UtPnVzZXJkYXRhICE9IE5VTEwpIHsKKyAgICAgICAgbURhdGFTb3VyY2UtPmNsb3NlKG1EYXRhU291cmNlLT51c2VyZGF0YSk7CisgICAgfQorfQorCitleHRlcm4gIkMiIHsKKworRVhQT1JUCitBTWVkaWFEYXRhU291cmNlKiBBTWVkaWFEYXRhU291cmNlX25ldygpIHsKKyAgICBBTWVkaWFEYXRhU291cmNlICptU291cmNlID0gbmV3IEFNZWRpYURhdGFTb3VyY2UoKTsKKyAgICBtU291cmNlLT51c2VyZGF0YSA9IE5VTEw7CisgICAgbVNvdXJjZS0+cmVhZEF0ID0gTlVMTDsKKyAgICBtU291cmNlLT5nZXRTaXplID0gTlVMTDsKKyAgICBtU291cmNlLT5jbG9zZSA9IE5VTEw7CisgICAgcmV0dXJuIG1Tb3VyY2U7Cit9CisKK0VYUE9SVAordm9pZCBBTWVkaWFEYXRhU291cmNlX2RlbGV0ZShBTWVkaWFEYXRhU291cmNlICptU291cmNlKSB7CisgICAgQUxPR1YoImR0b3IiKTsKKyAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtU291cmNlOworICAgIH0KK30KKworRVhQT1JUCit2b2lkIEFNZWRpYURhdGFTb3VyY2Vfc2V0VXNlcmRhdGEoQU1lZGlhRGF0YVNvdXJjZSAqbVNvdXJjZSwgdm9pZCAqdXNlcmRhdGEpIHsKKyAgICBtU291cmNlLT51c2VyZGF0YSA9IHVzZXJkYXRhOworfQorCitFWFBPUlQKK3ZvaWQgQU1lZGlhRGF0YVNvdXJjZV9zZXRSZWFkQXQoQU1lZGlhRGF0YVNvdXJjZSAqbVNvdXJjZSwgQU1lZGlhRGF0YVNvdXJjZVJlYWRBdCByZWFkQXQpIHsKKyAgICBtU291cmNlLT5yZWFkQXQgPSByZWFkQXQ7Cit9CisKK0VYUE9SVAordm9pZCBBTWVkaWFEYXRhU291cmNlX3NldEdldFNpemUoQU1lZGlhRGF0YVNvdXJjZSAqbVNvdXJjZSwgQU1lZGlhRGF0YVNvdXJjZUdldFNpemUgZ2V0U2l6ZSkgeworICAgIG1Tb3VyY2UtPmdldFNpemUgPSBnZXRTaXplOworfQorCitFWFBPUlQKK3ZvaWQgQU1lZGlhRGF0YVNvdXJjZV9zZXRDbG9zZShBTWVkaWFEYXRhU291cmNlICptU291cmNlLCBBTWVkaWFEYXRhU291cmNlQ2xvc2UgY2xvc2UpIHsKKyAgICBtU291cmNlLT5jbG9zZSA9IGNsb3NlOworfQorCit9IC8vIGV4dGVybiAiQyIKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZVByaXYuaCBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VQcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE5Yzg2NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VQcml2LmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIE5ESyBBUEkuCisgKiBEbyBub3QgcmVtb3ZlIG1ldGhvZHMuCisgKiBEbyBub3QgY2hhbmdlIG1ldGhvZCBzaWduYXR1cmVzLgorICogRG8gbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgY29uc3RhbnRzLgorICogRG8gbm90IGNoYW5nZSB0aGUgc2l6ZSBvZiBhbnkgb2YgdGhlIGNsYXNzZXMgZGVmaW5lZCBpbiBoZXJlLgorICogRG8gbm90IHJlZmVyZW5jZSB0eXBlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgTkRLLgorICogRG8gbm90ICNpbmNsdWRlIGZpbGVzIHRoYXQgYXJlbid0IHBhcnQgb2YgdGhlIE5ESy4KKyAqLworCisjaWZuZGVmIF9OREtfTUVESUFfREFUQVNPVVJDRV9QUklWX0gKKyNkZWZpbmUgX05ES19NRURJQV9EQVRBU09VUkNFX1BSSVZfSAorCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFEYXRhU291cmNlLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitzdHJ1Y3QgTmRrRGF0YVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlIHsKKworICAgIE5ka0RhdGFTb3VyY2UoQU1lZGlhRGF0YVNvdXJjZSAqKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICopOworICAgIHZpcnR1YWwgU3RyaW5nOCB0b1N0cmluZygpOworICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRNSU1FVHlwZSgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TmRrRGF0YVNvdXJjZSgpOworCitwcml2YXRlOgorCisgICAgTXV0ZXggbUxvY2s7CisgICAgQU1lZGlhRGF0YVNvdXJjZSAqbURhdGFTb3VyY2U7CisKK307CisKKyNlbmRpZiAvLyBfTkRLX01FRElBX0RBVEFTT1VSQ0VfUFJJVl9ICisKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwCmluZGV4IGVlY2M4NTguLjZkMTBmMWMgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcApAQCAtMjI0LDcgKzIyNCw3IEBACiAKIHN0YXRpYyBib29sIGZpbmRJZChBTWVkaWFEcm0gKm1PYmosIGNvbnN0IEFNZWRpYURybUJ5dGVBcnJheSAmaWQsIExpc3Q8aWR2ZWNfdD46Oml0ZXJhdG9yICZpdGVyKSB7CiAgICAgZm9yIChpdGVyID0gbU9iai0+bUlkcy5iZWdpbigpOyBpdGVyICE9IG1PYmotPm1JZHMuZW5kKCk7ICsraXRlcikgewotICAgICAgICBpZiAoaXRlci0+YXJyYXkoKSA9PSBpZC5wdHIgJiYgaXRlci0+c2l6ZSgpID09IGlkLmxlbmd0aCkgeworICAgICAgICBpZiAoaWQubGVuZ3RoID09IGl0ZXItPnNpemUoKSAmJiBtZW1jbXAoaXRlci0+YXJyYXkoKSwgaWQucHRyLCBpdGVyLT5zaXplKCkpID09IDApIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQpAQCAtMjQwLDcgKzI0MCw3IEBACiAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgfQogICAgIFZlY3Rvcjx1aW50OF90PiBzZXNzaW9uOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1PYmotPm1Ecm0tPm9wZW5TZXNzaW9uKHNlc3Npb24pOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1PYmotPm1Ecm0tPm9wZW5TZXNzaW9uKERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxNYXgsIHNlc3Npb24pOwogICAgIGlmIChzdGF0dXMgPT0gT0spIHsKICAgICAgICAgbU9iai0+bUlkcy5wdXNoX2Zyb250KHNlc3Npb24pOwogICAgICAgICBMaXN0PGlkdmVjX3Q+OjppdGVyYXRvciBpdGVyID0gbU9iai0+bUlkcy5iZWdpbigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAKaW5kZXggZTY3N2QwMC4uYjVlNjBhNCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlICJOZGtNZWRpYURhdGFTb3VyY2VQcml2LmgiCiAjaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXRQcml2LmgiCiAKIApAQCAtNDIsNyArNDMsMTIgQEAKIHN0YXRpYyBtZWRpYV9zdGF0dXNfdCB0cmFuc2xhdGVfZXJyb3Ioc3RhdHVzX3QgZXJyKSB7CiAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgIH0gZWxzZSBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0gZWxzZSBpZiAoZXJyID09IEVSUk9SX0lPKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgfQorCiAgICAgQUxPR0UoInNmIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiB9CkBAIC01MCw3ICs1Niw2IEBACiBzdHJ1Y3QgQU1lZGlhRXh0cmFjdG9yIHsKICAgICBzcDxOdU1lZGlhRXh0cmFjdG9yPiBtSW1wbDsKICAgICBzcDxBQnVmZmVyPiBtUHNzaEJ1ZjsKLQogfTsKIAogZXh0ZXJuICJDIiB7CkBAIC0xMjEsNiArMTI2LDE4IEBACiB9CiAKIEVYUE9SVAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VDdXN0b20oQU1lZGlhRXh0cmFjdG9yKiBtRGF0YSwgQU1lZGlhRGF0YVNvdXJjZSAqc3JjKSB7CisgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihtRGF0YS0+bUltcGwtPnNldERhdGFTb3VyY2UobmV3IE5ka0RhdGFTb3VyY2Uoc3JjKSkpOworfQorCitFWFBPUlQKK0FNZWRpYUZvcm1hdCogQU1lZGlhRXh0cmFjdG9yX2dldEZpbGVGb3JtYXQoQU1lZGlhRXh0cmFjdG9yICptRGF0YSkgeworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CisgICAgbURhdGEtPm1JbXBsLT5nZXRGaWxlRm9ybWF0KCZmb3JtYXQpOworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfZnJvbU1zZygmZm9ybWF0KTsKK30KKworRVhQT1JUCiBzaXplX3QgQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrQ291bnQoQU1lZGlhRXh0cmFjdG9yICptRGF0YSkgewogICAgIHJldHVybiBtRGF0YS0+bUltcGwtPmNvdW50VHJhY2tzKCk7CiB9CkBAIC0xODIsNiArMTk5LDE2IEBACiB9CiAKIEVYUE9SVAorc3NpemVfdCBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlU2l6ZShBTWVkaWFFeHRyYWN0b3IgKm1EYXRhKSB7CisgICAgc2l6ZV90IHNhbXBsZVNpemU7CisgICAgc3RhdHVzX3QgZXJyID0gbURhdGEtPm1JbXBsLT5nZXRTYW1wbGVTaXplKCZzYW1wbGVTaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIHNhbXBsZVNpemU7Cit9CisKK0VYUE9SVAogdWludDMyX3QgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUZsYWdzKEFNZWRpYUV4dHJhY3RvciAqbURhdGEpIHsKICAgICBpbnQgc2FtcGxlRmxhZ3MgPSAwOwogICAgIHNwPE1ldGFEYXRhPiBtZXRhOwpAQCAtMzc5LDYgKzQwNiw4MCBAQAogICAgICAgICAgICAgKHNpemVfdCopIGNyeXB0ZWRkYXRhKTsKIH0KIAorRVhQT1JUCitpbnQ2NF90IEFNZWRpYUV4dHJhY3Rvcl9nZXRDYWNoZWREdXJhdGlvbihBTWVkaWFFeHRyYWN0b3IgKmV4KSB7CisgICAgYm9vbCBlb3M7CisgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgIGlmIChleC0+bUltcGwtPmdldENhY2hlZER1cmF0aW9uKCZkdXJhdGlvblVzLCAmZW9zKSkgeworICAgICAgICByZXR1cm4gZHVyYXRpb25VczsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVGb3JtYXQoQU1lZGlhRXh0cmFjdG9yICpleCwgQU1lZGlhRm9ybWF0ICpmbXQpIHsKKyAgICBpZiAoZm10ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBzcDxNZXRhRGF0YT4gc2FtcGxlTWV0YTsKKyAgICBzdGF0dXNfdCBlcnIgPSBleC0+bUltcGwtPmdldFNhbXBsZU1ldGEoJnNhbXBsZU1ldGEpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihlcnIpOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBtZXRhOworICAgIEFNZWRpYUZvcm1hdF9nZXRGb3JtYXQoZm10LCAmbWV0YSk7CisgICAgbWV0YS0+Y2xlYXIoKTsKKworICAgIGludDMyX3QgbGF5ZXJJZDsKKyAgICBpZiAoc2FtcGxlTWV0YS0+ZmluZEludDMyKGtLZXlUZW1wb3JhbExheWVySWQsICZsYXllcklkKSkgeworICAgICAgICBtZXRhLT5zZXRJbnQzMihBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0lELCBsYXllcklkKTsKKyAgICB9CisKKyAgICBzaXplX3QgdHJhY2tJbmRleDsKKyAgICBlcnIgPSBleC0+bUltcGwtPmdldFNhbXBsZVRyYWNrSW5kZXgoJnRyYWNrSW5kZXgpOworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgbWV0YS0+c2V0SW50MzIoQU1FRElBRk9STUFUX0tFWV9UUkFDS19JTkRFWCwgdHJhY2tJbmRleCk7CisgICAgICAgIHNwPEFNZXNzYWdlPiB0cmFja0Zvcm1hdDsKKyAgICAgICAgQVN0cmluZyBtaW1lOworICAgICAgICBlcnIgPSBleC0+bUltcGwtPmdldFRyYWNrRm9ybWF0KHRyYWNrSW5kZXgsICZ0cmFja0Zvcm1hdCk7CisgICAgICAgIGlmIChlcnIgPT0gT0sKKyAgICAgICAgICAgICAgICAmJiB0cmFja0Zvcm1hdCAhPSBOVUxMCisgICAgICAgICAgICAgICAgJiYgdHJhY2tGb3JtYXQtPmZpbmRTdHJpbmcoQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldFN0cmluZyhBTUVESUFGT1JNQVRfS0VZX01JTUUsIG1pbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgIGlmIChzYW1wbGVNZXRhLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKKyAgICAgICAgbWV0YS0+c2V0SW50NjQoQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgZHVyYXRpb25Vcyk7CisgICAgfQorCisgICAgdWludDMyX3QgZGF0YVR5cGU7IC8vIHVudXNlZAorICAgIGNvbnN0IHZvaWQgKnNlaURhdGE7CisgICAgc2l6ZV90IHNlaUxlbmd0aDsKKyAgICBpZiAoc2FtcGxlTWV0YS0+ZmluZERhdGEoa0tleVNFSSwgJmRhdGFUeXBlLCAmc2VpRGF0YSwgJnNlaUxlbmd0aCkpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gc2VpID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KHNlaURhdGEsIHNlaUxlbmd0aCk7OworICAgICAgICBtZXRhLT5zZXRCdWZmZXIoQU1FRElBRk9STUFUX0tFWV9TRUksIHNlaSk7CisgICAgfQorCisgICAgY29uc3Qgdm9pZCAqbXBlZ1VzZXJEYXRhUG9pbnRlcjsKKyAgICBzaXplX3QgbXBlZ1VzZXJEYXRhTGVuZ3RoOworICAgIGlmIChzYW1wbGVNZXRhLT5maW5kRGF0YSgKKyAgICAgICAgICAgIGtLZXlNcGVnVXNlckRhdGEsICZkYXRhVHlwZSwgJm1wZWdVc2VyRGF0YVBvaW50ZXIsICZtcGVnVXNlckRhdGFMZW5ndGgpKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IG1wZWdVc2VyRGF0YSA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weShtcGVnVXNlckRhdGFQb2ludGVyLCBtcGVnVXNlckRhdGFMZW5ndGgpOworICAgICAgICBtZXRhLT5zZXRCdWZmZXIoQU1FRElBRk9STUFUX0tFWV9NUEVHX1VTRVJfREFUQSwgbXBlZ1VzZXJEYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9kaXNjb25uZWN0KEFNZWRpYUV4dHJhY3RvciAqIGV4KSB7CisgICAgZXgtPm1JbXBsLT5kaXNjb25uZWN0KCk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KIAogfSAvLyBleHRlcm4gIkMiCiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdC5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwCmluZGV4IGVlMjc1MjAuLmYzMmI4M2UgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdC5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0LmNwcApAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KICNpbmNsdWRlIDxhbmRyb2lkX3V0aWxfQmluZGVyLmg+CiAKQEAgLTEyNSw2ICsxMjQsMTQgQEAKICAgICAgICAgICAgICAgICByZXQuYXBwZW5kRm9ybWF0KCJkb3VibGUoJWYpIiwgdmFsKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlUmVjdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTsKKyAgICAgICAgICAgICAgICBmLT5maW5kUmVjdChuYW1lLCAmbGVmdCwgJnRvcCwgJnJpZ2h0LCAmYm90dG9tKTsKKyAgICAgICAgICAgICAgICByZXQuYXBwZW5kRm9ybWF0KCJSZWN0KCUiIFBSSWQzMiAiLCAlIiBQUklkMzIgIiwgJSIgUFJJZDMyICIsICUiIFBSSWQzMiAiKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVTdHJpbmc6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgQVN0cmluZyB2YWw7CkBAIC0xNjUsMTEgKzE3MiwyMiBAQAogfQogCiBFWFBPUlQKK2Jvb2wgQU1lZGlhRm9ybWF0X2dldERvdWJsZShBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciAqbmFtZSwgZG91YmxlICpvdXQpIHsKKyAgICByZXR1cm4gZm9ybWF0LT5tRm9ybWF0LT5maW5kRG91YmxlKG5hbWUsIG91dCk7Cit9CisKK0VYUE9SVAogYm9vbCBBTWVkaWFGb3JtYXRfZ2V0U2l6ZShBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90ICpvdXQpIHsKICAgICByZXR1cm4gZm9ybWF0LT5tRm9ybWF0LT5maW5kU2l6ZShuYW1lLCBvdXQpOwogfQogCiBFWFBPUlQKK2Jvb2wgQU1lZGlhRm9ybWF0X2dldFJlY3QoQU1lZGlhRm9ybWF0KiBmb3JtYXQsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKmxlZnQsIGludDMyX3QgKnRvcCwgaW50MzJfdCAqcmlnaHQsIGludDMyX3QgKmJvdHRvbSkgeworICAgIHJldHVybiBmb3JtYXQtPm1Gb3JtYXQtPmZpbmRSZWN0KG5hbWUsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7Cit9CisKK0VYUE9SVAogYm9vbCBBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKEFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyICpuYW1lLCB2b2lkKiogZGF0YSwgc2l6ZV90ICpvdXRzaXplKSB7CiAgICAgc3A8QUJ1ZmZlcj4gYnVmOwogICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRCdWZmZXIobmFtZSwgJmJ1ZikpIHsKQEAgLTIxNiw2ICsyMzQsMjIgQEAKIH0KIAogRVhQT1JUCit2b2lkIEFNZWRpYUZvcm1hdF9zZXREb3VibGUoQU1lZGlhRm9ybWF0KiBmb3JtYXQsIGNvbnN0IGNoYXIqIG5hbWUsIGRvdWJsZSB2YWx1ZSkgeworICAgIGZvcm1hdC0+bUZvcm1hdC0+c2V0RG91YmxlKG5hbWUsIHZhbHVlKTsKK30KKworRVhQT1JUCit2b2lkIEFNZWRpYUZvcm1hdF9zZXRTaXplKEFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyKiBuYW1lLCBzaXplX3QgdmFsdWUpIHsKKyAgICBmb3JtYXQtPm1Gb3JtYXQtPnNldFNpemUobmFtZSwgdmFsdWUpOworfQorCitFWFBPUlQKK3ZvaWQgQU1lZGlhRm9ybWF0X3NldFJlY3QoQU1lZGlhRm9ybWF0KiBmb3JtYXQsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbGVmdCwgaW50MzJfdCB0b3AsIGludDMyX3QgcmlnaHQsIGludDMyX3QgYm90dG9tKSB7CisgICAgZm9ybWF0LT5tRm9ybWF0LT5zZXRSZWN0KG5hbWUsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7Cit9CisKK0VYUE9SVAogdm9pZCBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKEFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSkgewogICAgIC8vIEFNZXNzYWdlOjpzZXRTdHJpbmcoKSBtYWtlcyBhIGNvcHkgb2YgdGhlIHN0cmluZwogICAgIGZvcm1hdC0+bUZvcm1hdC0+c2V0U3RyaW5nKG5hbWUsIHZhbHVlLCBzdHJsZW4odmFsdWUpKTsKQEAgLTIzMywzMCArMjY3LDcyIEBACiB9CiAKIAorRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IgPSAiYWFjLWRyYy1jdXQtbGV2ZWwiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX0RSQ19CT09TVF9GQUNUT1IgPSAiYWFjLWRyYy1ib29zdC1sZXZlbCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfRFJDX0hFQVZZX0NPTVBSRVNTSU9OID0gImFhYy1kcmMtaGVhdnktY29tcHJlc3Npb24iOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX0RSQ19UQVJHRVRfUkVGRVJFTkNFX0xFVkVMID0gImFhYy10YXJnZXQtcmVmLWxldmVsIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19FTkNPREVEX1RBUkdFVF9MRVZFTCA9ICJhYWMtZW5jb2RlZC10YXJnZXQtbGV2ZWwiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX01BWF9PVVRQVVRfQ0hBTk5FTF9DT1VOVCA9ICJhYWMtbWF4LW91dHB1dC1jaGFubmVsX2NvdW50IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19QUk9GSUxFID0gImFhYy1wcm9maWxlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19TQlJfTU9ERSA9ICJhYWMtc2JyLW1vZGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fU0VTU0lPTl9JRCA9ICJhdWRpby1zZXNzaW9uLWlkIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0JJVFJBVEVfTU9ERSA9ICJiaXRyYXRlLW1vZGUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUgPSAiYml0cmF0ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DQVBUVVJFX1JBVEUgPSAiY2FwdHVyZS1yYXRlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQgPSAiY2hhbm5lbC1jb3VudCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX01BU0sgPSAiY2hhbm5lbC1tYXNrIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX0ZPUk1BVCA9ICJjb2xvci1mb3JtYXQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfUkFOR0UgPSAiY29sb3ItcmFuZ2UiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfU1RBTkRBUkQgPSAiY29sb3Itc3RhbmRhcmQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfVFJBTlNGRVIgPSAiY29sb3ItdHJhbnNmZXIiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09NUExFWElUWSA9ICJjb21wbGV4aXR5IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRCA9ICJjc2QiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAgPSAiY3NkLTAiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzEgPSAiY3NkLTEiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzIgPSAiY3NkLTIiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9DUk9QID0gImNyb3AiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9IRUlHSFQgPSAiZGlzcGxheS1oZWlnaHQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9XSURUSCA9ICJkaXNwbGF5LXdpZHRoIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OID0gImR1cmF0aW9uVXMiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRkxBQ19DT01QUkVTU0lPTl9MRVZFTCA9ICJmbGFjLWNvbXByZXNzaW9uLWxldmVsIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX1JBVEUgPSAiZnJhbWUtcmF0ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9HUklEX0NPTFVNTlMgPSAiZ3JpZC1jb2xzIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0dSSURfUk9XUyA9ICJncmlkLXJvd3MiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSERSX1NUQVRJQ19JTkZPID0gImhkci1zdGF0aWMtaW5mbyI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9IRUlHSFQgPSAiaGVpZ2h0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lOVFJBX1JFRlJFU0hfUEVSSU9EID0gImludHJhLXJlZnJlc2gtcGVyaW9kIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0FEVFMgPSAiaXMtYWR0cyI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19BVVRPU0VMRUNUID0gImlzLWF1dG9zZWxlY3QiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfREVGQVVMVCA9ICJpcy1kZWZhdWx0IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRSA9ICJpcy1mb3JjZWQtc3VidGl0bGUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSV9GUkFNRV9JTlRFUlZBTCA9ICJpLWZyYW1lLWludGVydmFsIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xBTkdVQUdFID0gImxhbmd1YWdlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xBVEVOQ1kgPSAibGF0ZW5jeSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MRVZFTCA9ICJsZXZlbCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfSEVJR0hUID0gIm1heC1oZWlnaHQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUgPSAibWF4LWlucHV0LXNpemUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX1dJRFRIID0gIm1heC13aWR0aCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NSU1FID0gIm1pbWUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTVBFR19VU0VSX0RBVEEgPSAibXBlZy11c2VyLWRhdGEiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfT1BFUkFUSU5HX1JBVEUgPSAib3BlcmF0aW5nLXJhdGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HID0gInBjbS1lbmNvZGluZyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QUklPUklUWSA9ICJwcmlvcml0eSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QUk9GSUxFID0gInByb2ZpbGUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFVTSF9CTEFOS19CVUZGRVJTX09OX1NUT1AgPSAicHVzaC1ibGFuay1idWZmZXJzLW9uLXNodXRkb3duIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9BRlRFUiA9ICJyZXBlYXQtcHJldmlvdXMtZnJhbWUtYWZ0ZXIiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUk9UQVRJT04gPSAicm90YXRpb24tZGVncmVlcyI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSA9ICJzYW1wbGUtcmF0ZSI7Ci1FWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9XSURUSCA9ICJ3aWR0aCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TRUkgPSAic2VpIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NMSUNFX0hFSUdIVCA9ICJzbGljZS1oZWlnaHQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU1RSSURFID0gInN0cmlkZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9JRCA9ICJ0ZW1wb3JhbC1sYXllci1pZCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUklORyA9ICJ0cy1zY2hlbWEiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVElMRV9IRUlHSFQgPSAidGlsZS1oZWlnaHQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVElMRV9XSURUSCA9ICJ0aWxlLXdpZHRoIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMgPSAidGltZVVzIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lEID0gInRyYWNrLWlkIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lOREVYID0gInRyYWNrLWluZGV4IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1dJRFRIID0gIndpZHRoIjsKIAogCiB9IC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYU11eGVyLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYU11eGVyLmNwcAppbmRleCA4MGE0MzkxLi5kZmZjNGQ3IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFNdXhlci5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhTXV4ZXIuY3BwCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL09XTkVSUyBiL21lZGlhL25kay9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFlODM0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL25kay9PV05FUlMKQEAgLTAsMCArMSw1IEBACittYXJjb25lQGdvb2dsZS5jb20KKyMgRm9yIEFJbWFnZS9BSW1hZ2VSZWFkZXIKK2V0YWx2YWxhQGdvb2dsZS5jb20KK3lpbmNoaWF5ZWhAZ29vZ2xlLmNvbQoremhpanVuaGVAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2UuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlLmgKaW5kZXggMTkzMTQ5Ni4uMTlkZjc2MCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2UuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZS5oCkBAIC00NCwxMSArNDQsNyBAQAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmVfYnVmZmVyLmg+CiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI2ICovCiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyNAorX19CRUdJTl9ERUNMUwogCiAvKioKICAqIEFJbWFnZSBpcyBhbiBvcGFxdWUgdHlwZSB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byBpbWFnZSBnZW5lcmF0ZWQgYnkge0BsaW5rIEFJbWFnZVJlYWRlcn0uCkBAIC03NiwxNCArNzIsMTUgQEAKICAgICBBSU1BR0VfRk9STUFUX1JHQkFfODg4OCAgICAgICAgID0gMHgxLAogCiAgICAgLyoqCi0gICAgICogMzIgYml0cyBSR0JYIGZvcm1hdCwgOCBiaXRzIGZvciBlYWNoIG9mIHRoZSBmb3VyIGNoYW5uZWxzLgorICAgICAqIDMyIGJpdHMgUkdCWCBmb3JtYXQsIDggYml0cyBmb3IgZWFjaCBvZiB0aGUgZm91ciBjaGFubmVscy4gIFRoZSB2YWx1ZXMKKyAgICAgKiBvZiB0aGUgYWxwaGEgY2hhbm5lbCBiaXRzIGFyZSBpZ25vcmVkIChpbWFnZSBpcyBhc3N1bWVkIHRvIGJlIG9wYXF1ZSkuCiAgICAgICoKICAgICAgKiA8cD4KICAgICAgKiBDb3JyZXNwb25kaW5nIGZvcm1hdHM6CiAgICAgICogPHVsPgogICAgICAqIDxsaT5BSGFyZHdhcmVCdWZmZXI6IEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfUjhHOEI4WDhfVU5PUk08L2xpPgogICAgICAqIDxsaT5WdWxrYW46IFZLX0ZPUk1BVF9SOEc4QjhBOF9VTk9STTwvbGk+Ci0gICAgICogPGxpPk9wZW5HTCBFUzogR0xfUkdCQTg8L2xpPgorICAgICAqIDxsaT5PcGVuR0wgRVM6IEdMX1JHQjg8L2xpPgogICAgICAqIDwvdWw+CiAgICAgICogPC9wPgogICAgICAqCkBAIC01MTksNiArNTE2LDggQEAKICAgICBpbnQzMl90IGJvdHRvbTsKIH0gQUltYWdlQ3JvcFJlY3Q7CiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjQKKwogLyoqCiAgKiBSZXR1cm4gdGhlIGltYWdlIGJhY2sgdGhlIHRoZSBzeXN0ZW0gYW5kIGRlbGV0ZSB0aGUgQUltYWdlIG9iamVjdCBmcm9tIG1lbW9yeS4KICAqCkBAIC03MTksNyArNzE4LDcgQEAKIAogI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyNgogCi0vKgorLyoqCiAgKiBSZXR1cm4gdGhlIGltYWdlIGJhY2sgdGhlIHRoZSBzeXN0ZW0gYW5kIGRlbGV0ZSB0aGUgQUltYWdlIG9iamVjdCBmcm9tIG1lbW9yeSBhc3luY2hyb25vdXNseS4KICAqCiAgKiA8cD5TaW1pbGFyIHRvIHtAbGluayBBSW1hZ2VfZGVsZXRlfSwgZG8gTk9UIHVzZSB0aGUgaW1hZ2UgcG9pbnRlciBhZnRlciB0aGlzIG1ldGhvZCByZXR1cm5zLgpAQCAtNzQ4LDggKzc0Nyw5IEBACiAgKiBBSGFyZHdhcmVCdWZmZXJfYWNxdWlyZX0gdG8gYWNxdWlyZSBhbiBleHRyYSByZWZlcmVuY2UsIGFuZCBjYWxsIHtAbGluayBBSGFyZHdhcmVCdWZmZXJfcmVsZWFzZX0KICAqIG9uY2UgaXQgaGFzIGZpbmlzaGVkIHVzaW5nIGl0IGluIG9yZGVyIHRvIHByb3Blcmx5IGRlYWxsb2NhdGUgdGhlIHVuZGVybHlpbmcgbWVtb3J5IG1hbmFnZWQgYnkKICAqIHtAbGluayBBSGFyZHdhcmVCdWZmZXJ9LiBJZiB0aGUgY2FsbGVyIGhhcyBhY3F1aXJlZCBleHRyYSByZWZlcmVuY2Ugb24gYW4ge0BsaW5rIEFIYXJkd2FyZUJ1ZmZlcn0KLSAqIHJldHVybmVkIGZyb20gdGhpcyBmdW5jdGlvbiwgaXQgbXVzdCBhbHNvIGxpc3RlbiB0byB7QGxpbmsgb25CdWZmZXJGcmVlZH0gY2FsbGJhY2sgdG8gYmUKLSAqIG5vdGlmaWVkIHdoZW4gdGhlIGJ1ZmZlciBpcyBubyBsb25nZXIgdXNlZCBieSB7QGxpbmsgQUltYWdlUmVhZGVyfS48L3A+CisgKiByZXR1cm5lZCBmcm9tIHRoaXMgZnVuY3Rpb24sIGl0IG11c3QgYWxzbyByZWdpc3RlciBhIGxpc3RlbmVyIHVzaW5nIHRoZSBmdW5jdGlvbgorICoge0BsaW5rIEFJbWFnZVJlYWRlcl9zZXRCdWZmZXJSZW1vdmVkTGlzdGVuZXJ9IHRvIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGJ1ZmZlciBpcyBubyBsb25nZXIgdXNlZAorICogYnkge0BsaW5rIEFJbWFnZVJlYWRlcn0uPC9wPgogICoKICAqIEBwYXJhbSBpbWFnZSB0aGUge0BsaW5rIEFJbWFnZX0gb2YgaW50ZXJlc3QuCiAgKiBAcGFyYW0gb3V0QnVmZmVyIFRoZSBtZW1vcnkgYXJlYSBwb2ludGVkIHRvIGJ5IGJ1ZmZlciB3aWxsIGNvbnRhaW4gdGhlIGFjcXVpcmVkIEFIYXJkd2FyZUJ1ZmZlcgpAQCAtNzY0LDkgKzc2NCw3IEBACiAKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjYgKi8KIAotI2lmZGVmIF9fY3BsdXNwbHVzCi19IC8vIGV4dGVybiAiQyIKLSNlbmRpZgorX19FTkRfREVDTFMKIAogI2VuZGlmIC8vX05ES19JTUFHRV9ICiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlUmVhZGVyLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZVJlYWRlci5oCmluZGV4IDdhMGMxN2IuLjU3MTQxMGIgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlUmVhZGVyLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2VSZWFkZXIuaApAQCAtNDIsMTEgKzQyLDcgQEAKICNpbmNsdWRlICJOZGtNZWRpYUVycm9yLmgiCiAjaW5jbHVkZSAiTmRrSW1hZ2UuaCIKIAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDI0CitfX0JFR0lOX0RFQ0xTCiAKIC8qKgogICogQUltYWdlIGlzIGFuIG9wYXF1ZSB0eXBlIHRoYXQgYWxsb3dzIGRpcmVjdCBhcHBsaWNhdGlvbiBhY2Nlc3MgdG8gaW1hZ2UgZGF0YSByZW5kZXJlZCBpbnRvIGEKQEAgLTU0LDYgKzUwLDggQEAKICAqLwogdHlwZWRlZiBzdHJ1Y3QgQUltYWdlUmVhZGVyIEFJbWFnZVJlYWRlcjsKIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyNAorCiAvKioKICAqIENyZWF0ZSBhIG5ldyByZWFkZXIgZm9yIGltYWdlcyBvZiB0aGUgZGVzaXJlZCBzaXplIGFuZCBmb3JtYXQuCiAgKgpAQCAtMjU4LDcgKzI1Niw3IEBACiAKIAogLyoqCi0gKiBUaGUgZGVmaW5pdGlvbiBvZiB7QGxpbmsgQUltYWdlUmVhZGVyfSBuZXcgaW1hZ2UgYXZhaWxhYmxlIGNhbGxiYWNrLgorICogU2lnbmF0dXJlIG9mIHRoZSBjYWxsYmFjayB3aGljaCBpcyBjYWxsZWQgd2hlbiBhIG5ldyBpbWFnZSBpcyBhdmFpbGFibGUgZnJvbSB7QGxpbmsgQUltYWdlUmVhZGVyfS4KICAqCiAgKiBAcGFyYW0gY29udGV4dCBUaGUgb3B0aW9uYWwgYXBwbGljYXRpb24gY29udGV4dCBwcm92aWRlZCBieSB1c2VyIGluCiAgKiAgICAgICAgICAgICAgICB7QGxpbmsgQUltYWdlUmVhZGVyX3NldEltYWdlTGlzdGVuZXJ9LgpAQCAtMjY3LDExICsyNjUsMTEgQEAKIHR5cGVkZWYgdm9pZCAoKkFJbWFnZVJlYWRlcl9JbWFnZUNhbGxiYWNrKSh2b2lkKiBjb250ZXh0LCBBSW1hZ2VSZWFkZXIqIHJlYWRlcik7CiAKIHR5cGVkZWYgc3RydWN0IEFJbWFnZVJlYWRlcl9JbWFnZUxpc3RlbmVyIHsKLSAgICAvLy8gb3B0aW9uYWwgYXBwbGljYXRpb24gY29udGV4dC4KKyAgICAvLy8gT3B0aW9uYWwgYXBwbGljYXRpb24gY29udGV4dCBwYXNzZWQgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciBvZiB0aGUgY2FsbGJhY2suCiAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgY29udGV4dDsKIAogICAgIC8qKgotICAgICAqIFRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgYSBuZXcgaW1hZ2UgYXZhaWxhYmxlIGZvciBpbiB0aGUgaW1hZ2UgcmVhZGVyJ3MgcXVldWUuCisgICAgICogVGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcyBhIG5ldyBpbWFnZSBhdmFpbGFibGUgaW4gdGhlIGltYWdlIHJlYWRlcidzIHF1ZXVlLgogICAgICAqCiAgICAgICogPHA+VGhlIGNhbGxiYWNrIGhhcHBlbnMgb24gb25lIGRlZGljYXRlZCB0aHJlYWQgcGVyIHtAbGluayBBSW1hZ2VSZWFkZXJ9IGluc3RhbmNlLiBJdCBpcyBva2F5CiAgICAgICogdG8gdXNlIEFJbWFnZVJlYWRlcl8qIGFuZCBBSW1hZ2VfKiBtZXRob2RzIHdpdGhpbiB0aGUgY2FsbGJhY2suIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSB0aGF0CkBAIC0yODcsMTEgKzI4NSwxMSBAQAogLyoqCiAgKiBTZXQgdGhlIG9uSW1hZ2VBdmFpbGFibGUgbGlzdGVuZXIgb2YgdGhpcyBpbWFnZSByZWFkZXIuCiAgKgotICogPHA+Tm90ZSB0aGF0IGNhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCByZXBsYWNlIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuPC9wPgorICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHJlcGxhY2UgcHJldmlvdXNseSByZWdpc3RlcmVkIGxpc3RlbmVycy4KICAqCiAgKiBAcGFyYW0gcmVhZGVyIFRoZSBpbWFnZSByZWFkZXIgb2YgaW50ZXJlc3QuCi0gKiBAcGFyYW0gbGlzdGVuZXIgdGhlIHtAbGluayBBSW1hZ2VSZWFkZXJfSW1hZ2VMaXN0ZW5lcn0gdG8gYmUgcmVnaXN0ZXJlZC4gU2V0IHRoaXMgdG8gTlVMTCBpZgotICogICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIG5vIGxvbmdlciBuZWVkcyB0byBsaXN0ZW4gdG8gbmV3IGltYWdlcy4KKyAqIEBwYXJhbSBsaXN0ZW5lciBUaGUge0BsaW5rIEFJbWFnZVJlYWRlcl9JbWFnZUxpc3RlbmVyfSB0byBiZSByZWdpc3RlcmVkLiBTZXQgdGhpcyB0byBOVUxMIGlmCisgKiAgICAgICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIG5vIGxvbmdlciBuZWVkcyB0byBsaXN0ZW4gdG8gbmV3IGltYWdlcy4KICAqCiAgKiBAcmV0dXJuIDx1bD4KICAqICAgICAgICAgPGxpPntAbGluayBBTUVESUFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgpAQCAtMzA3LDkgKzMwNSw5IEBACiAvKioKICAqIEFJbWFnZVJlYWRlciBjb25zdHJ1Y3RvciBzaW1pbGFyIHRvIHtAbGluayBBSW1hZ2VSZWFkZXJfbmV3fSB0aGF0IHRha2VzIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyCiAgKiBmb3IgdGhlIGNvbnN1bWVyIHVzYWdlLiBBbGwgb3RoZXIgcGFyYW1ldGVycyBhbmQgdGhlIHJldHVybiB2YWx1ZXMgYXJlIGlkZW50aWNhbCB0byB0aG9zZSBwYXNzZWQKLSAqIHRvIHtAbGluZSBBSW1hZ2VSZWFkZXJfbmV3fS4KKyAqIHRvIHtAbGluayBBSW1hZ2VSZWFkZXJfbmV3fS4KICAqCi0gKiA8cD5JZiB0aGUge0Bjb2RlIGZvcm1hdH0gaXMge0BsaW5rIEFJTUFHRV9GT1JNQVRfUFJJVkFURX0sIHRoZSBjcmVhdGVkIHtAbGluayBBSW1hZ2VSZWFkZXJ9CisgKiA8cD5JZiB0aGUgXGMgZm9ybWF0IGlzIHtAbGluayBBSU1BR0VfRk9STUFUX1BSSVZBVEV9LCB0aGUgY3JlYXRlZCB7QGxpbmsgQUltYWdlUmVhZGVyfQogICogd2lsbCBwcm9kdWNlIGltYWdlcyB3aG9zZSBjb250ZW50cyBhcmUgbm90IGRpcmVjdGx5IGFjY2Vzc2libGUgYnkgdGhlIGFwcGxpY2F0aW9uLiBUaGUgYXBwbGljYXRpb24gY2FuCiAgKiBzdGlsbCBhY3F1aXJlIGltYWdlcyBmcm9tIHRoaXMge0BsaW5rIEFJbWFnZVJlYWRlcn0gYW5kIGFjY2VzcyB7QGxpbmsgQUhhcmR3YXJlQnVmZmVyfSB2aWEKICAqIHtAbGluayBBSW1hZ2VfZ2V0SGFyZHdhcmVCdWZmZXIoKX0uIFRoZSB7QGxpbmsgQUhhcmR3YXJlQnVmZmVyfSBnYWluZWQgdGhpcyB3YXkgY2FuIHRoZW4KQEAgLTMyNCw3ICszMjIsNyBAQAogICogQUltYWdlUmVhZGVyfXMgdXNpbmcgb3RoZXIgZm9ybWF0IHN1Y2ggYXMge0BsaW5rIEFJTUFHRV9GT1JNQVRfWVVWXzQyMF84ODh9LjwvcD4KICAqCiAgKiA8cD5Ob3RlIHRoYXQgbm90IGFsbCBmb3JtYXQgYW5kIHVzYWdlIGZsYWcgY29tYmluYXRpb24gaXMgc3VwcG9ydGVkIGJ5IHRoZSB7QGxpbmsgQUltYWdlUmVhZGVyfSwKLSAqIGVzcGVjaWFsbHkgaWYge0Bjb2RlIGZvcm1hdH0gaXMge0BsaW5rIEFJTUFHRV9GT1JNQVRfUFJJVkFURX0sIHtAY29kZSB1c2FnZX0gbXVzdCBub3QgaW5jbHVkZSBlaXRoZXIKKyAqIGVzcGVjaWFsbHkgaWYgXGMgZm9ybWF0IGlzIHtAbGluayBBSU1BR0VfRk9STUFUX1BSSVZBVEV9LCBcYyB1c2FnZSBtdXN0IG5vdCBpbmNsdWRlIGVpdGhlcgogICoge0BsaW5rIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9SRUFEX1JBUkVMWX0gb3Ige0BsaW5rIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9SRUFEX09GVEVOfTwvcD4KICAqCiAgKiBAcGFyYW0gd2lkdGggVGhlIGRlZmF1bHQgd2lkdGggaW4gcGl4ZWxzIG9mIHRoZSBJbWFnZXMgdGhhdCB0aGlzIHJlYWRlciB3aWxsIHByb2R1Y2UuCkBAIC0zNjksNyArMzY3LDcgQEAKICAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QgZm9ybWF0LCB1aW50NjRfdCB1c2FnZSwgaW50MzJfdCBtYXhJbWFnZXMsCiAgICAgICAgIC8qb3V0Ki8gQUltYWdlUmVhZGVyKiogcmVhZGVyKTsKIAotLyoKKy8qKgogICogQWNxdWlyZSB0aGUgbmV4dCB7QGxpbmsgQUltYWdlfSBmcm9tIHRoZSBpbWFnZSByZWFkZXIncyBxdWV1ZSBhc3luY2hyb25vdXNseS4KICAqCiAgKiA8cD5BSW1hZ2VSZWFkZXIgYWNxdWlyZSBtZXRob2Qgc2ltaWxhciB0byB7QGxpbmsgQUltYWdlUmVhZGVyX2FjcXVpcmVOZXh0SW1hZ2V9IHRoYXQgdGFrZXMgYW4KQEAgLTM3OSw3ICszNzcsNyBAQAogICogQHBhcmFtIGFjcXVpcmVGZW5jZUZkIEEgc3luYyBmZW5jZSBmZCBkZWZpbmVkIGluIHtAbGluayBzeW5jLmh9LCB3aGljaCBpcyB1c2VkIHRvIHNpZ25hbCB3aGVuIHRoZQogICogICAgICAgICBidWZmZXIgaXMgcmVhZHkgdG8gY29uc3VtZS4gV2hlbiBzeW5jaHJvbml6YXRpb24gZmVuY2UgaXMgbm90IG5lZWRlZCwgZmVuY2Ugd2lsbCBiZSBzZXQKICAqICAgICAgICAgdG8gLTEgYW5kIHRoZSB7QGxpbmsgQUltYWdlfSByZXR1cm5lZCBpcyByZWFkeSBmb3IgdXNlIGltbWVkaWF0ZWx5LiBPdGhlcndpc2UsIHVzZXIgc2hhbGwKLSAqICAgICAgICAgdXNlIHN5c2NhbGxzIHN1Y2ggYXMge0Bjb2RlIHBvbGwoKX0sIHtAY29kZSBlcG9sbCgpfSwge0Bjb2RlIHNlbGVjdCgpfSB0byB3YWl0IGZvciB0aGUKKyAqICAgICAgICAgdXNlIHN5c2NhbGxzIHN1Y2ggYXMgXGMgcG9sbCgpLCBcYyBlcG9sbCgpLCBcYyBzZWxlY3QoKSB0byB3YWl0IGZvciB0aGUKICAqICAgICAgICAgZmVuY2UgZmQgdG8gY2hhbmdlIHN0YXR1cyBiZWZvcmUgYXR0ZW1wdGluZyB0byBhY2Nlc3MgdGhlIHtAbGluayBBSW1hZ2V9IHJldHVybmVkLgogICoKICAqIEBzZWUgc3luYy5oCkBAIC0zODgsNyArMzg2LDcgQEAKIG1lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9hY3F1aXJlTmV4dEltYWdlQXN5bmMoCiAgICAgICAgIEFJbWFnZVJlYWRlciogcmVhZGVyLCAvKm91dCovQUltYWdlKiogaW1hZ2UsIC8qb3V0Ki9pbnQqIGFjcXVpcmVGZW5jZUZkKTsKIAotLyoKKy8qKgogICogQWNxdWlyZSB0aGUgbGF0ZXN0IHtAbGluayBBSW1hZ2V9IGZyb20gdGhlIGltYWdlIHJlYWRlcidzIHF1ZXVlIGFzeW5jaHJvbm91c2x5LCBkcm9wcGluZyBvbGRlcgogICogaW1hZ2VzLgogICoKQEAgLTM5OSw3ICszOTcsNyBAQAogICogQHBhcmFtIGFjcXVpcmVGZW5jZUZkIEEgc3luYyBmZW5jZSBmZCBkZWZpbmVkIGluIHtAbGluayBzeW5jLmh9LCB3aGljaCBpcyB1c2VkIHRvIHNpZ25hbCB3aGVuIHRoZQogICogICAgICAgICBidWZmZXIgaXMgcmVhZHkgdG8gY29uc3VtZS4gV2hlbiBzeW5jaHJvbml6YXRpb24gZmVuY2UgaXMgbm90IG5lZWRlZCwgZmVuY2Ugd2lsbCBiZSBzZXQKICAqICAgICAgICAgdG8gLTEgYW5kIHRoZSB7QGxpbmsgQUltYWdlfSByZXR1cm5lZCBpcyByZWFkeSBmb3IgdXNlIGltbWVkaWF0ZWx5LiBPdGhlcndpc2UsIHVzZXIgc2hhbGwKLSAqICAgICAgICAgdXNlIHN5c2NhbGxzIHN1Y2ggYXMge0Bjb2RlIHBvbGwoKX0sIHtAY29kZSBlcG9sbCgpfSwge0Bjb2RlIHNlbGVjdCgpfSB0byB3YWl0IGZvciB0aGUKKyAqICAgICAgICAgdXNlIHN5c2NhbGxzIHN1Y2ggYXMgXGMgcG9sbCgpLCBcYyBlcG9sbCgpLCBcYyBzZWxlY3QoKSB0byB3YWl0IGZvciB0aGUKICAqICAgICAgICAgZmVuY2UgZmQgdG8gY2hhbmdlIHN0YXR1cyBiZWZvcmUgYXR0ZW1wdGluZyB0byBhY2Nlc3MgdGhlIHtAbGluayBBSW1hZ2V9IHJldHVybmVkLgogICoKICAqIEBzZWUgc3luYy5oCkBAIC00MDgsNyArNDA2LDcgQEAKIG1lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9hY3F1aXJlTGF0ZXN0SW1hZ2VBc3luYygKICAgICAgICAgQUltYWdlUmVhZGVyKiByZWFkZXIsIC8qb3V0Ki9BSW1hZ2UqKiBpbWFnZSwgLypvdXQqL2ludCogYWNxdWlyZUZlbmNlRmQpOwogLyoqCi0gKiBUaGUgZGVmaW5pdGlvbiBvZiB7QGxpbmsgQUltYWdlUmVhZGVyfSBidWZmZXIgcmVtb3ZlZCBjYWxsYmFjay4KKyAqIFNpZ25hdHVyZSBvZiB0aGUgY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIHdoZW4ge0BsaW5rIEFJbWFnZVJlYWRlcn0gaXMgYWJvdXQgdG8gcmVtb3ZlIGEgYnVmZmVyLgogICoKICAqIEBwYXJhbSBjb250ZXh0IFRoZSBvcHRpb25hbCBhcHBsaWNhdGlvbiBjb250ZXh0IHByb3ZpZGVkIGJ5IHVzZXIgaW4KICAqICAgICAgICAgICAgICAgIHtAbGluayBBSW1hZ2VSZWFkZXJfc2V0QnVmZmVyUmVtb3ZlZExpc3RlbmVyfS4KQEAgLTQyMCw3ICs0MTgsNyBAQAogICAgICAgICBBSGFyZHdhcmVCdWZmZXIqIGJ1ZmZlcik7CiAKIHR5cGVkZWYgc3RydWN0IEFJbWFnZVJlYWRlcl9CdWZmZXJSZW1vdmVkTGlzdGVuZXIgewotICAgIC8vLyBvcHRpb25hbCBhcHBsaWNhdGlvbiBjb250ZXh0LgorICAgIC8vLyBPcHRpb25hbCBhcHBsaWNhdGlvbiBjb250ZXh0IHBhc3NlZCBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyIG9mIHRoZSBjYWxsYmFjay4KICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OwogCiAgICAgLyoqCkBAIC00NjUsMTAgKzQ2Myw3IEBACiAKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjYgKi8KIAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gLy8gZXh0ZXJuICJDIgotI2VuZGlmCitfX0VORF9ERUNMUwogCiAjZW5kaWYgLy9fTkRLX0lNQUdFX1JFQURFUl9ICiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ29kZWMuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ29kZWMuaAppbmRleCA3ZTdlODFlLi5mNGE1MWQwIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNvZGVjLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDb2RlYy5oCkBAIC0zNCwxMyArMzQsMTEgQEAKICNpbmNsdWRlICJOZGtNZWRpYUVycm9yLmgiCiAjaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXQuaCIKIAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgorX19CRUdJTl9ERUNMUwogCiBzdHJ1Y3QgQU5hdGl2ZVdpbmRvdzsKK3R5cGVkZWYgc3RydWN0IEFOYXRpdmVXaW5kb3cgQU5hdGl2ZVdpbmRvdzsKIAotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyMQogCiBzdHJ1Y3QgQU1lZGlhQ29kZWM7CiB0eXBlZGVmIHN0cnVjdCBBTWVkaWFDb2RlYyBBTWVkaWFDb2RlYzsKQEAgLTU1LDE0ICs1Myw2OCBAQAogdHlwZWRlZiBzdHJ1Y3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvIEFNZWRpYUNvZGVjQ3J5cHRvSW5mbzsKIAogZW51bSB7CisgICAgQU1FRElBQ09ERUNfQlVGRkVSX0ZMQUdfQ09ERUNfQ09ORklHID0gMiwKICAgICBBTUVESUFDT0RFQ19CVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNID0gNCwKKyAgICBBTUVESUFDT0RFQ19CVUZGRVJfRkxBR19QQVJUSUFMX0ZSQU1FID0gOCwKKwogICAgIEFNRURJQUNPREVDX0NPTkZJR1VSRV9GTEFHX0VOQ09ERSA9IDEsCiAgICAgQU1FRElBQ09ERUNfSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEID0gLTMsCiAgICAgQU1FRElBQ09ERUNfSU5GT19PVVRQVVRfRk9STUFUX0NIQU5HRUQgPSAtMiwKLSAgICBBTUVESUFDT0RFQ19JTkZPX1RSWV9BR0FJTl9MQVRFUiA9IC0xCisgICAgQU1FRElBQ09ERUNfSU5GT19UUllfQUdBSU5fTEFURVIgPSAtMSwKIH07CiAKIC8qKgorICogQ2FsbGVkIHdoZW4gYW4gaW5wdXQgYnVmZmVyIGJlY29tZXMgYXZhaWxhYmxlLgorICogVGhlIHNwZWNpZmllZCBpbmRleCBpcyB0aGUgaW5kZXggb2YgdGhlIGF2YWlsYWJsZSBpbnB1dCBidWZmZXIuCisgKi8KK3R5cGVkZWYgdm9pZCAoKkFNZWRpYUNvZGVjT25Bc3luY0lucHV0QXZhaWxhYmxlKSgKKyAgICAgICAgQU1lZGlhQ29kZWMgKmNvZGVjLAorICAgICAgICB2b2lkICp1c2VyZGF0YSwKKyAgICAgICAgaW50MzJfdCBpbmRleCk7CisvKioKKyAqIENhbGxlZCB3aGVuIGFuIG91dHB1dCBidWZmZXIgYmVjb21lcyBhdmFpbGFibGUuCisgKiBUaGUgc3BlY2lmaWVkIGluZGV4IGlzIHRoZSBpbmRleCBvZiB0aGUgYXZhaWxhYmxlIG91dHB1dCBidWZmZXIuCisgKiBUaGUgc3BlY2lmaWVkIGJ1ZmZlckluZm8gY29udGFpbnMgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBhdmFpbGFibGUgb3V0cHV0IGJ1ZmZlci4KKyAqLwordHlwZWRlZiB2b2lkICgqQU1lZGlhQ29kZWNPbkFzeW5jT3V0cHV0QXZhaWxhYmxlKSgKKyAgICAgICAgQU1lZGlhQ29kZWMgKmNvZGVjLAorICAgICAgICB2b2lkICp1c2VyZGF0YSwKKyAgICAgICAgaW50MzJfdCBpbmRleCwKKyAgICAgICAgQU1lZGlhQ29kZWNCdWZmZXJJbmZvICpidWZmZXJJbmZvKTsKKy8qKgorICogQ2FsbGVkIHdoZW4gdGhlIG91dHB1dCBmb3JtYXQgaGFzIGNoYW5nZWQuCisgKiBUaGUgc3BlY2lmaWVkIGZvcm1hdCBjb250YWlucyB0aGUgbmV3IG91dHB1dCBmb3JtYXQuCisgKi8KK3R5cGVkZWYgdm9pZCAoKkFNZWRpYUNvZGVjT25Bc3luY0Zvcm1hdENoYW5nZWQpKAorICAgICAgICBBTWVkaWFDb2RlYyAqY29kZWMsCisgICAgICAgIHZvaWQgKnVzZXJkYXRhLAorICAgICAgICBBTWVkaWFGb3JtYXQgKmZvcm1hdCk7CisvKioKKyAqIENhbGxlZCB3aGVuIHRoZSBNZWRpYUNvZGVjIGVuY291bnRlcmVkIGFuIGVycm9yLgorICogVGhlIHNwZWNpZmllZCBhY3Rpb25Db2RlIGluZGljYXRlcyB0aGUgcG9zc2libGUgYWN0aW9ucyB0aGF0IGNsaWVudCBjYW4gdGFrZSwKKyAqIGFuZCBpdCBjYW4gYmUgY2hlY2tlZCBieSBjYWxsaW5nIEFNZWRpYUNvZGVjQWN0aW9uQ29kZV9pc1JlY292ZXJhYmxlIG9yCisgKiBBTWVkaWFDb2RlY0FjdGlvbkNvZGVfaXNUcmFuc2llbnQuIElmIGJvdGggQU1lZGlhQ29kZWNBY3Rpb25Db2RlX2lzUmVjb3ZlcmFibGUoKQorICogYW5kIEFNZWRpYUNvZGVjQWN0aW9uQ29kZV9pc1RyYW5zaWVudCgpIHJldHVybiBmYWxzZSwgdGhlbiB0aGUgY29kZWMgZXJyb3IgaXMgZmF0YWwKKyAqIGFuZCB0aGUgY29kZWMgbXVzdCBiZSBkZWxldGVkLgorICogVGhlIHNwZWNpZmllZCBkZXRhaWwgbWF5IGNvbnRhaW4gbW9yZSBkZXRhaWxlZCBtZXNzYWdlcyBhYm91dCB0aGlzIGVycm9yLgorICovCit0eXBlZGVmIHZvaWQgKCpBTWVkaWFDb2RlY09uQXN5bmNFcnJvcikoCisgICAgICAgIEFNZWRpYUNvZGVjICpjb2RlYywKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEsCisgICAgICAgIG1lZGlhX3N0YXR1c190IGVycm9yLAorICAgICAgICBpbnQzMl90IGFjdGlvbkNvZGUsCisgICAgICAgIGNvbnN0IGNoYXIgKmRldGFpbCk7CisKK3N0cnVjdCBBTWVkaWFDb2RlY09uQXN5bmNOb3RpZnlDYWxsYmFjayB7CisgICAgICBBTWVkaWFDb2RlY09uQXN5bmNJbnB1dEF2YWlsYWJsZSAgb25Bc3luY0lucHV0QXZhaWxhYmxlOworICAgICAgQU1lZGlhQ29kZWNPbkFzeW5jT3V0cHV0QXZhaWxhYmxlIG9uQXN5bmNPdXRwdXRBdmFpbGFibGU7CisgICAgICBBTWVkaWFDb2RlY09uQXN5bmNGb3JtYXRDaGFuZ2VkICAgb25Bc3luY0Zvcm1hdENoYW5nZWQ7CisgICAgICBBTWVkaWFDb2RlY09uQXN5bmNFcnJvciAgICAgICAgICAgb25Bc3luY0Vycm9yOworfTsKKworI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyMQorCisvKioKICAqIENyZWF0ZSBjb2RlYyBieSBuYW1lLiBVc2UgdGhpcyBpZiB5b3Uga25vdyB0aGUgZXhhY3QgY29kZWMgeW91IHdhbnQgdG8gdXNlLgogICogV2hlbiBjb25maWd1cmluZywgeW91IHdpbGwgbmVlZCB0byBzcGVjaWZ5IHdoZXRoZXIgdG8gdXNlIHRoZSBjb2RlYyBhcyBhbgogICogZW5jb2RlciBvciBkZWNvZGVyLgpAQCAtMTQ5LDYgKzIwMSw3IEBACiAKICNpZiAoZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTCkgfHwgXAogICAgIF9fU1REQ19WRVJTSU9OX18gPj0gMjAxMTEyTAorI2luY2x1ZGUgPGFzc2VydC5oPgogc3RhdGljX2Fzc2VydChzaXplb2YoX29mZl90X2NvbXBhdCkgPT0gc2l6ZW9mKGxvbmcpLAogICAgICAgICAgICAgICAiX29mZl90X2NvbXBhdCBkb2VzIG5vdCBtYXRjaCB0aGUgTkRLIEFCSS4gU2VlICIKICAgICAgICAgICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9hbmRyb2lkLW5kay9uZGsvaXNzdWVzLzQ1OS4iKTsKQEAgLTE3OSw2ICsyMzIsMTIgQEAKIEFNZWRpYUZvcm1hdCogQU1lZGlhQ29kZWNfZ2V0T3V0cHV0Rm9ybWF0KEFNZWRpYUNvZGVjKik7CiAKIC8qKgorICogR2V0IGZvcm1hdCBvZiB0aGUgYnVmZmVyLiBUaGUgc3BlY2lmaWVkIGJ1ZmZlciBpbmRleCBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IG9idGFpbmVkIGZyb20KKyAqIGRlcXVldWVPdXRwdXRCdWZmZXIuCisgKi8KK0FNZWRpYUZvcm1hdCogQU1lZGlhQ29kZWNfZ2V0QnVmZmVyRm9ybWF0KEFNZWRpYUNvZGVjKiwgc2l6ZV90IGluZGV4KTsKKworLyoqCiAgKiBJZiB5b3UgYXJlIGRvbmUgd2l0aCBhIGJ1ZmZlciwgdXNlIHRoaXMgY2FsbCB0byByZXR1cm4gdGhlIGJ1ZmZlciB0bwogICogdGhlIGNvZGVjLiBJZiB5b3UgcHJldmlvdXNseSBzcGVjaWZpZWQgYSBzdXJmYWNlIHdoZW4gY29uZmlndXJpbmcgdGhpcwogICogdmlkZW8gZGVjb2RlciB5b3UgY2FuIG9wdGlvbmFsbHkgcmVuZGVyIHRoZSBidWZmZXIuCkBAIC0yMDgsNiArMjY3LDggQEAKIG1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3JlbGVhc2VPdXRwdXRCdWZmZXJBdFRpbWUoCiAgICAgICAgIEFNZWRpYUNvZGVjICptRGF0YSwgc2l6ZV90IGlkeCwgaW50NjRfdCB0aW1lc3RhbXBOcyk7CiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjYKKwogLyoqCiAgKiBDcmVhdGVzIGEgU3VyZmFjZSB0aGF0IGNhbiBiZSB1c2VkIGFzIHRoZSBpbnB1dCB0byBlbmNvZGVyLCBpbiBwbGFjZSBvZiBpbnB1dCBidWZmZXJzCiAgKgpAQCAtMjc4LDcgKzMzOSw3MiBAQAogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19zaWduYWxFbmRPZklucHV0U3RyZWFtKEFNZWRpYUNvZGVjICptRGF0YSk7CiAKKyNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjYgKi8KIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOAorCisvKioKKyAqIEdldCB0aGUgY29tcG9uZW50IG5hbWUuIElmIHRoZSBjb2RlYyB3YXMgY3JlYXRlZCBieSBjcmVhdGVEZWNvZGVyQnlUeXBlCisgKiBvciBjcmVhdGVFbmNvZGVyQnlUeXBlLCB3aGF0IGNvbXBvbmVudCBpcyBjaG9zZW4gaXMgbm90IGtub3duIGJlZm9yZWhhbmQuCisgKiBDYWxsZXIgc2hhbGwgY2FsbCBBTWVkaWFDb2RlY19yZWxlYXNlTmFtZSB0byBmcmVlIHRoZSByZXR1cm5lZCBwb2ludGVyLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19nZXROYW1lKEFNZWRpYUNvZGVjKiwgY2hhcioqIG91dF9uYW1lKTsKKworLyoqCisgKiBGcmVlIHRoZSBtZW1vcnkgcG9pbnRlZCBieSBuYW1lIHdoaWNoIGlzIHJldHVybmVkIGJ5IEFNZWRpYUNvZGVjX2dldE5hbWUuCisgKi8KK3ZvaWQgQU1lZGlhQ29kZWNfcmVsZWFzZU5hbWUoQU1lZGlhQ29kZWMqLCBjaGFyKiBuYW1lKTsKKworLyoqCisgKiBTZXQgYW4gYXN5bmNocm9ub3VzIGNhbGxiYWNrIGZvciBhY3Rpb25hYmxlIEFNZWRpYUNvZGVjIGV2ZW50cy4KKyAqIFdoZW4gYXN5bmNocm9ub3VzIGNhbGxiYWNrIGlzIGVuYWJsZWQsIHRoZSBjbGllbnQgc2hvdWxkIG5vdCBjYWxsCisgKiBBTWVkaWFDb2RlY19nZXRJbnB1dEJ1ZmZlcnMoKSwgQU1lZGlhQ29kZWNfZ2V0T3V0cHV0QnVmZmVycygpLAorICogQU1lZGlhQ29kZWNfZGVxdWV1ZUlucHV0QnVmZmVyKCkgb3IgQU1lZGlhQ29kZWNfZGVxdWV1ZU91dHB1dEJ1ZmZlcigpLgorICoKKyAqIEFsc28sIEFNZWRpYUNvZGVjX2ZsdXNoKCkgYmVoYXZlcyBkaWZmZXJlbnRseSBpbiBhc3luY2hyb25vdXMgbW9kZS4KKyAqIEFmdGVyIGNhbGxpbmcgQU1lZGlhQ29kZWNfZmx1c2goKSwgeW91IG11c3QgY2FsbCBBTWVkaWFDb2RlY19zdGFydCgpIHRvCisgKiAicmVzdW1lIiByZWNlaXZpbmcgaW5wdXQgYnVmZmVycywgZXZlbiBpZiBhbiBpbnB1dCBzdXJmYWNlIHdhcyBjcmVhdGVkLgorICoKKyAqIFJlZmVyIHRvIHRoZSBkZWZpbml0aW9uIG9mIEFNZWRpYUNvZGVjT25Bc3luY05vdGlmeUNhbGxiYWNrIG9uIGhvdyBlYWNoCisgKiBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgYW5kIHdoYXQgYXJlIHNwZWNpZmllZC4KKyAqIFRoZSBzcGVjaWZpZWQgdXNlcmRhdGEgaXMgdGhlIHBvaW50ZXIgdXNlZCB3aGVuIHRob3NlIGNhbGxiYWNrIGZ1bmN0aW9ucyBhcmUKKyAqIGNhbGxlZC4KKyAqCisgKiBBbGwgY2FsbGJhY2tzIGFyZSBmaXJlZCBvbiBvbmUgTkRLIGludGVybmFsIHRocmVhZC4KKyAqIEFNZWRpYUNvZGVjX3NldEFzeW5jTm90aWZ5Q2FsbGJhY2sgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb24gdGhlIGNhbGxiYWNrIHRocmVhZC4KKyAqIE5vIGhlYXZ5IGR1dHkgdGFzayBzaG91bGQgYmUgcGVyZm9ybWVkIG9uIGNhbGxiYWNrIHRocmVhZC4KKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc2V0QXN5bmNOb3RpZnlDYWxsYmFjaygKKyAgICAgICAgQU1lZGlhQ29kZWMqLAorICAgICAgICBBTWVkaWFDb2RlY09uQXN5bmNOb3RpZnlDYWxsYmFjayBjYWxsYmFjaywKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCisvKioKKyAqIFJlbGVhc2UgdGhlIGNyeXB0byBpZiBhcHBsaWNhYmxlLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19yZWxlYXNlQ3J5cHRvKEFNZWRpYUNvZGVjKik7CisKKy8qKgorICogQ2FsbCB0aGlzIGFmdGVyIEFNZWRpYUNvZGVjX2NvbmZpZ3VyZSgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5IHRvIGdldCB0aGUgaW5wdXQKKyAqIGZvcm1hdCBhY2NlcHRlZCBieSB0aGUgY29kZWMuIERvIHRoaXMgdG8gZGV0ZXJtaW5lIHdoYXQgb3B0aW9uYWwgY29uZmlndXJhdGlvbgorICogcGFyYW1ldGVycyB3ZXJlIHN1cHBvcnRlZCBieSB0aGUgY29kZWMuCisgKi8KK0FNZWRpYUZvcm1hdCogQU1lZGlhQ29kZWNfZ2V0SW5wdXRGb3JtYXQoQU1lZGlhQ29kZWMqKTsKKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNvZGVjIGNhbm5vdCBwcm9jZWVkIGZ1cnRoZXIsIGJ1dCBjYW4gYmUgcmVjb3ZlcmVkIGJ5IHN0b3BwaW5nLAorICogY29uZmlndXJpbmcsIGFuZCBzdGFydGluZyBhZ2Fpbi4KKyAqLworYm9vbCBBTWVkaWFDb2RlY0FjdGlvbkNvZGVfaXNSZWNvdmVyYWJsZShpbnQzMl90IGFjdGlvbkNvZGUpOworCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29kZWMgZXJyb3IgaXMgYSB0cmFuc2llbnQgaXNzdWUsIHBlcmhhcHMgZHVlIHRvCisgKiByZXNvdXJjZSBjb25zdHJhaW50cywgYW5kIHRoYXQgdGhlIG1ldGhvZCAob3IgZW5jb2RpbmcvZGVjb2RpbmcpIG1heSBiZQorICogcmV0cmllZCBhdCBhIGxhdGVyIHRpbWUuCisgKi8KK2Jvb2wgQU1lZGlhQ29kZWNBY3Rpb25Db2RlX2lzVHJhbnNpZW50KGludDMyX3QgYWN0aW9uQ29kZSk7CisKKyNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjggKi8KIAogdHlwZWRlZiBlbnVtIHsKICAgICBBTUVESUFDT0RFQ1JZUFRPSU5GT19NT0RFX0NMRUFSID0gMCwKQEAgLTM2MCw4ICs0ODYsNiBAQAogCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDIxICovCiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAvLyBleHRlcm4gIkMiCi0jZW5kaWYKK19fRU5EX0RFQ0xTCiAKICNlbmRpZiAvL19OREtfTUVESUFfQ09ERUNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDcnlwdG8uaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ3J5cHRvLmgKaW5kZXggOTIzNjc2NS4uZDMxZGJkYyAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDcnlwdG8uaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNyeXB0by5oCkBAIC0zMiwxNyArMzIsMTUgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzdGRib29sLmg+CiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyMQorX19CRUdJTl9ERUNMUwogCiBzdHJ1Y3QgQU1lZGlhQ3J5cHRvOwogdHlwZWRlZiBzdHJ1Y3QgQU1lZGlhQ3J5cHRvIEFNZWRpYUNyeXB0bzsKIAogdHlwZWRlZiB1aW50OF90IEFNZWRpYVVVSURbMTZdOwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDIxCisKIGJvb2wgQU1lZGlhQ3J5cHRvX2lzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IEFNZWRpYVVVSUQgdXVpZCk7CiAKIGJvb2wgQU1lZGlhQ3J5cHRvX3JlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChjb25zdCBjaGFyICptaW1lKTsKQEAgLTUzLDggKzUxLDYgQEAKIAogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyMSAqLwogCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gLy8gZXh0ZXJuICJDIgotI2VuZGlmCitfX0VORF9ERUNMUwogCiAjZW5kaWYgLy8gX05ES19NRURJQV9DUllQVE9fSApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFEYXRhU291cmNlLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTJlMzUxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFEYXRhU291cmNlLmgKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBhbiBOREsgQVBJLgorICogRG8gbm90IHJlbW92ZSBtZXRob2RzLgorICogRG8gbm90IGNoYW5nZSBtZXRob2Qgc2lnbmF0dXJlcy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGNvbnN0YW50cy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHNpemUgb2YgYW55IG9mIHRoZSBjbGFzc2VzIGRlZmluZWQgaW4gaGVyZS4KKyAqIERvIG5vdCByZWZlcmVuY2UgdHlwZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIE5ESy4KKyAqIERvIG5vdCAjaW5jbHVkZSBmaWxlcyB0aGF0IGFyZW4ndCBwYXJ0IG9mIHRoZSBOREsuCisgKi8KKworI2lmbmRlZiBfTkRLX01FRElBX0RBVEFTT1VSQ0VfSAorI2RlZmluZSBfTkRLX01FRElBX0RBVEFTT1VSQ0VfSAorCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yLmg+CisKK19fQkVHSU5fREVDTFMKKworc3RydWN0IEFNZWRpYURhdGFTb3VyY2U7Cit0eXBlZGVmIHN0cnVjdCBBTWVkaWFEYXRhU291cmNlIEFNZWRpYURhdGFTb3VyY2U7CisKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjgKKworLyoKKyAqIEFNZWRpYURhdGFTb3VyY2UncyBjYWxsYmFja3Mgd2lsbCBiZSBpbnZva2VkIG9uIGFuIGltcGxlbWVudGF0aW9uLWRlZmluZWQgdGhyZWFkCisgKiBvciB0aHJlYWQgcG9vbC4gTm8gZ3VhcmFudGVlcyBhcmUgcHJvdmlkZWQgYWJvdXQgd2hpY2ggdGhyZWFkKHMpIHdpbGwgYmUgdXNlZCBmb3IKKyAqIGNhbGxiYWNrcy4gSG93ZXZlciwgaXQgaXMgZ3VhcmFudGVlZCB0aGF0IEFNZWRpYURhdGFTb3VyY2UncyBjYWxsYmFja3Mgd2lsbCBvbmx5CisgKiBldmVyIGJlIGludm9rZWQgYnkgYSBzaW5nbGUgdGhyZWFkIGF0IGEgdGltZS4KKyAqCisgKiBUaGVyZSB3aWxsIGJlIGEgdGhyZWFkIHN5bmNocm9uaXphdGlvbiBwb2ludCBiZXR3ZWVuIGVhY2ggY2FsbCB0byBlbnN1cmUgdGhhdAorICogbW9kaWZpY2F0aW9ucyB0byB0aGUgc3RhdGUgb2YgeW91ciBBTWVkaWFEYXRhU291cmNlIGFyZSB2aXNpYmxlIHRvIGZ1dHVyZQorICogY2FsbHMuIFRoaXMgbWVhbnMgeW91IGRvbid0IG5lZWQgdG8gZG8geW91ciBvd24gc3luY2hyb25pemF0aW9uIHVubGVzcyB5b3UncmUKKyAqIG1vZGlmeWluZyB0aGUgQU1lZGlhRGF0YVNvdXJjZSBmcm9tIGFub3RoZXIgdGhyZWFkIHdoaWxlIGl0J3MgYmVpbmcgdXNlZCBieSB0aGUKKyAqIGZyYW1ld29yay4KKyAqLworCisvKioKKyAqIENhbGxlZCB0byByZXF1ZXN0IGRhdGEgZnJvbSB0aGUgZ2l2ZW4gfG9mZnNldHwuCisgKgorICogSW1wbGVtZW50YXRpb25zIHNob3VsZCBzaG91bGQgd3JpdGUgdXAgdG8gfHNpemV8IGJ5dGVzIGludG8KKyAqIHxidWZmZXJ8LCBhbmQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4KKyAqCisgKiBSZXR1cm4gMCBpZiBzaXplIGlzIHplcm8gKHRodXMgbm8gYnl0ZXMgYXJlIHJlYWQpLgorICoKKyAqIFJldHVybiAtMSB0byBpbmRpY2F0ZSB0aGF0IGVuZCBvZiBzdHJlYW0gaXMgcmVhY2hlZC4KKyAqLwordHlwZWRlZiBzc2l6ZV90ICgqQU1lZGlhRGF0YVNvdXJjZVJlYWRBdCkoCisgICAgICAgIHZvaWQgKnVzZXJkYXRhLCBvZmY2NF90IG9mZnNldCwgdm9pZCAqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOworCisvKioKKyAqIENhbGxlZCB0byBnZXQgdGhlIHNpemUgb2YgdGhlIGRhdGEgc291cmNlLgorICoKKyAqIFJldHVybiB0aGUgc2l6ZSBvZiBkYXRhIHNvdXJjZSBpbiBieXRlcywgb3IgLTEgaWYgdGhlIHNpemUgaXMgdW5rbm93bi4KKyAqLwordHlwZWRlZiBzc2l6ZV90ICgqQU1lZGlhRGF0YVNvdXJjZUdldFNpemUpKHZvaWQgKnVzZXJkYXRhKTsKKworLyoqCisgKiBDYWxsZWQgdG8gY2xvc2UgdGhlIGRhdGEgc291cmNlIGFuZCByZWxlYXNlIGFzc29jaWF0ZWQgcmVzb3VyY2VzLgorICogVGhlIE5ESyBtZWRpYSBmcmFtZXdvcmsgZ3VhcmFudGVlcyB0aGF0IGFmdGVyIHxjbG9zZXwgaXMgY2FsbGVkCisgKiBubyBmdXR1cmUgY2FsbGJhY2tzIHdpbGwgYmUgaW52b2tlZCBvbiB0aGUgZGF0YSBzb3VyY2UuCisgKi8KK3R5cGVkZWYgdm9pZCAoKkFNZWRpYURhdGFTb3VyY2VDbG9zZSkodm9pZCAqdXNlcmRhdGEpOworCisvKioKKyAqIENyZWF0ZSBuZXcgbWVkaWEgZGF0YSBzb3VyY2UuIFJldHVybnMgTlVMTCBpZiBtZW1vcnkgYWxsb2NhdGlvbgorICogZm9yIHRoZSBuZXcgZGF0YSBzb3VyY2Ugb2JqZWN0IGZhaWxzLgorICovCitBTWVkaWFEYXRhU291cmNlKiBBTWVkaWFEYXRhU291cmNlX25ldygpOworCisvKioKKyAqIERlbGV0ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBtZWRpYSBkYXRhIHNvdXJjZS4KKyAqLwordm9pZCBBTWVkaWFEYXRhU291cmNlX2RlbGV0ZShBTWVkaWFEYXRhU291cmNlKik7CisKKy8qKgorICogU2V0IGFuIHVzZXIgcHJvdmlkZWQgb3BhcXVlIGhhbmRsZS4gVGhpcyBvcGFxdWUgaGFuZGxlIGlzIHBhc3NlZCBhcworICogdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBkYXRhIHNvdXJjZSBjYWxsYmFja3MuCisgKi8KK3ZvaWQgQU1lZGlhRGF0YVNvdXJjZV9zZXRVc2VyZGF0YSgKKyAgICAgICAgQU1lZGlhRGF0YVNvdXJjZSosIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqCisgKiBTZXQgYSBjdXN0b20gY2FsbGJhY2sgZm9yIHN1cHBseWluZyByYW5kb20gYWNjZXNzIG1lZGlhIGRhdGEgdG8gdGhlCisgKiBOREsgbWVkaWEgZnJhbWV3b3JrLgorICoKKyAqIEltcGxlbWVudCB0aGlzIGlmIHlvdXIgYXBwIGhhcyBzcGVjaWFsIHJlcXVpcmVtZW50cyBmb3IgdGhlIHdheSBtZWRpYQorICogZGF0YSBpcyBvYnRhaW5lZCwgb3IgaWYgeW91IG5lZWQgYSBjYWxsYmFjayB3aGVuIGRhdGEgaXMgcmVhZCBieSB0aGUKKyAqIE5ESyBtZWRpYSBmcmFtZXdvcmsuCisgKgorICogUGxlYXNlIHJlZmVyIHRvIHRoZSBkZWZpbml0aW9uIG9mIEFNZWRpYURhdGFTb3VyY2VSZWFkQXQgZm9yCisgKiBhZGRpdGlvbmFsIGRldGFpbHMuCisgKi8KK3ZvaWQgQU1lZGlhRGF0YVNvdXJjZV9zZXRSZWFkQXQoCisgICAgICAgIEFNZWRpYURhdGFTb3VyY2UqLAorICAgICAgICBBTWVkaWFEYXRhU291cmNlUmVhZEF0KTsKKworLyoqCisgKiBTZXQgYSBjdXN0b20gY2FsbGJhY2sgZm9yIHN1cHBseWluZyB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBzb3VyY2UgdG8gdGhlCisgKiBOREsgbWVkaWEgZnJhbWV3b3JrLgorICoKKyAqIFBsZWFzZSByZWZlciB0byB0aGUgZGVmaW5pdGlvbiBvZiBBTWVkaWFEYXRhU291cmNlR2V0U2l6ZSBmb3IKKyAqIGFkZGl0aW9uYWwgZGV0YWlscy4KKyAqLwordm9pZCBBTWVkaWFEYXRhU291cmNlX3NldEdldFNpemUoCisgICAgICAgIEFNZWRpYURhdGFTb3VyY2UqLAorICAgICAgICBBTWVkaWFEYXRhU291cmNlR2V0U2l6ZSk7CisKKy8qKgorICogU2V0IGEgY3VzdG9tIGNhbGxiYWNrIHRvIHJlY2VpdmUgc2lnbmFsIGZyb20gdGhlIE5ESyBtZWRpYSBmcmFtZXdvcmsKKyAqIHdoZW4gdGhlIGRhdGEgc291cmNlIGlzIGNsb3NlZC4KKyAqCisgKiBQbGVhc2UgcmVmZXIgdG8gdGhlIGRlZmluaXRpb24gb2YgQU1lZGlhRGF0YVNvdXJjZUNsb3NlIGZvcgorICogYWRkaXRpb25hbCBkZXRhaWxzLgorICovCit2b2lkIEFNZWRpYURhdGFTb3VyY2Vfc2V0Q2xvc2UoCisgICAgICAgIEFNZWRpYURhdGFTb3VyY2UqLAorICAgICAgICBBTWVkaWFEYXRhU291cmNlQ2xvc2UpOworCisjZW5kaWYgIC8qX19BTkRST0lEX0FQSV9fID49IDI4ICovCisKK19fRU5EX0RFQ0xTCisKKyNlbmRpZiAvLyBfTkRLX01FRElBX0RBVEFTT1VSQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFEcm0uaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRHJtLmgKaW5kZXggY2JhNDM4MC4uOWU5ZjRjMyAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFEcm0uaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURybS5oCkBAIC0zMywxMSArMzMsNyBAQAogCiAjaW5jbHVkZSAiTmRrTWVkaWFFcnJvci5oIgogCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjEKK19fQkVHSU5fREVDTFMKIAogc3RydWN0IEFNZWRpYURybTsKIHR5cGVkZWYgc3RydWN0IEFNZWRpYURybSBBTWVkaWFEcm07CkBAIC01Miw3ICs0OCw2IEBACiB0eXBlZGVmIEFNZWRpYURybUJ5dGVBcnJheSBBTWVkaWFEcm1LZXlTZXRJZDsKIHR5cGVkZWYgQU1lZGlhRHJtQnl0ZUFycmF5IEFNZWRpYURybVNlY3VyZVN0b3A7CiAKLQogdHlwZWRlZiBlbnVtIEFNZWRpYURybUV2ZW50VHlwZSB7CiAgICAgLyoqCiAgICAgICogVGhpcyBldmVudCB0eXBlIGluZGljYXRlcyB0aGF0IHRoZSBhcHAgbmVlZHMgdG8gcmVxdWVzdCBhIGNlcnRpZmljYXRlIGZyb20KQEAgLTgzLDYgKzc4LDcgQEAKIHR5cGVkZWYgdm9pZCAoKkFNZWRpYURybUV2ZW50TGlzdGVuZXIpKEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKICAgICAgICAgQU1lZGlhRHJtRXZlbnRUeXBlIGV2ZW50VHlwZSwgaW50IGV4dHJhLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgZGF0YVNpemUpOwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDIxCiAKIC8qKgogICogUXVlcnkgaWYgdGhlIGdpdmVuIHNjaGVtZSBpZGVudGlmaWVkIGJ5IGl0cyBVVUlEIGlzIHN1cHBvcnRlZCBvbiB0aGlzIGRldmljZSwgYW5kCkBAIC00NTIsOCArNDQ4LDYgQEAKIAogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyMSAqLwogCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gLy8gZXh0ZXJuICJDIgotI2VuZGlmCitfX0VORF9ERUNMUwogCiAjZW5kaWYgLy9fTkRLX01FRElBX0RSTV9ICmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUVycm9yLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUVycm9yLmgKaW5kZXggMWI1MTM2NC4uMTNhYWNjOSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFcnJvci5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXJyb3IuaApAQCAtMzAsMTUgKzMwLDIyIEBACiAKICNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KIAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDIxCitfX0JFR0lOX0RFQ0xTCiAKIHR5cGVkZWYgZW51bSB7CiAgICAgQU1FRElBX09LID0gMCwKIAorICAgIC8qKgorICAgICAqIFRoaXMgaW5kaWNhdGVzIHJlcXVpcmVkIHJlc291cmNlIHdhcyBub3QgYWJsZSB0byBiZSBhbGxvY2F0ZWQuCisgICAgICovCisgICAgQU1FRElBQ09ERUNfRVJST1JfSU5TVUZGSUNJRU5UX1JFU09VUkNFID0gMTEwMCwKKworICAgIC8qKgorICAgICAqIFRoaXMgaW5kaWNhdGVzIHRoZSByZXNvdXJjZSBtYW5hZ2VyIHJlY2xhaW1lZCB0aGUgbWVkaWEgcmVzb3VyY2UgdXNlZCBieSB0aGUgY29kZWMuCisgICAgICogV2l0aCB0aGlzIGVycm9yLCB0aGUgY29kZWMgbXVzdCBiZSByZWxlYXNlZCwgYXMgaXQgaGFzIG1vdmVkIHRvIHRlcm1pbmFsIHN0YXRlLgorICAgICAqLworICAgIEFNRURJQUNPREVDX0VSUk9SX1JFQ0xBSU1FRCAgICAgICAgICAgICA9IDExMDEsCisKICAgICBBTUVESUFfRVJST1JfQkFTRSAgICAgICAgICAgICAgICAgID0gLTEwMDAwLAogICAgIEFNRURJQV9FUlJPUl9VTktOT1dOICAgICAgICAgICAgICAgPSBBTUVESUFfRVJST1JfQkFTRSwKICAgICBBTUVESUFfRVJST1JfTUFMRk9STUVEICAgICAgICAgICAgID0gQU1FRElBX0VSUk9SX0JBU0UgLSAxLApAQCAtNDYsNiArNTMsOCBAQAogICAgIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVCAgICAgICAgPSBBTUVESUFfRVJST1JfQkFTRSAtIDMsCiAgICAgQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSICAgICA9IEFNRURJQV9FUlJPUl9CQVNFIC0gNCwKICAgICBBTUVESUFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT04gICAgID0gQU1FRElBX0VSUk9SX0JBU0UgLSA1LAorICAgIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNICAgICAgICAgPSBBTUVESUFfRVJST1JfQkFTRSAtIDYsCisgICAgQU1FRElBX0VSUk9SX0lPICAgICAgICAgICAgICAgICAgICA9IEFNRURJQV9FUlJPUl9CQVNFIC0gNywKIAogICAgIEFNRURJQV9EUk1fRVJST1JfQkFTRSAgICAgICAgICAgICAgPSAtMjAwMDAsCiAgICAgQU1FRElBX0RSTV9OT1RfUFJPVklTSU9ORUQgICAgICAgICA9IEFNRURJQV9EUk1fRVJST1JfQkFTRSAtIDEsCkBAIC02NywxMCArNzYsNiBAQAogCiB9IG1lZGlhX3N0YXR1c190OwogCi0jZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDIxICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAvLyBleHRlcm4gIkMiCi0jZW5kaWYKK19fRU5EX0RFQ0xTCiAKICNlbmRpZiAvLyBfTkRLX01FRElBX0VSUk9SX0gKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oCmluZGV4IGMzMTgwZGMuLmY3YjljZmQgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaApAQCAtMzIsMTggKzMyLDE2IEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKICNpbmNsdWRlICJOZGtNZWRpYUNvZGVjLmgiCisjaW5jbHVkZSAiTmRrTWVkaWFEYXRhU291cmNlLmgiCiAjaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXQuaCIKICNpbmNsdWRlICJOZGtNZWRpYUNyeXB0by5oIgogCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjEKK19fQkVHSU5fREVDTFMKIAogc3RydWN0IEFNZWRpYUV4dHJhY3RvcjsKIHR5cGVkZWYgc3RydWN0IEFNZWRpYUV4dHJhY3RvciBBTWVkaWFFeHRyYWN0b3I7CiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjEKIAogLyoqCiAgKiBDcmVhdGUgbmV3IG1lZGlhIGV4dHJhY3RvcgpAQCAtNjcsNiArNjUsMTUgQEAKIG1lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlKEFNZWRpYUV4dHJhY3RvciosIGNvbnN0IGNoYXIgKmxvY2F0aW9uKTsKICAgICAgICAgLy8gVE9ETyBzdXBwb3J0IGhlYWRlcnMKIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOAorCisvKioKKyAqIFNldCB0aGUgY3VzdG9tIGRhdGEgc291cmNlIGltcGxlbWVudGF0aW9uIGZyb20gd2hpY2ggdGhlIGV4dHJhY3RvciB3aWxsIHJlYWQuCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlQ3VzdG9tKEFNZWRpYUV4dHJhY3RvciosIEFNZWRpYURhdGFTb3VyY2UgKnNyYyk7CisKKyNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjggKi8KKwogLyoqCiAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiB0cmFja3MgaW4gdGhlIHByZXZpb3VzbHkgc3BlY2lmaWVkIG1lZGlhIGZpbGUKICAqLwpAQCAtMTU1LDE2ICsxNjIsNjIgQEAKIAogQU1lZGlhQ29kZWNDcnlwdG9JbmZvICpBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlQ3J5cHRvSW5mbyhBTWVkaWFFeHRyYWN0b3IgKik7CiAKLQogZW51bSB7CiAgICAgQU1FRElBRVhUUkFDVE9SX1NBTVBMRV9GTEFHX1NZTkMgPSAxLAogICAgIEFNRURJQUVYVFJBQ1RPUl9TQU1QTEVfRkxBR19FTkNSWVBURUQgPSAyLAogfTsKIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOAorCisvKioKKyAqIFJldHVybnMgdGhlIGZvcm1hdCBvZiB0aGUgZXh0cmFjdG9yLiBUaGUgY2FsbGVyIG11c3QgZnJlZSB0aGUgcmV0dXJuZWQgZm9ybWF0CisgKiB1c2luZyBBTWVkaWFGb3JtYXRfZGVsZXRlKGZvcm1hdCkuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGFsd2F5cyByZXR1cm4gYSBmb3JtYXQ7IGhvd2V2ZXIsIHRoZSBmb3JtYXQgY291bGQgYmUgZW1wdHkKKyAqIChubyBrZXktdmFsdWUgcGFpcnMpIGlmIHRoZSBtZWRpYSBjb250YWluZXIgZG9lcyBub3QgcHJvdmlkZSBmb3JtYXQgaW5mb3JtYXRpb24uCisgKi8KK0FNZWRpYUZvcm1hdCogQU1lZGlhRXh0cmFjdG9yX2dldEZpbGVGb3JtYXQoQU1lZGlhRXh0cmFjdG9yKik7CisKKy8qKgorICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgY3VycmVudCBzYW1wbGUgaW4gYnl0ZXMsIG9yIC0xIHdoZW4gbm8gc2FtcGxlcyBhcmUKKyAqIGF2YWlsYWJsZSAoZW5kIG9mIHN0cmVhbSkuIFRoaXMgQVBJIGNhbiBiZSB1c2VkIGluIGluIGNvbmp1bmN0aW9uIHdpdGgKKyAqIEFNZWRpYUV4dHJhY3Rvcl9yZWFkU2FtcGxlRGF0YToKKyAqCisgKiBzc2l6ZV90IHNhbXBsZVNpemUgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlU2l6ZShleCk7CisgKiB1aW50OF90ICpidWYgPSBuZXcgdWludDhfdFtzYW1wbGVTaXplXTsKKyAqIEFNZWRpYUV4dHJhY3Rvcl9yZWFkU2FtcGxlRGF0YShleCwgYnVmLCBzYW1wbGVTaXplKTsKKyAqCisgKi8KK3NzaXplX3QgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVNpemUoQU1lZGlhRXh0cmFjdG9yKik7CisKKy8qKgorICogUmV0dXJucyB0aGUgZHVyYXRpb24gb2YgY2FjaGVkIG1lZGlhIHNhbXBsZXMgZG93bmxvYWRlZCBmcm9tIGEgbmV0d29yayBkYXRhIHNvdXJjZQorICogKEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlIHdpdGggYSAiaHR0cChzKSIgVVJJKSBpbiBtaWNyb3NlY29uZHMuCisgKgorICogVGhpcyBpbmZvcm1hdGlvbiBpcyBjYWxjdWxhdGVkIHVzaW5nIHRvdGFsIGJpdHJhdGU7IGlmIHRvdGFsIGJpdHJhdGUgaXMgbm90IGluIHRoZQorICogbWVkaWEgY29udGFpbmVyIGl0IGlzIGNhbGN1bGF0ZWQgdXNpbmcgdG90YWwgZHVyYXRpb24gYW5kIGZpbGUgc2l6ZS4KKyAqCisgKiBSZXR1cm5zIC0xIHdoZW4gdGhlIGV4dHJhY3RvciBpcyBub3QgcmVhZGluZyBmcm9tIGEgbmV0d29yayBkYXRhIHNvdXJjZSwgb3Igd2hlbiB0aGUKKyAqIGNhY2hlZCBkdXJhdGlvbiBjYW5ub3QgYmUgY2FsY3VsYXRlZCAoYml0cmF0ZSwgZHVyYXRpb24sIGFuZCBmaWxlIHNpemUgaW5mb3JtYXRpb24KKyAqIG5vdCBhdmFpbGFibGUpLgorICovCitpbnQ2NF90IEFNZWRpYUV4dHJhY3Rvcl9nZXRDYWNoZWREdXJhdGlvbihBTWVkaWFFeHRyYWN0b3IgKik7CisKKy8qKgorICogUmVhZCB0aGUgY3VycmVudCBzYW1wbGUncyBtZXRhZGF0YSBmb3JtYXQgaW50byB8Zm10fC4gRXhhbXBsZXMgb2Ygc2FtcGxlIG1ldGFkYXRhIGFyZQorICogU0VJIChzdXBwbGVtZW50YWwgZW5oYW5jZW1lbnQgaW5mb3JtYXRpb24pIGFuZCBNUEVHIHVzZXIgZGF0YSwgYm90aCBvZiB3aGljaCBjYW4gZW1iZWQKKyAqIGNsb3NlZC1jYXB0aW9uIGRhdGEuCisgKgorICogUmV0dXJucyBBTUVESUFfT0sgb24gc3VjY2VzcyBvciBBTUVESUFfRVJST1JfKiB0byBpbmRpY2F0ZSBmYWlsdXJlIHJlYXNvbi4KKyAqIEV4aXN0aW5nIGtleS12YWx1ZSBwYWlycyBpbiB8Zm10fCB3b3VsZCBiZSByZW1vdmVkIGlmIHRoaXMgQVBJIHJldHVybnMgQU1FRElBX09LLgorICogVGhlIGNvbnRlbnRzIG9mIHxmbXR8IGlzIHVuZGVmaW5lZCBpZiB0aGlzIEFQSSByZXR1cm5zIEFNRURJQV9FUlJPUl8qLgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlRm9ybWF0KEFNZWRpYUV4dHJhY3RvciAqZXgsIEFNZWRpYUZvcm1hdCAqZm10KTsKKworI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOCAqLworCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDIxICovCiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAvLyBleHRlcm4gIkMiCi0jZW5kaWYKK19fRU5EX0RFQ0xTCiAKICNlbmRpZiAvLyBfTkRLX01FRElBX0VYVFJBQ1RPUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdC5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXQuaAppbmRleCBhMmEyMWQyLi42ODcwNTRlIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdC5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0LmgKQEAgLTMyLDE1ICszMiwxMyBAQAogCiAjaW5jbHVkZSAiTmRrTWVkaWFFcnJvci5oIgogCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjEKK19fQkVHSU5fREVDTFMKIAogc3RydWN0IEFNZWRpYUZvcm1hdDsKIHR5cGVkZWYgc3RydWN0IEFNZWRpYUZvcm1hdCBBTWVkaWFGb3JtYXQ7CiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjEKKwogQU1lZGlhRm9ybWF0ICpBTWVkaWFGb3JtYXRfbmV3KCk7CiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFGb3JtYXRfZGVsZXRlKEFNZWRpYUZvcm1hdCopOwogCkBAIC01Myw2ICs1MSw3IEBACiBib29sIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyICpuYW1lLCBpbnQzMl90ICpvdXQpOwogYm9vbCBBTWVkaWFGb3JtYXRfZ2V0SW50NjQoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciAqbmFtZSwgaW50NjRfdCAqb3V0KTsKIGJvb2wgQU1lZGlhRm9ybWF0X2dldEZsb2F0KEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIgKm5hbWUsIGZsb2F0ICpvdXQpOworYm9vbCBBTWVkaWFGb3JtYXRfZ2V0U2l6ZShBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgKm91dCk7CiAvKioKICAqIFRoZSByZXR1cm5lZCBkYXRhIGlzIG93bmVkIGJ5IHRoZSBmb3JtYXQgYW5kIHJlbWFpbnMgdmFsaWQgYXMgbG9uZyBhcyB0aGUgbmFtZWQgZW50cnkKICAqIGlzIHBhcnQgb2YgdGhlIGZvcm1hdC4KQEAgLTgyLDM1ICs4MSw4NiBAQAogLyoqCiAgKiBYWFggc2hvdWxkIHRoZXNlIGJlIGludHMvZW51bXMgdGhhdCB3ZSBsb29rIHVwIGluIGEgdGFibGUgYXMgbmVlZGVkPwogICovCitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUjsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19EUkNfQk9PU1RfRkFDVE9SOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX0RSQ19IRUFWWV9DT01QUkVTU0lPTjsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTDsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19FTkNPREVEX1RBUkdFVF9MRVZFTDsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19NQVhfT1VUUFVUX0NIQU5ORUxfQ09VTlQ7CiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfUFJPRklMRTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19TQlJfTU9ERTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1NFU1NJT05fSUQ7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9CSVRSQVRFX01PREU7CiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NBUFRVUkVfUkFURTsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQ7CiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX01BU0s7CiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT0xPUl9GT1JNQVQ7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT0xPUl9SQU5HRTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1NUQU5EQVJEOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfVFJBTlNGRVI7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT01QTEVYSVRZOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzA7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0RfMTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF8yOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9DUk9QOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9IRUlHSFQ7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX1dJRFRIOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT047CiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9GTEFDX0NPTVBSRVNTSU9OX0xFVkVMOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0dSSURfQ09MVU1OUzsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0dSSURfUk9XUzsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0hEUl9TVEFUSUNfSU5GTzsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVDsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lOVFJBX1JFRlJFU0hfUEVSSU9EOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfQURUUzsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0FVVE9TRUxFQ1Q7CiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19ERUZBVUxUOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfRk9SQ0VEX1NVQlRJVExFOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSV9GUkFNRV9JTlRFUlZBTDsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xBTkdVQUdFOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTEFURU5DWTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xFVkVMOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX0hFSUdIVDsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX1dJRFRIOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUlNRTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01QRUdfVVNFUl9EQVRBOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfT1BFUkFUSU5HX1JBVEU7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkc7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QUklPUklUWTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BST0ZJTEU7CiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QVVNIX0JMQU5LX0JVRkZFUlNfT05fU1RPUDsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9BRlRFUjsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1JPVEFUSU9OOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEU7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9XSURUSDsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NFSTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NMSUNFX0hFSUdIVDsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NUUklERTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0lEOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJJTkc7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USUxFX0hFSUdIVDsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RJTEVfV0lEVEg7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USU1FX1VTOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQ7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9UUkFDS19JTkRFWDsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1dJRFRIOwogCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDIxICovCiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAvLyBleHRlcm4gIkMiCi0jZW5kaWYKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjgKK2Jvb2wgQU1lZGlhRm9ybWF0X2dldERvdWJsZShBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyICpuYW1lLCBkb3VibGUgKm91dCk7Citib29sIEFNZWRpYUZvcm1hdF9nZXRSZWN0KEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKmxlZnQsIGludDMyX3QgKnRvcCwgaW50MzJfdCAqcmlnaHQsIGludDMyX3QgKmJvdHRvbSk7CisKK3ZvaWQgQU1lZGlhRm9ybWF0X3NldERvdWJsZShBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyKiBuYW1lLCBkb3VibGUgdmFsdWUpOwordm9pZCBBTWVkaWFGb3JtYXRfc2V0U2l6ZShBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyKiBuYW1lLCBzaXplX3QgdmFsdWUpOwordm9pZCBBTWVkaWFGb3JtYXRfc2V0UmVjdChBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlZnQsIGludDMyX3QgdG9wLCBpbnQzMl90IHJpZ2h0LCBpbnQzMl90IGJvdHRvbSk7CisjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI4ICovCisKK19fRU5EX0RFQ0xTCiAKICNlbmRpZiAvLyBfTkRLX01FRElBX0ZPUk1BVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYU11eGVyLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYU11eGVyLmgKaW5kZXggMjU5ODdhMi4uMWVjZDFjYSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFNdXhlci5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhTXV4ZXIuaApAQCAtMzUsMTEgKzM1LDcgQEAKICNpbmNsdWRlICJOZGtNZWRpYUVycm9yLmgiCiAjaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXQuaCIKIAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDIxCitfX0JFR0lOX0RFQ0xTCiAKIHN0cnVjdCBBTWVkaWFNdXhlcjsKIHR5cGVkZWYgc3RydWN0IEFNZWRpYU11eGVyIEFNZWRpYU11eGVyOwpAQCAtNDksNiArNDUsOCBAQAogICAgIEFNRURJQU1VWEVSX09VVFBVVF9GT1JNQVRfV0VCTSAgID0gMSwKIH0gT3V0cHV0Rm9ybWF0OwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDIxCisKIC8qKgogICogQ3JlYXRlIG5ldyBtZWRpYSBtdXhlcgogICovCkBAIC0xMTcsOCArMTE1LDYgQEAKIAogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyMSAqLwogCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gLy8gZXh0ZXJuICJDIgotI2VuZGlmCitfX0VORF9ERUNMUwogCiAjZW5kaWYgLy8gX05ES19NRURJQV9NVVhFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvbGlibWVkaWFuZGsubWFwLnR4dCBiL21lZGlhL25kay9saWJtZWRpYW5kay5tYXAudHh0CmluZGV4IGQ3YWQzNzAuLmZiNTY2OTQgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9saWJtZWRpYW5kay5tYXAudHh0CisrKyBiL21lZGlhL25kay9saWJtZWRpYW5kay5tYXAudHh0CkBAIC0yNiwzMCArMjYsNjMgQEAKICAgICBBSW1hZ2VfZ2V0UGxhbmVSb3dTdHJpZGU7ICMgaW50cm9kdWNlZD0yNAogICAgIEFJbWFnZV9nZXRUaW1lc3RhbXA7ICMgaW50cm9kdWNlZD0yNAogICAgIEFJbWFnZV9nZXRXaWR0aDsgIyBpbnRyb2R1Y2VkPTI0CisgICAgQU1FRElBRk9STUFUX0tFWV9BQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUjsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfQUFDX0RSQ19CT09TVF9GQUNUT1I7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FBQ19EUkNfSEVBVllfQ09NUFJFU1NJT047ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FBQ19EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTDsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfQUFDX0VOQ09ERURfVEFSR0VUX0xFVkVMOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9BQUNfTUFYX09VVFBVVF9DSEFOTkVMX0NPVU5UOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9BQUNfUFJPRklMRTsgIyB2YXIKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FBQ19TQlJfTU9ERTsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fU0VTU0lPTl9JRDsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfQklUUkFURV9NT0RFOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURTsgIyB2YXIKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NBUFRVUkVfUkFURTsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVDsgIyB2YXIKICAgICBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfTUFTSzsgIyB2YXIKICAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX0ZPUk1BVDsgIyB2YXIKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1JBTkdFOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9TVEFOREFSRDsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfVFJBTlNGRVI7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NPTVBMRVhJVFk7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfQ1JPUDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT047ICMgdmFyCiAgICAgQU1FRElBRk9STUFUX0tFWV9GTEFDX0NPTVBSRVNTSU9OX0xFVkVMOyAjIHZhcgogICAgIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURTsgIyB2YXIKKyAgICBBTUVESUFGT1JNQVRfS0VZX0dSSURfQ09MVU1OUzsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9ST1dTOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9IRFJfU1RBVElDX0lORk87ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVDsgIyB2YXIKKyAgICBBTUVESUFGT1JNQVRfS0VZX0lOVFJBX1JFRlJFU0hfUEVSSU9EOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9JU19BRFRTOyAjIHZhcgogICAgIEFNRURJQUZPUk1BVF9LRVlfSVNfQVVUT1NFTEVDVDsgIyB2YXIKICAgICBBTUVESUFGT1JNQVRfS0VZX0lTX0RFRkFVTFQ7ICMgdmFyCiAgICAgQU1FRElBRk9STUFUX0tFWV9JU19GT1JDRURfU1VCVElUTEU7ICMgdmFyCiAgICAgQU1FRElBRk9STUFUX0tFWV9JX0ZSQU1FX0lOVEVSVkFMOyAjIHZhcgogICAgIEFNRURJQUZPUk1BVF9LRVlfTEFOR1VBR0U7ICMgdmFyCisgICAgQU1FRElBRk9STUFUX0tFWV9MQVRFTkNZOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9MRVZFTDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0hFSUdIVDsgIyB2YXIKICAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFOyAjIHZhcgogICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX1dJRFRIOyAjIHZhcgogICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRTsgIyB2YXIKKyAgICBBTUVESUFGT1JNQVRfS0VZX09QRVJBVElOR19SQVRFOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkc7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX1BSSU9SSVRZOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9QUk9GSUxFOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9QVVNIX0JMQU5LX0JVRkZFUlNfT05fU1RPUDsgIyB2YXIKICAgICBBTUVESUFGT1JNQVRfS0VZX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9BRlRFUjsgIyB2YXIKKyAgICBBTUVESUFGT1JNQVRfS0VZX1JPVEFUSU9OOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURTsgIyB2YXIKKyAgICBBTUVESUFGT1JNQVRfS0VZX1NMSUNFX0hFSUdIVDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfU1RSSURFOyAjIHZhcgorICAgIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJJTkc7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RJTEVfSEVJR0hUOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9USUxFX1dJRFRIOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9UUkFDS19JRDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfV0lEVEg7ICMgdmFyCisgICAgQU1lZGlhQ29kZWNBY3Rpb25Db2RlX2lzUmVjb3ZlcmFibGU7ICMgaW50cm9kdWNlZD0yOAorICAgIEFNZWRpYUNvZGVjQWN0aW9uQ29kZV9pc1RyYW5zaWVudDsgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2RlbGV0ZTsKICAgICBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0Q2xlYXJCeXRlczsKICAgICBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0RW5jcnlwdGVkQnl0ZXM7CkBAIC02OCwxMiArMTAxLDE3IEBACiAgICAgQU1lZGlhQ29kZWNfZGVxdWV1ZU91dHB1dEJ1ZmZlcjsKICAgICBBTWVkaWFDb2RlY19mbHVzaDsKICAgICBBTWVkaWFDb2RlY19nZXRJbnB1dEJ1ZmZlcjsKKyAgICBBTWVkaWFDb2RlY19nZXRJbnB1dEZvcm1hdDsgIyBpbnRyb2R1Y2VkPTI4CisgICAgQU1lZGlhQ29kZWNfZ2V0TmFtZTsgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQU1lZGlhQ29kZWNfZ2V0T3V0cHV0QnVmZmVyOwogICAgIEFNZWRpYUNvZGVjX2dldE91dHB1dEZvcm1hdDsKICAgICBBTWVkaWFDb2RlY19xdWV1ZUlucHV0QnVmZmVyOwogICAgIEFNZWRpYUNvZGVjX3F1ZXVlU2VjdXJlSW5wdXRCdWZmZXI7CisgICAgQU1lZGlhQ29kZWNfcmVsZWFzZUNyeXB0bzsgIyBpbnRyb2R1Y2VkPTI4CisgICAgQU1lZGlhQ29kZWNfcmVsZWFzZU5hbWU7ICMgaW50cm9kdWNlZD0yOAogICAgIEFNZWRpYUNvZGVjX3JlbGVhc2VPdXRwdXRCdWZmZXI7CiAgICAgQU1lZGlhQ29kZWNfcmVsZWFzZU91dHB1dEJ1ZmZlckF0VGltZTsKKyAgICBBTWVkaWFDb2RlY19zZXRBc3luY05vdGlmeUNhbGxiYWNrOyAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFDb2RlY19zZXRPdXRwdXRTdXJmYWNlOyAjIGludHJvZHVjZWQ9MjQKICAgICBBTWVkaWFDb2RlY19zZXRQYXJhbWV0ZXJzOyAjIGludHJvZHVjZWQ9MjYKICAgICBBTWVkaWFDb2RlY19zZXRJbnB1dFN1cmZhY2U7ICMgaW50cm9kdWNlZD0yNgpAQCAtODYsNiArMTI0LDEyIEBACiAgICAgQU1lZGlhQ3J5cHRvX2lzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkOwogICAgIEFNZWRpYUNyeXB0b19uZXc7CiAgICAgQU1lZGlhQ3J5cHRvX3JlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudDsKKyAgICBBTWVkaWFEYXRhU291cmNlX2RlbGV0ZTsgICAgICAjIGludHJvZHVjZWQ9MjgKKyAgICBBTWVkaWFEYXRhU291cmNlX25ldzsgICAgICAgICAjIGludHJvZHVjZWQ9MjgKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldENsb3NlOyAgICAjIGludHJvZHVjZWQ9MjgKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldFNpemU7ICAjIGludHJvZHVjZWQ9MjgKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldFJlYWRBdDsgICAjIGludHJvZHVjZWQ9MjgKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldFVzZXJkYXRhOyAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFEcm1fY2xvc2VTZXNzaW9uOwogICAgIEFNZWRpYURybV9jcmVhdGVCeVVVSUQ7CiAgICAgQU1lZGlhRHJtX2RlY3J5cHQ7CkBAIC0xMTEsOSArMTU1LDEzIEBACiAgICAgQU1lZGlhRHJtX3ZlcmlmeTsKICAgICBBTWVkaWFFeHRyYWN0b3JfYWR2YW5jZTsKICAgICBBTWVkaWFFeHRyYWN0b3JfZGVsZXRlOworICAgIEFNZWRpYUV4dHJhY3Rvcl9nZXRDYWNoZWREdXJhdGlvbjsgIyBpbnRyb2R1Y2VkPTI4CisgICAgQU1lZGlhRXh0cmFjdG9yX2dldEZpbGVGb3JtYXQ7ICAgICAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFFeHRyYWN0b3JfZ2V0UHNzaEluZm87CiAgICAgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUNyeXB0b0luZm87CiAgICAgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUZsYWdzOworICAgIEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVGb3JtYXQ7ICAgIyBpbnRyb2R1Y2VkPTI4CisgICAgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVNpemU7ICAgICAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVGltZTsKICAgICBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVHJhY2tJbmRleDsKICAgICBBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tDb3VudDsKQEAgLTEyMywyMCArMTcxLDI2IEBACiAgICAgQU1lZGlhRXh0cmFjdG9yX3NlZWtUbzsKICAgICBBTWVkaWFFeHRyYWN0b3Jfc2VsZWN0VHJhY2s7CiAgICAgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2U7CisgICAgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VDdXN0b207ICMgaW50cm9kdWNlZD0yOAogICAgIEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlRmQ7CiAgICAgQU1lZGlhRXh0cmFjdG9yX3Vuc2VsZWN0VHJhY2s7CiAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZTsKICAgICBBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyOworICAgIEFNZWRpYUZvcm1hdF9nZXREb3VibGU7ICMgaW50cm9kdWNlZD0yOAogICAgIEFNZWRpYUZvcm1hdF9nZXRGbG9hdDsKICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzI7CiAgICAgQU1lZGlhRm9ybWF0X2dldEludDY0OworICAgIEFNZWRpYUZvcm1hdF9nZXRSZWN0OyAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFGb3JtYXRfZ2V0U2l6ZTsKICAgICBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nOwogICAgIEFNZWRpYUZvcm1hdF9uZXc7CiAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcjsKKyAgICBBTWVkaWFGb3JtYXRfc2V0RG91YmxlOyAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFGb3JtYXRfc2V0RmxvYXQ7CiAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyOwogICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NDsKKyAgICBBTWVkaWFGb3JtYXRfc2V0UmVjdDsgIyBpbnRyb2R1Y2VkPTI4CisgICAgQU1lZGlhRm9ybWF0X3NldFNpemU7ICMgaW50cm9kdWNlZD0yOAogICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmc7CiAgICAgQU1lZGlhRm9ybWF0X3RvU3RyaW5nOwogICAgIEFNZWRpYU11eGVyX2FkZFRyYWNrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvQW5kcm9pZC5icCBiL21lZGlhL3V0aWxzL0FuZHJvaWQuYnAKaW5kZXggNzI5MTdkZC4uZDZkYWU1YiAxMDA2NDQKLS0tIGEvbWVkaWEvdXRpbHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS91dGlscy9BbmRyb2lkLmJwCkBAIC0xMiw3ICsxMiw3IEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYm1lZGlhdXRpbHMiLAogCiAgICAgc3JjczogWwpAQCAtMjQsNyArMjQsNiBAQAogICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYm1lbXVucmVhY2hhYmxlIiwKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL0lTY2hlZHVsaW5nUG9saWN5U2VydmljZS5jcHAgYi9tZWRpYS91dGlscy9JU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuY3BwCmluZGV4IDIyZmJjOTcuLmIyMTA0MDQgMTAwNjQ0Ci0tLSBhL21lZGlhL3V0aWxzL0lTY2hlZHVsaW5nUG9saWN5U2VydmljZS5jcHAKKysrIGIvbWVkaWEvdXRpbHMvSVNjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmNwcApAQCAtMjUsNiArMjUsNyBAQAogLy8gS2VlcCBpbiBzeW5jIHdpdGggZnJhbWV3b3Jrcy9iYXNlL2NvcmUvamF2YS9hbmRyb2lkL29zL0lTY2hlZHVsaW5nUG9saWN5U2VydmljZS5haWRsCiBlbnVtIHsKICAgICBSRVFVRVNUX1BSSU9SSVRZX1RSQU5TQUNUSU9OID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKKyAgICBSRVFVRVNUX0NQVVNFVF9CT09TVCwKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTYwLDYgKzYxLDIzIEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KKworICAgIHZpcnR1YWwgaW50IHJlcXVlc3RDcHVzZXRCb29zdChib29sIGVuYWJsZSwgY29uc3Qgc3A8SUludGVyZmFjZT4mIGNsaWVudCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTY2hlZHVsaW5nUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGVuYWJsZSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoY2xpZW50KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChSRVFVRVNUX0NQVVNFVF9CT09TVCwgZGF0YSwgJnJlcGx5LCAwKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICAvLyBmYWlsIG9uIGV4Y2VwdGlvbjogZm9yY2UgYmluZGVyIHJlY29ubmVjdGlvbgorICAgICAgICBpZiAocmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShTY2hlZHVsaW5nUG9saWN5U2VydmljZSwgImFuZHJvaWQub3MuSVNjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlIik7CkBAIC03MSw2ICs4OSw3IEBACiB7CiAgICAgc3dpdGNoIChjb2RlKSB7CiAgICAgY2FzZSBSRVFVRVNUX1BSSU9SSVRZX1RSQU5TQUNUSU9OOgorICAgIGNhc2UgUkVRVUVTVF9DUFVTRVRfQk9PU1Q6CiAgICAgICAgIC8vIE5vdCByZWFjaGVkCiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9JU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaCBiL21lZGlhL3V0aWxzL0lTY2hlZHVsaW5nUG9saWN5U2VydmljZS5oCmluZGV4IDEwMTU2NzcuLmU0ZjdjMGQgMTAwNjQ0Ci0tLSBhL21lZGlhL3V0aWxzL0lTY2hlZHVsaW5nUG9saWN5U2VydmljZS5oCisrKyBiL21lZGlhL3V0aWxzL0lTY2hlZHVsaW5nUG9saWN5U2VydmljZS5oCkBAIC0yOSw2ICsyOSw3IEBACiAgICAgdmlydHVhbCBpbnQgICAgICAgICByZXF1ZXN0UHJpb3JpdHkoLypwaWRfdCovaW50MzJfdCBwaWQsIC8qcGlkX3QqL2ludDMyX3QgdGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpbywgYm9vbCBpc0ZvckFwcCwgYm9vbCBhc3luY2hyb25vdXMpID0gMDsKIAorICAgIHZpcnR1YWwgaW50ICAgICAgICAgcmVxdWVzdENwdXNldEJvb3N0KGJvb2wgZW5hYmxlLCBjb25zdCBzcDxJSW50ZXJmYWNlPiYgY2xpZW50KSA9IDA7CiB9OwogCiBjbGFzcyBCblNjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlIDogcHVibGljIEJuSW50ZXJmYWNlPElTY2hlZHVsaW5nUG9saWN5U2VydmljZT4KZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL09XTkVSUyBiL21lZGlhL3V0aWxzL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWNiNTY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvT1dORVJTCkBAIC0wLDAgKzEgQEAKK2drYXN0ZW5AZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuY3BwIGIvbWVkaWEvdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuY3BwCmluZGV4IGQ3MDU1ZWYuLjRlOTc5MmYgMTAwNjQ0Ci0tLSBhL21lZGlhL3V0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS91dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5jcHAKQEAgLTU5LDQgKzU5LDMxIEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAoraW50IHJlcXVlc3RDcHVzZXRCb29zdChib29sIGVuYWJsZSwgY29uc3Qgc3A8SUludGVyZmFjZT4gJmNsaWVudCkKK3sKKyAgICBpbnQgcmV0OworICAgIHNNdXRleC5sb2NrKCk7CisgICAgc3A8SVNjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlPiBzcHMgPSBzU2NoZWR1bGluZ1BvbGljeVNlcnZpY2U7CisgICAgc011dGV4LnVubG9jaygpOworICAgIGlmIChzcHMgPT0gMCkgeworICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Y2hlY2tTZXJ2aWNlKF9zY2hlZHVsaW5nX3BvbGljeSk7CisgICAgICAgIGlmIChiaW5kZXIgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICB9CisgICAgICAgIHNwcyA9IGludGVyZmFjZV9jYXN0PElTY2hlZHVsaW5nUG9saWN5U2VydmljZT4oYmluZGVyKTsKKyAgICAgICAgc011dGV4LmxvY2soKTsKKyAgICAgICAgc1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlID0gc3BzOworICAgICAgICBzTXV0ZXgudW5sb2NrKCk7CisgICAgfQorICAgIHJldCA9IHNwcy0+cmVxdWVzdENwdXNldEJvb3N0KGVuYWJsZSwgY2xpZW50KTsKKyAgICBpZiAocmV0ICE9IERFQURfT0JKRUNUKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIEFMT0dXKCJTY2hlZHVsaW5nUG9saWN5U2VydmljZSBkaWVkIik7CisgICAgc011dGV4LmxvY2soKTsKKyAgICBzU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuY2xlYXIoKTsKKyAgICBzTXV0ZXgudW5sb2NrKCk7CisgICAgcmV0dXJuIHJldDsKK30KKwogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaCBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5oCmluZGV4IDQ3ZDg3MzQuLmEzMzUzOWYgMTAwNjQ0Ci0tLSBhL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5oCisrKyBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5oCkBAIC0xNyw4ICsxNywxMSBAQAogI2lmbmRlZiBfQU5EUk9JRF9TQ0hFRFVMSU5HX1BPTElDWV9TRVJWSUNFX0gKICNkZWZpbmUgX0FORFJPSURfU0NIRURVTElOR19QT0xJQ1lfU0VSVklDRV9ICiAKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY2xhc3MgSUludGVyZmFjZTsKIC8vIFJlcXVlc3QgZWxldmF0ZWQgcHJpb3JpdHkgZm9yIHRocmVhZCB0aWQsIHdob3NlIHRocmVhZCBncm91cCBsZWFkZXIgbXVzdCBiZSBwaWQuCiAvLyBUaGUgcHJpb3JpdHkgcGFyYW1ldGVyIGlzIGN1cnJlbnRseSByZXN0cmljdGVkIHRvIGVpdGhlciAxIG9yIDIuCiAvLyBUaGUgYXN5bmNocm9ub3VzIHBhcmFtZXRlciBzaG91bGQgYmUgJ3RydWUnIHRvIHJldHVybiBpbW1lZGlhdGVseSwKQEAgLTI2LDYgKzI5LDE0IEBACiAvLyBUaGUgZGVmYXVsdCB2YWx1ZSAnZmFsc2UnIG1lYW5zIHRvIHJldHVybiBhZnRlciByZXF1ZXN0IGhhcyBiZWVuIGVucXVldWVkIGFuZCBleGVjdXRlZC4KIGludCByZXF1ZXN0UHJpb3JpdHkocGlkX3QgcGlkLCBwaWRfdCB0aWQsIGludDMyX3QgcHJpbywgYm9vbCBpc0ZvckFwcCwgYm9vbCBhc3luY2hyb25vdXMgPSBmYWxzZSk7CiAKKy8vIFJlcXVlc3QgdG8gbW92ZSBtZWRpYS5jb2RlYyBwcm9jZXNzIGJldHdlZW4gU1BfRk9SRUdST1VORCBhbmQgU1BfVE9QX0FQUC4KKy8vIFdoZW4gJ2VuYWJsZScgaXMgJ3RydWUnLCBzZXJ2ZXIgd2lsbCBhdHRlbXB0IHRvIG1vdmUgbWVkaWEuY29kZWMgcHJvY2VzcworLy8gZnJvbSBTUF9GT1JFR1JPVU5EIGludG8gU1BfVE9QX0FQUCBjcHVzZXQuIEEgdmFsaWQgJ2NsaWVudCcgbXVzdCBiZSBwcm92aWRlZAorLy8gZm9yIHRoZSBzZXJ2ZXIgdG8gcmVjZWl2ZSBkZWF0aCBub3RpZmljYXRpb25zLiBXaGVuICdlbmFibGUnIGlzICdmYWxzZScsIHNlcnZlcgorLy8gd2lsbCBhdHRlbXB0IHRvIG1vdmUgbWVkaWEuY29kZWMgcHJvY2VzcyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBjcHVzZXQsIGFuZAorLy8gJ2NsaWVudCcgaXMgaWdub3JlZCBpbiB0aGlzIGNhc2UuCitpbnQgcmVxdWVzdENwdXNldEJvb3N0KGJvb2wgZW5hYmxlLCBjb25zdCBzcDxJSW50ZXJmYWNlPiAmY2xpZW50KTsKKwogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gX0FORFJPSURfU0NIRURVTElOR19QT0xJQ1lfU0VSVklDRV9ICmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvQW5kcm9pZC5tayBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZjlkYzUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDcyIEBACisjCisjIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgVGhpcyBwYWNrYWdlIGlzIGV4Y2x1ZGVkIGZyb20gYnVpbGQgZm9yIG5vdyBzaW5jZSBBUElzIHVzaW5nIHRoaXMgYXBrIGJlY2FtZSBoaWRkZW4uCisjCisjTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorI2lmbmVxICgkKFRBUkdFVF9CVUlMRF9QREspLHRydWUpICMgQnVpbGQgTWVkaWFDb21wb25lbnRzIG9ubHkgaWYgdGhpcyBpcyBub3QgYSBQREsgYnVpbGQuICBNZWRpYUNvbXBvbmVudHMgd29uJ3QKKyMjIGJ1aWxkIGluIFBESyBidWlsZHMgYmVjYXVzZSBmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhIGlzIG5vdCBhdmFpbGFibGUgYnV0CisjIyBJTWVkaWFTZXNzaW9uMi5haWRsIGFuZCBJTWVkaWFDb250cm9sbGVyMi5haWRsIGFyZSB1c2luZyBjbGFzc2VzIGZyb20KKyMjIGZyYW1ld29ya3MvYmFzZS9jb3JlL2phdmEuCisjCisjaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisjCisjTE9DQUxfUEFDS0FHRV9OQU1FIDo9IE1lZGlhQ29tcG9uZW50cworI0xPQ0FMX01PRFVMRV9PV05FUiA6PSBnb29nbGUKKyMKKyMjIFRPRE86IGNyZWF0ZSBhIHNlcGFyYXRlIGtleSBmb3IgdGhpcyBwYWNrYWdlLgorI0xPQ0FMX0NFUlRJRklDQVRFIDo9IHBsYXRmb3JtCisjCisjIyBUT0RPOiBVc2UgU3lzdGVtIFNESyBvbmNlIHB1YmxpYyBBUElzIGFyZSBhcHByb3ZlZAorIyMgTE9DQUxfU0RLX1ZFUlNJT04gOj0gc3lzdGVtX2N1cnJlbnQKKyNMT0NBTF9QUklWQVRFX1BMQVRGT1JNX0FQSVMgOj0gdHJ1ZQorIworI0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisjICAgICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSBcCisjICAgICQoY2FsbCBhbGwtSWFpZGwtZmlsZXMtdW5kZXIsIHNyYykKKyMKKyNMT0NBTF9QUk9HVUFSRF9GTEFHX0ZJTEVTIDo9IHByb2d1YXJkLmNmZworIworI0xPQ0FMX01VTFRJTElCIDo9IGZpcnN0CisjCisjTE9DQUxfSkFWQV9MSUJSQVJJRVMgKz0gYW5kcm9pZC1zdXBwb3J0LWFubm90YXRpb25zCisjCisjIyBUbyBlbWJlZCBuYXRpdmUgbGlicmFyaWVzIGluIHBhY2thZ2UsIHVuY29tbWVudCB0aGUgbGluZXMgYmVsb3cuCisjI0xPQ0FMX01PRFVMRV9UQUdTIDo9IHNhbXBsZXMKKyMjTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorIyMgICAgbGliYWFjZXh0cmFjdG9yIFwKKyMjICAgIGxpYmFtcmV4dHJhY3RvciBcCisjIyAgICBsaWJmbGFjZXh0cmFjdG9yIFwKKyMjICAgIGxpYm1pZGlleHRyYWN0b3IgXAorIyMgICAgbGlibWt2ZXh0cmFjdG9yIFwKKyMjICAgIGxpYm1wM2V4dHJhY3RvciBcCisjIyAgICBsaWJtcDRleHRyYWN0b3IgXAorIyMgICAgbGlibXBlZzJleHRyYWN0b3IgXAorIyMgICAgbGlib2dnZXh0cmFjdG9yIFwKKyMjICAgIGxpYndhdmV4dHJhY3RvciBcCisjCisjIyBUT0RPOiBSZW1vdmUgZGVwZW5kZW5jeSB3aXRoIG90aGVyIHN1cHBvcnQgbGlicmFyaWVzLgorI0xPQ0FMX1NUQVRJQ19BTkRST0lEX0xJQlJBUklFUyArPSBcCisjICAgIGFuZHJvaWQtc3VwcG9ydC12NCBcCisjICAgIGFuZHJvaWQtc3VwcG9ydC12Ny1hcHBjb21wYXQgXAorIyAgICBhbmRyb2lkLXN1cHBvcnQtdjctcGFsZXR0ZQorI0xPQ0FMX1VTRV9BQVBUMiA6PSB0cnVlCisjCisjaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCisjCisjZW5kaWYgICMgaWZuZXEgKCQoVEFSR0VUX0JVSUxEX1BESyksdHJ1ZSkKKyMKKyNpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZmRjYTEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDE1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUiCisgICAgYW5kcm9pZDp2ZXJzaW9uQ29kZT0iMSIKKyAgICBhbmRyb2lkOnZlcnNpb25OYW1lPSIxLjAiID4KKworICAgIDxhcHBsaWNhdGlvbgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJNZWRpYSBDb21wb25lbnRzIFVwZGF0ZSIKKyAgICAgICAgYW5kcm9pZDptdWx0aUFyY2g9InRydWUiCisgICAgICAgIGFuZHJvaWQ6YWxsb3dCYWNrdXA9ImZhbHNlIgorICAgICAgICBhbmRyb2lkOmhhc0NvZGU9ImZhbHNlIgorICAgICAgICBhbmRyb2lkOmV4dHJhY3ROYXRpdmVMaWJzPSJmYWxzZSI+CisgICAgPC9hcHBsaWNhdGlvbj4KKworPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9wcm9ndWFyZC5jZmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcHJvZ3VhcmQuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YmY3MzAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcHJvZ3VhcmQuY2ZnCkBAIC0wLDAgKzEsMjAgQEAKKyMKKyMgQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBLZWVwIGVudHJ5IHBvaW50IGZvciB1cGRhdGFibGUgSmF2YSBjbGFzc2VzCista2VlcCBwdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUZhY3RvcnkgeworICAgcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpRmFjdG9yeSBpbml0aWFsaXplKGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm8pOworfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2ZkNTFmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YzgyNTIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI4ZGRlYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTljZDc1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxOTJhZDQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI3MDdlYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzMyZDAwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNDVlZTMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDFkMzQxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNmI2NWQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N1YnRpdGxlX2Rpc2FibGVkLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdWJ0aXRsZV9kaXNhYmxlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM1NGY2MQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdWJ0aXRsZV9kaXNhYmxlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N1YnRpdGxlX2VuYWJsZWQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N1YnRpdGxlX2VuYWJsZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmOGZlYmUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3VidGl0bGVfZW5hYmxlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFkMzA1ZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODdmZGU0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzM5ZGY3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YzM0NGEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEwMzQyMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MjNlNDU1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MGMyNWEzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFmZGI5YzEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg0NmMxMDkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMzYmY0ODQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzkxMWI1YwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTRlZDUwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZjdlMGMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY1NThhOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGExYTg0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0OWFlZDcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQwNjhlYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2M3NzdjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMDg3OTUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWQyYzljCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMDJhYjcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N1YnRpdGxlX2Rpc2FibGVkLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdWJ0aXRsZV9kaXNhYmxlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM1NGY2MQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdWJ0aXRsZV9kaXNhYmxlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N1YnRpdGxlX2VuYWJsZWQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N1YnRpdGxlX2VuYWJsZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmOGZlYmUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3VidGl0bGVfZW5hYmxlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ0NmVhNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDc5MGM2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDAxZGMwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNGQ1ODYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NiYjc3MgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43Y2M5ODQ1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMjYxN2UxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNlZmVmM2MKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlhMDA0N2MKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNhNWQ2YTIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODEzNDMxMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Yzg5OWYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc3OGUwMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTkyZmM1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzODg0ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYwYWM2NQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTIxMDRmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNWMwNjIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEyZDQ5NQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMzkzMzYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJjNWE2YwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZGQyMTQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI3YmRjZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZmU1NzYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE1ZDZhYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYWRmYTMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI1ZmUwYgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YzQ4YTcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQxZTkxMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNDIxOGEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIzMGZhYgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YWE5MDMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdlMmYyOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ODcxZTIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM1N2Y2MwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNDFiMDEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRiYjY5NAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZTEwMTMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzNTJjMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNTMyZTkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM2YmEzMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYTNiNWYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ0YmIyMgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNTYxMjcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQxN2E5ZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZjYzM2UKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE1MTgxMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NmE1M2MKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcwNWRjYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZTRlYTMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM2NzI0ZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllM2I0MTAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYxOGFiZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlODExMzMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgwYjE5MQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YWJhM2QKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EzNGQ1YgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5OTU3YjMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVkMzg0ZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYzYyOTcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhhYjY4NAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZTdmNzUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFhM2NhMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYWVjZGUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI4ZDBiNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMGJlM2MKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE0ZjFiZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMThiNDYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRjMmMwMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZmFlNDQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0YzI4OQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZjkzMjcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVlMWY2OQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNmZhZmQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUyYmQ4NwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3M2ExZjgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhjMTA2OQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MmI4MDMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRmYmEwMgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1N2YyZDIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhmNTQ3OAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5OTVhZjAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUwYjdmMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZkZDIxNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjdiZGNkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdmZTU3NgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTVkNmFhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFhZGZhMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjVmZTBiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVjNDhhNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDFlOTExCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU0MjE4YQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjMwZmFiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdhYTkwMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2UyZjI5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc4NzFlMgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzU3ZjYzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA0MWIwMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGJiNjk0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhlMTAxMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzM1MmMzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA1MzJlOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzZiYTMwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJhM2I1ZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDRiYjIyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM1NzBmNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWE0MDNlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY0NGJmZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2Q2MDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUwZDU1OAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2JjNDhkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRkOGY4ZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGI5MGU1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMyMzRhNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2Q0NTJmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgxY2Y1YQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGQwOGI0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZlYjNmMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmFlOGIzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIwZmMwOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmExNmFjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM1OThjYwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDZkMTZkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA3MDQ1NQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTZkYjEzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YzODI4YQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWNjYzczCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM4Y2VkOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDAxYjllCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UzMWRkMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWY3OGU0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdjMmNkYgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2M1YmVhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNhZDBkNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmE1OTIzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY4N2UyNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzA2ZGI4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAyMjViYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTY5N2RlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM3ZWMyMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTg0MGJmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ0NWUzYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzM3YzY1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZkZDIxNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjdiZGNkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGRjMTMyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNDYxN2MKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMzA3NzMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA1ZDdkNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjM4ZDU4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU0MDM0OWQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY2N2M0NjMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2ZjZWJmNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWEzMmE3YQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDYyY2EzNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMTMxMjU2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEzMWUxYgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTk0NmEyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NWU4N2YKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFiNDQwMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWE3ZTAzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNjM1MzgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc0NWMzYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGEzYmE1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM1Y2ExOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWMxODNkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRiNjc5ZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWM2MDUxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA4MzkxNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2MzY2FmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM0NDRjZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmQ2Mzc3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRiZDFkYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmU3MTA4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlmNTk2YgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjMyZTFhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU2OGUwNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDIwZGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJlMzllNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWRjMTVmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhhZWJhZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWE2YTRmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRiOTFjZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWY2NmY5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFlYTM0YgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTJkZTA0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIxYWEyMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzRiY2MwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY2NmIzNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDVhOGZiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRlYjEzMgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGEyYjYwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI4MGFhOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTVlZmU0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMwY2MzMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmFlNmZjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg4MTZjOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDQyOTMxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBkNWI3ZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDNhMGZlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MyYTY1NQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGRlYmMyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNlNzhhNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTNmOTkxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNmYWQ5ZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmRkOGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkwZmQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjBiNWMxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNlMWVmMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTcxMGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYxYzA4MAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzRhYTIxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlhNmIzMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmU4ZmUwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdiODQwZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjI0MDUwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFjMThjMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTk3NTNlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YyOTFiMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzFjNjE5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwNGE3MAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2UwYTYwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdiMWYzZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzU1MWVjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM4NjY3ZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmI4MTgzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg5M2YxOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzVlMTU2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGI2NzllCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYzYwNTEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDgzOTE0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYzNjYWYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzQ0NGNmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZDYzNzcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGJkMWRhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZTcxMDgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWY1OTZiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMzJlMWEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTY4ZTA0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMjBkZDkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmUzOWU3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZGMxNWYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGFlYmFmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YTZhNGYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGI5MWNlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZjY2ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWVhMzRiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MmRlMDQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjFhYTIxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNGJjYzAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmZmYTAxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZjdlNTcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmFjNGRjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYTg2ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzAxMDkwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzOTZmMGUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTkwMDFiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNzE1ODEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTk2MjA4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNjk1MDAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2UxYmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZThmMTkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjMyZTk1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZDVkMmUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjBkNTI3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NjFhZTEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWEzZjg0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZDE2NmYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmU1MjdlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYjJhOGUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzM3YWY1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZjMxZWYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGQ5ZjU3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmOGViNzcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmEwZTE0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NDI1ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzc2ZTE5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMmYxZWQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWZkY2RkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZTliODE5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI5ZTQ0MwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDljYTg5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZjNzVkNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2JkMjdjCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGViYjBhYwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjUxNGFhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU3ZmU1YwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmIyYzEwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRiNjc5ZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWM2MDUxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGIyMTIxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZTdlM2EKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NjAxY2UKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ5MjhkNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTJmZDc3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYxNzFhOGMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM4Y2I2Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWM4ODYzZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTMzNTAzOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTZhNDg1OAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40Y2E2Nzg3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMzA1ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDEucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5Mzk1ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMi5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYTcyODIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMy5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZjBmNTMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YTgwZDkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYzM5MzkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNi5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDYucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMDI1MzYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNy5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDcucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMjI4ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wOC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDgucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNDI3N2UKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wOS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NjViZmIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YzVkNmIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTEucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZjRhZDUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMi5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMzA2NDgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMy5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5OTMyNGUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xNC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NjE4ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xNS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMGQ3NzAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDAucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEwZDc3MAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDEucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRiNGU1MAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDIucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJiNWYwMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDMucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA1Yzc1OAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE1YzdmYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDUucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMyODdlNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDYucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI3ZDBjZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDcucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVmYTcyYgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDgucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wOC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY1MGVlYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDkucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY0NDM1NQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTAucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU4NzdjMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTEucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkyN2YwYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTIucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiMTliYgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTMucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY1OTIxZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xNC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRiNzZiMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTUucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xNS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIzMDVkMgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YTk1MjUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvY3VzdG9tX3Byb2dyZXNzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvY3VzdG9tX3Byb2dyZXNzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzMxYTZlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9jdXN0b21fcHJvZ3Jlc3MueG1sCkBAIC0wLDAgKzEsMzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxsYXllci1saXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2JhY2tncm91bmQiPgorICAgICAgICA8c2hhcGUgYW5kcm9pZDpzaGFwZT0icmVjdGFuZ2xlIiA+CisgICAgICAgICAgICA8c29saWQgYW5kcm9pZDpjb2xvcj0iIzI2MDAwMDAwIiAvPgorICAgICAgICA8L3NoYXBlPgorICAgIDwvaXRlbT4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9zZWNvbmRhcnlQcm9ncmVzcyI+CisgICAgICAgIDxjbGlwPgorICAgICAgICAgICAgPHNoYXBlIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSIgPgorICAgICAgICAgICAgICAgIDxzb2xpZCBhbmRyb2lkOmNvbG9yPSIjNUNmZmZmZmYiIC8+CisgICAgICAgICAgICA8L3NoYXBlPgorICAgICAgICA8L2NsaXA+CisgICAgPC9pdGVtPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3Byb2dyZXNzIj4KKyAgICAgICAgPGNsaXA+CisgICAgICAgICAgICA8c2hhcGUgYW5kcm9pZDpzaGFwZT0icmVjdGFuZ2xlIiA+CisgICAgICAgICAgICAgICAgPHNvbGlkIGFuZHJvaWQ6Y29sb3I9IiNmZmZmZmYiIC8+CisgICAgICAgICAgICA8L3NoYXBlPgorICAgICAgICA8L2NsaXA+CisgICAgPC9pdGVtPgorPC9sYXllci1saXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvY3VzdG9tX3Byb2dyZXNzX3RodW1iLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvY3VzdG9tX3Byb2dyZXNzX3RodW1iLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTM1OTcwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9jdXN0b21fcHJvZ3Jlc3NfdGh1bWIueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxzaGFwZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpzaGFwZT0ib3ZhbCIgPgorICAgIDxzb2xpZCBhbmRyb2lkOmNvbG9yPSIjZmZmZmZmIiAvPgorICAgIDxzaXplCisgICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSJAZGltZW4vbWN2Ml9jdXN0b21fcHJvZ3Jlc3NfdGh1bWJfc2l6ZSIKKyAgICAgICAgYW5kcm9pZDp3aWR0aD0iQGRpbWVuL21jdjJfY3VzdG9tX3Byb2dyZXNzX3RodW1iX3NpemUiIC8+Cis8L3NoYXBlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfYXJyb3dfYmFjay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Fycm93X2JhY2sueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNWY3MWUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Fycm93X2JhY2sueG1sCkBAIC0wLDAgKzEsOSBAQAorPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCisgICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgorICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCisgICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0yMCwxMUg3LjgzbDUuNTksLTUuNTlMMTIsNGwtOCw4IDgsOCAxLjQxLC0xLjQxTDcuODMsMTNIMjB2LTJ6IgorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgorPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2FzcGVjdF9yYXRpby54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2FzcGVjdF9yYXRpby54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYyMjhlNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfYXNwZWN0X3JhdGlvLnhtbApAQCAtMCwwICsxLDkgQEAKKzx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgorICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKKyAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgorICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTksMTJoLTJ2M2gtM3YyaDV2LTV6TTcsOWgzTDEwLDdMNSw3djVoMkw3LDl6TTIxLDNMMywzYy0xLjEsMCAtMiwwLjkgLTIsMnYxNGMwLDEuMSAwLjksMiAyLDJoMThjMS4xLDAgMiwtMC45IDIsLTJMMjMsNWMwLC0xLjEgLTAuOSwtMiAtMiwtMnpNMjEsMTkuMDFMMywxOS4wMUwzLDQuOTloMTh2MTQuMDJ6IgorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgorPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2F1ZGlvdHJhY2sueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hdWRpb3RyYWNrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2MxMmI1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hdWRpb3RyYWNrLnhtbApAQCAtMCwwICsxLDkgQEAKKzx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCisgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCisgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgorICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTIsM3Y5LjI4Yy0wLjQ3LC0wLjE3IC0wLjk3LC0wLjI4IC0xLjUsLTAuMjhDOC4wMSwxMiA2LDE0LjAxIDYsMTYuNVM4LjAxLDIxIDEwLjUsMjFjMi4zMSwwIDQuMiwtMS43NSA0LjQ1LC00SDE1VjZoNFYzaC03eiIvPgorPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZWNrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hlY2sueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZjcyMGIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZWNrLnhtbApAQCAtMCwwICsxLDEzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKKyAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKKyAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgorICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KKworICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wIDBoMjR2MjRIMHoiIC8+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik05IDE2LjJMNC44IDEybC0xLjQgMS40TDkgMTkgMjEgN2wtMS40LTEuNEw5IDE2LjJ6IiAvPgorPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGV2cm9uX2xlZnQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGV2cm9uX2xlZnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMzZkMTcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZXZyb25fbGVmdC54bWwKQEAgLTAsMCArMSw5IEBACis8dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKKyAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCisgICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKKyAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE1LjQxLDcuNDFMMTQsNmwtNiw2IDYsNiAxLjQxLC0xLjQxTDEwLjgzLDEyeiIKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KKzwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGV2cm9uX3JpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hldnJvbl9yaWdodC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIyY2UwOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hldnJvbl9yaWdodC54bWwKQEAgLTAsMCArMSw5IEBACis8dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKKyAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCisgICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKKyAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTEwLDZMOC41OSw3LjQxIDEzLjE3LDEybC00LjU4LDQuNTlMMTAsMThsNiwtNnoiCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Cis8L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZGVmYXVsdF9hbGJ1bV9pbWFnZS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2RlZmF1bHRfYWxidW1faW1hZ2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZWU2NDMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2RlZmF1bHRfYWxidW1faW1hZ2UueG1sCkBAIC0wLDAgKzEsMTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOndpZHRoPSI1MTJkcCIKKyAgICBhbmRyb2lkOmhlaWdodD0iNTEyZHAiCisgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSI1MTIiCisgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iNTEyIj4KKworICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjNjE2MTYxIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNIDAgMCBIIDUxMiBWIDUxMiBIIDAgViAwIFoiIC8+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiM1MjUyNTIiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0yNTYsMTUxdjEyMy4xNGMtNi44OC00LjAyLTE0LjgyLTYuNDgtMjMuMzMtNi40OCBjLTI1Ljc4LDAtNDYuNjcsMjAuODgtNDYuNjcsNDYuNjdjMCwyNS43OCwyMC44OCw0Ni42Nyw0Ni42Nyw0Ni42N3M0Ni42Ny0yMC44OCw0Ni42Ny00Ni42N1YxOTcuNjdIMzI2VjE1MUgyNTZ6IiAvPgorPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2ZvcndhcmRfMzAueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19mb3J3YXJkXzMwLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWZkZjE2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19mb3J3YXJkXzMwLnhtbApAQCAtMCwwICsxLDEyIEBACis8dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDp3aWR0aD0iNDBkcCIKKyAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjQwZHAiCisgICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKKyAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+CisgICAgPGdyb3VwPgorICAgICAgICA8Y2xpcC1wYXRoIGFuZHJvaWQ6cGF0aERhdGE9Ik0yNCwyNEgwVjBoMjR2MjR6IE0gMCwwIiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik05LjYgMTMuNWguNGMuMiAwIC40LC0uMS41LC0uMnMuMiwtLjIuMiwtLjR2LS4ycy0uMSwtLjEsLS4xLC0uMiwtLjEsLS4xLC0uMiwtLjFoLS41cy0uMS4xLC0uMi4xLC0uMS4xLC0uMS4ydi4yaC0xYzAsLS4yIDAsLS4zLjEsLS41cy4yLC0uMy4zLC0uNC4zLC0uMi40LC0uMi40LC0uMS41LC0uMWMuMiAwIC40IDAgLjYuMXMuMy4xLjUuMi4yLjIuMy40LjEuMy4xLjV2LjNzLS4xLjIsLS4xLjMsLS4xLjIsLS4yLjIsLS4yLjEsLS4zLjJjLjIuMS40LjIuNS40cy4yLjQuMi42YzAgLjIgMCAuNCwtLjEuNXMtLjIuMywtLjMuNCwtLjMuMiwtLjUuMiwtLjQuMSwtLjYuMWMtLjIgMCwtLjQgMCwtLjUsLS4xcy0uMywtLjEsLS41LC0uMiwtLjIsLS4yLC0uMywtLjQsLS4xLC0uNCwtLjEsLS42aC44di4ycy4xLjEuMS4yLjEuMS4yLjFoLjVzLjEsLS4xLjIsLS4xLjEsLS4xLjEsLS4ydi0uNXMtLjEsLS4xLC0uMSwtLjIsLS4xLC0uMSwtLjIsLS4xaC0uNnYtLjd6bTUuNy43YzAgLjMgMCAuNiwtLjEuOGwtLjMuNnMtLjMuMywtLjUuMywtLjQuMSwtLjYuMSwtLjQgMCwtLjYsLS4xLC0uMywtLjIsLS41LC0uMywtLjIsLS4zLC0uMywtLjYsLS4xLC0uNSwtLjEsLS44di0uN2MwLC0uMyAwLC0uNi4xLC0uOGwuMywtLjZzLjMsLS4zLjUsLS4zLjQsLS4xLjYsLS4xLjQgMCAuNi4xLjMuMi41LjMuMi4zLjMuNi4xLjUuMS44di43em0tLjksLS44di0uNXMtLjEsLS4yLC0uMSwtLjMsLS4xLC0uMSwtLjIsLS4yLC0uMiwtLjEsLS4zLC0uMSwtLjIgMCwtLjMuMWwtLjIuMnMtLjEuMiwtLjEuM3Yycy4xLjIuMS4zLjEuMS4yLjIuMi4xLjMuMS4yIDAgLjMsLS4xbC4yLC0uMnMuMSwtLjIuMSwtLjN2LTEuNXpNNCAxM2MwIDQuNCAzLjYgOCA4IDhzOCwtMy42IDgsLThoLTJjMCAzLjMsLTIuNyA2LC02IDZzLTYsLTIuNywtNiwtNiAyLjcsLTYgNiwtNnY0bDUsLTUsLTUsLTV2NGMtNC40IDAsLTggMy42LC04IDh6IgorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgorICAgIDwvZ3JvdXA+Cis8L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZnVsbHNjcmVlbi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Z1bGxzY3JlZW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNGY2YmMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Z1bGxzY3JlZW4ueG1sCkBAIC0wLDAgKzEsOSBAQAorPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCisgICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgorICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCisgICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik03LDE0TDUsMTR2NWg1di0yTDcsMTd2LTN6TTUsMTBoMkw3LDdoM0wxMCw1TDUsNXY1ek0xNywxN2gtM3YyaDV2LTVoLTJ2M3pNMTQsNXYyaDN2M2gyTDE5LDVoLTV6IgorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgorPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Z1bGxzY3JlZW5fZXhpdC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Z1bGxzY3JlZW5fZXhpdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMyMDRlMgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZnVsbHNjcmVlbl9leGl0LnhtbApAQCAtMCwwICsxLDkgQEAKKzx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgorICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKKyAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgorICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNNSwxNmgzdjNoMnYtNUw1LDE0djJ6TTgsOEw1LDh2Mmg1TDEwLDVMOCw1djN6TTE0LDE5aDJ2LTNoM3YtMmgtNXY1ek0xNiw4TDE2LDVoLTJ2NWg1TDE5LDhoLTN6IgorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgorPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2hlbHAueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19oZWxwLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDFkNzVkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19oZWxwLnhtbApAQCAtMCwwICsxLDE2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKKyAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKKyAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgorICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KKworICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wIDBoMjR2MjRIMHoiIC8+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0xCisxN2gtMnYtMmgydjJ6bTIuMDctNy43NWwtLjkgLjkyIEMxMy40NSAxMi45IDEzIDEzLjUgMTMgMTVoLTJ2LS41YzAtMS4xIC40NSAtMi4xCisxLjE3LTIuODNsMS4yNC0xLjI2Yy4zNy0uMzYgLjU5IC0uODYgLjU5IC0xLjQxIDAtMS4xLS45LTItMi0ycy0yIC45LTIgMkg4YzAtMi4yMQorMS43OS00IDQtNHM0IDEuNzkgNCA0YzAgLjg4LS4zNiAxLjY4LS45MyAyLjI1eiIgLz4KKzwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfaGlnaF9xdWFsaXR5LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfaGlnaF9xdWFsaXR5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzZlMjJmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19oaWdoX3F1YWxpdHkueG1sCkBAIC0wLDAgKzEsMTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOndpZHRoPSIzNGRwIgorICAgIGFuZHJvaWQ6aGVpZ2h0PSIzNGRwIgorICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQiCisgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQiPgorCisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTAgMGgyNHYyNEgweiIgLz4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5IDRINWMtMS4xMSAwLTIgMC45LTIgMnYxMmMwIDEuMSAwLjg5IDIgMiAyaDE0YzEuMSAwIDItMC45IDItMlY2YzAtMS4xLTAuOS0yLTItMnptLTggMTFIOS41di0yaC0ydjJINlY5aDEuNXYyLjVoMlY5SDExdjZ6bTctMWMwIDAuNTUtMC40NSAxLTEgMWgtMC43NXYxLjVoLTEuNVYxNUgxNGMtMC41NSAwLTEtMC40NS0xLTF2LTRjMC0wLjU1IDAuNDUgLTEgMS0xaDNjMC41NSAwIDEgMC40NSAxIDF2NHptLTMuNS0wLjVoMnYtM2gtMnYzeiIgLz4KKzwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfbGF1bmNoLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfbGF1bmNoLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2FmNmFhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19sYXVuY2gueG1sCkBAIC0wLDAgKzEsOSBAQAorPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKKyAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKKyAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCisgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOSwxOUg1VjVoN1YzSDVjLTEuMTEsMCAtMiwwLjkgLTIsMnYxNGMwLDEuMSAwLjg5LDIgMiwyaDE0YzEuMSwwIDIsLTAuOSAyLC0ydi03aC0ydjd6TTE0LDN2MmgzLjU5bC05LjgzLDkuODMgMS40MSwxLjQxTDE5LDYuNDFWMTBoMlYzaC03eiIvPgorPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19tdXRlLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfbXV0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYwYWFlYwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfbXV0ZS54bWwKQEAgLTAsMCArMSw5IEBACis8dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKKyAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCisgICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKKyAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE2LjUsMTJjMCwtMS43NyAtMS4wMiwtMy4yOSAtMi41LC00LjAzdjIuMjFsMi40NSwyLjQ1YzAuMDMsLTAuMiAwLjA1LC0wLjQxIDAuMDUsLTAuNjN6TTE5LDEyYzAsMC45NCAtMC4yLDEuODIgLTAuNTQsMi42NGwxLjUxLDEuNTFDMjAuNjMsMTQuOTEgMjEsMTMuNSAyMSwxMmMwLC00LjI4IC0yLjk5LC03Ljg2IC03LC04Ljc3djIuMDZjMi44OSwwLjg2IDUsMy41NCA1LDYuNzF6TTQuMjcsM0wzLDQuMjcgNy43Myw5TDMsOXY2aDRsNSw1di02LjczbDQuMjUsNC4yNWMtMC42NywwLjUyIC0xLjQyLDAuOTMgLTIuMjUsMS4xOHYyLjA2YzEuMzgsLTAuMzEgMi42MywtMC45NSAzLjY5LC0xLjgxTDE5LjczLDIxIDIxLDE5LjczbC05LC05TDQuMjcsM3pNMTIsNEw5LjkxLDYuMDkgMTIsOC4xOEwxMiw0eiIKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KKzwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19wYXVzZV9jaXJjbGVfZmlsbGVkLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNiZTIyOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZC54bWwKQEAgLTAsMCArMSw5IEBACis8dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDp3aWR0aD0iNDBkcCIKKyAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjQwZHAiCisgICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKKyAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTEyLDJDNi40OCwyIDIsNi40OCAyLDEyczQuNDgsMTAgMTAsMTAgMTAsLTQuNDggMTAsLTEwUzE3LjUyLDIgMTIsMnpNMTEsMTZMOSwxNkw5LDhoMnY4ek0xNSwxNmgtMkwxMyw4aDJ2OHoiCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Cis8L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcGxheV9jaXJjbGVfZmlsbGVkLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcGxheV9jaXJjbGVfZmlsbGVkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDM5ZGVmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19wbGF5X2NpcmNsZV9maWxsZWQueG1sCkBAIC0wLDAgKzEsOSBAQAorPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCisgICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgorICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCisgICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiwyQzYuNDgsMiAyLDYuNDggMiwxMnM0LjQ4LDEwIDEwLDEwIDEwLC00LjQ4IDEwLC0xMFMxNy41MiwyIDEyLDJ6TTEwLDE2LjV2LTlsNiw0LjUgLTYsNC41eiIKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KKzwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19yZXBsYXlfY2lyY2xlX2ZpbGxlZC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3JlcGxheV9jaXJjbGVfZmlsbGVkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTZkNWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19yZXBsYXlfY2lyY2xlX2ZpbGxlZC54bWwKQEAgLTAsMCArMSwxNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCisgICAgYW5kcm9pZDpoZWlnaHQ9IjQwZHAiCisgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNCIKKyAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNCI+CisKKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCwwaDI0djI0SDBWMHoiIC8+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCisgICAgICAgIGFuZHJvaWQ6ZmlsbFR5cGU9ImV2ZW5PZGQiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiwyQzYuNDgsMiwyLDYuNDgsMiwxMmMwLDUuNTIsNC40OCwxMCwxMCwxMGM1LjUyLDAsMTAtNC40OCwxMC0xMAorQzIyLDYuNDgsMTcuNTIsMiwxMiwyegorTTE4LDEyYzAsMy4zMS0yLjY5LDYtNiw2Yy0zLjMxLDAtNi0yLjY5LTYtNmgyYzAsMi4yMSwxLjc5LDQsNCw0czQtMS43OSw0LTRzLTEuNzktNC00LTR2M0w4LDdsNC00djMKK0MxNS4zMSw2LDE4LDguNjksMTgsMTJ6IiAvPgorPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19yZXdpbmRfMTAueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19yZXdpbmRfMTAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNTg2YjQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3Jld2luZF8xMC54bWwKQEAgLTAsMCArMSwxMiBAQAorPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCisgICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgorICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCisgICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgorICAgIDxncm91cD4KKyAgICAgICAgPGNsaXAtcGF0aCBhbmRyb2lkOnBhdGhEYXRhPSJNMCwwaDI0djI0SDBWMHogTSAwLDAiIC8+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTEyIDVWMUw3IDZsNSA1VjdjMy4zIDAgNiAyLjcgNiA2cy0yLjcgNiwtNiA2LC02LC0yLjcsLTYsLTZINGMwIDQuNCAzLjYgOCA4IDhzOCwtMy42IDgsLTgsLTMuNiwtOCwtOCwtOHptLTEuMSAxMUgxMHYtMy4zTDkgMTN2LS43bDEuOCwtLjZoLjFWMTZ6bTQuMywtMS44YzAgLjMgMCAuNiwtLjEuOGwtLjMuNnMtLjMuMywtLjUuMywtLjQuMSwtLjYuMSwtLjQgMCwtLjYsLS4xLC0uMywtLjIsLS41LC0uMywtLjIsLS4zLC0uMywtLjYsLS4xLC0uNSwtLjEsLS44di0uN2MwLC0uMyAwLC0uNi4xLC0uOGwuMywtLjZzLjMsLS4zLjUsLS4zLjQsLS4xLjYsLS4xLjQgMCAuNi4xYy4yLjEuMy4yLjUuM3MuMi4zLjMuNi4xLjUuMS44di43em0tLjksLS44di0uNXMtLjEsLS4yLC0uMSwtLjMsLS4xLC0uMSwtLjIsLS4yLC0uMiwtLjEsLS4zLC0uMSwtLjIgMCwtLjMuMWwtLjIuMnMtLjEuMiwtLjEuM3Yycy4xLjIuMS4zLjEuMS4yLjIuMi4xLjMuMS4yIDAgLjMsLS4xbC4yLC0uMnMuMSwtLjIuMSwtLjN2LTEuNXoiCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+CisgICAgPC9ncm91cD4KKzwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zZC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWNiNmQyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zZC54bWwKQEAgLTAsMCArMSwxNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCisgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCisgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNCIKKyAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNCI+CisKKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCwwaDI0djI0SDBWMHoiIC8+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOSwzSDVDMy44OSwzLDMsMy45LDMsNXYxNGMwLDEuMSwwLjg5LDIsMiwyaDE0YzEuMSwwLDItMC45LDItMlY1QzIxLDMuOSwyMC4xLDMsMTksM3oKK00xMyw5aDRjMC41NSwwLDEsMC40NSwxLDF2NCBjMCwwLjU1LTAuNDUsMS0xLDFoLTRWOXoKK005LjUsMTMuNXYtMUg3Yy0wLjU1LDAtMS0wLjQ1LTEtMVYxMGMwLTAuNTUsMC40NS0xLDEtMWgzYzAuNTUsMCwxLDAuNDUsMSwxdjFIOS41di0wLjVoLTJ2MUgxMAorYzAuNTUsMCwxLDAuNDUsMSwxVjE0YzAsMC41NS0wLjQ1LDEtMSwxSDdjLTAuNTUsMC0xLTAuNDUtMS0xdi0xaDEuNXYwLjVIOS41egorTTE0LjUsMTMuNWgydi0zaC0yVjEzLjV6IiAvPgorPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zZXR0aW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NldHRpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTllY2MxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zZXR0aW5ncy54bWwKQEAgLTAsMCArMSw5IEBACis8dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKKyAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCisgICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKKyAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LjQzLDEyLjk4YzAuMDQsLTAuMzIgMC4wNywtMC42NCAwLjA3LC0wLjk4cy0wLjAzLC0wLjY2IC0wLjA3LC0wLjk4bDIuMTEsLTEuNjVjMC4xOSwtMC4xNSAwLjI0LC0wLjQyIDAuMTIsLTAuNjRsLTIsLTMuNDZjLTAuMTIsLTAuMjIgLTAuMzksLTAuMyAtMC42MSwtMC4yMmwtMi40OSwxYy0wLjUyLC0wLjQgLTEuMDgsLTAuNzMgLTEuNjksLTAuOThsLTAuMzgsLTIuNjVDMTQuNDYsMi4xOCAxNC4yNSwyIDE0LDJoLTRjLTAuMjUsMCAtMC40NiwwLjE4IC0wLjQ5LDAuNDJsLTAuMzgsMi42NWMtMC42MSwwLjI1IC0xLjE3LDAuNTkgLTEuNjksMC45OGwtMi40OSwtMWMtMC4yMywtMC4wOSAtMC40OSwwIC0wLjYxLDAuMjJsLTIsMy40NmMtMC4xMywwLjIyIC0wLjA3LDAuNDkgMC4xMiwwLjY0bDIuMTEsMS42NWMtMC4wNCwwLjMyIC0wLjA3LDAuNjUgLTAuMDcsMC45OHMwLjAzLDAuNjYgMC4wNywwLjk4bC0yLjExLDEuNjVjLTAuMTksMC4xNSAtMC4yNCwwLjQyIC0wLjEyLDAuNjRsMiwzLjQ2YzAuMTIsMC4yMiAwLjM5LDAuMyAwLjYxLDAuMjJsMi40OSwtMWMwLjUyLDAuNCAxLjA4LDAuNzMgMS42OSwwLjk4bDAuMzgsMi42NWMwLjAzLDAuMjQgMC4yNCwwLjQyIDAuNDksMC40Mmg0YzAuMjUsMCAwLjQ2LC0wLjE4IDAuNDksLTAuNDJsMC4zOCwtMi42NWMwLjYxLC0wLjI1IDEuMTcsLTAuNTkgMS42OSwtMC45OGwyLjQ5LDFjMC4yMywwLjA5IDAuNDksMCAwLjYxLC0wLjIybDIsLTMuNDZjMC4xMiwtMC4yMiAwLjA3LC0wLjQ5IC0wLjEyLC0wLjY0bC0yLjExLC0xLjY1ek0xMiwxNS41Yy0xLjkzLDAgLTMuNSwtMS41NyAtMy41LC0zLjVzMS41NywtMy41IDMuNSwtMy41IDMuNSwxLjU3IDMuNSwzLjUgLTEuNTcsMy41IC0zLjUsMy41eiIKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KKzwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19za2lwX25leHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19za2lwX25leHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZjI4MTIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NraXBfbmV4dC54bWwKQEAgLTAsMCArMSw5IEBACis8dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDp3aWR0aD0iNDBkcCIKKyAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjQwZHAiCisgICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKKyAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTYsMThsOC41LC02TDYsNnYxMnpNMTYsNnYxMmgyVjZoLTJ6IgorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgorPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NraXBfcHJldmlvdXMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19za2lwX3ByZXZpb3VzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWRhMzE0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19za2lwX3ByZXZpb3VzLnhtbApAQCAtMCwwICsxLDkgQEAKKzx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOndpZHRoPSI0MGRwIgorICAgICAgICBhbmRyb2lkOmhlaWdodD0iNDBkcCIKKyAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgorICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNNiw2aDJ2MTJMNiwxOHpNOS41LDEybDguNSw2TDE4LDZ6IgorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgorPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3N1YnRpdGxlX29mZi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3N1YnRpdGxlX29mZi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBhNzI3YQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc3VidGl0bGVfb2ZmLnhtbApAQCAtMCwwICsxLDE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKKyAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKKyAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgorICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KKworICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wLDBoMjR2MjRIMFYweiIgLz4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LjUsNS41djEzaC0xNXYtMTNIMTkuNXogTTE5LDRINUMzLjg5LDQsMyw0LjksMyw2djEyYzAsMS4xLDAuODksMiwyLDJoMTRjMS4xLDAsMi0wLjksMi0yVjZDMjEsNC45LDIwLjEsNCwxOSw0TDE5LDR6IiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTEsMTFIOS41di0wLjVoLTJ2M2gyVjEzSDExdjFjMCwwLjU1LTAuNDUsMS0xLDFIN2MtMC41NSwwLTEtMC40NS0xLTF2LTRjMC0wLjU1LDAuNDUtMSwxLTFoM2MwLjU1LDAsMSwwLjQ1LDEsMVYxMXoiIC8+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOCwxMWgtMS41di0wLjVoLTJ2M2gyVjEzSDE4djFjMCwwLjU1LTAuNDUsMS0xLDFoLTNjLTAuNTUsMC0xLTAuNDUtMS0xdi00YzAtMC41NSwwLjQ1LTEsMS0xaDNjMC41NSwwLDEsMC40NSwxLDFWMTF6IiAvPgorPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zdWJ0aXRsZV9vbi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3N1YnRpdGxlX29uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzkxYzA2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zdWJ0aXRsZV9vbi54bWwKQEAgLTAsMCArMSwxMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCisgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCisgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNCIKKyAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNCI+CisKKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCAwaDI0djI0SDB6IiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTkgNEg1Yy0xLjExIDAtMiAwLjktMiAydjEyYzAgMS4xIDAuODkgMiAyIDJoMTRjMS4xIDAgMi0wLjkgMi0yVjZjMC0xLjEtMC45LTItMi0yem0tOCA3SDkuNXYtMC41aC0ydjNoMlYxM0gxMXYxYzAgMC41NS0wLjQ1IDEtMSAxSDdjLTAuNTUgMC0xLTAuNDUtMS0xdi00YzAtMC41NSAwLjQ1IC0xIDEtMWgzYzAuNTUgMCAxIDAuNDUgMSAxdjF6bTcgMGgtMS41di0wLjVoLTJ2M2gyVjEzSDE4djFjMCAwLjU1LTAuNDUgMS0xIDFoLTNjLTAuNTUgMC0xLTAuNDUtMS0xdi00YzAtMC41NSAwLjQ1IC0xIDEtMWgzYzAuNTUgMCAxIDAuNDUgMSAxdjF6IiAvPgorPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY191bm11dGUueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY191bm11dGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZmIyYjkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3VubXV0ZS54bWwKQEAgLTAsMCArMSw5IEBACis8dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKKyAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCisgICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKKyAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTMsOXY2aDRsNSw1TDEyLDRMNyw5TDMsOXpNMTYuNSwxMmMwLC0xLjc3IC0xLjAyLC0zLjI5IC0yLjUsLTQuMDN2OC4wNWMxLjQ4LC0wLjczIDIuNSwtMi4yNSAyLjUsLTQuMDJ6TTE0LDMuMjN2Mi4wNmMyLjg5LDAuODYgNSwzLjU0IDUsNi43MXMtMi4xMSw1Ljg1IC01LDYuNzF2Mi4wNmM0LjAxLC0wLjkxIDcsLTQuNDkgNywtOC43N3MtMi45OSwtNy44NiAtNywtOC43N3oiCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Cis8L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RlZF9kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RlZF9kYXJrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTBmZjEzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2RhcmsueG1sCkBAIC0wLDAgKzEsNTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGFuaW1hdGlvbi1saXN0CisgICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpvbmVzaG90PSJ0cnVlIj4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKzwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0ZWRfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2xpZ2h0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2ZjN2ZlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2xpZ2h0LnhtbApAQCAtMCwwICsxLDUxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxhbmltYXRpb24tbGlzdAorICAgICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6b25lc2hvdD0idHJ1ZSI+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorPC9hbmltYXRpb24tbGlzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RpbmdfZGFyay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2RhcmsueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YWY3YjMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2RhcmsueG1sCkBAIC0wLDAgKzEsNTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGFuaW1hdGlvbi1saXN0CisgICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpvbmVzaG90PSJmYWxzZSI+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorPC9hbmltYXRpb24tbGlzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RpbmdfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19saWdodC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNiNDE3MAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RpbmdfbGlnaHQueG1sCkBAIC0wLDAgKzEsNTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGFuaW1hdGlvbi1saXN0CisgICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpvbmVzaG90PSJmYWxzZSI+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KKzwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2RhcmsueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMWRmYWEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9kYXJrLnhtbApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0ZWRfZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrYWJsZT0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2RhcmsiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyayIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsiIC8+Cis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkM2Q4NGUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9saWdodC54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2xpZ2h0IiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2thYmxlPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RpbmdfbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodCIgLz4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX2Nsb3NlX2RhcmsueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4OGM4YzcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9kYXJrLnhtbApAQCAtMCwwICsxLDE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19kaWFsb2dfY2xvc2VfZGFyayIgLz4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9saWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9saWdodC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q1MGUwZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX2Nsb3NlX2xpZ2h0LnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtPgorICAgICAgICA8Yml0bWFwCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX2RpYWxvZ19jbG9zZV9saWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YWxwaGE9IjAuODciIC8+CisgICAgPC9pdGVtPgorCis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfbWF0ZXJpYWxfYmFja2dyb3VuZF9kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfZGFyay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJjN2VjYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfZGFyay54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIFRoaXMgaXMgdGhlIGNvcHkgb2YgQGRyYXdhYmxlL2FiY19kaWFsb2dfbWF0ZXJpYWxfYmFja2dyb3VuZF9kYXJrIGV4Y2VwdCBmb3IgaW5zZXQKKyAgICAgd2hpY2ggaW5jbHVkZXMgdW5uZWNlc3NhcnkgcGFkZGluZy4gLS0+Cis8c2hhcGUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOnNoYXBlPSJyZWN0YW5nbGUiPgorICAgIDxjb3JuZXJzIGFuZHJvaWQ6cmFkaXVzPSIyZHAiIC8+CisgICAgPHNvbGlkIGFuZHJvaWQ6Y29sb3I9IkBjb2xvci9iYWNrZ3JvdW5kX2Zsb2F0aW5nX21hdGVyaWFsX2RhcmsiIC8+Cis8L3NoYXBlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfbWF0ZXJpYWxfYmFja2dyb3VuZF9saWdodC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFiMjM1YQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfbGlnaHQueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBUaGlzIGlzIHRoZSBjb3B5IG9mIEBkcmF3YWJsZS9hYmNfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfbGlnaHQgZXhjZXB0IGZvciBpbnNldAorICAgICB3aGljaCBpbmNsdWRlcyB1bm5lY2Vzc2FyeSBwYWRkaW5nLiAtLT4KKzxzaGFwZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSI+CisgICAgPGNvcm5lcnMgYW5kcm9pZDpyYWRpdXM9IjJkcCIgLz4KKyAgICA8c29saWQgYW5kcm9pZDpjb2xvcj0iQGNvbG9yL2JhY2tncm91bmRfZmxvYXRpbmdfbWF0ZXJpYWxfbGlnaHQiIC8+Cis8L3NoYXBlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZ3JvdXBfY29sbGFwc2UueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9ncm91cF9jb2xsYXBzZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY3MmJjOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZ3JvdXBfY29sbGFwc2UueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGFuaW1hdGlvbi1saXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpvbmVzaG90PSJ0cnVlIj4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDAiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wMSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzAyIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDMiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wNCIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzA1IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDYiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wNyIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzA4IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDkiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8xMCIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzExIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMTIiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8xMyIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzE0IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMTUiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgorPC9hbmltYXRpb24tbGlzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZ3JvdXBfZXhwYW5kLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZ3JvdXBfZXhwYW5kLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjNmZGI2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9ncm91cF9leHBhbmQueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGFuaW1hdGlvbi1saXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpvbmVzaG90PSJ0cnVlIj4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzAwIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzAxIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzAyIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzAzIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzA0IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzA1IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzA2IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzA3IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzA4IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzA5IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzEwIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzExIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzEyIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzEzIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzE0IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzE1IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KKzwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BhdXNlX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9kYXJrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjIxOGE3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9kYXJrLnhtbApAQCAtMCwwICsxLDE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tZWRpYV9wYXVzZV9kYXJrIiAvPgorPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9saWdodC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkMWYwMgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfbGlnaHQueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0+CisgICAgICAgIDxiaXRtYXAKKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfbWVkaWFfcGF1c2VfbGlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmFscGhhPSIwLjg3IiAvPgorICAgIDwvaXRlbT4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BsYXlfZGFyay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BsYXlfZGFyay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ0NWEzMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGxheV9kYXJrLnhtbApAQCAtMCwwICsxLDE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tZWRpYV9wbGF5X2RhcmsiIC8+Cis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGxheV9saWdodC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFmYjdhNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGxheV9saWdodC54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbT4KKyAgICAgICAgPGJpdG1hcAorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19tZWRpYV9wbGF5X2xpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDphbHBoYT0iMC44NyIgLz4KKyAgICA8L2l0ZW0+Cis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2RhcmsueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMTA4YTkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3N0b3BfZGFyay54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbWVkaWFfc3RvcF9kYXJrIiAvPgorPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9saWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3N0b3BfbGlnaHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYzZjZTgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3N0b3BfbGlnaHQueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0+CisgICAgICAgIDxiaXRtYXAKKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfbWVkaWFfc3RvcF9saWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YWxwaGE9IjAuODciIC8+CisgICAgPC9pdGVtPgorPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19kYXJrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGY0ZmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2RhcmsueG1sCkBAIC0wLDAgKzEsMTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2F1ZGlvdHJhY2tfZGFyayIgLz4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX3ZvbF90eXBlX2F1ZGlvdHJhY2tfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2xpZ2h0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzlkYmMwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2xpZ2h0LnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtPgorICAgICAgICA8Yml0bWFwCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX2F1ZGlvdHJhY2tfbGlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmFscGhhPSIwLjg3IiAvPgorICAgIDwvaXRlbT4KKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2ludGVycG9sYXRvci9tcl9mYXN0X291dF9zbG93X2luLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvaW50ZXJwb2xhdG9yL21yX2Zhc3Rfb3V0X3Nsb3dfaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNmExNzEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2ludGVycG9sYXRvci9tcl9mYXN0X291dF9zbG93X2luLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICB+IENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAgfgorICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgfgorICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIH4KKyAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKyAgLS0+CisKKzxwYXRoSW50ZXJwb2xhdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmNvbnRyb2xYMT0iMC40IgorICAgIGFuZHJvaWQ6Y29udHJvbFkxPSIwIgorICAgIGFuZHJvaWQ6Y29udHJvbFgyPSIwLjIiCisgICAgYW5kcm9pZDpjb250cm9sWTI9IjEiLz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvaW50ZXJwb2xhdG9yL21yX2xpbmVhcl9vdXRfc2xvd19pbi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2ludGVycG9sYXRvci9tcl9saW5lYXJfb3V0X3Nsb3dfaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYmYyOTgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2ludGVycG9sYXRvci9tcl9saW5lYXJfb3V0X3Nsb3dfaW4ueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIH4gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICB+CisgIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICB+CisgIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgfgorICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorICAtLT4KKworPHBhdGhJbnRlcnBvbGF0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6Y29udHJvbFgxPSIwIgorICAgIGFuZHJvaWQ6Y29udHJvbFkxPSIwIgorICAgIGFuZHJvaWQ6Y29udHJvbFgyPSIwLjIiCisgICAgYW5kcm9pZDpjb250cm9sWTI9IjEiLz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX211c2ljLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX211c2ljLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTRkMzY1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfbXVzaWMueG1sCkBAIC0wLDAgKzEsMzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisKKyAgICA8VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwLjI1Ii8+CisKKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWxidW0iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAuNSIKKyAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImZpdENlbnRlciIKKyAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19kZWZhdWx0X2FsYnVtX2ltYWdlIiAvPgorCisgICAgPFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZHAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMC4yNSIvPgorPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3NldHRpbmdzX2xpc3RfaXRlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE1NmRjYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3NldHRpbmdzX2xpc3RfaXRlbS54bWwKQEAgLTAsMCArMSw2MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0IgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAY29sb3IvYmxhY2tfb3BhY2l0eV83MCI+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0IgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+CisKKyAgICAgICAgPEltYWdlVmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pY29uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2ljb25fc2l6ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaWNvbl9zaXplIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI4ZHAiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDxSZWxhdGl2ZUxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KKworICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbWFpbl90ZXh0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19tYWluX3RleHRfc2l6ZSIvPgorCisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdWJfdGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX3RleHRfaGVpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9tYWluX3RleHQiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGVfb3BhY2l0eV83MCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX3N1Yl90ZXh0X3NpemUiLz4KKyAgICA8L1JlbGF0aXZlTGF5b3V0PgorPC9MaW5lYXJMYXlvdXQ+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3N1Yl9zZXR0aW5nc19saXN0X2l0ZW0ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfc3ViX3NldHRpbmdzX2xpc3RfaXRlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk0N2E3MgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3N1Yl9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCkBAIC0wLDAgKzEsNTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGNvbG9yL2JsYWNrX29wYWNpdHlfNzAiPgorCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgorCisgICAgICAgIDxJbWFnZVZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2hlY2siCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaWNvbl9zaXplIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19pY29uX3NpemUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW49IjhkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19jaGVjayIvPgorICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0IgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgorCisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19tYWluX3RleHRfc2l6ZSIvPgorICAgIDwvUmVsYXRpdmVMYXlvdXQ+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3RyYW5zcG9ydF9jb250cm9scy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF90cmFuc3BvcnRfY29udHJvbHMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYTU5NTcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF90cmFuc3BvcnRfY29udHJvbHMueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IkBkaW1lbi9tY3YyX3RyYW5zcG9ydF9jb250cm9sc19wYWRkaW5nIgorICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSJAZGltZW4vbWN2Ml90cmFuc3BvcnRfY29udHJvbHNfcGFkZGluZyIKKyAgICBhbmRyb2lkOnZpc2liaWxpdHk9InZpc2libGUiPgorCisgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcHJldiIgc3R5bGU9IkBzdHlsZS9FbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlByZXZpb3VzIiAvPgorICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3JldyIgc3R5bGU9IkBzdHlsZS9FbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlJldyIgLz4KKyAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9wYXVzZSIgc3R5bGU9IkBzdHlsZS9FbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlBhdXNlIiAvPgorICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2Zmd2QiIHN0eWxlPSJAc3R5bGUvRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5GZndkIiAvPgorICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL25leHQiIHN0eWxlPSJAc3R5bGUvRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5OZXh0IiAvPgorPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9sYW5kc2NhcGVfbXVzaWMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9sYW5kc2NhcGVfbXVzaWMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZTcwNTgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX2xhbmRzY2FwZV9tdXNpYy54bWwKQEAgLTAsMCArMSw1NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0IzMDBGRjAwIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgorCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL211c2ljX2ltYWdlIgorICAgICAgICBzdHlsZT0iQHN0eWxlL0Z1bGxNdXNpY0xhbmRzY2FwZS5JbWFnZSI+CisKKyAgICAgICAgPEltYWdlVmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hbGJ1bSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbWN2Ml9mdWxsX2FsYnVtX2ltYWdlX2xhbmRzY2FwZV9zaXplIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX2FsYnVtX2ltYWdlX2xhbmRzY2FwZV9zaXplIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19kZWZhdWx0X2FsYnVtX2ltYWdlIi8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXVzaWNfdGV4dCIKKyAgICAgICAgc3R5bGU9IkBzdHlsZS9GdWxsTXVzaWNMYW5kc2NhcGUuVGV4dCI+CisKKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21jdjJfbXVzaWNfdGl0bGVfdW5rbm93bl90ZXh0IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjBzcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJib2xkIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkYiIC8+CisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hcnRpc3QiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbWN2Ml9tdXNpY19hcnRpc3RfdW5rbm93bl90ZXh0IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTZzcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjQkJCQkJCIiAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9wb3J0cmFpdF9tdXNpYy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3BvcnRyYWl0X211c2ljLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWYxYmIzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9wb3J0cmFpdF9tdXNpYy54bWwKQEAgLTAsMCArMSw1MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tdXNpY19pbWFnZSIKKyAgICAgICAgc3R5bGU9IkBzdHlsZS9GdWxsTXVzaWNQb3J0cmFpdC5JbWFnZSI+CisKKyAgICAgICAgPEltYWdlVmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hbGJ1bSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbWN2Ml9mdWxsX2FsYnVtX2ltYWdlX3BvcnRyYWl0X3NpemUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfYWxidW1faW1hZ2VfcG9ydHJhaXRfc2l6ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfZGVmYXVsdF9hbGJ1bV9pbWFnZSIvPgorICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL211c2ljX3RleHQiCisgICAgICAgIHN0eWxlPSJAc3R5bGUvRnVsbE11c2ljUG9ydHJhaXQuVGV4dCI+CisKKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2Z1bGxfYWxidW1faW1hZ2VfcG9ydHJhaXRfc2l6ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21jdjJfbXVzaWNfdGl0bGVfdW5rbm93bl90ZXh0IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjBzcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJib2xkIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkYiIC8+CisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hcnRpc3QiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZnVsbF9hbGJ1bV9pbWFnZV9wb3J0cmFpdF9zaXplIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbWN2Ml9tdXNpY19hcnRpc3RfdW5rbm93bl90ZXh0IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTZzcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjQkJCQkJCIiAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9zZXR0aW5nc19saXN0X2l0ZW0ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MmVhNWUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3NldHRpbmdzX2xpc3RfaXRlbS54bWwKQEAgLTAsMCArMSw2MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBjb2xvci9ibGFja19vcGFjaXR5XzcwIj4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2hlaWdodCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgorCisgICAgICAgIDxJbWFnZVZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaWNvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2ljb25fc2l6ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19pY29uX3NpemUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW49IjhkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIi8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2hlaWdodCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KKworICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbWFpbl90ZXh0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc190ZXh0X2hlaWdodCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IkBjb2xvci93aGl0ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfbWFpbl90ZXh0X3NpemUiLz4KKworICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3ViX3RleHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX3RleHRfaGVpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9tYWluX3RleHQiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGVfb3BhY2l0eV83MCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3Nfc3ViX3RleHRfc2l6ZSIvPgorICAgIDwvUmVsYXRpdmVMYXlvdXQ+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfc3ViX3NldHRpbmdzX2xpc3RfaXRlbS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3N1Yl9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MTI4ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3N1Yl9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCkBAIC0wLDAgKzEsNTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0IgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAY29sb3IvYmxhY2tfb3BhY2l0eV83MCI+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KKworICAgICAgICA8SW1hZ2VWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NoZWNrIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaWNvbl9zaXplIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2ljb25fc2l6ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbj0iOGRwIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX2NoZWNrIi8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2hlaWdodCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KKworICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX21haW5fdGV4dF9zaXplIi8+CisgICAgPC9SZWxhdGl2ZUxheW91dD4KKzwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTE0Nzg1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF90cmFuc3BvcnRfY29udHJvbHMueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IkBkaW1lbi9tY3YyX3RyYW5zcG9ydF9jb250cm9sc19wYWRkaW5nIgorICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSJAZGltZW4vbWN2Ml90cmFuc3BvcnRfY29udHJvbHNfcGFkZGluZyIKKyAgICBhbmRyb2lkOnZpc2liaWxpdHk9InZpc2libGUiPgorCisgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcHJldiIgc3R5bGU9IkBzdHlsZS9GdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUHJldmlvdXMiIC8+CisgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcmV3IiBzdHlsZT0iQHN0eWxlL0Z1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5SZXciIC8+CisgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcGF1c2UiIHN0eWxlPSJAc3R5bGUvRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlBhdXNlIiAvPgorICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2Zmd2QiIHN0eWxlPSJAc3R5bGUvRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLkZmd2QiIC8+CisgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvbmV4dCIgc3R5bGU9IkBzdHlsZS9GdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uTmV4dCIgLz4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbWVkaWFfY29udHJvbGxlci54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tZWRpYV9jb250cm9sbGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjU4ZjA0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbWVkaWFfY29udHJvbGxlci54bWwKQEAgLTAsMCArMSwyNjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249Imx0ciI+CisKKyAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZV9iYXIiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGxheW91dC90aXRsZV9iYXJfZ3JhZGllbnQiCisgICAgICAgIHN0eWxlPSJAc3R5bGUvVGl0bGVCYXIiPgorCisgICAgICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGVfYmFyX2xlZnQiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+CisKKyAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYmFjayIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmNsaWNrYWJsZT0idHJ1ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50U3RhcnQ9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNWRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9InZpc2libGUiCisgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UaXRsZUJhckJ1dHRvbi5CYWNrIi8+CisKKyAgICAgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGVfdGV4dCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9SaWdodE9mPSJAaWQvYmFjayIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm1heExpbmVzPSIxIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjVkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjVkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTVzcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI0ZGRkZGRkZGIi8+CisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGVfYmFyX3JpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KKworICAgICAgICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWRfZXh0ZXJuYWxfbGluayIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmNsaWNrYWJsZT0idHJ1ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNWRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTBkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiPgorCisgICAgICAgICAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWRfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNWRpcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL01lZGlhQ29udHJvbFZpZXcyX2FkX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjEwc3AiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjRkZGRkZGRkYiIC8+CisKKyAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24KKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hZF9sYXVuY2giCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UaXRsZUJhckJ1dHRvbi5MYXVuY2giIC8+CisgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgICAgICAgPHZpZXcgY2xhc3M9ImNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk1lZGlhUm91dGVCdXR0b24iCisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jYXN0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9tcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIKKyAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1RpdGxlQmFyQnV0dG9uIiAvPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2VudGVyX3ZpZXciCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbWluaW1hbF9leHRyYV92aWV3IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJyaWdodCI+CisKKyAgICAgICAgPEltYWdlQnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2Z1bGxzY3JlZW4iCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uRnVsbFNjcmVlbiIgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDxSZWxhdGl2ZUxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2N1c3RvbV9wcm9ncmVzc190aHVtYl9zaXplIj4KKworICAgICAgICA8U2Vla0JhcgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9wcm9ncmVzcyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2N1c3RvbV9wcm9ncmVzc190aHVtYl9zaXplIgorICAgICAgICAgICAgYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb249IkBzdHJpbmcvbWN2Ml9zZWVrX2Jhcl9kZXNjIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIwZHAiCisgICAgICAgICAgICBhbmRyb2lkOm1heEhlaWdodD0iQGRpbWVuL21jdjJfY3VzdG9tX3Byb2dyZXNzX21heF9zaXplIgorICAgICAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9IkBkaW1lbi9tY3YyX2N1c3RvbV9wcm9ncmVzc19tYXhfc2l6ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZWxldmF0aW9uPSIxMGRwIi8+CisKKyAgICAgICAgPFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvcHJvZ3Jlc3NfYnVmZmVyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfYnVmZmVyX3ZpZXdfaGVpZ2h0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRCb3R0b209InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBjb2xvci9ib3R0b21fYmFyX2JhY2tncm91bmQiCisgICAgICAgICAgICBhbmRyb2lkOmVsZXZhdGlvbj0iMGRwIi8+CisgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgIDxSZWxhdGl2ZUxheW91dAorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2JvdHRvbV9iYXIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNDRkcCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAY29sb3IvYm90dG9tX2Jhcl9iYWNrZ3JvdW5kIj4KKworICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2JvdHRvbV9iYXJfbGVmdCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50U3RhcnQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSI+CisKKyAgICAgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWRfc2tpcF90aW1lIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjEyc3AiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkYiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpbWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b1JpZ2h0T2Y9IkBpZC9ib3R0b21fYmFyX2xlZnQiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxMGRwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjEwZHAiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIgPgorCisgICAgICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpbWVfY3VycmVudCIKKyAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1RpbWVUZXh0LkN1cnJlbnQiLz4KKyAgICAgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGltZV9pbnRlcnB1bmN0IgorICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGltZVRleHQuSW50ZXJwdW5jdCIvPgorICAgICAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aW1lX2VuZCIKKyAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1RpbWVUZXh0LkVuZCIvPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2JvdHRvbV9iYXJfcmlnaHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudEVuZD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHQiPgorCisgICAgICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9iYXNpY19jb250cm9scyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiID4KKworICAgICAgICAgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FkX3JlbWFpbmluZyIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxMnNwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI0ZGRkZGRiIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgorCisgICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXV0ZSIKKyAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uTXV0ZSIgLz4KKyAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24KKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdWJ0aXRsZSIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImZpdENlbnRlciIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5DQyIgLz4KKyAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24KKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9mdWxsc2NyZWVuIgorICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5GdWxsU2NyZWVuIi8+CisgICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvb3ZlcmZsb3dfcmlnaHQiCisgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQm90dG9tQmFyQnV0dG9uLk92ZXJmbG93UmlnaHQiLz4KKyAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9leHRyYV9jb250cm9scyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIj4KKworICAgICAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jdXN0b21fYnV0dG9ucyIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CisKKyAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24KKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC92aWRlb19xdWFsaXR5IgorICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5WaWRlb1F1YWxpdHkiIC8+CisgICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2V0dGluZ3MiCisgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQm90dG9tQmFyQnV0dG9uLlNldHRpbmdzIiAvPgorICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL292ZXJmbG93X2xlZnQiCisgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQm90dG9tQmFyQnV0dG9uLk92ZXJmbG93TGVmdCIvPgorICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgIDwvUmVsYXRpdmVMYXlvdXQ+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21pbmltYWxfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21pbmltYWxfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDBjODBiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbWluaW1hbF90cmFuc3BvcnRfY29udHJvbHMueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KKworICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3BhdXNlIiBzdHlsZT0iQHN0eWxlL01pbmltYWxUcmFuc3BvcnRDb250cm9sc0J1dHRvbiIgLz4KKzwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2Nob29zZXJfZGlhbG9nLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2Nob29zZXJfZGlhbG9nLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTg5ZTE2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY2hvb3Nlcl9kaWFsb2cueG1sCkBAIC0wLDAgKzEsNTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9jaG9vc2VyX3RpdGxlIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyNGRwIgorICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMjRkcCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSIyNGRwIgorICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbXJfY2hvb3Nlcl90aXRsZSIKKyAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgorICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuVGl0bGUiIC8+CisgICAgPExpc3RWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY2hvb3Nlcl9saXN0IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmRpdmlkZXI9IkBhbmRyb2lkOmNvbG9yL3RyYW5zcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmRpdmlkZXJIZWlnaHQ9IjBkcCIgLz4KKyAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2VtcHR5IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjQwZHAiCisgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjkwZHAiCisgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjE2ZHAiCisgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxNmRwIgorICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21yX2Nob29zZXJfc2VhcmNoaW5nIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlNlY29uZGFyeVRleHQiIC8+CisgICAgICAgIDxQcm9ncmVzc0JhciBhbmRyb2lkOmxheW91dF93aWR0aD0iMTUwZHAiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aW5kZXRlcm1pbmF0ZT0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3Byb2dyZXNzQmFyU3R5bGVIb3Jpem9udGFsIiAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jaG9vc2VyX2xpc3RfaXRlbS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jaG9vc2VyX2xpc3RfaXRlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU4ODc5YgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2Nob29zZXJfbGlzdF9pdGVtLnhtbApAQCAtMCwwICsxLDUxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iNTZkcCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMjRkcCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjI0ZHAiCisgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIiA+CisKKyAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY2hvb3Nlcl9yb3V0ZV9pY29uIgorICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjI0ZHAiCisgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI0ZHAiCisgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMjRkcCIgLz4KKworICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjFkcCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIiA+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY2hvb3Nlcl9yb3V0ZV9uYW1lIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIzMmRwIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuUHJpbWFyeVRleHQiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY2hvb3Nlcl9yb3V0ZV9kZXNjIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyNGRwIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuU2Vjb25kYXJ5VGV4dCIgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jb250cm9sbGVyX21hdGVyaWFsX2RpYWxvZ19iLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2NvbnRyb2xsZXJfbWF0ZXJpYWxfZGlhbG9nX2IueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMDQ0NzEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jb250cm9sbGVyX21hdGVyaWFsX2RpYWxvZ19iLnhtbApAQCAtMCwwICsxLDIwNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8RnJhbWVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfZXhwYW5kYWJsZV9hcmVhIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KKyAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbXJfZGlhbG9nX2FyZWEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9jb2xvckJhY2tncm91bmRGbG9hdGluZyI+CisgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9tcl90aXRsZV9iYXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjI0ZHAiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTJkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiID4KKyAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX25hbWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjcyZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5UaXRsZSIgLz4KKyAgICAgICAgICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL21yX2Nsb3NlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI0OGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNDhkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb249IkBzdHJpbmcvbXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iP2F0dHIvbWVkaWFSb3V0ZUNsb3NlRHJhd2FibGUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSI/YW5kcm9pZDphdHRyL3NlbGVjdGFibGVJdGVtQmFja2dyb3VuZEJvcmRlcmxlc3MiIC8+CisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgICAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9tcl9jdXN0b21fY29udHJvbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgorICAgICAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9tcl9kZWZhdWx0X2NvbnRyb2wiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisgICAgICAgICAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfYXJ0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmFkanVzdFZpZXdCb3VuZHM9InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImZpdFhZIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9jb2xvclByaW1hcnkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0idG9wIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KKyAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnNwbGl0TW90aW9uRXZlbnRzPSJmYWxzZSI+CisgICAgICAgICAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL21yX21lZGlhX21haW5fY29udHJvbCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMTZkcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIxNmRwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9Ij9hdHRyL21lZGlhUm91dGVDb250cm9sUGFuZWxUaGVtZU92ZXJsYXkiPgorICAgICAgICAgICAgICAgICAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfcGxheWJhY2tfY29udHJvbCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjI0ZHAiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTJkcCIgPgorICAgICAgICAgICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvbXJfY29udHJvbF9wbGF5YmFja19jdHJsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTJkcCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21yX2NvbnRyb2xsZXJfcGxheSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvc2VsZWN0YWJsZUl0ZW1CYWNrZ3JvdW5kQm9yZGVybGVzcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY29udHJvbF90aXRsZV9jb250YWluZXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQGlkL21yX2NvbnRyb2xfcGxheWJhY2tfY3RybCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2NvbnRyb2xfdGl0bGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuUHJpbWFyeVRleHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9jb250cm9sX3N1YnRpdGxlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlNlY29uZGFyeVRleHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgICAgICAgICAgICAgICAgICA8L1JlbGF0aXZlTGF5b3V0PgorICAgICAgICAgICAgICAgICAgICA8VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2NvbnRyb2xfZGl2aWRlciIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iOGRwIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgorICAgICAgICAgICAgICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21yX3ZvbHVtZV9jb250cm9sIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iNDhkcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMjRkcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMmRwIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzcGxpdE1vdGlvbkV2ZW50cz0iZmFsc2UiPgorICAgICAgICAgICAgICAgICAgICAgICAgPEltYWdlVmlldworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyNGRwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjRkcCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iP2F0dHIvbWVkaWFSb3V0ZUF1ZGlvVHJhY2tEcmF3YWJsZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iY2VudGVyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNpbmNlIGRpYWxvZydzIHRvcCBsYXlvdXQgbXJfZXhwYW5kYWJsZV9hcmVhIGlzIGNsaWNrYWJsZSwgaXQgcHJvcGFnYXRlcyBwcmVzc2VkIHN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGl0cyBub24tY2xpY2thYmxlIGNoaWxkcmVuLiBTcGVjaWZ5IGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIiB0byBwcmV2ZW50IHZvbHVtZSBzbGlkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBoYXZpbmcgZmFsc2UgcHJlc3NlZCBzdGF0ZS4gLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfdm9sdW1lX3NsaWRlciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI0OGRwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWF4SGVpZ2h0PSI0OGRwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNsaWNrYWJsZT0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9tcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tcl9ncm91cF9leHBhbmRfY29sbGFwc2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjQ4ZHAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0OGRwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iMTJkcCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvc2VsZWN0YWJsZUl0ZW1CYWNrZ3JvdW5kQm9yZGVybGVzcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgICAgICAgICAgICAgPGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk92ZXJsYXlMaXN0VmlldworICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21yX3ZvbHVtZV9ncm91cF9saXN0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IkBkaW1lbi9tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X3BhZGRpbmdfdG9wIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjcm9sbGJhclN0eWxlPSJvdXRzaWRlT3ZlcmxheSIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjbGlwVG9QYWRkaW5nPSJmYWxzZSIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNwbGl0TW90aW9uRXZlbnRzPSJmYWxzZSIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iP2F0dHIvbWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSIgLz4KKyAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorICAgICAgICA8U2Nyb2xsVmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9idXR0b25QYW5lbCIKKyAgICAgICAgICAgIHN0eWxlPSI/YXR0ci9idXR0b25CYXJTdHlsZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZmlsbFZpZXdwb3J0PSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpzY3JvbGxJbmRpY2F0b3JzPSJ0b3B8Ym90dG9tIj4KKyAgICAgICAgICAgIDxhbmRyb2lkLnN1cHBvcnQudjcud2lkZ2V0LkJ1dHRvbkJhckxheW91dAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJib3R0b20iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249ImxvY2FsZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iNGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjEyZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjEyZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSI0ZHAiPgorICAgICAgICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvYnV0dG9uMyIKKyAgICAgICAgICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYnV0dG9uQmFyTmV1dHJhbEJ1dHRvblN0eWxlIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIvPgorICAgICAgICAgICAgICAgIDxhbmRyb2lkLnN1cHBvcnQudjQud2lkZ2V0LlNwYWNlCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3BhY2VyIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImludmlzaWJsZSIvPgorICAgICAgICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvYnV0dG9uMiIKKyAgICAgICAgICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYnV0dG9uQmFyTmVnYXRpdmVCdXR0b25TdHlsZSIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiLz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2J1dHRvbjEiCisgICAgICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2J1dHRvbkJhclBvc2l0aXZlQnV0dG9uU3R5bGUiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ii8+CisgICAgICAgICAgICA8L2FuZHJvaWQuc3VwcG9ydC52Ny53aWRnZXQuQnV0dG9uQmFyTGF5b3V0PgorICAgICAgICA8L1Njcm9sbFZpZXc+CisgICAgPC9MaW5lYXJMYXlvdXQ+Cis8L0ZyYW1lTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY29udHJvbGxlcl92b2x1bWVfaXRlbS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jb250cm9sbGVyX3ZvbHVtZV9pdGVtLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODkwNThiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY29udHJvbGxlcl92b2x1bWVfaXRlbS54bWwKQEAgLTAsMCArMSw1MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL3ZvbHVtZV9pdGVtX2NvbnRhaW5lciIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9oZWlnaHQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyNGRwIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjYwZHAiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjhkcCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIiA+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX25hbWUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuU2Vjb25kYXJ5VGV4dCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIgLz4KKyAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCI+CisgICAgICAgICAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfdm9sdW1lX2l0ZW1faWNvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faWNvbl9zaXplIgorICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faWNvbl9zaXplIgorICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjhkcCIKKyAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4ZHAiCisgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJmaXRDZW50ZXIiCisgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSI/YXR0ci9tZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIiAvPgorICAgICAgICAgICAgPGFuZHJvaWQuc3VwcG9ydC52Ny5hcHAuTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfdm9sdW1lX3NsaWRlciIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0MGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI0MGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWF4SGVpZ2h0PSI0MGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgLz4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgPC9MaW5lYXJMYXlvdXQ+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L3NldHRpbmdzX2xpc3QueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvc2V0dGluZ3NfbGlzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEzMDUzOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L3NldHRpbmdzX2xpc3QueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpc3RWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3Nfd2lkdGgiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQiCisgICAgYW5kcm9pZDpkaXZpZGVyPSJAbnVsbCIKKyAgICBhbmRyb2lkOmRpdmlkZXJIZWlnaHQ9IjBkcCI+Cis8L0xpc3RWaWV3PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L3RpdGxlX2Jhcl9ncmFkaWVudC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC90aXRsZV9iYXJfZ3JhZGllbnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMWZjNmUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC90aXRsZV9iYXJfZ3JhZGllbnQueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHNoYXBlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOnNoYXBlPSJyZWN0YW5nbGUiPgorICAgIDxncmFkaWVudAorICAgICAgICBhbmRyb2lkOnN0YXJ0Q29sb3I9IkBjb2xvci90aXRsZV9iYXJfZ3JhZGllbnRfc3RhcnQiCisgICAgICAgIGFuZHJvaWQ6ZW5kQ29sb3I9IkBjb2xvci90aXRsZV9iYXJfZ3JhZGllbnRfZW5kIgorICAgICAgICBhbmRyb2lkOmFuZ2xlPSItMjcwIiAvPgorPC9zaGFwZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hZi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWFmL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MjMwYWQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hZi9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3RlbHNlbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJUb2VzdGVsbGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0LWtub3BwaWUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJVaXRzYWFpLWtub3BwaWUuIE9udGtvcHBlbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iVWl0c2FhaS1rbm9wcGllLiBLb3BwZWwgdGFucyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJVaXRzYWFpLWtub3BwaWUuIEdla29wcGVsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlNhYWkgdWl0IG5hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iVmluZCB0YW5zIHRvZXN0ZWxsZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJPbnRrb3BwZWwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJIb3Ugb3AgdWl0c2FhaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iTWFhayB0b2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJTcGVlbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iTGFhdCB3YWciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iVm91IHVpdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iVm91IGluIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1rdW5zd2VyayI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJWb2x1bWVnbHllciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iR2VlbiBtZWRpYSBpcyBnZWtpZXMgbmllIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJHZWVuIGlubGlndGluZyBiZXNraWtiYWFyIG5pZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iU2FhaSB0YW5zIHNrZXJtIHVpdCI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYW0vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hbS9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWExOTAzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYW0vc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuGIteGIreGLk+GJtSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLhiJjhiKPhiKrhi6vhi47hib0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLhi6hDYXN0IOGKoOGLneGIq+GIrSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3Qg4Yqg4Yud4Yir4Yit4Y2iIOGMjeGKleGKmeGKkOGJtSDhibDhiYvhiK3hjKfhiI0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3Qg4Yqg4Yud4Yir4YitIOGJoOGIm+GMiOGKk+GKmOGJtSDhiIvhi60iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdCDhiqDhi53hiKvhiK3hjaIg4Ymw4YyI4YqT4Yqd4Ym34YiNIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3Qg4Yqg4Yu14Yit4YyNIOGLiOGLsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuGImOGIo+GIquGLq+GLjuGJveGKlSDhiaDhiJvhjI3hipjhibUg4YiL4YutIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuGMjeGKleGKmeGKkOGJtSDhiqDhiYvhiK3hjKUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJDYXN0IOGIm+GLteGIqOGMjSDhiqDhiYHhiJ0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuGLneGMiyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuGKoOGMq+GLjeGJtSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4YiI4Yqg4Y2N4YmzIOGKoOGJgeGInSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuGKoOGJgeGInSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuGKoOGIteGNiyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4Yiw4Yml4Yi14YmlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4Yuo4Yqg4YiN4Ymg4YidIOGIteGKkC3hjKXhiaDhiaUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4Ymw4YqV4Yi44Yir4Ymz4Ym9IOGLqOGLteGIneGNhSDhiJjhiYbhjKPhjKDhiKrhi6siPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuGIneGKleGInSDhiJvhiIXhi7DhiKjhiJjhiKjhjIMg4Yqg4YiN4Ymw4YiY4Yio4Yyg4YidIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLhiJ3hipXhiJ0g4YiY4Yio4YyDIOGKoOGLreGMiOGKneGInSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4Yib4YurIOGMiOGMveGKlSDhiaDhiJjhi43hiLDhi7Ug4YiL4YutIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hci9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWFyL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZmI5N2QKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hci9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i2KfZhNmG2LjYp9mFIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Itin2YTYo9is2YfYstipIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i2LLYsSDYp9mE2KXYsdiz2KfZhCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Itiy2LEg2KfZhNil2LHYs9in2YQuINiq2YUg2YLYt9i5INin2YTYp9iq2LXYp9mEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLYstixINin2YTYpdix2LPYp9mELiDYrNin2LHZjSDYp9mE2KfYqti12KfZhCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLYstixINin2YTYpdix2LPYp9mELiDYqtmFINin2YTYp9iq2LXYp9mEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+Itil2LHYs9in2YQg2KXZhNmJIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i2KzYp9ix2Y0g2KfZhNio2K3YqyDYudmGINij2KzZh9iy2KkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i2YLYt9i5INin2YTYp9iq2LXYp9mEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i2KXZitmC2KfZgSDYp9mE2KXYsdiz2KfZhCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i2KXYutmE2KfZgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+Itiq2LTYutmK2YQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Itil2YrZgtin2YEg2YXYpNmC2KoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLYpdmK2YLYp9mBIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i2KrZiNiz2YrYuSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i2KrYtdi62YrYsSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Iti12YjYsdipINin2YTYo9mE2KjZiNmFIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Iti02LHZiti3INiq2YXYsdmK2LEg2YXYs9iq2YjZiSDYp9mE2LXZiNiqIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLZhNmFINmK2KrZhSDYp9iu2KrZitin2LEg2KPZiiDZiNiz2KfYpti3Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLZhNinINiq2KrZiNmB2LEg2KPZiiDZhdi52YTZiNmF2KfYqiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i2KzYp9ix2Y0g2KXYsdiz2KfZhCDYp9mE2LTYp9i02KkiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWF6L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYXovc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNjNjBhYgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWF6L3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iQ2loYXpsYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJZYXnEsW0gZMO8eW3JmXNpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iWWF5xLFtIGTDvHltyZlzaS4gQmHEn2xhbnTEsSBryZlzaWxkaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iWWF5xLFtIGTDvHltyZlzaS4gUW/Fn3VsdXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iWWF5xLFtIGTDvHltyZlzaS4gUW/Fn3VsZHUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQnVyYSB5YXnEsW1sYXnEsW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJDaWhhemxhciBheHRhcsSxbMSxciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJCYcSfbGFudMSxbsSxIGvJmXNpbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IllhecSxbcSxIGRheWFuZMSxcsSxbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iUWFwYWTEsW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJPeW5hZMSxbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iRHVyZHVydW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJEYXlhbmTEsXLEsW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJHZW5pxZ9syZluZGlyaW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlnEscSfY2FtbGHFn2TEsXLEsW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJvbSBpbmPJmXPJmW7JmXRpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlPJmXMgaMmZcm1pIGRpeWlyY8mZeWkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ikhlw6cgYmlyIG1lZGlhIHNlw6dpbG3JmXlpYiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4ixo9sw6dhdGFuIG3JmWx1bWF0IHlveGR1ciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRWtyYW4geWF5xLFtbGFuxLFyIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iK3NyK0xhdG4vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iK3NyK0xhdG4vc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1YmQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWIrc3IrTGF0bi9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlVyZcSRYWppIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iRHVnbWUgUHJlYmFjaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkR1Z21lIFByZWJhY2kuIFZlemEgamUgcHJla2ludXRhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJEdWdtZSBQcmViYWNpLiBQb3ZlenVqZSBzZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJEdWdtZSBQcmViYWNpLiBQb3ZlemFuIGplIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlByZWJhY3VqIG5hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iUHJvbmFsYcW+ZW5qZSB1cmXEkWFqYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJQcmVraW5pIHZlenUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJaYXVzdGF2aSBwcmViYWNpdmFuamUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlphdHZvcmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQdXN0aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1emlyYWoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJaYXVzdGF2aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlByb8WhaXJpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTa3VwaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Ik9tb3QgYWxidW1hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IktsaXphxI0gemEgamHEjWludSB6dnVrYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmVtYSBpemFicmFuaWggbWVkaWphIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOaXN1IGRvc3R1cG5lIG5pa2FrdmUgaW5mb3JtYWNpamUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlByZWJhY3VqZSBzZSBla3JhbiI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYmUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iZS9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzM5MWMxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYmUvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCh0ZbRgdGC0Y3QvNCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCf0YDRi9C70LDQtNGLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRi9GWIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRi9GWLiDQkNC00LrQu9GO0YfQsNC90LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0YvRli4g0IbQtNC30LUg0L/QsNC00LrQu9GO0YfRjdC90L3QtSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtGL0ZYuINCf0LDQtNC60LvRjtGH0LDQvdCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCi0YDQsNC90YHQu9GW0YDQsNCy0LDRhtGMINC90LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLQn9C+0YjRg9C6INC/0YDRi9C70LDQtCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQkNC00LvRg9GH0YvRhtGMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0KHQv9GL0L3RltGG0Ywg0YLRgNCw0L3RgdC70Y/RhtGL0Y4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCX0LDQutGA0YvRhtGMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0J/RgNCw0LnQs9GA0LDRhtGMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLQn9GA0YvQv9GL0L3RltGG0YwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQodC/0YvQvdGW0YbRjCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCg0LDQt9Cz0LDRgNC90YPRhtGMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQl9Cz0LDRgNC90YPRhtGMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0JLQvtC60LvQsNC00LrQsCDQsNC70YzQsdC+0LzQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLQn9Cw0Z7Qt9GD0L3QvtC6INCz0YPRh9C90LDRgdGG0ZYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCc0LXQtNGL0Y/RhNCw0LnQuyDQvdC1INCy0YvQsdGA0LDQvdGLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQhtC90YTQsNGA0LzQsNGG0YvRjyDQsNC00YHRg9GC0L3RltGH0LDQtSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0K3QutGA0LDQvSDRgtGA0LDQvdGB0LvRj9GG0YvRliI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYmcvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iZy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjcxMmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYmcvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCh0LjRgdGC0LXQvNCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCj0YHRgtGA0L7QudGB0YLQstCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0JHRg9GC0L7QvSDQt9CwINC/0YDQtdC00LDQstCw0L3QtSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCR0YPRgtC+0L0g0LfQsCDQv9GA0LXQtNCw0LLQsNC90LUuINCS0YDRitC30LrQsNGC0LAg0LUg0L/RgNC10LrRgNCw0YLQtdC90LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCR0YPRgtC+0L0g0LfQsCDQv9GA0LXQtNCw0LLQsNC90LUuINCh0LLRitGA0LfQstCwINGB0LUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JHRg9GC0L7QvSDQt9CwINC/0YDQtdC00LDQstCw0L3QtS4g0KPRgdGC0LDQvdC+0LLQtdC90LAg0LUg0LLRgNGK0LfQutCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCf0YDQtdC00LDQstCw0L3QtSDQutGK0LwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLQotGK0YDRgdGP0YIg0YHQtSDRg9GB0YLRgNC+0LnRgdGC0LLQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQn9GA0LXQutGA0LDRgtGP0LLQsNC90LUg0L3QsCDQstGA0YrQt9C60LDRgtCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0KHQv9C40YDQsNC90LUg0L3QsCDQv9GA0LXQtNCw0LLQsNC90LXRgtC+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQl9Cw0YLQstCw0YDRj9C90LUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQn9GD0YHQutCw0L3QtSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0J/QvtGB0YLQsNCy0Y/QvdC1INC90LAg0L/QsNGD0LfQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCh0L/QuNGA0LDQvdC1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0KDQsNC30LPRitCy0LDQvdC1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQodCy0LjQstCw0L3QtSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCe0LHQu9C+0LbQutCwINC90LAg0LDQu9Cx0YPQvNCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCf0LvRitC30LPQsNGHINC30LAg0YHQuNC70LDRgtCwINC90LAg0LfQstGD0LrQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0J3Rj9C80LAg0LjQt9Cx0YDQsNC90LAg0LzRg9C70YLQuNC80LXQtNC40Y8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItCd0Y/QvNCwINC90LDQu9C40YfQvdCwINC40L3RhNC+0YDQvNCw0YbQuNGPIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQldC60YDQsNC90YrRgiDRgdC1INC/0YDQtdC00LDQstCwIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ibi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJuL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZjU5MzIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ibi9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Ka44Ka/4Ka44KeN4Kaf4KeH4KauIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuCmoeCmv+CmreCmvuCmh+CmuOCml+CngeCmsuCmvyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuCmleCmvuCmuOCnjeCmnyDgppXgprDgpr7gprAg4Kas4KeL4Kak4Ka+4KauIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4KaV4Ka+4Ka44KeN4KafIOCmleCmsOCmvuCmsCDgpqzgp4vgpqTgpr7gpq7gp7cg4Ka44KaC4Kav4KeL4KaXIOCmrOCmv+CmmuCnjeCmm+Cmv+CmqOCnjeCmqCDgprngpq/gprzgp4fgppvgp4ciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuCmleCmvuCmuOCnjeCmnyDgppXgprDgpr7gprAg4Kas4KeL4Kak4Ka+4Kau4Ke3IOCmuOCmguCmr+Cni+CmlyDgppXgprDgpr4g4Ka54Kaa4KeN4Kab4KeHIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuCmleCmvuCmuOCnjeCmnyDgppXgprDgpr7gprAg4Kas4KeL4Kak4Ka+4Kau4Ke3IOCmuOCmguCmr+CngeCmleCnjeCmpCDgprngpq/gprzgp4fgppvgp4ciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4KaP4Kak4KeHIOCmleCmvuCmuOCnjeCmnyDgppXgprDgp4HgpqgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgpqHgpr/gpq3gpr7gpofgprjgppfgp4HgprLgpr/gppXgp4cg4KaW4KeL4KaB4Kac4Ka+IOCmueCmmuCnjeCmm+CnhyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgprjgpoLgpq/gp4vgppcg4Kas4Ka/4Kaa4KeN4Kab4Ka/4Kao4KeN4KaoIOCmleCmsOCngeCmqCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuCmleCmvuCmuOCnjeCmnyDgppXgprDgpr4g4Kas4Kao4KeN4KanIOCmleCmsOCngeCmqCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4Kas4Kao4KeN4KanIOCmleCmsOCngeCmqCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCmmuCmvuCmsuCmvuCmqCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4Kas4Ka/4Kaw4Ka+4KauIOCmpuCmv+CmqCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCmpeCmvuCmruCmvuCmqCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCmrOCmoeCmvCDgppXgprDgp4HgpqgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCmuOCmmeCnjeCmleCngeCmmuCmv+CmpCDgppXgprDgp4HgpqgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgpoXgp43gpq/gpr7gprLgpqzgpr7gpq4g4Ka24KeI4Kay4Ka/Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCmreCmsuCmv+CmieCmriDgprjgp43gprLgpr7gpofgpqHgpr7gprAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuCmleCni+CmqOCniyDgpq7gpr/gpqHgpr/gpq/gprzgpr4g4Kao4Ka/4Kaw4KeN4Kas4Ka+4Kaa4KaoIOCmleCmsOCmviDgprngpq/gprzgpqjgpr8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuCmleCni+CmqOCniyDgpqTgpqXgp43gpq8g4KaJ4Kaq4Kay4Kas4KeN4KanIOCmqOCnh+CmhyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4Ka44KeN4KaV4KeN4Kaw4KeA4KaoIOCmleCmvuCmuOCnjeCmnyDgppXgprDgpr4g4Ka54Kaa4KeN4Kab4KeHIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1icy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJzL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMWM3NDIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1icy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlVyZcSRYWppIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iRHVnbWUgemEgZW1pdGlyYW5qZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkR1Z21lIHphIGVtaXRpcmFuamUuIFZlemEgamUgcHJla2ludXRhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJEdWdtZSB6YSBlbWl0aXJhbmplLiBQb3Zleml2YW5qZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJEdWdtZSB6YSBlbWl0aXJhbmplLiBQb3ZlemFubyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJFbWl0aXJhbmplIG5hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iVHJhxb5lbmplIHVyZcSRYWphIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlByZWtpbmkgdmV6dSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlphdXN0YXZpIHByZWJhY2l2YW5qZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iWmF0dm9yaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHVjaXJhaiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1emlyYWoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJaYXVzdGF2aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlByb8WhaXJpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTa3VwaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Ik9tb3QgYWxidW1hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IktsaXphxI0gemEgamHEjWludSB6dnVrYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmlqZWRhbiBtZWRpaiBuaWplIG9kYWJyYW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5lbWEgZG9zdHVwbmloIGluZm9ybWFjaWphIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQcmViYWN1amUgc2UgZWtyYW4iPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWNhL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtY2Evc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY4NWFjZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWNhL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQm90w7MgZFwnZW1ldHJlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w7MgRW1ldC4gRGVzY29ubmVjdGF0LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQm90w7MgRW1ldC4gU1wnZXN0w6AgY29ubmVjdGFudC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w7MgRW1ldC4gQ29ubmVjdGF0LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJFbWV0IGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJTXCdlc3RhbiBjZXJjYW50IGRpc3Bvc2l0aXVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2Nvbm5lY3RhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQXR1cmEgbFwnZW1pc3Npw7MiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlRhbmNhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdWVpeCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUG9zYSBlbiBwYXVzYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkF0dXJhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRGVzcGxlZ2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlJlcGxlZ2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJJbWF0Z2UgZGUgbFwnw6BsYnVtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkNvbnRyb2wgbGxpc2NhbnQgZGUgdm9sdW0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vIHNcJ2hhIHNlbGVjY2lvbmF0IGNhcCBmaXR4ZXIgbXVsdGltw6hkaWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5vIGhpIGhhIGluZm9ybWFjacOzIGRpc3BvbmlibGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVtaXNzacOzIGRlIHBhbnRhbGxhIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YTg5MjAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdMOpbSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJaYcWZw616ZW7DrSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IlRsYcSNw610a28gb2Rlc8OtbMOhbsOtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iVGxhxI3DrXRrbyBvZGVzw61sw6Fuw60uIE9kcG9qZW5vIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJUbGHEjcOtdGtvIG9kZXPDrWzDoW7DrS4gUMWZaXBvam92w6Fuw60iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iVGxhxI3DrXRrbyBvZGVzw61sw6Fuw60uIFDFmWlwb2plbm8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iT2Rlc8OtbGF0IGRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iSGxlZMOhbsOtIHphxZnDrXplbsOtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Ik9kcG9qaXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJaYXN0YXZpdCBvZGVzw61sw6Fuw60iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlphdsWZw610Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUMWZZWhyw6F0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQb3phc3Rhdml0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iWmFzdGF2aXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJSb3piYWxpdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iU2JhbGl0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iT2JhbCBhbGJhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlBvc3V2bsOtayBobGFzaXRvc3RpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOZWJ5bGEgdnlicsOhbmEgxb7DoWRuw6EgbcOpZGlhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOZWpzb3Uga8KgZGlzcG96aWNpIMW+w6FkbsOpIGluZm9ybWFjZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iT2Rlc8OtbMOhbsOtIG9ic2FodSBvYnJhem92a3kiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZGEvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU3YTc5MAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRW5oZWRlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3Qta25hcCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3Qta25hcC4gRm9yYmluZGVsc2VuIGVyIGFmYnJ1ZHQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3Qta25hcC4gT3ByZXR0ZXIgZm9yYmluZGVsc2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdC1rbmFwLiBUaWxzbHV0dGV0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3QgdGlsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iRmluZGVyIGVuaGVkZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iQWZicnlkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3RvcCBtZWQgYXQgY2FzdGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Ikx1ayI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkFmc3BpbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iU8OmdCBww6UgcGF1c2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iVWR2aWQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNranVsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1ncmFmaWsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iTHlkc3R5cmtlc2t5ZGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJJbmdlbiBtZWRpZXIgZXIgbWFya2VyZXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkRlciBlciBpbmdlbiB0aWxnw6ZuZ2VsaWdlIG9wbHlzbmluZ2VyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJTa8Omcm1lbiBjYXN0ZXMiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWRlL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZiZjU3YwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWRlL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iR2Vyw6R0ZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QtU3ltYm9sIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iU3RyZWFtaW5nLVNjaGFsdGZsw6RjaGUuIE5pY2h0IHZlcmJ1bmRlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iU3RyZWFtaW5nLVNjaGFsdGZsw6RjaGUuIFZlcmJpbmR1bmcgd2lyZCBoZXJnZXN0ZWxsdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJTdHJlYW1pbmctU2NoYWx0ZmzDpGNoZS4gVmVyYnVuZGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlN0cmVhbWVuIGF1ZiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkdlcsOkdGUgd2VyZGVuIGdlc3VjaHQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlZlcmJpbmR1bmcgdHJlbm5lbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0cmVhbWluZyBiZWVuZGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJTY2hsaWXDn2VuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iV2llZGVyZ2ViZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNpZXJlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkJlZW5kZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJNYXhpbWllcmVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJNaW5pbWllcmVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1jb3ZlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJTY2hpZWJlcmVnbGVyIGbDvHIgZGllIExhdXRzdMOkcmtlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJLZWluZSBNZWRpZW4gYXVzZ2V3w6RobHQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IktlaW5lIEluZm9ybWF0aW9uZW4gdmVyZsO8Z2JhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQmlsZHNjaGlybSB3aXJkIGdlc3RyZWFtdC4iPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgyZjY5YgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLOo8+Nz4PPhM63zrzOsSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLOo8+Fz4POus61z4XOrc+CIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4izprOv8+FzrzPgM6vIENhc3QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLOms6/z4XOvM+Azq8gzrzOtc+EzqzOtM6/z4POt8+CLiDOkc+Azr/Pg8+Fzr3OtM6tzrjOt866zrUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Is6azr/Phc68z4DOryDOvM61z4TOrM60zr/Pg863LiDOo8+Nzr3OtM61z4POtyDPg861IM61zr7Orc67zrnOvs63Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Is6azr/Phc68z4DOryDOvM61z4TOrM60zr/Pg863z4IuIM6jz4XOvc60zq3OuM63zrrOtSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLOnM61z4TOrM60zr/Pg863IM+DzrUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLOlc+Nz4HOtc+Dzrcgz4PPhc+DzrrOtc+Fz47OvSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLOkc+Azr/Pg8+Nzr3OtM61z4POtyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Is6UzrnOsc66zr/PgM6uIM68zrXPhM6szrTOv8+DzrfPgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4izprOu861zq/Pg865zrzOvyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+Is6Rzr3Osc+AzrHPgc6xzrPPic6zzq4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Is6gzrHPjc+DzrciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLOlM65zrHOus6/z4DOriI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Is6Rzr3OrM+Az4TPhc6+zrciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Is6jz43OvM+Az4TPhc6+zrciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLOlc6+z47Phs+FzrvOu86/IM6szrvOvM+Azr/Phc68Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Is6hz4XOuM68zrnPg8+EzrnOus+MIM6tzr3PhM6xz4POt8+CIM6uz4fOv8+FIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLOlM61zr0gzq3Ph86/z4XOvSDOtc+AzrnOu861zrPOtc6vIM68zq3Pg86xIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLOlM61zr0gz4XPgM6sz4HPh86/z4XOvSDOtM65zrHOuM6tz4POuc68zrXPgiDPgM67zrfPgc6/z4bOv8+Bzq/Otc+CIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLOnM61z4TOrM60zr/Pg863IM6/zrjPjM69zrfPgiI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckFVL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckFVL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkM2YyMTkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yQVUvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEZXZpY2VzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdCBidXR0b24iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0IGJ1dHRvbi4gRGlzY29ubmVjdGVkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGluZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGVkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3QgdG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJGaW5kaW5nIGRldmljZXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGlzY29ubmVjdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0b3AgY2FzdGluZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQ2xvc2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQbGF5Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3AiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJFeHBhbmQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNvbGxhcHNlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW0gYXJ0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlZvbHVtZSBzbGlkZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vIG1lZGlhIHNlbGVjdGVkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJObyBpbmZvIGF2YWlsYWJsZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQ2FzdGluZyBzY3JlZW4iPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJDQS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJDQS9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDNmMjE5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckNBL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGV2aWNlcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QgYnV0dG9uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdCBidXR0b24uIERpc2Nvbm5lY3RlZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdCBidXR0b24uIENvbm5lY3RpbmciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdCBidXR0b24uIENvbm5lY3RlZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0IHRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iRmluZGluZyBkZXZpY2VzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRpc2Nvbm5lY3QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdG9wIGNhc3RpbmciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkNsb3NlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUGxheSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXhwYW5kIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJDb2xsYXBzZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtIGFydCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJWb2x1bWUgc2xpZGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJObyBtZWRpYSBzZWxlY3RlZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTm8gaW5mbyBhdmFpbGFibGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkNhc3Rpbmcgc2NyZWVuIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yR0Ivc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yR0Ivc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQzZjIxOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJHQi9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRldmljZXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0IGJ1dHRvbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3QgYnV0dG9uLiBEaXNjb25uZWN0ZWQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3QgYnV0dG9uLiBDb25uZWN0aW5nIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3QgYnV0dG9uLiBDb25uZWN0ZWQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCB0byI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkZpbmRpbmcgZGV2aWNlcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEaXNjb25uZWN0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3RvcCBjYXN0aW5nIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJDbG9zZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlBsYXkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3RvcCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iQ29sbGFwc2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bSBhcnQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVm9sdW1lIHNsaWRlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTm8gbWVkaWEgc2VsZWN0ZWQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5vIGluZm8gYXZhaWxhYmxlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJDYXN0aW5nIHNjcmVlbiI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tcklOL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tcklOL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkM2YyMTkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1ySU4vc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEZXZpY2VzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdCBidXR0b24iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0IGJ1dHRvbi4gRGlzY29ubmVjdGVkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGluZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGVkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3QgdG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJGaW5kaW5nIGRldmljZXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGlzY29ubmVjdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0b3AgY2FzdGluZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQ2xvc2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQbGF5Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3AiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJFeHBhbmQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNvbGxhcHNlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW0gYXJ0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlZvbHVtZSBzbGlkZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vIG1lZGlhIHNlbGVjdGVkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJObyBpbmZvIGF2YWlsYWJsZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQ2FzdGluZyBzY3JlZW4iPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJYQy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJYQy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODcwMDdlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tclhDL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI/igI7igI7igI7igI7igI/igI/igI7igI7igI/igI7igI/igI7igI7igI/igI7igI7igI7igI/igI/igI/igI7igI7igI/igI7igI7igI7igI7igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI/igI/igI7igI/igI7igI/igI/igI/igI/igI7igI7igI7igI/igI5TeXN0ZW3igI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCORGV2aWNlc+KAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAj+KAj+KAjuKAj+KAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjuKAj+KAj+KAj+KAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAj+KAjkNhc3QgYnV0dG9u4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCOQ2FzdCBidXR0b24uIERpc2Nvbm5lY3RlZOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCOQ2FzdCBidXR0b24uIENvbm5lY3RpbmfigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCP4oCOQ2FzdCBidXR0b24uIENvbm5lY3RlZOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI7igI/igI/igI/igI7igI/igI/igI7igI/igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI/igI7igI/igI7igI/igI/igI7igI/igI7igI/igI/igI/igI7igI/igI/igI7igI/igI/igI/igI/igI7igI7igI/igI/igI/igI7igI7igI/igI7igI/igI/igI7igI7igI7igI/igI/igI7igI/igI/igI7igI/igI/igI7igI5DYXN0IHRv4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCORmluZGluZyBkZXZpY2Vz4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAjuKAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAjuKAjuKAj+KAjuKAjuKAjuKAj+KAjuKAj+KAj+KAjuKAjuKAjuKAj+KAjuKAj+KAjuKAjuKAj+KAj+KAjuKAjuKAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAjuKAjuKAjkRpc2Nvbm5lY3TigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI7igI/igI/igI/igI7igI/igI/igI7igI/igI/igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI/igI/igI7igI/igI/igI/igI7igI/igI7igI/igI/igI/igI7igI7igI7igI/igI7igI7igI/igI/igI/igI/igI7igI7igI7igI/igI7igI/igI/igI/igI7igI/igI/igI/igI7igI/igI7igI5TdG9wIGNhc3RpbmfigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAj+KAjuKAjuKAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAj+KAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjkNsb3Nl4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCOUGxheeKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCOUGF1c2XigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI7igI7igI/igI7igI/igI7igI7igI7igI/igI/igI7igI/igI/igI7igI7igI/igI7igI/igI/igI7igI/igI7igI7igI7igI7igI/igI7igI/igI/igI7igI/igI7igI7igI7igI7igI/igI/igI7igI/igI/igI/igI/igI7igI7igI7igI/igI/igI7igI/igI/igI/igI/igI/igI7igI/igI/igI/igI7igI7igI7igI/igI/igI5TdG9w4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCORXhwYW5k4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI/igI7igI/igI/igI/igI/igI/igI/igI7igI/igI7igI/igI7igI7igI/igI7igI7igI/igI/igI/igI/igI7igI/igI/igI7igI7igI/igI/igI7igI7igI7igI/igI/igI7igI/igI/igI7igI7igI/igI7igI7igI/igI/igI7igI/igI7igI/igI/igI/igI/igI/igI7igI7igI7igI/igI/igI/igI/igI7igI5Db2xsYXBzZeKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAjuKAj+KAjuKAj+KAjuKAj+KAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAj+KAjkFsYnVtIGFydOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI7igI/igI7igI7igI7igI7igI7igI/igI/igI7igI7igI7igI/igI/igI7igI/igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI/igI7igI7igI7igI/igI7igI/igI/igI/igI/igI7igI/igI7igI/igI7igI7igI7igI/igI/igI/igI/igI/igI7igI7igI7igI7igI/igI7igI/igI7igI/igI7igI/igI/igI7igI/igI5Wb2x1bWUgc2xpZGVy4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI/igI7igI/igI7igI/igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI/igI7igI7igI7igI/igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI7igI/igI7igI/igI/igI7igI7igI/igI7igI7igI/igI/igI/igI7igI7igI/igI7igI7igI/igI/igI7igI/igI7igI/igI/igI7igI/igI5ObyBtZWRpYSBzZWxlY3RlZOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCOTm8gaW5mbyBhdmFpbGFibGXigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAj+KAj+KAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAj+KAjkNhc3Rpbmcgc2NyZWVu4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQxZWFkMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVzLXJVUy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl2b3MiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3TDs24gcGFyYSB0cmFuc21pdGlyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w7NuIHBhcmEgdHJhbnNtaXRpciAoZGVzY29uZWN0YWRvKSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQm90w7NuIHBhcmEgdHJhbnNtaXRpciAoY29uZWN0YW5kbykiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w7NuIHBhcmEgdHJhbnNtaXRpciAoY29uZWN0YWRvKSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUcmFuc21pdGlyIGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJCdXNjYW5kbyBkaXNwb3NpdGl2b3MiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVzY29uZWN0YXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJEZXRlbmVyIGxhIHRyYW5zbWlzacOzbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQ2VycmFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdWNpciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2FyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iRGV0ZW5lciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Ik1vc3RyYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Ik9jdWx0YXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJJbWFnZW4gZGVsIMOhbGJ1bSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJDb250cm9sIGRlc2xpemFudGUgZGVsIHZvbHVtZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vIHNlIHNlbGVjY2lvbsOzIG5pbmfDum4gY29udGVuaWRvIG11bHRpbWVkaWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IlNpbiBpbmZvcm1hY2nDs24gZGlzcG9uaWJsZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iVHJhbnNtaXRpZW5kbyBwYW50YWxsYSI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjQzMDA4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGlzcG9zaXRpdm9zIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQm90w7NuIGRlIGVudmlhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOzbiBkZSBlbnZpYXIuIERlc2NvbmVjdGFkbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQm90w7NuIGRlIGVudmlhci4gQ29uZWN0YW5kbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCb3TDs24gZGUgZW52aWFyLiBDb25lY3RhZG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iRW52aWFyIGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJCdXNjYW5kbyBkaXNwb3NpdGl2b3MiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVzY29uZWN0YXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJEZXRlbmVyIGVudsOtbyBkZSBjb250ZW5pZG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkNlcnJhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHVjaXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iRGV0ZW5lciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Ik1vc3RyYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Ik9jdWx0YXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJQb3J0YWRhIGRlbCDDoWxidW0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbCBkZXNsaXphbnRlIGRlIHZvbHVtZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vIHNlIGhhIHNlbGVjY2lvbmFkbyBuaW5nw7puIG1lZGlvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJObyBoYXkgaW5mb3JtYWNpw7NuIGRpc3BvbmlibGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVudmlhbmRvIHBhbnRhbGxhIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ldC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWV0L3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MzIzNWIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ldC9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU8O8c3RlZW0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iU2VhZG1lZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IsOcbGVrYW5kZW51cHAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLDnGxla2FuZGVudXBwLiDDnGhlbmR1cyBvbiBrYXRrZXN0YXR1ZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iw5xsZWthbmRlbnVwcC4gw5xoZW5kYW1pbmUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iw5xsZWthbmRlbnVwcC4gw5xoZW5kYXR1ZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLDnGxla2FuZG1pbmUgc2VhZG1lc3NlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iU2VhZG1ldGUgb3RzaW1pbmUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iS2F0a2VzdGEgw7xoZW5kdXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJQZWF0YSDDvGxla2FuZG1pbmUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlN1bGdlbWluZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkVzaXRhbWluZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGVhdGFtaW5lIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iUGVhdGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJMYWllbmRhbWluZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iQWhlbmRhbWluZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtaSBrdWp1bmR1cyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJIZWxpdHVnZXZ1c2UgbGl1Z3VyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJNZWVkaWF0IHBvbGUgdmFsaXR1ZCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iVGVhdmUgcHV1ZHViIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJFa3JhYW5pa3V2YSDDvGxla2FuZG1pbmUiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWV1L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXUvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJhMTllNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWV1L3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkdhaWx1YWsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJJZ29ycmkgYm90b2lhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iSWdvcnR6ZWtvIGJvdG9pYS4gRGVza29uZWt0YXR1dGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Iklnb3J0emVrbyBib3RvaWEuIEtvbmVrdGF0emVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Iklnb3J0emVrbyBib3RvaWEuIEtvbmVrdGF0dXRhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+Iklnb3JyaSBob25hOiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkdhaWx1YWsgYmlsYXR6ZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVza29uZWt0YXR1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iVXR6aSBpZ29ydHplYXJpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJJdHhpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iRXJyZXByb2R1eml0dSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2F0dSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkdlbGRpdHUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJaYWJhbGR1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJUb2xlc3R1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1hcmVuIGF6YWxhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkJvbHVtZW5hcmVuIGdyYWR1YXR6YWlsZWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkV6IGRhIGhhdXRhdHUgbXVsdGltZWRpYS1lZHVraXJpayI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iRXogZGFnbyBpbmZvcm1hemlvcmlrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQYW50YWlsYSBpZ29ydHplbiI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZmEvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1mYS9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzZjNzc5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZmEvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Itiz24zYs9iq2YUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i2K/Ys9iq2q/Yp9mH4oCM2YfYpyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Itiv2qnZhdmHINin2LHYs9in2YQg2YXYrdiq2YjYpyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Itiv2qnZhdmHINmB2LHYs9iq2KfYr9mGLiDYp9ix2KrYqNin2Lcg2YLYt9i5INi02K8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Itiv2qnZhdmHINmB2LHYs9iq2KfYr9mGLiDYr9ix2K3Yp9mEINmF2LHYqtio2LfigIzYs9in2LLbjCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLYr9qp2YXZhyDZgdix2LPYqtin2K/Zhi4g2YXYsdiq2KjYtyDYtNivIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+Itin2LHYs9in2YQg2YXYrdiq2YjYpyDYqNmHIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i2b7bjNiv2Kcg2qnYsdiv2YYg2K/Ys9iq2q/Yp9mH4oCM2YfYpyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLZgti32Lkg2KfYsdiq2KjYp9i3Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i2KrZiNmC2YEg2KfYsdiz2KfZhCDZhdit2KrZiNinIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLYqNiz2KrZhiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+Itm+2K7YtCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i2YXaqdirIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i2KrZiNmC2YEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLYqNiy2LHaryDaqdix2K/ZhiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i2qnZiNqG2qkg2qnYsdiv2YYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLYudqp2LMg2LHZiNuMINis2YTYryDYotmE2KjZiNmFIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItmE2LrYstmG2K/ZhyDZhduM2LLYp9mGINi12K/YpyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i2LHYs9in2YbZhyDYp9mG2KrYrtin2Kgg2YbYtNiv2Ycg2KfYs9iqIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLYp9i32YTYp9i52KfYqiDYr9ixINiv2LPYqtix2LMg2YbbjNiz2KoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Itiv2LHYrdin2YQg2YHYsdiz2KrYp9iv2YYg2LXZgdit2YciPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZpL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZmkvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY4MzQzNQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZpL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJKw6RyamVzdGVsbcOkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkxhaXR0ZWV0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdC1wYWluaWtlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdC1wYWluaWtlLiBZaHRleXMga2F0a2Fpc3R1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0LXBhaW5pa2UuIFloZGlzdGV0w6TDpG4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdC1wYWluaWtlLiBZaGRpc3RldHR5Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlN1b3JhdG9pc3RvbiBrb2hkZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkV0c2l0w6TDpG4gbGFpdHRlaXRhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkthdGthaXNlIHlodGV5cyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkxvcGV0YSBzdW9yYXRvaXN0byI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iU3VsamUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJUb2lzdGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Iktlc2tleXTDpCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlB5c8OkeXTDpCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkxhYWplbm5hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJUaWl2aXN0w6QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bWluIGthbnNpa3V2YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLDhMOkbmVudm9pbWFra3V1ZGVuIGxpdWt1c8Okw6RkaW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkVpIHZhbGl0dHVhIG1lZGlhYS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IlRpZXRvamEgZWkgb2xlIHNhYXRhdmlsbGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlN1b3JhdG9pc3RldGFhbiBuw6R5dHTDtsOkIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1mci1yQ0Evc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1mci1yQ0Evc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRmOTg0YgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZyLXJDQS9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdMOobWUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iQXBwYXJlaWxzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQm91dG9uIERpZmZ1c2VyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm91dG9uIERpZmZ1c2VyLiBEw6ljb25uZWN0w6kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdXRvbiBEaWZmdXNlci4gQ29ubmV4aW9uIGVuIGNvdXJz4oCmIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdXRvbiBEaWZmdXNlci4gQ29ubmVjdMOpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkRpZmZ1c2VyIHN1ciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlJlY2hlcmNoZSBkXCdhcHBhcmVpbHMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iU2UgZMOpY29ubmVjdGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQXJyw6p0ZXIgbGEgZGlmZnVzaW9uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJGZXJtZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJMaXJlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJJbnRlcnJvbXByZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkFycsOqdGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRMOpdmVsb3BwZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlLDqWR1aXJlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iSW1hZ2UgZGUgbFwnYWxidW0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ3Vyc2V1ciBkZSByw6lnbGFnZSBkdSB2b2x1bWUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkF1Y3VuIG3DqWRpYSBzw6lsZWN0aW9ubsOpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJBdWN1bmUgaW5mb3JtYXRpb24gZGlzcG9uaWJsZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRGlmZnVzaW9uIGRlIGxcJ8OpY3JhbiBlbiBjb3VycyI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmMzMTJmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3TDqG1lIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkFwcGFyZWlscyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Ikljw7RuZSBDYXN0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iSWPDtG5lIENhc3QuIETDqWNvbm5lY3TDqSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iSWPDtG5lIENhc3QuIENvbm5leGlvbuKApiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJJY8O0bmUgQ2FzdC4gQ29ubmVjdMOpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3RlciBzdXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJSZWNoZXJjaGUgZFwnYXBwYXJlaWxz4oCmIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkTDqWNvbm5lY3RlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkFycsOqdGVyIGxhIGRpZmZ1c2lvbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iRmVybWVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iTGVjdHVyZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJBcnLDqnRlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkTDqXZlbG9wcGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSw6lkdWlyZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkltYWdlIGRlIGxcJ2FsYnVtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkN1cnNldXIgZGUgdm9sdW1lIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJBdWN1biBtw6lkaWEgc8OpbGVjdGlvbm7DqSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iQXVjdW5lIGluZm9ybWF0aW9uIGRpc3BvbmlibGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkRpZmZ1c2lvbiBkZSBsXCfDqWNyYW4gZW4gY291cnPigKYiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWdsL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZ2wvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIyYzM1NAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWdsL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOzbiBkZSBlbWl0aXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCb3TDs24gZGUgZW1pdGlyLiBEZXNjb25lY3RhZG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOzbiBkZSBlbWl0aXIuIENvbmVjdGFuZG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w7NuIGRlIGVtaXRpci4gQ29uZWN0YWRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkVtaXRpciBhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQnVzY2FuZG8gZGlzcG9zaXRpdm9zIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2NvbmVjdGFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iRGV0ZXIgZW1pc2nDs24iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlBlY2hhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHVjZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJEZXRlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkFtcGxpYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNvbnRyYWVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iUG9ydGFkYSBkbyDDoWxidW0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbCBkZXNwcmF6YWJsZSBkbyB2b2x1bWUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vbiBzZSBzZWxlY2Npb25hcm9uIHJlY3Vyc29zIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOb24gaGFpIGluZm9ybWFjacOzbiBkaXNwb8OxaWJsZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRW1pc2nDs24gZGUgcGFudGFsbGEiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWd1L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZ3Uvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNkNWYzZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWd1L3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgqrjgqr/gqrjgq43gqp/gqq4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4KqJ4Kqq4KqV4Kqw4Kqj4KuLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4KqV4Kq+4Kq44KuN4KqfIOCqleCqsOCriyDgqqzgqp/gqqgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgqpXgqr7gqrjgq43gqp8g4KqV4Kqw4KuLIOCqrOCqn+CqqC4g4Kqh4Kq/4Kq44KuN4KqV4Kqo4KuH4KqV4KuN4KqfIOCqleCqsOCrjeCqr+CrgeCqgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4KqV4Kq+4Kq44KuN4KqfIOCqleCqsOCriyDgqqzgqp/gqqguIOCqleCqqOCrh+CqleCrjeCqnyDgqqXgqogg4Kqw4Kq54KuN4Kqv4KuB4KqCIOCqm+CrhyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgqpXgqr7gqrjgq43gqp8g4KqV4Kqw4KuLIOCqrOCqn+CqqC4g4KqV4Kqo4KuH4KqV4KuN4KqfIOCqpeCqr+CrgeCqgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLgqobgqqjgqr4g4Kqq4KqwIOCqleCqvuCquOCrjeCqnyDgqpXgqrDgq4siPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgqongqqrgqpXgqrDgqqPgq4sg4Kq24KuL4Kqn4KuAIOCqsOCqueCrjeCqr+CqvuCqgiDgqpvgq4Dgqo8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4Kqh4Kq/4Kq44KuN4KqV4Kqo4KuH4KqV4KuN4KqfIOCqleCqsOCriyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuCqleCqvuCquOCrjeCqnyDgqpXgqrDgqrXgqr7gqqjgq4HgqoIg4Kqw4KuL4KqV4KuLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgqqzgqoLgqqcg4KqV4Kqw4KuLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4Kqa4Kqy4Kq+4Kq14KuLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgqqXgq4vgqq3gqr7gqrXgq4siPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgqrDgq4vgqpXgq4siPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgqrXgqr/gqrjgq43gqqTgq4PgqqQg4KqV4Kqw4KuLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgqrjgqoLgqpXgq4Hgqprgqr/gqqQg4KqV4Kqw4KuLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4KqG4Kqy4KuN4Kqs4KquIOCqleCqsuCqviI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgqrXgq4ngqrLgq43gqq/gq4Hgqq4g4Kq44KuN4Kqy4Kq+4KqH4Kqh4KqwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgqpXgq4vgqogg4Kqu4KuA4Kqh4Kq/4Kqv4Kq+IOCqquCquOCqguCqpiDgqpXgqrDgq4fgqrIg4Kqo4Kql4KuAIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgqpXgq4vgqogg4Kqu4Kq+4Kq54Kq/4Kqk4KuAIOCqieCqquCqsuCqrOCrjeCqpyDgqqjgqqXgq4AiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCquOCrjeCqleCrjeCqsOCrgOCqqOCqqOCrhyDgqpXgqr7gqrjgq43gqp8g4KqV4Kqw4KuAIOCqsOCqueCrjeCqr+CqvuCqgiDgqpvgq4ciPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWhpL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaGkvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU1MmE1OQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWhpL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgpLjgpL/gpLjgpY3gpJ/gpK4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4KSh4KS/4KS14KS+4KSH4KS4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4KSV4KS+4KS44KWN4KSfIOCkleCksOClh+CkgiDgpKzgpJ/gpKgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgpJXgpL7gpLjgpY3gpJ8g4KSV4KSw4KWH4KSCIOCkrOCkn+CkqC4g4KSh4KS/4KS44KSV4KSo4KWH4KSV4KWN4KSfIOCkueCliCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4KSV4KS+4KS44KWN4KSfIOCkleCksOClh+CkgiDgpKzgpJ/gpKguIOCkleCkqOClh+CkleCljeCknyDgpLngpYsg4KSw4KS54KS+IOCkueCliCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgpJXgpL7gpLjgpY3gpJ8g4KSV4KSw4KWH4KSCIOCkrOCkn+CkqC4g4KSV4KSo4KWH4KSV4KWN4KSfIOCkueCliCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLgpIfgpLgg4KSq4KSwIOCkleCkvuCkuOCljeKAjeCknyDgpJXgpLDgpYfgpIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgpKHgpL/gpLXgpL7gpIfgpLgg4KSi4KWC4KSC4KSiIOCksOCkueCkviDgpLngpYgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4KSh4KS/4KS44KSV4KSo4KWH4KSV4KWN4KSfIOCkleCksOClh+CkgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuCkleCkvuCkuOCljeCknyDgpJXgpLDgpKjgpL4g4KSs4KSC4KSmIOCkleCksOClh+CkgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4KSs4KSC4KSmIOCkleCksOClh+CkgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCkmuCksuCkvuCkj+CkgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4KSw4KWL4KSV4KWH4KSCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4KSs4KSC4KSmIOCkleCksOClh+CkgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCkteCkv+CkuOCljeCkpOCkvuCksCDgpJXgpLDgpYfgpIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCkm+Cli+Ckn+CkviDgpJXgpLDgpYfgpIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgpI/gpLLgpY3gpKzgpK4g4KSG4KSw4KWN4KSfIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCkteClieCksuCljeCkr+ClguCkriDgpLjgpY3gpLLgpL7gpIfgpKHgpLAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuCkleCli+CkiCDgpK7gpYDgpKHgpL/gpK/gpL4g4KSa4KSv4KSo4KS/4KSkIOCkqOCkueClgOCkgiDgpLngpYgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuCkleCli+CkiCDgpJzgpL7gpKjgpJXgpL7gpLDgpYAg4KSu4KWM4KSc4KWC4KSmIOCkqOCkueClgOCkgiDgpLngpYgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCkuOCljeCkleCljeCksOClgOCkqCDgpJXgpL7gpLjgpY3gpJ8g4KS54KWLIOCksOCkueClgCDgpLngpYgiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWhyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHIvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M0M2VlNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWhyL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTdXN0YXYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVXJlxJFhamkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJHdW1iIHphIGVtaXRpcmFuamUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJHdW1iIHphIGVtaXRpcmFuamUuIFZlemEgcHJla2ludXRhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJHdW1iIHphIGVtaXRpcmFuamUuIFBvdmV6aXZhbmplIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Ikd1bWIgemEgZW1pdGlyYW5qZS4gUG92ZXphbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJFbWl0aXJhbmplIG5hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iVHJhxb5lbmplIHVyZcSRYWphIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlByZWtpbmkgdmV6dSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlphdXN0YXZpIGVtaXRpcmFuamUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlphdHZhcmFuamUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZXByb2R1a2NpamEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXppcmFuamUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJaYXVzdGF2aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlByb8WhaXJpdmFuamUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNhxb5pbWFuamUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJOYXNsb3ZuaWNhIGFsYnVtYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJLbGl6YcSNIHphIGdsYXNub8SHdSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmlqZSBvZGFicmFuIG5pamVkYW4gbWVkaWoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkluZm9ybWFjaWplIG5pc3UgZG9zdHVwbmUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVtaXRpcmFuamUgemFzbG9uYSI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1odS9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzZiZGZlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHUvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlJlbmRzemVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkVzemvDtnrDtmsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLDgXRrw7xsZMOpcyBnb21iIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iw4F0a8O8bGTDqXMgZ29tYi4gS2FwY3NvbGF0IGJvbnR2YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iw4F0a8O8bGTDqXMgZ29tYi4gQ3NhdGxha296w6FzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IsOBdGvDvGxkw6lzIGdvbWIuIENzYXRsYWtvenRhdHZhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IsOBdGvDvGxkw6lzIGlkZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkVzemvDtnrDtmsga2VyZXPDqXNlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkxldsOhbGFzenTDoXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLDgXRrw7xsZMOpcyBsZcOhbGzDrXTDoXNhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJCZXrDoXLDoXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJMZWrDoXRzesOhcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iU3rDvG5ldGVsdGV0w6lzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iTGXDoWxsw610w6FzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iS2lib250w6FzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLDlnNzemVjc3Vrw6FzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iTGVtZXpib3LDrXTDsyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJIYW5nZXLFkXN6YWLDoWx5esOzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOaW5jcyBtw6lkaWEga2l2w6FsYXN6dHZhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOaW5jcyBpbmZvcm3DoWNpw7MiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkvDqXBlcm55xZF0YXJ0YWxvbSDDoXRrw7xsZMOpc2UiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWh5L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHkvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVjODJiNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWh5L3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLVgNWh1bTVodWv1aHWgNWjIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItWN1aHWgNaE1aXWgCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItWA1aXVvNWh1oDVsdWh1a/VtNWh1bYg1a/VuNWz1aHVryI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItWA1aXVvNWh1oDVsdWh1a/VtNWh1bYg1a/VuNWz1aHVrzog1Y3VodaA1oTVtiDVodW21bvVodW/1b7VodWuINWnIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLVgNWl1bzVodaA1bHVodWv1bTVodW2INWv1bjVs9Wh1a86INWN1aHWgNaE1agg1a/VodW61aHVr9aB1b7VuNaC1bQg1aciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i1YDVpdW81aHWgNWx1aHVr9W01aHVtiDVr9W41bPVodWvOiDVjdWh1oDWhNWoINWv1aHVutWh1a/WgdW+1aHVriDVpyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLUuNW21b/WgNWl1oQg1b3VodaA1oTVqCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItWN1aHWgNaE1aXWgNWrINW41oDVuNW21bjWgtW0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItSx1bbVu9Wh1b/VpdWsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i1LTVodWk1aHWgNWl1oHVttWl1awg1bDVpdW81aHWgNWx1aHVr9W41oLVtNWoIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLVk9Wh1a/VpdWsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i1YbVvtWh1aPVodaA1a/VpdWsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLUtNWh1aTVodaAIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i1LTVodWk1aHWgNWl1oHVttWl1awiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLUuNW21aTVodaA1bHVodWv1aXVrCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i1L/VuNWu1a/VpdWsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i1LHVrNWi1bjVtNWrINW31aHVutWr1a8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i1YHVodW11bbVqyDVuNaC1arVo9W21bjWgtWp1bXVodW2INWv1aHWgNWj1aHVvtW41oDVq9W5Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLVhNWl1aTVq9WhINaG1aHVtdWs1aXWgCDVudWl1bYg1ajVttW/1oDVvtWl1awiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItWP1aXVstWl1a/VuNaC1anVtdW41oLVttW21aXWgNWoINWw1aHVvdWh1bbVpdWs1asg1bnVpdW2Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLUt9Wv1oDVodW21agg1bDVpdW81aHWgNWx1aHVr9W+1bjWgtW0INWnIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pbi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWluL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMjc1MmUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pbi9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlBlcmFuZ2thdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IlRvbWJvbCBDYXN0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iVG9tYm9sIENhc3QuIFRlcnB1dHVzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJUb21ib2wgQ2FzdC4gTWVuZ2h1YnVuZ2thbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJUb21ib2wgQ2FzdC4gVGVyaHVidW5nIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlRyYW5zbWlzaWthbiBrZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Ik1lbmNhcmkgcGVyYW5na2F0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlB1dHVza2FuIHNhbWJ1bmdhbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkhlbnRpa2FuIGNhc3QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlR1dHVwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUHV0YXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkplZGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJCZXJoZW50aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Ikx1YXNrYW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNpdXRrYW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJTYW1wdWwgYWxidW0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQmlsYWggZ2VzZXIgdm9sdW1lIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJUaWRhayBhZGEgbWVkaWEgeWFuZyBkaXBpbGloIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJUaWRhayBhZGEgaW5mbyB5YW5nIHRlcnNlZGlhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJUcmFuc21pc2kgbGF5YXIiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWlzL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEzNWVhNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWlzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJLZXJmaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJUw6ZraSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IsOadHNlbmRpbmdhcmhuYXBwdXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLDmnRzZW5kaW5nYXJobmFwcHVyLiBBZnRlbmd0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLDmnRzZW5kaW5nYXJobmFwcHVyLiBUZW5naXN0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IsOadHNlbmRpbmdhcmhuYXBwdXIuIFRlbmd0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlNlbmRhIMO6dCDDrSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkxlaXRhw7AgYcOwIHTDpmtqdW0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iQWZ0ZW5namFzdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0w7bDsHZhIMO6dHNlbmRpbmd1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJMb2thIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iU3BpbGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Ikhsw6kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdMO2w7B2YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlN0w6Zra2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Ik1pbm5rYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IlBsw7Z0dXVtc2xhZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJIbGrDs8Owc3R5cmtzc2xlw7BpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJFbmdpbm4gbWnDsGlsbCB2YWxpbm4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkVuZ2FyIHVwcGzDvXNpbmdhciDDrSBib8OwaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iU2tqw6FyIHNlbmR1ciDDunQiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXQvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE2ZTNhYwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iUHVsc2FudGUgVHJhc21ldHRpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iUHVsc2FudGUgVHJhc21ldHRpLiBEaXNjb25uZXNzbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iUHVsc2FudGUgVHJhc21ldHRpLiBDb25uZXNzaW9uZSBpbiBjb3JzbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJQdWxzYW50ZSBUcmFzbWV0dGkuIENvbm5lc3NvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlRyYXNtZXR0aSBhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iUmljZXJjYSBkaSBkaXNwb3NpdGl2aSBpbiBjb3JzbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJTY29sbGVnYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkludGVycm9tcGkgdHJhc21pc3Npb25lIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJDaGl1ZGkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSaXByb2R1Y2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iSW50ZXJyb21waSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkVzcGFuZGkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNvbXByaW1pIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQ29wZXJ0aW5hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkRpc3Bvc2l0aXZvIGRpIHNjb3JyaW1lbnRvIGRlbCB2b2x1bWUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lc3N1biBjb250ZW51dG8gbXVsdGltZWRpYWxlIHNlbGV6aW9uYXRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOZXNzdW5hIGluZm9ybWF6aW9uZSBkaXNwb25pYmlsZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iVHJhc21pc3Npb25lIGRlbGxvIHNjaGVybW8gaW4gY29yc28iPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWl3L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXcvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyYjBjZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWl3L3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLXntei16jXm9eqIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Itee15vXqdeZ16jXmdedIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4oCP15zXl9em158g15TXpNei15zXqiBDYXN0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4oCP15zXl9em158g15TXpNei15zXqiBDYXN0LiDXnteg15XXqtenIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLigI/XnNeX16bXnyDXlNek16LXnNeqIENhc3QuINee16rXl9eR16giPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4oCP15zXl9em158g15TXpNei15zXqiBDYXN0LiDXnteX15XXkdeoIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IteU16LXkdeo15Qg15DXnCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Itee15fXpNepINee15vXqdeZ16jXmdedIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Iteg16rXpyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IteU16TXodenINeQ16og15TXlNei15HXqNeUIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLXodeS15XXqCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IteU16TXotecIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLXlNep15TXlCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IteU16TXodenIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i15TXqNeX15EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Iteb15XXldelIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i16LXmNeZ16TXqiDXkNec15HXldedIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Itee15fXldeV158g16LXldem157XlCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i15zXkCDXoNeR15fXqNeUINee15PXmdeUIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLXkNeZ158g157XmdeT16Ig15bXnteZ158iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IteU16LXkdeo16og157XodeaINee16rXkdem16LXqiI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTQ5NzI3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuOCt+OCueODhuODoCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLnq6/mnKsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLjgq3jg6Pjgrnjg4jjgqLjgqTjgrPjg7MiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLjgq3jg6Pjgrnjg4gg44Ki44Kk44Kz44Oz44CC5o6l57aa6Kej6Zmk5riI44G/Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLjgq3jg6Pjgrnjg4gg44Ki44Kk44Kz44Oz44CC5o6l57aa5LitIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuOCreODo+OCueODiCDjgqLjgqTjgrPjg7PjgILmjqXntprmuIjjgb8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i44Kt44Oj44K544OI44GZ44KL44OH44OQ44Kk44K5Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i56uv5pyr44KS5qSc57Si44GX44Gm44GE44G+44GZIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuaOpee2muOCkuino+mZpCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuOCreODo+OCueODiOOCkuWBnOatoiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i6ZaJ44GY44KLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i5YaN55SfIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLkuIDmmYLlgZzmraIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLlgZzmraIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLlsZXplosiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuaKmOOCiuOBn+OBn+OCgCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuOCouODq+ODkOODoOOCouODvOODiCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLpn7Pph4/jgrnjg6njgqTjg4Djg7wiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuODoeODh+OCo+OCouOBjOmBuOaKnuOBleOCjOOBpuOBhOOBvuOBm+OCkyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i5oOF5aCx44GM44GC44KK44G+44Gb44KTIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLnlLvpnaLjgpLjgq3jg6Pjgrnjg4jjgZfjgabjgYTjgb7jgZkiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWthL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta2Evc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RhMDgxYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWthL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLhg6Hhg5jhg6Hhg6Lhg5Thg5vhg5AiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4YOb4YOd4YOs4YOn4YOd4YOR4YOY4YOa4YOd4YOR4YOU4YOR4YOYIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4YOi4YOg4YOQ4YOc4YOh4YOa4YOY4YOg4YOU4YOR4YOY4YOhIOGDpuGDmOGDmuGDkOGDmeGDmCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuGDouGDoOGDkOGDnOGDoeGDmuGDmOGDoOGDlOGDkeGDmOGDoSDhg6bhg5jhg5rhg5Dhg5nhg5guIOGDkuGDkOGDl+GDmOGDqOGDo+GDmuGDmCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4YOi4YOg4YOQ4YOc4YOh4YOa4YOY4YOg4YOU4YOR4YOY4YOhIOGDpuGDmOGDmuGDkOGDmeGDmC4g4YOb4YOY4YOb4YOT4YOY4YOc4YOQ4YOg4YOU4YOd4YOR4YOhIOGDk+GDkOGDmeGDkOGDleGDqOGDmOGDoOGDlOGDkeGDkCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLhg6Lhg6Dhg5Dhg5zhg6Hhg5rhg5jhg6Dhg5Thg5Hhg5jhg6Eg4YOm4YOY4YOa4YOQ4YOZ4YOYLiDhg5Phg5Dhg5nhg5Dhg5Xhg6jhg5jhg6Dhg5Thg5Hhg6Phg5rhg5giPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4YOi4YOg4YOQ4YOc4YOh4YOa4YOY4YOg4YOU4YOR4YOQOiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuGDm+GDneGDrOGDp+GDneGDkeGDmOGDmuGDneGDkeGDlOGDkeGDmOGDoSDhg5vhg53hg6vhg5jhg5Thg5Hhg5AuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4YOZ4YOQ4YOV4YOo4YOY4YOg4YOY4YOhIOGDkuGDkOGDrOGDp+GDleGDlOGDouGDkCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuGDouGDoOGDkOGDnOGDoeGDmuGDmOGDoOGDlOGDkeGDmOGDoSDhg6jhg5Thg6zhg6fhg5Xhg5Thg6Lhg5AiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuGDk+GDkOGDruGDo+GDoOGDleGDkCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuGDk+GDkOGDmeGDleGDoOGDkCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4YOe4YOQ4YOj4YOW4YOQIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4YOo4YOU4YOs4YOn4YOV4YOU4YOi4YOQIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4YOS4YOQ4YOo4YOa4YOQIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLhg6nhg5Dhg5nhg5Thg6rhg5Xhg5AiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLhg5Dhg5rhg5Hhg53hg5vhg5jhg6Eg4YOS4YOQ4YOg4YOU4YOZ4YOQ4YOc4YOYIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuGDruGDm+GDmOGDoSDhg6Hhg5rhg5Dhg5jhg5Phg5Thg6Dhg5giPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuGDm+GDlOGDk+GDmOGDkCDhg5Dhg6Dhg6nhg5Thg6Phg5rhg5gg4YOQ4YOgIOGDkOGDoOGDmOGDoSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4YOY4YOc4YOk4YOd4YOg4YOb4YOQ4YOq4YOY4YOQIOGDkOGDoCDhg5Dhg6Dhg5jhg6Eg4YOu4YOU4YOa4YOb4YOY4YOh4YOQ4YOs4YOV4YOT4YOd4YOb4YOYIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLhg5vhg5jhg5vhg5Phg5jhg5zhg5Dhg6Dhg5Thg53hg5Hhg6Eg4YOU4YOZ4YOg4YOQ4YOc4YOY4YOhIOGDkuGDkOGDk+GDkOGDquGDlOGDm+GDkCI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta2svc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ray9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGRjYmIzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta2svc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCW0q/QudC1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItKa0rHRgNGL0LvSk9GL0LvQsNGAIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0KLRgNCw0L3RgdC70Y/RhtC40Y/Qu9Cw0YMg0YLSr9C50LzQtdGB0ZYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJcItCi0YDQsNC90YHQu9GP0YbQuNGP0LvQsNGDXCIg0YLSr9C50LzQtdGB0ZYuINCQ0LbRi9GA0LDRgtGD0LvRiyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iXCLQotGA0LDQvdGB0LvRj9GG0LjRj9C70LDRg1wiINGC0q/QudC80LXRgdGWLiDSmtC+0YHRi9C70YPQtNCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Ilwi0KLRgNCw0L3RgdC70Y/RhtC40Y/Qu9Cw0YNcIiDRgtKv0LnQvNC10YHRli4g0prQvtGB0YvQu9C00YsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0JrQtdC70LXRgdGW0LPQtSDRgtGA0LDQvdGB0LvRj9GG0LjRj9C70LDRgyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItKa0rHRgNGL0LvSk9GL0LvQsNGA0LTRiyDRgtCw0LHRgyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQkNC20YvRgNCw0YLRgyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCi0YDQsNC90YHQu9GP0YbQuNGP0LvQsNGD0LTRiyDRgtC+0pvRgtCw0YLRgyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JbQsNCx0YMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQntC50L3QsNGC0YMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCa0ZbQtNGW0YDRgtGDIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i0KLQvtKb0YLQsNGC0YMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQltCw0Y4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCW0LjRjiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCQ0LvRjNCx0L7QvCDRiNC10LHQtdGA0ZYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0JTRi9Cx0YvRgSDQtNC10qPQs9C10LnRltC90ZbSoyDQttKv0LPRltGA0YLQutGW0YHRliI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0JXRiNCx0ZbRgCDRgtCw0YHRg9GI0Ysg0YLQsNKj0LTQsNC70LzQsNKT0LDQvSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0prQvtC7INC20LXRgtGW0LzQtNGWINCw0pvQv9Cw0YDQsNGCINC20L7SmyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0K3QutGA0LDQvdC00Ysg0YLRgNCw0L3RgdC70Y/RhtC40Y/Qu9Cw0YMiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWttL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta20vc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ0NzgwZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWttL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLhnpThn5Lhnprhnpbhn5DhnpPhn5LhnpIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4Z6n4Z6U4Z6A4Z6a4Z6O4Z+NIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4Z6U4Z+K4Z684Z6P4Z674Z6E4Z6B4Z624Z6fIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4Z6B4Z624Z6f4Z6U4Z+K4Z684Z6P4Z674Z6E4Z+WIOGelOGetuGek+GegOGetuGej+Gfi+GeleGfkuGej+GetuGeheGfiyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4Z6B4Z624Z6f4Z6U4Z+K4Z684Z6P4Z674Z6E4Z+WIOGegOGfhuGeluGeu+GehOGel+GfkuGeh+GetuGelOGfiyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLhnoHhnrbhnp/hnpThn4rhnrzhno/hnrvhnoThn5Yg4Z6U4Z624Z6T4Z6X4Z+S4Z6H4Z624Z6U4Z+L4Z6g4Z6+4Z6ZIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuGelOGeieGfkuGeh+GevOGek+GekeGfhSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuGegOGfhuGeluGeu+GehOGen+GfkuGenOGfguGehOGemuGegOGep+GelOGegOGemuGejuGfjSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLhnpXhn5LhnorhnrbhnoXhn4siPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLhnojhnpThn4vhnpfhn5LhnofhnrbhnpThn4siPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuGelOGet+GekSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuGeheGetuGegOGfiyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4Z6V4Z+S4Z6i4Z624Z6AIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Z6I4Z6U4Z+LIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4Z6W4Z6E4Z+S4Z6a4Z644Z6AIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLhnpThnoThn5Lhnprhnr3hnpgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLhnp/hn5LhnpPhnrbhnorhn4Phnp/hnrfhnpvhn5LhnpThn4jhnqLhnrbhnpvhn4vhnpThn4rhnrvhnpgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4Z6a4Z6U4Z624Z6a4Z6A4Z6Y4Z+S4Z6a4Z634Z6P4Z6f4Z+G4Z6h4Z+B4Z6EIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLhnoLhn5LhnpjhnrbhnpPhnoDhnrbhnprhnofhn5Lhnprhnr7hnp/hnpjhn4Hhnozhn4DhnpHhn4EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuGemOGet+Gek+GemOGetuGek+GeluGfkOGej+GfjOGemOGetuGek+GekeGfgSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4Z6A4Z+G4Z6W4Z674Z6E4Z6B4Z624Z6f4Z6i4Z+B4Z6A4Z+S4Z6a4Z6E4Z+LIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rbi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtuL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMzdmZGQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rbi9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4LK44LK/4LK44LON4LKf4LKCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuCyuOCyvuCyp+CyqOCyl+Cys+CzgSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuCyrOCyv+CypOCzjeCypOCysOCyv+CyuOCzgSDgsqzgsp/gsqjgs43igIwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgs4Eg4LKs4LKf4LKo4LON4oCMLiDgsrjgsoLgsqrgsrDgs43gspUg4LKV4LKh4LK/4LKk4LKX4LOK4LKz4LK/4LK44LKy4LK+4LKX4LK/4LKm4LOGIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgs4Eg4LKs4LKf4LKo4LON4oCMLiDgsrjgsoLgsqrgsrDgs43gspXgsr/gsrjgsrLgsr7gspfgs4HgsqTgs43gsqTgsr/gsqbgs4YiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4LKs4LK/4LKk4LON4LKk4LKw4LK/4LK44LOBIOCyrOCyn+CyqOCzjeKAjC4g4LK44LKC4LKq4LKw4LON4LKV4LK/4LKk4LKX4LOK4LKC4LKh4LK/4LKm4LOGIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCyh+CypuCyleCzjeCyleCzhiDgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgsr8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgsrjgsr7gsqfgsqjgspfgsrPgsqjgs43gsqjgs4Eg4LK54LOB4LKh4LOB4LKV4LKy4LK+4LKX4LOB4LKk4LON4LKk4LK/4LKm4LOGIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCyuOCyguCyquCysOCzjeCylSDgspXgsqHgsr/gsqTgspfgs4rgsrPgsr/gsrjgs4EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgs4HgsrXgsr/gspXgs4Yg4LKo4LK/4LKy4LON4LKy4LK/4LK44LK/Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgsq7gs4Hgsprgs43gsprgs4EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgsqrgs43gsrLgs4cg4LKu4LK+4LKh4LK/Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgsrXgsr/gsrDgsr7gsq4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgsqjgsr/gsrLgs43gsrLgsr/gsrjgsr8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgsrXgsr/gsrjgs43gsqTgsrDgsr/gsrjgs4EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCyuOCyguCyleCzgeCymuCyv+CyuOCzgSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCyhuCysuCzjeCyrOCyruCzjSDgspXgsrLgs4YiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4LK14LK+4LKy4LON4LKv4LOC4LKu4LONIOCyuOCzjeCysuCziOCyoeCysOCzjSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4LKv4LK+4LK14LOB4LKm4LOHIOCyruCyvuCyp+CzjeCyr+CyriDgsobgsq/gs43gspXgs4bgsq7gsr7gsqHgsrLgsr7gspfgsr/gsrLgs43gsrIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuCyr+CyvuCyteCzgeCypuCzhyDgsq7gsr7gsrngsr/gsqTgsr8g4LKy4LKt4LON4LKv4LK14LK/4LKy4LON4LKyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgsqrgsrDgsqbgs4bgsq/gsqjgs43gsqjgs4Eg4LKs4LK/4LKk4LON4LKk4LKw4LK/4LK44LKy4LK+4LKX4LOB4LKk4LON4LKk4LK/4LKm4LOGIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlODkzYTkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i7Iuc7Iqk7YWcIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Iuq4sOq4sCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuyghOyGoSDrsoTtirwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLsoITshqEg67KE7Yq8LiDsl7DqsrAg7ZW07KCc65CoIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLsoITshqEg67KE7Yq8LiDsl7DqsrAg7KSRIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuyghOyGoSDrsoTtirwuIOyXsOqysOuQqCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLsoITshqHtlaAg6riw6riwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i6riw6riw66W8IOywvuuKlCDspJEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i7Jew6rKwIO2VtOygnCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuyghOyGoSDspJHsp4AiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuuLq+q4sCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuyerOyDnSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i7J287Iuc7KSR7KeAIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i7KSR7KeAIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i7Y687LmY6riwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLsoJHquLAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLslajrspTslYTtirgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i67O866WoIOyKrOudvOydtOuNlCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i7ISg7YOd7ZWcIOuvuOuUlOyWtCDsl4bsnYwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuygleuztOqwgCDsl4bsirXri4jri6QuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLtmZTrqbQg7KCE7IahIOykkSI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta3kvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1reS9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzgxM2FmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta3kvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCi0YPRgtGD0LwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0KLSr9C30LzTqdC60YLTqdGAIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0KLRi9GI0LrRiyDRjdC60YDQsNC90LPQsCDRh9GL0LPQsNGA0YPRgyDQsdCw0YHQutGL0YfRiyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCi0YvRiNC60Ysg0Y3QutGA0LDQvdCz0LAg0YfRi9Cz0LDRgNGD0YMg0LHQsNGB0LrRi9GH0YsuINCi0q/Qt9C806nQuiDQsNC20YvRgNCw0L8g0YLRg9GA0LDRgi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCi0YvRiNC60Ysg0Y3QutGA0LDQvdCz0LAg0YfRi9Cz0LDRgNGD0YMg0LHQsNGB0LrRi9GH0YsuINCi0q/Qt9C806nQuiDRgtGD0YLQsNGI0YPRg9C00LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0KLRi9GI0LrRiyDRjdC60YDQsNC90LPQsCDRh9GL0LPQsNGA0YPRgyDQsdCw0YHQutGL0YfRiy4g0KLSr9C30LzTqdC6INGC0YPRgtCw0YjRi9C/INGC0YPRgNCw0YIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0KLTqdC806nQvdC60q/Qs9OpINGH0YvQs9Cw0YDRg9GDIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0KLSr9C30LzTqdC60YLTqdGAINC40LfQtNC10LvSr9Kv0LTTqSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQkNC20YvRgNCw0YLRg9GDIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0KLRi9GI0Log0Y3QutGA0LDQvdCz0LAg0YfRi9Cz0LDRgNC90YMg0YLQvtC60YLQvtGC0YPRgyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JbQsNCx0YPRgyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItCe0LnQvdC+0YLRg9GDIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLQotGL0L3QtNGL0YDRg9GDIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i0KLQvtC60YLQvtGC0YPRgyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCW0LDQudGL0L8g0LrTqdGA0YHTqdGC0q/SryI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0JbRi9C50YvRiNGC0YvRgNGD0YMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQkNC70YzQsdC+0Lwg0LzRg9C60LDQsdCw0YHRiyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLSrtC90LTSryDQutCw0YLRg9GD0LvQsNGC0YPRg9GH0YMg0YHRi9C00YvRgNC80LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCR0LjRgCDQtNCwINC80LXQtNC40LAg0YTQsNC50Lsg0YLQsNC90LTQsNC70LPQsNC9INC20L7QuiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0K3RhyDQvNCw0LDQu9GL0LzQsNGCINC20L7QuiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0KLRi9GI0LrRiyDRjdC60YDQsNC90LPQsCDRh9GL0LPQsNGA0YvQu9GD0YPQtNCwIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sYW5kL2RpbWVucy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sYW5kL2RpbWVucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlmMWUxZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWxhbmQvZGltZW5zLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPCEtLSBNZWRpYVJvdXRlQ29udHJvbGxlcidzIHZvbHVtZSBncm91cCBsaXN0IC0tPgorICAgIDxlYXQtY29tbWVudCAvPgorICAgIDwhLS0gTWF4aW11bSBoZWlnaHQgb2Ygdm9sdW1lIGdyb3VwIGxpc3QuIC0tPgorICAgIDxkaW1lbiBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X21heF9oZWlnaHQiPjEzMmRwPC9kaW1lbj4KKyAgICA8IS0tIEhlaWdodCBvZiB2b2x1bWUgZ3JvdXAgaXRlbS4gLS0+CisgICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9oZWlnaHQiPjYxZHA8L2RpbWVuPgorICAgIDwhLS0gU2l6ZSBvZiBhbiBpdGVtJ3MgaWNvbi4gLS0+CisgICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9pY29uX3NpemUiPjE4ZHA8L2RpbWVuPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sby9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWxvL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNzM3ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sby9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Lql4Lqw4Lqa4Lq74LqaIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuC6reC6uOC6m+C6sOC6geC6reC6mSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuC6m+C6uOC7iOC6oeKAi+C6hOC6suKAi+C6quKAi+C6l+C7jCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuC6m+C6uOC7iOC6oeC6quC6u+C7iOC6h+C6quC6seC6meC6jeC6suC6mS4g4LqV4Lqx4LqU4LqB4Lqy4LqZ4LuA4LqK4Lq34LuI4Lqt4Lqh4LqV4LuN4LuI4LuB4Lql4LuJ4LqnIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgupvgurjgu4jguqHguqrgurvgu4jguofguqrgurHgupnguo3gurLgupkuIOC6geC6s+C6peC6seC6h+C7gOC6iuC6t+C7iOC6reC6oeC6leC7jeC7iCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgupvgurjgu4jguqHguqrgurvgu4jguofguqrgurHgupnguo3gurLgupkuIOC7gOC6iuC6t+C7iOC6reC6oeC6leC7jeC7iOC7geC6peC7ieC6pyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLguqrgurvgu4jguofguqrgurHgupnguo3gurLgupnguqvgurIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLguoHgurPguqXgurHguofigIvguorguq3guoHigIvguqvgurLigIvguq3gurjigIvgupvgurDigIvguoHguq3gupkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4LqV4Lqx4LqU4LqB4Lqy4LqZ4LuA4LqK4Lq34LuI4Lqt4Lqh4LqV4LuN4LuIIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4Lqi4Lq44LqU4LqB4Lqy4LqZ4Lqq4Lq74LuI4LqH4Lqq4Lqx4LqZ4LqN4Lqy4LqZIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgupvgurTgupQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLguqvgurzgurTgu4ngupkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuC6ouC6uOC6lOC6iuC6u+C7iOC6p+C6hOC6suC6pyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuC6ouC6uOC6lCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuC6guC6sOC6q+C6jeC6suC6jSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4Lqr4LqN4LuN4LuJ4Lql4Lq74LqHIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4Luc4LuJ4Lqy4Lqb4Lq74LqB4Lqt4Lqw4Lql4Lqw4Lqa4LuN4LuJ4LqyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuC6leC6u+C6p+C6m+C6seC6muC6peC6sOC6lOC6seC6muC6quC6veC6hyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4Lqa4LuN4LuI4oCL4LuE4LqU4LuJ4oCL4LuA4Lql4Lq34Lqt4LqB4oCL4Lqh4Lq14oCL4LuA4LqU4LqN4oCL4LuD4LqU4oCL4LuE4Lqn4LuJIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLguprgu43gu4jigIvguqHgurXigIvguoLgu43gu4nigIvguqHgurngupkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuC6geC6suC6meC6quC6u+C7iOC6h+C6nuC6suC6muC7nOC7ieC6suC6iOC7jSI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbHQvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sdC9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjAzNmQxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbHQvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4ixK5yZW5naW5pYWkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJQZXJkYXZpbW8gbXlndHVrYXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJQZXJkYXZpbW8gbXlndHVrYXMuIEF0c2lqdW5ndGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlBlcmRhdmltbyBteWd0dWthcy4gUHJpc2lqdW5naWFtYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJQZXJkYXZpbW8gbXlndHVrYXMuIFByaXNpanVuZ3RhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlBlcmR1b3RpIMSvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iUmFuZGFtaSDEr3JlbmdpbmlhaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJBdGp1bmd0aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN1c3RhYmR5dGkgcGVyZGF2aW3EhSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iVcW+ZGFyeXRpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iTGVpc3RpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQcmlzdGFiZHl0aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN1c3RhYmR5dGkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJJxaFza2xlaXN0aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iU3V0cmF1a3RpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1vIHZpcsWhZWxpcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJHYXJzdW1vIMWhbGlhdcW+aWtsaXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lcGFzaXJpbmt0YSBqb2tpYSBtZWRpamEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkluZm9ybWFjaWphIG5lcGFzaWVraWFtYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUGVyZHVvZGFtYXMgZWtyYW5hcyI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbHYvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sdi9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTQwNjNlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbHYvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3TEk21hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkllcsSrY2VzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQXByYWlkZXMgcG9nYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkFwcmFpZGVzIHBvZ2EuIFNhdmllbm9qdW1zIHDEgXJ0cmF1a3RzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJBcHJhaWRlcyBwb2dhLiBOb3RpZWsgc2F2aWVub2p1bWEgaXp2ZWlkZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJBcHJhaWRlcyBwb2dhLiBTYXZpZW5vanVtcyBpenZlaWRvdHMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQXByYWlkxKvFoWFuYSB1eiBpZXLEq2NpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTm90aWVrIGllcsSrxI11IG1la2zEk8WhYW5hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkF0dmllbm90Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQXB0dXLEk3QgYXByYWlkaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQWl6dsSTcnQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJBdHNrYcWGb3QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkFwdHVyxJN0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iQXB0dXLEk3QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJJenbEk3JzdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iU2FrxLxhdXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bWEgdsSBY2nFhsWhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlNrYcS8dW1hIHNsxKtkbmlzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOYXYgYXRsYXPEq3RpIG11bHRpdmlkZXMgZmFpbGkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5hdiBwaWVlamFtYSBpbmZvcm3EgWNpamEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Ik5vdGllayBla3LEgW5hIGFwcmFpZGUiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1rL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbWsvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJkZWUzNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1rL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodC40YHRgtC10LwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0KPRgNC10LTQuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCa0L7Qv9GH0LXRgtC+INC30LAgQ2FzdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCa0L7Qv9GH0LUg0LfQsCBDYXN0LiDQmNGB0LrQu9GD0YfQtdC90L4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCa0L7Qv9GH0LUg0LfQsCBDYXN0LiDQodC1INC/0L7QstGA0LfRg9Cy0LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JrQvtC/0YfQtSDQt9CwIENhc3QuINCf0L7QstGA0LfQsNC90L4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0JXQvNC40YLRg9Cy0LDRmCDQvdCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0KHQtSDQsdCw0YDQsNCw0YIg0YPRgNC10LTQuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQmNGB0LrQu9GD0YfQuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCh0L7Qv9GA0Lgg0LPQviDQtdC80LjRgtGD0LLQsNGa0LXRgtC+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQl9Cw0YLQstC+0YDQuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItCg0LXQv9GA0L7QtNGD0YbQuNGA0LDRmCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0J/QsNGD0LfQuNGA0LDRmCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCh0L7Qv9GA0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQn9GA0L7RiNC40YDQuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0KHQvtCx0LXRgNC4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0JrQvtGA0LjRhtCwINC90LAg0LDQu9Cx0YPQvCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLQm9C40LfQs9Cw0Ycg0LfQsCDRmNCw0YfQuNC90LAg0L3QsCDQt9Cy0YPQuiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0J3QtSDRgdC1INC40LfQsdGA0LDQvdC4INC80LXQtNC40YPQvNC4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQndC10LzQsCDQtNC+0YHRgtCw0L/QvdC4INC40L3RhNC+0YDQvNCw0YbQuNC4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQldC60YDQsNC90L7RgiDRgdC1INC10LzQuNGC0YPQstCwIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1sL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOTE0YjkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbC9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4LS44LS/4LS44LWN4LSx4LWN4LSx4LSCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuC0ieC0quC0leC0sOC0o+C0meC1jeC0meC1viI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuC0n+C0vuC0quC1jeC0quC1geC0muC1huC0r+C1jeC0r+C1geC0lSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuC0leC0vuC0uOC1jeC0seC1jeC0seC1jSDgtKzgtJ/gtY3gtJ/gtbouIOC0teC0v+C0muC1jeC0m+C1h+C0puC0v+C0muC1jeC0muC1gSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4LSV4LS+4LS44LWN4LSx4LWN4LSx4LWNIOC0rOC0n+C1jeC0n+C1ui4g4LSV4LSj4LSV4LWN4oCM4LSx4LWN4LSx4LWB4LSa4LWG4LSv4LWN4LSv4LWB4LSo4LWN4LSo4LWBIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuC0leC0vuC0uOC1jeC0seC1jeC0seC1jSDgtKzgtJ/gtY3gtJ/gtbouIOC0leC0o+C0leC1jeC0seC1jeC0seC1geC0muC1huC0r+C1jeC0pOC1gSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLgtIfgtKTgtL/gtLLgtYfgtJXgtY3gtJXgtY0g4LSV4LS+4LS44LWN4LSx4LWN4LSx4LWB4LSa4LWG4LSv4LWN4LSv4LWB4LSVIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4LSJ4LSq4LSV4LSw4LSj4LSZ4LWN4LSZ4LW+IOC0leC0o+C1jeC0n+C1huC0pOC1jeC0pOC1geC0qOC1jeC0qOC1gSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgtLXgtL/gtJrgtY3gtJvgtYfgtKbgtL/gtJXgtY3gtJXgtYHgtJUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgtJXgtL7gtLjgtY3gtLHgtY3gtLHgtYHgtJrgtYbgtK/gtY3gtK/gtb0g4LSo4LS/4LW84LSk4LWN4LSk4LWB4LSVIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgtIXgtLXgtLjgtL7gtKjgtL/gtKrgtY3gtKrgtL/gtJXgtY3gtJXgtYHgtJUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgtKrgtY3gtLLgtYcg4LSa4LWG4LSv4LWN4LSv4LWB4LSVIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgtKTgtb3gtJXgtY3gtJXgtL7gtLLgtIIg4LSo4LS/4LW84LSk4LWN4LSk4LWCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4LSo4LS/4LSw4LWN4oCN4LSk4LWN4LSk4LWB4LSVIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4LS14LS/4LSV4LS44LS/4LSq4LWN4LSq4LS/4LSV4LWN4LSV4LWB4LSVIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgtJrgtYHgtLDgtYHgtJXgtY3gtJXgtYHgtJUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgtIbgtb3gtKzgtIIg4LSG4LW84LSf4LWN4LSf4LWNIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuC0teC1i+C0s+C0v+C0r+C0giDgtLjgtY3gtLLgtYjgtKHgtbwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuC0ruC1gOC0oeC0v+C0r+C0r+C1iuC0qOC1jeC0qOC1geC0giDgtKTgtL/gtLDgtJ7gtY3gtJ7gtYbgtJ/gtYHgtKTgtY3gtKTgtL/gtJ/gtY3gtJ/gtL/gtLLgtY3gtLIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuC0teC0v+C0teC0sOC0meC1jeC0meC0s+C1iuC0qOC1jeC0qOC1geC0giDgtLLgtK3gtY3gtK/gtK7gtLLgtY3gtLIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuC0uOC1jeKAjOC0leC1jeC0sOC1gOC1uyDgtJXgtL7gtLjgtY3gtLHgtY3gtLHgtYHgtJrgtYbgtK/gtY3gtK/gtYHgtKjgtY3gtKjgtYEiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1uL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbW4vc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY4N2M5MgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1uL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodC40YHRgtC10LwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0KLTqdGF06nTqdGA06nQvNC20q/Sr9C0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0JTQsNC80LbRg9GD0LvQsNGFINGC0L7QstGH0LvRg9GD0YAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQlNCw0LzQttGD0YPQu9Cw0YUg0YLQvtCy0YfQu9GD0YPRgC4g0KHQsNC70YHQsNC9Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQlNCw0LzQttGD0YPQu9Cw0YUg0YLQvtCy0YfQu9GD0YPRgC4g0KXQvtC70LHQvtC2INCx0LDQudC90LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JTQsNC80LbRg9GD0LvQsNGFINGC0L7QstGH0LvRg9GD0YAuINCl0L7Qu9Cx0L7Qs9C00YHQvtC9Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCU0LDQvNC20YPRg9C70LDRhSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItCi06nRhdOp06nRgNOp0LzQtiDRhdCw0LnQtiDQsdCw0LnQvdCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItCh0LDQu9Cz0LDRhSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCU0LDQvNC20YPRg9C70LDRhdGL0LMg0LfQvtCz0YHQvtC+0YUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCl0LDQsNGFIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0KLQvtCz0LvRg9GD0LvQsNGFIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLQotKv0YAg0LfQvtCz0YHQvtC+0YUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQl9C+0LPRgdC+0L7RhSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCU0Y3Qu9Cz0Y3RhSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0KXRg9GA0LDQsNGFIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0KbQvtC80LPQuNC50L0g0LfRg9GA0LDQsyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLQlNGD0YPQvdGLINGC0q/QstGI0LjQvSDRgtCw0LDRgNGD0YPQu9Cw0LPRhyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0K/QvNCw0YAg0Ycg0LzQtdC00LjQsCDRgdC+0L3Qs9C+0L7Qs9Kv0LkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItCc0Y3QtNGN0Y3Qu9GN0Lsg0LHQsNC50YXQs9Kv0Lkg0LHQsNC50L3QsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0JTRjdC70LPRjdGG0LjQudCzINC00LDQvNC20YPRg9C70LYg0LHQsNC50L3QsCI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tci9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmZiZWJiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXIvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCkuOCkv+CkuOCljeCkn+CkriI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgpKHgpL/gpLXgpY3gpLngpL7gpIfgpLjgpYfgpLgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgpJXgpL7gpLjgpY3gpJ8g4KSs4KSf4KSjIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4KSV4KS+4KS44KWN4KSfIOCkrOCkn+Ckoy4g4KSh4KS/4KS44KWN4KSV4KSo4KWH4KSV4KWN4KSfIOCkleClh+CksuClhyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4KSV4KS+4KS44KWN4KSfIOCkrOCkn+Ckoy4g4KSV4KSo4KWH4KSV4KWN4KSfIOCkleCksOCkpCDgpIbgpLngpYciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4KSV4KS+4KS44KWN4KSfIOCkrOCkn+Ckoy4g4KSV4KSo4KWH4KSV4KWN4KSfIOCkleClh+CksuClhyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLgpK/gpL7gpLXgpLAg4KSV4KS+4KS44KWN4KSfIOCkleCksOCkviI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCkoeCkv+CkteCljeCkueCkvuCkh+CkuOClh+CkuCDgpLbgpYvgpKfgpKQg4KSG4KS54KWHIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCkoeCkv+CkuOCljeKAjeCkleCkqOClh+CkleCljeKAjeCknyDgpJXgpLDgpL4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgpJXgpL7gpLjgpY3gpJ8g4KSV4KSw4KSj4KWHIOCkpeCkvuCkguCkrOCkteCkviI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4KSs4KSC4KSmIOCkleCksOCkviI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCkquCljeCksuClhyDgpJXgpLDgpL4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCkteCkv+CksOCkvuCkriI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCkpeCkvuCkguCkrOCkviI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCkteCkv+CkuOCljeCkpOClg+CkpCDgpJXgpLDgpL4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCkuOCkguCkleClgeCkmuCkv+CkpCDgpJXgpLDgpL4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgpIXgpLLgpY3gpKzgpK4g4KSV4KSy4KS+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCkteCljeCkueClieCksuCljeCkr+ClguCkriDgpLjgpY3gpLLgpL7gpK/gpKHgpLAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuCkruClgOCkoeCkv+Ckr+CkviDgpKjgpL/gpLXgpKHgpLLgpL4g4KSo4KS+4KS54KWAIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgpJXgpYvgpKPgpKTgpYDgpLngpYAg4KSu4KS+4KS54KS/4KSk4KWAIOCkieCkquCksuCkrOCljeCkpyDgpKjgpL7gpLngpYAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCkuOCljeCkleCljeCksOClgOCkqCDgpJXgpL7gpLjgpY3igI3gpJ8g4KSV4KSw4KSkIOCkhuCkueClhyI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODVlNDgwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJQZXJhbnRpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQnV0YW5nIEhhbnRhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJ1dGFuZyBoYW50YXIuIFNhbWJ1bmdhbiBkaXB1dHVza2FuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCdXRhbmcgaGFudGFyLiBNZW55YW1idW5nIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJ1dGFuZyBoYW50YXIuIERpc2FtYnVuZ2thbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJIYW50YXIga2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJNZW5jYXJpIHBlcmFudGkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iUHV0dXNrYW4gc2FtYnVuZ2FuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQmVyaGVudGkgbWVuZ2hhbnRhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iVHV0dXAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJNYWluIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJKZWRhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iQmVyaGVudGkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJLZW1iYW5na2FuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSdW50dWhrYW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJTZW5pIGFsYnVtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlBlbHVuY3VyIGtlbGFudGFuZ2FuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJUaWFkYSBtZWRpYSBkaXBpbGloIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJNYWtsdW1hdCB0aWRhayB0ZXJzZWRpYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iTWVuZ2hhbnRhciBza3JpbiI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXkvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1teS9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODNkODA1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXkvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuGAheGAlOGAheGAuiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLhgIXhgIDhgLrhgJXhgIXhgLnhgIXhgIrhgLrhgLjhgJnhgLvhgKzhgLgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLhgIDhgKzhgIXhgLrhgJDhgLrhgJzhgK/hgJXhgLrhgJvhgJThgLog4YCB4YCc4YCv4YCQ4YC6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4YCA4YCs4YCF4YC64YCB4YCc4YCv4YCQ4YC64YGLIOGAgeGAu+GAreGAkOGAuuGAhuGAgOGAuuGAmeGAkeGArOGAuOGAleGAqyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4YCA4YCs4YCF4YC64YCB4YCc4YCv4YCQ4YC64YGLIOGAgeGAu+GAreGAkOGAuuGAhuGAgOGAuuGAlOGAseGAnuGAiuGAuiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLhgIDhgKzhgIXhgLrhgIHhgJzhgK/hgJDhgLrhgYsg4YCB4YC74YCt4YCQ4YC64YCG4YCA4YC64YCR4YCs4YC44YCe4YCK4YC6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuGAgOGArOGAheGAuuGAnOGAr+GAleGAuuGAm+GAlOGAuiDhgIXhgIDhgLoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLhgIXhgIDhgLrhgJXhgIXhgLnhgIXhgIrhgLrhgLjhgJnhgLvhgKzhgLgg4YCb4YC+4YCs4YCW4YC94YCx4YCB4YC84YCE4YC64YC4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuGAhuGAgOGAuuGAnuGAveGAmuGAuuGAmeGAvuGAryDhgJbhgLzhgJDhgLrhgJvhgJThgLoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLhgIDhgKzhgIXhgLrhgJzhgK/hgJXhgLrhgIHhgLzhgIThgLrhgLgg4YCb4YCV4YC64YCb4YCU4YC6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLhgJXhgK3hgJDhgLrhgJvhgJThgLoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLhgJbhgL3hgIThgLfhgLrhgJvhgJThgLoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuGAgeGAj+GAm+GAleGAuuGAm+GAlOGAuiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuGAm+GAleGAuuGAm+GAlOGAuiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuGAluGAvOGAlOGAt+GAuuGAgeGAu+GAm+GAlOGAuuGBgyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4YCB4YCx4YCr4YCA4YC64YCe4YCt4YCZ4YC64YC44YCb4YCU4YC6Li4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4YCh4YCa4YC64YCc4YC64YCY4YCZ4YC64YCV4YCv4YC2Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuGAoeGAnuGAtuGAoeGAkOGAreGAr+GAuOGAoeGAgOGAu+GAmuGAuuGAgeGAu+GAreGAlOGAuuGAnuGAiuGAt+GAuiDhgIbhgJzhgK3hgK/hgIDhgLrhgJLhgKsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuGAmeGAiuGAuuGAnuGAiuGAt+GAuuGAmeGAruGAkuGAruGAmeGAviDhgJnhgJvhgL3hgLHhgLjhgIHhgLvhgJrhgLrhgJHhgKzhgLjhgJXhgKsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuGAoeGAgeGAu+GAgOGAuuGAoeGAnOGAgOGAuiDhgJnhgJvhgJvhgL7hgK3hgJThgK3hgK/hgIThgLrhgJXhgKsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuGAkOGAiuGAuuGAuOGAluGAvOGAkOGAuuGAm+GAseGAuCDhgJnhgLvhgIDhgLrhgJThgL7hgKzhgJXhgLzhgIThgLoiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY3NjRjOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRW5oZXRlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QtaWtvbmV0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdC1rbmFwcGVuLiBGcmFrb2JsZXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3Qta25hcHBlbi4gS29ibGVyIHRpbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0LWtuYXBwZW4uIFRpbGtvYmxldCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0IHRpbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlPDuGtlciBldHRlciBlbmhldGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IktvYmxlIGZyYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0b3BwIGNhc3RpbmdlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iTHVrayI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlNwaWxsIGF2Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJTZXR0IHDDpSBwYXVzZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3BwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iVXR2aWQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNranVsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1ncmFmaWtrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkdsaWRlYnJ5dGVyIGZvciB2b2x1bSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iRHUgaGFyIGlra2UgdmFsZ3Qgbm9lbiBtZWRpZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkluZ2VuIGluZm9ybWFzam9uIGVyIHRpbGdqZW5nZWxpZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQ2FzdGVyIHNramVybWVuIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1uZS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5lL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YzJlMWEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1uZS9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4KSq4KWN4KSw4KSj4KS+4KSy4KWAIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuCkieCkquCkleCksOCko+CkueCksOClgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3Qg4KSs4KSf4KSoIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdCDgpKzgpJ/gpKjgpaQg4KSc4KSh4KS+4KSoIOCkteCkv+CkmuCljeCkm+Clh+CkpiDgpK3gpK/gpYsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3Qg4KSs4KSf4KSo4KWkIOCknOCkoeCkvuCkqCDgpLngpYHgpIHgpKbgpYgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdCDgpKzgpJ/gpKjgpaQg4KSc4KSh4KS+4KSoIOCkreCkr+CliyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLgpK/gpLjgpK7gpL4gQ2FzdCDgpJfgpLDgpY3gpKjgpYHgpLngpYvgpLjgpY0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgpK/gpKjgpY3gpKTgpY3gpLDgpLngpLDgpYIg4KSq4KSk4KWN4KSk4KS+IOCksuCkl+CkvuCkieCkgeCkpuCliCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgpLXgpL/gpJrgpY3gpJvgpYfgpKYg4KSX4KSw4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iY2FzdGluZyDgpLDgpYvgpJXgpY3gpKjgpYHgpLngpYvgpLjgpY0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCkrOCkqOCljeCkpiDgpJfgpLDgpY3gpKjgpYHgpLngpYvgpLjgpY0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgpKzgpJzgpL7gpIngpKjgpYHgpLngpYvgpLjgpY0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCksOCli+CkleCljeCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCksOCli+CkleCljeCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCkteCkv+CkuOCljeCkpOCkvuCksCDgpJfgpLDgpY3gpKjgpYHgpLngpYvgpLjgpY0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCkuOCkguCkleCljeCkt+Ckv+CkquCljeCkpCDgpKrgpL7gpLDgpY3gpKjgpYHgpLngpYvgpLjgpY0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgpI/gpLLgpY3gpKzgpK4g4KSG4KSw4KWN4KSfIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCkreCli+CksuCljeCkr+ClgeCkruCkleCliyDgpLjgpY3gpLLgpL7gpIfgpKHgpLAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuCkleClgeCkqOCliCDgpK7gpL/gpKHgpL/gpK/gpL4g4KSa4KSv4KSoIOCkreCkj+CkleCliyDgpJvgpYjgpKgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuCknOCkvuCkqOCkleCkvuCksOClgCDgpIngpKrgpLLgpKzgpY3gpKcg4KSb4KWI4KSoIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgpLjgpY3gpJXgpY3gpLDgpL/gpKggY2FzdCDgpJfgpLDgpY3gpKbgpYgiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbmwvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVkZjYyZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZWVtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkFwcGFyYXRlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QtaWNvb24iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0LWljb29uLiBWZXJiaW5kaW5nIHZlcmJyb2tlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdC1pY29vbi4gVmVyYmluZGluZyBtYWtlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0LWljb29uLiBWZXJib25kZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdGVuIG5hYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJBcHBhcmF0ZW4gem9la2VuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Ikxvc2tvcHBlbGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQ2FzdGVuIHN0b3BwZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlNsdWl0ZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJBZnNwZWxlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iT25kZXJicmVrZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wcGVuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iVWl0dm91d2VuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTYW1lbnZvdXdlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtaG9lcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJWb2x1bWVzY2h1aWZyZWdlbGFhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iR2VlbiBtZWRpYSBnZXNlbGVjdGVlcmQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkdlZW4gaW5mb3JtYXRpZSBiZXNjaGlrYmFhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iU2NoZXJtIGNhc3RlbiI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcGEvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wYS9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjVkZjcxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcGEvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCouOCov+CouOCon+CoriI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgqKHgqL/gqLXgqL7gqIjgqLjgqL7gqIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgqJXgqL7gqLjgqJ8g4Kis4Kif4KioIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4KiV4Ki+4Ki44KifIOCorOCon+CoqOClpCDgqKHgqL/gqLjgqJXgqKjgqYjgqJXgqJ8g4KiV4KmA4Kik4Ki+IOCol+Cov+CohiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4KiV4Ki+4Ki44KifIOCorOCon+CoqOClpCDgqJXgqKjgqYjgqJXgqJ8g4KiV4KmA4Kik4Ki+IOConOCoviDgqLDgqL/gqLngqL4g4Ki54KmIIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuColeCovuCouOConyDgqKzgqJ/gqKjgpaQg4KiV4Kio4KmI4KiV4KifIOColeCpgOCopOCoviDgqJfgqL/gqIYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4KiP4Kil4KmHIOColeCovuCouOConyDgqJXgqLDgqYsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgqKHgqYDgqLXgqL7gqIjgqLjgqL7gqIIg4Kio4KmC4KmwIOCosuCpseCoreCov+CohiDgqJzgqL4g4Kiw4Ki/4Ki54Ki+IOCoueCpiCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgqKHgqL/gqLjgqJXgqKjgqYjgqJXgqJ8g4KiV4Kiw4KmLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4KiV4Ki+4Ki44KifIOColeCosOCoqOCoviDgqKzgqbDgqKYg4KiV4Kiw4KmLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgqKzgqbDgqKYg4KiV4Kiw4KmLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4Kiq4Kiy4KmHIOColeCosOCpiyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4Kiw4KmL4KiV4KmLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Kis4Kmw4KimIOColeCosOCpiyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCoteCov+CouOCopOCovuCosCDgqJXgqLDgqYsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCorOCpsOCopiDgqJXgqLDgqYsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgqJDgqLLgqKzgqK4g4KiG4Kiw4KifIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCoteCpjOCosuCor+CpguCoriDgqLjgqLLgqL7gqIjgqKHgqLAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuColeCpi+CoiCDgqLXgqYAg4Kiu4KmA4Kih4KmA4KiGIOCoqOCoueCpgOCogiDgqJrgqYHgqKPgqL/gqIYg4KiX4Ki/4KiGIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgqJXgqYvgqIgg4Kic4Ki+4Kij4KiV4Ki+4Kiw4KmAIOCoieCoquCosuCorOCopyDgqKjgqLngqYDgqIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCouOColeCpjeCosOCpgOCoqCDgqJzgqYvgqZwg4Kiw4Ki/4Ki54Ki+IOCoueCpiCI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzkyYTZkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJVcnrEhWR6ZW5pYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IlByenljaXNrIENhc3QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJQcnp5Y2lzayBQcnplxZtsaWogZWtyYW4uIFJvesWCxIVjem9ubyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iUHJ6eWNpc2sgUHJ6ZcWbbGlqIGVrcmFuLiDFgcSFY3rEmSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJQcnp5Y2lzayBQcnplxZtsaWogZWtyYW4uIFBvxYLEhWN6b25vIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlByemVzecWCYWogbmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJabmFqZG93YW5pZSB1cnrEhWR6ZcWEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Ik9kxYLEhWN6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWmF0cnp5bWFqIHByemVzecWCYW5pZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iWmFta25paiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+Ik9kdHfDs3J6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJXc3RyenltYWoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJaYXRyenltYWoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJSb3p3acWEIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJad2nFhCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Ik9rxYJhZGthIGFsYnVtdSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJTdXdhayBnxYJvxZtub8WbY2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5pZSB3eWJyYW5vIG11bHRpbWVkacOzdyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iQnJhayBpbmZvcm1hY2ppIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQcnplc3nFgmFtIGVrcmFuIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wdC1yQlIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wdC1yQlIvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNjNjE5ZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0LXJCUi9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl2b3MiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3TDo28gVHJhbnNtaXRpciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOjbyBcIlRyYW5zbWl0aXJcIi4gRGVzY29uZWN0YWRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3TDo28gXCJUcmFuc21pdGlyXCIuIENvbmVjdGFuZG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w6NvIFwiVHJhbnNtaXRpclwiLiBDb25lY3RhZG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhbnNtaXRpciBwYXJhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTG9jYWxpemFuZG8gZGlzcG9zaXRpdm9zIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2NvbmVjdGFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iSW50ZXJyb21wZXIgdHJhbnNtaXNzw6NvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJGZWNoYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZXByb2R1emlyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJQYXJhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZGlyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSZWNvbGhlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFydGUgZG8gw6FsYnVtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkNvbnRyb2xlIGRlc2xpemFudGUgZGUgdm9sdW1lIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOZW5odW1hIG3DrWRpYSBzZWxlY2lvbmFkYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmVuaHVtYSBpbmZvcm1hw6fDo28gZGlzcG9uw612ZWwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlRyYW5zbWl0aW5kbyBhIHRlbGEiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjBhNjFkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQtclBUL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOjbyBUcmFuc21pdGlyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w6NvIFRyYW5zbWl0aXIuIERlc2xpZ2FkbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQm90w6NvIFRyYW5zbWl0aXIuIEEgbGlnYXIuLi4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w6NvIFRyYW5zbWl0aXIuIExpZ2FkbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUcmFuc21pdGlyIHBhcmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJBIGxvY2FsaXphciBkaXNwb3NpdGl2b3MiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVzYXNzb2NpYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJQYXJhciBhIHRyYW5zbWlzc8OjbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iRmVjaGFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdXppciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iSW50ZXJyb21wZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJQYXJhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZGlyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSZWR1emlyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iSW1hZ2VtIGRvIMOhbGJ1bSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJDb250cm9sbyBkZSBkZXNsaXplIGRvIHZvbHVtZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmVuaHVtIHN1cG9ydGUgbXVsdGltw6lkaWEgc2VsZWNpb25hZG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5lbmh1bWEgaW5mb3JtYcOnw6NvIGRpc3BvbsOtdmVsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJBIHRyYW5zbWl0aXIgbyBlY3LDoyI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wdC9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2M2MTlkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGlzcG9zaXRpdm9zIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQm90w6NvIFRyYW5zbWl0aXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCb3TDo28gXCJUcmFuc21pdGlyXCIuIERlc2NvbmVjdGFkbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQm90w6NvIFwiVHJhbnNtaXRpclwiLiBDb25lY3RhbmRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdMOjbyBcIlRyYW5zbWl0aXJcIi4gQ29uZWN0YWRvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlRyYW5zbWl0aXIgcGFyYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkxvY2FsaXphbmRvIGRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZXNjb25lY3RhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkludGVycm9tcGVyIHRyYW5zbWlzc8OjbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iRmVjaGFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdXppciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2FyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iUGFyYXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJFeHBhbmRpciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUmVjb2xoZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBcnRlIGRvIMOhbGJ1bSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJDb250cm9sZSBkZXNsaXphbnRlIGRlIHZvbHVtZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmVuaHVtYSBtw61kaWEgc2VsZWNpb25hZGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5lbmh1bWEgaW5mb3JtYcOnw6NvIGRpc3BvbsOtdmVsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJUcmFuc21pdGluZG8gYSB0ZWxhIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1yby9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXJvL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYmIyZjYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1yby9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bveml0aXZlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQnV0b251bCBkZSBwcm9pZWPIm2llIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQnV0b251bCBkZSBwcm9pZWPIm2llLiBEZWNvbmVjdGF0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCdXRvbnVsIGRlIHByb2llY8ibaWUuIFNlIGNvbmVjdGVhesSDIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJ1dG9udWwgZGUgcHJvaWVjyJtpZS4gQ29uZWN0YXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iUHJvaWVjdGHIm2kgcGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJTZSBjYXV0xIMgZGlzcG96aXRpdmUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVjb25lY3RhyJtpLXbEgyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Ik51IG1haSBwcm9pZWN0YcibaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iw45uY2hpZGXIm2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZWRhyJtpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLDjm50cmVydXBlyJtpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iT3ByacibaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4dGluZGXIm2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlJlc3Ryw6JuZ2XIm2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJHcmFmaWNhIGFsYnVtdWx1aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJHbGlzb3IgcGVudHJ1IHZvbHVtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOaWNpdW4gZmnImWllciBtZWRpYSBzZWxlY3RhdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTnUgc3VudCBkaXNwb25pYmlsZSBpbmZvcm1hyJtpaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iU2UgcHJvaWVjdGVhesSDIGVjcmFudWwiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXJ1L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M0NjJkMgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXJ1L3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodC40YHRgtC10LzQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQo9GB0YLRgNC+0LnRgdGC0LLQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0LjQuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0LjQuC4g0KPRgdGC0YDQvtC50YHRgtCy0L4g0L7RgtC60LvRjtGH0LXQvdC+LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbQuNC4LiDQo9GB0YLRgNC+0LnRgdGC0LLQviDQv9C+0LTQutC70Y7Rh9Cw0LXRgtGB0Y8uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0LjQuC4g0KPRgdGC0YDQvtC50YHRgtCy0L4g0L/QvtC00LrQu9GO0YfQtdC90L4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCS0YvQsdC10YDQuNGC0LUg0YPRgdGC0YDQvtC50YHRgtCy0L4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLQn9C+0LjRgdC6INGD0YHRgtGA0L7QudGB0YLQsuKApiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQntGC0LrQu9GO0YfQuNGC0YwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQn9GA0LXQutGA0LDRgtC40YLRjCDRgtGA0LDQvdGB0LvRj9GG0LjRjiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JfQsNC60YDRi9GC0YwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQktC+0YHQv9GA0L7QuNC30LLQtdGB0YLQuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0J/RgNC40L7RgdGC0LDQvdC+0LLQuNGC0YwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQntGB0YLQsNC90L7QstC40YLRjCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCg0LDQt9Cy0LXRgNC90YPRgtGMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQodCy0LXRgNC90YPRgtGMIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0J7QsdC70L7QttC60LAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0KDQtdCz0YPQu9GP0YLQvtGAINCz0YDQvtC80LrQvtGB0YLQuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0JzQtdC00LjQsNGE0LDQudC7INC90LUg0LLRi9Cx0YDQsNC9Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQlNCw0L3QvdGL0YUg0L3QtdGCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQn9C+0LTQutC70Y7Rh9C10L3QuNC1INC6INGD0LTQsNC70LXQvdC90L7QvNGDINC80L7QvdC40YLQvtGA0YMiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNpL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2kvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU1Y2U1MAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNpL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgtrTgtq/gt4rgtrDgtq3gt5LgtroiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4LaL4La04LeP4LaC4LacIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4LeA4LeS4Laa4LeP4LeBIOC2tuC3nOC2reC3iuC2reC2uCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuC3gOC3kuC2muC3j+C3gSDgtrbgt5zgtq3gt4rgtq3gtrguIOC3gOC3kuC3g+C2seC3iuC2sOC3kiDgtprgtrvgtrEg4La94Lav4LeTIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgt4Dgt5Lgtprgt4/gt4Eg4La24Lec4Lat4LeK4Lat4La4IOC3g+C2uOC3iuC2tuC2seC3iuC2sCDgtprgtrvgtrjgt5LgtrHgt4oiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4LeA4LeS4Laa4LeP4LeBIOC2tuC3nOC2reC3iuC2reC2uCDgt4Pgtrjgt4rgtrbgtrHgt4rgtrAg4Laa4La74LaxIOC2veC2r+C3kyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLgt4Dgt5Lgtprgt4/gt4HgtroiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgtovgtrTgt4/gtoLgtpwg4LeD4LeZ4LeA4LeT4La4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuC3gOC3kuC3g+C2seC3iuC2sOC3kiDgtprgtrvgtrHgt4rgtrEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgt4Dgt5Lgtprgt4/gt4Eg4Laa4LeS4La74LeT4La4IOC2seC2reC2uyDgtprgtrvgtrHgt4rgtrEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuC3gOC3g+C2seC3iuC2sSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuC2sOC3j+C3gOC2seC2uiDgtprgtrvgtrHgt4rgtrEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuC3gOC3kuC2u+C3j+C2uCDgtpzgtrHgt4rgt4DgtrHgt4rgtrEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgtrHgtq3gtrsg4Laa4La74Lax4LeK4LaxIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4Lav4LeS4LacIOC3hOC2u+C3kuC2seC3iuC2sSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4LeE4Laa4LeU4LeF4Lax4LeK4LaxIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4LaH4La94LeK4La24La4IOC2muC2veC3j+C3gCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgt4Tgtqwg4La04La74LeS4La44LePIOC3g+C3iuC2veC2uuC3kuC2qeC2u+C2uiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4La44LeP4Law4LeK4oCN4La64La6IOC2reC3neC2u+C3jyDgtrHgt5Dgtq0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuC2veC2tuC3jyDgtpzgtq0g4LeE4LeQ4Laa4LeSIOC2reC3nOC2u+C2reC3lOC2u+C3lCDgtrHgt5zgtrjgt5Dgtq0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuC3gOC3kuC2muC3j+C3gSDgtq3gt5LgtrvgtroiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNrL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2svc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU4YWExMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNrL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0w6ltIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlphcmlhZGVuaWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJUbGHEjWlkbG8gcHJlbm9zdSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlRsYcSNaWRsbyBwcmVub3N1LiBPZHBvamVuw6kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlRsYcSNaWRsbyBwcmVub3N1LiBQcmlww6FqYSBzYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJUbGHEjWlkbG8gcHJlbm9zdS4gUHJpcG9qZW7DqSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQcmVub3MgZG8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJIxL5hZGFqw7ogc2EgemFyaWFkZW5pYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJPZHBvamnFpSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Ilphc3RhdmnFpSBwcmVuw6HFoWFuaWUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlphdnJpZcWlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUHJlaHJhxaUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBvemFzdGF2acWlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iWmFzdGF2acWlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUm96YmFsacWlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJaYmFsacWlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iT2Jyw6F6b2sgYWxidW11Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlBvc8O6dmHEjSBobGFzaXRvc3RpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOaWUgc8O6IHZ5YnJhbsOpIMW+aWFkbmUgbcOpZGnDoSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmllIHPDuiBrwqBkaXNwb3rDrWNpaSDFvmlhZG5lIGluZm9ybcOhY2llIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQcmVuw6HFoWEgc2Egb2JyYXpvdmthIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zbC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNsL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYTRjZTQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zbC9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Ik5hcHJhdmUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJHdW1iIHphIHByZWR2YWphbmplIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iR3VtYiB6YSBwcmVkdmFqYW5qZS4gUG92ZXphdmEgamUgcHJla2luamVuYS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Ikd1bWIgemEgcHJlZHZhamFuamUuIFZ6cG9zdGF2bGphbmplIHBvdmV6YXZlLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJHdW1iIHphIHByZWR2YWphbmplLiBQb3ZlemF2YSBqZSB2enBvc3RhdmxqZW5hLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQcmVkdmFqYW5qZSBwcmVrOiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Iklza2FuamUgbmFwcmF2Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlByZWtpbmkgcG92ZXphdm8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJVc3RhdmkgcHJlZHZhamFuamUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlphcHJpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUHJlZHZhamFuamUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlphdXN0YXZpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iVXN0YXZpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUmF6xaFpcmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlN0cm5pIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iTmFzbG92bmljYSBhbGJ1bWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iRHJzbmlrIHphIGdsYXNub3N0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOaSBpemJyYW5lIHByZWRzdGF2bm9zdGkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IlBvZGF0a2kgbmlzbyBuYSB2b2xqbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUHJlZHZhamFuamUgemFzbG9uYSI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Evc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zcS9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTZlMTEwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Evc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iUGFqaXNqZXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCdXRvbmkgaSB0cmFuc21ldGltaXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCdXRvbmkgaSB0cmFuc21ldGltaXQuIEplIGkgc2hrw6twdXR1ciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQnV0b25pIGkgdHJhbnNtZXRpbWl0LiBQbyBsaWRoZXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQnV0b25pIGkgdHJhbnNtZXRpbWl0LiBKZSBpIGxpZGh1ciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUcmFuc21ldG8gdGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJQbyBrw6tya29uIHBhamlzamUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iU2hrw6twdXRlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iTmRhbG8gdHJhbnNtZXRpbWluIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJNYnlsbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+Ikx1YWoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXrDqyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Ik5kYWxvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iWmdqZXJvamUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlBhbG9zZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IktvcGVydGluYSBlIGFsYnVtaXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iUnLDq3NocWl0w6tzaSBpIHZvbHVtaXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik51ayB1IHpnam9kaCBhc25qw6sgbWVkaWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik51ayBqZXBldCBhc25qw6sgaW5mb3JtYWNpb24iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlBvIHRyYW5zbWV0b24gZWtyYW5pbiI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Ivc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zci9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWFiYWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Ivc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCh0LjRgdGC0LXQvCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQo9GA0LXRktCw0ZjQuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCU0YPQs9C80LUg0J/RgNC10LHQsNGG0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQlNGD0LPQvNC1INCf0YDQtdCx0LDRhtC4LiDQktC10LfQsCDRmNC1INC/0YDQtdC60LjQvdGD0YLQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i0JTRg9Cz0LzQtSDQn9GA0LXQsdCw0YbQuC4g0J/QvtCy0LXQt9GD0ZjQtSDRgdC1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCU0YPQs9C80LUg0J/RgNC10LHQsNGG0LguINCf0L7QstC10LfQsNC9INGY0LUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0J/RgNC10LHQsNGG0YPRmCDQvdCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0J/RgNC+0L3QsNC70LDQttC10ZrQtSDRg9GA0LXRktCw0ZjQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQn9GA0LXQutC40L3QuCDQstC10LfRgyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCX0LDRg9GB0YLQsNCy0Lgg0L/RgNC10LHQsNGG0LjQstCw0ZrQtSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JfQsNGC0LLQvtGA0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQn9GD0YHRgtC4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLQn9Cw0YPQt9C40YDQsNGYIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i0JfQsNGD0YHRgtCw0LLQuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCf0YDQvtGI0LjRgNC4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQodC60YPQv9C4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0J7QvNC+0YIg0LDQu9Cx0YPQvNCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCa0LvQuNC30LDRhyDQt9CwINGY0LDRh9C40L3RgyDQt9Cy0YPQutCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLQndC10LzQsCDQuNC30LDQsdGA0LDQvdC40YUg0LzQtdC00LjRmNCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQndC40YHRgyDQtNC+0YHRgtGD0L/QvdC1INC90LjQutCw0LrQstC1INC40L3RhNC+0YDQvNCw0YbQuNGY0LUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItCf0YDQtdCx0LDRhtGD0ZjQtSDRgdC1INC10LrRgNCw0L0iPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E3ZDNlMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRW5oZXRlciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3Qta25hcHBlbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3Qta25hcHBlbi4gRnLDpW5rb3BwbGFkIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0LWtuYXBwZW4uIEFuc2x1dGVyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3Qta25hcHBlbi4gQW5zbHV0ZW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdGEgdGlsbCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkxldGFyIGVmdGVyIGVuaGV0ZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iS29wcGxhIGZyw6VuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU2x1dGEgY2FzdGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlN0w6RuZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlNwZWxhIHVwcCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJBdmJyeXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJVdMO2a2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IktvbXByaW1lcmEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJTa2l2b21zbGFnIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlZvbHltcmVnbGFnZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iSW5nYSBtZWRpYSBoYXIgdmFsdHMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkRldCBmaW5ucyBpbmdlbiBpbmZvcm1hdGlvbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iU2vDpHJtZW4gY2FzdGFzIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3L3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NjJjYjEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iTWZ1bW8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVmlmYWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJLaXR1ZmUgY2hhIGt1dHVtYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IktpdHVmZSBjaGEga3V0dW1hLiBLaW1lb25kb2xld2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IktpdHVmZSBjaGEga3V0dW1hLiBLaW5hdW5nYW5pc2hhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IktpdHVmZSBjaGEga3V0dW1hLiBLaW1ldW5nYW5pc2h3YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUdW1hIGt3ZW55ZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkluYXRhZnV0YSB2aWZhYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJPbmRvYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkFjaGEga3V0dW1hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJGdW5nYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkNoZXphIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJTaXRpc2hhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU2ltYW1pc2hhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUGFudWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Ikt1bmphIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iU2FuYWEgeWEgYWxiYW11Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IktpdGVsZXppIGNoYSBzYXV0aSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iSGFrdW5hIG1hdWRodWkgeWFsaXlvY2hhZ3VsaXdhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJIYWt1bmEgbWFlbGV6byB5YWxpeW9wYXRpa2FuYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iSW5hdHVtYSBza3JpbmkiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3NjAwZHAvZGltZW5zLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3NjAwZHAvZGltZW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDQyMzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3c2MDBkcC9kaW1lbnMueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcz4KKyAgICA8IS0tIFRoZSBwbGF0Zm9ybSdzIGRlc2lyZWQgZml4ZWQgd2lkdGggZm9yIGEgZGlhbG9nIGFsb25nIHRoZSBtYWpvciBheGlzCisgICAgICAgICAodGhlIHNjcmVlbiBpcyBpbiBsYW5kc2NhcGUpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KKyAgICA8aXRlbSB0eXBlPSJkaW1lbiIgbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21ham9yIj42MCU8L2l0ZW0+CisgICAgPCEtLSBUaGUgcGxhdGZvcm0ncyBkZXNpcmVkIGZpeGVkIHdpZHRoIGZvciBhIGRpYWxvZyBhbG9uZyB0aGUgbWlub3IgYXhpcworICAgICAgICAgKHRoZSBzY3JlZW4gaXMgaW4gcG9ydHJhaXQpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KKyAgICA8aXRlbSB0eXBlPSJkaW1lbiIgbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21pbm9yIj45MCU8L2l0ZW0+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3NzIwZHAvZGltZW5zLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3NzIwZHAvZGltZW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzRhYjhkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3c3MjBkcC9kaW1lbnMueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcz4KKyAgICA8IS0tIFRoZSBwbGF0Zm9ybSdzIGRlc2lyZWQgZml4ZWQgd2lkdGggZm9yIGEgZGlhbG9nIGFsb25nIHRoZSBtYWpvciBheGlzCisgICAgICAgICAodGhlIHNjcmVlbiBpcyBpbiBsYW5kc2NhcGUpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KKyAgICA8aXRlbSB0eXBlPSJkaW1lbiIgbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21ham9yIj41MCU8L2l0ZW0+CisgICAgPCEtLSBUaGUgcGxhdGZvcm0ncyBkZXNpcmVkIGZpeGVkIHdpZHRoIGZvciBhIGRpYWxvZyBhbG9uZyB0aGUgbWlub3IgYXhpcworICAgICAgICAgKHRoZSBzY3JlZW4gaXMgaW4gcG9ydHJhaXQpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KKyAgICA8aXRlbSB0eXBlPSJkaW1lbiIgbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21pbm9yIj43MCU8L2l0ZW0+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRhL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGEvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE5NzhmMwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRhL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgrprgrr/grrjgr43grp/grq7gr40iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4K6a4K6+4K6k4K6p4K6Z4K+N4K6V4K6z4K+NIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4K6k4K6/4K6w4K+I4K6v4K6/4K6f4K+BIOCuquCun+CvjeCun+CuqeCvjSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuCuheCuqeCvgeCuquCvjeCuquCvgeCupOCusuCvjSDgrqrgr4rgrqTgr43grqTgrr7grqngr40uIOCupOCvgeCuo+CvjeCun+Cuv+CuleCvjeCuleCuquCvjeCuquCun+CvjeCun+CupOCvgSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4K6F4K6p4K+B4K6q4K+N4K6q4K+B4K6k4K6y4K+NIOCuquCviuCupOCvjeCupOCuvuCuqeCvjS4g4K6H4K6j4K+I4K6V4K+N4K6V4K6/4K6x4K6k4K+BIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuCuheCuqeCvgeCuquCvjeCuquCvgeCupOCusuCvjSDgrqrgr4rgrqTgr43grqTgrr7grqngr40uIOCuh+Cuo+CviOCuleCvjeCuleCuquCvjeCuquCun+CvjeCun+CupOCvgSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLgrofgrqTgrrHgr43grpXgr4Eg4K6F4K6p4K+B4K6q4K+N4K6q4K+BIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4K6a4K6+4K6k4K6p4K6Z4K+N4K6V4K6z4K+I4K6k4K+NIOCupOCvh+Cun+CvgeCuleCuv+CuseCupOCvgSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgrqTgr4rgrp/grrDgr43grqrgr4jgrqTgr40g4K6k4K+B4K6j4K+N4K6f4K6/Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4K6F4K6p4K+B4K6q4K+N4K6q4K+B4K614K6k4K+IIOCuqOCuv+CuseCvgeCupOCvjeCupOCvgSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4K6u4K+C4K6f4K+B4K6u4K+NIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4K6H4K6v4K6V4K+N4K6V4K+B4K6u4K+NIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgrofgrp/gr4jgrqjgrr/grrHgr4HgrqTgr43grqTgr4Hgrq7gr40iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgrqjgrr/grrHgr4HgrqTgr43grqTgr4HgrrXgrqTgrrHgr43grpXgrr7grqkg4K6q4K+K4K6k4K+N4K6k4K6+4K6p4K+NIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4K614K6/4K6w4K6/4K614K6+4K6V4K+N4K6V4K+BIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgrprgr4HgrrDgr4HgrpXgr43grpXgr4EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgrobgrrLgr43grqrgrq7gr40g4K6G4K6w4K+N4K6f4K+NIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCukuCusuCuv+Cur+Cus+CuteCvgSDgrrjgr43grrLgr4jgrp/grrDgr40iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuCuruCvgOCun+Cuv+Cur+CuviDgro7grqTgr4HgrrXgr4Hgrq7gr40g4K6k4K+H4K6w4K+N4K6o4K+N4K6k4K+G4K6f4K+B4K6V4K+N4K6V4K6q4K+N4K6q4K6f4K614K6/4K6y4K+N4K6y4K+IIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgrqTgrpXgrrXgrrLgr40g4K6O4K6k4K+B4K614K+B4K6u4K6/4K6y4K+N4K6y4K+IIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgrqTgrr/grrDgr4jgrq/gr4gg4K6F4K6p4K+B4K6q4K+N4K6q4K+B4K6V4K6/4K6x4K+A4K6w4K+N4K6V4K6z4K+NIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10ZS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRlL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMzEyZTMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10ZS9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4LC44LC/4LC44LGN4LCf4LCu4LGNIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuCwquCwsOCwv+CwleCwsOCwvuCwsuCxgSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuCwquCxjeCwsOCwuOCwvuCwsOCwgiDgsJrgsYfgsK/gsL8g4LCs4LCf4LCo4LGNIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4LCq4LGN4LCw4LC44LC+4LCwIOCwrOCwn+CwqOCxjS4g4LCh4LC/4LC44LGN4oCM4LCV4LCo4LGG4LCV4LGN4LCf4LGNIOCwmuCxh+Cwr+CwrOCwoeCwv+CwguCwpuCwvyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4LCq4LGN4LCw4LC44LC+4LCwIOCwrOCwn+CwqOCxjS4g4LCV4LCo4LGG4LCV4LGN4LCf4LGNIOCwmuCxh+CwuOCxjeCwpOCxi+CwguCwpuCwvyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgsKrgsY3gsLDgsLjgsL7gsLAg4LCs4LCf4LCo4LGNLiDgsJXgsKjgsYbgsJXgsY3gsJ/gsY0g4LCa4LGH4LCv4LCs4LCh4LC/4LCC4LCm4LC/Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCwpuCxgOCwqOCwv+CwleCwvyDgsKrgsY3gsLDgsLjgsL7gsLDgsIIg4LCa4LGH4LCv4LCC4LCh4LC/Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4LCq4LCw4LC/4LCV4LCw4LC+4LCy4LCo4LGBIOCwleCwqOCxgeCwl+CxiuCwguCwn+Cxi+CwguCwpuCwvyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgsKHgsL/gsLjgsY3igIzgsJXgsKjgsYbgsJXgsY3gsJ/gsY0g4LCa4LGH4LCv4LC/Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4LCq4LGN4LCw4LC44LC+4LCw4LC+4LCo4LGN4LCo4LC/IOCwhuCwquCwv+CwteCxh+Cwr+CwvyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4LCu4LGC4LC44LC/4LC14LGH4LC44LGN4LCk4LGB4LCC4LCm4LC/Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4LCq4LGN4LCy4LGHIOCwmuCxh+CwuOCxjeCwpOCxgeCwguCwpuCwvyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4LCq4LC+4LCc4LGNIOCwmuCxh+CwuOCxjeCwpOCxgeCwguCwpuCwvyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCwhuCwquCwv+CwteCxh+Cwr+CwvyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCwteCwv+CwuOCxjeCwpOCwsOCwv+CwguCwquCwnOCxh+CwuOCxjeCwpOCxgeCwguCwpuCwvyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4LCV4LGB4LCm4LC/4LC44LGN4LCk4LGB4LCC4LCm4LC/Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4LCG4LCy4LGN4LCs4LCu4LGNIOCwhuCwsOCxjeCwn+CxjSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgsLXgsL7gsLLgsY3gsK/gsYLgsK7gsY0g4LC44LGN4LCy4LCv4LC/4LCh4LCw4LGNIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgsK7gsYDgsKHgsL/gsK/gsL4g4LCP4LCm4LGAIOCwjuCwguCwmuCxgeCwleCxi+CwrOCwoeCwsuCxh+CwpuCxgSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4LC44LCu4LC+4LCa4LC+4LCw4LCCIOCwheCwguCwpuCxgeCwrOCwvuCwn+CxgeCwsuCxiyDgsLLgsYfgsKbgsYEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCwuOCxjeCwleCxjeCwsOCxgOCwqOCxjeKAjOCwqOCxgSDgsKrgsY3gsLDgsLjgsL7gsLDgsIIg4LCa4LGH4LC44LGN4LCk4LGL4LCC4LCm4LC/Ijwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10aC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRoL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYThhZTUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10aC9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Lij4Liw4Lia4LiaIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuC4reC4uOC4m+C4geC4o+C4k+C5jCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuC4m+C4uOC5iOC4oSBcIuC5geC4hOC4quC4leC5jFwiIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4Lib4Li44LmI4LihIFwi4LmB4LiE4Liq4LiV4LmMXCIg4Lii4LiB4LmA4Lil4Li04LiB4LiB4Liy4Lij4LmA4LiK4Li34LmI4Lit4Lih4LiV4LmI4LitIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLguJvguLjguYjguKEgXCLguYHguITguKrguJXguYxcIiDguIHguLPguKXguLHguIfguYDguIrguLfguYjguK3guKHguJXguYjguK0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4Lib4Li44LmI4LihIFwi4LmB4LiE4Liq4LiV4LmMXCIg4LmA4LiK4Li34LmI4Lit4Lih4LiV4LmI4Lit4LmB4Lil4LmJ4LinIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuC5geC4hOC4quC4leC5jOC5hOC4m+C4ouC4seC4hyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuC4geC4s+C4peC4seC4h+C4hOC5ieC4meC4q+C4suC4reC4uOC4m+C4geC4o+C4k+C5jCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLguKLguIHguYDguKXguLTguIHguIHguLLguKPguYDguIrguLfguYjguK3guKHguJXguYjguK0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLguKvguKLguLjguJTguYHguITguKrguJXguYwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuC4m+C4tOC4lCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuC5gOC4peC5iOC4mSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4Lir4Lii4Li44LiU4LiK4Lix4LmI4Lin4LiE4Lij4Liy4LinIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Lir4Lii4Li44LiUIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4LiC4Lii4Liy4LiiIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLguKLguLjguJoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLguJvguIHguK3guLHguKXguJrguLHguYnguKEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4LmB4LiW4Lia4LmA4Lil4Li34LmI4Lit4LiZ4Lib4Lij4Lix4Lia4Lij4Liw4LiU4Lix4Lia4LmA4Liq4Li14Lii4LiHIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLguYTguKHguYjguYTguJTguYnguYDguKXguLfguK3guIHguKrguLfguYjguK3guYTguKfguYkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuC5hOC4oeC5iOC4oeC4teC4guC5ieC4reC4oeC4ueC4pSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4LiB4Liz4Lil4Lix4LiH4LmB4LiE4Liq4LiV4LmM4Lir4LiZ4LmJ4Liy4LiI4LitIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10bC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRsL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YmUzZDAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10bC9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Ik1nYSBEZXZpY2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCdXR0b24gbmEgSS1jYXN0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQnV0dG9uIG5hIEktY2FzdC4gTmFkaXNrb25la3RhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCdXR0b24gbmEgSS1jYXN0LiBLdW1va29uZWt0YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCdXR0b24gbmEgSS1jYXN0LiBOYWtha29uZWt0YSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJJLWNhc3Qgc2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJOYWdoYWhhbmFwIG5nIG1nYSBkZXZpY2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iSWRpc2tvbmVrdGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJJaGludG8gYW5nIHBhZy1jYXN0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJJc2FyYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkktcGxheSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iSS1wYXVzZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkloaW50byI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlBhbGF3YWtpbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iSS1jb2xsYXBzZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtIGFydCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJTbGlkZXIgbmcgdm9sdW1lIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJXYWxhbmcgcGluaWxpbmcgbWVkaWEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IldhbGFuZyBhdmFpbGFibGUgbmEgaW1wb3JtYXN5b24iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IktpbmEtY2FzdCBhbmcgc2NyZWVuIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZjYzOTIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkNpaGF6bGFyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iWWF5xLFubGEgZMO8xJ9tZXNpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iWWF5xLFubGEgZMO8xJ9tZXNpLiBCYcSfbGFudMSxIGtlc2lsZGkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IllhecSxbmxhIGTDvMSfbWVzaS4gQmHEn2xhbsSxeW9yIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IllhecSxbmxhIGTDvMSfbWVzaS4gQmHEn2xhbmTEsSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLFnnVyYXlhIHlhecSxbmxhOiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkNpaGF6bGFyIGJ1bHVudXlvciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJCYcSfbGFudMSxecSxIGtlcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IllhecSxbsSxIGR1cmR1ciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iS2FwYXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJPeW5hdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iRHVyYWtsYXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJEdXJkdXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJHZW5pxZ9sZXQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkRhcmFsdCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYsO8bSBrYXBhxJ/EsSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJTZXMgZMO8emV5aSBrYXlkxLFybWEgw6d1YnXEn3UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik1lZHlhIHNlw6dpbG1lZGkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkJpbGdpIHlvayI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRWtyYW4geWF5xLFubGFuxLF5b3IiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXVrL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdWsvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNkMzY1ZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXVrL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodC40YHRgtC10LzQsCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQn9GA0LjRgdGC0YDQvtGXIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRltGXIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRltGXLiDQktGW0LTigJnRlNC00L3QsNC90L4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0ZbRly4g0J/RltC04oCZ0ZTQtNC90LDQvdC90Y8iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRltGXLiDQn9GW0LTigJnRlNC00L3QsNC90L4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0KLRgNCw0L3RgdC70Y7QstCw0YLQuCDQvdCwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0J/QvtGI0YPQuiDQv9GA0LjRgdGC0YDQvtGX0LIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0JLRltC00LrQu9GO0YfQuNGC0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQn9GA0LjQv9C40L3QuNGC0Lgg0YLRgNCw0L3RgdC70Y/RhtGW0Y4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCX0LDQutGA0LjRgtC4Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0JLRltC00YLQstC+0YDQuNGC0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0YDQuNC30YPQv9C40L3QuNGC0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQn9GA0LjQv9C40L3QuNGC0LgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQoNC+0LfQs9C+0YDQvdGD0YLQuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0JfQs9C+0YDQvdGD0YLQuCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCe0LHQutC70LDQtNC40L3QutCwINCw0LvRjNCx0L7QvNGDIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCf0L7QstC30YPQvdC+0Log0LPRg9GH0L3QvtGB0YLRliI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0JzQtdC00ZbQsC3RhNCw0LnQuyDQvdC1INCy0LjQsdGA0LDQvdC+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQndC10LzQsNGUINC00LDQvdC40YUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItCi0YDQsNC90YHQu9GP0YbRltGPINC10LrRgNCw0L3QsCI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ci9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzJjNTk4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXIvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Itiz2LPZudmFIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Itii2YTYp9iqIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i2qnYp9iz2bkg2qnYsdmG25Ig2qnYpyDYqNm52YYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLaqdin2LPZuSDaqdix2YbbkiDaqdinINio2bnZhtuUINi624zYsSDZhdmG2LPZhNqpINuB25IiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Itqp2KfYs9m5INqp2LHZhtuSINqp2Kcg2KjZudmG25Qg2YXZhtiz2YTaqSDbgdmIINix24HYpyDbgduSIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Itqp2KfYs9m5INqp2LHZhtuSINqp2Kcg2KjZudmG25Qg2YXZhtiz2YTaqSDbgduSIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+Itin2LMg2YXbjNq6INqp2KfYs9m5INqp2LHbjNq6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i2KLZhNin2Kog2KrZhNin2LQg24HZiCDYsduB25Ig24HbjNq6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Iti624zYsSDZhdmG2LPZhNqpINqp2LHbjNq6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i2qnYp9iz2bkg2qnYsdmG2Kcg2KjZhtivINqp2LHbjNq6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLYqNmG2K8g2qnYsduM2roiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLahtmE2KfYptuM2roiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItmF2YjZgtmI2YEg2qnYsduM2roiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLYsdmI2qnbjNq6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i2b7avtuM2YTYp9im24zauiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i2LPaqduM2pHbjNq6Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i2KfZhNio2YUg2KLYsdm5Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItmI2KfZhNuM2YjZhSDYs9mE2KfYptuM2ojYsSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i2qnZiNim24wg2YXbjNqI24zYpyDZhdmG2KrYrtioINmG24HbjNq6INuB25IiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Itqp2YjYptuMINmF2LnZhNmI2YXYp9iqINiv2LPYqtuM2KfYqCDZhtuB24zauiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i2LPaqdix24zZhiDaqdin2LPZuSDbgdmIINix24HbjCDbgduSIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ei9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXV6L3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYTA4MTcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ei9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iVGl6aW0iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iUXVyaWxtYWxhciI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IlRyYW5zbGF0c2l5YSB0dWdtYXNpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iVHJhbnNsYXRzaXlhIHR1Z21hc2kuIFV6aWxkaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iVHJhbnNsYXRzaXlhIHR1Z21hc2kuIFVsYW5tb3FkYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJUcmFuc2xhdHNpeWEgdHVnbWFzaS4gVWxhbmRpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlF1eWlkYWdpZ2EgdHJhbnNsYXRzaXlhIHFpbGlzaDoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJRdXJpbG1hbGFybmkgdG9waXNoIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlVsYW5pc2huaSB1emlzaCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlRyYW5zbGF0c2l5YW5pIHRv4oCYeHRhdGlzaCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iWW9waXNoIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iQm9zaGxhc2giPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlRv4oCYeHRhdGliIHR1cmlzaCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlRv4oCYeHRhdGlzaCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IllveWlzaCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iWWln4oCYaXNoIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxib20gbXVxb3Zhc2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVG92dXNoIGJhbGFuZGxpZ2kgc2xheWRlcmkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik11bHRpbWVkaWEgdGFubGFtYWdhbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iSGVjaCBxYW5kYXkgbWHigJlsdW1vdCB5b+KAmHEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVrcmFubmkgdHJhbnNsYXRzaXlhIHFpbGlzaCI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdmkvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy12aS9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDk4Y2NhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdmkvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Ikjhu4cgdGjhu5FuZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJUaGnhur90IGLhu4siPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJOw7p0IHRydXnhu4FuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iTsO6dCB0cnV54buBbi4gxJDDoyBuZ+G6r3Qga+G6v3QgbuG7kWkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Ik7DunQgdHJ1eeG7gW4uIMSQYW5nIGvhur90IG7hu5FpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Ik7DunQgdHJ1eeG7gW4uIMSQw6Mga+G6v3QgbuG7kWkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJ1eeG7gW4gdOG7m2kiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLEkGFuZyB0w6xtIHRoaeG6v3QgYuG7iyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJOZ+G6r3Qga+G6v3QgbuG7kWkiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJE4burbmcgdHJ1eeG7gW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IsSQw7NuZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlBow6F0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJU4bqhbSBk4burbmciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJE4burbmciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJN4bufIHLhu5luZyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iVGh1IGfhu41uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4bqibmggYsOsYSBhbGJ1bSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJUaGFuaCB0csaw4bujdCDDom0gbMaw4bujbmciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Iktow7RuZyBjw7MgcGjGsMahbmcgdGnhu4duIG7DoG8gxJHGsOG7o2MgY2jhu41uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJLaMO0bmcgY8OzIHRow7RuZyB0aW4gbsOgbyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4ixJBhbmcgdHJ1eeG7gW4gbcOgbiBow6xuaCI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMjJkMDEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1yQ04vc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Iuezu+e7nyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLorr7lpIciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLmipXlsITmjInpkq4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLmipXlsITmjInpkq7jgILlt7Lmlq3lvIDov57mjqUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuaKleWwhOaMiemSruOAguato+WcqOi/nuaOpSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLmipXlsITmjInpkq7jgILlt7Lov57mjqUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i5oqV5bCE5YiwIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i5q2j5Zyo5p+l5om+6K6+5aSHIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuaWreW8gOi/nuaOpSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuWBnOatouaKleWwhCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i5YWz6ZetIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i5pKt5pS+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLmmoLlgZwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLlgZzmraIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLlsZXlvIAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuaUtui1tyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuS4k+i+keWwgemdoiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLpn7Pph4/mu5HlnZciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuacqumAieaLqeS7u+S9leWqkuS9kyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i5rKh5pyJ5Lu75L2V55u45YWz5L+h5oGvIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLmraPlnKjmipXlsITlsY/luZUiPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJISy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJISy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTZlNWMyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtckhLL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLns7vntbEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i6KOd572uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i5oqV5pS+5oyJ6YiVIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i5oqV5pS+5oyJ6YiV44CC5bey6Kej6Zmk6YCj5o6lIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLmipXmlL7mjInpiJXjgILmraPlnKjpgKPmjqUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i5oqV5pS+5oyJ6YiV44CC5bey6YCj5o6lIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuaKleaUvuiHsyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Iuato+WcqOWwi+aJvuijnee9riI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLkuK3mlrfpgKPnt5oiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLlgZzmraLmipXmlL4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IumXnOmWiSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuaSreaUviI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i5pqr5YGcIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i5YGc5q2iIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i5bGV6ZaLIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLmlLblkIgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLlsIjovK/lsIHpnaIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i6Z+z6YeP5ruR5qG/Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLlsJrmnKrpgbjmk4flqpLpq5QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Iuaykuacieips+e0sOizh+aWmSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i5q2j5Zyo5oqV5pS+6J6i5bmVIjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNhZmRlMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i57O757WxIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Iuijnee9riI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuaKleaUvuaMiemIlSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuaKleaUvuaMiemIle+8m+W3suS4reaWt+mAo+e3miI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i5oqV5pS+5oyJ6YiV77yb6YCj57ea5LitIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuaKleaUvuaMiemIle+8m+W3sumAo+e3miI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLmipXmlL7liLAiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLmraPlnKjlsIvmib7oo53nva4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i5Lit5pa36YCj57eaIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i5YGc5q2i5oqV5pS+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLpl5zplokiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLmkq3mlL4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Iuaaq+WBnCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuWBnOatoiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuWxlemWiyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i5pS25ZCIIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i5bCI6Lyv5bCB6Z2iIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Iumfs+mHj+a7keahvyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i5pyq6YG45Y+W5Lu75L2V5aqS6auUIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLmspLmnInlj6/nlKjnmoTos4foqIoiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Iuato+WcqOaKleaUvuieouW5lSI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtenUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16dS9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTA3YzQzCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtenUvc3RyaW5ncy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IklzaXN0aW11Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkFtYWRpdmF5aXNpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iSW5raW5vYmhvIHllLUNhc3QiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJJbmtpbm9iaG8geW9rdXNha2F6YS4gS3VucWFueXVsaXdlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJJbmtpbm9iaG8geW9rdXNha2F6YS4gS3V5YXhodW55d2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iSW5raW5vYmhvIHlva3VzYWthemEuIEt1eGh1bnlpd2UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iU2FrYXphIGt1LSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Ikl0aG9sYSBhbWFkaXZheWlzaSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJOcWFtdWxhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iTWlzYSB1a3VzYWthemEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlZhbGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJEbGFsYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iTWlzYSBpc2lraGFzaGFuYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Ik1pc2EiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJOd2ViYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iR29xYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IlVidWNpa28gYmUtYWxiaGFtdSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJJc2lsYXlpZGEgc2V2b2x1bXUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkF5aWtobyBpbWlkaXlhIGVraGV0aGl3ZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iQWx1a2hvIHVsd2F6aSBvbHV0aG9sYWthbGF5byI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iSXNpa3Jpbmkgc29rdXNha2F6YSI8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvYXJyYXlzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2FycmF5cy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4NzMyMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2FycmF5cy54bWwKQEAgLTAsMCArMSwyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzPgorICAgIDxpbnRlZ2VyLWFycmF5IG5hbWU9InNwZWVkX211bHRpcGxpZWRfYnlfMTAwIj4KKyAgICAgICAgPGl0ZW0+MjU8L2l0ZW0+CisgICAgICAgIDxpdGVtPjUwPC9pdGVtPgorICAgICAgICA8aXRlbT43NTwvaXRlbT4KKyAgICAgICAgPGl0ZW0+MTAwPC9pdGVtPgorICAgICAgICA8aXRlbT4xMjU8L2l0ZW0+CisgICAgICAgIDxpdGVtPjE1MDwvaXRlbT4KKyAgICAgICAgPGl0ZW0+MjAwPC9pdGVtPgorICAgIDwvaW50ZWdlci1hcnJheT4KKzwvcmVzb3VyY2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2F0dHJzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2F0dHJzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzcyODViCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvYXR0cnMueG1sCkBAIC0wLDAgKzEsNDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcz4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iTWVkaWFSb3V0ZUJ1dHRvbiI+CisgICAgICAgIDwhLS0gVGhpcyBkcmF3YWJsZSBpcyBhIHN0YXRlIGxpc3Qgd2hlcmUgdGhlICJjaGVja2VkIiBzdGF0ZQorICAgICAgICAgICAgIGluZGljYXRlcyBhY3RpdmUgbWVkaWEgcm91dGluZy4gIENoZWNrYWJsZSBpbmRpY2F0ZXMgY29ubmVjdGluZworICAgICAgICAgICAgIGFuZCBub24tY2hlY2tlZCAvIG5vbi1jaGVja2FibGUgaW5kaWNhdGVzCisgICAgICAgICAgICAgdGhhdCBtZWRpYSBpcyBwbGF5aW5nIHRvIHRoZSBsb2NhbCBkZXZpY2Ugb25seS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImV4dGVybmFsUm91dGVFbmFibGVkRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgICAgICA8IS0tIFRpbnQgdG8gYXBwbHkgdG8gdGhlIG1lZGlhIHJvdXRlIGJ1dHRvbiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZUJ1dHRvblRpbnQiIGZvcm1hdD0iY29sb3IiIC8+CisKKyAgICAgICAgPGF0dHIgbmFtZT0iYW5kcm9pZDptaW5XaWR0aCIgLz4KKyAgICAgICAgPGF0dHIgbmFtZT0iYW5kcm9pZDptaW5IZWlnaHQiIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKworICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVCdXR0b25TdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZUNsb3NlRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVQbGF5RHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVQYXVzZURyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlU3RvcERyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlRGVmYXVsdEljb25EcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZVR2SWNvbkRyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlU3BlYWtlckljb25EcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJHcm91cEljb25EcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisgICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisKKyAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlVGhlbWUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9jb2xvcnMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvY29sb3JzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2JjMjk5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvY29sb3JzLnhtbApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXM+CisgICAgPGNvbG9yIG5hbWU9ImdyYXkiPiM4MDgwODA8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJ3aGl0ZSI+I2ZmZmZmZjwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9IndoaXRlX29wYWNpdHlfNzAiPiNCM2ZmZmZmZjwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9ImJsYWNrX29wYWNpdHlfNzAiPiNCMzAwMDAwMDwvY29sb3I+CisgICAgPGNvbG9yIG5hbWU9InRpdGxlX2Jhcl9ncmFkaWVudF9zdGFydCI+IzUwMDAwMDAwPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0idGl0bGVfYmFyX2dyYWRpZW50X2VuZCI+IzAwMDAwMDAwPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iYm90dG9tX2Jhcl9iYWNrZ3JvdW5kIj4jNDAyMDIwMjA8L2NvbG9yPgorPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvZGltZW5zLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2RpbWVucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ3YjAyMgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2RpbWVucy54bWwKQEAgLTAsMCArMSw3MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzPgorICAgIDwhLS0gRGlhbG9nIHNpemUgLS0+CisgICAgPGVhdC1jb21tZW50IC8+CisgICAgPCEtLSBUaGUgcGxhdGZvcm0ncyBkZXNpcmVkIGZpeGVkIHdpZHRoIGZvciBhIGRpYWxvZyBhbG9uZyB0aGUgbWFqb3IgYXhpcworICAgICAgICAgKHRoZSBzY3JlZW4gaXMgaW4gbGFuZHNjYXBlKS4gVGhpcyBtYXkgYmUgZWl0aGVyIGEgZnJhY3Rpb24gb3IgYSBkaW1lbnNpb24uLS0+CisgICAgPGRpbWVuIG5hbWU9Im1yX2RpYWxvZ19maXhlZF93aWR0aF9tYWpvciI+MzIwZHA8L2RpbWVuPgorICAgIDwhLS0gVGhlIHBsYXRmb3JtJ3MgZGVzaXJlZCBmaXhlZCB3aWR0aCBmb3IgYSBkaWFsb2cgYWxvbmcgdGhlIG1pbm9yIGF4aXMKKyAgICAgICAgICh0aGUgc2NyZWVuIGlzIGluIHBvcnRyYWl0KS4gVGhpcyBtYXkgYmUgZWl0aGVyIGEgZnJhY3Rpb24gb3IgYSBkaW1lbnNpb24uLS0+CisgICAgPGRpbWVuIG5hbWU9Im1yX2RpYWxvZ19maXhlZF93aWR0aF9taW5vciI+MzIwZHA8L2RpbWVuPgorCisgICAgPCEtLSBNZWRpYVJvdXRlQ29udHJvbGxlcidzIHZvbHVtZSBncm91cCBsaXN0IC0tPgorICAgIDxlYXQtY29tbWVudCAvPgorICAgIDwhLS0gTWF4aW11bSBoZWlnaHQgb2Ygdm9sdW1lIGdyb3VwIGxpc3QuIC0tPgorICAgIDxkaW1lbiBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X21heF9oZWlnaHQiPjI4OGRwPC9kaW1lbj4KKyAgICA8IS0tIEhlaWdodCBvZiB2b2x1bWUgZ3JvdXAgaXRlbS4gLS0+CisgICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9oZWlnaHQiPjY4ZHA8L2RpbWVuPgorICAgIDwhLS0gU2l6ZSBvZiBhbiBpdGVtJ3MgaWNvbi4gLS0+CisgICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9pY29uX3NpemUiPjI0ZHA8L2RpbWVuPgorCisgICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfcGFkZGluZ190b3AiPjE2ZHA8L2RpbWVuPgorICAgIDwhLS0gR3JvdXAgbGlzdCBleHBhbmQvY29sbGFwc2UgYW5pbWF0aW9uIGR1cmF0aW9uLiAtLT4KKyAgICA8aW50ZWdlciBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2FuaW1hdGlvbl9kdXJhdGlvbl9tcyI+NDAwPC9pbnRlZ2VyPgorICAgIDwhLS0gR3JvdXAgbGlzdCBmYWRlIGluIGFuaW1hdGlvbiBkdXJhdGlvbi4gLS0+CisgICAgPGludGVnZXIgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9mYWRlX2luX2R1cmF0aW9uX21zIj40MDA8L2ludGVnZXI+CisgICAgPCEtLSBHcm91cCBsaXN0IGZhZGUgb3V0IGFuaW1hdGlvbiBkdXJhdGlvbi4gLS0+CisgICAgPGludGVnZXIgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9mYWRlX291dF9kdXJhdGlvbl9tcyI+MjAwPC9pbnRlZ2VyPgorCisgICAgPGRpbWVuIG5hbWU9Im1jdjJfZW1iZWRkZWRfc2V0dGluZ3Nfd2lkdGgiPjE1MGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ibWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQiPjM2ZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJtY3YyX2VtYmVkZGVkX3NldHRpbmdzX2ljb25fc2l6ZSI+MjBkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9Im1jdjJfZW1iZWRkZWRfc2V0dGluZ3NfdGV4dF9oZWlnaHQiPjE4ZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJtY3YyX2VtYmVkZGVkX3NldHRpbmdzX21haW5fdGV4dF9zaXplIj4xMnNwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ibWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19zdWJfdGV4dF9zaXplIj4xMHNwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX3NldHRpbmdzX3dpZHRoIj4yMjVkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiPjU0ZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfc2V0dGluZ3NfaWNvbl9zaXplIj4zMGRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX3NldHRpbmdzX3RleHRfaGVpZ2h0Ij4yN2RwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX3NldHRpbmdzX21haW5fdGV4dF9zaXplIj4xNnNwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX3NldHRpbmdzX3N1Yl90ZXh0X3NpemUiPjEzc3A8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJtY3YyX3NldHRpbmdzX29mZnNldCI+OGRwPC9kaW1lbj4KKworICAgIDxkaW1lbiBuYW1lPSJtY3YyX3RyYW5zcG9ydF9jb250cm9sc19wYWRkaW5nIj40ZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJtY3YyX3BhdXNlX2ljb25fc2l6ZSI+MzZkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9pY29uX3NpemUiPjI4ZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJtY3YyX2VtYmVkZGVkX2ljb25fc2l6ZSI+MjRkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9Im1jdjJfbWluaW1hbF9pY29uX3NpemUiPjI0ZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJtY3YyX2ljb25fbWFyZ2luIj4xMGRwPC9kaW1lbj4KKworICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfYWxidW1faW1hZ2VfcG9ydHJhaXRfc2l6ZSI+MjMyZHA8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfYWxidW1faW1hZ2VfbGFuZHNjYXBlX3NpemUiPjE3NmRwPC9kaW1lbj4KKworICAgIDxkaW1lbiBuYW1lPSJtY3YyX2N1c3RvbV9wcm9ncmVzc19tYXhfc2l6ZSI+MmRwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ibWN2Ml9jdXN0b21fcHJvZ3Jlc3NfdGh1bWJfc2l6ZSI+MTJkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9Im1jdjJfYnVmZmVyX3ZpZXdfaGVpZ2h0Ij41ZHA8L2RpbWVuPgorICAgIDwhLS0gVE9ETzogYWRqdXN0IGJvdHRvbSBiYXIgdmlldyAtLT4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTk3YTNiCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwxNTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorCisgICAgPCEtLSBOYW1lIGZvciB0aGUgZGVmYXVsdCBzeXN0ZW0gcm91dGUgcHJpb3IgdG8gSmVsbHliZWFuLiBbQ0hBUiBMSU1JVD0zMF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSI+U3lzdGVtPC9zdHJpbmc+CisKKyAgICA8IS0tIE5hbWUgZm9yIHRoZSB1c2VyIHJvdXRlIGNhdGVnb3J5IGNyZWF0ZWQgd2hlbiBwdWJsaXNoaW5nIHJvdXRlcyB0byB0aGUgc3lzdGVtIGluIEplbGx5YmVhbiBhbmQgYWJvdmUuIFtDSEFSIExJTUlUPTMwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSI+RGV2aWNlczwvc3RyaW5nPgorCisgICAgPCEtLSBTdHJpbmcgdG8gYmUgc2hvd24gYXMgYSB0b29sdGlwIG9mIE1lZGlhUm91dGVCdXR0b24KKyAgICAgICAgQ2FzdCBpcyB0aGUgc3RhbmRhcmQgYW5kcm9pZCB2ZXJiIGZvciBzZW5kaW5nIGNvbnRlbnQgdG8gYSByZW1vdGUgZGV2aWNlLiBbQ0hBUiBMSU1JVD01MF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiI+Q2FzdCBidXR0b248L3N0cmluZz4KKworICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBvZiBhIE1lZGlhUm91dGVCdXR0b24gZm9yIGFjY2Vzc2liaWxpdHkgc3VwcG9ydCB3aGVuIG5vIHJlbW90ZSBkZXZpY2UgaXMgY29ubmVjdGVkLgorICAgICAgICBDYXN0IGlzIHRoZSBzdGFuZGFyZCBhbmRyb2lkIHZlcmIgZm9yIHNlbmRpbmcgY29udGVudCB0byBhIHJlbW90ZSBkZXZpY2UuIFtDSEFSIExJTUlUPU5PTkVdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIj5DYXN0IGJ1dHRvbi4gRGlzY29ubmVjdGVkPC9zdHJpbmc+CisKKyAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gb2YgYSBNZWRpYVJvdXRlQnV0dG9uIGZvciBhY2Nlc3NpYmlsaXR5IHN1cHBvcnQgd2hpbGUgY29ubmVjdGluZyB0byBhIHJlbW90ZSBkZXZpY2UuCisgICAgICAgIENhc3QgaXMgdGhlIHN0YW5kYXJkIGFuZHJvaWQgdmVyYiBmb3Igc2VuZGluZyBjb250ZW50IHRvIGEgcmVtb3RlIGRldmljZS4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIj5DYXN0IGJ1dHRvbi4gQ29ubmVjdGluZzwvc3RyaW5nPgorCisgICAgPCEtLSBDb250ZW50IGRlc2NyaXB0aW9uIG9mIGEgTWVkaWFSb3V0ZUJ1dHRvbiBmb3IgYWNjZXNzaWJpbGl0eSBzdXBwb3J0IHdoZW4gYSByZW1vdGUgZGV2aWNlIGlzIGNvbm5lY3RlZC4KKyAgICAgICAgQ2FzdCBpcyB0aGUgc3RhbmRhcmQgYW5kcm9pZCB2ZXJiIGZvciBzZW5kaW5nIGNvbnRlbnQgdG8gYSByZW1vdGUgZGV2aWNlLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCI+Q2FzdCBidXR0b24uIENvbm5lY3RlZDwvc3RyaW5nPgorCisgICAgPCEtLSBUaXRsZSBvZiB0aGUgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cuIFtDSEFSIExJTUlUPTMwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiPkNhc3QgdG88L3N0cmluZz4KKworICAgIDwhLS0gUGxhY2Vob2xkZXIgdGV4dCB0byBzaG93IHdoZW4gbm8gZGV2aWNlcyBoYXZlIGJlZW4gZm91bmQuIFtDSEFSIExJTUlUPTUwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIj5GaW5kaW5nIGRldmljZXM8L3N0cmluZz4KKworICAgIDwhLS0gQnV0dG9uIHRvIGRpc2Nvbm5lY3QgZnJvbSBhIG1lZGlhIHJvdXRlLiAgW0NIQVIgTElNSVQ9MzBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0Ij5EaXNjb25uZWN0PC9zdHJpbmc+CisKKyAgICA8IS0tIEJ1dHRvbiB0byBzdG9wIHBsYXliYWNrIGFuZCBkaXNjb25uZWN0IGZyb20gYSBtZWRpYSByb3V0ZS4gW0NIQVIgTElNSVQ9MzBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciPlN0b3AgY2FzdGluZzwvc3RyaW5nPgorCisgICAgPCEtLSBDb250ZW50IGRlc2NyaXB0aW9uIGZvciBhY2Nlc3NpYmlsaXR5IChub3Qgc2hvd24gb24gdGhlIHNjcmVlbik6IGRpYWxvZyBjbG9zZSBidXR0b24uIFtDSEFSIExJTUlUPU5PTkVdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiI+Q2xvc2U8L3N0cmluZz4KKworICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBtZWRpYSBwbGF5IGJ1dHRvbi4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiPlBsYXk8L3N0cmluZz4KKworICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBtZWRpYSBwYXVzZSBidXR0b24uIFtDSEFSIExJTUlUPU5PTkVdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSI+UGF1c2U8L3N0cmluZz4KKworICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBtZWRpYSBzdG9wIGJ1dHRvbi4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiPlN0b3A8L3N0cmluZz4KKworICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBncm91cCBleHBhbmQgYnV0dG9uLiBQcmVzc2luZyBidXR0b24gc2hvd3MgZ3JvdXAgbWVtYmVycyBvZiBhIHNlbGVjdGVkIHJvdXRlIGdyb3VwLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIj5FeHBhbmQ8L3N0cmluZz4KKworICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBncm91cCBjb2xsYXBzZSBidXR0b24uIFByZXNzaW5nIGJ1dHRvbiBoaWRlcyBncm91cCBtZW1iZXJzIG9mIGEgc2VsZWN0ZWQgcm91dGUgZ3JvdXAuIFtDSEFSIExJTUlUPU5PTkVdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCI+Q29sbGFwc2U8L3N0cmluZz4KKworICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBhbGJ1bSBhcnQgYnV0dG9uLiBDbGlja2luZyBvbiB0aGUgYWxidW0gYXJ0IHRha2VzIHVzZXIgdG8gYSBwcmVkZWZpbmVkIGFjdGl2aXR5IHBlciBtZWRpYSBhcHAuIFtDSEFSIExJTUlUPTUwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0Ij5BbGJ1bSBhcnQ8L3N0cmluZz4KKworICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiB2b2x1bWUgc2xpZGVyLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciI+Vm9sdW1lIHNsaWRlcjwvc3RyaW5nPgorCisgICAgPCEtLSBQbGFjZWhvbGRlciB0ZXh0IHRvIHNob3cgd2hlbiBubyBtZWRpYSBoYXZlIGJlZW4gc2VsZWN0ZWQgZm9yIHBsYXliYWNrLiBbQ0hBUiBMSU1JVD01MF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIj5ObyBtZWRpYSBzZWxlY3RlZDwvc3RyaW5nPgorCisgICAgPCEtLSBQbGFjZWhvbGRlciB0ZXh0IHRvIHNob3cgd2hlbiBubyB0aXRsZS9kZXNjcmlwdGlvbiBoYXZlIGJlZW4gZm91bmQgZm9yIGEgZ2l2ZW4gc29uZy92aWRlby4gW0NIQVIgTElNSVQ9NTBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSI+Tm8gaW5mbyBhdmFpbGFibGU8L3N0cmluZz4KKworICAgIDwhLS0gUGxhY2Vob2xkZXIgdGV4dCBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgaXMgY3VycmVudGx5IGNhc3Rpbmcgc2NyZWVuLiBbQ0hBUiBMSU1JVD01MF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIj5DYXN0aW5nIHNjcmVlbjwvc3RyaW5nPgorCisgICAgPCEtLSBUZXh0IGZvciBlcnJvciBhbGVydCB3aGVuIGEgdmlkZW8gY29udGFpbmVyIGlzIG5vdCB2YWxpZCBmb3IgcHJvZ3Jlc3NpdmUgZG93bmxvYWQvcGxheWJhY2suIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iVmlkZW9WaWV3Ml9lcnJvcl90ZXh0X2ludmFsaWRfcHJvZ3Jlc3NpdmVfcGxheWJhY2siPlRoaXMgdmlkZW8gaXNuXCd0IHZhbGlkIGZvciBzdHJlYW1pbmcgdG8gdGhpcyBkZXZpY2UuPC9zdHJpbmc+CisgICAgPCEtLSBUZXh0IGZvciBlcnJvciBhbGVydCB3aGVuIGEgdmlkZW8gY2Fubm90IGJlIHBsYXllZC4gSXQgY2FuIGJlIHVzZWQgYnkgYW55IGFwcC4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJWaWRlb1ZpZXcyX2Vycm9yX3RleHRfdW5rbm93biI+Q2FuXCd0IHBsYXkgdGhpcyB2aWRlby48L3N0cmluZz4KKyAgICA8IS0tIEJ1dHRvbiB0byBjbG9zZSBlcnJvciBhbGVydCB3aGVuIGEgdmlkZW8gY2Fubm90IGJlIHBsYXllZC4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJWaWRlb1ZpZXcyX2Vycm9yX2J1dHRvbiI+T0s8L3N0cmluZz4KKworICAgIDwhLS0gVGV4dCBmb3IgZGlzcGxheWluZyBhZCBza2lwIHdhaXQgdGltZS4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9hZF9za2lwX3dhaXRfdGltZSI+CisgICAgICAgIFlvdSBjYW4gc2tpcCBBZCBpbiA8eGxpZmY6ZyBpZD0id2FpdF90aW1lIiBleGFtcGxlPSI1Ij4lMSRkPC94bGlmZjpnPnMKKyAgICA8L3N0cmluZz4KKyAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgYWQgdG90YWwgcmVtYWluaW5nIHRpbWUuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfYWRfcmVtYWluaW5nX3RpbWUiPgorICAgICAgICBBZCDCtyA8eGxpZmY6ZyBpZD0icmVtYWluaW5nX3RpbWUiIGV4YW1wbGU9IjE6MTUiPiUxJHM8L3hsaWZmOmc+IHJlbWFpbmluZworICAgIDwvc3RyaW5nPgorICAgIDwhLS0gUGxhY2Vob2xkZXIgdGV4dCBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgY2FuIHByZXNzIHRoZSBidXR0b24gdG8gZ28gdG8gYW4gZXh0ZXJuYWwgd2Vic2l0ZS4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9hZF90ZXh0Ij5WaXNpdCBBZHZlcnRpc2VyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9zdWJ0aXRsZV90ZXh0Ij5DbG9zZWQgY2FwdGlvbjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfc3VidGl0bGVfb2ZmX3RleHQiPk9mZjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfYXVkaW9fdHJhY2tfdGV4dCI+QXVkaW8gdHJhY2s8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX25vbmVfdGV4dCI+Tm9uZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfdmlkZW9fcXVhbGl0eV90ZXh0Ij5WaWRlbyBxdWFsaXR5PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml92aWRlb19xdWFsaXR5X2F1dG9fdGV4dCI+QXV0bzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfaGVscF90ZXh0Ij5IZWxwICZhbXA7IGZlZWRiYWNrPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9wbGF5YmFja19zcGVlZF90ZXh0Ij5QbGF5YmFjayBzcGVlZDwvc3RyaW5nPgorICAgIDxzdHJpbmctYXJyYXkgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfcGxheWJhY2tfc3BlZWRzIj4KKyAgICAgICAgPGl0ZW0+MC4yNXg8L2l0ZW0+CisgICAgICAgIDxpdGVtPjAuNXg8L2l0ZW0+CisgICAgICAgIDxpdGVtPjAuNzV4PC9pdGVtPgorICAgICAgICA8aXRlbT5Ob3JtYWw8L2l0ZW0+CisgICAgICAgIDxpdGVtPjEuMjV4PC9pdGVtPgorICAgICAgICA8aXRlbT4xLjV4PC9pdGVtPgorICAgICAgICA8aXRlbT4yeDwvaXRlbT4KKyAgICA8L3N0cmluZy1hcnJheT4KKyAgICA8IS0tIFBsYWNlaG9sZGVyIHRleHQgZm9yIGRpc3BsYXlpbmcgdGltZS4gVXNlZCB0byBjYWxjdWxhdGUgd2hpY2ggc2l6ZSBsYXlvdXQgdG8gdXNlLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX3RpbWVfcGxhY2Vob2xkZXIiPjAwOjAwOjAwPC9zdHJpbmc+CisKKyAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgc3VidGl0bGUgdHJhY2sgbnVtYmVyLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX3N1YnRpdGxlX3RyYWNrX251bWJlcl90ZXh0Ij4KKyAgICAgICAgVHJhY2sgPHhsaWZmOmcgaWQ9InRyYWNrX251bWJlciIgZXhhbXBsZT0iMSI+JTEkczwveGxpZmY6Zz4KKyAgICA8L3N0cmluZz4KKyAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgYXVkaW8gdHJhY2sgbnVtYmVyLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX251bWJlcl90ZXh0Ij4KKyAgICAgICAgVHJhY2sgPHhsaWZmOmcgaWQ9ImF1ZGlvX251bWJlciIgZXhhbXBsZT0iMSI+JTEkczwveGxpZmY6Zz4KKyAgICA8L3N0cmluZz4KKyAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgdW5rbm93biBzb25nIHRpdGxlLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9Im1jdjJfbXVzaWNfdGl0bGVfdW5rbm93bl90ZXh0Ij5Tb25nIHRpdGxlIHVua25vd248L3N0cmluZz4KKyAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgdW5rbm93biBhcnRpc3QgbmFtZS4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJtY3YyX211c2ljX2FydGlzdF91bmtub3duX3RleHQiPkFydGlzdCB1bmtub3duPC9zdHJpbmc+CisKKyAgICA8IS0tQ29udGVudCBEZXNjcmlwdGlvbnMgLS0+CisgICAgPHN0cmluZyBuYW1lPSJtY3YyX2JhY2tfYnV0dG9uX2Rlc2MiPkJhY2s8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1jdjJfb3ZlcmZsb3dfbGVmdF9idXR0b25fZGVzYyI+U2VlIG1vcmUgYnV0dG9uczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9vdmVyZmxvd19yaWdodF9idXR0b25fZGVzYyI+QmFjayB0byBwcmV2aW91cyBidXR0b24gbGlzdDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9zZWVrX2Jhcl9kZXNjIj5QbGF5YmFjayBwcm9ncmVzczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9zZXR0aW5nc19idXR0b25fZGVzYyI+U2V0dGluZ3M8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1jdjJfdmlkZW9fcXVhbGl0eV9idXR0b25fZGVzYyI+VmlkZW8gUXVhbGl0eSBTZWxlY3Rpb248L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1jdjJfY2NfaXNfb24iPlN1YnRpdGxlIGlzIG9uLiBDbGljayB0byBoaWRlIGl0Ljwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9jY19pc19vZmYiPlN1YnRpdGxlIGlzIG9mZi4gQ2xpY2sgdG8gc2hvdyBpdC48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1jdjJfcmVwbGF5X2J1dHRvbl9kZXNjIj5SZXBsYXk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1jdjJfcGxheV9idXR0b25fZGVzYyI+UGxheTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9wYXVzZV9idXR0b25fZGVzYyI+UGF1c2U8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1jdjJfcHJldmlvdXNfYnV0dG9uX2Rlc2MiPlByZXZpb3VzIG1lZGlhPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtY3YyX25leHRfYnV0dG9uX2Rlc2MiPk5leHQgbWVkaWE8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1jdjJfcmV3aW5kX2J1dHRvbl9kZXNjIj5SZXdpbmQgYnkgMTAgc2Vjb25kczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9mZndkX2J1dHRvbl9kZXNjIj5HbyBmb3J3YXJkIGJ5IDMwIHNlY29uZHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1jdjJfbGF1bmNoX2J1dHRvbl9kZXNjIj5MYXVuY2ggTGluazwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9tdXRlZF9idXR0b25fZGVzYyI+TXV0ZWQuIENsaWNrIHRvIHVubXV0ZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml91bm11dGVkX2J1dHRvbl9kZXNjIj5DbGljayB0byBNdXRlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtY3YyX2Z1bGxfc2NyZWVuX2J1dHRvbl9kZXNjIj5GdWxsIHNjcmVlbjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHlsZS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHlsZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI5YThlZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0eWxlLnhtbApAQCAtMCwwICsxLDIyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxyZXNvdXJjZXM+CisgICAgPHN0eWxlIG5hbWU9IkZ1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbiI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QG51bGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X21hcmdpbiI+QGRpbWVuL21jdjJfaWNvbl9tYXJnaW48L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c2NhbGVUeXBlIj5maXRYWTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IkZ1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QcmV2aW91cyI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfc2tpcF9wcmV2aW91czwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2Z1bGxfaWNvbl9zaXplPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2Z1bGxfaWNvbl9zaXplPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3ByZXZpb3VzX2J1dHRvbl9kZXNjPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLk5leHQiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3NraXBfbmV4dDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2Z1bGxfaWNvbl9zaXplPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2Z1bGxfaWNvbl9zaXplPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX25leHRfYnV0dG9uX2Rlc2M8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJGdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUGF1c2UiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3BhdXNlX2NpcmNsZV9maWxsZWQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9wYXVzZV9pY29uX3NpemU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfcGF1c2VfaWNvbl9zaXplPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3BhdXNlX2J1dHRvbl9kZXNjPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLkZmd2QiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2ZvcndhcmRfMzA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9mZndkX2J1dHRvbl9kZXNjPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlJldyI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfcmV3aW5kXzEwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfcmV3aW5kX2J1dHRvbl9kZXNjPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbiI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QG51bGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X21hcmdpbiI+QGRpbWVuL21jdjJfaWNvbl9tYXJnaW48L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c2NhbGVUeXBlIj5maXRYWTwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IkVtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUHJldmlvdXMiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3NraXBfcHJldmlvdXM8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3ByZXZpb3VzX2J1dHRvbl9kZXNjPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5OZXh0Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19za2lwX25leHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX25leHRfYnV0dG9uX2Rlc2M8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJFbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlBhdXNlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19wYXVzZV9jaXJjbGVfZmlsbGVkPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfcGF1c2VfaWNvbl9zaXplPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX3BhdXNlX2ljb25fc2l6ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9wYXVzZV9idXR0b25fZGVzYzwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IkVtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uRmZ3ZCI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfZm9yd2FyZF8zMDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfZmZ3ZF9idXR0b25fZGVzYzwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IkVtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUmV3Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19yZXdpbmRfMTA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3Jld2luZF9idXR0b25fZGVzYzwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9Ik1pbmltYWxUcmFuc3BvcnRDb250cm9sc0J1dHRvbiI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QG51bGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9wYXVzZV9pY29uX3NpemU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfcGF1c2VfaWNvbl9zaXplPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9tYXJnaW4iPkBkaW1lbi9tY3YyX2ljb25fbWFyZ2luPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNjYWxlVHlwZSI+Zml0WFk8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9wYXVzZV9idXR0b25fZGVzYzwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRpdGxlQmFyIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPm1hdGNoX3BhcmVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij40NmRwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdTdGFydCI+NWRwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdFbmQiPjVkcDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRpdGxlQmFyQnV0dG9uIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AbnVsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPjM2ZHA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+MzZkcDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRpdGxlQmFyQnV0dG9uLkJhY2siPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2Fycm93X2JhY2s8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfYmFja19idXR0b25fZGVzYzwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRpdGxlQmFyQnV0dG9uLkxhdW5jaCI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfbGF1bmNoPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX2xhdW5jaF9idXR0b25fZGVzYzwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRpbWVUZXh0Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPndyYXBfY29udGVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij53cmFwX2NvbnRlbnQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ1N0YXJ0Ij40ZHA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ0VuZCI+NGRwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+Ym9sZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MTRzcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5jZW50ZXI8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUaW1lVGV4dC5DdXJyZW50Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPkBjb2xvci93aGl0ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Ij5Ac3RyaW5nL01lZGlhQ29udHJvbFZpZXcyX3RpbWVfcGxhY2Vob2xkZXI8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJUaW1lVGV4dC5JbnRlcnB1bmN0Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPkBjb2xvci93aGl0ZV9vcGFjaXR5XzcwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHQiPsK3PC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGltZVRleHQuRW5kIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPkBjb2xvci93aGl0ZV9vcGFjaXR5XzcwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHQiPkBzdHJpbmcvTWVkaWFDb250cm9sVmlldzJfdGltZV9wbGFjZWhvbGRlcjwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbiI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QG51bGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9tYXJnaW4iPkBkaW1lbi9tY3YyX2ljb25fbWFyZ2luPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmdyYXZpdHkiPmNlbnRlcl9ob3Jpem9udGFsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNjYWxlVHlwZSI+Zml0WFk8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJCb3R0b21CYXJCdXR0b24uQ0MiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3N1YnRpdGxlX29mZjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9jY19pc19vZmY8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJCb3R0b21CYXJCdXR0b24uRnVsbFNjcmVlbiI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfZnVsbHNjcmVlbjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9mdWxsX3NjcmVlbl9idXR0b25fZGVzYzwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5PdmVyZmxvd1JpZ2h0Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19jaGV2cm9uX3JpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX292ZXJmbG93X3JpZ2h0X2J1dHRvbl9kZXNjPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uLk92ZXJmbG93TGVmdCI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfY2hldnJvbl9sZWZ0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX292ZXJmbG93X2xlZnRfYnV0dG9uX2Rlc2M8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJCb3R0b21CYXJCdXR0b24uU2V0dGluZ3MiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3NldHRpbmdzPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3NldHRpbmdzX2J1dHRvbl9kZXNjPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uLk11dGUiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3VubXV0ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml91bm11dGVkX2J1dHRvbl9kZXNjPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uLlZpZGVvUXVhbGl0eSI+CisgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2hpZ2hfcXVhbGl0eTwvaXRlbT4KKyAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfdmlkZW9fcXVhbGl0eV9idXR0b25fZGVzYzwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IkZ1bGxNdXNpY1BvcnRyYWl0Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij4wZHA8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJGdWxsTXVzaWNQb3J0cmFpdC5JbWFnZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5tYXRjaF9wYXJlbnQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dlaWdodCI+MC42PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmdyYXZpdHkiPmNlbnRlcjwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IkZ1bGxNdXNpY1BvcnRyYWl0LlRleHQiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+bWF0Y2hfcGFyZW50PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93ZWlnaHQiPjAuNDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij50b3B8Y2VudGVyPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOm9yaWVudGF0aW9uIj52ZXJ0aWNhbDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IkZ1bGxNdXNpY0xhbmRzY2FwZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj4wZHA8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJGdWxsTXVzaWNMYW5kc2NhcGUuSW1hZ2UiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPm1hdGNoX3BhcmVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2VpZ2h0Ij4wLjM1PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmdyYXZpdHkiPmNlbnRlcnxyaWdodDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IkZ1bGxNdXNpY0xhbmRzY2FwZS5UZXh0Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5tYXRjaF9wYXJlbnQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dlaWdodCI+MC42NTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdCI+MjRkcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5jZW50ZXJ8bGVmdDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpvcmllbnRhdGlvbiI+dmVydGljYWw8L2l0ZW0+CisgICAgPC9zdHlsZT4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0eWxlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRlNjkwMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0eWxlcy54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzPgorICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuTWVkaWFSb3V0ZXIuTWVkaWFSb3V0ZUJ1dHRvbiIKKyAgICAgICAgICAgIHBhcmVudD0iV2lkZ2V0LkFwcENvbXBhdC5BY3Rpb25CdXR0b24iPgorICAgICAgICA8aXRlbSBuYW1lPSJleHRlcm5hbFJvdXRlRW5hYmxlZERyYXdhYmxlIj5AZHJhd2FibGUvbXJfYnV0dG9uX2Rhcms8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuTWVkaWFSb3V0ZXIuTGlnaHQuTWVkaWFSb3V0ZUJ1dHRvbiIKKyAgICAgICAgICAgIHBhcmVudD0iV2lkZ2V0LkFwcENvbXBhdC5MaWdodC5BY3Rpb25CdXR0b24iPgorICAgICAgICA8aXRlbSBuYW1lPSJleHRlcm5hbFJvdXRlRW5hYmxlZERyYXdhYmxlIj5AZHJhd2FibGUvbXJfYnV0dG9uX2xpZ2h0PC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuVGl0bGUiIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuQXBwQ29tcGF0LlRpdGxlIiAvPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlByaW1hcnlUZXh0IiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLkFwcENvbXBhdC5TdWJoZWFkIiAvPgorCisgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlNlY29uZGFyeVRleHQiIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuQXBwQ29tcGF0LkJvZHkxIiAvPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zeW1ib2xzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N5bWJvbHMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMGU4YzYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zeW1ib2xzLnhtbApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxyZXNvdXJjZXM+CisgICAgPCEtLWphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJjYyIgLz4KKyAgICA8amF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9ImZmd2QiIC8+CisgICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJtZWRpYWNvbnRyb2xsZXJfcHJvZ3Jlc3MiIC8+CisgICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJuZXh0IiAvPgorICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0icGF1c2UiIC8+CisgICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJwcmV2IiAvPgorICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0icmV3IiAvPgorICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0idGltZSIgLz4KKyAgICA8amF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9InRpbWVfY3VycmVudCIgLy0tPgorPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvdGhlbWVzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3RoZW1lcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlhNzU0YgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3RoZW1lcy54bWwKQEAgLTAsMCArMSw3NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzPgorCisgICAgPHN0eWxlIG5hbWU9IlRoZW1lLk1lZGlhUm91dGVyIiBwYXJlbnQ9ImFuZHJvaWQ6VGhlbWUuTWF0ZXJpYWwiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd05vVGl0bGUiPnRydWU8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVCdXR0b25TdHlsZSI+QHN0eWxlL1dpZGdldC5NZWRpYVJvdXRlci5NZWRpYVJvdXRlQnV0dG9uPC9pdGVtPgorCisgICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVDbG9zZURyYXdhYmxlIj5AZHJhd2FibGUvbXJfZGlhbG9nX2Nsb3NlX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVQbGF5RHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVQYXVzZURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVN0b3BEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3N0b3BfZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUF1ZGlvVHJhY2tEcmF3YWJsZSI+QGRyYXdhYmxlL21yX3ZvbF90eXBlX2F1ZGlvdHJhY2tfZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZURlZmF1bHRJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVUdkljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX3ZvbF90eXBlX3R2X2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVTcGVha2VySWNvbkRyYXdhYmxlIj5AZHJhd2FibGUvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlU3BlYWtlckdyb3VwSWNvbkRyYXdhYmxlIj5AZHJhd2FibGUvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrPC9pdGVtPgorCisgICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVDb250cm9sUGFuZWxUaGVtZU92ZXJsYXkiPkBudWxsPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGhlbWUuTWVkaWFSb3V0ZXIuTGlnaHRDb250cm9sUGFuZWwiPgorICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQ29udHJvbFBhbmVsVGhlbWVPdmVybGF5Ij5Ac3R5bGUvVGhlbWVPdmVybGF5Lk1lZGlhUm91dGVyLkxpZ2h0PC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGhlbWUuTWVkaWFSb3V0ZXIuTGlnaHQiIHBhcmVudD0iYW5kcm9pZDpUaGVtZS5NYXRlcmlhbC5MaWdodCI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93Tm9UaXRsZSI+dHJ1ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUJ1dHRvblN0eWxlIj5Ac3R5bGUvV2lkZ2V0Lk1lZGlhUm91dGVyLkxpZ2h0Lk1lZGlhUm91dGVCdXR0b248L2l0ZW0+CisKKyAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUNsb3NlRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVQbGF5RHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGF1c2VEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3BhdXNlX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlU3RvcERyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUF1ZGlvVHJhY2tEcmF3YWJsZSI+QGRyYXdhYmxlL21yX3ZvbF90eXBlX2F1ZGlvdHJhY2tfbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVEZWZhdWx0SWNvbkRyYXdhYmxlIj5AZHJhd2FibGUvaWNfbXJfYnV0dG9uX2dyZXk8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVUdkljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX3ZvbF90eXBlX3R2X2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlU3BlYWtlckljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVTcGVha2VyR3JvdXBJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0PC9pdGVtPgorCisgICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVDb250cm9sUGFuZWxUaGVtZU92ZXJsYXkiPkBudWxsPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iVGhlbWUuTWVkaWFSb3V0ZXIuTGlnaHQuRGFya0NvbnRyb2xQYW5lbCI+CisgICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVDb250cm9sUGFuZWxUaGVtZU92ZXJsYXkiPkBzdHlsZS9UaGVtZU92ZXJsYXkuTWVkaWFSb3V0ZXIuRGFyazwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IlRoZW1lT3ZlcmxheS5NZWRpYVJvdXRlci5EYXJrIiBwYXJlbnQ9ImFuZHJvaWQ6VGhlbWUuTWF0ZXJpYWwiPgorICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGxheURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGxheV9kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGF1c2VEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3BhdXNlX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVTdG9wRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2Rhcms8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVBdWRpb1RyYWNrRHJhd2FibGUiPkBkcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2Rhcms8L2l0ZW0+CisKKyAgICA8L3N0eWxlPgorICAgIDxzdHlsZSBuYW1lPSJUaGVtZU92ZXJsYXkuTWVkaWFSb3V0ZXIuTGlnaHQiIHBhcmVudD0iYW5kcm9pZDpUaGVtZS5NYXRlcmlhbC5MaWdodCI+CisgICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVQbGF5RHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGF1c2VEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3BhdXNlX2xpZ2h0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlU3RvcERyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUF1ZGlvVHJhY2tEcmF3YWJsZSI+QGRyYXdhYmxlL21yX3ZvbF90eXBlX2F1ZGlvdHJhY2tfbGlnaHQ8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcnVuY3RzLnNoIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3J1bmN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWIxYTFlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3J1bmN0cy5zaApAQCAtMCwwICsxLDIyNCBAQAorIyEvYmluL2Jhc2gKKyMgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBVc2FnZSAnLiBydW5jdHMuc2gnCisKK2Z1bmN0aW9uIF9ydW50ZXN0X2N0c19tZWRpYWNvbXBvbmVudF91c2FnZSgpIHsKKyAgZWNobyAncnVudGVzdC1jdHMtTWVkaWFDb21wb25lbnRzIFtvcHRpb25dOiBCdWlsZCwgZmxhc2ggZGV2aWNlLCcKKyAgZWNobyAnICAgICAgICAgICAgICBhbmQgcnVuIHN1YnNldCBvZiBDdHNNZWRpYVRlc3RDYXNlcyB0aGF0IE1lZGlhQ29tcG9uZW50cyBjb3ZlcnMuJworICBlY2hvICcgICAgICAgICAgKldhcm5pbmcqIFRoaXMgYnlwYXNzZXMgQ1RTIHNldHVwIChlLmcuIGRvd25sb2FkIG1lZGlhIGNvbnRlbnRzIGZyb20gc2VydmVyKScKKyAgZWNobyAnICAgICAgICAgIEZvciBydW5uaW5nIENUUyBpbiBvZmZpY2lhbCB3YXksIHVzZSBhdGVzdCBvciBjdHMtdHJhZGVmZWQgJworICBlY2hvICcgICAgIC1ofC0taGVscDogVGhpcyBoZWxwJworICBlY2hvICcgICAgIC0tc2tpcDogU2tpcCBidWlsZCBhbmQgZmxhc2guIEp1c3QgcmVydW4tdGVzdHMnCisgIGVjaG8gJyAgICAgLS1taW46IE9ubHkgcmVidWlsZCB0ZXN0cyBhbmQgdXBkYXRhYmxlIGxpYnJhcnkuJworICBlY2hvICcgICAgIC0tdGVzdDogT25seSByZWJ1aWxkIHRlc3RzJworICBlY2hvICcgICAgIC1zIFtkZXZpY2VfaWRdOiBTcGVjaWZ5IGEgZGV2aWNlIG5hbWUgdG8gcnVuIHRlc3QgYWdhaW5zdC4nCisgIGVjaG8gJyAgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gZGVmaW5lICR7QURCSE9TVH0gaW5zdGVhZC4nCisgIGVjaG8gJyAgICAgLXIgW2NvdW50XTogUmVwZWF0IHRlc3RzIGZvciBnaXZlbiBjb3VudC4gSXQgd2lsbCBzdG9wIHdoZW4gZmFpbHMuJworICBlY2hvICcgICAgIC0taWdub3JlOiBLZWVwIHJlcGVhdGluZyB0ZXN0cyBldmVuIHdoZW4gaXQgZmFpbHMuJworICBlY2hvICcgICAgIC10IFt0ZXN0XTogT25seSBydW4gdGhlIHNwZWNpZmljIHRlc3QuIENhbiBiZSBlaXRoZXIgYSBjbGFzcyBvciBhIG1ldGhvZC4nCit9CisKK2Z1bmN0aW9uIHJ1bnRlc3QtY3RzLU1lZGlhQ29tcG9uZW50cygpIHsKKyAgIyBFZGl0IGhlcmUgaWYgeW91IHdhbnQgdG8gc3VwcG9ydCBvdGhlciB0ZXN0cy4KKyAgIyBMaXN0IHVwIGxpYnMgYW5kIGFwa3MgaW4gdGhlIG1lZGlhX2FwaSBuZWVkZWQgZm9yIHRlc3RzLCBhbmQgcGxhY2UgdGVzdCB0YXJnZXQgYXQgdGhlIGxhc3QuCisgIGxvY2FsIFRFU1RfUEFDS0FHRV9ESVI9KCJmcmFtZXdvcmtzL2F2L3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0IikKKyAgbG9jYWwgVEVTVF9QQUNLQUdFPSgiYW5kcm9pZC5tZWRpYS5jdHMiKQorICBsb2NhbCBCVUlMRF9UQVJHRVRTPSgiTWVkaWFDb21wb25lbnRzIiAiQ3RzTWVkaWFUZXN0Q2FzZXMiKQorICAjIERvbid0IGluY2x1ZGUgTWVkaWFDb21wb25lbnRzIC0tIGlmIHdlIHNpbXBseSBpbnN0YWxsIGl0LCBzeXN0ZW0gc2VydmVyCisgICMgd291bGRuJ3QgdXNlIHRoZSBpbnN0YWxsZWQgb25lLgorICBsb2NhbCBJTlNUQUxMX1RBUkdFVFM9KCJDdHNNZWRpYVRlc3RDYXNlcyIpCisgIGxvY2FsIFRFU1RfUlVOTkVSPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgorICBsb2NhbCBERVBFTkRFTkNJRVM9KCJtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQiICJhbmRyb2lkLXN1cHBvcnQtdGVzdCIgImNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwiKQorICBsb2NhbCBERUZBVUxUX1RFU1RfVEFSR0VUPSIiCisgIERFRkFVTFRfVEVTVF9UQVJHRVQrPSJhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYUJyb3dzZXIyVGVzdCIKKyAgREVGQVVMVF9URVNUX1RBUkdFVCs9IixhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYUNvbnRyb2xsZXIyVGVzdCIKKyAgREVGQVVMVF9URVNUX1RBUkdFVCs9IixhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYU1ldGFkYXRhMlRlc3QiCisgIERFRkFVTFRfVEVTVF9UQVJHRVQrPSIsYW5kcm9pZC5tZWRpYS5jdHMuTWVkaWFTZXNzaW9uMlRlc3QiCisgIERFRkFVTFRfVEVTVF9UQVJHRVQrPSIsYW5kcm9pZC5tZWRpYS5jdHMuTWVkaWFTZXNzaW9uMl9QZXJtaXNzaW9uVGVzdCIKKyAgREVGQVVMVF9URVNUX1RBUkdFVCs9IixhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYVNlc3Npb25NYW5hZ2VyX01lZGlhU2Vzc2lvbjJUZXN0IgorICBERUZBVUxUX1RFU1RfVEFSR0VUKz0iLGFuZHJvaWQubWVkaWEuY3RzLlNlc3Npb25Ub2tlbjJUZXN0IgorICBpZiBbWyAteiAiJHtBTkRST0lEX0JVSUxEX1RPUH0iIF1dOyB0aGVuCisgICAgZWNobyAiTmVlZHMgdG8gbHVuY2ggYSB0YXJnZXQgZmlyc3QiCisgICAgcmV0dXJuCisgIGZpCisKKyAgbG9jYWwgb2xkX3BhdGg9JHtPTERQV0R9CisgIHdoaWxlIHRydWU7IGRvCisgICAgbG9jYWwgT1BUSU9OX1NLSVA9ImZhbHNlIgorICAgIGxvY2FsIE9QVElPTl9NSU49ImZhbHNlIgorICAgIGxvY2FsIE9QVElPTl9URVNUPSJmYWxzZSIKKyAgICBsb2NhbCBPUFRJT05fUkVQRUFUX0NPVU5UPSIxIgorICAgIGxvY2FsIE9QVElPTl9JR05PUkU9ImZhbHNlIgorICAgIGxvY2FsIE9QVElPTl9URVNUX1RBUkdFVD0iJHtERUZBVUxUX1RFU1RfVEFSR0VUfSIKKyAgICBsb2NhbCBhZGJob3N0X2xvY2FsCisgICAgd2hpbGUgKCggIiQjIiApKTsgZG8KKyAgICAgIGNhc2UgIiR7MX0iIGluCisgICAgICAgIC1ofC0taGVscCkKKyAgICAgICAgICBfcnVudGVzdF9jdHNfbWVkaWFjb21wb25lbnRfdXNhZ2UKKyAgICAgICAgICByZXR1cm4KKyAgICAgICAgICA7OworICAgICAgICAtLXNraXApCisgICAgICAgICAgT1BUSU9OX1NLSVA9InRydWUiCisgICAgICAgICAgOzsKKyAgICAgICAgLS1taW4pCisgICAgICAgICAgT1BUSU9OX01JTj0idHJ1ZSIKKyAgICAgICAgICA7OworICAgICAgICAtLXRlc3QpCisgICAgICAgICAgT1BUSU9OX1RFU1Q9InRydWUiCisgICAgICAgICAgOzsKKyAgICAgICAgLXMpCisgICAgICAgICAgc2hpZnQKKyAgICAgICAgICBhZGJob3N0X2xvY2FsPSR7MX0KKyAgICAgICAgICA7OworICAgICAgICAtcikKKyAgICAgICAgICBzaGlmdAorICAgICAgICAgIE9QVElPTl9SRVBFQVRfQ09VTlQ9IiR7MX0iCisgICAgICAgICAgOzsKKyAgICAgICAgLS1pZ25vcmUpCisgICAgICAgICAgT1BUSU9OX0lHTk9SRT0idHJ1ZSIKKyAgICAgICAgICA7OworICAgICAgICAtdCkKKyAgICAgICAgICBzaGlmdAorICAgICAgICAgIE9QVElPTl9URVNUX1RBUkdFVD0iJHsxfSIKKyAgICAgIGVzYWMKKyAgICAgIHNoaWZ0CisgICAgZG9uZQorCisgICAgIyBCdWlsZCBhZGIgY29tbWFuZC4KKyAgICBsb2NhbCBhZGIKKyAgICBpZiBbWyAteiAiJHthZGJob3N0X2xvY2FsfSIgXV07IHRoZW4KKyAgICAgIGFkYmhvc3RfbG9jYWw9JHtBREJIT1NUfQorICAgIGZpCisgICAgaWYgW1sgLXogIiR7YWRiaG9zdF9sb2NhbH0iIF1dOyB0aGVuCisgICAgICBsb2NhbCBkZXZpY2VfY291bnQ9JChhZGIgZGV2aWNlcyB8IHNlZCAnL15bWzpzcGFjZTpdXSokL2QnIHwgd2MgLWwpCisgICAgICBpZiBbWyAiJHtkZXZpY2VfY291bnR9IiAhPSAiMiIgXV07IHRoZW4KKyAgICAgICAgZWNobyAiVG9vIG1hbnkgZGV2aWNlcy4gU3BlY2lmeSBhIGRldmljZS4iICYmIGJyZWFrCisgICAgICBmaQorICAgICAgYWRiPSJhZGIiCisgICAgZWxzZQorICAgICAgYWRiPSJhZGIgLXMgJHthZGJob3N0X2xvY2FsfSIKKyAgICBmaQorCisgICAgbG9jYWwgdGFyZ2V0X2Rpcj0iJHtBTkRST0lEX0JVSUxEX1RPUH0vJHtURVNUX1BBQ0tBR0VfRElSfSIKKyAgICAjbG9jYWwgVEVTVF9QQUNLQUdFPSQoc2VkIC1uICdzL14uKlxicGFja2FnZVxiPSJcKFthLXowLTlcLl0qXCkiLiokL1wxL3AnICR7dGFyZ2V0X2Rpcn0vQW5kcm9pZE1hbmlmZXN0LnhtbCkKKworICAgIGlmIFtbICIke09QVElPTl9TS0lQfSIgIT0gInRydWUiIF1dOyB0aGVuCisgICAgICAjIEJ1aWxkIGRlcGVuZGVuY2llcyBpZiBuZWVkZWQuCisgICAgICBsb2NhbCBkZXBlbmRlbmN5CisgICAgICBsb2NhbCBidWlsZF9kZXBlbmRlbmN5PSIiCisgICAgICBmb3IgZGVwZW5kZW5jeSBpbiAke0RFUEVOREVOQ0lFU1tAXX07IGRvCisgICAgICAgIGlmIFtbICIke2RlcGVuZGVuY3l9IiA9PSAib3V0LyIqIF1dOyB0aGVuCisgICAgICAgICAgaWYgW1sgISAtZiAke0FORFJPSURfQlVJTERfVE9QfS8ke2RlcGVuZGVuY3l9IF1dOyB0aGVuCisgICAgICAgICAgICBidWlsZF9kZXBlbmRlbmN5PSJ0cnVlIgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICBmaQorICAgICAgICBlbHNlCisgICAgICAgICAgaWYgW1sgIiQoZmluZCAke09VVH0gLW5hbWUgJHtkZXBlbmRlbmN5fV9pbnRlcm1lZGlhdGVzIHwgd2MgLWwpIiA9PSAiMCIgXV07IHRoZW4KKyAgICAgICAgICAgIGJ1aWxkX2RlcGVuZGVuY3k9InRydWUiCisgICAgICAgICAgICBicmVhaworICAgICAgICAgIGZpCisgICAgICAgIGZpCisgICAgICBkb25lCisgICAgICBpZiBbWyAiJHtidWlsZF9kZXBlbmRlbmN5fSIgPT0gInRydWUiIF1dOyB0aGVuCisgICAgICAgIGVjaG8gIkJ1aWxkaW5nIGRlcGVuZGVuY2llcy4gV2lsbCBvbmx5IHByaW50IHN0ZGVyci4iCisgICAgICAgIG0gJHtERVBFTkRFTkNJRVNbQF19IC1qID4gL2Rldi9udWxsCisgICAgICBmaQorCisgICAgICAjIEJ1aWxkIHRlc3QgYXBrIGFuZCByZXF1aXJlZCBhcGsuCisgICAgICBsb2NhbCBidWlsZF90YXJnZXRzCisgICAgICBpZiBbWyAiJHtPUFRJT05fVEVTVH0iID09ICJ0cnVlIiBdXTsgdGhlbgorICAgICAgICBidWlsZF90YXJnZXRzPSIke0lOU1RBTExfVEFSR0VUU1tAXX0iCisgICAgICBlbGlmIFtbICIke09QVElPTl9NSU59IiA9PSAidHJ1ZSIgXV07IHRoZW4KKyAgICAgICAgYnVpbGRfdGFyZ2V0cz0iJHtCVUlMRF9UQVJHRVRTW0BdfSIKKyAgICAgIGVsc2UKKyAgICAgICAgYnVpbGRfdGFyZ2V0cz0iJHtCVUlMRF9UQVJHRVRTW0BdfSBkcm9pZCIKKyAgICAgIGZpCisgICAgICBtICR7YnVpbGRfdGFyZ2V0c30gLWogfHwgYnJlYWsKKworICAgICAgaWYgW1sgIiR7T1BUSU9OX1RFU1R9IiAhPSAidHJ1ZSIgXV07IHRoZW4KKyAgICAgICAgIyBGbGFzaCBvbmx5IHdoZW4gbmVlZGVkCisgICAgICAgIGxvY2FsIGRldmljZV9idWlsZF90eXBlPSIkKCR7YWRifSBzaGVsbCBnZXRwcm9wIHJvLmJ1aWxkLnR5cGUpIgorICAgICAgICBpZiBbWyAiJHtkZXZpY2VfYnVpbGRfdHlwZX0iID09ICJ1c2VyIiBdXTsgdGhlbgorICAgICAgICAgICMgVXNlciBidWlsZC4gQ2Fubm90IGFkYiBzeW5jCisgICAgICAgICAgJHthZGJ9IHJlYm9vdCBib290bG9hZGVyCisgICAgICAgICAgZmFzdGJvb3QgZmxhc2hhbGwKKyAgICAgICAgZWxzZQorICAgICAgICAgICR7YWRifSByb290CisgICAgICAgICAgbG9jYWwgZGV2aWNlX3Zlcml0eV9tb2RlPSIkKCR7YWRifSBzaGVsbCBnZXRwcm9wIHJvLmJvb3QudmVyaXR5bW9kZSkiCisgICAgICAgICAgaWYgW1sgIiR7ZGV2aWNlX3Zlcml0eV9tb2RlfSIgIT0gImRpc2FibGVkIiBdXTsgdGhlbgorICAgICAgICAgICAgJHthZGJ9IGRpc2FibGUtdmVyaXR5CisgICAgICAgICAgICAke2FkYn0gcmVib290CisgICAgICAgICAgICAke2FkYn0gd2FpdC1mb3ItZGV2aWNlIHx8IGJyZWFrCisgICAgICAgICAgICAke2FkYn0gcm9vdAorICAgICAgICAgIGZpCisgICAgICAgICAgJHthZGJ9IHJlbW91bnQKKyAgICAgICAgICAke2FkYn0gc2hlbGwgc3RvcAorICAgICAgICAgICR7YWRifSBzaGVsbCBzZXRwcm9wIGxvZy50YWcuTWVkaWFTZXNzaW9uU2VydmljZSBERUJVRworICAgICAgICAgICR7YWRifSBzeW5jCisgICAgICAgICAgJHthZGJ9IHNoZWxsIHN0YXJ0CisgICAgICAgIGZpCisgICAgICAgICR7YWRifSB3YWl0LWZvci1kZXZpY2UgfHwgYnJlYWsKKyAgICAgICAgIyBFbnN1cmUgcGFja2FnZSBtYW5hZ2VyIGlzIGxvYWRlZC4KKyAgICAgICAgIyBUT0RPKGphZXdhbik6IEZpbmQgYmV0dGVyIHdheSB0byB3YWl0CisgICAgICAgIHNsZWVwIDE1CisgICAgICBmaQorCisgICAgICAjIEluc3RhbGwgYXBrcworICAgICAgbG9jYWwgaW5zdGFsbF9mYWlsZWQ9ImZhbHNlIgorICAgICAgZm9yIHRhcmdldCBpbiAke0lOU1RBTExfVEFSR0VUU1tAXX07IGRvCisgICAgICAgIGxvY2FsIGFwa19wYXRoPSQoZmluZCAke09VVH0vc3lzdGVtICR7T1VUfS9kYXRhIC1uYW1lICR7dGFyZ2V0fS5hcGspCisgICAgICAgIGxvY2FsIGFwa19udW09JChmaW5kICR7T1VUfS9zeXN0ZW0gJHtPVVR9L2RhdGEgLW5hbWUgJHt0YXJnZXR9LmFwayB8IHdjIC1sKQorICAgICAgICBpZiBbWyAiJHthcGtfbnVtfSIgIT0gIjEiIF1dOyB0aGVuCisgICAgICAgICAgZWNobyAiQ2Fubm90IGxvY2F0ZSBhICR7dGFyZ2V0fS5hcGsuIEZvdW5kICR7YXBrX251bX0gYXBrcyIgJiYgYnJlYWsKKyAgICAgICAgZmkKKyAgICAgICAgZWNobyAiSW5zdGFsbGluZyAke3RhcmdldH0uYXBrLiBwYXRoPSR7YXBrX3BhdGh9IgorICAgICAgICAke2FkYn0gaW5zdGFsbCAtciAke2Fwa19wYXRofQorICAgICAgICBpZiBbWyAiJHs/fSIgIT0gIjAiIF1dOyB0aGVuCisgICAgICAgICAgaW5zdGFsbF9mYWlsZWQ9InRydWUiCisgICAgICAgICAgYnJlYWsKKyAgICAgICAgZmkKKyAgICAgIGRvbmUKKyAgICAgIGlmIFtbICIke2luc3RhbGxfZmFpbGVkfSIgPT0gInRydWUiIF1dOyB0aGVuCisgICAgICAgIGVjaG8gIkZhaWxlZCB0byBpbnN0YWxsLiBUZXN0IHdvdWxkbid0IHJ1bi4iCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGZpCisKKyAgICBsb2NhbCB0ZXN0X3RhcmdldD0iIgorICAgIGlmIFtbIC1uICIke09QVElPTl9URVNUX1RBUkdFVH0iIF1dOyB0aGVuCisgICAgICB0ZXN0X3RhcmdldD0iLWUgY2xhc3MgJHtPUFRJT05fVEVTVF9UQVJHRVR9IgorICAgIGZpCisKKyAgICBsb2NhbCBpCisgICAgbG9jYWwgdG1wZmlsZT0kKHRlbXBmaWxlKQorICAgIGZvciAoKGk9MTsgaSA8PSAke09QVElPTl9SRVBFQVRfQ09VTlR9OyBpKyspKTsgZG8KKyAgICAgIGVjaG8gIlJ1biB0ZXN0ICR7aX0vJHtPUFRJT05fUkVQRUFUX0NPVU5UfSIKKyAgICAgICR7YWRifSBzaGVsbCBhbSBpbnN0cnVtZW50ICR7dGVzdF90YXJnZXR9IC13ICR7VEVTVF9QQUNLQUdFfS8ke1RFU1RfUlVOTkVSfSA+JiAke3RtcGZpbGV9CisgICAgICBjYXQgJHt0bXBmaWxlfQorICAgICAgaWYgW1sgIiR7T1BUSU9OX0lHTk9SRX0iICE9ICJ0cnVlIiBdXTsgdGhlbgorICAgICAgICBpZiBbWyAtbiAiJChncmVwICR7dG1wZmlsZX0gLWUgJ0ZBSUxVUkVcfGNyYXNoZWQnKSIgXV07IHRoZW4KKyAgICAgICAgICAjIGFtIGluc3RydW1lbnQgZG9lc24ndCByZXR1cm4gZXJyb3IgY29kZSBzbyBuZWVkIHRvIGdyZXAgcmVzdWx0IG1lc3NhZ2UgaW5zdGVhZAorICAgICAgICAgIGJyZWFrCisgICAgICAgIGZpCisgICAgICBmaQorICAgIGRvbmUKKyAgICBybSAke3RtcGZpbGV9CisgICAgYnJlYWsKKyAgZG9uZQorfQorCitlY2hvICJGb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBhZGRlZCB0byB5b3VyIGVudmlyb25tZW50OiIKK19ydW50ZXN0X2N0c19tZWRpYWNvbXBvbmVudF91c2FnZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFDb250cm9sbGVyMi5haWRsIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFDb250cm9sbGVyMi5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ODhiNzAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL0lNZWRpYUNvbnRyb2xsZXIyLmFpZGwKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKKworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLklNZWRpYVNlc3Npb24yOworCisvKioKKyAqIEludGVyZmFjZSBmcm9tIE1lZGlhU2Vzc2lvbjIgdG8gTWVkaWFDb250cm9sbGVyMi4KKyAqIDxwPgorICogS2VlcCB0aGlzIGludGVyZmFjZSBvbmV3YXkuIE90aGVyd2lzZSBhIG1hbGljaW91cyBhcHAgbWF5IGltcGxlbWVudCBmYWtlIHZlcnNpb24gb2YgdGhpcywKKyAqIGFuZCBob2xkcyBjYWxscyBmcm9tIHNlc3Npb24gdG8gbWFrZSBzZXNzaW9uIG93bmVyKHMpIGZyb3plbi4KKyAqLworLy8gVE9ETyhqYWV3YW4pOiAoUG9zdCBQKSBIYW5kbGUgd2hlbiB0aGUgcGxheWxpc3QgYmVjb21lcyB0b28gaHVnZS4KKy8vICAgICAgICAgICAgICAgTm90ZSB0aGF0IFBhcmNlbGxlZFNsaWNlTGlzdCBpc24ndCBhIGdvb2QgaWRlYSBmb3IgdGhlIHB1cnBvc2UuIChzZWU6IGIvMzc0OTM2NzcpCitvbmV3YXkgaW50ZXJmYWNlIElNZWRpYUNvbnRyb2xsZXIyIHsKKyAgICB2b2lkIG9uUGxheWVyU3RhdGVDaGFuZ2VkKGludCBzdGF0ZSk7CisgICAgdm9pZCBvblBvc2l0aW9uQ2hhbmdlZChsb25nIGV2ZW50VGltZU1zLCBsb25nIHBvc2l0aW9uTXMpOworICAgIHZvaWQgb25QbGF5YmFja1NwZWVkQ2hhbmdlZChmbG9hdCBzcGVlZCk7CisgICAgdm9pZCBvbkJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkKGxvbmcgYnVmZmVyZWRQb3NpdGlvbk1zKTsKKyAgICB2b2lkIG9uUGxheWxpc3RDaGFuZ2VkKGluIExpc3Q8QnVuZGxlPiBwbGF5bGlzdCwgaW4gQnVuZGxlIG1ldGFkYXRhKTsKKyAgICB2b2lkIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoaW4gQnVuZGxlIG1ldGFkYXRhKTsKKyAgICB2b2lkIG9uUGxheWJhY2tJbmZvQ2hhbmdlZChpbiBCdW5kbGUgcGxheWJhY2tJbmZvKTsKKyAgICB2b2lkIG9uUmVwZWF0TW9kZUNoYW5nZWQoaW50IHJlcGVhdE1vZGUpOworICAgIHZvaWQgb25TaHVmZmxlTW9kZUNoYW5nZWQoaW50IHNodWZmbGVNb2RlKTsKKyAgICB2b2lkIG9uRXJyb3IoaW50IGVycm9yQ29kZSwgaW4gQnVuZGxlIGV4dHJhcyk7CisKKyAgICB2b2lkIG9uQ29ubmVjdGVkKElNZWRpYVNlc3Npb24yIHNlc3Npb25CaW5kZXIsIGluIEJ1bmRsZSBjb21tYW5kR3JvdXAsCisgICAgICAgICAgICBpbnQgcGxheWVyU3RhdGUsIGxvbmcgcG9zaXRpb25FdmVudFRpbWVNcywgbG9uZyBwb3NpdGlvbk1zLCBmbG9hdCBwbGF5YmFja1NwZWVkLAorICAgICAgICAgICAgbG9uZyBidWZmZXJlZFBvc2l0aW9uTXMsIGluIEJ1bmRsZSBwbGF5YmFja0luZm8sIGludCByZXBlYXRNb2RlLCBpbnQgc2h1ZmZsZU1vZGUsCisgICAgICAgICAgICBpbiBMaXN0PEJ1bmRsZT4gcGxheWxpc3QsIGluIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5KTsKKyAgICB2b2lkIG9uRGlzY29ubmVjdGVkKCk7CisKKyAgICB2b2lkIG9uQ3VzdG9tTGF5b3V0Q2hhbmdlZChpbiBMaXN0PEJ1bmRsZT4gY29tbWFuZEJ1dHRvbmxpc3QpOworICAgIHZvaWQgb25BbGxvd2VkQ29tbWFuZHNDaGFuZ2VkKGluIEJ1bmRsZSBjb21tYW5kcyk7CisKKyAgICB2b2lkIG9uQ3VzdG9tQ29tbWFuZChpbiBCdW5kbGUgY29tbWFuZCwgaW4gQnVuZGxlIGFyZ3MsIGluIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBCcm93c2VyIHNlcGNpZmljCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIHZvaWQgb25HZXRMaWJyYXJ5Um9vdERvbmUoaW4gQnVuZGxlIHJvb3RIaW50cywgU3RyaW5nIHJvb3RNZWRpYUlkLCBpbiBCdW5kbGUgcm9vdEV4dHJhKTsKKyAgICB2b2lkIG9uR2V0SXRlbURvbmUoU3RyaW5nIG1lZGlhSWQsIGluIEJ1bmRsZSByZXN1bHQpOworICAgIHZvaWQgb25DaGlsZHJlbkNoYW5nZWQoU3RyaW5nIHJvb3RNZWRpYUlkLCBpbnQgaXRlbUNvdW50LCBpbiBCdW5kbGUgZXh0cmFzKTsKKyAgICB2b2lkIG9uR2V0Q2hpbGRyZW5Eb25lKFN0cmluZyBwYXJlbnRJZCwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwgaW4gTGlzdDxCdW5kbGU+IHJlc3VsdCwKKyAgICAgICAgICAgIGluIEJ1bmRsZSBleHRyYXMpOworICAgIHZvaWQgb25TZWFyY2hSZXN1bHRDaGFuZ2VkKFN0cmluZyBxdWVyeSwgaW50IGl0ZW1Db3VudCwgaW4gQnVuZGxlIGV4dHJhcyk7CisgICAgdm9pZCBvbkdldFNlYXJjaFJlc3VsdERvbmUoU3RyaW5nIHF1ZXJ5LCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLCBpbiBMaXN0PEJ1bmRsZT4gcmVzdWx0LAorICAgICAgICAgICAgaW4gQnVuZGxlIGV4dHJhcyk7Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL0lNZWRpYVNlc3Npb24yLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL0lNZWRpYVNlc3Npb24yLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY0NDY3ZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvSU1lZGlhU2Vzc2lvbjIuYWlkbApAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5JTWVkaWFDb250cm9sbGVyMjsKKworLyoqCisgKiBJbnRlcmZhY2UgZnJvbSBNZWRpYUNvbnRyb2xsZXIyIHRvIE1lZGlhU2Vzc2lvbjIuCisgKiA8cD4KKyAqIEtlZXAgdGhpcyBpbnRlcmZhY2Ugb25ld2F5LiBPdGhlcndpc2UgYSBtYWxpY2lvdXMgYXBwIG1heSBpbXBsZW1lbnQgZmFrZSB2ZXJzaW9uIG9mIHRoaXMsCisgKiBhbmQgaG9sZHMgY2FsbHMgZnJvbSBzZXNzaW9uIHRvIG1ha2Ugc2Vzc2lvbiBvd25lcihzKSBmcm96ZW4uCisgKi8KKyAvLyBUT0RPKGphZXdhbik6IChQb3N0IFApIEhhbmRsZSB3aGVuIHRoZSBwbGF5bGlzdCBiZWNvbWVzIHRvbyBodWdlLgorIC8vICAgICAgICAgICAgICAgTm90ZSB0aGF0IFBhcmNlbGxlZFNsaWNlTGlzdCBpc24ndCBhIGdvb2QgaWRlYSBmb3IgdGhlIHB1cnBvc2UuIChzZWU6IGIvMzc0OTM2NzcpCitvbmV3YXkgaW50ZXJmYWNlIElNZWRpYVNlc3Npb24yIHsKKyAgICAvLyBUT0RPKGphZXdhbik6IGFkZCBvbkNvbW1hbmQoKSB0byBzZW5kIHByaXZhdGUgY29tbWFuZAorCisgICAgLy8gVE9ETyhqYWV3YW4pOiAoUG9zdCBQKSBXZSBtYXkgY29uc2lkZXIgdG8gYWRkIGFub3RoZXIgYmluZGVyIGp1c3QgZm9yIHRoZSBjb25uZWN0aW9uCisgICAgLy8gICAgICAgICAgICAgICBub3QgdG8gZXhwb3NlIG90aGVyIG1ldGhvZHMgdG8gdGhlIGNvbnRyb2xsZXIgd2hvc2UgY29ubmVjdGlvbiB3YXNuJ3QgYWNjZXB0ZWQuCisgICAgLy8gICAgICAgICAgICAgICBCdXQgdGhpcyB3b3VsZCBiZSBlbm91Z2ggZm9yIG5vdyBiZWNhdXNlIGl0J3MgdGhlIHNhbWUgYXMgZXhpc3RpbmcKKyAgICAvLyAgICAgICAgICAgICAgIE1lZGlhQnJvd3NlciBhbmQgTWVkaWFCcm93c2VyU2VydmljZS4KKyAgICB2b2lkIGNvbm5lY3QoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgY2FsbGluZ1BhY2thZ2UpOworICAgIHZvaWQgcmVsZWFzZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIpOworCisgICAgdm9pZCBzZXRWb2x1bWVUbyhJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCB2YWx1ZSwgaW50IGZsYWdzKTsKKyAgICB2b2lkIGFkanVzdFZvbHVtZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBkaXJlY3Rpb24sIGludCBmbGFncyk7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gc2VuZCBjb21tYW5kCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIHZvaWQgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwKKyAgICAgICAgICAgIGludCBjb21tYW5kQ29kZSwgaW4gQnVuZGxlIGFyZ3MpOworICAgIHZvaWQgc2VuZEN1c3RvbUNvbW1hbmQoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbiBCdW5kbGUgY29tbWFuZCwgaW4gQnVuZGxlIGFyZ3MsCisgICAgICAgICAgICBpbiBSZXN1bHRSZWNlaXZlciByZWNlaXZlcik7CisKKyAgICB2b2lkIHByZXBhcmVGcm9tVXJpKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gVXJpIHVyaSwgaW4gQnVuZGxlIGV4dHJhcyk7CisgICAgdm9pZCBwcmVwYXJlRnJvbVNlYXJjaChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBxdWVyeSwgaW4gQnVuZGxlIGV4dHJhcyk7CisgICAgdm9pZCBwcmVwYXJlRnJvbU1lZGlhSWQoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgbWVkaWFJZCwgaW4gQnVuZGxlIGV4dHJhcyk7CisgICAgdm9pZCBwbGF5RnJvbVVyaShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGluIFVyaSB1cmksIGluIEJ1bmRsZSBleHRyYXMpOworICAgIHZvaWQgcGxheUZyb21TZWFyY2goSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcXVlcnksIGluIEJ1bmRsZSBleHRyYXMpOworICAgIHZvaWQgcGxheUZyb21NZWRpYUlkKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIG1lZGlhSWQsIGluIEJ1bmRsZSBleHRyYXMpOworICAgIHZvaWQgc2V0UmF0aW5nKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIG1lZGlhSWQsIGluIEJ1bmRsZSByYXRpbmcpOworCisgICAgdm9pZCBzZXRQbGF5bGlzdChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGluIExpc3Q8QnVuZGxlPiBwbGF5bGlzdCwgaW4gQnVuZGxlIG1ldGFkYXRhKTsKKyAgICB2b2lkIHVwZGF0ZVBsYXlsaXN0TWV0YWRhdGEoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbiBCdW5kbGUgbWV0YWRhdGEpOworICAgIHZvaWQgYWRkUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IGluZGV4LCBpbiBCdW5kbGUgbWVkaWFJdGVtKTsKKyAgICB2b2lkIHJlbW92ZVBsYXlsaXN0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGluIEJ1bmRsZSBtZWRpYUl0ZW0pOworICAgIHZvaWQgcmVwbGFjZVBsYXlsaXN0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBpbmRleCwgaW4gQnVuZGxlIG1lZGlhSXRlbSk7CisgICAgdm9pZCBza2lwVG9QbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbiBCdW5kbGUgbWVkaWFJdGVtKTsKKyAgICB2b2lkIHNraXBUb1ByZXZpb3VzSXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIpOworICAgIHZvaWQgc2tpcFRvTmV4dEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyKTsKKyAgICB2b2lkIHNldFJlcGVhdE1vZGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgcmVwZWF0TW9kZSk7CisgICAgdm9pZCBzZXRTaHVmZmxlTW9kZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBzaHVmZmxlTW9kZSk7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gbGlicmFyeSBzZXJ2aWNlIHNwZWNpZmljCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIHZvaWQgZ2V0TGlicmFyeVJvb3QoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbiBCdW5kbGUgcm9vdEhpbnRzKTsKKyAgICB2b2lkIGdldEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgbWVkaWFJZCk7CisgICAgdm9pZCBnZXRDaGlsZHJlbihJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBwYXJlbnRJZCwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwKKyAgICAgICAgICAgIGluIEJ1bmRsZSBleHRyYXMpOworICAgIHZvaWQgc2VhcmNoKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIHF1ZXJ5LCBpbiBCdW5kbGUgZXh0cmFzKTsKKyAgICB2b2lkIGdldFNlYXJjaFJlc3VsdChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBxdWVyeSwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwKKyAgICAgICAgICAgIGluIEJ1bmRsZSBleHRyYXMpOworICAgIHZvaWQgc3Vic2NyaWJlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIHBhcmVudElkLCBpbiBCdW5kbGUgZXh0cmFzKTsKKyAgICB2b2lkIHVuc3Vic2NyaWJlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIHBhcmVudElkKTsKK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFCcm93c2VyMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFCcm93c2VyMkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTA5MDk5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUJyb3dzZXIySW1wbC5qYXZhCkBAIC0wLDAgKzEsMjM3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUJyb3dzZXIyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFCcm93c2VyMi5Ccm93c2VyQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFCcm93c2VyMlByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOworCitwdWJsaWMgY2xhc3MgTWVkaWFCcm93c2VyMkltcGwgZXh0ZW5kcyBNZWRpYUNvbnRyb2xsZXIySW1wbCBpbXBsZW1lbnRzIE1lZGlhQnJvd3NlcjJQcm92aWRlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhQnJvd3NlcjIiOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFRPRE8oamFld2FuKTogY2hhbmdlLgorCisgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYUJyb3dzZXIyIG1JbnN0YW5jZTsKKyAgICBwcml2YXRlIGZpbmFsIE1lZGlhQnJvd3NlcjIuQnJvd3NlckNhbGxiYWNrIG1DYWxsYmFjazsKKworICAgIHB1YmxpYyBNZWRpYUJyb3dzZXIySW1wbChDb250ZXh0IGNvbnRleHQsIE1lZGlhQnJvd3NlcjIgaW5zdGFuY2UsIFNlc3Npb25Ub2tlbjIgdG9rZW4sCisgICAgICAgICAgICBFeGVjdXRvciBleGVjdXRvciwgQnJvd3NlckNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGluc3RhbmNlLCB0b2tlbiwgZXhlY3V0b3IsIGNhbGxiYWNrKTsKKyAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7CisgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgIH0KKworICAgIEBPdmVycmlkZSBNZWRpYUJyb3dzZXIyIGdldEluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gKE1lZGlhQnJvd3NlcjIpIHN1cGVyLmdldEluc3RhbmNlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZ2V0TGlicmFyeVJvb3RfaW1wbChCdW5kbGUgcm9vdEhpbnRzKSB7CisgICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXIoKTsKKyAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJpbmRlci5nZXRMaWJyYXJ5Um9vdChnZXRDb250cm9sbGVyU3R1YigpLCByb290SGludHMpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgorICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3Vic2NyaWJlX2ltcGwoU3RyaW5nIHBhcmVudElkLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJlbnRJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcigpOworICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYmluZGVyLnN1YnNjcmliZShnZXRDb250cm9sbGVyU3R1YigpLCBwYXJlbnRJZCwgZXh0cmFzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgZGlzY29ubmVjdC4KKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHVuc3Vic2NyaWJlX2ltcGwoU3RyaW5nIHBhcmVudElkKSB7CisgICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJlbnRJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcigpOworICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYmluZGVyLnVuc3Vic2NyaWJlKGdldENvbnRyb2xsZXJTdHViKCksIHBhcmVudElkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgZGlzY29ubmVjdC4KKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGdldEl0ZW1faW1wbChTdHJpbmcgbWVkaWFJZCkgeworICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVyKCk7CisgICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBiaW5kZXIuZ2V0SXRlbShnZXRDb250cm9sbGVyU3R1YigpLCBtZWRpYUlkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgZGlzY29ubmVjdC4KKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGdldENoaWxkcmVuX2ltcGwoU3RyaW5nIHBhcmVudElkLCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJlbnRJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChwYWdlIDwgMSB8fCBwYWdlU2l6ZSA8IDEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5laXRoZXIgcGFnZSBub3IgcGFnZVNpemUgc2hvdWxkIGJlIGxlc3MgdGhhbiAxIik7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVyKCk7CisgICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBiaW5kZXIuZ2V0Q2hpbGRyZW4oZ2V0Q29udHJvbGxlclN0dWIoKSwgcGFyZW50SWQsIHBhZ2UsIHBhZ2VTaXplLCBleHRyYXMpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgorICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2VhcmNoX2ltcGwoU3RyaW5nIHF1ZXJ5LCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInF1ZXJ5IHNob3VsZG4ndCBiZSBlbXB0eSIpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXIoKTsKKyAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJpbmRlci5zZWFyY2goZ2V0Q29udHJvbGxlclN0dWIoKSwgcXVlcnksIGV4dHJhcyk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlIGRpc2Nvbm5lY3QuCisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBnZXRTZWFyY2hSZXN1bHRfaW1wbChTdHJpbmcgcXVlcnksIGludCBwYWdlLCBpbnQgcGFnZVNpemUsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicXVlcnkgc2hvdWxkbid0IGJlIGVtcHR5Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhZ2UgPCAxIHx8IHBhZ2VTaXplIDwgMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTmVpdGhlciBwYWdlIG5vciBwYWdlU2l6ZSBzaG91bGQgYmUgbGVzcyB0aGFuIDEiKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVyKCk7CisgICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBiaW5kZXIuZ2V0U2VhcmNoUmVzdWx0KGdldENvbnRyb2xsZXJTdHViKCksIHF1ZXJ5LCBwYWdlLCBwYWdlU2l6ZSwgZXh0cmFzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgZGlzY29ubmVjdC4KKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uR2V0TGlicmFyeVJvb3REb25lKAorICAgICAgICAgICAgZmluYWwgQnVuZGxlIHJvb3RIaW50cywgZmluYWwgU3RyaW5nIHJvb3RNZWRpYUlkLCBmaW5hbCBCdW5kbGUgcm9vdEV4dHJhKSB7CisgICAgICAgIGdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKKyAgICAgICAgICAgIG1DYWxsYmFjay5vbkdldExpYnJhcnlSb290RG9uZShnZXRJbnN0YW5jZSgpLCByb290SGludHMsIHJvb3RNZWRpYUlkLCByb290RXh0cmEpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkdldEl0ZW1Eb25lKFN0cmluZyBtZWRpYUlkLCBNZWRpYUl0ZW0yIGl0ZW0pIHsKKyAgICAgICAgZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4geworICAgICAgICAgICAgbUNhbGxiYWNrLm9uR2V0SXRlbURvbmUoZ2V0SW5zdGFuY2UoKSwgbWVkaWFJZCwgaXRlbSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uR2V0Q2hpbGRyZW5Eb25lKFN0cmluZyBwYXJlbnRJZCwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwgTGlzdDxNZWRpYUl0ZW0yPiByZXN1bHQsCisgICAgICAgICAgICBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIGdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKKyAgICAgICAgICAgIG1DYWxsYmFjay5vbkdldENoaWxkcmVuRG9uZShnZXRJbnN0YW5jZSgpLCBwYXJlbnRJZCwgcGFnZSwgcGFnZVNpemUsIHJlc3VsdCwgZXh0cmFzKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25TZWFyY2hSZXN1bHRDaGFuZ2VkKFN0cmluZyBxdWVyeSwgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICBnZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7CisgICAgICAgICAgICBtQ2FsbGJhY2sub25TZWFyY2hSZXN1bHRDaGFuZ2VkKGdldEluc3RhbmNlKCksIHF1ZXJ5LCBpdGVtQ291bnQsIGV4dHJhcyk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uR2V0U2VhcmNoUmVzdWx0RG9uZShTdHJpbmcgcXVlcnksIGludCBwYWdlLCBpbnQgcGFnZVNpemUsIExpc3Q8TWVkaWFJdGVtMj4gcmVzdWx0LAorICAgICAgICAgICAgQnVuZGxlIGV4dHJhcykgeworICAgICAgICBnZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7CisgICAgICAgICAgICBtQ2FsbGJhY2sub25HZXRTZWFyY2hSZXN1bHREb25lKGdldEluc3RhbmNlKCksIHF1ZXJ5LCBwYWdlLCBwYWdlU2l6ZSwgcmVzdWx0LCBleHRyYXMpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkNoaWxkcmVuQ2hhbmdlZChmaW5hbCBTdHJpbmcgcGFyZW50SWQsIGludCBpdGVtQ291bnQsIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4geworICAgICAgICAgICAgbUNhbGxiYWNrLm9uQ2hpbGRyZW5DaGFuZ2VkKGdldEluc3RhbmNlKCksIHBhcmVudElkLCBpdGVtQ291bnQsIGV4dHJhcyk7CisgICAgICAgIH0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFDb250cm9sbGVyMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFDb250cm9sbGVyMkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDkzNjVhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUNvbnRyb2xsZXIySW1wbC5qYXZhCkBAIC0wLDAgKzEsMTE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VUX1ZPTFVNRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX0FERF9JVEVNOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfUkVNT1ZFX0lURU07CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9SRVBMQUNFX0lURU07CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfTElTVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9MSVNUX01FVEFEQVRBOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX1JFUEVBVF9NT0RFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX1NIVUZGTEVfTU9ERTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX01FRElBX0lEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fU0VBUkNIOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fVVJJOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fTUVESUFfSUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9TRUFSQ0g7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9VUkk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjIuQ29udHJvbGxlckNhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMi5QbGF5YmFja0luZm87CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQuUmVwZWF0TW9kZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudC5TaHVmZmxlTW9kZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29tbWFuZEJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kR3JvdXAyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5SYXRpbmcyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUNvbnRyb2xsZXIyUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlVzZXJIYW5kbGU7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uR3VhcmRlZEJ5OworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7CisKK3B1YmxpYyBjbGFzcyBNZWRpYUNvbnRyb2xsZXIySW1wbCBpbXBsZW1lbnRzIE1lZGlhQ29udHJvbGxlcjJQcm92aWRlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYUNvbnRyb2xsZXIyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gVE9ETyhqYWV3YW4pOiBDaGFuZ2UKKworICAgIHByaXZhdGUgZmluYWwgTWVkaWFDb250cm9sbGVyMiBtSW5zdGFuY2U7CisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOworCisgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYUNvbnRyb2xsZXIyU3R1YiBtQ29udHJvbGxlclN0dWI7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uVG9rZW4yIG1Ub2tlbjsKKyAgICBwcml2YXRlIGZpbmFsIENvbnRyb2xsZXJDYWxsYmFjayBtQ2FsbGJhY2s7CisgICAgcHJpdmF0ZSBmaW5hbCBFeGVjdXRvciBtQ2FsbGJhY2tFeGVjdXRvcjsKKyAgICBwcml2YXRlIGZpbmFsIElCaW5kZXIuRGVhdGhSZWNpcGllbnQgbURlYXRoUmVjaXBpZW50OworCisgICAgQEd1YXJkZWRCeSgibUxvY2siKQorICAgIHByaXZhdGUgU2Vzc2lvblNlcnZpY2VDb25uZWN0aW9uIG1TZXJ2aWNlQ29ubmVjdGlvbjsKKyAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc1JlbGVhc2VkOworICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKKyAgICBwcml2YXRlIExpc3Q8TWVkaWFJdGVtMj4gbVBsYXlsaXN0OworICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKKyAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGEyIG1QbGF5bGlzdE1ldGFkYXRhOworICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKKyAgICBwcml2YXRlIEBSZXBlYXRNb2RlIGludCBtUmVwZWF0TW9kZTsKKyAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCisgICAgcHJpdmF0ZSBAU2h1ZmZsZU1vZGUgaW50IG1TaHVmZmxlTW9kZTsKKyAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCisgICAgcHJpdmF0ZSBpbnQgbVBsYXllclN0YXRlOworICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKKyAgICBwcml2YXRlIGxvbmcgbVBvc2l0aW9uRXZlbnRUaW1lTXM7CisgICAgQEd1YXJkZWRCeSgibUxvY2siKQorICAgIHByaXZhdGUgbG9uZyBtUG9zaXRpb25NczsKKyAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCisgICAgcHJpdmF0ZSBmbG9hdCBtUGxheWJhY2tTcGVlZDsKKyAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCisgICAgcHJpdmF0ZSBsb25nIG1CdWZmZXJlZFBvc2l0aW9uTXM7CisgICAgQEd1YXJkZWRCeSgibUxvY2siKQorICAgIHByaXZhdGUgUGxheWJhY2tJbmZvIG1QbGF5YmFja0luZm87CisgICAgQEd1YXJkZWRCeSgibUxvY2siKQorICAgIHByaXZhdGUgUGVuZGluZ0ludGVudCBtU2Vzc2lvbkFjdGl2aXR5OworICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKKyAgICBwcml2YXRlIFNlc3Npb25Db21tYW5kR3JvdXAyIG1BbGxvd2VkQ29tbWFuZHM7CisKKyAgICAvLyBBc3NpZ25tZW50IHNob3VsZCBiZSB1c2VkIHdpdGggdGhlIGxvY2sgaG9sZCwgYnV0IHNob3VsZCBiZSB1c2VkIHdpdGhvdXQgYSBsb2NrIHRvIHByZXZlbnQKKyAgICAvLyBwb3RlbnRpYWwgZGVhZGxvY2suCisgICAgLy8gUG9zdGZpeCAtQmluZGVyIGlzIGFkZGVkIHRvIGV4cGxpY2l0bHkgc2hvdyB0aGF0IGl0J3MgcG90ZW50aWFsbHkgcmVtb3RlIHByb2Nlc3MgY2FsbC4KKyAgICAvLyBUZWNobmljYWxseSAtSW50ZXJmYWNlIGlzIG1vcmUgY29ycmVjdCwgYnV0IGl0IG1heSBtaXNyZWFkIHRoYXQgaXQncyBpbnRlcmZhY2UgKHZzIGNsYXNzKQorICAgIC8vIHNvIGxldCdzIGtlZXAgdGhpcyBwb3N0Zml4IHVudGlsIHdlIGZpbmQgYmV0dGVyIHBvc3RmaXguCisgICAgQEd1YXJkZWRCeSgibUxvY2siKQorICAgIHByaXZhdGUgdm9sYXRpbGUgSU1lZGlhU2Vzc2lvbjIgbVNlc3Npb25CaW5kZXI7CisKKyAgICAvLyBUT0RPKGphZXdhbik6IFJlcXVpcmUgc2Vzc2lvbiBhY3RpdmVuZXNzIGNoYW5nZWQgbGlzdGVuZXIsIGJlY2F1c2UgY29udHJvbGxlciBjYW4gYmUKKyAgICAvLyAgICAgICAgICAgICAgIGF2YWlsYWJsZSB3aGVuIHRoZSBzZXNzaW9uJ3MgcGxheWVyIGlzIG51bGwuCisgICAgcHVibGljIE1lZGlhQ29udHJvbGxlcjJJbXBsKENvbnRleHQgY29udGV4dCwgTWVkaWFDb250cm9sbGVyMiBpbnN0YW5jZSwgU2Vzc2lvblRva2VuMiB0b2tlbiwKKyAgICAgICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yLCBDb250cm9sbGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7CisgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRleHQgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodG9rZW4gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidG9rZW4gc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXhlY3V0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZXhlY3V0b3Igc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1Db250cm9sbGVyU3R1YiA9IG5ldyBNZWRpYUNvbnRyb2xsZXIyU3R1Yih0aGlzKTsKKyAgICAgICAgbVRva2VuID0gdG9rZW47CisgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvciA9IGV4ZWN1dG9yOworICAgICAgICBtRGVhdGhSZWNpcGllbnQgPSAoKSAtPiB7CisgICAgICAgICAgICBtSW5zdGFuY2UuY2xvc2UoKTsKKyAgICAgICAgfTsKKworICAgICAgICBtU2Vzc2lvbkJpbmRlciA9IG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKyAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBNb3JlIHNhbml0eSBjaGVja3MuCisgICAgICAgIGlmIChtVG9rZW4uZ2V0VHlwZSgpID09IFNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OKSB7CisgICAgICAgICAgICAvLyBTZXNzaW9uCisgICAgICAgICAgICBtU2VydmljZUNvbm5lY3Rpb24gPSBudWxsOworICAgICAgICAgICAgY29ubmVjdFRvU2Vzc2lvbihTZXNzaW9uVG9rZW4ySW1wbC5mcm9tKG1Ub2tlbikuZ2V0U2Vzc2lvbkJpbmRlcigpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFNlc3Npb24gc2VydmljZQorICAgICAgICAgICAgaWYgKFByb2Nlc3MubXlVaWQoKSA9PSBQcm9jZXNzLlNZU1RFTV9VSUQpIHsKKyAgICAgICAgICAgICAgICAvLyBJdCdzIHN5c3RlbSBzZXJ2ZXIgKE1lZGlhU2Vzc2lvblNlcnZpY2UpIHRoYXQgd2FudHMgdG8gbW9uaXRvciBzZXNzaW9uLgorICAgICAgICAgICAgICAgIC8vIERvbid0IGJpbmQgaWYgYWJsZS4uCisgICAgICAgICAgICAgICAgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gU2Vzc2lvblRva2VuMkltcGwuZnJvbShtVG9rZW4pLmdldFNlc3Npb25CaW5kZXIoKTsKKyAgICAgICAgICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGJpbmRlciBpbiB0aGUgc2Vzc2lvbiB0b2tlbiBpbnN0ZWFkIG9mIGJpbmQgYnkgaXRzIG93bi4KKyAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHNlcnZlciB3aWxsIGhvbGRzIHRoZSBiaW5kaW5nIHRvIHRoZSBzZXJ2aWNlICpmb3JldmVyKiBhbmQgc2VydmljZQorICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIG5ldmVyIHN0b3AuCisgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlQ29ubmVjdGlvbiA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RUb1Nlc3Npb24oU2Vzc2lvblRva2VuMkltcGwuZnJvbShtVG9rZW4pLmdldFNlc3Npb25CaW5kZXIoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNob3VsZCBoYXBwZW4gb25seSB3aGVuIHN5c3RlbSBzZXJ2ZXIgd2FudHMgdG8gZGlzcGF0Y2ggbWVkaWEga2V5IGV2ZW50cyB0bworICAgICAgICAgICAgICAgICAgICAvLyBhIGRlYWQgc2VydmljZS4KKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU3lzdGVtIHNlcnZlciBiaW5kcyB0byBhIHNlc3Npb24gc2VydmljZS4gU2hvdWxkIHVuYmluZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHVzZS4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU2VydmljZUNvbm5lY3Rpb24gPSBuZXcgU2Vzc2lvblNlcnZpY2VDb25uZWN0aW9uKCk7CisgICAgICAgICAgICBjb25uZWN0VG9TZXJ2aWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY29ubmVjdFRvU2VydmljZSgpIHsKKyAgICAgICAgLy8gU2VydmljZS4gTmVlZHMgdG8gZ2V0IGZyZXNoIGJpbmRlciB3aGVuZXZlciBjb25uZWN0aW9uIGlzIG5lZWRlZC4KKyAgICAgICAgU2Vzc2lvblRva2VuMkltcGwgaW1wbCA9IFNlc3Npb25Ub2tlbjJJbXBsLmZyb20obVRva2VuKTsKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFTZXNzaW9uU2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UpOworICAgICAgICBpbnRlbnQuc2V0Q2xhc3NOYW1lKG1Ub2tlbi5nZXRQYWNrYWdlTmFtZSgpLCBpbXBsLmdldFNlcnZpY2VOYW1lKCkpOworCisgICAgICAgIC8vIFVzZSBiaW5kU2VydmljZSgpIGluc3RlYWQgb2Ygc3RhcnRGb3JlZ3JvdW5kU2VydmljZSgpIHRvIHN0YXJ0IHNlc3Npb24gc2VydmljZSBmb3IgdGhyZWUKKyAgICAgICAgLy8gcmVhc29ucy4KKyAgICAgICAgLy8gMS4gUHJldmVudCBzZXNzaW9uIHNlcnZpY2Ugb3duZXIncyBzdG9wU2VsZigpIGZyb20gZGVzdHJveWluZyBzZXJ2aWNlLgorICAgICAgICAvLyAgICBXaXRoIHRoZSBzdGFydEZvcmVncm91bmRTZXJ2aWNlKCksIHNlcnZpY2UncyBjYWxsIG9mIHN0b3BTZWxmKCkgd2lsbCB0cmlnZ2VyIGltbWVkaWF0ZQorICAgICAgICAvLyAgICBvbkRlc3Ryb3koKSBjYWxscyBvbiB0aGUgbWFpbiB0aHJlYWQgZXZlbiB3aGVuIG9uQ29ubmVjdCgpIGlzIHJ1bm5pbmcgaW4gYW5vdGhlcgorICAgICAgICAvLyAgICB0aHJlYWQuCisgICAgICAgIC8vIDIuIE1pbmltaXplIEFQSXMgZm9yIGRldmVsb3BlcnMgdG8gdGFrZSBjYXJlIGFib3V0LgorICAgICAgICAvLyAgICBXaXRoIGJpbmRTZXJ2aWNlKCksIGRldmVsb3BlcnMgb25seSBuZWVkIHRvIHRha2UgY2FyZSBhYm91dCBTZXJ2aWNlLm9uQmluZCgpCisgICAgICAgIC8vICAgIGJ1dCBTZXJ2aWNlLm9uU3RhcnRDb21tYW5kKCkgc2hvdWxkIGJlIGFsc28gdGFrZW4gY2FyZSBhYm91dCB3aXRoIHRoZQorICAgICAgICAvLyAgICBzdGFydEZvcmVncm91bmRTZXJ2aWNlKCkuCisgICAgICAgIC8vIDMuIEZ1dHVyZSBzdXBwb3J0IGZvciBVSS1sZXNzIHBsYXliYWNrCisgICAgICAgIC8vICAgIElmIGEgc2VydmljZSB3YW50cyB0byBrZWVwIHJ1bm5pbmcsIGl0IHNob3VsZCBiZSBlaXRoZXIgZm9yZWdyb3VuZCBzZXJ2aWNlIG9yCisgICAgICAgIC8vICAgIGJvdW5kZWQgc2VydmljZS4gQnV0IHRoZXJlIGhhZCBiZWVuIHJlcXVlc3QgZm9yIHRoZSBmZWF0dXJlIGZvciBzeXN0ZW0gYXBwcworICAgICAgICAvLyAgICBhbmQgdXNpbmcgYmluZFNlcnZpY2UoKSB3aWxsIGJlIGJldHRlciBmaXQgd2l0aCBpdC4KKyAgICAgICAgYm9vbGVhbiByZXN1bHQ7CisgICAgICAgIGlmIChQcm9jZXNzLm15VWlkKCkgPT0gUHJvY2Vzcy5TWVNURU1fVUlEKSB7CisgICAgICAgICAgICAvLyBVc2UgYmluZFNlcnZpY2VBc1VzZXIoKSBmb3IgYmluZGluZyBmcm9tIHN5c3RlbSBzZXJ2aWNlIHRvIGF2b2lkIGZvbGxvd2luZyB3YXJuaW5nLgorICAgICAgICAgICAgLy8gQ29udGV4dEltcGw6IENhbGxpbmcgYSBtZXRob2QgaW4gdGhlIHN5c3RlbSBwcm9jZXNzIHdpdGhvdXQgYSBxdWFsaWZpZWQgdXNlcgorICAgICAgICAgICAgcmVzdWx0ID0gbUNvbnRleHQuYmluZFNlcnZpY2VBc1VzZXIoaW50ZW50LCBtU2VydmljZUNvbm5lY3Rpb24sIENvbnRleHQuQklORF9BVVRPX0NSRUFURSwKKyAgICAgICAgICAgICAgICAgICAgVXNlckhhbmRsZS5nZXRVc2VySGFuZGxlRm9yVWlkKG1Ub2tlbi5nZXRVaWQoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzdWx0ID0gbUNvbnRleHQuYmluZFNlcnZpY2UoaW50ZW50LCBtU2VydmljZUNvbm5lY3Rpb24sIENvbnRleHQuQklORF9BVVRPX0NSRUFURSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgImJpbmQgdG8gIiArIG1Ub2tlbiArICIgZmFpbGVkIik7CisgICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgImJpbmQgdG8gIiArIG1Ub2tlbiArICIgc3VjY2VzcyIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvbm5lY3RUb1Nlc3Npb24oSU1lZGlhU2Vzc2lvbjIgc2Vzc2lvbkJpbmRlcikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2Vzc2lvbkJpbmRlci5jb25uZWN0KG1Db250cm9sbGVyU3R1YiwgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdG8gY2FsbCBjb25uZWN0aW9uIHJlcXVlc3QuIEZyYW1ld29yayB3aWxsIHJldHJ5IgorICAgICAgICAgICAgICAgICAgICArICIgYXV0b21hdGljYWxseSIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2VfaW1wbCgpIHsKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJyZWxlYXNlIGZyb20gIiArIG1Ub2tlbik7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBpZiAobUlzUmVsZWFzZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IHJlLWVudGVyYW5jZSBmcm9tIHRoZSBDb250cm9sbGVyQ2FsbGJhY2sub25EaXNjb25uZWN0ZWQoKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Jc1JlbGVhc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChtU2VydmljZUNvbm5lY3Rpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Db250ZXh0LnVuYmluZFNlcnZpY2UobVNlcnZpY2VDb25uZWN0aW9uKTsKKyAgICAgICAgICAgICAgICBtU2VydmljZUNvbm5lY3Rpb24gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7CisgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlciA9IG51bGw7CisgICAgICAgICAgICBtQ29udHJvbGxlclN0dWIuZGVzdHJveSgpOworICAgICAgICB9CisgICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBiaW5kZXIuYXNCaW5kZXIoKS51bmxpbmtUb0RlYXRoKG1EZWF0aFJlY2lwaWVudCwgMCk7CisgICAgICAgICAgICAgICAgYmluZGVyLnJlbGVhc2UobUNvbnRyb2xsZXJTdHViKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gTm8tb3AuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7CisgICAgICAgICAgICBtQ2FsbGJhY2sub25EaXNjb25uZWN0ZWQobUluc3RhbmNlKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgSU1lZGlhU2Vzc2lvbjIgZ2V0U2Vzc2lvbkJpbmRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1TZXNzaW9uQmluZGVyOworICAgIH0KKworICAgIE1lZGlhQ29udHJvbGxlcjJTdHViIGdldENvbnRyb2xsZXJTdHViKCkgeworICAgICAgICByZXR1cm4gbUNvbnRyb2xsZXJTdHViOworICAgIH0KKworICAgIEV4ZWN1dG9yIGdldENhbGxiYWNrRXhlY3V0b3IoKSB7CisgICAgICAgIHJldHVybiBtQ2FsbGJhY2tFeGVjdXRvcjsKKyAgICB9CisKKyAgICBDb250ZXh0IGdldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBtQ29udGV4dDsKKyAgICB9CisKKyAgICBNZWRpYUNvbnRyb2xsZXIyIGdldEluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gbUluc3RhbmNlOworICAgIH0KKworICAgIC8vIFJldHVybnMgc2Vzc2lvbiBiaW5kZXIgaWYgdGhlIGNvbnRyb2xsZXIgY2FuIHNlbmQgdGhlIGNvbW1hbmQuCisgICAgSU1lZGlhU2Vzc2lvbjIgZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShpbnQgY29tbWFuZENvZGUpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgaWYgKCFtQWxsb3dlZENvbW1hbmRzLmhhc0NvbW1hbmQoY29tbWFuZENvZGUpKSB7CisgICAgICAgICAgICAgICAgLy8gQ2Fubm90IHNlbmQgYmVjYXVzZSBpc24ndCBhbGxvd2VkIHRvLgorICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRyb2xsZXIgaXNuJ3QgYWxsb3dlZCB0byBjYWxsIGNvbW1hbmQsIGNvbW1hbmRDb2RlPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgY29tbWFuZENvZGUpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFRPRE8oamFld2FuKTogU2hvdWxkIHdlIGRvIHRoaXMgd2l0aCB0aGUgbG9jayBob2xkPworICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKKyAgICAgICAgaWYgKGJpbmRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBDYW5ub3Qgc2VuZCBiZWNhdXNlIGRpc2Nvbm5lY3RlZC4KKyAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXMgZGlzY29ubmVjdGVkIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJpbmRlcjsKKyAgICB9CisKKyAgICAvLyBSZXR1cm5zIHNlc3Npb24gYmluZGVyIGlmIHRoZSBjb250cm9sbGVyIGNhbiBzZW5kIHRoZSBjb21tYW5kLgorICAgIElNZWRpYVNlc3Npb24yIGdldFNlc3Npb25CaW5kZXJJZkFibGUoU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgaWYgKCFtQWxsb3dlZENvbW1hbmRzLmhhc0NvbW1hbmQoY29tbWFuZCkpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb250cm9sbGVyIGlzbid0IGFsbG93ZWQgdG8gY2FsbCBjb21tYW5kLCBjb21tYW5kPSIgKyBjb21tYW5kKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPKGphZXdhbik6IFNob3VsZCB3ZSBkbyB0aGlzIHdpdGggdGhlIGxvY2sgaG9sZD8KKyAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7CisgICAgICAgIGlmIChiaW5kZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gQ2Fubm90IHNlbmQgYmVjYXVzZSBkaXNjb25uZWN0ZWQuCisgICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzIGRpc2Nvbm5lY3RlZCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBiaW5kZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNlc3Npb25Ub2tlbjIgZ2V0U2Vzc2lvblRva2VuX2ltcGwoKSB7CisgICAgICAgIHJldHVybiBtVG9rZW47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWRfaW1wbCgpIHsKKyAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7CisgICAgICAgIHJldHVybiBiaW5kZXIgIT0gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwbGF5X2ltcGwoKSB7CisgICAgICAgIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1BMQVkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHBhdXNlX2ltcGwoKSB7CisgICAgICAgIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1BBVVNFKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdG9wX2ltcGwoKSB7CisgICAgICAgIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1NUT1ApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNraXBUb1BsYXlsaXN0SXRlbV9pbXBsKE1lZGlhSXRlbTIgaXRlbSkgeworICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7CisgICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBiaW5kZXIuc2tpcFRvUGxheWxpc3RJdGVtKG1Db250cm9sbGVyU3R1YiwgaXRlbS50b0J1bmRsZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2tpcFRvUHJldmlvdXNJdGVtX2ltcGwoKSB7CisgICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOworICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYmluZGVyLnNraXBUb1ByZXZpb3VzSXRlbShtQ29udHJvbGxlclN0dWIpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0SXRlbV9pbXBsKCkgeworICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKKyAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJpbmRlci5za2lwVG9OZXh0SXRlbShtQ29udHJvbGxlclN0dWIpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKGludCBjb21tYW5kQ29kZSkgeworICAgICAgICBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoY29tbWFuZENvZGUsIG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoaW50IGNvbW1hbmRDb2RlLCBCdW5kbGUgYXJncykgeworICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKKyAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJpbmRlci5zZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQobUNvbnRyb2xsZXJTdHViLCBjb21tYW5kQ29kZSwgYXJncyk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQZW5kaW5nSW50ZW50IGdldFNlc3Npb25BY3Rpdml0eV9pbXBsKCkgeworICAgICAgICByZXR1cm4gbVNlc3Npb25BY3Rpdml0eTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRWb2x1bWVUb19pbXBsKGludCB2YWx1ZSwgaW50IGZsYWdzKSB7CisgICAgICAgIC8vIFRPRE8oaGRtb29uKTogc2FuaXR5IGNoZWNrCisgICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1NFVF9WT0xVTUUpOworICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYmluZGVyLnNldFZvbHVtZVRvKG1Db250cm9sbGVyU3R1YiwgdmFsdWUsIGZsYWdzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRqdXN0Vm9sdW1lX2ltcGwoaW50IGRpcmVjdGlvbiwgaW50IGZsYWdzKSB7CisgICAgICAgIC8vIFRPRE8oaGRtb29uKTogc2FuaXR5IGNoZWNrCisgICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1NFVF9WT0xVTUUpOworICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYmluZGVyLmFkanVzdFZvbHVtZShtQ29udHJvbGxlclN0dWIsIGRpcmVjdGlvbiwgZmxhZ3MpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbVVyaV9pbXBsKFVyaSB1cmksIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fVVJJKTsKKyAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1cmkgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYmluZGVyLnByZXBhcmVGcm9tVXJpKG1Db250cm9sbGVyU3R1YiwgdXJpLCBleHRyYXMpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZS4KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHByZXBhcmVGcm9tU2VhcmNoX2ltcGwoU3RyaW5nIHF1ZXJ5LCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoCisgICAgICAgICAgICAgICAgQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX1NFQVJDSCk7CisgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInF1ZXJ5IHNob3VsZG4ndCBiZSBlbXB0eSIpOworICAgICAgICB9CisgICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBiaW5kZXIucHJlcGFyZUZyb21TZWFyY2gobUNvbnRyb2xsZXJTdHViLCBxdWVyeSwgZXh0cmFzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUuCisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbU1lZGlhSWRfaW1wbChTdHJpbmcgbWVkaWFJZCwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKAorICAgICAgICAgICAgICAgIENPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9NRURJQV9JRCk7CisgICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1lZGlhSWQgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYmluZGVyLnByZXBhcmVGcm9tTWVkaWFJZChtQ29udHJvbGxlclN0dWIsIG1lZGlhSWQsIGV4dHJhcyk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlLgorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcGxheUZyb21VcmlfaW1wbChVcmkgdXJpLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX1VSSSk7CisgICAgICAgIGlmICh1cmkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidXJpIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJpbmRlci5wbGF5RnJvbVVyaShtQ29udHJvbGxlclN0dWIsIHVyaSwgZXh0cmFzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUuCisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwbGF5RnJvbVNlYXJjaF9pbXBsKFN0cmluZyBxdWVyeSwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9TRUFSQ0gpOworICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWVyeSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYmluZGVyLnBsYXlGcm9tU2VhcmNoKG1Db250cm9sbGVyU3R1YiwgcXVlcnksIGV4dHJhcyk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlLgorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcGxheUZyb21NZWRpYUlkX2ltcGwoU3RyaW5nIG1lZGlhSWQsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZSgKKyAgICAgICAgICAgICAgICBDT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fTUVESUFfSUQpOworICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJpbmRlci5wbGF5RnJvbU1lZGlhSWQobUNvbnRyb2xsZXJTdHViLCBtZWRpYUlkLCBleHRyYXMpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZS4KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFJhdGluZ19pbXBsKFN0cmluZyBtZWRpYUlkLCBSYXRpbmcyIHJhdGluZykgeworICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJhdGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyYXRpbmcgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOworICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYmluZGVyLnNldFJhdGluZyhtQ29udHJvbGxlclN0dWIsIG1lZGlhSWQsIHJhdGluZy50b0J1bmRsZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUuCisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZW5kQ3VzdG9tQ29tbWFuZF9pbXBsKFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBCdW5kbGUgYXJncywgUmVzdWx0UmVjZWl2ZXIgY2IpIHsKKyAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoY29tbWFuZCk7CisgICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBiaW5kZXIuc2VuZEN1c3RvbUNvbW1hbmQobUNvbnRyb2xsZXJTdHViLCBjb21tYW5kLnRvQnVuZGxlKCksIGFyZ3MsIGNiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8TWVkaWFJdGVtMj4gZ2V0UGxheWxpc3RfaW1wbCgpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgcmV0dXJuIG1QbGF5bGlzdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFBsYXlsaXN0X2ltcGwoTGlzdDxNZWRpYUl0ZW0yPiBsaXN0LCBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgeworICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsaXN0IHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX0xJU1QpOworICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIExpc3Q8QnVuZGxlPiBidW5kbGVMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBidW5kbGVMaXN0LmFkZChsaXN0LmdldChpKS50b0J1bmRsZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEJ1bmRsZSBtZXRhZGF0YUJ1bmRsZSA9IChtZXRhZGF0YSA9PSBudWxsKSA/IG51bGwgOiBtZXRhZGF0YS50b0J1bmRsZSgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBiaW5kZXIuc2V0UGxheWxpc3QobUNvbnRyb2xsZXJTdHViLCBidW5kbGVMaXN0LCBtZXRhZGF0YUJ1bmRsZSk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMiBnZXRQbGF5bGlzdE1ldGFkYXRhX2ltcGwoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIHJldHVybiBtUGxheWxpc3RNZXRhZGF0YTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBsYXlsaXN0TWV0YWRhdGFfaW1wbChNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgeworICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKAorICAgICAgICAgICAgICAgIENPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfTElTVF9NRVRBREFUQSk7CisgICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgQnVuZGxlIG1ldGFkYXRhQnVuZGxlID0gKG1ldGFkYXRhID09IG51bGwpID8gbnVsbCA6IG1ldGFkYXRhLnRvQnVuZGxlKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJpbmRlci51cGRhdGVQbGF5bGlzdE1ldGFkYXRhKG1Db250cm9sbGVyU3R1YiwgbWV0YWRhdGFCdW5kbGUpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwcmVwYXJlX2ltcGwoKSB7CisgICAgICAgIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1BSRVBBUkUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZhc3RGb3J3YXJkX2ltcGwoKSB7CisgICAgICAgIC8vIFRPRE8oamFld2FuKTogSW1wbGVtZW50IHRoaXMuIE5vdGUgdGhhdCBmYXN0IGZvcndhcmQgaXNuJ3QgYSB0cmFuc3BvcnQgY29tbWFuZCBhbnltb3JlCisgICAgICAgIC8vc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKE1lZGlhU2Vzc2lvbjIuQ09NTUFORF9DT0RFX1NFU1NJT05fRkFTVF9GT1JXQVJEKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXdpbmRfaW1wbCgpIHsKKyAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBJbXBsZW1lbnQgdGhpcy4gTm90ZSB0aGF0IHJld2luZCBpc24ndCBhIHRyYW5zcG9ydCBjb21tYW5kIGFueW1vcmUKKyAgICAgICAgLy9zZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoTWVkaWFTZXNzaW9uMi5DT01NQU5EX0NPREVfU0VTU0lPTl9SRVdJTkQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNlZWtUb19pbXBsKGxvbmcgcG9zKSB7CisgICAgICAgIGlmIChwb3MgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwb3NpdGlvbiBzaG91bGRuJ3QgYmUgbmVnYXRpdmUiKTsKKyAgICAgICAgfQorICAgICAgICBCdW5kbGUgYXJncyA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgYXJncy5wdXRMb25nKE1lZGlhU2Vzc2lvbjJTdHViLkFSR1VNRU5UX0tFWV9QT1NJVElPTiwgcG9zKTsKKyAgICAgICAgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUJBQ0tfU0VFS19UTywgYXJncyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkUGxheWxpc3RJdGVtX2ltcGwoaW50IGluZGV4LCBNZWRpYUl0ZW0yIGl0ZW0pIHsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW5kZXggc2hvdWxkbid0IGJlIG5lZ2F0aXZlIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1BMQVlMSVNUX0FERF9JVEVNKTsKKyAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJpbmRlci5hZGRQbGF5bGlzdEl0ZW0obUNvbnRyb2xsZXJTdHViLCBpbmRleCwgaXRlbS50b0J1bmRsZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtX2ltcGwoTWVkaWFJdGVtMiBpdGVtKSB7CisgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9QTEFZTElTVF9SRU1PVkVfSVRFTSk7CisgICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBiaW5kZXIucmVtb3ZlUGxheWxpc3RJdGVtKG1Db250cm9sbGVyU3R1YiwgaXRlbS50b0J1bmRsZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVwbGFjZVBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgTWVkaWFJdGVtMiBpdGVtKSB7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluZGV4IHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIpOworICAgICAgICB9CisgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9QTEFZTElTVF9SRVBMQUNFX0lURU0pOworICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYmluZGVyLnJlcGxhY2VQbGF5bGlzdEl0ZW0obUNvbnRyb2xsZXJTdHViLCBpbmRleCwgaXRlbS50b0J1bmRsZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRTaHVmZmxlTW9kZV9pbXBsKCkgeworICAgICAgICByZXR1cm4gbVNodWZmbGVNb2RlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFNodWZmbGVNb2RlX2ltcGwoaW50IHNodWZmbGVNb2RlKSB7CisgICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoCisgICAgICAgICAgICAgICAgQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9TSFVGRkxFX01PREUpOworICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYmluZGVyLnNldFNodWZmbGVNb2RlKG1Db250cm9sbGVyU3R1Yiwgc2h1ZmZsZU1vZGUpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFJlcGVhdE1vZGVfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIG1SZXBlYXRNb2RlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdE1vZGVfaW1wbChpbnQgcmVwZWF0TW9kZSkgeworICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfUkVQRUFUX01PREUpOworICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYmluZGVyLnNldFJlcGVhdE1vZGUobUNvbnRyb2xsZXJTdHViLCByZXBlYXRNb2RlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFBsYXliYWNrSW5mbyBnZXRQbGF5YmFja0luZm9faW1wbCgpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgcmV0dXJuIG1QbGF5YmFja0luZm87CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFBsYXllclN0YXRlX2ltcGwoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIHJldHVybiBtUGxheWVyU3RhdGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRDdXJyZW50UG9zaXRpb25faW1wbCgpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgbG9uZyB0aW1lRGlmZiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gbVBvc2l0aW9uRXZlbnRUaW1lTXM7CisgICAgICAgICAgICBsb25nIGV4cGVjdGVkUG9zaXRpb24gPSBtUG9zaXRpb25NcyArIChsb25nKSAobVBsYXliYWNrU3BlZWQgKiB0aW1lRGlmZik7CisgICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgZXhwZWN0ZWRQb3NpdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmxvYXQgZ2V0UGxheWJhY2tTcGVlZF9pbXBsKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrU3BlZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRCdWZmZXJlZFBvc2l0aW9uX2ltcGwoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIHJldHVybiBtQnVmZmVyZWRQb3NpdGlvbk1zOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1lZGlhSXRlbTIgZ2V0Q3VycmVudE1lZGlhSXRlbV9pbXBsKCkgeworICAgICAgICAvLyBUT0RPKGphZXdhbik6IEltcGxlbWVudAorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICB2b2lkIHB1c2hQbGF5ZXJTdGF0ZUNoYW5nZXMoZmluYWwgaW50IHN0YXRlKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIG1QbGF5ZXJTdGF0ZSA9IHN0YXRlOworICAgICAgICB9CisgICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4geworICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYWxsYmFjay5vblBsYXllclN0YXRlQ2hhbmdlZChtSW5zdGFuY2UsIHN0YXRlKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLy8gVE9ETyhqYWV3YW4pOiBSZW5hbWUgdG8gc2VlayBjb21wbGV0ZWQKKyAgICB2b2lkIHB1c2hQb3NpdGlvbkNoYW5nZXMoZmluYWwgbG9uZyBldmVudFRpbWVNcywgZmluYWwgbG9uZyBwb3NpdGlvbk1zKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIG1Qb3NpdGlvbkV2ZW50VGltZU1zID0gZXZlbnRUaW1lTXM7CisgICAgICAgICAgICBtUG9zaXRpb25NcyA9IHBvc2l0aW9uTXM7CisgICAgICAgIH0KKyAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7CisgICAgICAgICAgICBpZiAoIW1JbnN0YW5jZS5pc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNhbGxiYWNrLm9uU2Vla0NvbXBsZXRlZChtSW5zdGFuY2UsIHBvc2l0aW9uTXMpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICB2b2lkIHB1c2hQbGF5YmFja1NwZWVkQ2hhbmdlcyhmaW5hbCBmbG9hdCBzcGVlZCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBtUGxheWJhY2tTcGVlZCA9IHNwZWVkOworICAgICAgICB9CisgICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4geworICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYWxsYmFjay5vblBsYXliYWNrU3BlZWRDaGFuZ2VkKG1JbnN0YW5jZSwgc3BlZWQpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICB2b2lkIHB1c2hCdWZmZXJlZFBvc2l0aW9uQ2hhbmdlcyhmaW5hbCBsb25nIGJ1ZmZlcmVkUG9zaXRpb25NcykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBtQnVmZmVyZWRQb3NpdGlvbk1zID0gYnVmZmVyZWRQb3NpdGlvbk1zOworICAgICAgICB9CisgICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4geworICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogRml4IHRoaXMgLS0gaXQncyBub3cgYnVmZmVyZWQgc3RhdGUKKyAgICAgICAgICAgIC8vbUNhbGxiYWNrLm9uQnVmZmVyZWRQb3NpdGlvbkNoYW5nZWQobUluc3RhbmNlLCBidWZmZXJlZFBvc2l0aW9uTXMpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICB2b2lkIHB1c2hQbGF5YmFja0luZm9DaGFuZ2VzKGZpbmFsIFBsYXliYWNrSW5mbyBpbmZvKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIG1QbGF5YmFja0luZm8gPSBpbmZvOworICAgICAgICB9CisgICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4geworICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYWxsYmFjay5vblBsYXliYWNrSW5mb0NoYW5nZWQobUluc3RhbmNlLCBpbmZvKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgdm9pZCBwdXNoUGxheWxpc3RDaGFuZ2VzKGZpbmFsIExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3QsIGZpbmFsIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIG1QbGF5bGlzdCA9IHBsYXlsaXN0OworICAgICAgICAgICAgbVBsYXlsaXN0TWV0YWRhdGEgPSBtZXRhZGF0YTsKKyAgICAgICAgfQorICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKKyAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWQobUluc3RhbmNlLCBwbGF5bGlzdCwgbWV0YWRhdGEpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICB2b2lkIHB1c2hQbGF5bGlzdE1ldGFkYXRhQ2hhbmdlcyhNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBtUGxheWxpc3RNZXRhZGF0YSA9IG1ldGFkYXRhOworICAgICAgICB9CisgICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4geworICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYWxsYmFjay5vblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKG1JbnN0YW5jZSwgbWV0YWRhdGEpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICB2b2lkIHB1c2hTaHVmZmxlTW9kZUNoYW5nZXMoaW50IHNodWZmbGVNb2RlKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIG1TaHVmZmxlTW9kZSA9IHNodWZmbGVNb2RlOworICAgICAgICB9CisgICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4geworICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZChtSW5zdGFuY2UsIHNodWZmbGVNb2RlKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgdm9pZCBwdXNoUmVwZWF0TW9kZUNoYW5nZXMoaW50IHJlcGVhdE1vZGUpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgbVJlcGVhdE1vZGUgPSByZXBlYXRNb2RlOworICAgICAgICB9CisgICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4geworICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYWxsYmFjay5vblJlcGVhdE1vZGVDaGFuZ2VkKG1JbnN0YW5jZSwgcmVwZWF0TW9kZSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHZvaWQgcHVzaEVycm9yKGludCBlcnJvckNvZGUsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7CisgICAgICAgICAgICBpZiAoIW1JbnN0YW5jZS5pc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNhbGxiYWNrLm9uRXJyb3IobUluc3RhbmNlLCBlcnJvckNvZGUsIGV4dHJhcyk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8vIFNob3VsZCBiZSB1c2VkIHdpdGhvdXQgYSBsb2NrIHRvIHByZXZlbnQgcG90ZW50aWFsIGRlYWRsb2NrLgorICAgIHZvaWQgb25Db25uZWN0ZWROb3RMb2NrZWQoSU1lZGlhU2Vzc2lvbjIgc2Vzc2lvbkJpbmRlciwKKyAgICAgICAgICAgIGZpbmFsIFNlc3Npb25Db21tYW5kR3JvdXAyIGFsbG93ZWRDb21tYW5kcywKKyAgICAgICAgICAgIGZpbmFsIGludCBwbGF5ZXJTdGF0ZSwKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgcG9zaXRpb25FdmVudFRpbWVNcywKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgcG9zaXRpb25NcywKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IHBsYXliYWNrU3BlZWQsCisgICAgICAgICAgICBmaW5hbCBsb25nIGJ1ZmZlcmVkUG9zaXRpb25NcywKKyAgICAgICAgICAgIGZpbmFsIFBsYXliYWNrSW5mbyBpbmZvLAorICAgICAgICAgICAgZmluYWwgaW50IHJlcGVhdE1vZGUsCisgICAgICAgICAgICBmaW5hbCBpbnQgc2h1ZmZsZU1vZGUsCisgICAgICAgICAgICBmaW5hbCBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0LAorICAgICAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBzZXNzaW9uQWN0aXZpdHkpIHsKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJvbkNvbm5lY3RlZE5vdExvY2tlZCBzZXNzaW9uQmluZGVyPSIgKyBzZXNzaW9uQmluZGVyCisgICAgICAgICAgICAgICAgICAgICsgIiwgYWxsb3dlZENvbW1hbmRzPSIgKyBhbGxvd2VkQ29tbWFuZHMpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gY2xvc2UgPSBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uQmluZGVyID09IG51bGwgfHwgYWxsb3dlZENvbW1hbmRzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBDb25uZWN0aW9uIHJlamVjdGVkLgorICAgICAgICAgICAgICAgIGNsb3NlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Jc1JlbGVhc2VkKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1TZXNzaW9uQmluZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ2Fubm90IGJlIG5vdGlmaWVkIGFib3V0IHRoZSBjb25uZWN0aW9uIHJlc3VsdCBtYW55IHRpbWVzLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgUHJvYmFibHkgYSBidWcgb3IgbWFsaWNpb3VzIGFwcC4iKTsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2UgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1BbGxvd2VkQ29tbWFuZHMgPSBhbGxvd2VkQ29tbWFuZHM7CisgICAgICAgICAgICAgICAgbVBsYXllclN0YXRlID0gcGxheWVyU3RhdGU7CisgICAgICAgICAgICAgICAgbVBvc2l0aW9uRXZlbnRUaW1lTXMgPSBwb3NpdGlvbkV2ZW50VGltZU1zOworICAgICAgICAgICAgICAgIG1Qb3NpdGlvbk1zID0gcG9zaXRpb25NczsKKyAgICAgICAgICAgICAgICBtUGxheWJhY2tTcGVlZCA9IHBsYXliYWNrU3BlZWQ7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcmVkUG9zaXRpb25NcyA9IGJ1ZmZlcmVkUG9zaXRpb25NczsKKyAgICAgICAgICAgICAgICBtUGxheWJhY2tJbmZvID0gaW5mbzsKKyAgICAgICAgICAgICAgICBtUmVwZWF0TW9kZSA9IHJlcGVhdE1vZGU7CisgICAgICAgICAgICAgICAgbVNodWZmbGVNb2RlID0gc2h1ZmZsZU1vZGU7CisgICAgICAgICAgICAgICAgbVBsYXlsaXN0ID0gcGxheWxpc3Q7CisgICAgICAgICAgICAgICAgbVNlc3Npb25BY3Rpdml0eSA9IHNlc3Npb25BY3Rpdml0eTsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlciA9IHNlc3Npb25CaW5kZXI7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gZm9yIHRoZSBsb2NhbCBiaW5kZXIgaXMgbm8tb3AsCisgICAgICAgICAgICAgICAgICAgIC8vIHNvIGNhbiBiZSB1c2VkIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgZGVhZGxvY2suCisgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLmFzQmluZGVyKCkubGlua1RvRGVhdGgobURlYXRoUmVjaXBpZW50LCAwKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlNlc3Npb24gZGllZCB0b28gZWFybHkuIiwgZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2xvc2UgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBLZWVwIGNvbW1hbmRzIHRvIHByZXZlbnRzIGlsbGVnYWwgQVBJIGNhbGxzLgorICAgICAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7CisgICAgICAgICAgICAgICAgLy8gTm90ZTogV2UgbWF5IHRyaWdnZXIgQ29udHJvbGxlckNhbGxiYWNrcyB3aXRoIHRoZSBpbml0aWFsIHZhbHVlcworICAgICAgICAgICAgICAgIC8vIEJ1dCBpdCdzIGhhcmQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiB0aGUgY29udHJvbGxlciBjYWxsYmFja3MKKyAgICAgICAgICAgICAgICAvLyBPbmx5IG5vdGlmeSBhYm91dCB0aGUKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25Db25uZWN0ZWQobUluc3RhbmNlLCBhbGxvd2VkQ29tbWFuZHMpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoY2xvc2UpIHsKKyAgICAgICAgICAgICAgICAvLyBUcmljayB0byBjYWxsIHJlbGVhc2UoKSB3aXRob3V0IGhvbGRpbmcgdGhlIGxvY2ssIHRvIHByZXZlbnQgcG90ZW50aWFsIGRlYWRsb2NrCisgICAgICAgICAgICAgICAgLy8gd2l0aCB0aGUgZGV2ZWxvcGVyJ3MgY3VzdG9tIGxvY2sgd2l0aGluIHRoZSBDb250cm9sbGVyQ2FsbGJhY2sub25EaXNjb25uZWN0ZWQoKS4KKyAgICAgICAgICAgICAgICBtSW5zdGFuY2UuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgb25DdXN0b21Db21tYW5kKGZpbmFsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBmaW5hbCBCdW5kbGUgYXJncywKKyAgICAgICAgICAgIGZpbmFsIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKSB7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAib25DdXN0b21Db21tYW5kIGNtZD0iICsgY29tbWFuZCk7CisgICAgICAgIH0KKyAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7CisgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IERvdWJsZSBjaGVjayBpZiB0aGUgY29udHJvbGxlciBleGlzdHMuCisgICAgICAgICAgICBtQ2FsbGJhY2sub25DdXN0b21Db21tYW5kKG1JbnN0YW5jZSwgY29tbWFuZCwgYXJncywgcmVjZWl2ZXIpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICB2b2lkIG9uQWxsb3dlZENvbW1hbmRzQ2hhbmdlZChmaW5hbCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBjb21tYW5kcykgeworICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKKyAgICAgICAgICAgIG1DYWxsYmFjay5vbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQobUluc3RhbmNlLCBjb21tYW5kcyk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHZvaWQgb25DdXN0b21MYXlvdXRDaGFuZ2VkKGZpbmFsIExpc3Q8Q29tbWFuZEJ1dHRvbj4gbGF5b3V0KSB7CisgICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4geworICAgICAgICAgICAgbUNhbGxiYWNrLm9uQ3VzdG9tTGF5b3V0Q2hhbmdlZChtSW5zdGFuY2UsIGxheW91dCk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgb24gdGhlIG1haW4gdGhyZWFkLgorICAgIHByaXZhdGUgY2xhc3MgU2Vzc2lvblNlcnZpY2VDb25uZWN0aW9uIGltcGxlbWVudHMgU2VydmljZUNvbm5lY3Rpb24geworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSwgSUJpbmRlciBzZXJ2aWNlKSB7CisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgaXQncyBhbHdheXMgbWFpbi10aHJlYWQuCisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblNlcnZpY2VDb25uZWN0ZWQgIiArIG5hbWUgKyAiICIgKyB0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFNhbml0eSBjaGVjaworICAgICAgICAgICAgaWYgKCFtVG9rZW4uZ2V0UGFja2FnZU5hbWUoKS5lcXVhbHMobmFtZS5nZXRQYWNrYWdlTmFtZSgpKSkgeworICAgICAgICAgICAgICAgIExvZy53dGYoVEFHLCBuYW1lICsgIiB3YXMgY29ubmVjdGVkLCBidXQgZXhwZWN0ZWQgcGtnPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbVRva2VuLmdldFBhY2thZ2VOYW1lKCkgKyAiIHdpdGggaWQ9IiArIG1Ub2tlbi5nZXRJZCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBzZXNzaW9uQmluZGVyID0gSU1lZGlhU2Vzc2lvbjIuU3R1Yi5hc0ludGVyZmFjZShzZXJ2aWNlKTsKKyAgICAgICAgICAgIGNvbm5lY3RUb1Nlc3Npb24oc2Vzc2lvbkJpbmRlcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSkgeworICAgICAgICAgICAgLy8gVGVtcG9yYWwgbG9zZSBvZiB0aGUgYmluZGluZyBiZWNhdXNlIG9mIHRoZSBzZXJ2aWNlIGNyYXNoLiBTeXN0ZW0gd2lsbCBhdXRvbWF0aWNhbGx5CisgICAgICAgICAgICAvLyByZWJpbmQsIHNvIGp1c3Qgbm8tb3AuCisgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJlYWxseT8gRWl0aGVyIGRpc2Nvbm5lY3QgY2xlYW5seSBvcgorICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBzZXJ2aWNlICIgKyBuYW1lICsgIiBpcyBkaXNjb25uZWN0ZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25CaW5kaW5nRGllZChDb21wb25lbnROYW1lIG5hbWUpIHsKKyAgICAgICAgICAgIC8vIFBlcm1hbmVudCBsb3NlIG9mIHRoZSBiaW5kaW5nIGJlY2F1c2Ugb2YgdGhlIHNlcnZpY2UgcGFja2FnZSB1cGRhdGUgb3IgcmVtb3ZlZC4KKyAgICAgICAgICAgIC8vIFRoaXMgU2Vzc2lvblNlcnZpY2VSZWNvcmQgd2lsbCBiZSByZW1vdmVkIGFjY29yZGluZ2x5LCBidXQgZm9yZ2V0IHNlc3Npb24gYmluZGVyIGhlcmUKKyAgICAgICAgICAgIC8vIGZvciBzdXJlLgorICAgICAgICAgICAgbUluc3RhbmNlLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBsYXliYWNrSW5mb0ltcGwgaW1wbGVtZW50cyBQbGF5YmFja0luZm9Qcm92aWRlciB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QTEFZQkFDS19UWVBFID0KKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5wbGF5YmFja2luZm9faW1wbC5wbGF5YmFja190eXBlIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05UUk9MX1RZUEUgPQorICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLnBsYXliYWNraW5mb19pbXBsLmNvbnRyb2xfdHlwZSI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUFYX1ZPTFVNRSA9CisgICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEucGxheWJhY2tpbmZvX2ltcGwubWF4X3ZvbHVtZSI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ1VSUkVOVF9WT0xVTUUgPQorICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLnBsYXliYWNraW5mb19pbXBsLmN1cnJlbnRfdm9sdW1lIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BVURJT19BVFRSSUJVVEVTID0KKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5wbGF5YmFja2luZm9faW1wbC5hdWRpb19hdHRycyI7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQbGF5YmFja0luZm8gbUluc3RhbmNlOworCisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1QbGF5YmFja1R5cGU7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1Db250cm9sVHlwZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU1heFZvbHVtZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUN1cnJlbnRWb2x1bWU7CisgICAgICAgIHByaXZhdGUgZmluYWwgQXVkaW9BdHRyaWJ1dGVzIG1BdWRpb0F0dHJzOworCisgICAgICAgIHByaXZhdGUgUGxheWJhY2tJbmZvSW1wbChpbnQgcGxheWJhY2tUeXBlLCBBdWRpb0F0dHJpYnV0ZXMgYXR0cnMsIGludCBjb250cm9sVHlwZSwKKyAgICAgICAgICAgICAgICBpbnQgbWF4LCBpbnQgY3VycmVudCkgeworICAgICAgICAgICAgbVBsYXliYWNrVHlwZSA9IHBsYXliYWNrVHlwZTsKKyAgICAgICAgICAgIG1BdWRpb0F0dHJzID0gYXR0cnM7CisgICAgICAgICAgICBtQ29udHJvbFR5cGUgPSBjb250cm9sVHlwZTsKKyAgICAgICAgICAgIG1NYXhWb2x1bWUgPSBtYXg7CisgICAgICAgICAgICBtQ3VycmVudFZvbHVtZSA9IGN1cnJlbnQ7CisgICAgICAgICAgICBtSW5zdGFuY2UgPSBuZXcgUGxheWJhY2tJbmZvKHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tUeXBlX2ltcGwoKSB7CisgICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrVHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQXVkaW9BdHRyaWJ1dGVzIGdldEF1ZGlvQXR0cmlidXRlc19pbXBsKCkgeworICAgICAgICAgICAgcmV0dXJuIG1BdWRpb0F0dHJzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29udHJvbFR5cGVfaW1wbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ29udHJvbFR5cGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRNYXhWb2x1bWVfaW1wbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWF4Vm9sdW1lOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudFZvbHVtZV9pbXBsKCkgeworICAgICAgICAgICAgcmV0dXJuIG1DdXJyZW50Vm9sdW1lOworICAgICAgICB9CisKKyAgICAgICAgUGxheWJhY2tJbmZvIGdldEluc3RhbmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKKyAgICAgICAgfQorCisgICAgICAgIEJ1bmRsZSB0b0J1bmRsZSgpIHsKKyAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICBidW5kbGUucHV0SW50KEtFWV9QTEFZQkFDS19UWVBFLCBtUGxheWJhY2tUeXBlKTsKKyAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX0NPTlRST0xfVFlQRSwgbUNvbnRyb2xUeXBlKTsKKyAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX01BWF9WT0xVTUUsIG1NYXhWb2x1bWUpOworICAgICAgICAgICAgYnVuZGxlLnB1dEludChLRVlfQ1VSUkVOVF9WT0xVTUUsIG1DdXJyZW50Vm9sdW1lKTsKKyAgICAgICAgICAgIGJ1bmRsZS5wdXRQYXJjZWxhYmxlKEtFWV9BVURJT19BVFRSSUJVVEVTLCBtQXVkaW9BdHRycyk7CisgICAgICAgICAgICByZXR1cm4gYnVuZGxlOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIFBsYXliYWNrSW5mbyBjcmVhdGVQbGF5YmFja0luZm8oaW50IHBsYXliYWNrVHlwZSwgQXVkaW9BdHRyaWJ1dGVzIGF0dHJzLAorICAgICAgICAgICAgICAgIGludCBjb250cm9sVHlwZSwgaW50IG1heCwgaW50IGN1cnJlbnQpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGxheWJhY2tJbmZvSW1wbChwbGF5YmFja1R5cGUsIGF0dHJzLCBjb250cm9sVHlwZSwgbWF4LCBjdXJyZW50KQorICAgICAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBQbGF5YmFja0luZm8gZnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7CisgICAgICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIGludCB2b2x1bWVUeXBlID0gYnVuZGxlLmdldEludChLRVlfUExBWUJBQ0tfVFlQRSk7CisgICAgICAgICAgICBmaW5hbCBpbnQgdm9sdW1lQ29udHJvbCA9IGJ1bmRsZS5nZXRJbnQoS0VZX0NPTlRST0xfVFlQRSk7CisgICAgICAgICAgICBmaW5hbCBpbnQgbWF4Vm9sdW1lID0gYnVuZGxlLmdldEludChLRVlfTUFYX1ZPTFVNRSk7CisgICAgICAgICAgICBmaW5hbCBpbnQgY3VycmVudFZvbHVtZSA9IGJ1bmRsZS5nZXRJbnQoS0VZX0NVUlJFTlRfVk9MVU1FKTsKKyAgICAgICAgICAgIGZpbmFsIEF1ZGlvQXR0cmlidXRlcyBhdHRycyA9IGJ1bmRsZS5nZXRQYXJjZWxhYmxlKEtFWV9BVURJT19BVFRSSUJVVEVTKTsKKworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVBsYXliYWNrSW5mbyh2b2x1bWVUeXBlLCBhdHRycywgdm9sdW1lQ29udHJvbCwgbWF4Vm9sdW1lLCBjdXJyZW50Vm9sdW1lKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFDb250cm9sbGVyMlN0dWIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFDb250cm9sbGVyMlN0dWIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2ZjNWRmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUNvbnRyb2xsZXIyU3R1Yi5qYXZhCkBAIC0wLDAgKzEsNDcwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbW1hbmRCdXR0b247CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZEdyb3VwMjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjJJbXBsLlBsYXliYWNrSW5mb0ltcGw7CitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEJ1dHRvbkltcGw7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIE1lZGlhQ29udHJvbGxlcjJTdHViIGV4dGVuZHMgSU1lZGlhQ29udHJvbGxlcjIuU3R1YiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYUNvbnRyb2xsZXIyU3R1YiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFRPRE8oamFld2FuKTogQ2hhbmdlCisKKyAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8TWVkaWFDb250cm9sbGVyMkltcGw+IG1Db250cm9sbGVyOworCisgICAgTWVkaWFDb250cm9sbGVyMlN0dWIoTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcikgeworICAgICAgICBtQ29udHJvbGxlciA9IG5ldyBXZWFrUmVmZXJlbmNlPD4oY29udHJvbGxlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBNZWRpYUNvbnRyb2xsZXIySW1wbCBnZXRDb250cm9sbGVyKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXIgPSBtQ29udHJvbGxlci5nZXQoKTsKKyAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ29udHJvbGxlciBpcyByZWxlYXNlZCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb250cm9sbGVyOworICAgIH0KKworICAgIHByaXZhdGUgTWVkaWFCcm93c2VyMkltcGwgZ2V0QnJvd3NlcigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOworICAgICAgICBpZiAoY29udHJvbGxlciBpbnN0YW5jZW9mIE1lZGlhQnJvd3NlcjJJbXBsKSB7CisgICAgICAgICAgICByZXR1cm4gKE1lZGlhQnJvd3NlcjJJbXBsKSBjb250cm9sbGVyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisgICAgICAgIG1Db250cm9sbGVyLmNsZWFyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25QbGF5ZXJTdGF0ZUNoYW5nZWQoaW50IHN0YXRlKSB7CisgICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY29udHJvbGxlci5wdXNoUGxheWVyU3RhdGVDaGFuZ2VzKHN0YXRlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblBvc2l0aW9uQ2hhbmdlZChsb25nIGV2ZW50VGltZU1zLCBsb25nIHBvc2l0aW9uTXMpIHsKKyAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXZlbnRUaW1lTXMgPCAwKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJvblBvc2l0aW9uQ2hhbmdlZCgpOiBJZ25vcmluZyBuZWdhdGl2ZSBldmVudFRpbWVNcyIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChwb3NpdGlvbk1zIDwgMCkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAib25Qb3NpdGlvbkNoYW5nZWQoKTogSWdub3JpbmcgbmVnYXRpdmUgcG9zaXRpb25NcyIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNvbnRyb2xsZXIucHVzaFBvc2l0aW9uQ2hhbmdlcyhldmVudFRpbWVNcywgcG9zaXRpb25Ncyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25QbGF5YmFja1NwZWVkQ2hhbmdlZChmbG9hdCBzcGVlZCkgeworICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNvbnRyb2xsZXIucHVzaFBsYXliYWNrU3BlZWRDaGFuZ2VzKHNwZWVkKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkKGxvbmcgYnVmZmVyZWRQb3NpdGlvbk1zKSB7CisgICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ1ZmZlcmVkUG9zaXRpb25NcyA8IDApIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIm9uQnVmZmVyZWRQb3NpdGlvbkNoYW5nZWQoKTogSWdub3JpbmcgbmVnYXRpdmUgYnVmZmVyZWRQb3NpdGlvbk1zIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY29udHJvbGxlci5wdXNoQnVmZmVyZWRQb3NpdGlvbkNoYW5nZXMoYnVmZmVyZWRQb3NpdGlvbk1zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblBsYXlsaXN0Q2hhbmdlZChMaXN0PEJ1bmRsZT4gcGxheWxpc3RCdW5kbGUsIEJ1bmRsZSBtZXRhZGF0YUJ1bmRsZSkgeworICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChwbGF5bGlzdEJ1bmRsZSA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJvblBsYXlsaXN0Q2hhbmdlZCgpOiBJZ25vcmluZyBudWxsIHBsYXlsaXN0IGZyb20gIiArIGNvbnRyb2xsZXIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChCdW5kbGUgYnVuZGxlIDogcGxheWxpc3RCdW5kbGUpIHsKKyAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IE1lZGlhSXRlbTIuZnJvbUJ1bmRsZShidW5kbGUpOworICAgICAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIm9uUGxheWxpc3RDaGFuZ2VkKCk6IElnbm9yaW5nIG51bGwgaXRlbSBpbiBwbGF5bGlzdCIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwbGF5bGlzdC5hZGQoaXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEgPSBNZWRpYU1ldGFkYXRhMi5mcm9tQnVuZGxlKG1ldGFkYXRhQnVuZGxlKTsKKyAgICAgICAgY29udHJvbGxlci5wdXNoUGxheWxpc3RDaGFuZ2VzKHBsYXlsaXN0LCBtZXRhZGF0YSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZChCdW5kbGUgbWV0YWRhdGFCdW5kbGUpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSA9IE1lZGlhTWV0YWRhdGEyLmZyb21CdW5kbGUobWV0YWRhdGFCdW5kbGUpOworICAgICAgICBjb250cm9sbGVyLnB1c2hQbGF5bGlzdE1ldGFkYXRhQ2hhbmdlcyhtZXRhZGF0YSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25SZXBlYXRNb2RlQ2hhbmdlZChpbnQgcmVwZWF0TW9kZSkgeworICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNvbnRyb2xsZXIucHVzaFJlcGVhdE1vZGVDaGFuZ2VzKHJlcGVhdE1vZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUGxheWJhY2tJbmZvQ2hhbmdlZChCdW5kbGUgcGxheWJhY2tJbmZvKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAib25QbGF5YmFja0luZm9DaGFuZ2VkIik7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBNZWRpYUNvbnRyb2xsZXIyLlBsYXliYWNrSW5mbyBpbmZvID0gUGxheWJhY2tJbmZvSW1wbC5mcm9tQnVuZGxlKHBsYXliYWNrSW5mbyk7CisgICAgICAgIGlmIChpbmZvID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIm9uUGxheWJhY2tJbmZvQ2hhbmdlZCgpOiBJZ25vcmluZyBudWxsIHBsYXliYWNrSW5mbyIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNvbnRyb2xsZXIucHVzaFBsYXliYWNrSW5mb0NoYW5nZXMoaW5mbyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TaHVmZmxlTW9kZUNoYW5nZWQoaW50IHNodWZmbGVNb2RlKSB7CisgICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY29udHJvbGxlci5wdXNoU2h1ZmZsZU1vZGVDaGFuZ2VzKHNodWZmbGVNb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkVycm9yKGludCBlcnJvckNvZGUsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjb250cm9sbGVyLnB1c2hFcnJvcihlcnJvckNvZGUsIGV4dHJhcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Db25uZWN0ZWQoSU1lZGlhU2Vzc2lvbjIgc2Vzc2lvbkJpbmRlciwgQnVuZGxlIGNvbW1hbmRHcm91cCwKKyAgICAgICAgICAgIGludCBwbGF5ZXJTdGF0ZSwgbG9uZyBwb3NpdGlvbkV2ZW50VGltZU1zLCBsb25nIHBvc2l0aW9uTXMsIGZsb2F0IHBsYXliYWNrU3BlZWQsCisgICAgICAgICAgICBsb25nIGJ1ZmZlcmVkUG9zaXRpb25NcywgQnVuZGxlIHBsYXliYWNrSW5mbywgaW50IHNodWZmbGVNb2RlLCBpbnQgcmVwZWF0TW9kZSwKKyAgICAgICAgICAgIExpc3Q8QnVuZGxlPiBpdGVtQnVuZGxlTGlzdCwgUGVuZGluZ0ludGVudCBzZXNzaW9uQWN0aXZpdHkpIHsKKyAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlciA9IG1Db250cm9sbGVyLmdldCgpOworICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvbkNvbm5lY3RlZCBhZnRlciBNZWRpYUNvbnRyb2xsZXIyLmNsb3NlKCkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBjb250cm9sbGVyLmdldENvbnRleHQoKTsKKyAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBpdGVtTGlzdCA9IG51bGw7CisgICAgICAgIGlmIChpdGVtQnVuZGxlTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBpdGVtTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtQnVuZGxlTGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IE1lZGlhSXRlbTIuZnJvbUJ1bmRsZShpdGVtQnVuZGxlTGlzdC5nZXQoaSkpOworICAgICAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaXRlbUxpc3QuYWRkKGl0ZW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb250cm9sbGVyLm9uQ29ubmVjdGVkTm90TG9ja2VkKHNlc3Npb25CaW5kZXIsCisgICAgICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmRHcm91cDIuZnJvbUJ1bmRsZShjb21tYW5kR3JvdXApLAorICAgICAgICAgICAgICAgIHBsYXllclN0YXRlLCBwb3NpdGlvbkV2ZW50VGltZU1zLCBwb3NpdGlvbk1zLCBwbGF5YmFja1NwZWVkLCBidWZmZXJlZFBvc2l0aW9uTXMsCisgICAgICAgICAgICAgICAgUGxheWJhY2tJbmZvSW1wbC5mcm9tQnVuZGxlKHBsYXliYWNrSW5mbyksIHJlcGVhdE1vZGUsIHNodWZmbGVNb2RlLAorICAgICAgICAgICAgICAgIGl0ZW1MaXN0LCBzZXNzaW9uQWN0aXZpdHkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGlzY29ubmVjdGVkKCkgeworICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyID0gbUNvbnRyb2xsZXIuZ2V0KCk7CisgICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uRGlzY29ubmVjdGVkIGFmdGVyIE1lZGlhQ29udHJvbGxlcjIuY2xvc2UoKSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5jbG9zZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3VzdG9tTGF5b3V0Q2hhbmdlZChMaXN0PEJ1bmRsZT4gY29tbWFuZEJ1dHRvbmxpc3QpIHsKKyAgICAgICAgaWYgKGNvbW1hbmRCdXR0b25saXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIm9uQ3VzdG9tTGF5b3V0Q2hhbmdlZCgpOiBJZ25vcmluZyBudWxsIGNvbW1hbmRCdXR0b25saXN0Iik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBMaXN0PENvbW1hbmRCdXR0b24+IGxheW91dCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbW1hbmRCdXR0b25saXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBDb21tYW5kQnV0dG9uIGJ1dHRvbiA9IENvbW1hbmRCdXR0b25JbXBsLmZyb21CdW5kbGUoY29tbWFuZEJ1dHRvbmxpc3QuZ2V0KGkpKTsKKyAgICAgICAgICAgIGlmIChidXR0b24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxheW91dC5hZGQoYnV0dG9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb250cm9sbGVyLm9uQ3VzdG9tTGF5b3V0Q2hhbmdlZChsYXlvdXQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQWxsb3dlZENvbW1hbmRzQ2hhbmdlZChCdW5kbGUgY29tbWFuZHNCdW5kbGUpIHsKKyAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTZXNzaW9uQ29tbWFuZEdyb3VwMiBjb21tYW5kcyA9IFNlc3Npb25Db21tYW5kR3JvdXAyLmZyb21CdW5kbGUoY29tbWFuZHNCdW5kbGUpOworICAgICAgICBpZiAoY29tbWFuZHMgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAib25BbGxvd2VkQ29tbWFuZHNDaGFuZ2VkKCk6IElnbm9yaW5nIG51bGwgY29tbWFuZHMiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjb250cm9sbGVyLm9uQWxsb3dlZENvbW1hbmRzQ2hhbmdlZChjb21tYW5kcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DdXN0b21Db21tYW5kKEJ1bmRsZSBjb21tYW5kQnVuZGxlLCBCdW5kbGUgYXJncywgUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKKyAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCA9IFNlc3Npb25Db21tYW5kMi5mcm9tQnVuZGxlKGNvbW1hbmRCdW5kbGUpOworICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJvbkN1c3RvbUNvbW1hbmQoKTogSWdub3JpbmcgbnVsbCBjb21tYW5kIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY29udHJvbGxlci5vbkN1c3RvbUNvbW1hbmQoY29tbWFuZCwgYXJncywgcmVjZWl2ZXIpOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gTWVkaWFCcm93c2VyIHNwZWNpZmljCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkdldExpYnJhcnlSb290RG9uZShCdW5kbGUgcm9vdEhpbnRzLCBTdHJpbmcgcm9vdE1lZGlhSWQsIEJ1bmRsZSByb290RXh0cmEpCisgICAgICAgICAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE1lZGlhQnJvd3NlcjJJbXBsIGJyb3dzZXI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBicm93c2VyID0gZ2V0QnJvd3NlcigpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJyb3dzZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXZpc2l0IGhlcmUuIENvdWxkIGJlIGEgYnVnCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYnJvd3Nlci5vbkdldExpYnJhcnlSb290RG9uZShyb290SGludHMsIHJvb3RNZWRpYUlkLCByb290RXh0cmEpOworICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25HZXRJdGVtRG9uZShTdHJpbmcgbWVkaWFJZCwgQnVuZGxlIGl0ZW1CdW5kbGUpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAib25HZXRJdGVtRG9uZSgpOiBJZ25vcmluZyBudWxsIG1lZGlhSWQiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBNZWRpYUJyb3dzZXIySW1wbCBicm93c2VyOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnJvd3NlciA9IGdldEJyb3dzZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChicm93c2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJyb3dzZXIub25HZXRJdGVtRG9uZShtZWRpYUlkLCBNZWRpYUl0ZW0yLmZyb21CdW5kbGUoaXRlbUJ1bmRsZSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uR2V0Q2hpbGRyZW5Eb25lKFN0cmluZyBwYXJlbnRJZCwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwKKyAgICAgICAgICAgIExpc3Q8QnVuZGxlPiBpdGVtQnVuZGxlTGlzdCwgQnVuZGxlIGV4dHJhcykgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24geworICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAib25HZXRDaGlsZHJlbkRvbmUoKTogSWdub3JpbmcgbnVsbCBwYXJlbnRJZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIE1lZGlhQnJvd3NlcjJJbXBsIGJyb3dzZXI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBicm93c2VyID0gZ2V0QnJvd3NlcigpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJyb3dzZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXZpc2l0IGhlcmUuIENvdWxkIGJlIGEgYnVnCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHJlc3VsdCA9IG51bGw7CisgICAgICAgIGlmIChpdGVtQnVuZGxlTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgIGZvciAoQnVuZGxlIGJ1bmRsZSA6IGl0ZW1CdW5kbGVMaXN0KSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChNZWRpYUl0ZW0yLmZyb21CdW5kbGUoYnVuZGxlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJvd3Nlci5vbkdldENoaWxkcmVuRG9uZShwYXJlbnRJZCwgcGFnZSwgcGFnZVNpemUsIHJlc3VsdCwgZXh0cmFzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblNlYXJjaFJlc3VsdENoYW5nZWQoU3RyaW5nIHF1ZXJ5LCBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKQorICAgICAgICAgICAgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24geworICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJvblNlYXJjaFJlc3VsdENoYW5nZWQoKTogSWdub3JpbmcgZW1wdHkgcXVlcnkiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBNZWRpYUJyb3dzZXIySW1wbCBicm93c2VyOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnJvd3NlciA9IGdldEJyb3dzZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChicm93c2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJyb3dzZXIub25TZWFyY2hSZXN1bHRDaGFuZ2VkKHF1ZXJ5LCBpdGVtQ291bnQsIGV4dHJhcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25HZXRTZWFyY2hSZXN1bHREb25lKFN0cmluZyBxdWVyeSwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwKKyAgICAgICAgICAgIExpc3Q8QnVuZGxlPiBpdGVtQnVuZGxlTGlzdCwgQnVuZGxlIGV4dHJhcykgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24geworICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJvbkdldFNlYXJjaFJlc3VsdERvbmUoKTogSWdub3JpbmcgZW1wdHkgcXVlcnkiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBNZWRpYUJyb3dzZXIySW1wbCBicm93c2VyOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnJvd3NlciA9IGdldEJyb3dzZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChicm93c2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiByZXN1bHQgPSBudWxsOworICAgICAgICBpZiAoaXRlbUJ1bmRsZUxpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBmb3IgKEJ1bmRsZSBidW5kbGUgOiBpdGVtQnVuZGxlTGlzdCkgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoTWVkaWFJdGVtMi5mcm9tQnVuZGxlKGJ1bmRsZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyb3dzZXIub25HZXRTZWFyY2hSZXN1bHREb25lKHF1ZXJ5LCBwYWdlLCBwYWdlU2l6ZSwgcmVzdWx0LCBleHRyYXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ2hpbGRyZW5DaGFuZ2VkKFN0cmluZyBwYXJlbnRJZCwgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAib25DaGlsZHJlbkNoYW5nZWQoKTogSWdub3JpbmcgbnVsbCBwYXJlbnRJZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIE1lZGlhQnJvd3NlcjJJbXBsIGJyb3dzZXI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBicm93c2VyID0gZ2V0QnJvd3NlcigpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJyb3dzZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXZpc2l0IGhlcmUuIENvdWxkIGJlIGEgYnVnCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYnJvd3Nlci5vbkNoaWxkcmVuQ2hhbmdlZChwYXJlbnRJZCwgaXRlbUNvdW50LCBleHRyYXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFJdGVtMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFJdGVtMkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTBhMGYxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUl0ZW0ySW1wbC5qYXZhCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMi5GTEFHX0JST1dTQUJMRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yLkZMQUdfUExBWUFCTEU7CisKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5EYXRhU291cmNlRGVzYzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yLkJ1aWxkZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yLkZsYWdzOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFJdGVtMlByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKKworcHVibGljIGNsYXNzIE1lZGlhSXRlbTJJbXBsIGltcGxlbWVudHMgTWVkaWFJdGVtMlByb3ZpZGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0lEID0gImFuZHJvaWQubWVkaWEubWVkaWFpdGVtMi5pZCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9GTEFHUyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhaXRlbTIuZmxhZ3MiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUVUQURBVEEgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWl0ZW0yLm1ldGFkYXRhIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1VVSUQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWl0ZW0yLnV1aWQiOworCisgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYUl0ZW0yIG1JbnN0YW5jZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtSWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUZsYWdzOworICAgIHByaXZhdGUgZmluYWwgVVVJRCBtVVVJRDsKKyAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGEyIG1NZXRhZGF0YTsKKyAgICBwcml2YXRlIERhdGFTb3VyY2VEZXNjIG1EYXRhU291cmNlRGVzYzsKKworICAgIC8vIEZyb20gdGhlIHB1YmxpYyBBUEkKKyAgICBwdWJsaWMgTWVkaWFJdGVtMkltcGwoQE5vbk51bGwgU3RyaW5nIG1lZGlhSWQsIEBOdWxsYWJsZSBEYXRhU291cmNlRGVzYyBkc2QsCisgICAgICAgICAgICBATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEsIEBGbGFncyBpbnQgZmxhZ3MpIHsKKyAgICAgICAgdGhpcyhtZWRpYUlkLCBkc2QsIG1ldGFkYXRhLCBmbGFncywgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBNZWRpYUl0ZW0ySW1wbChATm9uTnVsbCBTdHJpbmcgbWVkaWFJZCwgQE51bGxhYmxlIERhdGFTb3VyY2VEZXNjIGRzZCwKKyAgICAgICAgICAgIEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSwgQEZsYWdzIGludCBmbGFncywgQE51bGxhYmxlIFVVSUQgdXVpZCkgeworICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1ldGFkYXRhICE9IG51bGwgJiYgIVRleHRVdGlscy5lcXVhbHMobWVkaWFJZCwgbWV0YWRhdGEuZ2V0TWVkaWFJZCgpKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWV0YWRhdGEncyBpZCBzaG91bGQgYmUgbWF0Y2hlZCB3aXRoIHRoZSBtZWRpYWlkIik7CisgICAgICAgIH0KKworICAgICAgICBtSWQgPSBtZWRpYUlkOworICAgICAgICBtRGF0YVNvdXJjZURlc2MgPSBkc2Q7CisgICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOworICAgICAgICBtRmxhZ3MgPSBmbGFnczsKKyAgICAgICAgbVVVSUQgPSAodXVpZCA9PSBudWxsKSA/IFVVSUQucmFuZG9tVVVJRCgpIDogdXVpZDsKKworICAgICAgICBtSW5zdGFuY2UgPSBuZXcgTWVkaWFJdGVtMih0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHNfaW1wbChPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIE1lZGlhSXRlbTIpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgTWVkaWFJdGVtMiBvdGhlciA9IChNZWRpYUl0ZW0yKSBvYmo7CisgICAgICAgIHJldHVybiBtVVVJRC5lcXVhbHMoKChNZWRpYUl0ZW0ySW1wbCkgb3RoZXIuZ2V0UHJvdmlkZXIoKSkubVVVSUQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGlzIG9iamVjdCBhcyBhIGJ1bmRsZSB0byBzaGFyZSBiZXR3ZWVuIHByb2Nlc3Nlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBuZXcgYnVuZGxlIGluc3RhbmNlCisgICAgICovCisgICAgcHVibGljIEJ1bmRsZSB0b0J1bmRsZV9pbXBsKCkgeworICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICBidW5kbGUucHV0U3RyaW5nKEtFWV9JRCwgbUlkKTsKKyAgICAgICAgYnVuZGxlLnB1dEludChLRVlfRkxBR1MsIG1GbGFncyk7CisgICAgICAgIGlmIChtTWV0YWRhdGEgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVuZGxlLnB1dEJ1bmRsZShLRVlfTUVUQURBVEEsIG1NZXRhZGF0YS50b0J1bmRsZSgpKTsKKyAgICAgICAgfQorICAgICAgICBidW5kbGUucHV0U3RyaW5nKEtFWV9VVUlELCBtVVVJRC50b1N0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIGJ1bmRsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBNZWRpYUl0ZW0yIGZyb20gdGhlIHtAbGluayBCdW5kbGV9LgorICAgICAqCisgICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlIHdoaWNoIHdhcyBwdWJsaXNoZWQgYnkge0BsaW5rIE1lZGlhSXRlbTIjdG9CdW5kbGUoKX0uCisgICAgICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBNZWRpYUl0ZW0yCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNZWRpYUl0ZW0yIGZyb21CdW5kbGVfaW1wbChATm9uTnVsbCBCdW5kbGUgYnVuZGxlKSB7CisgICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU3RyaW5nIHV1aWRTdHJpbmcgPSBidW5kbGUuZ2V0U3RyaW5nKEtFWV9VVUlEKTsKKyAgICAgICAgcmV0dXJuIGZyb21CdW5kbGUoYnVuZGxlLCBVVUlELmZyb21TdHJpbmcodXVpZFN0cmluZykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIE1lZGlhSXRlbTIgZnJvbSB0aGUge0BsaW5rIEJ1bmRsZX0gd2l0aCB0aGUgc3BlY2lmaWVkIHtAbGluayBVVUlEfS4KKyAgICAgKiBJZiB7QGxpbmsgVVVJRH0KKyAgICAgKiBjYW4gYmUgbnVsbCBmb3IgY3JlYXRpbmcgbmV3LgorICAgICAqCisgICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlIHdoaWNoIHdhcyBwdWJsaXNoZWQgYnkge0BsaW5rIE1lZGlhSXRlbTIjdG9CdW5kbGUoKX0uCisgICAgICogQHBhcmFtIHV1aWQgQSB7QGxpbmsgVVVJRH0gdG8gb3ZlcnJpZGUuIENhbiBiZSB7QGxpbmsgbnVsbH0gZm9yIG92ZXJyaWRlLgorICAgICAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgTWVkaWFJdGVtMgorICAgICAqLworICAgIHN0YXRpYyBNZWRpYUl0ZW0yIGZyb21CdW5kbGUoQE5vbk51bGwgQnVuZGxlIGJ1bmRsZSwgQE51bGxhYmxlIFVVSUQgdXVpZCkgeworICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IGJ1bmRsZS5nZXRTdHJpbmcoS0VZX0lEKTsKKyAgICAgICAgZmluYWwgQnVuZGxlIG1ldGFkYXRhQnVuZGxlID0gYnVuZGxlLmdldEJ1bmRsZShLRVlfTUVUQURBVEEpOworICAgICAgICBmaW5hbCBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSA9IE1lZGlhTWV0YWRhdGEyLmZyb21CdW5kbGUobWV0YWRhdGFCdW5kbGUpOworICAgICAgICBmaW5hbCBpbnQgZmxhZ3MgPSBidW5kbGUuZ2V0SW50KEtFWV9GTEFHUyk7CisgICAgICAgIHJldHVybiBuZXcgTWVkaWFJdGVtMkltcGwoaWQsIG51bGwsIG1ldGFkYXRhLCBmbGFncywgdXVpZCkuZ2V0SW5zdGFuY2UoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIE1lZGlhSXRlbTIgZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBtSW5zdGFuY2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZ19pbXBsKCkgeworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIk1lZGlhSXRlbTJ7Iik7CisgICAgICAgIHNiLmFwcGVuZCgibUZsYWdzPSIpLmFwcGVuZChtRmxhZ3MpOworICAgICAgICBzYi5hcHBlbmQoIiwgbU1ldGFkYXRhPSIpLmFwcGVuZChtTWV0YWRhdGEpOworICAgICAgICBzYi5hcHBlbmQoJ30nKTsKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEBGbGFncyBpbnQgZ2V0RmxhZ3NfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIG1GbGFnczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Jyb3dzYWJsZV9pbXBsKCkgeworICAgICAgICByZXR1cm4gKG1GbGFncyAmIEZMQUdfQlJPV1NBQkxFKSAhPSAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUGxheWFibGVfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIChtRmxhZ3MgJiBGTEFHX1BMQVlBQkxFKSAhPSAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldE1ldGFkYXRhX2ltcGwoQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7CisgICAgICAgIGlmIChtZXRhZGF0YSAhPSBudWxsICYmICFUZXh0VXRpbHMuZXF1YWxzKG1JZCwgbWV0YWRhdGEuZ2V0TWVkaWFJZCgpKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWV0YWRhdGEncyBpZCBzaG91bGQgYmUgbWF0Y2hlZCB3aXRoIHRoZSBtZWRpYUlkIik7CisgICAgICAgIH0KKyAgICAgICAgbU1ldGFkYXRhID0gbWV0YWRhdGE7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBnZXRNZXRhZGF0YV9pbXBsKCkgeworICAgICAgICByZXR1cm4gbU1ldGFkYXRhOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBATm9uTnVsbCBTdHJpbmcgZ2V0TWVkaWFJZF9pbXBsKCkgeworICAgICAgICByZXR1cm4gbUlkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBATnVsbGFibGUgRGF0YVNvdXJjZURlc2MgZ2V0RGF0YVNvdXJjZURlc2NfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIG1EYXRhU291cmNlRGVzYzsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXJJbXBsIGltcGxlbWVudHMgTWVkaWFJdGVtMlByb3ZpZGVyLkJ1aWxkZXJQcm92aWRlciB7CisgICAgICAgIHByaXZhdGUgQnVpbGRlciBtSW5zdGFuY2U7CisgICAgICAgIHByaXZhdGUgQEZsYWdzIGludCBtRmxhZ3M7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1NZWRpYUlkOworICAgICAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGEyIG1NZXRhZGF0YTsKKyAgICAgICAgcHJpdmF0ZSBEYXRhU291cmNlRGVzYyBtRGF0YVNvdXJjZURlc2M7CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKEJ1aWxkZXIgaW5zdGFuY2UsIGludCBmbGFncykgeworICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7CisgICAgICAgICAgICBtRmxhZ3MgPSBmbGFnczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRNZWRpYUlkX2ltcGwoQE51bGxhYmxlIFN0cmluZyBtZWRpYUlkKSB7CisgICAgICAgICAgICBtTWVkaWFJZCA9IG1lZGlhSWQ7CisgICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldE1ldGFkYXRhX2ltcGwoQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7CisgICAgICAgICAgICBtTWV0YWRhdGEgPSBtZXRhZGF0YTsKKyAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RGF0YVNvdXJjZURlc2NfaW1wbChATnVsbGFibGUgRGF0YVNvdXJjZURlc2MgZGF0YVNvdXJjZURlc2MpIHsKKyAgICAgICAgICAgIG1EYXRhU291cmNlRGVzYyA9IGRhdGFTb3VyY2VEZXNjOworICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTWVkaWFJdGVtMiBidWlsZF9pbXBsKCkgeworICAgICAgICAgICAgU3RyaW5nIGlkID0gKG1NZXRhZGF0YSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICA/IG1NZXRhZGF0YS5nZXRTdHJpbmcoTWVkaWFNZXRhZGF0YTIuTUVUQURBVEFfS0VZX01FRElBX0lEKSA6IG51bGw7CisgICAgICAgICAgICBpZiAoaWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vICBUT0RPKGphZXdhbik6IERvdWJsZSBjaGVjayBpZiBpdHMgc3VmZmljaWVudCAoZS5nLiBVc2UgVVVJRCBpbnN0ZWFkPykKKyAgICAgICAgICAgICAgICBpZCA9IChtTWVkaWFJZCAhPSBudWxsKSA/IG1NZWRpYUlkIDogdG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFJdGVtMkltcGwoaWQsIG1EYXRhU291cmNlRGVzYywgbU1ldGFkYXRhLCBtRmxhZ3MpLmdldEluc3RhbmNlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhTGlicmFyeVNlcnZpY2UySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjM0Y2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwuamF2YQpAQCAtMCwwICsxLDE3MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLkxpYnJhcnlSb290OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTIuTWVkaWFMaWJyYXJ5U2Vzc2lvbjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLk1lZGlhTGlicmFyeVNlc3Npb24uQnVpbGRlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLk1lZGlhTGlicmFyeVNlc3Npb24uTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29udHJvbGxlckluZm87CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFMaWJyYXJ5U2VydmljZTJQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworCitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMkltcGwuQnVpbGRlckJhc2VJbXBsOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7CisKK3B1YmxpYyBjbGFzcyBNZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwgZXh0ZW5kcyBNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwgaW1wbGVtZW50cworICAgICAgICBNZWRpYUxpYnJhcnlTZXJ2aWNlMlByb3ZpZGVyIHsKKyAgICBwcml2YXRlIGZpbmFsIE1lZGlhU2Vzc2lvblNlcnZpY2UyIG1JbnN0YW5jZTsKKyAgICBwcml2YXRlIE1lZGlhTGlicmFyeVNlc3Npb24gbUxpYnJhcnlTZXNzaW9uOworCisgICAgcHVibGljIE1lZGlhTGlicmFyeVNlcnZpY2UySW1wbChNZWRpYUxpYnJhcnlTZXJ2aWNlMiBpbnN0YW5jZSkgeworICAgICAgICBzdXBlcihpbnN0YW5jZSk7CisgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlX2ltcGwoKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlX2ltcGwoKTsKKworICAgICAgICAvLyBFZmZlY3RpdmVseSBmaW5hbAorICAgICAgICBNZWRpYVNlc3Npb24yIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7CisgICAgICAgIGlmICghKHNlc3Npb24gaW5zdGFuY2VvZiBNZWRpYUxpYnJhcnlTZXNzaW9uKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4cGVjdGVkIE1lZGlhTGlicmFyeVNlc3Npb24sIGJ1dCByZXR1cm5lZCBNZWRpYVNlc3Npb24yIik7CisgICAgICAgIH0KKyAgICAgICAgbUxpYnJhcnlTZXNzaW9uID0gKE1lZGlhTGlicmFyeVNlc3Npb24pIGdldFNlc3Npb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBpbnQgZ2V0U2Vzc2lvblR5cGUoKSB7CisgICAgICAgIHJldHVybiBTZXNzaW9uVG9rZW4yLlRZUEVfTElCUkFSWV9TRVJWSUNFOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwgZXh0ZW5kcyBNZWRpYVNlc3Npb24ySW1wbAorICAgICAgICAgICAgaW1wbGVtZW50cyBNZWRpYUxpYnJhcnlTZXNzaW9uUHJvdmlkZXIgeworICAgICAgICBwdWJsaWMgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwoQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIsIFN0cmluZyBpZCwgTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCisgICAgICAgICAgICAgICAgVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyLAorICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5LCBFeGVjdXRvciBjYWxsYmFja0V4ZWN1dG9yLAorICAgICAgICAgICAgICAgIE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgcGxheWVyLCBpZCwgcGxheWxpc3RBZ2VudCwgdm9sdW1lUHJvdmlkZXIsIHNlc3Npb25BY3Rpdml0eSwKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tFeGVjdXRvciwgY2FsbGJhY2spOworICAgICAgICAgICAgLy8gRG9uJ3QgcHV0IGFueSBleHRyYSBpbml0aWFsaXphdGlvbiBoZXJlLiBIZXJlJ3MgdGhlIHJlYXNvbi4KKyAgICAgICAgICAgIC8vIFN5c3RlbSBzZXJ2aWNlIHdpbGwgcmVjb2duaXplIHRoaXMgc2Vzc2lvbiBpbnNpZGUgb2YgdGhlIHN1cGVyIGNvbnN0cnVjdG9yIGFuZCB3b3VsZAorICAgICAgICAgICAgLy8gY29ubmVjdCB0byB0aGlzIHNlc3Npb24gYXNzdW1pbmcgdGhhdCBpbml0aWFsaXphdGlvbiBpcyBmaW5pc2hlZC4gSG93ZXZlciwgaWYgYW55CisgICAgICAgICAgICAvLyBpbml0aWFsaXphdGlvbiBsb2dpYyBpcyBoZXJlLCBjYWxscyBmcm9tIHRoZSBzZXJ2ZXIgd291bGQgZmFpbC4KKyAgICAgICAgICAgIC8vIHNlZTogTWVkaWFTZXNzaW9uMlN0dWIjY29ubmVjdCgpCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgTWVkaWFMaWJyYXJ5U2Vzc2lvbiBjcmVhdGVJbnN0YW5jZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFMaWJyYXJ5U2Vzc2lvbih0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBNZWRpYUxpYnJhcnlTZXNzaW9uIGdldEluc3RhbmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIChNZWRpYUxpYnJhcnlTZXNzaW9uKSBzdXBlci5nZXRJbnN0YW5jZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjayBnZXRDYWxsYmFjaygpIHsKKyAgICAgICAgICAgIHJldHVybiAoTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrKSBzdXBlci5nZXRDYWxsYmFjaygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoaWxkcmVuQ2hhbmdlZF9pbXBsKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIFN0cmluZyBwYXJlbnRJZCwKKyAgICAgICAgICAgICAgICBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJlbnRJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2V0U2Vzc2lvblN0dWIoKS5ub3RpZnlDaGlsZHJlbkNoYW5nZWROb3RMb2NrZWQoY29udHJvbGxlciwgcGFyZW50SWQsIGl0ZW1Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGlsZHJlbkNoYW5nZWRfaW1wbChTdHJpbmcgcGFyZW50SWQsIGludCBpdGVtQ291bnQsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFyZW50SWQgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdldFNlc3Npb25TdHViKCkubm90aWZ5Q2hpbGRyZW5DaGFuZ2VkTm90TG9ja2VkKHBhcmVudElkLCBpdGVtQ291bnQsIGV4dHJhcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5U2VhcmNoUmVzdWx0Q2hhbmdlZF9pbXBsKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIFN0cmluZyBxdWVyeSwKKyAgICAgICAgICAgICAgICBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7CisgICAgICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInF1ZXJ5IHNob3VsZG4ndCBiZSBlbXB0eSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2V0U2Vzc2lvblN0dWIoKS5ub3RpZnlTZWFyY2hSZXN1bHRDaGFuZ2VkKGNvbnRyb2xsZXIsIHF1ZXJ5LCBpdGVtQ291bnQsIGV4dHJhcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXJJbXBsCisgICAgICAgICAgICBleHRlbmRzIEJ1aWxkZXJCYXNlSW1wbDxNZWRpYUxpYnJhcnlTZXNzaW9uLCBNZWRpYUxpYnJhcnlTZXNzaW9uQ2FsbGJhY2s+IHsKKyAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKE1lZGlhTGlicmFyeVNlcnZpY2UyIHNlcnZpY2UsIEJ1aWxkZXIgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgRXhlY3V0b3IgY2FsbGJhY2tFeGVjdXRvciwgTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBzdXBlcihzZXJ2aWNlKTsKKyAgICAgICAgICAgIHNldFNlc3Npb25DYWxsYmFja19pbXBsKGNhbGxiYWNrRXhlY3V0b3IsIGNhbGxiYWNrKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTWVkaWFMaWJyYXJ5U2Vzc2lvbiBidWlsZF9pbXBsKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUxpYnJhcnlTZXNzaW9uSW1wbChtQ29udGV4dCwgbVBsYXllciwgbUlkLCBtUGxheWxpc3RBZ2VudCwKKyAgICAgICAgICAgICAgICAgICAgbVZvbHVtZVByb3ZpZGVyLCBtU2Vzc2lvbkFjdGl2aXR5LCBtQ2FsbGJhY2tFeGVjdXRvciwgbUNhbGxiYWNrKS5nZXRJbnN0YW5jZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBMaWJyYXJ5Um9vdEltcGwgaW1wbGVtZW50cyBMaWJyYXJ5Um9vdFByb3ZpZGVyIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaWJyYXJ5Um9vdCBtSW5zdGFuY2U7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Sb290SWQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1FeHRyYXM7CisKKyAgICAgICAgcHVibGljIExpYnJhcnlSb290SW1wbChMaWJyYXJ5Um9vdCBpbnN0YW5jZSwgU3RyaW5nIHJvb3RJZCwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICAgICAgaWYgKHJvb3RJZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm9vdElkIHNob3VsZG4ndCBiZSBudWxsLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7CisgICAgICAgICAgICBtUm9vdElkID0gcm9vdElkOworICAgICAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJvb3RJZF9pbXBsKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Sb290SWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXNfaW1wbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRXh0cmFzOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYU1ldGFkYXRhMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFNZXRhZGF0YTJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YxYzUzMgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFNZXRhZGF0YTJJbXBsLmphdmEKQEAgLTAsMCArMSwzNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMi4qOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMi5CaXRtYXBLZXk7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMi5CdWlsZGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTIuTG9uZ0tleTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyLlJhdGluZ0tleTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyLlRleHRLZXk7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5SYXRpbmcyOworaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhTWV0YWRhdGEyUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkFycmF5TWFwOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitwdWJsaWMgY2xhc3MgTWVkaWFNZXRhZGF0YTJJbXBsIGltcGxlbWVudHMgTWVkaWFNZXRhZGF0YTJQcm92aWRlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYU1ldGFkYXRhMiI7CisKKyAgICBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX1RZUEVfTE9ORyA9IDA7CisgICAgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9UWVBFX1RFWFQgPSAxOworICAgIHN0YXRpYyBmaW5hbCBpbnQgTUVUQURBVEFfVFlQRV9CSVRNQVAgPSAyOworICAgIHN0YXRpYyBmaW5hbCBpbnQgTUVUQURBVEFfVFlQRV9SQVRJTkcgPSAzOworICAgIHN0YXRpYyBmaW5hbCBpbnQgTUVUQURBVEFfVFlQRV9GTE9BVCA9IDQ7CisgICAgc3RhdGljIGZpbmFsIEFycmF5TWFwPFN0cmluZywgSW50ZWdlcj4gTUVUQURBVEFfS0VZU19UWVBFOworCisgICAgc3RhdGljIHsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFID0gbmV3IEFycmF5TWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfVElUTEUsIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FSVElTVCwgTUVUQURBVEFfVFlQRV9URVhUKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRFVSQVRJT04sIE1FVEFEQVRBX1RZUEVfTE9ORyk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FMQlVNLCBNRVRBREFUQV9UWVBFX1RFWFQpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BVVRIT1IsIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX1dSSVRFUiwgTUVUQURBVEFfVFlQRV9URVhUKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQ09NUE9TRVIsIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0NPTVBJTEFUSU9OLCBNRVRBREFUQV9UWVBFX1RFWFQpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9EQVRFLCBNRVRBREFUQV9UWVBFX1RFWFQpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9ZRUFSLCBNRVRBREFUQV9UWVBFX0xPTkcpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9HRU5SRSwgTUVUQURBVEFfVFlQRV9URVhUKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfVFJBQ0tfTlVNQkVSLCBNRVRBREFUQV9UWVBFX0xPTkcpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9OVU1fVFJBQ0tTLCBNRVRBREFUQV9UWVBFX0xPTkcpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9ESVNDX05VTUJFUiwgTUVUQURBVEFfVFlQRV9MT05HKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQUxCVU1fQVJUSVNULCBNRVRBREFUQV9UWVBFX1RFWFQpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BUlQsIE1FVEFEQVRBX1RZUEVfQklUTUFQKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQVJUX1VSSSwgTUVUQURBVEFfVFlQRV9URVhUKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQUxCVU1fQVJULCBNRVRBREFUQV9UWVBFX0JJVE1BUCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FMQlVNX0FSVF9VUkksIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX1VTRVJfUkFUSU5HLCBNRVRBREFUQV9UWVBFX1JBVElORyk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX1JBVElORywgTUVUQURBVEFfVFlQRV9SQVRJTkcpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9ESVNQTEFZX1RJVExFLCBNRVRBREFUQV9UWVBFX1RFWFQpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9ESVNQTEFZX1NVQlRJVExFLCBNRVRBREFUQV9UWVBFX1RFWFQpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9ESVNQTEFZX0RFU0NSSVBUSU9OLCBNRVRBREFUQV9UWVBFX1RFWFQpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9ESVNQTEFZX0lDT04sIE1FVEFEQVRBX1RZUEVfQklUTUFQKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTUExBWV9JQ09OX1VSSSwgTUVUQURBVEFfVFlQRV9URVhUKTsKKyAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfTUVESUFfSUQsIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0JUX0ZPTERFUl9UWVBFLCBNRVRBREFUQV9UWVBFX0xPTkcpOworICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9NRURJQV9VUkksIE1FVEFEQVRBX1RZUEVfVEVYVCk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FEVkVSVElTRU1FTlQsIE1FVEFEQVRBX1RZUEVfTE9ORyk7CisgICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RPV05MT0FEX1NUQVRVUywgTUVUQURBVEFfVFlQRV9MT05HKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBAVGV4dEtleQorICAgIFN0cmluZ1tdIFBSRUZFUlJFRF9ERVNDUklQVElPTl9PUkRFUiA9IHsKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9USVRMRSwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BUlRJU1QsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQUxCVU0sCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQUxCVU1fQVJUSVNULAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX1dSSVRFUiwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BVVRIT1IsCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQ09NUE9TRVIKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQEJpdG1hcEtleQorICAgIFN0cmluZ1tdIFBSRUZFUlJFRF9CSVRNQVBfT1JERVIgPSB7CisgICAgICAgICAgICBNRVRBREFUQV9LRVlfRElTUExBWV9JQ09OLAorICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FSVCwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BTEJVTV9BUlQKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQFRleHRLZXkKKyAgICBTdHJpbmdbXSBQUkVGRVJSRURfVVJJX09SREVSID0geworICAgICAgICAgICAgTUVUQURBVEFfS0VZX0RJU1BMQVlfSUNPTl9VUkksCisgICAgICAgICAgICBNRVRBREFUQV9LRVlfQVJUX1VSSSwKKyAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BTEJVTV9BUlRfVVJJCisgICAgfTsKKworICAgIHByaXZhdGUgZmluYWwgTWVkaWFNZXRhZGF0YTIgbUluc3RhbmNlOworICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7CisKKyAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTJJbXBsKEJ1bmRsZSBidW5kbGUpIHsKKyAgICAgICAgbUluc3RhbmNlID0gbmV3IE1lZGlhTWV0YWRhdGEyKHRoaXMpOworICAgICAgICBtQnVuZGxlID0gYnVuZGxlOworICAgIH0KKworICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMiBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleV9pbXBsKFN0cmluZyBrZXkpIHsKKyAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUJ1bmRsZS5jb250YWluc0tleShrZXkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0VGV4dF9pbXBsKEBUZXh0S2V5IFN0cmluZyBrZXkpIHsKKyAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRDaGFyU2VxdWVuY2Uoa2V5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQE51bGxhYmxlIFN0cmluZyBnZXRNZWRpYUlkX2ltcGwoKSB7CisgICAgICAgIHJldHVybiBtSW5zdGFuY2UuZ2V0U3RyaW5nKE1FVEFEQVRBX0tFWV9NRURJQV9JRCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmdfaW1wbChAVGV4dEtleSBTdHJpbmcga2V5KSB7CisgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgQ2hhclNlcXVlbmNlIHRleHQgPSBtQnVuZGxlLmdldENoYXJTZXF1ZW5jZShrZXkpOworICAgICAgICBpZiAodGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdGV4dC50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldExvbmdfaW1wbChATG9uZ0tleSBTdHJpbmcga2V5KSB7CisgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0TG9uZyhrZXksIDApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSYXRpbmcyIGdldFJhdGluZ19pbXBsKEBSYXRpbmdLZXkgU3RyaW5nIGtleSkgeworICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE8oamFld2FuKTogQWRkIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKyAgICAgICAgUmF0aW5nMiByYXRpbmcgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmF0aW5nID0gUmF0aW5nMi5mcm9tQnVuZGxlKG1CdW5kbGUuZ2V0QnVuZGxlKGtleSkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gaWdub3JlLCB2YWx1ZSB3YXMgbm90IGEgcmF0aW5nCisgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdG8gcmV0cmlldmUgYSBrZXkgYXMgUmF0aW5nLiIsIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByYXRpbmc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZsb2F0IGdldEZsb2F0X2ltcGwoQEZsb2F0S2V5IFN0cmluZyBrZXkpIHsKKyAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRGbG9hdChrZXkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCaXRtYXAgZ2V0Qml0bWFwX2ltcGwoQEJpdG1hcEtleSBTdHJpbmcga2V5KSB7CisgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgQml0bWFwIGJtcCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBibXAgPSBtQnVuZGxlLmdldFBhcmNlbGFibGUoa2V5KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZSwgdmFsdWUgd2FzIG5vdCBhIGJpdG1hcAorICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIHJldHJpZXZlIGEga2V5IGFzIEJpdG1hcC4iLCBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYm1wOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzX2ltcGwoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRCdW5kbGUoTUVUQURBVEFfS0VZX0VYVFJBUyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBpZ25vcmUsIHZhbHVlIHdhcyBub3QgYW4gYnVuZGxlCisgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdG8gcmV0cmlldmUgYW4gZXh0cmEiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHNpemVfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuc2l6ZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBrZXlTZXRfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUua2V5U2V0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ1bmRsZSB0b0J1bmRsZV9pbXBsKCkgeworICAgICAgICByZXR1cm4gbUJ1bmRsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE1lZGlhTWV0YWRhdGEyIGZyb21CdW5kbGVfaW1wbChCdW5kbGUgYnVuZGxlKSB7CisgICAgICAgIHJldHVybiAoYnVuZGxlID09IG51bGwpID8gbnVsbCA6IG5ldyBNZWRpYU1ldGFkYXRhMkltcGwoYnVuZGxlKS5nZXRJbnN0YW5jZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlckltcGwgaW1wbGVtZW50cyBNZWRpYU1ldGFkYXRhMlByb3ZpZGVyLkJ1aWxkZXJQcm92aWRlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgTWVkaWFNZXRhZGF0YTIuQnVpbGRlciBtSW5zdGFuY2U7CisgICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKE1lZGlhTWV0YWRhdGEyLkJ1aWxkZXIgaW5zdGFuY2UpIHsKKyAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOworICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCdWlsZGVySW1wbChNZWRpYU1ldGFkYXRhMi5CdWlsZGVyIGluc3RhbmNlLCBNZWRpYU1ldGFkYXRhMiBzb3VyY2UpIHsKKyAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNvdXJjZSBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7CisgICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZShzb3VyY2UudG9CdW5kbGUoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnVpbGRlckltcGwoaW50IG1heEJpdG1hcFNpemUpIHsKKyAgICAgICAgICAgIG1JbnN0YW5jZSA9IG5ldyBNZWRpYU1ldGFkYXRhMi5CdWlsZGVyKHRoaXMpOworICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKworICAgICAgICAgICAgZm9yIChTdHJpbmcga2V5IDogbUJ1bmRsZS5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG1CdW5kbGUuZ2V0KGtleSk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQml0bWFwKSB7CisgICAgICAgICAgICAgICAgICAgIEJpdG1hcCBibXAgPSAoQml0bWFwKSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJtcC5nZXRIZWlnaHQoKSA+IG1heEJpdG1hcFNpemUgfHwgYm1wLmdldFdpZHRoKCkgPiBtYXhCaXRtYXBTaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UucHV0Qml0bWFwKGtleSwgc2NhbGVCaXRtYXAoYm1wLCBtYXhCaXRtYXBTaXplKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgcHV0VGV4dF9pbXBsKEBUZXh0S2V5IFN0cmluZyBrZXksIENoYXJTZXF1ZW5jZSB2YWx1ZSkgeworICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmNvbnRhaW5zS2V5KGtleSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmdldChrZXkpICE9IE1FVEFEQVRBX1RZUEVfVEVYVCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgIiArIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBrZXkgY2Fubm90IGJlIHVzZWQgdG8gcHV0IGEgQ2hhclNlcXVlbmNlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJ1bmRsZS5wdXRDaGFyU2VxdWVuY2Uoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHB1dFN0cmluZ19pbXBsKEBUZXh0S2V5IFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmNvbnRhaW5zS2V5KGtleSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmdldChrZXkpICE9IE1FVEFEQVRBX1RZUEVfVEVYVCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgIiArIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBrZXkgY2Fubm90IGJlIHVzZWQgdG8gcHV0IGEgU3RyaW5nIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJ1bmRsZS5wdXRDaGFyU2VxdWVuY2Uoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHB1dExvbmdfaW1wbChATG9uZ0tleSBTdHJpbmcga2V5LCBsb25nIHZhbHVlKSB7CisgICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgeworICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9MT05HKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSAiICsga2V5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGtleSBjYW5ub3QgYmUgdXNlZCB0byBwdXQgYSBsb25nIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJ1bmRsZS5wdXRMb25nKGtleSwgdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnVpbGRlciBwdXRSYXRpbmdfaW1wbChAUmF0aW5nS2V5IFN0cmluZyBrZXksIFJhdGluZzIgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5jb250YWluc0tleShrZXkpKSB7CisgICAgICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5nZXQoa2V5KSAhPSBNRVRBREFUQV9UWVBFX1JBVElORykgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgIiArIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBrZXkgY2Fubm90IGJlIHVzZWQgdG8gcHV0IGEgUmF0aW5nIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJ1bmRsZS5wdXRCdW5kbGUoa2V5LCB2YWx1ZS50b0J1bmRsZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgcHV0Qml0bWFwX2ltcGwoQEJpdG1hcEtleSBTdHJpbmcga2V5LCBCaXRtYXAgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5jb250YWluc0tleShrZXkpKSB7CisgICAgICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5nZXQoa2V5KSAhPSBNRVRBREFUQV9UWVBFX0JJVE1BUCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgIiArIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBrZXkgY2Fubm90IGJlIHVzZWQgdG8gcHV0IGEgQml0bWFwIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJ1bmRsZS5wdXRQYXJjZWxhYmxlKGtleSwgdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnVpbGRlciBwdXRGbG9hdF9pbXBsKEBGbG9hdEtleSBTdHJpbmcga2V5LCBmbG9hdCB2YWx1ZSkgeworICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmNvbnRhaW5zS2V5KGtleSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmdldChrZXkpICE9IE1FVEFEQVRBX1RZUEVfRkxPQVQpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIGZsb2F0Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJ1bmRsZS5wdXRGbG9hdChrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RXh0cmFzX2ltcGwoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICAgICAgbUJ1bmRsZS5wdXRCdW5kbGUoTUVUQURBVEFfS0VZX0VYVFJBUywgYnVuZGxlKTsKKyAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE1lZGlhTWV0YWRhdGEyIGJ1aWxkX2ltcGwoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhTWV0YWRhdGEySW1wbChtQnVuZGxlKS5nZXRJbnN0YW5jZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBCaXRtYXAgc2NhbGVCaXRtYXAoQml0bWFwIGJtcCwgaW50IG1heFNpemUpIHsKKyAgICAgICAgICAgIGZsb2F0IG1heFNpemVGID0gbWF4U2l6ZTsKKyAgICAgICAgICAgIGZsb2F0IHdpZHRoU2NhbGUgPSBtYXhTaXplRiAvIGJtcC5nZXRXaWR0aCgpOworICAgICAgICAgICAgZmxvYXQgaGVpZ2h0U2NhbGUgPSBtYXhTaXplRiAvIGJtcC5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIGZsb2F0IHNjYWxlID0gTWF0aC5taW4od2lkdGhTY2FsZSwgaGVpZ2h0U2NhbGUpOworICAgICAgICAgICAgaW50IGhlaWdodCA9IChpbnQpIChibXAuZ2V0SGVpZ2h0KCkgKiBzY2FsZSk7CisgICAgICAgICAgICBpbnQgd2lkdGggPSAoaW50KSAoYm1wLmdldFdpZHRoKCkgKiBzY2FsZSk7CisgICAgICAgICAgICByZXR1cm4gQml0bWFwLmNyZWF0ZVNjYWxlZEJpdG1hcChibXAsIHdpZHRoLCBoZWlnaHQsIHRydWUpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhUGxheWxpc3RBZ2VudEltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFQbGF5bGlzdEFnZW50SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZDRlMWEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhUGxheWxpc3RBZ2VudEltcGwuamF2YQpAQCAtMCwwICsxLDIyNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5DYWxsYmFja0V4ZWN1dG9yOworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50LlBsYXlsaXN0RXZlbnRDYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVBsYXlsaXN0QWdlbnRQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlNYXA7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLkd1YXJkZWRCeTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOworCitwdWJsaWMgY2xhc3MgTWVkaWFQbGF5bGlzdEFnZW50SW1wbCBpbXBsZW1lbnRzIE1lZGlhUGxheWxpc3RBZ2VudFByb3ZpZGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUGxheWxpc3RBZ2VudCI7CisKKyAgICBwcml2YXRlIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBtSW5zdGFuY2U7CisKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKKyAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheU1hcDxQbGF5bGlzdEV2ZW50Q2FsbGJhY2ssIEV4ZWN1dG9yPiBtQ2FsbGJhY2tzID0gbmV3IEFycmF5TWFwPD4oKTsKKworICAgIHB1YmxpYyBNZWRpYVBsYXlsaXN0QWdlbnRJbXBsKE1lZGlhUGxheWxpc3RBZ2VudCBpbnN0YW5jZSkgeworICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBmaW5hbCBwdWJsaWMgdm9pZCByZWdpc3RlclBsYXlsaXN0RXZlbnRDYWxsYmFja19pbXBsKAorICAgICAgICAgICAgQE5vbk51bGwgQENhbGxiYWNrRXhlY3V0b3IgRXhlY3V0b3IgZXhlY3V0b3IsIEBOb25OdWxsIFBsYXlsaXN0RXZlbnRDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBpZiAoZXhlY3V0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZXhlY3V0b3Igc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorCisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGlmIChtQ2FsbGJhY2tzLmdldChjYWxsYmFjaykgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgImNhbGxiYWNrIGlzIGFscmVhZHkgYWRkZWQuIElnbm9yaW5nLiIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYWxsYmFja3MucHV0KGNhbGxiYWNrLCBleGVjdXRvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBmaW5hbCBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyUGxheWxpc3RFdmVudENhbGxiYWNrX2ltcGwoCisgICAgICAgICAgICBATm9uTnVsbCBQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgbUNhbGxiYWNrcy5yZW1vdmUoY2FsbGJhY2spOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgZmluYWwgcHVibGljIHZvaWQgbm90aWZ5UGxheWxpc3RDaGFuZ2VkX2ltcGwoKSB7CisgICAgICAgIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IGNhbGxiYWNrcyA9IGdldENhbGxiYWNrcygpOworICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0PSBtSW5zdGFuY2UuZ2V0UGxheWxpc3QoKTsKKyAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEgPSBtSW5zdGFuY2UuZ2V0UGxheWxpc3RNZXRhZGF0YSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbGxiYWNrcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgZmluYWwgUGxheWxpc3RFdmVudENhbGxiYWNrIGNhbGxiYWNrID0gY2FsbGJhY2tzLmtleUF0KGkpOworICAgICAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3IgPSBjYWxsYmFja3MudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gY2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWQoCisgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZSwgcGxheWxpc3QsIG1ldGFkYXRhKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBmaW5hbCBwdWJsaWMgdm9pZCBub3RpZnlQbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZF9pbXBsKCkgeworICAgICAgICBBcnJheU1hcDxQbGF5bGlzdEV2ZW50Q2FsbGJhY2ssIEV4ZWN1dG9yPiBjYWxsYmFja3MgPSBnZXRDYWxsYmFja3MoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYWxsYmFja3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFBsYXlsaXN0RXZlbnRDYWxsYmFjayBjYWxsYmFjayA9IGNhbGxiYWNrcy5rZXlBdChpKTsKKyAgICAgICAgICAgIGZpbmFsIEV4ZWN1dG9yIGV4ZWN1dG9yID0gY2FsbGJhY2tzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IGNhbGxiYWNrLm9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoCisgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZSwgbUluc3RhbmNlLmdldFBsYXlsaXN0TWV0YWRhdGEoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgZmluYWwgcHVibGljIHZvaWQgbm90aWZ5U2h1ZmZsZU1vZGVDaGFuZ2VkX2ltcGwoKSB7CisgICAgICAgIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IGNhbGxiYWNrcyA9IGdldENhbGxiYWNrcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbGxiYWNrcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgZmluYWwgUGxheWxpc3RFdmVudENhbGxiYWNrIGNhbGxiYWNrID0gY2FsbGJhY2tzLmtleUF0KGkpOworICAgICAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3IgPSBjYWxsYmFja3MudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gY2FsbGJhY2sub25TaHVmZmxlTW9kZUNoYW5nZWQoCisgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZSwgbUluc3RhbmNlLmdldFNodWZmbGVNb2RlKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIGZpbmFsIHB1YmxpYyB2b2lkIG5vdGlmeVJlcGVhdE1vZGVDaGFuZ2VkX2ltcGwoKSB7CisgICAgICAgIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IGNhbGxiYWNrcyA9IGdldENhbGxiYWNrcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbGxiYWNrcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgZmluYWwgUGxheWxpc3RFdmVudENhbGxiYWNrIGNhbGxiYWNrID0gY2FsbGJhY2tzLmtleUF0KGkpOworICAgICAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3IgPSBjYWxsYmFja3MudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gY2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZCgKKyAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLCBtSW5zdGFuY2UuZ2V0UmVwZWF0TW9kZSgpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQE51bGxhYmxlIExpc3Q8TWVkaWFJdGVtMj4gZ2V0UGxheWxpc3RfaW1wbCgpIHsKKyAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0UGxheWxpc3RfaW1wbChATm9uTnVsbCBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsCisgICAgICAgICAgICBATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKKyAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIGdldFBsYXlsaXN0TWV0YWRhdGFfaW1wbCgpIHsKKyAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdXBkYXRlUGxheWxpc3RNZXRhZGF0YV9pbXBsKEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgeworICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZFBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7CisgICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtX2ltcGwoQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7CisgICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVwbGFjZVBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7CisgICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2tpcFRvUGxheWxpc3RJdGVtX2ltcGwoQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7CisgICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2tpcFRvUHJldmlvdXNJdGVtX2ltcGwoKSB7CisgICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2tpcFRvTmV4dEl0ZW1faW1wbCgpIHsKKyAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFJlcGVhdE1vZGVfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdE1vZGVfaW1wbChpbnQgcmVwZWF0TW9kZSkgeworICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0U2h1ZmZsZU1vZGVfaW1wbCgpIHsKKyAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KKyAgICAgICAgcmV0dXJuIE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfTk9ORTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTaHVmZmxlTW9kZV9pbXBsKGludCBzaHVmZmxlTW9kZSkgeworICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBATnVsbGFibGUgTWVkaWFJdGVtMiBnZXRNZWRpYUl0ZW1faW1wbChATm9uTnVsbCBEYXRhU291cmNlRGVzYyBkc2QpIHsKKyAgICAgICAgaWYgKGRzZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkc2Qgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IGl0ZW1MaXN0ID0gbUluc3RhbmNlLmdldFBsYXlsaXN0KCk7CisgICAgICAgIGlmIChpdGVtTGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1MaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBpdGVtTGlzdC5nZXQoaSk7CisgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsICYmIGl0ZW0uZ2V0RGF0YVNvdXJjZURlc2MoKSA9PSBkc2QpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IGdldENhbGxiYWNrcygpIHsKKyAgICAgICAgQXJyYXlNYXA8UGxheWxpc3RFdmVudENhbGxiYWNrLCBFeGVjdXRvcj4gY2FsbGJhY2tzID0gbmV3IEFycmF5TWFwPD4oKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgY2FsbGJhY2tzLnB1dEFsbChtQ2FsbGJhY2tzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2FsbGJhY2tzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uMkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWM2MDQyCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb24ySW1wbC5qYXZhCkBAIC0wLDAgKzEsMTU1NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfQ1VTVE9NOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9MSUJSQVJZX1NFUlZJQ0U7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5UWVBFX1NFU1NJT047CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5UWVBFX1NFU1NJT05fU0VSVklDRTsKKworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRm9jdXNSZXF1ZXN0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuRGF0YVNvdXJjZURlc2M7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMi5QbGF5YmFja0luZm87CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZS5QbGF5ZXJFdmVudENhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlLlBsYXllclN0YXRlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50LlBsYXlsaXN0RXZlbnRDYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkJ1aWxkZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbW1hbmRCdXR0b247CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZEdyb3VwMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29udHJvbGxlckluZm87CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLk9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLlNlc3Npb25DYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVNlc3Npb24yUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CitpbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5HdWFyZGVkQnk7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7CisKK3B1YmxpYyBjbGFzcyBNZWRpYVNlc3Npb24ySW1wbCBpbXBsZW1lbnRzIE1lZGlhU2Vzc2lvbjJQcm92aWRlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVNlc3Npb24yIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsvL0xvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKKworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOworCisgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb24yIG1JbnN0YW5jZTsKKyAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUlkOworICAgIHByaXZhdGUgZmluYWwgRXhlY3V0b3IgbUNhbGxiYWNrRXhlY3V0b3I7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uQ2FsbGJhY2sgbUNhbGxiYWNrOworICAgIHByaXZhdGUgZmluYWwgTWVkaWFTZXNzaW9uMlN0dWIgbVNlc3Npb25TdHViOworICAgIHByaXZhdGUgZmluYWwgU2Vzc2lvblRva2VuMiBtU2Vzc2lvblRva2VuOworICAgIHByaXZhdGUgZmluYWwgQXVkaW9NYW5hZ2VyIG1BdWRpb01hbmFnZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBQZW5kaW5nSW50ZW50IG1TZXNzaW9uQWN0aXZpdHk7CisgICAgcHJpdmF0ZSBmaW5hbCBQbGF5ZXJFdmVudENhbGxiYWNrIG1QbGF5ZXJFdmVudENhbGxiYWNrOworICAgIHByaXZhdGUgZmluYWwgUGxheWxpc3RFdmVudENhbGxiYWNrIG1QbGF5bGlzdEV2ZW50Q2FsbGJhY2s7CisKKyAgICAvLyBtUGxheWVyIGlzIHNldCB0byBudWxsIHdoZW4gdGhlIHNlc3Npb24gaXMgY2xvc2VkLCBhbmQgd2Ugc2hvdWxkbid0IHRocm93IGFuIGV4Y2VwdGlvbgorICAgIC8vIG5vciBsZWF2ZSBsb2cgYWx3YXlzIGZvciB1c2luZyBtUGxheWVyIHdoZW4gaXQncyBudWxsLiBIZXJlJ3MgdGhlIHJlYXNvbi4KKyAgICAvLyBXaGVuIGEgTWVkaWFTZXNzaW9uMiBpcyBjbG9zZWQsIHRoZXJlIGNvdWxkIGJlIGEgcGVuZGVkIG9wZXJhdGlvbiBpbiB0aGUgc2Vzc2lvbiBjYWxsYmFjaworICAgIC8vIGV4ZWN1dG9yIHRoYXQgbWF5IHdhbnQgdG8gYWNjZXNzIHRoZSBwbGF5ZXIuIEhlcmUncyB0aGUgc2FtcGxlIGNvZGUgc25pcHBldCBmb3IgdGhhdC4KKyAgICAvLworICAgIC8vICAgcHVibGljIHZvaWQgb25Gb28oKSB7CisgICAgLy8gICAgIGlmIChtUGxheWVyID09IG51bGwpIHJldHVybjsgLy8gZmlyc3QgY2hlY2sKKyAgICAvLyAgICAgbVNlc3Npb25DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dG9yKCgpIC0+IHsKKyAgICAvLyAgICAgICAvLyBFcnJvci4gU2Vzc2lvbiBtYXkgYmUgY2xvc2VkIGFuZCBtUGxheWVyIGNhbiBiZSBudWxsIGhlcmUuCisgICAgLy8gICAgICAgbVBsYXllci5mb28oKTsKKyAgICAvLyAgICAgfSk7CisgICAgLy8gICB9CisgICAgLy8KKyAgICAvLyBCeSBhZGRpbmcgcHJvdGVjdGl2ZSBjb2RlLCB3ZSBjYW4gYWxzbyBwcm90ZWN0IEFQSXMgZnJvbSBiZWluZyBjYWxsZWQgYWZ0ZXIgdGhlIGNsb3NlKCkKKyAgICAvLworICAgIC8vIFRPRE8oamFld2FuKTogU2hvdWxkIHdlIHB1dCB2b2xhdGlsZSBoZXJlPworICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKKyAgICBwcml2YXRlIE1lZGlhUGxheWVyQmFzZSBtUGxheWVyOworICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKKyAgICBwcml2YXRlIE1lZGlhUGxheWxpc3RBZ2VudCBtUGxheWxpc3RBZ2VudDsKKyAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCisgICAgcHJpdmF0ZSBTZXNzaW9uUGxheWxpc3RBZ2VudCBtU2Vzc2lvblBsYXlsaXN0QWdlbnQ7CisgICAgQEd1YXJkZWRCeSgibUxvY2siKQorICAgIHByaXZhdGUgVm9sdW1lUHJvdmlkZXIyIG1Wb2x1bWVQcm92aWRlcjsKKyAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCisgICAgcHJpdmF0ZSBQbGF5YmFja0luZm8gbVBsYXliYWNrSW5mbzsKKyAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCisgICAgcHJpdmF0ZSBPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyIG1Ec21IZWxwZXI7CisKKyAgICAvKioKKyAgICAgKiBDYW4gYmUgb25seSBjYWxsZWQgYnkgdGhlIHtAbGluayBCdWlsZGVyI2J1aWxkKCl9LgorICAgICAqIEBwYXJhbSBjb250ZXh0CisgICAgICogQHBhcmFtIHBsYXllcgorICAgICAqIEBwYXJhbSBpZAorICAgICAqIEBwYXJhbSBwbGF5bGlzdEFnZW50CisgICAgICogQHBhcmFtIHZvbHVtZVByb3ZpZGVyCisgICAgICogQHBhcmFtIHNlc3Npb25BY3Rpdml0eQorICAgICAqIEBwYXJhbSBjYWxsYmFja0V4ZWN1dG9yCisgICAgICogQHBhcmFtIGNhbGxiYWNrCisgICAgICovCisgICAgcHVibGljIE1lZGlhU2Vzc2lvbjJJbXBsKENvbnRleHQgY29udGV4dCwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciwgU3RyaW5nIGlkLAorICAgICAgICAgICAgTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsIFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlciwKKyAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5LAorICAgICAgICAgICAgRXhlY3V0b3IgY2FsbGJhY2tFeGVjdXRvciwgU2Vzc2lvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIC8vIFRPRE8oamFld2FuKTogS2VlcCBvdGhlciBwYXJhbXMuCisgICAgICAgIG1JbnN0YW5jZSA9IGNyZWF0ZUluc3RhbmNlKCk7CisKKyAgICAgICAgLy8gQXJndW1lbnQgY2hlY2tzIGFyZSBkb25lIGJ5IGJ1aWxkZXIgYWxyZWFkeS4KKyAgICAgICAgLy8gSW5pdGlhbGl6ZSBmaW5hbHMgZmlyc3QuCisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbUlkID0gaWQ7CisgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvciA9IGNhbGxiYWNrRXhlY3V0b3I7CisgICAgICAgIG1TZXNzaW9uQWN0aXZpdHkgPSBzZXNzaW9uQWN0aXZpdHk7CisgICAgICAgIG1TZXNzaW9uU3R1YiA9IG5ldyBNZWRpYVNlc3Npb24yU3R1Yih0aGlzKTsKKyAgICAgICAgbUF1ZGlvTWFuYWdlciA9IChBdWRpb01hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFVRElPX1NFUlZJQ0UpOworICAgICAgICBtUGxheWVyRXZlbnRDYWxsYmFjayA9IG5ldyBNeVBsYXllckV2ZW50Q2FsbGJhY2sodGhpcyk7CisgICAgICAgIG1QbGF5bGlzdEV2ZW50Q2FsbGJhY2sgPSBuZXcgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2sodGhpcyk7CisKKyAgICAgICAgLy8gSW5mZXIgdHlwZSBmcm9tIHRoZSBpZCBhbmQgcGFja2FnZSBuYW1lLgorICAgICAgICBTdHJpbmcgbGlicmFyeVNlcnZpY2UgPSBnZXRTZXJ2aWNlTmFtZShjb250ZXh0LCBNZWRpYUxpYnJhcnlTZXJ2aWNlMi5TRVJWSUNFX0lOVEVSRkFDRSwgaWQpOworICAgICAgICBTdHJpbmcgc2Vzc2lvblNlcnZpY2UgPSBnZXRTZXJ2aWNlTmFtZShjb250ZXh0LCBNZWRpYVNlc3Npb25TZXJ2aWNlMi5TRVJWSUNFX0lOVEVSRkFDRSwgaWQpOworICAgICAgICBpZiAoc2Vzc2lvblNlcnZpY2UgIT0gbnVsbCAmJiBsaWJyYXJ5U2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBbWJpZ3VvdXMgc2Vzc2lvbiB0eXBlLiBNdWx0aXBsZSIKKyAgICAgICAgICAgICAgICAgICAgKyAiIHNlc3Npb24gc2VydmljZXMgZGVmaW5lIHRoZSBzYW1lIGlkPSIgKyBpZCk7CisgICAgICAgIH0gZWxzZSBpZiAobGlicmFyeVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNlc3Npb25Ub2tlbiA9IG5ldyBTZXNzaW9uVG9rZW4ySW1wbChQcm9jZXNzLm15VWlkKCksIFRZUEVfTElCUkFSWV9TRVJWSUNFLAorICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLCBsaWJyYXJ5U2VydmljZSwgaWQsIG1TZXNzaW9uU3R1YikuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgfSBlbHNlIGlmIChzZXNzaW9uU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtU2Vzc2lvblRva2VuID0gbmV3IFNlc3Npb25Ub2tlbjJJbXBsKFByb2Nlc3MubXlVaWQoKSwgVFlQRV9TRVNTSU9OX1NFUlZJQ0UsCisgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIHNlc3Npb25TZXJ2aWNlLCBpZCwgbVNlc3Npb25TdHViKS5nZXRJbnN0YW5jZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNlc3Npb25Ub2tlbiA9IG5ldyBTZXNzaW9uVG9rZW4ySW1wbChQcm9jZXNzLm15VWlkKCksIFRZUEVfU0VTU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgbnVsbCwgaWQsIG1TZXNzaW9uU3R1YikuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHVwZGF0ZVBsYXllcihwbGF5ZXIsIHBsYXlsaXN0QWdlbnQsIHZvbHVtZVByb3ZpZGVyKTsKKworICAgICAgICAvLyBBc2sgc2VydmVyIGZvciB0aGUgc2FuaXR5IGNoZWNrLCBhbmQgc3RhcnRzCisgICAgICAgIC8vIFNhbml0eSBjaGVjayBmb3IgbWFraW5nIHNlc3Npb24gSUQgdW5pcXVlICdwZXIgcGFja2FnZScgY2Fubm90IGJlIGRvbmUgaW4gaGVyZS4KKyAgICAgICAgLy8gU2VydmVyIGNhbiBvbmx5IGtub3cgaWYgdGhlIHBhY2thZ2UgaGFzIGFub3RoZXIgcHJvY2VzcyBhbmQgaGFzIGFub3RoZXIgc2Vzc2lvbiB3aXRoIHRoZQorICAgICAgICAvLyBzYW1lIGlkLiBOb3RlIHRoYXQgJ0lEIGlzIHVuaXF1ZSBwZXIgcGFja2FnZScgaXMgaW1wb3J0YW50IGZvciBjb250cm9sbGVyIHRvIGRpc3Rpbmd1aXNoCisgICAgICAgIC8vIGEgc2Vzc2lvbiBpbiBhbm90aGVyIHBhY2thZ2UuCisgICAgICAgIE1lZGlhU2Vzc2lvbk1hbmFnZXIgbWFuYWdlciA9CisgICAgICAgICAgICAgICAgKE1lZGlhU2Vzc2lvbk1hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5NRURJQV9TRVNTSU9OX1NFUlZJQ0UpOworICAgICAgICBpZiAoIW1hbmFnZXIuY3JlYXRlU2Vzc2lvbjIobVNlc3Npb25Ub2tlbikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlNlc3Npb24gd2l0aCB0aGUgc2FtZSBpZCBpcyBhbHJlYWR5IHVzZWQgYnkiCisgICAgICAgICAgICAgICAgICAgICsgIiBhbm90aGVyIHByb2Nlc3MuIFVzZSBNZWRpYUNvbnRyb2xsZXIyIGluc3RlYWQuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBNZWRpYVNlc3Npb24yIGNyZWF0ZUluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjIodGhpcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lKENvbnRleHQgY29udGV4dCwgU3RyaW5nIHNlcnZpY2VBY3Rpb24sIFN0cmluZyBpZCkgeworICAgICAgICBQYWNrYWdlTWFuYWdlciBtYW5hZ2VyID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBJbnRlbnQgc2VydmljZUludGVudCA9IG5ldyBJbnRlbnQoc2VydmljZUFjdGlvbik7CisgICAgICAgIHNlcnZpY2VJbnRlbnQuc2V0UGFja2FnZShjb250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOworICAgICAgICBMaXN0PFJlc29sdmVJbmZvPiBzZXJ2aWNlcyA9IG1hbmFnZXIucXVlcnlJbnRlbnRTZXJ2aWNlcyhzZXJ2aWNlSW50ZW50LAorICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLkdFVF9NRVRBX0RBVEEpOworICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBudWxsOworICAgICAgICBpZiAoc2VydmljZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlSWQgPSBTZXNzaW9uVG9rZW4ySW1wbC5nZXRTZXNzaW9uSWQoc2VydmljZXMuZ2V0KGkpKTsKKyAgICAgICAgICAgICAgICBpZiAoc2VydmljZUlkICE9IG51bGwgJiYgVGV4dFV0aWxzLmVxdWFscyhpZCwgc2VydmljZUlkKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZXMuZ2V0KGkpLnNlcnZpY2VJbmZvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBbWJpZ3VvdXMgc2Vzc2lvbiB0eXBlLiBNdWx0aXBsZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNlc3Npb24gc2VydmljZXMgZGVmaW5lIHRoZSBzYW1lIGlkPSIgKyBpZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWUgPSBzZXJ2aWNlcy5nZXQoaSkuc2VydmljZUluZm8ubmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNlcnZpY2VOYW1lOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBsYXllcl9pbXBsKEBOb25OdWxsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIsIE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAorICAgICAgICAgICAgVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgZW5zdXJlQ2FsbGluZ1RocmVhZCgpOworICAgICAgICBpZiAocGxheWVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBsYXllciBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHVwZGF0ZVBsYXllcihwbGF5ZXIsIHBsYXlsaXN0QWdlbnQsIHZvbHVtZVByb3ZpZGVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlUGxheWVyKE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCwKKyAgICAgICAgICAgIFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlcikgeworICAgICAgICBmaW5hbCBNZWRpYVBsYXllckJhc2Ugb2xkUGxheWVyOworICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgb2xkQWdlbnQ7CisgICAgICAgIGZpbmFsIFBsYXliYWNrSW5mbyBpbmZvID0gY3JlYXRlUGxheWJhY2tJbmZvKHZvbHVtZVByb3ZpZGVyLCBwbGF5ZXIuZ2V0QXVkaW9BdHRyaWJ1dGVzKCkpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBvbGRQbGF5ZXIgPSBtUGxheWVyOworICAgICAgICAgICAgb2xkQWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKKyAgICAgICAgICAgIG1QbGF5ZXIgPSBwbGF5ZXI7CisgICAgICAgICAgICBpZiAoYWdlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1TZXNzaW9uUGxheWxpc3RBZ2VudCA9IG5ldyBTZXNzaW9uUGxheWxpc3RBZ2VudCh0aGlzLCBtUGxheWVyKTsKKyAgICAgICAgICAgICAgICBpZiAobURzbUhlbHBlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uUGxheWxpc3RBZ2VudC5zZXRPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyKG1Ec21IZWxwZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhZ2VudCA9IG1TZXNzaW9uUGxheWxpc3RBZ2VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QbGF5bGlzdEFnZW50ID0gYWdlbnQ7CisgICAgICAgICAgICBtVm9sdW1lUHJvdmlkZXIgPSB2b2x1bWVQcm92aWRlcjsKKyAgICAgICAgICAgIG1QbGF5YmFja0luZm8gPSBpbmZvOworICAgICAgICB9CisgICAgICAgIGlmIChwbGF5ZXIgIT0gb2xkUGxheWVyKSB7CisgICAgICAgICAgICBwbGF5ZXIucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKG1DYWxsYmFja0V4ZWN1dG9yLCBtUGxheWVyRXZlbnRDYWxsYmFjayk7CisgICAgICAgICAgICBpZiAob2xkUGxheWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBXYXJuaW5nOiBQb29ybHkgaW1wbGVtZW50IHBsYXllciBtYXkgaWdub3JlIHRoaXMKKyAgICAgICAgICAgICAgICBvbGRQbGF5ZXIudW5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2sobVBsYXllckV2ZW50Q2FsbGJhY2spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChhZ2VudCAhPSBvbGRBZ2VudCkgeworICAgICAgICAgICAgYWdlbnQucmVnaXN0ZXJQbGF5bGlzdEV2ZW50Q2FsbGJhY2sobUNhbGxiYWNrRXhlY3V0b3IsIG1QbGF5bGlzdEV2ZW50Q2FsbGJhY2spOworICAgICAgICAgICAgaWYgKG9sZEFnZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBXYXJuaW5nOiBQb29ybHkgaW1wbGVtZW50IHBsYXllciBtYXkgaWdub3JlIHRoaXMKKyAgICAgICAgICAgICAgICBvbGRBZ2VudC51bnJlZ2lzdGVyUGxheWxpc3RFdmVudENhbGxiYWNrKG1QbGF5bGlzdEV2ZW50Q2FsbGJhY2spOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG9sZFBsYXllciAhPSBudWxsKSB7CisgICAgICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5UGxheWJhY2tJbmZvQ2hhbmdlZChpbmZvKTsKKyAgICAgICAgICAgIG5vdGlmeVBsYXllclVwZGF0ZWROb3RMb2NrZWQob2xkUGxheWVyKTsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJlcGVhdCB0aGUgc2FtZSB0aGluZyBmb3IgdGhlIHBsYXlsaXN0IGFnZW50LgorICAgIH0KKworICAgIHByaXZhdGUgUGxheWJhY2tJbmZvIGNyZWF0ZVBsYXliYWNrSW5mbyhWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIsIEF1ZGlvQXR0cmlidXRlcyBhdHRycykgeworICAgICAgICBQbGF5YmFja0luZm8gaW5mbzsKKyAgICAgICAgaWYgKHZvbHVtZVByb3ZpZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIGludCBzdHJlYW07CisgICAgICAgICAgICBpZiAoYXR0cnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHN0cmVhbSA9IEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0cmVhbSA9IGF0dHJzLmdldFZvbHVtZUNvbnRyb2xTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyZWFtID09IEF1ZGlvTWFuYWdlci5VU0VfREVGQVVMVF9TVFJFQU1fVFlQRSkgeworICAgICAgICAgICAgICAgICAgICAvLyBJdCBtYXkgaGFwcGVuIGlmIHRoZSBBdWRpb0F0dHJpYnV0ZXMgZG9lc24ndCBoYXZlIHVzYWdlLgorICAgICAgICAgICAgICAgICAgICAvLyBDaGFuZ2UgaXQgdG8gdGhlIFNUUkVBTV9NVVNJQyBiZWNhdXNlIGl0J3Mgbm90IHN1cHBvcnRlZCBieSBhdWRpbyBtYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgIC8vIGZvciBxdWVyeWluZyB2b2x1bWUgbGV2ZWwuCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5mbyA9IE1lZGlhQ29udHJvbGxlcjJJbXBsLlBsYXliYWNrSW5mb0ltcGwuY3JlYXRlUGxheWJhY2tJbmZvKAorICAgICAgICAgICAgICAgICAgICBQbGF5YmFja0luZm8uUExBWUJBQ0tfVFlQRV9MT0NBTCwKKyAgICAgICAgICAgICAgICAgICAgYXR0cnMsCisgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuaXNWb2x1bWVGaXhlZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBWb2x1bWVQcm92aWRlcjIuVk9MVU1FX0NPTlRST0xfRklYRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFZvbHVtZVByb3ZpZGVyMi5WT0xVTUVfQ09OVFJPTF9BQlNPTFVURSwKKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1NYXhWb2x1bWUoc3RyZWFtKSwKKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1Wb2x1bWUoc3RyZWFtKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbmZvID0gTWVkaWFDb250cm9sbGVyMkltcGwuUGxheWJhY2tJbmZvSW1wbC5jcmVhdGVQbGF5YmFja0luZm8oCisgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrSW5mby5QTEFZQkFDS19UWVBFX1JFTU9URSAvKiBDb250cm9sVHlwZSAqLywKKyAgICAgICAgICAgICAgICAgICAgYXR0cnMsCisgICAgICAgICAgICAgICAgICAgIHZvbHVtZVByb3ZpZGVyLmdldENvbnRyb2xUeXBlKCksCisgICAgICAgICAgICAgICAgICAgIHZvbHVtZVByb3ZpZGVyLmdldE1heFZvbHVtZSgpLAorICAgICAgICAgICAgICAgICAgICB2b2x1bWVQcm92aWRlci5nZXRDdXJyZW50Vm9sdW1lKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpbmZvOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlX2ltcGwoKSB7CisgICAgICAgIC8vIFN0b3Agc3lzdGVtIHNlcnZpY2UgZnJvbSBsaXN0ZW5pbmcgdGhpcyBzZXNzaW9uIGZpcnN0LgorICAgICAgICBNZWRpYVNlc3Npb25NYW5hZ2VyIG1hbmFnZXIgPQorICAgICAgICAgICAgICAgIChNZWRpYVNlc3Npb25NYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTUVESUFfU0VTU0lPTl9TRVJWSUNFKTsKKyAgICAgICAgbWFuYWdlci5kZXN0cm95U2Vzc2lvbjIobVNlc3Npb25Ub2tlbik7CisKKyAgICAgICAgaWYgKG1TZXNzaW9uU3R1YiAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJzZXNzaW9uIGlzIG5vdyB1bmF2YWlsYWJsZSwgaWQ9IiArIG1JZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJbnZhbGlkYXRlIHByZXZpb3VzbHkgcHVibGlzaGVkIHNlc3Npb24gc3R1Yi4KKyAgICAgICAgICAgIG1TZXNzaW9uU3R1Yi5kZXN0cm95Tm90TG9ja2VkKCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllcjsKKyAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50OworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBwbGF5ZXIgPSBtUGxheWVyOworICAgICAgICAgICAgbVBsYXllciA9IG51bGw7CisgICAgICAgICAgICBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OworICAgICAgICAgICAgbVBsYXlsaXN0QWdlbnQgPSBudWxsOworICAgICAgICAgICAgbVNlc3Npb25QbGF5bGlzdEFnZW50ID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBsYXllci51bnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhtUGxheWVyRXZlbnRDYWxsYmFjayk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFnZW50LnVucmVnaXN0ZXJQbGF5bGlzdEV2ZW50Q2FsbGJhY2sobVBsYXlsaXN0RXZlbnRDYWxsYmFjayk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVkaWFQbGF5ZXJCYXNlIGdldFBsYXllcl9pbXBsKCkgeworICAgICAgICByZXR1cm4gZ2V0UGxheWVyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1lZGlhUGxheWxpc3RBZ2VudCBnZXRQbGF5bGlzdEFnZW50X2ltcGwoKSB7CisgICAgICAgIHJldHVybiBtUGxheWxpc3RBZ2VudDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVm9sdW1lUHJvdmlkZXIyIGdldFZvbHVtZVByb3ZpZGVyX2ltcGwoKSB7CisgICAgICAgIHJldHVybiBtVm9sdW1lUHJvdmlkZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNlc3Npb25Ub2tlbjIgZ2V0VG9rZW5faW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIG1TZXNzaW9uVG9rZW47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8Q29udHJvbGxlckluZm8+IGdldENvbm5lY3RlZENvbnRyb2xsZXJzX2ltcGwoKSB7CisgICAgICAgIHJldHVybiBtU2Vzc2lvblN0dWIuZ2V0Q29udHJvbGxlcnMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRBdWRpb0ZvY3VzUmVxdWVzdF9pbXBsKEF1ZGlvRm9jdXNSZXF1ZXN0IGFmcikgeworICAgICAgICAvLyBpbXBsZW1lbnQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwbGF5X2ltcGwoKSB7CisgICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKKyAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7CisgICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcGxheWVyLnBsYXkoKTsKKyAgICAgICAgfSBlbHNlIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHBhdXNlX2ltcGwoKSB7CisgICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKKyAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7CisgICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcGxheWVyLnBhdXNlKCk7CisgICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdG9wX2ltcGwoKSB7CisgICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKKyAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7CisgICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcGxheWVyLnJlc2V0KCk7CisgICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBza2lwVG9QbGF5bGlzdEl0ZW1faW1wbChATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKKyAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OworICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgYWdlbnQuc2tpcFRvUGxheWxpc3RJdGVtKGl0ZW0pOworICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2tpcFRvUHJldmlvdXNJdGVtX2ltcGwoKSB7CisgICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OworICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgYWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7CisgICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0SXRlbV9pbXBsKCkgeworICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKKyAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFnZW50LnNraXBUb05leHRJdGVtKCk7CisgICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21MYXlvdXRfaW1wbChATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAorICAgICAgICAgICAgQE5vbk51bGwgTGlzdDxDb21tYW5kQnV0dG9uPiBsYXlvdXQpIHsKKyAgICAgICAgZW5zdXJlQ2FsbGluZ1RocmVhZCgpOworICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250cm9sbGVyIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxheW91dCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsYXlvdXQgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5Q3VzdG9tTGF5b3V0Tm90TG9ja2VkKGNvbnRyb2xsZXIsIGxheW91dCk7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBUT0RPKGphZXdhbik6IEltcGxlbWVudCBmb2xsb3dzCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEFsbG93ZWRDb21tYW5kc19pbXBsKEBOb25OdWxsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsCisgICAgICAgICAgICBATm9uTnVsbCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBjb21tYW5kcykgeworICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250cm9sbGVyIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbW1hbmRzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmRzIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgbVNlc3Npb25TdHViLnNldEFsbG93ZWRDb21tYW5kcyhjb250cm9sbGVyLCBjb21tYW5kcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUNvbW1hbmRfaW1wbChATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAorICAgICAgICAgICAgQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQsIEJ1bmRsZSBhcmdzLCBSZXN1bHRSZWNlaXZlciByZWNlaXZlcikgeworICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250cm9sbGVyIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIG1TZXNzaW9uU3R1Yi5zZW5kQ3VzdG9tQ29tbWFuZChjb250cm9sbGVyLCBjb21tYW5kLCBhcmdzLCByZWNlaXZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUNvbW1hbmRfaW1wbChATm9uTnVsbCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCwgQnVuZGxlIGFyZ3MpIHsKKyAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIG1TZXNzaW9uU3R1Yi5zZW5kQ3VzdG9tQ29tbWFuZChjb21tYW5kLCBhcmdzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdF9pbXBsKEBOb25OdWxsIExpc3Q8TWVkaWFJdGVtMj4gbGlzdCwgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKKyAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGlzdCBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKKyAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7CisgICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7CisgICAgICAgICAgICBhZ2VudC5zZXRQbGF5bGlzdChsaXN0LCBtZXRhZGF0YSk7CisgICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhX2ltcGwoTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKKyAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7CisgICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7CisgICAgICAgICAgICBhZ2VudC51cGRhdGVQbGF5bGlzdE1ldGFkYXRhKG1ldGFkYXRhKTsKKyAgICAgICAgfSBlbHNlIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZFBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluZGV4IHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIpOworICAgICAgICB9CisgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKKyAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFnZW50LmFkZFBsYXlsaXN0SXRlbShpbmRleCwgaXRlbSk7CisgICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVQbGF5bGlzdEl0ZW1faW1wbChATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKKyAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OworICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgYWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGl0ZW0pOworICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVwbGFjZVBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluZGV4IHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIpOworICAgICAgICB9CisgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKKyAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFnZW50LnJlcGxhY2VQbGF5bGlzdEl0ZW0oaW5kZXgsIGl0ZW0pOworICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8TWVkaWFJdGVtMj4gZ2V0UGxheWxpc3RfaW1wbCgpIHsKKyAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7CisgICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gYWdlbnQuZ2V0UGxheWxpc3QoKTsKKyAgICAgICAgfSBlbHNlIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTIgZ2V0UGxheWxpc3RNZXRhZGF0YV9pbXBsKCkgeworICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKKyAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBhZ2VudC5nZXRQbGF5bGlzdE1ldGFkYXRhKCk7CisgICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1lZGlhSXRlbTIgZ2V0Q3VycmVudFBsYXlsaXN0SXRlbV9pbXBsKCkgeworICAgICAgICAvLyBUT0RPKGphZXdhbik6IEltcGxlbWVudAorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFJlcGVhdE1vZGVfaW1wbCgpIHsKKyAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7CisgICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gYWdlbnQuZ2V0UmVwZWF0TW9kZSgpOworICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRNb2RlX2ltcGwoaW50IHJlcGVhdE1vZGUpIHsKKyAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7CisgICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7CisgICAgICAgICAgICBhZ2VudC5zZXRSZXBlYXRNb2RlKHJlcGVhdE1vZGUpOworICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRTaHVmZmxlTW9kZV9pbXBsKCkgeworICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKKyAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBhZ2VudC5nZXRTaHVmZmxlTW9kZSgpOworICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX05PTkU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0U2h1ZmZsZU1vZGVfaW1wbChpbnQgc2h1ZmZsZU1vZGUpIHsKKyAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7CisgICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7CisgICAgICAgICAgICBhZ2VudC5zZXRTaHVmZmxlTW9kZShzaHVmZmxlTW9kZSk7CisgICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwcmVwYXJlX2ltcGwoKSB7CisgICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKKyAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7CisgICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcGxheWVyLnByZXBhcmUoKTsKKyAgICAgICAgfSBlbHNlIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNlZWtUb19pbXBsKGxvbmcgcG9zKSB7CisgICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKKyAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7CisgICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcGxheWVyLnNlZWtUbyhwb3MpOworICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEBQbGF5ZXJTdGF0ZSBpbnQgZ2V0UGxheWVyU3RhdGVfaW1wbCgpIHsKKyAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7CisgICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXIuZ2V0UGxheWVyU3RhdGUoKTsKKyAgICAgICAgfSBlbHNlIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTWVkaWFQbGF5ZXJCYXNlLlBMQVlFUl9TVEFURV9FUlJPUjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRDdXJyZW50UG9zaXRpb25faW1wbCgpIHsKKyAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7CisgICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCk7CisgICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE1lZGlhUGxheWVyQmFzZS5VTktOT1dOX1RJTUU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0QnVmZmVyZWRQb3NpdGlvbl9pbXBsKCkgeworICAgICAgICBmaW5hbCBNZWRpYVBsYXllckJhc2UgcGxheWVyID0gbVBsYXllcjsKKyAgICAgICAgaWYgKHBsYXllciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbVBsYXllci5nZXRCdWZmZXJlZFBvc2l0aW9uKCk7CisgICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE1lZGlhUGxheWVyQmFzZS5VTktOT1dOX1RJTUU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgbm90aWZ5RXJyb3JfaW1wbChpbnQgZXJyb3JDb2RlLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlFcnJvcihlcnJvckNvZGUsIGV4dHJhcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0T25EYXRhU291cmNlTWlzc2luZ0hlbHBlcl9pbXBsKEBOb25OdWxsIE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIgaGVscGVyKSB7CisgICAgICAgIGlmIChoZWxwZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaGVscGVyIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgbURzbUhlbHBlciA9IGhlbHBlcjsKKyAgICAgICAgICAgIGlmIChtU2Vzc2lvblBsYXlsaXN0QWdlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1TZXNzaW9uUGxheWxpc3RBZ2VudC5zZXRPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyKGhlbHBlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbGVhck9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXJfaW1wbCgpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgbURzbUhlbHBlciA9IG51bGw7CisgICAgICAgICAgICBpZiAobVNlc3Npb25QbGF5bGlzdEFnZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvblBsYXlsaXN0QWdlbnQuY2xlYXJPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBQcm90ZWN0ZWQgb3IgcHJpdmF0ZSBtZXRob2RzCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvLyBFbmZvcmNlcyBkZXZlbG9wZXJzIHRvIGNhbGwgYWxsIHRoZSBtZXRob2RzIG9uIHRoZSBpbml0aWFsbHkgZ2l2ZW4gdGhyZWFkCisgICAgLy8gYmVjYXVzZSBjYWxscyBmcm9tIHRoZSBNZWRpYUNvbnRyb2xsZXIyIHdpbGwgYmUgcnVuIG9uIHRoZSB0aHJlYWQuCisgICAgLy8gVE9ETyhqYWV3YW4pOiBTaG91bGQgd2UgYWxsb3cgY2FsbHMgZnJvbSB0aGUgbXVsdGlwbGUgdGhyZWFkPworICAgIC8vICAgICAgICAgICAgICAgSSBwcmVmZXIgdGhpcyB3YXkgYmVjYXVzZSBhbGxvd2luZyBtdWx0aXBsZSB0aHJlYWQgbWF5IGNhc2UgdHJpY2t5IGlzc3VlIGxpa2UKKyAgICAvLyAgICAgICAgICAgICAgIGIvNjM0NDYzNjAuIElmIHRoZSB7QGxpbmsgI3NldFBsYXllcigpfSB3aXRoIHtAY29kZSBudWxsfSBjYW4gYmUgY2FsbGVkIGZyb20KKyAgICAvLyAgICAgICAgICAgICAgIGFub3RoZXIgdGhyZWFkLCB0cmFuc3BvcnQgY29udHJvbHMgY2FuIGJlIGNhbGxlZCBhZnRlciB0aGF0LgorICAgIC8vICAgICAgICAgICAgICAgVGhhdCdzIGJhc2ljYWxseSB0aGUgZGV2ZWxvcGVyJ3MgbWlzdGFrZSwgYnV0IHRoZXkgY2Fubm90IHVuZGVyc3RhbmQgd2hhdCdzCisgICAgLy8gICAgICAgICAgICAgICBoYXBwZW5pbmcgYmVoaW5kIHVudGlsIHdlIHRlbGwgdGhlbSBzby4KKyAgICAvLyAgICAgICAgICAgICAgIElmIGVuZm9yY2luZyBjYWxsbGluZyB0aHJlYWQgZG9lc24ndCBsb29rIGdvb2QsIHdlIGNhbiBhbHRlcm5hdGl2ZWx5IHBpY2sKKyAgICAvLyAgICAgICAgICAgICAgIDEuIEFsbG93IGNhbGxzIGZyb20gcmFuZG9tIHRocmVhZHMgZm9yIGFsbCBtZXRob2RzLgorICAgIC8vICAgICAgICAgICAgICAgMi4gQWxsb3cgY2FsbHMgZnJvbSByYW5kb20gdGhyZWFkcyBmb3IgYWxsIG1ldGhvZHMsIGV4Y2VwdCBmb3IgdGhlCisgICAgLy8gICAgICAgICAgICAgICAgICB7QGxpbmsgI3NldFBsYXllcigpfS4KKyAgICB2b2lkIGVuc3VyZUNhbGxpbmdUaHJlYWQoKSB7CisgICAgICAgIC8vIFRPRE8oamFld2FuKTogVW5jb21tZW50IG9yIHJlbW92ZQorICAgICAgICAvKgorICAgICAgICBpZiAobUhhbmRsZXIuZ2V0TG9vcGVyKCkgIT0gTG9vcGVyLm15TG9vcGVyKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlJ1biB0aGlzIG9uIHRoZSBnaXZlbiB0aHJlYWQiKTsKKyAgICAgICAgfSovCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG5vdGlmeVBsYXlsaXN0Q2hhbmdlZE9uRXhlY3V0b3IoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCisgICAgICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7CisgICAgICAgIGlmIChwbGF5bGlzdEFnZW50ICE9IG1QbGF5bGlzdEFnZW50KSB7CisgICAgICAgICAgICAvLyBJZ25vcmUgY2FsbHMgZnJvbSB0aGUgb2xkIGFnZW50LgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1DYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZChtSW5zdGFuY2UsIHBsYXlsaXN0QWdlbnQsIGxpc3QsIG1ldGFkYXRhKTsKKyAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBsYXlsaXN0Q2hhbmdlZE5vdExvY2tlZChsaXN0LCBtZXRhZGF0YSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG5vdGlmeVBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkT25FeGVjdXRvcihNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwKKyAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7CisgICAgICAgIGlmIChwbGF5bGlzdEFnZW50ICE9IG1QbGF5bGlzdEFnZW50KSB7CisgICAgICAgICAgICAvLyBJZ25vcmUgY2FsbHMgZnJvbSB0aGUgb2xkIGFnZW50LgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1DYWxsYmFjay5vblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKG1JbnN0YW5jZSwgcGxheWxpc3RBZ2VudCwgbWV0YWRhdGEpOworICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5UGxheWxpc3RNZXRhZGF0YUNoYW5nZWROb3RMb2NrZWQobWV0YWRhdGEpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBub3RpZnlSZXBlYXRNb2RlQ2hhbmdlZE9uRXhlY3V0b3IoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCisgICAgICAgICAgICBpbnQgcmVwZWF0TW9kZSkgeworICAgICAgICBpZiAocGxheWxpc3RBZ2VudCAhPSBtUGxheWxpc3RBZ2VudCkgeworICAgICAgICAgICAgLy8gSWdub3JlIGNhbGxzIGZyb20gdGhlIG9sZCBhZ2VudC4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtQ2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZChtSW5zdGFuY2UsIHBsYXlsaXN0QWdlbnQsIHJlcGVhdE1vZGUpOworICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5UmVwZWF0TW9kZUNoYW5nZWROb3RMb2NrZWQocmVwZWF0TW9kZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG5vdGlmeVNodWZmbGVNb2RlQ2hhbmdlZE9uRXhlY3V0b3IoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCisgICAgICAgICAgICBpbnQgc2h1ZmZsZU1vZGUpIHsKKyAgICAgICAgaWYgKHBsYXlsaXN0QWdlbnQgIT0gbVBsYXlsaXN0QWdlbnQpIHsKKyAgICAgICAgICAgIC8vIElnbm9yZSBjYWxscyBmcm9tIHRoZSBvbGQgYWdlbnQuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUNhbGxiYWNrLm9uU2h1ZmZsZU1vZGVDaGFuZ2VkKG1JbnN0YW5jZSwgcGxheWxpc3RBZ2VudCwgc2h1ZmZsZU1vZGUpOworICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5U2h1ZmZsZU1vZGVDaGFuZ2VkTm90TG9ja2VkKHNodWZmbGVNb2RlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbm90aWZ5UGxheWVyVXBkYXRlZE5vdExvY2tlZChNZWRpYVBsYXllckJhc2Ugb2xkUGxheWVyKSB7CisgICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOworICAgICAgICAvLyBUT0RPKGphZXdhbik6IChDYW4gYmUgcG9zdC1QKSBGaW5kIGJldHRlciB3YXkgZm9yIHBsYXllci5nZXRQbGF5ZXJTdGF0ZSgpIC8vCisgICAgICAgIC8vICAgICAgICAgICAgICAgSW4gdGhlb3J5LCBTZXNzaW9uLmdldFhYWCgpIG1heSBub3QgYmUgdGhlIHNhbWUgYXMgUGxheWVyLmdldFhYWCgpCisgICAgICAgIC8vICAgICAgICAgICAgICAgYW5kIHdlIHNob3VsZCBub3RpZnkgaW5mb3JtYXRpb24gb2YgdGhlIHNlc3Npb24uZ2V0WFhYKCkgaW5zdGVhZCBvZgorICAgICAgICAvLyAgICAgICAgICAgICAgIHBsYXllci5nZXRYWFgoKQorICAgICAgICAvLyBOb3RpZnkgdG8gY29udHJvbGxlcnMgYXMgd2VsbC4KKyAgICAgICAgZmluYWwgaW50IHN0YXRlID0gcGxheWVyLmdldFBsYXllclN0YXRlKCk7CisgICAgICAgIGlmIChzdGF0ZSAhPSBvbGRQbGF5ZXIuZ2V0UGxheWVyU3RhdGUoKSkgeworICAgICAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBsYXllclN0YXRlQ2hhbmdlZE5vdExvY2tlZChzdGF0ZSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBsb25nIGN1cnJlbnRUaW1lTXMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgZmluYWwgbG9uZyBwb3NpdGlvbiA9IHBsYXllci5nZXRDdXJyZW50UG9zaXRpb24oKTsKKyAgICAgICAgaWYgKHBvc2l0aW9uICE9IG9sZFBsYXllci5nZXRDdXJyZW50UG9zaXRpb24oKSkgeworICAgICAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBvc2l0aW9uQ2hhbmdlZE5vdExvY2tlZChjdXJyZW50VGltZU1zLCBwb3NpdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBmbG9hdCBzcGVlZCA9IHBsYXllci5nZXRQbGF5YmFja1NwZWVkKCk7CisgICAgICAgIGlmIChzcGVlZCAhPSBvbGRQbGF5ZXIuZ2V0UGxheWJhY2tTcGVlZCgpKSB7CisgICAgICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5UGxheWJhY2tTcGVlZENoYW5nZWROb3RMb2NrZWQoc3BlZWQpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgbG9uZyBidWZmZXJlZFBvc2l0aW9uID0gcGxheWVyLmdldEJ1ZmZlcmVkUG9zaXRpb24oKTsKKyAgICAgICAgaWYgKGJ1ZmZlcmVkUG9zaXRpb24gIT0gb2xkUGxheWVyLmdldEJ1ZmZlcmVkUG9zaXRpb24oKSkgeworICAgICAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeUJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkTm90TG9ja2VkKGJ1ZmZlcmVkUG9zaXRpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gbUNvbnRleHQ7CisgICAgfQorCisgICAgTWVkaWFTZXNzaW9uMiBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKKyAgICB9CisKKyAgICBNZWRpYVBsYXllckJhc2UgZ2V0UGxheWVyKCkgeworICAgICAgICByZXR1cm4gbVBsYXllcjsKKyAgICB9CisKKyAgICBNZWRpYVBsYXlsaXN0QWdlbnQgZ2V0UGxheWxpc3RBZ2VudCgpIHsKKyAgICAgICAgcmV0dXJuIG1QbGF5bGlzdEFnZW50OworICAgIH0KKworICAgIEV4ZWN1dG9yIGdldENhbGxiYWNrRXhlY3V0b3IoKSB7CisgICAgICAgIHJldHVybiBtQ2FsbGJhY2tFeGVjdXRvcjsKKyAgICB9CisKKyAgICBTZXNzaW9uQ2FsbGJhY2sgZ2V0Q2FsbGJhY2soKSB7CisgICAgICAgIHJldHVybiBtQ2FsbGJhY2s7CisgICAgfQorCisgICAgTWVkaWFTZXNzaW9uMlN0dWIgZ2V0U2Vzc2lvblN0dWIoKSB7CisgICAgICAgIHJldHVybiBtU2Vzc2lvblN0dWI7CisgICAgfQorCisgICAgVm9sdW1lUHJvdmlkZXIyIGdldFZvbHVtZVByb3ZpZGVyKCkgeworICAgICAgICByZXR1cm4gbVZvbHVtZVByb3ZpZGVyOworICAgIH0KKworICAgIFBsYXliYWNrSW5mbyBnZXRQbGF5YmFja0luZm8oKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIHJldHVybiBtUGxheWJhY2tJbmZvOworICAgICAgICB9CisgICAgfQorCisgICAgUGVuZGluZ0ludGVudCBnZXRTZXNzaW9uQWN0aXZpdHkoKSB7CisgICAgICAgIHJldHVybiBtU2Vzc2lvbkFjdGl2aXR5OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE15UGxheWVyRXZlbnRDYWxsYmFjayBleHRlbmRzIFBsYXllckV2ZW50Q2FsbGJhY2sgeworICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8TWVkaWFTZXNzaW9uMkltcGw+IG1TZXNzaW9uOworCisgICAgICAgIHByaXZhdGUgTXlQbGF5ZXJFdmVudENhbGxiYWNrKE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24pIHsKKyAgICAgICAgICAgIG1TZXNzaW9uID0gbmV3IFdlYWtSZWZlcmVuY2U8PihzZXNzaW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkN1cnJlbnREYXRhU291cmNlQ2hhbmdlZChNZWRpYVBsYXllckJhc2UgbXBiLCBEYXRhU291cmNlRGVzYyBkc2QpIHsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsIHx8IGRzZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7CisgICAgICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gZ2V0TWVkaWFJdGVtKHNlc3Npb24sIGRzZCk7CisgICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkN1cnJlbnRNZWRpYUl0ZW1DaGFuZ2VkKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgbXBiLCBpdGVtKTsKKyAgICAgICAgICAgICAgICAvLyBUT0RPIChqYWV3YW4pOiBOb3RpZnkgY29udHJvbGxlcnMgdGhyb3VnaCBhcHByb3ByaWF0ZSBjYWxsYmFjay4gKGIvNzQ1MDU5MzYpCisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbk1lZGlhUHJlcGFyZWQoTWVkaWFQbGF5ZXJCYXNlIG1wYiwgRGF0YVNvdXJjZURlc2MgZHNkKSB7CisgICAgICAgICAgICBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOworICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCB8fCBkc2QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4geworICAgICAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IGdldE1lZGlhSXRlbShzZXNzaW9uLCBkc2QpOworICAgICAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25NZWRpYVByZXBhcmVkKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgbXBiLCBpdGVtKTsKKyAgICAgICAgICAgICAgICAvLyBUT0RPIChqYWV3YW4pOiBOb3RpZnkgY29udHJvbGxlcnMgdGhyb3VnaCBhcHByb3ByaWF0ZSBjYWxsYmFjay4gKGIvNzQ1MDU5MzYpCisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXllclN0YXRlQ2hhbmdlZChNZWRpYVBsYXllckJhc2UgbXBiLCBpbnQgc3RhdGUpIHsKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uUGxheWVyU3RhdGVDaGFuZ2VkKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgbXBiLCBzdGF0ZSk7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRTZXNzaW9uU3R1YigpLm5vdGlmeVBsYXllclN0YXRlQ2hhbmdlZE5vdExvY2tlZChzdGF0ZSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkJ1ZmZlcmluZ1N0YXRlQ2hhbmdlZChNZWRpYVBsYXllckJhc2UgbXBiLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCBzdGF0ZSkgeworICAgICAgICAgICAgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgfHwgZHNkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKKyAgICAgICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBnZXRNZWRpYUl0ZW0oc2Vzc2lvbiwgZHNkKTsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uQnVmZmVyaW5nU3RhdGVDaGFuZ2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBtcGIsIGl0ZW0sIHN0YXRlKTsKKyAgICAgICAgICAgICAgICAvLyBUT0RPIChqYWV3YW4pOiBOb3RpZnkgY29udHJvbGxlcnMgdGhyb3VnaCBhcHByb3ByaWF0ZSBjYWxsYmFjay4gKGIvNzQ1MDU5MzYpCisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uMkltcGwgZ2V0U2Vzc2lvbigpIHsKKyAgICAgICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgJiYgREVCVUcpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTZXNzaW9uIGlzIGNsb3NlZCIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc2Vzc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgTWVkaWFJdGVtMiBnZXRNZWRpYUl0ZW0oTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiwgRGF0YVNvdXJjZURlc2MgZHNkKSB7CisgICAgICAgICAgICBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBzZXNzaW9uLmdldFBsYXlsaXN0QWdlbnQoKTsKKyAgICAgICAgICAgIGlmIChhZ2VudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlNlc3Npb24gaXMgY2xvc2VkIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBhZ2VudC5nZXRNZWRpYUl0ZW0oZHNkKTsKKyAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ291bGQgbm90IGZpbmQgbWF0Y2hpbmcgaXRlbSBmb3IgZHNkPSIgKyBkc2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNeVBsYXlsaXN0RXZlbnRDYWxsYmFjayBleHRlbmRzIFBsYXlsaXN0RXZlbnRDYWxsYmFjayB7CisgICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxNZWRpYVNlc3Npb24ySW1wbD4gbVNlc3Npb247CisKKyAgICAgICAgcHJpdmF0ZSBNeVBsYXlsaXN0RXZlbnRDYWxsYmFjayhNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uKSB7CisgICAgICAgICAgICBtU2Vzc2lvbiA9IG5ldyBXZWFrUmVmZXJlbmNlPD4oc2Vzc2lvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25QbGF5bGlzdENoYW5nZWQoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsIExpc3Q8TWVkaWFJdGVtMj4gbGlzdCwKKyAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgeworICAgICAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IG1TZXNzaW9uLmdldCgpOworICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlc3Npb24ubm90aWZ5UGxheWxpc3RDaGFuZ2VkT25FeGVjdXRvcihwbGF5bGlzdEFnZW50LCBsaXN0LCBtZXRhZGF0YSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwKKyAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgeworICAgICAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IG1TZXNzaW9uLmdldCgpOworICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlc3Npb24ubm90aWZ5UGxheWxpc3RNZXRhZGF0YUNoYW5nZWRPbkV4ZWN1dG9yKHBsYXlsaXN0QWdlbnQsIG1ldGFkYXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJlcGVhdE1vZGVDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBpbnQgcmVwZWF0TW9kZSkgeworICAgICAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IG1TZXNzaW9uLmdldCgpOworICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlc3Npb24ubm90aWZ5UmVwZWF0TW9kZUNoYW5nZWRPbkV4ZWN1dG9yKHBsYXlsaXN0QWdlbnQsIHJlcGVhdE1vZGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBpbnQgc2h1ZmZsZU1vZGUpIHsKKyAgICAgICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXNzaW9uLm5vdGlmeVNodWZmbGVNb2RlQ2hhbmdlZE9uRXhlY3V0b3IocGxheWxpc3RBZ2VudCwgc2h1ZmZsZU1vZGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDb21tYW5kSW1wbCBpbXBsZW1lbnRzIENvbW1hbmRQcm92aWRlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NTUFORF9DT0RFCisgICAgICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5jb21tYW5kLmNvbW1hbmRfY29kZSI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NTUFORF9DVVNUT01fQ09NTUFORAorICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZC5jdXN0b21fY29tbWFuZCI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NTUFORF9FWFRSQVMKKyAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmQuZXh0cmFzIjsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFNlc3Npb25Db21tYW5kMiBtSW5zdGFuY2U7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1Db21tYW5kQ29kZTsKKyAgICAgICAgLy8gTm9ubnVsbCBpZiBpdCdzIGN1c3RvbSBjb21tYW5kCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1DdXN0b21Db21tYW5kOworICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtRXh0cmFzOworCisgICAgICAgIHB1YmxpYyBDb21tYW5kSW1wbChTZXNzaW9uQ29tbWFuZDIgaW5zdGFuY2UsIGludCBjb21tYW5kQ29kZSkgeworICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7CisgICAgICAgICAgICBtQ29tbWFuZENvZGUgPSBjb21tYW5kQ29kZTsKKyAgICAgICAgICAgIG1DdXN0b21Db21tYW5kID0gbnVsbDsKKyAgICAgICAgICAgIG1FeHRyYXMgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbW1hbmRJbXBsKFNlc3Npb25Db21tYW5kMiBpbnN0YW5jZSwgQE5vbk51bGwgU3RyaW5nIGFjdGlvbiwKKyAgICAgICAgICAgICAgICBATnVsbGFibGUgQnVuZGxlIGV4dHJhcykgeworICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYWN0aW9uIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKKyAgICAgICAgICAgIG1Db21tYW5kQ29kZSA9IENPTU1BTkRfQ09ERV9DVVNUT007CisgICAgICAgICAgICBtQ3VzdG9tQ29tbWFuZCA9IGFjdGlvbjsKKyAgICAgICAgICAgIG1FeHRyYXMgPSBleHRyYXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRDb21tYW5kQ29kZV9pbXBsKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Db21tYW5kQ29kZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQE51bGxhYmxlIFN0cmluZyBnZXRDdXN0b21Db21tYW5kX2ltcGwoKSB7CisgICAgICAgICAgICByZXR1cm4gbUN1c3RvbUNvbW1hbmQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEBOdWxsYWJsZSBCdW5kbGUgZ2V0RXh0cmFzX2ltcGwoKSB7CisgICAgICAgICAgICByZXR1cm4gbUV4dHJhczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIGEgbmV3IEJ1bmRsZSBpbnN0YW5jZSBmcm9tIHRoZSBDb21tYW5kCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1bmRsZSB0b0J1bmRsZV9pbXBsKCkgeworICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX0NPTU1BTkRfQ09ERSwgbUNvbW1hbmRDb2RlKTsKKyAgICAgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX0NPTU1BTkRfQ1VTVE9NX0NPTU1BTkQsIG1DdXN0b21Db21tYW5kKTsKKyAgICAgICAgICAgIGJ1bmRsZS5wdXRCdW5kbGUoS0VZX0NPTU1BTkRfRVhUUkFTLCBtRXh0cmFzKTsKKyAgICAgICAgICAgIHJldHVybiBidW5kbGU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiBhIG5ldyBDb21tYW5kIGluc3RhbmNlIGZyb20gdGhlIEJ1bmRsZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBTZXNzaW9uQ29tbWFuZDIgZnJvbUJ1bmRsZV9pbXBsKEBOb25OdWxsIEJ1bmRsZSBjb21tYW5kKSB7CisgICAgICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGNvZGUgPSBjb21tYW5kLmdldEludChLRVlfQ09NTUFORF9DT0RFKTsKKyAgICAgICAgICAgIGlmIChjb2RlICE9IENPTU1BTkRfQ09ERV9DVVNUT00pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25Db21tYW5kMihjb2RlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGN1c3RvbUNvbW1hbmQgPSBjb21tYW5kLmdldFN0cmluZyhLRVlfQ09NTUFORF9DVVNUT01fQ09NTUFORCk7CisgICAgICAgICAgICAgICAgaWYgKGN1c3RvbUNvbW1hbmQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uQ29tbWFuZDIoY3VzdG9tQ29tbWFuZCwgY29tbWFuZC5nZXRCdW5kbGUoS0VZX0NPTU1BTkRfRVhUUkFTKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzX2ltcGwoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgQ29tbWFuZEltcGwpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29tbWFuZEltcGwgb3RoZXIgPSAoQ29tbWFuZEltcGwpIG9iajsKKyAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogQ29tcGFyZSBDb21tYW5kcyB3aXRoIHRoZSBnZW5lcmF0ZWQgVVVJRCwgYXMgd2UncmUgZG9pbmcgZm9yIHRoZSBNSTIuCisgICAgICAgICAgICByZXR1cm4gbUNvbW1hbmRDb2RlID09IG90aGVyLm1Db21tYW5kQ29kZQorICAgICAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuZXF1YWxzKG1DdXN0b21Db21tYW5kLCBvdGhlci5tQ3VzdG9tQ29tbWFuZCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZV9pbXBsKCkgeworICAgICAgICAgICAgZmluYWwgaW50IHByaW1lID0gMzE7CisgICAgICAgICAgICByZXR1cm4gKChtQ3VzdG9tQ29tbWFuZCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICA/IG1DdXN0b21Db21tYW5kLmhhc2hDb2RlKCkgOiAwKSAqIHByaW1lICsgbUNvbW1hbmRDb2RlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50IHNldCBvZiB7QGxpbmsgU2Vzc2lvbkNvbW1hbmQyfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbW1hbmRHcm91cEltcGwgaW1wbGVtZW50cyBDb21tYW5kR3JvdXBQcm92aWRlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NTUFORFMgPQorICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLm1lZGlhc2Vzc2lvbjIuY29tbWFuZGdyb3VwLmNvbW1hbmRzIjsKKworICAgICAgICAvLyBQcmVmaXggZm9yIGFsbCBjb21tYW5kIGNvZGVzCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfQ09NTUFORF9DT0RFID0gIkNPTU1BTkRfQ09ERV8iOworCisgICAgICAgIC8vIFByZWZpeCBmb3IgY29tbWFuZCBjb2RlcyB0aGF0IHdpbGwgYmUgc2VudCBkaXJlY3RseSB0byB0aGUgTWVkaWFQbGF5ZXJCYXNlCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfQ09NTUFORF9DT0RFX1BMQVlCQUNLID0gIkNPTU1BTkRfQ09ERV9QTEFZQkFDS18iOworCisgICAgICAgIC8vIFByZWZpeCBmb3IgY29tbWFuZCBjb2RlcyB0aGF0IHdpbGwgYmUgc2VudCBkaXJlY3RseSB0byB0aGUgTWVkaWFQbGF5bGlzdEFnZW50CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfQ09NTUFORF9DT0RFX1BMQVlMSVNUID0gIkNPTU1BTkRfQ09ERV9QTEFZTElTVF8iOworCisgICAgICAgIHByaXZhdGUgU2V0PFNlc3Npb25Db21tYW5kMj4gbUNvbW1hbmRzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBwcml2YXRlIGZpbmFsIFNlc3Npb25Db21tYW5kR3JvdXAyIG1JbnN0YW5jZTsKKworICAgICAgICBwdWJsaWMgQ29tbWFuZEdyb3VwSW1wbChTZXNzaW9uQ29tbWFuZEdyb3VwMiBpbnN0YW5jZSwgT2JqZWN0IG90aGVyKSB7CisgICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKKyAgICAgICAgICAgIGlmIChvdGhlciAhPSBudWxsICYmIG90aGVyIGluc3RhbmNlb2YgQ29tbWFuZEdyb3VwSW1wbCkgeworICAgICAgICAgICAgICAgIG1Db21tYW5kcy5hZGRBbGwoKChDb21tYW5kR3JvdXBJbXBsKSBvdGhlcikubUNvbW1hbmRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb21tYW5kR3JvdXBJbXBsKCkgeworICAgICAgICAgICAgbUluc3RhbmNlID0gbmV3IFNlc3Npb25Db21tYW5kR3JvdXAyKHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZENvbW1hbmRfaW1wbChATm9uTnVsbCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCkgeworICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db21tYW5kcy5hZGQoY29tbWFuZCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYWRkQWxsUHJlZGVmaW5lZENvbW1hbmRzX2ltcGwoKSB7CisgICAgICAgICAgICBhZGRDb21tYW5kc1dpdGhQcmVmaXgoUFJFRklYX0NPTU1BTkRfQ09ERSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGFkZEFsbFBsYXliYWNrQ29tbWFuZHMoKSB7CisgICAgICAgICAgICBhZGRDb21tYW5kc1dpdGhQcmVmaXgoUFJFRklYX0NPTU1BTkRfQ09ERV9QTEFZQkFDSyk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGFkZEFsbFBsYXlsaXN0Q29tbWFuZHMoKSB7CisgICAgICAgICAgICBhZGRDb21tYW5kc1dpdGhQcmVmaXgoUFJFRklYX0NPTU1BTkRfQ09ERV9QTEFZTElTVCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgYWRkQ29tbWFuZHNXaXRoUHJlZml4KFN0cmluZyBwcmVmaXgpIHsKKyAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogKENhbiBiZSBwb3N0LVApOiBEb24ndCB1c2UgcmVmbGVjdGlvbiBmb3IgdGhpcyBwdXJwb3NlLgorICAgICAgICAgICAgZmluYWwgRmllbGRbXSBmaWVsZHMgPSBNZWRpYVNlc3Npb24yLmNsYXNzLmdldEZpZWxkcygpOworICAgICAgICAgICAgaWYgKGZpZWxkcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkc1tpXS5nZXROYW1lKCkuc3RhcnRzV2l0aChwcmVmaXgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21tYW5kcy5hZGQobmV3IFNlc3Npb25Db21tYW5kMihmaWVsZHNbaV0uZ2V0SW50KG51bGwpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJVbmV4cGVjdGVkICIgKyBmaWVsZHNbaV0gKyAiIGluIE1lZGlhU2Vzc2lvbjIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVDb21tYW5kX2ltcGwoQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQpIHsKKyAgICAgICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29tbWFuZHMucmVtb3ZlKGNvbW1hbmQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbW1hbmRfaW1wbChATm9uTnVsbCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCkgeworICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtQ29tbWFuZHMuY29udGFpbnMoY29tbWFuZCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQ29tbWFuZF9pbXBsKGludCBjb2RlKSB7CisgICAgICAgICAgICBpZiAoY29kZSA9PSBDT01NQU5EX0NPREVfQ1VTVE9NKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVXNlIGhhc0NvbW1hbmQoQ29tbWFuZCkgZm9yIGN1c3RvbSBjb21tYW5kIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKFNlc3Npb25Db21tYW5kMiBjb21tYW5kIDogbUNvbW1hbmRzKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQuZ2V0Q29tbWFuZENvZGUoKSA9PSBjb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU2V0PFNlc3Npb25Db21tYW5kMj4gZ2V0Q29tbWFuZHNfaW1wbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRDb21tYW5kcygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNldDxTZXNzaW9uQ29tbWFuZDI+IGdldENvbW1hbmRzKCkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChtQ29tbWFuZHMpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gbmV3IGJ1bmRsZSBmcm9tIHRoZSBDb21tYW5kR3JvdXAKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnVuZGxlIHRvQnVuZGxlX2ltcGwoKSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8QnVuZGxlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBmb3IgKFNlc3Npb25Db21tYW5kMiBjb21tYW5kIDogbUNvbW1hbmRzKSB7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQoY29tbWFuZC50b0J1bmRsZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICBidW5kbGUucHV0UGFyY2VsYWJsZUFycmF5TGlzdChLRVlfQ09NTUFORFMsIGxpc3QpOworICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIG5ldyBpbnN0YW5jZSBvZiBDb21tYW5kR3JvdXAgZnJvbSB0aGUgYnVuZGxlCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIEBOdWxsYWJsZSBTZXNzaW9uQ29tbWFuZEdyb3VwMiBmcm9tQnVuZGxlX2ltcGwoQnVuZGxlIGNvbW1hbmRzKSB7CisgICAgICAgICAgICBpZiAoY29tbWFuZHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTGlzdDxQYXJjZWxhYmxlPiBsaXN0ID0gY29tbWFuZHMuZ2V0UGFyY2VsYWJsZUFycmF5TGlzdChLRVlfQ09NTUFORFMpOworICAgICAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmRHcm91cDIgY29tbWFuZEdyb3VwID0gbmV3IFNlc3Npb25Db21tYW5kR3JvdXAyKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBQYXJjZWxhYmxlIHBhcmNlbGFibGUgPSBsaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoIShwYXJjZWxhYmxlIGluc3RhbmNlb2YgQnVuZGxlKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQnVuZGxlIGNvbW1hbmRCdW5kbGUgPSAoQnVuZGxlKSBwYXJjZWxhYmxlOworICAgICAgICAgICAgICAgIFNlc3Npb25Db21tYW5kMiBjb21tYW5kID0gU2Vzc2lvbkNvbW1hbmQyLmZyb21CdW5kbGUoY29tbWFuZEJ1bmRsZSk7CisgICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb21tYW5kR3JvdXAuYWRkQ29tbWFuZChjb21tYW5kKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY29tbWFuZEdyb3VwOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb250cm9sbGVySW5mb0ltcGwgaW1wbGVtZW50cyBDb250cm9sbGVySW5mb1Byb3ZpZGVyIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb250cm9sbGVySW5mbyBtSW5zdGFuY2U7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1VaWQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1QYWNrYWdlTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc1RydXN0ZWQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgbUNvbnRyb2xsZXJCaW5kZXI7CisKKyAgICAgICAgcHVibGljIENvbnRyb2xsZXJJbmZvSW1wbChDb250ZXh0IGNvbnRleHQsIENvbnRyb2xsZXJJbmZvIGluc3RhbmNlLCBpbnQgdWlkLAorICAgICAgICAgICAgICAgIGludCBwaWQsIEBOb25OdWxsIFN0cmluZyBwYWNrYWdlTmFtZSwgQE5vbk51bGwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShwYWNrYWdlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYWNrYWdlTmFtZSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7CisgICAgICAgICAgICBtVWlkID0gdWlkOworICAgICAgICAgICAgbVBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7CisgICAgICAgICAgICBtQ29udHJvbGxlckJpbmRlciA9IGNhbGxiYWNrOworICAgICAgICAgICAgTWVkaWFTZXNzaW9uTWFuYWdlciBtYW5hZ2VyID0KKyAgICAgICAgICAgICAgICAgIChNZWRpYVNlc3Npb25NYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5NRURJQV9TRVNTSU9OX1NFUlZJQ0UpOworICAgICAgICAgICAgLy8gQXNrIHNlcnZlciB3aGV0aGVyIHRoZSBjb250cm9sbGVyIGlzIHRydXN0ZWQuCisgICAgICAgICAgICAvLyBBcHAgY2Fubm90IGtub3cgdGhpcyBiZWNhdXNlIGFwcHMgY2Fubm90IHF1ZXJ5IGVuYWJsZWQgbm90aWZpY2F0aW9uIGxpc3RlbmVyIGZvcgorICAgICAgICAgICAgLy8gYW5vdGhlciBwYWNrYWdlLCBidXQgc3lzdGVtIHNlcnZlciBjYW4gZG8uCisgICAgICAgICAgICBtSXNUcnVzdGVkID0gbWFuYWdlci5pc1RydXN0ZWRGb3JNZWRpYUNvbnRyb2woCisgICAgICAgICAgICAgICAgICAgIG5ldyBNZWRpYVNlc3Npb25NYW5hZ2VyLlJlbW90ZVVzZXJJbmZvKHBhY2thZ2VOYW1lLCBwaWQsIHVpZCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWVfaW1wbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUGFja2FnZU5hbWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRVaWRfaW1wbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVWlkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVHJ1c3RlZF9pbXBsKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Jc1RydXN0ZWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZV9pbXBsKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyQmluZGVyLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzX2ltcGwoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgQ29udHJvbGxlckluZm8pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVxdWFscygoKENvbnRyb2xsZXJJbmZvKSBvYmopLmdldFByb3ZpZGVyKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdfaW1wbCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiQ29udHJvbGxlckluZm8ge3BrZz0iICsgbVBhY2thZ2VOYW1lICsgIiwgdWlkPSIgKyBtVWlkICsgIiwgdHJ1c3RlZD0iCisgICAgICAgICAgICAgICAgICAgICsgbUlzVHJ1c3RlZCArICJ9IjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyQmluZGVyLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIENvbnRyb2xsZXJJbmZvSW1wbCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb250cm9sbGVySW5mb0ltcGwgb3RoZXIgPSAoQ29udHJvbGxlckluZm9JbXBsKSBvYmo7CisgICAgICAgICAgICByZXR1cm4gbUNvbnRyb2xsZXJCaW5kZXIuYXNCaW5kZXIoKS5lcXVhbHMob3RoZXIubUNvbnRyb2xsZXJCaW5kZXIuYXNCaW5kZXIoKSk7CisgICAgICAgIH0KKworICAgICAgICBDb250cm9sbGVySW5mbyBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7CisgICAgICAgIH0KKworICAgICAgICBJQmluZGVyIGdldElkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyQmluZGVyLmFzQmluZGVyKCk7CisgICAgICAgIH0KKworICAgICAgICBJTWVkaWFDb250cm9sbGVyMiBnZXRDb250cm9sbGVyQmluZGVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyQmluZGVyOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIENvbnRyb2xsZXJJbmZvSW1wbCBmcm9tKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIpIHsKKyAgICAgICAgICAgIHJldHVybiAoQ29udHJvbGxlckluZm9JbXBsKSBjb250cm9sbGVyLmdldFByb3ZpZGVyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbW1hbmRCdXR0b25JbXBsIGltcGxlbWVudHMgQ29tbWFuZEJ1dHRvblByb3ZpZGVyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT01NQU5ECisgICAgICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5jb21tYW5kX2J1dHRvbi5jb21tYW5kIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9JQ09OX1JFU19JRAorICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZF9idXR0b24uaWNvbl9yZXNfaWQiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RJU1BMQVlfTkFNRQorICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZF9idXR0b24uZGlzcGxheV9uYW1lIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FWFRSQVMKKyAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmRfYnV0dG9uLmV4dHJhcyI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRU5BQkxFRAorICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZF9idXR0b24uZW5hYmxlZCI7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb21tYW5kQnV0dG9uIG1JbnN0YW5jZTsKKyAgICAgICAgcHJpdmF0ZSBTZXNzaW9uQ29tbWFuZDIgbUNvbW1hbmQ7CisgICAgICAgIHByaXZhdGUgaW50IG1JY29uUmVzSWQ7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1EaXNwbGF5TmFtZTsKKyAgICAgICAgcHJpdmF0ZSBCdW5kbGUgbUV4dHJhczsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkOworCisgICAgICAgIHB1YmxpYyBDb21tYW5kQnV0dG9uSW1wbChATnVsbGFibGUgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQsIGludCBpY29uUmVzSWQsCisgICAgICAgICAgICAgICAgQE51bGxhYmxlIFN0cmluZyBkaXNwbGF5TmFtZSwgQnVuZGxlIGV4dHJhcywgYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgICAgICBtQ29tbWFuZCA9IGNvbW1hbmQ7CisgICAgICAgICAgICBtSWNvblJlc0lkID0gaWNvblJlc0lkOworICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7CisgICAgICAgICAgICBtRXh0cmFzID0gZXh0cmFzOworICAgICAgICAgICAgbUVuYWJsZWQgPSBlbmFibGVkOworICAgICAgICAgICAgbUluc3RhbmNlID0gbmV3IENvbW1hbmRCdXR0b24odGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEBOdWxsYWJsZQorICAgICAgICBTZXNzaW9uQ29tbWFuZDIgZ2V0Q29tbWFuZF9pbXBsKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Db21tYW5kOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0SWNvblJlc0lkX2ltcGwoKSB7CisgICAgICAgICAgICByZXR1cm4gbUljb25SZXNJZDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQE51bGxhYmxlIFN0cmluZyBnZXREaXNwbGF5TmFtZV9pbXBsKCkgeworICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5TmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQE51bGxhYmxlIEJ1bmRsZSBnZXRFeHRyYXNfaW1wbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRXh0cmFzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZF9pbXBsKCkgeworICAgICAgICAgICAgcmV0dXJuIG1FbmFibGVkOworICAgICAgICB9CisKKyAgICAgICAgQE5vbk51bGwgQnVuZGxlIHRvQnVuZGxlKCkgeworICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgIGJ1bmRsZS5wdXRCdW5kbGUoS0VZX0NPTU1BTkQsIG1Db21tYW5kLnRvQnVuZGxlKCkpOworICAgICAgICAgICAgYnVuZGxlLnB1dEludChLRVlfSUNPTl9SRVNfSUQsIG1JY29uUmVzSWQpOworICAgICAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhLRVlfRElTUExBWV9OQU1FLCBtRGlzcGxheU5hbWUpOworICAgICAgICAgICAgYnVuZGxlLnB1dEJ1bmRsZShLRVlfRVhUUkFTLCBtRXh0cmFzKTsKKyAgICAgICAgICAgIGJ1bmRsZS5wdXRCb29sZWFuKEtFWV9FTkFCTEVELCBtRW5hYmxlZCk7CisgICAgICAgICAgICByZXR1cm4gYnVuZGxlOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIEBOdWxsYWJsZSBDb21tYW5kQnV0dG9uIGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICAgICAgaWYgKGJ1bmRsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb21tYW5kQnV0dG9uLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBDb21tYW5kQnV0dG9uLkJ1aWxkZXIoKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0Q29tbWFuZChTZXNzaW9uQ29tbWFuZDIuZnJvbUJ1bmRsZShidW5kbGUuZ2V0QnVuZGxlKEtFWV9DT01NQU5EKSkpOworICAgICAgICAgICAgYnVpbGRlci5zZXRJY29uUmVzSWQoYnVuZGxlLmdldEludChLRVlfSUNPTl9SRVNfSUQsIDApKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGlzcGxheU5hbWUoYnVuZGxlLmdldFN0cmluZyhLRVlfRElTUExBWV9OQU1FKSk7CisgICAgICAgICAgICBidWlsZGVyLnNldEV4dHJhcyhidW5kbGUuZ2V0QnVuZGxlKEtFWV9FWFRSQVMpKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RW5hYmxlZChidW5kbGUuZ2V0Qm9vbGVhbihLRVlfRU5BQkxFRCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBNYWxmb3JtZWQgb3IgdmVyc2lvbiBtaXNtYXRjaC4gUmV0dXJuIG51bGwgZm9yIG5vdy4KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgQ29tbWFuZEJ1dHRvbn0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXJJbXBsIGltcGxlbWVudHMgQ29tbWFuZEJ1dHRvblByb3ZpZGVyLkJ1aWxkZXJQcm92aWRlciB7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIENvbW1hbmRCdXR0b24uQnVpbGRlciBtSW5zdGFuY2U7CisgICAgICAgICAgICBwcml2YXRlIFNlc3Npb25Db21tYW5kMiBtQ29tbWFuZDsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IG1JY29uUmVzSWQ7CisgICAgICAgICAgICBwcml2YXRlIFN0cmluZyBtRGlzcGxheU5hbWU7CisgICAgICAgICAgICBwcml2YXRlIEJ1bmRsZSBtRXh0cmFzOworICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkOworCisgICAgICAgICAgICBwdWJsaWMgQnVpbGRlckltcGwoQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIGluc3RhbmNlKSB7CisgICAgICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7CisgICAgICAgICAgICAgICAgbUVuYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kQnV0dG9uLkJ1aWxkZXIgc2V0Q29tbWFuZF9pbXBsKFNlc3Npb25Db21tYW5kMiBjb21tYW5kKSB7CisgICAgICAgICAgICAgICAgbUNvbW1hbmQgPSBjb21tYW5kOworICAgICAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIENvbW1hbmRCdXR0b24uQnVpbGRlciBzZXRJY29uUmVzSWRfaW1wbChpbnQgcmVzSWQpIHsKKyAgICAgICAgICAgICAgICBtSWNvblJlc0lkID0gcmVzSWQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIHNldERpc3BsYXlOYW1lX2ltcGwoU3RyaW5nIGRpc3BsYXlOYW1lKSB7CisgICAgICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIHNldEVuYWJsZWRfaW1wbChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIHNldEV4dHJhc19pbXBsKEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgICAgICAgICBtRXh0cmFzID0gZXh0cmFzOworICAgICAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIENvbW1hbmRCdXR0b24gYnVpbGRfaW1wbCgpIHsKKyAgICAgICAgICAgICAgICBpZiAobUVuYWJsZWQgJiYgbUNvbW1hbmQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFbmFibGVkIGJ1dHRvbiBuZWVkcyBDb21tYW5kIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmb3IgY29udHJvbGxlciB0byBpbnZva2UgdGhlIGNvbW1hbmQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1Db21tYW5kICE9IG51bGwgJiYgbUNvbW1hbmQuZ2V0Q29tbWFuZENvZGUoKSA9PSBDT01NQU5EX0NPREVfQ1VTVE9NCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAobUljb25SZXNJZCA9PSAwIHx8IFRleHRVdGlscy5pc0VtcHR5KG1EaXNwbGF5TmFtZSkpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkN1c3RvbSBjb21tYW5kcyBuZWVkcyBpY29uIGFuZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYW5kIG5hbWUgdG8gZGlzcGxheSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbW1hbmRCdXR0b25JbXBsKG1Db21tYW5kLCBtSWNvblJlc0lkLCBtRGlzcGxheU5hbWUsIG1FeHRyYXMsIG1FbmFibGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgLm1JbnN0YW5jZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQnVpbGRlckJhc2VJbXBsPFQgZXh0ZW5kcyBNZWRpYVNlc3Npb24yLCBDIGV4dGVuZHMgU2Vzc2lvbkNhbGxiYWNrPgorICAgICAgICAgICAgaW1wbGVtZW50cyBCdWlsZGVyQmFzZVByb3ZpZGVyPFQsIEM+IHsKKyAgICAgICAgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKyAgICAgICAgTWVkaWFQbGF5ZXJCYXNlIG1QbGF5ZXI7CisgICAgICAgIFN0cmluZyBtSWQ7CisgICAgICAgIEV4ZWN1dG9yIG1DYWxsYmFja0V4ZWN1dG9yOworICAgICAgICBDIG1DYWxsYmFjazsKKyAgICAgICAgTWVkaWFQbGF5bGlzdEFnZW50IG1QbGF5bGlzdEFnZW50OworICAgICAgICBWb2x1bWVQcm92aWRlcjIgbVZvbHVtZVByb3ZpZGVyOworICAgICAgICBQZW5kaW5nSW50ZW50IG1TZXNzaW9uQWN0aXZpdHk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29udGV4dCBhIGNvbnRleHQKKyAgICAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW55IHBhcmFtZXRlciBpcyBudWxsLCBvciB0aGUgcGxheWVyIGlzIGEKKyAgICAgICAgICogICAgICB7QGxpbmsgTWVkaWFTZXNzaW9uMn0gb3Ige0BsaW5rIE1lZGlhQ29udHJvbGxlcjJ9LgorICAgICAgICAgKi8KKyAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBBbHNvIG5lZWQgZXhlY3V0b3IKKyAgICAgICAgcHVibGljIEJ1aWxkZXJCYXNlSW1wbChATm9uTnVsbCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZXh0IHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgICAgICAvLyBFbnN1cmUgbm9uLW51bGwKKyAgICAgICAgICAgIG1JZCA9ICIiOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFBsYXllcl9pbXBsKEBOb25OdWxsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIpIHsKKyAgICAgICAgICAgIGlmIChwbGF5ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBsYXllciBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVBsYXllciA9IHBsYXllcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdEFnZW50X2ltcGwoQE5vbk51bGwgTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQpIHsKKyAgICAgICAgICAgIGlmIChwbGF5bGlzdEFnZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwbGF5bGlzdEFnZW50IHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUGxheWxpc3RBZ2VudCA9IHBsYXlsaXN0QWdlbnQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Vm9sdW1lUHJvdmlkZXJfaW1wbChWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIpIHsKKyAgICAgICAgICAgIG1Wb2x1bWVQcm92aWRlciA9IHZvbHVtZVByb3ZpZGVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25BY3Rpdml0eV9pbXBsKFBlbmRpbmdJbnRlbnQgcGkpIHsKKyAgICAgICAgICAgIG1TZXNzaW9uQWN0aXZpdHkgPSBwaTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRJZF9pbXBsKEBOb25OdWxsIFN0cmluZyBpZCkgeworICAgICAgICAgICAgaWYgKGlkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpZCBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUlkID0gaWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvbkNhbGxiYWNrX2ltcGwoQE5vbk51bGwgRXhlY3V0b3IgZXhlY3V0b3IsIEBOb25OdWxsIEMgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIGlmIChleGVjdXRvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZXhlY3V0b3Igc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yID0gZXhlY3V0b3I7CisgICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVCBidWlsZF9pbXBsKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVySW1wbCBleHRlbmRzIEJ1aWxkZXJCYXNlSW1wbDxNZWRpYVNlc3Npb24yLCBTZXNzaW9uQ2FsbGJhY2s+IHsKKyAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKENvbnRleHQgY29udGV4dCwgQnVpbGRlciBpbnN0YW5jZSkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE1lZGlhU2Vzc2lvbjIgYnVpbGRfaW1wbCgpIHsKKyAgICAgICAgICAgIGlmIChtQ2FsbGJhY2tFeGVjdXRvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IgPSBtQ29udGV4dC5nZXRNYWluRXhlY3V0b3IoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtQ2FsbGJhY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1DYWxsYmFjayA9IG5ldyBTZXNzaW9uQ2FsbGJhY2soKSB7fTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMkltcGwobUNvbnRleHQsIG1QbGF5ZXIsIG1JZCwgbVBsYXlsaXN0QWdlbnQsCisgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVQcm92aWRlciwgbVNlc3Npb25BY3Rpdml0eSwgbUNhbGxiYWNrRXhlY3V0b3IsIG1DYWxsYmFjaykuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uMlN0dWIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uMlN0dWIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzY1N2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb24yU3R1Yi5qYXZhCkBAIC0wLDAgKzEsMTExMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLkxpYnJhcnlSb290OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbW1hbmRCdXR0b247CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZEdyb3VwMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29udHJvbGxlckluZm87CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5SYXRpbmcyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIyOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkRlYWRPYmplY3RFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uR3VhcmRlZEJ5OworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlNYXA7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwuTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGw7CitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEJ1dHRvbkltcGw7CitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEdyb3VwSW1wbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24ySW1wbC5Db250cm9sbGVySW5mb0ltcGw7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitwdWJsaWMgY2xhc3MgTWVkaWFTZXNzaW9uMlN0dWIgZXh0ZW5kcyBJTWVkaWFTZXNzaW9uMi5TdHViIHsKKworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfS0VZX1BPU0lUSU9OID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIua2V5X3Bvc2l0aW9uIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UX0tFWV9JVEVNX0lOREVYID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIua2V5X2l0ZW1faW5kZXgiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfS0VZX1BMQVlMSVNUX1BBUkFNUyA9CisgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5rZXlfcGxheWxpc3RfcGFyYW1zIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFTZXNzaW9uMlN0dWIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBUT0RPKGphZXdhbik6IFJlbmFtZS4KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNwYXJzZUFycmF5PFNlc3Npb25Db21tYW5kMj4gc0NvbW1hbmRzRm9yT25Db21tYW5kUmVxdWVzdCA9CisgICAgICAgICAgICBuZXcgU3BhcnNlQXJyYXk8PigpOworCisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPE1lZGlhU2Vzc2lvbjJJbXBsPiBtU2Vzc2lvbjsKKworICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TWFwPElCaW5kZXIsIENvbnRyb2xsZXJJbmZvPiBtQ29udHJvbGxlcnMgPSBuZXcgQXJyYXlNYXA8PigpOworICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKKyAgICBwcml2YXRlIGZpbmFsIFNldDxJQmluZGVyPiBtQ29ubmVjdGluZ0NvbnRyb2xsZXJzID0gbmV3IEhhc2hTZXQ8PigpOworICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TWFwPENvbnRyb2xsZXJJbmZvLCBTZXNzaW9uQ29tbWFuZEdyb3VwMj4gbUFsbG93ZWRDb21tYW5kR3JvdXBNYXAgPQorICAgICAgICAgICAgbmV3IEFycmF5TWFwPD4oKTsKKyAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheU1hcDxDb250cm9sbGVySW5mbywgU2V0PFN0cmluZz4+IG1TdWJzY3JpcHRpb25zID0gbmV3IEFycmF5TWFwPD4oKTsKKworICAgIHB1YmxpYyBNZWRpYVNlc3Npb24yU3R1YihNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uKSB7CisgICAgICAgIG1TZXNzaW9uID0gbmV3IFdlYWtSZWZlcmVuY2U8PihzZXNzaW9uKTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHNDb21tYW5kc0Zvck9uQ29tbWFuZFJlcXVlc3QpIHsKKyAgICAgICAgICAgIGlmIChzQ29tbWFuZHNGb3JPbkNvbW1hbmRSZXF1ZXN0LnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQ29tbWFuZEdyb3VwSW1wbCBncm91cCA9IG5ldyBDb21tYW5kR3JvdXBJbXBsKCk7CisgICAgICAgICAgICAgICAgZ3JvdXAuYWRkQWxsUGxheWJhY2tDb21tYW5kcygpOworICAgICAgICAgICAgICAgIGdyb3VwLmFkZEFsbFBsYXlsaXN0Q29tbWFuZHMoKTsKKyAgICAgICAgICAgICAgICBTZXQ8U2Vzc2lvbkNvbW1hbmQyPiBjb21tYW5kcyA9IGdyb3VwLmdldENvbW1hbmRzKCk7CisgICAgICAgICAgICAgICAgZm9yIChTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCA6IGNvbW1hbmRzKSB7CisgICAgICAgICAgICAgICAgICAgIHNDb21tYW5kc0Zvck9uQ29tbWFuZFJlcXVlc3QuYXBwZW5kKGNvbW1hbmQuZ2V0Q29tbWFuZENvZGUoKSwgY29tbWFuZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGVzdHJveU5vdExvY2tlZCgpIHsKKyAgICAgICAgZmluYWwgTGlzdDxDb250cm9sbGVySW5mbz4gbGlzdDsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgbVNlc3Npb24uY2xlYXIoKTsKKyAgICAgICAgICAgIGxpc3QgPSBnZXRDb250cm9sbGVycygpOworICAgICAgICAgICAgbUNvbnRyb2xsZXJzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBJTWVkaWFDb250cm9sbGVyMiBjb250cm9sbGVyQmluZGVyID0KKyAgICAgICAgICAgICAgICAgICAgKChDb250cm9sbGVySW5mb0ltcGwpIGxpc3QuZ2V0KGkpLmdldFByb3ZpZGVyKCkpLmdldENvbnRyb2xsZXJCaW5kZXIoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gU2hvdWxkIGJlIHVzZWQgd2l0aG91dCBhIGxvY2sgaG9sZCB0byBwcmV2ZW50IHBvdGVudGlhbCBkZWFkbG9jay4KKyAgICAgICAgICAgICAgICBjb250cm9sbGVyQmluZGVyLm9uRGlzY29ubmVjdGVkKCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIENvbnRyb2xsZXIgaXMgZ29uZS4gU2hvdWxkIGJlIGZpbmUgYmVjYXVzZSB3ZSdyZSBkZXN0cm95aW5nLgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBNZWRpYVNlc3Npb24ySW1wbCBnZXRTZXNzaW9uKCkgeworICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gbVNlc3Npb24uZ2V0KCk7CisgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgJiYgREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIlNlc3Npb24gaXMgY2xvc2VkIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2Vzc2lvbjsKKyAgICB9CisKKyAgICBwcml2YXRlIE1lZGlhTGlicmFyeVNlc3Npb25JbXBsIGdldExpYnJhcnlTZXNzaW9uKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7CisgICAgICAgIGlmICghKHNlc3Npb24gaW5zdGFuY2VvZiBNZWRpYUxpYnJhcnlTZXNzaW9uSW1wbCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTZXNzaW9uIGlzbid0IGEgbGlicmFyeSBzZXNzaW9uIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChNZWRpYUxpYnJhcnlTZXNzaW9uSW1wbCkgc2Vzc2lvbjsKKyAgICB9CisKKyAgICAvLyBHZXQgY29udHJvbGxlciBpZiB0aGUgY29tbWFuZCBmcm9tIGNhbGxlciB0byBzZXNzaW9uIGlzIGFibGUgdG8gYmUgaGFuZGxlZC4KKyAgICBwcml2YXRlIENvbnRyb2xsZXJJbmZvIGdldENvbnRyb2xsZXJJZkFibGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXJJbmZvID0gbUNvbnRyb2xsZXJzLmdldChjYWxsZXIuYXNCaW5kZXIoKSk7CisgICAgICAgICAgICBpZiAoY29udHJvbGxlckluZm8gPT0gbnVsbCAmJiBERUJVRykgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNvbnRyb2xsZXIgaXMgZGlzY29ubmVjdGVkIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjb250cm9sbGVySW5mbzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEdldCBjb250cm9sbGVyIGlmIHRoZSBjb21tYW5kIGZyb20gY2FsbGVyIHRvIHNlc3Npb24gaXMgYWJsZSB0byBiZSBoYW5kbGVkLgorICAgIHByaXZhdGUgQ29udHJvbGxlckluZm8gZ2V0Q29udHJvbGxlcklmQWJsZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBjb21tYW5kQ29kZSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVySW5mbyA9IGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyKTsKKyAgICAgICAgICAgIGlmIChjb250cm9sbGVySW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTZXNzaW9uQ29tbWFuZEdyb3VwMiBhbGxvd2VkQ29tbWFuZHMgPSBtQWxsb3dlZENvbW1hbmRHcm91cE1hcC5nZXQoY29udHJvbGxlckluZm8pOworICAgICAgICAgICAgaWYgKGFsbG93ZWRDb21tYW5kcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ29udHJvbGxlciB3aXRoIG51bGwgYWxsb3dlZCBjb21tYW5kcy4gSWdub3JpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghYWxsb3dlZENvbW1hbmRzLmhhc0NvbW1hbmQoY29tbWFuZENvZGUpKSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNvbnRyb2xsZXIgaXNuJ3QgYWxsb3dlZCBmb3IgY29tbWFuZCAiICsgY29tbWFuZENvZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjb250cm9sbGVySW5mbzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEdldCBjb250cm9sbGVyIGlmIHRoZSBjb21tYW5kIGZyb20gY2FsbGVyIHRvIHNlc3Npb24gaXMgYWJsZSB0byBiZSBoYW5kbGVkLgorICAgIHByaXZhdGUgQ29udHJvbGxlckluZm8gZ2V0Q29udHJvbGxlcklmQWJsZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXJJbmZvID0gZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIpOworICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXJJbmZvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGFsbG93ZWRDb21tYW5kcyA9IG1BbGxvd2VkQ29tbWFuZEdyb3VwTWFwLmdldChjb250cm9sbGVySW5mbyk7CisgICAgICAgICAgICBpZiAoYWxsb3dlZENvbW1hbmRzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb250cm9sbGVyIHdpdGggbnVsbCBhbGxvd2VkIGNvbW1hbmRzLiBJZ25vcmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFhbGxvd2VkQ29tbWFuZHMuaGFzQ29tbWFuZChjb21tYW5kKSkgeworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDb250cm9sbGVyIGlzbid0IGFsbG93ZWQgZm9yIGNvbW1hbmQgIiArIGNvbW1hbmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjb250cm9sbGVySW5mbzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJldHVybiBiaW5kZXIgaWYgdGhlIHNlc3Npb24gaXMgYWJsZSB0byBzZW5kIGEgY29tbWFuZCB0byB0aGUgY29udHJvbGxlci4KKyAgICBwcml2YXRlIElNZWRpYUNvbnRyb2xsZXIyIGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoQ29udHJvbGxlckluZm8gY29udHJvbGxlcikgeworICAgICAgICBpZiAoZ2V0U2Vzc2lvbigpID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGdldFNlc3Npb24oKSBhbHJlYWR5IGxvZ2dlZCBpZiBzZXNzaW9uIGlzIGNsb3NlZC4KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGZpbmFsIENvbnRyb2xsZXJJbmZvSW1wbCBpbXBsID0gQ29udHJvbGxlckluZm9JbXBsLmZyb20oY29udHJvbGxlcik7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGlmIChtQ29udHJvbGxlcnMuZ2V0KGltcGwuZ2V0SWQoKSkgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICB8fCBtQ29ubmVjdGluZ0NvbnRyb2xsZXJzLmNvbnRhaW5zKGltcGwuZ2V0SWQoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW1wbC5nZXRDb250cm9sbGVyQmluZGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNvbnRyb2xsZXIgKyAiIGlzbid0IGNvbm5lY3RlZCBub3IgY29ubmVjdGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZXR1cm4gYmluZGVyIGlmIHRoZSBzZXNzaW9uIGlzIGFibGUgdG8gc2VuZCBhIGNvbW1hbmQgdG8gdGhlIGNvbnRyb2xsZXIuCisgICAgcHJpdmF0ZSBJTWVkaWFDb250cm9sbGVyMiBnZXRDb250cm9sbGVyQmluZGVySWZBYmxlKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsCisgICAgICAgICAgICBpbnQgY29tbWFuZENvZGUpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmRHcm91cDIgYWxsb3dlZENvbW1hbmRzID0gbUFsbG93ZWRDb21tYW5kR3JvdXBNYXAuZ2V0KGNvbnRyb2xsZXIpOworICAgICAgICAgICAgaWYgKGFsbG93ZWRDb21tYW5kcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ29udHJvbGxlciB3aXRoIG51bGwgYWxsb3dlZCBjb21tYW5kcy4gSWdub3JpbmciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghYWxsb3dlZENvbW1hbmRzLmhhc0NvbW1hbmQoY29tbWFuZENvZGUpKSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNvbnRyb2xsZXIgaXNuJ3QgYWxsb3dlZCBmb3IgY29tbWFuZCAiICsgY29tbWFuZENvZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBnZXRDb250cm9sbGVyQmluZGVySWZBYmxlKGNvbnRyb2xsZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uQ29tbWFuZChATm9uTnVsbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBjb21tYW5kQ29kZSwKKyAgICAgICAgICAgIEBOb25OdWxsIFNlc3Npb25SdW5uYWJsZSBydW5uYWJsZSkgeworICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOworICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIsIGNvbW1hbmRDb2RlKTsKKyAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCB8fCBjb250cm9sbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKKyAgICAgICAgICAgIGlmIChnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlciwgY29tbWFuZENvZGUpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCA9IHNDb21tYW5kc0Zvck9uQ29tbWFuZFJlcXVlc3QuZ2V0KGNvbW1hbmRDb2RlKTsKKyAgICAgICAgICAgIGlmIChjb21tYW5kICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIGFjY2VwdGVkID0gc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uQ29tbWFuZFJlcXVlc3Qoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgY29tbWFuZCk7CisgICAgICAgICAgICAgICAgaWYgKCFhY2NlcHRlZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBydW4gcmVqZWN0ZWQgY29tbWFuZC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDb21tYW5kIChjb2RlPSIgKyBjb21tYW5kQ29kZSArICIpIGZyb20gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbnRyb2xsZXIgKyAiIHdhcyByZWplY3RlZCBieSAiICsgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJ1bm5hYmxlLnJ1bihzZXNzaW9uLCBjb250cm9sbGVyKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uQnJvd3NlckNvbW1hbmQoQE5vbk51bGwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLAorICAgICAgICAgICAgQE5vbk51bGwgTGlicmFyeVNlc3Npb25SdW5uYWJsZSBydW5uYWJsZSkgeworICAgICAgICBmaW5hbCBNZWRpYUxpYnJhcnlTZXNzaW9uSW1wbCBzZXNzaW9uID0gZ2V0TGlicmFyeVNlc3Npb24oKTsKKyAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBDb25zaWRlciBjb21tYW5kIGNvZGUKKyAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciA9IGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyKTsKKyAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCB8fCBjb250cm9sbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKKyAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogQ29uc2lkZXIgY29tbWFuZCBjb2RlCisgICAgICAgICAgICBpZiAoZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBydW5uYWJsZS5ydW4oc2Vzc2lvbiwgY29udHJvbGxlcik7CisgICAgICAgIH0pOworICAgIH0KKworCisgICAgcHJpdmF0ZSB2b2lkIG5vdGlmeUFsbChpbnQgY29tbWFuZENvZGUsIEBOb25OdWxsIE5vdGlmeVJ1bm5hYmxlIHJ1bm5hYmxlKSB7CisgICAgICAgIExpc3Q8Q29udHJvbGxlckluZm8+IGNvbnRyb2xsZXJzID0gZ2V0Q29udHJvbGxlcnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cm9sbGVycy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgbm90aWZ5SW50ZXJuYWwoY29udHJvbGxlcnMuZ2V0KGkpLAorICAgICAgICAgICAgICAgICAgICBnZXRDb250cm9sbGVyQmluZGVySWZBYmxlKGNvbnRyb2xsZXJzLmdldChpKSwgY29tbWFuZENvZGUpLCBydW5uYWJsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbm90aWZ5QWxsKEBOb25OdWxsIE5vdGlmeVJ1bm5hYmxlIHJ1bm5hYmxlKSB7CisgICAgICAgIExpc3Q8Q29udHJvbGxlckluZm8+IGNvbnRyb2xsZXJzID0gZ2V0Q29udHJvbGxlcnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cm9sbGVycy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgbm90aWZ5SW50ZXJuYWwoY29udHJvbGxlcnMuZ2V0KGkpLAorICAgICAgICAgICAgICAgICAgICBnZXRDb250cm9sbGVyQmluZGVySWZBYmxlKGNvbnRyb2xsZXJzLmdldChpKSksIHJ1bm5hYmxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBub3RpZnkoQE5vbk51bGwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciwgQE5vbk51bGwgTm90aWZ5UnVubmFibGUgcnVubmFibGUpIHsKKyAgICAgICAgbm90aWZ5SW50ZXJuYWwoY29udHJvbGxlciwgZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVyKSwgcnVubmFibGUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBub3RpZnkoQE5vbk51bGwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciwgaW50IGNvbW1hbmRDb2RlLAorICAgICAgICAgICAgQE5vbk51bGwgTm90aWZ5UnVubmFibGUgcnVubmFibGUpIHsKKyAgICAgICAgbm90aWZ5SW50ZXJuYWwoY29udHJvbGxlciwgZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVyLCBjb21tYW5kQ29kZSksIHJ1bm5hYmxlKTsKKyAgICB9CisKKyAgICAvLyBEbyBub3QgY2FsbCB0aGlzIEFQSSBkaXJlY3RseS4gVXNlIG5vdGlmeSgpIGluc3RlYWQuCisgICAgcHJpdmF0ZSB2b2lkIG5vdGlmeUludGVybmFsKEBOb25OdWxsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsCisgICAgICAgICAgICBATm9uTnVsbCBJTWVkaWFDb250cm9sbGVyMiBpQ29udHJvbGxlciwgQE5vbk51bGwgTm90aWZ5UnVubmFibGUgcnVubmFibGUpIHsKKyAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCB8fCBpQ29udHJvbGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJ1bm5hYmxlLnJ1bihjb250cm9sbGVyLCBpQ29udHJvbGxlcik7CisgICAgICAgIH0gY2F0Y2ggKERlYWRPYmplY3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjb250cm9sbGVyLnRvU3RyaW5nKCkgKyAiIGlzIGdvbmUiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9uQ29udHJvbGxlckNsb3NlZChpQ29udHJvbGxlcik7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBDdXJyZW50bHkgaXQncyBUcmFuc2FjdGlvblRvb0xhcmdlRXhjZXB0aW9uIG9yIERlYWRTeXN0ZW1FeGNlcHRpb24uCisgICAgICAgICAgICAvLyBXZSdkIGJldHRlciB0byBsZWF2ZSBsb2cgZm9yIHRob3NlIGNhc2VzIGJlY2F1c2UKKyAgICAgICAgICAgIC8vICAgLSBUcmFuc2FjdGlvblRvb0xhcmdlRXhjZXB0aW9uIG1lYW5zIHRoYXQgd2UgbWF5IG5lZWQgdG8gZml4IG91ciBjb2RlLgorICAgICAgICAgICAgLy8gICAgIChlLmcuIGFkZCBwYWdpbmF0aW9uIG9yIHNwZWNpYWwgd2F5IHRvIGRlbGl2ZXIgQml0bWFwKQorICAgICAgICAgICAgLy8gICAtIERlYWRTeXN0ZW1FeGNlcHRpb24gbWVhbnMgdGhhdCBlcnJvcnMgYXJvdW5kIGl0IGNhbiBiZSBpZ25vcmVkLgorICAgICAgICAgICAgTG9nLncoVEFHLCAiRXhjZXB0aW9uIGluICIgKyBjb250cm9sbGVyLnRvU3RyaW5nKCksIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uQ29udHJvbGxlckNsb3NlZChJTWVkaWFDb250cm9sbGVyMiBpQ29udHJvbGxlcikgeworICAgICAgICBDb250cm9sbGVySW5mbyBjb250cm9sbGVyOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBjb250cm9sbGVyID0gbUNvbnRyb2xsZXJzLnJlbW92ZShpQ29udHJvbGxlci5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInJlbGVhc2luZyAiICsgY29udHJvbGxlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3Vic2NyaXB0aW9ucy5yZW1vdmUoY29udHJvbGxlcik7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKKyAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCB8fCBjb250cm9sbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKKyAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkRpc2Nvbm5lY3RlZChzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXIpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQUlETCBtZXRob2RzIGZvciBzZXNzaW9uIG92ZXJyaWRlcworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0KGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIGNhbGxpbmdQYWNrYWdlKQorICAgICAgICAgICAgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24geworICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOworICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gc2Vzc2lvbi5nZXRDb250ZXh0KCk7CisgICAgICAgIGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXJJbmZvID0gbmV3IENvbnRyb2xsZXJJbmZvKGNvbnRleHQsCisgICAgICAgICAgICAgICAgQmluZGVyLmdldENhbGxpbmdVaWQoKSwgQmluZGVyLmdldENhbGxpbmdQaWQoKSwgY2FsbGluZ1BhY2thZ2UsIGNhbGxlcik7CisgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4geworICAgICAgICAgICAgaWYgKGdldFNlc3Npb24oKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgICAgIC8vIEtlZXAgY29ubmVjdGluZyBjb250cm9sbGVycy4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGhlbHBzIHNlc3Npb25zIHRvIGNhbGwgQVBJcyBpbiB0aGUgb25Db25uZWN0KCkgKGUuZy4gc2V0Q3VzdG9tTGF5b3V0KCkpCisgICAgICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBwZW5kaW5nIHRoZW0uCisgICAgICAgICAgICAgICAgbUNvbm5lY3RpbmdDb250cm9sbGVycy5hZGQoQ29udHJvbGxlckluZm9JbXBsLmZyb20oY29udHJvbGxlckluZm8pLmdldElkKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmRHcm91cDIgYWxsb3dlZENvbW1hbmRzID0gc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uQ29ubmVjdCgKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVySW5mbyk7CisgICAgICAgICAgICAvLyBEb24ndCByZWplY3QgY29ubmVjdGlvbiBmb3IgdGhlIHJlcXVlc3QgZnJvbSB0cnVzdGVkIGFwcC4KKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSBzZXJ2ZXIgd2lsbCBmYWlsIHRvIHJldHJpZXZlIHNlc3Npb24ncyBpbmZvcm1hdGlvbiB0byBkaXNwYXRjaAorICAgICAgICAgICAgLy8gbWVkaWEga2V5cyB0by4KKyAgICAgICAgICAgIGJvb2xlYW4gYWNjZXB0ID0gYWxsb3dlZENvbW1hbmRzICE9IG51bGwgfHwgY29udHJvbGxlckluZm8uaXNUcnVzdGVkKCk7CisgICAgICAgICAgICBpZiAoYWNjZXB0KSB7CisgICAgICAgICAgICAgICAgQ29udHJvbGxlckluZm9JbXBsIGNvbnRyb2xsZXJJbXBsID0gQ29udHJvbGxlckluZm9JbXBsLmZyb20oY29udHJvbGxlckluZm8pOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJBY2NlcHRpbmcgY29ubmVjdGlvbiwgY29udHJvbGxlckluZm89IiArIGNvbnRyb2xsZXJJbmZvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFsbG93ZWRDb21tYW5kcz0iICsgYWxsb3dlZENvbW1hbmRzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGFsbG93ZWRDb21tYW5kcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZvciB0cnVzdGVkIGFwcHMsIHNlbmQgbm9uLW51bGwgYWxsb3dlZCBjb21tYW5kcyB0byBrZWVwIGNvbm5lY3Rpb24uCisgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRDb21tYW5kcyA9IG5ldyBTZXNzaW9uQ29tbWFuZEdyb3VwMigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW5nQ29udHJvbGxlcnMucmVtb3ZlKGNvbnRyb2xsZXJJbXBsLmdldElkKCkpOworICAgICAgICAgICAgICAgICAgICBtQ29udHJvbGxlcnMucHV0KGNvbnRyb2xsZXJJbXBsLmdldElkKCksICBjb250cm9sbGVySW5mbyk7CisgICAgICAgICAgICAgICAgICAgIG1BbGxvd2VkQ29tbWFuZEdyb3VwTWFwLnB1dChjb250cm9sbGVySW5mbywgYWxsb3dlZENvbW1hbmRzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gSWYgY29ubmVjdGlvbiBpcyBhY2NlcHRlZCwgbm90aWZ5IHRoZSBjdXJyZW50IHN0YXRlIHRvIHRoZSBjb250cm9sbGVyLgorICAgICAgICAgICAgICAgIC8vIEl0J3MgbmVlZGVkIGJlY2F1c2Ugd2UgY2Fubm90IGNhbGwgc3luY2hyb25vdXMgY2FsbHMgYmV0d2VlbiBzZXNzaW9uL2NvbnRyb2xsZXIuCisgICAgICAgICAgICAgICAgLy8gTm90ZTogV2UncmUgZG9pbmcgdGhpcyBhZnRlciB0aGUgb25Db25uZWN0aW9uQ2hhbmdlZCgpLCBidXQgdGhlcmUncyBubyBndWFyYW50ZWUKKyAgICAgICAgICAgICAgICAvLyAgICAgICB0aGF0IGV2ZW50cyBoZXJlIGFyZSBub3RpZmllZCBhZnRlciB0aGUgb25Db25uZWN0ZWQoKSBiZWNhdXNlCisgICAgICAgICAgICAgICAgLy8gICAgICAgSU1lZGlhQ29udHJvbGxlcjIgaXMgb25ld2F5IChpLmUuIGFzeW5jIGNhbGwpIGFuZCBTdHViIHdpbGwKKyAgICAgICAgICAgICAgICAvLyAgICAgICB1c2UgdGhyZWFkIHBvbGwgZm9yIGluY29taW5nIGNhbGxzLgorICAgICAgICAgICAgICAgIGZpbmFsIGludCBwbGF5ZXJTdGF0ZSA9IHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5nZXRQbGF5ZXJTdGF0ZSgpOworICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgcG9zaXRpb25FdmVudFRpbWVNcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgcG9zaXRpb25NcyA9IHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50UG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdCBwbGF5YmFja1NwZWVkID0gc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLmdldFBsYXliYWNrU3BlZWQoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGJ1ZmZlcmVkUG9zaXRpb25NcyA9IHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5nZXRCdWZmZXJlZFBvc2l0aW9uKCk7CisgICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIHBsYXliYWNrSW5mb0J1bmRsZSA9ICgoTWVkaWFDb250cm9sbGVyMkltcGwuUGxheWJhY2tJbmZvSW1wbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0UGxheWJhY2tJbmZvKCkuZ2V0UHJvdmlkZXIoKSkudG9CdW5kbGUoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmVwZWF0TW9kZSA9IHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5nZXRSZXBlYXRNb2RlKCk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHNodWZmbGVNb2RlID0gc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLmdldFNodWZmbGVNb2RlKCk7CisgICAgICAgICAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBzZXNzaW9uQWN0aXZpdHkgPSBzZXNzaW9uLmdldFNlc3Npb25BY3Rpdml0eSgpOworICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZENvbW1hbmRzLmhhc0NvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9HRVRfTElTVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0UGxheWxpc3QoKSA6IG51bGw7CisgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxCdW5kbGU+IHBsYXlsaXN0QnVuZGxlOworICAgICAgICAgICAgICAgIGlmIChwbGF5bGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHBsYXlsaXN0QnVuZGxlID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogRmluZCBhIHdheSB0byBhdm9pZCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBleGNlcHRpb24uCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGxheWxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhSXRlbTIgaXRlbSA9IHBsYXlsaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgaXRlbUJ1bmRsZSA9IGl0ZW0udG9CdW5kbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbUJ1bmRsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlsaXN0QnVuZGxlLmFkZChpdGVtQnVuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwbGF5bGlzdEJ1bmRsZSA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gRG91YmxlIGNoZWNrIGlmIHNlc3Npb24gaXMgc3RpbGwgdGhlcmUsIGJlY2F1c2UgY2xvc2UoKSBjYW4gYmUgY2FsbGVkIGluIGFub3RoZXIKKyAgICAgICAgICAgICAgICAvLyB0aHJlYWQuCisgICAgICAgICAgICAgICAgaWYgKGdldFNlc3Npb24oKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY2FsbGVyLm9uQ29ubmVjdGVkKE1lZGlhU2Vzc2lvbjJTdHViLnRoaXMsIGFsbG93ZWRDb21tYW5kcy50b0J1bmRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllclN0YXRlLCBwb3NpdGlvbkV2ZW50VGltZU1zLCBwb3NpdGlvbk1zLCBwbGF5YmFja1NwZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcmVkUG9zaXRpb25NcywgcGxheWJhY2tJbmZvQnVuZGxlLCByZXBlYXRNb2RlLCBzaHVmZmxlTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5bGlzdEJ1bmRsZSwgc2Vzc2lvbkFjdGl2aXR5KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBDb250cm9sbGVyIG1heSBiZSBkaWVkIHByZW1hdHVyZWx5LgorICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBoZXJlLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGluZ0NvbnRyb2xsZXJzLnJlbW92ZShDb250cm9sbGVySW5mb0ltcGwuZnJvbShjb250cm9sbGVySW5mbykuZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWplY3RpbmcgY29ubmVjdGlvbiwgY29udHJvbGxlckluZm89IiArIGNvbnRyb2xsZXJJbmZvKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY2FsbGVyLm9uRGlzY29ubmVjdGVkKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29udHJvbGxlciBtYXkgYmUgZGllZCBwcmVtYXR1cmVseS4KKyAgICAgICAgICAgICAgICAgICAgLy8gTm90IGFuIGlzc3VlIGJlY2F1c2Ugd2UnbGwgaWdub3JlIGl0IGFueXdheS4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgb25Db250cm9sbGVyQ2xvc2VkKGNhbGxlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Vm9sdW1lVG8oZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBpbnQgdmFsdWUsIGZpbmFsIGludCBmbGFncykKKyAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVRfVk9MVU1FLAorICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlciA9IHNlc3Npb24uZ2V0Vm9sdW1lUHJvdmlkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZvbHVtZVByb3ZpZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogU2V0IGxvY2FsIHN0cmVhbSB2b2x1bWUKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVByb3ZpZGVyLm9uU2V0Vm9sdW1lVG8odmFsdWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRqdXN0Vm9sdW1lKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IGRpcmVjdGlvbiwgaW50IGZsYWdzKQorICAgICAgICAgICAgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24geworICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFVF9WT0xVTUUsCisgICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyID0gc2Vzc2lvbi5nZXRWb2x1bWVQcm92aWRlcigpOworICAgICAgICAgICAgICAgICAgICBpZiAodm9sdW1lUHJvdmlkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBBZGp1c3QgbG9jYWwgc3RyZWFtIHZvbHVtZQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lUHJvdmlkZXIub25BZGp1c3RWb2x1bWUoZGlyZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsCisgICAgICAgICAgICBpbnQgY29tbWFuZENvZGUsIEJ1bmRsZSBhcmdzKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7CisgICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIGNvbW1hbmRDb2RlLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4geworICAgICAgICAgICAgc3dpdGNoIChjb21tYW5kQ29kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19QTEFZOgorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkucGxheSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUJBQ0tfUEFVU0U6CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5wYXVzZSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUJBQ0tfU1RPUDoKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1BSRVBBUkU6CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5wcmVwYXJlKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19TRUVLX1RPOgorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuc2Vla1RvKGFyZ3MuZ2V0TG9uZyhBUkdVTUVOVF9LRVlfUE9TSVRJT04pKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXNlbmQgdW5rbm93biAobmV3KSBjb21tYW5kcyB0aHJvdWdoIHRoZSBjdXN0b20gY29tbWFuZC4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUNvbW1hbmQoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBCdW5kbGUgY29tbWFuZEJ1bmRsZSwKKyAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBhcmdzLCBmaW5hbCBSZXN1bHRSZWNlaXZlciByZWNlaXZlcikgeworICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOworICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQgPSBTZXNzaW9uQ29tbWFuZDIuZnJvbUJ1bmRsZShjb21tYW5kQnVuZGxlKTsKKyAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAic2VuZEN1c3RvbUNvbW1hbmQoKTogSWdub3JpbmcgbnVsbCBjb21tYW5kIGZyb20gIgorICAgICAgICAgICAgICAgICAgICArIGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciA9IGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyLCBjb21tYW5kKTsKKyAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4geworICAgICAgICAgICAgaWYgKGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyLCBjb21tYW5kKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uQ3VzdG9tQ29tbWFuZChzZXNzaW9uLmdldEluc3RhbmNlKCksCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIGNvbW1hbmQsIGFyZ3MsIHJlY2VpdmVyKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHJlcGFyZUZyb21VcmkoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBVcmkgdXJpLAorICAgICAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX1VSSSwKKyAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4geworICAgICAgICAgICAgICAgICAgICBpZiAodXJpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInByZXBhcmVGcm9tVXJpKCk6IElnbm9yaW5nIG51bGwgdXJpIGZyb20gIiArIGNvbnRyb2xsZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblByZXBhcmVGcm9tVXJpKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgY29udHJvbGxlciwgdXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhcyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHJlcGFyZUZyb21TZWFyY2goZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgcXVlcnksCisgICAgICAgICAgICBmaW5hbCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fU0VBUkNILAorICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInByZXBhcmVGcm9tU2VhcmNoKCk6IElnbm9yaW5nIGVtcHR5IHF1ZXJ5IGZyb20gIiArIGNvbnRyb2xsZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblByZXBhcmVGcm9tU2VhcmNoKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBxdWVyeSwgZXh0cmFzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbU1lZGlhSWQoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgbWVkaWFJZCwKKyAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9NRURJQV9JRCwKKyAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4geworICAgICAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgInByZXBhcmVGcm9tTWVkaWFJZCgpOiBJZ25vcmluZyBudWxsIG1lZGlhSWQgZnJvbSAiICsgY29udHJvbGxlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uUHJlcGFyZUZyb21NZWRpYUlkKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgbWVkaWFJZCwgZXh0cmFzKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcGxheUZyb21VcmkoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBVcmkgdXJpLAorICAgICAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX1VSSSwKKyAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4geworICAgICAgICAgICAgICAgICAgICBpZiAodXJpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInBsYXlGcm9tVXJpKCk6IElnbm9yaW5nIG51bGwgdXJpIGZyb20gIiArIGNvbnRyb2xsZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblBsYXlGcm9tVXJpKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgY29udHJvbGxlciwgdXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhcyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcGxheUZyb21TZWFyY2goZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgcXVlcnksCisgICAgICAgICAgICBmaW5hbCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fU0VBUkNILAorICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInBsYXlGcm9tU2VhcmNoKCk6IElnbm9yaW5nIGVtcHR5IHF1ZXJ5IGZyb20gIiArIGNvbnRyb2xsZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblBsYXlGcm9tU2VhcmNoKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBxdWVyeSwgZXh0cmFzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwbGF5RnJvbU1lZGlhSWQoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgbWVkaWFJZCwKKyAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9NRURJQV9JRCwKKyAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4geworICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwbGF5RnJvbU1lZGlhSWQoKTogSWdub3JpbmcgbnVsbCBtZWRpYUlkIGZyb20gIiArIGNvbnRyb2xsZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblBsYXlGcm9tTWVkaWFJZChzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJZCwgZXh0cmFzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRSYXRpbmcoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgbWVkaWFJZCwKKyAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSByYXRpbmdCdW5kbGUpIHsKKyAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1NFVF9SQVRJTkcsCisgICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2V0UmF0aW5nKCk6IElnbm9yaW5nIG51bGwgbWVkaWFJZCBmcm9tICIgKyBjb250cm9sbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocmF0aW5nQnVuZGxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNldFJhdGluZygpOiBJZ25vcmluZyBudWxsIHJhdGluZ0J1bmRsZSBmcm9tICIgKyBjb250cm9sbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBSYXRpbmcyIHJhdGluZyA9IFJhdGluZzIuZnJvbUJ1bmRsZShyYXRpbmdCdW5kbGUpOworICAgICAgICAgICAgICAgICAgICBpZiAocmF0aW5nID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXRpbmdCdW5kbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNldFJhdGluZygpOiBJZ25vcmluZyBudWxsIHJhdGluZyBmcm9tICIgKyBjb250cm9sbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uU2V0UmF0aW5nKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgY29udHJvbGxlciwgbWVkaWFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRpbmcpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFBsYXlsaXN0KGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgTGlzdDxCdW5kbGU+IHBsYXlsaXN0LAorICAgICAgICAgICAgZmluYWwgQnVuZGxlIG1ldGFkYXRhKSB7CisgICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX0xJU1QsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICBpZiAocGxheWxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNldFBsYXlsaXN0KCk6IElnbm9yaW5nIG51bGwgcGxheWxpc3QgZnJvbSAiICsgY29udHJvbGxlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBsYXlsaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgLy8gUmVjcmVhdGVzIFVVSUQgaW4gdGhlIHBsYXlsaXN0CisgICAgICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gTWVkaWFJdGVtMkltcGwuZnJvbUJ1bmRsZShwbGF5bGlzdC5nZXQoaSksIG51bGwpOworICAgICAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoaXRlbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnNldFBsYXlsaXN0KGxpc3QsIE1lZGlhTWV0YWRhdGEyLmZyb21CdW5kbGUobWV0YWRhdGEpKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdXBkYXRlUGxheWxpc3RNZXRhZGF0YShmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIEJ1bmRsZSBtZXRhZGF0YSkgeworICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9MSVNUX01FVEFEQVRBLAorICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkudXBkYXRlUGxheWxpc3RNZXRhZGF0YShNZWRpYU1ldGFkYXRhMi5mcm9tQnVuZGxlKG1ldGFkYXRhKSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZFBsYXlsaXN0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBpbmRleCwgQnVuZGxlIG1lZGlhSXRlbSkgeworICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX0FERF9JVEVNLAorICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0cyB0aGUgVVVJRCBmcm9tIHRoZSBpbmNvbWluZyBtZWRpYSBpZCwgc28gY29udHJvbGxlciBtYXkgcmV1c2UgYSBtZWRpYQorICAgICAgICAgICAgICAgICAgICAvLyBpdGVtIG11bHRpcGxlIHRpbWVzIGZvciBhZGRQbGF5bGlzdEl0ZW0uCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5hZGRQbGF5bGlzdEl0ZW0oaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFJdGVtMkltcGwuZnJvbUJ1bmRsZShtZWRpYUl0ZW0sIG51bGwpKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVQbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBCdW5kbGUgbWVkaWFJdGVtKSB7CisgICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfUkVNT1ZFX0lURU0sCisgICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKKyAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IE1lZGlhSXRlbTIuZnJvbUJ1bmRsZShtZWRpYUl0ZW0pOworICAgICAgICAgICAgLy8gTm90ZTogTWVkaWFJdGVtMiBoYXMgaGlkZGVuIFVVSUQgdG8gaWRlbnRpZnkgaXQgYWNyb3NzIHRoZSBwcm9jZXNzZXMuCisgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkucmVtb3ZlUGxheWxpc3RJdGVtKGl0ZW0pOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXBsYWNlUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IGluZGV4LCBCdW5kbGUgbWVkaWFJdGVtKSB7CisgICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfUkVQTEFDRV9JVEVNLAorICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0cyB0aGUgVVVJRCBmcm9tIHRoZSBpbmNvbWluZyBtZWRpYSBpZCwgc28gY29udHJvbGxlciBtYXkgcmV1c2UgYSBtZWRpYQorICAgICAgICAgICAgICAgICAgICAvLyBpdGVtIG11bHRpcGxlIHRpbWVzIGZvciByZXBsYWNlUGxheWxpc3RJdGVtLgorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkucmVwbGFjZVBsYXlsaXN0SXRlbShpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUl0ZW0ySW1wbC5mcm9tQnVuZGxlKG1lZGlhSXRlbSwgbnVsbCkpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNraXBUb1BsYXlsaXN0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIEJ1bmRsZSBtZWRpYUl0ZW0pIHsKKyAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TS0lQX1RPX1BMQVlMSVNUX0lURU0sCisgICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhSXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJza2lwVG9QbGF5bGlzdEl0ZW0oKTogSWdub3JpbmcgbnVsbCBtZWRpYUl0ZW0gZnJvbSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29udHJvbGxlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogTWVkaWFJdGVtMiBoYXMgaGlkZGVuIFVVSUQgdG8gaWRlbnRpZnkgaXQgYWNyb3NzIHRoZSBwcm9jZXNzZXMuCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5za2lwVG9QbGF5bGlzdEl0ZW0oTWVkaWFJdGVtMi5mcm9tQnVuZGxlKG1lZGlhSXRlbSkpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNraXBUb1ByZXZpb3VzSXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIpIHsKKyAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TS0lQX1BSRVZfSVRFTSwKKyAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4geworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuc2tpcFRvUHJldmlvdXNJdGVtKCk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2tpcFRvTmV4dEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyKSB7CisgICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0tJUF9ORVhUX0lURU0sCisgICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnNraXBUb05leHRJdGVtKCk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0UmVwZWF0TW9kZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCByZXBlYXRNb2RlKSB7CisgICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX1JFUEVBVF9NT0RFLAorICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5zZXRSZXBlYXRNb2RlKHJlcGVhdE1vZGUpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFNodWZmbGVNb2RlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IHNodWZmbGVNb2RlKSB7CisgICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX1NIVUZGTEVfTU9ERSwKKyAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4geworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuc2V0U2h1ZmZsZU1vZGUoc2h1ZmZsZU1vZGUpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBBSURMIG1ldGhvZHMgZm9yIExpYnJhcnlTZXNzaW9uIG92ZXJyaWRlcworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGdldExpYnJhcnlSb290KGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgQnVuZGxlIHJvb3RIaW50cykKKyAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICAgICAgb25Ccm93c2VyQ29tbWFuZChjYWxsZXIsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICBmaW5hbCBMaWJyYXJ5Um9vdCByb290ID0gc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uR2V0TGlicmFyeVJvb3Qoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAorICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCByb290SGludHMpOworICAgICAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25HZXRMaWJyYXJ5Um9vdERvbmUocm9vdEhpbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgcm9vdCA9PSBudWxsID8gbnVsbCA6IHJvb3QuZ2V0Um9vdElkKCksCisgICAgICAgICAgICAgICAgICAgICAgICByb290ID09IG51bGwgPyBudWxsIDogcm9vdC5nZXRFeHRyYXMoKSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZ2V0SXRlbShmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBtZWRpYUlkKQorICAgICAgICAgICAgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24geworICAgICAgICBvbkJyb3dzZXJDb21tYW5kKGNhbGxlciwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKKyAgICAgICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAibWVkaWFJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBNZWRpYUl0ZW0yIHJlc3VsdCA9IHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkdldEl0ZW0oc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAorICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBtZWRpYUlkKTsKKyAgICAgICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4geworICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uR2V0SXRlbURvbmUobWVkaWFJZCwgcmVzdWx0ID09IG51bGwgPyBudWxsIDogcmVzdWx0LnRvQnVuZGxlKCkpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGdldENoaWxkcmVuKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIHBhcmVudElkLAorICAgICAgICAgICAgZmluYWwgaW50IHBhZ2UsIGZpbmFsIGludCBwYWdlU2l6ZSwgZmluYWwgQnVuZGxlIGV4dHJhcykgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24geworICAgICAgICBvbkJyb3dzZXJDb21tYW5kKGNhbGxlciwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKKyAgICAgICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInBhcmVudElkIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYWdlIDwgMSB8fCBwYWdlU2l6ZSA8IDEpIHsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiTmVpdGhlciBwYWdlIG5vciBwYWdlU2l6ZSBzaG91bGQgYmUgbGVzcyB0aGFuIDEiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiByZXN1bHQgPSBzZXNzaW9uLmdldENhbGxiYWNrKCkub25HZXRDaGlsZHJlbihzZXNzaW9uLmdldEluc3RhbmNlKCksCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIHBhcmVudElkLCBwYWdlLCBwYWdlU2l6ZSwgZXh0cmFzKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuc2l6ZSgpID4gcGFnZVNpemUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJvbkdldENoaWxkcmVuKCkgc2hvdWxkbid0IHJldHVybiBtZWRpYSBpdGVtcyAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJtb3JlIHRoYW4gcGFnZVNpemUuIHJlc3VsdC5zaXplKCk9IiArIHJlc3VsdC5zaXplKCkgKyAiIHBhZ2VTaXplPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcGFnZVNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgTGlzdDxCdW5kbGU+IGJ1bmRsZUxpc3Q7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidW5kbGVMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICAgICAgZm9yIChNZWRpYUl0ZW0yIGl0ZW0gOiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVuZGxlTGlzdC5hZGQoaXRlbSA9PSBudWxsID8gbnVsbCA6IGl0ZW0udG9CdW5kbGUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidW5kbGVMaXN0ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4geworICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uR2V0Q2hpbGRyZW5Eb25lKHBhcmVudElkLCBwYWdlLCBwYWdlU2l6ZSwgYnVuZGxlTGlzdCwgZXh0cmFzKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZWFyY2goSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcXVlcnksIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgb25Ccm93c2VyQ29tbWFuZChjYWxsZXIsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2VhcmNoKCk6IElnbm9yaW5nIGVtcHR5IHF1ZXJ5IGZyb20gIiArIGNvbnRyb2xsZXIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblNlYXJjaChzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXIsIHF1ZXJ5LCBleHRyYXMpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBnZXRTZWFyY2hSZXN1bHQoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgcXVlcnksCisgICAgICAgICAgICBmaW5hbCBpbnQgcGFnZSwgZmluYWwgaW50IHBhZ2VTaXplLCBmaW5hbCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIG9uQnJvd3NlckNvbW1hbmQoY2FsbGVyLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4geworICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgImdldFNlYXJjaFJlc3VsdCgpOiBJZ25vcmluZyBlbXB0eSBxdWVyeSBmcm9tICIgKyBjb250cm9sbGVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGFnZSA8IDEgfHwgcGFnZVNpemUgPCAxKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiZ2V0U2VhcmNoUmVzdWx0KCk6IElnbm9yaW5nIG5lZ2F0aXZlIHBhZ2UgLyBwYWdlU2l6ZS4iCisgICAgICAgICAgICAgICAgICAgICAgICArICIgcGFnZT0iICsgcGFnZSArICIgcGFnZVNpemU9IiArIHBhZ2VTaXplICsgIiBmcm9tICIgKyBjb250cm9sbGVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHJlc3VsdCA9IHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkdldFNlYXJjaFJlc3VsdChzZXNzaW9uLmdldEluc3RhbmNlKCksCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIHF1ZXJ5LCBwYWdlLCBwYWdlU2l6ZSwgZXh0cmFzKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuc2l6ZSgpID4gcGFnZVNpemUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJvbkdldFNlYXJjaFJlc3VsdCgpIHNob3VsZG4ndCByZXR1cm4gbWVkaWEgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiaXRlbXMgbW9yZSB0aGFuIHBhZ2VTaXplLiByZXN1bHQuc2l6ZSgpPSIgKyByZXN1bHQuc2l6ZSgpICsgIiBwYWdlU2l6ZT0iCisgICAgICAgICAgICAgICAgICAgICAgICArIHBhZ2VTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIExpc3Q8QnVuZGxlPiBidW5kbGVMaXN0OworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnVuZGxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgICAgIGZvciAoTWVkaWFJdGVtMiBpdGVtIDogcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QuYWRkKGl0ZW0gPT0gbnVsbCA/IG51bGwgOiBpdGVtLnRvQnVuZGxlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVuZGxlTGlzdCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKKyAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vbkdldFNlYXJjaFJlc3VsdERvbmUocXVlcnksIHBhZ2UsIHBhZ2VTaXplLCBidW5kbGVMaXN0LCBleHRyYXMpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN1YnNjcmliZShmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBwYXJlbnRJZCwKKyAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBvcHRpb24pIHsKKyAgICAgICAgb25Ccm93c2VyQ29tbWFuZChjYWxsZXIsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgInN1YnNjcmliZSgpOiBJZ25vcmluZyBudWxsIHBhcmVudElkIGZyb20gIiArIGNvbnRyb2xsZXIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblN1YnNjcmliZShzZXNzaW9uLmdldEluc3RhbmNlKCksCisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIHBhcmVudElkLCBvcHRpb24pOworICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IHN1YnNjcmlwdGlvbiA9IG1TdWJzY3JpcHRpb25zLmdldChjb250cm9sbGVyKTsKKyAgICAgICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICAgICAgICAgICAgICBtU3Vic2NyaXB0aW9ucy5wdXQoY29udHJvbGxlciwgc3Vic2NyaXB0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLmFkZChwYXJlbnRJZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHVuc3Vic2NyaWJlKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIHBhcmVudElkKSB7CisgICAgICAgIG9uQnJvd3NlckNvbW1hbmQoY2FsbGVyLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4geworICAgICAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJ1bnN1YnNjcmliZSgpOiBJZ25vcmluZyBudWxsIHBhcmVudElkIGZyb20gIiArIGNvbnRyb2xsZXIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblVuc3Vic2NyaWJlKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgY29udHJvbGxlciwgcGFyZW50SWQpOworICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgICAgIG1TdWJzY3JpcHRpb25zLnJlbW92ZShjb250cm9sbGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEFQSXMgZm9yIE1lZGlhU2Vzc2lvbjJJbXBsCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgLy8gVE9ETyhqYWV3YW4pOiAoQ2FuIGJlIFBvc3QtUCkgTmVlZCBhIHdheSB0byBnZXQgY29udHJvbGxlciB3aXRoIHBlcm1pc3Npb25zCisgICAgcHVibGljIExpc3Q8Q29udHJvbGxlckluZm8+IGdldENvbnRyb2xsZXJzKCkgeworICAgICAgICBBcnJheUxpc3Q8Q29udHJvbGxlckluZm8+IGNvbnRyb2xsZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUNvbnRyb2xsZXJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgY29udHJvbGxlcnMuYWRkKG1Db250cm9sbGVycy52YWx1ZUF0KGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29udHJvbGxlcnM7CisgICAgfQorCisgICAgLy8gU2hvdWxkIGJlIHVzZWQgd2l0aG91dCBhIGxvY2sgdG8gcHJldmVudCBwb3RlbnRpYWwgZGVhZGxvY2suCisgICAgcHVibGljIHZvaWQgbm90aWZ5UGxheWVyU3RhdGVDaGFuZ2VkTm90TG9ja2VkKGludCBzdGF0ZSkgeworICAgICAgICBub3RpZnlBbGwoKGNvbnRyb2xsZXIsIGlDb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICBpQ29udHJvbGxlci5vblBsYXllclN0YXRlQ2hhbmdlZChzdGF0ZSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8vIFRPRE8oamFld2FuKTogUmVuYW1lCisgICAgcHVibGljIHZvaWQgbm90aWZ5UG9zaXRpb25DaGFuZ2VkTm90TG9ja2VkKGxvbmcgZXZlbnRUaW1lTXMsIGxvbmcgcG9zaXRpb25NcykgeworICAgICAgICBub3RpZnlBbGwoKGNvbnRyb2xsZXIsIGlDb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICBpQ29udHJvbGxlci5vblBvc2l0aW9uQ2hhbmdlZChldmVudFRpbWVNcywgcG9zaXRpb25Ncyk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeVBsYXliYWNrU3BlZWRDaGFuZ2VkTm90TG9ja2VkKGZsb2F0IHNwZWVkKSB7CisgICAgICAgIG5vdGlmeUFsbCgoY29udHJvbGxlciwgaUNvbnRyb2xsZXIpIC0+IHsKKyAgICAgICAgICAgIGlDb250cm9sbGVyLm9uUGxheWJhY2tTcGVlZENoYW5nZWQoc3BlZWQpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlCdWZmZXJlZFBvc2l0aW9uQ2hhbmdlZE5vdExvY2tlZChsb25nIGJ1ZmZlcmVkUG9zaXRpb25NcykgeworICAgICAgICBub3RpZnlBbGwoKGNvbnRyb2xsZXIsIGlDb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICBpQ29udHJvbGxlci5vbkJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkKGJ1ZmZlcmVkUG9zaXRpb25Ncyk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeUN1c3RvbUxheW91dE5vdExvY2tlZChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBMaXN0PENvbW1hbmRCdXR0b24+IGxheW91dCkgeworICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKKyAgICAgICAgICAgIExpc3Q8QnVuZGxlPiBsYXlvdXRCdW5kbGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxheW91dC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSAoKENvbW1hbmRCdXR0b25JbXBsKSBsYXlvdXQuZ2V0KGkpLmdldFByb3ZpZGVyKCkpLnRvQnVuZGxlKCk7CisgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGxheW91dEJ1bmRsZXMuYWRkKGJ1bmRsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaUNvbnRyb2xsZXIub25DdXN0b21MYXlvdXRDaGFuZ2VkKGxheW91dEJ1bmRsZXMpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlQbGF5bGlzdENoYW5nZWROb3RMb2NrZWQoTGlzdDxNZWRpYUl0ZW0yPiBwbGF5bGlzdCwgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKKyAgICAgICAgZmluYWwgTGlzdDxCdW5kbGU+IGJ1bmRsZUxpc3Q7CisgICAgICAgIGlmIChwbGF5bGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBidW5kbGVMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBsYXlsaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHBsYXlsaXN0LmdldChpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBwbGF5bGlzdC5nZXQoaSkudG9CdW5kbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGVMaXN0LmFkZChidW5kbGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVuZGxlTGlzdCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgQnVuZGxlIG1ldGFkYXRhQnVuZGxlID0gKG1ldGFkYXRhID09IG51bGwpID8gbnVsbCA6IG1ldGFkYXRhLnRvQnVuZGxlKCk7CisgICAgICAgIG5vdGlmeUFsbCgoY29udHJvbGxlciwgaUNvbnRyb2xsZXIpIC0+IHsKKyAgICAgICAgICAgIGlmIChnZXRDb250cm9sbGVyQmluZGVySWZBYmxlKGNvbnRyb2xsZXIsCisgICAgICAgICAgICAgICAgICAgIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfR0VUX0xJU1QpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vblBsYXlsaXN0Q2hhbmdlZChidW5kbGVMaXN0LCBtZXRhZGF0YUJ1bmRsZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoY29udHJvbGxlciwKKyAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9HRVRfTElTVF9NRVRBREFUQSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQobWV0YWRhdGFCdW5kbGUpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlQbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZE5vdExvY2tlZChNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgeworICAgICAgICBmaW5hbCBCdW5kbGUgbWV0YWRhdGFCdW5kbGUgPSAobWV0YWRhdGEgPT0gbnVsbCkgPyBudWxsIDogbWV0YWRhdGEudG9CdW5kbGUoKTsKKyAgICAgICAgbm90aWZ5QWxsKFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfR0VUX0xJU1RfTUVUQURBVEEsCisgICAgICAgICAgICAgICAgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZChtZXRhZGF0YUJ1bmRsZSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5UmVwZWF0TW9kZUNoYW5nZWROb3RMb2NrZWQoaW50IHJlcGVhdE1vZGUpIHsKKyAgICAgICAgbm90aWZ5QWxsKCh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICBpQ29udHJvbGxlci5vblJlcGVhdE1vZGVDaGFuZ2VkKHJlcGVhdE1vZGUpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlTaHVmZmxlTW9kZUNoYW5nZWROb3RMb2NrZWQoaW50IHNodWZmbGVNb2RlKSB7CisgICAgICAgIG5vdGlmeUFsbCgodW51c2VkLCBpQ29udHJvbGxlcikgLT4geworICAgICAgICAgICAgaUNvbnRyb2xsZXIub25TaHVmZmxlTW9kZUNoYW5nZWQoc2h1ZmZsZU1vZGUpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlQbGF5YmFja0luZm9DaGFuZ2VkKE1lZGlhQ29udHJvbGxlcjIuUGxheWJhY2tJbmZvIHBsYXliYWNrSW5mbykgeworICAgICAgICBmaW5hbCBCdW5kbGUgcGxheWJhY2tJbmZvQnVuZGxlID0KKyAgICAgICAgICAgICAgICAoKE1lZGlhQ29udHJvbGxlcjJJbXBsLlBsYXliYWNrSW5mb0ltcGwpIHBsYXliYWNrSW5mby5nZXRQcm92aWRlcigpKS50b0J1bmRsZSgpOworICAgICAgICBub3RpZnlBbGwoKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKKyAgICAgICAgICAgIGlDb250cm9sbGVyLm9uUGxheWJhY2tJbmZvQ2hhbmdlZChwbGF5YmFja0luZm9CdW5kbGUpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBbGxvd2VkQ29tbWFuZHMoQ29udHJvbGxlckluZm8gY29udHJvbGxlciwgU2Vzc2lvbkNvbW1hbmRHcm91cDIgY29tbWFuZHMpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgbUFsbG93ZWRDb21tYW5kR3JvdXBNYXAucHV0KGNvbnRyb2xsZXIsIGNvbW1hbmRzKTsKKyAgICAgICAgfQorICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKKyAgICAgICAgICAgIGlDb250cm9sbGVyLm9uQWxsb3dlZENvbW1hbmRzQ2hhbmdlZChjb21tYW5kcy50b0J1bmRsZSgpKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUNvbW1hbmQoQ29udHJvbGxlckluZm8gY29udHJvbGxlciwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQsIEJ1bmRsZSBhcmdzLAorICAgICAgICAgICAgUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKKyAgICAgICAgaWYgKHJlY2VpdmVyICE9IG51bGwgJiYgY29udHJvbGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb250cm9sbGVyIHNob3VsZG4ndCBiZSBudWxsIGlmIHJlc3VsdCByZWNlaXZlciBpcyIKKyAgICAgICAgICAgICAgICAgICAgKyAiIHNwZWNpZmllZCIpOworICAgICAgICB9CisgICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKKyAgICAgICAgICAgIEJ1bmRsZSBjb21tYW5kQnVuZGxlID0gY29tbWFuZC50b0J1bmRsZSgpOworICAgICAgICAgICAgaUNvbnRyb2xsZXIub25DdXN0b21Db21tYW5kKGNvbW1hbmRCdW5kbGUsIGFyZ3MsIG51bGwpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZW5kQ3VzdG9tQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCwgQnVuZGxlIGFyZ3MpIHsKKyAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIEJ1bmRsZSBjb21tYW5kQnVuZGxlID0gY29tbWFuZC50b0J1bmRsZSgpOworICAgICAgICBub3RpZnlBbGwoKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKKyAgICAgICAgICAgIGlDb250cm9sbGVyLm9uQ3VzdG9tQ29tbWFuZChjb21tYW5kQnVuZGxlLCBhcmdzLCBudWxsKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5RXJyb3IoaW50IGVycm9yQ29kZSwgQnVuZGxlIGV4dHJhcykgeworICAgICAgICBub3RpZnlBbGwoKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKKyAgICAgICAgICAgIGlDb250cm9sbGVyLm9uRXJyb3IoZXJyb3JDb2RlLCBleHRyYXMpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQVBJcyBmb3IgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlTZWFyY2hSZXN1bHRDaGFuZ2VkKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIFN0cmluZyBxdWVyeSwgaW50IGl0ZW1Db3VudCwKKyAgICAgICAgICAgIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICBpQ29udHJvbGxlci5vblNlYXJjaFJlc3VsdENoYW5nZWQocXVlcnksIGl0ZW1Db3VudCwgZXh0cmFzKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbm90aWZ5Q2hpbGRyZW5DaGFuZ2VkTm90TG9ja2VkKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIFN0cmluZyBwYXJlbnRJZCwKKyAgICAgICAgICAgIGludCBpdGVtQ291bnQsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7CisgICAgICAgICAgICBpZiAoaXNTdWJzY3JpYmVkKGNvbnRyb2xsZXIsIHBhcmVudElkKSkgeworICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uQ2hpbGRyZW5DaGFuZ2VkKHBhcmVudElkLCBpdGVtQ291bnQsIGV4dHJhcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoaWxkcmVuQ2hhbmdlZE5vdExvY2tlZChTdHJpbmcgcGFyZW50SWQsIGludCBpdGVtQ291bnQsIEJ1bmRsZSBleHRyYXMpIHsKKyAgICAgICAgbm90aWZ5QWxsKChjb250cm9sbGVyLCBpQ29udHJvbGxlcikgLT4geworICAgICAgICAgICAgaWYgKGlzU3Vic2NyaWJlZChjb250cm9sbGVyLCBwYXJlbnRJZCkpIHsKKyAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vbkNoaWxkcmVuQ2hhbmdlZChwYXJlbnRJZCwgaXRlbUNvdW50LCBleHRyYXMpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNTdWJzY3JpYmVkKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIFN0cmluZyBwYXJlbnRJZCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBTZXQ8U3RyaW5nPiBzdWJzY3JpcHRpb25zID0gbVN1YnNjcmlwdGlvbnMuZ2V0KGNvbnRyb2xsZXIpOworICAgICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbnMgPT0gbnVsbCB8fCAhc3Vic2NyaXB0aW9ucy5jb250YWlucyhwYXJlbnRJZCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIE1pc2MKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBARnVuY3Rpb25hbEludGVyZmFjZQorICAgIHByaXZhdGUgaW50ZXJmYWNlIFNlc3Npb25SdW5uYWJsZSB7CisgICAgICAgIHZvaWQgcnVuKGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24sIGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIpOworICAgIH0KKworICAgIEBGdW5jdGlvbmFsSW50ZXJmYWNlCisgICAgcHJpdmF0ZSBpbnRlcmZhY2UgTGlicmFyeVNlc3Npb25SdW5uYWJsZSB7CisgICAgICAgIHZvaWQgcnVuKGZpbmFsIE1lZGlhTGlicmFyeVNlc3Npb25JbXBsIHNlc3Npb24sIGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIpOworICAgIH0KKworICAgIEBGdW5jdGlvbmFsSW50ZXJmYWNlCisgICAgcHJpdmF0ZSBpbnRlcmZhY2UgTm90aWZ5UnVubmFibGUgeworICAgICAgICB2b2lkIHJ1bihmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAorICAgICAgICAgICAgICAgIGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGlDb250cm9sbGVyKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uU2VydmljZTJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvblNlcnZpY2UySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzM2ViNjUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvblNlcnZpY2UySW1wbC5qYXZhCkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5Db250ZXh0Lk5PVElGSUNBVElPTl9TRVJWSUNFOworCitpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZS5QbGF5ZXJFdmVudENhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTIuTWVkaWFOb3RpZmljYXRpb247CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOworaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5Ub2tlblR5cGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFTZXNzaW9uU2VydmljZTJQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uR3VhcmRlZEJ5OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8vIFRPRE8oamFld2FuKTogTmVlZCBhIHRlc3QgZm9yIHNlc3Npb24gc2VydmljZSBpdHNlbGYuCitwdWJsaWMgY2xhc3MgTWVkaWFTZXNzaW9uU2VydmljZTJJbXBsIGltcGxlbWVudHMgTWVkaWFTZXNzaW9uU2VydmljZTJQcm92aWRlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1QU2Vzc2lvblNlcnZpY2UiOyAvLyB0byBtZWV0IDIzIGNoYXIgbGltaXQgaW4gTG9nIHRhZworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBUT0RPKGphZXdhbik6IENoYW5nZSB0aGlzLiAoYi83NDA5NDYxMSkKKworICAgIHByaXZhdGUgZmluYWwgTWVkaWFTZXNzaW9uU2VydmljZTIgbUluc3RhbmNlOworICAgIHByaXZhdGUgZmluYWwgUGxheWVyRXZlbnRDYWxsYmFjayBtQ2FsbGJhY2sgPSBuZXcgU2Vzc2lvblNlcnZpY2VFdmVudENhbGxiYWNrKCk7CisKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKKyAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCisgICAgcHJpdmF0ZSBOb3RpZmljYXRpb25NYW5hZ2VyIG1Ob3RpZmljYXRpb25NYW5hZ2VyOworICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKKyAgICBwcml2YXRlIEludGVudCBtU3RhcnRTZWxmSW50ZW50OworCisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc1J1bm5pbmdGb3JlZ3JvdW5kOworICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uMiBtU2Vzc2lvbjsKKworICAgIHB1YmxpYyBNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwoTWVkaWFTZXNzaW9uU2VydmljZTIgaW5zdGFuY2UpIHsKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwoIiArIGluc3RhbmNlICsgIikiKTsKKyAgICAgICAgfQorICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVkaWFTZXNzaW9uMiBnZXRTZXNzaW9uX2ltcGwoKSB7CisgICAgICAgIHJldHVybiBnZXRTZXNzaW9uKCk7CisgICAgfQorCisgICAgTWVkaWFTZXNzaW9uMiBnZXRTZXNzaW9uKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICByZXR1cm4gbVNlc3Npb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVkaWFOb3RpZmljYXRpb24gb25VcGRhdGVOb3RpZmljYXRpb25faW1wbCgpIHsKKyAgICAgICAgLy8gUHJvdmlkZSBkZWZhdWx0IG5vdGlmaWNhdGlvbiBVSSBsYXRlci4KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGVfaW1wbCgpIHsKKyAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIgPSAoTm90aWZpY2F0aW9uTWFuYWdlcikgbUluc3RhbmNlLmdldFN5c3RlbVNlcnZpY2UoCisgICAgICAgICAgICAgICAgTk9USUZJQ0FUSU9OX1NFUlZJQ0UpOworICAgICAgICBtU3RhcnRTZWxmSW50ZW50ID0gbmV3IEludGVudChtSW5zdGFuY2UsIG1JbnN0YW5jZS5nZXRDbGFzcygpKTsKKworICAgICAgICBTZXNzaW9uVG9rZW4yIHRva2VuID0gbmV3IFNlc3Npb25Ub2tlbjIobUluc3RhbmNlLCBtSW5zdGFuY2UuZ2V0UGFja2FnZU5hbWUoKSwKKyAgICAgICAgICAgICAgICBtSW5zdGFuY2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICBpZiAodG9rZW4uZ2V0VHlwZSgpICE9IGdldFNlc3Npb25UeXBlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHBlY3RlZCBzZXNzaW9uIHNlcnZpY2UsIGJ1dCB3YXMgIiArIHRva2VuLmdldFR5cGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgbVNlc3Npb24gPSBtSW5zdGFuY2Uub25DcmVhdGVTZXNzaW9uKHRva2VuLmdldElkKCkpOworICAgICAgICBpZiAobVNlc3Npb24gPT0gbnVsbCB8fCAhdG9rZW4uZ2V0SWQoKS5lcXVhbHMobVNlc3Npb24uZ2V0VG9rZW4oKS5nZXRJZCgpKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4cGVjdGVkIHNlc3Npb24gd2l0aCBpZCAiICsgdG9rZW4uZ2V0SWQoKQorICAgICAgICAgICAgICAgICAgICArICIsIGJ1dCBnb3QgIiArIG1TZXNzaW9uKTsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPKGphZXdhbik6IFVuY29tbWVudCBoZXJlLgorICAgICAgICAvLyBtU2Vzc2lvbi5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2sobUNhbGxiYWNrLCBtU2Vzc2lvbi5nZXRFeGVjdXRvcigpKTsKKyAgICB9CisKKyAgICBAVG9rZW5UeXBlIGludCBnZXRTZXNzaW9uVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIFNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OX1NFUlZJQ0U7CisgICAgfQorCisgICAgcHVibGljIElCaW5kZXIgb25CaW5kX2ltcGwoSW50ZW50IGludGVudCkgeworICAgICAgICBpZiAoTWVkaWFTZXNzaW9uU2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKE1lZGlhU2Vzc2lvbjJJbXBsKSBtU2Vzc2lvbi5nZXRQcm92aWRlcigpKS5nZXRTZXNzaW9uU3R1YigpLmFzQmluZGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU5vdGlmaWNhdGlvbihpbnQgcGxheWVyU3RhdGUpIHsKKyAgICAgICAgTWVkaWFOb3RpZmljYXRpb24gbWVkaWFOb3RpZmljYXRpb24gPSBtSW5zdGFuY2Uub25VcGRhdGVOb3RpZmljYXRpb24oKTsKKyAgICAgICAgaWYgKG1lZGlhTm90aWZpY2F0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2gocGxheWVyU3RhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgTWVkaWFQbGF5ZXJCYXNlLlBMQVlFUl9TVEFURV9QTEFZSU5HOgorICAgICAgICAgICAgICAgIGlmICghbUlzUnVubmluZ0ZvcmVncm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUlzUnVubmluZ0ZvcmVncm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc3RhcnRGb3JlZ3JvdW5kU2VydmljZShtU3RhcnRTZWxmSW50ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnN0YXJ0Rm9yZWdyb3VuZChtZWRpYU5vdGlmaWNhdGlvbi5nZXROb3RpZmljYXRpb25JZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhTm90aWZpY2F0aW9uLmdldE5vdGlmaWNhdGlvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTWVkaWFQbGF5ZXJCYXNlLlBMQVlFUl9TVEFURV9JRExFOgorICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXllckJhc2UuUExBWUVSX1NUQVRFX0VSUk9SOgorICAgICAgICAgICAgICAgIGlmIChtSXNSdW5uaW5nRm9yZWdyb3VuZCkgeworICAgICAgICAgICAgICAgICAgICBtSXNSdW5uaW5nRm9yZWdyb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc3RvcEZvcmVncm91bmQodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIubm90aWZ5KG1lZGlhTm90aWZpY2F0aW9uLmdldE5vdGlmaWNhdGlvbklkKCksCisgICAgICAgICAgICAgICAgbWVkaWFOb3RpZmljYXRpb24uZ2V0Tm90aWZpY2F0aW9uKCkpOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgU2Vzc2lvblNlcnZpY2VFdmVudENhbGxiYWNrIGV4dGVuZHMgUGxheWVyRXZlbnRDYWxsYmFjayB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXllclN0YXRlQ2hhbmdlZChNZWRpYVBsYXllckJhc2UgcGxheWVyLCBpbnQgc3RhdGUpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1lZGlhTm90aWZpY2F0aW9uSW1wbCBpbXBsZW1lbnRzIE1lZGlhTm90aWZpY2F0aW9uUHJvdmlkZXIgeworICAgICAgICBwcml2YXRlIGludCBtTm90aWZpY2F0aW9uSWQ7CisgICAgICAgIHByaXZhdGUgTm90aWZpY2F0aW9uIG1Ob3RpZmljYXRpb247CisKKyAgICAgICAgcHVibGljIE1lZGlhTm90aWZpY2F0aW9uSW1wbChNZWRpYU5vdGlmaWNhdGlvbiBpbnN0YW5jZSwgaW50IG5vdGlmaWNhdGlvbklkLAorICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKyAgICAgICAgICAgIGlmIChub3RpZmljYXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vdGlmaWNhdGlvbiBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU5vdGlmaWNhdGlvbklkID0gbm90aWZpY2F0aW9uSWQ7CisgICAgICAgICAgICBtTm90aWZpY2F0aW9uID0gbm90aWZpY2F0aW9uOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Tm90aWZpY2F0aW9uSWRfaW1wbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTm90aWZpY2F0aW9uSWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE5vdGlmaWNhdGlvbiBnZXROb3RpZmljYXRpb25faW1wbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTm90aWZpY2F0aW9uOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9SYXRpbmcySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9SYXRpbmcySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NTgxMjkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1JhdGluZzJJbXBsLmphdmEKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5SYXRpbmcyLio7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlJhdGluZzI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5SYXRpbmcyLlN0eWxlOworaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlJhdGluZzJQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBSYXRpbmcySW1wbCBpbXBsZW1lbnRzIFJhdGluZzJQcm92aWRlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJSYXRpbmcyIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU1RZTEUgPSAiYW5kcm9pZC5tZWRpYS5yYXRpbmcyLnN0eWxlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZBTFVFID0gImFuZHJvaWQubWVkaWEucmF0aW5nMi52YWx1ZSI7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBmbG9hdCBSQVRJTkdfTk9UX1JBVEVEID0gLTEuMGY7CisKKyAgICBwcml2YXRlIGZpbmFsIFJhdGluZzIgbUluc3RhbmNlOworICAgIHByaXZhdGUgZmluYWwgaW50IG1SYXRpbmdTdHlsZTsKKyAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1SYXRpbmdWYWx1ZTsKKworICAgIHByaXZhdGUgUmF0aW5nMkltcGwoQFN0eWxlIGludCByYXRpbmdTdHlsZSwgZmxvYXQgcmF0aW5nKSB7CisgICAgICAgIG1SYXRpbmdTdHlsZSA9IHJhdGluZ1N0eWxlOworICAgICAgICBtUmF0aW5nVmFsdWUgPSByYXRpbmc7CisgICAgICAgIG1JbnN0YW5jZSA9IG5ldyBSYXRpbmcyKHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuICJSYXRpbmcyOnN0eWxlPSIgKyBtUmF0aW5nU3R5bGUgKyAiIHJhdGluZz0iCisgICAgICAgICAgICAgICAgKyAobVJhdGluZ1ZhbHVlIDwgMC4wZiA/ICJ1bnJhdGVkIiA6IFN0cmluZy52YWx1ZU9mKG1SYXRpbmdWYWx1ZSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFsc19pbXBsKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgUmF0aW5nMikpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBSYXRpbmcySW1wbCBvdGhlciA9IChSYXRpbmcySW1wbCkgKChSYXRpbmcyKSBvYmopLmdldFByb3ZpZGVyKCk7CisgICAgICAgIHJldHVybiBtUmF0aW5nU3R5bGUgPT0gb3RoZXIubVJhdGluZ1N0eWxlCisgICAgICAgICAgICAgICAgJiYgbVJhdGluZ1ZhbHVlID09IG90aGVyLm1SYXRpbmdWYWx1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlX2ltcGwoKSB7CisgICAgICAgIHJldHVybiBPYmplY3RzLmhhc2gobVJhdGluZ1N0eWxlLCBtUmF0aW5nVmFsdWUpOworICAgIH0KKworICAgIFJhdGluZzIgZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBtSW5zdGFuY2U7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBSYXRpbmcyIGZyb21CdW5kbGVfaW1wbChCdW5kbGUgYnVuZGxlKSB7CisgICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcySW1wbChidW5kbGUuZ2V0SW50KEtFWV9TVFlMRSksIGJ1bmRsZS5nZXRGbG9hdChLRVlfVkFMVUUpKS5nZXRJbnN0YW5jZSgpOworICAgIH0KKworICAgIHB1YmxpYyBCdW5kbGUgdG9CdW5kbGVfaW1wbCgpIHsKKyAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgYnVuZGxlLnB1dEludChLRVlfU1RZTEUsIG1SYXRpbmdTdHlsZSk7CisgICAgICAgIGJ1bmRsZS5wdXRGbG9hdChLRVlfVkFMVUUsIG1SYXRpbmdWYWx1ZSk7CisgICAgICAgIHJldHVybiBidW5kbGU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBSYXRpbmcyIG5ld1VucmF0ZWRSYXRpbmdfaW1wbChAU3R5bGUgaW50IHJhdGluZ1N0eWxlKSB7CisgICAgICAgIHN3aXRjaChyYXRpbmdTdHlsZSkgeworICAgICAgICAgICAgY2FzZSBSQVRJTkdfSEVBUlQ6CisgICAgICAgICAgICBjYXNlIFJBVElOR19USFVNQl9VUF9ET1dOOgorICAgICAgICAgICAgY2FzZSBSQVRJTkdfM19TVEFSUzoKKyAgICAgICAgICAgIGNhc2UgUkFUSU5HXzRfU1RBUlM6CisgICAgICAgICAgICBjYXNlIFJBVElOR181X1NUQVJTOgorICAgICAgICAgICAgY2FzZSBSQVRJTkdfUEVSQ0VOVEFHRToKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJhdGluZzJJbXBsKHJhdGluZ1N0eWxlLCBSQVRJTkdfTk9UX1JBVEVEKS5nZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBuZXdIZWFydFJhdGluZ19pbXBsKGJvb2xlYW4gaGFzSGVhcnQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcySW1wbChSQVRJTkdfSEVBUlQsIGhhc0hlYXJ0ID8gMS4wZiA6IDAuMGYpLmdldEluc3RhbmNlKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBSYXRpbmcyIG5ld1RodW1iUmF0aW5nX2ltcGwoYm9vbGVhbiB0aHVtYklzVXApIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcySW1wbChSQVRJTkdfVEhVTUJfVVBfRE9XTiwgdGh1bWJJc1VwID8gMS4wZiA6IDAuMGYpLmdldEluc3RhbmNlKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBSYXRpbmcyIG5ld1N0YXJSYXRpbmdfaW1wbChpbnQgc3RhclJhdGluZ1N0eWxlLCBmbG9hdCBzdGFyUmF0aW5nKSB7CisgICAgICAgIGZsb2F0IG1heFJhdGluZyA9IFJBVElOR19OT1RfUkFURUQ7CisgICAgICAgIHN3aXRjaChzdGFyUmF0aW5nU3R5bGUpIHsKKyAgICAgICAgICAgIGNhc2UgUkFUSU5HXzNfU1RBUlM6CisgICAgICAgICAgICAgICAgbWF4UmF0aW5nID0gMy4wZjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUkFUSU5HXzRfU1RBUlM6CisgICAgICAgICAgICAgICAgbWF4UmF0aW5nID0gNC4wZjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUkFUSU5HXzVfU1RBUlM6CisgICAgICAgICAgICAgICAgbWF4UmF0aW5nID0gNS4wZjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW52YWxpZCByYXRpbmcgc3R5bGUgKCIgKyBzdGFyUmF0aW5nU3R5bGUgKyAiKSBmb3IgYSBzdGFyIHJhdGluZyIpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGlmICgoc3RhclJhdGluZyA8IDAuMGYpIHx8IChzdGFyUmF0aW5nID4gbWF4UmF0aW5nKSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiVHJ5aW5nIHRvIHNldCBvdXQgb2YgcmFuZ2Ugc3Rhci1iYXNlZCByYXRpbmciKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgUmF0aW5nMkltcGwoc3RhclJhdGluZ1N0eWxlLCBzdGFyUmF0aW5nKS5nZXRJbnN0YW5jZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBuZXdQZXJjZW50YWdlUmF0aW5nX2ltcGwoZmxvYXQgcGVyY2VudCkgeworICAgICAgICBpZiAoKHBlcmNlbnQgPCAwLjBmKSB8fCAocGVyY2VudCA+IDEwMC4wZikpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkludmFsaWQgcGVyY2VudGFnZS1iYXNlZCByYXRpbmcgdmFsdWUiKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcySW1wbChSQVRJTkdfUEVSQ0VOVEFHRSwgcGVyY2VudCkuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUmF0ZWRfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIG1SYXRpbmdWYWx1ZSA+PSAwLjBmOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0UmF0aW5nU3R5bGVfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIG1SYXRpbmdTdHlsZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNIZWFydF9pbXBsKCkgeworICAgICAgICBpZiAobVJhdGluZ1N0eWxlICE9IFJBVElOR19IRUFSVCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIChtUmF0aW5nVmFsdWUgPT0gMS4wZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RodW1iVXBfaW1wbCgpIHsKKyAgICAgICAgaWYgKG1SYXRpbmdTdHlsZSAhPSBSQVRJTkdfVEhVTUJfVVBfRE9XTikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIChtUmF0aW5nVmFsdWUgPT0gMS4wZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmxvYXQgZ2V0U3RhclJhdGluZ19pbXBsKCkgeworICAgICAgICBzd2l0Y2ggKG1SYXRpbmdTdHlsZSkgeworICAgICAgICAgICAgY2FzZSBSQVRJTkdfM19TVEFSUzoKKyAgICAgICAgICAgIGNhc2UgUkFUSU5HXzRfU1RBUlM6CisgICAgICAgICAgICBjYXNlIFJBVElOR181X1NUQVJTOgorICAgICAgICAgICAgICAgIGlmIChtSW5zdGFuY2UuaXNSYXRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtUmF0aW5nVmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEuMGY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmxvYXQgZ2V0UGVyY2VudFJhdGluZ19pbXBsKCkgeworICAgICAgICBpZiAoKG1SYXRpbmdTdHlsZSAhPSBSQVRJTkdfUEVSQ0VOVEFHRSkgfHwgIW1JbnN0YW5jZS5pc1JhdGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtMS4wZjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBtUmF0aW5nVmFsdWU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1JvdXRlUGxheWVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1JvdXRlUGxheWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ1MGQzNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvUm91dGVQbGF5ZXIuamF2YQpAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuRGF0YVNvdXJjZURlc2M7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5SZXF1aXJlc0FwaTsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFJdGVtU3RhdHVzOworaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVNlc3Npb25TdGF0dXM7CitpbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5SZW1vdGVQbGF5YmFja0NsaWVudDsKK2ltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLlJlbW90ZVBsYXliYWNrQ2xpZW50Lkl0ZW1BY3Rpb25DYWxsYmFjazsKK2ltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLlJlbW90ZVBsYXliYWNrQ2xpZW50LlNlc3Npb25BY3Rpb25DYWxsYmFjazsKK2ltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLlJlbW90ZVBsYXliYWNrQ2xpZW50LlN0YXR1c0NhbGxiYWNrOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworQFJlcXVpcmVzQXBpKGFwaSA9IEJ1aWxkLlZFUlNJT05fQ09ERVMuTE9MTElQT1ApCitwdWJsaWMgY2xhc3MgUm91dGVQbGF5ZXIgZXh0ZW5kcyBNZWRpYVNlc3Npb24uQ2FsbGJhY2sgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBQTEFZQkFDS19BQ1RJT05TID0gUGxheWJhY2tTdGF0ZS5BQ1RJT05fUEFVU0UKKyAgICAgICAgICAgIHwgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUExBWSB8IFBsYXliYWNrU3RhdGUuQUNUSU9OX1NFRUtfVE8KKyAgICAgICAgICAgIHwgUGxheWJhY2tTdGF0ZS5BQ1RJT05fRkFTVF9GT1JXQVJEIHwgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUkVXSU5EOworCisgICAgcHJpdmF0ZSBSZW1vdGVQbGF5YmFja0NsaWVudCBtQ2xpZW50OworICAgIHByaXZhdGUgU3RyaW5nIG1TZXNzaW9uSWQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbUl0ZW1JZDsKKyAgICBwcml2YXRlIFBsYXllckV2ZW50Q2FsbGJhY2sgbUNhbGxiYWNrOworCisgICAgcHJpdmF0ZSBTdGF0dXNDYWxsYmFjayBtU3RhdHVzQ2FsbGJhY2sgPSBuZXcgU3RhdHVzQ2FsbGJhY2soKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1TdGF0dXNDaGFuZ2VkKEJ1bmRsZSBkYXRhLAorICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzLAorICAgICAgICAgICAgICAgIFN0cmluZyBpdGVtSWQsIE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzKSB7CisgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7CisgICAgICAgICAgICB1cGRhdGVJdGVtU3RhdHVzKGl0ZW1JZCwgaXRlbVN0YXR1cyk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIFJvdXRlUGxheWVyKENvbnRleHQgY29udGV4dCwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgIG1DbGllbnQgPSBuZXcgUmVtb3RlUGxheWJhY2tDbGllbnQoY29udGV4dCwgcm91dGUpOworICAgICAgICBtQ2xpZW50LnNldFN0YXR1c0NhbGxiYWNrKG1TdGF0dXNDYWxsYmFjayk7CisgICAgICAgIG1DbGllbnQuc3RhcnRTZXNzaW9uKG51bGwsIG5ldyBTZXNzaW9uQWN0aW9uQ2FsbGJhY2soKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgeworICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25QbGF5KCkgeworICAgICAgICBtQ2xpZW50LnJlc3VtZShudWxsLCBuZXcgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIG1DbGllbnQucGF1c2UobnVsbCwgbmV3IFNlc3Npb25BY3Rpb25DYWxsYmFjaygpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlU2Vzc2lvblN0YXR1cyhzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblNlZWtUbyhsb25nIHBvcykgeworICAgICAgICBtQ2xpZW50LnNlZWsobUl0ZW1JZCwgcG9zLCBudWxsLCBuZXcgSXRlbUFjdGlvbkNhbGxiYWNrKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpdGVtSWQsIE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlU2Vzc2lvblN0YXR1cyhzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOworICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW1TdGF0dXMoaXRlbUlkLCBpdGVtU3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdG9wKCkgeworICAgICAgICBtQ2xpZW50LnN0b3AobnVsbCwgbmV3IFNlc3Npb25BY3Rpb25DYWxsYmFjaygpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlU2Vzc2lvblN0YXR1cyhzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQbGF5ZXJFdmVudENhbGxiYWNrKFBsYXllckV2ZW50Q2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb3BlblZpZGVvKERhdGFTb3VyY2VEZXNjIGRzZCkgeworICAgICAgICBtQ2xpZW50LnBsYXkoZHNkLmdldFVyaSgpLCAidmlkZW8vbXA0IiwgbnVsbCwgMCwgbnVsbCwgbmV3IEl0ZW1BY3Rpb25DYWxsYmFjaygpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkLCBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgeworICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVJdGVtU3RhdHVzKGl0ZW1JZCwgaXRlbVN0YXR1cyk7CisgICAgICAgICAgICAgICAgcGxheUludGVybmFsKGRzZC5nZXRVcmkoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7CisgICAgICAgIGlmIChtQ2xpZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1DbGllbnQucmVsZWFzZSgpOworICAgICAgICAgICAgbUNsaWVudCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2sgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBsYXlJbnRlcm5hbChVcmkgdXJpKSB7CisgICAgICAgIG1DbGllbnQucGxheSh1cmksICJ2aWRlby9tcDQiLCBudWxsLCAwLCBudWxsLCBuZXcgSXRlbUFjdGlvbkNhbGxiYWNrKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpdGVtSWQsIE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlU2Vzc2lvblN0YXR1cyhzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOworICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW1TdGF0dXMoaXRlbUlkLCBpdGVtU3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVNlc3Npb25TdGF0dXMoU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMpIHsKKyAgICAgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlSXRlbVN0YXR1cyhTdHJpbmcgaXRlbUlkLCBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgeworICAgICAgICBtSXRlbUlkID0gaXRlbUlkOworICAgICAgICBpZiAoaXRlbVN0YXR1cyA9PSBudWxsIHx8IG1DYWxsYmFjayA9PSBudWxsKSByZXR1cm47CisgICAgICAgIG1DYWxsYmFjay5vblBsYXllclN0YXRlQ2hhbmdlZChpdGVtU3RhdHVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFBsYXllckV2ZW50Q2FsbGJhY2sgeworICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXllclN0YXRlQ2hhbmdlZChNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgeyB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9TZXNzaW9uUGxheWxpc3RBZ2VudC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9TZXNzaW9uUGxheWxpc3RBZ2VudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNTcwYWEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25QbGF5bGlzdEFnZW50LmphdmEKQEAgLTAsMCArMSw0OTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5EYXRhU291cmNlRGVzYzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZS5QbGF5ZXJFdmVudENhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5PbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheU1hcDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLkd1YXJkZWRCeTsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkTG9jYWxSYW5kb207CisKK3B1YmxpYyBjbGFzcyBTZXNzaW9uUGxheWxpc3RBZ2VudCBleHRlbmRzIE1lZGlhUGxheWxpc3RBZ2VudCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTZXNzaW9uUGxheWxpc3RBZ2VudCI7CisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgc3RhdGljIGZpbmFsIGludCBFTkRfT0ZfUExBWUxJU1QgPSAtMTsKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBzdGF0aWMgZmluYWwgaW50IE5PX1ZBTElEX0lURU1TID0gLTI7CisKKyAgICBwcml2YXRlIGZpbmFsIFBsYXlJdGVtIG1Fb3BQbGF5SXRlbSA9IG5ldyBQbGF5SXRlbShFTkRfT0ZfUExBWUxJU1QsIG51bGwpOworCisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBtU2Vzc2lvbkltcGw7CisgICAgcHJpdmF0ZSBmaW5hbCBNeVBsYXllckV2ZW50Q2FsbGJhY2sgbVBsYXllckNhbGxiYWNrOworCisgICAgQEd1YXJkZWRCeSgibUxvY2siKQorICAgIHByaXZhdGUgTWVkaWFQbGF5ZXJCYXNlIG1QbGF5ZXI7CisgICAgQEd1YXJkZWRCeSgibUxvY2siKQorICAgIHByaXZhdGUgT25EYXRhU291cmNlTWlzc2luZ0hlbHBlciBtRHNtSGVscGVyOworICAgIC8vIFRPRE86IENoZWNrIGlmIGhhdmluZyB0aGUgc2FtZSBpdGVtIGlzIG9rYXkgKGIvNzQwOTA3NDEpCisgICAgQEd1YXJkZWRCeSgibUxvY2siKQorICAgIHByaXZhdGUgQXJyYXlMaXN0PE1lZGlhSXRlbTI+IG1QbGF5bGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKKyAgICBwcml2YXRlIEFycmF5TGlzdDxNZWRpYUl0ZW0yPiBtU2h1ZmZsZWRMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgQEd1YXJkZWRCeSgibUxvY2siKQorICAgIHByaXZhdGUgTWFwPE1lZGlhSXRlbTIsIERhdGFTb3VyY2VEZXNjPiBtSXRlbURzZE1hcCA9IG5ldyBBcnJheU1hcDw+KCk7CisgICAgQEd1YXJkZWRCeSgibUxvY2siKQorICAgIHByaXZhdGUgTWVkaWFNZXRhZGF0YTIgbU1ldGFkYXRhOworICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKKyAgICBwcml2YXRlIGludCBtUmVwZWF0TW9kZTsKKyAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCisgICAgcHJpdmF0ZSBpbnQgbVNodWZmbGVNb2RlOworICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKKyAgICBwcml2YXRlIFBsYXlJdGVtIG1DdXJyZW50OworCisgICAgLy8gQ2FsbGVkIG9uIHNlc3Npb24gY2FsbGJhY2sgZXhlY3V0b3IuCisgICAgcHJpdmF0ZSBjbGFzcyBNeVBsYXllckV2ZW50Q2FsbGJhY2sgZXh0ZW5kcyBQbGF5ZXJFdmVudENhbGxiYWNrIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQoQE5vbk51bGwgTWVkaWFQbGF5ZXJCYXNlIG1wYiwKKyAgICAgICAgICAgICAgICBATnVsbGFibGUgRGF0YVNvdXJjZURlc2MgZHNkKSB7CisgICAgICAgICAgICBpZiAobVBsYXllciAhPSBtcGIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICAgICAgaWYgKGRzZCA9PSBudWxsICYmIG1DdXJyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChtQ3VycmVudC5zaHVmZmxlZElkeCwgMSk7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUGxheUl0ZW0geworICAgICAgICBpbnQgc2h1ZmZsZWRJZHg7CisgICAgICAgIERhdGFTb3VyY2VEZXNjIGRzZDsKKyAgICAgICAgTWVkaWFJdGVtMiBtZWRpYUl0ZW07CisKKyAgICAgICAgUGxheUl0ZW0oaW50IHNodWZmbGVkSWR4KSB7CisgICAgICAgICAgICB0aGlzKHNodWZmbGVkSWR4LCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIFBsYXlJdGVtKGludCBzaHVmZmxlZElkeCwgRGF0YVNvdXJjZURlc2MgZHNkKSB7CisgICAgICAgICAgICB0aGlzLnNodWZmbGVkSWR4ID0gc2h1ZmZsZWRJZHg7CisgICAgICAgICAgICBpZiAoc2h1ZmZsZWRJZHggPj0gMCkgeworICAgICAgICAgICAgICAgIHRoaXMubWVkaWFJdGVtID0gbVNodWZmbGVkTGlzdC5nZXQoc2h1ZmZsZWRJZHgpOworICAgICAgICAgICAgICAgIGlmIChkc2QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRzZCA9IHJldHJpZXZlRGF0YVNvdXJjZURlc2NMb2NrZWQodGhpcy5tZWRpYUl0ZW0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5kc2QgPSBkc2Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBpc1ZhbGlkKCkgeworICAgICAgICAgICAgaWYgKHRoaXMgPT0gbUVvcFBsYXlJdGVtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWVkaWFJdGVtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZHNkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2h1ZmZsZWRJZHggPj0gbVNodWZmbGVkTGlzdC5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWVkaWFJdGVtICE9IG1TaHVmZmxlZExpc3QuZ2V0KHNodWZmbGVkSWR4KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtZWRpYUl0ZW0uZ2V0RGF0YVNvdXJjZURlc2MoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmICFtZWRpYUl0ZW0uZ2V0RGF0YVNvdXJjZURlc2MoKS5lcXVhbHMoZHNkKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFNlc3Npb25QbGF5bGlzdEFnZW50KEBOb25OdWxsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb25JbXBsLAorICAgICAgICAgICAgQE5vbk51bGwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllcikgeworICAgICAgICBpZiAoc2Vzc2lvbkltcGwgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2Vzc2lvbkltcGwgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGxheWVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBsYXllciBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIG1TZXNzaW9uSW1wbCA9IHNlc3Npb25JbXBsOworICAgICAgICBtUGxheWVyID0gcGxheWVyOworICAgICAgICBtUGxheWVyQ2FsbGJhY2sgPSBuZXcgTXlQbGF5ZXJFdmVudENhbGxiYWNrKCk7CisgICAgICAgIG1QbGF5ZXIucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKG1TZXNzaW9uSW1wbC5nZXRDYWxsYmFja0V4ZWN1dG9yKCksIG1QbGF5ZXJDYWxsYmFjayk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGxheWVyKEBOb25OdWxsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIpIHsKKyAgICAgICAgaWYgKHBsYXllciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwbGF5ZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBpZiAocGxheWVyID09IG1QbGF5ZXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUGxheWVyLnVucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKG1QbGF5ZXJDYWxsYmFjayk7CisgICAgICAgICAgICBtUGxheWVyID0gcGxheWVyOworICAgICAgICAgICAgbVBsYXllci5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2soCisgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSW1wbC5nZXRDYWxsYmFja0V4ZWN1dG9yKCksIG1QbGF5ZXJDYWxsYmFjayk7CisgICAgICAgICAgICB1cGRhdGVQbGF5ZXJEYXRhU291cmNlTG9ja2VkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyKE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIgaGVscGVyKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIG1Ec21IZWxwZXIgPSBoZWxwZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhck9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIG1Ec21IZWxwZXIgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEBOdWxsYWJsZSBMaXN0PE1lZGlhSXRlbTI+IGdldFBsYXlsaXN0KCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChtUGxheWxpc3QpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0UGxheWxpc3QoQE5vbk51bGwgTGlzdDxNZWRpYUl0ZW0yPiBsaXN0LCBATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKKyAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGlzdCBzaG91bGRuJ3QgYmUgbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgbUl0ZW1Ec2RNYXAuY2xlYXIoKTsKKworICAgICAgICAgICAgbVBsYXlsaXN0LmNsZWFyKCk7CisgICAgICAgICAgICBtUGxheWxpc3QuYWRkQWxsKGxpc3QpOworICAgICAgICAgICAgYXBwbHlTaHVmZmxlTW9kZUxvY2tlZCgpOworCisgICAgICAgICAgICBtTWV0YWRhdGEgPSBtZXRhZGF0YTsKKyAgICAgICAgICAgIG1DdXJyZW50ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQoRU5EX09GX1BMQVlMSVNULCAxKTsKKyAgICAgICAgICAgIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKTsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQbGF5bGlzdENoYW5nZWQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIGdldFBsYXlsaXN0TWV0YWRhdGEoKSB7CisgICAgICAgIHJldHVybiBtTWV0YWRhdGE7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdXBkYXRlUGxheWxpc3RNZXRhZGF0YShATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgaWYgKG1ldGFkYXRhID09IG1NZXRhZGF0YSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOworICAgICAgICB9CisgICAgICAgIG5vdGlmeVBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkUGxheWxpc3RJdGVtKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7CisgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBpbmRleCA9IGNsYW1wKGluZGV4LCBtUGxheWxpc3Quc2l6ZSgpKTsKKyAgICAgICAgICAgIGludCBzaHVmZmxlZElkeCA9IGluZGV4OworICAgICAgICAgICAgbVBsYXlsaXN0LmFkZChpbmRleCwgaXRlbSk7CisgICAgICAgICAgICBpZiAobVNodWZmbGVNb2RlID09IE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfTk9ORSkgeworICAgICAgICAgICAgICAgIG1TaHVmZmxlZExpc3QuYWRkKGluZGV4LCBpdGVtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBpdGVtIGluIHJhbmRvbSBwb3NpdGlvbiBvZiBtU2h1ZmZsZWRMaXN0LgorICAgICAgICAgICAgICAgIHNodWZmbGVkSWR4ID0gVGhyZWFkTG9jYWxSYW5kb20uY3VycmVudCgpLm5leHRJbnQobVNodWZmbGVkTGlzdC5zaXplKCkgKyAxKTsKKyAgICAgICAgICAgICAgICBtU2h1ZmZsZWRMaXN0LmFkZChzaHVmZmxlZElkeCwgaXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWhhc1ZhbGlkSXRlbSgpKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChFTkRfT0ZfUExBWUxJU1QsIDEpOworICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UGxheWxpc3RDaGFuZ2VkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtKEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgeworICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgaWYgKCFtUGxheWxpc3QucmVtb3ZlKGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVNodWZmbGVkTGlzdC5yZW1vdmUoaXRlbSk7CisgICAgICAgICAgICBtSXRlbURzZE1hcC5yZW1vdmUoaXRlbSk7CisgICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKKyAgICAgICAgfQorICAgICAgICBub3RpZnlQbGF5bGlzdENoYW5nZWQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXBsYWNlUGxheWxpc3RJdGVtKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7CisgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBpZiAobVBsYXlsaXN0LnNpemUoKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZXggPSBjbGFtcChpbmRleCwgbVBsYXlsaXN0LnNpemUoKSAtIDEpOworICAgICAgICAgICAgaW50IHNodWZmbGVkSWR4ID0gbVNodWZmbGVkTGlzdC5pbmRleE9mKG1QbGF5bGlzdC5nZXQoaW5kZXgpKTsKKyAgICAgICAgICAgIG1JdGVtRHNkTWFwLnJlbW92ZShtU2h1ZmZsZWRMaXN0LmdldChzaHVmZmxlZElkeCkpOworICAgICAgICAgICAgbVNodWZmbGVkTGlzdC5zZXQoc2h1ZmZsZWRJZHgsIGl0ZW0pOworICAgICAgICAgICAgbVBsYXlsaXN0LnNldChpbmRleCwgaXRlbSk7CisgICAgICAgICAgICBpZiAoIWhhc1ZhbGlkSXRlbSgpKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChFTkRfT0ZfUExBWUxJU1QsIDEpOworICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5UGxheWxpc3RDaGFuZ2VkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2tpcFRvUGxheWxpc3RJdGVtKEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgeworICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgaWYgKCFoYXNWYWxpZEl0ZW0oKSB8fCBpdGVtLmVxdWFscyhtQ3VycmVudC5tZWRpYUl0ZW0pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHNodWZmbGVkSWR4ID0gbVNodWZmbGVkTGlzdC5pbmRleE9mKGl0ZW0pOworICAgICAgICAgICAgaWYgKHNodWZmbGVkSWR4IDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DdXJyZW50ID0gbmV3IFBsYXlJdGVtKHNodWZmbGVkSWR4KTsKKyAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2tpcFRvUHJldmlvdXNJdGVtKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBpZiAoIWhhc1ZhbGlkSXRlbSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUGxheUl0ZW0gcHJldiA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKG1DdXJyZW50LnNodWZmbGVkSWR4LCAtMSk7CisgICAgICAgICAgICBpZiAocHJldiAhPSBtRW9wUGxheUl0ZW0pIHsKKyAgICAgICAgICAgICAgICBtQ3VycmVudCA9IHByZXY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKKyAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2tpcFRvTmV4dEl0ZW0oKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGlmICghaGFzVmFsaWRJdGVtKCkgfHwgbUN1cnJlbnQgPT0gbUVvcFBsYXlJdGVtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUGxheUl0ZW0gbmV4dCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKG1DdXJyZW50LnNodWZmbGVkSWR4LCAxKTsKKyAgICAgICAgICAgIGlmIChuZXh0ICE9IG1Fb3BQbGF5SXRlbSkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50ID0gbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRSZXBlYXRNb2RlKCkgeworICAgICAgICByZXR1cm4gbVJlcGVhdE1vZGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0UmVwZWF0TW9kZShpbnQgcmVwZWF0TW9kZSkgeworICAgICAgICBpZiAocmVwZWF0TW9kZSA8IE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FCisgICAgICAgICAgICAgICAgfHwgcmVwZWF0TW9kZSA+IE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9HUk9VUCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGlmIChtUmVwZWF0TW9kZSA9PSByZXBlYXRNb2RlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVJlcGVhdE1vZGUgPSByZXBlYXRNb2RlOworICAgICAgICAgICAgc3dpdGNoIChyZXBlYXRNb2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfT05FOgorICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnQgIT0gbnVsbCAmJiBtQ3VycmVudCAhPSBtRW9wUGxheUl0ZW0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5ZXIubG9vcEN1cnJlbnQodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfQUxMOgorICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0dST1VQOgorICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnQgPT0gbUVvcFBsYXlJdGVtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKEVORF9PRl9QTEFZTElTVCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5ZXJEYXRhU291cmNlTG9ja2VkKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gcGFzcyB0aHJvdWdoCisgICAgICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORToKKyAgICAgICAgICAgICAgICAgICAgbVBsYXllci5sb29wQ3VycmVudChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG5vdGlmeVJlcGVhdE1vZGVDaGFuZ2VkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRTaHVmZmxlTW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1TaHVmZmxlTW9kZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTaHVmZmxlTW9kZShpbnQgc2h1ZmZsZU1vZGUpIHsKKyAgICAgICAgaWYgKHNodWZmbGVNb2RlIDwgTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FCisgICAgICAgICAgICAgICAgfHwgc2h1ZmZsZU1vZGUgPiBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0dST1VQKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgaWYgKG1TaHVmZmxlTW9kZSA9PSBzaHVmZmxlTW9kZSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TaHVmZmxlTW9kZSA9IHNodWZmbGVNb2RlOworICAgICAgICAgICAgYXBwbHlTaHVmZmxlTW9kZUxvY2tlZCgpOworICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7CisgICAgICAgIH0KKyAgICAgICAgbm90aWZ5U2h1ZmZsZU1vZGVDaGFuZ2VkKCk7CisgICAgfQorCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgaW50IGdldEN1clNodWZmbGVkSW5kZXgoKSB7CisgICAgICAgIHJldHVybiBoYXNWYWxpZEl0ZW0oKSA/IG1DdXJyZW50LnNodWZmbGVkSWR4IDogTk9fVkFMSURfSVRFTVM7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc1ZhbGlkSXRlbSgpIHsKKyAgICAgICAgcmV0dXJuIG1DdXJyZW50ICE9IG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBEYXRhU291cmNlRGVzYyByZXRyaWV2ZURhdGFTb3VyY2VEZXNjTG9ja2VkKE1lZGlhSXRlbTIgaXRlbSkgeworICAgICAgICBEYXRhU291cmNlRGVzYyBkc2QgPSBpdGVtLmdldERhdGFTb3VyY2VEZXNjKCk7CisgICAgICAgIGlmIChkc2QgIT0gbnVsbCkgeworICAgICAgICAgICAgbUl0ZW1Ec2RNYXAucHV0KGl0ZW0sIGRzZCk7CisgICAgICAgICAgICByZXR1cm4gZHNkOworICAgICAgICB9CisgICAgICAgIGRzZCA9IG1JdGVtRHNkTWFwLmdldChpdGVtKTsKKyAgICAgICAgaWYgKGRzZCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZHNkOworICAgICAgICB9CisgICAgICAgIE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIgaGVscGVyID0gbURzbUhlbHBlcjsKKyAgICAgICAgaWYgKGhlbHBlciAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBEbyBub3QgY2FsbCBvbkRhdGFTb3VyY2VNaXNzaW5nIHdpdGggdGhlIGxvY2sgKGIvNzQwOTA3NDEpLgorICAgICAgICAgICAgZHNkID0gaGVscGVyLm9uRGF0YVNvdXJjZU1pc3NpbmcobVNlc3Npb25JbXBsLmdldEluc3RhbmNlKCksIGl0ZW0pOworICAgICAgICAgICAgaWYgKGRzZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUl0ZW1Ec2RNYXAucHV0KGl0ZW0sIGRzZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRzZDsKKyAgICB9CisKKyAgICAvLyBUT0RPOiBjb25zaWRlciB0byBjYWxsIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCBpbnNpZGUgKGIvNzQwOTA3NDEpCisgICAgcHJpdmF0ZSBQbGF5SXRlbSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChpbnQgY3VyU2h1ZmZsZWRJZHgsIGludCBkaXJlY3Rpb24pIHsKKyAgICAgICAgaW50IHNpemUgPSBtUGxheWxpc3Quc2l6ZSgpOworICAgICAgICBpZiAoY3VyU2h1ZmZsZWRJZHggPT0gRU5EX09GX1BMQVlMSVNUKSB7CisgICAgICAgICAgICBjdXJTaHVmZmxlZElkeCA9IChkaXJlY3Rpb24gPiAwKSA/IC0xIDogc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgY3VyU2h1ZmZsZWRJZHggKz0gZGlyZWN0aW9uOworICAgICAgICAgICAgaWYgKGN1clNodWZmbGVkSWR4IDwgMCB8fCBjdXJTaHVmZmxlZElkeCA+PSBtUGxheWxpc3Quc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1SZXBlYXRNb2RlID09IFJFUEVBVF9NT0RFX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpID09IHNpemUgLSAxKSA/IG51bGwgOiBtRW9wUGxheUl0ZW07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY3VyU2h1ZmZsZWRJZHggPSBjdXJTaHVmZmxlZElkeCA8IDAgPyBtUGxheWxpc3Quc2l6ZSgpIC0gMSA6IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgRGF0YVNvdXJjZURlc2MgZHNkID0gcmV0cmlldmVEYXRhU291cmNlRGVzY0xvY2tlZChtU2h1ZmZsZWRMaXN0LmdldChjdXJTaHVmZmxlZElkeCkpOworICAgICAgICAgICAgaWYgKGRzZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQbGF5SXRlbShjdXJTaHVmZmxlZElkeCwgZHNkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCkgeworICAgICAgICBpZiAoIWhhc1ZhbGlkSXRlbSgpIHx8IG1DdXJyZW50LmlzVmFsaWQoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGludCBzaHVmZmxlZElkeCA9IG1TaHVmZmxlZExpc3QuaW5kZXhPZihtQ3VycmVudC5tZWRpYUl0ZW0pOworICAgICAgICBpZiAoc2h1ZmZsZWRJZHggPj0gMCkgeworICAgICAgICAgICAgLy8gQWRkZWQgYW4gaXRlbS4KKyAgICAgICAgICAgIG1DdXJyZW50LnNodWZmbGVkSWR4ID0gc2h1ZmZsZWRJZHg7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobUN1cnJlbnQuc2h1ZmZsZWRJZHggPj0gbVNodWZmbGVkTGlzdC5zaXplKCkpIHsKKyAgICAgICAgICAgIG1DdXJyZW50ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQobVNodWZmbGVkTGlzdC5zaXplKCkgLSAxLCAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1DdXJyZW50Lm1lZGlhSXRlbSA9IG1TaHVmZmxlZExpc3QuZ2V0KG1DdXJyZW50LnNodWZmbGVkSWR4KTsKKyAgICAgICAgICAgIGlmIChyZXRyaWV2ZURhdGFTb3VyY2VEZXNjTG9ja2VkKG1DdXJyZW50Lm1lZGlhSXRlbSkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQobUN1cnJlbnQuc2h1ZmZsZWRJZHgsIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQbGF5ZXJEYXRhU291cmNlTG9ja2VkKCkgeworICAgICAgICBpZiAobUN1cnJlbnQgPT0gbnVsbCB8fCBtQ3VycmVudCA9PSBtRW9wUGxheUl0ZW0pIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAobVBsYXllci5nZXRDdXJyZW50RGF0YVNvdXJjZSgpICE9IG1DdXJyZW50LmRzZCkgeworICAgICAgICAgICAgbVBsYXllci5zZXREYXRhU291cmNlKG1DdXJyZW50LmRzZCk7CisgICAgICAgICAgICBtUGxheWVyLmxvb3BDdXJyZW50KG1SZXBlYXRNb2RlID09IE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9PTkUpOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IENhbGwgc2V0TmV4dERhdGFTb3VyY2UgKGIvNzQwOTA3NDEpCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFwcGx5U2h1ZmZsZU1vZGVMb2NrZWQoKSB7CisgICAgICAgIG1TaHVmZmxlZExpc3QuY2xlYXIoKTsKKyAgICAgICAgbVNodWZmbGVkTGlzdC5hZGRBbGwobVBsYXlsaXN0KTsKKyAgICAgICAgaWYgKG1TaHVmZmxlTW9kZSA9PSBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0FMTAorICAgICAgICAgICAgICAgIHx8IG1TaHVmZmxlTW9kZSA9PSBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0dST1VQKSB7CisgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaHVmZmxlKG1TaHVmZmxlZExpc3QpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2xhbXBzIHZhbHVlIHRvIFswLCBzaXplXQorICAgIHByaXZhdGUgc3RhdGljIGludCBjbGFtcChpbnQgdmFsdWUsIGludCBzaXplKSB7CisgICAgICAgIGlmICh2YWx1ZSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiAodmFsdWUgPiBzaXplKSA/IHNpemUgOiB2YWx1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25Ub2tlbjJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25Ub2tlbjJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVjZjhjNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblRva2VuMkltcGwuamF2YQpAQCAtMCwwICsxLDI2MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OX1NFUlZJQ0U7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5UWVBFX0xJQlJBUllfU0VSVklDRTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yLlRva2VuVHlwZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5TZXNzaW9uVG9rZW4yUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIFNlc3Npb25Ub2tlbjJJbXBsIGltcGxlbWVudHMgU2Vzc2lvblRva2VuMlByb3ZpZGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1VJRCA9ICJhbmRyb2lkLm1lZGlhLnRva2VuLnVpZCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9UWVBFID0gImFuZHJvaWQubWVkaWEudG9rZW4udHlwZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QQUNLQUdFX05BTUUgPSAiYW5kcm9pZC5tZWRpYS50b2tlbi5wYWNrYWdlX25hbWUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VSVklDRV9OQU1FID0gImFuZHJvaWQubWVkaWEudG9rZW4uc2VydmljZV9uYW1lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0lEID0gImFuZHJvaWQubWVkaWEudG9rZW4uaWQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VTU0lPTl9CSU5ERVIgPSAiYW5kcm9pZC5tZWRpYS50b2tlbi5zZXNzaW9uX2JpbmRlciI7CisKKyAgICBwcml2YXRlIGZpbmFsIFNlc3Npb25Ub2tlbjIgbUluc3RhbmNlOworICAgIHByaXZhdGUgZmluYWwgaW50IG1VaWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBAVG9rZW5UeXBlIGludCBtVHlwZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUGFja2FnZU5hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVNlcnZpY2VOYW1lOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1JZDsKKyAgICBwcml2YXRlIGZpbmFsIElNZWRpYVNlc3Npb24yIG1TZXNzaW9uQmluZGVyOworCisgICAgLyoqCisgICAgICogUHVibGljIGNvbnN0cnVjdG9yIGZvciB0aGUgbGVnYWN5IHN1cHBvcnQgKGkuZS4gYnJvd3NlciBjYW4gdHJ5IGNvbm5lY3RpbmcgdG8gYW55IGJyb3dzZXIKKyAgICAgKiBzZXJ2aWNlIGlmIGl0IGtub3dzIHRoZSBzZXJ2aWNlIG5hbWUpCisgICAgICovCisgICAgcHVibGljIFNlc3Npb25Ub2tlbjJJbXBsKENvbnRleHQgY29udGV4dCwgU2Vzc2lvblRva2VuMiBpbnN0YW5jZSwKKyAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHNlcnZpY2VOYW1lLCBpbnQgdWlkKSB7CisgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShwYWNrYWdlTmFtZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhY2thZ2VOYW1lIHNob3VsZG4ndCBiZSBlbXB0eSIpOworICAgICAgICB9CisgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzZXJ2aWNlTmFtZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlcnZpY2VOYW1lIHNob3VsZG4ndCBiZSBlbXB0eSIpOworICAgICAgICB9CisgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOworICAgICAgICAvLyBDYWxjdWxhdGUgdWlkIGlmIGl0J3Mgbm90IHNwZWNpZmllZC4KKyAgICAgICAgZmluYWwgUGFja2FnZU1hbmFnZXIgbWFuYWdlciA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgaWYgKHVpZCA8IDApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdWlkID0gbWFuYWdlci5nZXRQYWNrYWdlVWlkKHBhY2thZ2VOYW1lLCAwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgcGFja2FnZSAiICsgcGFja2FnZU5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1VaWQgPSB1aWQ7CisKKyAgICAgICAgLy8gSW5mZXIgaWQgYW5kIHR5cGUgZnJvbSBwYWNrYWdlIG5hbWUgYW5kIHNlcnZpY2UgbmFtZQorICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBtdWx0aS11c2VyLgorICAgICAgICBTdHJpbmcgaWQgPSBnZXRTZXNzaW9uSWRGcm9tU2VydmljZShtYW5hZ2VyLCBNZWRpYUxpYnJhcnlTZXJ2aWNlMi5TRVJWSUNFX0lOVEVSRkFDRSwKKyAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwgc2VydmljZU5hbWUpOworICAgICAgICBpZiAoaWQgIT0gbnVsbCkgeworICAgICAgICAgICAgbUlkID0gaWQ7CisgICAgICAgICAgICBtVHlwZSA9IFRZUEVfTElCUkFSWV9TRVJWSUNFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gcmV0cnkgd2l0aCBzZXNzaW9uIHNlcnZpY2UKKyAgICAgICAgICAgIG1JZCA9IGdldFNlc3Npb25JZEZyb21TZXJ2aWNlKG1hbmFnZXIsIE1lZGlhU2Vzc2lvblNlcnZpY2UyLlNFUlZJQ0VfSU5URVJGQUNFLAorICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwgc2VydmljZU5hbWUpOworICAgICAgICAgICAgbVR5cGUgPSBUWVBFX1NFU1NJT05fU0VSVklDRTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUlkID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlcnZpY2UgIiArIHNlcnZpY2VOYW1lICsgIiBkb2Vzbid0IGltcGxlbWVudCIKKyAgICAgICAgICAgICAgICAgICAgKyAiIHNlc3Npb24gc2VydmljZSBub3IgbGlicmFyeSBzZXJ2aWNlLiBVc2Ugc2VydmljZSdzIGZ1bGwgbmFtZS4iKTsKKyAgICAgICAgfQorICAgICAgICBtUGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKKyAgICAgICAgbVNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7CisgICAgICAgIG1TZXNzaW9uQmluZGVyID0gbnVsbDsKKyAgICB9CisKKyAgICBTZXNzaW9uVG9rZW4ySW1wbChpbnQgdWlkLCBpbnQgdHlwZSwgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBpZCwKKyAgICAgICAgICAgIElNZWRpYVNlc3Npb24yIHNlc3Npb25CaW5kZXIpIHsKKyAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBBZGQgc2FuaXR5IGNoZWNrIChiLzczODYzODY1KQorICAgICAgICBtVWlkID0gdWlkOworICAgICAgICBtVHlwZSA9IHR5cGU7CisgICAgICAgIG1QYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOworICAgICAgICBtU2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKKyAgICAgICAgbUlkID0gaWQ7CisgICAgICAgIG1TZXNzaW9uQmluZGVyID0gc2Vzc2lvbkJpbmRlcjsKKyAgICAgICAgbUluc3RhbmNlID0gbmV3IFNlc3Npb25Ub2tlbjIodGhpcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFNlc3Npb25JZEZyb21TZXJ2aWNlKFBhY2thZ2VNYW5hZ2VyIG1hbmFnZXIsIFN0cmluZyBzZXJ2aWNlSW50ZXJmYWNlLAorICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgc2VydmljZU5hbWUpIHsKKyAgICAgICAgSW50ZW50IHNlcnZpY2VJbnRlbnQgPSBuZXcgSW50ZW50KHNlcnZpY2VJbnRlcmZhY2UpOworICAgICAgICBzZXJ2aWNlSW50ZW50LnNldFBhY2thZ2UocGFja2FnZU5hbWUpOworICAgICAgICAvLyBVc2UgcXVlcnlJbnRlbnRTZXJ2aWNlcyB0byBmaW5kIHNlcnZpY2VzIHdpdGggTWVkaWFMaWJyYXJ5U2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UuCisgICAgICAgIC8vIFdlIGNhbm5vdCB1c2UgcmVzb2x2ZVNlcnZpY2Ugd2l0aCBpbnRlbnQgc3BlY2lmaWVkIGNsYXNzIG5hbWUsIGJlY2F1c2UgcmVzb2x2ZVNlcnZpY2UKKyAgICAgICAgLy8gaWdub3JlcyBhY3Rpb25zIGlmIEludGVudC5zZXRDbGFzc05hbWUoKSBpcyBzcGVjaWZpZWQuCisgICAgICAgIExpc3Q8UmVzb2x2ZUluZm8+IGxpc3QgPSBtYW5hZ2VyLnF1ZXJ5SW50ZW50U2VydmljZXMoCisgICAgICAgICAgICAgICAgc2VydmljZUludGVudCwgUGFja2FnZU1hbmFnZXIuR0VUX01FVEFfREFUQSk7CisgICAgICAgIGlmIChsaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIFJlc29sdmVJbmZvIHJlc29sdmVJbmZvID0gbGlzdC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVJbmZvID09IG51bGwgfHwgcmVzb2x2ZUluZm8uc2VydmljZUluZm8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5lcXVhbHMocmVzb2x2ZUluZm8uc2VydmljZUluZm8ubmFtZSwgc2VydmljZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRTZXNzaW9uSWQocmVzb2x2ZUluZm8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXNzaW9uSWQoUmVzb2x2ZUluZm8gcmVzb2x2ZUluZm8pIHsKKyAgICAgICAgaWYgKHJlc29sdmVJbmZvID09IG51bGwgfHwgcmVzb2x2ZUluZm8uc2VydmljZUluZm8gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSBpZiAocmVzb2x2ZUluZm8uc2VydmljZUluZm8ubWV0YURhdGEgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvLm1ldGFEYXRhLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFTZXNzaW9uU2VydmljZTIuU0VSVklDRV9NRVRBX0RBVEEsICIiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4yIGdldEluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gbUluc3RhbmNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWVfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIG1QYWNrYWdlTmFtZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFVpZF9pbXBsKCkgeworICAgICAgICByZXR1cm4gbVVpZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldElkX2ltcCgpIHsKKyAgICAgICAgcmV0dXJuIG1JZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFR5cGVfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIG1UeXBlOworICAgIH0KKworICAgIFN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1TZXJ2aWNlTmFtZTsKKyAgICB9CisKKyAgICBJTWVkaWFTZXNzaW9uMiBnZXRTZXNzaW9uQmluZGVyKCkgeworICAgICAgICByZXR1cm4gbVNlc3Npb25CaW5kZXI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTZXNzaW9uVG9rZW4yIGZyb21CdW5kbGVfaW1wbChCdW5kbGUgYnVuZGxlKSB7CisgICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgaW50IHVpZCA9IGJ1bmRsZS5nZXRJbnQoS0VZX1VJRCk7CisgICAgICAgIGZpbmFsIEBUb2tlblR5cGUgaW50IHR5cGUgPSBidW5kbGUuZ2V0SW50KEtFWV9UWVBFLCAtMSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBwYWNrYWdlTmFtZSA9IGJ1bmRsZS5nZXRTdHJpbmcoS0VZX1BBQ0tBR0VfTkFNRSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBzZXJ2aWNlTmFtZSA9IGJ1bmRsZS5nZXRTdHJpbmcoS0VZX1NFUlZJQ0VfTkFNRSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IGJ1bmRsZS5nZXRTdHJpbmcoS0VZX0lEKTsKKyAgICAgICAgZmluYWwgSUJpbmRlciBzZXNzaW9uQmluZGVyID0gYnVuZGxlLmdldEJpbmRlcihLRVlfU0VTU0lPTl9CSU5ERVIpOworCisgICAgICAgIC8vIFNhbml0eSBjaGVjay4KKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIFRZUEVfU0VTU0lPTjoKKyAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbkJpbmRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc2Vzc2lvbkJpbmRlciBmb3Igc2Vzc2lvbiwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJpbmRlcj0iICsgc2Vzc2lvbkJpbmRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUWVBFX1NFU1NJT05fU0VSVklDRToKKyAgICAgICAgICAgIGNhc2UgVFlQRV9MSUJSQVJZX1NFUlZJQ0U6CisgICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHNlcnZpY2VOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTZXNzaW9uIHNlcnZpY2UgbmVlZHMgc2VydmljZSBuYW1lIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHR5cGUiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocGFja2FnZU5hbWUpIHx8IGlkID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhY2thZ2UgbmFtZSBub3IgSUQgY2Fubm90IGJlIG51bGwuIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uVG9rZW4ySW1wbCh1aWQsIHR5cGUsIHBhY2thZ2VOYW1lLCBzZXJ2aWNlTmFtZSwgaWQsCisgICAgICAgICAgICAgICAgc2Vzc2lvbkJpbmRlciAhPSBudWxsID8gSU1lZGlhU2Vzc2lvbjIuU3R1Yi5hc0ludGVyZmFjZShzZXNzaW9uQmluZGVyKSA6IG51bGwpCisgICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ1bmRsZSB0b0J1bmRsZV9pbXBsKCkgeworICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICBidW5kbGUucHV0SW50KEtFWV9VSUQsIG1VaWQpOworICAgICAgICBidW5kbGUucHV0U3RyaW5nKEtFWV9QQUNLQUdFX05BTUUsIG1QYWNrYWdlTmFtZSk7CisgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX1NFUlZJQ0VfTkFNRSwgbVNlcnZpY2VOYW1lKTsKKyAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhLRVlfSUQsIG1JZCk7CisgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX1RZUEUsIG1UeXBlKTsKKyAgICAgICAgYnVuZGxlLnB1dEJpbmRlcihLRVlfU0VTU0lPTl9CSU5ERVIsCisgICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIgIT0gbnVsbCA/IG1TZXNzaW9uQmluZGVyLmFzQmluZGVyKCkgOiBudWxsKTsKKyAgICAgICAgcmV0dXJuIGJ1bmRsZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlX2ltcGwoKSB7CisgICAgICAgIGZpbmFsIGludCBwcmltZSA9IDMxOworICAgICAgICByZXR1cm4gbVR5cGUKKyAgICAgICAgICAgICAgICArIHByaW1lICogKG1VaWQKKyAgICAgICAgICAgICAgICArIHByaW1lICogKG1QYWNrYWdlTmFtZS5oYXNoQ29kZSgpCisgICAgICAgICAgICAgICAgKyBwcmltZSAqIChtSWQuaGFzaENvZGUoKQorICAgICAgICAgICAgICAgICsgcHJpbWUgKiAobVNlcnZpY2VOYW1lICE9IG51bGwgPyBtU2VydmljZU5hbWUuaGFzaENvZGUoKSA6IDApKSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFsc19pbXBsKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgU2Vzc2lvblRva2VuMikpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBTZXNzaW9uVG9rZW4ySW1wbCBvdGhlciA9IGZyb20oKFNlc3Npb25Ub2tlbjIpIG9iaik7CisgICAgICAgIHJldHVybiBtVWlkID09IG90aGVyLm1VaWQKKyAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuZXF1YWxzKG1QYWNrYWdlTmFtZSwgb3RoZXIubVBhY2thZ2VOYW1lKQorICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5lcXVhbHMobVNlcnZpY2VOYW1lLCBvdGhlci5tU2VydmljZU5hbWUpCisgICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmVxdWFscyhtSWQsIG90aGVyLm1JZCkKKyAgICAgICAgICAgICAgICAmJiBtVHlwZSA9PSBvdGhlci5tVHlwZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nX2ltcGwoKSB7CisgICAgICAgIHJldHVybiAiU2Vzc2lvblRva2VuIHtwa2c9IiArIG1QYWNrYWdlTmFtZSArICIgaWQ9IiArIG1JZCArICIgdHlwZT0iICsgbVR5cGUKKyAgICAgICAgICAgICAgICArICIgc2VydmljZT0iICsgbVNlcnZpY2VOYW1lICsgIiBiaW5kZXI9IiArIG1TZXNzaW9uQmluZGVyICsgIn0iOworICAgIH0KKworICAgIHN0YXRpYyBTZXNzaW9uVG9rZW4ySW1wbCBmcm9tKFNlc3Npb25Ub2tlbjIgdG9rZW4pIHsKKyAgICAgICAgcmV0dXJuICgoU2Vzc2lvblRva2VuMkltcGwpIHRva2VuLmdldFByb3ZpZGVyKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvVm9sdW1lUHJvdmlkZXIySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9Wb2x1bWVQcm92aWRlcjJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYyMmUxYgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvVm9sdW1lUHJvdmlkZXIySW1wbC5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIyLlZPTFVNRV9DT05UUk9MX0FCU09MVVRFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMi5WT0xVTUVfQ09OVFJPTF9GSVhFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjIuVk9MVU1FX0NPTlRST0xfUkVMQVRJVkU7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5Wb2x1bWVQcm92aWRlcjJQcm92aWRlcjsKKworcHVibGljIGNsYXNzIFZvbHVtZVByb3ZpZGVyMkltcGwgaW1wbGVtZW50cyBWb2x1bWVQcm92aWRlcjJQcm92aWRlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBWb2x1bWVQcm92aWRlcjIgbUluc3RhbmNlOworICAgIHByaXZhdGUgZmluYWwgaW50IG1Db250cm9sVHlwZTsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtTWF4Vm9sdW1lOworCisgICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRWb2x1bWU7CisgICAgcHJpdmF0ZSBDYWxsYmFjayBtQ2FsbGJhY2s7CisKKyAgICBwdWJsaWMgVm9sdW1lUHJvdmlkZXIySW1wbChWb2x1bWVQcm92aWRlcjIgaW5zdGFuY2UsCisgICAgICAgICAgICBAVm9sdW1lUHJvdmlkZXIyLkNvbnRyb2xUeXBlIGludCBjb250cm9sVHlwZSwgaW50IG1heFZvbHVtZSwgaW50IGN1cnJlbnRWb2x1bWUpIHsKKyAgICAgICAgaWYgKGNvbnRyb2xUeXBlICE9IFZPTFVNRV9DT05UUk9MX0ZJWEVEICYmIGNvbnRyb2xUeXBlICE9IFZPTFVNRV9DT05UUk9MX1JFTEFUSVZFCisgICAgICAgICAgICAgICAgJiYgY29udHJvbFR5cGUgIT0gVk9MVU1FX0NPTlRST0xfQUJTT0xVVEUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIndyb25nIGNvbnRyb2xUeXBlICIgKyBjb250cm9sVHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1heFZvbHVtZSA8IDAgfHwgY3VycmVudFZvbHVtZSA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInZvbHVtZSBzaG91bGRuJ3QgYmUgbmVnYXRpdmUiCisgICAgICAgICAgICAgICAgICAgICsgIiwgbWF4Vm9sdW1lPSIgKyBtYXhWb2x1bWUgKyAiLCBjdXJyZW50Vm9sdW1lPSIgKyBjdXJyZW50Vm9sdW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY3VycmVudFZvbHVtZSA+IG1heFZvbHVtZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY3VycmVudFZvbHVtZSBzaG91bGRuJ3QgYmUgZ3JlYXRlciB0aGFuIG1heFZvbHVtZSIKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBtYXhWb2x1bWU9IiArIG1heFZvbHVtZSArICIsIGN1cnJlbnRWb2x1bWU9IiArIGN1cnJlbnRWb2x1bWUpOworICAgICAgICB9CisgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOworICAgICAgICBtQ29udHJvbFR5cGUgPSBjb250cm9sVHlwZTsKKyAgICAgICAgbU1heFZvbHVtZSA9IG1heFZvbHVtZTsKKyAgICAgICAgbUN1cnJlbnRWb2x1bWUgPSBjdXJyZW50Vm9sdW1lOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0Q29udHJvbFR5cGVfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db250cm9sVHlwZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldE1heFZvbHVtZV9pbXBsKCkgeworICAgICAgICByZXR1cm4gbU1heFZvbHVtZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldEN1cnJlbnRWb2x1bWVfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIG1DdXJyZW50Vm9sdW1lOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRWb2x1bWVfaW1wbChpbnQgY3VycmVudFZvbHVtZSkgeworICAgICAgICBpZiAoY3VycmVudFZvbHVtZSA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImN1cnJlbnRWb2x1bWUgc2hvdWxkbid0IGJlIG5lZ2F0aXZlIgorICAgICAgICAgICAgICAgICAgICArICIsIGN1cnJlbnRWb2x1bWU9IiArIGN1cnJlbnRWb2x1bWUpOworICAgICAgICB9CisgICAgICAgIG1DdXJyZW50Vm9sdW1lID0gY3VycmVudFZvbHVtZTsKKyAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2sub25Wb2x1bWVDaGFuZ2VkKG1JbnN0YW5jZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgY2FsbGJhY2sgdG8gcmVjZWl2ZSB2b2x1bWUgY2hhbmdlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYWxsYmFjayhDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMaXN0ZW5zIGZvciBjaGFuZ2VzIHRvIHRoZSB2b2x1bWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDYWxsYmFjayB7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uVm9sdW1lQ2hhbmdlZChWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvQ2xvc2VkQ2FwdGlvblJlbmRlcmVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL0Nsb3NlZENhcHRpb25SZW5kZXJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmN2VlYzkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL0Nsb3NlZENhcHRpb25SZW5kZXJlci5qYXZhCkBAIC0wLDAgKzEsMTUwMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5UeXBlZmFjZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OworaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0J1aWxkZXI7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRQYWludDsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQ2hhcmFjdGVyU3R5bGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlN0eWxlU3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuVW5kZXJsaW5lU3BhbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuVXBkYXRlQXBwZWFyYW5jZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5DYXB0aW9uaW5nTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5DYXB0aW9uaW5nTWFuYWdlci5DYXB0aW9uU3R5bGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQ2FwdGlvbmluZ01hbmFnZXIuQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvLyBOb3RlOiBUaGlzIGlzIGZvcmtlZCBmcm9tIGFuZHJvaWQubWVkaWEuQ2xvc2VkQ2FwdGlvblJlbmRlcmVyIHNpbmNlIFAKK3B1YmxpYyBjbGFzcyBDbG9zZWRDYXB0aW9uUmVuZGVyZXIgZXh0ZW5kcyBTdWJ0aXRsZUNvbnRyb2xsZXIuUmVuZGVyZXIgeworICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIENlYTYwOENDV2lkZ2V0IG1DQ1dpZGdldDsKKworICAgIHB1YmxpYyBDbG9zZWRDYXB0aW9uUmVuZGVyZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhNZWRpYUZvcm1hdCBmb3JtYXQpIHsKKyAgICAgICAgaWYgKGZvcm1hdC5jb250YWluc0tleShNZWRpYUZvcm1hdC5LRVlfTUlNRSkpIHsKKyAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IGZvcm1hdC5nZXRTdHJpbmcoTWVkaWFGb3JtYXQuS0VZX01JTUUpOworICAgICAgICAgICAgcmV0dXJuIE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1RFWFRfQ0VBXzYwOC5lcXVhbHMobWltZVR5cGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3VidGl0bGVUcmFjayBjcmVhdGVUcmFjayhNZWRpYUZvcm1hdCBmb3JtYXQpIHsKKyAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gZm9ybWF0LmdldFN0cmluZyhNZWRpYUZvcm1hdC5LRVlfTUlNRSk7CisgICAgICAgIGlmIChNZWRpYUZvcm1hdC5NSU1FVFlQRV9URVhUX0NFQV82MDguZXF1YWxzKG1pbWVUeXBlKSkgeworICAgICAgICAgICAgaWYgKG1DQ1dpZGdldCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNDV2lkZ2V0ID0gbmV3IENlYTYwOENDV2lkZ2V0KG1Db250ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2VhNjA4Q2FwdGlvblRyYWNrKG1DQ1dpZGdldCwgZm9ybWF0KTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm8gbWF0Y2hpbmcgZm9ybWF0OiAiICsgZm9ybWF0LnRvU3RyaW5nKCkpOworICAgIH0KK30KKworY2xhc3MgQ2VhNjA4Q2FwdGlvblRyYWNrIGV4dGVuZHMgU3VidGl0bGVUcmFjayB7CisgICAgcHJpdmF0ZSBmaW5hbCBDZWE2MDhDQ1BhcnNlciBtQ0NQYXJzZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBDZWE2MDhDQ1dpZGdldCBtUmVuZGVyaW5nV2lkZ2V0OworCisgICAgQ2VhNjA4Q2FwdGlvblRyYWNrKENlYTYwOENDV2lkZ2V0IHJlbmRlcmluZ1dpZGdldCwgTWVkaWFGb3JtYXQgZm9ybWF0KSB7CisgICAgICAgIHN1cGVyKGZvcm1hdCk7CisKKyAgICAgICAgbVJlbmRlcmluZ1dpZGdldCA9IHJlbmRlcmluZ1dpZGdldDsKKyAgICAgICAgbUNDUGFyc2VyID0gbmV3IENlYTYwOENDUGFyc2VyKG1SZW5kZXJpbmdXaWRnZXQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGF0YShieXRlW10gZGF0YSwgYm9vbGVhbiBlb3MsIGxvbmcgcnVuSUQpIHsKKyAgICAgICAgbUNDUGFyc2VyLnBhcnNlKGRhdGEpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZW5kZXJpbmdXaWRnZXQgZ2V0UmVuZGVyaW5nV2lkZ2V0KCkgeworICAgICAgICByZXR1cm4gbVJlbmRlcmluZ1dpZGdldDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVWaWV3KFZlY3RvcjxDdWU+IGFjdGl2ZUN1ZXMpIHsKKyAgICAgICAgLy8gT3ZlcnJpZGluZyB3aXRoIE5PLU9QLCBDQyByZW5kZXJpbmcgYnktcGFzc2VzIHRoaXMKKyAgICB9Cit9CisKKy8qKgorICogQWJzdHJhY3Qgd2lkZ2V0IGNsYXNzIHRvIHJlbmRlciBhIGNsb3NlZCBjYXB0aW9uIHRyYWNrLgorICovCithYnN0cmFjdCBjbGFzcyBDbG9zZWRDYXB0aW9uV2lkZ2V0IGV4dGVuZHMgVmlld0dyb3VwIGltcGxlbWVudHMgU3VidGl0bGVUcmFjay5SZW5kZXJpbmdXaWRnZXQgeworCisgICAgaW50ZXJmYWNlIENsb3NlZENhcHRpb25MYXlvdXQgeworICAgICAgICB2b2lkIHNldENhcHRpb25TdHlsZShDYXB0aW9uU3R5bGUgY2FwdGlvblN0eWxlKTsKKyAgICAgICAgdm9pZCBzZXRGb250U2NhbGUoZmxvYXQgc2NhbGUpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENhcHRpb25TdHlsZSBERUZBVUxUX0NBUFRJT05fU1RZTEUgPSBDYXB0aW9uU3R5bGUuREVGQVVMVDsKKworICAgIC8qKiBDYXB0aW9uaW5nIG1hbmFnZXIsIHVzZWQgdG8gb2J0YWluIGFuZCB0cmFjayBjYXB0aW9uIHByb3BlcnRpZXMuICovCisgICAgcHJpdmF0ZSBmaW5hbCBDYXB0aW9uaW5nTWFuYWdlciBtTWFuYWdlcjsKKworICAgIC8qKiBDdXJyZW50IGNhcHRpb24gc3R5bGUuICovCisgICAgcHJvdGVjdGVkIENhcHRpb25TdHlsZSBtQ2FwdGlvblN0eWxlOworCisgICAgLyoqIENhbGxiYWNrIGZvciByZW5kZXJpbmcgY2hhbmdlcy4gKi8KKyAgICBwcm90ZWN0ZWQgT25DaGFuZ2VkTGlzdGVuZXIgbUxpc3RlbmVyOworCisgICAgLyoqIENvbmNyZXRlIGxheW91dCBvZiBDQy4gKi8KKyAgICBwcm90ZWN0ZWQgQ2xvc2VkQ2FwdGlvbkxheW91dCBtQ2xvc2VkQ2FwdGlvbkxheW91dDsKKworICAgIC8qKiBXaGV0aGVyIGEgY2FwdGlvbiBzdHlsZSBjaGFuZ2UgbGlzdGVuZXIgaXMgcmVnaXN0ZXJlZC4gKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbUhhc0NoYW5nZUxpc3RlbmVyOworCisgICAgcHVibGljIENsb3NlZENhcHRpb25XaWRnZXQoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIENsb3NlZENhcHRpb25XaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7CisgICAgfQorCisgICAgcHVibGljIENsb3NlZENhcHRpb25XaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgeworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSwgMCk7CisgICAgfQorCisgICAgcHVibGljIENsb3NlZENhcHRpb25XaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsCisgICAgICAgICAgICBpbnQgZGVmU3R5bGVSZXMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgZGVmU3R5bGVSZXMpOworCisgICAgICAgIC8vIENhbm5vdCByZW5kZXIgdGV4dCBvdmVyIHZpZGVvIHdoZW4gbGF5ZXIgdHlwZSBpcyBoYXJkd2FyZS4KKyAgICAgICAgc2V0TGF5ZXJUeXBlKFZpZXcuTEFZRVJfVFlQRV9TT0ZUV0FSRSwgbnVsbCk7CisKKyAgICAgICAgbU1hbmFnZXIgPSAoQ2FwdGlvbmluZ01hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNBUFRJT05JTkdfU0VSVklDRSk7CisgICAgICAgIG1DYXB0aW9uU3R5bGUgPSBERUZBVUxUX0NBUFRJT05fU1RZTEUuYXBwbHlTdHlsZShtTWFuYWdlci5nZXRVc2VyU3R5bGUoKSk7CisKKyAgICAgICAgbUNsb3NlZENhcHRpb25MYXlvdXQgPSBjcmVhdGVDYXB0aW9uTGF5b3V0KGNvbnRleHQpOworICAgICAgICBtQ2xvc2VkQ2FwdGlvbkxheW91dC5zZXRDYXB0aW9uU3R5bGUobUNhcHRpb25TdHlsZSk7CisgICAgICAgIG1DbG9zZWRDYXB0aW9uTGF5b3V0LnNldEZvbnRTY2FsZShtTWFuYWdlci5nZXRGb250U2NhbGUoKSk7CisgICAgICAgIGFkZFZpZXcoKFZpZXdHcm91cCkgbUNsb3NlZENhcHRpb25MYXlvdXQsIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCisgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7CisKKyAgICAgICAgcmVxdWVzdExheW91dCgpOworICAgIH0KKworICAgIHB1YmxpYyBhYnN0cmFjdCBDbG9zZWRDYXB0aW9uTGF5b3V0IGNyZWF0ZUNhcHRpb25MYXlvdXQoQ29udGV4dCBjb250ZXh0KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldE9uQ2hhbmdlZExpc3RlbmVyKE9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIGZpbmFsIGludCB3aWR0aFNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMod2lkdGgsIE1lYXN1cmVTcGVjLkVYQUNUTFkpOworICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0U3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhoZWlnaHQsIE1lYXN1cmVTcGVjLkVYQUNUTFkpOworCisgICAgICAgIG1lYXN1cmUod2lkdGhTcGVjLCBoZWlnaHRTcGVjKTsKKyAgICAgICAgbGF5b3V0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7CisgICAgICAgIGlmICh2aXNpYmxlKSB7CisgICAgICAgICAgICBzZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIH0KKworICAgICAgICBtYW5hZ2VDaGFuZ2VMaXN0ZW5lcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpIHsKKyAgICAgICAgc3VwZXIub25BdHRhY2hlZFRvV2luZG93KCk7CisKKyAgICAgICAgbWFuYWdlQ2hhbmdlTGlzdGVuZXIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKKyAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKKworICAgICAgICBtYW5hZ2VDaGFuZ2VMaXN0ZW5lcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7CisgICAgICAgIHN1cGVyLm9uTWVhc3VyZSh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7CisgICAgICAgICgoVmlld0dyb3VwKSBtQ2xvc2VkQ2FwdGlvbkxheW91dCkubWVhc3VyZSh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgeworICAgICAgICAoKFZpZXdHcm91cCkgbUNsb3NlZENhcHRpb25MYXlvdXQpLmxheW91dChsLCB0LCByLCBiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYW5hZ2VzIHdoZXRoZXIgdGhpcyByZW5kZXJlciBpcyBsaXN0ZW5pbmcgZm9yIGNhcHRpb24gc3R5bGUgY2hhbmdlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIENhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lciBtQ2FwdGlvbmluZ0xpc3RlbmVyID0gbmV3IENhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uVXNlclN0eWxlQ2hhbmdlZChDYXB0aW9uU3R5bGUgdXNlclN0eWxlKSB7CisgICAgICAgICAgICBtQ2FwdGlvblN0eWxlID0gREVGQVVMVF9DQVBUSU9OX1NUWUxFLmFwcGx5U3R5bGUodXNlclN0eWxlKTsKKyAgICAgICAgICAgIG1DbG9zZWRDYXB0aW9uTGF5b3V0LnNldENhcHRpb25TdHlsZShtQ2FwdGlvblN0eWxlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkZvbnRTY2FsZUNoYW5nZWQoZmxvYXQgZm9udFNjYWxlKSB7CisgICAgICAgICAgICBtQ2xvc2VkQ2FwdGlvbkxheW91dC5zZXRGb250U2NhbGUoZm9udFNjYWxlKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIHZvaWQgbWFuYWdlQ2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gbmVlZHNMaXN0ZW5lciA9IGlzQXR0YWNoZWRUb1dpbmRvdygpICYmIGdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEU7CisgICAgICAgIGlmIChtSGFzQ2hhbmdlTGlzdGVuZXIgIT0gbmVlZHNMaXN0ZW5lcikgeworICAgICAgICAgICAgbUhhc0NoYW5nZUxpc3RlbmVyID0gbmVlZHNMaXN0ZW5lcjsKKworICAgICAgICAgICAgaWYgKG5lZWRzTGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICBtTWFuYWdlci5hZGRDYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIobUNhcHRpb25pbmdMaXN0ZW5lcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnJlbW92ZUNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcihtQ2FwdGlvbmluZ0xpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBDQ1BhcnNlciBwcm9jZXNzZXMgQ0VBLTYwOCBjbG9zZWQgY2FwdGlvbiBkYXRhLgorICoKKyAqIEl0IGNhbGxzIGJhY2sgaW50byBPbkRpc3BsYXlDaGFuZ2VkTGlzdGVuZXIgdXBvbgorICogZGlzcGxheSBjaGFuZ2Ugd2l0aCBzdHlsZWQgdGV4dCBmb3IgcmVuZGVyaW5nLgorICoKKyAqLworY2xhc3MgQ2VhNjA4Q0NQYXJzZXIgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9ST1dTID0gMTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NPTFMgPSAzMjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ2VhNjA4Q0NQYXJzZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRCA9IC0xOworCisgICAgLy8gRUlBLUNFQS02MDg6IFRhYmxlIDcwIC0gQ29udHJvbCBDb2RlcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSQ0wgPSAweDIwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCUyAgPSAweDIxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBT0YgPSAweDIyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBT04gPSAweDIzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVIgPSAweDI0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVTIgPSAweDI1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVTMgPSAweDI2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVTQgPSAweDI3OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGT04gPSAweDI4OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSREMgPSAweDI5OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUUiAgPSAweDJhOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVEQgPSAweDJiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFRE0gPSAweDJjOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDUiAgPSAweDJkOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTk0gPSAweDJlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFT0MgPSAweDJmOworCisgICAgLy8gVHJhbnNwYXJlbnQgU3BhY2UKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFRTID0gJ1x1MDBBMCc7CisKKyAgICAvLyBDYXB0aW9uaW5nIE1vZGVzCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfVU5LTk9XTiA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfUEFJTlRfT04gPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT0RFX1JPTExfVVAgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT0RFX1BPUF9PTiA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfVEVYVCA9IDQ7CisKKyAgICBwcml2YXRlIGZpbmFsIERpc3BsYXlMaXN0ZW5lciBtTGlzdGVuZXI7CisKKyAgICBwcml2YXRlIGludCBtTW9kZSA9IE1PREVfUEFJTlRfT047CisgICAgcHJpdmF0ZSBpbnQgbVJvbGxVcFNpemUgPSA0OworICAgIHByaXZhdGUgaW50IG1QcmV2Q3RybENvZGUgPSBJTlZBTElEOworCisgICAgcHJpdmF0ZSBDQ01lbW9yeSBtRGlzcGxheSA9IG5ldyBDQ01lbW9yeSgpOworICAgIHByaXZhdGUgQ0NNZW1vcnkgbU5vbkRpc3BsYXkgPSBuZXcgQ0NNZW1vcnkoKTsKKyAgICBwcml2YXRlIENDTWVtb3J5IG1UZXh0TWVtID0gbmV3IENDTWVtb3J5KCk7CisKKyAgICBDZWE2MDhDQ1BhcnNlcihEaXNwbGF5TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcGFyc2UoYnl0ZVtdIGRhdGEpIHsKKyAgICAgICAgQ0NEYXRhW10gY2NEYXRhID0gQ0NEYXRhLmZyb21CeXRlQXJyYXkoZGF0YSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjY0RhdGEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2NEYXRhW2ldLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaGFuZGxlQ3RybENvZGUoY2NEYXRhW2ldKQorICAgICAgICAgICAgICAgICAgICB8fCBoYW5kbGVUYWJPZmZzZXRzKGNjRGF0YVtpXSkKKyAgICAgICAgICAgICAgICAgICAgfHwgaGFuZGxlUEFDQ29kZShjY0RhdGFbaV0pCisgICAgICAgICAgICAgICAgICAgIHx8IGhhbmRsZU1pZFJvd0NvZGUoY2NEYXRhW2ldKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBoYW5kbGVEaXNwbGF5YWJsZUNoYXJzKGNjRGF0YVtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnRlcmZhY2UgRGlzcGxheUxpc3RlbmVyIHsKKyAgICAgICAgdm9pZCBvbkRpc3BsYXlDaGFuZ2VkKFNwYW5uYWJsZVN0cmluZ0J1aWxkZXJbXSBzdHlsZWRUZXh0cyk7CisgICAgICAgIENhcHRpb25TdHlsZSBnZXRDYXB0aW9uU3R5bGUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIENDTWVtb3J5IGdldE1lbW9yeSgpIHsKKyAgICAgICAgLy8gZ2V0IHRoZSBDQyBtZW1vcnkgdG8gb3BlcmF0ZSBvbiBmb3IgY3VycmVudCBtb2RlCisgICAgICAgIHN3aXRjaCAobU1vZGUpIHsKKyAgICAgICAgY2FzZSBNT0RFX1BPUF9PTjoKKyAgICAgICAgICAgIHJldHVybiBtTm9uRGlzcGxheTsKKyAgICAgICAgY2FzZSBNT0RFX1RFWFQ6CisgICAgICAgICAgICAvLyBUT0RPKGNoeik6IHN1cHBvcnQgb25seSBjYXB0aW9uIG1vZGUgZm9yIG5vdywKKyAgICAgICAgICAgIC8vIGluIHRleHQgbW9kZSwgZHVtcCBldmVyeXRoaW5nIHRvIHRleHQgbWVtLgorICAgICAgICAgICAgcmV0dXJuIG1UZXh0TWVtOworICAgICAgICBjYXNlIE1PREVfUEFJTlRfT046CisgICAgICAgIGNhc2UgTU9ERV9ST0xMX1VQOgorICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5OworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTG9nLncoVEFHLCAidW5yZWNvZ2luaXplZCBtb2RlOiAiICsgbU1vZGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRGlzcGxheTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlRGlzcGxheWFibGVDaGFycyhDQ0RhdGEgY2NEYXRhKSB7CisgICAgICAgIGlmICghY2NEYXRhLmlzRGlzcGxheWFibGVDaGFyKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEV4dGVuZGVkIGNoYXIgaW5jbHVkZXMgMSBhdXRvbWF0aWMgYmFja3NwYWNlCisgICAgICAgIGlmIChjY0RhdGEuaXNFeHRlbmRlZENoYXIoKSkgeworICAgICAgICAgICAgZ2V0TWVtb3J5KCkuYnMoKTsKKyAgICAgICAgfQorCisgICAgICAgIGdldE1lbW9yeSgpLndyaXRlVGV4dChjY0RhdGEuZ2V0RGlzcGxheVRleHQoKSk7CisKKyAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfUEFJTlRfT04gfHwgbU1vZGUgPT0gTU9ERV9ST0xMX1VQKSB7CisgICAgICAgICAgICB1cGRhdGVEaXNwbGF5KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlTWlkUm93Q29kZShDQ0RhdGEgY2NEYXRhKSB7CisgICAgICAgIFN0eWxlQ29kZSBtID0gY2NEYXRhLmdldE1pZFJvdygpOworICAgICAgICBpZiAobSAhPSBudWxsKSB7CisgICAgICAgICAgICBnZXRNZW1vcnkoKS53cml0ZU1pZFJvd0NvZGUobSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGhhbmRsZVBBQ0NvZGUoQ0NEYXRhIGNjRGF0YSkgeworICAgICAgICBQQUMgcGFjID0gY2NEYXRhLmdldFBBQygpOworCisgICAgICAgIGlmIChwYWMgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfUk9MTF9VUCkgeworICAgICAgICAgICAgICAgIGdldE1lbW9yeSgpLm1vdmVCYXNlbGluZVRvKHBhYy5nZXRSb3coKSwgbVJvbGxVcFNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2V0TWVtb3J5KCkud3JpdGVQQUMocGFjKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVUYWJPZmZzZXRzKENDRGF0YSBjY0RhdGEpIHsKKyAgICAgICAgaW50IHRhYnMgPSBjY0RhdGEuZ2V0VGFiT2Zmc2V0KCk7CisKKyAgICAgICAgaWYgKHRhYnMgPiAwKSB7CisgICAgICAgICAgICBnZXRNZW1vcnkoKS50YWIodGFicyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlQ3RybENvZGUoQ0NEYXRhIGNjRGF0YSkgeworICAgICAgICBpbnQgY3RybENvZGUgPSBjY0RhdGEuZ2V0Q3RybENvZGUoKTsKKworICAgICAgICBpZiAobVByZXZDdHJsQ29kZSAhPSBJTlZBTElEICYmIG1QcmV2Q3RybENvZGUgPT0gY3RybENvZGUpIHsKKyAgICAgICAgICAgIC8vIGRpc2NhcmQgZG91YmxlIGN0cmwgY29kZXMgKGJ1dCBpZiB0aGVyZSdzIGEgM3JkIG9uZSwgd2Ugc3RpbGwgdGFrZSB0aGF0KQorICAgICAgICAgICAgbVByZXZDdHJsQ29kZSA9IElOVkFMSUQ7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaChjdHJsQ29kZSkgeworICAgICAgICBjYXNlIFJDTDoKKyAgICAgICAgICAgIC8vIHNlbGVjdCBwb3Atb24gc3R5bGUKKyAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9QT1BfT047CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCUzoKKyAgICAgICAgICAgIGdldE1lbW9yeSgpLmJzKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBERVI6CisgICAgICAgICAgICBnZXRNZW1vcnkoKS5kZXIoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJVMjoKKyAgICAgICAgY2FzZSBSVTM6CisgICAgICAgIGNhc2UgUlU0OgorICAgICAgICAgICAgbVJvbGxVcFNpemUgPSAoY3RybENvZGUgLSAweDIzKTsKKyAgICAgICAgICAgIC8vIGVyYXNlIG1lbW9yeSBpZiBjdXJyZW50bHkgaW4gb3RoZXIgc3R5bGUKKyAgICAgICAgICAgIGlmIChtTW9kZSAhPSBNT0RFX1JPTExfVVApIHsKKyAgICAgICAgICAgICAgICBtRGlzcGxheS5lcmFzZSgpOworICAgICAgICAgICAgICAgIG1Ob25EaXNwbGF5LmVyYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBzZWxlY3Qgcm9sbC11cCBzdHlsZQorICAgICAgICAgICAgbU1vZGUgPSBNT0RFX1JPTExfVVA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGT046CisgICAgICAgICAgICBMb2cuaShUQUcsICJGbGFzaCBPbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkRDOgorICAgICAgICAgICAgLy8gc2VsZWN0IHBhaW50LW9uIHN0eWxlCisgICAgICAgICAgICBtTW9kZSA9IE1PREVfUEFJTlRfT047CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUUjoKKyAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9URVhUOworICAgICAgICAgICAgbVRleHRNZW0uZXJhc2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJURDoKKyAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9URVhUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRURNOgorICAgICAgICAgICAgLy8gZXJhc2UgZGlzcGxheSBtZW1vcnkKKyAgICAgICAgICAgIG1EaXNwbGF5LmVyYXNlKCk7CisgICAgICAgICAgICB1cGRhdGVEaXNwbGF5KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUjoKKyAgICAgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX1JPTExfVVApIHsKKyAgICAgICAgICAgICAgICBnZXRNZW1vcnkoKS5yb2xsVXAobVJvbGxVcFNpemUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnZXRNZW1vcnkoKS5jcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfUk9MTF9VUCkgeworICAgICAgICAgICAgICAgIHVwZGF0ZURpc3BsYXkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVOTToKKyAgICAgICAgICAgIC8vIGVyYXNlIG5vbi1kaXNwbGF5IG1lbW9yeQorICAgICAgICAgICAgbU5vbkRpc3BsYXkuZXJhc2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVPQzoKKyAgICAgICAgICAgIC8vIHN3YXAgZGlzcGxheS9ub24tZGlzcGxheSBtZW1vcnkKKyAgICAgICAgICAgIHN3YXBNZW1vcnkoKTsKKyAgICAgICAgICAgIC8vIHN3aXRjaCB0byBwb3Atb24gc3R5bGUKKyAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9QT1BfT047CisgICAgICAgICAgICB1cGRhdGVEaXNwbGF5KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJTlZBTElEOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbVByZXZDdHJsQ29kZSA9IElOVkFMSUQ7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBtUHJldkN0cmxDb2RlID0gY3RybENvZGU7CisKKyAgICAgICAgLy8gaGFuZGxlZAorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlRGlzcGxheSgpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBDYXB0aW9uU3R5bGUgY2FwdGlvblN0eWxlID0gbUxpc3RlbmVyLmdldENhcHRpb25TdHlsZSgpOworICAgICAgICAgICAgbUxpc3RlbmVyLm9uRGlzcGxheUNoYW5nZWQobURpc3BsYXkuZ2V0U3R5bGVkVGV4dChjYXB0aW9uU3R5bGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzd2FwTWVtb3J5KCkgeworICAgICAgICBDQ01lbW9yeSB0ZW1wID0gbURpc3BsYXk7CisgICAgICAgIG1EaXNwbGF5ID0gbU5vbkRpc3BsYXk7CisgICAgICAgIG1Ob25EaXNwbGF5ID0gdGVtcDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHlsZUNvZGUgeworICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX1dISVRFID0gMDsKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9HUkVFTiA9IDE7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfQkxVRSA9IDI7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfQ1lBTiA9IDM7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfUkVEID0gNDsKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9ZRUxMT1cgPSA1OworICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX01BR0VOVEEgPSA2OworICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX0lOVkFMSUQgPSA3OworCisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgU1RZTEVfSVRBTElDUyAgID0gMHgwMDAwMDAwMTsKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBTVFlMRV9VTkRFUkxJTkUgPSAweDAwMDAwMDAyOworCisgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBtQ29sb3JNYXAgPSB7CisgICAgICAgICAgICAiV0hJVEUiLCAiR1JFRU4iLCAiQkxVRSIsICJDWUFOIiwgIlJFRCIsICJZRUxMT1ciLCAiTUFHRU5UQSIsICJJTlZBTElEIgorICAgICAgICB9OworCisgICAgICAgIGZpbmFsIGludCBtU3R5bGU7CisgICAgICAgIGZpbmFsIGludCBtQ29sb3I7CisKKyAgICAgICAgc3RhdGljIFN0eWxlQ29kZSBmcm9tQnl0ZShieXRlIGRhdGEyKSB7CisgICAgICAgICAgICBpbnQgc3R5bGUgPSAwOworICAgICAgICAgICAgaW50IGNvbG9yID0gKGRhdGEyID4+IDEpICYgMHg3OworCisgICAgICAgICAgICBpZiAoKGRhdGEyICYgMHgxKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgc3R5bGUgfD0gU1RZTEVfVU5ERVJMSU5FOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29sb3IgPT0gQ09MT1JfSU5WQUxJRCkgeworICAgICAgICAgICAgICAgIC8vIFdISVRFIElUQUxJQ1MKKyAgICAgICAgICAgICAgICBjb2xvciA9IENPTE9SX1dISVRFOworICAgICAgICAgICAgICAgIHN0eWxlIHw9IFNUWUxFX0lUQUxJQ1M7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3R5bGVDb2RlKHN0eWxlLCBjb2xvcik7CisgICAgICAgIH0KKworICAgICAgICBTdHlsZUNvZGUoaW50IHN0eWxlLCBpbnQgY29sb3IpIHsKKyAgICAgICAgICAgIG1TdHlsZSA9IHN0eWxlOworICAgICAgICAgICAgbUNvbG9yID0gY29sb3I7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGlzSXRhbGljcygpIHsKKyAgICAgICAgICAgIHJldHVybiAobVN0eWxlICYgU1RZTEVfSVRBTElDUykgIT0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gaXNVbmRlcmxpbmUoKSB7CisgICAgICAgICAgICByZXR1cm4gKG1TdHlsZSAmIFNUWUxFX1VOREVSTElORSkgIT0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGludCBnZXRDb2xvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ29sb3I7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc3RyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHN0ci5hcHBlbmQoInsiKTsKKyAgICAgICAgICAgIHN0ci5hcHBlbmQobUNvbG9yTWFwW21Db2xvcl0pOworICAgICAgICAgICAgaWYgKChtU3R5bGUgJiBTVFlMRV9JVEFMSUNTKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgc3RyLmFwcGVuZCgiLCBJVEFMSUNTIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKG1TdHlsZSAmIFNUWUxFX1VOREVSTElORSkgIT0gMCkgeworICAgICAgICAgICAgICAgIHN0ci5hcHBlbmQoIiwgVU5ERVJMSU5FIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHIuYXBwZW5kKCJ9Iik7CisKKyAgICAgICAgICAgIHJldHVybiBzdHIudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBBQyBleHRlbmRzIFN0eWxlQ29kZSB7CisgICAgICAgIGZpbmFsIGludCBtUm93OworICAgICAgICBmaW5hbCBpbnQgbUNvbDsKKworICAgICAgICBzdGF0aWMgUEFDIGZyb21CeXRlcyhieXRlIGRhdGExLCBieXRlIGRhdGEyKSB7CisgICAgICAgICAgICBpbnRbXSByb3dUYWJsZSA9IHsxMSwgMSwgMywgMTIsIDE0LCA1LCA3LCA5fTsKKyAgICAgICAgICAgIGludCByb3cgPSByb3dUYWJsZVtkYXRhMSAmIDB4MDddICsgKChkYXRhMiAmIDB4MjApID4+IDUpOworICAgICAgICAgICAgaW50IHN0eWxlID0gMDsKKyAgICAgICAgICAgIGlmICgoZGF0YTIgJiAxKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgc3R5bGUgfD0gU1RZTEVfVU5ERVJMSU5FOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChkYXRhMiAmIDB4MTApICE9IDApIHsKKyAgICAgICAgICAgICAgICAvLyBpbmRlbnQgY29kZQorICAgICAgICAgICAgICAgIGludCBpbmRlbnQgPSAoZGF0YTIgPj4gMSkgJiAweDc7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQQUMocm93LCBpbmRlbnQgKiA0LCBzdHlsZSwgQ09MT1JfV0hJVEUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBzdHlsZSBjb2RlCisgICAgICAgICAgICAgICAgaW50IGNvbG9yID0gKGRhdGEyID4+IDEpICYgMHg3OworCisgICAgICAgICAgICAgICAgaWYgKGNvbG9yID09IENPTE9SX0lOVkFMSUQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV0hJVEUgSVRBTElDUworICAgICAgICAgICAgICAgICAgICBjb2xvciA9IENPTE9SX1dISVRFOworICAgICAgICAgICAgICAgICAgICBzdHlsZSB8PSBTVFlMRV9JVEFMSUNTOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBBQyhyb3csIC0xLCBzdHlsZSwgY29sb3IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgUEFDKGludCByb3csIGludCBjb2wsIGludCBzdHlsZSwgaW50IGNvbG9yKSB7CisgICAgICAgICAgICBzdXBlcihzdHlsZSwgY29sb3IpOworICAgICAgICAgICAgbVJvdyA9IHJvdzsKKyAgICAgICAgICAgIG1Db2wgPSBjb2w7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGlzSW5kZW50UEFDKCkgeworICAgICAgICAgICAgcmV0dXJuIChtQ29sID49IDApOworICAgICAgICB9CisKKyAgICAgICAgaW50IGdldFJvdygpIHsKKyAgICAgICAgICAgIHJldHVybiBtUm93OworICAgICAgICB9CisKKyAgICAgICAgaW50IGdldENvbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ29sOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgieyVkLCAlZH0sICVzIiwKKyAgICAgICAgICAgICAgICAgICAgbVJvdywgbUNvbCwgc3VwZXIudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNdXRhYmxlIHZlcnNpb24gb2YgQmFja2dyb3VuZFNwYW4gdG8gZmFjaWxpdGF0ZSB0ZXh0IHJlbmRlcmluZyB3aXRoIGVkZ2Ugc3R5bGVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXV0YWJsZUJhY2tncm91bmRDb2xvclNwYW4gZXh0ZW5kcyBDaGFyYWN0ZXJTdHlsZQorICAgICAgICAgICAgaW1wbGVtZW50cyBVcGRhdGVBcHBlYXJhbmNlIHsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUNvbG9yOworCisgICAgICAgIHB1YmxpYyBNdXRhYmxlQmFja2dyb3VuZENvbG9yU3BhbihpbnQgY29sb3IpIHsKKyAgICAgICAgICAgIG1Db2xvciA9IGNvbG9yOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKGludCBjb2xvcikgeworICAgICAgICAgICAgbUNvbG9yID0gY29sb3I7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldEJhY2tncm91bmRDb2xvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ29sb3I7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlRHJhd1N0YXRlKFRleHRQYWludCBkcykgeworICAgICAgICAgICAgZHMuYmdDb2xvciA9IG1Db2xvcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENDTGluZUJ1aWxkZXIga2VlcHMgdHJhY2sgb2YgZGlzcGxheWFibGUgY2hhcnMsIGFzIHdlbGwgYXMKKyAgICAgKiBNaWRSb3cgc3R5bGVzIGFuZCBQQUNzLCBmb3IgYSBzaW5nbGUgbGluZSBvZiBDQyBtZW1vcnkuCisgICAgICoKKyAgICAgKiBJdCBnZW5lcmF0ZXMgc3R5bGVkIHRleHQgdmlhIGdldFN0eWxlZFRleHQoKSBtZXRob2QuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ0NMaW5lQnVpbGRlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nQnVpbGRlciBtRGlzcGxheUNoYXJzOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0eWxlQ29kZVtdIG1NaWRSb3dTdHlsZXM7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3R5bGVDb2RlW10gbVBBQ1N0eWxlczsKKworICAgICAgICBDQ0xpbmVCdWlsZGVyKFN0cmluZyBzdHIpIHsKKyAgICAgICAgICAgIG1EaXNwbGF5Q2hhcnMgPSBuZXcgU3RyaW5nQnVpbGRlcihzdHIpOworICAgICAgICAgICAgbU1pZFJvd1N0eWxlcyA9IG5ldyBTdHlsZUNvZGVbbURpc3BsYXlDaGFycy5sZW5ndGgoKV07CisgICAgICAgICAgICBtUEFDU3R5bGVzID0gbmV3IFN0eWxlQ29kZVttRGlzcGxheUNoYXJzLmxlbmd0aCgpXTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0Q2hhckF0KGludCBpbmRleCwgY2hhciBjaCkgeworICAgICAgICAgICAgbURpc3BsYXlDaGFycy5zZXRDaGFyQXQoaW5kZXgsIGNoKTsKKyAgICAgICAgICAgIG1NaWRSb3dTdHlsZXNbaW5kZXhdID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0TWlkUm93QXQoaW50IGluZGV4LCBTdHlsZUNvZGUgbSkgeworICAgICAgICAgICAgbURpc3BsYXlDaGFycy5zZXRDaGFyQXQoaW5kZXgsICcgJyk7CisgICAgICAgICAgICBtTWlkUm93U3R5bGVzW2luZGV4XSA9IG07CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldFBBQ0F0KGludCBpbmRleCwgUEFDIHBhYykgeworICAgICAgICAgICAgbVBBQ1N0eWxlc1tpbmRleF0gPSBwYWM7CisgICAgICAgIH0KKworICAgICAgICBjaGFyIGNoYXJBdChpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRGlzcGxheUNoYXJzLmNoYXJBdChpbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgbGVuZ3RoKCkgeworICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5Q2hhcnMubGVuZ3RoKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGFwcGx5U3R5bGVTcGFuKAorICAgICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgc3R5bGVkVGV4dCwKKyAgICAgICAgICAgICAgICBTdHlsZUNvZGUgcywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisgICAgICAgICAgICBpZiAocy5pc0l0YWxpY3MoKSkgeworICAgICAgICAgICAgICAgIHN0eWxlZFRleHQuc2V0U3BhbigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHlsZVNwYW4oYW5kcm9pZC5ncmFwaGljcy5UeXBlZmFjZS5JVEFMSUMpLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgU3Bhbm5hYmxlLlNQQU5fRVhDTFVTSVZFX0VYQ0xVU0lWRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocy5pc1VuZGVybGluZSgpKSB7CisgICAgICAgICAgICAgICAgc3R5bGVkVGV4dC5zZXRTcGFuKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVuZGVybGluZVNwYW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQsIFNwYW5uYWJsZS5TUEFOX0VYQ0xVU0lWRV9FWENMVVNJVkUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBnZXRTdHlsZWRUZXh0KENhcHRpb25TdHlsZSBjYXB0aW9uU3R5bGUpIHsKKyAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgc3R5bGVkVGV4dCA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKG1EaXNwbGF5Q2hhcnMpOworICAgICAgICAgICAgaW50IHN0YXJ0ID0gLTEsIG5leHQgPSAwOworICAgICAgICAgICAgaW50IHN0eWxlU3RhcnQgPSAtMTsKKyAgICAgICAgICAgIFN0eWxlQ29kZSBjdXJTdHlsZSA9IG51bGw7CisgICAgICAgICAgICB3aGlsZSAobmV4dCA8IG1EaXNwbGF5Q2hhcnMubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICBTdHlsZUNvZGUgbmV3U3R5bGUgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChtTWlkUm93U3R5bGVzW25leHRdICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgbWlkLXJvdyBzdHlsZSBjaGFuZ2UKKyAgICAgICAgICAgICAgICAgICAgbmV3U3R5bGUgPSBtTWlkUm93U3R5bGVzW25leHRdOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVBBQ1N0eWxlc1tuZXh0XSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmIChzdHlsZVN0YXJ0IDwgMCB8fCBzdGFydCA8IDApKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFwcGx5IFBBQyBzdHlsZSBjaGFuZ2UsIG9ubHkgaWY6CisgICAgICAgICAgICAgICAgICAgIC8vIDEuIG5vIHN0eWxlIHNldCwgb3IKKyAgICAgICAgICAgICAgICAgICAgLy8gMi4gc3R5bGUgc2V0LCBidXQgcHJldiBjaGFyIGlzIG5vbmUtZGlzcGxheWFibGUKKyAgICAgICAgICAgICAgICAgICAgbmV3U3R5bGUgPSBtUEFDU3R5bGVzW25leHRdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobmV3U3R5bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjdXJTdHlsZSA9IG5ld1N0eWxlOworICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVTdGFydCA+PSAwICYmIHN0YXJ0ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5U3R5bGVTcGFuKHN0eWxlZFRleHQsIG5ld1N0eWxlLCBzdHlsZVN0YXJ0LCBuZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdHlsZVN0YXJ0ID0gbmV4dDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobURpc3BsYXlDaGFycy5jaGFyQXQobmV4dCkgIT0gVFMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBuZXh0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFydCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBleHBhbmRlZFN0YXJ0ID0gbURpc3BsYXlDaGFycy5jaGFyQXQoc3RhcnQpID09ICcgJyA/IHN0YXJ0IDogc3RhcnQgLSAxOworICAgICAgICAgICAgICAgICAgICBpbnQgZXhwYW5kZWRFbmQgPSBtRGlzcGxheUNoYXJzLmNoYXJBdChuZXh0IC0gMSkgPT0gJyAnID8gbmV4dCA6IG5leHQgKyAxOworICAgICAgICAgICAgICAgICAgICBzdHlsZWRUZXh0LnNldFNwYW4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE11dGFibGVCYWNrZ3JvdW5kQ29sb3JTcGFuKGNhcHRpb25TdHlsZS5iYWNrZ3JvdW5kQ29sb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkU3RhcnQsIGV4cGFuZGVkRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwYW5uYWJsZS5TUEFOX0VYQ0xVU0lWRV9FWENMVVNJVkUpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVTdGFydCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcHBseVN0eWxlU3BhbihzdHlsZWRUZXh0LCBjdXJTdHlsZSwgc3R5bGVTdGFydCwgZXhwYW5kZWRFbmQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHN0eWxlZFRleHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIENDTWVtb3J5IG1vZGVscyBhIGNvbnNvbGUtc3R5bGUgZGlzcGxheS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDQ01lbW9yeSB7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1CbGFua0xpbmU7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ0NMaW5lQnVpbGRlcltdIG1MaW5lcyA9IG5ldyBDQ0xpbmVCdWlsZGVyW01BWF9ST1dTICsgMl07CisgICAgICAgIHByaXZhdGUgaW50IG1Sb3c7CisgICAgICAgIHByaXZhdGUgaW50IG1Db2w7CisKKyAgICAgICAgQ0NNZW1vcnkoKSB7CisgICAgICAgICAgICBjaGFyW10gYmxhbmsgPSBuZXcgY2hhcltNQVhfQ09MUyArIDJdOworICAgICAgICAgICAgQXJyYXlzLmZpbGwoYmxhbmssIFRTKTsKKyAgICAgICAgICAgIG1CbGFua0xpbmUgPSBuZXcgU3RyaW5nKGJsYW5rKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZXJhc2UoKSB7CisgICAgICAgICAgICAvLyBlcmFzZSBhbGwgbGluZXMKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUxpbmVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbUxpbmVzW2ldID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Sb3cgPSBNQVhfUk9XUzsKKyAgICAgICAgICAgIG1Db2wgPSAxOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBkZXIoKSB7CisgICAgICAgICAgICBpZiAobUxpbmVzW21Sb3ddICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Db2w7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAobUxpbmVzW21Sb3ddLmNoYXJBdChpKSAhPSBUUykgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IG1Db2w7IGogPCBtTGluZXNbbVJvd10ubGVuZ3RoKCk7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MaW5lc1tqXS5zZXRDaGFyQXQoaiwgVFMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1MaW5lc1ttUm93XSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHRhYihpbnQgdGFicykgeworICAgICAgICAgICAgbW92ZUN1cnNvckJ5Q29sKHRhYnMpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBicygpIHsKKyAgICAgICAgICAgIG1vdmVDdXJzb3JCeUNvbCgtMSk7CisgICAgICAgICAgICBpZiAobUxpbmVzW21Sb3ddICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtTGluZXNbbVJvd10uc2V0Q2hhckF0KG1Db2wsIFRTKTsKKyAgICAgICAgICAgICAgICBpZiAobUNvbCA9PSBNQVhfQ09MUyAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3BlYyByZWNvbW1lbmRhdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgY3Vyc29yIHdhcyBhdCBjb2wgMzIsIG1vdmUgY3Vyc29yCisgICAgICAgICAgICAgICAgICAgIC8vIGJhY2sgdG8gY29sIDMxIGFuZCBlcmFzZSBib3RoIGNvbCAzMSYzMgorICAgICAgICAgICAgICAgICAgICBtTGluZXNbbVJvd10uc2V0Q2hhckF0KE1BWF9DT0xTLCBUUyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCBjcigpIHsKKyAgICAgICAgICAgIG1vdmVDdXJzb3JUbyhtUm93ICsgMSwgMSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHJvbGxVcChpbnQgd2luZG93U2l6ZSkgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IG1Sb3cgLSB3aW5kb3dTaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtTGluZXNbaV0gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHN0YXJ0Um93ID0gbVJvdyAtIHdpbmRvd1NpemUgKyAxOworICAgICAgICAgICAgaWYgKHN0YXJ0Um93IDwgMSkgeworICAgICAgICAgICAgICAgIHN0YXJ0Um93ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IHN0YXJ0Um93OyBpIDwgbVJvdzsgaSsrKSB7CisgICAgICAgICAgICAgICAgbUxpbmVzW2ldID0gbUxpbmVzW2kgKyAxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IG1Sb3c7IGkgPCBtTGluZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAvLyBjbGVhciBiYXNlIHJvdworICAgICAgICAgICAgICAgIG1MaW5lc1tpXSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIGNvbCAxLCBpbiBjYXNlIFBBQyBpcyBub3Qgc2VudAorICAgICAgICAgICAgbUNvbCA9IDE7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlVGV4dChTdHJpbmcgdGV4dCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBnZXRMaW5lQnVmZmVyKG1Sb3cpLnNldENoYXJBdChtQ29sLCB0ZXh0LmNoYXJBdChpKSk7CisgICAgICAgICAgICAgICAgbW92ZUN1cnNvckJ5Q29sKDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZU1pZFJvd0NvZGUoU3R5bGVDb2RlIG0pIHsKKyAgICAgICAgICAgIGdldExpbmVCdWZmZXIobVJvdykuc2V0TWlkUm93QXQobUNvbCwgbSk7CisgICAgICAgICAgICBtb3ZlQ3Vyc29yQnlDb2woMSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlUEFDKFBBQyBwYWMpIHsKKyAgICAgICAgICAgIGlmIChwYWMuaXNJbmRlbnRQQUMoKSkgeworICAgICAgICAgICAgICAgIG1vdmVDdXJzb3JUbyhwYWMuZ2V0Um93KCksIHBhYy5nZXRDb2woKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1vdmVDdXJzb3JUbyhwYWMuZ2V0Um93KCksIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2V0TGluZUJ1ZmZlcihtUm93KS5zZXRQQUNBdChtQ29sLCBwYWMpOworICAgICAgICB9CisKKyAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcltdIGdldFN0eWxlZFRleHQoQ2FwdGlvblN0eWxlIGNhcHRpb25TdHlsZSkgeworICAgICAgICAgICAgQXJyYXlMaXN0PFNwYW5uYWJsZVN0cmluZ0J1aWxkZXI+IHJvd3MgPSBuZXcgQXJyYXlMaXN0PD4oTUFYX1JPV1MpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gTUFYX1JPV1M7IGkrKykgeworICAgICAgICAgICAgICAgIHJvd3MuYWRkKG1MaW5lc1tpXSAhPSBudWxsID8KKyAgICAgICAgICAgICAgICAgICAgICAgIG1MaW5lc1tpXS5nZXRTdHlsZWRUZXh0KGNhcHRpb25TdHlsZSkgOiBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByb3dzLnRvQXJyYXkobmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXJbTUFYX1JPV1NdKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBjbGFtcChpbnQgeCwgaW50IG1pbiwgaW50IG1heCkgeworICAgICAgICAgICAgcmV0dXJuIHggPCBtaW4gPyBtaW4gOiAoeCA+IG1heCA/IG1heCA6IHgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIG1vdmVDdXJzb3JUbyhpbnQgcm93LCBpbnQgY29sKSB7CisgICAgICAgICAgICBtUm93ID0gY2xhbXAocm93LCAxLCBNQVhfUk9XUyk7CisgICAgICAgICAgICBtQ29sID0gY2xhbXAoY29sLCAxLCBNQVhfQ09MUyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgbW92ZUN1cnNvclRvUm93KGludCByb3cpIHsKKyAgICAgICAgICAgIG1Sb3cgPSBjbGFtcChyb3csIDEsIE1BWF9ST1dTKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBtb3ZlQ3Vyc29yQnlDb2woaW50IGNvbCkgeworICAgICAgICAgICAgbUNvbCA9IGNsYW1wKG1Db2wgKyBjb2wsIDEsIE1BWF9DT0xTKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBtb3ZlQmFzZWxpbmVUbyhpbnQgYmFzZVJvdywgaW50IHdpbmRvd1NpemUpIHsKKyAgICAgICAgICAgIGlmIChtUm93ID09IGJhc2VSb3cpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgYWN0dWFsV2luZG93U2l6ZSA9IHdpbmRvd1NpemU7CisgICAgICAgICAgICBpZiAoYmFzZVJvdyA8IGFjdHVhbFdpbmRvd1NpemUpIHsKKyAgICAgICAgICAgICAgICBhY3R1YWxXaW5kb3dTaXplID0gYmFzZVJvdzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUm93IDwgYWN0dWFsV2luZG93U2l6ZSkgeworICAgICAgICAgICAgICAgIGFjdHVhbFdpbmRvd1NpemUgPSBtUm93OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGlmIChiYXNlUm93IDwgbVJvdykgeworICAgICAgICAgICAgICAgIC8vIGNvcHkgZnJvbSBib3R0b20gdG8gdG9wIHJvdworICAgICAgICAgICAgICAgIGZvciAoaSA9IGFjdHVhbFdpbmRvd1NpemUgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgICAgICBtTGluZXNbYmFzZVJvdyAtIGldID0gbUxpbmVzW21Sb3cgLSBpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGNvcHkgZnJvbSB0b3AgdG8gYm90dG9tIHJvdworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhY3R1YWxXaW5kb3dTaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgbUxpbmVzW2Jhc2VSb3cgLSBpXSA9IG1MaW5lc1ttUm93IC0gaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gY2xlYXIgcmVzdCBvZiB0aGUgcm93cworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSBiYXNlUm93IC0gd2luZG93U2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgbUxpbmVzW2ldID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IGJhc2VSb3cgKyAxOyBpIDwgbUxpbmVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbUxpbmVzW2ldID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgQ0NMaW5lQnVpbGRlciBnZXRMaW5lQnVmZmVyKGludCByb3cpIHsKKyAgICAgICAgICAgIGlmIChtTGluZXNbcm93XSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUxpbmVzW3Jvd10gPSBuZXcgQ0NMaW5lQnVpbGRlcihtQmxhbmtMaW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtTGluZXNbcm93XTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogQ0NEYXRhIHBhcnNlcyB0aGUgcmF3IENDIGJ5dGUgcGFpciBpbnRvIGRpc3BsYXlhYmxlIGNoYXJzLAorICAgICAqIG1pc2MgY29udHJvbCBjb2RlcywgTWlkLVJvdyBvciBQcmVhbWJsZSBBZGRyZXNzIENvZGVzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENDRGF0YSB7CisgICAgICAgIHByaXZhdGUgZmluYWwgYnl0ZSBtVHlwZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBieXRlIG1EYXRhMTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBieXRlIG1EYXRhMjsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBtQ3RybENvZGVNYXAgPSB7CisgICAgICAgICAgICAiUkNMIiwgIkJTIiAsICJBT0YiLCAiQU9OIiwKKyAgICAgICAgICAgICJERVIiLCAiUlUyIiwgIlJVMyIsICJSVTQiLAorICAgICAgICAgICAgIkZPTiIsICJSREMiLCAiVFIiICwgIlJURCIsCisgICAgICAgICAgICAiRURNIiwgIkNSIiAsICJFTk0iLCAiRU9DIiwKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBtU3BlY2lhbENoYXJNYXAgPSB7CisgICAgICAgICAgICAiXHUwMEFFIiwKKyAgICAgICAgICAgICJcdTAwQjAiLAorICAgICAgICAgICAgIlx1MDBCRCIsCisgICAgICAgICAgICAiXHUwMEJGIiwKKyAgICAgICAgICAgICJcdTIxMjIiLAorICAgICAgICAgICAgIlx1MDBBMiIsCisgICAgICAgICAgICAiXHUwMEEzIiwKKyAgICAgICAgICAgICJcdTI2NkEiLCAvLyBFaWdodGggbm90ZQorICAgICAgICAgICAgIlx1MDBFMCIsCisgICAgICAgICAgICAiXHUwMEEwIiwgLy8gVHJhbnNwYXJlbnQgc3BhY2UKKyAgICAgICAgICAgICJcdTAwRTgiLAorICAgICAgICAgICAgIlx1MDBFMiIsCisgICAgICAgICAgICAiXHUwMEVBIiwKKyAgICAgICAgICAgICJcdTAwRUUiLAorICAgICAgICAgICAgIlx1MDBGNCIsCisgICAgICAgICAgICAiXHUwMEZCIiwKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBtU3BhbmlzaENoYXJNYXAgPSB7CisgICAgICAgICAgICAvLyBTcGFuaXNoIGFuZCBtaXNjIGNoYXJzCisgICAgICAgICAgICAiXHUwMEMxIiwgLy8gQQorICAgICAgICAgICAgIlx1MDBDOSIsIC8vIEUKKyAgICAgICAgICAgICJcdTAwRDMiLCAvLyBJCisgICAgICAgICAgICAiXHUwMERBIiwgLy8gTworICAgICAgICAgICAgIlx1MDBEQyIsIC8vIFUKKyAgICAgICAgICAgICJcdTAwRkMiLCAvLyB1CisgICAgICAgICAgICAiXHUyMDE4IiwgLy8gb3BlbmluZyBzaW5nbGUgcXVvdGUKKyAgICAgICAgICAgICJcdTAwQTEiLCAvLyBpbnZlcnRlZCBleGNsYW1hdGlvbiBtYXJrCisgICAgICAgICAgICAiKiIsCisgICAgICAgICAgICAiJyIsCisgICAgICAgICAgICAiXHUyMDE0IiwgLy8gZW0gZGFzaAorICAgICAgICAgICAgIlx1MDBBOSIsIC8vIENvcHlyaWdodAorICAgICAgICAgICAgIlx1MjEyMCIsIC8vIFNlcnZpY2VtYXJrCisgICAgICAgICAgICAiXHUyMDIyIiwgLy8gcm91bmQgYnVsbGV0CisgICAgICAgICAgICAiXHUyMDFDIiwgLy8gb3BlbmluZyBkb3VibGUgcXVvdGUKKyAgICAgICAgICAgICJcdTIwMUQiLCAvLyBjbG9zaW5nIGRvdWJsZSBxdW90ZQorICAgICAgICAgICAgLy8gRnJlbmNoCisgICAgICAgICAgICAiXHUwMEMwIiwKKyAgICAgICAgICAgICJcdTAwQzIiLAorICAgICAgICAgICAgIlx1MDBDNyIsCisgICAgICAgICAgICAiXHUwMEM4IiwKKyAgICAgICAgICAgICJcdTAwQ0EiLAorICAgICAgICAgICAgIlx1MDBDQiIsCisgICAgICAgICAgICAiXHUwMEVCIiwKKyAgICAgICAgICAgICJcdTAwQ0UiLAorICAgICAgICAgICAgIlx1MDBDRiIsCisgICAgICAgICAgICAiXHUwMEVGIiwKKyAgICAgICAgICAgICJcdTAwRDQiLAorICAgICAgICAgICAgIlx1MDBEOSIsCisgICAgICAgICAgICAiXHUwMEY5IiwKKyAgICAgICAgICAgICJcdTAwREIiLAorICAgICAgICAgICAgIlx1MDBBQiIsCisgICAgICAgICAgICAiXHUwMEJCIgorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1Qcm90dWd1ZXNlQ2hhck1hcCA9IHsKKyAgICAgICAgICAgIC8vIFBvcnR1Z3Vlc2UKKyAgICAgICAgICAgICJcdTAwQzMiLAorICAgICAgICAgICAgIlx1MDBFMyIsCisgICAgICAgICAgICAiXHUwMENEIiwKKyAgICAgICAgICAgICJcdTAwQ0MiLAorICAgICAgICAgICAgIlx1MDBFQyIsCisgICAgICAgICAgICAiXHUwMEQyIiwKKyAgICAgICAgICAgICJcdTAwRjIiLAorICAgICAgICAgICAgIlx1MDBENSIsCisgICAgICAgICAgICAiXHUwMEY1IiwKKyAgICAgICAgICAgICJ7IiwKKyAgICAgICAgICAgICJ9IiwKKyAgICAgICAgICAgICJcXCIsCisgICAgICAgICAgICAiXiIsCisgICAgICAgICAgICAiXyIsCisgICAgICAgICAgICAifCIsCisgICAgICAgICAgICAifiIsCisgICAgICAgICAgICAvLyBHZXJtYW4gYW5kIG1pc2MgY2hhcnMKKyAgICAgICAgICAgICJcdTAwQzQiLAorICAgICAgICAgICAgIlx1MDBFNCIsCisgICAgICAgICAgICAiXHUwMEQ2IiwKKyAgICAgICAgICAgICJcdTAwRjYiLAorICAgICAgICAgICAgIlx1MDBERiIsCisgICAgICAgICAgICAiXHUwMEE1IiwKKyAgICAgICAgICAgICJcdTAwQTQiLAorICAgICAgICAgICAgIlx1MjUwMiIsIC8vIHZlcnRpY2FsIGJhcgorICAgICAgICAgICAgIlx1MDBDNSIsCisgICAgICAgICAgICAiXHUwMEU1IiwKKyAgICAgICAgICAgICJcdTAwRDgiLAorICAgICAgICAgICAgIlx1MDBGOCIsCisgICAgICAgICAgICAiXHUyNTBDIiwgLy8gdG9wLWxlZnQgY29ybmVyCisgICAgICAgICAgICAiXHUyNTEwIiwgLy8gdG9wLXJpZ2h0IGNvcm5lcgorICAgICAgICAgICAgIlx1MjUxNCIsIC8vIGxvd2VyLWxlZnQgY29ybmVyCisgICAgICAgICAgICAiXHUyNTE4IiwgLy8gbG93ZXItcmlnaHQgY29ybmVyCisgICAgICAgIH07CisKKyAgICAgICAgc3RhdGljIENDRGF0YVtdIGZyb21CeXRlQXJyYXkoYnl0ZVtdIGRhdGEpIHsKKyAgICAgICAgICAgIENDRGF0YVtdIGNjRGF0YSA9IG5ldyBDQ0RhdGFbZGF0YS5sZW5ndGggLyAzXTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjY0RhdGEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjY0RhdGFbaV0gPSBuZXcgQ0NEYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtpICogM10sCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2kgKiAzICsgMV0sCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2kgKiAzICsgMl0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gY2NEYXRhOworICAgICAgICB9CisKKyAgICAgICAgQ0NEYXRhKGJ5dGUgdHlwZSwgYnl0ZSBkYXRhMSwgYnl0ZSBkYXRhMikgeworICAgICAgICAgICAgbVR5cGUgPSB0eXBlOworICAgICAgICAgICAgbURhdGExID0gZGF0YTE7CisgICAgICAgICAgICBtRGF0YTIgPSBkYXRhMjsKKyAgICAgICAgfQorCisgICAgICAgIGludCBnZXRDdHJsQ29kZSgpIHsKKyAgICAgICAgICAgIGlmICgobURhdGExID09IDB4MTQgfHwgbURhdGExID09IDB4MWMpCisgICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDIwICYmIG1EYXRhMiA8PSAweDJmKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1EYXRhMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEOworICAgICAgICB9CisKKyAgICAgICAgU3R5bGVDb2RlIGdldE1pZFJvdygpIHsKKyAgICAgICAgICAgIC8vIG9ubHkgc3VwcG9ydCBzdGFuZGFyZCBNaWQtcm93IGNvZGVzLCBpZ25vcmUKKyAgICAgICAgICAgIC8vIG9wdGlvbmFsIGJhY2tncm91bmQvZm9yZWdyb3VuZCBtaWQtcm93IGNvZGVzCisgICAgICAgICAgICBpZiAoKG1EYXRhMSA9PSAweDExIHx8IG1EYXRhMSA9PSAweDE5KQorICAgICAgICAgICAgICAgICAgICAmJiBtRGF0YTIgPj0gMHgyMCAmJiBtRGF0YTIgPD0gMHgyZikgeworICAgICAgICAgICAgICAgIHJldHVybiBTdHlsZUNvZGUuZnJvbUJ5dGUobURhdGEyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgUEFDIGdldFBBQygpIHsKKyAgICAgICAgICAgIGlmICgobURhdGExICYgMHg3MCkgPT0gMHgxMAorICAgICAgICAgICAgICAgICAgICAmJiAobURhdGEyICYgMHg0MCkgPT0gMHg0MAorICAgICAgICAgICAgICAgICAgICAmJiAoKG1EYXRhMSAmIDB4MDcpICE9IDAgfHwgKG1EYXRhMiAmIDB4MjApID09IDApKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFBBQy5mcm9tQnl0ZXMobURhdGExLCBtRGF0YTIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpbnQgZ2V0VGFiT2Zmc2V0KCkgeworICAgICAgICAgICAgaWYgKChtRGF0YTEgPT0gMHgxNyB8fCBtRGF0YTEgPT0gMHgxZikKKyAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MjEgJiYgbURhdGEyIDw9IDB4MjMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbURhdGEyICYgMHgzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGlzRGlzcGxheWFibGVDaGFyKCkgeworICAgICAgICAgICAgcmV0dXJuIGlzQmFzaWNDaGFyKCkgfHwgaXNTcGVjaWFsQ2hhcigpIHx8IGlzRXh0ZW5kZWRDaGFyKCk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgZ2V0RGlzcGxheVRleHQoKSB7CisgICAgICAgICAgICBTdHJpbmcgc3RyID0gZ2V0QmFzaWNDaGFycygpOworCisgICAgICAgICAgICBpZiAoc3RyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzdHIgPSAgZ2V0U3BlY2lhbENoYXIoKTsKKworICAgICAgICAgICAgICAgIGlmIChzdHIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzdHIgPSBnZXRFeHRlbmRlZENoYXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBzdHI7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyBjdHJsQ29kZVRvU3RyaW5nKGludCBjdHJsQ29kZSkgeworICAgICAgICAgICAgcmV0dXJuIG1DdHJsQ29kZU1hcFtjdHJsQ29kZSAtIDB4MjBdOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzQmFzaWNDaGFyKCkgeworICAgICAgICAgICAgcmV0dXJuIG1EYXRhMSA+PSAweDIwICYmIG1EYXRhMSA8PSAweDdmOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzU3BlY2lhbENoYXIoKSB7CisgICAgICAgICAgICByZXR1cm4gKChtRGF0YTEgPT0gMHgxMSB8fCBtRGF0YTEgPT0gMHgxOSkKKyAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MzAgJiYgbURhdGEyIDw9IDB4M2YpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzRXh0ZW5kZWRDaGFyKCkgeworICAgICAgICAgICAgcmV0dXJuICgobURhdGExID09IDB4MTIgfHwgbURhdGExID09IDB4MUEKKyAgICAgICAgICAgICAgICAgICAgfHwgbURhdGExID09IDB4MTMgfHwgbURhdGExID09IDB4MUIpCisgICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDIwICYmIG1EYXRhMiA8PSAweDNmKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgY2hhciBnZXRCYXNpY0NoYXIoYnl0ZSBkYXRhKSB7CisgICAgICAgICAgICBjaGFyIGM7CisgICAgICAgICAgICAvLyByZXBsYWNlIHRoZSBub24tQVNDSUkgb25lcworICAgICAgICAgICAgc3dpdGNoIChkYXRhKSB7CisgICAgICAgICAgICAgICAgY2FzZSAweDJBOiBjID0gJ1x1MDBFMSc7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHg1QzogYyA9ICdcdTAwRTknOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4NUU6IGMgPSAnXHUwMEVEJzsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDVGOiBjID0gJ1x1MDBGMyc7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHg2MDogYyA9ICdcdTAwRkEnOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4N0I6IGMgPSAnXHUwMEU3JzsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDdDOiBjID0gJ1x1MDBGNyc7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHg3RDogYyA9ICdcdTAwRDEnOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4N0U6IGMgPSAnXHUwMEYxJzsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDdGOiBjID0gJ1x1MjU4OCc7IGJyZWFrOyAvLyBGdWxsIGJsb2NrCisgICAgICAgICAgICAgICAgZGVmYXVsdDogYyA9IChjaGFyKSBkYXRhOyBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QmFzaWNDaGFycygpIHsKKyAgICAgICAgICAgIGlmIChtRGF0YTEgPj0gMHgyMCAmJiBtRGF0YTEgPD0gMHg3ZikgeworICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKDIpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGdldEJhc2ljQ2hhcihtRGF0YTEpKTsKKyAgICAgICAgICAgICAgICBpZiAobURhdGEyID49IDB4MjAgJiYgbURhdGEyIDw9IDB4N2YpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZ2V0QmFzaWNDaGFyKG1EYXRhMikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGdldFNwZWNpYWxDaGFyKCkgeworICAgICAgICAgICAgaWYgKChtRGF0YTEgPT0gMHgxMSB8fCBtRGF0YTEgPT0gMHgxOSkKKyAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MzAgJiYgbURhdGEyIDw9IDB4M2YpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNwZWNpYWxDaGFyTWFwW21EYXRhMiAtIDB4MzBdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGdldEV4dGVuZGVkQ2hhcigpIHsKKyAgICAgICAgICAgIGlmICgobURhdGExID09IDB4MTIgfHwgbURhdGExID09IDB4MUEpCisgICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDIwICYmIG1EYXRhMiA8PSAweDNmKXsKKyAgICAgICAgICAgICAgICAvLyAxIFNwYW5pc2gvRnJlbmNoIGNoYXIKKyAgICAgICAgICAgICAgICByZXR1cm4gbVNwYW5pc2hDaGFyTWFwW21EYXRhMiAtIDB4MjBdOworICAgICAgICAgICAgfSBlbHNlIGlmICgobURhdGExID09IDB4MTMgfHwgbURhdGExID09IDB4MUIpCisgICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDIwICYmIG1EYXRhMiA8PSAweDNmKXsKKyAgICAgICAgICAgICAgICAvLyAxIFBvcnR1Z3Vlc2UvR2VybWFuL0RhbmlzaCBjaGFyCisgICAgICAgICAgICAgICAgcmV0dXJuIG1Qcm90dWd1ZXNlQ2hhck1hcFttRGF0YTIgLSAweDIwXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIFN0cmluZyBzdHI7CisKKyAgICAgICAgICAgIGlmIChtRGF0YTEgPCAweDEwICYmIG1EYXRhMiA8IDB4MTApIHsKKyAgICAgICAgICAgICAgICAvLyBOdWxsIFBhZCwgaWdub3JlCisgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlslZF1OdWxsOiAlMDJ4ICUwMngiLCBtVHlwZSwgbURhdGExLCBtRGF0YTIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgY3RybENvZGUgPSBnZXRDdHJsQ29kZSgpOworICAgICAgICAgICAgaWYgKGN0cmxDb2RlICE9IElOVkFMSUQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWyVkXSVzIiwgbVR5cGUsIGN0cmxDb2RlVG9TdHJpbmcoY3RybENvZGUpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHRhYk9mZnNldCA9IGdldFRhYk9mZnNldCgpOworICAgICAgICAgICAgaWYgKHRhYk9mZnNldCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWyVkXVRhYiVkIiwgbVR5cGUsIHRhYk9mZnNldCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFBBQyBwYWMgPSBnZXRQQUMoKTsKKyAgICAgICAgICAgIGlmIChwYWMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJWRdUEFDOiAlcyIsIG1UeXBlLCBwYWMudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0eWxlQ29kZSBtID0gZ2V0TWlkUm93KCk7CisgICAgICAgICAgICBpZiAobSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlslZF1NaWQtcm93OiAlcyIsIG1UeXBlLCBtLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaXNEaXNwbGF5YWJsZUNoYXIoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJWRdRGlzcGxheWFibGU6ICVzICglMDJ4ICUwMngpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UeXBlLCBnZXREaXNwbGF5VGV4dCgpLCBtRGF0YTEsIG1EYXRhMik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJWRdSW52YWxpZDogJTAyeCAlMDJ4IiwgbVR5cGUsIG1EYXRhMSwgbURhdGEyKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBXaWRnZXQgY2FwYWJsZSBvZiByZW5kZXJpbmcgQ0VBLTYwOCBjbG9zZWQgY2FwdGlvbnMuCisgKi8KK2NsYXNzIENlYTYwOENDV2lkZ2V0IGV4dGVuZHMgQ2xvc2VkQ2FwdGlvbldpZGdldCBpbXBsZW1lbnRzIENlYTYwOENDUGFyc2VyLkRpc3BsYXlMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVjdCBtVGV4dEJvdW5kcyA9IG5ldyBSZWN0KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG1EdW1teVRleHQgPSAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCI7CisKKyAgICBwdWJsaWMgQ2VhNjA4Q0NXaWRnZXQoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIENlYTYwOENDV2lkZ2V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOworICAgIH0KKworICAgIHB1YmxpYyBDZWE2MDhDQ1dpZGdldChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2VhNjA4Q0NXaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsCisgICAgICAgICAgICBpbnQgZGVmU3R5bGVSZXMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgZGVmU3R5bGVSZXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDbG9zZWRDYXB0aW9uTGF5b3V0IGNyZWF0ZUNhcHRpb25MYXlvdXQoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBuZXcgQ0NMYXlvdXQoY29udGV4dCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EaXNwbGF5Q2hhbmdlZChTcGFubmFibGVTdHJpbmdCdWlsZGVyW10gc3R5bGVkVGV4dHMpIHsKKyAgICAgICAgKChDQ0xheW91dCkgbUNsb3NlZENhcHRpb25MYXlvdXQpLnVwZGF0ZShzdHlsZWRUZXh0cyk7CisKKyAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTGlzdGVuZXIub25DaGFuZ2VkKHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENhcHRpb25TdHlsZSBnZXRDYXB0aW9uU3R5bGUoKSB7CisgICAgICAgIHJldHVybiBtQ2FwdGlvblN0eWxlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENDTGluZUJveCBleHRlbmRzIFRleHRWaWV3IHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgRk9OVF9QQURESU5HX1JBVElPID0gMC43NWY7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEVER0VfT1VUTElORV9SQVRJTyA9IDAuMWY7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEVER0VfU0hBRE9XX1JBVElPID0gMC4wNWY7CisgICAgICAgIHByaXZhdGUgZmxvYXQgbU91dGxpbmVXaWR0aDsKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBtU2hhZG93UmFkaXVzOworICAgICAgICBwcml2YXRlIGZsb2F0IG1TaGFkb3dPZmZzZXQ7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVRleHRDb2xvciA9IENvbG9yLldISVRFOworICAgICAgICBwcml2YXRlIGludCBtQmdDb2xvciA9IENvbG9yLkJMQUNLOworICAgICAgICBwcml2YXRlIGludCBtRWRnZVR5cGUgPSBDYXB0aW9uU3R5bGUuRURHRV9UWVBFX05PTkU7CisgICAgICAgIHByaXZhdGUgaW50IG1FZGdlQ29sb3IgPSBDb2xvci5UUkFOU1BBUkVOVDsKKworICAgICAgICBDQ0xpbmVCb3goQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgICAgIHNldEdyYXZpdHkoR3Jhdml0eS5DRU5URVIpOworICAgICAgICAgICAgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yLlRSQU5TUEFSRU5UKTsKKyAgICAgICAgICAgIHNldFRleHRDb2xvcihDb2xvci5XSElURSk7CisgICAgICAgICAgICBzZXRUeXBlZmFjZShUeXBlZmFjZS5NT05PU1BBQ0UpOworICAgICAgICAgICAgc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMgPSBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCk7CisKKyAgICAgICAgICAgIC8vIGdldCB0aGUgZGVmYXVsdCAod2lsbCBiZSB1cGRhdGVkIGxhdGVyIGR1cmluZyBtZWFzdXJlKQorICAgICAgICAgICAgbU91dGxpbmVXaWR0aCA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uc3VidGl0bGVfb3V0bGluZV93aWR0aCk7CisgICAgICAgICAgICBtU2hhZG93UmFkaXVzID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zdWJ0aXRsZV9zaGFkb3dfcmFkaXVzKTsKKyAgICAgICAgICAgIG1TaGFkb3dPZmZzZXQgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN1YnRpdGxlX3NoYWRvd19vZmZzZXQpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRDYXB0aW9uU3R5bGUoQ2FwdGlvblN0eWxlIGNhcHRpb25TdHlsZSkgeworICAgICAgICAgICAgbVRleHRDb2xvciA9IGNhcHRpb25TdHlsZS5mb3JlZ3JvdW5kQ29sb3I7CisgICAgICAgICAgICBtQmdDb2xvciA9IGNhcHRpb25TdHlsZS5iYWNrZ3JvdW5kQ29sb3I7CisgICAgICAgICAgICBtRWRnZVR5cGUgPSBjYXB0aW9uU3R5bGUuZWRnZVR5cGU7CisgICAgICAgICAgICBtRWRnZUNvbG9yID0gY2FwdGlvblN0eWxlLmVkZ2VDb2xvcjsKKworICAgICAgICAgICAgc2V0VGV4dENvbG9yKG1UZXh0Q29sb3IpOworICAgICAgICAgICAgaWYgKG1FZGdlVHlwZSA9PSBDYXB0aW9uU3R5bGUuRURHRV9UWVBFX0RST1BfU0hBRE9XKSB7CisgICAgICAgICAgICAgICAgc2V0U2hhZG93TGF5ZXIobVNoYWRvd1JhZGl1cywgbVNoYWRvd09mZnNldCwgbVNoYWRvd09mZnNldCwgbUVkZ2VDb2xvcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNldFNoYWRvd0xheWVyKDAsIDAsIDAsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7CisgICAgICAgICAgICBmbG9hdCBmb250U2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUoaGVpZ2h0TWVhc3VyZVNwZWMpICogRk9OVF9QQURESU5HX1JBVElPOworICAgICAgICAgICAgc2V0VGV4dFNpemUoVHlwZWRWYWx1ZS5DT01QTEVYX1VOSVRfUFgsIGZvbnRTaXplKTsKKworICAgICAgICAgICAgbU91dGxpbmVXaWR0aCA9IEVER0VfT1VUTElORV9SQVRJTyAqIGZvbnRTaXplICsgMS4wZjsKKyAgICAgICAgICAgIG1TaGFkb3dSYWRpdXMgPSBFREdFX1NIQURPV19SQVRJTyAqIGZvbnRTaXplICsgMS4wZjs7CisgICAgICAgICAgICBtU2hhZG93T2Zmc2V0ID0gbVNoYWRvd1JhZGl1czsKKworICAgICAgICAgICAgLy8gc2V0IGZvbnQgc2NhbGUgaW4gdGhlIFggZGlyZWN0aW9uIHRvIG1hdGNoIHRoZSByZXF1aXJlZCB3aWR0aAorICAgICAgICAgICAgc2V0U2NhbGVYKDEuMGYpOworICAgICAgICAgICAgZ2V0UGFpbnQoKS5nZXRUZXh0Qm91bmRzKG1EdW1teVRleHQsIDAsIG1EdW1teVRleHQubGVuZ3RoKCksIG1UZXh0Qm91bmRzKTsKKyAgICAgICAgICAgIGZsb2F0IGFjdHVhbFRleHRXaWR0aCA9IG1UZXh0Qm91bmRzLndpZHRoKCk7CisgICAgICAgICAgICBmbG9hdCByZXF1aXJlZFRleHRXaWR0aCA9IE1lYXN1cmVTcGVjLmdldFNpemUod2lkdGhNZWFzdXJlU3BlYyk7CisgICAgICAgICAgICBzZXRTY2FsZVgocmVxdWlyZWRUZXh0V2lkdGggLyBhY3R1YWxUZXh0V2lkdGgpOworCisgICAgICAgICAgICBzdXBlci5vbk1lYXN1cmUod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgYykgeworICAgICAgICAgICAgaWYgKG1FZGdlVHlwZSA9PSBDYXB0aW9uU3R5bGUuRURHRV9UWVBFX1VOU1BFQ0lGSUVECisgICAgICAgICAgICAgICAgICAgIHx8IG1FZGdlVHlwZSA9PSBDYXB0aW9uU3R5bGUuRURHRV9UWVBFX05PTkUKKyAgICAgICAgICAgICAgICAgICAgfHwgbUVkZ2VUeXBlID09IENhcHRpb25TdHlsZS5FREdFX1RZUEVfRFJPUF9TSEFET1cpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGVzZSBlZGdlIHN0eWxlcyBkb24ndCByZXF1aXJlIGEgc2Vjb25kIHBhc3MKKyAgICAgICAgICAgICAgICBzdXBlci5vbkRyYXcoYyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUVkZ2VUeXBlID09IENhcHRpb25TdHlsZS5FREdFX1RZUEVfT1VUTElORSkgeworICAgICAgICAgICAgICAgIGRyYXdFZGdlT3V0bGluZShjKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gUmFpc2VkIG9yIGRlcHJlc3NlZAorICAgICAgICAgICAgICAgIGRyYXdFZGdlUmFpc2VkT3JEZXByZXNzZWQoYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZHJhd0VkZ2VPdXRsaW5lKENhbnZhcyBjKSB7CisgICAgICAgICAgICBUZXh0UGFpbnQgdGV4dFBhaW50ID0gZ2V0UGFpbnQoKTsKKworICAgICAgICAgICAgUGFpbnQuU3R5bGUgcHJldmlvdXNTdHlsZSA9IHRleHRQYWludC5nZXRTdHlsZSgpOworICAgICAgICAgICAgUGFpbnQuSm9pbiBwcmV2aW91c0pvaW4gPSB0ZXh0UGFpbnQuZ2V0U3Ryb2tlSm9pbigpOworICAgICAgICAgICAgZmxvYXQgcHJldmlvdXNXaWR0aCA9IHRleHRQYWludC5nZXRTdHJva2VXaWR0aCgpOworCisgICAgICAgICAgICBzZXRUZXh0Q29sb3IobUVkZ2VDb2xvcik7CisgICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3R5bGUoUGFpbnQuU3R5bGUuRklMTF9BTkRfU1RST0tFKTsKKyAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHJva2VKb2luKFBhaW50LkpvaW4uUk9VTkQpOworICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0cm9rZVdpZHRoKG1PdXRsaW5lV2lkdGgpOworCisgICAgICAgICAgICAvLyBEcmF3IG91dGxpbmUgYW5kIGJhY2tncm91bmQgb25seS4KKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjKTsKKworICAgICAgICAgICAgLy8gUmVzdG9yZSBvcmlnaW5hbCBzZXR0aW5ncy4KKyAgICAgICAgICAgIHNldFRleHRDb2xvcihtVGV4dENvbG9yKTsKKyAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHlsZShwcmV2aW91c1N0eWxlKTsKKyAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHJva2VKb2luKHByZXZpb3VzSm9pbik7CisgICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3Ryb2tlV2lkdGgocHJldmlvdXNXaWR0aCk7CisKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYmFja2dyb3VuZC4KKyAgICAgICAgICAgIHNldEJhY2tncm91bmRTcGFucyhDb2xvci5UUkFOU1BBUkVOVCk7CisgICAgICAgICAgICAvLyBEcmF3IGZvcmVncm91bmQgb25seS4KKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjKTsKKyAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIGJhY2tncm91bmQuCisgICAgICAgICAgICBzZXRCYWNrZ3JvdW5kU3BhbnMobUJnQ29sb3IpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGRyYXdFZGdlUmFpc2VkT3JEZXByZXNzZWQoQ2FudmFzIGMpIHsKKyAgICAgICAgICAgIFRleHRQYWludCB0ZXh0UGFpbnQgPSBnZXRQYWludCgpOworCisgICAgICAgICAgICBQYWludC5TdHlsZSBwcmV2aW91c1N0eWxlID0gdGV4dFBhaW50LmdldFN0eWxlKCk7CisgICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3R5bGUoUGFpbnQuU3R5bGUuRklMTCk7CisKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmFpc2VkID0gbUVkZ2VUeXBlID09IENhcHRpb25TdHlsZS5FREdFX1RZUEVfUkFJU0VEOworICAgICAgICAgICAgZmluYWwgaW50IGNvbG9yVXAgPSByYWlzZWQgPyBDb2xvci5XSElURSA6IG1FZGdlQ29sb3I7CisgICAgICAgICAgICBmaW5hbCBpbnQgY29sb3JEb3duID0gcmFpc2VkID8gbUVkZ2VDb2xvciA6IENvbG9yLldISVRFOworICAgICAgICAgICAgZmluYWwgZmxvYXQgb2Zmc2V0ID0gbVNoYWRvd1JhZGl1cyAvIDJmOworCisgICAgICAgICAgICAvLyBEcmF3IGJhY2tncm91bmQgYW5kIHRleHQgd2l0aCBzaGFkb3cgdXAKKyAgICAgICAgICAgIHNldFNoYWRvd0xheWVyKG1TaGFkb3dSYWRpdXMsIC1vZmZzZXQsIC1vZmZzZXQsIGNvbG9yVXApOworICAgICAgICAgICAgc3VwZXIub25EcmF3KGMpOworCisgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGJhY2tncm91bmQuCisgICAgICAgICAgICBzZXRCYWNrZ3JvdW5kU3BhbnMoQ29sb3IuVFJBTlNQQVJFTlQpOworCisgICAgICAgICAgICAvLyBEcmF3IHRleHQgd2l0aCBzaGFkb3cgZG93bgorICAgICAgICAgICAgc2V0U2hhZG93TGF5ZXIobVNoYWRvd1JhZGl1cywgK29mZnNldCwgK29mZnNldCwgY29sb3JEb3duKTsKKyAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjKTsKKworICAgICAgICAgICAgLy8gUmVzdG9yZSBzZXR0aW5ncworICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0eWxlKHByZXZpb3VzU3R5bGUpOworCisgICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBiYWNrZ3JvdW5kLgorICAgICAgICAgICAgc2V0QmFja2dyb3VuZFNwYW5zKG1CZ0NvbG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBzZXRCYWNrZ3JvdW5kU3BhbnMoaW50IGNvbG9yKSB7CisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCA9IGdldFRleHQoKTsKKyAgICAgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3Bhbm5hYmxlKSB7CisgICAgICAgICAgICAgICAgU3Bhbm5hYmxlIHNwYW5uYWJsZSA9IChTcGFubmFibGUpIHRleHQ7CisgICAgICAgICAgICAgICAgQ2VhNjA4Q0NQYXJzZXIuTXV0YWJsZUJhY2tncm91bmRDb2xvclNwYW5bXSBiZ1NwYW5zID0gc3Bhbm5hYmxlLmdldFNwYW5zKAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgc3Bhbm5hYmxlLmxlbmd0aCgpLCBDZWE2MDhDQ1BhcnNlci5NdXRhYmxlQmFja2dyb3VuZENvbG9yU3Bhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiZ1NwYW5zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGJnU3BhbnNbaV0uc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDQ0xheW91dCBleHRlbmRzIExpbmVhckxheW91dCBpbXBsZW1lbnRzIENsb3NlZENhcHRpb25MYXlvdXQgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1JPV1MgPSBDZWE2MDhDQ1BhcnNlci5NQVhfUk9XUzsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgU0FGRV9BUkVBX1JBVElPID0gMC45ZjsKKworICAgICAgICBwcml2YXRlIGZpbmFsIENDTGluZUJveFtdIG1MaW5lQm94ZXMgPSBuZXcgQ0NMaW5lQm94W01BWF9ST1dTXTsKKworICAgICAgICBDQ0xheW91dChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICAgICAgc2V0R3Jhdml0eShHcmF2aXR5LlNUQVJUKTsKKyAgICAgICAgICAgIHNldE9yaWVudGF0aW9uKExpbmVhckxheW91dC5WRVJUSUNBTCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9ST1dTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtTGluZUJveGVzW2ldID0gbmV3IENDTGluZUJveChnZXRDb250ZXh0KCkpOworICAgICAgICAgICAgICAgIGFkZFZpZXcobUxpbmVCb3hlc1tpXSwgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q2FwdGlvblN0eWxlKENhcHRpb25TdHlsZSBjYXB0aW9uU3R5bGUpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1JPV1M7IGkrKykgeworICAgICAgICAgICAgICAgIG1MaW5lQm94ZXNbaV0uc2V0Q2FwdGlvblN0eWxlKGNhcHRpb25TdHlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Rm9udFNjYWxlKGZsb2F0IGZvbnRTY2FsZSkgeworICAgICAgICAgICAgLy8gSWdub3JlcyB0aGUgZm9udCBzY2FsZSBjaGFuZ2VzIG9mIHRoZSBzeXN0ZW0gd2lkZSBDQyBwcmVmZXJlbmNlLgorICAgICAgICB9CisKKyAgICAgICAgdm9pZCB1cGRhdGUoU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcltdIHRleHRCdWZmZXIpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1JPV1M7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICh0ZXh0QnVmZmVyW2ldICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXS5zZXRUZXh0KHRleHRCdWZmZXJbaV0sIFRleHRWaWV3LkJ1ZmZlclR5cGUuU1BBTk5BQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXS5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uTWVhc3VyZSh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7CisKKyAgICAgICAgICAgIGludCBzYWZlV2lkdGggPSBnZXRNZWFzdXJlZFdpZHRoKCk7CisgICAgICAgICAgICBpbnQgc2FmZUhlaWdodCA9IGdldE1lYXN1cmVkSGVpZ2h0KCk7CisKKyAgICAgICAgICAgIC8vIENFQS02MDggYXNzdW1lcyA0OjMgdmlkZW8KKyAgICAgICAgICAgIGlmIChzYWZlV2lkdGggKiAzID49IHNhZmVIZWlnaHQgKiA0KSB7CisgICAgICAgICAgICAgICAgc2FmZVdpZHRoID0gc2FmZUhlaWdodCAqIDQgLyAzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzYWZlSGVpZ2h0ID0gc2FmZVdpZHRoICogMyAvIDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYWZlV2lkdGggKj0gU0FGRV9BUkVBX1JBVElPOworICAgICAgICAgICAgc2FmZUhlaWdodCAqPSBTQUZFX0FSRUFfUkFUSU87CisKKyAgICAgICAgICAgIGludCBsaW5lSGVpZ2h0ID0gc2FmZUhlaWdodCAvIE1BWF9ST1dTOworICAgICAgICAgICAgaW50IGxpbmVIZWlnaHRNZWFzdXJlU3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygKKyAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSk7CisgICAgICAgICAgICBpbnQgbGluZVdpZHRoTWVhc3VyZVNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoCisgICAgICAgICAgICAgICAgICAgIHNhZmVXaWR0aCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1JPV1M7IGkrKykgeworICAgICAgICAgICAgICAgIG1MaW5lQm94ZXNbaV0ubWVhc3VyZShsaW5lV2lkdGhNZWFzdXJlU3BlYywgbGluZUhlaWdodE1lYXN1cmVTcGVjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkxheW91dChib29sZWFuIGNoYW5nZWQsIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7CisgICAgICAgICAgICAvLyBzYWZlIGNhcHRpb24gYXJlYQorICAgICAgICAgICAgaW50IHZpZXdQb3J0V2lkdGggPSByIC0gbDsKKyAgICAgICAgICAgIGludCB2aWV3UG9ydEhlaWdodCA9IGIgLSB0OworICAgICAgICAgICAgaW50IHNhZmVXaWR0aCwgc2FmZUhlaWdodDsKKyAgICAgICAgICAgIC8vIENFQS02MDggYXNzdW1lcyA0OjMgdmlkZW8KKyAgICAgICAgICAgIGlmICh2aWV3UG9ydFdpZHRoICogMyA+PSB2aWV3UG9ydEhlaWdodCAqIDQpIHsKKyAgICAgICAgICAgICAgICBzYWZlV2lkdGggPSB2aWV3UG9ydEhlaWdodCAqIDQgLyAzOworICAgICAgICAgICAgICAgIHNhZmVIZWlnaHQgPSB2aWV3UG9ydEhlaWdodDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2FmZVdpZHRoID0gdmlld1BvcnRXaWR0aDsKKyAgICAgICAgICAgICAgICBzYWZlSGVpZ2h0ID0gdmlld1BvcnRXaWR0aCAqIDMgLyA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2FmZVdpZHRoICo9IFNBRkVfQVJFQV9SQVRJTzsKKyAgICAgICAgICAgIHNhZmVIZWlnaHQgKj0gU0FGRV9BUkVBX1JBVElPOworICAgICAgICAgICAgaW50IGxlZnQgPSAodmlld1BvcnRXaWR0aCAtIHNhZmVXaWR0aCkgLyAyOworICAgICAgICAgICAgaW50IHRvcCA9ICh2aWV3UG9ydEhlaWdodCAtIHNhZmVIZWlnaHQpIC8gMjsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfUk9XUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXS5sYXlvdXQoCisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgdG9wICsgc2FmZUhlaWdodCAqIGkgLyBNQVhfUk9XUywKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgKyBzYWZlV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICB0b3AgKyBzYWZlSGVpZ2h0ICogKGkgKyAxKSAvIE1BWF9ST1dTKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvTWVkaWFUaW1lUHJvdmlkZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvTWVkaWFUaW1lUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjM2ZDdmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9NZWRpYVRpbWVQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGU7CisKKy8vIE5vdGU6IFRoaXMgaXMganVzdCBjb3BpZWQgZnJvbSBhbmRyb2lkLm1lZGlhLk1lZGlhVGltZVByb3ZpZGVyLgorcHVibGljIGludGVyZmFjZSBNZWRpYVRpbWVQcm92aWRlciB7CisgICAgLy8gd2UgZG8gbm90IGFsbG93IG5lZ2F0aXZlIG1lZGlhIHRpbWUKKyAgICAvKioKKyAgICAgKiBQcmVzZW50YXRpb24gdGltZSB2YWx1ZSBpZiBubyB0aW1lZCBldmVudCBub3RpZmljYXRpb24gaXMgcmVxdWVzdGVkLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbG9uZyBOT19USU1FID0gLTE7CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWxzIGFsbCBwcmV2aW91cyBub3RpZmljYXRpb24gcmVxdWVzdCBmcm9tIHRoaXMgbGlzdGVuZXIgaWYgYW55LiAgSXQKKyAgICAgKiByZWdpc3RlcnMgdGhlIGxpc3RlbmVyIHRvIGdldCBzZWVrIGFuZCBzdG9wIG5vdGlmaWNhdGlvbnMuICBJZiB0aW1lVXMgaXMKKyAgICAgKiBub3QgbmVnYXRpdmUsIGl0IGFsc28gcmVnaXN0ZXJzIHRoZSBsaXN0ZW5lciBmb3IgYSB0aW1lZCBldmVudAorICAgICAqIG5vdGlmaWNhdGlvbiB3aGVuIHRoZSBwcmVzZW50YXRpb24gdGltZSByZWFjaGVzIChiZWNvbWVzIGdyZWF0ZXIpIHRoYW4KKyAgICAgKiB0aGUgdmFsdWUgc3BlY2lmaWVkLiAgVGhpcyBoYXBwZW5zIGltbWVkaWF0ZWx5IGlmIHRoZSBjdXJyZW50IG1lZGlhIHRpbWUKKyAgICAgKiBpcyBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byB0aW1lVXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGltZVVzIHByZXNlbnRhdGlvbiB0aW1lIHRvIGdldCB0aW1lZCBldmVudCBjYWxsYmFjayBhdCAob3IKKyAgICAgKiAgICAgICAgICAgICAgIHtAbGluayAjTk9fVElNRX0pCisgICAgICovCisgICAgcHVibGljIHZvaWQgbm90aWZ5QXQobG9uZyB0aW1lVXMsIE9uTWVkaWFUaW1lTGlzdGVuZXIgbGlzdGVuZXIpOworCisgICAgLyoqCisgICAgICogQ2FuY2VscyBhbGwgcHJldmlvdXMgbm90aWZpY2F0aW9uIHJlcXVlc3QgZnJvbSB0aGlzIGxpc3RlbmVyIGlmIGFueS4gIEl0CisgICAgICogcmVnaXN0ZXJzIHRoZSBsaXN0ZW5lciB0byBnZXQgc2VlayBhbmQgc3RvcCBub3RpZmljYXRpb25zLiAgSWYgdGhlIG1lZGlhCisgICAgICogaXMgc3RvcHBlZCwgdGhlIGxpc3RlbmVyIHdpbGwgaW1tZWRpYXRlbHkgcmVjZWl2ZSBhIHN0b3Agbm90aWZpY2F0aW9uLgorICAgICAqIE90aGVyd2lzZSwgaXQgd2lsbCByZWNlaXZlIGEgdGltZWQgZXZlbnQgbm90aWZpY2F0b24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2NoZWR1bGVVcGRhdGUoT25NZWRpYVRpbWVMaXN0ZW5lciBsaXN0ZW5lcik7CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWxzIGFsbCBwcmV2aW91cyBub3RpZmljYXRpb24gcmVxdWVzdCBmcm9tIHRoaXMgbGlzdGVuZXIgaWYgYW55LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNhbmNlbE5vdGlmaWNhdGlvbnMoT25NZWRpYVRpbWVMaXN0ZW5lciBsaXN0ZW5lcik7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGN1cnJlbnQgcHJlc2VudGF0aW9uIHRpbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlY2lzZSAgIFdoZXRoZXIgZ2V0dGluZyBhIHByZWNpc2UgdGltZSBpcyBpbXBvcnRhbnQuIFRoaXMgaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgIG1vcmUgY29zdGx5LgorICAgICAqIEBwYXJhbSBtb25vdG9uaWMgV2hldGhlciByZXR1cm5lZCB0aW1lIHNob3VsZCBiZSBtb25vdG9uaWM6IHRoYXQgaXMsCisgICAgICogICAgICAgICAgICAgICAgICBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGxhc3QgcmV0dXJuZWQgdGltZS4gIERvbid0CisgICAgICogICAgICAgICAgICAgICAgICBhbHdheXMgc2V0IHRoaXMgdG8gdHJ1ZS4gIEUuZy4gdGhpcyBoYXMgdW5kZXNpcmVkCisgICAgICogICAgICAgICAgICAgICAgICBjb25zZXF1ZW5jZXMgaWYgdGhlIG1lZGlhIGlzIHNlZWtlZCBiZXR3ZWVuIGNhbGxzLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBtZWRpYSBpcyBub3QgaW5pdGlhbGl6ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRDdXJyZW50VGltZVVzKGJvb2xlYW4gcHJlY2lzZSwgYm9vbGVhbiBtb25vdG9uaWMpCisgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOworCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgT25NZWRpYVRpbWVMaXN0ZW5lciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcmVnaXN0ZXJlZCB0aW1lIHdhcyByZWFjaGVkIG5hdHVyYWxseS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRpbWVVcyBjdXJyZW50IG1lZGlhIHRpbWUKKyAgICAgICAgICovCisgICAgICAgIHZvaWQgb25UaW1lZEV2ZW50KGxvbmcgdGltZVVzKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIG1lZGlhIHRpbWUgY2hhbmdlZCBkdWUgdG8gc2Vla2luZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRpbWVVcyBjdXJyZW50IG1lZGlhIHRpbWUKKyAgICAgICAgICovCisgICAgICAgIHZvaWQgb25TZWVrKGxvbmcgdGltZVVzKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHBsYXliYWNrIHN0b3BwZWQuICBUaGlzIGlzIG5vdCBjYWxsZWQgb24gcGF1c2UsIG9ubHkKKyAgICAgICAgICogb24gZnVsbCBzdG9wLCBhdCB3aGljaCBwb2ludCB0aGVyZSBpcyBubyBmdXJ0aGVyIGN1cnJlbnQgbWVkaWEgdGltZS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgb25TdG9wKCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL1N1YnRpdGxlQ29udHJvbGxlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9TdWJ0aXRsZUNvbnRyb2xsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGQ1NWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9TdWJ0aXRsZUNvbnRyb2xsZXIuamF2YQpAQCAtMCwwICsxLDUwOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZTsKKworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjIuVHJhY2tJbmZvOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQ2FwdGlvbmluZ01hbmFnZXI7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZS5TdWJ0aXRsZVRyYWNrLlJlbmRlcmluZ1dpZGdldDsKKworLy8gTm90ZTogVGhpcyBpcyBmb3JrZWQgZnJvbSBhbmRyb2lkLm1lZGlhLlN1YnRpdGxlQ29udHJvbGxlciBzaW5jZSBQCisvKioKKyAqIFRoZSBzdWJ0aXRsZSBjb250cm9sbGVyIHByb3ZpZGVzIHRoZSBhcmNoaXRlY3R1cmUgdG8gZGlzcGxheSBzdWJ0aXRsZXMgZm9yIGEKKyAqIG1lZGlhIHNvdXJjZS4gIEl0IGFsbG93cyBzcGVjaWZ5aW5nIHdoaWNoIHRyYWNrcyB0byBkaXNwbGF5LCBvbiB3aGljaCBhbmNob3IKKyAqIHRvIGRpc3BsYXkgdGhlbSwgYW5kIGFsc28gYWxsb3dzIGFkZGluZyBleHRlcm5hbCwgb3V0LW9mLWJhbmQgc3VidGl0bGUgdHJhY2tzLgorICovCitwdWJsaWMgY2xhc3MgU3VidGl0bGVDb250cm9sbGVyIHsKKyAgICBwcml2YXRlIE1lZGlhVGltZVByb3ZpZGVyIG1UaW1lUHJvdmlkZXI7CisgICAgcHJpdmF0ZSBWZWN0b3I8UmVuZGVyZXI+IG1SZW5kZXJlcnM7CisgICAgcHJpdmF0ZSBWZWN0b3I8U3VidGl0bGVUcmFjaz4gbVRyYWNrczsKKyAgICBwcml2YXRlIFN1YnRpdGxlVHJhY2sgbVNlbGVjdGVkVHJhY2s7CisgICAgcHJpdmF0ZSBib29sZWFuIG1TaG93aW5nOworICAgIHByaXZhdGUgQ2FwdGlvbmluZ01hbmFnZXIgbUNhcHRpb25pbmdNYW5hZ2VyOworICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlcjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXSEFUX1NIT1cgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXSEFUX0hJREUgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXSEFUX1NFTEVDVF9UUkFDSyA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdIQVRfU0VMRUNUX0RFRkFVTFRfVFJBQ0sgPSA0OworCisgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyLkNhbGxiYWNrIG1DYWxsYmFjayA9IG5ldyBIYW5kbGVyLkNhbGxiYWNrKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgeworICAgICAgICAgICAgY2FzZSBXSEFUX1NIT1c6CisgICAgICAgICAgICAgICAgZG9TaG93KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlIFdIQVRfSElERToKKyAgICAgICAgICAgICAgICBkb0hpZGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGNhc2UgV0hBVF9TRUxFQ1RfVFJBQ0s6CisgICAgICAgICAgICAgICAgZG9TZWxlY3RUcmFjaygoU3VidGl0bGVUcmFjayltc2cub2JqKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGNhc2UgV0hBVF9TRUxFQ1RfREVGQVVMVF9UUkFDSzoKKyAgICAgICAgICAgICAgICBkb1NlbGVjdERlZmF1bHRUcmFjaygpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBDYXB0aW9uaW5nTWFuYWdlci5DYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIgbUNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lciA9CisgICAgICAgIG5ldyBDYXB0aW9uaW5nTWFuYWdlci5DYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRW5hYmxlZENoYW5nZWQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgICAgICAgICAgc2VsZWN0RGVmYXVsdFRyYWNrKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25Mb2NhbGVDaGFuZ2VkKExvY2FsZSBsb2NhbGUpIHsKKyAgICAgICAgICAgICAgICBzZWxlY3REZWZhdWx0VHJhY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgIHB1YmxpYyBTdWJ0aXRsZUNvbnRyb2xsZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHN1YnRpdGxlIGNvbnRyb2xsZXIgZm9yIGEgbWVkaWEgcGxheWJhY2sgb2JqZWN0IHRoYXQgaW1wbGVtZW50cworICAgICAqIHRoZSBNZWRpYVRpbWVQcm92aWRlciBpbnRlcmZhY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGltZVByb3ZpZGVyCisgICAgICovCisgICAgcHVibGljIFN1YnRpdGxlQ29udHJvbGxlcigKKyAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgIE1lZGlhVGltZVByb3ZpZGVyIHRpbWVQcm92aWRlciwKKyAgICAgICAgICAgIExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIG1UaW1lUHJvdmlkZXIgPSB0aW1lUHJvdmlkZXI7CisgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworCisgICAgICAgIG1SZW5kZXJlcnMgPSBuZXcgVmVjdG9yPFJlbmRlcmVyPigpOworICAgICAgICBtU2hvd2luZyA9IGZhbHNlOworICAgICAgICBtVHJhY2tzID0gbmV3IFZlY3RvcjxTdWJ0aXRsZVRyYWNrPigpOworICAgICAgICBtQ2FwdGlvbmluZ01hbmFnZXIgPQorICAgICAgICAgICAgKENhcHRpb25pbmdNYW5hZ2VyKWNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNBUFRJT05JTkdfU0VSVklDRSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgbUNhcHRpb25pbmdNYW5hZ2VyLnJlbW92ZUNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICBtQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKTsKKyAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBhdmFpbGFibGUgc3VidGl0bGUgdHJhY2tzIGZvciB0aGlzIG1lZGlhLiBUaGVzZSBpbmNsdWRlCisgICAgICogdGhlIHRyYWNrcyBmb3VuZCBieSB7QGxpbmsgTWVkaWFQbGF5ZXJ9IGFzIHdlbGwgYXMgYW55IHRyYWNrcyBhZGRlZAorICAgICAqIG1hbnVhbGx5IHZpYSB7QGxpbmsgI2FkZFRyYWNrfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3VidGl0bGVUcmFja1tdIGdldFRyYWNrcygpIHsKKyAgICAgICAgc3luY2hyb25pemVkKG1UcmFja3MpIHsKKyAgICAgICAgICAgIFN1YnRpdGxlVHJhY2tbXSB0cmFja3MgPSBuZXcgU3VidGl0bGVUcmFja1ttVHJhY2tzLnNpemUoKV07CisgICAgICAgICAgICBtVHJhY2tzLnRvQXJyYXkodHJhY2tzKTsKKyAgICAgICAgICAgIHJldHVybiB0cmFja3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgc3VidGl0bGUgdHJhY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgU3VidGl0bGVUcmFjayBnZXRTZWxlY3RlZFRyYWNrKCkgeworICAgICAgICByZXR1cm4gbVNlbGVjdGVkVHJhY2s7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZW5kZXJpbmdXaWRnZXQgZ2V0UmVuZGVyaW5nV2lkZ2V0KCkgeworICAgICAgICBpZiAobVNlbGVjdGVkVHJhY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1TZWxlY3RlZFRyYWNrLmdldFJlbmRlcmluZ1dpZGdldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbGVjdHMgYSBzdWJ0aXRsZSB0cmFjay4gIEFzIGEgcmVzdWx0LCB0aGlzIHRyYWNrIHdpbGwgcmVjZWl2ZQorICAgICAqIGluLWJhbmQgZGF0YSBmcm9tIHRoZSB7QGxpbmsgTWVkaWFQbGF5ZXJ9LiAgSG93ZXZlciwgdGhpcyBkb2VzCisgICAgICogbm90IGNoYW5nZSB0aGUgc3VidGl0bGUgdmlzaWJpbGl0eS4KKyAgICAgKgorICAgICAqIFNob3VsZCBiZSBjYWxsZWQgZnJvbSB0aGUgYW5jaG9yJ3MgKFVJKSB0aHJlYWQuIHtAc2VlICNBbmNob3IuZ2V0U3VidGl0bGVMb29wZXJ9CisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhY2sgVGhlIHN1YnRpdGxlIHRyYWNrIHRvIHNlbGVjdC4gIFRoaXMgbXVzdCBiZSBvbmUgb2YgdGhlCisgICAgICogICAgICAgICAgICAgIHRyYWNrcyBpbiB7QGxpbmsgI2dldFRyYWNrc30uCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0cmFjayB3YXMgc3VjY2Vzc2Z1bGx5IHNlbGVjdGVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdFRyYWNrKFN1YnRpdGxlVHJhY2sgdHJhY2spIHsKKyAgICAgICAgaWYgKHRyYWNrICE9IG51bGwgJiYgIW1UcmFja3MuY29udGFpbnModHJhY2spKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwcm9jZXNzT25BbmNob3IobUhhbmRsZXIub2J0YWluTWVzc2FnZShXSEFUX1NFTEVDVF9UUkFDSywgdHJhY2spKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvU2VsZWN0VHJhY2soU3VidGl0bGVUcmFjayB0cmFjaykgeworICAgICAgICBtVHJhY2tJc0V4cGxpY2l0ID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrID09IHRyYWNrKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobVNlbGVjdGVkVHJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNlbGVjdGVkVHJhY2suaGlkZSgpOworICAgICAgICAgICAgbVNlbGVjdGVkVHJhY2suc2V0VGltZVByb3ZpZGVyKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgbVNlbGVjdGVkVHJhY2sgPSB0cmFjazsKKyAgICAgICAgaWYgKG1BbmNob3IgIT0gbnVsbCkgeworICAgICAgICAgICAgbUFuY2hvci5zZXRTdWJ0aXRsZVdpZGdldChnZXRSZW5kZXJpbmdXaWRnZXQoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVNlbGVjdGVkVHJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNlbGVjdGVkVHJhY2suc2V0VGltZVByb3ZpZGVyKG1UaW1lUHJvdmlkZXIpOworICAgICAgICAgICAgbVNlbGVjdGVkVHJhY2suc2hvdygpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTGlzdGVuZXIub25TdWJ0aXRsZVRyYWNrU2VsZWN0ZWQodHJhY2spOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCBzdWJ0aXRsZSB0cmFjayBiYXNlZCBvbiBzeXN0ZW0gcHJlZmVyZW5jZXMsIG9yIG51bGwsCisgICAgICogaWYgbm8gc3VjaCB0cmFjayBleGlzdHMgaW4gdGhpcyBtYW5hZ2VyLgorICAgICAqCisgICAgICogU3VwcG9ydHMgSExTLWZsYWdzOiBBVVRPU0VMRUNULCBGT1JDRUQgJiBERUZBVUxULgorICAgICAqCisgICAgICogMS4gSWYgY2FwdGlvbmluZyBpcyBkaXNhYmxlZCwgb25seSBjb25zaWRlciBGT1JDRUQgdHJhY2tzLiBPdGhlcndpc2UsCisgICAgICogY29uc2lkZXIgYWxsIHRyYWNrcywgYnV0IHByZWZlciBub24tRk9SQ0VEIG9uZXMuCisgICAgICogMi4gSWYgdXNlciBzZWxlY3RlZCAiRGVmYXVsdCIgY2FwdGlvbiBsYW5ndWFnZToKKyAgICAgKiAgIGEuIElmIHRoZXJlIGlzIGEgY29uc2lkZXJlZCB0cmFjayB3aXRoIERFRkFVTFQ9eWVzLCByZXR1cm5zIHRoYXQgdHJhY2sKKyAgICAgKiAgICAgIChmYXZvciB0aGUgZmlyc3Qgb25lIGluIHRoZSBjdXJyZW50IGxhbmd1YWdlIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4KKyAgICAgKiAgICAgIG9uZSBkZWZhdWx0IHRyYWNrcywgb3IgdGhlIGZpcnN0IGluIGdlbmVyYWwgaWYgbm9uZSBvZiB0aGVtIGFyZSBpbgorICAgICAqICAgICAgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UpLgorICAgICAqICAgYi4gT3RoZXJ3aXNlLCBpZiB0aGVyZSBpcyBhIHRyYWNrIHdpdGggQVVUT1NFTEVDVD15ZXMgaW4gdGhlIGN1cnJlbnQKKyAgICAgKiAgICAgIGxhbmd1YWdlLCByZXR1cm4gdGhhdCBvbmUuCisgICAgICogICBjLiBJZiB0aGVyZSBhcmUgbm8gZGVmYXVsdCB0cmFja3MsIGFuZCBubyBhdXRvc2VsZWN0YWJsZSB0cmFja3MgaW4gdGhlCisgICAgICogICAgICBjdXJyZW50IGxhbmd1YWdlLCByZXR1cm4gbnVsbC4KKyAgICAgKiAzLiBJZiB0aGVyZSBpcyBhIHRyYWNrIHdpdGggdGhlIGNhcHRpb24gbGFuZ3VhZ2UsIHNlbGVjdCB0aGF0IG9uZS4gIFByZWZlcgorICAgICAqIHRoZSBvbmUgd2l0aCBBVVRPU0VMRUNUPW5vLgorICAgICAqCisgICAgICogVGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGVzZSBmbGFncyBhcmUgREVGQVVMVD1ubywgQVVUT1NFTEVDVD15ZXMKKyAgICAgKiBhbmQgRk9SQ0VEPW5vLgorICAgICAqLworICAgIHB1YmxpYyBTdWJ0aXRsZVRyYWNrIGdldERlZmF1bHRUcmFjaygpIHsKKyAgICAgICAgU3VidGl0bGVUcmFjayBiZXN0VHJhY2sgPSBudWxsOworICAgICAgICBpbnQgYmVzdFNjb3JlID0gLTE7CisKKyAgICAgICAgTG9jYWxlIHNlbGVjdGVkTG9jYWxlID0gbUNhcHRpb25pbmdNYW5hZ2VyLmdldExvY2FsZSgpOworICAgICAgICBMb2NhbGUgbG9jYWxlID0gc2VsZWN0ZWRMb2NhbGU7CisgICAgICAgIGlmIChsb2NhbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgbG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHNlbGVjdEZvcmNlZCA9ICFtQ2FwdGlvbmluZ01hbmFnZXIuaXNFbmFibGVkKCk7CisKKyAgICAgICAgc3luY2hyb25pemVkKG1UcmFja3MpIHsKKyAgICAgICAgICAgIGZvciAoU3VidGl0bGVUcmFjayB0cmFjazogbVRyYWNrcykgeworICAgICAgICAgICAgICAgIE1lZGlhRm9ybWF0IGZvcm1hdCA9IHRyYWNrLmdldEZvcm1hdCgpOworICAgICAgICAgICAgICAgIFN0cmluZyBsYW5ndWFnZSA9IGZvcm1hdC5nZXRTdHJpbmcoTWVkaWFGb3JtYXQuS0VZX0xBTkdVQUdFKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIGZvcmNlZCA9CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9JU19GT1JDRURfU1VCVElUTEUsIDApICE9IDA7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBhdXRvc2VsZWN0ID0KKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0lTX0FVVE9TRUxFQ1QsIDEpICE9IDA7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBpc19kZWZhdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0lTX0RFRkFVTFQsIDApICE9IDA7CisKKyAgICAgICAgICAgICAgICBib29sZWFuIGxhbmd1YWdlTWF0Y2hlcyA9CisgICAgICAgICAgICAgICAgICAgIChsb2NhbGUgPT0gbnVsbCB8fAorICAgICAgICAgICAgICAgICAgICBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKS5lcXVhbHMoIiIpIHx8CisgICAgICAgICAgICAgICAgICAgIGxvY2FsZS5nZXRJU08zTGFuZ3VhZ2UoKS5lcXVhbHMobGFuZ3VhZ2UpIHx8CisgICAgICAgICAgICAgICAgICAgIGxvY2FsZS5nZXRMYW5ndWFnZSgpLmVxdWFscyhsYW5ndWFnZSkpOworICAgICAgICAgICAgICAgIC8vIGlzX2RlZmF1bHQgaXMgbWVhbmluZ2xlc3MgdW5sZXNzIGNhcHRpb24gbGFuZ3VhZ2UgaXMgJ2RlZmF1bHQnCisgICAgICAgICAgICAgICAgaW50IHNjb3JlID0gKGZvcmNlZCA/IDAgOiA4KSArCisgICAgICAgICAgICAgICAgICAgICgoKHNlbGVjdGVkTG9jYWxlID09IG51bGwpICYmIGlzX2RlZmF1bHQpID8gNCA6IDApICsKKyAgICAgICAgICAgICAgICAgICAgKGF1dG9zZWxlY3QgPyAwIDogMikgKyAobGFuZ3VhZ2VNYXRjaGVzID8gMSA6IDApOworCisgICAgICAgICAgICAgICAgaWYgKHNlbGVjdEZvcmNlZCAmJiAhZm9yY2VkKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHdlIHRyZWF0IG51bGwgbG9jYWxlL2xhbmd1YWdlIGFzIG1hdGNoaW5nIGFueSBsYW5ndWFnZQorICAgICAgICAgICAgICAgIGlmICgoc2VsZWN0ZWRMb2NhbGUgPT0gbnVsbCAmJiBpc19kZWZhdWx0KSB8fAorICAgICAgICAgICAgICAgICAgICAobGFuZ3VhZ2VNYXRjaGVzICYmCisgICAgICAgICAgICAgICAgICAgICAoYXV0b3NlbGVjdCB8fCBmb3JjZWQgfHwgc2VsZWN0ZWRMb2NhbGUgIT0gbnVsbCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzY29yZSA+IGJlc3RTY29yZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYmVzdFNjb3JlID0gc2NvcmU7CisgICAgICAgICAgICAgICAgICAgICAgICBiZXN0VHJhY2sgPSB0cmFjazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYmVzdFRyYWNrOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBtVHJhY2tJc0V4cGxpY2l0ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG1WaXNpYmlsaXR5SXNFeHBsaWNpdCA9IGZhbHNlOworCisgICAgLyoqIHNob3VsZCBiZSBjYWxsZWQgZnJvbSBhbmNob3IgdGhyZWFkICovCisgICAgcHVibGljIHZvaWQgc2VsZWN0RGVmYXVsdFRyYWNrKCkgeworICAgICAgICBwcm9jZXNzT25BbmNob3IobUhhbmRsZXIub2J0YWluTWVzc2FnZShXSEFUX1NFTEVDVF9ERUZBVUxUX1RSQUNLKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvU2VsZWN0RGVmYXVsdFRyYWNrKCkgeworICAgICAgICBpZiAobVRyYWNrSXNFeHBsaWNpdCkgeworICAgICAgICAgICAgLy8gSWYgdHJhY2sgc2VsZWN0aW9uIGlzIGV4cGxpY2l0LCBidXQgdmlzaWJpbGl0eQorICAgICAgICAgICAgLy8gaXMgbm90LCBpdCBmYWxscyBiYWNrIHRvIHRoZSBjYXB0aW9uaW5nIHNldHRpbmcKKyAgICAgICAgICAgIGlmICghbVZpc2liaWxpdHlJc0V4cGxpY2l0KSB7CisgICAgICAgICAgICAgICAgaWYgKG1DYXB0aW9uaW5nTWFuYWdlci5pc0VuYWJsZWQoKSB8fAorICAgICAgICAgICAgICAgICAgICAobVNlbGVjdGVkVHJhY2sgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkVHJhY2suZ2V0Rm9ybWF0KCkuZ2V0SW50ZWdlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUZvcm1hdC5LRVlfSVNfRk9SQ0VEX1NVQlRJVExFLCAwKSAhPSAwKSkgeworICAgICAgICAgICAgICAgICAgICBzaG93KCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtU2VsZWN0ZWRUcmFjayAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBtU2VsZWN0ZWRUcmFjay5nZXRUcmFja1R5cGUoKSA9PSBUcmFja0luZm8uTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSkgeworICAgICAgICAgICAgICAgICAgICBoaWRlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1WaXNpYmlsaXR5SXNFeHBsaWNpdCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gV2UgY2FuIGhhdmUgYSBkZWZhdWx0IChmb3JjZWQpIHRyYWNrIGV2ZW4gaWYgY2FwdGlvbmluZworICAgICAgICAvLyBpcyBub3QgZW5hYmxlZC4gIFRoaXMgaXMgaGFuZGxlZCBieSBnZXREZWZhdWx0VHJhY2soKS4KKyAgICAgICAgLy8gU2hvdyB0aGlzIHRyYWNrIHVubGVzcyBzdWJ0aXRsZXMgd2VyZSBleHBsaWNpdGx5IGhpZGRlbi4KKyAgICAgICAgU3VidGl0bGVUcmFjayB0cmFjayA9IGdldERlZmF1bHRUcmFjaygpOworICAgICAgICBpZiAodHJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgc2VsZWN0VHJhY2sodHJhY2spOworICAgICAgICAgICAgbVRyYWNrSXNFeHBsaWNpdCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKCFtVmlzaWJpbGl0eUlzRXhwbGljaXQpIHsKKyAgICAgICAgICAgICAgICBzaG93KCk7CisgICAgICAgICAgICAgICAgbVZpc2liaWxpdHlJc0V4cGxpY2l0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogbXVzdCBiZSBjYWxsZWQgZnJvbSBhbmNob3IgdGhyZWFkICovCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIGNoZWNrQW5jaG9yTG9vcGVyKCk7CisgICAgICAgIGhpZGUoKTsKKyAgICAgICAgc2VsZWN0VHJhY2sobnVsbCk7CisgICAgICAgIG1UcmFja3MuY2xlYXIoKTsKKyAgICAgICAgbVRyYWNrSXNFeHBsaWNpdCA9IGZhbHNlOworICAgICAgICBtVmlzaWJpbGl0eUlzRXhwbGljaXQgPSBmYWxzZTsKKyAgICAgICAgbUNhcHRpb25pbmdNYW5hZ2VyLnJlbW92ZUNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICBtQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbmV3LCBleHRlcm5hbCBzdWJ0aXRsZSB0cmFjayB0byB0aGUgbWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmb3JtYXQgdGhlIGZvcm1hdCBvZiB0aGUgdHJhY2sgdGhhdCB3aWxsIGluY2x1ZGUgYXQgbGVhc3QKKyAgICAgKiAgICAgICAgICAgICAgIHRoZSBNSU1FIHR5cGUge0BsaW5rIE1lZGlhRm9ybWF0QEtFWV9NSU1FfS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIHtAbGluayBTdWJ0aXRsZVRyYWNrfSBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgU3VidGl0bGVUcmFjayBhZGRUcmFjayhNZWRpYUZvcm1hdCBmb3JtYXQpIHsKKyAgICAgICAgc3luY2hyb25pemVkKG1SZW5kZXJlcnMpIHsKKyAgICAgICAgICAgIGZvciAoUmVuZGVyZXIgcmVuZGVyZXI6IG1SZW5kZXJlcnMpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVuZGVyZXIuc3VwcG9ydHMoZm9ybWF0KSkgeworICAgICAgICAgICAgICAgICAgICBTdWJ0aXRsZVRyYWNrIHRyYWNrID0gcmVuZGVyZXIuY3JlYXRlVHJhY2soZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZChtVHJhY2tzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1UcmFja3Muc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhcHRpb25pbmdNYW5hZ2VyLmFkZENhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNrcy5hZGQodHJhY2spOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWNrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNob3cgdGhlIHNlbGVjdGVkIChvciBkZWZhdWx0KSBzdWJ0aXRsZSB0cmFjay4KKyAgICAgKgorICAgICAqIFNob3VsZCBiZSBjYWxsZWQgZnJvbSB0aGUgYW5jaG9yJ3MgKFVJKSB0aHJlYWQuIHtAc2VlICNBbmNob3IuZ2V0U3VidGl0bGVMb29wZXJ9CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2hvdygpIHsKKyAgICAgICAgcHJvY2Vzc09uQW5jaG9yKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoV0hBVF9TSE9XKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvU2hvdygpIHsKKyAgICAgICAgbVNob3dpbmcgPSB0cnVlOworICAgICAgICBtVmlzaWJpbGl0eUlzRXhwbGljaXQgPSB0cnVlOworICAgICAgICBpZiAobVNlbGVjdGVkVHJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNlbGVjdGVkVHJhY2suc2hvdygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSGlkZSB0aGUgc2VsZWN0ZWQgKG9yIGRlZmF1bHQpIHN1YnRpdGxlIHRyYWNrLgorICAgICAqCisgICAgICogU2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSBhbmNob3IncyAoVUkpIHRocmVhZC4ge0BzZWUgI0FuY2hvci5nZXRTdWJ0aXRsZUxvb3Blcn0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBoaWRlKCkgeworICAgICAgICBwcm9jZXNzT25BbmNob3IobUhhbmRsZXIub2J0YWluTWVzc2FnZShXSEFUX0hJREUpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9IaWRlKCkgeworICAgICAgICBtVmlzaWJpbGl0eUlzRXhwbGljaXQgPSB0cnVlOworICAgICAgICBpZiAobVNlbGVjdGVkVHJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNlbGVjdGVkVHJhY2suaGlkZSgpOworICAgICAgICB9CisgICAgICAgIG1TaG93aW5nID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIGZvciBzdXBwb3J0aW5nIGEgc2luZ2xlIG9yIG11bHRpcGxlIHN1YnRpdGxlIHR5cGVzIGluIHtAbGluaworICAgICAqIE1lZGlhUGxheWVyfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFJlbmRlcmVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCBieSB7QGxpbmsgTWVkaWFQbGF5ZXJ9J3Mge0BsaW5rIFN1YnRpdGxlQ29udHJvbGxlcn0gd2hlbiBhIG5ldworICAgICAgICAgKiBzdWJ0aXRsZSB0cmFjayBpcyBkZXRlY3RlZCwgdG8gc2VlIGlmIGl0IHNob3VsZCB1c2UgdGhpcyBvYmplY3QgdG8KKyAgICAgICAgICogcGFyc2UgYW5kIGRpc3BsYXkgdGhpcyBzdWJ0aXRsZSB0cmFjay4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGZvcm1hdCB0aGUgZm9ybWF0IG9mIHRoZSB0cmFjayB0aGF0IHdpbGwgaW5jbHVkZSBhdCBsZWFzdAorICAgICAgICAgKiAgICAgICAgICAgICAgIHRoZSBNSU1FIHR5cGUge0BsaW5rIE1lZGlhRm9ybWF0QEtFWV9NSU1FfS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSB0cmFjayBmb3JtYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMKKyAgICAgICAgICogcmVuZGVyZXIKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN1cHBvcnRzKE1lZGlhRm9ybWF0IGZvcm1hdCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCBieSB7QGxpbmsgTWVkaWFQbGF5ZXJ9J3Mge0BsaW5rIFN1YnRpdGxlQ29udHJvbGxlcn0gZm9yIGVhY2gKKyAgICAgICAgICogc3VidGl0bGUgdHJhY2sgdGhhdCB3YXMgZGV0ZWN0ZWQgYW5kIGlzIHN1cHBvcnRlZCBieSB0aGlzIG9iamVjdCB0bworICAgICAgICAgKiBjcmVhdGUgYSB7QGxpbmsgU3VidGl0bGVUcmFja30gb2JqZWN0LiAgVGhpcyBvYmplY3Qgd2lsbCBiZSBjcmVhdGVkCisgICAgICAgICAqIGZvciBlYWNoIHRyYWNrIHRoYXQgd2FzIGZvdW5kLiAgSWYgdGhlIHRyYWNrIGlzIHNlbGVjdGVkIGZvciBkaXNwbGF5LAorICAgICAgICAgKiB0aGlzIG9iamVjdCB3aWxsIGJlIHVzZWQgdG8gcGFyc2UgYW5kIGRpc3BsYXkgdGhlIHRyYWNrIGRhdGEuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBmb3JtYXQgdGhlIGZvcm1hdCBvZiB0aGUgdHJhY2sgdGhhdCB3aWxsIGluY2x1ZGUgYXQgbGVhc3QKKyAgICAgICAgICogICAgICAgICAgICAgICB0aGUgTUlNRSB0eXBlIHtAbGluayBNZWRpYUZvcm1hdEBLRVlfTUlNRX0uCisgICAgICAgICAqIEByZXR1cm4gYSB7QGxpbmsgU3VidGl0bGVUcmFja30gb2JqZWN0IHRoYXQgd2lsbCBiZSB1c2VkIHRvIHBhcnNlCisgICAgICAgICAqIGFuZCByZW5kZXIgdGhlIHN1YnRpdGxlIHRyYWNrLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IFN1YnRpdGxlVHJhY2sgY3JlYXRlVHJhY2soTWVkaWFGb3JtYXQgZm9ybWF0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgc3VwcG9ydCBmb3IgYSBzdWJ0aXRsZSBmb3JtYXQgaW4ge0BsaW5rIE1lZGlhUGxheWVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZW5kZXJlciBhIHtAbGluayBTdWJ0aXRsZUNvbnRyb2xsZXIuUmVuZGVyZXJ9IG9iamVjdCB0aGF0IGFkZHMKKyAgICAgKiAgICAgICAgICAgICAgICAgc3VwcG9ydCBmb3IgYSBzdWJ0aXRsZSBmb3JtYXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJSZW5kZXJlcihSZW5kZXJlciByZW5kZXJlcikgeworICAgICAgICBzeW5jaHJvbml6ZWQobVJlbmRlcmVycykgeworICAgICAgICAgICAgLy8gVE9ETyBob3cgdG8gZ2V0IGF2YWlsYWJsZSByZW5kZXJlcnMgaW4gdGhlIHN5c3RlbQorICAgICAgICAgICAgaWYgKCFtUmVuZGVyZXJzLmNvbnRhaW5zKHJlbmRlcmVyKSkgeworICAgICAgICAgICAgICAgIC8vIFRPRE8gc2hvdWxkIGFkZGVkIHJlbmRlcmVycyBvdmVycmlkZSBleGlzdGluZyBvbmVzICh0byBhbGxvdyByZXBsYWNpbmc/KQorICAgICAgICAgICAgICAgIG1SZW5kZXJlcnMuYWRkKHJlbmRlcmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc1JlbmRlcmVyRm9yKE1lZGlhRm9ybWF0IGZvcm1hdCkgeworICAgICAgICBzeW5jaHJvbml6ZWQobVJlbmRlcmVycykgeworICAgICAgICAgICAgLy8gVE9ETyBob3cgdG8gZ2V0IGF2YWlsYWJsZSByZW5kZXJlcnMgaW4gdGhlIHN5c3RlbQorICAgICAgICAgICAgZm9yIChSZW5kZXJlciByZW5kZXJlcjogbVJlbmRlcmVycykgeworICAgICAgICAgICAgICAgIGlmIChyZW5kZXJlci5zdXBwb3J0cyhmb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN1YnRpdGxlIGFuY2hvciwgYW4gb2JqZWN0IHRoYXQgaXMgYWJsZSB0byBkaXNwbGF5IGEgc3VidGl0bGUgcmVuZGVyZXIsCisgICAgICogZS5nLiBhIFZpZGVvVmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIEFuY2hvciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBBbmNob3Igc2hvdWxkIHVzZSB0aGUgc3VwcGxpZWQgc3VidGl0bGUgcmVuZGVyaW5nIHdpZGdldCwgb3IKKyAgICAgICAgICogbm9uZSBpZiBpdCBpcyBudWxsLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGVXaWRnZXQoUmVuZGVyaW5nV2lkZ2V0IHN1YnRpdGxlV2lkZ2V0KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQW5jaG9ycyBwcm92aWRlIHRoZSBsb29wZXIgb24gd2hpY2ggYWxsIHRyYWNrIHZpc2liaWxpdHkgY2hhbmdlcworICAgICAgICAgKiAodHJhY2suc2hvdy9oaWRlLCBzZXRTdWJ0aXRsZVdpZGdldCkgd2lsbCB0YWtlIHBsYWNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIExvb3BlciBnZXRTdWJ0aXRsZUxvb3BlcigpOworICAgIH0KKworICAgIHByaXZhdGUgQW5jaG9yIG1BbmNob3I7CisKKyAgICAvKioKKyAgICAgKiAgY2FsbGVkIGZyb20gYW5jaG9yJ3MgbG9vcGVyIChpZiBhbnksIGJvdGggd2hlbiB1bnNldHRpbmcgYW5kCisgICAgICogIHNldHRpbmcpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QW5jaG9yKEFuY2hvciBhbmNob3IpIHsKKyAgICAgICAgaWYgKG1BbmNob3IgPT0gYW5jaG9yKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobUFuY2hvciAhPSBudWxsKSB7CisgICAgICAgICAgICBjaGVja0FuY2hvckxvb3BlcigpOworICAgICAgICAgICAgbUFuY2hvci5zZXRTdWJ0aXRsZVdpZGdldChudWxsKTsKKyAgICAgICAgfQorICAgICAgICBtQW5jaG9yID0gYW5jaG9yOworICAgICAgICBtSGFuZGxlciA9IG51bGw7CisgICAgICAgIGlmIChtQW5jaG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIobUFuY2hvci5nZXRTdWJ0aXRsZUxvb3BlcigpLCBtQ2FsbGJhY2spOworICAgICAgICAgICAgY2hlY2tBbmNob3JMb29wZXIoKTsKKyAgICAgICAgICAgIG1BbmNob3Iuc2V0U3VidGl0bGVXaWRnZXQoZ2V0UmVuZGVyaW5nV2lkZ2V0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrQW5jaG9yTG9vcGVyKCkgeworICAgICAgICBhc3NlcnQgbUhhbmRsZXIgIT0gbnVsbCA6ICJTaG91bGQgaGF2ZSBhIGxvb3BlciBhbHJlYWR5IjsKKyAgICAgICAgYXNzZXJ0IExvb3Blci5teUxvb3BlcigpID09IG1IYW5kbGVyLmdldExvb3BlcigpCisgICAgICAgICAgICAgICAgOiAiTXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgYW5jaG9yJ3MgbG9vcGVyIjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc09uQW5jaG9yKE1lc3NhZ2UgbSkgeworICAgICAgICBhc3NlcnQgbUhhbmRsZXIgIT0gbnVsbCA6ICJTaG91bGQgaGF2ZSBhIGxvb3BlciBhbHJlYWR5IjsKKyAgICAgICAgaWYgKExvb3Blci5teUxvb3BlcigpID09IG1IYW5kbGVyLmdldExvb3BlcigpKSB7CisgICAgICAgICAgICBtSGFuZGxlci5kaXNwYXRjaE1lc3NhZ2UobSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZShtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgTGlzdGVuZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBzdWJ0aXRsZSB0cmFjayBoYXMgYmVlbiBzZWxlY3RlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRyYWNrIHNlbGVjdGVkIHN1YnRpdGxlIHRyYWNrIG9yIG51bGwKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VidGl0bGVUcmFja1NlbGVjdGVkKFN1YnRpdGxlVHJhY2sgdHJhY2spOworICAgIH0KKworICAgIHByaXZhdGUgTGlzdGVuZXIgbUxpc3RlbmVyOworfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9TdWJ0aXRsZVRyYWNrLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL1N1YnRpdGxlVHJhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjkwNjRhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9TdWJ0aXRsZVRyYWNrLmphdmEKQEAgLTAsMCArMSw2OTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGU7CisKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyLlRyYWNrSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlN1YnRpdGxlRGF0YTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9uZ1NwYXJzZUFycmF5OworaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworLy8gTm90ZTogVGhpcyBpcyBmb3JrZWQgZnJvbSBhbmRyb2lkLm1lZGlhLlN1YnRpdGxlVHJhY2sgc2luY2UgUAorLyoqCisgKiBBIHN1YnRpdGxlIHRyYWNrIGFic3RyYWN0IGJhc2UgY2xhc3MgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgcGFyc2luZyBhbmQgZGlzcGxheWluZworICogYW4gaW5zdGFuY2Ugb2YgYSBwYXJ0aWN1bGFyIHR5cGUgb2Ygc3VidGl0bGUuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdWJ0aXRsZVRyYWNrIGltcGxlbWVudHMgTWVkaWFUaW1lUHJvdmlkZXIuT25NZWRpYVRpbWVMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTdWJ0aXRsZVRyYWNrIjsKKyAgICBwcml2YXRlIGxvbmcgbUxhc3RVcGRhdGVUaW1lTXM7CisgICAgcHJpdmF0ZSBsb25nIG1MYXN0VGltZU1zOworCisgICAgcHJpdmF0ZSBSdW5uYWJsZSBtUnVubmFibGU7CisKKyAgICBmaW5hbCBwcml2YXRlIExvbmdTcGFyc2VBcnJheTxSdW4+IG1SdW5zQnlFbmRUaW1lID0gbmV3IExvbmdTcGFyc2VBcnJheTxSdW4+KCk7CisgICAgZmluYWwgcHJpdmF0ZSBMb25nU3BhcnNlQXJyYXk8UnVuPiBtUnVuc0J5SUQgPSBuZXcgTG9uZ1NwYXJzZUFycmF5PFJ1bj4oKTsKKworICAgIHByaXZhdGUgQ3VlTGlzdCBtQ3VlczsKKyAgICBmaW5hbCBwcml2YXRlIFZlY3RvcjxDdWU+IG1BY3RpdmVDdWVzID0gbmV3IFZlY3RvcjxDdWU+KCk7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gbVZpc2libGU7CisKKyAgICBwdWJsaWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOworCisgICAgcHJvdGVjdGVkIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOworCisgICAgcHJpdmF0ZSBNZWRpYUZvcm1hdCBtRm9ybWF0OworCisgICAgcHVibGljIFN1YnRpdGxlVHJhY2soTWVkaWFGb3JtYXQgZm9ybWF0KSB7CisgICAgICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgIG1DdWVzID0gbmV3IEN1ZUxpc3QoKTsKKyAgICAgICAgY2xlYXJBY3RpdmVDdWVzKCk7CisgICAgICAgIG1MYXN0VGltZU1zID0gLTE7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIE1lZGlhRm9ybWF0IGdldEZvcm1hdCgpIHsKKyAgICAgICAgcmV0dXJuIG1Gb3JtYXQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIG1OZXh0U2NoZWR1bGVkVGltZU1zID0gLTE7CisKKyAgICBwdWJsaWMgdm9pZCBvbkRhdGEoU3VidGl0bGVEYXRhIGRhdGEpIHsKKyAgICAgICAgbG9uZyBydW5JRCA9IGRhdGEuZ2V0U3RhcnRUaW1lVXMoKSArIDE7CisgICAgICAgIG9uRGF0YShkYXRhLmdldERhdGEoKSwgdHJ1ZSAvKiBlb3MgKi8sIHJ1bklEKTsKKyAgICAgICAgc2V0UnVuRGlzY2FyZFRpbWVNcygKKyAgICAgICAgICAgICAgICBydW5JRCwKKyAgICAgICAgICAgICAgICAoZGF0YS5nZXRTdGFydFRpbWVVcygpICsgZGF0YS5nZXREdXJhdGlvblVzKCkpIC8gMTAwMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlcmUgaXMgaW5wdXQgZGF0YSBmb3IgdGhlIHN1YnRpdGxlIHRyYWNrLiAgVGhlCisgICAgICogY29tcGxldGUgc3VidGl0bGUgZm9yIGEgdHJhY2sgY2FuIGluY2x1ZGUgbXVsdGlwbGUgd2hvbGUgdW5pdHMKKyAgICAgKiAocnVucykuICBFYWNoIG9mIHRoZXNlIHVuaXRzIGNhbiBoYXZlIG11bHRpcGxlIHNlY3Rpb25zLiAgVGhlCisgICAgICogY29udGVudHMgb2YgYSBydW4gYXJlIHN1Ym1pdHRlZCBpbiBzZXF1ZW50aWFsIG9yZGVyLCB3aXRoIGVvcworICAgICAqIGluZGljYXRpbmcgdGhlIGxhc3Qgc2VjdGlvbiBvZiB0aGUgcnVuLiAgQ2FsbHMgZnJvbSBkaWZmZXJlbnQKKyAgICAgKiBydW5zIG11c3Qgbm90IGJlIGludGVybWl4ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YSBzdWJ0aXRsZSBkYXRhIGJ5dGUgYnVmZmVyCisgICAgICogQHBhcmFtIGVvcyB0cnVlIGlmIHRoaXMgaXMgdGhlIGxhc3Qgc2VjdGlvbiBvZiB0aGUgcnVuLgorICAgICAqIEBwYXJhbSBydW5JRCBtb3N0bHktdW5pcXVlIElEIGZvciB0aGlzIHJ1biBvZiBkYXRhLiAgU3VidGl0bGUgY3VlcworICAgICAqICAgICAgICAgICAgICB3aXRoIHJ1bklEIG9mIDAgYXJlIGRpc2NhcmRlZCBpbW1lZGlhdGVseSBhZnRlcgorICAgICAqICAgICAgICAgICAgICBkaXNwbGF5LiAgQ3VlcyB3aXRoIHJ1bklEIG9mIH4wIGFyZSBkaXNjYXJkZWQKKyAgICAgKiAgICAgICAgICAgICAgb25seSBhdCB0aGUgZGVsZXRpb24gb2YgdGhlIHRyYWNrIG9iamVjdC4gIEN1ZXMKKyAgICAgKiAgICAgICAgICAgICAgd2l0aCBvdGhlciBydW5JRC1zIGFyZSBkaXNjYXJkZWQgYXQgdGhlIGVuZCBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgcnVuLCB3aGljaCBkZWZhdWx0cyB0byB0aGUgbGF0ZXN0IHRpbWVzdGFtcCBvZgorICAgICAqICAgICAgICAgICAgICBhbnkgb2YgaXRzIGN1ZXMgKHdpdGggdGhpcyBydW5JRCkuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25EYXRhKGJ5dGVbXSBkYXRhLCBib29sZWFuIGVvcywgbG9uZyBydW5JRCk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiBhZGRpbmcgdGhlIHN1YnRpdGxlIHJlbmRlcmluZyB3aWRnZXQgdG8gdGhlIHZpZXcgaGllcmFyY2h5LAorICAgICAqIGFzIHdlbGwgYXMgd2hlbiBzaG93aW5nIG9yIGhpZGluZyB0aGUgc3VidGl0bGUgdHJhY2ssIG9yIHdoZW4gdGhlIHZpZGVvCisgICAgICogc3VyZmFjZSBwb3NpdGlvbiBoYXMgY2hhbmdlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHdpZGdldCB0aGF0IHJlbmRlcnMgdGhpcyBzdWJ0aXRsZSB0cmFjay4gRm9yIG1vc3QgcmVuZGVyZXJzCisgICAgICogICAgICAgICB0aGVyZSBzaG91bGQgYmUgYSBzaW5nbGUgc2hhcmVkIGluc3RhbmNlIHRoYXQgaXMgdXNlZCBmb3IgYWxsCisgICAgICogICAgICAgICB0cmFja3Mgc3VwcG9ydGVkIGJ5IHRoYXQgcmVuZGVyZXIsIGFzIGF0IG1vc3Qgb25lIHN1YnRpdGxlIHRyYWNrCisgICAgICogICAgICAgICBpcyB2aXNpYmxlIGF0IG9uZSB0aW1lLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBSZW5kZXJpbmdXaWRnZXQgZ2V0UmVuZGVyaW5nV2lkZ2V0KCk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZlIGN1ZXMgaGF2ZSBjaGFuZ2VkLCBhbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdWJ0aXRsZQorICAgICAqIHZpZXcgc2hvdWxkIGJlIHVwZGF0ZWQuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlVmlldyhWZWN0b3I8Q3VlPiBhY3RpdmVDdWVzKTsKKworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCB1cGRhdGVBY3RpdmVDdWVzKGJvb2xlYW4gcmVidWlsZCwgbG9uZyB0aW1lTXMpIHsKKyAgICAgICAgLy8gb3V0LW9mLW9yZGVyIHRpbWVzIG1lYW4gc2Vla2luZyBvciBuZXcgYWN0aXZlIGN1ZXMgYmVpbmcgYWRkZWQKKyAgICAgICAgLy8gKGR1cmluZyB0aGVpciBvd24gdGltZXNwYW4pCisgICAgICAgIGlmIChyZWJ1aWxkIHx8IG1MYXN0VXBkYXRlVGltZU1zID4gdGltZU1zKSB7CisgICAgICAgICAgICBjbGVhckFjdGl2ZUN1ZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvcihJdGVyYXRvcjxQYWlyPExvbmcsIEN1ZT4gPiBpdCA9CisgICAgICAgICAgICAgICAgbUN1ZXMuZW50cmllc0JldHdlZW4obUxhc3RVcGRhdGVUaW1lTXMsIHRpbWVNcykuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgIFBhaXI8TG9uZywgQ3VlPiBldmVudCA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgIEN1ZSBjdWUgPSBldmVudC5zZWNvbmQ7CisKKyAgICAgICAgICAgIGlmIChjdWUubUVuZFRpbWVNcyA9PSBldmVudC5maXJzdCkgeworICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBwYXN0IGN1ZXMKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIlJlbW92aW5nICIgKyBjdWUpOworICAgICAgICAgICAgICAgIG1BY3RpdmVDdWVzLnJlbW92ZShjdWUpOworICAgICAgICAgICAgICAgIGlmIChjdWUubVJ1bklEID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChjdWUubVN0YXJ0VGltZU1zID09IGV2ZW50LmZpcnN0KSB7CisgICAgICAgICAgICAgICAgLy8gYWRkIG5ldyBjdWVzCisgICAgICAgICAgICAgICAgLy8gVFJJQ0tZOiB0aGlzIHdpbGwgaGFwcGVuIGluIHN0YXJ0IG9yZGVyCisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJBZGRpbmcgIiArIGN1ZSk7CisgICAgICAgICAgICAgICAgaWYgKGN1ZS5tSW5uZXJUaW1lc01zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY3VlLm9uVGltZSh0aW1lTXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQWN0aXZlQ3Vlcy5hZGQoY3VlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VlLm1Jbm5lclRpbWVzTXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIGN1ZSBpcyBtb2RpZmllZAorICAgICAgICAgICAgICAgIGN1ZS5vblRpbWUodGltZU1zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIGNvbXBsZXRlIGFueSBydW5zICovCisgICAgICAgIHdoaWxlIChtUnVuc0J5RW5kVGltZS5zaXplKCkgPiAwICYmCisgICAgICAgICAgICAgICBtUnVuc0J5RW5kVGltZS5rZXlBdCgwKSA8PSB0aW1lTXMpIHsKKyAgICAgICAgICAgIHJlbW92ZVJ1bnNCeUVuZFRpbWVJbmRleCgwKTsgLy8gcmVtb3ZlcyBlbGVtZW50CisgICAgICAgIH0KKyAgICAgICAgbUxhc3RVcGRhdGVUaW1lTXMgPSB0aW1lTXM7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVJ1bnNCeUVuZFRpbWVJbmRleChpbnQgaXgpIHsKKyAgICAgICAgUnVuIHJ1biA9IG1SdW5zQnlFbmRUaW1lLnZhbHVlQXQoaXgpOworICAgICAgICB3aGlsZSAocnVuICE9IG51bGwpIHsKKyAgICAgICAgICAgIEN1ZSBjdWUgPSBydW4ubUZpcnN0Q3VlOworICAgICAgICAgICAgd2hpbGUgKGN1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUN1ZXMucmVtb3ZlKGN1ZSk7CisgICAgICAgICAgICAgICAgQ3VlIG5leHRDdWUgPSBjdWUubU5leHRJblJ1bjsKKyAgICAgICAgICAgICAgICBjdWUubU5leHRJblJ1biA9IG51bGw7CisgICAgICAgICAgICAgICAgY3VlID0gbmV4dEN1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SdW5zQnlJRC5yZW1vdmUocnVuLm1SdW5JRCk7CisgICAgICAgICAgICBSdW4gbmV4dFJ1biA9IHJ1bi5tTmV4dFJ1bkF0RW5kVGltZU1zOworICAgICAgICAgICAgcnVuLm1QcmV2UnVuQXRFbmRUaW1lTXMgPSBudWxsOworICAgICAgICAgICAgcnVuLm1OZXh0UnVuQXRFbmRUaW1lTXMgPSBudWxsOworICAgICAgICAgICAgcnVuID0gbmV4dFJ1bjsKKyAgICAgICAgfQorICAgICAgICBtUnVuc0J5RW5kVGltZS5yZW1vdmVBdChpeCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgLyogcmVtb3ZlIGFsbCBjdWVzICh1bnRhbmdsZSBhbGwgY3Jvc3MtbGlua3MpICovCisgICAgICAgIGludCBzaXplID0gbVJ1bnNCeUVuZFRpbWUuc2l6ZSgpOworICAgICAgICBmb3IoaW50IGl4ID0gc2l6ZSAtIDE7IGl4ID49IDA7IGl4LS0pIHsKKyAgICAgICAgICAgIHJlbW92ZVJ1bnNCeUVuZFRpbWVJbmRleChpeCk7CisgICAgICAgIH0KKworICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgdGFrZVRpbWUobG9uZyB0aW1lTXMpIHsKKyAgICAgICAgbUxhc3RUaW1lTXMgPSB0aW1lTXM7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyQWN0aXZlQ3VlcygpIHsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJDbGVhcmluZyAiICsgbUFjdGl2ZUN1ZXMuc2l6ZSgpICsgIiBhY3RpdmUgY3VlcyIpOworICAgICAgICBtQWN0aXZlQ3Vlcy5jbGVhcigpOworICAgICAgICBtTGFzdFVwZGF0ZVRpbWVNcyA9IC0xOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNjaGVkdWxlVGltZWRFdmVudHMoKSB7CisgICAgICAgIC8qIGdldCB0aW1lcyBmb3IgdGhlIG5leHQgZXZlbnQgKi8KKyAgICAgICAgaWYgKG1UaW1lUHJvdmlkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbU5leHRTY2hlZHVsZWRUaW1lTXMgPSBtQ3Vlcy5uZXh0VGltZUFmdGVyKG1MYXN0VGltZU1zKTsKKyAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAic2NoZWQgQCIgKyBtTmV4dFNjaGVkdWxlZFRpbWVNcyArICIgYWZ0ZXIgIiArIG1MYXN0VGltZU1zKTsKKyAgICAgICAgICAgIG1UaW1lUHJvdmlkZXIubm90aWZ5QXQoCisgICAgICAgICAgICAgICAgICAgIG1OZXh0U2NoZWR1bGVkVGltZU1zID49IDAgPworICAgICAgICAgICAgICAgICAgICAgICAgKG1OZXh0U2NoZWR1bGVkVGltZU1zICogMTAwMCkgOiBNZWRpYVRpbWVQcm92aWRlci5OT19USU1FLAorICAgICAgICAgICAgICAgICAgICB0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uVGltZWRFdmVudChsb25nIHRpbWVVcykgeworICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIm9uVGltZWRFdmVudCAiICsgdGltZVVzKTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBsb25nIHRpbWVNcyA9IHRpbWVVcyAvIDEwMDA7CisgICAgICAgICAgICB1cGRhdGVBY3RpdmVDdWVzKGZhbHNlLCB0aW1lTXMpOworICAgICAgICAgICAgdGFrZVRpbWUodGltZU1zKTsKKyAgICAgICAgfQorICAgICAgICB1cGRhdGVWaWV3KG1BY3RpdmVDdWVzKTsKKyAgICAgICAgc2NoZWR1bGVUaW1lZEV2ZW50cygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU2Vlayhsb25nIHRpbWVVcykgeworICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIm9uU2VlayAiICsgdGltZVVzKTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBsb25nIHRpbWVNcyA9IHRpbWVVcyAvIDEwMDA7CisgICAgICAgICAgICB1cGRhdGVBY3RpdmVDdWVzKHRydWUsIHRpbWVNcyk7CisgICAgICAgICAgICB0YWtlVGltZSh0aW1lTXMpOworICAgICAgICB9CisgICAgICAgIHVwZGF0ZVZpZXcobUFjdGl2ZUN1ZXMpOworICAgICAgICBzY2hlZHVsZVRpbWVkRXZlbnRzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdG9wKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAib25TdG9wIik7CisgICAgICAgICAgICBjbGVhckFjdGl2ZUN1ZXMoKTsKKyAgICAgICAgICAgIG1MYXN0VGltZU1zID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgdXBkYXRlVmlldyhtQWN0aXZlQ3Vlcyk7CisgICAgICAgIG1OZXh0U2NoZWR1bGVkVGltZU1zID0gLTE7CisgICAgICAgIG1UaW1lUHJvdmlkZXIubm90aWZ5QXQoTWVkaWFUaW1lUHJvdmlkZXIuTk9fVElNRSwgdGhpcyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE1lZGlhVGltZVByb3ZpZGVyIG1UaW1lUHJvdmlkZXI7CisKKyAgICBwdWJsaWMgdm9pZCBzaG93KCkgeworICAgICAgICBpZiAobVZpc2libGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1WaXNpYmxlID0gdHJ1ZTsKKyAgICAgICAgUmVuZGVyaW5nV2lkZ2V0IHJlbmRlcmluZ1dpZGdldCA9IGdldFJlbmRlcmluZ1dpZGdldCgpOworICAgICAgICBpZiAocmVuZGVyaW5nV2lkZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlbmRlcmluZ1dpZGdldC5zZXRWaXNpYmxlKHRydWUpOworICAgICAgICB9CisgICAgICAgIGlmIChtVGltZVByb3ZpZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1UaW1lUHJvdmlkZXIuc2NoZWR1bGVVcGRhdGUodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBoaWRlKCkgeworICAgICAgICBpZiAoIW1WaXNpYmxlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobVRpbWVQcm92aWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtVGltZVByb3ZpZGVyLmNhbmNlbE5vdGlmaWNhdGlvbnModGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgUmVuZGVyaW5nV2lkZ2V0IHJlbmRlcmluZ1dpZGdldCA9IGdldFJlbmRlcmluZ1dpZGdldCgpOworICAgICAgICBpZiAocmVuZGVyaW5nV2lkZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlbmRlcmluZ1dpZGdldC5zZXRWaXNpYmxlKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBtVmlzaWJsZSA9IGZhbHNlOworICAgIH0KKworICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhZGRDdWUoQ3VlIGN1ZSkgeworICAgICAgICBtQ3Vlcy5hZGQoY3VlKTsKKworICAgICAgICBpZiAoY3VlLm1SdW5JRCAhPSAwKSB7CisgICAgICAgICAgICBSdW4gcnVuID0gbVJ1bnNCeUlELmdldChjdWUubVJ1bklEKTsKKyAgICAgICAgICAgIGlmIChydW4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJ1biA9IG5ldyBSdW4oKTsKKyAgICAgICAgICAgICAgICBtUnVuc0J5SUQucHV0KGN1ZS5tUnVuSUQsIHJ1bik7CisgICAgICAgICAgICAgICAgcnVuLm1FbmRUaW1lTXMgPSBjdWUubUVuZFRpbWVNczsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocnVuLm1FbmRUaW1lTXMgPCBjdWUubUVuZFRpbWVNcykgeworICAgICAgICAgICAgICAgIHJ1bi5tRW5kVGltZU1zID0gY3VlLm1FbmRUaW1lTXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGxpbmstdXAgY3VlcyBpbiB0aGUgc2FtZSBydW4KKyAgICAgICAgICAgIGN1ZS5tTmV4dEluUnVuID0gcnVuLm1GaXJzdEN1ZTsKKyAgICAgICAgICAgIHJ1bi5tRmlyc3RDdWUgPSBjdWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiBhIGN1ZSBpcyBhZGRlZCB0aGF0IHNob3VsZCBiZSB2aXNpYmxlLCBuZWVkIHRvIHJlZnJlc2ggdmlldworICAgICAgICBsb25nIG5vd01zID0gLTE7CisgICAgICAgIGlmIChtVGltZVByb3ZpZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbm93TXMgPSBtVGltZVByb3ZpZGVyLmdldEN1cnJlbnRUaW1lVXMoCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBwcmVjaXNlICovLCB0cnVlIC8qIG1vbm90b25pYyAqLykgLyAxMDAwOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBoYW5kbGUgYXMgaXQgd2UgYXJlIG5vdCBwbGF5aW5nCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1WaXNpYmxlPSIgKyBtVmlzaWJsZSArICIsICIgKworICAgICAgICAgICAgICAgIGN1ZS5tU3RhcnRUaW1lTXMgKyAiIDw9ICIgKyBub3dNcyArICIsICIgKworICAgICAgICAgICAgICAgIGN1ZS5tRW5kVGltZU1zICsgIiA+PSAiICsgbUxhc3RUaW1lTXMpOworCisgICAgICAgIGlmIChtVmlzaWJsZSAmJgorICAgICAgICAgICAgICAgIGN1ZS5tU3RhcnRUaW1lTXMgPD0gbm93TXMgJiYKKyAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCB0cnVzdCBub3dNcywgc28gY2hlY2sgYW55IGN1ZSBzaW5jZSBsYXN0IGNhbGxiYWNrCisgICAgICAgICAgICAgICAgY3VlLm1FbmRUaW1lTXMgPj0gbUxhc3RUaW1lTXMpIHsKKyAgICAgICAgICAgIGlmIChtUnVubmFibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtUnVubmFibGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgU3VidGl0bGVUcmFjayB0cmFjayA9IHRoaXM7CisgICAgICAgICAgICBmaW5hbCBsb25nIHRoZW5NcyA9IG5vd01zOworICAgICAgICAgICAgbVJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiB3aXRoIHN5bmNocm9uaXplZCwgaXQgaXMgcG9zc2libGUgdGhhdCB3ZSBhcmUgZ29pbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gdG8gZG8gbXVsdGlwbGUgdXBkYXRlcyBhcyB0aGUgcnVubmFibGUgY291bGQgYmUgYWxyZWFkeQorICAgICAgICAgICAgICAgICAgICAvLyBydW5uaW5nLgorICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRyYWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUnVubmFibGUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQWN0aXZlQ3Vlcyh0cnVlLCB0aGVuTXMpOworICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlVmlldyhtQWN0aXZlQ3Vlcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgLy8gZGVsYXkgdXBkYXRlIHNvIHdlIGRvbid0IHVwZGF0ZSB2aWV3IG9uIGV2ZXJ5IGN1ZS4gIFRPRE8gd2h5IDEwPworICAgICAgICAgICAgaWYgKG1IYW5kbGVyLnBvc3REZWxheWVkKG1SdW5uYWJsZSwgMTAgLyogZGVsYXkgKi8pKSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJzY2hlZHVsaW5nIHVwZGF0ZSIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy53KFRBRywgImZhaWxlZCB0byBzY2hlZHVsZSBzdWJ0aXRsZSB2aWV3IHVwZGF0ZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVZpc2libGUgJiYKKyAgICAgICAgICAgICAgICBjdWUubUVuZFRpbWVNcyA+PSBtTGFzdFRpbWVNcyAmJgorICAgICAgICAgICAgICAgIChjdWUubVN0YXJ0VGltZU1zIDwgbU5leHRTY2hlZHVsZWRUaW1lTXMgfHwKKyAgICAgICAgICAgICAgICAgbU5leHRTY2hlZHVsZWRUaW1lTXMgPCAwKSkgeworICAgICAgICAgICAgc2NoZWR1bGVUaW1lZEV2ZW50cygpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRUaW1lUHJvdmlkZXIoTWVkaWFUaW1lUHJvdmlkZXIgdGltZVByb3ZpZGVyKSB7CisgICAgICAgIGlmIChtVGltZVByb3ZpZGVyID09IHRpbWVQcm92aWRlcikgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChtVGltZVByb3ZpZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1UaW1lUHJvdmlkZXIuY2FuY2VsTm90aWZpY2F0aW9ucyh0aGlzKTsKKyAgICAgICAgfQorICAgICAgICBtVGltZVByb3ZpZGVyID0gdGltZVByb3ZpZGVyOworICAgICAgICBpZiAobVRpbWVQcm92aWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtVGltZVByb3ZpZGVyLnNjaGVkdWxlVXBkYXRlKHRoaXMpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBzdGF0aWMgY2xhc3MgQ3VlTGlzdCB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ3VlTGlzdCI7CisgICAgICAgIC8vIHNpbXBsaXN0aWMsIGluZWZmaWNpZW50IGltcGxlbWVudGF0aW9uCisgICAgICAgIHByaXZhdGUgU29ydGVkTWFwPExvbmcsIFZlY3RvcjxDdWU+ID4gbUN1ZXM7CisgICAgICAgIHB1YmxpYyBib29sZWFuIERFQlVHID0gZmFsc2U7CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGFkZEV2ZW50KEN1ZSBjdWUsIGxvbmcgdGltZU1zKSB7CisgICAgICAgICAgICBWZWN0b3I8Q3VlPiBjdWVzID0gbUN1ZXMuZ2V0KHRpbWVNcyk7CisgICAgICAgICAgICBpZiAoY3VlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY3VlcyA9IG5ldyBWZWN0b3I8Q3VlPigyKTsKKyAgICAgICAgICAgICAgICBtQ3Vlcy5wdXQodGltZU1zLCBjdWVzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Vlcy5jb250YWlucyhjdWUpKSB7CisgICAgICAgICAgICAgICAgLy8gZG8gbm90IGR1cGxpY2F0ZSBjdWVzCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjdWVzLmFkZChjdWUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcmVtb3ZlRXZlbnQoQ3VlIGN1ZSwgbG9uZyB0aW1lTXMpIHsKKyAgICAgICAgICAgIFZlY3RvcjxDdWU+IGN1ZXMgPSBtQ3Vlcy5nZXQodGltZU1zKTsKKyAgICAgICAgICAgIGlmIChjdWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjdWVzLnJlbW92ZShjdWUpOworICAgICAgICAgICAgICAgIGlmIChjdWVzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1DdWVzLnJlbW92ZSh0aW1lTXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZChDdWUgY3VlKSB7CisgICAgICAgICAgICAvLyBpZ25vcmUgbm9uLXBvc2l0aXZlLWR1cmF0aW9uIGN1ZXMKKyAgICAgICAgICAgIGlmIChjdWUubVN0YXJ0VGltZU1zID49IGN1ZS5tRW5kVGltZU1zKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaWYgKCFhZGRFdmVudChjdWUsIGN1ZS5tU3RhcnRUaW1lTXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsb25nIGxhc3RUaW1lTXMgPSBjdWUubVN0YXJ0VGltZU1zOworICAgICAgICAgICAgaWYgKGN1ZS5tSW5uZXJUaW1lc01zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGxvbmcgdGltZU1zOiBjdWUubUlubmVyVGltZXNNcykgeworICAgICAgICAgICAgICAgICAgICBpZiAodGltZU1zID4gbGFzdFRpbWVNcyAmJiB0aW1lTXMgPCBjdWUubUVuZFRpbWVNcykgeworICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXZlbnQoY3VlLCB0aW1lTXMpOworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFRpbWVNcyA9IHRpbWVNczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYWRkRXZlbnQoY3VlLCBjdWUubUVuZFRpbWVNcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoQ3VlIGN1ZSkgeworICAgICAgICAgICAgcmVtb3ZlRXZlbnQoY3VlLCBjdWUubVN0YXJ0VGltZU1zKTsKKyAgICAgICAgICAgIGlmIChjdWUubUlubmVyVGltZXNNcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChsb25nIHRpbWVNczogY3VlLm1Jbm5lclRpbWVzTXMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRXZlbnQoY3VlLCB0aW1lTXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlbW92ZUV2ZW50KGN1ZSwgY3VlLm1FbmRUaW1lTXMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEl0ZXJhYmxlPFBhaXI8TG9uZywgQ3VlPj4gZW50cmllc0JldHdlZW4oCisgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBsYXN0VGltZU1zLCBmaW5hbCBsb25nIHRpbWVNcykgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBJdGVyYWJsZTxQYWlyPExvbmcsIEN1ZT4gPigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgSXRlcmF0b3I8UGFpcjxMb25nLCBDdWU+ID4gaXRlcmF0b3IoKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAic2xpY2UgKCIgKyBsYXN0VGltZU1zICsgIiwgIiArIHRpbWVNcyArICJdPSIpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnRyeUl0ZXJhdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3Vlcy5zdWJNYXAobGFzdFRpbWVNcyArIDEsIHRpbWVNcyArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnRyeUl0ZXJhdG9yKG51bGwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIG5leHRUaW1lQWZ0ZXIobG9uZyB0aW1lTXMpIHsKKyAgICAgICAgICAgIFNvcnRlZE1hcDxMb25nLCBWZWN0b3I8Q3VlPj4gdGFpbCA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRhaWwgPSBtQ3Vlcy50YWlsTWFwKHRpbWVNcyArIDEpOworICAgICAgICAgICAgICAgIGlmICh0YWlsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhaWwuZmlyc3RLZXkoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0gY2F0Y2goTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgRW50cnlJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPFBhaXI8TG9uZywgQ3VlPiA+IHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIW1Eb25lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBQYWlyPExvbmcsIEN1ZT4gbmV4dCgpIHsKKyAgICAgICAgICAgICAgICBpZiAobURvbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtTGFzdEVudHJ5ID0gbmV3IFBhaXI8TG9uZywgQ3VlPigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VGltZU1zLCBtTGlzdEl0ZXJhdG9yLm5leHQoKSk7CisgICAgICAgICAgICAgICAgbUxhc3RMaXN0SXRlcmF0b3IgPSBtTGlzdEl0ZXJhdG9yOworICAgICAgICAgICAgICAgIGlmICghbUxpc3RJdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dEtleSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbUxhc3RFbnRyeTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICAgICAgICAgICAgLy8gb25seSBhbGxvdyByZW1vdmluZyBlbmQgdGFncworICAgICAgICAgICAgICAgIGlmIChtTGFzdExpc3RJdGVyYXRvciA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdEVudHJ5LnNlY29uZC5tRW5kVGltZU1zICE9IG1MYXN0RW50cnkuZmlyc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGVuZC1jdWUKKyAgICAgICAgICAgICAgICBtTGFzdExpc3RJdGVyYXRvci5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICBtTGFzdExpc3RJdGVyYXRvciA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKG1DdWVzLmdldChtTGFzdEVudHJ5LmZpcnN0KS5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtQ3Vlcy5yZW1vdmUobUxhc3RFbnRyeS5maXJzdCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHJlc3Qgb2YgdGhlIGN1ZXMKKyAgICAgICAgICAgICAgICBDdWUgY3VlID0gbUxhc3RFbnRyeS5zZWNvbmQ7CisgICAgICAgICAgICAgICAgcmVtb3ZlRXZlbnQoY3VlLCBjdWUubVN0YXJ0VGltZU1zKTsKKyAgICAgICAgICAgICAgICBpZiAoY3VlLm1Jbm5lclRpbWVzTXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGxvbmcgdGltZU1zOiBjdWUubUlubmVyVGltZXNNcykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRXZlbnQoY3VlLCB0aW1lTXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgRW50cnlJdGVyYXRvcihTb3J0ZWRNYXA8TG9uZywgVmVjdG9yPEN1ZT4gPiBjdWVzKSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsIGN1ZXMgKyAiIik7CisgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0N1ZXMgPSBjdWVzOworICAgICAgICAgICAgICAgIG1MYXN0TGlzdEl0ZXJhdG9yID0gbnVsbDsKKyAgICAgICAgICAgICAgICBuZXh0S2V5KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgdm9pZCBuZXh0S2V5KCkgeworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUmVtYWluaW5nQ3VlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUaW1lTXMgPSBtUmVtYWluaW5nQ3Vlcy5maXJzdEtleSgpOworICAgICAgICAgICAgICAgICAgICAgICAgbUxpc3RJdGVyYXRvciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0N1ZXMuZ2V0KG1DdXJyZW50VGltZU1zKS5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVtYWluaW5nQ3VlcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZW1haW5pbmdDdWVzLnRhaWxNYXAobUN1cnJlbnRUaW1lTXMgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0N1ZXMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbURvbmUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRG9uZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBtUmVtYWluaW5nQ3VlcyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBtTGlzdEl0ZXJhdG9yID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gd2hpbGUgKCFtTGlzdEl0ZXJhdG9yLmhhc05leHQoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgbG9uZyBtQ3VycmVudFRpbWVNczsKKyAgICAgICAgICAgIHByaXZhdGUgSXRlcmF0b3I8Q3VlPiBtTGlzdEl0ZXJhdG9yOworICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Eb25lOworICAgICAgICAgICAgcHJpdmF0ZSBTb3J0ZWRNYXA8TG9uZywgVmVjdG9yPEN1ZT4gPiBtUmVtYWluaW5nQ3VlczsKKyAgICAgICAgICAgIHByaXZhdGUgSXRlcmF0b3I8Q3VlPiBtTGFzdExpc3RJdGVyYXRvcjsKKyAgICAgICAgICAgIHByaXZhdGUgUGFpcjxMb25nLEN1ZT4gbUxhc3RFbnRyeTsKKyAgICAgICAgfQorCisgICAgICAgIEN1ZUxpc3QoKSB7CisgICAgICAgICAgICBtQ3VlcyA9IG5ldyBUcmVlTWFwPExvbmcsIFZlY3RvcjxDdWU+PigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDdWUgeworICAgICAgICBwdWJsaWMgbG9uZyBtU3RhcnRUaW1lTXM7CisgICAgICAgIHB1YmxpYyBsb25nIG1FbmRUaW1lTXM7CisgICAgICAgIHB1YmxpYyBsb25nW10gbUlubmVyVGltZXNNczsKKyAgICAgICAgcHVibGljIGxvbmcgbVJ1bklEOworCisgICAgICAgIHB1YmxpYyBDdWUgbU5leHRJblJ1bjsKKworICAgICAgICBwdWJsaWMgdm9pZCBvblRpbWUobG9uZyB0aW1lTXMpIHsgfQorICAgIH0KKworICAgIC8qKiB1cGRhdGUgbVJ1bnNCeUVuZFRpbWUgKHdpdGggZGVmYXVsdCBlbmQgdGltZSkgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5pc2hlZFJ1bihsb25nIHJ1bklEKSB7CisgICAgICAgIGlmIChydW5JRCAhPSAwICYmIHJ1bklEICE9IH4wKSB7CisgICAgICAgICAgICBSdW4gcnVuID0gbVJ1bnNCeUlELmdldChydW5JRCk7CisgICAgICAgICAgICBpZiAocnVuICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBydW4uc3RvcmVCeUVuZFRpbWVNcyhtUnVuc0J5RW5kVGltZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogdXBkYXRlIG1SdW5zQnlFbmRUaW1lIHdpdGggZ2l2ZW4gZW5kIHRpbWUgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSdW5EaXNjYXJkVGltZU1zKGxvbmcgcnVuSUQsIGxvbmcgdGltZU1zKSB7CisgICAgICAgIGlmIChydW5JRCAhPSAwICYmIHJ1bklEICE9IH4wKSB7CisgICAgICAgICAgICBSdW4gcnVuID0gbVJ1bnNCeUlELmdldChydW5JRCk7CisgICAgICAgICAgICBpZiAocnVuICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBydW4ubUVuZFRpbWVNcyA9IHRpbWVNczsKKyAgICAgICAgICAgICAgICBydW4uc3RvcmVCeUVuZFRpbWVNcyhtUnVuc0J5RW5kVGltZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogd2hldGhlciB0aGlzIGlzIGEgdGV4dCB0cmFjayB3aG8gZmlyZXMgZXZlbnRzIGluc3RlYWQgZ2V0dGluZyByZW5kZXJlZCAqLworICAgIHB1YmxpYyBpbnQgZ2V0VHJhY2tUeXBlKCkgeworICAgICAgICByZXR1cm4gZ2V0UmVuZGVyaW5nV2lkZ2V0KCkgPT0gbnVsbAorICAgICAgICAgICAgICAgID8gVHJhY2tJbmZvLk1FRElBX1RSQUNLX1RZUEVfVElNRURURVhUCisgICAgICAgICAgICAgICAgOiBUcmFja0luZm8uTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRTsKKyAgICB9CisKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJ1biB7CisgICAgICAgIHB1YmxpYyBDdWUgbUZpcnN0Q3VlOworICAgICAgICBwdWJsaWMgUnVuIG1OZXh0UnVuQXRFbmRUaW1lTXM7CisgICAgICAgIHB1YmxpYyBSdW4gbVByZXZSdW5BdEVuZFRpbWVNczsKKyAgICAgICAgcHVibGljIGxvbmcgbUVuZFRpbWVNcyA9IC0xOworICAgICAgICBwdWJsaWMgbG9uZyBtUnVuSUQgPSAwOworICAgICAgICBwcml2YXRlIGxvbmcgbVN0b3JlZEVuZFRpbWVNcyA9IC0xOworCisgICAgICAgIHB1YmxpYyB2b2lkIHN0b3JlQnlFbmRUaW1lTXMoTG9uZ1NwYXJzZUFycmF5PFJ1bj4gcnVuc0J5RW5kVGltZSkgeworICAgICAgICAgICAgLy8gcmVtb3ZlIG9sZCB2YWx1ZSBpZiBhbnkKKyAgICAgICAgICAgIGludCBpeCA9IHJ1bnNCeUVuZFRpbWUuaW5kZXhPZktleShtU3RvcmVkRW5kVGltZU1zKTsKKyAgICAgICAgICAgIGlmIChpeCA+PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG1QcmV2UnVuQXRFbmRUaW1lTXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQodGhpcyA9PSBydW5zQnlFbmRUaW1lLnZhbHVlQXQoaXgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1OZXh0UnVuQXRFbmRUaW1lTXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcnVuc0J5RW5kVGltZS5yZW1vdmVBdChpeCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBydW5zQnlFbmRUaW1lLnNldFZhbHVlQXQoaXgsIG1OZXh0UnVuQXRFbmRUaW1lTXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlbW92ZUF0RW5kVGltZU1zKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGFkZCBuZXcgdmFsdWUKKyAgICAgICAgICAgIGlmIChtRW5kVGltZU1zID49IDApIHsKKyAgICAgICAgICAgICAgICBtUHJldlJ1bkF0RW5kVGltZU1zID0gbnVsbDsKKyAgICAgICAgICAgICAgICBtTmV4dFJ1bkF0RW5kVGltZU1zID0gcnVuc0J5RW5kVGltZS5nZXQobUVuZFRpbWVNcyk7CisgICAgICAgICAgICAgICAgaWYgKG1OZXh0UnVuQXRFbmRUaW1lTXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtTmV4dFJ1bkF0RW5kVGltZU1zLm1QcmV2UnVuQXRFbmRUaW1lTXMgPSB0aGlzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBydW5zQnlFbmRUaW1lLnB1dChtRW5kVGltZU1zLCB0aGlzKTsKKyAgICAgICAgICAgICAgICBtU3RvcmVkRW5kVGltZU1zID0gbUVuZFRpbWVNczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0RW5kVGltZU1zKCkgeworICAgICAgICAgICAgUnVuIHByZXYgPSBtUHJldlJ1bkF0RW5kVGltZU1zOworCisgICAgICAgICAgICBpZiAobVByZXZSdW5BdEVuZFRpbWVNcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVByZXZSdW5BdEVuZFRpbWVNcy5tTmV4dFJ1bkF0RW5kVGltZU1zID0gbU5leHRSdW5BdEVuZFRpbWVNczsKKyAgICAgICAgICAgICAgICBtUHJldlJ1bkF0RW5kVGltZU1zID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtTmV4dFJ1bkF0RW5kVGltZU1zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtTmV4dFJ1bkF0RW5kVGltZU1zLm1QcmV2UnVuQXRFbmRUaW1lTXMgPSBwcmV2OworICAgICAgICAgICAgICAgIG1OZXh0UnVuQXRFbmRUaW1lTXMgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIGZvciByZW5kZXJpbmcgc3VidGl0bGVzIG9udG8gYSBDYW52YXMuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBSZW5kZXJpbmdXaWRnZXQgeworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgd2lkZ2V0J3MgY2FsbGJhY2ssIHdoaWNoIGlzIHVzZWQgdG8gc2VuZCB1cGRhdGVzIHdoZW4gdGhlCisgICAgICAgICAqIHJlbmRlcmVkIGRhdGEgaGFzIGNoYW5nZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayB1cGRhdGUgY2FsbGJhY2sKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE9uQ2hhbmdlZExpc3RlbmVyKE9uQ2hhbmdlZExpc3RlbmVyIGNhbGxiYWNrKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgd2lkZ2V0J3Mgc2l6ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHdpZHRoIHdpZHRoIGluIHBpeGVscworICAgICAgICAgKiBAcGFyYW0gaGVpZ2h0IGhlaWdodCBpbiBwaXhlbHMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB3aGV0aGVyIHRoZSB3aWRnZXQgc2hvdWxkIGRyYXcgc3VidGl0bGVzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdmlzaWJsZSB0cnVlIGlmIHN1YnRpdGxlcyBzaG91bGQgYmUgZHJhd24sIGZhbHNlIG90aGVyd2lzZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZW5kZXJzIHN1YnRpdGxlcyBvbnRvIGEge0BsaW5rIENhbnZhc30uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjIGNhbnZhcyBvbiB3aGljaCB0byByZW5kZXIgc3VidGl0bGVzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBkcmF3KENhbnZhcyBjKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHdpZGdldCBpcyBhdHRhY2hlZCB0byBhIHdpbmRvdy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgd2lkZ2V0IGlzIGRldGFjaGVkIGZyb20gYSB3aW5kb3cuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsYmFjayB1c2VkIHRvIHNlbmQgdXBkYXRlcyBhYm91dCBjaGFuZ2VzIHRvIHJlbmRlcmluZyBkYXRhLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludGVyZmFjZSBPbkNoYW5nZWRMaXN0ZW5lciB7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSByZW5kZXJpbmcgZGF0YSBoYXMgY2hhbmdlZC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBAcGFyYW0gcmVuZGVyaW5nV2lkZ2V0IHRoZSB3aWRnZXQgd2hvc2UgZGF0YSBoYXMgY2hhbmdlZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZWQoUmVuZGVyaW5nV2lkZ2V0IHJlbmRlcmluZ1dpZGdldCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3VwZGF0ZS9BcGlGYWN0b3J5LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3VwZGF0ZS9BcGlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdiZTU0OQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvdXBkYXRlL0FwaUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDI3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlOworCitpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUJyb3dzZXIyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFCcm93c2VyMi5Ccm93c2VyQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMi5Db250cm9sbGVyQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5MaWJyYXJ5Um9vdDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLk1lZGlhTGlicmFyeVNlc3Npb247CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5NZWRpYUxpYnJhcnlTZXNzaW9uLk1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kR3JvdXAyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5Db250cm9sbGVySW5mbzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuU2Vzc2lvbkNhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMi5NZWRpYU5vdGlmaWNhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlJhdGluZzI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOworaW1wb3J0IGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIyOworaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhQnJvd3NlcjJQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUNvbnRyb2xWaWV3MlByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhQ29udHJvbGxlcjJQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUl0ZW0yUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFMaWJyYXJ5U2VydmljZTJQcm92aWRlci5MaWJyYXJ5Um9vdFByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhTWV0YWRhdGEyUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFQbGF5bGlzdEFnZW50UHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFTZXNzaW9uMlByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvbjJQcm92aWRlci5CdWlsZGVyQmFzZVByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvbjJQcm92aWRlci5Db21tYW5kQnV0dG9uUHJvdmlkZXIuQnVpbGRlclByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvblNlcnZpY2UyUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFTZXNzaW9uU2VydmljZTJQcm92aWRlci5NZWRpYU5vdGlmaWNhdGlvblByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlNlc3Npb25Ub2tlbjJQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5TdGF0aWNQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5WaWRlb1ZpZXcyUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVmlld0dyb3VwUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVm9sdW1lUHJvdmlkZXIyUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5JSW50ZXJmYWNlOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTWVkaWFDb250cm9sVmlldzI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3MjsKKworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLklNZWRpYUNvbnRyb2xsZXIyOworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhQnJvd3NlcjJJbXBsOworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjJJbXBsOworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTJJbXBsOworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UySW1wbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwuTGlicmFyeVJvb3RJbXBsOworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEySW1wbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnRJbXBsOworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsOworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UySW1wbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5SYXRpbmcySW1wbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4ySW1wbDsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjJJbXBsOworaW1wb3J0IGNvbS5hbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xWaWV3MkltcGw7CitpbXBvcnQgY29tLmFuZHJvaWQud2lkZ2V0LlZpZGVvVmlldzJJbXBsOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBBcGlGYWN0b3J5IGltcGxlbWVudHMgU3RhdGljUHJvdmlkZXIgeworICAgIHByaXZhdGUgQXBpRmFjdG9yeSgpIHsgfQorCisgICAgcHVibGljIHN0YXRpYyBTdGF0aWNQcm92aWRlciBpbml0aWFsaXplKEFwcGxpY2F0aW9uSW5mbyB1cGRhdGFibGVJbmZvKSB7CisgICAgICAgIEFwaUhlbHBlci5pbml0aWFsaXplKHVwZGF0YWJsZUluZm8pOworICAgICAgICByZXR1cm4gbmV3IEFwaUZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVkaWFDb250cm9sbGVyMlByb3ZpZGVyIGNyZWF0ZU1lZGlhQ29udHJvbGxlcjIoCisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIE1lZGlhQ29udHJvbGxlcjIgaW5zdGFuY2UsIFNlc3Npb25Ub2tlbjIgdG9rZW4sCisgICAgICAgICAgICBFeGVjdXRvciBleGVjdXRvciwgQ29udHJvbGxlckNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIHJldHVybiBuZXcgTWVkaWFDb250cm9sbGVyMkltcGwoY29udGV4dCwgaW5zdGFuY2UsIHRva2VuLCBleGVjdXRvciwgY2FsbGJhY2spOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZWRpYUJyb3dzZXIyUHJvdmlkZXIgY3JlYXRlTWVkaWFCcm93c2VyMihDb250ZXh0IGNvbnRleHQsIE1lZGlhQnJvd3NlcjIgaW5zdGFuY2UsCisgICAgICAgICAgICBTZXNzaW9uVG9rZW4yIHRva2VuLCBFeGVjdXRvciBleGVjdXRvciwgQnJvd3NlckNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIHJldHVybiBuZXcgTWVkaWFCcm93c2VyMkltcGwoY29udGV4dCwgaW5zdGFuY2UsIHRva2VuLCBleGVjdXRvciwgY2FsbGJhY2spOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZWRpYVNlc3Npb24yUHJvdmlkZXIuQ29tbWFuZFByb3ZpZGVyIGNyZWF0ZU1lZGlhU2Vzc2lvbjJDb21tYW5kKAorICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmQyIGluc3RhbmNlLCBpbnQgY29tbWFuZENvZGUsIFN0cmluZyBhY3Rpb24sIEJ1bmRsZSBleHRyYSkgeworICAgICAgICBpZiAoYWN0aW9uID09IG51bGwgJiYgZXh0cmEgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kSW1wbChpbnN0YW5jZSwgY29tbWFuZENvZGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEltcGwoaW5zdGFuY2UsIGFjdGlvbiwgZXh0cmEpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXNzaW9uQ29tbWFuZDIgZnJvbUJ1bmRsZV9NZWRpYVNlc3Npb24yQ29tbWFuZChCdW5kbGUgY29tbWFuZCkgeworICAgICAgICByZXR1cm4gTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEltcGwuZnJvbUJ1bmRsZV9pbXBsKGNvbW1hbmQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZWRpYVNlc3Npb24yUHJvdmlkZXIuQ29tbWFuZEdyb3VwUHJvdmlkZXIgY3JlYXRlTWVkaWFTZXNzaW9uMkNvbW1hbmRHcm91cCgKKyAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGluc3RhbmNlLCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBvdGhlcikgeworICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRHcm91cEltcGwoaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgKG90aGVyID09IG51bGwpID8gbnVsbCA6IG90aGVyLmdldFByb3ZpZGVyKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXNzaW9uQ29tbWFuZEdyb3VwMiBmcm9tQnVuZGxlX01lZGlhU2Vzc2lvbjJDb21tYW5kR3JvdXAoQnVuZGxlIGNvbW1hbmRzKSB7CisgICAgICAgIHJldHVybiBNZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kR3JvdXBJbXBsLmZyb21CdW5kbGVfaW1wbChjb21tYW5kcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1lZGlhU2Vzc2lvbjJQcm92aWRlci5Db250cm9sbGVySW5mb1Byb3ZpZGVyIGNyZWF0ZU1lZGlhU2Vzc2lvbjJDb250cm9sbGVySW5mbygKKyAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgQ29udHJvbGxlckluZm8gaW5zdGFuY2UsIGludCB1aWQsIGludCBwaWQsIFN0cmluZyBwYWNrYWdlTmFtZSwKKyAgICAgICAgICAgIElJbnRlcmZhY2UgY2FsbGJhY2spIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24ySW1wbC5Db250cm9sbGVySW5mb0ltcGwoY29udGV4dCwKKyAgICAgICAgICAgICAgICBpbnN0YW5jZSwgdWlkLCBwaWQsIHBhY2thZ2VOYW1lLCAoSU1lZGlhQ29udHJvbGxlcjIpIGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVpbGRlclByb3ZpZGVyIGNyZWF0ZU1lZGlhU2Vzc2lvbjJDb21tYW5kQnV0dG9uQnVpbGRlcigKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvbjIuQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIGluc3RhbmNlKSB7CisgICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEJ1dHRvbkltcGwuQnVpbGRlckltcGwoaW5zdGFuY2UpOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyQmFzZVByb3ZpZGVyPE1lZGlhU2Vzc2lvbjIsIFNlc3Npb25DYWxsYmFjaz4gY3JlYXRlTWVkaWFTZXNzaW9uMkJ1aWxkZXIoCisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIE1lZGlhU2Vzc2lvbjIuQnVpbGRlciBpbnN0YW5jZSkgeworICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjJJbXBsLkJ1aWxkZXJJbXBsKGNvbnRleHQsIGluc3RhbmNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVkaWFTZXNzaW9uU2VydmljZTJQcm92aWRlciBjcmVhdGVNZWRpYVNlc3Npb25TZXJ2aWNlMihNZWRpYVNlc3Npb25TZXJ2aWNlMiBpbnN0YW5jZSkgeworICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvblNlcnZpY2UySW1wbChpbnN0YW5jZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1lZGlhTm90aWZpY2F0aW9uUHJvdmlkZXIgY3JlYXRlTWVkaWFTZXNzaW9uU2VydmljZTJNZWRpYU5vdGlmaWNhdGlvbigKKyAgICAgICAgICAgIE1lZGlhTm90aWZpY2F0aW9uIGluc3RhbmNlLCBpbnQgbm90aWZpY2F0aW9uSWQsIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwuTWVkaWFOb3RpZmljYXRpb25JbXBsKAorICAgICAgICAgICAgICAgIGluc3RhbmNlLCBub3RpZmljYXRpb25JZCwgbm90aWZpY2F0aW9uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVkaWFTZXNzaW9uU2VydmljZTJQcm92aWRlciBjcmVhdGVNZWRpYUxpYnJhcnlTZXJ2aWNlMihNZWRpYUxpYnJhcnlTZXJ2aWNlMiBpbnN0YW5jZSkgeworICAgICAgICByZXR1cm4gbmV3IE1lZGlhTGlicmFyeVNlcnZpY2UySW1wbChpbnN0YW5jZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ1aWxkZXJCYXNlUHJvdmlkZXI8TWVkaWFMaWJyYXJ5U2Vzc2lvbiwgTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrPgorICAgICAgICBjcmVhdGVNZWRpYUxpYnJhcnlTZXJ2aWNlMkJ1aWxkZXIoTWVkaWFMaWJyYXJ5U2VydmljZTIgc2VydmljZSwKKyAgICAgICAgICAgIE1lZGlhTGlicmFyeVNlc3Npb24uQnVpbGRlciBpbnN0YW5jZSwgRXhlY3V0b3IgY2FsbGJhY2tFeGVjdXRvciwKKyAgICAgICAgICAgIE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICByZXR1cm4gbmV3IE1lZGlhTGlicmFyeVNlcnZpY2UySW1wbC5CdWlsZGVySW1wbChzZXJ2aWNlLCBpbnN0YW5jZSwgY2FsbGJhY2tFeGVjdXRvciwKKyAgICAgICAgICAgICAgICBjYWxsYmFjayk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpYnJhcnlSb290UHJvdmlkZXIgY3JlYXRlTWVkaWFMaWJyYXJ5U2VydmljZTJMaWJyYXJ5Um9vdCgKKyAgICAgICAgICAgIExpYnJhcnlSb290IGluc3RhbmNlLCBTdHJpbmcgcm9vdElkLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIHJldHVybiBuZXcgTGlicmFyeVJvb3RJbXBsKGluc3RhbmNlLCByb290SWQsIGV4dHJhcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1lZGlhQ29udHJvbFZpZXcyUHJvdmlkZXIgY3JlYXRlTWVkaWFDb250cm9sVmlldzIoTWVkaWFDb250cm9sVmlldzIgaW5zdGFuY2UsCisgICAgICAgICAgICBWaWV3R3JvdXBQcm92aWRlciBzdXBlclByb3ZpZGVyLCBWaWV3R3JvdXBQcm92aWRlciBwcml2YXRlUHJvdmlkZXIsCisgICAgICAgICAgICBATnVsbGFibGUgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyLCBpbnQgZGVmU3R5bGVSZXMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUNvbnRyb2xWaWV3MkltcGwoaW5zdGFuY2UsIHN1cGVyUHJvdmlkZXIsIHByaXZhdGVQcm92aWRlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZpZGVvVmlldzJQcm92aWRlciBjcmVhdGVWaWRlb1ZpZXcyKAorICAgICAgICAgICAgVmlkZW9WaWV3MiBpbnN0YW5jZSwgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyLAorICAgICAgICAgICAgQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7CisgICAgICAgIHJldHVybiBuZXcgVmlkZW9WaWV3MkltcGwoaW5zdGFuY2UsIHN1cGVyUHJvdmlkZXIsIHByaXZhdGVQcm92aWRlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNlc3Npb25Ub2tlbjJQcm92aWRlciBjcmVhdGVTZXNzaW9uVG9rZW4yKENvbnRleHQgY29udGV4dCwgU2Vzc2lvblRva2VuMiBpbnN0YW5jZSwKKyAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHNlcnZpY2VOYW1lLCBpbnQgdWlkKSB7CisgICAgICAgIHJldHVybiBuZXcgU2Vzc2lvblRva2VuMkltcGwoY29udGV4dCwgaW5zdGFuY2UsIHBhY2thZ2VOYW1lLCBzZXJ2aWNlTmFtZSwgdWlkKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2Vzc2lvblRva2VuMiBmcm9tQnVuZGxlX1Nlc3Npb25Ub2tlbjIoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICByZXR1cm4gU2Vzc2lvblRva2VuMkltcGwuZnJvbUJ1bmRsZV9pbXBsKGJ1bmRsZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1lZGlhSXRlbTJQcm92aWRlci5CdWlsZGVyUHJvdmlkZXIgY3JlYXRlTWVkaWFJdGVtMkJ1aWxkZXIoTWVkaWFJdGVtMi5CdWlsZGVyIGluc3RhbmNlLAorICAgICAgICAgICAgaW50IGZsYWdzKSB7CisgICAgICAgIHJldHVybiBuZXcgTWVkaWFJdGVtMkltcGwuQnVpbGRlckltcGwoaW5zdGFuY2UsIGZsYWdzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVkaWFJdGVtMiBmcm9tQnVuZGxlX01lZGlhSXRlbTIoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICByZXR1cm4gTWVkaWFJdGVtMkltcGwuZnJvbUJ1bmRsZV9pbXBsKGJ1bmRsZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZvbHVtZVByb3ZpZGVyMlByb3ZpZGVyIGNyZWF0ZVZvbHVtZVByb3ZpZGVyMihWb2x1bWVQcm92aWRlcjIgaW5zdGFuY2UsIGludCBjb250cm9sVHlwZSwKKyAgICAgICAgICAgIGludCBtYXhWb2x1bWUsIGludCBjdXJyZW50Vm9sdW1lKSB7CisgICAgICAgIHJldHVybiBuZXcgVm9sdW1lUHJvdmlkZXIySW1wbChpbnN0YW5jZSwgY29udHJvbFR5cGUsIG1heFZvbHVtZSwgY3VycmVudFZvbHVtZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1lZGlhTWV0YWRhdGEyIGZyb21CdW5kbGVfTWVkaWFNZXRhZGF0YTIoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICByZXR1cm4gTWVkaWFNZXRhZGF0YTJJbXBsLmZyb21CdW5kbGVfaW1wbChidW5kbGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMlByb3ZpZGVyLkJ1aWxkZXJQcm92aWRlciBjcmVhdGVNZWRpYU1ldGFkYXRhMkJ1aWxkZXIoCisgICAgICAgICAgICBNZWRpYU1ldGFkYXRhMi5CdWlsZGVyIGluc3RhbmNlKSB7CisgICAgICAgIHJldHVybiBuZXcgTWVkaWFNZXRhZGF0YTJJbXBsLkJ1aWxkZXJJbXBsKGluc3RhbmNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTJQcm92aWRlci5CdWlsZGVyUHJvdmlkZXIgY3JlYXRlTWVkaWFNZXRhZGF0YTJCdWlsZGVyKAorICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIuQnVpbGRlciBpbnN0YW5jZSwgTWVkaWFNZXRhZGF0YTIgc291cmNlKSB7CisgICAgICAgIHJldHVybiBuZXcgTWVkaWFNZXRhZGF0YTJJbXBsLkJ1aWxkZXJJbXBsKGluc3RhbmNlLCBzb3VyY2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSYXRpbmcyIGZyb21CdW5kbGVfUmF0aW5nMihCdW5kbGUgYnVuZGxlKSB7CisgICAgICAgIHJldHVybiBSYXRpbmcySW1wbC5mcm9tQnVuZGxlX2ltcGwoYnVuZGxlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmF0aW5nMiBuZXdVbnJhdGVkUmF0aW5nX1JhdGluZzIoaW50IHJhdGluZ1N0eWxlKSB7CisgICAgICAgIHJldHVybiBSYXRpbmcySW1wbC5uZXdVbnJhdGVkUmF0aW5nX2ltcGwocmF0aW5nU3R5bGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSYXRpbmcyIG5ld0hlYXJ0UmF0aW5nX1JhdGluZzIoYm9vbGVhbiBoYXNIZWFydCkgeworICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwubmV3SGVhcnRSYXRpbmdfaW1wbChoYXNIZWFydCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJhdGluZzIgbmV3VGh1bWJSYXRpbmdfUmF0aW5nMihib29sZWFuIHRodW1iSXNVcCkgeworICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwubmV3VGh1bWJSYXRpbmdfaW1wbCh0aHVtYklzVXApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSYXRpbmcyIG5ld1N0YXJSYXRpbmdfUmF0aW5nMihpbnQgc3RhclJhdGluZ1N0eWxlLCBmbG9hdCBzdGFyUmF0aW5nKSB7CisgICAgICAgIHJldHVybiBSYXRpbmcySW1wbC5uZXdTdGFyUmF0aW5nX2ltcGwoc3RhclJhdGluZ1N0eWxlLCBzdGFyUmF0aW5nKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmF0aW5nMiBuZXdQZXJjZW50YWdlUmF0aW5nX1JhdGluZzIoZmxvYXQgcGVyY2VudCkgeworICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwubmV3UGVyY2VudGFnZVJhdGluZ19pbXBsKHBlcmNlbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZWRpYVBsYXlsaXN0QWdlbnRQcm92aWRlciBjcmVhdGVNZWRpYVBsYXlsaXN0QWdlbnQoTWVkaWFQbGF5bGlzdEFnZW50IGluc3RhbmNlKSB7CisgICAgICAgIHJldHVybiBuZXcgTWVkaWFQbGF5bGlzdEFnZW50SW1wbChpbnN0YW5jZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS91cGRhdGUvQXBpSGVscGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3VwZGF0ZS9BcGlIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDhiYjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS91cGRhdGUvQXBpSGVscGVyLmphdmEKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0V3JhcHBlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMuVGhlbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5HdWFyZGVkQnk7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LndpZGdldC5TcGFjZTsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjcud2lkZ2V0LkJ1dHRvbkJhckxheW91dDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0VGhlbWVXcmFwcGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworCitpbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuTWVkaWFSb3V0ZUJ1dHRvbjsKK2ltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b247CitpbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5PdmVybGF5TGlzdFZpZXc7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBBcGlIZWxwZXIgeworICAgIHByaXZhdGUgc3RhdGljIEFwcGxpY2F0aW9uSW5mbyBzVXBkYXRhYmxlSW5mbzsKKworICAgIEBHdWFyZGVkQnkoInRoaXMiKQorICAgIHByaXZhdGUgc3RhdGljIFRoZW1lIHNMaWJUaGVtZTsKKworICAgIHByaXZhdGUgQXBpSGVscGVyKCkgeyB9CisKKyAgICBzdGF0aWMgdm9pZCBpbml0aWFsaXplKEFwcGxpY2F0aW9uSW5mbyB1cGRhdGFibGVJbmZvKSB7CisgICAgICAgIGlmIChzVXBkYXRhYmxlSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbml0aWFsaXplIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlIik7CisgICAgICAgIH0KKworICAgICAgICBzVXBkYXRhYmxlSW5mbyA9IHVwZGF0YWJsZUluZm87CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZXMgZ2V0TGliUmVzb3VyY2VzKENvbnRleHQgY29udGV4dCkgeworICAgICAgICByZXR1cm4gZ2V0TGliVGhlbWUoY29udGV4dCkuZ2V0UmVzb3VyY2VzKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUaGVtZSBnZXRMaWJUaGVtZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgaWYgKHNMaWJUaGVtZSAhPSBudWxsKSByZXR1cm4gc0xpYlRoZW1lOworCisgICAgICAgIHJldHVybiBnZXRMaWJUaGVtZVN5bmNocm9uaXplZChjb250ZXh0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRoZW1lIGdldExpYlRoZW1lKENvbnRleHQgY29udGV4dCwgaW50IHRoZW1lSWQpIHsKKyAgICAgICAgVGhlbWUgdGhlbWUgPSBnZXRMaWJSZXNvdXJjZXMoY29udGV4dCkubmV3VGhlbWUoKTsKKyAgICAgICAgdGhlbWUuYXBwbHlTdHlsZSh0aGVtZUlkLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIHRoZW1lOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTGF5b3V0SW5mbGF0ZXIgZ2V0TGF5b3V0SW5mbGF0ZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBnZXRMYXlvdXRJbmZsYXRlcihjb250ZXh0LCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExheW91dEluZmxhdGVyIGdldExheW91dEluZmxhdGVyKENvbnRleHQgY29udGV4dCwgVGhlbWUgdGhlbWUpIHsKKyAgICAgICAgaWYgKHRoZW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHRoZW1lID0gZ2V0TGliVGhlbWUoY29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPIChiLzcyOTc1OTc2KTogQXZvaWQgdG8gdXNlIENvbnRleHRUaGVtZVdyYXBwZXIgd2l0aCBhcHAgY29udGV4dCBhbmQgbGliIHRoZW1lLgorICAgICAgICBMYXlvdXRJbmZsYXRlciBsYXlvdXRJbmZsYXRlciA9IExheW91dEluZmxhdGVyLmZyb20oY29udGV4dCkuY2xvbmVJbkNvbnRleHQoCisgICAgICAgICAgICAgICAgbmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgdGhlbWUpKTsKKyAgICAgICAgbGF5b3V0SW5mbGF0ZXIuc2V0RmFjdG9yeTIobmV3IExheW91dEluZmxhdGVyLkZhY3RvcnkyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoCisgICAgICAgICAgICAgICAgICAgIFZpZXcgcGFyZW50LCBTdHJpbmcgbmFtZSwgQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgICAgICAgICBpZiAoTWVkaWFSb3V0ZUJ1dHRvbi5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUJ1dHRvbihjb250ZXh0LCBhdHRycyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChNZWRpYVJvdXRlVm9sdW1lU2xpZGVyLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlVm9sdW1lU2xpZGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE1lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbi5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uKGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE92ZXJsYXlMaXN0Vmlldy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT3ZlcmxheUxpc3RWaWV3KGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEJ1dHRvbkJhckxheW91dC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQnV0dG9uQmFyTGF5b3V0KGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFNwYWNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTcGFjZShjb250ZXh0LCBhdHRycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhTdHJpbmcgbmFtZSwgQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gb25DcmVhdGVWaWV3KG51bGwsIG5hbWUsIGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBsYXlvdXRJbmZsYXRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFZpZXcgaW5mbGF0ZUxpYkxheW91dChDb250ZXh0IGNvbnRleHQsIGludCBsaWJSZXNJZCkgeworICAgICAgICByZXR1cm4gaW5mbGF0ZUxpYkxheW91dChjb250ZXh0LCBnZXRMaWJUaGVtZShjb250ZXh0KSwgbGliUmVzSWQsIG51bGwsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFZpZXcgaW5mbGF0ZUxpYkxheW91dChDb250ZXh0IGNvbnRleHQsIFRoZW1lIHRoZW1lLCBpbnQgbGliUmVzSWQpIHsKKyAgICAgICAgcmV0dXJuIGluZmxhdGVMaWJMYXlvdXQoY29udGV4dCwgdGhlbWUsIGxpYlJlc0lkLCBudWxsLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBWaWV3IGluZmxhdGVMaWJMYXlvdXQoQ29udGV4dCBjb250ZXh0LCBUaGVtZSB0aGVtZSwgaW50IGxpYlJlc0lkLAorICAgICAgICAgICAgQE51bGxhYmxlIFZpZXdHcm91cCByb290LCBib29sZWFuIGF0dGFjaFRvUm9vdCkgeworICAgICAgICB0cnkgKFhtbFJlc291cmNlUGFyc2VyIHBhcnNlciA9IGdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXRMYXlvdXQobGliUmVzSWQpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0TGF5b3V0SW5mbGF0ZXIoY29udGV4dCwgdGhlbWUpLmluZmxhdGUocGFyc2VyLCByb290LCBhdHRhY2hUb1Jvb3QpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIFRoZW1lIGdldExpYlRoZW1lU3luY2hyb25pemVkKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBpZiAoc0xpYlRoZW1lICE9IG51bGwpIHJldHVybiBzTGliVGhlbWU7CisKKyAgICAgICAgaWYgKHNVcGRhdGFibGVJbmZvID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImluaXRpYWxpemUgaGFzbid0IGJlZW4gY2FsbGVkIHlldCIpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBzTGliVGhlbWUgPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkKKyAgICAgICAgICAgICAgICAgICAgLmdldFJlc291cmNlc0ZvckFwcGxpY2F0aW9uKHNVcGRhdGFibGVJbmZvKS5uZXdUaGVtZSgpOworICAgICAgICB9IGNhdGNoIChOYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBpMjQvbWVkaWEvTWVkaWFSb3V0ZXJBcGkyNC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwaTI0L21lZGlhL01lZGlhUm91dGVyQXBpMjQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTQ2YWY2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwaTI0L21lZGlhL01lZGlhUm91dGVyQXBpMjQuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7CisKKy8vIEBAUmVxdWlyZXNBcGkoMjQpCitmaW5hbCBjbGFzcyBNZWRpYVJvdXRlckFwaTI0IHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlSW5mbyB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldERldmljZVR5cGUoT2JqZWN0IHJvdXRlT2JqKSB7CisgICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0RGV2aWNlVHlwZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNlOGQ0NwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwzMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnZpZXcuQWN0aW9uUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworCitpbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7CitpbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlcjsKKworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKKworLyoqCisgKiBUaGUgbWVkaWEgcm91dGUgYWN0aW9uIHByb3ZpZGVyIGRpc3BsYXlzIGEge0BsaW5rIE1lZGlhUm91dGVCdXR0b24gbWVkaWEgcm91dGUgYnV0dG9ufQorICogaW4gdGhlIGFwcGxpY2F0aW9uJ3Mge0BsaW5rIEFjdGlvbkJhcn0gdG8gYWxsb3cgdGhlIHVzZXIgdG8gc2VsZWN0IHJvdXRlcyBhbmQKKyAqIHRvIGNvbnRyb2wgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZS4KKyAqIDxwPgorICogVGhlIGFwcGxpY2F0aW9uIG11c3Qgc3BlY2lmeSB0aGUga2luZHMgb2Ygcm91dGVzIHRoYXQgdGhlIHVzZXIgc2hvdWxkIGJlIGFsbG93ZWQKKyAqIHRvIHNlbGVjdCBieSBzcGVjaWZ5aW5nIGEge0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3Rvcn0gd2l0aCB0aGUKKyAqIHtAbGluayAjc2V0Um91dGVTZWxlY3Rvcn0gbWV0aG9kLgorICogPC9wPjxwPgorICogUmVmZXIgdG8ge0BsaW5rIE1lZGlhUm91dGVCdXR0b259IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBidXR0b24gdGhhdCB3aWxsCisgKiBhcHBlYXIgaW4gdGhlIGFjdGlvbiBiYXIgbWVudS4gIE5vdGUgdGhhdCBpbnN0ZWFkIG9mIGRpc2FibGluZyB0aGUgYnV0dG9uCisgKiB3aGVuIG5vIHJvdXRlcyBhcmUgYXZhaWxhYmxlLCB0aGUgYWN0aW9uIHByb3ZpZGVyIHdpbGwgaW5zdGVhZCBtYWtlIHRoZQorICogbWVudSBpdGVtIGludmlzaWJsZS4gIEluIHRoaXMgd2F5LCB0aGUgYnV0dG9uIHdpbGwgb25seSBiZSB2aXNpYmxlIHdoZW4gaXQKKyAqIGlzIHBvc3NpYmxlIGZvciB0aGUgdXNlciB0byBkaXNjb3ZlciBhbmQgc2VsZWN0IGEgbWF0Y2hpbmcgcm91dGUuCisgKiA8L3A+CisgKgorICogPGgzPlByZXJlcXVpc2l0ZXM8L2gzPgorICogPHA+CisgKiBUbyB1c2UgdGhlIG1lZGlhIHJvdXRlIGFjdGlvbiBwcm92aWRlciwgdGhlIGFjdGl2aXR5IG11c3QgYmUgYSBzdWJjbGFzcyBvZgorICoge0BsaW5rIEFwcENvbXBhdEFjdGl2aXR5fSBmcm9tIHRoZSA8Y29kZT5hbmRyb2lkLnN1cHBvcnQudjcuYXBwY29tcGF0PC9jb2RlPgorICogc3VwcG9ydCBsaWJyYXJ5LiAgUmVmZXIgdG8gc3VwcG9ydCBsaWJyYXJ5IGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuCisgKiA8L3A+CisgKgorICogPGgzPkV4YW1wbGU8L2gzPgorICogPHA+CisgKiA8L3A+PHA+CisgKiBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGRlZmluZSBhIG1lbnUgcmVzb3VyY2UgdG8gaW5jbHVkZSB0aGUgcHJvdmlkZXIgaW4gdGhlCisgKiBhY3Rpb24gYmFyIG9wdGlvbnMgbWVudS4gIE5vdGUgdGhhdCB0aGUgc3VwcG9ydCBsaWJyYXJ5IGFjdGlvbiBiYXIgdXNlcyBhdHRyaWJ1dGVzCisgKiB0aGF0IGFyZSBkZWZpbmVkIGluIHRoZSBhcHBsaWNhdGlvbidzIHJlc291cmNlIG5hbWVzcGFjZSByYXRoZXIgdGhhbiB0aGUgZnJhbWV3b3JrJ3MKKyAqIHJlc291cmNlIG5hbWVzcGFjZSB0byBjb25maWd1cmUgZWFjaCBpdGVtLgorICogPC9wPjxwcmU+CisgKiAmbHQ7bWVudSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgKiAgICAgICAgIHhtbG5zOmFwcD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy1hdXRvIj4KKyAqICAgICAmbHQ7aXRlbSBhbmRyb2lkOmlkPSJAK2lkL21lZGlhX3JvdXRlX21lbnVfaXRlbSIKKyAqICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9tZWRpYV9yb3V0ZV9tZW51X3RpdGxlIgorICogICAgICAgICBhcHA6c2hvd0FzQWN0aW9uPSJhbHdheXMiCisgKiAgICAgICAgIGFwcDphY3Rpb25Qcm92aWRlckNsYXNzPSJhbmRyb2lkLnN1cHBvcnQudjcuYXBwLk1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciIvPgorICogJmx0Oy9tZW51PgorICogPC9wcmU+PHA+CisgKiBUaGVuIGNvbmZpZ3VyZSB0aGUgbWVudSBhbmQgc2V0IHRoZSByb3V0ZSBzZWxlY3RvciBmb3IgdGhlIGNob29zZXIuCisgKiA8L3A+PHByZT4KKyAqIHB1YmxpYyBjbGFzcyBNeUFjdGl2aXR5IGV4dGVuZHMgQXBwQ29tcGF0QWN0aXZpdHkgeworICogICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIgbVJvdXRlcjsKKyAqICAgICBwcml2YXRlIE1lZGlhUm91dGVyLkNhbGxiYWNrIG1DYWxsYmFjazsKKyAqICAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3I7CisgKgorICogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAqICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAqCisgKiAgICAgICAgIG1Sb3V0ZXIgPSBNZWRpYXJvdXRlci5nZXRJbnN0YW5jZSh0aGlzKTsKKyAqICAgICAgICAgbVNlbGVjdG9yID0gbmV3IE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyKCkKKyAqICAgICAgICAgICAgICAgICAuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKQorICogICAgICAgICAgICAgICAgIC5hZGRDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSykKKyAqICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAqICAgICAgICAgbUNhbGxiYWNrID0gbmV3IE15Q2FsbGJhY2soKTsKKyAqICAgICB9CisgKgorICogICAgIC8vIEFkZCB0aGUgY2FsbGJhY2sgb24gc3RhcnQgdG8gdGVsbCB0aGUgbWVkaWEgcm91dGVyIHdoYXQga2luZHMgb2Ygcm91dGVzCisgKiAgICAgLy8gdGhlIGFwcGxpY2F0aW9uIGlzIGludGVyZXN0ZWQgaW4gc28gdGhhdCBpdCBjYW4gdHJ5IHRvIGRpc2NvdmVyIHN1aXRhYmxlIG9uZXMuCisgKiAgICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKKyAqICAgICAgICAgc3VwZXIub25TdGFydCgpOworICoKKyAqICAgICAgICAgbWVkaWFSb3V0ZXIuYWRkQ2FsbGJhY2sobVNlbGVjdG9yLCBtQ2FsbGJhY2ssCisgKiAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWSk7CisgKgorICogICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtZWRpYVJvdXRlci51cGRhdGVTZWxlY3RlZFJvdXRlKG1TZWxlY3Rvcik7CisgKiAgICAgICAgIC8vIGRvIHNvbWV0aGluZyB3aXRoIHRoZSByb3V0ZS4uLgorICogICAgIH0KKyAqCisgKiAgICAgLy8gUmVtb3ZlIHRoZSBzZWxlY3RvciBvbiBzdG9wIHRvIHRlbGwgdGhlIG1lZGlhIHJvdXRlciB0aGF0IGl0IG5vIGxvbmdlcgorICogICAgIC8vIG5lZWRzIHRvIGludmVzdCBlZmZvcnQgdHJ5aW5nIHRvIGRpc2NvdmVyIHJvdXRlcyBvZiB0aGVzZSBraW5kcyBmb3Igbm93LgorICogICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKKyAqICAgICAgICAgc3VwZXIub25TdG9wKCk7CisgKgorICogICAgICAgICBtZWRpYVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOworICogICAgIH0KKyAqCisgKiAgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKKyAqICAgICAgICAgc3VwZXIub25DcmVhdGVPcHRpb25zTWVudShtZW51KTsKKyAqCisgKiAgICAgICAgIGdldE1lbnVJbmZsYXRlcigpLmluZmxhdGUoUi5tZW51LnNhbXBsZV9tZWRpYV9yb3V0ZXJfbWVudSwgbWVudSk7CisgKgorICogICAgICAgICBNZW51SXRlbSBtZWRpYVJvdXRlTWVudUl0ZW0gPSBtZW51LmZpbmRJdGVtKFIuaWQubWVkaWFfcm91dGVfbWVudV9pdGVtKTsKKyAqICAgICAgICAgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyIG1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciA9CisgKiAgICAgICAgICAgICAgICAgKE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcilNZW51SXRlbUNvbXBhdC5nZXRBY3Rpb25Qcm92aWRlcihtZWRpYVJvdXRlTWVudUl0ZW0pOworICogICAgICAgICBtZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIuc2V0Um91dGVTZWxlY3RvcihtU2VsZWN0b3IpOworICogICAgICAgICByZXR1cm4gdHJ1ZTsKKyAqICAgICB9CisgKgorICogICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTXlDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVyLkNhbGxiYWNrIHsKKyAqICAgICAgICAgLy8gSW1wbGVtZW50IGNhbGxiYWNrIG1ldGhvZHMgYXMgbmVlZGVkLgorICogICAgIH0KKyAqIH0KKyAqIDwvcHJlPgorICoKKyAqIEBzZWUgI3NldFJvdXRlU2VsZWN0b3IKKyAqLworcHVibGljIGNsYXNzIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciBleHRlbmRzIEFjdGlvblByb3ZpZGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciI7CisKKyAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyIG1Sb3V0ZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlckNhbGxiYWNrIG1DYWxsYmFjazsKKworICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKKyAgICBwcml2YXRlIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IG1EaWFsb2dGYWN0b3J5ID0gTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkuZ2V0RGVmYXVsdCgpOworICAgIHByaXZhdGUgTWVkaWFSb3V0ZUJ1dHRvbiBtQnV0dG9uOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyB0aGUgYWN0aW9uIHByb3ZpZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisKKyAgICAgICAgbVJvdXRlciA9IE1lZGlhUm91dGVyLmdldEluc3RhbmNlKGNvbnRleHQpOworICAgICAgICBtQ2FsbGJhY2sgPSBuZXcgTWVkaWFSb3V0ZXJDYWxsYmFjayh0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdGhhdCB0aGUgdXNlciBjYW4KKyAgICAgKiBzZWxlY3QgdXNpbmcgdGhlIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgc2VsZWN0b3IsIG5ldmVyIG51bGwuCisgICAgICovCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGdldFJvdXRlU2VsZWN0b3IoKSB7CisgICAgICAgIHJldHVybiBtU2VsZWN0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuCisgICAgICogc2VsZWN0IHVzaW5nIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IsIG11c3Qgbm90IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbVNlbGVjdG9yLmVxdWFscyhzZWxlY3RvcikpIHsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBjdXJyZW50bHkgaGF2ZSBubyB3YXkgb2Yga25vd2luZyB3aGV0aGVyIHRoZSBhY3Rpb24gcHJvdmlkZXIKKyAgICAgICAgICAgIC8vIGlzIHN0aWxsIG5lZWRlZCBieSB0aGUgVUkuICBVbmZvcnR1bmF0ZWx5IHRoaXMgbWVhbnMgdGhlIGFjdGlvbiBwcm92aWRlcgorICAgICAgICAgICAgLy8gbWF5IGxlYWsgY2FsbGJhY2tzIHVudGlsIGdhcmJhZ2UgY29sbGVjdGlvbiBvY2N1cnMuICBUaGlzIG1heSByZXN1bHQgaW4KKyAgICAgICAgICAgIC8vIG1lZGlhIHJvdXRlIHByb3ZpZGVycyBkb2luZyBtb3JlIHdvcmsgdGhhbiBuZWNlc3NhcnkgaW4gdGhlIHNob3J0IHRlcm0KKyAgICAgICAgICAgIC8vIHdoaWxlIHRyeWluZyB0byBkaXNjb3ZlciByb3V0ZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIG9mIGludGVyZXN0IHRvIHRoZQorICAgICAgICAgICAgLy8gYXBwbGljYXRpb24uICBUbyBzb2x2ZSB0aGlzIHByb2JsZW0sIHRoZSBhY3Rpb24gcHJvdmlkZXIgd2lsbCBuZWVkIHNvbWUKKyAgICAgICAgICAgIC8vIGluZGljYXRpb24gZnJvbSB0aGUgZnJhbWV3b3JrIHRoYXQgaXQgaXMgYmVpbmcgZGVzdHJveWVkLgorICAgICAgICAgICAgaWYgKCFtU2VsZWN0b3IuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFzZWxlY3Rvci5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBtUm91dGVyLmFkZENhbGxiYWNrKHNlbGVjdG9yLCBtQ2FsbGJhY2spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVNlbGVjdG9yID0gc2VsZWN0b3I7CisgICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKKworICAgICAgICAgICAgaWYgKG1CdXR0b24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1CdXR0b24uc2V0Um91dGVTZWxlY3RvcihzZWxlY3Rvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeSB0byB1c2Ugd2hlbiBzaG93aW5nIHRoZSByb3V0ZSBjaG9vc2VyCisgICAgICogb3IgY29udHJvbGxlciBkaWFsb2cuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBkaWFsb2cgZmFjdG9yeSwgbmV2ZXIgbnVsbC4KKyAgICAgKi8KKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSBnZXREaWFsb2dGYWN0b3J5KCkgeworICAgICAgICByZXR1cm4gbURpYWxvZ0ZhY3Rvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnkgdG8gdXNlIHdoZW4gc2hvd2luZyB0aGUgcm91dGUgY2hvb3NlcgorICAgICAqIG9yIGNvbnRyb2xsZXIgZGlhbG9nLgorICAgICAqCisgICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIGRpYWxvZyBmYWN0b3J5LCBtdXN0IG5vdCBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERpYWxvZ0ZhY3RvcnkoQE5vbk51bGwgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgZmFjdG9yeSkgeworICAgICAgICBpZiAoZmFjdG9yeSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmYWN0b3J5IG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRGlhbG9nRmFjdG9yeSAhPSBmYWN0b3J5KSB7CisgICAgICAgICAgICBtRGlhbG9nRmFjdG9yeSA9IGZhY3Rvcnk7CisKKyAgICAgICAgICAgIGlmIChtQnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQnV0dG9uLnNldERpYWxvZ0ZhY3RvcnkoZmFjdG9yeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBhc3NvY2lhdGVkIG1lZGlhIHJvdXRlIGJ1dHRvbiwgb3IgbnVsbCBpZiBpdCBoYXMgbm90IHlldCBiZWVuIGNyZWF0ZWQuCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIE1lZGlhUm91dGVCdXR0b24gZ2V0TWVkaWFSb3V0ZUJ1dHRvbigpIHsKKyAgICAgICAgcmV0dXJuIG1CdXR0b247CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIG1lZGlhIHJvdXRlIGJ1dHRvbiBpcyBiZWluZyBjcmVhdGVkLgorICAgICAqIDxwPgorICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB0aGUgYnV0dG9uLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVkaWFSb3V0ZUJ1dHRvbiBvbkNyZWF0ZU1lZGlhUm91dGVCdXR0b24oKSB7CisgICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUJ1dHRvbihnZXRDb250ZXh0KCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCisgICAgcHVibGljIFZpZXcgb25DcmVhdGVBY3Rpb25WaWV3KCkgeworICAgICAgICBpZiAobUJ1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJvbkNyZWF0ZUFjdGlvblZpZXc6IHRoaXMgQWN0aW9uUHJvdmlkZXIgaXMgYWxyZWFkeSBhc3NvY2lhdGVkICIgKworICAgICAgICAgICAgICAgICAgICAid2l0aCBhIG1lbnUgaXRlbS4gRG9uJ3QgcmV1c2UgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyIGluc3RhbmNlcyEgIiArCisgICAgICAgICAgICAgICAgICAgICJBYmFuZG9uaW5nIHRoZSBvbGQgbWVudSBpdGVtLi4uIik7CisgICAgICAgIH0KKworICAgICAgICBtQnV0dG9uID0gb25DcmVhdGVNZWRpYVJvdXRlQnV0dG9uKCk7CisgICAgICAgIG1CdXR0b24uc2V0Q2hlYXRTaGVldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIG1CdXR0b24uc2V0Um91dGVTZWxlY3RvcihtU2VsZWN0b3IpOworICAgICAgICBtQnV0dG9uLnNldERpYWxvZ0ZhY3RvcnkobURpYWxvZ0ZhY3RvcnkpOworICAgICAgICBtQnV0dG9uLnNldExheW91dFBhcmFtcyhuZXcgVmlld0dyb3VwLkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkpOworICAgICAgICByZXR1cm4gbUJ1dHRvbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblBlcmZvcm1EZWZhdWx0QWN0aW9uKCkgeworICAgICAgICBpZiAobUJ1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbUJ1dHRvbi5zaG93RGlhbG9nKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG92ZXJyaWRlc0l0ZW1WaXNpYmlsaXR5KCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7CisgICAgICAgIHJldHVybiBtUm91dGVyLmlzUm91dGVBdmFpbGFibGUobVNlbGVjdG9yLAorICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkFWQUlMQUJJTElUWV9GTEFHX0lHTk9SRV9ERUZBVUxUX1JPVVRFKTsKKyAgICB9CisKKyAgICB2b2lkIHJlZnJlc2hSb3V0ZSgpIHsKKyAgICAgICAgcmVmcmVzaFZpc2liaWxpdHkoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgeworICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8TWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyPiBtUHJvdmlkZXJXZWFrOworCisgICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlckNhbGxiYWNrKE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciBwcm92aWRlcikgeworICAgICAgICAgICAgbVByb3ZpZGVyV2VhayA9IG5ldyBXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcj4ocHJvdmlkZXIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7CisgICAgICAgICAgICByZWZyZXNoUm91dGUocm91dGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7CisgICAgICAgICAgICByZWZyZXNoUm91dGUocm91dGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7CisgICAgICAgICAgICByZWZyZXNoUm91dGUocm91dGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyQWRkZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Qcm92aWRlckluZm8gcHJvdmlkZXIpIHsKKyAgICAgICAgICAgIHJlZnJlc2hSb3V0ZShyb3V0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJSZW1vdmVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7CisgICAgICAgICAgICByZWZyZXNoUm91dGUocm91dGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlByb3ZpZGVySW5mbyBwcm92aWRlcikgeworICAgICAgICAgICAgcmVmcmVzaFJvdXRlKHJvdXRlcik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcmVmcmVzaFJvdXRlKE1lZGlhUm91dGVyIHJvdXRlcikgeworICAgICAgICAgICAgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gbVByb3ZpZGVyV2Vhay5nZXQoKTsKKyAgICAgICAgICAgIGlmIChwcm92aWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcHJvdmlkZXIucmVmcmVzaFJvdXRlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJvdXRlci5yZW1vdmVDYWxsYmFjayh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUJ1dHRvbi5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQnV0dG9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRlOGE2MwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUJ1dHRvbi5qYXZhCkBAIC0wLDAgKzEsNjI5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0V3JhcHBlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbG9yU3RhdGVMaXN0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkFuaW1hdGlvbkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlQ29tcGF0OworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52Ny53aWRnZXQuVG9vbHRpcENvbXBhdDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OworaW1wb3J0IGFuZHJvaWQudmlldy5Tb3VuZEVmZmVjdENvbnN0YW50czsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlIZWxwZXI7CitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLlI7CitpbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7CitpbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlcjsKKworLyoqCisgKiBUaGUgbWVkaWEgcm91dGUgYnV0dG9uIGFsbG93cyB0aGUgdXNlciB0byBzZWxlY3Qgcm91dGVzIGFuZCB0byBjb250cm9sIHRoZQorICogY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlLgorICogPHA+CisgKiBUaGUgYXBwbGljYXRpb24gbXVzdCBzcGVjaWZ5IHRoZSBraW5kcyBvZiByb3V0ZXMgdGhhdCB0aGUgdXNlciBzaG91bGQgYmUgYWxsb3dlZAorICogdG8gc2VsZWN0IGJ5IHNwZWNpZnlpbmcgYSB7QGxpbmsgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yfSB3aXRoIHRoZQorICoge0BsaW5rICNzZXRSb3V0ZVNlbGVjdG9yfSBtZXRob2QuCisgKiA8L3A+PHA+CisgKiBXaGVuIHRoZSBkZWZhdWx0IHJvdXRlIGlzIHNlbGVjdGVkIG9yIHdoZW4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZSBkb2VzIG5vdAorICogbWF0Y2ggdGhlIHtAbGluayAjZ2V0Um91dGVTZWxlY3RvcigpIHNlbGVjdG9yfSwgdGhlIGJ1dHRvbiB3aWxsIGFwcGVhciBpbgorICogYW4gaW5hY3RpdmUgc3RhdGUgaW5kaWNhdGluZyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBpcyBub3QgY29ubmVjdGVkIHRvIGEKKyAqIHJvdXRlIG9mIHRoZSBraW5kIHRoYXQgaXQgd2FudHMgdG8gdXNlLiAgQ2xpY2tpbmcgb24gdGhlIGJ1dHRvbiBvcGVucworICogYSB7QGxpbmsgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2d9IHRvIGFsbG93IHRoZSB1c2VyIHRvIHNlbGVjdCBhIHJvdXRlLgorICogSWYgbm8gbm9uLWRlZmF1bHQgcm91dGVzIG1hdGNoIHRoZSBzZWxlY3RvciBhbmQgaXQgaXMgbm90IHBvc3NpYmxlIGZvciBhbiBhY3RpdmUKKyAqIHNjYW4gdG8gZGlzY292ZXIgYW55IG1hdGNoaW5nIHJvdXRlcywgdGhlbiB0aGUgYnV0dG9uIGlzIGRpc2FibGVkIGFuZCBjYW5ub3QKKyAqIGJlIGNsaWNrZWQuCisgKiA8L3A+PHA+CisgKiBXaGVuIGEgbm9uLWRlZmF1bHQgcm91dGUgaXMgc2VsZWN0ZWQgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3RvciwgdGhlIGJ1dHRvbiB3aWxsCisgKiBhcHBlYXIgaW4gYW4gYWN0aXZlIHN0YXRlIGluZGljYXRpbmcgdGhhdCB0aGUgYXBwbGljYXRpb24gaXMgY29ubmVjdGVkCisgKiB0byBhIHJvdXRlIG9mIHRoZSBraW5kIHRoYXQgaXQgd2FudHMgdG8gdXNlLiAgVGhlIGJ1dHRvbiBtYXkgYWxzbyBhcHBlYXIKKyAqIGluIGFuIGludGVybWVkaWFyeSBjb25uZWN0aW5nIHN0YXRlIGlmIHRoZSByb3V0ZSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBjb25uZWN0aW5nCisgKiB0byB0aGUgZGVzdGluYXRpb24gYnV0IGhhcyBub3QgeWV0IGNvbXBsZXRlZCBkb2luZyBzby4gIEluIGVpdGhlciBjYXNlLCBjbGlja2luZworICogb24gdGhlIGJ1dHRvbiBvcGVucyBhIHtAbGluayBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ30gdG8gYWxsb3cgdGhlIHVzZXIKKyAqIHRvIGNvbnRyb2wgb3IgZGlzY29ubmVjdCBmcm9tIHRoZSBjdXJyZW50IHJvdXRlLgorICogPC9wPgorICoKKyAqIDxoMz5QcmVyZXF1aXNpdGVzPC9oMz4KKyAqIDxwPgorICogVG8gdXNlIHRoZSBtZWRpYSByb3V0ZSBidXR0b24sIHRoZSBhY3Rpdml0eSBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YKKyAqIHtAbGluayBGcmFnbWVudEFjdGl2aXR5fSBmcm9tIHRoZSA8Y29kZT5hbmRyb2lkLnN1cHBvcnQudjQ8L2NvZGU+CisgKiBzdXBwb3J0IGxpYnJhcnkuICBSZWZlciB0byBzdXBwb3J0IGxpYnJhcnkgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcgorICogQHNlZSAjc2V0Um91dGVTZWxlY3RvcgorICovCitwdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZUJ1dHRvbiBleHRlbmRzIFZpZXcgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZUJ1dHRvbiI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hPT1NFUl9GUkFHTUVOVF9UQUcgPQorICAgICAgICAgICAgImFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYXJvdXRlcjpNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVFJPTExFUl9GUkFHTUVOVF9UQUcgPQorICAgICAgICAgICAgImFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYXJvdXRlcjpNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50IjsKKworICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZXIgbVJvdXRlcjsKKyAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyQ2FsbGJhY2sgbUNhbGxiYWNrOworCisgICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOworICAgIHByaXZhdGUgaW50IG1Sb3V0ZUNhbGxiYWNrRmxhZ3M7CisgICAgcHJpdmF0ZSBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSBtRGlhbG9nRmFjdG9yeSA9IE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5LmdldERlZmF1bHQoKTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtQXR0YWNoZWRUb1dpbmRvdzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNwYXJzZUFycmF5PERyYXdhYmxlLkNvbnN0YW50U3RhdGU+IHNSZW1vdGVJbmRpY2F0b3JDYWNoZSA9CisgICAgICAgICAgICBuZXcgU3BhcnNlQXJyYXk8PigyKTsKKyAgICBwcml2YXRlIFJlbW90ZUluZGljYXRvckxvYWRlciBtUmVtb3RlSW5kaWNhdG9yTG9hZGVyOworICAgIHByaXZhdGUgRHJhd2FibGUgbVJlbW90ZUluZGljYXRvcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVJlbW90ZUFjdGl2ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzQ29ubmVjdGluZzsKKworICAgIHByaXZhdGUgQ29sb3JTdGF0ZUxpc3QgbUJ1dHRvblRpbnQ7CisgICAgcHJpdmF0ZSBpbnQgbU1pbldpZHRoOworICAgIHByaXZhdGUgaW50IG1NaW5IZWlnaHQ7CisKKyAgICAvLyBUaGUgY2hlY2tlZCBzdGF0ZSBpcyB1c2VkIHdoZW4gY29ubmVjdGVkIHRvIGEgcmVtb3RlIHJvdXRlLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIENIRUNLRURfU1RBVEVfU0VUID0geworICAgICAgICBhbmRyb2lkLlIuYXR0ci5zdGF0ZV9jaGVja2VkCisgICAgfTsKKworICAgIC8vIFRoZSBjaGVja2FibGUgc3RhdGUgaXMgdXNlZCB3aGlsZSBjb25uZWN0aW5nIHRvIGEgcmVtb3RlIHJvdXRlLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIENIRUNLQUJMRV9TVEFURV9TRVQgPSB7CisgICAgICAgIGFuZHJvaWQuUi5hdHRyLnN0YXRlX2NoZWNrYWJsZQorICAgIH07CisKKyAgICBwdWJsaWMgTWVkaWFSb3V0ZUJ1dHRvbihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVkaWFSb3V0ZUJ1dHRvbihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBSLmF0dHIubWVkaWFSb3V0ZUJ1dHRvblN0eWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVkaWFSb3V0ZUJ1dHRvbihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0cikgeworICAgICAgICBzdXBlcihNZWRpYVJvdXRlclRoZW1lSGVscGVyLmNyZWF0ZVRoZW1lZEJ1dHRvbkNvbnRleHQoY29udGV4dCksIGF0dHJzLCBkZWZTdHlsZUF0dHIpOworICAgICAgICBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOworCisgICAgICAgIG1Sb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShjb250ZXh0KTsKKyAgICAgICAgbUNhbGxiYWNrID0gbmV3IE1lZGlhUm91dGVyQ2FsbGJhY2soKTsKKworICAgICAgICBSZXNvdXJjZXMuVGhlbWUgdGhlbWUgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLm5ld1RoZW1lKCk7CisgICAgICAgIHRoZW1lLmFwcGx5U3R5bGUoTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRSb3V0ZXJUaGVtZUlkKGNvbnRleHQpLCB0cnVlKTsKKyAgICAgICAgVHlwZWRBcnJheSBhID0gdGhlbWUub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5NZWRpYVJvdXRlQnV0dG9uLCBkZWZTdHlsZUF0dHIsIDApOworCisgICAgICAgIG1CdXR0b25UaW50ID0gYS5nZXRDb2xvclN0YXRlTGlzdChSLnN0eWxlYWJsZS5NZWRpYVJvdXRlQnV0dG9uX21lZGlhUm91dGVCdXR0b25UaW50KTsKKyAgICAgICAgbU1pbldpZHRoID0gYS5nZXREaW1lbnNpb25QaXhlbFNpemUoCisgICAgICAgICAgICAgICAgUi5zdHlsZWFibGUuTWVkaWFSb3V0ZUJ1dHRvbl9hbmRyb2lkX21pbldpZHRoLCAwKTsKKyAgICAgICAgbU1pbkhlaWdodCA9IGEuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAorICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLk1lZGlhUm91dGVCdXR0b25fYW5kcm9pZF9taW5IZWlnaHQsIDApOworICAgICAgICBpbnQgcmVtb3RlSW5kaWNhdG9yUmVzSWQgPSBhLmdldFJlc291cmNlSWQoCisgICAgICAgICAgICAgICAgUi5zdHlsZWFibGUuTWVkaWFSb3V0ZUJ1dHRvbl9leHRlcm5hbFJvdXRlRW5hYmxlZERyYXdhYmxlLCAwKTsKKyAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgaWYgKHJlbW90ZUluZGljYXRvclJlc0lkICE9IDApIHsKKyAgICAgICAgICAgIERyYXdhYmxlLkNvbnN0YW50U3RhdGUgcmVtb3RlSW5kaWNhdG9yU3RhdGUgPQorICAgICAgICAgICAgICAgICAgICBzUmVtb3RlSW5kaWNhdG9yQ2FjaGUuZ2V0KHJlbW90ZUluZGljYXRvclJlc0lkKTsKKyAgICAgICAgICAgIGlmIChyZW1vdGVJbmRpY2F0b3JTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2V0UmVtb3RlSW5kaWNhdG9yRHJhd2FibGUocmVtb3RlSW5kaWNhdG9yU3RhdGUubmV3RHJhd2FibGUoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3JMb2FkZXIgPSBuZXcgUmVtb3RlSW5kaWNhdG9yTG9hZGVyKHJlbW90ZUluZGljYXRvclJlc0lkKTsKKyAgICAgICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yTG9hZGVyLmV4ZWN1dGVPbkV4ZWN1dG9yKEFzeW5jVGFzay5USFJFQURfUE9PTF9FWEVDVVRPUik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB1cGRhdGVDb250ZW50RGVzY3JpcHRpb24oKTsKKyAgICAgICAgc2V0Q2xpY2thYmxlKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbgorICAgICAqIHNlbGVjdCB1c2luZyB0aGUgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBzZWxlY3RvciwgbmV2ZXIgbnVsbC4KKyAgICAgKi8KKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBNZWRpYVJvdXRlU2VsZWN0b3IgZ2V0Um91dGVTZWxlY3RvcigpIHsKKyAgICAgICAgcmV0dXJuIG1TZWxlY3RvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdGhhdCB0aGUgdXNlciBjYW4KKyAgICAgKiBzZWxlY3QgdXNpbmcgdGhlIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBzZWxlY3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb3V0ZVNlbGVjdG9yKE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICBzZXRSb3V0ZVNlbGVjdG9yKHNlbGVjdG9yLCAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdGhhdCB0aGUgdXNlciBjYW4KKyAgICAgKiBzZWxlY3QgdXNpbmcgdGhlIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBzZWxlY3Rvci4KKyAgICAgKiBAcGFyYW0gZmxhZ3MgRmxhZ3MgdG8gY29udHJvbCB0aGUgYmVoYXZpb3Igb2YgdGhlIGNhbGxiYWNrLiBNYXkgYmUgemVybyBvciBhIGNvbWJpbmF0aW9uIG9mCisgICAgICogICAgICAgICAgICAgIHtAbGluayAjTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOfSBhbmQKKyAgICAgKiAgICAgICAgICAgICAge0BsaW5rICNNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb3V0ZVNlbGVjdG9yKE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciwgaW50IGZsYWdzKSB7CisgICAgICAgIGlmIChtU2VsZWN0b3IuZXF1YWxzKHNlbGVjdG9yKSAmJiBtUm91dGVDYWxsYmFja0ZsYWdzID09IGZsYWdzKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtU2VsZWN0b3IuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBtUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwgfHwgc2VsZWN0b3IuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtU2VsZWN0b3IgPSBzZWxlY3RvcjsKKyAgICAgICAgbVJvdXRlQ2FsbGJhY2tGbGFncyA9IGZsYWdzOworCisgICAgICAgIGlmIChtQXR0YWNoZWRUb1dpbmRvdykgeworICAgICAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhzZWxlY3RvciwgbUNhbGxiYWNrLCBmbGFncyk7CisgICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG1lZGlhIHJvdXRlIGRpYWxvZyBmYWN0b3J5IHRvIHVzZSB3aGVuIHNob3dpbmcgdGhlIHJvdXRlIGNob29zZXIKKyAgICAgKiBvciBjb250cm9sbGVyIGRpYWxvZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGRpYWxvZyBmYWN0b3J5LCBuZXZlciBudWxsLgorICAgICAqLworICAgIEBOb25OdWxsCisgICAgcHVibGljIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IGdldERpYWxvZ0ZhY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBtRGlhbG9nRmFjdG9yeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeSB0byB1c2Ugd2hlbiBzaG93aW5nIHRoZSByb3V0ZSBjaG9vc2VyCisgICAgICogb3IgY29udHJvbGxlciBkaWFsb2cuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmFjdG9yeSBUaGUgZGlhbG9nIGZhY3RvcnksIG11c3Qgbm90IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlhbG9nRmFjdG9yeShATm9uTnVsbCBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSBmYWN0b3J5KSB7CisgICAgICAgIGlmIChmYWN0b3J5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImZhY3RvcnkgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgbURpYWxvZ0ZhY3RvcnkgPSBmYWN0b3J5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNob3cgdGhlIHJvdXRlIGNob29zZXIgb3IgY29udHJvbGxlciBkaWFsb2cuCisgICAgICogPHA+CisgICAgICogSWYgdGhlIGRlZmF1bHQgcm91dGUgaXMgc2VsZWN0ZWQgb3IgaWYgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZSBkb2VzCisgICAgICogbm90IG1hdGNoIHRoZSB7QGxpbmsgI2dldFJvdXRlU2VsZWN0b3Igc2VsZWN0b3J9LCB0aGVuIHNob3dzIHRoZSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KKyAgICAgKiBPdGhlcndpc2UsIHNob3dzIHRoZSByb3V0ZSBjb250cm9sbGVyIGRpYWxvZyB0byBvZmZlciB0aGUgdXNlcgorICAgICAqIGEgY2hvaWNlIHRvIGRpc2Nvbm5lY3QgZnJvbSB0aGUgcm91dGUgb3IgcGVyZm9ybSBvdGhlciBjb250cm9sIGFjdGlvbnMKKyAgICAgKiBzdWNoIGFzIHNldHRpbmcgdGhlIHJvdXRlJ3Mgdm9sdW1lLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGUgYXBwbGljYXRpb24gY2FuIGN1c3RvbWl6ZSB0aGUgZGlhbG9ncyBieSBjYWxsaW5nIHtAbGluayAjc2V0RGlhbG9nRmFjdG9yeX0KKyAgICAgKiB0byBwcm92aWRlIGEgY3VzdG9taXplZCBkaWFsb2cgZmFjdG9yeS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGRpYWxvZyB3YXMgYWN0dWFsbHkgc2hvd24uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgYWN0aXZpdHkgaXMgbm90IGEgc3ViY2xhc3Mgb2YKKyAgICAgKiB7QGxpbmsgRnJhZ21lbnRBY3Rpdml0eX0uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc2hvd0RpYWxvZygpIHsKKyAgICAgICAgaWYgKCFtQXR0YWNoZWRUb1dpbmRvdykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgRnJhZ21lbnRNYW5hZ2VyIGZtID0gZ2V0QWN0aXZpdHkoKS5nZXRGcmFnbWVudE1hbmFnZXIoKTsKKyAgICAgICAgaWYgKGZtID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBhY3Rpdml0eSBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YgRnJhZ21lbnRBY3Rpdml0eSIpOworICAgICAgICB9CisKKyAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbVJvdXRlci5nZXRTZWxlY3RlZFJvdXRlKCk7CisgICAgICAgIGlmIChyb3V0ZS5pc0RlZmF1bHRPckJsdWV0b290aCgpIHx8ICFyb3V0ZS5tYXRjaGVzU2VsZWN0b3IobVNlbGVjdG9yKSkgeworICAgICAgICAgICAgaWYgKGZtLmZpbmRGcmFnbWVudEJ5VGFnKENIT09TRVJfRlJBR01FTlRfVEFHKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2hvd0RpYWxvZygpOiBSb3V0ZSBjaG9vc2VyIGRpYWxvZyBhbHJlYWR5IHNob3dpbmchIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2dGcmFnbWVudCBmID0KKyAgICAgICAgICAgICAgICAgICAgbURpYWxvZ0ZhY3Rvcnkub25DcmVhdGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQoKTsKKyAgICAgICAgICAgIGYuc2V0Um91dGVTZWxlY3RvcihtU2VsZWN0b3IpOworICAgICAgICAgICAgZi5zaG93KGZtLCBDSE9PU0VSX0ZSQUdNRU5UX1RBRyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZm0uZmluZEZyYWdtZW50QnlUYWcoQ09OVFJPTExFUl9GUkFHTUVOVF9UQUcpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzaG93RGlhbG9nKCk6IFJvdXRlIGNvbnRyb2xsZXIgZGlhbG9nIGFscmVhZHkgc2hvd2luZyEiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50IGYgPQorICAgICAgICAgICAgICAgICAgICBtRGlhbG9nRmFjdG9yeS5vbkNyZWF0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudCgpOworICAgICAgICAgICAgZi5zaG93KGZtLCBDT05UUk9MTEVSX0ZSQUdNRU5UX1RBRyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisKKyAgICBwcml2YXRlIEFjdGl2aXR5IGdldEFjdGl2aXR5KCkgeworICAgICAgICAvLyBHcm9zcyB3YXkgb2YgdW53cmFwcGluZyB0aGUgQWN0aXZpdHkgc28gd2UgY2FuIGdldCB0aGUgRnJhZ21lbnRNYW5hZ2VyCisgICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoKTsKKyAgICAgICAgd2hpbGUgKGNvbnRleHQgaW5zdGFuY2VvZiBDb250ZXh0V3JhcHBlcikgeworICAgICAgICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoQWN0aXZpdHkpY29udGV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRleHQgPSAoKENvbnRleHRXcmFwcGVyKWNvbnRleHQpLmdldEJhc2VDb250ZXh0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIHRvIGVuYWJsZSBzaG93aW5nIGEgdG9hc3Qgd2l0aCB0aGUgY29udGVudCBkZXNjcmlwdG9yIG9mIHRoZQorICAgICAqIGJ1dHRvbiB3aGVuIHRoZSBidXR0b24gaXMgbG9uZyBwcmVzc2VkLgorICAgICAqLworICAgIHZvaWQgc2V0Q2hlYXRTaGVldEVuYWJsZWQoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgVG9vbHRpcENvbXBhdC5zZXRUb29sdGlwVGV4dCh0aGlzLCBlbmFibGUKKyAgICAgICAgICAgICAgICA/IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoZ2V0Q29udGV4dCgpKQorICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKFIuc3RyaW5nLm1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uKQorICAgICAgICAgICAgICAgIDogbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUNsaWNrKCkgeworICAgICAgICAvLyBTZW5kIHRoZSBhcHByb3ByaWF0ZSBhY2Nlc3NpYmlsaXR5IGV2ZW50cyBhbmQgY2FsbCBsaXN0ZW5lcnMKKyAgICAgICAgYm9vbGVhbiBoYW5kbGVkID0gc3VwZXIucGVyZm9ybUNsaWNrKCk7CisgICAgICAgIGlmICghaGFuZGxlZCkgeworICAgICAgICAgICAgcGxheVNvdW5kRWZmZWN0KFNvdW5kRWZmZWN0Q29uc3RhbnRzLkNMSUNLKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2hvd0RpYWxvZygpIHx8IGhhbmRsZWQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGludFtdIG9uQ3JlYXRlRHJhd2FibGVTdGF0ZShpbnQgZXh0cmFTcGFjZSkgeworICAgICAgICBmaW5hbCBpbnRbXSBkcmF3YWJsZVN0YXRlID0gc3VwZXIub25DcmVhdGVEcmF3YWJsZVN0YXRlKGV4dHJhU3BhY2UgKyAxKTsKKworICAgICAgICAvLyBUZWNobmljYWxseSB3ZSBzaG91bGQgYmUgaGFuZGxpbmcgdGhpcyBtb3JlIGNvbXBsZXRlbHksIGJ1dCB0aGVzZQorICAgICAgICAvLyBhcmUgaW1wbGVtZW50YXRpb24gZGV0YWlscyBoZXJlLiBDaGVja2FibGUgaXMgdXNlZCB0byBleHByZXNzIHRoZSBjb25uZWN0aW5nCisgICAgICAgIC8vIGRyYXdhYmxlIHN0YXRlIGFuZCBpdCdzIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGNoZWNrIGZvciB0aGUgcHVycG9zZXMKKyAgICAgICAgLy8gb2Ygc3RhdGUgc2VsZWN0aW9uIGhlcmUuCisgICAgICAgIGlmIChtSXNDb25uZWN0aW5nKSB7CisgICAgICAgICAgICBtZXJnZURyYXdhYmxlU3RhdGVzKGRyYXdhYmxlU3RhdGUsIENIRUNLQUJMRV9TVEFURV9TRVQpOworICAgICAgICB9IGVsc2UgaWYgKG1SZW1vdGVBY3RpdmUpIHsKKyAgICAgICAgICAgIG1lcmdlRHJhd2FibGVTdGF0ZXMoZHJhd2FibGVTdGF0ZSwgQ0hFQ0tFRF9TVEFURV9TRVQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkcmF3YWJsZVN0YXRlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGRyYXdhYmxlU3RhdGVDaGFuZ2VkKCkgeworICAgICAgICBzdXBlci5kcmF3YWJsZVN0YXRlQ2hhbmdlZCgpOworCisgICAgICAgIGlmIChtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludFtdIG15RHJhd2FibGVTdGF0ZSA9IGdldERyYXdhYmxlU3RhdGUoKTsKKyAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3Iuc2V0U3RhdGUobXlEcmF3YWJsZVN0YXRlKTsKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBkcmF3YWJsZSB0byB1c2UgYXMgdGhlIHJlbW90ZSByb3V0ZSBpbmRpY2F0b3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlSW5kaWNhdG9yRHJhd2FibGUoRHJhd2FibGUgZCkgeworICAgICAgICBpZiAobVJlbW90ZUluZGljYXRvckxvYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yTG9hZGVyLmNhbmNlbChmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVJlbW90ZUluZGljYXRvciAhPSBudWxsKSB7CisgICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yLnNldENhbGxiYWNrKG51bGwpOworICAgICAgICAgICAgdW5zY2hlZHVsZURyYXdhYmxlKG1SZW1vdGVJbmRpY2F0b3IpOworICAgICAgICB9CisgICAgICAgIGlmIChkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtQnV0dG9uVGludCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZCA9IERyYXdhYmxlQ29tcGF0LndyYXAoZC5tdXRhdGUoKSk7CisgICAgICAgICAgICAgICAgRHJhd2FibGVDb21wYXQuc2V0VGludExpc3QoZCwgbUJ1dHRvblRpbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZC5zZXRDYWxsYmFjayh0aGlzKTsKKyAgICAgICAgICAgIGQuc2V0U3RhdGUoZ2V0RHJhd2FibGVTdGF0ZSgpKTsKKyAgICAgICAgICAgIGQuc2V0VmlzaWJsZShnZXRWaXNpYmlsaXR5KCkgPT0gVklTSUJMRSwgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIG1SZW1vdGVJbmRpY2F0b3IgPSBkOworCisgICAgICAgIHJlZnJlc2hEcmF3YWJsZVN0YXRlKCk7CisgICAgICAgIGlmIChtQXR0YWNoZWRUb1dpbmRvdyAmJiBtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBtUmVtb3RlSW5kaWNhdG9yLmdldEN1cnJlbnQoKSBpbnN0YW5jZW9mIEFuaW1hdGlvbkRyYXdhYmxlKSB7CisgICAgICAgICAgICBBbmltYXRpb25EcmF3YWJsZSBjdXJEcmF3YWJsZSA9IChBbmltYXRpb25EcmF3YWJsZSkgbVJlbW90ZUluZGljYXRvci5nZXRDdXJyZW50KCk7CisgICAgICAgICAgICBpZiAobUlzQ29ubmVjdGluZykgeworICAgICAgICAgICAgICAgIGlmICghY3VyRHJhd2FibGUuaXNSdW5uaW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY3VyRHJhd2FibGUuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1SZW1vdGVBY3RpdmUpIHsKKyAgICAgICAgICAgICAgICBpZiAoY3VyRHJhd2FibGUuaXNSdW5uaW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY3VyRHJhd2FibGUuc3RvcCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjdXJEcmF3YWJsZS5zZWxlY3REcmF3YWJsZShjdXJEcmF3YWJsZS5nZXROdW1iZXJPZkZyYW1lcygpIC0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2ZXJpZnlEcmF3YWJsZShEcmF3YWJsZSB3aG8pIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnZlcmlmeURyYXdhYmxlKHdobykgfHwgd2hvID09IG1SZW1vdGVJbmRpY2F0b3I7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQganVtcERyYXdhYmxlc1RvQ3VycmVudFN0YXRlKCkgeworICAgICAgICAvLyBXZSBjYW4ndCBjYWxsIHN1cGVyIHRvIGhhbmRsZSB0aGUgYmFja2dyb3VuZCBzbyB3ZSBkbyBpdCBvdXJzZWx2ZXMuCisgICAgICAgIC8vc3VwZXIuanVtcERyYXdhYmxlc1RvQ3VycmVudFN0YXRlKCk7CisgICAgICAgIGlmIChnZXRCYWNrZ3JvdW5kKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgRHJhd2FibGVDb21wYXQuanVtcFRvQ3VycmVudFN0YXRlKGdldEJhY2tncm91bmQoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBIYW5kbGUgb3VyIG93biByZW1vdGUgaW5kaWNhdG9yLgorICAgICAgICBpZiAobVJlbW90ZUluZGljYXRvciAhPSBudWxsKSB7CisgICAgICAgICAgICBEcmF3YWJsZUNvbXBhdC5qdW1wVG9DdXJyZW50U3RhdGUobVJlbW90ZUluZGljYXRvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmlsaXR5KGludCB2aXNpYmlsaXR5KSB7CisgICAgICAgIHN1cGVyLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7CisKKyAgICAgICAgaWYgKG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvci5zZXRWaXNpYmxlKGdldFZpc2liaWxpdHkoKSA9PSBWSVNJQkxFLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3coKSB7CisgICAgICAgIHN1cGVyLm9uQXR0YWNoZWRUb1dpbmRvdygpOworCisgICAgICAgIG1BdHRhY2hlZFRvV2luZG93ID0gdHJ1ZTsKKyAgICAgICAgaWYgKCFtU2VsZWN0b3IuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBtUm91dGVyLmFkZENhbGxiYWNrKG1TZWxlY3RvciwgbUNhbGxiYWNrLCBtUm91dGVDYWxsYmFja0ZsYWdzKTsKKyAgICAgICAgfQorICAgICAgICByZWZyZXNoUm91dGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKKyAgICAgICAgbUF0dGFjaGVkVG9XaW5kb3cgPSBmYWxzZTsKKyAgICAgICAgaWYgKCFtU2VsZWN0b3IuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBtUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7CisgICAgICAgIH0KKworICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7CisgICAgICAgIGZpbmFsIGludCB3aWR0aFNpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKHdpZHRoTWVhc3VyZVNwZWMpOworICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0U2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUoaGVpZ2h0TWVhc3VyZVNwZWMpOworICAgICAgICBmaW5hbCBpbnQgd2lkdGhNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZSh3aWR0aE1lYXN1cmVTcGVjKTsKKyAgICAgICAgZmluYWwgaW50IGhlaWdodE1vZGUgPSBNZWFzdXJlU3BlYy5nZXRNb2RlKGhlaWdodE1lYXN1cmVTcGVjKTsKKworICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBNYXRoLm1heChtTWluV2lkdGgsIG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbCA/CisgICAgICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvci5nZXRJbnRyaW5zaWNXaWR0aCgpICsgZ2V0UGFkZGluZ0xlZnQoKSArIGdldFBhZGRpbmdSaWdodCgpIDogMCk7CisgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBNYXRoLm1heChtTWluSGVpZ2h0LCBtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwgPworICAgICAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3IuZ2V0SW50cmluc2ljSGVpZ2h0KCkgKyBnZXRQYWRkaW5nVG9wKCkgKyBnZXRQYWRkaW5nQm90dG9tKCkgOiAwKTsKKworICAgICAgICBpbnQgbWVhc3VyZWRXaWR0aDsKKyAgICAgICAgc3dpdGNoICh3aWR0aE1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgTWVhc3VyZVNwZWMuRVhBQ1RMWToKKyAgICAgICAgICAgICAgICBtZWFzdXJlZFdpZHRoID0gd2lkdGhTaXplOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNZWFzdXJlU3BlYy5BVF9NT1NUOgorICAgICAgICAgICAgICAgIG1lYXN1cmVkV2lkdGggPSBNYXRoLm1pbih3aWR0aFNpemUsIHdpZHRoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBjYXNlIE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEOgorICAgICAgICAgICAgICAgIG1lYXN1cmVkV2lkdGggPSB3aWR0aDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGludCBtZWFzdXJlZEhlaWdodDsKKyAgICAgICAgc3dpdGNoIChoZWlnaHRNb2RlKSB7CisgICAgICAgICAgICBjYXNlIE1lYXN1cmVTcGVjLkVYQUNUTFk6CisgICAgICAgICAgICAgICAgbWVhc3VyZWRIZWlnaHQgPSBoZWlnaHRTaXplOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNZWFzdXJlU3BlYy5BVF9NT1NUOgorICAgICAgICAgICAgICAgIG1lYXN1cmVkSGVpZ2h0ID0gTWF0aC5taW4oaGVpZ2h0U2l6ZSwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBjYXNlIE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEOgorICAgICAgICAgICAgICAgIG1lYXN1cmVkSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24obWVhc3VyZWRXaWR0aCwgbWVhc3VyZWRIZWlnaHQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOworCisgICAgICAgIGlmIChtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBsZWZ0ID0gZ2V0UGFkZGluZ0xlZnQoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCByaWdodCA9IGdldFdpZHRoKCkgLSBnZXRQYWRkaW5nUmlnaHQoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCB0b3AgPSBnZXRQYWRkaW5nVG9wKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgYm90dG9tID0gZ2V0SGVpZ2h0KCkgLSBnZXRQYWRkaW5nQm90dG9tKCk7CisKKyAgICAgICAgICAgIGZpbmFsIGludCBkcmF3V2lkdGggPSBtUmVtb3RlSW5kaWNhdG9yLmdldEludHJpbnNpY1dpZHRoKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgZHJhd0hlaWdodCA9IG1SZW1vdGVJbmRpY2F0b3IuZ2V0SW50cmluc2ljSGVpZ2h0KCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgZHJhd0xlZnQgPSBsZWZ0ICsgKHJpZ2h0IC0gbGVmdCAtIGRyYXdXaWR0aCkgLyAyOworICAgICAgICAgICAgZmluYWwgaW50IGRyYXdUb3AgPSB0b3AgKyAoYm90dG9tIC0gdG9wIC0gZHJhd0hlaWdodCkgLyAyOworCisgICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yLnNldEJvdW5kcyhkcmF3TGVmdCwgZHJhd1RvcCwKKyAgICAgICAgICAgICAgICAgICAgZHJhd0xlZnQgKyBkcmF3V2lkdGgsIGRyYXdUb3AgKyBkcmF3SGVpZ2h0KTsKKyAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3IuZHJhdyhjYW52YXMpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCByZWZyZXNoUm91dGUoKSB7CisgICAgICAgIGZpbmFsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1Sb3V0ZXIuZ2V0U2VsZWN0ZWRSb3V0ZSgpOworICAgICAgICBmaW5hbCBib29sZWFuIGlzUmVtb3RlID0gIXJvdXRlLmlzRGVmYXVsdE9yQmx1ZXRvb3RoKCkgJiYgcm91dGUubWF0Y2hlc1NlbGVjdG9yKG1TZWxlY3Rvcik7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNDb25uZWN0aW5nID0gaXNSZW1vdGUgJiYgcm91dGUuaXNDb25uZWN0aW5nKCk7CisgICAgICAgIGJvb2xlYW4gbmVlZHNSZWZyZXNoID0gZmFsc2U7CisgICAgICAgIGlmIChtUmVtb3RlQWN0aXZlICE9IGlzUmVtb3RlKSB7CisgICAgICAgICAgICBtUmVtb3RlQWN0aXZlID0gaXNSZW1vdGU7CisgICAgICAgICAgICBuZWVkc1JlZnJlc2ggPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChtSXNDb25uZWN0aW5nICE9IGlzQ29ubmVjdGluZykgeworICAgICAgICAgICAgbUlzQ29ubmVjdGluZyA9IGlzQ29ubmVjdGluZzsKKyAgICAgICAgICAgIG5lZWRzUmVmcmVzaCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobmVlZHNSZWZyZXNoKSB7CisgICAgICAgICAgICB1cGRhdGVDb250ZW50RGVzY3JpcHRpb24oKTsKKyAgICAgICAgICAgIHJlZnJlc2hEcmF3YWJsZVN0YXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1BdHRhY2hlZFRvV2luZG93KSB7CisgICAgICAgICAgICBzZXRFbmFibGVkKG1Sb3V0ZXIuaXNSb3V0ZUF2YWlsYWJsZShtU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkFWQUlMQUJJTElUWV9GTEFHX0lHTk9SRV9ERUZBVUxUX1JPVVRFKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIG1SZW1vdGVJbmRpY2F0b3IuZ2V0Q3VycmVudCgpIGluc3RhbmNlb2YgQW5pbWF0aW9uRHJhd2FibGUpIHsKKyAgICAgICAgICAgIEFuaW1hdGlvbkRyYXdhYmxlIGN1ckRyYXdhYmxlID0gKEFuaW1hdGlvbkRyYXdhYmxlKSBtUmVtb3RlSW5kaWNhdG9yLmdldEN1cnJlbnQoKTsKKyAgICAgICAgICAgIGlmIChtQXR0YWNoZWRUb1dpbmRvdykgeworICAgICAgICAgICAgICAgIGlmICgobmVlZHNSZWZyZXNoIHx8IGlzQ29ubmVjdGluZykgJiYgIWN1ckRyYXdhYmxlLmlzUnVubmluZygpKSB7CisgICAgICAgICAgICAgICAgICAgIGN1ckRyYXdhYmxlLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChpc1JlbW90ZSAmJiAhaXNDb25uZWN0aW5nKSB7CisgICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgcm91dGUgaXMgYWxyZWFkeSBjb25uZWN0ZWQgYmVmb3JlIHRoZSB2aWV3IGlzIGF0dGFjaGVkLCBzaG93IHRoZSBsYXN0CisgICAgICAgICAgICAgICAgLy8gZnJhbWUgb2YgdGhlIGNvbm5lY3RlZCBhbmltYXRpb24gaW1tZWRpYXRlbHkuCisgICAgICAgICAgICAgICAgaWYgKGN1ckRyYXdhYmxlLmlzUnVubmluZygpKSB7CisgICAgICAgICAgICAgICAgICAgIGN1ckRyYXdhYmxlLnN0b3AoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3VyRHJhd2FibGUuc2VsZWN0RHJhd2FibGUoY3VyRHJhd2FibGUuZ2V0TnVtYmVyT2ZGcmFtZXMoKSAtIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbnRlbnREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgaW50IHJlc0lkOworICAgICAgICBpZiAobUlzQ29ubmVjdGluZykgeworICAgICAgICAgICAgcmVzSWQgPSBSLnN0cmluZy5tcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nOworICAgICAgICB9IGVsc2UgaWYgKG1SZW1vdGVBY3RpdmUpIHsKKyAgICAgICAgICAgIHJlc0lkID0gUi5zdHJpbmcubXJfY2FzdF9idXR0b25fY29ubmVjdGVkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzSWQgPSBSLnN0cmluZy5tcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQ7CisgICAgICAgIH0KKyAgICAgICAgc2V0Q29udGVudERlc2NyaXB0aW9uKEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoZ2V0Q29udGV4dCgpKS5nZXRTdHJpbmcocmVzSWQpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlci5DYWxsYmFjayB7CisgICAgICAgIE1lZGlhUm91dGVyQ2FsbGJhY2soKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUFkZGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGluZm8pIHsKKyAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVSZW1vdmVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGluZm8pIHsKKyAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGluZm8pIHsKKyAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVTZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7CisgICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7CisgICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyQWRkZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Qcm92aWRlckluZm8gcHJvdmlkZXIpIHsKKyAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJSZW1vdmVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7CisgICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlByb3ZpZGVySW5mbyBwcm92aWRlcikgeworICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFJlbW90ZUluZGljYXRvckxvYWRlciBleHRlbmRzIEFzeW5jVGFzazxWb2lkLCBWb2lkLCBEcmF3YWJsZT4geworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtUmVzSWQ7CisKKyAgICAgICAgUmVtb3RlSW5kaWNhdG9yTG9hZGVyKGludCByZXNJZCkgeworICAgICAgICAgICAgbVJlc0lkID0gcmVzSWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIERyYXdhYmxlIGRvSW5CYWNrZ3JvdW5kKFZvaWQuLi4gcGFyYW1zKSB7CisgICAgICAgICAgICByZXR1cm4gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhnZXRDb250ZXh0KCkpLmdldERyYXdhYmxlKG1SZXNJZCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0RXhlY3V0ZShEcmF3YWJsZSByZW1vdGVJbmRpY2F0b3IpIHsKKyAgICAgICAgICAgIGNhY2hlQW5kUmVzZXQocmVtb3RlSW5kaWNhdG9yKTsKKyAgICAgICAgICAgIHNldFJlbW90ZUluZGljYXRvckRyYXdhYmxlKHJlbW90ZUluZGljYXRvcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25DYW5jZWxsZWQoRHJhd2FibGUgcmVtb3RlSW5kaWNhdG9yKSB7CisgICAgICAgICAgICBjYWNoZUFuZFJlc2V0KHJlbW90ZUluZGljYXRvcik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY2FjaGVBbmRSZXNldChEcmF3YWJsZSByZW1vdGVJbmRpY2F0b3IpIHsKKyAgICAgICAgICAgIGlmIChyZW1vdGVJbmRpY2F0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNSZW1vdGVJbmRpY2F0b3JDYWNoZS5wdXQobVJlc0lkLCByZW1vdGVJbmRpY2F0b3IuZ2V0Q29uc3RhbnRTdGF0ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3JMb2FkZXIgPSBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ2hvb3NlckRpYWxvZy5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ2hvb3NlckRpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYzY0ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDaG9vc2VyRGlhbG9nLmphdmEKQEAgLTAsMCArMSw0MDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7CisKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8uQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQ7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvLkNPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElORzsKKworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52Ny5hcHAuQXBwQ29tcGF0RGlhbG9nOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVTZWxlY3RvcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgcm91dGUgY2hvb3NlciBkaWFsb2cgZm9yIHtAbGluayBNZWRpYVJvdXRlcn0uCisgKiA8cD4KKyAqIFRoaXMgZGlhbG9nIGFsbG93cyB0aGUgdXNlciB0byBjaG9vc2UgYSByb3V0ZSB0aGF0IG1hdGNoZXMgYSBnaXZlbiBzZWxlY3Rvci4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIE1lZGlhUm91dGVCdXR0b24KKyAqIEBzZWUgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyCisgKi8KK3B1YmxpYyBjbGFzcyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyBleHRlbmRzIERpYWxvZyB7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZUNob29zZXJEaWFsb2ciOworCisgICAgLy8gRG8gbm90IHVwZGF0ZSB0aGUgcm91dGUgbGlzdCBpbW1lZGlhdGVseSB0byBhdm9pZCB1bm5hdHVyYWwgZGlhbG9nIGNoYW5nZS4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFVQREFURV9ST1VURVNfREVMQVlfTVMgPSAzMDBMOworICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1VQREFURV9ST1VURVMgPSAxOworCisgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlciBtUm91dGVyOworICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZXJDYWxsYmFjayBtQ2FsbGJhY2s7CisKKyAgICBwcml2YXRlIFRleHRWaWV3IG1UaXRsZVZpZXc7CisgICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOworICAgIHByaXZhdGUgQXJyYXlMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gbVJvdXRlczsKKyAgICBwcml2YXRlIFJvdXRlQWRhcHRlciBtQWRhcHRlcjsKKyAgICBwcml2YXRlIExpc3RWaWV3IG1MaXN0VmlldzsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUF0dGFjaGVkVG9XaW5kb3c7CisgICAgcHJpdmF0ZSBsb25nIG1MYXN0VXBkYXRlVGltZTsKKyAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgeworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1VQREFURV9ST1VURVM6CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJvdXRlcygoTGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+KSBtZXNzYWdlLm9iaik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2coQ29udGV4dCBjb250ZXh0LCBpbnQgdGhlbWUpIHsKKyAgICAgICAgLy8gVE9ETyAoYi83Mjk3NTk3Nik6IEF2b2lkIHRvIHVzZSBDb250ZXh0VGhlbWVXcmFwcGVyIHdpdGggYXBwIGNvbnRleHQgYW5kIGxpYiB0aGVtZS4KKyAgICAgICAgc3VwZXIobmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgQXBpSGVscGVyLmdldExpYlRoZW1lKGNvbnRleHQsCisgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRSb3V0ZXJUaGVtZUlkKGNvbnRleHQpKSksIHRoZW1lKTsKKyAgICAgICAgY29udGV4dCA9IGdldENvbnRleHQoKTsKKworICAgICAgICBtUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoY29udGV4dCk7CisgICAgICAgIG1DYWxsYmFjayA9IG5ldyBNZWRpYVJvdXRlckNhbGxiYWNrKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuIHNlbGVjdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHNlbGVjdG9yLCBuZXZlciBudWxsLgorICAgICAqLworICAgIEBOb25OdWxsCisgICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBnZXRSb3V0ZVNlbGVjdG9yKCkgeworICAgICAgICByZXR1cm4gbVNlbGVjdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbiBzZWxlY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yLCBtdXN0IG5vdCBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoQE5vbk51bGwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1TZWxlY3Rvci5lcXVhbHMoc2VsZWN0b3IpKSB7CisgICAgICAgICAgICBtU2VsZWN0b3IgPSBzZWxlY3RvcjsKKworICAgICAgICAgICAgaWYgKG1BdHRhY2hlZFRvV2luZG93KSB7CisgICAgICAgICAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOworICAgICAgICAgICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2soc2VsZWN0b3IsIG1DYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlZnJlc2hSb3V0ZXMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB0byBmaWx0ZXIgdGhlIHNldCBvZiByb3V0ZXMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3QuCisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXRlcmF0ZXMgb3ZlciBhbGwgcm91dGVzIGluIHRoZSBwcm92aWRlZCBsaXN0IGFuZAorICAgICAqIHJlbW92ZXMgdGhvc2UgZm9yIHdoaWNoIHtAbGluayAjb25GaWx0ZXJSb3V0ZX0gcmV0dXJucyBmYWxzZS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcm91dGVzIFRoZSBsaXN0IG9mIHJvdXRlcyB0byBmaWx0ZXIgaW4tcGxhY2UsIG5ldmVyIG51bGwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25GaWx0ZXJSb3V0ZXMoQE5vbk51bGwgTGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IHJvdXRlcykgeworICAgICAgICBmb3IgKGludCBpID0gcm91dGVzLnNpemUoKTsgaS0tID4gMDsgKSB7CisgICAgICAgICAgICBpZiAoIW9uRmlsdGVyUm91dGUocm91dGVzLmdldChpKSkpIHsKKyAgICAgICAgICAgICAgICByb3V0ZXMucmVtb3ZlKGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3QuCisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlIGZvciBlbmFibGVkIG5vbi1kZWZhdWx0IHJvdXRlcyB0aGF0CisgICAgICogbWF0Y2ggdGhlIHNlbGVjdG9yLiAgU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gZmlsdGVyIHJvdXRlcworICAgICAqIGRpZmZlcmVudGx5LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdG8gY29uc2lkZXIsIG5ldmVyIG51bGwuCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSByb3V0ZSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGNob29zZXIgZGlhbG9nLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9uRmlsdGVyUm91dGUoQE5vbk51bGwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgIHJldHVybiAhcm91dGUuaXNEZWZhdWx0T3JCbHVldG9vdGgoKSAmJiByb3V0ZS5pc0VuYWJsZWQoKQorICAgICAgICAgICAgICAgICYmIHJvdXRlLm1hdGNoZXNTZWxlY3RvcihtU2VsZWN0b3IpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgeworICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQodGl0bGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKGludCB0aXRsZUlkKSB7CisgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dCh0aXRsZUlkKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcoQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQoZ2V0Q29udGV4dCgpLCBBcGlIZWxwZXIuZ2V0TGliVGhlbWUoZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0Um91dGVyVGhlbWVJZChnZXRDb250ZXh0KCkpKSwKKyAgICAgICAgICAgICAgICBSLmxheW91dC5tcl9jaG9vc2VyX2RpYWxvZykpOworCisgICAgICAgIG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgbUFkYXB0ZXIgPSBuZXcgUm91dGVBZGFwdGVyKGdldENvbnRleHQoKSwgbVJvdXRlcyk7CisgICAgICAgIG1MaXN0VmlldyA9IChMaXN0VmlldylmaW5kVmlld0J5SWQoUi5pZC5tcl9jaG9vc2VyX2xpc3QpOworICAgICAgICBtTGlzdFZpZXcuc2V0QWRhcHRlcihtQWRhcHRlcik7CisgICAgICAgIG1MaXN0Vmlldy5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG1BZGFwdGVyKTsKKyAgICAgICAgbUxpc3RWaWV3LnNldEVtcHR5VmlldyhmaW5kVmlld0J5SWQoYW5kcm9pZC5SLmlkLmVtcHR5KSk7CisgICAgICAgIG1UaXRsZVZpZXcgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jaG9vc2VyX3RpdGxlKTsKKworICAgICAgICB1cGRhdGVMYXlvdXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB3aWR0aCBvZiB0aGUgZGlhbG9nLiBBbHNvIGNhbGxlZCB3aGVuIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy4KKyAgICAgKi8KKyAgICB2b2lkIHVwZGF0ZUxheW91dCgpIHsKKyAgICAgICAgZ2V0V2luZG93KCkuc2V0TGF5b3V0KE1lZGlhUm91dGVEaWFsb2dIZWxwZXIuZ2V0RGlhbG9nV2lkdGgoZ2V0Q29udGV4dCgpKSwKKyAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgeworICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKKworICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IHRydWU7CisgICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2sobVNlbGVjdG9yLCBtQ2FsbGJhY2ssIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTik7CisgICAgICAgIHJlZnJlc2hSb3V0ZXMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKKyAgICAgICAgbUF0dGFjaGVkVG9XaW5kb3cgPSBmYWxzZTsKKyAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOworICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfVVBEQVRFX1JPVVRFUyk7CisKKyAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWZyZXNoZXMgdGhlIGxpc3Qgb2Ygcm91dGVzIHRoYXQgYXJlIHNob3duIGluIHRoZSBjaG9vc2VyIGRpYWxvZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWZyZXNoUm91dGVzKCkgeworICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cpIHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IHJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8PihtUm91dGVyLmdldFJvdXRlcygpKTsKKyAgICAgICAgICAgIG9uRmlsdGVyUm91dGVzKHJvdXRlcyk7CisgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHJvdXRlcywgUm91dGVDb21wYXJhdG9yLnNJbnN0YW5jZSk7CisgICAgICAgICAgICBpZiAoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgLSBtTGFzdFVwZGF0ZVRpbWUgPj0gVVBEQVRFX1JPVVRFU19ERUxBWV9NUykgeworICAgICAgICAgICAgICAgIHVwZGF0ZVJvdXRlcyhyb3V0ZXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfVVBEQVRFX1JPVVRFUyk7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VBdFRpbWUobUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfVVBEQVRFX1JPVVRFUywgcm91dGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VXBkYXRlVGltZSArIFVQREFURV9ST1VURVNfREVMQVlfTVMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB1cGRhdGVSb3V0ZXMoTGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IHJvdXRlcykgeworICAgICAgICBtTGFzdFVwZGF0ZVRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgbVJvdXRlcy5jbGVhcigpOworICAgICAgICBtUm91dGVzLmFkZEFsbChyb3V0ZXMpOworICAgICAgICBtQWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUm91dGVBZGFwdGVyIGV4dGVuZHMgQXJyYXlBZGFwdGVyPE1lZGlhUm91dGVyLlJvdXRlSW5mbz4KKyAgICAgICAgICAgIGltcGxlbWVudHMgTGlzdFZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgRHJhd2FibGUgbURlZmF1bHRJY29uOworICAgICAgICBwcml2YXRlIGZpbmFsIERyYXdhYmxlIG1Udkljb247CisgICAgICAgIHByaXZhdGUgZmluYWwgRHJhd2FibGUgbVNwZWFrZXJJY29uOworICAgICAgICBwcml2YXRlIGZpbmFsIERyYXdhYmxlIG1TcGVha2VyR3JvdXBJY29uOworCisgICAgICAgIHB1YmxpYyBSb3V0ZUFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gcm91dGVzKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCAwLCByb3V0ZXMpOworCisgICAgICAgICAgICBUeXBlZEFycmF5IHN0eWxlZEF0dHJpYnV0ZXMgPSBBcGlIZWxwZXIuZ2V0TGliVGhlbWUoY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRSb3V0ZXJUaGVtZUlkKGNvbnRleHQpKS5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuYXR0ci5tZWRpYVJvdXRlRGVmYXVsdEljb25EcmF3YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5hdHRyLm1lZGlhUm91dGVUdkljb25EcmF3YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5hdHRyLm1lZGlhUm91dGVTcGVha2VySWNvbkRyYXdhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmF0dHIubWVkaWFSb3V0ZVNwZWFrZXJHcm91cEljb25EcmF3YWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBtRGVmYXVsdEljb24gPSBzdHlsZWRBdHRyaWJ1dGVzLmdldERyYXdhYmxlKDApOworICAgICAgICAgICAgbVR2SWNvbiA9IHN0eWxlZEF0dHJpYnV0ZXMuZ2V0RHJhd2FibGUoMSk7CisgICAgICAgICAgICBtU3BlYWtlckljb24gPSBzdHlsZWRBdHRyaWJ1dGVzLmdldERyYXdhYmxlKDIpOworICAgICAgICAgICAgbVNwZWFrZXJHcm91cEljb24gPSBzdHlsZWRBdHRyaWJ1dGVzLmdldERyYXdhYmxlKDMpOworICAgICAgICAgICAgc3R5bGVkQXR0cmlidXRlcy5yZWN5Y2xlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYXJlQWxsSXRlbXNFbmFibGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRJdGVtKHBvc2l0aW9uKS5pc0VuYWJsZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgeworICAgICAgICAgICAgVmlldyB2aWV3ID0gY29udmVydFZpZXc7CisgICAgICAgICAgICBpZiAodmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdmlldyA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KGdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJUaGVtZShnZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0Um91dGVyVGhlbWVJZChnZXRDb250ZXh0KCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0Lm1yX2Nob29zZXJfbGlzdF9pdGVtLCBwYXJlbnQsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gZ2V0SXRlbShwb3NpdGlvbik7CisgICAgICAgICAgICBUZXh0VmlldyB0ZXh0MSA9IChUZXh0Vmlldykgdmlldy5maW5kVmlld0J5SWQoUi5pZC5tcl9jaG9vc2VyX3JvdXRlX25hbWUpOworICAgICAgICAgICAgVGV4dFZpZXcgdGV4dDIgPSAoVGV4dFZpZXcpIHZpZXcuZmluZFZpZXdCeUlkKFIuaWQubXJfY2hvb3Nlcl9yb3V0ZV9kZXNjKTsKKyAgICAgICAgICAgIHRleHQxLnNldFRleHQocm91dGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IHJvdXRlLmdldERlc2NyaXB0aW9uKCk7CisgICAgICAgICAgICBib29sZWFuIGlzQ29ubmVjdGVkT3JDb25uZWN0aW5nID0KKyAgICAgICAgICAgICAgICAgICAgcm91dGUuZ2V0Q29ubmVjdGlvblN0YXRlKCkgPT0gQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCByb3V0ZS5nZXRDb25uZWN0aW9uU3RhdGUoKSA9PSBDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkc7CisgICAgICAgICAgICBpZiAoaXNDb25uZWN0ZWRPckNvbm5lY3RpbmcgJiYgIVRleHRVdGlscy5pc0VtcHR5KGRlc2NyaXB0aW9uKSkgeworICAgICAgICAgICAgICAgIHRleHQxLnNldEdyYXZpdHkoR3Jhdml0eS5CT1RUT00pOworICAgICAgICAgICAgICAgIHRleHQyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICB0ZXh0Mi5zZXRUZXh0KGRlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGV4dDEuc2V0R3Jhdml0eShHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTCk7CisgICAgICAgICAgICAgICAgdGV4dDIuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgIHRleHQyLnNldFRleHQoIiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlldy5zZXRFbmFibGVkKHJvdXRlLmlzRW5hYmxlZCgpKTsKKworICAgICAgICAgICAgSW1hZ2VWaWV3IGljb25WaWV3ID0gKEltYWdlVmlldykgdmlldy5maW5kVmlld0J5SWQoUi5pZC5tcl9jaG9vc2VyX3JvdXRlX2ljb24pOworICAgICAgICAgICAgaWYgKGljb25WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpY29uVmlldy5zZXRJbWFnZURyYXdhYmxlKGdldEljb25EcmF3YWJsZShyb3V0ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHZpZXc7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gZ2V0SXRlbShwb3NpdGlvbik7CisgICAgICAgICAgICBpZiAocm91dGUuaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICByb3V0ZS5zZWxlY3QoKTsKKyAgICAgICAgICAgICAgICBkaXNtaXNzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIERyYXdhYmxlIGdldEljb25EcmF3YWJsZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKKyAgICAgICAgICAgIFVyaSBpY29uVXJpID0gcm91dGUuZ2V0SWNvblVyaSgpOworICAgICAgICAgICAgaWYgKGljb25VcmkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLm9wZW5JbnB1dFN0cmVhbShpY29uVXJpKTsKKyAgICAgICAgICAgICAgICAgICAgRHJhd2FibGUgZHJhd2FibGUgPSBEcmF3YWJsZS5jcmVhdGVGcm9tU3RyZWFtKGlzLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRyYXdhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkcmF3YWJsZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIGxvYWQgIiArIGljb25VcmksIGUpOworICAgICAgICAgICAgICAgICAgICAvLyBGYWxscyBiYWNrLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBnZXREZWZhdWx0SWNvbkRyYXdhYmxlKHJvdXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgRHJhd2FibGUgZ2V0RGVmYXVsdEljb25EcmF3YWJsZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSB0eXBlIG9mIHRoZSByZWNlaXZlciBkZXZpY2UgaXMgc3BlY2lmaWVkLCB1c2UgaXQuCisgICAgICAgICAgICBzd2l0Y2ggKHJvdXRlLmdldERldmljZVR5cGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgIE1lZGlhUm91dGVyLlJvdXRlSW5mby5ERVZJQ0VfVFlQRV9UVjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1Udkljb247CisgICAgICAgICAgICAgICAgY2FzZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uREVWSUNFX1RZUEVfU1BFQUtFUjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1TcGVha2VySWNvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBtYWtlIHRoZSBiZXN0IGd1ZXNzIGJhc2VkIG9uIG90aGVyIHJvdXRlIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgaWYgKHJvdXRlIGluc3RhbmNlb2YgTWVkaWFSb3V0ZXIuUm91dGVHcm91cCkgeworICAgICAgICAgICAgICAgIC8vIE9ubHkgc3BlYWtlcnMgY2FuIGJlIGdyb3VwZWQgZm9yIG5vdy4KKyAgICAgICAgICAgICAgICByZXR1cm4gbVNwZWFrZXJHcm91cEljb247CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbURlZmF1bHRJY29uOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgeworICAgICAgICBNZWRpYVJvdXRlckNhbGxiYWNrKCkgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7CisgICAgICAgICAgICByZWZyZXNoUm91dGVzKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVJlbW92ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgeworICAgICAgICAgICAgcmVmcmVzaFJvdXRlcygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGluZm8pIHsKKyAgICAgICAgICAgIHJlZnJlc2hSb3V0ZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKKyAgICAgICAgICAgIGRpc21pc3MoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBSb3V0ZUNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yPE1lZGlhUm91dGVyLlJvdXRlSW5mbz4geworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFJvdXRlQ29tcGFyYXRvciBzSW5zdGFuY2UgPSBuZXcgUm91dGVDb21wYXJhdG9yKCk7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gbGhzLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcmhzKSB7CisgICAgICAgICAgICByZXR1cm4gbGhzLmdldE5hbWUoKS5jb21wYXJlVG9JZ25vcmVDYXNlKHJocy5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWU2YjI5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50LmphdmEKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCitpbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7CisKKy8qKgorICogTWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cgZnJhZ21lbnQuCisgKiA8cD4KKyAqIENyZWF0ZXMgYSB7QGxpbmsgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2d9LiAgVGhlIGFwcGxpY2F0aW9uIG1heSBzdWJjbGFzcworICogdGhpcyBkaWFsb2cgZnJhZ21lbnQgdG8gY3VzdG9taXplIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KKyAqIDwvcD4KKyAqLworcHVibGljIGNsYXNzIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQgZXh0ZW5kcyBEaWFsb2dGcmFnbWVudCB7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfU0VMRUNUT1IgPSAic2VsZWN0b3IiOworCisgICAgcHJpdmF0ZSBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyBtRGlhbG9nOworICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvcjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZyBmcmFnbWVudC4KKyAgICAgKiA8cD4KKyAgICAgKiBBbGwgc3ViY2xhc3NlcyBvZiB0aGlzIGNsYXNzIG11c3QgYWxzbyBwb3NzZXNzIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQoKSB7CisgICAgICAgIHNldENhbmNlbGFibGUodHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuIHNlbGVjdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHNlbGVjdG9yLCBuZXZlciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBNZWRpYVJvdXRlU2VsZWN0b3IgZ2V0Um91dGVTZWxlY3RvcigpIHsKKyAgICAgICAgZW5zdXJlUm91dGVTZWxlY3RvcigpOworICAgICAgICByZXR1cm4gbVNlbGVjdG9yOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVSb3V0ZVNlbGVjdG9yKCkgeworICAgICAgICBpZiAobVNlbGVjdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIEJ1bmRsZSBhcmdzID0gZ2V0QXJndW1lbnRzKCk7CisgICAgICAgICAgICBpZiAoYXJncyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLmZyb21CdW5kbGUoYXJncy5nZXRCdW5kbGUoQVJHVU1FTlRfU0VMRUNUT1IpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtU2VsZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbiBzZWxlY3QuCisgICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBmcmFnbWVudCBpcyBhZGRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKworICAgICAgICBlbnN1cmVSb3V0ZVNlbGVjdG9yKCk7CisgICAgICAgIGlmICghbVNlbGVjdG9yLmVxdWFscyhzZWxlY3RvcikpIHsKKyAgICAgICAgICAgIG1TZWxlY3RvciA9IHNlbGVjdG9yOworCisgICAgICAgICAgICBCdW5kbGUgYXJncyA9IGdldEFyZ3VtZW50cygpOworICAgICAgICAgICAgaWYgKGFyZ3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFyZ3MgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcmdzLnB1dEJ1bmRsZShBUkdVTUVOVF9TRUxFQ1RPUiwgc2VsZWN0b3IuYXNCdW5kbGUoKSk7CisgICAgICAgICAgICBzZXRBcmd1bWVudHMoYXJncyk7CisKKyAgICAgICAgICAgIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nIGRpYWxvZyA9IChNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZylnZXREaWFsb2coKTsKKyAgICAgICAgICAgIGlmIChkaWFsb2cgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRSb3V0ZVNlbGVjdG9yKHNlbGVjdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBjaG9vc2VyIGRpYWxvZyBpcyBiZWluZyBjcmVhdGVkLgorICAgICAqIDxwPgorICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB0aGUgZGlhbG9nLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cgb25DcmVhdGVDaG9vc2VyRGlhbG9nKAorICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2coY29udGV4dCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIERpYWxvZyBvbkNyZWF0ZURpYWxvZyhCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIG1EaWFsb2cgPSBvbkNyZWF0ZUNob29zZXJEaWFsb2coZ2V0Q29udGV4dCgpLCBzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBtRGlhbG9nLnNldFJvdXRlU2VsZWN0b3IoZ2V0Um91dGVTZWxlY3RvcigpKTsKKyAgICAgICAgcmV0dXJuIG1EaWFsb2c7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgeworICAgICAgICBzdXBlci5vbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKG5ld0NvbmZpZyk7CisgICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1EaWFsb2cudXBkYXRlTGF5b3V0KCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYwY2ZjYQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2cuamF2YQpAQCAtMCwwICsxLDE0ODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZUNvbXBhdC5BQ1RJT05fUEFVU0U7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGVDb21wYXQuQUNUSU9OX1BMQVk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGVDb21wYXQuQUNUSU9OX1BMQVlfUEFVU0U7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGVDb21wYXQuQUNUSU9OX1NUT1A7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BbGVydERpYWxvZzsKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkFzeW5jVGFzazsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5NZWRpYURlc2NyaXB0aW9uQ29tcGF0OworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5NZWRpYU1ldGFkYXRhQ29tcGF0OworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5zZXNzaW9uLk1lZGlhQ29udHJvbGxlckNvbXBhdDsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb25Db21wYXQ7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZUNvbXBhdDsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudXRpbC5PYmplY3RzQ29tcGF0OworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50Q29tcGF0OworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52Ny5ncmFwaGljcy5QYWxldHRlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk1lYXN1cmVTcGVjOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdUcmVlT2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWNjZWxlcmF0ZURlY2VsZXJhdGVJbnRlcnBvbGF0b3I7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbHBoYUFuaW1hdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvblNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvblV0aWxzOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uSW50ZXJwb2xhdG9yOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uVHJhbnNmb3JtYXRpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5UcmFuc2xhdGVBbmltYXRpb247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbGF0aXZlTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNlZWtCYXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOworaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOworaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuT3ZlcmxheUxpc3RWaWV3Lk92ZXJsYXlPYmplY3Q7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCisvKioKKyAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgcm91dGUgY29udHJvbGxlciBkaWFsb2cgZm9yIHtAbGluayBNZWRpYVJvdXRlcn0uCisgKiA8cD4KKyAqIFRoaXMgZGlhbG9nIGFsbG93cyB0aGUgdXNlciB0byBjb250cm9sIG9yIGRpc2Nvbm5lY3QgZnJvbSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlLgorICogPC9wPgorICoKKyAqIEBzZWUgTWVkaWFSb3V0ZUJ1dHRvbgorICogQHNlZSBNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIKKyAqLworcHVibGljIGNsYXNzIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nIGV4dGVuZHMgQWxlcnREaWFsb2cgeworICAgIC8vIFRhZ3Mgc2hvdWxkIGJlIGxlc3MgdGhhbiAyNCBjaGFyYWN0ZXJzIGxvbmcgKHNlZSBkb2NzIGZvciBhbmRyb2lkLnV0aWwuTG9nLmlzTG9nZ2FibGUoKSkKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlQ3RybERpYWxvZyI7CisgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7CisKKyAgICAvLyBUaW1lIHRvIHdhaXQgYmVmb3JlIHVwZGF0aW5nIHRoZSB2b2x1bWUgd2hlbiB0aGUgdXNlciBsZXRzIGdvIG9mIHRoZSBzZWVrIGJhcgorICAgIC8vIHRvIGFsbG93IHRoZSByb3V0ZSBwcm92aWRlciB0aW1lIHRvIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIGFuZCBwdWJsaXNoIGEgbmV3CisgICAgLy8gcm91dGUgZGVzY3JpcHRvci4KKyAgICBzdGF0aWMgZmluYWwgaW50IFZPTFVNRV9VUERBVEVfREVMQVlfTUlMTElTID0gNTAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVElPTl9USU1FT1VUX01JTExJUyA9IChpbnQpIFRpbWVVbml0LlNFQ09ORFMudG9NaWxsaXMoMzBMKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVVRUT05fTkVVVFJBTF9SRVNfSUQgPSBhbmRyb2lkLlIuaWQuYnV0dG9uMzsKKyAgICBzdGF0aWMgZmluYWwgaW50IEJVVFRPTl9ESVNDT05ORUNUX1JFU19JRCA9IGFuZHJvaWQuUi5pZC5idXR0b24yOworICAgIHN0YXRpYyBmaW5hbCBpbnQgQlVUVE9OX1NUT1BfUkVTX0lEID0gYW5kcm9pZC5SLmlkLmJ1dHRvbjE7CisKKyAgICBmaW5hbCBNZWRpYVJvdXRlciBtUm91dGVyOworICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZXJDYWxsYmFjayBtQ2FsbGJhY2s7CisgICAgZmluYWwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIG1Sb3V0ZTsKKworICAgIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1DcmVhdGVkOworICAgIHByaXZhdGUgYm9vbGVhbiBtQXR0YWNoZWRUb1dpbmRvdzsKKworICAgIHByaXZhdGUgaW50IG1EaWFsb2dDb250ZW50V2lkdGg7CisKKyAgICBwcml2YXRlIFZpZXcgbUN1c3RvbUNvbnRyb2xWaWV3OworCisgICAgcHJpdmF0ZSBCdXR0b24gbURpc2Nvbm5lY3RCdXR0b247CisgICAgcHJpdmF0ZSBCdXR0b24gbVN0b3BDYXN0aW5nQnV0dG9uOworICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbVBsYXliYWNrQ29udHJvbEJ1dHRvbjsKKyAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1DbG9zZUJ1dHRvbjsKKyAgICBwcml2YXRlIE1lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbiBtR3JvdXBFeHBhbmRDb2xsYXBzZUJ1dHRvbjsKKworICAgIHByaXZhdGUgRnJhbWVMYXlvdXQgbUV4cGFuZGFibGVBcmVhTGF5b3V0OworICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1EaWFsb2dBcmVhTGF5b3V0OworICAgIEZyYW1lTGF5b3V0IG1EZWZhdWx0Q29udHJvbExheW91dDsKKyAgICBwcml2YXRlIEZyYW1lTGF5b3V0IG1DdXN0b21Db250cm9sTGF5b3V0OworICAgIHByaXZhdGUgSW1hZ2VWaWV3IG1BcnRWaWV3OworICAgIHByaXZhdGUgVGV4dFZpZXcgbVRpdGxlVmlldzsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1TdWJ0aXRsZVZpZXc7CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtUm91dGVOYW1lVGV4dFZpZXc7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbVZvbHVtZUNvbnRyb2xFbmFibGVkID0gdHJ1ZTsKKyAgICAvLyBMYXlvdXQgZm9yIG1lZGlhIGNvbnRyb2xsZXJzIGluY2x1ZGluZyBwbGF5L3BhdXNlIGJ1dHRvbiBhbmQgdGhlIG1haW4gdm9sdW1lIHNsaWRlci4KKyAgICBwcml2YXRlIExpbmVhckxheW91dCBtTWVkaWFNYWluQ29udHJvbExheW91dDsKKyAgICBwcml2YXRlIFJlbGF0aXZlTGF5b3V0IG1QbGF5YmFja0NvbnRyb2xMYXlvdXQ7CisgICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbVZvbHVtZUNvbnRyb2xMYXlvdXQ7CisgICAgcHJpdmF0ZSBWaWV3IG1EaXZpZGVyVmlldzsKKworICAgIE92ZXJsYXlMaXN0VmlldyBtVm9sdW1lR3JvdXBMaXN0OworICAgIFZvbHVtZUdyb3VwQWRhcHRlciBtVm9sdW1lR3JvdXBBZGFwdGVyOworICAgIHByaXZhdGUgTGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IG1Hcm91cE1lbWJlclJvdXRlczsKKyAgICBTZXQ8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZDsKKyAgICBwcml2YXRlIFNldDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQ7CisgICAgU2V0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gbUdyb3VwTWVtYmVyUm91dGVzQW5pbWF0aW5nV2l0aEJpdG1hcDsKKyAgICBTZWVrQmFyIG1Wb2x1bWVTbGlkZXI7CisgICAgVm9sdW1lQ2hhbmdlTGlzdGVuZXIgbVZvbHVtZUNoYW5nZUxpc3RlbmVyOworICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBtUm91dGVJblZvbHVtZVNsaWRlclRvdWNoZWQ7CisgICAgcHJpdmF0ZSBpbnQgbVZvbHVtZUdyb3VwTGlzdEl0ZW1JY29uU2l6ZTsKKyAgICBwcml2YXRlIGludCBtVm9sdW1lR3JvdXBMaXN0SXRlbUhlaWdodDsKKyAgICBwcml2YXRlIGludCBtVm9sdW1lR3JvdXBMaXN0TWF4SGVpZ2h0OworICAgIHByaXZhdGUgZmluYWwgaW50IG1Wb2x1bWVHcm91cExpc3RQYWRkaW5nVG9wOworICAgIE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIFNlZWtCYXI+IG1Wb2x1bWVTbGlkZXJNYXA7CisKKyAgICBNZWRpYUNvbnRyb2xsZXJDb21wYXQgbU1lZGlhQ29udHJvbGxlcjsKKyAgICBNZWRpYUNvbnRyb2xsZXJDYWxsYmFjayBtQ29udHJvbGxlckNhbGxiYWNrOworICAgIFBsYXliYWNrU3RhdGVDb21wYXQgbVN0YXRlOworICAgIE1lZGlhRGVzY3JpcHRpb25Db21wYXQgbURlc2NyaXB0aW9uOworCisgICAgRmV0Y2hBcnRUYXNrIG1GZXRjaEFydFRhc2s7CisgICAgQml0bWFwIG1BcnRJY29uQml0bWFwOworICAgIFVyaSBtQXJ0SWNvblVyaTsKKyAgICBib29sZWFuIG1BcnRJY29uSXNMb2FkZWQ7CisgICAgQml0bWFwIG1BcnRJY29uTG9hZGVkQml0bWFwOworICAgIGludCBtQXJ0SWNvbkJhY2tncm91bmRDb2xvcjsKKworICAgIGJvb2xlYW4gbUhhc1BlbmRpbmdVcGRhdGU7CisgICAgYm9vbGVhbiBtUGVuZGluZ1VwZGF0ZUFuaW1hdGlvbk5lZWRlZDsKKworICAgIGJvb2xlYW4gbUlzR3JvdXBFeHBhbmRlZDsKKyAgICBib29sZWFuIG1Jc0dyb3VwTGlzdEFuaW1hdGluZzsKKyAgICBib29sZWFuIG1Jc0dyb3VwTGlzdEFuaW1hdGlvblBlbmRpbmc7CisgICAgaW50IG1Hcm91cExpc3RBbmltYXRpb25EdXJhdGlvbk1zOworICAgIHByaXZhdGUgaW50IG1Hcm91cExpc3RGYWRlSW5EdXJhdGlvbk1zOworICAgIHByaXZhdGUgaW50IG1Hcm91cExpc3RGYWRlT3V0RHVyYXRpb25NczsKKworICAgIHByaXZhdGUgSW50ZXJwb2xhdG9yIG1JbnRlcnBvbGF0b3I7CisgICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUxpbmVhck91dFNsb3dJbkludGVycG9sYXRvcjsKKyAgICBwcml2YXRlIEludGVycG9sYXRvciBtRmFzdE91dFNsb3dJbkludGVycG9sYXRvcjsKKyAgICBwcml2YXRlIEludGVycG9sYXRvciBtQWNjZWxlcmF0ZURlY2VsZXJhdGVJbnRlcnBvbGF0b3I7CisKKyAgICBmaW5hbCBBY2Nlc3NpYmlsaXR5TWFuYWdlciBtQWNjZXNzaWJpbGl0eU1hbmFnZXI7CisKKyAgICBSdW5uYWJsZSBtR3JvdXBMaXN0RmFkZUluQW5pbWF0aW9uID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgc3RhcnRHcm91cExpc3RGYWRlSW5BbmltYXRpb24oKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2coQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgMCk7CisgICAgfQorCisgICAgcHVibGljIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nKENvbnRleHQgY29udGV4dCwgaW50IHRoZW1lKSB7CisgICAgICAgIC8vIFRPRE8gKGIvNzI5NzU5NzYpOiBBdm9pZCB0byB1c2UgQ29udGV4dFRoZW1lV3JhcHBlciB3aXRoIGFwcCBjb250ZXh0IGFuZCBsaWIgdGhlbWUuCisgICAgICAgIHN1cGVyKG5ldyBDb250ZXh0VGhlbWVXcmFwcGVyKGNvbnRleHQsIEFwaUhlbHBlci5nZXRMaWJUaGVtZShjb250ZXh0LAorICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0Um91dGVyVGhlbWVJZChjb250ZXh0KSkpLCB0aGVtZSk7CisgICAgICAgIG1Db250ZXh0ID0gZ2V0Q29udGV4dCgpOworCisgICAgICAgIG1Db250cm9sbGVyQ2FsbGJhY2sgPSBuZXcgTWVkaWFDb250cm9sbGVyQ2FsbGJhY2soKTsKKyAgICAgICAgbVJvdXRlciA9IE1lZGlhUm91dGVyLmdldEluc3RhbmNlKG1Db250ZXh0KTsKKyAgICAgICAgbUNhbGxiYWNrID0gbmV3IE1lZGlhUm91dGVyQ2FsbGJhY2soKTsKKyAgICAgICAgbVJvdXRlID0gbVJvdXRlci5nZXRTZWxlY3RlZFJvdXRlKCk7CisgICAgICAgIHNldE1lZGlhU2Vzc2lvbihtUm91dGVyLmdldE1lZGlhU2Vzc2lvblRva2VuKCkpOworICAgICAgICBtVm9sdW1lR3JvdXBMaXN0UGFkZGluZ1RvcCA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAorICAgICAgICAgICAgICAgIFIuZGltZW4ubXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9wYWRkaW5nX3RvcCk7CisgICAgICAgIG1BY2Nlc3NpYmlsaXR5TWFuYWdlciA9CisgICAgICAgICAgICAgICAgKEFjY2Vzc2liaWxpdHlNYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQUNDRVNTSUJJTElUWV9TRVJWSUNFKTsKKyAgICAgICAgbUxpbmVhck91dFNsb3dJbkludGVycG9sYXRvciA9IEFuaW1hdGlvblV0aWxzLmxvYWRJbnRlcnBvbGF0b3IoCisgICAgICAgICAgICAgICAgbUNvbnRleHQsIGFuZHJvaWQuUi5pbnRlcnBvbGF0b3IubGluZWFyX291dF9zbG93X2luKTsKKyAgICAgICAgbUZhc3RPdXRTbG93SW5JbnRlcnBvbGF0b3IgPSBBbmltYXRpb25VdGlscy5sb2FkSW50ZXJwb2xhdG9yKAorICAgICAgICAgICAgICAgIG1Db250ZXh0LCBhbmRyb2lkLlIuaW50ZXJwb2xhdG9yLmZhc3Rfb3V0X3Nsb3dfaW4pOworICAgICAgICBtQWNjZWxlcmF0ZURlY2VsZXJhdGVJbnRlcnBvbGF0b3IgPSBuZXcgQWNjZWxlcmF0ZURlY2VsZXJhdGVJbnRlcnBvbGF0b3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSByb3V0ZSB0aGF0IHRoaXMgZGlhbG9nIGlzIGNvbnRyb2xsaW5nLgorICAgICAqLworICAgIHB1YmxpYyBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gZ2V0Um91dGUoKSB7CisgICAgICAgIHJldHVybiBtUm91dGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBNZWRpYVJvdXRlci5Sb3V0ZUdyb3VwIGdldEdyb3VwKCkgeworICAgICAgICBpZiAobVJvdXRlIGluc3RhbmNlb2YgTWVkaWFSb3V0ZXIuUm91dGVHcm91cCkgeworICAgICAgICAgICAgcmV0dXJuIChNZWRpYVJvdXRlci5Sb3V0ZUdyb3VwKSBtUm91dGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvdmlkZXMgdGhlIHN1YmNsYXNzIGFuIG9wcG9ydHVuaXR5IHRvIGNyZWF0ZSBhIHZpZXcgdGhhdCB3aWxsIHJlcGxhY2UgdGhlIGRlZmF1bHQgbWVkaWEKKyAgICAgKiBjb250cm9scyBmb3IgdGhlIGN1cnJlbnRseSBwbGF5aW5nIGNvbnRlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2F2ZWRJbnN0YW5jZVN0YXRlIFRoZSBkaWFsb2cncyBzYXZlZCBpbnN0YW5jZSBzdGF0ZS4KKyAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSBjb250cm9sIHZpZXcsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZU1lZGlhQ29udHJvbFZpZXcoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBtZWRpYSBjb250cm9sIHZpZXcgdGhhdCB3YXMgY3JlYXRlZCBieSB7QGxpbmsgI29uQ3JlYXRlTWVkaWFDb250cm9sVmlldyhCdW5kbGUpfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIGNvbnRyb2wgdmlldywgb3IgbnVsbCBpZiBub25lLgorICAgICAqLworICAgIHB1YmxpYyBWaWV3IGdldE1lZGlhQ29udHJvbFZpZXcoKSB7CisgICAgICAgIHJldHVybiBtQ3VzdG9tQ29udHJvbFZpZXc7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIHRvIGVuYWJsZSB0aGUgdm9sdW1lIHNsaWRlciBhbmQgdm9sdW1lIGNvbnRyb2wgdXNpbmcgdGhlIHZvbHVtZSBrZXlzCisgICAgICogd2hlbiB0aGUgcm91dGUgc3VwcG9ydHMgaXQuCisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZS4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Vm9sdW1lQ29udHJvbEVuYWJsZWQoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgaWYgKG1Wb2x1bWVDb250cm9sRW5hYmxlZCAhPSBlbmFibGUpIHsKKyAgICAgICAgICAgIG1Wb2x1bWVDb250cm9sRW5hYmxlZCA9IGVuYWJsZTsKKyAgICAgICAgICAgIGlmIChtQ3JlYXRlZCkgeworICAgICAgICAgICAgICAgIHVwZGF0ZShmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdG8gZW5hYmxlIHRoZSB2b2x1bWUgc2xpZGVyIGFuZCB2b2x1bWUgY29udHJvbCB1c2luZyB0aGUgdm9sdW1lIGtleXMKKyAgICAgKiB3aGVuIHRoZSByb3V0ZSBzdXBwb3J0cyBpdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZvbHVtZUNvbnRyb2xFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gbVZvbHVtZUNvbnRyb2xFbmFibGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2Vzc2lvbiB0byB1c2UgZm9yIG1ldGFkYXRhIGFuZCB0cmFuc3BvcnQgY29udHJvbHMuIFRoZSBkaWFsb2cKKyAgICAgKiB3aWxsIGxpc3RlbiB0byBjaGFuZ2VzIG9uIHRoaXMgc2Vzc2lvbiBhbmQgdXBkYXRlIHRoZSBVSSBhdXRvbWF0aWNhbGx5IGluCisgICAgICogcmVzcG9uc2UgdG8gY2hhbmdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXNzaW9uVG9rZW4gVGhlIHRva2VuIGZvciB0aGUgc2Vzc2lvbiB0byB1c2UuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldE1lZGlhU2Vzc2lvbihNZWRpYVNlc3Npb25Db21wYXQuVG9rZW4gc2Vzc2lvblRva2VuKSB7CisgICAgICAgIGlmIChtTWVkaWFDb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIudW5yZWdpc3RlckNhbGxiYWNrKG1Db250cm9sbGVyQ2FsbGJhY2spOworICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlciA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNlc3Npb25Ub2tlbiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtQXR0YWNoZWRUb1dpbmRvdykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyID0gbmV3IE1lZGlhQ29udHJvbGxlckNvbXBhdChtQ29udGV4dCwgc2Vzc2lvblRva2VuKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIGNyZWF0aW5nIG1lZGlhIGNvbnRyb2xsZXIgaW4gc2V0TWVkaWFTZXNzaW9uLiIsIGUpOworICAgICAgICB9CisgICAgICAgIGlmIChtTWVkaWFDb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIucmVnaXN0ZXJDYWxsYmFjayhtQ29udHJvbGxlckNhbGxiYWNrKTsKKyAgICAgICAgfQorICAgICAgICBNZWRpYU1ldGFkYXRhQ29tcGF0IG1ldGFkYXRhID0gbU1lZGlhQ29udHJvbGxlciA9PSBudWxsID8gbnVsbAorICAgICAgICAgICAgICAgIDogbU1lZGlhQ29udHJvbGxlci5nZXRNZXRhZGF0YSgpOworICAgICAgICBtRGVzY3JpcHRpb24gPSBtZXRhZGF0YSA9PSBudWxsID8gbnVsbCA6IG1ldGFkYXRhLmdldERlc2NyaXB0aW9uKCk7CisgICAgICAgIG1TdGF0ZSA9IG1NZWRpYUNvbnRyb2xsZXIgPT0gbnVsbCA/IG51bGwgOiBtTWVkaWFDb250cm9sbGVyLmdldFBsYXliYWNrU3RhdGUoKTsKKyAgICAgICAgdXBkYXRlQXJ0SWNvbklmTmVlZGVkKCk7CisgICAgICAgIHVwZGF0ZShmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgc2Vzc2lvbiB0byB1c2UgZm9yIG1ldGFkYXRhIGFuZCB0cmFuc3BvcnQgY29udHJvbHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB0b2tlbiBmb3IgdGhlIHNlc3Npb24gdG8gdXNlIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVkaWFTZXNzaW9uQ29tcGF0LlRva2VuIGdldE1lZGlhU2Vzc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIG1NZWRpYUNvbnRyb2xsZXIgPT0gbnVsbCA/IG51bGwgOiBtTWVkaWFDb250cm9sbGVyLmdldFNlc3Npb25Ub2tlbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBnZXRXaW5kb3coKS5zZXRCYWNrZ3JvdW5kRHJhd2FibGVSZXNvdXJjZShhbmRyb2lkLlIuY29sb3IudHJhbnNwYXJlbnQpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1Db250ZXh0LAorICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJUaGVtZShtQ29udGV4dCwgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRSb3V0ZXJUaGVtZUlkKG1Db250ZXh0KSksCisgICAgICAgICAgICAgICAgUi5sYXlvdXQubXJfY29udHJvbGxlcl9tYXRlcmlhbF9kaWFsb2dfYikpOworCisgICAgICAgIC8vIFJlbW92ZSB0aGUgbmV1dHJhbCBidXR0b24uCisgICAgICAgIGZpbmRWaWV3QnlJZChCVVRUT05fTkVVVFJBTF9SRVNfSUQpLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKworICAgICAgICBDbGlja0xpc3RlbmVyIGxpc3RlbmVyID0gbmV3IENsaWNrTGlzdGVuZXIoKTsKKworICAgICAgICBtRXhwYW5kYWJsZUFyZWFMYXlvdXQgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9leHBhbmRhYmxlX2FyZWEpOworICAgICAgICBtRXhwYW5kYWJsZUFyZWFMYXlvdXQuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBkaXNtaXNzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBtRGlhbG9nQXJlYUxheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2RpYWxvZ19hcmVhKTsKKyAgICAgICAgbURpYWxvZ0FyZWFMYXlvdXQuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICAvLyBFYXQgdW5oYW5kbGVkIHRvdWNoIGV2ZW50cy4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIGludCBjb2xvciA9IE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0QnV0dG9uVGV4dENvbG9yKG1Db250ZXh0KTsKKyAgICAgICAgbURpc2Nvbm5lY3RCdXR0b24gPSBmaW5kVmlld0J5SWQoQlVUVE9OX0RJU0NPTk5FQ1RfUkVTX0lEKTsKKyAgICAgICAgbURpc2Nvbm5lY3RCdXR0b24uc2V0VGV4dCgKKyAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRTdHJpbmcoUi5zdHJpbmcubXJfY29udHJvbGxlcl9kaXNjb25uZWN0KSk7CisgICAgICAgIG1EaXNjb25uZWN0QnV0dG9uLnNldFRleHRDb2xvcihjb2xvcik7CisgICAgICAgIG1EaXNjb25uZWN0QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICAgICAgbVN0b3BDYXN0aW5nQnV0dG9uID0gZmluZFZpZXdCeUlkKEJVVFRPTl9TVE9QX1JFU19JRCk7CisgICAgICAgIG1TdG9wQ2FzdGluZ0J1dHRvbi5zZXRUZXh0KAorICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldFN0cmluZyhSLnN0cmluZy5tcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZykpOworICAgICAgICBtU3RvcENhc3RpbmdCdXR0b24uc2V0VGV4dENvbG9yKGNvbG9yKTsKKyAgICAgICAgbVN0b3BDYXN0aW5nQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICAgICAgbVJvdXRlTmFtZVRleHRWaWV3ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfbmFtZSk7CisgICAgICAgIG1DbG9zZUJ1dHRvbiA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2Nsb3NlKTsKKyAgICAgICAgbUNsb3NlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIG1DdXN0b21Db250cm9sTGF5b3V0ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfY3VzdG9tX2NvbnRyb2wpOworICAgICAgICBtRGVmYXVsdENvbnRyb2xMYXlvdXQgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9kZWZhdWx0X2NvbnRyb2wpOworCisgICAgICAgIC8vIFN0YXJ0IHRoZSBzZXNzaW9uIGFjdGl2aXR5IHdoZW4gYSBjb250ZW50IGl0ZW0gKGFsYnVtIGFydCwgdGl0bGUgb3Igc3VidGl0bGUpIGlzIGNsaWNrZWQuCisgICAgICAgIFZpZXcuT25DbGlja0xpc3RlbmVyIG9uQ2xpY2tMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgcGkgPSBtTWVkaWFDb250cm9sbGVyLmdldFNlc3Npb25BY3Rpdml0eSgpOworICAgICAgICAgICAgICAgICAgICBpZiAocGkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaS5zZW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzbWlzcygpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUGVuZGluZ0ludGVudC5DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCBwaSArICIgd2FzIG5vdCBzZW50LCBpdCBoYWQgYmVlbiBjYW5jZWxlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgbUFydFZpZXcgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9hcnQpOworICAgICAgICBtQXJ0Vmlldy5zZXRPbkNsaWNrTGlzdGVuZXIob25DbGlja0xpc3RlbmVyKTsKKyAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQubXJfY29udHJvbF90aXRsZV9jb250YWluZXIpLnNldE9uQ2xpY2tMaXN0ZW5lcihvbkNsaWNrTGlzdGVuZXIpOworCisgICAgICAgIG1NZWRpYU1haW5Db250cm9sTGF5b3V0ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfbWVkaWFfbWFpbl9jb250cm9sKTsKKyAgICAgICAgbURpdmlkZXJWaWV3ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfY29udHJvbF9kaXZpZGVyKTsKKworICAgICAgICBtUGxheWJhY2tDb250cm9sTGF5b3V0ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfcGxheWJhY2tfY29udHJvbCk7CisgICAgICAgIG1UaXRsZVZpZXcgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jb250cm9sX3RpdGxlKTsKKyAgICAgICAgbVN1YnRpdGxlVmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2NvbnRyb2xfc3VidGl0bGUpOworICAgICAgICBtUGxheWJhY2tDb250cm9sQnV0dG9uID0gZmluZFZpZXdCeUlkKFIuaWQubXJfY29udHJvbF9wbGF5YmFja19jdHJsKTsKKyAgICAgICAgbVBsYXliYWNrQ29udHJvbEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgICAgIG1Wb2x1bWVDb250cm9sTGF5b3V0ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfdm9sdW1lX2NvbnRyb2wpOworICAgICAgICBtVm9sdW1lQ29udHJvbExheW91dC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIG1Wb2x1bWVTbGlkZXIgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl92b2x1bWVfc2xpZGVyKTsKKyAgICAgICAgbVZvbHVtZVNsaWRlci5zZXRUYWcobVJvdXRlKTsKKyAgICAgICAgbVZvbHVtZUNoYW5nZUxpc3RlbmVyID0gbmV3IFZvbHVtZUNoYW5nZUxpc3RlbmVyKCk7CisgICAgICAgIG1Wb2x1bWVTbGlkZXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIobVZvbHVtZUNoYW5nZUxpc3RlbmVyKTsKKworICAgICAgICBtVm9sdW1lR3JvdXBMaXN0ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfdm9sdW1lX2dyb3VwX2xpc3QpOworICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4oKTsKKyAgICAgICAgbVZvbHVtZUdyb3VwQWRhcHRlciA9IG5ldyBWb2x1bWVHcm91cEFkYXB0ZXIobVZvbHVtZUdyb3VwTGlzdC5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzKTsKKyAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5zZXRBZGFwdGVyKG1Wb2x1bWVHcm91cEFkYXB0ZXIpOworICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNBbmltYXRpbmdXaXRoQml0bWFwID0gbmV3IEhhc2hTZXQ8PigpOworCisgICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuc2V0TWVkaWFDb250cm9sc0JhY2tncm91bmRDb2xvcihtQ29udGV4dCwKKyAgICAgICAgICAgICAgICBtTWVkaWFNYWluQ29udHJvbExheW91dCwgbVZvbHVtZUdyb3VwTGlzdCwgZ2V0R3JvdXAoKSAhPSBudWxsKTsKKyAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5zZXRWb2x1bWVTbGlkZXJDb2xvcihtQ29udGV4dCwKKyAgICAgICAgICAgICAgICAoTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcikgbVZvbHVtZVNsaWRlciwgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQpOworICAgICAgICBtVm9sdW1lU2xpZGVyTWFwID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBtVm9sdW1lU2xpZGVyTWFwLnB1dChtUm91dGUsIG1Wb2x1bWVTbGlkZXIpOworCisgICAgICAgIG1Hcm91cEV4cGFuZENvbGxhcHNlQnV0dG9uID0KKyAgICAgICAgICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC5tcl9ncm91cF9leHBhbmRfY29sbGFwc2UpOworICAgICAgICBtR3JvdXBFeHBhbmRDb2xsYXBzZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIG1Jc0dyb3VwRXhwYW5kZWQgPSAhbUlzR3JvdXBFeHBhbmRlZDsKKyAgICAgICAgICAgICAgICBpZiAobUlzR3JvdXBFeHBhbmRlZCkgeworICAgICAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9hZEludGVycG9sYXRvcigpOworICAgICAgICAgICAgICAgIHVwZGF0ZUxheW91dEhlaWdodCh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIGxvYWRJbnRlcnBvbGF0b3IoKTsKKyAgICAgICAgbUdyb3VwTGlzdEFuaW1hdGlvbkR1cmF0aW9uTXMgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRJbnRlZ2VyKAorICAgICAgICAgICAgICAgIFIuaW50ZWdlci5tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2FuaW1hdGlvbl9kdXJhdGlvbl9tcyk7CisgICAgICAgIG1Hcm91cExpc3RGYWRlSW5EdXJhdGlvbk1zID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0SW50ZWdlcigKKyAgICAgICAgICAgICAgICBSLmludGVnZXIubXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9mYWRlX2luX2R1cmF0aW9uX21zKTsKKyAgICAgICAgbUdyb3VwTGlzdEZhZGVPdXREdXJhdGlvbk1zID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0SW50ZWdlcigKKyAgICAgICAgICAgICAgICBSLmludGVnZXIubXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9mYWRlX291dF9kdXJhdGlvbl9tcyk7CisKKyAgICAgICAgbUN1c3RvbUNvbnRyb2xWaWV3ID0gb25DcmVhdGVNZWRpYUNvbnRyb2xWaWV3KHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIGlmIChtQ3VzdG9tQ29udHJvbFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgbUN1c3RvbUNvbnRyb2xMYXlvdXQuYWRkVmlldyhtQ3VzdG9tQ29udHJvbFZpZXcpOworICAgICAgICAgICAgbUN1c3RvbUNvbnRyb2xMYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICB9CisgICAgICAgIG1DcmVhdGVkID0gdHJ1ZTsKKyAgICAgICAgdXBkYXRlTGF5b3V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgd2lkdGggb2YgdGhlIGRpYWxvZy4gQWxzbyBjYWxsZWQgd2hlbiBjb25maWd1cmF0aW9uIGNoYW5nZXMuCisgICAgICovCisgICAgdm9pZCB1cGRhdGVMYXlvdXQoKSB7CisgICAgICAgIGludCB3aWR0aCA9IE1lZGlhUm91dGVEaWFsb2dIZWxwZXIuZ2V0RGlhbG9nV2lkdGgobUNvbnRleHQpOworICAgICAgICBnZXRXaW5kb3coKS5zZXRMYXlvdXQod2lkdGgsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKKworICAgICAgICBWaWV3IGRlY29yVmlldyA9IGdldFdpbmRvdygpLmdldERlY29yVmlldygpOworICAgICAgICBtRGlhbG9nQ29udGVudFdpZHRoID0gd2lkdGggLSBkZWNvclZpZXcuZ2V0UGFkZGluZ0xlZnQoKSAtIGRlY29yVmlldy5nZXRQYWRkaW5nUmlnaHQoKTsKKworICAgICAgICBSZXNvdXJjZXMgcmVzID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCk7CisgICAgICAgIG1Wb2x1bWVHcm91cExpc3RJdGVtSWNvblNpemUgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAorICAgICAgICAgICAgICAgIFIuZGltZW4ubXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2ljb25fc2l6ZSk7CisgICAgICAgIG1Wb2x1bWVHcm91cExpc3RJdGVtSGVpZ2h0ID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKKyAgICAgICAgICAgICAgICBSLmRpbWVuLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9oZWlnaHQpOworICAgICAgICBtVm9sdW1lR3JvdXBMaXN0TWF4SGVpZ2h0ID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKKyAgICAgICAgICAgICAgICBSLmRpbWVuLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfbWF4X2hlaWdodCk7CisKKyAgICAgICAgLy8gRmV0Y2ggYXJ0IGljb25zIGFnYWluIGZvciBsYXlvdXQgY2hhbmdlcyB0byByZXNpemUgaXQgYWNjb3JkaW5nbHkKKyAgICAgICAgbUFydEljb25CaXRtYXAgPSBudWxsOworICAgICAgICBtQXJ0SWNvblVyaSA9IG51bGw7CisgICAgICAgIHVwZGF0ZUFydEljb25JZk5lZWRlZCgpOworICAgICAgICB1cGRhdGUoZmFsc2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpIHsKKyAgICAgICAgc3VwZXIub25BdHRhY2hlZFRvV2luZG93KCk7CisgICAgICAgIG1BdHRhY2hlZFRvV2luZG93ID0gdHJ1ZTsKKworICAgICAgICBtUm91dGVyLmFkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWSwgbUNhbGxiYWNrLAorICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFMpOworICAgICAgICBzZXRNZWRpYVNlc3Npb24obVJvdXRlci5nZXRNZWRpYVNlc3Npb25Ub2tlbigpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKKyAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOworICAgICAgICBzZXRNZWRpYVNlc3Npb24obnVsbCk7CisgICAgICAgIG1BdHRhY2hlZFRvV2luZG93ID0gZmFsc2U7CisgICAgICAgIHN1cGVyLm9uRGV0YWNoZWRGcm9tV2luZG93KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1ZPTFVNRV9ET1dOCisgICAgICAgICAgICAgICAgfHwga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1ZPTFVNRV9VUCkgeworICAgICAgICAgICAgbVJvdXRlLnJlcXVlc3RVcGRhdGVWb2x1bWUoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1ZPTFVNRV9ET1dOID8gLTEgOiAxKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uS2V5VXAoaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfVk9MVU1FX0RPV04KKyAgICAgICAgICAgICAgICB8fCBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfVk9MVU1FX1VQKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIub25LZXlVcChrZXlDb2RlLCBldmVudCk7CisgICAgfQorCisgICAgdm9pZCB1cGRhdGUoYm9vbGVhbiBhbmltYXRlKSB7CisgICAgICAgIC8vIERlZmVyIGRpYWxvZyB1cGRhdGVzIGlmIGEgdXNlciBpcyBhZGp1c3RpbmcgYSB2b2x1bWUgaW4gdGhlIGxpc3QKKyAgICAgICAgaWYgKG1Sb3V0ZUluVm9sdW1lU2xpZGVyVG91Y2hlZCAhPSBudWxsKSB7CisgICAgICAgICAgICBtSGFzUGVuZGluZ1VwZGF0ZSA9IHRydWU7CisgICAgICAgICAgICBtUGVuZGluZ1VwZGF0ZUFuaW1hdGlvbk5lZWRlZCB8PSBhbmltYXRlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1IYXNQZW5kaW5nVXBkYXRlID0gZmFsc2U7CisgICAgICAgIG1QZW5kaW5nVXBkYXRlQW5pbWF0aW9uTmVlZGVkID0gZmFsc2U7CisgICAgICAgIGlmICghbVJvdXRlLmlzU2VsZWN0ZWQoKSB8fCBtUm91dGUuaXNEZWZhdWx0T3JCbHVldG9vdGgoKSkgeworICAgICAgICAgICAgZGlzbWlzcygpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghbUNyZWF0ZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1Sb3V0ZU5hbWVUZXh0Vmlldy5zZXRUZXh0KG1Sb3V0ZS5nZXROYW1lKCkpOworICAgICAgICBtRGlzY29ubmVjdEJ1dHRvbi5zZXRWaXNpYmlsaXR5KG1Sb3V0ZS5jYW5EaXNjb25uZWN0KCkgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOworICAgICAgICBpZiAobUN1c3RvbUNvbnRyb2xWaWV3ID09IG51bGwgJiYgbUFydEljb25Jc0xvYWRlZCkgeworICAgICAgICAgICAgaWYgKGlzQml0bWFwUmVjeWNsZWQobUFydEljb25Mb2FkZWRCaXRtYXApKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2FuJ3Qgc2V0IGFydHdvcmsgaW1hZ2Ugd2l0aCByZWN5Y2xlZCBiaXRtYXA6ICIgKyBtQXJ0SWNvbkxvYWRlZEJpdG1hcCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1BcnRWaWV3LnNldEltYWdlQml0bWFwKG1BcnRJY29uTG9hZGVkQml0bWFwKTsKKyAgICAgICAgICAgICAgICBtQXJ0Vmlldy5zZXRCYWNrZ3JvdW5kQ29sb3IobUFydEljb25CYWNrZ3JvdW5kQ29sb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xlYXJMb2FkZWRCaXRtYXAoKTsKKyAgICAgICAgfQorICAgICAgICB1cGRhdGVWb2x1bWVDb250cm9sTGF5b3V0KCk7CisgICAgICAgIHVwZGF0ZVBsYXliYWNrQ29udHJvbExheW91dCgpOworICAgICAgICB1cGRhdGVMYXlvdXRIZWlnaHQoYW5pbWF0ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQml0bWFwUmVjeWNsZWQoQml0bWFwIGJpdG1hcCkgeworICAgICAgICByZXR1cm4gYml0bWFwICE9IG51bGwgJiYgYml0bWFwLmlzUmVjeWNsZWQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY2FuU2hvd1BsYXliYWNrQ29udHJvbExheW91dCgpIHsKKyAgICAgICAgcmV0dXJuIG1DdXN0b21Db250cm9sVmlldyA9PSBudWxsICYmIChtRGVzY3JpcHRpb24gIT0gbnVsbCB8fCBtU3RhdGUgIT0gbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaGVpZ2h0IG9mIG1haW4gbWVkaWEgY29udHJvbGxlciB3aGljaCBpbmNsdWRlcyBwbGF5YmFjayBjb250cm9sIGFuZCBtYXN0ZXIKKyAgICAgKiB2b2x1bWUgY29udHJvbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBnZXRNYWluQ29udHJvbGxlckhlaWdodChib29sZWFuIHNob3dQbGF5YmFja0NvbnRyb2wpIHsKKyAgICAgICAgaW50IGhlaWdodCA9IDA7CisgICAgICAgIGlmIChzaG93UGxheWJhY2tDb250cm9sIHx8IG1Wb2x1bWVDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKKyAgICAgICAgICAgIGhlaWdodCArPSBtTWVkaWFNYWluQ29udHJvbExheW91dC5nZXRQYWRkaW5nVG9wKCkKKyAgICAgICAgICAgICAgICAgICAgKyBtTWVkaWFNYWluQ29udHJvbExheW91dC5nZXRQYWRkaW5nQm90dG9tKCk7CisgICAgICAgICAgICBpZiAoc2hvd1BsYXliYWNrQ29udHJvbCkgeworICAgICAgICAgICAgICAgIGhlaWdodCArPSAgbVBsYXliYWNrQ29udHJvbExheW91dC5nZXRNZWFzdXJlZEhlaWdodCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1Wb2x1bWVDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKKyAgICAgICAgICAgICAgICBoZWlnaHQgKz0gbVZvbHVtZUNvbnRyb2xMYXlvdXQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaG93UGxheWJhY2tDb250cm9sICYmIG1Wb2x1bWVDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKKyAgICAgICAgICAgICAgICBoZWlnaHQgKz0gbURpdmlkZXJWaWV3LmdldE1lYXN1cmVkSGVpZ2h0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhlaWdodDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlTWVkaWFDb250cm9sVmlzaWJpbGl0eShib29sZWFuIGNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQpIHsKKyAgICAgICAgLy8gVE9ETzogVXBkYXRlIHRoZSB0b3AgYW5kIGJvdHRvbSBwYWRkaW5nIG9mIHRoZSBjb250cm9sIGxheW91dCBhY2NvcmRpbmcgdG8gdGhlIGRpc3BsYXkKKyAgICAgICAgLy8gaGVpZ2h0LgorICAgICAgICBtRGl2aWRlclZpZXcuc2V0VmlzaWJpbGl0eSgobVZvbHVtZUNvbnRyb2xMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRQorICAgICAgICAgICAgICAgICYmIGNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQpID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKKyAgICAgICAgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQuc2V0VmlzaWJpbGl0eSgobVZvbHVtZUNvbnRyb2xMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuR09ORQorICAgICAgICAgICAgICAgICYmICFjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KSA/IFZpZXcuR09ORSA6IFZpZXcuVklTSUJMRSk7CisgICAgfQorCisgICAgdm9pZCB1cGRhdGVMYXlvdXRIZWlnaHQoZmluYWwgYm9vbGVhbiBhbmltYXRlKSB7CisgICAgICAgIC8vIFdlIG5lZWQgdG8gZGVmZXIgdGhlIHVwZGF0ZSB1bnRpbCB0aGUgZmlyc3QgbGF5b3V0IGhhcyBvY2N1cnJlZCwgYXMgd2UgZG9uJ3QgeWV0IGtub3cgdGhlCisgICAgICAgIC8vIG92ZXJhbGwgdmlzaWJsZSBkaXNwbGF5IHNpemUgaW4gd2hpY2ggdGhlIHdpbmRvdyB0aGlzIHZpZXcgaXMgYXR0YWNoZWQgdG8gaGFzIGJlZW4KKyAgICAgICAgLy8gcG9zaXRpb25lZCBpbi4KKyAgICAgICAgbURlZmF1bHRDb250cm9sTGF5b3V0LnJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgVmlld1RyZWVPYnNlcnZlciBvYnNlcnZlciA9IG1EZWZhdWx0Q29udHJvbExheW91dC5nZXRWaWV3VHJlZU9ic2VydmVyKCk7CisgICAgICAgIG9ic2VydmVyLmFkZE9uR2xvYmFsTGF5b3V0TGlzdGVuZXIobmV3IFZpZXdUcmVlT2JzZXJ2ZXIuT25HbG9iYWxMYXlvdXRMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25HbG9iYWxMYXlvdXQoKSB7CisgICAgICAgICAgICAgICAgbURlZmF1bHRDb250cm9sTGF5b3V0LmdldFZpZXdUcmVlT2JzZXJ2ZXIoKS5yZW1vdmVHbG9iYWxPbkxheW91dExpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgIGlmIChtSXNHcm91cExpc3RBbmltYXRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgbUlzR3JvdXBMaXN0QW5pbWF0aW9uUGVuZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0SGVpZ2h0SW50ZXJuYWwoYW5pbWF0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIHRoZSBoZWlnaHQgb2Ygdmlld3MgYW5kIGhpZGUgYXJ0d29yayBvciBtZXRhZGF0YSBpZiBzcGFjZSBpcyBsaW1pdGVkLgorICAgICAqLworICAgIHZvaWQgdXBkYXRlTGF5b3V0SGVpZ2h0SW50ZXJuYWwoYm9vbGVhbiBhbmltYXRlKSB7CisgICAgICAgIC8vIE1lYXN1cmUgdGhlIHNpemUgb2Ygd2lkZ2V0cyBhbmQgZ2V0IHRoZSBoZWlnaHQgb2YgbWFpbiBjb21wb25lbnRzLgorICAgICAgICBpbnQgb2xkSGVpZ2h0ID0gZ2V0TGF5b3V0SGVpZ2h0KG1NZWRpYU1haW5Db250cm9sTGF5b3V0KTsKKyAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KG1NZWRpYU1haW5Db250cm9sTGF5b3V0LCBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7CisgICAgICAgIHVwZGF0ZU1lZGlhQ29udHJvbFZpc2liaWxpdHkoY2FuU2hvd1BsYXliYWNrQ29udHJvbExheW91dCgpKTsKKyAgICAgICAgVmlldyBkZWNvclZpZXcgPSBnZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKTsKKyAgICAgICAgZGVjb3JWaWV3Lm1lYXN1cmUoCisgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGdldFdpbmRvdygpLmdldEF0dHJpYnV0ZXMoKS53aWR0aCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSksCisgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQpOworICAgICAgICBzZXRMYXlvdXRIZWlnaHQobU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQsIG9sZEhlaWdodCk7CisgICAgICAgIGludCBhcnRWaWV3SGVpZ2h0ID0gMDsKKyAgICAgICAgaWYgKG1DdXN0b21Db250cm9sVmlldyA9PSBudWxsICYmIG1BcnRWaWV3LmdldERyYXdhYmxlKCkgaW5zdGFuY2VvZiBCaXRtYXBEcmF3YWJsZSkgeworICAgICAgICAgICAgQml0bWFwIGFydCA9ICgoQml0bWFwRHJhd2FibGUpIG1BcnRWaWV3LmdldERyYXdhYmxlKCkpLmdldEJpdG1hcCgpOworICAgICAgICAgICAgaWYgKGFydCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYXJ0Vmlld0hlaWdodCA9IGdldERlc2lyZWRBcnRIZWlnaHQoYXJ0LmdldFdpZHRoKCksIGFydC5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgbUFydFZpZXcuc2V0U2NhbGVUeXBlKGFydC5nZXRXaWR0aCgpID49IGFydC5nZXRIZWlnaHQoKQorICAgICAgICAgICAgICAgICAgICAgICAgPyBJbWFnZVZpZXcuU2NhbGVUeXBlLkZJVF9YWSA6IEltYWdlVmlldy5TY2FsZVR5cGUuRklUX0NFTlRFUik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50IG1haW5Db250cm9sbGVySGVpZ2h0ID0gZ2V0TWFpbkNvbnRyb2xsZXJIZWlnaHQoY2FuU2hvd1BsYXliYWNrQ29udHJvbExheW91dCgpKTsKKyAgICAgICAgaW50IHZvbHVtZUdyb3VwTGlzdENvdW50ID0gbUdyb3VwTWVtYmVyUm91dGVzLnNpemUoKTsKKyAgICAgICAgLy8gU2NhbGUgZG93biB2b2x1bWUgZ3JvdXAgbGlzdCBpdGVtcyBpbiBsYW5kc2NhcGUgbW9kZS4KKyAgICAgICAgaW50IGV4cGFuZGVkR3JvdXBMaXN0SGVpZ2h0ID0gZ2V0R3JvdXAoKSA9PSBudWxsID8gMCA6CisgICAgICAgICAgICAgICAgbVZvbHVtZUdyb3VwTGlzdEl0ZW1IZWlnaHQgKiBnZXRHcm91cCgpLmdldFJvdXRlcygpLnNpemUoKTsKKyAgICAgICAgaWYgKHZvbHVtZUdyb3VwTGlzdENvdW50ID4gMCkgeworICAgICAgICAgICAgZXhwYW5kZWRHcm91cExpc3RIZWlnaHQgKz0gbVZvbHVtZUdyb3VwTGlzdFBhZGRpbmdUb3A7CisgICAgICAgIH0KKyAgICAgICAgZXhwYW5kZWRHcm91cExpc3RIZWlnaHQgPSBNYXRoLm1pbihleHBhbmRlZEdyb3VwTGlzdEhlaWdodCwgbVZvbHVtZUdyb3VwTGlzdE1heEhlaWdodCk7CisgICAgICAgIGludCB2aXNpYmxlR3JvdXBMaXN0SGVpZ2h0ID0gbUlzR3JvdXBFeHBhbmRlZCA/IGV4cGFuZGVkR3JvdXBMaXN0SGVpZ2h0IDogMDsKKworICAgICAgICBpbnQgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgPQorICAgICAgICAgICAgICAgIE1hdGgubWF4KGFydFZpZXdIZWlnaHQsIHZpc2libGVHcm91cExpc3RIZWlnaHQpICsgbWFpbkNvbnRyb2xsZXJIZWlnaHQ7CisgICAgICAgIFJlY3QgdmlzaWJsZVJlY3QgPSBuZXcgUmVjdCgpOworICAgICAgICBkZWNvclZpZXcuZ2V0V2luZG93VmlzaWJsZURpc3BsYXlGcmFtZSh2aXNpYmxlUmVjdCk7CisgICAgICAgIC8vIEhlaWdodCBvZiBub24tY29udHJvbCB2aWV3cyBpbiBkZWNvciB2aWV3LgorICAgICAgICAvLyBUaGlzIGluY2x1ZGVzIHRpdGxlIGJhciwgYnV0dG9uIGJhciwgYW5kIGRpYWxvZydzIHZlcnRpY2FsIHBhZGRpbmcgd2hpY2ggc2hvdWxkIGJlCisgICAgICAgIC8vIGFsd2F5cyBzaG93bi4KKyAgICAgICAgaW50IG5vbkNvbnRyb2xWaWV3SGVpZ2h0ID0gbURpYWxvZ0FyZWFMYXlvdXQuZ2V0TWVhc3VyZWRIZWlnaHQoKQorICAgICAgICAgICAgICAgIC0gbURlZmF1bHRDb250cm9sTGF5b3V0LmdldE1lYXN1cmVkSGVpZ2h0KCk7CisgICAgICAgIC8vIE1heGltdW0gYWxsb3dlZCBoZWlnaHQgZm9yIGNvbnRyb2xzIHRvIGZpdCBzY3JlZW4uCisgICAgICAgIGludCBtYXhpbXVtQ29udHJvbFZpZXdIZWlnaHQgPSB2aXNpYmxlUmVjdC5oZWlnaHQoKSAtIG5vbkNvbnRyb2xWaWV3SGVpZ2h0OworCisgICAgICAgIC8vIFNob3cgYXJ0d29yayBpZiBpdCBmaXRzIHRoZSBzY3JlZW4uCisgICAgICAgIGlmIChtQ3VzdG9tQ29udHJvbFZpZXcgPT0gbnVsbCAmJiBhcnRWaWV3SGVpZ2h0ID4gMAorICAgICAgICAgICAgICAgICYmIGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0IDw9IG1heGltdW1Db250cm9sVmlld0hlaWdodCkgeworICAgICAgICAgICAgbUFydFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KG1BcnRWaWV3LCBhcnRWaWV3SGVpZ2h0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChnZXRMYXlvdXRIZWlnaHQobVZvbHVtZUdyb3VwTGlzdCkgKyBtTWVkaWFNYWluQ29udHJvbExheW91dC5nZXRNZWFzdXJlZEhlaWdodCgpCisgICAgICAgICAgICAgICAgICAgID49IG1EZWZhdWx0Q29udHJvbExheW91dC5nZXRNZWFzdXJlZEhlaWdodCgpKSB7CisgICAgICAgICAgICAgICAgbUFydFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXJ0Vmlld0hlaWdodCA9IDA7CisgICAgICAgICAgICBkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCA9IHZpc2libGVHcm91cExpc3RIZWlnaHQgKyBtYWluQ29udHJvbGxlckhlaWdodDsKKyAgICAgICAgfQorICAgICAgICAvLyBTaG93IHRoZSBwbGF5YmFjayBjb250cm9sIGlmIGl0IGZpdHMgdGhlIHNjcmVlbi4KKyAgICAgICAgaWYgKGNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQoKQorICAgICAgICAgICAgICAgICYmIGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0IDw9IG1heGltdW1Db250cm9sVmlld0hlaWdodCkgeworICAgICAgICAgICAgbVBsYXliYWNrQ29udHJvbExheW91dC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUGxheWJhY2tDb250cm9sTGF5b3V0LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgfQorICAgICAgICB1cGRhdGVNZWRpYUNvbnRyb2xWaXNpYmlsaXR5KG1QbGF5YmFja0NvbnRyb2xMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSk7CisgICAgICAgIG1haW5Db250cm9sbGVySGVpZ2h0ID0gZ2V0TWFpbkNvbnRyb2xsZXJIZWlnaHQoCisgICAgICAgICAgICAgICAgbVBsYXliYWNrQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKTsKKyAgICAgICAgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgPQorICAgICAgICAgICAgICAgIE1hdGgubWF4KGFydFZpZXdIZWlnaHQsIHZpc2libGVHcm91cExpc3RIZWlnaHQpICsgbWFpbkNvbnRyb2xsZXJIZWlnaHQ7CisKKyAgICAgICAgLy8gTGltaXQgdGhlIHZvbHVtZSBncm91cCBsaXN0IGhlaWdodCB0byBmaXQgdGhlIHNjcmVlbi4KKyAgICAgICAgaWYgKGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0ID4gbWF4aW11bUNvbnRyb2xWaWV3SGVpZ2h0KSB7CisgICAgICAgICAgICB2aXNpYmxlR3JvdXBMaXN0SGVpZ2h0IC09IChkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCAtIG1heGltdW1Db250cm9sVmlld0hlaWdodCk7CisgICAgICAgICAgICBkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCA9IG1heGltdW1Db250cm9sVmlld0hlaWdodDsKKyAgICAgICAgfQorICAgICAgICAvLyBVcGRhdGUgdGhlIGxheW91dHMgd2l0aCB0aGUgY29tcHV0ZWQgaGVpZ2h0cy4KKyAgICAgICAgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQuY2xlYXJBbmltYXRpb24oKTsKKyAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5jbGVhckFuaW1hdGlvbigpOworICAgICAgICBtRGVmYXVsdENvbnRyb2xMYXlvdXQuY2xlYXJBbmltYXRpb24oKTsKKyAgICAgICAgaWYgKGFuaW1hdGUpIHsKKyAgICAgICAgICAgIGFuaW1hdGVMYXlvdXRIZWlnaHQobU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQsIG1haW5Db250cm9sbGVySGVpZ2h0KTsKKyAgICAgICAgICAgIGFuaW1hdGVMYXlvdXRIZWlnaHQobVZvbHVtZUdyb3VwTGlzdCwgdmlzaWJsZUdyb3VwTGlzdEhlaWdodCk7CisgICAgICAgICAgICBhbmltYXRlTGF5b3V0SGVpZ2h0KG1EZWZhdWx0Q29udHJvbExheW91dCwgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KG1NZWRpYU1haW5Db250cm9sTGF5b3V0LCBtYWluQ29udHJvbGxlckhlaWdodCk7CisgICAgICAgICAgICBzZXRMYXlvdXRIZWlnaHQobVZvbHVtZUdyb3VwTGlzdCwgdmlzaWJsZUdyb3VwTGlzdEhlaWdodCk7CisgICAgICAgICAgICBzZXRMYXlvdXRIZWlnaHQobURlZmF1bHRDb250cm9sTGF5b3V0LCBkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gTWF4aW1pemUgdGhlIHdpbmRvdyBzaXplIHdpdGggYSB0cmFuc3BhcmVudCBsYXlvdXQgaW4gYWR2YW5jZSBmb3Igc21vb3RoIGFuaW1hdGlvbi4KKyAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KG1FeHBhbmRhYmxlQXJlYUxheW91dCwgdmlzaWJsZVJlY3QuaGVpZ2h0KCkpOworICAgICAgICByZWJ1aWxkVm9sdW1lR3JvdXBMaXN0KGFuaW1hdGUpOworICAgIH0KKworICAgIHZvaWQgdXBkYXRlVm9sdW1lR3JvdXBJdGVtSGVpZ2h0KFZpZXcgaXRlbSkgeworICAgICAgICBMaW5lYXJMYXlvdXQgY29udGFpbmVyID0gKExpbmVhckxheW91dCkgaXRlbS5maW5kVmlld0J5SWQoUi5pZC52b2x1bWVfaXRlbV9jb250YWluZXIpOworICAgICAgICBzZXRMYXlvdXRIZWlnaHQoY29udGFpbmVyLCBtVm9sdW1lR3JvdXBMaXN0SXRlbUhlaWdodCk7CisgICAgICAgIFZpZXcgaWNvbiA9IGl0ZW0uZmluZFZpZXdCeUlkKFIuaWQubXJfdm9sdW1lX2l0ZW1faWNvbik7CisgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgbHAgPSBpY29uLmdldExheW91dFBhcmFtcygpOworICAgICAgICBscC53aWR0aCA9IG1Wb2x1bWVHcm91cExpc3RJdGVtSWNvblNpemU7CisgICAgICAgIGxwLmhlaWdodCA9IG1Wb2x1bWVHcm91cExpc3RJdGVtSWNvblNpemU7CisgICAgICAgIGljb24uc2V0TGF5b3V0UGFyYW1zKGxwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYW5pbWF0ZUxheW91dEhlaWdodChmaW5hbCBWaWV3IHZpZXcsIGludCB0YXJnZXRIZWlnaHQpIHsKKyAgICAgICAgZmluYWwgaW50IHN0YXJ0VmFsdWUgPSBnZXRMYXlvdXRIZWlnaHQodmlldyk7CisgICAgICAgIGZpbmFsIGludCBlbmRWYWx1ZSA9IHRhcmdldEhlaWdodDsKKyAgICAgICAgQW5pbWF0aW9uIGFuaW0gPSBuZXcgQW5pbWF0aW9uKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhcHBseVRyYW5zZm9ybWF0aW9uKGZsb2F0IGludGVycG9sYXRlZFRpbWUsIFRyYW5zZm9ybWF0aW9uIHQpIHsKKyAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gc3RhcnRWYWx1ZSAtIChpbnQpICgoc3RhcnRWYWx1ZSAtIGVuZFZhbHVlKSAqIGludGVycG9sYXRlZFRpbWUpOworICAgICAgICAgICAgICAgIHNldExheW91dEhlaWdodCh2aWV3LCBoZWlnaHQpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBhbmltLnNldER1cmF0aW9uKG1Hcm91cExpc3RBbmltYXRpb25EdXJhdGlvbk1zKTsKKyAgICAgICAgaWYgKGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IDIxKSB7CisgICAgICAgICAgICBhbmltLnNldEludGVycG9sYXRvcihtSW50ZXJwb2xhdG9yKTsKKyAgICAgICAgfQorICAgICAgICB2aWV3LnN0YXJ0QW5pbWF0aW9uKGFuaW0pOworICAgIH0KKworICAgIHZvaWQgbG9hZEludGVycG9sYXRvcigpIHsKKyAgICAgICAgbUludGVycG9sYXRvciA9CisgICAgICAgICAgICAgICAgbUlzR3JvdXBFeHBhbmRlZCA/IG1MaW5lYXJPdXRTbG93SW5JbnRlcnBvbGF0b3IgOiBtRmFzdE91dFNsb3dJbkludGVycG9sYXRvcjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlVm9sdW1lQ29udHJvbExheW91dCgpIHsKKyAgICAgICAgaWYgKGlzVm9sdW1lQ29udHJvbEF2YWlsYWJsZShtUm91dGUpKSB7CisgICAgICAgICAgICBpZiAobVZvbHVtZUNvbnRyb2xMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuR09ORSkgeworICAgICAgICAgICAgICAgIG1Wb2x1bWVDb250cm9sTGF5b3V0LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICBtVm9sdW1lU2xpZGVyLnNldE1heChtUm91dGUuZ2V0Vm9sdW1lTWF4KCkpOworICAgICAgICAgICAgICAgIG1Wb2x1bWVTbGlkZXIuc2V0UHJvZ3Jlc3MobVJvdXRlLmdldFZvbHVtZSgpKTsKKyAgICAgICAgICAgICAgICBtR3JvdXBFeHBhbmRDb2xsYXBzZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KGdldEdyb3VwKCkgPT0gbnVsbCA/IFZpZXcuR09ORQorICAgICAgICAgICAgICAgICAgICAgICAgOiBWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVZvbHVtZUNvbnRyb2xMYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlYnVpbGRWb2x1bWVHcm91cExpc3QoYm9vbGVhbiBhbmltYXRlKSB7CisgICAgICAgIExpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiByb3V0ZXMgPSBnZXRHcm91cCgpID09IG51bGwgPyBudWxsIDogZ2V0R3JvdXAoKS5nZXRSb3V0ZXMoKTsKKyAgICAgICAgaWYgKHJvdXRlcyA9PSBudWxsKSB7CisgICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIG1Wb2x1bWVHcm91cEFkYXB0ZXIubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKKyAgICAgICAgfSBlbHNlIGlmIChNZWRpYVJvdXRlRGlhbG9nSGVscGVyLmxpc3RVbm9yZGVyZWRFcXVhbHMobUdyb3VwTWVtYmVyUm91dGVzLCByb3V0ZXMpKSB7CisgICAgICAgICAgICBtVm9sdW1lR3JvdXBBZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBIYXNoTWFwPE1lZGlhUm91dGVyLlJvdXRlSW5mbywgUmVjdD4gcHJldmlvdXNSb3V0ZUJvdW5kTWFwID0gYW5pbWF0ZQorICAgICAgICAgICAgICAgICAgICA/IE1lZGlhUm91dGVEaWFsb2dIZWxwZXIuZ2V0SXRlbUJvdW5kTWFwKG1Wb2x1bWVHcm91cExpc3QsIG1Wb2x1bWVHcm91cEFkYXB0ZXIpCisgICAgICAgICAgICAgICAgICAgIDogbnVsbDsKKyAgICAgICAgICAgIEhhc2hNYXA8TWVkaWFSb3V0ZXIuUm91dGVJbmZvLCBCaXRtYXBEcmF3YWJsZT4gcHJldmlvdXNSb3V0ZUJpdG1hcE1hcCA9IGFuaW1hdGUKKyAgICAgICAgICAgICAgICAgICAgPyBNZWRpYVJvdXRlRGlhbG9nSGVscGVyLmdldEl0ZW1CaXRtYXBNYXAobUNvbnRleHQsIG1Wb2x1bWVHcm91cExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUdyb3VwQWRhcHRlcikgOiBudWxsOworICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQgPQorICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGlhbG9nSGVscGVyLmdldEl0ZW1zQWRkZWQobUdyb3VwTWVtYmVyUm91dGVzLCByb3V0ZXMpOworICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZCA9IE1lZGlhUm91dGVEaWFsb2dIZWxwZXIuZ2V0SXRlbXNSZW1vdmVkKG1Hcm91cE1lbWJlclJvdXRlcywKKyAgICAgICAgICAgICAgICAgICAgcm91dGVzKTsKKyAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlcy5hZGRBbGwoMCwgbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQpOworICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzLnJlbW92ZUFsbChtR3JvdXBNZW1iZXJSb3V0ZXNSZW1vdmVkKTsKKyAgICAgICAgICAgIG1Wb2x1bWVHcm91cEFkYXB0ZXIubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKKyAgICAgICAgICAgIGlmIChhbmltYXRlICYmIG1Jc0dyb3VwRXhwYW5kZWQKKyAgICAgICAgICAgICAgICAgICAgJiYgbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQuc2l6ZSgpICsgbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZC5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgYW5pbWF0ZUdyb3VwTGlzdEl0ZW1zKHByZXZpb3VzUm91dGVCb3VuZE1hcCwgcHJldmlvdXNSb3V0ZUJpdG1hcE1hcCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkID0gbnVsbDsKKyAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNSZW1vdmVkID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhbmltYXRlR3JvdXBMaXN0SXRlbXMoZmluYWwgTWFwPE1lZGlhUm91dGVyLlJvdXRlSW5mbywgUmVjdD4gcHJldmlvdXNSb3V0ZUJvdW5kTWFwLAorICAgICAgICAgICAgZmluYWwgTWFwPE1lZGlhUm91dGVyLlJvdXRlSW5mbywgQml0bWFwRHJhd2FibGU+IHByZXZpb3VzUm91dGVCaXRtYXBNYXApIHsKKyAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5yZXF1ZXN0TGF5b3V0KCk7CisgICAgICAgIG1Jc0dyb3VwTGlzdEFuaW1hdGluZyA9IHRydWU7CisgICAgICAgIFZpZXdUcmVlT2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBtVm9sdW1lR3JvdXBMaXN0LmdldFZpZXdUcmVlT2JzZXJ2ZXIoKTsKKyAgICAgICAgb2JzZXJ2ZXIuYWRkT25HbG9iYWxMYXlvdXRMaXN0ZW5lcihuZXcgVmlld1RyZWVPYnNlcnZlci5Pbkdsb2JhbExheW91dExpc3RlbmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkdsb2JhbExheW91dCgpIHsKKyAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LmdldFZpZXdUcmVlT2JzZXJ2ZXIoKS5yZW1vdmVHbG9iYWxPbkxheW91dExpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgIGFuaW1hdGVHcm91cExpc3RJdGVtc0ludGVybmFsKHByZXZpb3VzUm91dGVCb3VuZE1hcCwgcHJldmlvdXNSb3V0ZUJpdG1hcE1hcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHZvaWQgYW5pbWF0ZUdyb3VwTGlzdEl0ZW1zSW50ZXJuYWwoCisgICAgICAgICAgICBNYXA8TWVkaWFSb3V0ZXIuUm91dGVJbmZvLCBSZWN0PiBwcmV2aW91c1JvdXRlQm91bmRNYXAsCisgICAgICAgICAgICBNYXA8TWVkaWFSb3V0ZXIuUm91dGVJbmZvLCBCaXRtYXBEcmF3YWJsZT4gcHJldmlvdXNSb3V0ZUJpdG1hcE1hcCkgeworICAgICAgICBpZiAobUdyb3VwTWVtYmVyUm91dGVzQWRkZWQgPT0gbnVsbCB8fCBtR3JvdXBNZW1iZXJSb3V0ZXNSZW1vdmVkID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnQgZ3JvdXBTaXplRGVsdGEgPSBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZC5zaXplKCkgLSBtR3JvdXBNZW1iZXJSb3V0ZXNSZW1vdmVkLnNpemUoKTsKKyAgICAgICAgYm9vbGVhbiBsaXN0ZW5lclJlZ2lzdGVyZWQgPSBmYWxzZTsKKyAgICAgICAgQW5pbWF0aW9uLkFuaW1hdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEFuaW1hdGlvbi5BbmltYXRpb25MaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25TdGFydChBbmltYXRpb24gYW5pbWF0aW9uKSB7CisgICAgICAgICAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5zdGFydEFuaW1hdGlvbkFsbCgpOworICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cExpc3QucG9zdERlbGF5ZWQobUdyb3VwTGlzdEZhZGVJbkFuaW1hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Hcm91cExpc3RBbmltYXRpb25EdXJhdGlvbk1zKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRpb24gYW5pbWF0aW9uKSB7IH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblJlcGVhdChBbmltYXRpb24gYW5pbWF0aW9uKSB7IH0KKyAgICAgICAgfTsKKworICAgICAgICAvLyBBbmltYXRlIHZpc2libGUgaXRlbXMgZnJvbSBwcmV2aW91cyBwb3NpdGlvbnMgdG8gY3VycmVudCBwb3NpdGlvbnMgZXhjZXB0IHJvdXRlcyBhZGRlZAorICAgICAgICAvLyBqdXN0IGJlZm9yZS4gQWRkZWQgcm91dGVzIHdpbGwgcmVtYWluIGhpZGRlbiB1bnRpbCB0cmFuc2xhdGUgYW5pbWF0aW9uIGZpbmlzaGVzLgorICAgICAgICBpbnQgZmlyc3QgPSBtVm9sdW1lR3JvdXBMaXN0LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVZvbHVtZUdyb3VwTGlzdC5nZXRDaGlsZENvdW50KCk7ICsraSkgeworICAgICAgICAgICAgVmlldyB2aWV3ID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gZmlyc3QgKyBpOworICAgICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbVZvbHVtZUdyb3VwQWRhcHRlci5nZXRJdGVtKHBvc2l0aW9uKTsKKyAgICAgICAgICAgIFJlY3QgcHJldmlvdXNCb3VuZHMgPSBwcmV2aW91c1JvdXRlQm91bmRNYXAuZ2V0KHJvdXRlKTsKKyAgICAgICAgICAgIGludCBjdXJyZW50VG9wID0gdmlldy5nZXRUb3AoKTsKKyAgICAgICAgICAgIGludCBwcmV2aW91c1RvcCA9IHByZXZpb3VzQm91bmRzICE9IG51bGwgPyBwcmV2aW91c0JvdW5kcy50b3AKKyAgICAgICAgICAgICAgICAgICAgOiAoY3VycmVudFRvcCArIG1Wb2x1bWVHcm91cExpc3RJdGVtSGVpZ2h0ICogZ3JvdXBTaXplRGVsdGEpOworICAgICAgICAgICAgQW5pbWF0aW9uU2V0IGFuaW1TZXQgPSBuZXcgQW5pbWF0aW9uU2V0KHRydWUpOworICAgICAgICAgICAgaWYgKG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkICE9IG51bGwgJiYgbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQuY29udGFpbnMocm91dGUpKSB7CisgICAgICAgICAgICAgICAgcHJldmlvdXNUb3AgPSBjdXJyZW50VG9wOworICAgICAgICAgICAgICAgIEFuaW1hdGlvbiBhbHBoYUFuaW0gPSBuZXcgQWxwaGFBbmltYXRpb24oMC4wZiwgMC4wZik7CisgICAgICAgICAgICAgICAgYWxwaGFBbmltLnNldER1cmF0aW9uKG1Hcm91cExpc3RGYWRlSW5EdXJhdGlvbk1zKTsKKyAgICAgICAgICAgICAgICBhbmltU2V0LmFkZEFuaW1hdGlvbihhbHBoYUFuaW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQW5pbWF0aW9uIHRyYW5zbGF0aW9uQW5pbSA9IG5ldyBUcmFuc2xhdGVBbmltYXRpb24oMCwgMCwgcHJldmlvdXNUb3AgLSBjdXJyZW50VG9wLCAwKTsKKyAgICAgICAgICAgIHRyYW5zbGF0aW9uQW5pbS5zZXREdXJhdGlvbihtR3JvdXBMaXN0QW5pbWF0aW9uRHVyYXRpb25Ncyk7CisgICAgICAgICAgICBhbmltU2V0LmFkZEFuaW1hdGlvbih0cmFuc2xhdGlvbkFuaW0pOworICAgICAgICAgICAgYW5pbVNldC5zZXRGaWxsQWZ0ZXIodHJ1ZSk7CisgICAgICAgICAgICBhbmltU2V0LnNldEZpbGxFbmFibGVkKHRydWUpOworICAgICAgICAgICAgYW5pbVNldC5zZXRJbnRlcnBvbGF0b3IobUludGVycG9sYXRvcik7CisgICAgICAgICAgICBpZiAoIWxpc3RlbmVyUmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyUmVnaXN0ZXJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYW5pbVNldC5zZXRBbmltYXRpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aWV3LmNsZWFyQW5pbWF0aW9uKCk7CisgICAgICAgICAgICB2aWV3LnN0YXJ0QW5pbWF0aW9uKGFuaW1TZXQpOworICAgICAgICAgICAgcHJldmlvdXNSb3V0ZUJvdW5kTWFwLnJlbW92ZShyb3V0ZSk7CisgICAgICAgICAgICBwcmV2aW91c1JvdXRlQml0bWFwTWFwLnJlbW92ZShyb3V0ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiBhIG1lbWJlciByb3V0ZSBkb2Vzbid0IGV4aXN0IGFueSBsb25nZXIsIGl0IGNhbiBiZSBlaXRoZXIgcmVtb3ZlZCBvciBtb3ZlZCBvdXQgb2YgdGhlCisgICAgICAgIC8vIExpc3RWaWV3IGxheW91dCBib3VuZGFyeS4gSW4gdGhpcyBjYXNlLCB1c2UgdGhlIHByZXZpb3VzbHkgY2FwdHVyZWQgYml0bWFwcyBmb3IKKyAgICAgICAgLy8gYW5pbWF0aW9uLgorICAgICAgICBmb3IgKE1hcC5FbnRyeTxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIEJpdG1hcERyYXdhYmxlPiBpdGVtCisgICAgICAgICAgICAgICAgOiBwcmV2aW91c1JvdXRlQml0bWFwTWFwLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IGl0ZW0uZ2V0S2V5KCk7CisgICAgICAgICAgICBmaW5hbCBCaXRtYXBEcmF3YWJsZSBiaXRtYXAgPSBpdGVtLmdldFZhbHVlKCk7CisgICAgICAgICAgICBmaW5hbCBSZWN0IGJvdW5kcyA9IHByZXZpb3VzUm91dGVCb3VuZE1hcC5nZXQocm91dGUpOworICAgICAgICAgICAgT3ZlcmxheU9iamVjdCBvYmplY3QgPSBudWxsOworICAgICAgICAgICAgaWYgKG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQuY29udGFpbnMocm91dGUpKSB7CisgICAgICAgICAgICAgICAgb2JqZWN0ID0gbmV3IE92ZXJsYXlPYmplY3QoYml0bWFwLCBib3VuZHMpLnNldEFscGhhQW5pbWF0aW9uKDEuMGYsIDAuMGYpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RHVyYXRpb24obUdyb3VwTGlzdEZhZGVPdXREdXJhdGlvbk1zKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEludGVycG9sYXRvcihtSW50ZXJwb2xhdG9yKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGRlbHRhWSA9IGdyb3VwU2l6ZURlbHRhICogbVZvbHVtZUdyb3VwTGlzdEl0ZW1IZWlnaHQ7CisgICAgICAgICAgICAgICAgb2JqZWN0ID0gbmV3IE92ZXJsYXlPYmplY3QoYml0bWFwLCBib3VuZHMpLnNldFRyYW5zbGF0ZVlBbmltYXRpb24oZGVsdGFZKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldER1cmF0aW9uKG1Hcm91cExpc3RBbmltYXRpb25EdXJhdGlvbk1zKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEludGVycG9sYXRvcihtSW50ZXJwb2xhdG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEFuaW1hdGlvbkVuZExpc3RlbmVyKG5ldyBPdmVybGF5T2JqZWN0Lk9uQW5pbWF0aW9uRW5kTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc0FuaW1hdGluZ1dpdGhCaXRtYXAucmVtb3ZlKHJvdXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUdyb3VwQWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc0FuaW1hdGluZ1dpdGhCaXRtYXAuYWRkKHJvdXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Wb2x1bWVHcm91cExpc3QuYWRkT3ZlcmxheU9iamVjdChvYmplY3QpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzdGFydEdyb3VwTGlzdEZhZGVJbkFuaW1hdGlvbigpIHsKKyAgICAgICAgY2xlYXJHcm91cExpc3RBbmltYXRpb24odHJ1ZSk7CisgICAgICAgIG1Wb2x1bWVHcm91cExpc3QucmVxdWVzdExheW91dCgpOworICAgICAgICBWaWV3VHJlZU9ic2VydmVyIG9ic2VydmVyID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRWaWV3VHJlZU9ic2VydmVyKCk7CisgICAgICAgIG9ic2VydmVyLmFkZE9uR2xvYmFsTGF5b3V0TGlzdGVuZXIobmV3IFZpZXdUcmVlT2JzZXJ2ZXIuT25HbG9iYWxMYXlvdXRMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25HbG9iYWxMYXlvdXQoKSB7CisgICAgICAgICAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5nZXRWaWV3VHJlZU9ic2VydmVyKCkucmVtb3ZlR2xvYmFsT25MYXlvdXRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICBzdGFydEdyb3VwTGlzdEZhZGVJbkFuaW1hdGlvbkludGVybmFsKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHZvaWQgc3RhcnRHcm91cExpc3RGYWRlSW5BbmltYXRpb25JbnRlcm5hbCgpIHsKKyAgICAgICAgaWYgKG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkICE9IG51bGwgJiYgbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgICAgIGZhZGVJbkFkZGVkUm91dGVzKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaW5pc2hBbmltYXRpb24odHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGZpbmlzaEFuaW1hdGlvbihib29sZWFuIGFuaW1hdGUpIHsKKyAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQgPSBudWxsOworICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNSZW1vdmVkID0gbnVsbDsKKyAgICAgICAgbUlzR3JvdXBMaXN0QW5pbWF0aW5nID0gZmFsc2U7CisgICAgICAgIGlmIChtSXNHcm91cExpc3RBbmltYXRpb25QZW5kaW5nKSB7CisgICAgICAgICAgICBtSXNHcm91cExpc3RBbmltYXRpb25QZW5kaW5nID0gZmFsc2U7CisgICAgICAgICAgICB1cGRhdGVMYXlvdXRIZWlnaHQoYW5pbWF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5zZXRFbmFibGVkKHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmYWRlSW5BZGRlZFJvdXRlcygpIHsKKyAgICAgICAgQW5pbWF0aW9uLkFuaW1hdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEFuaW1hdGlvbi5BbmltYXRpb25MaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25TdGFydChBbmltYXRpb24gYW5pbWF0aW9uKSB7IH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRpb24gYW5pbWF0aW9uKSB7CisgICAgICAgICAgICAgICAgZmluaXNoQW5pbWF0aW9uKHRydWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uUmVwZWF0KEFuaW1hdGlvbiBhbmltYXRpb24pIHsgfQorICAgICAgICB9OworICAgICAgICBib29sZWFuIGxpc3RlbmVyUmVnaXN0ZXJlZCA9IGZhbHNlOworICAgICAgICBpbnQgZmlyc3QgPSBtVm9sdW1lR3JvdXBMaXN0LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVZvbHVtZUdyb3VwTGlzdC5nZXRDaGlsZENvdW50KCk7ICsraSkgeworICAgICAgICAgICAgVmlldyB2aWV3ID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gZmlyc3QgKyBpOworICAgICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbVZvbHVtZUdyb3VwQWRhcHRlci5nZXRJdGVtKHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZC5jb250YWlucyhyb3V0ZSkpIHsKKyAgICAgICAgICAgICAgICBBbmltYXRpb24gYWxwaGFBbmltID0gbmV3IEFscGhhQW5pbWF0aW9uKDAuMGYsIDEuMGYpOworICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXREdXJhdGlvbihtR3JvdXBMaXN0RmFkZUluRHVyYXRpb25Ncyk7CisgICAgICAgICAgICAgICAgYWxwaGFBbmltLnNldEZpbGxFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXRGaWxsQWZ0ZXIodHJ1ZSk7CisgICAgICAgICAgICAgICAgaWYgKCFsaXN0ZW5lclJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJSZWdpc3RlcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYWxwaGFBbmltLnNldEFuaW1hdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmlldy5jbGVhckFuaW1hdGlvbigpOworICAgICAgICAgICAgICAgIHZpZXcuc3RhcnRBbmltYXRpb24oYWxwaGFBbmltKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgY2xlYXJHcm91cExpc3RBbmltYXRpb24oYm9vbGVhbiBleGNlcHRBZGRlZFJvdXRlcykgeworICAgICAgICBpbnQgZmlyc3QgPSBtVm9sdW1lR3JvdXBMaXN0LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVZvbHVtZUdyb3VwTGlzdC5nZXRDaGlsZENvdW50KCk7ICsraSkgeworICAgICAgICAgICAgVmlldyB2aWV3ID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gZmlyc3QgKyBpOworICAgICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbVZvbHVtZUdyb3VwQWRhcHRlci5nZXRJdGVtKHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGlmIChleGNlcHRBZGRlZFJvdXRlcyAmJiBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLmNvbnRhaW5zKHJvdXRlKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTGluZWFyTGF5b3V0IGNvbnRhaW5lciA9IChMaW5lYXJMYXlvdXQpIHZpZXcuZmluZFZpZXdCeUlkKFIuaWQudm9sdW1lX2l0ZW1fY29udGFpbmVyKTsKKyAgICAgICAgICAgIGNvbnRhaW5lci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBBbmltYXRpb25TZXQgYW5pbVNldCA9IG5ldyBBbmltYXRpb25TZXQodHJ1ZSk7CisgICAgICAgICAgICBBbmltYXRpb24gYWxwaGFBbmltID0gbmV3IEFscGhhQW5pbWF0aW9uKDEuMGYsIDEuMGYpOworICAgICAgICAgICAgYWxwaGFBbmltLnNldER1cmF0aW9uKDApOworICAgICAgICAgICAgYW5pbVNldC5hZGRBbmltYXRpb24oYWxwaGFBbmltKTsKKyAgICAgICAgICAgIEFuaW1hdGlvbiB0cmFuc2xhdGlvbkFuaW0gPSBuZXcgVHJhbnNsYXRlQW5pbWF0aW9uKDAsIDAsIDAsIDApOworICAgICAgICAgICAgdHJhbnNsYXRpb25BbmltLnNldER1cmF0aW9uKDApOworICAgICAgICAgICAgYW5pbVNldC5zZXRGaWxsQWZ0ZXIodHJ1ZSk7CisgICAgICAgICAgICBhbmltU2V0LnNldEZpbGxFbmFibGVkKHRydWUpOworICAgICAgICAgICAgdmlldy5jbGVhckFuaW1hdGlvbigpOworICAgICAgICAgICAgdmlldy5zdGFydEFuaW1hdGlvbihhbmltU2V0KTsKKyAgICAgICAgfQorICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnN0b3BBbmltYXRpb25BbGwoKTsKKyAgICAgICAgaWYgKCFleGNlcHRBZGRlZFJvdXRlcykgeworICAgICAgICAgICAgZmluaXNoQW5pbWF0aW9uKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQbGF5YmFja0NvbnRyb2xMYXlvdXQoKSB7CisgICAgICAgIGlmIChjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KCkpIHsKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0aXRsZSA9IG1EZXNjcmlwdGlvbiA9PSBudWxsID8gbnVsbCA6IG1EZXNjcmlwdGlvbi5nZXRUaXRsZSgpOworICAgICAgICAgICAgYm9vbGVhbiBoYXNUaXRsZSA9ICFUZXh0VXRpbHMuaXNFbXB0eSh0aXRsZSk7CisKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBzdWJ0aXRsZSA9IG1EZXNjcmlwdGlvbiA9PSBudWxsID8gbnVsbCA6IG1EZXNjcmlwdGlvbi5nZXRTdWJ0aXRsZSgpOworICAgICAgICAgICAgYm9vbGVhbiBoYXNTdWJ0aXRsZSA9ICFUZXh0VXRpbHMuaXNFbXB0eShzdWJ0aXRsZSk7CisKKyAgICAgICAgICAgIGJvb2xlYW4gc2hvd1RpdGxlID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIHNob3dTdWJ0aXRsZSA9IGZhbHNlOworICAgICAgICAgICAgaWYgKG1Sb3V0ZS5nZXRQcmVzZW50YXRpb25EaXNwbGF5SWQoKQorICAgICAgICAgICAgICAgICAgICAhPSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUFJFU0VOVEFUSU9OX0RJU1BMQVlfSURfTk9ORSkgeworICAgICAgICAgICAgICAgIC8vIFRoZSB1c2VyIGlzIGN1cnJlbnRseSBjYXN0aW5nIHNjcmVlbi4KKyAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQoQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcubXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbikpOworICAgICAgICAgICAgICAgIHNob3dUaXRsZSA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBudWxsIHx8IG1TdGF0ZS5nZXRTdGF0ZSgpID09IFBsYXliYWNrU3RhdGVDb21wYXQuU1RBVEVfTk9ORSkgeworICAgICAgICAgICAgICAgIC8vIFNob3cgIk5vIG1lZGlhIHNlbGVjdGVkIiBhcyB3ZSBkb24ndCB5ZXQga25vdyB0aGUgcGxheWJhY2sgc3RhdGUuCisgICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQpKTsKKyAgICAgICAgICAgICAgICBzaG93VGl0bGUgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmICghaGFzVGl0bGUgJiYgIWhhc1N1YnRpdGxlKSB7CisgICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUpKTsKKyAgICAgICAgICAgICAgICBzaG93VGl0bGUgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoaGFzVGl0bGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KHRpdGxlKTsKKyAgICAgICAgICAgICAgICAgICAgc2hvd1RpdGxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGhhc1N1YnRpdGxlKSB7CisgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VGV4dChzdWJ0aXRsZSk7CisgICAgICAgICAgICAgICAgICAgIHNob3dTdWJ0aXRsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KHNob3dUaXRsZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7CisgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFZpc2liaWxpdHkoc2hvd1N1YnRpdGxlID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKKworICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1BsYXlpbmcgPSBtU3RhdGUuZ2V0U3RhdGUoKSA9PSBQbGF5YmFja1N0YXRlQ29tcGF0LlNUQVRFX0JVRkZFUklORworICAgICAgICAgICAgICAgICAgICAgICAgfHwgbVN0YXRlLmdldFN0YXRlKCkgPT0gUGxheWJhY2tTdGF0ZUNvbXBhdC5TVEFURV9QTEFZSU5HOworICAgICAgICAgICAgICAgIENvbnRleHQgcGxheWJhY2tDb250cm9sQnV0dG9uQ29udGV4dCA9IG1QbGF5YmFja0NvbnRyb2xCdXR0b24uZ2V0Q29udGV4dCgpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gdmlzaWJsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgaW50IGljb25EcmF3YWJsZUF0dHIgPSAwOworICAgICAgICAgICAgICAgIGludCBpY29uRGVzY1Jlc0lkID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoaXNQbGF5aW5nICYmIGlzUGF1c2VBY3Rpb25TdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBpY29uRHJhd2FibGVBdHRyID0gUi5hdHRyLm1lZGlhUm91dGVQYXVzZURyYXdhYmxlOworICAgICAgICAgICAgICAgICAgICBpY29uRGVzY1Jlc0lkID0gUi5zdHJpbmcubXJfY29udHJvbGxlcl9wYXVzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzUGxheWluZyAmJiBpc1N0b3BBY3Rpb25TdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBpY29uRHJhd2FibGVBdHRyID0gUi5hdHRyLm1lZGlhUm91dGVTdG9wRHJhd2FibGU7CisgICAgICAgICAgICAgICAgICAgIGljb25EZXNjUmVzSWQgPSBSLnN0cmluZy5tcl9jb250cm9sbGVyX3N0b3A7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghaXNQbGF5aW5nICYmIGlzUGxheUFjdGlvblN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGljb25EcmF3YWJsZUF0dHIgPSBSLmF0dHIubWVkaWFSb3V0ZVBsYXlEcmF3YWJsZTsKKyAgICAgICAgICAgICAgICAgICAgaWNvbkRlc2NSZXNJZCA9IFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfcGxheTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB2aXNpYmxlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1QbGF5YmFja0NvbnRyb2xCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmxlID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICBpZiAodmlzaWJsZSkgeworICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2tDb250cm9sQnV0dG9uLnNldEltYWdlUmVzb3VyY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRUaGVtZVJlc291cmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tDb250cm9sQnV0dG9uQ29udGV4dCwgaWNvbkRyYXdhYmxlQXR0cikpOworICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2tDb250cm9sQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja0NvbnRyb2xCdXR0b25Db250ZXh0LmdldFJlc291cmNlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VGV4dChpY29uRGVzY1Jlc0lkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzUGxheUFjdGlvblN1cHBvcnRlZCgpIHsKKyAgICAgICAgcmV0dXJuIChtU3RhdGUuZ2V0QWN0aW9ucygpICYgKEFDVElPTl9QTEFZIHwgQUNUSU9OX1BMQVlfUEFVU0UpKSAhPSAwOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1BhdXNlQWN0aW9uU3VwcG9ydGVkKCkgeworICAgICAgICByZXR1cm4gKG1TdGF0ZS5nZXRBY3Rpb25zKCkgJiAoQUNUSU9OX1BBVVNFIHwgQUNUSU9OX1BMQVlfUEFVU0UpKSAhPSAwOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1N0b3BBY3Rpb25TdXBwb3J0ZWQoKSB7CisgICAgICAgIHJldHVybiAobVN0YXRlLmdldEFjdGlvbnMoKSAmIEFDVElPTl9TVE9QKSAhPSAwOworICAgIH0KKworICAgIGJvb2xlYW4gaXNWb2x1bWVDb250cm9sQXZhaWxhYmxlKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgeworICAgICAgICByZXR1cm4gbVZvbHVtZUNvbnRyb2xFbmFibGVkICYmIHJvdXRlLmdldFZvbHVtZUhhbmRsaW5nKCkKKyAgICAgICAgICAgICAgICA9PSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVk9MVU1FX1ZBUklBQkxFOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRMYXlvdXRIZWlnaHQoVmlldyB2aWV3KSB7CisgICAgICAgIHJldHVybiB2aWV3LmdldExheW91dFBhcmFtcygpLmhlaWdodDsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBzZXRMYXlvdXRIZWlnaHQoVmlldyB2aWV3LCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgbHAgPSB2aWV3LmdldExheW91dFBhcmFtcygpOworICAgICAgICBscC5oZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIHZpZXcuc2V0TGF5b3V0UGFyYW1zKGxwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHVyaUVxdWFscyhVcmkgdXJpMSwgVXJpIHVyaTIpIHsKKyAgICAgICAgaWYgKHVyaTEgIT0gbnVsbCAmJiB1cmkxLmVxdWFscyh1cmkyKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAodXJpMSA9PSBudWxsICYmIHVyaTIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgZGVzaXJlZCBhcnQgaGVpZ2h0IHRvIGZpdCBpbnRvIGNvbnRyb2xsZXIgZGlhbG9nLgorICAgICAqLworICAgIGludCBnZXREZXNpcmVkQXJ0SGVpZ2h0KGludCBvcmlnaW5hbFdpZHRoLCBpbnQgb3JpZ2luYWxIZWlnaHQpIHsKKyAgICAgICAgaWYgKG9yaWdpbmFsV2lkdGggPj0gb3JpZ2luYWxIZWlnaHQpIHsKKyAgICAgICAgICAgIC8vIEZvciBsYW5kc2NhcGUgYXJ0LCBmaXQgd2lkdGggdG8gZGlhbG9nIHdpZHRoLgorICAgICAgICAgICAgcmV0dXJuIChpbnQpICgoZmxvYXQpIG1EaWFsb2dDb250ZW50V2lkdGggKiBvcmlnaW5hbEhlaWdodCAvIG9yaWdpbmFsV2lkdGggKyAwLjVmKTsKKyAgICAgICAgfQorICAgICAgICAvLyBGb3IgcG9ydHJhaXQgYXJ0LCBmaXQgaGVpZ2h0IHRvIDE2OjkgcmF0aW8gY2FzZSdzIGhlaWdodC4KKyAgICAgICAgcmV0dXJuIChpbnQpICgoZmxvYXQpIG1EaWFsb2dDb250ZW50V2lkdGggKiA5IC8gMTYgKyAwLjVmKTsKKyAgICB9CisKKyAgICB2b2lkIHVwZGF0ZUFydEljb25JZk5lZWRlZCgpIHsKKyAgICAgICAgaWYgKG1DdXN0b21Db250cm9sVmlldyAhPSBudWxsIHx8ICFpc0ljb25DaGFuZ2VkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAobUZldGNoQXJ0VGFzayAhPSBudWxsKSB7CisgICAgICAgICAgICBtRmV0Y2hBcnRUYXNrLmNhbmNlbCh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBtRmV0Y2hBcnRUYXNrID0gbmV3IEZldGNoQXJ0VGFzaygpOworICAgICAgICBtRmV0Y2hBcnRUYXNrLmV4ZWN1dGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhciB0aGUgYml0bWFwIGxvYWRlZCBieSBGZXRjaEFydFRhc2suIFdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBsb2FkZWQgYml0bWFwcyBhcmUgYXBwbGllZAorICAgICAqIHRvIGFydHdvcmssIG9yIG5vIGxvbmdlciB2YWxpZC4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyTG9hZGVkQml0bWFwKCkgeworICAgICAgICBtQXJ0SWNvbklzTG9hZGVkID0gZmFsc2U7CisgICAgICAgIG1BcnRJY29uTG9hZGVkQml0bWFwID0gbnVsbDsKKyAgICAgICAgbUFydEljb25CYWNrZ3JvdW5kQ29sb3IgPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBhIG5ldyBhcnQgaW1hZ2UgaXMgZGlmZmVyZW50IGZyb20gYW4gb3JpZ2luYWwgYXJ0IGltYWdlLiBDb21wYXJlcworICAgICAqIEJpdG1hcCBvYmplY3RzIGZpcnN0LCBhbmQgdGhlbiBjb21wYXJlcyBVUklzIG9ubHkgaWYgYml0bWFwIGlzIHVuY2hhbmdlZCB3aXRoCisgICAgICogYSBudWxsIHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc0ljb25DaGFuZ2VkKCkgeworICAgICAgICBCaXRtYXAgbmV3Qml0bWFwID0gbURlc2NyaXB0aW9uID09IG51bGwgPyBudWxsIDogbURlc2NyaXB0aW9uLmdldEljb25CaXRtYXAoKTsKKyAgICAgICAgVXJpIG5ld1VyaSA9IG1EZXNjcmlwdGlvbiA9PSBudWxsID8gbnVsbCA6IG1EZXNjcmlwdGlvbi5nZXRJY29uVXJpKCk7CisgICAgICAgIEJpdG1hcCBvbGRCaXRtYXAgPSBtRmV0Y2hBcnRUYXNrID09IG51bGwgPyBtQXJ0SWNvbkJpdG1hcCA6IG1GZXRjaEFydFRhc2suZ2V0SWNvbkJpdG1hcCgpOworICAgICAgICBVcmkgb2xkVXJpID0gbUZldGNoQXJ0VGFzayA9PSBudWxsID8gbUFydEljb25VcmkgOiBtRmV0Y2hBcnRUYXNrLmdldEljb25VcmkoKTsKKyAgICAgICAgaWYgKG9sZEJpdG1hcCAhPSBuZXdCaXRtYXApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKG9sZEJpdG1hcCA9PSBudWxsICYmICF1cmlFcXVhbHMob2xkVXJpLCBuZXdVcmkpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgeworICAgICAgICBNZWRpYVJvdXRlckNhbGxiYWNrKCkgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgICAgICB1cGRhdGUoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgICAgICB1cGRhdGUodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVZvbHVtZUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKKyAgICAgICAgICAgIFNlZWtCYXIgdm9sdW1lU2xpZGVyID0gbVZvbHVtZVNsaWRlck1hcC5nZXQocm91dGUpOworICAgICAgICAgICAgaW50IHZvbHVtZSA9IHJvdXRlLmdldFZvbHVtZSgpOworICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25Sb3V0ZVZvbHVtZUNoYW5nZWQoKSwgcm91dGUuZ2V0Vm9sdW1lOiIgKyB2b2x1bWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZvbHVtZVNsaWRlciAhPSBudWxsICYmIG1Sb3V0ZUluVm9sdW1lU2xpZGVyVG91Y2hlZCAhPSByb3V0ZSkgeworICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRQcm9ncmVzcyh2b2x1bWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBNZWRpYUNvbnRyb2xsZXJDYWxsYmFjayBleHRlbmRzIE1lZGlhQ29udHJvbGxlckNvbXBhdC5DYWxsYmFjayB7CisgICAgICAgIE1lZGlhQ29udHJvbGxlckNhbGxiYWNrKCkgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2Vzc2lvbkRlc3Ryb3llZCgpIHsKKyAgICAgICAgICAgIGlmIChtTWVkaWFDb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLnVucmVnaXN0ZXJDYWxsYmFjayhtQ29udHJvbGxlckNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXliYWNrU3RhdGVDaGFuZ2VkKFBsYXliYWNrU3RhdGVDb21wYXQgc3RhdGUpIHsKKyAgICAgICAgICAgIG1TdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgdXBkYXRlKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbk1ldGFkYXRhQ2hhbmdlZChNZWRpYU1ldGFkYXRhQ29tcGF0IG1ldGFkYXRhKSB7CisgICAgICAgICAgICBtRGVzY3JpcHRpb24gPSBtZXRhZGF0YSA9PSBudWxsID8gbnVsbCA6IG1ldGFkYXRhLmdldERlc2NyaXB0aW9uKCk7CisgICAgICAgICAgICB1cGRhdGVBcnRJY29uSWZOZWVkZWQoKTsKKyAgICAgICAgICAgIHVwZGF0ZShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIENsaWNrTGlzdGVuZXIgaW1wbGVtZW50cyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciB7CisgICAgICAgIENsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIGludCBpZCA9IHYuZ2V0SWQoKTsKKyAgICAgICAgICAgIGlmIChpZCA9PSBCVVRUT05fU1RPUF9SRVNfSUQgfHwgaWQgPT0gQlVUVE9OX0RJU0NPTk5FQ1RfUkVTX0lEKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Sb3V0ZS5pc1NlbGVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVJvdXRlci51bnNlbGVjdChpZCA9PSBCVVRUT05fU1RPUF9SRVNfSUQgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLlVOU0VMRUNUX1JFQVNPTl9TVE9QUEVEIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fRElTQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGlzbWlzcygpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpZCA9PSBSLmlkLm1yX2NvbnRyb2xfcGxheWJhY2tfY3RybCkgeworICAgICAgICAgICAgICAgIGlmIChtTWVkaWFDb250cm9sbGVyICE9IG51bGwgJiYgbVN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1BsYXlpbmcgPSBtU3RhdGUuZ2V0U3RhdGUoKSA9PSBQbGF5YmFja1N0YXRlQ29tcGF0LlNUQVRFX1BMQVlJTkc7CisgICAgICAgICAgICAgICAgICAgIGludCBhY3Rpb25EZXNjUmVzSWQgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNQbGF5aW5nICYmIGlzUGF1c2VBY3Rpb25TdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnBhdXNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25EZXNjUmVzSWQgPSBSLnN0cmluZy5tcl9jb250cm9sbGVyX3BhdXNlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzUGxheWluZyAmJiBpc1N0b3BBY3Rpb25TdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkRlc2NSZXNJZCA9IFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfc3RvcDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghaXNQbGF5aW5nICYmIGlzUGxheUFjdGlvblN1cHBvcnRlZCgpKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5wbGF5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25EZXNjUmVzSWQgPSBSLnN0cmluZy5tcl9jb250cm9sbGVyX3BsYXk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gQW5ub3VuY2UgdGhlIGFjdGlvbiBmb3IgYWNjZXNzaWJpbGl0eS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BY2Nlc3NpYmlsaXR5TWFuYWdlciAhPSBudWxsICYmIG1BY2Nlc3NpYmlsaXR5TWFuYWdlci5pc0VuYWJsZWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGFjdGlvbkRlc2NSZXNJZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnRDb21wYXQuVFlQRV9BTk5PVU5DRU1FTlQpOworICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc2V0UGFja2FnZU5hbWUobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5zZXRDbGFzc05hbWUoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0VGV4dCgpLmFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0U3RyaW5nKGFjdGlvbkRlc2NSZXNJZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbUFjY2Vzc2liaWxpdHlNYW5hZ2VyLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoZXZlbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChpZCA9PSBSLmlkLm1yX2Nsb3NlKSB7CisgICAgICAgICAgICAgICAgZGlzbWlzcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBWb2x1bWVDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIFNlZWtCYXIuT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIG1TdG9wVHJhY2tpbmdUb3VjaCA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIGlmIChtUm91dGVJblZvbHVtZVNsaWRlclRvdWNoZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtUm91dGVJblZvbHVtZVNsaWRlclRvdWNoZWQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAobUhhc1BlbmRpbmdVcGRhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZShtUGVuZGluZ1VwZGF0ZUFuaW1hdGlvbk5lZWRlZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgVm9sdW1lQ2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TdGFydFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7CisgICAgICAgICAgICBpZiAobVJvdXRlSW5Wb2x1bWVTbGlkZXJUb3VjaGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtVm9sdW1lU2xpZGVyLnJlbW92ZUNhbGxiYWNrcyhtU3RvcFRyYWNraW5nVG91Y2gpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVJvdXRlSW5Wb2x1bWVTbGlkZXJUb3VjaGVkID0gKE1lZGlhUm91dGVyLlJvdXRlSW5mbykgc2Vla0Jhci5nZXRUYWcoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblN0b3BUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgeworICAgICAgICAgICAgLy8gRGVmZXIgcmVzZXR0aW5nIG1Wb2x1bWVTbGlkZXJUb3VjaGVkIHRvIGFsbG93IHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlcgorICAgICAgICAgICAgLy8gYSBsaXR0bGUgdGltZSB0byBzZXR0bGUgaW50byBpdHMgbmV3IHN0YXRlIGFuZCBwdWJsaXNoIHRoZSBmaW5hbAorICAgICAgICAgICAgLy8gdm9sdW1lIHVwZGF0ZS4KKyAgICAgICAgICAgIG1Wb2x1bWVTbGlkZXIucG9zdERlbGF5ZWQobVN0b3BUcmFja2luZ1RvdWNoLCBWT0xVTUVfVVBEQVRFX0RFTEFZX01JTExJUyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoU2Vla0JhciBzZWVrQmFyLCBpbnQgcHJvZ3Jlc3MsIGJvb2xlYW4gZnJvbVVzZXIpIHsKKyAgICAgICAgICAgIGlmIChmcm9tVXNlcikgeworICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IChNZWRpYVJvdXRlci5Sb3V0ZUluZm8pIHNlZWtCYXIuZ2V0VGFnKCk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uUHJvZ3Jlc3NDaGFuZ2VkKCk6IGNhbGxpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIk1lZGlhUm91dGVyLlJvdXRlSW5mby5yZXF1ZXN0U2V0Vm9sdW1lKCIgKyBwcm9ncmVzcyArICIpIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJvdXRlLnJlcXVlc3RTZXRWb2x1bWUocHJvZ3Jlc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBWb2x1bWVHcm91cEFkYXB0ZXIgZXh0ZW5kcyBBcnJheUFkYXB0ZXI8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiB7CisgICAgICAgIGZpbmFsIGZsb2F0IG1EaXNhYmxlZEFscGhhOworCisgICAgICAgIHB1YmxpYyBWb2x1bWVHcm91cEFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gb2JqZWN0cykgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgMCwgb2JqZWN0cyk7CisgICAgICAgICAgICBtRGlzYWJsZWRBbHBoYSA9IE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0RGlzYWJsZWRBbHBoYShjb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhmaW5hbCBpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgICAgIFZpZXcgdiA9IGNvbnZlcnRWaWV3OworICAgICAgICAgICAgaWYgKHYgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHYgPSBMYXlvdXRJbmZsYXRlci5mcm9tKHBhcmVudC5nZXRDb250ZXh0KCkpLmluZmxhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBSLmxheW91dC5tcl9jb250cm9sbGVyX3ZvbHVtZV9pdGVtLCBwYXJlbnQsIGZhbHNlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdXBkYXRlVm9sdW1lR3JvdXBJdGVtSGVpZ2h0KHYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBnZXRJdGVtKHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGlmIChyb3V0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0VuYWJsZWQgPSByb3V0ZS5pc0VuYWJsZWQoKTsKKworICAgICAgICAgICAgICAgIFRleHRWaWV3IHJvdXRlTmFtZSA9IChUZXh0Vmlldykgdi5maW5kVmlld0J5SWQoUi5pZC5tcl9uYW1lKTsKKyAgICAgICAgICAgICAgICByb3V0ZU5hbWUuc2V0RW5hYmxlZChpc0VuYWJsZWQpOworICAgICAgICAgICAgICAgIHJvdXRlTmFtZS5zZXRUZXh0KHJvdXRlLmdldE5hbWUoKSk7CisKKyAgICAgICAgICAgICAgICBNZWRpYVJvdXRlVm9sdW1lU2xpZGVyIHZvbHVtZVNsaWRlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAoTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcikgdi5maW5kVmlld0J5SWQoUi5pZC5tcl92b2x1bWVfc2xpZGVyKTsKKyAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLnNldFZvbHVtZVNsaWRlckNvbG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LmdldENvbnRleHQoKSwgdm9sdW1lU2xpZGVyLCBtVm9sdW1lR3JvdXBMaXN0KTsKKyAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0VGFnKHJvdXRlKTsKKyAgICAgICAgICAgICAgICBtVm9sdW1lU2xpZGVyTWFwLnB1dChyb3V0ZSwgdm9sdW1lU2xpZGVyKTsKKyAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0SGlkZVRodW1iKCFpc0VuYWJsZWQpOworICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRFbmFibGVkKGlzRW5hYmxlZCk7CisgICAgICAgICAgICAgICAgaWYgKGlzRW5hYmxlZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXNWb2x1bWVDb250cm9sQXZhaWxhYmxlKHJvdXRlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldE1heChyb3V0ZS5nZXRWb2x1bWVNYXgoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0UHJvZ3Jlc3Mocm91dGUuZ2V0Vm9sdW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKG1Wb2x1bWVDaGFuZ2VMaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0TWF4KDEwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0UHJvZ3Jlc3MoMTAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEltYWdlVmlldyB2b2x1bWVJdGVtSWNvbiA9CisgICAgICAgICAgICAgICAgICAgICAgICAoSW1hZ2VWaWV3KSB2LmZpbmRWaWV3QnlJZChSLmlkLm1yX3ZvbHVtZV9pdGVtX2ljb24pOworICAgICAgICAgICAgICAgIHZvbHVtZUl0ZW1JY29uLnNldEFscGhhKGlzRW5hYmxlZCA/IDB4RkYgOiAoaW50KSAoMHhGRiAqIG1EaXNhYmxlZEFscGhhKSk7CisKKyAgICAgICAgICAgICAgICAvLyBJZiBvdmVybGF5IGJpdG1hcCBleGlzdHMsIHJlYWwgdmlldyBzaG91bGQgcmVtYWluIGhpZGRlbiB1bnRpbAorICAgICAgICAgICAgICAgIC8vIHRoZSBhbmltYXRpb24gZW5kcy4KKyAgICAgICAgICAgICAgICBMaW5lYXJMYXlvdXQgY29udGFpbmVyID0gKExpbmVhckxheW91dCkgdi5maW5kVmlld0J5SWQoUi5pZC52b2x1bWVfaXRlbV9jb250YWluZXIpOworICAgICAgICAgICAgICAgIGNvbnRhaW5lci5zZXRWaXNpYmlsaXR5KG1Hcm91cE1lbWJlclJvdXRlc0FuaW1hdGluZ1dpdGhCaXRtYXAuY29udGFpbnMocm91dGUpCisgICAgICAgICAgICAgICAgICAgICAgICA/IFZpZXcuSU5WSVNJQkxFIDogVmlldy5WSVNJQkxFKTsKKworICAgICAgICAgICAgICAgIC8vIFJvdXRlcyB3aGljaCBhcmUgYmVpbmcgYWRkZWQgd2lsbCBiZSBpbnZpc2libGUgdW50aWwgYW5pbWF0aW9uIGVuZHMuCisgICAgICAgICAgICAgICAgaWYgKG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkICE9IG51bGwgJiYgbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQuY29udGFpbnMocm91dGUpKSB7CisgICAgICAgICAgICAgICAgICAgIEFuaW1hdGlvbiBhbHBoYUFuaW0gPSBuZXcgQWxwaGFBbmltYXRpb24oMC4wZiwgMC4wZik7CisgICAgICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXREdXJhdGlvbigwKTsKKyAgICAgICAgICAgICAgICAgICAgYWxwaGFBbmltLnNldEZpbGxFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RmlsbEFmdGVyKHRydWUpOworICAgICAgICAgICAgICAgICAgICB2LmNsZWFyQW5pbWF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHYuc3RhcnRBbmltYXRpb24oYWxwaGFBbmltKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgRmV0Y2hBcnRUYXNrIGV4dGVuZHMgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIEJpdG1hcD4geworICAgICAgICAvLyBTaG93IGFuaW1hdGlvbiBvbmx5IHdoZW4gZmV0Y2hpbmcgdGFrZXMgYSBsb25nIHRpbWUuCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgU0hPV19BTklNX1RJTUVfVEhSRVNIT0xEX01JTExJUyA9IDEyMEw7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaXRtYXAgbUljb25CaXRtYXA7CisgICAgICAgIHByaXZhdGUgZmluYWwgVXJpIG1JY29uVXJpOworICAgICAgICBwcml2YXRlIGludCBtQmFja2dyb3VuZENvbG9yOworICAgICAgICBwcml2YXRlIGxvbmcgbVN0YXJ0VGltZU1pbGxpczsKKworICAgICAgICBGZXRjaEFydFRhc2soKSB7CisgICAgICAgICAgICBCaXRtYXAgYml0bWFwID0gbURlc2NyaXB0aW9uID09IG51bGwgPyBudWxsIDogbURlc2NyaXB0aW9uLmdldEljb25CaXRtYXAoKTsKKyAgICAgICAgICAgIGlmIChpc0JpdG1hcFJlY3ljbGVkKGJpdG1hcCkpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW4ndCBmZXRjaCB0aGUgZ2l2ZW4gYXJ0IGJpdG1hcCBiZWNhdXNlIGl0J3MgYWxyZWFkeSByZWN5Y2xlZC4iKTsKKyAgICAgICAgICAgICAgICBiaXRtYXAgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUljb25CaXRtYXAgPSBiaXRtYXA7CisgICAgICAgICAgICBtSWNvblVyaSA9IG1EZXNjcmlwdGlvbiA9PSBudWxsID8gbnVsbCA6IG1EZXNjcmlwdGlvbi5nZXRJY29uVXJpKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQml0bWFwIGdldEljb25CaXRtYXAoKSB7CisgICAgICAgICAgICByZXR1cm4gbUljb25CaXRtYXA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVXJpIGdldEljb25VcmkoKSB7CisgICAgICAgICAgICByZXR1cm4gbUljb25Vcmk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25QcmVFeGVjdXRlKCkgeworICAgICAgICAgICAgbVN0YXJ0VGltZU1pbGxpcyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICAgICAgY2xlYXJMb2FkZWRCaXRtYXAoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQml0bWFwIGRvSW5CYWNrZ3JvdW5kKFZvaWQuLi4gYXJnKSB7CisgICAgICAgICAgICBCaXRtYXAgYXJ0ID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChtSWNvbkJpdG1hcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYXJ0ID0gbUljb25CaXRtYXA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1JY29uVXJpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoc3RyZWFtID0gb3BlbklucHV0U3RyZWFtQnlTY2hlbWUobUljb25VcmkpKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJVbmFibGUgdG8gb3BlbjogIiArIG1JY29uVXJpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIFF1ZXJ5IGFydCBzaXplLgorICAgICAgICAgICAgICAgICAgICBCaXRtYXBGYWN0b3J5Lk9wdGlvbnMgb3B0aW9ucyA9IG5ldyBCaXRtYXBGYWN0b3J5Lk9wdGlvbnMoKTsKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5pbkp1c3REZWNvZGVCb3VuZHMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBCaXRtYXBGYWN0b3J5LmRlY29kZVN0cmVhbShzdHJlYW0sIG51bGwsIG9wdGlvbnMpOworICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5vdXRXaWR0aCA9PSAwIHx8IG9wdGlvbnMub3V0SGVpZ2h0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIFJld2luZCB0aGUgc3RyZWFtIGluIG9yZGVyIHRvIHJlc3RhcnQgYXJ0IGRlY29kaW5nLgorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZhaWxlZCB0byByZXdpbmQgdGhlIHN0cmVhbSwgdHJ5IHRvIHJlb3BlbiBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzdHJlYW0gPSBvcGVuSW5wdXRTdHJlYW1CeVNjaGVtZShtSWNvblVyaSkpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJVbmFibGUgdG8gb3BlbjogIiArIG1JY29uVXJpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgcmVxdWlyZWQgc2l6ZSB0byBkZWNvZGUgdGhlIGFydCBhbmQgcG9zc2libHkgcmVzaXplIGl0LgorICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmluSnVzdERlY29kZUJvdW5kcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpbnQgcmVxSGVpZ2h0ID0gZ2V0RGVzaXJlZEFydEhlaWdodChvcHRpb25zLm91dFdpZHRoLCBvcHRpb25zLm91dEhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIGludCByYXRpbyA9IG9wdGlvbnMub3V0SGVpZ2h0IC8gcmVxSGVpZ2h0OworICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmluU2FtcGxlU2l6ZSA9IE1hdGgubWF4KDEsIEludGVnZXIuaGlnaGVzdE9uZUJpdChyYXRpbykpOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNDYW5jZWxsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYXJ0ID0gQml0bWFwRmFjdG9yeS5kZWNvZGVTdHJlYW0oc3RyZWFtLCBudWxsLCBvcHRpb25zKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIG9wZW46ICIgKyBtSWNvblVyaSwgZSk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzQml0bWFwUmVjeWNsZWQoYXJ0KSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbid0IHVzZSByZWN5Y2xlZCBiaXRtYXA6ICIgKyBhcnQpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFydCAhPSBudWxsICYmIGFydC5nZXRXaWR0aCgpIDwgYXJ0LmdldEhlaWdodCgpKSB7CisgICAgICAgICAgICAgICAgLy8gUG9ydHJhaXQgYXJ0IHJlcXVpcmVzIGRvbWluYW50IGNvbG9yIGFzIGJhY2tncm91bmQgY29sb3IuCisgICAgICAgICAgICAgICAgUGFsZXR0ZSBwYWxldHRlID0gbmV3IFBhbGV0dGUuQnVpbGRlcihhcnQpLm1heGltdW1Db2xvckNvdW50KDEpLmdlbmVyYXRlKCk7CisgICAgICAgICAgICAgICAgbUJhY2tncm91bmRDb2xvciA9IHBhbGV0dGUuZ2V0U3dhdGNoZXMoKS5pc0VtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgID8gMCA6IHBhbGV0dGUuZ2V0U3dhdGNoZXMoKS5nZXQoMCkuZ2V0UmdiKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYXJ0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEV4ZWN1dGUoQml0bWFwIGFydCkgeworICAgICAgICAgICAgbUZldGNoQXJ0VGFzayA9IG51bGw7CisgICAgICAgICAgICBpZiAoIU9iamVjdHNDb21wYXQuZXF1YWxzKG1BcnRJY29uQml0bWFwLCBtSWNvbkJpdG1hcCkKKyAgICAgICAgICAgICAgICAgICAgfHwgIU9iamVjdHNDb21wYXQuZXF1YWxzKG1BcnRJY29uVXJpLCBtSWNvblVyaSkpIHsKKyAgICAgICAgICAgICAgICBtQXJ0SWNvbkJpdG1hcCA9IG1JY29uQml0bWFwOworICAgICAgICAgICAgICAgIG1BcnRJY29uTG9hZGVkQml0bWFwID0gYXJ0OworICAgICAgICAgICAgICAgIG1BcnRJY29uVXJpID0gbUljb25Vcmk7CisgICAgICAgICAgICAgICAgbUFydEljb25CYWNrZ3JvdW5kQ29sb3IgPSBtQmFja2dyb3VuZENvbG9yOworICAgICAgICAgICAgICAgIG1BcnRJY29uSXNMb2FkZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGxvbmcgZWxhcHNlZFRpbWVNaWxsaXMgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSAtIG1TdGFydFRpbWVNaWxsaXM7CisgICAgICAgICAgICAgICAgLy8gTG9hZGVkIGJpdG1hcCB3aWxsIGJlIGFwcGxpZWQgb24gdGhlIG5leHQgdXBkYXRlCisgICAgICAgICAgICAgICAgdXBkYXRlKGVsYXBzZWRUaW1lTWlsbGlzID4gU0hPV19BTklNX1RJTUVfVEhSRVNIT0xEX01JTExJUyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIElucHV0U3RyZWFtIG9wZW5JbnB1dFN0cmVhbUJ5U2NoZW1lKFVyaSB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBTdHJpbmcgc2NoZW1lID0gdXJpLmdldFNjaGVtZSgpLnRvTG93ZXJDYXNlKCk7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOworICAgICAgICAgICAgaWYgKENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfQU5EUk9JRF9SRVNPVVJDRS5lcXVhbHMoc2NoZW1lKQorICAgICAgICAgICAgICAgICAgICB8fCBDb250ZW50UmVzb2x2ZXIuU0NIRU1FX0NPTlRFTlQuZXF1YWxzKHNjaGVtZSkKKyAgICAgICAgICAgICAgICAgICAgfHwgQ29udGVudFJlc29sdmVyLlNDSEVNRV9GSUxFLmVxdWFscyhzY2hlbWUpKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtID0gbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkub3BlbklucHV0U3RyZWFtKHVyaSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKHVyaS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBVUkxDb25uZWN0aW9uIGNvbm4gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBjb25uLnNldENvbm5lY3RUaW1lb3V0KENPTk5FQ1RJT05fVElNRU9VVF9NSUxMSVMpOworICAgICAgICAgICAgICAgIGNvbm4uc2V0UmVhZFRpbWVvdXQoQ09OTkVDVElPTl9USU1FT1VUX01JTExJUyk7CisgICAgICAgICAgICAgICAgc3RyZWFtID0gY29ubi5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIChzdHJlYW0gPT0gbnVsbCkgPyBudWxsIDogbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc3RyZWFtKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE1ZDc0ZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudC5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCisvKioKKyAqIE1lZGlhIHJvdXRlIGNvbnRyb2xsZXIgZGlhbG9nIGZyYWdtZW50LgorICogPHA+CisgKiBDcmVhdGVzIGEge0BsaW5rIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nfS4gIFRoZSBhcHBsaWNhdGlvbiBtYXkgc3ViY2xhc3MKKyAqIHRoaXMgZGlhbG9nIGZyYWdtZW50IHRvIGN1c3RvbWl6ZSB0aGUgbWVkaWEgcm91dGUgY29udHJvbGxlciBkaWFsb2cuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50IGV4dGVuZHMgRGlhbG9nRnJhZ21lbnQgeworICAgIHByaXZhdGUgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2cgbURpYWxvZzsKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbWVkaWEgcm91dGUgY29udHJvbGxlciBkaWFsb2cgZnJhZ21lbnQuCisgICAgICogPHA+CisgICAgICogQWxsIHN1YmNsYXNzZXMgb2YgdGhpcyBjbGFzcyBtdXN0IGFsc28gcG9zc2VzcyBhIGRlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50KCkgeworICAgICAgICBzZXRDYW5jZWxhYmxlKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBjb250cm9sbGVyIGRpYWxvZyBpcyBiZWluZyBjcmVhdGVkLgorICAgICAqIDxwPgorICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB0aGUgZGlhbG9nLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2cgb25DcmVhdGVDb250cm9sbGVyRGlhbG9nKAorICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2coY29udGV4dCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIERpYWxvZyBvbkNyZWF0ZURpYWxvZyhCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIG1EaWFsb2cgPSBvbkNyZWF0ZUNvbnRyb2xsZXJEaWFsb2coZ2V0Q29udGV4dCgpLCBzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICByZXR1cm4gbURpYWxvZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7CisgICAgICAgIHN1cGVyLm9uU3RvcCgpOworICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSB7CisgICAgICAgICAgICBtRGlhbG9nLmNsZWFyR3JvdXBMaXN0QW5pbWF0aW9uKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKKyAgICAgICAgc3VwZXIub25Db25maWd1cmF0aW9uQ2hhbmdlZChuZXdDb25maWcpOworICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSB7CisgICAgICAgICAgICBtRGlhbG9nLnVwZGF0ZUxheW91dCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlhbG9nRmFjdG9yeS5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlhbG9nRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZWFmMzkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVEaWFsb2dGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKKworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7CisKKy8qKgorICogVGhlIG1lZGlhIHJvdXRlIGRpYWxvZyBmYWN0b3J5IGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUgbWVkaWEgcm91dGUKKyAqIGNob29zZXIgYW5kIGNvbnRyb2xsZXIgZGlhbG9ncyBhcyBuZWVkZWQuCisgKiA8cD4KKyAqIFRoZSBhcHBsaWNhdGlvbiBjYW4gY3VzdG9taXplIHRoZSBkaWFsb2dzIGJ5IHByb3ZpZGluZyBhIHN1YmNsYXNzIG9mIHRoZQorICogZGlhbG9nIGZhY3RvcnkgdG8gdGhlIHtAbGluayBNZWRpYVJvdXRlQnV0dG9ufSB1c2luZyB0aGUKKyAqIHtAbGluayBNZWRpYVJvdXRlQnV0dG9uI3NldERpYWxvZ0ZhY3Rvcnkgc2V0RGlhbG9nRmFjdG9yeX0gbWV0aG9kLgorICogPC9wPgorICovCitwdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IHNEZWZhdWx0ID0gbmV3IE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5KCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgZGVmYXVsdCBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZGVmYXVsdCBmYWN0b3J5IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgZGVmYXVsdCBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeSwgbmV2ZXIgbnVsbC4KKyAgICAgKi8KKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgZ2V0RGVmYXVsdCgpIHsKKyAgICAgICAgcmV0dXJuIHNEZWZhdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBjaG9vc2VyIGRpYWxvZyBpcyBiZWluZyBvcGVuZWQgYW5kIGl0IGlzIHRpbWUgdG8gY3JlYXRlIHRoZSBmcmFnbWVudC4KKyAgICAgKiA8cD4KKyAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjcmVhdGUgYSBjdXN0b21pemVkIGZyYWdtZW50LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nIGZyYWdtZW50LCBtdXN0IG5vdCBiZSBudWxsLgorICAgICAqLworICAgIEBOb25OdWxsCisgICAgcHVibGljIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQgb25DcmVhdGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQoKSB7CisgICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2dGcmFnbWVudCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBjb250cm9sbGVyIGRpYWxvZyBpcyBiZWluZyBvcGVuZWQgYW5kIGl0IGlzIHRpbWUgdG8gY3JlYXRlIHRoZSBmcmFnbWVudC4KKyAgICAgKiA8cD4KKyAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjcmVhdGUgYSBjdXN0b21pemVkIGZyYWdtZW50LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIHJvdXRlIGNvbnRyb2xsZXIgZGlhbG9nIGZyYWdtZW50LCBtdXN0IG5vdCBiZSBudWxsLgorICAgICAqLworICAgIEBOb25OdWxsCisgICAgcHVibGljIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQgb25DcmVhdGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQoKSB7CisgICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlhbG9nSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFhYmY3YgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5qYXZhCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOworaW1wb3J0IGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworCitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ZpbmFsIGNsYXNzIE1lZGlhUm91dGVEaWFsb2dIZWxwZXIgeworICAgIC8qKgorICAgICAqIFRoZSBmcmFtZXdvcmsgc2hvdWxkIHNldCB0aGUgZGlhbG9nIHdpZHRoIHByb3Blcmx5LCBidXQgc29tZWhvdyBpdCBkb2Vzbid0IHdvcmssIGhlbmNlCisgICAgICogZHVwbGljYXRpbmcgYSBzaW1pbGFyIGxvZ2ljIGhlcmUgdG8gZGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBkaWFsb2cgd2lkdGguCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0RGlhbG9nV2lkdGgoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIERpc3BsYXlNZXRyaWNzIG1ldHJpY3MgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLmdldERpc3BsYXlNZXRyaWNzKCk7CisgICAgICAgIGJvb2xlYW4gaXNQb3J0cmFpdCA9IG1ldHJpY3Mud2lkdGhQaXhlbHMgPCBtZXRyaWNzLmhlaWdodFBpeGVsczsKKworICAgICAgICBUeXBlZFZhbHVlIHZhbHVlID0gbmV3IFR5cGVkVmFsdWUoKTsKKyAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXRWYWx1ZShpc1BvcnRyYWl0CisgICAgICAgICAgICAgICAgPyBSLmRpbWVuLm1yX2RpYWxvZ19maXhlZF93aWR0aF9taW5vcgorICAgICAgICAgICAgICAgIDogUi5kaW1lbi5tcl9kaWFsb2dfZml4ZWRfd2lkdGhfbWFqb3IsIHZhbHVlLCB0cnVlKTsKKyAgICAgICAgaWYgKHZhbHVlLnR5cGUgPT0gVHlwZWRWYWx1ZS5UWVBFX0RJTUVOU0lPTikgeworICAgICAgICAgICAgcmV0dXJuIChpbnQpIHZhbHVlLmdldERpbWVuc2lvbihtZXRyaWNzKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS50eXBlID09IFR5cGVkVmFsdWUuVFlQRV9GUkFDVElPTikgeworICAgICAgICAgICAgcmV0dXJuIChpbnQpIHZhbHVlLmdldEZyYWN0aW9uKG1ldHJpY3Mud2lkdGhQaXhlbHMsIG1ldHJpY3Mud2lkdGhQaXhlbHMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyB0d28gbGlzdHMgcmVnYXJkbGVzcyBvZiBvcmRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0MSBBIGxpc3QKKyAgICAgKiBAcGFyYW0gbGlzdDIgQSBsaXN0IHRvIGJlIGNvbXBhcmVkIHdpdGgge0Bjb2RlIGxpc3QxfQorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0d28gbGlzdHMgaGF2ZSBleGFjdGx5IHNhbWUgaXRlbXMgcmVnYXJkbGVzcyBvZiBvcmRlciwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gbGlzdFVub3JkZXJlZEVxdWFscyhMaXN0PEU+IGxpc3QxLCBMaXN0PEU+IGxpc3QyKSB7CisgICAgICAgIEhhc2hTZXQ8RT4gc2V0MSA9IG5ldyBIYXNoU2V0PD4obGlzdDEpOworICAgICAgICBIYXNoU2V0PEU+IHNldDIgPSBuZXcgSGFzaFNldDw+KGxpc3QyKTsKKyAgICAgICAgcmV0dXJuIHNldDEuZXF1YWxzKHNldDIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBhcmVzIHR3byBsaXN0cyBhbmQgcmV0dXJucyBhIHNldCBvZiBpdGVtcyB3aGljaCBleGlzdAorICAgICAqIGFmdGVyLWxpc3QgYnV0IGJlZm9yZS1saXN0LCB3aGljaCBtZWFucyBuZXdseSBhZGRlZCBpdGVtcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiZWZvcmUgQSBsaXN0CisgICAgICogQHBhcmFtIGFmdGVyIEEgbGlzdCB0byBiZSBjb21wYXJlZCB3aXRoIHtAY29kZSBiZWZvcmV9CisgICAgICogQHJldHVybiBBIHNldCBvZiBpdGVtcyB3aGljaCBjb250YWlucyBuZXdseSBhZGRlZCBpdGVtcyB3aGlsZQorICAgICAqIGNvbXBhcmluZyB7QGNvZGUgYWZ0ZXJ9IHRvIHtAY29kZSBiZWZvcmV9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPEU+IFNldDxFPiBnZXRJdGVtc0FkZGVkKExpc3Q8RT4gYmVmb3JlLCBMaXN0PEU+IGFmdGVyKSB7CisgICAgICAgIEhhc2hTZXQ8RT4gc2V0ID0gbmV3IEhhc2hTZXQ8PihhZnRlcik7CisgICAgICAgIHNldC5yZW1vdmVBbGwoYmVmb3JlKTsKKyAgICAgICAgcmV0dXJuIHNldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyB0d28gbGlzdHMgYW5kIHJldHVybnMgYSBzZXQgb2YgaXRlbXMgd2hpY2ggZXhpc3QKKyAgICAgKiBiZWZvcmUtbGlzdCBidXQgYWZ0ZXItbGlzdCwgd2hpY2ggbWVhbnMgcmVtb3ZlZCBpdGVtcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiZWZvcmUgQSBsaXN0CisgICAgICogQHBhcmFtIGFmdGVyIEEgbGlzdCB0byBiZSBjb21wYXJlZCB3aXRoIHtAY29kZSBiZWZvcmV9CisgICAgICogQHJldHVybiBBIHNldCBvZiBpdGVtcyB3aGljaCBjb250YWlucyByZW1vdmVkIGl0ZW1zIHdoaWxlCisgICAgICogY29tcGFyaW5nIHtAY29kZSBhZnRlcn0gdG8ge0Bjb2RlIGJlZm9yZX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8RT4gU2V0PEU+IGdldEl0ZW1zUmVtb3ZlZChMaXN0PEU+IGJlZm9yZSwgTGlzdDxFPiBhZnRlcikgeworICAgICAgICBIYXNoU2V0PEU+IHNldCA9IG5ldyBIYXNoU2V0PD4oYmVmb3JlKTsKKyAgICAgICAgc2V0LnJlbW92ZUFsbChhZnRlcik7CisgICAgICAgIHJldHVybiBzZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIGFuIGl0ZW0tUmVjdCBtYXAgd2hpY2ggaW5kaWNhdGVzIHdoZXJlIG1lbWJlcgorICAgICAqIGl0ZW1zIGFyZSBsb2NhdGVkIGluIHRoZSBnaXZlbiBMaXN0Vmlldy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0VmlldyBBIGxpc3QgdmlldworICAgICAqIEBwYXJhbSBhZGFwdGVyIEFuIGFycmF5IGFkYXB0ZXIgd2hpY2ggY29udGFpbnMgYW4gYXJyYXkgb2YgaXRlbXMuCisgICAgICogQHJldHVybiBBIG1hcCBvZiBpdGVtcyBhbmQgYm91bmRzIG9mIHRoZWlyIHZpZXdzIGxvY2F0ZWQgaW4gdGhlIGdpdmVuIGxpc3Qgdmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxFPiBIYXNoTWFwPEUsIFJlY3Q+IGdldEl0ZW1Cb3VuZE1hcChMaXN0VmlldyBsaXN0VmlldywKKyAgICAgICAgICAgIEFycmF5QWRhcHRlcjxFPiBhZGFwdGVyKSB7CisgICAgICAgIEhhc2hNYXA8RSwgUmVjdD4gaXRlbUJvdW5kTWFwID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBpbnQgZmlyc3RWaXNpYmxlUG9zaXRpb24gPSBsaXN0Vmlldy5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RWaWV3LmdldENoaWxkQ291bnQoKTsgKytpKSB7CisgICAgICAgICAgICBpbnQgcG9zaXRpb24gPSBmaXJzdFZpc2libGVQb3NpdGlvbiArIGk7CisgICAgICAgICAgICBFIGl0ZW0gPSBhZGFwdGVyLmdldEl0ZW0ocG9zaXRpb24pOworICAgICAgICAgICAgVmlldyB2aWV3ID0gbGlzdFZpZXcuZ2V0Q2hpbGRBdChpKTsKKyAgICAgICAgICAgIGl0ZW1Cb3VuZE1hcC5wdXQoaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFJlY3Qodmlldy5nZXRMZWZ0KCksIHZpZXcuZ2V0VG9wKCksIHZpZXcuZ2V0UmlnaHQoKSwgdmlldy5nZXRCb3R0b20oKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpdGVtQm91bmRNYXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIGFuIGl0ZW0tQml0bWFwRHJhd2FibGUgbWFwIHdoaWNoIHN0b3JlcyBzbmFwc2hvdHMKKyAgICAgKiBvZiBtZW1iZXIgaXRlbXMgaW4gdGhlIGdpdmVuIExpc3RWaWV3LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgQSBjb250ZXh0CisgICAgICogQHBhcmFtIGxpc3RWaWV3IEEgbGlzdCB2aWV3CisgICAgICogQHBhcmFtIGFkYXB0ZXIgQW4gYXJyYXkgYWRhcHRlciB3aGljaCBjb250YWlucyBhbiBhcnJheSBvZiBpdGVtcy4KKyAgICAgKiBAcmV0dXJuIEEgbWFwIG9mIGl0ZW1zIGFuZCBzbmFwc2hvdHMgb2YgdGhlaXIgdmlld3MgaW4gdGhlIGdpdmVuIGxpc3Qgdmlldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxFPiBIYXNoTWFwPEUsIEJpdG1hcERyYXdhYmxlPiBnZXRJdGVtQml0bWFwTWFwKENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgIExpc3RWaWV3IGxpc3RWaWV3LCBBcnJheUFkYXB0ZXI8RT4gYWRhcHRlcikgeworICAgICAgICBIYXNoTWFwPEUsIEJpdG1hcERyYXdhYmxlPiBpdGVtQml0bWFwTWFwID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBpbnQgZmlyc3RWaXNpYmxlUG9zaXRpb24gPSBsaXN0Vmlldy5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RWaWV3LmdldENoaWxkQ291bnQoKTsgKytpKSB7CisgICAgICAgICAgICBpbnQgcG9zaXRpb24gPSBmaXJzdFZpc2libGVQb3NpdGlvbiArIGk7CisgICAgICAgICAgICBFIGl0ZW0gPSBhZGFwdGVyLmdldEl0ZW0ocG9zaXRpb24pOworICAgICAgICAgICAgVmlldyB2aWV3ID0gbGlzdFZpZXcuZ2V0Q2hpbGRBdChpKTsKKyAgICAgICAgICAgIGl0ZW1CaXRtYXBNYXAucHV0KGl0ZW0sIGdldFZpZXdCaXRtYXAoY29udGV4dCwgdmlldykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpdGVtQml0bWFwTWFwOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEJpdG1hcERyYXdhYmxlIGdldFZpZXdCaXRtYXAoQ29udGV4dCBjb250ZXh0LCBWaWV3IHZpZXcpIHsKKyAgICAgICAgQml0bWFwIGJpdG1hcCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAodmlldy5nZXRXaWR0aCgpLCB2aWV3LmdldEhlaWdodCgpLAorICAgICAgICAgICAgICAgIEJpdG1hcC5Db25maWcuQVJHQl84ODg4KTsKKyAgICAgICAgQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMoYml0bWFwKTsKKyAgICAgICAgdmlldy5kcmF3KGNhbnZhcyk7CisgICAgICAgIHJldHVybiBuZXcgQml0bWFwRHJhd2FibGUoY29udGV4dC5nZXRSZXNvdXJjZXMoKSwgYml0bWFwKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVEaXNjb3ZlcnlGcmFnbWVudC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmVlMTE4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQuamF2YQpAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuRnJhZ21lbnQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOworCisvKioKKyAqIE1lZGlhIHJvdXRlIGRpc2NvdmVyeSBmcmFnbWVudC4KKyAqIDxwPgorICogVGhpcyBmcmFnbWVudCB0YWtlcyBjYXJlIG9mIHJlZ2lzdGVyaW5nIGEgY2FsbGJhY2sgZm9yIG1lZGlhIHJvdXRlIGRpc2NvdmVyeQorICogZHVyaW5nIHRoZSB7QGxpbmsgRnJhZ21lbnQjb25TdGFydCBvblN0YXJ0KCl9IHBoYXNlCisgKiBhbmQgcmVtb3ZpbmcgaXQgZHVyaW5nIHRoZSB7QGxpbmsgRnJhZ21lbnQjb25TdG9wIG9uU3RvcCgpfSBwaGFzZS4KKyAqIDwvcD48cD4KKyAqIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHN1cHBseSBhIHJvdXRlIHNlbGVjdG9yIHRvIHNwZWNpZnkgdGhlIGtpbmRzIG9mIHJvdXRlcworICogdG8gZGlzY292ZXIuICBUaGUgYXBwbGljYXRpb24gbWF5IGFsc28gb3ZlcnJpZGUge0BsaW5rICNvbkNyZWF0ZUNhbGxiYWNrfSB0bworICogcHJvdmlkZSB0aGUge0BsaW5rIE1lZGlhUm91dGVyfSBjYWxsYmFjayB0byByZWdpc3Rlci4KKyAqIDwvcD48cD4KKyAqIE5vdGUgdGhhdCB0aGUgZGlzY292ZXJ5IGNhbGxiYWNrIG1ha2VzIHRoZSBhcHBsaWNhdGlvbiBiZSBjb25uZWN0ZWQgd2l0aCBhbGwgdGhlCisgKiB7QGxpbmsgYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UgbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZXN9CisgKiB3aGlsZSBpdCBpcyByZWdpc3RlcmVkLgorICogPC9wPgorICovCitwdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQgeworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIEFSR1VNRU5UX1NFTEVDVE9SID0gInNlbGVjdG9yIjsKKworICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIgbVJvdXRlcjsKKyAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3I7CisgICAgcHJpdmF0ZSBNZWRpYVJvdXRlci5DYWxsYmFjayBtQ2FsbGJhY2s7CisKKyAgICBwdWJsaWMgTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG1lZGlhIHJvdXRlciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVkaWFSb3V0ZXIgZ2V0TWVkaWFSb3V0ZXIoKSB7CisgICAgICAgIGVuc3VyZVJvdXRlcigpOworICAgICAgICByZXR1cm4gbVJvdXRlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlUm91dGVyKCkgeworICAgICAgICBpZiAobVJvdXRlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0byBiZSBkaXNjb3ZlcmVkLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgc2VsZWN0b3IsIG5ldmVyIG51bGwuCisgICAgICovCisgICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBnZXRSb3V0ZVNlbGVjdG9yKCkgeworICAgICAgICBlbnN1cmVSb3V0ZVNlbGVjdG9yKCk7CisgICAgICAgIHJldHVybiBtU2VsZWN0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRvIGJlIGRpc2NvdmVyZWQuCisgICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBmcmFnbWVudCBpcyBhZGRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKworICAgICAgICBlbnN1cmVSb3V0ZVNlbGVjdG9yKCk7CisgICAgICAgIGlmICghbVNlbGVjdG9yLmVxdWFscyhzZWxlY3RvcikpIHsKKyAgICAgICAgICAgIG1TZWxlY3RvciA9IHNlbGVjdG9yOworCisgICAgICAgICAgICBCdW5kbGUgYXJncyA9IGdldEFyZ3VtZW50cygpOworICAgICAgICAgICAgaWYgKGFyZ3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFyZ3MgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcmdzLnB1dEJ1bmRsZShBUkdVTUVOVF9TRUxFQ1RPUiwgc2VsZWN0b3IuYXNCdW5kbGUoKSk7CisgICAgICAgICAgICBzZXRBcmd1bWVudHMoYXJncyk7CisKKyAgICAgICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICBtUm91dGVyLmFkZENhbGxiYWNrKG1TZWxlY3RvciwgbUNhbGxiYWNrLCBvblByZXBhcmVDYWxsYmFja0ZsYWdzKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZVJvdXRlU2VsZWN0b3IoKSB7CisgICAgICAgIGlmIChtU2VsZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgQnVuZGxlIGFyZ3MgPSBnZXRBcmd1bWVudHMoKTsKKyAgICAgICAgICAgIGlmIChhcmdzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuZnJvbUJ1bmRsZShhcmdzLmdldEJ1bmRsZShBUkdVTUVOVF9TRUxFQ1RPUikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1TZWxlY3RvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIHRvIGNyZWF0ZSB0aGUge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayBjYWxsYmFja30KKyAgICAgKiB0aGF0IHdpbGwgYmUgcmVnaXN0ZXJlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCBjYWxsYmFjayBkb2VzIG5vdGhpbmcuICBUaGUgYXBwbGljYXRpb24gbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvCisgICAgICogc3VwcGx5IGl0cyBvd24gY2FsbGJhY2suCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbmV3IGNhbGxiYWNrLCBvciBudWxsIGlmIG5vIGNhbGxiYWNrIHNob3VsZCBiZSByZWdpc3RlcmVkLgorICAgICAqLworICAgIHB1YmxpYyBNZWRpYVJvdXRlci5DYWxsYmFjayBvbkNyZWF0ZUNhbGxiYWNrKCkgeworICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVyLkNhbGxiYWNrKCkgeyB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB0byBwcmVwYXJlIHRoZSBjYWxsYmFjayBmbGFncyB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHRoZQorICAgICAqIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgY2FsbGJhY2t9IGlzIHJlZ2lzdGVyZWQuCisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyB7QGxpbmsgTWVkaWFSb3V0ZXIjQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWX0uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgZGVzaXJlZCBjYWxsYmFjayBmbGFncy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IG9uUHJlcGFyZUNhbGxiYWNrRmxhZ3MoKSB7CisgICAgICAgIHJldHVybiBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKSB7CisgICAgICAgIHN1cGVyLm9uU3RhcnQoKTsKKworICAgICAgICBlbnN1cmVSb3V0ZVNlbGVjdG9yKCk7CisgICAgICAgIGVuc3VyZVJvdXRlcigpOworICAgICAgICBtQ2FsbGJhY2sgPSBvbkNyZWF0ZUNhbGxiYWNrKCk7CisgICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhtU2VsZWN0b3IsIG1DYWxsYmFjaywgb25QcmVwYXJlQ2FsbGJhY2tGbGFncygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKKyAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICBtUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7CisgICAgICAgICAgICBtQ2FsbGJhY2sgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgc3VwZXIub25TdG9wKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24uamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEwYTk1YQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZkNvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQW5pbWF0aW9uRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmNvbnRlbnQuQ29udGV4dENvbXBhdDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlQnV0dG9uOworCitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKKworLyoqCisgKiBDaGV2cm9uL0NhcmV0IGJ1dHRvbiB0byBleHBhbmQvY29sbGFwc2UgZ3JvdXAgdm9sdW1lIGxpc3Qgd2l0aCBhbmltYXRpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24gZXh0ZW5kcyBJbWFnZUJ1dHRvbiB7CisgICAgZmluYWwgQW5pbWF0aW9uRHJhd2FibGUgbUV4cGFuZEFuaW1hdGlvbkRyYXdhYmxlOworICAgIGZpbmFsIEFuaW1hdGlvbkRyYXdhYmxlIG1Db2xsYXBzZUFuaW1hdGlvbkRyYXdhYmxlOworICAgIGZpbmFsIFN0cmluZyBtRXhwYW5kR3JvdXBEZXNjcmlwdGlvbjsKKyAgICBmaW5hbCBTdHJpbmcgbUNvbGxhcHNlR3JvdXBEZXNjcmlwdGlvbjsKKyAgICBib29sZWFuIG1Jc0dyb3VwRXhwYW5kZWQ7CisgICAgT25DbGlja0xpc3RlbmVyIG1MaXN0ZW5lcjsKKworICAgIHB1YmxpYyBNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24oQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIE1lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIpOworICAgICAgICBtRXhwYW5kQW5pbWF0aW9uRHJhd2FibGUgPSAoQW5pbWF0aW9uRHJhd2FibGUpCisgICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXREcmF3YWJsZShSLmRyYXdhYmxlLm1yX2dyb3VwX2V4cGFuZCk7CisgICAgICAgIG1Db2xsYXBzZUFuaW1hdGlvbkRyYXdhYmxlID0gKEFuaW1hdGlvbkRyYXdhYmxlKQorICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5tcl9ncm91cF9jb2xsYXBzZSk7CisKKyAgICAgICAgQ29sb3JGaWx0ZXIgZmlsdGVyID0gbmV3IFBvcnRlckR1ZmZDb2xvckZpbHRlcigKKyAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldENvbnRyb2xsZXJDb2xvcihjb250ZXh0LCBkZWZTdHlsZUF0dHIpLAorICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5TUkNfSU4pOworICAgICAgICBtRXhwYW5kQW5pbWF0aW9uRHJhd2FibGUuc2V0Q29sb3JGaWx0ZXIoZmlsdGVyKTsKKyAgICAgICAgbUNvbGxhcHNlQW5pbWF0aW9uRHJhd2FibGUuc2V0Q29sb3JGaWx0ZXIoZmlsdGVyKTsKKworICAgICAgICBtRXhwYW5kR3JvdXBEZXNjcmlwdGlvbiA9CisgICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXRTdHJpbmcoUi5zdHJpbmcubXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXApOworICAgICAgICBtQ29sbGFwc2VHcm91cERlc2NyaXB0aW9uID0KKyAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLmdldFN0cmluZyhSLnN0cmluZy5tcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwKTsKKworICAgICAgICBzZXRJbWFnZURyYXdhYmxlKG1FeHBhbmRBbmltYXRpb25EcmF3YWJsZS5nZXRGcmFtZSgwKSk7CisgICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbihtRXhwYW5kR3JvdXBEZXNjcmlwdGlvbik7CisKKyAgICAgICAgc3VwZXIuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2aWV3KSB7CisgICAgICAgICAgICAgICAgbUlzR3JvdXBFeHBhbmRlZCA9ICFtSXNHcm91cEV4cGFuZGVkOworICAgICAgICAgICAgICAgIGlmIChtSXNHcm91cEV4cGFuZGVkKSB7CisgICAgICAgICAgICAgICAgICAgIHNldEltYWdlRHJhd2FibGUobUV4cGFuZEFuaW1hdGlvbkRyYXdhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgbUV4cGFuZEFuaW1hdGlvbkRyYXdhYmxlLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbihtQ29sbGFwc2VHcm91cERlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZXRJbWFnZURyYXdhYmxlKG1Db2xsYXBzZUFuaW1hdGlvbkRyYXdhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgbUNvbGxhcHNlQW5pbWF0aW9uRHJhd2FibGUuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0Q29udGVudERlc2NyaXB0aW9uKG1FeHBhbmRHcm91cERlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lci5vbkNsaWNrKHZpZXcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0T25DbGlja0xpc3RlbmVyKE9uQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVWb2x1bWVTbGlkZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZVZvbHVtZVNsaWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNWQyMGUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVWb2x1bWVTbGlkZXIuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNlZWtCYXI7CisKKy8qKgorICogVm9sdW1lIHNsaWRlciB3aXRoIHNob3dpbmcsIGhpZGluZywgYW5kIGFwcGx5aW5nIGFscGhhIHN1cHBvcnRzIHRvIHRoZSB0aHVtYi4KKyAqLworcHVibGljIGNsYXNzIE1lZGlhUm91dGVWb2x1bWVTbGlkZXIgZXh0ZW5kcyBTZWVrQmFyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVWb2x1bWVTbGlkZXIiOworCisgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdCBtRGlzYWJsZWRBbHBoYTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtSGlkZVRodW1iOworICAgIHByaXZhdGUgRHJhd2FibGUgbVRodW1iOworICAgIHByaXZhdGUgaW50IG1Db2xvcjsKKworICAgIHB1YmxpYyBNZWRpYVJvdXRlVm9sdW1lU2xpZGVyKENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBNZWRpYVJvdXRlVm9sdW1lU2xpZGVyKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgbURpc2FibGVkQWxwaGEgPSBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldERpc2FibGVkQWxwaGEoY29udGV4dCk7CisgICAgfQorCisgICAgcHVibGljIE1lZGlhUm91dGVWb2x1bWVTbGlkZXIoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0cik7CisgICAgICAgIG1EaXNhYmxlZEFscGhhID0gTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXREaXNhYmxlZEFscGhhKGNvbnRleHQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGRyYXdhYmxlU3RhdGVDaGFuZ2VkKCkgeworICAgICAgICBzdXBlci5kcmF3YWJsZVN0YXRlQ2hhbmdlZCgpOworICAgICAgICBpbnQgYWxwaGEgPSBpc0VuYWJsZWQoKSA/IDB4RkYgOiAoaW50KSAoMHhGRiAqIG1EaXNhYmxlZEFscGhhKTsKKworICAgICAgICAvLyBUaGUgdGh1bWIgZHJhd2FibGUgaXMgYSBjb2xsZWN0aW9uIG9mIGRyYXdhYmxlcyBhbmQgaXRzIGN1cnJlbnQgZHJhd2FibGVzIGFyZSBjaGFuZ2VkIHBlcgorICAgICAgICAvLyBzdGF0ZS4gQXBwbHkgdGhlIGNvbG9yIGZpbHRlciBhbmQgYWxwaGEgb24gZXZlcnkgc3RhdGUgY2hhbmdlLgorICAgICAgICBpZiAobVRodW1iICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1UaHVtYi5zZXRDb2xvckZpbHRlcihtQ29sb3IsIFBvcnRlckR1ZmYuTW9kZS5TUkNfSU4pOworICAgICAgICAgICAgbVRodW1iLnNldEFscGhhKGFscGhhKTsKKyAgICAgICAgfQorCisgICAgICAgIGdldFByb2dyZXNzRHJhd2FibGUoKS5zZXRDb2xvckZpbHRlcihtQ29sb3IsIFBvcnRlckR1ZmYuTW9kZS5TUkNfSU4pOworICAgICAgICBnZXRQcm9ncmVzc0RyYXdhYmxlKCkuc2V0QWxwaGEoYWxwaGEpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFRodW1iKERyYXdhYmxlIHRodW1iKSB7CisgICAgICAgIG1UaHVtYiA9IHRodW1iOworICAgICAgICBzdXBlci5zZXRUaHVtYihtSGlkZVRodW1iID8gbnVsbCA6IG1UaHVtYik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIHRvIHNob3cgb3IgaGlkZSB0aHVtYi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIaWRlVGh1bWIoYm9vbGVhbiBoaWRlVGh1bWIpIHsKKyAgICAgICAgaWYgKG1IaWRlVGh1bWIgPT0gaGlkZVRodW1iKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUhpZGVUaHVtYiA9IGhpZGVUaHVtYjsKKyAgICAgICAgc3VwZXIuc2V0VGh1bWIobUhpZGVUaHVtYiA/IG51bGwgOiBtVGh1bWIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZvbHVtZSBzbGlkZXIgY29sb3IuIFRoZSBjaGFuZ2UgdGFrZXMgZWZmZWN0IG5leHQgdGltZSBkcmF3YWJsZSBzdGF0ZSBpcyBjaGFuZ2VkLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjb2xvciBjYW5ub3QgYmUgdHJhbnNsdWNlbnQsIG90aGVyd2lzZSB0aGUgdW5kZXJseWluZyBwcm9ncmVzcyBiYXIgd2lsbCBiZSBzZWVuIHRocm91Z2gKKyAgICAgKiB0aGUgdGh1bWIuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbG9yKGludCBjb2xvcikgeworICAgICAgICBpZiAobUNvbG9yID09IGNvbG9yKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKENvbG9yLmFscGhhKGNvbG9yKSAhPSAweEZGKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJWb2x1bWUgc2xpZGVyIGNvbG9yIGNhbm5vdCBiZSB0cmFuc2x1Y2VudDogIyIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNvbG9yKSk7CisgICAgICAgIH0KKyAgICAgICAgbUNvbG9yID0gY29sb3I7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlclRoZW1lSGVscGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVyVGhlbWVIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2YwNDJmCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlclRoZW1lSGVscGVyLmphdmEKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5JbnREZWY7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmdyYXBoaWNzLkNvbG9yVXRpbHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CisKK2ZpbmFsIGNsYXNzIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IE1JTl9DT05UUkFTVCA9IDMuMGY7CisKKyAgICBASW50RGVmKHtDT0xPUl9EQVJLX09OX0xJR0hUX0JBQ0tHUk9VTkQsIENPTE9SX1dISVRFX09OX0RBUktfQkFDS0dST1VORH0pCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQorICAgIHByaXZhdGUgQGludGVyZmFjZSBDb250cm9sbGVyQ29sb3JUeXBlIHt9CisKKyAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX0RBUktfT05fTElHSFRfQkFDS0dST1VORCA9IDB4REUwMDAwMDA7IC8qIE9wYWNpdHkgb2YgODclICovCisgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9XSElURV9PTl9EQVJLX0JBQ0tHUk9VTkQgPSBDb2xvci5XSElURTsKKworICAgIHByaXZhdGUgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlcigpIHsKKyAgICB9CisKKyAgICBzdGF0aWMgQ29udGV4dCBjcmVhdGVUaGVtZWRCdXR0b25Db250ZXh0KENvbnRleHQgY29udGV4dCkgeworICAgICAgICAvLyBBcHBseSBiYXNlIE1lZGlhIFJvdXRlciB0aGVtZS4KKyAgICAgICAgY29udGV4dCA9IG5ldyBDb250ZXh0VGhlbWVXcmFwcGVyKGNvbnRleHQsIGdldFJvdXRlclRoZW1lSWQoY29udGV4dCkpOworCisgICAgICAgIC8vIEFwcGx5IGN1c3RvbSBNZWRpYSBSb3V0ZXIgdGhlbWUuCisgICAgICAgIGludCBzdHlsZSA9IGdldFRoZW1lUmVzb3VyY2UoY29udGV4dCwgUi5hdHRyLm1lZGlhUm91dGVUaGVtZSk7CisgICAgICAgIGlmIChzdHlsZSAhPSAwKSB7CisgICAgICAgICAgICBjb250ZXh0ID0gbmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgc3R5bGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNvbnRleHQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUaGUgZm9sbG93aW5nIHR3byBtZXRob2RzIGFyZSB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uLiBUaGV5IHNob3VsZCBiZSB1c2VkIHRvIHByZXBhcmUKKyAgICAgKiB0aGUgY29udGV4dCBhbmQgdGhlbWUgZm9yIGEgc3VwZXIgY2xhc3MgY29uc3RydWN0b3IgKHRoZSBsYXR0ZXIgbWV0aG9kIHJlbGllcyBvbiB0aGUKKyAgICAgKiBmb3JtZXIgbWV0aG9kIHRvIHByb3Blcmx5IHByZXBhcmUgdGhlIGNvbnRleHQpOgorICAgICAqICAgc3VwZXIoY29udGV4dCA9IGNyZWF0ZVRoZW1lZERpYWxvZ0NvbnRleHQoY29udGV4dCwgdGhlbWUpLAorICAgICAqICAgICAgICAgICBjcmVhdGVUaGVtZWREaWFsb2dTdHlsZShjb250ZXh0KSk7CisgICAgICoKKyAgICAgKiBJdCB3aWxsIGFwcGx5IHRoZW1lIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIgKHN0eWxlIGxvb2t1cHMgd2lsbCBiZSBkb25lIGluIHJldmVyc2UpOgorICAgICAqICAgMSkgQ3VycmVudCB0aGVtZQorICAgICAqICAgMikgU3VwcGxpZWQgdGhlbWUKKyAgICAgKiAgIDMpIEJhc2UgTWVkaWEgUm91dGVyIHRoZW1lCisgICAgICogICA0KSBDdXN0b20gTWVkaWEgUm91dGVyIHRoZW1lLCBpZiBwcm92aWRlZAorICAgICAqLworICAgIHN0YXRpYyBDb250ZXh0IGNyZWF0ZVRoZW1lZERpYWxvZ0NvbnRleHQoQ29udGV4dCBjb250ZXh0LCBpbnQgdGhlbWUsIGJvb2xlYW4gYWxlcnREaWFsb2cpIHsKKyAgICAgICAgLy8gMSkgQ3VycmVudCB0aGVtZSBpcyBhbHJlYWR5IGFwcGxpZWQgdG8gdGhlIGNvbnRleHQKKworICAgICAgICAvLyAyKSBJZiBubyB0aGVtZSBpcyBzdXBwbGllZCwgbG9vayBpdCB1cCBmcm9tIHRoZSBjb250ZXh0IChkaWFsb2dUaGVtZS9hbGVydERpYWxvZ1RoZW1lKQorICAgICAgICBpZiAodGhlbWUgPT0gMCkgeworICAgICAgICAgICAgdGhlbWUgPSBnZXRUaGVtZVJlc291cmNlKGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICFhbGVydERpYWxvZyA/IGFuZHJvaWQuUi5hdHRyLmRpYWxvZ1RoZW1lIDogYW5kcm9pZC5SLmF0dHIuYWxlcnREaWFsb2dUaGVtZSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gICAgQXBwbHkgaXQKKyAgICAgICAgY29udGV4dCA9IG5ldyBDb250ZXh0VGhlbWVXcmFwcGVyKGNvbnRleHQsIHRoZW1lKTsKKworICAgICAgICAvLyAzKSBJZiBhIGN1c3RvbSBNZWRpYSBSb3V0ZXIgdGhlbWUgaXMgcHJvdmlkZWQgdGhlbiBhcHBseSB0aGUgYmFzZSB0aGVtZQorICAgICAgICBpZiAoZ2V0VGhlbWVSZXNvdXJjZShjb250ZXh0LCBSLmF0dHIubWVkaWFSb3V0ZVRoZW1lKSAhPSAwKSB7CisgICAgICAgICAgICBjb250ZXh0ID0gbmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgZ2V0Um91dGVyVGhlbWVJZChjb250ZXh0KSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY29udGV4dDsKKyAgICB9CisgICAgLy8gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgcHJldmlvdXMgbWV0aG9kLgorICAgIHN0YXRpYyBpbnQgY3JlYXRlVGhlbWVkRGlhbG9nU3R5bGUoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIC8vIDQpIEFwcGx5IHRoZSBjdXN0b20gTWVkaWEgUm91dGVyIHRoZW1lCisgICAgICAgIGludCB0aGVtZSA9IGdldFRoZW1lUmVzb3VyY2UoY29udGV4dCwgUi5hdHRyLm1lZGlhUm91dGVUaGVtZSk7CisgICAgICAgIGlmICh0aGVtZSA9PSAwKSB7CisgICAgICAgICAgICAvLyAzKSBObyBjdXN0b20gTWVkaWFSb3V0ZXIgdGhlbWUgd2FzIHByb3ZpZGVkIHNvIGFwcGx5IHRoZSBiYXNlIHRoZW1lIGluc3RlYWQKKyAgICAgICAgICAgIHRoZW1lID0gZ2V0Um91dGVyVGhlbWVJZChjb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0aGVtZTsKKyAgICB9CisgICAgLy8gRU5ELiBQcmV2aW91cyB0d28gbWV0aG9kcyBzaG91bGQgYmUgdXNlZCBpbiBjb25qdW5jdGlvbi4KKworICAgIHN0YXRpYyBpbnQgZ2V0VGhlbWVSZXNvdXJjZShDb250ZXh0IGNvbnRleHQsIGludCBhdHRyKSB7CisgICAgICAgIFR5cGVkVmFsdWUgdmFsdWUgPSBuZXcgVHlwZWRWYWx1ZSgpOworICAgICAgICByZXR1cm4gY29udGV4dC5nZXRUaGVtZSgpLnJlc29sdmVBdHRyaWJ1dGUoYXR0ciwgdmFsdWUsIHRydWUpID8gdmFsdWUucmVzb3VyY2VJZCA6IDA7CisgICAgfQorCisgICAgc3RhdGljIGZsb2F0IGdldERpc2FibGVkQWxwaGEoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIFR5cGVkVmFsdWUgdmFsdWUgPSBuZXcgVHlwZWRWYWx1ZSgpOworICAgICAgICByZXR1cm4gY29udGV4dC5nZXRUaGVtZSgpLnJlc29sdmVBdHRyaWJ1dGUoYW5kcm9pZC5SLmF0dHIuZGlzYWJsZWRBbHBoYSwgdmFsdWUsIHRydWUpCisgICAgICAgICAgICAgICAgPyB2YWx1ZS5nZXRGbG9hdCgpIDogMC41ZjsKKyAgICB9CisKKyAgICBzdGF0aWMgQENvbnRyb2xsZXJDb2xvclR5cGUgaW50IGdldENvbnRyb2xsZXJDb2xvcihDb250ZXh0IGNvbnRleHQsIGludCBzdHlsZSkgeworICAgICAgICBpbnQgcHJpbWFyeUNvbG9yID0gZ2V0VGhlbWVDb2xvcihjb250ZXh0LCBzdHlsZSwgYW5kcm9pZC5SLmF0dHIuY29sb3JQcmltYXJ5KTsKKyAgICAgICAgaWYgKHByaW1hcnlDb2xvciA9PSAwKSB7CisgICAgICAgICAgICBwcmltYXJ5Q29sb3IgPSBnZXRUaGVtZUNvbG9yKGNvbnRleHQsIHN0eWxlLCBhbmRyb2lkLlIuYXR0ci5jb2xvclByaW1hcnkpOworICAgICAgICAgICAgaWYgKHByaW1hcnlDb2xvciA9PSAwKSB7CisgICAgICAgICAgICAgICAgcHJpbWFyeUNvbG9yID0gMHhGRjAwMDAwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoQ29sb3JVdGlscy5jYWxjdWxhdGVDb250cmFzdChDT0xPUl9XSElURV9PTl9EQVJLX0JBQ0tHUk9VTkQsIHByaW1hcnlDb2xvcikKKyAgICAgICAgICAgICAgICA+PSBNSU5fQ09OVFJBU1QpIHsKKyAgICAgICAgICAgIHJldHVybiBDT0xPUl9XSElURV9PTl9EQVJLX0JBQ0tHUk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIENPTE9SX0RBUktfT05fTElHSFRfQkFDS0dST1VORDsKKyAgICB9CisKKyAgICBzdGF0aWMgaW50IGdldEJ1dHRvblRleHRDb2xvcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgaW50IHByaW1hcnlDb2xvciA9IGdldFRoZW1lQ29sb3IoY29udGV4dCwgMCwgYW5kcm9pZC5SLmF0dHIuY29sb3JQcmltYXJ5KTsKKyAgICAgICAgaW50IGJhY2tncm91bmRDb2xvciA9IGdldFRoZW1lQ29sb3IoY29udGV4dCwgMCwgYW5kcm9pZC5SLmF0dHIuY29sb3JCYWNrZ3JvdW5kKTsKKworICAgICAgICBpZiAoQ29sb3JVdGlscy5jYWxjdWxhdGVDb250cmFzdChwcmltYXJ5Q29sb3IsIGJhY2tncm91bmRDb2xvcikgPCBNSU5fQ09OVFJBU1QpIHsKKyAgICAgICAgICAgIC8vIERlZmF1bHQgdG8gY29sb3JBY2NlbnQgaWYgdGhlIGNvbnRyYXN0IHJhdGlvIGlzIGxvdy4KKyAgICAgICAgICAgIHJldHVybiBnZXRUaGVtZUNvbG9yKGNvbnRleHQsIDAsIGFuZHJvaWQuUi5hdHRyLmNvbG9yQWNjZW50KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJpbWFyeUNvbG9yOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHNldE1lZGlhQ29udHJvbHNCYWNrZ3JvdW5kQ29sb3IoCisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIFZpZXcgbWFpbkNvbnRyb2xzLCBWaWV3IGdyb3VwQ29udHJvbHMsIGJvb2xlYW4gaGFzR3JvdXApIHsKKyAgICAgICAgaW50IHByaW1hcnlDb2xvciA9IGdldFRoZW1lQ29sb3IoY29udGV4dCwgMCwgYW5kcm9pZC5SLmF0dHIuY29sb3JQcmltYXJ5KTsKKyAgICAgICAgaW50IHByaW1hcnlEYXJrQ29sb3IgPSBnZXRUaGVtZUNvbG9yKGNvbnRleHQsIDAsIGFuZHJvaWQuUi5hdHRyLmNvbG9yUHJpbWFyeURhcmspOworICAgICAgICBpZiAoaGFzR3JvdXAgJiYgZ2V0Q29udHJvbGxlckNvbG9yKGNvbnRleHQsIDApID09IENPTE9SX0RBUktfT05fTElHSFRfQkFDS0dST1VORCkgeworICAgICAgICAgICAgLy8gSW5zdGVhZCBvZiBzaG93aW5nIGRhcmsgY29udHJvbHMgaW4gYSBwb3NzaWJseSBkYXJrIChpLmUuIHRoZSBwcmltYXJ5IGRhcmspLCBtb2RlbAorICAgICAgICAgICAgLy8gdGhlIHdoaXRlIGRpYWxvZyBhbmQgdXNlIHRoZSBwcmltYXJ5IGNvbG9yIGZvciB0aGUgZ3JvdXAgY29udHJvbHMuCisgICAgICAgICAgICBwcmltYXJ5RGFya0NvbG9yID0gcHJpbWFyeUNvbG9yOworICAgICAgICAgICAgcHJpbWFyeUNvbG9yID0gQ29sb3IuV0hJVEU7CisgICAgICAgIH0KKyAgICAgICAgbWFpbkNvbnRyb2xzLnNldEJhY2tncm91bmRDb2xvcihwcmltYXJ5Q29sb3IpOworICAgICAgICBncm91cENvbnRyb2xzLnNldEJhY2tncm91bmRDb2xvcihwcmltYXJ5RGFya0NvbG9yKTsKKyAgICAgICAgLy8gQWxzbyBzdG9yZSB0aGUgYmFja2dyb3VuZCBjb2xvcnMgdG8gdGhlIHZpZXcgdGFncy4gVGhleSBhcmUgdXNlZCBpbgorICAgICAgICAvLyBzZXRWb2x1bWVTbGlkZXJDb2xvcigpIGJlbG93LgorICAgICAgICBtYWluQ29udHJvbHMuc2V0VGFnKHByaW1hcnlDb2xvcik7CisgICAgICAgIGdyb3VwQ29udHJvbHMuc2V0VGFnKHByaW1hcnlEYXJrQ29sb3IpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHNldFZvbHVtZVNsaWRlckNvbG9yKAorICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBNZWRpYVJvdXRlVm9sdW1lU2xpZGVyIHZvbHVtZVNsaWRlciwgVmlldyBiYWNrZ3JvdW5kVmlldykgeworICAgICAgICBpbnQgY29udHJvbGxlckNvbG9yID0gZ2V0Q29udHJvbGxlckNvbG9yKGNvbnRleHQsIDApOworICAgICAgICBpZiAoQ29sb3IuYWxwaGEoY29udHJvbGxlckNvbG9yKSAhPSAweEZGKSB7CisgICAgICAgICAgICAvLyBDb21wb3NpdGUgd2l0aCB0aGUgYmFja2dyb3VuZCBpbiBvcmRlciBub3QgdG8gc2hvdyB0aGUgdW5kZXJseWluZyBwcm9ncmVzcyBiYXIKKyAgICAgICAgICAgIC8vIHRocm91Z2ggdGhlIHRodW1iLgorICAgICAgICAgICAgaW50IGJhY2tncm91bmRDb2xvciA9IChpbnQpIGJhY2tncm91bmRWaWV3LmdldFRhZygpOworICAgICAgICAgICAgY29udHJvbGxlckNvbG9yID0gQ29sb3JVdGlscy5jb21wb3NpdGVDb2xvcnMoY29udHJvbGxlckNvbG9yLCBiYWNrZ3JvdW5kQ29sb3IpOworICAgICAgICB9CisgICAgICAgIHZvbHVtZVNsaWRlci5zZXRDb2xvcihjb250cm9sbGVyQ29sb3IpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMaWdodFRoZW1lKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBUeXBlZFZhbHVlIHZhbHVlID0gbmV3IFR5cGVkVmFsdWUoKTsKKyAgICAgICAgLy8gVE9ETyhzdW5nc29vKTogU3dpdGNoIHRvIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5pc0xpZ2h0VGhlbWUKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0VGhlbWUoKS5yZXNvbHZlQXR0cmlidXRlKGFuZHJvaWQuc3VwcG9ydC52Ny5hcHBjb21wYXQuUi5hdHRyLmlzTGlnaHRUaGVtZSwKKyAgICAgICAgICAgICAgICB2YWx1ZSwgdHJ1ZSkgJiYgdmFsdWUuZGF0YSAhPSAwOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRUaGVtZUNvbG9yKENvbnRleHQgY29udGV4dCwgaW50IHN0eWxlLCBpbnQgYXR0cikgeworICAgICAgICBpZiAoc3R5bGUgIT0gMCkgeworICAgICAgICAgICAgaW50W10gYXR0cnMgPSB7IGF0dHIgfTsKKyAgICAgICAgICAgIFR5cGVkQXJyYXkgdGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoc3R5bGUsIGF0dHJzKTsKKyAgICAgICAgICAgIGludCBjb2xvciA9IHRhLmdldENvbG9yKDAsIDApOworICAgICAgICAgICAgdGEucmVjeWNsZSgpOworICAgICAgICAgICAgaWYgKGNvbG9yICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29sb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7CisgICAgICAgIGNvbnRleHQuZ2V0VGhlbWUoKS5yZXNvbHZlQXR0cmlidXRlKGF0dHIsIHZhbHVlLCB0cnVlKTsKKyAgICAgICAgaWYgKHZhbHVlLnJlc291cmNlSWQgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Q29sb3IodmFsdWUucmVzb3VyY2VJZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbHVlLmRhdGE7CisgICAgfQorCisgICAgc3RhdGljIGludCBnZXRSb3V0ZXJUaGVtZUlkKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBpbnQgdGhlbWVJZDsKKyAgICAgICAgaWYgKGlzTGlnaHRUaGVtZShjb250ZXh0KSkgeworICAgICAgICAgICAgaWYgKGdldENvbnRyb2xsZXJDb2xvcihjb250ZXh0LCAwKSA9PSBDT0xPUl9EQVJLX09OX0xJR0hUX0JBQ0tHUk9VTkQpIHsKKyAgICAgICAgICAgICAgICB0aGVtZUlkID0gUi5zdHlsZS5UaGVtZV9NZWRpYVJvdXRlcl9MaWdodDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhlbWVJZCA9IFIuc3R5bGUuVGhlbWVfTWVkaWFSb3V0ZXJfTGlnaHRfRGFya0NvbnRyb2xQYW5lbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChnZXRDb250cm9sbGVyQ29sb3IoY29udGV4dCwgMCkgPT0gQ09MT1JfREFSS19PTl9MSUdIVF9CQUNLR1JPVU5EKSB7CisgICAgICAgICAgICAgICAgdGhlbWVJZCA9IFIuc3R5bGUuVGhlbWVfTWVkaWFSb3V0ZXJfTGlnaHRDb250cm9sUGFuZWw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoZW1lSWQgPSBSLnN0eWxlLlRoZW1lX01lZGlhUm91dGVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGVtZUlkOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvT3ZlcmxheUxpc3RWaWV3LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL092ZXJsYXlMaXN0Vmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMGRlZTIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL092ZXJsYXlMaXN0Vmlldy5qYXZhCkBAIC0wLDAgKzEsMjY1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEEgTGlzdFZpZXcgd2hpY2ggaGFzIGFuIGFkZGl0aW9uYWwgb3ZlcmxheSBsYXllci4ge0BsaW5rIEJpdG1hcERyYXdhYmxlfQorICogY2FuIGJlIGFkZGVkIHRvIHRoZSBsYXllciBhbmQgY2FuIGJlIGFuaW1hdGVkLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgT3ZlcmxheUxpc3RWaWV3IGV4dGVuZHMgTGlzdFZpZXcgeworICAgIHByaXZhdGUgZmluYWwgTGlzdDxPdmVybGF5T2JqZWN0PiBtT3ZlcmxheU9iamVjdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgIHB1YmxpYyBPdmVybGF5TGlzdFZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgIH0KKworICAgIHB1YmxpYyBPdmVybGF5TGlzdFZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworICAgIH0KKworICAgIHB1YmxpYyBPdmVybGF5TGlzdFZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0cik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhbiBvYmplY3QgdG8gdGhlIG92ZXJsYXkgbGF5ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqZWN0IEFuIG9iamVjdCB0byBiZSBhZGRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRPdmVybGF5T2JqZWN0KE92ZXJsYXlPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgIG1PdmVybGF5T2JqZWN0cy5hZGQob2JqZWN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydHMgYWxsIGFuaW1hdGlvbnMgb2Ygb2JqZWN0cyBpbiB0aGUgb3ZlcmxheSBsYXllci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydEFuaW1hdGlvbkFsbCgpIHsKKyAgICAgICAgZm9yIChPdmVybGF5T2JqZWN0IG9iamVjdCA6IG1PdmVybGF5T2JqZWN0cykgeworICAgICAgICAgICAgaWYgKCFvYmplY3QuaXNBbmltYXRpb25TdGFydGVkKCkpIHsKKyAgICAgICAgICAgICAgICBvYmplY3Quc3RhcnRBbmltYXRpb24oZ2V0RHJhd2luZ1RpbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyBhbGwgYW5pbWF0aW9ucyBvZiBvYmplY3RzIGluIHRoZSBvdmVybGF5IGxheWVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3BBbmltYXRpb25BbGwoKSB7CisgICAgICAgIGZvciAoT3ZlcmxheU9iamVjdCBvYmplY3QgOiBtT3ZlcmxheU9iamVjdHMpIHsKKyAgICAgICAgICAgIG9iamVjdC5zdG9wQW5pbWF0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKyAgICAgICAgaWYgKG1PdmVybGF5T2JqZWN0cy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBJdGVyYXRvcjxPdmVybGF5T2JqZWN0PiBpdCA9IG1PdmVybGF5T2JqZWN0cy5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIE92ZXJsYXlPYmplY3Qgb2JqZWN0ID0gaXQubmV4dCgpOworICAgICAgICAgICAgICAgIEJpdG1hcERyYXdhYmxlIGJpdG1hcCA9IG9iamVjdC5nZXRCaXRtYXBEcmF3YWJsZSgpOworICAgICAgICAgICAgICAgIGlmIChiaXRtYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBiaXRtYXAuZHJhdyhjYW52YXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW9iamVjdC51cGRhdGUoZ2V0RHJhd2luZ1RpbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgYW4gb2JqZWN0IHRvIGJlIHNob3duIGluIHRoZSBvdmVybGF5IGxheWVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgT3ZlcmxheU9iamVjdCB7CisgICAgICAgIHByaXZhdGUgQml0bWFwRHJhd2FibGUgbUJpdG1hcDsKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBtQ3VycmVudEFscGhhID0gMS4wZjsKKyAgICAgICAgcHJpdmF0ZSBSZWN0IG1DdXJyZW50Qm91bmRzOworICAgICAgICBwcml2YXRlIEludGVycG9sYXRvciBtSW50ZXJwb2xhdG9yOworICAgICAgICBwcml2YXRlIGxvbmcgbUR1cmF0aW9uOworICAgICAgICBwcml2YXRlIFJlY3QgbVN0YXJ0UmVjdDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbURlbHRhWTsKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCBtU3RhcnRBbHBoYSA9IDEuMGY7CisgICAgICAgIHByaXZhdGUgZmxvYXQgbUVuZEFscGhhID0gMS4wZjsKKyAgICAgICAgcHJpdmF0ZSBsb25nIG1TdGFydFRpbWU7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSXNBbmltYXRpb25TdGFydGVkOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUlzQW5pbWF0aW9uRW5kZWQ7CisgICAgICAgIHByaXZhdGUgT25BbmltYXRpb25FbmRMaXN0ZW5lciBtTGlzdGVuZXI7CisKKyAgICAgICAgcHVibGljIE92ZXJsYXlPYmplY3QoQml0bWFwRHJhd2FibGUgYml0bWFwLCBSZWN0IHN0YXJ0UmVjdCkgeworICAgICAgICAgICAgbUJpdG1hcCA9IGJpdG1hcDsKKyAgICAgICAgICAgIG1TdGFydFJlY3QgPSBzdGFydFJlY3Q7CisgICAgICAgICAgICBtQ3VycmVudEJvdW5kcyA9IG5ldyBSZWN0KHN0YXJ0UmVjdCk7CisgICAgICAgICAgICBpZiAobUJpdG1hcCAhPSBudWxsICYmIG1DdXJyZW50Qm91bmRzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQml0bWFwLnNldEFscGhhKChpbnQpIChtQ3VycmVudEFscGhhICogMjU1KSk7CisgICAgICAgICAgICAgICAgbUJpdG1hcC5zZXRCb3VuZHMobUN1cnJlbnRCb3VuZHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIGJpdG1hcCB0aGF0IHRoaXMgb2JqZWN0IHJlcHJlc2VudHMuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gQml0bWFwRHJhd2FibGUgdGhhdCB0aGlzIG9iamVjdCBoYXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQml0bWFwRHJhd2FibGUgZ2V0Qml0bWFwRHJhd2FibGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbUJpdG1hcDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBzdGFydGVkIHN0YXR1cyBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGFuaW1hdGlvbiBoYXMgc3RhcnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBbmltYXRpb25TdGFydGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Jc0FuaW1hdGlvblN0YXJ0ZWQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyBhbmltYXRpb24gZm9yIHZhcnlpbmcgYWxwaGEuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzdGFydEFscGhhIFN0YXJ0aW5nIGFscGhhIHZhbHVlIGZvciB0aGUgYW5pbWF0aW9uLCB3aGVyZSAxLjAgbWVhbnMKKyAgICAgICAgICogZnVsbHkgb3BhcXVlIGFuZCAwLjAgbWVhbnMgZnVsbHkgdHJhbnNwYXJlbnQuCisgICAgICAgICAqIEBwYXJhbSBlbmRBbHBoYSBFbmRpbmcgYWxwaGEgdmFsdWUgZm9yIHRoZSBhbmltYXRpb24uCisgICAgICAgICAqIEByZXR1cm4gVGhpcyBPdmVybGF5T2JqZWN0IHRvIGFsbG93IGZvciBjaGFpbmluZyBvZiBjYWxscy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBPdmVybGF5T2JqZWN0IHNldEFscGhhQW5pbWF0aW9uKGZsb2F0IHN0YXJ0QWxwaGEsIGZsb2F0IGVuZEFscGhhKSB7CisgICAgICAgICAgICBtU3RhcnRBbHBoYSA9IHN0YXJ0QWxwaGE7CisgICAgICAgICAgICBtRW5kQWxwaGEgPSBlbmRBbHBoYTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgYW5pbWF0aW9uIGZvciBtb3Zpbmcgb2JqZWN0cyB2ZXJ0aWNhbGx5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZGVsdGFZIERpc3RhbmNlIHRvIG1vdmUgaW4gcGl4ZWxzLgorICAgICAgICAgKiBAcmV0dXJuIFRoaXMgT3ZlcmxheU9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5pbmcgb2YgY2FsbHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgT3ZlcmxheU9iamVjdCBzZXRUcmFuc2xhdGVZQW5pbWF0aW9uKGludCBkZWx0YVkpIHsKKyAgICAgICAgICAgIG1EZWx0YVkgPSBkZWx0YVk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIGhvdyBsb25nIHRoZSBhbmltYXRpb24gd2lsbCBsYXN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZHVyYXRpb24gRHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzCisgICAgICAgICAqIEByZXR1cm4gVGhpcyBPdmVybGF5T2JqZWN0IHRvIGFsbG93IGZvciBjaGFpbmluZyBvZiBjYWxscy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBPdmVybGF5T2JqZWN0IHNldER1cmF0aW9uKGxvbmcgZHVyYXRpb24pIHsKKyAgICAgICAgICAgIG1EdXJhdGlvbiA9IGR1cmF0aW9uOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgYWNjZWxlcmF0aW9uIGN1cnZlIGZvciB0aGlzIGFuaW1hdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGludGVycG9sYXRvciBUaGUgaW50ZXJwb2xhdG9yIHdoaWNoIGRlZmluZXMgdGhlIGFjY2VsZXJhdGlvbiBjdXJ2ZQorICAgICAgICAgKiBAcmV0dXJuIFRoaXMgT3ZlcmxheU9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5pbmcgb2YgY2FsbHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgT3ZlcmxheU9iamVjdCBzZXRJbnRlcnBvbGF0b3IoSW50ZXJwb2xhdG9yIGludGVycG9sYXRvcikgeworICAgICAgICAgICAgbUludGVycG9sYXRvciA9IGludGVycG9sYXRvcjsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJpbmRzIGFuIGFuaW1hdGlvbiBlbmQgbGlzdGVuZXIgdG8gdGhlIGFuaW1hdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBhbmltYXRpb24gZW5kIGxpc3RlbmVyIHRvIGJlIG5vdGlmaWVkLgorICAgICAgICAgKiBAcmV0dXJuIFRoaXMgT3ZlcmxheU9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5pbmcgb2YgY2FsbHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgT3ZlcmxheU9iamVjdCBzZXRBbmltYXRpb25FbmRMaXN0ZW5lcihPbkFuaW1hdGlvbkVuZExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN0YXJ0cyB0aGUgYW5pbWF0aW9uIGFuZCBzZXRzIHRoZSBzdGFydCB0aW1lLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc3RhcnRUaW1lIFN0YXJ0IHRpbWUgdG8gYmUgc2V0IGluIE1pbGxpcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc3RhcnRBbmltYXRpb24obG9uZyBzdGFydFRpbWUpIHsKKyAgICAgICAgICAgIG1TdGFydFRpbWUgPSBzdGFydFRpbWU7CisgICAgICAgICAgICBtSXNBbmltYXRpb25TdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTdG9wcyB0aGUgYW5pbWF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc3RvcEFuaW1hdGlvbigpIHsKKyAgICAgICAgICAgIG1Jc0FuaW1hdGlvblN0YXJ0ZWQgPSB0cnVlOworICAgICAgICAgICAgbUlzQW5pbWF0aW9uRW5kZWQgPSB0cnVlOworICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uQW5pbWF0aW9uRW5kKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsY3VsYXRlcyBhbmQgdXBkYXRlcyBjdXJyZW50IGJvdW5kcyBhbmQgYWxwaGEgdmFsdWUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjdXJyZW50VGltZSBDdXJyZW50IHRpbWUuaW4gbWlsbGlzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGUobG9uZyBjdXJyZW50VGltZSkgeworICAgICAgICAgICAgaWYgKG1Jc0FuaW1hdGlvbkVuZGVkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmxvYXQgbm9ybWFsaXplZFRpbWUgPSAoY3VycmVudFRpbWUgLSBtU3RhcnRUaW1lKSAvIChmbG9hdCkgbUR1cmF0aW9uOworICAgICAgICAgICAgbm9ybWFsaXplZFRpbWUgPSBNYXRoLm1heCgwLjBmLCBNYXRoLm1pbigxLjBmLCBub3JtYWxpemVkVGltZSkpOworICAgICAgICAgICAgaWYgKCFtSXNBbmltYXRpb25TdGFydGVkKSB7CisgICAgICAgICAgICAgICAgbm9ybWFsaXplZFRpbWUgPSAwLjBmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmxvYXQgaW50ZXJwb2xhdGVkVGltZSA9IChtSW50ZXJwb2xhdG9yID09IG51bGwpID8gbm9ybWFsaXplZFRpbWUKKyAgICAgICAgICAgICAgICAgICAgOiBtSW50ZXJwb2xhdG9yLmdldEludGVycG9sYXRpb24obm9ybWFsaXplZFRpbWUpOworICAgICAgICAgICAgaW50IGRlbHRhWSA9IChpbnQpIChtRGVsdGFZICogaW50ZXJwb2xhdGVkVGltZSk7CisgICAgICAgICAgICBtQ3VycmVudEJvdW5kcy50b3AgPSBtU3RhcnRSZWN0LnRvcCArIGRlbHRhWTsKKyAgICAgICAgICAgIG1DdXJyZW50Qm91bmRzLmJvdHRvbSA9IG1TdGFydFJlY3QuYm90dG9tICsgZGVsdGFZOworICAgICAgICAgICAgbUN1cnJlbnRBbHBoYSA9IG1TdGFydEFscGhhICsgKG1FbmRBbHBoYSAtIG1TdGFydEFscGhhKSAqIGludGVycG9sYXRlZFRpbWU7CisgICAgICAgICAgICBpZiAobUJpdG1hcCAhPSBudWxsICYmIG1DdXJyZW50Qm91bmRzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQml0bWFwLnNldEFscGhhKChpbnQpIChtQ3VycmVudEFscGhhICogMjU1KSk7CisgICAgICAgICAgICAgICAgbUJpdG1hcC5zZXRCb3VuZHMobUN1cnJlbnRCb3VuZHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1Jc0FuaW1hdGlvblN0YXJ0ZWQgJiYgbm9ybWFsaXplZFRpbWUgPj0gMS4wZikgeworICAgICAgICAgICAgICAgIG1Jc0FuaW1hdGlvbkVuZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uQW5pbWF0aW9uRW5kKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICFtSXNBbmltYXRpb25FbmRlZDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiBhbmltYXRpb24gbGlzdGVuZXIgdGhhdCByZWNlaXZlcyBub3RpZmljYXRpb25zIHdoZW4gdGhlIGFuaW1hdGlvbiBlbmRzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludGVyZmFjZSBPbkFuaW1hdGlvbkVuZExpc3RlbmVyIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogTm90aWZpZXMgdGhlIGVuZCBvZiB0aGUgYW5pbWF0aW9uLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi1tcjEvTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4tbXIxL01lZGlhUm91dGVySmVsbHliZWFuTXIxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg1MzliZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4tbXIxL01lZGlhUm91dGVySmVsbHliZWFuTXIxLmphdmEKQEAgLTAsMCArMSwxODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuZGlzcGxheS5EaXNwbGF5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5SZXF1aXJlc0FwaTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5EaXNwbGF5OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKKy8vIEBAUmVxdWlyZXNBcGkoMTcpCitmaW5hbCBjbGFzcyBNZWRpYVJvdXRlckplbGx5YmVhbk1yMSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlckplbGx5YmVhbk1yMSI7CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVDYWxsYmFjayhDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICByZXR1cm4gbmV3IENhbGxiYWNrUHJveHk8Q2FsbGJhY2s+KGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlSW5mbyB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VuYWJsZWQoT2JqZWN0IHJvdXRlT2JqKSB7CisgICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuaXNFbmFibGVkKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIERpc3BsYXkgZ2V0UHJlc2VudGF0aW9uRGlzcGxheShPYmplY3Qgcm91dGVPYmopIHsKKyAgICAgICAgICAgIC8vIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvLmdldFByZXNlbnRhdGlvbkRpc3BsYXkoKSB3YXMKKyAgICAgICAgICAgIC8vIGFkZGVkIGluIEFQSSAxNy4gSG93ZXZlciwgc29tZSBmYWN0b3J5IHJlbGVhc2VzIG9mIEpCIE1SMSBtaXNzZWQgaXQuCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRQcmVzZW50YXRpb25EaXNwbGF5KCk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFcnJvciBleCkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBnZXQgcHJlc2VudGF0aW9uIGRpc3BsYXkgZm9yIHRoZSByb3V0ZS4iLCBleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIENhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZXJKZWxseWJlYW4uQ2FsbGJhY2sgeworICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUHJlc2VudGF0aW9uRGlzcGxheUNoYW5nZWQoT2JqZWN0IHJvdXRlT2JqKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXb3JrYXJvdW5kIHRoZSBmYWN0IHRoYXQgdGhlIHZlcnNpb24gb2YgTWVkaWFSb3V0ZXIuYWRkQ2FsbGJhY2soKSB0aGF0IGFjY2VwdHMgYQorICAgICAqIGZsYWcgdG8gcGVyZm9ybSBhbiBhY3RpdmUgc2NhbiBkb2VzIG5vdCBleGlzdCBpbiBKQiBNUjEgc28gd2UgbmVlZCB0byBmb3JjZQorICAgICAqIHdpZmkgZGlzcGxheSBzY2FucyBkaXJlY3RseSB0aHJvdWdoIHRoZSBEaXNwbGF5TWFuYWdlci4KKyAgICAgKiBEbyBub3QgdXNlIG9uIEpCIE1SMiBhbmQgYWJvdmUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBBY3RpdmVTY2FuV29ya2Fyb3VuZCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAgICAgLy8gVGltZSBiZXR3ZWVuIHdpZmkgZGlzcGxheSBzY2FucyB3aGVuIGFjdGl2ZWx5IHNjYW5uaW5nIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdJRklfRElTUExBWV9TQ0FOX0lOVEVSVkFMID0gMTUwMDA7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBEaXNwbGF5TWFuYWdlciBtRGlzcGxheU1hbmFnZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlcjsKKyAgICAgICAgcHJpdmF0ZSBNZXRob2QgbVNjYW5XaWZpRGlzcGxheXNNZXRob2Q7CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1BY3RpdmVseVNjYW5uaW5nV2lmaURpc3BsYXlzOworCisgICAgICAgIHB1YmxpYyBBY3RpdmVTY2FuV29ya2Fyb3VuZChDb250ZXh0IGNvbnRleHQsIEhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCAhPSAxNykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtRGlzcGxheU1hbmFnZXIgPSAoRGlzcGxheU1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkRJU1BMQVlfU0VSVklDRSk7CisgICAgICAgICAgICBtSGFuZGxlciA9IGhhbmRsZXI7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TY2FuV2lmaURpc3BsYXlzTWV0aG9kID0gRGlzcGxheU1hbmFnZXIuY2xhc3MuZ2V0TWV0aG9kKCJzY2FuV2lmaURpc3BsYXlzIik7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVNjYW5Sb3V0ZVR5cGVzKGludCByb3V0ZVR5cGVzKSB7CisgICAgICAgICAgICAvLyBPbiBKQiBNUjEsIHRoZXJlIGlzIG5vIEFQSSB0byBzY2FuIHdpZmkgZGlzcGxheSByb3V0ZXMuCisgICAgICAgICAgICAvLyBJbnN0ZWFkIHdlIG11c3QgbWFrZSBhIGRpcmVjdCBjYWxsIGludG8gdGhlIERpc3BsYXlNYW5hZ2VyIHRvIHNjYW4KKyAgICAgICAgICAgIC8vIHdpZmkgZGlzcGxheXMgb24gdGhpcyB2ZXJzaW9uIGJ1dCBvbmx5IHdoZW4gbGl2ZSB2aWRlbyByb3V0ZXMgYXJlIHJlcXVlc3RlZC4KKyAgICAgICAgICAgIC8vIFNlZSBhbHNvIHRoZSBKZWxseWJlYW5NcjJJbXBsIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kLgorICAgICAgICAgICAgLy8gVGhpcyB3YXMgZml4ZWQgaW4gSkIgTVIyIGJ5IGFkZGluZyBhIG5ldyBvdmVybG9hZCBvZiBhZGRDYWxsYmFjaygpIHRvCisgICAgICAgICAgICAvLyBlbmFibGUgYWN0aXZlIHNjYW5uaW5nIG9uIHJlcXVlc3QuCisgICAgICAgICAgICBpZiAoKHJvdXRlVHlwZXMgJiBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX0xJVkVfVklERU8pICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1BY3RpdmVseVNjYW5uaW5nV2lmaURpc3BsYXlzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU2NhbldpZmlEaXNwbGF5c01ldGhvZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5cyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5wb3N0KHRoaXMpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IHNjYW4gZm9yIHdpZmkgZGlzcGxheXMgYmVjYXVzZSB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJEaXNwbGF5TWFuYWdlci5zY2FuV2lmaURpc3BsYXlzKCkgbWV0aG9kIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibm90IGF2YWlsYWJsZSBvbiB0aGlzIGRldmljZS4iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG1BY3RpdmVseVNjYW5uaW5nV2lmaURpc3BsYXlzKSB7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVseVNjYW5uaW5nV2lmaURpc3BsYXlzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyh0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgaWYgKG1BY3RpdmVseVNjYW5uaW5nV2lmaURpc3BsYXlzKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbVNjYW5XaWZpRGlzcGxheXNNZXRob2QuaW52b2tlKG1EaXNwbGF5TWFuYWdlcik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3Qgc2NhbiBmb3Igd2lmaSBkaXNwbGF5cy4iLCBleCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3Qgc2NhbiBmb3Igd2lmaSBkaXNwbGF5cy4iLCBleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKHRoaXMsIFdJRklfRElTUExBWV9TQ0FOX0lOVEVSVkFMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdvcmthcm91bmQgdGhlIGZhY3QgdGhhdCB0aGUgaXNDb25uZWN0aW5nKCkgbWV0aG9kIGRvZXMgbm90IGV4aXN0IGluIEpCIE1SMS4KKyAgICAgKiBEbyBub3QgdXNlIG9uIEpCIE1SMiBhbmQgYWJvdmUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBJc0Nvbm5lY3RpbmdXb3JrYXJvdW5kIHsKKyAgICAgICAgcHJpdmF0ZSBNZXRob2QgbUdldFN0YXR1c0NvZGVNZXRob2Q7CisgICAgICAgIHByaXZhdGUgaW50IG1TdGF0dXNDb25uZWN0aW5nOworCisgICAgICAgIHB1YmxpYyBJc0Nvbm5lY3RpbmdXb3JrYXJvdW5kKCkgeworICAgICAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCAhPSAxNykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEZpZWxkIHN0YXR1c0Nvbm5lY3RpbmdGaWVsZCA9CisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mby5jbGFzcy5nZXRGaWVsZCgiU1RBVFVTX0NPTk5FQ1RJTkciKTsKKyAgICAgICAgICAgICAgICBtU3RhdHVzQ29ubmVjdGluZyA9IHN0YXR1c0Nvbm5lY3RpbmdGaWVsZC5nZXRJbnQobnVsbCk7CisgICAgICAgICAgICAgICAgbUdldFN0YXR1c0NvZGVNZXRob2QgPQorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8uY2xhc3MuZ2V0TWV0aG9kKCJnZXRTdGF0dXNDb2RlIik7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RpbmcoT2JqZWN0IHJvdXRlT2JqKSB7CisgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9CisgICAgICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iajsKKworICAgICAgICAgICAgaWYgKG1HZXRTdGF0dXNDb2RlTWV0aG9kICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzQ29kZSA9IChJbnRlZ2VyKW1HZXRTdGF0dXNDb2RlTWV0aG9kLmludm9rZShyb3V0ZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXNDb2RlID09IG1TdGF0dXNDb25uZWN0aW5nOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBc3N1bWUgbm90IGNvbm5lY3RpbmcuCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQ2FsbGJhY2tQcm94eTxUIGV4dGVuZHMgQ2FsbGJhY2s+CisgICAgICAgICAgICBleHRlbmRzIE1lZGlhUm91dGVySmVsbHliZWFuLkNhbGxiYWNrUHJveHk8VD4geworICAgICAgICBwdWJsaWMgQ2FsbGJhY2tQcm94eShUIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBzdXBlcihjYWxsYmFjayk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVByZXNlbnRhdGlvbkRpc3BsYXlDaGFuZ2VkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAorICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZVByZXNlbnRhdGlvbkRpc3BsYXlDaGFuZ2VkKHJvdXRlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4tbXIyL01lZGlhUm91dGVySmVsbHliZWFuTXIyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuLW1yMi9NZWRpYVJvdXRlckplbGx5YmVhbk1yMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMDM1NDkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuLW1yMi9NZWRpYVJvdXRlckplbGx5YmVhbk1yMi5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKKworLy8gQEBSZXF1aXJlc0FwaSgxOCkKK2ZpbmFsIGNsYXNzIE1lZGlhUm91dGVySmVsbHliZWFuTXIyIHsKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXREZWZhdWx0Um91dGUoT2JqZWN0IHJvdXRlck9iaikgeworICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuZ2V0RGVmYXVsdFJvdXRlKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZENhbGxiYWNrKE9iamVjdCByb3V0ZXJPYmosIGludCB0eXBlcywgT2JqZWN0IGNhbGxiYWNrT2JqLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuYWRkQ2FsbGJhY2sodHlwZXMsCisgICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuQ2FsbGJhY2spY2FsbGJhY2tPYmosIGZsYWdzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlSW5mbyB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ2hhclNlcXVlbmNlIGdldERlc2NyaXB0aW9uKE9iamVjdCByb3V0ZU9iaikgeworICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldERlc2NyaXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb25uZWN0aW5nKE9iamVjdCByb3V0ZU9iaikgeworICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmlzQ29ubmVjdGluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBVc2VyUm91dGVJbmZvIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldERlc2NyaXB0aW9uKE9iamVjdCByb3V0ZU9iaiwgQ2hhclNlcXVlbmNlIGRlc2NyaXB0aW9uKSB7CisgICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi9NZWRpYVJvdXRlckplbGx5YmVhbi5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi9NZWRpYVJvdXRlckplbGx5YmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYjU5YjgKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuL01lZGlhUm91dGVySmVsbHliZWFuLmphdmEKQEAgLTAsMCArMSw0NjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLy8gQEBSZXF1aXJlc0FwaSgxNikKK2ZpbmFsIGNsYXNzIE1lZGlhUm91dGVySmVsbHliZWFuIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVySmVsbHliZWFuIjsKKworICAgIC8vIGFuZHJvaWQubWVkaWEuQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCA9IDB4ODA7CisgICAgLy8gYW5kcm9pZC5tZWRpYS5BdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMgPSAweDEwMDsKKyAgICAvLyBhbmRyb2lkLm1lZGlhLkF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUiA9IDB4MjAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9PVVRfQkxVRVRPT1RIID0gMHg4MCB8IDB4MTAwIHwgMHgyMDA7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBST1VURV9UWVBFX0xJVkVfQVVESU8gPSAweDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUk9VVEVfVFlQRV9MSVZFX1ZJREVPID0gMHgyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPVVRFX1RZUEVfVVNFUiA9IDB4MDA4MDAwMDA7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExfUk9VVEVfVFlQRVMgPQorICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX0FVRElPCisgICAgICAgICAgICB8IE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfTElWRV9WSURFTworICAgICAgICAgICAgfCBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX1VTRVI7CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRNZWRpYVJvdXRlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0Lk1FRElBX1JPVVRFUl9TRVJWSUNFKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyYXd0eXBlcyIsICJ1bmNoZWNrZWQiIH0pCisgICAgcHVibGljIHN0YXRpYyBMaXN0IGdldFJvdXRlcyhPYmplY3Qgcm91dGVyT2JqKSB7CisgICAgICAgIGZpbmFsIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyID0gKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqOworICAgICAgICBmaW5hbCBpbnQgY291bnQgPSByb3V0ZXIuZ2V0Um91dGVDb3VudCgpOworICAgICAgICBMaXN0IG91dCA9IG5ldyBBcnJheUxpc3QoY291bnQpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIG91dC5hZGQocm91dGVyLmdldFJvdXRlQXQoaSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvdXQ7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiLCAidW5jaGVja2VkIiB9KQorICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDYXRlZ29yaWVzKE9iamVjdCByb3V0ZXJPYmopIHsKKyAgICAgICAgZmluYWwgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIgPSAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmo7CisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IHJvdXRlci5nZXRDYXRlZ29yeUNvdW50KCk7CisgICAgICAgIExpc3Qgb3V0ID0gbmV3IEFycmF5TGlzdChjb3VudCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgb3V0LmFkZChyb3V0ZXIuZ2V0Q2F0ZWdvcnlBdChpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG91dDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRTZWxlY3RlZFJvdXRlKE9iamVjdCByb3V0ZXJPYmosIGludCB0eXBlKSB7CisgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5nZXRTZWxlY3RlZFJvdXRlKHR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZWxlY3RSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBpbnQgdHlwZXMsIE9iamVjdCByb3V0ZU9iaikgeworICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5zZWxlY3RSb3V0ZSh0eXBlcywKKyAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRDYWxsYmFjayhPYmplY3Qgcm91dGVyT2JqLCBpbnQgdHlwZXMsIE9iamVjdCBjYWxsYmFja09iaikgeworICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5hZGRDYWxsYmFjayh0eXBlcywKKyAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayljYWxsYmFja09iaik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUNhbGxiYWNrKE9iamVjdCByb3V0ZXJPYmosIE9iamVjdCBjYWxsYmFja09iaikgeworICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5yZW1vdmVDYWxsYmFjaygKKyAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayljYWxsYmFja09iaik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlUm91dGVDYXRlZ29yeShPYmplY3Qgcm91dGVyT2JqLAorICAgICAgICAgICAgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNHcm91cGFibGUpIHsKKyAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmopLmNyZWF0ZVJvdXRlQ2F0ZWdvcnkobmFtZSwgaXNHcm91cGFibGUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVVzZXJSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBPYmplY3QgY2F0ZWdvcnlPYmopIHsKKyAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmopLmNyZWF0ZVVzZXJSb3V0ZSgKKyAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUNhdGVnb3J5KWNhdGVnb3J5T2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkVXNlclJvdXRlKE9iamVjdCByb3V0ZXJPYmosIE9iamVjdCByb3V0ZU9iaikgeworICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5hZGRVc2VyUm91dGUoCisgICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVVzZXJSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBPYmplY3Qgcm91dGVPYmopIHsKKyAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikucmVtb3ZlVXNlclJvdXRlKAorICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZUNhbGxiYWNrKENhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIHJldHVybiBuZXcgQ2FsbGJhY2tQcm94eTxDYWxsYmFjaz4oY2FsbGJhY2spOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVZvbHVtZUNhbGxiYWNrKFZvbHVtZUNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIHJldHVybiBuZXcgVm9sdW1lQ2FsbGJhY2tQcm94eTxWb2x1bWVDYWxsYmFjaz4oY2FsbGJhY2spOworICAgIH0KKworICAgIHN0YXRpYyBib29sZWFuIGNoZWNrUm91dGVkVG9CbHVldG9vdGgoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBdWRpb01hbmFnZXIgYXVkaW9NYW5hZ2VyID0gKEF1ZGlvTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKAorICAgICAgICAgICAgICAgICAgICBDb250ZXh0LkFVRElPX1NFUlZJQ0UpOworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGF1ZGlvTWFuYWdlci5nZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kKAorICAgICAgICAgICAgICAgICAgICAiZ2V0RGV2aWNlc0ZvclN0cmVhbSIsIGludC5jbGFzcyk7CisgICAgICAgICAgICBpbnQgZGV2aWNlID0gKEludGVnZXIpIG1ldGhvZC5pbnZva2UoYXVkaW9NYW5hZ2VyLCBBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDKTsKKyAgICAgICAgICAgIHJldHVybiAoZGV2aWNlICYgREVWSUNFX09VVF9CTFVFVE9PVEgpICE9IDA7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlSW5mbyB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ2hhclNlcXVlbmNlIGdldE5hbWUoT2JqZWN0IHJvdXRlT2JqLCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXROYW1lKGNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBDaGFyU2VxdWVuY2UgZ2V0U3RhdHVzKE9iamVjdCByb3V0ZU9iaikgeworICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFN0YXR1cygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0U3VwcG9ydGVkVHlwZXMoT2JqZWN0IHJvdXRlT2JqKSB7CisgICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0U3VwcG9ydGVkVHlwZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldENhdGVnb3J5KE9iamVjdCByb3V0ZU9iaikgeworICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldENhdGVnb3J5KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIERyYXdhYmxlIGdldEljb25EcmF3YWJsZShPYmplY3Qgcm91dGVPYmopIHsKKyAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRJY29uRHJhd2FibGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFBsYXliYWNrVHlwZShPYmplY3Qgcm91dGVPYmopIHsKKyAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRQbGF5YmFja1R5cGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFBsYXliYWNrU3RyZWFtKE9iamVjdCByb3V0ZU9iaikgeworICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFBsYXliYWNrU3RyZWFtKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRWb2x1bWUoT2JqZWN0IHJvdXRlT2JqKSB7CisgICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0Vm9sdW1lKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRWb2x1bWVNYXgoT2JqZWN0IHJvdXRlT2JqKSB7CisgICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0Vm9sdW1lTWF4KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRWb2x1bWVIYW5kbGluZyhPYmplY3Qgcm91dGVPYmopIHsKKyAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRWb2x1bWVIYW5kbGluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0VGFnKE9iamVjdCByb3V0ZU9iaikgeworICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFRhZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFRhZyhPYmplY3Qgcm91dGVPYmosIE9iamVjdCB0YWcpIHsKKyAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLnNldFRhZyh0YWcpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcXVlc3RTZXRWb2x1bWUoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdm9sdW1lKSB7CisgICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5yZXF1ZXN0U2V0Vm9sdW1lKHZvbHVtZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVxdWVzdFVwZGF0ZVZvbHVtZShPYmplY3Qgcm91dGVPYmosIGludCBkaXJlY3Rpb24pIHsKKyAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLnJlcXVlc3RVcGRhdGVWb2x1bWUoZGlyZWN0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEdyb3VwKE9iamVjdCByb3V0ZU9iaikgeworICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldEdyb3VwKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNHcm91cChPYmplY3Qgcm91dGVPYmopIHsKKyAgICAgICAgICAgIHJldHVybiByb3V0ZU9iaiBpbnN0YW5jZW9mIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVHcm91cDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVHcm91cCB7CisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiwgInVuY2hlY2tlZCIgfSkKKyAgICAgICAgcHVibGljIHN0YXRpYyBMaXN0IGdldEdyb3VwZWRSb3V0ZXMoT2JqZWN0IGdyb3VwT2JqKSB7CisgICAgICAgICAgICBmaW5hbCBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlR3JvdXAgZ3JvdXAgPQorICAgICAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUdyb3VwKWdyb3VwT2JqOworICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZ3JvdXAuZ2V0Um91dGVDb3VudCgpOworICAgICAgICAgICAgTGlzdCBvdXQgPSBuZXcgQXJyYXlMaXN0KGNvdW50KTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIG91dC5hZGQoZ3JvdXAuZ2V0Um91dGVBdChpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gb3V0OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBVc2VyUm91dGVJbmZvIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldE5hbWUoT2JqZWN0IHJvdXRlT2JqLCBDaGFyU2VxdWVuY2UgbmFtZSkgeworICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldE5hbWUobmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0U3RhdHVzKE9iamVjdCByb3V0ZU9iaiwgQ2hhclNlcXVlbmNlIHN0YXR1cykgeworICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFN0YXR1cyhzdGF0dXMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEljb25EcmF3YWJsZShPYmplY3Qgcm91dGVPYmosIERyYXdhYmxlIGljb24pIHsKKyAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRJY29uRHJhd2FibGUoaWNvbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UGxheWJhY2tUeXBlKE9iamVjdCByb3V0ZU9iaiwgaW50IHR5cGUpIHsKKyAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRQbGF5YmFja1R5cGUodHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UGxheWJhY2tTdHJlYW0oT2JqZWN0IHJvdXRlT2JqLCBpbnQgc3RyZWFtKSB7CisgICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0UGxheWJhY2tTdHJlYW0oc3RyZWFtKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWb2x1bWUoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdm9sdW1lKSB7CisgICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0Vm9sdW1lKHZvbHVtZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Vm9sdW1lTWF4KE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZU1heCkgeworICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFZvbHVtZU1heCh2b2x1bWVNYXgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZvbHVtZUhhbmRsaW5nKE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZUhhbmRsaW5nKSB7CisgICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0Vm9sdW1lSGFuZGxpbmcodm9sdW1lSGFuZGxpbmcpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZvbHVtZUNhbGxiYWNrKE9iamVjdCByb3V0ZU9iaiwgT2JqZWN0IHZvbHVtZUNhbGxiYWNrT2JqKSB7CisgICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0Vm9sdW1lQ2FsbGJhY2soCisgICAgICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlZvbHVtZUNhbGxiYWNrKXZvbHVtZUNhbGxiYWNrT2JqKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSZW1vdGVDb250cm9sQ2xpZW50KE9iamVjdCByb3V0ZU9iaiwgT2JqZWN0IHJjY09iaikgeworICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFJlbW90ZUNvbnRyb2xDbGllbnQoCisgICAgICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLlJlbW90ZUNvbnRyb2xDbGllbnQpcmNjT2JqKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVDYXRlZ29yeSB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ2hhclNlcXVlbmNlIGdldE5hbWUoT2JqZWN0IGNhdGVnb3J5T2JqLCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVDYXRlZ29yeSljYXRlZ29yeU9iaikuZ2V0TmFtZShjb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiwgInVuY2hlY2tlZCIgfSkKKyAgICAgICAgcHVibGljIHN0YXRpYyBMaXN0IGdldFJvdXRlcyhPYmplY3QgY2F0ZWdvcnlPYmopIHsKKyAgICAgICAgICAgIEFycmF5TGlzdCBvdXQgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVDYXRlZ29yeSljYXRlZ29yeU9iaikuZ2V0Um91dGVzKG91dCk7CisgICAgICAgICAgICByZXR1cm4gb3V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0U3VwcG9ydGVkVHlwZXMoT2JqZWN0IGNhdGVnb3J5T2JqKSB7CisgICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlQ2F0ZWdvcnkpY2F0ZWdvcnlPYmopLmdldFN1cHBvcnRlZFR5cGVzKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNHcm91cGFibGUoT2JqZWN0IGNhdGVnb3J5T2JqKSB7CisgICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlQ2F0ZWdvcnkpY2F0ZWdvcnlPYmopLmlzR3JvdXBhYmxlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBDYWxsYmFjayB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVTZWxlY3RlZChpbnQgdHlwZSwgT2JqZWN0IHJvdXRlT2JqKTsKKyAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuc2VsZWN0ZWQoaW50IHR5cGUsIE9iamVjdCByb3V0ZU9iaik7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChPYmplY3Qgcm91dGVPYmopOworICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChPYmplY3Qgcm91dGVPYmopOworICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChPYmplY3Qgcm91dGVPYmopOworICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlR3JvdXBlZChPYmplY3Qgcm91dGVPYmosIE9iamVjdCBncm91cE9iaiwgaW50IGluZGV4KTsKKyAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuZ3JvdXBlZChPYmplY3Qgcm91dGVPYmosIE9iamVjdCBncm91cE9iaik7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVWb2x1bWVDaGFuZ2VkKE9iamVjdCByb3V0ZU9iaik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVm9sdW1lQ2FsbGJhY2sgeworICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVNldFJlcXVlc3QoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdm9sdW1lKTsKKyAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KE9iamVjdCByb3V0ZU9iaiwgaW50IGRpcmVjdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV29ya2Fyb3VuZCBmb3IgbGltaXRhdGlvbnMgb2Ygc2VsZWN0Um91dGUoKSBvbiBKQiBhbmQgSkIgTVIxLgorICAgICAqIERvIG5vdCB1c2Ugb24gSkIgTVIyIGFuZCBhYm92ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFNlbGVjdFJvdXRlV29ya2Fyb3VuZCB7CisgICAgICAgIHByaXZhdGUgTWV0aG9kIG1TZWxlY3RSb3V0ZUludE1ldGhvZDsKKworICAgICAgICBwdWJsaWMgU2VsZWN0Um91dGVXb3JrYXJvdW5kKCkgeworICAgICAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA8IDE2IHx8IEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+IDE3KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZWxlY3RSb3V0ZUludE1ldGhvZCA9IGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuY2xhc3MuZ2V0TWV0aG9kKAorICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdFJvdXRlSW50IiwgaW50LmNsYXNzLCBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mby5jbGFzcyk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdFJvdXRlKE9iamVjdCByb3V0ZXJPYmosIGludCB0eXBlcywgT2JqZWN0IHJvdXRlT2JqKSB7CisgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciA9IChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iajsKKyAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0KKyAgICAgICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqOworCisgICAgICAgICAgICBpbnQgcm91dGVUeXBlcyA9IHJvdXRlLmdldFN1cHBvcnRlZFR5cGVzKCk7CisgICAgICAgICAgICBpZiAoKHJvdXRlVHlwZXMgJiBST1VURV9UWVBFX1VTRVIpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBIYW5kbGUgbm9uLXVzZXIgcm91dGVzLgorICAgICAgICAgICAgICAgIC8vIE9uIEpCIGFuZCBKQiBNUjEsIHRoZSBzZWxlY3RSb3V0ZSgpIEFQSSBvbmx5IHN1cHBvcnRzIHByb2dyYW1tYXRpY2FsbHkKKyAgICAgICAgICAgICAgICAvLyBzZWxlY3RpbmcgdXNlciByb3V0ZXMuICBTbyBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlIGhpZGRlbiBzZWxlY3RSb3V0ZUludCgpCisgICAgICAgICAgICAgICAgLy8gbWV0aG9kIG9uIHRoZXNlIHZlcnNpb25zIG9mIHRoZSBwbGF0Zm9ybS4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGxpbWl0YXRpb24gd2FzIHJlbW92ZWQgaW4gSkIgTVIyLgorICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0Um91dGVJbnRNZXRob2QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdFJvdXRlSW50TWV0aG9kLmludm9rZShyb3V0ZXIsIHR5cGVzLCByb3V0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIHN1Y2Nlc3MhCisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBwcm9ncmFtbWF0aWNhbGx5IHNlbGVjdCBub24tdXNlciByb3V0ZS4gICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiTWVkaWEgcm91dGluZyBtYXkgbm90IHdvcmsuIiwgZXgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgcHJvZ3JhbW1hdGljYWxseSBzZWxlY3Qgbm9uLXVzZXIgcm91dGUuICAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIk1lZGlhIHJvdXRpbmcgbWF5IG5vdCB3b3JrLiIsIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBwcm9ncmFtbWF0aWNhbGx5IHNlbGVjdCBub24tdXNlciByb3V0ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYmVjYXVzZSB0aGUgcGxhdGZvcm0gaXMgbWlzc2luZyB0aGUgc2VsZWN0Um91dGVJbnQoKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibWV0aG9kLiAgTWVkaWEgcm91dGluZyBtYXkgbm90IHdvcmsuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBEZWZhdWx0IGhhbmRsaW5nLgorICAgICAgICAgICAgcm91dGVyLnNlbGVjdFJvdXRlKHR5cGVzLCByb3V0ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXb3JrYXJvdW5kIHRoZSBmYWN0IHRoYXQgdGhlIGdldERlZmF1bHRSb3V0ZSgpIG1ldGhvZCBkb2VzIG5vdCBleGlzdCBpbiBKQiBhbmQgSkIgTVIxLgorICAgICAqIERvIG5vdCB1c2Ugb24gSkIgTVIyIGFuZCBhYm92ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQgeworICAgICAgICBwcml2YXRlIE1ldGhvZCBtR2V0U3lzdGVtQXVkaW9Sb3V0ZU1ldGhvZDsKKworICAgICAgICBwdWJsaWMgR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZCgpIHsKKyAgICAgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPCAxNiB8fCBCdWlsZC5WRVJTSU9OLlNES19JTlQgPiAxNykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtR2V0U3lzdGVtQXVkaW9Sb3V0ZU1ldGhvZCA9CisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLmNsYXNzLmdldE1ldGhvZCgiZ2V0U3lzdGVtQXVkaW9Sb3V0ZSIpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRSb3V0ZShPYmplY3Qgcm91dGVyT2JqKSB7CisgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciA9IChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iajsKKworICAgICAgICAgICAgaWYgKG1HZXRTeXN0ZW1BdWRpb1JvdXRlTWV0aG9kICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUdldFN5c3RlbUF1ZGlvUm91dGVNZXRob2QuaW52b2tlKHJvdXRlcik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENvdWxkIG5vdCBmaW5kIHRoZSBtZXRob2Qgb3IgaXQgZG9lcyBub3Qgd29yay4KKyAgICAgICAgICAgIC8vIFJldHVybiB0aGUgZmlyc3Qgcm91dGUgYW5kIGhvcGUgZm9yIHRoZSBiZXN0LgorICAgICAgICAgICAgcmV0dXJuIHJvdXRlci5nZXRSb3V0ZUF0KDApOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIENhbGxiYWNrUHJveHk8VCBleHRlbmRzIENhbGxiYWNrPgorICAgICAgICAgICAgZXh0ZW5kcyBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLkNhbGxiYWNrIHsKKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIFQgbUNhbGxiYWNrOworCisgICAgICAgIHB1YmxpYyBDYWxsYmFja1Byb3h5KFQgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVTZWxlY3RlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKKyAgICAgICAgICAgICAgICBpbnQgdHlwZSwgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKKyAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlU2VsZWN0ZWQodHlwZSwgcm91dGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAorICAgICAgICAgICAgICAgIGludCB0eXBlLCBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgeworICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVVbnNlbGVjdGVkKHR5cGUsIHJvdXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQWRkZWQoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIsCisgICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKKyAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlQWRkZWQocm91dGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVSZW1vdmVkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAorICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZVJlbW92ZWQocm91dGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVDaGFuZ2VkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAorICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZUNoYW5nZWQocm91dGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVHcm91cGVkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAorICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlLAorICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVHcm91cCBncm91cCwgaW50IGluZGV4KSB7CisgICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZUdyb3VwZWQocm91dGUsIGdyb3VwLCBpbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuZ3JvdXBlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKKyAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSwKKyAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlR3JvdXAgZ3JvdXApIHsKKyAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlVW5ncm91cGVkKHJvdXRlLCBncm91cCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVZvbHVtZUNoYW5nZWQoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIsCisgICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKKyAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlVm9sdW1lQ2hhbmdlZChyb3V0ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgVm9sdW1lQ2FsbGJhY2tQcm94eTxUIGV4dGVuZHMgVm9sdW1lQ2FsbGJhY2s+CisgICAgICAgICAgICBleHRlbmRzIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVm9sdW1lQ2FsbGJhY2sgeworICAgICAgICBwcm90ZWN0ZWQgZmluYWwgVCBtQ2FsbGJhY2s7CisKKyAgICAgICAgcHVibGljIFZvbHVtZUNhbGxiYWNrUHJveHkoVCBjYWxsYmFjaykgeworICAgICAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVTZXRSZXF1ZXN0KGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlLAorICAgICAgICAgICAgICAgIGludCB2b2x1bWUpIHsKKyAgICAgICAgICAgIG1DYWxsYmFjay5vblZvbHVtZVNldFJlcXVlc3Qocm91dGUsIHZvbHVtZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlLAorICAgICAgICAgICAgICAgIGludCBkaXJlY3Rpb24pIHsKKyAgICAgICAgICAgIG1DYWxsYmFjay5vblZvbHVtZVVwZGF0ZVJlcXVlc3Qocm91dGUsIGRpcmVjdGlvbik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFDb250cm9sSW50ZW50LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFDb250cm9sSW50ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ5ZTc3NwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYUNvbnRyb2xJbnRlbnQuamF2YQpAQCAtMCwwICsxLDEyMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CisKKy8qKgorICogQ29uc3RhbnRzIGZvciBtZWRpYSBjb250cm9sIGludGVudHMuCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgZGVjbGFyZXMgYSBzZXQgb2Ygc3RhbmRhcmQgbWVkaWEgY29udHJvbCBpbnRlbnQgY2F0ZWdvcmllcyBhbmQgYWN0aW9ucyB0aGF0CisgKiBhcHBsaWNhdGlvbnMgY2FuIHVzZSB0byBpZGVudGlmeSB0aGUgY2FwYWJpbGl0aWVzIG9mIG1lZGlhIHJvdXRlcyBhbmQgY29udHJvbCB0aGVtLgorICogPC9wPgorICoKKyAqIDxoMz5NZWRpYSBjb250cm9sIGludGVudCBjYXRlZ29yaWVzPC9oMz4KKyAqIDxwPgorICogTWVkaWEgY29udHJvbCBpbnRlbnQgY2F0ZWdvcmllcyBzcGVjaWZ5IG1lYW5zIGJ5IHdoaWNoIGFwcGxpY2F0aW9ucyBjYW4KKyAqIHNlbmQgbWVkaWEgdG8gdGhlIGRlc3RpbmF0aW9uIG9mIGEgbWVkaWEgcm91dGUuICBDYXRlZ29yaWVzIGFyZSBzb21ldGltZXMgcmVmZXJyZWQKKyAqIHRvIGFzIGRlc2NyaWJpbmcgInR5cGVzIiBvciAia2luZHMiIG9mIHJvdXRlcy4KKyAqIDwvcD48cD4KKyAqIEZvciBleGFtcGxlLCBpZiBhIHJvdXRlIHN1cHBvcnRzIHRoZSB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2sgY2F0ZWdvcnl9LAorICogdGhlbiBhbiBhcHBsaWNhdGlvbiBjYW4gYXNrIGl0IHRvIHBsYXkgbWVkaWEgcmVtb3RlbHkgYnkgc2VuZGluZyBhCisgKiB7QGxpbmsgI0FDVElPTl9QTEFZIHBsYXl9IG9yIHtAbGluayAjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0gaW50ZW50IHdpdGggdGhlIFVyaSBvZiB0aGUKKyAqIG1lZGlhIGNvbnRlbnQgdG8gcGxheS4gIFN1Y2ggYSByb3V0ZSBtYXkgdGhlbiBiZSByZWZlcnJlZCB0byBhcworICogYSAicmVtb3RlIHBsYXliYWNrIHJvdXRlIiBiZWNhdXNlIGl0IHN1cHBvcnRzIHJlbW90ZSBwbGF5YmFjayByZXF1ZXN0cy4gIEl0IGlzIGNvbW1vbgorICogZm9yIGEgcm91dGUgdG8gc3VwcG9ydCBtdWx0aXBsZSBjYXRlZ29yaWVzIG9mIHJlcXVlc3RzIGF0IHRoZSBzYW1lIHRpbWUsIHN1Y2ggYXMKKyAqIGxpdmUgYXVkaW8gYW5kIGxpdmUgdmlkZW8uCisgKiA8L3A+PHA+CisgKiBUaGUgZm9sbG93aW5nIHN0YW5kYXJkIHJvdXRlIGNhdGVnb3JpZXMgYXJlIGRlZmluZWQuCisgKiA8L3A+PHVsPgorICogPGxpPntAbGluayAjQ0FURUdPUllfTElWRV9BVURJTyBMaXZlIGF1ZGlvfTogVGhlIHJvdXRlIHN1cHBvcnRzIHN0cmVhbWluZyBsaXZlIGF1ZGlvCisgKiBmcm9tIHRoZSBkZXZpY2UgdG8gdGhlIGRlc3RpbmF0aW9uLiAgTGl2ZSBhdWRpbyByb3V0ZXMgaW5jbHVkZSBsb2NhbCBzcGVha2VycworICogYW5kIEJsdWV0b290aCBoZWFkc2V0cy4KKyAqIDxsaT57QGxpbmsgI0NBVEVHT1JZX0xJVkVfVklERU8gTGl2ZSB2aWRlb306IFRoZSByb3V0ZSBzdXBwb3J0cyBzdHJlYW1pbmcgbGl2ZSB2aWRlbworICogZnJvbSB0aGUgZGV2aWNlIHRvIHRoZSBkZXN0aW5hdGlvbi4gIExpdmUgdmlkZW8gcm91dGVzIGluY2x1ZGUgbG9jYWwgZGlzcGxheXMKKyAqIGFuZCB3aXJlbGVzcyBkaXNwbGF5cyB0aGF0IHN1cHBvcnQgbWlycm9yaW5nIGFuZAorICoge0BsaW5rIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbiBwcmVzZW50YXRpb25zfS4gIExpdmUgdmlkZW8gcm91dGVzIHR5cGljYWxseSBhbHNvCisgKiBzdXBwb3J0IGxpdmUgYXVkaW8gY2FwYWJpbGl0aWVzLgorICogPGxpPntAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIFJlbW90ZSBwbGF5YmFja306IFRoZSByb3V0ZSBzdXBwb3J0cyBzZW5kaW5nCisgKiByZW1vdGUgcGxheWJhY2sgcmVxdWVzdHMgZm9yIG1lZGlhIGNvbnRlbnQgdG8gdGhlIGRlc3RpbmF0aW9uLiAgVGhlIGNvbnRlbnQgdG8gYmUKKyAqIHBsYXllZCBpcyBpZGVudGlmaWVkIGJ5IGEgVXJpIGFuZCBtaW1lLXR5cGUuCisgKiA8L3VsPjxwPgorICogTWVkaWEgcm91dGUgcHJvdmlkZXJzIG1heSBkZWZpbmUgY3VzdG9tIG1lZGlhIGNvbnRyb2wgaW50ZW50IGNhdGVnb3JpZXMgb2YgdGhlaXIgb3duIGluCisgKiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgb25lcy4gIEN1c3RvbSBjYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgYSB2YXJpZXR5CisgKiBvZiBmZWF0dXJlcyB0byBhcHBsaWNhdGlvbnMgdGhhdCByZWNvZ25pemUgYW5kIGtub3cgaG93IHRvIHVzZSB0aGVtLiAgRm9yIGV4YW1wbGUsCisgKiBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIG1pZ2h0IGRlZmluZSBhIGN1c3RvbSBjYXRlZ29yeSB0byBpbmRpY2F0ZSB0aGF0IGl0cyByb3V0ZXMKKyAqIHN1cHBvcnQgYSBzcGVjaWFsIGRldmljZS1zcGVjaWZpYyBjb250cm9sIGludGVyZmFjZSBpbiBhZGRpdGlvbiB0byBvdGhlcgorICogc3RhbmRhcmQgZmVhdHVyZXMuCisgKiA8L3A+PHA+CisgKiBBcHBsaWNhdGlvbnMgY2FuIGRldGVybWluZSB3aGljaCBjYXRlZ29yaWVzIGEgcm91dGUgc3VwcG9ydHMgYnkgdXNpbmcgdGhlCisgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3N1cHBvcnRzQ29udHJvbENhdGVnb3J5IE1lZGlhUm91dGVyLlJvdXRlSW5mby5zdXBwb3J0c0NvbnRyb2xDYXRlZ29yeX0KKyAqIG9yIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jZ2V0Q29udHJvbEZpbHRlcnMgTWVkaWFSb3V0ZXIuUm91dGVJbmZvLmdldENvbnRyb2xGaWx0ZXJzfQorICogbWV0aG9kcy4gIEFwcGxpY2F0aW9ucyBjYW4gYWxzbyBzcGVjaWZ5IHRoZSB0eXBlcyBvZiByb3V0ZXMgdGhhdCB0aGV5IHdhbnQgdG8gdXNlIGJ5CisgKiBjcmVhdGluZyB7QGxpbmsgTWVkaWFSb3V0ZVNlbGVjdG9yIG1lZGlhIHJvdXRlIHNlbGVjdG9yc30gdGhhdCBjb250YWluIHRoZSBkZXNpcmVkCisgKiBjYXRlZ29yaWVzIGFuZCBhcmUgdXNlZCB0byBmaWx0ZXIgcm91dGVzIGluIHNldmVyYWwgcGFydHMgb2YgdGhlIG1lZGlhIHJvdXRlciBBUEkuCisgKiA8L3A+CisgKgorICogPGgzPk1lZGlhIGNvbnRyb2wgaW50ZW50IGFjdGlvbnM8L2gzPgorICogPHA+CisgKiBNZWRpYSBjb250cm9sIGludGVudCBhY3Rpb25zIHNwZWNpZnkgcGFydGljdWxhciBmdW5jdGlvbnMgdGhhdCBhcHBsaWNhdGlvbnMKKyAqIGNhbiBhc2sgdGhlIGRlc3RpbmF0aW9uIG9mIGEgbWVkaWEgcm91dGUgdG8gcGVyZm9ybS4gIE1lZGlhIHJvdXRlIGNvbnRyb2wgcmVxdWVzdHMKKyAqIHRha2UgdGhlIGZvcm0gb2YgaW50ZW50cyBpbiBhIHNpbWlsYXIgbWFubmVyIHRvIG90aGVyIGludGVudHMgdXNlZCB0byBzdGFydCBhY3Rpdml0aWVzCisgKiBvciBzZW5kIGJyb2FkY2FzdHMuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IG1lZGlhIGNvbnRyb2wgaW50ZW50cyBhcmUgZGlyZWN0ZWQgdG8KKyAqIHJvdXRlcyByYXRoZXIgdGhhbiBhY3Rpdml0eSBvciBicm9hZGNhc3QgcmVjZWl2ZXIgY29tcG9uZW50cy4KKyAqIDwvcD48cD4KKyAqIEVhY2ggbWVkaWEgcm91dGUgY29udHJvbCBpbnRlbnQgc3BlY2lmaWVzIGFuIGFjdGlvbiwgYSBjYXRlZ29yeSBhbmQgc29tZSBudW1iZXIgb2YgcGFyYW1ldGVycworICogdGhhdCBhcmUgc3VwcGxpZWQgYXMgZXh0cmFzLiAgQXBwbGljYXRpb25zIHNlbmQgbWVkaWEgY29udHJvbCByZXF1ZXN0cyB0byByb3V0ZXMgdXNpbmcgdGhlCisgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uc2VuZENvbnRyb2xSZXF1ZXN0fQorICogbWV0aG9kIGFuZCByZWNlaXZlIHJlc3VsdHMgdmlhIGEgY2FsbGJhY2suCisgKiA8L3A+PHA+CisgKiBBbGwgbWVkaWEgY29udHJvbCBpbnRlbnQgYWN0aW9ucyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZWRpYSBjb250cm9sIGludGVudCBjYXRlZ29yaWVzCisgKiB0aGF0IHN1cHBvcnQgdGhlbS4gIFRodXMgb25seSByZW1vdGUgcGxheWJhY2sgcm91dGVzIG1heSBwZXJmb3JtIHJlbW90ZSBwbGF5YmFjayBhY3Rpb25zLgorICogVGhlIGRvY3VtZW50YXRpb24gb2YgZWFjaCBhY3Rpb24gc3BlY2lmaWVzIHRoZSBjYXRlZ29yeSB0byB3aGljaCB0aGUgYWN0aW9uIGJlbG9uZ3MsCisgKiB0aGUgcGFyYW1ldGVycyBpdCByZXF1aXJlcywgYW5kIHRoZSByZXN1bHRzIGl0IHJldHVybnMuCisgKiA8L3A+CisgKgorICogPGgzPkxpdmUgYXVkaW8gYW5kIGxpdmUgdmlkZW8gcm91dGVzPC9oMz4KKyAqIDxwPgorICoge0BsaW5rICNDQVRFR09SWV9MSVZFX0FVRElPIExpdmUgYXVkaW99IGFuZCB7QGxpbmsgI0NBVEVHT1JZX0xJVkVfVklERU8gbGl2ZSB2aWRlb30KKyAqIHJvdXRlcyBwcmVzZW50IG1lZGlhIHVzaW5nIHN0YW5kYXJkIHN5c3RlbSBpbnRlcmZhY2VzIHN1Y2ggYXMgYXVkaW8gc3RyZWFtcywKKyAqIHtAbGluayBhbmRyb2lkLmFwcC5QcmVzZW50YXRpb24gcHJlc2VudGF0aW9uc30gb3IgZGlzcGxheSBtaXJyb3JpbmcuICBUaGVzZSByb3V0ZXMgYXJlCisgKiB0aGUgZWFzaWVzdCB0byB1c2UgYmVjYXVzZSBhcHBsaWNhdGlvbnMgc2ltcGx5IHJlbmRlciBjb250ZW50IGxvY2FsbHkgb24gdGhlIGRldmljZQorICogYW5kIHRoZSBzeXN0ZW0gc3RyZWFtcyBpdCB0byB0aGUgcm91dGUgZGVzdGluYXRpb24gYXV0b21hdGljYWxseS4KKyAqIDwvcD48cD4KKyAqIEluIG1vc3QgY2FzZXMsIGFwcGxpY2F0aW9ucyBjYW4gc3RyZWFtIGNvbnRlbnQgdG8gbGl2ZSBhdWRpbyBhbmQgbGl2ZSB2aWRlbyByb3V0ZXMgaW4KKyAqIHRoZSBzYW1lIHdheSB0aGV5IHdvdWxkIHBsYXkgdGhlIGNvbnRlbnQgbG9jYWxseSB3aXRob3V0IGFueSBtb2RpZmljYXRpb24uICBIb3dldmVyLAorICogYXBwbGljYXRpb25zIG1heSBhbHNvIGJlIGFibGUgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgbW9yZSBzb3BoaXN0aWNhdGVkIGZlYXR1cmVzIHN1Y2gKKyAqIGFzIHNlY29uZC1zY3JlZW4gcHJlc2VudGF0aW9uIEFQSXMgdGhhdCBhcmUgcGFydGljdWxhciB0byB0aGVzZSByb3V0ZXMuCisgKiA8L3A+CisgKgorICogPGgzPlJlbW90ZSBwbGF5YmFjayByb3V0ZXM8L2gzPgorICogPHA+CisgKiB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyBSZW1vdGUgcGxheWJhY2t9IHJvdXRlcyBwcmVzZW50IG1lZGlhIHJlbW90ZWx5CisgKiBieSBwbGF5aW5nIGNvbnRlbnQgZnJvbSBhIFVyaS4KKyAqIFRoZXNlIHJvdXRlcyBkZXN0aW5hdGlvbnMgdGFrZSByZXNwb25zaWJpbGl0eSBmb3IgZmV0Y2hpbmcgYW5kIHJlbmRlcmluZyBjb250ZW50CisgKiBvbiB0aGVpciBvd24uICBBcHBsaWNhdGlvbnMgZG8gbm90IHJlbmRlciB0aGUgY29udGVudCB0aGVtc2VsdmVzOyBpbnN0ZWFkLCBhcHBsaWNhdGlvbnMKKyAqIHNlbmQgY29udHJvbCByZXF1ZXN0cyB0byBpbml0aWF0ZSBwbGF5LCBwYXVzZSwgcmVzdW1lLCBvciBzdG9wIG1lZGlhIGl0ZW1zIGFuZCByZWNlaXZlCisgKiBzdGF0dXMgdXBkYXRlcyBhcyB0aGV5IGNoYW5nZSBzdGF0ZS4KKyAqIDwvcD4KKyAqCisgKiA8aDQ+U2Vzc2lvbnM8L2g0PgorICogPHA+CisgKiBFYWNoIHJlbW90ZSBtZWRpYSBwbGF5YmFjayBhY3Rpb24gaXMgY29uZHVjdGVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYSBzZXNzaW9uLgorICogU2Vzc2lvbnMgYXJlIHVzZWQgdG8gcHJldmVudCBhcHBsaWNhdGlvbnMgZnJvbSBhY2NpZGVudGFsbHkgaW50ZXJmZXJpbmcgd2l0aCBvbmUKKyAqIGFub3RoZXIgYmVjYXVzZSBhdCBtb3N0IG9uZSBzZXNzaW9uIGNhbiBiZSB2YWxpZCBhdCBhIHRpbWUuCisgKiA8L3A+PHA+CisgKiBBIHNlc3Npb24gY2FuIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIHtAbGluayAjQUNUSU9OX1NUQVJUX1NFU1NJT04gc3RhcnQgc2Vzc2lvbiBhY3Rpb259CisgKiBhbmQgdGVybWluYXRlZCB1c2luZyB0aGUge0BsaW5rICNBQ1RJT05fRU5EX1NFU1NJT04gZW5kIHNlc3Npb24gYWN0aW9ufSB3aGVuIHRoZQorICogcm91dGUgcHJvdmlkZXMgZXhwbGljaXQgc2Vzc2lvbiBtYW5hZ2VtZW50IGZlYXR1cmVzLgorICogPC9wPjxwPgorICogRXhwbGljaXQgc2Vzc2lvbiBtYW5hZ2VtZW50IHdhcyBhZGRlZCBpbiBhIGxhdGVyIHJldmlzaW9uIG9mIHRoZSBwcm90b2NvbCBzbyBub3QKKyAqIGFsbCByb3V0ZXMgc3VwcG9ydCBpdC4gIElmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IGV4cGxpY2l0IHNlc3Npb24gbWFuYWdlbWVudAorICogdGhlbiBpbXBsaWNpdCBzZXNzaW9uIG1hbmFnZW1lbnQgbWF5IHN0aWxsIGJlIHVzZWQuICBJbXBsaWNpdCBzZXNzaW9uIG1hbmFnZW1lbnQKKyAqIHJlbGllcyBvbiB0aGUgdXNlIG9mIHRoZSB7QGxpbmsgI0FDVElPTl9QTEFZIHBsYXl9IGFuZCB7QGxpbmsgI0FDVElPTl9FTlFVRVVFIGVucXVldWV9CisgKiBhY3Rpb25zIHdoaWNoIGhhdmUgdGhlIHNpZGUtZWZmZWN0IG9mIGNyZWF0aW5nIGEgbmV3IHNlc3Npb24gaWYgbm9uZSBpcyBwcm92aWRlZAorICogYXMgYXJndW1lbnQuCisgKiA8L3A+PHA+CisgKiBXaGVuIGEgbmV3IHNlc3Npb24gaXMgY3JlYXRlZCwgdGhlIHByZXZpb3VzIHNlc3Npb24gaXMgaW52YWxpZGF0ZWQgYW5kIGFueSBvbmdvaW5nCisgKiBtZWRpYSBwbGF5YmFjayBpcyBzdG9wcGVkIGJlZm9yZSB0aGUgcmVxdWVzdGVkIGFjdGlvbiBpcyBwZXJmb3JtZWQuICBBbnkgYXR0ZW1wdAorICogdG8gdXNlIGFuIGludmFsaWRhdGVkIHNlc3Npb24gd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuICAoUHJvdG9jb2wgaW1wbGVtZW50YXRpb25zCisgKiBhcmUgZW5jb3VyYWdlZCB0byBhZ2dyZXNzaXZlbHkgZGlzY2FyZCBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggaW52YWxpZGF0ZWQgc2Vzc2lvbnMKKyAqIHNpbmNlIGl0IGlzIG5vIGxvbmdlciBvZiB1c2UuKQorICogPC9wPjxwPgorICogRWFjaCBzZXNzaW9uIGlzIGlkZW50aWZpZWQgYnkgYSB1bmlxdWUgc2Vzc2lvbiBpZCB0aGF0IG1heSBiZSB1c2VkIHRvIGNvbnRyb2wKKyAqIHRoZSBzZXNzaW9uIHVzaW5nIGFjdGlvbnMgc3VjaCBhcyBwYXVzZSwgcmVzdW1lLCBzdG9wIGFuZCBlbmQgc2Vzc2lvbi4KKyAqIDwvcD4KKyAqCisgKiA8aDQ+TWVkaWEgaXRlbXM8L2g0PgorICogPHA+CisgKiBFYWNoIHN1Y2Nlc3NmdWwge0BsaW5rICNBQ1RJT05fUExBWSBwbGF5fSBvciB7QGxpbmsgI0FDVElPTl9FTlFVRVVFIGVucXVldWV9IGFjdGlvbgorICogcmV0dXJucyBhIHVuaXF1ZSBtZWRpYSBpdGVtIGlkIHRoYXQgYW4gYXBwbGljYXRpb24gY2FuIHVzZSB0byBtb25pdG9yIGFuZCBjb250cm9sCisgKiBwbGF5YmFjay4gIFRoZSBtZWRpYSBpdGVtIGlkIG1heSBiZSBwYXNzZWQgdG8gb3RoZXIgYWN0aW9ucyBzdWNoIGFzCisgKiB7QGxpbmsgI0FDVElPTl9TRUVLIHNlZWt9IG9yIHtAbGluayAjQUNUSU9OX0dFVF9TVEFUVVMgZ2V0IHN0YXR1c30uICBJdCB3aWxsIGFsc28gYXBwZWFyCisgKiBhcyBhIHBhcmFtZXRlciBpbiBzdGF0dXMgdXBkYXRlIGJyb2FkY2FzdHMgdG8gaWRlbnRpZnkgdGhlIGFzc29jaWF0ZWQgcGxheWJhY2sgcmVxdWVzdC4KKyAqIDwvcD48cD4KKyAqIEVhY2ggbWVkaWEgaXRlbSBpcyBzY29wZWQgdG8gdGhlIHNlc3Npb24gaW4gd2hpY2ggaXQgd2FzIGNyZWF0ZWQuICBUaGVyZWZvcmUgbWVkaWEgaXRlbQorICogaWRzIGFyZSBvbmx5IGV2ZXIgdXNlZCB0b2dldGhlciB3aXRoIHNlc3Npb24gaWRzLiAgTWVkaWEgaXRlbSBpZHMgYXJlIG1lYW5pbmdsZXNzCisgKiBvbiB0aGVpciBvd24uICBXaGVuIHRoZSBzZXNzaW9uIGlzIGludmFsaWRhdGVkLCBhbGwgb2YgaXRzIG1lZGlhIGl0ZW1zIGFyZSBhbHNvCisgKiBpbnZhbGlkYXRlZC4KKyAqIDwvcD4KKyAqCisgKiA8aDQ+VGhlIHBsYXliYWNrIHF1ZXVlPC9oND4KKyAqIDxwPgorICogRWFjaCBzZXNzaW9uIGhhcyBpdHMgb3duIHBsYXliYWNrIHF1ZXVlIHRoYXQgY29uc2lzdHMgb2YgdGhlIG1lZGlhIGl0ZW1zIHRoYXQKKyAqIGFyZSBwZW5kaW5nLCBwbGF5aW5nLCBidWZmZXJpbmcgb3IgcGF1c2VkLiAgSXRlbXMgYXJlIGFkZGVkIHRvIHRoZSBxdWV1ZSB3aGVuCisgKiBhIHBsYXliYWNrIHJlcXVlc3QgaXMgaXNzdWVkLiAgSXRlbXMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcXVldWUgd2hlbiB0aGV5IGFyZSBubworICogbG9uZ2VyIGVsaWdpYmxlIGZvciBwbGF5YmFjayAoZW50ZXIgdGVybWluYWwgc3RhdGVzKS4KKyAqIDwvcD48cD4KKyAqIEFzIGRlc2NyaWJlZCBpbiB0aGUge0BsaW5rIE1lZGlhSXRlbVN0YXR1c30gY2xhc3MsIG1lZGlhIGl0ZW1zIGluaXRpYWxseQorICogc3RhcnQgaW4gYSBwZW5kaW5nIHN0YXRlLCB0cmFuc2l0aW9uIHRvIHRoZSBwbGF5aW5nIChvciBidWZmZXJpbmcgb3IgcGF1c2VkKSBzdGF0ZQorICogZHVyaW5nIHBsYXliYWNrLCBhbmQgZW5kIGluIGEgZmluaXNoZWQsIGNhbmNlbGVkLCBpbnZhbGlkYXRlZCBvciBlcnJvciBzdGF0ZS4KKyAqIE9uY2UgdGhlIGN1cnJlbnQgaXRlbSBlbnRlcnMgYSB0ZXJtaW5hbCBzdGF0ZSwgcGxheWJhY2sgcHJvY2VlZHMgb24gdG8gdGhlCisgKiBuZXh0IGl0ZW0uCisgKiA8L3A+PHA+CisgKiBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGRldGVybWluZSB3aGV0aGVyIHRoZSByb3V0ZSBzdXBwb3J0cyBxdWV1aW5nIGJ5IGNoZWNraW5nCisgKiB3aGV0aGVyIHRoZSB7QGxpbmsgI0FDVElPTl9FTlFVRVVFfSBhY3Rpb24gaXMgZGVjbGFyZWQgaW4gdGhlIHJvdXRlJ3MgY29udHJvbCBmaWx0ZXIKKyAqIHVzaW5nIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc3VwcG9ydHNDb250cm9sUmVxdWVzdCBSb3V0ZUluZm8uc3VwcG9ydHNDb250cm9sUmVxdWVzdH0uCisgKiA8L3A+PHA+CisgKiBJZiB0aGUge0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gYWN0aW9uIGlzIHN1cHBvcnRlZCBieSB0aGUgcm91dGUsIHRoZW4gdGhlIHJvdXRlIHByb21pc2VzCisgKiB0byBhbGxvdyBhdCBsZWFzdCB0d28gaXRlbXMgKHBvc3NpYmx5IG1vcmUpIHRvIGJlIGVucXVldWVkIGF0IGEgdGltZS4gIEVucXVldWVkIGl0ZW1zIHBsYXkKKyAqIGJhY2sgdG8gYmFjayBvbmUgYWZ0ZXIgdGhlIG90aGVyIGFzIHRoZSBwcmV2aW91cyBpdGVtIGNvbXBsZXRlcy4gIElkZWFsbHkgdGhlcmUgc2hvdWxkCisgKiBiZSBubyBhdWRpYmxlIHBhdXNlIGJldHdlZW4gaXRlbXMgZm9yIHN0YW5kYXJkIGF1ZGlvIGNvbnRlbnQgdHlwZXMuCisgKiA8L3A+PHA+CisgKiBJZiB0aGUge0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gYWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHJvdXRlLCB0aGVuIHRoZSBxdWV1ZQorICogZWZmZWN0aXZlbHkgY29udGFpbnMgYXQgbW9zdCBvbmUgaXRlbSBhdCBhIHRpbWUuICBFYWNoIHBsYXkgYWN0aW9uIGhhcyB0aGUgZWZmZWN0IG9mCisgKiBjbGVhcmluZyB0aGUgcXVldWUgYW5kIHJlc2V0dGluZyBpdHMgc3RhdGUgYmVmb3JlIHRoZSBuZXh0IGl0ZW0gaXMgcGxheWVkLgorICogPC9wPgorICoKKyAqIDxoND5JbXBhY3Qgb2YgcGF1c2UsIHJlc3VtZSwgc3RvcCBhbmQgcGxheSBhY3Rpb25zIG9uIHRoZSBwbGF5YmFjayBxdWV1ZTwvaDQ+CisgKiA8cD4KKyAqIFRoZSBwYXVzZSwgcmVzdW1lIGFuZCBzdG9wIGFjdGlvbnMgYWZmZWN0IHRoZSBzZXNzaW9uJ3Mgd2hvbGUgcXVldWUuICBQYXVzZSBjYXVzZXMKKyAqIHRoZSBwbGF5YmFjayBxdWV1ZSB0byBiZSBzdXNwZW5kZWQgbm8gbWF0dGVyIHdoaWNoIGl0ZW0gaXMgY3VycmVudGx5IHBsYXlpbmcuCisgKiBSZXN1bWUgcmV2ZXJzZXMgdGhlIGVmZmVjdHMgb2YgcGF1c2UuICBTdG9wIGNsZWFycyB0aGUgcXVldWUgYW5kIGFsc28gcmVzZXRzCisgKiB0aGUgcGF1c2UgZmxhZyBqdXN0IGxpa2UgcmVzdW1lLgorICogPC9wPjxwPgorICogQXMgZGVzY3JpYmVkIGVhcmxpZXIsIHRoZSBwbGF5IGFjdGlvbiBoYXMgdGhlIGVmZmVjdCBvZiBjbGVhcmluZyB0aGUgcXVldWUKKyAqIGFuZCBjb21wbGV0ZWx5IHJlc2V0dGluZyBpdHMgc3RhdGUgKGxpa2UgdGhlIHN0b3AgYWN0aW9uKSB0aGVuIGVucXVldWluZyBhCisgKiBuZXcgbWVkaWEgaXRlbSB0byBiZSBwbGF5ZWQgaW1tZWRpYXRlbHkuICBQbGF5IGlzIHRoZXJlZm9yZSBlcXVpdmFsZW50CisgKiB0byBzdG9wIGZvbGxvd2VkIGJ5IGFuIGFjdGlvbiB0byBlbnF1ZXVlIGFuIGl0ZW0uCisgKiA8L3A+PHA+CisgKiBUaGUgcGxheSBhY3Rpb24gaXMgYWxzbyBzcGVjaWFsIGluIHRoYXQgaXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIG5ldyBzZXNzaW9ucy4KKyAqIEFuIGFwcGxpY2F0aW9uIHdpdGggc2ltcGxlIG5lZWRzIG1heSBmaW5kIHRoYXQgaXQgb25seSBuZWVkcyB0byB1c2UgcGxheQorICogKGFuZCBvY2Nhc2lvbmFsbHkgc3RvcCkgdG8gY29udHJvbCBwbGF5YmFjay4KKyAqIDwvcD4KKyAqCisgKiA8aDQ+UmVzb2x2aW5nIGNvbmZsaWN0cyBiZXR3ZWVuIGFwcGxpY2F0aW9uczwvaDQ+CisgKiA8cD4KKyAqIFdoZW4gYW4gYXBwbGljYXRpb24gaGFzIGEgdmFsaWQgc2Vzc2lvbiwgaXQgaXMgZXNzZW50aWFsbHkgaW4gY29udHJvbCBvZiByZW1vdGUgcGxheWJhY2sKKyAqIG9uIHRoZSByb3V0ZS4gIE5vIG90aGVyIGFwcGxpY2F0aW9uIGNhbiB2aWV3IG9yIG1vZGlmeSB0aGUgcmVtb3RlIHBsYXliYWNrIHN0YXRlCisgKiBvZiB0aGF0IGFwcGxpY2F0aW9uJ3Mgc2Vzc2lvbiB3aXRob3V0IGtub3dpbmcgaXRzIGlkLgorICogPC9wPjxwPgorICogSG93ZXZlciwgb3RoZXIgYXBwbGljYXRpb25zIGNhbiBwZXJmb3JtIGFjdGlvbnMgdGhhdCBoYXZlIHRoZSBlZmZlY3Qgb2Ygc3RvcHBpbmcKKyAqIHBsYXliYWNrIGFuZCBpbnZhbGlkYXRpbmcgdGhlIGN1cnJlbnQgc2Vzc2lvbi4gIFdoZW4gdGhpcyBvY2N1cnMsIHRoZSBmb3JtZXIgYXBwbGljYXRpb24KKyAqIHdpbGwgYmUgaW5mb3JtZWQgdGhhdCBpdCBoYXMgbG9zdCBjb250cm9sIGJ5IHdheSBvZiBpbmRpdmlkdWFsIG1lZGlhIGl0ZW0gc3RhdHVzCisgKiB1cGRhdGUgYnJvYWRjYXN0cyB0aGF0IGluZGljYXRlIHRoYXQgaXRzIHF1ZXVlZCBtZWRpYSBpdGVtcyBoYXZlIGJlY29tZQorICoge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyNQTEFZQkFDS19TVEFURV9JTlZBTElEQVRFRCBpbnZhbGlkYXRlZH0uICBUaGlzIGJyb2FkY2FzdAorICogaW1wbGllcyB0aGF0IHBsYXliYWNrIHdhcyB0ZXJtaW5hdGVkIGFibm9ybWFsbHkgYnkgYW4gZXh0ZXJuYWwgY2F1c2UuCisgKiA8L3A+PHA+CisgKiBBcHBsaWNhdGlvbnMgc2hvdWxkIGhhbmRsZSBjb25mbGljdHMgY29uc2VydmF0aXZlbHkgdG8gYWxsb3cgb3RoZXIgYXBwbGljYXRpb25zIHRvCisgKiBzbW9vdGhseSBhc3N1bWUgY29udHJvbCBvdmVyIHRoZSByb3V0ZS4gIFdoZW4gYSBjb25mbGljdCBvY2N1cnMsIHRoZSBjdXJyZW50bHkgcGxheWluZworICogYXBwbGljYXRpb24gc2hvdWxkIHJlbGVhc2UgaXRzIHNlc3Npb24gYW5kIGFsbG93IHRoZSBuZXcgYXBwbGljYXRpb24gdG8gdXNlIHRoZQorICogcm91dGUgdW50aWwgc3VjaCB0aW1lIGFzIHRoZSB1c2VyIGludGVydmVuZXMgdG8gdGFrZSBvdmVyIHRoZSByb3V0ZSBhZ2FpbiBhbmQgYmVnaW4KKyAqIGEgbmV3IHBsYXliYWNrIHNlc3Npb24uCisgKiA8L3A+CisgKgorICogPGg0PkJhc2ljIGFjdGlvbnM8L2g0PgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGJhc2ljIGFjdGlvbnMgbXVzdCBiZSBzdXBwb3J0ZWQgKGFsbCBvciBub3RoaW5nKSBieSBhbGwgcmVtb3RlCisgKiBwbGF5YmFjayByb3V0ZXMuICBUaGVzZSBhY3Rpb25zIGZvcm0gdGhlIGJhc2lzIG9mIHRoZSByZW1vdGUgcGxheWJhY2sgcHJvdG9jb2wKKyAqIGFuZCBhcmUgcmVxdWlyZWQgaW4gYWxsIGltcGxlbWVudGF0aW9ucy4KKyAqIDwvcD48dWw+CisgKiA8bGk+e0BsaW5rICNBQ1RJT05fUExBWSBQbGF5fTogU3RhcnRzIHBsYXlpbmcgY29udGVudCBzcGVjaWZpZWQgYnkgYSBnaXZlbiBVcmkKKyAqIGFuZCByZXR1cm5zIGEgbmV3IG1lZGlhIGl0ZW0gaWQgdG8gZGVzY3JpYmUgdGhlIHJlcXVlc3QuICBJbXBsaWNpdGx5IGNyZWF0ZXMgYSBuZXcKKyAqIHNlc3Npb24gaWYgbm8gc2Vzc2lvbiBpZCB3YXMgc3BlY2lmaWVkIGFzIGEgcGFyYW1ldGVyLgorICogPGxpPntAbGluayAjQUNUSU9OX1NFRUsgU2Vla306IFNldHMgdGhlIGNvbnRlbnQgcGxheWJhY2sgcG9zaXRpb24gb2YgYSBzcGVjaWZpYyBtZWRpYSBpdGVtLgorICogPGxpPntAbGluayAjQUNUSU9OX0dFVF9TVEFUVVMgR2V0IHN0YXR1c306IEdldHMgdGhlIHN0YXR1cyBvZiBhIG1lZGlhIGl0ZW0KKyAqIGluY2x1ZGluZyB0aGUgaXRlbSdzIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24gYW5kIHByb2dyZXNzLgorICogPGxpPntAbGluayAjQUNUSU9OX1BBVVNFIFBhdXNlfTogUGF1c2VzIHBsYXliYWNrIG9mIHRoZSBxdWV1ZS4KKyAqIDxsaT57QGxpbmsgI0FDVElPTl9SRVNVTUUgUmVzdW1lfTogUmVzdW1lcyBwbGF5YmFjayBvZiB0aGUgcXVldWUuCisgKiA8bGk+e0BsaW5rICNBQ1RJT05fU1RPUCBTdG9wfTogU3RvcHMgcGxheWJhY2ssIGNsZWFycyB0aGUgcXVldWUsIGFuZCByZXNldHMgdGhlCisgKiBwYXVzZSBzdGF0ZS4KKyAqIDwvdWw+CisgKgorICogPGg0PlF1ZXVlIGFjdGlvbnM8L2g0PgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIHF1ZXVlIGFjdGlvbnMgbXVzdCBiZSBzdXBwb3J0ZWQgKGFsbCBvciBub3RoaW5nKSBieSByZW1vdGUKKyAqIHBsYXliYWNrIHJvdXRlcyB0aGF0IG9mZmVyIG9wdGlvbmFsIHF1ZXVpbmcgY2FwYWJpbGl0aWVzLgorICogPC9wPjx1bD4KKyAqIDxsaT57QGxpbmsgI0FDVElPTl9FTlFVRVVFIEVucXVldWV9OiBFbnF1ZXVlcyBjb250ZW50IHNwZWNpZmllZCBieSBhIGdpdmVuIFVyaQorICogYW5kIHJldHVybnMgYSBuZXcgbWVkaWEgaXRlbSBpZCB0byBkZXNjcmliZSB0aGUgcmVxdWVzdC4gIEltcGxpY2l0bHkgY3JlYXRlcyBhIG5ldworICogc2Vzc2lvbiBpZiBubyBzZXNzaW9uIGlkIHdhcyBzcGVjaWZpZWQgYXMgYSBwYXJhbWV0ZXIuCisgKiA8bGk+e0BsaW5rICNBQ1RJT05fUkVNT1ZFIFJlbW92ZX06IFJlbW92ZXMgYSBzcGVjaWZpZWQgbWVkaWEgaXRlbSBmcm9tIHRoZSBxdWV1ZS4KKyAqIDwvdWw+CisgKgorICogPGg0PlNlc3Npb24gYWN0aW9uczwvaDQ+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgc2Vzc2lvbiBhY3Rpb25zIG11c3QgYmUgc3VwcG9ydGVkIChhbGwgb3Igbm90aGluZykgYnkgcmVtb3RlCisgKiBwbGF5YmFjayByb3V0ZXMgdGhhdCBvZmZlciBvcHRpb25hbCBzZXNzaW9uIG1hbmFnZW1lbnQgY2FwYWJpbGl0aWVzLgorICogPC9wPjx1bD4KKyAqIDxsaT57QGxpbmsgI0FDVElPTl9TVEFSVF9TRVNTSU9OIFN0YXJ0IHNlc3Npb259OiBTdGFydHMgYSBuZXcgc2Vzc2lvbiBleHBsaWNpdGx5LgorICogPGxpPntAbGluayAjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUyBHZXQgc2Vzc2lvbiBzdGF0dXN9OiBHZXRzIHRoZSBzdGF0dXMgb2YgYSBzZXNzaW9uLgorICogPGxpPntAbGluayAjQUNUSU9OX0VORF9TRVNTSU9OIEVuZCBzZXNzaW9ufTogRW5kcyBhIHNlc3Npb24gZXhwbGljaXRseS4KKyAqIDwvdWw+CisgKgorICogPGg0PkltcGxlbWVudGF0aW9uIG5vdGU8L2g0PgorICogPHA+CisgKiBJbXBsZW1lbnRhdGlvbnMgb2YgdGhlIHJlbW90ZSBwbGF5YmFjayBwcm90b2NvbCBtdXN0IGltcGxlbWVudCA8ZW0+YWxsPC9lbT4gb2YgdGhlCisgKiBkb2N1bWVudGVkIGFjdGlvbnMsIHBhcmFtZXRlcnMgYW5kIHJlc3VsdHMuICBOb3RlIHRoYXQgdGhlIGRvY3VtZW50YXRpb24gaXMgd3JpdHRlbiBmcm9tCisgKiB0aGUgcGVyc3BlY3RpdmUgb2YgYSBjbGllbnQgb2YgdGhlIHByb3RvY29sLiAgSW4gcGFydGljdWxhciwgd2hlbmV2ZXIgYSBwYXJhbWV0ZXIKKyAqIGlzIGRlc2NyaWJlZCBhcyBiZWluZyAib3B0aW9uYWwiLCBpdCBpcyBvbmx5IGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSBjbGllbnQuCisgKiBDb21wbGlhbnQgbWVkaWEgcm91dGUgcHJvdmlkZXIgaW1wbGVtZW50YXRpb25zIG9mIHRoaXMgcHJvdG9jb2wgbXVzdCBzdXBwb3J0IGFsbAorICogb2YgdGhlIGZlYXR1cmVzIGRlc2NyaWJlZCBoZXJlaW4uCisgKiA8L3A+CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYUNvbnRyb2xJbnRlbnQgeworICAgIC8qIFJvdXRlIGNhdGVnb3JpZXMuICovCisKKyAgICAvKioKKyAgICAgKiBNZWRpYSBjb250cm9sIGNhdGVnb3J5OiBMaXZlIGF1ZGlvLgorICAgICAqIDxwPgorICAgICAqIEEgcm91dGUgdGhhdCBzdXBwb3J0cyBsaXZlIGF1ZGlvIHJvdXRpbmcgd2lsbCBhbGxvdyB0aGUgbWVkaWEgYXVkaW8gc3RyZWFtCisgICAgICogdG8gYmUgc2VudCB0byBzdXBwb3J0ZWQgZGVzdGluYXRpb25zLiAgVGhpcyBjYW4gaW5jbHVkZSBpbnRlcm5hbCBzcGVha2VycyBvcgorICAgICAqIGF1ZGlvIGphY2tzIG9uIHRoZSBkZXZpY2UgaXRzZWxmLCBBMkRQIGRldmljZXMsIGFuZCBtb3JlLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBXaGVuIGEgbGl2ZSBhdWRpbyByb3V0ZSBpcyBzZWxlY3RlZCwgYXVkaW8gcm91dGluZyBpcyB0cmFuc3BhcmVudCB0byB0aGUgYXBwbGljYXRpb24uCisgICAgICogQWxsIGF1ZGlvIHBsYXllZCBvbiB0aGUgbWVkaWEgc3RyZWFtIHdpbGwgYmUgcm91dGVkIHRvIHRoZSBzZWxlY3RlZCBkZXN0aW5hdGlvbi4KKyAgICAgKiA8L3A+PHA+CisgICAgICogUmVmZXIgdG8gdGhlIGNsYXNzIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgYWJvdXQgbGl2ZSBhdWRpbyByb3V0ZXMuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX0xJVkVfQVVESU8gPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuY2F0ZWdvcnkuTElWRV9BVURJTyI7CisKKyAgICAvKioKKyAgICAgKiBNZWRpYSBjb250cm9sIGNhdGVnb3J5OiBMaXZlIHZpZGVvLgorICAgICAqIDxwPgorICAgICAqIEEgcm91dGUgdGhhdCBzdXBwb3J0cyBsaXZlIHZpZGVvIHJvdXRpbmcgd2lsbCBhbGxvdyBhIG1pcnJvcmVkIHZlcnNpb24KKyAgICAgKiBvZiB0aGUgZGV2aWNlJ3MgcHJpbWFyeSBkaXNwbGF5IG9yIGEgY3VzdG9taXplZAorICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5QcmVzZW50YXRpb24gUHJlc2VudGF0aW9ufSB0byBiZSBzZW50IHRvIHN1cHBvcnRlZAorICAgICAqIGRlc3RpbmF0aW9ucy4KKyAgICAgKiA8L3A+PHA+CisgICAgICogV2hlbiBhIGxpdmUgdmlkZW8gcm91dGUgaXMgc2VsZWN0ZWQsIGF1ZGlvIGFuZCB2aWRlbyByb3V0aW5nIGlzIHRyYW5zcGFyZW50CisgICAgICogdG8gdGhlIGFwcGxpY2F0aW9uLiAgQnkgZGVmYXVsdCwgYXVkaW8gYW5kIHZpZGVvIGlzIHJvdXRlZCB0byB0aGUgc2VsZWN0ZWQKKyAgICAgKiBkZXN0aW5hdGlvbi4gIEZvciBjZXJ0YWluIGxpdmUgdmlkZW8gcm91dGVzLCB0aGUgYXBwbGljYXRpb24gbWF5IGFsc28gdXNlIGEKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9uIFByZXNlbnRhdGlvbn0gdG8gcmVwbGFjZSB0aGUgbWlycm9yZWQgdmlldworICAgICAqIG9uIHRoZSBleHRlcm5hbCBkaXNwbGF5IHdpdGggZGlmZmVyZW50IGNvbnRlbnQuCisgICAgICogPC9wPjxwPgorICAgICAqIFJlZmVyIHRvIHRoZSBjbGFzcyBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIGFib3V0IGxpdmUgdmlkZW8gcm91dGVzLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI2dldFByZXNlbnRhdGlvbkRpc3BsYXkoKQorICAgICAqIEBzZWUgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUllfTElWRV9WSURFTyA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5jYXRlZ29yeS5MSVZFX1ZJREVPIjsKKworICAgIC8qKgorICAgICAqIE1lZGlhIGNvbnRyb2wgY2F0ZWdvcnk6IFJlbW90ZSBwbGF5YmFjay4KKyAgICAgKiA8cD4KKyAgICAgKiBBIHJvdXRlIHRoYXQgc3VwcG9ydHMgcmVtb3RlIHBsYXliYWNrIHJvdXRpbmcgd2lsbCBhbGxvdyBhbiBhcHBsaWNhdGlvbiB0byBzZW5kCisgICAgICogcmVxdWVzdHMgdG8gcGxheSBjb250ZW50IHJlbW90ZWx5IHRvIHN1cHBvcnRlZCBkZXN0aW5hdGlvbnMuCisgICAgICogPC9wPjxwPgorICAgICAqIFJlbW90ZSBwbGF5YmFjayByb3V0ZXMgZGVzdGluYXRpb25zIG9wZXJhdGUgaW5kZXBlbmRlbnRseSBvZiB0aGUgbG9jYWwgZGV2aWNlLgorICAgICAqIFdoZW4gYSByZW1vdGUgcGxheWJhY2sgcm91dGUgaXMgc2VsZWN0ZWQsIHRoZSBhcHBsaWNhdGlvbiBjYW4gY29udHJvbCB0aGUgY29udGVudAorICAgICAqIHBsYXlpbmcgb24gdGhlIGRlc3RpbmF0aW9uIGJ5IHNlbmRpbmcgbWVkaWEgY29udHJvbCBhY3Rpb25zIHRvIHRoZSByb3V0ZS4KKyAgICAgKiBUaGUgYXBwbGljYXRpb24gbWF5IGFsc28gcmVjZWl2ZSBzdGF0dXMgdXBkYXRlcyBmcm9tIHRoZSByb3V0ZSByZWdhcmRpbmcKKyAgICAgKiByZW1vdGUgcGxheWJhY2suCisgICAgICogPC9wPjxwPgorICAgICAqIFJlZmVyIHRvIHRoZSBjbGFzcyBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIGFib3V0IHJlbW90ZSBwbGF5YmFjayByb3V0ZXMuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLID0KKyAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5jYXRlZ29yeS5SRU1PVEVfUExBWUJBQ0siOworCisgICAgLyogUmVtb3RlIHBsYXliYWNrIGFjdGlvbnMgdGhhdCBhZmZlY3QgaW5kaXZpZHVhbCBpdGVtcy4gKi8KKworICAgIC8qKgorICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogUGxheSBtZWRpYSBpdGVtLgorICAgICAqIDxwPgorICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KKyAgICAgKiBtZWRpYSBjb250cm9sLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGlzIGFjdGlvbiBjYXVzZXMgYSByZW1vdGUgcGxheWJhY2sgcm91dGUgdG8gc3RhcnQgcGxheWluZyBjb250ZW50IHdpdGgKKyAgICAgKiB0aGUge0BsaW5rIFVyaX0gc3BlY2lmaWVkIGluIHRoZSB7QGxpbmsgSW50ZW50fSdzIHtAbGluayBJbnRlbnQjZ2V0RGF0YSgpIGRhdGEgdXJpfS4KKyAgICAgKiBUaGUgYWN0aW9uIHJldHVybnMgYSBtZWRpYSBzZXNzaW9uIGlkIGFuZCBtZWRpYSBpdGVtIGlkIHdoaWNoIGNhbiBiZSB1c2VkCisgICAgICogdG8gY29udHJvbCBwbGF5YmFjayB1c2luZyBvdGhlciByZW1vdGUgcGxheWJhY2sgYWN0aW9ucy4KKyAgICAgKiA8L3A+PHA+CisgICAgICogT25jZSBpbml0aWF0ZWQsIHBsYXliYWNrIG9mIHRoZSBzcGVjaWZpZWQgY29udGVudCB3aWxsIGJlIG1hbmFnZWQgaW5kZXBlbmRlbnRseQorICAgICAqIGJ5IHRoZSBkZXN0aW5hdGlvbi4gIFRoZSBhcHBsaWNhdGlvbiB3aWxsIHJlY2VpdmUgc3RhdHVzIHVwZGF0ZXMgYXMgdGhlIHN0YXRlCisgICAgICogb2YgdGhlIG1lZGlhIGl0ZW0gY2hhbmdlcy4KKyAgICAgKiA8L3A+PHA+CisgICAgICogSWYgdGhlIGRhdGEgdXJpIHNwZWNpZmllcyBhbiBIVFRQIG9yIEhUVFBTIHNjaGVtZSwgdGhlbiB0aGUgZGVzdGluYXRpb24gaXMKKyAgICAgKiByZXNwb25zaWJsZSBmb3IgZm9sbG93aW5nIEhUVFAgcmVkaXJlY3RzIHRvIGEgcmVhc29uYWJsZSBkZXB0aCBvZiBhdCBsZWFzdCAzCisgICAgICogbGV2ZWxzIGFzIG1pZ2h0IHR5cGljYWxseSBiZSBoYW5kbGVkIGJ5IGEgd2ViIGJyb3dzZXIuICBJZiBhbiBIVFRQIGVycm9yCisgICAgICogb2NjdXJzLCB0aGVuIHRoZSBkZXN0aW5hdGlvbiBzaG91bGQgc2VuZCBhIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMgc3RhdHVzIHVwZGF0ZX0KKyAgICAgKiBiYWNrIHRvIHRoZSBjbGllbnQgaW5kaWNhdGluZyB0aGUge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyNQTEFZQkFDS19TVEFURV9FUlJPUiBlcnJvcn0KKyAgICAgKiB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzI2dldFBsYXliYWNrU3RhdGUoKSBwbGF5YmFjayBzdGF0ZX0uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogPGgzPk9uZSBpdGVtIGF0IGEgdGltZTwvaDM+CisgICAgICogPHA+CisgICAgICogRWFjaCBzdWNjZXNzZnVsIHBsYXkgYWN0aW9uIDxlbT5yZXBsYWNlczwvZW0+IHRoZSBwcmV2aW91cyBwbGF5IGFjdGlvbi4KKyAgICAgKiBJZiBhbiBpdGVtIGlzIGFscmVhZHkgcGxheWluZywgdGhlbiBpdCBpcyBjYW5jZWxlZCwgdGhlIHNlc3Npb24ncyBwbGF5YmFjayBxdWV1ZQorICAgICAqIGlzIGNsZWFyZWQgYW5kIHRoZSBuZXcgaXRlbSBiZWdpbnMgcGxheWluZyBpbW1lZGlhdGVseSAocmVnYXJkbGVzcyBvZgorICAgICAqIHdoZXRoZXIgdGhlIHByZXZpb3VzbHkgcGxheWluZyBpdGVtIGhhZCBiZWVuIHBhdXNlZCkuCisgICAgICogPC9wPjxwPgorICAgICAqIFBsYXkgaXMgdGhlcmVmb3JlIGVxdWl2YWxlbnQgdG8ge0BsaW5rICNBQ1RJT05fU1RPUCBzdG9wfSBmb2xsb3dlZCBieSBhbiBhY3Rpb24KKyAgICAgKiB0byBlbnF1ZXVlIGEgbmV3IG1lZGlhIGl0ZW0gdG8gYmUgcGxheWVkIGltbWVkaWF0ZWx5LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIDxoMz5TZXNzaW9uczwvaDM+CisgICAgICogPHA+CisgICAgICogVGhpcyByZXF1ZXN0IGhhcyB0aGUgZWZmZWN0IG9mIGltcGxpY2l0bHkgY3JlYXRpbmcgYSBtZWRpYSBzZXNzaW9uIHdoZW5ldmVyIHRoZQorICAgICAqIGFwcGxpY2F0aW9uIGRvZXMgbm90IHNwZWNpZnkgdGhlIHtAbGluayAjRVhUUkFfU0VTU0lPTl9JRCBzZXNzaW9uIGlkfSBwYXJhbWV0ZXIuCisgICAgICogQmVjYXVzZSB0aGVyZSBjYW4gb25seSBiZSBhdCBtb3N0IG9uZSB2YWxpZCBzZXNzaW9uIGF0IGEgdGltZSwgY3JlYXRpbmcgYSBuZXcgc2Vzc2lvbgorICAgICAqIGhhcyB0aGUgc2lkZS1lZmZlY3Qgb2YgaW52YWxpZGF0aW5nIGFueSBleGlzdGluZyBzZXNzaW9ucyBhbmQgdGhlaXIgbWVkaWEgaXRlbXMsCisgICAgICogdGhlbiBoYW5kbGluZyB0aGUgcGxheWJhY2sgcmVxdWVzdCB3aXRoIGEgbmV3IHNlc3Npb24uCisgICAgICogPC9wPjxwPgorICAgICAqIElmIHRoZSBhcHBsaWNhdGlvbiBzcGVjaWZpZXMgYW4gaW52YWxpZCBzZXNzaW9uIGlkLCB0aGVuIGFuIGVycm9yIGlzIHJldHVybmVkLgorICAgICAqIFdoZW4gdGhpcyBoYXBwZW5zLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGFzc3VtZSB0aGF0IGl0cyBzZXNzaW9uCisgICAgICogaXMgbm8gbG9uZ2VyIHZhbGlkLiAgVG8gb2J0YWluIGEgbmV3IHNlc3Npb24sIHRoZSBhcHBsaWNhdGlvbiBtYXkgdHJ5IGFnYWluCisgICAgICogYW5kIG9taXQgdGhlIHNlc3Npb24gaWQgcGFyYW1ldGVyLiAgSG93ZXZlciwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZAorICAgICAqIG9ubHkgcmV0cnkgcmVxdWVzdHMgZHVlIHRvIGFuIGV4cGxpY2l0IGFjdGlvbiBwZXJmb3JtZWQgYnkgdGhlIHVzZXIsCisgICAgICogc3VjaCBhcyB0aGUgdXNlciBjbGlja2luZyBvbiBhICJwbGF5IiBidXR0b24gaW4gdGhlIFVJLCBzaW5jZSBhbm90aGVyCisgICAgICogYXBwbGljYXRpb24gbWF5IGJlIHRyeWluZyB0byB0YWtlIGNvbnRyb2wgb2YgdGhlIHJvdXRlIGFuZCB0aGUgZm9ybWVyCisgICAgICogYXBwbGljYXRpb24gc2hvdWxkIHRyeSB0byBzdGF5IG91dCBvZiBpdHMgd2F5LgorICAgICAqIDwvcD48cD4KKyAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBzZXNzaW9ucywgcXVldWVzIGFuZCBtZWRpYSBpdGVtcywgcGxlYXNlIHJlZmVyIHRvIHRoZQorICAgICAqIGNsYXNzIGRvY3VtZW50YXRpb24uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUKKyAgICAgKiBzZXNzaW9uIHRvIHdoaWNoIHRoZSBwbGF5YmFjayByZXF1ZXN0IGJlbG9uZ3MuICBJZiBvbWl0dGVkLCBhIG5ldyBzZXNzaW9uCisgICAgICogaXMgY3JlYXRlZCBpbXBsaWNpdGx5LgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fQ09OVEVOVF9QT1NJVElPTn0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBpbml0aWFsCisgICAgICogY29udGVudCBwbGF5YmFjayBwb3NpdGlvbiBhcyBhIGxvbmcgaW50ZWdlciBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGZyb20KKyAgICAgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb250ZW50LgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fTUVUQURBVEF9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyBtZXRhZGF0YSBhc3NvY2lhdGVkCisgICAgICogd2l0aCB0aGUgY29udGVudCBzdWNoIGFzIHRoZSB0aXRsZSBvZiBhIHNvbmcuCisgICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgYQorICAgICAqIHtAbGluayBQZW5kaW5nSW50ZW50fSBmb3IgYSBicm9hZGNhc3QgcmVjZWl2ZXIgdGhhdCB3aWxsIHJlY2VpdmUgc3RhdHVzIHVwZGF0ZXMKKyAgICAgKiBhYm91dCB0aGUgbWVkaWEgaXRlbS4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUKKyAgICAgKiBzZXNzaW9uIHRoYXQgd2FzIGFmZmVjdGVkIGJ5IHRoZSByZXF1ZXN0LiAgVGhpcyB3aWxsIGJlIGEgbmV3IHNlc3Npb24gaW4KKyAgICAgKiB0aGUgY2FzZSB3aGVyZSBubyBzZXNzaW9uIGlkIHdhcyBzdXBwbGllZCBhcyBhIHBhcmFtZXRlci4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihvcHRpb25hbCwgb2xkIGltcGxlbWVudGF0aW9ucyBtYXkKKyAgICAgKiBvbWl0IHRoaXMga2V5KTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX0lEfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIGFuIG9wYXF1ZSBzdHJpbmcgaWRlbnRpZmllcgorICAgICAqIHRvIHVzZSB0byByZWZlciB0byB0aGUgbWVkaWEgaXRlbSBpbiBzdWJzZXF1ZW50IHJlcXVlc3RzIHN1Y2ggYXMKKyAgICAgKiB7QGxpbmsgI0FDVElPTl9HRVRfU1RBVFVTfS4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU30gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgaW5pdGlhbCBzdGF0dXMgb2YKKyAgICAgKiB0aGUgbmV3IG1lZGlhIGl0ZW0uCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIDxoMz5TdGF0dXMgdXBkYXRlczwvaDM+CisgICAgICogPHA+CisgICAgICogSWYgdGhlIGNsaWVudCBzdXBwbGllcyBhbgorICAgICAqIHtAbGluayAjRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIGl0ZW0gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcn0KKyAgICAgKiB0aGVuIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyBzdGF0dXMgdXBkYXRlcyB0byB0aGUgcmVjZWl2ZXIKKyAgICAgKiB3aGVuIHNpZ25pZmljYW50IG1lZGlhIGl0ZW0gc3RhdGUgY2hhbmdlcyBvY2N1ciBzdWNoIGFzIHdoZW4gcGxheWJhY2sgc3RhcnRzIG9yCisgICAgICogc3RvcHMuICBUaGUgcmVjZWl2ZXIgd2lsbCBub3QgYmUgaW52b2tlZCBmb3IgY29udGVudCBwbGF5YmFjayBwb3NpdGlvbiBjaGFuZ2VzLgorICAgICAqIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmV0cmlldmUgdGhlIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24gd2hlbiBuZWNlc3NhcnkKKyAgICAgKiB1c2luZyB0aGUge0BsaW5rICNBQ1RJT05fR0VUX1NUQVRVU30gcmVxdWVzdC4KKyAgICAgKiA8L3A+PHA+CisgICAgICogUmVmZXIgdG8ge0BsaW5rIE1lZGlhSXRlbVN0YXR1c30gZm9yIGRldGFpbHMuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogPGgzPkVycm9yczwvaDM+CisgICAgICogPHA+CisgICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiBhIHNlc3Npb24gaWQgd2FzIHByb3ZpZGVkIGJ1dCBpcyB1bmtub3duIG9yCisgICAgICogbm8gbG9uZ2VyIHZhbGlkLCBpZiB0aGUgaXRlbSBVcmkgb3IgY29udGVudCB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQsIG9yIGlmCisgICAgICogYW55IG90aGVyIGFyZ3VtZW50cyBhcmUgaW52YWxpZC4KKyAgICAgKiA8L3A+PHVsPgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiA8aDM+RXhhbXBsZTwvaDM+CisgICAgICogPHByZT4KKyAgICAgKiBNZWRpYVJvdXRlciBtZWRpYVJvdXRlciA9IE1lZGlhUm91dGVyLmdldEluc3RhbmNlKGNvbnRleHQpOworICAgICAqIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1lZGlhUm91dGVyLmdldFNlbGVjdGVkUm91dGUoKTsKKyAgICAgKiBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1BMQVkpOworICAgICAqIGludGVudC5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKTsKKyAgICAgKiBpbnRlbnQuc2V0RGF0YUFuZFR5cGUoImh0dHA6Ly9leGFtcGxlLmNvbS92aWRlb3MvbW92aWUubXA0IiwgInZpZGVvL21wNCIpOworICAgICAqIGlmIChyb3V0ZS5zdXBwb3J0c0NvbnRyb2xSZXF1ZXN0KGludGVudCkpIHsKKyAgICAgKiAgICAgTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBNZWRpYVJvdXRlci5Db250cm9sUmVxdWVzdENhbGxiYWNrKCkgeworICAgICAqICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEpIHsKKyAgICAgKiAgICAgICAgICAgICAvLyBUaGUgcmVxdWVzdCBzdWNjZWVkZWQuCisgICAgICogICAgICAgICAgICAgLy8gUGxheWJhY2sgbWF5IGJlIGNvbnRyb2xsZWQgdXNpbmcgdGhlIHJldHVybmVkIHNlc3Npb24gYW5kIGl0ZW0gaWQuCisgICAgICogICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCA9IGRhdGEuZ2V0U3RyaW5nKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX0lEKTsKKyAgICAgKiAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkID0gZGF0YS5nZXRTdHJpbmcoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fSUQpOworICAgICAqICAgICAgICAgICAgIE1lZGlhSXRlbVN0YXR1cyBzdGF0dXMgPSBNZWRpYUl0ZW1TdGF0dXMuZnJvbUJ1bmRsZShkYXRhLmdldEJ1bmRsZSgKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX1NUQVRVUykpOworICAgICAqICAgICAgICAgICAgIC8vIC4uLgorICAgICAqICAgICAgICAgfQorICAgICAqCisgICAgICogICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFN0cmluZyBtZXNzYWdlLCBCdW5kbGUgZGF0YSkgeworICAgICAqICAgICAgICAgICAgIC8vIEFuIGVycm9yIG9jY3VycmVkIQorICAgICAqICAgICAgICAgfQorICAgICAqICAgICB9OworICAgICAqICAgICByb3V0ZS5zZW5kQ29udHJvbFJlcXVlc3QoaW50ZW50LCBjYWxsYmFjayk7CisgICAgICogfTwvcHJlPgorICAgICAqCisgICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0CisgICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCisgICAgICogQHNlZSAjQUNUSU9OX1NFRUsKKyAgICAgKiBAc2VlICNBQ1RJT05fR0VUX1NUQVRVUworICAgICAqIEBzZWUgI0FDVElPTl9QQVVTRQorICAgICAqIEBzZWUgI0FDVElPTl9SRVNVTUUKKyAgICAgKiBAc2VlICNBQ1RJT05fU1RPUAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9QTEFZID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5QTEFZIjsKKworICAgIC8qKgorICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogRW5xdWV1ZSBtZWRpYSBpdGVtLgorICAgICAqIDxwPgorICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KKyAgICAgKiBtZWRpYSBjb250cm9sLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGlzIGFjdGlvbiB3b3JrcyBqdXN0IGxpa2Uge0BsaW5rICNBQ1RJT05fUExBWSBwbGF5fSBleGNlcHQgdGhhdCBpdCBkb2VzCisgICAgICogbm90IGNsZWFyIHRoZSBxdWV1ZSBvciByZXNldCB0aGUgcGF1c2Ugc3RhdGUgd2hlbiBpdCBlbnF1ZXVlcyB0aGUKKyAgICAgKiBuZXcgbWVkaWEgaXRlbSBpbnRvIHRoZSBzZXNzaW9uJ3MgcGxheWJhY2sgcXVldWUuICBUaGlzIGFjdGlvbiBvbmx5CisgICAgICogZW5xdWV1ZXMgYSBtZWRpYSBpdGVtIHdpdGggbm8gb3RoZXIgc2lkZS1lZmZlY3RzIG9uIHRoZSBxdWV1ZS4KKyAgICAgKiA8L3A+PHA+CisgICAgICogSWYgdGhlIHF1ZXVlIGlzIGN1cnJlbnRseSBlbXB0eSBhbmQgdGhlbiB0aGUgaXRlbSB3aWxsIHBsYXkgaW1tZWRpYXRlbHkKKyAgICAgKiAoYXNzdW1pbmcgdGhlIHF1ZXVlIGlzIG5vdCBwYXVzZWQpLiAgT3RoZXJ3aXNlLCB0aGUgaXRlbSB3aWxsIHBsYXkKKyAgICAgKiBhZnRlciBhbGwgZWFybGllciBpdGVtcyBpbiB0aGUgcXVldWUgaGF2ZSBmaW5pc2hlZCBvciBiZWVuIHJlbW92ZWQuCisgICAgICogPC9wPjxwPgorICAgICAqIFRoZSBlbnF1ZXVlIGFjdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgbmV3IHNlc3Npb25zIGp1c3QgbGlrZSBwbGF5LgorICAgICAqIEl0cyBwYXJhbWV0ZXJzIGFuZCByZXN1bHRzIGFyZSBhbHNvIHRoZSBzYW1lLiAgT25seSB0aGUgcXVldWluZyBiZWhhdmlvcgorICAgICAqIGlzIGRpZmZlcmVudC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAc2VlICNBQ1RJT05fUExBWQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9FTlFVRVVFID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5FTlFVRVVFIjsKKworICAgIC8qKgorICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogU2VlayBtZWRpYSBpdGVtIHRvIGEgbmV3IHBsYXliYWNrIHBvc2l0aW9uLgorICAgICAqIDxwPgorICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KKyAgICAgKiBtZWRpYSBjb250cm9sLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGlzIGFjdGlvbiBjYXVzZXMgYSByZW1vdGUgcGxheWJhY2sgcm91dGUgdG8gbW9kaWZ5IHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uCisgICAgICogb2YgdGhlIHNwZWNpZmllZCBtZWRpYSBpdGVtLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGlzIGFjdGlvbiBvbmx5IGFmZmVjdHMgdGhlIHBsYXliYWNrIHBvc2l0aW9uIG9mIHRoZSBtZWRpYSBpdGVtOyBub3QgaXRzIHBsYXliYWNrIHN0YXRlLgorICAgICAqIElmIHRoZSBwbGF5YmFjayBxdWV1ZSBpcyBwYXVzZWQsIHRoZW4gc2Vla2luZyBzZXRzIHRoZSBwb3NpdGlvbiBidXQgdGhlIGl0ZW0KKyAgICAgKiByZW1haW5zIHBhdXNlZC4gIExpa2V3aXNlIGlmIHRoZSBpdGVtIGlzIHBsYXlpbmcsIHRoZW4gc2Vla2luZyB3aWxsIGNhdXNlIHBsYXliYWNrCisgICAgICogdG8ganVtcCB0byB0aGUgbmV3IHBvc2l0aW9uIGFuZCBjb250aW51ZSBwbGF5aW5nIGZyb20gdGhhdCBwb2ludC4gIElmIHRoZSBpdGVtIGhhcworICAgICAqIG5vdCB5ZXQgc3RhcnRlZCBwbGF5aW5nLCB0aGVuIHRoZSBuZXcgcGxheWJhY2sgcG9zaXRpb24gaXMgcmVtZW1iZXJlZCBieSB0aGUKKyAgICAgKiBxdWV1ZSBhbmQgdXNlZCBhcyB0aGUgaXRlbSdzIGluaXRpYWwgY29udGVudCBwb3NpdGlvbiB3aGVuIHBsYXliYWNrIGV2ZW50dWFsbHkgYmVnaW5zLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBJZiBzdWNjZXNzZnVsLCB0aGUgbWVkaWEgaXRlbSdzIHBsYXliYWNrIHBvc2l0aW9uIGlzIGNoYW5nZWQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUgc2Vzc2lvbgorICAgICAqIHRvIHdoaWNoIHRoZSBtZWRpYSBpdGVtIGJlbG9uZ3MuCisgICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBtZWRpYSBpdGVtIGlkIG9mCisgICAgICogdGhlIG1lZGlhIGl0ZW0gdG8gc2Vlay4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX0NPTlRFTlRfUE9TSVRJT059IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbmV3CisgICAgICogY29udGVudCBwb3NpdGlvbiBmb3IgcGxheWJhY2sgYXMgYSBsb25nIGludGVnZXIgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBmcm9tCisgICAgICogdGhlIGJlZ2lubmluZyBvZiB0aGUgY29udGVudC4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5CisgICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCisgICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9TVEFUVVN9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG5ldyBzdGF0dXMgb2YKKyAgICAgKiB0aGUgbWVkaWEgaXRlbS4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogPGgzPkVycm9yczwvaDM+CisgICAgICogPHA+CisgICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc2Vzc2lvbiBpZCBvciBtZWRpYSBpdGVtIGlkIGFyZSB1bmtub3duCisgICAgICogb3Igbm8gbG9uZ2VyIHZhbGlkLCBpZiB0aGUgY29udGVudCBwb3NpdGlvbiBpcyBpbnZhbGlkLCBvciBpZiB0aGUgbWVkaWEgaXRlbQorICAgICAqIGlzIGluIGEgdGVybWluYWwgc3RhdGUuCisgICAgICogPC9wPjx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0CisgICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NFRUsgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLlNFRUsiOworCisgICAgLyoqCisgICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBHZXQgbWVkaWEgaXRlbSBwbGF5YmFjayBzdGF0dXMKKyAgICAgKiBhbmQgcHJvZ3Jlc3MgaW5mb3JtYXRpb24uCisgICAgICogPHA+CisgICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQorICAgICAqIG1lZGlhIGNvbnRyb2wuCisgICAgICogPC9wPjxwPgorICAgICAqIFRoaXMgYWN0aW9uIGFza3MgYSByZW1vdGUgcGxheWJhY2sgcm91dGUgdG8gcHJvdmlkZSB1cGRhdGVkIHBsYXliYWNrIHN0YXR1cyBhbmQgcHJvZ3Jlc3MKKyAgICAgKiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3BlY2lmaWVkIG1lZGlhIGl0ZW0uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUgc2Vzc2lvbgorICAgICAqIHRvIHdoaWNoIHRoZSBtZWRpYSBpdGVtIGJlbG9uZ3MuCisgICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBtZWRpYSBpdGVtIGlkIG9mCisgICAgICogdGhlIG1lZGlhIGl0ZW0gdG8gcXVlcnkuCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQorICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjdXJyZW50IHN0YXR1cyBvZgorICAgICAqIHRoZSBtZWRpYSBpdGVtLgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiA8aDM+RXJyb3JzPC9oMz4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIG9yIG1lZGlhIGl0ZW0gaWQgYXJlIHVua25vd24KKyAgICAgKiBvciBubyBsb25nZXIgdmFsaWQuCisgICAgICogPC9wPjx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0CisgICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCisgICAgICogQHNlZSAjRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0dFVF9TVEFUVVMgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLkdFVF9TVEFUVVMiOworCisgICAgLyoqCisgICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBSZW1vdmUgbWVkaWEgaXRlbSBmcm9tIHNlc3Npb24ncyBxdWV1ZS4KKyAgICAgKiA8cD4KKyAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9CisgICAgICogbWVkaWEgY29udHJvbC4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhpcyBhY3Rpb24gYXNrcyBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSB0byByZW1vdmUgdGhlIHNwZWNpZmllZCBtZWRpYSBpdGVtCisgICAgICogZnJvbSB0aGUgc2Vzc2lvbidzIHBsYXliYWNrIHF1ZXVlLiAgSWYgdGhlIGN1cnJlbnQgaXRlbSBpcyByZW1vdmVkLCB0aGVuCisgICAgICogcGxheWJhY2sgd2lsbCBwcm9jZWVkIHRvIHRoZSBuZXh0IG1lZGlhIGl0ZW0gKGFzc3VtaW5nIHRoZSBxdWV1ZSBoYXMgbm90IGJlZW4KKyAgICAgKiBwYXVzZWQpLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGlzIGFjdGlvbiBkb2VzIG5vdCBhZmZlY3QgdGhlIHBhdXNlIHN0YXRlIG9mIHRoZSBxdWV1ZS4gIElmIHRoZSBxdWV1ZSB3YXMgcGF1c2VkCisgICAgICogdGhlbiBpdCByZW1haW5zIHBhdXNlZCAoZXZlbiBpZiBpdCBpcyBub3cgZW1wdHkpIHVudGlsIGEgcmVzdW1lLCBzdG9wIG9yIHBsYXkKKyAgICAgKiBhY3Rpb24gaXMgaXNzdWVkIHRoYXQgY2F1c2VzIHRoZSBwYXVzZSBzdGF0ZSB0byBiZSBjbGVhcmVkLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlIHNlc3Npb24KKyAgICAgKiB0byB3aGljaCB0aGUgbWVkaWEgaXRlbSBiZWxvbmdzLgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbWVkaWEgaXRlbSBpZCBvZgorICAgICAqIHRoZSBtZWRpYSBpdGVtIHRvIHJlbW92ZS4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5CisgICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCisgICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9TVEFUVVN9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG5ldyBzdGF0dXMgb2YKKyAgICAgKiB0aGUgbWVkaWEgaXRlbS4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogPGgzPkVycm9yczwvaDM+CisgICAgICogPHA+CisgICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc2Vzc2lvbiBpZCBvciBtZWRpYSBpdGVtIGlkIGFyZSB1bmtub3duCisgICAgICogb3Igbm8gbG9uZ2VyIHZhbGlkLCBvciBpZiB0aGUgbWVkaWEgaXRlbSBpcyBpbiBhIHRlcm1pbmFsIHN0YXRlIChhbmQgdGhlcmVmb3JlCisgICAgICogbm8gbG9uZ2VyIGluIHRoZSBxdWV1ZSkuCisgICAgICogPC9wPjx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0CisgICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1JFTU9WRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uUkVNT1ZFIjsKKworICAgIC8qIFJlbW90ZSBwbGF5YmFjayBhY3Rpb25zIHRoYXQgYWZmZWN0IHRoZSB3aG9sZSBwbGF5YmFjayBxdWV1ZS4gKi8KKworICAgIC8qKgorICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogUGF1c2UgbWVkaWEgcGxheWJhY2suCisgICAgICogPHA+CisgICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQorICAgICAqIG1lZGlhIGNvbnRyb2wuCisgICAgICogPC9wPjxwPgorICAgICAqIFRoaXMgYWN0aW9uIGNhdXNlcyB0aGUgcGxheWJhY2sgcXVldWUgb2YgdGhlIHNwZWNpZmllZCBzZXNzaW9uIHRvIGJlIHBhdXNlZC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZSBzZXNzaW9uCisgICAgICogd2hvc2UgcGxheWJhY2sgcXVldWUgaXMgdG8gYmUgcGF1c2VkLgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihvcHRpb25hbCwgb2xkIGltcGxlbWVudGF0aW9ucyBtYXkKKyAgICAgKiBvbWl0IHRoaXMga2V5KTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogPGgzPkVycm9yczwvaDM+CisgICAgICogPHA+CisgICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc2Vzc2lvbiBpZCBpcyB1bmtub3duIG9yIG5vIGxvbmdlciB2YWxpZC4KKyAgICAgKiA8L3A+PHVsPgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKKyAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKKyAgICAgKiBAc2VlICNBQ1RJT05fUkVTVU1FCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1BBVVNFID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5QQVVTRSI7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFJlc3VtZSBtZWRpYSBwbGF5YmFjayAodW5wYXVzZSkuCisgICAgICogPHA+CisgICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQorICAgICAqIG1lZGlhIGNvbnRyb2wuCisgICAgICogPC9wPjxwPgorICAgICAqIFRoaXMgYWN0aW9uIGNhdXNlcyB0aGUgcGxheWJhY2sgcXVldWUgb2YgdGhlIHNwZWNpZmllZCBzZXNzaW9uIHRvIGJlIHJlc3VtZWQuCisgICAgICogUmV2ZXJzZXMgdGhlIGVmZmVjdHMgb2Yge0BsaW5rICNBQ1RJT05fUEFVU0V9LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlIHNlc3Npb24KKyAgICAgKiB3aG9zZSBwbGF5YmFjayBxdWV1ZSBpcyB0byBiZSByZXN1bWVkLgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihvcHRpb25hbCwgb2xkIGltcGxlbWVudGF0aW9ucyBtYXkKKyAgICAgKiBvbWl0IHRoaXMga2V5KTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogPGgzPkVycm9yczwvaDM+CisgICAgICogPHA+CisgICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc2Vzc2lvbiBpZCBpcyB1bmtub3duIG9yIG5vIGxvbmdlciB2YWxpZC4KKyAgICAgKiA8L3A+PHVsPgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKKyAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKKyAgICAgKiBAc2VlICNBQ1RJT05fUEFVU0UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUkVTVU1FID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5SRVNVTUUiOworCisgICAgLyoqCisgICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBTdG9wIG1lZGlhIHBsYXliYWNrIChjbGVhciBxdWV1ZSBhbmQgdW5wYXVzZSkuCisgICAgICogPHA+CisgICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQorICAgICAqIG1lZGlhIGNvbnRyb2wuCisgICAgICogPC9wPjxwPgorICAgICAqIFRoaXMgYWN0aW9uIGNhdXNlcyBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSB0byBzdG9wIHBsYXliYWNrLCBjYW5jZWwgYW5kIHJlbW92ZQorICAgICAqIGFsbCBtZWRpYSBpdGVtcyBmcm9tIHRoZSBzZXNzaW9uJ3MgbWVkaWEgaXRlbSBxdWV1ZSBhbmQsIHJlc2V0IHRoZSBxdWV1ZSdzCisgICAgICogcGF1c2Ugc3RhdGUuCisgICAgICogPC9wPjxwPgorICAgICAqIElmIHN1Y2Nlc3NmdWwsIHRoZSBzdGF0dXMgb2YgYWxsIG1lZGlhIGl0ZW1zIGluIHRoZSBxdWV1ZSBpcyBzZXQgdG8KKyAgICAgKiB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzI1BMQVlCQUNLX1NUQVRFX0NBTkNFTEVEIGNhbmNlbGVkfSBhbmQgYSBzdGF0dXMgdXBkYXRlIGlzIHNlbnQKKyAgICAgKiB0byB0aGUgYXBwcm9wcmlhdGUgc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnMgaW5kaWNhdGluZyB0aGUgbmV3IHN0YXR1cyBvZiBlYWNoIGl0ZW0uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZgorICAgICAqIHRoZSBzZXNzaW9uIHdob3NlIHBsYXliYWNrIHF1ZXVlIGlzIHRvIGJlIHN0b3BwZWQgKGNsZWFyZWQgYW5kIHVucGF1c2VkKS4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5CisgICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIDxoMz5FcnJvcnM8L2gzPgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgaXMgdW5rbm93biBvciBubyBsb25nZXIgdmFsaWQuCisgICAgICogPC9wPjx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0CisgICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NUT1AgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLlNUT1AiOworCisgICAgLyoqCisgICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBTdGFydCBzZXNzaW9uLgorICAgICAqIDxwPgorICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KKyAgICAgKiBtZWRpYSBjb250cm9sLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGlzIGFjdGlvbiBjYXVzZXMgYSByZW1vdGUgcGxheWJhY2sgcm91dGUgdG8gaW52YWxpZGF0ZSB0aGUgY3VycmVudCBzZXNzaW9uCisgICAgICogYW5kIHN0YXJ0IGEgbmV3IHNlc3Npb24uICBUaGUgbmV3IHNlc3Npb24gaW5pdGlhbGx5IGhhcyBhbiBlbXB0eSBxdWV1ZS4KKyAgICAgKiA8L3A+PHA+CisgICAgICogSWYgc3VjY2Vzc2Z1bCwgdGhlIHN0YXR1cyBvZiBhbGwgbWVkaWEgaXRlbXMgaW4gdGhlIHByZXZpb3VzIHNlc3Npb24ncyBxdWV1ZSBpcyBzZXQgdG8KKyAgICAgKiB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzI1BMQVlCQUNLX1NUQVRFX0lOVkFMSURBVEVEIGludmFsaWRhdGVkfSBhbmQgYSBzdGF0dXMgdXBkYXRlCisgICAgICogaXMgc2VudCB0byB0aGUgYXBwcm9wcmlhdGUgc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnMgaW5kaWNhdGluZyB0aGUgbmV3IHN0YXR1cworICAgICAqIG9mIGVhY2ggaXRlbS4gIFRoZSBwcmV2aW91cyBzZXNzaW9uIGJlY29tZXMgbm8gbG9uZ2VyIHZhbGlkIGFuZCB0aGUgbmV3IHNlc3Npb24KKyAgICAgKiB0YWtlcyBjb250cm9sIG9mIHRoZSByb3V0ZS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgYQorICAgICAqIHtAbGluayBQZW5kaW5nSW50ZW50fSBmb3IgYSBicm9hZGNhc3QgcmVjZWl2ZXIgdGhhdCB3aWxsIHJlY2VpdmUgc3RhdHVzIHVwZGF0ZXMKKyAgICAgKiBhYm91dCB0aGUgbWVkaWEgc2Vzc2lvbi4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9NRVNTQUdFX1JFQ0VJVkVSfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgYQorICAgICAqIHtAbGluayBQZW5kaW5nSW50ZW50fSBmb3IgYSBicm9hZGNhc3QgcmVjZWl2ZXIgdGhhdCB3aWxsIHJlY2VpdmUgbWVzc2FnZXMgZnJvbQorICAgICAqIHRoZSBtZWRpYSBzZXNzaW9uLgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZQorICAgICAqIHNlc3Npb24gdGhhdCB3YXMgc3RhcnRlZCBieSB0aGUgcmVxdWVzdC4gIFRoaXMgd2lsbCBhbHdheXMgYmUgYSBicmFuZCBuZXcgc2Vzc2lvbgorICAgICAqIGRpc3RpbmN0IGZyb20gYW55IG90aGVyIHByZXZpb3VzbHkgY3JlYXRlZCBzZXNzaW9ucy4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUKKyAgICAgKiBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIDxoMz5TdGF0dXMgdXBkYXRlczwvaDM+CisgICAgICogPHA+CisgICAgICogSWYgdGhlIGNsaWVudCBzdXBwbGllcyBhCisgICAgICoge0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgc3RhdHVzIHVwZGF0ZSByZWNlaXZlcn0KKyAgICAgKiB0aGVuIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyBzdGF0dXMgdXBkYXRlcyB0byB0aGUgcmVjZWl2ZXIKKyAgICAgKiB3aGVuIHNpZ25pZmljYW50IG1lZGlhIHNlc3Npb24gc3RhdGUgY2hhbmdlcyBvY2N1ciBzdWNoIGFzIHdoZW4gdGhlIHNlc3Npb24ncworICAgICAqIHF1ZXVlIGlzIHBhdXNlZCBvciByZXN1bWVkIG9yIHdoZW4gdGhlIHNlc3Npb24gaXMgdGVybWluYXRlZCBvciBpbnZhbGlkYXRlZC4KKyAgICAgKiA8L3A+PHA+CisgICAgICogUmVmZXIgdG8ge0BsaW5rIE1lZGlhU2Vzc2lvblN0YXR1c30gZm9yIGRldGFpbHMuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogPGgzPkN1c3RvbSBtZXNzYWdlczwvaDM+CisgICAgICogPHA+CisgICAgICogSWYgdGhlIGNsaWVudCBzdXBwbGllcyBhIHtAbGluayAjRVhUUkFfTUVTU0FHRV9SRUNFSVZFUiBtZXNzYWdlIHJlY2VpdmVyfQorICAgICAqIHRoZW4gdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIG1lc3NhZ2VzIHRvIHRoZSByZWNlaXZlcgorICAgICAqIHdoZW4gdGhlIHNlc3Npb24gaGFzIGFueSBtZXNzYWdlcyB0byBzZW5kLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBSZWZlciB0byB7QGxpbmsgI0VYVFJBX01FU1NBR0V9IGZvciBkZXRhaWxzLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIDxoMz5FcnJvcnM8L2gzPgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gY291bGQgbm90IGJlIGNyZWF0ZWQuCisgICAgICogPC9wPjx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0CisgICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NUQVJUX1NFU1NJT04gPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLlNUQVJUX1NFU1NJT04iOworCisgICAgLyoqCisgICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBHZXQgbWVkaWEgc2Vzc2lvbiBzdGF0dXMgaW5mb3JtYXRpb24uCisgICAgICogPHA+CisgICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQorICAgICAqIG1lZGlhIGNvbnRyb2wuCisgICAgICogPC9wPjxwPgorICAgICAqIFRoaXMgYWN0aW9uIGFza3MgYSByZW1vdGUgcGxheWJhY2sgcm91dGUgdG8gcHJvdmlkZSB1cGRhdGVkIHN0YXR1cyBpbmZvcm1hdGlvbgorICAgICAqIGFib3V0IHRoZSBzcGVjaWZpZWQgbWVkaWEgc2Vzc2lvbi4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZQorICAgICAqIHNlc3Npb24gd2hvc2Ugc3RhdHVzIGlzIHRvIGJlIHJldHJpZXZlZC4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlCisgICAgICogY3VycmVudCBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIDxoMz5FcnJvcnM8L2gzPgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgaXMgdW5rbm93biBvciBubyBsb25nZXIgdmFsaWQuCisgICAgICogPC9wPjx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0CisgICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCisgICAgICogQHNlZSAjRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUyA9CisgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLkdFVF9TRVNTSU9OX1NUQVRVUyI7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IEVuZCBzZXNzaW9uLgorICAgICAqIDxwPgorICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KKyAgICAgKiBtZWRpYSBjb250cm9sLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGlzIGFjdGlvbiBjYXVzZXMgYSByZW1vdGUgcGxheWJhY2sgcm91dGUgdG8gZW5kIHRoZSBzcGVjaWZpZWQgc2Vzc2lvbi4KKyAgICAgKiBUaGUgc2Vzc2lvbiBiZWNvbWVzIG5vIGxvbmdlciB2YWxpZCBhbmQgdGhlIHJvdXRlIGNlYXNlcyB0byBiZSB1bmRlciBjb250cm9sCisgICAgICogb2YgdGhlIHNlc3Npb24uCisgICAgICogPC9wPjxwPgorICAgICAqIElmIHN1Y2Nlc3NmdWwsIHRoZSBzdGF0dXMgb2YgdGhlIHNlc3Npb24gaXMgc2V0IHRvCisgICAgICoge0BsaW5rIE1lZGlhU2Vzc2lvblN0YXR1cyNTRVNTSU9OX1NUQVRFX0VOREVEfSBhbmQgYSBzdGF0dXMgdXBkYXRlIGlzIHNlbnQgdG8KKyAgICAgKiB0aGUgc2Vzc2lvbidzIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXIuCisgICAgICogPC9wPjxwPgorICAgICAqIEFkZGl0aW9uYWxseSwgdGhlIHN0YXR1cyBvZiBhbGwgbWVkaWEgaXRlbXMgaW4gdGhlIHF1ZXVlIGlzIHNldCB0bworICAgICAqIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMjUExBWUJBQ0tfU1RBVEVfQ0FOQ0VMRUQgY2FuY2VsZWR9IGFuZCBhIHN0YXR1cyB1cGRhdGUgaXMgc2VudAorICAgICAqIHRvIHRoZSBhcHByb3ByaWF0ZSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVycyBpbmRpY2F0aW5nIHRoZSBuZXcgc3RhdHVzIG9mIGVhY2ggaXRlbS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mCisgICAgICogdGhlIHNlc3Npb24gdG8gZW5kLgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUKKyAgICAgKiBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIDxoMz5FcnJvcnM8L2gzPgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgaXMgdW5rbm93biBvciBubyBsb25nZXIgdmFsaWQuCisgICAgICogSW4gb3RoZXIgd29yZHMsIGl0IGlzIGFuIGVycm9yIHRvIGF0dGVtcHQgdG8gZW5kIGEgc2Vzc2lvbiBvdGhlciB0aGFuIHRoZQorICAgICAqIGN1cnJlbnQgc2Vzc2lvbi4KKyAgICAgKiA8L3A+PHVsPgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKKyAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fRU5EX1NFU1NJT04gPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLkVORF9TRVNTSU9OIjsKKworICAgIC8qKgorICAgICAqIEN1c3RvbSBtZWRpYSBjb250cm9sIGFjdGlvbjogU2VuZCB7QGxpbmsgI0VYVFJBX01FU1NBR0V9LgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYWN0aW9uIGFza3MgYSByb3V0ZSB0byBoYW5kbGUgYSBtZXNzYWdlIGRlc2NyaWJlZCBieSBFWFRSQV9NRVNTQUdFLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlIHNlc3Npb24KKyAgICAgKiB0byB3aGljaCB3aWxsIGhhbmRsZSB0aGlzIG1lc3NhZ2UuCisgICAgICogPGxpPntAbGluayAjRVhUUkFfTUVTU0FHRX0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBtZXNzYWdlIHRvIHNlbmQuCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+CisgICAgICogQW55IG1lc3NhZ2VzIGRlZmluZWQgYnkgZWFjaCBtZWRpYSByb3V0ZSBwcm92aWRlci4KKyAgICAgKgorICAgICAqIDxoMz5FcnJvcnM8L2gzPgorICAgICAqIEFueSBlcnJvciBtZXNzYWdlcyBkZWZpbmVkIGJ5IGVhY2ggbWVkaWEgcm91dGUgcHJvdmlkZXIuCisgICAgICoKKyAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU0VORF9NRVNTQUdFID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5TRU5EX01FU1NBR0UiOworCisgICAgLyogRXh0cmFzIGFuZCByZWxhdGVkIGNvbnN0YW50cy4gKi8KKworICAgIC8qKgorICAgICAqIEJ1bmRsZSBleHRyYTogTWVkaWEgc2Vzc2lvbiBpZC4KKyAgICAgKiA8cD4KKyAgICAgKiBBbiBvcGFxdWUgdW5pcXVlIGlkZW50aWZpZXIgdGhhdCBpZGVudGlmaWVzIHRoZSByZW1vdGUgcGxheWJhY2sgbWVkaWEgc2Vzc2lvbi4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVXNlZCB3aXRoIHZhcmlvdXMgYWN0aW9ucyB0byBzcGVjaWZ5IHRoZSBpZCBvZiB0aGUgbWVkaWEgc2Vzc2lvbiB0byBiZSBjb250cm9sbGVkLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBJbmNsdWRlZCBpbiBicm9hZGNhc3QgaW50ZW50cyBzZW50IHRvCisgICAgICoge0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgaXRlbSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyc30gdG8gaWRlbnRpZnkKKyAgICAgKiB0aGUgc2Vzc2lvbiB0byB3aGljaCB0aGUgaXRlbSBpbiBxdWVzdGlvbiBiZWxvbmdzLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBJbmNsdWRlZCBpbiBicm9hZGNhc3QgaW50ZW50cyBzZW50IHRvCisgICAgICoge0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgc2Vzc2lvbiBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyc30gdG8gaWRlbnRpZnkKKyAgICAgKiB0aGUgc2Vzc2lvbi4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhlIHZhbHVlIGlzIGEgdW5pcXVlIHN0cmluZyB2YWx1ZSBnZW5lcmF0ZWQgYnkgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyCisgICAgICogdG8gcmVwcmVzZW50IG9uZSBwYXJ0aWN1bGFyIG1lZGlhIHNlc3Npb24uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHNlZSAjQUNUSU9OX1BMQVkKKyAgICAgKiBAc2VlICNBQ1RJT05fU0VFSworICAgICAqIEBzZWUgI0FDVElPTl9HRVRfU1RBVFVTCisgICAgICogQHNlZSAjQUNUSU9OX1BBVVNFCisgICAgICogQHNlZSAjQUNUSU9OX1JFU1VNRQorICAgICAqIEBzZWUgI0FDVElPTl9TVE9QCisgICAgICogQHNlZSAjQUNUSU9OX1NUQVJUX1NFU1NJT04KKyAgICAgKiBAc2VlICNBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTCisgICAgICogQHNlZSAjQUNUSU9OX0VORF9TRVNTSU9OCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfU0VTU0lPTl9JRCA9CisgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuU0VTU0lPTl9JRCI7CisKKyAgICAvKioKKyAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIHNlc3Npb24gc3RhdHVzLgorICAgICAqIDxwPgorICAgICAqIFJldHVybmVkIGFzIGEgcmVzdWx0IGZyb20gbWVkaWEgc2Vzc2lvbiBhY3Rpb25zIHN1Y2ggYXMge0BsaW5rICNBQ1RJT05fU1RBUlRfU0VTU0lPTn0sCisgICAgICoge0BsaW5rICNBQ1RJT05fUEFVU0V9LCBhbmQge0BsaW5rICNBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTfQorICAgICAqIHRvIGRlc2NyaWJlIHRoZSBzdGF0dXMgb2YgdGhlIHNwZWNpZmllZCBtZWRpYSBzZXNzaW9uLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBJbmNsdWRlZCBpbiBicm9hZGNhc3QgaW50ZW50cyBzZW50IHRvCisgICAgICoge0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgc2Vzc2lvbiBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyc30gdG8gcHJvdmlkZQorICAgICAqIHVwZGF0ZWQgc3RhdHVzIGluZm9ybWF0aW9uLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgYW5kcm9pZC5vcy5CdW5kbGV9IG9mIGRhdGEgdGhhdCBjYW4gYmUgY29udmVydGVkIGludG8KKyAgICAgKiBhIHtAbGluayBNZWRpYVNlc3Npb25TdGF0dXN9IG9iamVjdCB1c2luZworICAgICAqIHtAbGluayBNZWRpYVNlc3Npb25TdGF0dXMjZnJvbUJ1bmRsZSBNZWRpYVNlc3Npb25TdGF0dXMuZnJvbUJ1bmRsZX0uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHNlZSAjQUNUSU9OX1BMQVkKKyAgICAgKiBAc2VlICNBQ1RJT05fU0VFSworICAgICAqIEBzZWUgI0FDVElPTl9HRVRfU1RBVFVTCisgICAgICogQHNlZSAjQUNUSU9OX1BBVVNFCisgICAgICogQHNlZSAjQUNUSU9OX1JFU1VNRQorICAgICAqIEBzZWUgI0FDVElPTl9TVE9QCisgICAgICogQHNlZSAjQUNUSU9OX1NUQVJUX1NFU1NJT04KKyAgICAgKiBAc2VlICNBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTCisgICAgICogQHNlZSAjQUNUSU9OX0VORF9TRVNTSU9OCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfU0VTU0lPTl9TVEFUVVMgPQorICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLlNFU1NJT05fU1RBVFVTIjsKKworICAgIC8qKgorICAgICAqIEJ1bmRsZSBleHRyYTogTWVkaWEgc2Vzc2lvbiBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyLgorICAgICAqIDxwPgorICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI0FDVElPTl9TVEFSVF9TRVNTSU9OfSB0byBzcGVjaWZ5IGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9IGZvciBhCisgICAgICogYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIHN0YXR1cyB1cGRhdGVzIGFib3V0IHRoZSBtZWRpYSBzZXNzaW9uLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBXaGVuZXZlciB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uIGNoYW5nZXMsIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciB3aWxsCisgICAgICogc2VuZCBhIGJyb2FkY2FzdCB0byB0aGUgcGVuZGluZyBpbnRlbnQgd2l0aCBleHRyYXMgdGhhdCBpZGVudGlmeSB0aGUgc2Vzc2lvbgorICAgICAqIGlkIGFuZCBpdHMgdXBkYXRlZCBzdGF0dXMuCisgICAgICogPC9wPjxwPgorICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBQZW5kaW5nSW50ZW50fS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiA8aDM+QnJvYWRjYXN0IGV4dHJhczwvaDM+CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZgorICAgICAqIHRoZSBzZXNzaW9uLgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUKKyAgICAgKiBzZXNzaW9uIGFzIGEgYnVuZGxlIHRoYXQgY2FuIGJlIGRlY29kZWQgaW50byBhIHtAbGluayBNZWRpYVNlc3Npb25TdGF0dXN9IG9iamVjdC4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHNlZSAjQUNUSU9OX1NUQVJUX1NFU1NJT04KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TRVNTSU9OX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgPQorICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLlNFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUiI7CisKKyAgICAvKioKKyAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIG1lc3NhZ2UgcmVjZWl2ZXIuCisgICAgICogPHA+CisgICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1NUQVJUX1NFU1NJT059IHRvIHNwZWNpZnkgYSB7QGxpbmsgUGVuZGluZ0ludGVudH0gZm9yIGEKKyAgICAgKiBicm9hZGNhc3QgcmVjZWl2ZXIgdGhhdCB3aWxsIHJlY2VpdmUgbWVzc2FnZXMgZnJvbSB0aGUgbWVkaWEgc2Vzc2lvbi4KKyAgICAgKiA8L3A+PHA+CisgICAgICogV2hlbiB0aGUgbWVkaWEgc2Vzc2lvbiBoYXMgYSBtZXNzYWdlIHRvIHNlbmQsIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciB3aWxsCisgICAgICogc2VuZCBhIGJyb2FkY2FzdCB0byB0aGUgcGVuZGluZyBpbnRlbnQgd2l0aCBleHRyYXMgdGhhdCBpZGVudGlmeSB0aGUgc2Vzc2lvbgorICAgICAqIGlkIGFuZCBpdHMgbWVzc2FnZS4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIDxoMz5Ccm9hZGNhc3QgZXh0cmFzPC9oMz4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mCisgICAgICogdGhlIHNlc3Npb24uCisgICAgICogPGxpPntAbGluayAjRVhUUkFfTUVTU0FHRX0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBtZXNzYWdlIGZyb20KKyAgICAgKiB0aGUgc2Vzc2lvbiBhcyBhIGJ1bmRsZSBvYmplY3QuCisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEBzZWUgI0FDVElPTl9TVEFSVF9TRVNTSU9OCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfTUVTU0FHRV9SRUNFSVZFUiA9CisgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuTUVTU0FHRV9SRUNFSVZFUiI7CisKKyAgICAvKioKKyAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIGl0ZW0gaWQuCisgICAgICogPHA+CisgICAgICogQW4gb3BhcXVlIHVuaXF1ZSBpZGVudGlmaWVyIHJldHVybmVkIGFzIGEgcmVzdWx0IGZyb20ge0BsaW5rICNBQ1RJT05fUExBWX0gb3IKKyAgICAgKiB7QGxpbmsgI0FDVElPTl9FTlFVRVVFfSB0aGF0IHJlcHJlc2VudHMgdGhlIG1lZGlhIGl0ZW0gdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUKKyAgICAgKiBwbGF5YmFjayByZXF1ZXN0LgorICAgICAqIDwvcD48cD4KKyAgICAgKiBVc2VkIHdpdGggdmFyaW91cyBhY3Rpb25zIHRvIHNwZWNpZnkgdGhlIGlkIG9mIHRoZSBtZWRpYSBpdGVtIHRvIGJlIGNvbnRyb2xsZWQuCisgICAgICogPC9wPjxwPgorICAgICAqIEluY2x1ZGVkIGluIGJyb2FkY2FzdCBpbnRlbnRzIHNlbnQgdG8KKyAgICAgKiB7QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUiBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyc30gdG8gaWRlbnRpZnkKKyAgICAgKiB0aGUgaXRlbSBpbiBxdWVzdGlvbi4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhlIHZhbHVlIGlzIGEgdW5pcXVlIHN0cmluZyB2YWx1ZSBnZW5lcmF0ZWQgYnkgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyCisgICAgICogdG8gcmVwcmVzZW50IG9uZSBwYXJ0aWN1bGFyIG1lZGlhIGl0ZW0uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHNlZSAjQUNUSU9OX1BMQVkKKyAgICAgKiBAc2VlICNBQ1RJT05fRU5RVUVVRQorICAgICAqIEBzZWUgI0FDVElPTl9TRUVLCisgICAgICogQHNlZSAjQUNUSU9OX0dFVF9TVEFUVVMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9JVEVNX0lEID0KKyAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5JVEVNX0lEIjsKKworICAgIC8qKgorICAgICAqIEJ1bmRsZSBleHRyYTogTWVkaWEgaXRlbSBzdGF0dXMuCisgICAgICogPHA+CisgICAgICogUmV0dXJuZWQgYXMgYSByZXN1bHQgZnJvbSBtZWRpYSBpdGVtIGFjdGlvbnMgc3VjaCBhcyB7QGxpbmsgI0FDVElPTl9QTEFZfSwKKyAgICAgKiB7QGxpbmsgI0FDVElPTl9FTlFVRVVFfSwge0BsaW5rICNBQ1RJT05fU0VFS30sIGFuZCB7QGxpbmsgI0FDVElPTl9HRVRfU1RBVFVTfQorICAgICAqIHRvIGRlc2NyaWJlIHRoZSBzdGF0dXMgb2YgdGhlIHNwZWNpZmllZCBtZWRpYSBpdGVtLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBJbmNsdWRlZCBpbiBicm9hZGNhc3QgaW50ZW50cyBzZW50IHRvCisgICAgICoge0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgaXRlbSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyc30gdG8gcHJvdmlkZQorICAgICAqIHVwZGF0ZWQgc3RhdHVzIGluZm9ybWF0aW9uLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgYW5kcm9pZC5vcy5CdW5kbGV9IG9mIGRhdGEgdGhhdCBjYW4gYmUgY29udmVydGVkIGludG8KKyAgICAgKiBhIHtAbGluayBNZWRpYUl0ZW1TdGF0dXN9IG9iamVjdCB1c2luZworICAgICAqIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMjZnJvbUJ1bmRsZSBNZWRpYUl0ZW1TdGF0dXMuZnJvbUJ1bmRsZX0uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHNlZSAjQUNUSU9OX1BMQVkKKyAgICAgKiBAc2VlICNBQ1RJT05fRU5RVUVVRQorICAgICAqIEBzZWUgI0FDVElPTl9TRUVLCisgICAgICogQHNlZSAjQUNUSU9OX0dFVF9TVEFUVVMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9JVEVNX1NUQVRVUyA9CisgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuSVRFTV9TVEFUVVMiOworCisgICAgLyoqCisgICAgICogTG9uZyBleHRyYTogTWVkaWEgaXRlbSBjb250ZW50IHBvc2l0aW9uLgorICAgICAqIDxwPgorICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI0FDVElPTl9QTEFZfSBvciB7QGxpbmsgI0FDVElPTl9FTlFVRVVFfSB0byBzcGVjaWZ5IHRoZQorICAgICAqIHN0YXJ0aW5nIHBsYXliYWNrIHBvc2l0aW9uLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fU0VFS30gdG8gc2V0IGEgbmV3IHBsYXliYWNrIHBvc2l0aW9uLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGUgdmFsdWUgaXMgYSBsb25nIGludGVnZXIgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbnRlbnQuCisgICAgICogPHA+CisgICAgICoKKyAgICAgKiBAc2VlICNBQ1RJT05fUExBWQorICAgICAqIEBzZWUgI0FDVElPTl9FTlFVRVVFCisgICAgICogQHNlZSAjQUNUSU9OX1NFRUsKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9JVEVNX0NPTlRFTlRfUE9TSVRJT04gPQorICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLklURU1fUE9TSVRJT04iOworCisgICAgLyoqCisgICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBpdGVtIG1ldGFkYXRhLgorICAgICAqIDxwPgorICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI0FDVElPTl9QTEFZfSBvciB7QGxpbmsgI0FDVElPTl9FTlFVRVVFfSB0byBzcGVjaWZ5IG1ldGFkYXRhCisgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZW50IG9mIGEgbWVkaWEgaXRlbS4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfSBvZiBtZXRhZGF0YSBrZXktdmFsdWUgcGFpcnMgYXMgZGVmaW5lZAorICAgICAqIGluIHtAbGluayBNZWRpYUl0ZW1NZXRhZGF0YX0uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHNlZSAjQUNUSU9OX1BMQVkKKyAgICAgKiBAc2VlICNBQ1RJT05fRU5RVUVVRQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lURU1fTUVUQURBVEEgPQorICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLklURU1fTUVUQURBVEEiOworCisgICAgLyoqCisgICAgICogQnVuZGxlIGV4dHJhOiBIVFRQIHJlcXVlc3QgaGVhZGVycy4KKyAgICAgKiA8cD4KKyAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fUExBWX0gb3Ige0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gdG8gc3BlY2lmeSBIVFRQIHJlcXVlc3QKKyAgICAgKiBoZWFkZXJzIHRvIGJlIGluY2x1ZGVkIHdoZW4gZmV0Y2hpbmcgdG8gdGhlIGNvbnRlbnQgaW5kaWNhdGVkIGJ5IHRoZSBtZWRpYQorICAgICAqIGl0ZW0ncyBkYXRhIFVyaS4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhpcyBleHRyYSBtYXkgYmUgdXNlZCB0byBwcm92aWRlIGF1dGhlbnRpY2F0aW9uIHRva2VucyBhbmQgb3RoZXIKKyAgICAgKiBwYXJhbWV0ZXJzIHRvIHRoZSBzZXJ2ZXIgc2VwYXJhdGVseSBmcm9tIHRoZSBtZWRpYSBpdGVtJ3MgZGF0YSBVcmkuCisgICAgICogPC9wPjxwPgorICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBhbmRyb2lkLm9zLkJ1bmRsZX0gb2Ygc3RyaW5nIGJhc2VkIGtleS12YWx1ZSBwYWlycworICAgICAqIHRoYXQgZGVzY3JpYmUgdGhlIEhUVFAgcmVxdWVzdCBoZWFkZXJzLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCisgICAgICogQHNlZSAjQUNUSU9OX0VOUVVFVUUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9JVEVNX0hUVFBfSEVBREVSUyA9CisgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuSFRUUF9IRUFERVJTIjsKKworICAgIC8qKgorICAgICAqIEJ1bmRsZSBleHRyYTogTWVkaWEgaXRlbSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyLgorICAgICAqIDxwPgorICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI0FDVElPTl9QTEFZfSBvciB7QGxpbmsgI0FDVElPTl9FTlFVRVVFfSB0byBzcGVjaWZ5CisgICAgICogYSB7QGxpbmsgUGVuZGluZ0ludGVudH0gZm9yIGEKKyAgICAgKiBicm9hZGNhc3QgcmVjZWl2ZXIgdGhhdCB3aWxsIHJlY2VpdmUgc3RhdHVzIHVwZGF0ZXMgYWJvdXQgYSBwYXJ0aWN1bGFyCisgICAgICogbWVkaWEgaXRlbS4KKyAgICAgKiA8L3A+PHA+CisgICAgICogV2hlbmV2ZXIgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgaXRlbSBjaGFuZ2VzLCB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgd2lsbAorICAgICAqIHNlbmQgYSBicm9hZGNhc3QgdG8gdGhlIHBlbmRpbmcgaW50ZW50IHdpdGggZXh0cmFzIHRoYXQgaWRlbnRpZnkgdGhlIHNlc3Npb24KKyAgICAgKiB0byB3aGljaCB0aGUgaXRlbSBiZWxvbmdzLCB0aGUgc2Vzc2lvbiBzdGF0dXMsIHRoZSBpdGVtJ3MgaWQKKyAgICAgKiBhbmQgdGhlIGl0ZW0ncyB1cGRhdGVkIHN0YXR1cy4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhlIHNhbWUgcGVuZGluZyBpbnRlbnQgYW5kIGJyb2FkY2FzdCByZWNlaXZlciBtYXkgYmUgc2hhcmVkIGJ5IGFueSBudW1iZXIgb2YKKyAgICAgKiBtZWRpYSBpdGVtcyBzaW5jZSB0aGUgYnJvYWRjYXN0IGludGVudCBpbmNsdWRlcyB0aGUgbWVkaWEgc2Vzc2lvbiBpZAorICAgICAqIGFuZCBtZWRpYSBpdGVtIGlkLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgUGVuZGluZ0ludGVudH0uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogPGgzPkJyb2FkY2FzdCBleHRyYXM8L2gzPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YKKyAgICAgKiB0aGUgc2Vzc2lvbiB0byB3aGljaCB0aGUgaXRlbSBpbiBxdWVzdGlvbiBiZWxvbmdzLgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQorICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbWVkaWEgaXRlbSBpZCBvZiB0aGUKKyAgICAgKiBtZWRpYSBpdGVtIGluIHF1ZXN0aW9uLgorICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUKKyAgICAgKiBpdGVtIGFzIGEgYnVuZGxlIHRoYXQgY2FuIGJlIGRlY29kZWQgaW50byBhIHtAbGluayBNZWRpYUl0ZW1TdGF0dXN9IG9iamVjdC4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHNlZSAjQUNUSU9OX1BMQVkKKyAgICAgKiBAc2VlICNBQ1RJT05fRU5RVUVVRQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUiA9CisgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIjsKKworICAgIC8qKgorICAgICAqIEJ1bmRsZSBleHRyYTogTWVzc2FnZS4KKyAgICAgKiA8cD4KKyAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fU0VORF9NRVNTQUdFfSwgYW5kIGluY2x1ZGVkIGluIGJyb2FkY2FzdCBpbnRlbnRzIHNlbnQgdG8KKyAgICAgKiB7QGxpbmsgI0VYVFJBX01FU1NBR0VfUkVDRUlWRVIgbWVzc2FnZSByZWNlaXZlcnN9IHRvIGRlc2NyaWJlIGEgbWVzc2FnZSBiZXR3ZWVuIGEKKyAgICAgKiBzZXNzaW9uIGFuZCBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgYW5kcm9pZC5vcy5CdW5kbGV9LgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9NRVNTQUdFID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLk1FU1NBR0UiOworCisgICAgLyoqCisgICAgICogSW50ZWdlciBleHRyYTogRXJyb3IgY29kZS4KKyAgICAgKiA8cD4KKyAgICAgKiBVc2VkIHdpdGggYWxsIG1lZGlhIGNvbnRyb2wgcmVxdWVzdHMgdG8gZGVzY3JpYmUgdGhlIGNhdXNlIG9mIGFuIGVycm9yLgorICAgICAqIFRoaXMgZXh0cmEgbWF5IGJlIG9taXR0ZWQgd2hlbiB0aGUgZXJyb3IgaXMgdW5rbm93bi4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhlIHZhbHVlIGlzIG9uZSBvZjoge0BsaW5rICNFUlJPUl9VTktOT1dOfSwge0BsaW5rICNFUlJPUl9VTlNVUFBPUlRFRF9PUEVSQVRJT059LAorICAgICAqIHtAbGluayAjRVJST1JfSU5WQUxJRF9TRVNTSU9OX0lEfSwge0BsaW5rICNFUlJPUl9JTlZBTElEX0lURU1fSUR9LgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9FUlJPUl9DT0RFID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLkVSUk9SX0NPREUiOworCisgICAgLyoqCisgICAgICogRXJyb3IgY29kZTogQW4gdW5rbm93biBlcnJvciBvY2N1cnJlZC4KKyAgICAgKgorICAgICAqIEBzZWUgI0VYVFJBX0VSUk9SX0NPREUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9VTktOT1dOID0gMDsKKworICAgIC8qKgorICAgICAqIEVycm9yIGNvZGU6IFRoZSBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKgorICAgICAqIEBzZWUgI0VYVFJBX0VSUk9SX0NPREUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9VTlNVUFBPUlRFRF9PUEVSQVRJT04gPSAxOworCisgICAgLyoqCisgICAgICogRXJyb3IgY29kZTogVGhlIHNlc3Npb24gaWQgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IHdhcyBpbnZhbGlkLgorICAgICAqCisgICAgICogQHNlZSAjRVhUUkFfRVJST1JfQ09ERQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0lOVkFMSURfU0VTU0lPTl9JRCA9IDI7CisKKyAgICAvKioKKyAgICAgKiBFcnJvciBjb2RlOiBUaGUgaXRlbSBpZCBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3Qgd2FzIGludmFsaWQuCisgICAgICoKKyAgICAgKiBAc2VlICNFWFRSQV9FUlJPUl9DT0RFCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfSU5WQUxJRF9JVEVNX0lEID0gMzsKKworICAgIHByaXZhdGUgTWVkaWFDb250cm9sSW50ZW50KCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYUl0ZW1NZXRhZGF0YS5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhSXRlbU1ldGFkYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUyZGRiNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYUl0ZW1NZXRhZGF0YS5qYXZhCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworLyoqCisgKiBDb25zdGFudHMgZm9yIHNwZWNpZnlpbmcgbWV0YWRhdGEgYWJvdXQgYSBtZWRpYSBpdGVtIGFzIGEge0BsaW5rIEJ1bmRsZX0uCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgaXMgcGFydCBvZiB0aGUgcmVtb3RlIHBsYXliYWNrIHByb3RvY29sIGRlc2NyaWJlZCBieSB0aGUKKyAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgTWVkaWFDb250cm9sSW50ZW50fSBjbGFzcy4KKyAqIDwvcD48cD4KKyAqIE1lZGlhIGl0ZW0gbWV0YWRhdGEgaXMgZGVzY3JpYmVkIGFzIGEgYnVuZGxlIG9mIGtleS92YWx1ZSBwYWlycyBhcyBkZWZpbmVkCisgKiBpbiB0aGlzIGNsYXNzLiAgVGhlIGRvY3VtZW50YXRpb24gc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHZhbHVlIGFzc29jaWF0ZWQKKyAqIHdpdGggZWFjaCBrZXkuCisgKiA8L3A+PHA+CisgKiBBbiBhcHBsaWNhdGlvbiBtYXkgc3BlY2lmeSBhZGRpdGlvbmFsIGN1c3RvbSBtZXRhZGF0YSBrZXlzIGJ1dCB0aGVyZSBpcyBubyBndWFyYW50ZWUKKyAqIHRoYXQgdGhleSB3aWxsIGJlIHJlY29nbml6ZWQgYnkgdGhlIGRlc3RpbmF0aW9uLgorICogPC9wPgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFJdGVtTWV0YWRhdGEgeworICAgIC8qCisgICAgICogTm90ZTogTWVkaWFNZXRhZGF0YVJldHJpZXZlciBhbHNvIGRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIG1ldGFkYXRhIGtleXMgdGhhdCBjYW4gYmUKKyAgICAgKiByZXRyaWV2ZWQgZnJvbSBhIGNvbnRlbnQgc3RyZWFtIGFsdGhvdWdoIHRoZSByZXByZXNlbnRhdGlvbiBpcyBzb21ld2hhdCBkaWZmZXJlbnQgaGVyZQorICAgICAqIHNpbmNlIHdlIGFyZSBzZW5kaW5nIHRoZSBkYXRhIHRvIGEgcmVtb3RlIGVuZHBvaW50LgorICAgICAqLworCisgICAgcHJpdmF0ZSBNZWRpYUl0ZW1NZXRhZGF0YSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdHJpbmcga2V5OiBBbGJ1bSBhcnRpc3QgbmFtZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdmFsdWUgaXMgYSBzdHJpbmcgc3VpdGFibGUgZm9yIGRpc3BsYXkuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BTEJVTV9BUlRJU1QgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BTEJVTV9BUlRJU1QiOworCisgICAgLyoqCisgICAgICogU3RyaW5nIGtleTogQWxidW0gdGl0bGUuCisgICAgICogPHA+CisgICAgICogVGhlIHZhbHVlIGlzIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBkaXNwbGF5LgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQUxCVU1fVElUTEUgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BTEJVTV9USVRMRSI7CisKKyAgICAvKioKKyAgICAgKiBTdHJpbmcga2V5OiBBcnR3b3JrIFVyaS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdmFsdWUgaXMgYSBzdHJpbmcgVVJJIGZvciBhbiBpbWFnZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVkaWEgaXRlbSwKKyAgICAgKiBzdWNoIGFzIGFsYnVtIG9yIGNvdmVyIGFydC4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FSVFdPUktfVVJJID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQVJUV09SS19VUkkiOworCisgICAgLyoqCisgICAgICogU3RyaW5nIGtleTogQXJ0aXN0IG5hbWUuCisgICAgICogPHA+CisgICAgICogVGhlIHZhbHVlIGlzIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBkaXNwbGF5LgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQVJUSVNUID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQVJUSVNUIjsKKworICAgIC8qKgorICAgICAqIFN0cmluZyBrZXk6IEF1dGhvciBuYW1lLgorICAgICAqIDxwPgorICAgICAqIFRoZSB2YWx1ZSBpcyBhIHN0cmluZyBzdWl0YWJsZSBmb3IgZGlzcGxheS4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FVVEhPUiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkFVVEhPUiI7CisKKyAgICAvKioKKyAgICAgKiBTdHJpbmcga2V5OiBDb21wb3NlciBuYW1lLgorICAgICAqIDxwPgorICAgICAqIFRoZSB2YWx1ZSBpcyBhIHN0cmluZyBzdWl0YWJsZSBmb3IgZGlzcGxheS4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTVBPU0VSID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQ09NUE9TRVIiOworCisgICAgLyoqCisgICAgICogU3RyaW5nIGtleTogVHJhY2sgdGl0bGUuCisgICAgICogPHA+CisgICAgICogVGhlIHZhbHVlIGlzIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBkaXNwbGF5LgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVElUTEUgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5USVRMRSI7CisKKyAgICAvKioKKyAgICAgKiBJbnRlZ2VyIGtleTogWWVhciBvZiBwdWJsaWNhdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdmFsdWUgaXMgYW4gaW50ZWdlciB5ZWFyIG51bWJlci4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1lFQVIgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5ZRUFSIjsKKworICAgIC8qKgorICAgICAqIEludGVnZXIga2V5OiBUcmFjayBudW1iZXIgKHN1Y2ggYXMgYSB0cmFjayBvbiBhIENEKS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdmFsdWUgaXMgYSBvbmUtYmFzZWQgaW50ZWdlciB0cmFjayBudW1iZXIuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9UUkFDS19OVU1CRVIgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5UUkFDS19OVU1CRVIiOworCisgICAgLyoqCisgICAgICogSW50ZWdlciBrZXk6IERpc2MgbnVtYmVyIHdpdGhpbiBhIGNvbGxlY3Rpb24uCisgICAgICogPHA+CisgICAgICogVGhlIHZhbHVlIGlzIGEgb25lLWJhc2VkIGludGVnZXIgZGlzYyBudW1iZXIuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ESVNDX05VTUJFUiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkRJU0NfTlVNQkVSIjsKKworICAgIC8qKgorICAgICAqIExvbmcga2V5OiBJdGVtIHBsYXliYWNrIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdmFsdWUgaXMgYSA8Y29kZT5sb25nPC9jb2RlPiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGUgZHVyYXRpb24gbWV0YWRhdGEgaXMgb25seSBhIGhpbnQgdG8gZW5hYmxlIGEgcmVtb3RlIG1lZGlhIHBsYXllciB0bworICAgICAqIGd1ZXNzIHRoZSBkdXJhdGlvbiBvZiB0aGUgY29udGVudCBiZWZvcmUgaXQgYWN0dWFsbHkgb3BlbnMgdGhlIG1lZGlhIHN0cmVhbS4KKyAgICAgKiBUaGUgcmVtb3RlIG1lZGlhIHBsYXllciBzaG91bGQgc3RpbGwgZGV0ZXJtaW5lIHRoZSBhY3R1YWwgY29udGVudCBkdXJhdGlvbiBmcm9tCisgICAgICogdGhlIG1lZGlhIHN0cmVhbSBpdHNlbGYgaW5kZXBlbmRlbnQgb2YgdGhlIHZhbHVlIHRoYXQgbWF5IGJlIHNwZWNpZmllZCBieSB0aGlzIGtleS4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RVUkFUSU9OID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuRFVSQVRJT04iOworfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhSXRlbVN0YXR1cy5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhSXRlbVN0YXR1cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZWEyZDUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFJdGVtU3RhdHVzLmphdmEKQEAgLTAsMCArMSwzOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudXRpbC5UaW1lVXRpbHM7CisKKy8qKgorICogRGVzY3JpYmVzIHRoZSBwbGF5YmFjayBzdGF0dXMgb2YgYSBtZWRpYSBpdGVtLgorICogPHA+CisgKiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgdGhlIHJlbW90ZSBwbGF5YmFjayBwcm90b2NvbCBkZXNjcmliZWQgYnkgdGhlCisgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IE1lZGlhQ29udHJvbEludGVudH0gY2xhc3MuCisgKiA8L3A+PHA+CisgKiBBcyBhIG1lZGlhIGl0ZW0gaXMgcGxheWVkLCBpdCB0cmFuc2l0aW9ucyB0aHJvdWdoIGEgc2VxdWVuY2Ugb2Ygc3RhdGVzIGluY2x1ZGluZzoKKyAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUEVORElORyBwZW5kaW5nfSwge0BsaW5rICNQTEFZQkFDS19TVEFURV9CVUZGRVJJTkcgYnVmZmVyaW5nfSwKKyAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUExBWUlORyBwbGF5aW5nfSwge0BsaW5rICNQTEFZQkFDS19TVEFURV9QQVVTRUQgcGF1c2VkfSwKKyAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfRklOSVNIRUQgZmluaXNoZWR9LCB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0NBTkNFTEVEIGNhbmNlbGVkfSwKKyAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUQgaW52YWxpZGF0ZWR9LCBhbmQKKyAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfRVJST1IgZXJyb3J9LiAgUmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gb2YgZWFjaCBzdGF0ZQorICogZm9yIGFuIGV4cGxhbmF0aW9uIG9mIGl0cyBtZWFuaW5nLgorICogPC9wPjxwPgorICogV2hpbGUgdGhlIGl0ZW0gaXMgcGxheWluZywgdGhlIHBsYXliYWNrIHN0YXR1cyBtYXkgYWxzbyBpbmNsdWRlIHByb2dyZXNzIGluZm9ybWF0aW9uCisgKiBhYm91dCB0aGUge0BsaW5rICNnZXRDb250ZW50UG9zaXRpb24gY29udGVudCBwb3NpdGlvbn0gYW5kCisgKiB7QGxpbmsgI2dldENvbnRlbnREdXJhdGlvbiBjb250ZW50IGR1cmF0aW9ufSBhbHRob3VnaCBub3QgYWxsIHJvdXRlIGRlc3RpbmF0aW9ucworICogd2lsbCByZXBvcnQgaXQuCisgKiA8L3A+PHA+CisgKiBUbyBtb25pdG9yIHBsYXliYWNrIHN0YXR1cywgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBzdXBwbHkgYSB7QGxpbmsgUGVuZGluZ0ludGVudH0gdG8gdXNlIGFzIHRoZQorICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgaXRlbSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyfQorICogZm9yIGEgZ2l2ZW4ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5YmFjayByZXF1ZXN0fS4gIE5vdGUgdGhhdAorICogdGhlIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXIgd2lsbCBvbmx5IGJlIGludm9rZWQgZm9yIG1ham9yIHN0YXR1cyBjaGFuZ2VzIHN1Y2ggYXMgYQorICogdHJhbnNpdGlvbiBmcm9tIHBsYXlpbmcgdG8gZmluaXNoZWQuCisgKiA8L3A+PHAgY2xhc3M9Im5vdGUiPgorICogVGhlIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXIgd2lsbCBub3QgYmUgaW52b2tlZCBmb3IgbWlub3IgcHJvZ3Jlc3MgdXBkYXRlcyBzdWNoIGFzCisgKiBjaGFuZ2VzIHRvIHBsYXliYWNrIHBvc2l0aW9uIG9yIGR1cmF0aW9uLiAgSWYgdGhlIGFwcGxpY2F0aW9uIHdhbnRzIHRvIG1vbml0b3IKKyAqIHBsYXliYWNrIHByb2dyZXNzLCB0aGVuIGl0IG11c3QgdXNlIHRoZQorICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NUQVRVUyBnZXQgc3RhdHVzIHJlcXVlc3R9IHRvIHBvbGwgZm9yIGNoYW5nZXMKKyAqIHBlcmlvZGljYWxseSBhbmQgZXN0aW1hdGUgdGhlIHBsYXliYWNrIHBvc2l0aW9uIHdoaWxlIHBsYXlpbmcuICBOb3RlIHRoYXQgdGhlcmUgbWF5CisgKiBiZSBhIHNpZ25pZmljYW50IHBvd2VyIGltcGFjdCB0byBwb2xsaW5nIHNvIHRoZSBhcHBsaWNhdGlvbiBpcyBhZHZpc2VkIG9ubHkKKyAqIHRvIHBvbGwgd2hlbiB0aGUgc2NyZWVuIGlzIG9uIGFuZCBuZXZlciBtb3JlIHRoYW4gYWJvdXQgb25jZSBldmVyeSA1IHNlY29uZHMgb3Igc28uCisgKiA8L3A+PHA+CisgKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkIHVzaW5nIGEge0BsaW5rIEJ1aWxkZXJ9IGluc3RhbmNlLgorICogPC9wPgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFJdGVtU3RhdHVzIHsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9USU1FU1RBTVAgPSAidGltZXN0YW1wIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QTEFZQkFDS19TVEFURSA9ICJwbGF5YmFja1N0YXRlIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05URU5UX1BPU0lUSU9OID0gImNvbnRlbnRQb3NpdGlvbiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OVEVOVF9EVVJBVElPTiA9ICJjb250ZW50RHVyYXRpb24iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VYVFJBUyA9ICJleHRyYXMiOworCisgICAgZmluYWwgQnVuZGxlIG1CdW5kbGU7CisKKyAgICAvKioKKyAgICAgKiBQbGF5YmFjayBzdGF0ZTogUGVuZGluZy4KKyAgICAgKiA8cD4KKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXRlbSBoYXMgbm90IHlldCBzdGFydGVkIHBsYXliYWNrIGJ1dCB3aWxsIGJlIHBsYXllZCBldmVudHVhbGx5LgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9QRU5ESU5HID0gMDsKKworICAgIC8qKgorICAgICAqIFBsYXliYWNrIHN0YXRlOiBQbGF5aW5nLgorICAgICAqIDxwPgorICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBpdGVtIGlzIGN1cnJlbnRseSBwbGF5aW5nLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9QTEFZSU5HID0gMTsKKworICAgIC8qKgorICAgICAqIFBsYXliYWNrIHN0YXRlOiBQYXVzZWQuCisgICAgICogPHA+CisgICAgICogSW5kaWNhdGVzIHRoYXQgcGxheWJhY2sgb2YgdGhlIG1lZGlhIGl0ZW0gaGFzIGJlZW4gcGF1c2VkLiAgUGxheWJhY2sgY2FuIGJlCisgICAgICogcmVzdW1lZCB1c2luZyB0aGUge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVTVU1FIHJlc3VtZX0gYWN0aW9uLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9QQVVTRUQgPSAyOworCisgICAgLyoqCisgICAgICogUGxheWJhY2sgc3RhdGU6IEJ1ZmZlcmluZyBvciBzZWVraW5nIHRvIGEgbmV3IHBvc2l0aW9uLgorICAgICAqIDxwPgorICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBpdGVtIGhhcyBiZWVuIHRlbXBvcmFyaWx5IGludGVycnVwdGVkCisgICAgICogdG8gZmV0Y2ggbW9yZSBjb250ZW50LiAgUGxheWJhY2sgd2lsbCBjb250aW51ZSBhdXRvbWF0aWNhbGx5CisgICAgICogd2hlbiBlbm91Z2ggY29udGVudCBoYXMgYmVlbiBidWZmZXJlZC4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfQlVGRkVSSU5HID0gMzsKKworICAgIC8qKgorICAgICAqIFBsYXliYWNrIHN0YXRlOiBGaW5pc2hlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXRlbSBwbGF5ZWQgdG8gdGhlIGVuZCBvZiB0aGUgY29udGVudCBhbmQgZmluaXNoZWQgbm9ybWFsbHkuCisgICAgICogPC9wPjxwPgorICAgICAqIEEgZmluaXNoZWQgbWVkaWEgaXRlbSBjYW5ub3QgYmUgcmVzdW1lZC4gIFRvIHBsYXkgdGhlIGNvbnRlbnQgYWdhaW4sIHRoZSBhcHBsaWNhdGlvbgorICAgICAqIG11c3Qgc2VuZCBhIG5ldyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZIHBsYXl9IG9yCisgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfSBhY3Rpb24uCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NUQVRFX0ZJTklTSEVEID0gNDsKKworICAgIC8qKgorICAgICAqIFBsYXliYWNrIHN0YXRlOiBDYW5jZWxlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXRlbSB3YXMgZXhwbGljaXRseSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlIGJ5IHRoZQorICAgICAqIGFwcGxpY2F0aW9uLiAgSXRlbXMgbWF5IGJlIGNhbmNlbGVkIGFuZCByZW1vdmVkIGZyb20gdGhlIHF1ZXVlIHVzaW5nCisgICAgICogdGhlIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFTU9WRSByZW1vdmV9IG9yCisgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RPUCBzdG9wfSBhY3Rpb24gb3IgYnkgaXNzdWluZworICAgICAqIGFub3RoZXIge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5fSBhY3Rpb24gdGhhdCBoYXMgdGhlCisgICAgICogc2lkZS1lZmZlY3Qgb2YgY2xlYXJpbmcgdGhlIHF1ZXVlLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBBIGNhbmNlbGVkIG1lZGlhIGl0ZW0gY2Fubm90IGJlIHJlc3VtZWQuICBUbyBwbGF5IHRoZSBjb250ZW50IGFnYWluLCB0aGUKKyAgICAgKiBhcHBsaWNhdGlvbiBtdXN0IHNlbmQgYSBuZXcge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5fSBvcgorICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0gYWN0aW9uLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9DQU5DRUxFRCA9IDU7CisKKyAgICAvKioKKyAgICAgKiBQbGF5YmFjayBzdGF0ZTogSW52YWxpZGF0ZWQuCisgICAgICogPHA+CisgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIGl0ZW0gd2FzIGludmFsaWRhdGVkIHBlcm1hbmVudGx5IGFuZCBpbnZvbHVudGFyaWx5LgorICAgICAqIFRoaXMgc3RhdGUgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBtZWRpYSBpdGVtIHdhcyBpbnZhbGlkYXRlZCBhbmQgcmVtb3ZlZAorICAgICAqIGZyb20gdGhlIHF1ZXVlIGJlY2F1c2UgdGhlIHNlc3Npb24gdG8gd2hpY2ggaXQgYmVsb25ncyB3YXMgaW52YWxpZGF0ZWQKKyAgICAgKiAodHlwaWNhbGx5IGJ5IGFub3RoZXIgYXBwbGljYXRpb24gdGFraW5nIGNvbnRyb2wgb2YgdGhlIHJvdXRlKS4KKyAgICAgKiA8L3A+PHA+CisgICAgICogV2hlbiBpbnZhbGlkYXRpb24gb2NjdXJzLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGdlbmVyYWxseSB3YWl0IGZvciB0aGUgdXNlcgorICAgICAqIHRvIHBlcmZvcm0gYW4gZXhwbGljaXQgYWN0aW9uLCBzdWNoIGFzIGNsaWNraW5nIG9uIGEgcGxheSBidXR0b24gaW4gdGhlIFVJLAorICAgICAqIGJlZm9yZSBjcmVhdGluZyBhIG5ldyBtZWRpYSBzZXNzaW9uIHRvIGF2b2lkIHVubmVjZXNzYXJpbHkgaW50ZXJydXB0aW5nCisgICAgICogYW5vdGhlciBhcHBsaWNhdGlvbiB0aGF0IG1heSBoYXZlIGp1c3Qgc3RhcnRlZCB1c2luZyB0aGUgcm91dGUuCisgICAgICogPC9wPjxwPgorICAgICAqIEFuIGludmFsaWRhdGVkIG1lZGlhIGl0ZW0gY2Fubm90IGJlIHJlc3VtZWQuICBUbyBwbGF5IHRoZSBjb250ZW50IGFnYWluLCB0aGUgYXBwbGljYXRpb24KKyAgICAgKiBtdXN0IHNlbmQgYSBuZXcge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5fSBvcgorICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0gYWN0aW9uLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9JTlZBTElEQVRFRCA9IDY7CisKKyAgICAvKioKKyAgICAgKiBQbGF5YmFjayBzdGF0ZTogUGxheWJhY2sgaGFsdGVkIG9yIGFib3J0ZWQgZHVlIHRvIGFuIGVycm9yLgorICAgICAqIDxwPgorICAgICAqIEV4YW1wbGVzIG9mIGVycm9ycyBhcmUgbm8gbmV0d29yayBjb25uZWN0aXZpdHkgd2hlbiBhdHRlbXB0aW5nIHRvIHJldHJpZXZlIGNvbnRlbnQKKyAgICAgKiBmcm9tIGEgc2VydmVyLCBvciBleHBpcmVkIHVzZXIgY3JlZGVudGlhbHMgd2hlbiB0cnlpbmcgdG8gcGxheSBzdWJzY3JpcHRpb24tYmFzZWQKKyAgICAgKiBjb250ZW50LgorICAgICAqIDwvcD48cD4KKyAgICAgKiBBIG1lZGlhIGl0ZW0gaW4gdGhlIGVycm9yIHN0YXRlIGNhbm5vdCBiZSByZXN1bWVkLiAgVG8gcGxheSB0aGUgY29udGVudCBhZ2FpbiwKKyAgICAgKiB0aGUgYXBwbGljYXRpb24gbXVzdCBzZW5kIGEgbmV3IHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheX0gb3IKKyAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFIGVucXVldWV9IGFjdGlvbi4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfRVJST1IgPSA3OworCisgICAgLyoqCisgICAgICogSW50ZWdlciBleHRyYTogSFRUUCBzdGF0dXMgY29kZS4KKyAgICAgKiA8cD4KKyAgICAgKiBTcGVjaWZpZXMgdGhlIEhUVFAgc3RhdHVzIGNvZGUgdGhhdCB3YXMgZW5jb3VudGVyZWQgd2hlbiB0aGUgY29udGVudAorICAgICAqIHdhcyByZXF1ZXN0ZWQgYWZ0ZXIgYWxsIHJlZGlyZWN0cyB3ZXJlIGZvbGxvd2VkLiAgVGhpcyBrZXkgb25seSBuZWVkcyB0bworICAgICAqIHNwZWNpZmllZCB3aGVuIHRoZSBjb250ZW50IHVyaSB1c2VzIHRoZSBIVFRQIG9yIEhUVFBTIHNjaGVtZSBhbmQgYW4gZXJyb3IKKyAgICAgKiBvY2N1cnJlZC4gIFRoaXMga2V5IG1heSBiZSBvbWl0dGVkIGlmIHRoZSBjb250ZW50IHdhcyBhYmxlIHRvIGJlIHBsYXllZAorICAgICAqIHN1Y2Nlc3NmdWxseTsgdGhlcmUgaXMgbm8gbmVlZCB0byByZXBvcnQgYSAyMDAgKE9LKSBzdGF0dXMgY29kZS4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhlIHZhbHVlIGlzIGFuIGludGVnZXIgSFRUUCBzdGF0dXMgY29kZSwgc3VjaCBhcyA0MDEgKFVuYXV0aG9yaXplZCksCisgICAgICogNDA0IChOb3QgRm91bmQpLCBvciA1MDAgKFNlcnZlciBFcnJvciksIG9yIDAgaWYgbm9uZS4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSFRUUF9TVEFUVVNfQ09ERSA9CisgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5zdGF0dXMuZXh0cmEuSFRUUF9TVEFUVVNfQ09ERSI7CisKKyAgICAvKioKKyAgICAgKiBCdW5kbGUgZXh0cmE6IEhUVFAgcmVzcG9uc2UgaGVhZGVycy4KKyAgICAgKiA8cD4KKyAgICAgKiBTcGVjaWZpZXMgdGhlIEhUVFAgcmVzcG9uc2UgaGVhZGVycyB0aGF0IHdlcmUgcmV0dXJuZWQgd2hlbiB0aGUgY29udGVudCB3YXMKKyAgICAgKiByZXF1ZXN0ZWQgZnJvbSB0aGUgbmV0d29yay4gIFRoZSBoZWFkZXJzIG1heSBpbmNsdWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgICAgKiBhYm91dCB0aGUgY29udGVudCBvciBhbnkgZXJyb3JzIGNvbmRpdGlvbnMgdGhhdCB3ZXJlIGVuY291bnRlcmVkIHdoaWxlCisgICAgICogdHJ5aW5nIHRvIGZldGNoIHRoZSBjb250ZW50LgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgYW5kcm9pZC5vcy5CdW5kbGV9IG9mIHN0cmluZyBiYXNlZCBrZXktdmFsdWUgcGFpcnMKKyAgICAgKiB0aGF0IGRlc2NyaWJlIHRoZSBIVFRQIHJlc3BvbnNlIGhlYWRlcnMuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0hUVFBfUkVTUE9OU0VfSEVBREVSUyA9CisgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5zdGF0dXMuZXh0cmEuSFRUUF9SRVNQT05TRV9IRUFERVJTIjsKKworICAgIE1lZGlhSXRlbVN0YXR1cyhCdW5kbGUgYnVuZGxlKSB7CisgICAgICAgIG1CdW5kbGUgPSBidW5kbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdGltZXN0YW1wIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RhdHVzIGluZm9ybWF0aW9uIGluCisgICAgICogbWlsbGlzZWNvbmRzIHNpbmNlIGJvb3QgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWV9IHRpbWUgYmFzZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHN0YXR1cyB0aW1lc3RhbXAgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWUoKX0gdGltZSBiYXNlLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFRpbWVzdGFtcCgpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0TG9uZyhLRVlfVElNRVNUQU1QKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBwbGF5YmFjayBzdGF0ZSBvZiB0aGUgbWVkaWEgaXRlbS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHBsYXliYWNrIHN0YXRlLiAgT25lIG9mIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUEVORElOR30sCisgICAgICoge0BsaW5rICNQTEFZQkFDS19TVEFURV9QTEFZSU5HfSwge0BsaW5rICNQTEFZQkFDS19TVEFURV9QQVVTRUR9LAorICAgICAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfQlVGRkVSSU5HfSwge0BsaW5rICNQTEFZQkFDS19TVEFURV9GSU5JU0hFRH0sCisgICAgICoge0BsaW5rICNQTEFZQkFDS19TVEFURV9DQU5DRUxFRH0sIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUR9LAorICAgICAqIG9yIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfRVJST1J9LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tTdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9QTEFZQkFDS19TVEFURSwgUExBWUJBQ0tfU1RBVEVfRVJST1IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGNvbnRlbnQgcGxheWJhY2sgcG9zaXRpb24gYXMgYSBsb25nIGludGVnZXIgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcworICAgICAqIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29udGVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnQgcGxheWJhY2sgcG9zaXRpb24gaW4gbWlsbGlzZWNvbmRzLCBvciAtMSBpZiB1bmtub3duLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldENvbnRlbnRQb3NpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0TG9uZyhLRVlfQ09OVEVOVF9QT1NJVElPTiwgLTEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSBjb250ZW50IHRvIGJlIHBsYXllZCBhcyBhIGxvbmcgaW50ZWdlciBudW1iZXIgb2YKKyAgICAgKiBtaWxsaXNlY29uZHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50IGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcywgb3IgLTEgaWYgdW5rbm93bi4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRDb250ZW50RHVyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlLmdldExvbmcoS0VZX0NPTlRFTlRfRFVSQVRJT04sIC0xKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgYnVuZGxlIG9mIGV4dHJhcyBmb3IgdGhpcyBzdGF0dXMgb2JqZWN0LgorICAgICAqIFRoZSBleHRyYXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgYnV0IHRoZXkgbWF5IGJlIHVzZWQKKyAgICAgKiBieSBhcHBsaWNhdGlvbnMuCisgICAgICovCisgICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXMoKSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJ1bmRsZShLRVlfRVhUUkFTKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIk1lZGlhSXRlbVN0YXR1c3sgIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoInRpbWVzdGFtcD0iKTsKKyAgICAgICAgVGltZVV0aWxzLmZvcm1hdER1cmF0aW9uKFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpIC0gZ2V0VGltZXN0YW1wKCksIHJlc3VsdCk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiBtcyBhZ28iKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBwbGF5YmFja1N0YXRlPSIpLmFwcGVuZChwbGF5YmFja1N0YXRlVG9TdHJpbmcoZ2V0UGxheWJhY2tTdGF0ZSgpKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY29udGVudFBvc2l0aW9uPSIpLmFwcGVuZChnZXRDb250ZW50UG9zaXRpb24oKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY29udGVudER1cmF0aW9uPSIpLmFwcGVuZChnZXRDb250ZW50RHVyYXRpb24oKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZXh0cmFzPSIpLmFwcGVuZChnZXRFeHRyYXMoKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiB9Iik7CisgICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGxheWJhY2tTdGF0ZVRvU3RyaW5nKGludCBwbGF5YmFja1N0YXRlKSB7CisgICAgICAgIHN3aXRjaCAocGxheWJhY2tTdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19TVEFURV9QRU5ESU5HOgorICAgICAgICAgICAgICAgIHJldHVybiAicGVuZGluZyI7CisgICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX0JVRkZFUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gImJ1ZmZlcmluZyI7CisgICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX1BMQVlJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuICJwbGF5aW5nIjsKKyAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfUEFVU0VEOgorICAgICAgICAgICAgICAgIHJldHVybiAicGF1c2VkIjsKKyAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfRklOSVNIRUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJmaW5pc2hlZCI7CisgICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX0NBTkNFTEVEOgorICAgICAgICAgICAgICAgIHJldHVybiAiY2FuY2VsZWQiOworICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19TVEFURV9JTlZBTElEQVRFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWRhdGVkIjsKKyAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfRVJST1I6CisgICAgICAgICAgICAgICAgcmV0dXJuICJlcnJvciI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcocGxheWJhY2tTdGF0ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBidW5kbGUgZm9yIHNlcmlhbGl6YXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHJlcHJlc2VudGVkIGFzIGEgYnVuZGxlLgorICAgICAqLworICAgIHB1YmxpYyBCdW5kbGUgYXNCdW5kbGUoKSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZnJvbSBhIGJ1bmRsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lLgorICAgICAqIEByZXR1cm4gVGhlIG5ldyBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgYnVuZGxlIHdhcyBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFJdGVtU3RhdHVzIGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICByZXR1cm4gYnVuZGxlICE9IG51bGwgPyBuZXcgTWVkaWFJdGVtU3RhdHVzKGJ1bmRsZSkgOiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkZXIgZm9yIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMgbWVkaWEgaXRlbSBzdGF0dXMgb2JqZWN0c30uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIGl0ZW0gc3RhdHVzIGJ1aWxkZXIgdXNpbmcgdGhlIGN1cnJlbnQgdGltZSBhcyB0aGUKKyAgICAgICAgICogcmVmZXJlbmNlIHRpbWVzdGFtcC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBsYXliYWNrU3RhdGUgVGhlIGl0ZW0gcGxheWJhY2sgc3RhdGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlcihpbnQgcGxheWJhY2tTdGF0ZSkgeworICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgIHNldFRpbWVzdGFtcChTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSk7CisgICAgICAgICAgICBzZXRQbGF5YmFja1N0YXRlKHBsYXliYWNrU3RhdGUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSBpdGVtIHN0YXR1cyBidWlsZGVyIHdob3NlIGluaXRpYWwgY29udGVudHMgYXJlCisgICAgICAgICAqIGNvcGllZCBmcm9tIGFuIGV4aXN0aW5nIHN0YXR1cy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyKE1lZGlhSXRlbVN0YXR1cyBzdGF0dXMpIHsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInN0YXR1cyBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKHN0YXR1cy5tQnVuZGxlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSB0aW1lc3RhbXAgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdGF0dXMgaW5mb3JtYXRpb24gaW4KKyAgICAgICAgICogbWlsbGlzZWNvbmRzIHNpbmNlIGJvb3QgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWV9IHRpbWUgYmFzZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFRpbWVzdGFtcChsb25nIGVsYXBzZWRSZWFsdGltZVRpbWVzdGFtcCkgeworICAgICAgICAgICAgbUJ1bmRsZS5wdXRMb25nKEtFWV9USU1FU1RBTVAsIGVsYXBzZWRSZWFsdGltZVRpbWVzdGFtcCk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBwbGF5YmFjayBzdGF0ZSBvZiB0aGUgbWVkaWEgaXRlbS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFBsYXliYWNrU3RhdGUoaW50IHBsYXliYWNrU3RhdGUpIHsKKyAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9QTEFZQkFDS19TVEFURSwgcGxheWJhY2tTdGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBjb250ZW50IHBsYXliYWNrIHBvc2l0aW9uIGFzIGEgbG9uZyBpbnRlZ2VyIG51bWJlciBvZiBtaWxsaXNlY29uZHMKKyAgICAgICAgICogZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb250ZW50LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q29udGVudFBvc2l0aW9uKGxvbmcgcG9zaXRpb25NaWxsaXNlY29uZHMpIHsKKyAgICAgICAgICAgIG1CdW5kbGUucHV0TG9uZyhLRVlfQ09OVEVOVF9QT1NJVElPTiwgcG9zaXRpb25NaWxsaXNlY29uZHMpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgdG90YWwgZHVyYXRpb24gb2YgdGhlIGNvbnRlbnQgdG8gYmUgcGxheWVkIGFzIGEgbG9uZyBpbnRlZ2VyIG51bWJlcgorICAgICAgICAgKiBvZiBtaWxsaXNlY29uZHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRDb250ZW50RHVyYXRpb24obG9uZyBkdXJhdGlvbk1pbGxpc2Vjb25kcykgeworICAgICAgICAgICAgbUJ1bmRsZS5wdXRMb25nKEtFWV9DT05URU5UX0RVUkFUSU9OLCBkdXJhdGlvbk1pbGxpc2Vjb25kcyk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIGEgYnVuZGxlIG9mIGV4dHJhcyBmb3IgdGhpcyBzdGF0dXMgb2JqZWN0LgorICAgICAgICAgKiBUaGUgZXh0cmFzIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgbWVkaWEgcm91dGVyIGJ1dCB0aGV5IG1heSBiZSB1c2VkCisgICAgICAgICAqIGJ5IGFwcGxpY2F0aW9ucy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEV4dHJhcyhCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICBtQnVuZGxlLnB1dEJ1bmRsZShLRVlfRVhUUkFTLCBleHRyYXMpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQnVpbGRzIHRoZSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzIG1lZGlhIGl0ZW0gc3RhdHVzIG9iamVjdH0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTWVkaWFJdGVtU3RhdHVzIGJ1aWxkKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUl0ZW1TdGF0dXMobUJ1bmRsZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZURlc2NyaXB0b3IuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlRGVzY3JpcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYzg0ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZURlc2NyaXB0b3IuamF2YQpAQCAtMCwwICsxLDY5MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudFNlbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogRGVzY3JpYmVzIHRoZSBwcm9wZXJ0aWVzIG9mIGEgcm91dGUuCisgKiA8cD4KKyAqIEVhY2ggcm91dGUgaXMgdW5pcXVlbHkgaWRlbnRpZmllZCBieSBhbiBvcGFxdWUgaWQgc3RyaW5nLiAgVGhpcyB0b2tlbgorICogbWF5IHRha2UgYW55IGZvcm0gYXMgbG9uZyBhcyBpdCBpcyB1bmlxdWUgd2l0aGluIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlci4KKyAqIDwvcD48cD4KKyAqIFRoaXMgb2JqZWN0IGlzIGltbXV0YWJsZSBvbmNlIGNyZWF0ZWQgdXNpbmcgYSB7QGxpbmsgQnVpbGRlcn0gaW5zdGFuY2UuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlRGVzY3JpcHRvciB7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfSUQgPSAiaWQiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0dST1VQX01FTUJFUl9JRFMgPSAiZ3JvdXBNZW1iZXJJZHMiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX05BTUUgPSAibmFtZSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVTQ1JJUFRJT04gPSAic3RhdHVzIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9JQ09OX1VSSSA9ICJpY29uVXJpIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FTkFCTEVEID0gImVuYWJsZWQiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTk5FQ1RJTkcgPSAiY29ubmVjdGluZyI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OTkVDVElPTl9TVEFURSA9ICJjb25uZWN0aW9uU3RhdGUiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTlRST0xfRklMVEVSUyA9ICJjb250cm9sRmlsdGVycyI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUExBWUJBQ0tfVFlQRSA9ICJwbGF5YmFja1R5cGUiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BMQVlCQUNLX1NUUkVBTSA9ICJwbGF5YmFja1N0cmVhbSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVWSUNFX1RZUEUgPSAiZGV2aWNlVHlwZSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVk9MVU1FID0gInZvbHVtZSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVk9MVU1FX01BWCA9ICJ2b2x1bWVNYXgiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZPTFVNRV9IQU5ETElORyA9ICJ2b2x1bWVIYW5kbGluZyI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUFJFU0VOVEFUSU9OX0RJU1BMQVlfSUQgPSAicHJlc2VudGF0aW9uRGlzcGxheUlkIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FWFRSQVMgPSAiZXh0cmFzIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DQU5fRElTQ09OTkVDVCA9ICJjYW5EaXNjb25uZWN0IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TRVRUSU5HU19JTlRFTlQgPSAic2V0dGluZ3NJbnRlbnQiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX01JTl9DTElFTlRfVkVSU0lPTiA9ICJtaW5DbGllbnRWZXJzaW9uIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NQVhfQ0xJRU5UX1ZFUlNJT04gPSAibWF4Q2xpZW50VmVyc2lvbiI7CisKKyAgICBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKKyAgICBMaXN0PEludGVudEZpbHRlcj4gbUNvbnRyb2xGaWx0ZXJzOworCisgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IoQnVuZGxlIGJ1bmRsZSwgTGlzdDxJbnRlbnRGaWx0ZXI+IGNvbnRyb2xGaWx0ZXJzKSB7CisgICAgICAgIG1CdW5kbGUgPSBidW5kbGU7CisgICAgICAgIG1Db250cm9sRmlsdGVycyA9IGNvbnRyb2xGaWx0ZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHVuaXF1ZSBpZCBvZiB0aGUgcm91dGUuCisgICAgICogPHA+CisgICAgICogVGhlIHJvdXRlIGlkIGFzc29jaWF0ZWQgd2l0aCBhIHJvdXRlIGRlc2NyaXB0b3IgZnVuY3Rpb25zIGFzIGEgc3RhYmxlCisgICAgICogaWRlbnRpZmllciBmb3IgdGhlIHJvdXRlIGFuZCBtdXN0IGJlIHVuaXF1ZSBhbW9uZyBhbGwgcm91dGVzIG9mZmVyZWQKKyAgICAgKiBieSB0aGUgcHJvdmlkZXIuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlLmdldFN0cmluZyhLRVlfSUQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGdyb3VwIG1lbWJlciBpZHMgb2YgdGhlIHJvdXRlLgorICAgICAqIDxwPgorICAgICAqIEEgcm91dGUgZGVzY3JpcHRvciB0aGF0IGhhcyBvbmUgb3IgbW9yZSBncm91cCBtZW1iZXIgcm91dGUgaWRzCisgICAgICogcmVwcmVzZW50cyBhIHJvdXRlIGdyb3VwLiBBIG1lbWJlciByb3V0ZSBtYXkgYmVsb25nIHRvIGFub3RoZXIgZ3JvdXAuCisgICAgICogPC9wPgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEdyb3VwTWVtYmVySWRzKCkgeworICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRTdHJpbmdBcnJheUxpc3QoS0VZX0dST1VQX01FTUJFUl9JRFMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHVzZXItdmlzaWJsZSBuYW1lIG9mIHRoZSByb3V0ZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcm91dGUgbmFtZSBpZGVudGlmaWVzIHRoZSBkZXN0aW5hdGlvbiByZXByZXNlbnRlZCBieSB0aGUgcm91dGUuCisgICAgICogSXQgbWF5IGJlIGEgdXNlci1zdXBwbGllZCBuYW1lLCBhbiBhbGlhcywgb3IgZGV2aWNlIHNlcmlhbCBudW1iZXIuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0U3RyaW5nKEtFWV9OQU1FKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB1c2VyLXZpc2libGUgZGVzY3JpcHRpb24gb2YgdGhlIHJvdXRlLgorICAgICAqIDxwPgorICAgICAqIFRoZSByb3V0ZSBkZXNjcmlwdGlvbiBkZXNjcmliZXMgdGhlIGtpbmQgb2YgZGVzdGluYXRpb24gcmVwcmVzZW50ZWQgYnkgdGhlIHJvdXRlLgorICAgICAqIEl0IG1heSBiZSBhIHVzZXItc3VwcGxpZWQgc3RyaW5nLCBhIG1vZGVsIG51bWJlciBvciBicmFuZCBvZiBkZXZpY2UuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlLmdldFN0cmluZyhLRVlfREVTQ1JJUFRJT04pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIFVSSSBvZiB0aGUgaWNvbiByZXByZXNlbnRpbmcgdGhpcyByb3V0ZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGljb24gd2lsbCBiZSB1c2VkIGluIHBpY2tlciBVSXMgaWYgYXZhaWxhYmxlLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgVXJpIGdldEljb25VcmkoKSB7CisgICAgICAgIFN0cmluZyBpY29uVXJpID0gbUJ1bmRsZS5nZXRTdHJpbmcoS0VZX0lDT05fVVJJKTsKKyAgICAgICAgcmV0dXJuIGljb25VcmkgPT0gbnVsbCA/IG51bGwgOiBVcmkucGFyc2UoaWNvblVyaSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB3aGV0aGVyIHRoZSByb3V0ZSBpcyBlbmFibGVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0Qm9vbGVhbihLRVlfRU5BQkxFRCwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB3aGV0aGVyIHRoZSByb3V0ZSBpcyBjb25uZWN0aW5nLgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldENvbm5lY3Rpb25TdGF0ZX0gaW5zdGVhZAorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0aW5nKCkgeworICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRCb29sZWFuKEtFWV9DT05ORUNUSU5HLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGUgcm91dGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjb25uZWN0aW9uIHN0YXRlIG9mIHRoaXMgcm91dGU6CisgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNDT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRH0sCisgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkd9LCBvcgorICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUR9LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q29ubmVjdGlvblN0YXRlKCkgeworICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX0NPTk5FQ1RJT05fU1RBVEUsCisgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvLkNPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHdoZXRoZXIgdGhlIHJvdXRlIGNhbiBiZSBkaXNjb25uZWN0ZWQgd2l0aG91dCBzdG9wcGluZyBwbGF5YmFjay4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcm91dGUgY2FuIG5vcm1hbGx5IGJlIGRpc2Nvbm5lY3RlZCB3aXRob3V0IHN0b3BwaW5nIHBsYXliYWNrIHdoZW4KKyAgICAgKiB0aGUgZGVzdGluYXRpb24gZGV2aWNlIG9uIHRoZSByb3V0ZSBpcyBjb25uZWN0ZWQgdG8gdHdvIG9yIG1vcmUgc291cmNlCisgICAgICogZGV2aWNlcy4gVGhlIHJvdXRlIHByb3ZpZGVyIHNob3VsZCB1cGRhdGUgdGhlIHJvdXRlIGltbWVkaWF0ZWx5IHdoZW4gdGhlCisgICAgICogbnVtYmVyIG9mIGNvbm5lY3RlZCBkZXZpY2VzIGNoYW5nZXMuCisgICAgICogPC9wPjxwPgorICAgICAqIFRvIHNwZWNpZnkgdGhhdCB0aGUgcm91dGUgc2hvdWxkIGRpc2Nvbm5lY3Qgd2l0aG91dCBzdG9wcGluZyB1c2UKKyAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIjdW5zZWxlY3QoaW50KX0gd2l0aAorICAgICAqIHtAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fRElTQ09OTkVDVEVEfS4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2FuRGlzY29ubmVjdEFuZEtlZXBQbGF5aW5nKCkgeworICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRCb29sZWFuKEtFWV9DQU5fRElTQ09OTkVDVCwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYW4ge0BsaW5rIEludGVudFNlbmRlcn0gZm9yIHN0YXJ0aW5nIGEgc2V0dGluZ3MgYWN0aXZpdHkgZm9yIHRoaXMKKyAgICAgKiByb3V0ZS4gVGhlIGFjdGl2aXR5IG1heSBoYXZlIHNwZWNpZmljIHJvdXRlIHNldHRpbmdzIG9yIGdlbmVyYWwgc2V0dGluZ3MKKyAgICAgKiBmb3IgdGhlIGNvbm5lY3RlZCBkZXZpY2Ugb3Igcm91dGUgcHJvdmlkZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFuIHtAbGluayBJbnRlbnRTZW5kZXJ9IHRvIHN0YXJ0IGEgc2V0dGluZ3MgYWN0aXZpdHkuCisgICAgICovCisgICAgcHVibGljIEludGVudFNlbmRlciBnZXRTZXR0aW5nc0FjdGl2aXR5KCkgeworICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRQYXJjZWxhYmxlKEtFWV9TRVRUSU5HU19JTlRFTlQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHJvdXRlJ3Mge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGludGVudH0gZmlsdGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxJbnRlbnRGaWx0ZXI+IGdldENvbnRyb2xGaWx0ZXJzKCkgeworICAgICAgICBlbnN1cmVDb250cm9sRmlsdGVycygpOworICAgICAgICByZXR1cm4gbUNvbnRyb2xGaWx0ZXJzOworICAgIH0KKworICAgIHZvaWQgZW5zdXJlQ29udHJvbEZpbHRlcnMoKSB7CisgICAgICAgIGlmIChtQ29udHJvbEZpbHRlcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgbUNvbnRyb2xGaWx0ZXJzID0gbUJ1bmRsZS48SW50ZW50RmlsdGVyPmdldFBhcmNlbGFibGVBcnJheUxpc3QoS0VZX0NPTlRST0xfRklMVEVSUyk7CisgICAgICAgICAgICBpZiAobUNvbnRyb2xGaWx0ZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ29udHJvbEZpbHRlcnMgPSBDb2xsZWN0aW9ucy48SW50ZW50RmlsdGVyPmVtcHR5TGlzdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdHlwZSBvZiBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHR5cGUgb2YgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGU6CisgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19UWVBFX0xPQ0FMfSBvcgorICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVFlQRV9SRU1PVEV9LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tUeXBlKCkgeworICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX1BMQVlCQUNLX1RZUEUsIE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19UWVBFX1JFTU9URSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcm91dGUncyBwbGF5YmFjayBzdHJlYW0uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQbGF5YmFja1N0cmVhbSgpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9QTEFZQkFDS19TVFJFQU0sIC0xKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0eXBlIG9mIHRoZSByZWNlaXZlciBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB0eXBlIG9mIHRoZSByZWNlaXZlciBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGU6CisgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNERVZJQ0VfVFlQRV9UVn0gb3IKKyAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0RFVklDRV9UWVBFX1NQRUFLRVJ9LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RGV2aWNlVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9ERVZJQ0VfVFlQRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcm91dGUncyBjdXJyZW50IHZvbHVtZSwgb3IgMCBpZiB1bmtub3duLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Vm9sdW1lKCkgeworICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX1ZPTFVNRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcm91dGUncyBtYXhpbXVtIHZvbHVtZSwgb3IgMCBpZiB1bmtub3duLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Vm9sdW1lTWF4KCkgeworICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX1ZPTFVNRV9NQVgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgaG93IHZvbHVtZSBpcyBoYW5kbGVkIG9uIHRoZSByb3V0ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gSG93IHZvbHVtZSBpcyBoYW5kbGVkIG9uIHRoZSByb3V0ZToKKyAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI1BMQVlCQUNLX1ZPTFVNRV9GSVhFRH0gb3IKKyAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI1BMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRX0uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRWb2x1bWVIYW5kbGluZygpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9WT0xVTUVfSEFORExJTkcsCisgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBMQVlCQUNLX1ZPTFVNRV9GSVhFRCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcm91dGUncyBwcmVzZW50YXRpb24gZGlzcGxheSBpZCwgb3IgLTEgaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFByZXNlbnRhdGlvbkRpc3BsYXlJZCgpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KAorICAgICAgICAgICAgICAgIEtFWV9QUkVTRU5UQVRJT05fRElTUExBWV9JRCwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBSRVNFTlRBVElPTl9ESVNQTEFZX0lEX05PTkUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYSBidW5kbGUgb2YgZXh0cmFzIGZvciB0aGlzIHJvdXRlIGRlc2NyaXB0b3IuCisgICAgICogVGhlIGV4dHJhcyB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIG1lZGlhIHJvdXRlciBidXQgdGhleSBtYXkgYmUgdXNlZAorICAgICAqIGJ5IGFwcGxpY2F0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVuZGxlIGdldEV4dHJhcygpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0QnVuZGxlKEtFWV9FWFRSQVMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG1pbmltdW0gY2xpZW50IHZlcnNpb24gcmVxdWlyZWQgZm9yIHRoaXMgcm91dGUuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQorICAgIHB1YmxpYyBpbnQgZ2V0TWluQ2xpZW50VmVyc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9NSU5fQ0xJRU5UX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX1ZFUlNJT05fU1RBUlQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG1heGltdW0gY2xpZW50IHZlcnNpb24gcmVxdWlyZWQgZm9yIHRoaXMgcm91dGUuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQorICAgIHB1YmxpYyBpbnQgZ2V0TWF4Q2xpZW50VmVyc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9NQVhfQ0xJRU5UX1ZFUlNJT04sIEludGVnZXIuTUFYX1ZBTFVFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIGRlc2NyaXB0b3IgaGFzIGFsbCBvZiB0aGUgcmVxdWlyZWQgZmllbGRzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7CisgICAgICAgIGVuc3VyZUNvbnRyb2xGaWx0ZXJzKCk7CisgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShnZXRJZCgpKQorICAgICAgICAgICAgICAgIHx8IFRleHRVdGlscy5pc0VtcHR5KGdldE5hbWUoKSkKKyAgICAgICAgICAgICAgICB8fCBtQ29udHJvbEZpbHRlcnMuY29udGFpbnMobnVsbCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIk1lZGlhUm91dGVEZXNjcmlwdG9yeyAiKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiaWQ9IikuYXBwZW5kKGdldElkKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGdyb3VwTWVtYmVySWRzPSIpLmFwcGVuZChnZXRHcm91cE1lbWJlcklkcygpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBuYW1lPSIpLmFwcGVuZChnZXROYW1lKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGRlc2NyaXB0aW9uPSIpLmFwcGVuZChnZXREZXNjcmlwdGlvbigpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBpY29uVXJpPSIpLmFwcGVuZChnZXRJY29uVXJpKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGlzRW5hYmxlZD0iKS5hcHBlbmQoaXNFbmFibGVkKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGlzQ29ubmVjdGluZz0iKS5hcHBlbmQoaXNDb25uZWN0aW5nKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGNvbm5lY3Rpb25TdGF0ZT0iKS5hcHBlbmQoZ2V0Q29ubmVjdGlvblN0YXRlKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGNvbnRyb2xGaWx0ZXJzPSIpLmFwcGVuZChBcnJheXMudG9TdHJpbmcoZ2V0Q29udHJvbEZpbHRlcnMoKS50b0FycmF5KCkpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBwbGF5YmFja1R5cGU9IikuYXBwZW5kKGdldFBsYXliYWNrVHlwZSgpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBwbGF5YmFja1N0cmVhbT0iKS5hcHBlbmQoZ2V0UGxheWJhY2tTdHJlYW0oKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZGV2aWNlVHlwZT0iKS5hcHBlbmQoZ2V0RGV2aWNlVHlwZSgpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB2b2x1bWU9IikuYXBwZW5kKGdldFZvbHVtZSgpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB2b2x1bWVNYXg9IikuYXBwZW5kKGdldFZvbHVtZU1heCgpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB2b2x1bWVIYW5kbGluZz0iKS5hcHBlbmQoZ2V0Vm9sdW1lSGFuZGxpbmcoKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgcHJlc2VudGF0aW9uRGlzcGxheUlkPSIpLmFwcGVuZChnZXRQcmVzZW50YXRpb25EaXNwbGF5SWQoKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZXh0cmFzPSIpLmFwcGVuZChnZXRFeHRyYXMoKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgaXNWYWxpZD0iKS5hcHBlbmQoaXNWYWxpZCgpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBtaW5DbGllbnRWZXJzaW9uPSIpLmFwcGVuZChnZXRNaW5DbGllbnRWZXJzaW9uKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKCIsIG1heENsaWVudFZlcnNpb249IikuYXBwZW5kKGdldE1heENsaWVudFZlcnNpb24oKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiB9Iik7CisgICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIGJ1bmRsZSBmb3Igc2VyaWFsaXphdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgcmVwcmVzZW50ZWQgYXMgYSBidW5kbGUuCisgICAgICovCisgICAgcHVibGljIEJ1bmRsZSBhc0J1bmRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmcm9tIGEgYnVuZGxlLgorICAgICAqCisgICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCisgICAgICogQHJldHVybiBUaGUgbmV3IGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBidW5kbGUgd2FzIG51bGwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNZWRpYVJvdXRlRGVzY3JpcHRvciBmcm9tQnVuZGxlKEJ1bmRsZSBidW5kbGUpIHsKKyAgICAgICAgcmV0dXJuIGJ1bmRsZSAhPSBudWxsID8gbmV3IE1lZGlhUm91dGVEZXNjcmlwdG9yKGJ1bmRsZSwgbnVsbCkgOiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkZXIgZm9yIHtAbGluayBNZWRpYVJvdXRlRGVzY3JpcHRvciBtZWRpYSByb3V0ZSBkZXNjcmlwdG9yc30uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKKyAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBtR3JvdXBNZW1iZXJJZHM7CisgICAgICAgIHByaXZhdGUgQXJyYXlMaXN0PEludGVudEZpbHRlcj4gbUNvbnRyb2xGaWx0ZXJzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgbWVkaWEgcm91dGUgZGVzY3JpcHRvciBidWlsZGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gaWQgVGhlIHVuaXF1ZSBpZCBvZiB0aGUgcm91dGUuCisgICAgICAgICAqIEBwYXJhbSBuYW1lIFRoZSB1c2VyLXZpc2libGUgbmFtZSBvZiB0aGUgcm91dGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlcihTdHJpbmcgaWQsIFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgc2V0SWQoaWQpOworICAgICAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgbWVkaWEgcm91dGUgZGVzY3JpcHRvciBidWlsZGVyIHdob3NlIGluaXRpYWwgY29udGVudHMgYXJlCisgICAgICAgICAqIGNvcGllZCBmcm9tIGFuIGV4aXN0aW5nIGRlc2NyaXB0b3IuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlcihNZWRpYVJvdXRlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7CisgICAgICAgICAgICBpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZGVzY3JpcHRvciBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKGRlc2NyaXB0b3IubUJ1bmRsZSk7CisKKyAgICAgICAgICAgIGRlc2NyaXB0b3IuZW5zdXJlQ29udHJvbEZpbHRlcnMoKTsKKyAgICAgICAgICAgIGlmICghZGVzY3JpcHRvci5tQ29udHJvbEZpbHRlcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgbUNvbnRyb2xGaWx0ZXJzID0gbmV3IEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+KGRlc2NyaXB0b3IubUNvbnRyb2xGaWx0ZXJzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIHJvdXRlIGlkIGFzc29jaWF0ZWQgd2l0aCBhIHJvdXRlIGRlc2NyaXB0b3IgZnVuY3Rpb25zIGFzIGEgc3RhYmxlCisgICAgICAgICAqIGlkZW50aWZpZXIgZm9yIHRoZSByb3V0ZSBhbmQgbXVzdCBiZSB1bmlxdWUgYW1vbmcgYWxsIHJvdXRlcyBvZmZlcmVkCisgICAgICAgICAqIGJ5IHRoZSBwcm92aWRlci4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0SWQoU3RyaW5nIGlkKSB7CisgICAgICAgICAgICBtQnVuZGxlLnB1dFN0cmluZyhLRVlfSUQsIGlkKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgYSBncm91cCBtZW1iZXIgaWQgb2YgdGhlIHJvdXRlLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogQSByb3V0ZSBkZXNjcmlwdG9yIHRoYXQgaGFzIG9uZSBvciBtb3JlIGdyb3VwIG1lbWJlciByb3V0ZSBpZHMKKyAgICAgICAgICogcmVwcmVzZW50cyBhIHJvdXRlIGdyb3VwLiBBIG1lbWJlciByb3V0ZSBtYXkgYmVsb25nIHRvIGFub3RoZXIgZ3JvdXAuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZEdyb3VwTWVtYmVySWQoU3RyaW5nIGdyb3VwTWVtYmVySWQpIHsKKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShncm91cE1lbWJlcklkKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImdyb3VwTWVtYmVySWQgbXVzdCBub3QgYmUgZW1wdHkiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1Hcm91cE1lbWJlcklkcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUdyb3VwTWVtYmVySWRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1Hcm91cE1lbWJlcklkcy5jb250YWlucyhncm91cE1lbWJlcklkKSkgeworICAgICAgICAgICAgICAgIG1Hcm91cE1lbWJlcklkcy5hZGQoZ3JvdXBNZW1iZXJJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIGEgbGlzdCBvZiBncm91cCBtZW1iZXIgaWRzIG9mIHRoZSByb3V0ZS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIEEgcm91dGUgZGVzY3JpcHRvciB0aGF0IGhhcyBvbmUgb3IgbW9yZSBncm91cCBtZW1iZXIgcm91dGUgaWRzCisgICAgICAgICAqIHJlcHJlc2VudHMgYSByb3V0ZSBncm91cC4gQSBtZW1iZXIgcm91dGUgbWF5IGJlbG9uZyB0byBhbm90aGVyIGdyb3VwLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQorICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRHcm91cE1lbWJlcklkcyhDb2xsZWN0aW9uPFN0cmluZz4gZ3JvdXBNZW1iZXJJZHMpIHsKKyAgICAgICAgICAgIGlmIChncm91cE1lbWJlcklkcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZ3JvdXBNZW1iZXJJZHMgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWdyb3VwTWVtYmVySWRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGdyb3VwTWVtYmVySWQgOiBncm91cE1lbWJlcklkcykgeworICAgICAgICAgICAgICAgICAgICBhZGRHcm91cE1lbWJlcklkKGdyb3VwTWVtYmVySWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIHVzZXItdmlzaWJsZSBuYW1lIG9mIHRoZSByb3V0ZS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSByb3V0ZSBuYW1lIGlkZW50aWZpZXMgdGhlIGRlc3RpbmF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSByb3V0ZS4KKyAgICAgICAgICogSXQgbWF5IGJlIGEgdXNlci1zdXBwbGllZCBuYW1lLCBhbiBhbGlhcywgb3IgZGV2aWNlIHNlcmlhbCBudW1iZXIuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIG1CdW5kbGUucHV0U3RyaW5nKEtFWV9OQU1FLCBuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIHVzZXItdmlzaWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgcm91dGUuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgcm91dGUgZGVzY3JpcHRpb24gZGVzY3JpYmVzIHRoZSBraW5kIG9mIGRlc3RpbmF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSByb3V0ZS4KKyAgICAgICAgICogSXQgbWF5IGJlIGEgdXNlci1zdXBwbGllZCBzdHJpbmcsIGEgbW9kZWwgbnVtYmVyIG9yIGJyYW5kIG9mIGRldmljZS4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisgICAgICAgICAgICBtQnVuZGxlLnB1dFN0cmluZyhLRVlfREVTQ1JJUFRJT04sIGRlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIFVSSSBvZiB0aGUgaWNvbiByZXByZXNlbnRpbmcgdGhpcyByb3V0ZS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoaXMgaWNvbiB3aWxsIGJlIHVzZWQgaW4gcGlja2VyIFVJcyBpZiBhdmFpbGFibGUuCisgICAgICAgICAqIDwvcD48cD4KKyAgICAgICAgICogVGhlIFVSSSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdHM6CisgICAgICAgICAqIDx1bD4KKyAgICAgICAgICogPGxpPmNvbnRlbnQgKHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyI1NDSEVNRV9DT05URU5UfSk8L2xpPgorICAgICAgICAgKiA8bGk+YW5kcm9pZC5yZXNvdXJjZSAoe0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIjU0NIRU1FX0FORFJPSURfUkVTT1VSQ0V9KQorICAgICAgICAgKiA8L2xpPgorICAgICAgICAgKiA8bGk+ZmlsZSAoe0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIjU0NIRU1FX0ZJTEV9KTwvbGk+CisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEljb25VcmkoVXJpIGljb25VcmkpIHsKKyAgICAgICAgICAgIGlmIChpY29uVXJpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpY29uVXJpIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CdW5kbGUucHV0U3RyaW5nKEtFWV9JQ09OX1VSSSwgaWNvblVyaS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgd2hldGhlciB0aGUgcm91dGUgaXMgZW5hYmxlZC4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIERpc2FibGVkIHJvdXRlcyByZXByZXNlbnQgcm91dGVzIHRoYXQgYSByb3V0ZSBwcm92aWRlciBrbm93cyBhYm91dCwgc3VjaCBhcyBwYWlyZWQKKyAgICAgICAgICogV2lmaSBEaXNwbGF5IHJlY2VpdmVycywgYnV0IHRoYXQgYXJlIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgICAgICBtQnVuZGxlLnB1dEJvb2xlYW4oS0VZX0VOQUJMRUQsIGVuYWJsZWQpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB3aGV0aGVyIHRoZSByb3V0ZSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBjb25uZWN0aW5nIGFuZCBpcyBub3QgeWV0CisgICAgICAgICAqIHJlYWR5IGZvciB1c2UuCisgICAgICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI3NldENvbm5lY3Rpb25TdGF0ZX0gaW5zdGVhZC4KKyAgICAgICAgICovCisgICAgICAgIEBEZXByZWNhdGVkCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldENvbm5lY3RpbmcoYm9vbGVhbiBjb25uZWN0aW5nKSB7CisgICAgICAgICAgICBtQnVuZGxlLnB1dEJvb2xlYW4oS0VZX0NPTk5FQ1RJTkcsIGNvbm5lY3RpbmcpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyBjb25uZWN0aW9uIHN0YXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29ubmVjdGlvblN0YXRlIFRoZSBjb25uZWN0aW9uIHN0YXRlIG9mIHRoZSByb3V0ZToKKyAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNDT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRH0sCisgICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HfSwgb3IKKyAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRH0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRDb25uZWN0aW9uU3RhdGUoaW50IGNvbm5lY3Rpb25TdGF0ZSkgeworICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX0NPTk5FQ1RJT05fU1RBVEUsIGNvbm5lY3Rpb25TdGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIHJvdXRlIGNhbiBiZSBkaXNjb25uZWN0ZWQgd2l0aG91dCBzdG9wcGluZyBwbGF5YmFjay4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldENhbkRpc2Nvbm5lY3QoYm9vbGVhbiBjYW5EaXNjb25uZWN0KSB7CisgICAgICAgICAgICBtQnVuZGxlLnB1dEJvb2xlYW4oS0VZX0NBTl9ESVNDT05ORUNULCBjYW5EaXNjb25uZWN0KTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgYW4gaW50ZW50IHNlbmRlciBmb3IgbGF1bmNoaW5nIHRoZSBzZXR0aW5ncyBhY3Rpdml0eSBmb3IgdGhpcworICAgICAgICAgKiByb3V0ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFNldHRpbmdzQWN0aXZpdHkoSW50ZW50U2VuZGVyIGlzKSB7CisgICAgICAgICAgICBtQnVuZGxlLnB1dFBhcmNlbGFibGUoS0VZX1NFVFRJTkdTX0lOVEVOVCwgaXMpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyBhIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBpbnRlbnR9IGZpbHRlciBmb3IgdGhlIHJvdXRlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkQ29udHJvbEZpbHRlcihJbnRlbnRGaWx0ZXIgZmlsdGVyKSB7CisgICAgICAgICAgICBpZiAoZmlsdGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmaWx0ZXIgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUNvbnRyb2xGaWx0ZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ29udHJvbEZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0PEludGVudEZpbHRlcj4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbUNvbnRyb2xGaWx0ZXJzLmNvbnRhaW5zKGZpbHRlcikpIHsKKyAgICAgICAgICAgICAgICBtQ29udHJvbEZpbHRlcnMuYWRkKGZpbHRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIGEgbGlzdCBvZiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fSBmaWx0ZXJzIGZvciB0aGUgcm91dGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRDb250cm9sRmlsdGVycyhDb2xsZWN0aW9uPEludGVudEZpbHRlcj4gZmlsdGVycykgeworICAgICAgICAgICAgaWYgKGZpbHRlcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImZpbHRlcnMgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWZpbHRlcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgZm9yIChJbnRlbnRGaWx0ZXIgZmlsdGVyIDogZmlsdGVycykgeworICAgICAgICAgICAgICAgICAgICBhZGRDb250cm9sRmlsdGVyKGZpbHRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyBwbGF5YmFjayB0eXBlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcGxheWJhY2tUeXBlIFRoZSBwbGF5YmFjayB0eXBlIG9mIHRoZSByb3V0ZToKKyAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19UWVBFX0xPQ0FMfSBvcgorICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI1BMQVlCQUNLX1RZUEVfUkVNT1RFfS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFBsYXliYWNrVHlwZShpbnQgcGxheWJhY2tUeXBlKSB7CisgICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfUExBWUJBQ0tfVFlQRSwgcGxheWJhY2tUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgcGxheWJhY2sgc3RyZWFtLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UGxheWJhY2tTdHJlYW0oaW50IHBsYXliYWNrU3RyZWFtKSB7CisgICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfUExBWUJBQ0tfU1RSRUFNLCBwbGF5YmFja1N0cmVhbSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIHJlY2VpdmVyIGRldmljZSB0eXBlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZGV2aWNlVHlwZSBUaGUgcmVjZWl2ZSBkZXZpY2UgdHlwZSBvZiB0aGUgcm91dGU6CisgICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jREVWSUNFX1RZUEVfVFZ9IG9yCisgICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jREVWSUNFX1RZUEVfU1BFQUtFUn0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXREZXZpY2VUeXBlKGludCBkZXZpY2VUeXBlKSB7CisgICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfREVWSUNFX1RZUEUsIGRldmljZVR5cGUpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyBjdXJyZW50IHZvbHVtZSwgb3IgMCBpZiB1bmtub3duLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Vm9sdW1lKGludCB2b2x1bWUpIHsKKyAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9WT0xVTUUsIHZvbHVtZSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIG1heGltdW0gdm9sdW1lLCBvciAwIGlmIHVua25vd24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRWb2x1bWVNYXgoaW50IHZvbHVtZU1heCkgeworICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX1ZPTFVNRV9NQVgsIHZvbHVtZU1heCk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIHZvbHVtZSBoYW5kbGluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHZvbHVtZUhhbmRsaW5nIGhvdyB2b2x1bWUgaXMgaGFuZGxlZCBvbiB0aGUgcm91dGU6CisgICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVk9MVU1FX0ZJWEVEfSBvcgorICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI1BMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRX0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRWb2x1bWVIYW5kbGluZyhpbnQgdm9sdW1lSGFuZGxpbmcpIHsKKyAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9WT0xVTUVfSEFORExJTkcsIHZvbHVtZUhhbmRsaW5nKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgcHJlc2VudGF0aW9uIGRpc3BsYXkgaWQsIG9yIC0xIGlmIG5vbmUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRQcmVzZW50YXRpb25EaXNwbGF5SWQoaW50IHByZXNlbnRhdGlvbkRpc3BsYXlJZCkgeworICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX1BSRVNFTlRBVElPTl9ESVNQTEFZX0lELCBwcmVzZW50YXRpb25EaXNwbGF5SWQpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyBhIGJ1bmRsZSBvZiBleHRyYXMgZm9yIHRoaXMgcm91dGUgZGVzY3JpcHRvci4KKyAgICAgICAgICogVGhlIGV4dHJhcyB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIG1lZGlhIHJvdXRlciBidXQgdGhleSBtYXkgYmUgdXNlZAorICAgICAgICAgKiBieSBhcHBsaWNhdGlvbnMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRFeHRyYXMoQnVuZGxlIGV4dHJhcykgeworICAgICAgICAgICAgbUJ1bmRsZS5wdXRCdW5kbGUoS0VZX0VYVFJBUywgZXh0cmFzKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgbWluaW11bSBjbGllbnQgdmVyc2lvbi4KKyAgICAgICAgICogQSByb3V0ZXIgd2hvc2UgdmVyc2lvbiBpcyBsb3dlciB0aGFuIHRoaXMgd2lsbCBub3QgYmUgYWJsZSB0byBjb25uZWN0IHRvIHRoaXMgcm91dGUuCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQorICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRNaW5DbGllbnRWZXJzaW9uKGludCBtaW5WZXJzaW9uKSB7CisgICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfTUlOX0NMSUVOVF9WRVJTSU9OLCBtaW5WZXJzaW9uKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgbWF4aW11bSBjbGllbnQgdmVyc2lvbi4KKyAgICAgICAgICogQSByb3V0ZXIgd2hvc2UgdmVyc2lvbiBpcyBoaWdoZXIgdGhhbiB0aGlzIHdpbGwgbm90IGJlIGFibGUgdG8gY29ubmVjdCB0byB0aGlzIHJvdXRlLgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0TWF4Q2xpZW50VmVyc2lvbihpbnQgbWF4VmVyc2lvbikgeworICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX01BWF9DTElFTlRfVkVSU0lPTiwgbWF4VmVyc2lvbik7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBCdWlsZHMgdGhlIHtAbGluayBNZWRpYVJvdXRlRGVzY3JpcHRvciBtZWRpYSByb3V0ZSBkZXNjcmlwdG9yfS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlRGVzY3JpcHRvciBidWlsZCgpIHsKKyAgICAgICAgICAgIGlmIChtQ29udHJvbEZpbHRlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1CdW5kbGUucHV0UGFyY2VsYWJsZUFycmF5TGlzdChLRVlfQ09OVFJPTF9GSUxURVJTLCBtQ29udHJvbEZpbHRlcnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1Hcm91cE1lbWJlcklkcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUJ1bmRsZS5wdXRTdHJpbmdBcnJheUxpc3QoS0VZX0dST1VQX01FTUJFUl9JRFMsIG1Hcm91cE1lbWJlcklkcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVEZXNjcmlwdG9yKG1CdW5kbGUsIG1Db250cm9sRmlsdGVycyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzOTYyN2YKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworCisvKioKKyAqIERlc2NyaWJlcyB0aGUga2luZHMgb2Ygcm91dGVzIHRoYXQgdGhlIG1lZGlhIHJvdXRlciB3b3VsZCBsaWtlIHRvIGRpc2NvdmVyCisgKiBhbmQgd2hldGhlciB0byBwZXJmb3JtIGFjdGl2ZSBzY2FubmluZy4KKyAqIDxwPgorICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZC4KKyAqIDwvcD4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFTEVDVE9SID0gInNlbGVjdG9yIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FDVElWRV9TQ0FOID0gImFjdGl2ZVNjYW4iOworCisgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKKyAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3I7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbWVkaWEgcm91dGUgZGlzY292ZXJ5IHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHJvdXRlIHNlbGVjdG9yIHRoYXQgc3BlY2lmaWVzIHRoZSBraW5kcyBvZiByb3V0ZXMgdG8gZGlzY292ZXIuCisgICAgICogQHBhcmFtIGFjdGl2ZVNjYW4gVHJ1ZSBpZiBhY3RpdmUgc2Nhbm5pbmcgc2hvdWxkIGJlIHBlcmZvcm1lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yLCBib29sZWFuIGFjdGl2ZVNjYW4pIHsKKyAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorCisgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIG1TZWxlY3RvciA9IHNlbGVjdG9yOworICAgICAgICBtQnVuZGxlLnB1dEJ1bmRsZShLRVlfU0VMRUNUT1IsIHNlbGVjdG9yLmFzQnVuZGxlKCkpOworICAgICAgICBtQnVuZGxlLnB1dEJvb2xlYW4oS0VZX0FDVElWRV9TQ0FOLCBhY3RpdmVTY2FuKTsKKyAgICB9CisKKyAgICBwcml2YXRlIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0KEJ1bmRsZSBidW5kbGUpIHsKKyAgICAgICAgbUJ1bmRsZSA9IGJ1bmRsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSByb3V0ZSBzZWxlY3RvciB0aGF0IHNwZWNpZmllcyB0aGUga2luZHMgb2Ygcm91dGVzIHRvIGRpc2NvdmVyLgorICAgICAqLworICAgIHB1YmxpYyBNZWRpYVJvdXRlU2VsZWN0b3IgZ2V0U2VsZWN0b3IoKSB7CisgICAgICAgIGVuc3VyZVNlbGVjdG9yKCk7CisgICAgICAgIHJldHVybiBtU2VsZWN0b3I7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZVNlbGVjdG9yKCkgeworICAgICAgICBpZiAobVNlbGVjdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5mcm9tQnVuZGxlKG1CdW5kbGUuZ2V0QnVuZGxlKEtFWV9TRUxFQ1RPUikpOworICAgICAgICAgICAgaWYgKG1TZWxlY3RvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIGFjdGl2ZSBzY2FubmluZyBzaG91bGQgYmUgcGVyZm9ybWVkLgorICAgICAqCisgICAgICogQHNlZSBNZWRpYVJvdXRlciNDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZVNjYW4oKSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJvb2xlYW4oS0VZX0FDVElWRV9TQ0FOKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRpc2NvdmVyeSByZXF1ZXN0IGhhcyBhbGwgb2YgdGhlIHJlcXVpcmVkIGZpZWxkcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgeworICAgICAgICBlbnN1cmVTZWxlY3RvcigpOworICAgICAgICByZXR1cm4gbVNlbGVjdG9yLmlzVmFsaWQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCkgeworICAgICAgICAgICAgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3Qgb3RoZXIgPSAoTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QpbzsKKyAgICAgICAgICAgIHJldHVybiBnZXRTZWxlY3RvcigpLmVxdWFscyhvdGhlci5nZXRTZWxlY3RvcigpKQorICAgICAgICAgICAgICAgICAgICAmJiBpc0FjdGl2ZVNjYW4oKSA9PSBvdGhlci5pc0FjdGl2ZVNjYW4oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldFNlbGVjdG9yKCkuaGFzaENvZGUoKSBeIChpc0FjdGl2ZVNjYW4oKSA/IDEgOiAwKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIkRpc2NvdmVyeVJlcXVlc3R7IHNlbGVjdG9yPSIpLmFwcGVuZChnZXRTZWxlY3RvcigpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBhY3RpdmVTY2FuPSIpLmFwcGVuZChpc0FjdGl2ZVNjYW4oKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgaXNWYWxpZD0iKS5hcHBlbmQoaXNWYWxpZCgpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiIH0iKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgYnVuZGxlIGZvciBzZXJpYWxpemF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCByZXByZXNlbnRlZCBhcyBhIGJ1bmRsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVuZGxlIGFzQnVuZGxlKCkgeworICAgICAgICByZXR1cm4gbUJ1bmRsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBidW5kbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKiBAcmV0dXJuIFRoZSBuZXcgaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIGJ1bmRsZSB3YXMgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICByZXR1cm4gYnVuZGxlICE9IG51bGwgPyBuZXcgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QoYnVuZGxlKSA6IG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYTJlMWEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw0NDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuT2JqZWN0c0NvbXBhdDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjazsKKworLyoqCisgKiBNZWRpYSByb3V0ZSBwcm92aWRlcnMgYXJlIHVzZWQgdG8gcHVibGlzaCBhZGRpdGlvbmFsIG1lZGlhIHJvdXRlcyBmb3IKKyAqIHVzZSB3aXRoaW4gYW4gYXBwbGljYXRpb24uICBNZWRpYSByb3V0ZSBwcm92aWRlcnMgbWF5IGFsc28gYmUgZGVjbGFyZWQKKyAqIGFzIGEgc2VydmljZSB0byBwdWJsaXNoIGFkZGl0aW9uYWwgbWVkaWEgcm91dGVzIHRvIGFsbCBhcHBsaWNhdGlvbnMKKyAqIGluIHRoZSBzeXN0ZW0uCisgKiA8cD4KKyAqIFRoZSBwdXJwb3NlIG9mIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgaXMgdG8gZGlzY292ZXIgbWVkaWEgcm91dGVzIHRoYXQgc2F0aXNmeQorICogdGhlIGNyaXRlcmlhIHNwZWNpZmllZCBieSB0aGUgY3VycmVudCB7QGxpbmsgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3R9IGFuZCBwdWJsaXNoIGEKKyAqIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yfSB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggcm91dGUgYnkgY2FsbGluZworICoge0BsaW5rICNzZXREZXNjcmlwdG9yfSB0byBub3RpZnkgdGhlIGN1cnJlbnRseSByZWdpc3RlcmVkIHtAbGluayBDYWxsYmFja30uCisgKiA8L3A+PHA+CisgKiBUaGUgcHJvdmlkZXIgc2hvdWxkIHdhdGNoIGZvciBjaGFuZ2VzIHRvIHRoZSBkaXNjb3ZlcnkgcmVxdWVzdCBieSBpbXBsZW1lbnRpbmcKKyAqIHtAbGluayAjb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZH0gYW5kIHVwZGF0aW5nIHRoZSBzZXQgb2Ygcm91dGVzIHRoYXQgaXQgaXMKKyAqIGF0dGVtcHRpbmcgdG8gZGlzY292ZXIuICBJdCBzaG91bGQgYWxzbyBoYW5kbGUgcm91dGUgY29udHJvbCByZXF1ZXN0cyBzdWNoCisgKiBhcyB2b2x1bWUgY2hhbmdlcyBvciB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50c30KKyAqIGJ5IGltcGxlbWVudGluZyB7QGxpbmsgI29uQ3JlYXRlUm91dGVDb250cm9sbGVyfSB0byByZXR1cm4gYSB7QGxpbmsgUm91dGVDb250cm9sbGVyfQorICogZm9yIGEgcGFydGljdWxhciByb3V0ZS4KKyAqIDwvcD48cD4KKyAqIEEgbWVkaWEgcm91dGUgcHJvdmlkZXIgbWF5IGJlIHVzZWQgcHJpdmF0ZWx5IHdpdGhpbiB0aGUgc2NvcGUgb2YgYSBzaW5nbGUKKyAqIGFwcGxpY2F0aW9uIHByb2Nlc3MgYnkgY2FsbGluZyB7QGxpbmsgTWVkaWFSb3V0ZXIjYWRkUHJvdmlkZXIgTWVkaWFSb3V0ZXIuYWRkUHJvdmlkZXJ9CisgKiB0byBhZGQgaXQgdG8gdGhlIGxvY2FsIHtAbGluayBNZWRpYVJvdXRlcn0uICBBIG1lZGlhIHJvdXRlIHByb3ZpZGVyIG1heSBhbHNvIGJlIG1hZGUKKyAqIGF2YWlsYWJsZSBnbG9iYWxseSB0byBhbGwgYXBwbGljYXRpb25zIGJ5IHJlZ2lzdGVyaW5nIGEge0BsaW5rIE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2V9CisgKiBpbiB0aGUgcHJvdmlkZXIncyBtYW5pZmVzdC4gIFdoZW4gdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGlzIHJlZ2lzdGVyZWQKKyAqIGFzIGEgc2VydmljZSwgYWxsIGFwcGxpY2F0aW9ucyB0aGF0IHVzZSB0aGUgbWVkaWEgcm91dGVyIEFQSSB3aWxsIGJlIGFibGUgdG8KKyAqIGRpc2NvdmVyIGFuZCB1c2VkIHRoZSBwcm92aWRlcidzIHJvdXRlcyB3aXRob3V0IGhhdmluZyB0byBpbnN0YWxsIGFueXRoaW5nIGVsc2UuCisgKiA8L3A+PHA+CisgKiBUaGlzIG9iamVjdCBtdXN0IG9ubHkgYmUgYWNjZXNzZWQgb24gdGhlIG1haW4gdGhyZWFkLgorICogPC9wPgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWVkaWFSb3V0ZVByb3ZpZGVyIHsKKyAgICBzdGF0aWMgZmluYWwgaW50IE1TR19ERUxJVkVSX0RFU0NSSVBUT1JfQ0hBTkdFRCA9IDE7CisgICAgc3RhdGljIGZpbmFsIGludCBNU0dfREVMSVZFUl9ESVNDT1ZFUllfUkVRVUVTVF9DSEFOR0VEID0gMjsKKworICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyTWV0YWRhdGEgbU1ldGFkYXRhOworICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXJIYW5kbGVyIG1IYW5kbGVyID0gbmV3IFByb3ZpZGVySGFuZGxlcigpOworCisgICAgcHJpdmF0ZSBDYWxsYmFjayBtQ2FsbGJhY2s7CisKKyAgICBwcml2YXRlIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IG1EaXNjb3ZlcnlSZXF1ZXN0OworICAgIHByaXZhdGUgYm9vbGVhbiBtUGVuZGluZ0Rpc2NvdmVyeVJlcXVlc3RDaGFuZ2U7CisKKyAgICBwcml2YXRlIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgbURlc2NyaXB0b3I7CisgICAgcHJpdmF0ZSBib29sZWFuIG1QZW5kaW5nRGVzY3JpcHRvckNoYW5nZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBwcm92aWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXIoQE5vbk51bGwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CisgICAgfQorCisgICAgTWVkaWFSb3V0ZVByb3ZpZGVyKENvbnRleHQgY29udGV4dCwgUHJvdmlkZXJNZXRhZGF0YSBtZXRhZGF0YSkgeworICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZXh0IG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorCisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgaWYgKG1ldGFkYXRhID09IG51bGwpIHsKKyAgICAgICAgICAgIG1NZXRhZGF0YSA9IG5ldyBQcm92aWRlck1ldGFkYXRhKG5ldyBDb21wb25lbnROYW1lKGNvbnRleHQsIGdldENsYXNzKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY29udGV4dCBvZiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db250ZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHByb3ZpZGVyJ3MgaGFuZGxlciB3aGljaCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIG1haW4gdGhyZWFkLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBIYW5kbGVyIGdldEhhbmRsZXIoKSB7CisgICAgICAgIHJldHVybiBtSGFuZGxlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHNvbWUgbWV0YWRhdGEgYWJvdXQgdGhlIHByb3ZpZGVyJ3MgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFByb3ZpZGVyTWV0YWRhdGEgZ2V0TWV0YWRhdGEoKSB7CisgICAgICAgIHJldHVybiBtTWV0YWRhdGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSBwcm92aWRlcidzIGRlc2NyaXB0b3IgY2hhbmdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gdXNlLCBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0Q2FsbGJhY2soQE51bGxhYmxlIENhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIE1lZGlhUm91dGVyLmNoZWNrQ2FsbGluZ1RocmVhZCgpOworICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGRpc2NvdmVyeSByZXF1ZXN0IHdoaWNoIGluZm9ybXMgdGhlIHByb3ZpZGVyIGFib3V0IHRoZQorICAgICAqIGtpbmRzIG9mIHJvdXRlcyB0byBkaXNjb3ZlciBhbmQgd2hldGhlciB0byBwZXJmb3JtIGFjdGl2ZSBzY2FubmluZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgZGlzY292ZXJ5IHJlcXVlc3QsIG9yIG51bGwgaWYgbm8gZGlzY292ZXJ5IGlzIG5lZWRlZCBhdCB0aGlzIHRpbWUuCisgICAgICoKKyAgICAgKiBAc2VlICNvbkRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIGZpbmFsIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IGdldERpc2NvdmVyeVJlcXVlc3QoKSB7CisgICAgICAgIHJldHVybiBtRGlzY292ZXJ5UmVxdWVzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgZGlzY292ZXJ5IHJlcXVlc3QgdG8gaW5mb3JtIHRoZSBwcm92aWRlciBhYm91dCB0aGUga2luZHMgb2YKKyAgICAgKiByb3V0ZXMgdGhhdCBpdHMgY2xpZW50cyB3b3VsZCBsaWtlIHRvIGRpc2NvdmVyIGFuZCB3aGV0aGVyIHRvIHBlcmZvcm0gYWN0aXZlIHNjYW5uaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIGRpc2NvdmVyeSByZXF1ZXN0LCBvciBudWxsIGlmIG5vIGRpc2NvdmVyeSBpcyBuZWVkZWQgYXQgdGhpcyB0aW1lLgorICAgICAqCisgICAgICogQHNlZSAjb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZAorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldERpc2NvdmVyeVJlcXVlc3QoTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBNZWRpYVJvdXRlci5jaGVja0NhbGxpbmdUaHJlYWQoKTsKKworICAgICAgICBpZiAoT2JqZWN0c0NvbXBhdC5lcXVhbHMobURpc2NvdmVyeVJlcXVlc3QsIHJlcXVlc3QpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtRGlzY292ZXJ5UmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICAgIGlmICghbVBlbmRpbmdEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlKSB7CisgICAgICAgICAgICBtUGVuZGluZ0Rpc2NvdmVyeVJlcXVlc3RDaGFuZ2UgPSB0cnVlOworICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfREVMSVZFUl9ESVNDT1ZFUllfUkVRVUVTVF9DSEFOR0VEKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgZGVsaXZlckRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkKCkgeworICAgICAgICBtUGVuZGluZ0Rpc2NvdmVyeVJlcXVlc3RDaGFuZ2UgPSBmYWxzZTsKKyAgICAgICAgb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZChtRGlzY292ZXJ5UmVxdWVzdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgd2hlbiB0aGUge0BsaW5rIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IGRpc2NvdmVyeSByZXF1ZXN0fQorICAgICAqIGhhcyBjaGFuZ2VkLgorICAgICAqIDxwPgorICAgICAqIFdoZW5ldmVyIGFuIGFwcGxpY2F0aW9ucyBjYWxscyB7QGxpbmsgTWVkaWFSb3V0ZXIjYWRkQ2FsbGJhY2t9IHRvIHJlZ2lzdGVyCisgICAgICogYSBjYWxsYmFjaywgaXQgYWxzbyBwcm92aWRlcyBhIHNlbGVjdG9yIHRvIHNwZWNpZnkgdGhlIGtpbmRzIG9mIHJvdXRlcyB0aGF0CisgICAgICogaXQgaXMgaW50ZXJlc3RlZCBpbi4gIFRoZSBtZWRpYSByb3V0ZXIgY29tYmluZXMgYWxsIG9mIHRoZXNlIHNlbGVjdG9ycyB0b2dldGhlcgorICAgICAqIHRvIGdlbmVyYXRlIGEge0BsaW5rIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0fSBhbmQgbm90aWZpZXMgZWFjaCBwcm92aWRlciB3aGVuIGEgY2hhbmdlCisgICAgICogb2NjdXJzIGJ5IGNhbGxpbmcge0BsaW5rICNzZXREaXNjb3ZlcnlSZXF1ZXN0fSB3aGljaCBwb3N0cyBhIG1lc3NhZ2UgdG8gaW52b2tlCisgICAgICogdGhpcyBtZXRob2QgYXN5bmNocm9ub3VzbHkuCisgICAgICogPC9wPjxwPgorICAgICAqIFRoZSBwcm92aWRlciBzaG91bGQgZXhhbWluZSB0aGUge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGNhdGVnb3JpZXN9CisgICAgICogaW4gdGhlIGRpc2NvdmVyeSByZXF1ZXN0J3Mge0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3Rvcn0gdG8gZGV0ZXJtaW5lIHdoYXQKKyAgICAgKiBraW5kcyBvZiByb3V0ZXMgaXQgc2hvdWxkIHRyeSB0byBkaXNjb3ZlciBhbmQgd2hldGhlciBpdCBzaG91bGQgcGVyZm9ybSBhY3RpdmUKKyAgICAgKiBvciBwYXNzaXZlIHNjYW5zLiAgSW4gbWFueSBjYXNlcywgdGhlIHByb3ZpZGVyIG1heSBiZSBhYmxlIHRvIHNhdmUgcG93ZXIgYnkKKyAgICAgKiBkZXRlcm1pbmluZyB0aGF0IHRoZSBzZWxlY3RvciBkb2VzIG5vdCBjb250YWluIGFueSBjYXRlZ29yaWVzIHRoYXQgaXQgc3VwcG9ydHMKKyAgICAgKiBhbmQgaXQgY2FuIHRoZXJlZm9yZSBhdm9pZCBwZXJmb3JtaW5nIGFueSBzY2FucyBhdCBhbGwuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIG5ldyBkaXNjb3ZlcnkgcmVxdWVzdCwgb3IgbnVsbCBpZiBubyBkaXNjb3ZlcnkgaXMgbmVlZGVkIGF0IHRoaXMgdGltZS4KKyAgICAgKgorICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIjYWRkQ2FsbGJhY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkKEBOdWxsYWJsZSBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcHJvdmlkZXIncyBkZXNjcmlwdG9yLgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZXNjcmlwdG9yIGRlc2NyaWJlcyB0aGUgc3RhdGUgb2YgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGFuZAorICAgICAqIHRoZSByb3V0ZXMgdGhhdCBpdCBwdWJsaXNoZXMuICBXYXRjaCBmb3IgY2hhbmdlcyB0byB0aGUgZGVzY3JpcHRvcgorICAgICAqIGJ5IHJlZ2lzdGVyaW5nIGEge0BsaW5rIENhbGxiYWNrIGNhbGxiYWNrfSB3aXRoIHtAbGluayAjc2V0Q2FsbGJhY2t9LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKgorICAgICAqIEBzZWUgQ2FsbGJhY2sjb25EZXNjcmlwdG9yQ2hhbmdlZAorICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBmaW5hbCBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoKSB7CisgICAgICAgIHJldHVybiBtRGVzY3JpcHRvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwcm92aWRlcidzIGRlc2NyaXB0b3IuCisgICAgICogPHA+CisgICAgICogVGhlIHByb3ZpZGVyIG11c3QgY2FsbCB0aGlzIG1ldGhvZCB0byBub3RpZnkgdGhlIGN1cnJlbnRseSByZWdpc3RlcmVkCisgICAgICoge0BsaW5rIENhbGxiYWNrIGNhbGxiYWNrfSBhYm91dCB0aGUgY2hhbmdlIHRvIHRoZSBwcm92aWRlcidzIGRlc2NyaXB0b3IuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGRlc2NyaXB0b3IgVGhlIHVwZGF0ZWQgcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciwgb3IgbnVsbCBpZiBub25lLgorICAgICAqCisgICAgICogQHNlZSBDYWxsYmFjayNvbkRlc2NyaXB0b3JDaGFuZ2VkCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0RGVzY3JpcHRvcihATnVsbGFibGUgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7CisgICAgICAgIE1lZGlhUm91dGVyLmNoZWNrQ2FsbGluZ1RocmVhZCgpOworCisgICAgICAgIGlmIChtRGVzY3JpcHRvciAhPSBkZXNjcmlwdG9yKSB7CisgICAgICAgICAgICBtRGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7CisgICAgICAgICAgICBpZiAoIW1QZW5kaW5nRGVzY3JpcHRvckNoYW5nZSkgeworICAgICAgICAgICAgICAgIG1QZW5kaW5nRGVzY3JpcHRvckNoYW5nZSA9IHRydWU7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfREVMSVZFUl9ERVNDUklQVE9SX0NIQU5HRUQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBkZWxpdmVyRGVzY3JpcHRvckNoYW5nZWQoKSB7CisgICAgICAgIG1QZW5kaW5nRGVzY3JpcHRvckNoYW5nZSA9IGZhbHNlOworCisgICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNhbGxiYWNrLm9uRGVzY3JpcHRvckNoYW5nZWQodGhpcywgbURlc2NyaXB0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgdG8gb2J0YWluIGEgcm91dGUgY29udHJvbGxlciBmb3IgYSBwYXJ0aWN1bGFyIHJvdXRlLgorICAgICAqIDxwPgorICAgICAqIFRoZSBtZWRpYSByb3V0ZXIgd2lsbCBpbnZva2UgdGhlIHtAbGluayBSb3V0ZUNvbnRyb2xsZXIjb25SZWxlYXNlfSBtZXRob2Qgb2YgdGhlIHJvdXRlCisgICAgICogY29udHJvbGxlciB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQgdG8gYWxsb3cgaXQgdG8gZnJlZSBpdHMgcmVzb3VyY2VzLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb3V0ZUlkIFRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlLgorICAgICAqIEByZXR1cm4gVGhlIHJvdXRlIGNvbnRyb2xsZXIuICBSZXR1cm5zIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCByb3V0ZSBvciBpZiB0aGUgcm91dGUKKyAgICAgKiBjYW5ub3QgYmUgY29udHJvbGxlZCB1c2luZyB0aGUgcm91dGUgY29udHJvbGxlciBpbnRlcmZhY2UuCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIFJvdXRlQ29udHJvbGxlciBvbkNyZWF0ZVJvdXRlQ29udHJvbGxlcihATm9uTnVsbCBTdHJpbmcgcm91dGVJZCkgeworICAgICAgICBpZiAocm91dGVJZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUlkIGNhbm5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgdG8gb2J0YWluIGEgcm91dGUgY29udHJvbGxlciBmb3IgYSBwYXJ0aWN1bGFyIHJvdXRlIHdoaWNoIGlzIGEKKyAgICAgKiBtZW1iZXIgb2Yge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlR3JvdXB9LgorICAgICAqIDxwPgorICAgICAqIFRoZSBtZWRpYSByb3V0ZXIgd2lsbCBpbnZva2UgdGhlIHtAbGluayBSb3V0ZUNvbnRyb2xsZXIjb25SZWxlYXNlfSBtZXRob2Qgb2YgdGhlIHJvdXRlCisgICAgICogY29udHJvbGxlciB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQgdG8gYWxsb3cgaXQgdG8gZnJlZSBpdHMgcmVzb3VyY2VzLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb3V0ZUlkIFRoZSB1bmlxdWUgaWQgb2YgdGhlIG1lbWJlciByb3V0ZS4KKyAgICAgKiBAcGFyYW0gcm91dGVHcm91cElkIFRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlIGdyb3VwLgorICAgICAqIEByZXR1cm4gVGhlIHJvdXRlIGNvbnRyb2xsZXIuICBSZXR1cm5zIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCByb3V0ZSBvciBpZiB0aGUgcm91dGUKKyAgICAgKiBjYW5ub3QgYmUgY29udHJvbGxlZCB1c2luZyB0aGUgcm91dGUgY29udHJvbGxlciBpbnRlcmZhY2UuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQorICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBSb3V0ZUNvbnRyb2xsZXIgb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoQE5vbk51bGwgU3RyaW5nIHJvdXRlSWQsCisgICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgcm91dGVHcm91cElkKSB7CisgICAgICAgIGlmIChyb3V0ZUlkID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlSWQgY2Fubm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocm91dGVHcm91cElkID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlR3JvdXBJZCBjYW5ub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvbkNyZWF0ZVJvdXRlQ29udHJvbGxlcihyb3V0ZUlkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXNjcmliZXMgcHJvcGVydGllcyBvZiB0aGUgcm91dGUgcHJvdmlkZXIncyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByb3ZpZGVyTWV0YWRhdGEgeworICAgICAgICBwcml2YXRlIGZpbmFsIENvbXBvbmVudE5hbWUgbUNvbXBvbmVudE5hbWU7CisKKyAgICAgICAgUHJvdmlkZXJNZXRhZGF0YShDb21wb25lbnROYW1lIGNvbXBvbmVudE5hbWUpIHsKKyAgICAgICAgICAgIGlmIChjb21wb25lbnROYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21wb25lbnROYW1lIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBwcm92aWRlcidzIHBhY2thZ2UgbmFtZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvbXBvbmVudE5hbWUuZ2V0UGFja2FnZU5hbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBwcm92aWRlcidzIGNvbXBvbmVudCBuYW1lLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIENvbXBvbmVudE5hbWUgZ2V0Q29tcG9uZW50TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ29tcG9uZW50TmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlck1ldGFkYXRheyBjb21wb25lbnROYW1lPSIKKyAgICAgICAgICAgICAgICAgICAgKyBtQ29tcG9uZW50TmFtZS5mbGF0dGVuVG9TaG9ydFN0cmluZygpICsgIiB9IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGVzIGNvbnRyb2wgb3ZlciBhIHBhcnRpY3VsYXIgcm91dGUuCisgICAgICogPHA+CisgICAgICogVGhlIG1lZGlhIHJvdXRlciBvYnRhaW5zIGEgcm91dGUgY29udHJvbGxlciBmb3IgYSByb3V0ZSB3aGVuZXZlciBpdCBuZWVkcworICAgICAqIHRvIGNvbnRyb2wgYSByb3V0ZS4gIFdoZW4gYSByb3V0ZSBpcyBzZWxlY3RlZCwgdGhlIG1lZGlhIHJvdXRlciBpbnZva2VzCisgICAgICogdGhlIHtAbGluayAjb25TZWxlY3R9IG1ldGhvZCBvZiBpdHMgcm91dGUgY29udHJvbGxlci4gIFdoaWxlIHNlbGVjdGVkLAorICAgICAqIHRoZSBtZWRpYSByb3V0ZXIgbWF5IGNhbGwgb3RoZXIgbWV0aG9kcyBvZiB0aGUgcm91dGUgY29udHJvbGxlciB0bworICAgICAqIHJlcXVlc3QgdGhhdCBpdCBwZXJmb3JtIGNlcnRhaW4gYWN0aW9ucyB0byB0aGUgcm91dGUuICBXaGVuIGEgcm91dGUgaXMKKyAgICAgKiB1bnNlbGVjdGVkLCB0aGUgbWVkaWEgcm91dGVyIGludm9rZXMgdGhlIHtAbGluayAjb25VbnNlbGVjdH0gbWV0aG9kIG9mIGl0cworICAgICAqIHJvdXRlIGNvbnRyb2xsZXIuICBXaGVuIHRoZSBtZWRpYSByb3V0ZSBubyBsb25nZXIgbmVlZHMgdGhlIHJvdXRlIGNvbnRyb2xsZXIKKyAgICAgKiBpdCB3aWxsIGludm9rZSB0aGUge0BsaW5rICNvblJlbGVhc2V9IG1ldGhvZCB0byBhbGxvdyB0aGUgcm91dGUgY29udHJvbGxlcgorICAgICAqIHRvIGZyZWUgaXRzIHJlc291cmNlcy4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhlcmUgbWF5IGJlIG11bHRpcGxlIHJvdXRlIGNvbnRyb2xsZXJzIHNpbXVsdGFuZW91c2x5IGFjdGl2ZSBmb3IgdGhlCisgICAgICogc2FtZSByb3V0ZS4gIEVhY2ggcm91dGUgY29udHJvbGxlciB3aWxsIGJlIHJlbGVhc2VkIHNlcGFyYXRlbHkuCisgICAgICogPC9wPjxwPgorICAgICAqIEFsbCBvcGVyYXRpb25zIG9uIHRoZSByb3V0ZSBjb250cm9sbGVyIGFyZSBhc3luY2hyb25vdXMgYW5kCisgICAgICogcmVzdWx0cyBhcmUgY29tbXVuaWNhdGVkIHZpYSBjYWxsYmFja3MuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgUm91dGVDb250cm9sbGVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbGVhc2VzIHRoZSByb3V0ZSBjb250cm9sbGVyLCBhbGxvd2luZyBpdCB0byBmcmVlIGl0cyByZXNvdXJjZXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblJlbGVhc2UoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2VsZWN0cyB0aGUgcm91dGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblNlbGVjdCgpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBVbnNlbGVjdHMgdGhlIHJvdXRlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25VbnNlbGVjdCgpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBVbnNlbGVjdHMgdGhlIHJvdXRlIGFuZCBwcm92aWRlcyBhIHJlYXNvbi4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICogY2FsbHMge0BsaW5rICNvblVuc2VsZWN0KCl9LgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIHJlYXNvbiBwcm92aWRlZCB3aWxsIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICAgICAgICAgKiA8dWw+CisgICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1VOS05PV059PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fRElTQ09OTkVDVEVEfTwvbGk+CisgICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1NUT1BQRUR9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fUk9VVEVfQ0hBTkdFRH08L2xpPgorICAgICAgICAgKiA8L3VsPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcmVhc29uIFRoZSByZWFzb24gZm9yIHVuc2VsZWN0aW5nIHRoZSByb3V0ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uVW5zZWxlY3QoaW50IHJlYXNvbikgeworICAgICAgICAgICAgb25VbnNlbGVjdCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlcXVlc3RzIHRvIHNldCB0aGUgdm9sdW1lIG9mIHRoZSByb3V0ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHZvbHVtZSBUaGUgbmV3IHZvbHVtZSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIHtAbGluayBNZWRpYVJvdXRlRGVzY3JpcHRvciNnZXRWb2x1bWVNYXh9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25TZXRWb2x1bWUoaW50IHZvbHVtZSkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlcXVlc3RzIGFuIGluY3JlbWVudGFsIHZvbHVtZSB1cGRhdGUgZm9yIHRoZSByb3V0ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGRlbHRhIFRoZSBkZWx0YSB0byBhZGQgdG8gdGhlIGN1cnJlbnQgdm9sdW1lLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25VcGRhdGVWb2x1bWUoaW50IGRlbHRhKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUGVyZm9ybXMgYSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IHJlcXVlc3QKKyAgICAgICAgICogYXN5bmNocm9ub3VzbHkgb24gYmVoYWxmIG9mIHRoZSByb3V0ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGludGVudCBBIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBpbnRlbnR9LgorICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSB7QGxpbmsgQ29udHJvbFJlcXVlc3RDYWxsYmFja30gdG8gaW52b2tlIHdpdGggdGhlIHJlc3VsdAorICAgICAgICAgKiBvZiB0aGUgcmVxdWVzdCwgb3IgbnVsbCBpZiBubyByZXN1bHQgaXMgcmVxdWlyZWQuCisgICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY29udHJvbGxlciBpbnRlbmRzIHRvIGhhbmRsZSB0aGUgcmVxdWVzdCBhbmQgd2lsbAorICAgICAgICAgKiBpbnZva2UgdGhlIGNhbGxiYWNrIHdoZW4gZmluaXNoZWQuICBGYWxzZSBpZiB0aGUgY29udHJvbGxlciB3aWxsIG5vdAorICAgICAgICAgKiBoYW5kbGUgdGhlIHJlcXVlc3QgYW5kIHdpbGwgbm90IGludm9rZSB0aGUgY2FsbGJhY2suCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNvbnRyb2xSZXF1ZXN0KEludGVudCBpbnRlbnQsIEBOdWxsYWJsZSBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayB3aGljaCBpcyBpbnZva2VkIHdoZW4gcm91dGUgaW5mb3JtYXRpb24gYmVjb21lcyBhdmFpbGFibGUgb3IgY2hhbmdlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIENhbGxiYWNrIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGluZm9ybWF0aW9uIGFib3V0IGEgcm91dGUgcHJvdmlkZXIgYW5kIGl0cyByb3V0ZXMgY2hhbmdlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHByb3ZpZGVyIFRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciB0aGF0IGNoYW5nZWQsIG5ldmVyIG51bGwuCisgICAgICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yIFRoZSBuZXcgbWVkaWEgcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciwgb3IgbnVsbCBpZiBub25lLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25EZXNjcmlwdG9yQ2hhbmdlZChATm9uTnVsbCBNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIsCisgICAgICAgICAgICAgICAgQE51bGxhYmxlIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBQcm92aWRlckhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKKyAgICAgICAgUHJvdmlkZXJIYW5kbGVyKCkgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19ERUxJVkVSX0RFU0NSSVBUT1JfQ0hBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgZGVsaXZlckRlc2NyaXB0b3JDaGFuZ2VkKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0RFTElWRVJfRElTQ09WRVJZX1JFUVVFU1RfQ0hBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgZGVsaXZlckRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIxY2UwOQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLmphdmEKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogRGVzY3JpYmVzIHRoZSBzdGF0ZSBvZiBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGFuZCB0aGUgcm91dGVzIHRoYXQgaXQgcHVibGlzaGVzLgorICogPHA+CisgKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkIHVzaW5nIGEge0BsaW5rIEJ1aWxkZXJ9IGluc3RhbmNlLgorICogPC9wPgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ST1VURVMgPSAicm91dGVzIjsKKworICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7CisgICAgcHJpdmF0ZSBMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPiBtUm91dGVzOworCisgICAgcHJpdmF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yKEJ1bmRsZSBidW5kbGUsIExpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+IHJvdXRlcykgeworICAgICAgICBtQnVuZGxlID0gYnVuZGxlOworICAgICAgICBtUm91dGVzID0gcm91dGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgYWxsIHJvdXRlcyB0aGF0IHRoaXMgcHJvdmlkZXIgaGFzIHB1Ymxpc2hlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gZ2V0Um91dGVzKCkgeworICAgICAgICBlbnN1cmVSb3V0ZXMoKTsKKyAgICAgICAgcmV0dXJuIG1Sb3V0ZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZVJvdXRlcygpIHsKKyAgICAgICAgaWYgKG1Sb3V0ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgQXJyYXlMaXN0PEJ1bmRsZT4gcm91dGVCdW5kbGVzID0gbUJ1bmRsZS48QnVuZGxlPmdldFBhcmNlbGFibGVBcnJheUxpc3QoS0VZX1JPVVRFUyk7CisgICAgICAgICAgICBpZiAocm91dGVCdW5kbGVzID09IG51bGwgfHwgcm91dGVCdW5kbGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG1Sb3V0ZXMgPSBDb2xsZWN0aW9ucy48TWVkaWFSb3V0ZURlc2NyaXB0b3I+ZW1wdHlMaXN0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IHJvdXRlQnVuZGxlcy5zaXplKCk7CisgICAgICAgICAgICAgICAgbVJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+KGNvdW50KTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgbVJvdXRlcy5hZGQoTWVkaWFSb3V0ZURlc2NyaXB0b3IuZnJvbUJ1bmRsZShyb3V0ZUJ1bmRsZXMuZ2V0KGkpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yIGFuZCBhbGwgb2YgdGhlIHJvdXRlcyB0aGF0CisgICAgICogaXQgY29udGFpbnMgaGF2ZSBhbGwgb2YgdGhlIHJlcXVpcmVkIGZpZWxkcy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHZlcmlmaWNhdGlvbiBpcyBkZWVwLiAgSWYgdGhlIHByb3ZpZGVyIGRlc2NyaXB0b3IgaXMga25vd24gdG8gYmUKKyAgICAgKiB2YWxpZCB0aGVuIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY2FsbCB7QGxpbmsgI2lzVmFsaWR9IG9uIGVhY2ggb2YgaXRzIHJvdXRlcy4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKKyAgICAgICAgZW5zdXJlUm91dGVzKCk7CisgICAgICAgIGZpbmFsIGludCByb3V0ZUNvdW50ID0gbVJvdXRlcy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm91dGVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvciByb3V0ZSA9IG1Sb3V0ZXMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKHJvdXRlID09IG51bGwgfHwgIXJvdXRlLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIk1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3J7ICIpOworICAgICAgICByZXN1bHQuYXBwZW5kKCJyb3V0ZXM9IikuYXBwZW5kKAorICAgICAgICAgICAgICAgIEFycmF5cy50b1N0cmluZyhnZXRSb3V0ZXMoKS50b0FycmF5KCkpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBpc1ZhbGlkPSIpLmFwcGVuZChpc1ZhbGlkKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKCIgfSIpOworICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBidW5kbGUgZm9yIHNlcmlhbGl6YXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHJlcHJlc2VudGVkIGFzIGEgYnVuZGxlLgorICAgICAqLworICAgIHB1YmxpYyBCdW5kbGUgYXNCdW5kbGUoKSB7CisgICAgICAgIHJldHVybiBtQnVuZGxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZnJvbSBhIGJ1bmRsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lLgorICAgICAqIEByZXR1cm4gVGhlIG5ldyBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgYnVuZGxlIHdhcyBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBmcm9tQnVuZGxlKEJ1bmRsZSBidW5kbGUpIHsKKyAgICAgICAgcmV0dXJuIGJ1bmRsZSAhPSBudWxsID8gbmV3IE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IoYnVuZGxlLCBudWxsKSA6IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQnVpbGRlciBmb3Ige0BsaW5rIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgbWVkaWEgcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvcnN9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7CisgICAgICAgIHByaXZhdGUgQXJyYXlMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPiBtUm91dGVzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IgYnVpbGRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyKCkgeworICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciBidWlsZGVyIHdob3NlIGluaXRpYWwgY29udGVudHMgYXJlCisgICAgICAgICAqIGNvcGllZCBmcm9tIGFuIGV4aXN0aW5nIGRlc2NyaXB0b3IuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlcihNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkZXNjcmlwdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoZGVzY3JpcHRvci5tQnVuZGxlKTsKKworICAgICAgICAgICAgZGVzY3JpcHRvci5lbnN1cmVSb3V0ZXMoKTsKKyAgICAgICAgICAgIGlmICghZGVzY3JpcHRvci5tUm91dGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPihkZXNjcmlwdG9yLm1Sb3V0ZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgYSByb3V0ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFJvdXRlKE1lZGlhUm91dGVEZXNjcmlwdG9yIHJvdXRlKSB7CisgICAgICAgICAgICBpZiAocm91dGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1Sb3V0ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPigpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtUm91dGVzLmNvbnRhaW5zKHJvdXRlKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlIGRlc2NyaXB0b3IgYWxyZWFkeSBhZGRlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVJvdXRlcy5hZGQocm91dGUpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyBhIGxpc3Qgb2Ygcm91dGVzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkUm91dGVzKENvbGxlY3Rpb248TWVkaWFSb3V0ZURlc2NyaXB0b3I+IHJvdXRlcykgeworICAgICAgICAgICAgaWYgKHJvdXRlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGVzIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFyb3V0ZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgZm9yIChNZWRpYVJvdXRlRGVzY3JpcHRvciByb3V0ZSA6IHJvdXRlcykgeworICAgICAgICAgICAgICAgICAgICBhZGRSb3V0ZShyb3V0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgbGlzdCBvZiByb3V0ZXMuCisgICAgICAgICAqLworICAgICAgICBCdWlsZGVyIHNldFJvdXRlcyhDb2xsZWN0aW9uPE1lZGlhUm91dGVEZXNjcmlwdG9yPiByb3V0ZXMpIHsKKyAgICAgICAgICAgIGlmIChyb3V0ZXMgPT0gbnVsbCB8fCByb3V0ZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgbVJvdXRlcyA9IG51bGw7CisgICAgICAgICAgICAgICAgbUJ1bmRsZS5yZW1vdmUoS0VZX1JPVVRFUyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PD4ocm91dGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1aWxkcyB0aGUge0BsaW5rIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgbWVkaWEgcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvcn0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBidWlsZCgpIHsKKyAgICAgICAgICAgIGlmIChtUm91dGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUm91dGVzLnNpemUoKTsKKyAgICAgICAgICAgICAgICBBcnJheUxpc3Q8QnVuZGxlPiByb3V0ZUJ1bmRsZXMgPSBuZXcgQXJyYXlMaXN0PEJ1bmRsZT4oY291bnQpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICByb3V0ZUJ1bmRsZXMuYWRkKG1Sb3V0ZXMuZ2V0KGkpLmFzQnVuZGxlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQnVuZGxlLnB1dFBhcmNlbGFibGVBcnJheUxpc3QoS0VZX1JPVVRFUywgcm91dGVCdW5kbGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvcihtQnVuZGxlLCBtUm91dGVzKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZTkzNDMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuamF2YQpAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NlbmdlcjsKKworLyoqCisgKiBEZWZpbmVzIHRoZSBjb21tdW5pY2F0aW9uIHByb3RvY29sIGZvciBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlcy4KKyAqLworYWJzdHJhY3QgY2xhc3MgTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wgeworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgSW50ZW50fSB0aGF0IG11c3QgYmUgZGVjbGFyZWQgYXMgaGFuZGxlZCBieSB0aGUgc2VydmljZS4KKyAgICAgKiBQdXQgdGhpcyBpbiB5b3VyIG1hbmlmZXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfSU5URVJGQUNFID0KKyAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UiOworCisgICAgLyoKKyAgICAgKiBNZXNzYWdlcyBzZW50IGZyb20gdGhlIGNsaWVudCB0byB0aGUgc2VydmljZS4KKyAgICAgKiBETyBOT1QgUkVOVU1CRVIgVEhFU0UhCisgICAgICovCisKKyAgICAvKiogKGNsaWVudCB2MSkKKyAgICAgKiBSZWdpc3RlciBjbGllbnQuCisgICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgorICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKKyAgICAgKiAtIGFyZzIgICAgOiBjbGllbnQgdmVyc2lvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfUkVHSVNURVIgPSAxOworCisgICAgLyoqIChjbGllbnQgdjEpCisgICAgICogVW5yZWdpc3RlciBjbGllbnQuCisgICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgorICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1VOUkVHSVNURVIgPSAyOworCisgICAgLyoqIChjbGllbnQgdjEpCisgICAgICogQ3JlYXRlIHJvdXRlIGNvbnRyb2xsZXIuCisgICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgorICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKKyAgICAgKiAtIGFyZzIgICAgOiByb3V0ZSBjb250cm9sbGVyIGlkCisgICAgICogLSBDTElFTlRfREFUQV9ST1VURV9JRCA6IHJvdXRlIGlkIHN0cmluZworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfQ1JFQVRFX1JPVVRFX0NPTlRST0xMRVIgPSAzOworCisgICAgLyoqIChjbGllbnQgdjEpCisgICAgICogUmVsZWFzZSByb3V0ZSBjb250cm9sbGVyLgorICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKKyAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCisgICAgICogLSBhcmcyICAgIDogcm91dGUgY29udHJvbGxlciBpZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfUkVMRUFTRV9ST1VURV9DT05UUk9MTEVSID0gNDsKKworICAgIC8qKiAoY2xpZW50IHYxKQorICAgICAqIFNlbGVjdCByb3V0ZS4KKyAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCisgICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAorICAgICAqIC0gYXJnMiAgICA6IHJvdXRlIGNvbnRyb2xsZXIgaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1NFTEVDVF9ST1VURSA9IDU7CisKKyAgICAvKiogKGNsaWVudCB2MSkKKyAgICAgKiBVbnNlbGVjdCByb3V0ZS4KKyAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCisgICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAorICAgICAqIC0gYXJnMiAgICA6IHJvdXRlIGNvbnRyb2xsZXIgaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1VOU0VMRUNUX1JPVVRFID0gNjsKKworICAgIC8qKiAoY2xpZW50IHYxKQorICAgICAqIFNldCByb3V0ZSB2b2x1bWUuCisgICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgorICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKKyAgICAgKiAtIGFyZzIgICAgOiByb3V0ZSBjb250cm9sbGVyIGlkCisgICAgICogLSBDTElFTlRfREFUQV9WT0xVTUUgOiB2b2x1bWUgaW50ZWdlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfU0VUX1JPVVRFX1ZPTFVNRSA9IDc7CisKKyAgICAvKiogKGNsaWVudCB2MSkKKyAgICAgKiBVcGRhdGUgcm91dGUgdm9sdW1lLgorICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKKyAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCisgICAgICogLSBhcmcyICAgIDogcm91dGUgY29udHJvbGxlciBpZAorICAgICAqIC0gQ0xJRU5UX0RBVEFfVk9MVU1FIDogdm9sdW1lIGRlbHRhIGludGVnZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1VQREFURV9ST1VURV9WT0xVTUUgPSA4OworCisgICAgLyoqIChjbGllbnQgdjEpCisgICAgICogUm91dGUgY29udHJvbCByZXF1ZXN0LgorICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKKyAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCisgICAgICogLSBhcmcyICAgIDogcm91dGUgY29udHJvbGxlciBpZAorICAgICAqIC0gb2JqICAgICA6IG1lZGlhIGNvbnRyb2wgaW50ZW50CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19ST1VURV9DT05UUk9MX1JFUVVFU1QgPSA5OworCisgICAgLyoqIChjbGllbnQgdjEpCisgICAgICogU2V0cyB0aGUgZGlzY292ZXJ5IHJlcXVlc3QuCisgICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgorICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKKyAgICAgKiAtIG9iaiAgICAgOiBkaXNjb3ZlcnkgcmVxdWVzdCBidW5kbGUsIG9yIG51bGwgaWYgbm9uZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfU0VUX0RJU0NPVkVSWV9SRVFVRVNUID0gMTA7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfREFUQV9ST1VURV9JRCA9ICJyb3V0ZUlkIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfREFUQV9ST1VURV9MSUJSQVJZX0dST1VQID0gInJvdXRlR3JvdXBJZCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX0RBVEFfVk9MVU1FID0gInZvbHVtZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX0RBVEFfVU5TRUxFQ1RfUkVBU09OID0gInVuc2VsZWN0UmVhc29uIjsKKworICAgIC8qCisgICAgICogTWVzc2FnZXMgc2VudCBmcm9tIHRoZSBzZXJ2aWNlIHRvIHRoZSBjbGllbnQuCisgICAgICogRE8gTk9UIFJFTlVNQkVSIFRIRVNFIQorICAgICAqLworCisgICAgLyoqIChzZXJ2aWNlIHYxKQorICAgICAqIEdlbmVyaWMgZmFpbHVyZSBzZW50IGluIHJlc3BvbnNlIHRvIGFueSB1bnJlY29nbml6ZWQgb3IgbWFsZm9ybWVkIHJlcXVlc3QuCisgICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfTVNHX0dFTkVSSUNfRkFJTFVSRSA9IDA7CisKKyAgICAvKiogKHNlcnZpY2UgdjEpCisgICAgICogR2VuZXJpYyBmYWlsdXJlIHNlbnQgaW4gcmVzcG9uc2UgdG8gYSBzdWNjZXNzZnVsIG1lc3NhZ2UuCisgICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfTVNHX0dFTkVSSUNfU1VDQ0VTUyA9IDE7CisKKyAgICAvKiogKHNlcnZpY2UgdjEpCisgICAgICogUmVnaXN0cmF0aW9uIHN1Y2NlZWRlZC4KKyAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCisgICAgICogLSBhcmcyICAgIDogc2VydmVyIHZlcnNpb24KKyAgICAgKiAtIG9iaiAgICAgOiByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yIGJ1bmRsZSwgb3IgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfTVNHX1JFR0lTVEVSRUQgPSAyOworCisgICAgLyoqIChzZXJ2aWNlIHYxKQorICAgICAqIFJvdXRlIGNvbnRyb2wgcmVxdWVzdCBzdWNjZXNzIHJlc3VsdC4KKyAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCisgICAgICogLSBvYmogICAgIDogcmVzdWx0IGRhdGEgYnVuZGxlLCBvciBudWxsCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX1NVQ0NFRURFRCA9IDM7CisKKyAgICAvKiogKHNlcnZpY2UgdjEpCisgICAgICogUm91dGUgY29udHJvbCByZXF1ZXN0IGZhaWx1cmUgcmVzdWx0LgorICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKKyAgICAgKiAtIG9iaiAgICAgOiByZXN1bHQgZGF0YSBidW5kbGUsIG9yIG51bGwKKyAgICAgKiAtIFNFUlZJQ0VfREFUQV9FUlJPUjogZXJyb3IgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9GQUlMRUQgPSA0OworCisgICAgLyoqIChzZXJ2aWNlIHYxKQorICAgICAqIFJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IgY2hhbmdlZC4gICh1bnNvbGljaXRlZCBldmVudCkKKyAgICAgKiAtIGFyZzEgICAgOiByZXNlcnZlZCAoMCkKKyAgICAgKiAtIG9iaiAgICAgOiByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yIGJ1bmRsZSwgb3IgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfTVNHX0RFU0NSSVBUT1JfQ0hBTkdFRCA9IDU7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0RBVEFfRVJST1IgPSAiZXJyb3IiOworCisgICAgLyoKKyAgICAgKiBSZWNvZ25pemVkIGNsaWVudCB2ZXJzaW9uIG51bWJlcnMuICAoUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuKQorICAgICAqIERPIE5PVCBSRU5VTUJFUiBUSEVTRSEKKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIFRoZSBjbGllbnQgdmVyc2lvbiB1c2VkIGZyb20gdGhlIGJlZ2lubmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfVkVSU0lPTl8xID0gMTsKKworICAgIC8qKgorICAgICAqIFRoZSBjbGllbnQgdmVyc2lvbiB1c2VkIGZyb20gc3VwcG9ydCBsaWJyYXJ5IHYyNC4xLjAuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX1ZFUlNJT05fMiA9IDI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCBjbGllbnQgdmVyc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfVkVSU0lPTl9DVVJSRU5UID0gQ0xJRU5UX1ZFUlNJT05fMjsKKworICAgIC8qCisgICAgICogUmVjb2duaXplZCBzZXJ2ZXIgdmVyc2lvbiBudW1iZXJzLiAgKFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLikKKyAgICAgKiBETyBOT1QgUkVOVU1CRVIgVEhFU0UhCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmljZSB2ZXJzaW9uIHVzZWQgZnJvbSB0aGUgYmVnaW5uaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfVkVSU0lPTl8xID0gMTsKKworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50IHNlcnZpY2UgdmVyc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX1ZFUlNJT05fQ1VSUkVOVCA9IFNFUlZJQ0VfVkVSU0lPTl8xOworCisgICAgc3RhdGljIGZpbmFsIGludCBDTElFTlRfVkVSU0lPTl9TVEFSVCA9IENMSUVOVF9WRVJTSU9OXzE7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1lc3NlbmdlciBvYmplY3QgaXMgdmFsaWQuCisgICAgICogPHA+CisgICAgICogVGhlIG1lc3NlbmdlciBjb25zdHJ1Y3RvciBhbmQgdW5wYXJjZWxpbmcgY29kZSBkb2VzIG5vdCBjaGVjayB3aGV0aGVyIHRoZQorICAgICAqIHByb3ZpZGVkIElCaW5kZXIgaXMgYSB2YWxpZCBJTWVzc2VuZ2VyIG9iamVjdC4gIEFzIGEgcmVzdWx0LCBpdCdzIHBvc3NpYmxlCisgICAgICogZm9yIGEgcGVlciB0byBzZW5kIGFuIGludmFsaWQgSUJpbmRlciB0aGF0IHdpbGwgcmVzdWx0IGluIGNyYXNoZXMgZG93bnN0cmVhbS4KKyAgICAgKiBUaGlzIG1ldGhvZCBjaGVja3MgdGhhdCB0aGUgbWVzc2VuZ2VyIGlzIGluIGEgdmFsaWQgc3RhdGUuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkUmVtb3RlTWVzc2VuZ2VyKE1lc3NlbmdlciBtZXNzZW5nZXIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtZXNzZW5nZXIgIT0gbnVsbCAmJiBtZXNzZW5nZXIuZ2V0QmluZGVyKCkgIT0gbnVsbDsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBtZXNzZW5nZXIgd2FzIGNvbnN0cnVjdGVkIHdpdGggYSBiaW5kZXIgaW50ZXJmYWNlIG90aGVyIHRoYW4KKyAgICAgICAgICAgIC8vIElNZXNzZW5nZXIgdGhlbiB0aGUgY2FsbCB0byBnZXRCaW5kZXIoKSB3aWxsIGNyYXNoIHdpdGggYW4gTlBFLgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlclNlcnZpY2UuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNjZGUxMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSw3NTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKKworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9EQVRBX1JPVVRFX0lEOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCisgICAgICAgIC5DTElFTlRfREFUQV9ST1VURV9MSUJSQVJZX0dST1VQOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCisgICAgICAgIC5DTElFTlRfREFUQV9VTlNFTEVDVF9SRUFTT047CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX0RBVEFfVk9MVU1FOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCisgICAgICAgIC5DTElFTlRfTVNHX0NSRUFURV9ST1VURV9DT05UUk9MTEVSOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9NU0dfUkVHSVNURVI7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKKyAgICAgICAgLkNMSUVOVF9NU0dfUkVMRUFTRV9ST1VURV9DT05UUk9MTEVSOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCisgICAgICAgIC5DTElFTlRfTVNHX1JPVVRFX0NPTlRST0xfUkVRVUVTVDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfTVNHX1NFTEVDVF9ST1VURTsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAorICAgICAgICAuQ0xJRU5UX01TR19TRVRfRElTQ09WRVJZX1JFUVVFU1Q7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKKyAgICAgICAgLkNMSUVOVF9NU0dfU0VUX1JPVVRFX1ZPTFVNRTsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfTVNHX1VOUkVHSVNURVI7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKKyAgICAgICAgLkNMSUVOVF9NU0dfVU5TRUxFQ1RfUk9VVEU7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKKyAgICAgICAgLkNMSUVOVF9NU0dfVVBEQVRFX1JPVVRFX1ZPTFVNRTsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfVkVSU0lPTl8xOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLlNFUlZJQ0VfREFUQV9FUlJPUjsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAorICAgICAgICAuU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAorICAgICAgICAuU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX1NVQ0NFRURFRDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAorICAgICAgICAuU0VSVklDRV9NU0dfREVTQ1JJUFRPUl9DSEFOR0VEOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCisgICAgICAgIC5TRVJWSUNFX01TR19HRU5FUklDX0ZBSUxVUkU7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKKyAgICAgICAgLlNFUlZJQ0VfTVNHX0dFTkVSSUNfU1VDQ0VTUzsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX01TR19SRUdJU1RFUkVEOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLlNFUlZJQ0VfVkVSU0lPTl9DVVJSRU5UOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLmlzVmFsaWRSZW1vdGVNZXNzZW5nZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5EZWFkT2JqZWN0RXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyLkRlYXRoUmVjaXBpZW50OworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NlbmdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5WaXNpYmxlRm9yVGVzdGluZzsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudXRpbC5PYmplY3RzQ29tcGF0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OworCitpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZXMuCisgKiA8cD4KKyAqIEEgbWVkaWEgcm91dGVyIHdpbGwgYmluZCB0byBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlcyB3aGVuIGEgY2FsbGJhY2sgaXMgYWRkZWQgdmlhCisgKiB7QGxpbmsgTWVkaWFSb3V0ZXIjYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yLCBNZWRpYVJvdXRlci5DYWxsYmFjaywgaW50KX0gd2l0aCBhIGRpc2NvdmVyeQorICogZmxhZzoge0BsaW5rIE1lZGlhUm91dGVyI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUll9LAorICoge0BsaW5rIE1lZGlhUm91dGVyI0NBTExCQUNLX0ZMQUdfRk9SQ0VfRElTQ09WRVJZfSwgb3IKKyAqIHtAbGluayBNZWRpYVJvdXRlciNDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU59LCBhbmQgd2lsbCB1bmJpbmQgd2hlbiB0aGUgY2FsbGJhY2sKKyAqIGlzIHJlbW92ZWQgdmlhIHtAbGluayBNZWRpYVJvdXRlciNyZW1vdmVDYWxsYmFjayhNZWRpYVJvdXRlci5DYWxsYmFjayl9LgorICogPC9wPjxwPgorICogVG8gaW1wbGVtZW50IHlvdXIgb3duIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2UsIGV4dGVuZCB0aGlzIGNsYXNzIGFuZAorICogb3ZlcnJpZGUgdGhlIHtAbGluayAjb25DcmVhdGVNZWRpYVJvdXRlUHJvdmlkZXJ9IG1ldGhvZCB0byByZXR1cm4gYW4KKyAqIGluc3RhbmNlIG9mIHlvdXIge0BsaW5rIE1lZGlhUm91dGVQcm92aWRlcn0uCisgKiA8L3A+PHA+CisgKiBEZWNsYXJlIHlvdXIgbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZSBpbiB5b3VyIGFwcGxpY2F0aW9uIG1hbmlmZXN0CisgKiBsaWtlIHRoaXM6CisgKiA8L3A+CisgKiA8cHJlPgorICogICAmbHQ7c2VydmljZSBhbmRyb2lkOm5hbWU9Ii5NeU1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UiCisgKiAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9teV9tZWRpYV9yb3V0ZV9wcm92aWRlcl9zZXJ2aWNlIj4KKyAqICAgICAgICZsdDtpbnRlbnQtZmlsdGVyPgorICogICAgICAgICAgICZsdDthY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UiIC8+CisgKiAgICAgICAmbHQ7L2ludGVudC1maWx0ZXI+CisgKiAgICZsdDsvc2VydmljZT4KKyAqIDwvcHJlPgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZSBleHRlbmRzIFNlcnZpY2UgeworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVQcm92aWRlclNydiI7IC8vIG1heC4gMjMgY2hhcnMKKyAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKKworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PENsaWVudFJlY29yZD4gbUNsaWVudHMgPSBuZXcgQXJyYXlMaXN0PENsaWVudFJlY29yZD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFJlY2VpdmVIYW5kbGVyIG1SZWNlaXZlSGFuZGxlcjsKKyAgICBwcml2YXRlIGZpbmFsIE1lc3NlbmdlciBtUmVjZWl2ZU1lc3NlbmdlcjsKKyAgICBmaW5hbCBQcml2YXRlSGFuZGxlciBtUHJpdmF0ZUhhbmRsZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlckNhbGxiYWNrIG1Qcm92aWRlckNhbGxiYWNrOworCisgICAgTWVkaWFSb3V0ZVByb3ZpZGVyIG1Qcm92aWRlcjsKKyAgICBwcml2YXRlIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IG1Db21wb3NpdGVEaXNjb3ZlcnlSZXF1ZXN0OworCisgICAgLyoqCisgICAgICogVGhlIHtAbGluayBJbnRlbnR9IHRoYXQgbXVzdCBiZSBkZWNsYXJlZCBhcyBoYW5kbGVkIGJ5IHRoZSBzZXJ2aWNlLgorICAgICAqIFB1dCB0aGlzIGluIHlvdXIgbWFuaWZlc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9JTlRFUkZBQ0UgPSBNZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX0lOVEVSRkFDRTsKKworICAgIC8qCisgICAgICogUHJpdmF0ZSBtZXNzYWdlcyB1c2VkIGludGVybmFsbHkuICAoWWVzLCB5b3UgY2FuIHJlbnVtYmVyIHRoZXNlLikKKyAgICAgKi8KKworICAgIHN0YXRpYyBmaW5hbCBpbnQgUFJJVkFURV9NU0dfQ0xJRU5UX0RJRUQgPSAxOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UoKSB7CisgICAgICAgIG1SZWNlaXZlSGFuZGxlciA9IG5ldyBSZWNlaXZlSGFuZGxlcih0aGlzKTsKKyAgICAgICAgbVJlY2VpdmVNZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKG1SZWNlaXZlSGFuZGxlcik7CisgICAgICAgIG1Qcml2YXRlSGFuZGxlciA9IG5ldyBQcml2YXRlSGFuZGxlcigpOworICAgICAgICBtUHJvdmlkZXJDYWxsYmFjayA9IG5ldyBQcm92aWRlckNhbGxiYWNrKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBzeXN0ZW0gd2hlbiBpdCBpcyB0aW1lIHRvIGNyZWF0ZSB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBvZmZlcmVkIGJ5IHRoaXMgc2VydmljZSwgb3IgbnVsbCBpZgorICAgICAqIHRoaXMgc2VydmljZSBoYXMgZGVjaWRlZCBub3QgdG8gb2ZmZXIgYSBtZWRpYSByb3V0ZSBwcm92aWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgTWVkaWFSb3V0ZVByb3ZpZGVyIG9uQ3JlYXRlTWVkaWFSb3V0ZVByb3ZpZGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBvZmZlcmVkIGJ5IHRoaXMgc2VydmljZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIG9mZmVyZWQgYnkgdGhpcyBzZXJ2aWNlLCBvciBudWxsIGlmCisgICAgICogaXQgaGFzIG5vdCB5ZXQgYmVlbiBjcmVhdGVkLgorICAgICAqCisgICAgICogQHNlZSAjb25DcmVhdGVNZWRpYVJvdXRlUHJvdmlkZXIoKQorICAgICAqLworICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXIgZ2V0TWVkaWFSb3V0ZVByb3ZpZGVyKCkgeworICAgICAgICByZXR1cm4gbVByb3ZpZGVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKFNFUlZJQ0VfSU5URVJGQUNFKSkgeworICAgICAgICAgICAgaWYgKG1Qcm92aWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyID0gb25DcmVhdGVNZWRpYVJvdXRlUHJvdmlkZXIoKTsKKyAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvdmlkZXJQYWNrYWdlID0gcHJvdmlkZXIuZ2V0TWV0YWRhdGEoKS5nZXRQYWNrYWdlTmFtZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXByb3ZpZGVyUGFja2FnZS5lcXVhbHMoZ2V0UGFja2FnZU5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm9uQ3JlYXRlTWVkaWFSb3V0ZVByb3ZpZGVyKCkgcmV0dXJuZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJhIHByb3ZpZGVyIHdob3NlIHBhY2thZ2UgbmFtZSBkb2VzIG5vdCBtYXRjaCB0aGUgcGFja2FnZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm5hbWUgb2YgdGhlIHNlcnZpY2UuICBBIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2UgY2FuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAib25seSBleHBvcnQgaXRzIG93biBtZWRpYSByb3V0ZSBwcm92aWRlcnMuICAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlByb3ZpZGVyIHBhY2thZ2UgbmFtZTogIiArIHByb3ZpZGVyUGFja2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIuICBTZXJ2aWNlIHBhY2thZ2UgbmFtZTogIiArIGdldFBhY2thZ2VOYW1lKCkgKyAiLiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1Qcm92aWRlciA9IHByb3ZpZGVyOworICAgICAgICAgICAgICAgICAgICBtUHJvdmlkZXIuc2V0Q2FsbGJhY2sobVByb3ZpZGVyQ2FsbGJhY2spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUHJvdmlkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtUmVjZWl2ZU1lc3Nlbmdlci5nZXRCaW5kZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblVuYmluZChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIGlmIChtUHJvdmlkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVByb3ZpZGVyLnNldENhbGxiYWNrKG51bGwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5vblVuYmluZChpbnRlbnQpOworICAgIH0KKworICAgIGJvb2xlYW4gb25SZWdpc3RlckNsaWVudChNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLCBpbnQgdmVyc2lvbikgeworICAgICAgICBpZiAodmVyc2lvbiA+PSBDTElFTlRfVkVSU0lPTl8xKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kQ2xpZW50KG1lc3Nlbmdlcik7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgQ2xpZW50UmVjb3JkIGNsaWVudCA9IG5ldyBDbGllbnRSZWNvcmQobWVzc2VuZ2VyLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50LnJlZ2lzdGVyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNsaWVudHMuYWRkKGNsaWVudCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSZWdpc3RlcmVkLCB2ZXJzaW9uPSIgKyB2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWVzdElkICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG1Qcm92aWRlci5nZXREZXNjcmlwdG9yKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kUmVwbHkobWVzc2VuZ2VyLCBTRVJWSUNFX01TR19SRUdJU1RFUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIFNFUlZJQ0VfVkVSU0lPTl9DVVJSRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVEZXNjcmlwdG9yQnVuZGxlRm9yQ2xpZW50VmVyc2lvbihkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5tVmVyc2lvbiksIG51bGwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiBvblVucmVnaXN0ZXJDbGllbnQoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCkgeworICAgICAgICBpbnQgaW5kZXggPSBmaW5kQ2xpZW50KG1lc3Nlbmdlcik7CisgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gbUNsaWVudHMucmVtb3ZlKGluZGV4KTsKKyAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogVW5yZWdpc3RlcmVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbGllbnQuZGlzcG9zZSgpOworICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIG9uQmluZGVyRGllZChNZXNzZW5nZXIgbWVzc2VuZ2VyKSB7CisgICAgICAgIGludCBpbmRleCA9IGZpbmRDbGllbnQobWVzc2VuZ2VyKTsKKyAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBtQ2xpZW50cy5yZW1vdmUoaW5kZXgpOworICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBCaW5kZXIgZGllZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xpZW50LmRpc3Bvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2xlYW4gb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwKKyAgICAgICAgICAgIGludCBjb250cm9sbGVySWQsIFN0cmluZyByb3V0ZUlkLCBTdHJpbmcgcm91dGVHcm91cElkKSB7CisgICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKKyAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY2xpZW50LmNyZWF0ZVJvdXRlQ29udHJvbGxlcihyb3V0ZUlkLCByb3V0ZUdyb3VwSWQsIGNvbnRyb2xsZXJJZCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSb3V0ZSBjb250cm9sbGVyIGNyZWF0ZWQsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCByb3V0ZUlkPSIgKyByb3V0ZUlkICsgIiwgcm91dGVHcm91cElkPSIgKyByb3V0ZUdyb3VwSWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZW5kR2VuZXJpY1N1Y2Nlc3MobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sZWFuIG9uUmVsZWFzZVJvdXRlQ29udHJvbGxlcihNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLAorICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCkgeworICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7CisgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGNsaWVudC5yZWxlYXNlUm91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSb3V0ZSBjb250cm9sbGVyIHJlbGVhc2VkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZW5kR2VuZXJpY1N1Y2Nlc3MobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sZWFuIG9uU2VsZWN0Um91dGUoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwKKyAgICAgICAgICAgIGludCBjb250cm9sbGVySWQpIHsKKyAgICAgICAgQ2xpZW50UmVjb3JkIGNsaWVudCA9IGdldENsaWVudChtZXNzZW5nZXIpOworICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9CisgICAgICAgICAgICAgICAgICAgIGNsaWVudC5nZXRSb3V0ZUNvbnRyb2xsZXIoY29udHJvbGxlcklkKTsKKyAgICAgICAgICAgIGlmIChjb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uU2VsZWN0KCk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgc2VsZWN0ZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gb25VbnNlbGVjdFJvdXRlKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsCisgICAgICAgICAgICBpbnQgY29udHJvbGxlcklkLCBpbnQgcmVhc29uKSB7CisgICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKKyAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQorICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Um91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCk7CisgICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblVuc2VsZWN0KHJlYXNvbik7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgdW5zZWxlY3RlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiBvblNldFJvdXRlVm9sdW1lKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsCisgICAgICAgICAgICBpbnQgY29udHJvbGxlcklkLCBpbnQgdm9sdW1lKSB7CisgICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKKyAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQorICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Um91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCk7CisgICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblNldFZvbHVtZSh2b2x1bWUpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIHZvbHVtZSBjaGFuZ2VkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQgKyAiLCB2b2x1bWU9IiArIHZvbHVtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gb25VcGRhdGVSb3V0ZVZvbHVtZShNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLAorICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCwgaW50IGRlbHRhKSB7CisgICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKKyAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQorICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Um91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCk7CisgICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblVwZGF0ZVZvbHVtZShkZWx0YSk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgdm9sdW1lIHVwZGF0ZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZCArICIsIGRlbHRhPSIgKyBkZWx0YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gb25Sb3V0ZUNvbnRyb2xSZXF1ZXN0KGZpbmFsIE1lc3NlbmdlciBtZXNzZW5nZXIsIGZpbmFsIGludCByZXF1ZXN0SWQsCisgICAgICAgICAgICBmaW5hbCBpbnQgY29udHJvbGxlcklkLCBmaW5hbCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIGZpbmFsIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKKyAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQorICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Um91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCk7CisgICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjayA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RJZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gbmV3IE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2soKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgY29udHJvbCByZXF1ZXN0IHN1Y2NlZWRlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBpbnRlbnQ9IiArIGludGVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgZGF0YT0iICsgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaW5kQ2xpZW50KG1lc3NlbmdlcikgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kUmVwbHkobWVzc2VuZ2VyLCBTRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfU1VDQ0VFREVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCwgMCwgZGF0YSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU3RyaW5nIGVycm9yLCBCdW5kbGUgZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIGNvbnRyb2wgcmVxdWVzdCBmYWlsZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaW50ZW50PSIgKyBpbnRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGVycm9yPSIgKyBlcnJvciArICIsIGRhdGE9IiArIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluZENsaWVudChtZXNzZW5nZXIpID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGUucHV0U3RyaW5nKFNFUlZJQ0VfREFUQV9FUlJPUiwgZXJyb3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFJlcGx5KG1lc3NlbmdlciwgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLCAwLCBkYXRhLCBidW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFJlcGx5KG1lc3NlbmdlciwgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLCAwLCBkYXRhLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIub25Db250cm9sUmVxdWVzdChpbnRlbnQsIGNhbGxiYWNrKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgY29udHJvbCByZXF1ZXN0IGRlbGl2ZXJlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZCArICIsIGludGVudD0iICsgaW50ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gb25TZXREaXNjb3ZlcnlSZXF1ZXN0KE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsCisgICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKKyAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBib29sZWFuIGFjdHVhbGx5Q2hhbmdlZCA9IGNsaWVudC5zZXREaXNjb3ZlcnlSZXF1ZXN0KHJlcXVlc3QpOworICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBTZXQgZGlzY292ZXJ5IHJlcXVlc3QsIHJlcXVlc3Q9IiArIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgYWN0dWFsbHlDaGFuZ2VkPSIgKyBhY3R1YWxseUNoYW5nZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29tcG9zaXRlRGlzY292ZXJ5UmVxdWVzdD0iICsgbUNvbXBvc2l0ZURpc2NvdmVyeVJlcXVlc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIHNlbmREZXNjcmlwdG9yQ2hhbmdlZChNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKyAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNsaWVudHMuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBtQ2xpZW50cy5nZXQoaSk7CisgICAgICAgICAgICBzZW5kUmVwbHkoY2xpZW50Lm1NZXNzZW5nZXIsIFNFUlZJQ0VfTVNHX0RFU0NSSVBUT1JfQ0hBTkdFRCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGVzY3JpcHRvckJ1bmRsZUZvckNsaWVudFZlcnNpb24oZGVzY3JpcHRvciwgY2xpZW50Lm1WZXJzaW9uKSwgbnVsbCk7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFNlbnQgZGVzY3JpcHRvciBjaGFuZ2UgZXZlbnQsIGRlc2NyaXB0b3I9IiArIGRlc2NyaXB0b3IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgc3RhdGljIEJ1bmRsZSBjcmVhdGVEZXNjcmlwdG9yQnVuZGxlRm9yQ2xpZW50VmVyc2lvbihNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IsCisgICAgICAgICAgICBpbnQgY2xpZW50VmVyc2lvbikgeworICAgICAgICBpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLkJ1aWxkZXIgYnVpbGRlciA9CisgICAgICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuQnVpbGRlcihkZXNjcmlwdG9yKTsKKyAgICAgICAgYnVpbGRlci5zZXRSb3V0ZXMobnVsbCk7CisgICAgICAgIGZvciAoTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGUgOiBkZXNjcmlwdG9yLmdldFJvdXRlcygpKSB7CisgICAgICAgICAgICBpZiAoY2xpZW50VmVyc2lvbiA+PSByb3V0ZS5nZXRNaW5DbGllbnRWZXJzaW9uKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgY2xpZW50VmVyc2lvbiA8PSByb3V0ZS5nZXRNYXhDbGllbnRWZXJzaW9uKCkpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFkZFJvdXRlKHJvdXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpLmFzQnVuZGxlKCk7CisgICAgfQorCisgICAgYm9vbGVhbiB1cGRhdGVDb21wb3NpdGVEaXNjb3ZlcnlSZXF1ZXN0KCkgeworICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBjb21wb3NpdGUgPSBudWxsOworICAgICAgICBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlciBzZWxlY3RvckJ1aWxkZXIgPSBudWxsOworICAgICAgICBib29sZWFuIGFjdGl2ZVNjYW4gPSBmYWxzZTsKKyAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNsaWVudHMuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QgPSBtQ2xpZW50cy5nZXQoaSkubURpc2NvdmVyeVJlcXVlc3Q7CisgICAgICAgICAgICBpZiAocmVxdWVzdCAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmICghcmVxdWVzdC5nZXRTZWxlY3RvcigpLmlzRW1wdHkoKSB8fCByZXF1ZXN0LmlzQWN0aXZlU2NhbigpKSkgeworICAgICAgICAgICAgICAgIGFjdGl2ZVNjYW4gfD0gcmVxdWVzdC5pc0FjdGl2ZVNjYW4oKTsKKyAgICAgICAgICAgICAgICBpZiAoY29tcG9zaXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlID0gcmVxdWVzdDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JCdWlsZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yQnVpbGRlciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcihjb21wb3NpdGUuZ2V0U2VsZWN0b3IoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JCdWlsZGVyLmFkZFNlbGVjdG9yKHJlcXVlc3QuZ2V0U2VsZWN0b3IoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzZWxlY3RvckJ1aWxkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgY29tcG9zaXRlID0gbmV3IE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0KHNlbGVjdG9yQnVpbGRlci5idWlsZCgpLCBhY3RpdmVTY2FuKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIU9iamVjdHNDb21wYXQuZXF1YWxzKG1Db21wb3NpdGVEaXNjb3ZlcnlSZXF1ZXN0LCBjb21wb3NpdGUpKSB7CisgICAgICAgICAgICBtQ29tcG9zaXRlRGlzY292ZXJ5UmVxdWVzdCA9IGNvbXBvc2l0ZTsKKyAgICAgICAgICAgIG1Qcm92aWRlci5zZXREaXNjb3ZlcnlSZXF1ZXN0KGNvbXBvc2l0ZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBDbGllbnRSZWNvcmQgZ2V0Q2xpZW50KE1lc3NlbmdlciBtZXNzZW5nZXIpIHsKKyAgICAgICAgaW50IGluZGV4ID0gZmluZENsaWVudChtZXNzZW5nZXIpOworICAgICAgICByZXR1cm4gaW5kZXggPj0gMCA/IG1DbGllbnRzLmdldChpbmRleCkgOiBudWxsOworICAgIH0KKworICAgIGludCBmaW5kQ2xpZW50KE1lc3NlbmdlciBtZXNzZW5nZXIpIHsKKyAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNsaWVudHMuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBtQ2xpZW50cy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoY2xpZW50Lmhhc01lc3NlbmdlcihtZXNzZW5nZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHNlbmRHZW5lcmljRmFpbHVyZShNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkKSB7CisgICAgICAgIGlmIChyZXF1ZXN0SWQgIT0gMCkgeworICAgICAgICAgICAgc2VuZFJlcGx5KG1lc3NlbmdlciwgU0VSVklDRV9NU0dfR0VORVJJQ19GQUlMVVJFLCByZXF1ZXN0SWQsIDAsIG51bGwsIG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZW5kR2VuZXJpY1N1Y2Nlc3MoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCkgeworICAgICAgICBpZiAocmVxdWVzdElkICE9IDApIHsKKyAgICAgICAgICAgIHNlbmRSZXBseShtZXNzZW5nZXIsIFNFUlZJQ0VfTVNHX0dFTkVSSUNfU1VDQ0VTUywgcmVxdWVzdElkLCAwLCBudWxsLCBudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHNlbmRSZXBseShNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgd2hhdCwKKyAgICAgICAgICAgIGludCByZXF1ZXN0SWQsIGludCBhcmcsIE9iamVjdCBvYmosIEJ1bmRsZSBkYXRhKSB7CisgICAgICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4oKTsKKyAgICAgICAgbXNnLndoYXQgPSB3aGF0OworICAgICAgICBtc2cuYXJnMSA9IHJlcXVlc3RJZDsKKyAgICAgICAgbXNnLmFyZzIgPSBhcmc7CisgICAgICAgIG1zZy5vYmogPSBvYmo7CisgICAgICAgIG1zZy5zZXREYXRhKGRhdGEpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWVzc2VuZ2VyLnNlbmQobXNnKTsKKyAgICAgICAgfSBjYXRjaCAoRGVhZE9iamVjdEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gVGhlIGNsaWVudCBkaWVkLgorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBzZW5kIG1lc3NhZ2UgdG8gIiArIGdldENsaWVudElkKG1lc3NlbmdlciksIGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmcgZ2V0Q2xpZW50SWQoTWVzc2VuZ2VyIG1lc3NlbmdlcikgeworICAgICAgICByZXR1cm4gIkNsaWVudCBjb25uZWN0aW9uICIgKyBtZXNzZW5nZXIuZ2V0QmluZGVyKCkudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFByaXZhdGVIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7CisgICAgICAgIFByaXZhdGVIYW5kbGVyKCkgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFBSSVZBVEVfTVNHX0NMSUVOVF9ESUVEOgorICAgICAgICAgICAgICAgICAgICBvbkJpbmRlckRpZWQoKE1lc3Nlbmdlciltc2cub2JqKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFByb3ZpZGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlUHJvdmlkZXIuQ2FsbGJhY2sgeworICAgICAgICBQcm92aWRlckNhbGxiYWNrKCkgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzY3JpcHRvckNoYW5nZWQoTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyLAorICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworICAgICAgICAgICAgc2VuZERlc2NyaXB0b3JDaGFuZ2VkKGRlc2NyaXB0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDbGllbnRSZWNvcmQgaW1wbGVtZW50cyBEZWF0aFJlY2lwaWVudCB7CisgICAgICAgIHB1YmxpYyBmaW5hbCBNZXNzZW5nZXIgbU1lc3NlbmdlcjsKKyAgICAgICAgcHVibGljIGZpbmFsIGludCBtVmVyc2lvbjsKKyAgICAgICAgcHVibGljIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IG1EaXNjb3ZlcnlSZXF1ZXN0OworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3BhcnNlQXJyYXk8TWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlcj4gbUNvbnRyb2xsZXJzID0KKyAgICAgICAgICAgICAgICBuZXcgU3BhcnNlQXJyYXk8TWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlcj4oKTsKKworICAgICAgICBwdWJsaWMgQ2xpZW50UmVjb3JkKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCB2ZXJzaW9uKSB7CisgICAgICAgICAgICBtTWVzc2VuZ2VyID0gbWVzc2VuZ2VyOworICAgICAgICAgICAgbVZlcnNpb24gPSB2ZXJzaW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcmVnaXN0ZXIoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1NZXNzZW5nZXIuZ2V0QmluZGVyKCkubGlua1RvRGVhdGgodGhpcywgMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBiaW5kZXJEaWVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworICAgICAgICAgICAgaW50IGNvdW50ID0gbUNvbnRyb2xsZXJzLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIG1Db250cm9sbGVycy52YWx1ZUF0KGkpLm9uUmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbnRyb2xsZXJzLmNsZWFyKCk7CisKKyAgICAgICAgICAgIG1NZXNzZW5nZXIuZ2V0QmluZGVyKCkudW5saW5rVG9EZWF0aCh0aGlzLCAwKTsKKworICAgICAgICAgICAgc2V0RGlzY292ZXJ5UmVxdWVzdChudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc01lc3NlbmdlcihNZXNzZW5nZXIgb3RoZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWVzc2VuZ2VyLmdldEJpbmRlcigpID09IG90aGVyLmdldEJpbmRlcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY3JlYXRlUm91dGVDb250cm9sbGVyKFN0cmluZyByb3V0ZUlkLCBTdHJpbmcgcm91dGVHcm91cElkLAorICAgICAgICAgICAgICAgIGludCBjb250cm9sbGVySWQpIHsKKyAgICAgICAgICAgIGlmIChtQ29udHJvbGxlcnMuaW5kZXhPZktleShjb250cm9sbGVySWQpIDwgMCkgeworICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9IHJvdXRlR3JvdXBJZCA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICA/IG1Qcm92aWRlci5vbkNyZWF0ZVJvdXRlQ29udHJvbGxlcihyb3V0ZUlkKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBtUHJvdmlkZXIub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIocm91dGVJZCwgcm91dGVHcm91cElkKTsKKyAgICAgICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVycy5wdXQoY29udHJvbGxlcklkLCBjb250cm9sbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcmVsZWFzZVJvdXRlQ29udHJvbGxlcihpbnQgY29udHJvbGxlcklkKSB7CisgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBtQ29udHJvbGxlcnMuZ2V0KGNvbnRyb2xsZXJJZCk7CisgICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXJzLnJlbW92ZShjb250cm9sbGVySWQpOworICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25SZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBnZXRSb3V0ZUNvbnRyb2xsZXIoaW50IGNvbnRyb2xsZXJJZCkgeworICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVycy5nZXQoY29udHJvbGxlcklkKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIHNldERpc2NvdmVyeVJlcXVlc3QoTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAgICAgaWYgKCFPYmplY3RzQ29tcGF0LmVxdWFscyhtRGlzY292ZXJ5UmVxdWVzdCwgcmVxdWVzdCkpIHsKKyAgICAgICAgICAgICAgICBtRGlzY292ZXJ5UmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUNvbXBvc2l0ZURpc2NvdmVyeVJlcXVlc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJ1bnMgb24gYSBiaW5kZXIgdGhyZWFkLgorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYmluZGVyRGllZCgpIHsKKyAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5vYnRhaW5NZXNzYWdlKFBSSVZBVEVfTVNHX0NMSUVOVF9ESUVELCBtTWVzc2VuZ2VyKS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldENsaWVudElkKG1NZXNzZW5nZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSGFuZGxlciB0aGF0IHJlY2VpdmVzIG1lc3NhZ2VzIGZyb20gY2xpZW50cy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGlubmVyIGNsYXNzIGlzIHN0YXRpYyBhbmQgb25seSByZXRhaW5zIGEgd2VhayByZWZlcmVuY2UgdG8gdGhlIHNlcnZpY2UKKyAgICAgKiB0byBwcmV2ZW50IHRoZSBzZXJ2aWNlIGZyb20gYmVpbmcgbGVha2VkIGluIGNhc2Ugb25lIG9mIHRoZSBjbGllbnRzIGlzIGhvbGRpbmcgYW4KKyAgICAgKiBhY3RpdmUgcmVmZXJlbmNlIHRvIHRoZSBzZXJ2ZXIncyBtZXNzZW5nZXIuCisgICAgICogPC9wPjxwPgorICAgICAqIFRoaXMgaGFuZGxlciBzaG91bGQgbm90IGJlIHVzZWQgdG8gaGFuZGxlIGFueSBtZXNzYWdlcyBvdGhlciB0aGFuIHRob3NlCisgICAgICogdGhhdCBjb21lIGZyb20gdGhlIGNsaWVudC4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVjZWl2ZUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2U+IG1TZXJ2aWNlUmVmOworCisgICAgICAgIHB1YmxpYyBSZWNlaXZlSGFuZGxlcihNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlIHNlcnZpY2UpIHsKKyAgICAgICAgICAgIG1TZXJ2aWNlUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8TWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZT4oc2VydmljZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgZmluYWwgTWVzc2VuZ2VyIG1lc3NlbmdlciA9IG1zZy5yZXBseVRvOworICAgICAgICAgICAgaWYgKGlzVmFsaWRSZW1vdGVNZXNzZW5nZXIobWVzc2VuZ2VyKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aGF0ID0gbXNnLndoYXQ7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHJlcXVlc3RJZCA9IG1zZy5hcmcxOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBhcmcgPSBtc2cuYXJnMjsKKyAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2JqID0gbXNnLm9iajsKKyAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgZGF0YSA9IG1zZy5wZWVrRGF0YSgpOworICAgICAgICAgICAgICAgIGlmICghcHJvY2Vzc01lc3NhZ2Uod2hhdCwgbWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZywgb2JqLCBkYXRhKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgZ2V0Q2xpZW50SWQobWVzc2VuZ2VyKSArICI6IE1lc3NhZ2UgZmFpbGVkLCB3aGF0PSIgKyB3aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgcmVxdWVzdElkPSIgKyByZXF1ZXN0SWQgKyAiLCBhcmc9IiArIGFyZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIG9iaj0iICsgb2JqICsgIiwgZGF0YT0iICsgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2VuZEdlbmVyaWNGYWlsdXJlKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJJZ25vcmluZyBtZXNzYWdlIHdpdGhvdXQgdmFsaWQgcmVwbHkgbWVzc2VuZ2VyLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShpbnQgd2hhdCwKKyAgICAgICAgICAgICAgICBNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLCBpbnQgYXJnLCBPYmplY3Qgb2JqLCBCdW5kbGUgZGF0YSkgeworICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZSBzZXJ2aWNlID0gbVNlcnZpY2VSZWYuZ2V0KCk7CisgICAgICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICh3aGF0KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19SRUdJU1RFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uUmVnaXN0ZXJDbGllbnQobWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZyk7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDTElFTlRfTVNHX1VOUkVHSVNURVI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblVucmVnaXN0ZXJDbGllbnQobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19DUkVBVEVfUk9VVEVfQ09OVFJPTExFUjogeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJvdXRlSWQgPSBkYXRhLmdldFN0cmluZyhDTElFTlRfREFUQV9ST1VURV9JRCk7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcm91dGVHcm91cElkID0gZGF0YS5nZXRTdHJpbmcoQ0xJRU5UX0RBVEFfUk9VVEVfTElCUkFSWV9HUk9VUCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVJZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzZW5nZXIsIHJlcXVlc3RJZCwgYXJnLCByb3V0ZUlkLCByb3V0ZUdyb3VwSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfUkVMRUFTRV9ST1VURV9DT05UUk9MTEVSOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25SZWxlYXNlUm91dGVDb250cm9sbGVyKG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcpOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19TRUxFQ1RfUk9VVEU6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblNlbGVjdFJvdXRlKG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcpOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19VTlNFTEVDVF9ST1VURToKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWFzb24gPSBkYXRhID09IG51bGwgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fVU5LTk9XTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRhdGEuZ2V0SW50KENMSUVOVF9EQVRBX1VOU0VMRUNUX1JFQVNPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fVU5LTk9XTik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblVuc2VsZWN0Um91dGUobWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZywgcmVhc29uKTsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfU0VUX1JPVVRFX1ZPTFVNRTogeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZvbHVtZSA9IGRhdGEuZ2V0SW50KENMSUVOVF9EQVRBX1ZPTFVNRSwgLTEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvbHVtZSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25TZXRSb3V0ZVZvbHVtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcsIHZvbHVtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19VUERBVEVfUk9VVEVfVk9MVU1FOiB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGEgPSBkYXRhLmdldEludChDTElFTlRfREFUQV9WT0xVTUUsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblVwZGF0ZVJvdXRlVm9sdW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZywgZGVsdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfUk9VVEVfQ09OVFJPTF9SRVFVRVNUOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEludGVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uUm91dGVDb250cm9sUmVxdWVzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcsIChJbnRlbnQpb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19TRVRfRElTQ09WRVJZX1JFUVVFU1Q6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogaW5zdGFuY2VvZiBCdW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0LmZyb21CdW5kbGUoKEJ1bmRsZSlvYmopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uU2V0RGlzY292ZXJ5UmVxdWVzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NlbmdlciwgcmVxdWVzdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCAhPSBudWxsICYmIHJlcXVlc3QuaXNWYWxpZCgpID8gcmVxdWVzdCA6IG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVTZWxlY3Rvci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVTZWxlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NjliMTkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVNlbGVjdG9yLmphdmEKQEAgLTAsMCArMSwzMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTnVsbGFibGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIERlc2NyaWJlcyB0aGUgY2FwYWJpbGl0aWVzIG9mIHJvdXRlcyB0aGF0IGFwcGxpY2F0aW9ucyB3b3VsZCBsaWtlIHRvIGRpc2NvdmVyIGFuZCB1c2UuCisgKiA8cD4KKyAqIFRoaXMgb2JqZWN0IGlzIGltbXV0YWJsZSBvbmNlIGNyZWF0ZWQgdXNpbmcgYSB7QGxpbmsgQnVpbGRlcn0gaW5zdGFuY2UuCisgKiA8L3A+CisgKgorICogPGgzPkV4YW1wbGU8L2gzPgorICogPHByZT4KKyAqIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvckJ1aWxkZXIgPSBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIoKQorICogICAgICAgICAuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKQorICogICAgICAgICAuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spCisgKiAgICAgICAgIC5idWlsZCgpOworICoKKyAqIE1lZGlhUm91dGVyIHJvdXRlciA9IE1lZGlhUm91dGVyLmdldEluc3RhbmNlKGNvbnRleHQpOworICogcm91dGVyLmFkZENhbGxiYWNrKHNlbGVjdG9yLCBjYWxsYmFjaywgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWSk7CisgKiA8L3ByZT4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVTZWxlY3RvciB7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OVFJPTF9DQVRFR09SSUVTID0gImNvbnRyb2xDYXRlZ29yaWVzIjsKKworICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7CisgICAgTGlzdDxTdHJpbmc+IG1Db250cm9sQ2F0ZWdvcmllczsKKworICAgIC8qKgorICAgICAqIEFuIGVtcHR5IG1lZGlhIHJvdXRlIHNlbGVjdG9yIHRoYXQgd2lsbCBub3QgbWF0Y2ggYW55IHJvdXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1lZGlhUm91dGVTZWxlY3RvciBFTVBUWSA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IobmV3IEJ1bmRsZSgpLCBudWxsKTsKKworICAgIE1lZGlhUm91dGVTZWxlY3RvcihCdW5kbGUgYnVuZGxlLCBMaXN0PFN0cmluZz4gY29udHJvbENhdGVnb3JpZXMpIHsKKyAgICAgICAgbUJ1bmRsZSA9IGJ1bmRsZTsKKyAgICAgICAgbUNvbnRyb2xDYXRlZ29yaWVzID0gY29udHJvbENhdGVnb3JpZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbGlzdCBvZiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgY2F0ZWdvcmllc30gaW4gdGhlIHNlbGVjdG9yLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbGlzdCBvZiBjYXRlZ29yaWVzLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0Q29udHJvbENhdGVnb3JpZXMoKSB7CisgICAgICAgIGVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7CisgICAgICAgIHJldHVybiBtQ29udHJvbENhdGVnb3JpZXM7CisgICAgfQorCisgICAgdm9pZCBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpIHsKKyAgICAgICAgaWYgKG1Db250cm9sQ2F0ZWdvcmllcyA9PSBudWxsKSB7CisgICAgICAgICAgICBtQ29udHJvbENhdGVnb3JpZXMgPSBtQnVuZGxlLmdldFN0cmluZ0FycmF5TGlzdChLRVlfQ09OVFJPTF9DQVRFR09SSUVTKTsKKyAgICAgICAgICAgIGlmIChtQ29udHJvbENhdGVnb3JpZXMgPT0gbnVsbCB8fCBtQ29udHJvbENhdGVnb3JpZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgbUNvbnRyb2xDYXRlZ29yaWVzID0gQ29sbGVjdGlvbnMuPFN0cmluZz5lbXB0eUxpc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VsZWN0b3IgY29udGFpbnMgdGhlIHNwZWNpZmllZCBjYXRlZ29yeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYXRlZ29yeSBUaGUgY2F0ZWdvcnkgdG8gY2hlY2suCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBjYXRlZ29yeSBpcyBwcmVzZW50LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbnRyb2xDYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHsKKyAgICAgICAgaWYgKGNhdGVnb3J5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgY2F0ZWdvcnlDb3VudCA9IG1Db250cm9sQ2F0ZWdvcmllcy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhdGVnb3J5Q291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChtQ29udHJvbENhdGVnb3JpZXMuZ2V0KGkpLmVxdWFscyhjYXRlZ29yeSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlbGVjdG9yIG1hdGNoZXMgYXQgbGVhc3Qgb25lIG9mIHRoZSBzcGVjaWZpZWQgY29udHJvbCBmaWx0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlcnMgVGhlIGxpc3Qgb2YgY29udHJvbCBmaWx0ZXJzIHRvIGNvbnNpZGVyLgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBhIG1hdGNoIGlzIGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXNDb250cm9sRmlsdGVycyhMaXN0PEludGVudEZpbHRlcj4gZmlsdGVycykgeworICAgICAgICBpZiAoZmlsdGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOworICAgICAgICAgICAgZmluYWwgaW50IGNhdGVnb3J5Q291bnQgPSBtQ29udHJvbENhdGVnb3JpZXMuc2l6ZSgpOworICAgICAgICAgICAgaWYgKGNhdGVnb3J5Q291bnQgIT0gMCkgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBmaWx0ZXJDb3VudCA9IGZpbHRlcnMuc2l6ZSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVyQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gZmlsdGVycy5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjYXRlZ29yeUNvdW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyLmhhc0NhdGVnb3J5KG1Db250cm9sQ2F0ZWdvcmllcy5nZXQoaikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc2VsZWN0b3IgY29udGFpbnMgYWxsIG9mIHRoZSBjYXBhYmlsaXRpZXMgZGVzY3JpYmVkCisgICAgICogYnkgdGhlIHNwZWNpZmllZCBzZWxlY3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IgdG8gYmUgZXhhbWluZWQuCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgc2VsZWN0b3IgY29udGFpbnMgYWxsIG9mIHRoZSBjYXBhYmlsaXRpZXMgZGVzY3JpYmVkCisgICAgICogYnkgdGhlIHNwZWNpZmllZCBzZWxlY3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKKyAgICAgICAgaWYgKHNlbGVjdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIGVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7CisgICAgICAgICAgICBzZWxlY3Rvci5lbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOworICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sQ2F0ZWdvcmllcy5jb250YWluc0FsbChzZWxlY3Rvci5tQ29udHJvbENhdGVnb3JpZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlbGVjdG9yIGRvZXMgbm90IHNwZWNpZnkgYW55IGNhcGFiaWxpdGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOworICAgICAgICByZXR1cm4gbUNvbnRyb2xDYXRlZ29yaWVzLmlzRW1wdHkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlbGVjdG9yIGhhcyBhbGwgb2YgdGhlIHJlcXVpcmVkIGZpZWxkcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgeworICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOworICAgICAgICBpZiAobUNvbnRyb2xDYXRlZ29yaWVzLmNvbnRhaW5zKG51bGwpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmIChvIGluc3RhbmNlb2YgTWVkaWFSb3V0ZVNlbGVjdG9yKSB7CisgICAgICAgICAgICBNZWRpYVJvdXRlU2VsZWN0b3Igb3RoZXIgPSAoTWVkaWFSb3V0ZVNlbGVjdG9yKW87CisgICAgICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOworICAgICAgICAgICAgb3RoZXIuZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKKyAgICAgICAgICAgIHJldHVybiBtQ29udHJvbENhdGVnb3JpZXMuZXF1YWxzKG90aGVyLm1Db250cm9sQ2F0ZWdvcmllcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7CisgICAgICAgIHJldHVybiBtQ29udHJvbENhdGVnb3JpZXMuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIk1lZGlhUm91dGVTZWxlY3RvcnsgIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoImNvbnRyb2xDYXRlZ29yaWVzPSIpLmFwcGVuZCgKKyAgICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcoZ2V0Q29udHJvbENhdGVnb3JpZXMoKS50b0FycmF5KCkpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiIH0iKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgYnVuZGxlIGZvciBzZXJpYWxpemF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCByZXByZXNlbnRlZCBhcyBhIGJ1bmRsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVuZGxlIGFzQnVuZGxlKCkgeworICAgICAgICByZXR1cm4gbUJ1bmRsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBidW5kbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKiBAcmV0dXJuIFRoZSBuZXcgaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIGJ1bmRsZSB3YXMgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1lZGlhUm91dGVTZWxlY3RvciBmcm9tQnVuZGxlKEBOdWxsYWJsZSBCdW5kbGUgYnVuZGxlKSB7CisgICAgICAgIHJldHVybiBidW5kbGUgIT0gbnVsbCA/IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IoYnVuZGxlLCBudWxsKSA6IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQnVpbGRlciBmb3Ige0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBtZWRpYSByb3V0ZSBzZWxlY3RvcnN9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7CisgICAgICAgIHByaXZhdGUgQXJyYXlMaXN0PFN0cmluZz4gbUNvbnRyb2xDYXRlZ29yaWVzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IG1lZGlhIHJvdXRlIHNlbGVjdG9yIGJ1aWxkZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlcigpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgbWVkaWEgcm91dGUgc2VsZWN0b3IgZGVzY3JpcHRvciBidWlsZGVyIHdob3NlIGluaXRpYWwgY29udGVudHMgYXJlCisgICAgICAgICAqIGNvcGllZCBmcm9tIGFuIGV4aXN0aW5nIHNlbGVjdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIoQE5vbk51bGwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2VsZWN0b3IuZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKKyAgICAgICAgICAgIGlmICghc2VsZWN0b3IubUNvbnRyb2xDYXRlZ29yaWVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG1Db250cm9sQ2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihzZWxlY3Rvci5tQ29udHJvbENhdGVnb3JpZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgYSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgY2F0ZWdvcnl9IHRvIHRoZSBidWlsZGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY2F0ZWdvcnkgVGhlIGNhdGVnb3J5IHRvIGFkZCB0byB0aGUgc2V0IG9mIGRlc2lyZWQgY2FwYWJpbGl0aWVzLCBzdWNoIGFzCisgICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9BVURJT30uCisgICAgICAgICAqIEByZXR1cm4gVGhlIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgQE5vbk51bGwKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkQ29udHJvbENhdGVnb3J5KEBOb25OdWxsIFN0cmluZyBjYXRlZ29yeSkgeworICAgICAgICAgICAgaWYgKGNhdGVnb3J5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYXRlZ29yeSBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtQ29udHJvbENhdGVnb3JpZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Db250cm9sQ2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtQ29udHJvbENhdGVnb3JpZXMuY29udGFpbnMoY2F0ZWdvcnkpKSB7CisgICAgICAgICAgICAgICAgbUNvbnRyb2xDYXRlZ29yaWVzLmFkZChjYXRlZ29yeSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIGEgbGlzdCBvZiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgY2F0ZWdvcmllc30gdG8gdGhlIGJ1aWxkZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjYXRlZ29yaWVzIFRoZSBsaXN0IGNhdGVnb3JpZXMgdG8gYWRkIHRvIHRoZSBzZXQgb2YgZGVzaXJlZCBjYXBhYmlsaXRpZXMsCisgICAgICAgICAqIHN1Y2ggYXMge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX0FVRElPfS4KKyAgICAgICAgICogQHJldHVybiBUaGUgYnVpbGRlciBpbnN0YW5jZSBmb3IgY2hhaW5pbmcuCisgICAgICAgICAqLworICAgICAgICBATm9uTnVsbAorICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRDb250cm9sQ2F0ZWdvcmllcyhATm9uTnVsbCBDb2xsZWN0aW9uPFN0cmluZz4gY2F0ZWdvcmllcykgeworICAgICAgICAgICAgaWYgKGNhdGVnb3JpZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhdGVnb3JpZXMgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWNhdGVnb3JpZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgY2F0ZWdvcnkgOiBjYXRlZ29yaWVzKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZENvbnRyb2xDYXRlZ29yeShjYXRlZ29yeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyB0aGUgY29udGVudHMgb2YgYW4gZXhpc3RpbmcgbWVkaWEgcm91dGUgc2VsZWN0b3IgdG8gdGhlIGJ1aWxkZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgbWVkaWEgcm91dGUgc2VsZWN0b3Igd2hvc2UgY29udGVudHMgYXJlIHRvIGJlIGFkZGVkLgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBidWlsZGVyIGluc3RhbmNlIGZvciBjaGFpbmluZy4KKyAgICAgICAgICovCisgICAgICAgIEBOb25OdWxsCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFNlbGVjdG9yKEBOb25OdWxsIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFkZENvbnRyb2xDYXRlZ29yaWVzKHNlbGVjdG9yLmdldENvbnRyb2xDYXRlZ29yaWVzKCkpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQnVpbGRzIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZVNlbGVjdG9yIG1lZGlhIHJvdXRlIHNlbGVjdG9yfS4KKyAgICAgICAgICovCisgICAgICAgIEBOb25OdWxsCisgICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlU2VsZWN0b3IgYnVpbGQoKSB7CisgICAgICAgICAgICBpZiAobUNvbnRyb2xDYXRlZ29yaWVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgYnVuZGxlLnB1dFN0cmluZ0FycmF5TGlzdChLRVlfQ09OVFJPTF9DQVRFR09SSUVTLCBtQ29udHJvbENhdGVnb3JpZXMpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IoYnVuZGxlLCBtQ29udHJvbENhdGVnb3JpZXMpOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIwMDUyZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlci5qYXZhCkBAIC0wLDAgKzEsMjk5OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLkludERlZjsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRTZW5kZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuYXBwLkFjdGl2aXR5TWFuYWdlckNvbXBhdDsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuaGFyZHdhcmUuZGlzcGxheS5EaXNwbGF5TWFuYWdlckNvbXBhdDsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuVm9sdW1lUHJvdmlkZXJDb21wYXQ7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uQ29tcGF0OworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC51dGlsLlBhaXI7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5EaXNwbGF5OworCitpbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXIuUHJvdmlkZXJNZXRhZGF0YTsKK2ltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXI7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogTWVkaWFSb3V0ZXIgYWxsb3dzIGFwcGxpY2F0aW9ucyB0byBjb250cm9sIHRoZSByb3V0aW5nIG9mIG1lZGlhIGNoYW5uZWxzCisgKiBhbmQgc3RyZWFtcyBmcm9tIHRoZSBjdXJyZW50IGRldmljZSB0byBleHRlcm5hbCBzcGVha2VycyBhbmQgZGVzdGluYXRpb24gZGV2aWNlcy4KKyAqIDxwPgorICogQSBNZWRpYVJvdXRlciBpbnN0YW5jZSBpcyByZXRyaWV2ZWQgdGhyb3VnaCB7QGxpbmsgI2dldEluc3RhbmNlfS4gIEFwcGxpY2F0aW9ucworICogY2FuIHF1ZXJ5IHRoZSBtZWRpYSByb3V0ZXIgYWJvdXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZSBhbmQgaXRzIGNhcGFiaWxpdGllcworICogdG8gZGV0ZXJtaW5lIGhvdyB0byBzZW5kIGNvbnRlbnQgdG8gdGhlIHJvdXRlJ3MgZGVzdGluYXRpb24uICBBcHBsaWNhdGlvbnMgY2FuCisgKiBhbHNvIHtAbGluayBSb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0IHNlbmQgY29udHJvbCByZXF1ZXN0c30gdG8gdGhlIHJvdXRlCisgKiB0byBhc2sgdGhlIHJvdXRlJ3MgZGVzdGluYXRpb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlbW90ZSBjb250cm9sIGZ1bmN0aW9ucworICogc3VjaCBhcyBwbGF5aW5nIG1lZGlhLgorICogPC9wPjxwPgorICogU2VlIGFsc28ge0BsaW5rIE1lZGlhUm91dGVQcm92aWRlcn0gZm9yIGluZm9ybWF0aW9uIG9uIGhvdyBhbiBhcHBsaWNhdGlvbgorICogY2FuIHB1Ymxpc2ggbmV3IG1lZGlhIHJvdXRlcyB0byB0aGUgbWVkaWEgcm91dGVyLgorICogPC9wPjxwPgorICogVGhlIG1lZGlhIHJvdXRlciBBUEkgaXMgbm90IHRocmVhZC1zYWZlOyBhbGwgaW50ZXJhY3Rpb25zIHdpdGggaXQgbXVzdCBiZQorICogZG9uZSBmcm9tIHRoZSBtYWluIHRocmVhZCBvZiB0aGUgcHJvY2Vzcy4KKyAqIDwvcD4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVyIHsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlciI7CisgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7CisKKyAgICAvKioKKyAgICAgKiBQYXNzZWQgdG8ge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyI29uVW5zZWxlY3QoaW50KX0KKyAgICAgKiBhbmQge0BsaW5rIENhbGxiYWNrI29uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyLCBSb3V0ZUluZm8sIGludCl9IHdoZW4gdGhlIHJlYXNvbiB0aGUgcm91dGUKKyAgICAgKiB3YXMgdW5zZWxlY3RlZCBpcyB1bmtub3duLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU0VMRUNUX1JFQVNPTl9VTktOT1dOID0gMDsKKyAgICAvKioKKyAgICAgKiBQYXNzZWQgdG8ge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyI29uVW5zZWxlY3QoaW50KX0KKyAgICAgKiBhbmQge0BsaW5rIENhbGxiYWNrI29uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyLCBSb3V0ZUluZm8sIGludCl9IHdoZW4gdGhlIHVzZXIgcHJlc3NlZAorICAgICAqIHRoZSBkaXNjb25uZWN0IGJ1dHRvbiB0byBkaXNjb25uZWN0IGFuZCBrZWVwIHBsYXlpbmcuCisgICAgICogPHA+CisgICAgICoKKyAgICAgKiBAc2VlIE1lZGlhUm91dGVEZXNjcmlwdG9yI2NhbkRpc2Nvbm5lY3RBbmRLZWVwUGxheWluZygpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TRUxFQ1RfUkVBU09OX0RJU0NPTk5FQ1RFRCA9IDE7CisgICAgLyoqCisgICAgICogUGFzc2VkIHRvIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciNvblVuc2VsZWN0KGludCl9CisgICAgICogYW5kIHtAbGluayBDYWxsYmFjayNvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciwgUm91dGVJbmZvLCBpbnQpfSB3aGVuIHRoZSB1c2VyIHByZXNzZWQKKyAgICAgKiB0aGUgc3RvcCBjYXN0aW5nIGJ1dHRvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNFTEVDVF9SRUFTT05fU1RPUFBFRCA9IDI7CisgICAgLyoqCisgICAgICogUGFzc2VkIHRvIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciNvblVuc2VsZWN0KGludCl9CisgICAgICogYW5kIHtAbGluayBDYWxsYmFjayNvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciwgUm91dGVJbmZvLCBpbnQpfSB3aGVuIHRoZSB1c2VyIHNlbGVjdGVkCisgICAgICogYSBkaWZmZXJlbnQgcm91dGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUQgPSAzOworCisgICAgLy8gTWFpbnRhaW5zIGdsb2JhbCBtZWRpYSByb3V0ZXIgc3RhdGUgZm9yIHRoZSBwcm9jZXNzLgorICAgIC8vIFRoaXMgZmllbGQgaXMgaW5pdGlhbGl6ZWQgaW4gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoKSBiZWZvcmUgYW55CisgICAgLy8gTWVkaWFSb3V0ZXIgb2JqZWN0cyBhcmUgaW5zdGFudGlhdGVkIHNvIGl0IGlzIGd1YXJhbnRlZWQgdG8gYmUKKyAgICAvLyB2YWxpZCB3aGVuZXZlciBhbnkgaW5zdGFuY2UgbWV0aG9kIGlzIGludm9rZWQuCisgICAgc3RhdGljIEdsb2JhbE1lZGlhUm91dGVyIHNHbG9iYWw7CisKKyAgICAvLyBDb250ZXh0LWJvdW5kIHN0YXRlIG9mIHRoZSBtZWRpYSByb3V0ZXIuCisgICAgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKyAgICBmaW5hbCBBcnJheUxpc3Q8Q2FsbGJhY2tSZWNvcmQ+IG1DYWxsYmFja1JlY29yZHMgPSBuZXcgQXJyYXlMaXN0PENhbGxiYWNrUmVjb3JkPigpOworCisgICAgQEludERlZihmbGFnID0gdHJ1ZSwKKyAgICAgICAgICAgIHZhbHVlID0geworICAgICAgICAgICAgICAgICAgICBDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4sCisgICAgICAgICAgICAgICAgICAgIENBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlksCisgICAgICAgICAgICAgICAgICAgIENBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFMKKyAgICAgICAgICAgIH0KKyAgICApCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQorICAgIHByaXZhdGUgQGludGVyZmFjZSBDYWxsYmFja0ZsYWdzIHt9CisKKyAgICAvKioKKyAgICAgKiBGbGFnIGZvciB7QGxpbmsgI2FkZENhbGxiYWNrfTogQWN0aXZlbHkgc2NhbiBmb3Igcm91dGVzIHdoaWxlIHRoaXMgY2FsbGJhY2sKKyAgICAgKiBpcyByZWdpc3RlcmVkLgorICAgICAqIDxwPgorICAgICAqIFdoZW4gdGhpcyBmbGFnIGlzIHNwZWNpZmllZCwgdGhlIG1lZGlhIHJvdXRlciB3aWxsIGFjdGl2ZWx5IHNjYW4gZm9yIG5ldworICAgICAqIHJvdXRlcy4gIENlcnRhaW4gcm91dGVzLCBzdWNoIGFzIHdpZmkgZGlzcGxheSByb3V0ZXMsIG1heSBub3QgYmUgZGlzY292ZXJhYmxlCisgICAgICogZXhjZXB0IHdoZW4gYWN0aXZlbHkgc2Nhbm5pbmcuICBUaGlzIGZsYWcgaXMgdHlwaWNhbGx5IHVzZWQgd2hlbiB0aGUgcm91dGUgcGlja2VyCisgICAgICogZGlhbG9nIGhhcyBiZWVuIG9wZW5lZCBieSB0aGUgdXNlciB0byBlbnN1cmUgdGhhdCB0aGUgcm91dGUgaW5mb3JtYXRpb24gaXMKKyAgICAgKiB1cCB0byBkYXRlLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBBY3RpdmUgc2Nhbm5pbmcgbWF5IGNvbnN1bWUgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgcG93ZXIgYW5kIG1heSBoYXZlIGludHJ1c2l2ZQorICAgICAqIGVmZmVjdHMgb24gd2lyZWxlc3MgY29ubmVjdGl2aXR5LiAgVGhlcmVmb3JlIGl0IGlzIGltcG9ydGFudCB0aGF0IGFjdGl2ZSBzY2FubmluZworICAgICAqIG9ubHkgYmUgcmVxdWVzdGVkIHdoZW4gaXQgaXMgYWN0dWFsbHkgbmVlZGVkIHRvIHNhdGlzZnkgYSB1c2VyIHJlcXVlc3QgdG8KKyAgICAgKiBkaXNjb3ZlciBhbmQgc2VsZWN0IGEgbmV3IHJvdXRlLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGlzIGZsYWcgaW1wbGllcyB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUll9IGJ1dCBwZXJmb3JtaW5nCisgICAgICogYWN0aXZlIHNjYW5zIGlzIG11Y2ggbW9yZSBleHBlbnNpdmUgdGhhbiBhIG5vcm1hbCBkaXNjb3ZlcnkgcmVxdWVzdC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAc2VlICNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOID0gMSA8PCAwOworCisgICAgLyoqCisgICAgICogRmxhZyBmb3Ige0BsaW5rICNhZGRDYWxsYmFja306IERvIG5vdCBmaWx0ZXIgcm91dGUgZXZlbnRzLgorICAgICAqIDxwPgorICAgICAqIFdoZW4gdGhpcyBmbGFnIGlzIHNwZWNpZmllZCwgdGhlIGNhbGxiYWNrIHdpbGwgYmUgaW52b2tlZCBmb3IgZXZlbnRzIHRoYXQgYWZmZWN0IGFueQorICAgICAqIHJvdXRlIGV2ZW4gaWYgdGhleSBkbyBub3QgbWF0Y2ggdGhlIGNhbGxiYWNrJ3MgZmlsdGVyLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTID0gMSA8PCAxOworCisgICAgLyoqCisgICAgICogRmxhZyBmb3Ige0BsaW5rICNhZGRDYWxsYmFja306IFJlcXVlc3QgcGFzc2l2ZSByb3V0ZSBkaXNjb3Zlcnkgd2hpbGUgdGhpcworICAgICAqIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWQsIGV4Y2VwdCBvbiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyI2lzTG93UmFtRGV2aWNlIGxvdy1SQU0gZGV2aWNlc30uCisgICAgICogPHA+CisgICAgICogV2hlbiB0aGlzIGZsYWcgaXMgc3BlY2lmaWVkLCB0aGUgbWVkaWEgcm91dGVyIHdpbGwgdHJ5IHRvIGRpc2NvdmVyIHJvdXRlcy4KKyAgICAgKiBBbHRob3VnaCByb3V0ZSBkaXNjb3ZlcnkgaXMgaW50ZW5kZWQgdG8gYmUgZWZmaWNpZW50LCBjaGVja2luZyBmb3IgbmV3IHJvdXRlcyBtYXkKKyAgICAgKiByZXN1bHQgaW4gc29tZSBuZXR3b3JrIGFjdGl2aXR5IGFuZCBjb3VsZCBzbG93bHkgZHJhaW4gdGhlIGJhdHRlcnkuICBUaGVyZWZvcmUKKyAgICAgKiBhcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgc3BlY2lmeSB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUll9IHdoZW4KKyAgICAgKiB0aGV5IGFyZSBydW5uaW5nIGluIHRoZSBmb3JlZ3JvdW5kIGFuZCB3b3VsZCBsaWtlIHRvIHByb3ZpZGUgdGhlIHVzZXIgd2l0aCB0aGUKKyAgICAgKiBvcHRpb24gb2YgY29ubmVjdGluZyB0byBuZXcgcm91dGVzLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBBcHBsaWNhdGlvbnMgc2hvdWxkIHR5cGljYWxseSBhZGQgYSBjYWxsYmFjayB1c2luZyB0aGlzIGZsYWcgaW4gdGhlCisgICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5IGFjdGl2aXR5J3N9IHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblN0YXJ0IG9uU3RhcnR9CisgICAgICogbWV0aG9kIGFuZCByZW1vdmUgaXQgaW4gdGhlIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblN0b3Agb25TdG9wfSBtZXRob2QuCisgICAgICogVGhlIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcuYXBwLk1lZGlhUm91dGVEaXNjb3ZlcnlGcmFnbWVudH0gZnJhZ21lbnQgbWF5CisgICAgICogYWxzbyBiZSB1c2VkIGZvciB0aGlzIHB1cnBvc2UuCisgICAgICogPC9wPjxwIGNsYXNzPSJub3RlIj4KKyAgICAgKiBPbiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyI2lzTG93UmFtRGV2aWNlIGxvdy1SQU0gZGV2aWNlc30gdGhpcyBmbGFnCisgICAgICogd2lsbCBiZSBpZ25vcmVkLiAgUmVmZXIgdG8KKyAgICAgKiB7QGxpbmsgI2FkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciwgQ2FsbGJhY2ssIGludCkgYWRkQ2FsbGJhY2t9IGZvciBkZXRhaWxzLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgYW5kcm9pZC5zdXBwb3J0LnY3LmFwcC5NZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZID0gMSA8PCAyOworCisgICAgLyoqCisgICAgICogRmxhZyBmb3Ige0BsaW5rICNhZGRDYWxsYmFja306IFJlcXVlc3QgcGFzc2l2ZSByb3V0ZSBkaXNjb3Zlcnkgd2hpbGUgdGhpcworICAgICAqIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWQsIGV2ZW4gb24ge0BsaW5rIEFjdGl2aXR5TWFuYWdlciNpc0xvd1JhbURldmljZSBsb3ctUkFNIGRldmljZXN9LgorICAgICAqIDxwIGNsYXNzPSJub3RlIj4KKyAgICAgKiBUaGlzIGZsYWcgaGFzIGEgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgaW1wYWN0IG9uIGxvdy1SQU0gZGV2aWNlcworICAgICAqIHNpbmNlIGl0IG1heSBjYXVzZSBtYW55IG1lZGlhIHJvdXRlIHByb3ZpZGVycyB0byBiZSBzdGFydGVkIHNpbXVsdGFuZW91c2x5LgorICAgICAqIEl0IGlzIG11Y2ggYmV0dGVyIHRvIHVzZSB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUll9IGluc3RlYWQgdG8gYXZvaWQKKyAgICAgKiBwZXJmb3JtaW5nIHBhc3NpdmUgZGlzY292ZXJ5IG9uIHRoZXNlIGRldmljZXMgYWx0b2dldGhlci4gIFJlZmVyIHRvCisgICAgICoge0BsaW5rICNhZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3IsIENhbGxiYWNrLCBpbnQpIGFkZENhbGxiYWNrfSBmb3IgZGV0YWlscy4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAc2VlIGFuZHJvaWQuc3VwcG9ydC52Ny5hcHAuTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMTEJBQ0tfRkxBR19GT1JDRV9ESVNDT1ZFUlkgPSAxIDw8IDM7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIGZvciB7QGxpbmsgI2lzUm91dGVBdmFpbGFibGV9OiBJZ25vcmUgdGhlIGRlZmF1bHQgcm91dGUuCisgICAgICogPHA+CisgICAgICogVGhpcyBmbGFnIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBtYXRjaGluZyBub24tZGVmYXVsdCByb3V0ZSBpcyBhdmFpbGFibGUuCisgICAgICogVGhpcyBjb25zdHJhaW50IG1heSBiZSB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRvIG9mZmVyIHRoZSByb3V0ZSBjaG9vc2VyIGRpYWxvZworICAgICAqIHRvIHRoZSB1c2VyLiAgVGhlcmUgaXMgbm8gcG9pbnQgb2ZmZXJpbmcgdGhlIGNob29zZXIgaWYgdGhlcmUgYXJlIG5vCisgICAgICogbm9uLWRlZmF1bHQgY2hvaWNlcy4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVZBSUxBQklMSVRZX0ZMQUdfSUdOT1JFX0RFRkFVTFRfUk9VVEUgPSAxIDw8IDA7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIGZvciB7QGxpbmsgI2lzUm91dGVBdmFpbGFibGV9OiBSZXF1aXJlIGFuIGFjdHVhbCByb3V0ZSB0byBiZSBtYXRjaGVkLgorICAgICAqIDxwPgorICAgICAqIElmIHRoaXMgZmxhZyBpcyBub3Qgc2V0LCB0aGVuIHtAbGluayAjaXNSb3V0ZUF2YWlsYWJsZX0gd2lsbCByZXR1cm4gdHJ1ZQorICAgICAqIGlmIGl0IGlzIHBvc3NpYmxlIHRvIGRpc2NvdmVyIGEgbWF0Y2hpbmcgcm91dGUgZXZlbiBpZiBkaXNjb3ZlcnkgaXMgbm90IGluCisgICAgICogcHJvZ3Jlc3Mgb3IgaWYgbm8gbWF0Y2hpbmcgcm91dGUgaGFzIHlldCBiZWVuIGZvdW5kLiAgVGhpcyBmZWF0dXJlIGlzIHVzZWQgdG8KKyAgICAgKiBzYXZlIHJlc291cmNlcyBieSByZW1vdmluZyB0aGUgbmVlZCB0byBwZXJmb3JtIHBhc3NpdmUgcm91dGUgZGlzY292ZXJ5IG9uCisgICAgICoge0BsaW5rIEFjdGl2aXR5TWFuYWdlciNpc0xvd1JhbURldmljZSBsb3ctUkFNIGRldmljZXN9LgorICAgICAqIDwvcD48cD4KKyAgICAgKiBJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGVuIHtAbGluayAjaXNSb3V0ZUF2YWlsYWJsZX0gd2lsbCBvbmx5IHJldHVybiB0cnVlIGlmCisgICAgICogYSBtYXRjaGluZyByb3V0ZSBoYXMgYWN0dWFsbHkgYmVlbiBkaXNjb3ZlcmVkLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVkFJTEFCSUxJVFlfRkxBR19SRVFVSVJFX01BVENIID0gMSA8PCAxOworCisgICAgcHJpdmF0ZSBNZWRpYVJvdXRlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1lZGlhIHJvdXRlciBzZXJ2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udGV4dC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgYXBwbGljYXRpb24gaXMgcmVzcG9uc2libGUgZm9yIGhvbGRpbmcgYSBzdHJvbmcgcmVmZXJlbmNlIHRvIHRoZSByZXR1cm5lZAorICAgICAqIHtAbGluayBNZWRpYVJvdXRlcn0gaW5zdGFuY2UsIHN1Y2ggYXMgYnkgc3RvcmluZyB0aGUgaW5zdGFuY2UgaW4gYSBmaWVsZCBvZgorICAgICAqIHRoZSB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHl9LCB0byBlbnN1cmUgdGhhdCB0aGUgbWVkaWEgcm91dGVyIHJlbWFpbnMgYWxpdmUKKyAgICAgKiBhcyBsb25nIGFzIHRoZSBhcHBsaWNhdGlvbiBpcyB1c2luZyBpdHMgZmVhdHVyZXMuCisgICAgICogPC9wPjxwPgorICAgICAqIEluIG90aGVyIHdvcmRzLCB0aGUgc3VwcG9ydCBsaWJyYXJ5IG9ubHkgaG9sZHMgYSB7QGxpbmsgV2Vha1JlZmVyZW5jZSB3ZWFrIHJlZmVyZW5jZX0KKyAgICAgKiB0byBlYWNoIG1lZGlhIHJvdXRlciBpbnN0YW5jZS4gIFdoZW4gdGhlcmUgYXJlIG5vIHJlbWFpbmluZyBzdHJvbmcgcmVmZXJlbmNlcyB0byB0aGUKKyAgICAgKiBtZWRpYSByb3V0ZXIgaW5zdGFuY2UsIGFsbCBvZiBpdHMgY2FsbGJhY2tzIHdpbGwgYmUgcmVtb3ZlZCBhbmQgcm91dGUgZGlzY292ZXJ5CisgICAgICogd2lsbCBubyBsb25nZXIgYmUgcGVyZm9ybWVkIG9uIGl0cyBiZWhhbGYuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbWVkaWEgcm91dGVyIGluc3RhbmNlIGZvciB0aGUgY29udGV4dC4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IGhvbGQKKyAgICAgKiBhIHN0cm9uZyByZWZlcmVuY2UgdG8gdGhpcyBvYmplY3QgYXMgbG9uZyBhcyBpdCBpcyBpbiB1c2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNZWRpYVJvdXRlciBnZXRJbnN0YW5jZShATm9uTnVsbCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udGV4dCBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7CisKKyAgICAgICAgaWYgKHNHbG9iYWwgPT0gbnVsbCkgeworICAgICAgICAgICAgc0dsb2JhbCA9IG5ldyBHbG9iYWxNZWRpYVJvdXRlcihjb250ZXh0LmdldEFwcGxpY2F0aW9uQ29udGV4dCgpKTsKKyAgICAgICAgICAgIHNHbG9iYWwuc3RhcnQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRSb3V0ZXIoY29udGV4dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZXN9IGN1cnJlbnRseSBrbm93biB0bworICAgICAqIHRoaXMgbWVkaWEgcm91dGVyLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFJvdXRlSW5mbz4gZ2V0Um91dGVzKCkgeworICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKKyAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0Um91dGVzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUge0BsaW5rIE1lZGlhUm91dGVyLlByb3ZpZGVySW5mbyByb3V0ZSBwcm92aWRlcnN9CisgICAgICogY3VycmVudGx5IGtub3duIHRvIHRoaXMgbWVkaWEgcm91dGVyLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFByb3ZpZGVySW5mbz4gZ2V0UHJvdmlkZXJzKCkgeworICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKKyAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0UHJvdmlkZXJzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZGVmYXVsdCByb3V0ZSBmb3IgcGxheWluZyBtZWRpYSBjb250ZW50IG9uIHRoZSBzeXN0ZW0uCisgICAgICogPHA+CisgICAgICogVGhlIHN5c3RlbSBhbHdheXMgcHJvdmlkZXMgYSBkZWZhdWx0IHJvdXRlLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGRlZmF1bHQgcm91dGUsIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gbmV2ZXIgYmUgbnVsbC4KKyAgICAgKi8KKyAgICBATm9uTnVsbAorICAgIHB1YmxpYyBSb3V0ZUluZm8gZ2V0RGVmYXVsdFJvdXRlKCkgeworICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKKyAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0RGVmYXVsdFJvdXRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhIGJsdWV0b290aCByb3V0ZSBmb3IgcGxheWluZyBtZWRpYSBjb250ZW50IG9uIHRoZSBzeXN0ZW0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgYmx1ZXRvb3RoIHJvdXRlLCBpZiBleGlzdCwgb3RoZXJ3aXNlIG51bGwuCisgICAgICovCisgICAgcHVibGljIFJvdXRlSW5mbyBnZXRCbHVldG9vdGhSb3V0ZSgpIHsKKyAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7CisgICAgICAgIHJldHVybiBzR2xvYmFsLmdldEJsdWV0b290aFJvdXRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlLgorICAgICAqIDxwPgorICAgICAqIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZXhhbWluZSB0aGUgcm91dGUncworICAgICAqIHtAbGluayBSb3V0ZUluZm8jZ2V0Q29udHJvbEZpbHRlcnMgbWVkaWEgY29udHJvbCBpbnRlbnQgZmlsdGVyc30gdG8gYXNzZXNzIHRoZQorICAgICAqIGNhcGFiaWxpdGllcyBvZiB0aGUgcm91dGUgYmVmb3JlIGF0dGVtcHRpbmcgdG8gdXNlIGl0LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIDxoMz5FeGFtcGxlPC9oMz4KKyAgICAgKiA8cHJlPgorICAgICAqIHB1YmxpYyBib29sZWFuIHBsYXlNb3ZpZSgpIHsKKyAgICAgKiAgICAgTWVkaWFSb3V0ZXIgbWVkaWFSb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShjb250ZXh0KTsKKyAgICAgKiAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbWVkaWFSb3V0ZXIuZ2V0U2VsZWN0ZWRSb3V0ZSgpOworICAgICAqCisgICAgICogICAgIC8vIEZpcnN0IHRyeSB1c2luZyB0aGUgcmVtb3RlIHBsYXliYWNrIGludGVyZmFjZSwgaWYgc3VwcG9ydGVkLgorICAgICAqICAgICBpZiAocm91dGUuc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSykpIHsKKyAgICAgKiAgICAgICAgIC8vIFRoZSByb3V0ZSBzdXBwb3J0cyByZW1vdGUgcGxheWJhY2suCisgICAgICogICAgICAgICAvLyBUcnkgdG8gc2VuZCBpdCB0aGUgVXJpIG9mIHRoZSBtb3ZpZSB0byBwbGF5LgorICAgICAqICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QTEFZKTsKKyAgICAgKiAgICAgICAgIGludGVudC5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKTsKKyAgICAgKiAgICAgICAgIGludGVudC5zZXREYXRhQW5kVHlwZSgiaHR0cDovL2V4YW1wbGUuY29tL3ZpZGVvcy9tb3ZpZS5tcDQiLCAidmlkZW8vbXA0Iik7CisgICAgICogICAgICAgICBpZiAocm91dGUuc3VwcG9ydHNDb250cm9sUmVxdWVzdChpbnRlbnQpKSB7CisgICAgICogICAgICAgICAgICAgcm91dGUuc2VuZENvbnRyb2xSZXF1ZXN0KGludGVudCwgbnVsbCk7CisgICAgICogICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIHNlbnQgdGhlIHJlcXVlc3QgdG8gcGxheSB0aGUgbW92aWUKKyAgICAgKiAgICAgICAgIH0KKyAgICAgKiAgICAgfQorICAgICAqCisgICAgICogICAgIC8vIElmIHJlbW90ZSBwbGF5YmFjayB3YXMgbm90IHBvc3NpYmxlLCB0aGVuIHBsYXkgbG9jYWxseS4KKyAgICAgKiAgICAgaWYgKHJvdXRlLnN1cHBvcnRzQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKSkgeworICAgICAqICAgICAgICAgLy8gVGhlIHJvdXRlIHN1cHBvcnRzIGxpdmUgdmlkZW8gc3RyZWFtaW5nLgorICAgICAqICAgICAgICAgLy8gUHJlcGFyZSB0byBwbGF5IGNvbnRlbnQgbG9jYWxseSBpbiBhIHdpbmRvdyBvciBpbiBhIHByZXNlbnRhdGlvbi4KKyAgICAgKiAgICAgICAgIHJldHVybiBwbGF5TW92aWVJbldpbmRvdygpOworICAgICAqICAgICB9CisgICAgICoKKyAgICAgKiAgICAgLy8gTmVpdGhlciBpbnRlcmZhY2UgaXMgc3VwcG9ydGVkLCBzbyB3ZSBjYW4ndCBwbGF5IHRoZSBtb3ZpZSB0byB0aGlzIHJvdXRlLgorICAgICAqICAgICByZXR1cm4gZmFsc2U7CisgICAgICogfQorICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgc2VsZWN0ZWQgcm91dGUsIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gbmV2ZXIgYmUgbnVsbC4KKyAgICAgKgorICAgICAqIEBzZWUgUm91dGVJbmZvI2dldENvbnRyb2xGaWx0ZXJzCisgICAgICogQHNlZSBSb3V0ZUluZm8jc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkKKyAgICAgKiBAc2VlIFJvdXRlSW5mbyNzdXBwb3J0c0NvbnRyb2xSZXF1ZXN0CisgICAgICovCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgUm91dGVJbmZvIGdldFNlbGVjdGVkUm91dGUoKSB7CisgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOworICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRTZWxlY3RlZFJvdXRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgcm91dGUgaWYgaXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yLCBvdGhlcndpc2UKKyAgICAgKiBzZWxlY3RzIHRoZSBkZWZhdWx0IHJvdXRlIGFuZCByZXR1cm5zIGl0LiBJZiB0aGVyZSBpcyBvbmUgbGl2ZSBhdWRpbyByb3V0ZQorICAgICAqICh1c3VhbGx5IEJsdWV0b290aCBBMkRQKSwgaXQgd2lsbCBiZSBzZWxlY3RlZCBpbnN0ZWFkIG9mIGRlZmF1bHQgcm91dGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHRvIG1hdGNoLgorICAgICAqIEByZXR1cm4gVGhlIHByZXZpb3VzbHkgc2VsZWN0ZWQgcm91dGUgaWYgaXQgbWF0Y2hlZCB0aGUgc2VsZWN0b3IsIG90aGVyd2lzZSB0aGUKKyAgICAgKiBuZXdseSBzZWxlY3RlZCBkZWZhdWx0IHJvdXRlIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gbmV2ZXIgYmUgbnVsbC4KKyAgICAgKgorICAgICAqIEBzZWUgTWVkaWFSb3V0ZVNlbGVjdG9yCisgICAgICogQHNlZSBSb3V0ZUluZm8jbWF0Y2hlc1NlbGVjdG9yCisgICAgICovCisgICAgQE5vbk51bGwKKyAgICBwdWJsaWMgUm91dGVJbmZvIHVwZGF0ZVNlbGVjdGVkUm91dGUoQE5vbk51bGwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7CisKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJ1cGRhdGVTZWxlY3RlZFJvdXRlOiAiICsgc2VsZWN0b3IpOworICAgICAgICB9CisgICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IHNHbG9iYWwuZ2V0U2VsZWN0ZWRSb3V0ZSgpOworICAgICAgICBpZiAoIXJvdXRlLmlzRGVmYXVsdE9yQmx1ZXRvb3RoKCkgJiYgIXJvdXRlLm1hdGNoZXNTZWxlY3RvcihzZWxlY3RvcikpIHsKKyAgICAgICAgICAgIHJvdXRlID0gc0dsb2JhbC5jaG9vc2VGYWxsYmFja1JvdXRlKCk7CisgICAgICAgICAgICBzR2xvYmFsLnNlbGVjdFJvdXRlKHJvdXRlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcm91dGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VsZWN0cyB0aGUgc3BlY2lmaWVkIHJvdXRlLgorICAgICAqCisgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0byBzZWxlY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VsZWN0Um91dGUoQE5vbk51bGwgUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgIGlmIChyb3V0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZSBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7CisKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJzZWxlY3RSb3V0ZTogIiArIHJvdXRlKTsKKyAgICAgICAgfQorICAgICAgICBzR2xvYmFsLnNlbGVjdFJvdXRlKHJvdXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbnNlbGVjdHMgdGhlIGN1cnJlbnQgcm91bmQgYW5kIHNlbGVjdHMgdGhlIGRlZmF1bHQgcm91dGUgaW5zdGVhZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcmVhc29uIGdpdmVuIG11c3QgYmUgb25lIG9mOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9VTktOT1dOfTwvbGk+CisgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fRElTQ09OTkVDVEVEfTwvbGk+CisgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fU1RPUFBFRH08L2xpPgorICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUR9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHBhcmFtIHJlYXNvbiBUaGUgcmVhc29uIGZvciBkaXNjb25uZWN0aW5nIHRoZSBjdXJyZW50IHJvdXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVuc2VsZWN0KGludCByZWFzb24pIHsKKyAgICAgICAgaWYgKHJlYXNvbiA8IE1lZGlhUm91dGVyLlVOU0VMRUNUX1JFQVNPTl9VTktOT1dOIHx8CisgICAgICAgICAgICAgICAgcmVhc29uID4gTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIHJlYXNvbiB0byB1bnNlbGVjdCByb3V0ZSIpOworICAgICAgICB9CisgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOworCisgICAgICAgIC8vIENob29zZSB0aGUgZmFsbGJhY2sgcm91dGUgaWYgaXQncyBub3QgYWxyZWFkeSBzZWxlY3RlZC4KKyAgICAgICAgLy8gT3RoZXJ3aXNlLCBzZWxlY3QgdGhlIGRlZmF1bHQgcm91dGUuCisgICAgICAgIFJvdXRlSW5mbyBmYWxsYmFja1JvdXRlID0gc0dsb2JhbC5jaG9vc2VGYWxsYmFja1JvdXRlKCk7CisgICAgICAgIGlmIChzR2xvYmFsLmdldFNlbGVjdGVkUm91dGUoKSAhPSBmYWxsYmFja1JvdXRlKSB7CisgICAgICAgICAgICBzR2xvYmFsLnNlbGVjdFJvdXRlKGZhbGxiYWNrUm91dGUsIHJlYXNvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzR2xvYmFsLnNlbGVjdFJvdXRlKHNHbG9iYWwuZ2V0RGVmYXVsdFJvdXRlKCksIHJlYXNvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYSByb3V0ZSB0aGF0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBzZWxlY3Rvci4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIGFueSBhdmFpbGFibGUgcm91dGVzIHRoYXQgbWF0Y2ggdGhlCisgICAgICogc2VsZWN0b3IgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkgYXJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuIElmIHRoZQorICAgICAqIHtAbGluayAjQVZBSUxBQklMSVRZX0ZMQUdfSUdOT1JFX0RFRkFVTFRfUk9VVEV9IGZsYWcgaXMgc3BlY2lmaWVkLCB0aGVuCisgICAgICogdGhlIG1ldGhvZCB3aWxsIG9ubHkgY29uc2lkZXIgbm9uLWRlZmF1bHQgcm91dGVzLgorICAgICAqIDwvcD4KKyAgICAgKiA8cCBjbGFzcz0ibm90ZSI+CisgICAgICogT24ge0BsaW5rIEFjdGl2aXR5TWFuYWdlciNpc0xvd1JhbURldmljZSBsb3ctUkFNIGRldmljZXN9IHRoaXMgbWV0aG9kCisgICAgICogd2lsbCByZXR1cm4gdHJ1ZSBpZiBpdCBpcyBwb3NzaWJsZSB0byBkaXNjb3ZlciBhIG1hdGNoaW5nIHJvdXRlIGV2ZW4gaWYKKyAgICAgKiBkaXNjb3ZlcnkgaXMgbm90IGluIHByb2dyZXNzIG9yIGlmIG5vIG1hdGNoaW5nIHJvdXRlIGhhcyB5ZXQgYmVlbiBmb3VuZC4KKyAgICAgKiBVc2Uge0BsaW5rICNBVkFJTEFCSUxJVFlfRkxBR19SRVFVSVJFX01BVENIfSB0byByZXF1aXJlIGFuIGFjdHVhbCBtYXRjaC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHRvIG1hdGNoLgorICAgICAqIEBwYXJhbSBmbGFncyBGbGFncyB0byBjb250cm9sIHRoZSBkZXRlcm1pbmF0aW9uIG9mIHdoZXRoZXIgYSByb3V0ZSBtYXkgYmUKKyAgICAgKiAgICAgICAgICAgIGF2YWlsYWJsZS4gTWF5IGJlIHplcm8gb3Igc29tZSBjb21iaW5hdGlvbiBvZgorICAgICAqICAgICAgICAgICAge0BsaW5rICNBVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURX0gYW5kCisgICAgICogICAgICAgICAgICB7QGxpbmsgI0FWQUlMQUJJTElUWV9GTEFHX1JFUVVJUkVfTUFUQ0h9LgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBhIG1hdGNoaW5nIHJvdXRlIG1heSBiZSBhdmFpbGFibGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNSb3V0ZUF2YWlsYWJsZShATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IsIGludCBmbGFncykgeworICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOworCisgICAgICAgIHJldHVybiBzR2xvYmFsLmlzUm91dGVBdmFpbGFibGUoc2VsZWN0b3IsIGZsYWdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0byBkaXNjb3ZlciByb3V0ZXMgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IgYW5kIHRvIHJlY2VpdmUKKyAgICAgKiBldmVudHMgd2hlbiB0aGV5IGNoYW5nZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBjYWxsaW5nCisgICAgICoge0BsaW5rICNhZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3IsIENhbGxiYWNrLCBpbnQpfSB3aXRob3V0IGZsYWdzLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHJvdXRlIHNlbGVjdG9yIHRoYXQgaW5kaWNhdGVzIHRoZSBraW5kcyBvZiByb3V0ZXMgdGhhdCB0aGUKKyAgICAgKiBjYWxsYmFjayB3b3VsZCBsaWtlIHRvIGRpc2NvdmVyLgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gYWRkLgorICAgICAqIEBzZWUgI3JlbW92ZUNhbGxiYWNrCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yLCBDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBhZGRDYWxsYmFjayhzZWxlY3RvciwgY2FsbGJhY2ssIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGRpc2NvdmVyIHJvdXRlcyB0aGF0IG1hdGNoIHRoZSBzZWxlY3RvciBhbmQgdG8gcmVjZWl2ZQorICAgICAqIGV2ZW50cyB3aGVuIHRoZXkgY2hhbmdlLgorICAgICAqIDxwPgorICAgICAqIFRoZSBzZWxlY3RvciBkZXNjcmliZXMgdGhlIGtpbmRzIG9mIHJvdXRlcyB0aGF0IHRoZSBhcHBsaWNhdGlvbiB3YW50cyB0bworICAgICAqIGRpc2NvdmVyLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBhcHBsaWNhdGlvbiB3YW50cyB0byB1c2UKKyAgICAgKiBsaXZlIGF1ZGlvIHJvdXRlcyB0aGVuIGl0IHNob3VsZCBpbmNsdWRlIHRoZQorICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9BVURJTyBsaXZlIGF1ZGlvIG1lZGlhIGNvbnRyb2wgaW50ZW50IGNhdGVnb3J5fQorICAgICAqIGluIGl0cyBzZWxlY3RvciB3aGVuIGl0IGFkZHMgYSBjYWxsYmFjayB0byB0aGUgbWVkaWEgcm91dGVyLgorICAgICAqIFRoZSBzZWxlY3RvciBtYXkgaW5jbHVkZSBhbnkgbnVtYmVyIG9mIGNhdGVnb3JpZXMuCisgICAgICogPC9wPjxwPgorICAgICAqIElmIHRoZSBjYWxsYmFjayBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQsIHRoZW4gdGhlIHNlbGVjdG9yIGlzIGFkZGVkIHRvCisgICAgICogdGhlIHNldCBvZiBzZWxlY3RvcnMgYmVpbmcgbW9uaXRvcmVkIGJ5IHRoZSBjYWxsYmFjay4KKyAgICAgKiA8L3A+PHA+CisgICAgICogQnkgZGVmYXVsdCwgdGhlIGNhbGxiYWNrIHdpbGwgb25seSBiZSBpbnZva2VkIGZvciBldmVudHMgdGhhdCBhZmZlY3Qgcm91dGVzCisgICAgICogdGhhdCBtYXRjaCB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yLiAgRXZlbnQgZmlsdGVyaW5nIG1heSBiZSBkaXNhYmxlZCBieSBzcGVjaWZ5aW5nCisgICAgICogdGhlIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UU30gZmxhZyB3aGVuIHRoZSBjYWxsYmFjayBpcyByZWdpc3RlcmVkLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBBcHBsaWNhdGlvbnMgc2hvdWxkIHVzZSB0aGUge0BsaW5rICNpc1JvdXRlQXZhaWxhYmxlfSBtZXRob2QgdG8gZGV0ZXJtaW5lCisgICAgICogd2hldGhlciBpcyBpdCBwb3NzaWJsZSB0byBkaXNjb3ZlciBhIHJvdXRlIHdpdGggdGhlIGRlc2lyZWQgY2FwYWJpbGl0aWVzCisgICAgICogYW5kIHRoZXJlZm9yZSB3aGV0aGVyIHRoZSBtZWRpYSByb3V0ZSBidXR0b24gc2hvdWxkIGJlIHNob3duIHRvIHRoZSB1c2VyLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGUge0BsaW5rICNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZfSBmbGFnIHNob3VsZCBiZSB1c2VkIHdoaWxlIHRoZSBhcHBsaWNhdGlvbgorICAgICAqIGlzIGluIHRoZSBmb3JlZ3JvdW5kIHRvIHJlcXVlc3QgdGhhdCBwYXNzaXZlIGRpc2NvdmVyeSBiZSBwZXJmb3JtZWQgaWYgdGhlcmUgYXJlCisgICAgICogc3VmZmljaWVudCByZXNvdXJjZXMgdG8gYWxsb3cgY29udGludW91cyBwYXNzaXZlIGRpc2NvdmVyeS4KKyAgICAgKiBPbiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyI2lzTG93UmFtRGV2aWNlIGxvdy1SQU0gZGV2aWNlc30gdGhpcyBmbGFnIHdpbGwgYmUKKyAgICAgKiBpZ25vcmVkIHRvIGNvbnNlcnZlIHJlc291cmNlcy4KKyAgICAgKiA8L3A+PHA+CisgICAgICogVGhlIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19GT1JDRV9ESVNDT1ZFUll9IGZsYWcgc2hvdWxkIGJlIHVzZWQgd2hlbgorICAgICAqIHBhc3NpdmUgZGlzY292ZXJ5IGFic29sdXRlbHkgbXVzdCBiZSBwZXJmb3JtZWQsIGV2ZW4gb24gbG93LVJBTSBkZXZpY2VzLgorICAgICAqIFRoaXMgZmxhZyBoYXMgYSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBpbXBhY3Qgb24gbG93LVJBTSBkZXZpY2VzCisgICAgICogc2luY2UgaXQgbWF5IGNhdXNlIG1hbnkgbWVkaWEgcm91dGUgcHJvdmlkZXJzIHRvIGJlIHN0YXJ0ZWQgc2ltdWx0YW5lb3VzbHkuCisgICAgICogSXQgaXMgbXVjaCBiZXR0ZXIgdG8gdXNlIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWX0gaW5zdGVhZCB0byBhdm9pZAorICAgICAqIHBlcmZvcm1pbmcgcGFzc2l2ZSBkaXNjb3Zlcnkgb24gdGhlc2UgZGV2aWNlcyBhbHRvZ2V0aGVyLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGUge0BsaW5rICNDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU59IGZsYWcgc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGUKKyAgICAgKiBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZyBpcyBzaG93aW5nIHRvIGNvbmZpcm0gdGhlIHByZXNlbmNlIG9mIGF2YWlsYWJsZQorICAgICAqIHJvdXRlcyB0aGF0IHRoZSB1c2VyIG1heSBjb25uZWN0IHRvLiAgVGhpcyBmbGFnIG1heSB1c2Ugc3Vic3RhbnRpYWxseSBtb3JlCisgICAgICogcG93ZXIuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogPGgzPkV4YW1wbGU8L2gzPgorICAgICAqIDxwcmU+CisgICAgICogcHVibGljIGNsYXNzIE15QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgICogICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIgbVJvdXRlcjsKKyAgICAgKiAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlci5DYWxsYmFjayBtQ2FsbGJhY2s7CisgICAgICogICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvcjsKKyAgICAgKgorICAgICAqICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAqCisgICAgICogICAgICAgICBtUm91dGVyID0gTWVkaWFyb3V0ZXIuZ2V0SW5zdGFuY2UodGhpcyk7CisgICAgICogICAgICAgICBtQ2FsbGJhY2sgPSBuZXcgTXlDYWxsYmFjaygpOworICAgICAqICAgICAgICAgbVNlbGVjdG9yID0gbmV3IE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyKCkKKyAgICAgKiAgICAgICAgICAgICAgICAgLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTykKKyAgICAgKiAgICAgICAgICAgICAgICAgLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKQorICAgICAqICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgKiAgICAgfQorICAgICAqCisgICAgICogICAgIC8vIEFkZCB0aGUgY2FsbGJhY2sgb24gc3RhcnQgdG8gdGVsbCB0aGUgbWVkaWEgcm91dGVyIHdoYXQga2luZHMgb2Ygcm91dGVzCisgICAgICogICAgIC8vIHRoZSBhcHBsaWNhdGlvbiBpcyBpbnRlcmVzdGVkIGluIHNvIHRoYXQgaXQgY2FuIHRyeSB0byBkaXNjb3ZlciBzdWl0YWJsZSBvbmVzLgorICAgICAqICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgeworICAgICAqICAgICAgICAgc3VwZXIub25TdGFydCgpOworICAgICAqCisgICAgICogICAgICAgICBtZWRpYVJvdXRlci5hZGRDYWxsYmFjayhtU2VsZWN0b3IsIG1DYWxsYmFjaywKKyAgICAgKiAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWSk7CisgICAgICoKKyAgICAgKiAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1lZGlhUm91dGVyLnVwZGF0ZVNlbGVjdGVkUm91dGUobVNlbGVjdG9yKTsKKyAgICAgKiAgICAgICAgIC8vIGRvIHNvbWV0aGluZyB3aXRoIHRoZSByb3V0ZS4uLgorICAgICAqICAgICB9CisgICAgICoKKyAgICAgKiAgICAgLy8gUmVtb3ZlIHRoZSBzZWxlY3RvciBvbiBzdG9wIHRvIHRlbGwgdGhlIG1lZGlhIHJvdXRlciB0aGF0IGl0IG5vIGxvbmdlcgorICAgICAqICAgICAvLyBuZWVkcyB0byBpbnZlc3QgZWZmb3J0IHRyeWluZyB0byBkaXNjb3ZlciByb3V0ZXMgb2YgdGhlc2Uga2luZHMgZm9yIG5vdy4KKyAgICAgKiAgICAgcHVibGljIHZvaWQgb25TdG9wKCkgeworICAgICAqICAgICAgICAgc3VwZXIub25TdG9wKCk7CisgICAgICoKKyAgICAgKiAgICAgICAgIG1lZGlhUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7CisgICAgICogICAgIH0KKyAgICAgKgorICAgICAqICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE15Q2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlci5DYWxsYmFjayB7CisgICAgICogICAgICAgICAvLyBJbXBsZW1lbnQgY2FsbGJhY2sgbWV0aG9kcyBhcyBuZWVkZWQuCisgICAgICogICAgIH0KKyAgICAgKiB9CisgICAgICogPC9wcmU+CisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZWN0b3IgQSByb3V0ZSBzZWxlY3RvciB0aGF0IGluZGljYXRlcyB0aGUga2luZHMgb2Ygcm91dGVzIHRoYXQgdGhlCisgICAgICogY2FsbGJhY2sgd291bGQgbGlrZSB0byBkaXNjb3Zlci4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGFkZC4KKyAgICAgKiBAcGFyYW0gZmxhZ3MgRmxhZ3MgdG8gY29udHJvbCB0aGUgYmVoYXZpb3Igb2YgdGhlIGNhbGxiYWNrLgorICAgICAqIE1heSBiZSB6ZXJvIG9yIGEgY29tYmluYXRpb24gb2Yge0BsaW5rICNDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU59IGFuZAorICAgICAqIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UU30uCisgICAgICogQHNlZSAjcmVtb3ZlQ2FsbGJhY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDYWxsYmFjayhATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IsIEBOb25OdWxsIENhbGxiYWNrIGNhbGxiYWNrLAorICAgICAgICAgICAgQENhbGxiYWNrRmxhZ3MgaW50IGZsYWdzKSB7CisgICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKKworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgImFkZENhbGxiYWNrOiBzZWxlY3Rvcj0iICsgc2VsZWN0b3IKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBjYWxsYmFjaz0iICsgY2FsbGJhY2sgKyAiLCBmbGFncz0iICsgSW50ZWdlci50b0hleFN0cmluZyhmbGFncykpOworICAgICAgICB9CisKKyAgICAgICAgQ2FsbGJhY2tSZWNvcmQgcmVjb3JkOworICAgICAgICBpbnQgaW5kZXggPSBmaW5kQ2FsbGJhY2tSZWNvcmQoY2FsbGJhY2spOworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICByZWNvcmQgPSBuZXcgQ2FsbGJhY2tSZWNvcmQodGhpcywgY2FsbGJhY2spOworICAgICAgICAgICAgbUNhbGxiYWNrUmVjb3Jkcy5hZGQocmVjb3JkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlY29yZCA9IG1DYWxsYmFja1JlY29yZHMuZ2V0KGluZGV4KTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHVwZGF0ZU5lZWRlZCA9IGZhbHNlOworICAgICAgICBpZiAoKGZsYWdzICYgfnJlY29yZC5tRmxhZ3MpICE9IDApIHsKKyAgICAgICAgICAgIHJlY29yZC5tRmxhZ3MgfD0gZmxhZ3M7CisgICAgICAgICAgICB1cGRhdGVOZWVkZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICghcmVjb3JkLm1TZWxlY3Rvci5jb250YWlucyhzZWxlY3RvcikpIHsKKyAgICAgICAgICAgIHJlY29yZC5tU2VsZWN0b3IgPSBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIocmVjb3JkLm1TZWxlY3RvcikKKyAgICAgICAgICAgICAgICAgICAgLmFkZFNlbGVjdG9yKHNlbGVjdG9yKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgICAgIHVwZGF0ZU5lZWRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVwZGF0ZU5lZWRlZCkgeworICAgICAgICAgICAgc0dsb2JhbC51cGRhdGVEaXNjb3ZlcnlSZXF1ZXN0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgY2FsbGJhY2suICBJdCB3aWxsIG5vIGxvbmdlciByZWNlaXZlIGV2ZW50cyBhYm91dAorICAgICAqIGNoYW5nZXMgdG8gbWVkaWEgcm91dGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZW1vdmUuCisgICAgICogQHNlZSAjYWRkQ2FsbGJhY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVDYWxsYmFjayhATm9uTnVsbCBDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOworCisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVtb3ZlQ2FsbGJhY2s6IGNhbGxiYWNrPSIgKyBjYWxsYmFjayk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgaW5kZXggPSBmaW5kQ2FsbGJhY2tSZWNvcmQoY2FsbGJhY2spOworICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgbUNhbGxiYWNrUmVjb3Jkcy5yZW1vdmUoaW5kZXgpOworICAgICAgICAgICAgc0dsb2JhbC51cGRhdGVEaXNjb3ZlcnlSZXF1ZXN0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBmaW5kQ2FsbGJhY2tSZWNvcmQoQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNhbGxiYWNrUmVjb3Jkcy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKG1DYWxsYmFja1JlY29yZHMuZ2V0KGkpLm1DYWxsYmFjayA9PSBjYWxsYmFjaykgeworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBtZWRpYSByb3V0ZSBwcm92aWRlciB3aXRoaW4gdGhpcyBhcHBsaWNhdGlvbiBwcm9jZXNzLgorICAgICAqIDxwPgorICAgICAqIFRoZSBwcm92aWRlciB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHByb3ZpZGVycyB0aGF0IGFsbCB7QGxpbmsgTWVkaWFSb3V0ZXJ9CisgICAgICogaW5zdGFuY2VzIHdpdGhpbiB0aGlzIHByb2Nlc3MgY2FuIHVzZSB0byBkaXNjb3ZlciByb3V0ZXMuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHByb3ZpZGVySW5zdGFuY2UgVGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGluc3RhbmNlIHRvIGFkZC4KKyAgICAgKgorICAgICAqIEBzZWUgTWVkaWFSb3V0ZVByb3ZpZGVyCisgICAgICogQHNlZSAjcmVtb3ZlQ2FsbGJhY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQcm92aWRlcihATm9uTnVsbCBNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXJJbnN0YW5jZSkgeworICAgICAgICBpZiAocHJvdmlkZXJJbnN0YW5jZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwcm92aWRlckluc3RhbmNlIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKKworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgImFkZFByb3ZpZGVyOiAiICsgcHJvdmlkZXJJbnN0YW5jZSk7CisgICAgICAgIH0KKyAgICAgICAgc0dsb2JhbC5hZGRQcm92aWRlcihwcm92aWRlckluc3RhbmNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbnJlZ2lzdGVycyBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHdpdGhpbiB0aGlzIGFwcGxpY2F0aW9uIHByb2Nlc3MuCisgICAgICogPHA+CisgICAgICogVGhlIHByb3ZpZGVyIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IG9mIHByb3ZpZGVycyB0aGF0IGFsbCB7QGxpbmsgTWVkaWFSb3V0ZXJ9CisgICAgICogaW5zdGFuY2VzIHdpdGhpbiB0aGlzIHByb2Nlc3MgY2FuIHVzZSB0byBkaXNjb3ZlciByb3V0ZXMuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHByb3ZpZGVySW5zdGFuY2UgVGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGluc3RhbmNlIHRvIHJlbW92ZS4KKyAgICAgKgorICAgICAqIEBzZWUgTWVkaWFSb3V0ZVByb3ZpZGVyCisgICAgICogQHNlZSAjYWRkQ2FsbGJhY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm92aWRlcihATm9uTnVsbCBNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXJJbnN0YW5jZSkgeworICAgICAgICBpZiAocHJvdmlkZXJJbnN0YW5jZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwcm92aWRlckluc3RhbmNlIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKKworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInJlbW92ZVByb3ZpZGVyOiAiICsgcHJvdmlkZXJJbnN0YW5jZSk7CisgICAgICAgIH0KKyAgICAgICAgc0dsb2JhbC5yZW1vdmVQcm92aWRlcihwcm92aWRlckluc3RhbmNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgcmVtb3RlIGNvbnRyb2wgY2xpZW50IHRvIGVuYWJsZSByZW1vdGUgY29udHJvbCBvZiB0aGUgdm9sdW1lCisgICAgICogb2YgdGhlIHNlbGVjdGVkIHJvdXRlLgorICAgICAqIDxwPgorICAgICAqIFRoZSByZW1vdGUgY29udHJvbCBjbGllbnQgbXVzdCBoYXZlIHByZXZpb3VzbHkgYmVlbiByZWdpc3RlcmVkIHdpdGgKKyAgICAgKiB0aGUgYXVkaW8gbWFuYWdlciB1c2luZyB0aGUge0BsaW5rIGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyI3JlZ2lzdGVyUmVtb3RlQ29udHJvbENsaWVudAorICAgICAqIEF1ZGlvTWFuYWdlci5yZWdpc3RlclJlbW90ZUNvbnRyb2xDbGllbnR9IG1ldGhvZC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVtb3RlQ29udHJvbENsaWVudCBUaGUge0BsaW5rIGFuZHJvaWQubWVkaWEuUmVtb3RlQ29udHJvbENsaWVudH0gdG8gcmVnaXN0ZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUmVtb3RlQ29udHJvbENsaWVudChATm9uTnVsbCBPYmplY3QgcmVtb3RlQ29udHJvbENsaWVudCkgeworICAgICAgICBpZiAocmVtb3RlQ29udHJvbENsaWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyZW1vdGVDb250cm9sQ2xpZW50IG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKKworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgImFkZFJlbW90ZUNvbnRyb2xDbGllbnQ6ICIgKyByZW1vdGVDb250cm9sQ2xpZW50KTsKKyAgICAgICAgfQorICAgICAgICBzR2xvYmFsLmFkZFJlbW90ZUNvbnRyb2xDbGllbnQocmVtb3RlQ29udHJvbENsaWVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhIHJlbW90ZSBjb250cm9sIGNsaWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZW1vdGVDb250cm9sQ2xpZW50IFRoZSB7QGxpbmsgYW5kcm9pZC5tZWRpYS5SZW1vdGVDb250cm9sQ2xpZW50fQorICAgICAqICAgICAgICAgICAgdG8gdW5yZWdpc3Rlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVSZW1vdGVDb250cm9sQ2xpZW50KEBOb25OdWxsIE9iamVjdCByZW1vdGVDb250cm9sQ2xpZW50KSB7CisgICAgICAgIGlmIChyZW1vdGVDb250cm9sQ2xpZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJlbW90ZUNvbnRyb2xDbGllbnQgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJyZW1vdmVSZW1vdGVDb250cm9sQ2xpZW50OiAiICsgcmVtb3RlQ29udHJvbENsaWVudCk7CisgICAgICAgIH0KKyAgICAgICAgc0dsb2JhbC5yZW1vdmVSZW1vdGVDb250cm9sQ2xpZW50KHJlbW90ZUNvbnRyb2xDbGllbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1lZGlhIHNlc3Npb24gdG8gZW5hYmxlIHJlbW90ZSBjb250cm9sIG9mIHRoZSB2b2x1bWUgb2YgdGhlCisgICAgICogc2VsZWN0ZWQgcm91dGUuIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZgorICAgICAqIHtAbGluayAjYWRkUmVtb3RlQ29udHJvbENsaWVudH0gd2hlbiB1c2luZyBtZWRpYSBzZXNzaW9ucy4gU2V0IHRoZQorICAgICAqIHNlc3Npb24gdG8gbnVsbCB0byBjbGVhciBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZWRpYVNlc3Npb24gVGhlIHtAbGluayBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9ufSB0bworICAgICAqICAgICAgICAgICAgdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhU2Vzc2lvbihPYmplY3QgbWVkaWFTZXNzaW9uKSB7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkTWVkaWFTZXNzaW9uOiAiICsgbWVkaWFTZXNzaW9uKTsKKyAgICAgICAgfQorICAgICAgICBzR2xvYmFsLnNldE1lZGlhU2Vzc2lvbihtZWRpYVNlc3Npb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBjb21wYXQgbWVkaWEgc2Vzc2lvbiB0byBlbmFibGUgcmVtb3RlIGNvbnRyb2wgb2YgdGhlIHZvbHVtZSBvZiB0aGUKKyAgICAgKiBzZWxlY3RlZCByb3V0ZS4gVGhpcyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mCisgICAgICoge0BsaW5rICNhZGRSZW1vdGVDb250cm9sQ2xpZW50fSB3aGVuIHVzaW5nIHtAbGluayBNZWRpYVNlc3Npb25Db21wYXR9LgorICAgICAqIFNldCB0aGUgc2Vzc2lvbiB0byBudWxsIHRvIGNsZWFyIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIG1lZGlhU2Vzc2lvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhU2Vzc2lvbkNvbXBhdChNZWRpYVNlc3Npb25Db21wYXQgbWVkaWFTZXNzaW9uKSB7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkTWVkaWFTZXNzaW9uQ29tcGF0OiAiICsgbWVkaWFTZXNzaW9uKTsKKyAgICAgICAgfQorICAgICAgICBzR2xvYmFsLnNldE1lZGlhU2Vzc2lvbkNvbXBhdChtZWRpYVNlc3Npb24pOworICAgIH0KKworICAgIHB1YmxpYyBNZWRpYVNlc3Npb25Db21wYXQuVG9rZW4gZ2V0TWVkaWFTZXNzaW9uVG9rZW4oKSB7CisgICAgICAgIHJldHVybiBzR2xvYmFsLmdldE1lZGlhU2Vzc2lvblRva2VuKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlcyB0aGF0IGNhbGxzIGludG8gdGhlIG1lZGlhIHJvdXRlciBhcmUgb24gdGhlIGNvcnJlY3QgdGhyZWFkLgorICAgICAqIEl0IHBheXMgdG8gYmUgYSBsaXR0bGUgcGFyYW5vaWQgd2hlbiBnbG9iYWwgc3RhdGUgaW52YXJpYW50cyBhcmUgYXQgcmlzay4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBjaGVja0NhbGxpbmdUaHJlYWQoKSB7CisgICAgICAgIGlmIChMb29wZXIubXlMb29wZXIoKSAhPSBMb29wZXIuZ2V0TWFpbkxvb3BlcigpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgbWVkaWEgcm91dGVyIHNlcnZpY2UgbXVzdCBvbmx5IGJlICIKKyAgICAgICAgICAgICAgICAgICAgKyAiYWNjZXNzZWQgb24gdGhlIGFwcGxpY2F0aW9uJ3MgbWFpbiB0aHJlYWQuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgPFQ+IGJvb2xlYW4gZXF1YWwoVCBhLCBUIGIpIHsKKyAgICAgICAgcmV0dXJuIGEgPT0gYiB8fCAoYSAhPSBudWxsICYmIGIgIT0gbnVsbCAmJiBhLmVxdWFscyhiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBtZWRpYSByb3V0ZS4KKyAgICAgKiA8cD4KKyAgICAgKiBFYWNoIG1lZGlhIHJvdXRlIGhhcyBhIGxpc3Qgb2Yge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfQorICAgICAqIHtAbGluayAjZ2V0Q29udHJvbEZpbHRlcnMgaW50ZW50IGZpbHRlcnN9IHRoYXQgZGVzY3JpYmUgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUKKyAgICAgKiByb3V0ZSBhbmQgdGhlIG1hbm5lciBpbiB3aGljaCBpdCBpcyB1c2VkIGFuZCBjb250cm9sbGVkLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJvdXRlSW5mbyB7CisgICAgICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXJJbmZvIG1Qcm92aWRlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbURlc2NyaXB0b3JJZDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVVuaXF1ZUlkOworICAgICAgICBwcml2YXRlIFN0cmluZyBtTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbURlc2NyaXB0aW9uOworICAgICAgICBwcml2YXRlIFVyaSBtSWNvblVyaTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUNvbm5lY3Rpbmc7CisgICAgICAgIHByaXZhdGUgaW50IG1Db25uZWN0aW9uU3RhdGU7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQ2FuRGlzY29ubmVjdDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPiBtQ29udHJvbEZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVBsYXliYWNrVHlwZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVBsYXliYWNrU3RyZWFtOworICAgICAgICBwcml2YXRlIGludCBtRGV2aWNlVHlwZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbVZvbHVtZUhhbmRsaW5nOworICAgICAgICBwcml2YXRlIGludCBtVm9sdW1lOworICAgICAgICBwcml2YXRlIGludCBtVm9sdW1lTWF4OworICAgICAgICBwcml2YXRlIERpc3BsYXkgbVByZXNlbnRhdGlvbkRpc3BsYXk7CisgICAgICAgIHByaXZhdGUgaW50IG1QcmVzZW50YXRpb25EaXNwbGF5SWQgPSBQUkVTRU5UQVRJT05fRElTUExBWV9JRF9OT05FOworICAgICAgICBwcml2YXRlIEJ1bmRsZSBtRXh0cmFzOworICAgICAgICBwcml2YXRlIEludGVudFNlbmRlciBtU2V0dGluZ3NJbnRlbnQ7CisgICAgICAgIE1lZGlhUm91dGVEZXNjcmlwdG9yIG1EZXNjcmlwdG9yOworCisgICAgICAgIEBJbnREZWYoe0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVELCBDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkcsCisgICAgICAgICAgICAgICAgQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUR9KQorICAgICAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCisgICAgICAgIHByaXZhdGUgQGludGVyZmFjZSBDb25uZWN0aW9uU3RhdGUge30KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRlZmF1bHQgY29ubmVjdGlvbiBzdGF0ZSBpbmRpY2F0aW5nIHRoZSByb3V0ZSBpcyBkaXNjb25uZWN0ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgI2dldENvbm5lY3Rpb25TdGF0ZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBIGNvbm5lY3Rpb24gc3RhdGUgaW5kaWNhdGluZyB0aGUgcm91dGUgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgY29ubmVjdGluZyBhbmQgaXMgbm90IHlldAorICAgICAgICAgKiByZWFkeSBmb3IgdXNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlICNnZXRDb25uZWN0aW9uU3RhdGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElORyA9IDE7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgY29ubmVjdGlvbiBzdGF0ZSBpbmRpY2F0aW5nIHRoZSByb3V0ZSBpcyBjb25uZWN0ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgI2dldENvbm5lY3Rpb25TdGF0ZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQgPSAyOworCisgICAgICAgIEBJbnREZWYoe1BMQVlCQUNLX1RZUEVfTE9DQUwsUExBWUJBQ0tfVFlQRV9SRU1PVEV9KQorICAgICAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCisgICAgICAgIHByaXZhdGUgQGludGVyZmFjZSBQbGF5YmFja1R5cGUge30KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRlZmF1bHQgcGxheWJhY2sgdHlwZSwgImxvY2FsIiwgaW5kaWNhdGluZyB0aGUgcHJlc2VudGF0aW9uIG9mIHRoZSBtZWRpYQorICAgICAgICAgKiBpcyBoYXBwZW5pbmcgb24gdGhlIHNhbWUgZGV2aWNlIChlLmcuIGEgcGhvbmUsIGEgdGFibGV0KSBhcyB3aGVyZSBpdCBpcworICAgICAgICAgKiBjb250cm9sbGVkIGZyb20uCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgI2dldFBsYXliYWNrVHlwZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfVFlQRV9MT0NBTCA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgcGxheWJhY2sgdHlwZSBpbmRpY2F0aW5nIHRoZSBwcmVzZW50YXRpb24gb2YgdGhlIG1lZGlhIGlzIGhhcHBlbmluZyBvbgorICAgICAgICAgKiBhIGRpZmZlcmVudCBkZXZpY2UgKGkuZS4gdGhlIHJlbW90ZSBkZXZpY2UpIHRoYW4gd2hlcmUgaXQgaXMgY29udHJvbGxlZCBmcm9tLgorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlICNnZXRQbGF5YmFja1R5cGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1RZUEVfUkVNT1RFID0gMTsKKworICAgICAgICBASW50RGVmKHtERVZJQ0VfVFlQRV9VTktOT1dOLCBERVZJQ0VfVFlQRV9UViwgREVWSUNFX1RZUEVfU1BFQUtFUiwgREVWSUNFX1RZUEVfQkxVRVRPT1RIfSkKKyAgICAgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQorICAgICAgICBwcml2YXRlIEBpbnRlcmZhY2UgRGV2aWNlVHlwZSB7fQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGVmYXVsdCByZWNlaXZlciBkZXZpY2UgdHlwZSBvZiB0aGUgcm91dGUgaW5kaWNhdGluZyB0aGUgdHlwZSBpcyB1bmtub3duLgorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlICNnZXREZXZpY2VUeXBlCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQorICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfVFlQRV9VTktOT1dOID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQSByZWNlaXZlciBkZXZpY2UgdHlwZSBvZiB0aGUgcm91dGUgaW5kaWNhdGluZyB0aGUgcHJlc2VudGF0aW9uIG9mIHRoZSBtZWRpYSBpcyBoYXBwZW5pbmcKKyAgICAgICAgICogb24gYSBUVi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSAjZ2V0RGV2aWNlVHlwZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1RZUEVfVFYgPSAxOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBIHJlY2VpdmVyIGRldmljZSB0eXBlIG9mIHRoZSByb3V0ZSBpbmRpY2F0aW5nIHRoZSBwcmVzZW50YXRpb24gb2YgdGhlIG1lZGlhIGlzIGhhcHBlbmluZworICAgICAgICAgKiBvbiBhIHNwZWFrZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgI2dldERldmljZVR5cGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9UWVBFX1NQRUFLRVIgPSAyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBIHJlY2VpdmVyIGRldmljZSB0eXBlIG9mIHRoZSByb3V0ZSBpbmRpY2F0aW5nIHRoZSBwcmVzZW50YXRpb24gb2YgdGhlIG1lZGlhIGlzIGhhcHBlbmluZworICAgICAgICAgKiBvbiBhIGJsdWV0b290aCBkZXZpY2Ugc3VjaCBhcyBhIGJsdWV0b290aCBzcGVha2VyLgorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlICNnZXREZXZpY2VUeXBlCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQorICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfVFlQRV9CTFVFVE9PVEggPSAzOworCisgICAgICAgIEBJbnREZWYoe1BMQVlCQUNLX1ZPTFVNRV9GSVhFRCxQTEFZQkFDS19WT0xVTUVfVkFSSUFCTEV9KQorICAgICAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCisgICAgICAgIHByaXZhdGUgQGludGVyZmFjZSBQbGF5YmFja1ZvbHVtZSB7fQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQbGF5YmFjayBpbmZvcm1hdGlvbiBpbmRpY2F0aW5nIHRoZSBwbGF5YmFjayB2b2x1bWUgaXMgZml4ZWQsIGkuZS4gaXQgY2Fubm90IGJlCisgICAgICAgICAqIGNvbnRyb2xsZWQgZnJvbSB0aGlzIG9iamVjdC4gQW4gZXhhbXBsZSBvZiBmaXhlZCBwbGF5YmFjayB2b2x1bWUgaXMgYSByZW1vdGUgcGxheWVyLAorICAgICAgICAgKiBwbGF5aW5nIG92ZXIgSERNSSB3aGVyZSB0aGUgdXNlciBwcmVmZXJzIHRvIGNvbnRyb2wgdGhlIHZvbHVtZSBvbiB0aGUgSERNSSBzaW5rLCByYXRoZXIKKyAgICAgICAgICogdGhhbiBhdHRlbnVhdGUgYXQgdGhlIHNvdXJjZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSAjZ2V0Vm9sdW1lSGFuZGxpbmcKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1ZPTFVNRV9GSVhFRCA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBsYXliYWNrIGluZm9ybWF0aW9uIGluZGljYXRpbmcgdGhlIHBsYXliYWNrIHZvbHVtZSBpcyB2YXJpYWJsZSBhbmQgY2FuIGJlIGNvbnRyb2xsZWQKKyAgICAgICAgICogZnJvbSB0aGlzIG9iamVjdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSAjZ2V0Vm9sdW1lSGFuZGxpbmcKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRSA9IDE7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkZWZhdWx0IHByZXNlbnRhdGlvbiBkaXNwbGF5IGlkIGluZGljYXRpbmcgbm8gcHJlc2VudGF0aW9uIGRpc3BsYXkgaXMgYXNzb2NpYXRlZAorICAgICAgICAgKiB3aXRoIHRoZSByb3V0ZS4KKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRVNFTlRBVElPTl9ESVNQTEFZX0lEX05PTkUgPSAtMTsKKworICAgICAgICBzdGF0aWMgZmluYWwgaW50IENIQU5HRV9HRU5FUkFMID0gMSA8PCAwOworICAgICAgICBzdGF0aWMgZmluYWwgaW50IENIQU5HRV9WT0xVTUUgPSAxIDw8IDE7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFX1BSRVNFTlRBVElPTl9ESVNQTEFZID0gMSA8PCAyOworCisgICAgICAgIC8vIFNob3VsZCBtYXRjaCB0byBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuUEFDS0FHRV9OQU1FLgorICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9NRURJQV9ST1VURV9QUk9WSURFUl9QQUNLQUdFX05BTUUgPSAiYW5kcm9pZCI7CisKKyAgICAgICAgUm91dGVJbmZvKFByb3ZpZGVySW5mbyBwcm92aWRlciwgU3RyaW5nIGRlc2NyaXB0b3JJZCwgU3RyaW5nIHVuaXF1ZUlkKSB7CisgICAgICAgICAgICBtUHJvdmlkZXIgPSBwcm92aWRlcjsKKyAgICAgICAgICAgIG1EZXNjcmlwdG9ySWQgPSBkZXNjcmlwdG9ySWQ7CisgICAgICAgICAgICBtVW5pcXVlSWQgPSB1bmlxdWVJZDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm92aWRlciBvZiB0aGlzIG1lZGlhIHJvdXRlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFByb3ZpZGVySW5mbyBnZXRQcm92aWRlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBtUHJvdmlkZXI7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSByb3V0ZSB1bmlxdWUgaWQgZnVuY3Rpb25zIGFzIGEgc3RhYmxlIGlkZW50aWZpZXIgYnkgd2hpY2ggdGhlIHJvdXRlIGlzIGtub3duLgorICAgICAgICAgKiBGb3IgZXhhbXBsZSwgYW4gYXBwbGljYXRpb24gY2FuIHVzZSB0aGlzIGlkIGFzIGEgdG9rZW4gdG8gcmVtZW1iZXIgdGhlCisgICAgICAgICAqIHNlbGVjdGVkIHJvdXRlIGFjcm9zcyByZXN0YXJ0cyBvciB0byBjb21tdW5pY2F0ZSBpdHMgaWRlbnRpdHkgdG8gYSBzZXJ2aWNlLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVGhlIHVuaXF1ZSBpZCBvZiB0aGUgcm91dGUsIG5ldmVyIG51bGwuCisgICAgICAgICAqLworICAgICAgICBATm9uTnVsbAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1VbmlxdWVJZDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSB1c2VyLXZpc2libGUgbmFtZSBvZiB0aGUgcm91dGUuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgcm91dGUgbmFtZSBpZGVudGlmaWVzIHRoZSBkZXN0aW5hdGlvbiByZXByZXNlbnRlZCBieSB0aGUgcm91dGUuCisgICAgICAgICAqIEl0IG1heSBiZSBhIHVzZXItc3VwcGxpZWQgbmFtZSwgYW4gYWxpYXMsIG9yIGRldmljZSBzZXJpYWwgbnVtYmVyLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVGhlIHVzZXItdmlzaWJsZSBuYW1lIG9mIGEgbWVkaWEgcm91dGUuICBUaGlzIGlzIHRoZSBzdHJpbmcgcHJlc2VudGVkCisgICAgICAgICAqIHRvIHVzZXJzIHdobyBtYXkgc2VsZWN0IHRoaXMgYXMgdGhlIGFjdGl2ZSByb3V0ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSB1c2VyLXZpc2libGUgZGVzY3JpcHRpb24gb2YgdGhlIHJvdXRlLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIHJvdXRlIGRlc2NyaXB0aW9uIGRlc2NyaWJlcyB0aGUga2luZCBvZiBkZXN0aW5hdGlvbiByZXByZXNlbnRlZCBieSB0aGUgcm91dGUuCisgICAgICAgICAqIEl0IG1heSBiZSBhIHVzZXItc3VwcGxpZWQgc3RyaW5nLCBhIG1vZGVsIG51bWJlciBvciBicmFuZCBvZiBkZXZpY2UuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHJvdXRlLCBvciBudWxsIGlmIG5vbmUuCisgICAgICAgICAqLworICAgICAgICBATnVsbGFibGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBtRGVzY3JpcHRpb247CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgVVJJIG9mIHRoZSBpY29uIHJlcHJlc2VudGluZyB0aGlzIHJvdXRlLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhpcyBpY29uIHdpbGwgYmUgdXNlZCBpbiBwaWNrZXIgVUlzIGlmIGF2YWlsYWJsZS4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBVUkkgb2YgdGhlIGljb24gcmVwcmVzZW50aW5nIHRoaXMgcm91dGUsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBVcmkgZ2V0SWNvblVyaSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtSWNvblVyaTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyByb3V0ZSBpcyBlbmFibGVkIGFuZCBtYXkgYmUgc2VsZWN0ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGVuYWJsZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUVuYWJsZWQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBjb25uZWN0aW5nIGFuZCBpcyBub3QKKyAgICAgICAgICogeWV0IHJlYWR5IGZvciB1c2UuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGluIHRoZSBwcm9jZXNzIG9mIGNvbm5lY3RpbmcuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvbm5lY3Rpbmc7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGUgcm91dGUuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVGhlIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhpcyByb3V0ZToge0BsaW5rICNDT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRH0sCisgICAgICAgICAqIHtAbGluayAjQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HfSwgb3Ige0BsaW5rICNDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRH0uCisgICAgICAgICAqLworICAgICAgICBAQ29ubmVjdGlvblN0YXRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29ubmVjdGlvblN0YXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Db25uZWN0aW9uU3RhdGU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcm91dGUgaXMgY3VycmVudGx5IHNlbGVjdGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyByb3V0ZSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIjZ2V0U2VsZWN0ZWRSb3V0ZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZCgpIHsKKyAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOworICAgICAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0U2VsZWN0ZWRSb3V0ZSgpID09IHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcm91dGUgaXMgdGhlIGRlZmF1bHQgcm91dGUuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIHRoZSBkZWZhdWx0IHJvdXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlIE1lZGlhUm91dGVyI2dldERlZmF1bHRSb3V0ZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkgeworICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7CisgICAgICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXREZWZhdWx0Um91dGUoKSA9PSB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGEgYmx1ZXRvb3RoIHJvdXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyByb3V0ZSBpcyBhIGJsdWV0b290aCByb3V0ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSBNZWRpYVJvdXRlciNnZXRCbHVldG9vdGhSb3V0ZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNCbHVldG9vdGgoKSB7CisgICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKKyAgICAgICAgICAgIHJldHVybiBzR2xvYmFsLmdldEJsdWV0b290aFJvdXRlKCkgPT0gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyByb3V0ZSBpcyB0aGUgZGVmYXVsdCByb3V0ZSBhbmQgdGhlIGRldmljZSBzcGVha2VyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyByb3V0ZSBpcyB0aGUgZGVmYXVsdCByb3V0ZSBhbmQgdGhlIGRldmljZSBzcGVha2VyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEZXZpY2VTcGVha2VyKCkgeworICAgICAgICAgICAgaW50IGRlZmF1bHRBdWRpb1JvdXRlTmFtZVJlc291cmNlSWQgPSBSZXNvdXJjZXMuZ2V0U3lzdGVtKCkuZ2V0SWRlbnRpZmllcigKKyAgICAgICAgICAgICAgICAgICAgImRlZmF1bHRfYXVkaW9fcm91dGVfbmFtZSIsICJzdHJpbmciLCAiYW5kcm9pZCIpOworICAgICAgICAgICAgcmV0dXJuIGlzRGVmYXVsdCgpCisgICAgICAgICAgICAgICAgICAgICYmIFJlc291cmNlcy5nZXRTeXN0ZW0oKS5nZXRUZXh0KGRlZmF1bHRBdWRpb1JvdXRlTmFtZVJlc291cmNlSWQpLmVxdWFscyhtTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyBhIGxpc3Qgb2Yge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGludGVudH0gZmlsdGVycyB0aGF0CisgICAgICAgICAqIGRlc2NyaWJlIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhpcyByb3V0ZSBhbmQgdGhlIG1lZGlhIGNvbnRyb2wgYWN0aW9ucyB0aGF0CisgICAgICAgICAqIGl0IHN1cHBvcnRzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIEEgbGlzdCBvZiBpbnRlbnQgZmlsdGVycyB0aGF0IHNwZWNpZmllcyB0aGUgbWVkaWEgY29udHJvbCBpbnRlbnRzIHRoYXQKKyAgICAgICAgICogdGhpcyByb3V0ZSBzdXBwb3J0cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQKKyAgICAgICAgICogQHNlZSAjc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkKKyAgICAgICAgICogQHNlZSAjc3VwcG9ydHNDb250cm9sUmVxdWVzdAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIExpc3Q8SW50ZW50RmlsdGVyPiBnZXRDb250cm9sRmlsdGVycygpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ29udHJvbEZpbHRlcnM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBhdCBsZWFzdCBvbmUgb2YgdGhlIGNhcGFiaWxpdGllcworICAgICAgICAgKiBkZXNjcmliZWQgYnkgYSBtZWRpYSByb3V0ZSBzZWxlY3Rvci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBzZWxlY3RvciB0aGF0IHNwZWNpZmllcyB0aGUgY2FwYWJpbGl0aWVzIHRvIGNoZWNrLgorICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIGF0IGxlYXN0IG9uZSBvZiB0aGUgY2FwYWJpbGl0aWVzCisgICAgICAgICAqIGRlc2NyaWJlZCBpbiB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzU2VsZWN0b3IoQE5vbk51bGwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7CisgICAgICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOworICAgICAgICAgICAgcmV0dXJuIHNlbGVjdG9yLm1hdGNoZXNDb250cm9sRmlsdGVycyhtQ29udHJvbEZpbHRlcnMpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgdGhlIHNwZWNpZmllZAorICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IGNhdGVnb3J5LgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogTWVkaWEgY29udHJvbCBjYXRlZ29yaWVzIGRlc2NyaWJlIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhpcyByb3V0ZQorICAgICAgICAgKiBzdWNoIGFzIHdoZXRoZXIgaXQgc3VwcG9ydHMgbGl2ZSBhdWRpbyBzdHJlYW1pbmcgb3IgcmVtb3RlIHBsYXliYWNrLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjYXRlZ29yeSBBIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbH0gY2F0ZWdvcnkKKyAgICAgICAgICogc3VjaCBhcyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfQVVESU99LAorICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfVklERU99LAorICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDS30sIG9yIGEgcHJvdmlkZXItZGVmaW5lZAorICAgICAgICAgKiBtZWRpYSBjb250cm9sIGNhdGVnb3J5LgorICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQgaW50ZW50IGNhdGVnb3J5LgorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudAorICAgICAgICAgKiBAc2VlICNnZXRDb250cm9sRmlsdGVycworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoQE5vbk51bGwgU3RyaW5nIGNhdGVnb3J5KSB7CisgICAgICAgICAgICBpZiAoY2F0ZWdvcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhdGVnb3J5IG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOworCisgICAgICAgICAgICBpbnQgY291bnQgPSBtQ29udHJvbEZpbHRlcnMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Db250cm9sRmlsdGVycy5nZXQoaSkuaGFzQ2F0ZWdvcnkoY2F0ZWdvcnkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQKKyAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSBjYXRlZ29yeSBhbmQgYWN0aW9uLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogTWVkaWEgY29udHJvbCBhY3Rpb25zIGRlc2NyaWJlIHNwZWNpZmljIHJlcXVlc3RzIHRoYXQgYW4gYXBwbGljYXRpb24KKyAgICAgICAgICogY2FuIGFzayBhIHJvdXRlIHRvIHBlcmZvcm0uCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNhdGVnb3J5IEEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSBjYXRlZ29yeQorICAgICAgICAgKiBzdWNoIGFzIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9BVURJT30sCisgICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9WSURFT30sCisgICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLfSwgb3IgYSBwcm92aWRlci1kZWZpbmVkCisgICAgICAgICAqIG1lZGlhIGNvbnRyb2wgY2F0ZWdvcnkuCisgICAgICAgICAqIEBwYXJhbSBhY3Rpb24gQSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IGFjdGlvbgorICAgICAgICAgKiBzdWNoIGFzIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVl9LgorICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQgaW50ZW50IGFjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQKKyAgICAgICAgICogQHNlZSAjZ2V0Q29udHJvbEZpbHRlcnMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ29udHJvbEFjdGlvbihATm9uTnVsbCBTdHJpbmcgY2F0ZWdvcnksIEBOb25OdWxsIFN0cmluZyBhY3Rpb24pIHsKKyAgICAgICAgICAgIGlmIChjYXRlZ29yeSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2F0ZWdvcnkgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYWN0aW9uIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOworCisgICAgICAgICAgICBpbnQgY291bnQgPSBtQ29udHJvbEZpbHRlcnMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG1Db250cm9sRmlsdGVycy5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGZpbHRlci5oYXNDYXRlZ29yeShjYXRlZ29yeSkgJiYgZmlsdGVyLmhhc0FjdGlvbihhY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQKKyAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSByZXF1ZXN0LgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogTWVkaWEgY29udHJvbCByZXF1ZXN0cyBhcmUgdXNlZCB0byByZXF1ZXN0IHRoZSByb3V0ZSB0byBwZXJmb3JtCisgICAgICAgICAqIGFjdGlvbnMgc3VjaCBhcyBzdGFydGluZyByZW1vdGUgcGxheWJhY2sgb2YgYSBtZWRpYSBpdGVtLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBpbnRlbnQgQSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fS4KKyAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSByb3V0ZSBjYW4gaGFuZGxlIHRoZSBzcGVjaWZpZWQgaW50ZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudAorICAgICAgICAgKiBAc2VlICNnZXRDb250cm9sRmlsdGVycworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDb250cm9sUmVxdWVzdChATm9uTnVsbCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBpZiAoaW50ZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnRlbnQgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7CisKKyAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlciBjb250ZW50UmVzb2x2ZXIgPSBzR2xvYmFsLmdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICAgICAgaW50IGNvdW50ID0gbUNvbnRyb2xGaWx0ZXJzLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChtQ29udHJvbEZpbHRlcnMuZ2V0KGkpLm1hdGNoKGNvbnRlbnRSZXNvbHZlciwgaW50ZW50LCB0cnVlLCBUQUcpID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNlbmRzIGEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSByZXF1ZXN0IHRvIGJlIHBlcmZvcm1lZAorICAgICAgICAgKiBhc3luY2hyb25vdXNseSBieSB0aGUgcm91dGUncyBkZXN0aW5hdGlvbi4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIE1lZGlhIGNvbnRyb2wgcmVxdWVzdHMgYXJlIHVzZWQgdG8gcmVxdWVzdCB0aGUgcm91dGUgdG8gcGVyZm9ybQorICAgICAgICAgKiBhY3Rpb25zIHN1Y2ggYXMgc3RhcnRpbmcgcmVtb3RlIHBsYXliYWNrIG9mIGEgbWVkaWEgaXRlbS4KKyAgICAgICAgICogPC9wPjxwPgorICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBvbmx5IGJlIGNhbGxlZCBvbiBhIHNlbGVjdGVkIHJvdXRlLiAgQ29udHJvbCByZXF1ZXN0cworICAgICAgICAgKiBzZW50IHRvIHVuc2VsZWN0ZWQgcm91dGVzIHdpbGwgZmFpbC4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gaW50ZW50IEEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGludGVudH0uCisgICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIHtAbGluayBDb250cm9sUmVxdWVzdENhbGxiYWNrfSB0byBpbnZva2Ugd2l0aCB0aGUgcmVzdWx0CisgICAgICAgICAqIG9mIHRoZSByZXF1ZXN0LCBvciBudWxsIGlmIG5vIHJlc3VsdCBpcyByZXF1aXJlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNlbmRDb250cm9sUmVxdWVzdChATm9uTnVsbCBJbnRlbnQgaW50ZW50LAorICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBpZiAoaW50ZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnRlbnQgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7CisKKyAgICAgICAgICAgIHNHbG9iYWwuc2VuZENvbnRyb2xSZXF1ZXN0KHRoaXMsIGludGVudCwgY2FsbGJhY2spOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIHR5cGUgb2YgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVGhlIHR5cGUgb2YgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGU6IHtAbGluayAjUExBWUJBQ0tfVFlQRV9MT0NBTH0KKyAgICAgICAgICogb3Ige0BsaW5rICNQTEFZQkFDS19UWVBFX1JFTU9URX0uCisgICAgICAgICAqLworICAgICAgICBAUGxheWJhY2tUeXBlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tUeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1QbGF5YmFja1R5cGU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgYXVkaW8gc3RyZWFtIG92ZXIgd2hpY2ggdGhlIHBsYXliYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlIGlzIHBlcmZvcm1lZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUaGUgc3RyZWFtIG92ZXIgd2hpY2ggdGhlIHBsYXliYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlIGlzIHBlcmZvcm1lZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tTdHJlYW0oKSB7CisgICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrU3RyZWFtOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIHJlY2VpdmVyIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUaGUgdHlwZSBvZiB0aGUgcmVjZWl2ZXIgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlOgorICAgICAgICAgKiB7QGxpbmsgI0RFVklDRV9UWVBFX1RWfSBvciB7QGxpbmsgI0RFVklDRV9UWVBFX1NQRUFLRVJ9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXREZXZpY2VUeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1EZXZpY2VUeXBlOworICAgICAgICB9CisKKworICAgICAgICAvKioKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE9yQmx1ZXRvb3RoKCkgeworICAgICAgICAgICAgaWYgKGlzRGVmYXVsdCgpIHx8IG1EZXZpY2VUeXBlID09IERFVklDRV9UWVBFX0JMVUVUT09USCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIHBsYXRmb3JtIHZlcnNpb24gMjMgb3IgYmVsb3cgd2hlcmUgdGhlIHN5c3RlbSByb3V0ZQorICAgICAgICAgICAgLy8gcHJvdmlkZXIgZG9lc24ndCBzcGVjaWZ5IGRldmljZSB0eXBlIGZvciBibHVldG9vdGggbWVkaWEgcm91dGVzLgorICAgICAgICAgICAgcmV0dXJuIGlzU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyKHRoaXMpCisgICAgICAgICAgICAgICAgICAgICYmIHN1cHBvcnRzQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKQorICAgICAgICAgICAgICAgICAgICAmJiAhc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfVklERU8pOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSByb3V0ZSBpcyBzZWxlY3RhYmxlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiBpc1NlbGVjdGFibGUoKSB7CisgICAgICAgICAgICAvLyBUaGlzIHRlc3RzIHdoZXRoZXIgdGhlIHJvdXRlIGlzIHN0aWxsIHZhbGlkIGFuZCBlbmFibGVkLgorICAgICAgICAgICAgLy8gVGhlIHJvdXRlIGRlc2NyaXB0b3IgZmllbGQgaXMgc2V0IHRvIG51bGwgd2hlbiB0aGUgcm91dGUgaXMgcmVtb3ZlZC4KKyAgICAgICAgICAgIHJldHVybiBtRGVzY3JpcHRvciAhPSBudWxsICYmIG1FbmFibGVkOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1N5c3RlbU1lZGlhUm91dGVQcm92aWRlcihNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKKyAgICAgICAgICAgIHJldHVybiBUZXh0VXRpbHMuZXF1YWxzKHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKS5nZXRNZXRhZGF0YSgpLmdldFBhY2thZ2VOYW1lKCksCisgICAgICAgICAgICAgICAgICAgIFNZU1RFTV9NRURJQV9ST1VURV9QUk9WSURFUl9QQUNLQUdFX05BTUUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgaG93IHZvbHVtZSBpcyBoYW5kbGVkIG9uIHRoZSByb3V0ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBIb3cgdm9sdW1lIGlzIGhhbmRsZWQgb24gdGhlIHJvdXRlOiB7QGxpbmsgI1BMQVlCQUNLX1ZPTFVNRV9GSVhFRH0KKyAgICAgICAgICogb3Ige0BsaW5rICNQTEFZQkFDS19WT0xVTUVfVkFSSUFCTEV9LgorICAgICAgICAgKi8KKyAgICAgICAgQFBsYXliYWNrVm9sdW1lCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Vm9sdW1lSGFuZGxpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gbVZvbHVtZUhhbmRsaW5nOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIGN1cnJlbnQgdm9sdW1lIGZvciB0aGlzIHJvdXRlLiBEZXBlbmRpbmcgb24gdGhlIHJvdXRlLCB0aGlzIG1heSBvbmx5CisgICAgICAgICAqIGJlIHZhbGlkIGlmIHRoZSByb3V0ZSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVGhlIHZvbHVtZSBhdCB3aGljaCB0aGUgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUgaXMgcGVyZm9ybWVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRWb2x1bWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbVZvbHVtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIHZvbHVtZSBhdCB3aGljaCB0aGUgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUgaXMgcGVyZm9ybWVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSBtYXhpbXVtIHZvbHVtZSBhdCB3aGljaCB0aGUgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoCisgICAgICAgICAqIHRoaXMgcm91dGUgaXMgcGVyZm9ybWVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRWb2x1bWVNYXgoKSB7CisgICAgICAgICAgICByZXR1cm4gbVZvbHVtZU1heDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHdoZXRoZXIgdGhpcyByb3V0ZSBzdXBwb3J0cyBkaXNjb25uZWN0aW5nIHdpdGhvdXQgaW50ZXJydXB0aW5nCisgICAgICAgICAqIHBsYXliYWNrLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyByb3V0ZSBjYW4gZGlzY29ubmVjdCB3aXRob3V0IHN0b3BwaW5nIHBsYXliYWNrLAorICAgICAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNhbkRpc2Nvbm5lY3QoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNhbkRpc2Nvbm5lY3Q7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVxdWVzdHMgYSB2b2x1bWUgY2hhbmdlIGZvciB0aGlzIHJvdXRlIGFzeW5jaHJvbm91c2x5LgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhpcyBmdW5jdGlvbiBtYXkgb25seSBiZSBjYWxsZWQgb24gYSBzZWxlY3RlZCByb3V0ZS4gIEl0IHdpbGwgaGF2ZQorICAgICAgICAgKiBubyBlZmZlY3QgaWYgdGhlIHJvdXRlIGlzIGN1cnJlbnRseSB1bnNlbGVjdGVkLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB2b2x1bWUgVGhlIG5ldyB2b2x1bWUgdmFsdWUgYmV0d2VlbiAwIGFuZCB7QGxpbmsgI2dldFZvbHVtZU1heH0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0U2V0Vm9sdW1lKGludCB2b2x1bWUpIHsKKyAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOworICAgICAgICAgICAgc0dsb2JhbC5yZXF1ZXN0U2V0Vm9sdW1lKHRoaXMsIE1hdGgubWluKG1Wb2x1bWVNYXgsIE1hdGgubWF4KDAsIHZvbHVtZSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXF1ZXN0cyBhbiBpbmNyZW1lbnRhbCB2b2x1bWUgdXBkYXRlIGZvciB0aGlzIHJvdXRlIGFzeW5jaHJvbm91c2x5LgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhpcyBmdW5jdGlvbiBtYXkgb25seSBiZSBjYWxsZWQgb24gYSBzZWxlY3RlZCByb3V0ZS4gIEl0IHdpbGwgaGF2ZQorICAgICAgICAgKiBubyBlZmZlY3QgaWYgdGhlIHJvdXRlIGlzIGN1cnJlbnRseSB1bnNlbGVjdGVkLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBkZWx0YSBUaGUgZGVsdGEgdG8gYWRkIHRvIHRoZSBjdXJyZW50IHZvbHVtZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RVcGRhdGVWb2x1bWUoaW50IGRlbHRhKSB7CisgICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKKyAgICAgICAgICAgIGlmIChkZWx0YSAhPSAwKSB7CisgICAgICAgICAgICAgICAgc0dsb2JhbC5yZXF1ZXN0VXBkYXRlVm9sdW1lKHRoaXMsIGRlbHRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSB7QGxpbmsgRGlzcGxheX0gdGhhdCBzaG91bGQgYmUgdXNlZCBieSB0aGUgYXBwbGljYXRpb24gdG8gc2hvdworICAgICAgICAgKiBhIHtAbGluayBhbmRyb2lkLmFwcC5QcmVzZW50YXRpb259IG9uIGFuIGV4dGVybmFsIGRpc3BsYXkgd2hlbiB0aGlzIHJvdXRlIGlzIHNlbGVjdGVkLgorICAgICAgICAgKiBEZXBlbmRpbmcgb24gdGhlIHJvdXRlLCB0aGlzIG1heSBvbmx5IGJlIHZhbGlkIGlmIHRoZSByb3V0ZSBpcyBjdXJyZW50bHkKKyAgICAgICAgICogc2VsZWN0ZWQuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgcHJlZmVycmVkIHByZXNlbnRhdGlvbiBkaXNwbGF5IG1heSBjaGFuZ2UgaW5kZXBlbmRlbnRseSBvZiB0aGUgcm91dGUKKyAgICAgICAgICogYmVpbmcgc2VsZWN0ZWQgb3IgdW5zZWxlY3RlZC4gIEZvciBleGFtcGxlLCB0aGUgcHJlc2VudGF0aW9uIGRpc3BsYXkKKyAgICAgICAgICogb2YgdGhlIGRlZmF1bHQgc3lzdGVtIHJvdXRlIG1heSBjaGFuZ2Ugd2hlbiBhbiBleHRlcm5hbCBIRE1JIGRpc3BsYXkgaXMgY29ubmVjdGVkCisgICAgICAgICAqIG9yIGRpc2Nvbm5lY3RlZCBldmVuIHRob3VnaCB0aGUgcm91dGUgaXRzZWxmIGhhcyBub3QgY2hhbmdlZC4KKyAgICAgICAgICogPC9wPjxwPgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwgaWYgdGhlcmUgaXMgbm8gZXh0ZXJuYWwgZGlzcGxheSBhc3NvY2lhdGVkIHdpdGgKKyAgICAgICAgICogdGhlIHJvdXRlIG9yIGlmIHRoZSBkaXNwbGF5IGlzIG5vdCByZWFkeSB0byBzaG93IFVJIHlldC4KKyAgICAgICAgICogPC9wPjxwPgorICAgICAgICAgKiBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGxpc3RlbiBmb3IgY2hhbmdlcyB0byB0aGUgcHJlc2VudGF0aW9uIGRpc3BsYXkKKyAgICAgICAgICogdXNpbmcgdGhlIHtAbGluayBDYWxsYmFjayNvblJvdXRlUHJlc2VudGF0aW9uRGlzcGxheUNoYW5nZWR9IGNhbGxiYWNrIGFuZAorICAgICAgICAgKiBzaG93IG9yIGRpc21pc3MgaXRzIHtAbGluayBhbmRyb2lkLmFwcC5QcmVzZW50YXRpb259IGFjY29yZGluZ2x5IHdoZW4gdGhlIGRpc3BsYXkKKyAgICAgICAgICogYmVjb21lcyBhdmFpbGFibGUgb3IgaXMgcmVtb3ZlZC4KKyAgICAgICAgICogPC9wPjxwPgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBvbmx5IG1ha2VzIHNlbnNlIGZvcgorICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfVklERU8gbGl2ZSB2aWRlb30gcm91dGVzLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVGhlIHByZWZlcnJlZCBwcmVzZW50YXRpb24gZGlzcGxheSB0byB1c2Ugd2hlbiB0aGlzIHJvdXRlIGlzCisgICAgICAgICAqIHNlbGVjdGVkIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9WSURFTworICAgICAgICAgKiBAc2VlIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgQE51bGxhYmxlCisgICAgICAgIHB1YmxpYyBEaXNwbGF5IGdldFByZXNlbnRhdGlvbkRpc3BsYXkoKSB7CisgICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKKyAgICAgICAgICAgIGlmIChtUHJlc2VudGF0aW9uRGlzcGxheUlkID49IDAgJiYgbVByZXNlbnRhdGlvbkRpc3BsYXkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1QcmVzZW50YXRpb25EaXNwbGF5ID0gc0dsb2JhbC5nZXREaXNwbGF5KG1QcmVzZW50YXRpb25EaXNwbGF5SWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1QcmVzZW50YXRpb25EaXNwbGF5OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIHJvdXRlJ3MgcHJlc2VudGF0aW9uIGRpc3BsYXkgaWQsIG9yIC0xIGlmIG5vbmUuCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQorICAgICAgICBwdWJsaWMgaW50IGdldFByZXNlbnRhdGlvbkRpc3BsYXlJZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUHJlc2VudGF0aW9uRGlzcGxheUlkOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgYSBjb2xsZWN0aW9uIG9mIGV4dHJhIHByb3BlcnRpZXMgYWJvdXQgdGhpcyByb3V0ZSB0aGF0IHdlcmUgc3VwcGxpZWQKKyAgICAgICAgICogYnkgaXRzIG1lZGlhIHJvdXRlIHByb3ZpZGVyLCBvciBudWxsIGlmIG5vbmUuCisgICAgICAgICAqLworICAgICAgICBATnVsbGFibGUKKyAgICAgICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbUV4dHJhczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIGFuIGludGVudCBzZW5kZXIgZm9yIGxhdW5jaGluZyBhIHNldHRpbmdzIGFjdGl2aXR5IGZvciB0aGlzCisgICAgICAgICAqIHJvdXRlLgorICAgICAgICAgKi8KKyAgICAgICAgQE51bGxhYmxlCisgICAgICAgIHB1YmxpYyBJbnRlbnRTZW5kZXIgZ2V0U2V0dGluZ3NJbnRlbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVNldHRpbmdzSW50ZW50OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNlbGVjdHMgdGhpcyBtZWRpYSByb3V0ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdCgpIHsKKyAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOworICAgICAgICAgICAgc0dsb2JhbC5zZWxlY3RSb3V0ZSh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJNZWRpYVJvdXRlci5Sb3V0ZUluZm97IHVuaXF1ZUlkPSIgKyBtVW5pcXVlSWQKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBuYW1lPSIgKyBtTmFtZQorICAgICAgICAgICAgICAgICAgICArICIsIGRlc2NyaXB0aW9uPSIgKyBtRGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKyAiLCBpY29uVXJpPSIgKyBtSWNvblVyaQorICAgICAgICAgICAgICAgICAgICArICIsIGVuYWJsZWQ9IiArIG1FbmFibGVkCisgICAgICAgICAgICAgICAgICAgICsgIiwgY29ubmVjdGluZz0iICsgbUNvbm5lY3RpbmcKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBjb25uZWN0aW9uU3RhdGU9IiArIG1Db25uZWN0aW9uU3RhdGUKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBjYW5EaXNjb25uZWN0PSIgKyBtQ2FuRGlzY29ubmVjdAorICAgICAgICAgICAgICAgICAgICArICIsIHBsYXliYWNrVHlwZT0iICsgbVBsYXliYWNrVHlwZQorICAgICAgICAgICAgICAgICAgICArICIsIHBsYXliYWNrU3RyZWFtPSIgKyBtUGxheWJhY2tTdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgKyAiLCBkZXZpY2VUeXBlPSIgKyBtRGV2aWNlVHlwZQorICAgICAgICAgICAgICAgICAgICArICIsIHZvbHVtZUhhbmRsaW5nPSIgKyBtVm9sdW1lSGFuZGxpbmcKKyAgICAgICAgICAgICAgICAgICAgKyAiLCB2b2x1bWU9IiArIG1Wb2x1bWUKKyAgICAgICAgICAgICAgICAgICAgKyAiLCB2b2x1bWVNYXg9IiArIG1Wb2x1bWVNYXgKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBwcmVzZW50YXRpb25EaXNwbGF5SWQ9IiArIG1QcmVzZW50YXRpb25EaXNwbGF5SWQKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBleHRyYXM9IiArIG1FeHRyYXMKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXR0aW5nc0ludGVudD0iICsgbVNldHRpbmdzSW50ZW50CisgICAgICAgICAgICAgICAgICAgICsgIiwgcHJvdmlkZXJQYWNrYWdlTmFtZT0iICsgbVByb3ZpZGVyLmdldFBhY2thZ2VOYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIH0iOworICAgICAgICB9CisKKyAgICAgICAgaW50IG1heWJlVXBkYXRlRGVzY3JpcHRvcihNZWRpYVJvdXRlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7CisgICAgICAgICAgICBpbnQgY2hhbmdlcyA9IDA7CisgICAgICAgICAgICBpZiAobURlc2NyaXB0b3IgIT0gZGVzY3JpcHRvcikgeworICAgICAgICAgICAgICAgIGNoYW5nZXMgPSB1cGRhdGVEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNoYW5nZXM7CisgICAgICAgIH0KKworICAgICAgICBpbnQgdXBkYXRlRGVzY3JpcHRvcihNZWRpYVJvdXRlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7CisgICAgICAgICAgICBpbnQgY2hhbmdlcyA9IDA7CisgICAgICAgICAgICBtRGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7CisgICAgICAgICAgICBpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKCFlcXVhbChtTmFtZSwgZGVzY3JpcHRvci5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIG1OYW1lID0gZGVzY3JpcHRvci5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZXF1YWwobURlc2NyaXB0aW9uLCBkZXNjcmlwdG9yLmdldERlc2NyaXB0aW9uKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIG1EZXNjcmlwdGlvbiA9IGRlc2NyaXB0b3IuZ2V0RGVzY3JpcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFlcXVhbChtSWNvblVyaSwgZGVzY3JpcHRvci5nZXRJY29uVXJpKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIG1JY29uVXJpID0gZGVzY3JpcHRvci5nZXRJY29uVXJpKCk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtRW5hYmxlZCAhPSBkZXNjcmlwdG9yLmlzRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1FbmFibGVkID0gZGVzY3JpcHRvci5pc0VuYWJsZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1Db25uZWN0aW5nICE9IGRlc2NyaXB0b3IuaXNDb25uZWN0aW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3RpbmcgPSBkZXNjcmlwdG9yLmlzQ29ubmVjdGluZygpOworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3Rpb25TdGF0ZSAhPSBkZXNjcmlwdG9yLmdldENvbm5lY3Rpb25TdGF0ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uU3RhdGUgPSBkZXNjcmlwdG9yLmdldENvbm5lY3Rpb25TdGF0ZSgpOworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW1Db250cm9sRmlsdGVycy5lcXVhbHMoZGVzY3JpcHRvci5nZXRDb250cm9sRmlsdGVycygpKSkgeworICAgICAgICAgICAgICAgICAgICBtQ29udHJvbEZpbHRlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xGaWx0ZXJzLmFkZEFsbChkZXNjcmlwdG9yLmdldENvbnRyb2xGaWx0ZXJzKCkpOworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrVHlwZSAhPSBkZXNjcmlwdG9yLmdldFBsYXliYWNrVHlwZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja1R5cGUgPSBkZXNjcmlwdG9yLmdldFBsYXliYWNrVHlwZSgpOworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrU3RyZWFtICE9IGRlc2NyaXB0b3IuZ2V0UGxheWJhY2tTdHJlYW0oKSkgeworICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2tTdHJlYW0gPSBkZXNjcmlwdG9yLmdldFBsYXliYWNrU3RyZWFtKCk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtRGV2aWNlVHlwZSAhPSBkZXNjcmlwdG9yLmdldERldmljZVR5cGUoKSkgeworICAgICAgICAgICAgICAgICAgICBtRGV2aWNlVHlwZSA9IGRlc2NyaXB0b3IuZ2V0RGV2aWNlVHlwZSgpOworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobVZvbHVtZUhhbmRsaW5nICE9IGRlc2NyaXB0b3IuZ2V0Vm9sdW1lSGFuZGxpbmcoKSkgeworICAgICAgICAgICAgICAgICAgICBtVm9sdW1lSGFuZGxpbmcgPSBkZXNjcmlwdG9yLmdldFZvbHVtZUhhbmRsaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUwgfCBDSEFOR0VfVk9MVU1FOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobVZvbHVtZSAhPSBkZXNjcmlwdG9yLmdldFZvbHVtZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWUgPSBkZXNjcmlwdG9yLmdldFZvbHVtZSgpOworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMIHwgQ0hBTkdFX1ZPTFVNRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1Wb2x1bWVNYXggIT0gZGVzY3JpcHRvci5nZXRWb2x1bWVNYXgoKSkgeworICAgICAgICAgICAgICAgICAgICBtVm9sdW1lTWF4ID0gZGVzY3JpcHRvci5nZXRWb2x1bWVNYXgoKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTCB8IENIQU5HRV9WT0xVTUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtUHJlc2VudGF0aW9uRGlzcGxheUlkICE9IGRlc2NyaXB0b3IuZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbkRpc3BsYXlJZCA9IGRlc2NyaXB0b3IuZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCk7CisgICAgICAgICAgICAgICAgICAgIG1QcmVzZW50YXRpb25EaXNwbGF5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTCB8IENIQU5HRV9QUkVTRU5UQVRJT05fRElTUExBWTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFlcXVhbChtRXh0cmFzLCBkZXNjcmlwdG9yLmdldEV4dHJhcygpKSkgeworICAgICAgICAgICAgICAgICAgICBtRXh0cmFzID0gZGVzY3JpcHRvci5nZXRFeHRyYXMoKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFlcXVhbChtU2V0dGluZ3NJbnRlbnQsIGRlc2NyaXB0b3IuZ2V0U2V0dGluZ3NBY3Rpdml0eSgpKSkgeworICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NJbnRlbnQgPSBkZXNjcmlwdG9yLmdldFNldHRpbmdzQWN0aXZpdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1DYW5EaXNjb25uZWN0ICE9IGRlc2NyaXB0b3IuY2FuRGlzY29ubmVjdEFuZEtlZXBQbGF5aW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhbkRpc2Nvbm5lY3QgPSBkZXNjcmlwdG9yLmNhbkRpc2Nvbm5lY3RBbmRLZWVwUGxheWluZygpOworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMIHwgQ0hBTkdFX1BSRVNFTlRBVElPTl9ESVNQTEFZOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjaGFuZ2VzOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGdldERlc2NyaXB0b3JJZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtRGVzY3JpcHRvcklkOworICAgICAgICB9CisKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCisgICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXIgZ2V0UHJvdmlkZXJJbnN0YW5jZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUHJvdmlkZXIuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5mb3JtYXRpb24gYWJvdXQgYSByb3V0ZSB0aGF0IGNvbnNpc3RzIG9mIG11bHRpcGxlIG90aGVyIHJvdXRlcyBpbiBhIGdyb3VwLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJvdXRlR3JvdXAgZXh0ZW5kcyBSb3V0ZUluZm8geworICAgICAgICBwcml2YXRlIExpc3Q8Um91dGVJbmZvPiBtUm91dGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgUm91dGVHcm91cChQcm92aWRlckluZm8gcHJvdmlkZXIsIFN0cmluZyBkZXNjcmlwdG9ySWQsIFN0cmluZyB1bmlxdWVJZCkgeworICAgICAgICAgICAgc3VwZXIocHJvdmlkZXIsIGRlc2NyaXB0b3JJZCwgdW5pcXVlSWQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiByb3V0ZXMgaW4gdGhpcyBncm91cAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRSb3V0ZUNvdW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG1Sb3V0ZXMuc2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIHJvdXRlIGluIHRoaXMgZ3JvdXAgYXQgdGhlIHNwZWNpZmllZCBpbmRleAorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gaW5kZXggSW5kZXggdG8gZmV0Y2gKKyAgICAgICAgICogQHJldHVybiBUaGUgcm91dGUgYXQgaW5kZXgKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBSb3V0ZUluZm8gZ2V0Um91dGVBdChpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBtUm91dGVzLmdldChpbmRleCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgcm91dGVzIGluIHRoaXMgZ3JvdXAKKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUaGUgbGlzdCBvZiB0aGUgcm91dGVzIGluIHRoaXMgZ3JvdXAKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBMaXN0PFJvdXRlSW5mbz4gZ2V0Um91dGVzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1Sb3V0ZXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihzdXBlci50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgnWycpOworICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVJvdXRlcy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQobVJvdXRlcy5nZXQoaSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2IuYXBwZW5kKCddJyk7CisgICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBpbnQgbWF5YmVVcGRhdGVEZXNjcmlwdG9yKE1lZGlhUm91dGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKG1EZXNjcmlwdG9yICE9IGRlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgICAgICBtRGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7CisgICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gZ3JvdXBNZW1iZXJJZHMgPSBkZXNjcmlwdG9yLmdldEdyb3VwTWVtYmVySWRzKCk7CisgICAgICAgICAgICAgICAgICAgIExpc3Q8Um91dGVJbmZvPiByb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IGdyb3VwTWVtYmVySWRzLnNpemUoKSAhPSBtUm91dGVzLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZ3JvdXBNZW1iZXJJZCA6IGdyb3VwTWVtYmVySWRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdW5pcXVlSWQgPSBzR2xvYmFsLmdldFVuaXF1ZUlkKGdldFByb3ZpZGVyKCksIGdyb3VwTWVtYmVySWQpOworICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVJbmZvIGdyb3VwTWVtYmVyID0gc0dsb2JhbC5nZXRSb3V0ZSh1bmlxdWVJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBNZW1iZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlcy5hZGQoZ3JvdXBNZW1iZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hhbmdlZCAmJiAhbVJvdXRlcy5jb250YWlucyhncm91cE1lbWJlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVzID0gcm91dGVzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIChjaGFuZ2VkID8gQ0hBTkdFX0dFTkVSQUwgOiAwKSB8IHN1cGVyLnVwZGF0ZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgb2JqZWN0IG1heSBiZSB1c2VkIHRvIGRldGVybWluZSB3aGljaCBtZWRpYSByb3V0ZSBwcm92aWRlciBoYXMKKyAgICAgKiBwdWJsaXNoZWQgYSBwYXJ0aWN1bGFyIHJvdXRlLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByb3ZpZGVySW5mbyB7CisgICAgICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZVByb3ZpZGVyIG1Qcm92aWRlckluc3RhbmNlOworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8Um91dGVJbmZvPiBtUm91dGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlck1ldGFkYXRhIG1NZXRhZGF0YTsKKyAgICAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIG1EZXNjcmlwdG9yOworICAgICAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzb3VyY2VzOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVJlc291cmNlc05vdEF2YWlsYWJsZTsKKworICAgICAgICBQcm92aWRlckluZm8oTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyKSB7CisgICAgICAgICAgICBtUHJvdmlkZXJJbnN0YW5jZSA9IHByb3ZpZGVyOworICAgICAgICAgICAgbU1ldGFkYXRhID0gcHJvdmlkZXIuZ2V0TWV0YWRhdGEoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBwcm92aWRlcidzIHVuZGVybHlpbmcge0BsaW5rIE1lZGlhUm91dGVQcm92aWRlcn0gaW5zdGFuY2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZVByb3ZpZGVyIGdldFByb3ZpZGVySW5zdGFuY2UoKSB7CisgICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKKyAgICAgICAgICAgIHJldHVybiBtUHJvdmlkZXJJbnN0YW5jZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtTWV0YWRhdGEuZ2V0UGFja2FnZU5hbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBjb21wb25lbnQgbmFtZSBvZiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ29tcG9uZW50TmFtZSBnZXRDb21wb25lbnROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG1NZXRhZGF0YS5nZXRDb21wb25lbnROYW1lKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZXN9IHB1Ymxpc2hlZCBieSB0aGlzIHJvdXRlIHByb3ZpZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIExpc3Q8Um91dGVJbmZvPiBnZXRSb3V0ZXMoKSB7CisgICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKKyAgICAgICAgICAgIHJldHVybiBtUm91dGVzOworICAgICAgICB9CisKKyAgICAgICAgUmVzb3VyY2VzIGdldFJlc291cmNlcygpIHsKKyAgICAgICAgICAgIGlmIChtUmVzb3VyY2VzID09IG51bGwgJiYgIW1SZXNvdXJjZXNOb3RBdmFpbGFibGUpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRQYWNrYWdlTmFtZSgpOworICAgICAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IHNHbG9iYWwuZ2V0UHJvdmlkZXJDb250ZXh0KHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMgPSBjb250ZXh0LmdldFJlc291cmNlcygpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlVuYWJsZSB0byBvYnRhaW4gcmVzb3VyY2VzIGZvciByb3V0ZSBwcm92aWRlciBwYWNrYWdlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXNOb3RBdmFpbGFibGUgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtUmVzb3VyY2VzOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiB1cGRhdGVEZXNjcmlwdG9yKE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworICAgICAgICAgICAgaWYgKG1EZXNjcmlwdG9yICE9IGRlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgICAgICBtRGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpbnQgZmluZFJvdXRlQnlEZXNjcmlwdG9ySWQoU3RyaW5nIGlkKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUm91dGVzLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChtUm91dGVzLmdldChpKS5tRGVzY3JpcHRvcklkLmVxdWFscyhpZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIk1lZGlhUm91dGVyLlJvdXRlUHJvdmlkZXJJbmZveyBwYWNrYWdlTmFtZT0iICsgZ2V0UGFja2FnZU5hbWUoKQorICAgICAgICAgICAgICAgICAgICArICIgfSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgZm9yIHJlY2VpdmluZyBldmVudHMgYWJvdXQgbWVkaWEgcm91dGluZyBjaGFuZ2VzLgorICAgICAqIEFsbCBtZXRob2RzIG9mIHRoaXMgaW50ZXJmYWNlIHdpbGwgYmUgY2FsbGVkIGZyb20gdGhlIGFwcGxpY2F0aW9uJ3MgbWFpbiB0aHJlYWQuCisgICAgICogPHA+CisgICAgICogQSBDYWxsYmFjayB3aWxsIG9ubHkgcmVjZWl2ZSBldmVudHMgcmVsZXZhbnQgdG8gcm91dGVzIHRoYXQgdGhlIGNhbGxiYWNrCisgICAgICogd2FzIHJlZ2lzdGVyZWQgZm9yIHVubGVzcyB0aGUge0BsaW5rIE1lZGlhUm91dGVyI0NBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFN9CisgICAgICogZmxhZyB3YXMgc3BlY2lmaWVkIGluIHtAbGluayBNZWRpYVJvdXRlciNhZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3IsIENhbGxiYWNrLCBpbnQpfS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAc2VlIE1lZGlhUm91dGVyI2FkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciwgQ2FsbGJhY2ssIGludCkKKyAgICAgKiBAc2VlIE1lZGlhUm91dGVyI3JlbW92ZUNhbGxiYWNrKENhbGxiYWNrKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ2FsbGJhY2sgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHN1cHBsaWVkIG1lZGlhIHJvdXRlIGJlY29tZXMgc2VsZWN0ZWQgYXMgdGhlIGFjdGl2ZSByb3V0ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCisgICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdGhhdCBoYXMgYmVlbiBzZWxlY3RlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVTZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBzdXBwbGllZCBtZWRpYSByb3V0ZSBiZWNvbWVzIHVuc2VsZWN0ZWQgYXMgdGhlIGFjdGl2ZSByb3V0ZS4KKyAgICAgICAgICogRm9yIGRldGFpbGVkIHJlYXNvbiwgb3ZlcnJpZGUge0BsaW5rICNvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciwgUm91dGVJbmZvLCBpbnQpfQorICAgICAgICAgKiBpbnN0ZWFkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KKyAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0aGF0IGhhcyBiZWVuIHVuc2VsZWN0ZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBzdXBwbGllZCBtZWRpYSByb3V0ZSBiZWNvbWVzIHVuc2VsZWN0ZWQgYXMgdGhlIGFjdGl2ZSByb3V0ZS4KKyAgICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY2FsbHMge0BsaW5rICNvblJvdXRlVW5zZWxlY3RlZH0uCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgcmVhc29uIHByb3ZpZGVkIHdpbGwgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAqIDx1bD4KKyAgICAgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fVU5LTk9XTn08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9ESVNDT05ORUNURUR9PC9saT4KKyAgICAgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fU1RPUFBFRH08L2xpPgorICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9ST1VURV9DSEFOR0VEfTwvbGk+CisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgorICAgICAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRoYXQgaGFzIGJlZW4gdW5zZWxlY3RlZC4KKyAgICAgICAgICogQHBhcmFtIHJlYXNvbiBUaGUgcmVhc29uIGZvciB1bnNlbGVjdGluZyB0aGUgcm91dGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSwgaW50IHJlYXNvbikgeworICAgICAgICAgICAgb25Sb3V0ZVVuc2VsZWN0ZWQocm91dGVyLCByb3V0ZSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSByb3V0ZSBoYXMgYmVlbiBhZGRlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCisgICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdGhhdCBoYXMgYmVjb21lIGF2YWlsYWJsZSBmb3IgdXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUFkZGVkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSByb3V0ZSBoYXMgYmVlbiByZW1vdmVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KKyAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBhdmFpbGFiaWxpdHkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGEgcHJvcGVydHkgb2YgdGhlIGluZGljYXRlZCBtZWRpYSByb3V0ZSBoYXMgY2hhbmdlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCisgICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdGhhdCB3YXMgY2hhbmdlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSByb3V0ZSdzIHZvbHVtZSBjaGFuZ2VzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KKyAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB3aG9zZSB2b2x1bWUgY2hhbmdlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVWb2x1bWVDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSByb3V0ZSdzIHByZXNlbnRhdGlvbiBkaXNwbGF5IGNoYW5nZXMuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIHJvdXRlJ3MgcHJlc2VudGF0aW9uIGRpc3BsYXkgYmVjb21lcworICAgICAgICAgKiBhdmFpbGFibGUsIGlzIHJlbW92ZWQgb3IgaGFzIGNoYW5nZXMgdG8gc29tZSBvZiBpdHMgcHJvcGVydGllcyAoc3VjaCBhcyBpdHMgc2l6ZSkuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCisgICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgd2hvc2UgcHJlc2VudGF0aW9uIGRpc3BsYXkgY2hhbmdlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSBSb3V0ZUluZm8jZ2V0UHJlc2VudGF0aW9uRGlzcGxheSgpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUHJlc2VudGF0aW9uRGlzcGxheUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBSb3V0ZUluZm8gcm91dGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGhhcyBiZWVuIGFkZGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KKyAgICAgICAgICogQHBhcmFtIHByb3ZpZGVyIFRoZSBwcm92aWRlciB0aGF0IGhhcyBiZWNvbWUgYXZhaWxhYmxlIGZvciB1c2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyQWRkZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBQcm92aWRlckluZm8gcHJvdmlkZXIpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGhhcyBiZWVuIHJlbW92ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgorICAgICAgICAgKiBAcGFyYW0gcHJvdmlkZXIgVGhlIHByb3ZpZGVyIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIGF2YWlsYWJpbGl0eS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJSZW1vdmVkKE1lZGlhUm91dGVyIHJvdXRlciwgUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBwcm9wZXJ0eSBvZiB0aGUgaW5kaWNhdGVkIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGhhcyBjaGFuZ2VkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KKyAgICAgICAgICogQHBhcmFtIHByb3ZpZGVyIFRoZSBwcm92aWRlciB0aGF0IHdhcyBjaGFuZ2VkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBQcm92aWRlckluZm8gcHJvdmlkZXIpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxiYWNrIHdoaWNoIGlzIGludm9rZWQgd2l0aCB0aGUgcmVzdWx0IG9mIGEgbWVkaWEgY29udHJvbCByZXF1ZXN0LgorICAgICAqCisgICAgICogQHNlZSBSb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDb250cm9sUmVxdWVzdENhbGxiYWNrIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgY29udHJvbCByZXF1ZXN0IHN1Y2NlZWRzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZGF0YSBSZXN1bHQgZGF0YSwgb3IgbnVsbCBpZiBub25lLgorICAgICAgICAgKiBDb250ZW50cyBkZXBlbmQgb24gdGhlIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBhY3Rpb259LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIGNvbnRyb2wgcmVxdWVzdCBmYWlscy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGVycm9yIEEgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2Ugd2hpY2ggbWF5IGJlIHNob3duIHRvIHRoZSB1c2VyLCBvciBudWxsCisgICAgICAgICAqIGlmIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgaXMgdW5jbGVhci4KKyAgICAgICAgICogQHBhcmFtIGRhdGEgRXJyb3IgZGF0YSwgb3IgbnVsbCBpZiBub25lLgorICAgICAgICAgKiBDb250ZW50cyBkZXBlbmQgb24gdGhlIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBhY3Rpb259LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihTdHJpbmcgZXJyb3IsIEJ1bmRsZSBkYXRhKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBDYWxsYmFja1JlY29yZCB7CisgICAgICAgIHB1YmxpYyBmaW5hbCBNZWRpYVJvdXRlciBtUm91dGVyOworICAgICAgICBwdWJsaWMgZmluYWwgQ2FsbGJhY2sgbUNhbGxiYWNrOworICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvcjsKKyAgICAgICAgcHVibGljIGludCBtRmxhZ3M7CisKKyAgICAgICAgcHVibGljIENhbGxiYWNrUmVjb3JkKE1lZGlhUm91dGVyIHJvdXRlciwgQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIG1Sb3V0ZXIgPSByb3V0ZXI7CisgICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGZpbHRlclJvdXRlRXZlbnQoUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgICAgICByZXR1cm4gKG1GbGFncyAmIENBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFMpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgfHwgcm91dGUubWF0Y2hlc1NlbGVjdG9yKG1TZWxlY3Rvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHbG9iYWwgc3RhdGUgZm9yIHRoZSBtZWRpYSByb3V0ZXIuCisgICAgICogPHA+CisgICAgICogTWVkaWEgcm91dGVzIGFuZCBtZWRpYSByb3V0ZSBwcm92aWRlcnMgYXJlIGdsb2JhbCB0byB0aGUgcHJvY2VzczsgdGhlaXIKKyAgICAgKiBzdGF0ZSBhbmQgdGhlIGJ1bGsgb2YgdGhlIG1lZGlhIHJvdXRlciBpbXBsZW1lbnRhdGlvbiBsaXZlcyBoZXJlLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBHbG9iYWxNZWRpYVJvdXRlcgorICAgICAgICAgICAgaW1wbGVtZW50cyBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuU3luY0NhbGxiYWNrLAorICAgICAgICAgICAgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcldhdGNoZXIuQ2FsbGJhY2sgeworICAgICAgICBmaW5hbCBDb250ZXh0IG1BcHBsaWNhdGlvbkNvbnRleHQ7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVyPj4gbVJvdXRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8Um91dGVJbmZvPiBtUm91dGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgTWFwPFBhaXI8U3RyaW5nLCBTdHJpbmc+LCBTdHJpbmc+IG1VbmlxdWVJZE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8UHJvdmlkZXJJbmZvPiBtUHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQ+IG1SZW1vdGVDb250cm9sQ2xpZW50cyA9CisgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZpbmFsIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQuUGxheWJhY2tJbmZvIG1QbGF5YmFja0luZm8gPQorICAgICAgICAgICAgICAgIG5ldyBSZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0LlBsYXliYWNrSW5mbygpOworICAgICAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyQ2FsbGJhY2sgbVByb3ZpZGVyQ2FsbGJhY2sgPSBuZXcgUHJvdmlkZXJDYWxsYmFjaygpOworICAgICAgICBmaW5hbCBDYWxsYmFja0hhbmRsZXIgbUNhbGxiYWNrSGFuZGxlciA9IG5ldyBDYWxsYmFja0hhbmRsZXIoKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBEaXNwbGF5TWFuYWdlckNvbXBhdCBtRGlzcGxheU1hbmFnZXI7CisgICAgICAgIGZpbmFsIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlciBtU3lzdGVtUHJvdmlkZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtTG93UmFtOworCisgICAgICAgIHByaXZhdGUgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcldhdGNoZXIgbVJlZ2lzdGVyZWRQcm92aWRlcldhdGNoZXI7CisgICAgICAgIHByaXZhdGUgUm91dGVJbmZvIG1EZWZhdWx0Um91dGU7CisgICAgICAgIHByaXZhdGUgUm91dGVJbmZvIG1CbHVldG9vdGhSb3V0ZTsKKyAgICAgICAgUm91dGVJbmZvIG1TZWxlY3RlZFJvdXRlOworICAgICAgICBwcml2YXRlIFJvdXRlQ29udHJvbGxlciBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXI7CisgICAgICAgIC8vIEEgbWFwIGZyb20gcm91dGUgZGVzY3JpcHRvciBJRCB0byBSb3V0ZUNvbnRyb2xsZXIgZm9yIHRoZSBtZW1iZXIgcm91dGVzIGluIHRoZSBjdXJyZW50bHkKKyAgICAgICAgLy8gc2VsZWN0ZWQgcm91dGUgZ3JvdXAuCisgICAgICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgUm91dGVDb250cm9sbGVyPiBtUm91dGVDb250cm9sbGVyTWFwID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBwcml2YXRlIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IG1EaXNjb3ZlcnlSZXF1ZXN0OworICAgICAgICBwcml2YXRlIE1lZGlhU2Vzc2lvblJlY29yZCBtTWVkaWFTZXNzaW9uOworICAgICAgICBNZWRpYVNlc3Npb25Db21wYXQgbVJjY01lZGlhU2Vzc2lvbjsKKyAgICAgICAgcHJpdmF0ZSBNZWRpYVNlc3Npb25Db21wYXQgbUNvbXBhdFNlc3Npb247CisgICAgICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uQ29tcGF0Lk9uQWN0aXZlQ2hhbmdlTGlzdGVuZXIgbVNlc3Npb25BY3RpdmVMaXN0ZW5lciA9CisgICAgICAgICAgICAgICAgbmV3IE1lZGlhU2Vzc2lvbkNvbXBhdC5PbkFjdGl2ZUNoYW5nZUxpc3RlbmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFjdGl2ZUNoYW5nZWQoKSB7CisgICAgICAgICAgICAgICAgaWYobVJjY01lZGlhU2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtUmNjTWVkaWFTZXNzaW9uLmlzQWN0aXZlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlbW90ZUNvbnRyb2xDbGllbnQobVJjY01lZGlhU2Vzc2lvbi5nZXRSZW1vdGVDb250cm9sQ2xpZW50KCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUmVtb3RlQ29udHJvbENsaWVudChtUmNjTWVkaWFTZXNzaW9uLmdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgR2xvYmFsTWVkaWFSb3V0ZXIoQ29udGV4dCBhcHBsaWNhdGlvbkNvbnRleHQpIHsKKyAgICAgICAgICAgIG1BcHBsaWNhdGlvbkNvbnRleHQgPSBhcHBsaWNhdGlvbkNvbnRleHQ7CisgICAgICAgICAgICBtRGlzcGxheU1hbmFnZXIgPSBEaXNwbGF5TWFuYWdlckNvbXBhdC5nZXRJbnN0YW5jZShhcHBsaWNhdGlvbkNvbnRleHQpOworICAgICAgICAgICAgbUxvd1JhbSA9IEFjdGl2aXR5TWFuYWdlckNvbXBhdC5pc0xvd1JhbURldmljZSgKKyAgICAgICAgICAgICAgICAgICAgKEFjdGl2aXR5TWFuYWdlcilhcHBsaWNhdGlvbkNvbnRleHQuZ2V0U3lzdGVtU2VydmljZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LkFDVElWSVRZX1NFUlZJQ0UpKTsKKworICAgICAgICAgICAgLy8gQWRkIHRoZSBzeXN0ZW0gbWVkaWEgcm91dGUgcHJvdmlkZXIgZm9yIGludGVyb3BlcmF0aW5nIHdpdGgKKyAgICAgICAgICAgIC8vIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyLiAgVGhpcyBvbmUgaXMgc3BlY2lhbCBhbmQgcmVjZWl2ZXMKKyAgICAgICAgICAgIC8vIHN5bmNocm9uaXphdGlvbiBtZXNzYWdlcyBmcm9tIHRoZSBtZWRpYSByb3V0ZXIuCisgICAgICAgICAgICBtU3lzdGVtUHJvdmlkZXIgPSBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIub2J0YWluKGFwcGxpY2F0aW9uQ29udGV4dCwgdGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgICAgIGFkZFByb3ZpZGVyKG1TeXN0ZW1Qcm92aWRlcik7CisKKyAgICAgICAgICAgIC8vIFN0YXJ0IHdhdGNoaW5nIGZvciByb3V0ZXMgcHVibGlzaGVkIGJ5IHJlZ2lzdGVyZWQgbWVkaWEgcm91dGUKKyAgICAgICAgICAgIC8vIHByb3ZpZGVyIHNlcnZpY2VzLgorICAgICAgICAgICAgbVJlZ2lzdGVyZWRQcm92aWRlcldhdGNoZXIgPSBuZXcgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcldhdGNoZXIoCisgICAgICAgICAgICAgICAgICAgIG1BcHBsaWNhdGlvbkNvbnRleHQsIHRoaXMpOworICAgICAgICAgICAgbVJlZ2lzdGVyZWRQcm92aWRlcldhdGNoZXIuc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlciBnZXRSb3V0ZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBNZWRpYVJvdXRlciByb3V0ZXI7CisgICAgICAgICAgICBmb3IgKGludCBpID0gbVJvdXRlcnMuc2l6ZSgpOyAtLWkgPj0gMDsgKSB7CisgICAgICAgICAgICAgICAgcm91dGVyID0gbVJvdXRlcnMuZ2V0KGkpLmdldCgpOworICAgICAgICAgICAgICAgIGlmIChyb3V0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtUm91dGVycy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3V0ZXIubUNvbnRleHQgPT0gY29udGV4dCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm91dGVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJvdXRlciA9IG5ldyBNZWRpYVJvdXRlcihjb250ZXh0KTsKKyAgICAgICAgICAgIG1Sb3V0ZXJzLmFkZChuZXcgV2Vha1JlZmVyZW5jZTxNZWRpYVJvdXRlcj4ocm91dGVyKSk7CisgICAgICAgICAgICByZXR1cm4gcm91dGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbnRlbnRSZXNvbHZlciBnZXRDb250ZW50UmVzb2x2ZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbUFwcGxpY2F0aW9uQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb250ZXh0IGdldFByb3ZpZGVyQ29udGV4dChTdHJpbmcgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZS5lcXVhbHMoU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyLlBBQ0tBR0VfTkFNRSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUFwcGxpY2F0aW9uQ29udGV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1BcHBsaWNhdGlvbkNvbnRleHQuY3JlYXRlUGFja2FnZUNvbnRleHQoCisgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwgQ29udGV4dC5DT05URVhUX1JFU1RSSUNURUQpOworICAgICAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRGlzcGxheSBnZXREaXNwbGF5KGludCBkaXNwbGF5SWQpIHsKKyAgICAgICAgICAgIHJldHVybiBtRGlzcGxheU1hbmFnZXIuZ2V0RGlzcGxheShkaXNwbGF5SWQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2VuZENvbnRyb2xSZXF1ZXN0KFJvdXRlSW5mbyByb3V0ZSwKKyAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50LCBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBpZiAocm91dGUgPT0gbVNlbGVjdGVkUm91dGUgJiYgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGVDb250cm9sbGVyLm9uQ29udHJvbFJlcXVlc3QoaW50ZW50LCBjYWxsYmFjaykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2FsbGJhY2sub25FcnJvcihudWxsLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RTZXRWb2x1bWUoUm91dGVJbmZvIHJvdXRlLCBpbnQgdm9sdW1lKSB7CisgICAgICAgICAgICBpZiAocm91dGUgPT0gbVNlbGVjdGVkUm91dGUgJiYgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIub25TZXRWb2x1bWUodm9sdW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1Sb3V0ZUNvbnRyb2xsZXJNYXAuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBtUm91dGVDb250cm9sbGVyTWFwLmdldChyb3V0ZS5tRGVzY3JpcHRvcklkKTsKKyAgICAgICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25TZXRWb2x1bWUodm9sdW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0VXBkYXRlVm9sdW1lKFJvdXRlSW5mbyByb3V0ZSwgaW50IGRlbHRhKSB7CisgICAgICAgICAgICBpZiAocm91dGUgPT0gbVNlbGVjdGVkUm91dGUgJiYgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIub25VcGRhdGVWb2x1bWUoZGVsdGEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJvdXRlSW5mbyBnZXRSb3V0ZShTdHJpbmcgdW5pcXVlSWQpIHsKKyAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIGluZm8gOiBtUm91dGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKGluZm8ubVVuaXF1ZUlkLmVxdWFscyh1bmlxdWVJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZm87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTGlzdDxSb3V0ZUluZm8+IGdldFJvdXRlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBtUm91dGVzOworICAgICAgICB9CisKKyAgICAgICAgTGlzdDxQcm92aWRlckluZm8+IGdldFByb3ZpZGVycygpIHsKKyAgICAgICAgICAgIHJldHVybiBtUHJvdmlkZXJzOworICAgICAgICB9CisKKyAgICAgICAgQE5vbk51bGwgUm91dGVJbmZvIGdldERlZmF1bHRSb3V0ZSgpIHsKKyAgICAgICAgICAgIGlmIChtRGVmYXVsdFJvdXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gb25jZSB0aGUgbWVkaWEgcm91dGVyIGhhcyBiZWVuIGZ1bGx5CisgICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZWQgYnV0IGl0IGlzIGdvb2QgdG8gY2hlY2sgZm9yIHRoZSBlcnJvciBpbiBjYXNlIHRoZXJlCisgICAgICAgICAgICAgICAgLy8gaXMgYSBidWcgaW4gcHJvdmlkZXIgaW5pdGlhbGl6YXRpb24uCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlcmUgaXMgbm8gZGVmYXVsdCByb3V0ZS4gICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIlRoZSBtZWRpYSByb3V0ZXIgaGFzIG5vdCB5ZXQgYmVlbiBmdWxseSBpbml0aWFsaXplZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtRGVmYXVsdFJvdXRlOworICAgICAgICB9CisKKyAgICAgICAgUm91dGVJbmZvIGdldEJsdWV0b290aFJvdXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1CbHVldG9vdGhSb3V0ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBOb25OdWxsIFJvdXRlSW5mbyBnZXRTZWxlY3RlZFJvdXRlKCkgeworICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gb25jZSB0aGUgbWVkaWEgcm91dGVyIGhhcyBiZWVuIGZ1bGx5CisgICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZWQgYnV0IGl0IGlzIGdvb2QgdG8gY2hlY2sgZm9yIHRoZSBlcnJvciBpbiBjYXNlIHRoZXJlCisgICAgICAgICAgICAgICAgLy8gaXMgYSBidWcgaW4gcHJvdmlkZXIgaW5pdGlhbGl6YXRpb24uCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlcmUgaXMgbm8gY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlLiAgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiVGhlIG1lZGlhIHJvdXRlciBoYXMgbm90IHlldCBiZWVuIGZ1bGx5IGluaXRpYWxpemVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1TZWxlY3RlZFJvdXRlOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZWxlY3RSb3V0ZShATm9uTnVsbCBSb3V0ZUluZm8gcm91dGUpIHsKKyAgICAgICAgICAgIHNlbGVjdFJvdXRlKHJvdXRlLCBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fUk9VVEVfQ0hBTkdFRCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNlbGVjdFJvdXRlKEBOb25OdWxsIFJvdXRlSW5mbyByb3V0ZSwgaW50IHVuc2VsZWN0UmVhc29uKSB7CisgICAgICAgICAgICBpZiAoIW1Sb3V0ZXMuY29udGFpbnMocm91dGUpKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSWdub3JpbmcgYXR0ZW1wdCB0byBzZWxlY3QgcmVtb3ZlZCByb3V0ZTogIiArIHJvdXRlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXJvdXRlLm1FbmFibGVkKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSWdub3JpbmcgYXR0ZW1wdCB0byBzZWxlY3QgZGlzYWJsZWQgcm91dGU6ICIgKyByb3V0ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0U2VsZWN0ZWRSb3V0ZUludGVybmFsKHJvdXRlLCB1bnNlbGVjdFJlYXNvbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JvdXRlQXZhaWxhYmxlKE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciwgaW50IGZsYWdzKSB7CisgICAgICAgICAgICBpZiAoc2VsZWN0b3IuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBPbiBsb3ctUkFNIGRldmljZXMsIGRvIG5vdCByZWx5IG9uIGFjdHVhbCBkaXNjb3ZlcnkgcmVzdWx0cyB1bmxlc3MgYXNrZWQgdG8uCisgICAgICAgICAgICBpZiAoKGZsYWdzICYgQVZBSUxBQklMSVRZX0ZMQUdfUkVRVUlSRV9NQVRDSCkgPT0gMCAmJiBtTG93UmFtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgYW55IGV4aXN0aW5nIHJvdXRlcyBtYXRjaCB0aGUgc2VsZWN0b3IuCisgICAgICAgICAgICBmaW5hbCBpbnQgcm91dGVDb3VudCA9IG1Sb3V0ZXMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3V0ZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBtUm91dGVzLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgQVZBSUxBQklMSVRZX0ZMQUdfSUdOT1JFX0RFRkFVTFRfUk9VVEUpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHJvdXRlLmlzRGVmYXVsdE9yQmx1ZXRvb3RoKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyb3V0ZS5tYXRjaGVzU2VsZWN0b3Ioc2VsZWN0b3IpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSXQgZG9lc24ndCBsb29rIGxpa2Ugd2UgY2FuIGZpbmQgYSBtYXRjaGluZyByb3V0ZSByaWdodCBub3cuCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVEaXNjb3ZlcnlSZXF1ZXN0KCkgeworICAgICAgICAgICAgLy8gQ29tYmluZSBhbGwgb2YgdGhlIGNhbGxiYWNrIHNlbGVjdG9ycyBhbmQgYWN0aXZlIHNjYW4gZmxhZ3MuCisgICAgICAgICAgICBib29sZWFuIGRpc2NvdmVyID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIGFjdGl2ZVNjYW4gPSBmYWxzZTsKKyAgICAgICAgICAgIE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUm91dGVycy5zaXplKCk7IC0taSA+PSAwOyApIHsKKyAgICAgICAgICAgICAgICBNZWRpYVJvdXRlciByb3V0ZXIgPSBtUm91dGVycy5nZXQoaSkuZ2V0KCk7CisgICAgICAgICAgICAgICAgaWYgKHJvdXRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJzLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSByb3V0ZXIubUNhbGxiYWNrUmVjb3Jkcy5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY291bnQ7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2tSZWNvcmQgY2FsbGJhY2sgPSByb3V0ZXIubUNhbGxiYWNrUmVjb3Jkcy5nZXQoaik7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZFNlbGVjdG9yKGNhbGxiYWNrLm1TZWxlY3Rvcik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGNhbGxiYWNrLm1GbGFncyAmIENBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTikgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNjYW4gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdmVyID0gdHJ1ZTsgLy8gcGVyZm9ybSBhY3RpdmUgc2NhbiBpbXBsaWVzIHJlcXVlc3QgZGlzY292ZXJ5CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGNhbGxiYWNrLm1GbGFncyAmIENBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1Mb3dSYW0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY292ZXIgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoY2FsbGJhY2subUZsYWdzICYgQ0FMTEJBQ0tfRkxBR19GT1JDRV9ESVNDT1ZFUlkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3ZlciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IgPSBkaXNjb3ZlciA/IGJ1aWxkZXIuYnVpbGQoKSA6IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKKworICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGRpc2NvdmVyeSByZXF1ZXN0LgorICAgICAgICAgICAgaWYgKG1EaXNjb3ZlcnlSZXF1ZXN0ICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgbURpc2NvdmVyeVJlcXVlc3QuZ2V0U2VsZWN0b3IoKS5lcXVhbHMoc2VsZWN0b3IpCisgICAgICAgICAgICAgICAgICAgICYmIG1EaXNjb3ZlcnlSZXF1ZXN0LmlzQWN0aXZlU2NhbigpID09IGFjdGl2ZVNjYW4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm47IC8vIG5vIGNoYW5nZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNlbGVjdG9yLmlzRW1wdHkoKSAmJiAhYWN0aXZlU2NhbikgeworICAgICAgICAgICAgICAgIC8vIERpc2NvdmVyeSBpcyBub3QgbmVlZGVkLgorICAgICAgICAgICAgICAgIGlmIChtRGlzY292ZXJ5UmVxdWVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gbm8gY2hhbmdlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1EaXNjb3ZlcnlSZXF1ZXN0ID0gbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gRGlzY292ZXJ5IGlzIG5lZWRlZC4KKyAgICAgICAgICAgICAgICBtRGlzY292ZXJ5UmVxdWVzdCA9IG5ldyBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdChzZWxlY3RvciwgYWN0aXZlU2Nhbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJVcGRhdGVkIGRpc2NvdmVyeSByZXF1ZXN0OiAiICsgbURpc2NvdmVyeVJlcXVlc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRpc2NvdmVyICYmICFhY3RpdmVTY2FuICYmIG1Mb3dSYW0pIHsKKyAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJGb3JjaW5nIHBhc3NpdmUgcm91dGUgZGlzY292ZXJ5IG9uIGEgbG93LVJBTSBkZXZpY2UsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgInN5c3RlbSBwZXJmb3JtYW5jZSBtYXkgYmUgYWZmZWN0ZWQuICBQbGVhc2UgY29uc2lkZXIgdXNpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWSBpbnN0ZWFkIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIkNBTExCQUNLX0ZMQUdfRk9SQ0VfRElTQ09WRVJZLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBOb3RpZnkgcHJvdmlkZXJzLgorICAgICAgICAgICAgZmluYWwgaW50IHByb3ZpZGVyQ291bnQgPSBtUHJvdmlkZXJzLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdmlkZXJDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbVByb3ZpZGVycy5nZXQoaSkubVByb3ZpZGVySW5zdGFuY2Uuc2V0RGlzY292ZXJ5UmVxdWVzdChtRGlzY292ZXJ5UmVxdWVzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYWRkUHJvdmlkZXIoTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVySW5zdGFuY2UpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRQcm92aWRlckluZm8ocHJvdmlkZXJJbnN0YW5jZSk7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgLy8gMS4gQWRkIHRoZSBwcm92aWRlciB0byB0aGUgbGlzdC4KKyAgICAgICAgICAgICAgICBQcm92aWRlckluZm8gcHJvdmlkZXIgPSBuZXcgUHJvdmlkZXJJbmZvKHByb3ZpZGVySW5zdGFuY2UpOworICAgICAgICAgICAgICAgIG1Qcm92aWRlcnMuYWRkKHByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUHJvdmlkZXIgYWRkZWQ6ICIgKyBwcm92aWRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1BST1ZJREVSX0FEREVELCBwcm92aWRlcik7CisgICAgICAgICAgICAgICAgLy8gMi4gQ3JlYXRlIHRoZSBwcm92aWRlcidzIGNvbnRlbnRzLgorICAgICAgICAgICAgICAgIHVwZGF0ZVByb3ZpZGVyQ29udGVudHMocHJvdmlkZXIsIHByb3ZpZGVySW5zdGFuY2UuZ2V0RGVzY3JpcHRvcigpKTsKKyAgICAgICAgICAgICAgICAvLyAzLiBSZWdpc3RlciB0aGUgcHJvdmlkZXIgY2FsbGJhY2suCisgICAgICAgICAgICAgICAgcHJvdmlkZXJJbnN0YW5jZS5zZXRDYWxsYmFjayhtUHJvdmlkZXJDYWxsYmFjayk7CisgICAgICAgICAgICAgICAgLy8gNC4gU2V0IHRoZSBkaXNjb3ZlcnkgcmVxdWVzdC4KKyAgICAgICAgICAgICAgICBwcm92aWRlckluc3RhbmNlLnNldERpc2NvdmVyeVJlcXVlc3QobURpc2NvdmVyeVJlcXVlc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3ZpZGVyKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlckluc3RhbmNlKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kUHJvdmlkZXJJbmZvKHByb3ZpZGVySW5zdGFuY2UpOworICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAvLyAxLiBVbnJlZ2lzdGVyIHRoZSBwcm92aWRlciBjYWxsYmFjay4KKyAgICAgICAgICAgICAgICBwcm92aWRlckluc3RhbmNlLnNldENhbGxiYWNrKG51bGwpOworICAgICAgICAgICAgICAgIC8vIDIuIENsZWFyIHRoZSBkaXNjb3ZlcnkgcmVxdWVzdC4KKyAgICAgICAgICAgICAgICBwcm92aWRlckluc3RhbmNlLnNldERpc2NvdmVyeVJlcXVlc3QobnVsbCk7CisgICAgICAgICAgICAgICAgLy8gMy4gRGVsZXRlIHRoZSBwcm92aWRlcidzIGNvbnRlbnRzLgorICAgICAgICAgICAgICAgIFByb3ZpZGVySW5mbyBwcm92aWRlciA9IG1Qcm92aWRlcnMuZ2V0KGluZGV4KTsKKyAgICAgICAgICAgICAgICB1cGRhdGVQcm92aWRlckNvbnRlbnRzKHByb3ZpZGVyLCBudWxsKTsKKyAgICAgICAgICAgICAgICAvLyA0LiBSZW1vdmUgdGhlIHByb3ZpZGVyIGZyb20gdGhlIGxpc3QuCisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlByb3ZpZGVyIHJlbW92ZWQ6ICIgKyBwcm92aWRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1BST1ZJREVSX1JFTU9WRUQsIHByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICBtUHJvdmlkZXJzLnJlbW92ZShpbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHVwZGF0ZVByb3ZpZGVyRGVzY3JpcHRvcihNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRQcm92aWRlckluZm8ocHJvdmlkZXJJbnN0YW5jZSk7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcHJvdmlkZXIncyBjb250ZW50cy4KKyAgICAgICAgICAgICAgICBQcm92aWRlckluZm8gcHJvdmlkZXIgPSBtUHJvdmlkZXJzLmdldChpbmRleCk7CisgICAgICAgICAgICAgICAgdXBkYXRlUHJvdmlkZXJDb250ZW50cyhwcm92aWRlciwgZGVzY3JpcHRvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBmaW5kUHJvdmlkZXJJbmZvKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlckluc3RhbmNlKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUHJvdmlkZXJzLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChtUHJvdmlkZXJzLmdldChpKS5tUHJvdmlkZXJJbnN0YW5jZSA9PSBwcm92aWRlckluc3RhbmNlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQcm92aWRlckNvbnRlbnRzKFByb3ZpZGVySW5mbyBwcm92aWRlciwKKyAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIHByb3ZpZGVyRGVzY3JpcHRvcikgeworICAgICAgICAgICAgaWYgKHByb3ZpZGVyLnVwZGF0ZURlc2NyaXB0b3IocHJvdmlkZXJEZXNjcmlwdG9yKSkgeworICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBhbGwgZXhpc3Rpbmcgcm91dGVzIGFuZCByZW9yZGVyIHRoZW0gdG8gbWF0Y2gKKyAgICAgICAgICAgICAgICAvLyB0aGUgb3JkZXIgb2YgdGhlaXIgZGVzY3JpcHRvcnMuCisgICAgICAgICAgICAgICAgaW50IHRhcmdldEluZGV4ID0gMDsKKyAgICAgICAgICAgICAgICBib29sZWFuIHNlbGVjdGVkUm91dGVEZXNjcmlwdG9yQ2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChwcm92aWRlckRlc2NyaXB0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXJEZXNjcmlwdG9yLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcm91dGVEZXNjcmlwdG9ycyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyRGVzY3JpcHRvci5nZXRSb3V0ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCByb3V0ZUNvdW50ID0gcm91dGVEZXNjcmlwdG9ycy5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGluZyByb3V0ZSBncm91cCdzIGNvbnRlbnRzIHJlcXVpcmVzIGFsbCBtZW1iZXIgcm91dGVzJyBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgZ3JvdXBzIHRvIHRoZSBsaXN0cyBhbmQgdXBkYXRlIHRoZW0gbGF0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFBhaXI8Um91dGVJbmZvLCBNZWRpYVJvdXRlRGVzY3JpcHRvcj4+IGFkZGVkR3JvdXBzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFBhaXI8Um91dGVJbmZvLCBNZWRpYVJvdXRlRGVzY3JpcHRvcj4+IHVwZGF0ZWRHcm91cHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm91dGVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGVEZXNjcmlwdG9yID0gcm91dGVEZXNjcmlwdG9ycy5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gcm91dGVEZXNjcmlwdG9yLmdldElkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHNvdXJjZUluZGV4ID0gcHJvdmlkZXIuZmluZFJvdXRlQnlEZXNjcmlwdG9ySWQoaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMS4gQWRkIHRoZSByb3V0ZSB0byB0aGUgbGlzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVuaXF1ZUlkID0gYXNzaWduUm91dGVVbmlxdWVJZChwcm92aWRlciwgaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzR3JvdXAgPSByb3V0ZURlc2NyaXB0b3IuZ2V0R3JvdXBNZW1iZXJJZHMoKSAhPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBpc0dyb3VwID8gbmV3IFJvdXRlR3JvdXAocHJvdmlkZXIsIGlkLCB1bmlxdWVJZCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSb3V0ZUluZm8ocHJvdmlkZXIsIGlkLCB1bmlxdWVJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLm1Sb3V0ZXMuYWRkKHRhcmdldEluZGV4KyssIHJvdXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlcy5hZGQocm91dGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyLiBDcmVhdGUgdGhlIHJvdXRlJ3MgY29udGVudHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0dyb3VwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZEdyb3Vwcy5hZGQobmV3IFBhaXI8Pihyb3V0ZSwgcm91dGVEZXNjcmlwdG9yKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5tYXliZVVwZGF0ZURlc2NyaXB0b3Iocm91dGVEZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMuIE5vdGlmeSBjbGllbnRzIGFib3V0IGFkZGl0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgYWRkZWQ6ICIgKyByb3V0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoQ2FsbGJhY2tIYW5kbGVyLk1TR19ST1VURV9BRERFRCwgcm91dGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZUluZGV4IDwgdGFyZ2V0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSWdub3Jpbmcgcm91dGUgZGVzY3JpcHRvciB3aXRoIGR1cGxpY2F0ZSBpZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcm91dGVEZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxLiBSZW9yZGVyIHRoZSByb3V0ZSB3aXRoaW4gdGhlIGxpc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IHByb3ZpZGVyLm1Sb3V0ZXMuZ2V0KHNvdXJjZUluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc3dhcChwcm92aWRlci5tUm91dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCsrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi4gVXBkYXRlIHRoZSByb3V0ZSdzIGNvbnRlbnRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGUgaW5zdGFuY2VvZiBSb3V0ZUdyb3VwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkR3JvdXBzLmFkZChuZXcgUGFpcjw+KHJvdXRlLCByb3V0ZURlc2NyaXB0b3IpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMuIE5vdGlmeSBjbGllbnRzIGFib3V0IGNoYW5nZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlUm91dGVEZXNjcmlwdG9yQW5kTm90aWZ5KHJvdXRlLCByb3V0ZURlc2NyaXB0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGUgPT0gbVNlbGVjdGVkUm91dGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSb3V0ZURlc2NyaXB0b3JDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIG5ldyBhbmQvb3IgZXhpc3RpbmcgZ3JvdXBzLgorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChQYWlyPFJvdXRlSW5mbywgTWVkaWFSb3V0ZURlc2NyaXB0b3I+IHBhaXIgOiBhZGRlZEdyb3VwcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IHBhaXIuZmlyc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUubWF5YmVVcGRhdGVEZXNjcmlwdG9yKHBhaXIuc2Vjb25kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgYWRkZWQ6ICIgKyByb3V0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX0FEREVELCByb3V0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFBhaXI8Um91dGVJbmZvLCBNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcGFpciA6IHVwZGF0ZWRHcm91cHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBwYWlyLmZpcnN0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVSb3V0ZURlc2NyaXB0b3JBbmROb3RpZnkocm91dGUsIHBhaXIuc2Vjb25kKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBtU2VsZWN0ZWRSb3V0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSb3V0ZURlc2NyaXB0b3JDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIklnbm9yaW5nIGludmFsaWQgcHJvdmlkZXIgZGVzY3JpcHRvcjogIiArIHByb3ZpZGVyRGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBEaXNwb3NlIGFsbCByZW1haW5pbmcgcm91dGVzIHRoYXQgZG8gbm90IGhhdmUgbWF0Y2hpbmcgZGVzY3JpcHRvcnMuCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHByb3ZpZGVyLm1Sb3V0ZXMuc2l6ZSgpIC0gMTsgaSA+PSB0YXJnZXRJbmRleDsgaS0tKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIDEuIERlbGV0ZSB0aGUgcm91dGUncyBjb250ZW50cy4KKyAgICAgICAgICAgICAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gcHJvdmlkZXIubVJvdXRlcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgIHJvdXRlLm1heWJlVXBkYXRlRGVzY3JpcHRvcihudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gMi4gUmVtb3ZlIHRoZSByb3V0ZSBmcm9tIHRoZSBsaXN0LgorICAgICAgICAgICAgICAgICAgICBtUm91dGVzLnJlbW92ZShyb3V0ZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBzZWxlY3RlZCByb3V0ZSBpZiBuZWVkZWQuCisgICAgICAgICAgICAgICAgdXBkYXRlU2VsZWN0ZWRSb3V0ZUlmTmVlZGVkKHNlbGVjdGVkUm91dGVEZXNjcmlwdG9yQ2hhbmdlZCk7CisKKyAgICAgICAgICAgICAgICAvLyBOb3cgbm90aWZ5IGNsaWVudHMgYWJvdXQgcm91dGVzIHRoYXQgd2VyZSByZW1vdmVkLgorICAgICAgICAgICAgICAgIC8vIFdlIGRvIHRoaXMgYWZ0ZXIgdXBkYXRpbmcgdGhlIHNlbGVjdGVkIHJvdXRlIHRvIGVuc3VyZQorICAgICAgICAgICAgICAgIC8vIHRoYXQgdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIgb2JzZXJ2ZXMgdGhlIG5ldyByb3V0ZQorICAgICAgICAgICAgICAgIC8vIHNlbGVjdGlvbiBiZWZvcmUgdGhlIHJlbW92YWwgc2luY2UgcmVtb3ZpbmcgdGhlIGN1cnJlbnRseQorICAgICAgICAgICAgICAgIC8vIHNlbGVjdGVkIHJvdXRlIG1heSBoYXZlIHNpZGUtZWZmZWN0cy4KKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gcHJvdmlkZXIubVJvdXRlcy5zaXplKCkgLSAxOyBpID49IHRhcmdldEluZGV4OyBpLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gcHJvdmlkZXIubVJvdXRlcy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgcmVtb3ZlZDogIiArIHJvdXRlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoQ2FsbGJhY2tIYW5kbGVyLk1TR19ST1VURV9SRU1PVkVELCByb3V0ZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gTm90aWZ5IHByb3ZpZGVyIGNoYW5nZWQuCisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlByb3ZpZGVyIGNoYW5nZWQ6ICIgKyBwcm92aWRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1BST1ZJREVSX0NIQU5HRUQsIHByb3ZpZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IHVwZGF0ZVJvdXRlRGVzY3JpcHRvckFuZE5vdGlmeShSb3V0ZUluZm8gcm91dGUsCisgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGVEZXNjcmlwdG9yKSB7CisgICAgICAgICAgICBpbnQgY2hhbmdlcyA9IHJvdXRlLm1heWJlVXBkYXRlRGVzY3JpcHRvcihyb3V0ZURlc2NyaXB0b3IpOworICAgICAgICAgICAgaWYgKGNoYW5nZXMgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmICgoY2hhbmdlcyAmIFJvdXRlSW5mby5DSEFOR0VfR0VORVJBTCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIGNoYW5nZWQ6ICIgKyByb3V0ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfQ0hBTkdFRCwgcm91dGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKGNoYW5nZXMgJiBSb3V0ZUluZm8uQ0hBTkdFX1ZPTFVNRSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIHZvbHVtZSBjaGFuZ2VkOiAiICsgcm91dGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX1ZPTFVNRV9DSEFOR0VELCByb3V0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoY2hhbmdlcyAmIFJvdXRlSW5mby5DSEFOR0VfUFJFU0VOVEFUSU9OX0RJU1BMQVkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSBwcmVzZW50YXRpb24gZGlzcGxheSBjaGFuZ2VkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcm91dGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVNHX1JPVVRFX1BSRVNFTlRBVElPTl9ESVNQTEFZX0NIQU5HRUQsIHJvdXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY2hhbmdlczsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGFzc2lnblJvdXRlVW5pcXVlSWQoUHJvdmlkZXJJbmZvIHByb3ZpZGVyLCBTdHJpbmcgcm91dGVEZXNjcmlwdG9ySWQpIHsKKyAgICAgICAgICAgIC8vIEFsdGhvdWdoIHJvdXRlIGRlc2NyaXB0b3IgaWRzIGFyZSB1bmlxdWUgd2l0aGluIGEgcHJvdmlkZXIsIGl0J3MKKyAgICAgICAgICAgIC8vIHBvc3NpYmxlIGZvciB0aGVyZSB0byBiZSB0d28gcHJvdmlkZXJzIHdpdGggdGhlIHNhbWUgcGFja2FnZSBuYW1lLgorICAgICAgICAgICAgLy8gVGhlcmVmb3JlIHdlIG11c3QgZGVkdXBlIHRoZSBjb21wb3NpdGUgaWQuCisgICAgICAgICAgICBTdHJpbmcgY29tcG9uZW50TmFtZSA9IHByb3ZpZGVyLmdldENvbXBvbmVudE5hbWUoKS5mbGF0dGVuVG9TaG9ydFN0cmluZygpOworICAgICAgICAgICAgU3RyaW5nIHVuaXF1ZUlkID0gY29tcG9uZW50TmFtZSArICI6IiArIHJvdXRlRGVzY3JpcHRvcklkOworICAgICAgICAgICAgaWYgKGZpbmRSb3V0ZUJ5VW5pcXVlSWQodW5pcXVlSWQpIDwgMCkgeworICAgICAgICAgICAgICAgIG1VbmlxdWVJZE1hcC5wdXQobmV3IFBhaXI8Pihjb21wb25lbnROYW1lLCByb3V0ZURlc2NyaXB0b3JJZCksIHVuaXF1ZUlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdW5pcXVlSWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMb2cudyhUQUcsICJFaXRoZXIgIiArIHJvdXRlRGVzY3JpcHRvcklkICsgIiBpc24ndCB1bmlxdWUgaW4gIiArIGNvbXBvbmVudE5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiIG9yIHdlJ3JlIHRyeWluZyB0byBhc3NpZ24gYSB1bmlxdWUgSUQgZm9yIGFuIGFscmVhZHkgYWRkZWQgcm91dGUiKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAyOyA7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyBuZXdVbmlxdWVJZCA9IFN0cmluZy5mb3JtYXQoTG9jYWxlLlVTLCAiJXNfJWQiLCB1bmlxdWVJZCwgaSk7CisgICAgICAgICAgICAgICAgaWYgKGZpbmRSb3V0ZUJ5VW5pcXVlSWQobmV3VW5pcXVlSWQpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBtVW5pcXVlSWRNYXAucHV0KG5ldyBQYWlyPD4oY29tcG9uZW50TmFtZSwgcm91dGVEZXNjcmlwdG9ySWQpLCBuZXdVbmlxdWVJZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdVbmlxdWVJZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBmaW5kUm91dGVCeVVuaXF1ZUlkKFN0cmluZyB1bmlxdWVJZCkgeworICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVJvdXRlcy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobVJvdXRlcy5nZXQoaSkubVVuaXF1ZUlkLmVxdWFscyh1bmlxdWVJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VW5pcXVlSWQoUHJvdmlkZXJJbmZvIHByb3ZpZGVyLCBTdHJpbmcgcm91dGVEZXNjcmlwdG9ySWQpIHsKKyAgICAgICAgICAgIFN0cmluZyBjb21wb25lbnROYW1lID0gcHJvdmlkZXIuZ2V0Q29tcG9uZW50TmFtZSgpLmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCk7CisgICAgICAgICAgICByZXR1cm4gbVVuaXF1ZUlkTWFwLmdldChuZXcgUGFpcjw+KGNvbXBvbmVudE5hbWUsIHJvdXRlRGVzY3JpcHRvcklkKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgdXBkYXRlU2VsZWN0ZWRSb3V0ZUlmTmVlZGVkKGJvb2xlYW4gc2VsZWN0ZWRSb3V0ZURlc2NyaXB0b3JDaGFuZ2VkKSB7CisgICAgICAgICAgICAvLyBVcGRhdGUgZGVmYXVsdCByb3V0ZS4KKyAgICAgICAgICAgIGlmIChtRGVmYXVsdFJvdXRlICE9IG51bGwgJiYgIW1EZWZhdWx0Um91dGUuaXNTZWxlY3RhYmxlKCkpIHsKKyAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDbGVhcmluZyB0aGUgZGVmYXVsdCByb3V0ZSBiZWNhdXNlIGl0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImlzIG5vIGxvbmdlciBzZWxlY3RhYmxlOiAiICsgbURlZmF1bHRSb3V0ZSk7CisgICAgICAgICAgICAgICAgbURlZmF1bHRSb3V0ZSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobURlZmF1bHRSb3V0ZSA9PSBudWxsICYmICFtUm91dGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIHJvdXRlIDogbVJvdXRlcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXNTeXN0ZW1EZWZhdWx0Um91dGUocm91dGUpICYmIHJvdXRlLmlzU2VsZWN0YWJsZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRGVmYXVsdFJvdXRlID0gcm91dGU7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJGb3VuZCBkZWZhdWx0IHJvdXRlOiAiICsgbURlZmF1bHRSb3V0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVXBkYXRlIGJsdWV0b290aCByb3V0ZS4KKyAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoUm91dGUgIT0gbnVsbCAmJiAhbUJsdWV0b290aFJvdXRlLmlzU2VsZWN0YWJsZSgpKSB7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ2xlYXJpbmcgdGhlIGJsdWV0b290aCByb3V0ZSBiZWNhdXNlIGl0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImlzIG5vIGxvbmdlciBzZWxlY3RhYmxlOiAiICsgbUJsdWV0b290aFJvdXRlKTsKKyAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoUm91dGUgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhSb3V0ZSA9PSBudWxsICYmICFtUm91dGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIHJvdXRlIDogbVJvdXRlcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXNTeXN0ZW1MaXZlQXVkaW9Pbmx5Um91dGUocm91dGUpICYmIHJvdXRlLmlzU2VsZWN0YWJsZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoUm91dGUgPSByb3V0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkZvdW5kIGJsdWV0b290aCByb3V0ZTogIiArIG1CbHVldG9vdGhSb3V0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVXBkYXRlIHNlbGVjdGVkIHJvdXRlLgorICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlID09IG51bGwgfHwgIW1TZWxlY3RlZFJvdXRlLmlzU2VsZWN0YWJsZSgpKSB7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiVW5zZWxlY3RpbmcgdGhlIGN1cnJlbnQgcm91dGUgYmVjYXVzZSBpdCAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJpcyBubyBsb25nZXIgc2VsZWN0YWJsZTogIiArIG1TZWxlY3RlZFJvdXRlKTsKKyAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZFJvdXRlSW50ZXJuYWwoY2hvb3NlRmFsbGJhY2tSb3V0ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1VOS05PV04pOworICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZFJvdXRlRGVzY3JpcHRvckNoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIHRoZSBzZWxlY3RlZCByb3V0ZSBpcyBhIHJvdXRlIGdyb3VwLCBzZWxlY3QvdW5zZWxlY3Qgcm91dGUgY29udHJvbGxlcnMKKyAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIGFkZGVkL3JlbW92ZWQgcm91dGUgbWVtYmVycy4KKyAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgaW5zdGFuY2VvZiBSb3V0ZUdyb3VwKSB7CisgICAgICAgICAgICAgICAgICAgIExpc3Q8Um91dGVJbmZvPiByb3V0ZXMgPSAoKFJvdXRlR3JvdXApIG1TZWxlY3RlZFJvdXRlKS5nZXRSb3V0ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQnVpbGQgYSBzZXQgb2YgZGVzY3JpcHRvciBJRHMgZm9yIHRoZSBuZXcgcm91dGUgZ3JvdXAuCisgICAgICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IGlkU2V0ID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICAgICAgICAgICAgICBmb3IgKFJvdXRlSW5mbyByb3V0ZSA6IHJvdXRlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWRTZXQuYWRkKHJvdXRlLm1EZXNjcmlwdG9ySWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIFVuc2VsZWN0IHJvdXRlIGNvbnRyb2xsZXJzIGZvciB0aGUgcmVtb3ZlZCByb3V0ZXMuCisgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFJvdXRlQ29udHJvbGxlcj4+IGl0ZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZUNvbnRyb2xsZXJNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxTdHJpbmcsIFJvdXRlQ29udHJvbGxlcj4gZW50cnkgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaWRTZXQuY29udGFpbnMoZW50cnkuZ2V0S2V5KCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25VbnNlbGVjdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25SZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlci5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBTZWxlY3Qgcm91dGUgY29udHJvbGxlcnMgZm9yIHRoZSBhZGRlZCByb3V0ZXMuCisgICAgICAgICAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIHJvdXRlIDogcm91dGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1Sb3V0ZUNvbnRyb2xsZXJNYXAuY29udGFpbnNLZXkocm91dGUubURlc2NyaXB0b3JJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9IHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9uQ3JlYXRlUm91dGVDb250cm9sbGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5tRGVzY3JpcHRvcklkLCBtU2VsZWN0ZWRSb3V0ZS5tRGVzY3JpcHRvcklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uU2VsZWN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlQ29udHJvbGxlck1hcC5wdXQocm91dGUubURlc2NyaXB0b3JJZCwgY29udHJvbGxlcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBwbGF5YmFjayBpbmZvIGJlY2F1c2UgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHJvdXRlIGhhdmUgY2hhbmdlZC4KKyAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja0luZm9Gcm9tU2VsZWN0ZWRSb3V0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgUm91dGVJbmZvIGNob29zZUZhbGxiYWNrUm91dGUoKSB7CisgICAgICAgICAgICAvLyBXaGVuIHRoZSBjdXJyZW50IHJvdXRlIGlzIHJlbW92ZWQgb3Igbm8gbG9uZ2VyIHNlbGVjdGFibGUsCisgICAgICAgICAgICAvLyB3ZSB3YW50IHRvIHJldmVydCB0byBhIGxpdmUgYXVkaW8gcm91dGUgaWYgdGhlcmUgaXMKKyAgICAgICAgICAgIC8vIG9uZSAodXN1YWxseSBCbHVldG9vdGggQTJEUCkuICBGYWlsaW5nIHRoYXQsIHVzZQorICAgICAgICAgICAgLy8gdGhlIGRlZmF1bHQgcm91dGUuCisgICAgICAgICAgICBmb3IgKFJvdXRlSW5mbyByb3V0ZSA6IG1Sb3V0ZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAocm91dGUgIT0gbURlZmF1bHRSb3V0ZQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgaXNTeXN0ZW1MaXZlQXVkaW9Pbmx5Um91dGUocm91dGUpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiByb3V0ZS5pc1NlbGVjdGFibGUoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm91dGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1EZWZhdWx0Um91dGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNTeXN0ZW1MaXZlQXVkaW9Pbmx5Um91dGUoUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgICAgICByZXR1cm4gcm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpID09IG1TeXN0ZW1Qcm92aWRlcgorICAgICAgICAgICAgICAgICAgICAmJiByb3V0ZS5zdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTykKKyAgICAgICAgICAgICAgICAgICAgJiYgIXJvdXRlLnN1cHBvcnRzQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1N5c3RlbURlZmF1bHRSb3V0ZShSb3V0ZUluZm8gcm91dGUpIHsKKyAgICAgICAgICAgIHJldHVybiByb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkgPT0gbVN5c3RlbVByb3ZpZGVyCisgICAgICAgICAgICAgICAgICAgICYmIHJvdXRlLm1EZXNjcmlwdG9ySWQuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlci5ERUZBVUxUX1JPVVRFX0lEKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBzZXRTZWxlY3RlZFJvdXRlSW50ZXJuYWwoQE5vbk51bGwgUm91dGVJbmZvIHJvdXRlLCBpbnQgdW5zZWxlY3RSZWFzb24pIHsKKyAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGUgZm9sbG93aW5nIGxvZ2dpbmcgd2hlbiBubyBsb25nZXIgbmVlZGVkLgorICAgICAgICAgICAgaWYgKHNHbG9iYWwgPT0gbnVsbCB8fCAobUJsdWV0b290aFJvdXRlICE9IG51bGwgJiYgcm91dGUuaXNEZWZhdWx0KCkpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RhY2tUcmFjZUVsZW1lbnRbXSBjYWxsU3RhY2sgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICAvLyBjYWxsU3RhY2tbM10gaXMgdGhlIGNhbGxlciBvZiB0aGlzIG1ldGhvZC4KKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMzsgaSA8IGNhbGxTdGFjay5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBTdGFja1RyYWNlRWxlbWVudCBjYWxsZXIgPSBjYWxsU3RhY2tbaV07CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjYWxsZXIuZ2V0Q2xhc3NOYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiLiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChjYWxsZXIuZ2V0TWV0aG9kTmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIjoiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoY2FsbGVyLmdldExpbmVOdW1iZXIoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc0dsb2JhbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNldFNlbGVjdGVkUm91dGVJbnRlcm5hbCBpcyBjYWxsZWQgd2hpbGUgc0dsb2JhbCBpcyBudWxsOiBwa2dOYW1lPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1BcHBsaWNhdGlvbkNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSArICIsIGNhbGxlcnM9IiArIHNiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkRlZmF1bHQgcm91dGUgaXMgc2VsZWN0ZWQgd2hpbGUgYSBCVCByb3V0ZSBpcyBhdmFpbGFibGU6IHBrZ05hbWU9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUFwcGxpY2F0aW9uQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpICsgIiwgY2FsbGVycz0iICsgc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgIT0gcm91dGUpIHsKKyAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIHVuc2VsZWN0ZWQ6ICIgKyBtU2VsZWN0ZWRSb3V0ZSArICIgcmVhc29uOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdW5zZWxlY3RSZWFzb24pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX1VOU0VMRUNURUQsIG1TZWxlY3RlZFJvdXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2VsZWN0UmVhc29uKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIub25VbnNlbGVjdCh1bnNlbGVjdFJlYXNvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIub25SZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghbVJvdXRlQ29udHJvbGxlck1hcC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgOiBtUm91dGVDb250cm9sbGVyTWFwLnZhbHVlcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblVuc2VsZWN0KHVuc2VsZWN0UmVhc29uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uUmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlQ29udHJvbGxlck1hcC5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGUgPSByb3V0ZTsKKyAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgPSByb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoCisgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5tRGVzY3JpcHRvcklkKTsKKyAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGVDb250cm9sbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyLm9uU2VsZWN0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSBzZWxlY3RlZDogIiArIG1TZWxlY3RlZFJvdXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfU0VMRUNURUQsIG1TZWxlY3RlZFJvdXRlKTsKKworICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSBpbnN0YW5jZW9mIFJvdXRlR3JvdXApIHsKKyAgICAgICAgICAgICAgICAgICAgTGlzdDxSb3V0ZUluZm8+IHJvdXRlcyA9ICgoUm91dGVHcm91cCkgbVNlbGVjdGVkUm91dGUpLmdldFJvdXRlcygpOworICAgICAgICAgICAgICAgICAgICBtUm91dGVDb250cm9sbGVyTWFwLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIHIgOiByb3V0ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5nZXRQcm92aWRlckluc3RhbmNlKCkub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5tRGVzY3JpcHRvcklkLCBtU2VsZWN0ZWRSb3V0ZS5tRGVzY3JpcHRvcklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25TZWxlY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZUNvbnRyb2xsZXJNYXAucHV0KHIubURlc2NyaXB0b3JJZCwgY29udHJvbGxlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja0luZm9Gcm9tU2VsZWN0ZWRSb3V0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3lzdGVtUm91dGVTZWxlY3RlZEJ5RGVzY3JpcHRvcklkKFN0cmluZyBpZCkgeworICAgICAgICAgICAgLy8gU3lzdGVtIHJvdXRlIGlzIHNlbGVjdGVkLCBkbyBub3Qgc3luYyB0aGUgcm91dGUgd2Ugc2VsZWN0ZWQgYmVmb3JlLgorICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX1NFTEVDVEVEKTsKKyAgICAgICAgICAgIGludCBwcm92aWRlckluZGV4ID0gZmluZFByb3ZpZGVySW5mbyhtU3lzdGVtUHJvdmlkZXIpOworICAgICAgICAgICAgaWYgKHByb3ZpZGVySW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIFByb3ZpZGVySW5mbyBwcm92aWRlciA9IG1Qcm92aWRlcnMuZ2V0KHByb3ZpZGVySW5kZXgpOworICAgICAgICAgICAgICAgIGludCByb3V0ZUluZGV4ID0gcHJvdmlkZXIuZmluZFJvdXRlQnlEZXNjcmlwdG9ySWQoaWQpOworICAgICAgICAgICAgICAgIGlmIChyb3V0ZUluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIubVJvdXRlcy5nZXQocm91dGVJbmRleCkuc2VsZWN0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWRkUmVtb3RlQ29udHJvbENsaWVudChPYmplY3QgcmNjKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kUmVtb3RlQ29udHJvbENsaWVudFJlY29yZChyY2MpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQgcmVjb3JkID0gbmV3IFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQocmNjKTsKKyAgICAgICAgICAgICAgICBtUmVtb3RlQ29udHJvbENsaWVudHMuYWRkKHJlY29yZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVSZW1vdGVDb250cm9sQ2xpZW50KE9iamVjdCByY2MpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkKHJjYyk7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQgcmVjb3JkID0gbVJlbW90ZUNvbnRyb2xDbGllbnRzLnJlbW92ZShpbmRleCk7CisgICAgICAgICAgICAgICAgcmVjb3JkLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhU2Vzc2lvbihPYmplY3Qgc2Vzc2lvbikgeworICAgICAgICAgICAgc2V0TWVkaWFTZXNzaW9uUmVjb3JkKHNlc3Npb24gIT0gbnVsbCA/IG5ldyBNZWRpYVNlc3Npb25SZWNvcmQoc2Vzc2lvbikgOiBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhU2Vzc2lvbkNvbXBhdChmaW5hbCBNZWRpYVNlc3Npb25Db21wYXQgc2Vzc2lvbikgeworICAgICAgICAgICAgbUNvbXBhdFNlc3Npb24gPSBzZXNzaW9uOworICAgICAgICAgICAgaWYgKGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IDIxKSB7CisgICAgICAgICAgICAgICAgc2V0TWVkaWFTZXNzaW9uUmVjb3JkKHNlc3Npb24gIT0gbnVsbCA/IG5ldyBNZWRpYVNlc3Npb25SZWNvcmQoc2Vzc2lvbikgOiBudWxsKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMTQpIHsKKyAgICAgICAgICAgICAgICBpZiAobVJjY01lZGlhU2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZVJlbW90ZUNvbnRyb2xDbGllbnQobVJjY01lZGlhU2Vzc2lvbi5nZXRSZW1vdGVDb250cm9sQ2xpZW50KCkpOworICAgICAgICAgICAgICAgICAgICBtUmNjTWVkaWFTZXNzaW9uLnJlbW92ZU9uQWN0aXZlQ2hhbmdlTGlzdGVuZXIobVNlc3Npb25BY3RpdmVMaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1SY2NNZWRpYVNlc3Npb24gPSBzZXNzaW9uOworICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5hZGRPbkFjdGl2ZUNoYW5nZUxpc3RlbmVyKG1TZXNzaW9uQWN0aXZlTGlzdGVuZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbi5pc0FjdGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRSZW1vdGVDb250cm9sQ2xpZW50KHNlc3Npb24uZ2V0UmVtb3RlQ29udHJvbENsaWVudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBzZXRNZWRpYVNlc3Npb25SZWNvcmQoTWVkaWFTZXNzaW9uUmVjb3JkIG1lZGlhU2Vzc2lvblJlY29yZCkgeworICAgICAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uY2xlYXJWb2x1bWVIYW5kbGluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbiA9IG1lZGlhU2Vzc2lvblJlY29yZDsKKyAgICAgICAgICAgIGlmIChtZWRpYVNlc3Npb25SZWNvcmQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrSW5mb0Zyb21TZWxlY3RlZFJvdXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWVkaWFTZXNzaW9uQ29tcGF0LlRva2VuIGdldE1lZGlhU2Vzc2lvblRva2VuKCkgeworICAgICAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtTWVkaWFTZXNzaW9uLmdldFRva2VuKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1Db21wYXRTZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUNvbXBhdFNlc3Npb24uZ2V0U2Vzc2lvblRva2VuKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IGZpbmRSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkKE9iamVjdCByY2MpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1SZW1vdGVDb250cm9sQ2xpZW50cy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkIHJlY29yZCA9IG1SZW1vdGVDb250cm9sQ2xpZW50cy5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKHJlY29yZC5nZXRSZW1vdGVDb250cm9sQ2xpZW50KCkgPT0gcmNjKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQbGF5YmFja0luZm9Gcm9tU2VsZWN0ZWRSb3V0ZSgpIHsKKyAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mby52b2x1bWUgPSBtU2VsZWN0ZWRSb3V0ZS5nZXRWb2x1bWUoKTsKKyAgICAgICAgICAgICAgICBtUGxheWJhY2tJbmZvLnZvbHVtZU1heCA9IG1TZWxlY3RlZFJvdXRlLmdldFZvbHVtZU1heCgpOworICAgICAgICAgICAgICAgIG1QbGF5YmFja0luZm8udm9sdW1lSGFuZGxpbmcgPSBtU2VsZWN0ZWRSb3V0ZS5nZXRWb2x1bWVIYW5kbGluZygpOworICAgICAgICAgICAgICAgIG1QbGF5YmFja0luZm8ucGxheWJhY2tTdHJlYW0gPSBtU2VsZWN0ZWRSb3V0ZS5nZXRQbGF5YmFja1N0cmVhbSgpOworICAgICAgICAgICAgICAgIG1QbGF5YmFja0luZm8ucGxheWJhY2tUeXBlID0gbVNlbGVjdGVkUm91dGUuZ2V0UGxheWJhY2tUeXBlKCk7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUmVtb3RlQ29udHJvbENsaWVudHMuc2l6ZSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkIHJlY29yZCA9IG1SZW1vdGVDb250cm9sQ2xpZW50cy5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgIHJlY29yZC51cGRhdGVQbGF5YmFja0luZm8oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgPT0gZ2V0RGVmYXVsdFJvdXRlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtU2VsZWN0ZWRSb3V0ZSA9PSBnZXRCbHVldG9vdGhSb3V0ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2NhbCByb3V0ZQorICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5jbGVhclZvbHVtZUhhbmRsaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBAVm9sdW1lUHJvdmlkZXJDb21wYXQuQ29udHJvbFR5cGUgaW50IGNvbnRyb2xUeXBlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lUHJvdmlkZXJDb21wYXQuVk9MVU1FX0NPTlRST0xfRklYRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrSW5mby52b2x1bWVIYW5kbGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVk9MVU1FX1ZBUklBQkxFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbFR5cGUgPSBWb2x1bWVQcm92aWRlckNvbXBhdC5WT0xVTUVfQ09OVFJPTF9BQlNPTFVURTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uY29uZmlndXJlVm9sdW1lKGNvbnRyb2xUeXBlLCBtUGxheWJhY2tJbmZvLnZvbHVtZU1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mby52b2x1bWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uY2xlYXJWb2x1bWVIYW5kbGluZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUHJvdmlkZXJDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVQcm92aWRlci5DYWxsYmFjayB7CisgICAgICAgICAgICBQcm92aWRlckNhbGxiYWNrKCkgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzY3JpcHRvckNoYW5nZWQoTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyLAorICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVQcm92aWRlckRlc2NyaXB0b3IocHJvdmlkZXIsIGRlc2NyaXB0b3IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBNZWRpYVNlc3Npb25SZWNvcmQgeworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb25Db21wYXQgbU1zQ29tcGF0OworCisgICAgICAgICAgICBwcml2YXRlIEBWb2x1bWVQcm92aWRlckNvbXBhdC5Db250cm9sVHlwZSBpbnQgbUNvbnRyb2xUeXBlOworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbU1heFZvbHVtZTsKKyAgICAgICAgICAgIHByaXZhdGUgVm9sdW1lUHJvdmlkZXJDb21wYXQgbVZwQ29tcGF0OworCisgICAgICAgICAgICBwdWJsaWMgTWVkaWFTZXNzaW9uUmVjb3JkKE9iamVjdCBtZWRpYVNlc3Npb24pIHsKKyAgICAgICAgICAgICAgICBtTXNDb21wYXQgPSBNZWRpYVNlc3Npb25Db21wYXQuZnJvbU1lZGlhU2Vzc2lvbihtQXBwbGljYXRpb25Db250ZXh0LCBtZWRpYVNlc3Npb24pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgTWVkaWFTZXNzaW9uUmVjb3JkKE1lZGlhU2Vzc2lvbkNvbXBhdCBtZWRpYVNlc3Npb25Db21wYXQpIHsKKyAgICAgICAgICAgICAgICBtTXNDb21wYXQgPSBtZWRpYVNlc3Npb25Db21wYXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZVZvbHVtZShAVm9sdW1lUHJvdmlkZXJDb21wYXQuQ29udHJvbFR5cGUgaW50IGNvbnRyb2xUeXBlLAorICAgICAgICAgICAgICAgICAgICBpbnQgbWF4LCBpbnQgY3VycmVudCkgeworICAgICAgICAgICAgICAgIGlmIChtVnBDb21wYXQgIT0gbnVsbCAmJiBjb250cm9sVHlwZSA9PSBtQ29udHJvbFR5cGUgJiYgbWF4ID09IG1NYXhWb2x1bWUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZW4ndCBjaGFuZ2VkIGNvbnRyb2wgdHlwZSBvciBtYXgganVzdCBzZXQgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIG5ldyBjdXJyZW50IHZvbHVtZQorICAgICAgICAgICAgICAgICAgICBtVnBDb21wYXQuc2V0Q3VycmVudFZvbHVtZShjdXJyZW50KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgY3JlYXRlIGEgbmV3IHByb3ZpZGVyIGFuZCB1cGRhdGUKKyAgICAgICAgICAgICAgICAgICAgbVZwQ29tcGF0ID0gbmV3IFZvbHVtZVByb3ZpZGVyQ29tcGF0KGNvbnRyb2xUeXBlLCBtYXgsIGN1cnJlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TZXRWb2x1bWVUbyhmaW5hbCBpbnQgdm9sdW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGUucmVxdWVzdFNldFZvbHVtZSh2b2x1bWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25BZGp1c3RWb2x1bWUoZmluYWwgaW50IGRpcmVjdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlLnJlcXVlc3RVcGRhdGVWb2x1bWUoZGlyZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICBtTXNDb21wYXQuc2V0UGxheWJhY2tUb1JlbW90ZShtVnBDb21wYXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgY2xlYXJWb2x1bWVIYW5kbGluZygpIHsKKyAgICAgICAgICAgICAgICBtTXNDb21wYXQuc2V0UGxheWJhY2tUb0xvY2FsKG1QbGF5YmFja0luZm8ucGxheWJhY2tTdHJlYW0pOworICAgICAgICAgICAgICAgIG1WcENvbXBhdCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb25Db21wYXQuVG9rZW4gZ2V0VG9rZW4oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Nc0NvbXBhdC5nZXRTZXNzaW9uVG9rZW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUmVtb3RlQ29udHJvbENsaWVudFJlY29yZAorICAgICAgICAgICAgICAgIGltcGxlbWVudHMgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdC5Wb2x1bWVDYWxsYmFjayB7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQgbVJjY0NvbXBhdDsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRGlzY29ubmVjdGVkOworCisgICAgICAgICAgICBwdWJsaWMgUmVtb3RlQ29udHJvbENsaWVudFJlY29yZChPYmplY3QgcmNjKSB7CisgICAgICAgICAgICAgICAgbVJjY0NvbXBhdCA9IFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQub2J0YWluKG1BcHBsaWNhdGlvbkNvbnRleHQsIHJjYyk7CisgICAgICAgICAgICAgICAgbVJjY0NvbXBhdC5zZXRWb2x1bWVDYWxsYmFjayh0aGlzKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja0luZm8oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRSZW1vdGVDb250cm9sQ2xpZW50KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtUmNjQ29tcGF0LmdldFJlbW90ZUNvbnRyb2xDbGllbnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgZGlzY29ubmVjdCgpIHsKKyAgICAgICAgICAgICAgICBtRGlzY29ubmVjdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtUmNjQ29tcGF0LnNldFZvbHVtZUNhbGxiYWNrKG51bGwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5YmFja0luZm8oKSB7CisgICAgICAgICAgICAgICAgbVJjY0NvbXBhdC5zZXRQbGF5YmFja0luZm8obVBsYXliYWNrSW5mbyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVTZXRSZXF1ZXN0KGludCB2b2x1bWUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1EaXNjb25uZWN0ZWQgJiYgbVNlbGVjdGVkUm91dGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZS5yZXF1ZXN0U2V0Vm9sdW1lKHZvbHVtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lVXBkYXRlUmVxdWVzdChpbnQgZGlyZWN0aW9uKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtRGlzY29ubmVjdGVkICYmIG1TZWxlY3RlZFJvdXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGUucmVxdWVzdFVwZGF0ZVZvbHVtZShkaXJlY3Rpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ2FsbGJhY2tIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxDYWxsYmFja1JlY29yZD4gbVRlbXBDYWxsYmFja1JlY29yZHMgPQorICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PENhbGxiYWNrUmVjb3JkPigpOworCisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1RZUEVfTUFTSyA9IDB4ZmYwMDsKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVFlQRV9ST1VURSA9IDB4MDEwMDsKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVFlQRV9QUk9WSURFUiA9IDB4MDIwMDsKKworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX0FEREVEID0gTVNHX1RZUEVfUk9VVEUgfCAxOworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX1JFTU9WRUQgPSBNU0dfVFlQRV9ST1VURSB8IDI7CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUk9VVEVfQ0hBTkdFRCA9IE1TR19UWVBFX1JPVVRFIHwgMzsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19ST1VURV9WT0xVTUVfQ0hBTkdFRCA9IE1TR19UWVBFX1JPVVRFIHwgNDsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19ST1VURV9QUkVTRU5UQVRJT05fRElTUExBWV9DSEFOR0VEID0gTVNHX1RZUEVfUk9VVEUgfCA1OworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX1NFTEVDVEVEID0gTVNHX1RZUEVfUk9VVEUgfCA2OworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX1VOU0VMRUNURUQgPSBNU0dfVFlQRV9ST1VURSB8IDc7CisKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19QUk9WSURFUl9BRERFRCA9IE1TR19UWVBFX1BST1ZJREVSIHwgMTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19QUk9WSURFUl9SRU1PVkVEID0gTVNHX1RZUEVfUFJPVklERVIgfCAyOworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BST1ZJREVSX0NIQU5HRUQgPSBNU0dfVFlQRV9QUk9WSURFUiB8IDM7CisKKyAgICAgICAgICAgIENhbGxiYWNrSGFuZGxlcigpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgcG9zdChpbnQgbXNnLCBPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICAgICAgb2J0YWluTWVzc2FnZShtc2csIG9iaikuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBvc3QoaW50IG1zZywgT2JqZWN0IG9iaiwgaW50IGFyZykgeworICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG9idGFpbk1lc3NhZ2UobXNnLCBvYmopOworICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXJnMSA9IGFyZzsKKyAgICAgICAgICAgICAgICBtZXNzYWdlLnNlbmRUb1RhcmdldCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2hhdCA9IG1zZy53aGF0OworICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvYmogPSBtc2cub2JqOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBhcmcgPSBtc2cuYXJnMTsKKworICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1TR19ST1VURV9DSEFOR0VECisgICAgICAgICAgICAgICAgICAgICAgICAmJiBnZXRTZWxlY3RlZFJvdXRlKCkuZ2V0SWQoKS5lcXVhbHMoKChSb3V0ZUluZm8pIG9iaikuZ2V0SWQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2VsZWN0ZWRSb3V0ZUlmTmVlZGVkKHRydWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFN5bmNocm9uaXplIHN0YXRlIHdpdGggdGhlIHN5c3RlbSBtZWRpYSByb3V0ZXIuCisgICAgICAgICAgICAgICAgc3luY1dpdGhTeXN0ZW1Qcm92aWRlcih3aGF0LCBvYmopOworCisgICAgICAgICAgICAgICAgLy8gSW52b2tlIGFsbCByZWdpc3RlcmVkIGNhbGxiYWNrcy4KKyAgICAgICAgICAgICAgICAvLyBCdWlsZCBhIGxpc3Qgb2YgY2FsbGJhY2tzIGJlZm9yZSBpbnZva2luZyB0aGVtIGluIGNhc2UgY2FsbGJhY2tzCisgICAgICAgICAgICAgICAgLy8gYXJlIGFkZGVkIG9yIHJlbW92ZWQgZHVyaW5nIGRpc3BhdGNoLgorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUm91dGVycy5zaXplKCk7IC0taSA+PSAwOyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyIHJvdXRlciA9IG1Sb3V0ZXJzLmdldChpKS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJzLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRlbXBDYWxsYmFja1JlY29yZHMuYWRkQWxsKHJvdXRlci5tQ2FsbGJhY2tSZWNvcmRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjYWxsYmFja0NvdW50ID0gbVRlbXBDYWxsYmFja1JlY29yZHMuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbGxiYWNrQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW52b2tlQ2FsbGJhY2sobVRlbXBDYWxsYmFja1JlY29yZHMuZ2V0KGkpLCB3aGF0LCBvYmosIGFyZyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBtVGVtcENhbGxiYWNrUmVjb3Jkcy5jbGVhcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHN5bmNXaXRoU3lzdGVtUHJvdmlkZXIoaW50IHdoYXQsIE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHdoYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfQURERUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUHJvdmlkZXIub25TeW5jUm91dGVBZGRlZCgoUm91dGVJbmZvKSBvYmopOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX1JFTU9WRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUHJvdmlkZXIub25TeW5jUm91dGVSZW1vdmVkKChSb3V0ZUluZm8pIG9iaik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfQ0hBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1Qcm92aWRlci5vblN5bmNSb3V0ZUNoYW5nZWQoKFJvdXRlSW5mbykgb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9TRUxFQ1RFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1Qcm92aWRlci5vblN5bmNSb3V0ZVNlbGVjdGVkKChSb3V0ZUluZm8pIG9iaik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgdm9pZCBpbnZva2VDYWxsYmFjayhDYWxsYmFja1JlY29yZCByZWNvcmQsIGludCB3aGF0LCBPYmplY3Qgb2JqLCBpbnQgYXJnKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFSb3V0ZXIgcm91dGVyID0gcmVjb3JkLm1Sb3V0ZXI7CisgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgY2FsbGJhY2sgPSByZWNvcmQubUNhbGxiYWNrOworICAgICAgICAgICAgICAgIHN3aXRjaCAod2hhdCAmIE1TR19UWVBFX01BU0spIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfVFlQRV9ST1VURTogeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUm91dGVJbmZvIHJvdXRlID0gKFJvdXRlSW5mbylvYmo7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlY29yZC5maWx0ZXJSb3V0ZUV2ZW50KHJvdXRlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh3aGF0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfQURERUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUm91dGVBZGRlZChyb3V0ZXIsIHJvdXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfUkVNT1ZFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZVJlbW92ZWQocm91dGVyLCByb3V0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUm91dGVDaGFuZ2VkKHJvdXRlciwgcm91dGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9WT0xVTUVfQ0hBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZVZvbHVtZUNoYW5nZWQocm91dGVyLCByb3V0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX1BSRVNFTlRBVElPTl9ESVNQTEFZX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZChyb3V0ZXIsIHJvdXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfU0VMRUNURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUm91dGVTZWxlY3RlZChyb3V0ZXIsIHJvdXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfVU5TRUxFQ1RFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZVVuc2VsZWN0ZWQocm91dGVyLCByb3V0ZSwgYXJnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19UWVBFX1BST1ZJREVSOiB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm92aWRlckluZm8gcHJvdmlkZXIgPSAoUHJvdmlkZXJJbmZvKW9iajsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAod2hhdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1BST1ZJREVSX0FEREVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblByb3ZpZGVyQWRkZWQocm91dGVyLCBwcm92aWRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1BST1ZJREVSX1JFTU9WRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUHJvdmlkZXJSZW1vdmVkKHJvdXRlciwgcHJvdmlkZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19QUk9WSURFUl9DSEFOR0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblByb3ZpZGVyQ2hhbmdlZChyb3V0ZXIsIHByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFTZXNzaW9uU3RhdHVzLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFTZXNzaW9uU3RhdHVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIwNjU5NgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVNlc3Npb25TdGF0dXMuamF2YQpAQCAtMCwwICsxLDI0NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC51dGlsLlRpbWVVdGlsczsKKworLyoqCisgKiBEZXNjcmliZXMgdGhlIHBsYXliYWNrIHN0YXR1cyBvZiBhIG1lZGlhIHNlc3Npb24uCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgaXMgcGFydCBvZiB0aGUgcmVtb3RlIHBsYXliYWNrIHByb3RvY29sIGRlc2NyaWJlZCBieSB0aGUKKyAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgTWVkaWFDb250cm9sSW50ZW50fSBjbGFzcy4KKyAqIDwvcD48cD4KKyAqIFdoZW4gYSBtZWRpYSBzZXNzaW9uIGlzIGNyZWF0ZWQsIGl0IGlzIGluaXRpYWxseSBpbiB0aGUKKyAqIHtAbGluayAjU0VTU0lPTl9TVEFURV9BQ1RJVkUgYWN0aXZlfSBzdGF0ZS4gIFdoZW4gdGhlIG1lZGlhIHNlc3Npb24gZW5kcworICogbm9ybWFsbHksIGl0IHRyYW5zaXRpb25zIHRvIHRoZSB7QGxpbmsgI1NFU1NJT05fU1RBVEVfRU5ERUQgZW5kZWR9IHN0YXRlLgorICogSWYgdGhlIG1lZGlhIHNlc3Npb24gaXMgaW52YWxpZGF0ZWQgZHVlIHRvIGFub3RoZXIgc2Vzc2lvbiBmb3JjaWJseSB0YWtpbmcKKyAqIGNvbnRyb2wgb2YgdGhlIHJvdXRlLCB0aGVuIGl0IHRyYW5zaXRpb25zIHRvIHRoZQorICoge0BsaW5rICNTRVNTSU9OX1NUQVRFX0lOVkFMSURBVEVEIGludmFsaWRhdGVkfSBzdGF0ZS4KKyAqIFJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uIG9mIGVhY2ggc3RhdGUgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIGl0cyBtZWFuaW5nLgorICogPC9wPjxwPgorICogVG8gbW9uaXRvciBzZXNzaW9uIHN0YXR1cywgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBzdXBwbHkgYSB7QGxpbmsgUGVuZGluZ0ludGVudH0gdG8gdXNlIGFzIHRoZQorICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNFWFRSQV9TRVNTSU9OX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgc2Vzc2lvbiBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyfQorICogZm9yIGEgZ2l2ZW4ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RBUlRfU0VTU0lPTiBzZXNzaW9uIHN0YXJ0IHJlcXVlc3R9LgorICogPC9wPjxwPgorICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZCB1c2luZyBhIHtAbGluayBCdWlsZGVyfSBpbnN0YW5jZS4KKyAqIDwvcD4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhU2Vzc2lvblN0YXR1cyB7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVElNRVNUQU1QID0gInRpbWVzdGFtcCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VTU0lPTl9TVEFURSA9ICJzZXNzaW9uU3RhdGUiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1FVRVVFX1BBVVNFRCA9ICJxdWV1ZVBhdXNlZCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRVhUUkFTID0gImV4dHJhcyI7CisKKyAgICBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKKworICAgIC8qKgorICAgICAqIFNlc3Npb24gc3RhdGU6IEFjdGl2ZS4KKyAgICAgKiA8cD4KKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgc2Vzc2lvbiBpcyBhY3RpdmUgYW5kIGluIGNvbnRyb2wgb2YgdGhlIHJvdXRlLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVNTSU9OX1NUQVRFX0FDVElWRSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZXNzaW9uIHN0YXRlOiBFbmRlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgc2Vzc2lvbiB3YXMgZW5kZWQgbm9ybWFsbHkgdXNpbmcgdGhlCisgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5EX1NFU1NJT04gZW5kIHNlc3Npb259IGFjdGlvbi4KKyAgICAgKiA8L3A+PHA+CisgICAgICogQSB0ZXJtaW5hdGVkIG1lZGlhIHNlc3Npb24gY2Fubm90IGJlIHVzZWQgYW55bW9yZS4gIFRvIHBsYXkgbW9yZSBtZWRpYSwgdGhlCisgICAgICogYXBwbGljYXRpb24gbXVzdCBzdGFydCBhIG5ldyBzZXNzaW9uLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVNTSU9OX1NUQVRFX0VOREVEID0gMTsKKworICAgIC8qKgorICAgICAqIFNlc3Npb24gc3RhdGU6IEludmFsaWRhdGVkLgorICAgICAqIDxwPgorICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBzZXNzaW9uIHdhcyBpbnZhbGlkYXRlZCBpbnZvbHVudGFyaWx5IGR1ZSB0bworICAgICAqIGFub3RoZXIgc2Vzc2lvbiB0YWtpbmcgY29udHJvbCBvZiB0aGUgcm91dGUuCisgICAgICogPC9wPjxwPgorICAgICAqIEFuIGludmFsaWRhdGVkIG1lZGlhIHNlc3Npb24gY2Fubm90IGJlIHVzZWQgYW55bW9yZS4gIFRvIHBsYXkgbW9yZSBtZWRpYSwgdGhlCisgICAgICogYXBwbGljYXRpb24gbXVzdCBzdGFydCBhIG5ldyBzZXNzaW9uLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVNTSU9OX1NUQVRFX0lOVkFMSURBVEVEID0gMjsKKworICAgIE1lZGlhU2Vzc2lvblN0YXR1cyhCdW5kbGUgYnVuZGxlKSB7CisgICAgICAgIG1CdW5kbGUgPSBidW5kbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdGltZXN0YW1wIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RhdHVzIGluZm9ybWF0aW9uIGluCisgICAgICogbWlsbGlzZWNvbmRzIHNpbmNlIGJvb3QgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWV9IHRpbWUgYmFzZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHN0YXR1cyB0aW1lc3RhbXAgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWUoKX0gdGltZSBiYXNlLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFRpbWVzdGFtcCgpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0TG9uZyhLRVlfVElNRVNUQU1QKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBzZXNzaW9uIHN0YXRlLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgc2Vzc2lvbiBzdGF0ZS4gIE9uZSBvZiB7QGxpbmsgI1NFU1NJT05fU1RBVEVfQUNUSVZFfSwKKyAgICAgKiB7QGxpbmsgI1NFU1NJT05fU1RBVEVfRU5ERUR9LCBvciB7QGxpbmsgI1NFU1NJT05fU1RBVEVfSU5WQUxJREFURUR9LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U2Vzc2lvblN0YXRlKCkgeworICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX1NFU1NJT05fU1RBVEUsIFNFU1NJT05fU1RBVEVfSU5WQUxJREFURUQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2Vzc2lvbidzIHF1ZXVlIGlzIHBhdXNlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc2Vzc2lvbidzIHF1ZXVlIGlzIHBhdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1F1ZXVlUGF1c2VkKCkgeworICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRCb29sZWFuKEtFWV9RVUVVRV9QQVVTRUQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYSBidW5kbGUgb2YgZXh0cmFzIGZvciB0aGlzIHN0YXR1cyBvYmplY3QuCisgICAgICogVGhlIGV4dHJhcyB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIG1lZGlhIHJvdXRlciBidXQgdGhleSBtYXkgYmUgdXNlZAorICAgICAqIGJ5IGFwcGxpY2F0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVuZGxlIGdldEV4dHJhcygpIHsKKyAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0QnVuZGxlKEtFWV9FWFRSQVMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiTWVkaWFTZXNzaW9uU3RhdHVzeyAiKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgidGltZXN0YW1wPSIpOworICAgICAgICBUaW1lVXRpbHMuZm9ybWF0RHVyYXRpb24oU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkgLSBnZXRUaW1lc3RhbXAoKSwgcmVzdWx0KTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiIG1zIGFnbyIpOworICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHNlc3Npb25TdGF0ZT0iKS5hcHBlbmQoc2Vzc2lvblN0YXRlVG9TdHJpbmcoZ2V0U2Vzc2lvblN0YXRlKCkpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBxdWV1ZVBhdXNlZD0iKS5hcHBlbmQoaXNRdWV1ZVBhdXNlZCgpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBleHRyYXM9IikuYXBwZW5kKGdldEV4dHJhcygpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiIH0iKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzZXNzaW9uU3RhdGVUb1N0cmluZyhpbnQgc2Vzc2lvblN0YXRlKSB7CisgICAgICAgIHN3aXRjaCAoc2Vzc2lvblN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIFNFU1NJT05fU1RBVEVfQUNUSVZFOgorICAgICAgICAgICAgICAgIHJldHVybiAiYWN0aXZlIjsKKyAgICAgICAgICAgIGNhc2UgU0VTU0lPTl9TVEFURV9FTkRFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gImVuZGVkIjsKKyAgICAgICAgICAgIGNhc2UgU0VTU0lPTl9TVEFURV9JTlZBTElEQVRFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWRhdGVkIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhzZXNzaW9uU3RhdGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgYnVuZGxlIGZvciBzZXJpYWxpemF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCByZXByZXNlbnRlZCBhcyBhIGJ1bmRsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVuZGxlIGFzQnVuZGxlKCkgeworICAgICAgICByZXR1cm4gbUJ1bmRsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBidW5kbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKiBAcmV0dXJuIFRoZSBuZXcgaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIGJ1bmRsZSB3YXMgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1lZGlhU2Vzc2lvblN0YXR1cyBmcm9tQnVuZGxlKEJ1bmRsZSBidW5kbGUpIHsKKyAgICAgICAgcmV0dXJuIGJ1bmRsZSAhPSBudWxsID8gbmV3IE1lZGlhU2Vzc2lvblN0YXR1cyhidW5kbGUpIDogbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzIG1lZGlhIHNlc3Npb24gc3RhdHVzIG9iamVjdHN9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSBzZXNzaW9uIHN0YXR1cyBidWlsZGVyIHVzaW5nIHRoZSBjdXJyZW50IHRpbWUgYXMgdGhlCisgICAgICAgICAqIHJlZmVyZW5jZSB0aW1lc3RhbXAuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzZXNzaW9uU3RhdGUgVGhlIHNlc3Npb24gc3RhdGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlcihpbnQgc2Vzc2lvblN0YXRlKSB7CisgICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgc2V0VGltZXN0YW1wKFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpKTsKKyAgICAgICAgICAgIHNldFNlc3Npb25TdGF0ZShzZXNzaW9uU3RhdGUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSBzZXNzaW9uIHN0YXR1cyBidWlsZGVyIHdob3NlIGluaXRpYWwgY29udGVudHMgYXJlCisgICAgICAgICAqIGNvcGllZCBmcm9tIGFuIGV4aXN0aW5nIHN0YXR1cy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyKE1lZGlhU2Vzc2lvblN0YXR1cyBzdGF0dXMpIHsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInN0YXR1cyBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKHN0YXR1cy5tQnVuZGxlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSB0aW1lc3RhbXAgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdGF0dXMgaW5mb3JtYXRpb24gaW4KKyAgICAgICAgICogbWlsbGlzZWNvbmRzIHNpbmNlIGJvb3QgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWV9IHRpbWUgYmFzZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFRpbWVzdGFtcChsb25nIGVsYXBzZWRSZWFsdGltZVRpbWVzdGFtcCkgeworICAgICAgICAgICAgbUJ1bmRsZS5wdXRMb25nKEtFWV9USU1FU1RBTVAsIGVsYXBzZWRSZWFsdGltZVRpbWVzdGFtcCk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBzZXNzaW9uIHN0YXRlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0U2Vzc2lvblN0YXRlKGludCBzZXNzaW9uU3RhdGUpIHsKKyAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9TRVNTSU9OX1NUQVRFLCBzZXNzaW9uU3RhdGUpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB3aGV0aGVyIHRoZSBxdWV1ZSBpcyBwYXVzZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRRdWV1ZVBhdXNlZChib29sZWFuIHF1ZXVlUGF1c2VkKSB7CisgICAgICAgICAgICBtQnVuZGxlLnB1dEJvb2xlYW4oS0VZX1FVRVVFX1BBVVNFRCwgcXVldWVQYXVzZWQpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyBhIGJ1bmRsZSBvZiBleHRyYXMgZm9yIHRoaXMgc3RhdHVzIG9iamVjdC4KKyAgICAgICAgICogVGhlIGV4dHJhcyB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIG1lZGlhIHJvdXRlciBidXQgdGhleSBtYXkgYmUgdXNlZAorICAgICAgICAgKiBieSBhcHBsaWNhdGlvbnMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRFeHRyYXMoQnVuZGxlIGV4dHJhcykgeworICAgICAgICAgICAgbUJ1bmRsZS5wdXRCdW5kbGUoS0VZX0VYVFJBUywgZXh0cmFzKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1aWxkcyB0aGUge0BsaW5rIE1lZGlhU2Vzc2lvblN0YXR1cyBtZWRpYSBzZXNzaW9uIHN0YXR1cyBvYmplY3R9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE1lZGlhU2Vzc2lvblN0YXR1cyBidWlsZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uU3RhdHVzKG1CdW5kbGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThlNGUyOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw3NDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKKworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9EQVRBX1JPVVRFX0lEOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCisgICAgICAgIC5DTElFTlRfREFUQV9ST1VURV9MSUJSQVJZX0dST1VQOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCisgICAgICAgIC5DTElFTlRfREFUQV9VTlNFTEVDVF9SRUFTT047CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX0RBVEFfVk9MVU1FOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCisgICAgICAgIC5DTElFTlRfTVNHX0NSRUFURV9ST1VURV9DT05UUk9MTEVSOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9NU0dfUkVHSVNURVI7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKKyAgICAgICAgLkNMSUVOVF9NU0dfUkVMRUFTRV9ST1VURV9DT05UUk9MTEVSOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCisgICAgICAgIC5DTElFTlRfTVNHX1JPVVRFX0NPTlRST0xfUkVRVUVTVDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfTVNHX1NFTEVDVF9ST1VURTsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAorICAgICAgICAuQ0xJRU5UX01TR19TRVRfRElTQ09WRVJZX1JFUVVFU1Q7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKKyAgICAgICAgLkNMSUVOVF9NU0dfU0VUX1JPVVRFX1ZPTFVNRTsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfTVNHX1VOUkVHSVNURVI7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKKyAgICAgICAgLkNMSUVOVF9NU0dfVU5TRUxFQ1RfUk9VVEU7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKKyAgICAgICAgLkNMSUVOVF9NU0dfVVBEQVRFX1JPVVRFX1ZPTFVNRTsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfVkVSU0lPTl9DVVJSRU5UOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLlNFUlZJQ0VfREFUQV9FUlJPUjsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAorICAgICAgICAuU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAorICAgICAgICAuU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX1NVQ0NFRURFRDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAorICAgICAgICAuU0VSVklDRV9NU0dfREVTQ1JJUFRPUl9DSEFOR0VEOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCisgICAgICAgIC5TRVJWSUNFX01TR19HRU5FUklDX0ZBSUxVUkU7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKKyAgICAgICAgLlNFUlZJQ0VfTVNHX0dFTkVSSUNfU1VDQ0VTUzsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX01TR19SRUdJU1RFUkVEOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLlNFUlZJQ0VfVkVSU0lPTl8xOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLmlzVmFsaWRSZW1vdGVNZXNzZW5nZXI7CisKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkRlYWRPYmplY3RFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXIuRGVhdGhSZWNpcGllbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2VuZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OworCitpbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlci5Db250cm9sUmVxdWVzdENhbGxiYWNrOworCitpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogTWFpbnRhaW5zIGEgY29ubmVjdGlvbiB0byBhIHBhcnRpY3VsYXIgbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZS4KKyAqLworZmluYWwgY2xhc3MgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlciBleHRlbmRzIE1lZGlhUm91dGVQcm92aWRlcgorICAgICAgICBpbXBsZW1lbnRzIFNlcnZpY2VDb25uZWN0aW9uIHsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlUHJvdmlkZXJQcm94eSI7ICAvLyBtYXguIDIzIGNoYXJzCisgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7CisKKyAgICBwcml2YXRlIGZpbmFsIENvbXBvbmVudE5hbWUgbUNvbXBvbmVudE5hbWU7CisgICAgZmluYWwgUHJpdmF0ZUhhbmRsZXIgbVByaXZhdGVIYW5kbGVyOworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PENvbnRyb2xsZXI+IG1Db250cm9sbGVycyA9IG5ldyBBcnJheUxpc3Q8Q29udHJvbGxlcj4oKTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtU3RhcnRlZDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUJvdW5kOworICAgIHByaXZhdGUgQ29ubmVjdGlvbiBtQWN0aXZlQ29ubmVjdGlvbjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUNvbm5lY3Rpb25SZWFkeTsKKworICAgIHB1YmxpYyBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyKENvbnRleHQgY29udGV4dCwgQ29tcG9uZW50TmFtZSBjb21wb25lbnROYW1lKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIG5ldyBQcm92aWRlck1ldGFkYXRhKGNvbXBvbmVudE5hbWUpKTsKKworICAgICAgICBtQ29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWU7CisgICAgICAgIG1Qcml2YXRlSGFuZGxlciA9IG5ldyBQcml2YXRlSGFuZGxlcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSb3V0ZUNvbnRyb2xsZXIgb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoQE5vbk51bGwgU3RyaW5nIHJvdXRlSWQpIHsKKyAgICAgICAgaWYgKHJvdXRlSWQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGVJZCBjYW5ub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjcmVhdGVSb3V0ZUNvbnRyb2xsZXIocm91dGVJZCwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJvdXRlQ29udHJvbGxlciBvbkNyZWF0ZVJvdXRlQ29udHJvbGxlcigKKyAgICAgICAgICAgIEBOb25OdWxsIFN0cmluZyByb3V0ZUlkLCBATm9uTnVsbCBTdHJpbmcgcm91dGVHcm91cElkKSB7CisgICAgICAgIGlmIChyb3V0ZUlkID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlSWQgY2Fubm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocm91dGVHcm91cElkID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlR3JvdXBJZCBjYW5ub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjcmVhdGVSb3V0ZUNvbnRyb2xsZXIocm91dGVJZCwgcm91dGVHcm91cElkKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkKE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgaWYgKG1Db25uZWN0aW9uUmVhZHkpIHsKKyAgICAgICAgICAgIG1BY3RpdmVDb25uZWN0aW9uLnNldERpc2NvdmVyeVJlcXVlc3QocmVxdWVzdCk7CisgICAgICAgIH0KKyAgICAgICAgdXBkYXRlQmluZGluZygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUsIElCaW5kZXIgc2VydmljZSkgeworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IENvbm5lY3RlZCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Cb3VuZCkgeworICAgICAgICAgICAgZGlzY29ubmVjdCgpOworCisgICAgICAgICAgICBNZXNzZW5nZXIgbWVzc2VuZ2VyID0gKHNlcnZpY2UgIT0gbnVsbCA/IG5ldyBNZXNzZW5nZXIoc2VydmljZSkgOiBudWxsKTsKKyAgICAgICAgICAgIGlmIChpc1ZhbGlkUmVtb3RlTWVzc2VuZ2VyKG1lc3NlbmdlcikpIHsKKyAgICAgICAgICAgICAgICBDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbihtZXNzZW5nZXIpOworICAgICAgICAgICAgICAgIGlmIChjb25uZWN0aW9uLnJlZ2lzdGVyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZUNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogUmVnaXN0cmF0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsIHRoaXMgKyAiOiBTZXJ2aWNlIHJldHVybmVkIGludmFsaWQgbWVzc2VuZ2VyIGJpbmRlciIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSkgeworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IFNlcnZpY2UgZGlzY29ubmVjdGVkIik7CisgICAgICAgIH0KKyAgICAgICAgZGlzY29ubmVjdCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiU2VydmljZSBjb25uZWN0aW9uICIgKyBtQ29tcG9uZW50TmFtZS5mbGF0dGVuVG9TaG9ydFN0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbXBvbmVudE5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgY2xhc3NOYW1lKSB7CisgICAgICAgIHJldHVybiBtQ29tcG9uZW50TmFtZS5nZXRQYWNrYWdlTmFtZSgpLmVxdWFscyhwYWNrYWdlTmFtZSkKKyAgICAgICAgICAgICAgICAmJiBtQ29tcG9uZW50TmFtZS5nZXRDbGFzc05hbWUoKS5lcXVhbHMoY2xhc3NOYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogU3RhcnRpbmciKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgICAgICAgICAgdXBkYXRlQmluZGluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBTdG9wcGluZyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgdXBkYXRlQmluZGluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmViaW5kSWZEaXNjb25uZWN0ZWQoKSB7CisgICAgICAgIGlmIChtQWN0aXZlQ29ubmVjdGlvbiA9PSBudWxsICYmIHNob3VsZEJpbmQoKSkgeworICAgICAgICAgICAgdW5iaW5kKCk7CisgICAgICAgICAgICBiaW5kKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlQmluZGluZygpIHsKKyAgICAgICAgaWYgKHNob3VsZEJpbmQoKSkgeworICAgICAgICAgICAgYmluZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdW5iaW5kKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkQmluZCgpIHsKKyAgICAgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgICAgICAvLyBCaW5kIHdoZW5ldmVyIHRoZXJlIGlzIGEgZGlzY292ZXJ5IHJlcXVlc3QuCisgICAgICAgICAgICBpZiAoZ2V0RGlzY292ZXJ5UmVxdWVzdCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQmluZCB3aGVuZXZlciB0aGUgYXBwbGljYXRpb24gaGFzIGFuIGFjdGl2ZSByb3V0ZSBjb250cm9sbGVyLgorICAgICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IG9uZSBvZiB0aGlzIHByb3ZpZGVyJ3Mgcm91dGVzIGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgaWYgKCFtQ29udHJvbGxlcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBiaW5kKCkgeworICAgICAgICBpZiAoIW1Cb3VuZCkgeworICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogQmluZGluZyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBJbnRlbnQgc2VydmljZSA9IG5ldyBJbnRlbnQoTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuU0VSVklDRV9JTlRFUkZBQ0UpOworICAgICAgICAgICAgc2VydmljZS5zZXRDb21wb25lbnQobUNvbXBvbmVudE5hbWUpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtQm91bmQgPSBnZXRDb250ZXh0KCkuYmluZFNlcnZpY2Uoc2VydmljZSwgdGhpcywgQ29udGV4dC5CSU5EX0FVVE9fQ1JFQVRFKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1Cb3VuZCAmJiBERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBCaW5kIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IEJpbmQgZmFpbGVkIiwgZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1bmJpbmQoKSB7CisgICAgICAgIGlmIChtQm91bmQpIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IFVuYmluZGluZyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtQm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIGdldENvbnRleHQoKS51bmJpbmRTZXJ2aWNlKHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBSb3V0ZUNvbnRyb2xsZXIgY3JlYXRlUm91dGVDb250cm9sbGVyKFN0cmluZyByb3V0ZUlkLCBTdHJpbmcgcm91dGVHcm91cElkKSB7CisgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3IoKTsKKyAgICAgICAgaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgTGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcm91dGVzID0gZGVzY3JpcHRvci5nZXRSb3V0ZXMoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IHJvdXRlcy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVJvdXRlRGVzY3JpcHRvciByb3V0ZSA9IHJvdXRlcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKHJvdXRlLmdldElkKCkuZXF1YWxzKHJvdXRlSWQpKSB7CisgICAgICAgICAgICAgICAgICAgIENvbnRyb2xsZXIgY29udHJvbGxlciA9IG5ldyBDb250cm9sbGVyKHJvdXRlSWQsIHJvdXRlR3JvdXBJZCk7CisgICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVycy5hZGQoY29udHJvbGxlcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvblJlYWR5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmF0dGFjaENvbm5lY3Rpb24obUFjdGl2ZUNvbm5lY3Rpb24pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUJpbmRpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHZvaWQgb25Db25uZWN0aW9uUmVhZHkoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7CisgICAgICAgIGlmIChtQWN0aXZlQ29ubmVjdGlvbiA9PSBjb25uZWN0aW9uKSB7CisgICAgICAgICAgICBtQ29ubmVjdGlvblJlYWR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIGF0dGFjaENvbnRyb2xsZXJzVG9Db25uZWN0aW9uKCk7CisKKyAgICAgICAgICAgIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QgPSBnZXREaXNjb3ZlcnlSZXF1ZXN0KCk7CisgICAgICAgICAgICBpZiAocmVxdWVzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUFjdGl2ZUNvbm5lY3Rpb24uc2V0RGlzY292ZXJ5UmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgb25Db25uZWN0aW9uRGllZChDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKKyAgICAgICAgaWYgKG1BY3RpdmVDb25uZWN0aW9uID09IGNvbm5lY3Rpb24pIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IFNlcnZpY2UgY29ubmVjdGlvbiBkaWVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkaXNjb25uZWN0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIG9uQ29ubmVjdGlvbkVycm9yKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgU3RyaW5nIGVycm9yKSB7CisgICAgICAgIGlmIChtQWN0aXZlQ29ubmVjdGlvbiA9PSBjb25uZWN0aW9uKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBTZXJ2aWNlIGNvbm5lY3Rpb24gZXJyb3IgLSAiICsgZXJyb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdW5iaW5kKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIG9uQ29ubmVjdGlvbkRlc2NyaXB0b3JDaGFuZ2VkKENvbm5lY3Rpb24gY29ubmVjdGlvbiwKKyAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworICAgICAgICBpZiAobUFjdGl2ZUNvbm5lY3Rpb24gPT0gY29ubmVjdGlvbikgeworICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogRGVzY3JpcHRvciBjaGFuZ2VkLCBkZXNjcmlwdG9yPSIgKyBkZXNjcmlwdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldERlc2NyaXB0b3IoZGVzY3JpcHRvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGlzY29ubmVjdCgpIHsKKyAgICAgICAgaWYgKG1BY3RpdmVDb25uZWN0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNldERlc2NyaXB0b3IobnVsbCk7CisgICAgICAgICAgICBtQ29ubmVjdGlvblJlYWR5ID0gZmFsc2U7CisgICAgICAgICAgICBkZXRhY2hDb250cm9sbGVyc0Zyb21Db25uZWN0aW9uKCk7CisgICAgICAgICAgICBtQWN0aXZlQ29ubmVjdGlvbi5kaXNwb3NlKCk7CisgICAgICAgICAgICBtQWN0aXZlQ29ubmVjdGlvbiA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIG9uQ29udHJvbGxlclJlbGVhc2VkKENvbnRyb2xsZXIgY29udHJvbGxlcikgeworICAgICAgICBtQ29udHJvbGxlcnMucmVtb3ZlKGNvbnRyb2xsZXIpOworICAgICAgICBjb250cm9sbGVyLmRldGFjaENvbm5lY3Rpb24oKTsKKyAgICAgICAgdXBkYXRlQmluZGluZygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhdHRhY2hDb250cm9sbGVyc1RvQ29ubmVjdGlvbigpIHsKKyAgICAgICAgaW50IGNvdW50ID0gbUNvbnRyb2xsZXJzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBtQ29udHJvbGxlcnMuZ2V0KGkpLmF0dGFjaENvbm5lY3Rpb24obUFjdGl2ZUNvbm5lY3Rpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRldGFjaENvbnRyb2xsZXJzRnJvbUNvbm5lY3Rpb24oKSB7CisgICAgICAgIGludCBjb3VudCA9IG1Db250cm9sbGVycy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgbUNvbnRyb2xsZXJzLmdldChpKS5kZXRhY2hDb25uZWN0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIENvbnRyb2xsZXIgZXh0ZW5kcyBSb3V0ZUNvbnRyb2xsZXIgeworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUm91dGVJZDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVJvdXRlR3JvdXBJZDsKKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVNlbGVjdGVkOworICAgICAgICBwcml2YXRlIGludCBtUGVuZGluZ1NldFZvbHVtZSA9IC0xOworICAgICAgICBwcml2YXRlIGludCBtUGVuZGluZ1VwZGF0ZVZvbHVtZURlbHRhOworCisgICAgICAgIHByaXZhdGUgQ29ubmVjdGlvbiBtQ29ubmVjdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbUNvbnRyb2xsZXJJZDsKKworICAgICAgICBwdWJsaWMgQ29udHJvbGxlcihTdHJpbmcgcm91dGVJZCwgU3RyaW5nIHJvdXRlR3JvdXBJZCkgeworICAgICAgICAgICAgbVJvdXRlSWQgPSByb3V0ZUlkOworICAgICAgICAgICAgbVJvdXRlR3JvdXBJZCA9IHJvdXRlR3JvdXBJZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGF0dGFjaENvbm5lY3Rpb24oQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7CisgICAgICAgICAgICBtQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisgICAgICAgICAgICBtQ29udHJvbGxlcklkID0gY29ubmVjdGlvbi5jcmVhdGVSb3V0ZUNvbnRyb2xsZXIobVJvdXRlSWQsIG1Sb3V0ZUdyb3VwSWQpOworICAgICAgICAgICAgaWYgKG1TZWxlY3RlZCkgeworICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uc2VsZWN0Um91dGUobUNvbnRyb2xsZXJJZCk7CisgICAgICAgICAgICAgICAgaWYgKG1QZW5kaW5nU2V0Vm9sdW1lID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRWb2x1bWUobUNvbnRyb2xsZXJJZCwgbVBlbmRpbmdTZXRWb2x1bWUpOworICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ1NldFZvbHVtZSA9IC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobVBlbmRpbmdVcGRhdGVWb2x1bWVEZWx0YSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24udXBkYXRlVm9sdW1lKG1Db250cm9sbGVySWQsIG1QZW5kaW5nVXBkYXRlVm9sdW1lRGVsdGEpOworICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ1VwZGF0ZVZvbHVtZURlbHRhID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBkZXRhY2hDb25uZWN0aW9uKCkgeworICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbi5yZWxlYXNlUm91dGVDb250cm9sbGVyKG1Db250cm9sbGVySWQpOworICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uID0gbnVsbDsKKyAgICAgICAgICAgICAgICBtQ29udHJvbGxlcklkID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJlbGVhc2UoKSB7CisgICAgICAgICAgICBvbkNvbnRyb2xsZXJSZWxlYXNlZCh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblNlbGVjdCgpIHsKKyAgICAgICAgICAgIG1TZWxlY3RlZCA9IHRydWU7CisgICAgICAgICAgICBpZiAobUNvbm5lY3Rpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uLnNlbGVjdFJvdXRlKG1Db250cm9sbGVySWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uVW5zZWxlY3QoKSB7CisgICAgICAgICAgICBvblVuc2VsZWN0KE1lZGlhUm91dGVyLlVOU0VMRUNUX1JFQVNPTl9VTktOT1dOKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblVuc2VsZWN0KGludCByZWFzb24pIHsKKyAgICAgICAgICAgIG1TZWxlY3RlZCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbi51bnNlbGVjdFJvdXRlKG1Db250cm9sbGVySWQsIHJlYXNvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXRWb2x1bWUoaW50IHZvbHVtZSkgeworICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbi5zZXRWb2x1bWUobUNvbnRyb2xsZXJJZCwgdm9sdW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVBlbmRpbmdTZXRWb2x1bWUgPSB2b2x1bWU7CisgICAgICAgICAgICAgICAgbVBlbmRpbmdVcGRhdGVWb2x1bWVEZWx0YSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25VcGRhdGVWb2x1bWUoaW50IGRlbHRhKSB7CisgICAgICAgICAgICBpZiAobUNvbm5lY3Rpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uLnVwZGF0ZVZvbHVtZShtQ29udHJvbGxlcklkLCBkZWx0YSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1QZW5kaW5nVXBkYXRlVm9sdW1lRGVsdGEgKz0gZGVsdGE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Db250cm9sUmVxdWVzdChJbnRlbnQgaW50ZW50LCBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBpZiAobUNvbm5lY3Rpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtQ29ubmVjdGlvbi5zZW5kQ29udHJvbFJlcXVlc3QobUNvbnRyb2xsZXJJZCwgaW50ZW50LCBjYWxsYmFjayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIENvbm5lY3Rpb24gaW1wbGVtZW50cyBEZWF0aFJlY2lwaWVudCB7CisgICAgICAgIHByaXZhdGUgZmluYWwgTWVzc2VuZ2VyIG1TZXJ2aWNlTWVzc2VuZ2VyOworICAgICAgICBwcml2YXRlIGZpbmFsIFJlY2VpdmVIYW5kbGVyIG1SZWNlaXZlSGFuZGxlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZXNzZW5nZXIgbVJlY2VpdmVNZXNzZW5nZXI7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgbU5leHRSZXF1ZXN0SWQgPSAxOworICAgICAgICBwcml2YXRlIGludCBtTmV4dENvbnRyb2xsZXJJZCA9IDE7CisgICAgICAgIHByaXZhdGUgaW50IG1TZXJ2aWNlVmVyc2lvbjsgLy8gbm9uLXplcm8gd2hlbiByZWdpc3RyYXRpb24gY29tcGxldGUKKworICAgICAgICBwcml2YXRlIGludCBtUGVuZGluZ1JlZ2lzdGVyUmVxdWVzdElkOworICAgICAgICBwcml2YXRlIGZpbmFsIFNwYXJzZUFycmF5PENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2s+IG1QZW5kaW5nQ2FsbGJhY2tzID0KKyAgICAgICAgICAgICAgICBuZXcgU3BhcnNlQXJyYXk8Q29udHJvbFJlcXVlc3RDYWxsYmFjaz4oKTsKKworICAgICAgICBwdWJsaWMgQ29ubmVjdGlvbihNZXNzZW5nZXIgc2VydmljZU1lc3NlbmdlcikgeworICAgICAgICAgICAgbVNlcnZpY2VNZXNzZW5nZXIgPSBzZXJ2aWNlTWVzc2VuZ2VyOworICAgICAgICAgICAgbVJlY2VpdmVIYW5kbGVyID0gbmV3IFJlY2VpdmVIYW5kbGVyKHRoaXMpOworICAgICAgICAgICAgbVJlY2VpdmVNZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKG1SZWNlaXZlSGFuZGxlcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiByZWdpc3RlcigpIHsKKyAgICAgICAgICAgIG1QZW5kaW5nUmVnaXN0ZXJSZXF1ZXN0SWQgPSBtTmV4dFJlcXVlc3RJZCsrOworICAgICAgICAgICAgaWYgKCFzZW5kUmVxdWVzdChDTElFTlRfTVNHX1JFR0lTVEVSLAorICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ1JlZ2lzdGVyUmVxdWVzdElkLAorICAgICAgICAgICAgICAgICAgICBDTElFTlRfVkVSU0lPTl9DVVJSRU5ULCBudWxsLCBudWxsKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtU2VydmljZU1lc3Nlbmdlci5nZXRCaW5kZXIoKS5saW5rVG9EZWF0aCh0aGlzLCAwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIGJpbmRlckRpZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisgICAgICAgICAgICBzZW5kUmVxdWVzdChDTElFTlRfTVNHX1VOUkVHSVNURVIsIDAsIDAsIG51bGwsIG51bGwpOworICAgICAgICAgICAgbVJlY2VpdmVIYW5kbGVyLmRpc3Bvc2UoKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlTWVzc2VuZ2VyLmdldEJpbmRlcigpLnVubGlua1RvRGVhdGgodGhpcywgMCk7CisKKyAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWxQZW5kaW5nQ2FsbGJhY2tzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGZhaWxQZW5kaW5nQ2FsbGJhY2tzKCkgeworICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVBlbmRpbmdDYWxsYmFja3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtUGVuZGluZ0NhbGxiYWNrcy52YWx1ZUF0KGkpLm9uRXJyb3IobnVsbCwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUGVuZGluZ0NhbGxiYWNrcy5jbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25HZW5lcmljRmFpbHVyZShpbnQgcmVxdWVzdElkKSB7CisgICAgICAgICAgICBpZiAocmVxdWVzdElkID09IG1QZW5kaW5nUmVnaXN0ZXJSZXF1ZXN0SWQpIHsKKyAgICAgICAgICAgICAgICBtUGVuZGluZ1JlZ2lzdGVyUmVxdWVzdElkID0gMDsKKyAgICAgICAgICAgICAgICBvbkNvbm5lY3Rpb25FcnJvcih0aGlzLCAiUmVnaXN0cmF0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjayA9IG1QZW5kaW5nQ2FsbGJhY2tzLmdldChyZXF1ZXN0SWQpOworICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtUGVuZGluZ0NhbGxiYWNrcy5yZW1vdmUocmVxdWVzdElkKTsKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5vbkVycm9yKG51bGwsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkdlbmVyaWNTdWNjZXNzKGludCByZXF1ZXN0SWQpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25SZWdpc3RlcmVkKGludCByZXF1ZXN0SWQsIGludCBzZXJ2aWNlVmVyc2lvbiwKKyAgICAgICAgICAgICAgICBCdW5kbGUgZGVzY3JpcHRvckJ1bmRsZSkgeworICAgICAgICAgICAgaWYgKG1TZXJ2aWNlVmVyc2lvbiA9PSAwCisgICAgICAgICAgICAgICAgICAgICYmIHJlcXVlc3RJZCA9PSBtUGVuZGluZ1JlZ2lzdGVyUmVxdWVzdElkCisgICAgICAgICAgICAgICAgICAgICYmIHNlcnZpY2VWZXJzaW9uID49IFNFUlZJQ0VfVkVSU0lPTl8xKSB7CisgICAgICAgICAgICAgICAgbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZCA9IDA7CisgICAgICAgICAgICAgICAgbVNlcnZpY2VWZXJzaW9uID0gc2VydmljZVZlcnNpb247CisgICAgICAgICAgICAgICAgb25Db25uZWN0aW9uRGVzY3JpcHRvckNoYW5nZWQodGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuZnJvbUJ1bmRsZShkZXNjcmlwdG9yQnVuZGxlKSk7CisgICAgICAgICAgICAgICAgb25Db25uZWN0aW9uUmVhZHkodGhpcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkRlc2NyaXB0b3JDaGFuZ2VkKEJ1bmRsZSBkZXNjcmlwdG9yQnVuZGxlKSB7CisgICAgICAgICAgICBpZiAobVNlcnZpY2VWZXJzaW9uICE9IDApIHsKKyAgICAgICAgICAgICAgICBvbkNvbm5lY3Rpb25EZXNjcmlwdG9yQ2hhbmdlZCh0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5mcm9tQnVuZGxlKGRlc2NyaXB0b3JCdW5kbGUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ29udHJvbFJlcXVlc3RTdWNjZWVkZWQoaW50IHJlcXVlc3RJZCwgQnVuZGxlIGRhdGEpIHsKKyAgICAgICAgICAgIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2sgPSBtUGVuZGluZ0NhbGxiYWNrcy5nZXQocmVxdWVzdElkKTsKKyAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVBlbmRpbmdDYWxsYmFja3MucmVtb3ZlKHJlcXVlc3RJZCk7CisgICAgICAgICAgICAgICAgY2FsbGJhY2sub25SZXN1bHQoZGF0YSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNvbnRyb2xSZXF1ZXN0RmFpbGVkKGludCByZXF1ZXN0SWQsIFN0cmluZyBlcnJvciwgQnVuZGxlIGRhdGEpIHsKKyAgICAgICAgICAgIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2sgPSBtUGVuZGluZ0NhbGxiYWNrcy5nZXQocmVxdWVzdElkKTsKKyAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVBlbmRpbmdDYWxsYmFja3MucmVtb3ZlKHJlcXVlc3RJZCk7CisgICAgICAgICAgICAgICAgY2FsbGJhY2sub25FcnJvcihlcnJvciwgZGF0YSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYmluZGVyRGllZCgpIHsKKyAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIG9uQ29ubmVjdGlvbkRpZWQoQ29ubmVjdGlvbi50aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgY3JlYXRlUm91dGVDb250cm9sbGVyKFN0cmluZyByb3V0ZUlkLCBTdHJpbmcgcm91dGVHcm91cElkKSB7CisgICAgICAgICAgICBpbnQgY29udHJvbGxlcklkID0gbU5leHRDb250cm9sbGVySWQrKzsKKyAgICAgICAgICAgIEJ1bmRsZSBkYXRhID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgZGF0YS5wdXRTdHJpbmcoQ0xJRU5UX0RBVEFfUk9VVEVfSUQsIHJvdXRlSWQpOworICAgICAgICAgICAgZGF0YS5wdXRTdHJpbmcoQ0xJRU5UX0RBVEFfUk9VVEVfTElCUkFSWV9HUk9VUCwgcm91dGVHcm91cElkKTsKKyAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfQ1JFQVRFX1JPVVRFX0NPTlRST0xMRVIsCisgICAgICAgICAgICAgICAgICAgIG1OZXh0UmVxdWVzdElkKyssIGNvbnRyb2xsZXJJZCwgbnVsbCwgZGF0YSk7CisgICAgICAgICAgICByZXR1cm4gY29udHJvbGxlcklkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVsZWFzZVJvdXRlQ29udHJvbGxlcihpbnQgY29udHJvbGxlcklkKSB7CisgICAgICAgICAgICBzZW5kUmVxdWVzdChDTElFTlRfTVNHX1JFTEVBU0VfUk9VVEVfQ09OVFJPTExFUiwKKyAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgY29udHJvbGxlcklkLCBudWxsLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdFJvdXRlKGludCBjb250cm9sbGVySWQpIHsKKyAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfU0VMRUNUX1JPVVRFLAorICAgICAgICAgICAgICAgICAgICBtTmV4dFJlcXVlc3RJZCsrLCBjb250cm9sbGVySWQsIG51bGwsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdW5zZWxlY3RSb3V0ZShpbnQgY29udHJvbGxlcklkLCBpbnQgcmVhc29uKSB7CisgICAgICAgICAgICBCdW5kbGUgZXh0cmFzID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgZXh0cmFzLnB1dEludChDTElFTlRfREFUQV9VTlNFTEVDVF9SRUFTT04sIHJlYXNvbik7CisgICAgICAgICAgICBzZW5kUmVxdWVzdChDTElFTlRfTVNHX1VOU0VMRUNUX1JPVVRFLAorICAgICAgICAgICAgICAgICAgICBtTmV4dFJlcXVlc3RJZCsrLCBjb250cm9sbGVySWQsIG51bGwsIGV4dHJhcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRWb2x1bWUoaW50IGNvbnRyb2xsZXJJZCwgaW50IHZvbHVtZSkgeworICAgICAgICAgICAgQnVuZGxlIGRhdGEgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICBkYXRhLnB1dEludChDTElFTlRfREFUQV9WT0xVTUUsIHZvbHVtZSk7CisgICAgICAgICAgICBzZW5kUmVxdWVzdChDTElFTlRfTVNHX1NFVF9ST1VURV9WT0xVTUUsCisgICAgICAgICAgICAgICAgICAgIG1OZXh0UmVxdWVzdElkKyssIGNvbnRyb2xsZXJJZCwgbnVsbCwgZGF0YSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVWb2x1bWUoaW50IGNvbnRyb2xsZXJJZCwgaW50IGRlbHRhKSB7CisgICAgICAgICAgICBCdW5kbGUgZGF0YSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgIGRhdGEucHV0SW50KENMSUVOVF9EQVRBX1ZPTFVNRSwgZGVsdGEpOworICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19VUERBVEVfUk9VVEVfVk9MVU1FLAorICAgICAgICAgICAgICAgICAgICBtTmV4dFJlcXVlc3RJZCsrLCBjb250cm9sbGVySWQsIG51bGwsIGRhdGEpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gc2VuZENvbnRyb2xSZXF1ZXN0KGludCBjb250cm9sbGVySWQsIEludGVudCBpbnRlbnQsCisgICAgICAgICAgICAgICAgQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgaW50IHJlcXVlc3RJZCA9IG1OZXh0UmVxdWVzdElkKys7CisgICAgICAgICAgICBpZiAoc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19ST1VURV9DT05UUk9MX1JFUVVFU1QsCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCwgY29udHJvbGxlcklkLCBpbnRlbnQsIG51bGwpKSB7CisgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdDYWxsYmFja3MucHV0KHJlcXVlc3RJZCwgY2FsbGJhY2spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldERpc2NvdmVyeVJlcXVlc3QoTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19TRVRfRElTQ09WRVJZX1JFUVVFU1QsCisgICAgICAgICAgICAgICAgICAgIG1OZXh0UmVxdWVzdElkKyssIDAsIHJlcXVlc3QgIT0gbnVsbCA/IHJlcXVlc3QuYXNCdW5kbGUoKSA6IG51bGwsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHNlbmRSZXF1ZXN0KGludCB3aGF0LCBpbnQgcmVxdWVzdElkLCBpbnQgYXJnLCBPYmplY3Qgb2JqLCBCdW5kbGUgZGF0YSkgeworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBNZXNzYWdlLm9idGFpbigpOworICAgICAgICAgICAgbXNnLndoYXQgPSB3aGF0OworICAgICAgICAgICAgbXNnLmFyZzEgPSByZXF1ZXN0SWQ7CisgICAgICAgICAgICBtc2cuYXJnMiA9IGFyZzsKKyAgICAgICAgICAgIG1zZy5vYmogPSBvYmo7CisgICAgICAgICAgICBtc2cuc2V0RGF0YShkYXRhKTsKKyAgICAgICAgICAgIG1zZy5yZXBseVRvID0gbVJlY2VpdmVNZXNzZW5nZXI7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXJ2aWNlTWVzc2VuZ2VyLnNlbmQobXNnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKERlYWRPYmplY3RFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgc2VydmljZSBkaWVkLgorICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKHdoYXQgIT0gQ0xJRU5UX01TR19VTlJFR0lTVEVSKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBzZW5kIG1lc3NhZ2UgdG8gc2VydmljZS4iLCBleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUHJpdmF0ZUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKKyAgICAgICAgUHJpdmF0ZUhhbmRsZXIoKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGVyIHRoYXQgcmVjZWl2ZXMgbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgaW5uZXIgY2xhc3MgaXMgc3RhdGljIGFuZCBvbmx5IHJldGFpbnMgYSB3ZWFrIHJlZmVyZW5jZSB0byB0aGUgY29ubmVjdGlvbgorICAgICAqIHRvIHByZXZlbnQgdGhlIGNsaWVudCBmcm9tIGJlaW5nIGxlYWtlZCBpbiBjYXNlIHRoZSBzZXJ2aWNlIGlzIGhvbGRpbmcgYW4KKyAgICAgKiBhY3RpdmUgcmVmZXJlbmNlIHRvIHRoZSBjbGllbnQncyBtZXNzZW5nZXIuCisgICAgICogPC9wPjxwPgorICAgICAqIFRoaXMgaGFuZGxlciBzaG91bGQgbm90IGJlIHVzZWQgdG8gaGFuZGxlIGFueSBtZXNzYWdlcyBvdGhlciB0aGFuIHRob3NlCisgICAgICogdGhhdCBjb21lIGZyb20gdGhlIHNlcnZpY2UuCisgICAgICogPC9wPgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlY2VpdmVIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxDb25uZWN0aW9uPiBtQ29ubmVjdGlvblJlZjsKKworICAgICAgICBwdWJsaWMgUmVjZWl2ZUhhbmRsZXIoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7CisgICAgICAgICAgICBtQ29ubmVjdGlvblJlZiA9IG5ldyBXZWFrUmVmZXJlbmNlPENvbm5lY3Rpb24+KGNvbm5lY3Rpb24pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKyAgICAgICAgICAgIG1Db25uZWN0aW9uUmVmLmNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgeworICAgICAgICAgICAgQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gbUNvbm5lY3Rpb25SZWYuZ2V0KCk7CisgICAgICAgICAgICBpZiAoY29ubmVjdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHdoYXQgPSBtc2cud2hhdDsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmVxdWVzdElkID0gbXNnLmFyZzE7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGFyZyA9IG1zZy5hcmcyOworICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvYmogPSBtc2cub2JqOworICAgICAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBkYXRhID0gbXNnLnBlZWtEYXRhKCk7CisgICAgICAgICAgICAgICAgaWYgKCFwcm9jZXNzTWVzc2FnZShjb25uZWN0aW9uLCB3aGF0LCByZXF1ZXN0SWQsIGFyZywgb2JqLCBkYXRhKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlVuaGFuZGxlZCBtZXNzYWdlIGZyb20gc2VydmVyOiAiICsgbXNnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShDb25uZWN0aW9uIGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgaW50IHdoYXQsIGludCByZXF1ZXN0SWQsIGludCBhcmcsIE9iamVjdCBvYmosIEJ1bmRsZSBkYXRhKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHdoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNFUlZJQ0VfTVNHX0dFTkVSSUNfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5vbkdlbmVyaWNGYWlsdXJlKHJlcXVlc3RJZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX01TR19HRU5FUklDX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ub25HZW5lcmljU3VjY2VzcyhyZXF1ZXN0SWQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9NU0dfUkVHSVNURVJFRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8IG9iaiBpbnN0YW5jZW9mIEJ1bmRsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24ub25SZWdpc3RlcmVkKHJlcXVlc3RJZCwgYXJnLCAoQnVuZGxlKW9iaik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNFUlZJQ0VfTVNHX0RFU0NSSVBUT1JfQ0hBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8IG9iaiBpbnN0YW5jZW9mIEJ1bmRsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24ub25EZXNjcmlwdG9yQ2hhbmdlZCgoQnVuZGxlKW9iaik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9TVUNDRUVERUQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogaW5zdGFuY2VvZiBCdW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLm9uQ29udHJvbFJlcXVlc3RTdWNjZWVkZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCwgKEJ1bmRsZSlvYmopOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfRkFJTEVEOgorICAgICAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwgfHwgb2JqIGluc3RhbmNlb2YgQnVuZGxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXJyb3IgPSAoZGF0YSA9PSBudWxsID8gbnVsbCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0U3RyaW5nKFNFUlZJQ0VfREFUQV9FUlJPUikpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24ub25Db250cm9sUmVxdWVzdEZhaWxlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLCBlcnJvciwgKEJ1bmRsZSlvYmopOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXJXYXRjaGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcldhdGNoZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTFmNjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXJXYXRjaGVyLmphdmEKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm87CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKKy8qKgorICogV2F0Y2hlcyBmb3IgbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZXMgdG8gYmUgaW5zdGFsbGVkLgorICogQWRkcyBhIHByb3ZpZGVyIHRvIHRoZSBtZWRpYSByb3V0ZXIgZm9yIGVhY2ggcmVnaXN0ZXJlZCBzZXJ2aWNlLgorICoKKyAqIEBzZWUgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcgorICovCitmaW5hbCBjbGFzcyBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgZmluYWwgQ2FsbGJhY2sgbUNhbGxiYWNrOworICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlcjsKKyAgICBwcml2YXRlIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIG1QYWNrYWdlTWFuYWdlcjsKKworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXI+IG1Qcm92aWRlcnMgPQorICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyPigpOworICAgIHByaXZhdGUgYm9vbGVhbiBtUnVubmluZzsKKworICAgIHB1YmxpYyBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlcihDb250ZXh0IGNvbnRleHQsIENhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKyAgICAgICAgbVBhY2thZ2VNYW5hZ2VyID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworICAgICAgICBpZiAoIW1SdW5uaW5nKSB7CisgICAgICAgICAgICBtUnVubmluZyA9IHRydWU7CisKKyAgICAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CisgICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fUEFDS0FHRV9BRERFRCk7CisgICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fUEFDS0FHRV9SRU1PVkVEKTsKKyAgICAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9QQUNLQUdFX0NIQU5HRUQpOworICAgICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfUkVQTEFDRUQpOworICAgICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfUkVTVEFSVEVEKTsKKyAgICAgICAgICAgIGZpbHRlci5hZGREYXRhU2NoZW1lKCJwYWNrYWdlIik7CisgICAgICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1TY2FuUGFja2FnZXNSZWNlaXZlciwgZmlsdGVyLCBudWxsLCBtSGFuZGxlcik7CisKKyAgICAgICAgICAgIC8vIFNjYW4gcGFja2FnZXMuCisgICAgICAgICAgICAvLyBBbHNvIGhhcyB0aGUgc2lkZS1lZmZlY3Qgb2YgcmVzdGFydGluZyBwcm92aWRlcnMgaWYgbmVlZGVkLgorICAgICAgICAgICAgbUhhbmRsZXIucG9zdChtU2NhblBhY2thZ2VzUnVubmFibGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgaWYgKG1SdW5uaW5nKSB7CisgICAgICAgICAgICBtUnVubmluZyA9IGZhbHNlOworCisgICAgICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIobVNjYW5QYWNrYWdlc1JlY2VpdmVyKTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtU2NhblBhY2thZ2VzUnVubmFibGUpOworCisgICAgICAgICAgICAvLyBTdG9wIGFsbCBwcm92aWRlcnMuCisgICAgICAgICAgICBmb3IgKGludCBpID0gbVByb3ZpZGVycy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIG1Qcm92aWRlcnMuZ2V0KGkpLnN0b3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc2NhblBhY2thZ2VzKCkgeworICAgICAgICBpZiAoIW1SdW5uaW5nKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBBZGQgcHJvdmlkZXJzIGZvciBhbGwgbmV3IHNlcnZpY2VzLgorICAgICAgICAvLyBSZW9yZGVyIHRoZSBsaXN0IHNvIHRoYXQgcHJvdmlkZXJzIGxlZnQgYXQgdGhlIGVuZCB3aWxsIGJlIHRoZSBvbmVzIHRvIHJlbW92ZS4KKyAgICAgICAgaW50IHRhcmdldEluZGV4ID0gMDsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZS5TRVJWSUNFX0lOVEVSRkFDRSk7CisgICAgICAgIGZvciAoUmVzb2x2ZUluZm8gcmVzb2x2ZUluZm8gOiBtUGFja2FnZU1hbmFnZXIucXVlcnlJbnRlbnRTZXJ2aWNlcyhpbnRlbnQsIDApKSB7CisgICAgICAgICAgICBTZXJ2aWNlSW5mbyBzZXJ2aWNlSW5mbyA9IHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvOworICAgICAgICAgICAgaWYgKHNlcnZpY2VJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnQgc291cmNlSW5kZXggPSBmaW5kUHJvdmlkZXIoc2VydmljZUluZm8ucGFja2FnZU5hbWUsIHNlcnZpY2VJbmZvLm5hbWUpOworICAgICAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIobUNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbXBvbmVudE5hbWUoc2VydmljZUluZm8ucGFja2FnZU5hbWUsIHNlcnZpY2VJbmZvLm5hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgbVByb3ZpZGVycy5hZGQodGFyZ2V0SW5kZXgrKywgcHJvdmlkZXIpOworICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2suYWRkUHJvdmlkZXIocHJvdmlkZXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlSW5kZXggPj0gdGFyZ2V0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlciA9IG1Qcm92aWRlcnMuZ2V0KHNvdXJjZUluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIuc3RhcnQoKTsgLy8gcmVzdGFydCB0aGUgcHJvdmlkZXIgaWYgbmVlZGVkCisgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLnJlYmluZElmRGlzY29ubmVjdGVkKCk7CisgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnN3YXAobVByb3ZpZGVycywgc291cmNlSW5kZXgsIHRhcmdldEluZGV4KyspOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbW92ZSBwcm92aWRlcnMgZm9yIG1pc3Npbmcgc2VydmljZXMuCisgICAgICAgIGlmICh0YXJnZXRJbmRleCA8IG1Qcm92aWRlcnMuc2l6ZSgpKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gbVByb3ZpZGVycy5zaXplKCkgLSAxOyBpID49IHRhcmdldEluZGV4OyBpLS0pIHsKKyAgICAgICAgICAgICAgICBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyID0gbVByb3ZpZGVycy5nZXQoaSk7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrLnJlbW92ZVByb3ZpZGVyKHByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICBtUHJvdmlkZXJzLnJlbW92ZShwcm92aWRlcik7CisgICAgICAgICAgICAgICAgcHJvdmlkZXIuc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZmluZFByb3ZpZGVyKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICBpbnQgY291bnQgPSBtUHJvdmlkZXJzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyID0gbVByb3ZpZGVycy5nZXQoaSk7CisgICAgICAgICAgICBpZiAocHJvdmlkZXIuaGFzQ29tcG9uZW50TmFtZShwYWNrYWdlTmFtZSwgY2xhc3NOYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIEJyb2FkY2FzdFJlY2VpdmVyIG1TY2FuUGFja2FnZXNSZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgIHNjYW5QYWNrYWdlcygpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgZmluYWwgUnVubmFibGUgbVNjYW5QYWNrYWdlc1J1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgc2NhblBhY2thZ2VzKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIGludGVyZmFjZSBDYWxsYmFjayB7CisgICAgICAgIHZvaWQgYWRkUHJvdmlkZXIoTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyKTsKKyAgICAgICAgdm9pZCByZW1vdmVQcm92aWRlcihNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVtb3RlQ29udHJvbENsaWVudENvbXBhdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNjQ0OWIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVtb3RlQ29udHJvbENsaWVudENvbXBhdC5qYXZhCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5SZXF1aXJlc0FwaTsKKworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKKworLyoqCisgKiBQcm92aWRlcyBhY2Nlc3MgdG8gZmVhdHVyZXMgb2YgdGhlIHJlbW90ZSBjb250cm9sIGNsaWVudC4KKyAqCisgKiBIaWRkZW4gZm9yIG5vdyBidXQgd2UgbWlnaHQgd2FudCB0byBtYWtlIHRoaXMgYXZhaWxhYmxlIHRvIGFwcGxpY2F0aW9ucworICogaW4gdGhlIGZ1dHVyZS4KKyAqLworYWJzdHJhY3QgY2xhc3MgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdCB7CisgICAgcHJvdGVjdGVkIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBtUmNjOworICAgIHByb3RlY3RlZCBWb2x1bWVDYWxsYmFjayBtVm9sdW1lQ2FsbGJhY2s7CisKKyAgICBwcm90ZWN0ZWQgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdChDb250ZXh0IGNvbnRleHQsIE9iamVjdCByY2MpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtUmNjID0gcmNjOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdCBvYnRhaW4oQ29udGV4dCBjb250ZXh0LCBPYmplY3QgcmNjKSB7CisgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMTYpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSmVsbHliZWFuSW1wbChjb250ZXh0LCByY2MpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgTGVnYWN5SW1wbChjb250ZXh0LCByY2MpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVtb3RlQ29udHJvbENsaWVudCgpIHsKKyAgICAgICAgcmV0dXJuIG1SY2M7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY3VycmVudCBwbGF5YmFjayBpbmZvcm1hdGlvbi4KKyAgICAgKiBNdXN0IGJlIGNhbGxlZCBhdCBsZWFzdCBvbmNlIHRvIGF0dGFjaCB0byB0aGUgcmVtb3RlIGNvbnRyb2wgY2xpZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGluZm8gVGhlIHBsYXliYWNrIGluZm9ybWF0aW9uLiAgTXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQbGF5YmFja0luZm8oUGxheWJhY2tJbmZvIGluZm8pIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgY2FsbGJhY2sgdG8gcmVjZWl2ZSB2b2x1bWUgY2hhbmdlIHJlcXVlc3RzIGZyb20gdGhlIHJlbW90ZSBjb250cm9sIGNsaWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgdm9sdW1lIGNhbGxiYWNrIHRvIHVzZSBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Vm9sdW1lQ2FsbGJhY2soVm9sdW1lQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgbVZvbHVtZUNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwbGF5YmFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBsYXliYWNrSW5mbyB7CisgICAgICAgIHB1YmxpYyBpbnQgdm9sdW1lOworICAgICAgICBwdWJsaWMgaW50IHZvbHVtZU1heDsKKyAgICAgICAgcHVibGljIGludCB2b2x1bWVIYW5kbGluZyA9IE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19WT0xVTUVfRklYRUQ7CisgICAgICAgIHB1YmxpYyBpbnQgcGxheWJhY2tTdHJlYW0gPSBBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDOworICAgICAgICBwdWJsaWMgaW50IHBsYXliYWNrVHlwZSA9IE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19UWVBFX1JFTU9URTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB2b2x1bWUgdXBkYXRlcyBhcmUgcmVxdWVzdGVkIGJ5IHRoZSByZW1vdGUgY29udHJvbCBjbGllbnQuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBWb2x1bWVDYWxsYmFjayB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdm9sdW1lIHNob3VsZCBiZSBpbmNyZWFzZWQgb3IgZGVjcmVhc2VkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIEFuIGludGVnZXIgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB2b2x1bWUgaXMgdG8gYmUgaW5jcmVhc2VkCisgICAgICAgICAqIChwb3NpdGl2ZSB2YWx1ZSkgb3IgZGVjcmVhc2VkIChuZWdhdGl2ZSB2YWx1ZSkuCisgICAgICAgICAqIEZvciBidW5kbGVkIGNoYW5nZXMsIHRoZSBhYnNvbHV0ZSB2YWx1ZSBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBjaGFuZ2VzCisgICAgICAgICAqIGluIHRoZSBzYW1lIGRpcmVjdGlvbiwgZS5nLiArMyBjb3JyZXNwb25kcyB0byB0aHJlZSAidm9sdW1lIHVwIiBjaGFuZ2VzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KGludCBkaXJlY3Rpb24pOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdm9sdW1lIGZvciB0aGUgcm91dGUgc2hvdWxkIGJlIHNldCB0byB0aGUgZ2l2ZW4gdmFsdWUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB2b2x1bWUgQW4gaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBuZXcgdm9sdW1lIHZhbHVlIHRoYXQgc2hvdWxkIGJlIHVzZWQsCisgICAgICAgICAqIGFsd2F5cyBiZXR3ZWVuIDAgYW5kIHRoZSB2YWx1ZSBzZXQgYnkge0BsaW5rIFBsYXliYWNrSW5mbyN2b2x1bWVNYXh9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVTZXRSZXF1ZXN0KGludCB2b2x1bWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExlZ2FjeSBpbXBsZW1lbnRhdGlvbiBmb3IgcGxhdGZvcm0gdmVyc2lvbnMgcHJpb3IgdG8gSmVsbHliZWFuLgorICAgICAqIERvZXMgbm90aGluZy4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgTGVnYWN5SW1wbCBleHRlbmRzIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQgeworICAgICAgICBwdWJsaWMgTGVnYWN5SW1wbChDb250ZXh0IGNvbnRleHQsIE9iamVjdCByY2MpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHJjYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBmb3IgSmVsbHliZWFuLgorICAgICAqCisgICAgICogVGhlIGJhc2ljIGlkZWEgb2YgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB0byBhdHRhY2ggdGhlIFJDQyB0byBhIFVzZXJSb3V0ZUluZm8KKyAgICAgKiBpbiBvcmRlciB0byBob29rIHVwIHN0cmVhbSBtZXRhZGF0YSBhbmQgdm9sdW1lIGNhbGxiYWNrcyBiZWNhdXNlIHRoZXJlIGlzIG5vCisgICAgICogb3RoZXIgQVBJIGF2YWlsYWJsZSB0byBkbyBzbyBpbiB0aGlzIHBsYXRmb3JtIHZlcnNpb24uICBUaGUgVXNlclJvdXRlSW5mbyBpdHNlbGYKKyAgICAgKiBpcyBub3QgYXR0YWNoZWQgdG8gdGhlIE1lZGlhUm91dGVyIHNvIGl0IGlzIHRyYW5zcGFyZW50IHRvIHRoZSB1c2VyLgorICAgICAqLworICAgIC8vIEBAUmVxdWlyZXNBcGkoMTYpCisgICAgc3RhdGljIGNsYXNzIEplbGx5YmVhbkltcGwgZXh0ZW5kcyBSZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbVJvdXRlck9iajsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbVVzZXJSb3V0ZUNhdGVnb3J5T2JqOworICAgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtVXNlclJvdXRlT2JqOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVJlZ2lzdGVyZWQ7CisKKyAgICAgICAgcHVibGljIEplbGx5YmVhbkltcGwoQ29udGV4dCBjb250ZXh0LCBPYmplY3QgcmNjKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0LCByY2MpOworCisgICAgICAgICAgICBtUm91dGVyT2JqID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uZ2V0TWVkaWFSb3V0ZXIoY29udGV4dCk7CisgICAgICAgICAgICBtVXNlclJvdXRlQ2F0ZWdvcnlPYmogPSBNZWRpYVJvdXRlckplbGx5YmVhbi5jcmVhdGVSb3V0ZUNhdGVnb3J5KAorICAgICAgICAgICAgICAgICAgICBtUm91dGVyT2JqLCAiIiwgZmFsc2UpOworICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiA9IE1lZGlhUm91dGVySmVsbHliZWFuLmNyZWF0ZVVzZXJSb3V0ZSgKKyAgICAgICAgICAgICAgICAgICAgbVJvdXRlck9iaiwgbVVzZXJSb3V0ZUNhdGVnb3J5T2JqKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRQbGF5YmFja0luZm8oUGxheWJhY2tJbmZvIGluZm8pIHsKKyAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0Vm9sdW1lKAorICAgICAgICAgICAgICAgICAgICBtVXNlclJvdXRlT2JqLCBpbmZvLnZvbHVtZSk7CisgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZU1heCgKKyAgICAgICAgICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiwgaW5mby52b2x1bWVNYXgpOworICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVIYW5kbGluZygKKyAgICAgICAgICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiwgaW5mby52b2x1bWVIYW5kbGluZyk7CisgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFBsYXliYWNrU3RyZWFtKAorICAgICAgICAgICAgICAgICAgICBtVXNlclJvdXRlT2JqLCBpbmZvLnBsYXliYWNrU3RyZWFtKTsKKyAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0UGxheWJhY2tUeXBlKAorICAgICAgICAgICAgICAgICAgICBtVXNlclJvdXRlT2JqLCBpbmZvLnBsYXliYWNrVHlwZSk7CisKKyAgICAgICAgICAgIGlmICghbVJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICBtUmVnaXN0ZXJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVDYWxsYmFjayhtVXNlclJvdXRlT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uY3JlYXRlVm9sdW1lQ2FsbGJhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBWb2x1bWVDYWxsYmFja1dyYXBwZXIodGhpcykpKTsKKyAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFJlbW90ZUNvbnRyb2xDbGllbnQobVVzZXJSb3V0ZU9iaiwgbVJjYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBWb2x1bWVDYWxsYmFja1dyYXBwZXIKKyAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIE1lZGlhUm91dGVySmVsbHliZWFuLlZvbHVtZUNhbGxiYWNrIHsKKyAgICAgICAgICAgIC8vIFVuZm9ydHVuYXRlbHksIHRoZSBmcmFtZXdvcmsgbmV2ZXIgdW5yZWdpc3RlcnMgaXRzIHZvbHVtZSBvYnNlcnZlciBmcm9tCisgICAgICAgICAgICAvLyB0aGUgYXVkaW8gc2VydmljZSBzbyB0aGUgVXNlclJvdXRlSW5mbyBvYmplY3QgbWF5IGxlYWsgYWxvbmcgd2l0aAorICAgICAgICAgICAgLy8gYW55IGNhbGxiYWNrcyB0aGF0IHdlIGF0dGFjaCB0byBpdC4gIFVzZSBhIHdlYWsgcmVmZXJlbmNlIHRvIHByZXZlbnQKKyAgICAgICAgICAgIC8vIHRoZSB2b2x1bWUgY2FsbGJhY2sgZnJvbSBob2xkaW5nIHN0cm9uZyByZWZlcmVuY2VzIHRvIGFueXRoaW5nIGltcG9ydGFudC4KKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxKZWxseWJlYW5JbXBsPiBtSW1wbFdlYWs7CisKKyAgICAgICAgICAgIHB1YmxpYyBWb2x1bWVDYWxsYmFja1dyYXBwZXIoSmVsbHliZWFuSW1wbCBpbXBsKSB7CisgICAgICAgICAgICAgICAgbUltcGxXZWFrID0gbmV3IFdlYWtSZWZlcmVuY2U8SmVsbHliZWFuSW1wbD4oaW1wbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KE9iamVjdCByb3V0ZU9iaiwgaW50IGRpcmVjdGlvbikgeworICAgICAgICAgICAgICAgIEplbGx5YmVhbkltcGwgaW1wbCA9IG1JbXBsV2Vhay5nZXQoKTsKKyAgICAgICAgICAgICAgICBpZiAoaW1wbCAhPSBudWxsICYmIGltcGwubVZvbHVtZUNhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW1wbC5tVm9sdW1lQ2FsbGJhY2sub25Wb2x1bWVVcGRhdGVSZXF1ZXN0KGRpcmVjdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lU2V0UmVxdWVzdChPYmplY3Qgcm91dGVPYmosIGludCB2b2x1bWUpIHsKKyAgICAgICAgICAgICAgICBKZWxseWJlYW5JbXBsIGltcGwgPSBtSW1wbFdlYWsuZ2V0KCk7CisgICAgICAgICAgICAgICAgaWYgKGltcGwgIT0gbnVsbCAmJiBpbXBsLm1Wb2x1bWVDYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGltcGwubVZvbHVtZUNhbGxiYWNrLm9uVm9sdW1lU2V0UmVxdWVzdCh2b2x1bWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZW1vdGVQbGF5YmFja0NsaWVudC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlbW90ZVBsYXliYWNrQ2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZlMTQ5NwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZW1vdGVQbGF5YmFja0NsaWVudC5qYXZhCkBAIC0wLDAgKzEsMTA0NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuT2JqZWN0c0NvbXBhdDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCisvKioKKyAqIEEgaGVscGVyIGNsYXNzIGZvciBwbGF5aW5nIG1lZGlhIG9uIHJlbW90ZSByb3V0ZXMgdXNpbmcgdGhlIHJlbW90ZSBwbGF5YmFjayBwcm90b2NvbAorICogZGVmaW5lZCBieSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50fS4KKyAqIDxwPgorICogVGhlIGNsaWVudCBtYWludGFpbnMgc2Vzc2lvbiBzdGF0ZSBhbmQgb2ZmZXJzIGEgc2ltcGxpZmllZCBpbnRlcmZhY2UgZm9yIGlzc3VpbmcKKyAqIHJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGludGVudHMgdG8gYSBzaW5nbGUgcm91dGUuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBjbGFzcyBSZW1vdGVQbGF5YmFja0NsaWVudCB7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUmVtb3RlUGxheWJhY2tDbGllbnQiOworICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOworCisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIG1Sb3V0ZTsKKyAgICBwcml2YXRlIGZpbmFsIEFjdGlvblJlY2VpdmVyIG1BY3Rpb25SZWNlaXZlcjsKKyAgICBwcml2YXRlIGZpbmFsIFBlbmRpbmdJbnRlbnQgbUl0ZW1TdGF0dXNQZW5kaW5nSW50ZW50OworICAgIHByaXZhdGUgZmluYWwgUGVuZGluZ0ludGVudCBtU2Vzc2lvblN0YXR1c1BlbmRpbmdJbnRlbnQ7CisgICAgcHJpdmF0ZSBmaW5hbCBQZW5kaW5nSW50ZW50IG1NZXNzYWdlUGVuZGluZ0ludGVudDsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtUm91dGVTdXBwb3J0c1JlbW90ZVBsYXliYWNrOworICAgIHByaXZhdGUgYm9vbGVhbiBtUm91dGVTdXBwb3J0c1F1ZXVpbmc7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Sb3V0ZVN1cHBvcnRzU2Vzc2lvbk1hbmFnZW1lbnQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Sb3V0ZVN1cHBvcnRzTWVzc2FnaW5nOworCisgICAgU3RyaW5nIG1TZXNzaW9uSWQ7CisgICAgU3RhdHVzQ2FsbGJhY2sgbVN0YXR1c0NhbGxiYWNrOworICAgIE9uTWVzc2FnZVJlY2VpdmVkTGlzdGVuZXIgbU9uTWVzc2FnZVJlY2VpdmVkTGlzdGVuZXI7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgcmVtb3RlIHBsYXliYWNrIGNsaWVudCBmb3IgYSByb3V0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgbWVkaWEgcm91dGUuCisgICAgICovCisgICAgcHVibGljIFJlbW90ZVBsYXliYWNrQ2xpZW50KENvbnRleHQgY29udGV4dCwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRleHQgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChyb3V0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZSBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1Sb3V0ZSA9IHJvdXRlOworCisgICAgICAgIEludGVudEZpbHRlciBhY3Rpb25GaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CisgICAgICAgIGFjdGlvbkZpbHRlci5hZGRBY3Rpb24oQWN0aW9uUmVjZWl2ZXIuQUNUSU9OX0lURU1fU1RBVFVTX0NIQU5HRUQpOworICAgICAgICBhY3Rpb25GaWx0ZXIuYWRkQWN0aW9uKEFjdGlvblJlY2VpdmVyLkFDVElPTl9TRVNTSU9OX1NUQVRVU19DSEFOR0VEKTsKKyAgICAgICAgYWN0aW9uRmlsdGVyLmFkZEFjdGlvbihBY3Rpb25SZWNlaXZlci5BQ1RJT05fTUVTU0FHRV9SRUNFSVZFRCk7CisgICAgICAgIG1BY3Rpb25SZWNlaXZlciA9IG5ldyBBY3Rpb25SZWNlaXZlcigpOworICAgICAgICBjb250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobUFjdGlvblJlY2VpdmVyLCBhY3Rpb25GaWx0ZXIpOworCisgICAgICAgIEludGVudCBpdGVtU3RhdHVzSW50ZW50ID0gbmV3IEludGVudChBY3Rpb25SZWNlaXZlci5BQ1RJT05fSVRFTV9TVEFUVVNfQ0hBTkdFRCk7CisgICAgICAgIGl0ZW1TdGF0dXNJbnRlbnQuc2V0UGFja2FnZShjb250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOworICAgICAgICBtSXRlbVN0YXR1c1BlbmRpbmdJbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEJyb2FkY2FzdCgKKyAgICAgICAgICAgICAgICBjb250ZXh0LCAwLCBpdGVtU3RhdHVzSW50ZW50LCAwKTsKKworICAgICAgICBJbnRlbnQgc2Vzc2lvblN0YXR1c0ludGVudCA9IG5ldyBJbnRlbnQoQWN0aW9uUmVjZWl2ZXIuQUNUSU9OX1NFU1NJT05fU1RBVFVTX0NIQU5HRUQpOworICAgICAgICBzZXNzaW9uU3RhdHVzSW50ZW50LnNldFBhY2thZ2UoY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgbVNlc3Npb25TdGF0dXNQZW5kaW5nSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QoCisgICAgICAgICAgICAgICAgY29udGV4dCwgMCwgc2Vzc2lvblN0YXR1c0ludGVudCwgMCk7CisKKyAgICAgICAgSW50ZW50IG1lc3NhZ2VJbnRlbnQgPSBuZXcgSW50ZW50KEFjdGlvblJlY2VpdmVyLkFDVElPTl9NRVNTQUdFX1JFQ0VJVkVEKTsKKyAgICAgICAgbWVzc2FnZUludGVudC5zZXRQYWNrYWdlKGNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgICAgIG1NZXNzYWdlUGVuZGluZ0ludGVudCA9IFBlbmRpbmdJbnRlbnQuZ2V0QnJvYWRjYXN0KAorICAgICAgICAgICAgICAgIGNvbnRleHQsIDAsIG1lc3NhZ2VJbnRlbnQsIDApOworICAgICAgICBkZXRlY3RGZWF0dXJlcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbGVhc2VzIHJlc291cmNlcyBvd25lZCBieSB0aGUgY2xpZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7CisgICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcihtQWN0aW9uUmVjZWl2ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgcmVtb3RlIHBsYXliYWNrLgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHJlbW90ZSBwbGF5YmFjaywgdGhlbiBub25lIG9mIHRoZSBmdW5jdGlvbmFsaXR5CisgICAgICogb2ZmZXJlZCBieSB0aGUgY2xpZW50IHdpbGwgYmUgYXZhaWxhYmxlLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIGFsbCBvZiB0aGUgZm9sbG93aW5nCisgICAgICogYWN0aW9uczoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5fSwKKyAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TRUVLIHNlZWt9LAorICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TVEFUVVMgZ2V0IHN0YXR1c30sCisgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUEFVU0UgcGF1c2V9LAorICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFU1VNRSByZXN1bWV9LAorICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUT1Agc3RvcH0uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHJlbW90ZSBwbGF5YmFjayBpcyBzdXBwb3J0ZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Sb3V0ZVN1cHBvcnRzUmVtb3RlUGxheWJhY2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBxdWV1aW5nIGZlYXR1cmVzLgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHF1ZXVpbmcsIHRoZW4gYXQgbW9zdCBvbmUgbWVkaWEgaXRlbSBjYW4gYmUgcGxheWVkCisgICAgICogYXQgYSB0aW1lIGFuZCB0aGUge0BsaW5rICNlbnF1ZXVlfSBtZXRob2Qgd2lsbCBub3QgYmUgYXZhaWxhYmxlLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIGFsbCBvZiB0aGUgYmFzaWMgcmVtb3RlIHBsYXliYWNrCisgICAgICogYWN0aW9ucyBhbmQgYWxsIG9mIHRoZSBmb2xsb3dpbmcgYWN0aW9uczoKKyAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFIGVucXVldWV9LAorICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFTU9WRSByZW1vdmV9LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBxdWV1aW5nIGlzIHN1cHBvcnRlZC4gIEltcGxpZXMge0BsaW5rICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkfQorICAgICAqIGlzIGFsc28gdHJ1ZS4KKyAgICAgKgorICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1F1ZXVpbmdTdXBwb3J0ZWQoKSB7CisgICAgICAgIHJldHVybiBtUm91dGVTdXBwb3J0c1F1ZXVpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBzZXNzaW9uIG1hbmFnZW1lbnQgZmVhdHVyZXMuCisgICAgICogPHA+CisgICAgICogSWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgc2Vzc2lvbiBtYW5hZ2VtZW50LCB0aGVuIHRoZSBzZXNzaW9uIHdpbGwKKyAgICAgKiBub3QgYmUgY3JlYXRlZCB1bnRpbCB0aGUgZmlyc3QgbWVkaWEgaXRlbSBpcyBwbGF5ZWQuCisgICAgICogPC9wPjxwPgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgYWxsIG9mIHRoZSBiYXNpYyByZW1vdGUgcGxheWJhY2sKKyAgICAgKiBhY3Rpb25zIGFuZCBhbGwgb2YgdGhlIGZvbGxvd2luZyBhY3Rpb25zOgorICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUQVJUX1NFU1NJT04gc3RhcnQgc2Vzc2lvbn0sCisgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTIGdldCBzZXNzaW9uIHN0YXR1c30sCisgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5EX1NFU1NJT04gZW5kIHNlc3Npb259LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBzZXNzaW9uIG1hbmFnZW1lbnQgaXMgc3VwcG9ydGVkLgorICAgICAqIEltcGxpZXMge0BsaW5rICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkfSBpcyBhbHNvIHRydWUuCisgICAgICoKKyAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTZXNzaW9uTWFuYWdlbWVudFN1cHBvcnRlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Sb3V0ZVN1cHBvcnRzU2Vzc2lvbk1hbmFnZW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBtZXNzYWdlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIGFsbCBvZiB0aGUgYmFzaWMgcmVtb3RlIHBsYXliYWNrCisgICAgICogYWN0aW9ucyBhbmQgYWxsIG9mIHRoZSBmb2xsb3dpbmcgYWN0aW9uczoKKyAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVEFSVF9TRVNTSU9OIHN0YXJ0IHNlc3Npb259LAorICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NFTkRfTUVTU0FHRSBzZW5kIG1lc3NhZ2V9LAorICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VORF9TRVNTSU9OIGVuZCBzZXNzaW9ufS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgc2Vzc2lvbiBtYW5hZ2VtZW50IGlzIHN1cHBvcnRlZC4KKyAgICAgKiBJbXBsaWVzIHtAbGluayAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZH0gaXMgYWxzbyB0cnVlLgorICAgICAqCisgICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTWVzc2FnaW5nU3VwcG9ydGVkKCkgeworICAgICAgICByZXR1cm4gbVJvdXRlU3VwcG9ydHNNZXNzYWdpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY3VycmVudCBzZXNzaW9uIGlkIGlmIHRoZXJlIGlzIG9uZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgc2Vzc2lvbiBpZCwgb3IgbnVsbCBpZiBub25lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2Vzc2lvbklkKCkgeworICAgICAgICByZXR1cm4gbVNlc3Npb25JZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHNlc3Npb24gaWQuCisgICAgICogPHA+CisgICAgICogSXQgaXMgdXN1YWxseSBub3QgbmVjZXNzYXJ5IHRvIHNldCB0aGUgc2Vzc2lvbiBpZCBleHBsaWNpdGx5IHNpbmNlCisgICAgICogaXQgaXMgY3JlYXRlZCBhcyBhIHNpZGUtZWZmZWN0IG9mIG90aGVyIHJlcXVlc3RzIHN1Y2ggYXMKKyAgICAgKiB7QGxpbmsgI3BsYXl9LCB7QGxpbmsgI2VucXVldWV9LCBhbmQge0BsaW5rICNzdGFydFNlc3Npb259LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIG5ldyBzZXNzaW9uIGlkLCBvciBudWxsIGlmIG5vbmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvbklkKFN0cmluZyBzZXNzaW9uSWQpIHsKKyAgICAgICAgaWYgKCFPYmplY3RzQ29tcGF0LmVxdWFscyhtU2Vzc2lvbklkLCBzZXNzaW9uSWQpKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTZXNzaW9uIGlkIGlzIG5vdzogIiArIHNlc3Npb25JZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgICAgICAgICAgaWYgKG1TdGF0dXNDYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVN0YXR1c0NhbGxiYWNrLm9uU2Vzc2lvbkNoYW5nZWQoc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2xpZW50IGN1cnJlbnRseSBoYXMgYSBzZXNzaW9uLgorICAgICAqIDxwPgorICAgICAqIEVxdWl2YWxlbnQgdG8gY2hlY2tpbmcgd2hldGhlciB7QGxpbmsgI2dldFNlc3Npb25JZH0gcmV0dXJucyBhIG5vbi1udWxsIHJlc3VsdC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlcmUgaXMgYSBjdXJyZW50IHNlc3Npb24uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzU2Vzc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIG1TZXNzaW9uSWQgIT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgY2FsbGJhY2sgdGhhdCBzaG91bGQgcmVjZWl2ZSBzdGF0dXMgdXBkYXRlcyB3aGVuIHRoZSBzdGF0ZSBvZgorICAgICAqIG1lZGlhIHNlc3Npb25zIG9yIG1lZGlhIGl0ZW1zIGNyZWF0ZWQgYnkgdGhpcyBpbnN0YW5jZSBvZiB0aGUgcmVtb3RlCisgICAgICogcGxheWJhY2sgY2xpZW50IGNoYW5nZXMuCisgICAgICogPHA+CisgICAgICogVGhlIGNhbGxiYWNrIHNob3VsZCBiZSBzZXQgYmVmb3JlIHRoZSBzZXNzaW9uIGlzIGNyZWF0ZWQgb3IgYW55IHBsYXkKKyAgICAgKiBjb21tYW5kcyBhcmUgaXNzdWVkLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gc2V0LiAgTWF5IGJlIG51bGwgdG8gcmVtb3ZlIHRoZSBwcmV2aW91cyBjYWxsYmFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdGF0dXNDYWxsYmFjayhTdGF0dXNDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBtU3RhdHVzQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgY2FsbGJhY2sgdGhhdCBzaG91bGQgcmVjZWl2ZSBtZXNzYWdlcyB3aGVuIGEgbWVzc2FnZSBpcyBzZW50IGZyb20KKyAgICAgKiBtZWRpYSBzZXNzaW9ucyBjcmVhdGVkIGJ5IHRoaXMgaW5zdGFuY2Ugb2YgdGhlIHJlbW90ZSBwbGF5YmFjayBjbGllbnQgY2hhbmdlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2FsbGJhY2sgc2hvdWxkIGJlIHNldCBiZWZvcmUgdGhlIHNlc3Npb24gaXMgY3JlYXRlZC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGNhbGxiYWNrIHRvIHNldC4gIE1heSBiZSBudWxsIHRvIHJlbW92ZSB0aGUgcHJldmlvdXMgY2FsbGJhY2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lcihPbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIG1Pbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIHBsYXkgYSBtZWRpYSBpdGVtLgorICAgICAqIDxwPgorICAgICAqIENsZWFycyB0aGUgcXVldWUgYW5kIHN0YXJ0cyBwbGF5aW5nIHRoZSBuZXcgaXRlbSBpbW1lZGlhdGVseS4gIElmIHRoZSBxdWV1ZQorICAgICAqIHdhcyBwcmV2aW91c2x5IHBhdXNlZCwgdGhlbiBpdCBpcyByZXN1bWVkIGFzIGEgc2lkZS1lZmZlY3Qgb2YgdGhpcyByZXF1ZXN0LgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4gIElmIG5vIHNlc3Npb24gaXMgYXZhaWxhYmxlLCB0aGVuCisgICAgICogb25lIGlzIGNyZWF0ZWQgaW1wbGljaXRseS4KKyAgICAgKiA8L3A+PHA+CisgICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgQUNUSU9OX1BMQVl9IGZvcgorICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRlbnRVcmkgVGhlIGNvbnRlbnQgVXJpIHRvIHBsYXkuCisgICAgICogQHBhcmFtIG1pbWVUeXBlIFRoZSBtaW1lIHR5cGUgb2YgdGhlIGNvbnRlbnQsIG9yIG51bGwgaWYgdW5rbm93bi4KKyAgICAgKiBAcGFyYW0gcG9zaXRpb25NaWxsaXMgVGhlIGluaXRpYWwgY29udGVudCBwb3NpdGlvbiBmb3IgdGhlIGl0ZW0gaW4gbWlsbGlzZWNvbmRzLAorICAgICAqIG9yIDxjb2RlPjA8L2NvZGU+IHRvIHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcuCisgICAgICogQHBhcmFtIG1ldGFkYXRhIFRoZSBtZWRpYSBpdGVtIG1ldGFkYXRhIGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lLgorICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQorICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVl9IGludGVudCwgb3IgbnVsbCBpZiBub25lLgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCisgICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHJlbW90ZSBwbGF5YmFjay4KKyAgICAgKgorICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZCisgICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBsYXkoVXJpIGNvbnRlbnRVcmksIFN0cmluZyBtaW1lVHlwZSwgQnVuZGxlIG1ldGFkYXRhLAorICAgICAgICAgICAgbG9uZyBwb3NpdGlvbk1pbGxpcywgQnVuZGxlIGV4dHJhcywgSXRlbUFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIHBsYXlPckVucXVldWUoY29udGVudFVyaSwgbWltZVR5cGUsIG1ldGFkYXRhLCBwb3NpdGlvbk1pbGxpcywKKyAgICAgICAgICAgICAgICBleHRyYXMsIGNhbGxiYWNrLCBNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1BMQVkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBlbnF1ZXVlIGEgbWVkaWEgaXRlbS4KKyAgICAgKiA8cD4KKyAgICAgKiBFbnF1ZXVlcyBhIG5ldyBpdGVtIHRvIHBsYXkuICBJZiB0aGUgcXVldWUgd2FzIHByZXZpb3VzbHkgcGF1c2VkLCB0aGVuIHdpbGwKKyAgICAgKiByZW1haW4gcGF1c2VkLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4gIElmIG5vIHNlc3Npb24gaXMgYXZhaWxhYmxlLCB0aGVuCisgICAgICogb25lIGlzIGNyZWF0ZWQgaW1wbGljaXRseS4KKyAgICAgKiA8L3A+PHA+CisgICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUUgQUNUSU9OX0VOUVVFVUV9IGZvcgorICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRlbnRVcmkgVGhlIGNvbnRlbnQgVXJpIHRvIGVucXVldWUuCisgICAgICogQHBhcmFtIG1pbWVUeXBlIFRoZSBtaW1lIHR5cGUgb2YgdGhlIGNvbnRlbnQsIG9yIG51bGwgaWYgdW5rbm93bi4KKyAgICAgKiBAcGFyYW0gcG9zaXRpb25NaWxsaXMgVGhlIGluaXRpYWwgY29udGVudCBwb3NpdGlvbiBmb3IgdGhlIGl0ZW0gaW4gbWlsbGlzZWNvbmRzLAorICAgICAqIG9yIDxjb2RlPjA8L2NvZGU+IHRvIHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcuCisgICAgICogQHBhcmFtIG1ldGFkYXRhIFRoZSBtZWRpYSBpdGVtIG1ldGFkYXRhIGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lLgorICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQorICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUV9IGludGVudCwgb3IgbnVsbCBpZiBub25lLgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCisgICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHF1ZXVpbmcuCisgICAgICoKKyAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5RVUVVRQorICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKKyAgICAgKiBAc2VlICNpc1F1ZXVpbmdTdXBwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbnF1ZXVlKFVyaSBjb250ZW50VXJpLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBtZXRhZGF0YSwKKyAgICAgICAgICAgIGxvbmcgcG9zaXRpb25NaWxsaXMsIEJ1bmRsZSBleHRyYXMsIEl0ZW1BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBwbGF5T3JFbnF1ZXVlKGNvbnRlbnRVcmksIG1pbWVUeXBlLCBtZXRhZGF0YSwgcG9zaXRpb25NaWxsaXMsCisgICAgICAgICAgICAgICAgZXh0cmFzLCBjYWxsYmFjaywgTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9FTlFVRVVFKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGxheU9yRW5xdWV1ZShVcmkgY29udGVudFVyaSwgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgbWV0YWRhdGEsCisgICAgICAgICAgICBsb25nIHBvc2l0aW9uTWlsbGlzLCBCdW5kbGUgZXh0cmFzLAorICAgICAgICAgICAgZmluYWwgSXRlbUFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrLCBTdHJpbmcgYWN0aW9uKSB7CisgICAgICAgIGlmIChjb250ZW50VXJpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRlbnRVcmkgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHRocm93SWZSZW1vdGVQbGF5YmFja05vdFN1cHBvcnRlZCgpOworICAgICAgICBpZiAoYWN0aW9uLmVxdWFscyhNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0VOUVVFVUUpKSB7CisgICAgICAgICAgICB0aHJvd0lmUXVldWluZ05vdFN1cHBvcnRlZCgpOworICAgICAgICB9CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoYWN0aW9uKTsKKyAgICAgICAgaW50ZW50LnNldERhdGFBbmRUeXBlKGNvbnRlbnRVcmksIG1pbWVUeXBlKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIsCisgICAgICAgICAgICAgICAgbUl0ZW1TdGF0dXNQZW5kaW5nSW50ZW50KTsKKyAgICAgICAgaWYgKG1ldGFkYXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9NRVRBREFUQSwgbWV0YWRhdGEpOworICAgICAgICB9CisgICAgICAgIGlmIChwb3NpdGlvbk1pbGxpcyAhPSAwKSB7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fQ09OVEVOVF9QT1NJVElPTiwgcG9zaXRpb25NaWxsaXMpOworICAgICAgICB9CisgICAgICAgIHBlcmZvcm1JdGVtQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgbnVsbCwgZXh0cmFzLCBjYWxsYmFjayk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIHNlZWsgdG8gYSBuZXcgcG9zaXRpb24gaW4gYSBtZWRpYSBpdGVtLgorICAgICAqIDxwPgorICAgICAqIFNlZWtzIHRvIGEgbmV3IHBvc2l0aW9uLiAgSWYgdGhlIHF1ZXVlIHdhcyBwcmV2aW91c2x5IHBhdXNlZCB0aGVuIGl0CisgICAgICogcmVtYWlucyBwYXVzZWQgYnV0IHRoZSBpdGVtJ3MgbmV3IHBvc2l0aW9uIGlzIHN0aWxsIHJlbWVtYmVyZWQuCisgICAgICogPC9wPjxwPgorICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU0VFSyBBQ1RJT05fU0VFS30gZm9yCisgICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gaXRlbUlkIFRoZSBpdGVtIGlkLgorICAgICAqIEBwYXJhbSBwb3NpdGlvbk1pbGxpcyBUaGUgbmV3IGNvbnRlbnQgcG9zaXRpb24gZm9yIHRoZSBpdGVtIGluIG1pbGxpc2Vjb25kcywKKyAgICAgKiBvciA8Y29kZT4wPC9jb2RlPiB0byBzdGFydCBhdCB0aGUgYmVnaW5uaW5nLgorICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQorICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NFRUt9IGludGVudCwgb3IgbnVsbCBpZiBub25lLgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCisgICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uCisgICAgICoKKyAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU0VFSworICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZWVrKFN0cmluZyBpdGVtSWQsIGxvbmcgcG9zaXRpb25NaWxsaXMsIEJ1bmRsZSBleHRyYXMsCisgICAgICAgICAgICBJdGVtQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgaWYgKGl0ZW1JZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtSWQgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TRUVLKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX0NPTlRFTlRfUE9TSVRJT04sIHBvc2l0aW9uTWlsbGlzKTsKKyAgICAgICAgcGVyZm9ybUl0ZW1BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBpdGVtSWQsIGV4dHJhcywgY2FsbGJhY2spOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBnZXQgdGhlIHN0YXR1cyBvZiBhIG1lZGlhIGl0ZW0uCisgICAgICogPHA+CisgICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uCisgICAgICogPC9wPjxwPgorICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9HRVRfU1RBVFVTIEFDVElPTl9HRVRfU1RBVFVTfSBmb3IKKyAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpdGVtSWQgVGhlIGl0ZW0gaWQuCisgICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCisgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NUQVRVU30gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCisgICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KKyAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9HRVRfU1RBVFVTCisgICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGdldFN0YXR1cyhTdHJpbmcgaXRlbUlkLCBCdW5kbGUgZXh0cmFzLCBJdGVtQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgaWYgKGl0ZW1JZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtSWQgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9HRVRfU1RBVFVTKTsKKyAgICAgICAgcGVyZm9ybUl0ZW1BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBpdGVtSWQsIGV4dHJhcywgY2FsbGJhY2spOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byByZW1vdmUgYSBtZWRpYSBpdGVtIGZyb20gdGhlIHF1ZXVlLgorICAgICAqIDxwPgorICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLgorICAgICAqIDwvcD48cD4KKyAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVNT1ZFIEFDVElPTl9SRU1PVkV9IGZvcgorICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGl0ZW1JZCBUaGUgaXRlbSBpZC4KKyAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKKyAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRU1PVkV9IGludGVudCwgb3IgbnVsbCBpZiBub25lLgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCisgICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBxdWV1aW5nLgorICAgICAqCisgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFTU9WRQorICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKKyAgICAgKiBAc2VlICNpc1F1ZXVpbmdTdXBwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmUoU3RyaW5nIGl0ZW1JZCwgQnVuZGxlIGV4dHJhcywgSXRlbUFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIGlmIChpdGVtSWQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbUlkIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvd0lmUXVldWluZ05vdFN1cHBvcnRlZCgpOworICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOworCisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUkVNT1ZFKTsKKyAgICAgICAgcGVyZm9ybUl0ZW1BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBpdGVtSWQsIGV4dHJhcywgY2FsbGJhY2spOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBwYXVzZSBtZWRpYSBwbGF5YmFjay4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4gIElmIHBsYXliYWNrIGlzIGFscmVhZHkgcGF1c2VkCisgICAgICogdGhlbiB0aGUgcmVxdWVzdCBoYXMgbm8gZWZmZWN0LgorICAgICAqIDwvcD48cD4KKyAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUEFVU0UgQUNUSU9OX1BBVVNFfSBmb3IKKyAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQorICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BBVVNFfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgorICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgorICAgICAqCisgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BBVVNFCisgICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhdXNlKEJ1bmRsZSBleHRyYXMsIFNlc3Npb25BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOworCisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUEFVU0UpOworICAgICAgICBwZXJmb3JtU2Vzc2lvbkFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGV4dHJhcywgY2FsbGJhY2spOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byByZXN1bWUgKHVucGF1c2UpIG1lZGlhIHBsYXliYWNrLgorICAgICAqIDxwPgorICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLiAgSWYgcGxheWJhY2sgaXMgbm90IHBhdXNlZAorICAgICAqIHRoZW4gdGhlIHJlcXVlc3QgaGFzIG5vIGVmZmVjdC4KKyAgICAgKiA8L3A+PHA+CisgICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFU1VNRSBBQ1RJT05fUkVTVU1FfSBmb3IKKyAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQorICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFU1VNRX0gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCisgICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KKyAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRVNVTUUKKyAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzdW1lKEJ1bmRsZSBleHRyYXMsIFNlc3Npb25BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOworCisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUkVTVU1FKTsKKyAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBleHRyYXMsIGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gc3RvcCBtZWRpYSBwbGF5YmFjayBhbmQgY2xlYXIgdGhlIG1lZGlhIHBsYXliYWNrIHF1ZXVlLgorICAgICAqIDxwPgorICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLiAgSWYgdGhlIHF1ZXVlIGlzIGFscmVhZHkKKyAgICAgKiBlbXB0eSB0aGVuIHRoZSByZXF1ZXN0IGhhcyBubyBlZmZlY3QuCisgICAgICogPC9wPjxwPgorICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVE9QIEFDVElPTl9TVE9QfSBmb3IKKyAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQorICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUT1B9IGludGVudCwgb3IgbnVsbCBpZiBub25lLgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCisgICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uCisgICAgICoKKyAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RPUAorICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZSBleHRyYXMsIFNlc3Npb25BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOworCisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU1RPUCk7CisgICAgICAgIHBlcmZvcm1TZXNzaW9uQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgZXh0cmFzLCBjYWxsYmFjayk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIHN0YXJ0IGEgbmV3IG1lZGlhIHBsYXliYWNrIHNlc3Npb24uCisgICAgICogPHA+CisgICAgICogVGhlIGFwcGxpY2F0aW9uIG11c3Qgd2FpdCBmb3IgdGhlIGNhbGxiYWNrIHRvIGluZGljYXRlIHRoYXQgdGhpcyByZXF1ZXN0CisgICAgICogaXMgY29tcGxldGUgYmVmb3JlIGlzc3Vpbmcgb3RoZXIgcmVxdWVzdHMgdGhhdCBhZmZlY3QgdGhlIHNlc3Npb24uICBJZiB0aGlzCisgICAgICogcmVxdWVzdCBpcyBzdWNjZXNzZnVsIHRoZW4gdGhlIHByZXZpb3VzIHNlc3Npb24gd2lsbCBiZSBpbnZhbGlkYXRlZC4KKyAgICAgKiA8L3A+PHA+CisgICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUQVJUX1NFU1NJT04gQUNUSU9OX1NUQVJUX1NFU1NJT059CisgICAgICogZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCisgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RBUlRfU0VTU0lPTn0gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCisgICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KKyAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgc2Vzc2lvbiBtYW5hZ2VtZW50LgorICAgICAqCisgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUQVJUX1NFU1NJT04KKyAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCisgICAgICogQHNlZSAjaXNTZXNzaW9uTWFuYWdlbWVudFN1cHBvcnRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0U2Vzc2lvbihCdW5kbGUgZXh0cmFzLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgdGhyb3dJZlNlc3Npb25NYW5hZ2VtZW50Tm90U3VwcG9ydGVkKCk7CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TVEFSVF9TRVNTSU9OKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX1NUQVRVU19VUERBVEVfUkVDRUlWRVIsCisgICAgICAgICAgICAgICAgbVNlc3Npb25TdGF0dXNQZW5kaW5nSW50ZW50KTsKKyAgICAgICAgaWYgKG1Sb3V0ZVN1cHBvcnRzTWVzc2FnaW5nKSB7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX01FU1NBR0VfUkVDRUlWRVIsIG1NZXNzYWdlUGVuZGluZ0ludGVudCk7CisgICAgICAgIH0KKyAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oaW50ZW50LCBudWxsLCBleHRyYXMsIGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kcyBhIG1lc3NhZ2UuCisgICAgICogPHA+CisgICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uCisgICAgICogPC9wPjxwPgorICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TRU5EX01FU1NBR0V9IGZvcgorICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgQSBidW5kbGUgbWVzc2FnZSBkZW5vdGluZyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0VYVFJBX01FU1NBR0V9LgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU0VORF9NRVNTQUdFCisgICAgICogQHNlZSAjaXNNZXNzYWdpbmdTdXBwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZW5kTWVzc2FnZShCdW5kbGUgbWVzc2FnZSwgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7CisgICAgICAgIHRocm93SWZNZXNzYWdlTm90U3VwcG9ydGVkKCk7CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TRU5EX01FU1NBR0UpOworICAgICAgICBwZXJmb3JtU2Vzc2lvbkFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIG1lc3NhZ2UsIGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHBsYXliYWNrIHNlc3Npb24uCisgICAgICogPHA+CisgICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uCisgICAgICogPC9wPjxwPgorICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMKKyAgICAgKiBBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTfSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKKyAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVN9IGludGVudCwgb3IgbnVsbCBpZiBub25lLgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCisgICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBzZXNzaW9uIG1hbmFnZW1lbnQuCisgICAgICoKKyAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTCisgICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAorICAgICAqIEBzZWUgI2lzU2Vzc2lvbk1hbmFnZW1lbnRTdXBwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBnZXRTZXNzaW9uU3RhdHVzKEJ1bmRsZSBleHRyYXMsIFNlc3Npb25BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICB0aHJvd0lmU2Vzc2lvbk1hbmFnZW1lbnROb3RTdXBwb3J0ZWQoKTsKKyAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUyk7CisgICAgICAgIHBlcmZvcm1TZXNzaW9uQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgZXh0cmFzLCBjYWxsYmFjayk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIGVuZCB0aGUgbWVkaWEgcGxheWJhY2sgc2Vzc2lvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4gIElmIHRoaXMgcmVxdWVzdCBpcyBzdWNjZXNzZnVsLAorICAgICAqIHRoZSB7QGxpbmsgI2dldFNlc3Npb25JZCBzZXNzaW9uIGlkIHByb3BlcnR5fSB3aWxsIGJlIHNldCB0byBudWxsIGFmdGVyCisgICAgICogdGhlIGNhbGxiYWNrIGlzIGludm9rZWQuCisgICAgICogPC9wPjxwPgorICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTkRfU0VTU0lPTiBBQ1RJT05fRU5EX1NFU1NJT059CisgICAgICogZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCisgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5EX1NFU1NJT059IGludGVudCwgb3IgbnVsbCBpZiBub25lLgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCisgICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBzZXNzaW9uIG1hbmFnZW1lbnQuCisgICAgICoKKyAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5EX1NFU1NJT04KKyAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCisgICAgICogQHNlZSAjaXNTZXNzaW9uTWFuYWdlbWVudFN1cHBvcnRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVuZFNlc3Npb24oQnVuZGxlIGV4dHJhcywgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIHRocm93SWZTZXNzaW9uTWFuYWdlbWVudE5vdFN1cHBvcnRlZCgpOworICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOworCisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fRU5EX1NFU1NJT04pOworICAgICAgICBwZXJmb3JtU2Vzc2lvbkFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGV4dHJhcywgY2FsbGJhY2spOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwZXJmb3JtSXRlbUFjdGlvbihmaW5hbCBJbnRlbnQgaW50ZW50LAorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNlc3Npb25JZCwgZmluYWwgU3RyaW5nIGl0ZW1JZCwKKyAgICAgICAgICAgIEJ1bmRsZSBleHRyYXMsIGZpbmFsIEl0ZW1BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBpbnRlbnQuYWRkQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyk7CisgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX0lELCBzZXNzaW9uSWQpOworICAgICAgICB9CisgICAgICAgIGlmIChpdGVtSWQgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX0lELCBpdGVtSWQpOworICAgICAgICB9CisgICAgICAgIGlmIChleHRyYXMgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhcyhleHRyYXMpOworICAgICAgICB9CisgICAgICAgIGxvZ1JlcXVlc3QoaW50ZW50KTsKKyAgICAgICAgbVJvdXRlLnNlbmRDb250cm9sUmVxdWVzdChpbnRlbnQsIG5ldyBNZWRpYVJvdXRlci5Db250cm9sUmVxdWVzdENhbGxiYWNrKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSkgeworICAgICAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZFJlc3VsdCA9IGluZmVyTWlzc2luZ1Jlc3VsdChzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXRTdHJpbmcoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fSUQpKTsKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMgPSBNZWRpYVNlc3Npb25TdGF0dXMuZnJvbUJ1bmRsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldEJ1bmRsZShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9TVEFUVVMpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZFJlc3VsdCA9IGluZmVyTWlzc2luZ1Jlc3VsdChpdGVtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXRTdHJpbmcoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fSUQpKTsKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMgPSBNZWRpYUl0ZW1TdGF0dXMuZnJvbUJ1bmRsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldEJ1bmRsZShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9TVEFUVVMpKTsKKyAgICAgICAgICAgICAgICAgICAgYWRvcHRTZXNzaW9uKHNlc3Npb25JZFJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uSWRSZXN1bHQgIT0gbnVsbCAmJiBpdGVtSWRSZXN1bHQgIT0gbnVsbCAmJiBpdGVtU3RhdHVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJlY2VpdmVkIHJlc3VsdCBmcm9tICIgKyBpbnRlbnQuZ2V0QWN0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogZGF0YT0iICsgYnVuZGxlVG9TdHJpbmcoZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgc2Vzc2lvbklkPSIgKyBzZXNzaW9uSWRSZXN1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgc2Vzc2lvblN0YXR1cz0iICsgc2Vzc2lvblN0YXR1cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBpdGVtSWQ9IiArIGl0ZW1JZFJlc3VsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBpdGVtU3RhdHVzPSIgKyBpdGVtU3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUmVzdWx0KGRhdGEsIHNlc3Npb25JZFJlc3VsdCwgc2Vzc2lvblN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUlkUmVzdWx0LCBpdGVtU3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBoYW5kbGVJbnZhbGlkUmVzdWx0KGludGVudCwgY2FsbGJhY2ssIGRhdGEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU3RyaW5nIGVycm9yLCBCdW5kbGUgZGF0YSkgeworICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKGludGVudCwgY2FsbGJhY2ssIGVycm9yLCBkYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBlcmZvcm1TZXNzaW9uQWN0aW9uKGZpbmFsIEludGVudCBpbnRlbnQsIGZpbmFsIFN0cmluZyBzZXNzaW9uSWQsCisgICAgICAgICAgICBCdW5kbGUgZXh0cmFzLCBmaW5hbCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgaW50ZW50LmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spOworICAgICAgICBpZiAoc2Vzc2lvbklkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9JRCwgc2Vzc2lvbklkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXh0cmFzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYXMoZXh0cmFzKTsKKyAgICAgICAgfQorICAgICAgICBsb2dSZXF1ZXN0KGludGVudCk7CisgICAgICAgIG1Sb3V0ZS5zZW5kQ29udHJvbFJlcXVlc3QoaW50ZW50LCBuZXcgTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjaygpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWRSZXN1bHQgPSBpbmZlck1pc3NpbmdSZXN1bHQoc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0U3RyaW5nKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX0lEKSk7CisgICAgICAgICAgICAgICAgICAgIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzID0gTWVkaWFTZXNzaW9uU3RhdHVzLmZyb21CdW5kbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXRCdW5kbGUoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fU1RBVFVTKSk7CisgICAgICAgICAgICAgICAgICAgIGFkb3B0U2Vzc2lvbihzZXNzaW9uSWRSZXN1bHQpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbklkUmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJlY2VpdmVkIHJlc3VsdCBmcm9tICIgKyBpbnRlbnQuZ2V0QWN0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogZGF0YT0iICsgYnVuZGxlVG9TdHJpbmcoZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgc2Vzc2lvbklkPSIgKyBzZXNzaW9uSWRSZXN1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgc2Vzc2lvblN0YXR1cz0iICsgc2Vzc2lvblN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUmVzdWx0KGRhdGEsIHNlc3Npb25JZFJlc3VsdCwgc2Vzc2lvblN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fRU5EX1NFU1NJT04pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBzZXNzaW9uSWRSZXN1bHQuZXF1YWxzKG1TZXNzaW9uSWQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNlc3Npb25JZChudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaGFuZGxlSW52YWxpZFJlc3VsdChpbnRlbnQsIGNhbGxiYWNrLCBkYXRhKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFN0cmluZyBlcnJvciwgQnVuZGxlIGRhdGEpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcihpbnRlbnQsIGNhbGxiYWNrLCBlcnJvciwgZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHZvaWQgYWRvcHRTZXNzaW9uKFN0cmluZyBzZXNzaW9uSWQpIHsKKyAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXRTZXNzaW9uSWQoc2Vzc2lvbklkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgaGFuZGxlSW52YWxpZFJlc3VsdChJbnRlbnQgaW50ZW50LCBBY3Rpb25DYWxsYmFjayBjYWxsYmFjaywKKyAgICAgICAgICAgIEJ1bmRsZSBkYXRhKSB7CisgICAgICAgIExvZy53KFRBRywgIlJlY2VpdmVkIGludmFsaWQgcmVzdWx0IGRhdGEgZnJvbSAiICsgaW50ZW50LmdldEFjdGlvbigpCisgICAgICAgICAgICAgICAgKyAiOiBkYXRhPSIgKyBidW5kbGVUb1N0cmluZyhkYXRhKSk7CisgICAgICAgIGNhbGxiYWNrLm9uRXJyb3IobnVsbCwgTWVkaWFDb250cm9sSW50ZW50LkVSUk9SX1VOS05PV04sIGRhdGEpOworICAgIH0KKworICAgIHZvaWQgaGFuZGxlRXJyb3IoSW50ZW50IGludGVudCwgQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2ssCisgICAgICAgICAgICBTdHJpbmcgZXJyb3IsIEJ1bmRsZSBkYXRhKSB7CisgICAgICAgIGZpbmFsIGludCBjb2RlOworICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICBjb2RlID0gZGF0YS5nZXRJbnQoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0VSUk9SX0NPREUsCisgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29udHJvbEludGVudC5FUlJPUl9VTktOT1dOKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvZGUgPSBNZWRpYUNvbnRyb2xJbnRlbnQuRVJST1JfVU5LTk9XTjsKKyAgICAgICAgfQorICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlJlY2VpdmVkIGVycm9yIGZyb20gIiArIGludGVudC5nZXRBY3Rpb24oKQorICAgICAgICAgICAgICAgICAgICArICI6IGVycm9yPSIgKyBlcnJvcgorICAgICAgICAgICAgICAgICAgICArICIsIGNvZGU9IiArIGNvZGUKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBkYXRhPSIgKyBidW5kbGVUb1N0cmluZyhkYXRhKSk7CisgICAgICAgIH0KKyAgICAgICAgY2FsbGJhY2sub25FcnJvcihlcnJvciwgY29kZSwgZGF0YSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRldGVjdEZlYXR1cmVzKCkgeworICAgICAgICBtUm91dGVTdXBwb3J0c1JlbW90ZVBsYXliYWNrID0gcm91dGVTdXBwb3J0c0FjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1BMQVkpCisgICAgICAgICAgICAgICAgJiYgcm91dGVTdXBwb3J0c0FjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1NFRUspCisgICAgICAgICAgICAgICAgJiYgcm91dGVTdXBwb3J0c0FjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0dFVF9TVEFUVVMpCisgICAgICAgICAgICAgICAgJiYgcm91dGVTdXBwb3J0c0FjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1BBVVNFKQorICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9SRVNVTUUpCisgICAgICAgICAgICAgICAgJiYgcm91dGVTdXBwb3J0c0FjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1NUT1ApOworICAgICAgICBtUm91dGVTdXBwb3J0c1F1ZXVpbmcgPSBtUm91dGVTdXBwb3J0c1JlbW90ZVBsYXliYWNrCisgICAgICAgICAgICAgICAgJiYgcm91dGVTdXBwb3J0c0FjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0VOUVVFVUUpCisgICAgICAgICAgICAgICAgJiYgcm91dGVTdXBwb3J0c0FjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1JFTU9WRSk7CisgICAgICAgIG1Sb3V0ZVN1cHBvcnRzU2Vzc2lvbk1hbmFnZW1lbnQgPSBtUm91dGVTdXBwb3J0c1JlbW90ZVBsYXliYWNrCisgICAgICAgICAgICAgICAgJiYgcm91dGVTdXBwb3J0c0FjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1NUQVJUX1NFU1NJT04pCisgICAgICAgICAgICAgICAgJiYgcm91dGVTdXBwb3J0c0FjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUykKKyAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fRU5EX1NFU1NJT04pOworICAgICAgICBtUm91dGVTdXBwb3J0c01lc3NhZ2luZyA9IGRvZXNSb3V0ZVN1cHBvcnRNZXNzYWdpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gcm91dGVTdXBwb3J0c0FjdGlvbihTdHJpbmcgYWN0aW9uKSB7CisgICAgICAgIHJldHVybiBtUm91dGUuc3VwcG9ydHNDb250cm9sQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0ssIGFjdGlvbik7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGRvZXNSb3V0ZVN1cHBvcnRNZXNzYWdpbmcoKSB7CisgICAgICAgIGZvciAoSW50ZW50RmlsdGVyIGZpbHRlciA6IG1Sb3V0ZS5nZXRDb250cm9sRmlsdGVycygpKSB7CisgICAgICAgICAgICBpZiAoZmlsdGVyLmhhc0FjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1NFTkRfTUVTU0FHRSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRocm93SWZSZW1vdGVQbGF5YmFja05vdFN1cHBvcnRlZCgpIHsKKyAgICAgICAgaWYgKCFtUm91dGVTdXBwb3J0c1JlbW90ZVBsYXliYWNrKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHJlbW90ZSBwbGF5YmFjay4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0aHJvd0lmUXVldWluZ05vdFN1cHBvcnRlZCgpIHsKKyAgICAgICAgaWYgKCFtUm91dGVTdXBwb3J0c1F1ZXVpbmcpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgcXVldWluZy4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0aHJvd0lmU2Vzc2lvbk1hbmFnZW1lbnROb3RTdXBwb3J0ZWQoKSB7CisgICAgICAgIGlmICghbVJvdXRlU3VwcG9ydHNTZXNzaW9uTWFuYWdlbWVudCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCAiCisgICAgICAgICAgICAgICAgICAgICsgInNlc3Npb24gbWFuYWdlbWVudC4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0aHJvd0lmTWVzc2FnZU5vdFN1cHBvcnRlZCgpIHsKKyAgICAgICAgaWYgKCFtUm91dGVTdXBwb3J0c01lc3NhZ2luZykgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBtZXNzYWdlLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCkgeworICAgICAgICBpZiAobVNlc3Npb25JZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nIGluZmVyTWlzc2luZ1Jlc3VsdChTdHJpbmcgcmVxdWVzdCwgU3RyaW5nIHJlc3VsdCkgeworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFJlc3VsdCBpcyBtaXNzaW5nLgorICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3Q7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbCB8fCByZXF1ZXN0LmVxdWFscyhyZXN1bHQpKSB7CisgICAgICAgICAgICAvLyBSZXF1ZXN0IGRpZG4ndCBzcGVjaWZ5IGEgdmFsdWUgb3IgcmVzdWx0IG1hdGNoZXMgcmVxdWVzdC4KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gUmVzdWx0IGNvbmZsaWN0cyB3aXRoIHJlcXVlc3QuCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9nUmVxdWVzdChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2VuZGluZyByZXF1ZXN0OiAiICsgaW50ZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmcgYnVuZGxlVG9TdHJpbmcoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICBpZiAoYnVuZGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1bmRsZS5zaXplKCk7IC8vIGZvcmNlIGJ1bmRsZSB0byBiZSB1bnBhcmNlbGxlZAorICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZS50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAibnVsbCI7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBBY3Rpb25SZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0lURU1fU1RBVFVTX0NIQU5HRUQgPQorICAgICAgICAgICAgICAgICJhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuYWN0aW9ucy5BQ1RJT05fSVRFTV9TVEFUVVNfQ0hBTkdFRCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TRVNTSU9OX1NUQVRVU19DSEFOR0VEID0KKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLmFjdGlvbnMuQUNUSU9OX1NFU1NJT05fU1RBVFVTX0NIQU5HRUQiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fTUVTU0FHRV9SRUNFSVZFRCA9CisgICAgICAgICAgICAgICAgImFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5hY3Rpb25zLkFDVElPTl9NRVNTQUdFX1JFQ0VJVkVEIjsKKworICAgICAgICBBY3Rpb25SZWNlaXZlcigpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX0lEKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgPT0gbnVsbCB8fCAhc2Vzc2lvbklkLmVxdWFscyhtU2Vzc2lvbklkKSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkRpc2NhcmRpbmcgc3B1cmlvdXMgc3RhdHVzIGNhbGxiYWNrICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIndpdGggbWlzc2luZyBvciBpbnZhbGlkIHNlc3Npb24gaWQ6IHNlc3Npb25JZD0iICsgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzID0gTWVkaWFTZXNzaW9uU3RhdHVzLmZyb21CdW5kbGUoCisgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRCdW5kbGVFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9TVEFUVVMpKTsKKyAgICAgICAgICAgIFN0cmluZyBhY3Rpb24gPSBpbnRlbnQuZ2V0QWN0aW9uKCk7CisgICAgICAgICAgICBpZiAoYWN0aW9uLmVxdWFscyhBQ1RJT05fSVRFTV9TVEFUVVNfQ0hBTkdFRCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX0lEKTsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbUlkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRGlzY2FyZGluZyBzcHVyaW91cyBzdGF0dXMgY2FsbGJhY2sgd2l0aCBtaXNzaW5nIGl0ZW0gaWQuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cyA9IE1lZGlhSXRlbVN0YXR1cy5mcm9tQnVuZGxlKAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LmdldEJ1bmRsZUV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX1NUQVRVUykpOworICAgICAgICAgICAgICAgIGlmIChpdGVtU3RhdHVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRGlzY2FyZGluZyBzcHVyaW91cyBzdGF0dXMgY2FsbGJhY2sgd2l0aCBtaXNzaW5nIGl0ZW0gc3RhdHVzLiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJlY2VpdmVkIGl0ZW0gc3RhdHVzIGNhbGxiYWNrOiBzZXNzaW9uSWQ9IiArIHNlc3Npb25JZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgc2Vzc2lvblN0YXR1cz0iICsgc2Vzc2lvblN0YXR1cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaXRlbUlkPSIgKyBpdGVtSWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGl0ZW1TdGF0dXM9IiArIGl0ZW1TdGF0dXMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtU3RhdHVzQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtU3RhdHVzQ2FsbGJhY2sub25JdGVtU3RhdHVzQ2hhbmdlZChpbnRlbnQuZ2V0RXh0cmFzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzLCBpdGVtSWQsIGl0ZW1TdGF0dXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhBQ1RJT05fU0VTU0lPTl9TVEFUVVNfQ0hBTkdFRCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvblN0YXR1cyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkRpc2NhcmRpbmcgc3B1cmlvdXMgbWVkaWEgc3RhdHVzIGNhbGxiYWNrIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsibWlzc2luZyBzZXNzaW9uIHN0YXR1cy4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCBzZXNzaW9uIHN0YXR1cyBjYWxsYmFjazogc2Vzc2lvbklkPSIgKyBzZXNzaW9uSWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25TdGF0dXM9IiArIHNlc3Npb25TdGF0dXMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtU3RhdHVzQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtU3RhdHVzQ2FsbGJhY2sub25TZXNzaW9uU3RhdHVzQ2hhbmdlZChpbnRlbnQuZ2V0RXh0cmFzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQUNUSU9OX01FU1NBR0VfUkVDRUlWRUQpKSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJlY2VpdmVkIG1lc3NhZ2UgY2FsbGJhY2s6IHNlc3Npb25JZD0iICsgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobU9uTWVzc2FnZVJlY2VpdmVkTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtT25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lci5vbk1lc3NhZ2VSZWNlaXZlZChzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LmdldEJ1bmRsZUV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9NRVNTQUdFKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBjYWxsYmFjayB0aGF0IHdpbGwgcmVjZWl2ZSBtZWRpYSBzdGF0dXMgdXBkYXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFN0YXR1c0NhbGxiYWNrIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYSBtZWRpYSBpdGVtIGNoYW5nZXMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBkYXRhIFRoZSByZXN1bHQgZGF0YSBidW5kbGUuCisgICAgICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIHNlc3Npb24gaWQuCisgICAgICAgICAqIEBwYXJhbSBzZXNzaW9uU3RhdHVzIFRoZSBzZXNzaW9uIHN0YXR1cywgb3IgbnVsbCBpZiB1bmtub3duLgorICAgICAgICAgKiBAcGFyYW0gaXRlbUlkIFRoZSBpdGVtIGlkLgorICAgICAgICAgKiBAcGFyYW0gaXRlbVN0YXR1cyBUaGUgaXRlbSBzdGF0dXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1TdGF0dXNDaGFuZ2VkKEJ1bmRsZSBkYXRhLAorICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzLAorICAgICAgICAgICAgICAgIFN0cmluZyBpdGVtSWQsIE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHN0YXR1cyBvZiBhIG1lZGlhIHNlc3Npb24gY2hhbmdlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIHJlc3VsdCBkYXRhIGJ1bmRsZS4KKyAgICAgICAgICogQHBhcmFtIHNlc3Npb25JZCBUaGUgc2Vzc2lvbiBpZC4KKyAgICAgICAgICogQHBhcmFtIHNlc3Npb25TdGF0dXMgVGhlIHNlc3Npb24gc3RhdHVzLCBvciBudWxsIGlmIHVua25vd24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblNlc3Npb25TdGF0dXNDaGFuZ2VkKEJ1bmRsZSBkYXRhLAorICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHNlc3Npb24gb2YgdGhlIHJlbW90ZSBwbGF5YmFjayBjbGllbnQgY2hhbmdlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHNlc3Npb25JZCBUaGUgbmV3IHNlc3Npb24gaWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblNlc3Npb25DaGFuZ2VkKFN0cmluZyBzZXNzaW9uSWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEJhc2UgY2FsbGJhY2sgdHlwZSBmb3IgcmVtb3RlIHBsYXliYWNrIHJlcXVlc3RzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQWN0aW9uQ2FsbGJhY2sgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSBjb250cm9sIHJlcXVlc3QgZmFpbHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBlcnJvciBBIGxvY2FsaXplZCBlcnJvciBtZXNzYWdlIHdoaWNoIG1heSBiZSBzaG93biB0byB0aGUgdXNlciwgb3IgbnVsbAorICAgICAgICAgKiBpZiB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yIGlzIHVuY2xlYXIuCisgICAgICAgICAqIEBwYXJhbSBjb2RlIFRoZSBlcnJvciBjb2RlLCBvciB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0VSUk9SX1VOS05PV059IGlmIHVua25vd24uCisgICAgICAgICAqIEBwYXJhbSBkYXRhIFRoZSBlcnJvciBkYXRhIGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihTdHJpbmcgZXJyb3IsIGludCBjb2RlLCBCdW5kbGUgZGF0YSkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGJhY2sgZm9yIHJlbW90ZSBwbGF5YmFjayByZXF1ZXN0cyB0aGF0IG9wZXJhdGUgb24gaXRlbXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBJdGVtQWN0aW9uQ2FsbGJhY2sgZXh0ZW5kcyBBY3Rpb25DYWxsYmFjayB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcmVxdWVzdCBzdWNjZWVkcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIHJlc3VsdCBkYXRhIGJ1bmRsZS4KKyAgICAgICAgICogQHBhcmFtIHNlc3Npb25JZCBUaGUgc2Vzc2lvbiBpZC4KKyAgICAgICAgICogQHBhcmFtIHNlc3Npb25TdGF0dXMgVGhlIHNlc3Npb24gc3RhdHVzLCBvciBudWxsIGlmIHVua25vd24uCisgICAgICAgICAqIEBwYXJhbSBpdGVtSWQgVGhlIGl0ZW0gaWQuCisgICAgICAgICAqIEBwYXJhbSBpdGVtU3RhdHVzIFRoZSBpdGVtIHN0YXR1cy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLCBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cywKKyAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkLCBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGJhY2sgZm9yIHJlbW90ZSBwbGF5YmFjayByZXF1ZXN0cyB0aGF0IG9wZXJhdGUgb24gc2Vzc2lvbnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgZXh0ZW5kcyBBY3Rpb25DYWxsYmFjayB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcmVxdWVzdCBzdWNjZWVkcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIHJlc3VsdCBkYXRhIGJ1bmRsZS4KKyAgICAgICAgICogQHBhcmFtIHNlc3Npb25JZCBUaGUgc2Vzc2lvbiBpZC4KKyAgICAgICAgICogQHBhcmFtIHNlc3Npb25TdGF0dXMgVGhlIHNlc3Npb24gc3RhdHVzLCBvciBudWxsIGlmIHVua25vd24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY2FsbGJhY2sgdGhhdCB3aWxsIHJlY2VpdmUgbWVzc2FnZXMgZnJvbSBtZWRpYSBzZXNzaW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIE9uTWVzc2FnZVJlY2VpdmVkTGlzdGVuZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZXNzYWdlIHJlY2VpdmVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBzZXNzaW9uIGlkLgorICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZSBBIGJ1bmRsZSBtZXNzYWdlIGRlbm90aW5nIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjRVhUUkFfTUVTU0FHRX0uCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKFN0cmluZyBzZXNzaW9uSWQsIEJ1bmRsZSBtZXNzYWdlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM4NDkxZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9TeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDg4MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLlJlcXVpcmVzQXBpOworaW1wb3J0IGFuZHJvaWQudmlldy5EaXNwbGF5OworCitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworLyoqCisgKiBQcm92aWRlcyByb3V0ZXMgZm9yIGJ1aWx0LWluIHN5c3RlbSBkZXN0aW5hdGlvbnMgc3VjaCBhcyB0aGUgbG9jYWwgZGlzcGxheQorICogYW5kIHNwZWFrZXIuICBPbiBKZWxseWJlYW4gYW5kIG5ld2VyIHBsYXRmb3JtIHJlbGVhc2VzLCBxdWVyaWVzIHRoZSBmcmFtZXdvcmsKKyAqIE1lZGlhUm91dGVyIGZvciBmcmFtZXdvcmstcHJvdmlkZWQgcm91dGVzIGFuZCByZWdpc3RlcnMgbm9uLWZyYW1ld29yay1wcm92aWRlZAorICogcm91dGVzIGFzIHVzZXIgcm91dGVzLgorICovCithYnN0cmFjdCBjbGFzcyBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIgZXh0ZW5kcyBNZWRpYVJvdXRlUHJvdmlkZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfTkFNRSA9ICJhbmRyb2lkIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1JPVVRFX0lEID0gIkRFRkFVTFRfUk9VVEUiOworCisgICAgcHJvdGVjdGVkIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlcihDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgbmV3IFByb3ZpZGVyTWV0YWRhdGEobmV3IENvbXBvbmVudE5hbWUoUEFDS0FHRV9OQU1FLAorICAgICAgICAgICAgICAgIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlci5jbGFzcy5nZXROYW1lKCkpKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIgb2J0YWluKENvbnRleHQgY29udGV4dCwgU3luY0NhbGxiYWNrIHN5bmNDYWxsYmFjaykgeworICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IDI0KSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEFwaTI0SW1wbChjb250ZXh0LCBzeW5jQ2FsbGJhY2spOworICAgICAgICB9CisgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMTgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSmVsbHliZWFuTXIySW1wbChjb250ZXh0LCBzeW5jQ2FsbGJhY2spOworICAgICAgICB9CisgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMTcpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSmVsbHliZWFuTXIxSW1wbChjb250ZXh0LCBzeW5jQ2FsbGJhY2spOworICAgICAgICB9CisgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMTYpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSmVsbHliZWFuSW1wbChjb250ZXh0LCBzeW5jQ2FsbGJhY2spOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgTGVnYWN5SW1wbChjb250ZXh0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgdGhlIG1lZGlhIHJvdXRlciB3aGVuIGEgcm91dGUgaXMgYWRkZWQgdG8gc3luY2hyb25pemUgc3RhdGUgd2l0aAorICAgICAqIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlQWRkZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgd2hlbiBhIHJvdXRlIGlzIHJlbW92ZWQgdG8gc3luY2hyb25pemUgc3RhdGUgd2l0aAorICAgICAqIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlUmVtb3ZlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgdGhlIG1lZGlhIHJvdXRlciB3aGVuIGEgcm91dGUgaXMgY2hhbmdlZCB0byBzeW5jaHJvbml6ZSBzdGF0ZSB3aXRoCisgICAgICogdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVDaGFuZ2VkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHdoZW4gYSByb3V0ZSBpcyBzZWxlY3RlZCB0byBzeW5jaHJvbml6ZSBzdGF0ZSB3aXRoCisgICAgICogdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVTZWxlY3RlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFja3MgaW50byB0aGUgbWVkaWEgcm91dGVyIHRvIHN5bmNocm9uaXplIHN0YXRlIHdpdGggdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBTeW5jQ2FsbGJhY2sgeworICAgICAgICB2b2lkIG9uU3lzdGVtUm91dGVTZWxlY3RlZEJ5RGVzY3JpcHRvcklkKFN0cmluZyBpZCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBnZXREZWZhdWx0Um91dGUoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0U3lzdGVtUm91dGUoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIExlZ2FjeSBpbXBsZW1lbnRhdGlvbiBmb3IgcGxhdGZvcm0gdmVyc2lvbnMgcHJpb3IgdG8gSmVsbHliZWFuLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBMZWdhY3lJbXBsIGV4dGVuZHMgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyIHsKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVFJFQU0gPSBBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+IENPTlRST0xfRklMVEVSUzsKKyAgICAgICAgc3RhdGljIHsKKyAgICAgICAgICAgIEludGVudEZpbHRlciBmID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICAgICAgZi5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTyk7CisgICAgICAgICAgICBmLmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKTsKKworICAgICAgICAgICAgQ09OVFJPTF9GSUxURVJTID0gbmV3IEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+KCk7CisgICAgICAgICAgICBDT05UUk9MX0ZJTFRFUlMuYWRkKGYpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQXVkaW9NYW5hZ2VyIG1BdWRpb01hbmFnZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgVm9sdW1lQ2hhbmdlUmVjZWl2ZXIgbVZvbHVtZUNoYW5nZVJlY2VpdmVyOworICAgICAgICBpbnQgbUxhc3RSZXBvcnRlZFZvbHVtZSA9IC0xOworCisgICAgICAgIHB1YmxpYyBMZWdhY3lJbXBsKENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyID0gKEF1ZGlvTWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BVURJT19TRVJWSUNFKTsKKyAgICAgICAgICAgIG1Wb2x1bWVDaGFuZ2VSZWNlaXZlciA9IG5ldyBWb2x1bWVDaGFuZ2VSZWNlaXZlcigpOworCisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobVZvbHVtZUNoYW5nZVJlY2VpdmVyLAorICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZW50RmlsdGVyKFZvbHVtZUNoYW5nZVJlY2VpdmVyLlZPTFVNRV9DSEFOR0VEX0FDVElPTikpOworICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBwdWJsaXNoUm91dGVzKCkgeworICAgICAgICAgICAgUmVzb3VyY2VzIHIgPSBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgICAgICBpbnQgbWF4Vm9sdW1lID0gbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1NYXhWb2x1bWUoUExBWUJBQ0tfU1RSRUFNKTsKKyAgICAgICAgICAgIG1MYXN0UmVwb3J0ZWRWb2x1bWUgPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZShQTEFZQkFDS19TVFJFQU0pOworICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IgZGVmYXVsdFJvdXRlID0gbmV3IE1lZGlhUm91dGVEZXNjcmlwdG9yLkJ1aWxkZXIoCisgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUk9VVEVfSUQsIHIuZ2V0U3RyaW5nKFIuc3RyaW5nLm1yX3N5c3RlbV9yb3V0ZV9uYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgLmFkZENvbnRyb2xGaWx0ZXJzKENPTlRST0xfRklMVEVSUykKKyAgICAgICAgICAgICAgICAgICAgLnNldFBsYXliYWNrU3RyZWFtKFBMQVlCQUNLX1NUUkVBTSkKKyAgICAgICAgICAgICAgICAgICAgLnNldFBsYXliYWNrVHlwZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVFlQRV9MT0NBTCkKKyAgICAgICAgICAgICAgICAgICAgLnNldFZvbHVtZUhhbmRsaW5nKE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19WT0xVTUVfVkFSSUFCTEUpCisgICAgICAgICAgICAgICAgICAgIC5zZXRWb2x1bWVNYXgobWF4Vm9sdW1lKQorICAgICAgICAgICAgICAgICAgICAuc2V0Vm9sdW1lKG1MYXN0UmVwb3J0ZWRWb2x1bWUpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIHByb3ZpZGVyRGVzY3JpcHRvciA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuYWRkUm91dGUoZGVmYXVsdFJvdXRlKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgICAgIHNldERlc2NyaXB0b3IocHJvdmlkZXJEZXNjcmlwdG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUm91dGVDb250cm9sbGVyIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKFN0cmluZyByb3V0ZUlkKSB7CisgICAgICAgICAgICBpZiAocm91dGVJZC5lcXVhbHMoREVGQVVMVF9ST1VURV9JRCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRSb3V0ZUNvbnRyb2xsZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgY2xhc3MgRGVmYXVsdFJvdXRlQ29udHJvbGxlciBleHRlbmRzIFJvdXRlQ29udHJvbGxlciB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2V0Vm9sdW1lKGludCB2b2x1bWUpIHsKKyAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShQTEFZQkFDS19TVFJFQU0sIHZvbHVtZSwgMCk7CisgICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVXBkYXRlVm9sdW1lKGludCBkZWx0YSkgeworICAgICAgICAgICAgICAgIGludCB2b2x1bWUgPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZShQTEFZQkFDS19TVFJFQU0pOworICAgICAgICAgICAgICAgIGludCBtYXhWb2x1bWUgPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbU1heFZvbHVtZShQTEFZQkFDS19TVFJFQU0pOworICAgICAgICAgICAgICAgIGludCBuZXdWb2x1bWUgPSBNYXRoLm1pbihtYXhWb2x1bWUsIE1hdGgubWF4KDAsIHZvbHVtZSArIGRlbHRhKSk7CisgICAgICAgICAgICAgICAgaWYgKG5ld1ZvbHVtZSAhPSB2b2x1bWUpIHsKKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoUExBWUJBQ0tfU1RSRUFNLCB2b2x1bWUsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBjbGFzcyBWb2x1bWVDaGFuZ2VSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKKyAgICAgICAgICAgIC8vIFRoZXNlIGNvbnN0YW50cyBjb21lIGZyb20gQXVkaW9NYW5hZ2VyLgorICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9MVU1FX0NIQU5HRURfQUNUSU9OID0KKyAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuVk9MVU1FX0NIQU5HRURfQUNUSU9OIjsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1ZPTFVNRV9TVFJFQU1fVFlQRSA9CisgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLkVYVFJBX1ZPTFVNRV9TVFJFQU1fVFlQRSI7CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9WT0xVTUVfU1RSRUFNX1ZBTFVFID0KKyAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuRVhUUkFfVk9MVU1FX1NUUkVBTV9WQUxVRSI7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgICAgIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKFZPTFVNRV9DSEFOR0VEX0FDVElPTikpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHN0cmVhbVR5cGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoRVhUUkFfVk9MVU1FX1NUUkVBTV9UWVBFLCAtMSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1UeXBlID09IFBMQVlCQUNLX1NUUkVBTSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHZvbHVtZSA9IGludGVudC5nZXRJbnRFeHRyYShFWFRSQV9WT0xVTUVfU1RSRUFNX1ZBTFVFLCAtMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9sdW1lID49IDAgJiYgdm9sdW1lICE9IG1MYXN0UmVwb3J0ZWRWb2x1bWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBKZWxseWJlYW4gaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgLy8gQEBSZXF1aXJlc0FwaSgxNikKKyAgICBzdGF0aWMgY2xhc3MgSmVsbHliZWFuSW1wbCBleHRlbmRzIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlcgorICAgICAgICAgICAgaW1wbGVtZW50cyBNZWRpYVJvdXRlckplbGx5YmVhbi5DYWxsYmFjaywgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVm9sdW1lQ2FsbGJhY2sgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPiBMSVZFX0FVRElPX0NPTlRST0xfRklMVEVSUzsKKyAgICAgICAgc3RhdGljIHsKKyAgICAgICAgICAgIEludGVudEZpbHRlciBmID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICAgICAgZi5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTyk7CisKKyAgICAgICAgICAgIExJVkVfQVVESU9fQ09OVFJPTF9GSUxURVJTID0gbmV3IEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+KCk7CisgICAgICAgICAgICBMSVZFX0FVRElPX0NPTlRST0xfRklMVEVSUy5hZGQoZik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPiBMSVZFX1ZJREVPX0NPTlRST0xfRklMVEVSUzsKKyAgICAgICAgc3RhdGljIHsKKyAgICAgICAgICAgIEludGVudEZpbHRlciBmID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICAgICAgZi5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTyk7CisKKyAgICAgICAgICAgIExJVkVfVklERU9fQ09OVFJPTF9GSUxURVJTID0gbmV3IEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+KCk7CisgICAgICAgICAgICBMSVZFX1ZJREVPX0NPTlRST0xfRklMVEVSUy5hZGQoZik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGZpbmFsIFN5bmNDYWxsYmFjayBtU3luY0NhbGxiYWNrOworCisgICAgICAgIHByb3RlY3RlZCBmaW5hbCBPYmplY3QgbVJvdXRlck9iajsKKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBtQ2FsbGJhY2tPYmo7CisgICAgICAgIHByb3RlY3RlZCBmaW5hbCBPYmplY3QgbVZvbHVtZUNhbGxiYWNrT2JqOworICAgICAgICBwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IG1Vc2VyUm91dGVDYXRlZ29yeU9iajsKKyAgICAgICAgcHJvdGVjdGVkIGludCBtUm91dGVUeXBlczsKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gbUFjdGl2ZVNjYW47CisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIG1DYWxsYmFja1JlZ2lzdGVyZWQ7CisKKyAgICAgICAgLy8gTWFpbnRhaW5zIGFuIGFzc29jaWF0aW9uIGZyb20gZnJhbWV3b3JrIHJvdXRlcyB0byBzdXBwb3J0IGxpYnJhcnkgcm91dGVzLgorICAgICAgICAvLyBOb3RlIHRoYXQgd2UgY2Fubm90IHVzZSB0aGUgdGFnIGZpZWxkIGZvciB0aGlzIGJlY2F1c2UgYW4gYXBwbGljYXRpb24gbWF5CisgICAgICAgIC8vIGhhdmUgcHVibGlzaGVkIGl0cyBvd24gdXNlciByb3V0ZXMgdG8gdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIgYW5kIGFscmVhZHkKKyAgICAgICAgLy8gdXNlZCB0aGUgdGFnIGZvciBpdHMgb3duIHB1cnBvc2VzLgorICAgICAgICBwcm90ZWN0ZWQgZmluYWwgQXJyYXlMaXN0PFN5c3RlbVJvdXRlUmVjb3JkPiBtU3lzdGVtUm91dGVSZWNvcmRzID0KKyAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFN5c3RlbVJvdXRlUmVjb3JkPigpOworCisgICAgICAgIC8vIE1haW50YWlucyBhbiBhc3NvY2lhdGlvbiBmcm9tIHN1cHBvcnQgbGlicmFyeSByb3V0ZXMgdG8gZnJhbWV3b3JrIHJvdXRlcy4KKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIEFycmF5TGlzdDxVc2VyUm91dGVSZWNvcmQ+IG1Vc2VyUm91dGVSZWNvcmRzID0KKyAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFVzZXJSb3V0ZVJlY29yZD4oKTsKKworICAgICAgICBwcml2YXRlIE1lZGlhUm91dGVySmVsbHliZWFuLlNlbGVjdFJvdXRlV29ya2Fyb3VuZCBtU2VsZWN0Um91dGVXb3JrYXJvdW5kOworICAgICAgICBwcml2YXRlIE1lZGlhUm91dGVySmVsbHliZWFuLkdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQgbUdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQ7CisKKyAgICAgICAgcHVibGljIEplbGx5YmVhbkltcGwoQ29udGV4dCBjb250ZXh0LCBTeW5jQ2FsbGJhY2sgc3luY0NhbGxiYWNrKSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgICAgIG1TeW5jQ2FsbGJhY2sgPSBzeW5jQ2FsbGJhY2s7CisgICAgICAgICAgICBtUm91dGVyT2JqID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uZ2V0TWVkaWFSb3V0ZXIoY29udGV4dCk7CisgICAgICAgICAgICBtQ2FsbGJhY2tPYmogPSBjcmVhdGVDYWxsYmFja09iaigpOworICAgICAgICAgICAgbVZvbHVtZUNhbGxiYWNrT2JqID0gY3JlYXRlVm9sdW1lQ2FsbGJhY2tPYmooKTsKKworICAgICAgICAgICAgUmVzb3VyY2VzIHIgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpOworICAgICAgICAgICAgbVVzZXJSb3V0ZUNhdGVnb3J5T2JqID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uY3JlYXRlUm91dGVDYXRlZ29yeSgKKyAgICAgICAgICAgICAgICAgICAgbVJvdXRlck9iaiwgci5nZXRTdHJpbmcoUi5zdHJpbmcubXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lKSwgZmFsc2UpOworCisgICAgICAgICAgICB1cGRhdGVTeXN0ZW1Sb3V0ZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUm91dGVDb250cm9sbGVyIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKFN0cmluZyByb3V0ZUlkKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmRCeURlc2NyaXB0b3JJZChyb3V0ZUlkKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3lzdGVtUm91dGVDb250cm9sbGVyKHJlY29yZC5tUm91dGVPYmopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZChNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgICAgICBpbnQgbmV3Um91dGVUeXBlcyA9IDA7CisgICAgICAgICAgICBib29sZWFuIG5ld0FjdGl2ZVNjYW4gPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IgPSByZXF1ZXN0LmdldFNlbGVjdG9yKCk7CisgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGNhdGVnb3JpZXMgPSBzZWxlY3Rvci5nZXRDb250cm9sQ2F0ZWdvcmllcygpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGNhdGVnb3JpZXMuc2l6ZSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2F0ZWdvcnkgPSBjYXRlZ29yaWVzLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhdGVnb3J5LmVxdWFscyhNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1JvdXRlVHlwZXMgfD0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX0FVRElPOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNhdGVnb3J5LmVxdWFscyhNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1JvdXRlVHlwZXMgfD0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX1ZJREVPOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3Um91dGVUeXBlcyB8PSBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX1VTRVI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbmV3QWN0aXZlU2NhbiA9IHJlcXVlc3QuaXNBY3RpdmVTY2FuKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtUm91dGVUeXBlcyAhPSBuZXdSb3V0ZVR5cGVzIHx8IG1BY3RpdmVTY2FuICE9IG5ld0FjdGl2ZVNjYW4pIHsKKyAgICAgICAgICAgICAgICBtUm91dGVUeXBlcyA9IG5ld1JvdXRlVHlwZXM7CisgICAgICAgICAgICAgICAgbUFjdGl2ZVNjYW4gPSBuZXdBY3RpdmVTY2FuOworICAgICAgICAgICAgICAgIHVwZGF0ZVN5c3RlbVJvdXRlcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChPYmplY3Qgcm91dGVPYmopIHsKKyAgICAgICAgICAgIGlmIChhZGRTeXN0ZW1Sb3V0ZU5vUHVibGlzaChyb3V0ZU9iaikpIHsKKyAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgdXBkYXRlU3lzdGVtUm91dGVzKCkgeworICAgICAgICAgICAgdXBkYXRlQ2FsbGJhY2soKTsKKyAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChPYmplY3Qgcm91dGVPYmogOiBNZWRpYVJvdXRlckplbGx5YmVhbi5nZXRSb3V0ZXMobVJvdXRlck9iaikpIHsKKyAgICAgICAgICAgICAgICBjaGFuZ2VkIHw9IGFkZFN5c3RlbVJvdXRlTm9QdWJsaXNoKHJvdXRlT2JqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGFkZFN5c3RlbVJvdXRlTm9QdWJsaXNoKE9iamVjdCByb3V0ZU9iaikgeworICAgICAgICAgICAgaWYgKGdldFVzZXJSb3V0ZVJlY29yZChyb3V0ZU9iaikgPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopIDwgMCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBpZCA9IGFzc2lnblJvdXRlSWQocm91dGVPYmopOworICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG5ldyBTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaiwgaWQpOworICAgICAgICAgICAgICAgIHVwZGF0ZVN5c3RlbVJvdXRlRGVzY3JpcHRvcihyZWNvcmQpOworICAgICAgICAgICAgICAgIG1TeXN0ZW1Sb3V0ZVJlY29yZHMuYWRkKHJlY29yZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyBhc3NpZ25Sb3V0ZUlkKE9iamVjdCByb3V0ZU9iaikgeworICAgICAgICAgICAgLy8gVE9ETzogVGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIgc2hvdWxkIHN1cHBseSBhIHVuaXF1ZSByb3V0ZSBpZCB0aGF0CisgICAgICAgICAgICAvLyB3ZSBjYW4gdXNlIGhlcmUuICBGb3Igbm93IHdlIHVzZSBhIGhhc2ggb2YgdGhlIHJvdXRlIG5hbWUgYW5kIHRha2UgY2FyZQorICAgICAgICAgICAgLy8gdG8gZGVkdXBlIGl0LgorICAgICAgICAgICAgYm9vbGVhbiBpc0RlZmF1bHQgPSAoZ2V0RGVmYXVsdFJvdXRlKCkgPT0gcm91dGVPYmopOworICAgICAgICAgICAgU3RyaW5nIGlkID0gaXNEZWZhdWx0ID8gREVGQVVMVF9ST1VURV9JRCA6CisgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoTG9jYWxlLlVTLCAiUk9VVEVfJTA4eCIsIGdldFJvdXRlTmFtZShyb3V0ZU9iaikuaGFzaENvZGUoKSk7CisgICAgICAgICAgICBpZiAoZmluZFN5c3RlbVJvdXRlUmVjb3JkQnlEZXNjcmlwdG9ySWQoaWQpIDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBpZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAyOyA7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyBuZXdJZCA9IFN0cmluZy5mb3JtYXQoTG9jYWxlLlVTLCAiJXNfJWQiLCBpZCwgaSk7CisgICAgICAgICAgICAgICAgaWYgKGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZEJ5RGVzY3JpcHRvcklkKG5ld0lkKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0lkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChPYmplY3Qgcm91dGVPYmopIHsKKyAgICAgICAgICAgIGlmIChnZXRVc2VyUm91dGVSZWNvcmQocm91dGVPYmopID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopOworICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1Sb3V0ZVJlY29yZHMucmVtb3ZlKGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChPYmplY3Qgcm91dGVPYmopIHsKKyAgICAgICAgICAgIGlmIChnZXRVc2VyUm91dGVSZWNvcmQocm91dGVPYmopID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopOworICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlU3lzdGVtUm91dGVEZXNjcmlwdG9yKHJlY29yZCk7CisgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVZvbHVtZUNoYW5nZWQoT2JqZWN0IHJvdXRlT2JqKSB7CisgICAgICAgICAgICBpZiAoZ2V0VXNlclJvdXRlUmVjb3JkKHJvdXRlT2JqKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGludCBuZXdWb2x1bWUgPSBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0Vm9sdW1lKHJvdXRlT2JqKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZvbHVtZSAhPSByZWNvcmQubVJvdXRlRGVzY3JpcHRvci5nZXRWb2x1bWUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3IgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlcihyZWNvcmQubVJvdXRlRGVzY3JpcHRvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFZvbHVtZShuZXdWb2x1bWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVTZWxlY3RlZChpbnQgdHlwZSwgT2JqZWN0IHJvdXRlT2JqKSB7CisgICAgICAgICAgICBpZiAocm91dGVPYmogIT0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uZ2V0U2VsZWN0ZWRSb3V0ZShtUm91dGVyT2JqLAorICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5BTExfUk9VVEVfVFlQRVMpKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZSBoYXMgYWxyZWFkeSBjaGFuZ2VkIHNvIHRoaXMgY2FsbGJhY2sKKyAgICAgICAgICAgICAgICAvLyBpcyBzdGFsZS4gIERyb3AgaXQgdG8gcHJldmVudCBnZXR0aW5nIGludG8gc3luYyBsb29wcy4KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFVzZXJSb3V0ZVJlY29yZCB1c2VyUm91dGVSZWNvcmQgPSBnZXRVc2VyUm91dGVSZWNvcmQocm91dGVPYmopOworICAgICAgICAgICAgaWYgKHVzZXJSb3V0ZVJlY29yZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdXNlclJvdXRlUmVjb3JkLm1Sb3V0ZS5zZWxlY3QoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gU2VsZWN0IHRoZSByb3V0ZSBpZiBpdCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgY29tcGF0IG1lZGlhIHJvdXRlci4KKyAgICAgICAgICAgICAgICAvLyBJZiBub3QsIHdlIHdpbGwgc2VsZWN0IGl0IGluc3RlYWQgd2hlbiB0aGUgcm91dGUgaXMgYWRkZWQuCisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIG1TeW5jQ2FsbGJhY2sub25TeXN0ZW1Sb3V0ZVNlbGVjdGVkQnlEZXNjcmlwdG9ySWQocmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3JJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKGludCB0eXBlLCBPYmplY3Qgcm91dGVPYmopIHsKKyAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gd2hlbiBhIHJvdXRlIGlzIHVuc2VsZWN0ZWQuCisgICAgICAgICAgICAvLyBXZSBvbmx5IG5lZWQgdG8gaGFuZGxlIHdoZW4gYSByb3V0ZSBpcyBzZWxlY3RlZC4KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlR3JvdXBlZChPYmplY3Qgcm91dGVPYmosIE9iamVjdCBncm91cE9iaiwgaW50IGluZGV4KSB7CisgICAgICAgICAgICAvLyBSb3V0ZSBncm91cGluZyBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgc3VwcG9ydGVkLgorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbmdyb3VwZWQoT2JqZWN0IHJvdXRlT2JqLCBPYmplY3QgZ3JvdXBPYmopIHsKKyAgICAgICAgICAgIC8vIFJvdXRlIGdyb3VwaW5nIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVTZXRSZXF1ZXN0KE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZSkgeworICAgICAgICAgICAgVXNlclJvdXRlUmVjb3JkIHJlY29yZCA9IGdldFVzZXJSb3V0ZVJlY29yZChyb3V0ZU9iaik7CisgICAgICAgICAgICBpZiAocmVjb3JkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlLnJlcXVlc3RTZXRWb2x1bWUodm9sdW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVVwZGF0ZVJlcXVlc3QoT2JqZWN0IHJvdXRlT2JqLCBpbnQgZGlyZWN0aW9uKSB7CisgICAgICAgICAgICBVc2VyUm91dGVSZWNvcmQgcmVjb3JkID0gZ2V0VXNlclJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKKyAgICAgICAgICAgIGlmIChyZWNvcmQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGUucmVxdWVzdFVwZGF0ZVZvbHVtZShkaXJlY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlQWRkZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgICAgICBpZiAocm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpICE9IHRoaXMpIHsKKyAgICAgICAgICAgICAgICBPYmplY3Qgcm91dGVPYmogPSBNZWRpYVJvdXRlckplbGx5YmVhbi5jcmVhdGVVc2VyUm91dGUoCisgICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVyT2JqLCBtVXNlclJvdXRlQ2F0ZWdvcnlPYmopOworICAgICAgICAgICAgICAgIFVzZXJSb3V0ZVJlY29yZCByZWNvcmQgPSBuZXcgVXNlclJvdXRlUmVjb3JkKHJvdXRlLCByb3V0ZU9iaik7CisgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLnNldFRhZyhyb3V0ZU9iaiwgcmVjb3JkKTsKKyAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZUNhbGxiYWNrKHJvdXRlT2JqLCBtVm9sdW1lQ2FsbGJhY2tPYmopOworICAgICAgICAgICAgICAgIHVwZGF0ZVVzZXJSb3V0ZVByb3BlcnRpZXMocmVjb3JkKTsKKyAgICAgICAgICAgICAgICBtVXNlclJvdXRlUmVjb3Jkcy5hZGQocmVjb3JkKTsKKyAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5hZGRVc2VyUm91dGUobVJvdXRlck9iaiwgcm91dGVPYmopOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbmV3bHkgYWRkZWQgcm91dGUgaXMgdGhlIGNvdW50ZXJwYXJ0IG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKKyAgICAgICAgICAgICAgICAvLyByb3V0ZSBpbiB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlciB0aGVuIGVuc3VyZSBpdCBpcyBzZWxlY3RlZCBpbgorICAgICAgICAgICAgICAgIC8vIHRoZSBjb21wYXQgbWVkaWEgcm91dGVyLgorICAgICAgICAgICAgICAgIE9iamVjdCByb3V0ZU9iaiA9IE1lZGlhUm91dGVySmVsbHliZWFuLmdldFNlbGVjdGVkUm91dGUoCisgICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVyT2JqLCBNZWRpYVJvdXRlckplbGx5YmVhbi5BTExfUk9VVEVfVFlQRVMpOworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaik7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3JJZC5lcXVhbHMocm91dGUuZ2V0RGVzY3JpcHRvcklkKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5zZWxlY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZVJlbW92ZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgICAgICBpZiAocm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpICE9IHRoaXMpIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kVXNlclJvdXRlUmVjb3JkKHJvdXRlKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBVc2VyUm91dGVSZWNvcmQgcmVjb3JkID0gbVVzZXJSb3V0ZVJlY29yZHMucmVtb3ZlKGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLnNldFRhZyhyZWNvcmQubVJvdXRlT2JqLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVDYWxsYmFjayhyZWNvcmQubVJvdXRlT2JqLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4ucmVtb3ZlVXNlclJvdXRlKG1Sb3V0ZXJPYmosIHJlY29yZC5tUm91dGVPYmopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7CisgICAgICAgICAgICBpZiAocm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpICE9IHRoaXMpIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kVXNlclJvdXRlUmVjb3JkKHJvdXRlKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBVc2VyUm91dGVSZWNvcmQgcmVjb3JkID0gbVVzZXJSb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlVXNlclJvdXRlUHJvcGVydGllcyhyZWNvcmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZVNlbGVjdGVkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgeworICAgICAgICAgICAgaWYgKCFyb3V0ZS5pc1NlbGVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlIGhhcyBhbHJlYWR5IGNoYW5nZWQgc28gdGhpcyBjYWxsYmFjaworICAgICAgICAgICAgICAgIC8vIGlzIHN0YWxlLiAgRHJvcCBpdCB0byBwcmV2ZW50IGdldHRpbmcgaW50byBzeW5jIGxvb3BzLgorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKSAhPSB0aGlzKSB7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFVzZXJSb3V0ZVJlY29yZChyb3V0ZSk7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgVXNlclJvdXRlUmVjb3JkIHJlY29yZCA9IG1Vc2VyUm91dGVSZWNvcmRzLmdldChpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdFJvdXRlKHJlY29yZC5tUm91dGVPYmopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkQnlEZXNjcmlwdG9ySWQocm91dGUuZ2V0RGVzY3JpcHRvcklkKCkpOworICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0Um91dGUocmVjb3JkLm1Sb3V0ZU9iaik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHVibGlzaFJvdXRlcygpIHsKKyAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuQnVpbGRlcigpOworICAgICAgICAgICAgaW50IGNvdW50ID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFkZFJvdXRlKG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGkpLm1Sb3V0ZURlc2NyaXB0b3IpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZXREZXNjcmlwdG9yKGJ1aWxkZXIuYnVpbGQoKSk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgaW50IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChPYmplY3Qgcm91dGVPYmopIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGkpLm1Sb3V0ZU9iaiA9PSByb3V0ZU9iaikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgaW50IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZEJ5RGVzY3JpcHRvcklkKFN0cmluZyBpZCkgeworICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaSkubVJvdXRlRGVzY3JpcHRvcklkLmVxdWFscyhpZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGludCBmaW5kVXNlclJvdXRlUmVjb3JkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgeworICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVVzZXJSb3V0ZVJlY29yZHMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Vc2VyUm91dGVSZWNvcmRzLmdldChpKS5tUm91dGUgPT0gcm91dGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFVzZXJSb3V0ZVJlY29yZCBnZXRVc2VyUm91dGVSZWNvcmQoT2JqZWN0IHJvdXRlT2JqKSB7CisgICAgICAgICAgICBPYmplY3QgdGFnID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFRhZyhyb3V0ZU9iaik7CisgICAgICAgICAgICByZXR1cm4gdGFnIGluc3RhbmNlb2YgVXNlclJvdXRlUmVjb3JkID8gKFVzZXJSb3V0ZVJlY29yZCl0YWcgOiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3lzdGVtUm91dGVEZXNjcmlwdG9yKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCkgeworICAgICAgICAgICAgLy8gV2UgbXVzdCBhbHdheXMgcmVjcmVhdGUgdGhlIHJvdXRlIGRlc2NyaXB0b3Igd2hlbiBtYWtpbmcgYW55IGNoYW5nZXMKKyAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhleSBhcmUgaW50ZW5kZWQgdG8gYmUgaW1tdXRhYmxlIG9uY2UgcHVibGlzaGVkLgorICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyID0gbmV3IE1lZGlhUm91dGVEZXNjcmlwdG9yLkJ1aWxkZXIoCisgICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVEZXNjcmlwdG9ySWQsIGdldFJvdXRlTmFtZShyZWNvcmQubVJvdXRlT2JqKSk7CisgICAgICAgICAgICBvbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKHJlY29yZCwgYnVpbGRlcik7CisgICAgICAgICAgICByZWNvcmQubVJvdXRlRGVzY3JpcHRvciA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Um91dGVOYW1lKE9iamVjdCByb3V0ZU9iaikgeworICAgICAgICAgICAgLy8gUm91dGVzIHNob3VsZCBub3QgaGF2ZSBudWxsIG5hbWVzIGJ1dCBpdCBtYXkgaGFwcGVuIGZvciBiYWRseSBjb25maWd1cmVkCisgICAgICAgICAgICAvLyB1c2VyIHJvdXRlcy4gIFdlIHRvbGVyYXRlIHRoaXMgYnkgdXNpbmcgYW4gZW1wdHkgbmFtZSBzdHJpbmcgaGVyZSBidXQKKyAgICAgICAgICAgIC8vIHN1Y2ggdW5uYW1lZCByb3V0ZXMgd2lsbCBiZSBkaXNjYXJkZWQgYnkgdGhlIG1lZGlhIHJvdXRlciB1cHN0cmVhbQorICAgICAgICAgICAgLy8gKHdpdGggYSBsb2cgbWVzc2FnZSBzbyB3ZSBjYW4gdHJhY2sgZG93biB0aGUgcHJvYmxlbSkuCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgbmFtZSA9IE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXROYW1lKHJvdXRlT2JqLCBnZXRDb250ZXh0KCkpOworICAgICAgICAgICAgcmV0dXJuIG5hbWUgIT0gbnVsbCA/IG5hbWUudG9TdHJpbmcoKSA6ICIiOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25CdWlsZFN5c3RlbVJvdXRlRGVzY3JpcHRvcihTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQsCisgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyKSB7CisgICAgICAgICAgICBpbnQgc3VwcG9ydGVkVHlwZXMgPSBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0U3VwcG9ydGVkVHlwZXMoCisgICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmopOworICAgICAgICAgICAgaWYgKChzdXBwb3J0ZWRUeXBlcyAmIE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfTElWRV9BVURJTykgIT0gMCkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkQ29udHJvbEZpbHRlcnMoTElWRV9BVURJT19DT05UUk9MX0ZJTFRFUlMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChzdXBwb3J0ZWRUeXBlcyAmIE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfTElWRV9WSURFTykgIT0gMCkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkQ29udHJvbEZpbHRlcnMoTElWRV9WSURFT19DT05UUk9MX0ZJTFRFUlMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBidWlsZGVyLnNldFBsYXliYWNrVHlwZSgKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFBsYXliYWNrVHlwZShyZWNvcmQubVJvdXRlT2JqKSk7CisgICAgICAgICAgICBidWlsZGVyLnNldFBsYXliYWNrU3RyZWFtKAorICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0UGxheWJhY2tTdHJlYW0ocmVjb3JkLm1Sb3V0ZU9iaikpOworICAgICAgICAgICAgYnVpbGRlci5zZXRWb2x1bWUoCisgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRWb2x1bWUocmVjb3JkLm1Sb3V0ZU9iaikpOworICAgICAgICAgICAgYnVpbGRlci5zZXRWb2x1bWVNYXgoCisgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRWb2x1bWVNYXgocmVjb3JkLm1Sb3V0ZU9iaikpOworICAgICAgICAgICAgYnVpbGRlci5zZXRWb2x1bWVIYW5kbGluZygKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFZvbHVtZUhhbmRsaW5nKHJlY29yZC5tUm91dGVPYmopKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVVzZXJSb3V0ZVByb3BlcnRpZXMoVXNlclJvdXRlUmVjb3JkIHJlY29yZCkgeworICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXROYW1lKAorICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqLCByZWNvcmQubVJvdXRlLmdldE5hbWUoKSk7CisgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFBsYXliYWNrVHlwZSgKKyAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaiwgcmVjb3JkLm1Sb3V0ZS5nZXRQbGF5YmFja1R5cGUoKSk7CisgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFBsYXliYWNrU3RyZWFtKAorICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqLCByZWNvcmQubVJvdXRlLmdldFBsYXliYWNrU3RyZWFtKCkpOworICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWUoCisgICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmosIHJlY29yZC5tUm91dGUuZ2V0Vm9sdW1lKCkpOworICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVNYXgoCisgICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmosIHJlY29yZC5tUm91dGUuZ2V0Vm9sdW1lTWF4KCkpOworICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVIYW5kbGluZygKKyAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaiwgcmVjb3JkLm1Sb3V0ZS5nZXRWb2x1bWVIYW5kbGluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUNhbGxiYWNrKCkgeworICAgICAgICAgICAgaWYgKG1DYWxsYmFja1JlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tSZWdpc3RlcmVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4ucmVtb3ZlQ2FsbGJhY2sobVJvdXRlck9iaiwgbUNhbGxiYWNrT2JqKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1Sb3V0ZVR5cGVzICE9IDApIHsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tSZWdpc3RlcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5hZGRDYWxsYmFjayhtUm91dGVyT2JqLCBtUm91dGVUeXBlcywgbUNhbGxiYWNrT2JqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlQ2FsbGJhY2tPYmooKSB7CisgICAgICAgICAgICByZXR1cm4gTWVkaWFSb3V0ZXJKZWxseWJlYW4uY3JlYXRlQ2FsbGJhY2sodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVZvbHVtZUNhbGxiYWNrT2JqKCkgeworICAgICAgICAgICAgcmV0dXJuIE1lZGlhUm91dGVySmVsbHliZWFuLmNyZWF0ZVZvbHVtZUNhbGxiYWNrKHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2VsZWN0Um91dGUoT2JqZWN0IHJvdXRlT2JqKSB7CisgICAgICAgICAgICBpZiAobVNlbGVjdFJvdXRlV29ya2Fyb3VuZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVNlbGVjdFJvdXRlV29ya2Fyb3VuZCA9IG5ldyBNZWRpYVJvdXRlckplbGx5YmVhbi5TZWxlY3RSb3V0ZVdvcmthcm91bmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TZWxlY3RSb3V0ZVdvcmthcm91bmQuc2VsZWN0Um91dGUobVJvdXRlck9iaiwKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uQUxMX1JPVVRFX1RZUEVTLCByb3V0ZU9iaik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBnZXREZWZhdWx0Um91dGUoKSB7CisgICAgICAgICAgICBpZiAobUdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1HZXREZWZhdWx0Um91dGVXb3JrYXJvdW5kID0gbmV3IE1lZGlhUm91dGVySmVsbHliZWFuLkdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZC5nZXREZWZhdWx0Um91dGUobVJvdXRlck9iaik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBnZXRTeXN0ZW1Sb3V0ZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKKyAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmRCeURlc2NyaXB0b3JJZChyb3V0ZS5nZXREZXNjcmlwdG9ySWQoKSk7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCkubVJvdXRlT2JqOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVwcmVzZW50cyBhIHJvdXRlIHRoYXQgaXMgcHJvdmlkZWQgYnkgdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIKKyAgICAgICAgICogYW5kIHB1Ymxpc2hlZCBieSB0aGlzIHJvdXRlIHByb3ZpZGVyIHRvIHRoZSBzdXBwb3J0IGxpYnJhcnkgbWVkaWEgcm91dGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjbGFzcyBTeXN0ZW1Sb3V0ZVJlY29yZCB7CisgICAgICAgICAgICBwdWJsaWMgZmluYWwgT2JqZWN0IG1Sb3V0ZU9iajsKKyAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbVJvdXRlRGVzY3JpcHRvcklkOworICAgICAgICAgICAgcHVibGljIE1lZGlhUm91dGVEZXNjcmlwdG9yIG1Sb3V0ZURlc2NyaXB0b3I7IC8vIGFzc2lnbmVkIGltbWVkaWF0ZWx5IGFmdGVyIGNyZWF0aW9uCisKKyAgICAgICAgICAgIHB1YmxpYyBTeXN0ZW1Sb3V0ZVJlY29yZChPYmplY3Qgcm91dGVPYmosIFN0cmluZyBpZCkgeworICAgICAgICAgICAgICAgIG1Sb3V0ZU9iaiA9IHJvdXRlT2JqOworICAgICAgICAgICAgICAgIG1Sb3V0ZURlc2NyaXB0b3JJZCA9IGlkOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlcHJlc2VudHMgYSByb3V0ZSB0aGF0IGlzIHByb3ZpZGVkIGJ5IHRoZSBzdXBwb3J0IGxpYnJhcnkgbWVkaWEgcm91dGVyCisgICAgICAgICAqIGFuZCBwdWJsaXNoZWQgYnkgdGhpcyByb3V0ZSBwcm92aWRlciB0byB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlci4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2xhc3MgVXNlclJvdXRlUmVjb3JkIHsKKyAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gbVJvdXRlOworICAgICAgICAgICAgcHVibGljIGZpbmFsIE9iamVjdCBtUm91dGVPYmo7CisKKyAgICAgICAgICAgIHB1YmxpYyBVc2VyUm91dGVSZWNvcmQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlLCBPYmplY3Qgcm91dGVPYmopIHsKKyAgICAgICAgICAgICAgICBtUm91dGUgPSByb3V0ZTsKKyAgICAgICAgICAgICAgICBtUm91dGVPYmogPSByb3V0ZU9iajsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2xhc3MgU3lzdGVtUm91dGVDb250cm9sbGVyIGV4dGVuZHMgUm91dGVDb250cm9sbGVyIHsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Sb3V0ZU9iajsKKworICAgICAgICAgICAgcHVibGljIFN5c3RlbVJvdXRlQ29udHJvbGxlcihPYmplY3Qgcm91dGVPYmopIHsKKyAgICAgICAgICAgICAgICBtUm91dGVPYmogPSByb3V0ZU9iajsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNldFZvbHVtZShpbnQgdm9sdW1lKSB7CisgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLnJlcXVlc3RTZXRWb2x1bWUobVJvdXRlT2JqLCB2b2x1bWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVXBkYXRlVm9sdW1lKGludCBkZWx0YSkgeworICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5yZXF1ZXN0VXBkYXRlVm9sdW1lKG1Sb3V0ZU9iaiwgZGVsdGEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSmVsbHliZWFuIE1SMSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICAvLyBAQFJlcXVpcmVzQXBpKDE3KQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEplbGx5YmVhbk1yMUltcGwgZXh0ZW5kcyBKZWxseWJlYW5JbXBsCisgICAgICAgICAgICBpbXBsZW1lbnRzIE1lZGlhUm91dGVySmVsbHliZWFuTXIxLkNhbGxiYWNrIHsKKyAgICAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5BY3RpdmVTY2FuV29ya2Fyb3VuZCBtQWN0aXZlU2Nhbldvcmthcm91bmQ7CisgICAgICAgIHByaXZhdGUgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuSXNDb25uZWN0aW5nV29ya2Fyb3VuZCBtSXNDb25uZWN0aW5nV29ya2Fyb3VuZDsKKworICAgICAgICBwdWJsaWMgSmVsbHliZWFuTXIxSW1wbChDb250ZXh0IGNvbnRleHQsIFN5bmNDYWxsYmFjayBzeW5jQ2FsbGJhY2spIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVByZXNlbnRhdGlvbkRpc3BsYXlDaGFuZ2VkKE9iamVjdCByb3V0ZU9iaikgeworICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOworICAgICAgICAgICAgICAgIERpc3BsYXkgbmV3UHJlc2VudGF0aW9uRGlzcGxheSA9CisgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5Sb3V0ZUluZm8uZ2V0UHJlc2VudGF0aW9uRGlzcGxheShyb3V0ZU9iaik7CisgICAgICAgICAgICAgICAgaW50IG5ld1ByZXNlbnRhdGlvbkRpc3BsYXlJZCA9IChuZXdQcmVzZW50YXRpb25EaXNwbGF5ICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3UHJlc2VudGF0aW9uRGlzcGxheS5nZXREaXNwbGF5SWQoKSA6IC0xKTsKKyAgICAgICAgICAgICAgICBpZiAobmV3UHJlc2VudGF0aW9uRGlzcGxheUlkCisgICAgICAgICAgICAgICAgICAgICAgICAhPSByZWNvcmQubVJvdXRlRGVzY3JpcHRvci5nZXRQcmVzZW50YXRpb25EaXNwbGF5SWQoKSkgeworICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlRGVzY3JpcHRvciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVEZXNjcmlwdG9yLkJ1aWxkZXIocmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbkRpc3BsYXlJZChuZXdQcmVzZW50YXRpb25EaXNwbGF5SWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25CdWlsZFN5c3RlbVJvdXRlRGVzY3JpcHRvcihTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQsCisgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyKSB7CisgICAgICAgICAgICBzdXBlci5vbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKHJlY29yZCwgYnVpbGRlcik7CisKKyAgICAgICAgICAgIGlmICghTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuUm91dGVJbmZvLmlzRW5hYmxlZChyZWNvcmQubVJvdXRlT2JqKSkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpc0Nvbm5lY3RpbmcocmVjb3JkKSkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0Q29ubmVjdGluZyh0cnVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRGlzcGxheSBwcmVzZW50YXRpb25EaXNwbGF5ID0KKyAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuUm91dGVJbmZvLmdldFByZXNlbnRhdGlvbkRpc3BsYXkocmVjb3JkLm1Sb3V0ZU9iaik7CisgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uRGlzcGxheSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRQcmVzZW50YXRpb25EaXNwbGF5SWQocHJlc2VudGF0aW9uRGlzcGxheS5nZXREaXNwbGF5SWQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2FsbGJhY2soKSB7CisgICAgICAgICAgICBzdXBlci51cGRhdGVDYWxsYmFjaygpOworCisgICAgICAgICAgICBpZiAobUFjdGl2ZVNjYW5Xb3JrYXJvdW5kID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQWN0aXZlU2Nhbldvcmthcm91bmQgPSBuZXcgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuQWN0aXZlU2Nhbldvcmthcm91bmQoCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCksIGdldEhhbmRsZXIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQWN0aXZlU2Nhbldvcmthcm91bmQuc2V0QWN0aXZlU2NhblJvdXRlVHlwZXMobUFjdGl2ZVNjYW4gPyBtUm91dGVUeXBlcyA6IDApOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlQ2FsbGJhY2tPYmooKSB7CisgICAgICAgICAgICByZXR1cm4gTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuY3JlYXRlQ2FsbGJhY2sodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0Nvbm5lY3RpbmcoU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkKSB7CisgICAgICAgICAgICBpZiAobUlzQ29ubmVjdGluZ1dvcmthcm91bmQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Jc0Nvbm5lY3RpbmdXb3JrYXJvdW5kID0gbmV3IE1lZGlhUm91dGVySmVsbHliZWFuTXIxLklzQ29ubmVjdGluZ1dvcmthcm91bmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtSXNDb25uZWN0aW5nV29ya2Fyb3VuZC5pc0Nvbm5lY3RpbmcocmVjb3JkLm1Sb3V0ZU9iaik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBKZWxseWJlYW4gTVIyIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIC8vIEBAUmVxdWlyZXNBcGkoMTgpCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSmVsbHliZWFuTXIySW1wbCBleHRlbmRzIEplbGx5YmVhbk1yMUltcGwgeworICAgICAgICBwdWJsaWMgSmVsbHliZWFuTXIySW1wbChDb250ZXh0IGNvbnRleHQsIFN5bmNDYWxsYmFjayBzeW5jQ2FsbGJhY2spIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25CdWlsZFN5c3RlbVJvdXRlRGVzY3JpcHRvcihTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQsCisgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyKSB7CisgICAgICAgICAgICBzdXBlci5vbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKHJlY29yZCwgYnVpbGRlcik7CisKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBkZXNjcmlwdGlvbiA9CisgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuTXIyLlJvdXRlSW5mby5nZXREZXNjcmlwdGlvbihyZWNvcmQubVJvdXRlT2JqKTsKKyAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbi50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZWxlY3RSb3V0ZShPYmplY3Qgcm91dGVPYmopIHsKKyAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLnNlbGVjdFJvdXRlKG1Sb3V0ZXJPYmosCisgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLkFMTF9ST1VURV9UWVBFUywgcm91dGVPYmopOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0RGVmYXVsdFJvdXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIE1lZGlhUm91dGVySmVsbHliZWFuTXIyLmdldERlZmF1bHRSb3V0ZShtUm91dGVyT2JqKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVVc2VyUm91dGVQcm9wZXJ0aWVzKFVzZXJSb3V0ZVJlY29yZCByZWNvcmQpIHsKKyAgICAgICAgICAgIHN1cGVyLnVwZGF0ZVVzZXJSb3V0ZVByb3BlcnRpZXMocmVjb3JkKTsKKworICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuVXNlclJvdXRlSW5mby5zZXREZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaiwgcmVjb3JkLm1Sb3V0ZS5nZXREZXNjcmlwdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDYWxsYmFjaygpIHsKKyAgICAgICAgICAgIGlmIChtQ2FsbGJhY2tSZWdpc3RlcmVkKSB7CisgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4ucmVtb3ZlQ2FsbGJhY2sobVJvdXRlck9iaiwgbUNhbGxiYWNrT2JqKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUNhbGxiYWNrUmVnaXN0ZXJlZCA9IHRydWU7CisgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbk1yMi5hZGRDYWxsYmFjayhtUm91dGVyT2JqLCBtUm91dGVUeXBlcywgbUNhbGxiYWNrT2JqLAorICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTCisgICAgICAgICAgICAgICAgICAgIHwgKG1BY3RpdmVTY2FuID8gTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOIDogMCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzQ29ubmVjdGluZyhTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQpIHsKKyAgICAgICAgICAgIHJldHVybiBNZWRpYVJvdXRlckplbGx5YmVhbk1yMi5Sb3V0ZUluZm8uaXNDb25uZWN0aW5nKHJlY29yZC5tUm91dGVPYmopOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBpMjQgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgLy8gQEBSZXF1aXJlc0FwaSgyNCkKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBcGkyNEltcGwgZXh0ZW5kcyBKZWxseWJlYW5NcjJJbXBsIHsKKyAgICAgICAgcHVibGljIEFwaTI0SW1wbChDb250ZXh0IGNvbnRleHQsIFN5bmNDYWxsYmFjayBzeW5jQ2FsbGJhY2spIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25CdWlsZFN5c3RlbVJvdXRlRGVzY3JpcHRvcihTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyKSB7CisgICAgICAgICAgICBzdXBlci5vbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKHJlY29yZCwgYnVpbGRlcik7CisKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGV2aWNlVHlwZShNZWRpYVJvdXRlckFwaTI0LlJvdXRlSW5mby5nZXREZXZpY2VUeXBlKHJlY29yZC5tUm91dGVPYmopKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9wYWNrYWdlLmh0bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMmFhZjIKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsOSBAQAorPGh0bWw+CisKKzxib2R5PgorCis8cD5Db250YWlucyBBUElzIHRoYXQgY29udHJvbCB0aGUgcm91dGluZyBvZiBtZWRpYSBjaGFubmVscyBhbmQgc3RyZWFtcyBmcm9tIHRoZSBjdXJyZW50IGRldmljZQorICB0byBleHRlcm5hbCBzcGVha2VycyBhbmQgZGVzdGluYXRpb24gZGV2aWNlcy48L3A+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L0Jhc2VMYXlvdXQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L0Jhc2VMYXlvdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjY0NzFkCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvQmFzZUxheW91dC5qYXZhCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVmlld0dyb3VwUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTWFyZ2luTGF5b3V0UGFyYW1zOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworcHVibGljIGNsYXNzIEJhc2VMYXlvdXQgZXh0ZW5kcyBWaWV3R3JvdXBJbXBsIHsKKyAgICBwcml2YXRlIGZpbmFsIFZpZXdHcm91cCBtSW5zdGFuY2U7CisgICAgcHJpdmF0ZSBmaW5hbCBWaWV3R3JvdXBQcm92aWRlciBtU3VwZXJQcm92aWRlcjsKKyAgICBwcml2YXRlIGZpbmFsIFZpZXdHcm91cFByb3ZpZGVyIG1Qcml2YXRlUHJvdmlkZXI7CisKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxWaWV3PiBtTWF0Y2hQYXJlbnRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8PigxKTsKKworICAgIHB1YmxpYyBCYXNlTGF5b3V0KFZpZXdHcm91cCBpbnN0YW5jZSwKKyAgICAgICAgICAgIFZpZXdHcm91cFByb3ZpZGVyIHN1cGVyUHJvdmlkZXIsIFZpZXdHcm91cFByb3ZpZGVyIHByaXZhdGVQcm92aWRlcikgeworICAgICAgICBzdXBlcihpbnN0YW5jZSwgc3VwZXJQcm92aWRlciwgcHJpdmF0ZVByb3ZpZGVyKTsKKyAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7CisgICAgICAgIG1TdXBlclByb3ZpZGVyID0gc3VwZXJQcm92aWRlcjsKKyAgICAgICAgbVByaXZhdGVQcm92aWRlciA9IHByaXZhdGVQcm92aWRlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjaGVja0xheW91dFBhcmFtc19pbXBsKExheW91dFBhcmFtcyBwKSB7CisgICAgICAgIHJldHVybiBwIGluc3RhbmNlb2YgTWFyZ2luTGF5b3V0UGFyYW1zOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMYXlvdXRQYXJhbXMgZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zX2ltcGwoKSB7CisgICAgICAgIHJldHVybiBuZXcgTWFyZ2luTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMYXlvdXRQYXJhbXMgZ2VuZXJhdGVMYXlvdXRQYXJhbXNfaW1wbChBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNYXJnaW5MYXlvdXRQYXJhbXMobUluc3RhbmNlLmdldENvbnRleHQoKSwgYXR0cnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMYXlvdXRQYXJhbXMgZ2VuZXJhdGVMYXlvdXRQYXJhbXNfaW1wbChMYXlvdXRQYXJhbXMgbHApIHsKKyAgICAgICAgaWYgKGxwIGluc3RhbmNlb2YgTWFyZ2luTGF5b3V0UGFyYW1zKSB7CisgICAgICAgICAgICByZXR1cm4gbHA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBNYXJnaW5MYXlvdXRQYXJhbXMobHApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uTWVhc3VyZV9pbXBsKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKKyAgICAgICAgaW50IGNvdW50ID0gbUluc3RhbmNlLmdldENoaWxkQ291bnQoKTsKKworICAgICAgICBmaW5hbCBib29sZWFuIG1lYXN1cmVNYXRjaFBhcmVudENoaWxkcmVuID0KKyAgICAgICAgICAgICAgICBWaWV3Lk1lYXN1cmVTcGVjLmdldE1vZGUod2lkdGhNZWFzdXJlU3BlYykgIT0gVmlldy5NZWFzdXJlU3BlYy5FWEFDVExZIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBWaWV3Lk1lYXN1cmVTcGVjLmdldE1vZGUoaGVpZ2h0TWVhc3VyZVNwZWMpICE9IFZpZXcuTWVhc3VyZVNwZWMuRVhBQ1RMWTsKKyAgICAgICAgbU1hdGNoUGFyZW50Q2hpbGRyZW4uY2xlYXIoKTsKKworICAgICAgICBpbnQgbWF4SGVpZ2h0ID0gMDsKKyAgICAgICAgaW50IG1heFdpZHRoID0gMDsKKyAgICAgICAgaW50IGNoaWxkU3RhdGUgPSAwOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IG1JbnN0YW5jZS5nZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgaWYgKGNoaWxkLmdldFZpc2liaWxpdHkoKSAhPSBWaWV3LkdPTkUpIHsKKyAgICAgICAgICAgICAgICBtUHJpdmF0ZVByb3ZpZGVyLm1lYXN1cmVDaGlsZFdpdGhNYXJnaW5zX2ltcGwoCisgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCwgd2lkdGhNZWFzdXJlU3BlYywgMCwgaGVpZ2h0TWVhc3VyZVNwZWMsIDApOworICAgICAgICAgICAgICAgIGZpbmFsIE1hcmdpbkxheW91dFBhcmFtcyBscCA9IChNYXJnaW5MYXlvdXRQYXJhbXMpIGNoaWxkLmdldExheW91dFBhcmFtcygpOworICAgICAgICAgICAgICAgIG1heFdpZHRoID0gTWF0aC5tYXgobWF4V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5nZXRNZWFzdXJlZFdpZHRoKCkgKyBscC5sZWZ0TWFyZ2luICsgbHAucmlnaHRNYXJnaW4pOworICAgICAgICAgICAgICAgIG1heEhlaWdodCA9IE1hdGgubWF4KG1heEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmdldE1lYXN1cmVkSGVpZ2h0KCkgKyBscC50b3BNYXJnaW4gKyBscC5ib3R0b21NYXJnaW4pOworICAgICAgICAgICAgICAgIGNoaWxkU3RhdGUgPSBjaGlsZFN0YXRlIHwgY2hpbGQuZ2V0TWVhc3VyZWRTdGF0ZSgpOworICAgICAgICAgICAgICAgIGlmIChtZWFzdXJlTWF0Y2hQYXJlbnRDaGlsZHJlbikgeworICAgICAgICAgICAgICAgICAgICBpZiAobHAud2lkdGggPT0gTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLmhlaWdodCA9PSBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTWF0Y2hQYXJlbnRDaGlsZHJlbi5hZGQoY2hpbGQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQWNjb3VudCBmb3IgcGFkZGluZyB0b28KKyAgICAgICAgbWF4V2lkdGggKz0gZ2V0UGFkZGluZ0xlZnRXaXRoRm9yZWdyb3VuZCgpICsgZ2V0UGFkZGluZ1JpZ2h0V2l0aEZvcmVncm91bmQoKTsKKyAgICAgICAgbWF4SGVpZ2h0ICs9IGdldFBhZGRpbmdUb3BXaXRoRm9yZWdyb3VuZCgpICsgZ2V0UGFkZGluZ0JvdHRvbVdpdGhGb3JlZ3JvdW5kKCk7CisKKyAgICAgICAgLy8gQ2hlY2sgYWdhaW5zdCBvdXIgbWluaW11bSBoZWlnaHQgYW5kIHdpZHRoCisgICAgICAgIG1heEhlaWdodCA9IE1hdGgubWF4KG1heEhlaWdodCwgbVByaXZhdGVQcm92aWRlci5nZXRTdWdnZXN0ZWRNaW5pbXVtSGVpZ2h0X2ltcGwoKSk7CisgICAgICAgIG1heFdpZHRoID0gTWF0aC5tYXgobWF4V2lkdGgsIG1Qcml2YXRlUHJvdmlkZXIuZ2V0U3VnZ2VzdGVkTWluaW11bVdpZHRoX2ltcGwoKSk7CisKKyAgICAgICAgLy8gQ2hlY2sgYWdhaW5zdCBvdXIgZm9yZWdyb3VuZCdzIG1pbmltdW0gaGVpZ2h0IGFuZCB3aWR0aAorICAgICAgICBmaW5hbCBEcmF3YWJsZSBkcmF3YWJsZSA9IG1JbnN0YW5jZS5nZXRGb3JlZ3JvdW5kKCk7CisgICAgICAgIGlmIChkcmF3YWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtYXhIZWlnaHQgPSBNYXRoLm1heChtYXhIZWlnaHQsIGRyYXdhYmxlLmdldE1pbmltdW1IZWlnaHQoKSk7CisgICAgICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLCBkcmF3YWJsZS5nZXRNaW5pbXVtV2lkdGgoKSk7CisgICAgICAgIH0KKworICAgICAgICBtUHJpdmF0ZVByb3ZpZGVyLnNldE1lYXN1cmVkRGltZW5zaW9uX2ltcGwoCisgICAgICAgICAgICAgICAgbUluc3RhbmNlLnJlc29sdmVTaXplQW5kU3RhdGUobWF4V2lkdGgsIHdpZHRoTWVhc3VyZVNwZWMsIGNoaWxkU3RhdGUpLAorICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5yZXNvbHZlU2l6ZUFuZFN0YXRlKG1heEhlaWdodCwgaGVpZ2h0TWVhc3VyZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZFN0YXRlIDw8IFZpZXcuTUVBU1VSRURfSEVJR0hUX1NUQVRFX1NISUZUKSk7CisKKyAgICAgICAgY291bnQgPSBtTWF0Y2hQYXJlbnRDaGlsZHJlbi5zaXplKCk7CisgICAgICAgIGlmIChjb3VudCA+IDEpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBtTWF0Y2hQYXJlbnRDaGlsZHJlbi5nZXQoaSk7CisgICAgICAgICAgICAgICAgZmluYWwgTWFyZ2luTGF5b3V0UGFyYW1zIGxwID0gKE1hcmdpbkxheW91dFBhcmFtcykgY2hpbGQuZ2V0TGF5b3V0UGFyYW1zKCk7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY2hpbGRXaWR0aE1lYXN1cmVTcGVjOworICAgICAgICAgICAgICAgIGlmIChscC53aWR0aCA9PSBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IE1hdGgubWF4KDAsIG1JbnN0YW5jZS5nZXRNZWFzdXJlZFdpZHRoKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGdldFBhZGRpbmdMZWZ0V2l0aEZvcmVncm91bmQoKSAtIGdldFBhZGRpbmdSaWdodFdpdGhGb3JlZ3JvdW5kKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGxwLmxlZnRNYXJnaW4gLSBscC5yaWdodE1hcmdpbik7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkV2lkdGhNZWFzdXJlU3BlYyA9IFZpZXcuTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBWaWV3Lk1lYXN1cmVTcGVjLkVYQUNUTFkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkV2lkdGhNZWFzdXJlU3BlYyA9IG1JbnN0YW5jZS5nZXRDaGlsZE1lYXN1cmVTcGVjKHdpZHRoTWVhc3VyZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGFkZGluZ0xlZnRXaXRoRm9yZWdyb3VuZCgpICsgZ2V0UGFkZGluZ1JpZ2h0V2l0aEZvcmVncm91bmQoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC5sZWZ0TWFyZ2luICsgbHAucmlnaHRNYXJnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAud2lkdGgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZpbmFsIGludCBjaGlsZEhlaWdodE1lYXN1cmVTcGVjOworICAgICAgICAgICAgICAgIGlmIChscC5oZWlnaHQgPT0gTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gTWF0aC5tYXgoMCwgbUluc3RhbmNlLmdldE1lYXN1cmVkSGVpZ2h0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGdldFBhZGRpbmdUb3BXaXRoRm9yZWdyb3VuZCgpIC0gZ2V0UGFkZGluZ0JvdHRvbVdpdGhGb3JlZ3JvdW5kKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGxwLnRvcE1hcmdpbiAtIGxwLmJvdHRvbU1hcmdpbik7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkSGVpZ2h0TWVhc3VyZVNwZWMgPSBWaWV3Lk1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIFZpZXcuTWVhc3VyZVNwZWMuRVhBQ1RMWSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRIZWlnaHRNZWFzdXJlU3BlYyA9IG1JbnN0YW5jZS5nZXRDaGlsZE1lYXN1cmVTcGVjKGhlaWdodE1lYXN1cmVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBhZGRpbmdUb3BXaXRoRm9yZWdyb3VuZCgpICsgZ2V0UGFkZGluZ0JvdHRvbVdpdGhGb3JlZ3JvdW5kKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAudG9wTWFyZ2luICsgbHAuYm90dG9tTWFyZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLmhlaWdodCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2hpbGQubWVhc3VyZShjaGlsZFdpZHRoTWVhc3VyZVNwZWMsIGNoaWxkSGVpZ2h0TWVhc3VyZVNwZWMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25MYXlvdXRfaW1wbChib29sZWFuIGNoYW5nZWQsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKKyAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUluc3RhbmNlLmdldENoaWxkQ291bnQoKTsKKworICAgICAgICBmaW5hbCBpbnQgcGFyZW50TGVmdCA9IGdldFBhZGRpbmdMZWZ0V2l0aEZvcmVncm91bmQoKTsKKyAgICAgICAgZmluYWwgaW50IHBhcmVudFJpZ2h0ID0gcmlnaHQgLSBsZWZ0IC0gZ2V0UGFkZGluZ1JpZ2h0V2l0aEZvcmVncm91bmQoKTsKKworICAgICAgICBmaW5hbCBpbnQgcGFyZW50VG9wID0gZ2V0UGFkZGluZ1RvcFdpdGhGb3JlZ3JvdW5kKCk7CisgICAgICAgIGZpbmFsIGludCBwYXJlbnRCb3R0b20gPSBib3R0b20gLSB0b3AgLSBnZXRQYWRkaW5nQm90dG9tV2l0aEZvcmVncm91bmQoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBtSW5zdGFuY2UuZ2V0Q2hpbGRBdChpKTsKKyAgICAgICAgICAgIGlmIChjaGlsZC5nZXRWaXNpYmlsaXR5KCkgIT0gVmlldy5HT05FKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTWFyZ2luTGF5b3V0UGFyYW1zIGxwID0gKE1hcmdpbkxheW91dFBhcmFtcykgY2hpbGQuZ2V0TGF5b3V0UGFyYW1zKCk7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBjaGlsZC5nZXRNZWFzdXJlZFdpZHRoKCk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IGNoaWxkLmdldE1lYXN1cmVkSGVpZ2h0KCk7CisKKyAgICAgICAgICAgICAgICBpbnQgY2hpbGRMZWZ0OworICAgICAgICAgICAgICAgIGludCBjaGlsZFRvcDsKKworICAgICAgICAgICAgICAgIGNoaWxkTGVmdCA9IHBhcmVudExlZnQgKyAocGFyZW50UmlnaHQgLSBwYXJlbnRMZWZ0IC0gd2lkdGgpIC8gMiArCisgICAgICAgICAgICAgICAgICAgICAgICBscC5sZWZ0TWFyZ2luIC0gbHAucmlnaHRNYXJnaW47CisKKyAgICAgICAgICAgICAgICBjaGlsZFRvcCA9IHBhcmVudFRvcCArIChwYXJlbnRCb3R0b20gLSBwYXJlbnRUb3AgLSBoZWlnaHQpIC8gMiArCisgICAgICAgICAgICAgICAgICAgICAgICBscC50b3BNYXJnaW4gLSBscC5ib3R0b21NYXJnaW47CisKKyAgICAgICAgICAgICAgICBjaGlsZC5sYXlvdXQoY2hpbGRMZWZ0LCBjaGlsZFRvcCwgY2hpbGRMZWZ0ICsgd2lkdGgsIGNoaWxkVG9wICsgaGVpZ2h0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHNob3VsZERlbGF5Q2hpbGRQcmVzc2VkU3RhdGVfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldFBhZGRpbmdMZWZ0V2l0aEZvcmVncm91bmQoKSB7CisgICAgICAgIHJldHVybiBtSW5zdGFuY2UuaXNGb3JlZ3JvdW5kSW5zaWRlUGFkZGluZygpID8gTWF0aC5tYXgobUluc3RhbmNlLmdldFBhZGRpbmdMZWZ0KCksIDApIDoKKyAgICAgICAgICAgICAgICBtSW5zdGFuY2UuZ2V0UGFkZGluZ0xlZnQoKSArIDA7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0UGFkZGluZ1JpZ2h0V2l0aEZvcmVncm91bmQoKSB7CisgICAgICAgIHJldHVybiBtSW5zdGFuY2UuaXNGb3JlZ3JvdW5kSW5zaWRlUGFkZGluZygpID8gTWF0aC5tYXgobUluc3RhbmNlLmdldFBhZGRpbmdSaWdodCgpLCAwKSA6CisgICAgICAgICAgICAgICAgbUluc3RhbmNlLmdldFBhZGRpbmdSaWdodCgpICsgMDsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRQYWRkaW5nVG9wV2l0aEZvcmVncm91bmQoKSB7CisgICAgICAgIHJldHVybiBtSW5zdGFuY2UuaXNGb3JlZ3JvdW5kSW5zaWRlUGFkZGluZygpID8gTWF0aC5tYXgobUluc3RhbmNlLmdldFBhZGRpbmdUb3AoKSwgMCkgOgorICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5nZXRQYWRkaW5nVG9wKCkgKyAwOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldFBhZGRpbmdCb3R0b21XaXRoRm9yZWdyb3VuZCgpIHsKKyAgICAgICAgcmV0dXJuIG1JbnN0YW5jZS5pc0ZvcmVncm91bmRJbnNpZGVQYWRkaW5nKCkgPyBNYXRoLm1heChtSW5zdGFuY2UuZ2V0UGFkZGluZ0JvdHRvbSgpLCAwKSA6CisgICAgICAgICAgICAgICAgbUluc3RhbmNlLmdldFBhZGRpbmdCb3R0b20oKSArIDA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvTWVkaWFDb250cm9sVmlldzJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9NZWRpYUNvbnRyb2xWaWV3MkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWZmMTUwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvTWVkaWFDb250cm9sVmlldzJJbXBsLmphdmEKQEAgLTAsMCArMSwxNzIyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhOworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYUNvbnRyb2xsZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOworaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhQ29udHJvbFZpZXcyUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVmlld0dyb3VwUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJhc2VBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbFZpZXcyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlByb2dyZXNzQmFyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlBvcHVwV2luZG93OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbGF0aXZlTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNlZWtCYXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Vla0Jhci5PblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlIZWxwZXI7CitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLlI7CitpbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuTWVkaWFSb3V0ZUJ1dHRvbjsKK2ltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Gb3JtYXR0ZXI7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworcHVibGljIGNsYXNzIE1lZGlhQ29udHJvbFZpZXcySW1wbCBleHRlbmRzIEJhc2VMYXlvdXQgaW1wbGVtZW50cyBNZWRpYUNvbnRyb2xWaWV3MlByb3ZpZGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhQ29udHJvbFZpZXcyIjsKKworICAgIHByaXZhdGUgZmluYWwgTWVkaWFDb250cm9sVmlldzIgbUluc3RhbmNlOworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9LRVlfRlVMTFNDUkVFTiA9ICJmdWxsU2NyZWVuIjsKKworICAgIC8vIFRPRE86IE1vdmUgdGhlc2UgY29uc3RhbnRzIHRvIHB1YmxpYyBhcGkgdG8gc3VwcG9ydCBjdXN0b20gdmlkZW8gdmlldy4KKyAgICAvLyBUT0RPOiBDb21iaW5lIHRoZXNlIGNvbnN0YW50cyBpbnRvIG9uZSByZWdhcmRpbmcgVHJhY2tJbmZvLgorICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZJREVPX1RSQUNLX0NPVU5UID0gIlZpZGVvVHJhY2tDb3VudCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQVVESU9fVFJBQ0tfQ09VTlQgPSAiQXVkaW9UcmFja0NvdW50IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TVUJUSVRMRV9UUkFDS19DT1VOVCA9ICJTdWJ0aXRsZVRyYWNrQ291bnQiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BMQVlCQUNLX1NQRUVEID0gIlBsYXliYWNrU3BlZWQiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFTEVDVEVEX0FVRElPX0lOREVYID0gIlNlbGVjdGVkQXVkaW9JbmRleCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VMRUNURURfU1VCVElUTEVfSU5ERVggPSAiU2VsZWN0ZWRTdWJ0aXRsZUluZGV4IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX1VQREFURV9UUkFDS19TVEFUVVMgPSAiVXBkYXRlVHJhY2tTdGF0dXMiOworCisgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgb25jZSBpbnRlZ3JhdGluZyB3aXRoIE1lZGlhU2Vzc2lvbjIgJiBNZWRpYU1ldGFkYXRhMgorICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NUQVRFX0lTX0FEVkVSVElTRU1FTlQgPSAiTWVkaWFUeXBlQWR2ZXJ0aXNlbWVudCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9VUERBVEVfTUVESUFfVFlQRV9TVEFUVVMgPSAiVXBkYXRlTWVkaWFUeXBlU3RhdHVzIjsKKworICAgIC8vIFN0cmluZyBmb3Igc2VuZGluZyBjb21tYW5kIHRvIHNob3cgc3VidGl0bGUgdG8gTWVkaWFTZXNzaW9uLgorICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9TSE9XX1NVQlRJVExFID0gInNob3dTdWJ0aXRsZSI7CisgICAgLy8gU3RyaW5nIGZvciBzZW5kaW5nIGNvbW1hbmQgdG8gaGlkZSBzdWJ0aXRsZSB0byBNZWRpYVNlc3Npb24uCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX0hJREVfU1VCVElUTEUgPSAiaGlkZVN1YnRpdGxlIjsKKyAgICAvLyBUT0RPOiByZW1vdmUgb25jZSB0aGUgaW1wbGVtZW50YXRpb24gaXMgcmV2aXNlZAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfU0VUX0ZVTExTQ1JFRU4gPSAic2V0RnVsbHNjcmVlbiI7CisgICAgLy8gU3RyaW5nIGZvciBzZW5kaW5nIGNvbW1hbmQgdG8gc2VsZWN0IGF1ZGlvIHRyYWNrIHRvIE1lZGlhU2Vzc2lvbi4KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfU0VMRUNUX0FVRElPX1RSQUNLID0gIlNlbGVjdFRyYWNrIjsKKyAgICAvLyBTdHJpbmcgZm9yIHNlbmRpbmcgY29tbWFuZCB0byBzZXQgcGxheWJhY2sgc3BlZWQgdG8gTWVkaWFTZXNzaW9uLgorICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9TRVRfUExBWUJBQ0tfU1BFRUQgPSAiU2V0UGxheWJhY2tTcGVlZCI7CisgICAgLy8gU3RyaW5nIGZvciBzZW5kaW5nIGNvbW1hbmQgdG8gbXV0ZSBhdWRpbyB0byBNZWRpYVNlc3Npb24uCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX01VVEU9ICJNdXRlIjsKKyAgICAvLyBTdHJpbmcgZm9yIHNlbmRpbmcgY29tbWFuZCB0byB1bm11dGUgYXVkaW8gdG8gTWVkaWFTZXNzaW9uLgorICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9VTk1VVEUgPSAiVW5tdXRlIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRUSU5HU19NT0RFX0FVRElPX1RSQUNLID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUVElOR1NfTU9ERV9QTEFZQkFDS19TUEVFRCA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVFRJTkdTX01PREVfSEVMUCA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVFRJTkdTX01PREVfU1VCVElUTEVfVFJBQ0sgPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRUSU5HU19NT0RFX1ZJREVPX1FVQUxJVFkgPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRUSU5HU19NT0RFX01BSU4gPSA1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TUEVFRF8xeF9JTkRFWCA9IDM7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfVFlQRV9ERUZBVUxUID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfVFlQRV9NVVNJQyA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FRElBX1RZUEVfQURWRVJUSVNFTUVOVCA9IDI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX0VNQkVEREVEID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX0ZVTEwgPSAxOworICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBNaW5pbWFsIHNpemUgdHlwZS4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX01JTklNQUwgPSAyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9QUk9HUkVTUyA9IDEwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUFJPR1JFU1NfVVBEQVRFX1RJTUVfTVMgPSAxMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVdJTkRfVElNRV9NUyA9IDEwMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGT1JXQVJEX1RJTUVfTVMgPSAzMDAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQURfU0tJUF9XQUlUX1RJTUVfTVMgPSA1MDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNPVVJDRV9OT05fRVhJU1RFTlQgPSAtMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfRU1QVFkgPSAiIjsKKworICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXNvdXJjZXM7CisgICAgcHJpdmF0ZSBNZWRpYUNvbnRyb2xsZXIgbUNvbnRyb2xsZXI7CisgICAgcHJpdmF0ZSBNZWRpYUNvbnRyb2xsZXIuVHJhbnNwb3J0Q29udHJvbHMgbUNvbnRyb2xzOworICAgIHByaXZhdGUgUGxheWJhY2tTdGF0ZSBtUGxheWJhY2tTdGF0ZTsKKyAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGEgbU1ldGFkYXRhOworICAgIHByaXZhdGUgaW50IG1EdXJhdGlvbjsKKyAgICBwcml2YXRlIGludCBtUHJldlN0YXRlOworICAgIHByaXZhdGUgaW50IG1QcmV2V2lkdGg7CisgICAgcHJpdmF0ZSBpbnQgbVByZXZIZWlnaHQ7CisgICAgcHJpdmF0ZSBpbnQgbU9yaWdpbmFsTGVmdEJhcldpZHRoOworICAgIHByaXZhdGUgaW50IG1WaWRlb1RyYWNrQ291bnQ7CisgICAgcHJpdmF0ZSBpbnQgbUF1ZGlvVHJhY2tDb3VudDsKKyAgICBwcml2YXRlIGludCBtU3VidGl0bGVUcmFja0NvdW50OworICAgIHByaXZhdGUgaW50IG1TZXR0aW5nc01vZGU7CisgICAgcHJpdmF0ZSBpbnQgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4OworICAgIHByaXZhdGUgaW50IG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleDsKKyAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRWaWRlb1F1YWxpdHlJbmRleDsKKyAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRTcGVlZEluZGV4OworICAgIHByaXZhdGUgaW50IG1FbWJlZGRlZFNldHRpbmdzSXRlbVdpZHRoOworICAgIHByaXZhdGUgaW50IG1GdWxsU2V0dGluZ3NJdGVtV2lkdGg7CisgICAgcHJpdmF0ZSBpbnQgbUVtYmVkZGVkU2V0dGluZ3NJdGVtSGVpZ2h0OworICAgIHByaXZhdGUgaW50IG1GdWxsU2V0dGluZ3NJdGVtSGVpZ2h0OworICAgIHByaXZhdGUgaW50IG1TZXR0aW5nc1dpbmRvd01hcmdpbjsKKyAgICBwcml2YXRlIGludCBtTWVkaWFUeXBlOworICAgIHByaXZhdGUgaW50IG1TaXplVHlwZTsKKyAgICBwcml2YXRlIGxvbmcgbVBsYXliYWNrQWN0aW9uczsKKyAgICBwcml2YXRlIGJvb2xlYW4gbURyYWdnaW5nOworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNGdWxsU2NyZWVuOworICAgIHByaXZhdGUgYm9vbGVhbiBtT3ZlcmZsb3dFeHBhbmRlZDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzU3RvcHBlZDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVN1YnRpdGxlSXNFbmFibGVkOworICAgIHByaXZhdGUgYm9vbGVhbiBtU2Vla0F2YWlsYWJsZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzQWR2ZXJ0aXNlbWVudDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzTXV0ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbU5lZWRVWFVwZGF0ZTsKKworICAgIC8vIFJlbGF0aW5nIHRvIFRpdGxlIEJhciBWaWV3CisgICAgcHJpdmF0ZSBWaWV3R3JvdXAgbVJvb3Q7CisgICAgcHJpdmF0ZSBWaWV3IG1UaXRsZUJhcjsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1UaXRsZVZpZXc7CisgICAgcHJpdmF0ZSBWaWV3IG1BZEV4dGVybmFsTGluazsKKyAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1CYWNrQnV0dG9uOworICAgIHByaXZhdGUgTWVkaWFSb3V0ZUJ1dHRvbiBtUm91dGVCdXR0b247CisgICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVJvdXRlU2VsZWN0b3I7CisKKyAgICAvLyBSZWxhdGluZyB0byBDZW50ZXIgVmlldworICAgIHByaXZhdGUgVmlld0dyb3VwIG1DZW50ZXJWaWV3OworICAgIHByaXZhdGUgVmlldyBtVHJhbnNwb3J0Q29udHJvbHM7CisgICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtUGxheVBhdXNlQnV0dG9uOworICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbUZmd2RCdXR0b247CisgICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtUmV3QnV0dG9uOworICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbU5leHRCdXR0b247CisgICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtUHJldkJ1dHRvbjsKKworICAgIC8vIFJlbGF0aW5nIHRvIE1pbmltYWwgRXh0cmEgVmlldworICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1NaW5pbWFsRXh0cmFWaWV3OworCisgICAgLy8gUmVsYXRpbmcgdG8gUHJvZ3Jlc3MgQmFyIFZpZXcKKyAgICBwcml2YXRlIFByb2dyZXNzQmFyIG1Qcm9ncmVzczsKKyAgICBwcml2YXRlIFZpZXcgbVByb2dyZXNzQnVmZmVyOworCisgICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhciBWaWV3CisgICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUJvdHRvbUJhcjsKKworICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIgTGVmdCBWaWV3CisgICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUJvdHRvbUJhckxlZnRWaWV3OworICAgIHByaXZhdGUgVmlld0dyb3VwIG1UaW1lVmlldzsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1FbmRUaW1lOworICAgIHByaXZhdGUgVGV4dFZpZXcgbUN1cnJlbnRUaW1lOworICAgIHByaXZhdGUgVGV4dFZpZXcgbUFkU2tpcFZpZXc7CisgICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIG1Gb3JtYXRCdWlsZGVyOworICAgIHByaXZhdGUgRm9ybWF0dGVyIG1Gb3JtYXR0ZXI7CisKKyAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyIFJpZ2h0IFZpZXcKKyAgICBwcml2YXRlIFZpZXdHcm91cCBtQm90dG9tQmFyUmlnaHRWaWV3OworICAgIHByaXZhdGUgVmlld0dyb3VwIG1CYXNpY0NvbnRyb2xzOworICAgIHByaXZhdGUgVmlld0dyb3VwIG1FeHRyYUNvbnRyb2xzOworICAgIHByaXZhdGUgVmlld0dyb3VwIG1DdXN0b21CdXR0b25zOworICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbVN1YnRpdGxlQnV0dG9uOworICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbUZ1bGxTY3JlZW5CdXR0b247CisgICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtT3ZlcmZsb3dCdXR0b25SaWdodDsKKyAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1PdmVyZmxvd0J1dHRvbkxlZnQ7CisgICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtTXV0ZUJ1dHRvbjsKKyAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1WaWRlb1F1YWxpdHlCdXR0b247CisgICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtU2V0dGluZ3NCdXR0b247CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtQWRSZW1haW5pbmdWaWV3OworCisgICAgLy8gUmVsYXRpbmcgdG8gU2V0dGluZ3MgTGlzdCBWaWV3CisgICAgcHJpdmF0ZSBMaXN0VmlldyBtU2V0dGluZ3NMaXN0VmlldzsKKyAgICBwcml2YXRlIFBvcHVwV2luZG93IG1TZXR0aW5nc1dpbmRvdzsKKyAgICBwcml2YXRlIFNldHRpbmdzQWRhcHRlciBtU2V0dGluZ3NBZGFwdGVyOworICAgIHByaXZhdGUgU3ViU2V0dGluZ3NBZGFwdGVyIG1TdWJTZXR0aW5nc0FkYXB0ZXI7CisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVNldHRpbmdzTWFpblRleHRzTGlzdDsKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtU2V0dGluZ3NTdWJUZXh0c0xpc3Q7CisgICAgcHJpdmF0ZSBMaXN0PEludGVnZXI+IG1TZXR0aW5nc0ljb25JZHNMaXN0OworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1TdWJ0aXRsZURlc2NyaXB0aW9uc0xpc3Q7CisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbUF1ZGlvVHJhY2tMaXN0OworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1WaWRlb1F1YWxpdHlMaXN0OworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1QbGF5YmFja1NwZWVkVGV4dExpc3Q7CisgICAgcHJpdmF0ZSBMaXN0PEZsb2F0PiBtUGxheWJhY2tTcGVlZExpc3Q7CisKKyAgICBwdWJsaWMgTWVkaWFDb250cm9sVmlldzJJbXBsKE1lZGlhQ29udHJvbFZpZXcyIGluc3RhbmNlLAorICAgICAgICAgICAgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyKSB7CisgICAgICAgIHN1cGVyKGluc3RhbmNlLCBzdXBlclByb3ZpZGVyLCBwcml2YXRlUHJvdmlkZXIpOworICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKEBOdWxsYWJsZSBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgeworICAgICAgICBtUmVzb3VyY2VzID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgLy8gSW5mbGF0ZSBNZWRpYUNvbnRyb2xWaWV3MiBmcm9tIFhNTAorICAgICAgICBtUm9vdCA9IG1ha2VDb250cm9sbGVyVmlldygpOworICAgICAgICBtSW5zdGFuY2UuYWRkVmlldyhtUm9vdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0TWVkaWFTZXNzaW9uVG9rZW5faW1wbChTZXNzaW9uVG9rZW4yIHRva2VuKSB7CisgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0T25GdWxsU2NyZWVuTGlzdGVuZXJfaW1wbChNZWRpYUNvbnRyb2xWaWV3Mi5PbkZ1bGxTY3JlZW5MaXN0ZW5lciBsKSB7CisgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Q29udHJvbGxlcl9pbXBsKE1lZGlhQ29udHJvbGxlciBjb250cm9sbGVyKSB7CisgICAgICAgIG1Db250cm9sbGVyID0gY29udHJvbGxlcjsKKyAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNvbnRyb2xzID0gY29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpOworICAgICAgICAgICAgLy8gU2V0IG1NZXRhZGF0YSBhbmQgbVBsYXliYWNrU3RhdGUgdG8gZXhpc3RpbmcgTWVkaWFTZXNzaW9uIHZhcmlhYmxlcyBzaW5jZSB0aGV5IG1heQorICAgICAgICAgICAgLy8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkCisgICAgICAgICAgICBtUGxheWJhY2tTdGF0ZSA9IG1Db250cm9sbGVyLmdldFBsYXliYWNrU3RhdGUoKTsKKyAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1Db250cm9sbGVyLmdldE1ldGFkYXRhKCk7CisgICAgICAgICAgICB1cGRhdGVEdXJhdGlvbigpOworICAgICAgICAgICAgdXBkYXRlVGl0bGUoKTsKKworICAgICAgICAgICAgbUNvbnRyb2xsZXIucmVnaXN0ZXJDYWxsYmFjayhuZXcgTWVkaWFDb250cm9sbGVyQ2FsbGJhY2soKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRCdXR0b25WaXNpYmlsaXR5X2ltcGwoaW50IGJ1dHRvbiwgaW50IHZpc2liaWxpdHkpIHsKKyAgICAgICAgLy8gVE9ETzogYWRkIG1lbWJlciB2YXJpYWJsZXMgZm9yIEZhc3QtRm9yd2FyZC9QcnZpb3VzL1Jld2luZCBidXR0b25zIHRvIHNhdmUgdmlzaWJpbGl0eSBpbgorICAgICAgICAvLyBvcmRlciB0byBwcmV2ZW50IGJlaW5nIG92ZXJyaWRlbiBpbnNpZGUgdXBkYXRlTGF5b3V0KCkuCisgICAgICAgIHN3aXRjaCAoYnV0dG9uKSB7CisgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9QTEFZX1BBVVNFOgorICAgICAgICAgICAgICAgIGlmIChtUGxheVBhdXNlQnV0dG9uICE9IG51bGwgJiYgY2FuUGF1c2UoKSkgeworICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fRkZXRDoKKyAgICAgICAgICAgICAgICBpZiAobUZmd2RCdXR0b24gIT0gbnVsbCAmJiBjYW5TZWVrRm9yd2FyZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fUkVXOgorICAgICAgICAgICAgICAgIGlmIChtUmV3QnV0dG9uICE9IG51bGwgJiYgY2FuU2Vla0JhY2t3YXJkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX05FWFQ6CisgICAgICAgICAgICAgICAgaWYgKG1OZXh0QnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9QUkVWOgorICAgICAgICAgICAgICAgIGlmIChtUHJldkJ1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1QcmV2QnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fU1VCVElUTEU6CisgICAgICAgICAgICAgICAgaWYgKG1TdWJ0aXRsZUJ1dHRvbiAhPSBudWxsICYmIG1TdWJ0aXRsZVRyYWNrQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX0ZVTExfU0NSRUVOOgorICAgICAgICAgICAgICAgIGlmIChtRnVsbFNjcmVlbkJ1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fT1ZFUkZMT1c6CisgICAgICAgICAgICAgICAgaWYgKG1PdmVyZmxvd0J1dHRvblJpZ2h0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbU92ZXJmbG93QnV0dG9uUmlnaHQuc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9NVVRFOgorICAgICAgICAgICAgICAgIGlmIChtTXV0ZUJ1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1NdXRlQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fU0VUVElOR1M6CisgICAgICAgICAgICAgICAgaWYgKG1TZXR0aW5nc0J1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc0J1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXF1ZXN0UGxheUJ1dHRvbkZvY3VzX2ltcGwoKSB7CisgICAgICAgIGlmIChtUGxheVBhdXNlQnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24ucmVxdWVzdEZvY3VzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldEFjY2Vzc2liaWxpdHlDbGFzc05hbWVfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIE1lZGlhQ29udHJvbFZpZXcyLmNsYXNzLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gVE9ETzogU2hvdWxkIHRoaXMgZnVuY3Rpb24gYmUgcmVtb3ZlZD8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRyYWNrYmFsbEV2ZW50X2ltcGwoTW90aW9uRXZlbnQgZXYpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uTWVhc3VyZV9pbXBsKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKKyAgICAgICAgc3VwZXIub25NZWFzdXJlX2ltcGwod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOworCisgICAgICAgIC8vIFVwZGF0ZSBsYXlvdXQgd2hlbiB0aGlzIHZpZXcncyB3aWR0aCBjaGFuZ2VzIGluIG9yZGVyIHRvIGF2b2lkIGFueSBVSSBvdmVybGFwIGJldHdlZW4KKyAgICAgICAgLy8gdHJhbnNwb3J0IGNvbnRyb2xzLgorICAgICAgICBpZiAobVByZXZXaWR0aCAhPSBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRXaWR0aCgpCisgICAgICAgICAgICAgICAgfHwgbVByZXZIZWlnaHQgIT0gbUluc3RhbmNlLmdldE1lYXN1cmVkSGVpZ2h0KCkgfHwgbU5lZWRVWFVwZGF0ZSkgeworICAgICAgICAgICAgLy8gRGlzbWlzcyBTZXR0aW5nc1dpbmRvdyBpZiBpdCBpcyBzaG93aW5nLgorICAgICAgICAgICAgbVNldHRpbmdzV2luZG93LmRpc21pc3MoKTsKKworICAgICAgICAgICAgLy8gVGhlc2Ugdmlld3MgbWF5IG5vdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgeWV0LgorICAgICAgICAgICAgaWYgKG1UcmFuc3BvcnRDb250cm9scy5nZXRXaWR0aCgpID09IDAgfHwgbVRpbWVWaWV3LmdldFdpZHRoKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGN1cnJXaWR0aCA9IG1JbnN0YW5jZS5nZXRNZWFzdXJlZFdpZHRoKCk7CisgICAgICAgICAgICBpbnQgY3VyckhlaWdodCA9IG1JbnN0YW5jZS5nZXRNZWFzdXJlZEhlaWdodCgpOworICAgICAgICAgICAgV2luZG93TWFuYWdlciBtYW5hZ2VyID0gKFdpbmRvd01hbmFnZXIpIG1JbnN0YW5jZS5nZXRDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25Db250ZXh0KCkKKyAgICAgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSk7CisgICAgICAgICAgICBQb2ludCBzY3JlZW5TaXplID0gbmV3IFBvaW50KCk7CisgICAgICAgICAgICBtYW5hZ2VyLmdldERlZmF1bHREaXNwbGF5KCkuZ2V0U2l6ZShzY3JlZW5TaXplKTsKKyAgICAgICAgICAgIGludCBzY3JlZW5XaWR0aCA9IHNjcmVlblNpemUueDsKKyAgICAgICAgICAgIGludCBzY3JlZW5IZWlnaHQgPSBzY3JlZW5TaXplLnk7CisgICAgICAgICAgICBpbnQgZnVsbEljb25TaXplID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi5tY3YyX2Z1bGxfaWNvbl9zaXplKTsKKyAgICAgICAgICAgIGludCBlbWJlZGRlZEljb25TaXplID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCisgICAgICAgICAgICAgICAgICAgIFIuZGltZW4ubWN2Ml9lbWJlZGRlZF9pY29uX3NpemUpOworICAgICAgICAgICAgaW50IG1hcmdpblNpemUgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLm1jdjJfaWNvbl9tYXJnaW4pOworCisgICAgICAgICAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgQWR2ZXJ0aXNlbWVudCBNb2RlLgorICAgICAgICAgICAgaWYgKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9ERUZBVUxUKSB7CisgICAgICAgICAgICAgICAgLy8gTWF4IG51bWJlciBvZiBpY29ucyBpbnNpZGUgQm90dG9tQmFyUmlnaHRWaWV3IGZvciBNdXNpYyBtb2RlIGlzIDQuCisgICAgICAgICAgICAgICAgaW50IG1heEljb25Db3VudCA9IDQ7CisgICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0KG1heEljb25Db3VudCwgZnVsbEljb25TaXplLCBlbWJlZGRlZEljb25TaXplLCBtYXJnaW5TaXplLCBjdXJyV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJySGVpZ2h0LCBzY3JlZW5XaWR0aCwgc2NyZWVuSGVpZ2h0KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX01VU0lDKSB7CisgICAgICAgICAgICAgICAgaWYgKG1OZWVkVVhVcGRhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gT25lLXRpbWUgb3BlcmF0aW9uIGZvciBNdXNpYyBtZWRpYSB0eXBlCisgICAgICAgICAgICAgICAgICAgIG1CYXNpY0NvbnRyb2xzLnJlbW92ZVZpZXcobU11dGVCdXR0b24pOworICAgICAgICAgICAgICAgICAgICBtRXh0cmFDb250cm9scy5hZGRWaWV3KG1NdXRlQnV0dG9uLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgbVZpZGVvUXVhbGl0eUJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRmZ3ZEJ1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1SZXdCdXR0b24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbU5lZWRVWFVwZGF0ZSA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgLy8gTWF4IG51bWJlciBvZiBpY29ucyBpbnNpZGUgQm90dG9tQmFyUmlnaHRWaWV3IGZvciBNdXNpYyBtb2RlIGlzIDMuCisgICAgICAgICAgICAgICAgaW50IG1heEljb25Db3VudCA9IDM7CisgICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0KG1heEljb25Db3VudCwgZnVsbEljb25TaXplLCBlbWJlZGRlZEljb25TaXplLCBtYXJnaW5TaXplLCBjdXJyV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJySGVpZ2h0LCBzY3JlZW5XaWR0aCwgc2NyZWVuSGVpZ2h0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QcmV2V2lkdGggPSBjdXJyV2lkdGg7CisgICAgICAgICAgICBtUHJldkhlaWdodCA9IGN1cnJIZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzogbW92ZSB0aGlzIHRvIGEgZGlmZmVyZW50IGxvY2F0aW9uLgorICAgICAgICAvLyBVcGRhdGUgdGl0bGUgYmFyIHBhcmFtZXRlcnMgaW4gb3JkZXIgdG8gYXZvaWQgb3ZlcmxhcCBiZXR3ZWVuIHRpdGxlIHZpZXcgYW5kIHRoZSByaWdodAorICAgICAgICAvLyBzaWRlIG9mIHRoZSB0aXRsZSBiYXIuCisgICAgICAgIHVwZGF0ZVRpdGxlQmFyTGF5b3V0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZF9pbXBsKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBzdXBlci5zZXRFbmFibGVkX2ltcGwoZW5hYmxlZCk7CisKKyAgICAgICAgLy8gVE9ETzogTWVyZ2UgdGhlIGJlbG93IGNvZGUgd2l0aCBkaXNhYmxlVW5zdXBwb3J0ZWRCdXR0b25zKCkuCisgICAgICAgIGlmIChtUGxheVBhdXNlQnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUZmd2RCdXR0b24gIT0gbnVsbCkgeworICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVJld0J1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBtUmV3QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1OZXh0QnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1QcmV2QnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1QcmV2QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Qcm9ncmVzcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0RW5hYmxlZChlbmFibGVkKTsKKyAgICAgICAgfQorICAgICAgICBkaXNhYmxlVW5zdXBwb3J0ZWRCdXR0b25zKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25WaXNpYmlsaXR5QWdncmVnYXRlZF9pbXBsKGJvb2xlYW4gaXNWaXNpYmxlKSB7CisgICAgICAgIHN1cGVyLm9uVmlzaWJpbGl0eUFnZ3JlZ2F0ZWRfaW1wbChpc1Zpc2libGUpOworCisgICAgICAgIGlmIChpc1Zpc2libGUpIHsKKyAgICAgICAgICAgIGRpc2FibGVVbnN1cHBvcnRlZEJ1dHRvbnMoKTsKKyAgICAgICAgICAgIG1JbnN0YW5jZS5yZW1vdmVDYWxsYmFja3MobVVwZGF0ZVByb2dyZXNzKTsKKyAgICAgICAgICAgIG1JbnN0YW5jZS5wb3N0KG1VcGRhdGVQcm9ncmVzcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSW5zdGFuY2UucmVtb3ZlQ2FsbGJhY2tzKG1VcGRhdGVQcm9ncmVzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSb3V0ZVNlbGVjdG9yKE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgeworICAgICAgICBtUm91dGVTZWxlY3RvciA9IHNlbGVjdG9yOworICAgICAgICBpZiAobVJvdXRlU2VsZWN0b3IgIT0gbnVsbCAmJiAhbVJvdXRlU2VsZWN0b3IuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBtUm91dGVCdXR0b24uc2V0Um91dGVTZWxlY3RvcihzZWxlY3RvciwgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOKTsKKyAgICAgICAgICAgIG1Sb3V0ZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUm91dGVCdXR0b24uc2V0Um91dGVTZWxlY3RvcihNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFkpOworICAgICAgICAgICAgbVJvdXRlQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFByb3RlY3RlZCBvciBwcml2YXRlIG1ldGhvZHMKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1BsYXlpbmcoKSB7CisgICAgICAgIGlmIChtUGxheWJhY2tTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrU3RhdGUuZ2V0U3RhdGUoKSA9PSBQbGF5YmFja1N0YXRlLlNUQVRFX1BMQVlJTkc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldEN1cnJlbnRQb3NpdGlvbigpIHsKKyAgICAgICAgbVBsYXliYWNrU3RhdGUgPSBtQ29udHJvbGxlci5nZXRQbGF5YmFja1N0YXRlKCk7CisgICAgICAgIGlmIChtUGxheWJhY2tTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gKGludCkgbVBsYXliYWNrU3RhdGUuZ2V0UG9zaXRpb24oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRCdWZmZXJQZXJjZW50YWdlKCkgeworICAgICAgICBpZiAobUR1cmF0aW9uID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIG1QbGF5YmFja1N0YXRlID0gbUNvbnRyb2xsZXIuZ2V0UGxheWJhY2tTdGF0ZSgpOworICAgICAgICBpZiAobVBsYXliYWNrU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbG9uZyBidWZmZXJlZFBvcyA9IG1QbGF5YmFja1N0YXRlLmdldEJ1ZmZlcmVkUG9zaXRpb24oKTsKKyAgICAgICAgICAgIHJldHVybiAoYnVmZmVyZWRQb3MgPT0gLTEpID8gLTEgOiAoaW50KSAoYnVmZmVyZWRQb3MgKiAxMDAgLyBtRHVyYXRpb24pOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBjYW5QYXVzZSgpIHsKKyAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAobVBsYXliYWNrU3RhdGUuZ2V0QWN0aW9ucygpICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUEFVU0UpICE9IDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGNhblNlZWtCYWNrd2FyZCgpIHsKKyAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAobVBsYXliYWNrU3RhdGUuZ2V0QWN0aW9ucygpICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUkVXSU5EKSAhPSAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBjYW5TZWVrRm9yd2FyZCgpIHsKKyAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAobVBsYXliYWNrU3RhdGUuZ2V0QWN0aW9ucygpICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fRkFTVF9GT1JXQVJEKSAhPSAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgdmlldyB0aGF0IGhvbGRzIHRoZSB3aWRnZXRzIHRoYXQgY29udHJvbCBwbGF5YmFjay4KKyAgICAgKiBEZXJpdmVkIGNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgdG8gY3JlYXRlIHRoZWlyIG93bi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgdmlldy4KKyAgICAgKiBAaGlkZSBUaGlzIGRvZXNuJ3Qgd29yayBhcyBhZHZlcnRpc2VkCisgICAgICovCisgICAgcHJvdGVjdGVkIFZpZXdHcm91cCBtYWtlQ29udHJvbGxlclZpZXcoKSB7CisgICAgICAgIFZpZXdHcm91cCByb290ID0gKFZpZXdHcm91cCkgQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICBSLmxheW91dC5tZWRpYV9jb250cm9sbGVyKTsKKyAgICAgICAgaW5pdENvbnRyb2xsZXJWaWV3KHJvb3QpOworICAgICAgICByZXR1cm4gcm9vdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdENvbnRyb2xsZXJWaWV3KFZpZXdHcm91cCB2KSB7CisgICAgICAgIC8vIFJlbGF0aW5nIHRvIFRpdGxlIEJhciBWaWV3CisgICAgICAgIG1UaXRsZUJhciA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGl0bGVfYmFyKTsKKyAgICAgICAgbVRpdGxlVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGl0bGVfdGV4dCk7CisgICAgICAgIG1BZEV4dGVybmFsTGluayA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYWRfZXh0ZXJuYWxfbGluayk7CisgICAgICAgIG1CYWNrQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5iYWNrKTsKKyAgICAgICAgaWYgKG1CYWNrQnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1CYWNrQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtQmFja0xpc3RlbmVyKTsKKyAgICAgICAgICAgIG1CYWNrQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgfQorICAgICAgICBtUm91dGVCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLmNhc3QpOworCisgICAgICAgIC8vIFJlbGF0aW5nIHRvIENlbnRlciBWaWV3CisgICAgICAgIG1DZW50ZXJWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC5jZW50ZXJfdmlldyk7CisgICAgICAgIG1UcmFuc3BvcnRDb250cm9scyA9IGluZmxhdGVUcmFuc3BvcnRDb250cm9scyhSLmxheW91dC5lbWJlZGRlZF90cmFuc3BvcnRfY29udHJvbHMpOworICAgICAgICBtQ2VudGVyVmlldy5hZGRWaWV3KG1UcmFuc3BvcnRDb250cm9scyk7CisKKyAgICAgICAgLy8gUmVsYXRpbmcgdG8gTWluaW1hbCBFeHRyYSBWaWV3CisgICAgICAgIG1NaW5pbWFsRXh0cmFWaWV3ID0gKExpbmVhckxheW91dCkgdi5maW5kVmlld0J5SWQoUi5pZC5taW5pbWFsX2V4dHJhX3ZpZXcpOworICAgICAgICBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zIHBhcmFtcyA9CisgICAgICAgICAgICAgICAgKExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMpIG1NaW5pbWFsRXh0cmFWaWV3LmdldExheW91dFBhcmFtcygpOworICAgICAgICBpbnQgaWNvblNpemUgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLm1jdjJfZW1iZWRkZWRfaWNvbl9zaXplKTsKKyAgICAgICAgaW50IG1hcmdpblNpemUgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLm1jdjJfaWNvbl9tYXJnaW4pOworICAgICAgICBwYXJhbXMuc2V0TWFyZ2lucygwLCAoaWNvblNpemUgKyBtYXJnaW5TaXplICogMikgKiAoLTEpLCAwLCAwKTsKKyAgICAgICAgbU1pbmltYWxFeHRyYVZpZXcuc2V0TGF5b3V0UGFyYW1zKHBhcmFtcyk7CisgICAgICAgIG1NaW5pbWFsRXh0cmFWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKworICAgICAgICAvLyBSZWxhdGluZyB0byBQcm9ncmVzcyBCYXIgVmlldworICAgICAgICBtUHJvZ3Jlc3MgPSB2LmZpbmRWaWV3QnlJZChSLmlkLnByb2dyZXNzKTsKKyAgICAgICAgaWYgKG1Qcm9ncmVzcyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobVByb2dyZXNzIGluc3RhbmNlb2YgU2Vla0JhcikgeworICAgICAgICAgICAgICAgIFNlZWtCYXIgc2Vla2VyID0gKFNlZWtCYXIpIG1Qcm9ncmVzczsKKyAgICAgICAgICAgICAgICBzZWVrZXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIobVNlZWtMaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgc2Vla2VyLnNldFByb2dyZXNzRHJhd2FibGUobVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmN1c3RvbV9wcm9ncmVzcykpOworICAgICAgICAgICAgICAgIHNlZWtlci5zZXRUaHVtYihtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuY3VzdG9tX3Byb2dyZXNzX3RodW1iKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0TWF4KE1BWF9QUk9HUkVTUyk7CisgICAgICAgIH0KKyAgICAgICAgbVByb2dyZXNzQnVmZmVyID0gdi5maW5kVmlld0J5SWQoUi5pZC5wcm9ncmVzc19idWZmZXIpOworCisgICAgICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIgVmlldworICAgICAgICBtQm90dG9tQmFyID0gdi5maW5kVmlld0J5SWQoUi5pZC5ib3R0b21fYmFyKTsKKworICAgICAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyIExlZnQgVmlldworICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmJvdHRvbV9iYXJfbGVmdCk7CisgICAgICAgIG1UaW1lVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGltZSk7CisgICAgICAgIG1FbmRUaW1lID0gdi5maW5kVmlld0J5SWQoUi5pZC50aW1lX2VuZCk7CisgICAgICAgIG1DdXJyZW50VGltZSA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGltZV9jdXJyZW50KTsKKyAgICAgICAgbUFkU2tpcFZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmFkX3NraXBfdGltZSk7CisgICAgICAgIG1Gb3JtYXRCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgbUZvcm1hdHRlciA9IG5ldyBGb3JtYXR0ZXIobUZvcm1hdEJ1aWxkZXIsIExvY2FsZS5nZXREZWZhdWx0KCkpOworCisgICAgICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIgUmlnaHQgVmlldworICAgICAgICBtQm90dG9tQmFyUmlnaHRWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC5ib3R0b21fYmFyX3JpZ2h0KTsKKyAgICAgICAgbUJhc2ljQ29udHJvbHMgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmJhc2ljX2NvbnRyb2xzKTsKKyAgICAgICAgbUV4dHJhQ29udHJvbHMgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmV4dHJhX2NvbnRyb2xzKTsKKyAgICAgICAgbUN1c3RvbUJ1dHRvbnMgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmN1c3RvbV9idXR0b25zKTsKKyAgICAgICAgbVN1YnRpdGxlQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5zdWJ0aXRsZSk7CisgICAgICAgIGlmIChtU3VidGl0bGVCdXR0b24gIT0gbnVsbCkgeworICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtU3VidGl0bGVMaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLmZ1bGxzY3JlZW4pOworICAgICAgICBpZiAobUZ1bGxTY3JlZW5CdXR0b24gIT0gbnVsbCkgeworICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1GdWxsU2NyZWVuTGlzdGVuZXIpOworICAgICAgICAgICAgLy8gVE9ETzogU2hvdyBGdWxsc2NyZWVuIGJ1dHRvbiB3aGVuIG9ubHkgaXQgaXMgcG9zc2libGUuCisgICAgICAgIH0KKyAgICAgICAgbU92ZXJmbG93QnV0dG9uUmlnaHQgPSB2LmZpbmRWaWV3QnlJZChSLmlkLm92ZXJmbG93X3JpZ2h0KTsKKyAgICAgICAgaWYgKG1PdmVyZmxvd0J1dHRvblJpZ2h0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1PdmVyZmxvd0J1dHRvblJpZ2h0LnNldE9uQ2xpY2tMaXN0ZW5lcihtT3ZlcmZsb3dSaWdodExpc3RlbmVyKTsKKyAgICAgICAgfQorICAgICAgICBtT3ZlcmZsb3dCdXR0b25MZWZ0ID0gdi5maW5kVmlld0J5SWQoUi5pZC5vdmVyZmxvd19sZWZ0KTsKKyAgICAgICAgaWYgKG1PdmVyZmxvd0J1dHRvbkxlZnQgIT0gbnVsbCkgeworICAgICAgICAgICAgbU92ZXJmbG93QnV0dG9uTGVmdC5zZXRPbkNsaWNrTGlzdGVuZXIobU92ZXJmbG93TGVmdExpc3RlbmVyKTsKKyAgICAgICAgfQorICAgICAgICBtTXV0ZUJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQubXV0ZSk7CisgICAgICAgIGlmIChtTXV0ZUJ1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBtTXV0ZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobU11dGVCdXR0b25MaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICAgICAgbVNldHRpbmdzQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5zZXR0aW5ncyk7CisgICAgICAgIGlmIChtU2V0dGluZ3NCdXR0b24gIT0gbnVsbCkgeworICAgICAgICAgICAgbVNldHRpbmdzQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtU2V0dGluZ3NCdXR0b25MaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICAgICAgbVZpZGVvUXVhbGl0eUJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQudmlkZW9fcXVhbGl0eSk7CisgICAgICAgIGlmIChtVmlkZW9RdWFsaXR5QnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1WaWRlb1F1YWxpdHlCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1WaWRlb1F1YWxpdHlMaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICAgICAgbUFkUmVtYWluaW5nVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYWRfcmVtYWluaW5nKTsKKworICAgICAgICAvLyBSZWxhdGluZyB0byBTZXR0aW5ncyBMaXN0IFZpZXcKKyAgICAgICAgaW5pdGlhbGl6ZVNldHRpbmdzTGlzdHMoKTsKKyAgICAgICAgbVNldHRpbmdzTGlzdFZpZXcgPSAoTGlzdFZpZXcpIEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgUi5sYXlvdXQuc2V0dGluZ3NfbGlzdCk7CisgICAgICAgIG1TZXR0aW5nc0FkYXB0ZXIgPSBuZXcgU2V0dGluZ3NBZGFwdGVyKG1TZXR0aW5nc01haW5UZXh0c0xpc3QsIG1TZXR0aW5nc1N1YlRleHRzTGlzdCwKKyAgICAgICAgICAgICAgICBtU2V0dGluZ3NJY29uSWRzTGlzdCk7CisgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIgPSBuZXcgU3ViU2V0dGluZ3NBZGFwdGVyKG51bGwsIDApOworICAgICAgICBtU2V0dGluZ3NMaXN0Vmlldy5zZXRBZGFwdGVyKG1TZXR0aW5nc0FkYXB0ZXIpOworICAgICAgICBtU2V0dGluZ3NMaXN0Vmlldy5zZXRDaG9pY2VNb2RlKExpc3RWaWV3LkNIT0lDRV9NT0RFX1NJTkdMRSk7CisgICAgICAgIG1TZXR0aW5nc0xpc3RWaWV3LnNldE9uSXRlbUNsaWNrTGlzdGVuZXIobVNldHRpbmdzSXRlbUNsaWNrTGlzdGVuZXIpOworCisgICAgICAgIG1FbWJlZGRlZFNldHRpbmdzSXRlbVdpZHRoID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCisgICAgICAgICAgICAgICAgUi5kaW1lbi5tY3YyX2VtYmVkZGVkX3NldHRpbmdzX3dpZHRoKTsKKyAgICAgICAgbUZ1bGxTZXR0aW5nc0l0ZW1XaWR0aCA9IG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4ubWN2Ml9mdWxsX3NldHRpbmdzX3dpZHRoKTsKKyAgICAgICAgbUVtYmVkZGVkU2V0dGluZ3NJdGVtSGVpZ2h0ID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCisgICAgICAgICAgICAgICAgUi5kaW1lbi5tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCk7CisgICAgICAgIG1GdWxsU2V0dGluZ3NJdGVtSGVpZ2h0ID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCisgICAgICAgICAgICAgICAgUi5kaW1lbi5tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0KTsKKyAgICAgICAgbVNldHRpbmdzV2luZG93TWFyZ2luID0gKC0xKSAqIG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAorICAgICAgICAgICAgICAgIFIuZGltZW4ubWN2Ml9zZXR0aW5nc19vZmZzZXQpOworICAgICAgICBtU2V0dGluZ3NXaW5kb3cgPSBuZXcgUG9wdXBXaW5kb3cobVNldHRpbmdzTGlzdFZpZXcsIG1FbWJlZGRlZFNldHRpbmdzSXRlbVdpZHRoLAorICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNhYmxlIHBhdXNlIG9yIHNlZWsgYnV0dG9ucyBpZiB0aGUgc3RyZWFtIGNhbm5vdCBiZSBwYXVzZWQgb3Igc2Vla2VkLgorICAgICAqIFRoaXMgcmVxdWlyZXMgdGhlIGNvbnRyb2wgaW50ZXJmYWNlIHRvIGJlIGEgTWVkaWFQbGF5ZXJDb250cm9sRXh0CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGRpc2FibGVVbnN1cHBvcnRlZEJ1dHRvbnMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobVBsYXlQYXVzZUJ1dHRvbiAhPSBudWxsICYmICFjYW5QYXVzZSgpKSB7CisgICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUmV3QnV0dG9uICE9IG51bGwgJiYgIWNhblNlZWtCYWNrd2FyZCgpKSB7CisgICAgICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtRmZ3ZEJ1dHRvbiAhPSBudWxsICYmICFjYW5TZWVrRm9yd2FyZCgpKSB7CisgICAgICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUT0RPIFdoYXQgd2UgcmVhbGx5IHNob3VsZCBkbyBpcyBhZGQgYSBjYW5TZWVrIHRvIHRoZSBNZWRpYVBsYXllckNvbnRyb2wgaW50ZXJmYWNlOworICAgICAgICAgICAgLy8gdGhpcyBzY2hlbWUgY2FuIGJyZWFrIHRoZSBjYXNlIHdoZW4gYXBwbGljYXRpb25zIHdhbnQgdG8gYWxsb3cgc2VlayB0aHJvdWdoIHRoZQorICAgICAgICAgICAgLy8gcHJvZ3Jlc3MgYmFyIGJ1dCBkaXNhYmxlIGZvcndhcmQvYmFja3dhcmQgYnV0dG9ucy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBIb3dldmVyLCBjdXJyZW50bHkgdGhlIGZsYWdzIFNFRUtfQkFDS1dBUkRfQVZBSUxBQkxFLCBTRUVLX0ZPUldBUkRfQVZBSUxBQkxFLAorICAgICAgICAgICAgLy8gYW5kIFNFRUtfQVZBSUxBQkxFIGFyZSBhbGwgKHVuKXNldCB0b2dldGhlcjsgYXMgc3VjaCB0aGUgYWZvcmVtZW50aW9uZWQgaXNzdWUKKyAgICAgICAgICAgIC8vIHNob3VsZG4ndCBhcmlzZSBpbiBleGlzdGluZyBhcHBsaWNhdGlvbnMuCisgICAgICAgICAgICBpZiAobVByb2dyZXNzICE9IG51bGwgJiYgIWNhblNlZWtCYWNrd2FyZCgpICYmICFjYW5TZWVrRm9yd2FyZCgpKSB7CisgICAgICAgICAgICAgICAgbVByb2dyZXNzLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yIGV4KSB7CisgICAgICAgICAgICAvLyBXZSB3ZXJlIGdpdmVuIGFuIG9sZCB2ZXJzaW9uIG9mIHRoZSBpbnRlcmZhY2UsIHRoYXQgZG9lc24ndCBoYXZlCisgICAgICAgICAgICAvLyB0aGUgY2FuUGF1c2UvY2FuU2Vla1hZWiBtZXRob2RzLiBUaGlzIGlzIE9LLCBpdCBqdXN0IG1lYW5zIHdlCisgICAgICAgICAgICAvLyBhc3N1bWUgdGhlIG1lZGlhIGNhbiBiZSBwYXVzZWQgYW5kIHNlZWtlZCwgYW5kIHNvIHdlIGRvbid0IGRpc2FibGUKKyAgICAgICAgICAgIC8vIHRoZSBidXR0b25zLgorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBtVXBkYXRlUHJvZ3Jlc3MgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBpbnQgcG9zID0gc2V0UHJvZ3Jlc3MoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNTaG93aW5nID0gbUluc3RhbmNlLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEU7CisgICAgICAgICAgICBpZiAoIW1EcmFnZ2luZyAmJiBpc1Nob3dpbmcgJiYgaXNQbGF5aW5nKCkpIHsKKyAgICAgICAgICAgICAgICBtSW5zdGFuY2UucG9zdERlbGF5ZWQobVVwZGF0ZVByb2dyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9QUk9HUkVTU19VUERBVEVfVElNRV9NUyAtIChwb3MgJSBERUZBVUxUX1BST0dSRVNTX1VQREFURV9USU1FX01TKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBTdHJpbmcgc3RyaW5nRm9yVGltZShpbnQgdGltZU1zKSB7CisgICAgICAgIGludCB0b3RhbFNlY29uZHMgPSB0aW1lTXMgLyAxMDAwOworCisgICAgICAgIGludCBzZWNvbmRzID0gdG90YWxTZWNvbmRzICUgNjA7CisgICAgICAgIGludCBtaW51dGVzID0gKHRvdGFsU2Vjb25kcyAvIDYwKSAlIDYwOworICAgICAgICBpbnQgaG91cnMgPSB0b3RhbFNlY29uZHMgLyAzNjAwOworCisgICAgICAgIG1Gb3JtYXRCdWlsZGVyLnNldExlbmd0aCgwKTsKKyAgICAgICAgaWYgKGhvdXJzID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIG1Gb3JtYXR0ZXIuZm9ybWF0KCIlZDolMDJkOiUwMmQiLCBob3VycywgbWludXRlcywgc2Vjb25kcykudG9TdHJpbmcoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBtRm9ybWF0dGVyLmZvcm1hdCgiJTAyZDolMDJkIiwgbWludXRlcywgc2Vjb25kcykudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IHNldFByb2dyZXNzKCkgeworICAgICAgICBpZiAobUNvbnRyb2xsZXIgPT0gbnVsbCB8fCBtRHJhZ2dpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGludCBwb3NpdGlvbk9uUHJvZ3Jlc3NCYXIgPSAwOworICAgICAgICBpbnQgY3VycmVudFBvc2l0aW9uID0gZ2V0Q3VycmVudFBvc2l0aW9uKCk7CisgICAgICAgIGlmIChtRHVyYXRpb24gPiAwKSB7CisgICAgICAgICAgICBwb3NpdGlvbk9uUHJvZ3Jlc3NCYXIgPSAoaW50KSAoTUFYX1BST0dSRVNTICogKGxvbmcpIGN1cnJlbnRQb3NpdGlvbiAvIG1EdXJhdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Qcm9ncmVzcyAhPSBudWxsICYmIGN1cnJlbnRQb3NpdGlvbiAhPSBtRHVyYXRpb24pIHsKKyAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRQcm9ncmVzcyhwb3NpdGlvbk9uUHJvZ3Jlc3NCYXIpOworICAgICAgICAgICAgLy8gSWYgdGhlIG1lZGlhIGlzIGEgbG9jYWwgZmlsZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBzZXQgYSBidWZmZXIsIHNvIHNldCBzZWNvbmRhcnkKKyAgICAgICAgICAgIC8vIHByb2dyZXNzIHRvIG1heGltdW0uCisgICAgICAgICAgICBpZiAoZ2V0QnVmZmVyUGVyY2VudGFnZSgpIDwgMCkgeworICAgICAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRTZWNvbmRhcnlQcm9ncmVzcyhNQVhfUFJPR1JFU1MpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0U2Vjb25kYXJ5UHJvZ3Jlc3MoZ2V0QnVmZmVyUGVyY2VudGFnZSgpICogMTApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1FbmRUaW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1FbmRUaW1lLnNldFRleHQoc3RyaW5nRm9yVGltZShtRHVyYXRpb24pKTsKKworICAgICAgICB9CisgICAgICAgIGlmIChtQ3VycmVudFRpbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgbUN1cnJlbnRUaW1lLnNldFRleHQoc3RyaW5nRm9yVGltZShjdXJyZW50UG9zaXRpb24pKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtSXNBZHZlcnRpc2VtZW50KSB7CisgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHJlbWFpbmluZyBudW1iZXIgb2Ygc2Vjb25kcyB1bnRpbCB0aGUgZmlyc3QgNSBzZWNvbmRzIG9mIHRoZQorICAgICAgICAgICAgLy8gYWR2ZXJ0aXNlbWVudC4KKyAgICAgICAgICAgIGlmIChtQWRTa2lwVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQb3NpdGlvbiA8PSBBRF9TS0lQX1dBSVRfVElNRV9NUykgeworICAgICAgICAgICAgICAgICAgICBpZiAobUFkU2tpcFZpZXcuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuR09ORSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUFkU2tpcFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBza2lwVGltZVRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9hZF9za2lwX3dhaXRfdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEX1NLSVBfV0FJVF9USU1FX01TIC0gY3VycmVudFBvc2l0aW9uKSAvIDEwMDAgKyAxKSk7CisgICAgICAgICAgICAgICAgICAgIG1BZFNraXBWaWV3LnNldFRleHQoc2tpcFRpbWVUZXh0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAobUFkU2tpcFZpZXcuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUFkU2tpcFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OZXh0QnV0dG9uLmNsZWFyQ29sb3JGaWx0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcmVtYWluaW5nIG51bWJlciBvZiBzZWNvbmRzIG9mIHRoZSBhZHZlcnRpc2VtZW50LgorICAgICAgICAgICAgaWYgKG1BZFJlbWFpbmluZ1ZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludCByZW1haW5pbmdUaW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChtRHVyYXRpb24gLSBjdXJyZW50UG9zaXRpb24gPCAwKSA/IDAgOiAobUR1cmF0aW9uIC0gY3VycmVudFBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcmVtYWluaW5nVGltZVRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2FkX3JlbWFpbmluZ190aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nRm9yVGltZShyZW1haW5pbmdUaW1lKSk7CisgICAgICAgICAgICAgICAgbUFkUmVtYWluaW5nVmlldy5zZXRUZXh0KHJlbWFpbmluZ1RpbWVUZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudFBvc2l0aW9uOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0b2dnbGVQYXVzZVBsYXlTdGF0ZSgpIHsKKyAgICAgICAgaWYgKGlzUGxheWluZygpKSB7CisgICAgICAgICAgICBtQ29udHJvbHMucGF1c2UoKTsKKyAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKKyAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3BsYXlfY2lyY2xlX2ZpbGxlZCwgbnVsbCkpOworICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfcGxheV9idXR0b25fZGVzYykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUNvbnRyb2xzLnBsYXkoKTsKKyAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKKyAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3BhdXNlX2NpcmNsZV9maWxsZWQsIG51bGwpKTsKKyAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BhdXNlX2J1dHRvbl9kZXNjKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGVyZSBhcmUgdHdvIHNjZW5hcmlvcyB0aGF0IGNhbiB0cmlnZ2VyIHRoZSBzZWVrYmFyIGxpc3RlbmVyIHRvIHRyaWdnZXI6CisgICAgLy8KKyAgICAvLyBUaGUgZmlyc3QgaXMgdGhlIHVzZXIgdXNpbmcgdGhlIHRvdWNocGFkIHRvIGFkanVzdCB0aGUgcG9zaXRpdG9uIG9mIHRoZQorICAgIC8vIHNlZWtiYXIncyB0aHVtYi4gSW4gdGhpcyBjYXNlIG9uU3RhcnRUcmFja2luZ1RvdWNoIGlzIGNhbGxlZCBmb2xsb3dlZCBieQorICAgIC8vIGEgbnVtYmVyIG9mIG9uUHJvZ3Jlc3NDaGFuZ2VkIG5vdGlmaWNhdGlvbnMsIGNvbmNsdWRlZCBieSBvblN0b3BUcmFja2luZ1RvdWNoLgorICAgIC8vIFdlJ3JlIHNldHRpbmcgdGhlIGZpZWxkICJtRHJhZ2dpbmciIHRvIHRydWUgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZHJhZ2dpbmcKKyAgICAvLyBzZXNzaW9uIHRvIGF2b2lkIGp1bXBzIGluIHRoZSBwb3NpdGlvbiBpbiBjYXNlIG9mIG9uZ29pbmcgcGxheWJhY2suCisgICAgLy8KKyAgICAvLyBUaGUgc2Vjb25kIHNjZW5hcmlvIGludm9sdmVzIHRoZSB1c2VyIG9wZXJhdGluZyB0aGUgc2Nyb2xsIGJhbGwsIGluIHRoaXMKKyAgICAvLyBjYXNlIHRoZXJlIFdPTidUIEJFIG9uU3RhcnRUcmFja2luZ1RvdWNoL29uU3RvcFRyYWNraW5nVG91Y2ggbm90aWZpY2F0aW9ucywKKyAgICAvLyB3ZSB3aWxsIHNpbXBseSBhcHBseSB0aGUgdXBkYXRlZCBwb3NpdGlvbiB3aXRob3V0IHN1c3BlbmRpbmcgcmVndWxhciB1cGRhdGVzLgorICAgIHByaXZhdGUgZmluYWwgT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIgbVNlZWtMaXN0ZW5lciA9IG5ldyBPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRUcmFja2luZ1RvdWNoKFNlZWtCYXIgYmFyKSB7CisgICAgICAgICAgICBpZiAoIW1TZWVrQXZhaWxhYmxlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtRHJhZ2dpbmcgPSB0cnVlOworCisgICAgICAgICAgICAvLyBCeSByZW1vdmluZyB0aGVzZSBwZW5kaW5nIHByb2dyZXNzIG1lc3NhZ2VzIHdlIG1ha2Ugc3VyZQorICAgICAgICAgICAgLy8gdGhhdCBhKSB3ZSB3b24ndCB1cGRhdGUgdGhlIHByb2dyZXNzIHdoaWxlIHRoZSB1c2VyIGFkanVzdHMKKyAgICAgICAgICAgIC8vIHRoZSBzZWVrYmFyIGFuZCBiKSBvbmNlIHRoZSB1c2VyIGlzIGRvbmUgZHJhZ2dpbmcgdGhlIHRodW1iCisgICAgICAgICAgICAvLyB3ZSB3aWxsIHBvc3Qgb25lIG9mIHRoZXNlIG1lc3NhZ2VzIHRvIHRoZSBxdWV1ZSBhZ2FpbiBhbmQKKyAgICAgICAgICAgIC8vIHRoaXMgZW5zdXJlcyB0aGF0IHRoZXJlIHdpbGwgYmUgZXhhY3RseSBvbmUgbWVzc2FnZSBxdWV1ZWQgdXAuCisgICAgICAgICAgICBtSW5zdGFuY2UucmVtb3ZlQ2FsbGJhY2tzKG1VcGRhdGVQcm9ncmVzcyk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIGlmIHBsYXliYWNrIGlzIGN1cnJlbnRseSBzdG9wcGVkLiBJbiB0aGlzIGNhc2UsIHVwZGF0ZSB0aGUgcGF1c2UgYnV0dG9uIHRvCisgICAgICAgICAgICAvLyBzaG93IHRoZSBwbGF5IGltYWdlIGluc3RlYWQgb2YgdGhlIHJlcGxheSBpbWFnZS4KKyAgICAgICAgICAgIGlmIChtSXNTdG9wcGVkKSB7CisgICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAorICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3BsYXlfY2lyY2xlX2ZpbGxlZCwgbnVsbCkpOworICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wbGF5X2J1dHRvbl9kZXNjKSk7CisgICAgICAgICAgICAgICAgbUlzU3RvcHBlZCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKFNlZWtCYXIgYmFyLCBpbnQgcHJvZ3Jlc3MsIGJvb2xlYW4gZnJvbVVzZXIpIHsKKyAgICAgICAgICAgIGlmICghbVNlZWtBdmFpbGFibGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWZyb21Vc2VyKSB7CisgICAgICAgICAgICAgICAgLy8gV2UncmUgbm90IGludGVyZXN0ZWQgaW4gcHJvZ3JhbW1hdGljYWxseSBnZW5lcmF0ZWQgY2hhbmdlcyB0bworICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9ncmVzcyBiYXIncyBwb3NpdGlvbi4KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUR1cmF0aW9uID4gMCkgeworICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IChpbnQpICgoKGxvbmcpIG1EdXJhdGlvbiAqIHByb2dyZXNzKSAvIE1BWF9QUk9HUkVTUyk7CisgICAgICAgICAgICAgICAgbUNvbnRyb2xzLnNlZWtUbyhwb3NpdGlvbik7CisKKyAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRUaW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUaW1lLnNldFRleHQoc3RyaW5nRm9yVGltZShwb3NpdGlvbikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblN0b3BUcmFja2luZ1RvdWNoKFNlZWtCYXIgYmFyKSB7CisgICAgICAgICAgICBpZiAoIW1TZWVrQXZhaWxhYmxlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbURyYWdnaW5nID0gZmFsc2U7CisKKyAgICAgICAgICAgIHNldFByb2dyZXNzKCk7CisKKyAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHByb2dyZXNzIGlzIHByb3Blcmx5IHVwZGF0ZWQgaW4gdGhlIGZ1dHVyZSwKKyAgICAgICAgICAgIC8vIHRoZSBjYWxsIHRvIHNob3coKSBkb2VzIG5vdCBndWFyYW50ZWUgdGhpcyBiZWNhdXNlIGl0IGlzIGEKKyAgICAgICAgICAgIC8vIG5vLW9wIGlmIHdlIGFyZSBhbHJlYWR5IHNob3dpbmcuCisgICAgICAgICAgICBtSW5zdGFuY2UucG9zdChtVXBkYXRlUHJvZ3Jlc3MpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbVBsYXlQYXVzZUxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIHRvZ2dsZVBhdXNlUGxheVN0YXRlKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtUmV3TGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgaW50IHBvcyA9IGdldEN1cnJlbnRQb3NpdGlvbigpIC0gUkVXSU5EX1RJTUVfTVM7CisgICAgICAgICAgICBtQ29udHJvbHMuc2Vla1RvKHBvcyk7CisgICAgICAgICAgICBzZXRQcm9ncmVzcygpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbUZmd2RMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICBpbnQgcG9zID0gZ2V0Q3VycmVudFBvc2l0aW9uKCkgKyBGT1JXQVJEX1RJTUVfTVM7CisgICAgICAgICAgICBtQ29udHJvbHMuc2Vla1RvKHBvcyk7CisgICAgICAgICAgICBzZXRQcm9ncmVzcygpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbU5leHRMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICBtQ29udHJvbHMuc2tpcFRvTmV4dCgpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbVByZXZMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICBtQ29udHJvbHMuc2tpcFRvUHJldmlvdXMoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1CYWNrTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtU3VidGl0bGVMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICBtU2V0dGluZ3NNb2RlID0gU0VUVElOR1NfTU9ERV9TVUJUSVRMRV9UUkFDSzsKKyAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0VGV4dHMobVN1YnRpdGxlRGVzY3JpcHRpb25zTGlzdCk7CisgICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldENoZWNrUG9zaXRpb24obVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KTsKKyAgICAgICAgICAgIGRpc3BsYXlTZXR0aW5nc1dpbmRvdyhtU3ViU2V0dGluZ3NBZGFwdGVyKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1WaWRlb1F1YWxpdHlMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICBtU2V0dGluZ3NNb2RlID0gU0VUVElOR1NfTU9ERV9WSURFT19RVUFMSVRZOworICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5zZXRUZXh0cyhtVmlkZW9RdWFsaXR5TGlzdCk7CisgICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldENoZWNrUG9zaXRpb24obVNlbGVjdGVkVmlkZW9RdWFsaXR5SW5kZXgpOworICAgICAgICAgICAgZGlzcGxheVNldHRpbmdzV2luZG93KG1TdWJTZXR0aW5nc0FkYXB0ZXIpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbUZ1bGxTY3JlZW5MaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzRW50ZXJpbmdGdWxsU2NyZWVuID0gIW1Jc0Z1bGxTY3JlZW47CisgICAgICAgICAgICAvLyBUT0RPOiBSZS1hcnJhbmdlIHRoZSBidXR0b24gbGF5b3V0cyBhY2NvcmRpbmcgdG8gdGhlIFVYLgorICAgICAgICAgICAgaWYgKGlzRW50ZXJpbmdGdWxsU2NyZWVuKSB7CisgICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19mdWxsc2NyZWVuX2V4aXQsIG51bGwpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19mdWxsc2NyZWVuLCBudWxsKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBCdW5kbGUgYXJncyA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgICAgIGFyZ3MucHV0Qm9vbGVhbihBUkdVTUVOVF9LRVlfRlVMTFNDUkVFTiwgaXNFbnRlcmluZ0Z1bGxTY3JlZW4pOworICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoQ09NTUFORF9TRVRfRlVMTFNDUkVFTiwgYXJncywgbnVsbCk7CisKKyAgICAgICAgICAgIG1Jc0Z1bGxTY3JlZW4gPSBpc0VudGVyaW5nRnVsbFNjcmVlbjsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1PdmVyZmxvd1JpZ2h0TGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgbUJhc2ljQ29udHJvbHMuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgbUV4dHJhQ29udHJvbHMuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbU92ZXJmbG93TGVmdExpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIG1CYXNpY0NvbnRyb2xzLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1FeHRyYUNvbnRyb2xzLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1NdXRlQnV0dG9uTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgaWYgKCFtSXNNdXRlKSB7CisgICAgICAgICAgICAgICAgbU11dGVCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19tdXRlLCBudWxsKSk7CisgICAgICAgICAgICAgICAgbU11dGVCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9tdXRlZF9idXR0b25fZGVzYykpOworICAgICAgICAgICAgICAgIG1Jc011dGUgPSB0cnVlOworICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLnNlbmRDb21tYW5kKENPTU1BTkRfTVVURSwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1NdXRlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCisgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfdW5tdXRlLCBudWxsKSk7CisgICAgICAgICAgICAgICAgbU11dGVCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml91bm11dGVkX2J1dHRvbl9kZXNjKSk7CisgICAgICAgICAgICAgICAgbUlzTXV0ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLnNlbmRDb21tYW5kKENPTU1BTkRfVU5NVVRFLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1TZXR0aW5nc0J1dHRvbkxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIG1TZXR0aW5nc01vZGUgPSBTRVRUSU5HU19NT0RFX01BSU47CisgICAgICAgICAgICBtU2V0dGluZ3NBZGFwdGVyLnNldFN1YlRleHRzKG1TZXR0aW5nc1N1YlRleHRzTGlzdCk7CisgICAgICAgICAgICBkaXNwbGF5U2V0dGluZ3NXaW5kb3cobVNldHRpbmdzQWRhcHRlcik7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyIG1TZXR0aW5nc0l0ZW1DbGlja0xpc3RlbmVyCisgICAgICAgICAgICA9IG5ldyBBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAgICAgc3dpdGNoIChtU2V0dGluZ3NNb2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTRVRUSU5HU19NT0RFX01BSU46CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA9PSBTRVRUSU5HU19NT0RFX0FVRElPX1RSQUNLKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldFRleHRzKG1BdWRpb1RyYWNrTGlzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldENoZWNrUG9zaXRpb24obVNlbGVjdGVkQXVkaW9UcmFja0luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc01vZGUgPSBTRVRUSU5HU19NT0RFX0FVRElPX1RSQUNLOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09IFNFVFRJTkdTX01PREVfUExBWUJBQ0tfU1BFRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0VGV4dHMobVBsYXliYWNrU3BlZWRUZXh0TGlzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldENoZWNrUG9zaXRpb24obVNlbGVjdGVkU3BlZWRJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NNb2RlID0gU0VUVElOR1NfTU9ERV9QTEFZQkFDS19TUEVFRDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PSBTRVRUSU5HU19NT0RFX0hFTFApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzLgorICAgICAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzV2luZG93LmRpc21pc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkaXNwbGF5U2V0dGluZ3NXaW5kb3cobVN1YlNldHRpbmdzQWRhcHRlcik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU0VUVElOR1NfTU9ERV9BVURJT19UUkFDSzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uICE9IG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkQXVkaW9UcmFja0luZGV4ID0gcG9zaXRpb247CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvVHJhY2tDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgZXh0cmEgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmEucHV0SW50KEtFWV9TRUxFQ1RFRF9BVURJT19JTkRFWCwgcG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLnNlbmRDb21tYW5kKENPTU1BTkRfU0VMRUNUX0FVRElPX1RSQUNLLCBleHRyYSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3Quc2V0KFNFVFRJTkdTX01PREVfQVVESU9fVFJBQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuZ2V0TWFpblRleHQocG9zaXRpb24pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNFVFRJTkdTX01PREVfUExBWUJBQ0tfU1BFRUQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiAhPSBtU2VsZWN0ZWRTcGVlZEluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRTcGVlZEluZGV4ID0gcG9zaXRpb247CisgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgZXh0cmEgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYS5wdXRGbG9hdChLRVlfUExBWUJBQ0tfU1BFRUQsIG1QbGF5YmFja1NwZWVkTGlzdC5nZXQocG9zaXRpb24pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLnNlbmRDb21tYW5kKENPTU1BTkRfU0VUX1BMQVlCQUNLX1NQRUVELCBleHRyYSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3Quc2V0KFNFVFRJTkdTX01PREVfUExBWUJBQ0tfU1BFRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuZ2V0TWFpblRleHQocG9zaXRpb24pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNFVFRJTkdTX01PREVfSEVMUDoKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMuCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU0VUVElOR1NfTU9ERV9TVUJUSVRMRV9UUkFDSzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uICE9IG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4ID0gcG9zaXRpb247CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVuZGxlIGV4dHJhID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhLnB1dEludChLRVlfU0VMRUNURURfU1VCVElUTEVfSU5ERVgsIHBvc2l0aW9uIC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9TSE9XX1NVQlRJVExFLCBleHRyYSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfc3VidGl0bGVfb24sIG51bGwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9jY19pc19vbikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUlzRW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLnNlbmRDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfSElERV9TVUJUSVRMRSwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfc3VidGl0bGVfb2ZmLCBudWxsKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfY2NfaXNfb2ZmKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVJc0VuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNFVFRJTkdTX01PREVfVklERU9fUVVBTElUWToKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogYWRkIHN1cHBvcnQgZm9yIHZpZGVvIHF1YWxpdHkKKyAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkVmlkZW9RdWFsaXR5SW5kZXggPSBwb3NpdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzV2luZG93LmRpc21pc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUR1cmF0aW9uKCkgeworICAgICAgICBpZiAobU1ldGFkYXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtTWV0YWRhdGEuY29udGFpbnNLZXkoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfRFVSQVRJT04pKSB7CisgICAgICAgICAgICAgICAgbUR1cmF0aW9uID0gKGludCkgbU1ldGFkYXRhLmdldExvbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfRFVSQVRJT04pOworICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBwcm9ncmVzcyBiYXIKKyAgICAgICAgICAgICAgICBzZXRQcm9ncmVzcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVRpdGxlKCkgeworICAgICAgICBpZiAobU1ldGFkYXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtTWV0YWRhdGEuY29udGFpbnNLZXkoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfVElUTEUpKSB7CisgICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KG1NZXRhZGF0YS5nZXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfVElUTEUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoZSB0aXRsZSBiYXIgaXMgbWFkZSB1cCBvZiB0d28gc2VwYXJhdGUgTGluZWFyTGF5b3V0cy4gSWYgdGhlIHN1bSBvZiB0aGUgdHdvIGJhcnMgYXJlCisgICAgLy8gZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIHRpdGxlIGJhciwgcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBsZWZ0IGJhciAod2hpY2ggbWFrZXMgdGhlCisgICAgLy8gVGV4dFZpZXcgdGhhdCBjb250YWlucyB0aGUgdGl0bGUgb2YgdGhlIG1lZGlhIGZpbGUgc2hyaW5rKS4KKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlVGl0bGVCYXJMYXlvdXQoKSB7CisgICAgICAgIGlmIChtVGl0bGVCYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50IHRpdGxlQmFyV2lkdGggPSBtVGl0bGVCYXIuZ2V0V2lkdGgoKTsKKworICAgICAgICAgICAgVmlldyBsZWZ0QmFyID0gbVRpdGxlQmFyLmZpbmRWaWV3QnlJZChSLmlkLnRpdGxlX2Jhcl9sZWZ0KTsKKyAgICAgICAgICAgIFZpZXcgcmlnaHRCYXIgPSBtVGl0bGVCYXIuZmluZFZpZXdCeUlkKFIuaWQudGl0bGVfYmFyX3JpZ2h0KTsKKyAgICAgICAgICAgIGludCBsZWZ0QmFyV2lkdGggPSBsZWZ0QmFyLmdldFdpZHRoKCk7CisgICAgICAgICAgICBpbnQgcmlnaHRCYXJXaWR0aCA9IHJpZ2h0QmFyLmdldFdpZHRoKCk7CisKKyAgICAgICAgICAgIFJlbGF0aXZlTGF5b3V0LkxheW91dFBhcmFtcyBwYXJhbXMgPQorICAgICAgICAgICAgICAgICAgICAoUmVsYXRpdmVMYXlvdXQuTGF5b3V0UGFyYW1zKSBsZWZ0QmFyLmdldExheW91dFBhcmFtcygpOworICAgICAgICAgICAgaWYgKGxlZnRCYXJXaWR0aCArIHJpZ2h0QmFyV2lkdGggPiB0aXRsZUJhcldpZHRoKSB7CisgICAgICAgICAgICAgICAgcGFyYW1zLndpZHRoID0gdGl0bGVCYXJXaWR0aCAtIHJpZ2h0QmFyV2lkdGg7CisgICAgICAgICAgICAgICAgbU9yaWdpbmFsTGVmdEJhcldpZHRoID0gbGVmdEJhcldpZHRoOworICAgICAgICAgICAgfSBlbHNlIGlmIChsZWZ0QmFyV2lkdGggKyByaWdodEJhcldpZHRoIDwgdGl0bGVCYXJXaWR0aCAmJiBtT3JpZ2luYWxMZWZ0QmFyV2lkdGggIT0gMCkgeworICAgICAgICAgICAgICAgIHBhcmFtcy53aWR0aCA9IG1PcmlnaW5hbExlZnRCYXJXaWR0aDsKKyAgICAgICAgICAgICAgICBtT3JpZ2luYWxMZWZ0QmFyV2lkdGggPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGVmdEJhci5zZXRMYXlvdXRQYXJhbXMocGFyYW1zKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVBdWRpb01ldGFkYXRhKCkgeworICAgICAgICBpZiAobU1lZGlhVHlwZSAhPSBNRURJQV9UWVBFX01VU0lDKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobU1ldGFkYXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyB0aXRsZVRleHQgPSAiIjsKKyAgICAgICAgICAgIFN0cmluZyBhcnRpc3RUZXh0ID0gIiI7CisgICAgICAgICAgICBpZiAobU1ldGFkYXRhLmNvbnRhaW5zS2V5KE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX1RJVExFKSkgeworICAgICAgICAgICAgICAgIHRpdGxlVGV4dCA9IG1NZXRhZGF0YS5nZXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfVElUTEUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aXRsZVRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX211c2ljX3RpdGxlX3Vua25vd25fdGV4dCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtTWV0YWRhdGEuY29udGFpbnNLZXkoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfQVJUSVNUKSkgeworICAgICAgICAgICAgICAgIGFydGlzdFRleHQgPSBtTWV0YWRhdGEuZ2V0U3RyaW5nKE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0FSVElTVCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFydGlzdFRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX211c2ljX2FydGlzdF91bmtub3duX3RleHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVcGRhdGUgdGl0bGUgZm9yIEVtYmVkZGVkIHNpemUgdHlwZQorICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KHRpdGxlVGV4dCArICIgLSAiICsgYXJ0aXN0VGV4dCk7CisKKyAgICAgICAgICAgIC8vIFNldCB0byB0cnVlIHRvIHVwZGF0ZSBsYXlvdXQgaW5zaWRlIG9uTWVhc3VyZSgpCisgICAgICAgICAgICBtTmVlZFVYVXBkYXRlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVMYXlvdXQoKSB7CisgICAgICAgIGlmIChtSXNBZHZlcnRpc2VtZW50KSB7CisgICAgICAgICAgICBtUmV3QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIG1QcmV2QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIG1UaW1lVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisKKyAgICAgICAgICAgIG1BZFNraXBWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1BZFJlbWFpbmluZ1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgbUFkRXh0ZXJuYWxMaW5rLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKworICAgICAgICAgICAgbVByb2dyZXNzLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRDb2xvckZpbHRlcihSLmNvbG9yLmdyYXkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtUHJldkJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtVGltZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworCisgICAgICAgICAgICBtQWRTa2lwVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICBtQWRSZW1haW5pbmdWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIG1BZEV4dGVybmFsTGluay5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisKKyAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgIG1OZXh0QnV0dG9uLmNsZWFyQ29sb3JGaWx0ZXIoKTsKKyAgICAgICAgICAgIGRpc2FibGVVbnN1cHBvcnRlZEJ1dHRvbnMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVMYXlvdXQoaW50IG1heEljb25Db3VudCwgaW50IGZ1bGxJY29uU2l6ZSwgaW50IGVtYmVkZGVkSWNvblNpemUsCisgICAgICAgICAgICAgaW50IG1hcmdpblNpemUsIGludCBjdXJyV2lkdGgsIGludCBjdXJySGVpZ2h0LCBpbnQgc2NyZWVuV2lkdGgsIGludCBzY3JlZW5IZWlnaHQpIHsKKyAgICAgICAgaW50IGZ1bGxCb3R0b21CYXJSaWdodFdpZHRoTWF4ID0gZnVsbEljb25TaXplICogbWF4SWNvbkNvdW50CisgICAgICAgICAgICAgICAgKyBtYXJnaW5TaXplICogKG1heEljb25Db3VudCAqIDIpOworICAgICAgICBpbnQgZW1iZWRkZWRCb3R0b21CYXJSaWdodFdpZHRoTWF4ID0gZW1iZWRkZWRJY29uU2l6ZSAqIG1heEljb25Db3VudAorICAgICAgICAgICAgICAgICsgbWFyZ2luU2l6ZSAqIChtYXhJY29uQ291bnQgKiAyKTsKKyAgICAgICAgaW50IGZ1bGxXaWR0aCA9IG1UcmFuc3BvcnRDb250cm9scy5nZXRXaWR0aCgpICsgbVRpbWVWaWV3LmdldFdpZHRoKCkKKyAgICAgICAgICAgICAgICArIGZ1bGxCb3R0b21CYXJSaWdodFdpZHRoTWF4OworICAgICAgICBpbnQgZW1iZWRkZWRXaWR0aCA9IG1UaW1lVmlldy5nZXRXaWR0aCgpICsgZW1iZWRkZWRCb3R0b21CYXJSaWdodFdpZHRoTWF4OworICAgICAgICBpbnQgc2NyZWVuTWF4TGVuZ3RoID0gTWF0aC5tYXgoc2NyZWVuV2lkdGgsIHNjcmVlbkhlaWdodCk7CisKKyAgICAgICAgaWYgKGZ1bGxXaWR0aCA+IHNjcmVlbk1heExlbmd0aCkgeworICAgICAgICAgICAgLy8gVE9ETzogc2NyZWVuIG1heSBiZSBzbWFsbGVyIHRoYW4gdGhlIGxlbmd0aCBuZWVkZWQgZm9yIEZ1bGwgc2l6ZS4KKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gaXNGdWxsU2l6ZSA9IChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfREVGQVVMVCkgPyAoY3VycldpZHRoID09IHNjcmVlbk1heExlbmd0aCkgOgorICAgICAgICAgICAgICAgIChjdXJyV2lkdGggPT0gc2NyZWVuV2lkdGggJiYgY3VyckhlaWdodCA9PSBzY3JlZW5IZWlnaHQpOworCisgICAgICAgIGlmIChpc0Z1bGxTaXplKSB7CisgICAgICAgICAgICBpZiAobVNpemVUeXBlICE9IFNJWkVfVFlQRV9GVUxMKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0Rm9yU2l6ZUNoYW5nZShTSVpFX1RZUEVfRlVMTCk7CisgICAgICAgICAgICAgICAgaWYgKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9NVVNJQykgeworICAgICAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZW1iZWRkZWRXaWR0aCA8PSBjdXJyV2lkdGgpIHsKKyAgICAgICAgICAgIGlmIChtU2l6ZVR5cGUgIT0gU0laRV9UWVBFX0VNQkVEREVEKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0Rm9yU2l6ZUNoYW5nZShTSVpFX1RZUEVfRU1CRURERUQpOworICAgICAgICAgICAgICAgIGlmIChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfTVVTSUMpIHsKKyAgICAgICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1TaXplVHlwZSAhPSBTSVpFX1RZUEVfTUlOSU1BTCkgeworICAgICAgICAgICAgICAgIHVwZGF0ZUxheW91dEZvclNpemVDaGFuZ2UoU0laRV9UWVBFX01JTklNQUwpOworICAgICAgICAgICAgICAgIGlmIChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfTVVTSUMpIHsKKyAgICAgICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxheW91dEZvclNpemVDaGFuZ2UoaW50IHNpemVUeXBlKSB7CisgICAgICAgIG1TaXplVHlwZSA9IHNpemVUeXBlOworICAgICAgICBSZWxhdGl2ZUxheW91dC5MYXlvdXRQYXJhbXMgdGltZVZpZXdQYXJhbXMgPQorICAgICAgICAgICAgICAgIChSZWxhdGl2ZUxheW91dC5MYXlvdXRQYXJhbXMpIG1UaW1lVmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgU2Vla0JhciBzZWVrZXIgPSAoU2Vla0JhcikgbVByb2dyZXNzOworICAgICAgICBzd2l0Y2ggKG1TaXplVHlwZSkgeworICAgICAgICAgICAgY2FzZSBTSVpFX1RZUEVfRU1CRURERUQ6CisgICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gVGl0bGUgQmFyCisgICAgICAgICAgICAgICAgbVRpdGxlQmFyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICBtQmFja0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisKKyAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBGdWxsIFNjcmVlbiBCdXR0b24KKyAgICAgICAgICAgICAgICBtTWluaW1hbEV4dHJhVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24gPSBtQm90dG9tQmFyUmlnaHRWaWV3LmZpbmRWaWV3QnlJZChSLmlkLmZ1bGxzY3JlZW4pOworICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtRnVsbFNjcmVlbkxpc3RlbmVyKTsKKworICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIENlbnRlciBWaWV3CisgICAgICAgICAgICAgICAgbUNlbnRlclZpZXcucmVtb3ZlQWxsVmlld3MoKTsKKyAgICAgICAgICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcucmVtb3ZlVmlldyhtVHJhbnNwb3J0Q29udHJvbHMpOworICAgICAgICAgICAgICAgIG1Cb3R0b21CYXJMZWZ0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgbVRyYW5zcG9ydENvbnRyb2xzID0gaW5mbGF0ZVRyYW5zcG9ydENvbnRyb2xzKFIubGF5b3V0LmVtYmVkZGVkX3RyYW5zcG9ydF9jb250cm9scyk7CisgICAgICAgICAgICAgICAgbUNlbnRlclZpZXcuYWRkVmlldyhtVHJhbnNwb3J0Q29udHJvbHMpOworCisgICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gUHJvZ3Jlc3MgQmFyCisgICAgICAgICAgICAgICAgc2Vla2VyLnNldFRodW1iKG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5jdXN0b21fcHJvZ3Jlc3NfdGh1bWIpKTsKKyAgICAgICAgICAgICAgICBtUHJvZ3Jlc3NCdWZmZXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworCisgICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhcgorICAgICAgICAgICAgICAgIG1Cb3R0b21CYXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgIGlmICh0aW1lVmlld1BhcmFtcy5nZXRSdWxlKFJlbGF0aXZlTGF5b3V0LkxFRlRfT0YpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdGltZVZpZXdQYXJhbXMucmVtb3ZlUnVsZShSZWxhdGl2ZUxheW91dC5MRUZUX09GKTsKKyAgICAgICAgICAgICAgICAgICAgdGltZVZpZXdQYXJhbXMuYWRkUnVsZShSZWxhdGl2ZUxheW91dC5SSUdIVF9PRiwgUi5pZC5ib3R0b21fYmFyX2xlZnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU0laRV9UWVBFX0ZVTEw6CisgICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gVGl0bGUgQmFyCisgICAgICAgICAgICAgICAgbVRpdGxlQmFyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICBtQmFja0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisKKyAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBGdWxsIFNjcmVlbiBCdXR0b24KKyAgICAgICAgICAgICAgICBtTWluaW1hbEV4dHJhVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24gPSBtQm90dG9tQmFyUmlnaHRWaWV3LmZpbmRWaWV3QnlJZChSLmlkLmZ1bGxzY3JlZW4pOworICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtRnVsbFNjcmVlbkxpc3RlbmVyKTsKKworICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIENlbnRlciBWaWV3CisgICAgICAgICAgICAgICAgbUNlbnRlclZpZXcucmVtb3ZlQWxsVmlld3MoKTsKKyAgICAgICAgICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcucmVtb3ZlVmlldyhtVHJhbnNwb3J0Q29udHJvbHMpOworICAgICAgICAgICAgICAgIG1UcmFuc3BvcnRDb250cm9scyA9IGluZmxhdGVUcmFuc3BvcnRDb250cm9scyhSLmxheW91dC5mdWxsX3RyYW5zcG9ydF9jb250cm9scyk7CisgICAgICAgICAgICAgICAgbUJvdHRvbUJhckxlZnRWaWV3LmFkZFZpZXcobVRyYW5zcG9ydENvbnRyb2xzLCAwKTsKKyAgICAgICAgICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworCisgICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gUHJvZ3Jlc3MgQmFyCisgICAgICAgICAgICAgICAgc2Vla2VyLnNldFRodW1iKG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5jdXN0b21fcHJvZ3Jlc3NfdGh1bWIpKTsKKyAgICAgICAgICAgICAgICBtUHJvZ3Jlc3NCdWZmZXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworCisgICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhcgorICAgICAgICAgICAgICAgIG1Cb3R0b21CYXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgIGlmICh0aW1lVmlld1BhcmFtcy5nZXRSdWxlKFJlbGF0aXZlTGF5b3V0LlJJR0hUX09GKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRpbWVWaWV3UGFyYW1zLnJlbW92ZVJ1bGUoUmVsYXRpdmVMYXlvdXQuUklHSFRfT0YpOworICAgICAgICAgICAgICAgICAgICB0aW1lVmlld1BhcmFtcy5hZGRSdWxlKFJlbGF0aXZlTGF5b3V0LkxFRlRfT0YsIFIuaWQuYm90dG9tX2Jhcl9yaWdodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTSVpFX1RZUEVfTUlOSU1BTDoKKyAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBUaXRsZSBCYXIKKyAgICAgICAgICAgICAgICBtVGl0bGVCYXIuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgIG1CYWNrQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKworICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIEZ1bGwgU2NyZWVuIEJ1dHRvbgorICAgICAgICAgICAgICAgIG1NaW5pbWFsRXh0cmFWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbiA9IG1NaW5pbWFsRXh0cmFWaWV3LmZpbmRWaWV3QnlJZChSLmlkLmZ1bGxzY3JlZW4pOworICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtRnVsbFNjcmVlbkxpc3RlbmVyKTsKKworICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIENlbnRlciBWaWV3CisgICAgICAgICAgICAgICAgbUNlbnRlclZpZXcucmVtb3ZlQWxsVmlld3MoKTsKKyAgICAgICAgICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcucmVtb3ZlVmlldyhtVHJhbnNwb3J0Q29udHJvbHMpOworICAgICAgICAgICAgICAgIG1UcmFuc3BvcnRDb250cm9scyA9IGluZmxhdGVUcmFuc3BvcnRDb250cm9scyhSLmxheW91dC5taW5pbWFsX3RyYW5zcG9ydF9jb250cm9scyk7CisgICAgICAgICAgICAgICAgbUNlbnRlclZpZXcuYWRkVmlldyhtVHJhbnNwb3J0Q29udHJvbHMpOworCisgICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gUHJvZ3Jlc3MgQmFyCisgICAgICAgICAgICAgICAgc2Vla2VyLnNldFRodW1iKG51bGwpOworICAgICAgICAgICAgICAgIG1Qcm9ncmVzc0J1ZmZlci5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisKKyAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyCisgICAgICAgICAgICAgICAgbUJvdHRvbUJhci5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbVRpbWVWaWV3LnNldExheW91dFBhcmFtcyh0aW1lVmlld1BhcmFtcyk7CisKKyAgICAgICAgaWYgKGlzUGxheWluZygpKSB7CisgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCisgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19wYXVzZV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7CisgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wYXVzZV9idXR0b25fZGVzYykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAorICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcGxheV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7CisgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wbGF5X2J1dHRvbl9kZXNjKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUlzRnVsbFNjcmVlbikgeworICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKKyAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2Z1bGxzY3JlZW5fZXhpdCwgbnVsbCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKKyAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2Z1bGxzY3JlZW4sIG51bGwpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgVmlldyBpbmZsYXRlVHJhbnNwb3J0Q29udHJvbHMoaW50IGxheW91dElkKSB7CisgICAgICAgIFZpZXcgdiA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksIGxheW91dElkKTsKKyAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQucGF1c2UpOworICAgICAgICBpZiAobVBsYXlQYXVzZUJ1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnJlcXVlc3RGb2N1cygpOworICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobVBsYXlQYXVzZUxpc3RlbmVyKTsKKyAgICAgICAgfQorICAgICAgICBtRmZ3ZEJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQuZmZ3ZCk7CisgICAgICAgIGlmIChtRmZ3ZEJ1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUZmd2RMaXN0ZW5lcik7CisgICAgICAgICAgICBpZiAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX01VU0lDKSB7CisgICAgICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1SZXdCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLnJldyk7CisgICAgICAgIGlmIChtUmV3QnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SZXdCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1SZXdMaXN0ZW5lcik7CisgICAgICAgICAgICBpZiAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX01VU0lDKSB7CisgICAgICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzogQWRkIHN1cHBvcnQgZm9yIE5leHQgYW5kIFByZXZpb3VzIGJ1dHRvbnMKKyAgICAgICAgbU5leHRCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLm5leHQpOworICAgICAgICBpZiAobU5leHRCdXR0b24gIT0gbnVsbCkgeworICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1OZXh0TGlzdGVuZXIpOworICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICB9CisgICAgICAgIG1QcmV2QnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5wcmV2KTsKKyAgICAgICAgaWYgKG1QcmV2QnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1QcmV2QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtUHJldkxpc3RlbmVyKTsKKyAgICAgICAgICAgIG1QcmV2QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVNldHRpbmdzTGlzdHMoKSB7CisgICAgICAgIG1TZXR0aW5nc01haW5UZXh0c0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgbVNldHRpbmdzTWFpblRleHRzTGlzdC5hZGQoCisgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfYXVkaW9fdHJhY2tfdGV4dCkpOworICAgICAgICBtU2V0dGluZ3NNYWluVGV4dHNMaXN0LmFkZCgKKyAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9wbGF5YmFja19zcGVlZF90ZXh0KSk7CisgICAgICAgIG1TZXR0aW5nc01haW5UZXh0c0xpc3QuYWRkKAorICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2hlbHBfdGV4dCkpOworCisgICAgICAgIG1TZXR0aW5nc1N1YlRleHRzTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3QuYWRkKAorICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX25vbmVfdGV4dCkpOworICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3QuYWRkKAorICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nQXJyYXkoCisgICAgICAgICAgICAgICAgICAgICAgICBSLmFycmF5Lk1lZGlhQ29udHJvbFZpZXcyX3BsYXliYWNrX3NwZWVkcylbUExBWUJBQ0tfU1BFRURfMXhfSU5ERVhdKTsKKyAgICAgICAgbVNldHRpbmdzU3ViVGV4dHNMaXN0LmFkZChSRVNPVVJDRV9FTVBUWSk7CisKKyAgICAgICAgbVNldHRpbmdzSWNvbklkc0xpc3QgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CisgICAgICAgIG1TZXR0aW5nc0ljb25JZHNMaXN0LmFkZChSLmRyYXdhYmxlLmljX2F1ZGlvdHJhY2spOworICAgICAgICBtU2V0dGluZ3NJY29uSWRzTGlzdC5hZGQoUi5kcmF3YWJsZS5pY19wbGF5X2NpcmNsZV9maWxsZWQpOworICAgICAgICBtU2V0dGluZ3NJY29uSWRzTGlzdC5hZGQoUi5kcmF3YWJsZS5pY19oZWxwKTsKKworICAgICAgICBtQXVkaW9UcmFja0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgbUF1ZGlvVHJhY2tMaXN0LmFkZCgKKyAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9hdWRpb190cmFja19ub25lX3RleHQpKTsKKworICAgICAgICBtVmlkZW9RdWFsaXR5TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICBtVmlkZW9RdWFsaXR5TGlzdC5hZGQoCisgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfdmlkZW9fcXVhbGl0eV9hdXRvX3RleHQpKTsKKworICAgICAgICBtUGxheWJhY2tTcGVlZFRleHRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmdBcnJheShSLmFycmF5Lk1lZGlhQ29udHJvbFZpZXcyX3BsYXliYWNrX3NwZWVkcykpKTsKKyAgICAgICAgLy8gU2VsZWN0IHRoZSAiMXgiIHNwZWVkIGFzIHRoZSBkZWZhdWx0IHZhbHVlLgorICAgICAgICBtU2VsZWN0ZWRTcGVlZEluZGV4ID0gUExBWUJBQ0tfU1BFRURfMXhfSU5ERVg7CisKKyAgICAgICAgbVBsYXliYWNrU3BlZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxGbG9hdD4oKTsKKyAgICAgICAgaW50W10gc3BlZWRzID0gbVJlc291cmNlcy5nZXRJbnRBcnJheShSLmFycmF5LnNwZWVkX211bHRpcGxpZWRfYnlfMTAwKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGVlZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGZsb2F0IHNwZWVkID0gKGZsb2F0KSBzcGVlZHNbaV0gLyAxMDAuMGY7CisgICAgICAgICAgICBtUGxheWJhY2tTcGVlZExpc3QuYWRkKHNwZWVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkaXNwbGF5U2V0dGluZ3NXaW5kb3coQmFzZUFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICAvLyBTZXQgQWRhcHRlcgorICAgICAgICBtU2V0dGluZ3NMaXN0Vmlldy5zZXRBZGFwdGVyKGFkYXB0ZXIpOworCisgICAgICAgIC8vIFNldCB3aWR0aCBvZiB3aW5kb3cKKyAgICAgICAgaW50IGl0ZW1XaWR0aCA9IChtU2l6ZVR5cGUgPT0gU0laRV9UWVBFX0VNQkVEREVEKQorICAgICAgICAgICAgICAgID8gbUVtYmVkZGVkU2V0dGluZ3NJdGVtV2lkdGggOiBtRnVsbFNldHRpbmdzSXRlbVdpZHRoOworICAgICAgICBtU2V0dGluZ3NXaW5kb3cuc2V0V2lkdGgoaXRlbVdpZHRoKTsKKworICAgICAgICAvLyBDYWxjdWxhdGUgaGVpZ2h0IG9mIHdpbmRvdyBhbmQgc2hvdworICAgICAgICBpbnQgaXRlbUhlaWdodCA9IChtU2l6ZVR5cGUgPT0gU0laRV9UWVBFX0VNQkVEREVEKQorICAgICAgICAgICAgICAgID8gbUVtYmVkZGVkU2V0dGluZ3NJdGVtSGVpZ2h0IDogbUZ1bGxTZXR0aW5nc0l0ZW1IZWlnaHQ7CisgICAgICAgIGludCB0b3RhbEhlaWdodCA9IGFkYXB0ZXIuZ2V0Q291bnQoKSAqIGl0ZW1IZWlnaHQ7CisgICAgICAgIG1TZXR0aW5nc1dpbmRvdy5kaXNtaXNzKCk7CisgICAgICAgIG1TZXR0aW5nc1dpbmRvdy5zaG93QXNEcm9wRG93bihtSW5zdGFuY2UsIG1TZXR0aW5nc1dpbmRvd01hcmdpbiwKKyAgICAgICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3dNYXJnaW4gLSB0b3RhbEhlaWdodCwgR3Jhdml0eS5CT1RUT00gfCBHcmF2aXR5LlJJR0hUKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIE1lZGlhQ29udHJvbGxlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFDb250cm9sbGVyLkNhbGxiYWNrIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWJhY2tTdGF0ZUNoYW5nZWQoUGxheWJhY2tTdGF0ZSBzdGF0ZSkgeworICAgICAgICAgICAgbVBsYXliYWNrU3RhdGUgPSBzdGF0ZTsKKworICAgICAgICAgICAgLy8gVXBkYXRlIHBhdXNlIGJ1dHRvbiBkZXBlbmRpbmcgb24gcGxheWJhY2sgc3RhdGUgZm9yIHRoZSBmb2xsb3dpbmcgdHdvIHJlYXNvbnM6CisgICAgICAgICAgICAvLyAgIDEpIE5lZWQgdG8gaGFuZGxlIGNhc2Ugd2hlcmUgYXBwIGN1c3RvbWl6ZXMgcGxheWJhY2sgc3RhdGUgYmVoYXZpb3Igd2hlbiBhcHAKKyAgICAgICAgICAgIC8vICAgICAgYWN0aXZpdHkgaXMgcmVzdW1lZC4KKyAgICAgICAgICAgIC8vICAgMikgTmVlZCB0byBoYW5kbGUgY2FzZSB3aGVyZSB0aGUgbWVkaWEgZmlsZSByZWFjaGVzIGVuZCBvZiBkdXJhdGlvbi4KKyAgICAgICAgICAgIGlmIChtUGxheWJhY2tTdGF0ZS5nZXRTdGF0ZSgpICE9IG1QcmV2U3RhdGUpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1QbGF5YmFja1N0YXRlLmdldFN0YXRlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQbGF5YmFja1N0YXRlLlNUQVRFX1BMQVlJTkc6CisgICAgICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19wYXVzZV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wYXVzZV9idXR0b25fZGVzYykpOworICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnJlbW92ZUNhbGxiYWNrcyhtVXBkYXRlUHJvZ3Jlc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnBvc3QobVVwZGF0ZVByb2dyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFBsYXliYWNrU3RhdGUuU1RBVEVfUEFVU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcGxheV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wbGF5X2J1dHRvbl9kZXNjKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQbGF5YmFja1N0YXRlLlNUQVRFX1NUT1BQRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19yZXBsYXlfY2lyY2xlX2ZpbGxlZCwgbnVsbCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfcmVwbGF5X2J1dHRvbl9kZXNjKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtSXNTdG9wcGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1QcmV2U3RhdGUgPSBtUGxheWJhY2tTdGF0ZS5nZXRTdGF0ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobVBsYXliYWNrQWN0aW9ucyAhPSBtUGxheWJhY2tTdGF0ZS5nZXRBY3Rpb25zKCkpIHsKKyAgICAgICAgICAgICAgICBsb25nIG5ld0FjdGlvbnMgPSBtUGxheWJhY2tTdGF0ZS5nZXRBY3Rpb25zKCk7CisgICAgICAgICAgICAgICAgaWYgKChuZXdBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUEFVU0UpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgobmV3QWN0aW9ucyAmIFBsYXliYWNrU3RhdGUuQUNUSU9OX1JFV0lORCkgIT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgbU1lZGlhVHlwZSAhPSBNRURJQV9UWVBFX01VU0lDKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtUmV3QnV0dG9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1SZXdCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgobmV3QWN0aW9ucyAmIFBsYXliYWNrU3RhdGUuQUNUSU9OX0ZBU1RfRk9SV0FSRCkgIT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgbU1lZGlhVHlwZSAhPSBNRURJQV9UWVBFX01VU0lDKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRmZ3ZEJ1dHRvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChuZXdBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fU0VFS19UTykgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtU2Vla0F2YWlsYWJsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbVNlZWtBdmFpbGFibGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVBsYXliYWNrQWN0aW9ucyA9IG5ld0FjdGlvbnM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFkZCBidXR0b25zIGlmIGN1c3RvbSBhY3Rpb25zIGFyZSBwcmVzZW50LgorICAgICAgICAgICAgTGlzdDxQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbj4gY3VzdG9tQWN0aW9ucyA9IG1QbGF5YmFja1N0YXRlLmdldEN1c3RvbUFjdGlvbnMoKTsKKyAgICAgICAgICAgIG1DdXN0b21CdXR0b25zLnJlbW92ZUFsbFZpZXdzKCk7CisgICAgICAgICAgICBpZiAoY3VzdG9tQWN0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgZm9yIChQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbiBhY3Rpb24gOiBjdXN0b21BY3Rpb25zKSB7CisgICAgICAgICAgICAgICAgICAgIEltYWdlQnV0dG9uIGJ1dHRvbiA9IG5ldyBJbWFnZUJ1dHRvbihtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgLyogQXR0cmlidXRlU2V0ICovLCAwIC8qIFN0eWxlICovKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogQXBwbHkgUi5zdHlsZS5Cb3R0b21CYXJCdXR0b24gdG8gdGhpcyBidXR0b24gdXNpbmcgbGlicmFyeSBjb250ZXh0LgorICAgICAgICAgICAgICAgICAgICAvLyBSZWZlciBDb25zdHJ1Y3RvciB3aXRoIGFyZ3VtZW50IChpbnQgZGVmU3R5bGVSZXMpIG9mIFZpZXcuamF2YQorICAgICAgICAgICAgICAgICAgICBidXR0b24uc2V0SW1hZ2VSZXNvdXJjZShhY3Rpb24uZ2V0SWNvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgYnV0dG9uLnNldFRvb2x0aXBUZXh0KGFjdGlvbi5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aW9uU3RyaW5nID0gYWN0aW9uLmdldEFjdGlvbigpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEN1cnJlbnRseSwgd2UgYXJlIGp1c3Qgc2VuZGluZyBleHRyYXMgdGhhdCBjYW1lIGZyb20gc2Vzc2lvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJcyBpdCB0aGUgcmlnaHQgYmVoYXZpb3I/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xzLnNlbmRDdXN0b21BY3Rpb24oYWN0aW9uU3RyaW5nLCBhY3Rpb24uZ2V0RXh0cmFzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICBtQ3VzdG9tQnV0dG9ucy5hZGRWaWV3KGJ1dHRvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uTWV0YWRhdGFDaGFuZ2VkKE1lZGlhTWV0YWRhdGEgbWV0YWRhdGEpIHsKKyAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOworICAgICAgICAgICAgdXBkYXRlRHVyYXRpb24oKTsKKyAgICAgICAgICAgIHVwZGF0ZVRpdGxlKCk7CisgICAgICAgICAgICB1cGRhdGVBdWRpb01ldGFkYXRhKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXNzaW9uRXZlbnQoU3RyaW5nIGV2ZW50LCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgICAgICAgICAgICAgY2FzZSBFVkVOVF9VUERBVEVfVFJBQ0tfU1RBVFVTOgorICAgICAgICAgICAgICAgICAgICBtVmlkZW9UcmFja0NvdW50ID0gZXh0cmFzLmdldEludChLRVlfVklERU9fVFJBQ0tfQ09VTlQpOworICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBvbmUgb3IgbW9yZSBhdWRpbyB0cmFja3MsIGFuZCB0aGlzIGluZm9ybWF0aW9uIGhhcyBub3QgYmVlbgorICAgICAgICAgICAgICAgICAgICAvLyByZWZsZWN0ZWQgaW50byB0aGUgU2V0dGluZ3Mgd2luZG93IHlldCwgYXV0b21hdGljYWxseSBjaGVjayB0aGUgZmlyc3QgdHJhY2suCisgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgdGhlIEF1ZGlvIFRyYWNrIHNlbGVjdGlvbiB3aWxsIGJlIGRlZmF1bHRlZCB0byAiTm9uZSIuCisgICAgICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrQ291bnQgPSBleHRyYXMuZ2V0SW50KEtFWV9BVURJT19UUkFDS19DT1VOVCk7CisgICAgICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvVHJhY2tDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGFkZCBtb3JlIHRleHQgYWJvdXQgdHJhY2sgaW5mby4KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUF1ZGlvVHJhY2tDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRyYWNrID0gbVJlc291cmNlcy5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9hdWRpb190cmFja19udW1iZXJfdGV4dCwgaSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrTGlzdC5hZGQodHJhY2spOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hhbmdlIHN1YiB0ZXh0IGluc2lkZSB0aGUgU2V0dGluZ3Mgd2luZG93LgorICAgICAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzU3ViVGV4dHNMaXN0LnNldChTRVRUSU5HU19NT0RFX0FVRElPX1RSQUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9UcmFja0xpc3QuZ2V0KDApKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrTGlzdC5hZGQobVJlc291cmNlcy5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX25vbmVfdGV4dCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9UcmFja0NvdW50ID09IDAgJiYgbUF1ZGlvVHJhY2tDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVR5cGUgPSBNRURJQV9UWVBFX01VU0lDOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlVHJhY2tDb3VudCA9IGV4dHJhcy5nZXRJbnQoS0VZX1NVQlRJVExFX1RSQUNLX0NPVU5UKTsKKyAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlRGVzY3JpcHRpb25zTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgICAgICAgICBpZiAobVN1YnRpdGxlVHJhY2tDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZURlc2NyaXB0aW9uc0xpc3QuYWRkKG1SZXNvdXJjZXMuZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9zdWJ0aXRsZV9vZmZfdGV4dCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtU3VidGl0bGVUcmFja0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHJhY2sgPSBtUmVzb3VyY2VzLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX3N1YnRpdGxlX3RyYWNrX251bWJlcl90ZXh0LCBpICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlRGVzY3JpcHRpb25zTGlzdC5hZGQodHJhY2spOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVWRU5UX1VQREFURV9NRURJQV9UWVBFX1NUQVRVUzoKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuZXdTdGF0dXMgPSBleHRyYXMuZ2V0Qm9vbGVhbihLRVlfU1RBVEVfSVNfQURWRVJUSVNFTUVOVCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0dXMgIT0gbUlzQWR2ZXJ0aXNlbWVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUlzQWR2ZXJ0aXNlbWVudCA9IG5ld1N0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUxheW91dCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBTZXR0aW5nc0FkYXB0ZXIgZXh0ZW5kcyBCYXNlQWRhcHRlciB7CisgICAgICAgIHByaXZhdGUgTGlzdDxJbnRlZ2VyPiBtSWNvbklkczsKKyAgICAgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbU1haW5UZXh0czsKKyAgICAgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVN1YlRleHRzOworCisgICAgICAgIHB1YmxpYyBTZXR0aW5nc0FkYXB0ZXIoTGlzdDxTdHJpbmc+IG1haW5UZXh0cywgQE51bGxhYmxlIExpc3Q8U3RyaW5nPiBzdWJUZXh0cywKKyAgICAgICAgICAgICAgICBATnVsbGFibGUgTGlzdDxJbnRlZ2VyPiBpY29uSWRzKSB7CisgICAgICAgICAgICBtTWFpblRleHRzID0gbWFpblRleHRzOworICAgICAgICAgICAgbVN1YlRleHRzID0gc3ViVGV4dHM7CisgICAgICAgICAgICBtSWNvbklkcyA9IGljb25JZHM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVTdWJUZXh0cyhMaXN0PFN0cmluZz4gc3ViVGV4dHMpIHsKKyAgICAgICAgICAgIG1TdWJUZXh0cyA9IHN1YlRleHRzOworICAgICAgICAgICAgbm90aWZ5RGF0YVNldENoYW5nZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFpblRleHQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICBpZiAobU1haW5UZXh0cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgbU1haW5UZXh0cy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1NYWluVGV4dHMuZ2V0KHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gUkVTT1VSQ0VfRU1QVFk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiAobU1haW5UZXh0cyA9PSBudWxsKSA/IDAgOiBtTWFpblRleHRzLnNpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRJdGVtSWQoaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICAvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yi0tZG9lcyBub3QgaGF2ZSBhbnkgcHVycG9zZSBoZXJlCisgICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcy4KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0SXRlbShpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIC8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViLS1kb2VzIG5vdCBoYXZlIGFueSBwdXJwb3NlIGhlcmUKKyAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzLgorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBjb250YWluZXIpIHsKKyAgICAgICAgICAgIFZpZXcgcm93OworICAgICAgICAgICAgaWYgKG1TaXplVHlwZSA9PSBTSVpFX1RZUEVfRlVMTCkgeworICAgICAgICAgICAgICAgIHJvdyA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBSLmxheW91dC5mdWxsX3NldHRpbmdzX2xpc3RfaXRlbSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJvdyA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBSLmxheW91dC5lbWJlZGRlZF9zZXR0aW5nc19saXN0X2l0ZW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVGV4dFZpZXcgbWFpblRleHRWaWV3ID0gKFRleHRWaWV3KSByb3cuZmluZFZpZXdCeUlkKFIuaWQubWFpbl90ZXh0KTsKKyAgICAgICAgICAgIFRleHRWaWV3IHN1YlRleHRWaWV3ID0gKFRleHRWaWV3KSByb3cuZmluZFZpZXdCeUlkKFIuaWQuc3ViX3RleHQpOworICAgICAgICAgICAgSW1hZ2VWaWV3IGljb25WaWV3ID0gKEltYWdlVmlldykgcm93LmZpbmRWaWV3QnlJZChSLmlkLmljb24pOworCisgICAgICAgICAgICAvLyBTZXQgbWFpbiB0ZXh0CisgICAgICAgICAgICBtYWluVGV4dFZpZXcuc2V0VGV4dChtTWFpblRleHRzLmdldChwb3NpdGlvbikpOworCisgICAgICAgICAgICAvLyBSZW1vdmUgc3ViIHRleHQgYW5kIGNlbnRlciB0aGUgbWFpbiB0ZXh0IGlmIHN1YiB0ZXh0cyBkbyBub3QgZXhpc3QgYXQgYWxsIG9yIHRoZSBzdWIKKyAgICAgICAgICAgIC8vIHRleHQgYXQgdGhpcyBwYXJ0aWN1bGFyIHBvc2l0aW9uIGlzIGVtcHR5LgorICAgICAgICAgICAgaWYgKG1TdWJUZXh0cyA9PSBudWxsIHx8IG1TdWJUZXh0cy5nZXQocG9zaXRpb24pID09IFJFU09VUkNFX0VNUFRZKSB7CisgICAgICAgICAgICAgICAgc3ViVGV4dFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHNldCBzdWIgdGV4dC4KKyAgICAgICAgICAgICAgICBzdWJUZXh0Vmlldy5zZXRUZXh0KG1TdWJUZXh0cy5nZXQocG9zaXRpb24pKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVtb3ZlIG1haW4gaWNvbiBhbmQgc2V0IHZpc2liaWxpdHkgdG8gZ29uZSBpZiBpY29ucyBhcmUgc2V0IHRvIG51bGwgb3IgdGhlIGljb24gYXQKKyAgICAgICAgICAgIC8vIHRoaXMgcGFydGljdWxhciBwb3NpdGlvbiBpcyBzZXQgdG8gUkVTT1VSQ0VfTk9OX0VYSVNURU5ULgorICAgICAgICAgICAgaWYgKG1JY29uSWRzID09IG51bGwgfHwgbUljb25JZHMuZ2V0KHBvc2l0aW9uKSA9PSBSRVNPVVJDRV9OT05fRVhJU1RFTlQpIHsKKyAgICAgICAgICAgICAgICBpY29uVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgc2V0IG1haW4gaWNvbi4KKyAgICAgICAgICAgICAgICBpY29uVmlldy5zZXRJbWFnZURyYXdhYmxlKG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUobUljb25JZHMuZ2V0KHBvc2l0aW9uKSwgbnVsbCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJvdzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFN1YlRleHRzKExpc3Q8U3RyaW5nPiBzdWJUZXh0cykgeworICAgICAgICAgICAgbVN1YlRleHRzID0gc3ViVGV4dHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUT0RPOiBleHRlbmQgdGhpcyBjbGFzcyBmcm9tIFNldHRpbmdzQWRhcHRlcgorICAgIHByaXZhdGUgY2xhc3MgU3ViU2V0dGluZ3NBZGFwdGVyIGV4dGVuZHMgQmFzZUFkYXB0ZXIgeworICAgICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtVGV4dHM7CisgICAgICAgIHByaXZhdGUgaW50IG1DaGVja1Bvc2l0aW9uOworCisgICAgICAgIHB1YmxpYyBTdWJTZXR0aW5nc0FkYXB0ZXIoTGlzdDxTdHJpbmc+IHRleHRzLCBpbnQgY2hlY2tQb3NpdGlvbikgeworICAgICAgICAgICAgbVRleHRzID0gdGV4dHM7CisgICAgICAgICAgICBtQ2hlY2tQb3NpdGlvbiA9IGNoZWNrUG9zaXRpb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1haW5UZXh0KGludCBwb3NpdGlvbikgeworICAgICAgICAgICAgaWYgKG1UZXh0cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgbVRleHRzLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVRleHRzLmdldChwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFJFU09VUkNFX0VNUFRZOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7CisgICAgICAgICAgICByZXR1cm4gKG1UZXh0cyA9PSBudWxsKSA/IDAgOiBtVGV4dHMuc2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldEl0ZW1JZChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIC8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViLS1kb2VzIG5vdCBoYXZlIGFueSBwdXJwb3NlIGhlcmUKKyAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzLgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRJdGVtKGludCBwb3NpdGlvbikgeworICAgICAgICAgICAgLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWItLWRvZXMgbm90IGhhdmUgYW55IHB1cnBvc2UgaGVyZQorICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMuCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIGNvbnRhaW5lcikgeworICAgICAgICAgICAgVmlldyByb3c7CisgICAgICAgICAgICBpZiAobVNpemVUeXBlID09IFNJWkVfVFlQRV9GVUxMKSB7CisgICAgICAgICAgICAgICAgcm93ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0LmZ1bGxfc3ViX3NldHRpbmdzX2xpc3RfaXRlbSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJvdyA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBSLmxheW91dC5lbWJlZGRlZF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRleHRWaWV3IHRleHRWaWV3ID0gKFRleHRWaWV3KSByb3cuZmluZFZpZXdCeUlkKFIuaWQudGV4dCk7CisgICAgICAgICAgICBJbWFnZVZpZXcgY2hlY2tWaWV3ID0gKEltYWdlVmlldykgcm93LmZpbmRWaWV3QnlJZChSLmlkLmNoZWNrKTsKKworICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dChtVGV4dHMuZ2V0KHBvc2l0aW9uKSk7CisgICAgICAgICAgICBpZiAocG9zaXRpb24gIT0gbUNoZWNrUG9zaXRpb24pIHsKKyAgICAgICAgICAgICAgICBjaGVja1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcm93OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dHMoTGlzdDxTdHJpbmc+IHRleHRzKSB7CisgICAgICAgICAgICBtVGV4dHMgPSB0ZXh0czsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldENoZWNrUG9zaXRpb24oaW50IGNoZWNrUG9zaXRpb24pIHsKKyAgICAgICAgICAgIG1DaGVja1Bvc2l0aW9uID0gY2hlY2tQb3NpdGlvbjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1N1YnRpdGxlVmlldy5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvU3VidGl0bGVWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdiMmNkMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1N1YnRpdGxlVmlldy5qYXZhCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZS5TdWJ0aXRsZUNvbnRyb2xsZXIuQW5jaG9yOworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlLlN1YnRpdGxlVHJhY2suUmVuZGVyaW5nV2lkZ2V0OworCitjbGFzcyBTdWJ0aXRsZVZpZXcgZXh0ZW5kcyBGcmFtZUxheW91dCBpbXBsZW1lbnRzIEFuY2hvciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTdWJ0aXRsZVZpZXciOworCisgICAgcHJpdmF0ZSBSZW5kZXJpbmdXaWRnZXQgbVN1YnRpdGxlV2lkZ2V0OworICAgIHByaXZhdGUgUmVuZGVyaW5nV2lkZ2V0Lk9uQ2hhbmdlZExpc3RlbmVyIG1TdWJ0aXRsZXNDaGFuZ2VkTGlzdGVuZXI7CisKKyAgICBwdWJsaWMgU3VidGl0bGVWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBTdWJ0aXRsZVZpZXcoQ29udGV4dCBjb250ZXh0LCBATnVsbGFibGUgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOworICAgIH0KKworICAgIHB1YmxpYyBTdWJ0aXRsZVZpZXcoQ29udGV4dCBjb250ZXh0LCBATnVsbGFibGUgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgMCk7CisgICAgfQorCisgICAgcHVibGljIFN1YnRpdGxlVmlldygKKyAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIGRlZlN0eWxlUmVzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZVdpZGdldChSZW5kZXJpbmdXaWRnZXQgc3VidGl0bGVXaWRnZXQpIHsKKyAgICAgICAgaWYgKG1TdWJ0aXRsZVdpZGdldCA9PSBzdWJ0aXRsZVdpZGdldCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgYm9vbGVhbiBhdHRhY2hlZFRvV2luZG93ID0gaXNBdHRhY2hlZFRvV2luZG93KCk7CisgICAgICAgIGlmIChtU3VidGl0bGVXaWRnZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGF0dGFjaGVkVG9XaW5kb3cpIHsKKyAgICAgICAgICAgICAgICBtU3VidGl0bGVXaWRnZXQub25EZXRhY2hlZEZyb21XaW5kb3coKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVN1YnRpdGxlV2lkZ2V0LnNldE9uQ2hhbmdlZExpc3RlbmVyKG51bGwpOworICAgICAgICB9CisgICAgICAgIG1TdWJ0aXRsZVdpZGdldCA9IHN1YnRpdGxlV2lkZ2V0OworCisgICAgICAgIGlmIChzdWJ0aXRsZVdpZGdldCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobVN1YnRpdGxlc0NoYW5nZWRMaXN0ZW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVN1YnRpdGxlc0NoYW5nZWRMaXN0ZW5lciA9IG5ldyBSZW5kZXJpbmdXaWRnZXQuT25DaGFuZ2VkTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZWQoUmVuZGVyaW5nV2lkZ2V0IHJlbmRlcmluZ1dpZGdldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2V0V2lsbE5vdERyYXcoZmFsc2UpOworICAgICAgICAgICAgc3VidGl0bGVXaWRnZXQuc2V0T25DaGFuZ2VkTGlzdGVuZXIobVN1YnRpdGxlc0NoYW5nZWRMaXN0ZW5lcik7CisKKyAgICAgICAgICAgIGlmIChhdHRhY2hlZFRvV2luZG93KSB7CisgICAgICAgICAgICAgICAgc3VidGl0bGVXaWRnZXQub25BdHRhY2hlZFRvV2luZG93KCk7CisgICAgICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0V2lsbE5vdERyYXcodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExvb3BlciBnZXRTdWJ0aXRsZUxvb3BlcigpIHsKKyAgICAgICAgcmV0dXJuIExvb3Blci5nZXRNYWluTG9vcGVyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgeworICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKKworICAgICAgICBpZiAobVN1YnRpdGxlV2lkZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TdWJ0aXRsZVdpZGdldC5vbkF0dGFjaGVkVG9XaW5kb3coKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgeworICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOworCisgICAgICAgIGlmIChtU3VidGl0bGVXaWRnZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgbVN1YnRpdGxlV2lkZ2V0Lm9uRGV0YWNoZWRGcm9tV2luZG93KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkxheW91dChib29sZWFuIGNoYW5nZWQsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKKyAgICAgICAgc3VwZXIub25MYXlvdXQoY2hhbmdlZCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKworICAgICAgICBpZiAobVN1YnRpdGxlV2lkZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IGdldFdpZHRoKCkgLSBnZXRQYWRkaW5nTGVmdCgpIC0gZ2V0UGFkZGluZ1JpZ2h0KCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gZ2V0SGVpZ2h0KCkgLSBnZXRQYWRkaW5nVG9wKCkgLSBnZXRQYWRkaW5nQm90dG9tKCk7CisKKyAgICAgICAgICAgIG1TdWJ0aXRsZVdpZGdldC5zZXRTaXplKHdpZHRoLCBoZWlnaHQpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgIHN1cGVyLmRyYXcoY2FudmFzKTsKKworICAgICAgICBpZiAobVN1YnRpdGxlV2lkZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBzYXZlQ291bnQgPSBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZShnZXRQYWRkaW5nTGVmdCgpLCBnZXRQYWRkaW5nVG9wKCkpOworICAgICAgICAgICAgbVN1YnRpdGxlV2lkZ2V0LmRyYXcoY2FudmFzKTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChzYXZlQ291bnQpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRBY2Nlc3NpYmlsaXR5Q2xhc3NOYW1lKCkgeworICAgICAgICByZXR1cm4gU3VidGl0bGVWaWV3LmNsYXNzLmdldE5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1N1cmZhY2VWaWV3LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1N1cmZhY2VWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM5MmU4NQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvU3VyZmFjZVZpZXcuamF2YQpAQCAtMCwwICsxLDE5OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjI7CitpbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQud2lkZ2V0LlZpZGVvVmlldzIuVklFV19UWVBFX1NVUkZBQ0VWSUVXOworCitjbGFzcyBWaWRlb1N1cmZhY2VWaWV3IGV4dGVuZHMgU3VyZmFjZVZpZXcgaW1wbGVtZW50cyBWaWRlb1ZpZXdJbnRlcmZhY2UsIFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2sgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVmlkZW9TdXJmYWNlVmlldyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFNUT1BTSElQOiBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7CisgICAgcHJpdmF0ZSBTdXJmYWNlSG9sZGVyIG1TdXJmYWNlSG9sZGVyID0gbnVsbDsKKyAgICBwcml2YXRlIFN1cmZhY2VMaXN0ZW5lciBtU3VyZmFjZUxpc3RlbmVyID0gbnVsbDsKKyAgICBwcml2YXRlIE1lZGlhUGxheWVyMiBtTWVkaWFQbGF5ZXI7CisgICAgLy8gQSBmbGFnIHRvIGluZGljYXRlIHRha2luZyBvdmVyIG90aGVyIHZpZXcgc2hvdWxkIGJlIHByb2NlZWQuCisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc1Rha2luZ092ZXJPbGRWaWV3OworICAgIHByaXZhdGUgVmlkZW9WaWV3SW50ZXJmYWNlIG1PbGRWaWV3OworCisKKyAgICBwdWJsaWMgVmlkZW9TdXJmYWNlVmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmlkZW9TdXJmYWNlVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmlkZW9TdXJmYWNlVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0cikgeworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIDApOworICAgIH0KKworICAgIHB1YmxpYyBWaWRlb1N1cmZhY2VWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWZTdHlsZVJlcykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCBkZWZTdHlsZVJlcyk7CisgICAgICAgIGdldEhvbGRlcigpLmFkZENhbGxiYWNrKHRoaXMpOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBpbXBsZW1lbnRzIFZpZGVvVmlld0ludGVyZmFjZQorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKE1lZGlhUGxheWVyMiBtcCkgeworICAgICAgICBMb2cuZChUQUcsICJhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcigpOiBtU3VyZmFjZUhvbGRlcjogIiArIG1TdXJmYWNlSG9sZGVyKTsKKyAgICAgICAgaWYgKG1wID09IG51bGwgfHwgIWhhc0F2YWlsYWJsZVN1cmZhY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIG1wLnNldERpc3BsYXkobVN1cmZhY2VIb2xkZXIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTdXJmYWNlTGlzdGVuZXIoU3VyZmFjZUxpc3RlbmVyIGwpIHsKKyAgICAgICAgbVN1cmZhY2VMaXN0ZW5lciA9IGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRWaWV3VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIFZJRVdfVFlQRV9TVVJGQUNFVklFVzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRNZWRpYVBsYXllcihNZWRpYVBsYXllcjIgbXApIHsKKyAgICAgICAgbU1lZGlhUGxheWVyID0gbXA7CisgICAgICAgIGlmIChtSXNUYWtpbmdPdmVyT2xkVmlldykgeworICAgICAgICAgICAgdGFrZU92ZXIobU9sZFZpZXcpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGFrZU92ZXIoQE5vbk51bGwgVmlkZW9WaWV3SW50ZXJmYWNlIG9sZFZpZXcpIHsKKyAgICAgICAgaWYgKGFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKG1NZWRpYVBsYXllcikpIHsKKyAgICAgICAgICAgICgoVmlldykgb2xkVmlldykuc2V0VmlzaWJpbGl0eShHT05FKTsKKyAgICAgICAgICAgIG1Jc1Rha2luZ092ZXJPbGRWaWV3ID0gZmFsc2U7CisgICAgICAgICAgICBtT2xkVmlldyA9IG51bGw7CisgICAgICAgICAgICBpZiAobVN1cmZhY2VMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VUYWtlT3ZlckRvbmUodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSXNUYWtpbmdPdmVyT2xkVmlldyA9IHRydWU7CisgICAgICAgICAgICBtT2xkVmlldyA9IG9sZFZpZXc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNBdmFpbGFibGVTdXJmYWNlKCkgeworICAgICAgICByZXR1cm4gKG1TdXJmYWNlSG9sZGVyICE9IG51bGwgJiYgbVN1cmZhY2VIb2xkZXIuZ2V0U3VyZmFjZSgpICE9IG51bGwpOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBpbXBsZW1lbnRzIFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2sKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ3JlYXRlZChTdXJmYWNlSG9sZGVyIGhvbGRlcikgeworICAgICAgICBMb2cuZChUQUcsICJzdXJmYWNlQ3JlYXRlZDogbVN1cmZhY2VIb2xkZXI6ICIgKyBtU3VyZmFjZUhvbGRlciArICIsIG5ldyBob2xkZXI6ICIgKyBob2xkZXIpOworICAgICAgICBtU3VyZmFjZUhvbGRlciA9IGhvbGRlcjsKKyAgICAgICAgaWYgKG1Jc1Rha2luZ092ZXJPbGRWaWV3KSB7CisgICAgICAgICAgICB0YWtlT3ZlcihtT2xkVmlldyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihtTWVkaWFQbGF5ZXIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1TdXJmYWNlTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgUmVjdCByZWN0ID0gbVN1cmZhY2VIb2xkZXIuZ2V0U3VyZmFjZUZyYW1lKCk7CisgICAgICAgICAgICBtU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZUNyZWF0ZWQodGhpcywgcmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDaGFuZ2VkKFN1cmZhY2VIb2xkZXIgaG9sZGVyLCBpbnQgZm9ybWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgaWYgKG1TdXJmYWNlTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VDaGFuZ2VkKHRoaXMsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3VyZmFjZURlc3Ryb3llZChTdXJmYWNlSG9sZGVyIGhvbGRlcikgeworICAgICAgICAvLyBBZnRlciB3ZSByZXR1cm4gZnJvbSB0aGlzIHdlIGNhbid0IHVzZSB0aGUgc3VyZmFjZSBhbnkgbW9yZQorICAgICAgICBtU3VyZmFjZUhvbGRlciA9IG51bGw7CisgICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlRGVzdHJveWVkKHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVE9ETzogSW52ZXN0aWdhdGUgdGhlIHdheSB0byBtb3ZlIG9uTWVhc3VyZSgpIGNvZGUgaW50byBGcmFtZUxheW91dC4KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgeworICAgICAgICBpbnQgdmlkZW9XaWR0aCA9IChtTWVkaWFQbGF5ZXIgPT0gbnVsbCkgPyAwIDogbU1lZGlhUGxheWVyLmdldFZpZGVvV2lkdGgoKTsKKyAgICAgICAgaW50IHZpZGVvSGVpZ2h0ID0gKG1NZWRpYVBsYXllciA9PSBudWxsKSA/IDAgOiBtTWVkaWFQbGF5ZXIuZ2V0VmlkZW9IZWlnaHQoKTsKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJvbk1lYXN1cmUoIiArIE1lYXN1cmVTcGVjLnRvU3RyaW5nKHdpZHRoTWVhc3VyZVNwZWMpICsgIiwgIgorICAgICAgICAgICAgICAgICAgICArIE1lYXN1cmVTcGVjLnRvU3RyaW5nKGhlaWdodE1lYXN1cmVTcGVjKSArICIpIik7CisgICAgICAgICAgICBMb2cuaShUQUcsICIgbWVhc3VyZWRTaXplOiAiICsgZ2V0TWVhc3VyZWRXaWR0aCgpICsgIi8iICsgZ2V0TWVhc3VyZWRIZWlnaHQoKSk7CisgICAgICAgICAgICBMb2cuaShUQUcsICIgdmlld1NpemU6ICIgKyBnZXRXaWR0aCgpICsgIi8iICsgZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgTG9nLmkoVEFHLCAiIG1WaWRlb1dpZHRoL2hlaWdodDogIiArIHZpZGVvV2lkdGggKyAiLCAiICsgdmlkZW9IZWlnaHQpOworICAgICAgICB9CisKKyAgICAgICAgaW50IHdpZHRoID0gZ2V0RGVmYXVsdFNpemUodmlkZW9XaWR0aCwgd2lkdGhNZWFzdXJlU3BlYyk7CisgICAgICAgIGludCBoZWlnaHQgPSBnZXREZWZhdWx0U2l6ZSh2aWRlb0hlaWdodCwgaGVpZ2h0TWVhc3VyZVNwZWMpOworCisgICAgICAgIGlmICh2aWRlb1dpZHRoID4gMCAmJiB2aWRlb0hlaWdodCA+IDApIHsKKyAgICAgICAgICAgIGludCB3aWR0aFNwZWNTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZSh3aWR0aE1lYXN1cmVTcGVjKTsKKyAgICAgICAgICAgIGludCBoZWlnaHRTcGVjU2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUoaGVpZ2h0TWVhc3VyZVNwZWMpOworCisgICAgICAgICAgICB3aWR0aCA9IHdpZHRoU3BlY1NpemU7CisgICAgICAgICAgICBoZWlnaHQgPSBoZWlnaHRTcGVjU2l6ZTsKKworICAgICAgICAgICAgLy8gZm9yIGNvbXBhdGliaWxpdHksIHdlIGFkanVzdCBzaXplIGJhc2VkIG9uIGFzcGVjdCByYXRpbworICAgICAgICAgICAgaWYgKHZpZGVvV2lkdGggKiBoZWlnaHQgPCB3aWR0aCAqIHZpZGVvSGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgd2lkdGggPSBoZWlnaHQgKiB2aWRlb1dpZHRoIC8gdmlkZW9IZWlnaHQ7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImltYWdlIHRvbyB3aWRlLCBjb3JyZWN0aW5nLiB3aWR0aDogIiArIHdpZHRoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZpZGVvV2lkdGggKiBoZWlnaHQgPiB3aWR0aCAqIHZpZGVvSGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgaGVpZ2h0ID0gd2lkdGggKiB2aWRlb0hlaWdodCAvIHZpZGVvV2lkdGg7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImltYWdlIHRvbyB0YWxsLCBjb3JyZWN0aW5nLiBoZWlnaHQ6ICIgKyBoZWlnaHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG5vIHNpemUgeWV0LCBqdXN0IGFkb3B0IHRoZSBnaXZlbiBzcGVjIHNpemVzCisgICAgICAgIH0KKyAgICAgICAgc2V0TWVhc3VyZWREaW1lbnNpb24od2lkdGgsIGhlaWdodCk7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiZW5kIG9mIG9uTWVhc3VyZSgpIik7CisgICAgICAgICAgICBMb2cuaShUQUcsICIgbWVhc3VyZWRTaXplOiAiICsgZ2V0TWVhc3VyZWRXaWR0aCgpICsgIi8iICsgZ2V0TWVhc3VyZWRIZWlnaHQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIlZpZXdUeXBlOiBTdXJmYWNlVmlldyAvIFZpc2liaWxpdHk6ICIgKyBnZXRWaXNpYmlsaXR5KCkKKyAgICAgICAgICAgICAgICArICIgLyBzdXJmYWNlSG9sZGVyOiAiICsgbVN1cmZhY2VIb2xkZXI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9UZXh0dXJlVmlldy5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9UZXh0dXJlVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNGEzYWEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1RleHR1cmVWaWV3LmphdmEKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TdXJmYWNlVGV4dHVyZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMjsKK2ltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLlJlcXVpcmVzQXBpOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVGV4dHVyZVZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3Mi5WSUVXX1RZUEVfVEVYVFVSRVZJRVc7CisKK0BSZXF1aXJlc0FwaSgyNikKK2NsYXNzIFZpZGVvVGV4dHVyZVZpZXcgZXh0ZW5kcyBUZXh0dXJlVmlldworICAgICAgICBpbXBsZW1lbnRzIFZpZGVvVmlld0ludGVyZmFjZSwgVGV4dHVyZVZpZXcuU3VyZmFjZVRleHR1cmVMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJWaWRlb1RleHR1cmVWaWV3IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gU1RPUFNISVA6IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKKworICAgIHByaXZhdGUgU3VyZmFjZVRleHR1cmUgbVN1cmZhY2VUZXh0dXJlOworICAgIHByaXZhdGUgU3VyZmFjZSBtU3VyZmFjZTsKKyAgICBwcml2YXRlIFN1cmZhY2VMaXN0ZW5lciBtU3VyZmFjZUxpc3RlbmVyOworICAgIHByaXZhdGUgTWVkaWFQbGF5ZXIyIG1NZWRpYVBsYXllcjsKKyAgICAvLyBBIGZsYWcgdG8gaW5kaWNhdGUgdGFraW5nIG92ZXIgb3RoZXIgdmlldyBzaG91bGQgYmUgcHJvY2VlZC4KKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzVGFraW5nT3Zlck9sZFZpZXc7CisgICAgcHJpdmF0ZSBWaWRlb1ZpZXdJbnRlcmZhY2UgbU9sZFZpZXc7CisKKyAgICBwdWJsaWMgVmlkZW9UZXh0dXJlVmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmlkZW9UZXh0dXJlVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmlkZW9UZXh0dXJlVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0cikgeworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIDApOworICAgIH0KKworICAgIHB1YmxpYyBWaWRlb1RleHR1cmVWaWV3KAorICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCBkZWZTdHlsZVJlcyk7CisgICAgICAgIHNldFN1cmZhY2VUZXh0dXJlTGlzdGVuZXIodGhpcyk7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIGltcGxlbWVudHMgVmlkZW9WaWV3SW50ZXJmYWNlCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIoTWVkaWFQbGF5ZXIyIG1wKSB7CisgICAgICAgIExvZy5kKFRBRywgImFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKCk6IG1TdXJmYWNlVGV4dHVyZTogIiArIG1TdXJmYWNlVGV4dHVyZSk7CisgICAgICAgIGlmIChtcCA9PSBudWxsIHx8ICFoYXNBdmFpbGFibGVTdXJmYWNlKCkpIHsKKyAgICAgICAgICAgIC8vIFN1cmZhY2UgaXMgbm90IHJlYWR5LgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIG1wLnNldFN1cmZhY2UobVN1cmZhY2UpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTdXJmYWNlTGlzdGVuZXIoU3VyZmFjZUxpc3RlbmVyIGwpIHsKKyAgICAgICAgbVN1cmZhY2VMaXN0ZW5lciA9IGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRWaWV3VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIFZJRVdfVFlQRV9URVhUVVJFVklFVzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRNZWRpYVBsYXllcihNZWRpYVBsYXllcjIgbXApIHsKKyAgICAgICAgbU1lZGlhUGxheWVyID0gbXA7CisgICAgICAgIGlmIChtSXNUYWtpbmdPdmVyT2xkVmlldykgeworICAgICAgICAgICAgdGFrZU92ZXIobU9sZFZpZXcpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGFrZU92ZXIoQE5vbk51bGwgVmlkZW9WaWV3SW50ZXJmYWNlIG9sZFZpZXcpIHsKKyAgICAgICAgaWYgKGFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKG1NZWRpYVBsYXllcikpIHsKKyAgICAgICAgICAgICgoVmlldykgb2xkVmlldykuc2V0VmlzaWJpbGl0eShHT05FKTsKKyAgICAgICAgICAgIG1Jc1Rha2luZ092ZXJPbGRWaWV3ID0gZmFsc2U7CisgICAgICAgICAgICBtT2xkVmlldyA9IG51bGw7CisgICAgICAgICAgICBpZiAobVN1cmZhY2VMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VUYWtlT3ZlckRvbmUodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSXNUYWtpbmdPdmVyT2xkVmlldyA9IHRydWU7CisgICAgICAgICAgICBtT2xkVmlldyA9IG9sZFZpZXc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNBdmFpbGFibGVTdXJmYWNlKCkgeworICAgICAgICByZXR1cm4gKG1TdXJmYWNlVGV4dHVyZSAhPSBudWxsICYmICFtU3VyZmFjZVRleHR1cmUuaXNSZWxlYXNlZCgpICYmIG1TdXJmYWNlICE9IG51bGwpOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBpbXBsZW1lbnRzIFRleHR1cmVWaWV3LlN1cmZhY2VUZXh0dXJlTGlzdGVuZXIKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VUZXh0dXJlQXZhaWxhYmxlKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2VUZXh0dXJlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAib25TdXJmYWNlVGV4dHVyZUF2YWlsYWJsZTogbVN1cmZhY2VUZXh0dXJlOiAiICsgbVN1cmZhY2VUZXh0dXJlCisgICAgICAgICAgICAgICAgKyAiLCBuZXcgc3VyZmFjZTogIiArIHN1cmZhY2VUZXh0dXJlKTsKKyAgICAgICAgbVN1cmZhY2VUZXh0dXJlID0gc3VyZmFjZVRleHR1cmU7CisgICAgICAgIG1TdXJmYWNlID0gbmV3IFN1cmZhY2UobVN1cmZhY2VUZXh0dXJlKTsKKyAgICAgICAgaWYgKG1Jc1Rha2luZ092ZXJPbGRWaWV3KSB7CisgICAgICAgICAgICB0YWtlT3ZlcihtT2xkVmlldyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihtTWVkaWFQbGF5ZXIpOworICAgICAgICB9CisgICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlQ3JlYXRlZCh0aGlzLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZVRleHR1cmVTaXplQ2hhbmdlZChTdXJmYWNlVGV4dHVyZSBzdXJmYWNlVGV4dHVyZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlQ2hhbmdlZCh0aGlzLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgfQorICAgICAgICAvLyByZXF1ZXN0TGF5b3V0KCk7ICAvLyBUT0RPOiBmaWd1cmUgb3V0IGlmIGl0IHNob3VsZCBiZSBjYWxsZWQgaGVyZT8KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VUZXh0dXJlVXBkYXRlZChTdXJmYWNlVGV4dHVyZSBzdXJmYWNlKSB7CisgICAgICAgIC8vIG5vLW9wCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25TdXJmYWNlVGV4dHVyZURlc3Ryb3llZChTdXJmYWNlVGV4dHVyZSBzdXJmYWNlVGV4dHVyZSkgeworICAgICAgICBpZiAobVN1cmZhY2VMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBtU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZURlc3Ryb3llZCh0aGlzKTsKKyAgICAgICAgfQorICAgICAgICBtU3VyZmFjZVRleHR1cmUgPSBudWxsOworICAgICAgICBtU3VyZmFjZSA9IG51bGw7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7CisgICAgICAgIGludCB2aWRlb1dpZHRoID0gKG1NZWRpYVBsYXllciA9PSBudWxsKSA/IDAgOiBtTWVkaWFQbGF5ZXIuZ2V0VmlkZW9XaWR0aCgpOworICAgICAgICBpbnQgdmlkZW9IZWlnaHQgPSAobU1lZGlhUGxheWVyID09IG51bGwpID8gMCA6IG1NZWRpYVBsYXllci5nZXRWaWRlb0hlaWdodCgpOworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIm9uTWVhc3VyZSgiICsgTWVhc3VyZVNwZWMudG9TdHJpbmcod2lkdGhNZWFzdXJlU3BlYykgKyAiLCAiCisgICAgICAgICAgICAgICAgICAgICsgTWVhc3VyZVNwZWMudG9TdHJpbmcoaGVpZ2h0TWVhc3VyZVNwZWMpICsgIikiKTsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIiBtZWFzdXJlZFNpemU6ICIgKyBnZXRNZWFzdXJlZFdpZHRoKCkgKyAiLyIgKyBnZXRNZWFzdXJlZEhlaWdodCgpKTsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIiB2aWV3U2l6ZTogIiArIGdldFdpZHRoKCkgKyAiLyIgKyBnZXRIZWlnaHQoKSk7CisgICAgICAgICAgICBMb2cuaShUQUcsICIgbVZpZGVvV2lkdGgvaGVpZ2h0OiAiICsgdmlkZW9XaWR0aCArICIsICIgKyB2aWRlb0hlaWdodCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgd2lkdGggPSBnZXREZWZhdWx0U2l6ZSh2aWRlb1dpZHRoLCB3aWR0aE1lYXN1cmVTcGVjKTsKKyAgICAgICAgaW50IGhlaWdodCA9IGdldERlZmF1bHRTaXplKHZpZGVvSGVpZ2h0LCBoZWlnaHRNZWFzdXJlU3BlYyk7CisKKyAgICAgICAgaWYgKHZpZGVvV2lkdGggPiAwICYmIHZpZGVvSGVpZ2h0ID4gMCkgeworICAgICAgICAgICAgaW50IHdpZHRoU3BlY1NpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKHdpZHRoTWVhc3VyZVNwZWMpOworICAgICAgICAgICAgaW50IGhlaWdodFNwZWNTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYyk7CisKKyAgICAgICAgICAgIHdpZHRoID0gd2lkdGhTcGVjU2l6ZTsKKyAgICAgICAgICAgIGhlaWdodCA9IGhlaWdodFNwZWNTaXplOworCisgICAgICAgICAgICAvLyBmb3IgY29tcGF0aWJpbGl0eSwgd2UgYWRqdXN0IHNpemUgYmFzZWQgb24gYXNwZWN0IHJhdGlvCisgICAgICAgICAgICBpZiAodmlkZW9XaWR0aCAqIGhlaWdodCA8IHdpZHRoICogdmlkZW9IZWlnaHQpIHsKKyAgICAgICAgICAgICAgICB3aWR0aCA9IGhlaWdodCAqIHZpZGVvV2lkdGggLyB2aWRlb0hlaWdodDsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiaW1hZ2UgdG9vIHdpZGUsIGNvcnJlY3RpbmcuIHdpZHRoOiAiICsgd2lkdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmlkZW9XaWR0aCAqIGhlaWdodCA+IHdpZHRoICogdmlkZW9IZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBoZWlnaHQgPSB3aWR0aCAqIHZpZGVvSGVpZ2h0IC8gdmlkZW9XaWR0aDsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiaW1hZ2UgdG9vIHRhbGwsIGNvcnJlY3RpbmcuIGhlaWdodDogIiArIGhlaWdodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gbm8gc2l6ZSB5ZXQsIGp1c3QgYWRvcHQgdGhlIGdpdmVuIHNwZWMgc2l6ZXMKKyAgICAgICAgfQorICAgICAgICBzZXRNZWFzdXJlZERpbWVuc2lvbih3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuaShUQUcsICJlbmQgb2Ygb25NZWFzdXJlKCkiKTsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIiBtZWFzdXJlZFNpemU6ICIgKyBnZXRNZWFzdXJlZFdpZHRoKCkgKyAiLyIgKyBnZXRNZWFzdXJlZEhlaWdodCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiVmlld1R5cGU6IFRleHR1cmVWaWV3IC8gVmlzaWJpbGl0eTogIiArIGdldFZpc2liaWxpdHkoKQorICAgICAgICAgICAgICAgICsgIiAvIHN1cmZhY2VUZXh0dXJlOiAiICsgbVN1cmZhY2VUZXh0dXJlOworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3MkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvVmlldzJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcyNzlkNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvVmlldzJJbXBsLmphdmEKQEAgLTAsMCArMSwxNDA1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Gb2N1c1JlcXVlc3Q7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5EYXRhU291cmNlRGVzYzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGE7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMi5PblN1YnRpdGxlRGF0YUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIySW1wbDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlN1YnRpdGxlRGF0YTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZXRhZGF0YTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlBsYXliYWNrUGFyYW1zOworaW1wb3J0IGFuZHJvaWQubWVkaWEuVGltZWRUZXh0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYUNvbnRyb2xsZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhQ29udHJvbGxlci5QbGF5YmFja0luZm87CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVmlkZW9WaWV3MlByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZpZXdHcm91cFByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkFzeW5jVGFzazsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xWaWV3MjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcyOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuZ3JhcGhpY3MucGFsZXR0ZS5QYWxldHRlOworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLlJvdXRlUGxheWVyOworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlLkNsb3NlZENhcHRpb25SZW5kZXJlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZS5TdWJ0aXRsZUNvbnRyb2xsZXI7CitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGUuU3VidGl0bGVUcmFjazsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOworaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFJdGVtU3RhdHVzOworaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFDb250cm9sSW50ZW50OworaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7CisKK3B1YmxpYyBjbGFzcyBWaWRlb1ZpZXcySW1wbCBleHRlbmRzIEJhc2VMYXlvdXQKKyAgICAgICAgaW1wbGVtZW50cyBWaWRlb1ZpZXcyUHJvdmlkZXIsIFZpZGVvVmlld0ludGVyZmFjZS5TdXJmYWNlTGlzdGVuZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVmlkZW9WaWV3MiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFNUT1BTSElQOiBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUX1NIT1dfQ09OVFJPTExFUl9JTlRFUlZBTF9NUyA9IDIwMDA7CisKKyAgICBwcml2YXRlIGZpbmFsIFZpZGVvVmlldzIgbUluc3RhbmNlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0VSUk9SID0gLTE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0lETEUgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QUkVQQVJJTkcgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QUkVQQVJFRCA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1BMQVlJTkcgPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QQVVTRUQgPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QTEFZQkFDS19DT01QTEVURUQgPSA1OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfVFJBQ0tfSU5ERVggPSAtMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBJTlZBTElEX1NQRUVEID0gMGY7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX0VNQkVEREVEID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX0ZVTEwgPSAxOworICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBNaW5pbWFsIHNpemUgdHlwZS4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX01JTklNQUwgPSAyOworCisgICAgcHJpdmF0ZSBBY2Nlc3NpYmlsaXR5TWFuYWdlciBtQWNjZXNzaWJpbGl0eU1hbmFnZXI7CisgICAgcHJpdmF0ZSBBdWRpb01hbmFnZXIgbUF1ZGlvTWFuYWdlcjsKKyAgICBwcml2YXRlIEF1ZGlvQXR0cmlidXRlcyBtQXVkaW9BdHRyaWJ1dGVzOworICAgIHByaXZhdGUgaW50IG1BdWRpb0ZvY3VzVHlwZSA9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU47IC8vIGxlZ2FjeSBmb2N1cyBnYWluCisKKyAgICBwcml2YXRlIFBhaXI8RXhlY3V0b3IsIFZpZGVvVmlldzIuT25DdXN0b21BY3Rpb25MaXN0ZW5lcj4gbUN1c3RvbUFjdGlvbkxpc3RlbmVyUmVjb3JkOworICAgIHByaXZhdGUgVmlkZW9WaWV3Mi5PblZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyIG1WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lcjsKKyAgICBwcml2YXRlIFZpZGVvVmlldzIuT25GdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyIG1GdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyOworCisgICAgcHJpdmF0ZSBWaWRlb1ZpZXdJbnRlcmZhY2UgbUN1cnJlbnRWaWV3OworICAgIHByaXZhdGUgVmlkZW9UZXh0dXJlVmlldyBtVGV4dHVyZVZpZXc7CisgICAgcHJpdmF0ZSBWaWRlb1N1cmZhY2VWaWV3IG1TdXJmYWNlVmlldzsKKworICAgIHByaXZhdGUgTWVkaWFQbGF5ZXIyIG1NZWRpYVBsYXllcjsKKyAgICBwcml2YXRlIERhdGFTb3VyY2VEZXNjIG1Ec2Q7CisgICAgcHJpdmF0ZSBNZWRpYUNvbnRyb2xWaWV3MiBtTWVkaWFDb250cm9sVmlldzsKKyAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbiBtTWVkaWFTZXNzaW9uOworICAgIHByaXZhdGUgTWVkaWFDb250cm9sbGVyIG1NZWRpYUNvbnRyb2xsZXI7CisgICAgcHJpdmF0ZSBNZXRhZGF0YSBtTWV0YWRhdGE7CisgICAgcHJpdmF0ZSBNZWRpYU1ldGFkYXRhMiBtTWVkaWFNZXRhZGF0YTsKKyAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIgbVJldHJpZXZlcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbU5lZWRVcGRhdGVNZWRpYVR5cGU7CisgICAgcHJpdmF0ZSBCdW5kbGUgbU1lZGlhVHlwZURhdGE7CisgICAgcHJpdmF0ZSBTdHJpbmcgbVRpdGxlOworCisgICAgLy8gVE9ETzogbW92ZSBtdXNpYyB2aWV3IGluc2lkZSBTdXJmYWNlVmlldy9UZXh0dXJlVmlldyBvciBpbXBsZW1lbnQgVmlkZW9WaWV3SW50ZXJmYWNlLgorICAgIHByaXZhdGUgV2luZG93TWFuYWdlciBtTWFuYWdlcjsKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzb3VyY2VzOworICAgIHByaXZhdGUgVmlldyBtTXVzaWNWaWV3OworICAgIHByaXZhdGUgRHJhd2FibGUgbU11c2ljQWxidW1EcmF3YWJsZTsKKyAgICBwcml2YXRlIFN0cmluZyBtTXVzaWNUaXRsZVRleHQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbU11c2ljQXJ0aXN0VGV4dDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzTXVzaWNNZWRpYVR5cGU7CisgICAgcHJpdmF0ZSBpbnQgbVByZXZXaWR0aDsKKyAgICBwcml2YXRlIGludCBtUHJldkhlaWdodDsKKyAgICBwcml2YXRlIGludCBtRG9taW5hbnRDb2xvcjsKKyAgICBwcml2YXRlIGludCBtU2l6ZVR5cGU7CisKKyAgICBwcml2YXRlIFBsYXliYWNrU3RhdGUuQnVpbGRlciBtU3RhdGVCdWlsZGVyOworICAgIHByaXZhdGUgTGlzdDxQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbj4gbUN1c3RvbUFjdGlvbkxpc3Q7CisgICAgcHJpdmF0ZSBpbnQgbVRhcmdldFN0YXRlID0gU1RBVEVfSURMRTsKKyAgICBwcml2YXRlIGludCBtQ3VycmVudFN0YXRlID0gU1RBVEVfSURMRTsKKyAgICBwcml2YXRlIGludCBtQ3VycmVudEJ1ZmZlclBlcmNlbnRhZ2U7CisgICAgcHJpdmF0ZSBsb25nIG1TZWVrV2hlblByZXBhcmVkOyAgLy8gcmVjb3JkaW5nIHRoZSBzZWVrIHBvc2l0aW9uIHdoaWxlIHByZXBhcmluZworCisgICAgcHJpdmF0ZSBpbnQgbVZpZGVvV2lkdGg7CisgICAgcHJpdmF0ZSBpbnQgbVZpZGVvSGVpZ2h0OworCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8SW50ZWdlcj4gbVZpZGVvVHJhY2tJbmRpY2VzOworICAgIHByaXZhdGUgQXJyYXlMaXN0PEludGVnZXI+IG1BdWRpb1RyYWNrSW5kaWNlczsKKyAgICBwcml2YXRlIEFycmF5TGlzdDxQYWlyPEludGVnZXIsIFN1YnRpdGxlVHJhY2s+PiBtU3VidGl0bGVUcmFja0luZGljZXM7CisgICAgcHJpdmF0ZSBTdWJ0aXRsZUNvbnRyb2xsZXIgbVN1YnRpdGxlQ29udHJvbGxlcjsKKworICAgIC8vIHNlbGVjdGVkIHZpZGVvL2F1ZGlvL3N1YnRpdGxlIHRyYWNrIGluZGV4IGFzIE1lZGlhUGxheWVyMiByZXR1cm5zCisgICAgcHJpdmF0ZSBpbnQgbVNlbGVjdGVkVmlkZW9UcmFja0luZGV4OworICAgIHByaXZhdGUgaW50IG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleDsKKyAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXg7CisKKyAgICBwcml2YXRlIFN1YnRpdGxlVmlldyBtU3VidGl0bGVWaWV3OworICAgIHByaXZhdGUgYm9vbGVhbiBtU3VidGl0bGVFbmFibGVkOworCisgICAgcHJpdmF0ZSBmbG9hdCBtU3BlZWQ7CisgICAgLy8gVE9ETzogUmVtb3ZlIG1GYWxsYmFja1NwZWVkIHdoZW4gaW50ZWdyYXRpb24gd2l0aCBNZWRpYVBsYXllcjIncyBuZXcgc2V0UGxheWJhY2tQYXJhbXMoKS4KKyAgICAvLyBSZWZlcjogaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xbnpBZm5zNmkyaEozUmthVXJlM1FNVDZ3c0RlZEo1T05MaUFfT09CRkZYOC9lZGl0CisgICAgcHJpdmF0ZSBmbG9hdCBtRmFsbGJhY2tTcGVlZDsgIC8vIGtlZXAgdGhlIG9yaWdpbmFsIHNwZWVkIGJlZm9yZSAncGF1c2UnIGlzIGNhbGxlZC4KKyAgICBwcml2YXRlIGZsb2F0IG1Wb2x1bWVMZXZlbEZsb2F0OworICAgIHByaXZhdGUgaW50IG1Wb2x1bWVMZXZlbDsKKworICAgIHByaXZhdGUgbG9uZyBtU2hvd0NvbnRyb2xsZXJJbnRlcnZhbE1zOworCisgICAgcHJpdmF0ZSBNZWRpYVJvdXRlciBtTWVkaWFSb3V0ZXI7CisgICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVJvdXRlU2VsZWN0b3I7CisgICAgcHJpdmF0ZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gbVJvdXRlOworICAgIHByaXZhdGUgUm91dGVQbGF5ZXIgbVJvdXRlUGxheWVyOworCisgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlci5DYWxsYmFjayBtUm91dGVyQ2FsbGJhY2sgPSBuZXcgTWVkaWFSb3V0ZXIuQ2FsbGJhY2soKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKKyAgICAgICAgICAgIGlmIChyb3V0ZS5zdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKSkgeworICAgICAgICAgICAgICAgIC8vIFN0b3AgbG9jYWwgcGxheWJhY2sgKGlmIG5lY2Vzc2FyeSkKKyAgICAgICAgICAgICAgICByZXNldFBsYXllcigpOworICAgICAgICAgICAgICAgIG1Sb3V0ZSA9IHJvdXRlOworICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllciA9IG5ldyBSb3V0ZVBsYXllcihtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLCByb3V0ZSk7CisgICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyLnNldFBsYXllckV2ZW50Q2FsbGJhY2sobmV3IFJvdXRlUGxheWVyLlBsYXllckV2ZW50Q2FsbGJhY2soKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXllclN0YXRlQ2hhbmdlZChNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAgICAgUGxheWJhY2tTdGF0ZS5CdWlsZGVyIHBzQnVpbGRlciA9IG5ldyBQbGF5YmFja1N0YXRlLkJ1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzQnVpbGRlci5zZXRBY3Rpb25zKFJvdXRlUGxheWVyLlBMQVlCQUNLX0FDVElPTlMpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBwb3NpdGlvbiA9IGl0ZW1TdGF0dXMuZ2V0Q29udGVudFBvc2l0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGl0ZW1TdGF0dXMuZ2V0UGxheWJhY2tTdGF0ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUl0ZW1TdGF0dXMuUExBWUJBQ0tfU1RBVEVfUEVORElORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNCdWlsZGVyLnNldFN0YXRlKFBsYXliYWNrU3RhdGUuU1RBVEVfTk9ORSwgcG9zaXRpb24sIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfSURMRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUl0ZW1TdGF0dXMuUExBWUJBQ0tfU1RBVEVfUExBWUlORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNCdWlsZGVyLnNldFN0YXRlKFBsYXliYWNrU3RhdGUuU1RBVEVfUExBWUlORywgcG9zaXRpb24sIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUExBWUlORzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUl0ZW1TdGF0dXMuUExBWUJBQ0tfU1RBVEVfUEFVU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc0J1aWxkZXIuc2V0U3RhdGUoUGxheWJhY2tTdGF0ZS5TVEFURV9QQVVTRUQsIHBvc2l0aW9uLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BBVVNFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUl0ZW1TdGF0dXMuUExBWUJBQ0tfU1RBVEVfQlVGRkVSSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc0J1aWxkZXIuc2V0U3RhdGUoUGxheWJhY2tTdGF0ZS5TVEFURV9CVUZGRVJJTkcsIHBvc2l0aW9uLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BBVVNFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUl0ZW1TdGF0dXMuUExBWUJBQ0tfU1RBVEVfRklOSVNIRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzQnVpbGRlci5zZXRTdGF0ZShQbGF5YmFja1N0YXRlLlNUQVRFX1NUT1BQRUQsIHBvc2l0aW9uLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BMQVlCQUNLX0NPTVBMRVRFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrU3RhdGUgcGJTdGF0ZSA9IHBzQnVpbGRlci5idWlsZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRQbGF5YmFja1N0YXRlKHBiU3RhdGUpOworCisgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIgbW1CdWlsZGVyID0gbmV3IE1lZGlhTWV0YWRhdGEuQnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgbW1CdWlsZGVyLnB1dExvbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfRFVSQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1TdGF0dXMuZ2V0Q29udGVudER1cmF0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRNZXRhZGF0YShtbUJ1aWxkZXIuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAvLyBTdGFydCByZW1vdGUgcGxheWJhY2sgKGlmIG5lY2Vzc2FyeSkKKyAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIub3BlblZpZGVvKG1Ec2QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlLCBpbnQgcmVhc29uKSB7CisgICAgICAgICAgICBpZiAobVJvdXRlICE9IG51bGwgJiYgbVJvdXRlUGxheWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIucmVsZWFzZSgpOworICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVJvdXRlID09IHJvdXRlKSB7CisgICAgICAgICAgICAgICAgbVJvdXRlID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZWFzb24gIT0gTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUQpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBSZXN1bWUgbG9jYWwgcGxheWJhY2sgIChpZiBuZWNlc3NhcnkpCisgICAgICAgICAgICAgICAgb3BlblZpZGVvKG1Ec2QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBWaWRlb1ZpZXcySW1wbChWaWRlb1ZpZXcyIGluc3RhbmNlLAorICAgICAgICAgICAgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyKSB7CisgICAgICAgIHN1cGVyKGluc3RhbmNlLCBzdXBlclByb3ZpZGVyLCBwcml2YXRlUHJvdmlkZXIpOworICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKEBOdWxsYWJsZSBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgeworICAgICAgICBtVmlkZW9XaWR0aCA9IDA7CisgICAgICAgIG1WaWRlb0hlaWdodCA9IDA7CisgICAgICAgIG1TcGVlZCA9IDEuMGY7CisgICAgICAgIG1GYWxsYmFja1NwZWVkID0gbVNwZWVkOworICAgICAgICBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXggPSBJTlZBTElEX1RSQUNLX0lOREVYOworICAgICAgICAvLyBUT0RPOiBhZGQgYXR0cmlidXRlcyB0byBnZXQgdGhpcyB2YWx1ZS4KKyAgICAgICAgbVNob3dDb250cm9sbGVySW50ZXJ2YWxNcyA9IERFRkFVTFRfU0hPV19DT05UUk9MTEVSX0lOVEVSVkFMX01TOworCisgICAgICAgIG1BY2Nlc3NpYmlsaXR5TWFuYWdlciA9IEFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldEluc3RhbmNlKG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOworCisgICAgICAgIG1BdWRpb01hbmFnZXIgPSAoQXVkaW9NYW5hZ2VyKSBtSW5zdGFuY2UuZ2V0Q29udGV4dCgpCisgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BVURJT19TRVJWSUNFKTsKKyAgICAgICAgbUF1ZGlvQXR0cmlidXRlcyA9IG5ldyBBdWRpb0F0dHJpYnV0ZXMuQnVpbGRlcigpLnNldFVzYWdlKEF1ZGlvQXR0cmlidXRlcy5VU0FHRV9NRURJQSkKKyAgICAgICAgICAgICAgICAuc2V0Q29udGVudFR5cGUoQXVkaW9BdHRyaWJ1dGVzLkNPTlRFTlRfVFlQRV9NT1ZJRSkuYnVpbGQoKTsKKyAgICAgICAgbUluc3RhbmNlLnNldEZvY3VzYWJsZSh0cnVlKTsKKyAgICAgICAgbUluc3RhbmNlLnNldEZvY3VzYWJsZUluVG91Y2hNb2RlKHRydWUpOworICAgICAgICBtSW5zdGFuY2UucmVxdWVzdEZvY3VzKCk7CisKKyAgICAgICAgLy8gVE9ETzogdHJ5IHRvIGtlZXAgYSBzaW5nbGUgY2hpbGQgYXQgYSB0aW1lIHJhdGhlciB0aGFuIGFsd2F5cyBoYXZpbmcgYm90aC4KKyAgICAgICAgbVRleHR1cmVWaWV3ID0gbmV3IFZpZGVvVGV4dHVyZVZpZXcobUluc3RhbmNlLmdldENvbnRleHQoKSk7CisgICAgICAgIG1TdXJmYWNlVmlldyA9IG5ldyBWaWRlb1N1cmZhY2VWaWV3KG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOworICAgICAgICBMYXlvdXRQYXJhbXMgcGFyYW1zID0gbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAorICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpOworICAgICAgICBtVGV4dHVyZVZpZXcuc2V0TGF5b3V0UGFyYW1zKHBhcmFtcyk7CisgICAgICAgIG1TdXJmYWNlVmlldy5zZXRMYXlvdXRQYXJhbXMocGFyYW1zKTsKKyAgICAgICAgbVRleHR1cmVWaWV3LnNldFN1cmZhY2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbVN1cmZhY2VWaWV3LnNldFN1cmZhY2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbUluc3RhbmNlLmFkZFZpZXcobVRleHR1cmVWaWV3KTsKKyAgICAgICAgbUluc3RhbmNlLmFkZFZpZXcobVN1cmZhY2VWaWV3KTsKKworICAgICAgICBtU3VidGl0bGVWaWV3ID0gbmV3IFN1YnRpdGxlVmlldyhtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRMYXlvdXRQYXJhbXMocGFyYW1zKTsKKyAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRCYWNrZ3JvdW5kQ29sb3IoMCk7CisgICAgICAgIG1JbnN0YW5jZS5hZGRWaWV3KG1TdWJ0aXRsZVZpZXcpOworCisgICAgICAgIGJvb2xlYW4gZW5hYmxlQ29udHJvbFZpZXcgPSAoYXR0cnMgPT0gbnVsbCkgfHwgYXR0cnMuZ2V0QXR0cmlidXRlQm9vbGVhblZhbHVlKAorICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiLAorICAgICAgICAgICAgICAgICJlbmFibGVDb250cm9sVmlldyIsIHRydWUpOworICAgICAgICBpZiAoZW5hYmxlQ29udHJvbFZpZXcpIHsKKyAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3ID0gbmV3IE1lZGlhQ29udHJvbFZpZXcyKG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOworICAgICAgICB9CisKKyAgICAgICAgbVN1YnRpdGxlRW5hYmxlZCA9IChhdHRycyA9PSBudWxsKSB8fCBhdHRycy5nZXRBdHRyaWJ1dGVCb29sZWFuVmFsdWUoCisgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIsCisgICAgICAgICAgICAgICAgImVuYWJsZVN1YnRpdGxlIiwgZmFsc2UpOworCisgICAgICAgIC8vIFRPRE86IENob29zZSBUZXh0dXJlVmlldyB3aGVuIFN1cmZhY2VWaWV3IGNhbm5vdCBiZSBjcmVhdGVkLgorICAgICAgICAvLyBDaG9vc2Ugc3VyZmFjZSB2aWV3IGJ5IGRlZmF1bHQKKyAgICAgICAgaW50IHZpZXdUeXBlID0gKGF0dHJzID09IG51bGwpID8gVmlkZW9WaWV3Mi5WSUVXX1RZUEVfU1VSRkFDRVZJRVcKKyAgICAgICAgICAgICAgICA6IGF0dHJzLmdldEF0dHJpYnV0ZUludFZhbHVlKAorICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiLAorICAgICAgICAgICAgICAgICJ2aWV3VHlwZSIsIFZpZGVvVmlldzIuVklFV19UWVBFX1NVUkZBQ0VWSUVXKTsKKyAgICAgICAgaWYgKHZpZXdUeXBlID09IFZpZGVvVmlldzIuVklFV19UWVBFX1NVUkZBQ0VWSUVXKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJ2aWV3VHlwZSBhdHRyaWJ1dGUgaXMgc3VyZmFjZVZpZXcuIik7CisgICAgICAgICAgICBtVGV4dHVyZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgbVN1cmZhY2VWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1DdXJyZW50VmlldyA9IG1TdXJmYWNlVmlldzsKKyAgICAgICAgfSBlbHNlIGlmICh2aWV3VHlwZSA9PSBWaWRlb1ZpZXcyLlZJRVdfVFlQRV9URVhUVVJFVklFVykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAidmlld1R5cGUgYXR0cmlidXRlIGlzIHRleHR1cmVWaWV3LiIpOworICAgICAgICAgICAgbVRleHR1cmVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIG1TdXJmYWNlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICBtQ3VycmVudFZpZXcgPSBtVGV4dHVyZVZpZXc7CisgICAgICAgIH0KKworICAgICAgICBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlciBidWlsZGVyID0gbmV3IE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyKCk7CisgICAgICAgIGJ1aWxkZXIuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spOworICAgICAgICBidWlsZGVyLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTyk7CisgICAgICAgIGJ1aWxkZXIuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKTsKKyAgICAgICAgbVJvdXRlU2VsZWN0b3IgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0TWVkaWFDb250cm9sVmlldzJfaW1wbChNZWRpYUNvbnRyb2xWaWV3MiBtZWRpYUNvbnRyb2xWaWV3LCBsb25nIGludGVydmFsTXMpIHsKKyAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcgPSBtZWRpYUNvbnRyb2xWaWV3OworICAgICAgICBtU2hvd0NvbnRyb2xsZXJJbnRlcnZhbE1zID0gaW50ZXJ2YWxNczsKKyAgICAgICAgLy8gVE9ETzogQ2FsbCBNZWRpYUNvbnRyb2xWaWV3Mi5zZXRSb3V0ZVNlbGVjdG9yIG9ubHkgd2hlbiBjYXN0IGF2YWlsYWxiZS4KKyAgICAgICAgKChNZWRpYUNvbnRyb2xWaWV3MkltcGwpIG1NZWRpYUNvbnRyb2xWaWV3LmdldFByb3ZpZGVyKCkpLnNldFJvdXRlU2VsZWN0b3IobVJvdXRlU2VsZWN0b3IpOworCisgICAgICAgIGlmIChtSW5zdGFuY2UuaXNBdHRhY2hlZFRvV2luZG93KCkpIHsKKyAgICAgICAgICAgIGF0dGFjaE1lZGlhQ29udHJvbFZpZXcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZWRpYUNvbnRyb2xsZXIgZ2V0TWVkaWFDb250cm9sbGVyX2ltcGwoKSB7CisgICAgICAgIGlmIChtTWVkaWFTZXNzaW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1lZGlhU2Vzc2lvbiBpbnN0YW5jZSBpcyBub3QgYXZhaWxhYmxlLiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtTWVkaWFDb250cm9sbGVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4yIGdldE1lZGlhU2Vzc2lvblRva2VuX2ltcGwoKSB7CisgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZWRpYUNvbnRyb2xWaWV3MiBnZXRNZWRpYUNvbnRyb2xWaWV3Ml9pbXBsKCkgeworICAgICAgICByZXR1cm4gbU1lZGlhQ29udHJvbFZpZXc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1lZGlhTWV0YWRhdGEyIGdldE1lZGlhTWV0YWRhdGFfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIG1NZWRpYU1ldGFkYXRhOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhTWV0YWRhdGFfaW1wbChNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgeworICAgICAgICAvLyBUT0RPOiBpbnRlZ3JhdGUgdGhpcyB3aXRoIE1lZGlhU2Vzc2lvbjIjTWVkaWFJdGVtMgorICAgICAgICBtTWVkaWFNZXRhZGF0YSA9IG1ldGFkYXRhOworCisgICAgICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBoYW5kbGluZyB3ZWJzaXRlIGxpbmsKKyAgICAgICAgbU1lZGlhVHlwZURhdGEgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGJvb2xlYW4gaXNBZCA9IG1ldGFkYXRhID09IG51bGwgPworICAgICAgICAgICAgICAgIGZhbHNlIDogbWV0YWRhdGEuZ2V0TG9uZyhNZWRpYU1ldGFkYXRhMi5NRVRBREFUQV9LRVlfQURWRVJUSVNFTUVOVCkgIT0gMDsKKyAgICAgICAgbU1lZGlhVHlwZURhdGEucHV0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xWaWV3MkltcGwuS0VZX1NUQVRFX0lTX0FEVkVSVElTRU1FTlQsIGlzQWQpOworCisgICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uc2VuZFNlc3Npb25FdmVudCgKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLkVWRU5UX1VQREFURV9NRURJQV9UWVBFX1NUQVRVUywgbU1lZGlhVHlwZURhdGEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVXBkYXRlIGxhdGVyIGluc2lkZSBPblByZXBhcmVkTGlzdGVuZXIgYWZ0ZXIgTWVkaWFTZXNzaW9uIGlzIGluaXRpYWxpemVkLgorICAgICAgICAgICAgbU5lZWRVcGRhdGVNZWRpYVR5cGUgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGVFbmFibGVkX2ltcGwoYm9vbGVhbiBlbmFibGUpIHsKKyAgICAgICAgaWYgKGVuYWJsZSAhPSBtU3VidGl0bGVFbmFibGVkKSB7CisgICAgICAgICAgICBzZWxlY3RPckRlc2VsZWN0U3VidGl0bGUoZW5hYmxlKTsKKyAgICAgICAgfQorICAgICAgICBtU3VidGl0bGVFbmFibGVkID0gZW5hYmxlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzU3VidGl0bGVFbmFibGVkX2ltcGwoKSB7CisgICAgICAgIHJldHVybiBtU3VidGl0bGVFbmFibGVkOworICAgIH0KKworICAgIC8vIFRPRE86IHJlbW92ZSBzZXRTcGVlZF9pbXBsIG9uY2UgTWVkaWFDb250cm9sbGVyMiBpcyByZWFkeS4KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTcGVlZF9pbXBsKGZsb2F0IHNwZWVkKSB7CisgICAgICAgIGlmIChzcGVlZCA8PSAwLjBmKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJVbnN1cHBvcnRlZCBzcGVlZCAoIiArIHNwZWVkICsgIikgaXMgaWdub3JlZC4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtU3BlZWQgPSBzcGVlZDsKKyAgICAgICAgaWYgKG1NZWRpYVBsYXllciAhPSBudWxsICYmIG1NZWRpYVBsYXllci5pc1BsYXlpbmcoKSkgeworICAgICAgICAgICAgYXBwbHlTcGVlZCgpOworICAgICAgICB9CisgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRBdWRpb0ZvY3VzUmVxdWVzdF9pbXBsKGludCBmb2N1c0dhaW4pIHsKKyAgICAgICAgaWYgKGZvY3VzR2FpbiAhPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19OT05FCisgICAgICAgICAgICAgICAgJiYgZm9jdXNHYWluICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU4KKyAgICAgICAgICAgICAgICAmJiBmb2N1c0dhaW4gIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfR0FJTl9UUkFOU0lFTlQKKyAgICAgICAgICAgICAgICAmJiBmb2N1c0dhaW4gIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfR0FJTl9UUkFOU0lFTlRfTUFZX0RVQ0sKKyAgICAgICAgICAgICAgICAmJiBmb2N1c0dhaW4gIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfR0FJTl9UUkFOU0lFTlRfRVhDTFVTSVZFKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIGF1ZGlvIGZvY3VzIHR5cGUgIiArIGZvY3VzR2Fpbik7CisgICAgICAgIH0KKyAgICAgICAgbUF1ZGlvRm9jdXNUeXBlID0gZm9jdXNHYWluOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEF1ZGlvQXR0cmlidXRlc19pbXBsKEF1ZGlvQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7CisgICAgICAgIGlmIChhdHRyaWJ1dGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgbnVsbCBBdWRpb0F0dHJpYnV0ZXMiKTsKKyAgICAgICAgfQorICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRWaWRlb1BhdGhfaW1wbChTdHJpbmcgcGF0aCkgeworICAgICAgICBtSW5zdGFuY2Uuc2V0VmlkZW9VcmkoVXJpLnBhcnNlKHBhdGgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRWaWRlb1VyaV9pbXBsKFVyaSB1cmkpIHsKKyAgICAgICAgbUluc3RhbmNlLnNldFZpZGVvVXJpKHVyaSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VmlkZW9VcmlfaW1wbChVcmkgdXJpLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMpIHsKKyAgICAgICAgRGF0YVNvdXJjZURlc2MuQnVpbGRlciBidWlsZGVyID0gbmV3IERhdGFTb3VyY2VEZXNjLkJ1aWxkZXIoKTsKKyAgICAgICAgYnVpbGRlci5zZXREYXRhU291cmNlKG1JbnN0YW5jZS5nZXRDb250ZXh0KCksIHVyaSwgaGVhZGVycywgbnVsbCk7CisgICAgICAgIG1JbnN0YW5jZS5zZXREYXRhU291cmNlKGJ1aWxkZXIuYnVpbGQoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0TWVkaWFJdGVtX2ltcGwoTWVkaWFJdGVtMiBtZWRpYUl0ZW0pIHsKKyAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXREYXRhU291cmNlX2ltcGwoRGF0YVNvdXJjZURlc2MgZHNkKSB7CisgICAgICAgIG1Ec2QgPSBkc2Q7CisgICAgICAgIG1TZWVrV2hlblByZXBhcmVkID0gMDsKKyAgICAgICAgb3BlblZpZGVvKGRzZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Vmlld1R5cGVfaW1wbChpbnQgdmlld1R5cGUpIHsKKyAgICAgICAgaWYgKHZpZXdUeXBlID09IG1DdXJyZW50Vmlldy5nZXRWaWV3VHlwZSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgVmlkZW9WaWV3SW50ZXJmYWNlIHRhcmdldFZpZXc7CisgICAgICAgIGlmICh2aWV3VHlwZSA9PSBWaWRlb1ZpZXcyLlZJRVdfVFlQRV9URVhUVVJFVklFVykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAic3dpdGNoaW5nIHRvIFRleHR1cmVWaWV3Iik7CisgICAgICAgICAgICB0YXJnZXRWaWV3ID0gbVRleHR1cmVWaWV3OworICAgICAgICB9IGVsc2UgaWYgKHZpZXdUeXBlID09IFZpZGVvVmlldzIuVklFV19UWVBFX1NVUkZBQ0VWSUVXKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJzd2l0Y2hpbmcgdG8gU3VyZmFjZVZpZXciKTsKKyAgICAgICAgICAgIHRhcmdldFZpZXcgPSBtU3VyZmFjZVZpZXc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIHZpZXcgdHlwZTogIiArIHZpZXdUeXBlKTsKKyAgICAgICAgfQorICAgICAgICAoKFZpZXcpIHRhcmdldFZpZXcpLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgdGFyZ2V0Vmlldy50YWtlT3ZlcihtQ3VycmVudFZpZXcpOworICAgICAgICBtSW5zdGFuY2UucmVxdWVzdExheW91dCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0Vmlld1R5cGVfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIG1DdXJyZW50Vmlldy5nZXRWaWV3VHlwZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbUFjdGlvbnNfaW1wbCgKKyAgICAgICAgICAgIExpc3Q8UGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24+IGFjdGlvbkxpc3QsCisgICAgICAgICAgICBFeGVjdXRvciBleGVjdXRvciwgVmlkZW9WaWV3Mi5PbkN1c3RvbUFjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIG1DdXN0b21BY3Rpb25MaXN0ID0gYWN0aW9uTGlzdDsKKyAgICAgICAgbUN1c3RvbUFjdGlvbkxpc3RlbmVyUmVjb3JkID0gbmV3IFBhaXI8PihleGVjdXRvciwgbGlzdGVuZXIpOworCisgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBwbGF5YmFjayBidWlsZGVyIGluIG9yZGVyIHRvIGNsZWFyIGV4aXN0aW5nIHRoZSBjdXN0b20gYWN0aW9ucy4KKyAgICAgICAgbVN0YXRlQnVpbGRlciA9IG51bGw7CisgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRPblZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyX2ltcGwoVmlkZW9WaWV3Mi5PblZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyIGwpIHsKKyAgICAgICAgbVZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyID0gbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRGdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyX2ltcGwoVmlkZW9WaWV3Mi5PbkZ1bGxTY3JlZW5SZXF1ZXN0TGlzdGVuZXIgbCkgeworICAgICAgICBtRnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lciA9IGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93X2ltcGwoKSB7CisgICAgICAgIHN1cGVyLm9uQXR0YWNoZWRUb1dpbmRvd19pbXBsKCk7CisKKyAgICAgICAgLy8gQ3JlYXRlIE1lZGlhU2Vzc2lvbgorICAgICAgICBtTWVkaWFTZXNzaW9uID0gbmV3IE1lZGlhU2Vzc2lvbihtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLCAiVmlkZW9WaWV3Mk1lZGlhU2Vzc2lvbiIpOworICAgICAgICBtTWVkaWFTZXNzaW9uLnNldENhbGxiYWNrKG5ldyBNZWRpYVNlc3Npb25DYWxsYmFjaygpKTsKKyAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRBY3RpdmUodHJ1ZSk7CisgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIgPSBtTWVkaWFTZXNzaW9uLmdldENvbnRyb2xsZXIoKTsKKyAgICAgICAgbU1lZGlhUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UobUluc3RhbmNlLmdldENvbnRleHQoKSk7CisgICAgICAgIG1NZWRpYVJvdXRlci5zZXRNZWRpYVNlc3Npb24obU1lZGlhU2Vzc2lvbik7CisgICAgICAgIG1NZWRpYVJvdXRlci5hZGRDYWxsYmFjayhtUm91dGVTZWxlY3RvciwgbVJvdXRlckNhbGxiYWNrKTsKKyAgICAgICAgYXR0YWNoTWVkaWFDb250cm9sVmlldygpOworICAgICAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBhZnRlciBtb3ZpbmcgTWVkaWFTZXNzaW9uIGNyZWF0aW5nIGNvZGUgaW5zaWRlIGluaXRpYWxpemluZyBWaWRlb1ZpZXcyCisgICAgICAgIGlmIChtQ3VycmVudFN0YXRlID09IFNUQVRFX1BSRVBBUkVEKSB7CisgICAgICAgICAgICBleHRyYWN0VHJhY2tzKCk7CisgICAgICAgICAgICBleHRyYWN0TWV0YWRhdGEoKTsKKyAgICAgICAgICAgIGV4dHJhY3RBdWRpb01ldGFkYXRhKCk7CisgICAgICAgICAgICBpZiAobU5lZWRVcGRhdGVNZWRpYVR5cGUpIHsKKyAgICAgICAgICAgICAgICBtTWVkaWFTZXNzaW9uLnNlbmRTZXNzaW9uRXZlbnQoCisgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xWaWV3MkltcGwuRVZFTlRfVVBEQVRFX01FRElBX1RZUEVfU1RBVFVTLAorICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhVHlwZURhdGEpOworICAgICAgICAgICAgICAgIG1OZWVkVXBkYXRlTWVkaWFUeXBlID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvd19pbXBsKCkgeworICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvd19pbXBsKCk7CisKKyAgICAgICAgbU1lZGlhU2Vzc2lvbi5yZWxlYXNlKCk7CisgICAgICAgIG1NZWRpYVNlc3Npb24gPSBudWxsOworICAgICAgICBtTWVkaWFDb250cm9sbGVyID0gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldEFjY2Vzc2liaWxpdHlDbGFzc05hbWVfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIFZpZGVvVmlldzIuY2xhc3MuZ2V0TmFtZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudF9pbXBsKE1vdGlvbkV2ZW50IGV2KSB7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAib25Ub3VjaEV2ZW50KCkuIG1DdXJyZW50U3RhdGU9IiArIG1DdXJyZW50U3RhdGUKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBtVGFyZ2V0U3RhdGU9IiArIG1UYXJnZXRTdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV2LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCAmJiBtTWVkaWFDb250cm9sVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIW1Jc011c2ljTWVkaWFUeXBlIHx8IG1TaXplVHlwZSAhPSBTSVpFX1RZUEVfRlVMTCkgeworICAgICAgICAgICAgICAgIHRvZ2dsZU1lZGlhQ29udHJvbFZpZXdWaXNpYmlsaXR5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3VwZXIub25Ub3VjaEV2ZW50X2ltcGwoZXYpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uVHJhY2tiYWxsRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgeworICAgICAgICBpZiAoZXYuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQICYmIG1NZWRpYUNvbnRyb2xWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghbUlzTXVzaWNNZWRpYVR5cGUgfHwgbVNpemVUeXBlICE9IFNJWkVfVFlQRV9GVUxMKSB7CisgICAgICAgICAgICAgICAgdG9nZ2xlTWVkaWFDb250cm9sVmlld1Zpc2liaWxpdHkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdXBlci5vblRyYWNrYmFsbEV2ZW50X2ltcGwoZXYpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoVG91Y2hFdmVudF9pbXBsKE1vdGlvbkV2ZW50IGV2KSB7CisgICAgICAgIC8vIFRPRE86IFRlc3QgdG91Y2ggZXZlbnQgaGFuZGxpbmcgbG9naWMgdGhvcm91Z2hseSBhbmQgc2ltcGxpZnkgdGhlIGxvZ2ljLgorICAgICAgICByZXR1cm4gc3VwZXIuZGlzcGF0Y2hUb3VjaEV2ZW50X2ltcGwoZXYpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uTWVhc3VyZV9pbXBsKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKKyAgICAgICAgc3VwZXIub25NZWFzdXJlX2ltcGwod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOworCisgICAgICAgIGlmIChtSXNNdXNpY01lZGlhVHlwZSkgeworICAgICAgICAgICAgaWYgKG1QcmV2V2lkdGggIT0gbUluc3RhbmNlLmdldE1lYXN1cmVkV2lkdGgoKQorICAgICAgICAgICAgICAgICAgICB8fCBtUHJldkhlaWdodCAhPSBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRIZWlnaHQoKSkgeworICAgICAgICAgICAgICAgIGludCBjdXJyV2lkdGggPSBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRXaWR0aCgpOworICAgICAgICAgICAgICAgIGludCBjdXJySGVpZ2h0ID0gbUluc3RhbmNlLmdldE1lYXN1cmVkSGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgUG9pbnQgc2NyZWVuU2l6ZSA9IG5ldyBQb2ludCgpOworICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmdldERlZmF1bHREaXNwbGF5KCkuZ2V0U2l6ZShzY3JlZW5TaXplKTsKKyAgICAgICAgICAgICAgICBpbnQgc2NyZWVuV2lkdGggPSBzY3JlZW5TaXplLng7CisgICAgICAgICAgICAgICAgaW50IHNjcmVlbkhlaWdodCA9IHNjcmVlblNpemUueTsKKworICAgICAgICAgICAgICAgIGlmIChjdXJyV2lkdGggPT0gc2NyZWVuV2lkdGggJiYgY3VyckhlaWdodCA9PSBzY3JlZW5IZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG9yaWVudGF0aW9uID0gcmV0cmlldmVPcmllbnRhdGlvbigpOworICAgICAgICAgICAgICAgICAgICBpZiAob3JpZW50YXRpb24gPT0gQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9MQU5EU0NBUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZmxhdGVNdXNpY1ZpZXcoUi5sYXlvdXQuZnVsbF9sYW5kc2NhcGVfbXVzaWMpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5mbGF0ZU11c2ljVmlldyhSLmxheW91dC5mdWxsX3BvcnRyYWl0X211c2ljKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChtU2l6ZVR5cGUgIT0gU0laRV9UWVBFX0ZVTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TaXplVHlwZSA9IFNJWkVfVFlQRV9GVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGV4aXN0aW5nIG1GYWRlT3V0IGNhbGxiYWNrCisgICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5yZW1vdmVDYWxsYmFja3MobUZhZGVPdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TaXplVHlwZSAhPSBTSVpFX1RZUEVfRU1CRURERUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TaXplVHlwZSA9IFNJWkVfVFlQRV9FTUJFRERFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZmxhdGVNdXNpY1ZpZXcoUi5sYXlvdXQuZW1iZWRkZWRfbXVzaWMpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIG5ldyBtRmFkZU91dCBjYWxsYmFjaworICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcucG9zdERlbGF5ZWQobUZhZGVPdXQsIG1TaG93Q29udHJvbGxlckludGVydmFsTXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1QcmV2V2lkdGggPSBjdXJyV2lkdGg7CisgICAgICAgICAgICAgICAgbVByZXZIZWlnaHQgPSBjdXJySGVpZ2h0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gSW1wbGVtZW50cyBWaWRlb1ZpZXdJbnRlcmZhY2UuU3VyZmFjZUxpc3RlbmVyCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDcmVhdGVkKFZpZXcgdmlldywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAib25TdXJmYWNlQ3JlYXRlZCgpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCisgICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUgKyAiLCB3aWR0aC9oZWlnaHQ6ICIgKyB3aWR0aCArICIvIiArIGhlaWdodAorICAgICAgICAgICAgICAgICAgICArICIsICIgKyB2aWV3LnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChuZWVkVG9TdGFydCgpKSB7CisgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkucGxheSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdXJmYWNlRGVzdHJveWVkKFZpZXcgdmlldykgeworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIm9uU3VyZmFjZURlc3Ryb3llZCgpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCisgICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUgKyAiLCAiICsgdmlldy50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNoYW5nZWQoVmlldyB2aWV3LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgLy8gVE9ETzogRG8gd2UgbmVlZCB0byBjYWxsIHJlcXVlc3RMYXlvdXQgaGVyZT8KKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJvblN1cmZhY2VDaGFuZ2VkKCkuIHdpZHRoL2hlaWdodDogIiArIHdpZHRoICsgIi8iICsgaGVpZ2h0CisgICAgICAgICAgICAgICAgICAgICsgIiwgIiArIHZpZXcudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VUYWtlT3ZlckRvbmUoVmlkZW9WaWV3SW50ZXJmYWNlIHZpZXcpIHsKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJvblN1cmZhY2VUYWtlT3ZlckRvbmUoKS4gTm93IGN1cnJlbnQgdmlldyBpczogIiArIHZpZXcpOworICAgICAgICB9CisgICAgICAgIG1DdXJyZW50VmlldyA9IHZpZXc7CisgICAgICAgIGlmIChtVmlld1R5cGVDaGFuZ2VkTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyLm9uVmlld1R5cGVDaGFuZ2VkKG1JbnN0YW5jZSwgdmlldy5nZXRWaWV3VHlwZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmVlZFRvU3RhcnQoKSkgeworICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnBsYXkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFByb3RlY3RlZCBvciBwcml2YXRlIG1ldGhvZHMKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIHByaXZhdGUgdm9pZCBhdHRhY2hNZWRpYUNvbnRyb2xWaWV3KCkgeworICAgICAgICAvLyBHZXQgTWVkaWFDb250cm9sbGVyIGZyb20gTWVkaWFTZXNzaW9uIGFuZCBzZXQgaXQgaW5zaWRlIE1lZGlhQ29udHJvbFZpZXcKKyAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcuc2V0Q29udHJvbGxlcihtTWVkaWFTZXNzaW9uLmdldENvbnRyb2xsZXIoKSk7CisKKyAgICAgICAgTGF5b3V0UGFyYW1zIHBhcmFtcyA9CisgICAgICAgICAgICAgICAgbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULCBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKKyAgICAgICAgbUluc3RhbmNlLmFkZFZpZXcobU1lZGlhQ29udHJvbFZpZXcsIHBhcmFtcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzSW5QbGF5YmFja1N0YXRlKCkgeworICAgICAgICByZXR1cm4gKG1NZWRpYVBsYXllciAhPSBudWxsIHx8IG1Sb3V0ZVBsYXllciAhPSBudWxsKQorICAgICAgICAgICAgICAgICYmIG1DdXJyZW50U3RhdGUgIT0gU1RBVEVfRVJST1IKKyAgICAgICAgICAgICAgICAmJiBtQ3VycmVudFN0YXRlICE9IFNUQVRFX0lETEUKKyAgICAgICAgICAgICAgICAmJiBtQ3VycmVudFN0YXRlICE9IFNUQVRFX1BSRVBBUklORzsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbmVlZFRvU3RhcnQoKSB7CisgICAgICAgIHJldHVybiAobU1lZGlhUGxheWVyICE9IG51bGwgfHwgbVJvdXRlUGxheWVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgJiYgbUN1cnJlbnRTdGF0ZSAhPSBTVEFURV9QTEFZSU5HCisgICAgICAgICAgICAgICAgJiYgbVRhcmdldFN0YXRlID09IFNUQVRFX1BMQVlJTkc7CisgICAgfQorCisgICAgLy8gQ3JlYXRlcyBhIE1lZGlhUGxheWVyMiBpbnN0YW5jZSBhbmQgcHJlcGFyZSBwbGF5YmFjay4KKyAgICBwcml2YXRlIHZvaWQgb3BlblZpZGVvKERhdGFTb3VyY2VEZXNjIGRzZCkgeworICAgICAgICBVcmkgdXJpID0gZHNkLmdldFVyaSgpOworICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMgPSBkc2QuZ2V0VXJpSGVhZGVycygpOworICAgICAgICByZXNldFBsYXllcigpOworICAgICAgICBpZiAoaXNSZW1vdGVQbGF5YmFjaygpKSB7CisgICAgICAgICAgICBtUm91dGVQbGF5ZXIub3BlblZpZGVvKGRzZCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1BdWRpb0ZvY3VzVHlwZSAhPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19OT05FKSB7CisgICAgICAgICAgICAvLyBUT0RPIHRoaXMgc2hvdWxkIGhhdmUgYSBmb2N1cyBsaXN0ZW5lcgorICAgICAgICAgICAgQXVkaW9Gb2N1c1JlcXVlc3QgZm9jdXNSZXF1ZXN0OworICAgICAgICAgICAgZm9jdXNSZXF1ZXN0ID0gbmV3IEF1ZGlvRm9jdXNSZXF1ZXN0LkJ1aWxkZXIobUF1ZGlvRm9jdXNUeXBlKQorICAgICAgICAgICAgICAgICAgICAuc2V0QXVkaW9BdHRyaWJ1dGVzKG1BdWRpb0F0dHJpYnV0ZXMpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5yZXF1ZXN0QXVkaW9Gb2N1cyhmb2N1c1JlcXVlc3QpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIm9wZW5WaWRlbygpOiBjcmVhdGluZyBuZXcgTWVkaWFQbGF5ZXIyIGluc3RhbmNlLiIpOworICAgICAgICAgICAgbU1lZGlhUGxheWVyID0gbmV3IE1lZGlhUGxheWVyMkltcGwoKTsKKyAgICAgICAgICAgIG1TdXJmYWNlVmlldy5zZXRNZWRpYVBsYXllcihtTWVkaWFQbGF5ZXIpOworICAgICAgICAgICAgbVRleHR1cmVWaWV3LnNldE1lZGlhUGxheWVyKG1NZWRpYVBsYXllcik7CisgICAgICAgICAgICBtQ3VycmVudFZpZXcuYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIobU1lZGlhUGxheWVyKTsKKworICAgICAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gbUluc3RhbmNlLmdldENvbnRleHQoKTsKKyAgICAgICAgICAgIC8vIFRPRE86IEFkZCB0aW1lbHkgZmlyaW5nIGxvZ2ljIGZvciBtb3JlIGFjY3VyYXRlIHN5bmMgYmV0d2VlbiBDQyBhbmQgdmlkZW8gZnJhbWUKKyAgICAgICAgICAgIG1TdWJ0aXRsZUNvbnRyb2xsZXIgPSBuZXcgU3VidGl0bGVDb250cm9sbGVyKGNvbnRleHQpOworICAgICAgICAgICAgbVN1YnRpdGxlQ29udHJvbGxlci5yZWdpc3RlclJlbmRlcmVyKG5ldyBDbG9zZWRDYXB0aW9uUmVuZGVyZXIoY29udGV4dCkpOworICAgICAgICAgICAgbVN1YnRpdGxlQ29udHJvbGxlci5zZXRBbmNob3IoKFN1YnRpdGxlQ29udHJvbGxlci5BbmNob3IpIG1TdWJ0aXRsZVZpZXcpOworICAgICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IgPSBuZXcgRXhlY3V0b3IoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShSdW5uYWJsZSBydW5uYWJsZSkgeworICAgICAgICAgICAgICAgICAgICBydW5uYWJsZS5ydW4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNldE1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2soZXhlY3V0b3IsIG1NZWRpYVBsYXllcjJDYWxsYmFjayk7CisKKyAgICAgICAgICAgIG1DdXJyZW50QnVmZmVyUGVyY2VudGFnZSA9IC0xOworICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNldERhdGFTb3VyY2UoZHNkKTsKKyAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZXRBdWRpb0F0dHJpYnV0ZXMobUF1ZGlvQXR0cmlidXRlcyk7CisgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0T25TdWJ0aXRsZURhdGFMaXN0ZW5lcihtU3VidGl0bGVMaXN0ZW5lcik7CisgICAgICAgICAgICAvLyB3ZSBkb24ndCBzZXQgdGhlIHRhcmdldCBzdGF0ZSBoZXJlIGVpdGhlciwgYnV0IHByZXNlcnZlIHRoZQorICAgICAgICAgICAgLy8gdGFyZ2V0IHN0YXRlIHRoYXQgd2FzIHRoZXJlIGJlZm9yZS4KKyAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QUkVQQVJJTkc7CisgICAgICAgICAgICBtTWVkaWFQbGF5ZXIucHJlcGFyZSgpOworCisgICAgICAgICAgICAvLyBTYXZlIGZpbGUgbmFtZSBhcyB0aXRsZSBzaW5jZSB0aGUgZmlsZSBtYXkgbm90IGhhdmUgYSB0aXRsZSBNZXRhZGF0YS4KKyAgICAgICAgICAgIG1UaXRsZSA9IHVyaS5nZXRQYXRoKCk7CisgICAgICAgICAgICBTdHJpbmcgc2NoZW1lID0gdXJpLmdldFNjaGVtZSgpOworICAgICAgICAgICAgaWYgKHNjaGVtZSAhPSBudWxsICYmIHNjaGVtZS5lcXVhbHMoImZpbGUiKSkgeworICAgICAgICAgICAgICAgIG1UaXRsZSA9IHVyaS5nZXRMYXN0UGF0aFNlZ21lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SZXRyaWV2ZXIgPSBuZXcgTWVkaWFNZXRhZGF0YVJldHJpZXZlcigpOworICAgICAgICAgICAgbVJldHJpZXZlci5zZXREYXRhU291cmNlKG1JbnN0YW5jZS5nZXRDb250ZXh0KCksIHVyaSk7CisKKyAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9wZW5WaWRlbygpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJVbmFibGUgdG8gb3BlbiBjb250ZW50OiAiICsgdXJpLCBleCk7CisgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfRVJST1I7CisgICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9FUlJPUjsKKyAgICAgICAgICAgIG1NZWRpYVBsYXllcjJDYWxsYmFjay5vbkVycm9yKG1NZWRpYVBsYXllciwgZHNkLAorICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllcjIuTUVESUFfRVJST1JfVU5LTk9XTiwgTWVkaWFQbGF5ZXIyLk1FRElBX0VSUk9SX0lPKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogUmVzZXQgdGhlIG1lZGlhIHBsYXllciBpbiBhbnkgc3RhdGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVzZXRQbGF5ZXIoKSB7CisgICAgICAgIGlmIChtTWVkaWFQbGF5ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXIyIHBsYXllciA9IG1NZWRpYVBsYXllcjsKKyAgICAgICAgICAgIG5ldyBBc3luY1Rhc2s8TWVkaWFQbGF5ZXIyLCBWb2lkLCBWb2lkPigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgVm9pZCBkb0luQmFja2dyb3VuZChNZWRpYVBsYXllcjIuLi4gcGxheWVycykgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBGaXggTlBFIHdoaWxlIE1lZGlhUGxheWVyMi5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgIC8vcGxheWVyc1swXS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LmV4ZWN1dGVPbkV4ZWN1dG9yKEFzeW5jVGFzay5TRVJJQUxfRVhFQ1VUT1IsIHBsYXllcik7CisgICAgICAgICAgICBtTWVkaWFQbGF5ZXIgPSBudWxsOworICAgICAgICAgICAgbVRleHR1cmVWaWV3LnNldE1lZGlhUGxheWVyKG51bGwpOworICAgICAgICAgICAgbVN1cmZhY2VWaWV3LnNldE1lZGlhUGxheWVyKG51bGwpOworICAgICAgICAgICAgLy9tUGVuZGluZ1N1YnRpdGxlVHJhY2tzLmNsZWFyKCk7CisgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfSURMRTsKKyAgICAgICAgICAgIG1UYXJnZXRTdGF0ZSA9IFNUQVRFX0lETEU7CisgICAgICAgICAgICBpZiAobUF1ZGlvRm9jdXNUeXBlICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX05PTkUpIHsKKyAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmFiYW5kb25BdWRpb0ZvY3VzKG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1WaWRlb1dpZHRoID0gMDsKKyAgICAgICAgbVZpZGVvSGVpZ2h0ID0gMDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlUGxheWJhY2tTdGF0ZSgpIHsKKyAgICAgICAgaWYgKG1TdGF0ZUJ1aWxkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gR2V0IHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIHBsYXllciBmb3IgdGhpcyBzdHJlYW0KKyAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1NZWRpYVBsYXllci5nZXRNZXRhZGF0YShNZWRpYVBsYXllcjIuTUVUQURBVEFfQUxMLAorICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllcjIuQllQQVNTX01FVEFEQVRBX0ZJTFRFUik7CisKKyAgICAgICAgICAgIC8vIEFkZCBQbGF5IGFjdGlvbiBhcyBkZWZhdWx0CisgICAgICAgICAgICBsb25nIHBsYXliYWNrQWN0aW9ucyA9IFBsYXliYWNrU3RhdGUuQUNUSU9OX1BMQVk7CisgICAgICAgICAgICBpZiAobU1ldGFkYXRhICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1NZXRhZGF0YS5oYXMoTWV0YWRhdGEuUEFVU0VfQVZBSUxBQkxFKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgbU1ldGFkYXRhLmdldEJvb2xlYW4oTWV0YWRhdGEuUEFVU0VfQVZBSUxBQkxFKSkgeworICAgICAgICAgICAgICAgICAgICBwbGF5YmFja0FjdGlvbnMgfD0gUGxheWJhY2tTdGF0ZS5BQ1RJT05fUEFVU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghbU1ldGFkYXRhLmhhcyhNZXRhZGF0YS5TRUVLX0JBQ0tXQVJEX0FWQUlMQUJMRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1NZXRhZGF0YS5nZXRCb29sZWFuKE1ldGFkYXRhLlNFRUtfQkFDS1dBUkRfQVZBSUxBQkxFKSkgeworICAgICAgICAgICAgICAgICAgICBwbGF5YmFja0FjdGlvbnMgfD0gUGxheWJhY2tTdGF0ZS5BQ1RJT05fUkVXSU5EOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW1NZXRhZGF0YS5oYXMoTWV0YWRhdGEuU0VFS19GT1JXQVJEX0FWQUlMQUJMRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1NZXRhZGF0YS5nZXRCb29sZWFuKE1ldGFkYXRhLlNFRUtfRk9SV0FSRF9BVkFJTEFCTEUpKSB7CisgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrQWN0aW9ucyB8PSBQbGF5YmFja1N0YXRlLkFDVElPTl9GQVNUX0ZPUldBUkQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghbU1ldGFkYXRhLmhhcyhNZXRhZGF0YS5TRUVLX0FWQUlMQUJMRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1NZXRhZGF0YS5nZXRCb29sZWFuKE1ldGFkYXRhLlNFRUtfQVZBSUxBQkxFKSkgeworICAgICAgICAgICAgICAgICAgICBwbGF5YmFja0FjdGlvbnMgfD0gUGxheWJhY2tTdGF0ZS5BQ1RJT05fU0VFS19UTzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBsYXliYWNrQWN0aW9ucyB8PSAoUGxheWJhY2tTdGF0ZS5BQ1RJT05fUEFVU0UgfAorICAgICAgICAgICAgICAgICAgICAgICAgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUkVXSU5EIHwgUGxheWJhY2tTdGF0ZS5BQ1RJT05fRkFTVF9GT1JXQVJEIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrU3RhdGUuQUNUSU9OX1NFRUtfVE8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVN0YXRlQnVpbGRlciA9IG5ldyBQbGF5YmFja1N0YXRlLkJ1aWxkZXIoKTsKKyAgICAgICAgICAgIG1TdGF0ZUJ1aWxkZXIuc2V0QWN0aW9ucyhwbGF5YmFja0FjdGlvbnMpOworCisgICAgICAgICAgICBpZiAobUN1c3RvbUFjdGlvbkxpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoUGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24gYWN0aW9uIDogbUN1c3RvbUFjdGlvbkxpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRlQnVpbGRlci5hZGRDdXN0b21BY3Rpb24oYWN0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVN0YXRlQnVpbGRlci5zZXRTdGF0ZShnZXRDb3JyZXNwb25kaW5nUGxheWJhY2tTdGF0ZSgpLAorICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5nZXRDdXJyZW50UG9zaXRpb24oKSwgbVNwZWVkKTsKKyAgICAgICAgaWYgKG1DdXJyZW50U3RhdGUgIT0gU1RBVEVfRVJST1IKKyAgICAgICAgICAgICYmIG1DdXJyZW50U3RhdGUgIT0gU1RBVEVfSURMRQorICAgICAgICAgICAgJiYgbUN1cnJlbnRTdGF0ZSAhPSBTVEFURV9QUkVQQVJJTkcpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggTWVkaWFQbGF5ZXIyLmdldEJ1ZmZlcmVkUG9zaXRpb24oKSBvbmNlIGl0IGlzCisgICAgICAgICAgICAvLyBpbXBsZW1lbnRlZC4KKyAgICAgICAgICAgIGlmIChtQ3VycmVudEJ1ZmZlclBlcmNlbnRhZ2UgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBtU3RhdGVCdWlsZGVyLnNldEJ1ZmZlcmVkUG9zaXRpb24oLTEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtU3RhdGVCdWlsZGVyLnNldEJ1ZmZlcmVkUG9zaXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgKG1DdXJyZW50QnVmZmVyUGVyY2VudGFnZSAvIDEwMC4wICogbU1lZGlhUGxheWVyLmdldER1cmF0aW9uKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldCBQbGF5YmFja1N0YXRlIGZvciBNZWRpYVNlc3Npb24KKyAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgUGxheWJhY2tTdGF0ZSBzdGF0ZSA9IG1TdGF0ZUJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uc2V0UGxheWJhY2tTdGF0ZShzdGF0ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRDb3JyZXNwb25kaW5nUGxheWJhY2tTdGF0ZSgpIHsKKyAgICAgICAgc3dpdGNoIChtQ3VycmVudFN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIFNUQVRFX0VSUk9SOgorICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX0VSUk9SOworICAgICAgICAgICAgY2FzZSBTVEFURV9JRExFOgorICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX05PTkU7CisgICAgICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9DT05ORUNUSU5HOworICAgICAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9QQVVTRUQ7CisgICAgICAgICAgICBjYXNlIFNUQVRFX1BMQVlJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIFBsYXliYWNrU3RhdGUuU1RBVEVfUExBWUlORzsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgorICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX1BBVVNFRDsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfUExBWUJBQ0tfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX1NUT1BQRUQ7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgUnVubmFibGUgbUZhZGVPdXQgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBpZiAobUN1cnJlbnRTdGF0ZSA9PSBTVEFURV9QTEFZSU5HKSB7CisgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgdm9pZCBzaG93Q29udHJvbGxlcigpIHsKKyAgICAgICAgLy8gVE9ETzogRGVjaWRlIHdoYXQgdG8gc2hvdyB3aGVuIHRoZSBzdGF0ZSBpcyBub3QgaW4gcGxheWJhY2sgc3RhdGUKKyAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xWaWV3ID09IG51bGwgfHwgIWlzSW5QbGF5YmFja1N0YXRlKCkKKyAgICAgICAgICAgICAgICB8fCAobUlzTXVzaWNNZWRpYVR5cGUgJiYgbVNpemVUeXBlID09IFNJWkVfVFlQRV9GVUxMKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnJlbW92ZUNhbGxiYWNrcyhtRmFkZU91dCk7CisgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgaWYgKG1TaG93Q29udHJvbGxlckludGVydmFsTXMgIT0gMAorICAgICAgICAgICAgJiYgIW1BY2Nlc3NpYmlsaXR5TWFuYWdlci5pc1RvdWNoRXhwbG9yYXRpb25FbmFibGVkKCkpIHsKKyAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnBvc3REZWxheWVkKG1GYWRlT3V0LCBtU2hvd0NvbnRyb2xsZXJJbnRlcnZhbE1zKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0b2dnbGVNZWRpYUNvbnRyb2xWaWV3VmlzaWJpbGl0eSgpIHsKKyAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xWaWV3LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKKyAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnJlbW92ZUNhbGxiYWNrcyhtRmFkZU91dCk7CisgICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaG93Q29udHJvbGxlcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFwcGx5U3BlZWQoKSB7CisgICAgICAgIFBsYXliYWNrUGFyYW1zIHBhcmFtcyA9IG1NZWRpYVBsYXllci5nZXRQbGF5YmFja1BhcmFtcygpLmFsbG93RGVmYXVsdHMoKTsKKyAgICAgICAgaWYgKG1TcGVlZCAhPSBwYXJhbXMuZ2V0U3BlZWQoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwYXJhbXMuc2V0U3BlZWQobVNwZWVkKTsKKyAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0UGxheWJhY2tQYXJhbXMocGFyYW1zKTsKKyAgICAgICAgICAgICAgICBtRmFsbGJhY2tTcGVlZCA9IG1TcGVlZDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiUGxheWJhY2tQYXJhbXMgaGFzIHVuc3VwcG9ydGVkIHZhbHVlOiAiICsgZSk7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHJldmlzZSB0aGlzIHBhcnQgYWZ0ZXIgaW50ZWdyYXRpbmcgd2l0aCBNUDIuCisgICAgICAgICAgICAgICAgLy8gSWYgbVNwZWVkIGhhZCBhbiBpbGxlZ2FsIHZhbHVlIGZvciBzcGVlZCByYXRlLCBzeXN0ZW0gd2lsbCBkZXRlcm1pbmUgYmVzdAorICAgICAgICAgICAgICAgIC8vIGhhbmRsaW5nIChzZWUgUGxheWJhY2tQYXJhbXMuQVVESU9fRkFMTEJBQ0tfTU9ERV9ERUZBVUxUKS4KKyAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgcHJlLU1QMiByZXR1cm5zIDAuMGYgd2hlbiBpdCBpcyBwYXVzZWQuIEluIHRoaXMgY2FzZSwgVmlkZW9WaWV3MiB3aWxsCisgICAgICAgICAgICAgICAgLy8gdXNlIG1GYWxsYmFja1NwZWVkIGluc3RlYWQuCisgICAgICAgICAgICAgICAgZmxvYXQgZmFsbGJhY2tTcGVlZCA9IG1NZWRpYVBsYXllci5nZXRQbGF5YmFja1BhcmFtcygpLmFsbG93RGVmYXVsdHMoKS5nZXRTcGVlZCgpOworICAgICAgICAgICAgICAgIGlmIChmYWxsYmFja1NwZWVkID4gMC4wZikgeworICAgICAgICAgICAgICAgICAgICBtRmFsbGJhY2tTcGVlZCA9IGZhbGxiYWNrU3BlZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1TcGVlZCA9IG1GYWxsYmFja1NwZWVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzUmVtb3RlUGxheWJhY2soKSB7CisgICAgICAgIGlmIChtTWVkaWFDb250cm9sbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBQbGF5YmFja0luZm8gcGxheWJhY2tJbmZvID0gbU1lZGlhQ29udHJvbGxlci5nZXRQbGF5YmFja0luZm8oKTsKKyAgICAgICAgcmV0dXJuIHBsYXliYWNrSW5mbyAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgcGxheWJhY2tJbmZvLmdldFBsYXliYWNrVHlwZSgpID09IFBsYXliYWNrSW5mby5QTEFZQkFDS19UWVBFX1JFTU9URTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VsZWN0T3JEZXNlbGVjdFN1YnRpdGxlKGJvb2xlYW4gc2VsZWN0KSB7CisgICAgICAgIGlmICghaXNJblBsYXliYWNrU3RhdGUoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChzZWxlY3QpIHsKKyAgICAgICAgICAgIGlmIChtU3VidGl0bGVUcmFja0luZGljZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IG1ha2UgdGhpcyBzZWxlY3Rpb24gZHluYW1pYworICAgICAgICAgICAgICAgIG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCA9IG1TdWJ0aXRsZVRyYWNrSW5kaWNlcy5nZXQoMCkuZmlyc3Q7CisgICAgICAgICAgICAgICAgbVN1YnRpdGxlQ29udHJvbGxlci5zZWxlY3RUcmFjayhtU3VidGl0bGVUcmFja0luZGljZXMuZ2V0KDApLnNlY29uZCk7CisgICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNlbGVjdFRyYWNrKG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCk7CisgICAgICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4ICE9IElOVkFMSURfVFJBQ0tfSU5ERVgpIHsKKyAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuZGVzZWxlY3RUcmFjayhtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpOworICAgICAgICAgICAgICAgIG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCA9IElOVkFMSURfVFJBQ0tfSU5ERVg7CisgICAgICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZXh0cmFjdFRyYWNrcygpIHsKKyAgICAgICAgTGlzdDxNZWRpYVBsYXllcjIuVHJhY2tJbmZvPiB0cmFja0luZm9zID0gbU1lZGlhUGxheWVyLmdldFRyYWNrSW5mbygpOworICAgICAgICBtVmlkZW9UcmFja0luZGljZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgbUF1ZGlvVHJhY2tJbmRpY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIG1TdWJ0aXRsZVRyYWNrSW5kaWNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBtU3VidGl0bGVDb250cm9sbGVyLnJlc2V0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHJhY2tJbmZvcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaW50IHRyYWNrVHlwZSA9IHRyYWNrSW5mb3MuZ2V0KGkpLmdldFRyYWNrVHlwZSgpOworICAgICAgICAgICAgaWYgKHRyYWNrVHlwZSA9PSBNZWRpYVBsYXllcjIuVHJhY2tJbmZvLk1FRElBX1RSQUNLX1RZUEVfVklERU8pIHsKKyAgICAgICAgICAgICAgICBtVmlkZW9UcmFja0luZGljZXMuYWRkKGkpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0cmFja1R5cGUgPT0gTWVkaWFQbGF5ZXIyLlRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX0FVRElPKSB7CisgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tJbmRpY2VzLmFkZChpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhY2tUeXBlID09IE1lZGlhUGxheWVyMi5UcmFja0luZm8uTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRQorICAgICAgICAgICAgICAgICAgICB8fCB0cmFja1R5cGUgPT0gTWVkaWFQbGF5ZXIyLlRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVCkgeworICAgICAgICAgICAgICAgIFN1YnRpdGxlVHJhY2sgdHJhY2sgPSBtU3VidGl0bGVDb250cm9sbGVyLmFkZFRyYWNrKHRyYWNrSW5mb3MuZ2V0KGkpLmdldEZvcm1hdCgpKTsKKyAgICAgICAgICAgICAgICBpZiAodHJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVUcmFja0luZGljZXMuYWRkKG5ldyBQYWlyPD4oaSwgdHJhY2spKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gU2VsZWN0IGZpcnN0IHRyYWNrcyBhcyBkZWZhdWx0CisgICAgICAgIGlmIChtVmlkZW9UcmFja0luZGljZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgbVNlbGVjdGVkVmlkZW9UcmFja0luZGV4ID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAobUF1ZGlvVHJhY2tJbmRpY2VzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1WaWRlb1RyYWNrSW5kaWNlcy5zaXplKCkgPT0gMCAmJiBtQXVkaW9UcmFja0luZGljZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgbUlzTXVzaWNNZWRpYVR5cGUgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQnVuZGxlIGRhdGEgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgIGRhdGEucHV0SW50KE1lZGlhQ29udHJvbFZpZXcySW1wbC5LRVlfVklERU9fVFJBQ0tfQ09VTlQsIG1WaWRlb1RyYWNrSW5kaWNlcy5zaXplKCkpOworICAgICAgICBkYXRhLnB1dEludChNZWRpYUNvbnRyb2xWaWV3MkltcGwuS0VZX0FVRElPX1RSQUNLX0NPVU5ULCBtQXVkaW9UcmFja0luZGljZXMuc2l6ZSgpKTsKKyAgICAgICAgZGF0YS5wdXRJbnQoTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9TVUJUSVRMRV9UUkFDS19DT1VOVCwgbVN1YnRpdGxlVHJhY2tJbmRpY2VzLnNpemUoKSk7CisgICAgICAgIGlmIChtU3VidGl0bGVUcmFja0luZGljZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgc2VsZWN0T3JEZXNlbGVjdFN1YnRpdGxlKG1TdWJ0aXRsZUVuYWJsZWQpOworICAgICAgICB9CisgICAgICAgIG1NZWRpYVNlc3Npb24uc2VuZFNlc3Npb25FdmVudChNZWRpYUNvbnRyb2xWaWV3MkltcGwuRVZFTlRfVVBEQVRFX1RSQUNLX1NUQVRVUywgZGF0YSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4dHJhY3RNZXRhZGF0YSgpIHsKKyAgICAgICAgLy8gR2V0IGFuZCBzZXQgZHVyYXRpb24gYW5kIHRpdGxlIHZhbHVlcyBhcyBNZWRpYU1ldGFkYXRhIGZvciBNZWRpYUNvbnRyb2xWaWV3MgorICAgICAgICBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIoKTsKKyAgICAgICAgaWYgKG1NZXRhZGF0YSAhPSBudWxsICYmIG1NZXRhZGF0YS5oYXMoTWV0YWRhdGEuVElUTEUpKSB7CisgICAgICAgICAgICBtVGl0bGUgPSBtTWV0YWRhdGEuZ2V0U3RyaW5nKE1ldGFkYXRhLlRJVExFKTsKKyAgICAgICAgfQorICAgICAgICBidWlsZGVyLnB1dFN0cmluZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9USVRMRSwgbVRpdGxlKTsKKyAgICAgICAgYnVpbGRlci5wdXRMb25nKAorICAgICAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0RVUkFUSU9OLCBtTWVkaWFQbGF5ZXIuZ2V0RHVyYXRpb24oKSk7CisKKyAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRNZXRhZGF0YShidWlsZGVyLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4dHJhY3RBdWRpb01ldGFkYXRhKCkgeworICAgICAgICBpZiAoIW1Jc011c2ljTWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtUmVzb3VyY2VzID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgbU1hbmFnZXIgPSAoV2luZG93TWFuYWdlcikgbUluc3RhbmNlLmdldENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKQorICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpOworCisgICAgICAgIGJ5dGVbXSBhbGJ1bSA9IG1SZXRyaWV2ZXIuZ2V0RW1iZWRkZWRQaWN0dXJlKCk7CisgICAgICAgIGlmIChhbGJ1bSAhPSBudWxsKSB7CisgICAgICAgICAgICBCaXRtYXAgYml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVCeXRlQXJyYXkoYWxidW0sIDAsIGFsYnVtLmxlbmd0aCk7CisgICAgICAgICAgICBtTXVzaWNBbGJ1bURyYXdhYmxlID0gbmV3IEJpdG1hcERyYXdhYmxlKGJpdG1hcCk7CisKKyAgICAgICAgICAgIC8vIFRPRE86IHJlcGxhY2Ugd2l0aCB2aXN1YWxpemVyCisgICAgICAgICAgICBQYWxldHRlLmdlbmVyYXRlQXN5bmMoYml0bWFwLCBuZXcgUGFsZXR0ZS5QYWxldHRlQXN5bmNMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkdlbmVyYXRlZChQYWxldHRlIHBhbGV0dGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogYWRkIGRvbWluYW50IGNvbG9yIGZvciBkZWZhdWx0IGFsYnVtIGltYWdlLgorICAgICAgICAgICAgICAgICAgICBtRG9taW5hbnRDb2xvciA9IHBhbGV0dGUuZ2V0RG9taW5hbnRDb2xvcigwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1NdXNpY1ZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbU11c2ljVmlldy5zZXRCYWNrZ3JvdW5kQ29sb3IobURvbWluYW50Q29sb3IpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTXVzaWNBbGJ1bURyYXdhYmxlID0gbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2RlZmF1bHRfYWxidW1faW1hZ2UpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHRpdGxlID0gbVJldHJpZXZlci5leHRyYWN0TWV0YWRhdGEoTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfVElUTEUpOworICAgICAgICBpZiAodGl0bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbU11c2ljVGl0bGVUZXh0ID0gdGl0bGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTXVzaWNUaXRsZVRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX211c2ljX3RpdGxlX3Vua25vd25fdGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgYXJ0aXN0ID0gbVJldHJpZXZlci5leHRyYWN0TWV0YWRhdGEoTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfQVJUSVNUKTsKKyAgICAgICAgaWYgKGFydGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBtTXVzaWNBcnRpc3RUZXh0ID0gYXJ0aXN0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU11c2ljQXJ0aXN0VGV4dCA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfbXVzaWNfYXJ0aXN0X3Vua25vd25fdGV4dCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZW5kIHRpdGxlIGFuZCBhcnRpc3Qgc3RyaW5nIHRvIE1lZGlhQ29udHJvbFZpZXcyCisgICAgICAgIE1lZGlhTWV0YWRhdGEuQnVpbGRlciBidWlsZGVyID0gbmV3IE1lZGlhTWV0YWRhdGEuQnVpbGRlcigpOworICAgICAgICBidWlsZGVyLnB1dFN0cmluZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9USVRMRSwgbU11c2ljVGl0bGVUZXh0KTsKKyAgICAgICAgYnVpbGRlci5wdXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfQVJUSVNULCBtTXVzaWNBcnRpc3RUZXh0KTsKKyAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRNZXRhZGF0YShidWlsZGVyLmJ1aWxkKCkpOworCisgICAgICAgIC8vIERpc3BsYXkgRW1iZWRkZWQgbW9kZSBhcyBkZWZhdWx0CisgICAgICAgIG1JbnN0YW5jZS5yZW1vdmVWaWV3KG1TdXJmYWNlVmlldyk7CisgICAgICAgIG1JbnN0YW5jZS5yZW1vdmVWaWV3KG1UZXh0dXJlVmlldyk7CisgICAgICAgIGluZmxhdGVNdXNpY1ZpZXcoUi5sYXlvdXQuZW1iZWRkZWRfbXVzaWMpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IHJldHJpZXZlT3JpZW50YXRpb24oKSB7CisgICAgICAgIERpc3BsYXlNZXRyaWNzIGRtID0gUmVzb3VyY2VzLmdldFN5c3RlbSgpLmdldERpc3BsYXlNZXRyaWNzKCk7CisgICAgICAgIGludCB3aWR0aCA9IGRtLndpZHRoUGl4ZWxzOworICAgICAgICBpbnQgaGVpZ2h0ID0gZG0uaGVpZ2h0UGl4ZWxzOworCisgICAgICAgIHJldHVybiAoaGVpZ2h0ID4gd2lkdGgpID8KKyAgICAgICAgICAgICAgICBBY3Rpdml0eUluZm8uU0NSRUVOX09SSUVOVEFUSU9OX1BPUlRSQUlUIDoKKyAgICAgICAgICAgICAgICBBY3Rpdml0eUluZm8uU0NSRUVOX09SSUVOVEFUSU9OX0xBTkRTQ0FQRTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5mbGF0ZU11c2ljVmlldyhpbnQgbGF5b3V0SWQpIHsKKyAgICAgICAgbUluc3RhbmNlLnJlbW92ZVZpZXcobU11c2ljVmlldyk7CisKKyAgICAgICAgVmlldyB2ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwgbGF5b3V0SWQpOworICAgICAgICB2LnNldEJhY2tncm91bmRDb2xvcihtRG9taW5hbnRDb2xvcik7CisKKyAgICAgICAgSW1hZ2VWaWV3IGFsYnVtVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYWxidW0pOworICAgICAgICBpZiAoYWxidW1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFsYnVtVmlldy5zZXRJbWFnZURyYXdhYmxlKG1NdXNpY0FsYnVtRHJhd2FibGUpOworICAgICAgICB9CisKKyAgICAgICAgVGV4dFZpZXcgdGl0bGVWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC50aXRsZSk7CisgICAgICAgIGlmICh0aXRsZVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgdGl0bGVWaWV3LnNldFRleHQobU11c2ljVGl0bGVUZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIFRleHRWaWV3IGFydGlzdFZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmFydGlzdCk7CisgICAgICAgIGlmIChhcnRpc3RWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFydGlzdFZpZXcuc2V0VGV4dChtTXVzaWNBcnRpc3RUZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIG1NdXNpY1ZpZXcgPSB2OworICAgICAgICBtSW5zdGFuY2UuYWRkVmlldyhtTXVzaWNWaWV3LCAwKTsKKyAgICB9CisKKyAgICBPblN1YnRpdGxlRGF0YUxpc3RlbmVyIG1TdWJ0aXRsZUxpc3RlbmVyID0KKyAgICAgICAgICAgIG5ldyBPblN1YnRpdGxlRGF0YUxpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VidGl0bGVEYXRhKE1lZGlhUGxheWVyMiBtcCwgU3VidGl0bGVEYXRhIGRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblN1YnRpdGxlRGF0YSgpOiBnZXRUcmFja0luZGV4OiAiICsgZGF0YS5nZXRUcmFja0luZGV4KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBnZXRDdXJyZW50UG9zaXRpb246ICIgKyBtcC5nZXRDdXJyZW50UG9zaXRpb24oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGdldFN0YXJ0VGltZVVzKCk6ICIgKyBkYXRhLmdldFN0YXJ0VGltZVVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBkaWZmOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKGRhdGEuZ2V0U3RhcnRUaW1lVXMoKS8xMDAwIC0gbXAuZ2V0Q3VycmVudFBvc2l0aW9uKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm1zLCBnZXREdXJhdGlvblVzKCk6ICIgKyBkYXRhLmdldER1cmF0aW9uVXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4ID0gZGF0YS5nZXRUcmFja0luZGV4KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPSBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uU3VidGl0bGVEYXRhKCk6IGdldFRyYWNrSW5kZXg6ICIgKyBkYXRhLmdldFRyYWNrSW5kZXgoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlbGVjdGVkIHRyYWNrIGluZGV4OiAiICsgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IgKFBhaXI8SW50ZWdlciwgU3VidGl0bGVUcmFjaz4gcCA6IG1TdWJ0aXRsZVRyYWNrSW5kaWNlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAuZmlyc3QgPT0gaW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJ0aXRsZVRyYWNrIHRyYWNrID0gcC5zZWNvbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2sub25EYXRhKGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgIE1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sgbU1lZGlhUGxheWVyMkNhbGxiYWNrID0KKyAgICAgICAgICAgIG5ldyBNZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVmlkZW9TaXplQ2hhbmdlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblZpZGVvU2l6ZUNoYW5nZWQoKTogc2l6ZTogIiArIHdpZHRoICsgIi8iICsgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtVmlkZW9XaWR0aCA9IG1wLmdldFZpZGVvV2lkdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgbVZpZGVvSGVpZ2h0ID0gbXAuZ2V0VmlkZW9IZWlnaHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblZpZGVvU2l6ZUNoYW5nZWQoKTogbVZpZGVvU2l6ZToiICsgbVZpZGVvV2lkdGggKyAiLyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtVmlkZW9IZWlnaHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9XaWR0aCAhPSAwICYmIG1WaWRlb0hlaWdodCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UucmVxdWVzdExheW91dCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRpbWVkIHRleHQgcmVsYXRlZCBjb2RlIGxhdGVyIG9uY2UgcmVsZXZhbnQgUmVuZGVyZXIgaXMgZGVmaW5lZC4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGp1c3QgZm9yIGRlYnVnZ2luZyBwdXJwb3NlLgorICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVGltZWRUZXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIFRpbWVkVGV4dCB0ZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJUaW1lZFRleHQ6ICIgKyB0ZXh0LmdldFRleHQoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25JbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LCBpbnQgZXh0cmEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fTUVUQURBVEFfVVBEQVRFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0VHJhY2tzKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuTUVESUFfSU5GT19QUkVQQVJFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vblByZXBhcmVkKG1wLCBkc2QpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fUExBWUJBQ0tfQ09NUExFVEUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25Db21wbGV0aW9uKG1wLCBkc2QpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fQlVGRkVSSU5HX1VQREFURSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkJ1ZmZlcmluZ1VwZGF0ZShtcCwgZHNkLCBleHRyYSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCBmcmFtZXdvcmtFcnIsIGludCBpbXBsRXJyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRXJyb3I6ICIgKyBmcmFtZXdvcmtFcnIgKyAiLCIgKyBpbXBsRXJyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfRVJST1I7CisgICAgICAgICAgICAgICAgICAgIG1UYXJnZXRTdGF0ZSA9IFNUQVRFX0VSUk9SOworICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FsbENvbXBsZXRlZChNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdoYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5DQUxMX0NPTVBMRVRFRF9TRUVLX1RPICYmIHN0YXR1cyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgb25QcmVwYXJlZChNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIk9uUHJlcGFyZWRMaXN0ZW5lcigpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QUkVQQVJFRDsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGFuZCBzZXQgcGxheWJhY2sgc3RhdGUgZm9yIE1lZGlhQ29udHJvbFZpZXcyCisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBjaGFuZ2UgdGhpcyB0byBzZW5kIFRyYWNrSW5mb3MgdG8gTWVkaWFDb250cm9sVmlldzIKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogY3JlYXRlIE1lZGlhU2Vzc2lvbiB3aGVuIGluaXRpYWxpemluZyBWaWRlb1ZpZXcyCisgICAgICAgICAgICAgICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RUcmFja3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RNZXRhZGF0YSgpOworICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEF1ZGlvTWV0YWRhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChtTWVkaWFDb250cm9sVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludCB2aWRlb1dpZHRoID0gbXAuZ2V0VmlkZW9XaWR0aCgpOworICAgICAgICAgICAgICAgICAgICBpbnQgdmlkZW9IZWlnaHQgPSBtcC5nZXRWaWRlb0hlaWdodCgpOworCisgICAgICAgICAgICAgICAgICAgIC8vIG1TZWVrV2hlblByZXBhcmVkIG1heSBiZSBjaGFuZ2VkIGFmdGVyIHNlZWtUbygpIGNhbGwKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBzZWVrVG9Qb3NpdGlvbiA9IG1TZWVrV2hlblByZXBhcmVkOworICAgICAgICAgICAgICAgICAgICBpZiAoc2Vla1RvUG9zaXRpb24gIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnNlZWtUbyhzZWVrVG9Qb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW9XaWR0aCAhPSAwICYmIHZpZGVvSGVpZ2h0ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlb1dpZHRoICE9IG1WaWRlb1dpZHRoIHx8IHZpZGVvSGVpZ2h0ICE9IG1WaWRlb0hlaWdodCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJPblByZXBhcmVkTGlzdGVuZXIoKSA6ICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICIgdmlkZW8gc2l6ZTogIiArIHZpZGVvV2lkdGggKyAiLyIgKyB2aWRlb0hlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIiBtZWFzdXJlZFNpemU6ICIgKyBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRXaWR0aCgpICsgIi8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRIZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIiB2aWV3U2l6ZTogIiArIG1JbnN0YW5jZS5nZXRXaWR0aCgpICsgIi8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtSW5zdGFuY2UuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9XaWR0aCA9IHZpZGVvV2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvSGVpZ2h0ID0gdmlkZW9IZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRUb1N0YXJ0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkucGxheSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB0aGUgdmlkZW8gc2l6ZSB5ZXQsIGJ1dCBzaG91bGQgc3RhcnQgYW55d2F5LgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHZpZGVvIHNpemUgbWlnaHQgYmUgcmVwb3J0ZWQgdG8gdXMgbGF0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmVlZFRvU3RhcnQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5wbGF5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgb25Db21wbGV0aW9uKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkKSB7CisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QTEFZQkFDS19DT01QTEVURUQ7CisgICAgICAgICAgICAgICAgICAgIG1UYXJnZXRTdGF0ZSA9IFNUQVRFX1BMQVlCQUNLX0NPTVBMRVRFRDsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tTdGF0ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvRm9jdXNUeXBlICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuYWJhbmRvbkF1ZGlvRm9jdXMobnVsbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgb25CdWZmZXJpbmdVcGRhdGUoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCBwZXJjZW50KSB7CisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50QnVmZmVyUGVyY2VudGFnZSA9IHBlcmNlbnQ7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgcHJpdmF0ZSBjbGFzcyBNZWRpYVNlc3Npb25DYWxsYmFjayBleHRlbmRzIE1lZGlhU2Vzc2lvbi5DYWxsYmFjayB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbW1hbmQoU3RyaW5nIGNvbW1hbmQsIEJ1bmRsZSBhcmdzLCBSZXN1bHRSZWNlaXZlciByZWNlaXZlcikgeworICAgICAgICAgICAgaWYgKGlzUmVtb3RlUGxheWJhY2soKSkgeworICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5vbkNvbW1hbmQoY29tbWFuZCwgYXJncywgcmVjZWl2ZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9TSE9XX1NVQlRJVExFOgorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1YnRpdGxlSW5kZXggPSBhcmdzLmdldEludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9TRUxFQ1RFRF9TVUJUSVRMRV9JTkRFWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WQUxJRF9UUkFDS19JTkRFWCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VidGl0bGVJbmRleCAhPSBJTlZBTElEX1RSQUNLX0lOREVYKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1YnRpdGxlVHJhY2tJbmRleCA9IG1TdWJ0aXRsZVRyYWNrSW5kaWNlcy5nZXQoc3VidGl0bGVJbmRleCkuZmlyc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnRpdGxlVHJhY2tJbmRleCAhPSBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4ID0gc3VidGl0bGVUcmFja0luZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc2V0U3VidGl0bGVFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX0hJREVfU1VCVElUTEU6CisgICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc2V0U3VidGl0bGVFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX1NFVF9GVUxMU0NSRUVOOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1GdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lci5vbkZ1bGxTY3JlZW5SZXF1ZXN0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5nZXRCb29sZWFuKE1lZGlhQ29udHJvbFZpZXcySW1wbC5BUkdVTUVOVF9LRVlfRlVMTFNDUkVFTikpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfU0VMRUNUX0FVRElPX1RSQUNLOgorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvSW5kZXggPSBhcmdzLmdldEludChNZWRpYUNvbnRyb2xWaWV3MkltcGwuS0VZX1NFTEVDVEVEX0FVRElPX0lOREVYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlZBTElEX1RSQUNLX0lOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdWRpb0luZGV4ICE9IElOVkFMSURfVFJBQ0tfSU5ERVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9UcmFja0luZGV4ID0gbUF1ZGlvVHJhY2tJbmRpY2VzLmdldChhdWRpb0luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9UcmFja0luZGV4ICE9IG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXggPSBhdWRpb1RyYWNrSW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZWxlY3RUcmFjayhtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX1NFVF9QTEFZQkFDS19TUEVFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNwZWVkID0gYXJncy5nZXRGbG9hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9QTEFZQkFDS19TUEVFRCwgSU5WQUxJRF9TUEVFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BlZWQgIT0gSU5WQUxJRF9TUEVFRCAmJiBzcGVlZCAhPSBtU3BlZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc2V0U3BlZWQoc3BlZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TcGVlZCA9IHNwZWVkOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfTVVURToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVMZXZlbCA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMpOworICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQywgMCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9VTk1VVEU6CisgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDLCBtVm9sdW1lTGV2ZWwsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkN1c3RvbUFjdGlvbihTdHJpbmcgYWN0aW9uLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgICAgICBtQ3VzdG9tQWN0aW9uTGlzdGVuZXJSZWNvcmQuZmlyc3QuZXhlY3V0ZSgoKSAtPgorICAgICAgICAgICAgICAgICAgICBtQ3VzdG9tQWN0aW9uTGlzdGVuZXJSZWNvcmQuc2Vjb25kLm9uQ3VzdG9tQWN0aW9uKGFjdGlvbiwgZXh0cmFzKSk7CisgICAgICAgICAgICBzaG93Q29udHJvbGxlcigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheSgpIHsKKyAgICAgICAgICAgIGlmIChpc0luUGxheWJhY2tTdGF0ZSgpICYmIChtQ3VycmVudFZpZXcuaGFzQXZhaWxhYmxlU3VyZmFjZSgpIHx8IG1Jc011c2ljTWVkaWFUeXBlKSkgeworICAgICAgICAgICAgICAgIGlmIChpc1JlbW90ZVBsYXliYWNrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyLm9uUGxheSgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFwcGx5U3BlZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLnBsYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BMQVlJTkc7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BMQVlJTkc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9QTEFZSU5HOworICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25QbGF5KCkuIG1DdXJyZW50U3RhdGU9IiArIG1DdXJyZW50U3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblBhdXNlKCkgeworICAgICAgICAgICAgaWYgKGlzSW5QbGF5YmFja1N0YXRlKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNSZW1vdGVQbGF5YmFjaygpKSB7CisgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5vblBhdXNlKCk7CisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QQVVTRUQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtTWVkaWFQbGF5ZXIuaXNQbGF5aW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLnBhdXNlKCk7CisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QQVVTRUQ7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9QQVVTRUQ7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblBhdXNlKCkuIG1DdXJyZW50U3RhdGU9IiArIG1DdXJyZW50U3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblNlZWtUbyhsb25nIHBvcykgeworICAgICAgICAgICAgaWYgKGlzSW5QbGF5YmFja1N0YXRlKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNSZW1vdGVQbGF5YmFjaygpKSB7CisgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5vblNlZWtUbyhwb3MpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZWVrVG8ocG9zLCBNZWRpYVBsYXllcjIuU0VFS19QUkVWSU9VU19TWU5DKTsKKyAgICAgICAgICAgICAgICAgICAgbVNlZWtXaGVuUHJlcGFyZWQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVNlZWtXaGVuUHJlcGFyZWQgPSBwb3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaG93Q29udHJvbGxlcigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKKyAgICAgICAgICAgIGlmIChpc1JlbW90ZVBsYXliYWNrKCkpIHsKKyAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIub25TdG9wKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlc2V0UGxheWVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaG93Q29udHJvbGxlcigpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3SW50ZXJmYWNlLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1ZpZXdJbnRlcmZhY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTRkNDdlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3SW50ZXJmYWNlLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7CisKK2ltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworaW50ZXJmYWNlIFZpZGVvVmlld0ludGVyZmFjZSB7CisgICAgLyoqCisgICAgICogQXNzaWducyB0aGUgdmlldydzIHN1cmZhY2UgdG8gdGhlIGdpdmVuIE1lZGlhUGxheWVyMiBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtcCBNZWRpYVBsYXllcjIKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN1cmZhY2UgaXMgc3VjY2Vzc2Z1bGx5IGFzc2lnbmVkLCBmYWxzZSBpZiBub3QuIEl0IHdpbGwgZmFpbCB0byBhc3NpZ24KKyAgICAgKiAgICAgICAgIGlmIGFueSBvZiBNZWRpYVBsYXllcjIgb3Igc3VyZmFjZSBpcyB1bmF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKE1lZGlhUGxheWVyMiBtcCk7CisgICAgdm9pZCBzZXRTdXJmYWNlTGlzdGVuZXIoU3VyZmFjZUxpc3RlbmVyIGwpOworICAgIGludCBnZXRWaWV3VHlwZSgpOworICAgIHZvaWQgc2V0TWVkaWFQbGF5ZXIoTWVkaWFQbGF5ZXIyIG1wKTsKKworICAgIC8qKgorICAgICAqIFRha2VzIG92ZXIgb2xkVmlldy4gSXQgbWVhbnMgdGhhdCB0aGUgTWVkaWFQbGF5ZXIyIHdpbGwgc3RhcnQgcmVuZGVyaW5nIG9uIHRoaXMgdmlldy4KKyAgICAgKiBUaGUgdmlzaWJpbGl0eSBvZiBvbGRWaWV3IHdpbGwgYmUgc2V0IGFzIHtAbGluayBWaWV3LkdPTkV9LiBJZiB0aGUgdmlldyBkb2Vzbid0IGhhdmUgYQorICAgICAqIE1lZGlhUGxheWVyMiBpbnN0YW5jZSBvciBpdHMgc3VyZmFjZSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgYWN0dWFsIGV4ZWN1dGlvbiBpcyBkZWZlcnJlZCB1bnRpbAorICAgICAqIGEgTWVkaWFQbGF5ZXIyIGluc3RhbmNlIGlzIHNldCBieSB7QGxpbmsgI3NldE1lZGlhUGxheWVyfSBvciBpdHMgc3VyZmFjZSBiZWNvbWVzIGF2YWlsYWJsZS4KKyAgICAgKiB7QGxpbmsgU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZVRha2VPdmVyRG9uZX0gd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgYWN0dWFsIGV4ZWN1dGlvbiBpcworICAgICAqIGRvbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2xkVmlldyBUaGUgdmlldyB0aGF0IE1lZGlhUGxheWVyMiBpcyBjdXJyZW50bHkgcmVuZGVyaW5nIG9uLgorICAgICAqLworICAgIHZvaWQgdGFrZU92ZXIoQE5vbk51bGwgVmlkZW9WaWV3SW50ZXJmYWNlIG9sZFZpZXcpOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIGlmIHRoZSB2aWV3J3Mgc3VyZmFjZSBpcyBhdmFpbGFibGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN1cmZhY2UgaXMgYXZhaWxhYmxlLgorICAgICAqLworICAgIGJvb2xlYW4gaGFzQXZhaWxhYmxlU3VyZmFjZSgpOworCisgICAgLyoqCisgICAgICogQW4gaW5zdGFuY2Ugb2YgVmlkZW9WaWV3SW50ZXJmYWNlIGNhbGxzIHRoZXNlIHN1cmZhY2Ugbm90aWZpY2F0aW9uIG1ldGhvZHMgYWNjb3JkaW5nbHkgaWYKKyAgICAgKiBhIGxpc3RlbmVyIGhhcyBiZWVuIHJlZ2lzdGVyZWQgdmlhIHtAbGluayAjc2V0U3VyZmFjZUxpc3RlbmVyKFN1cmZhY2VMaXN0ZW5lcil9LgorICAgICAqLworICAgIGludGVyZmFjZSBTdXJmYWNlTGlzdGVuZXIgeworICAgICAgICB2b2lkIG9uU3VyZmFjZUNyZWF0ZWQoVmlldyB2aWV3LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworICAgICAgICB2b2lkIG9uU3VyZmFjZURlc3Ryb3llZChWaWV3IHZpZXcpOworICAgICAgICB2b2lkIG9uU3VyZmFjZUNoYW5nZWQoVmlldyB2aWV3LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworICAgICAgICB2b2lkIG9uU3VyZmFjZVRha2VPdmVyRG9uZShWaWRlb1ZpZXdJbnRlcmZhY2Ugdmlldyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlld0dyb3VwSW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlld0dyb3VwSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMDY4MjYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWV3R3JvdXBJbXBsLmphdmEKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVmlld0dyb3VwUHJvdmlkZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIFZpZXdHcm91cEltcGwgaW1wbGVtZW50cyBWaWV3R3JvdXBQcm92aWRlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBWaWV3R3JvdXBQcm92aWRlciBtU3VwZXJQcm92aWRlcjsKKworICAgIHB1YmxpYyBWaWV3R3JvdXBJbXBsKFZpZXdHcm91cCBpbnN0YW5jZSwKKyAgICAgICAgICAgIFZpZXdHcm91cFByb3ZpZGVyIHN1cGVyUHJvdmlkZXIsIFZpZXdHcm91cFByb3ZpZGVyIHByaXZhdGVQcm92aWRlcikgeworICAgICAgICBtU3VwZXJQcm92aWRlciA9IHN1cGVyUHJvdmlkZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93X2ltcGwoKSB7CisgICAgICAgIG1TdXBlclByb3ZpZGVyLm9uQXR0YWNoZWRUb1dpbmRvd19pbXBsKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3dfaW1wbCgpIHsKKyAgICAgICAgbVN1cGVyUHJvdmlkZXIub25EZXRhY2hlZEZyb21XaW5kb3dfaW1wbCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0QWNjZXNzaWJpbGl0eUNsYXNzTmFtZV9pbXBsKCkgeworICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZ2V0QWNjZXNzaWJpbGl0eUNsYXNzTmFtZV9pbXBsKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50X2ltcGwoTW90aW9uRXZlbnQgZXYpIHsKKyAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLm9uVG91Y2hFdmVudF9pbXBsKGV2KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRyYWNrYmFsbEV2ZW50X2ltcGwoTW90aW9uRXZlbnQgZXYpIHsKKyAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLm9uVHJhY2tiYWxsRXZlbnRfaW1wbChldik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25GaW5pc2hJbmZsYXRlX2ltcGwoKSB7CisgICAgICAgIG1TdXBlclByb3ZpZGVyLm9uRmluaXNoSW5mbGF0ZV9pbXBsKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZF9pbXBsKGJvb2xlYW4gZW5hYmxlZCkgeworICAgICAgICBtU3VwZXJQcm92aWRlci5zZXRFbmFibGVkX2ltcGwoZW5hYmxlZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25WaXNpYmlsaXR5QWdncmVnYXRlZF9pbXBsKGJvb2xlYW4gaXNWaXNpYmxlKSB7CisgICAgICAgIG1TdXBlclByb3ZpZGVyLm9uVmlzaWJpbGl0eUFnZ3JlZ2F0ZWRfaW1wbChpc1Zpc2libGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uTGF5b3V0X2ltcGwoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSB7CisgICAgICAgIG1TdXBlclByb3ZpZGVyLm9uTGF5b3V0X2ltcGwoY2hhbmdlZCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbk1lYXN1cmVfaW1wbChpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7CisgICAgICAgIG1TdXBlclByb3ZpZGVyLm9uTWVhc3VyZV9pbXBsKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFN1Z2dlc3RlZE1pbmltdW1XaWR0aF9pbXBsKCkgeworICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZ2V0U3VnZ2VzdGVkTWluaW11bVdpZHRoX2ltcGwoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFN1Z2dlc3RlZE1pbmltdW1IZWlnaHRfaW1wbCgpIHsKKyAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLmdldFN1Z2dlc3RlZE1pbmltdW1IZWlnaHRfaW1wbCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldE1lYXN1cmVkRGltZW5zaW9uX2ltcGwoaW50IG1lYXN1cmVkV2lkdGgsIGludCBtZWFzdXJlZEhlaWdodCkgeworICAgICAgICBtU3VwZXJQcm92aWRlci5zZXRNZWFzdXJlZERpbWVuc2lvbl9pbXBsKG1lYXN1cmVkV2lkdGgsIG1lYXN1cmVkSGVpZ2h0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaFRvdWNoRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgeworICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZGlzcGF0Y2hUb3VjaEV2ZW50X2ltcGwoZXYpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNoZWNrTGF5b3V0UGFyYW1zX2ltcGwoVmlld0dyb3VwLkxheW91dFBhcmFtcyBwKSB7CisgICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5jaGVja0xheW91dFBhcmFtc19pbXBsKHApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGdlbmVyYXRlRGVmYXVsdExheW91dFBhcmFtc19pbXBsKCkgeworICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zX2ltcGwoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlld0dyb3VwLkxheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtc19pbXBsKEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZ2VuZXJhdGVMYXlvdXRQYXJhbXNfaW1wbChhdHRycyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgZ2VuZXJhdGVMYXlvdXRQYXJhbXNfaW1wbChWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGxwKSB7CisgICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5nZW5lcmF0ZUxheW91dFBhcmFtc19pbXBsKGxwKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGREZWxheUNoaWxkUHJlc3NlZFN0YXRlX2ltcGwoKSB7CisgICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5zaG91bGREZWxheUNoaWxkUHJlc3NlZFN0YXRlX2ltcGwoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBtZWFzdXJlQ2hpbGRXaXRoTWFyZ2luc19pbXBsKFZpZXcgY2hpbGQsCisgICAgICAgIGludCBwYXJlbnRXaWR0aE1lYXN1cmVTcGVjLCBpbnQgd2lkdGhVc2VkLCBpbnQgcGFyZW50SGVpZ2h0TWVhc3VyZVNwZWMsIGludCBoZWlnaHRVc2VkKSB7CisgICAgICAgIG1TdXBlclByb3ZpZGVyLm1lYXN1cmVDaGlsZFdpdGhNYXJnaW5zX2ltcGwoY2hpbGQsCisgICAgICAgICAgICAgICAgcGFyZW50V2lkdGhNZWFzdXJlU3BlYywgd2lkdGhVc2VkLCBwYXJlbnRIZWlnaHRNZWFzdXJlU3BlYywgaGVpZ2h0VXNlZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Rlc3RzL0FuZHJvaWQubWsgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGRmZDJhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Rlc3RzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzNiBAQAorIyBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAorICAgIGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgXAorICAgIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzIFwKKyAgICBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQgXAorICAgIGp1bml0CisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IE1lZGlhQ29tcG9uZW50c1Rlc3QKKworTE9DQUxfSU5TVFJVTUVOVEFUSU9OX0ZPUiA6PSBNZWRpYUNvbXBvbmVudHMKKworTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTIDo9IHRydWUKKworTE9DQUxfQ0VSVElGSUNBVEUgOj0gcGxhdGZvcm0KKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNTUyNjUKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLm1lZGlhLnRlc3RzIj4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJNZWRpYSBBUEkgVGVzdCI+CisgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgorICAgIDwvYXBwbGljYXRpb24+CisKKyAgICA8IS0tCisgICAgVG8gcnVuIHRoZSB0ZXN0cyB1c2UgdGhlIGNvbW1hbmQ6CisgICAgImFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC13IGNvbS5hbmRyb2lkLm1lZGlhLnRlc3RzL2FuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIgorICAgIC0tPgorICAgIDxpbnN0cnVtZW50YXRpb24KKyAgICAgICAgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIKKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUiCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9Ik1lZGlhIEFQSSB0ZXN0IiAvPgorCis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9TZXNzaW9uUGxheWxpc3RBZ2VudFRlc3QuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblBsYXlsaXN0QWdlbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmViMDg0OAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblBsYXlsaXN0QWdlbnRUZXN0LmphdmEKQEAgLTAsMCArMSw2NDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by4qOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXM7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5EYXRhU291cmNlRGVzYzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZS5QbGF5ZXJFdmVudENhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuT25EYXRhU291cmNlTWlzc2luZ0hlbHBlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLm1vY2tpdG8uTWF0Y2hlcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOworCisvKioKKyAqIFRlc3RzIHtAbGluayBTZXNzaW9uUGxheWxpc3RBZ2VudH0uCisgKi8KK3B1YmxpYyBjbGFzcyBTZXNzaW9uUGxheWxpc3RBZ2VudFRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU2Vzc2lvblBsYXlsaXN0QWdlbnRUZXN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0FJVF9USU1FX01TID0gMTAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9SRVBFQVRfTU9ERSA9IC0xMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfU0hVRkZMRV9NT0RFID0gLTEwMDsKKworICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlcjsKKyAgICBwcml2YXRlIEV4ZWN1dG9yIG1IYW5kbGVyRXhlY3V0b3I7CisKKyAgICBwcml2YXRlIE9iamVjdCBtV2FpdExvY2sgPSBuZXcgT2JqZWN0KCk7CisgICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uMkltcGwgbVNlc3Npb25JbXBsOworICAgIHByaXZhdGUgTWVkaWFQbGF5ZXJCYXNlIG1QbGF5ZXI7CisgICAgcHJpdmF0ZSBQbGF5ZXJFdmVudENhbGxiYWNrIG1QbGF5ZXJFdmVudENhbGxiYWNrOworICAgIHByaXZhdGUgU2Vzc2lvblBsYXlsaXN0QWdlbnQgbUFnZW50OworICAgIHByaXZhdGUgT25EYXRhU291cmNlTWlzc2luZ0hlbHBlciBtRGF0YVNvdXJjZUhlbHBlcjsKKyAgICBwcml2YXRlIE15UGxheWxpc3RFdmVudENhbGxiYWNrIG1FdmVudENhbGxiYWNrOworCisgICAgcHVibGljIGNsYXNzIE15UGxheWxpc3RFdmVudENhbGxiYWNrIGV4dGVuZHMgTWVkaWFQbGF5bGlzdEFnZW50LlBsYXlsaXN0RXZlbnRDYWxsYmFjayB7CisgICAgICAgIGJvb2xlYW4gb25QbGF5bGlzdENoYW5nZWRDYWxsZWQ7CisgICAgICAgIGJvb2xlYW4gb25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZENhbGxlZDsKKyAgICAgICAgYm9vbGVhbiBvblJlcGVhdE1vZGVDaGFuZ2VkQ2FsbGVkOworICAgICAgICBib29sZWFuIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkQ2FsbGVkOworCisgICAgICAgIHByaXZhdGUgT2JqZWN0IG1XYWl0TG9jazsKKworICAgICAgICBwdWJsaWMgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2soT2JqZWN0IHdhaXRMb2NrKSB7CisgICAgICAgICAgICBtV2FpdExvY2sgPSB3YWl0TG9jazsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICAgICAgb25QbGF5bGlzdENoYW5nZWRDYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIG9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXlsaXN0Q2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwgTGlzdDxNZWRpYUl0ZW0yPiBsaXN0LAorICAgICAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgeworICAgICAgICAgICAgICAgIG9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtV2FpdExvY2subm90aWZ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAorICAgICAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgeworICAgICAgICAgICAgICAgIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWRDYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIG1XYWl0TG9jay5ub3RpZnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVwZWF0TW9kZUNoYW5nZWQoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsIGludCByZXBlYXRNb2RlKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgeworICAgICAgICAgICAgICAgIG9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIG1XYWl0TG9jay5ub3RpZnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBpbnQgc2h1ZmZsZU1vZGUpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7CisgICAgICAgICAgICAgICAgb25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIG1XYWl0TG9jay5ub3RpZnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBNeURhdGFTb3VyY2VIZWxwZXIgaW1wbGVtZW50cyBPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBEYXRhU291cmNlRGVzYyBvbkRhdGFTb3VyY2VNaXNzaW5nKE1lZGlhU2Vzc2lvbjIgc2Vzc2lvbiwgTWVkaWFJdGVtMiBpdGVtKSB7CisgICAgICAgICAgICBpZiAoaXRlbS5nZXRNZWRpYUlkKCkuY29udGFpbnMoIldJVEhPVVRfRFNEIikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgRGF0YVNvdXJjZURlc2MuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5zZXREYXRhU291cmNlKGdldENvbnRleHQoKSwgVXJpLnBhcnNlKCJkc2Q6Ly90ZXN0IikpCisgICAgICAgICAgICAgICAgICAgIC5zZXRNZWRpYUlkKGl0ZW0uZ2V0TWVkaWFJZCgpKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBNb2NrUGxheWVyIGV4dGVuZHMgTWVkaWFQbGF5ZXJCYXNlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHBsYXkoKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcHJlcGFyZSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBwYXVzZSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0KCkgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNlZWtUbyhsb25nIHBvcykgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0UGxheWVyU3RhdGUoKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldEJ1ZmZlcmluZ1N0YXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QXVkaW9BdHRyaWJ1dGVzKEF1ZGlvQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEF1ZGlvQXR0cmlidXRlcyBnZXRBdWRpb0F0dHJpYnV0ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXREYXRhU291cmNlKERhdGFTb3VyY2VEZXNjIGRzZCkgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5leHREYXRhU291cmNlKERhdGFTb3VyY2VEZXNjIGRzZCkgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5leHREYXRhU291cmNlcyhMaXN0PERhdGFTb3VyY2VEZXNjPiBkc2RzKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIERhdGFTb3VyY2VEZXNjIGdldEN1cnJlbnREYXRhU291cmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgbG9vcEN1cnJlbnQoYm9vbGVhbiBsb29wKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UGxheWJhY2tTcGVlZChmbG9hdCBzcGVlZCkgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFBsYXllclZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0UGxheWVyVm9sdW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKEV4ZWN1dG9yIGUsIFBsYXllckV2ZW50Q2FsbGJhY2sgY2IpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhQbGF5ZXJFdmVudENhbGxiYWNrIGNiKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtQ29udGV4dCA9IGdldENvbnRleHQoKTsKKyAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgZGV4bWFrZXIgYnVnOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2RleG1ha2VyL2lzc3Vlcy9kZXRhaWw/aWQ9MgorICAgICAgICAvLyBEZXhtYWtlciBpcyB1c2VkIGJ5IG1vY2tpdG8uCisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiZGV4bWFrZXIuZGV4Y2FjaGUiLCBtQ29udGV4dC5nZXRDYWNoZURpcigpLmdldFBhdGgoKSk7CisKKyAgICAgICAgSGFuZGxlclRocmVhZCBoYW5kbGVyVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIlNlc3Npb25QbGF5bGlzdEFnZW50Iik7CisgICAgICAgIGhhbmRsZXJUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcihoYW5kbGVyVGhyZWFkLmdldExvb3BlcigpKTsKKyAgICAgICAgbUhhbmRsZXJFeGVjdXRvciA9IChydW5uYWJsZSkgLT4geworICAgICAgICAgICAgbUhhbmRsZXIucG9zdChydW5uYWJsZSk7CisgICAgICAgIH07CisKKyAgICAgICAgbVBsYXllciA9IG1vY2soTW9ja1BsYXllci5jbGFzcyk7CisgICAgICAgIGRvQW5zd2VyKGludm9jYXRpb24gLT4geworICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IGludm9jYXRpb24uZ2V0QXJndW1lbnRzKCk7CisgICAgICAgICAgICBtUGxheWVyRXZlbnRDYWxsYmFjayA9IChQbGF5ZXJFdmVudENhbGxiYWNrKSBhcmdzWzFdOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0pLndoZW4obVBsYXllcikucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKE1hdGNoZXJzLmFueSgpLCBNYXRjaGVycy5hbnkoKSk7CisKKyAgICAgICAgbVNlc3Npb25JbXBsID0gbW9jayhNZWRpYVNlc3Npb24ySW1wbC5jbGFzcyk7CisgICAgICAgIG1EYXRhU291cmNlSGVscGVyID0gbmV3IE15RGF0YVNvdXJjZUhlbHBlcigpOworICAgICAgICBtQWdlbnQgPSBuZXcgU2Vzc2lvblBsYXlsaXN0QWdlbnQobVNlc3Npb25JbXBsLCBtUGxheWVyKTsKKyAgICAgICAgbUFnZW50LnNldE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIobURhdGFTb3VyY2VIZWxwZXIpOworICAgICAgICBtRXZlbnRDYWxsYmFjayA9IG5ldyBNeVBsYXlsaXN0RXZlbnRDYWxsYmFjayhtV2FpdExvY2spOworICAgICAgICBtQWdlbnQucmVnaXN0ZXJQbGF5bGlzdEV2ZW50Q2FsbGJhY2sobUhhbmRsZXJFeGVjdXRvciwgbUV2ZW50Q2FsbGJhY2spOworICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1IYW5kbGVyLmdldExvb3BlcigpLnF1aXRTYWZlbHkoKTsKKyAgICAgICAgbUhhbmRsZXIgPSBudWxsOworICAgICAgICBtSGFuZGxlckV4ZWN1dG9yID0gbnVsbDsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRBbmRHZXRTaHVmbGxlTW9kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnQgc2h1ZmZsZU1vZGUgPSBtQWdlbnQuZ2V0U2h1ZmZsZU1vZGUoKTsKKyAgICAgICAgaWYgKHNodWZmbGVNb2RlICE9IE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfTk9ORSkgeworICAgICAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7CisgICAgICAgICAgICAgICAgbUFnZW50LnNldFNodWZmbGVNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfTk9ORSk7CisgICAgICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uU2h1ZmZsZU1vZGVDaGFuZ2VkQ2FsbGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX05PTkUsIG1BZ2VudC5nZXRTaHVmZmxlTW9kZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7CisgICAgICAgICAgICBtQWdlbnQuc2V0U2h1ZmZsZU1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9BTEwpOworICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0FMTCwgbUFnZW50LmdldFNodWZmbGVNb2RlKCkpOworCisgICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7CisgICAgICAgICAgICBtQWdlbnQuc2V0U2h1ZmZsZU1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9HUk9VUCk7CisgICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZENhbGxlZCk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfR1JPVVAsIG1BZ2VudC5nZXRTaHVmZmxlTW9kZSgpKTsKKworICAgICAgICAvLyBJTlZBTElEX1NIVUZGTEVfTU9ERSB3aWxsIG5vdCBjaGFuZ2UgdGhlIHNodWZmbGUgbW9kZS4KKyAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKKyAgICAgICAgICAgIG1BZ2VudC5zZXRTaHVmZmxlTW9kZShJTlZBTElEX1NIVUZGTEVfTU9ERSk7CisgICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UobUV2ZW50Q2FsbGJhY2sub25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0dST1VQLCBtQWdlbnQuZ2V0U2h1ZmZsZU1vZGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0QW5kR2V0UmVwZWF0TW9kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnQgcmVwZWF0TW9kZSA9IG1BZ2VudC5nZXRSZXBlYXRNb2RlKCk7CisgICAgICAgIGlmIChyZXBlYXRNb2RlICE9IE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FKSB7CisgICAgICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOworICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKKyAgICAgICAgICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORSk7CisgICAgICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FLCBtQWdlbnQuZ2V0UmVwZWF0TW9kZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7CisgICAgICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfT05FKTsKKyAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfT05FLCBtQWdlbnQuZ2V0UmVwZWF0TW9kZSgpKTsKKworICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgeworICAgICAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0FMTCk7CisgICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblJlcGVhdE1vZGVDaGFuZ2VkQ2FsbGVkKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0FMTCwgbUFnZW50LmdldFJlcGVhdE1vZGUoKSk7CisKKyAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKKyAgICAgICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9HUk9VUCk7CisgICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblJlcGVhdE1vZGVDaGFuZ2VkQ2FsbGVkKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0dST1VQLCBtQWdlbnQuZ2V0UmVwZWF0TW9kZSgpKTsKKworICAgICAgICAvLyBJTlZBTElEX1NIVUZGTEVfTU9ERSB3aWxsIG5vdCBjaGFuZ2UgdGhlIHNodWZmbGUgbW9kZS4KKyAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKKyAgICAgICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKElOVkFMSURfUkVQRUFUX01PREUpOworICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKG1FdmVudENhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfR1JPVVAsIG1BZ2VudC5nZXRSZXBlYXRNb2RlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldFBsYXlsaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBsaXN0U2l6ZSA9IDEwOworICAgICAgICBjcmVhdGVBbmRTZXRQbGF5bGlzdCgxMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhsaXN0U2l6ZSwgbUFnZW50LmdldFBsYXlsaXN0KCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNraXBJdGVtcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnQgbGlzdFNpemUgPSA1OworICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0ID0gY3JlYXRlQW5kU2V0UGxheWxpc3QobGlzdFNpemUpOworCisgICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FKTsKKyAgICAgICAgLy8gVGVzdCBza2lwVG9QbGF5bGlzdEl0ZW0KKyAgICAgICAgZm9yIChpbnQgaSA9IGxpc3RTaXplIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgICAgIG1BZ2VudC5za2lwVG9QbGF5bGlzdEl0ZW0ocGxheWxpc3QuZ2V0KGkpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRlc3Qgc2tpcFRvTmV4dEl0ZW0KKyAgICAgICAgLy8gY3VyUGxheVBvcyA9IDAKKyAgICAgICAgZm9yIChpbnQgY3VyUGxheVBvcyA9IDA7IGN1clBsYXlQb3MgPCBsaXN0U2l6ZSAtIDE7ICsrY3VyUGxheVBvcykgeworICAgICAgICAgICAgbUFnZW50LnNraXBUb05leHRJdGVtKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY3VyUGxheVBvcyArIDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOworICAgICAgICB9CisgICAgICAgIG1BZ2VudC5za2lwVG9OZXh0SXRlbSgpOworICAgICAgICBhc3NlcnRFcXVhbHMobGlzdFNpemUgLSAxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKKworICAgICAgICAvLyBUZXN0IHNraXBUb1ByZXZpb3VzCisgICAgICAgIC8vIGN1clBsYXlQb3MgPSBsaXN0U2l6ZSAtIDEKKyAgICAgICAgZm9yIChpbnQgY3VyUGxheVBvcyA9IGxpc3RTaXplIC0gMTsgY3VyUGxheVBvcyA+IDA7IC0tY3VyUGxheVBvcykgeworICAgICAgICAgICAgbUFnZW50LnNraXBUb1ByZXZpb3VzSXRlbSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGN1clBsYXlQb3MgLSAxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKKyAgICAgICAgfQorICAgICAgICBtQWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKKworICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfQUxMKTsKKyAgICAgICAgLy8gVGVzdCBza2lwVG9QcmV2aW91cyB3aXRoIHJlcGVhdCBtb2RlIGFsbAorICAgICAgICAvLyBjdXJQbGF5UG9zID0gMAorICAgICAgICBtQWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhsaXN0U2l6ZSAtIDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOworCisgICAgICAgIC8vIFRlc3Qgc2tpcFRvTmV4dCB3aXRoIHJlcGVhdCBtb2RlIGFsbAorICAgICAgICAvLyBjdXJQbGF5UG9zID0gbGlzdFNpemUgLSAxCisgICAgICAgIG1BZ2VudC5za2lwVG9OZXh0SXRlbSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7CisKKyAgICAgICAgbUFnZW50LnNraXBUb1ByZXZpb3VzSXRlbSgpOworICAgICAgICAvLyBjdXJQbGF5UG9zID0gbGlzdFNpemUgLSAxLCBuZXh0UGxheVBvcyA9IDAKKyAgICAgICAgLy8gVGVzdCBuZXh0IHBsYXkgcG9zIGFmdGVyIHNldHRpbmcgcmVwZWF0IG1vZGUgbm9uZS4KKyAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkUpOworICAgICAgICBhc3NlcnRFcXVhbHMobGlzdFNpemUgLSAxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFZGl0UGxheWxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGxpc3RTaXplID0gNTsKKyAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBwbGF5bGlzdCA9IGNyZWF0ZUFuZFNldFBsYXlsaXN0KGxpc3RTaXplKTsKKworICAgICAgICAvLyBUZXN0IGFkZCBpdGVtOiBbMCAoY3VyKSwgMSwgMiwgMywgNF0gLT4gWzAgKGN1ciksIDEsIDUsIDIsIDMsIDRdCisgICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7CisgICAgICAgIE1lZGlhSXRlbTIgaXRlbV81ID0gZ2VuZXJhdGVNZWRpYUl0ZW0oNSk7CisgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7CisgICAgICAgICAgICBwbGF5bGlzdC5hZGQoMiwgaXRlbV81KTsKKyAgICAgICAgICAgIG1BZ2VudC5hZGRQbGF5bGlzdEl0ZW0oMiwgaXRlbV81KTsKKyAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOworCisgICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7CisgICAgICAgIC8vIE1vdmUgY3VycmVudDogWzAgKGN1ciksIDEsIDUsIDIsIDMsIDRdIC0+IFswLCAxLCA1IChjdXIpLCAyLCAzLCA0XQorICAgICAgICBtQWdlbnQuc2tpcFRvUGxheWxpc3RJdGVtKGl0ZW1fNSk7CisgICAgICAgIC8vIFJlbW92ZSBjdXJyZW50IGl0ZW06IFswLCAxLCA1IChjdXIpLCAyLCAzLCA0XSAtPiBbMCwgMSwgMiAoY3VyKSwgMywgNF0KKyAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKKyAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShpdGVtXzUpOworICAgICAgICAgICAgbUFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShpdGVtXzUpOworICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKKworICAgICAgICAvLyBSZW1vdmUgcHJldmlvdXMgaXRlbTogWzAsIDEsIDIgKGN1ciksIDMsIDRdIC0+IFswLCAyIChjdXIpLCAzLCA0XQorICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOworICAgICAgICBNZWRpYUl0ZW0yIHByZXZpb3VzSXRlbSA9IHBsYXlsaXN0LmdldCgxKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKKyAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShwcmV2aW91c0l0ZW0pOworICAgICAgICAgICAgbUFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShwcmV2aW91c0l0ZW0pOworICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKKworICAgICAgICAvLyBSZW1vdmUgbmV4dCBpdGVtOiBbMCwgMiAoY3VyKSwgMywgNF0gLT4gWzAsIDIgKGN1ciksIDRdCisgICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7CisgICAgICAgIE1lZGlhSXRlbTIgbmV4dEl0ZW0gPSBwbGF5bGlzdC5nZXQoMik7CisgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7CisgICAgICAgICAgICBwbGF5bGlzdC5yZW1vdmUobmV4dEl0ZW0pOworICAgICAgICAgICAgbUFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShuZXh0SXRlbSk7CisgICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOworCisgICAgICAgIC8vIFJlcGxhY2UgaXRlbTogWzAsIDIgKGN1ciksIDRdIC0+IFswLCAyIChjdXIpLCA1XQorICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgeworICAgICAgICAgICAgcGxheWxpc3Quc2V0KDIsIGl0ZW1fNSk7CisgICAgICAgICAgICBtQWdlbnQucmVwbGFjZVBsYXlsaXN0SXRlbSgyLCBpdGVtXzUpOworICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKKworICAgICAgICAvLyBNb3ZlIGxhc3QgYW5kIHJlbW92ZSB0aGUgbGFzdCBpdGVtOiBbMCwgMiAoY3VyKSwgNV0gLT4gWzAsIDIsIDUgKGN1cildIC0+IFswLCAyIChjdXIpXQorICAgICAgICBNZWRpYUl0ZW0yIGxhc3RJdGVtID0gcGxheWxpc3QuZ2V0KDEpOworICAgICAgICBtQWdlbnQuc2tpcFRvUGxheWxpc3RJdGVtKGxhc3RJdGVtKTsKKyAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKKyAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShsYXN0SXRlbSk7CisgICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGxhc3RJdGVtKTsKKyAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7CisKKyAgICAgICAgLy8gUmVtb3ZlIGFsbCBpdGVtcworICAgICAgICBmb3IgKGludCBpID0gcGxheWxpc3Quc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IHBsYXlsaXN0LmdldChpKTsKKyAgICAgICAgICAgIG1BZ2VudC5za2lwVG9QbGF5bGlzdEl0ZW0oaXRlbSk7CisgICAgICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOworICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKKyAgICAgICAgICAgICAgICBwbGF5bGlzdC5yZW1vdmUoaXRlbSk7CisgICAgICAgICAgICAgICAgbUFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShpdGVtKTsKKyAgICAgICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoU2Vzc2lvblBsYXlsaXN0QWdlbnQuTk9fVkFMSURfSVRFTVMsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGxheWxpc3RXaXRoSW52YWxpZEl0ZW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGxpc3RTaXplID0gMjsKKyAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBwbGF5bGlzdCA9IGNyZWF0ZUFuZFNldFBsYXlsaXN0KGxpc3RTaXplKTsKKworICAgICAgICAvLyBBZGQgaXRlbTogWzAgKGN1ciksIDFdIC0+IFswIChjdXIpLCAzIChub19kc2QpLCAxXQorICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOworICAgICAgICBNZWRpYUl0ZW0yIGludmFsaWRJdGVtMiA9IGdlbmVyYXRlTWVkaWFJdGVtV2l0aG91dERhdGFTb3VyY2VEZXNjKDIpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgeworICAgICAgICAgICAgcGxheWxpc3QuYWRkKDEsIGludmFsaWRJdGVtMik7CisgICAgICAgICAgICBtQWdlbnQuYWRkUGxheWxpc3RJdGVtKDEsIGludmFsaWRJdGVtMik7CisgICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOworCisgICAgICAgIC8vIFRlc3Qgc2tpcCB0byBuZXh0IGl0ZW06ICBbMCAoY3VyKSwgMiAobm9fZHNkKSwgMV0gLT4gWzAsIDIgKG5vX2RzZCksIDEgKGN1cildCisgICAgICAgIG1BZ2VudC5za2lwVG9OZXh0SXRlbSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7CisKKyAgICAgICAgLy8gVGVzdCBza2lwIHRvIHByZXZpb3VzIGl0ZW06IFswLCAyIChub19kc2QpLCAxIChjdXIpXSAtPiBbMCAoY3VyKSwgMiAobm9fZHNkKSwgMV0KKyAgICAgICAgbUFnZW50LnNraXBUb1ByZXZpb3VzSXRlbSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7CisKKyAgICAgICAgLy8gUmVtb3ZlIGN1cnJlbnQgaXRlbTogWzAgKGN1ciksIDIgKG5vX2RzZCksIDFdIC0+IFsyIChub19kc2QpLCAxIChjdXIpXQorICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOworICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBwbGF5bGlzdC5nZXQoMCk7CisgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7CisgICAgICAgICAgICBwbGF5bGlzdC5yZW1vdmUoaXRlbSk7CisgICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGl0ZW0pOworICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKKworICAgICAgICAvLyBSZW1vdmUgY3VycmVudCBpdGVtOiBbMiAobm9fZHNkKSwgMSAoY3VyKV0gLT4gWzIgKG5vX2RzZCldCisgICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7CisgICAgICAgIGl0ZW0gPSBwbGF5bGlzdC5nZXQoMSk7CisgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7CisgICAgICAgICAgICBwbGF5bGlzdC5yZW1vdmUoaXRlbSk7CisgICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGl0ZW0pOworICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTZXNzaW9uUGxheWxpc3RBZ2VudC5OT19WQUxJRF9JVEVNUywgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7CisKKyAgICAgICAgLy8gQWRkIGludmFsaWQgaXRlbTogWzIgKG5vX2RzZCldIC0+IFswIChub19kc2QpLCAyIChub19kc2QpXQorICAgICAgICBNZWRpYUl0ZW0yIGludmFsaWRJdGVtMCA9IGdlbmVyYXRlTWVkaWFJdGVtV2l0aG91dERhdGFTb3VyY2VEZXNjKDApOworICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgeworICAgICAgICAgICAgcGxheWxpc3QuYWRkKDAsIGludmFsaWRJdGVtMCk7CisgICAgICAgICAgICBtQWdlbnQuYWRkUGxheWxpc3RJdGVtKDAsIGludmFsaWRJdGVtMCk7CisgICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNlc3Npb25QbGF5bGlzdEFnZW50Lk5PX1ZBTElEX0lURU1TLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKKworICAgICAgICAvLyBBZGQgdmFsaWQgaXRlbTogWzAgKG5vX2RzZCksIDIgKG5vX2RzZCldIC0+IFswIChub19kc2QpLCAxLCAyIChub19kc2QpXQorICAgICAgICBNZWRpYUl0ZW0yIGludmFsaWRJdGVtMSA9IGdlbmVyYXRlTWVkaWFJdGVtKDEpOworICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgeworICAgICAgICAgICAgcGxheWxpc3QuYWRkKDEsIGludmFsaWRJdGVtMSk7CisgICAgICAgICAgICBtQWdlbnQuYWRkUGxheWxpc3RJdGVtKDEsIGludmFsaWRJdGVtMSk7CisgICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOworCisgICAgICAgIC8vIFJlcGxhY2UgdGhlIHZhbGlkIGl0ZW0gd2l0aCBhbiBpbnZhbGlkIGl0ZW06CisgICAgICAgIC8vIFswIChub19kc2QpLCAxIChjdXIpLCAyIChub19kc2QpXSAtPiBbMCAobm9fZHNkKSwgMyAobm9fZHNkKSwgMiAobm9fZHNkKV0KKyAgICAgICAgTWVkaWFJdGVtMiBpbnZhbGlkSXRlbTMgPSBnZW5lcmF0ZU1lZGlhSXRlbVdpdGhvdXREYXRhU291cmNlRGVzYygzKTsKKyAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKKyAgICAgICAgICAgIHBsYXlsaXN0LnNldCgxLCBpbnZhbGlkSXRlbTMpOworICAgICAgICAgICAgbUFnZW50LnJlcGxhY2VQbGF5bGlzdEl0ZW0oMSwgaW52YWxpZEl0ZW0zKTsKKyAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU2Vzc2lvblBsYXlsaXN0QWdlbnQuRU5EX09GX1BMQVlMSVNULCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQbGF5bGlzdEFmdGVyT25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGxpc3RTaXplID0gMjsKKyAgICAgICAgdmVyaWZ5KG1QbGF5ZXIpLnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhNYXRjaGVycy5hbnkoKSwgTWF0Y2hlcnMuYW55KCkpOworCisgICAgICAgIGNyZWF0ZUFuZFNldFBsYXlsaXN0KGxpc3RTaXplKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOworCisgICAgICAgIG1QbGF5ZXJFdmVudENhbGxiYWNrLm9uQ3VycmVudERhdGFTb3VyY2VDaGFuZ2VkKG1QbGF5ZXIsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7CisgICAgICAgIG1QbGF5ZXJFdmVudENhbGxiYWNrLm9uQ3VycmVudERhdGFTb3VyY2VDaGFuZ2VkKG1QbGF5ZXIsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoU2Vzc2lvblBsYXlsaXN0QWdlbnQuRU5EX09GX1BMQVlMSVNULCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKKworICAgICAgICBtQWdlbnQuc2tpcFRvTmV4dEl0ZW0oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNlc3Npb25QbGF5bGlzdEFnZW50LkVORF9PRl9QTEFZTElTVCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7CisKKyAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX09ORSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTZXNzaW9uUGxheWxpc3RBZ2VudC5FTkRfT0ZfUExBWUxJU1QsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOworCisgICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9BTEwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7CisgICAgICAgIG1QbGF5ZXJFdmVudENhbGxiYWNrLm9uQ3VycmVudERhdGFTb3VyY2VDaGFuZ2VkKG1QbGF5ZXIsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7CisgICAgICAgIG1QbGF5ZXJFdmVudENhbGxiYWNrLm9uQ3VycmVudERhdGFTb3VyY2VDaGFuZ2VkKG1QbGF5ZXIsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PE1lZGlhSXRlbTI+IGNyZWF0ZUFuZFNldFBsYXlsaXN0KGludCBsaXN0U2l6ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0U2l6ZTsgKytpKSB7CisgICAgICAgICAgICBpdGVtcy5hZGQoZ2VuZXJhdGVNZWRpYUl0ZW0oaSkpOworICAgICAgICB9CisgICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7CisgICAgICAgICAgICBtQWdlbnQuc2V0UGxheWxpc3QoaXRlbXMsIG51bGwpOworICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpdGVtczsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UGxheWxpc3RFcXVhbHMoTGlzdDxNZWRpYUl0ZW0yPiBleHBlY3RlZCwgTGlzdDxNZWRpYUl0ZW0yPiBhY3R1YWwpIHsKKyAgICAgICAgaWYgKGV4cGVjdGVkID09IGFjdHVhbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoZXhwZWN0ZWQgIT0gbnVsbCAmJiBhY3R1YWwgIT0gbnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5zaXplKCksIGFjdHVhbC5zaXplKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGV4cGVjdGVkLmdldChpKS5lcXVhbHMoYWN0dWFsLmdldChpKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBNZWRpYUl0ZW0yIGdlbmVyYXRlTWVkaWFJdGVtV2l0aG91dERhdGFTb3VyY2VEZXNjKGludCBrZXkpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUl0ZW0yLkJ1aWxkZXIoMCkKKyAgICAgICAgICAgICAgICAuc2V0TWVkaWFJZCgiVEVTVF9NRURJQV9JRF9XSVRIT1VUX0RTRF8iICsga2V5KQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgIH0KKworICAgIHByaXZhdGUgTWVkaWFJdGVtMiBnZW5lcmF0ZU1lZGlhSXRlbShpbnQga2V5KSB7CisgICAgICAgIHJldHVybiBuZXcgTWVkaWFJdGVtMi5CdWlsZGVyKDApCisgICAgICAgICAgICAgICAgLnNldE1lZGlhSWQoIlRFU1RfTUVESUFfSURfIiArIGtleSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9PV05FUlMgYi9wYWNrYWdlcy9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJjNGNlZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL09XTkVSUwpAQCAtMCwwICsxLDYgQEAKK2FrZXJzdGVuQGdvb2dsZS5jb20KK2R3a2FuZ0Bnb29nbGUuY29tCitqYWV3YW5AZ29vZ2xlLmNvbQorbWFyY29uZUBnb29nbGUuY29tCitzdW5nc29vQGdvb2dsZS5jb20KK3dqaWFAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvT1dORVJTIGIvc2VydmljZXMvT1dORVJTCmluZGV4IGQ1MDBkY2UuLmQ1ZDAwZGEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL09XTkVSUworKysgYi9zZXJ2aWNlcy9PV05FUlMKQEAgLTEsNCArMSw0IEBACiBlbGF1cmVudEBnb29nbGUuY29tCiBldGFsdmFsYUBnb29nbGUuY29tCi1na2FzdGVuQGFuZHJvaWQuY29tCitna2FzdGVuQGdvb2dsZS5jb20KIGh1bmdhQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsKaW5kZXggZDA0NTRkNC4uNzQxOWU2NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsKQEAgLTUxLDYgKzUxLDcgQEAKICAgICBsaWJtZWRpYWxvZ3NlcnZpY2UgXAogICAgIGxpYm1lZGlhdXRpbHMgXAogICAgIGxpYm5iYWlvIFwKKyAgICBsaWJuYmxvZyBcCiAgICAgbGlicG93ZXJtYW5hZ2VyIFwKICAgICBsaWJzZXJ2aWNldXRpbGl0eSBcCiAgICAgbGlibWVkaWF1dGlscyBcCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCmluZGV4IDM5ZjA0ZmIuLjc2YjI5YzkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCkBAIC0yOCw2ICsyOCw3IEBACiAKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgpAQCAtMzksOCArNDAsOCBAQAogI2luY2x1ZGUgPG1lbXVucmVhY2hhYmxlL21lbXVucmVhY2hhYmxlLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvQXRvbWljLmg+CiAKKyNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgpAQCAtNTUsNiArNTYsNyBAQAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9hZWMuaD4KIAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9zdHJpbmcuaD4KIAogI2luY2x1ZGUgPHBvd2VybWFuYWdlci9Qb3dlck1hbmFnZXIuaD4KIApAQCAtMTU1LDYgKzE1Nyw4IEBACiAgICAgICBtQnROcmVjSXNPZmYoZmFsc2UpLAogICAgICAgbUlzTG93UmFtRGV2aWNlKHRydWUpLAogICAgICAgbUlzRGV2aWNlVHlwZUtub3duKGZhbHNlKSwKKyAgICAgIG1Ub3RhbE1lbW9yeSgwKSwKKyAgICAgIG1DbGllbnRTaGFyZWRIZWFwU2l6ZShrTWluaW11bUNsaWVudFNoYXJlZEhlYXBTaXplQnl0ZXMpLAogICAgICAgbUdsb2JhbEVmZmVjdEVuYWJsZVRpbWUoMCksCiAgICAgICBtU3lzdGVtUmVhZHkoZmFsc2UpCiB7CkBAIC0yNjIsNiArMjY2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvQ2xpZW50JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpkZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8TW1hcFN0cmVhbUNhbGxiYWNrPiYgY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxNbWFwU3RyZWFtSW50ZXJmYWNlPiYgaW50ZXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqaGFuZGxlKQpAQCAtMjc0LDcgKzI3OSw4IEBACiAgICAgc3RhdHVzX3QgcmV0ID0gTk9fSU5JVDsKICAgICBpZiAoYWYgIT0gMCkgewogICAgICAgICByZXQgPSBhZi0+b3Blbk1tYXBTdHJlYW0oCi0gICAgICAgICAgICAgICAgZGlyZWN0aW9uLCBhdHRyLCBjb25maWcsIGNsaWVudCwgZGV2aWNlSWQsIGNhbGxiYWNrLCBpbnRlcmZhY2UsIGhhbmRsZSk7CisgICAgICAgICAgICAgICAgZGlyZWN0aW9uLCBhdHRyLCBjb25maWcsIGNsaWVudCwgZGV2aWNlSWQsCisgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCBjYWxsYmFjaywgaW50ZXJmYWNlLCBoYW5kbGUpOwogICAgIH0KICAgICByZXR1cm4gcmV0OwogfQpAQCAtMjg0LDYgKzI5MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9DbGllbnQmIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqZGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxNbWFwU3RyZWFtQ2FsbGJhY2s+JiBjYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8TW1hcFN0cmVhbUludGVyZmFjZT4mIGludGVyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqaGFuZGxlKQpAQCAtMjkyLDggKzI5OSwxMCBAQAogICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9Ci0KLSAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gKGF1ZGlvX3Nlc3Npb25fdCkgbmV3QXVkaW9VbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX1NFU1NJT04pOworICAgIGF1ZGlvX3Nlc3Npb25fdCBhY3R1YWxTZXNzaW9uSWQgPSAqc2Vzc2lvbklkOworICAgIGlmIChhY3R1YWxTZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSkgeworICAgICAgICBhY3R1YWxTZXNzaW9uSWQgPSAoYXVkaW9fc2Vzc2lvbl90KSBuZXdBdWRpb1VuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfU0VTU0lPTik7CisgICAgfQogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOwogICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwpAQCAtMzAzLDE3ICszMTIsMTggQEAKICAgICAgICAgZnVsbENvbmZpZy5jaGFubmVsX21hc2sgPSBjb25maWctPmNoYW5uZWxfbWFzazsKICAgICAgICAgZnVsbENvbmZpZy5mb3JtYXQgPSBjb25maWctPmZvcm1hdDsKICAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckF0dHIoYXR0ciwgJmlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW1UeXBlLCBjbGllbnQuY2xpZW50VWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxTZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW1UeXBlLCBjbGllbnQuY2xpZW50UGlkLCBjbGllbnQuY2xpZW50VWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnVsbENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KShBVURJT19PVVRQVVRfRkxBR19NTUFQX05PSVJRIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZCwgJnBvcnRJZCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OmdldElucHV0Rm9yQXR0cihhdHRyLCAmaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuY2xpZW50UGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5jbGllbnRVaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LnBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX01NQVBfTk9JUlEsIGRldmljZUlkLCAmcG9ydElkKTsKICAgICB9CkBAIC0zMjYsMTMgKzMzNiwxNCBAQAogICAgIHNwPE1tYXBUaHJlYWQ+IHRocmVhZCA9IG1NbWFwVGhyZWFkcy52YWx1ZUZvcihpbyk7CiAgICAgaWYgKHRocmVhZCAhPSAwKSB7CiAgICAgICAgIGludGVyZmFjZSA9IG5ldyBNbWFwVGhyZWFkSGFuZGxlKHRocmVhZCk7Ci0gICAgICAgIHRocmVhZC0+Y29uZmlndXJlKGF0dHIsIHN0cmVhbVR5cGUsIHNlc3Npb25JZCwgY2FsbGJhY2ssICpkZXZpY2VJZCwgcG9ydElkKTsKKyAgICAgICAgdGhyZWFkLT5jb25maWd1cmUoYXR0ciwgc3RyZWFtVHlwZSwgYWN0dWFsU2Vzc2lvbklkLCBjYWxsYmFjaywgKmRldmljZUlkLCBwb3J0SWQpOwogICAgICAgICAqaGFuZGxlID0gcG9ydElkOworICAgICAgICAqc2Vzc2lvbklkID0gYWN0dWFsU2Vzc2lvbklkOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gTW1hcFN0cmVhbUludGVyZmFjZTo6RElSRUNUSU9OX09VVFBVVCkgewotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQoaW8sIHN0cmVhbVR5cGUsIHNlc3Npb25JZCk7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChpbywgc3RyZWFtVHlwZSwgYWN0dWFsU2Vzc2lvbklkKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQoaW8sIHNlc3Npb25JZCk7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KHBvcnRJZCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0ID0gTk9fSU5JVDsKICAgICB9CkBAIC02NDEsMzggKzY1Miw1NiBAQAogCiAvLyBJQXVkaW9GbGluZ2VyIGludGVyZmFjZQogCi0KLXNwPElBdWRpb1RyYWNrPiBBdWRpb0ZsaW5nZXI6OmNyZWF0ZVRyYWNrKAotICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCi0gICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIHNpemVfdCAqZnJhbWVDb3VudCwKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzLAotICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgIHBpZF90IHBpZCwKLSAgICAgICAgcGlkX3QgdGlkLAotICAgICAgICBhdWRpb19zZXNzaW9uX3QgKnNlc3Npb25JZCwKLSAgICAgICAgaW50IGNsaWVudFVpZCwKLSAgICAgICAgc3RhdHVzX3QgKnN0YXR1cywKLSAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCitzcDxJQXVkaW9UcmFjaz4gQXVkaW9GbGluZ2VyOjpjcmVhdGVUcmFjayhjb25zdCBDcmVhdGVUcmFja0lucHV0JiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVRyYWNrT3V0cHV0JiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKQogewogICAgIHNwPFBsYXliYWNrVGhyZWFkOjpUcmFjaz4gdHJhY2s7CiAgICAgc3A8VHJhY2tIYW5kbGU+IHRyYWNrSGFuZGxlOwogICAgIHNwPENsaWVudD4gY2xpZW50OwogICAgIHN0YXR1c190IGxTdGF0dXM7Ci0gICAgYXVkaW9fc2Vzc2lvbl90IGxTZXNzaW9uSWQ7CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKIAorICAgIGJvb2wgdXBkYXRlUGlkID0gKGlucHV0LmNsaWVudEluZm8uY2xpZW50UGlkID09IC0xKTsKICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmIChwaWQgPT0gLTEgfHwgIWlzVHJ1c3RlZENhbGxpbmdVaWQoY2FsbGluZ1VpZCkpIHsKKyAgICB1aWRfdCBjbGllbnRVaWQgPSBpbnB1dC5jbGllbnRJbmZvLmNsaWVudFVpZDsKKyAgICBpZiAoIWlzVHJ1c3RlZENhbGxpbmdVaWQoY2FsbGluZ1VpZCkpIHsKKyAgICAgICAgQUxPR1dfSUYoY2xpZW50VWlkICE9IGNhbGxpbmdVaWQsCisgICAgICAgICAgICAgICAgIiVzIHVpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FsbGluZ1VpZCwgY2xpZW50VWlkKTsKKyAgICAgICAgY2xpZW50VWlkID0gY2FsbGluZ1VpZDsKKyAgICAgICAgdXBkYXRlUGlkID0gdHJ1ZTsKKyAgICB9CisgICAgcGlkX3QgY2xpZW50UGlkID0gaW5wdXQuY2xpZW50SW5mby5jbGllbnRQaWQ7CisgICAgaWYgKHVwZGF0ZVBpZCkgewogICAgICAgICBjb25zdCBwaWRfdCBjYWxsaW5nUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgICAgICBBTE9HV19JRihwaWQgIT0gLTEgJiYgcGlkICE9IGNhbGxpbmdQaWQsCisgICAgICAgIEFMT0dXX0lGKGNsaWVudFBpZCAhPSAtMSAmJiBjbGllbnRQaWQgIT0gY2FsbGluZ1BpZCwKICAgICAgICAgICAgICAgICAgIiVzIHVpZCAlZCBwaWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzIHBpZCAlZCIsCi0gICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjYWxsaW5nVWlkLCBjYWxsaW5nUGlkLCBwaWQpOwotICAgICAgICBwaWQgPSBjYWxsaW5nUGlkOworICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2FsbGluZ1VpZCwgY2FsbGluZ1BpZCwgY2xpZW50UGlkKTsKKyAgICAgICAgY2xpZW50UGlkID0gY2FsbGluZ1BpZDsKICAgICB9CiAKKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gaW5wdXQuc2Vzc2lvbklkOworICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSkgeworICAgICAgICBzZXNzaW9uSWQgPSAoYXVkaW9fc2Vzc2lvbl90KSBuZXdBdWRpb1VuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfU0VTU0lPTik7CisgICAgfSBlbHNlIGlmIChhdWRpb191bmlxdWVfaWRfZ2V0X3VzZShzZXNzaW9uSWQpICE9IEFVRElPX1VOSVFVRV9JRF9VU0VfU0VTU0lPTikgeworICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgb3V0cHV0LnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICBvdXRwdXQub3V0cHV0SWQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICBvdXRwdXQuc2VsZWN0ZWREZXZpY2VJZCA9IGlucHV0LnNlbGVjdGVkRGV2aWNlSWQ7CisKKyAgICBsU3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckF0dHIoJmlucHV0LmF0dHIsICZvdXRwdXQub3V0cHV0SWQsIHNlc3Npb25JZCwgJnN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLCAmaW5wdXQuY29uZmlnLCBpbnB1dC5mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dC5zZWxlY3RlZERldmljZUlkLCAmcG9ydElkKTsKKworICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SIHx8IG91dHB1dC5vdXRwdXRJZCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2soKSBnZXRPdXRwdXRGb3JBdHRyKCkgcmV0dXJuIGVycm9yICVkIG9yIGludmFsaWQgb3V0cHV0IGhhbmRsZSIsIGxTdGF0dXMpOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQogICAgIC8vIGNsaWVudCBBdWRpb1RyYWNrOjpzZXQgYWxyZWFkeSBpbXBsZW1lbnRzIEFVRElPX1NUUkVBTV9ERUZBVUxUID0+IEFVRElPX1NUUkVBTV9NVVNJQywKICAgICAvLyBidXQgaWYgc29tZW9uZSB1c2VzIGJpbmRlciBkaXJlY3RseSB0aGV5IGNvdWxkIGJ5cGFzcyB0aGF0IGFuZCBjYXVzZSB1cyB0byBjcmFzaAogICAgIGlmICh1aW50MzJfdChzdHJlYW1UeXBlKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7CkBAIC02ODEsOTEgKzcxMCw3NiBAQAogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCi0gICAgLy8gZnVydGhlciBzYW1wbGUgcmF0ZSBjaGVja3MgYXJlIHBlcmZvcm1lZCBieSBjcmVhdGVUcmFja19sKCkgZGVwZW5kaW5nIG9uIHRoZSB0aHJlYWQgdHlwZQotICAgIGlmIChzYW1wbGVSYXRlID09IDApIHsKLSAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrKCkgaW52YWxpZCBzYW1wbGUgcmF0ZSAldSIsIHNhbXBsZVJhdGUpOwotICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCiAgICAgLy8gZnVydGhlciBjaGFubmVsIG1hc2sgY2hlY2tzIGFyZSBwZXJmb3JtZWQgYnkgY3JlYXRlVHJhY2tfbCgpIGRlcGVuZGluZyBvbiB0aGUgdGhyZWFkIHR5cGUKLSAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9jaGFubmVsKGNoYW5uZWxNYXNrKSkgewotICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2soKSBpbnZhbGlkIGNoYW5uZWwgbWFzayAlI3giLCBjaGFubmVsTWFzayk7CisgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfY2hhbm5lbChpbnB1dC5jb25maWcuY2hhbm5lbF9tYXNrKSkgeworICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2soKSBpbnZhbGlkIGNoYW5uZWwgbWFzayAlI3giLCBpbnB1dC5jb25maWcuY2hhbm5lbF9tYXNrKTsKICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KIAogICAgIC8vIGZ1cnRoZXIgZm9ybWF0IGNoZWNrcyBhcmUgcGVyZm9ybWVkIGJ5IGNyZWF0ZVRyYWNrX2woKSBkZXBlbmRpbmcgb24gdGhlIHRocmVhZCB0eXBlCi0gICAgaWYgKCFhdWRpb19pc192YWxpZF9mb3JtYXQoZm9ybWF0KSkgewotICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2soKSBpbnZhbGlkIGZvcm1hdCAlI3giLCBmb3JtYXQpOwotICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKHNoYXJlZEJ1ZmZlciAhPSAwICYmIHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrKCkgc2hhcmVkQnVmZmVyIGlzIG5vbi0wIGJ1dCBoYXMgTlVMTCBwb2ludGVyKCkiKTsKKyAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChpbnB1dC5jb25maWcuZm9ybWF0KSkgeworICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2soKSBpbnZhbGlkIGZvcm1hdCAlI3giLCBpbnB1dC5jb25maWcuZm9ybWF0KTsKICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KIAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgUGxheWJhY2tUaHJlYWQgKnRocmVhZCA9IGNoZWNrUGxheWJhY2tUaHJlYWRfbChvdXRwdXQpOworICAgICAgICBQbGF5YmFja1RocmVhZCAqdGhyZWFkID0gY2hlY2tQbGF5YmFja1RocmVhZF9sKG91dHB1dC5vdXRwdXRJZCk7CiAgICAgICAgIGlmICh0aHJlYWQgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIm5vIHBsYXliYWNrIHRocmVhZCBmb3VuZCBmb3Igb3V0cHV0IGhhbmRsZSAlZCIsIG91dHB1dCk7CisgICAgICAgICAgICBBTE9HRSgibm8gcGxheWJhY2sgdGhyZWFkIGZvdW5kIGZvciBvdXRwdXQgaGFuZGxlICVkIiwgb3V0cHV0Lm91dHB1dElkKTsKICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgIH0KIAotICAgICAgICBjbGllbnQgPSByZWdpc3RlclBpZChwaWQpOworICAgICAgICBjbGllbnQgPSByZWdpc3RlclBpZChjbGllbnRQaWQpOwogCiAgICAgICAgIFBsYXliYWNrVGhyZWFkICplZmZlY3RUaHJlYWQgPSBOVUxMOwotICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwgJiYgKnNlc3Npb25JZCAhPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFKSB7Ci0gICAgICAgICAgICBpZiAoYXVkaW9fdW5pcXVlX2lkX2dldF91c2UoKnNlc3Npb25JZCkgIT0gQVVESU9fVU5JUVVFX0lEX1VTRV9TRVNTSU9OKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrKCkgaW52YWxpZCBzZXNzaW9uIElEICVkIiwgKnNlc3Npb25JZCk7Ci0gICAgICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsU2Vzc2lvbklkID0gKnNlc3Npb25JZDsKLSAgICAgICAgICAgIC8vIGNoZWNrIGlmIGFuIGVmZmVjdCBjaGFpbiB3aXRoIHRoZSBzYW1lIHNlc3Npb24gSUQgaXMgcHJlc2VudCBvbiBhbm90aGVyCi0gICAgICAgICAgICAvLyBvdXRwdXQgdGhyZWFkIGFuZCBtb3ZlIGl0IGhlcmUuCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzcDxQbGF5YmFja1RocmVhZD4gdCA9IG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKTsKLSAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrVGhyZWFkcy5rZXlBdChpKSAhPSBvdXRwdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2Vzc2lvbnMgPSB0LT5oYXNBdWRpb1Nlc3Npb24obFNlc3Npb25JZCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9ucyAmIFRocmVhZEJhc2U6OkVGRkVDVF9TRVNTSU9OKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RUaHJlYWQgPSB0LmdldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgLy8gY2hlY2sgaWYgYW4gZWZmZWN0IGNoYWluIHdpdGggdGhlIHNhbWUgc2Vzc2lvbiBJRCBpcyBwcmVzZW50IG9uIGFub3RoZXIKKyAgICAgICAgLy8gb3V0cHV0IHRocmVhZCBhbmQgbW92ZSBpdCBoZXJlLgorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPFBsYXliYWNrVGhyZWFkPiB0ID0gbVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKG1QbGF5YmFja1RocmVhZHMua2V5QXQoaSkgIT0gb3V0cHV0Lm91dHB1dElkKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgc2Vzc2lvbnMgPSB0LT5oYXNBdWRpb1Nlc3Npb24oc2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbnMgJiBUaHJlYWRCYXNlOjpFRkZFQ1RfU0VTU0lPTikgeworICAgICAgICAgICAgICAgICAgICBlZmZlY3RUaHJlYWQgPSB0LmdldCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBpZiBubyBhdWRpbyBzZXNzaW9uIGlkIGlzIHByb3ZpZGVkLCBjcmVhdGUgb25lIGhlcmUKLSAgICAgICAgICAgIGxTZXNzaW9uSWQgPSAoYXVkaW9fc2Vzc2lvbl90KSBuZXh0VW5pcXVlSWQoQVVESU9fVU5JUVVFX0lEX1VTRV9TRVNTSU9OKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICpzZXNzaW9uSWQgPSBsU2Vzc2lvbklkOwotICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJjcmVhdGVUcmFjaygpIGxTZXNzaW9uSWQ6ICVkIiwgbFNlc3Npb25JZCk7CisgICAgICAgIEFMT0dWKCJjcmVhdGVUcmFjaygpIHNlc3Npb25JZDogJWQiLCBzZXNzaW9uSWQpOwogCi0gICAgICAgIHRyYWNrID0gdGhyZWFkLT5jcmVhdGVUcmFja19sKGNsaWVudCwgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBzaGFyZWRCdWZmZXIsIGxTZXNzaW9uSWQsIGZsYWdzLCB0aWQsCi0gICAgICAgICAgICAgICAgY2xpZW50VWlkLCAmbFN0YXR1cywgcG9ydElkKTsKKyAgICAgICAgb3V0cHV0LnNhbXBsZVJhdGUgPSBpbnB1dC5jb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgIG91dHB1dC5mcmFtZUNvdW50ID0gaW5wdXQuZnJhbWVDb3VudDsKKyAgICAgICAgb3V0cHV0Lm5vdGlmaWNhdGlvbkZyYW1lQ291bnQgPSBpbnB1dC5ub3RpZmljYXRpb25GcmFtZUNvdW50OworICAgICAgICBvdXRwdXQuZmxhZ3MgPSBpbnB1dC5mbGFnczsKKworICAgICAgICB0cmFjayA9IHRocmVhZC0+Y3JlYXRlVHJhY2tfbChjbGllbnQsIHN0cmVhbVR5cGUsIGlucHV0LmF0dHIsICZvdXRwdXQuc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uZmlnLmZvcm1hdCwgaW5wdXQuY29uZmlnLmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dC5mcmFtZUNvdW50LCAmb3V0cHV0Lm5vdGlmaWNhdGlvbkZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Lm5vdGlmaWNhdGlvbnNQZXJCdWZmZXIsIGlucHV0LnNwZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zaGFyZWRCdWZmZXIsIHNlc3Npb25JZCwgJm91dHB1dC5mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2xpZW50SW5mby5jbGllbnRUaWQsIGNsaWVudFVpZCwgJmxTdGF0dXMsIHBvcnRJZCk7CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKGxTdGF0dXMgPT0gTk9fRVJST1IpICYmICh0cmFjayA9PSAwKSk7CiAgICAgICAgIC8vIHdlIGRvbid0IGFib3J0IHlldCBpZiBsU3RhdHVzICE9IE5PX0VSUk9SOyB0aGVyZSBpcyBzdGlsbCB3b3JrIHRvIGJlIGRvbmUgcmVnYXJkbGVzcwogCisgICAgICAgIG91dHB1dC5hZkZyYW1lQ291bnQgPSB0aHJlYWQtPmZyYW1lQ291bnQoKTsKKyAgICAgICAgb3V0cHV0LmFmU2FtcGxlUmF0ZSA9IHRocmVhZC0+c2FtcGxlUmF0ZSgpOworICAgICAgICBvdXRwdXQuYWZMYXRlbmN5TXMgPSB0aHJlYWQtPmxhdGVuY3koKTsKKwogICAgICAgICAvLyBtb3ZlIGVmZmVjdCBjaGFpbiB0byB0aGlzIG91dHB1dCB0aHJlYWQgaWYgYW4gZWZmZWN0IG9uIHNhbWUgc2Vzc2lvbiB3YXMgd2FpdGluZwogICAgICAgICAvLyBmb3IgYSB0cmFjayB0byBiZSBjcmVhdGVkCiAgICAgICAgIGlmIChsU3RhdHVzID09IE5PX0VSUk9SICYmIGVmZmVjdFRocmVhZCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAvLyBubyByaXNrIG9mIGRlYWRsb2NrIGJlY2F1c2UgQXVkaW9GbGluZ2VyOjptTG9jayBpcyBoZWxkCiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2RsKHRocmVhZC0+bUxvY2spOwogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9zbChlZmZlY3RUaHJlYWQtPm1Mb2NrKTsKLSAgICAgICAgICAgIG1vdmVFZmZlY3RDaGFpbl9sKGxTZXNzaW9uSWQsIGVmZmVjdFRocmVhZCwgdGhyZWFkLCB0cnVlKTsKKyAgICAgICAgICAgIG1vdmVFZmZlY3RDaGFpbl9sKHNlc3Npb25JZCwgZWZmZWN0VGhyZWFkLCB0aHJlYWQsIHRydWUpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gTG9vayBmb3Igc3luYyBldmVudHMgYXdhaXRpbmcgZm9yIGEgc2Vzc2lvbiB0byBiZSB1c2VkLgogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QZW5kaW5nU3luY0V2ZW50cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKG1QZW5kaW5nU3luY0V2ZW50c1tpXS0+dHJpZ2dlclNlc3Npb24oKSA9PSBsU2Vzc2lvbklkKSB7CisgICAgICAgICAgICBpZiAobVBlbmRpbmdTeW5jRXZlbnRzW2ldLT50cmlnZ2VyU2Vzc2lvbigpID09IHNlc3Npb25JZCkgewogICAgICAgICAgICAgICAgIGlmICh0aHJlYWQtPmlzVmFsaWRTeW5jRXZlbnQobVBlbmRpbmdTeW5jRXZlbnRzW2ldKSkgewogICAgICAgICAgICAgICAgICAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIHRyYWNrLT5zZXRTeW5jRXZlbnQobVBlbmRpbmdTeW5jRXZlbnRzW2ldKTsKQEAgLTc3OCw3ICs3OTIsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgc2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uX2wodGhyZWFkLCBsU2Vzc2lvbklkKTsKKyAgICAgICAgc2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uX2wodGhyZWFkLCBzZXNzaW9uSWQpOwogICAgIH0KIAogICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CkBAIC03OTgsNiArODEyLDkgQEAKICAgICB0cmFja0hhbmRsZSA9IG5ldyBUcmFja0hhbmRsZSh0cmFjayk7CiAKIEV4aXQ6CisgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IgJiYgb3V0cHV0Lm91dHB1dElkICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG91dHB1dC5vdXRwdXRJZCwgc3RyZWFtVHlwZSwgc2Vzc2lvbklkKTsKKyAgICB9CiAgICAgKnN0YXR1cyA9IGxTdGF0dXM7CiAgICAgcmV0dXJuIHRyYWNrSGFuZGxlOwogfQpAQCAtOTgxLDYgKzk5OCwxOSBAQAogICAgIHJldHVybiBtdXRlOwogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6c2V0UmVjb3JkU2lsZW5jZWQodWlkX3QgdWlkLCBib29sIHNpbGVuY2VkKQoreworICAgIEFMT0dWKCJBdWRpb0ZsaW5nZXI6OnNldFJlY29yZFNpbGVuY2VkKHVpZDolZCwgc2lsZW5jZWQ6JWQpIiwgdWlkLCBzaWxlbmNlZCk7CisKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUmVjb3JkVGhyZWFkcy5zaXplKCk7IGkrKykgeworICAgICAgICBtUmVjb3JkVGhyZWFkc1tpXS0+c2V0UmVjb3JkU2lsZW5jZWQodWlkLCBzaWxlbmNlZCk7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1tYXBUaHJlYWRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1NbWFwVGhyZWFkc1tpXS0+c2V0UmVjb3JkU2lsZW5jZWQodWlkLCBzaWxlbmNlZCk7CisgICAgfQorfQorCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnNldE1hc3Rlck11dGUoYm9vbCBtdXRlZCkKIHsKICAgICBzdGF0dXNfdCByZXQgPSBpbml0Q2hlY2soKTsKQEAgLTEwNjksMjYgKzEwOTksMTcgQEAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQorICAgIGlmIChvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAgICAgQUxPR19BU1NFUlQoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9QQVRDSCwgImF0dGVtcHQgdG8gY2hhbmdlIEFVRElPX1NUUkVBTV9QQVRDSCB2b2x1bWUiKTsKIAogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBWZWN0b3I8Vm9sdW1lSW50ZXJmYWNlICo+IHZvbHVtZUludGVyZmFjZXM7Ci0gICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICBWb2x1bWVJbnRlcmZhY2UgKnZvbHVtZUludGVyZmFjZSA9IGdldFZvbHVtZUludGVyZmFjZV9sKG91dHB1dCk7Ci0gICAgICAgIGlmICh2b2x1bWVJbnRlcmZhY2UgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICB2b2x1bWVJbnRlcmZhY2VzLmFkZCh2b2x1bWVJbnRlcmZhY2UpOworICAgIFZvbHVtZUludGVyZmFjZSAqdm9sdW1lSW50ZXJmYWNlID0gZ2V0Vm9sdW1lSW50ZXJmYWNlX2wob3V0cHV0KTsKKyAgICBpZiAodm9sdW1lSW50ZXJmYWNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0KLSAgICBtU3RyZWFtVHlwZXNbc3RyZWFtXS52b2x1bWUgPSB2YWx1ZTsKLQotICAgIGlmICh2b2x1bWVJbnRlcmZhY2VzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHZvbHVtZUludGVyZmFjZXMgPSBnZXRBbGxWb2x1bWVJbnRlcmZhY2VzX2woKTsKLSAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2b2x1bWVJbnRlcmZhY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHZvbHVtZUludGVyZmFjZXNbaV0tPnNldFN0cmVhbVZvbHVtZShzdHJlYW0sIHZhbHVlKTsKLSAgICB9CisgICAgdm9sdW1lSW50ZXJmYWNlLT5zZXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCB2YWx1ZSk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC0xMTI3LDIxICsxMTQ4LDE3IEBACiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gMC4wZjsKICAgICB9Ci0KLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgZmxvYXQgdm9sdW1lOwotICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgVm9sdW1lSW50ZXJmYWNlICp2b2x1bWVJbnRlcmZhY2UgPSBnZXRWb2x1bWVJbnRlcmZhY2VfbChvdXRwdXQpOwotICAgICAgICBpZiAodm9sdW1lSW50ZXJmYWNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHZvbHVtZSA9IHZvbHVtZUludGVyZmFjZS0+c3RyZWFtVm9sdW1lKHN0cmVhbSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2b2x1bWUgPSAwLjBmOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdm9sdW1lID0gc3RyZWFtVm9sdW1lX2woc3RyZWFtKTsKKyAgICBpZiAob3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIHJldHVybiAwLjBmOwogICAgIH0KIAotICAgIHJldHVybiB2b2x1bWU7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIFZvbHVtZUludGVyZmFjZSAqdm9sdW1lSW50ZXJmYWNlID0gZ2V0Vm9sdW1lSW50ZXJmYWNlX2wob3V0cHV0KTsKKyAgICBpZiAodm9sdW1lSW50ZXJmYWNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDAuMGY7CisgICAgfQorCisgICAgcmV0dXJuIHZvbHVtZUludGVyZmFjZS0+c3RyZWFtVm9sdW1lKHN0cmVhbSk7CiB9CiAKIGJvb2wgQXVkaW9GbGluZ2VyOjpzdHJlYW1NdXRlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdApAQCAtMTE2MywxNiArMTE4MCw1OSBAQAogICAgIH0KIH0KIAorLy8gRmlsdGVyIHJlc2VydmVkIGtleXMgZnJvbSBzZXRQYXJhbWV0ZXJzKCkgYmVmb3JlIGZvcndhcmRpbmcgdG8gYXVkaW8gSEFMIG9yIGFjdGluZyB1cG9uLgorLy8gU29tZSBrZXlzIGFyZSB1c2VkIGZvciBhdWRpbyByb3V0aW5nIGFuZCBhdWRpbyBwYXRoIGNvbmZpZ3VyYXRpb24gYW5kIHNob3VsZCBiZSByZXNlcnZlZCBmb3IgdXNlCisvLyBieSBhdWRpbyBwb2xpY3kgYW5kIGF1ZGlvIGZsaW5nZXIgZm9yIGZ1bmN0aW9uYWwsIHByaXZhY3kgYW5kIHNlY3VyaXR5IHJlYXNvbnMuCit2b2lkIEF1ZGlvRmxpbmdlcjo6ZmlsdGVyUmVzZXJ2ZWRQYXJhbWV0ZXJzKFN0cmluZzgmIGtleVZhbHVlUGFpcnMsIHVpZF90IGNhbGxpbmdVaWQpCit7CisgICAgc3RhdGljIGNvbnN0IFN0cmluZzgga1Jlc2VydmVkUGFyYW1ldGVyc1tdID0geworICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwKKyAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U2FtcGxpbmdSYXRlKSwKKyAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Rm9ybWF0KSwKKyAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Q2hhbm5lbHMpLAorICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlGcmFtZUNvdW50KSwKKyAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5SW5wdXRTb3VyY2UpLAorICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlNb25vT3V0cHV0KSwKKyAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtQ29ubmVjdCksCisgICAgICAgIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbURpc2Nvbm5lY3QpLAorICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRGb3JtYXRzKSwKKyAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkQ2hhbm5lbHMpLAorICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzKSwKKyAgICB9OworCisgICAgLy8gbXVsdGl1c2VyIGZyaWVuZGx5IGFwcCBJRCBjaGVjayBmb3IgcmVxdWVzdHMgY29taW5nIGZyb20gYXVkaW9zZXJ2ZXIKKyAgICBpZiAobXVsdGl1c2VyX2dldF9hcHBfaWQoY2FsbGluZ1VpZCkgPT0gQUlEX0FVRElPU0VSVkVSKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGtleVZhbHVlUGFpcnMpOworICAgIFN0cmluZzggdmFsdWU7CisgICAgZm9yIChhdXRvJiBrZXkgOiBrUmVzZXJ2ZWRQYXJhbWV0ZXJzKSB7CisgICAgICAgIGlmIChwYXJhbS5nZXQoa2V5LCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogZmlsdGVyaW5nIGtleSAlcyB2YWx1ZSAlcyBmcm9tIHVpZCAlZCIsCisgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywga2V5LnN0cmluZygpLCB2YWx1ZS5zdHJpbmcoKSwgY2FsbGluZ1VpZCk7CisgICAgICAgICAgICBwYXJhbS5yZW1vdmUoa2V5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBrZXlWYWx1ZVBhaXJzID0gcGFyYW0udG9TdHJpbmcoKTsKK30KKwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKQogewotICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXJzKCk6IGlvICVkLCBrZXl2YWx1ZSAlcywgY2FsbGluZyBwaWQgJWQiLAotICAgICAgICAgICAgaW9IYW5kbGUsIGtleVZhbHVlUGFpcnMuc3RyaW5nKCksIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CisgICAgQUxPR1YoInNldFBhcmFtZXRlcnMoKTogaW8gJWQsIGtleXZhbHVlICVzLCBjYWxsaW5nIHBpZCAlZCBjYWxsaW5nIHVpZCAlZCIsCisgICAgICAgICAgICBpb0hhbmRsZSwga2V5VmFsdWVQYWlycy5zdHJpbmcoKSwKKyAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKIAogICAgIC8vIGNoZWNrIGNhbGxpbmcgcGVybWlzc2lvbnMKICAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKKyAgICBTdHJpbmc4IGZpbHRlcmVkS2V5VmFsdWVQYWlycyA9IGtleVZhbHVlUGFpcnM7CisgICAgZmlsdGVyUmVzZXJ2ZWRQYXJhbWV0ZXJzKGZpbHRlcmVkS2V5VmFsdWVQYWlycywgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKKworICAgIEFMT0dWKCIlczogZmlsdGVyZWQga2V5dmFsdWUgJXMiLCBfX2Z1bmNfXywgZmlsdGVyZWRLZXlWYWx1ZVBhaXJzLnN0cmluZygpKTsKKwogICAgIC8vIEFVRElPX0lPX0hBTkRMRV9OT05FIG1lYW5zIHRoZSBwYXJhbWV0ZXJzIGFyZSBnbG9iYWwgdG8gdGhlIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZQogICAgIGlmIChpb0hhbmRsZSA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtMTE4Myw3ICsxMjQzLDcgQEAKICAgICAgICAgICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX1NFVF9QQVJBTUVURVI7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb0h3RGV2cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgICAgIHNwPERldmljZUhhbEludGVyZmFjZT4gZGV2ID0gbUF1ZGlvSHdEZXZzLnZhbHVlQXQoaSktPmh3RGV2aWNlKCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gZGV2LT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpOworICAgICAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IGRldi0+c2V0UGFyYW1ldGVycyhmaWx0ZXJlZEtleVZhbHVlUGFpcnMpOwogICAgICAgICAgICAgICAgIC8vIHJldHVybiBzdWNjZXNzIGlmIGF0IGxlYXN0IG9uZSBhdWRpbyBkZXZpY2UgYWNjZXB0cyB0aGUgcGFyYW1ldGVycyBhcyBub3QgYWxsCiAgICAgICAgICAgICAgICAgLy8gSEFMcyBhcmUgcmVxdWVzdGVkIHRvIHN1cHBvcnQgYWxsIHBhcmFtZXRlcnMuIElmIG5vIGF1ZGlvIGRldmljZSBzdXBwb3J0cyB0aGUKICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0ZWQgcGFyYW1ldGVycywgdGhlIGxhc3QgZXJyb3IgaXMgcmVwb3J0ZWQuCkBAIC0xMTk0LDcgKzEyNTQsNyBAQAogICAgICAgICAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSURMRTsKICAgICAgICAgfQogICAgICAgICAvLyBkaXNhYmxlIEFFQyBhbmQgTlMgaWYgdGhlIGRldmljZSBpcyBhIEJUIFNDTyBoZWFkc2V0IHN1cHBvcnRpbmcgdGhvc2UgcHJlIHByb2Nlc3NpbmdzCi0gICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5VmFsdWVQYWlycyk7CisgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoZmlsdGVyZWRLZXlWYWx1ZVBhaXJzKTsKICAgICAgICAgU3RyaW5nOCB2YWx1ZTsKICAgICAgICAgaWYgKHBhcmFtLmdldChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlCdE5yZWMpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGJvb2wgYnROcmVjSXNPZmYgPSAodmFsdWUgPT0gQXVkaW9QYXJhbWV0ZXI6OnZhbHVlT2ZmKTsKQEAgLTEyMjcsMTYgKzEyODcsMTYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmICh0aHJlYWQgPT0gcHJpbWFyeVBsYXliYWNrVGhyZWFkX2woKSkgewogICAgICAgICAgICAgLy8gaW5kaWNhdGUgb3V0cHV0IGRldmljZSBjaGFuZ2UgdG8gYWxsIGlucHV0IHRocmVhZHMgZm9yIHByZSBwcm9jZXNzaW5nCi0gICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGtleVZhbHVlUGFpcnMpOworICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihmaWx0ZXJlZEtleVZhbHVlUGFpcnMpOwogICAgICAgICAgICAgaW50IHZhbHVlOwogICAgICAgICAgICAgaWYgKChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksIHZhbHVlKSA9PSBOT19FUlJPUikgJiYKICAgICAgICAgICAgICAgICAgICAgKHZhbHVlICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgYnJvYWNhc3RQYXJhbWV0ZXJzVG9SZWNvcmRUaHJlYWRzX2woa2V5VmFsdWVQYWlycyk7CisgICAgICAgICAgICAgICAgYnJvYWNhc3RQYXJhbWV0ZXJzVG9SZWNvcmRUaHJlYWRzX2woZmlsdGVyZWRLZXlWYWx1ZVBhaXJzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICBpZiAodGhyZWFkICE9IDApIHsKLSAgICAgICAgcmV0dXJuIHRocmVhZC0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgcmV0dXJuIHRocmVhZC0+c2V0UGFyYW1ldGVycyhmaWx0ZXJlZEtleVZhbHVlUGFpcnMpOwogICAgIH0KICAgICByZXR1cm4gQkFEX1ZBTFVFOwogfQpAQCAtMTQ4NSwxNyArMTU0NSw5IEBACiAgICAgICAgIG1BdWRpb0ZsaW5nZXIoYXVkaW9GbGluZ2VyKSwKICAgICAgICAgbVBpZChwaWQpCiB7Ci0gICAgc2l6ZV90IGhlYXBTaXplID0gcHJvcGVydHlfZ2V0X2ludDMyKCJyby5hZi5jbGllbnRfaGVhcF9zaXplX2tieXRlIiwgMCk7Ci0gICAgaGVhcFNpemUgKj0gMTAyNDsKLSAgICBpZiAoIWhlYXBTaXplKSB7Ci0gICAgICAgIGhlYXBTaXplID0ga0NsaWVudFNoYXJlZEhlYXBTaXplQnl0ZXM7Ci0gICAgICAgIC8vIEluY3JlYXNlIGhlYXAgc2l6ZSBvbiBub24gbG93IHJhbSBkZXZpY2VzIHRvIGxpbWl0IHJpc2sgb2YgcmVjb25uZWN0aW9uIGZhaWx1cmUgZm9yCi0gICAgICAgIC8vIGludmFsaWRhdGVkIHRyYWNrcwotICAgICAgICBpZiAoIWF1ZGlvRmxpbmdlci0+aXNMb3dSYW1EZXZpY2UoKSkgewotICAgICAgICAgICAgaGVhcFNpemUgKj0ga0NsaWVudFNoYXJlZEhlYXBTaXplTXVsdGlwbGllcjsKLSAgICAgICAgfQotICAgIH0KLSAgICBtTWVtb3J5RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcihoZWFwU2l6ZSwgIkF1ZGlvRmxpbmdlcjo6Q2xpZW50Iik7CisgICAgbU1lbW9yeURlYWxlciA9IG5ldyBNZW1vcnlEZWFsZXIoCisgICAgICAgICAgICBhdWRpb0ZsaW5nZXItPmdldENsaWVudFNoYXJlZEhlYXBTaXplKCksCisgICAgICAgICAgICAoc3RkOjpzdHJpbmcoIkF1ZGlvRmxpbmdlcjo6Q2xpZW50KCIpICsgc3RkOjp0b19zdHJpbmcocGlkKSArICIpIikuY19zdHIoKSk7CiB9CiAKIC8vIENsaWVudCBkZXN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptQ2xpZW50TG9jayBoZWxkCkBAIC0xNTY2LDEyMCArMTYxOCwxNDMgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1zcDxJQXVkaW9SZWNvcmQ+IEF1ZGlvRmxpbmdlcjo6b3BlblJlY29yZCgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAotICAgICAgICBzaXplX3QgKmZyYW1lQ291bnQsCi0gICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgKmZsYWdzLAotICAgICAgICBwaWRfdCBwaWQsCi0gICAgICAgIHBpZF90IHRpZCwKLSAgICAgICAgaW50IGNsaWVudFVpZCwKLSAgICAgICAgYXVkaW9fc2Vzc2lvbl90ICpzZXNzaW9uSWQsCi0gICAgICAgIHNpemVfdCAqbm90aWZpY2F0aW9uRnJhbWVzLAotICAgICAgICBzcDxJTWVtb3J5PiYgY2JsaywKLSAgICAgICAgc3A8SU1lbW9yeT4mIGJ1ZmZlcnMsCi0gICAgICAgIHN0YXR1c190ICpzdGF0dXMsCi0gICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQorc3A8bWVkaWE6OklBdWRpb1JlY29yZD4gQXVkaW9GbGluZ2VyOjpjcmVhdGVSZWNvcmQoY29uc3QgQ3JlYXRlUmVjb3JkSW5wdXQmIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlUmVjb3JkT3V0cHV0JiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKQogewogICAgIHNwPFJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s+IHJlY29yZFRyYWNrOwogICAgIHNwPFJlY29yZEhhbmRsZT4gcmVjb3JkSGFuZGxlOwogICAgIHNwPENsaWVudD4gY2xpZW50OwogICAgIHN0YXR1c190IGxTdGF0dXM7Ci0gICAgYXVkaW9fc2Vzc2lvbl90IGxTZXNzaW9uSWQ7CisgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IGlucHV0LnNlc3Npb25JZDsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAKLSAgICBjYmxrLmNsZWFyKCk7Ci0gICAgYnVmZmVycy5jbGVhcigpOworICAgIG91dHB1dC5jYmxrLmNsZWFyKCk7CisgICAgb3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICBvdXRwdXQuaW5wdXRJZCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogCi0gICAgYm9vbCB1cGRhdGVQaWQgPSAocGlkID09IC0xKTsKKyAgICBib29sIHVwZGF0ZVBpZCA9IChpbnB1dC5jbGllbnRJbmZvLmNsaWVudFBpZCA9PSAtMSk7CiAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICB1aWRfdCBjbGllbnRVaWQgPSBpbnB1dC5jbGllbnRJbmZvLmNsaWVudFVpZDsKICAgICBpZiAoIWlzVHJ1c3RlZENhbGxpbmdVaWQoY2FsbGluZ1VpZCkpIHsKLSAgICAgICAgQUxPR1dfSUYoKHVpZF90KWNsaWVudFVpZCAhPSBjYWxsaW5nVWlkLAotICAgICAgICAgICAgICAgICIlcyB1aWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzICVkIiwgX19GVU5DVElPTl9fLCBjYWxsaW5nVWlkLCBjbGllbnRVaWQpOworICAgICAgICBBTE9HV19JRihjbGllbnRVaWQgIT0gY2FsbGluZ1VpZCwKKyAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYWxsaW5nVWlkLCBjbGllbnRVaWQpOwogICAgICAgICBjbGllbnRVaWQgPSBjYWxsaW5nVWlkOwogICAgICAgICB1cGRhdGVQaWQgPSB0cnVlOwogICAgIH0KLQorICAgIHBpZF90IGNsaWVudFBpZCA9IGlucHV0LmNsaWVudEluZm8uY2xpZW50UGlkOwogICAgIGlmICh1cGRhdGVQaWQpIHsKICAgICAgICAgY29uc3QgcGlkX3QgY2FsbGluZ1BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLSAgICAgICAgQUxPR1dfSUYocGlkICE9IC0xICYmIHBpZCAhPSBjYWxsaW5nUGlkLAorICAgICAgICBBTE9HV19JRihjbGllbnRQaWQgIT0gLTEgJiYgY2xpZW50UGlkICE9IGNhbGxpbmdQaWQsCiAgICAgICAgICAgICAgICAgICIlcyB1aWQgJWQgcGlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyBwaWQgJWQiLAotICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2FsbGluZ1VpZCwgY2FsbGluZ1BpZCwgcGlkKTsKLSAgICAgICAgcGlkID0gY2FsbGluZ1BpZDsKLSAgICB9Ci0KLSAgICAvLyBjaGVjayBjYWxsaW5nIHBlcm1pc3Npb25zCi0gICAgaWYgKCFyZWNvcmRpbmdBbGxvd2VkKG9wUGFja2FnZU5hbWUsIHRpZCwgY2xpZW50VWlkKSkgewotICAgICAgICBBTE9HRSgib3BlblJlY29yZCgpIHBlcm1pc3Npb24gZGVuaWVkOiByZWNvcmRpbmcgbm90IGFsbG93ZWQiKTsKLSAgICAgICAgbFN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLy8gZnVydGhlciBzYW1wbGUgcmF0ZSBjaGVja3MgYXJlIHBlcmZvcm1lZCBieSBjcmVhdGVSZWNvcmRUcmFja19sKCkKLSAgICBpZiAoc2FtcGxlUmF0ZSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJvcGVuUmVjb3JkKCkgaW52YWxpZCBzYW1wbGUgcmF0ZSAldSIsIHNhbXBsZVJhdGUpOwotICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjYWxsaW5nVWlkLCBjYWxsaW5nUGlkLCBjbGllbnRQaWQpOworICAgICAgICBjbGllbnRQaWQgPSBjYWxsaW5nUGlkOwogICAgIH0KIAogICAgIC8vIHdlIGRvbid0IHlldCBzdXBwb3J0IGFueXRoaW5nIG90aGVyIHRoYW4gbGluZWFyIFBDTQotICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkgfHwgIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgewotICAgICAgICBBTE9HRSgib3BlblJlY29yZCgpIGludmFsaWQgZm9ybWF0ICUjeCIsIGZvcm1hdCk7CisgICAgaWYgKCFhdWRpb19pc192YWxpZF9mb3JtYXQoaW5wdXQuY29uZmlnLmZvcm1hdCkgfHwgIWF1ZGlvX2lzX2xpbmVhcl9wY20oaW5wdXQuY29uZmlnLmZvcm1hdCkpIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZVJlY29yZCgpIGludmFsaWQgZm9ybWF0ICUjeCIsIGlucHV0LmNvbmZpZy5mb3JtYXQpOwogICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCiAgICAgLy8gZnVydGhlciBjaGFubmVsIG1hc2sgY2hlY2tzIGFyZSBwZXJmb3JtZWQgYnkgY3JlYXRlUmVjb3JkVHJhY2tfbCgpCi0gICAgaWYgKCFhdWRpb19pc19pbnB1dF9jaGFubmVsKGNoYW5uZWxNYXNrKSkgewotICAgICAgICBBTE9HRSgib3BlblJlY29yZCgpIGludmFsaWQgY2hhbm5lbCBtYXNrICUjeCIsIGNoYW5uZWxNYXNrKTsKKyAgICBpZiAoIWF1ZGlvX2lzX2lucHV0X2NoYW5uZWwoaW5wdXQuY29uZmlnLmNoYW5uZWxfbWFzaykpIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZVJlY29yZCgpIGludmFsaWQgY2hhbm5lbCBtYXNrICUjeCIsIGlucHV0LmNvbmZpZy5jaGFubmVsX21hc2spOwogICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCisgICAgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX0FMTE9DQVRFKSB7CisgICAgICAgIHNlc3Npb25JZCA9IChhdWRpb19zZXNzaW9uX3QpIG5ld0F1ZGlvVW5pcXVlSWQoQVVESU9fVU5JUVVFX0lEX1VTRV9TRVNTSU9OKTsKKyAgICB9IGVsc2UgaWYgKGF1ZGlvX3VuaXF1ZV9pZF9nZXRfdXNlKHNlc3Npb25JZCkgIT0gQVVESU9fVU5JUVVFX0lEX1VTRV9TRVNTSU9OKSB7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICBvdXRwdXQuc2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgIG91dHB1dC5zZWxlY3RlZERldmljZUlkID0gaW5wdXQuc2VsZWN0ZWREZXZpY2VJZDsKKyAgICBvdXRwdXQuZmxhZ3MgPSBpbnB1dC5mbGFnczsKKworICAgIGNsaWVudCA9IHJlZ2lzdGVyUGlkKGNsaWVudFBpZCk7CisKKyAgICAvLyBOb3QgYSBjb252ZW50aW9uYWwgbG9vcCwgYnV0IGEgcmV0cnkgbG9vcCBmb3IgYXQgbW9zdCB0d28gaXRlcmF0aW9ucyB0b3RhbC4KKyAgICAvLyBUcnkgZmlyc3QgbWF5YmUgd2l0aCBGQVNUIGZsYWcgdGhlbiB0cnkgYWdhaW4gd2l0aG91dCBGQVNUIGZsYWcgaWYgdGhhdCBmYWlscy4KKyAgICAvLyBFeGl0cyBsb29wIHZpYSBicmVhayBvbiBubyBlcnJvciBvZiBnb3QgZXhpdCBvbiBlcnJvcgorICAgIC8vIFRoZSBzcDw+IHJlZmVyZW5jZXMgd2lsbCBiZSBkcm9wcGVkIHdoZW4gcmUtZW50ZXJpbmcgc2NvcGUuCisgICAgLy8gVGhlIGxhY2sgb2YgaW5kZW50YXRpb24gaXMgZGVsaWJlcmF0ZSwgdG8gcmVkdWNlIGNvZGUgY2h1cm4gYW5kIGVhc2UgbWVyZ2VzLgorICAgIGZvciAoOzspIHsKKyAgICAvLyByZWxlYXNlIHByZXZpb3VzbHkgb3BlbmVkIGlucHV0IGlmIHJldHJ5aW5nLgorICAgIGlmIChvdXRwdXQuaW5wdXRJZCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICByZWNvcmRUcmFjay5jbGVhcigpOworICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KHBvcnRJZCk7CisgICAgICAgIG91dHB1dC5pbnB1dElkID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgIHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgfQorICAgIGxTdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGb3JBdHRyKCZpbnB1dC5hdHRyLCAmb3V0cHV0LmlucHV0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIGNvbXBhcmUgdG8gQXVkaW9UcmFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRQaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQub3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0LmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmZsYWdzLCAmb3V0cHV0LnNlbGVjdGVkRGV2aWNlSWQsICZwb3J0SWQpOworCiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBSZWNvcmRUaHJlYWQgKnRocmVhZCA9IGNoZWNrUmVjb3JkVGhyZWFkX2woaW5wdXQpOworICAgICAgICBSZWNvcmRUaHJlYWQgKnRocmVhZCA9IGNoZWNrUmVjb3JkVGhyZWFkX2wob3V0cHV0LmlucHV0SWQpOwogICAgICAgICBpZiAodGhyZWFkID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJvcGVuUmVjb3JkKCkgY2hlY2tSZWNvcmRUaHJlYWRfbCBmYWlsZWQiKTsKKyAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVSZWNvcmQoKSBjaGVja1JlY29yZFRocmVhZF9sIGZhaWxlZCIpOwogICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgfQogCi0gICAgICAgIGNsaWVudCA9IHJlZ2lzdGVyUGlkKHBpZCk7CisgICAgICAgIEFMT0dWKCJjcmVhdGVSZWNvcmQoKSBsU2Vzc2lvbklkOiAlZCBpbnB1dCAlZCIsIHNlc3Npb25JZCwgb3V0cHV0LmlucHV0SWQpOwogCi0gICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCAmJiAqc2Vzc2lvbklkICE9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUpIHsKLSAgICAgICAgICAgIGlmIChhdWRpb191bmlxdWVfaWRfZ2V0X3VzZSgqc2Vzc2lvbklkKSAhPSBBVURJT19VTklRVUVfSURfVVNFX1NFU1NJT04pIHsKLSAgICAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxTZXNzaW9uSWQgPSAqc2Vzc2lvbklkOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gaWYgbm8gYXVkaW8gc2Vzc2lvbiBpZCBpcyBwcm92aWRlZCwgY3JlYXRlIG9uZSBoZXJlCi0gICAgICAgICAgICBsU2Vzc2lvbklkID0gKGF1ZGlvX3Nlc3Npb25fdCkgbmV4dFVuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfU0VTU0lPTik7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqc2Vzc2lvbklkID0gbFNlc3Npb25JZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBBTE9HVigib3BlblJlY29yZCgpIGxTZXNzaW9uSWQ6ICVkIGlucHV0ICVkIiwgbFNlc3Npb25JZCwgaW5wdXQpOworICAgICAgICBvdXRwdXQuc2FtcGxlUmF0ZSA9IGlucHV0LmNvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAgICAgb3V0cHV0LmZyYW1lQ291bnQgPSBpbnB1dC5mcmFtZUNvdW50OworICAgICAgICBvdXRwdXQubm90aWZpY2F0aW9uRnJhbWVDb3VudCA9IGlucHV0Lm5vdGlmaWNhdGlvbkZyYW1lQ291bnQ7CiAKLSAgICAgICAgcmVjb3JkVHJhY2sgPSB0aHJlYWQtPmNyZWF0ZVJlY29yZFRyYWNrX2woY2xpZW50LCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBsU2Vzc2lvbklkLCBub3RpZmljYXRpb25GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFVpZCwgZmxhZ3MsIHRpZCwgJmxTdGF0dXMsIHBvcnRJZCk7CisgICAgICAgIHJlY29yZFRyYWNrID0gdGhyZWFkLT5jcmVhdGVSZWNvcmRUcmFja19sKGNsaWVudCwgaW5wdXQuYXR0ciwgJm91dHB1dC5zYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25maWcuZm9ybWF0LCBpbnB1dC5jb25maWcuY2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LmZyYW1lQ291bnQsIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dC5ub3RpZmljYXRpb25GcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRVaWQsICZvdXRwdXQuZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNsaWVudEluZm8uY2xpZW50VGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbFN0YXR1cywgcG9ydElkKTsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigobFN0YXR1cyA9PSBOT19FUlJPUikgJiYgKHJlY29yZFRyYWNrID09IDApKTsKIAotICAgICAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgLy8gQ2hlY2sgaWYgb25lIGVmZmVjdCBjaGFpbiB3YXMgYXdhaXRpbmcgZm9yIGFuIEF1ZGlvUmVjb3JkIHRvIGJlIGNyZWF0ZWQgb24gdGhpcwotICAgICAgICAgICAgLy8gc2Vzc2lvbiBhbmQgbW92ZSBpdCB0byB0aGlzIHRocmVhZC4KLSAgICAgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IGdldE9ycGhhbkVmZmVjdENoYWluX2wobFNlc3Npb25JZCk7Ci0gICAgICAgICAgICBpZiAoY2hhaW4gIT0gMCkgewotICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKLSAgICAgICAgICAgICAgICB0aHJlYWQtPmFkZEVmZmVjdENoYWluX2woY2hhaW4pOwotICAgICAgICAgICAgfQorICAgICAgICAvLyBsU3RhdHVzID09IEJBRF9UWVBFIG1lYW5zIEZBU1QgZmxhZyB3YXMgcmVqZWN0ZWQ6IHJlcXVlc3QgYSBuZXcgaW5wdXQgZnJvbQorICAgICAgICAvLyBhdWRpbyBwb2xpY3kgbWFuYWdlciB3aXRob3V0IEZBU1QgY29uc3RyYWludAorICAgICAgICBpZiAobFN0YXR1cyA9PSBCQURfVFlQRSkgeworICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KKworICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgb25lIGVmZmVjdCBjaGFpbiB3YXMgYXdhaXRpbmcgZm9yIGFuIEF1ZGlvUmVjb3JkIHRvIGJlIGNyZWF0ZWQgb24gdGhpcworICAgICAgICAvLyBzZXNzaW9uIGFuZCBtb3ZlIGl0IHRvIHRoaXMgdGhyZWFkLgorICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRPcnBoYW5FZmZlY3RDaGFpbl9sKHNlc3Npb25JZCk7CisgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CisgICAgICAgICAgICB0aHJlYWQtPmFkZEVmZmVjdENoYWluX2woY2hhaW4pOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAvLyBFbmQgb2YgcmV0cnkgbG9vcC4KKyAgICAvLyBUaGUgbGFjayBvZiBpbmRlbnRhdGlvbiBpcyBkZWxpYmVyYXRlLCB0byByZWR1Y2UgY29kZSBjaHVybiBhbmQgZWFzZSBtZXJnZXMuCiAgICAgfQogCisgICAgb3V0cHV0LmNibGsgPSByZWNvcmRUcmFjay0+Z2V0Q2JsaygpOworICAgIG91dHB1dC5idWZmZXJzID0gcmVjb3JkVHJhY2stPmdldEJ1ZmZlcnMoKTsKKworICAgIC8vIHJldHVybiBoYW5kbGUgdG8gY2xpZW50CisgICAgcmVjb3JkSGFuZGxlID0gbmV3IFJlY29yZEhhbmRsZShyZWNvcmRUcmFjayk7CisKK0V4aXQ6CiAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgLy8gcmVtb3ZlIGxvY2FsIHN0cm9uZyByZWZlcmVuY2UgdG8gQ2xpZW50IGJlZm9yZSBkZWxldGluZyB0aGUgUmVjb3JkVHJhY2sgc28gdGhhdCB0aGUKICAgICAgICAgLy8gQ2xpZW50IGRlc3RydWN0b3IgaXMgY2FsbGVkIGJ5IHRoZSBUcmFja0Jhc2UgZGVzdHJ1Y3RvciB3aXRoIG1DbGllbnRMb2NrIGhlbGQKQEAgLTE2OTAsMTYgKzE3NjUsMTEgQEAKICAgICAgICAgICAgIGNsaWVudC5jbGVhcigpOwogICAgICAgICB9CiAgICAgICAgIHJlY29yZFRyYWNrLmNsZWFyKCk7Ci0gICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgaWYgKG91dHB1dC5pbnB1dElkICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KHBvcnRJZCk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBjYmxrID0gcmVjb3JkVHJhY2stPmdldENibGsoKTsKLSAgICBidWZmZXJzID0gcmVjb3JkVHJhY2stPmdldEJ1ZmZlcnMoKTsKLQotICAgIC8vIHJldHVybiBoYW5kbGUgdG8gY2xpZW50Ci0gICAgcmVjb3JkSGFuZGxlID0gbmV3IFJlY29yZEhhbmRsZShyZWNvcmRUcmFjayk7Ci0KLUV4aXQ6CiAgICAgKnN0YXR1cyA9IGxTdGF0dXM7CiAgICAgcmV0dXJuIHJlY29yZEhhbmRsZTsKIH0KQEAgLTE4MTEsNyArMTg4MSw3IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzZXRMb3dSYW1EZXZpY2UoYm9vbCBpc0xvd1JhbURldmljZSkKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0TG93UmFtRGV2aWNlKGJvb2wgaXNMb3dSYW1EZXZpY2UsIGludDY0X3QgdG90YWxNZW1vcnkpCiB7CiAgICAgdWlkX3QgdWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwogICAgIGlmICh1aWQgIT0gQUlEX1NZU1RFTSkgewpAQCAtMTgyMiwxMCArMTg5Miw0MyBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIG1Jc0xvd1JhbURldmljZSA9IGlzTG93UmFtRGV2aWNlOworICAgIG1Ub3RhbE1lbW9yeSA9IHRvdGFsTWVtb3J5OworICAgIC8vIG1Jc0xvd1JhbURldmljZSBhbmQgbVRvdGFsTWVtb3J5IGFyZSBvYnRhaW5lZCB0aHJvdWdoIEFjdGl2aXR5TWFuYWdlcjsKKyAgICAvLyBzZWUgQWN0aXZpdHlNYW5hZ2VyLmlzTG93UmFtRGV2aWNlKCkgYW5kIEFjdGl2aXR5TWFuYWdlci5nZXRNZW1vcnlJbmZvKCkuCisgICAgLy8gbUlzTG93UmFtRGV2aWNlIGdlbmVyYWxseSByZXByZXNlbnQgZGV2aWNlcyB3aXRoIGxlc3MgdGhhbiAxR0Igb2YgbWVtb3J5LAorICAgIC8vIHRob3VnaCBhY3R1YWwgc2V0dGluZyBpcyBkZXRlcm1pbmVkIHRocm91Z2ggZGV2aWNlIGNvbmZpZ3VyYXRpb24uCisgICAgY29uc3RleHByIGludDY0X3QgR0IgPSAxMDI0ICogMTAyNCAqIDEwMjQ7CisgICAgbUNsaWVudFNoYXJlZEhlYXBTaXplID0KKyAgICAgICAgICAgIGlzTG93UmFtRGV2aWNlID8ga01pbmltdW1DbGllbnRTaGFyZWRIZWFwU2l6ZUJ5dGVzCisgICAgICAgICAgICAgICAgICAgIDogbVRvdGFsTWVtb3J5IDwgMiAqIEdCID8gNCAqIGtNaW5pbXVtQ2xpZW50U2hhcmVkSGVhcFNpemVCeXRlcworICAgICAgICAgICAgICAgICAgICA6IG1Ub3RhbE1lbW9yeSA8IDMgKiBHQiA/IDggKiBrTWluaW11bUNsaWVudFNoYXJlZEhlYXBTaXplQnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgOiBtVG90YWxNZW1vcnkgPCA0ICogR0IgPyAxNiAqIGtNaW5pbXVtQ2xpZW50U2hhcmVkSGVhcFNpemVCeXRlcworICAgICAgICAgICAgICAgICAgICA6IDMyICoga01pbmltdW1DbGllbnRTaGFyZWRIZWFwU2l6ZUJ5dGVzOwogICAgIG1Jc0RldmljZVR5cGVLbm93biA9IHRydWU7CisKKyAgICAvLyBUT0RPOiBDYWNoZSB0aGUgY2xpZW50IHNoYXJlZCBoZWFwIHNpemUgaW4gYSBwZXJzaXN0ZW50IHByb3BlcnR5LgorICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCBhIG5hdGl2ZSBwcm9jZXNzIG9yIEphdmEgc2VydmljZSBvciBhcHAgYWNjZXNzZXMgYXVkaW9zZXJ2ZXIKKyAgICAvLyBhZnRlciBpdCBpcyByZWdpc3RlcmVkIGJ5IHN5c3RlbSBzZXJ2ZXIsIGJ1dCBiZWZvcmUgQXVkaW9TZXJ2aWNlIHVwZGF0ZXMKKyAgICAvLyB0aGUgbWVtb3J5IGluZm8uICBUaGlzIHdvdWxkIG9jY3VyIGltbWVkaWF0ZWx5IGFmdGVyIGJvb3Qgb3IgYW4gYXVkaW9zZXJ2ZXIKKyAgICAvLyBjcmFzaCBhbmQgcmVzdG9yZS4gQmVmb3JlIHVwZGF0ZSBmcm9tIEF1ZGlvU2VydmljZSwgdGhlIGNsaWVudCB3b3VsZCBnZXQgdGhlCisgICAgLy8gbWluaW11bSBoZWFwIHNpemUuCisKKyAgICBBTE9HRCgiaXNMb3dSYW1EZXZpY2U6JXMgdG90YWxNZW1vcnk6JWxsZCBtQ2xpZW50U2hhcmVkSGVhcFNpemU6JXp1IiwKKyAgICAgICAgICAgIChpc0xvd1JhbURldmljZSA/ICJ0cnVlIiA6ICJmYWxzZSIpLAorICAgICAgICAgICAgKGxvbmcgbG9uZyltVG90YWxNZW1vcnksCisgICAgICAgICAgICBtQ2xpZW50U2hhcmVkSGVhcFNpemUubG9hZCgpKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3NpemVfdCBBdWRpb0ZsaW5nZXI6OmdldENsaWVudFNoYXJlZEhlYXBTaXplKCkgY29uc3QKK3sKKyAgICBzaXplX3QgaGVhcFNpemVJbkJ5dGVzID0gcHJvcGVydHlfZ2V0X2ludDMyKCJyby5hZi5jbGllbnRfaGVhcF9zaXplX2tieXRlIiwgMCkgKiAxMDI0OworICAgIGlmIChoZWFwU2l6ZUluQnl0ZXMgIT0gMCkgeyAvLyByZWFkLW9ubHkgcHJvcGVydHkgb3ZlcnJpZGVzIGFsbC4KKyAgICAgICAgcmV0dXJuIGhlYXBTaXplSW5CeXRlczsKKyAgICB9CisgICAgcmV0dXJuIG1DbGllbnRTaGFyZWRIZWFwU2l6ZTsKK30KKwogYXVkaW9faHdfc3luY190IEF1ZGlvRmxpbmdlcjo6Z2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTE5MDAsNiArMjAwMywxNCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtSGFyZHdhcmVMb2NrKTsKKyAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGRldiA9IG1QcmltYXJ5SGFyZHdhcmVEZXYtPmh3RGV2aWNlKCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2LT5nZXRNaWNyb3Bob25lcyhtaWNyb3Bob25lcyk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwogLy8gc2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAogdm9pZCBBdWRpb0ZsaW5nZXI6OnNldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbl9sKFBsYXliYWNrVGhyZWFkICp0aHJlYWQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpCiB7CkBAIC0yMDE0LDggKzIxMjUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpsYXRlbmN5TXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCiB7Ci0gICAgQUxPR0koIm9wZW5PdXRwdXQoKSB0aGlzICVwLCBtb2R1bGUgJWQgRGV2aWNlICV4LCBTYW1wbGluZ1JhdGUgJWQsIEZvcm1hdCAlIzA4eCwgQ2hhbm5lbHMgJXgsICIKLSAgICAgICAgICAgICAgImZsYWdzICV4IiwKKyAgICBBTE9HSSgib3Blbk91dHB1dCgpIHRoaXMgJXAsIG1vZHVsZSAlZCBEZXZpY2UgJSN4LCBTYW1wbGluZ1JhdGUgJWQsIEZvcm1hdCAlIzA4eCwgIgorICAgICAgICAgICAgICAiQ2hhbm5lbHMgJSN4LCBmbGFncyAlI3giLAogICAgICAgICAgICAgICB0aGlzLCBtb2R1bGUsCiAgICAgICAgICAgICAgIChkZXZpY2VzICE9IE5VTEwpID8gKmRldmljZXMgOiAwLAogICAgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLApAQCAtMjI1Nyw4ICsyMzY4LDggQEAKICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gaW5TdHJlYW07CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5Id0hhbC0+b3BlbklucHV0U3RyZWFtKAogICAgICAgICAgICAgKmlucHV0LCBkZXZpY2VzLCAmaGFsY29uZmlnLCBmbGFncywgYWRkcmVzcy5zdHJpbmcoKSwgc291cmNlLCAmaW5TdHJlYW0pOwotICAgIEFMT0dWKCJvcGVuSW5wdXRfbCgpIG9wZW5JbnB1dFN0cmVhbSByZXR1cm5lZCBpbnB1dCAlcCwgZGV2aWNlcyAleCwgU2FtcGxpbmdSYXRlICVkIgotICAgICAgICAgICAiLCBGb3JtYXQgJSN4LCBDaGFubmVscyAleCwgZmxhZ3MgJSN4LCBzdGF0dXMgJWQgYWRkciAlcyIsCisgICAgQUxPR1YoIm9wZW5JbnB1dF9sKCkgb3BlbklucHV0U3RyZWFtIHJldHVybmVkIGlucHV0ICVwLCBkZXZpY2VzICUjeCwgU2FtcGxpbmdSYXRlICVkIgorICAgICAgICAgICAiLCBGb3JtYXQgJSN4LCBDaGFubmVscyAlI3gsIGZsYWdzICUjeCwgc3RhdHVzICVkIGFkZHIgJXMiLAogICAgICAgICAgICAgaW5TdHJlYW0uZ2V0KCksCiAgICAgICAgICAgICBkZXZpY2VzLAogICAgICAgICAgICAgaGFsY29uZmlnLnNhbXBsZV9yYXRlLApAQCAtMjU2OSw2ICsyNjgwLDcgQEAKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgewogICAgICAgICBzcDxQbGF5YmFja1RocmVhZD4gdCA9IG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKTsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHQtPm1Mb2NrKTsKICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCB0LT5tRWZmZWN0Q2hhaW5zLnNpemUoKTsgaisrKSB7CiAgICAgICAgICAgICBzcDxFZmZlY3RDaGFpbj4gZWMgPSB0LT5tRWZmZWN0Q2hhaW5zW2pdOwogICAgICAgICAgICAgaWYgKGVjLT5zZXNzaW9uSWQoKSA+IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgewpAQCAtMjU3OCw2ICsyNjkwLDcgQEAKICAgICB9CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUmVjb3JkVGhyZWFkcy5zaXplKCk7IGkrKykgewogICAgICAgICBzcDxSZWNvcmRUaHJlYWQ+IHQgPSBtUmVjb3JkVGhyZWFkcy52YWx1ZUF0KGkpOworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodC0+bUxvY2spOwogICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHQtPm1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBqKyspIHsKICAgICAgICAgICAgIHNwPEVmZmVjdENoYWluPiBlYyA9IHQtPm1FZmZlY3RDaGFpbnNbal07CiAgICAgICAgICAgICBjaGFpbnMucHVzaChlYyk7CkBAIC0yOTUyLDYgKzMwNjUsNyBAQAogCiAgICAgICAgIC8vIGNoZWNrIHJlY29yZGluZyBwZXJtaXNzaW9uIGZvciB2aXN1YWxpemVyCiAgICAgICAgIGlmICgobWVtY21wKCZkZXNjLnR5cGUsIFNMX0lJRF9WSVNVQUxJWkFUSU9OLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApICYmCisgICAgICAgICAgICAvLyBUT0RPOiBEbyB3ZSBuZWVkIHRvIHN0YXJ0L3N0b3Agb3AgLSBpLmUuIGlzIHRoZXJlIHJlY29yZGluZyBiZWluZyBwZXJmb3JtZWQ/CiAgICAgICAgICAgICAhcmVjb3JkaW5nQWxsb3dlZChvcFBhY2thZ2VOYW1lLCBwaWQsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgICAgIGxTdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgICAgIGdvdG8gRXhpdDsKQEAgLTMwMzksMTYgKzMxNTMsMjEgQEAKICAgICAgICAgYm9vbCBwaW5uZWQgPSAoc2Vzc2lvbklkID4gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSAmJiBpc1Nlc3Npb25BY3F1aXJlZF9sKHNlc3Npb25JZCk7CiAgICAgICAgIGhhbmRsZSA9IHRocmVhZC0+Y3JlYXRlRWZmZWN0X2woY2xpZW50LCBlZmZlY3RDbGllbnQsIHByaW9yaXR5LCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgJmRlc2MsIGVuYWJsZWQsICZsU3RhdHVzLCBwaW5uZWQpOwotICAgICAgICBpZiAoaGFuZGxlICE9IDAgJiYgaWQgIT0gTlVMTCkgewotICAgICAgICAgICAgKmlkID0gaGFuZGxlLT5pZCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChoYW5kbGUgPT0gMCkgeworICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUiAmJiBsU3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7CiAgICAgICAgICAgICAvLyByZW1vdmUgbG9jYWwgc3Ryb25nIHJlZmVyZW5jZSB0byBDbGllbnQgd2l0aCBtQ2xpZW50TG9jayBoZWxkCiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2NsKG1DbGllbnRMb2NrKTsKICAgICAgICAgICAgIGNsaWVudC5jbGVhcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gaGFuZGxlIG11c3QgYmUgdmFsaWQgaGVyZSwgYnV0IGNoZWNrIGFnYWluIHRvIGJlIHNhZmUuCisgICAgICAgICAgICBpZiAoaGFuZGxlLmdldCgpICE9IG51bGxwdHIgJiYgaWQgIT0gbnVsbHB0cikgKmlkID0gaGFuZGxlLT5pZCgpOwogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IgJiYgbFN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgeworICAgICAgICAvLyBoYW5kbGUgbXVzdCBiZSBjbGVhcmVkIG91dHNpZGUgbG9jay4KKyAgICAgICAgaGFuZGxlLmNsZWFyKCk7CisgICAgfQorCiBFeGl0OgogICAgICpzdGF0dXMgPSBsU3RhdHVzOwogICAgIHJldHVybiBoYW5kbGU7CkBAIC0zMjcwLDggKzMzODksNyBAQAogICAgICAgICAvLyBUaGV5IHdvdWxkIGJvdGggdHJhdmVyc2UgdGhlIGRpcmVjdG9yeSwgYnV0IHRoZSByZXN1bHQgd291bGQgc2ltcGx5IGJlCiAgICAgICAgIC8vIGZhaWx1cmVzIGF0IHVubGluaygpIHdoaWNoIGFyZSBpZ25vcmVkLiAgSXQncyBhbHNvIHVubGlrZWx5IHNpbmNlCiAgICAgICAgIC8vIG5vcm1hbGx5IGR1bXBzeXMgaXMgb25seSBkb25lIGJ5IGJ1Z3JlcG9ydCBvciBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgICAgIGNoYXIgdGVlUGF0aFszMisyNTZdOwotICAgICAgICBzdHJjcHkodGVlUGF0aCwgIi9kYXRhL21pc2MvYXVkaW9zZXJ2ZXIiKTsKKyAgICAgICAgY2hhciB0ZWVQYXRoW1BBVEhfTUFYXSA9ICIvZGF0YS9taXNjL2F1ZGlvc2VydmVyIjsKICAgICAgICAgc2l6ZV90IHRlZVBhdGhMZW4gPSBzdHJsZW4odGVlUGF0aCk7CiAgICAgICAgIERJUiAqZGlyID0gb3BlbmRpcih0ZWVQYXRoKTsKICAgICAgICAgdGVlUGF0aFt0ZWVQYXRoTGVuKytdID0gJy8nOwpAQCAtMzI4MSwyNyArMzM5OSwxOSBAQAogICAgICAgICAgICAgc3RydWN0IEVudHJ5IGVudHJpZXNbVEVFX01BWF9TT1JUXTsKICAgICAgICAgICAgIHNpemVfdCBlbnRyeUNvdW50ID0gMDsKICAgICAgICAgICAgIHdoaWxlIChlbnRyeUNvdW50IDwgVEVFX01BWF9TT1JUKSB7Ci0gICAgICAgICAgICAgICAgc3RydWN0IGRpcmVudCBkZTsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgZGlyZW50ICpyZXN1bHQgPSBOVUxMOwotICAgICAgICAgICAgICAgIGludCByYyA9IHJlYWRkaXJfcihkaXIsICZkZSwgJnJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJjICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coInJlYWRkaXJfciBmYWlsZWQgJWQiLCByYyk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gJmRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJyZWFkZGlyX3IgcmV0dXJuZWQgdW5leHBlY3RlZCByZXN1bHQgJXAgIT0gJXAiLCByZXN1bHQsICZkZSk7CisgICAgICAgICAgICAgICAgZXJybm8gPSAwOyAvLyBjbGVhciBlcnJubyBiZWZvcmUgcmVhZGRpcigpIHRvIHRyYWNrIHBvdGVudGlhbCBlcnJvcnMuCisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGRpcmVudCAqcmVzdWx0ID0gcmVhZGRpcihkaXIpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBBTE9HV19JRihlcnJubyAhPSAwLCAidGVlIHJlYWRkaXIoKSBmYWlsdXJlICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBub24gLndhdiBmaWxlIGVudHJpZXMKLSAgICAgICAgICAgICAgICBzaXplX3QgbmFtZUxlbiA9IHN0cmxlbihkZS5kX25hbWUpOworICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBuYW1lTGVuID0gc3RybGVuKHJlc3VsdC0+ZF9uYW1lKTsKICAgICAgICAgICAgICAgICBpZiAobmFtZUxlbiA8PSA0IHx8IG5hbWVMZW4gPj0gVEVFX01BWF9GSUxFTkFNRSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyY21wKCZkZS5kX25hbWVbbmFtZUxlbiAtIDRdLCAiLndhdiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJjbXAoJnJlc3VsdC0+ZF9uYW1lW25hbWVMZW4gLSA0XSwgIi53YXYiKSkgewogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RyY3B5KGVudHJpZXNbZW50cnlDb3VudCsrXS5tRmlsZU5hbWUsIGRlLmRfbmFtZSk7CisgICAgICAgICAgICAgICAgKHZvaWQpYXVkaW9fdXRpbHNfc3RybGNweShlbnRyaWVzW2VudHJ5Q291bnQrK10ubUZpbGVOYW1lLCByZXN1bHQtPmRfbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAodm9pZCkgY2xvc2VkaXIoZGlyKTsKICAgICAgICAgICAgIGlmIChlbnRyeUNvdW50ID4gVEVFX01BWF9LRUVQKSB7CkBAIC0zMzcyLDggKzM0ODIsMTMgQEAKICAgICAgICAgICAgIC8vIEZJWE1FIG5vdCBiaWctZW5kaWFuIHNhZmUKICAgICAgICAgICAgIHdyaXRlKHRlZUZkLCAmdGVtcCwgc2l6ZW9mKHRlbXApKTsKICAgICAgICAgICAgIGNsb3NlKHRlZUZkKTsKLSAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgZHByaW50ZihmZCwgInRlZSBjb3BpZWQgdG8gJXNcbiIsIHRlZVBhdGgpOworICAgICAgICAgICAgLy8gVE9ETyBTaG91bGQgY3JlYXRlIGZpbGUgd2l0aCB0ZW1wb3JhcnkgbmFtZSBhbmQgdGhlbiByZW5hbWUgdG8gZmluYWwgaWYgbm9uLWVtcHR5LgorICAgICAgICAgICAgaWYgKHRvdGFsID4gMCkgeworICAgICAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICJ0ZWUgY29waWVkIHRvICVzXG4iLCB0ZWVQYXRoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVubGluayh0ZWVQYXRoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKaW5kZXggNjM4OThhMC4uOTYzYTg3ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaApAQCAtMTksMjcgKzE5LDI5IEBACiAjZGVmaW5lIEFORFJPSURfQVVESU9fRkxJTkdFUl9ICiAKICNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPG11dGV4PgogI2luY2x1ZGUgPGRlcXVlPgogI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAKKyNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb0ZsaW5nZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvVHJhY2suaD4KLSNpbmNsdWRlIDxtZWRpYS9JQXVkaW9SZWNvcmQuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9NbWFwU3RyZWFtSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTW1hcFN0cmVhbUNhbGxiYWNrLmg+CiAKLSNpbmNsdWRlIDx1dGlscy9BdG9taWMuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CkBAIC03MiwxMCArNzQsMTIgQEAKIAogI2luY2x1ZGUgPHBvd2VybWFuYWdlci9JUG93ZXJNYW5hZ2VyLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkxvZy5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL05CTG9nLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb0VmZmVjdFNoYXJlZC5oPgogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oPgogCisjaW5jbHVkZSAiYW5kcm9pZC9tZWRpYS9CbkF1ZGlvUmVjb3JkLmgiCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgQXVkaW9NaXhlcjsKQEAgLTkzLDEyICs5Nyw2IEBACiAKIHN0YXRpYyBjb25zdCBuc2Vjc190IGtEZWZhdWx0U3RhbmRieVRpbWVJbk5zZWNzID0gc2Vjb25kcygzKTsKIAotCi0vLyBNYXggc2hhcmVkIG1lbW9yeSBzaXplIGZvciBhdWRpbyB0cmFja3MgYW5kIGF1ZGlvIHJlY29yZHMgcGVyIGNsaWVudCBwcm9jZXNzCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtDbGllbnRTaGFyZWRIZWFwU2l6ZUJ5dGVzID0gMTAyNCoxMDI0OwotLy8gU2hhcmVkIG1lbW9yeSBzaXplIG11bHRpcGxpZXIgZm9yIG5vbiBsb3cgcmFtIGRldmljZXMKLXN0YXRpYyBjb25zdCBzaXplX3Qga0NsaWVudFNoYXJlZEhlYXBTaXplTXVsdGlwbGllciA9IDQ7Ci0KICNkZWZpbmUgSU5DTFVESU5HX0ZST01fQVVESU9GTElOR0VSX0gKIAogY2xhc3MgQXVkaW9GbGluZ2VyIDoKQEAgLTExMywzOSArMTExLDEzIEBACiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCiAgICAgLy8gSUF1ZGlvRmxpbmdlciBpbnRlcmZhY2UsIGluIGJpbmRlciBvcGNvZGUgb3JkZXIKLSAgICB2aXJ0dWFsIHNwPElBdWRpb1RyYWNrPiBjcmVhdGVUcmFjaygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAqZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzIC8qbm9uLU5VTEwqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgIHZpcnR1YWwgc3A8SUF1ZGlvVHJhY2s+IGNyZWF0ZVRyYWNrKGNvbnN0IENyZWF0ZVRyYWNrSW5wdXQmIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVRyYWNrT3V0cHV0JiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyk7CiAKLSAgICB2aXJ0dWFsIHNwPElBdWRpb1JlY29yZD4gb3BlblJlY29yZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190ICpmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm5vdGlmaWNhdGlvbkZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4mIGNibGssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+JiBidWZmZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzIC8qbm9uLU5VTEwqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgIHZpcnR1YWwgc3A8bWVkaWE6OklBdWRpb1JlY29yZD4gY3JlYXRlUmVjb3JkKGNvbnN0IENyZWF0ZVJlY29yZElucHV0JiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVSZWNvcmRPdXRwdXQmIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKTsKIAogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIHNhbXBsZVJhdGUoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0OwogICAgIHZpcnR1YWwgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0OwpAQCAtMTcyLDYgKzE0NCw4IEBACiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgc2V0TWljTXV0ZShib29sIHN0YXRlKTsKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBnZXRNaWNNdXRlKCkgY29uc3Q7CiAKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpOworCiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CiAgICAgdmlydHVhbCAgICAgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5cykgY29uc3Q7CiAKQEAgLTI1MCw3ICsyMjQsNyBAQAogICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0UHJpbWFyeU91dHB1dFNhbXBsaW5nUmF0ZSgpOwogICAgIHZpcnR1YWwgc2l6ZV90IGdldFByaW1hcnlPdXRwdXRGcmFtZUNvdW50KCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldExvd1JhbURldmljZShib29sIGlzTG93UmFtRGV2aWNlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldExvd1JhbURldmljZShib29sIGlzTG93UmFtRGV2aWNlLCBpbnQ2NF90IHRvdGFsTWVtb3J5KSBvdmVycmlkZTsKIAogICAgIC8qIExpc3QgYXZhaWxhYmxlIGF1ZGlvIHBvcnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyh1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKQEAgLTI3OSw2ICsyNTMsOCBAQAogICAgIC8qIEluZGljYXRlIEpBVkEgc2VydmljZXMgYXJlIHJlYWR5IChzY2hlZHVsaW5nLCBwb3dlciBtYW5hZ2VtZW50IC4uLikgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IHN5c3RlbVJlYWR5KCk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKKwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKQEAgLTI5Niw2ICsyNzIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0NsaWVudCYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmRldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPE1tYXBTdHJlYW1DYWxsYmFjaz4mIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPE1tYXBTdHJlYW1JbnRlcmZhY2U+JiBpbnRlcmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqaGFuZGxlKTsKQEAgLTUzNyw2ICs1MTQsMTMgQEAKICAgICB9OwogCiAgICAgLy8gLS0tIFBsYXliYWNrVGhyZWFkIC0tLQorI2lmZGVmIEZMT0FUX0VGRkVDVF9DSEFJTgorI2RlZmluZSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVCBBVURJT19GT1JNQVRfUENNX0ZMT0FUCit1c2luZyBlZmZlY3RfYnVmZmVyX3QgPSBmbG9hdDsKKyNlbHNlCisjZGVmaW5lIEVGRkVDVF9CVUZGRVJfRk9STUFUIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCit1c2luZyBlZmZlY3RfYnVmZmVyX3QgPSBpbnQxNl90OworI2VuZGlmCiAKICNpbmNsdWRlICJUaHJlYWRzLmgiCiAKQEAgLTU1NiwxMCArNTQwLDEwIEBACiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcGF1c2UoKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBhdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwotICAgICAgICB2aXJ0dWFsIFZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAotICAgICAgICAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pIG92ZXJyaWRlOwotICAgICAgICB2aXJ0dWFsIHNwPFZvbHVtZVNoYXBlcjo6U3RhdGU+IGdldFZvbHVtZVNoYXBlclN0YXRlKGludCBpZCkgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgbWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAorICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbikgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdGU+IGdldFZvbHVtZVNoYXBlclN0YXRlKGludCBpZCkgb3ZlcnJpZGU7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApOwogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHNpZ25hbCgpOyAvLyBzaWduYWwgcGxheWJhY2sgdGhyZWFkIGZvciBhIGNoYW5nZSBpbiBjb250cm9sIGJsb2NrCiAKQEAgLTU3MSwxNSArNTU1LDE1IEBACiAgICAgfTsKIAogICAgIC8vIHNlcnZlciBzaWRlIG9mIHRoZSBjbGllbnQncyBJQXVkaW9SZWNvcmQKLSAgICBjbGFzcyBSZWNvcmRIYW5kbGUgOiBwdWJsaWMgYW5kcm9pZDo6Qm5BdWRpb1JlY29yZCB7CisgICAgY2xhc3MgUmVjb3JkSGFuZGxlIDogcHVibGljIGFuZHJvaWQ6Om1lZGlhOjpCbkF1ZGlvUmVjb3JkIHsKICAgICBwdWJsaWM6CiAgICAgICAgIGV4cGxpY2l0IFJlY29yZEhhbmRsZShjb25zdCBzcDxSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrPiYgcmVjb3JkVHJhY2spOwogICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5SZWNvcmRIYW5kbGUoKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydChpbnQgLypBdWRpb1N5c3RlbTo6c3luY19ldmVudF90Ki8gZXZlbnQsCi0gICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHRyaWdnZXJTZXNzaW9uKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICBzdG9wKCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25UcmFuc2FjdCgKLSAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpOworICAgICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgIHN0YXJ0KGludCAvKkF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QqLyBldmVudCwKKyAgICAgICAgICAgICAgICBpbnQgLyphdWRpb19zZXNzaW9uX3QqLyB0cmlnZ2VyU2Vzc2lvbik7CisgICAgICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgICBzdG9wKCk7CisgICAgICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgICBnZXRBY3RpdmVNaWNyb3Bob25lcygKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcyk7CiAgICAgcHJpdmF0ZToKICAgICAgICAgY29uc3Qgc3A8UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjaz4gbVJlY29yZFRyYWNrOwogCkBAIC02MzUsOSArNjE5LDYgQEAKICAgICAgICAgICAgICAgLy8gbm8gcmFuZ2UgY2hlY2ssIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAogICAgICAgICAgICAgICBib29sIHN0cmVhbU11dGVfbChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gbVN0cmVhbVR5cGVzW3N0cmVhbV0ubXV0ZTsgfQotICAgICAgICAgICAgICAvLyBubyByYW5nZSBjaGVjaywgZG9lc24ndCBjaGVjayBwZXItdGhyZWFkIHN0cmVhbSB2b2x1bWUsIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAotICAgICAgICAgICAgICBmbG9hdCBzdHJlYW1Wb2x1bWVfbChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gbVN0cmVhbVR5cGVzW3N0cmVhbV0udm9sdW1lOyB9CiAgICAgICAgICAgICAgIHZvaWQgaW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+JiBpb0Rlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCA9IDApOwpAQCAtODE3LDYgKzc5OCw4IEBACiAKICAgICBzdGF0dXNfdCAgICBjaGVja1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0OwogCisgICAgdm9pZCAgICAgICAgZmlsdGVyUmVzZXJ2ZWRQYXJhbWV0ZXJzKFN0cmluZzgmIGtleVZhbHVlUGFpcnMsIHVpZF90IGNhbGxpbmdVaWQpOworCiAjaWZkZWYgVEVFX1NJTksKICAgICAvLyBhbGwgcmVjb3JkIHRocmVhZHMgc2VyaWFsbHkgc2hhcmUgYSBjb21tb24gdGVlIHNpbmssIHdoaWNoIGlzIHJlLWNyZWF0ZWQgb24gZm9ybWF0IGNoYW5nZQogICAgIHNwPE5CQUlPX1Npbms+ICAgbVJlY29yZFRlZVNpbms7CkBAIC04NDYsMTUgKzgyOSwxOCBAQAogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1RlZVNpbmtUcmFja0ZyYW1lc0RlZmF1bHQgPSAweDIwMDAwMDsKICNlbmRpZgogCi0gICAgLy8gVGhpcyBtZXRob2QgcmVhZHMgZnJvbSBhIHZhcmlhYmxlIHdpdGhvdXQgbUxvY2ssIGJ1dCB0aGUgdmFyaWFibGUgaXMgdXBkYXRlZCB1bmRlciBtTG9jay4gIFNvCi0gICAgLy8gd2UgbWlnaHQgcmVhZCBhIHN0YWxlIHZhbHVlLCBvciBhIHZhbHVlIHRoYXQncyBpbmNvbnNpc3RlbnQgd2l0aCByZXNwZWN0IHRvIG90aGVyIHZhcmlhYmxlcy4KLSAgICAvLyBJbiB0aGlzIGNhc2UsIGl0J3Mgc2FmZSBiZWNhdXNlIHRoZSByZXR1cm4gdmFsdWUgaXNuJ3QgdXNlZCBmb3IgbWFraW5nIGFuIGltcG9ydGFudCBkZWNpc2lvbi4KLSAgICAvLyBUaGUgcmVhc29uIHdlIGRvbid0IHdhbnQgdG8gdGFrZSBtTG9jayBpcyBiZWNhdXNlIGl0IGNvdWxkIGJsb2NrIHRoZSBjYWxsZXIgZm9yIGEgbG9uZyB0aW1lLgorICAgIC8vIFRoZXNlIG1ldGhvZHMgcmVhZCB2YXJpYWJsZXMgYXRvbWljYWxseSB3aXRob3V0IG1Mb2NrLAorICAgIC8vIHRob3VnaCB0aGUgdmFyaWFibGVzIGFyZSB1cGRhdGVkIHdpdGggbUxvY2suCiAgICAgYm9vbCAgICBpc0xvd1JhbURldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1Jc0xvd1JhbURldmljZTsgfQorICAgIHNpemVfdCBnZXRDbGllbnRTaGFyZWRIZWFwU2l6ZSgpIGNvbnN0OwogCiBwcml2YXRlOgotICAgIGJvb2wgICAgbUlzTG93UmFtRGV2aWNlOworICAgIHN0ZDo6YXRvbWljPGJvb2w+IG1Jc0xvd1JhbURldmljZTsKICAgICBib29sICAgIG1Jc0RldmljZVR5cGVLbm93bjsKKyAgICBpbnQ2NF90IG1Ub3RhbE1lbW9yeTsKKyAgICBzdGQ6OmF0b21pYzxzaXplX3Q+IG1DbGllbnRTaGFyZWRIZWFwU2l6ZTsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWluaW11bUNsaWVudFNoYXJlZEhlYXBTaXplQnl0ZXMgPSAxMDI0ICogMTAyNDsgLy8gMU1CCisKICAgICBuc2Vjc190IG1HbG9iYWxFZmZlY3RFbmFibGVUaW1lOyAgLy8gd2hlbiBhIGdsb2JhbCBlZmZlY3Qgd2FzIGxhc3QgZW5hYmxlZAogCiAgICAgc3A8UGF0Y2hQYW5lbD4gbVBhdGNoUGFuZWw7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQnVmTG9nLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9CdWZMb2cuY3BwCmluZGV4IDk2ODBlYjUuLmFlOTYwMzYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9CdWZMb2cuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9CdWZMb2cuY3BwCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8cHRocmVhZC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvc3RyaW5nLmg+CiAKICNkZWZpbmUgTUlOKGEsIGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCiAKQEAgLTExNywxMSArMTE4LDExIEBACiAgICAgbUJ5dGVDb3VudCA9IDBsOwogICAgIG1QYXVzZWQgPSBmYWxzZTsKICAgICBpZiAodGFnICE9IE5VTEwpIHsKLSAgICAgICAgc3RybmNweShtVGFnLCB0YWcsIEJVRkxPR1NUUkVBTV9NQVhfVEFHU0laRSk7CisgICAgICAgICh2b2lkKWF1ZGlvX3V0aWxzX3N0cmxjcHkobVRhZywgdGFnKTsKICAgICB9IGVsc2UgewogICAgICAgICBtVGFnWzBdID0gMDsKICAgICB9Ci0gICAgQUxPR1YoIkNyZWF0aW5nIEJ1ZkxvZ1N0cmVhbSBpZDolZCB0YWc6JXMgZm9ybWF0OiVkIGNoOiVkIHNyOiVkIG1heGJ5dGVzOiV6dSIsIG1JZCwgbVRhZywKKyAgICBBTE9HVigiQ3JlYXRpbmcgQnVmTG9nU3RyZWFtIGlkOiVkIHRhZzolcyBmb3JtYXQ6JSN4IGNoOiVkIHNyOiVkIG1heGJ5dGVzOiV6dSIsIG1JZCwgbVRhZywKICAgICAgICAgICAgIG1Gb3JtYXQsIG1DaGFubmVscywgbVNhbXBsaW5nUmF0ZSwgbU1heEJ5dGVzKTsKIAogICAgIC8vb3BlbiBmaWxlIChzKSwgaW5mbyBhYm91dCB0YWcsIGZvcm1hdCwgZXRjLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0NvbmZpZ3VyYXRpb24uaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9Db25maWd1cmF0aW9uLmgKaW5kZXggODQ1Njk3YS4uZWRlOGUzZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0NvbmZpZ3VyYXRpb24uaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQ29uZmlndXJhdGlvbi5oCkBAIC00MSw0ICs0MSwxNSBAQAogLy8gdW5jb21tZW50IHRvIGxvZyBDUFUgc3RhdGlzdGljcyBldmVyeSBuIHdhbGwgY2xvY2sgc2Vjb25kcwogLy8jZGVmaW5lIERFQlVHX0NQVV9VU0FHRSAxMAogCisvLyBkZWZpbmUgRkxPQVRfRUZGRUNUX0NIQUlOIHRvIHJlcXVlc3QgZmxvYXQgZWZmZWN0cyAoZmFsbHMgYmFjayB0byBpbnQxNl90IGlmIHVuYXZhaWxhYmxlKQorI2RlZmluZSBGTE9BVF9FRkZFQ1RfQ0hBSU4KKworI2lmZGVmIEZMT0FUX0VGRkVDVF9DSEFJTgorLy8gZGVmaW5lIEZMT0FUX0FVWCB0byBwcm9jZXNzIGF1eCBlZmZlY3QgYnVmZmVycyBpbiBmbG9hdCAoRkxPQVRfRUZGRUNUX0NIQUlOIG11c3QgYmUgZGVmaW5lZCkKKyNkZWZpbmUgRkxPQVRfQVVYCisKKy8vIGRlZmluZSBNVUxUSUNIQU5ORUxfRUZGRUNUX0NIQUlOIHRvIGFsbG93IG11bHRpY2hhbm5lbCBlZmZlY3RzIChGTE9BVF9FRkZFQ1RfQ0hBSU4gZGVmaW5lZCkKKyNkZWZpbmUgTVVMVElDSEFOTkVMX0VGRkVDVF9DSEFJTgorI2VuZGlmCisKICNlbmRpZiAvLyBBTkRST0lEX0FVRElPRkxJTkdFUl9DT05GSUdVUkFUSU9OX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcAppbmRleCBiZDVmMTQ2Li5kY2YyMjNjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCkBAIC0xOSwxMSArMTksMTQgQEAKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9GbGluZ2VyIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9hZWMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfbnMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfdmlzdWFsaXplci5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2NoYW5uZWxzLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmg+CkBAIC00Nyw4ICs1MCw2IEBACiAjZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKICNlbmRpZgogCi0jZGVmaW5lIG1pbihhLCBiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTY3LDEyICs2OCwxOSBAQAogICAgIDogbVBpbm5lZChwaW5uZWQpLAogICAgICAgbVRocmVhZCh0aHJlYWQpLCBtQ2hhaW4oY2hhaW4pLCBtSWQoaWQpLCBtU2Vzc2lvbklkKHNlc3Npb25JZCksCiAgICAgICBtRGVzY3JpcHRvcigqZGVzYyksCi0gICAgICAvLyBtQ29uZmlnIGlzIHNldCBieSBjb25maWd1cmUoKSBhbmQgbm90IHVzZWQgYmVmb3JlIHRoZW4KKyAgICAgIC8vIGNsZWFyIG1Db25maWcgdG8gZW5zdXJlIGNvbnNpc3RlbnQgaW5pdGlhbCB2YWx1ZSBvZiBidWZmZXIgZnJhbWVjb3VudAorICAgICAgLy8gaW4gY2FzZSBidWZmZXJzIGFyZSBhc3NvY2lhdGVkIGJ5IHNldEluQnVmZmVyKCkgb3Igc2V0T3V0QnVmZmVyKCkKKyAgICAgIC8vIHByaW9yIHRvIGNvbmZpZ3VyZSgpLgorICAgICAgbUNvbmZpZ3t7fSwge319LAogICAgICAgbVN0YXR1cyhOT19JTklUKSwgbVN0YXRlKElETEUpLAotICAgICAgLy8gbU1heERpc2FibGVXYWl0Q250IGlzIHNldCBieSBjb25maWd1cmUoKSBhbmQgbm90IHVzZWQgYmVmb3JlIHRoZW4KLSAgICAgIC8vIG1EaXNhYmxlV2FpdENudCBpcyBzZXQgYnkgcHJvY2VzcygpIGFuZCB1cGRhdGVTdGF0ZSgpIGFuZCBub3QgdXNlZCBiZWZvcmUgdGhlbgorICAgICAgbU1heERpc2FibGVXYWl0Q250KDEpLCAvLyBzZXQgYnkgY29uZmlndXJlKCksIHNob3VsZCBiZSA+PSAxCisgICAgICBtRGlzYWJsZVdhaXRDbnQoMCksICAgIC8vIHNldCBieSBwcm9jZXNzKCkgYW5kIHVwZGF0ZVN0YXRlKCkKICAgICAgIG1TdXNwZW5kZWQoZmFsc2UpLAorICAgICAgbU9mZmxvYWRlZChmYWxzZSksCiAgICAgICBtQXVkaW9GbGluZ2VyKHRocmVhZC0+bUF1ZGlvRmxpbmdlcikKKyNpZmRlZiBGTE9BVF9FRkZFQ1RfQ0hBSU4KKyAgICAgICwgbVN1cHBvcnRzRmxvYXQoZmFsc2UpCisjZW5kaWYKIHsKICAgICBBTE9HVigiQ29uc3RydWN0b3IgJXAgcGlubmVkICVkIiwgdGhpcywgcGlubmVkKTsKICAgICBpbnQgbFN0YXR1czsKQEAgLTI4NSw1NiArMjkzLDE5MCBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgY29uc3QgdWludDMyX3QgaW5DaGFubmVsQ291bnQgPQorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMpOworICAgIGNvbnN0IHVpbnQzMl90IG91dENoYW5uZWxDb3VudCA9CisgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobUNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMpOworICAgIGNvbnN0IGJvb2wgYXV4VHlwZSA9CisgICAgICAgICAgICAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZOworCisgICAgLy8gc2FmZUlucHV0T3V0cHV0U2FtcGxlQ291bnQgaXMgMCBpZiB0aGUgY2hhbm5lbCBjb3VudCBiZXR3ZWVuIGlucHV0IGFuZCBvdXRwdXQKKyAgICAvLyBidWZmZXJzIGRvIG5vdCBtYXRjaC4gVGhpcyBwcmV2ZW50cyBhdXRvbWF0aWMgYWNjdW11bGF0aW9uIG9yIGNvcHlpbmcgYmV0d2VlbiB0aGUKKyAgICAvLyBpbnB1dCBhbmQgb3V0cHV0IGVmZmVjdCBidWZmZXJzIHdpdGhvdXQgYW4gaW50ZXJtZWRpYXJ5IGVmZmVjdCBwcm9jZXNzLgorICAgIC8vIFRPRE86IGNvbnNpZGVyIGltcGxlbWVudGluZyBjaGFubmVsIGNvbnZlcnNpb24uCisgICAgY29uc3Qgc2l6ZV90IHNhZmVJbnB1dE91dHB1dFNhbXBsZUNvdW50ID0KKyAgICAgICAgICAgIGluQ2hhbm5lbENvdW50ICE9IG91dENoYW5uZWxDb3VudCA/IDAKKyAgICAgICAgICAgICAgICAgICAgOiBvdXRDaGFubmVsQ291bnQgKiBzdGQ6Om1pbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50KTsKKyAgICBjb25zdCBhdXRvIGFjY3VtdWxhdGVJbnB1dFRvT3V0cHV0ID0gW3RoaXMsIHNhZmVJbnB1dE91dHB1dFNhbXBsZUNvdW50XSgpIHsKKyNpZmRlZiBGTE9BVF9FRkZFQ1RfQ0hBSU4KKyAgICAgICAgYWNjdW11bGF0ZV9mbG9hdCgKKyAgICAgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIuZjMyLAorICAgICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmYzMiwKKyAgICAgICAgICAgICAgICBzYWZlSW5wdXRPdXRwdXRTYW1wbGVDb3VudCk7CisjZWxzZQorICAgICAgICBhY2N1bXVsYXRlX2kxNigKKyAgICAgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIuczE2LAorICAgICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnMxNiwKKyAgICAgICAgICAgICAgICBzYWZlSW5wdXRPdXRwdXRTYW1wbGVDb3VudCk7CisjZW5kaWYKKyAgICB9OworICAgIGNvbnN0IGF1dG8gY29weUlucHV0VG9PdXRwdXQgPSBbdGhpcywgc2FmZUlucHV0T3V0cHV0U2FtcGxlQ291bnRdKCkgeworI2lmZGVmIEZMT0FUX0VGRkVDVF9DSEFJTgorICAgICAgICBtZW1jcHkoCisgICAgICAgICAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLmYzMiwKKyAgICAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mMzIsCisgICAgICAgICAgICAgICAgc2FmZUlucHV0T3V0cHV0U2FtcGxlQ291bnQgKiBzaXplb2YoKm1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mMzIpKTsKKworI2Vsc2UKKyAgICAgICAgbWVtY3B5KAorICAgICAgICAgICAgICAgIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5zMTYsCisgICAgICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuczE2LAorICAgICAgICAgICAgICAgIHNhZmVJbnB1dE91dHB1dFNhbXBsZUNvdW50ICogc2l6ZW9mKCptQ29uZmlnLm91dHB1dENmZy5idWZmZXIuczE2KSk7CisjZW5kaWYKKyAgICB9OworCiAgICAgaWYgKGlzUHJvY2Vzc0VuYWJsZWQoKSkgewotICAgICAgICAvLyBkbyAzMiBiaXQgdG8gMTYgYml0IGNvbnZlcnNpb24gZm9yIGF1eGlsaWFyeSBlZmZlY3QgaW5wdXQgYnVmZmVyCi0gICAgICAgIGlmICgobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKSB7Ci0gICAgICAgICAgICBkaXRoZXJBbmRDbGFtcChtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5zMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuczMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQvMik7Ci0gICAgICAgIH0KICAgICAgICAgaW50IHJldDsKICAgICAgICAgaWYgKGlzUHJvY2Vzc0ltcGxlbWVudGVkKCkpIHsKLSAgICAgICAgICAgIC8vIGRvIHRoZSBhY3R1YWwgcHJvY2Vzc2luZyBpbiB0aGUgZWZmZWN0IGVuZ2luZQotICAgICAgICAgICAgcmV0ID0gbUVmZmVjdEludGVyZmFjZS0+cHJvY2VzcygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnJhdyAhPSBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIucmF3KSB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ250ID0gbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudCAqIEZDQ18yOyAgLy9hbHdheXMgc3RlcmVvIGhlcmUKLSAgICAgICAgICAgICAgICBpbnQxNl90ICppbiA9IG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnMxNjsKLSAgICAgICAgICAgICAgICBpbnQxNl90ICpvdXQgPSBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIuczE2OworICAgICAgICAgICAgaWYgKGF1eFR5cGUpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBvdmVyd3JpdGUgdGhlIGF1eCBpbnB1dCBidWZmZXIgaGVyZSBhbmQgY2xlYXIgYWZ0ZXIgcHJvY2Vzc2luZy4KKyAgICAgICAgICAgICAgICAvLyBhdXggaW5wdXQgaXMgYWx3YXlzIG1vbm8uCisjaWZkZWYgRkxPQVRfRUZGRUNUX0NIQUlOCisgICAgICAgICAgICAgICAgaWYgKG1TdXBwb3J0c0Zsb2F0KSB7CisjaWZuZGVmIEZMT0FUX0FVWAorICAgICAgICAgICAgICAgICAgICAvLyBEbyBpbi1wbGFjZSBmbG9hdCBjb252ZXJzaW9uIGZvciBhdXhpbGlhcnkgZWZmZWN0IGlucHV0IGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoZmxvYXQpIDw9IHNpemVvZihpbnQzMl90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4tcGxhY2UgY29udmVyc2lvbiByZXF1aXJlcyBzaXplb2YoZmxvYXQpIDw9IHNpemVvZihpbnQzMl90KSIpOwogCi0gICAgICAgICAgICAgICAgaWYgKG1Db25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZyYW1lQ250OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dFtpXSA9IGNsYW1wMTYoKGludDMyX3Qpb3V0W2ldICsgKGludDMyX3QpaW5baV0pOworICAgICAgICAgICAgICAgICAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9xNF8yNygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuczMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQpOworI2VuZGlmIC8vICFGTE9BVF9BVVgKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZiAvLyBGTE9BVF9FRkZFQ1RfQ0hBSU4KKyAgICAgICAgICAgICAgICB7CisjaWZkZWYgRkxPQVRfQVVYCisgICAgICAgICAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5zMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuZjMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQpOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX3E0XzI3KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnMxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5zMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjaWZkZWYgRkxPQVRfRUZGRUNUX0NIQUlOCisgICAgICAgICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IGluQnVmZmVyID0gbUluQnVmZmVyOworICAgICAgICAgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiBvdXRCdWZmZXIgPSBtT3V0QnVmZmVyOworCisgICAgICAgICAgICBpZiAoIWF1eFR5cGUgJiYgbUluQ2hhbm5lbENvdW50UmVxdWVzdGVkICE9IGluQ2hhbm5lbENvdW50KSB7CisgICAgICAgICAgICAgICAgYWRqdXN0X2NoYW5uZWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXItPmF1ZGlvQnVmZmVyKCktPmYzMiwgbUluQ2hhbm5lbENvdW50UmVxdWVzdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgbUluQ29udmVyc2lvbkJ1ZmZlci0+YXVkaW9CdWZmZXIoKS0+ZjMyLCBpbkNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihmbG9hdCksCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmxvYXQpCisgICAgICAgICAgICAgICAgICAgICAgICAqIG1JbkNoYW5uZWxDb3VudFJlcXVlc3RlZCAqIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgIGluQnVmZmVyID0gbUluQ29udmVyc2lvbkJ1ZmZlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUKKyAgICAgICAgICAgICAgICAgICAgJiYgbU91dENoYW5uZWxDb3VudFJlcXVlc3RlZCAhPSBvdXRDaGFubmVsQ291bnQpIHsKKyAgICAgICAgICAgICAgICBhZGp1c3Rfc2VsZWN0ZWRfY2hhbm5lbHMoCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmF1ZGlvQnVmZmVyKCktPmYzMiwgbU91dENoYW5uZWxDb3VudFJlcXVlc3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRDb252ZXJzaW9uQnVmZmVyLT5hdWRpb0J1ZmZlcigpLT5mMzIsIG91dENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihmbG9hdCksCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmxvYXQpCisgICAgICAgICAgICAgICAgICAgICAgICAqIG1PdXRDaGFubmVsQ291bnRSZXF1ZXN0ZWQgKiBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIuZnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgb3V0QnVmZmVyID0gbU91dENvbnZlcnNpb25CdWZmZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1TdXBwb3J0c0Zsb2F0KSB7IC8vIGNvbnZlcnQgaW5wdXQgdG8gaW50MTZfdCBhcyBlZmZlY3QgZG9lc24ndCBzdXBwb3J0IGZsb2F0LgorICAgICAgICAgICAgICAgIGlmICghYXV4VHlwZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobUluQ29udmVyc2lvbkJ1ZmZlci5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IG1JbkNvbnZlcnNpb25CdWZmZXIgaXMgbnVsbCwgYnlwYXNzaW5nIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkYXRhX2J5cGFzczsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluQ29udmVyc2lvbkJ1ZmZlci0+YXVkaW9CdWZmZXIoKS0+czE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyLT5hdWRpb0J1ZmZlcigpLT5mMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5DaGFubmVsQ291bnQgKiBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXIgPSBtSW5Db252ZXJzaW9uQnVmZmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtT3V0Q29udmVyc2lvbkJ1ZmZlci5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IG1PdXRDb252ZXJzaW9uQnVmZmVyIGlzIG51bGwsIGJ5cGFzc2luZyIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZGF0YV9ieXBhc3M7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRDb252ZXJzaW9uQnVmZmVyLT5hdWRpb0J1ZmZlcigpLT5zMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5hdWRpb0J1ZmZlcigpLT5mMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Q2hhbm5lbENvdW50ICogbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXIgPSBtT3V0Q29udmVyc2lvbkJ1ZmZlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIHJldCA9IG1FZmZlY3RJbnRlcmZhY2UtPnByb2Nlc3MoKTsKKyNpZmRlZiBGTE9BVF9FRkZFQ1RfQ0hBSU4KKyAgICAgICAgICAgIGlmICghbVN1cHBvcnRzRmxvYXQpIHsgLy8gY29udmVydCBvdXRwdXQgaW50MTZfdCBiYWNrIHRvIGZsb2F0LgorICAgICAgICAgICAgICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gdGFyZ2V0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRDaGFubmVsQ291bnRSZXF1ZXN0ZWQgIT0gb3V0Q2hhbm5lbENvdW50CisgICAgICAgICAgICAgICAgICAgICAgICA/IG1PdXRDb252ZXJzaW9uQnVmZmVyIDogbU91dEJ1ZmZlcjsKKworICAgICAgICAgICAgICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kxNigKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC0+YXVkaW9CdWZmZXIoKS0+ZjMyLAorICAgICAgICAgICAgICAgICAgICAgICAgbU91dENvbnZlcnNpb25CdWZmZXItPmF1ZGlvQnVmZmVyKCktPnMxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dENoYW5uZWxDb3VudCAqIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtT3V0Q2hhbm5lbENvdW50UmVxdWVzdGVkICE9IG91dENoYW5uZWxDb3VudCkgeworICAgICAgICAgICAgICAgIGFkanVzdF9zZWxlY3RlZF9jaGFubmVscyhtT3V0Q29udmVyc2lvbkJ1ZmZlci0+YXVkaW9CdWZmZXIoKS0+ZjMyLCBvdXRDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBtT3V0QnVmZmVyLT5hdWRpb0J1ZmZlcigpLT5mMzIsIG1PdXRDaGFubmVsQ291bnRSZXF1ZXN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmxvYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZsb2F0KSAqIG91dENoYW5uZWxDb3VudCAqIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50KTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9IGVsc2UgeworI2lmZGVmIEZMT0FUX0VGRkVDVF9DSEFJTgorICAgICAgICAgICAgZGF0YV9ieXBhc3M6CisjZW5kaWYKKyAgICAgICAgICAgIGlmICghYXV4VHlwZSAgLyogYXV4IGVmZmVjdHMgZG8gbm90IHJlcXVpcmUgZGF0YSBieXBhc3MgKi8KKyAgICAgICAgICAgICAgICAgICAgJiYgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIucmF3ICE9IG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5yYXcpIHsKKyAgICAgICAgICAgICAgICBpZiAobUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CisgICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVJbnB1dFRvT3V0cHV0KCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5yYXcsIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnJhdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ250ICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgY29weUlucHV0VG9PdXRwdXQoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXQgPSAtRU5PREFUQTsKICAgICAgICAgfQorCiAgICAgICAgIC8vIGZvcmNlIHRyYW5zaXRpb24gdG8gSURMRSBzdGF0ZSB3aGVuIGVuZ2luZSBpcyByZWFkeQogICAgICAgICBpZiAobVN0YXRlID09IFNUT1BQRUQgJiYgcmV0ID09IC1FTk9EQVRBKSB7CiAgICAgICAgICAgICBtRGlzYWJsZVdhaXRDbnQgPSAxOwogICAgICAgICB9CiAKICAgICAgICAgLy8gY2xlYXIgYXV4aWxpYXJ5IGVmZmVjdCBpbnB1dCBidWZmZXIgZm9yIG5leHQgYWNjdW11bGF0aW9uCi0gICAgICAgIGlmICgobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKSB7Ci0gICAgICAgICAgICBtZW1zZXQobUNvbmZpZy5pbnB1dENmZy5idWZmZXIucmF3LCAwLAotICAgICAgICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQqc2l6ZW9mKGludDMyX3QpKTsKKyAgICAgICAgaWYgKGF1eFR5cGUpIHsKKyNpZmRlZiBGTE9BVF9BVVgKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzaXplID0KKyAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudCAqIGluQ2hhbm5lbENvdW50ICogc2l6ZW9mKGZsb2F0KTsKKyNlbHNlCisgICAgICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSA9CisgICAgICAgICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQgKiBpbkNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQzMl90KTsKKyNlbmRpZgorICAgICAgICAgICAgbWVtc2V0KG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnJhdywgMCwgc2l6ZSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQgJiYKKyAgICAgICAgICAgICAgICAvLyBtSW5CdWZmZXItPmF1ZGlvQnVmZmVyKCktPnJhdyAhPSBtT3V0QnVmZmVyLT5hdWRpb0J1ZmZlcigpLT5yYXcKICAgICAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcgIT0gbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLnJhdykgewogICAgICAgICAvLyBJZiBhbiBpbnNlcnQgZWZmZWN0IGlzIGlkbGUgYW5kIGlucHV0IGJ1ZmZlciBpcyBkaWZmZXJlbnQgZnJvbSBvdXRwdXQgYnVmZmVyLAogICAgICAgICAvLyBhY2N1bXVsYXRlIGlucHV0IG9udG8gb3V0cHV0CiAgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IG1DaGFpbi5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChjaGFpbiAhPSAwICYmIGNoYWluLT5hY3RpdmVUcmFja0NudCgpICE9IDApIHsKLSAgICAgICAgICAgIHNpemVfdCBmcmFtZUNudCA9IG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQgKiBGQ0NfMjsgIC8vYWx3YXlzIHN0ZXJlbyBoZXJlCi0gICAgICAgICAgICBpbnQxNl90ICppbiA9IG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnMxNjsKLSAgICAgICAgICAgIGludDE2X3QgKm91dCA9IG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5zMTY7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZyYW1lQ250OyBpKyspIHsKLSAgICAgICAgICAgICAgICBvdXRbaV0gPSBjbGFtcDE2KChpbnQzMl90KW91dFtpXSArIChpbnQzMl90KWluW2ldKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKGNoYWluLmdldCgpICE9IG51bGxwdHIgJiYgY2hhaW4tPmFjdGl2ZVRyYWNrQ250KCkgIT0gMCkgeworICAgICAgICAgICAgYWNjdW11bGF0ZUlucHV0VG9PdXRwdXQoKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTM0OSw2ICs0OTEsNyBAQAogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6Y29uZmlndXJlKCkKIHsKKyAgICBBTE9HVlYoImNvbmZpZ3VyZSgpIHN0YXJ0ZWQiKTsKICAgICBzdGF0dXNfdCBzdGF0dXM7CiAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkOwogICAgIHVpbnQzMl90IHNpemU7CkBAIC0zNjYsMTUgKzUwOSwyOCBAQAogICAgIH0KIAogICAgIC8vIFRPRE86IGhhbmRsZSBjb25maWd1cmF0aW9uIG9mIGVmZmVjdHMgcmVwbGFjaW5nIHRyYWNrIHByb2Nlc3MKKyAgICAvLyBUT0RPOiBoYW5kbGUgY29uZmlndXJhdGlvbiBvZiBpbnB1dCAocmVjb3JkKSBTVyBlZmZlY3RzIGFib3ZlIHRoZSBIQUwsCisgICAgLy8gc2ltaWxhciB0byBvdXRwdXQgRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQvUkVQTEFDRSwKKyAgICAvLyBpbiB3aGljaCBjYXNlIGlucHV0IGNoYW5uZWwgbWFza3Mgc2hvdWxkIGJlIHVzZWQgaGVyZS4KICAgICBjaGFubmVsTWFzayA9IHRocmVhZC0+Y2hhbm5lbE1hc2soKTsKKyAgICBtQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gY2hhbm5lbE1hc2s7CiAgICAgbUNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBjaGFubmVsTWFzazsKIAogICAgIGlmICgobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKSB7Ci0gICAgICAgIG1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9NT05POwotICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICAgICAgQUxPR1YoIk92ZXJyaWRpbmcgYXV4aWxpYXJ5IGVmZmVjdCBpbnB1dCBhcyBNT05PIGFuZCBvdXRwdXQgYXMgU1RFUkVPIik7CisgICAgICAgIGlmIChtQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzICE9IEFVRElPX0NIQU5ORUxfT1VUX01PTk8pIHsKKyAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9NT05POworICAgICAgICAgICAgQUxPR1YoIk92ZXJyaWRpbmcgYXV4aWxpYXJ5IGVmZmVjdCBpbnB1dCBjaGFubmVscyAlI3ggYXMgTU9OTyIsCisgICAgICAgICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMpOworICAgICAgICB9CisjaWZuZGVmIE1VTFRJQ0hBTk5FTF9FRkZFQ1RfQ0hBSU4KKyAgICAgICAgaWYgKG1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzICE9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykgeworICAgICAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgICAgICAgICBBTE9HVigiT3ZlcnJpZGluZyBhdXhpbGlhcnkgZWZmZWN0IG91dHB1dCBjaGFubmVscyAlI3ggYXMgU1RFUkVPIiwKKyAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMpOworICAgICAgICB9CisjZW5kaWYKICAgICB9IGVsc2UgewotICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gY2hhbm5lbE1hc2s7CisjaWZuZGVmIE1VTFRJQ0hBTk5FTF9FRkZFQ1RfQ0hBSU4KICAgICAgICAgLy8gVE9ETzogVXBkYXRlIHRoaXMgbG9naWMgd2hlbiBtdWx0aWNoYW5uZWwgZWZmZWN0cyBhcmUgaW1wbGVtZW50ZWQuCiAgICAgICAgIC8vIEZvciBvZmZsb2FkZWQgdHJhY2tzIGNvbnNpZGVyIG1vbm8gb3V0cHV0IGFzIHN0ZXJlbyBmb3IgcHJvcGVyIGVmZmVjdCBpbml0aWFsaXphdGlvbgogICAgICAgICBpZiAoY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTykgewpAQCAtMzgyLDEwICs1MzgsMTUgQEAKICAgICAgICAgICAgIG1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwogICAgICAgICAgICAgQUxPR1YoIk92ZXJyaWRpbmcgZWZmZWN0IGlucHV0IGFuZCBvdXRwdXQgYXMgU1RFUkVPIik7CiAgICAgICAgIH0KKyNlbmRpZgogICAgIH0KKyAgICBtSW5DaGFubmVsQ291bnRSZXF1ZXN0ZWQgPQorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMpOworICAgIG1PdXRDaGFubmVsQ291bnRSZXF1ZXN0ZWQgPQorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzKTsKIAotICAgIG1Db25maWcuaW5wdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7Ci0gICAgbUNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgbUNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVDsKKyAgICBtQ29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVDsKICAgICBtQ29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHRocmVhZC0+c2FtcGxlUmF0ZSgpOwogICAgIG1Db25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IG1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlOwogICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKQEAgLTQxMywxMiArNTc0LDYgQEAKICAgICBtQ29uZmlnLm91dHB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CiAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudCA9IHRocmVhZC0+ZnJhbWVDb3VudCgpOwogICAgIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50ID0gbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudDsKLSAgICBpZiAobUluQnVmZmVyICE9IDApIHsKLSAgICAgICAgbUluQnVmZmVyLT5zZXRGcmFtZUNvdW50KG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQpOwotICAgIH0KLSAgICBpZiAobU91dEJ1ZmZlciAhPSAwKSB7Ci0gICAgICAgIG1PdXRCdWZmZXItPnNldEZyYW1lQ291bnQobUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQpOwotICAgIH0KIAogICAgIEFMT0dWKCJjb25maWd1cmUoKSAlcCB0aHJlYWQgJXAgYnVmZmVyICVwIGZyYW1lY291bnQgJXp1IiwKICAgICAgICAgICAgIHRoaXMsIHRocmVhZC5nZXQoKSwgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIucmF3LCBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50KTsKQEAgLTQyNiw0MyArNTgxLDEwNyBAQAogICAgIHN0YXR1c190IGNtZFN0YXR1czsKICAgICBzaXplID0gc2l6ZW9mKGludCk7CiAgICAgc3RhdHVzID0gbUVmZmVjdEludGVyZmFjZS0+Y29tbWFuZChFRkZFQ1RfQ01EX1NFVF9DT05GSUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihtQ29uZmlnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY21kU3RhdHVzKTsKLSAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgIHN0YXR1cyA9IGNtZFN0YXR1czsKICAgICB9CiAKLSAgICBpZiAoc3RhdHVzID09IDAgJiYKLSAgICAgICAgICAgIChtZW1jbXAoJm1EZXNjcmlwdG9yLnR5cGUsIFNMX0lJRF9WSVNVQUxJWkFUSU9OLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApKSB7Ci0gICAgICAgIHVpbnQzMl90IGJ1ZjMyW3NpemVvZihlZmZlY3RfcGFyYW1fdCkgLyBzaXplb2YodWludDMyX3QpICsgMl07Ci0gICAgICAgIGVmZmVjdF9wYXJhbV90ICpwID0gKGVmZmVjdF9wYXJhbV90ICopYnVmMzI7Ci0KLSAgICAgICAgcC0+cHNpemUgPSBzaXplb2YodWludDMyX3QpOwotICAgICAgICBwLT52c2l6ZSA9IHNpemVvZih1aW50MzJfdCk7Ci0gICAgICAgIHNpemUgPSBzaXplb2YoaW50KTsKLSAgICAgICAgKihpbnQzMl90ICopcC0+ZGF0YSA9IFZJU1VBTElaRVJfUEFSQU1fTEFURU5DWTsKLQotICAgICAgICB1aW50MzJfdCBsYXRlbmN5ID0gMDsKLSAgICAgICAgUGxheWJhY2tUaHJlYWQgKnBidCA9IHRocmVhZC0+bUF1ZGlvRmxpbmdlci0+Y2hlY2tQbGF5YmFja1RocmVhZF9sKHRocmVhZC0+bUlkKTsKLSAgICAgICAgaWYgKHBidCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBsYXRlbmN5ID0gcGJ0LT5sYXRlbmN5X2woKTsKKyNpZmRlZiBNVUxUSUNIQU5ORUxfRUZGRUNUX0NIQUlOCisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJgorICAgICAgICAgICAgdGhyZWFkLT5pc091dHB1dCgpICYmCisgICAgICAgICAgICAobUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8KKyAgICAgICAgICAgICAgICAgICAgfHwgbUNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSkgeworICAgICAgICAvLyBPbGRlciBlZmZlY3RzIG1heSByZXF1aXJlIGV4YWN0IFNURVJFTyBwb3NpdGlvbiBtYXNrLgorICAgICAgICBpZiAobUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pIHsKKyAgICAgICAgICAgIEFMT0dWKCJPdmVycmlkaW5nIGVmZmVjdCBpbnB1dCBjaGFubmVscyAlI3ggYXMgU1RFUkVPIiwgbUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyk7CisgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwogICAgICAgICB9CisgICAgICAgIGlmIChtQ29uZmlnLm91dHB1dENmZy5jaGFubmVscyAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pIHsKKyAgICAgICAgICAgIEFMT0dWKCJPdmVycmlkaW5nIGVmZmVjdCBvdXRwdXQgY2hhbm5lbHMgJSN4IGFzIFNURVJFTyIsIG1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICAgICAgICAgIG1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgICAgICB9CisgICAgICAgIHNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgc3RhdHVzID0gbUVmZmVjdEludGVyZmFjZS0+Y29tbWFuZChFRkZFQ1RfQ01EX1NFVF9DT05GSUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG1Db25maWcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbWRTdGF0dXMpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBjbWRTdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKIAotICAgICAgICAqKChpbnQzMl90ICopcC0+ZGF0YSArIDEpPSBsYXRlbmN5OwotICAgICAgICBtRWZmZWN0SW50ZXJmYWNlLT5jb21tYW5kKEVGRkVDVF9DTURfU0VUX1BBUkFNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWYzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY21kU3RhdHVzKTsKKyNpZmRlZiBGTE9BVF9FRkZFQ1RfQ0hBSU4KKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIG1TdXBwb3J0c0Zsb2F0ID0gdHJ1ZTsKICAgICB9CiAKLSAgICBtTWF4RGlzYWJsZVdhaXRDbnQgPSAoTUFYX0RJU0FCTEVfVElNRV9NUyAqIG1Db25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSkgLwotICAgICAgICAgICAgKDEwMDAgKiBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIuZnJhbWVDb3VudCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HVigiRUZGRUNUX0NNRF9TRVRfQ09ORklHIGZhaWxlZCB3aXRoIGZsb2F0IGZvcm1hdCwgcmV0cnkgd2l0aCBpbnQxNl90LiIpOworICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICAgICAgc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICBzdGF0dXMgPSBtRWZmZWN0SW50ZXJmYWNlLT5jb21tYW5kKEVGRkVDVF9DTURfU0VUX0NPTkZJRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobUNvbmZpZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1Db25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNtZFN0YXR1cyk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IGNtZFN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBtU3VwcG9ydHNGbG9hdCA9IGZhbHNlOworICAgICAgICAgICAgQUxPR1ZWKCJjb25maWcgd29ya2VkIHdpdGggMTYgYml0Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgZmFpbGVkICVkIHdpdGggaW50MTZfdCAoYXMgd2VsbCBhcyBmbG9hdCkiLCBfX2Z1bmNfXywgc3RhdHVzKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAvLyBFc3RhYmxpc2ggQnVmZmVyIHN0cmF0ZWd5CisgICAgICAgIHNldEluQnVmZmVyKG1JbkJ1ZmZlcik7CisgICAgICAgIHNldE91dEJ1ZmZlcihtT3V0QnVmZmVyKTsKKworICAgICAgICAvLyBVcGRhdGUgdmlzdWFsaXplciBsYXRlbmN5CisgICAgICAgIGlmIChtZW1jbXAoJm1EZXNjcmlwdG9yLnR5cGUsIFNMX0lJRF9WSVNVQUxJWkFUSU9OLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGJ1ZjMyW3NpemVvZihlZmZlY3RfcGFyYW1fdCkgLyBzaXplb2YodWludDMyX3QpICsgMl07CisgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcCA9IChlZmZlY3RfcGFyYW1fdCAqKWJ1ZjMyOworCisgICAgICAgICAgICBwLT5wc2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CisgICAgICAgICAgICBwLT52c2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CisgICAgICAgICAgICBzaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgICAgICAqKGludDMyX3QgKilwLT5kYXRhID0gVklTVUFMSVpFUl9QQVJBTV9MQVRFTkNZOworCisgICAgICAgICAgICB1aW50MzJfdCBsYXRlbmN5ID0gMDsKKyAgICAgICAgICAgIFBsYXliYWNrVGhyZWFkICpwYnQgPSB0aHJlYWQtPm1BdWRpb0ZsaW5nZXItPmNoZWNrUGxheWJhY2tUaHJlYWRfbCh0aHJlYWQtPm1JZCk7CisgICAgICAgICAgICBpZiAocGJ0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBsYXRlbmN5ID0gcGJ0LT5sYXRlbmN5X2woKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKigoaW50MzJfdCAqKXAtPmRhdGEgKyAxKT0gbGF0ZW5jeTsKKyAgICAgICAgICAgIG1FZmZlY3RJbnRlcmZhY2UtPmNvbW1hbmQoRUZGRUNUX0NNRF9TRVRfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyA4LAorICAgICAgICAgICAgICAgICAgICAmYnVmMzIsCisgICAgICAgICAgICAgICAgICAgICZzaXplLAorICAgICAgICAgICAgICAgICAgICAmY21kU3RhdHVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50IGNhbm5vdCBiZSB6ZXJvLgorICAgIG1NYXhEaXNhYmxlV2FpdENudCA9ICh1aW50MzJfdClzdGQ6Om1heCgKKyAgICAgICAgICAgICh1aW50NjRfdCkxLCAvLyBtTWF4RGlzYWJsZVdhaXRDbnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4KKyAgICAgICAgICAgICh1aW50NjRfdClNQVhfRElTQUJMRV9USU1FX01TICogbUNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlCisgICAgICAgICAgICAgICAgLyAoKHVpbnQ2NF90KTEwMDAgKiBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIuZnJhbWVDb3VudCkpOwogCiBleGl0OgorICAgIC8vIFRPRE86IGNvbnNpZGVyIGNsZWFyaW5nIG1Db25maWcgb24gZXJyb3IuCiAgICAgbVN0YXR1cyA9IHN0YXR1czsKKyAgICBBTE9HVlYoImNvbmZpZ3VyZSBlbmRlZCIpOwogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTc3NCw2ICs5OTMsOSBAQAogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKKyAgICBBTE9HVlYoInNldEluQnVmZmVyICVwIiwoJmJ1ZmZlcikpOworCisgICAgLy8gbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudCBtYXkgYmUgemVybyBpZiBjb25maWd1cmUoKSBpcyBub3QgY2FsbGVkIHlldC4KICAgICBpZiAoYnVmZmVyICE9IDApIHsKICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIucmF3ID0gYnVmZmVyLT5hdWRpb0J1ZmZlcigpLT5yYXc7CiAgICAgICAgIGJ1ZmZlci0+c2V0RnJhbWVDb3VudChtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50KTsKQEAgLTc4Miw5ICsxMDA0LDQ4IEBACiAgICAgfQogICAgIG1JbkJ1ZmZlciA9IGJ1ZmZlcjsKICAgICBtRWZmZWN0SW50ZXJmYWNlLT5zZXRJbkJ1ZmZlcihidWZmZXIpOworCisjaWZkZWYgRkxPQVRfRUZGRUNUX0NIQUlOCisgICAgLy8gYXV4IGVmZmVjdHMgZG8gaW4gcGxhY2UgY29udmVyc2lvbiB0byBmbG9hdCAtIHdlIGRvbid0IGFsbG9jYXRlIG1JbkNvbnZlcnNpb25CdWZmZXIuCisgICAgLy8gVGhlb3JldGljYWxseSBpbnNlcnQgZWZmZWN0cyBjYW4gYWxzbyBkbyBpbi1wbGFjZSBjb252ZXJzaW9ucyAoZGVzdHJveWluZworICAgIC8vIHRoZSBvcmlnaW5hbCBidWZmZXIpIHdoZW4gdGhlIG91dHB1dCBidWZmZXIgaXMgaWRlbnRpY2FsIHRvIHRoZSBpbnB1dCBidWZmZXIsCisgICAgLy8gYnV0IHdlIGRvbid0IG9wdGltaXplIGZvciBpdCBoZXJlLgorICAgIGNvbnN0IGJvb2wgYXV4VHlwZSA9IChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlk7CisgICAgY29uc3QgdWludDMyX3QgaW5DaGFubmVsQ291bnQgPQorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMpOworICAgIGNvbnN0IGJvb2wgZm9ybWF0TWlzbWF0Y2ggPSAhbVN1cHBvcnRzRmxvYXQgfHwgbUluQ2hhbm5lbENvdW50UmVxdWVzdGVkICE9IGluQ2hhbm5lbENvdW50OworICAgIGlmICghYXV4VHlwZSAmJiBmb3JtYXRNaXNtYXRjaCAmJiBtSW5CdWZmZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAvLyB3ZSBuZWVkIHRvIHRyYW5zbGF0ZSAtIGNyZWF0ZSBoaWRsIHNoYXJlZCBidWZmZXIgYW5kIGludGVyY2VwdAorICAgICAgICBjb25zdCBzaXplX3QgaW5GcmFtZUNvdW50ID0gbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudDsKKyAgICAgICAgLy8gVXNlIEZDQ18yIGluIGNhc2UgbUluQ2hhbm5lbENvdW50UmVxdWVzdGVkIGlzIG1vbm8gYW5kIHRoZSBlZmZlY3QgaXMgc3RlcmVvLgorICAgICAgICBjb25zdCB1aW50MzJfdCBpbkNoYW5uZWxzID0gc3RkOjptYXgoKHVpbnQzMl90KUZDQ18yLCBtSW5DaGFubmVsQ291bnRSZXF1ZXN0ZWQpOworICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IGluQ2hhbm5lbHMgKiBpbkZyYW1lQ291bnQgKiBzdGQ6Om1heChzaXplb2YoaW50MTZfdCksIHNpemVvZihmbG9hdCkpOworCisgICAgICAgIEFMT0dWKCIlczogc2V0SW5CdWZmZXIgdXBkYXRpbmcgZm9yIGluQ2hhbm5lbHM6JWQgaW5GcmFtZUNvdW50OiV6dSB0b3RhbCBzaXplOiV6dSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIGluQ2hhbm5lbHMsIGluRnJhbWVDb3VudCwgc2l6ZSk7CisKKyAgICAgICAgaWYgKHNpemUgPiAwICYmIChtSW5Db252ZXJzaW9uQnVmZmVyLmdldCgpID09IG51bGxwdHIKKyAgICAgICAgICAgICAgICB8fCBzaXplID4gbUluQ29udmVyc2lvbkJ1ZmZlci0+Z2V0U2l6ZSgpKSkgeworICAgICAgICAgICAgbUluQ29udmVyc2lvbkJ1ZmZlci5jbGVhcigpOworICAgICAgICAgICAgQUxPR1YoIiVzOiBhbGxvY2F0aW5nIG1JbkNvbnZlcnNpb25CdWZmZXIgJXp1IiwgX19mdW5jX18sIHNpemUpOworICAgICAgICAgICAgc3A8QXVkaW9GbGluZ2VyPiBhdWRpb0ZsaW5nZXIgPSBtQXVkaW9GbGluZ2VyLnByb21vdGUoKTsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoYXVkaW9GbGluZ2VyID09IG51bGxwdHIsICJFTSBjb3VsZCBub3QgcmV0cmlldmVkIGF1ZGlvRmxpbmdlciIpOworICAgICAgICAgICAgKHZvaWQpYXVkaW9GbGluZ2VyLT5tRWZmZWN0c0ZhY3RvcnlIYWwtPmFsbG9jYXRlQnVmZmVyKHNpemUsICZtSW5Db252ZXJzaW9uQnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUluQ29udmVyc2lvbkJ1ZmZlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtSW5Db252ZXJzaW9uQnVmZmVyLT5zZXRGcmFtZUNvdW50KGluRnJhbWVDb3VudCk7CisgICAgICAgICAgICBtRWZmZWN0SW50ZXJmYWNlLT5zZXRJbkJ1ZmZlcihtSW5Db252ZXJzaW9uQnVmZmVyKTsKKyAgICAgICAgfSBlbHNlIGlmIChzaXplID4gMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzIGNhbm5vdCBjcmVhdGUgbUluQ29udmVyc2lvbkJ1ZmZlciIsIF9fZnVuY19fKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpzZXRPdXRCdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKSB7CisgICAgQUxPR1ZWKCJzZXRPdXRCdWZmZXIgJXAiLCgmYnVmZmVyKSk7CisKKyAgICAvLyBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIuZnJhbWVDb3VudCBtYXkgYmUgemVybyBpZiBjb25maWd1cmUoKSBpcyBub3QgY2FsbGVkIHlldC4KICAgICBpZiAoYnVmZmVyICE9IDApIHsKICAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLnJhdyA9IGJ1ZmZlci0+YXVkaW9CdWZmZXIoKS0+cmF3OwogICAgICAgICBidWZmZXItPnNldEZyYW1lQ291bnQobUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQpOwpAQCAtNzkzLDYgKzEwNTQsMzggQEAKICAgICB9CiAgICAgbU91dEJ1ZmZlciA9IGJ1ZmZlcjsKICAgICBtRWZmZWN0SW50ZXJmYWNlLT5zZXRPdXRCdWZmZXIoYnVmZmVyKTsKKworI2lmZGVmIEZMT0FUX0VGRkVDVF9DSEFJTgorICAgIC8vIE5vdGU6IEFueSBlZmZlY3QgdGhhdCBkb2VzIG5vdCBhY2N1bXVsYXRlIGRvZXMgbm90IG5lZWQgbU91dENvbnZlcnNpb25CdWZmZXIgYW5kCisgICAgLy8gY2FuIGRvIGluLXBsYWNlIGNvbnZlcnNpb24gZnJvbSBpbnQxNl90IHRvIGZsb2F0LiAgV2UgZG9uJ3Qgb3B0aW1pemUgaGVyZS4KKyAgICBjb25zdCB1aW50MzJfdCBvdXRDaGFubmVsQ291bnQgPQorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICBjb25zdCBib29sIGZvcm1hdE1pc21hdGNoID0gIW1TdXBwb3J0c0Zsb2F0IHx8IG1PdXRDaGFubmVsQ291bnRSZXF1ZXN0ZWQgIT0gb3V0Q2hhbm5lbENvdW50OworICAgIGlmIChmb3JtYXRNaXNtYXRjaCAmJiBtT3V0QnVmZmVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgY29uc3Qgc2l6ZV90IG91dEZyYW1lQ291bnQgPSBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIuZnJhbWVDb3VudDsKKyAgICAgICAgLy8gVXNlIEZDQ18yIGluIGNhc2UgbU91dENoYW5uZWxDb3VudFJlcXVlc3RlZCBpcyBtb25vIGFuZCB0aGUgZWZmZWN0IGlzIHN0ZXJlby4KKyAgICAgICAgY29uc3QgdWludDMyX3Qgb3V0Q2hhbm5lbHMgPSBzdGQ6Om1heCgodWludDMyX3QpRkNDXzIsIG1PdXRDaGFubmVsQ291bnRSZXF1ZXN0ZWQpOworICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IG91dENoYW5uZWxzICogb3V0RnJhbWVDb3VudCAqIHN0ZDo6bWF4KHNpemVvZihpbnQxNl90KSwgc2l6ZW9mKGZsb2F0KSk7CisKKyAgICAgICAgQUxPR1YoIiVzOiBzZXRPdXRCdWZmZXIgdXBkYXRpbmcgZm9yIG91dENoYW5uZWxzOiVkIG91dEZyYW1lQ291bnQ6JXp1IHRvdGFsIHNpemU6JXp1IiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgb3V0Q2hhbm5lbHMsIG91dEZyYW1lQ291bnQsIHNpemUpOworCisgICAgICAgIGlmIChzaXplID4gMCAmJiAobU91dENvbnZlcnNpb25CdWZmZXIuZ2V0KCkgPT0gbnVsbHB0cgorICAgICAgICAgICAgICAgIHx8IHNpemUgPiBtT3V0Q29udmVyc2lvbkJ1ZmZlci0+Z2V0U2l6ZSgpKSkgeworICAgICAgICAgICAgbU91dENvbnZlcnNpb25CdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgIEFMT0dWKCIlczogYWxsb2NhdGluZyBtT3V0Q29udmVyc2lvbkJ1ZmZlciAlenUiLCBfX2Z1bmNfXywgc2l6ZSk7CisgICAgICAgICAgICBzcDxBdWRpb0ZsaW5nZXI+IGF1ZGlvRmxpbmdlciA9IG1BdWRpb0ZsaW5nZXIucHJvbW90ZSgpOworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihhdWRpb0ZsaW5nZXIgPT0gbnVsbHB0ciwgIkVNIGNvdWxkIG5vdCByZXRyaWV2ZWQgYXVkaW9GbGluZ2VyIik7CisgICAgICAgICAgICAodm9pZClhdWRpb0ZsaW5nZXItPm1FZmZlY3RzRmFjdG9yeUhhbC0+YWxsb2NhdGVCdWZmZXIoc2l6ZSwgJm1PdXRDb252ZXJzaW9uQnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobU91dENvbnZlcnNpb25CdWZmZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbU91dENvbnZlcnNpb25CdWZmZXItPnNldEZyYW1lQ291bnQob3V0RnJhbWVDb3VudCk7CisgICAgICAgICAgICBtRWZmZWN0SW50ZXJmYWNlLT5zZXRPdXRCdWZmZXIobU91dENvbnZlcnNpb25CdWZmZXIpOworICAgICAgICB9IGVsc2UgaWYgKHNpemUgPiAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgY2Fubm90IGNyZWF0ZSBtT3V0Q29udmVyc2lvbkJ1ZmZlciIsIF9fZnVuY19fKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6c2V0Vm9sdW1lKHVpbnQzMl90ICpsZWZ0LCB1aW50MzJfdCAqcmlnaHQsIGJvb2wgY29udHJvbGxlcikKQEAgLTEwNjMsMTUgKzEzNTYsMjYgQEAKICAgICByZXR1cm4gczsKIH0KIAorc3RhdGljIHN0ZDo6c3RyaW5nIGR1bXBJbk91dEJ1ZmZlcihib29sIGlzSW5wdXQsIGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gJmJ1ZmZlcikgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworCisgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiAibnVsbHB0ciI7IC8vIG1ha2UgZGlmZmVyZW50IHRoYW4gYmVsb3cKKyAgICB9IGVsc2UgaWYgKGJ1ZmZlci0+ZXh0ZXJuYWxEYXRhKCkgIT0gbnVsbHB0cikgeworICAgICAgICBzcyA8PCAoaXNJbnB1dCA/IGJ1ZmZlci0+ZXh0ZXJuYWxEYXRhKCkgOiBidWZmZXItPmF1ZGlvQnVmZmVyKCktPnJhdykKKyAgICAgICAgICAgICAgICA8PCAiIC0+ICIKKyAgICAgICAgICAgICAgICA8PCAoaXNJbnB1dCA/IGJ1ZmZlci0+YXVkaW9CdWZmZXIoKS0+cmF3IDogYnVmZmVyLT5leHRlcm5hbERhdGEoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3MgPDwgYnVmZmVyLT5hdWRpb0J1ZmZlcigpLT5yYXc7CisgICAgfQorICAgIHJldHVybiBzcy5zdHIoKTsKK30KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07CiAgICAgU3RyaW5nOCByZXN1bHQ7CiAKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdEVmZmVjdCBJRCAlZDpcbiIsIG1JZCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlx0RWZmZWN0IElEICVkOlxuIiwgbUlkKTsKIAogICAgIGJvb2wgbG9ja2VkID0gQXVkaW9GbGluZ2VyOjpkdW1wVHJ5TG9jayhtTG9jayk7CiAgICAgLy8gZmFpbGVkIHRvIGxvY2sgLSBBdWRpb0ZsaW5nZXIgaXMgcHJvYmFibHkgZGVhZGxvY2tlZApAQCAtMTA4MCw1OSArMTM4NCw2NCBAQAogICAgIH0KIAogICAgIHJlc3VsdC5hcHBlbmQoIlx0XHRTZXNzaW9uIFN0YXR1cyBTdGF0ZSBFbmdpbmU6XG4iKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0JTA1ZCAgICUwM2QgICAgJTAzZCAgICVwXG4iLAorICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlx0XHQlMDVkICAgJTAzZCAgICAlMDNkICAgJXBcbiIsCiAgICAgICAgICAgICBtU2Vzc2lvbklkLCBtU3RhdHVzLCBtU3RhdGUsIG1FZmZlY3RJbnRlcmZhY2UuZ2V0KCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKIAogICAgIHJlc3VsdC5hcHBlbmQoIlx0XHREZXNjcmlwdG9yOlxuIik7CiAgICAgY2hhciB1dWlkU3RyWzY0XTsKICAgICBBdWRpb0VmZmVjdDo6Z3VpZFRvU3RyaW5nKCZtRGVzY3JpcHRvci51dWlkLCB1dWlkU3RyLCBzaXplb2YodXVpZFN0cikpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHQtIFVVSUQ6ICVzXG4iLCB1dWlkU3RyKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiXHRcdC0gVVVJRDogJXNcbiIsIHV1aWRTdHIpOwogICAgIEF1ZGlvRWZmZWN0OjpndWlkVG9TdHJpbmcoJm1EZXNjcmlwdG9yLnR5cGUsIHV1aWRTdHIsIHNpemVvZih1dWlkU3RyKSk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdC0gVFlQRTogJXNcbiIsIHV1aWRTdHIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0LSBhcGlWZXJzaW9uOiAlMDhYXG5cdFx0LSBmbGFnczogJTA4WCAoJXMpXG4iLAorICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlx0XHQtIFRZUEU6ICVzXG4iLCB1dWlkU3RyKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJcdFx0LSBhcGlWZXJzaW9uOiAlMDhYXG5cdFx0LSBmbGFnczogJTA4WCAoJXMpXG4iLAogICAgICAgICAgICAgbURlc2NyaXB0b3IuYXBpVmVyc2lvbiwKICAgICAgICAgICAgIG1EZXNjcmlwdG9yLmZsYWdzLAogICAgICAgICAgICAgZWZmZWN0RmxhZ3NUb1N0cmluZyhtRGVzY3JpcHRvci5mbGFncykuc3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0LSBuYW1lOiAlc1xuIiwKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJcdFx0LSBuYW1lOiAlc1xuIiwKICAgICAgICAgICAgIG1EZXNjcmlwdG9yLm5hbWUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0LSBpbXBsZW1lbnRvcjogJXNcbiIsCisKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJcdFx0LSBpbXBsZW1lbnRvcjogJXNcbiIsCiAgICAgICAgICAgICBtRGVzY3JpcHRvci5pbXBsZW1lbnRvcik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiXHRcdC0gZGF0YTogJXNcbiIsIG1TdXBwb3J0c0Zsb2F0ID8gImZsb2F0IiA6ICJpbnQxNiIpOwogCiAgICAgcmVzdWx0LmFwcGVuZCgiXHRcdC0gSW5wdXQgY29uZmlndXJhdGlvbjpcbiIpOwotICAgIHJlc3VsdC5hcHBlbmQoIlx0XHRcdEZyYW1lcyAgU21wIHJhdGUgQ2hhbm5lbHMgRm9ybWF0IEJ1ZmZlclxuIik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdFx0JTA1enUgICAlMDVkICAgICUwOHggJTZkICglcykgJXBcbiIsCisgICAgcmVzdWx0LmFwcGVuZCgiXHRcdFx0QnVmZmVyICAgICBGcmFtZXMgIFNtcCByYXRlIENoYW5uZWxzIEZvcm1hdFxuIik7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiXHRcdFx0JXAgJTA1enUgICAlMDVkICAgICUwOHggJTZkICglcylcbiIsCisgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcsCiAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50LAogICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzLAogICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5mb3JtYXQsCi0gICAgICAgICAgICBmb3JtYXRUb1N0cmluZygoYXVkaW9fZm9ybWF0X3QpbUNvbmZpZy5pbnB1dENmZy5mb3JtYXQpLmNfc3RyKCksCi0gICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIGZvcm1hdFRvU3RyaW5nKChhdWRpb19mb3JtYXRfdCltQ29uZmlnLmlucHV0Q2ZnLmZvcm1hdCkuY19zdHIoKSk7CiAKICAgICByZXN1bHQuYXBwZW5kKCJcdFx0LSBPdXRwdXQgY29uZmlndXJhdGlvbjpcbiIpOwogICAgIHJlc3VsdC5hcHBlbmQoIlx0XHRcdEJ1ZmZlciAgICAgRnJhbWVzICBTbXAgcmF0ZSBDaGFubmVscyBGb3JtYXRcbiIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHRcdCVwICUwNXp1ICAgJTA1ZCAgICAlMDh4ICVkICglcylcbiIsCisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiXHRcdFx0JXAgJTA1enUgICAlMDVkICAgICUwOHggJTZkICglcylcbiIsCiAgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIucmF3LAogICAgICAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQsCiAgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5jaGFubmVscywKICAgICAgICAgICAgIG1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCwKICAgICAgICAgICAgIGZvcm1hdFRvU3RyaW5nKChhdWRpb19mb3JtYXRfdCltQ29uZmlnLm91dHB1dENmZy5mb3JtYXQpLmNfc3RyKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHQlenUgQ2xpZW50czpcbiIsIG1IYW5kbGVzLnNpemUoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworI2lmZGVmIEZMT0FUX0VGRkVDVF9DSEFJTgorCisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiXHRcdC0gSEFMIGJ1ZmZlcnM6XG4iCisgICAgICAgICAgICAiXHRcdFx0SW4oJXMpIEluQ29udmVyc2lvbiglcykgT3V0KCVzKSBPdXRDb252ZXJzaW9uKCVzKVxuIiwKKyAgICAgICAgICAgIGR1bXBJbk91dEJ1ZmZlcih0cnVlIC8qIGlzSW5wdXQgKi8sIG1JbkJ1ZmZlcikuY19zdHIoKSwKKyAgICAgICAgICAgIGR1bXBJbk91dEJ1ZmZlcih0cnVlIC8qIGlzSW5wdXQgKi8sIG1JbkNvbnZlcnNpb25CdWZmZXIpLmNfc3RyKCksCisgICAgICAgICAgICBkdW1wSW5PdXRCdWZmZXIoZmFsc2UgLyogaXNJbnB1dCAqLywgbU91dEJ1ZmZlcikuY19zdHIoKSwKKyAgICAgICAgICAgIGR1bXBJbk91dEJ1ZmZlcihmYWxzZSAvKiBpc0lucHV0ICovLCBtT3V0Q29udmVyc2lvbkJ1ZmZlcikuY19zdHIoKSk7CisjZW5kaWYKKworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlx0XHQlenUgQ2xpZW50czpcbiIsIG1IYW5kbGVzLnNpemUoKSk7CiAgICAgcmVzdWx0LmFwcGVuZCgiXHRcdFx0ICBQaWQgUHJpb3JpdHkgQ3RybCBMb2NrZWQgY2xpZW50IHNlcnZlclxuIik7CisgICAgY2hhciBidWZmZXJbMjU2XTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1IYW5kbGVzLnNpemUoKTsgKytpKSB7CiAgICAgICAgIEVmZmVjdEhhbmRsZSAqaGFuZGxlID0gbUhhbmRsZXNbaV07CiAgICAgICAgIGlmIChoYW5kbGUgIT0gTlVMTCAmJiAhaGFuZGxlLT5kaXNjb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgaGFuZGxlLT5kdW1wVG9CdWZmZXIoYnVmZmVyLCBTSVpFKTsKKyAgICAgICAgICAgIGhhbmRsZS0+ZHVtcFRvQnVmZmVyKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTU5OCwxMiArMTkwNyw5IEBACiAgICAgaWYgKG1JbkJ1ZmZlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgLy8gVE9ETzogVGhpcyB3aWxsIGNoYW5nZSBpbiB0aGUgZnV0dXJlLCBkZXBlbmRpbmcgb24gbXVsdGljaGFubmVsCi0gICAgLy8gYW5kIHNhbXBsZSBmb3JtYXQgY2hhbmdlcyBmb3IgZWZmZWN0cy4KLSAgICAvLyBDdXJyZW50bHkgZWZmZWN0cyBwcm9jZXNzaW5nIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBzdGVyZW8sIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCi0gICAgLy8gKDQgYnl0ZXMgZnJhbWUgc2l6ZSkKICAgICBjb25zdCBzaXplX3QgZnJhbWVTaXplID0KLSAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpICogbWluKEZDQ18yLCB0aHJlYWQtPmNoYW5uZWxDb3VudCgpKTsKKyAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoRUZGRUNUX0JVRkZFUl9GT1JNQVQpICogdGhyZWFkLT5jaGFubmVsQ291bnQoKTsKKwogICAgIG1lbXNldChtSW5CdWZmZXItPmF1ZGlvQnVmZmVyKCktPnJhdywgMCwgdGhyZWFkLT5mcmFtZUNvdW50KCkgKiBmcmFtZVNpemUpOwogICAgIG1JbkJ1ZmZlci0+Y29tbWl0KCk7CiB9CkBAIC0xNzE4LDggKzIwMjQsMTMgQEAKICAgICAgICAgLy8gY2FsbGluZyB0aGUgcHJvY2VzcyBpbiBlZmZlY3QgZW5naW5lCiAgICAgICAgIHNpemVfdCBudW1TYW1wbGVzID0gdGhyZWFkLT5mcmFtZUNvdW50KCk7CiAgICAgICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gaGFsQnVmZmVyOwotICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U6OmFsbG9jYXRlKAorI2lmZGVmIEZMT0FUX0VGRkVDVF9DSEFJTgorICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSB0aHJlYWQtPm1BdWRpb0ZsaW5nZXItPm1FZmZlY3RzRmFjdG9yeUhhbC0+YWxsb2NhdGVCdWZmZXIoCisgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyAqIHNpemVvZihmbG9hdCksICZoYWxCdWZmZXIpOworI2Vsc2UKKyAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gdGhyZWFkLT5tQXVkaW9GbGluZ2VyLT5tRWZmZWN0c0ZhY3RvcnlIYWwtPmFsbG9jYXRlQnVmZmVyKAogICAgICAgICAgICAgICAgIG51bVNhbXBsZXMgKiBzaXplb2YoaW50MzJfdCksICZoYWxCdWZmZXIpOworI2VuZGlmCiAgICAgICAgIGlmIChyZXN1bHQgIT0gT0spIHJldHVybiByZXN1bHQ7CiAgICAgICAgIGVmZmVjdC0+c2V0SW5CdWZmZXIoaGFsQnVmZmVyKTsKICAgICAgICAgLy8gYXV4aWxpYXJ5IGVmZmVjdHMgb3V0cHV0IHNhbXBsZXMgdG8gY2hhaW4gaW5wdXQgYnVmZmVyIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcKQEAgLTE5NTksMTkgKzIyNzAsNiBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgZHVtcEluT3V0QnVmZmVyKAotICAgICAgICBjaGFyICpkdW1wLCBzaXplX3QgZHVtcFNpemUsIGJvb2wgaXNJbnB1dCwgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlICpidWZmZXIpIHsKLSAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKLSAgICAgICAgc25wcmludGYoZHVtcCwgZHVtcFNpemUsICIlcCIsIGJ1ZmZlcik7Ci0gICAgfSBlbHNlIGlmIChidWZmZXItPmV4dGVybmFsRGF0YSgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgc25wcmludGYoZHVtcCwgZHVtcFNpemUsICIlcCAtPiAlcCIsCi0gICAgICAgICAgICAgICAgaXNJbnB1dCA/IGJ1ZmZlci0+ZXh0ZXJuYWxEYXRhKCkgOiBidWZmZXItPmF1ZGlvQnVmZmVyKCktPnJhdywKLSAgICAgICAgICAgICAgICBpc0lucHV0ID8gYnVmZmVyLT5hdWRpb0J1ZmZlcigpLT5yYXcgOiBidWZmZXItPmV4dGVybmFsRGF0YSgpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzbnByaW50ZihkdW1wLCBkdW1wU2l6ZSwgIiVwIiwgYnVmZmVyLT5hdWRpb0J1ZmZlcigpLT5yYXcpOwotICAgIH0KLX0KLQogdm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKIHsKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKQEAgLTE5ODksMTUgKzIyODcsMTMgQEAKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlx0Q291bGQgbm90IGxvY2sgbXV0ZXg6XG4iKTsKICAgICAgICAgfQogCi0gICAgICAgIGNoYXIgaW5CdWZmZXJTdHJbNjRdLCBvdXRCdWZmZXJTdHJbNjRdOwotICAgICAgICBkdW1wSW5PdXRCdWZmZXIoaW5CdWZmZXJTdHIsIHNpemVvZihpbkJ1ZmZlclN0ciksIHRydWUsIG1JbkJ1ZmZlci5nZXQoKSk7Ci0gICAgICAgIGR1bXBJbk91dEJ1ZmZlcihvdXRCdWZmZXJTdHIsIHNpemVvZihvdXRCdWZmZXJTdHIpLCBmYWxzZSwgbU91dEJ1ZmZlci5nZXQoKSk7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0JS0qcyUtKnMgICBBY3RpdmUgdHJhY2tzOlxuIiwKLSAgICAgICAgICAgICAgICAoaW50KXN0cmxlbihpbkJ1ZmZlclN0ciksICJJbiBidWZmZXIgICAgIiwKLSAgICAgICAgICAgICAgICAoaW50KXN0cmxlbihvdXRCdWZmZXJTdHIpLCAiT3V0IGJ1ZmZlciAgICAgICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0JXMgICAlcyAgICVkXG4iLCBpbkJ1ZmZlclN0ciwgb3V0QnVmZmVyU3RyLCBtQWN0aXZlVHJhY2tDbnQpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGluQnVmZmVyU3RyID0gZHVtcEluT3V0QnVmZmVyKHRydWUgLyogaXNJbnB1dCAqLywgbUluQnVmZmVyKTsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgb3V0QnVmZmVyU3RyID0gZHVtcEluT3V0QnVmZmVyKGZhbHNlIC8qIGlzSW5wdXQgKi8sIG1PdXRCdWZmZXIpOworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJcdCUtKnMlLSpzICAgQWN0aXZlIHRyYWNrczpcbiIsCisgICAgICAgICAgICAgICAgKGludClpbkJ1ZmZlclN0ci5zaXplKCksICJJbiBidWZmZXIgICAgIiwKKyAgICAgICAgICAgICAgICAoaW50KW91dEJ1ZmZlclN0ci5zaXplKCksICJPdXQgYnVmZmVyICAgICAgIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlx0JXMgICAlcyAgICVkXG4iLAorICAgICAgICAgICAgICAgIGluQnVmZmVyU3RyLmNfc3RyKCksIG91dEJ1ZmZlclN0ci5jX3N0cigpLCBtQWN0aXZlVHJhY2tDbnQpOwogICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKIAogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUVmZmVjdHM7ICsraSkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmgKaW5kZXggZTI5Nzk4Yi4uMjMyN2JiOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oCkBAIC0xNjgsNiArMTY4LDE0IEBACiAgICAgYm9vbCAgICAgbVN1c3BlbmRlZDsgICAgICAgICAgICAvLyBlZmZlY3QgaXMgc3VzcGVuZGVkOiB0ZW1wb3JhcmlseSBkaXNhYmxlZCBieSBmcmFtZXdvcmsKICAgICBib29sICAgICBtT2ZmbG9hZGVkOyAgICAgICAgICAgIC8vIGVmZmVjdCBpcyBjdXJyZW50bHkgb2ZmbG9hZGVkIHRvIHRoZSBhdWRpbyBEU1AKICAgICB3cDxBdWRpb0ZsaW5nZXI+ICAgIG1BdWRpb0ZsaW5nZXI7CisKKyNpZmRlZiBGTE9BVF9FRkZFQ1RfQ0hBSU4KKyAgICBib29sICAgIG1TdXBwb3J0c0Zsb2F0OyAgICAgICAgIC8vIGVmZmVjdCBzdXBwb3J0cyBmbG9hdCBwcm9jZXNzaW5nCisgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiBtSW5Db252ZXJzaW9uQnVmZmVyOyAgLy8gQnVmZmVycyBmb3IgSEFMIGNvbnZlcnNpb24gaWYgbmVlZGVkLgorICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gbU91dENvbnZlcnNpb25CdWZmZXI7CisgICAgdWludDMyX3QgbUluQ2hhbm5lbENvdW50UmVxdWVzdGVkOworICAgIHVpbnQzMl90IG1PdXRDaGFubmVsQ291bnRSZXF1ZXN0ZWQ7CisjZW5kaWYKIH07CiAKIC8vIFRoZSBFZmZlY3RIYW5kbGUgY2xhc3MgaW1wbGVtZW50cyB0aGUgSUVmZmVjdCBpbnRlcmZhY2UuIEl0IHByb3ZpZGVzIHJlc291cmNlcwpAQCAtMzA4LDE0ICszMTYsMTQgQEAKICAgICB2b2lkIHNldEluQnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcikgewogICAgICAgICBtSW5CdWZmZXIgPSBidWZmZXI7CiAgICAgfQotICAgIGludDE2X3QgKmluQnVmZmVyKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbUluQnVmZmVyICE9IDAgPyByZWludGVycHJldF9jYXN0PGludDE2X3QqPihtSW5CdWZmZXItPnB0cigpKSA6IE5VTEw7CisgICAgZWZmZWN0X2J1ZmZlcl90ICppbkJ1ZmZlcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1JbkJ1ZmZlciAhPSAwID8gcmVpbnRlcnByZXRfY2FzdDxlZmZlY3RfYnVmZmVyX3QqPihtSW5CdWZmZXItPnB0cigpKSA6IE5VTEw7CiAgICAgfQogICAgIHZvaWQgc2V0T3V0QnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcikgewogICAgICAgICBtT3V0QnVmZmVyID0gYnVmZmVyOwogICAgIH0KLSAgICBpbnQxNl90ICpvdXRCdWZmZXIoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtT3V0QnVmZmVyICE9IDAgPyByZWludGVycHJldF9jYXN0PGludDE2X3QqPihtT3V0QnVmZmVyLT5wdHIoKSkgOiBOVUxMOworICAgIGVmZmVjdF9idWZmZXJfdCAqb3V0QnVmZmVyKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU91dEJ1ZmZlciAhPSAwID8gcmVpbnRlcnByZXRfY2FzdDxlZmZlY3RfYnVmZmVyX3QqPihtT3V0QnVmZmVyLT5wdHIoKSkgOiBOVUxMOwogICAgIH0KIAogICAgIHZvaWQgaW5jVHJhY2tDbnQoKSB7IGFuZHJvaWRfYXRvbWljX2luYygmbVRyYWNrQ250KTsgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcAppbmRleCBjMTBmYTA1Li43OWJiOWZlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcApAQCAtNzksNyArNzksNiBAQAogCiAgICAgdW5zaWduZWQgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgRmFzdE1peGVyU3RhdGU6OnNNYXhGYXN0VHJhY2tzOyArK2kpIHsKLSAgICAgICAgbUZhc3RUcmFja05hbWVzW2ldID0gLTE7CiAgICAgICAgIG1HZW5lcmF0aW9uc1tpXSA9IDA7CiAgICAgfQogI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKQEAgLTEzOCw4ICsxMzcsNiBAQAogCiB2b2lkIEZhc3RNaXhlcjo6b25TdGF0ZUNoYW5nZSgpCiB7Ci0gICAgLy8gbG9nIHRoYXQgYXVkaW8gd2FzIHR1cm5lZCBvbi9vZmYKLSAgICBMT0dfQVVESU9fU1RBVEUoKTsKICAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdE1peGVyU3RhdGUgKikgbUN1cnJlbnQ7CiAgICAgY29uc3QgRmFzdE1peGVyU3RhdGUgKiBjb25zdCBwcmV2aW91cyA9IChjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKSBtUHJldmlvdXM7CiAgICAgRmFzdE1peGVyRHVtcFN0YXRlICogY29uc3QgZHVtcFN0YXRlID0gKEZhc3RNaXhlckR1bXBTdGF0ZSAqKSBtRHVtcFN0YXRlOwpAQCAtMTkyLDcgKzE4OSw3IEBACiAgICAgICAgICAgICAvLyBGSVhNRSBuZXcgbWF5IGJsb2NrIGZvciB1bmJvdW5kZWQgdGltZSBhdCBpbnRlcm5hbCBtdXRleCBvZiB0aGUgaGVhcAogICAgICAgICAgICAgLy8gICAgICAgaW1wbGVtZW50YXRpb247IGl0IHdvdWxkIGJlIGJldHRlciB0byBoYXZlIG5vcm1hbCBtaXhlciBhbGxvY2F0ZSBmb3IgdXMKICAgICAgICAgICAgIC8vICAgICAgIHRvIGF2b2lkIGJsb2NraW5nIGhlcmUgYW5kIHRvIHByZXZlbnQgcG9zc2libGUgcHJpb3JpdHkgaW52ZXJzaW9uCi0gICAgICAgICAgICBtTWl4ZXIgPSBuZXcgQXVkaW9NaXhlcihmcmFtZUNvdW50LCBtU2FtcGxlUmF0ZSwgRmFzdE1peGVyU3RhdGU6OnNNYXhGYXN0VHJhY2tzKTsKKyAgICAgICAgICAgIG1NaXhlciA9IG5ldyBBdWRpb01peGVyKGZyYW1lQ291bnQsIG1TYW1wbGVSYXRlKTsKICAgICAgICAgICAgIC8vIEZJWE1FIFNlZSB0aGUgb3RoZXIgRklYTUUgYXQgRmFzdE1peGVyOjpzZXROQkxvZ1dyaXRlcigpCiAgICAgICAgICAgICBjb25zdCBzaXplX3QgbWl4ZXJGcmFtZVNpemUgPSBtU2lua0NoYW5uZWxDb3VudAogICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobU1peGVyQnVmZmVyRm9ybWF0KTsKQEAgLTIxOSwxMSArMjE2LDYgQEAKICAgICAgICAgICAgIG1XYXJtdXBOc01heCA9IExPTkdfTUFYOwogICAgICAgICB9CiAgICAgICAgIG1NaXhlckJ1ZmZlclN0YXRlID0gVU5ERUZJTkVEOwotI2lmICFMT0dfTkRFQlVHCi0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBGYXN0TWl4ZXJTdGF0ZTo6c01heEZhc3RUcmFja3M7ICsraSkgewotICAgICAgICAgICAgbUZhc3RUcmFja05hbWVzW2ldID0gLTE7Ci0gICAgICAgIH0KLSNlbmRpZgogICAgICAgICAvLyB3ZSBuZWVkIHRvIHJlY29uZmlndXJlIGFsbCBhY3RpdmUgdHJhY2tzCiAgICAgICAgIHByZXZpb3VzVHJhY2tNYXNrID0gMDsKICAgICAgICAgbUZhc3RUcmFja3NHZW4gPSBjdXJyZW50LT5tRmFzdFRyYWNrc0dlbiAtIDE7CkBAIC0yMzcsNyArMjI5LDYgQEAKICAgICBkdW1wU3RhdGUtPm1UcmFja01hc2sgPSBjdXJyZW50VHJhY2tNYXNrOwogICAgIGlmIChjdXJyZW50LT5tRmFzdFRyYWNrc0dlbiAhPSBtRmFzdFRyYWNrc0dlbikgewogICAgICAgICBBTE9HX0FTU0VSVChtTWl4ZXJCdWZmZXIgIT0gTlVMTCk7Ci0gICAgICAgIGludCBuYW1lOwogCiAgICAgICAgIC8vIHByb2Nlc3MgcmVtb3ZlZCB0cmFja3MgZmlyc3QgdG8gYXZvaWQgcnVubmluZyBvdXQgb2YgdHJhY2sgbmFtZXMKICAgICAgICAgdW5zaWduZWQgcmVtb3ZlZFRyYWNrcyA9IHByZXZpb3VzVHJhY2tNYXNrICYgfmN1cnJlbnRUcmFja01hc2s7CkBAIC0yNDcsMTMgKzIzOCw4IEBACiAgICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyID09IE5VTEwpOwogICAgICAgICAgICAgaWYgKG1NaXhlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbmFtZSA9IG1GYXN0VHJhY2tOYW1lc1tpXTsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChuYW1lID49IDApOwotICAgICAgICAgICAgICAgIG1NaXhlci0+ZGVsZXRlVHJhY2tOYW1lKG5hbWUpOworICAgICAgICAgICAgICAgIG1NaXhlci0+ZGVzdHJveShpKTsKICAgICAgICAgICAgIH0KLSNpZiAhTE9HX05ERUJVRwotICAgICAgICAgICAgbUZhc3RUcmFja05hbWVzW2ldID0gLTE7Ci0jZW5kaWYKICAgICAgICAgICAgIC8vIGRvbid0IHJlc2V0IHRyYWNrIGR1bXAgc3RhdGUsIHNpbmNlIG90aGVyIHNpZGUgaXMgaWdub3JpbmcgaXQKICAgICAgICAgICAgIG1HZW5lcmF0aW9uc1tpXSA9IGZhc3RUcmFjay0+bUdlbmVyYXRpb247CiAgICAgICAgIH0KQEAgLTI2NSwxMiArMjUxLDE3IEBACiAgICAgICAgICAgICBhZGRlZFRyYWNrcyAmPSB+KDEgPDwgaSk7CiAgICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIgKmJ1ZmZlclByb3ZpZGVyID0gZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXI7Ci0gICAgICAgICAgICBBTE9HX0FTU0VSVChidWZmZXJQcm92aWRlciAhPSBOVUxMICYmIG1GYXN0VHJhY2tOYW1lc1tpXSA9PSAtMSk7CiAgICAgICAgICAgICBpZiAobU1peGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBuYW1lID0gbU1peGVyLT5nZXRUcmFja05hbWUoZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgY29uc3QgaW50IG5hbWUgPSBpOyAvLyBmb3IgY2xhcml0eSwgY2hvb3NlIG5hbWUgYXMgZmFzdCB0cmFjayBpbmRleC4KKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtTWl4ZXItPmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1DaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUZvcm1hdCwgQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKTsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChuYW1lID49IDApOwotICAgICAgICAgICAgICAgIG1GYXN0VHJhY2tOYW1lc1tpXSA9IG5hbWU7CisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdGF0dXMgIT0gTk9fRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IGNhbm5vdCBjcmVhdGUgdHJhY2sgbmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgJWQsIG1hc2sgJSN4LCBmb3JtYXQgJSN4LCBzZXNzaW9uSWQgJWQgaW4gQXVkaW9NaXhlciIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUNoYW5uZWxNYXNrLCBmYXN0VHJhY2stPm1Gb3JtYXQsIEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCk7CiAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRCdWZmZXJQcm92aWRlcihuYW1lLCBidWZmZXJQcm92aWRlcik7CiAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1BSU5fQlVGRkVSLAogICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTWl4ZXJCdWZmZXIpOwpAQCAtMzAyLDggKzI5Myw3IEBACiAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciAqYnVmZmVyUHJvdmlkZXIgPSBmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlcjsKICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChidWZmZXJQcm92aWRlciAhPSBOVUxMKTsKICAgICAgICAgICAgICAgICBpZiAobU1peGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG1GYXN0VHJhY2tOYW1lc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQobmFtZSA+PSAwKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG5hbWUgPSBpOwogICAgICAgICAgICAgICAgICAgICBtTWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsIGJ1ZmZlclByb3ZpZGVyKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGYgPSBBdWRpb01peGVyOjpVTklUWV9HQUlOX0ZMT0FUOwpAQCAtMzM2LDcgKzMyNiwxMyBAQAogCiB2b2lkIEZhc3RNaXhlcjo6b25Xb3JrKCkKIHsKLSAgICBMT0dfSElTVF9UUygpOworICAgIC8vIFRPRE86IHBhc3MgYW4gSUQgcGFyYW1ldGVyIHRvIGluZGljYXRlIHdoaWNoIHRpbWUgc2VyaWVzIHdlIHdhbnQgdG8gd3JpdGUgdG8gaW4gTkJMb2cuY3BwCisgICAgLy8gT3I6IHBhc3MgYm90aCBvZiB0aGVzZSBpbnRvIGEgc2luZ2xlIGNhbGwgd2l0aCBhIGJvb2xlYW4KKyAgICBpZiAobUlzV2FybSkgeworICAgICAgICBMT0dfSElTVF9UUygpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR19BVURJT19TVEFURSgpOworICAgIH0KICAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdE1peGVyU3RhdGUgKikgbUN1cnJlbnQ7CiAgICAgRmFzdE1peGVyRHVtcFN0YXRlICogY29uc3QgZHVtcFN0YXRlID0gKEZhc3RNaXhlckR1bXBTdGF0ZSAqKSBtRHVtcFN0YXRlOwogICAgIGNvbnN0IEZhc3RNaXhlclN0YXRlOjpDb21tYW5kIGNvbW1hbmQgPSBtQ29tbWFuZDsKQEAgLTM3NCw4ICszNzAsNyBAQAogICAgICAgICAgICAgcGVyVHJhY2tUaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdID0gdHJhY2tGcmFtZXNXcml0dGVuOwogICAgICAgICAgICAgZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXItPm9uVGltZXN0YW1wKHBlclRyYWNrVGltZXN0YW1wKTsKIAotICAgICAgICAgICAgaW50IG5hbWUgPSBtRmFzdFRyYWNrTmFtZXNbaV07Ci0gICAgICAgICAgICBBTE9HX0FTU0VSVChuYW1lID49IDApOworICAgICAgICAgICAgY29uc3QgaW50IG5hbWUgPSBpOwogICAgICAgICAgICAgaWYgKGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBnYWluX21pbmlmbG9hdF9wYWNrZWRfdCB2bHIgPSBmYXN0VHJhY2stPm1Wb2x1bWVQcm92aWRlci0+Z2V0Vm9sdW1lTFIoKTsKICAgICAgICAgICAgICAgICBmbG9hdCB2bGYgPSBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX2xlZnQodmxyKSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmgKaW5kZXggOTMwZmE4ZC4uMjM1ZDIzZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuaApAQCAtNTcsOCArNTcsNiBAQAogICAgIHN0YXRpYyBjb25zdCBGYXN0TWl4ZXJTdGF0ZSBzSW5pdGlhbDsKIAogICAgIEZhc3RNaXhlclN0YXRlICBtUHJlSWRsZTsgICAvLyBjb3B5IG9mIHN0YXRlIGJlZm9yZSB3ZSB3ZW50IGludG8gaWRsZQotICAgIGludCAgICAgICAgICAgICBtRmFzdFRyYWNrTmFtZXNbRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlcyB1c2VkIGJ5IG1peGVyIHRvIGlkZW50aWZ5IHRyYWNrcwogICAgIGludCAgICAgICAgICAgICBtR2VuZXJhdGlvbnNbRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFzdCBvYnNlcnZlZCBtRmFzdFRyYWNrc1tpXS5tR2VuZXJhdGlvbgogICAgIE5CQUlPX1NpbmsqICAgICBtT3V0cHV0U2luazsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5jcHAKaW5kZXggNjQ3NWYyMi4uMmU0ZmI4YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5jcHAKQEAgLTc4LDcgKzc4LDEyIEBACiAgICAgdWludDMyX3QgYm91bmRzID0gbUJvdW5kczsKICAgICB1aW50MzJfdCBuZXdlc3RPcGVuID0gYm91bmRzICYgMHhGRkZGOwogICAgIHVpbnQzMl90IG9sZGVzdENsb3NlZCA9IGJvdW5kcyA+PiAxNjsKLSAgICB1aW50MzJfdCBuID0gKG5ld2VzdE9wZW4gLSBvbGRlc3RDbG9zZWQpICYgMHhGRkZGOworCisgICAgLy91aW50MzJfdCBuID0gKG5ld2VzdE9wZW4gLSBvbGRlc3RDbG9zZWQpICYgMHhGRkZGOworICAgIHVpbnQzMl90IG47CisgICAgX19idWlsdGluX3N1Yl9vdmVyZmxvdyhuZXdlc3RPcGVuLCBvbGRlc3RDbG9zZWQsICZuKTsKKyAgICBuID0gbiAmIDB4RkZGRjsKKwogICAgIGlmIChuID4gbVNhbXBsaW5nTikgewogICAgICAgICBBTE9HRSgidG9vIG1hbnkgc2FtcGxlcyAldSIsIG4pOwogICAgICAgICBuID0gbVNhbXBsaW5nTjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmgKaW5kZXggNWE1NWM3YS4uMmJlMWU5MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmgKQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxtZWRpYS9FeHRlbmRlZEF1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkFJTy5oPgotI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CTG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KICNpbmNsdWRlICJGYXN0VGhyZWFkU3RhdGUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuY3BwCmluZGV4IDg1ODY1YjcuLmRjMTU0ODcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5jcHAKQEAgLTI5Nyw3ICsyOTcsOCBAQAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgaSA9IG1Cb3VuZHMgJiAobUR1bXBTdGF0ZS0+bVNhbXBsaW5nTiAtIDEpOwogICAgICAgICAgICAgICAgICAgICBtQm91bmRzID0gKG1Cb3VuZHMgJiAweEZGRkYwMDAwKSB8ICgobUJvdW5kcyArIDEpICYgMHhGRkZGKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1GdWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQm91bmRzICs9IDB4MTAwMDA7CisgICAgICAgICAgICAgICAgICAgICAgICAvL21Cb3VuZHMgKz0gMHgxMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3cobUJvdW5kcywgMHgxMDAwMCwgJm1Cb3VuZHMpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEobUJvdW5kcyAmIChtRHVtcFN0YXRlLT5tU2FtcGxpbmdOIC0gMSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtRnVsbCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkU3RhdGUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkU3RhdGUuaAppbmRleCBmMThmODQ2Li41NGMwZGM2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZFN0YXRlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWRTdGF0ZS5oCkBAIC0xOSw3ICsxOSw3IEBACiAKICNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJMb2cuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9OQkxvZy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9NbWFwVHJhY2tzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTW1hcFRyYWNrcy5oCmluZGV4IDM2NmExNjQuLjZmNTQ2YzMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9NbWFwVHJhY2tzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL01tYXBUcmFja3MuaApAQCAtMjMsNiArMjMsNyBAQAogY2xhc3MgTW1hcFRyYWNrIDogcHVibGljIFRyYWNrQmFzZSB7CiBwdWJsaWM6CiAgICAgICAgICAgICAgICAgTW1hcFRyYWNrKFRocmVhZEJhc2UgKnRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCkBAIC00Miw2ICs0MywxNSBAQAogICAgICBzdGF0aWMgdm9pZCAgICAgICAgYXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgYXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlKTsKIAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvdGVjdGVkIGJ5IE1NYXBUaHJlYWQ6Om1Mb2NrCisgICAgICAgICAgICB2b2lkICAgICAgICBzZXRTaWxlbmNlZF9sKGJvb2wgc2lsZW5jZWQpIHsgbVNpbGVuY2VkID0gc2lsZW5jZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNpbGVuY2VkTm90aWZpZWQgPSBmYWxzZTt9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm90ZWN0ZWQgYnkgTU1hcFRocmVhZDo6bUxvY2sKKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzU2lsZW5jZWRfbCgpIGNvbnN0IHsgcmV0dXJuIG1TaWxlbmNlZDsgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvdGVjdGVkIGJ5IE1NYXBUaHJlYWQ6Om1Mb2NrCisgICAgICAgICAgICBib29sICAgICAgICBnZXRBbmRTZXRTaWxlbmNlZE5vdGlmaWVkX2woKSB7IGJvb2wgc2lsZW5jZWROb3RpZmllZCA9IG1TaWxlbmNlZE5vdGlmaWVkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2lsZW5jZWROb3RpZmllZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaWxlbmNlZE5vdGlmaWVkOyB9CiBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBNbWFwVGhyZWFkOwogCkBAIC01Nyw1ICs2Nyw3IEBACiAgICAgdmlydHVhbCB2b2lkIG9uVGltZXN0YW1wKGNvbnN0IEV4dGVuZGVkVGltZXN0YW1wICZ0aW1lc3RhbXApOwogCiAgICAgcGlkX3QgbVBpZDsKKyAgICBib29sICBtU2lsZW5jZWQ7ICAgICAgICAgICAgLy8gcHJvdGVjdGVkIGJ5IE1NYXBUaHJlYWQ6Om1Mb2NrCisgICAgYm9vbCAgbVNpbGVuY2VkTm90aWZpZWQ7ICAgIC8vIHByb3RlY3RlZCBieSBNTWFwVGhyZWFkOjptTG9jawogfTsgIC8vIGVuZCBvZiBUcmFjawogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvT1dORVJTIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL09XTkVSUwppbmRleCA3MDNlNGQyLi5kMDJkOWUwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvT1dORVJTCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9PV05FUlMKQEAgLTEsMyArMSw0IEBACiBodW5nYUBnb29nbGUuY29tCiBqbXRyaXZpQGdvb2dsZS5jb20KIG1uYWdhbm92QGdvb2dsZS5jb20KK2drYXN0ZW5AZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCmluZGV4IDI3YzZkMzUuLmU1Y2I4YTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKQEAgLTQ5Nyw5ICs0OTcsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQtPmJ1ZmZlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQtPmJ1ZmZlclNpemUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FKTsKLSAgICBpZiAocGF0Y2gtPm1QYXRjaFRyYWNrID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9CiAgICAgc3RhdHVzID0gcGF0Y2gtPm1QYXRjaFRyYWNrLT5pbml0Q2hlY2soKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oCmluZGV4IDFjMWE5ODkuLmE3OGJlOTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oCkBAIC0yNSw2ICsyNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBUcmFjayggIFBsYXliYWNrVGhyZWFkICp0aHJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCkBAIC01MSw2ICs1MiwxMSBAQAogICAgICAgICAgICAgdm9pZCAgICAgICAgZmx1c2goKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIGRlc3Ryb3koKTsKICAgICAgICAgICAgIGludCAgICAgICAgIG5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQorICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0TmFtZShpbnQgbmFtZSkgeworICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobU5hbWUgPj0gMCAmJiBuYW1lID49IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMgYm90aCBvbGQgbmFtZSAlZCBhbmQgbmV3IG5hbWUgJWQgYXJlIHZhbGlkIiwgX19mdW5jX18sIG1OYW1lLCBuYW1lKTsKKyAgICAgICAgICAgICAgICBtTmFtZSA9IG5hbWU7CisgICAgICAgICAgICB9CiAKICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgIHNhbXBsZVJhdGUoKSBjb25zdDsKIApAQCAtNjgsOCArNzQsOCBAQAogICAgICAgICAgICAgc3RhdHVzX3QgICAgYXR0YWNoQXV4RWZmZWN0KGludCBFZmZlY3RJZCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBzZXRBdXhCdWZmZXIoaW50IEVmZmVjdElkLCBpbnQzMl90ICpidWZmZXIpOwogICAgICAgICAgICAgaW50MzJfdCAgICAgKmF1eEJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1BdXhCdWZmZXI7IH0KLSAgICAgICAgICAgIHZvaWQgICAgICAgIHNldE1haW5CdWZmZXIoaW50MTZfdCAqYnVmZmVyKSB7IG1NYWluQnVmZmVyID0gYnVmZmVyOyB9Ci0gICAgICAgICAgICBpbnQxNl90ICAgICAqbWFpbkJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1NYWluQnVmZmVyOyB9CisgICAgICAgICAgICB2b2lkICAgICAgICBzZXRNYWluQnVmZmVyKGVmZmVjdF9idWZmZXJfdCAqYnVmZmVyKSB7IG1NYWluQnVmZmVyID0gYnVmZmVyOyB9CisgICAgICAgICAgICBlZmZlY3RfYnVmZmVyX3QgKm1haW5CdWZmZXIoKSBjb25zdCB7IHJldHVybiBtTWFpbkJ1ZmZlcjsgfQogICAgICAgICAgICAgaW50ICAgICAgICAgYXV4RWZmZWN0SWQoKSBjb25zdCB7IHJldHVybiBtQXV4RWZmZWN0SWQ7IH0KICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIHNpZ25hbCgpOwpAQCAtODIsMTEgKzg4LDI4IEBACiAgICAgdmlydHVhbCBib29sICAgICAgICBpc0Zhc3RUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSAhPSAwOyB9CiAKIC8vIGltcGxlbWVudCB2b2x1bWUgaGFuZGxpbmcuCi0gICBWb2x1bWVTaGFwZXI6OlN0YXR1cyBhcHBseVZvbHVtZVNoYXBlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pOwotc3A8Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gZ2V0Vm9sdW1lU2hhcGVyU3RhdGUoaW50IGlkKTsKLSAgICBzcDxWb2x1bWVIYW5kbGVyPiAgIGdldFZvbHVtZUhhbmRsZXIoKSB7IHJldHVybiBtVm9sdW1lSGFuZGxlcjsgfQorICAgIG1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXR1cyBhcHBseVZvbHVtZVNoYXBlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbik7CisgICAgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdGU+IGdldFZvbHVtZVNoYXBlclN0YXRlKGludCBpZCk7CisgICAgc3A8bWVkaWE6OlZvbHVtZUhhbmRsZXI+ICAgZ2V0Vm9sdW1lSGFuZGxlcigpIHsgcmV0dXJuIG1Wb2x1bWVIYW5kbGVyOyB9CisgICAgLyoqIFNldCB0aGUgY29tcHV0ZWQgbm9ybWFsaXplZCBmaW5hbCB2b2x1bWUgb2YgdGhlIHRyYWNrLgorICAgICAqICFtYXN0ZXJNdXRlICogbWFzdGVyVm9sdW1lICogc3RyZWFtVm9sdW1lICogYXZlcmFnZUxSVm9sdW1lICovCisgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRGaW5hbFZvbHVtZShmbG9hdCB2b2x1bWUpOworICAgIGZsb2F0ICAgICAgICAgICAgICAgZ2V0RmluYWxWb2x1bWUoKSBjb25zdCB7IHJldHVybiBtRmluYWxWb2x1bWU7IH0KKworICAgIC8qKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRyYWNrIGhhcyBjaGFuZ2VkIChtZXRhZGF0YSBvciB2b2x1bWUpIHNpbmNlCisgICAgICogICAgICAgICAgdGhlIGxhc3QgdGltZSB0aGlzIGZ1bmN0aW9uIHdhcyBjYWxsZWQsCisgICAgICogICAgICAgICAgdHJ1ZSBpZiB0aGlzIGZ1bmN0aW9uIHdhcyBuZXZlciBjYWxsZWQgc2luY2UgdGhlIHRyYWNrIGNyZWF0aW9uLAorICAgICAqICAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiAgVGhyZWFkIHNhZmUuCisgICAgICovCisgICAgYm9vbCAgICAgICAgICAgIHJlYWRBbmRDbGVhckhhc0NoYW5nZWQoKSB7IHJldHVybiAhbUNoYW5nZU5vdGlmaWVkLnRlc3RfYW5kX3NldCgpOyB9CisKKyAgICB1c2luZyBTb3VyY2VNZXRhZGF0YXMgPSBzdGQ6OnZlY3RvcjxwbGF5YmFja190cmFja19tZXRhZGF0YV90PjsKKyAgICB1c2luZyBNZXRhZGF0YUluc2VydGVyID0gc3RkOjpiYWNrX2luc2VydF9pdGVyYXRvcjxTb3VyY2VNZXRhZGF0YXM+OworICAgIC8qKiBDb3B5IHRoZSB0cmFjayBtZXRhZGF0YSBpbiB0aGUgcHJvdmlkZWQgaXRlcmF0b3IuIFRocmVhZCBzYWZlLiAqLworICAgIHZpcnR1YWwgdm9pZCAgICBjb3B5TWV0YWRhdGFUbyhNZXRhZGF0YUluc2VydGVyJiBiYWNrSW5zZXJ0ZXIpIGNvbnN0OwogCiBwcm90ZWN0ZWQ6CiAgICAgLy8gZm9yIG51bWVyb3VzCkBAIC0xMjcsNiArMTUwLDggQEAKICAgICBib29sIHByZXNlbnRhdGlvbkNvbXBsZXRlKGludDY0X3QgZnJhbWVzV3JpdHRlbiwgc2l6ZV90IGF1ZGlvSGFsRnJhbWVzKTsKICAgICB2b2lkIHNpZ25hbENsaWVudEZsYWcoaW50MzJfdCBmbGFnKTsKIAorICAgIC8qKiBTZXQgdGhhdCBhIG1ldGFkYXRhIGhhcyBjaGFuZ2VkIGFuZCBuZWVkcyB0byBiZSBub3RpZmllZCB0byBiYWNrZW5kLiBUaHJlYWQgc2FmZS4gKi8KKyAgICB2b2lkIHNldE1ldGFkYXRhSGFzQ2hhbmdlZCgpIHsgbUNoYW5nZU5vdGlmaWVkLmNsZWFyKCk7IH0KIHB1YmxpYzoKICAgICB2b2lkIHRyaWdnZXJFdmVudHMoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCB0eXBlKTsKICAgICB2aXJ0dWFsIHZvaWQgaW52YWxpZGF0ZSgpOwpAQCAtMTQ2LDExICsxNzEsOSBAQAogCiAgICAgYm9vbCAgICAgICAgICAgICAgICBtUmVzZXREb25lOwogICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbVR5cGU7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBtTmFtZTsgICAgICAvLyB0cmFjayBuYW1lIG9uIHRoZSBub3JtYWwgbWl4ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWQgc3RhdGljYWxseSBhdCB0cmFjayBjcmVhdGlvbiB0aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGlzIGV2ZW4gYWxsb2NhdGVkICh0aG91Z2ggdW51c2VkKSBmb3IgZmFzdCB0cmFja3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIGRvbid0IGFsbG9jYXRlIHRyYWNrIG5hbWUgZm9yIGZhc3QgdHJhY2tzCi0gICAgaW50MTZfdCAgICAgICAgICAgICAqbU1haW5CdWZmZXI7CisgICAgaW50ICAgICAgICAgICAgICAgICBtTmFtZTsKKyAgICBlZmZlY3RfYnVmZmVyX3QgICAgICptTWFpbkJ1ZmZlcjsKKwogICAgIGludDMyX3QgICAgICAgICAgICAgKm1BdXhCdWZmZXI7CiAgICAgaW50ICAgICAgICAgICAgICAgICBtQXV4RWZmZWN0SWQ7CiAgICAgYm9vbCAgICAgICAgICAgICAgICBtSGFzVm9sdW1lQ29udHJvbGxlcjsKQEAgLTE2Myw3ICsxODYsNyBAQAogCiAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgIG1TaW5rVGltZXN0YW1wOwogCi0gICAgc3A8Vm9sdW1lSGFuZGxlcj4gIG1Wb2x1bWVIYW5kbGVyOyAvLyBoYW5kbGVzIG11bHRpcGxlIFZvbHVtZVNoYXBlciBjb25maWdzIGFuZCBvcGVyYXRpb25zCisgICAgc3A8bWVkaWE6OlZvbHVtZUhhbmRsZXI+ICBtVm9sdW1lSGFuZGxlcjsgLy8gaGFuZGxlcyBtdWx0aXBsZSBWb2x1bWVTaGFwZXIgY29uZmlncyBhbmQgb3BlcmF0aW9ucwogCiBwcml2YXRlOgogICAgIC8vIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBvbmx5IGZvciBmYXN0IHRyYWNrcywgYW5kIHNob3VsZCBiZSBpbiBhIHN1YmNsYXNzCkBAIC0xNzgsMTAgKzIwMSwxMyBAQAogICAgIHZvbGF0aWxlIGZsb2F0ICAgICAgbUNhY2hlZFZvbHVtZTsgIC8vIGNvbWJpbmVkIG1hc3RlciB2b2x1bWUgYW5kIHN0cmVhbSB0eXBlIHZvbHVtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAndm9sYXRpbGUnIG1lYW5zIGFjY2Vzc2VkIHdpdGhvdXQgbG9jayBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhcnJpZXIsIGJ1dCBpcyByZWFkL3dyaXR0ZW4gYXRvbWljYWxseQorICAgIGZsb2F0ICAgICAgICAgICAgICAgbUZpbmFsVm9sdW1lOyAvLyBjb21iaW5lIG1hc3RlciB2b2x1bWUsIHN0cmVhbSB0eXBlIHZvbHVtZSBhbmQgdHJhY2sgdm9sdW1lCiAgICAgc3A8QXVkaW9UcmFja1NlcnZlclByb3h5PiAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTsKICAgICBib29sICAgICAgICAgICAgICAgIG1SZXN1bWVUb1N0b3BwaW5nOyAvLyB0cmFjayB3YXMgcGF1c2VkIGluIHN0b3BwaW5nIHN0YXRlLgogICAgIGJvb2wgICAgICAgICAgICAgICAgbUZsdXNoSHdQZW5kaW5nOyAvLyB0cmFjayByZXF1ZXN0cyBmb3IgdGhyZWFkIGZsdXNoCiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbUZsYWdzOworICAgIC8vIElmIHRoZSBsYXN0IHRyYWNrIGNoYW5nZSB3YXMgbm90aWZpZWQgdG8gdGhlIGNsaWVudCB3aXRoIHJlYWRBbmRDbGVhckhhc0NoYW5nZWQKKyAgICBzdGQ6OmF0b21pY19mbGFnICAgICBtQ2hhbmdlTm90aWZpZWQgPSBBVE9NSUNfRkxBR19JTklUOwogfTsgIC8vIGVuZCBvZiBUcmFjawogCiAKQEAgLTIxMiw4ICsyMzgsMTEgQEAKICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzQWN0aXZlKCkgY29uc3QgeyByZXR1cm4gbUFjdGl2ZTsgfQogICAgIGNvbnN0IHdwPFRocmVhZEJhc2U+JiB0aHJlYWQoKSBjb25zdCB7IHJldHVybiBtVGhyZWFkOyB9CiAKLXByaXZhdGU6CisgICAgICAgICAgICB2b2lkICAgICAgICBjb3B5TWV0YWRhdGFUbyhNZXRhZGF0YUluc2VydGVyJiBiYWNrSW5zZXJ0ZXIpIGNvbnN0IG92ZXJyaWRlOworICAgIC8qKiBTZXQgdGhlIG1ldGFkYXRhcyBvZiB0aGUgdXBzdHJlYW0gdHJhY2tzLiBUaHJlYWQgc2FmZS4gKi8KKyAgICAgICAgICAgIHZvaWQgICAgICAgIHNldE1ldGFkYXRhcyhjb25zdCBTb3VyY2VNZXRhZGF0YXMmIG1ldGFkYXRhcyk7CiAKK3ByaXZhdGU6CiAgICAgc3RhdHVzX3QgICAgICAgICAgICBvYnRhaW5CdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd2FpdFRpbWVNcyk7CiAgICAgdm9pZCAgICAgICAgICAgICAgICBjbGVhckJ1ZmZlclF1ZXVlKCk7CkBAIC0yMjgsNiArMjU3LDIwIEBACiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmU7CiAgICAgRHVwbGljYXRpbmdUaHJlYWQqIGNvbnN0ICAgIG1Tb3VyY2VUaHJlYWQ7IC8vIGZvciB3YWl0VGltZU1zKCkgaW4gd3JpdGUoKQogICAgIHNwPEF1ZGlvVHJhY2tDbGllbnRQcm94eT4gICBtQ2xpZW50UHJveHk7CisgICAgLyoqIEF0dHJpYnV0ZXMgb2YgdGhlIHNvdXJjZSB0cmFja3MuCisgICAgICoKKyAgICAgKiBUaGlzIG1lbWJlciBtdXN0IGJlIGFjY2Vzc2VkIHdpdGggbVRyYWNrTWV0YWRhdGFzTXV0ZXggdGFrZW4uCisgICAgICogVGhlcmUgaXMgb25lIHdyaXRlciAoZHVwbGljYXRpbmcgdGhyZWFkKSBhbmQgb25lIHJlYWRlciAoZG93bnN0cmVhbSBtaXhlcikuCisgICAgICoKKyAgICAgKiBUaGF0IG1lYW5zIHRoYXQgdGhlIGR1cGxpY2F0aW5nIHRocmVhZCBjYW4gYmxvY2sgdGhlIGRvd25zdHJlYW0gbWl4ZXIKKyAgICAgKiB0aHJlYWQgYW5kIHZpY2UgdmVyc2EgZm9yIHRoZSB0aW1lIG9mIHRoZSBjb3B5LgorICAgICAqIElmIHRoaXMgYmVjb21lcyBhbiBpc3N1ZSwgdGhlIG1ldGFkYXRhIGNvdWxkIGJlIHN0b3JlZCBpbiBhbiBhdG9taWMgcmF3IHBvaW50ZXIsCisgICAgICogYW5kIGEgZXhjaGFuZ2Ugd2l0aCBudWxscHRyIGFuZCBkZWxldGUgY2FuIGJlIHVzZWQuCisgICAgICogQWx0ZXJuYXRpdmVseSBhIHJlYWQtY29weS11cGRhdGUgbWlnaHQgYmUgaW1wbGVtZW50ZWQuCisgICAgICovCisgICAgU291cmNlTWV0YWRhdGFzIG1UcmFja01ldGFkYXRhczsKKyAgICAvKiogUHJvdGVjdHMgbVRyYWNrTWV0YWRhdGFzIGFnYWluc3QgY29uY3VycmVudCBhY2Nlc3MuICovCisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1UcmFja01ldGFkYXRhc011dGV4OwogfTsgIC8vIGVuZCBvZiBPdXRwdXRUcmFjawogCiAvLyBwbGF5YmFjayB0cmFjaywgdXNlZCBieSBQYXRjaFBhbmVsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmgKaW5kZXggZjhkYTc4MC4uZmMyZGJiYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaApAQCAtMjQsNiArMjQsNyBAQAogcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgICAgUmVjb3JkVHJhY2soUmVjb3JkVGhyZWFkICp0aHJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLApAQCAtNjMsNiArNjQsMTEgQEAKIAogICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNGYXN0VHJhY2soKSBjb25zdCB7IHJldHVybiAobUZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKSAhPSAwOyB9CiAKKyAgICAgICAgICAgIHZvaWQgICAgICAgIHNldFNpbGVuY2VkKGJvb2wgc2lsZW5jZWQpIHsgaWYgKCFpc1BhdGNoVHJhY2soKSkgbVNpbGVuY2VkID0gc2lsZW5jZWQ7IH0KKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzU2lsZW5jZWQoKSBjb25zdCB7IHJldHVybiBtU2lsZW5jZWQ7IH0KKworICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpOworCiBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBBdWRpb0ZsaW5nZXI7ICAvLyBmb3IgbVN0YXRlCiAKQEAgLTkxLDYgKzk3LDggQEAKICAgICAgICAgICAgIC8vIHVzZWQgYnkgdGhlIHJlY29yZCB0aHJlYWQgdG8gY29udmVydCBmcmFtZXMgdG8gcHJvcGVyIGRlc3RpbmF0aW9uIGZvcm1hdAogICAgICAgICAgICAgUmVjb3JkQnVmZmVyQ29udmVydGVyICAgICAgICAgICAgICAqbVJlY29yZEJ1ZmZlckNvbnZlcnRlcjsKICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgICAgICAgICAgICAgICAgbUZsYWdzOworCisgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TaWxlbmNlZDsKIH07CiAKIC8vIHBsYXliYWNrIHRyYWNrLCB1c2VkIGJ5IFBhdGNoUGFuZWwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcAppbmRleCBjMTA0NGVmLi5hYTI2N2VhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwCkBAIC0zMCw2ICszMCw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RhdGljIGNvbnN0IFN0cmluZzE2IHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKCJhbmRyb2lkLnBlcm1pc3Npb24uUkVDT1JEX0FVRElPIik7CisKIC8vIE5vdCB2YWxpZCB1bnRpbCBpbml0aWFsaXplZCBieSBBdWRpb0ZsaW5nZXIgY29uc3RydWN0b3IuICBJdCB3b3VsZCBoYXZlIHRvIGJlCiAvLyByZS1pbml0aWFsaXplZCBpZiB0aGUgcHJvY2VzcyBjb250YWluaW5nIEF1ZGlvRmxpbmdlciBzZXJ2aWNlIGZvcmtzICh3aGljaCBpdCBkb2Vzbid0KS4KIC8vIFRoaXMgaXMgb2Z0ZW4gdXNlZCB0byB2YWxpZGF0ZSBiaW5kZXIgaW50ZXJmYWNlIGNhbGxzIHdpdGhpbiBhdWRpb3NlcnZlcgpAQCAtNDgsMjYgKzUwLDExIEBACiAgICAgfQogfQogCi1ib29sIHJlY29yZGluZ0FsbG93ZWQoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7Ci0gICAgLy8gd2UncmUgYWx3YXlzIE9LLgotICAgIGlmIChnZXRwaWRfY2FjaGVkID09IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSkgcmV0dXJuIHRydWU7Ci0KLSAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc1JlY29yZEF1ZGlvKCJhbmRyb2lkLnBlcm1pc3Npb24uUkVDT1JEX0FVRElPIik7Ci0KLSAgICAvLyBXZSBzcGVjaWZ5IGEgcGlkIGFuZCB1aWQgaGVyZSBhcyBtZWRpYXNlcnZlciAoYWthIE1lZGlhUmVjb3JkZXIgb3IgU3RhZ2VGcmlnaHRSZWNvcmRlcikKLSAgICAvLyBtYXkgb3BlbiBhIHJlY29yZCB0cmFjayBvbiBiZWhhbGYgb2YgYSBjbGllbnQuICBOb3RlIHRoYXQgcGlkIG1heSBiZSBhIHRpZC4KLSAgICAvLyBJTVBPUlRBTlQ6IERvbid0IHVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IGNoYW5nZS4KLSAgICBjb25zdCBib29sIG9rID0gY2hlY2tQZXJtaXNzaW9uKHNSZWNvcmRBdWRpbywgcGlkLCB1aWQpOwotICAgIGlmICghb2spIHsKLSAgICAgICAgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJTyIpOwotICAgICAgICByZXR1cm4gZmFsc2U7CitzdGF0aWMgU3RyaW5nMTYgcmVzb2x2ZUNhbGxpbmdQYWNrYWdlKFBlcm1pc3Npb25Db250cm9sbGVyJiBwZXJtaXNzaW9uQ29udHJvbGxlciwKKyAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHVpZF90IHVpZCkgeworICAgIGlmIChvcFBhY2thZ2VOYW1lLnNpemUoKSA+IDApIHsKKyAgICAgICAgcmV0dXJuIG9wUGFja2FnZU5hbWU7CiAgICAgfQotCi0gICAgLy8gVG8gcGVybWl0IGNvbW1hbmQtbGluZSBuYXRpdmUgdGVzdHMKLSAgICBpZiAodWlkID09IEFJRF9ST09UKSByZXR1cm4gdHJ1ZTsKLQotICAgIFN0cmluZzE2IGNoZWNrZWRPcFBhY2thZ2VOYW1lID0gb3BQYWNrYWdlTmFtZTsKLQogICAgIC8vIEluIHNvbWUgY2FzZXMgdGhlIGNhbGxpbmcgY29kZSBoYXMgbm8gYWNjZXNzIHRvIHRoZSBwYWNrYWdlIGl0IHJ1bnMgdW5kZXIuCiAgICAgLy8gRm9yIGV4YW1wbGUsIGNvZGUgdXNpbmcgdGhlIHdpbGhlbG0gZnJhbWV3b3JrJ3MgT3BlblNMLUVTIEFQSXMuIEluIHRoaXMKICAgICAvLyBjYXNlIHdlIHdpbGwgZ2V0IHRoZSBwYWNrYWdlcyBmb3IgdGhlIGNhbGxpbmcgVUlEIGFuZCBwaWNrIHRoZSBmaXJzdCBvbmUKQEAgLTc1LDQwICs2Miw4OSBAQAogICAgIC8vIGFzIGZvciBsZWdhY3kgYXBwcyB3ZSB3aWxsIHRvZ2dsZSB0aGUgYXBwIG9wIGZvciBhbGwgcGFja2FnZXMgaW4gdGhlIFVJRC4KICAgICAvLyBUaGUgY2F2ZWF0IGlzIHRoYXQgdGhlIG9wZXJhdGlvbiBtYXkgYmUgYXR0cmlidXRlZCB0byB0aGUgd3JvbmcgcGFja2FnZSBhbmQKICAgICAvLyBzdGF0cyBiYXNlZCBvbiBhcHAgb3BzIG1heSBiZSBzbGlnaHRseSBvZmYuCi0gICAgaWYgKGNoZWNrZWRPcFBhY2thZ2VOYW1lLnNpemUoKSA8PSAwKSB7Ci0gICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKLSAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoInBlcm1pc3Npb24iKSk7Ci0gICAgICAgIGlmIChiaW5kZXIgPT0gMCkgewotICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBnZXQgcGVybWlzc2lvbiBzZXJ2aWNlIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KKyAgICBWZWN0b3I8U3RyaW5nMTY+IHBhY2thZ2VzOworICAgIHBlcm1pc3Npb25Db250cm9sbGVyLmdldFBhY2thZ2VzRm9yVWlkKHVpZCwgcGFja2FnZXMpOworICAgIGlmIChwYWNrYWdlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIk5vIHBhY2thZ2VzIGZvciB1aWQgJWQiLCB1aWQpOworICAgICAgICByZXR1cm4gb3BQYWNrYWdlTmFtZTsgLy8gZW1wdHkgc3RyaW5nCisgICAgfQorICAgIHJldHVybiBwYWNrYWdlc1swXTsKK30KIAotICAgICAgICBzcDxJUGVybWlzc2lvbkNvbnRyb2xsZXI+IHBlcm1DdHJsID0gaW50ZXJmYWNlX2Nhc3Q8SVBlcm1pc3Npb25Db250cm9sbGVyPihiaW5kZXIpOwotICAgICAgICBWZWN0b3I8U3RyaW5nMTY+IHBhY2thZ2VzOworc3RhdGljIGlubGluZSBib29sIGlzQXVkaW9TZXJ2ZXJPclJvb3QodWlkX3QgdWlkKSB7CisgICAgLy8gQUlEX1JPT1QgaXMgT0sgZm9yIGNvbW1hbmQtbGluZSB0ZXN0cy4gIE5hdGl2ZSB1bmZvcmtlZCBhdWRpb3NlcnZlciBhbHdheXMgT0suCisgICAgcmV0dXJuIHVpZCA9PSBBSURfUk9PVCB8fCB1aWQgPT0gQUlEX0FVRElPU0VSVkVSIDsKK30KIAotICAgICAgICBwZXJtQ3RybC0+Z2V0UGFja2FnZXNGb3JVaWQodWlkLCBwYWNrYWdlcyk7CitzdGF0aWMgYm9vbCBjaGVja1JlY29yZGluZ0ludGVybmFsKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsCisgICAgICAgIHVpZF90IHVpZCwgYm9vbCBzdGFydCkgeworICAgIC8vIE9rYXkgdG8gbm90IHRyYWNrIGluIGFwcCBvcHMgYXMgYXVkaW8gc2VydmVyIGlzIHVzIGFuZCBpZgorICAgIC8vIGRldmljZSBpcyByb290ZWQgc2VjdXJpdHkgbW9kZWwgaXMgY29uc2lkZXJlZCBjb21wcm9taXNlZC4KKyAgICBpZiAoaXNBdWRpb1NlcnZlck9yUm9vdCh1aWQpKSByZXR1cm4gdHJ1ZTsKIAotICAgICAgICBpZiAocGFja2FnZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiTm8gcGFja2FnZXMgZm9yIGNhbGxpbmcgVUlEIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tlZE9wUGFja2FnZU5hbWUgPSBwYWNrYWdlc1swXTsKKyAgICAvLyBXZSBzcGVjaWZ5IGEgcGlkIGFuZCB1aWQgaGVyZSBhcyBtZWRpYXNlcnZlciAoYWthIE1lZGlhUmVjb3JkZXIgb3IgU3RhZ2VGcmlnaHRSZWNvcmRlcikKKyAgICAvLyBtYXkgb3BlbiBhIHJlY29yZCB0cmFjayBvbiBiZWhhbGYgb2YgYSBjbGllbnQuICBOb3RlIHRoYXQgcGlkIG1heSBiZSBhIHRpZC4KKyAgICAvLyBJTVBPUlRBTlQ6IERPTidUIFVTRSBQZXJtaXNzaW9uQ2FjaGUgLSBSVU5USU1FIFBFUk1JU1NJT05TIENIQU5HRS4KKyAgICBQZXJtaXNzaW9uQ29udHJvbGxlciBwZXJtaXNzaW9uQ29udHJvbGxlcjsKKyAgICBjb25zdCBib29sIG9rID0gcGVybWlzc2lvbkNvbnRyb2xsZXIuY2hlY2tQZXJtaXNzaW9uKHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvLCBwaWQsIHVpZCk7CisgICAgaWYgKCFvaykgeworICAgICAgICBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyAlcyIsIFN0cmluZzgoc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8pLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgU3RyaW5nMTYgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lID0gcmVzb2x2ZUNhbGxpbmdQYWNrYWdlKAorICAgICAgICAgICAgcGVybWlzc2lvbkNvbnRyb2xsZXIsIG9wUGFja2FnZU5hbWUsIHVpZCk7CisgICAgaWYgKHJlc29sdmVkT3BQYWNrYWdlTmFtZS5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgQXBwT3BzTWFuYWdlciBhcHBPcHM7Ci0gICAgaWYgKGFwcE9wcy5ub3RlT3AoQXBwT3BzTWFuYWdlcjo6T1BfUkVDT1JEX0FVRElPLCB1aWQsIGNoZWNrZWRPcFBhY2thZ2VOYW1lKQotICAgICAgICAgICAgIT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9BTExPV0VEKSB7Ci0gICAgICAgIEFMT0dFKCJSZXF1ZXN0IGRlbmllZCBieSBhcHAgb3AgT1BfUkVDT1JEX0FVRElPIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjb25zdCBpbnQzMl90IG9wID0gYXBwT3BzLnBlcm1pc3Npb25Ub09wQ29kZShzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbyk7CisgICAgaWYgKHN0YXJ0KSB7CisgICAgICAgIGlmIChhcHBPcHMuc3RhcnRPcE5vVGhyb3cob3AsIHVpZCwgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lLCAvKnN0YXJ0SWZNb2RlRGVmYXVsdCovIGZhbHNlKQorICAgICAgICAgICAgICAgICE9IEFwcE9wc01hbmFnZXI6Ok1PREVfQUxMT1dFRCkgeworICAgICAgICAgICAgQUxPR0UoIlJlcXVlc3QgZGVuaWVkIGJ5IGFwcCBvcDogJWQiLCBvcCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYXBwT3BzLm5vdGVPcChvcCwgdWlkLCByZXNvbHZlZE9wUGFja2FnZU5hbWUpICE9IEFwcE9wc01hbmFnZXI6Ok1PREVfQUxMT1dFRCkgeworICAgICAgICAgICAgQUxPR0UoIlJlcXVlc3QgZGVuaWVkIGJ5IGFwcCBvcDogJWQiLCBvcCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorYm9vbCByZWNvcmRpbmdBbGxvd2VkKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCkgeworICAgIHJldHVybiBjaGVja1JlY29yZGluZ0ludGVybmFsKG9wUGFja2FnZU5hbWUsIHBpZCwgdWlkLCAvKnN0YXJ0Ki8gZmFsc2UpOworfQorCitib29sIHN0YXJ0UmVjb3JkaW5nKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCkgeworICAgICByZXR1cm4gY2hlY2tSZWNvcmRpbmdJbnRlcm5hbChvcFBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgLypzdGFydCovIHRydWUpOworfQorCit2b2lkIGZpbmlzaFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgdWlkX3QgdWlkKSB7CisgICAgLy8gT2theSB0byBub3QgdHJhY2sgaW4gYXBwIG9wcyBhcyBhdWRpbyBzZXJ2ZXIgaXMgdXMgYW5kIGlmCisgICAgLy8gZGV2aWNlIGlzIHJvb3RlZCBzZWN1cml0eSBtb2RlbCBpcyBjb25zaWRlcmVkIGNvbXByb21pc2VkLgorICAgIGlmIChpc0F1ZGlvU2VydmVyT3JSb290KHVpZCkpIHJldHVybjsKKworICAgIFBlcm1pc3Npb25Db250cm9sbGVyIHBlcm1pc3Npb25Db250cm9sbGVyOworICAgIFN0cmluZzE2IHJlc29sdmVkT3BQYWNrYWdlTmFtZSA9IHJlc29sdmVDYWxsaW5nUGFja2FnZSgKKyAgICAgICAgICAgIHBlcm1pc3Npb25Db250cm9sbGVyLCBvcFBhY2thZ2VOYW1lLCB1aWQpOworICAgIGlmIChyZXNvbHZlZE9wUGFja2FnZU5hbWUuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFwcE9wc01hbmFnZXIgYXBwT3BzOworICAgIGNvbnN0IGludDMyX3Qgb3AgPSBhcHBPcHMucGVybWlzc2lvblRvT3BDb2RlKHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKTsKKyAgICBhcHBPcHMuZmluaXNoT3Aob3AsIHVpZCwgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lKTsKK30KKwogYm9vbCBjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7CiAgICAgaWYgKGdldHBpZF9jYWNoZWQgPT0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKSByZXR1cm4gdHJ1ZTsKICAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0NhcHR1cmVBdWRpb091dHB1dCgiYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fT1VUUFVUIik7Ci0gICAgYm9vbCBvayA9IGNoZWNrUGVybWlzc2lvbihzQ2FwdHVyZUF1ZGlvT3V0cHV0LCBwaWQsIHVpZCk7CisgICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKHNDYXB0dXJlQXVkaW9PdXRwdXQsIHBpZCwgdWlkKTsKICAgICBpZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19PVVRQVVQiKTsKICAgICByZXR1cm4gb2s7CiB9CkBAIC0xNTMsNCArMTg5LDExIEBACiAgICAgcmV0dXJuIG9rOwogfQogCitib29sIG1vZGlmeVBob25lU3RhdGVBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7CisgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNNb2RpZnlQaG9uZVN0YXRlKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX1BIT05FX1NUQVRFIik7CisgICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKHNNb2RpZnlQaG9uZVN0YXRlLCBwaWQsIHVpZCk7CisgICAgaWYgKCFvaykgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9QSE9ORV9TVEFURSIpOworICAgIHJldHVybiBvazsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmgKaW5kZXggMDRjYjljZC4uZjQ1YWRhMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5oCkBAIC0xNiwxNCArMTYsMTkgQEAKIAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCisjaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25Db250cm9sbGVyLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogZXh0ZXJuIHBpZF90IGdldHBpZF9jYWNoZWQ7CiBib29sIGlzVHJ1c3RlZENhbGxpbmdVaWQodWlkX3QgdWlkKTsKIGJvb2wgcmVjb3JkaW5nQWxsb3dlZChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpOworYm9vbCBzdGFydFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpOwordm9pZCBmaW5pc2hSZWNvcmRpbmcoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHVpZF90IHVpZCk7CiBib29sIGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpOwogYm9vbCBjYXB0dXJlSG90d29yZEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpOwogYm9vbCBzZXR0aW5nc0FsbG93ZWQoKTsKIGJvb2wgbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpOwogYm9vbCBkdW1wQWxsb3dlZCgpOworYm9vbCBtb2RpZnlQaG9uZVN0YXRlQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKaW5kZXggZTIwMmNhNC4uZGNhZDg2NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcApAQCAtNTYsNiArNTYsOSBAQAogCiAjaW5jbHVkZSA8cG93ZXJtYW5hZ2VyL1Bvd2VyTWFuYWdlci5oPgogCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KKwogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgogI2luY2x1ZGUgIkZhc3RNaXhlci5oIgogI2luY2x1ZGUgIkZhc3RDYXB0dXJlLmgiCkBAIC0xMTc2LDYgKzExNzksNyBAQAogCiAgICAgc3dpdGNoIChtVHlwZSkgewogICAgIGNhc2UgTUlYRVI6IHsKKyNpZm5kZWYgTVVMVElDSEFOTkVMX0VGRkVDVF9DSEFJTgogICAgICAgICAvLyBSZWplY3QgYW55IGVmZmVjdCBvbiBtaXhlciBtdWx0aWNoYW5uZWwgc2lua3MuCiAgICAgICAgIC8vIFRPRE86IGZpeCBib3RoIGZvcm1hdCBhbmQgbXVsdGljaGFubmVsIGlzc3VlcyB3aXRoIGVmZmVjdHMuCiAgICAgICAgIGlmIChtQ2hhbm5lbENvdW50ICE9IEZDQ18yKSB7CkBAIC0xMTgzLDYgKzExODcsNyBAQAogICAgICAgICAgICAgICAgICAgICAiIHRocmVhZCAlcyIsIGRlc2MtPm5hbWUsIG1DaGFubmVsQ291bnQsIG1UaHJlYWROYW1lKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KKyNlbmRpZgogICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IG1PdXRwdXQtPmZsYWdzOwogICAgICAgICBpZiAoaGFzRmFzdE1peGVyKCkgfHwgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkpIHsKICAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSB7CkBAIC0xMjI5LDYgKzEyMzQsNyBAQAogICAgICAgICAgICAgICAgIGRlc2MtPm5hbWUsIG1UaHJlYWROYW1lKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICBjYXNlIERVUExJQ0FUSU5HOgorI2lmbmRlZiBNVUxUSUNIQU5ORUxfRUZGRUNUX0NIQUlOCiAgICAgICAgIC8vIFJlamVjdCBhbnkgZWZmZWN0IG9uIG1peGVyIG11bHRpY2hhbm5lbCBzaW5rcy4KICAgICAgICAgLy8gVE9ETzogZml4IGJvdGggZm9ybWF0IGFuZCBtdWx0aWNoYW5uZWwgaXNzdWVzIHdpdGggZWZmZWN0cy4KICAgICAgICAgaWYgKG1DaGFubmVsQ291bnQgIT0gRkNDXzIpIHsKQEAgLTEyMzYsNiArMTI0Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICIgb24gRFVQTElDQVRJTkcgdGhyZWFkICVzIiwgZGVzYy0+bmFtZSwgbUNoYW5uZWxDb3VudCwgbVRocmVhZE5hbWUpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQorI2VuZGlmCiAgICAgICAgIGlmICgoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFKSB8fCAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkpIHsKICAgICAgICAgICAgIEFMT0dXKCJjaGVja0VmZmVjdENvbXBhdGliaWxpdHlfbCgpOiBnbG9iYWwgZWZmZWN0ICVzIG9uIERVUExJQ0FUSU5HIgogICAgICAgICAgICAgICAgICAgICAiIHRocmVhZCAlcyIsIGRlc2MtPm5hbWUsIG1UaHJlYWROYW1lKTsKQEAgLTEzNTQsNyArMTM2MSw3IEBACiAgICAgICAgIGlmIChjaGFpbkNyZWF0ZWQpIHsKICAgICAgICAgICAgIHJlbW92ZUVmZmVjdENoYWluX2woY2hhaW4pOwogICAgICAgICB9Ci0gICAgICAgIGhhbmRsZS5jbGVhcigpOworICAgICAgICAvLyBoYW5kbGUgbXVzdCBiZSBjbGVhcmVkIGJ5IGNhbGxlciB0byBhdm9pZCBkZWFkbG9jay4KICAgICB9CiAKICAgICAqc3RhdHVzID0gbFN0YXR1czsKQEAgLTE0MTIsNyArMTQxOSw3IEBACiAgICAgYm9vbCBjaGFpbkNyZWF0ZWQgPSBmYWxzZTsKIAogICAgIEFMT0dEX0lGKChtVHlwZSA9PSBPRkZMT0FEKSAmJiAhZWZmZWN0LT5pc09mZmxvYWRhYmxlKCksCi0gICAgICAgICAgICAgImFkZEVmZmVjdF9sKCkgb24gb2ZmbG9hZGVkIHRocmVhZCAlcDogZWZmZWN0ICVzIGRvZXMgbm90IHN1cHBvcnQgb2ZmbG9hZCBmbGFncyAleCIsCisgICAgICAgICAgICAgImFkZEVmZmVjdF9sKCkgb24gb2ZmbG9hZGVkIHRocmVhZCAlcDogZWZmZWN0ICVzIGRvZXMgbm90IHN1cHBvcnQgb2ZmbG9hZCBmbGFncyAlI3giLAogICAgICAgICAgICAgICAgICAgICB0aGlzLCBlZmZlY3QtPmRlc2MoKS5uYW1lLCBlZmZlY3QtPmRlc2MoKS5mbGFncyk7CiAKICAgICBpZiAoY2hhaW4gPT0gMCkgewpAQCAtMTU0OCw2ICsxNTU1LDcgQEAKICAgICBtQWN0aXZlVHJhY2tzR2VuZXJhdGlvbisrOwogICAgIG1MYXRlc3RBY3RpdmVUcmFjayA9IHRyYWNrOwogICAgICsrbUJhdHRlcnlDb3VudGVyW3RyYWNrLT51aWQoKV0uc2Vjb25kOworICAgIG1IYXNDaGFuZ2VkID0gdHJ1ZTsKICAgICByZXR1cm4gbUFjdGl2ZVRyYWNrcy5hZGQodHJhY2spOwogfQogCkBAIC0xNTYyLDYgKzE1NzAsNyBAQAogICAgIG1BY3RpdmVUcmFja3NHZW5lcmF0aW9uKys7CiAgICAgLS1tQmF0dGVyeUNvdW50ZXJbdHJhY2stPnVpZCgpXS5zZWNvbmQ7CiAgICAgLy8gbUxhdGVzdEFjdGl2ZVRyYWNrIGlzIG5vdCBjbGVhcmVkIGV2ZW4gaWYgaXMgdGhlIHNhbWUgYXMgdHJhY2suCisgICAgbUhhc0NoYW5nZWQgPSB0cnVlOwogICAgIHJldHVybiBpbmRleDsKIH0KIApAQCAtMTU3Miw2ICsxNTgxLDcgQEAKICAgICAgICAgbG9nVHJhY2soImNsZWFyIiwgdHJhY2spOwogICAgIH0KICAgICBtTGFzdEFjdGl2ZVRyYWNrc0dlbmVyYXRpb24gPSBtQWN0aXZlVHJhY2tzR2VuZXJhdGlvbjsKKyAgICBpZiAoIW1BY3RpdmVUcmFja3MuZW1wdHkoKSkgeyBtSGFzQ2hhbmdlZCA9IHRydWU7IH0KICAgICBtQWN0aXZlVHJhY2tzLmNsZWFyKCk7CiAgICAgbUxhdGVzdEFjdGl2ZVRyYWNrLmNsZWFyKCk7CiAgICAgbUJhdHRlcnlDb3VudGVyLmNsZWFyKCk7CkBAIC0xNjA5LDYgKzE2MTksMTMgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citib29sIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6QWN0aXZlVHJhY2tzPFQ+OjpyZWFkQW5kQ2xlYXJIYXNDaGFuZ2VkKCkgeworICAgIGNvbnN0IGJvb2wgaGFzQ2hhbmdlZCA9IG1IYXNDaGFuZ2VkOworICAgIG1IYXNDaGFuZ2VkID0gZmFsc2U7CisgICAgcmV0dXJuIGhhc0NoYW5nZWQ7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgogdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OkFjdGl2ZVRyYWNrczxUPjo6bG9nVHJhY2soCiAgICAgICAgIGNvbnN0IGNoYXIgKmZ1bmNOYW1lLCBjb25zdCBzcDxUPiAmdHJhY2spIGNvbnN0IHsKICAgICBpZiAobUxvY2FsTG9nICE9IG51bGxwdHIpIHsKQEAgLTE2NTUsNiArMTY3Miw3IEBACiAgICAgICAgIG1TdXNwZW5kZWRGcmFtZXMoMCksCiAgICAgICAgIG1BY3RpdmVUcmFja3MoJnRoaXMtPm1Mb2NhbExvZyksCiAgICAgICAgIC8vIG1TdHJlYW1UeXBlc1tdIGluaXRpYWxpemVkIGluIGNvbnN0cnVjdG9yIGJvZHkKKyAgICAgICAgbVRyYWNrcyh0eXBlID09IE1JWEVSKSwKICAgICAgICAgbU91dHB1dChvdXRwdXQpLAogICAgICAgICBtTGFzdFdyaXRlVGltZSgtMSksIG1OdW1Xcml0ZXMoMCksIG1OdW1EZWxheWVkV3JpdGVzKDApLCBtSW5Xcml0ZShmYWxzZSksCiAgICAgICAgIG1NaXhlclN0YXR1cyhNSVhFUl9JRExFKSwKQEAgLTE2OTYsMTEgKzE3MTQsMTQgQEAKICAgICByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCk7CiAKICAgICAvLyArKyBvcGVyYXRvciBkb2VzIG5vdCBjb21waWxlCi0gICAgZm9yIChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IEFVRElPX1NUUkVBTV9NSU47IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9DTlQ7CisgICAgZm9yIChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IEFVRElPX1NUUkVBTV9NSU47IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsKICAgICAgICAgICAgIHN0cmVhbSA9IChhdWRpb19zdHJlYW1fdHlwZV90KSAoc3RyZWFtICsgMSkpIHsKLSAgICAgICAgbVN0cmVhbVR5cGVzW3N0cmVhbV0udm9sdW1lID0gbUF1ZGlvRmxpbmdlci0+c3RyZWFtVm9sdW1lX2woc3RyZWFtKTsKKyAgICAgICAgbVN0cmVhbVR5cGVzW3N0cmVhbV0udm9sdW1lID0gMC4wZjsKICAgICAgICAgbVN0cmVhbVR5cGVzW3N0cmVhbV0ubXV0ZSA9IG1BdWRpb0ZsaW5nZXItPnN0cmVhbU11dGVfbChzdHJlYW0pOwogICAgIH0KKyAgICAvLyBBdWRpbyBwYXRjaCB2b2x1bWUgaXMgYWx3YXlzIG1heAorICAgIG1TdHJlYW1UeXBlc1tBVURJT19TVFJFQU1fUEFUQ0hdLnZvbHVtZSA9IDEuMGY7CisgICAgbVN0cmVhbVR5cGVzW0FVRElPX1NUUkVBTV9QQVRDSF0ubXV0ZSA9IGZhbHNlOwogfQogCiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjp+UGxheWJhY2tUaHJlYWQoKQpAQCAtMTgzNywxMCArMTg1OCwxNCBAQAogc3A8QXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s+IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmNyZWF0ZVRyYWNrX2woCiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6Q2xpZW50PiYgY2xpZW50LAogICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCi0gICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0ciwKKyAgICAgICAgdWludDMyX3QgKnBTYW1wbGVSYXRlLAogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAorICAgICAgICBzaXplX3QgKnBOb3RpZmljYXRpb25GcmFtZUNvdW50LAorICAgICAgICB1aW50MzJfdCBub3RpZmljYXRpb25zUGVyQnVmZmVyLAorICAgICAgICBmbG9hdCBzcGVlZCwKICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzLApAQCAtMTg1MCw5ICsxODc1LDE2IEBACiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIHNpemVfdCBmcmFtZUNvdW50ID0gKnBGcmFtZUNvdW50OworICAgIHNpemVfdCBub3RpZmljYXRpb25GcmFtZUNvdW50ID0gKnBOb3RpZmljYXRpb25GcmFtZUNvdW50OwogICAgIHNwPFRyYWNrPiB0cmFjazsKICAgICBzdGF0dXNfdCBsU3RhdHVzOwogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG91dHB1dEZsYWdzID0gbU91dHB1dC0+ZmxhZ3M7CisgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgcmVxdWVzdGVkRmxhZ3MgPSAqZmxhZ3M7CisKKyAgICBpZiAoKnBTYW1wbGVSYXRlID09IDApIHsKKyAgICAgICAgKnBTYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CisgICAgfQorICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSAqcFNhbXBsZVJhdGU7CiAKICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIEZBU1QgZmxhZyBjb25zaWRlcmVkIE9LIGlmIGZhc3QgbWl4ZXIgaXMgcHJlc2VudAogICAgIGlmIChoYXNGYXN0TWl4ZXIoKSkgewpAQCAtMTkyOSwzNiArMTk2MSwxMTQgQEAKICAgICAgICAgKmZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSgqZmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRkFTVCk7CiAgICAgICB9CiAgICAgfQotICAgIC8vIEZvciBub3JtYWwgUENNIHN0cmVhbWluZyB0cmFja3MsIHVwZGF0ZSBtaW5pbXVtIGZyYW1lIGNvdW50LgotICAgIC8vIEZvciBjb21wYXRpYmlsaXR5IHdpdGggQXVkaW9UcmFjayBjYWxjdWxhdGlvbiwgYnVmZmVyIGRlcHRoIGlzIGZvcmNlZAotICAgIC8vIHRvIGJlIGF0IGxlYXN0IDIgeCB0aGUgbm9ybWFsIG1peGVyIGZyYW1lIGNvdW50IGFuZCBjb3ZlciBhdWRpbyBoYXJkd2FyZSBsYXRlbmN5LgotICAgIC8vIFRoaXMgaXMgcHJvYmFibHkgdG9vIGNvbnNlcnZhdGl2ZSwgYnV0IGxlZ2FjeSBhcHBsaWNhdGlvbiBjb2RlIG1heSBkZXBlbmQgb24gaXQuCi0gICAgLy8gSWYgeW91IGNoYW5nZSB0aGlzIGNhbGN1bGF0aW9uLCBhbHNvIHJldmlldyB0aGUgc3RhcnQgdGhyZXNob2xkIHdoaWNoIGlzIHJlbGF0ZWQuCi0gICAgaWYgKCEoKmZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkKLSAgICAgICAgICAgICYmIGF1ZGlvX2hhc19wcm9wb3J0aW9uYWxfZnJhbWVzKGZvcm1hdCkgJiYgc2hhcmVkQnVmZmVyID09IDApIHsKLSAgICAgICAgLy8gdGhpcyBtdXN0IG1hdGNoIEF1ZGlvVHJhY2suY3BwIGNhbGN1bGF0ZU1pbkZyYW1lQ291bnQoKS4KLSAgICAgICAgLy8gVE9ETzogTW92ZSB0byBhIGNvbW1vbiBsaWJyYXJ5Ci0gICAgICAgIHVpbnQzMl90IGxhdGVuY3lNcyA9IDA7Ci0gICAgICAgIGxTdGF0dXMgPSBtT3V0cHV0LT5zdHJlYW0tPmdldExhdGVuY3koJmxhdGVuY3lNcyk7Ci0gICAgICAgIGlmIChsU3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRXJyb3Igd2hlbiByZXRyaWV2aW5nIG91dHB1dCBzdHJlYW0gbGF0ZW5jeTogJWQiLCBsU3RhdHVzKTsKKworICAgIGlmICghYXVkaW9faGFzX3Byb3BvcnRpb25hbF9mcmFtZXMoZm9ybWF0KSkgeworICAgICAgICBpZiAoc2hhcmVkQnVmZmVyICE9IDApIHsKKyAgICAgICAgICAgIC8vIFNhbWUgY29tbWVudCBhcyBiZWxvdyBhYm91dCBpZ25vcmluZyBmcmFtZUNvdW50IHBhcmFtZXRlciBmb3Igc2V0KCkKKyAgICAgICAgICAgIGZyYW1lQ291bnQgPSBzaGFyZWRCdWZmZXItPnNpemUoKTsKKyAgICAgICAgfSBlbHNlIGlmIChmcmFtZUNvdW50ID09IDApIHsKKyAgICAgICAgICAgIGZyYW1lQ291bnQgPSBtTm9ybWFsRnJhbWVDb3VudDsKKyAgICAgICAgfQorICAgICAgICBpZiAobm90aWZpY2F0aW9uRnJhbWVDb3VudCAhPSBmcmFtZUNvdW50KSB7CisgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoc2hhcmVkQnVmZmVyICE9IDApIHsKKyAgICAgICAgLy8gRklYTUU6IEVuc3VyZSBjbGllbnQgc2lkZSBtZW1vcnkgYnVmZmVycyBuZWVkCisgICAgICAgIC8vIG5vdCBoYXZlIGFkZGl0aW9uYWwgYWxpZ25tZW50IGJleW9uZCBzYW1wbGUKKyAgICAgICAgLy8gKGUuZy4gMTYgYml0IHN0ZXJlbyBhY2Nlc3NlZCBhcyAzMiBiaXQgZnJhbWUpLgorICAgICAgICBzaXplX3QgYWxpZ25tZW50ID0gYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpOworICAgICAgICBpZiAoYWxpZ25tZW50ICYgMSkgeworICAgICAgICAgICAgLy8gZm9yIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRCAobm90IGV4cG9zZWQgdGhyb3VnaCBKYXZhKS4KKyAgICAgICAgICAgIGFsaWdubWVudCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKTsKKyAgICAgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KTsKKyAgICAgICAgaWYgKGNoYW5uZWxDb3VudCA+IDEpIHsKKyAgICAgICAgICAgIC8vIE1vcmUgdGhhbiAyIGNoYW5uZWxzIGRvZXMgbm90IHJlcXVpcmUgc3Ryb25nZXIgYWxpZ25tZW50IHRoYW4gc3RlcmVvCisgICAgICAgICAgICBhbGlnbm1lbnQgPDw9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCgodWludHB0cl90KXNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpICYgKGFsaWdubWVudCAtIDEpKSAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBidWZmZXIgYWxpZ25tZW50OiBhZGRyZXNzICVwLCBjaGFubmVsIGNvdW50ICV1IiwKKyAgICAgICAgICAgICAgICAgIHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpLCBjaGFubmVsQ291bnQpOworICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgfQotICAgICAgICB1aW50MzJfdCBtaW5CdWZDb3VudCA9IGxhdGVuY3lNcyAvICgoMTAwMCAqIG1Ob3JtYWxGcmFtZUNvdW50KSAvIG1TYW1wbGVSYXRlKTsKLSAgICAgICAgaWYgKG1pbkJ1ZkNvdW50IDwgMikgewotICAgICAgICAgICAgbWluQnVmQ291bnQgPSAyOworCisgICAgICAgIC8vIFdoZW4gaW5pdGlhbGl6aW5nIGEgc2hhcmVkIGJ1ZmZlciBBdWRpb1RyYWNrIHZpYSBjb25zdHJ1Y3RvcnMsCisgICAgICAgIC8vIHRoZXJlJ3Mgbm8gZnJhbWVDb3VudCBwYXJhbWV0ZXIuCisgICAgICAgIC8vIEJ1dCB3aGVuIGluaXRpYWxpemluZyBhIHNoYXJlZCBidWZmZXIgQXVkaW9UcmFjayB2aWEgc2V0KCksCisgICAgICAgIC8vIHRoZXJlIF9pc18gYSBmcmFtZUNvdW50IHBhcmFtZXRlci4gIFdlIHNpbGVudGx5IGlnbm9yZSBpdC4KKyAgICAgICAgZnJhbWVDb3VudCA9IHNoYXJlZEJ1ZmZlci0+c2l6ZSgpIC8gZnJhbWVTaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIHNpemVfdCBtaW5GcmFtZUNvdW50ID0gMDsKKyAgICAgICAgLy8gRm9yIGZhc3QgdHJhY2tzIHdlIHRyeSB0byByZXNwZWN0IHRoZSBhcHBsaWNhdGlvbidzIHJlcXVlc3QgZm9yIG5vdGlmaWNhdGlvbnMgcGVyIGJ1ZmZlci4KKyAgICAgICAgaWYgKCpmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpIHsKKyAgICAgICAgICAgIGlmIChub3RpZmljYXRpb25zUGVyQnVmZmVyID4gMCkgeworICAgICAgICAgICAgICAgIC8vIEF2b2lkIHBvc3NpYmxlIGFyaXRobWV0aWMgb3ZlcmZsb3cgZHVyaW5nIG11bHRpcGxpY2F0aW9uLgorICAgICAgICAgICAgICAgIGlmIChub3RpZmljYXRpb25zUGVyQnVmZmVyID4gU0laRV9NQVggLyBtRnJhbWVDb3VudCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiUmVxdWVzdGVkIG5vdGlmaWNhdGlvblBlckJ1ZmZlcj0ldSBpZ25vcmVkIGZvciBIQUwgZnJhbWVDb3VudD0lenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25zUGVyQnVmZmVyLCBtRnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbWluRnJhbWVDb3VudCA9IG1GcmFtZUNvdW50ICogbm90aWZpY2F0aW9uc1BlckJ1ZmZlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBGb3Igbm9ybWFsIFBDTSBzdHJlYW1pbmcgdHJhY2tzLCB1cGRhdGUgbWluaW11bSBmcmFtZSBjb3VudC4KKyAgICAgICAgICAgIC8vIEJ1ZmZlciBkZXB0aCBpcyBmb3JjZWQgdG8gYmUgYXQgbGVhc3QgMiB4IHRoZSBub3JtYWwgbWl4ZXIgZnJhbWUgY291bnQgYW5kCisgICAgICAgICAgICAvLyBjb3ZlciBhdWRpbyBoYXJkd2FyZSBsYXRlbmN5LgorICAgICAgICAgICAgLy8gVGhpcyBpcyBwcm9iYWJseSB0b28gY29uc2VydmF0aXZlLCBidXQgbGVnYWN5IGFwcGxpY2F0aW9uIGNvZGUgbWF5IGRlcGVuZCBvbiBpdC4KKyAgICAgICAgICAgIC8vIElmIHlvdSBjaGFuZ2UgdGhpcyBjYWxjdWxhdGlvbiwgYWxzbyByZXZpZXcgdGhlIHN0YXJ0IHRocmVzaG9sZCB3aGljaCBpcyByZWxhdGVkLgorICAgICAgICAgICAgdWludDMyX3QgbGF0ZW5jeU1zID0gbGF0ZW5jeV9sKCk7CisgICAgICAgICAgICBpZiAobGF0ZW5jeU1zID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRXJyb3Igd2hlbiByZXRyaWV2aW5nIG91dHB1dCBzdHJlYW0gbGF0ZW5jeSIpOworICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWluRnJhbWVDb3VudCA9IEF1ZGlvU3lzdGVtOjpjYWxjdWxhdGVNaW5GcmFtZUNvdW50KGxhdGVuY3lNcywgbU5vcm1hbEZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBzYW1wbGVSYXRlLCBzcGVlZCAvKiwgMCBtTm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSovKTsKKwogICAgICAgICB9Ci0gICAgICAgIC8vIEZvciBub3JtYWwgbWl4aW5nIHRyYWNrcywgaWYgc3BlZWQgaXMgPiAxLjBmIChub3JtYWwpLCBBdWRpb1RyYWNrCi0gICAgICAgIC8vIG9yIHRoZSBjbGllbnQgc2hvdWxkIGNvbXB1dGUgYW5kIHBhc3MgaW4gYSBsYXJnZXIgYnVmZmVyIHJlcXVlc3QuCi0gICAgICAgIHNpemVfdCBtaW5GcmFtZUNvdW50ID0KLSAgICAgICAgICAgICAgICBtaW5CdWZDb3VudCAqIHNvdXJjZUZyYW1lc05lZWRlZFdpdGhUaW1lc3RyZXRjaCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIG1Ob3JtYWxGcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX05PUk1BTCAvKnNwZWVkKi8pOwotICAgICAgICBpZiAoZnJhbWVDb3VudCA8IG1pbkZyYW1lQ291bnQpIHsgLy8gaW5jbHVkaW5nIGZyYW1lQ291bnQgPT0gMAorICAgICAgICBpZiAoZnJhbWVDb3VudCA8IG1pbkZyYW1lQ291bnQpIHsKICAgICAgICAgICAgIGZyYW1lQ291bnQgPSBtaW5GcmFtZUNvdW50OwogICAgICAgICB9CiAgICAgfQorCisgICAgLy8gTWFrZSBzdXJlIHRoYXQgYXBwbGljYXRpb24gaXMgbm90aWZpZWQgd2l0aCBzdWZmaWNpZW50IG1hcmdpbiBiZWZvcmUgdW5kZXJydW4uCisgICAgLy8gVGhlIGNsaWVudCBjYW4gZGl2aWRlIHRoZSBBdWRpb1RyYWNrIGJ1ZmZlciBpbnRvIHN1Yi1idWZmZXJzLAorICAgIC8vIGFuZCBleHByZXNzZXMgaXRzIGRlc2lyZSB0byBzZXJ2ZXIgYXMgdGhlIG5vdGlmaWNhdGlvbiBmcmFtZSBjb3VudC4KKyAgICBpZiAoc2hhcmVkQnVmZmVyID09IDAgJiYgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CisgICAgICAgIHNpemVfdCBtYXhOb3RpZmljYXRpb25GcmFtZXM7CisgICAgICAgIGlmICgqZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSB7CisgICAgICAgICAgICAvLyBub3RpZnkgZXZlcnkgSEFMIGJ1ZmZlciwgcmVnYXJkbGVzcyBvZiB0aGUgc2l6ZSBvZiB0aGUgdHJhY2sgYnVmZmVyCisgICAgICAgICAgICBtYXhOb3RpZmljYXRpb25GcmFtZXMgPSBtRnJhbWVDb3VudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEZvciBub3JtYWwgdHJhY2tzLCB1c2UgYXQgbGVhc3QgZG91YmxlLWJ1ZmZlcmluZyBpZiBubyBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uLAorICAgICAgICAgICAgLy8gb3IgYXQgbGVhc3QgdHJpcGxlLWJ1ZmZlcmluZyBpZiB0aGVyZSBpcyBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uCisgICAgICAgICAgICBjb25zdCBpbnQgbkJ1ZmZlcmluZyA9IHNhbXBsZVJhdGUgPT0gbVNhbXBsZVJhdGUgPyAyIDogMzsKKyAgICAgICAgICAgIG1heE5vdGlmaWNhdGlvbkZyYW1lcyA9IGZyYW1lQ291bnQgLyBuQnVmZmVyaW5nOworICAgICAgICAgICAgLy8gSWYgY2xpZW50IHJlcXVlc3RlZCBhIGZhc3QgdHJhY2sgYnV0IHRoaXMgd2FzIGRlbmllZCwgdGhlbiB1c2UgdGhlIHNtYWxsZXIgbWF4aW11bS4KKyAgICAgICAgICAgIGlmIChyZXF1ZXN0ZWRGbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgbWF4Tm90aWZpY2F0aW9uRnJhbWVzRmFzdERlbmllZCA9IEZNU18yMCAqIHNhbXBsZVJhdGUgLyAxMDAwOworICAgICAgICAgICAgICAgIGlmIChtYXhOb3RpZmljYXRpb25GcmFtZXMgPiBtYXhOb3RpZmljYXRpb25GcmFtZXNGYXN0RGVuaWVkKSB7CisgICAgICAgICAgICAgICAgICAgIG1heE5vdGlmaWNhdGlvbkZyYW1lcyA9IG1heE5vdGlmaWNhdGlvbkZyYW1lc0Zhc3REZW5pZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChub3RpZmljYXRpb25GcmFtZUNvdW50ID09IDAgfHwgbm90aWZpY2F0aW9uRnJhbWVDb3VudCA+IG1heE5vdGlmaWNhdGlvbkZyYW1lcykgeworICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJDbGllbnQgZGVmYXVsdGVkIG5vdGlmaWNhdGlvbkZyYW1lcyB0byAlenUgZm9yIGZyYW1lQ291bnQgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgbWF4Tm90aWZpY2F0aW9uRnJhbWVzLCBmcmFtZUNvdW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coIkNsaWVudCBhZGp1c3RlZCBub3RpZmljYXRpb25GcmFtZXMgZnJvbSAlenUgdG8gJXp1IGZvciBmcmFtZUNvdW50ICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVDb3VudCwgbWF4Tm90aWZpY2F0aW9uRnJhbWVzLCBmcmFtZUNvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lQ291bnQgPSBtYXhOb3RpZmljYXRpb25GcmFtZXM7CisgICAgICAgIH0KKyAgICB9CisKICAgICAqcEZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgICpwTm90aWZpY2F0aW9uRnJhbWVDb3VudCA9IG5vdGlmaWNhdGlvbkZyYW1lQ291bnQ7CiAKICAgICBzd2l0Y2ggKG1UeXBlKSB7CiAKQEAgLTIwMjcsNyArMjEzNyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICB0cmFjayA9IG5ldyBUcmFjayh0aGlzLCBjbGllbnQsIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwKKyAgICAgICAgdHJhY2sgPSBuZXcgVHJhY2sodGhpcywgY2xpZW50LCBzdHJlYW1UeXBlLCBhdHRyLCBzYW1wbGVSYXRlLCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIGJ1ZmZlciAqLywgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCB1aWQsICpmbGFncywgVHJhY2tCYXNlOjpUWVBFX0RFRkFVTFQsIHBvcnRJZCk7CkBAIC0yMDYzLDYgKzIxNzMsNTMgQEAKICAgICByZXR1cm4gdHJhY2s7CiB9CiAKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citzc2l6ZV90IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrczxUPjo6YWRkKGNvbnN0IHNwPFQ+ICZ0cmFjaykKK3sKKyAgICBjb25zdCBzc2l6ZV90IGluZGV4ID0gbVRyYWNrcy5hZGQodHJhY2spOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIC8vIHNldCBuYW1lIGZvciB0cmFjayB3aGVuIGFkZGluZy4KKyAgICAgICAgaW50IG5hbWU7CisgICAgICAgIGlmIChtVW51c2VkVHJhY2tOYW1lcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBuYW1lID0gbVRyYWNrcy5zaXplKCkgLSAxOyAvLyBuZXcgbmFtZSB7MCAuLi4gc2l6ZS0xfS4KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHJldXNlIHNtYWxsZXN0IG5hbWUgZm9yIGRlbGV0ZWQgdHJhY2suCisgICAgICAgICAgICBhdXRvIGl0ID0gbVVudXNlZFRyYWNrTmFtZXMuYmVnaW4oKTsKKyAgICAgICAgICAgIG5hbWUgPSAqaXQ7CisgICAgICAgICAgICAodm9pZCltVW51c2VkVHJhY2tOYW1lcy5lcmFzZShpdCk7CisgICAgICAgIH0KKyAgICAgICAgdHJhY2stPnNldE5hbWUobmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiY2Fubm90IGFkZCB0cmFjayIpOworICAgIH0KKyAgICByZXR1cm4gaW5kZXg7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citzc2l6ZV90IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrczxUPjo6cmVtb3ZlKGNvbnN0IHNwPFQ+ICZ0cmFjaykKK3sKKyAgICBjb25zdCBpbnQgbmFtZSA9IHRyYWNrLT5uYW1lKCk7CisgICAgY29uc3Qgc3NpemVfdCBpbmRleCA9IG1UcmFja3MucmVtb3ZlKHRyYWNrKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAvLyBpbnZhbGlkYXRlIG5hbWUgd2hlbiByZW1vdmluZyBmcm9tIG1UcmFja3MuCisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobmFtZSA8IDAsICJpbnZhbGlkIG5hbWUgJWQgZm9yIHRyYWNrIG9uIG1UcmFja3MiLCBuYW1lKTsKKworICAgICAgICBpZiAobVNhdmVEZWxldGVkVHJhY2tOYW1lcykgeworICAgICAgICAgICAgLy8gV2UgY2FuJ3QgZGlyZWN0bHkgYWNjZXNzIG1BdWRpb01peGVyIHNpbmNlIHRoZSBjYWxsZXIgbWF5IGJlIG91dHNpZGUgb2YgdGhyZWFkTG9vcC4KKyAgICAgICAgICAgIC8vIEluc3RlYWQsIHdlIGFkZCB0byBtRGVsZXRlZFRyYWNrTmFtZXMgd2hpY2ggaXMgc29sZWx5IHVzZWQgZm9yIG1BdWRpb01peGVyIHVwZGF0ZSwKKyAgICAgICAgICAgIC8vIHRvIGJlIGhhbmRsZWQgd2hlbiBNaXhlclRocmVhZDo6cHJlcGFyZVRyYWNrc19sKCkgbmV4dCBjaGFuZ2VzIG1BdWRpb01peGVyLgorICAgICAgICAgICAgbURlbGV0ZWRUcmFja05hbWVzLmVtcGxhY2UobmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBtVW51c2VkVHJhY2tOYW1lcy5lbXBsYWNlKG5hbWUpOworICAgICAgICB0cmFjay0+c2V0TmFtZShUOjpUUkFDS19OQU1FX1BFTkRJTkcpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobmFtZSA+PSAwLAorICAgICAgICAgICAgICAgICJ2YWxpZCBuYW1lICVkIGZvciB0cmFjayBub3QgaW4gbVRyYWNrcyAocmV0dXJuZWQgJXpkKSIsIG5hbWUsIGluZGV4KTsKKyAgICB9CisgICAgcmV0dXJuIGluZGV4OworfQorCiB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpjb3JyZWN0TGF0ZW5jeV9sKHVpbnQzMl90IGxhdGVuY3kpIGNvbnN0CiB7CiAgICAgcmV0dXJuIGxhdGVuY3k7CkBAIC0yMjE5LDkgKzIzNzYsNiBAQAogICAgIG1Mb2NhbExvZy5sb2coInJlbW92ZVRyYWNrX2wgKCVwKSAlcyIsIHRyYWNrLmdldCgpLCByZXN1bHQuc3RyaW5nKCkpOwogCiAgICAgbVRyYWNrcy5yZW1vdmUodHJhY2spOwotICAgIGRlbGV0ZVRyYWNrTmFtZV9sKHRyYWNrLT5uYW1lKCkpOwotICAgIC8vIHJlZHVuZGFudCBhcyB0cmFjayBpcyBhYm91dCB0byBiZSBkZXN0cm95ZWQsIGZvciBkdW1wc3lzIG9ubHkKLSAgICB0cmFjay0+bU5hbWUgPSAtMTsKICAgICBpZiAodHJhY2stPmlzRmFzdFRyYWNrKCkpIHsKICAgICAgICAgaW50IGluZGV4ID0gdHJhY2stPm1GYXN0SW5kZXg7CiAgICAgICAgIEFMT0dfQVNTRVJUKDAgPCBpbmRleCAmJiBpbmRleCA8IChpbnQpRmFzdE1peGVyU3RhdGU6OnNNYXhGYXN0VHJhY2tzKTsKQEAgLTI0NDksNyArMjYwMyw3IEBACiAgICAgZnJlZShtRWZmZWN0QnVmZmVyKTsKICAgICBtRWZmZWN0QnVmZmVyID0gTlVMTDsKICAgICBpZiAobUVmZmVjdEJ1ZmZlckVuYWJsZWQpIHsKLSAgICAgICAgbUVmZmVjdEJ1ZmZlckZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOyAvLyBOb3RlOiBFZmZlY3RzIHN1cHBvcnQgMTZiIG9ubHkKKyAgICAgICAgbUVmZmVjdEJ1ZmZlckZvcm1hdCA9IEVGRkVDVF9CVUZGRVJfRk9STUFUOwogICAgICAgICBtRWZmZWN0QnVmZmVyU2l6ZSA9IG1Ob3JtYWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudAogICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtRWZmZWN0QnVmZmVyRm9ybWF0KTsKICAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1FZmZlY3RCdWZmZXIsIDMyLCBtRWZmZWN0QnVmZmVyU2l6ZSk7CkBAIC0yNDY3LDYgKzI2MjEsMzQgQEAKICAgICB9CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6dXBkYXRlTWV0YWRhdGFfbCgpCit7CisgICAgaWYgKG1PdXRwdXQgPT0gbnVsbHB0ciB8fCBtT3V0cHV0LT5zdHJlYW0gPT0gbnVsbHB0ciApIHsKKyAgICAgICAgcmV0dXJuOyAvLyBUaGF0IHNob3VsZCBub3QgaGFwcGVuCisgICAgfQorICAgIGJvb2wgaGFzQ2hhbmdlZCA9IG1BY3RpdmVUcmFja3MucmVhZEFuZENsZWFySGFzQ2hhbmdlZCgpOworICAgIGZvciAoY29uc3Qgc3A8VHJhY2s+ICZ0cmFjayA6IG1BY3RpdmVUcmFja3MpIHsKKyAgICAgICAgLy8gRG8gbm90IHNob3J0LWNpcmN1aXQgYXMgYWxsIGhhc0NoYW5nZWQgc3RhdGVzIG11c3QgYmUgcmVzZXQKKyAgICAgICAgLy8gYXMgYWxsIHRoZSBtZXRhZGF0YSBhcmUgZ29pbmcgdG8gYmUgc2VudAorICAgICAgICBoYXNDaGFuZ2VkIHw9IHRyYWNrLT5yZWFkQW5kQ2xlYXJIYXNDaGFuZ2VkKCk7CisgICAgfQorICAgIGlmICghaGFzQ2hhbmdlZCkgeworICAgICAgICByZXR1cm47IC8vIG5vdGhpbmcgdG8gZG8KKyAgICB9CisgICAgU3RyZWFtT3V0SGFsSW50ZXJmYWNlOjpTb3VyY2VNZXRhZGF0YSBtZXRhZGF0YTsKKyAgICBhdXRvIGJhY2tJbnNlcnRlciA9IHN0ZDo6YmFja19pbnNlcnRlcihtZXRhZGF0YS50cmFja3MpOworICAgIGZvciAoY29uc3Qgc3A8VHJhY2s+ICZ0cmFjayA6IG1BY3RpdmVUcmFja3MpIHsKKyAgICAgICAgLy8gTm8gdHJhY2sgaXMgaW52YWxpZCBhcyB0aGlzIGlzIGNhbGxlZCBhZnRlciBwcmVwYXJlVHJhY2tfbCBpbiB0aGUgc2FtZSBjcml0aWNhbCBzZWN0aW9uCisgICAgICAgIHRyYWNrLT5jb3B5TWV0YWRhdGFUbyhiYWNrSW5zZXJ0ZXIpOworICAgIH0KKyAgICBzZW5kTWV0YWRhdGFUb0JhY2tlbmRfbChtZXRhZGF0YSk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6c2VuZE1ldGFkYXRhVG9CYWNrZW5kX2woCisgICAgICAgIGNvbnN0IFN0cmVhbU91dEhhbEludGVyZmFjZTo6U291cmNlTWV0YWRhdGEmIG1ldGFkYXRhKQoreworICAgIG1PdXRwdXQtPnN0cmVhbS0+dXBkYXRlU291cmNlTWV0YWRhdGEobWV0YWRhdGEpOworfTsKIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmhhbEZyYW1lcywgdWludDMyX3QgKmRzcEZyYW1lcykKIHsKQEAgLTI2MzgsNiArMjgyMCw3IEBACiAvLyBzaGFyZWQgYnkgTUlYRVIgYW5kIERJUkVDVCwgb3ZlcnJpZGRlbiBieSBEVVBMSUNBVElORwogc3NpemVfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjp0aHJlYWRMb29wX3dyaXRlKCkKIHsKKyAgICBMT0dfSElTVF9UUygpOwogICAgIG1JbldyaXRlID0gdHJ1ZTsKICAgICBzc2l6ZV90IGJ5dGVzV3JpdHRlbjsKICAgICBjb25zdCBzaXplX3Qgb2Zmc2V0ID0gbUN1cnJlbnRXcml0ZUxlbmd0aCAtIG1CeXRlc1JlbWFpbmluZzsKQEAgLTI3ODksMjUgKzI5NzIsMjggQEAKIHsKICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IGNoYWluLT5zZXNzaW9uSWQoKTsKICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IGhhbEluQnVmZmVyLCBoYWxPdXRCdWZmZXI7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlOjptaXJyb3IoCisgICAgc3RhdHVzX3QgcmVzdWx0ID0gbUF1ZGlvRmxpbmdlci0+bUVmZmVjdHNGYWN0b3J5SGFsLT5taXJyb3JCdWZmZXIoCiAgICAgICAgICAgICBtRWZmZWN0QnVmZmVyRW5hYmxlZCA/IG1FZmZlY3RCdWZmZXIgOiBtU2lua0J1ZmZlciwKICAgICAgICAgICAgIG1FZmZlY3RCdWZmZXJFbmFibGVkID8gbUVmZmVjdEJ1ZmZlclNpemUgOiBtU2lua0J1ZmZlclNpemUsCiAgICAgICAgICAgICAmaGFsSW5CdWZmZXIpOwogICAgIGlmIChyZXN1bHQgIT0gT0spIHJldHVybiByZXN1bHQ7CiAgICAgaGFsT3V0QnVmZmVyID0gaGFsSW5CdWZmZXI7Ci0gICAgaW50MTZfdCAqYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4oaGFsSW5CdWZmZXItPmV4dGVybmFsRGF0YSgpKTsKLQorICAgIGVmZmVjdF9idWZmZXJfdCAqYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxlZmZlY3RfYnVmZmVyX3QqPihoYWxJbkJ1ZmZlci0+ZXh0ZXJuYWxEYXRhKCkpOwogICAgIEFMT0dWKCJhZGRFZmZlY3RDaGFpbl9sKCkgJXAgb24gdGhyZWFkICVwIGZvciBzZXNzaW9uICVkIiwgY2hhaW4uZ2V0KCksIHRoaXMsIHNlc3Npb24pOwogICAgIGlmIChzZXNzaW9uID4gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSB7CiAgICAgICAgIC8vIE9ubHkgb25lIGVmZmVjdCBjaGFpbiBjYW4gYmUgcHJlc2VudCBpbiBkaXJlY3Qgb3V0cHV0IHRocmVhZCBhbmQgaXQgdXNlcwogICAgICAgICAvLyB0aGUgc2luayBidWZmZXIgYXMgaW5wdXQKICAgICAgICAgaWYgKG1UeXBlICE9IERJUkVDVCkgewogICAgICAgICAgICAgc2l6ZV90IG51bVNhbXBsZXMgPSBtTm9ybWFsRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQ7Ci0gICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U6OmFsbG9jYXRlKAotICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzICogc2l6ZW9mKGludDE2X3QpLAorICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gbUF1ZGlvRmxpbmdlci0+bUVmZmVjdHNGYWN0b3J5SGFsLT5hbGxvY2F0ZUJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyAqIHNpemVvZihlZmZlY3RfYnVmZmVyX3QpLAogICAgICAgICAgICAgICAgICAgICAmaGFsSW5CdWZmZXIpOwogICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBPSykgcmV0dXJuIHJlc3VsdDsKKyNpZmRlZiBGTE9BVF9FRkZFQ1RfQ0hBSU4KKyAgICAgICAgICAgIGJ1ZmZlciA9IGhhbEluQnVmZmVyLT5hdWRpb0J1ZmZlcigpLT5mMzI7CisjZWxzZQogICAgICAgICAgICAgYnVmZmVyID0gaGFsSW5CdWZmZXItPmF1ZGlvQnVmZmVyKCktPnMxNjsKKyNlbmRpZgogICAgICAgICAgICAgQUxPR1YoImFkZEVmZmVjdENoYWluX2woKSBjcmVhdGluZyBuZXcgaW5wdXQgYnVmZmVyICVwIHNlc3Npb24gJWQiLAogICAgICAgICAgICAgICAgICAgICBidWZmZXIsIHNlc3Npb24pOwogICAgICAgICB9CkBAIC0yODgyLDcgKzMwNjgsNyBAQAogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSB0cmFjay0+c2Vzc2lvbklkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNldE1haW5CdWZmZXIocmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4obVNpbmtCdWZmZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNldE1haW5CdWZmZXIocmVpbnRlcnByZXRfY2FzdDxlZmZlY3RfYnVmZmVyX3QqPihtU2lua0J1ZmZlcikpOwogICAgICAgICAgICAgICAgICAgICBjaGFpbi0+ZGVjVHJhY2tDbnQoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0zMTE2LDYgKzMzMDIsMTAgQEAKIAogICAgICAgICAgICAgICAgICAgICB0aHJlYWRMb29wX3N0YW5kYnkoKTsKIAorICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHdoZXJlIHdlIGdvIGludG8gc3RhbmRieQorICAgICAgICAgICAgICAgICAgICBpZiAoIW1TdGFuZGJ5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dfQVVESU9fU1RBVEUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtU3RhbmRieSA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogCkBAIC0zMTU2LDYgKzMzNDYsOCBAQAogCiAgICAgICAgICAgICBtQWN0aXZlVHJhY2tzLnVwZGF0ZVBvd2VyU3RhdGUodGhpcyk7CiAKKyAgICAgICAgICAgIHVwZGF0ZU1ldGFkYXRhX2woKTsKKwogICAgICAgICAgICAgLy8gcHJldmVudCBhbnkgY2hhbmdlcyBpbiBlZmZlY3QgY2hhaW4gbGlzdCBhbmQgaW4gZWFjaCBlZmZlY3QgY2hhaW4KICAgICAgICAgICAgIC8vIGR1cmluZyBtaXhpbmcgYW5kIGVmZmVjdCBwcm9jZXNzIGFzIHRoZSBhdWRpbyBidWZmZXJzIGNvdWxkIGJlIGRlbGV0ZWQKICAgICAgICAgICAgIC8vIG9yIG1vZGlmaWVkIGlmIGFuIGVmZmVjdCBpcyBjcmVhdGVkIG9yIGRlbGV0ZWQKQEAgLTMzMDcsMTAgKzM0OTksMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIuIHRocmVhZExvb3BfbWl4IChzaWduaWZpY2FudCBmb3IgaGVhdnkgbWl4aW5nLCBlc3BlY2lhbGx5CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgb24gbG93IHRpZXIgcHJvY2Vzc29ycykKIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBPSyBpZiBkZWx0YU1zIGlzIGFuIG92ZXJlc3RpbWF0ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZGVsdGFNcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYXN0V3JpdGVGaW5pc2hlZCAtIHByZXZpb3VzTGFzdFdyaXRlRmluaXNoZWQpIC8gMTAwMDAwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdGhyb3R0bGVNcyA9IG1IYWxmQnVmZmVyTXMgLSBkZWx0YU1zOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBPSyBpZiBkZWx0YU1zIChhbmQgZGVsdGFOcykgaXMgYW4gb3ZlcmVzdGltYXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBkZWx0YU5zOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsdGFOcyA9IGxhc3RXcml0ZUZpbmlzaGVkIC0gcHJldmlvdXNMYXN0V3JpdGVGaW5pc2hlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9zdWJfb3ZlcmZsb3coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFdyaXRlRmluaXNoZWQscHJldmlvdXNMYXN0V3JpdGVGaW5pc2hlZCwgJmRlbHRhTnMpOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBkZWx0YU1zID0gZGVsdGFOcyAvIDEwMDAwMDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdGhyb3R0bGVNcyA9IChpbnQzMl90KW1IYWxmQnVmZmVyTXMgLSBkZWx0YU1zOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzaWduZWQpbUhhbGZCdWZmZXJNcyA+PSB0aHJvdHRsZU1zICYmIHRocm90dGxlTXMgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNsZWVwKHRocm90dGxlTXMgKiAxMDAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RpZnkgb2YgdGhyb3R0bGUgc3RhcnQgb24gdmVyYm9zZSBsb2cKQEAgLTMzMjcsNyArMzUyMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmeSBvZiB0aHJvdHRsZSBlbmQgb24gZGVidWcgbG9nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBwcmV2ZW50IHNwYW1taW5nIGZvciBibHVldG9vdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0RfSUYoIWF1ZGlvX2lzX2EyZHBfb3V0X2RldmljZShvdXREZXZpY2UoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEX0lGKCFhdWRpb19pc19hMmRwX291dF9kZXZpY2Uob3V0RGV2aWNlKCkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFhdWRpb19pc19oZWFyaW5nX2FpZF9vdXRfZGV2aWNlKG91dERldmljZSgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWl4ZXIoJXApIHRocm90dGxlIGVuZDogdGhyb3R0bGUgdGltZSgldSkiLCB0aGlzLCBkaWZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZFRocm90dGxlRW5kTXMgPSBtVGhyZWFkVGhyb3R0bGVUaW1lTXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMzU5Nyw3ICszNzk0LDcgQEAKICAgICAgICAgLy8gbU5vcm1hbFNpbmsgYmVsb3cKIHsKICAgICBBTE9HVigiTWl4ZXJUaHJlYWQoKSBpZD0lZCBkZXZpY2U9JSN4IHR5cGU9JWQiLCBpZCwgZGV2aWNlLCB0eXBlKTsKLSAgICBBTE9HVigibVNhbXBsZVJhdGU9JXUsIG1DaGFubmVsTWFzaz0lI3gsIG1DaGFubmVsQ291bnQ9JXUsIG1Gb3JtYXQ9JWQsIG1GcmFtZVNpemU9JXp1LCAiCisgICAgQUxPR1YoIm1TYW1wbGVSYXRlPSV1LCBtQ2hhbm5lbE1hc2s9JSN4LCBtQ2hhbm5lbENvdW50PSV1LCBtRm9ybWF0PSUjeCwgbUZyYW1lU2l6ZT0lenUsICIKICAgICAgICAgICAgICJtRnJhbWVDb3VudD0lenUsIG1Ob3JtYWxGcmFtZUNvdW50PSV6dSIsCiAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbUNoYW5uZWxNYXNrLCBtQ2hhbm5lbENvdW50LCBtRm9ybWF0LCBtRnJhbWVTaXplLCBtRnJhbWVDb3VudCwKICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50KTsKQEAgLTM2NjUsNyArMzg2Miw3IEBACiAgICAgICAgIE5CQUlPX0Zvcm1hdCBvcmlnZm9ybWF0ID0gZm9ybWF0OwogI2VuZGlmCiAgICAgICAgIC8vIGFkanVzdCBmb3JtYXQgdG8gbWF0Y2ggdGhhdCBvZiB0aGUgRmFzdCBNaXhlcgotICAgICAgICBBTE9HVigiZm9ybWF0IGNoYW5nZWQgZnJvbSAlZCB0byAlZCIsIGZvcm1hdC5tRm9ybWF0LCBmYXN0TWl4ZXJGb3JtYXQpOworICAgICAgICBBTE9HVigiZm9ybWF0IGNoYW5nZWQgZnJvbSAlI3ggdG8gJSN4IiwgZm9ybWF0Lm1Gb3JtYXQsIGZhc3RNaXhlckZvcm1hdCk7CiAgICAgICAgIGZvcm1hdC5tRm9ybWF0ID0gZmFzdE1peGVyRm9ybWF0OwogICAgICAgICBmb3JtYXQubUZyYW1lU2l6ZSA9IGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0Lm1Gb3JtYXQpICogZm9ybWF0Lm1DaGFubmVsQ291bnQ7CiAKQEAgLTM5NzIsMTYgKzQxNjksMzEgQEAKICAgICAvLyBidWZmZXIgc2l6ZSwgdGhlbiB3cml0ZSAwcyB0byB0aGUgb3V0cHV0CiAgICAgaWYgKG1TbGVlcFRpbWVVcyA9PSAwKSB7CiAgICAgICAgIGlmIChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIG1TbGVlcFRpbWVVcyA9IG1BY3RpdmVTbGVlcFRpbWVVcyA+PiBzbGVlcFRpbWVTaGlmdDsKLSAgICAgICAgICAgIGlmIChtU2xlZXBUaW1lVXMgPCBrTWluVGhyZWFkU2xlZXBUaW1lVXMpIHsKLSAgICAgICAgICAgICAgICBtU2xlZXBUaW1lVXMgPSBrTWluVGhyZWFkU2xlZXBUaW1lVXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyByZWR1Y2Ugc2xlZXAgdGltZSBpbiBjYXNlIG9mIGNvbnNlY3V0aXZlIGFwcGxpY2F0aW9uIHVuZGVycnVucyB0byBhdm9pZAotICAgICAgICAgICAgLy8gc3RhcnZpbmcgdGhlIGF1ZGlvIEhBTC4gQXMgYWN0aXZlU2xlZXBUaW1lVXMoKSBpcyBsYXJnZXIgdGhhbiBhIGJ1ZmZlcgotICAgICAgICAgICAgLy8gZHVyYXRpb24gd2Ugd291bGQgZW5kIHVwIHdyaXRpbmcgbGVzcyBkYXRhIHRoYW4gbmVlZGVkIGJ5IHRoZSBhdWRpbyBIQUwgaWYKLSAgICAgICAgICAgIC8vIHRoZSBjb25kaXRpb24gcGVyc2lzdHMuCi0gICAgICAgICAgICBpZiAoc2xlZXBUaW1lU2hpZnQgPCBrTWF4VGhyZWFkU2xlZXBUaW1lU2hpZnQpIHsKLSAgICAgICAgICAgICAgICBzbGVlcFRpbWVTaGlmdCsrOworICAgICAgICAgICAgaWYgKG1QaXBlU2luay5nZXQoKSAhPSBudWxscHRyICYmIG1QaXBlU2luayA9PSBtTm9ybWFsU2luaykgeworICAgICAgICAgICAgICAgIC8vIFVzaW5nIHRoZSBNb25vcGlwZSBhdmFpbGFibGVUb1dyaXRlLCB3ZSBlc3RpbWF0ZSB0aGUKKyAgICAgICAgICAgICAgICAvLyBzbGVlcCB0aW1lIHRvIHJldHJ5IGZvciBtb3JlIGRhdGEgKGJlZm9yZSB3ZSB1bmRlcnJ1bikuCisgICAgICAgICAgICAgICAgTW9ub1BpcGUgKm1vbm9QaXBlID0gc3RhdGljX2Nhc3Q8TW9ub1BpcGUgKj4obVBpcGVTaW5rLmdldCgpKTsKKyAgICAgICAgICAgICAgICBjb25zdCBzc2l6ZV90IGF2YWlsYWJsZVRvV3JpdGUgPSBtUGlwZVNpbmstPmF2YWlsYWJsZVRvV3JpdGUoKTsKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgcGlwZUZyYW1lcyA9IG1vbm9QaXBlLT5tYXhGcmFtZXMoKTsKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgZnJhbWVzTGVmdCA9IHBpcGVGcmFtZXMgLSBtYXgoYXZhaWxhYmxlVG9Xcml0ZSwgMCk7CisgICAgICAgICAgICAgICAgLy8gSEFMX2ZyYW1lY291bnQgPD0gZnJhbWVzRGVsYXkgfiBmcmFtZXNMZWZ0IC8gMiA8PSBOb3JtYWxfTWl4ZXJfZnJhbWVjb3VudAorICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBmcmFtZXNEZWxheSA9IHN0ZDo6bWluKAorICAgICAgICAgICAgICAgICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQsIG1heChmcmFtZXNMZWZ0IC8gMiwgbUZyYW1lQ291bnQpKTsKKyAgICAgICAgICAgICAgICBBTE9HVigicGlwZUZyYW1lczolenUgZnJhbWVzTGVmdDolenUgZnJhbWVzRGVsYXk6JXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVGcmFtZXMsIGZyYW1lc0xlZnQsIGZyYW1lc0RlbGF5KTsKKyAgICAgICAgICAgICAgICBtU2xlZXBUaW1lVXMgPSBmcmFtZXNEZWxheSAqIE1JQ1JPU19QRVJfU0VDT05EIC8gbVNhbXBsZVJhdGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TbGVlcFRpbWVVcyA9IG1BY3RpdmVTbGVlcFRpbWVVcyA+PiBzbGVlcFRpbWVTaGlmdDsKKyAgICAgICAgICAgICAgICBpZiAobVNsZWVwVGltZVVzIDwga01pblRocmVhZFNsZWVwVGltZVVzKSB7CisgICAgICAgICAgICAgICAgICAgIG1TbGVlcFRpbWVVcyA9IGtNaW5UaHJlYWRTbGVlcFRpbWVVczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gcmVkdWNlIHNsZWVwIHRpbWUgaW4gY2FzZSBvZiBjb25zZWN1dGl2ZSBhcHBsaWNhdGlvbiB1bmRlcnJ1bnMgdG8gYXZvaWQKKyAgICAgICAgICAgICAgICAvLyBzdGFydmluZyB0aGUgYXVkaW8gSEFMLiBBcyBhY3RpdmVTbGVlcFRpbWVVcygpIGlzIGxhcmdlciB0aGFuIGEgYnVmZmVyCisgICAgICAgICAgICAgICAgLy8gZHVyYXRpb24gd2Ugd291bGQgZW5kIHVwIHdyaXRpbmcgbGVzcyBkYXRhIHRoYW4gbmVlZGVkIGJ5IHRoZSBhdWRpbyBIQUwgaWYKKyAgICAgICAgICAgICAgICAvLyB0aGUgY29uZGl0aW9uIHBlcnNpc3RzLgorICAgICAgICAgICAgICAgIGlmIChzbGVlcFRpbWVTaGlmdCA8IGtNYXhUaHJlYWRTbGVlcFRpbWVTaGlmdCkgeworICAgICAgICAgICAgICAgICAgICBzbGVlcFRpbWVTaGlmdCsrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1TbGVlcFRpbWVVcyA9IG1JZGxlU2xlZXBUaW1lVXM7CkBAIC00MDA1LDYgKzQyMTcsMTQgQEAKIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Om1peGVyX3N0YXRlIEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OnByZXBhcmVUcmFja3NfbCgKICAgICAgICAgVmVjdG9yPCBzcDxUcmFjaz4gPiAqdHJhY2tzVG9SZW1vdmUpCiB7CisgICAgLy8gY2xlYW4gdXAgZGVsZXRlZCB0cmFjayBuYW1lcyBpbiBBdWRpb01peGVyIGJlZm9yZSBhbGxvY2F0aW5nIG5ldyB0cmFja3MKKyAgICAodm9pZCltVHJhY2tzLnByb2Nlc3NEZWxldGVkVHJhY2tOYW1lcyhbdGhpc10oaW50IG5hbWUpIHsKKyAgICAgICAgLy8gZm9yIGVhY2ggbmFtZSwgZGVzdHJveSBpdCBpbiB0aGUgQXVkaW9NaXhlcgorICAgICAgICBpZiAobUF1ZGlvTWl4ZXItPmV4aXN0cyhuYW1lKSkgeworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPmRlc3Ryb3kobmFtZSk7CisgICAgICAgIH0KKyAgICB9KTsKKyAgICBtVHJhY2tzLmNsZWFyRGVsZXRlZFRyYWNrTmFtZXMoKTsKIAogICAgIG1peGVyX3N0YXRlIG1peGVyU3RhdHVzID0gTUlYRVJfSURMRTsKICAgICAvLyBmaW5kIG91dCB3aGljaCB0cmFja3MgbmVlZCB0byBiZSBwcm9jZXNzZWQKQEAgLTQxODIsMTMgKzQ0MDIsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgZGlkTW9kaWZ5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgLy8gbm8gYWNrbm93bGVkZ2VtZW50IHJlcXVpcmVkIGZvciBuZXdseSBhY3RpdmUgdHJhY2tzCiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNwPEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eT4gcHJveHkgPSB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTsKICAgICAgICAgICAgICAgICAvLyBjYWNoZSB0aGUgY29tYmluZWQgbWFzdGVyIHZvbHVtZSBhbmQgc3RyZWFtIHR5cGUgdm9sdW1lIGZvciBmYXN0IG1peGVyOyB0aGlzCiAgICAgICAgICAgICAgICAgLy8gbGFja3MgYW55IHN5bmNocm9uaXphdGlvbiBvciBiYXJyaWVyIHNvIFZvbHVtZVByb3ZpZGVyIG1heSByZWFkIGEgc3RhbGUgdmFsdWUKICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCB2aCA9IHRyYWNrLT5nZXRWb2x1bWVIYW5kbGVyKCktPmdldFZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNSZWxlYXNlZCgpKS5maXJzdDsKLSAgICAgICAgICAgICAgICB0cmFjay0+bUNhY2hlZFZvbHVtZSA9IG1hc3RlclZvbHVtZQorICAgICAgICAgICAgICAgICAgICAgICAgcHJveHktPmZyYW1lc1JlbGVhc2VkKCkpLmZpcnN0OworICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSA9IG1hc3RlclZvbHVtZQogICAgICAgICAgICAgICAgICAgICAgICAgKiBtU3RyZWFtVHlwZXNbdHJhY2stPnN0cmVhbVR5cGUoKV0udm9sdW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAqIHZoOworICAgICAgICAgICAgICAgIHRyYWNrLT5tQ2FjaGVkVm9sdW1lID0gdm9sdW1lOworICAgICAgICAgICAgICAgIGdhaW5fbWluaWZsb2F0X3BhY2tlZF90IHZsciA9IHByb3h5LT5nZXRWb2x1bWVMUigpOworICAgICAgICAgICAgICAgIGZsb2F0IHZsZiA9IHZvbHVtZSAqIGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfbGVmdCh2bHIpKTsKKyAgICAgICAgICAgICAgICBmbG9hdCB2cmYgPSB2b2x1bWUgKiBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX3JpZ2h0KHZscikpOworICAgICAgICAgICAgICAgIHRyYWNrLT5zZXRGaW5hbFZvbHVtZSgodmxmICsgdnJmKSAvIDIuZik7CiAgICAgICAgICAgICAgICAgKytmYXN0VHJhY2tzOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyB3YXMgaXQgcHJldmlvdXNseSBhY3RpdmU/CkBAIC00MjAxLDEwICs0NDI3LDE2IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2Ugd2UncmUgYWJvdXQgdG8gZGVjcmVtZW50IHRoZSBsYXN0IHNwPD4gb24gdGhvc2UgdHJhY2tzLgogICAgICAgICAgICAgICAgICAgICBibG9jayA9IEZhc3RNaXhlclN0YXRlUXVldWU6OkJMT0NLX1VOVElMX0FDS0VEOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImZhc3QgdHJhY2sgJWQgc2hvdWxkIGhhdmUgYmVlbiBhY3RpdmU7ICIKKyAgICAgICAgICAgICAgICAgICAgLy8gQUxPR1cgcmF0aGVyIHRoYW4gTE9HX0FMV0FZU19GQVRBTCBiZWNhdXNlIGl0IHNlZW1zIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSBhbgorICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb1RyYWNrIG1heSBzdGFydCAod2hpY2ggbWF5IG5vdCBiZSB3aXRoIGEgc3RhcnQoKSBidXQgd2l0aCBhIHdyaXRlKCkKKyAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgdW5kZXJydW4pIGFuZCBpbW1lZGlhdGVseSBwYXVzZWQgb3IgcmVsZWFzZWQuICBJbiB0aGF0IGNhc2UgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIEZhc3RUcmFjayBzdGF0ZSBoYXNuJ3QgaGFkIHRpbWUgdG8gdXBkYXRlLgorICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIFJlbW92ZSB0aGUgQUxPR1cgd2hlbiB0aGlzIHRoZW9yeSBpcyBjb25maXJtZWQuCisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJmYXN0IHRyYWNrICVkIHNob3VsZCBoYXZlIGJlZW4gYWN0aXZlOyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1TdGF0ZT0lZCwgbVRyYWNrTWFzaz0lI3gsIHJlY2VudFVuZGVycnVucz0ldSwgaXNTaGFyZWQ9JWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGosIHRyYWNrLT5tU3RhdGUsIHN0YXRlLT5tVHJhY2tNYXNrLCByZWNlbnRVbmRlcnJ1bnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNoYXJlZEJ1ZmZlcigpICE9IDApOworICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGUgRmFzdE1peGVyIHN0YXRlIGFscmVhZHkgaGFzIHRoZSB0cmFjayBpbmFjdGl2ZSwgZG8gbm90aGluZyBoZXJlLgogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKICAgICAgICAgICAgICAgICAvLyBBdm9pZHMgYSBtaXNsZWFkaW5nIGRpc3BsYXkgaW4gZHVtcHN5cwpAQCAtNDIyMCw2ICs0NDUyLDI0IEBACiAgICAgICAgIC8vIFRoZSBmaXJzdCB0aW1lIGEgdHJhY2sgaXMgYWRkZWQgd2Ugd2FpdAogICAgICAgICAvLyBmb3IgYWxsIGl0cyBidWZmZXJzIHRvIGJlIGZpbGxlZCBiZWZvcmUgcHJvY2Vzc2luZyBpdAogICAgICAgICBpbnQgbmFtZSA9IHRyYWNrLT5uYW1lKCk7CisKKyAgICAgICAgLy8gaWYgYW4gYWN0aXZlIHRyYWNrIGRvZXNuJ3QgZXhpc3QgaW4gdGhlIEF1ZGlvTWl4ZXIsIGNyZWF0ZSBpdC4KKyAgICAgICAgaWYgKCFtQXVkaW9NaXhlci0+ZXhpc3RzKG5hbWUpKSB7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9NaXhlci0+Y3JlYXRlKAorICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICB0cmFjay0+bUNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICB0cmFjay0+bUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1TZXNzaW9uSWQpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlczogY2Fubm90IGNyZWF0ZSB0cmFjayBuYW1lIgorICAgICAgICAgICAgICAgICAgICAgICAgIiAlZCwgbWFzayAlI3gsIGZvcm1hdCAlI3gsIHNlc3Npb25JZCAlZCBpbiBBdWRpb01peGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBuYW1lLCB0cmFjay0+bUNoYW5uZWxNYXNrLCB0cmFjay0+bUZvcm1hdCwgdHJhY2stPm1TZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOworICAgICAgICAgICAgICAgIHRyYWNrLT5pbnZhbGlkYXRlKCk7IC8vIGNvbnNpZGVyIGl0IGRlYWQuCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGVub3VnaCBmcmFtZXMgdG8gbWl4IG9uZSBmdWxsIGJ1ZmZlci4KICAgICAgICAgLy8gZW5mb3JjZSB0aGlzIGNvbmRpdGlvbiBvbmx5IG9uY2UgdG8gZW5hYmxlIGRyYWluaW5nIHRoZSBidWZmZXIgaW4gY2FzZSB0aGUgY2xpZW50CiAgICAgICAgIC8vIGFwcCBkb2VzIG5vdCBjYWxsIHN0b3AoKSBhbmQgcmVsaWVzIG9uIHVuZGVycnVuIHRvIHN0b3A6CkBAIC00MjQ1LDIwICs0NDk1LDkgQEAKICAgICAgICAgc2l6ZV90IGZyYW1lc1JlYWR5ID0gdHJhY2stPmZyYW1lc1JlYWR5KCk7CiAgICAgICAgIGlmIChBVFJBQ0VfRU5BQkxFRCgpKSB7CiAgICAgICAgICAgICAvLyBJIHdpc2ggd2UgaGFkIGZvcm1hdHRlZCB0cmFjZSBuYW1lcwotICAgICAgICAgICAgY2hhciB0cmFjZU5hbWVbMTZdOwotICAgICAgICAgICAgc3RyY3B5KHRyYWNlTmFtZSwgIm5SZHkiKTsKLSAgICAgICAgICAgIGludCBuYW1lID0gdHJhY2stPm5hbWUoKTsKLSAgICAgICAgICAgIGlmIChBdWRpb01peGVyOjpUUkFDSzAgPD0gbmFtZSAmJgotICAgICAgICAgICAgICAgICAgICBuYW1lIDwgKGludCkgKEF1ZGlvTWl4ZXI6OlRSQUNLMCArIEF1ZGlvTWl4ZXI6Ok1BWF9OVU1fVFJBQ0tTKSkgewotICAgICAgICAgICAgICAgIG5hbWUgLT0gQXVkaW9NaXhlcjo6VFJBQ0swOwotICAgICAgICAgICAgICAgIHRyYWNlTmFtZVs0XSA9IChuYW1lIC8gMTApICsgJzAnOwotICAgICAgICAgICAgICAgIHRyYWNlTmFtZVs1XSA9IChuYW1lICUgMTApICsgJzAnOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cmFjZU5hbWVbNF0gPSAnPyc7Ci0gICAgICAgICAgICAgICAgdHJhY2VOYW1lWzVdID0gJz8nOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJhY2VOYW1lWzZdID0gJ1wwJzsKLSAgICAgICAgICAgIEFUUkFDRV9JTlQodHJhY2VOYW1lLCBmcmFtZXNSZWFkeSk7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyB0cmFjZU5hbWUoIm5SZHkiKTsKKyAgICAgICAgICAgIHRyYWNlTmFtZSArPSBzdGQ6OnRvX3N0cmluZyh0cmFjay0+bmFtZSgpKTsKKyAgICAgICAgICAgIEFUUkFDRV9JTlQodHJhY2VOYW1lLmNfc3RyKCksIGZyYW1lc1JlYWR5KTsKICAgICAgICAgfQogICAgICAgICBpZiAoKGZyYW1lc1JlYWR5ID49IG1pbkZyYW1lcykgJiYgdHJhY2stPmlzUmVhZHkoKSAmJgogICAgICAgICAgICAgICAgICF0cmFjay0+aXNQYXVzZWQoKSAmJiAhdHJhY2stPmlzVGVybWluYXRlZCgpKQpAQCAtNDM1Miw2ICs0NTkxLDggQEAKICAgICAgICAgICAgICAgICB2YWYgPSB2ICogc2VuZExldmVsICogKDEuIC8gTUFYX0dBSU5fSU5UKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgdHJhY2stPnNldEZpbmFsVm9sdW1lKCh2cmYgKyB2bGYpIC8gMi5mKTsKKwogICAgICAgICAgICAgLy8gRGVsZWdhdGUgdm9sdW1lIGNvbnRyb2wgdG8gZWZmZWN0IGluIHRyYWNrIGVmZmVjdCBjaGFpbiBpZiBuZWVkZWQKICAgICAgICAgICAgIGlmIChjaGFpbiAhPSAwICYmIGNoYWluLT5zZXRWb2x1bWVfbCgmdmwsICZ2cikpIHsKICAgICAgICAgICAgICAgICAvLyBEbyBub3QgcmFtcCB2b2x1bWUgaWYgdm9sdW1lIGlzIGNvbnRyb2xsZWQgYnkgZWZmZWN0CkBAIC00NDU3LDcgKzQ2OTgsNyBAQAogICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCi0gICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9GT1JNQVQsICh2b2lkICopQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpOworICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULCAodm9pZCAqKUVGRkVDVF9CVUZGRVJfRk9STUFUKTsKICAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLApAQCAtNDU4MSw2ICs0ODIyLDE4IEBACiAgICAgICAgIHRyYWNrLT5yZXNldCgpOwogICAgIH0KIAorICAgIC8vIFRyYWNrIGRlc3RydWN0aW9uIG1heSBvY2N1ciBvdXRzaWRlIG9mIHRocmVhZExvb3Agb25jZSBpdCBpcyByZW1vdmVkIGZyb20gYWN0aXZlIHRyYWNrcy4KKyAgICAvLyBFbnN1cmUgdGhlIEF1ZGlvTWl4ZXIgZG9lc24ndCBoYXZlIGEgcmF3ICJidWZmZXIgcHJvdmlkZXIiIHBvaW50ZXIgdG8gdGhlIHRyYWNrIGlmCisgICAgLy8gaXQgY2Vhc2VzIHRvIGJlIGFjdGl2ZSwgdG8gYWxsb3cgc2FmZSByZW1vdmFsIGZyb20gdGhlIEF1ZGlvTWl4ZXIgYXQgdGhlIHN0YXJ0CisgICAgLy8gb2YgcHJlcGFyZVRyYWNrc19sKCk7IHRoaXMgcmVsZWFzZXMgYW55IG91dHN0YW5kaW5nIGJ1ZmZlciBiYWNrIHRvIHRoZSB0cmFjay4KKyAgICAvLyBTZWUgYWxzbyB0aGUgaW1wbGVtZW50YXRpb24gb2YgZGVzdHJveVRyYWNrX2woKS4KKyAgICBmb3IgKGNvbnN0IGF1dG8gJnRyYWNrIDogKnRyYWNrc1RvUmVtb3ZlKSB7CisgICAgICAgIGNvbnN0IGludCBuYW1lID0gdHJhY2stPm5hbWUoKTsKKyAgICAgICAgaWYgKG1BdWRpb01peGVyLT5leGlzdHMobmFtZSkpIHsgLy8gTm9ybWFsIHRyYWNrcyBoZXJlLCBmYXN0IHRyYWNrcyBpbiBGYXN0TWl4ZXIuCisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgbnVsbHB0ciAvKiBidWZmZXJQcm92aWRlciAqLyk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyByZW1vdmUgYWxsIHRoZSB0cmFja3MgdGhhdCBuZWVkIHRvIGJlLi4uCiAgICAgcmVtb3ZlVHJhY2tzX2woKnRyYWNrc1RvUmVtb3ZlKTsKIApAQCAtNDYyNCw3ICs0ODc3LDcgQEAKIH0KIAogLy8gdHJhY2tDb3VudEZvclVpZF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCi11aW50MzJfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjp0cmFja0NvdW50Rm9yVWlkX2wodWlkX3QgdWlkKQordWludDMyX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6dHJhY2tDb3VudEZvclVpZF9sKHVpZF90IHVpZCkgY29uc3QKIHsKICAgICB1aW50MzJfdCB0cmFja0NvdW50ID0gMDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpIDsgaSsrKSB7CkBAIC00NjM1LDIxICs0ODg4LDI0IEBACiAgICAgcmV0dXJuIHRyYWNrQ291bnQ7CiB9CiAKLS8vIGdldFRyYWNrTmFtZV9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCi1pbnQgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6Z2V0VHJhY2tOYW1lX2woYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwgdWlkX3QgdWlkKQorLy8gaXNUcmFja0FsbG93ZWRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAorYm9vbCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjppc1RyYWNrQWxsb3dlZF9sKAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLCB1aWRfdCB1aWQpIGNvbnN0CiB7Ci0gICAgaWYgKHRyYWNrQ291bnRGb3JVaWRfbCh1aWQpID4gKFBsYXliYWNrVGhyZWFkOjprTWF4VHJhY2tzUGVyVWlkIC0gMSkpIHsKLSAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghUGxheWJhY2tUaHJlYWQ6OmlzVHJhY2tBbGxvd2VkX2woY2hhbm5lbE1hc2ssIGZvcm1hdCwgc2Vzc2lvbklkLCB1aWQpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgcmV0dXJuIG1BdWRpb01peGVyLT5nZXRUcmFja05hbWUoY2hhbm5lbE1hc2ssIGZvcm1hdCwgc2Vzc2lvbklkKTsKLX0KLQotLy8gZGVsZXRlVHJhY2tOYW1lX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKLXZvaWQgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6ZGVsZXRlVHJhY2tOYW1lX2woaW50IG5hbWUpCi17Ci0gICAgQUxPR1YoInJlbW92ZSB0cmFjayAoJWQpIGFuZCBkZWxldGUgZnJvbSBtaXhlciIsIG5hbWUpOwotICAgIG1BdWRpb01peGVyLT5kZWxldGVUcmFja05hbWUobmFtZSk7CisgICAgLy8gQ2hlY2sgdmFsaWRpdHkgYXMgd2UgZG9uJ3QgY2FsbCBBdWRpb01peGVyOjpjcmVhdGUoKSBoZXJlLgorICAgIGlmICghQXVkaW9NaXhlcjo6aXNWYWxpZEZvcm1hdChmb3JtYXQpKSB7CisgICAgICAgIEFMT0dXKCIlczogaW52YWxpZCBmb3JtYXQ6ICUjeCIsIF9fZnVuY19fLCBmb3JtYXQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghQXVkaW9NaXhlcjo6aXNWYWxpZENoYW5uZWxNYXNrKGNoYW5uZWxNYXNrKSkgeworICAgICAgICBBTE9HVygiJXM6IGludmFsaWQgY2hhbm5lbE1hc2s6ICUjeCIsIF9fZnVuY19fLCBjaGFubmVsTWFzayk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIC8vIGNoZWNrRm9yTmV3UGFyYW1ldGVyX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKQEAgLTQ3NDIsMTMgKzQ5OTgsMTggQEAKICAgICAgICAgICAgIHJlYWRPdXRwdXRQYXJhbWV0ZXJzX2woKTsKICAgICAgICAgICAgIGRlbGV0ZSBtQXVkaW9NaXhlcjsKICAgICAgICAgICAgIG1BdWRpb01peGVyID0gbmV3IEF1ZGlvTWl4ZXIobU5vcm1hbEZyYW1lQ291bnQsIG1TYW1wbGVSYXRlKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCkgOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgbmFtZSA9IGdldFRyYWNrTmFtZV9sKG1UcmFja3NbaV0tPm1DaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja3NbaV0tPm1Gb3JtYXQsIG1UcmFja3NbaV0tPm1TZXNzaW9uSWQsIG1UcmFja3NbaV0tPnVpZCgpKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1UcmFja3NbaV0tPm1OYW1lID0gbmFtZTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmdHJhY2sgOiBtVHJhY2tzKSB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IG5hbWUgPSB0cmFjay0+bmFtZSgpOworICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb01peGVyLT5jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1DaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1TZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlczogY2Fubm90IGNyZWF0ZSB0cmFjayBuYW1lIgorICAgICAgICAgICAgICAgICAgICAgICAgIiAlZCwgbWFzayAlI3gsIGZvcm1hdCAlI3gsIHNlc3Npb25JZCAlZCBpbiBBdWRpb01peGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdHJhY2stPm1DaGFubmVsTWFzaywgdHJhY2stPm1Gb3JtYXQsIHRyYWNrLT5tU2Vzc2lvbklkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEKTsKICAgICAgICAgfQpAQCAtNDc2Miw3ICs1MDIzLDcgQEAKIHsKICAgICBQbGF5YmFja1RocmVhZDo6ZHVtcEludGVybmFscyhmZCwgYXJncyk7CiAgICAgZHByaW50ZihmZCwgIiAgVGhyZWFkIHRocm90dGxlIHRpbWUgKG1zZWNzKTogJXVcbiIsIG1UaHJlYWRUaHJvdHRsZVRpbWVNcyk7Ci0gICAgZHByaW50ZihmZCwgIiAgQXVkaW9NaXhlciB0cmFja3M6IDB4JTA4eFxuIiwgbUF1ZGlvTWl4ZXItPnRyYWNrTmFtZXMoKSk7CisgICAgZHByaW50ZihmZCwgIiAgQXVkaW9NaXhlciB0cmFja3M6ICVzXG4iLCBtQXVkaW9NaXhlci0+dHJhY2tOYW1lcygpLmNfc3RyKCkpOwogICAgIGRwcmludGYoZmQsICIgIE1hc3RlciBtb25vOiAlc1xuIiwgbU1hc3Rlck1vbm8gPyAib24iIDogIm9mZiIpOwogCiAgICAgaWYgKGhhc0Zhc3RNaXhlcigpKSB7CkBAIC00ODc2LDYgKzUxMzcsNyBAQAogICAgIH0KIAogICAgIGlmIChsYXN0VHJhY2spIHsKKyAgICAgICAgdHJhY2stPnNldEZpbmFsVm9sdW1lKChsZWZ0ICsgcmlnaHQpIC8gMi5mKTsKICAgICAgICAgaWYgKGxlZnQgIT0gbUxlZnRWb2xGbG9hdCB8fCByaWdodCAhPSBtUmlnaHRWb2xGbG9hdCkgewogICAgICAgICAgICAgbUxlZnRWb2xGbG9hdCA9IGxlZnQ7CiAgICAgICAgICAgICBtUmlnaHRWb2xGbG9hdCA9IHJpZ2h0OwpAQCAtNTE5NywyMSArNTQ1OSw2IEBACiAgICAgcmV0dXJuICFtU3RhbmRieSAmJiAhKHRyYWNrUGF1c2VkIHx8IChtSHdQYXVzZWQgJiYgIXRyYWNrU3RvcHBlZCkpOwogfQogCi0vLyBnZXRUcmFja05hbWVfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAotaW50IEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpnZXRUcmFja05hbWVfbChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayBfX3VudXNlZCwKLSAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0IF9fdW51c2VkLCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkIF9fdW51c2VkLCB1aWRfdCB1aWQpCi17Ci0gICAgaWYgKHRyYWNrQ291bnRGb3JVaWRfbCh1aWQpID4gKFBsYXliYWNrVGhyZWFkOjprTWF4VHJhY2tzUGVyVWlkIC0gMSkpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLy8gZGVsZXRlVHJhY2tOYW1lX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKLXZvaWQgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OmRlbGV0ZVRyYWNrTmFtZV9sKGludCBuYW1lIF9fdW51c2VkKQotewotfQotCiAvLyBjaGVja0Zvck5ld1BhcmFtZXRlcl9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCiBib29sIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpjaGVja0Zvck5ld1BhcmFtZXRlcl9sKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QmIHN0YXR1cykKQEAgLTU0NDksNyArNTY5Niw3IEBACiAgICAgICAgIG1QYXVzZWRXcml0ZUxlbmd0aCgwKSwgbVBhdXNlZEJ5dGVzUmVtYWluaW5nKDApLCBtS2VlcFdha2VMb2NrKHRydWUpLAogICAgICAgICBtT2ZmbG9hZFVuZGVycnVuUG9zaXRpb24ofjBMTCkKIHsKLSAgICAvL0ZJWE1FOiBtU3RhbmRieSBzaG91bGQgYmUgc2V0IHRvIHRydWUgYnkgVGhyZWFkQmFzZSBjb25zdHJ1Y3RvcgorICAgIC8vRklYTUU6IG1TdGFuZGJ5IHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSBieSBUaHJlYWRCYXNlIGNvbnN0cnVjdG8KICAgICBtU3RhbmRieSA9IHRydWU7CiAgICAgbUtlZXBXYWtlTG9jayA9IHByb3BlcnR5X2dldF9ib29sKCJyby5hdWRpby5vZmZsb2FkX3dha2Vsb2NrIiwgdHJ1ZSAvKiBkZWZhdWx0X3ZhbHVlICovKTsKIH0KQEAgLTU4MjksNiArNjA3NiwzMSBAQAogICAgIH0KIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OkR1cGxpY2F0aW5nVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKK3sKKyAgICBNaXhlclRocmVhZDo6ZHVtcEludGVybmFscyhmZCwgYXJncyk7CisKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICBjb25zdCBzaXplX3QgbnVtVHJhY2tzID0gbU91dHB1dFRyYWNrcy5zaXplKCk7CisgICAgc3MgPDwgIiAgIiA8PCBudW1UcmFja3MgPDwgIiBPdXRwdXRUcmFja3MiOworICAgIGlmIChudW1UcmFja3MgPiAwKSB7CisgICAgICAgIHNzIDw8ICI6IjsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZ0cmFjayA6IG1PdXRwdXRUcmFja3MpIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IHRyYWNrLT50aHJlYWQoKS5wcm9tb3RlKCk7CisgICAgICAgICAgICBzcyA8PCAiICgiIDw8IHRyYWNrLT5uYW1lKCkgPDwgIiA6ICI7CisgICAgICAgICAgICBpZiAodGhyZWFkLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBzcyA8PCB0aHJlYWQuZ2V0KCkgPDwgIiwgIiA8PCB0aHJlYWQtPmlkKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNzIDw8ICJudWxsIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNzIDw8ICIpIjsKKyAgICAgICAgfQorICAgIH0KKyAgICBzcyA8PCAiXG4iOworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9IHNzLnN0cigpOworICAgIHdyaXRlKGZkLCByZXN1bHQuY19zdHIoKSwgcmVzdWx0LnNpemUoKSk7Cit9CisKIHZvaWQgQXVkaW9GbGluZ2VyOjpEdXBsaWNhdGluZ1RocmVhZDo6c2F2ZU91dHB1dFRyYWNrcygpCiB7CiAgICAgb3V0cHV0VHJhY2tzID0gbU91dHB1dFRyYWNrczsKQEAgLTU5MjMsNiArNjE5NSwxNCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6RHVwbGljYXRpbmdUaHJlYWQ6OnNlbmRNZXRhZGF0YVRvQmFja2VuZF9sKAorICAgICAgICBjb25zdCBTdHJlYW1PdXRIYWxJbnRlcmZhY2U6OlNvdXJjZU1ldGFkYXRhJiBtZXRhZGF0YSkKK3sKKyAgICBmb3IgKGF1dG8mIG91dHB1dFRyYWNrIDogb3V0cHV0VHJhY2tzKSB7IC8vIG5vdCBtT3V0cHV0VHJhY2tzCisgICAgICAgIG91dHB1dFRyYWNrLT5zZXRNZXRhZGF0YXMobWV0YWRhdGEudHJhY2tzKTsKKyAgICB9Cit9CisKIHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6RHVwbGljYXRpbmdUaHJlYWQ6OmFjdGl2ZVNsZWVwVGltZVVzKCkgY29uc3QKIHsKICAgICByZXR1cm4gKG1XYWl0VGltZU1zICogMTAwMCkgLyAyOwpAQCAtNjI1MCw2ICs2NTMwLDggQEAKIAogICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy51cGRhdGVQb3dlclN0YXRlKHRoaXMpOwogCisgICAgICAgICAgICB1cGRhdGVNZXRhZGF0YV9sKCk7CisKICAgICAgICAgICAgIGlmIChhbGxTdG9wcGVkKSB7CiAgICAgICAgICAgICAgICAgc3RhbmRieUlmTm90QWxyZWFkeUluU3RhbmRieSgpOwogICAgICAgICAgICAgfQpAQCAtNjMzNiwxMyArNjYxOCwyNyBAQAogICAgICAgICBpZiAobVBpcGVTb3VyY2UgIT0gMCkgewogICAgICAgICAgICAgc2l6ZV90IGZyYW1lc1RvUmVhZCA9IG1CdWZmZXJTaXplIC8gbUZyYW1lU2l6ZTsKICAgICAgICAgICAgIGZyYW1lc1RvUmVhZCA9IG1pbihtUnNtcEluRnJhbWVzT0EgLSByZWFyLCBtUnNtcEluRnJhbWVzUDIgLyAyKTsKLSAgICAgICAgICAgIGZyYW1lc1JlYWQgPSBtUGlwZVNvdXJjZS0+cmVhZCgodWludDhfdCopbVJzbXBJbkJ1ZmZlciArIHJlYXIgKiBtRnJhbWVTaXplLAotICAgICAgICAgICAgICAgICAgICBmcmFtZXNUb1JlYWQpOwotICAgICAgICAgICAgLy8gc2luY2UgcGlwZSBpcyBub24tYmxvY2tpbmcsIHNpbXVsYXRlIGJsb2NraW5nIGlucHV0IGJ5IHdhaXRpbmcgZm9yIDEvMiBvZgotICAgICAgICAgICAgLy8gYnVmZmVyIHNpemUgb3IgYXQgbGVhc3QgZm9yIDIwbXMuCi0gICAgICAgICAgICBzaXplX3Qgc2xlZXBGcmFtZXMgPSBtYXgoCi0gICAgICAgICAgICAgICAgICAgIG1pbihtUGlwZUZyYW1lc1AyLCBtUnNtcEluRnJhbWVzUDIpIC8gMiwgRk1TXzIwICogbVNhbXBsZVJhdGUgLyAxMDAwKTsKLSAgICAgICAgICAgIGlmIChmcmFtZXNSZWFkIDw9IChzc2l6ZV90KSBzbGVlcEZyYW1lcykgeworCisgICAgICAgICAgICAvLyBUaGUgYXVkaW8gZmlmbyByZWFkKCkgcmV0dXJucyBPVkVSUlVOIG9uIG92ZXJmbG93LCBhbmQgYWR2YW5jZXMgdGhlIHJlYWQgcG9pbnRlcgorICAgICAgICAgICAgLy8gdG8gdGhlIGZ1bGwgYnVmZmVyIHBvaW50IChjbGVhcmluZyB0aGUgb3ZlcmZsb3cgY29uZGl0aW9uKS4gIFVwb24gT1ZFUlJVTiBlcnJvciwKKyAgICAgICAgICAgIC8vIHdlIGltbWVkaWF0ZWx5IHJldHJ5IHRoZSByZWFkKCkgdG8gZ2V0IGRhdGEgYW5kIHByZXZlbnQgYW5vdGhlciBvdmVyZmxvdy4KKyAgICAgICAgICAgIGZvciAoaW50IHJldHJpZXMgPSAwOyByZXRyaWVzIDw9IDI7ICsrcmV0cmllcykgeworICAgICAgICAgICAgICAgIEFMT0dXX0lGKHJldHJpZXMgPiAwLCAib3ZlcnJ1biBvbiByZWFkIGZyb20gcGlwZSwgcmV0cnkgIyVkIiwgcmV0cmllcyk7CisgICAgICAgICAgICAgICAgZnJhbWVzUmVhZCA9IG1QaXBlU291cmNlLT5yZWFkKCh1aW50OF90KiltUnNtcEluQnVmZmVyICsgcmVhciAqIG1GcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNUb1JlYWQpOworICAgICAgICAgICAgICAgIGlmIChmcmFtZXNSZWFkICE9IE9WRVJSVU4pIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25zdCBzc2l6ZV90IGF2YWlsYWJsZVRvUmVhZCA9IG1QaXBlU291cmNlLT5hdmFpbGFibGVUb1JlYWQoKTsKKyAgICAgICAgICAgIGlmIChhdmFpbGFibGVUb1JlYWQgPj0gMCkgeworICAgICAgICAgICAgICAgIC8vIFBpcGVTb3VyY2UgaXMgdGhlIG1hc3RlciBjbG9jay4gIEl0IGlzIHVwIHRvIHRoZSBBdWRpb1JlY29yZCBjbGllbnQgdG8ga2VlcCB1cC4KKyAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChzaXplX3QpYXZhaWxhYmxlVG9SZWFkID4gbVBpcGVGcmFtZXNQMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtb3JlIGZyYW1lcyB0byByZWFkIHRoYW4gZmlmbyBzaXplLCAlemQgPiAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlVG9SZWFkLCBtUGlwZUZyYW1lc1AyKTsKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgcGlwZUZyYW1lc0ZyZWUgPSBtUGlwZUZyYW1lc1AyIC0gYXZhaWxhYmxlVG9SZWFkOworICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzbGVlcEZyYW1lcyA9IG1pbihwaXBlRnJhbWVzRnJlZSwgbVJzbXBJbkZyYW1lc1AyKSAvIDI7CisgICAgICAgICAgICAgICAgQUxPR1ZWKCJtUGlwZUZyYW1lc1AyOiV6dSBtUnNtcEluRnJhbWVzUDI6JXp1IHNsZWVwRnJhbWVzOiV6dSBhdmFpbGFibGVUb1JlYWQ6JXpkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QaXBlRnJhbWVzUDIsIG1Sc21wSW5GcmFtZXNQMiwgc2xlZXBGcmFtZXMsIGF2YWlsYWJsZVRvUmVhZCk7CiAgICAgICAgICAgICAgICAgc2xlZXBVcyA9IChzbGVlcEZyYW1lcyAqIDEwMDAwMDBMTCkgLyBtU2FtcGxlUmF0ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChmcmFtZXNSZWFkIDwgMCkgewpAQCAtNjQyMiw2ICs2NzE4LDcgQEAKICAgICAgICAgcmVhciA9IG1Sc21wSW5SZWFyICs9IGZyYW1lc1JlYWQ7CiAKICAgICAgICAgc2l6ZSA9IGFjdGl2ZVRyYWNrcy5zaXplKCk7CisKICAgICAgICAgLy8gbG9vcCBvdmVyIGVhY2ggYWN0aXZlIHRyYWNrCiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgICAgICBhY3RpdmVUcmFjayA9IGFjdGl2ZVRyYWNrc1tpXTsKQEAgLTY0NzgsNiArNjc3NSwxMSBAQAogICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+bUZyYW1lc1RvRHJvcCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZXNPdXQgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVNpbmsuZnJhbWVDb3VudCA9IGZyYW1lc091dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbml0aXplIGJlZm9yZSByZWxlYXNpbmcgaWYgdGhlIHRyYWNrIGhhcyBubyBhY2Nlc3MgdG8gdGhlIHNvdXJjZSBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbiBpZGxlIFVJRCByZWNlaXZlcyBzaWxlbmNlIGZyb20gbm9uIHZpcnR1YWwgZGV2aWNlcyB1bnRpbCBhY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+aXNTaWxlbmNlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGFjdGl2ZVRyYWNrLT5tU2luay5yYXcsIDAsIGZyYW1lc091dCAqIG1GcmFtZVNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPnJlbGVhc2VCdWZmZXIoJmFjdGl2ZVRyYWNrLT5tU2luayk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNjYwOCwxMiArNjkxMCwxMyBAQAogLy8gUmVjb3JkVGhyZWFkOjpjcmVhdGVSZWNvcmRUcmFja19sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKIHNwPEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjaz4gQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmNyZWF0ZVJlY29yZFRyYWNrX2woCiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6Q2xpZW50PiYgY2xpZW50LAotICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHIsCisgICAgICAgIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgc2l6ZV90ICpwRnJhbWVDb3VudCwKICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKLSAgICAgICAgc2l6ZV90ICpub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgIHNpemVfdCAqcE5vdGlmaWNhdGlvbkZyYW1lQ291bnQsCiAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCAqZmxhZ3MsCiAgICAgICAgIHBpZF90IHRpZCwKQEAgLTY2MjEsMTYgKzY5MjQsMzAgQEAKICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAqcEZyYW1lQ291bnQ7CisgICAgc2l6ZV90IG5vdGlmaWNhdGlvbkZyYW1lQ291bnQgPSAqcE5vdGlmaWNhdGlvbkZyYW1lQ291bnQ7CiAgICAgc3A8UmVjb3JkVHJhY2s+IHRyYWNrOwogICAgIHN0YXR1c190IGxTdGF0dXM7CiAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBpbnB1dEZsYWdzID0gbUlucHV0LT5mbGFnczsKKyAgICBhdWRpb19pbnB1dF9mbGFnc190IHJlcXVlc3RlZEZsYWdzID0gKmZsYWdzOworICAgIHVpbnQzMl90IHNhbXBsZVJhdGU7CisKKyAgICBsU3RhdHVzID0gaW5pdENoZWNrKCk7CisgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZVJlY29yZFRyYWNrX2woKSBhdWRpbyBkcml2ZXIgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICBpZiAoKnBTYW1wbGVSYXRlID09IDApIHsKKyAgICAgICAgKnBTYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CisgICAgfQorICAgIHNhbXBsZVJhdGUgPSAqcFNhbXBsZVJhdGU7CiAKICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIEZBU1QgZmxhZyBjb25zaWRlcmVkIE9LIGlmIGZhc3QgY2FwdHVyZSBpcyBwcmVzZW50CiAgICAgaWYgKGhhc0Zhc3RDYXB0dXJlKCkpIHsKICAgICAgICAgaW5wdXRGbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KShpbnB1dEZsYWdzIHwgQVVESU9fSU5QVVRfRkxBR19GQVNUKTsKICAgICB9CiAKLSAgICAvLyBDaGVjayBpZiByZXF1ZXN0ZWQgZmxhZ3MgYXJlIGNvbXBhdGlibGUgd2l0aCBvdXRwdXQgc3RyZWFtIGZsYWdzCisgICAgLy8gQ2hlY2sgaWYgcmVxdWVzdGVkIGZsYWdzIGFyZSBjb21wYXRpYmxlIHdpdGggaW5wdXQgc3RyZWFtIGZsYWdzCiAgICAgaWYgKCgqZmxhZ3MgJiBpbnB1dEZsYWdzKSAhPSAqZmxhZ3MpIHsKICAgICAgICAgQUxPR1coImNyZWF0ZVJlY29yZFRyYWNrX2woKTogbWlzbWF0Y2ggYmV0d2VlbiByZXF1ZXN0ZWQgZmxhZ3MgKCUwOHgpIGFuZCIKICAgICAgICAgICAgICAgICAiIGlucHV0IGZsYWdzICglMDh4KSIsCkBAIC02Njg1LDEyICs3MDAyLDIwIEBACiAgICAgICB9CiAgICAgfQogCisgICAgLy8gSWYgRkFTVCBvciBSQVcgZmxhZ3Mgd2VyZSBjb3JyZWN0ZWQsIGFzayBjYWxsZXIgdG8gcmVxdWVzdCBuZXcgaW5wdXQgZnJvbSBhdWRpbyBwb2xpY3kKKyAgICBpZiAoKCpmbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgIT0KKyAgICAgICAgICAgIChyZXF1ZXN0ZWRGbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkpIHsKKyAgICAgICAgKmZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpICgqZmxhZ3MgJiB+KEFVRElPX0lOUFVUX0ZMQUdfRkFTVCB8IEFVRElPX0lOUFVUX0ZMQUdfUkFXKSk7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVFlQRTsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KKwogICAgIC8vIGNvbXB1dGUgdHJhY2sgYnVmZmVyIHNpemUgaW4gZnJhbWVzLCBhbmQgc3VnZ2VzdCB0aGUgbm90aWZpY2F0aW9uIGZyYW1lIGNvdW50CiAgICAgaWYgKCpmbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgewogICAgICAgICAvLyBmYXN0IHRyYWNrOiBmcmFtZSBjb3VudCBpcyBleGFjdGx5IHRoZSBwaXBlIGRlcHRoCiAgICAgICAgIGZyYW1lQ291bnQgPSBtUGlwZUZyYW1lc1AyOwogICAgICAgICAvLyBpZ25vcmUgcmVxdWVzdGVkIG5vdGlmaWNhdGlvbkZyYW1lcywgYW5kIGFsd2F5cyBub3RpZnkgZXhhY3RseSBvbmNlIGV2ZXJ5IEhBTCBidWZmZXIKLSAgICAgICAgKm5vdGlmaWNhdGlvbkZyYW1lcyA9IG1GcmFtZUNvdW50OworICAgICAgICBub3RpZmljYXRpb25GcmFtZUNvdW50ID0gbUZyYW1lQ291bnQ7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gbm90IGZhc3QgdHJhY2s6IG1heCBub3RpZmljYXRpb24gcGVyaW9kIGlzIHJlc2FtcGxlZCBlcXVpdmFsZW50IG9mIG9uZSBIQUwgYnVmZmVyIHRpbWUKICAgICAgICAgLy8gICAgICAgICAgICAgICAgIG9yIDIwIG1zIGlmIHRoZXJlIGlzIGEgZmFzdCBjYXB0dXJlCkBAIC02NzA5LDIyICs3MDM0LDE3IEBACiAgICAgICAgIGNvbnN0IHNpemVfdCBtaW5GcmFtZUNvdW50ID0gbWF4Tm90aWZpY2F0aW9uRnJhbWVzICoKICAgICAgICAgICAgICAgICBtYXgoa01pbk5vdGlmaWNhdGlvbnMsIG1pbk5vdGlmaWNhdGlvbnNCeU1zKTsKICAgICAgICAgZnJhbWVDb3VudCA9IG1heChmcmFtZUNvdW50LCBtaW5GcmFtZUNvdW50KTsKLSAgICAgICAgaWYgKCpub3RpZmljYXRpb25GcmFtZXMgPT0gMCB8fCAqbm90aWZpY2F0aW9uRnJhbWVzID4gbWF4Tm90aWZpY2F0aW9uRnJhbWVzKSB7Ci0gICAgICAgICAgICAqbm90aWZpY2F0aW9uRnJhbWVzID0gbWF4Tm90aWZpY2F0aW9uRnJhbWVzOworICAgICAgICBpZiAobm90aWZpY2F0aW9uRnJhbWVDb3VudCA9PSAwIHx8IG5vdGlmaWNhdGlvbkZyYW1lQ291bnQgPiBtYXhOb3RpZmljYXRpb25GcmFtZXMpIHsKKyAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lQ291bnQgPSBtYXhOb3RpZmljYXRpb25GcmFtZXM7CiAgICAgICAgIH0KICAgICB9CiAgICAgKnBGcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKLQotICAgIGxTdGF0dXMgPSBpbml0Q2hlY2soKTsKLSAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiY3JlYXRlUmVjb3JkVHJhY2tfbCgpIGF1ZGlvIGRyaXZlciBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KKyAgICAqcE5vdGlmaWNhdGlvbkZyYW1lQ291bnQgPSBub3RpZmljYXRpb25GcmFtZUNvdW50OwogCiAgICAgeyAvLyBzY29wZSBmb3IgbUxvY2sKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAotICAgICAgICB0cmFjayA9IG5ldyBSZWNvcmRUcmFjayh0aGlzLCBjbGllbnQsIHNhbXBsZVJhdGUsCisgICAgICAgIHRyYWNrID0gbmV3IFJlY29yZFRyYWNrKHRoaXMsIGNsaWVudCwgYXR0ciwgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogYnVmZmVyICovLCAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywgc2Vzc2lvbklkLCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgKmZsYWdzLCBUcmFja0Jhc2U6OlRZUEVfREVGQVVMVCwgcG9ydElkKTsKQEAgLTY3NzQsNyArNzA5NCw3IEBACiAgICAgICAgICAgICByZWNvcmRUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gZG8gbm90IHdhaXQgZm9yIHRoZSBldmVudCBmb3IgbW9yZSB0aGFuIEF1ZGlvU3lzdGVtOjprU3luY1JlY29yZFN0YXJ0VGltZU91dE1zCi0gICAgICAgICAgICByZWNvcmRUcmFjay0+bUZyYW1lc1RvRHJvcCA9IC0KKyAgICAgICAgICAgIHJlY29yZFRyYWNrLT5tRnJhbWVzVG9Ecm9wID0gLShzc2l6ZV90KQogICAgICAgICAgICAgICAgICAgICAoKEF1ZGlvU3lzdGVtOjprU3luY1JlY29yZFN0YXJ0VGltZU91dE1zICogcmVjb3JkVHJhY2stPm1TYW1wbGVSYXRlKSAvIDEwMDApOwogICAgICAgICB9CiAgICAgfQpAQCAtNjgwMCw3ICs3MTIwLDggQEAKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgICAgIGlmIChyZWNvcmRUcmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OnN0YXJ0SW5wdXQobUlkLCByZWNvcmRUcmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgYm9vbCBzaWxlbmNlZDsKKyAgICAgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzdGFydElucHV0KHJlY29yZFRyYWNrLT5wb3J0SWQoKSwgJnNpbGVuY2VkKTsKICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgIC8vIEZJWE1FIHNob3VsZCB2ZXJpZnkgdGhhdCByZWNvcmRUcmFjayBpcyBzdGlsbCBpbiBtQWN0aXZlVHJhY2tzCiAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CkBAIC02ODA5LDYgKzcxMzAsNyBAQAogICAgICAgICAgICAgICAgIEFMT0dWKCJSZWNvcmRUaHJlYWQ6OnN0YXJ0IGVycm9yICVkIiwgc3RhdHVzKTsKICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVjb3JkVHJhY2stPnNldFNpbGVuY2VkKHNpbGVuY2VkKTsKICAgICAgICAgfQogICAgICAgICAvLyBDYXRjaCB1cCB3aXRoIGN1cnJlbnQgYnVmZmVyIGluZGljZXMgaWYgdGhyZWFkIGlzIGFscmVhZHkgcnVubmluZy4KICAgICAgICAgLy8gVGhpcyBpcyB3aGF0IG1ha2VzIGEgbmV3IGNsaWVudCBkaXNjYXJkIGFsbCBidWZmZXJlZCBkYXRhLiAgSWYgdGhlIHRyYWNrJ3MgbVJzbXBJbkZyb250CkBAIC02ODMxLDcgKzcxNTMsNyBAQAogCiBzdGFydEVycm9yOgogICAgIGlmIChyZWNvcmRUcmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dChtSWQsIHJlY29yZFRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQocmVjb3JkVHJhY2stPnBvcnRJZCgpKTsKICAgICB9CiAgICAgcmVjb3JkVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKICAgICAvLyBGSVhNRSBJIHdvbmRlciB3aHkgd2UgZG8gbm90IHJlc2V0IHRoZSBzdGF0ZSBoZXJlPwpAQCAtNjkwNSw2ICs3MjI3LDMyIEBACiAjZW5kaWYKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcykKK3sKKyAgICBBTE9HVigiUmVjb3JkVGhyZWFkOjpnZXRBY3RpdmVNaWNyb3Bob25lcyIpOworICAgIEF1dG9NdXRleCBfbChtTG9jayk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUlucHV0LT5zdHJlYW0tPmdldEFjdGl2ZU1pY3JvcGhvbmVzKGFjdGl2ZU1pY3JvcGhvbmVzKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjp1cGRhdGVNZXRhZGF0YV9sKCkKK3sKKyAgICBpZiAobUlucHV0ID09IG51bGxwdHIgfHwgbUlucHV0LT5zdHJlYW0gPT0gbnVsbHB0ciB8fAorICAgICAgICAgICAgIW1BY3RpdmVUcmFja3MucmVhZEFuZENsZWFySGFzQ2hhbmdlZCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgU3RyZWFtSW5IYWxJbnRlcmZhY2U6OlNpbmtNZXRhZGF0YSBtZXRhZGF0YTsKKyAgICBmb3IgKGNvbnN0IHNwPFJlY29yZFRyYWNrPiAmdHJhY2sgOiBtQWN0aXZlVHJhY2tzKSB7CisgICAgICAgIC8vIE5vIHRyYWNrIGlzIGludmFsaWQgYXMgdGhpcyBpcyBjYWxsZWQgYWZ0ZXIgcHJlcGFyZVRyYWNrX2wgaW4gdGhlIHNhbWUgY3JpdGljYWwgc2VjdGlvbgorICAgICAgICBtZXRhZGF0YS50cmFja3MucHVzaF9iYWNrKHsKKyAgICAgICAgICAgICAgICAuc291cmNlID0gdHJhY2stPmF0dHJpYnV0ZXMoKS5zb3VyY2UsCisgICAgICAgICAgICAgICAgLmdhaW4gPSAxLCAvLyBjYXB0dXJlIHRyYWNrcyBkbyBub3QgaGF2ZSB2b2x1bWVzCisgICAgICAgIH0pOworICAgIH0KKyAgICBtSW5wdXQtPnN0cmVhbS0+dXBkYXRlU2lua01ldGFkYXRhKG1ldGFkYXRhKTsKK30KKwogLy8gZGVzdHJveVRyYWNrX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmRlc3Ryb3lUcmFja19sKGNvbnN0IHNwPFJlY29yZFRyYWNrPiYgdHJhY2spCiB7CkBAIC03MDEyLDYgKzczNjAsMTYgQEAKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6c2V0UmVjb3JkU2lsZW5jZWQodWlkX3QgdWlkLCBib29sIHNpbGVuY2VkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKSA7IGkrKykgeworICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOworICAgICAgICBpZiAodHJhY2sgIT0gMCAmJiB0cmFjay0+dWlkKCkgPT0gdWlkKSB7CisgICAgICAgICAgICB0cmFjay0+c2V0U2lsZW5jZWQoc2lsZW5jZWQpOworICAgICAgICB9CisgICAgfQorfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZXNhbXBsZXJCdWZmZXJQcm92aWRlcjo6cmVzZXQoKQogewpAQCAtNzU2OSw3ICs3OTI3LDkgQEAKICAgICAgIG1TZXNzaW9uSWQoQVVESU9fU0VTU0lPTl9OT05FKSwKICAgICAgIG1EZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwgbVBvcnRJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwKICAgICAgIG1IYWxTdHJlYW0oc3RyZWFtKSwgbUhhbERldmljZShod0Rldi0+aHdEZXZpY2UoKSksIG1BdWRpb0h3RGV2KGh3RGV2KSwKLSAgICAgIG1BY3RpdmVUcmFja3MoJnRoaXMtPm1Mb2NhbExvZykKKyAgICAgIG1BY3RpdmVUcmFja3MoJnRoaXMtPm1Mb2NhbExvZyksCisgICAgICBtSGFsVm9sRmxvYXQoLTEuMGYpLCAvLyBJbml0aWFsaXplIHRvIGlsbGVnYWwgdmFsdWUgc28gaXQgYWx3YXlzIGdldHMgc2V0IHByb3Blcmx5IGxhdGVyLgorICAgICAgbU5vQ2FsbGJhY2tXYXJuaW5nQ291bnQoMCkKIHsKICAgICBtU3RhbmRieSA9IHRydWU7CiAgICAgcmVhZEhhbFBhcmFtZXRlcnNfbCgpOwpAQCAtNzU4NywxNCArNzk0NywyMSBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6ZGlzY29ubmVjdCgpCiB7Ci0gICAgZm9yIChjb25zdCBzcDxNbWFwVHJhY2s+ICZ0IDogbUFjdGl2ZVRyYWNrcykgeworICAgIEFjdGl2ZVRyYWNrczxNbWFwVHJhY2s+IGFjdGl2ZVRyYWNrczsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGZvciAoY29uc3Qgc3A8TW1hcFRyYWNrPiAmdCA6IG1BY3RpdmVUcmFja3MpIHsKKyAgICAgICAgICAgIGFjdGl2ZVRyYWNrcy5hZGQodCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChjb25zdCBzcDxNbWFwVHJhY2s+ICZ0IDogYWN0aXZlVHJhY2tzKSB7CiAgICAgICAgIHN0b3AodC0+cG9ydElkKCkpOwogICAgIH0KICAgICAvLyBUaGlzIHdpbGwgZGVjcmVtZW50IHJlZmVyZW5jZXMgYW5kIG1heSBjYXVzZSB0aGUgZGVzdHJ1Y3Rpb24gb2YgdGhpcyB0aHJlYWQuCiAgICAgaWYgKGlzT3V0cHV0KCkpIHsKICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQobUlkLCBzdHJlYW1UeXBlKCksIG1TZXNzaW9uSWQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQobUlkLCBtU2Vzc2lvbklkKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChtUG9ydElkKTsKICAgICB9CiB9CiAKQEAgLTc2MzIsNiArNzk5OSwxNyBAQAogICAgIHJldHVybiBtSGFsU3RyZWFtLT5nZXRNbWFwUG9zaXRpb24ocG9zaXRpb24pOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6OmV4aXRTdGFuZGJ5KCkKK3sKKyAgICBzdGF0dXNfdCByZXQgPSBtSGFsU3RyZWFtLT5zdGFydCgpOworICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBlcnJvciBtSGFsU3RyZWFtLT5zdGFydCgpID0gJWQgZm9yIGZpcnN0IHRyYWNrIiwgX19GVU5DVElPTl9fLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBtU3RhbmRieSA9IGZhbHNlOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpzdGFydChjb25zdCBBdWRpb0NsaWVudCYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpoYW5kbGUpCiB7CkBAIC03NjQ1LDE3ICs4MDIzLDcgQEAKIAogICAgIGlmICgqaGFuZGxlID09IG1Qb3J0SWQpIHsKICAgICAgICAgLy8gZm9yIHRoZSBmaXJzdCB0cmFjaywgcmV1c2UgcG9ydElkIGFuZCBzZXNzaW9uIGFsbG9jYXRlZCB3aGVuIHRoZSBzdHJlYW0gd2FzIG9wZW5lZAotICAgICAgICByZXQgPSBtSGFsU3RyZWFtLT5zdGFydCgpOwotICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IGVycm9yIG1IYWxTdHJlYW0tPnN0YXJ0KCkgPSAlZCBmb3IgZmlyc3QgdHJhY2siLCBfX0ZVTkNUSU9OX18sIHJldCk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgICAgIG1TdGFuZGJ5ID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICBpZiAoIWlzT3V0cHV0KCkgJiYgIXJlY29yZGluZ0FsbG93ZWQoY2xpZW50LnBhY2thZ2VOYW1lLCBjbGllbnQuY2xpZW50UGlkLCBjbGllbnQuY2xpZW50VWlkKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgIHJldHVybiBleGl0U3RhbmRieSgpOwogICAgIH0KIAogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKQEAgLTc2NzMsNiArODA0MSw3IEBACiAgICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JBdHRyKCZtQXR0ciwgJmlvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuY2xpZW50UGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuY2xpZW50VWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKQEAgLTc2ODgsNiArODA1Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuY2xpZW50UGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5jbGllbnRVaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LnBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJRLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VJZCwKQEAgLTc3MDEsMzAgKzgwNzEsNDYgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKKyAgICBib29sIHNpbGVuY2VkID0gZmFsc2U7CiAgICAgaWYgKGlzT3V0cHV0KCkpIHsKICAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KG1JZCwgc3RyZWFtVHlwZSgpLCBtU2Vzc2lvbklkKTsKICAgICB9IGVsc2UgewotICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChtSWQsIG1TZXNzaW9uSWQpOworICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChwb3J0SWQsICZzaWxlbmNlZCk7CiAgICAgfQogCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAvLyBhYm9ydCBpZiBzdGFydCBpcyByZWplY3RlZCBieSBhdWRpbyBwb2xpY3kgbWFuYWdlcgogICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoIiVzOiBlcnJvciBzdGFydCByZWplY3RlZCBieSBBdWRpb1BvbGljeU1hbmFnZXIgPSAlZCIsIF9fRlVOQ1RJT05fXywgcmV0KTsKICAgICAgICAgaWYgKG1BY3RpdmVUcmFja3Muc2l6ZSgpICE9IDApIHsKKyAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgaWYgKGlzT3V0cHV0KCkpIHsKICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChtSWQsIHN0cmVhbVR5cGUoKSwgbVNlc3Npb25JZCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQobUlkLCBtU2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KHBvcnRJZCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtSGFsU3RyZWFtLT5zdG9wKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIAotICAgIHNwPE1tYXBUcmFjaz4gdHJhY2sgPSBuZXcgTW1hcFRyYWNrKHRoaXMsIG1TYW1wbGVSYXRlLCBtRm9ybWF0LCBtQ2hhbm5lbE1hc2ssIG1TZXNzaW9uSWQsCisgICAgaWYgKGlzT3V0cHV0KCkpIHsKKyAgICAgICAgLy8gZm9yY2Ugdm9sdW1lIHVwZGF0ZSB3aGVuIGEgbmV3IHRyYWNrIGlzIGFkZGVkCisgICAgICAgIG1IYWxWb2xGbG9hdCA9IC0xLjBmOworICAgIH0gZWxzZSBpZiAoIXNpbGVuY2VkKSB7CisgICAgICAgIGZvciAoY29uc3Qgc3A8TW1hcFRyYWNrPiAmdHJhY2sgOiBtQWN0aXZlVHJhY2tzKSB7CisgICAgICAgICAgICBpZiAodHJhY2stPmlzU2lsZW5jZWRfbCgpICYmIHRyYWNrLT51aWQoKSAhPSBjbGllbnQuY2xpZW50VWlkKQorICAgICAgICAgICAgICAgIHRyYWNrLT5pbnZhbGlkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBHaXZlbiB0aGF0IE1tYXBUaHJlYWQ6Om1BdHRyIGlzIG11dGFibGUsIHNob3VsZCBhIE1tYXBUcmFjayBoYXZlIGF0dHJpYnV0ZXMgPworICAgIHNwPE1tYXBUcmFjaz4gdHJhY2sgPSBuZXcgTW1hcFRyYWNrKHRoaXMsIG1BdHRyLCBtU2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLCBtU2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5jbGllbnRVaWQsIGNsaWVudC5jbGllbnRQaWQsIHBvcnRJZCk7CiAKKyAgICB0cmFjay0+c2V0U2lsZW5jZWRfbChzaWxlbmNlZCk7CiAgICAgbUFjdGl2ZVRyYWNrcy5hZGQodHJhY2spOwogICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IGdldEVmZmVjdENoYWluX2wobVNlc3Npb25JZCk7CiAgICAgaWYgKGNoYWluICE9IDApIHsKQEAgLTc3NTQsNiArODE0MCw4IEBACiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCiAgICAgc3A8TW1hcFRyYWNrPiB0cmFjazsKICAgICBmb3IgKGNvbnN0IHNwPE1tYXBUcmFjaz4gJnQgOiBtQWN0aXZlVHJhY2tzKSB7CiAgICAgICAgIGlmIChoYW5kbGUgPT0gdC0+cG9ydElkKCkpIHsKQEAgLTc3NjcsMTMgKzgxNTUsMTUgQEAKIAogICAgIG1BY3RpdmVUcmFja3MucmVtb3ZlKHRyYWNrKTsKIAorICAgIG1Mb2NrLnVubG9jaygpOwogICAgIGlmIChpc091dHB1dCgpKSB7CiAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KG1JZCwgc3RyZWFtVHlwZSgpLCB0cmFjay0+c2Vzc2lvbklkKCkpOwogICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChtSWQsIHN0cmVhbVR5cGUoKSwgdHJhY2stPnNlc3Npb25JZCgpKTsKICAgICB9IGVsc2UgewotICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KG1JZCwgdHJhY2stPnNlc3Npb25JZCgpKTsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChtSWQsIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQodHJhY2stPnBvcnRJZCgpKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dCh0cmFjay0+cG9ydElkKCkpOwogICAgIH0KKyAgICBtTG9jay5sb2NrKCk7CiAKICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKHRyYWNrLT5zZXNzaW9uSWQoKSk7CiAgICAgaWYgKGNoYWluICE9IDApIHsKQEAgLTc4NTgsNiArODI0OCw4IEBACiAKICAgICAgICAgbUFjdGl2ZVRyYWNrcy51cGRhdGVQb3dlclN0YXRlKHRoaXMpOwogCisgICAgICAgIHVwZGF0ZU1ldGFkYXRhX2woKTsKKwogICAgICAgICBsb2NrRWZmZWN0Q2hhaW5zX2woZWZmZWN0Q2hhaW5zKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RDaGFpbnMuc2l6ZSgpOyBpICsrKSB7CiAgICAgICAgICAgICBlZmZlY3RDaGFpbnNbaV0tPnByb2Nlc3NfbCgpOwpAQCAtODAyMyw3ICs4NDE1LDkgQEAKICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBVURJT19PVVRQVVRfQ09ORklHX0NIQU5HRUQpOwogICAgICAgICBzcDxNbWFwU3RyZWFtQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKICAgICAgICAgaWYgKG1EZXZpY2VJZCAhPSBkZXZpY2VJZCAmJiBjYWxsYmFjayAhPSAwKSB7CisgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgIGNhbGxiYWNrLT5vblJvdXRpbmdDaGFuZ2VkKGRldmljZUlkKTsKKyAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgfQogICAgICAgICBtRGV2aWNlSWQgPSBkZXZpY2VJZDsKICAgICB9CkBAIC04MDMyLDcgKzg0MjYsOSBAQAogICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEFVRElPX0lOUFVUX0NPTkZJR19DSEFOR0VEKTsKICAgICAgICAgc3A8TW1hcFN0cmVhbUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChtRGV2aWNlSWQgIT0gZGV2aWNlSWQgJiYgY2FsbGJhY2sgIT0gMCkgeworICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICBjYWxsYmFjay0+b25Sb3V0aW5nQ2hhbmdlZChkZXZpY2VJZCk7CisgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgIH0KICAgICAgICAgbURldmljZUlkID0gZGV2aWNlSWQ7CiAgICAgfQpAQCAtODE5OCw5ICs4NTk0LDEzIEBACiAgICAgICAgIGlmICh0cmFjay0+aXNJbnZhbGlkKCkpIHsKICAgICAgICAgICAgIHNwPE1tYXBTdHJlYW1DYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwogICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IDApIHsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay0+b25UZWFyRG93bigpOworICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIGNhbGxiYWNrLT5vblRlYXJEb3duKHRyYWNrLT5wb3J0SWQoKSk7CisgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtTm9DYWxsYmFja1dhcm5pbmdDb3VudCA8IGtNYXhOb0NhbGxiYWNrV2FybmluZ3MpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiQ291bGQgbm90IG5vdGlmeSBNTUFQIHN0cmVhbSB0ZWFyIGRvd246IG5vIG9uVGVhckRvd24gY2FsbGJhY2shIik7CisgICAgICAgICAgICAgICAgbU5vQ2FsbGJhY2tXYXJuaW5nQ291bnQrKzsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtODI1Miw3ICs4NjUyLDkgQEAKICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dERldmljZSwgYXVkaW9fZGV2aWNlc190IGluRGV2aWNlLCBib29sIHN5c3RlbVJlYWR5KQogICAgIDogTW1hcFRocmVhZChhdWRpb0ZsaW5nZXIsIGlkLCBod0Rldiwgb3V0cHV0LT5zdHJlYW0sIG91dERldmljZSwgaW5EZXZpY2UsIHN5c3RlbVJlYWR5KSwKICAgICAgIG1TdHJlYW1UeXBlKEFVRElPX1NUUkVBTV9NVVNJQyksCi0gICAgICBtU3RyZWFtVm9sdW1lKDEuMCksIG1TdHJlYW1NdXRlKGZhbHNlKSwgbU91dHB1dChvdXRwdXQpCisgICAgICBtU3RyZWFtVm9sdW1lKDEuMCksCisgICAgICBtU3RyZWFtTXV0ZShmYWxzZSksCisgICAgICBtT3V0cHV0KG91dHB1dCkKIHsKICAgICBzbnByaW50ZihtVGhyZWFkTmFtZSwga1RocmVhZE5hbWVMZW5ndGgsICJBdWRpb01tYXBPdXRfJVgiLCBpZCk7CiAgICAgbUNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtQ2hhbm5lbE1hc2spOwpAQCAtODM2MCw3ICs4NzYyLDYgQEAKICAgICB9CiAKICAgICBpZiAodm9sdW1lICE9IG1IYWxWb2xGbG9hdCkgewotICAgICAgICBtSGFsVm9sRmxvYXQgPSB2b2x1bWU7CiAKICAgICAgICAgLy8gQ29udmVydCB2b2x1bWVzIGZyb20gZmxvYXQgdG8gOC4yNAogICAgICAgICB1aW50MzJfdCB2b2wgPSAodWludDMyX3QpKHZvbHVtZSAqICgxIDw8IDI0KSk7CkBAIC04MzczLDcgKzg3NzQsMTAgQEAKICAgICAgICAgICAgIHZvbHVtZSA9IChmbG9hdCl2b2wgLyAoMSA8PCAyNCk7CiAgICAgICAgIH0KICAgICAgICAgLy8gVHJ5IHRvIHVzZSBIVyB2b2x1bWUgY29udHJvbCBhbmQgZmFsbCBiYWNrIHRvIFNXIGNvbnRyb2wgaWYgbm90IGltcGxlbWVudGVkCi0gICAgICAgIGlmIChtT3V0cHV0LT5zdHJlYW0tPnNldFZvbHVtZSh2b2x1bWUsIHZvbHVtZSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgaWYgKG1PdXRwdXQtPnN0cmVhbS0+c2V0Vm9sdW1lKHZvbHVtZSwgdm9sdW1lKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgbUhhbFZvbEZsb2F0ID0gdm9sdW1lOyAvLyBIVyB2b2x1bWUgY29udHJvbCB3b3JrZWQsIHNvIHVwZGF0ZSB2YWx1ZS4KKyAgICAgICAgICAgIG1Ob0NhbGxiYWNrV2FybmluZ0NvdW50ID0gMDsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHNwPE1tYXBTdHJlYW1DYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwogICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IDApIHsKICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50OwpAQCAtODM4NiwxNCArODc5MCwzOSBAQAogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhbm5lbENvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmFkZCh2b2x1bWUpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtSGFsVm9sRmxvYXQgPSB2b2x1bWU7IC8vIFNXIHZvbHVtZSBjb250cm9sIHdvcmtlZCwgc28gdXBkYXRlIHZhbHVlLgorICAgICAgICAgICAgICAgIG1Ob0NhbGxiYWNrV2FybmluZ0NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgICAgICBjYWxsYmFjay0+b25Wb2x1bWVDaGFuZ2VkKG1DaGFubmVsTWFzaywgdmFsdWVzKTsKKyAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dXKCJDb3VsZCBub3Qgc2V0IE1NQVAgc3RyZWFtIHZvbHVtZTogbm8gdm9sdW1lIGNhbGxiYWNrISIpOworICAgICAgICAgICAgICAgIGlmIChtTm9DYWxsYmFja1dhcm5pbmdDb3VudCA8IGtNYXhOb0NhbGxiYWNrV2FybmluZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIkNvdWxkIG5vdCBzZXQgTU1BUCBzdHJlYW0gdm9sdW1lOiBubyB2b2x1bWUgY2FsbGJhY2shIik7CisgICAgICAgICAgICAgICAgICAgIG1Ob0NhbGxiYWNrV2FybmluZ0NvdW50Kys7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFBsYXliYWNrVGhyZWFkOjp1cGRhdGVNZXRhZGF0YV9sKCkKK3sKKyAgICBpZiAobU91dHB1dCA9PSBudWxscHRyIHx8IG1PdXRwdXQtPnN0cmVhbSA9PSBudWxscHRyIHx8CisgICAgICAgICAgICAhbUFjdGl2ZVRyYWNrcy5yZWFkQW5kQ2xlYXJIYXNDaGFuZ2VkKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBTdHJlYW1PdXRIYWxJbnRlcmZhY2U6OlNvdXJjZU1ldGFkYXRhIG1ldGFkYXRhOworICAgIGZvciAoY29uc3Qgc3A8TW1hcFRyYWNrPiAmdHJhY2sgOiBtQWN0aXZlVHJhY2tzKSB7CisgICAgICAgIC8vIE5vIHRyYWNrIGlzIGludmFsaWQgYXMgdGhpcyBpcyBjYWxsZWQgYWZ0ZXIgcHJlcGFyZVRyYWNrX2wgaW4gdGhlIHNhbWUgY3JpdGljYWwgc2VjdGlvbgorICAgICAgICBtZXRhZGF0YS50cmFja3MucHVzaF9iYWNrKHsKKyAgICAgICAgICAgICAgICAudXNhZ2UgPSB0cmFjay0+YXR0cmlidXRlcygpLnVzYWdlLAorICAgICAgICAgICAgICAgIC5jb250ZW50X3R5cGUgPSB0cmFjay0+YXR0cmlidXRlcygpLmNvbnRlbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAuZ2FpbiA9IG1IYWxWb2xGbG9hdCwgLy8gVE9ETzogcHJvcGFnYXRlIGZyb20gYWF1ZGlvIHByZS1taXggdm9sdW1lCisgICAgICAgIH0pOworICAgIH0KKyAgICBtT3V0cHV0LT5zdHJlYW0tPnVwZGF0ZVNvdXJjZU1ldGFkYXRhKG1ldGFkYXRhKTsKK30KKwogdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBQbGF5YmFja1RocmVhZDo6Y2hlY2tTaWxlbnRNb2RlX2woKQogewogICAgIGlmICghbU1hc3Rlck11dGUpIHsKQEAgLTg0MzEsNiArODg2MCwxMiBAQAogICAgIG1DaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhtQ2hhbm5lbE1hc2spOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Ok1tYXBDYXB0dXJlVGhyZWFkOjpleGl0U3RhbmRieSgpCit7CisgICAgbUlucHV0LT5zdHJlYW0tPnNldEdhaW4oMS4wZik7CisgICAgcmV0dXJuIE1tYXBUaHJlYWQ6OmV4aXRTdGFuZGJ5KCk7Cit9CisKIEF1ZGlvRmxpbmdlcjo6QXVkaW9TdHJlYW1JbiogQXVkaW9GbGluZ2VyOjpNbWFwQ2FwdHVyZVRocmVhZDo6Y2xlYXJJbnB1dCgpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTg0MzgsNCArODg3Myw2MSBAQAogICAgIG1JbnB1dCA9IE5VTEw7CiAgICAgcmV0dXJuIGlucHV0OwogfQorCisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwQ2FwdHVyZVRocmVhZDo6cHJvY2Vzc1ZvbHVtZV9sKCkKK3sKKyAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICBib29sIHNpbGVuY2VkID0gZmFsc2U7CisKKyAgICBzcDxNbWFwU3RyZWFtQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKKyAgICBpZiAoY2FsbGJhY2sgPT0gMCkgeworICAgICAgICBpZiAobU5vQ2FsbGJhY2tXYXJuaW5nQ291bnQgPCBrTWF4Tm9DYWxsYmFja1dhcm5pbmdzKSB7CisgICAgICAgICAgICBBTE9HVygiQ291bGQgbm90IHNldCBNTUFQIHN0cmVhbSBzaWxlbmNlZDogbm8gb25TdHJlYW1TaWxlbmNlZCBjYWxsYmFjayEiKTsKKyAgICAgICAgICAgIG1Ob0NhbGxiYWNrV2FybmluZ0NvdW50Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBZnRlciBhIGNoYW5nZSBvY2N1cnJlZCBpbiB0cmFjayBzaWxlbmNlZCBzdGF0ZSwgbXV0ZSBjYXB0dXJlIGluIGF1ZGlvIERTUCBpZiBhdCBsZWFzdCBvbmUKKyAgICAvLyB0cmFjayBpcyBzaWxlbmNlZCBhbmQgdW5tdXRlIG90aGVyd2lzZQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUFjdGl2ZVRyYWNrcy5zaXplKCkgJiYgIXNpbGVuY2VkOyBpKyspIHsKKyAgICAgICAgaWYgKCFtQWN0aXZlVHJhY2tzW2ldLT5nZXRBbmRTZXRTaWxlbmNlZE5vdGlmaWVkX2woKSkgeworICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICBzaWxlbmNlZCA9IG1BY3RpdmVUcmFja3NbaV0tPmlzU2lsZW5jZWRfbCgpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNoYW5nZWQpIHsKKyAgICAgICAgbUlucHV0LT5zdHJlYW0tPnNldEdhaW4oc2lsZW5jZWQgPyAwLjBmOiAxLjBmKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwQ2FwdHVyZVRocmVhZDo6dXBkYXRlTWV0YWRhdGFfbCgpCit7CisgICAgaWYgKG1JbnB1dCA9PSBudWxscHRyIHx8IG1JbnB1dC0+c3RyZWFtID09IG51bGxwdHIgfHwKKyAgICAgICAgICAgICFtQWN0aXZlVHJhY2tzLnJlYWRBbmRDbGVhckhhc0NoYW5nZWQoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIFN0cmVhbUluSGFsSW50ZXJmYWNlOjpTaW5rTWV0YWRhdGEgbWV0YWRhdGE7CisgICAgZm9yIChjb25zdCBzcDxNbWFwVHJhY2s+ICZ0cmFjayA6IG1BY3RpdmVUcmFja3MpIHsKKyAgICAgICAgLy8gTm8gdHJhY2sgaXMgaW52YWxpZCBhcyB0aGlzIGlzIGNhbGxlZCBhZnRlciBwcmVwYXJlVHJhY2tfbCBpbiB0aGUgc2FtZSBjcml0aWNhbCBzZWN0aW9uCisgICAgICAgIG1ldGFkYXRhLnRyYWNrcy5wdXNoX2JhY2soeworICAgICAgICAgICAgICAgIC5zb3VyY2UgPSB0cmFjay0+YXR0cmlidXRlcygpLnNvdXJjZSwKKyAgICAgICAgICAgICAgICAuZ2FpbiA9IDEsIC8vIGNhcHR1cmUgdHJhY2tzIGRvIG5vdCBoYXZlIHZvbHVtZXMKKyAgICAgICAgfSk7CisgICAgfQorICAgIG1JbnB1dC0+c3RyZWFtLT51cGRhdGVTaW5rTWV0YWRhdGEobWV0YWRhdGEpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcENhcHR1cmVUaHJlYWQ6OnNldFJlY29yZFNpbGVuY2VkKHVpZF90IHVpZCwgYm9vbCBzaWxlbmNlZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUFjdGl2ZVRyYWNrcy5zaXplKCkgOyBpKyspIHsKKyAgICAgICAgaWYgKG1BY3RpdmVUcmFja3NbaV0tPnVpZCgpID09IHVpZCkgeworICAgICAgICAgICAgbUFjdGl2ZVRyYWNrc1tpXS0+c2V0U2lsZW5jZWRfbChzaWxlbmNlZCk7CisgICAgICAgICAgICBicm9hZGNhc3RfbCgpOworICAgICAgICB9CisgICAgfQorfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaAppbmRleCBkZDJiODliLi4yOGQ0NDgyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKQEAgLTQyNSw2ICs0MjUsOSBAQAogICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHNvbWUgZWZmZWN0cyBtdXN0IGJlIHN1c3BlbmRlZCB3aGVuIGFuIGVmZmVjdCBjaGFpbiBpcyBhZGRlZAogICAgICAgICAgICAgICAgIHZvaWQgY2hlY2tTdXNwZW5kT25BZGRFZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pOwogCisgICAgICAgICAgICAgICAgLy8gc2VuZHMgdGhlIG1ldGFkYXRhIG9mIHRoZSBhY3RpdmUgdHJhY2tzIHRvIHRoZSBIQUwKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB1cGRhdGVNZXRhZGF0YV9sKCkgPSAwOworCiAgICAgICAgICAgICAgICAgU3RyaW5nMTYgZ2V0V2FrZUxvY2tUYWcoKTsKIAogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHByZUV4aXQoKSB7IH0KQEAgLTQ4NSw2ICs0ODgsNyBAQAogICAgICAgICAgICAgICAgIC8vIFVwZGF0ZWQgYnkgdXBkYXRlU3VzcGVuZGVkU2Vzc2lvbnNfbCgpIG9ubHkuCiAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8IGF1ZGlvX3Nlc3Npb25fdCwgS2V5ZWRWZWN0b3I8IGludCwgc3A8U3VzcGVuZGVkU2Vzc2lvbkRlc2M+ID4gPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdXNwZW5kZWRTZXNzaW9uczsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBhZGQgY29tbWVudCBhbmQgYWRqdXN0IHNpemUgYXMgbmVlZGVkCiAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCAgICAga0xvZ1NpemUgPSA0ICogMTAyNDsKICAgICAgICAgICAgICAgICBzcDxOQkxvZzo6V3JpdGVyPiAgICAgICBtTkJMb2dXcml0ZXI7CiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVJlYWR5OwpAQCAtNTYyLDYgKzU2NiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAvLyBwZXJpb2RpY2FsbHkgY2FsbGVkIGluIHRoZSB0aHJlYWRMb29wKCkgdG8gdXBkYXRlIHBvd2VyIHN0YXRlIHVpZHMuCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICB1cGRhdGVQb3dlclN0YXRlKHNwPFRocmVhZEJhc2U+IHRocmVhZCwgYm9vbCBmb3JjZSA9IGZhbHNlKTsKIAorICAgICAgICAgICAgICAgICAgICAvKiogQHJldHVybiB0cnVlIGlmIG9uZSBvciBtb3ZlIGFjdGl2ZSB0cmFja3Mgd2FzIGFkZGVkIG9yIHJlbW92ZWQgc2luY2UgdGhlCisgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgIGxhc3QgdGltZSB0aGlzIGZ1bmN0aW9uIHdhcyBjYWxsZWQgb3IgdGhlIHZlY3RvciB3YXMgY3JlYXRlZC4gKi8KKyAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgIHJlYWRBbmRDbGVhckhhc0NoYW5nZWQoKTsKKwogICAgICAgICAgICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBsb2dUcmFjayhjb25zdCBjaGFyICpmdW5jTmFtZSwgY29uc3Qgc3A8VD4gJnRyYWNrKSBjb25zdDsKIApAQCAtNTgwLDYgKzU4OCw4IEBACiAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbUxhc3RBY3RpdmVUcmFja3NHZW5lcmF0aW9uOwogICAgICAgICAgICAgICAgICAgICB3cDxUPiAgICAgICAgICAgICAgIG1MYXRlc3RBY3RpdmVUcmFjazsgLy8gbGF0ZXN0IHRyYWNrIGFkZGVkIHRvIEFjdGl2ZVRyYWNrcwogICAgICAgICAgICAgICAgICAgICBTaW1wbGVMb2cgKiBjb25zdCAgIG1Mb2NhbExvZzsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHZlY3RvciBoYXMgY2hhbmdlZCBzaW5jZSBsYXN0IGNhbGwgdG8gcmVhZEFuZENsZWFySGFzQ2hhbmdlZAorICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgIG1IYXNDaGFuZ2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgICAgIFNpbXBsZUxvZyBtTG9jYWxMb2c7CkBAIC02MjIsOCArNjMyLDggQEAKICAgICBzdGF0aWMgY29uc3QgaW50OF90IGtNYXhUcmFja1JldHJpZXNPZmZsb2FkID0gMjA7CiAgICAgc3RhdGljIGNvbnN0IGludDhfdCBrTWF4VHJhY2tTdGFydHVwUmV0cmllc09mZmxvYWQgPSAxMDA7CiAgICAgc3RhdGljIGNvbnN0IGludDhfdCBrTWF4VHJhY2tTdG9wUmV0cmllc09mZmxvYWQgPSAyOwotICAgIC8vIDE0IHRyYWNrcyBtYXggcGVyIGNsaWVudCBhbGxvd3MgZm9yIDIgbWlzYmVoYXZpbmcgYXBwbGljYXRpb24gbGVhdmluZyA0IGF2YWlsYWJsZSB0cmFja3MuCi0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXhUcmFja3NQZXJVaWQgPSAxNDsKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtNYXhUcmFja3NQZXJVaWQgPSA0MDsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWF4VHJhY2tzID0gMjU2OwogCiAgICAgLy8gTWF4aW11bSBkZWxheSAoaW4gbmFub3NlY29uZHMpIGZvciB1cGNvbWluZyBidWZmZXJzIGluIHN1c3BlbmQgbW9kZSwgb3RoZXJ3aXNlCiAgICAgLy8gaWYgZGVsYXkgaXMgZ3JlYXRlciwgdGhlIGVzdGltYXRlZCB0aW1lIGZvciB0aW1lTG9vcE5leHROcyBpcyByZXNldC4KQEAgLTcwNSwxMCArNzE1LDE0IEBACiAgICAgICAgICAgICAgICAgc3A8VHJhY2s+ICAgY3JlYXRlVHJhY2tfbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwRnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwTm90aWZpY2F0aW9uRnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgbm90aWZpY2F0aW9uc1BlckJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3BlZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKQEAgLTczNywxMSArNzUxLDEwIEBACiAgICAgdmlydHVhbCAgICAgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQgPSAwKTsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqaGFsRnJhbWVzLCB1aW50MzJfdCAqZHNwRnJhbWVzKTsKLSAgICAgICAgICAgICAgICAvLyBGSVhNRSByZW5hbWUgbWl4QnVmZmVyKCkgdG8gc2lua0J1ZmZlcigpIGFuZCByZW1vdmUgaW50MTZfdCogZGVwZW5kZW5jeS4KICAgICAgICAgICAgICAgICAvLyBDb25zaWRlciBhbHNvIHJlbW92aW5nIGFuZCBwYXNzaW5nIGFuIGV4cGxpY2l0IG1NYWluQnVmZmVyIGluaXRpYWxpemF0aW9uCiAgICAgICAgICAgICAgICAgLy8gcGFyYW1ldGVyIHRvIEFGOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OlRyYWNrKCkuCi0gICAgICAgICAgICAgICAgaW50MTZfdCAgICAgKm1peEJ1ZmZlcigpIGNvbnN0IHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPihtU2lua0J1ZmZlcik7IH07CisgICAgICAgICAgICAgICAgZWZmZWN0X2J1ZmZlcl90ICpzaW5rQnVmZmVyKCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxlZmZlY3RfYnVmZmVyX3QgKj4obVNpbmtCdWZmZXIpOyB9OwogCiAgICAgdmlydHVhbCAgICAgdm9pZCBkZXRhY2hBdXhFZmZlY3RfbChpbnQgZWZmZWN0SWQpOwogICAgICAgICAgICAgICAgIHN0YXR1c190IGF0dGFjaEF1eEVmZmVjdChjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjaz4mIHRyYWNrLApAQCAtNzc2LDYgKzc4OSwxNiBAQAogCiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaXNPdXRwdXQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CiAKKyAgICAgICAgICAgICAgICAvLyByZXR1cm5zIHRydWUgaWYgdGhlIHRyYWNrIGlzIGFsbG93ZWQgdG8gYmUgYWRkZWQgdG8gdGhlIHRocmVhZC4KKyAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBpc1RyYWNrQWxsb3dlZF9sKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFja0NvdW50Rm9yVWlkX2wodWlkKSA8IFBsYXliYWNrVGhyZWFkOjprTWF4VHJhY2tzUGVyVWlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtVHJhY2tzLnNpemUoKSA8IFBsYXliYWNrVGhyZWFkOjprTWF4VHJhY2tzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogcHJvdGVjdGVkOgogICAgIC8vIHVwZGF0ZWQgYnkgcmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpCiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudDsgIC8vIG5vcm1hbCBtaXhlciBhbmQgZWZmZWN0cwpAQCAtODY0LDEyICs4ODcsNiBAQAogcHJvdGVjdGVkOgogICAgIEFjdGl2ZVRyYWNrczxUcmFjaz4gICAgIG1BY3RpdmVUcmFja3M7CiAKLSAgICAvLyBBbGxvY2F0ZSBhIHRyYWNrIG5hbWUgZm9yIGEgZ2l2ZW4gY2hhbm5lbCBtYXNrLgotICAgIC8vICAgUmV0dXJucyBuYW1lID49IDAgaWYgc3VjY2Vzc2Z1bCwgLTEgb24gZmFpbHVyZS4KLSAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICBnZXRUcmFja05hbWVfbChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsIHVpZF90IHVpZCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGRlbGV0ZVRyYWNrTmFtZV9sKGludCBuYW1lKSA9IDA7Ci0KICAgICAvLyBUaW1lIHRvIHNsZWVwIGJldHdlZW4gY3ljbGVzIHdoZW46CiAgICAgdmlydHVhbCB1aW50MzJfdCAgICAgICAgYWN0aXZlU2xlZXBUaW1lVXMoKSBjb25zdDsgICAgICAvLyBtaXhlciBzdGF0ZSBNSVhFUl9UUkFDS1NfRU5BQkxFRAogICAgIHZpcnR1YWwgdWludDMyX3QgICAgICAgIGlkbGVTbGVlcFRpbWVVcygpIGNvbnN0ID0gMDsgICAgLy8gbWl4ZXIgc3RhdGUgTUlYRVJfSURMRQpAQCAtODk3LDcgKzkxNCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtSHdTdXBwb3J0c1BhdXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAobU91dHB1dC0+ZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKTsgfQogCi0gICAgICAgICAgICAgICAgdWludDMyX3QgICAgdHJhY2tDb3VudEZvclVpZF9sKHVpZF90IHVpZCk7CisgICAgICAgICAgICAgICAgdWludDMyX3QgICAgdHJhY2tDb3VudEZvclVpZF9sKHVpZF90IHVpZCkgY29uc3Q7CiAKIHByaXZhdGU6CiAKQEAgLTkxMCwxMSArOTI3LDcwIEBACiAgICAgdm9pZCAgICAgICAgcmVtb3ZlVHJhY2tfbChjb25zdCBzcDxUcmFjaz4mIHRyYWNrKTsKIAogICAgIHZvaWQgICAgICAgIHJlYWRPdXRwdXRQYXJhbWV0ZXJzX2woKTsKKyAgICB2b2lkICAgICAgICB1cGRhdGVNZXRhZGF0YV9sKCkgZmluYWw7CisgICAgdmlydHVhbCB2b2lkIHNlbmRNZXRhZGF0YVRvQmFja2VuZF9sKGNvbnN0IFN0cmVhbU91dEhhbEludGVyZmFjZTo6U291cmNlTWV0YWRhdGEmIG1ldGFkYXRhKTsKIAogICAgIHZpcnR1YWwgdm9pZCBkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAgICAgdm9pZCAgICAgICAgZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCi0gICAgU29ydGVkVmVjdG9yPCBzcDxUcmFjaz4gPiAgICAgICBtVHJhY2tzOworICAgIC8vIFRoZSBUcmFja3MgY2xhc3MgbWFuYWdlcyBuYW1lcyBmb3IgYWxsIHRyYWNrcworICAgIC8vIGFkZGVkIGFuZCByZW1vdmVkIGZyb20gdGhlIFRocmVhZC4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICBjbGFzcyBUcmFja3MgeworICAgIHB1YmxpYzoKKyAgICAgICAgVHJhY2tzKGJvb2wgc2F2ZURlbGV0ZWRUcmFja05hbWVzKSA6CisgICAgICAgICAgICBtU2F2ZURlbGV0ZWRUcmFja05hbWVzKHNhdmVEZWxldGVkVHJhY2tOYW1lcykgeyB9CisKKyAgICAgICAgLy8gU29ydGVkVmVjdG9yIG1ldGhvZHMKKyAgICAgICAgc3NpemVfdCAgICAgICAgIGFkZChjb25zdCBzcDxUPiAmdHJhY2spOworICAgICAgICBzc2l6ZV90ICAgICAgICAgcmVtb3ZlKGNvbnN0IHNwPFQ+ICZ0cmFjayk7CisgICAgICAgIHNpemVfdCAgICAgICAgICBzaXplKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1UcmFja3Muc2l6ZSgpOworICAgICAgICB9CisgICAgICAgIGJvb2wgICAgICAgICAgICBpc0VtcHR5KCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1UcmFja3MuaXNFbXB0eSgpOworICAgICAgICB9CisgICAgICAgIHNzaXplX3QgICAgICAgICBpbmRleE9mKGNvbnN0IHNwPFQ+ICZpdGVtKSB7CisgICAgICAgICAgICByZXR1cm4gbVRyYWNrcy5pbmRleE9mKGl0ZW0pOworICAgICAgICB9CisgICAgICAgIHNwPFQ+ICAgICAgICAgICBvcGVyYXRvcltdKHNpemVfdCBpbmRleCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1UcmFja3NbaW5kZXhdOworICAgICAgICB9CisgICAgICAgIHR5cGVuYW1lIFNvcnRlZFZlY3RvcjxzcDxUPj46Oml0ZXJhdG9yIGJlZ2luKCkgeworICAgICAgICAgICAgcmV0dXJuIG1UcmFja3MuYmVnaW4oKTsKKyAgICAgICAgfQorICAgICAgICB0eXBlbmFtZSBTb3J0ZWRWZWN0b3I8c3A8VD4+OjppdGVyYXRvciBlbmQoKSB7CisgICAgICAgICAgICByZXR1cm4gbVRyYWNrcy5lbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCAgICAgICAgICBwcm9jZXNzRGVsZXRlZFRyYWNrTmFtZXMoc3RkOjpmdW5jdGlvbjx2b2lkKGludCk+IGYpIHsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzaXplID0gbURlbGV0ZWRUcmFja05hbWVzLnNpemUoKTsKKyAgICAgICAgICAgIGlmIChzaXplID4gMCkgeworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaW50IG5hbWUgOiBtRGVsZXRlZFRyYWNrTmFtZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgZihuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgICAgICAgICAgICBjbGVhckRlbGV0ZWRUcmFja05hbWVzKCkgeyBtRGVsZXRlZFRyYWNrTmFtZXMuY2xlYXIoKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gVHJhY2sgbmFtZXMgcGVuZGluZyBkZWxldGlvbiBmb3IgTUlYRVIgdHlwZSB0aHJlYWRzCisgICAgICAgIGNvbnN0IGJvb2wgbVNhdmVEZWxldGVkVHJhY2tOYW1lczsgLy8gdHJ1ZSB0byBlbmFibGUgdHJhY2tpbmcKKyAgICAgICAgc3RkOjpzZXQ8aW50PiBtRGVsZXRlZFRyYWNrTmFtZXM7CisKKyAgICAgICAgLy8gRmFzdCBsb29rdXAgb2YgcHJldmlvdXNseSBkZWxldGVkIHRyYWNrIG5hbWVzIGZvciByZXVzZS4KKyAgICAgICAgLy8gVGhpcyBpcyBhbiBhcmJpdHJhcnkgZGVjaXNpb24gKGFjdHVhbGx5IGFueSBub24tbmVnYXRpdmUKKyAgICAgICAgLy8gaW50ZWdlciB0aGF0IGlzbid0IGluIG1UcmFja3NbKl0tPm5hbWVzKCkgY291bGQgYmUgdXNlZCkgLSB3ZSBhdHRlbXB0CisgICAgICAgIC8vIHRvIHVzZSB0aGUgc21hbGxlc3QgcG9zc2libGUgYXZhaWxhYmxlIG5hbWUuCisgICAgICAgIHN0ZDo6c2V0PGludD4gbVVudXNlZFRyYWNrTmFtZXM7CisKKyAgICAgICAgU29ydGVkVmVjdG9yPHNwPFQ+PiBtVHJhY2tzOyAvLyB3cmFwcGVkIFNvcnRlZFZlY3Rvci4KKyAgICB9OworCisgICAgVHJhY2tzPFRyYWNrPiAgICAgICAgICAgICAgICAgICBtVHJhY2tzOworCiAgICAgc3RyZWFtX3R5cGVfdCAgICAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZXNbQVVESU9fU1RSRUFNX0NOVF07CiAgICAgQXVkaW9TdHJlYW1PdXQgICAgICAgICAgICAgICAgICAqbU91dHB1dDsKIApAQCAtOTg0LDYgKzEwNjAsNyBAQAogICAgIHNwPE5CQUlPX1NvdXJjZT4gICAgICAgIG1UZWVTb3VyY2U7CiAjZW5kaWYKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtU2NyZWVuU3RhdGU7ICAgLy8gY2FjaGVkIGNvcHkgb2YgZ1NjcmVlblN0YXRlCisgICAgLy8gVE9ETzogYWRkIGNvbW1lbnQgYW5kIGFkanVzdCBzaXplIGFzIG5lZWRlZAogICAgIHN0YXRpYyBjb25zdCBzaXplX3QgICAgIGtGYXN0TWl4ZXJMb2dTaXplID0gOCAqIDEwMjQ7CiAgICAgc3A8TkJMb2c6OldyaXRlcj4gICAgICAgbUZhc3RNaXhlck5CTG9nV3JpdGVyOwogCkBAIC0xMDIwLDExICsxMDk3LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCYgc3RhdHVzKTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKKyAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBpc1RyYWNrQWxsb3dlZF9sKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsIHVpZF90IHVpZCkgY29uc3Qgb3ZlcnJpZGU7CiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCAgICAgbWl4ZXJfc3RhdGUgcHJlcGFyZVRyYWNrc19sKFZlY3Rvcjwgc3A8VHJhY2s+ID4gKnRyYWNrc1RvUmVtb3ZlKTsKLSAgICB2aXJ0dWFsICAgICBpbnQgICAgICAgICBnZXRUcmFja05hbWVfbChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsIHVpZF90IHVpZCk7Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZGVsZXRlVHJhY2tOYW1lX2woaW50IG5hbWUpOwogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGlkbGVTbGVlcFRpbWVVcygpIGNvbnN0OwogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIHN1c3BlbmRTbGVlcFRpbWVVcygpIGNvbnN0OwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGNhY2hlUGFyYW1ldGVyc19sKCk7CkBAIC0xMTAyLDkgKzExNzksNiBAQAogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGZsdXNoSHdfbCgpOwogCiBwcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCAgICAgaW50ICAgICAgICAgZ2V0VHJhY2tOYW1lX2woYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLCB1aWRfdCB1aWQpOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGRlbGV0ZVRyYWNrTmFtZV9sKGludCBuYW1lKTsKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBhY3RpdmVTbGVlcFRpbWVVcygpIGNvbnN0OwogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGlkbGVTbGVlcFRpbWVVcygpIGNvbnN0OwogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIHN1c3BlbmRTbGVlcFRpbWVVcygpIGNvbnN0OwpAQCAtMTIwOCw5ICsxMjgyLDE0IEBACiAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfkR1cGxpY2F0aW5nVGhyZWFkKCk7CiAKICAgICAvLyBUaHJlYWQgdmlydHVhbHMKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7CisKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBhZGRPdXRwdXRUcmFjayhNaXhlclRocmVhZCogdGhyZWFkKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByZW1vdmVPdXRwdXRUcmFjayhNaXhlclRocmVhZCogdGhyZWFkKTsKICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICB3YWl0VGltZU1zKCkgY29uc3QgeyByZXR1cm4gbVdhaXRUaW1lTXM7IH0KKworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHNlbmRNZXRhZGF0YVRvQmFja2VuZF9sKAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyZWFtT3V0SGFsSW50ZXJmYWNlOjpTb3VyY2VNZXRhZGF0YSYgbWV0YWRhdGEpIG92ZXJyaWRlOwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGFjdGl2ZVNsZWVwVGltZVVzKCkgY29uc3Q7CiAKQEAgLTEzMjMsMTIgKzE0MDIsMTMgQEAKIAogICAgICAgICAgICAgc3A8QXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrPiAgY3JlYXRlUmVjb3JkVHJhY2tfbCgKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBTYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwTm90aWZpY2F0aW9uRnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLApAQCAtMTM5Miw2ICsxNDcyLDEzIEBACiAKICAgICAgICAgICAgIHZvaWQgICAgICAgIGNoZWNrQnROcmVjKCk7CiAKKyAgICAgICAgICAgIC8vIFNldHMgdGhlIFVJRCByZWNvcmRzIHNpbGVuY2UKKyAgICAgICAgICAgIHZvaWQgICAgICAgIHNldFJlY29yZFNpbGVuY2VkKHVpZF90IHVpZCwgYm9vbCBzaWxlbmNlZCk7CisKKyAgICAgICAgICAgIHN0YXR1c190ICAgIGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKTsKKworICAgICAgICAgICAgdm9pZCAgICAgICAgdXBkYXRlTWV0YWRhdGFfbCgpIG92ZXJyaWRlOworCiBwcml2YXRlOgogICAgICAgICAgICAgLy8gRW50ZXIgc3RhbmRieSBpZiBub3QgYWxyZWFkeSBpbiBzdGFuZGJ5LCBhbmQgc2V0IG1TdGFuZGJ5IGZsYWcKICAgICAgICAgICAgIHZvaWQgICAgc3RhbmRieUlmTm90QWxyZWFkeUluU3RhbmRieSgpOwpAQCAtMTQ1Niw2ICsxNTQzLDcgQEAKICAgICAgICAgICAgIC8vIElmIGEgZmFzdCBjYXB0dXJlIGlzIHByZXNlbnQsIHRoZSBQaXBlIGFzIElNZW1vcnksIG90aGVyd2lzZSBjbGVhcgogICAgICAgICAgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgICAgICAgICAgICAgbVBpcGVNZW1vcnk7CiAKKyAgICAgICAgICAgIC8vIFRPRE86IGFkZCBjb21tZW50IGFuZCBhZGp1c3Qgc2l6ZSBhcyBuZWVkZWQKICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3QgICAgICAgICAgICAgICAgIGtGYXN0Q2FwdHVyZUxvZ1NpemUgPSA0ICogMTAyNDsKICAgICAgICAgICAgIHNwPE5CTG9nOjpXcml0ZXI+ICAgICAgICAgICAgICAgICAgIG1GYXN0Q2FwdHVyZU5CTG9nV3JpdGVyOwogCkBAIC0xNTAxLDYgKzE1ODksNyBAQAogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRocmVhZExvb3BfZXhpdCgpOwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRocmVhZExvb3Bfc3RhbmRieSgpOwogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHNob3VsZFN0YW5kYnlfbCgpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgZXhpdFN0YW5kYnkoKTsKIAogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIGluaXRDaGVjaygpIGNvbnN0IHsgcmV0dXJuIChtSGFsU3RyZWFtID09IDApID8gTk9fSU5JVCA6IE5PX0VSUk9SOyB9CiAgICAgdmlydHVhbCAgICAgc2l6ZV90ICAgICAgZnJhbWVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZUNvdW50OyB9CkBAIC0xNTMzLDYgKzE2MjIsOSBAQAogCiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgaW52YWxpZGF0ZVRyYWNrcyhhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgX191bnVzZWQpIHt9CiAKKyAgICAgICAgICAgICAgICAvLyBTZXRzIHRoZSBVSUQgcmVjb3JkcyBzaWxlbmNlCisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgc2V0UmVjb3JkU2lsZW5jZWQodWlkX3QgdWlkIF9fdW51c2VkLCBib29sIHNpbGVuY2VkIF9fdW51c2VkKSB7fQorCiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wVHJhY2tzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CkBAIC0xNTQ5LDYgKzE2NDEsMTAgQEAKICAgICAgICAgICAgICAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICBtSGFsRGV2aWNlOwogICAgICAgICAgICAgICAgIEF1ZGlvSHdEZXZpY2UqIGNvbnN0ICAgIG1BdWRpb0h3RGV2OwogICAgICAgICAgICAgICAgIEFjdGl2ZVRyYWNrczxNbWFwVHJhY2s+IG1BY3RpdmVUcmFja3M7CisgICAgICAgICAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbUhhbFZvbEZsb2F0OworCisgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbU5vQ2FsbGJhY2tXYXJuaW5nQ291bnQ7CisgICAgIHN0YXRpYyAgICAgY29uc3RleHByIGludDMyX3QgICAgICAga01heE5vQ2FsbGJhY2tXYXJuaW5ncyA9IDU7CiB9OwogCiBjbGFzcyBNbWFwUGxheWJhY2tUaHJlYWQgOiBwdWJsaWMgTW1hcFRocmVhZCwgcHVibGljIFZvbHVtZUludGVyZmFjZQpAQCAtMTU4MiwxMiArMTY3OCwxNCBAQAogCiAgICAgdmlydHVhbCAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKCkgeyByZXR1cm4gbVN0cmVhbVR5cGU7IH0KICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBjaGVja1NpbGVudE1vZGVfbCgpOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHByb2Nlc3NWb2x1bWVfbCgpOworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHByb2Nlc3NWb2x1bWVfbCgpIG92ZXJyaWRlOwogCiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaXNPdXRwdXQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CiAKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICB1cGRhdGVNZXRhZGF0YV9sKCkgb3ZlcnJpZGU7CisKIHByb3RlY3RlZDoKIAogICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgICAgICAgICBtU3RyZWFtVHlwZTsKQEAgLTE1OTUsNyArMTY5Myw2IEBACiAgICAgICAgICAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1Wb2x1bWU7CiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1NYXN0ZXJNdXRlOwogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtTXV0ZTsKLSAgICAgICAgICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgbUhhbFZvbEZsb2F0OwogICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtT3V0KiAgICAgICAgICAgICBtT3V0cHV0OwogfTsKIApAQCAtMTYxMCw4ICsxNzA3LDEzIEBACiAKICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbUluKiBjbGVhcklucHV0KCk7CiAKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICBleGl0U3RhbmRieSgpIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgICAgIGlzT3V0cHV0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KIAorICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgIHVwZGF0ZU1ldGFkYXRhX2woKSBvdmVycmlkZTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICBwcm9jZXNzVm9sdW1lX2woKSBvdmVycmlkZTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICBzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpIG92ZXJyaWRlOworCiBwcm90ZWN0ZWQ6CiAKICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbUluKiAgbUlucHV0OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oCmluZGV4IGQ0Y2UwYjQuLmNjZmI2OWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmgKQEAgLTU0LDggKzU0LDE0IEBACiAgICAgICAgIFRZUEVfUEFUQ0gsCiAgICAgfTsKIAorICAgIGVudW0geworICAgICAgICBUUkFDS19OQU1FX1BFTkRJTkcgPSAtMSwKKyAgICAgICAgVFJBQ0tfTkFNRV9GQUlMVVJFID0gLTIsCisgICAgfTsKKwogICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tCYXNlKFRocmVhZEJhc2UgKnRocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIG1BdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLApAQCAtOTIsNiArOTgsNyBAQAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgaW52YWxpZGF0ZSgpIHsgbUlzSW52YWxpZCA9IHRydWU7IH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzSW52YWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1Jc0ludmFsaWQ7IH0KIAorICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAgYXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIG1BdHRyOyB9CiAKIHByb3RlY3RlZDoKICAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oVHJhY2tCYXNlKTsKQEAgLTE4Myw2ICsxOTAsNyBAQAogICAgIHNpemVfdCAgICAgICAgICAgICAgbUJ1ZmZlclNpemU7IC8vIHNpemUgb2YgbUJ1ZmZlciBpbiBieXRlcwogICAgIC8vIHdlIGRvbid0IHJlYWxseSBuZWVkIGEgbG9jayBmb3IgdGhlc2UKICAgICB0cmFja19zdGF0ZSAgICAgICAgIG1TdGF0ZTsKKyAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgbUF0dHI7CiAgICAgY29uc3QgdWludDMyX3QgICAgICBtU2FtcGxlUmF0ZTsgICAgLy8gaW5pdGlhbCBzYW1wbGUgcmF0ZSBvbmx5OyBmb3IgdHJhY2tzIHdoaWNoCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IGR5bmFtaWMgcmF0ZXMsIHRoZSBjdXJyZW50IHZhbHVlIGlzIGluIGNvbnRyb2wgYmxvY2sKICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBtRm9ybWF0OwpAQCAtMTkyLDcgKzIwMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVyZSBmb3IgQXVkaW9UcmFjayAoYnV0IG5vdCBBdWRpb1JlY29yZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA4LWJpdCBQQ00gc2FtcGxlcyBhcmUgc3RvcmVkIGFzIDE2LWJpdAogICAgIGNvbnN0IHNpemVfdCAgICAgICAgbUZyYW1lQ291bnQ7Ly8gc2l6ZSBvZiB0cmFjayBidWZmZXIgZ2l2ZW4gYXQgY3JlYXRlVHJhY2soKSBvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3BlblJlY29yZCgpLCBhbmQgdGhlbiBhZGp1c3RlZCBhcyBuZWVkZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZVJlY29yZCgpLCBhbmQgdGhlbiBhZGp1c3RlZCBhcyBuZWVkZWQKIAogICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBtU2Vzc2lvbklkOwogICAgIHVpZF90ICAgICAgICAgICAgICAgbVVpZDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAKaW5kZXggMGYyNTE1My4uYTdjNDI1MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAKQEAgLTUyLDYgKzUyLDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCit1c2luZyBtZWRpYTo6Vm9sdW1lU2hhcGVyOwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gICAgICBUcmFja0Jhc2UKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTYyLDYgKzYzLDcgQEAKIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6VHJhY2tCYXNlOjpUcmFja0Jhc2UoCiAgICAgICAgICAgICBUaHJlYWRCYXNlICp0aHJlYWQsCiAgICAgICAgICAgICBjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHIsCiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCkBAIC04MCw2ICs4Miw3IEBACiAgICAgICAgIG1DYmxrKE5VTEwpLAogICAgICAgICAvLyBtQnVmZmVyLCBtQnVmZmVyU2l6ZQogICAgICAgICBtU3RhdGUoSURMRSksCisgICAgICAgIG1BdHRyKGF0dHIpLAogICAgICAgICBtU2FtcGxlUmF0ZShzYW1wbGVSYXRlKSwKICAgICAgICAgbUZvcm1hdChmb3JtYXQpLAogICAgICAgICBtQ2hhbm5lbE1hc2soY2hhbm5lbE1hc2spLApAQCAtMzcxLDYgKzM3NCw3IEBACiAgICAgICAgICAgICBQbGF5YmFja1RocmVhZCAqdGhyZWFkLAogICAgICAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAorICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyLAogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLApAQCAtMzgzLDcgKzM4Nyw3IEBACiAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgIHRyYWNrX3R5cGUgdHlwZSwKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQotICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBjbGllbnQsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCisgICAgOiAgIFRyYWNrQmFzZSh0aHJlYWQsIGNsaWVudCwgYXR0ciwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgIChzaGFyZWRCdWZmZXIgIT0gMCkgPyBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSA6IGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgIChzaGFyZWRCdWZmZXIgIT0gMCkgPyBzaGFyZWRCdWZmZXItPnNpemUoKSA6IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHVpZCwgdHJ1ZSAvKmlzT3V0Ki8sCkBAIC0zOTMsMTYgKzM5NywxOSBAQAogICAgIC8vIG1SZXRyeUNvdW50IGluaXRpYWxpemVkIGxhdGVyIHdoZW4gbmVlZGVkCiAgICAgbVNoYXJlZEJ1ZmZlcihzaGFyZWRCdWZmZXIpLAogICAgIG1TdHJlYW1UeXBlKHN0cmVhbVR5cGUpLAotICAgIG1OYW1lKC0xKSwgIC8vIHNlZSBub3RlIGJlbG93Ci0gICAgbU1haW5CdWZmZXIodGhyZWFkLT5taXhCdWZmZXIoKSksCisgICAgbU5hbWUoVFJBQ0tfTkFNRV9GQUlMVVJFKSwgIC8vIHNldCB0byBUUkFDS19OQU1FX1BFTkRJTkcgb24gY29uc3RydWN0b3Igc3VjY2Vzcy4KKyAgICBtTWFpbkJ1ZmZlcih0aHJlYWQtPnNpbmtCdWZmZXIoKSksCiAgICAgbUF1eEJ1ZmZlcihOVUxMKSwKICAgICBtQXV4RWZmZWN0SWQoMCksIG1IYXNWb2x1bWVDb250cm9sbGVyKGZhbHNlKSwKICAgICBtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMoMCksCiAgICAgbUZyYW1lTWFwKDE2IC8qIHNpbmstZnJhbWUtdG8tdHJhY2stZnJhbWUgbWFwIG1lbW9yeSAqLyksCi0gICAgbVZvbHVtZUhhbmRsZXIobmV3IFZvbHVtZUhhbmRsZXIoc2FtcGxlUmF0ZSkpLAorICAgIG1Wb2x1bWVIYW5kbGVyKG5ldyBtZWRpYTo6Vm9sdW1lSGFuZGxlcihzYW1wbGVSYXRlKSksCiAgICAgLy8gbVNpbmtUaW1lc3RhbXAKICAgICBtRmFzdEluZGV4KC0xKSwKICAgICBtQ2FjaGVkVm9sdW1lKDEuMCksCisgICAgLyogVGhlIHRyYWNrIG1pZ2h0IG5vdCBwbGF5IGltbWVkaWF0ZWx5IGFmdGVyIGJlaW5nIGFjdGl2ZSwgc2ltaWxhcmx5IGFzIGlmIGl0cyB2b2x1bWUgd2FzIDAuCisgICAgICogV2hlbiB0aGUgdHJhY2sgc3RhcnRzIHBsYXlpbmcsIGl0cyB2b2x1bWUgd2lsbCBiZSBjb21wdXRlZC4gKi8KKyAgICBtRmluYWxWb2x1bWUoMC5mKSwKICAgICBtUmVzdW1lVG9TdG9wcGluZyhmYWxzZSksCiAgICAgbUZsdXNoSHdQZW5kaW5nKGZhbHNlKSwKICAgICBtRmxhZ3MoZmxhZ3MpCkBAIC00MjYsOSArNDMzLDggQEAKICAgICB9CiAgICAgbVNlcnZlclByb3h5ID0gbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTsKIAotICAgIG1OYW1lID0gdGhyZWFkLT5nZXRUcmFja05hbWVfbChjaGFubmVsTWFzaywgZm9ybWF0LCBzZXNzaW9uSWQsIHVpZCk7Ci0gICAgaWYgKG1OYW1lIDwgMCkgewotICAgICAgICBBTE9HRSgibm8gbW9yZSB0cmFjayBuYW1lcyBhdmFpbGFibGUiKTsKKyAgICBpZiAoIXRocmVhZC0+aXNUcmFja0FsbG93ZWRfbChjaGFubmVsTWFzaywgZm9ybWF0LCBzZXNzaW9uSWQsIHVpZCkpIHsKKyAgICAgICAgQUxPR0UoIm5vIG1vcmUgdHJhY2tzIGF2YWlsYWJsZSIpOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIC8vIG9ubHkgYWxsb2NhdGUgYSBmYXN0IHRyYWNrIGluZGV4IGlmIHdlIHdlcmUgYWJsZSB0byBhbGxvY2F0ZSBhIG5vcm1hbCB0cmFjayBuYW1lCkBAIC00NDcsNiArNDUzLDcgQEAKICAgICAgICAgbUZhc3RJbmRleCA9IGk7CiAgICAgICAgIHRocmVhZC0+bUZhc3RUcmFja0F2YWlsTWFzayAmPSB+KDEgPDwgaSk7CiAgICAgfQorICAgIG1OYW1lID0gVFJBQ0tfTkFNRV9QRU5ESU5HOwogfQogCiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6flRyYWNrKCkKQEAgLTQ2NSw3ICs0NzIsNyBAQAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmluaXRDaGVjaygpIGNvbnN0CiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gVHJhY2tCYXNlOjppbml0Q2hlY2soKTsKLSAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIG1OYW1lIDwgMCkgeworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgbU5hbWUgPT0gVFJBQ0tfTkFNRV9GQUlMVVJFKSB7CiAgICAgICAgIHN0YXR1cyA9IE5PX01FTU9SWTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTUyNiwxMCArNTMzLDEyIEBACiAKICAgICBpZiAoaXNGYXN0VHJhY2soKSkgewogICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJGJWMgJTNkIiwgdHJhY2tUeXBlLCBtRmFzdEluZGV4KTsKLSAgICB9IGVsc2UgaWYgKG1OYW1lID49IEF1ZGlvTWl4ZXI6OlRSQUNLMCkgewotICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlYyAlNGQiLCB0cmFja1R5cGUsIG1OYW1lIC0gQXVkaW9NaXhlcjo6VFJBQ0swKTsKKyAgICB9IGVsc2UgaWYgKG1OYW1lID09IFRSQUNLX05BTUVfUEVORElORykgeworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlYyBwZW5kIiwgdHJhY2tUeXBlKTsKKyAgICB9IGVsc2UgaWYgKG1OYW1lID09IFRSQUNLX05BTUVfRkFJTFVSRSkgeworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlYyBmYWlsIiwgdHJhY2tUeXBlKTsKICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlYyBub25lIiwgdHJhY2tUeXBlKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJWMgJTRkIiwgdHJhY2tUeXBlLCBtTmFtZSk7CiAgICAgfQogCiAgICAgY2hhciBub3dJblVuZGVycnVuOwpAQCAtNzU4LDYgKzc2NywxMiBAQAogICAgICAgICAgICAgICAgIG1TdGF0ZSA9IHN0YXRlOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiB8fCBzdGF0dXMgPT0gQUxSRUFEWV9FWElTVFMpIHsKKyAgICAgICAgICAgIC8vIGZvciBzdHJlYW1pbmcgdHJhY2tzLCByZW1vdmUgdGhlIGJ1ZmZlciByZWFkIHN0b3AgbGltaXQuCisgICAgICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5zdGFydCgpOworICAgICAgICB9CisKICAgICAgICAgLy8gdHJhY2sgd2FzIGFscmVhZHkgaW4gdGhlIGFjdGl2ZSBsaXN0LCBub3QgYSBwcm9ibGVtCiAgICAgICAgIGlmIChzdGF0dXMgPT0gQUxSRUFEWV9FWElTVFMpIHsKICAgICAgICAgICAgIHN0YXR1cyA9IE5PX0VSUk9SOwpAQCAtOTg1LDYgKzEwMDAsMjMgQEAKICAgICByZXR1cm4gbVZvbHVtZUhhbmRsZXItPmdldFZvbHVtZVNoYXBlclN0YXRlKGlkKTsKIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6c2V0RmluYWxWb2x1bWUoZmxvYXQgdm9sdW1lKQoreworICAgIGlmIChtRmluYWxWb2x1bWUgIT0gdm9sdW1lKSB7IC8vIENvbXBhcmUgdG8gYW4gZXBzaWxvbiBpZiB0b28gbWFueSBtZWFuaW5nbGVzcyB1cGRhdGVzCisgICAgICAgIG1GaW5hbFZvbHVtZSA9IHZvbHVtZTsKKyAgICAgICAgc2V0TWV0YWRhdGFIYXNDaGFuZ2VkKCk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpjb3B5TWV0YWRhdGFUbyhNZXRhZGF0YUluc2VydGVyJiBiYWNrSW5zZXJ0ZXIpIGNvbnN0Cit7CisgICAgKmJhY2tJbnNlcnRlcisrID0geworICAgICAgICAgICAgLnVzYWdlID0gbUF0dHIudXNhZ2UsCisgICAgICAgICAgICAuY29udGVudF90eXBlID0gbUF0dHIuY29udGVudF90eXBlLAorICAgICAgICAgICAgLmdhaW4gPSBtRmluYWxWb2x1bWUsCisgICAgfTsKK30KKwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKQogewogICAgIGlmICghaXNPZmZsb2FkZWQoKSAmJiAhaXNEaXJlY3QoKSkgewpAQCAtMTEwMSwxMSArMTEzMywxMiBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjp0cmlnZ2VyRXZlbnRzKEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgdHlwZSkKIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TeW5jRXZlbnRzLnNpemUoKTsgaSsrKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3luY0V2ZW50cy5zaXplKCk7KSB7CiAgICAgICAgIGlmIChtU3luY0V2ZW50c1tpXS0+dHlwZSgpID09IHR5cGUpIHsKICAgICAgICAgICAgIG1TeW5jRXZlbnRzW2ldLT50cmlnZ2VyKCk7CiAgICAgICAgICAgICBtU3luY0V2ZW50cy5yZW1vdmVBdChpKTsKLSAgICAgICAgICAgIGktLTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICsraTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTEyNTUsNiArMTI4OCw3IEBACiAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgIHVpZF90IHVpZCkKICAgICA6ICAgVHJhY2socGxheWJhY2tUaHJlYWQsIE5VTEwsIEFVRElPX1NUUkVBTV9QQVRDSCwKKyAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190e30gLyogY3VycmVudGx5IHVudXNlZCBmb3Igb3V0cHV0IHRyYWNrICovLAogICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICBudWxscHRyIC8qIGJ1ZmZlciAqLywgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sIG51bGxwdHIgLyogc2hhcmVkQnVmZmVyICovLAogICAgICAgICAgICAgICBBVURJT19TRVNTSU9OX05PTkUsIHVpZCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKQEAgLTE0MTMsNiArMTQ0NywyMSBAQAogICAgIHJldHVybiBvdXRwdXRCdWZmZXJGdWxsOwogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Ok91dHB1dFRyYWNrOjpjb3B5TWV0YWRhdGFUbyhNZXRhZGF0YUluc2VydGVyJiBiYWNrSW5zZXJ0ZXIpIGNvbnN0Cit7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVRyYWNrTWV0YWRhdGFzTXV0ZXgpOworICAgIGJhY2tJbnNlcnRlciA9IHN0ZDo6Y29weShtVHJhY2tNZXRhZGF0YXMuYmVnaW4oKSwgbVRyYWNrTWV0YWRhdGFzLmVuZCgpLCBiYWNrSW5zZXJ0ZXIpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Ok91dHB1dFRyYWNrOjpzZXRNZXRhZGF0YXMoY29uc3QgU291cmNlTWV0YWRhdGFzJiBtZXRhZGF0YXMpIHsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1UcmFja01ldGFkYXRhc011dGV4KTsKKyAgICAgICAgbVRyYWNrTWV0YWRhdGFzID0gbWV0YWRhdGFzOworICAgIH0KKyAgICAvLyBObyBuZWVkIHRvIGFkanVzdCBtZXRhZGF0YSB0cmFjayB2b2x1bWVzIGFzIE91dHB1dFRyYWNrIHZvbHVtZXMgYXJlIGFsd2F5cyAwZEJGUy4KKyAgICBzZXRNZXRhZGF0YUhhc0NoYW5nZWQoKTsKK30KKwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6T3V0cHV0VHJhY2s6Om9idGFpbkJ1ZmZlcigKICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIsIHVpbnQzMl90IHdhaXRUaW1lTXMpCiB7CkBAIC0xNDU3LDYgKzE1MDYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCiAgICAgOiAgIFRyYWNrKHBsYXliYWNrVGhyZWFkLCBOVUxMLCBzdHJlYW1UeXBlLAorICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3R7fSAvKiBjdXJyZW50bHkgdW51c2VkIGZvciBwYXRjaCB0cmFjayAqLywKICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgYnVmZmVyLCBidWZmZXJTaXplLCBudWxscHRyIC8qIHNoYXJlZEJ1ZmZlciAqLywKICAgICAgICAgICAgICAgQVVESU9fU0VTU0lPTl9OT05FLCBnZXR1aWQoKSwgZmxhZ3MsIFRZUEVfUEFUQ0gpLApAQCAtMTUyMSw5ICsxNTcxLDExIEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga01heFRyaWVzID0gNTsKICAgICBpbnQzMl90IHRyeUNvdW50ZXIgPSBrTWF4VHJpZXM7CisgICAgY29uc3Qgc2l6ZV90IG9yaWdpbmFsRnJhbWVDb3VudCA9IGJ1ZmZlci0+bUZyYW1lQ291bnQ7CiAgICAgZG8gewogICAgICAgICBpZiAoc3RhdHVzID09IE5PVF9FTk9VR0hfREFUQSkgewogICAgICAgICAgICAgcmVzdGFydElmRGlzYWJsZWQoKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+bUZyYW1lQ291bnQgPSBvcmlnaW5hbEZyYW1lQ291bnQ7IC8vIGNsZWFyZWQgb24gZXJyb3IsIG11c3QgYmUgcmVzdG9yZWQuCiAgICAgICAgIH0KICAgICAgICAgc3RhdHVzID0gbVByb3h5LT5vYnRhaW5CdWZmZXIoYnVmZmVyLCB0aW1lT3V0KTsKICAgICB9IHdoaWxlICgoc3RhdHVzID09IE5PVF9FTk9VR0hfREFUQSkgJiYgKHRyeUNvdW50ZXItLSA+IDApKTsKQEAgLTE1NjEsMTQgKzE2MTMsMTYgQEAKICAgICBtUmVjb3JkVHJhY2stPmRlc3Ryb3koKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OnN0YXJ0KGludCAvKkF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QqLyBldmVudCwKLSAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHRyaWdnZXJTZXNzaW9uKSB7CitiaW5kZXI6OlN0YXR1cyBBdWRpb0ZsaW5nZXI6OlJlY29yZEhhbmRsZTo6c3RhcnQoaW50IC8qQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCovIGV2ZW50LAorICAgICAgICBpbnQgLyphdWRpb19zZXNzaW9uX3QqLyB0cmlnZ2VyU2Vzc2lvbikgewogICAgIEFMT0dWKCJSZWNvcmRIYW5kbGU6OnN0YXJ0KCkiKTsKLSAgICByZXR1cm4gbVJlY29yZFRyYWNrLT5zdGFydCgoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdClldmVudCwgdHJpZ2dlclNlc3Npb24pOworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoCisgICAgICAgIG1SZWNvcmRUcmFjay0+c3RhcnQoKEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QpZXZlbnQsIChhdWRpb19zZXNzaW9uX3QpIHRyaWdnZXJTZXNzaW9uKSk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OnN0b3AoKSB7CitiaW5kZXI6OlN0YXR1cyBBdWRpb0ZsaW5nZXI6OlJlY29yZEhhbmRsZTo6c3RvcCgpIHsKICAgICBzdG9wX25vbnZpcnR1YWwoKTsKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OnN0b3Bfbm9udmlydHVhbCgpIHsKQEAgLTE1NzYsMTAgKzE2MzAsMTEgQEAKICAgICBtUmVjb3JkVHJhY2stPnN0b3AoKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6Om9uVHJhbnNhY3QoCi0gICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKLXsKLSAgICByZXR1cm4gQm5BdWRpb1JlY29yZDo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworYmluZGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcykgeworICAgIEFMT0dWKCJSZWNvcmRIYW5kbGU6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKCkiKTsKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKAorICAgICAgICAgICAgbVJlY29yZFRyYWNrLT5nZXRBY3RpdmVNaWNyb3Bob25lcyhhY3RpdmVNaWNyb3Bob25lcykpOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNTg4LDYgKzE2NDMsNyBAQAogQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpSZWNvcmRUcmFjaygKICAgICAgICAgICAgIFJlY29yZFRocmVhZCAqdGhyZWFkLAogICAgICAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyLAogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLApAQCAtMTU5OSw3ICsxNjU1LDcgQEAKICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICB0cmFja190eXBlIHR5cGUsCiAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKLSAgICA6ICAgVHJhY2tCYXNlKHRocmVhZCwgY2xpZW50LCBzYW1wbGVSYXRlLCBmb3JtYXQsCisgICAgOiAgIFRyYWNrQmFzZSh0aHJlYWQsIGNsaWVudCwgYXR0ciwgc2FtcGxlUmF0ZSwgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIGJ1ZmZlciwgYnVmZmVyU2l6ZSwgc2Vzc2lvbklkLCB1aWQsIGZhbHNlIC8qaXNPdXQqLywKICAgICAgICAgICAgICAgICAgICh0eXBlID09IFRZUEVfREVGQVVMVCkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAoKGZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKSA/IEFMTE9DX1BJUEUgOiBBTExPQ19DQkxLKSA6CkBAIC0xNjA5LDcgKzE2NjUsOCBAQAogICAgICAgICBtRnJhbWVzVG9Ecm9wKDApLAogICAgICAgICBtUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIoTlVMTCksIC8vIGluaXRpYWxpemUgaW4gY2FzZSBvZiBlYXJseSBjb25zdHJ1Y3RvciBleGl0CiAgICAgICAgIG1SZWNvcmRCdWZmZXJDb252ZXJ0ZXIoTlVMTCksCi0gICAgICAgIG1GbGFncyhmbGFncykKKyAgICAgICAgbUZsYWdzKGZsYWdzKSwKKyAgICAgICAgbVNpbGVuY2VkKGZhbHNlKQogewogICAgIGlmIChtQ2JsayA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTE2ODksNyArMTc0Niw3IEBACiAgICAgaWYgKHRocmVhZCAhPSAwKSB7CiAgICAgICAgIFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkID0gKFJlY29yZFRocmVhZCAqKXRocmVhZC5nZXQoKTsKICAgICAgICAgaWYgKHJlY29yZFRocmVhZC0+c3RvcCh0aGlzKSAmJiBpc0V4dGVybmFsVHJhY2soKSkgewotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dChtVGhyZWFkSW9IYW5kbGUsIG1TZXNzaW9uSWQpOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dChtUG9ydElkKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTE3MDEsOSArMTc1OCw5IEBACiAgICAgewogICAgICAgICBpZiAoaXNFeHRlcm5hbFRyYWNrKCkpIHsKICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gQUNUSVZFIHx8IG1TdGF0ZSA9PSBSRVNVTUlORykgewotICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQobVRocmVhZElvSGFuZGxlLCBtU2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KG1Qb3J0SWQpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChtVGhyZWFkSW9IYW5kbGUsIG1TZXNzaW9uSWQpOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChtUG9ydElkKTsKICAgICAgICAgfQogICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKICAgICAgICAgaWYgKHRocmVhZCAhPSAwKSB7CkBAIC0xNzI4LDE0ICsxNzg1LDE0IEBACiAKIC8qc3RhdGljKi8gdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KQogewotICAgIHJlc3VsdC5hcHBlbmQoIkFjdGl2ZSBDbGllbnQgU2Vzc2lvbiBTICBGbGFncyAgIEZvcm1hdCBDaG4gbWFzayAgU1JhdGUgICBTZXJ2ZXIgRnJtQ250XG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKCJBY3RpdmUgQ2xpZW50IFNlc3Npb24gUyAgRmxhZ3MgICBGb3JtYXQgQ2huIG1hc2sgIFNSYXRlICAgU2VydmVyIEZybUNudCBTaWxcbiIpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6YXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlKQogewogICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiVjJTVzICU2dSAlN3UgJTJzIDB4JTAzWCAiCiAgICAgICAgICAgICAiJTA4WCAlMDhYICU2dSAiCi0gICAgICAgICAgICAiJTA4WCAlNnp1XG4iLAorICAgICAgICAgICAgIiUwOFggJTZ6dSAlM2NcbiIsCiAgICAgICAgICAgICBpc0Zhc3RUcmFjaygpID8gJ0YnIDogJyAnLAogICAgICAgICAgICAgYWN0aXZlID8gInllcyIgOiAibm8iLAogICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWRfY2FjaGVkIDogbUNsaWVudC0+cGlkKCksCkBAIC0xNzQ4LDcgKzE4MDUsOCBAQAogICAgICAgICAgICAgbVNhbXBsZVJhdGUsCiAKICAgICAgICAgICAgIG1DYmxrLT5tU2VydmVyLAotICAgICAgICAgICAgbUZyYW1lQ291bnQKKyAgICAgICAgICAgIG1GcmFtZUNvdW50LAorICAgICAgICAgICAgaXNTaWxlbmNlZCgpID8gJ3MnIDogJ24nCiAgICAgICAgICAgICApOwogfQogCkBAIC0xNzk0LDYgKzE4NTIsMTggQEAKICAgICBtU2VydmVyUHJveHktPnNldFRpbWVzdGFtcChsb2NhbCk7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKQoreworICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICh0aHJlYWQgIT0gMCkgeworICAgICAgICBSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCA9IChSZWNvcmRUaHJlYWQgKil0aHJlYWQuZ2V0KCk7CisgICAgICAgIHJldHVybiByZWNvcmRUaHJlYWQtPmdldEFjdGl2ZU1pY3JvcGhvbmVzKGFjdGl2ZU1pY3JvcGhvbmVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KK30KKwogQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkOjpQYXRjaFJlY29yZChSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCkBAIC0xODAyLDcgKzE4NzIsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQotICAgIDogICBSZWNvcmRUcmFjayhyZWNvcmRUaHJlYWQsIE5VTEwsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCisgICAgOiAgIFJlY29yZFRyYWNrKHJlY29yZFRocmVhZCwgTlVMTCwKKyAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3R7fSAvKiBjdXJyZW50bHkgdW51c2VkIGZvciBwYXRjaCB0cmFjayAqLywKKyAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmVyU2l6ZSwgQVVESU9fU0VTU0lPTl9OT05FLCBnZXR1aWQoKSwgZmxhZ3MsIFRZUEVfUEFUQ0gpLAogICAgICAgICAgICAgICAgIG1Qcm94eShuZXcgQ2xpZW50UHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsIG1GcmFtZVNpemUsIGZhbHNlLCB0cnVlKSkKIHsKQEAgLTE4NjMsNiArMTkzNSw3IEBACiAKIAogQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpNbWFwVHJhY2s6Ok1tYXBUcmFjayhUaHJlYWRCYXNlICp0aHJlYWQsCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0ciwKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKQEAgLTE4NzAsMTMgKzE5NDMsMTMgQEAKICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQotICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBOVUxMLCBzYW1wbGVSYXRlLCBmb3JtYXQsCisgICAgOiAgIFRyYWNrQmFzZSh0aHJlYWQsIE5VTEwsIGF0dHIsIHNhbXBsZVJhdGUsIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCAoc2l6ZV90KTAgLyogZnJhbWVDb3VudCAqLywKICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogYnVmZmVyICovLCAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywKICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgdWlkLCBmYWxzZSAvKiBpc091dCAqLywKICAgICAgICAgICAgICAgICAgIEFMTE9DX05PTkUsCiAgICAgICAgICAgICAgICAgICBUWVBFX0RFRkFVTFQsIHBvcnRJZCksCi0gICAgICAgIG1QaWQocGlkKQorICAgICAgICBtUGlkKHBpZCksIG1TaWxlbmNlZChmYWxzZSksIG1TaWxlbmNlZE5vdGlmaWVkKGZhbHNlKQogewogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oCmluZGV4IDkwOWFmMDkuLjM4YzNjMDIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oCkBAIC0xOCw3ICsxOCw5IEBACiAjaWZuZGVmIEFORFJPSURfVFlQRURfTE9HR0VSX0gKICNkZWZpbmUgQU5EUk9JRF9UWVBFRF9MT0dHRVJfSAogCi0jaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJMb2cuaD4KKy8vIFRoaXMgaXMgdGhlIGNsaWVudCBBUEkgZm9yIHRoZSB0eXBlZCBsb2dnZXIuCisKKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9OQkxvZy5oPgogI2luY2x1ZGUgPGFsZ29yaXRobT4KIAogLyoKQEAgLTYyLDcgKzY0LDggQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBuPgotY29uc3RleHByIFQgZm52MWEoY29uc3QgY2hhciAoJmZpbGUpW25dLCBpbnQgaSA9IG4gLSAxKSB7CitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKK2NvbnN0ZXhwciBUIGZudjFhKGNvbnN0IGNoYXIgKCZmaWxlKVtuXSwgc3NpemVfdCBpID0gKHNzaXplX3QpbiAtIDEpIHsKICAgICByZXR1cm4gaSA9PSAtMSA/IG9mZnNldF9iYXNpczxUPigpIDogKGZudjFhPFQ+KGZpbGUsIGkgLSAxKSBeIGZpbGVbaV0pICogRk5WX3ByaW1lPFQ+KCk7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rCmluZGV4IDY1NTcxZjkuLmQyOWNhZTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5tawpAQCAtMjUsNiArMjUsNyBAQAogICAgIGxpYnNlcnZpY2V1dGlsaXR5IFwKICAgICBsaWJhdWRpb3BvbGljeW1hbmFnZXIgXAogICAgIGxpYm1lZGlhX2hlbHBlciBcCisgICAgbGlibWVkaWFtZXRyaWNzIFwKICAgICBsaWJlZmZlY3RzY29uZmlnCiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXApAQCAtNjAsNiArNjEsNyBAQAogICAgIGF1ZGlvX3BvbGljeV9jcml0ZXJpYS5jb25mIFwKIAogTE9DQUxfQ19JTkNMVURFUyArPSBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbmNsdWRlCitMT0NBTF9DX0lOQ0xVREVTICs9IGZyYW1ld29ya3MvYXYvaW5jbHVkZQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmF1ZGlvcG9saWN5ZW5naW5lY29uZmlndXJhYmxlCiAKQEAgLTc4LDYgKzgwLDcgQEAKICAgICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJtZWRpYV9oZWxwZXIKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGlibWVkaWFtZXRyaWNzCiAKIGlmZXEgKCQoVVNFX1hNTF9BVURJT19QT0xJQ1lfQ09ORiksIDEpCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmljdXVjIGxpYnhtbDIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCmluZGV4IDdiMTlmNTguLjkyM2MwOTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaApAQCAtNjUsMTUgKzY1LDE5IEBACiAgICAgICAgIEFQSV9JTlBVVF9URUxFUEhPTllfUlgsIC8vIHVzZWQgZm9yIGNhcHR1cmUgZnJvbSB0ZWxlcGhvbnkgUlggcGF0aAogICAgIH0gaW5wdXRfdHlwZV90OwogCi0gICBlbnVtIHsKKyAgICBlbnVtIHsKICAgICAgICAgQVBJX0lOUFVUX0NPTkNVUlJFTkNZX05PTkUgPSAwLAogICAgICAgICBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FMTCA9ICgxIDw8IDApLCAgICAgIC8vIENvbmN1cnJlbmN5IHdpdGggYSBjYWxsCiAgICAgICAgIEFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQVBUVVJFID0gKDEgPDwgMSksICAgLy8gQ29uY3VycmVuY3kgd2l0aCBhbm90aGVyIGNhcHR1cmUKKyAgICAgICAgQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0hPVFdPUkQgPSAoMSA8PCAyKSwgICAvLyBDb25jdXJyZW5jeSB3aXRoIGEgaG90d29yZAorICAgICAgICBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfUFJFRU1QVCA9ICgxIDw8IDMpLCAgIC8vIHByZS1lbXB0ZWQgc29tZW9uZQorICAgICAgICAgICAgICAgIC8vIE5COiBwcmVlbXB0IGlzIG1hcmtlZCBvbiBhIHN1Y2Nlc3NmdWwgcmV0dXJuLCBvdGhlcnMgYXJlIG9uIGZhaWxpbmcgY2FsbHMKKyAgICAgICAgQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0xBU1QgPSAoMSA8PCA0KSwKIAotICAgICAgICBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQUxMID0gKEFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQUxMIHwgQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBUFRVUkUpLAotICAgfTsKKyAgICAgICAgQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0FMTCA9IChBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfTEFTVCAtIDEpLAorICAgIH07CiAKLSAgIHR5cGVkZWYgdWludDMyX3QgY29uY3VycmVuY3lfdHlwZV9fbWFza190OworICAgIHR5cGVkZWYgdWludDMyX3QgY29uY3VycmVuY3lfdHlwZV9fbWFza190OwogCiBwdWJsaWM6CiAgICAgdmlydHVhbCB+QXVkaW9Qb2xpY3lJbnRlcmZhY2UoKSB7fQpAQCAtMTA5LDE5ICsxMTMsMTQgQEAKICAgICAvLwogCiAgICAgLy8gcmVxdWVzdCBhbiBvdXRwdXQgYXBwcm9wcmlhdGUgZm9yIHBsYXliYWNrIG9mIHRoZSBzdXBwbGllZCBzdHJlYW0gdHlwZSBhbmQgcGFyYW1ldGVycwotICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKSA9IDA7CisgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgPSAwOwogICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgb3V0cHV0IHN0YXJ0cyBiZWluZyB1c2VkIGJ5IGNvcnJlc3BvbmRpbmcgc3RyZWFtLgpAQCAtMTUwLDYgKzE0OSw3IEBACiAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBpbnB1dCBzdGFydHMgYmVpbmcgdXNlZC4KICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNpbGVuY2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jdXJyZW5jeV90eXBlX19tYXNrX3QgKmNvbmN1cnJlbmN5KSA9IDA7CiAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBpbnB1dCBzdG9wcyBiZWluZyB1c2VkLgogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LApAQCAtMjQ0LDYgKzI0NCw4IEBACiAKICAgICB2aXJ0dWFsIGZsb2F0ICAgIGdldFN0cmVhbVZvbHVtZURCKAogICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXgsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCAgICAgc2V0UmVjb3JkU2lsZW5jZWQodWlkX3QgdWlkLCBib29sIHNpbGVuY2VkKTsKIH07CiAKIApAQCAtMzYwLDYgKzM2Miw2IEBACiBleHRlcm4gIkMiIHZvaWQgZGVzdHJveUF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUludGVyZmFjZSAqaW50ZXJmYWNlKTsKIAogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLy8gQU5EUk9JRF9BVURJT1BPTElDWV9JTlRFUkZBQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaAppbmRleCAxMjM5ZmUwLi5mYzAxMmEyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaApAQCAtMzgsNiArMzgsNyBAQAogICAgIERFVklDRV9DQVRFR09SWV9TUEVBS0VSLAogICAgIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRSwKICAgICBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBLAorICAgIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCwKICAgICBERVZJQ0VfQ0FURUdPUllfQ05UCiB9OwogCkBAIC0xMjYsNiArMTI3LDggQEAKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM6CiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9VU0JfSEVBRFNFVDoKICAgICAgICAgICAgIHJldHVybiBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVDsKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEOgorICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRDsKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0xJTkU6CiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTDoKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0U6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL3BvbGljeS5oCmluZGV4IDMxZjA1NTAuLjliZDY4ZTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL3BvbGljeS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL3BvbGljeS5oCkBAIC0zNSw3ICszNSw4IEBACiAgKiBBIGRldmljZSBtYXNrIGZvciBhbGwgYXVkaW8gaW5wdXQgZGV2aWNlcyB0aGF0IGFyZSBjb25zaWRlcmVkICJ2aXJ0dWFsIiB3aGVuIGV2YWx1YXRpbmcKICAqIGFjdGl2ZSBpbnB1dHMgaW4gZ2V0QWN0aXZlSW5wdXRzKCkKICAqLwotI2RlZmluZSBBUE1fQVVESU9fSU5fREVWSUNFX1ZJUlRVQUxfQUxMICAoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpCisjZGVmaW5lIEFQTV9BVURJT19JTl9ERVZJQ0VfVklSVFVBTF9BTEwgKEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYfFwKKyAgICAgICAgQVVESU9fREVWSUNFX0lOX0JVU3xBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIpCiAKIAogLyoqCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQubWsKaW5kZXggZTI2M2MwYy4uZTY5ZTY4NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5tawpAQCAtMzYsNiArMzYsNyBAQAogICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUgXAogICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kgXAogICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvdXRpbGl0aWVzIFwKKyAgICBzeXN0ZW0vbWVkaWEvYXVkaW9fdXRpbHMvaW5jbHVkZSBcCiAKIGlmZXEgKCQoVVNFX1hNTF9BVURJT19QT0xJQ1lfQ09ORiksIDEpCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0NvbGxlY3Rpb25zLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Db2xsZWN0aW9ucy5oCmluZGV4IDhmMDBkMjIuLmY4NmU3NWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0NvbGxlY3Rpb25zLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvQ29sbGVjdGlvbnMuaApAQCAtNDEsNCArNDEsNCBAQAogICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdDsKIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9HYWluLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9HYWluLmgKaW5kZXggY2VhNWMwYi4uNGFjNTA4ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvR2Fpbi5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0dhaW4uaApAQCAtNjYsNCArNjYsNCBAQAogICAgIGJvb2wgICAgICAgICAgICAgIG1Vc2VJbkNoYW5uZWxNYXNrOwogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lucHV0RGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmgKaW5kZXggYjE2OWJhYy4uYjI1ZDZkNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmgKQEAgLTM0LDggKzM0LDggQEAKIGNsYXNzIEF1ZGlvSW5wdXREZXNjcmlwdG9yOiBwdWJsaWMgQXVkaW9Qb3J0Q29uZmlnLCBwdWJsaWMgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyCiB7CiBwdWJsaWM6Ci0gICAgZXhwbGljaXQgQXVkaW9JbnB1dERlc2NyaXB0b3IoY29uc3Qgc3A8SU9Qcm9maWxlPiYgcHJvZmlsZSk7Ci0gICAgdm9pZCBzZXRJb0hhbmRsZShhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSk7CisgICAgZXhwbGljaXQgQXVkaW9JbnB1dERlc2NyaXB0b3IoY29uc3Qgc3A8SU9Qcm9maWxlPiYgcHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldElkKCkgY29uc3Q7CiAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGdldE1vZHVsZUhhbmRsZSgpIGNvbnN0OwogICAgIHVpbnQzMl90IGdldE9wZW5SZWZDb3VudCgpIGNvbnN0OwpAQCAtNzMsNiArNzMsMjAgQEAKIAogICAgIHZvaWQgc2V0UGF0Y2hIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKIAorICAgIHN0YXR1c190IG9wZW4oY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCk7CisgICAgLy8gQ2FsbGVkIHdoZW4gYSBzdHJlYW0gaXMgYWJvdXQgdG8gYmUgc3RhcnRlZC4KKyAgICAvLyBOb3RlOiBjYWxsZWQgYWZ0ZXIgQXVkaW9TZXNzaW9uOjpjaGFuZ2VBY3RpdmVDb3VudCgxKQorICAgIHN0YXR1c190IHN0YXJ0KCk7CisgICAgLy8gQ2FsbGVkIGFmdGVyIGEgc3RyZWFtIGlzIHN0b3BwZWQKKyAgICAvLyBOb3RlOiBjYWxsZWQgYWZ0ZXIgQXVkaW9TZXNzaW9uOjpjaGFuZ2VBY3RpdmVDb3VudCgtMSkKKyAgICB2b2lkIHN0b3AoKTsKKyAgICB2b2lkIGNsb3NlKCk7CisKIHByaXZhdGU6CiAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgICAgICAgICAgbVBhdGNoSGFuZGxlOwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgICAgICAgIG1JZDsKQEAgLTg1LDYgKzk5LDcgQEAKICAgICAvLyBhIHBhcnRpY3VsYXIgaW5wdXQgc3RhcnRlZCBhbmQgcHJldmVudCBwcmVlbXB0aW9uIG9mIHRoaXMgYWN0aXZlIGlucHV0IGJ5IHRoaXMgc2Vzc2lvbi4KICAgICAvLyBXZSBhbHNvIGluaGVyaXQgc2Vzc2lvbnMgZnJvbSB0aGUgcHJlZW1wdGVkIGlucHV0IHRvIGF2b2lkIGEgMyB3YXkgcHJlZW1wdGlvbiBsb29wIGV0Yy4uLgogICAgIFNvcnRlZFZlY3RvcjxhdWRpb19zZXNzaW9uX3Q+IG1QcmVlbXB0ZWRTZXNzaW9uczsKKyAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqbUNsaWVudEludGVyZmFjZTsKIH07CiAKIGNsYXNzIEF1ZGlvSW5wdXRDb2xsZWN0aW9uIDoKQEAgLTExMiw0ICsxMjcsNCBAQAogfTsKIAogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5oCmluZGV4IGMwOWNiNWEuLjVlNWQzOGIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmgKQEAgLTEwMSw4ICsxMDEsNiBAQAogCiAgICAgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQpOwogCi0gICAgdm9pZCBzZXRJb0hhbmRsZShhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSk7Ci0KICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UoKSBjb25zdDsKICAgICB2aXJ0dWFsIGJvb2wgc2hhcmVzSHdNb2R1bGVXaXRoKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MpOwogICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IHN1cHBvcnRlZERldmljZXMoKTsKQEAgLTEyMiw2ICsxMjAsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7CiAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKIAorICAgICAgICAgICAgc3RhdHVzX3Qgb3Blbihjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQpOworICAgICAgICAgICAgLy8gQ2FsbGVkIHdoZW4gYSBzdHJlYW0gaXMgYWJvdXQgdG8gYmUgc3RhcnRlZAorICAgICAgICAgICAgLy8gTm90ZTogY2FsbGVkIGJlZm9yZSBjaGFuZ2VSZWZDb3VudCgxKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXJ0KCk7CisgICAgICAgICAgICAvLyBDYWxsZWQgYWZ0ZXIgYSBzdHJlYW0gaXMgc3RvcHBlZC4KKyAgICAgICAgICAgIC8vIE5vdGU6IGNhbGxlZCBhZnRlciBjaGFuZ2VSZWZDb3VudCgtMSk7CisgICAgICAgICAgICB2b2lkIHN0b3AoKTsKKyAgICAgICAgICAgIHZvaWQgY2xvc2UoKTsKKyAgICAgICAgICAgIHN0YXR1c190IG9wZW5EdXBsaWNhdGluZyhjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSk7CisKICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+IG1Qcm9maWxlOyAgICAgICAgICAvLyBJL08gcHJvZmlsZSB0aGlzIG91dHB1dCBkZXJpdmVzIGZyb20KICAgICBhdWRpb19pb19oYW5kbGVfdCBtSW9IYW5kbGU7ICAgICAgICAgICAvLyBvdXRwdXQgaGFuZGxlCiAgICAgdWludDMyX3QgbUxhdGVuY3k7ICAgICAgICAgICAgICAgICAgLy8KQEAgLTE3NSwxMCArMTkwLDI5IEBACiAgICAgYm9vbCBpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OwogCiAgICAgLyoqCisgICAgICogcmV0dXJuIHdoZXRoZXIgYSBzdHJlYW0gaXMgcGxheWluZywgYnV0IG5vdCBvbiBhICJyZW1vdGUiIGRldmljZS4KKyAgICAgKiBPdmVycmlkZSB0byBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YgYSBsb2NhbC9yZW1vdGUgcGxheWJhY2suCisgICAgICogVXNlZCBmb3IgaW5zdGFuY2UgYnkgcG9saWN5IG1hbmFnZXIgdG8gYWx0ZXIgdGhlIHNwZWFrZXIgcGxheWJhY2sgKCJzcGVha2VyIHNhZmUiIGJlaGF2aW9yKQorICAgICAqIHdoZW4gbWVkaWEgcGxheXMgb3Igbm90IGxvY2FsbHkuCisgICAgICogRm9yIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uLCAicmVtb3RlbHkiIG1lYW5zIHBsYXlpbmcgZHVyaW5nIHNjcmVlbiBtaXJyb3JpbmcuCisgICAgICovCisgICAgYm9vbCBpc1N0cmVhbUFjdGl2ZUxvY2FsbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CisKKyAgICAvKioKICAgICAgKiByZXR1cm5zIHRoZSBBMkRQIG91dHB1dCBoYW5kbGUgaWYgaXQgaXMgb3BlbiBvciAwIG90aGVyd2lzZQogICAgICAqLwogICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldEEyZHBPdXRwdXQoKSBjb25zdDsKIAorICAgIC8qKgorICAgICAqIHJldHVybnMgdHJ1ZSBpZiBwcmltYXJ5IEhBTCBzdXBwb3J0cyBBMkRQIE9mZmxvYWQKKyAgICAgKi8KKyAgICBib29sIGlzQTJkcE9mZmxvYWRlZE9uUHJpbWFyeSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogcmV0dXJucyB0cnVlIGlmIEEyRFAgaXMgc3VwcG9ydGVkIChlaXRoZXIgdmlhIGhhcmR3YXJlIG9mZmxvYWQgb3Igc29mdHdhcmUgZW5jb2RpbmcpCisgICAgICovCisgICAgYm9vbCBpc0EyZHBTdXBwb3J0ZWQoKSBjb25zdDsKKwogICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBnZXRPdXRwdXRGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3Q7CiAKICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZ2V0UHJpbWFyeU91dHB1dCgpIGNvbnN0OwpAQCAtMjA4LDQgKzI0Miw0IEBACiB9OwogCiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9QYXRjaC5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUGF0Y2guaAppbmRleCAzODVmMjU3Li5jMWMzZjNjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9QYXRjaC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BhdGNoLmgKQEAgLTE2LDYgKzE2LDcgQEAKIAogI3ByYWdtYSBvbmNlCiAKKyNpbmNsdWRlICJIYW5kbGVHZW5lcmF0b3IuaCIKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CkBAIC0yNCw3ICsyNSw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgQXVkaW9QYXRjaCA6IHB1YmxpYyBSZWZCYXNlCitjbGFzcyBBdWRpb1BhdGNoIDogcHVibGljIFJlZkJhc2UsIHByaXZhdGUgSGFuZGxlR2VuZXJhdG9yPGF1ZGlvX3BhdGNoX2hhbmRsZV90PgogewogcHVibGljOgogICAgIEF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwgdWlkX3QgdWlkKTsKQEAgLTM1LDkgKzM2LDYgQEAKICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggbVBhdGNoOwogICAgIHVpZF90IG1VaWQ7CiAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbUFmUGF0Y2hIYW5kbGU7Ci0KLXByaXZhdGU6Ci0gICAgc3RhdGljIHZvbGF0aWxlIGludDMyX3QgbU5leHRVbmlxdWVJZDsKIH07CiAKIGNsYXNzIEF1ZGlvUGF0Y2hDb2xsZWN0aW9uIDogcHVibGljIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19wYXRjaF9oYW5kbGVfdCwgc3A8QXVkaW9QYXRjaD4gPgpAQCAtNTIsNCArNTAsNCBAQAogICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lDb25maWcuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeUNvbmZpZy5oCmluZGV4IGYyNzU2YjUuLjQzZjZlZDYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeUNvbmZpZy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeUNvbmZpZy5oCkBAIC0zOSwxNCArMzksMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZU91dHB1dERldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVJbnB1dERldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRlZmF1bHRPdXRwdXREZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJmlzU3BlYWtlckRyY0VuYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lQ3VydmVzQ29sbGVjdGlvbiAqdm9sdW1lcyA9IG51bGxwdHIpCiAgICAgICAgIDogbUh3TW9kdWxlcyhod01vZHVsZXMpLAogICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKGF2YWlsYWJsZU91dHB1dERldmljZXMpLAogICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMoYXZhaWxhYmxlSW5wdXREZXZpY2VzKSwKICAgICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZXMoZGVmYXVsdE91dHB1dERldmljZXMpLAogICAgICAgICAgIG1Wb2x1bWVDdXJ2ZXModm9sdW1lcyksCi0gICAgICAgICAgbUlzU3BlYWtlckRyY0VuYWJsZWQoaXNTcGVha2VyRHJjRW5hYmxlZCkKKyAgICAgICAgICBtSXNTcGVha2VyRHJjRW5hYmxlZChmYWxzZSkKICAgICB7fQogCiAgICAgdm9pZCBzZXRWb2x1bWVzKGNvbnN0IFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24gJnZvbHVtZXMpCkBAIC04MCw2ICs3OSw4IEBACiAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmFkZChhdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKICAgICB9CiAKKyAgICBib29sIGlzU3BlYWtlckRyY0VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBtSXNTcGVha2VyRHJjRW5hYmxlZDsgfQorCiAgICAgdm9pZCBzZXRTcGVha2VyRHJjRW5hYmxlZChib29sIGlzU3BlYWtlckRyY0VuYWJsZWQpCiAgICAgewogICAgICAgICBtSXNTcGVha2VyRHJjRW5hYmxlZCA9IGlzU3BlYWtlckRyY0VuYWJsZWQ7CkBAIC0xMTIsNyArMTEzLDcgQEAKICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuYWRkKG1EZWZhdWx0T3V0cHV0RGV2aWNlcyk7CiAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuYWRkKGRlZmF1bHRJbnB1dERldmljZSk7CiAKLSAgICAgICAgbW9kdWxlID0gbmV3IEh3TW9kdWxlKCJwcmltYXJ5Iik7CisgICAgICAgIG1vZHVsZSA9IG5ldyBId01vZHVsZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSk7CiAKICAgICAgICAgc3A8T3V0cHV0UHJvZmlsZT4gb3V0UHJvZmlsZTsKICAgICAgICAgb3V0UHJvZmlsZSA9IG5ldyBPdXRwdXRQcm9maWxlKFN0cmluZzgoInByaW1hcnkiKSk7CkBAIC0xMjEsNyArMTIyLDcgQEAKICAgICAgICAgICAgICAgICBuZXcgQXVkaW9Qcm9maWxlKEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sIDQ0MTAwKSk7CiAgICAgICAgIG91dFByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShtRGVmYXVsdE91dHB1dERldmljZXMpOwogICAgICAgICBvdXRQcm9maWxlLT5zZXRGbGFncyhBVURJT19PVVRQVVRfRkxBR19QUklNQVJZKTsKLSAgICAgICAgbW9kdWxlLT5tT3V0cHV0UHJvZmlsZXMuYWRkKG91dFByb2ZpbGUpOworICAgICAgICBtb2R1bGUtPmFkZE91dHB1dFByb2ZpbGUob3V0UHJvZmlsZSk7CiAKICAgICAgICAgc3A8SW5wdXRQcm9maWxlPiBpblByb2ZpbGU7CiAgICAgICAgIGluUHJvZmlsZSA9IG5ldyBJbnB1dFByb2ZpbGUoU3RyaW5nOCgicHJpbWFyeSIpKTsKQEAgLTEyOSw3ICsxMzAsNyBAQAogICAgICAgICBpblByb2ZpbGUtPmFkZEF1ZGlvUHJvZmlsZSgKICAgICAgICAgICAgICAgICBuZXcgQXVkaW9Qcm9maWxlKEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBBVURJT19DSEFOTkVMX0lOX01PTk8sIDgwMDApKTsKICAgICAgICAgaW5Qcm9maWxlLT5hZGRTdXBwb3J0ZWREZXZpY2UoZGVmYXVsdElucHV0RGV2aWNlKTsKLSAgICAgICAgbW9kdWxlLT5tSW5wdXRQcm9maWxlcy5hZGQoaW5Qcm9maWxlKTsKKyAgICAgICAgbW9kdWxlLT5hZGRJbnB1dFByb2ZpbGUoaW5Qcm9maWxlKTsKIAogICAgICAgICBtSHdNb2R1bGVzLmFkZChtb2R1bGUpOwogICAgIH0KQEAgLTE0MCw3ICsxNDEsMTAgQEAKICAgICBEZXZpY2VWZWN0b3IgJm1BdmFpbGFibGVJbnB1dERldmljZXM7CiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJm1EZWZhdWx0T3V0cHV0RGV2aWNlczsKICAgICBWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uICptVm9sdW1lQ3VydmVzOwotICAgIGJvb2wgJm1Jc1NwZWFrZXJEcmNFbmFibGVkOworICAgIC8vIFRPRE86IHJlbW92ZSB3aGVuIGxlZ2FjeSBjb25mIGZpbGUgaXMgcmVtb3ZlZC4gdHJ1ZSBvbiBkZXZpY2VzIHRoYXQgdXNlIERSQyBvbiB0aGUKKyAgICAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiBwYXRoIHRvIGJvb3N0IHNvZnQgc291bmRzLCB1c2VkIHRvIGFkanVzdCB2b2x1bWUgY3VydmVzIGFjY29yZGluZ2x5LgorICAgIC8vIE5vdGU6IHJlbW92ZSBhbHNvIHNwZWFrZXJfZHJjX2VuYWJsZWQgZnJvbSBnbG9iYWwgY29uZmlndXJhdGlvbiBvZiBYTUwgY29uZmlnIGZpbGUuCisgICAgYm9vbCBtSXNTcGVha2VyRHJjRW5hYmxlZDsKIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lNaXguaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeU1peC5oCmluZGV4IDBiYWNlZjcuLjhmYzZmZTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeU1peC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeU1peC5oCkBAIC04Myw0ICs4Myw0IEBACiAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0OwogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvcnQuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvcnQuaAppbmRleCA0Zjc5ZWQyLi4wOWE4NmRkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb3J0LmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9ydC5oCkBAIC0xOCw2ICsxOCw3IEBACiAKICNpbmNsdWRlICJBdWRpb0NvbGxlY3Rpb25zLmgiCiAjaW5jbHVkZSAiQXVkaW9Qcm9maWxlLmgiCisjaW5jbHVkZSAiSGFuZGxlR2VuZXJhdG9yLmgiCiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KQEAgLTMyLDcgKzMzLDcgQEAKIGNsYXNzIEF1ZGlvUm91dGU7CiB0eXBlZGVmIFZlY3RvcjxzcDxBdWRpb0dhaW4+ID4gQXVkaW9HYWluQ29sbGVjdGlvbjsKIAotY2xhc3MgQXVkaW9Qb3J0IDogcHVibGljIHZpcnR1YWwgUmVmQmFzZQorY2xhc3MgQXVkaW9Qb3J0IDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSwgcHJpdmF0ZSBIYW5kbGVHZW5lcmF0b3I8YXVkaW9fcG9ydF9oYW5kbGVfdD4KIHsKIHB1YmxpYzoKICAgICBBdWRpb1BvcnQoY29uc3QgU3RyaW5nOCYgbmFtZSwgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwgIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUpIDoKQEAgLTUxLDcgKzUyLDcgQEAKICAgICB2b2lkIHNldEdhaW5zKGNvbnN0IEF1ZGlvR2FpbkNvbGxlY3Rpb24gJmdhaW5zKSB7IG1HYWlucyA9IGdhaW5zOyB9CiAgICAgY29uc3QgQXVkaW9HYWluQ29sbGVjdGlvbiAmZ2V0R2FpbnMoKSBjb25zdCB7IHJldHVybiBtR2FpbnM7IH0KIAotICAgIHZvaWQgc2V0RmxhZ3ModWludDMyX3QgZmxhZ3MpCisgICAgdmlydHVhbCB2b2lkIHNldEZsYWdzKHVpbnQzMl90IGZsYWdzKQogICAgIHsKICAgICAgICAgLy9mb3JjZSBkaXJlY3QgZmxhZyBpZiBvZmZsb2FkIGZsYWcgaXMgc2V0OiBvZmZsb2FkaW5nIGltcGxpZXMgYSBkaXJlY3Qgb3V0cHV0IHN0cmVhbQogICAgICAgICAvLyBhbmQgYWxsIGNvbW1vbiBiZWhhdmlvcnMgYXJlIGRyaXZlbiBieSBjaGVja2luZyBvbmx5IHRoZSBkaXJlY3QgZmxhZwpAQCAtODMsMTIgKzg0LDcgQEAKICAgICBib29sIGhhc0R5bmFtaWNBdWRpb1Byb2ZpbGUoKSBjb25zdCB7IHJldHVybiBtUHJvZmlsZXMuaGFzRHluYW1pY1Byb2ZpbGUoKTsgfQogCiAgICAgLy8gc2VhcmNoZXMgZm9yIGFuIGV4YWN0IG1hdGNoCi0gICAgc3RhdHVzX3QgY2hlY2tFeGFjdEF1ZGlvUHJvZmlsZSh1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtUHJvZmlsZXMuY2hlY2tFeGFjdFByb2ZpbGUoc2FtcGxpbmdSYXRlLCBjaGFubmVsTWFzaywgZm9ybWF0KTsKLSAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCBjaGVja0V4YWN0QXVkaW9Qcm9maWxlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSBjb25zdDsKIAogICAgIC8vIHNlYXJjaGVzIGZvciBhIGNvbXBhdGlibGUgbWF0Y2gsIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBmb3IgaW5wdXQKICAgICAvLyBwYXJhbWV0ZXJzIGFyZSBpbnB1dHxvdXRwdXQsIHJldHVybmVkIHZhbHVlIGlzIHRoZSBiZXN0IG1hdGNoLgpAQCAtMTUyLDcgKzE0OCw2IEBACiAgICAgdWludDMyX3QgbUZsYWdzOyAvLyBhdHRyaWJ1dGUgZmxhZ3MgbWFzayAoZS5nIHByaW1hcnkgb3V0cHV0LCBkaXJlY3Qgb3V0cHV0Li4uKS4KICAgICBBdWRpb1Byb2ZpbGVWZWN0b3IgbVByb2ZpbGVzOyAvLyBBdWRpb1Byb2ZpbGVzIHN1cHBvcnRlZCBieSB0aGlzIHBvcnQgKGZvcm1hdCwgUmF0ZXMsIENoYW5uZWxzKQogICAgIEF1ZGlvUm91dGVWZWN0b3IgbVJvdXRlczsgLy8gUm91dGVzIGludm9sdmluZyB0aGlzIHBvcnQKLSAgICBzdGF0aWMgdm9sYXRpbGUgaW50MzJfdCBtTmV4dFVuaXF1ZUlkOwogfTsKIAogY2xhc3MgQXVkaW9Qb3J0Q29uZmlnIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZQpAQCAtMTc2LDQgKzE3MSw0IEBACiAgICAgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnIG1HYWluOwogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Byb2ZpbGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Byb2ZpbGUuaAppbmRleCA0MDRlMjdkLi44NzQxYzY2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qcm9maWxlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUHJvZmlsZS5oCkBAIC0zNDksNCArMzQ5LDQgQEAKIAogYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQXVkaW9Qcm9maWxlICZsZWZ0LCBjb25zdCBBdWRpb1Byb2ZpbGUgJnJpZ2h0KTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1JvdXRlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Sb3V0ZS5oCmluZGV4IGRmNTRmNDguLjZiMjRmZGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1JvdXRlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUm91dGUuaApAQCAtNTUsNCArNTUsNCBAQAogCiB9OwogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbi5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbi5oCmluZGV4IGNlZGYyMmQuLmRkNTI0N2QgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Nlc3Npb24uaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uLmgKQEAgLTU1LDYgKzU1LDggQEAKICAgICB2b2lkIHNldFVpZCh1aWRfdCB1aWQpIHsgbVJlY29yZENsaWVudEluZm8udWlkID0gdWlkOyB9CiAgICAgYm9vbCBtYXRjaGVzKGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4gJm90aGVyKSBjb25zdDsKICAgICBib29sIGlzU291bmRUcmlnZ2VyKCkgY29uc3QgeyByZXR1cm4gbUlzU291bmRUcmlnZ2VyOyB9CisgICAgdm9pZCBzZXRTaWxlbmNlZChib29sIHNpbGVuY2VkKSB7IG1TaWxlbmNlZCA9IHNpbGVuY2VkOyB9CisgICAgYm9vbCBpc1NpbGVuY2VkKCkgY29uc3QgeyByZXR1cm4gbVNpbGVuY2VkOyB9CiAgICAgdWludDMyX3Qgb3BlbkNvdW50KCkgY29uc3QgeyByZXR1cm4gbU9wZW5Db3VudDsgfSA7CiAgICAgdWludDMyX3QgYWN0aXZlQ291bnQoKSBjb25zdCB7IHJldHVybiBtQWN0aXZlQ291bnQ7IH0gOwogCkBAIC03MCw2ICs3Miw3IEBACiAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlIG1Db25maWc7CiAgICAgY29uc3QgYXVkaW9faW5wdXRfZmxhZ3NfdCBtRmxhZ3M7CiAgICAgYm9vbCAgbUlzU291bmRUcmlnZ2VyOworICAgIGJvb2wgbVNpbGVuY2VkOwogICAgIHVpbnQzMl90ICBtT3BlbkNvdW50OwogICAgIHVpbnQzMl90ICBtQWN0aXZlQ291bnQ7CiAgICAgQXVkaW9NaXgqIG1Qb2xpY3lNaXg7IC8vIG5vbiBOVUxMIHdoZW4gdXNlZCBieSBhIGR5bmFtaWMgcG9saWN5CkBAIC0xMDIsNCArMTA1LDQgQEAKICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3Q7CiB9OwogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU291cmNlRGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU291cmNlRGVzY3JpcHRvci5oCmluZGV4IDdlMWUyNGQuLjBkOTBmNDIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1NvdXJjZURlc2NyaXB0b3IuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmgKQEAgLTU2LDQgKzU2LDQgQEAKICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7CiB9OwogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NvbmZpZ1BhcnNpbmdVdGlscy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NvbmZpZ1BhcnNpbmdVdGlscy5oCmluZGV4IGVlOTVjZWIuLmEwMDc4NTQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Db25maWdQYXJzaW5nVXRpbHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQ29uZmlnUGFyc2luZ1V0aWxzLmgKQEAgLTU2LDQgKzU2LDQgQEAKICAgICBzdGF0aWMgc3RhdHVzX3QgbG9hZEh3TW9kdWxlKGNub2RlICpyb290LCBzcDxId01vZHVsZT4gJm1vZHVsZSwgQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZyk7CiB9OwogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0RldmljZURlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmgKaW5kZXggMWE2NDRkNy4uOTJhNGMzZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0RldmljZURlc2NyaXB0b3IuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRGV2aWNlRGVzY3JpcHRvci5oCkBAIC05MSw0ICs5MSw0IEBACiAgICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2VUeXBlczsKIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRWZmZWN0RGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0VmZmVjdERlc2NyaXB0b3IuaAppbmRleCA5ZWEwYWVhLi4wNDgzMWM2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRWZmZWN0RGVzY3JpcHRvci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9FZmZlY3REZXNjcmlwdG9yLmgKQEAgLTY5LDQgKzY5LDQgQEAKICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX0VGRkVDVFNfTUVNT1JZID0gNTEyOwogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9HYWlucy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0dhaW5zLmgKaW5kZXggMzRhZmM4Yy4uY2IyMjlhNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0dhaW5zLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0dhaW5zLmgKQEAgLTUyLDggKzUyLDkgQEAKICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzTGluZWFyVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwogICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTaWxlbnRWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07CiAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0Z1bGxTY2FsZVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKKyAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzSGVhcmluZ0FpZFZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKICAgICAvLyBkZWZhdWx0IHZvbHVtZSBjdXJ2ZXMgcGVyIHN0cmVhbSBhbmQgZGV2aWNlIGNhdGVnb3J5LiBTZWUgaW5pdGlhbGl6ZVZvbHVtZUN1cnZlcygpCiAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKnNWb2x1bWVQcm9maWxlc1tBVURJT19TVFJFQU1fQ05UXVtERVZJQ0VfQ0FURUdPUllfQ05UXTsKIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSGFuZGxlR2VuZXJhdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSGFuZGxlR2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM3YTJlMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9IYW5kbGVHZW5lcmF0b3IuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8bGltaXRzPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBIYW5kbGVHZW5lcmF0b3IgeworICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIFQgZ2V0TmV4dEhhbmRsZSgpOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK1QgSGFuZGxlR2VuZXJhdG9yPFQ+OjpnZXROZXh0SGFuZGxlKCkgeworICAgIHN0YXRpYyBzdGQ6OmF0b21pYzx1aW50MzJfdD4gbU5leHRVbmlxdWVJZCgxKTsKKyAgICB1aW50MzJfdCBpZCA9IG1OZXh0VW5pcXVlSWQrKzsKKyAgICB3aGlsZSAoaWQgPiBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKSkgeworICAgICAgICBpZCAtPSBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQ+KGlkKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0h3TW9kdWxlLmgKaW5kZXggMjliNmI5Yy4uY2I5ZjQ5ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0h3TW9kdWxlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0h3TW9kdWxlLmgKQEAgLTQ0LDEyICs0NCwxMCBAQAogCiAgICAgY29uc3QgY2hhciAqZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lLnN0cmluZygpOyB9CiAKLQogICAgIGNvbnN0IERldmljZVZlY3RvciAmZ2V0RGVjbGFyZWREZXZpY2VzKCkgY29uc3QgeyByZXR1cm4gbURlY2xhcmVkRGV2aWNlczsgfQogICAgIHZvaWQgc2V0RGVjbGFyZWREZXZpY2VzKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcyk7CiAKICAgICBjb25zdCBJbnB1dFByb2ZpbGVDb2xsZWN0aW9uICZnZXRJbnB1dFByb2ZpbGVzKCkgY29uc3QgeyByZXR1cm4gbUlucHV0UHJvZmlsZXM7IH0KLQogICAgIGNvbnN0IE91dHB1dFByb2ZpbGVDb2xsZWN0aW9uICZnZXRPdXRwdXRQcm9maWxlcygpIGNvbnN0IHsgcmV0dXJuIG1PdXRwdXRQcm9maWxlczsgfQogCiAgICAgdm9pZCBzZXRQcm9maWxlcyhjb25zdCBJT1Byb2ZpbGVDb2xsZWN0aW9uICZwcm9maWxlcyk7CkBAIC03Niw2ICs3NCw3IEBACiAgICAgc3RhdHVzX3QgcmVtb3ZlSW5wdXRQcm9maWxlKGNvbnN0IFN0cmluZzgmIG5hbWUpOwogCiAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGdldEhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1IYW5kbGU7IH0KKyAgICB2b2lkIHNldEhhbmRsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgaGFuZGxlKTsKIAogICAgIHNwPEF1ZGlvUG9ydD4gZmluZFBvcnRCeVRhZ05hbWUoY29uc3QgU3RyaW5nOCAmdGFnTmFtZSkgY29uc3QKICAgICB7CkBAIC04NSwxNCArODQsMTMgQEAKICAgICAvLyBUT0RPIHJlbW92ZSBmcm9tIGhlcmUgKHNwbGl0IHNlcmlhbGl6YXRpb24pCiAgICAgdm9pZCBkdW1wKGludCBmZCk7CiAKK3ByaXZhdGU6CisgICAgdm9pZCByZWZyZXNoU3VwcG9ydGVkRGV2aWNlcygpOworCiAgICAgY29uc3QgU3RyaW5nOCBtTmFtZTsgLy8gYmFzZSBuYW1lIG9mIHRoZSBhdWRpbyBIVyBtb2R1bGUgKHByaW1hcnksIGEyZHAgLi4uKQogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtSGFuZGxlOwogICAgIE91dHB1dFByb2ZpbGVDb2xsZWN0aW9uIG1PdXRwdXRQcm9maWxlczsgLy8gb3V0cHV0IHByb2ZpbGVzIGV4cG9zZWQgYnkgdGhpcyBtb2R1bGUKICAgICBJbnB1dFByb2ZpbGVDb2xsZWN0aW9uIG1JbnB1dFByb2ZpbGVzOyAgLy8gaW5wdXQgcHJvZmlsZXMgZXhwb3NlZCBieSB0aGlzIG1vZHVsZQotCi1wcml2YXRlOgotICAgIHZvaWQgcmVmcmVzaFN1cHBvcnRlZERldmljZXMoKTsKLQogICAgIHVpbnQzMl90IG1IYWxWZXJzaW9uOyAvLyBhdWRpbyBIQUwgQVBJIHZlcnNpb24KICAgICBEZXZpY2VWZWN0b3IgbURlY2xhcmVkRGV2aWNlczsgLy8gZGV2aWNlcyBkZWNsYXJlZCBpbiBhdWRpb19wb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlLgogICAgIEF1ZGlvUm91dGVWZWN0b3IgbVJvdXRlczsKQEAgLTExNCw0ICsxMTIsNCBAQAogICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmgKaW5kZXggZWMwNGVmNy4uNjdhYzliYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lPUHJvZmlsZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JT1Byb2ZpbGUuaApAQCAtMzQsMTEgKzM0LDI5IEBACiB7CiBwdWJsaWM6CiAgICAgSU9Qcm9maWxlKGNvbnN0IFN0cmluZzggJm5hbWUsIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUpCi0gICAgICAgIDogQXVkaW9Qb3J0KG5hbWUsIEFVRElPX1BPUlRfVFlQRV9NSVgsIHJvbGUpIHt9CisgICAgICAgIDogQXVkaW9Qb3J0KG5hbWUsIEFVRElPX1BPUlRfVFlQRV9NSVgsIHJvbGUpLAorICAgICAgICAgIG1heE9wZW5Db3VudCgocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSA/IDEgOiAwKSwKKyAgICAgICAgICBjdXJPcGVuQ291bnQoMCksCisgICAgICAgICAgbWF4QWN0aXZlQ291bnQoMSksCisgICAgICAgICAgY3VyQWN0aXZlQ291bnQoMCkge30KIAogICAgIC8vIEZvciBhIFByb2ZpbGUgYWthIE1peFBvcnQsIHRhZyBuYW1lIGFuZCBuYW1lIGFyZSBlcXVpdmFsZW50LgogICAgIHZpcnR1YWwgY29uc3QgU3RyaW5nOCBnZXRUYWdOYW1lKCkgY29uc3QgeyByZXR1cm4gZ2V0TmFtZSgpOyB9CiAKKyAgICAvLyBGSVhNRTogdGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBzaGFyZWQgTU1BUCBzdHJlYW0gY2xpZW50cyB1c2UgdGhlIHNhbWUgYXVkaW8gc2Vzc2lvbi4KKyAgICAvLyBPbmNlIGNhcHR1cmUgY2xpZW50cyBhcmUgdHJhY2tlZCBpbmRpdmlkdWFsbHkgYW5kIG5vdCBwZXIgc2Vzc2lvbiB0aGlzIGNhbiBiZSByZW1vdmVkCisgICAgLy8gTU1BUCBubyBJUlEgaW5wdXQgc3RyZWFtcyBkbyBub3QgaGF2ZSB0aGUgZGVmYXVsdCBsaW1pdGF0aW9uIG9mIG9uZSBhY3RpdmUgY2xpZW50CisgICAgLy8gbWF4IGFzIHRoZXkgY2FuIGJlIHVzZWQgaW4gc2hhcmVkIG1vZGUgYnkgdGhlIHNhbWUgYXBwbGljYXRpb24uCisgICAgLy8gTk9URTogdGhpcyB3b3JrcyBmb3IgZXhwbGljaXQgdmFsdWVzIHNldCBpbiBhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgYmVjYXVzZQorICAgIC8vIGZsYWdzIGFyZSBwYXJzZWQgYmVmb3JlIG1heEFjdGl2ZUNvdW50IGJ5IHRoZSBzZXJpYWxpemVyLgorICAgIHZvaWQgc2V0RmxhZ3ModWludDMyX3QgZmxhZ3MpIG92ZXJyaWRlCisgICAgeworICAgICAgICBBdWRpb1BvcnQ6OnNldEZsYWdzKGZsYWdzKTsKKyAgICAgICAgaWYgKGdldFJvbGUoKSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSyAmJiAoZmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX01NQVBfTk9JUlEpICE9IDApIHsKKyAgICAgICAgICAgIG1heEFjdGl2ZUNvdW50ID0gMDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIGlucHV0IGFuZCBkaXJlY3Qgb3V0cHV0LCBhbmQgaXMgbm90IHVzZWQgZm9yIG90aGVyIG91dHB1dC4KICAgICAvLyBJZiBwYXJhbWV0ZXIgdXBkYXRlZFNhbXBsaW5nUmF0ZSBpcyBub24tTlVMTCwgaXQgaXMgYXNzaWduZWQgdGhlIGFjdHVhbCBzYW1wbGUgcmF0ZS4KICAgICAvLyBGb3IgaW5wdXQsIGZsYWdzIGlzIGludGVycHJldGVkIGFzIGF1ZGlvX2lucHV0X2ZsYWdzX3QuCkBAIC01MSw3ICs2OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICp1cGRhdGVkRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnVwZGF0ZWRDaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpIGNvbnN0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBwYXJhbWV0ZXIgdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBleGFjdE1hdGNoUmVxdWlyZWRGb3JJbnB1dEZsYWdzID0gZmFsc2UpIGNvbnN0OwogCiAgICAgdm9pZCBkdW1wKGludCBmZCk7CiAgICAgdm9pZCBsb2coKTsKQEAgLTEwMyw2ICsxMjMsMzQgQEAKIAogICAgIGNvbnN0IERldmljZVZlY3RvciAmZ2V0U3VwcG9ydGVkRGV2aWNlcygpIGNvbnN0IHsgcmV0dXJuIG1TdXBwb3J0ZWREZXZpY2VzOyB9CiAKKyAgICBib29sIGNhbk9wZW5OZXdJbygpIHsKKyAgICAgICAgaWYgKG1heE9wZW5Db3VudCA9PSAwIHx8IGN1ck9wZW5Db3VudCA8IG1heE9wZW5Db3VudCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgY2FuU3RhcnROZXdJbygpIHsKKyAgICAgICAgaWYgKG1heEFjdGl2ZUNvdW50ID09IDAgfHwgY3VyQWN0aXZlQ291bnQgPCBtYXhBY3RpdmVDb3VudCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIE1heGltdW0gbnVtYmVyIG9mIGlucHV0IG9yIG91dHB1dCBzdHJlYW1zIHRoYXQgY2FuIGJlIHNpbXVsdGFuZW91c2x5IG9wZW5lZCBmb3IgdGhpcyBwcm9maWxlLgorICAgIC8vIEJ5IGNvbnZlbnRpb24gMCBtZWFucyBubyBsaW1pdC4gVG8gcmVzcGVjdCBsZWdhY3kgYmVoYXZpb3IsIGluaXRpYWxpemVkIHRvIDEgZm9yIG91dHB1dAorICAgIC8vIHByb2ZpbGVzIGFuZCAwIGZvciBpbnB1dCBwcm9maWxlcworICAgIHVpbnQzMl90ICAgICBtYXhPcGVuQ291bnQ7CisgICAgLy8gTnVtYmVyIG9mIHN0cmVhbXMgY3VycmVudGx5IG9wZW5lZCBmb3IgdGhpcyBwcm9maWxlLgorICAgIHVpbnQzMl90ICAgICBjdXJPcGVuQ291bnQ7CisgICAgLy8gTWF4aW11bSBudW1iZXIgb2YgaW5wdXQgb3Igb3V0cHV0IHN0cmVhbXMgdGhhdCBjYW4gYmUgc2ltdWx0YW5lb3VzbHkgYWN0aXZlIGZvciB0aGlzIHByb2ZpbGUuCisgICAgLy8gQnkgY29udmVudGlvbiAwIG1lYW5zIG5vIGxpbWl0LiBUbyByZXNwZWN0IGxlZ2FjeSBiZWhhdmlvciwgaW5pdGlhbGl6ZWQgdG8gMCBmb3Igb3V0cHV0CisgICAgLy8gcHJvZmlsZXMgYW5kIDEgZm9yIGlucHV0IHByb2ZpbGVzCisgICAgdWludDMyX3QgICAgIG1heEFjdGl2ZUNvdW50OworICAgIC8vIE51bWJlciBvZiBzdHJlYW1zIGN1cnJlbnRseSBhY3RpdmUgZm9yIHRoaXMgcHJvZmlsZS4gVGhpcyBpcyBub3QgdGhlIG51bWJlciBvZiBhY3RpdmUgY2xpZW50cworICAgIC8vIChBdWRpb1RyYWNrIG9yIEF1ZGlvUmVjb3JkKSBidXQgdGhlIG51bWJlciBvZiBhY3RpdmUgSEFMIHN0cmVhbXMuCisgICAgdWludDMyX3QgICAgIGN1ckFjdGl2ZUNvdW50OworCiBwcml2YXRlOgogICAgIERldmljZVZlY3RvciBtU3VwcG9ydGVkRGV2aWNlczsgLy8gc3VwcG9ydGVkIGRldmljZXM6IHRoaXMgaW5wdXQvb3V0cHV0IGNhbiBiZSByb3V0ZWQgZnJvbS90bwogfTsKQEAgLTExOSw0ICsxNjcsNCBAQAogICAgIGV4cGxpY2l0IE91dHB1dFByb2ZpbGUoY29uc3QgU3RyaW5nOCAmbmFtZSkgOiBJT1Byb2ZpbGUobmFtZSwgQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkge30KIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24uaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JVm9sdW1lQ3VydmVzQ29sbGVjdGlvbi5oCmluZGV4IGEzZGU2ODYuLmUxZjZiMDggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JVm9sdW1lQ3VydmVzQ29sbGVjdGlvbi5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JVm9sdW1lQ3VydmVzQ29sbGVjdGlvbi5oCkBAIC0yNSw2ICsyNSw4IEBACiBjbGFzcyBJVm9sdW1lQ3VydmVzQ29sbGVjdGlvbgogewogcHVibGljOgorICAgIHZpcnR1YWwgfklWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uKCkgPSBkZWZhdWx0OworCiAgICAgdmlydHVhbCB2b2lkIGNsZWFyQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIGFkZEN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgPSAwOwpAQCAtNDYsOSArNDgsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdCA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdCA9IDA7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5JVm9sdW1lQ3VydmVzQ29sbGVjdGlvbigpIHt9CiB9OwogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1NlcmlhbGl6ZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXJpYWxpemVyLmgKaW5kZXggMDc4YjU4Mi4uMjlkZTg0OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1NlcmlhbGl6ZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2VyaWFsaXplci5oCkBAIC05Miw2ICs5Miw4IEBACiAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG5hbWVbXTsKICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgcm9sZVtdOwogICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBmbGFnc1tdOworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtYXhPcGVuQ291bnRbXTsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbWF4QWN0aXZlQ291bnRbXTsKICAgICB9OwogCiAgICAgdHlwZWRlZiBJT1Byb2ZpbGUgRWxlbWVudDsKQEAgLTIzNCw0ICsyMzYsNCBAQAogICAgIC8vIENoaWxkcmVuIGFyZTogTW9kdWxlc1RyYWl0cywgVm9sdW1lVHJhaXRzCiB9OwogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1Nlc3Npb25Sb3V0ZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1Nlc3Npb25Sb3V0ZS5oCmluZGV4IDc1YmZkOWQuLmZhYzZjYmUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXNzaW9uUm91dGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2Vzc2lvblJvdXRlLmgKQEAgLTU0LDcgKzU0LDcgQEAKIAogICAgIHZvaWQgbG9nKGNvbnN0IGNoYXIqIHByZWZpeCk7CiAKLSAgICBib29sIGlzQWN0aXZlKCkgeworICAgIGJvb2wgaXNBY3RpdmVPckNoYW5nZWQoKSB7CiAgICAgICAgIHJldHVybiAobURldmljZURlc2NyaXB0b3IgIT0gMCkgJiYgKG1DaGFuZ2VkIHx8IChtQWN0aXZpdHlDb3VudCA+IDApKTsKICAgICB9CiAKQEAgLTk2LDcgKzk2LDcgQEAKIAogICAgIGludCBpbmNSb3V0ZUFjdGl2aXR5KGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKICAgICBpbnQgZGVjUm91dGVBY3Rpdml0eShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgYm9vbCBoYXNSb3V0ZUNoYW5nZWQoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOyAvLyBhbHNvIGNsZWFycyB0aGUgY2hhbmdlZCBmbGFnCisgICAgYm9vbCBnZXRBbmRDbGVhclJvdXRlQ2hhbmdlZChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7IC8vIGFsc28gY2xlYXJzIHRoZSBjaGFuZ2VkIGZsYWcKICAgICB2b2lkIGxvZyhjb25zdCBjaGFyKiBjYXB0aW9uKTsKIAogICAgIC8vIFNwZWNpZnkgYW4gT3V0cHV0KFNpbmspIHJvdXRlIGJ5IHBhc3NpbmcgU2Vzc2lvblJvdXRlOjpTT1VSQ0VfVFlQRV9OQSBpbiB0aGUKQEAgLTExNSw0ICsxMTUsNCBAQAogICAgIGNvbnN0IHNlc3Npb25fcm91dGVfbWFwX3R5cGVfdCBtTWFwVHlwZTsKIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU291bmRUcmlnZ2VyU2Vzc2lvbi5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1NvdW5kVHJpZ2dlclNlc3Npb24uaAppbmRleCA0MjBlNmQ3Li5mODk1NTk5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU291bmRUcmlnZ2VyU2Vzc2lvbi5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Tb3VuZFRyaWdnZXJTZXNzaW9uLmgKQEAgLTMwLDQgKzMwLDQgQEAKICAgICBzdGF0dXNfdCBhY3F1aXJlU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpOwogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TdHJlYW1EZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU3RyZWFtRGVzY3JpcHRvci5oCmluZGV4IDg4MjI5MjcuLjUwYjEwMzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TdHJlYW1EZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1N0cmVhbURlc2NyaXB0b3IuaApAQCAtMTA3LDQgKzEwNyw0IEBACiAgICAgdm9pZCBzZXRWb2x1bWVJbmRleE1heChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSxpbnQgdm9sSW5kZXhNYXgpOwogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9UeXBlQ29udmVydGVyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVHlwZUNvbnZlcnRlci5oCmluZGV4IGZjOTVlYjkuLjYzYzE5ZDEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9UeXBlQ29udmVydGVyLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1R5cGVDb252ZXJ0ZXIuaApAQCAtNTgsNCArNTgsNCBAQAogdGVtcGxhdGUgPD4KIGNvbnN0IFJ1bGVUeXBlQ29udmVydGVyOjpUYWJsZSBSdWxlVHlwZUNvbnZlcnRlcjo6bVRhYmxlW107CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVm9sdW1lQ3VydmUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Wb2x1bWVDdXJ2ZS5oCmluZGV4IGU3ZmNlZmMuLjNlNmIyYjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Wb2x1bWVDdXJ2ZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Wb2x1bWVDdXJ2ZS5oCkBAIC0xMzUsNyArMTM1LDEzIEBACiAKICAgICBmbG9hdCB2b2xJbmRleFRvRGIoZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdCwgaW50IGluZGV4SW5VaSkgY29uc3QKICAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDdXJ2ZXNGb3IoZGV2aWNlQ2F0KS0+dm9sSW5kZXhUb0RiKGluZGV4SW5VaSwgbUluZGV4TWluLCBtSW5kZXhNYXgpOworICAgICAgICBzcDxWb2x1bWVDdXJ2ZT4gdmMgPSBnZXRDdXJ2ZXNGb3IoZGV2aWNlQ2F0KTsKKyAgICAgICAgaWYgKHZjICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiB2Yy0+dm9sSW5kZXhUb0RiKGluZGV4SW5VaSwgbUluZGV4TWluLCBtSW5kZXhNYXgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgZGV2aWNlIGNhdGVnb3J5ICVkIGZvciBWb2x1bWUgQ3VydmUiLCBkZXZpY2VDYXQpOworICAgICAgICAgICAgcmV0dXJuIDAuMGY7CisgICAgICAgIH0KICAgICB9CiAKICAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBib29sIGN1cnZlUG9pbnRzID0gZmFsc2UpIGNvbnN0OwpAQCAtMjMwLDQgKzIzNiw0IEBACiAgICAgfQogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvQ29sbGVjdGlvbnMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAKaW5kZXggNjM1ZmU0ZC4uY2E2N2I4NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAKQEAgLTI3LDE0ICsyNywxMiBAQAogCiBzcDxBdWRpb1BvcnQ+IEF1ZGlvUG9ydFZlY3Rvcjo6ZmluZEJ5VGFnTmFtZShjb25zdCBTdHJpbmc4ICZ0YWdOYW1lKSBjb25zdAogewotICAgIHNwPEF1ZGlvUG9ydD4gcG9ydCA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbUF0KGkpLT5nZXRUYWdOYW1lKCkgPT0gdGFnTmFtZSkgewotICAgICAgICAgICAgcG9ydCA9IGl0ZW1BdChpKTsKLSAgICAgICAgICAgIGJyZWFrOworICAgIGZvciAoY29uc3QgYXV0byYgcG9ydCA6ICp0aGlzKSB7CisgICAgICAgIGlmIChwb3J0LT5nZXRUYWdOYW1lKCkgPT0gdGFnTmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIHBvcnQ7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHBvcnQ7CisgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKIHN0YXR1c190IEF1ZGlvUm91dGVWZWN0b3I6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdApAQCAtNTUsNCArNTMsNCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvR2Fpbi5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0dhaW4uY3BwCmluZGV4IGU0NTQ5NDEuLjE5M2Q0YTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvR2Fpbi5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9HYWluLmNwcApAQCAtMTI2LDQgKzEyNiw0IEBACiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAKaW5kZXggMjQ5MmVkNi4uOTIzMzJmYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcApAQCAtMTcsNiArMTcsNyBAQAogI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvSW5wdXREZXNjcmlwdG9yIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lJbnRlcmZhY2UuaD4KICNpbmNsdWRlICJBdWRpb0lucHV0RGVzY3JpcHRvci5oIgogI2luY2x1ZGUgIklPUHJvZmlsZS5oIgogI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgpAQCAtMjYsMTAgKzI3LDEyIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotQXVkaW9JbnB1dERlc2NyaXB0b3I6OkF1ZGlvSW5wdXREZXNjcmlwdG9yKGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUpCitBdWRpb0lucHV0RGVzY3JpcHRvcjo6QXVkaW9JbnB1dERlc2NyaXB0b3IoY29uc3Qgc3A8SU9Qcm9maWxlPiYgcHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQogICAgIDogbUlvSGFuZGxlKDApLAogICAgICAgbURldmljZShBVURJT19ERVZJQ0VfTk9ORSksIG1Qb2xpY3lNaXgoTlVMTCksCi0gICAgICBtUHJvZmlsZShwcm9maWxlKSwgbVBhdGNoSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSwgbUlkKDApCisgICAgICBtUHJvZmlsZShwcm9maWxlKSwgbVBhdGNoSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSwgbUlkKDApLAorICAgICAgbUNsaWVudEludGVyZmFjZShjbGllbnRJbnRlcmZhY2UpCiB7CiAgICAgaWYgKHByb2ZpbGUgIT0gTlVMTCkgewogICAgICAgICBwcm9maWxlLT5waWNrQXVkaW9Qcm9maWxlKG1TYW1wbGluZ1JhdGUsIG1DaGFubmVsTWFzaywgbUZvcm1hdCk7CkBAIC0zOSwxMiArNDIsNiBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6c2V0SW9IYW5kbGUoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpCi17Ci0gICAgbUlkID0gQXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKTsKLSAgICBtSW9IYW5kbGUgPSBpb0hhbmRsZTsKLX0KLQogYXVkaW9fbW9kdWxlX2hhbmRsZV90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRNb2R1bGVIYW5kbGUoKSBjb25zdAogewogICAgIGlmIChtUHJvZmlsZSA9PSAwKSB7CkBAIC0xOTIsNiArMTg5LDkzIEBACiAgICAgcmV0dXJuIGNvbmZpZzsKIH0KIAorc3RhdHVzX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6Om9wZW4oY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCkKK3sKKyAgICBhdWRpb19jb25maWdfdCBsQ29uZmlnOworICAgIGlmIChjb25maWcgPT0gbnVsbHB0cikgeworICAgICAgICBsQ29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgICAgICBsQ29uZmlnLnNhbXBsZV9yYXRlID0gbVNhbXBsaW5nUmF0ZTsKKyAgICAgICAgbENvbmZpZy5jaGFubmVsX21hc2sgPSBtQ2hhbm5lbE1hc2s7CisgICAgICAgIGxDb25maWcuZm9ybWF0ID0gbUZvcm1hdDsKKyAgICB9IGVsc2UgeworICAgICAgICBsQ29uZmlnID0gKmNvbmZpZzsKKyAgICB9CisKKyAgICBtRGV2aWNlID0gZGV2aWNlOworCisgICAgQUxPR1YoIm9wZW5pbmcgaW5wdXQgZm9yIGRldmljZSAlMDh4IGFkZHJlc3MgJXMgcHJvZmlsZSAlcCBuYW1lICVzIiwKKyAgICAgICAgICBtRGV2aWNlLCBhZGRyZXNzLnN0cmluZygpLCBtUHJvZmlsZS5nZXQoKSwgbVByb2ZpbGUtPmdldE5hbWUoKS5zdHJpbmcoKSk7CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQ2xpZW50SW50ZXJmYWNlLT5vcGVuSW5wdXQobVByb2ZpbGUtPmdldE1vZHVsZUhhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1EZXZpY2UgIT0gZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzIG9wZW5JbnB1dCByZXR1cm5lZCBkZXZpY2UgJTA4eCB3aGVuIGdpdmVuIGRldmljZSAlMDh4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbURldmljZSwgZGV2aWNlKTsKKworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigqaW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIG9wZW5JbnB1dCByZXR1cm5lZCBpbnB1dCBoYW5kbGUgJWQgZm9yIGRldmljZSAlMDh4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICppbnB1dCwgZGV2aWNlKTsKKyAgICAgICAgbVNhbXBsaW5nUmF0ZSA9IGxDb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgIG1DaGFubmVsTWFzayA9IGxDb25maWcuY2hhbm5lbF9tYXNrOworICAgICAgICBtRm9ybWF0ID0gbENvbmZpZy5mb3JtYXQ7CisgICAgICAgIG1JZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7CisgICAgICAgIG1Jb0hhbmRsZSA9ICppbnB1dDsKKyAgICAgICAgbVByb2ZpbGUtPmN1ck9wZW5Db3VudCsrOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpzdGFydCgpCit7CisgICAgaWYgKGdldEF1ZGlvU2Vzc2lvbkNvdW50KHRydWUvKmFjdGl2ZU9ubHkqLykgPT0gMSkgeworICAgICAgICBpZiAoIW1Qcm9maWxlLT5jYW5TdGFydE5ld0lvKCkpIHsKKyAgICAgICAgICAgIEFMT0dJKCIlcyBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQgJWQiLCBfX2Z1bmNfXywgbVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50KTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQrKzsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpzdG9wKCkKK3sKKyAgICBpZiAoIWlzQWN0aXZlKCkpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQgPCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBpbnZhbGlkIHByb2ZpbGUgYWN0aXZlIGNvdW50ICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50KTsKKyAgICAgICAgbVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50LS07CisgICAgfQorfQorCit2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpjbG9zZSgpCit7CisgICAgaWYgKG1Jb0hhbmRsZSAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KG1Jb0hhbmRsZSk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVByb2ZpbGUtPmN1ck9wZW5Db3VudCA8IDEsICIlcyBwcm9maWxlIG9wZW4gY291bnQgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb2ZpbGUtPmN1ck9wZW5Db3VudCk7CisgICAgICAgIC8vIGRvIG5vdCBjYWxsIHN0b3AoKSBoZXJlIGFzIHN0b3AoKSBpcyBzdXBwb3NlZCB0byBiZSBjYWxsZWQgYWZ0ZXIKKyAgICAgICAgLy8gQXVkaW9TZXNzaW9uOjpjaGFuZ2VBY3RpdmVDb3VudCgtMSkgYW5kIHdlIGRvbid0IGtub3cgaG93IG1hbnkgc2Vzc2lvbnMKKyAgICAgICAgLy8gYXJlIHN0aWxsIGFjdGl2ZSBhdCB0aGlzIHRpbWUKKyAgICAgICAgaWYgKGlzQWN0aXZlKCkpIHsKKyAgICAgICAgICAgIG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudC0tOworICAgICAgICB9CisgICAgICAgIG1Qcm9maWxlLT5jdXJPcGVuQ291bnQtLTsKKyAgICAgICAgbUlvSGFuZGxlID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgfQorfQorCiBzdGF0dXNfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcAppbmRleCA4NTkzNDQ0Li4yOTRhMmE2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlICJBdWRpb0dhaW4uaCIKICNpbmNsdWRlICJWb2x1bWUuaCIKICNpbmNsdWRlICJId01vZHVsZS5oIgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KIAogLy8gQSBkZXZpY2UgbWFzayBmb3IgYWxsIGF1ZGlvIG91dHB1dCBkZXZpY2VzIHRoYXQgYXJlIGNvbnNpZGVyZWQgInJlbW90ZSIgd2hlbiBldmFsdWF0aW5nCkBAIC00NiwxNyArNDcsMTcgQEAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9TVFJBVEVHSUVTOyBpKyspIHsKICAgICAgICAgbVN0cmF0ZWd5TXV0ZWRCeURldmljZVtpXSA9IGZhbHNlOwogICAgIH0KLSAgICBpZiAocG9ydCAhPSBOVUxMKSB7Ci0gICAgICAgIHBvcnQtPnBpY2tBdWRpb1Byb2ZpbGUobVNhbXBsaW5nUmF0ZSwgbUNoYW5uZWxNYXNrLCBtRm9ybWF0KTsKLSAgICAgICAgaWYgKHBvcnQtPm1HYWlucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBwb3J0LT5tR2FpbnNbMF0tPmdldERlZmF1bHRDb25maWcoJm1HYWluKTsKKyAgICBpZiAobVBvcnQuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBtUG9ydC0+cGlja0F1ZGlvUHJvZmlsZShtU2FtcGxpbmdSYXRlLCBtQ2hhbm5lbE1hc2ssIG1Gb3JtYXQpOworICAgICAgICBpZiAobVBvcnQtPm1HYWlucy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBtUG9ydC0+bUdhaW5zWzBdLT5nZXREZWZhdWx0Q29uZmlnKCZtR2Fpbik7CiAgICAgICAgIH0KICAgICB9CiB9CiAKIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmdldE1vZHVsZUhhbmRsZSgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1Qb3J0LT5nZXRNb2R1bGVIYW5kbGUoKTsKKyAgICByZXR1cm4gbVBvcnQuZ2V0KCkgIT0gbnVsbHB0ciA/IG1Qb3J0LT5nZXRNb2R1bGVIYW5kbGUoKSA6IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORTsKIH0KIAogYXVkaW9fcG9ydF9oYW5kbGVfdCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmdldElkKCkgY29uc3QKQEAgLTE3NSw5ICsxNzYsOSBAQAogICAgIGRzdENvbmZpZy0+ZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOwogfQogCi12b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0Cit2b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0CiB7CisgICAgLy8gU2hvdWxkIG5vdCBiZSBjYWxsZWQgZm9yIGR1cGxpY2F0ZWQgcG9ydHMsIHNlZSBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnRDb25maWcuCiAgICAgbVBvcnQtPnRvQXVkaW9Qb3J0KHBvcnQpOwogICAgIHBvcnQtPmlkID0gbUlkOwogICAgIHBvcnQtPmV4dC5taXguaHdfbW9kdWxlID0gZ2V0TW9kdWxlSGFuZGxlKCk7CkBAIC0yMjEsNyArMjIyLDcgQEAKIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxJT1Byb2ZpbGU+JiBwcm9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCiAgICAgOiBBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSwgY2xpZW50SW50ZXJmYWNlKSwKLSAgICBtUHJvZmlsZShwcm9maWxlKSwgbUlvSGFuZGxlKDApLCBtTGF0ZW5jeSgwKSwKKyAgICBtUHJvZmlsZShwcm9maWxlKSwgbUlvSGFuZGxlKEFVRElPX0lPX0hBTkRMRV9OT05FKSwgbUxhdGVuY3koMCksCiAgICAgbUZsYWdzKChhdWRpb19vdXRwdXRfZmxhZ3NfdCkwKSwgbVBvbGljeU1peChOVUxMKSwKICAgICBtT3V0cHV0MSgwKSwgbU91dHB1dDIoMCksIG1EaXJlY3RPcGVuQ291bnQoMCksCiAgICAgbURpcmVjdENsaWVudFNlc3Npb24oQVVESU9fU0VTU0lPTl9OT05FKSwgbUdsb2JhbFJlZkNvdW50KDApCkBAIC0yMzEsMTMgKzIzMiw2IEBACiAgICAgfQogfQogCi12b2lkIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRJb0hhbmRsZShhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkKLXsKLSAgICBtSWQgPSBBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpOwotICAgIG1Jb0hhbmRsZSA9IGlvSGFuZGxlOwotfQotCi0KIHN0YXR1c190IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKIHsKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKQEAgLTMzOSw2ICszMzMsMTAgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQorICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgpIHsKKyAgICAgICAgQUxPR1YoIm1heCBnYWluIHdoZW4gb3V0cHV0IGRldmljZSBpcyB0ZWxlcGhvbnkgdHgiKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogICAgIHJldHVybiBmYWxzZTsKIH0KIApAQCAtMzg3LDYgKzM4NSwxNTQgQEAKICAgICByZXR1cm4gY2hhbmdlZDsKIH0KIAorc3RhdHVzX3QgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6Om9wZW4oY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQpCit7CisgICAgYXVkaW9fY29uZmlnX3QgbENvbmZpZzsKKyAgICBpZiAoY29uZmlnID09IG51bGxwdHIpIHsKKyAgICAgICAgbENvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICAgICAgbENvbmZpZy5zYW1wbGVfcmF0ZSA9IG1TYW1wbGluZ1JhdGU7CisgICAgICAgIGxDb25maWcuY2hhbm5lbF9tYXNrID0gbUNoYW5uZWxNYXNrOworICAgICAgICBsQ29uZmlnLmZvcm1hdCA9IG1Gb3JtYXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbENvbmZpZyA9ICpjb25maWc7CisgICAgfQorCisgICAgbURldmljZSA9IGRldmljZTsKKyAgICAvLyBpZiB0aGUgc2VsZWN0ZWQgcHJvZmlsZSBpcyBvZmZsb2FkZWQgYW5kIG5vIG9mZmxvYWQgaW5mbyB3YXMgc3BlY2lmaWVkLAorICAgIC8vIGNyZWF0ZSBhIGRlZmF1bHQgb25lCisgICAgaWYgKChtUHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICYmCisgICAgICAgICAgICBsQ29uZmlnLm9mZmxvYWRfaW5mby5mb3JtYXQgPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCk7CisgICAgICAgIGxDb25maWcub2ZmbG9hZF9pbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKKyAgICAgICAgbENvbmZpZy5vZmZsb2FkX2luZm8uc2FtcGxlX3JhdGUgPSBsQ29uZmlnLnNhbXBsZV9yYXRlOworICAgICAgICBsQ29uZmlnLm9mZmxvYWRfaW5mby5jaGFubmVsX21hc2sgPSBsQ29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICAgICAgbENvbmZpZy5vZmZsb2FkX2luZm8uZm9ybWF0ID0gbENvbmZpZy5mb3JtYXQ7CisgICAgICAgIGxDb25maWcub2ZmbG9hZF9pbmZvLnN0cmVhbV90eXBlID0gc3RyZWFtOworICAgICAgICBsQ29uZmlnLm9mZmxvYWRfaW5mby5kdXJhdGlvbl91cyA9IC0xOworICAgICAgICBsQ29uZmlnLm9mZmxvYWRfaW5mby5oYXNfdmlkZW8gPSB0cnVlOyAvLyBjb25zZXJ2YXRpdmUKKyAgICAgICAgbENvbmZpZy5vZmZsb2FkX2luZm8uaXNfc3RyZWFtaW5nID0gdHJ1ZTsgLy8gbGlrZWx5CisgICAgfQorCisgICAgbUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShtRmxhZ3MgfCBmbGFncyk7CisKKyAgICBBTE9HVigib3BlbmluZyBvdXRwdXQgZm9yIGRldmljZSAlMDh4IGFkZHJlc3MgJXMgcHJvZmlsZSAlcCBuYW1lICVzIiwKKyAgICAgICAgICBtRGV2aWNlLCBhZGRyZXNzLnN0cmluZygpLCBtUHJvZmlsZS5nZXQoKSwgbVByb2ZpbGUtPmdldE5hbWUoKS5zdHJpbmcoKSk7CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KG1Qcm9maWxlLT5nZXRNb2R1bGVIYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1MYXRlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1EZXZpY2UgIT0gZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzIG9wZW5PdXRwdXQgcmV0dXJuZWQgZGV2aWNlICUwOHggd2hlbiBnaXZlbiBkZXZpY2UgJTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1EZXZpY2UsIGRldmljZSk7CisKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKm91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgb3Blbk91dHB1dCByZXR1cm5lZCBvdXRwdXQgaGFuZGxlICVkIGZvciBkZXZpY2UgJTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAqb3V0cHV0LCBkZXZpY2UpOworICAgICAgICBtU2FtcGxpbmdSYXRlID0gbENvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAgICAgbUNoYW5uZWxNYXNrID0gbENvbmZpZy5jaGFubmVsX21hc2s7CisgICAgICAgIG1Gb3JtYXQgPSBsQ29uZmlnLmZvcm1hdDsKKyAgICAgICAgbUlkID0gQXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKTsKKyAgICAgICAgbUlvSGFuZGxlID0gKm91dHB1dDsKKyAgICAgICAgbVByb2ZpbGUtPmN1ck9wZW5Db3VudCsrOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzdGFydCgpCit7CisgICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1PdXRwdXQxLT5zdGFydCgpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQyLT5zdGFydCgpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBtT3V0cHV0MS0+c3RvcCgpOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIGlmICghaXNBY3RpdmUoKSkgeworICAgICAgICBpZiAoIW1Qcm9maWxlLT5jYW5TdGFydE5ld0lvKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQrKzsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzdG9wKCkKK3sKKyAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgbU91dHB1dDEtPnN0b3AoKTsKKyAgICAgICAgbU91dHB1dDItPnN0b3AoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghaXNBY3RpdmUoKSkgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCA8IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGludmFsaWQgcHJvZmlsZSBhY3RpdmUgY291bnQgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQpOworICAgICAgICBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQtLTsKKyAgICB9Cit9CisKK3ZvaWQgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmNsb3NlKCkKK3sKKyAgICBpZiAobUlvSGFuZGxlICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOworICAgICAgICBwYXJhbS5hZGQoU3RyaW5nOCgiY2xvc2luZyIpLCBTdHJpbmc4KCJ0cnVlIikpOworICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1Jb0hhbmRsZSwgcGFyYW0udG9TdHJpbmcoKSk7CisKKyAgICAgICAgbUNsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQobUlvSGFuZGxlKTsKKworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1Qcm9maWxlLT5jdXJPcGVuQ291bnQgPCAxLCAiJXMgcHJvZmlsZSBvcGVuIGNvdW50ICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm9maWxlLT5jdXJPcGVuQ291bnQpOworICAgICAgICAvLyBkbyBub3QgY2FsbCBzdG9wKCkgaGVyZSBhcyBzdG9wKCkgaXMgc3VwcG9zZWQgdG8gYmUgY2FsbGVkIGFmdGVyIGNoYW5nZVJlZkNvdW50KC0xKQorICAgICAgICAvLyBhbmQgd2UgZG9uJ3Qga25vdyBob3cgbWFueSBzdHJlYW1zIGFyZSBzdGlsbCBhY3RpdmUgYXQgdGhpcyB0aW1lCisgICAgICAgIGlmIChpc0FjdGl2ZSgpKSB7CisgICAgICAgICAgICBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQtLTsKKyAgICAgICAgfQorICAgICAgICBtUHJvZmlsZS0+Y3VyT3BlbkNvdW50LS07CisgICAgICAgIG1Jb0hhbmRsZSA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIH0KK30KKworc3RhdHVzX3QgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6Om9wZW5EdXBsaWNhdGluZyhjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlKQoreworICAgIC8vIG9wZW4gYSBkdXBsaWNhdGluZyBvdXRwdXQgdGhyZWFkIGZvciB0aGUgbmV3IG91dHB1dCBhbmQgdGhlIHByaW1hcnkgb3V0cHV0CisgICAgLy8gTm90ZTogb3BlbkR1cGxpY2F0ZU91dHB1dCgpIEFQSSBleHBlY3RzIHRoZSBvdXRwdXQgaGFuZGxlcyBpbiB0aGUgcmV2ZXJzZSBvcmRlciBmcm9tIHRoZQorICAgIC8vIG51bWJlcmluZyBpbiBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvciBtT3V0cHV0MSBhbmQgbU91dHB1dDIKKyAgICAqaW9IYW5kbGUgPSBtQ2xpZW50SW50ZXJmYWNlLT5vcGVuRHVwbGljYXRlT3V0cHV0KG91dHB1dDItPm1Jb0hhbmRsZSwgb3V0cHV0MS0+bUlvSGFuZGxlKTsKKyAgICBpZiAoKmlvSGFuZGxlID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBtSWQgPSBBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpOworICAgIG1Jb0hhbmRsZSA9ICppb0hhbmRsZTsKKyAgICBtT3V0cHV0MSA9IG91dHB1dDE7CisgICAgbU91dHB1dDIgPSBvdXRwdXQyOworICAgIG1TYW1wbGluZ1JhdGUgPSBvdXRwdXQyLT5tU2FtcGxpbmdSYXRlOworICAgIG1Gb3JtYXQgPSBvdXRwdXQyLT5tRm9ybWF0OworICAgIG1DaGFubmVsTWFzayA9IG91dHB1dDItPm1DaGFubmVsTWFzazsKKyAgICBtTGF0ZW5jeSA9IG91dHB1dDItPm1MYXRlbmN5OworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCiAvLyBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvciBpbXBsZW1lbnRhdGlvbgogSHdBdWRpb091dHB1dERlc2NyaXB0b3I6Okh3QXVkaW9PdXRwdXREZXNjcmlwdG9yKGNvbnN0IHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4mIHNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQpAQCAtNDU3LDYgKzYwMywxOSBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAorYm9vbCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6aXNTdHJlYW1BY3RpdmVMb2NhbGx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKK3sKKyAgICBuc2Vjc190IHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0aGlzLT5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHRoaXMtPnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc1N0cmVhbUFjdGl2ZShzdHJlYW0sIGluUGFzdE1zLCBzeXNUaW1lKQorICAgICAgICAgICAgICAgICYmICgob3V0cHV0RGVzYy0+ZGV2aWNlKCkgJiBBUE1fQVVESU9fT1VUX0RFVklDRV9SRU1PVEVfQUxMKSA9PSAwKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCiBib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0CiB7CkBAIC00ODYsNiArNjQ1LDI5IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK2Jvb2wgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmlzQTJkcE9mZmxvYWRlZE9uUHJpbWFyeSgpIGNvbnN0Cit7CisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHByaW1hcnlPdXRwdXQgPSBnZXRQcmltYXJ5T3V0cHV0KCk7CisKKyAgICBpZiAoKHByaW1hcnlPdXRwdXQgIT0gTlVMTCkgJiYgKHByaW1hcnlPdXRwdXQtPm1Qcm9maWxlICE9IE5VTEwpCisgICAgICAgICYmIChwcmltYXJ5T3V0cHV0LT5tUHJvZmlsZS0+bU1vZHVsZSAhPSBOVUxMKSkgeworICAgICAgICBzcDxId01vZHVsZT4gcHJpbWFyeUh3TW9kdWxlID0gcHJpbWFyeU91dHB1dC0+bVByb2ZpbGUtPm1Nb2R1bGU7CisgICAgICAgIFZlY3RvciA8c3A8SU9Qcm9maWxlPj4gcHJpbWFyeUh3TW9kdWxlT3V0cHV0UHJvZmlsZXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5SHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJpbWFyeUh3TW9kdWxlT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChwcmltYXJ5SHdNb2R1bGVPdXRwdXRQcm9maWxlc1tpXS0+c3VwcG9ydERldmljZShBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6aXNBMmRwU3VwcG9ydGVkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gKGlzQTJkcE9mZmxvYWRlZE9uUHJpbWFyeSgpIHx8IChnZXRBMmRwT3V0cHV0KCkgIT0gMCkpOworfQorCiBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmdldFByaW1hcnlPdXRwdXQoKSBjb25zdAogewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUGF0Y2guY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9QYXRjaC5jcHAKaW5kZXggMzI2MDZlYS4uYTlmZTQ4ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9QYXRjaC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9QYXRjaC5jcHAKQEAgLTIyLDE1ICsyMiwxMiBAQAogI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKIAogI2luY2x1ZGUgPGxvZy9sb2cuaD4KLSNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWludDMyX3Qgdm9sYXRpbGUgQXVkaW9QYXRjaDo6bU5leHRVbmlxdWVJZCA9IDE7Ci0KIEF1ZGlvUGF0Y2g6OkF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwgdWlkX3QgdWlkKSA6Ci0gICAgbUhhbmRsZShzdGF0aWNfY2FzdDxhdWRpb19wYXRjaF9oYW5kbGVfdD4oYW5kcm9pZF9hdG9taWNfaW5jKCZtTmV4dFVuaXF1ZUlkKSkpLAorICAgIG1IYW5kbGUoSGFuZGxlR2VuZXJhdG9yPGF1ZGlvX3BhdGNoX2hhbmRsZV90Pjo6Z2V0TmV4dEhhbmRsZSgpKSwKICAgICBtUGF0Y2goKnBhdGNoKSwKICAgICBtVWlkKHVpZCksCiAgICAgbUFmUGF0Y2hIYW5kbGUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUpCkBAIC0xNzYsNCArMTczLDQgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvcnQuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb3J0LmNwcAppbmRleCBjZGFmZmU3Li5kODU1NjJlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvcnQuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9ydC5jcHAKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlICJId01vZHVsZS5oIgogI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgogI2luY2x1ZGUgPHBvbGljeS5oPgotI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KIAogI2lmbmRlZiBBUlJBWV9TSVpFCiAjZGVmaW5lIEFSUkFZX1NJWkUoYSkgKHNpemVvZihhKSAvIHNpemVvZigoYSlbMF0pKQpAQCAtMjksOCArMjgsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWludDMyX3Qgdm9sYXRpbGUgQXVkaW9Qb3J0OjptTmV4dFVuaXF1ZUlkID0gMTsKLQogLy8gLS0tIEF1ZGlvUG9ydCBjbGFzcyBpbXBsZW1lbnRhdGlvbgogdm9pZCBBdWRpb1BvcnQ6OmF0dGFjaChjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSkKIHsKQEAgLTQwLDMxICszNywyMiBAQAogLy8gTm90ZSB0aGF0IGlzIGEgZGlmZmVyZW50IG5hbWVzcGFjZSB0aGFuIEF1ZGlvRmxpbmdlciB1bmlxdWUgSURzCiBhdWRpb19wb3J0X2hhbmRsZV90IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCkKIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YXVkaW9fcG9ydF9oYW5kbGVfdD4oYW5kcm9pZF9hdG9taWNfaW5jKCZtTmV4dFVuaXF1ZUlkKSk7CisgICAgcmV0dXJuIGdldE5leHRIYW5kbGUoKTsKIH0KIAogYXVkaW9fbW9kdWxlX2hhbmRsZV90IEF1ZGlvUG9ydDo6Z2V0TW9kdWxlSGFuZGxlKCkgY29uc3QKIHsKLSAgICBpZiAobU1vZHVsZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19NT0RVTEVfSEFORExFX05PTkU7Ci0gICAgfQotICAgIHJldHVybiBtTW9kdWxlLT5tSGFuZGxlOworICAgIHJldHVybiBtTW9kdWxlICE9IDAgPyBtTW9kdWxlLT5nZXRIYW5kbGUoKSA6IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORTsKIH0KIAogdWludDMyX3QgQXVkaW9Qb3J0OjpnZXRNb2R1bGVWZXJzaW9uTWFqb3IoKSBjb25zdAogewotICAgIGlmIChtTW9kdWxlID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBtTW9kdWxlLT5nZXRIYWxWZXJzaW9uTWFqb3IoKTsKKyAgICByZXR1cm4gbU1vZHVsZSAhPSAwID8gbU1vZHVsZS0+Z2V0SGFsVmVyc2lvbk1ham9yKCkgOiAwOwogfQogCiBjb25zdCBjaGFyICpBdWRpb1BvcnQ6OmdldE1vZHVsZU5hbWUoKSBjb25zdAogewotICAgIGlmIChtTW9kdWxlID09IDApIHsKLSAgICAgICAgcmV0dXJuICJpbnZhbGlkIG1vZHVsZSI7Ci0gICAgfQotICAgIHJldHVybiBtTW9kdWxlLT5nZXROYW1lKCk7CisgICAgcmV0dXJuIG1Nb2R1bGUgIT0gMCA/IG1Nb2R1bGUtPmdldE5hbWUoKSA6ICJpbnZhbGlkIG1vZHVsZSI7CiB9CiAKIHZvaWQgQXVkaW9Qb3J0Ojp0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3QKQEAgLTc0LDExICs2MiwxMSBAQAogICAgIFNvcnRlZFZlY3RvcjxhdWRpb19mb3JtYXRfdD4gZmxhdGVuZWRGb3JtYXRzOwogICAgIFNhbXBsZVJhdGVWZWN0b3IgZmxhdGVuZWRSYXRlczsKICAgICBDaGFubmVsc1ZlY3RvciBmbGF0ZW5lZENoYW5uZWxzOwotICAgIGZvciAoc2l6ZV90IHByb2ZpbGVJbmRleCA9IDA7IHByb2ZpbGVJbmRleCA8IG1Qcm9maWxlcy5zaXplKCk7IHByb2ZpbGVJbmRleCsrKSB7Ci0gICAgICAgIGlmIChtUHJvZmlsZXNbcHJvZmlsZUluZGV4XS0+aXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXRUb0V4cG9ydCA9IG1Qcm9maWxlc1twcm9maWxlSW5kZXhdLT5nZXRGb3JtYXQoKTsKLSAgICAgICAgICAgIGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnJhdGVzVG9FeHBvcnQgPSBtUHJvZmlsZXNbcHJvZmlsZUluZGV4XS0+Z2V0U2FtcGxlUmF0ZXMoKTsKLSAgICAgICAgICAgIGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsc1RvRXhwb3J0ID0gbVByb2ZpbGVzW3Byb2ZpbGVJbmRleF0tPmdldENoYW5uZWxzKCk7CisgICAgZm9yIChjb25zdCBhdXRvJiBwcm9maWxlIDogbVByb2ZpbGVzKSB7CisgICAgICAgIGlmIChwcm9maWxlLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdFRvRXhwb3J0ID0gcHJvZmlsZS0+Z2V0Rm9ybWF0KCk7CisgICAgICAgICAgICBjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZyYXRlc1RvRXhwb3J0ID0gcHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKTsKKyAgICAgICAgICAgIGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsc1RvRXhwb3J0ID0gcHJvZmlsZS0+Z2V0Q2hhbm5lbHMoKTsKIAogICAgICAgICAgICAgaWYgKGZsYXRlbmVkRm9ybWF0cy5pbmRleE9mKGZvcm1hdFRvRXhwb3J0KSA8IDApIHsKICAgICAgICAgICAgICAgICBmbGF0ZW5lZEZvcm1hdHMuYWRkKGZvcm1hdFRvRXhwb3J0KTsKQEAgLTEzMCwxNCArMTE4LDEyIEBACiAKIHZvaWQgQXVkaW9Qb3J0OjppbXBvcnRBdWRpb1BvcnQoY29uc3Qgc3A8QXVkaW9Qb3J0PiYgcG9ydCwgYm9vbCBmb3JjZSBfX3VudXNlZCkKIHsKLSAgICBzaXplX3QgaW5kZXhUb0ltcG9ydDsKLSAgICBmb3IgKGluZGV4VG9JbXBvcnQgPSAwOyBpbmRleFRvSW1wb3J0IDwgcG9ydC0+bVByb2ZpbGVzLnNpemUoKTsgaW5kZXhUb0ltcG9ydCsrKSB7Ci0gICAgICAgIGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGVUb0ltcG9ydCA9IHBvcnQtPm1Qcm9maWxlc1tpbmRleFRvSW1wb3J0XTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHByb2ZpbGVUb0ltcG9ydCA6IHBvcnQtPm1Qcm9maWxlcykgewogICAgICAgICBpZiAocHJvZmlsZVRvSW1wb3J0LT5pc1ZhbGlkKCkpIHsKICAgICAgICAgICAgIC8vIEltcG9ydCBvbmx5IHZhbGlkIHBvcnQsIGkuZS4gdmFsaWQgZm9ybWF0LCBub24gZW1wdHkgcmF0ZXMgYW5kIGNoYW5uZWxzIG1hc2tzCiAgICAgICAgICAgICBib29sIGhhc1NhbWVQcm9maWxlID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBwcm9maWxlSW5kZXggPSAwOyBwcm9maWxlSW5kZXggPCBtUHJvZmlsZXMuc2l6ZSgpOyBwcm9maWxlSW5kZXgrKykgewotICAgICAgICAgICAgICAgIGlmICgqbVByb2ZpbGVzW3Byb2ZpbGVJbmRleF0gPT0gKnByb2ZpbGVUb0ltcG9ydCkgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwcm9maWxlIDogbVByb2ZpbGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKCpwcm9maWxlID09ICpwcm9maWxlVG9JbXBvcnQpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gbmV2ZXIgaW1wb3J0IGEgcHJvZmlsZSB0d2ljZQogICAgICAgICAgICAgICAgICAgICBoYXNTYW1lUHJvZmlsZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTUxLDYgKzEzNywyNiBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgQXVkaW9Qb3J0OjpjaGVja0V4YWN0QXVkaW9Qcm9maWxlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSBjb25zdAoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGF1dG8gY29uZmlnX21hc2sgPSBjb25maWctPmNvbmZpZ19tYXNrOworICAgIGlmIChjb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0dBSU4pIHsKKyAgICAgICAgY29uZmlnX21hc2sgJj0gfkFVRElPX1BPUlRfQ09ORklHX0dBSU47CisgICAgICAgIHN0YXR1cyA9IGNoZWNrR2FpbigmY29uZmlnLT5nYWluLCBjb25maWctPmdhaW4uaW5kZXgpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjb25maWdfbWFzayAhPSAwKSB7CisgICAgICAgIC8vIFRPRE8gc2hvdWxkIHdlIGNoZWNrIHNhbXBsZV9yYXRlIC8gY2hhbm5lbF9tYXNrIC8gZm9ybWF0IHNlcGFyYXRlbHk/CisgICAgICAgIHN0YXR1cyA9IG1Qcm9maWxlcy5jaGVja0V4YWN0UHJvZmlsZShjb25maWctPnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5jaGFubmVsX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmZvcm1hdCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKIHZvaWQgQXVkaW9Qb3J0OjpwaWNrU2FtcGxpbmdSYXRlKHVpbnQzMl90ICZwaWNrZWRSYXRlLGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnNhbXBsaW5nUmF0ZXMpIGNvbnN0CiB7CiAgICAgcGlja2VkUmF0ZSA9IDA7CkBAIC00MDMsOSArNDA5LDcgQEAKICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KLSAgICBzdGF0dXMgPSBhdWRpb3BvcnQtPmNoZWNrRXhhY3RBdWRpb1Byb2ZpbGUoY29uZmlnLT5zYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5jaGFubmVsX21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0KTsKKyAgICBzdGF0dXMgPSBhdWRpb3BvcnQtPmNoZWNrRXhhY3RBdWRpb1Byb2ZpbGUoY29uZmlnKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC00MTksMTAgKzQyMyw2IEBACiAgICAgICAgIG1Gb3JtYXQgPSBjb25maWctPmZvcm1hdDsKICAgICB9CiAgICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19HQUlOKSB7Ci0gICAgICAgIHN0YXR1cyA9IGF1ZGlvcG9ydC0+Y2hlY2tHYWluKCZjb25maWctPmdhaW4sIGNvbmZpZy0+Z2Fpbi5pbmRleCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgfQogICAgICAgICBtR2FpbiA9IGNvbmZpZy0+Z2FpbjsKICAgICB9CiAKQEAgLTQ4MCw0ICs0ODAsNCBAQAogICAgIH0KIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUHJvZmlsZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Byb2ZpbGUuY3BwCmluZGV4IDk4ZjdhOTQuLmZkNmZjMWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUHJvZmlsZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qcm9maWxlLmNwcApAQCAtMjMzLDggKzIzMyw3IEBACiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdChpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHByb2ZpbGUgOiAqdGhpcykgewogICAgICAgICBpZiAocHJvZmlsZS0+Y2hlY2tFeGFjdChzYW1wbGluZ1JhdGUsIGNoYW5uZWxNYXNrLCBmb3JtYXQpID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KQEAgLTI4OCw0ICsyODcsNCBAQAogICAgIHJldHVybiBBdWRpb1BvcnQ6OmNvbXBhcmVGb3JtYXRzKCgqcHJvZmlsZTEpLT5nZXRGb3JtYXQoKSwgKCpwcm9maWxlMiktPmdldEZvcm1hdCgpKTsKIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU2Vzc2lvbi5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Nlc3Npb24uY3BwCmluZGV4IDViNTdkM2QuLjdjZGE0NmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU2Vzc2lvbi5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9TZXNzaW9uLmNwcApAQCAtMjkwLDQgKzI5MCw0IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQ29uZmlnUGFyc2luZ1V0aWxzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0NvbmZpZ1BhcnNpbmdVdGlscy5jcHAKaW5kZXggZTU4ODhlMi4uMWUxMDVmNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQ29uZmlnUGFyc2luZ1V0aWxzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Db25maWdQYXJzaW5nVXRpbHMuY3BwCkBAIC00MTYsNCArNDE2LDQgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0RldmljZURlc2NyaXB0b3IuY3BwCmluZGV4IGEyYzExNjUuLjE5YzIwNjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0RldmljZURlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0RldmljZURlc2NyaXB0b3IuY3BwCkBAIC0xNyw2ICsxNyw3IEBACiAjZGVmaW5lIExPR19UQUcgIkFQTTo6RGV2aWNlcyIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3N0cmluZy5oPgogI2luY2x1ZGUgIkRldmljZURlc2NyaXB0b3IuaCIKICNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCiAjaW5jbHVkZSAiQXVkaW9HYWluLmgiCkBAIC02MCw3ICs2MSw3IEBACiB2b2lkIERldmljZVZlY3Rvcjo6cmVmcmVzaFR5cGVzKCkKIHsKICAgICBtRGV2aWNlVHlwZXMgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIG1EZXZpY2VUeXBlcyB8PSBpdGVtQXQoaSktPnR5cGUoKTsKICAgICB9CiAgICAgQUxPR1YoIkRldmljZVZlY3Rvcjo6cmVmcmVzaFR5cGVzKCkgbURldmljZVR5cGVzICUwOHgiLCBtRGV2aWNlVHlwZXMpOwpAQCAtNjgsNyArNjksNyBAQAogCiBzc2l6ZV90IERldmljZVZlY3Rvcjo6aW5kZXhPZihjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSkgY29uc3QKIHsKLSAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIGlmIChpdGVtLT5lcXVhbHMoaXRlbUF0KGkpKSkgewogICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgIH0KQEAgLTc4LDEyICs3OSwxNSBAQAogCiB2b2lkIERldmljZVZlY3Rvcjo6YWRkKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykKIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRldmljZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gZGV2aWNlcy5pdGVtQXQoaSk7CisgICAgYm9vbCBhZGRlZCA9IGZhbHNlOworICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogZGV2aWNlcykgewogICAgICAgICBpZiAoaW5kZXhPZihkZXZpY2UpIDwgMCAmJiBTb3J0ZWRWZWN0b3I6OmFkZChkZXZpY2UpID49IDApIHsKLSAgICAgICAgICAgIHJlZnJlc2hUeXBlcygpOworICAgICAgICAgICAgYWRkZWQgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQorICAgIGlmIChhZGRlZCkgeworICAgICAgICByZWZyZXNoVHlwZXMoKTsKKyAgICB9CiB9CiAKIHNzaXplX3QgRGV2aWNlVmVjdG9yOjphZGQoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pCkBAIC0xNDgsMTQgKzE1MiwxMiBAQAogCiBzcDxEZXZpY2VEZXNjcmlwdG9yPiBEZXZpY2VWZWN0b3I6OmdldERldmljZUZyb21JZChhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdAogewotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChpdGVtQXQoaSktPmdldElkKCkgPT0gaWQpIHsKLSAgICAgICAgICAgIGRldmljZSA9IGl0ZW1BdChpKTsKLSAgICAgICAgICAgIGJyZWFrOworICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKGRldmljZS0+Z2V0SWQoKSA9PSBpZCkgeworICAgICAgICAgICAgcmV0dXJuIGRldmljZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gZGV2aWNlOworICAgIHJldHVybiBudWxscHRyOwogfQogCiBEZXZpY2VWZWN0b3IgRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VzRnJvbVR5cGUoYXVkaW9fZGV2aWNlc190IHR5cGUpIGNvbnN0CkBAIC0xODAsMTEgKzE4Miw5IEBACiAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBTdHJpbmc4JiBhZGRyZXNzKSBjb25zdAogewogICAgIERldmljZVZlY3RvciBkZXZpY2VzOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKGl0ZW1BdChpKS0+dHlwZSgpID09IHR5cGUpIHsKLSAgICAgICAgICAgIGlmIChpdGVtQXQoaSktPm1BZGRyZXNzID09IGFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2VzLmFkZChpdGVtQXQoaSkpOwotICAgICAgICAgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKGRldmljZS0+dHlwZSgpID09IHR5cGUgJiYgZGV2aWNlLT5tQWRkcmVzcyA9PSBhZGRyZXNzKSB7CisgICAgICAgICAgICBkZXZpY2VzLmFkZChkZXZpY2UpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBkZXZpY2VzOwpAQCAtMTkyLDE0ICsxOTIsMTIgQEAKIAogc3A8RGV2aWNlRGVzY3JpcHRvcj4gRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VGcm9tVGFnTmFtZShjb25zdCBTdHJpbmc4ICZ0YWdOYW1lKSBjb25zdAogewotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChpdGVtQXQoaSktPmdldFRhZ05hbWUoKSA9PSB0YWdOYW1lKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBpdGVtQXQoaSk7Ci0gICAgICAgICAgICBicmVhazsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6ICp0aGlzKSB7CisgICAgICAgIGlmIChkZXZpY2UtPmdldFRhZ05hbWUoKSA9PSB0YWdOYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gZGV2aWNlOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBkZXZpY2U7CisgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKIHN0YXR1c190IERldmljZVZlY3Rvcjo6ZHVtcChpbnQgZmQsIGNvbnN0IFN0cmluZzggJnRhZywgaW50IHNwYWNlcywgYm9vbCB2ZXJib3NlKSBjb25zdApAQCAtMjQ4LDggKzI0Niw5IEBACiAgICAgLy8gd2l0aG91dCB0aGUgdGVzdD8KICAgICAvLyBUaGlzIGhhcyBiZWVuIGRlbW9uc3RyYXRlZCB0byBOT1QgYmUgdHJ1ZSAoYXQgc3RhcnQgdXApCiAgICAgLy8gQUxPR19BU1NFUlQobU1vZHVsZSAhPSBOVUxMKTsKLSAgICBkc3RDb25maWctPmV4dC5kZXZpY2UuaHdfbW9kdWxlID0gbU1vZHVsZSAhPSAwID8gbU1vZHVsZS0+bUhhbmRsZSA6IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORTsKLSAgICBzdHJuY3B5KGRzdENvbmZpZy0+ZXh0LmRldmljZS5hZGRyZXNzLCBtQWRkcmVzcy5zdHJpbmcoKSwgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTik7CisgICAgZHN0Q29uZmlnLT5leHQuZGV2aWNlLmh3X21vZHVsZSA9CisgICAgICAgICAgICBtTW9kdWxlICE9IDAgPyBtTW9kdWxlLT5nZXRIYW5kbGUoKSA6IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORTsKKyAgICAodm9pZClhdWRpb191dGlsc19zdHJsY3B5X3plcm9maWxsKGRzdENvbmZpZy0+ZXh0LmRldmljZS5hZGRyZXNzLCBtQWRkcmVzcy5zdHJpbmcoKSk7CiB9CiAKIHZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0CkBAIC0yNTksOCArMjU4LDggQEAKICAgICBwb3J0LT5pZCA9IG1JZDsKICAgICB0b0F1ZGlvUG9ydENvbmZpZygmcG9ydC0+YWN0aXZlX2NvbmZpZyk7CiAgICAgcG9ydC0+ZXh0LmRldmljZS50eXBlID0gbURldmljZVR5cGU7Ci0gICAgcG9ydC0+ZXh0LmRldmljZS5od19tb2R1bGUgPSBtTW9kdWxlLT5tSGFuZGxlOwotICAgIHN0cm5jcHkocG9ydC0+ZXh0LmRldmljZS5hZGRyZXNzLCBtQWRkcmVzcy5zdHJpbmcoKSwgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTik7CisgICAgcG9ydC0+ZXh0LmRldmljZS5od19tb2R1bGUgPSBtTW9kdWxlLT5nZXRIYW5kbGUoKTsKKyAgICAodm9pZClhdWRpb191dGlsc19zdHJsY3B5X3plcm9maWxsKHBvcnQtPmV4dC5kZXZpY2UuYWRkcmVzcywgbUFkZHJlc3Muc3RyaW5nKCkpOwogfQogCiB2b2lkIERldmljZURlc2NyaXB0b3I6OmltcG9ydEF1ZGlvUG9ydChjb25zdCBzcDxBdWRpb1BvcnQ+JiBwb3J0LCBib29sIGZvcmNlKSB7CkBAIC0zMTIsNCArMzExLDQgQEAKICAgICBBdWRpb1BvcnQ6OmxvZygiICAiKTsKIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0dhaW5zLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0dhaW5zLmNwcAppbmRleCBlM2ZjOWE4Li42NDA3YTE3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9HYWlucy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvR2FpbnMuY3BwCkBAIC0xMTMsODYgKzExMywxMDQgQEAKICAgICB7MCwgMC4wZn0sIHsxLCAwLjBmfSwgezIsIDAuMGZ9LCB7MTAwLCAwLjBmfQogfTsKIAorY29uc3QgVm9sdW1lQ3VydmVQb2ludAorR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0geworICAgIHsxLCAtMTI4LjBmfSwgezIwLCAtODAuMGZ9LCB7NjAsIC00MC4wZn0sIHsxMDAsIDAuMGZ9Cit9OworCiBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpHYWluczo6c1ZvbHVtZVByb2ZpbGVzW0FVRElPX1NUUkVBTV9DTlRdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtERVZJQ0VfQ0FURUdPUllfQ05UXSA9IHsKICAgICB7IC8vIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMCiAgICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCiAgICAgICAgIEdhaW5zOjpzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCiAgICAgICAgIEdhaW5zOjpzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgICAgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAogICAgIH0sCiAgICAgeyAvLyBBVURJT19TVFJFQU1fU1lTVEVNCiAgICAgICAgIEdhaW5zOjpzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAogICAgICAgICBHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKICAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgICAgIEdhaW5zOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAgICAgICAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKICAgICB9LAogICAgIHsgLy8gQVVESU9fU1RSRUFNX1JJTkcKICAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCiAgICAgICAgIEdhaW5zOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgogICAgICAgICBHYWluczo6c0RlZmF1bHRWb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICAgICAgR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAogICAgIH0sCiAgICAgeyAvLyBBVURJT19TVFJFQU1fTVVTSUMKICAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKICAgICAgICAgR2FpbnM6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKICAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECiAgICAgfSwKICAgICB7IC8vIEFVRElPX1NUUkVBTV9BTEFSTQogICAgICAgICBHYWluczo6c0RlZmF1bHRWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKICAgICAgICAgR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCiAgICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvbHVtZUN1cnZlLCAgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECiAgICAgfSwKICAgICB7IC8vIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04KICAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCiAgICAgICAgIEdhaW5zOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgogICAgICAgICBHYWluczo6c0RlZmF1bHRWb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICAgICAgR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAogICAgIH0sCiAgICAgeyAvLyBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTwogICAgICAgICBHYWluczo6c0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAogICAgICAgICBHYWluczo6c1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgogICAgICAgICBHYWluczo6c0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlICAgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECiAgICAgfSwKICAgICB7IC8vIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFCiAgICAgICAgIEdhaW5zOjpzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAogICAgICAgICBHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKICAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICAgICAgR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlICAgICAgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAogICAgIH0sCiAgICAgeyAgLy8gQVVESU9fU1RSRUFNX0RUTUYKICAgICAgICAgR2FpbnM6OnNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCiAgICAgICAgIEdhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgogICAgICAgICBHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgICAgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECiAgICAgfSwKICAgICB7IC8vIEFVRElPX1NUUkVBTV9UVFMKICAgICAgIC8vICJUcmFuc21pdHRlZCBUaHJvdWdoIFNwZWFrZXIiOiBhbHdheXMgc2lsZW50IGV4Y2VwdCBvbiBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgogICAgICAgICBHYWluczo6c1NpbGVudFZvbHVtZUN1cnZlLCAgICAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAogICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgogICAgICAgICBHYWluczo6c1NpbGVudFZvbHVtZUN1cnZlLCAgICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNTaWxlbnRWb2x1bWVDdXJ2ZSAgICAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgICAgICBHYWluczo6c1NpbGVudFZvbHVtZUN1cnZlLCAgICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKICAgICB9LAogICAgIHsgLy8gQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkKICAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKICAgICAgICAgR2FpbnM6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKICAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECiAgICAgfSwKICAgICB7IC8vIEFVRElPX1NUUkVBTV9SRVJPVVRJTkcKICAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKICAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKICAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKICAgICB9LAogICAgIHsgLy8gQVVESU9fU1RSRUFNX1BBVENICiAgICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCiAgICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCiAgICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECiAgICAgfSwKIH07CiAKQEAgLTIzNSw0ICsyNTMsNCBAQAogICAgIHJldHVybiBkZWNpYmVsczsKIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0h3TW9kdWxlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0h3TW9kdWxlLmNwcAppbmRleCBjYzU2ZmI4Li5hZWY3ZGJlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Id01vZHVsZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSHdNb2R1bGUuY3BwCkBAIC0xNTQsMTAgKzE1NCw5IEBACiBEZXZpY2VWZWN0b3IgSHdNb2R1bGU6OmdldFJvdXRlU291cmNlRGV2aWNlcyhjb25zdCBzcDxBdWRpb1JvdXRlPiAmcm91dGUpIGNvbnN0CiB7CiAgICAgRGV2aWNlVmVjdG9yIHNvdXJjZURldmljZXM7Ci0gICAgVmVjdG9yIDxzcDxBdWRpb1BvcnQ+ID4gc291cmNlcyA9IHJvdXRlLT5nZXRTb3VyY2VzKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChzb3VyY2VzW2ldLT5nZXRUeXBlKCkgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewotICAgICAgICAgICAgc291cmNlRGV2aWNlcy5hZGQobURlY2xhcmVkRGV2aWNlcy5nZXREZXZpY2VGcm9tVGFnTmFtZShzb3VyY2VzW2ldLT5nZXRUYWdOYW1lKCkpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHNvdXJjZSA6IHJvdXRlLT5nZXRTb3VyY2VzKCkpIHsKKyAgICAgICAgaWYgKHNvdXJjZS0+Z2V0VHlwZSgpID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgICAgIHNvdXJjZURldmljZXMuYWRkKG1EZWNsYXJlZERldmljZXMuZ2V0RGV2aWNlRnJvbVRhZ05hbWUoc291cmNlLT5nZXRUYWdOYW1lKCkpKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gc291cmNlRGV2aWNlczsKQEAgLTE3MywxNyArMTcyLDE1IEBACiB2b2lkIEh3TW9kdWxlOjpyZWZyZXNoU3VwcG9ydGVkRGV2aWNlcygpCiB7CiAgICAgLy8gTm93IHVwZGF0aW5nIHRoZSBzdHJlYW1zIChha2EgSU9Qcm9maWxlIHVudGlsIG5vdykgc3VwcG9ydGVkIGRldmljZXMKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPElPUHJvZmlsZT4gc3RyZWFtID0gbUlucHV0UHJvZmlsZXNbaV07CisgICAgZm9yIChjb25zdCBhdXRvJiBzdHJlYW0gOiBtSW5wdXRQcm9maWxlcykgewogICAgICAgICBEZXZpY2VWZWN0b3Igc291cmNlRGV2aWNlczsKLSAgICAgICAgY29uc3QgQXVkaW9Sb3V0ZVZlY3RvciAmcm91dGVzID0gc3RyZWFtLT5nZXRSb3V0ZXMoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCByb3V0ZXMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvUG9ydD4gc2luayA9IHJvdXRlc1tqXS0+Z2V0U2luaygpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHJvdXRlIDogc3RyZWFtLT5nZXRSb3V0ZXMoKSkgeworICAgICAgICAgICAgc3A8QXVkaW9Qb3J0PiBzaW5rID0gcm91dGUtPmdldFNpbmsoKTsKICAgICAgICAgICAgIGlmIChzaW5rID09IDAgfHwgc3RyZWFtICE9IHNpbmspIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgcm91dGUgYXR0YWNoZWQgdG8gaW5wdXQgc3RyZWFtIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERldmljZVZlY3RvciBzb3VyY2VEZXZpY2VzRm9yUm91dGUgPSBnZXRSb3V0ZVNvdXJjZURldmljZXMocm91dGVzW2pdKTsKKyAgICAgICAgICAgIERldmljZVZlY3RvciBzb3VyY2VEZXZpY2VzRm9yUm91dGUgPSBnZXRSb3V0ZVNvdXJjZURldmljZXMocm91dGUpOwogICAgICAgICAgICAgaWYgKHNvdXJjZURldmljZXNGb3JSb3V0ZS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgc291cmNlIGRldmljZXMgZm9yICVzIiwgX19GVU5DVElPTl9fLCBzdHJlYW0tPmdldE5hbWUoKS5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC0xOTYsMTcgKzE5MywxNSBAQAogICAgICAgICB9CiAgICAgICAgIHN0cmVhbS0+c2V0U3VwcG9ydGVkRGV2aWNlcyhzb3VyY2VEZXZpY2VzKTsKICAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8SU9Qcm9maWxlPiBzdHJlYW0gPSBtT3V0cHV0UHJvZmlsZXNbaV07CisgICAgZm9yIChjb25zdCBhdXRvJiBzdHJlYW0gOiBtT3V0cHV0UHJvZmlsZXMpIHsKICAgICAgICAgRGV2aWNlVmVjdG9yIHNpbmtEZXZpY2VzOwotICAgICAgICBjb25zdCBBdWRpb1JvdXRlVmVjdG9yICZyb3V0ZXMgPSBzdHJlYW0tPmdldFJvdXRlcygpOwotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHJvdXRlcy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgc3A8QXVkaW9Qb3J0PiBzb3VyY2UgPSByb3V0ZXNbal0tPmdldFNvdXJjZXMoKS5maW5kQnlUYWdOYW1lKHN0cmVhbS0+Z2V0VGFnTmFtZSgpKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiByb3V0ZSA6IHN0cmVhbS0+Z2V0Um91dGVzKCkpIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvUG9ydD4gc291cmNlID0gcm91dGUtPmdldFNvdXJjZXMoKS5maW5kQnlUYWdOYW1lKHN0cmVhbS0+Z2V0VGFnTmFtZSgpKTsKICAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gMCB8fCBzdHJlYW0gIT0gc291cmNlKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHJvdXRlIGF0dGFjaGVkIHRvIG91dHB1dCBzdHJlYW0iLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc2lua0RldmljZSA9IGdldFJvdXRlU2lua0RldmljZShyb3V0ZXNbal0pOworICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc2lua0RldmljZSA9IGdldFJvdXRlU2lua0RldmljZShyb3V0ZSk7CiAgICAgICAgICAgICBpZiAoc2lua0RldmljZSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIHNpbmsgZGV2aWNlIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZWFtLT5nZXROYW1lKCkuc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMjE3LDYgKzIxMiwxMiBAQAogICAgIH0KIH0KIAordm9pZCBId01vZHVsZTo6c2V0SGFuZGxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUpIHsKKyAgICBBTE9HV19JRihtSGFuZGxlICE9IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORSwKKyAgICAgICAgICAgICJId01vZHVsZSBoYW5kbGUgaXMgY2hhbmdpbmcgZnJvbSAlZCB0byAlZCIsIG1IYW5kbGUsIGhhbmRsZSk7CisgICAgbUhhbmRsZSA9IGhhbmRsZTsKK30KKwogdm9pZCBId01vZHVsZTo6ZHVtcChpbnQgZmQpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CkBAIC0yNTIsNjAgKzI1Myw0MCBAQAogCiBzcCA8SHdNb2R1bGU+IEh3TW9kdWxlQ29sbGVjdGlvbjo6Z2V0TW9kdWxlRnJvbU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3QKIHsKLSAgICBzcCA8SHdNb2R1bGU+IG1vZHVsZTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgICBpZiAoc3RyY21wKGl0ZW1BdChpKS0+Z2V0TmFtZSgpLCBuYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXRlbUF0KGkpOworICAgIGZvciAoY29uc3QgYXV0byYgbW9kdWxlIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKHN0cmNtcChtb2R1bGUtPmdldE5hbWUoKSwgbmFtZSkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG1vZHVsZTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gbW9kdWxlOworICAgIHJldHVybiBudWxscHRyOwogfQogCi0KIHNwIDxId01vZHVsZT4gSHdNb2R1bGVDb2xsZWN0aW9uOjpnZXRNb2R1bGVGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKIHsKLSAgICBzcCA8SHdNb2R1bGU+IG1vZHVsZTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKGl0ZW1BdChpKS0+Z2V0SGFuZGxlKCkgPT0gMCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBpdGVtQXQoaSktPm1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5tT3V0cHV0UHJvZmlsZXNbal0tPnN1cHBvcnREZXZpY2UoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbUF0KGkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaXRlbUF0KGkpLT5tSW5wdXRQcm9maWxlcy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgICAgIGlmIChpdGVtQXQoaSktPm1JbnB1dFByb2ZpbGVzW2pdLT5zdXBwb3J0RGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1BdChpKTsKLSAgICAgICAgICAgICAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiBtb2R1bGUgOiAqdGhpcykgeworICAgICAgICBjb25zdCBhdXRvJiBwcm9maWxlcyA9IGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSA/CisgICAgICAgICAgICAgICAgbW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpIDogbW9kdWxlLT5nZXRJbnB1dFByb2ZpbGVzKCk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgcHJvZmlsZSA6IHByb2ZpbGVzKSB7CisgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydERldmljZShkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gbW9kdWxlOworICAgIHJldHVybiBudWxscHRyOwogfQogCi1zcDxEZXZpY2VEZXNjcmlwdG9yPiAgSHdNb2R1bGVDb2xsZWN0aW9uOjpnZXREZXZpY2VEZXNjcmlwdG9yKGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtYXRjaEFkcmVzcykgY29uc3QKK3NwPERldmljZURlc2NyaXB0b3I+IEh3TW9kdWxlQ29sbGVjdGlvbjo6Z2V0RGV2aWNlRGVzY3JpcHRvcihjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbWF0Y2hBZHJlc3MpIGNvbnN0CiB7Ci0gICAgU3RyaW5nOCBhZGRyZXNzID0gKGRldmljZV9hZGRyZXNzID09IE5VTEwpID8gU3RyaW5nOCgiIikgOiBTdHJpbmc4KGRldmljZV9hZGRyZXNzKTsKKyAgICBTdHJpbmc4IGFkZHJlc3MgPSAoZGV2aWNlX2FkZHJlc3MgPT0gbnVsbHB0cikgPyBTdHJpbmc4KCIiKSA6IFN0cmluZzgoZGV2aWNlX2FkZHJlc3MpOwogICAgIC8vIGhhbmRsZSBsZWdhY3kgcmVtb3RlIHN1Ym1peCBjYXNlIHdoZXJlIHRoZSBhZGRyZXNzIHdhcyBub3QgYWx3YXlzIHNwZWNpZmllZAogICAgIGlmIChkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkgJiYgKGFkZHJlc3MubGVuZ3RoKCkgPT0gMCkpIHsKICAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKICAgICB9CiAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHNwPEh3TW9kdWxlPiBod01vZHVsZSA9IGl0ZW1BdChpKTsKLSAgICAgICAgaWYgKGh3TW9kdWxlLT5tSGFuZGxlID09IDApIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6ICp0aGlzKSB7CiAgICAgICAgIERldmljZVZlY3RvciBkZWNsYXJlZERldmljZXMgPSBod01vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCk7CiAgICAgICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0ID0gZGVjbGFyZWREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZUFkZHIoZGV2aWNlLCBhZGRyZXNzKTsKICAgICAgICAgaWYgKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSkgewpAQCAtMzQwLDQgKzMyMSw1IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCisKIH0gLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSU9Qcm9maWxlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0lPUHJvZmlsZS5jcHAKaW5kZXggNzRlZjRlYy4uZmJjMjM4NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSU9Qcm9maWxlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9JT1Byb2ZpbGUuY3BwCkBAIC0zNSw3ICszNSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqdXBkYXRlZEZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnVwZGF0ZWRDaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKSBjb25zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgdHlwZSBwdW5uaW5nIGhlcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBleGFjdE1hdGNoUmVxdWlyZWRGb3JJbnB1dEZsYWdzKSBjb25zdAogewogICAgIGNvbnN0IGJvb2wgaXNQbGF5YmFja1RocmVhZCA9CiAgICAgICAgICAgICBnZXRUeXBlKCkgPT0gQVVESU9fUE9SVF9UWVBFX01JWCAmJiBnZXRSb2xlKCkgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRTsKQEAgLTcxLDcgKzczLDEzIEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBpZiAoY2hlY2tFeGFjdEF1ZGlvUHJvZmlsZShzYW1wbGluZ1JhdGUsIGNoYW5uZWxNYXNrLCBmb3JtYXQpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBjb25maWcgPSB7CisgICAgICAgICAgICAuY29uZmlnX21hc2sgPSBBVURJT19QT1JUX0NPTkZJR19BTEwgJiB+QVVESU9fUE9SVF9DT05GSUdfR0FJTiwKKyAgICAgICAgICAgIC5zYW1wbGVfcmF0ZSA9IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgIC5jaGFubmVsX21hc2sgPSBjaGFubmVsTWFzaywKKyAgICAgICAgICAgIC5mb3JtYXQgPSBmb3JtYXQsCisgICAgICAgIH07CisgICAgICAgIGlmIChjaGVja0V4YWN0QXVkaW9Qcm9maWxlKCZjb25maWcpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CkBAIC04NCw3ICs5Miw3IEBACiAgICAgLy8gQW4gZXhpc3Rpbmcgbm9ybWFsIHN0cmVhbSBpcyBjb21wYXRpYmxlIHdpdGggYSBmYXN0IHRyYWNrIHJlcXVlc3QsCiAgICAgLy8gYnV0IHRoZSBmYXN0IHJlcXVlc3Qgd2lsbCBiZSBkZW5pZWQgYnkgQXVkaW9GbGluZ2VyIGFuZCBjb252ZXJ0ZWQgdG8gbm9ybWFsIHRyYWNrLgogICAgIGlmIChpc1JlY29yZFRocmVhZCAmJiAoKGdldEZsYWdzKCkgXiBmbGFncykgJgotICAgICAgICAgICAgfkFVRElPX0lOUFVUX0ZMQUdfRkFTVCkpIHsKKyAgICAgICAgICAgIH4oZXhhY3RNYXRjaFJlcXVpcmVkRm9ySW5wdXRGbGFncyA/IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSA6IEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTEyMiw2ICsxMzAsMTYgQEAKICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogICAgIG1TdXBwb3J0ZWREZXZpY2VzLmR1bXAoZmQsIFN0cmluZzgoIlN1cHBvcnRlZCIpLCA0LCBmYWxzZSk7CisKKyAgICByZXN1bHQuY2xlYXIoKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbiAgICAtIG1heE9wZW5Db3VudDogJXUgLSBjdXJPcGVuQ291bnQ6ICV1XG4iLAorICAgICAgICAgICAgIG1heE9wZW5Db3VudCwgY3VyT3BlbkNvdW50KTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgIC0gbWF4QWN0aXZlQ291bnQ6ICV1IC0gY3VyQWN0aXZlQ291bnQ6ICV1XG4iLAorICAgICAgICAgICAgIG1heEFjdGl2ZUNvdW50LCBjdXJBY3RpdmVDb3VudCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiB9CiAKIHZvaWQgSU9Qcm9maWxlOjpsb2coKQpAQCAtMTI5LDQgKzE0Nyw0IEBACiAgICAgLy8gQFRPRE86IGZvcndhcmQgbG9nIHRvIEF1ZGlvUG9ydAogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2VyaWFsaXplci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXJpYWxpemVyLmNwcAppbmRleCBhMjI0MDA0Li5hMjUzMTEzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXJpYWxpemVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXJpYWxpemVyLmNwcApAQCAtMTQwLDE5ICsxNDAsMTkgQEAKICAgICB9CiAKICAgICBzdHJpbmcgbWluVmFsdWVNQkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6bWluVmFsdWVNQik7Ci0gICAgdWludDMyX3QgbWluVmFsdWVNQjsKKyAgICBpbnQzMl90IG1pblZhbHVlTUI7CiAgICAgaWYgKCFtaW5WYWx1ZU1CTGl0ZXJhbC5lbXB0eSgpICYmIGNvbnZlcnRUbyhtaW5WYWx1ZU1CTGl0ZXJhbCwgbWluVmFsdWVNQikpIHsKICAgICAgICAgZ2Fpbi0+c2V0TWluVmFsdWVJbk1iKG1pblZhbHVlTUIpOwogICAgIH0KIAogICAgIHN0cmluZyBtYXhWYWx1ZU1CTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjptYXhWYWx1ZU1CKTsKLSAgICB1aW50MzJfdCBtYXhWYWx1ZU1COworICAgIGludDMyX3QgbWF4VmFsdWVNQjsKICAgICBpZiAoIW1heFZhbHVlTUJMaXRlcmFsLmVtcHR5KCkgJiYgY29udmVydFRvKG1heFZhbHVlTUJMaXRlcmFsLCBtYXhWYWx1ZU1CKSkgewogICAgICAgICBnYWluLT5zZXRNYXhWYWx1ZUluTWIobWF4VmFsdWVNQik7CiAgICAgfQogCiAgICAgc3RyaW5nIGRlZmF1bHRWYWx1ZU1CTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpkZWZhdWx0VmFsdWVNQik7Ci0gICAgdWludDMyX3QgZGVmYXVsdFZhbHVlTUI7CisgICAgaW50MzJfdCBkZWZhdWx0VmFsdWVNQjsKICAgICBpZiAoIWRlZmF1bHRWYWx1ZU1CTGl0ZXJhbC5lbXB0eSgpICYmIGNvbnZlcnRUbyhkZWZhdWx0VmFsdWVNQkxpdGVyYWwsIGRlZmF1bHRWYWx1ZU1CKSkgewogICAgICAgICBnYWluLT5zZXREZWZhdWx0VmFsdWVJbk1iKGRlZmF1bHRWYWx1ZU1CKTsKICAgICB9CkBAIC0yMTcsNiArMjE3LDggQEAKIGNvbnN0IGNoYXIgTWl4UG9ydFRyYWl0czo6QXR0cmlidXRlczo6bmFtZVtdID0gIm5hbWUiOwogY29uc3QgY2hhciBNaXhQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjpyb2xlW10gPSAicm9sZSI7CiBjb25zdCBjaGFyIE1peFBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6OmZsYWdzW10gPSAiZmxhZ3MiOworY29uc3QgY2hhciBNaXhQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjptYXhPcGVuQ291bnRbXSA9ICJtYXhPcGVuQ291bnQiOworY29uc3QgY2hhciBNaXhQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjptYXhBY3RpdmVDb3VudFtdID0gIm1heEFjdGl2ZUNvdW50IjsKIAogc3RhdHVzX3QgTWl4UG9ydFRyYWl0czo6ZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqY2hpbGQsIFB0ckVsZW1lbnQgJm1peFBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQpAQCAtMjU5LDYgKzI2MSwxNCBAQAogICAgICAgICAgICAgbWl4UG9ydC0+c2V0RmxhZ3MoSW5wdXRGbGFnQ29udmVydGVyOjptYXNrRnJvbVN0cmluZyhmbGFncykpOwogICAgICAgICB9CiAgICAgfQorICAgIHN0cmluZyBtYXhPcGVuQ291bnQgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om1heE9wZW5Db3VudCk7CisgICAgaWYgKCFtYXhPcGVuQ291bnQuZW1wdHkoKSkgeworICAgICAgICBjb252ZXJ0VG8obWF4T3BlbkNvdW50LCBtaXhQb3J0LT5tYXhPcGVuQ291bnQpOworICAgIH0KKyAgICBzdHJpbmcgbWF4QWN0aXZlQ291bnQgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om1heEFjdGl2ZUNvdW50KTsKKyAgICBpZiAoIW1heEFjdGl2ZUNvdW50LmVtcHR5KCkpIHsKKyAgICAgICAgY29udmVydFRvKG1heEFjdGl2ZUNvdW50LCBtaXhQb3J0LT5tYXhBY3RpdmVDb3VudCk7CisgICAgfQogICAgIC8vIERlc2VyaWFsaXplIGNoaWxkcmVuCiAgICAgQXVkaW9HYWluVHJhaXRzOjpDb2xsZWN0aW9uIGdhaW5zOwogICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb0dhaW5UcmFpdHM+KGRvYywgY2hpbGQsIGdhaW5zLCBOVUxMKTsKQEAgLTYzOCw0ICs2NDgsNCBAQAogICAgIHJldHVybiBhbmRyb2lkOjpPSzsKIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1Nlc3Npb25Sb3V0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXNzaW9uUm91dGUuY3BwCmluZGV4IDY4OWY0ZTYuLjhlZGQ0ZDEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1Nlc3Npb25Sb3V0ZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2Vzc2lvblJvdXRlLmNwcApAQCAtNDAsNyArNDAsNyBAQAogICAgIHJldHVybiBpbmRleE9mS2V5KHNlc3Npb24pID49IDAgJiYgdmFsdWVGb3Ioc2Vzc2lvbiktPm1EZXZpY2VEZXNjcmlwdG9yICE9IDA7CiB9CiAKLWJvb2wgU2Vzc2lvblJvdXRlTWFwOjpoYXNSb3V0ZUNoYW5nZWQoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitib29sIFNlc3Npb25Sb3V0ZU1hcDo6Z2V0QW5kQ2xlYXJSb3V0ZUNoYW5nZWQoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCiB7CiAgICAgaWYgKGluZGV4T2ZLZXkoc2Vzc2lvbikgPj0gMCkgewogICAgICAgICBpZiAodmFsdWVGb3Ioc2Vzc2lvbiktPm1DaGFuZ2VkKSB7CkBAIC0xMDQsOSArMTA0LDcgQEAKICAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gaW5kZXhPZktleShzZXNzaW9uKSA+PSAwID8gdmFsdWVGb3Ioc2Vzc2lvbikgOiAwOwogCiAgICAgaWYgKHJvdXRlICE9IDApIHsKLSAgICAgICAgaWYgKCgocm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yID09IDApICYmIChkZXNjcmlwdG9yICE9IDApKSB8fAotICAgICAgICAgICAgICAgICgocm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yICE9IDApICYmCi0gICAgICAgICAgICAgICAgICgoZGVzY3JpcHRvciA9PSAwKSB8fCAoIXJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvci0+ZXF1YWxzKGRlc2NyaXB0b3IpKSkpKSB7CisgICAgICAgIGlmIChkZXNjcmlwdG9yICE9IDAgfHwgcm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yICE9IDApIHsKICAgICAgICAgICAgIHJvdXRlLT5tQ2hhbmdlZCA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgcm91dGUtPm1SZWZDb3VudCsrOwpAQCAtMTE0LDEwICsxMTIsMTAgQEAKICAgICB9IGVsc2UgewogICAgICAgICByb3V0ZSA9IG5ldyBTZXNzaW9uUm91dGUoc2Vzc2lvbiwgc3RyZWFtVHlwZSwgc291cmNlLCBkZXNjcmlwdG9yLCB1aWQpOwogICAgICAgICByb3V0ZS0+bVJlZkNvdW50Kys7Ci0gICAgICAgIGFkZChzZXNzaW9uLCByb3V0ZSk7CiAgICAgICAgIGlmIChkZXNjcmlwdG9yICE9IDApIHsKICAgICAgICAgICAgIHJvdXRlLT5tQ2hhbmdlZCA9IHRydWU7CiAgICAgICAgIH0KKyAgICAgICAgYWRkKHNlc3Npb24sIHJvdXRlKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1N0cmVhbURlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU3RyZWFtRGVzY3JpcHRvci5jcHAKaW5kZXggYjMwMTllMS4uNjU2NDlmYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU3RyZWFtRGVzY3JpcHRvci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU3RyZWFtRGVzY3JpcHRvci5jcHAKQEAgLTIyMyw0ICsyMjMsNCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1R5cGVDb252ZXJ0ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvVHlwZUNvbnZlcnRlci5jcHAKaW5kZXggMDM2MjAzNy4uNmY0OGVhZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvVHlwZUNvbnZlcnRlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvVHlwZUNvbnZlcnRlci5jcHAKQEAgLTI5LDYgKzI5LDcgQEAKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEKSwKICAgICBURVJNSU5BVE9SCiB9OwogCkBAIC02NSw0ICs2Niw0IEBACiB0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPFJvdXRlRmxhZ1RyYWl0cz47CiB0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPFJ1bGVUcmFpdHM+OwogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvVm9sdW1lQ3VydmUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvVm9sdW1lQ3VydmUuY3BwCmluZGV4IDE0Y2FmN2MuLmFjM2YxYmMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1ZvbHVtZUN1cnZlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Wb2x1bWVDdXJ2ZS5jcHAKQEAgLTI5LDYgKzI5LDEzIEBACiAgICAgc2l6ZV90IG5iQ3VydmVQb2ludHMgPSBtQ3VydmVQb2ludHMuc2l6ZSgpOwogICAgIC8vIHRoZSB2b2x1bWUgaW5kZXggaW4gdGhlIFVJIGlzIHJlbGF0aXZlIHRvIHRoZSBtaW4gYW5kIG1heCB2b2x1bWUgaW5kaWNlcyBmb3IgdGhpcyBzdHJlYW0KICAgICBpbnQgbmJTdGVwcyA9IDEgKyBtQ3VydmVQb2ludHNbbmJDdXJ2ZVBvaW50cyAtIDFdLm1JbmRleCAtIG1DdXJ2ZVBvaW50c1swXS5tSW5kZXg7CisgICAgaWYgKGluZGV4SW5VaSA8IHZvbEluZGV4TWluKSB7CisgICAgICAgIEFMT0dWKCJWT0xVTUUgcmVtYXBwaW5nIGluZGV4IGZyb20gJWQgdG8gbWluIGluZGV4ICVkIiwgaW5kZXhJblVpLCB2b2xJbmRleE1pbik7CisgICAgICAgIGluZGV4SW5VaSA9IHZvbEluZGV4TWluOworICAgIH0gZWxzZSBpZiAoaW5kZXhJblVpID4gdm9sSW5kZXhNYXgpIHsKKyAgICAgICAgQUxPR1YoIlZPTFVNRSByZW1hcHBpbmcgaW5kZXggZnJvbSAlZCB0byBtYXggaW5kZXggJWQiLCBpbmRleEluVWksIHZvbEluZGV4TWF4KTsKKyAgICAgICAgaW5kZXhJblVpID0gdm9sSW5kZXhNYXg7CisgICAgfQogICAgIGludCB2b2xJZHggPSAobmJTdGVwcyAqIChpbmRleEluVWkgLSB2b2xJbmRleE1pbikpIC8gKHZvbEluZGV4TWF4IC0gdm9sSW5kZXhNaW4pOwogCiAgICAgLy8gV2hlcmUgd291bGQgdGhpcyB2b2x1bWUgaW5kZXggYmVlbiBpbnNlcnRlZCBpbiB0aGUgY3VydmUgcG9pbnQKQEAgLTEzOCw0ICsxNDUsNCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCmluZGV4IDdhZjJmODEuLmE3NWYxY2IgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApAQCAtMTYzLDM3ICsxNjMsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0icHJpbWFyeSBvdXRwdXQsZGVlcF9idWZmZXIsY29tcHJlc3NlZF9vZmZsb2FkLEJUIFNDTyBIZWFkc2V0IE1pYyxUZWxlcGhvbnkgUngiLz4KICAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJXaXJlZCBIZWFkcGhvbmVzIgogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPSJwcmltYXJ5IG91dHB1dCxkZWVwX2J1ZmZlcixjb21wcmVzc2VkX29mZmxvYWQsQlQgU0NPIEhlYWRzZXQgTWljLFRlbGVwaG9ueSBSeCIvPgotICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IlRlbGVwaG9ueSBUeCIKLSAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0idm9pY2VfdHgiLz4KICAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJwcmltYXJ5IGlucHV0IgogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPSJCdWlsdC1JbiBNaWMsQnVpbHQtSW4gQmFjayBNaWMsV2lyZWQgSGVhZHNldCBNaWMsQlQgU0NPIEhlYWRzZXQgTWljIi8+CiAgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iVGVsZXBob255IFR4IgotICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPSJCdWlsdC1JbiBNaWMsQnVpbHQtSW4gQmFjayBNaWMsV2lyZWQgSGVhZHNldCBNaWMsQlQgU0NPIEhlYWRzZXQgTWljIi8+CisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9IkJ1aWx0LUluIE1pYyxCdWlsdC1JbiBCYWNrIE1pYyxXaXJlZCBIZWFkc2V0IE1pYyxCVCBTQ08gSGVhZHNldCBNaWMsIHZvaWNlX3R4Ii8+CiAgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0idm9pY2VfcngiCiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9IlRlbGVwaG9ueSBSeCIvPgogICAgICAgICAgICAgPC9yb3V0ZXM+CiAKICAgICAgICAgPC9tb2R1bGU+CiAKLSAgICAgICAgPCEtLSBIRE1JIEF1ZGlvIEhBTCAtLT4KLSAgICAgICAgPG1vZHVsZSBkZXNjcmlwdGlvbj0iSERNSSBBdWRpbyBIQUwiIG5hbWU9ImhkbWkiIHZlcnNpb249IjIuMCI+Ci0gICAgICAgICAgICA8bWl4UG9ydHM+Ci0gICAgICAgICAgICAgICAgPG1peFBvcnQgbmFtZT0iaGRtaSBvdXRwdXQiIHJvbGU9InNvdXJjZSI+Ci0gICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIgc2FtcGxpbmdSYXRlcz0iNDgwMDAiLz4KLSAgICAgICAgICAgICAgICA8L21peFBvcnQ+Ci0gICAgICAgICAgICA8L21peFBvcnRzPgotICAgICAgICAgICAgPGRldmljZVBvcnRzPgotICAgICAgICAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkhETUkgT3V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMIiByb2xlPSJzaW5rIj4KLSAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KLSAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+Ci0gICAgICAgICAgICA8L2RldmljZVBvcnRzPgotICAgICAgICAgICAgPHJvdXRlcz4KLSAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJIRE1JIE91dCIKLSAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0iaGRtaSBvdXRwdXQiLz4KLSAgICAgICAgICAgIDwvcm91dGVzPgotICAgICAgICA8L21vZHVsZT4KLQogICAgICAgICA8IS0tIEEyZHAgQXVkaW8gSEFMIC0tPgogICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJhMmRwX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCIvPgogCkBAIC0yMDMsNiArMTgyLDkgQEAKICAgICAgICAgPCEtLSBSZW1vdGUgU3VibWl4IEF1ZGlvIEhBTCAtLT4KICAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0icl9zdWJtaXhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIi8+CiAKKyAgICAgICAgPCEtLSBIZWFyaW5nIGFpZCBBdWRpbyBIQUwgLS0+CisgICAgICAgIDx4aTppbmNsdWRlIGhyZWY9ImhlYXJpbmdfYWlkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCIvPgorCiAgICAgPC9tb2R1bGVzPgogICAgIDwhLS0gRW5kIG9mIE1vZHVsZXMgc2VjdGlvbiAtLT4KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV92b2x1bWVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfdm9sdW1lcy54bWwKaW5kZXggNDNhNDdiMC4uZWM2NGE3YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV92b2x1bWVzLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X3ZvbHVtZXMueG1sCkBAIC00Myw2ICs0Myw4IEBACiAgICAgPC92b2x1bWU+CiAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwiIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CiAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9TWVNURU0iIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CiAgICAgICAgIDxwb2ludD4xLC0zMDAwPC9wb2ludD4KICAgICAgICAgPHBvaW50PjMzLC0yNjAwPC9wb2ludD4KQEAgLTU1LDYgKzU3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJERUZBVUxUX1NZU1RFTV9WT0xVTUVfQ1VSVkUiLz4KICAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX1NZU1RFTSIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fU1lTVEVNIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CiAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9SSU5HIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0hFQURTRVRfVk9MVU1FX0NVUlZFIi8+CiAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9SSU5HIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgpAQCAtNjcsNiArNzEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FQVJQSUVDRV9WT0xVTUVfQ1VSVkUiLz4KICAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX1JJTkciIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FWFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9SSU5HIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgogICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fTVVTSUMiIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CiAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9NVVNJQyIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIgpAQCAtNzUsMTggKzgxLDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgogICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fTVVTSUMiIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX01VU0lDIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KICAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX0FMQVJNIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSIvPgogICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fQUxBUk0iIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+Ci0gICAgICAgIDxwb2ludD4xLC0yOTcwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjAsLTI5NzA8L3BvaW50PgogICAgICAgICA8cG9pbnQ+MzMsLTIwMTA8L3BvaW50PgogICAgICAgICA8cG9pbnQ+NjYsLTEwMjA8L3BvaW50PgogICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgogICAgIDwvdm9sdW1lPgogICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fQUxBUk0iIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FQVJQSUVDRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfRUFSUElFQ0VfVk9MVU1FX0NVUlZFIi8+CiAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9BTEFSTSIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FWFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX0VYVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX0FMQVJNIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KICAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX05PVElGSUNBVElPTiIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0hFQURTRVRfVk9MVU1FX0NVUlZFIi8+CiAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04iIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CkBAIC05OSw2ICsxMDksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSIvPgogICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FWFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04iIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfSEVBRFNFVF9WT0xVTUVfQ1VSVkUiLz4KICAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08iIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CiAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KQEAgLTExOSw2ICsxMzEsOCBAQAogICAgIDwvdm9sdW1lPgogICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTyIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgogICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIj4KICAgICAgICAgPHBvaW50PjEsLTMwMDA8L3BvaW50PgogICAgICAgICA8cG9pbnQ+MzMsLTI2MDA8L3BvaW50PgpAQCAtMTMxLDYgKzE0NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfU1lTVEVNX1ZPTFVNRV9DVVJWRSIvPgogICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUiIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CiAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9EVE1GIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiPgogICAgICAgICA8cG9pbnQ+MSwtMzAwMDwvcG9pbnQ+CiAgICAgICAgIDxwb2ludD4zMywtMjYwMDwvcG9pbnQ+CkBAIC0xNDMsNiArMTU5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIi8+CiAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9EVE1GIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fRFRNRiIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KICAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX1RUUyIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IlNJTEVOVF9WT0xVTUVfQ1VSVkUiLz4KICAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX1RUUyIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIgpAQCAtMTUxLDE0ICsxNjksMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJTSUxFTlRfVk9MVU1FX0NVUlZFIi8+CiAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9UVFMiIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IlNJTEVOVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX1RUUyIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJTSUxFTlRfVk9MVU1FX0NVUlZFIi8+CiAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfVk9MVU1FX0NVUlZFIi8+CiAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfU1BFQUtFUl9WT0xVTUVfQ1VSVkUiLz4KICAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkiIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfVk9MVU1FX0NVUlZFIi8+CiAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkiIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CiAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9SRVJPVVRJTkciIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgogICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fUkVST1VUSU5HIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiCkBAIC0xNjcsNiArMTg5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgogICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fUkVST1VUSU5HIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fUkVST1VUSU5HIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CiAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9QQVRDSCIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KICAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX1BBVENIIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiCkBAIC0xNzUsNSArMTk5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CiAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9QQVRDSCIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fUEFUQ0giIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgogPC92b2x1bWVzPgogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvZGVmYXVsdF92b2x1bWVfdGFibGVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9kZWZhdWx0X3ZvbHVtZV90YWJsZXMueG1sCmluZGV4IDlhMjJiMWQuLjIwN2JlNDEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9kZWZhdWx0X3ZvbHVtZV90YWJsZXMueG1sCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9kZWZhdWx0X3ZvbHVtZV90YWJsZXMueG1sCkBAIC02Nyw0ICs2Nyw2MyBAQAogICAgICAgICA8cG9pbnQ+NjAsLTIxMDA8L3BvaW50PgogICAgICAgICA8cG9pbnQ+MTAwLC0xMDAwPC9wb2ludD4KICAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgSGVhcmluZyBBaWQgVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MSwtMTI3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTgwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKyAgICA8IS0tIE5vbi1tdXRhYmxlIGRlZmF1bHQgdm9sdW1lIGN1cnZlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgPCEtLSAgICAgKiBmaXJzdCBwb2ludCBpcyBhbHdheXMgZm9yIGluZGV4IDAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gICAgICogYXR0ZW51YXRpb24gaXMgc21hbGwgZW5vdWdoIHRoYXQgc3RyZWFtIGNhbiBzdGlsbCBiZSBoZWFyZCAtLT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfTk9OX01VVEFCTEVfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgbm9uLW11dGFibGUgcmVmZXJlbmNlIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICA8IS0tICAgICAgICBiYXNlZCBvbiBERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSAtLT4KKyAgICAgICAgPHBvaW50PjAsLTU4MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9OT05fTVVUQUJMRV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLURlZmF1bHQgbm9uLW11dGFibGUgVm9sdW1lIEN1cnZlIGZvciBoZWFkc2V0IC0tPgorICAgIDwhLS0gICAgYmFzZWQgb24gREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfSEVBRFNFVF9WT0xVTUVfQ1VSVkUgLS0+CisgICAgICAgIDxwb2ludD4wLC00OTUwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjMzLC0zMzUwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjY2LC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfTk9OX01VVEFCTEVfU1BFQUtFUl9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBub24tbXV0YWJsZSBTcGVha2VyIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICA8IS0tICAgIGJhc2VkIG9uIERFRkFVTFRfREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJfVk9MVU1FX0NVUlZFIC0tPgorICAgICAgICA8cG9pbnQ+MCwtNTgwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4yMCwtNDAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42MCwtMTcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX05PTl9NVVRBQkxFX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLURlZmF1bHQgbm9uLW11dGFibGUgVm9sdW1lIEN1cnZlIC0tPgorICAgIDwhLS0gICAgYmFzZWQgb24gREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0VfVk9MVU1FX0NVUlZFIC0tPgorICAgICAgICA8cG9pbnQ+MCwtNDk1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4zMywtMzM1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42NiwtMTcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX05PTl9NVVRBQkxFX0VYVF9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBub24tbXV0YWJsZSBFeHQgTWVkaWEgU3lzdGVtIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICA8IS0tICAgICBiYXNlZCBvbiBERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FWFRfTUVESUFfVk9MVU1FX0NVUlZFIC0tPgorICAgICAgICA8cG9pbnQ+MCwtNTgwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4yMCwtNDAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42MCwtMjEwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsLTEwMDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9OT05fTVVUQUJMRV9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBub24tbXV0YWJsZSBIZWFyaW5nIEFpZCBWb2x1bWUgQ3VydmUgLS0+CisgICAgPCEtLSAgICAgYmFzZWQgb24gREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUgLS0+CisgICAgICAgIDxwb2ludD4wLC0xMjcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4yMCwtODAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42MCwtNDAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CiA8L3ZvbHVtZXM+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvaGVhcmluZ19haWRfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2hlYXJpbmdfYWlkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzQ4ZTg4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2hlYXJpbmdfYWlkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApAQCAtMCwwICsxLDE3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBIZWFyaW5nIGFpZCBBdWRpbyBIQUwgQXVkaW8gUG9saWN5IENvbmZpZ3VyYXRpb24gZmlsZSAtLT4KKzxtb2R1bGUgbmFtZT0iaGVhcmluZ19haWQiIGhhbFZlcnNpb249IjIuMCI+CisgICAgPG1peFBvcnRzPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJoZWFyaW5nIGFpZCBvdXRwdXQiIHJvbGU9InNvdXJjZSIgZmxhZ3M9IkFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMjQwMDAsMTYwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICA8L21peFBvcnQ+CisgICAgPC9taXhQb3J0cz4KKyAgICA8ZGV2aWNlUG9ydHM+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIEhlYXJpbmcgQWlkIE91dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRCIgcm9sZT0ic2luayIvPgorICAgIDwvZGV2aWNlUG9ydHM+CisgICAgPHJvdXRlcz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQlQgSGVhcmluZyBBaWQgT3V0IiBzb3VyY2VzPSJoZWFyaW5nIGFpZCBvdXRwdXQiLz4KKyAgICA8L3JvdXRlcz4KKzwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmgKaW5kZXggNTY3ZmY5ZS4uMDQ1OTRmNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oCkBAIC0xMzcsNCArMTM3LDQgQEAKICAgICB2aXJ0dWFsIH5BdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UoKSB7fQogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIuaAppbmRleCA4NDZmYTQ4Li5iNzkwMmNmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlci5oCkBAIC01OSw0ICs1OSw0IEBACiAgICAgdmlydHVhbCB+QXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIoKSB7fQogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbmNsdWRlL0F1ZGlvUG9saWN5RW5naW5lSW5zdGFuY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbmNsdWRlL0F1ZGlvUG9saWN5RW5naW5lSW5zdGFuY2UuaAppbmRleCA2YzRiZTJjLi5hNTk3ZTg3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZS9BdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2luY2x1ZGUvQXVkaW9Qb2xpY3lFbmdpbmVJbnN0YW5jZS5oCkBAIC03Niw2ICs3Niw2IEBACiB0ZW1wbGF0ZSA8PgogQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UgKkVuZ2luZUluc3RhbmNlOjpxdWVyeUludGVyZmFjZSgpIGNvbnN0OwogCi19OyAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaAppbmRleCA3NTlkMGM5Li4yZTI5YTliIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2ludGVyZmFjZS9BdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oCkBAIC0xNDMsNCArMTQzLDQgQEAKICAgICB2aXJ0dWFsIH5BdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZSgpIHt9CiB9OwogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmgKaW5kZXggYmM1ZTAzNS4uMzI4ZDIzZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5oCkBAIC0xOTQsNyArMTk0LDcgQEAKICAgICBBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqbUFwbU9ic2VydmVyOwogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQorfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2F1ZGlvX3BvbGljeV9jcml0ZXJpYV9jb25mLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9hdWRpb19wb2xpY3lfY3JpdGVyaWFfY29uZi5oCmluZGV4IDMxYjdlMGYuLmU0ZmQxNzYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2F1ZGlvX3BvbGljeV9jcml0ZXJpYV9jb25mLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvYXVkaW9fcG9saWN5X2NyaXRlcmlhX2NvbmYuaApAQCAtNjIsNyArNjIsOCBAQAogICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0tdID0gICAgICAgICAgICAgICAgICJGb3JjZVVzZUZvckRvY2siLAogICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPSAgICAgICAgICAgICAgICJGb3JjZVVzZUZvclN5c3RlbSIsCiAgICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfSERNSV9TWVNURU1fQVVESU9dID0gICAgIkZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIiwKLSAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5EXSA9ICAgICAiRm9yY2VVc2VGb3JFbmNvZGVkU3Vycm91bmQiCisgICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORF0gPSAgICAgIkZvcmNlVXNlRm9yRW5jb2RlZFN1cnJvdW5kIiwKKyAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9WSUJSQVRFX1JJTkdJTkddID0gICAgICAiRm9yY2VVc2VGb3JWaWJyYXRlUmluZ2luZyIKIH07CiAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5jcHAKaW5kZXggOWJkYjk4Yy4uODNhZWMzYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuY3BwCkBAIC0xNTQsNiArMTU0LDEzIEBACiAgICAgICAgIH0KICAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1ZJQlJBVEVfUklOR0lORzoKKyAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSkgeworICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9WSUJSQVRFX1JJTkdJTkciLCBjb25maWcpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOworICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIHVzYWdlICVkIiwgdXNhZ2UpOwogICAgICAgICBicmVhazsgLy8gVE9ETyByZXR1cm4gQkFEX1ZBTFVFPwpAQCAtMjM4LDE4ICsyNDUsMTkgQEAKICAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cyA9IG1BcG1PYnNlcnZlci0+Z2V0T3V0cHV0cygpOwogCiAgICAgcmV0dXJuIGdldERldmljZUZvclN0cmF0ZWd5SW50KHN0cmF0ZWd5LCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMsICh1aW50MzJfdClBVURJT19ERVZJQ0VfTk9ORSk7CiB9CiAKIAotCiBhdWRpb19kZXZpY2VzX3QgRW5naW5lOjpnZXREZXZpY2VGb3JTdHJhdGVneUludChyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZU91dHB1dERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlSW5wdXREZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gJm91dHB1dHMpIGNvbnN0CisgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVPdXRwdXREZXZpY2VzLAorICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlSW5wdXREZXZpY2VzLAorICAgICAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cywKKyAgICAgICAgdWludDMyX3Qgb3V0cHV0RGV2aWNlVHlwZXNUb0lnbm9yZSkgY29uc3QKIHsKICAgICB1aW50MzJfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICB1aW50MzJfdCBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKTsKKyAgICB1aW50MzJfdCBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSA9CisgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkgJiB+b3V0cHV0RGV2aWNlVHlwZXNUb0lnbm9yZTsKIAogICAgIHN3aXRjaCAoc3RyYXRlZ3kpIHsKIApAQCAtMjU4LDQwICsyNjYsMjYgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMOgotICAgICAgICBpZiAoaXNJbkNhbGwoKSkgeworICAgICAgICBpZiAoaXNJbkNhbGwoKSB8fCBvdXRwdXRzLmlzU3RyZWFtQWN0aXZlTG9jYWxseShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkpIHsKICAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5SW50KAotICAgICAgICAgICAgICAgICAgICBTVFJBVEVHWV9TT05JRklDQVRJT04sIGF2YWlsYWJsZU91dHB1dERldmljZXMsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgb3V0cHV0cyk7Ci0gICAgICAgIH0gZWxzZSBpZiAob3V0cHV0cy5pc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KEFVRElPX1NUUkVBTV9NVVNJQywKLSAgICAgICAgICAgICAgICBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSkpIHsKLSAgICAgICAgICAgIC8vIHdoaWxlIG1lZGlhIGlzIHBsYXlpbmcgb24gYSByZW1vdGUgZGV2aWNlLCB1c2UgdGhlIHRoZSBzb25pZmljYXRpb24gYmVoYXZpb3IuCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgdGVzdCB0aGlzIHVzZWNhc2UgYmVmb3JlIHRlc3RpbmcgaWYgbWVkaWEgaXMgcGxheWluZyBiZWNhdXNlCi0gICAgICAgICAgICAvLyAgIHRoZSBpc1N0cmVhbUFjdGl2ZSgpIG1ldGhvZCBvbmx5IGluZm9ybXMgYWJvdXQgdGhlIGFjdGl2aXR5IG9mIGEgc3RyZWFtLCBub3QKLSAgICAgICAgICAgIC8vICAgaWYgaXQncyBmb3IgbG9jYWwgcGxheWJhY2suIE5vdGUgYWxzbyB0aGF0IHdlIHVzZSB0aGUgc2FtZSBkZWxheSBiZXR3ZWVuIGJvdGggdGVzdHMKLSAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5SW50KAotICAgICAgICAgICAgICAgICAgICBTVFJBVEVHWV9TT05JRklDQVRJT04sIGF2YWlsYWJsZU91dHB1dERldmljZXMsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgb3V0cHV0cyk7Ci0gICAgICAgICAgICAvL3VzZXIgInNhZmUiIHNwZWFrZXIgaWYgYXZhaWxhYmxlIGluc3RlYWQgb2Ygbm9ybWFsIHNwZWFrZXIgdG8gYXZvaWQgdHJpZ2dlcmluZwotICAgICAgICAgICAgLy9vdGhlciBhY291c3RpYyBzYWZldHkgbWVjaGFuaXNtcyBmb3Igbm90aWZpY2F0aW9uCi0gICAgICAgICAgICBpZiAoKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikgJiYKLSAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlIHw9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFOwotICAgICAgICAgICAgICAgIGRldmljZSAmPSB+QVVESU9fREVWSUNFX09VVF9TUEVBS0VSOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG91dHB1dHMuaXNTdHJlYW1BY3RpdmUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9NVVNJQywgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkpCi0gICAgICAgICAgICAgICAgICAgIHx8IG91dHB1dHMuaXNTdHJlYW1BY3RpdmUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFksIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gd2hpbGUgbWVkaWEvYTExeSBpcyBwbGF5aW5nIChvciBoYXMgcmVjZW50bHkgcGxheWVkKSwgdXNlIHRoZSBzYW1lIGRldmljZQotICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3lJbnQoCi0gICAgICAgICAgICAgICAgICAgIFNUUkFURUdZX01FRElBLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMpOworICAgICAgICAgICAgICAgICAgICBTVFJBVEVHWV9TT05JRklDQVRJT04sIGF2YWlsYWJsZU91dHB1dERldmljZXMsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlVHlwZXNUb0lnbm9yZSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyB3aGVuIG1lZGlhIGlzIG5vdCBwbGF5aW5nIGFueW1vcmUsIGZhbGwgYmFjayBvbiB0aGUgc29uaWZpY2F0aW9uIGJlaGF2aW9yCi0gICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneUludCgKLSAgICAgICAgICAgICAgICAgICAgU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMpOwotICAgICAgICAgICAgLy91c2VyICJzYWZlIiBzcGVha2VyIGlmIGF2YWlsYWJsZSBpbnN0ZWFkIG9mIG5vcm1hbCBzcGVha2VyIHRvIGF2b2lkIHRyaWdnZXJpbmcKLSAgICAgICAgICAgIC8vb3RoZXIgYWNvdXN0aWMgc2FmZXR5IG1lY2hhbmlzbXMgZm9yIG5vdGlmaWNhdGlvbgotICAgICAgICAgICAgaWYgKChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpICYmCi0gICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKSkgeworICAgICAgICAgICAgYm9vbCBtZWRpYV9hY3RpdmVfbG9jYWxseSA9CisgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuaXNTdHJlYW1BY3RpdmVMb2NhbGx5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9NVVNJQywgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkpCisgICAgICAgICAgICAgICAgICAgIHx8IG91dHB1dHMuaXNTdHJlYW1BY3RpdmVMb2NhbGx5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZLCBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSk7CisgICAgICAgICAgICAvLyByb3V0aW5nIGlzIHNhbWUgYXMgbWVkaWEgd2l0aG91dCB0aGUgInJlbW90ZSIgZGV2aWNlCisgICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneUludChTVFJBVEVHWV9NRURJQSwKKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVggfCBvdXRwdXREZXZpY2VUeXBlc1RvSWdub3JlKTsKKyAgICAgICAgICAgIC8vIGlmIG5vIG1lZGlhIGlzIHBsYXlpbmcgb24gdGhlIGRldmljZSwgY2hlY2sgZm9yIG1hbmRhdG9yeSB1c2Ugb2YgInNhZmUiIHNwZWFrZXIKKyAgICAgICAgICAgIC8vIHdoZW4gbWVkaWEgd291bGQgaGF2ZSBwbGF5ZWQgb24gc3BlYWtlciwgYW5kIHRoZSBzYWZlIHNwZWFrZXIgcGF0aCBpcyBhdmFpbGFibGUKKyAgICAgICAgICAgIGlmICghbWVkaWFfYWN0aXZlX2xvY2FsbHkKKyAgICAgICAgICAgICAgICAgICAgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikKKyAgICAgICAgICAgICAgICAgICAgJiYgKGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpKSB7CiAgICAgICAgICAgICAgICAgZGV2aWNlIHw9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFOwogICAgICAgICAgICAgICAgIGRldmljZSAmPSB+QVVESU9fREVWSUNFX09VVF9TUEVBS0VSOwogICAgICAgICAgICAgfQpAQCAtMzAyLDcgKzI5Niw4IEBACiAgICAgICAgIGlmICghaXNJbkNhbGwoKSkgewogICAgICAgICAgICAgLy8gd2hlbiBvZmYgY2FsbCwgRFRNRiBzdHJhdGVneSBmb2xsb3dzIHRoZSBzYW1lIHJ1bGVzIGFzIE1FRElBIHN0cmF0ZWd5CiAgICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneUludCgKLSAgICAgICAgICAgICAgICAgICAgU1RSQVRFR1lfTUVESUEsIGF2YWlsYWJsZU91dHB1dERldmljZXMsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgb3V0cHV0cyk7CisgICAgICAgICAgICAgICAgICAgIFNUUkFURUdZX01FRElBLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgIG91dHB1dERldmljZVR5cGVzVG9JZ25vcmUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgLy8gd2hlbiBpbiBjYWxsLCBEVE1GIGFuZCBQSE9ORSBzdHJhdGVnaWVzIGZvbGxvdyB0aGUgc2FtZSBydWxlcwpAQCAtMzE4LDggKzMxMywxNCBAQAogICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBwcmltYXJ5T3V0cHV0ID0gb3V0cHV0cy5nZXRQcmltYXJ5T3V0cHV0KCk7CiAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxQcmltYXJ5SW5wdXREZXZpY2VzID0KICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tSHdNb2R1bGUocHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCkpOworCisgICAgICAgICAgICAvLyBUT0RPOiBnZXRQcmltYXJ5T3V0cHV0IHJldHVybiBvbmx5IGRldmljZXMgZnJvbSBmaXJzdCBtb2R1bGUgaW4KKyAgICAgICAgICAgIC8vIGF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCwgaGVhcmluZyBhaWQgaXMgbm90IHRoZXJlLCBidXQgaXQncworICAgICAgICAgICAgLy8gYSBwcmltYXJ5IGRldmljZQorICAgICAgICAgICAgLy8gRklYTUU6IHRoaXMgaXMgbm90IHRoZSByaWdodCB3YXkgb2Ygc29sdmluZyB0aGlzIHByb2JsZW0KICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbFByaW1hcnlPdXRwdXREZXZpY2VzID0KLSAgICAgICAgICAgICAgICAgICAgcHJpbWFyeU91dHB1dC0+c3VwcG9ydGVkRGV2aWNlcygpICYgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpOworICAgICAgICAgICAgICAgIChwcmltYXJ5T3V0cHV0LT5zdXBwb3J0ZWREZXZpY2VzKCkgfCBBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEKSAmCisgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpOwogCiAgICAgICAgICAgICBpZiAoKChhdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSAmCiAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlggJiB+QVVESU9fREVWSUNFX0JJVF9JTikgPT0gMCkgfHwKQEAgLTM0NCwxMCArMzQ1LDEyIEBACiAgICAgICAgICAgICAvLyBGQUxMIFRIUk9VR0gKIAogICAgICAgICBkZWZhdWx0OiAgICAvLyBGT1JDRV9OT05FCisgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQ7CisgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKICAgICAgICAgICAgIC8vIHdoZW4gbm90IGluIGEgcGhvbmUgY2FsbCwgcGhvbmUgc3RyYXRlZ3kgc2hvdWxkIHJvdXRlIFNUUkVBTV9WT0lDRV9DQUxMIHRvIEEyRFAKICAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSAmJgogICAgICAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgotICAgICAgICAgICAgICAgICAgICAob3V0cHV0cy5nZXRBMmRwT3V0cHV0KCkgIT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuaXNBMmRwU3VwcG9ydGVkKCkpIHsKICAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFA7CiAgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CiAgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM7CkBAIC0zODEsNyArMzg0LDcgQEAKICAgICAgICAgICAgIC8vIEEyRFAgc3BlYWtlciB3aGVuIGZvcmNpbmcgdG8gc3BlYWtlciBvdXRwdXQKICAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSAmJgogICAgICAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgotICAgICAgICAgICAgICAgICAgICAob3V0cHV0cy5nZXRBMmRwT3V0cHV0KCkgIT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuaXNBMmRwU3VwcG9ydGVkKCkpIHsKICAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUjsKICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTQwNiw5ICs0MDksMTAgQEAKIAogICAgICAgICAvLyBJZiBpbmNhbGwsIGp1c3Qgc2VsZWN0IHRoZSBTVFJBVEVHWV9QSE9ORSBkZXZpY2U6IFRoZSByZXN0IG9mIHRoZSBiZWhhdmlvciBpcyBoYW5kbGVkIGJ5CiAgICAgICAgIC8vIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpLgotICAgICAgICBpZiAoaXNJbkNhbGwoKSkgeworICAgICAgICBpZiAoaXNJbkNhbGwoKSB8fCBvdXRwdXRzLmlzU3RyZWFtQWN0aXZlTG9jYWxseShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkpIHsKICAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5SW50KAotICAgICAgICAgICAgICAgICAgICBTVFJBVEVHWV9QSE9ORSwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzKTsKKyAgICAgICAgICAgICAgICAgICAgU1RSQVRFR1lfUEhPTkUsIGF2YWlsYWJsZU91dHB1dERldmljZXMsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlVHlwZXNUb0lnbm9yZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICAvLyBGQUxMIFRIUk9VR0gKQEAgLTQyNiw4ICs0MzAsNyBAQAogCiAgICAgICAgIC8vIGlmIFNDTyBoZWFkc2V0IGlzIGNvbm5lY3RlZCBhbmQgd2UgYXJlIHRvbGQgdG8gdXNlIGl0LCBwbGF5IHJpbmd0b25lIG92ZXIKICAgICAgICAgLy8gc3BlYWtlciBhbmQgQlQgU0NPCi0gICAgICAgIGlmICgoKGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9BTExfU0NPKSAhPSAwKSAmJgotICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSkgeworICAgICAgICBpZiAoKGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9BTExfU0NPKSAhPSAwKSB7CiAgICAgICAgICAgICB1aW50MzJfdCBkZXZpY2UyID0gQVVESU9fREVWSUNFX05PTkU7CiAgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUOwogICAgICAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKQEAgLTQzNiwxMCArNDM5LDIzIEBACiAgICAgICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewogICAgICAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDTzsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGRldmljZTIgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UgfD0gZGV2aWNlMjsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8vIFVzZSBPTkxZIEJsdWV0b290aCBTQ08gb3V0cHV0IHdoZW4gcmluZ2luZyBpbiB2aWJyYXRpb24gbW9kZQorICAgICAgICAgICAgaWYgKCEoKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpKSkgeworICAgICAgICAgICAgICAgIGlmIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9WSUJSQVRFX1JJTkdJTkddCisgICAgICAgICAgICAgICAgICAgICAgICA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2UyICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UgPSBkZXZpY2UyOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBVc2UgYm90aCBCbHVldG9vdGggU0NPIGFuZCBwaG9uZSBkZWZhdWx0IG91dHB1dCB3aGVuIHJpbmdpbmcgaW4gbm9ybWFsIG1vZGUKKyAgICAgICAgICAgIGlmIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSB7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZTIgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlIHw9IGRldmljZTI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvLyBUaGUgc2Vjb25kIGRldmljZSB1c2VkIGZvciBzb25pZmljYXRpb24gaXMgdGhlIHNhbWUgYXMgdGhlIGRldmljZSB1c2VkIGJ5IG1lZGlhIHN0cmF0ZWd5CkBAIC00NjMsMTEgKzQ3OSwxMyBAQAogICAgICAgICAgICAgaWYgKG91dHB1dHMuaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX1JJTkcpIHx8CiAgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX0FMQVJNKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBnZXREZXZpY2VGb3JTdHJhdGVneUludCgKLSAgICAgICAgICAgICAgICAgICAgU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMpOworICAgICAgICAgICAgICAgICAgICBTVFJBVEVHWV9TT05JRklDQVRJT04sIGF2YWlsYWJsZU91dHB1dERldmljZXMsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlVHlwZXNUb0lnbm9yZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoaXNJbkNhbGwoKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBnZXREZXZpY2VGb3JTdHJhdGVneUludCgKLSAgICAgICAgICAgICAgICAgICAgICAgIFNUUkFURUdZX1BIT05FLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMpOworICAgICAgICAgICAgICAgICAgICAgICAgU1RSQVRFR1lfUEhPTkUsIGF2YWlsYWJsZU91dHB1dERldmljZXMsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERldmljZVR5cGVzVG9JZ25vcmUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8vIEZvciBvdGhlciBjYXNlcywgU1RSQVRFR1lfQUNDRVNTSUJJTElUWSBiZWhhdmVzIGxpa2UgU1RSQVRFR1lfTUVESUEKQEAgLTQ4NiwxMiArNTA0LDE2IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKGlzSW5DYWxsKCkgJiYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBKSkgewogICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3lJbnQoCi0gICAgICAgICAgICAgICAgICAgIFNUUkFURUdZX1BIT05FLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMpOworICAgICAgICAgICAgICAgICAgICBTVFJBVEVHWV9QSE9ORSwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXZpY2VUeXBlc1RvSWdub3JlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEOworICAgICAgICB9CiAgICAgICAgIGlmICgoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgJiYKICAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgotICAgICAgICAgICAgICAgIChvdXRwdXRzLmdldEEyZHBPdXRwdXQoKSAhPSAwKSkgeworICAgICAgICAgICAgICAgICBvdXRwdXRzLmlzQTJkcFN1cHBvcnRlZCgpKSB7CiAgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQOwogICAgICAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKICAgICAgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM7CkBAIC01OTEsNiArNjEzLDIzIEBACiAKICAgICB1aW50MzJfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKIAorICAgIC8vIHdoZW4gYSBjYWxsIGlzIGFjdGl2ZSwgZm9yY2UgZGV2aWNlIHNlbGVjdGlvbiB0byBtYXRjaCBzb3VyY2UgVk9JQ0VfQ09NTVVOSUNBVElPTgorICAgIC8vIGZvciBtb3N0IG90aGVyIGlucHV0IHNvdXJjZXMgdG8gYXZvaWQgcmVyb3V0aW5nIGNhbGwgVFggYXVkaW8KKyAgICBpZiAoaXNJbkNhbGwoKSkgeworICAgICAgICBzd2l0Y2ggKGlucHV0U291cmNlKSB7CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX0RFRkFVTFQ6CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX01JQzoKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT046CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1VOUFJPQ0VTU0VEOgorICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9IT1RXT1JEOgorICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9DQU1DT1JERVI6CisgICAgICAgICAgICBpbnB1dFNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHN3aXRjaCAoaW5wdXRTb3VyY2UpIHsKICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9VUExJTks6CiAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuaAppbmRleCA1NzUzOGM0Li4wNjE4NmMxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuaApAQCAtMTI2LDkgKzEyNiwxMCBAQAogICAgIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3lGb3JVc2FnZShhdWRpb191c2FnZV90IHVzYWdlKTsKICAgICBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkgY29uc3Q7CiAgICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvclN0cmF0ZWd5SW50KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVPdXRwdXREZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlSW5wdXREZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cykgY29uc3Q7CisgICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVJbnB1dERldmljZXMsCisgICAgICAgICAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cywKKyAgICAgICAgICAgIHVpbnQzMl90IG91dHB1dERldmljZVR5cGVzVG9JZ25vcmUpIGNvbnN0OwogICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSkgY29uc3Q7CiAgICAgYXVkaW9fbW9kZV90IG1QaG9uZVN0YXRlOyAgLyoqPCBjdXJyZW50IHBob25lIHN0YXRlLiAqLwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyL0F1ZGlvUG9saWN5RmFjdG9yeS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyL0F1ZGlvUG9saWN5RmFjdG9yeS5jcHAKaW5kZXggOTkxMGExZi4uM2VmYTFiMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlci9BdWRpb1BvbGljeUZhY3RvcnkuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXIvQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcApAQCAtMjksNCArMjksNCBAQAogICAgIGRlbGV0ZSBpbnRlcmZhY2U7CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcAppbmRleCBiZGZhZjJmLi5kMWQ3NTMwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKQEAgLTI2LDEzICsyNiwxNCBAQAogCiAjZGVmaW5lIEFVRElPX1BPTElDWV9YTUxfQ09ORklHX0ZJTEVfUEFUSF9NQVhfTEVOR1RIIDEyOAogI2RlZmluZSBBVURJT19QT0xJQ1lfWE1MX0NPTkZJR19GSUxFX05BTUUgImF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCIKKyNkZWZpbmUgQVVESU9fUE9MSUNZX0EyRFBfT0ZGTE9BRF9ESVNBQkxFRF9YTUxfQ09ORklHX0ZJTEVfTkFNRSBcCisgICAgICAgICJhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9hMmRwX29mZmxvYWRfZGlzYWJsZWQueG1sIgogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAKICNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxBdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KQEAgLTY4LDcgKzY5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpCiB7Ci0gICAgcmV0dXJuIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChkZXZpY2UsIHN0YXRlLCBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUpOworICAgIHN0YXR1c190IHN0YXR1cyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChkZXZpY2UsIHN0YXRlLCBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUpOworICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLApAQCAtODgsNyArOTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpCiB7CiAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludCgpIGRldmljZTogMHglWCwgc3RhdGUgJWQsIGFkZHJlc3MgJXMgbmFtZSAlcyIsCi0tICAgICAgICAgICAgZGV2aWNlLCBzdGF0ZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lKTsKKyAgICAgICAgICAgIGRldmljZSwgc3RhdGUsIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSk7CiAKICAgICAvLyBjb25uZWN0L2Rpc2Nvbm5lY3Qgb25seSAxIGRldmljZSBhdCBhIHRpbWUKICAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSAmJiAhYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpIHJldHVybiBCQURfVkFMVUU7CkBAIC0xODMsMTQgKzE4NiwxNCBAQAogICAgICAgICBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKICAgICAgICAgLy8gb3V0cHV0cyBtdXN0IGJlIGNsb3NlZCBhZnRlciBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKSBpcyBleGVjdXRlZAogICAgICAgICBpZiAoIW91dHB1dHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dHNbaV0pOworICAgICAgICAgICAgZm9yIChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgOiBvdXRwdXRzKSB7CisgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwogICAgICAgICAgICAgICAgIC8vIGNsb3NlIHVudXNlZCBvdXRwdXRzIGFmdGVyIGRldmljZSBkaXNjb25uZWN0aW9uIG9yIGRpcmVjdCBvdXRwdXRzIHRoYXQgaGF2ZSBiZWVuCiAgICAgICAgICAgICAgICAgLy8gb3BlbmVkIGJ5IGNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHRvIHF1ZXJ5IGR5bmFtaWMgcGFyYW1ldGVycwogICAgICAgICAgICAgICAgIGlmICgoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICgoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzYy0+bURpcmVjdE9wZW5Db3VudCA9PSAwKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2VPdXRwdXQob3V0cHV0c1tpXSk7CisgICAgICAgICAgICAgICAgICAgIGNsb3NlT3V0cHV0KG91dHB1dCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gY2hlY2sgYWdhaW4gYWZ0ZXIgY2xvc2luZyBBMkRQIG91dHB1dCB0byByZXNldCBtQTJkcFN1c3BlbmRlZCBpZiBuZWVkZWQKQEAgLTM4Nyw5ICszOTAsNiBAQAogdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1cGRhdGVDYWxsUm91dGluZyhhdWRpb19kZXZpY2VzX3QgcnhEZXZpY2UsIHVpbnQzMl90IGRlbGF5TXMpCiB7CiAgICAgYm9vbCBjcmVhdGVUeFBhdGNoID0gZmFsc2U7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGU7Ci0gICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3Q7CiAgICAgdWludDMyX3QgbXV0ZVdhaXRNcyA9IDA7CiAKICAgICBpZighaGFzUHJpbWFyeU91dHB1dCgpIHx8IG1QcmltYXJ5T3V0cHV0LT5kZXZpY2UoKSA9PSBBVURJT19ERVZJQ0VfT1VUX1NUVUIpIHsKQEAgLTQyMSw4NyArNDIxLDUzIEBACiAgICAgICAgICAgICBjcmVhdGVUeFBhdGNoID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7IC8vIGNyZWF0ZSBSWCBwYXRoIGF1ZGlvIHBhdGNoCi0gICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKLQotICAgICAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7Ci0gICAgICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7Ci0gICAgICAgIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUocnhEZXZpY2UpOwotICAgICAgICBBTE9HX0FTU0VSVCghZGV2aWNlTGlzdC5pc0VtcHR5KCksCi0gICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIHNlbGVjdGVkIGRldmljZSBub3QgaW4gb3V0cHV0IGRldmljZSBsaXN0Iik7Ci0gICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHJ4U2lua0RldmljZURlc2MgPSBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKLSAgICAgICAgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgpOwotICAgICAgICBBTE9HX0FTU0VSVCghZGV2aWNlTGlzdC5pc0VtcHR5KCksCi0gICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIG5vIHRlbGVwaG9ueSBSWCBkZXZpY2UiKTsKLSAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gcnhTb3VyY2VEZXZpY2VEZXNjID0gZGV2aWNlTGlzdC5pdGVtQXQoMCk7Ci0KLSAgICAgICAgcnhTb3VyY2VEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1swXSk7Ci0gICAgICAgIHJ4U2lua0RldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zaW5rc1swXSk7Ci0KLSAgICAgICAgLy8gcmVxdWVzdCB0byByZXVzZSBleGlzdGluZyBvdXRwdXQgc3RyZWFtIGlmIG9uZSBpcyBhbHJlYWR5IG9wZW5lZCB0byByZWFjaCB0aGUgUlggZGV2aWNlCi0gICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dHNGb3JEZXZpY2UocnhEZXZpY2UsIG1PdXRwdXRzKTsKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0lOVkFMSUQpOwotICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgICAgICAgICBBTE9HX0FTU0VSVCghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBSWCBkZXZpY2Ugb3V0cHV0IGlzIGR1cGxpY2F0ZWQiKTsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzFdKTsKLSAgICAgICAgICAgIHBhdGNoLnNvdXJjZXNbMV0uZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IEFVRElPX1NUUkVBTV9QQVRDSDsKLSAgICAgICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMjsKLSAgICAgICAgfQotCi0gICAgICAgIGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmYWZQYXRjaEhhbmRsZSwgZGVsYXlNcyk7Ci0gICAgICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgInVwZGF0ZUNhbGxSb3V0aW5nKCkgZXJyb3IgJWQgY3JlYXRpbmcgUlggYXVkaW8gcGF0Y2giLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtQ2FsbFJ4UGF0Y2ggPSBuZXcgQXVkaW9QYXRjaCgmcGF0Y2gsIG1VaWRDYWNoZWQpOwotICAgICAgICAgICAgbUNhbGxSeFBhdGNoLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7Ci0gICAgICAgICAgICBtQ2FsbFJ4UGF0Y2gtPm1VaWQgPSBtVWlkQ2FjaGVkOwotICAgICAgICB9CisgICAgICAgIG1DYWxsUnhQYXRjaCA9IGNyZWF0ZVRlbGVwaG9ueVBhdGNoKHRydWUgLyppc1J4Ki8sIHJ4RGV2aWNlLCBkZWxheU1zKTsKICAgICAgICAgY3JlYXRlVHhQYXRjaCA9IHRydWU7CiAgICAgfQogICAgIGlmIChjcmVhdGVUeFBhdGNoKSB7IC8vIGNyZWF0ZSBUWCBwYXRoIGF1ZGlvIHBhdGNoCi0gICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKKyAgICAgICAgbUNhbGxUeFBhdGNoID0gY3JlYXRlVGVsZXBob255UGF0Y2goZmFsc2UgLyppc1J4Ki8sIHR4RGV2aWNlLCBkZWxheU1zKTsKKyAgICB9CiAKLSAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOwotICAgICAgICBwYXRjaC5udW1fc2lua3MgPSAxOwotICAgICAgICBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUodHhEZXZpY2UpOwotICAgICAgICBBTE9HX0FTU0VSVCghZGV2aWNlTGlzdC5pc0VtcHR5KCksCi0gICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIHNlbGVjdGVkIGRldmljZSBub3QgaW4gaW5wdXQgZGV2aWNlIGxpc3QiKTsKLSAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gdHhTb3VyY2VEZXZpY2VEZXNjID0gZGV2aWNlTGlzdC5pdGVtQXQoMCk7Ci0gICAgICAgIHR4U291cmNlRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMF0pOwotICAgICAgICBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYKTsKLSAgICAgICAgQUxPR19BU1NFUlQoIWRldmljZUxpc3QuaXNFbXB0eSgpLAotICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBubyB0ZWxlcGhvbnkgVFggZGV2aWNlIik7Ci0gICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHR4U2lua0RldmljZURlc2MgPSBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKLSAgICAgICAgdHhTaW5rRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNpbmtzWzBdKTsKKyAgICByZXR1cm4gbXV0ZVdhaXRNczsKK30KIAotICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRzRm9yRGV2aWNlKEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYLCBtT3V0cHV0cyk7Ci0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9JTlZBTElEKTsKLSAgICAgICAgLy8gcmVxdWVzdCB0byByZXVzZSBleGlzdGluZyBvdXRwdXQgc3RyZWFtIGlmIG9uZSBpcyBhbHJlYWR5IG9wZW5lZCB0byByZWFjaCB0aGUgVFgKLSAgICAgICAgLy8gcGF0aCBvdXRwdXQgZGV2aWNlCi0gICAgICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgICAgICAgICBBTE9HX0FTU0VSVCghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBSWCBkZXZpY2Ugb3V0cHV0IGlzIGR1cGxpY2F0ZWQiKTsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzFdKTsKLSAgICAgICAgICAgIHBhdGNoLnNvdXJjZXNbMV0uZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IEFVRElPX1NUUkVBTV9QQVRDSDsKLSAgICAgICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMjsKLSAgICAgICAgfQorc3A8QXVkaW9QYXRjaD4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjcmVhdGVUZWxlcGhvbnlQYXRjaCgKKyAgICAgICAgYm9vbCBpc1J4LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCB1aW50MzJfdCBkZWxheU1zKSB7CisgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOworICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKKyAgICBwYXRjaC5udW1fc2lua3MgPSAxOwogCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gdHhTb3VyY2VEZXZpY2VEZXNjOworICAgIGlmIChpc1J4KSB7CisgICAgICAgIGZpbGxBdWRpb1BvcnRDb25maWdGb3JEZXZpY2UobUF2YWlsYWJsZU91dHB1dERldmljZXMsIGRldmljZSwgJnBhdGNoLnNpbmtzWzBdKTsKKyAgICAgICAgZmlsbEF1ZGlvUG9ydENvbmZpZ0ZvckRldmljZSgKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLCBBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYLCAmcGF0Y2guc291cmNlc1swXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHhTb3VyY2VEZXZpY2VEZXNjID0gZmlsbEF1ZGlvUG9ydENvbmZpZ0ZvckRldmljZSgKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLCBkZXZpY2UsICZwYXRjaC5zb3VyY2VzWzBdKTsKKyAgICAgICAgZmlsbEF1ZGlvUG9ydENvbmZpZ0ZvckRldmljZSgKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgsICZwYXRjaC5zaW5rc1swXSk7CisgICAgfQorCisgICAgYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZSA9IGlzUnggPyBkZXZpY2UgOiBBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWDsKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKG91dHB1dERldmljZSwgbU91dHB1dHMpOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzLCBBVURJT19PVVRQVVRfRkxBR19OT05FLCBBVURJT19GT1JNQVRfSU5WQUxJRCk7CisgICAgLy8gcmVxdWVzdCB0byByZXVzZSBleGlzdGluZyBvdXRwdXQgc3RyZWFtIGlmIG9uZSBpcyBhbHJlYWR5IG9wZW5lZCB0byByZWFjaCB0aGUgdGFyZ2V0IGRldmljZQorICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICAgICAgQUxPR19BU1NFUlQoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpLAorICAgICAgICAgICAgICAgICIlcygpICUjeCBkZXZpY2Ugb3V0cHV0ICVkIGlzIGR1cGxpY2F0ZWQiLCBfX2Z1bmNfXywgb3V0cHV0RGV2aWNlLCBvdXRwdXQpOworICAgICAgICBvdXRwdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1sxXSk7CisgICAgICAgIHBhdGNoLnNvdXJjZXNbMV0uZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IEFVRElPX1NUUkVBTV9QQVRDSDsKKyAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAyOworICAgIH0KKworICAgIGlmICghaXNSeCkgewogICAgICAgICAvLyB0ZXJtaW5hdGUgYWN0aXZlIGNhcHR1cmUgaWYgb24gdGhlIHNhbWUgSFcgbW9kdWxlIGFzIHRoZSBjYWxsIFRYIHNvdXJjZSBkZXZpY2UKICAgICAgICAgLy8gRklYTUU6IHdvdWxkIGJlIGJldHRlciB0byByZWZpbmUgdG8gb25seSBpbnB1dHMgd2hvc2UgcHJvZmlsZSBjb25uZWN0cyB0byB0aGUKICAgICAgICAgLy8gY2FsbCBUWCBkZXZpY2UgYnV0IHRoaXMgaW5mb3JtYXRpb24gaXMgbm90IGluIHRoZSBhdWRpbyBwYXRjaCBhbmQgbG9naWMgaGVyZSBtdXN0IGJlCiAgICAgICAgIC8vIHN5bW1ldHJpYyB0byB0aGUgb25lIGluIHN0YXJ0SW5wdXQoKQotICAgICAgICBWZWN0b3I8c3AgPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiA+IGFjdGl2ZUlucHV0cyA9IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXRzKCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0aXZlSW5wdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gYWN0aXZlRGVzYyA9IGFjdGl2ZUlucHV0c1tpXTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhY3RpdmVEZXNjIDogbUlucHV0cy5nZXRBY3RpdmVJbnB1dHMoKSkgewogICAgICAgICAgICAgaWYgKGFjdGl2ZURlc2MtPmhhc1NhbWVId01vZHVsZUFzKHR4U291cmNlRGV2aWNlRGVzYykpIHsKICAgICAgICAgICAgICAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIGFjdGl2ZVNlc3Npb25zID0KICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZURlc2MtPmdldEF1ZGlvU2Vzc2lvbnModHJ1ZSAvKmFjdGl2ZU9ubHkqLyk7CkBAIC01MTIsMTkgKzQ3OCwyOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmYWZQYXRjaEhhbmRsZSwgZGVsYXlNcyk7Ci0gICAgICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgInNldFBob25lU3RhdGUoKSBlcnJvciAlZCBjcmVhdGluZyBUWCBhdWRpbyBwYXRjaCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIG1DYWxsVHhQYXRjaCA9IG5ldyBBdWRpb1BhdGNoKCZwYXRjaCwgbVVpZENhY2hlZCk7Ci0gICAgICAgICAgICBtQ2FsbFR4UGF0Y2gtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgIG1DYWxsVHhQYXRjaC0+bVVpZCA9IG1VaWRDYWNoZWQ7Ci0gICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gbXV0ZVdhaXRNczsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmYWZQYXRjaEhhbmRsZSwgZGVsYXlNcyk7CisgICAgQUxPR1dfSUYoc3RhdHVzICE9IE5PX0VSUk9SLAorICAgICAgICAgICAgIiVzKCkgZXJyb3IgJWQgY3JlYXRpbmcgJXMgYXVkaW8gcGF0Y2giLCBfX2Z1bmNfXywgc3RhdHVzLCBpc1J4ID8gIlJYIiA6ICJUWCIpOworICAgIHNwPEF1ZGlvUGF0Y2g+IGF1ZGlvUGF0Y2g7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBhdWRpb1BhdGNoID0gbmV3IEF1ZGlvUGF0Y2goJnBhdGNoLCBtVWlkQ2FjaGVkKTsKKyAgICAgICAgYXVkaW9QYXRjaC0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOworICAgICAgICBhdWRpb1BhdGNoLT5tVWlkID0gbVVpZENhY2hlZDsKKyAgICB9CisgICAgcmV0dXJuIGF1ZGlvUGF0Y2g7Cit9CisKK3NwPERldmljZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6ZmlsbEF1ZGlvUG9ydENvbmZpZ0ZvckRldmljZSgKKyAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3QgPSBkZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOworICAgIEFMT0dfQVNTRVJUKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSwKKyAgICAgICAgICAgICIlcygpIHNlbGVjdGVkIGRldmljZSB0eXBlICUjeCBpcyBub3QgaW4gZGV2aWNlcyBsaXN0IiwgX19mdW5jX18sIGRldmljZSk7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYyA9IGRldmljZUxpc3QuaXRlbUF0KDApOworICAgIGRldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CisgICAgcmV0dXJuIGRldmljZURlc2M7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKQEAgLTYxNCw2ICs1OTAsMTYgQEAKICAgICAgICAgICAgIHNldE91dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgcnhEZXZpY2UsIGZvcmNlLCAwKTsKICAgICAgICAgfQogICAgIH0KKworICAgIC8vIHJlZXZhbHVhdGUgcm91dGluZyBvbiBhbGwgb3V0cHV0cyBpbiBjYXNlIHRyYWNrcyBoYXZlIGJlZW4gc3RhcnRlZCBkdXJpbmcgdGhlIGNhbGwKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShkZXNjLCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICBpZiAoc3RhdGUgIT0gQVVESU9fTU9ERV9JTl9DQUxMIHx8IGRlc2MgIT0gbVByaW1hcnlPdXRwdXQpIHsKKyAgICAgICAgICAgIHNldE91dHB1dERldmljZShkZXNjLCBuZXdEZXZpY2UsIChuZXdEZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpLCAwIC8qZGVsYXlNcyovKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIGlmIGVudGVyaW5nIGluIGNhbGwgc3RhdGUsIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgYWN0aXZlIHN0cmVhbXMKICAgICAvLyBwZXJ0YWluaW5nIHRvIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBzZWUgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkKICAgICBpZiAoaXNTdGF0ZUluQ2FsbChzdGF0ZSkpIHsKQEAgLTY4Myw5ICs2NjksNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgVmVjdG9yPHNwIDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gPiBhY3RpdmVJbnB1dHMgPSBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0aXZlSW5wdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBhY3RpdmVEZXNjID0gYWN0aXZlSW5wdXRzW2ldOworICAgIGZvciAoY29uc3QgYXV0byYgYWN0aXZlRGVzYyA6IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXRzKCkpIHsKICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld0lucHV0RGV2aWNlKGFjdGl2ZURlc2MpOwogICAgICAgICAvLyBGb3JjZSBuZXcgaW5wdXQgc2VsZWN0aW9uIGlmIHRoZSBuZXcgZGV2aWNlIGNhbiBub3QgYmUgcmVhY2hlZCB2aWEgY3VycmVudCBpbnB1dAogICAgICAgICBpZiAoYWN0aXZlRGVzYy0+bVByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKS50eXBlcygpICYKQEAgLTcyMSwxMiArNzA1LDggQEAKIAogICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZTsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9PSAwKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBjdXJQcm9maWxlID0gbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzW2pdOworICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBtSHdNb2R1bGVzKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgY3VyUHJvZmlsZSA6IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpKSB7CiAgICAgICAgICAgICBpZiAoIWN1clByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2aWNlLCBTdHJpbmc4KCIiKSwKICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLCBOVUxMIC8qdXBkYXRlZFNhbXBsaW5nUmF0ZSovLAogICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIE5VTEwgLyp1cGRhdGVkRm9ybWF0Ki8sCkBAIC03NTEsMjAgKzczMSwyMiBAQAogICAgIHJldHVybiBwcm9maWxlOwogfQogCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKIHsKICAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koc3RyZWFtKTsKICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgIEFMT0dWKCJnZXRPdXRwdXQoKSBkZXZpY2UgJWQsIHN0cmVhbSAlZCwgc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJXgsIGNoYW5uZWxNYXNrICV4LCBmbGFncyAleCIsCi0gICAgICAgICAgZGV2aWNlLCBzdHJlYW0sIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MpOwogCi0gICAgcmV0dXJuIGdldE91dHB1dEZvckRldmljZShkZXZpY2UsIEFVRElPX1NFU1NJT05fQUxMT0NBVEUsIHN0cmVhbSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZmxhZ3MsIG9mZmxvYWRJbmZvKTsKKyAgICAvLyBOb3RlIHRoYXQgcmVsYXRlZCBtZXRob2QgZ2V0T3V0cHV0Rm9yQXR0cigpIHVzZXMgZ2V0T3V0cHV0Rm9yRGV2aWNlKCkgbm90IHNlbGVjdE91dHB1dCgpLgorICAgIC8vIFdlIHVzZSBzZWxlY3RPdXRwdXQoKSBoZXJlIHNpbmNlIHdlIGRvbid0IGhhdmUgdGhlIGRlc2lyZWQgQXVkaW9UcmFjayBzYW1wbGUgcmF0ZSwKKyAgICAvLyBmb3JtYXQsIGZsYWdzLCBldGMuIFRoaXMgbWF5IHJlc3VsdCBpbiBzb21lIGRpc2NyZXBhbmN5IGZvciBmdW5jdGlvbnMgdGhhdCB1dGlsaXplCisgICAgLy8gZ2V0T3V0cHV0KCkgc29sZWx5IG9uIGF1ZGlvX3N0cmVhbV90eXBlIHN1Y2ggYXMgQXVkaW9TeXN0ZW06OmdldE91dHB1dEZyYW1lQ291bnQoKQorICAgIC8vIGFuZCBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0U2FtcGxpbmdSYXRlKCkuCisKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKGRldmljZSwgbU91dHB1dHMpOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzLCBBVURJT19PVVRQVVRfRkxBR19OT05FLCBBVURJT19GT1JNQVRfSU5WQUxJRCk7CisKKyAgICBBTE9HVigiZ2V0T3V0cHV0KCkgc3RyZWFtICVkIHNlbGVjdGVkIGRldmljZSAlMDh4LCBvdXRwdXQgJWQiLCBzdHJlYW0sIGRldmljZSwgb3V0cHV0KTsKKyAgICByZXR1cm4gb3V0cHV0OwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLApAQCAtNzczLDcgKzc1NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkKIHsKQEAgLTgyNSwxMiArODA3LDcgQEAKICAgICAvLyBFeHBsaWNpdCByb3V0aW5nPwogICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2M7CiAgICAgaWYgKCpzZWxlY3RlZERldmljZUlkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldLT5nZXRJZCgpID09ICpzZWxlY3RlZERldmljZUlkKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlRGVzYyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIGRldmljZURlc2MgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoKnNlbGVjdGVkRGV2aWNlSWQpOwogICAgIH0KICAgICBtT3V0cHV0Um91dGVzLmFkZFJvdXRlKHNlc3Npb24sICpzdHJlYW0sIFNlc3Npb25Sb3V0ZTo6U09VUkNFX1RZUEVfTkEsIGRldmljZURlc2MsIHVpZCk7CiAKQEAgLTgzOCwxNSArODE1LDE0IEBACiAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKIAogICAgIGlmICgoYXR0cmlidXRlcy5mbGFncyAmIEFVRElPX0ZMQUdfSFdfQVZfU1lOQykgIT0gMCkgewotICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKTsKKyAgICAgICAgKmZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSgqZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKTsKICAgICB9CiAKLSAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yQXR0cigpIGRldmljZSAweCV4LCBzYW1wbGluZ1JhdGUgJWQsIGZvcm1hdCAleCwgY2hhbm5lbE1hc2sgJXgsIGZsYWdzICV4IiwKLSAgICAgICAgICBkZXZpY2UsIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywgZmxhZ3MpOworICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JBdHRyKCkgZGV2aWNlIDB4JXgsIHNhbXBsaW5nIHJhdGUgJWQsIGZvcm1hdCAlI3gsIGNoYW5uZWwgbWFzayAlI3gsICIKKyAgICAgICAgICAiZmxhZ3MgJSN4IiwKKyAgICAgICAgICBkZXZpY2UsIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywgKmZsYWdzKTsKIAotICAgICpvdXRwdXQgPSBnZXRPdXRwdXRGb3JEZXZpY2UoZGV2aWNlLCBzZXNzaW9uLCAqc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsICZjb25maWctPm9mZmxvYWRfaW5mbyk7CisgICAgKm91dHB1dCA9IGdldE91dHB1dEZvckRldmljZShkZXZpY2UsIHNlc3Npb24sICpzdHJlYW0sIGNvbmZpZywgZmxhZ3MpOwogICAgIGlmICgqb3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIG1PdXRwdXRSb3V0ZXMucmVtb3ZlUm91dGUoc2Vzc2lvbik7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTg2NSw5MiArODQxLDUzIEBACiAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQorICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAqZmxhZ3MpCiB7CiAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogCi0jaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKLSAgICBpZiAobUN1ck91dHB1dCAhPSAwKSB7Ci0gICAgICAgIEFMT0dWKCJnZXRPdXRwdXQoKSB0ZXN0IG91dHB1dCBtQ3VyT3V0cHV0ICVkLCBzYW1wbGluZ1JhdGUgJWQsIGZvcm1hdCAlZCwgY2hhbm5lbE1hc2sgJXgsIG1EaXJlY3RPdXRwdXQgJWQiLAotICAgICAgICAgICAgICAgIG1DdXJPdXRwdXQsIG1UZXN0U2FtcGxpbmdSYXRlLCBtVGVzdEZvcm1hdCwgbVRlc3RDaGFubmVscywgbURpcmVjdE91dHB1dCk7Ci0KLSAgICAgICAgaWYgKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgb3BlbmluZyB0ZXN0IG91dHB1dCIpOwotICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UpOwotICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSA9IG1UZXN0RGV2aWNlOwotICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUxhdGVuY3kgPSBtVGVzdExhdGVuY3lNczsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1GbGFncyA9Ci0gICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkobURpcmVjdE91dHB1dCA/IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCA6IDApOwotICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPSAwOwotICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOwotICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gbVRlc3RTYW1wbGluZ1JhdGU7Ci0gICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gbVRlc3RDaGFubmVsczsKLSAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBtVGVzdEZvcm1hdDsKLSAgICAgICAgICAgIGlmIChvZmZsb2FkSW5mbyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mbyA9ICpvZmZsb2FkSW5mbzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1MYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7Ci0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7Ci0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKLSAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRDbWQgPSBBdWRpb1BhcmFtZXRlcigpOwotICAgICAgICAgICAgICAgIG91dHB1dENtZC5hZGRJbnQoU3RyaW5nOCgic2V0X2lkIiksbUN1ck91dHB1dCk7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLG91dHB1dENtZC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBhZGRPdXRwdXQobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLCBvdXRwdXREZXNjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdOwotICAgIH0KLSNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCi0KICAgICAvLyBvcGVuIGEgZGlyZWN0IG91dHB1dCBpZiByZXF1aXJlZCBieSBzcGVjaWZpZWQgcGFyYW1ldGVycwogICAgIC8vZm9yY2UgZGlyZWN0IGZsYWcgaWYgb2ZmbG9hZCBmbGFnIGlzIHNldDogb2ZmbG9hZGluZyBpbXBsaWVzIGEgZGlyZWN0IG91dHB1dCBzdHJlYW0KICAgICAvLyBhbmQgYWxsIGNvbW1vbiBiZWhhdmlvcnMgYXJlIGRyaXZlbiBieSBjaGVja2luZyBvbmx5IHRoZSBkaXJlY3QgZmxhZwogICAgIC8vIHRoaXMgc2hvdWxkIG5vcm1hbGx5IGJlIHNldCBhcHByb3ByaWF0ZWx5IGluIHRoZSBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlCi0gICAgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKLSAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICBpZiAoKCpmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKKyAgICAgICAgKmZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSgqZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOwogICAgIH0KLSAgICBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQykgIT0gMCkgewotICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgIGlmICgoKmZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQykgIT0gMCkgeworICAgICAgICAqZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKCpmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CiAgICAgfQogICAgIC8vIG9ubHkgYWxsb3cgZGVlcCBidWZmZXJpbmcgZm9yIG11c2ljIHN0cmVhbSB0eXBlCiAgICAgaWYgKHN0cmVhbSAhPSBBVURJT19TVFJFQU1fTVVTSUMpIHsKLSAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzICZ+QVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVIpOworICAgICAgICAqZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKCpmbGFncyAmfkFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSKTsKICAgICB9IGVsc2UgaWYgKC8qIHN0cmVhbSA9PSBBVURJT19TVFJFQU1fTVVTSUMgJiYgKi8KLSAgICAgICAgICAgIGZsYWdzID09IEFVRElPX09VVFBVVF9GTEFHX05PTkUgJiYKKyAgICAgICAgICAgICpmbGFncyA9PSBBVURJT19PVVRQVVRfRkxBR19OT05FICYmCiAgICAgICAgICAgICBwcm9wZXJ0eV9nZXRfYm9vbCgiYXVkaW8uZGVlcF9idWZmZXIubWVkaWEiLCBmYWxzZSAvKiBkZWZhdWx0X3ZhbHVlICovKSkgewogICAgICAgICAvLyB1c2UgREVFUF9CVUZGRVIgYXMgZGVmYXVsdCBvdXRwdXQgZm9yIG11c2ljIHN0cmVhbSB0eXBlCi0gICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KUFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSOworICAgICAgICAqZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVI7CiAgICAgfQogICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1RUUykgewotICAgICAgICBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX1RUUzsKKyAgICAgICAgKmZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfVFRTOwogICAgIH0gZWxzZSBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMICYmCi0gICAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKLSAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKEFVRElPX09VVFBVVF9GTEFHX1ZPSVBfUlggfAorICAgICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShjb25maWctPmZvcm1hdCkpIHsKKyAgICAgICAgKmZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShBVURJT19PVVRQVVRfRkxBR19WT0lQX1JYIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CiAgICAgICAgIEFMT0dWKCJTZXQgVm9JUCBhbmQgRGlyZWN0IG91dHB1dCBmbGFncyBmb3IgUENNIGZvcm1hdCIpOworICAgIH0gZWxzZSBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYICYmCisgICAgICAgIHN0cmVhbSA9PSBBVURJT19TVFJFQU1fTVVTSUMgJiYKKyAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShjb25maWctPmZvcm1hdCkgJiYKKyAgICAgICAgaXNJbkNhbGwoKSkgeworICAgICAgICAqZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpQVVESU9fT1VUUFVUX0ZMQUdfSU5DQUxMX01VU0lDOwogICAgIH0KIAorCiAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlOwogCiAgICAgLy8gc2tpcCBkaXJlY3Qgb3V0cHV0IHNlbGVjdGlvbiBpZiB0aGUgcmVxdWVzdCBjYW4gb2J2aW91c2x5IGJlIGF0dGFjaGVkIHRvIGEgbWl4ZWQgb3V0cHV0CiAgICAgLy8gYW5kIG5vdCBleHBsaWNpdGx5IHJlcXVlc3RlZAotICAgIGlmICgoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSA9PSAwKSAmJgotICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpICYmIHNhbXBsaW5nUmF0ZSA8PSBTQU1QTEVfUkFURV9IWl9NQVggJiYKLSAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzaykgPD0gMikgeworICAgIGlmICgoKCpmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgPT0gMCkgJiYKKyAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpICYmIGNvbmZpZy0+c2FtcGxlX3JhdGUgPD0gU0FNUExFX1JBVEVfSFpfTUFYICYmCisgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY29uZmlnLT5jaGFubmVsX21hc2spIDw9IDIpIHsKICAgICAgICAgZ290byBub25fZGlyZWN0X291dHB1dDsKICAgICB9CiAKQEAgLTk2MSwxMDUgKzg5OCw2NiBAQAogICAgIC8vIFRoaXMgbWF5IHByZXZlbnQgb2ZmbG9hZGluZyBpbiByYXJlIHNpdHVhdGlvbnMgd2hlcmUgZWZmZWN0cyBhcmUgbGVmdCBhY3RpdmUgYnkgYXBwcwogICAgIC8vIGluIHRoZSBiYWNrZ3JvdW5kLgogCi0gICAgaWYgKCgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSA9PSAwKSB8fAorICAgIGlmICgoKCpmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpID09IDApIHx8CiAgICAgICAgICAgICAhKG1FZmZlY3RzLmlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkgfHwgbU1hc3Rlck1vbm8pKSB7CiAgICAgICAgIHByb2ZpbGUgPSBnZXRQcm9maWxlRm9yRGlyZWN0T3V0cHV0KGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdClmbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKmZsYWdzKTsKICAgICB9CiAKICAgICBpZiAocHJvZmlsZSAhPSAwKSB7Ci0gICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gTlVMTDsKLQorICAgICAgICAvLyBleGNsdXNpdmUgb3V0cHV0cyBmb3IgTU1BUCBhbmQgT2ZmbG9hZCBhcmUgZW5mb3JjZWQgYnkgZGlmZmVyZW50IHNlc3Npb24gaWRzLgogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CiAgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIChwcm9maWxlID09IGRlc2MtPm1Qcm9maWxlKSkgewotICAgICAgICAgICAgICAgIG91dHB1dERlc2MgPSBkZXNjOwogICAgICAgICAgICAgICAgIC8vIHJldXNlIGRpcmVjdCBvdXRwdXQgaWYgY3VycmVudGx5IG9wZW4gYnkgdGhlIHNhbWUgY2xpZW50CiAgICAgICAgICAgICAgICAgLy8gYW5kIGNvbmZpZ3VyZWQgd2l0aCBzYW1lIHBhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICBpZiAoKHNhbXBsaW5nUmF0ZSA9PSBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlKSAmJgotICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRzX21hdGNoKGZvcm1hdCwgb3V0cHV0RGVzYy0+bUZvcm1hdCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKGNoYW5uZWxNYXNrID09IG91dHB1dERlc2MtPm1DaGFubmVsTWFzaykpIHsKLSAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG91dHB1dERlc2MtPm1EaXJlY3RDbGllbnRTZXNzaW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURpcmVjdE9wZW5Db3VudCsrOwotICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJnZXRPdXRwdXQoKSByZXVzaW5nIGRpcmVjdCBvdXRwdXQgJWQgZm9yIHNlc3Npb24gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLmtleUF0KGkpLCBzZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbU91dHB1dHMua2V5QXQoaSk7Ci0gICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJnZXRPdXRwdXQoKSBkbyBub3QgcmV1c2UgZGlyZWN0IG91dHB1dCBiZWNhdXNlIGN1cnJlbnQgY2xpZW50ICglZCkgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpcyBub3QgdGhlIHNhbWUgYXMgcmVxdWVzdGluZyBjbGllbnQgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURpcmVjdENsaWVudFNlc3Npb24sIHNlc3Npb24pOwotICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbm9uX2RpcmVjdF9vdXRwdXQ7Ci0gICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChjb25maWctPnNhbXBsZV9yYXRlID09IGRlc2MtPm1TYW1wbGluZ1JhdGUpICYmCisgICAgICAgICAgICAgICAgICAgIChjb25maWctPmZvcm1hdCA9PSBkZXNjLT5tRm9ybWF0KSAmJgorICAgICAgICAgICAgICAgICAgICAoY29uZmlnLT5jaGFubmVsX21hc2sgPT0gZGVzYy0+bUNoYW5uZWxNYXNrKSAmJgorICAgICAgICAgICAgICAgICAgICAoc2Vzc2lvbiA9PSBkZXNjLT5tRGlyZWN0Q2xpZW50U2Vzc2lvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVzYy0+bURpcmVjdE9wZW5Db3VudCsrOworICAgICAgICAgICAgICAgICAgICBBTE9HSSgiZ2V0T3V0cHV0Rm9yRGV2aWNlKCkgcmV1c2luZyBkaXJlY3Qgb3V0cHV0ICVkIGZvciBzZXNzaW9uICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLmtleUF0KGkpLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1PdXRwdXRzLmtleUF0KGkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAvLyBjbG9zZSBkaXJlY3Qgb3V0cHV0IGlmIGN1cnJlbnRseSBvcGVuIGFuZCBjb25maWd1cmVkIHdpdGggZGlmZmVyZW50IHBhcmFtZXRlcnMKLSAgICAgICAgaWYgKG91dHB1dERlc2MgIT0gTlVMTCkgewotICAgICAgICAgICAgY2xvc2VPdXRwdXQob3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKKworICAgICAgICBpZiAoIXByb2ZpbGUtPmNhbk9wZW5OZXdJbygpKSB7CisgICAgICAgICAgICBnb3RvIG5vbl9kaXJlY3Rfb3V0cHV0OwogICAgICAgICB9CiAKLSAgICAgICAgLy8gaWYgdGhlIHNlbGVjdGVkIHByb2ZpbGUgaXMgb2ZmbG9hZGVkIGFuZCBubyBvZmZsb2FkIGluZm8gd2FzIHNwZWNpZmllZCwKLSAgICAgICAgLy8gY3JlYXRlIGEgZGVmYXVsdCBvbmUKLSAgICAgICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgZGVmYXVsdE9mZmxvYWRJbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKLSAgICAgICAgaWYgKChwcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgJiYgIW9mZmxvYWRJbmZvKSB7Ci0gICAgICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKTsKLSAgICAgICAgICAgIGRlZmF1bHRPZmZsb2FkSW5mby5zYW1wbGVfcmF0ZSA9IHNhbXBsaW5nUmF0ZTsKLSAgICAgICAgICAgIGRlZmF1bHRPZmZsb2FkSW5mby5jaGFubmVsX21hc2sgPSBjaGFubmVsTWFzazsKLSAgICAgICAgICAgIGRlZmF1bHRPZmZsb2FkSW5mby5mb3JtYXQgPSBmb3JtYXQ7Ci0gICAgICAgICAgICBkZWZhdWx0T2ZmbG9hZEluZm8uc3RyZWFtX3R5cGUgPSBzdHJlYW07Ci0gICAgICAgICAgICBkZWZhdWx0T2ZmbG9hZEluZm8uYml0X3JhdGUgPSAwOwotICAgICAgICAgICAgZGVmYXVsdE9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzID0gLTE7Ci0gICAgICAgICAgICBkZWZhdWx0T2ZmbG9hZEluZm8uaGFzX3ZpZGVvID0gdHJ1ZTsgLy8gY29uc2VydmF0aXZlCi0gICAgICAgICAgICBkZWZhdWx0T2ZmbG9hZEluZm8uaXNfc3RyZWFtaW5nID0gdHJ1ZTsgLy8gbGlrZWx5Ci0gICAgICAgICAgICBvZmZsb2FkSW5mbyA9ICZkZWZhdWx0T2ZmbG9hZEluZm87Ci0gICAgICAgIH0KKyAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPQorICAgICAgICAgICAgICAgIG5ldyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihwcm9maWxlLCBtcENsaWVudEludGVyZmFjZSk7CiAKLSAgICAgICAgb3V0cHV0RGVzYyA9IG5ldyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihwcm9maWxlLCBtcENsaWVudEludGVyZmFjZSk7Ci0gICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgIG91dHB1dERlc2MtPm1MYXRlbmN5ID0gMDsKLSAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShvdXRwdXREZXNjLT5tRmxhZ3MgfCBmbGFncyk7Ci0gICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKLSAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gc2FtcGxpbmdSYXRlOwotICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2s7Ci0gICAgICAgIGNvbmZpZy5mb3JtYXQgPSBmb3JtYXQ7Ci0gICAgICAgIGlmIChvZmZsb2FkSW5mbyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvID0gKm9mZmxvYWRJbmZvOwotICAgICAgICB9CiAgICAgICAgIERldmljZVZlY3RvciBvdXRwdXREZXZpY2VzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7CiAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IG91dHB1dERldmljZXMuc2l6ZSgpID4gMCA/IG91dHB1dERldmljZXMuaXRlbUF0KDApLT5tQWRkcmVzcwogICAgICAgICAgICAgICAgIDogU3RyaW5nOCgiIik7Ci0gICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KHByb2ZpbGUtPmdldE1vZHVsZUhhbmRsZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1MYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MpOworCisgICAgICAgIHN0YXR1cyA9IG91dHB1dERlc2MtPm9wZW4oY29uZmlnLCBkZXZpY2UsIGFkZHJlc3MsIHN0cmVhbSwgKmZsYWdzLCAmb3V0cHV0KTsKIAogICAgICAgICAvLyBvbmx5IGFjY2VwdCBhbiBvdXRwdXQgd2l0aCB0aGUgcmVxdWVzdGVkIHBhcmFtZXRlcnMKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fAotICAgICAgICAgICAgKHNhbXBsaW5nUmF0ZSAhPSAwICYmIHNhbXBsaW5nUmF0ZSAhPSBjb25maWcuc2FtcGxlX3JhdGUpIHx8Ci0gICAgICAgICAgICAoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9ERUZBVUxUICYmICFhdWRpb19mb3JtYXRzX21hdGNoKGZvcm1hdCwgY29uZmlnLmZvcm1hdCkpIHx8Ci0gICAgICAgICAgICAoY2hhbm5lbE1hc2sgIT0gMCAmJiBjaGFubmVsTWFzayAhPSBjb25maWcuY2hhbm5lbF9tYXNrKSkgewotICAgICAgICAgICAgQUxPR1YoImdldE91dHB1dCgpIGZhaWxlZCBvcGVuaW5nIGRpcmVjdCBvdXRwdXQ6IG91dHB1dCAlZCBzYW1wbGluZ1JhdGUgJWQgJWQsIgotICAgICAgICAgICAgICAgICAgICAiZm9ybWF0ICVkICVkLCBjaGFubmVsTWFzayAlMDR4ICUwNHgiLCBvdXRwdXQsIHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBvdXRwdXREZXNjLT5tRm9ybWF0LCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgIChjb25maWctPnNhbXBsZV9yYXRlICE9IDAgJiYgY29uZmlnLT5zYW1wbGVfcmF0ZSAhPSBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlKSB8fAorICAgICAgICAgICAgKGNvbmZpZy0+Zm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9ERUZBVUxUICYmIGNvbmZpZy0+Zm9ybWF0ICE9IG91dHB1dERlc2MtPm1Gb3JtYXQpIHx8CisgICAgICAgICAgICAoY29uZmlnLT5jaGFubmVsX21hc2sgIT0gMCAmJiBjb25maWctPmNoYW5uZWxfbWFzayAhPSBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2spKSB7CisgICAgICAgICAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yRGV2aWNlKCkgZmFpbGVkIG9wZW5pbmcgZGlyZWN0IG91dHB1dDogb3V0cHV0ICVkIHNhbXBsZSByYXRlICVkICVkLCIKKyAgICAgICAgICAgICAgICAgICAgImZvcm1hdCAlZCAlZCwgY2hhbm5lbCBtYXNrICUwNHggJTA0eCIsIG91dHB1dCwgY29uZmlnLT5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSwgY29uZmlnLT5mb3JtYXQsIG91dHB1dERlc2MtPm1Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2spOwogICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmNsb3NlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBmYWxsIGJhY2sgdG8gbWl4ZXIgb3V0cHV0IGlmIHBvc3NpYmxlIHdoZW4gdGhlIGRpcmVjdCBvdXRwdXQgY291bGQgbm90IGJlIG9wZW4KLSAgICAgICAgICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgJiYgc2FtcGxpbmdSYXRlIDw9IFNBTVBMRV9SQVRFX0haX01BWCkgeworICAgICAgICAgICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpICYmCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUgIDw9IFNBTVBMRV9SQVRFX0haX01BWCkgewogICAgICAgICAgICAgICAgIGdvdG8gbm9uX2RpcmVjdF9vdXRwdXQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgICAgIH0KLSAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKLSAgICAgICAgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKLSAgICAgICAgb3V0cHV0RGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7CiAgICAgICAgIG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID0gMDsKICAgICAgICAgb3V0cHV0RGVzYy0+bVN0b3BUaW1lW3N0cmVhbV0gPSAwOwogICAgICAgICBvdXRwdXREZXNjLT5tRGlyZWN0T3BlbkNvdW50ID0gMTsKQEAgLTEwNjcsNyArOTY1LDcgQEAKIAogICAgICAgICBhZGRPdXRwdXQob3V0cHV0LCBvdXRwdXREZXNjKTsKICAgICAgICAgbVByZXZpb3VzT3V0cHV0cyA9IG1PdXRwdXRzOwotICAgICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgcmV0dXJucyBuZXcgZGlyZWN0IG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JEZXZpY2UoKSByZXR1cm5zIG5ldyBkaXJlY3Qgb3V0cHV0ICVkIiwgb3V0cHV0KTsKICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwogICAgICAgICByZXR1cm4gb3V0cHV0OwogICAgIH0KQEAgLTEwNzYsNyArOTc0LDcgQEAKIAogICAgIC8vIEEgcmVxdWVzdCBmb3IgSFcgQS9WIHN5bmMgY2Fubm90IGZhbGxiYWNrIHRvIGEgbWl4ZWQgb3V0cHV0IGJlY2F1c2UgdGltZQogICAgIC8vIHN0YW1wcyBhcmUgZW1iZWRkZWQgaW4gYXVkaW8gZGF0YQotICAgIGlmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKSAhPSAwKSB7CisgICAgaWYgKCgqZmxhZ3MgJiAoQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyB8IEFVRElPX09VVFBVVF9GTEFHX01NQVBfTk9JUlEpKSAhPSAwKSB7CiAgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICB9CiAKQEAgLTEwODUsMTcgKzk4MywxOCBAQAogICAgIC8vIG9wZW4gYSBub24gZGlyZWN0IG91dHB1dAogCiAgICAgLy8gZm9yIG5vbiBkaXJlY3Qgb3V0cHV0cywgb25seSBQQ00gaXMgc3VwcG9ydGVkCi0gICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgeworICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKGNvbmZpZy0+Zm9ybWF0KSkgewogICAgICAgICAvLyBnZXQgd2hpY2ggb3V0cHV0IGlzIHN1aXRhYmxlIGZvciB0aGUgc3BlY2lmaWVkIHN0cmVhbS4gVGhlIGFjdHVhbAogICAgICAgICAvLyByb3V0aW5nIGNoYW5nZSB3aWxsIGhhcHBlbiB3aGVuIHN0YXJ0T3V0cHV0KCkgd2lsbCBiZSBjYWxsZWQKICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShkZXZpY2UsIG1PdXRwdXRzKTsKIAogICAgICAgICAvLyBhdCB0aGlzIHN0YWdlIHdlIHNob3VsZCBpZ25vcmUgdGhlIERJUkVDVCBmbGFnIGFzIG5vIGRpcmVjdCBvdXRwdXQgY291bGQgYmUgZm91bmQgZWFybGllcgotICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoZmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKLSAgICAgICAgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsIGZsYWdzLCBmb3JtYXQpOworICAgICAgICAqZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKCpmbGFncyAmIH5BVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgICAgICBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywgKmZsYWdzLCBjb25maWctPmZvcm1hdCk7CiAgICAgfQotICAgIEFMT0dXX0lGKChvdXRwdXQgPT0gMCksICJnZXRPdXRwdXQoKSBjb3VsZCBub3QgZmluZCBvdXRwdXQgZm9yIHN0cmVhbSAlZCwgc2FtcGxpbmdSYXRlICVkLCIKLSAgICAgICAgICAgICJmb3JtYXQgJWQsIGNoYW5uZWxzICV4LCBmbGFncyAleCIsIHN0cmVhbSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncyk7CisgICAgQUxPR1dfSUYoKG91dHB1dCA9PSAwKSwgImdldE91dHB1dEZvckRldmljZSgpIGNvdWxkIG5vdCBmaW5kIG91dHB1dCBmb3Igc3RyZWFtICVkLCAiCisgICAgICAgICAgICAic2FtcGxpbmcgcmF0ZSAlZCwgZm9ybWF0ICUjeCwgY2hhbm5lbHMgJSN4LCBmbGFncyAlI3giLAorICAgICAgICAgICAgc3RyZWFtLCBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssICpmbGFncyk7CiAKICAgICByZXR1cm4gb3V0cHV0OwogfQpAQCAtMTExMywyNiArMTAxMiwyNiBAQAogICAgIC8vIDQ6IHRoZSBmaXJzdCBvdXRwdXQgaW4gdGhlIGxpc3QKIAogICAgIGlmIChvdXRwdXRzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgfQogICAgIGlmIChvdXRwdXRzLnNpemUoKSA9PSAxKSB7CiAgICAgICAgIHJldHVybiBvdXRwdXRzWzBdOwogICAgIH0KIAogICAgIGludCBtYXhDb21tb25GbGFncyA9IDA7Ci0gICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0Rm9yRmxhZ3MgPSAwOwotICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dEZvclByaW1hcnkgPSAwOwotICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dEZvckZvcm1hdCA9IDA7CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0Rm9yRmxhZ3MgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRGb3JQcmltYXJ5ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0Rm9yRm9ybWF0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgYXVkaW9fZm9ybWF0X3QgYmVzdEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwogICAgIGF1ZGlvX2Zvcm1hdF90IGJlc3RGb3JtYXRGb3JGbGFncyA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0c1tpXSk7CisgICAgZm9yIChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgOiBvdXRwdXRzKSB7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKICAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgewogICAgICAgICAgICAgLy8gaWYgYSB2YWxpZCBmb3JtYXQgaXMgc3BlY2lmaWVkLCBza2lwIG91dHB1dCBpZiBub3QgY29tcGF0aWJsZQogICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfSU5WQUxJRCkgewogICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFhdWRpb19mb3JtYXRzX21hdGNoKGZvcm1hdCwgb3V0cHV0RGVzYy0+bUZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBvdXRwdXREZXNjLT5tRm9ybWF0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgewpAQCAtMTE0MCw3ICsxMDM5LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKEF1ZGlvUG9ydDo6aXNCZXR0ZXJGb3JtYXRNYXRjaCgKICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Gb3JtYXQsIGJlc3RGb3JtYXQsIGZvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0Rm9yRm9ybWF0ID0gb3V0cHV0c1tpXTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0Rm9yRm9ybWF0ID0gb3V0cHV0OwogICAgICAgICAgICAgICAgICAgICBiZXN0Rm9ybWF0ID0gb3V0cHV0RGVzYy0+bUZvcm1hdDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xMTQ4LDMxICsxMDQ3LDMyIEBACiAgICAgICAgICAgICBpbnQgY29tbW9uRmxhZ3MgPSBwb3Bjb3VudChvdXRwdXREZXNjLT5tUHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIGZsYWdzKTsKICAgICAgICAgICAgIGlmIChjb21tb25GbGFncyA+PSBtYXhDb21tb25GbGFncykgewogICAgICAgICAgICAgICAgIGlmIChjb21tb25GbGFncyA9PSBtYXhDb21tb25GbGFncykgewotICAgICAgICAgICAgICAgICAgICBpZiAoQXVkaW9Qb3J0Ojppc0JldHRlckZvcm1hdE1hdGNoKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Gb3JtYXQsIGJlc3RGb3JtYXRGb3JGbGFncywgZm9ybWF0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0Rm9yRmxhZ3MgPSBvdXRwdXRzW2ldOworICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9JTlZBTElECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgQXVkaW9Qb3J0Ojppc0JldHRlckZvcm1hdE1hdGNoKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZvcm1hdCwgYmVzdEZvcm1hdEZvckZsYWdzLCBmb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRGb3JGbGFncyA9IG91dHB1dDsKICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RGb3JtYXRGb3JGbGFncyA9IG91dHB1dERlc2MtPm1Gb3JtYXQ7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBvdXRwdXRGb3JGbGFncyA9IG91dHB1dHNbaV07CisgICAgICAgICAgICAgICAgICAgIG91dHB1dEZvckZsYWdzID0gb3V0cHV0OwogICAgICAgICAgICAgICAgICAgICBtYXhDb21tb25GbGFncyA9IGNvbW1vbkZsYWdzOwogICAgICAgICAgICAgICAgICAgICBiZXN0Rm9ybWF0Rm9yRmxhZ3MgPSBvdXRwdXREZXNjLT5tRm9ybWF0OwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HVigic2VsZWN0T3V0cHV0KCkgY29tbW9uRmxhZ3MgZm9yIG91dHB1dCAlZCwgJTA0eCIsIG91dHB1dHNbaV0sIGNvbW1vbkZsYWdzKTsKKyAgICAgICAgICAgICAgICBBTE9HVigic2VsZWN0T3V0cHV0KCkgY29tbW9uRmxhZ3MgZm9yIG91dHB1dCAlZCwgJTA0eCIsIG91dHB1dCwgY29tbW9uRmxhZ3MpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPm1Qcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSkgewotICAgICAgICAgICAgICAgIG91dHB1dEZvclByaW1hcnkgPSBvdXRwdXRzW2ldOworICAgICAgICAgICAgICAgIG91dHB1dEZvclByaW1hcnkgPSBvdXRwdXQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAob3V0cHV0Rm9yRmxhZ3MgIT0gMCkgeworICAgIGlmIChvdXRwdXRGb3JGbGFncyAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICByZXR1cm4gb3V0cHV0Rm9yRmxhZ3M7CiAgICAgfQotICAgIGlmIChvdXRwdXRGb3JGb3JtYXQgIT0gMCkgeworICAgIGlmIChvdXRwdXRGb3JGb3JtYXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgcmV0dXJuIG91dHB1dEZvckZvcm1hdDsKICAgICB9Ci0gICAgaWYgKG91dHB1dEZvclByaW1hcnkgIT0gMCkgeworICAgIGlmIChvdXRwdXRGb3JQcmltYXJ5ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIHJldHVybiBvdXRwdXRGb3JQcmltYXJ5OwogICAgIH0KIApAQCAtMTE5Myw2ICsxMDkzLDExIEBACiAKICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaW5kZXgpOwogCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3V0cHV0RGVzYy0+c3RhcnQoKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCiAgICAgLy8gUm91dGluZz8KICAgICBtT3V0cHV0Um91dGVzLmluY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7CiAKQEAgLTEyMDcsNyArMTExMiw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBuZXdEZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVg7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1PdXRwdXRSb3V0ZXMuaGFzUm91dGVDaGFuZ2VkKHNlc3Npb24pKSB7CisgICAgfSBlbHNlIGlmIChtT3V0cHV0Um91dGVzLmdldEFuZENsZWFyUm91dGVDaGFuZ2VkKHNlc3Npb24pKSB7CiAgICAgICAgIG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShvdXRwdXREZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKICAgICAgICAgY2hlY2tTdHJhdGVneVJvdXRlKGdldFN0cmF0ZWd5KHN0cmVhbSksIG91dHB1dCk7CiAgICAgfSBlbHNlIHsKQEAgLTEyMTYsMTAgKzExMjEsMTEgQEAKIAogICAgIHVpbnQzMl90IGRlbGF5TXMgPSAwOwogCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhcnRTb3VyY2Uob3V0cHV0RGVzYywgc3RyZWFtLCBuZXdEZXZpY2UsIGFkZHJlc3MsICZkZWxheU1zKTsKKyAgICBzdGF0dXMgPSBzdGFydFNvdXJjZShvdXRwdXREZXNjLCBzdHJlYW0sIG5ld0RldmljZSwgYWRkcmVzcywgJmRlbGF5TXMpOwogCiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBtT3V0cHV0Um91dGVzLmRlY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7CisgICAgICAgIG91dHB1dERlc2MtPnN0b3AoKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgLy8gQXV0b21hdGljYWxseSBlbmFibGUgdGhlIHJlbW90ZSBzdWJtaXggaW5wdXQgd2hlbiBvdXRwdXQgaXMgc3RhcnRlZCBvbiBhIHJlIHJvdXRpbmcgbWl4CkBAIC0xMjY2LDYgKzExNzIsMTIgQEAKICAgICBib29sIGZvcmNlID0gIW91dHB1dERlc2MtPmlzQWN0aXZlKCkgJiYKICAgICAgICAgICAgIChvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpID09IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKTsKIAorICAgIC8vIHJlcXVpcmVzTXV0ZUNoZWNrIGlzIGZhbHNlIHdoZW4gd2UgY2FuIGJ5cGFzcyBtdXRlIHN0cmF0ZWd5LgorICAgIC8vIEl0IGNvdmVycyBhIGNvbW1vbiBjYXNlIHdoZW4gdGhlcmUgaXMgbm8gbWF0ZXJpYWxseSBhY3RpdmUgYXVkaW8KKyAgICAvLyBhbmQgbXV0aW5nIHdvdWxkIHJlc3VsdCBpbiB1bm5lY2Vzc2FyeSBkZWxheSBhbmQgZHJvcHBlZCBhdWRpby4KKyAgICBjb25zdCB1aW50MzJfdCBvdXRwdXRMYXRlbmN5TXMgPSBvdXRwdXREZXNjLT5sYXRlbmN5KCk7CisgICAgYm9vbCByZXF1aXJlc011dGVDaGVjayA9IG91dHB1dERlc2MtPmlzQWN0aXZlKG91dHB1dExhdGVuY3lNcyAqIDIpOyAgLy8gYWNjb3VudCBmb3IgZHJhaW4KKwogICAgIC8vIGluY3JlbWVudCB1c2FnZSBjb3VudCBmb3IgdGhpcyBzdHJlYW0gb24gdGhlIHJlcXVlc3RlZCBvdXRwdXQ6CiAgICAgLy8gTk9URSB0aGF0IHRoZSB1c2FnZSBjb3VudCBpcyB0aGUgc2FtZSBmb3IgZHVwbGljYXRlZCBvdXRwdXQgYW5kIGhhcmR3YXJlIG91dHB1dCB3aGljaCBpcwogICAgIC8vIG5lY2Vzc2FyeSBmb3IgYSBjb3JyZWN0IGNvbnRyb2wgb2YgaGFyZHdhcmUgb3V0cHV0IHJvdXRpbmcgYnkgc3RhcnRPdXRwdXQoKSBhbmQgc3RvcE91dHB1dCgpCkBAIC0xMjg5LDI5ICsxMjAxLDQ0IEBACiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CiAgICAgICAgICAgICBpZiAoZGVzYyAhPSBvdXRwdXREZXNjKSB7CisgICAgICAgICAgICAgICAgLy8gQW4gb3V0cHV0IGhhcyBhIHNoYXJlZCBkZXZpY2UgaWYKKyAgICAgICAgICAgICAgICAvLyAtIG1hbmFnZWQgYnkgdGhlIHNhbWUgaHcgbW9kdWxlCisgICAgICAgICAgICAgICAgLy8gLSBzdXBwb3J0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGRldmljZQorICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgc2hhcmVkRGV2aWNlID0gb3V0cHV0RGVzYy0+c2hhcmVzSHdNb2R1bGVXaXRoKGRlc2MpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpICYgZGV2aWNlKSAhPSBBVURJT19ERVZJQ0VfTk9ORTsKKwogICAgICAgICAgICAgICAgIC8vIGZvcmNlIGEgZGV2aWNlIGNoYW5nZSBpZiBhbnkgb3RoZXIgb3V0cHV0IGlzOgogICAgICAgICAgICAgICAgIC8vIC0gbWFuYWdlZCBieSB0aGUgc2FtZSBodyBtb2R1bGUKLSAgICAgICAgICAgICAgICAvLyAtIGhhcyBhIGN1cnJlbnQgZGV2aWNlIHNlbGVjdGlvbiB0aGF0IGRpZmZlcnMgZnJvbSBzZWxlY3RlZCBkZXZpY2UuCiAgICAgICAgICAgICAgICAgLy8gLSBzdXBwb3J0cyBjdXJyZW50bHkgc2VsZWN0ZWQgZGV2aWNlCisgICAgICAgICAgICAgICAgLy8gLSBoYXMgYSBjdXJyZW50IGRldmljZSBzZWxlY3Rpb24gdGhhdCBkaWZmZXJzIGZyb20gc2VsZWN0ZWQgZGV2aWNlLgogICAgICAgICAgICAgICAgIC8vIC0gaGFzIGFuIGFjdGl2ZSBhdWRpbyBwYXRjaAogICAgICAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgdGhlIGF1ZGlvIEhBTCBtdXN0IHJlY2VpdmUgdGhlIG5ldyBkZXZpY2Ugc2VsZWN0aW9uIHNvIHRoYXQgaXQgY2FuCi0gICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBkZXZpY2UgY3VycmVudGx5IHNlbGVjdGVkIGJ5IHRoZSBvdGhlciBhY3RpdmUgb3V0cHV0LgotICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5zaGFyZXNId01vZHVsZVdpdGgoZGVzYykgJiYKKyAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIGRldmljZSBjdXJyZW50bHkgc2VsZWN0ZWQgYnkgdGhlIG90aGVyIG91dHB1dC4KKyAgICAgICAgICAgICAgICBpZiAoc2hhcmVkRGV2aWNlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5kZXZpY2UoKSAhPSBkZXZpY2UgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPnN1cHBvcnRlZERldmljZXMoKSAmIGRldmljZSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewogICAgICAgICAgICAgICAgICAgICBmb3JjZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIHdhaXQgZm9yIGF1ZGlvIG9uIG90aGVyIGFjdGl2ZSBvdXRwdXRzIHRvIGJlIHByZXNlbnRlZCB3aGVuIHN0YXJ0aW5nCiAgICAgICAgICAgICAgICAgLy8gYSBub3RpZmljYXRpb24gc28gdGhhdCBhdWRpbyBmb2N1cyBlZmZlY3QgY2FuIHByb3BhZ2F0ZSwgb3IgdGhhdCBhIG11dGUvdW5tdXRlCiAgICAgICAgICAgICAgICAgLy8gZXZlbnQgb2NjdXJyZWQgZm9yIGJlYWNvbgotICAgICAgICAgICAgICAgIHVpbnQzMl90IGxhdGVuY3kgPSBkZXNjLT5sYXRlbmN5KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNob3VsZFdhaXQgJiYgZGVzYy0+aXNBY3RpdmUobGF0ZW5jeSAqIDIpICYmICh3YWl0TXMgPCBsYXRlbmN5KSkgewotICAgICAgICAgICAgICAgICAgICB3YWl0TXMgPSBsYXRlbmN5OworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGxhdGVuY3lNcyA9IGRlc2MtPmxhdGVuY3koKTsKKyAgICAgICAgICAgICAgICBjb25zdCBib29sIGlzQWN0aXZlID0gZGVzYy0+aXNBY3RpdmUobGF0ZW5jeU1zICogMik7ICAvLyBhY2NvdW50IGZvciBkcmFpbgorCisgICAgICAgICAgICAgICAgaWYgKHNob3VsZFdhaXQgJiYgaXNBY3RpdmUgJiYgKHdhaXRNcyA8IGxhdGVuY3lNcykpIHsKKyAgICAgICAgICAgICAgICAgICAgd2FpdE1zID0gbGF0ZW5jeU1zOwogICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFJlcXVpcmUgbXV0ZSBjaGVjayBpZiBhbm90aGVyIG91dHB1dCBpcyBvbiBhIHNoYXJlZCBkZXZpY2UKKyAgICAgICAgICAgICAgICAvLyBhbmQgY3VycmVudGx5IGFjdGl2ZSB0byBoYXZlIHByb3BlciBkcmFpbiBhbmQgYXZvaWQgcG9wcy4KKyAgICAgICAgICAgICAgICAvLyBOb3RlIHJlc3RvcmluZyBBdWRpb1RyYWNrcyBvbnRvIHRoaXMgb3V0cHV0IG5lZWRzIHRvIGludm9rZQorICAgICAgICAgICAgICAgIC8vIGEgdm9sdW1lIHJhbXAgaWYgdGhlcmUgaXMgbm8gbXV0ZS4KKyAgICAgICAgICAgICAgICByZXF1aXJlc011dGVDaGVjayB8PSBzaGFyZWREZXZpY2UgJiYgaXNBY3RpdmU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgdWludDMyX3QgbXV0ZVdhaXRNcyA9IHNldE91dHB1dERldmljZShvdXRwdXREZXNjLCBkZXZpY2UsIGZvcmNlLCAwLCBOVUxMLCBhZGRyZXNzKTsKKworICAgICAgICBjb25zdCB1aW50MzJfdCBtdXRlV2FpdE1zID0KKyAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgZGV2aWNlLCBmb3JjZSwgMCwgTlVMTCwgYWRkcmVzcywgcmVxdWlyZXNNdXRlQ2hlY2spOwogCiAgICAgICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2UgZm9yIHNvbmlmaWNhdGlvbiB3aGlsZSBpbiBjYWxsCiAgICAgICAgIGlmIChpc0luQ2FsbCgpKSB7CkBAIC0xMzM2LDYgKzEyNjMsMTkgQEAKICAgICAgICAgaWYgKHdhaXRNcyA+IG11dGVXYWl0TXMpIHsKICAgICAgICAgICAgICpkZWxheU1zID0gd2FpdE1zIC0gbXV0ZVdhaXRNczsKICAgICAgICAgfQorCisgICAgICAgIC8vIEZJWE1FOiBBIGRldmljZSBjaGFuZ2UgKG11dGVXYWl0TXMgPiAwKSBsaWtlbHkgaW50cm9kdWNlcyBhIHZvbHVtZSBjaGFuZ2UuCisgICAgICAgIC8vIEEgdm9sdW1lIGNoYW5nZSBlbmFjdGVkIGJ5IEFQTSB3aXRoIDAgZGVsYXkgaXMgbm90IHN5bmNocm9ub3VzLCBhcyBpdCBnb2VzCisgICAgICAgIC8vIHZpYSBBdWRpb0NvbW1hbmRUaHJlYWQgdG8gQXVkaW9GbGluZ2VyLiAgSGVuY2UgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgdm9sdW1lCisgICAgICAgIC8vIGNoYW5nZSBvY2N1cnMgYWZ0ZXIgdGhlIE1peGVyVGhyZWFkIHN0YXJ0cyBhbmQgY2F1c2VzIGEgc3RyZWFtIHZvbHVtZQorICAgICAgICAvLyBnbGl0Y2guCisgICAgICAgIC8vCisgICAgICAgIC8vIFdlIGRvIG5vdCBpbnRyb2R1Y2UgYWRkaXRpb25hbCBkZWxheSBoZXJlLgorICAgIH0KKworICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUgJiYKKyAgICAgICAgICAgIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKSB7CisgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9TT05JRklDQVRJT04sIHRydWUsIG91dHB1dERlc2MpOwogICAgIH0KIAogICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTEzNzksNyArMTMxOSwxMiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIHN0b3BTb3VyY2Uob3V0cHV0RGVzYywgc3RyZWFtLCBmb3JjZURldmljZVVwZGF0ZSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RvcFNvdXJjZShvdXRwdXREZXNjLCBzdHJlYW0sIGZvcmNlRGV2aWNlVXBkYXRlKTsKKworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgKSB7CisgICAgICAgIG91dHB1dERlc2MtPnN0b3AoKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdG9wU291cmNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCkBAIC0xNDMzLDYgKzEzNzgsMTIgQEAKICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgb3V0cHV0cyBpZiBzdG9wcGluZyBvbmUgd2l0aCBhIHN0cmVhbSB0aGF0IGNhbiBhZmZlY3Qgbm90aWZpY2F0aW9uIHJvdXRpbmcKICAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvblJvdXRpbmdGb3JTdHJlYW0oc3RyZWFtKTsKICAgICAgICAgfQorCisgICAgICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUgJiYKKyAgICAgICAgICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkgeworICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX1NPTklGSUNBVElPTiwgZmFsc2UsIG91dHB1dERlc2MpOworICAgICAgICB9CisKICAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fTVVTSUMpIHsKICAgICAgICAgICAgIHNlbGVjdE91dHB1dEZvck11c2ljRWZmZWN0cygpOwogICAgICAgICB9CkBAIC0xNDU0LDE5ICsxNDA1LDYgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCi0gICAgaW50IHRlc3RJbmRleCA9IHRlc3RPdXRwdXRJbmRleChvdXRwdXQpOwotICAgIGlmICh0ZXN0SW5kZXggIT0gMCkgewotICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOwotICAgICAgICAgICAgcmVtb3ZlT3V0cHV0KG91dHB1dCk7Ci0gICAgICAgICAgICBtVGVzdE91dHB1dHNbdGVzdEluZGV4XSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCi0KICAgICAvLyBSb3V0aW5nCiAgICAgbU91dHB1dFJvdXRlcy5yZW1vdmVSb3V0ZShzZXNzaW9uKTsKIApAQCAtMTQ5NSw3ICsxNDMzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3R5cGVfdCAqaW5wdXRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKQogewotICAgIEFMT0dWKCJnZXRJbnB1dEZvckF0dHIoKSBzb3VyY2UgJWQsIHNhbXBsaW5nUmF0ZSAlZCwgZm9ybWF0ICVkLCBjaGFubmVsTWFzayAleCwiCisgICAgQUxPR1YoImdldElucHV0Rm9yQXR0cigpIHNvdXJjZSAlZCwgc2FtcGxpbmcgcmF0ZSAlZCwgZm9ybWF0ICUjeCwgY2hhbm5lbCBtYXNrICUjeCwiCiAgICAgICAgICAgICAic2Vzc2lvbiAlZCwgZmxhZ3MgJSN4IiwKICAgICAgICAgICBhdHRyLT5zb3VyY2UsIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywgc2Vzc2lvbiwgZmxhZ3MpOwogCkBAIC0xNTA3LDE1ICsxNDQ1LDE0IEBACiAgICAgQXVkaW9NaXggKnBvbGljeU1peCA9IE5VTEw7CiAgICAgRGV2aWNlVmVjdG9yIGlucHV0RGV2aWNlczsKIAorICAgIGlmIChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfREVGQVVMVCkgeworICAgICAgICBpbnB1dFNvdXJjZSA9IEFVRElPX1NPVVJDRV9NSUM7CisgICAgfQorCiAgICAgLy8gRXhwbGljaXQgcm91dGluZz8KICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjOwogICAgIGlmICgqc2VsZWN0ZWREZXZpY2VJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPmdldElkKCkgPT0gKnNlbGVjdGVkRGV2aWNlSWQpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2VEZXNjID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBkZXZpY2VEZXNjID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoKnNlbGVjdGVkRGV2aWNlSWQpOwogICAgIH0KICAgICBtSW5wdXRSb3V0ZXMuYWRkUm91dGUoc2Vzc2lvbiwgU2Vzc2lvblJvdXRlOjpTVFJFQU1fVFlQRV9OQSwgaW5wdXRTb3VyY2UsIGRldmljZURlc2MsIHVpZCk7CiAKQEAgLTE1MzgsMTQgKzE0NzUsMTkgQEAKICAgICAgICAgfQogICAgICAgICAvLyBGb3IgTU1BUCBtb2RlLCB0aGUgZmlyc3QgY2FsbCB0byBnZXRJbnB1dEZvckF0dHIoKSBpcyBtYWRlIG9uIGJlaGFsZiBvZiBhdWRpb2ZsaW5nZXIuCiAgICAgICAgIC8vIFRoZSBzZWNvbmQgY2FsbCBpcyBmb3IgdGhlIGZpcnN0IGFjdGl2ZSBjbGllbnQgYW5kIHNldHMgdGhlIFVJRC4gQW55IGZ1cnRoZXIgY2FsbAotICAgICAgICAvLyBjb3JyZXNwb25kcyB0byBhIG5ldyBjbGllbnQgYW5kIGlzIG9ubHkgcGVybWl0dGVkIGZyb20gdGhlIHNhbWUgVUlkLgorICAgICAgICAvLyBjb3JyZXNwb25kcyB0byBhIG5ldyBjbGllbnQgYW5kIGlzIG9ubHkgcGVybWl0dGVkIGZyb20gdGhlIHNhbWUgVUlELgorICAgICAgICAvLyBJZiB0aGUgZmlyc3QgVUlEIGlzIHNpbGVuY2VkLCBhbGxvdyBhIG5ldyBVSUQgY29ubmVjdGlvbiBhbmQgcmVwbGFjZSB3aXRoIG5ldyBVSUQKICAgICAgICAgaWYgKGF1ZGlvU2Vzc2lvbi0+b3BlbkNvdW50KCkgPT0gMSkgewogICAgICAgICAgICAgYXVkaW9TZXNzaW9uLT5zZXRVaWQodWlkKTsKICAgICAgICAgfSBlbHNlIGlmIChhdWRpb1Nlc3Npb24tPnVpZCgpICE9IHVpZCkgewotICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIGJhZCB1aWQgJWQgZm9yIHNlc3Npb24gJWQgdWlkICVkIiwKLSAgICAgICAgICAgICAgICAgIHVpZCwgc2Vzc2lvbiwgYXVkaW9TZXNzaW9uLT51aWQoKSk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICBpZiAoIWF1ZGlvU2Vzc2lvbi0+aXNTaWxlbmNlZCgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIGJhZCB1aWQgJWQgZm9yIHNlc3Npb24gJWQgdWlkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICB1aWQsIHNlc3Npb24sIGF1ZGlvU2Vzc2lvbi0+dWlkKCkpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdWRpb1Nlc3Npb24tPnNldFVpZCh1aWQpOworICAgICAgICAgICAgYXVkaW9TZXNzaW9uLT5zZXRTaWxlbmNlZChmYWxzZSk7CiAgICAgICAgIH0KICAgICAgICAgYXVkaW9TZXNzaW9uLT5jaGFuZ2VPcGVuQ291bnQoMSk7CiAgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTEVHQUNZOwpAQCAtMTU2Myw5ICsxNTA1LDYgQEAKICAgICAqaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX0lOVkFMSUQ7CiAKLSAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0RFRkFVTFQpIHsKLSAgICAgICAgaW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfTUlDOwotICAgIH0KICAgICBoYWxJbnB1dFNvdXJjZSA9IGlucHV0U291cmNlOwogCiAgICAgLy8gVE9ETzogY2hlY2sgZm9yIGV4aXN0aW5nIGNsaWVudCBmb3IgdGhpcyBwb3J0IElECkBAIC0xNjE1LDcgKzE1NTQsNyBAQAogICAgIH0KIAogICAgICppbnB1dCA9IGdldElucHV0Rm9yRGV2aWNlKGRldmljZSwgYWRkcmVzcywgc2Vzc2lvbiwgdWlkLCBpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZywgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5TWl4KTsKICAgICBpZiAoKmlucHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMTY0Miw5ICsxNTgxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peCAqcG9saWN5TWl4KQogewpAQCAtMTY2MywxOCArMTYwMCwyMCBAQAogICAgICAgICAgICAgaGFsSW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT047CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OICYmCi0gICAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpKSB7CiAgICAgICAgIGZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fSU5QVVRfRkxBR19WT0lQX1RYKTsKICAgICB9CiAKICAgICAvLyBmaW5kIGEgY29tcGF0aWJsZSBpbnB1dCBwcm9maWxlIChub3QgbmVjZXNzYXJpbHkgaWRlbnRpY2FsIGluIHBhcmFtZXRlcnMpCiAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlOwotICAgIC8vIHNhbXBsaW5nUmF0ZSBhbmQgZmxhZ3MgbWF5IGJlIHVwZGF0ZWQgYnkgZ2V0SW5wdXRQcm9maWxlCi0gICAgdWludDMyX3QgcHJvZmlsZVNhbXBsaW5nUmF0ZSA9IChzYW1wbGluZ1JhdGUgPT0gMCkgPyBTQU1QTEVfUkFURV9IWl9ERUZBVUxUIDogc2FtcGxpbmdSYXRlOwotICAgIGF1ZGlvX2Zvcm1hdF90IHByb2ZpbGVGb3JtYXQgPSBmb3JtYXQ7Ci0gICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgcHJvZmlsZUNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7CisgICAgLy8gc2FtcGxpbmcgcmF0ZSBhbmQgZmxhZ3MgbWF5IGJlIHVwZGF0ZWQgYnkgZ2V0SW5wdXRQcm9maWxlCisgICAgdWludDMyX3QgcHJvZmlsZVNhbXBsaW5nUmF0ZSA9IChjb25maWctPnNhbXBsZV9yYXRlID09IDApID8KKyAgICAgICAgICAgIFNBTVBMRV9SQVRFX0haX0RFRkFVTFQgOiBjb25maWctPnNhbXBsZV9yYXRlOworICAgIGF1ZGlvX2Zvcm1hdF90IHByb2ZpbGVGb3JtYXQ7CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgcHJvZmlsZUNoYW5uZWxNYXNrID0gY29uZmlnLT5jaGFubmVsX21hc2s7CiAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBwcm9maWxlRmxhZ3MgPSBmbGFnczsKICAgICBmb3IgKDs7KSB7CisgICAgICAgIHByb2ZpbGVGb3JtYXQgPSBjb25maWctPmZvcm1hdDsgLy8gcmVzZXQgZWFjaCB0aW1lIHRocm91Z2ggbG9vcCwgaW4gY2FzZSBpdCBpcyB1cGRhdGVkCiAgICAgICAgIHByb2ZpbGUgPSBnZXRJbnB1dFByb2ZpbGUoZGV2aWNlLCBhZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVTYW1wbGluZ1JhdGUsIHByb2ZpbGVGb3JtYXQsIHByb2ZpbGVDaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlRmxhZ3MpOwpAQCAtMTY4NSwxMyArMTYyNCwxNCBAQAogICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGVGbGFncyAhPSBBVURJT19JTlBVVF9GTEFHX05PTkUpIHsKICAgICAgICAgICAgIHByb2ZpbGVGbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORTsgLy8gcmV0cnkKICAgICAgICAgfSBlbHNlIHsgLy8gZmFpbAotICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yRGV2aWNlKCkgY291bGQgbm90IGZpbmQgcHJvZmlsZSBmb3IgZGV2aWNlIDB4JVgsIgotICAgICAgICAgICAgICAgICAgInNhbXBsaW5nUmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgMHglWCwgZmxhZ3MgJSN4IiwKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzKTsKKyAgICAgICAgICAgIEFMT0dXKCJnZXRJbnB1dEZvckRldmljZSgpIGNvdWxkIG5vdCBmaW5kIHByb2ZpbGUgZm9yIGRldmljZSAweCVYLCAiCisgICAgICAgICAgICAgICAgICAic2FtcGxpbmcgcmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbCBtYXNrIDB4JVgsIGZsYWdzICUjeCIsCisgICAgICAgICAgICAgICAgICAgIGRldmljZSwgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCBmbGFncyk7CiAgICAgICAgICAgICByZXR1cm4gaW5wdXQ7CiAgICAgICAgIH0KICAgICB9CiAgICAgLy8gUGljayBpbnB1dCBzYW1wbGluZyByYXRlIGlmIG5vdCBzcGVjaWZpZWQgYnkgY2xpZW50CisgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gY29uZmlnLT5zYW1wbGVfcmF0ZTsKICAgICBpZiAoc2FtcGxpbmdSYXRlID09IDApIHsKICAgICAgICAgc2FtcGxpbmdSYXRlID0gcHJvZmlsZVNhbXBsaW5nUmF0ZTsKICAgICB9CkBAIC0xNzAyLDE0ICsxNjQyLDE0IEBACiAgICAgfQogCiAgICAgc3A8QXVkaW9TZXNzaW9uPiBhdWRpb1Nlc3Npb24gPSBuZXcgQXVkaW9TZXNzaW9uKHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU291bmRUcmlnZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3lNaXgsIG1wQ2xpZW50SW50ZXJmYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NvdW5kVHJpZ2dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5TWl4LCBtcENsaWVudEludGVyZmFjZSk7CiAKIC8vIEZJWE1FOiBkaXNhYmxlIGNvbmN1cnJlbnQgY2FwdHVyZSB1bnRpbCBVSSBpcyByZWFkeQogI2lmIDAKQEAgLTE3NTMsOCArMTY5Myw4IEBACiAgICAgICAgICAgICAvLyBjYW4gYmUgc2VsZWN0ZWQuCiAgICAgICAgICAgICBpZiAoIWlzQ29uY3VycmVudFNvdXJjZShpbnB1dFNvdXJjZSkgJiYKICAgICAgICAgICAgICAgICAgICAgKChkZXNjLT5tU2FtcGxpbmdSYXRlICE9IHNhbXBsaW5nUmF0ZSB8fAotICAgICAgICAgICAgICAgICAgICBkZXNjLT5tQ2hhbm5lbE1hc2sgIT0gY2hhbm5lbE1hc2sgfHwKLSAgICAgICAgICAgICAgICAgICAgIWF1ZGlvX2Zvcm1hdHNfbWF0Y2goZGVzYy0+bUZvcm1hdCwgZm9ybWF0KSkgJiYKKyAgICAgICAgICAgICAgICAgICAgZGVzYy0+bUNoYW5uZWxNYXNrICE9IGNvbmZpZy0+Y2hhbm5lbF9tYXNrIHx8CisgICAgICAgICAgICAgICAgICAgICFhdWRpb19mb3JtYXRzX21hdGNoKGRlc2MtPm1Gb3JtYXQsIGNvbmZpZy0+Zm9ybWF0KSkgJiYKICAgICAgICAgICAgICAgICAgICAgKHNvdXJjZV9wcmlvcml0eShkZXNjLT5nZXRIaWdoZXN0UHJpb3JpdHlTb3VyY2UoZmFsc2UgLyphY3RpdmVPbmx5Ki8pKSA8CiAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VfcHJpb3JpdHkoaW5wdXRTb3VyY2UpKSkpIHsKICAgICAgICAgICAgICAgICByZXVzZWRJbnB1dERlc2MgPSBkZXNjOwpAQCAtMTc3Nyw0NCArMTcxNyw0MCBAQAogICAgIH0KICNlbmRpZgogCi0gICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOwotICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHByb2ZpbGVTYW1wbGluZ1JhdGU7Ci0gICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IHByb2ZpbGVDaGFubmVsTWFzazsKLSAgICBjb25maWcuZm9ybWF0ID0gcHJvZmlsZUZvcm1hdDsKKyAgICBpZiAoIXByb2ZpbGUtPmNhbk9wZW5OZXdJbygpKSB7CisgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICB9CisKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbmV3IEF1ZGlvSW5wdXREZXNjcmlwdG9yKHByb2ZpbGUsIG1wQ2xpZW50SW50ZXJmYWNlKTsKKworICAgIGF1ZGlvX2NvbmZpZ190IGxDb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgbENvbmZpZy5zYW1wbGVfcmF0ZSA9IHByb2ZpbGVTYW1wbGluZ1JhdGU7CisgICAgbENvbmZpZy5jaGFubmVsX21hc2sgPSBwcm9maWxlQ2hhbm5lbE1hc2s7CisgICAgbENvbmZpZy5mb3JtYXQgPSBwcm9maWxlRm9ybWF0OwogCiAgICAgaWYgKGFkZHJlc3MgPT0gIiIpIHsKICAgICAgICAgRGV2aWNlVmVjdG9yIGlucHV0RGV2aWNlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7Ci0gICAgICAgIC8vICAgdGhlIGlucHV0cyB2ZWN0b3IgbXVzdCBiZSBvZiBzaXplIDEsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGNyYXNoIGhlcmUKKyAgICAgICAgLy8gdGhlIGlucHV0cyB2ZWN0b3IgbXVzdCBiZSBvZiBzaXplID49IDEsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGNyYXNoIGhlcmUKICAgICAgICAgYWRkcmVzcyA9IGlucHV0RGV2aWNlcy5zaXplKCkgPiAwID8gaW5wdXREZXZpY2VzLml0ZW1BdCgwKS0+bUFkZHJlc3MgOiBTdHJpbmc4KCIiKTsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3BlbklucHV0KHByb2ZpbGUtPmdldE1vZHVsZUhhbmRsZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsSW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlRmxhZ3MpOworICAgIHN0YXR1c190IHN0YXR1cyA9IGlucHV0RGVzYy0+b3BlbigmbENvbmZpZywgZGV2aWNlLCBhZGRyZXNzLAorICAgICAgICAgICAgaGFsSW5wdXRTb3VyY2UsIHByb2ZpbGVGbGFncywgJmlucHV0KTsKIAogICAgIC8vIG9ubHkgYWNjZXB0IGlucHV0IHdpdGggdGhlIGV4YWN0IHJlcXVlc3RlZCBzZXQgb2YgcGFyYW1ldGVycwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwgaW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUgfHwKLSAgICAgICAgKHByb2ZpbGVTYW1wbGluZ1JhdGUgIT0gY29uZmlnLnNhbXBsZV9yYXRlKSB8fAotICAgICAgICAhYXVkaW9fZm9ybWF0c19tYXRjaChwcm9maWxlRm9ybWF0LCBjb25maWcuZm9ybWF0KSB8fAotICAgICAgICAocHJvZmlsZUNoYW5uZWxNYXNrICE9IGNvbmZpZy5jaGFubmVsX21hc2spKSB7Ci0gICAgICAgIEFMT0dXKCJnZXRJbnB1dEZvckF0dHIoKSBmYWlsZWQgb3BlbmluZyBpbnB1dDogc2FtcGxpbmdSYXRlICVkIgotICAgICAgICAgICAgICAiLCBmb3JtYXQgJWQsIGNoYW5uZWxNYXNrICV4IiwKLSAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2spOworICAgICAgICAocHJvZmlsZVNhbXBsaW5nUmF0ZSAhPSBsQ29uZmlnLnNhbXBsZV9yYXRlKSB8fAorICAgICAgICAhYXVkaW9fZm9ybWF0c19tYXRjaChwcm9maWxlRm9ybWF0LCBsQ29uZmlnLmZvcm1hdCkgfHwKKyAgICAgICAgKHByb2ZpbGVDaGFubmVsTWFzayAhPSBsQ29uZmlnLmNoYW5uZWxfbWFzaykpIHsKKyAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIGZhaWxlZCBvcGVuaW5nIGlucHV0OiBzYW1wbGluZyByYXRlICVkIgorICAgICAgICAgICAgICAiLCBmb3JtYXQgJSN4LCBjaGFubmVsIG1hc2sgJSN4IiwKKyAgICAgICAgICAgICAgcHJvZmlsZVNhbXBsaW5nUmF0ZSwgcHJvZmlsZUZvcm1hdCwgcHJvZmlsZUNoYW5uZWxNYXNrKTsKICAgICAgICAgaWYgKGlucHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VJbnB1dChpbnB1dCk7CisgICAgICAgICAgICBpbnB1dERlc2MtPmNsb3NlKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIH0KIAotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBuZXcgQXVkaW9JbnB1dERlc2NyaXB0b3IocHJvZmlsZSk7Ci0gICAgaW5wdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gcHJvZmlsZVNhbXBsaW5nUmF0ZTsKLSAgICBpbnB1dERlc2MtPm1Gb3JtYXQgPSBwcm9maWxlRm9ybWF0OwotICAgIGlucHV0RGVzYy0+bUNoYW5uZWxNYXNrID0gcHJvZmlsZUNoYW5uZWxNYXNrOwotICAgIGlucHV0RGVzYy0+bURldmljZSA9IGRldmljZTsKICAgICBpbnB1dERlc2MtPm1Qb2xpY3lNaXggPSBwb2xpY3lNaXg7CiAgICAgaW5wdXREZXNjLT5hZGRBdWRpb1Nlc3Npb24oc2Vzc2lvbiwgYXVkaW9TZXNzaW9uKTsKIApAQCAtMTg1NSw5ICsxNzkxLDcgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgVmVjdG9yPCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gPiBhY3RpdmVJbnB1dHMgPSBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgIGFjdGl2ZUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gYWN0aXZlSW5wdXQgPSBhY3RpdmVJbnB1dHNbaV07CisgICAgZm9yIChjb25zdCBhdXRvJiBhY3RpdmVJbnB1dCA6IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXRzKCkpIHsKICAgICAgICAgaWYgKCFpc0NvbmN1cnJlbnRTb3VyY2UoYWN0aXZlSW5wdXQtPmlucHV0U291cmNlKHRydWUpKSAmJgogICAgICAgICAgICAgICAgICFpc192aXJ0dWFsX2lucHV0X2RldmljZShhY3RpdmVJbnB1dC0+bURldmljZSkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTE5MDQsMTAgKzE4MzgsMTUgQEAKIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2lsZW5jZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY3VycmVuY3lfdHlwZV9fbWFza190ICpjb25jdXJyZW5jeSkKIHsKLSAgICBBTE9HVigic3RhcnRJbnB1dCgpIGlucHV0ICVkIiwgaW5wdXQpOworCisgICAgQUxPR1YoIkF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRJbnB1dChpbnB1dDolZCwgc2Vzc2lvbjolZCwgc2lsZW5jZWQ6JWQsIGNvbmN1cnJlbmN5OiVkKSIsCisgICAgICAgICAgICBpbnB1dCwgc2Vzc2lvbiwgc2lsZW5jZWQsICpjb25jdXJyZW5jeSk7CisKICAgICAqY29uY3VycmVuY3kgPSBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfTk9ORTsKKwogICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOwogICAgIGlmIChpbmRleCA8IDApIHsKICAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoKSB1bmtub3duIGlucHV0ICVkIiwgaW5wdXQpOwpAQCAtMTkzOSwxNyArMTg3OCwzNyBAQAogICAgICAgICBpZiAobUNhbGxUeFBhdGNoICE9IDAgJiYKICAgICAgICAgICAgIGlucHV0RGVzYy0+Z2V0TW9kdWxlSGFuZGxlKCkgPT0gbUNhbGxUeFBhdGNoLT5tUGF0Y2guc291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSkgewogICAgICAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoJWQpIGZhaWxlZDogY2FsbCBpbiBwcm9ncmVzcyIsIGlucHV0KTsKKyAgICAgICAgICAgICpjb25jdXJyZW5jeSB8PSBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FMTDsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogCi0gICAgICAgIFZlY3Rvcjwgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ID4gYWN0aXZlSW5wdXRzID0gbUlucHV0cy5nZXRBY3RpdmVJbnB1dHMoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3RpdmVJbnB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBhY3RpdmVEZXNjID0gYWN0aXZlSW5wdXRzW2ldOworICAgICAgICBWZWN0b3I8c3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+PiBhY3RpdmVJbnB1dHMgPSBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpOwogCi0gICAgICAgICAgICBpZiAoaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoYWN0aXZlRGVzYy0+bURldmljZSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgLy8gSWYgYSBVSUQgaXMgaWRsZSBhbmQgcmVjb3JkcyBzaWxlbmNlIGFuZCBhbm90aGVyIG5vdCBzaWxlbmNlZCByZWNvcmRpbmcgc3RhcnRzCisgICAgICAgIC8vIGZyb20gYW5vdGhlciBVSUQgKGlkbGUgb3IgYWN0aXZlKSB3ZSBzdG9wIHRoZSBjdXJyZW50IGlkbGUgVUlEIHJlY29yZGluZyBpbgorICAgICAgICAvLyBmYXZvciBvZiB0aGUgbmV3IG9uZSAtICJUaGVyZSBjYW4gYmUgb25seSBvbmUiIFRNCisgICAgICAgIGlmICghc2lsZW5jZWQpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgYWN0aXZlRGVzYyA6IGFjdGl2ZUlucHV0cykgeworICAgICAgICAgICAgICAgIGlmICgoYXVkaW9TZXNzaW9uLT5mbGFncygpICYgQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJRKSAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVEZXNjLT5nZXRJZCgpID09IGlucHV0RGVzYy0+Z2V0SWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBhY3RpdmVTZXNzaW9ucyA9IGFjdGl2ZURlc2MtPmdldEF1ZGlvU2Vzc2lvbnMoCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qYWN0aXZlT25seSovKTsKKyAgICAgICAgICAgICAgICBzcDxBdWRpb1Nlc3Npb24+IGFjdGl2ZVNlc3Npb24gPSBhY3RpdmVTZXNzaW9ucy52YWx1ZUF0KDApOworICAgICAgICAgICAgICAgIGlmIChhY3RpdmVTZXNzaW9uLT5pc1NpbGVuY2VkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYWN0aXZlSW5wdXQgPSBhY3RpdmVEZXNjLT5tSW9IYW5kbGU7CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBhY3RpdmVTZXNzaW9uSWQgPSBhY3RpdmVTZXNzaW9uLT5zZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHN0b3BJbnB1dChhY3RpdmVJbnB1dCwgYWN0aXZlU2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUlucHV0KGFjdGl2ZUlucHV0LCBhY3RpdmVTZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigic3RhcnRJbnB1dCglZCkgc3RvcHBpbmcgc2lsZW5jZWQgaW5wdXQgJWQiLCBpbnB1dCwgYWN0aXZlSW5wdXQpOworICAgICAgICAgICAgICAgICAgICBhY3RpdmVJbnB1dHMgPSBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgfQogCisgICAgICAgIGZvciAoY29uc3QgYXV0byYgYWN0aXZlRGVzYyA6IGFjdGl2ZUlucHV0cykgewogICAgICAgICAgICAgaWYgKChhdWRpb1Nlc3Npb24tPmZsYWdzKCkgJiBBVURJT19JTlBVVF9GTEFHX01NQVBfTk9JUlEpICE9IDAgJiYKICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRGVzYy0+Z2V0SWQoKSA9PSBpbnB1dERlc2MtPmdldElkKCkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTE5NjIsMTcgKzE5MjEsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJzdGFydElucHV0KCVkKSBmYWlsZWQgZm9yIEhPVFdPUkQ6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm90aGVyIGlucHV0ICVkIGFscmVhZHkgc3RhcnRlZCBmb3IgSE9UV09SRCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgYWN0aXZlRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpjb25jdXJyZW5jeSB8PSBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfSE9UV09SRDsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzdGFydElucHV0KCVkKSBmYWlsZWQgZm9yIEhPVFdPUkQ6IG90aGVyIGlucHV0ICVkIGFscmVhZHkgc3RhcnRlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBhY3RpdmVEZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAqY29uY3VycmVuY3kgfD0gQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBUFRVUkU7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChhY3RpdmVTb3VyY2UgIT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoJWQpIGZhaWxlZDogb3RoZXIgaW5wdXQgJWQgYWxyZWFkeSBzdGFydGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsIGFjdGl2ZURlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICpjb25jdXJyZW5jeSB8PSBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FQVFVSRTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTE5ODUsMTMgKzE5NDcsNyBAQAogICAgICAgICAgICAgaW5wdXREZXNjLT5pc1NvdW5kVHJpZ2dlcigpID8gc291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZSgpIDogZmFsc2U7CiAKICAgICAgICAgLy8gaWYgY2FwdHVyZSBpcyBhbGxvd2VkLCBwcmVlbXB0IGN1cnJlbnRseSBhY3RpdmUgSE9UV09SRCBjYXB0dXJlcwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFjdGl2ZUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGFjdGl2ZURlc2MgPSBhY3RpdmVJbnB1dHNbaV07Ci0KLSAgICAgICAgICAgIGlmIChpc192aXJ0dWFsX2lucHV0X2RldmljZShhY3RpdmVEZXNjLT5tRGV2aWNlKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCisgICAgICAgIGZvciAoY29uc3QgYXV0byYgYWN0aXZlRGVzYyA6IGFjdGl2ZUlucHV0cykgewogICAgICAgICAgICAgaWYgKGFsbG93Q29uY3VycmVudFdpdGhTb3VuZFRyaWdnZXIgJiYgYWN0aXZlRGVzYy0+aXNTb3VuZFRyaWdnZXIoKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQpAQCAtMjAwMyw2ICsxOTU5LDcgQEAKICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgYWN0aXZlU2Vzc2lvbiA9IGFjdGl2ZVNlc3Npb25zLmtleUF0KDApOwogICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGFjdGl2ZUhhbmRsZSA9IGFjdGl2ZURlc2MtPm1Jb0hhbmRsZTsKICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90PiBzZXNzaW9ucyA9IGFjdGl2ZURlc2MtPmdldFByZWVtcHRlZFNlc3Npb25zKCk7CisgICAgICAgICAgICAgICAgKmNvbmN1cnJlbmN5IHw9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9QUkVFTVBUOwogICAgICAgICAgICAgICAgIHNlc3Npb25zLmFkZChhY3RpdmVTZXNzaW9uKTsKICAgICAgICAgICAgICAgICBpbnB1dERlc2MtPnNldFByZWVtcHRlZFNlc3Npb25zKHNlc3Npb25zKTsKICAgICAgICAgICAgICAgICBzdG9wSW5wdXQoYWN0aXZlSGFuZGxlLCBhY3RpdmVTZXNzaW9uKTsKQEAgLTIwMTQsNiArMTk3MSw5IEBACiAgICAgfQogI2VuZGlmCiAKKyAgICAvLyBNYWtlIHN1cmUgd2Ugc3RhcnQgd2l0aCB0aGUgY29ycmVjdCBzaWxlbmNlIHN0YXRlCisgICAgYXVkaW9TZXNzaW9uLT5zZXRTaWxlbmNlZChzaWxlbmNlZCk7CisKICAgICAvLyBpbmNyZW1lbnQgYWN0aXZpdHkgY291bnQgYmVmb3JlIGNhbGxpbmcgZ2V0TmV3SW5wdXREZXZpY2UoKSBiZWxvdyBhcyBvbmx5IGFjdGl2ZSBzZXNzaW9ucwogICAgIC8vIGFyZSBjb25zaWRlcmVkIGZvciBkZXZpY2Ugc2VsZWN0aW9uCiAgICAgYXVkaW9TZXNzaW9uLT5jaGFuZ2VBY3RpdmVDb3VudCgxKTsKQEAgLTIwMjEsMTIgKzE5ODEsMTkgQEAKICAgICAvLyBSb3V0aW5nPwogICAgIG1JbnB1dFJvdXRlcy5pbmNSb3V0ZUFjdGl2aXR5KHNlc3Npb24pOwogCi0gICAgaWYgKGF1ZGlvU2Vzc2lvbi0+YWN0aXZlQ291bnQoKSA9PSAxIHx8IG1JbnB1dFJvdXRlcy5oYXNSb3V0ZUNoYW5nZWQoc2Vzc2lvbikpIHsKKyAgICBpZiAoYXVkaW9TZXNzaW9uLT5hY3RpdmVDb3VudCgpID09IDEgfHwgbUlucHV0Um91dGVzLmdldEFuZENsZWFyUm91dGVDaGFuZ2VkKHNlc3Npb24pKSB7CiAgICAgICAgIC8vIGluZGljYXRlIGFjdGl2ZSBjYXB0dXJlIHRvIHNvdW5kIHRyaWdnZXIgc2VydmljZSBpZiBzdGFydGluZyBjYXB0dXJlIGZyb20gYSBtaWMgb24KICAgICAgICAgLy8gcHJpbWFyeSBIVyBtb2R1bGUKICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldE5ld0lucHV0RGV2aWNlKGlucHV0RGVzYyk7CiAgICAgICAgIHNldElucHV0RGV2aWNlKGlucHV0LCBkZXZpY2UsIHRydWUgLyogZm9yY2UgKi8pOwogCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGlucHV0RGVzYy0+c3RhcnQoKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgbUlucHV0Um91dGVzLmRlY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7CisgICAgICAgICAgICBhdWRpb1Nlc3Npb24tPmNoYW5nZUFjdGl2ZUNvdW50KC0xKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoaW5wdXREZXNjLT5nZXRBdWRpb1Nlc3Npb25Db3VudCh0cnVlLyphY3RpdmVPbmx5Ki8pID09IDEpIHsKICAgICAgICAgICAgIC8vIGlmIGlucHV0IG1hcHMgdG8gYSBkeW5hbWljIHBvbGljeSB3aXRoIGFuIGFjdGl2aXR5IGxpc3RlbmVyLCBub3RpZnkgb2Ygc3RhdGUgY2hhbmdlCiAgICAgICAgICAgICBpZiAoKGlucHV0RGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKQpAQCAtMjA5Myw3ICsyMDYwLDcgQEAKICAgICBtSW5wdXRSb3V0ZXMuZGVjUm91dGVBY3Rpdml0eShzZXNzaW9uKTsKIAogICAgIGlmIChhdWRpb1Nlc3Npb24tPmFjdGl2ZUNvdW50KCkgPT0gMCkgewotCisgICAgICAgIGlucHV0RGVzYy0+c3RvcCgpOwogICAgICAgICBpZiAoaW5wdXREZXNjLT5pc0FjdGl2ZSgpKSB7CiAgICAgICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dCwgZ2V0TmV3SW5wdXREZXZpY2UoaW5wdXREZXNjKSwgZmFsc2UgLyogZm9yY2UgKi8pOwogICAgICAgICB9IGVsc2UgewpAQCAtMjEzOSw3ICsyMTA2LDYgQEAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQogewotCiAgICAgQUxPR1YoInJlbGVhc2VJbnB1dCgpICVkIiwgaW5wdXQpOwogICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOwogICAgIGlmIChpbmRleCA8IDApIHsKQEAgLTIxODIsNyArMjE0OCw3IEBACiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xvc2VBbGxJbnB1dHMoKSB7CiAgICAgYm9vbCBwYXRjaFJlbW92ZWQgPSBmYWxzZTsKIAotICAgIGZvcihzaXplX3QgaW5wdXRfaW5kZXggPSAwOyBpbnB1dF9pbmRleCA8IG1JbnB1dHMuc2l6ZSgpOyBpbnB1dF9pbmRleCsrKSB7CisgICAgZm9yIChzaXplX3QgaW5wdXRfaW5kZXggPSAwOyBpbnB1dF9pbmRleCA8IG1JbnB1dHMuc2l6ZSgpOyBpbnB1dF9pbmRleCsrKSB7CiAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5wdXRfaW5kZXgpOwogICAgICAgICBzc2l6ZV90IHBhdGNoX2luZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGlucHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7CiAgICAgICAgIGlmIChwYXRjaF9pbmRleCA+PSAwKSB7CkBAIC0yMTkxLDggKzIxNTcsOSBAQAogICAgICAgICAgICAgbUF1ZGlvUGF0Y2hlcy5yZW1vdmVJdGVtc0F0KHBhdGNoX2luZGV4KTsKICAgICAgICAgICAgIHBhdGNoUmVtb3ZlZCA9IHRydWU7CiAgICAgICAgIH0KLSAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQobUlucHV0cy5rZXlBdChpbnB1dF9pbmRleCkpOworICAgICAgICBpbnB1dERlc2MtPmNsb3NlKCk7CiAgICAgfQorICAgIG1JbnB1dFJvdXRlcy5jbGVhcigpOwogICAgIG1JbnB1dHMuY2xlYXIoKTsKICAgICBTb3VuZFRyaWdnZXI6OnNldENhcHR1cmVTdGF0ZShmYWxzZSk7CiAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKQEAgLTIyMjMsNyArMjE5MCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQogewogCi0gICAgaWYgKChpbmRleCA8IG1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4TWluKHN0cmVhbSkpIHx8CisgICAgLy8gVk9JQ0VfQ0FMTCBzdHJlYW0gaGFzIG1pblZvbHVtZUluZGV4ID4gMCAgYnV0IGNhbiBiZSBtdXRlZCBkaXJlY3RseSBieSBhbgorICAgIC8vIGFwcCB0aGF0IGhhcyBNT0RJRllfUEhPTkVfU1RBVEUgcGVybWlzc2lvbi4KKyAgICBpZiAoKChpbmRleCA8IG1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4TWluKHN0cmVhbSkpICYmCisgICAgICAgICAgICAhKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCAmJiBpbmRleCA9PSAwKSkgfHwKICAgICAgICAgICAgIChpbmRleCA+IG1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4TWF4KHN0cmVhbSkpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQpAQCAtMjM0NiwyMSArMjMxNiwyMSBAQAogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXREZWVwQnVmZmVyID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dFByaW1hcnkgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKIAotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0c1tpXSk7CisgICAgICAgIGZvciAoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0IDogb3V0cHV0cykgeworICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwogICAgICAgICAgICAgaWYgKGFjdGl2ZU9ubHkgJiYgIWRlc2MtPmlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9NVVNJQykpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJzZWxlY3RPdXRwdXRGb3JNdXNpY0VmZmVjdHMgYWN0aXZlT25seSAlZCBvdXRwdXRzWyV6dV0gZmxhZ3MgMHglMDh4IiwKLSAgICAgICAgICAgICAgICAgIGFjdGl2ZU9ubHksIGksIGRlc2MtPm1GbGFncyk7CisgICAgICAgICAgICBBTE9HVigic2VsZWN0T3V0cHV0Rm9yTXVzaWNFZmZlY3RzIGFjdGl2ZU9ubHkgJWQgb3V0cHV0ICVkIGZsYWdzIDB4JTA4eCIsCisgICAgICAgICAgICAgICAgICBhY3RpdmVPbmx5LCBvdXRwdXQsIGRlc2MtPm1GbGFncyk7CiAgICAgICAgICAgICBpZiAoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRPZmZsb2FkZWQgPSBvdXRwdXRzW2ldOworICAgICAgICAgICAgICAgIG91dHB1dE9mZmxvYWRlZCA9IG91dHB1dDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVIpICE9IDApIHsKLSAgICAgICAgICAgICAgICBvdXRwdXREZWVwQnVmZmVyID0gb3V0cHV0c1tpXTsKKyAgICAgICAgICAgICAgICBvdXRwdXREZWVwQnVmZmVyID0gb3V0cHV0OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0UHJpbWFyeSA9IG91dHB1dHNbaV07CisgICAgICAgICAgICAgICAgb3V0cHV0UHJpbWFyeSA9IG91dHB1dDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAob3V0cHV0T2ZmbG9hZGVkICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CkBAIC0yNDcxLDIzICsyNDQxLDE2IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBpZiAoKG1peGVzW2ldLm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLKSA9PSBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spIHsKLSAgICAgICAgICAgIC8vIExvb3AgYmFjayB0aHJvdWdoICJyZW1vdGUgc3VibWl4IgotICAgICAgICAgICAgaWYgKHJTdWJtaXhNb2R1bGUgPT0gMCkgewotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RyY21wKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9SRU1PVEVfU1VCTUlYLCBtSHdNb2R1bGVzW2pdLT5tTmFtZSkgPT0gMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1Id01vZHVsZXNbal0tPm1IYW5kbGUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgclN1Ym1peE1vZHVsZSA9IG1Id01vZHVsZXNbal07Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgQUxPR1YoInJlZ2lzdGVyUG9saWN5TWl4ZXMoKSBtaXggJXp1IG9mICV6dSBpcyBMT09QX0JBQ0siLCBpLCBtaXhlcy5zaXplKCkpOwotCiAgICAgICAgICAgICBpZiAoclN1Ym1peE1vZHVsZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiBVbmFibGUgdG8gZmluZCBhdWRpbyBtb2R1bGUgZm9yIHN1Ym1peCwgYWJvcnRpbmcgbWl4ICV6dSByZWdpc3RyYXRpb24iLCBpKTsKLSAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICByU3VibWl4TW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9SRU1PVEVfU1VCTUlYKTsKKyAgICAgICAgICAgICAgICBpZiAoclN1Ym1peE1vZHVsZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIgVW5hYmxlIHRvIGZpbmQgYXVkaW8gbW9kdWxlIGZvciBzdWJtaXgsIGFib3J0aW5nIG1peCAlenUgcmVnaXN0cmF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gbWl4ZXNbaV0ubURldmljZUFkZHJlc3M7CkBAIC0yNTY2LDI0ICsyNTI5LDE5IEBACiAgICAgc3RhdHVzX3QgcmVzID0gTk9fRVJST1I7CiAgICAgc3A8SHdNb2R1bGU+IHJTdWJtaXhNb2R1bGU7CiAgICAgLy8gZXhhbWluZSBlYWNoIG1peCdzIHJvdXRlIHR5cGUKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1peGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmICgobWl4ZXNbaV0ubVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spID09IE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSykgeworICAgIGZvciAoY29uc3QgYXV0byYgbWl4IDogbWl4ZXMpIHsKKyAgICAgICAgaWYgKChtaXgubVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spID09IE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSykgewogCiAgICAgICAgICAgICBpZiAoclN1Ym1peE1vZHVsZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJjbXAoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1JFTU9URV9TVUJNSVgsIG1Id01vZHVsZXNbal0tPm1OYW1lKSA9PSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUh3TW9kdWxlc1tqXS0+bUhhbmRsZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByU3VibWl4TW9kdWxlID0gbUh3TW9kdWxlc1tqXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgclN1Ym1peE1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRnJvbU5hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUkVNT1RFX1NVQk1JWCk7CisgICAgICAgICAgICAgICAgaWYgKHJTdWJtaXhNb2R1bGUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJTdWJtaXhNb2R1bGUgPT0gMCkgewotICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBtaXhlc1tpXS5tRGV2aWNlQWRkcmVzczsKKyAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IG1peC5tRGV2aWNlQWRkcmVzczsKIAogICAgICAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy51bnJlZ2lzdGVyTWl4KGFkZHJlc3MpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0yNjA1LDggKzI1NjMsOCBAQAogICAgICAgICAgICAgclN1Ym1peE1vZHVsZS0+cmVtb3ZlT3V0cHV0UHJvZmlsZShhZGRyZXNzKTsKICAgICAgICAgICAgIHJTdWJtaXhNb2R1bGUtPnJlbW92ZUlucHV0UHJvZmlsZShhZGRyZXNzKTsKIAotICAgICAgICB9IGlmICgobWl4ZXNbaV0ubVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19SRU5ERVIpID09IE1JWF9ST1VURV9GTEFHX1JFTkRFUikgewotICAgICAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy51bnJlZ2lzdGVyTWl4KG1peGVzW2ldLm1EZXZpY2VBZGRyZXNzKSAhPSBOT19FUlJPUikgeworICAgICAgICB9IGlmICgobWl4Lm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSA9PSBNSVhfUk9VVEVfRkxBR19SRU5ERVIpIHsKKyAgICAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMudW5yZWdpc3Rlck1peChtaXgubURldmljZUFkZHJlc3MpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CkBAIC0yNjU4LDcgKzI2MTYsNyBAQAogCiAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZHVtcChmZCwgU3RyaW5nOCgiQXZhaWxhYmxlIG91dHB1dCIpKTsKICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmR1bXAoZmQsIFN0cmluZzgoIkF2YWlsYWJsZSBpbnB1dCIpKTsKLSAgICBtSHdNb2R1bGVzLmR1bXAoZmQpOworICAgIG1Id01vZHVsZXNBbGwuZHVtcChmZCk7CiAgICAgbU91dHB1dHMuZHVtcChmZCk7CiAgICAgbUlucHV0cy5kdW1wKGZkKTsKICAgICBtVm9sdW1lQ3VydmVzLT5kdW1wKGZkKTsKQEAgLTI3NjMsMjMgKzI3MjEsMjMgQEAKICAgICAgICAgLy8gZG8gbm90IHJlcG9ydCBkZXZpY2VzIHdpdGggdHlwZSBBVURJT19ERVZJQ0VfSU5fU1RVQiBvciBBVURJT19ERVZJQ0VfT1VUX1NUVUIKICAgICAgICAgLy8gYXMgdGhleSBhcmUgdXNlZCBieSBzdHViIEhBTHMgYnkgY29udmVudGlvbgogICAgICAgICBpZiAocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSyB8fCByb2xlID09IEFVRElPX1BPUlRfUk9MRV9OT05FKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldLT50eXBlKCkgPT0gQVVESU9fREVWSUNFX09VVF9TVFVCKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGRldiA6IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKSB7CisgICAgICAgICAgICAgICAgaWYgKGRldi0+dHlwZSgpID09IEFVRElPX0RFVklDRV9PVVRfU1RVQikgewogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKHBvcnRzV3JpdHRlbiA8IHBvcnRzTWF4KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldLT50b0F1ZGlvUG9ydCgmcG9ydHNbcG9ydHNXcml0dGVuKytdKTsKKyAgICAgICAgICAgICAgICAgICAgZGV2LT50b0F1ZGlvUG9ydCgmcG9ydHNbcG9ydHNXcml0dGVuKytdKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgKCpudW1fcG9ydHMpKys7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSB8fCByb2xlID09IEFVRElPX1BPUlRfUk9MRV9OT05FKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdmFpbGFibGVJbnB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+dHlwZSgpID09IEFVRElPX0RFVklDRV9JTl9TVFVCKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGRldiA6IG1BdmFpbGFibGVJbnB1dERldmljZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGV2LT50eXBlKCkgPT0gQVVESU9fREVWSUNFX0lOX1NUVUIpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChwb3J0c1dyaXR0ZW4gPCBwb3J0c01heCkgewotICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT50b0F1ZGlvUG9ydCgmcG9ydHNbcG9ydHNXcml0dGVuKytdKTsKKyAgICAgICAgICAgICAgICAgICAgZGV2LT50b0F1ZGlvUG9ydCgmcG9ydHNbcG9ydHNXcml0dGVuKytdKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgKCpudW1fcG9ydHMpKys7CiAgICAgICAgICAgICB9CkBAIC0zMDE4LDcgKzI5NzYsNyBAQAogICAgICAgICAgICAgICAgIHNpbmtEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3UGF0Y2guc2lua3NbaV0sICZwYXRjaC0+c2lua3NbaV0pOwogCiAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgc29mdHdhcmUgYnJpZGdlIGluIFBhdGNoUGFuZWwgaWY6Ci0gICAgICAgICAgICAgICAgLy8gLSBzb3VyY2UgYW5kIHNpbmsgZGV2aWNlcyBhcmUgb24gZGlmZmVybnQgSFcgbW9kdWxlcyBPUgorICAgICAgICAgICAgICAgIC8vIC0gc291cmNlIGFuZCBzaW5rIGRldmljZXMgYXJlIG9uIGRpZmZlcmVudCBIVyBtb2R1bGVzIE9SCiAgICAgICAgICAgICAgICAgLy8gLSBhdWRpbyBIQUwgdmVyc2lvbiBpcyA8IDMuMAogICAgICAgICAgICAgICAgIGlmICghc3JjRGV2aWNlRGVzYy0+aGFzU2FtZUh3TW9kdWxlQXMoc2lua0RldmljZURlc2MpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAoc3JjRGV2aWNlRGVzYy0+bU1vZHVsZS0+Z2V0SGFsVmVyc2lvbk1ham9yKCkgPCAzKSkgewpAQCAtMzI3NCw4ICszMjMyLDggQEAKICAgICAgICAgfQogICAgIH0KICAgICAvLyByZXJvdXRlIG91dHB1dHMgaWYgbmVjZXNzYXJ5Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhZmZlY3RlZFN0cmF0ZWdpZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY2hlY2tTdHJhdGVneVJvdXRlKGFmZmVjdGVkU3RyYXRlZ2llc1tpXSwgQVVESU9fSU9fSEFORExFX05PTkUpOworICAgIGZvciAoY29uc3QgYXV0byYgc3RyYXRlZ3kgOiBhZmZlY3RlZFN0cmF0ZWdpZXMpIHsKKyAgICAgICAgY2hlY2tTdHJhdGVneVJvdXRlKHN0cmF0ZWd5LCBBVURJT19JT19IQU5ETEVfTk9ORSk7CiAgICAgfQogCiAgICAgLy8gcmVtb3ZlIGlucHV0IHJvdXRlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB1aWQKQEAgLTMyOTcsOCArMzI1NSw4IEBACiAgICAgICAgICAgICBpbnB1dHNUb0Nsb3NlLmFkZChpbnB1dERlc2MtPm1Jb0hhbmRsZSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbnB1dHNUb0Nsb3NlLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGNsb3NlSW5wdXQoaW5wdXRzVG9DbG9zZVtpXSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBpbnB1dCA6IGlucHV0c1RvQ2xvc2UpIHsKKyAgICAgICAgY2xvc2VJbnB1dChpbnB1dCk7CiAgICAgfQogfQogCkBAIC0zNDAxLDYgKzMzNTksMTEgQEAKICAgICAgICAgICAgIEFMT0dWKCIlcyBvdXRwdXQgZm9yIGRldmljZSAlMDh4IGlzIGR1cGxpY2F0ZWQiLCBfX0ZVTkNUSU9OX18sIHNpbmtEZXZpY2UpOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG91dHB1dERlc2MtPnN0YXJ0KCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKwogICAgICAgICAvLyBjcmVhdGUgYSBzcGVjaWFsIHBhdGNoIHdpdGggbm8gc2luayBhbmQgdHdvIHNvdXJjZXM6CiAgICAgICAgIC8vIC0gdGhlIHNlY29uZCBzb3VyY2UgaW5kaWNhdGVzIHRvIFBhdGNoUGFuZWwgdGhyb3VnaCB3aGljaCBvdXRwdXQgbWl4IHRoaXMgcGF0Y2ggc2hvdWxkCiAgICAgICAgIC8vIGJlIGNvbm5lY3RlZCBhcyB3ZWxsIGFzIHRoZSBzdHJlYW0gdHlwZSBmb3Igdm9sdW1lIGNvbnRyb2wKQEAgLTM0MTEsNyArMzM3NCw3IEBACiAgICAgICAgIHNyY0RldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC0+c291cmNlc1swXSwgTlVMTCk7CiAgICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC0+c291cmNlc1sxXSwgTlVMTCk7CiAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzFdLmV4dC5taXgudXNlY2FzZS5zdHJlYW0gPSBzdHJlYW07Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKHBhdGNoLAorICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmUGF0Y2hIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwogICAgICAgICBBTE9HVigiJXMgcGF0Y2ggcGFuZWwgcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiLCBfX0ZVTkNUSU9OX18sCkBAIC0zNDc1LDggKzM0MzgsOCBAQAogICAgICAgICAgICAgICAgIG9mZmxvYWRlZC5wdXNoKGRlc2MtPm1Jb0hhbmRsZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvZmZsb2FkZWQuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGNsb3NlT3V0cHV0KG9mZmxvYWRlZFtpXSk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgaGFuZGxlIDogb2ZmbG9hZGVkKSB7CisgICAgICAgICAgICBjbG9zZU91dHB1dChoYW5kbGUpOwogICAgICAgICB9CiAgICAgfQogICAgIC8vIHVwZGF0ZSBtYXN0ZXIgbW9ubyBmb3IgYWxsIHJlbWFpbmluZyBvdXRwdXRzCkBAIC0zNDk4LDYgKzM0NjEsMjMgQEAKICAgICByZXR1cm4gY29tcHV0ZVZvbHVtZShzdHJlYW0sIGluZGV4LCBkZXZpY2UpOwogfQogCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0UmVjb3JkU2lsZW5jZWQodWlkX3QgdWlkLCBib29sIHNpbGVuY2VkKQoreworICAgIEFMT0dWKCJBdWRpb1BvbGljeU1hbmFnZXI6c2V0UmVjb3JkU2lsZW5jZWQodWlkOiVkLCBzaWxlbmNlZDolZCkiLCB1aWQsIHNpbGVuY2VkKTsKKworICAgIFZlY3RvcjxzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gPiBhY3RpdmVJbnB1dHMgPSBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0aXZlSW5wdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBhY3RpdmVEZXNjID0gYWN0aXZlSW5wdXRzW2ldOworICAgICAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIGFjdGl2ZVNlc3Npb25zID0gYWN0aXZlRGVzYy0+Z2V0QXVkaW9TZXNzaW9ucyh0cnVlKTsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBhY3RpdmVTZXNzaW9ucy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgc3A8QXVkaW9TZXNzaW9uPiBhY3RpdmVTZXNzaW9uID0gYWN0aXZlU2Vzc2lvbnMudmFsdWVBdChqKTsKKyAgICAgICAgICAgIGlmIChhY3RpdmVTZXNzaW9uLT51aWQoKSA9PSB1aWQpIHsKKyAgICAgICAgICAgICAgICBhY3RpdmVTZXNzaW9uLT5zZXRTaWxlbmNlZChzaWxlbmNlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6ZGlzY29ubmVjdEF1ZGlvU291cmNlKGNvbnN0IHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpCiB7CiAgICAgQUxPR1YoIiVzIGhhbmRsZSAlZCIsIF9fRlVOQ1RJT05fXywgc291cmNlRGVzYy0+Z2V0SGFuZGxlKCkpOwpAQCAtMzUxMyw3ICszNDkzLDEwIEBACiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoJnNvdXJjZURlc2MtPm1BdHRyaWJ1dGVzKTsKICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3dPdXRwdXREZXNjID0gc291cmNlRGVzYy0+bVN3T3V0cHV0LnByb21vdGUoKTsKICAgICBpZiAoc3dPdXRwdXREZXNjICE9IDApIHsKLSAgICAgICAgc3RvcFNvdXJjZShzd091dHB1dERlc2MsIHN0cmVhbSwgZmFsc2UpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdG9wU291cmNlKHN3T3V0cHV0RGVzYywgc3RyZWFtLCBmYWxzZSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN3T3V0cHV0RGVzYy0+c3RvcCgpOworICAgICAgICB9CiAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKICAgICB9IGVsc2UgewogICAgICAgICBzcDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gaHdPdXRwdXREZXNjID0gc291cmNlRGVzYy0+bUh3T3V0cHV0LnByb21vdGUoKTsKQEAgLTM1NDksNyArMzUzMiw3IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6Om5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCkKIHsKLSAgICByZXR1cm4gYW5kcm9pZF9hdG9taWNfaW5jKCZtQXVkaW9Qb3J0R2VuZXJhdGlvbik7CisgICAgcmV0dXJuIG1BdWRpb1BvcnRHZW5lcmF0aW9uKys7CiB9CiAKICNpZmRlZiBVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GCkBAIC0zNTYxLDMxICszNTQ0LDQ3IEBACiAKIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZUF1ZGlvUG9saWN5WG1sQ29uZmlnKEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpIHsKICAgICBjaGFyIGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZVtBVURJT19QT0xJQ1lfWE1MX0NPTkZJR19GSUxFX1BBVEhfTUFYX0xFTkdUSF07CisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IGZpbGVOYW1lczsKICAgICBzdGF0dXNfdCByZXQ7CiAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGtDb25maWdMb2NhdGlvbkxpc3RTaXplOyBpKyspIHsKLSAgICAgICAgUG9saWN5U2VyaWFsaXplciBzZXJpYWxpemVyOwotICAgICAgICBzbnByaW50ZihhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUsCi0gICAgICAgICAgICAgICAgIHNpemVvZihhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUpLAotICAgICAgICAgICAgICAgICAiJXMvJXMiLAotICAgICAgICAgICAgICAgICBrQ29uZmlnTG9jYXRpb25MaXN0W2ldLAotICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfWE1MX0NPTkZJR19GSUxFX05BTUUpOwotICAgICAgICByZXQgPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSwgY29uZmlnKTsKLSAgICAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgYnJlYWs7CisgICAgaWYgKHByb3BlcnR5X2dldF9ib29sKCJyby5ibHVldG9vdGguYTJkcF9vZmZsb2FkLnN1cHBvcnRlZCIsIGZhbHNlKSAmJgorICAgICAgICBwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5ibHVldG9vdGguYTJkcF9vZmZsb2FkLmRpc2FibGVkIiwgZmFsc2UpKSB7CisgICAgICAgIC8vIEEyRFAgb2ZmbG9hZCBzdXBwb3J0ZWQgYnV0IGRpc2FibGVkOiB0cnkgdG8gdXNlIHNwZWNpYWwgWE1MIGZpbGUKKyAgICAgICAgZmlsZU5hbWVzLnB1c2hfYmFjayhBVURJT19QT0xJQ1lfQTJEUF9PRkZMT0FEX0RJU0FCTEVEX1hNTF9DT05GSUdfRklMRV9OQU1FKTsKKyAgICB9CisgICAgZmlsZU5hbWVzLnB1c2hfYmFjayhBVURJT19QT0xJQ1lfWE1MX0NPTkZJR19GSUxFX05BTUUpOworCisgICAgZm9yIChjb25zdCBjaGFyKiBmaWxlTmFtZSA6IGZpbGVOYW1lcykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtDb25maWdMb2NhdGlvbkxpc3RTaXplOyBpKyspIHsKKyAgICAgICAgICAgIFBvbGljeVNlcmlhbGl6ZXIgc2VyaWFsaXplcjsKKyAgICAgICAgICAgIHNucHJpbnRmKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSwgc2l6ZW9mKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSksCisgICAgICAgICAgICAgICAgICAgICAiJXMvJXMiLCBrQ29uZmlnTG9jYXRpb25MaXN0W2ldLCBmaWxlTmFtZSk7CisgICAgICAgICAgICByZXQgPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSwgY29uZmlnKTsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiByZXQ7CiB9CiAjZW5kaWYKIAotQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvbGljeU1hbmFnZXIoQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSkKK0F1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIC8qZm9yVGVzdGluZyovKQogICAgIDoKLSNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAotICAgIFRocmVhZChmYWxzZSksCi0jZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAorICAgIG1VaWRDYWNoZWQoZ2V0dWlkKCkpLAorICAgIG1wQ2xpZW50SW50ZXJmYWNlKGNsaWVudEludGVyZmFjZSksCiAgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUoZmFsc2UpLCBtTGFzdFZvaWNlVm9sdW1lKC0xLjBmKSwKICAgICBtQTJkcFN1c3BlbmRlZChmYWxzZSksCisjaWZkZWYgVVNFX1hNTF9BVURJT19QT0xJQ1lfQ09ORgorICAgIG1Wb2x1bWVDdXJ2ZXMobmV3IFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24oKSksCisgICAgbUNvbmZpZyhtSHdNb2R1bGVzQWxsLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgbUF2YWlsYWJsZUlucHV0RGV2aWNlcywKKyAgICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlLCBzdGF0aWNfY2FzdDxWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uKj4obVZvbHVtZUN1cnZlcy5nZXQoKSkpLAorI2Vsc2UKKyAgICBtVm9sdW1lQ3VydmVzKG5ldyBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbigpKSwKKyAgICBtQ29uZmlnKG1Id01vZHVsZXNBbGwsIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLAorICAgICAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UpLAorI2VuZGlmCiAgICAgbUF1ZGlvUG9ydEdlbmVyYXRpb24oMSksCiAgICAgbUJlYWNvbk11dGVSZWZDb3VudCgwKSwKICAgICBtQmVhY29uUGxheWluZ1JlZkNvdW50KDApLApAQCAtMzU5NSw3MCArMzU5NCw3MiBAQAogICAgIG1NdXNpY0VmZmVjdE91dHB1dChBVURJT19JT19IQU5ETEVfTk9ORSksCiAgICAgbUhhc0NvbXB1dGVkU291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZShmYWxzZSkKIHsKLSAgICBtVWlkQ2FjaGVkID0gZ2V0dWlkKCk7Ci0gICAgbXBDbGllbnRJbnRlcmZhY2UgPSBjbGllbnRJbnRlcmZhY2U7Cit9CiAKLSAgICAvLyBUT0RPOiByZW1vdmUgd2hlbiBsZWdhY3kgY29uZiBmaWxlIGlzIHJlbW92ZWQuIHRydWUgb24gZGV2aWNlcyB0aGF0IHVzZSBEUkMgb24gdGhlCi0gICAgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIgcGF0aCB0byBib29zdCBzb2Z0IHNvdW5kcywgdXNlZCB0byBhZGp1c3Qgdm9sdW1lIGN1cnZlcyBhY2NvcmRpbmdseS4KLSAgICAvLyBOb3RlOiByZW1vdmUgYWxzbyBzcGVha2VyX2RyY19lbmFibGVkIGZyb20gZ2xvYmFsIGNvbmZpZ3VyYXRpb24gb2YgWE1MIGNvbmZpZyBmaWxlLgotICAgIGJvb2wgc3BlYWtlckRyY0VuYWJsZWQgPSBmYWxzZTsKK0F1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCisgICAgICAgIDogQXVkaW9Qb2xpY3lNYW5hZ2VyKGNsaWVudEludGVyZmFjZSwgZmFsc2UgLypmb3JUZXN0aW5nKi8pCit7CisgICAgbG9hZENvbmZpZygpOworICAgIGluaXRpYWxpemUoKTsKK30KIAordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmxvYWRDb25maWcoKSB7CiAjaWZkZWYgVVNFX1hNTF9BVURJT19QT0xJQ1lfQ09ORgotICAgIG1Wb2x1bWVDdXJ2ZXMgPSBuZXcgVm9sdW1lQ3VydmVzQ29sbGVjdGlvbigpOwotICAgIEF1ZGlvUG9saWN5Q29uZmlnIGNvbmZpZyhtSHdNb2R1bGVzLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgbUF2YWlsYWJsZUlucHV0RGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UsIHNwZWFrZXJEcmNFbmFibGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uICo+KG1Wb2x1bWVDdXJ2ZXMpKTsKLSAgICBpZiAoZGVzZXJpYWxpemVBdWRpb1BvbGljeVhtbENvbmZpZyhjb25maWcpICE9IE5PX0VSUk9SKSB7CisgICAgaWYgKGRlc2VyaWFsaXplQXVkaW9Qb2xpY3lYbWxDb25maWcoZ2V0Q29uZmlnKCkpICE9IE5PX0VSUk9SKSB7CiAjZWxzZQotICAgIG1Wb2x1bWVDdXJ2ZXMgPSBuZXcgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb24oKTsKLSAgICBBdWRpb1BvbGljeUNvbmZpZyBjb25maWcobUh3TW9kdWxlcywgbUF2YWlsYWJsZU91dHB1dERldmljZXMsIG1BdmFpbGFibGVJbnB1dERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlLCBzcGVha2VyRHJjRW5hYmxlZCk7Ci0gICAgaWYgKChDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRDb25maWcoQVVESU9fUE9MSUNZX1ZFTkRPUl9DT05GSUdfRklMRSwgY29uZmlnKSAhPSBOT19FUlJPUikgJiYKLSAgICAgICAgICAgIChDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRDb25maWcoQVVESU9fUE9MSUNZX0NPTkZJR19GSUxFLCBjb25maWcpICE9IE5PX0VSUk9SKSkgeworICAgIGlmICgoQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkQ29uZmlnKEFVRElPX1BPTElDWV9WRU5ET1JfQ09ORklHX0ZJTEUsIGdldENvbmZpZygpKSAhPSBOT19FUlJPUikKKyAgICAgICAgICAgJiYgKENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZENvbmZpZyhBVURJT19QT0xJQ1lfQ09ORklHX0ZJTEUsIGdldENvbmZpZygpKSAhPSBOT19FUlJPUikpIHsKICNlbmRpZgogICAgICAgICBBTE9HRSgiY291bGQgbm90IGxvYWQgYXVkaW8gcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZSwgc2V0dGluZyBkZWZhdWx0cyIpOwotICAgICAgICBjb25maWcuc2V0RGVmYXVsdCgpOworICAgICAgICBnZXRDb25maWcoKS5zZXREZWZhdWx0KCk7CiAgICAgfQotICAgIC8vIG11c3QgYmUgZG9uZSBhZnRlciByZWFkaW5nIHRoZSBwb2xpY3kgKHNpbmNlIGNvbmRpdGlvbm5lZCBieSBTcGVha2VyIERyYyBFbmFibGluZykKLSAgICBtVm9sdW1lQ3VydmVzLT5pbml0aWFsaXplVm9sdW1lQ3VydmVzKHNwZWFrZXJEcmNFbmFibGVkKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbml0aWFsaXplKCkgeworICAgIG1Wb2x1bWVDdXJ2ZXMtPmluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoZ2V0Q29uZmlnKCkuaXNTcGVha2VyRHJjRW5hYmxlZCgpKTsKIAogICAgIC8vIE9uY2UgcG9saWN5IGNvbmZpZyBoYXMgYmVlbiBwYXJzZWQsIHJldHJpZXZlIGFuIGluc3RhbmNlIG9mIHRoZSBlbmdpbmUgYW5kIGluaXRpYWxpemUgaXQuCiAgICAgYXVkaW9fcG9saWN5OjpFbmdpbmVJbnN0YW5jZSAqZW5naW5lSW5zdGFuY2UgPSBhdWRpb19wb2xpY3k6OkVuZ2luZUluc3RhbmNlOjpnZXRJbnN0YW5jZSgpOwogICAgIGlmICghZW5naW5lSW5zdGFuY2UpIHsKICAgICAgICAgQUxPR0UoIiVzOiAgQ291bGQgbm90IGdldCBhbiBpbnN0YW5jZSBvZiBwb2xpY3kgZW5naW5lIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgLy8gUmV0cmlldmUgdGhlIFBvbGljeSBNYW5hZ2VyIEludGVyZmFjZQogICAgIG1FbmdpbmUgPSBlbmdpbmVJbnN0YW5jZS0+cXVlcnlJbnRlcmZhY2U8QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlPigpOwogICAgIGlmIChtRW5naW5lID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IFBvbGljeSBFbmdpbmUgSW50ZXJmYWNlIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgbUVuZ2luZS0+c2V0T2JzZXJ2ZXIodGhpcyk7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUVuZ2luZS0+aW5pdENoZWNrKCk7Ci0gICAgKHZvaWQpIHN0YXR1czsKLSAgICBBTE9HX0FTU0VSVChzdGF0dXMgPT0gTk9fRVJST1IsICJQb2xpY3kgZW5naW5lIG5vdCBpbml0aWFsaXplZChlcnI9JWQpIiwgc3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR19GQVRBTCgiUG9saWN5IGVuZ2luZSBub3QgaW5pdGlhbGl6ZWQoZXJyPSVkKSIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQogCiAgICAgLy8gbUF2YWlsYWJsZU91dHB1dERldmljZXMgYW5kIG1BdmFpbGFibGVJbnB1dERldmljZXMgbm93IGNvbnRhaW4gYWxsIGF0dGFjaGVkIGRldmljZXMKICAgICAvLyBvcGVuIGFsbCBvdXRwdXQgc3RyZWFtcyBuZWVkZWQgdG8gYWNjZXNzIGF0dGFjaGVkIGRldmljZXMKICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlVHlwZXMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpOwogICAgIGF1ZGlvX2RldmljZXNfdCBpbnB1dERldmljZVR5cGVzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYgfkFVRElPX0RFVklDRV9CSVRfSU47Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPSBtcENsaWVudEludGVyZmFjZS0+bG9hZEh3TW9kdWxlKG1Id01vZHVsZXNbaV0tPmdldE5hbWUoKSk7Ci0gICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tSGFuZGxlID09IDApIHsKLSAgICAgICAgICAgIEFMT0dXKCJjb3VsZCBub3Qgb3BlbiBIVyBtb2R1bGUgJXMiLCBtSHdNb2R1bGVzW2ldLT5nZXROYW1lKCkpOworICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBtSHdNb2R1bGVzQWxsKSB7CisgICAgICAgIGh3TW9kdWxlLT5zZXRIYW5kbGUobXBDbGllbnRJbnRlcmZhY2UtPmxvYWRId01vZHVsZShod01vZHVsZS0+Z2V0TmFtZSgpKSk7CisgICAgICAgIGlmIChod01vZHVsZS0+Z2V0SGFuZGxlKCkgPT0gQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICBBTE9HVygiY291bGQgbm90IG9wZW4gSFcgbW9kdWxlICVzIiwgaHdNb2R1bGUtPmdldE5hbWUoKSk7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQorICAgICAgICBtSHdNb2R1bGVzLnB1c2hfYmFjayhod01vZHVsZSk7CiAgICAgICAgIC8vIG9wZW4gYWxsIG91dHB1dCBzdHJlYW1zIG5lZWRlZCB0byBhY2Nlc3MgYXR0YWNoZWQgZGV2aWNlcwogICAgICAgICAvLyBleGNlcHQgZm9yIGRpcmVjdCBvdXRwdXQgc3RyZWFtcyB0aGF0IGFyZSBvbmx5IG9wZW5lZCB3aGVuIHRoZXkgYXJlIGFjdHVhbGx5CiAgICAgICAgIC8vIHJlcXVpcmVkIGJ5IGFuIGFwcC4KICAgICAgICAgLy8gVGhpcyBhbHNvIHZhbGlkYXRlcyBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBsaXN0Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+IG91dFByb2ZpbGUgPSBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXNbal07Ci0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBvdXRQcm9maWxlIDogaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkpIHsKKyAgICAgICAgICAgIGlmICghb3V0UHJvZmlsZS0+Y2FuT3Blbk5ld0lvKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBPdXRwdXQgcHJvZmlsZSBtYXggb3BlbiBjb3VudCAldSBmb3IgcHJvZmlsZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgb3V0UHJvZmlsZS0+bWF4T3BlbkNvdW50LCBvdXRQcm9maWxlLT5nZXRUYWdOYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIW91dFByb2ZpbGUtPmhhc1N1cHBvcnRlZERldmljZXMoKSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJPdXRwdXQgcHJvZmlsZSBjb250YWlucyBubyBkZXZpY2Ugb24gbW9kdWxlICVzIiwgbUh3TW9kdWxlc1tpXS0+Z2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiT3V0cHV0IHByb2ZpbGUgY29udGFpbnMgbm8gZGV2aWNlIG9uIG1vZHVsZSAlcyIsIGh3TW9kdWxlLT5nZXROYW1lKCkpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKChvdXRQcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfVFRTKSAhPSAwKSB7CkBAIC0zNjg1LDM1ICszNjg2LDIwIEBACiAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXNGb3JUeXBlID0gc3VwcG9ydGVkRGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUocHJvZmlsZVR5cGUpOwogICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gZGV2aWNlc0ZvclR5cGUuc2l6ZSgpID4gMCA/IGRldmljZXNGb3JUeXBlLml0ZW1BdCgwKS0+bUFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmc4KCIiKTsKLQotICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSA9IHByb2ZpbGVUeXBlOwotICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOwotICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZTsKLSAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2s7Ci0gICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gb3V0cHV0RGVzYy0+bUZvcm1hdDsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5PdXRwdXQob3V0UHJvZmlsZS0+Z2V0TW9kdWxlSGFuZGxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tTGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1GbGFncyk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvdXRwdXREZXNjLT5vcGVuKG51bGxwdHIsIHByb2ZpbGVUeXBlLCBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9ERUZBVUxULCBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmb3V0cHV0KTsKIAogICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIEFMT0dXKCJDYW5ub3Qgb3BlbiBvdXRwdXQgc3RyZWFtIGZvciBkZXZpY2UgJTA4eCBvbiBodyBtb2R1bGUgJXMiLAogICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgbUh3TW9kdWxlc1tpXS0+Z2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICBod01vZHVsZS0+Z2V0TmFtZSgpKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOwotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Gb3JtYXQgPSBjb25maWcuZm9ybWF0OwotCi0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgIDwgc3VwcG9ydGVkRGV2aWNlcy5zaXplKCk7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuaW5kZXhPZihzdXBwb3J0ZWREZXZpY2VzW2tdKTsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGRldiA6IHN1cHBvcnRlZERldmljZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2YoZGV2KTsKICAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZSBhIHZhbGlkIElEIHRvIGFuIGF0dGFjaGVkIGRldmljZSBvbmNlIGNvbmZpcm1lZCBpdCBpcyByZWFjaGFibGUKICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2luZGV4XS0+aXNBdHRhY2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPmF0dGFjaChtSHdNb2R1bGVzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2luZGV4XS0+YXR0YWNoKGh3TW9kdWxlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAobVByaW1hcnlPdXRwdXQgPT0gMCAmJgpAQCAtMzcyMiwyMSArMzcwOCwyMyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBhZGRPdXRwdXQob3V0cHV0LCBvdXRwdXREZXNjKTsKICAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvLyBvcGVuIGlucHV0IHN0cmVhbXMgbmVlZGVkIHRvIGFjY2VzcyBhdHRhY2hlZCBkZXZpY2VzIHRvIHZhbGlkYXRlCiAgICAgICAgIC8vIG1BdmFpbGFibGVJbnB1dERldmljZXMgbGlzdAotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+IGluUHJvZmlsZSA9IG1Id01vZHVsZXNbaV0tPm1JbnB1dFByb2ZpbGVzW2pdOwotCisgICAgICAgIGZvciAoY29uc3QgYXV0byYgaW5Qcm9maWxlIDogaHdNb2R1bGUtPmdldElucHV0UHJvZmlsZXMoKSkgeworICAgICAgICAgICAgaWYgKCFpblByb2ZpbGUtPmNhbk9wZW5OZXdJbygpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgSW5wdXQgcHJvZmlsZSBtYXggb3BlbiBjb3VudCAldSBmb3IgcHJvZmlsZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgaW5Qcm9maWxlLT5tYXhPcGVuQ291bnQsIGluUHJvZmlsZS0+Z2V0VGFnTmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFpblByb2ZpbGUtPmhhc1N1cHBvcnRlZERldmljZXMoKSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJJbnB1dCBwcm9maWxlIGNvbnRhaW5zIG5vIGRldmljZSBvbiBtb2R1bGUgJXMiLCBtSHdNb2R1bGVzW2ldLT5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIEFMT0dXKCJJbnB1dCBwcm9maWxlIGNvbnRhaW5zIG5vIGRldmljZSBvbiBtb2R1bGUgJXMiLCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGNob3NlIGZpcnN0IGRldmljZSBwcmVzZW50IGluIHByb2ZpbGUncyBTdXBwb3J0ZWREZXZpY2VzIGFsc28gcGFydCBvZgpAQCAtMzc0Nyw0OSArMzczNSw0MCBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBBdWRpb0lucHV0RGVzY3JpcHRvcihpblByb2ZpbGUpOworICAgICAgICAgICAgICAgICAgICBuZXcgQXVkaW9JbnB1dERlc2NyaXB0b3IoaW5Qcm9maWxlLCBtcENsaWVudEludGVyZmFjZSk7CiAKLSAgICAgICAgICAgIGlucHV0RGVzYy0+bURldmljZSA9IHByb2ZpbGVUeXBlOwotCi0gICAgICAgICAgICAvLyBmaW5kIHRoZSBhZGRyZXNzCiAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgaW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUocHJvZmlsZVR5cGUpOwotICAgICAgICAgICAgLy8gICB0aGUgaW5wdXRzIHZlY3RvciBtdXN0IGJlIG9mIHNpemUgMSwgYnV0IHdlIGRvbid0IHdhbnQgdG8gY3Jhc2ggaGVyZQorICAgICAgICAgICAgLy8gICB0aGUgaW5wdXRzIHZlY3RvciBtdXN0IGJlIG9mIHNpemUgPj0gMSwgYnV0IHdlIGRvbid0IHdhbnQgdG8gY3Jhc2ggaGVyZQogICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gaW5wdXREZXZpY2VzLnNpemUoKSA+IDAgPyBpbnB1dERldmljZXMuaXRlbUF0KDApLT5tQWRkcmVzcwogICAgICAgICAgICAgICAgICAgICA6IFN0cmluZzgoIiIpOwogICAgICAgICAgICAgQUxPR1YoIiAgZm9yIGlucHV0IGRldmljZSAweCV4IHVzaW5nIGFkZHJlc3MgJXMiLCBwcm9maWxlVHlwZSwgYWRkcmVzcy5zdHJpbmcoKSk7CiAgICAgICAgICAgICBBTE9HRV9JRihpbnB1dERldmljZXMuc2l6ZSgpID09IDAsICJJbnB1dCBkZXZpY2UgbGlzdCBpcyBlbXB0eSEiKTsKIAotICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOwotICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gaW5wdXREZXNjLT5tU2FtcGxpbmdSYXRlOwotICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGlucHV0RGVzYy0+bUNoYW5uZWxNYXNrOwotICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IGlucHV0RGVzYy0+bUZvcm1hdDsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3BlbklucHV0KGluUHJvZmlsZS0+Z2V0TW9kdWxlSGFuZGxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0RGVzYy0+bURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX01JQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19OT05FKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGlucHV0RGVzYy0+b3BlbihudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX01JQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0KTsKIAogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmc3VwcG9ydGVkRGV2aWNlcyA9IGluUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrICA8IHN1cHBvcnRlZERldmljZXMuc2l6ZSgpOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9ICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmluZGV4T2Yoc3VwcG9ydGVkRGV2aWNlc1trXSk7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBkZXYgOiBpblByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5pbmRleE9mKGRldik7CiAgICAgICAgICAgICAgICAgICAgIC8vIGdpdmUgYSB2YWxpZCBJRCB0byBhbiBhdHRhY2hlZCBkZXZpY2Ugb25jZSBjb25maXJtZWQgaXQgaXMgcmVhY2hhYmxlCiAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRldkRlc2MtPmlzQXR0YWNoZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPmF0dGFjaChtSHdNb2R1bGVzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5hdHRhY2goaHdNb2R1bGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPmltcG9ydEF1ZGlvUG9ydChpblByb2ZpbGUsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KGlucHV0KTsKKyAgICAgICAgICAgICAgICBpbnB1dERlc2MtPmNsb3NlKCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIEFMT0dXKCJDYW5ub3Qgb3BlbiBpbnB1dCBzdHJlYW0gZm9yIGRldmljZSAlMDh4IG9uIGh3IG1vZHVsZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgaW5wdXREZXNjLT5tRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgIG1Id01vZHVsZXNbaV0tPmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgaHdNb2R1bGUtPmdldE5hbWUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0zODE5LDUzICszNzk4LDQyIEBACiAgICAgLy8gbWFrZSBzdXJlIGRlZmF1bHQgZGV2aWNlIGlzIHJlYWNoYWJsZQogICAgIGlmIChtRGVmYXVsdE91dHB1dERldmljZSA9PSAwIHx8IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2YobURlZmF1bHRPdXRwdXREZXZpY2UpIDwgMCkgewogICAgICAgICBBTE9HRSgiRGVmYXVsdCBkZXZpY2UgJTA4eCBpcyB1bnJlYWNoYWJsZSIsIG1EZWZhdWx0T3V0cHV0RGV2aWNlLT50eXBlKCkpOworICAgICAgICBzdGF0dXMgPSBOT19JTklUOworICAgIH0KKyAgICAvLyBJZiBtaWNyb3Bob25lcyBhZGRyZXNzIGlzIGVtcHR5LCBzZXQgaXQgYWNjb3JkaW5nIHRvIGRldmljZSB0eXBlCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIDwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+bUFkZHJlc3MuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBpZiAobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+dHlwZSgpID09IEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQykgeworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPm1BZGRyZXNzID0gU3RyaW5nOChBVURJT19CT1RUT01fTUlDUk9QSE9ORV9BRERSRVNTKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+dHlwZSgpID09IEFVRElPX0RFVklDRV9JTl9CQUNLX01JQykgeworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPm1BZGRyZXNzID0gU3RyaW5nOChBVURJT19CQUNLX01JQ1JPUEhPTkVfQUREUkVTUyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKLSAgICBBTE9HRV9JRigobVByaW1hcnlPdXRwdXQgPT0gMCksICJGYWlsZWQgdG8gb3BlbiBwcmltYXJ5IG91dHB1dCIpOworICAgIGlmIChtUHJpbWFyeU91dHB1dCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb3BlbiBwcmltYXJ5IG91dHB1dCIpOworICAgICAgICBzdGF0dXMgPSBOT19JTklUOworICAgIH0KIAogICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7Ci0KLSNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAotICAgIGlmIChtUHJpbWFyeU91dHB1dCAhPSAwKSB7Ci0gICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dENtZCA9IEF1ZGlvUGFyYW1ldGVyKCk7Ci0gICAgICAgIG91dHB1dENtZC5hZGRJbnQoU3RyaW5nOCgic2V0X2lkIiksIDApOwotICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtUHJpbWFyeU91dHB1dC0+bUlvSGFuZGxlLCBvdXRwdXRDbWQudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgbVRlc3REZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7Ci0gICAgICAgIG1UZXN0U2FtcGxpbmdSYXRlID0gNDQxMDA7Ci0gICAgICAgIG1UZXN0Rm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7Ci0gICAgICAgIG1UZXN0Q2hhbm5lbHMgPSAgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgICAgICBtVGVzdExhdGVuY3lNcyA9IDA7Ci0gICAgICAgIG1DdXJPdXRwdXQgPSAwOwotICAgICAgICBtRGlyZWN0T3V0cHV0ID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RFU1RfT1VUUFVUUzsgaSsrKSB7Ci0gICAgICAgICAgICBtVGVzdE91dHB1dHNbaV0gPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJBdWRpb1BvbGljeU1hbmFnZXJUZXN0Iik7Ci0gICAgICAgIHJ1bihidWZmZXIsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwotICAgIH0KLSNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogQXVkaW9Qb2xpY3lNYW5hZ2VyOjp+QXVkaW9Qb2xpY3lNYW5hZ2VyKCkKIHsKLSNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAotICAgIGV4aXQoKTsKLSNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCiAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChtT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgIG1PdXRwdXRzLnZhbHVlQXQoaSktPmNsb3NlKCk7CiAgICB9CiAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQobUlucHV0cy5rZXlBdChpKSk7CisgICAgICAgIG1JbnB1dHMudmFsdWVBdChpKS0+Y2xvc2UoKTsKICAgIH0KICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmNsZWFyKCk7CiAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmNsZWFyKCk7CiAgICBtT3V0cHV0cy5jbGVhcigpOwogICAgbUlucHV0cy5jbGVhcigpOwogICAgbUh3TW9kdWxlcy5jbGVhcigpOworICAgbUh3TW9kdWxlc0FsbC5jbGVhcigpOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmluaXRDaGVjaygpCkBAIC0zODczLDE3MCArMzg0MSwxMyBAQAogICAgIHJldHVybiBoYXNQcmltYXJ5T3V0cHV0KCkgPyBOT19FUlJPUiA6IE5PX0lOSVQ7CiB9CiAKLSNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OnRocmVhZExvb3AoKQotewotICAgIEFMT0dWKCJlbnRlcmluZyB0aHJlYWRMb29wKCkiKTsKLSAgICB3aGlsZSAoIWV4aXRQZW5kaW5nKCkpCi0gICAgewotICAgICAgICBTdHJpbmc4IGNvbW1hbmQ7Ci0gICAgICAgIGludCB2YWx1ZUludDsKLSAgICAgICAgU3RyaW5nOCB2YWx1ZTsKLQotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBtV2FpdFdvcmtDVi53YWl0UmVsYXRpdmUobUxvY2ssIG1pbGxpc2Vjb25kcyg1MCkpOwotCi0gICAgICAgIGNvbW1hbmQgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycygwLCBTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3kiKSk7Ci0gICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoY29tbWFuZCk7Ci0KLSAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3kiKSwgdmFsdWVJbnQpID09IE5PX0VSUk9SICYmCi0gICAgICAgICAgICB2YWx1ZUludCAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HVigiVGVzdCBjb21tYW5kICVzIHJlY2VpdmVkIiwgY29tbWFuZC5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBTdHJpbmc4IHRhcmdldDsKLSAgICAgICAgICAgIGlmIChwYXJhbS5nZXQoU3RyaW5nOCgidGFyZ2V0IiksIHRhcmdldCkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICB0YXJnZXQgPSAiTWFuYWdlciI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9vdXRwdXQiKSwgdmFsdWVJbnQpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9vdXRwdXQiKSk7Ci0gICAgICAgICAgICAgICAgbUN1ck91dHB1dCA9IHZhbHVlSW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcmFtLmdldChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfZGlyZWN0IiksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfZGlyZWN0IikpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAiZmFsc2UiKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EaXJlY3RPdXRwdXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09ICJ0cnVlIikgewotICAgICAgICAgICAgICAgICAgICBtRGlyZWN0T3V0cHV0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9pbnB1dCIpLCB2YWx1ZUludCkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2lucHV0IikpOwotICAgICAgICAgICAgICAgIG1UZXN0SW5wdXQgPSB2YWx1ZUludDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBhcmFtLmdldChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfZm9ybWF0IiksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfZm9ybWF0IikpOwotICAgICAgICAgICAgICAgIGludCBmb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gIlBDTSAxNiBiaXRzIikgewotICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09ICJQQ00gOCBiaXRzIikgewotICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzhfQklUOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gIkNvbXByZXNzZWQgTVAzIikgewotICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBBVURJT19GT1JNQVRfTVAzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9JTlZBTElEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gIk1hbmFnZXIiKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVGVzdEZvcm1hdCA9IGZvcm1hdDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0gIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgb3V0cHV0UGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZEZvcm1hdHMpLCBmb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLCBvdXRwdXRQYXJhbS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJhbS5nZXQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2NoYW5uZWxzIiksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfY2hhbm5lbHMiKSk7Ci0gICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzID0gMDsKLQotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAiQ2hhbm5lbHMgU3RlcmVvIikgewotICAgICAgICAgICAgICAgICAgICBjaGFubmVscyA9ICBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAiQ2hhbm5lbHMgTW9ubyIpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgPSAgQVVESU9fQ0hBTk5FTF9PVVRfTU9OTzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxzICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCA9PSAiTWFuYWdlciIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UZXN0Q2hhbm5lbHMgPSBjaGFubmVsczsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0gIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgb3V0cHV0UGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZENoYW5uZWxzKSwgY2hhbm5lbHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLCBvdXRwdXRQYXJhbS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X3NhbXBsZVJhdGUiKSwgdmFsdWVJbnQpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9zYW1wbGVSYXRlIikpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZUludCA+PSAwICYmIHZhbHVlSW50IDw9IDk2MDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGluZ1JhdGUgPSB2YWx1ZUludDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCA9PSAiTWFuYWdlciIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UZXN0U2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRQYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkU2FtcGxpbmdSYXRlcyksIHNhbXBsaW5nUmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0sIG91dHB1dFBhcmFtLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9yZW9wZW4iKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9yZW9wZW4iKSk7Ci0KLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQobXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG1QcmltYXJ5T3V0cHV0KTspOwotCi0gICAgICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZUhhbmRsZSA9IG1QcmltYXJ5T3V0cHV0LT5nZXRNb2R1bGVIYW5kbGUoKTsKLQotICAgICAgICAgICAgICAgIHJlbW92ZU91dHB1dChtUHJpbWFyeU91dHB1dC0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG5ldyBBdWRpb091dHB1dERlc2NyaXB0b3IoTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZSk7Ci0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSA9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKLSAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7Ci0gICAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZTsKLSAgICAgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrOwotICAgICAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBvdXRwdXREZXNjLT5tRm9ybWF0OwotICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZTsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChtb2R1bGVIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tTGF0ZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MpOwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZW9wZW4gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbSwgIgotICAgICAgICAgICAgICAgICAgICAgICAgInNhbXBsaW5nUmF0ZTogJWQsIGZvcm1hdCAlZCwgY2hhbm5lbHMgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSwgb3V0cHV0RGVzYy0+bUZvcm1hdCwgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOwotICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKLSAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQgPSBvdXRwdXREZXNjOwotICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRDbWQgPSBBdWRpb1BhcmFtZXRlcigpOwotICAgICAgICAgICAgICAgICAgICBvdXRwdXRDbWQuYWRkSW50KFN0cmluZzgoInNldF9pZCIpLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoaGFuZGxlLCBvdXRwdXRDbWQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZE91dHB1dChoYW5kbGUsIG91dHB1dERlc2MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycygwLCBTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3k9IikpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmV4aXQoKQotewotICAgIHsKLSAgICAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKLSAgICAgICAgcmVxdWVzdEV4aXQoKTsKLSAgICAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7Ci0gICAgfQotICAgIHJlcXVlc3RFeGl0QW5kV2FpdCgpOwotfQotCi1pbnQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp0ZXN0T3V0cHV0SW5kZXgoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQotewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RFU1RfT1VUUFVUUzsgaSsrKSB7Ci0gICAgICAgIGlmIChvdXRwdXQgPT0gbVRlc3RPdXRwdXRzW2ldKSByZXR1cm4gaTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAotCiAvLyAtLS0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmFkZE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYykKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphZGRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MpCiB7Ci0gICAgb3V0cHV0RGVzYy0+c2V0SW9IYW5kbGUob3V0cHV0KTsKICAgICBtT3V0cHV0cy5hZGQob3V0cHV0LCBvdXRwdXREZXNjKTsKKyAgICBhcHBseVN0cmVhbVZvbHVtZXMob3V0cHV0RGVzYywgQVVESU9fREVWSUNFX05PTkUsIDAgLyogZGVsYXlNcyAqLywgdHJ1ZSAvKiBmb3JjZSAqLyk7CiAgICAgdXBkYXRlTW9ubyhvdXRwdXQpOyAvLyB1cGRhdGUgbW9ubyBzdGF0dXMgd2hlbiBhZGRpbmcgdG8gb3V0cHV0IGxpc3QKICAgICBzZWxlY3RPdXRwdXRGb3JNdXNpY0VmZmVjdHMoKTsKICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwpAQCAtNDA0OCw5ICszODU5LDkgQEAKICAgICBzZWxlY3RPdXRwdXRGb3JNdXNpY0VmZmVjdHMoKTsKIH0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmFkZElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LCBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4mIGlucHV0RGVzYykKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphZGRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4mIGlucHV0RGVzYykKIHsKLSAgICBpbnB1dERlc2MtPnNldElvSGFuZGxlKGlucHV0KTsKICAgICBtSW5wdXRzLmFkZChpbnB1dCwgaW5wdXREZXNjKTsKICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwogfQpAQCAtNDA5NywxOSArMzkwOCwxNSBAQAogICAgICAgICB9CiAgICAgICAgIC8vIHRoZW4gbG9vayBmb3Igb3V0cHV0IHByb2ZpbGVzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQogICAgICAgICBTb3J0ZWRWZWN0b3I8IHNwPElPUHJvZmlsZT4gPiBwcm9maWxlczsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXNbal07CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBtSHdNb2R1bGVzKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKClbal07CiAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnREZXZpY2UoZGV2aWNlKSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoIWRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPnN1cHBvcnREZXZpY2VBZGRyZXNzKGFkZHJlc3MpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlcy5hZGQocHJvZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBwcm9maWxlICV6dSBmcm9tIG1vZHVsZSAlenUiLCBqLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIHByb2ZpbGUgJXp1IGZyb20gbW9kdWxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgaHdNb2R1bGUtPmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC00MTQ0LDMwICszOTUxLDIwIEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmICghcHJvZmlsZS0+Y2FuT3Blbk5ld0lvKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiTWF4IE91dHB1dCBudW1iZXIgJXUgYWxyZWFkeSBvcGVuZWQgZm9yIHRoaXMgcHJvZmlsZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bWF4T3BlbkNvdW50LCBwcm9maWxlLT5nZXRUYWdOYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIEFMT0dWKCJvcGVuaW5nIG91dHB1dCBmb3IgZGV2aWNlICUwOHggd2l0aCBwYXJhbXMgJXMgcHJvZmlsZSAlcCBuYW1lICVzIiwKICAgICAgICAgICAgICAgICAgIGRldmljZSwgYWRkcmVzcy5zdHJpbmcoKSwgcHJvZmlsZS5nZXQoKSwgcHJvZmlsZS0+Z2V0TmFtZSgpLnN0cmluZygpKTsKICAgICAgICAgICAgIGRlc2MgPSBuZXcgU3dBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSwgbXBDbGllbnRJbnRlcmZhY2UpOwotICAgICAgICAgICAgZGVzYy0+bURldmljZSA9IGRldmljZTsKLSAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKLSAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IGRlc2MtPm1TYW1wbGluZ1JhdGU7Ci0gICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gZGVzYy0+bUNoYW5uZWxNYXNrOwotICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IGRlc2MtPm1Gb3JtYXQ7Ci0gICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLnNhbXBsZV9yYXRlID0gZGVzYy0+bVNhbXBsaW5nUmF0ZTsKLSAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uY2hhbm5lbF9tYXNrID0gZGVzYy0+bUNoYW5uZWxNYXNrOwotICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5mb3JtYXQgPSBkZXNjLT5tRm9ybWF0OwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChwcm9maWxlLT5nZXRNb2R1bGVIYW5kbGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MtPm1EZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MtPm1MYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bUZsYWdzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBkZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotICAgICAgICAgICAgICAgIGRlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7Ci0gICAgICAgICAgICAgICAgZGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNjLT5vcGVuKG51bGxwdHIsIGRldmljZSwgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX0RFRkFVTFQsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsICZvdXRwdXQpOwogCisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgLy8gSGVyZSBpcyB3aGVyZSB0aGUgb3V0X3NldF9wYXJhbWV0ZXJzKCkgZm9yIGNhcmQgJiBkZXZpY2UgZ2V0cyBjYWxsZWQKICAgICAgICAgICAgICAgICBpZiAoIWFkZHJlc3MuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBhcmFtID0gYXVkaW9fZGV2aWNlX2FkZHJlc3NfdG9fcGFyYW1ldGVyKGRldmljZSwgYWRkcmVzcyk7CkBAIC00MTc3LDI3ICszOTc0LDIxIEBACiAgICAgICAgICAgICAgICAgdXBkYXRlQXVkaW9Qcm9maWxlcyhkZXZpY2UsIG91dHB1dCwgcHJvZmlsZS0+Z2V0QXVkaW9Qcm9maWxlcygpKTsKICAgICAgICAgICAgICAgICBpZiAoIXByb2ZpbGUtPmhhc1ZhbGlkQXVkaW9Qcm9maWxlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIG1pc3NpbmcgcGFyYW0iKTsKLSAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIGRlc2MtPmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZS0+aGFzRHluYW1pY0F1ZGlvUHJvZmlsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICBkZXNjLT5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+cGlja0F1ZGlvUHJvZmlsZShjb25maWcuc2FtcGxlX3JhdGUsIGNvbmZpZy5jaGFubmVsX21hc2ssIGNvbmZpZy5mb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPnBpY2tBdWRpb1Byb2ZpbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlLCBjb25maWcuY2hhbm5lbF9tYXNrLCBjb25maWcuZm9ybWF0KTsKICAgICAgICAgICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5zYW1wbGVfcmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKICAgICAgICAgICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5jaGFubmVsX21hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOwogICAgICAgICAgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLmZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KHByb2ZpbGUtPmdldE1vZHVsZUhhbmRsZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYy0+bURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MtPm1MYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tRmxhZ3MpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bUNoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1Gb3JtYXQgPSBjb25maWcuZm9ybWF0OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2MtPm9wZW4oJmNvbmZpZywgZGV2aWNlLCBhZGRyZXNzLCBBVURJT19TVFJFQU1fREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC00MjE5LDMxICs0MDEwLDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRwdXRzIHVzZWQgYnkgZHluYW1pYyBwb2xpY3kgbWl4ZXMKICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGR1cGxpY2F0ZWRPdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGluaXRpYWwgc3RyZWFtIHZvbHVtZSBmb3IgZGV2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICBhcHBseVN0cmVhbVZvbHVtZXMoZGVzYywgZGV2aWNlLCAwLCB0cnVlKTsKLQogICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPOiBjb25maWd1cmUgYXVkaW8gZWZmZWN0IG91dHB1dCBzdGFnZSBoZXJlCiAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wZW4gYSBkdXBsaWNhdGluZyBvdXRwdXQgdGhyZWFkIGZvciB0aGUgbmV3IG91dHB1dCBhbmQgdGhlIHByaW1hcnkgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVkT3V0cHV0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5EdXBsaWNhdGVPdXRwdXQob3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeU91dHB1dC0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkdXBsaWNhdGVkT3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZHVwT3V0cHV0RGVzYyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihOVUxMLCBtcENsaWVudEludGVyZmFjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkdXBPdXRwdXREZXNjLT5vcGVuRHVwbGljYXRpbmcobVByaW1hcnlPdXRwdXQsIGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cGxpY2F0ZWRPdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBkdXBsaWNhdGVkIG91dHB1dCBkZXNjcmlwdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGR1cE91dHB1dERlc2MgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKE5VTEwsIG1wQ2xpZW50SW50ZXJmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MSA9IG1QcmltYXJ5T3V0cHV0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1PdXRwdXQyID0gZGVzYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gZGVzYy0+bVNhbXBsaW5nUmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tRm9ybWF0ID0gZGVzYy0+bUZvcm1hdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2sgPSBkZXNjLT5tQ2hhbm5lbE1hc2s7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bUxhdGVuY3kgPSBkZXNjLT5tTGF0ZW5jeTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRPdXRwdXQoZHVwbGljYXRlZE91dHB1dCwgZHVwT3V0cHV0RGVzYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKGR1cE91dHB1dERlc2MsIGRldmljZSwgMCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBjb3VsZCBub3Qgb3BlbiBkdXAgb3V0cHV0IGZvciAlZCBhbmQgJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQtPm1Jb0hhbmRsZSwgb3V0cHV0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZU91dHB1dChvdXRwdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CkBAIC00Mjk1LDE3ICs0MDc1LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLy8gQ2xlYXIgYW55IHByb2ZpbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlzY29ubmVjdGVkIGRldmljZS4KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXNbal07CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBtSHdNb2R1bGVzKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKClbal07CiAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnREZXZpY2UoZGV2aWNlKSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xlYXJpbmcgZGlyZWN0IG91dHB1dCBwcm9maWxlICV6dSBvbiBtb2R1bGUgJXp1IiwgaiwgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsZWFyaW5nIGRpcmVjdCBvdXRwdXQgcHJvZmlsZSAlenUgb24gbW9kdWxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqLCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+Y2xlYXJBdWRpb1Byb2ZpbGVzKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNDMzOSwyMyArNDExNSwxOCBAQAogCiAgICAgICAgIC8vIHRoZW4gbG9vayBmb3IgaW5wdXQgcHJvZmlsZXMgdGhhdCBjYW4gYmUgcm91dGVkIHRvIHRoaXMgZGV2aWNlCiAgICAgICAgIFNvcnRlZFZlY3Rvcjwgc3A8SU9Qcm9maWxlPiA+IHByb2ZpbGVzOwotICAgICAgICBmb3IgKHNpemVfdCBtb2R1bGVfaWR4ID0gMDsgbW9kdWxlX2lkeCA8IG1Id01vZHVsZXMuc2l6ZSgpOyBtb2R1bGVfaWR4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtSHdNb2R1bGVzW21vZHVsZV9pZHhdLT5tSGFuZGxlID09IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6IG1Id01vZHVsZXMpIHsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IHByb2ZpbGVfaW5kZXggPSAwOwotICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4IDwgbUh3TW9kdWxlc1ttb2R1bGVfaWR4XS0+bUlucHV0UHJvZmlsZXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbUh3TW9kdWxlc1ttb2R1bGVfaWR4XS0+bUlucHV0UHJvZmlsZXNbcHJvZmlsZV9pbmRleF07CisgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXggPCBod01vZHVsZS0+Z2V0SW5wdXRQcm9maWxlcygpLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCsrKSB7CisgICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gaHdNb2R1bGUtPmdldElucHV0UHJvZmlsZXMoKVtwcm9maWxlX2luZGV4XTsKIAogICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0RGV2aWNlKGRldmljZSkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5zdXBwb3J0RGV2aWNlQWRkcmVzcyhhZGRyZXNzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZXMuYWRkKHByb2ZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBwcm9maWxlICV6dSBmcm9tIG1vZHVsZSAlenUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCwgbW9kdWxlX2lkeCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIHByb2ZpbGUgJXp1IGZyb20gbW9kdWxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCwgaHdNb2R1bGUtPmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC00MzcxLDYgKzQxNDIsNyBAQAogICAgICAgICBmb3IgKHNzaXplX3QgcHJvZmlsZV9pbmRleCA9IDA7IHByb2ZpbGVfaW5kZXggPCAoc3NpemVfdClwcm9maWxlcy5zaXplKCk7IHByb2ZpbGVfaW5kZXgrKykgewogCiAgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBwcm9maWxlc1twcm9maWxlX2luZGV4XTsKKwogICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbyBpZiBvbmUgaW5wdXQgaXMgYWxyZWFkeSBvcGVuZWQgZm9yIHRoaXMgcHJvZmlsZQogICAgICAgICAgICAgc2l6ZV90IGlucHV0X2luZGV4OwogICAgICAgICAgICAgZm9yIChpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKQEAgLTQzODYsMzEgKzQxNTgsMjIgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQUxPR1YoIm9wZW5pbmcgaW5wdXQgZm9yIGRldmljZSAweCVYIHdpdGggcGFyYW1zICVzIiwgZGV2aWNlLCBhZGRyZXNzLnN0cmluZygpKTsKLSAgICAgICAgICAgIGRlc2MgPSBuZXcgQXVkaW9JbnB1dERlc2NyaXB0b3IocHJvZmlsZSk7Ci0gICAgICAgICAgICBkZXNjLT5tRGV2aWNlID0gZGV2aWNlOwotICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOwotICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gZGVzYy0+bVNhbXBsaW5nUmF0ZTsKLSAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBkZXNjLT5tQ2hhbm5lbE1hc2s7Ci0gICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gZGVzYy0+bUZvcm1hdDsKKyAgICAgICAgICAgIGlmICghcHJvZmlsZS0+Y2FuT3Blbk5ld0lvKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiTWF4IElucHV0IG51bWJlciAldSBhbHJlYWR5IG9wZW5lZCBmb3IgdGhpcyBwcm9maWxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tYXhPcGVuQ291bnQsIHByb2ZpbGUtPmdldFRhZ05hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVzYyA9IG5ldyBBdWRpb0lucHV0RGVzY3JpcHRvcihwcm9maWxlLCBtcENsaWVudEludGVyZmFjZSk7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotCi0gICAgICAgICAgICBBTE9HVigib3BlbmluZyBpbnB1dHB1dCBmb3IgZGV2aWNlICUwOHggd2l0aCBwYXJhbXMgJXMgcHJvZmlsZSAlcCBuYW1lICVzIiwKLSAgICAgICAgICAgICAgICAgIGRlc2MtPm1EZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCksIHByb2ZpbGUuZ2V0KCksIHByb2ZpbGUtPmdldE5hbWUoKS5zdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuSW5wdXQocHJvZmlsZS0+Z2V0TW9kdWxlSGFuZGxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MtPm1EZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9NSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSAvKkZJWE1FKi8pOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzYy0+b3BlbihudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9NSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0KTsKIAogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGRlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7Ci0gICAgICAgICAgICAgICAgZGVzYy0+bUNoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKLSAgICAgICAgICAgICAgICBkZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKLQogICAgICAgICAgICAgICAgIGlmICghYWRkcmVzcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW0gPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoZGV2aWNlLCBhZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoaW5wdXQsIFN0cmluZzgocGFyYW0pKTsKQEAgLTQ0MTksNyArNDE4Miw3IEBACiAgICAgICAgICAgICAgICAgdXBkYXRlQXVkaW9Qcm9maWxlcyhkZXZpY2UsIGlucHV0LCBwcm9maWxlLT5nZXRBdWRpb1Byb2ZpbGVzKCkpOwogICAgICAgICAgICAgICAgIGlmICghcHJvZmlsZS0+aGFzVmFsaWRBdWRpb1Byb2ZpbGUoKSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKSBkaXJlY3QgaW5wdXQgbWlzc2luZyBwYXJhbSIpOwotICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VJbnB1dChpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIGRlc2MtPmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgICAgIGlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgICAgICAgICAgICAgfQogCkBAIC00NDU3LDE3ICs0MjIwLDE0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLy8gQ2xlYXIgYW55IHByb2ZpbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlzY29ubmVjdGVkIGRldmljZS4KLSAgICAgICAgZm9yIChzaXplX3QgbW9kdWxlX2luZGV4ID0gMDsgbW9kdWxlX2luZGV4IDwgbUh3TW9kdWxlcy5zaXplKCk7IG1vZHVsZV9pbmRleCsrKSB7Ci0gICAgICAgICAgICBpZiAobUh3TW9kdWxlc1ttb2R1bGVfaW5kZXhdLT5tSGFuZGxlID09IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6IG1Id01vZHVsZXMpIHsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IHByb2ZpbGVfaW5kZXggPSAwOwotICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4IDwgbUh3TW9kdWxlc1ttb2R1bGVfaW5kZXhdLT5tSW5wdXRQcm9maWxlcy5zaXplKCk7CisgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXggPCBod01vZHVsZS0+Z2V0SW5wdXRQcm9maWxlcygpLnNpemUoKTsKICAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCsrKSB7Ci0gICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbUh3TW9kdWxlc1ttb2R1bGVfaW5kZXhdLT5tSW5wdXRQcm9maWxlc1twcm9maWxlX2luZGV4XTsKKyAgICAgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBod01vZHVsZS0+Z2V0SW5wdXRQcm9maWxlcygpW3Byb2ZpbGVfaW5kZXhdOwogICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0RGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGNsZWFyaW5nIGRpcmVjdCBpbnB1dCBwcm9maWxlICV6dSBvbiBtb2R1bGUgJXp1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCwgbW9kdWxlX2luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGNsZWFyaW5nIGRpcmVjdCBpbnB1dCBwcm9maWxlICV6dSBvbiBtb2R1bGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgsIGh3TW9kdWxlLT5nZXROYW1lKCkpOwogICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5jbGVhckF1ZGlvUHJvZmlsZXMoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC00NDk1LDcgKzQyNTUsNyBAQAogICAgICAgICBpZiAoZHVwT3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYKICAgICAgICAgICAgICAgICAoZHVwT3V0cHV0RGVzYy0+bU91dHB1dDEgPT0gb3V0cHV0RGVzYyB8fAogICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1PdXRwdXQyID09IG91dHB1dERlc2MpKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MyOworICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MyOwogICAgICAgICAgICAgaWYgKGR1cE91dHB1dERlc2MtPm1PdXRwdXQxID09IG91dHB1dERlc2MpIHsKICAgICAgICAgICAgICAgICBvdXRwdXREZXNjMiA9IGR1cE91dHB1dERlc2MtPm1PdXRwdXQyOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTQ1MDUsMTAgKzQyNjUsMTYgQEAKICAgICAgICAgICAgIC8vIGFuZCBhcyB0aGV5IHdlcmUgYWxzbyByZWZlcmVuY2VkIG9uIHRoZSBvdGhlciBvdXRwdXQsIHRoZSByZWZlcmVuY2UKICAgICAgICAgICAgIC8vIGNvdW50IGZvciB0aGVpciBzdHJlYW0gdHlwZSBtdXN0IGJlIGFkanVzdGVkIGFjY29yZGluZ2x5IG9uCiAgICAgICAgICAgICAvLyB0aGUgb3RoZXIgb3V0cHV0LgorICAgICAgICAgICAgYm9vbCB3YXNBY3RpdmUgPSBvdXRwdXREZXNjMi0+aXNBY3RpdmUoKTsKICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgQVVESU9fU1RSRUFNX0NOVDsgaisrKSB7CiAgICAgICAgICAgICAgICAgaW50IHJlZkNvdW50ID0gZHVwT3V0cHV0RGVzYy0+bVJlZkNvdW50W2pdOwogICAgICAgICAgICAgICAgIG91dHB1dERlc2MyLT5jaGFuZ2VSZWZDb3VudCgoYXVkaW9fc3RyZWFtX3R5cGVfdClqLC1yZWZDb3VudCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBzdG9wKCkgd2lsbCBiZSBhIG5vIG9wIGlmIHRoZSBvdXRwdXQgaXMgc3RpbGwgYWN0aXZlIGJ1dCBpcyBuZWVkZWQgaW4gY2FzZSBhbGwKKyAgICAgICAgICAgIC8vIGFjdGl2ZSBzdHJlYW1zIHJlZmNvdW50cyB3aGVyZSBjbGVhcmVkIGFib3ZlCisgICAgICAgICAgICBpZiAod2FzQWN0aXZlKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYzItPnN0b3AoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGR1cGxpY2F0ZWRPdXRwdXQgPSBtT3V0cHV0cy5rZXlBdChpKTsKICAgICAgICAgICAgIEFMT0dWKCJjbG9zZU91dHB1dCgpIGNsb3NpbmcgYWxzbyBkdXBsaWNhdGVkIG91dHB1dCAlZCIsIGR1cGxpY2F0ZWRPdXRwdXQpOwogCkBAIC00NTI3LDExICs0MjkzLDggQEAKICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKICAgICB9CiAKLSAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKLSAgICBwYXJhbS5hZGQoU3RyaW5nOCgiY2xvc2luZyIpLCBTdHJpbmc4KCJ0cnVlIikpOwotICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG91dHB1dCwgcGFyYW0udG9TdHJpbmcoKSk7CisgICAgb3V0cHV0RGVzYy0+Y2xvc2UoKTsKIAotICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOwogICAgIHJlbW92ZU91dHB1dChvdXRwdXQpOwogICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKIH0KQEAgLTQ1NTYsNyArNDMxOSw3IEBACiAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CiAgICAgfQogCi0gICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQoaW5wdXQpOworICAgIGlucHV0RGVzYy0+Y2xvc2UoKTsKICAgICBtSW5wdXRzLnJlbW92ZUl0ZW0oaW5wdXQpOwogfQogCkBAIC00NjIyLDE0ICs0Mzg1LDE0IEBACiAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dEZvclN0cmF0ZWd5KCkgc3RyYXRlZ3kgJWQsIG1vdmluZyBmcm9tIG91dHB1dCAlZCB0byBvdXRwdXQgJWQiLAogICAgICAgICAgICAgICBzdHJhdGVneSwgc3JjT3V0cHV0c1swXSwgZHN0T3V0cHV0c1swXSk7CiAgICAgICAgIC8vIG11dGUgc3RyYXRlZ3kgd2hpbGUgbW92aW5nIHRyYWNrcyBmcm9tIG9uZSBvdXRwdXQgdG8gYW5vdGhlcgotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNyY091dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Ioc3JjT3V0cHV0c1tpXSk7CisgICAgICAgIGZvciAoYXVkaW9faW9faGFuZGxlX3Qgc3JjT3V0IDogc3JjT3V0cHV0cykgeworICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihzcmNPdXQpOwogICAgICAgICAgICAgaWYgKGlzU3RyYXRlZ3lBY3RpdmUoZGVzYywgc3RyYXRlZ3kpKSB7CiAgICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKHN0cmF0ZWd5LCB0cnVlLCBkZXNjKTsKICAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoc3RyYXRlZ3ksIGZhbHNlLCBkZXNjLCBNVVRFX1RJTUVfTVMsIG5ld0RldmljZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IHNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgIGdldFNvdXJjZUZvclN0cmF0ZWd5T25PdXRwdXQoc3JjT3V0cHV0c1tpXSwgc3RyYXRlZ3kpOworICAgICAgICAgICAgICAgICAgICBnZXRTb3VyY2VGb3JTdHJhdGVneU9uT3V0cHV0KHNyY091dCwgc3RyYXRlZ3kpOwogICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSAwKXsKICAgICAgICAgICAgICAgICBjb25uZWN0QXVkaW9Tb3VyY2Uoc291cmNlKTsKICAgICAgICAgICAgIH0KQEAgLTQ2NjYsNyArNDQyOSw3IEBACiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tBMmRwU3VzcGVuZCgpCiB7CiAgICAgYXVkaW9faW9faGFuZGxlX3QgYTJkcE91dHB1dCA9IG1PdXRwdXRzLmdldEEyZHBPdXRwdXQoKTsKLSAgICBpZiAoYTJkcE91dHB1dCA9PSAwKSB7CisgICAgaWYgKGEyZHBPdXRwdXQgPT0gMCB8fCBtT3V0cHV0cy5pc0EyZHBPZmZsb2FkZWRPblByaW1hcnkoKSkgewogICAgICAgICBtQTJkcFN1c3BlbmRlZCA9IGZhbHNlOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNDc4OSwxMCArNDU1MiwxMyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gSWYgd2UgYXJlIG5vdCBpbiBjYWxsIGFuZCBubyBjbGllbnQgaXMgYWN0aXZlIG9uIHRoaXMgaW5wdXQsIHRoaXMgbWV0aG9kcyByZXR1cm5zCisgICAgLy8gQVVESU9fREVWSUNFX05PTkUsIGNhdXNpbmcgdGhlIHBhdGNoIG9uIHRoZSBpbnB1dCBzdHJlYW0gdG8gYmUgcmVsZWFzZWQuCiAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gaW5wdXREZXNjLT5nZXRIaWdoZXN0UHJpb3JpdHlTb3VyY2UodHJ1ZSAvKmFjdGl2ZU9ubHkqLyk7Ci0gICAgaWYgKGlzSW5DYWxsKCkpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04pOwotICAgIH0gZWxzZSBpZiAoc291cmNlICE9IEFVRElPX1NPVVJDRV9ERUZBVUxUKSB7CisgICAgaWYgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfREVGQVVMVCAmJiBpc0luQ2FsbCgpKSB7CisgICAgICAgIHNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOworICAgIH0KKyAgICBpZiAoc291cmNlICE9IEFVRElPX1NPVVJDRV9ERUZBVUxUKSB7CiAgICAgICAgIGRldmljZSA9IGdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKHNvdXJjZSk7CiAgICAgfQogCkBAIC00ODIzLDkgKzQ1ODksOCBAQAogICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IGN1clN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKTsKICAgICAgICAgYXVkaW9fZGV2aWNlc190IGN1ckRldmljZXMgPQogICAgICAgICAgICAgICAgIGdldERldmljZUZvclN0cmF0ZWd5KChyb3V0aW5nX3N0cmF0ZWd5KWN1clN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShjdXJEZXZpY2VzLCBtT3V0cHV0cyk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0c1tpXSk7CisgICAgICAgIGZvciAoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0IDogZ2V0T3V0cHV0c0ZvckRldmljZShjdXJEZXZpY2VzLCBtT3V0cHV0cykpIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CiAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSkgewogICAgICAgICAgICAgICAgIGN1ckRldmljZXMgfD0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7CiAgICAgICAgICAgICB9CkBAIC00OTQzLDcgKzQ3MDgsNyBAQAogICAgIGZvciAoc2l6ZV90IHJvdXRlSW5kZXggPSAwOyByb3V0ZUluZGV4IDwgbU91dHB1dFJvdXRlcy5zaXplKCk7IHJvdXRlSW5kZXgrKykgewogICAgICAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gbU91dHB1dFJvdXRlcy52YWx1ZUF0KHJvdXRlSW5kZXgpOwogICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IHJvdXRlU3RyYXRlZ3kgPSBnZXRTdHJhdGVneShyb3V0ZS0+bVN0cmVhbVR5cGUpOwotICAgICAgICBpZiAoKHJvdXRlU3RyYXRlZ3kgPT0gc3RyYXRlZ3kpICYmIHJvdXRlLT5pc0FjdGl2ZSgpICYmCisgICAgICAgIGlmICgocm91dGVTdHJhdGVneSA9PSBzdHJhdGVneSkgJiYgcm91dGUtPmlzQWN0aXZlT3JDaGFuZ2VkKCkgJiYKICAgICAgICAgICAgICAgICAobUF2YWlsYWJsZU91dHB1dERldmljZXMuaW5kZXhPZihyb3V0ZS0+bURldmljZURlc2NyaXB0b3IpID49IDApKSB7CiAgICAgICAgICAgICByZXR1cm4gcm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yLT50eXBlKCk7CiAgICAgICAgIH0KQEAgLTUwNTUsMjEgKzQ4MjAsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFkZHJlc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXF1aXJlc011dGVDaGVjaykKIHsKICAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgZGV2aWNlICUwNHggZGVsYXlNcyAlZCIsIGRldmljZSwgZGVsYXlNcyk7CiAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07CiAgICAgdWludDMyX3QgbXV0ZVdhaXRNczsKIAogICAgIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICBtdXRlV2FpdE1zID0gc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MtPnN1Yk91dHB1dDEoKSwgZGV2aWNlLCBmb3JjZSwgZGVsYXlNcyk7Ci0gICAgICAgIG11dGVXYWl0TXMgKz0gc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MtPnN1Yk91dHB1dDIoKSwgZGV2aWNlLCBmb3JjZSwgZGVsYXlNcyk7CisgICAgICAgIG11dGVXYWl0TXMgPSBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYy0+c3ViT3V0cHV0MSgpLCBkZXZpY2UsIGZvcmNlLCBkZWxheU1zLAorICAgICAgICAgICAgICAgIG51bGxwdHIgLyogcGF0Y2hIYW5kbGUgKi8sIG51bGxwdHIgLyogYWRkcmVzcyAqLywgcmVxdWlyZXNNdXRlQ2hlY2spOworICAgICAgICBtdXRlV2FpdE1zICs9IHNldE91dHB1dERldmljZShvdXRwdXREZXNjLT5zdWJPdXRwdXQyKCksIGRldmljZSwgZm9yY2UsIGRlbGF5TXMsCisgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBwYXRjaEhhbmRsZSAqLywgbnVsbHB0ciAvKiBhZGRyZXNzICovLCByZXF1aXJlc011dGVDaGVjayk7CiAgICAgICAgIHJldHVybiBtdXRlV2FpdE1zOwogICAgIH0KICAgICAvLyBubyBuZWVkIHRvIHByb2NlZWQgaWYgbmV3IGRldmljZSBpcyBub3QgQVVESU9fREVWSUNFX05PTkUgYW5kIG5vdCBzdXBwb3J0ZWQgYnkgY3VycmVudAogICAgIC8vIG91dHB1dCBwcm9maWxlCiAgICAgaWYgKChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpICYmCi0gICAgICAgICAgICAoKGRldmljZSAmIG91dHB1dERlc2MtPnN1cHBvcnRlZERldmljZXMoKSkgPT0gMCkpIHsKKyAgICAgICAgICAgICgoZGV2aWNlICYgb3V0cHV0RGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpKSA9PSBBVURJT19ERVZJQ0VfTk9ORSkpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCkBAIC01MDgzLDcgKzQ4NTEsMTQgQEAKICAgICBpZiAoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7CiAgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSBkZXZpY2U7CiAgICAgfQotICAgIG11dGVXYWl0TXMgPSBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKG91dHB1dERlc2MsIHByZXZEZXZpY2UsIGRlbGF5TXMpOworCisgICAgLy8gaWYgdGhlIG91dHB1dHMgYXJlIG5vdCBtYXRlcmlhbGx5IGFjdGl2ZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBtdXRlLgorICAgIGlmIChyZXF1aXJlc011dGVDaGVjaykgeworICAgICAgICBtdXRlV2FpdE1zID0gY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcyhvdXRwdXREZXNjLCBwcmV2RGV2aWNlLCBkZWxheU1zKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiJXM6IHN1cHByZXNzaW5nIGNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMiLCBfX2Z1bmNfXyk7CisgICAgICAgIG11dGVXYWl0TXMgPSAwOworICAgIH0KIAogICAgIC8vIERvIG5vdCBjaGFuZ2UgdGhlIHJvdXRpbmcgaWY6CiAgICAgLy8gICAgICB0aGUgcmVxdWVzdGVkIGRldmljZSBpcyBBVURJT19ERVZJQ0VfTk9ORQpAQCAtNTI5OSwyNyArNTA3NCw0NiBAQAogICAgIC8vIFRPRE86IHBlcmhhcHMgaXNDb21wYXRpYmxlUHJvZmlsZSBzaG91bGQgcmV0dXJuIGEgIm1hdGNoaW5nIiBzY29yZSBzbyB3ZSBjYW4gcmV0dXJuCiAgICAgLy8gdGhlIGJlc3QgbWF0Y2hpbmcgcHJvZmlsZSwgbm90IHRoZSBmaXJzdCBvbmUuCiAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9PSAwKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBtSHdNb2R1bGVzW2ldLT5tSW5wdXRQcm9maWxlc1tqXTsKKyAgICBzcDxJT1Byb2ZpbGU+IGZpcnN0SW5leGFjdDsKKyAgICB1aW50MzJfdCB1cGRhdGVkU2FtcGxpbmdSYXRlID0gMDsKKyAgICBhdWRpb19mb3JtYXRfdCB1cGRhdGVkRm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgdXBkYXRlZENoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9JTlZBTElEOworICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBtSHdNb2R1bGVzKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgcHJvZmlsZSA6IGh3TW9kdWxlLT5nZXRJbnB1dFByb2ZpbGVzKCkpIHsKICAgICAgICAgICAgIC8vIHByb2ZpbGUtPmxvZygpOworICAgICAgICAgICAgLy91cGRhdGVkRm9ybWF0ID0gZm9ybWF0OwogICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2aWNlLCBhZGRyZXNzLCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxpbmdSYXRlIC8qdXBkYXRlZFNhbXBsaW5nUmF0ZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsaW5nUmF0ZSAgLyp1cGRhdGVkU2FtcGxpbmdSYXRlKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ybWF0IC8qdXBkYXRlZEZvcm1hdCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1hdCwgICAgICAgLyp1cGRhdGVkRm9ybWF0Ki8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5uZWxNYXNrIC8qdXBkYXRlZENoYW5uZWxNYXNrKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIGZsYWdzKSkgewotCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbE1hc2sgICAvKnVwZGF0ZWRDaGFubmVsTWFzayovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgdWdseSBjYXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKmV4YWN0TWF0Y2hSZXF1aXJlZEZvcklucHV0RmxhZ3MqLykpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gcHJvZmlsZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmaXJzdEluZXhhY3QgPT0gbnVsbHB0ciAmJiBwcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldmljZSwgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1cGRhdGVkU2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVwZGF0ZWRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1cGRhdGVkQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSB1Z2x5IGNhc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKmV4YWN0TWF0Y2hSZXF1aXJlZEZvcklucHV0RmxhZ3MqLykpIHsKKyAgICAgICAgICAgICAgICBmaXJzdEluZXhhY3QgPSBwcm9maWxlOworICAgICAgICAgICAgfQorCiAgICAgICAgIH0KICAgICB9CisgICAgaWYgKGZpcnN0SW5leGFjdCAhPSBudWxscHRyKSB7CisgICAgICAgIHNhbXBsaW5nUmF0ZSA9IHVwZGF0ZWRTYW1wbGluZ1JhdGU7CisgICAgICAgIGZvcm1hdCA9IHVwZGF0ZWRGb3JtYXQ7CisgICAgICAgIGNoYW5uZWxNYXNrID0gdXBkYXRlZENoYW5uZWxNYXNrOworICAgICAgICByZXR1cm4gZmlyc3RJbmV4YWN0OworICAgIH0KICAgICByZXR1cm4gTlVMTDsKIH0KIApAQCAtNTM0Niw3ICs1MTQwLDcgQEAKICAgICAvLyB0aGVuIHNlbGVjdCB0aGlzIGRldmljZS4KICAgICBmb3IgKHNpemVfdCByb3V0ZUluZGV4ID0gMDsgcm91dGVJbmRleCA8IG1JbnB1dFJvdXRlcy5zaXplKCk7IHJvdXRlSW5kZXgrKykgewogICAgICAgICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IG1JbnB1dFJvdXRlcy52YWx1ZUF0KHJvdXRlSW5kZXgpOwotICAgICAgICAgaWYgKChpbnB1dFNvdXJjZSA9PSByb3V0ZS0+bVNvdXJjZSkgJiYgcm91dGUtPmlzQWN0aXZlKCkgJiYKKyAgICAgICAgIGlmICgoaW5wdXRTb3VyY2UgPT0gcm91dGUtPm1Tb3VyY2UpICYmIHJvdXRlLT5pc0FjdGl2ZU9yQ2hhbmdlZCgpICYmCiAgICAgICAgICAgICAgICAgIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmluZGV4T2Yocm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yKSA+PSAwKSkgewogICAgICAgICAgICAgIHJldHVybiByb3V0ZS0+bURldmljZURlc2NyaXB0b3ItPnR5cGUoKTsKICAgICAgICAgIH0KQEAgLTUzNzMsNyArNTE2Nyw4IEBACiAgICAgfQogCiAgICAgLy8gaW4tY2FsbDogYWx3YXlzIGNhcCBlYXJwaWVjZSB2b2x1bWUgYnkgdm9pY2Ugdm9sdW1lICsgc29tZSBsb3cgaGVhZHJvb20KLSAgICBpZiAoKHN0cmVhbSAhPSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0UpICYmIGlzSW5DYWxsKCkpIHsKKyAgICBpZiAoKHN0cmVhbSAhPSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0UpICYmCisgICAgICAgICAgICAoaXNJbkNhbGwoKSB8fCBtT3V0cHV0cy5pc1N0cmVhbUFjdGl2ZUxvY2FsbHkoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpKSkgewogICAgICAgICBzd2l0Y2ggKHN0cmVhbSkgewogICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9TWVNURU06CiAgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX1JJTkc6CkBAIC01MzgzLDggKzUxNzgsMTEgQEAKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRToKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fRFRNRjoKICAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWTogewotICAgICAgICAgICAgY29uc3QgZmxvYXQgbWF4Vm9pY2VWb2xEYiA9IGNvbXB1dGVWb2x1bWUoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsIGluZGV4LCBkZXZpY2UpCi0gICAgICAgICAgICAgICAgICAgICsgSU5fQ0FMTF9FQVJQSUVDRV9IRUFEUk9PTV9EQjsKKyAgICAgICAgICAgIGludCB2b2ljZVZvbHVtZUluZGV4ID0KKyAgICAgICAgICAgICAgICBtVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleChBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSk7CisgICAgICAgICAgICBjb25zdCBmbG9hdCBtYXhWb2ljZVZvbERiID0KKyAgICAgICAgICAgICAgICBjb21wdXRlVm9sdW1lKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCB2b2ljZVZvbHVtZUluZGV4LCBBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFKQorICAgICAgICAgICAgICAgICsgSU5fQ0FMTF9FQVJQSUVDRV9IRUFEUk9PTV9EQjsKICAgICAgICAgICAgIGlmICh2b2x1bWVEQiA+IG1heFZvaWNlVm9sRGIpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiY29tcHV0ZVZvbHVtZSgpIHN0cmVhbSAlZCBhdCB2b2w9JWYgb3ZlcnJpZGVuIGJ5IHN0cmVhbSAlZCBhdCB2b2w9JWYiLAogICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCB2b2x1bWVEQiwgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsIG1heFZvaWNlVm9sRGIpOwpAQCAtNTQwOCw3ICs1MjA2LDggQEAKICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUyB8CiAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQgfAogICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkUgfAotICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9VU0JfSEVBRFNFVCkpICYmCisgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1VTQl9IRUFEU0VUIHwKKyAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQpKSAmJgogICAgICAgICAoKHN0cmVhbV9zdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pCiAgICAgICAgICAgICAgICAgfHwgKHN0cmVhbV9zdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCkKICAgICAgICAgICAgICAgICB8fCAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9TWVNURU0pCkBAIC01Nzg2LDcgKzU1ODUsNyBAQAogICAgIGJvb2wgc3VwcG9ydHNBQzMgPSBmYWxzZTsKICAgICBib29sIHN1cHBvcnRzT3RoZXJTdXJyb3VuZCA9IGZhbHNlOwogICAgIGJvb2wgc3VwcG9ydHNJRUM2MTkzNyA9IGZhbHNlOwotICAgIGZvciAoc2l6ZV90IGZvcm1hdEluZGV4ID0gMDsgZm9ybWF0SW5kZXggPCBmb3JtYXRzLnNpemUoKTsgZm9ybWF0SW5kZXgrKykgeworICAgIGZvciAoc3NpemVfdCBmb3JtYXRJbmRleCA9IDA7IGZvcm1hdEluZGV4IDwgKHNzaXplX3QpZm9ybWF0cy5zaXplKCk7IGZvcm1hdEluZGV4KyspIHsKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gZm9ybWF0c1tmb3JtYXRJbmRleF07CiAgICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7CiAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9BQzM6CkBAIC01Nzk1LDYgKzU1OTQsMTEgQEAKICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0VfQUMzOgogICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRFRTOgogICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRFRTX0hEOgorICAgICAgICAgICAgICAgIC8vIElmIEFMV0FZUywgcmVtb3ZlIGFsbCBvdGhlciBzdXJyb3VuZCBmb3JtYXRzIGhlcmUgc2luY2Ugd2Ugd2lsbCBhZGQgdGhlbSBsYXRlci4KKyAgICAgICAgICAgICAgICBpZiAoZm9yY2VVc2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfQUxXQVlTKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMucmVtb3ZlQXQoZm9ybWF0SW5kZXgpOworICAgICAgICAgICAgICAgICAgICBmb3JtYXRJbmRleC0tOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBzdXBwb3J0c090aGVyU3Vycm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfSUVDNjE5Mzc6CkBAIC01ODQwLDggKzU2NDQsNyBAQAogICAgICAgICAvLyBJZiBBTFdBWVMsIGFkZCBzdXBwb3J0IGZvciByYXcgc3Vycm91bmQgZm9ybWF0cyBpZiBhbGwgYXJlIG1pc3NpbmcuCiAgICAgICAgIC8vIFRoaXMgYXNzdW1lcyB0aGF0IGlmIGFueSBvZiB0aGVzZSBmb3JtYXRzIGFyZSByZXBvcnRlZCBieSB0aGUgSEFMCiAgICAgICAgIC8vIHRoZW4gdGhlIHJlcG9ydCBpcyB2YWxpZCBhbmQgc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4KLSAgICAgICAgaWYgKChmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9BTFdBWVMpCi0gICAgICAgICAgICAgICAgJiYgIXN1cHBvcnRzT3RoZXJTdXJyb3VuZCkgeworICAgICAgICBpZiAoZm9yY2VVc2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfQUxXQVlTKSB7CiAgICAgICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfRV9BQzMpOwogICAgICAgICAgICAgZm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0RUUyk7CiAgICAgICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfRFRTX0hEKTsKQEAgLTU4NzgsOCArNTY4MSw3IEBACiAgICAgfSBlbHNlIGlmIChmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9BTFdBWVMpIHsKICAgICAgICAgYm9vbCBzdXBwb3J0czVkb3QxID0gZmFsc2U7CiAgICAgICAgIC8vIEFyZSB0aGVyZSBhbnkgY2hhbm5lbCBtYXNrcyB0aGF0IGNhbiBiZSBjb25zaWRlcmVkICJzdXJyb3VuZCI/Ci0gICAgICAgIGZvciAoc2l6ZV90IG1hc2tJbmRleCA9IDA7IG1hc2tJbmRleCA8IGNoYW5uZWxNYXNrcy5zaXplKCk7IG1hc2tJbmRleCsrKSB7Ci0gICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrc1ttYXNrSW5kZXhdOworICAgICAgICBmb3IgKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrIDogY2hhbm5lbE1hc2tzKSB7CiAgICAgICAgICAgICBpZiAoKGNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSkgPT0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSkgewogICAgICAgICAgICAgICAgIHN1cHBvcnRzNWRvdDEgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNTkxNiwxMCArNTcxOCw4IEBACiAgICAgICAgIH0KICAgICAgICAgcHJvZmlsZXMuc2V0Rm9ybWF0cyhmb3JtYXRzKTsKICAgICB9Ci0gICAgY29uc3QgRm9ybWF0VmVjdG9yICZzdXBwb3J0ZWRGb3JtYXRzID0gcHJvZmlsZXMuZ2V0U3VwcG9ydGVkRm9ybWF0cygpOwogCi0gICAgZm9yIChzaXplX3QgZm9ybWF0SW5kZXggPSAwOyBmb3JtYXRJbmRleCA8IHN1cHBvcnRlZEZvcm1hdHMuc2l6ZSgpOyBmb3JtYXRJbmRleCsrKSB7Ci0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IHN1cHBvcnRlZEZvcm1hdHNbZm9ybWF0SW5kZXhdOworICAgIGZvciAoYXVkaW9fZm9ybWF0X3QgZm9ybWF0IDogcHJvZmlsZXMuZ2V0U3VwcG9ydGVkRm9ybWF0cygpKSB7CiAgICAgICAgIENoYW5uZWxzVmVjdG9yIGNoYW5uZWxNYXNrczsKICAgICAgICAgU2FtcGxlUmF0ZVZlY3RvciBzYW1wbGluZ1JhdGVzOwogICAgICAgICBBdWRpb1BhcmFtZXRlciByZXF1ZXN0ZWRQYXJhbWV0ZXJzOwpAQCAtNTk1NSw0ICs1NzU1LDQgQEAKICAgICB9CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCmluZGV4IDgyYzRjMzUuLjJiNjg4ODIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCkBAIC0xNiw2ICsxNiw5IEBACiAKICNwcmFnbWEgb25jZQogCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPG1lbW9yeT4KKwogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KQEAgLTMxLDYgKzM0LDcgQEAKICNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlci5oPgogI2luY2x1ZGUgPEF1ZGlvR2Fpbi5oPgorI2luY2x1ZGUgPEF1ZGlvUG9saWN5Q29uZmlnLmg+CiAjaW5jbHVkZSA8QXVkaW9Qb3J0Lmg+CiAjaW5jbHVkZSA8QXVkaW9QYXRjaC5oPgogI2luY2x1ZGUgPERldmljZURlc2NyaXB0b3IuaD4KQEAgLTc2LDEwICs4MCw2IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGNsYXNzIEF1ZGlvUG9saWN5TWFuYWdlciA6IHB1YmxpYyBBdWRpb1BvbGljeUludGVyZmFjZSwgcHVibGljIEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyCi0KLSNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAotICAgICwgcHVibGljIFRocmVhZAotI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKIHsKIAogcHVibGljOgpAQCAtMTAzLDE5ICsxMDMsMTQgQEAKIAogICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0U3lzdGVtUHJvcGVydHkoY29uc3QgY2hhciogcHJvcGVydHksIGNvbnN0IGNoYXIqIHZhbHVlKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKLSAgICAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyk7CisgICAgICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKQEAgLTE0MCw2ICsxMzUsNyBAQAogICAgICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIGlucHV0IHN0YXJ0cyBiZWluZyB1c2VkLgogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2lsZW5jZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jdXJyZW5jeV90eXBlX19tYXNrX3QgKmNvbmN1cnJlbmN5KTsKIAogICAgICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIGlucHV0IHN0b3BzIGJlaW5nIHVzZWQuCkBAIC0yNDAsNyArMjM2LDI0IEBACiAgICAgICAgIC8vIHJldHVybiB0aGUgc3RyYXRlZ3kgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIHN0cmVhbSB0eXBlCiAgICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3koYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0OwogCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpOworCiBwcm90ZWN0ZWQ6CisgICAgICAgIC8vIEEgY29uc3RydWN0b3IgdGhhdCBhbGxvd3MgbW9yZSBmaW5lLWdyYWluZWQgY29udHJvbCBvdmVyIGluaXRpYWxpemF0aW9uIHByb2Nlc3MsCisgICAgICAgIC8vIHVzZWQgaW4gYXV0b21hdGljIHRlc3RzLgorICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXIoQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSwgYm9vbCBmb3JUZXN0aW5nKTsKKworICAgICAgICAvLyBUaGVzZSBtZXRob2RzIHNob3VsZCBiZSB1c2VkIHdoZW4gZmluZXIgY29udHJvbCBvdmVyIEFQTSBpbml0aWFsaXphdGlvbgorICAgICAgICAvLyBpcyBuZWVkZWQsIGUuZy4gaW4gdGVzdHMuIE11c3QgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBjb25zdHJ1Y3RvcgorICAgICAgICAvLyB0aGF0IG9ubHkgcGVyZm9ybXMgZmllbGRzIGluaXRpYWxpemF0aW9uLiBUaGUgcHVibGljIGNvbnN0cnVjdG9yIGNvbXByaXNlcworICAgICAgICAvLyB0aGVzZSBzdGVwcyBpbiB0aGUgZm9sbG93aW5nIHNlcXVlbmNlOgorICAgICAgICAvLyAgIC0gZmllbGQgaW5pdGlhbGl6aW5nIGNvbnN0cnVjdG9yOworICAgICAgICAvLyAgIC0gbG9hZENvbmZpZzsKKyAgICAgICAgLy8gICAtIGluaXRpYWxpemUuCisgICAgICAgIEF1ZGlvUG9saWN5Q29uZmlnJiBnZXRDb25maWcoKSB7IHJldHVybiBtQ29uZmlnOyB9CisgICAgICAgIHZvaWQgbG9hZENvbmZpZygpOworICAgICAgICBzdGF0dXNfdCBpbml0aWFsaXplKCk7CisKICAgICAgICAgLy8gRnJvbSBBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlcgogICAgICAgICB2aXJ0dWFsIGNvbnN0IEF1ZGlvUGF0Y2hDb2xsZWN0aW9uICZnZXRBdWRpb1BhdGNoZXMoKSBjb25zdAogICAgICAgICB7CkBAIC0yNzUsNyArMjg4LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIG1EZWZhdWx0T3V0cHV0RGV2aWNlOwogICAgICAgICB9Ci1wcm90ZWN0ZWQ6CisKICAgICAgICAgdm9pZCBhZGRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MpOwogICAgICAgICB2b2lkIHJlbW92ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwogICAgICAgICB2b2lkIGFkZElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LCBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4mIGlucHV0RGVzYyk7CkBAIC0zMDQsNyArMzE3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFkZHJlc3MgPSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVxdWlyZXNNdXRlQ2hlY2sgPSB0cnVlKTsKICAgICAgICAgc3RhdHVzX3QgcmVzZXRPdXRwdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUgPSBOVUxMKTsKQEAgLTQxOSwxMSArNDMzLDYgQEAKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIG1FZmZlY3RzLmdldE1heEVmZmVjdHNNZW1vcnkoKTsKICAgICAgICAgfQotI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCi0gICAgICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHRocmVhZExvb3AoKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZXhpdCgpOwotICAgICAgICBpbnQgdGVzdE91dHB1dEluZGV4KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7Ci0jZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAogCiAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gZ2V0T3V0cHV0c0ZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24mIG9wZW5PdXRwdXRzKTsKQEAgLTQ4MSw2ICs0OTAsOSBAQAogICAgICAgICB9CiAKICAgICAgICAgdWludDMyX3QgdXBkYXRlQ2FsbFJvdXRpbmcoYXVkaW9fZGV2aWNlc190IHJ4RGV2aWNlLCB1aW50MzJfdCBkZWxheU1zID0gMCk7CisgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IGNyZWF0ZVRlbGVwaG9ueVBhdGNoKGJvb2wgaXNSeCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgdWludDMyX3QgZGVsYXlNcyk7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGZpbGxBdWRpb1BvcnRDb25maWdGb3JEZXZpY2UoCisgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKIAogICAgICAgICAvLyBpZiBhcmd1bWVudCAiZGV2aWNlIiBpcyBkaWZmZXJlbnQgZnJvbSBBVURJT19ERVZJQ0VfTk9ORSwgIHN0YXJ0U291cmNlKCkgd2lsbCBmb3JjZQogICAgICAgICAvLyB0aGUgcmUtZXZhbHVhdGlvbiBvZiB0aGUgb3V0cHV0IGRldmljZS4KQEAgLTUzNCwxOCArNTQ2LDIwIEBACiAgICAgICAgIFNlc3Npb25Sb3V0ZU1hcCBtT3V0cHV0Um91dGVzID0gU2Vzc2lvblJvdXRlTWFwKFNlc3Npb25Sb3V0ZU1hcDo6TUFQVFlQRV9PVVRQVVQpOwogICAgICAgICBTZXNzaW9uUm91dGVNYXAgbUlucHV0Um91dGVzID0gU2Vzc2lvblJvdXRlTWFwKFNlc3Npb25Sb3V0ZU1hcDo6TUFQVFlQRV9JTlBVVCk7CiAKLSAgICAgICAgSVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24gKm1Wb2x1bWVDdXJ2ZXM7IC8vIFZvbHVtZSBDdXJ2ZXMgcGVyIHVzZSBjYXNlIGFuZCBkZXZpY2UgY2F0ZWdvcnkKLQogICAgICAgICBib29sICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lOyAgICAgICAgLy8gbGltaXQgcmluZ3RvbmUgdm9sdW1lIHRvIG11c2ljIHZvbHVtZSBpZiBoZWFkc2V0IGNvbm5lY3RlZAogICAgICAgICBhdWRpb19kZXZpY2VzX3QgbURldmljZUZvclN0cmF0ZWd5W05VTV9TVFJBVEVHSUVTXTsKICAgICAgICAgZmxvYXQgICBtTGFzdFZvaWNlVm9sdW1lOyAgICAgICAgICAgIC8vIGxhc3Qgdm9pY2Ugdm9sdW1lIHZhbHVlIHNlbnQgdG8gYXVkaW8gSEFMCi0KLSAgICAgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gbUVmZmVjdHM7ICAvLyBsaXN0IG9mIHJlZ2lzdGVyZWQgYXVkaW8gZWZmZWN0cwogICAgICAgICBib29sICAgIG1BMmRwU3VzcGVuZGVkOyAgLy8gdHJ1ZSBpZiBBMkRQIG91dHB1dCBpcyBzdXNwZW5kZWQKLSAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gbURlZmF1bHRPdXRwdXREZXZpY2U7IC8vIG91dHB1dCBkZXZpY2Ugc2VsZWN0ZWQgYnkgZGVmYXVsdCBhdCBib290IHRpbWUKLSAgICAgICAgSHdNb2R1bGVDb2xsZWN0aW9uIG1Id01vZHVsZXM7CiAKLSAgICAgICAgdm9sYXRpbGUgaW50MzJfdCBtQXVkaW9Qb3J0R2VuZXJhdGlvbjsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uPiBtVm9sdW1lQ3VydmVzOyAvLyBWb2x1bWUgQ3VydmVzIHBlciB1c2UgY2FzZSBhbmQgZGV2aWNlIGNhdGVnb3J5CisgICAgICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIG1FZmZlY3RzOyAgLy8gbGlzdCBvZiByZWdpc3RlcmVkIGF1ZGlvIGVmZmVjdHMKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gbURlZmF1bHRPdXRwdXREZXZpY2U7IC8vIG91dHB1dCBkZXZpY2Ugc2VsZWN0ZWQgYnkgZGVmYXVsdCBhdCBib290IHRpbWUKKyAgICAgICAgSHdNb2R1bGVDb2xsZWN0aW9uIG1Id01vZHVsZXM7IC8vIGNvbnRhaW5zIG9ubHkgbW9kdWxlcyB0aGF0IGhhdmUgYmVlbiBsb2FkZWQgc3VjY2Vzc2Z1bGx5CisgICAgICAgIEh3TW9kdWxlQ29sbGVjdGlvbiBtSHdNb2R1bGVzQWxsOyAvLyBub3JtYWxseSBub3QgbmVlZGVkLCB1c2VkIGR1cmluZyBjb25zdHJ1Y3Rpb24gYW5kIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVtcHMKKyAgICAgICAgQXVkaW9Qb2xpY3lDb25maWcgbUNvbmZpZzsKKworICAgICAgICBzdGQ6OmF0b21pYzx1aW50MzJfdD4gbUF1ZGlvUG9ydEdlbmVyYXRpb247CiAKICAgICAgICAgQXVkaW9QYXRjaENvbGxlY3Rpb24gbUF1ZGlvUGF0Y2hlczsKIApAQCAtNTc0LDIyICs1ODgsNiBAQAogICAgICAgICBBdWRpb1BvbGljeU1peENvbGxlY3Rpb24gbVBvbGljeU1peGVzOyAvLyBsaXN0IG9mIHJlZ2lzdGVyZWQgbWl4ZXMKICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbU11c2ljRWZmZWN0T3V0cHV0OyAgICAgLy8gb3V0cHV0IHNlbGVjdGVkIGZvciBtdXNpYyBlZmZlY3RzCiAKLQotI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCi0gICAgICAgIE11dGV4ICAgbUxvY2s7Ci0gICAgICAgIENvbmRpdGlvbiBtV2FpdFdvcmtDVjsKLQotICAgICAgICBpbnQgICAgICAgICAgICAgbUN1ck91dHB1dDsKLSAgICAgICAgYm9vbCAgICAgICAgICAgIG1EaXJlY3RPdXRwdXQ7Ci0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1UZXN0T3V0cHV0c1tOVU1fVEVTVF9PVVRQVVRTXTsKLSAgICAgICAgaW50ICAgICAgICAgICAgIG1UZXN0SW5wdXQ7Ci0gICAgICAgIHVpbnQzMl90ICAgICAgICBtVGVzdERldmljZTsKLSAgICAgICAgdWludDMyX3QgICAgICAgIG1UZXN0U2FtcGxpbmdSYXRlOwotICAgICAgICB1aW50MzJfdCAgICAgICAgbVRlc3RGb3JtYXQ7Ci0gICAgICAgIHVpbnQzMl90ICAgICAgICBtVGVzdENoYW5uZWxzOwotICAgICAgICB1aW50MzJfdCAgICAgICAgbVRlc3RMYXRlbmN5TXM7Ci0jZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAotCiAgICAgICAgIHVpbnQzMl90IG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CiAKICAgICAgICAgLy8gQXVkaW8gUG9saWN5IEVuZ2luZSBJbnRlcmZhY2UuCkBAIC02MzAsMjAgKzYyOCwxNSBAQAogICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pOworICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzKTsKICAgICAgICAgLy8gaW50ZXJuYWwgbWV0aG9kIHRvIHJldHVybiB0aGUgaW5wdXQgaGFuZGxlIGZvciB0aGUgZ2l2ZW4gZGV2aWNlIGFuZCBmb3JtYXQKICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0SW5wdXRGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXggKnBvbGljeU1peCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcAppbmRleCAzMWM5NTc1Li5iMDY0ZjhjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCkBAIC0yMzMsNCArMjMzLDQgQEAKICAgICByZXR1cm4gQXVkaW9TeXN0ZW06Om5ld0F1ZGlvVW5pcXVlSWQodXNlKTsKIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcAppbmRleCA4NGIxMDczLi5jN2RmZTBmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCkBAIC0zOTksMTEgKzM5OSwxMiBAQAogICAgICAgICB3aGlsZSAocG9zICsgc2l6ZSA+ICp0b3RTaXplKSB7CiAgICAgICAgICAgICAqdG90U2l6ZSArPSAoKCp0b3RTaXplICsgNykgLyA4KSAqIDQ7CiAgICAgICAgIH0KLSAgICAgICAgKnBhcmFtID0gKGNoYXIgKilyZWFsbG9jKCpwYXJhbSwgKnRvdFNpemUpOwotICAgICAgICBpZiAoKnBhcmFtID09IE5VTEwpIHsKKyAgICAgICAgY2hhciAqbmV3UGFyYW0gPSAoY2hhciAqKXJlYWxsb2MoKnBhcmFtLCAqdG90U2l6ZSk7CisgICAgICAgIGlmIChuZXdQYXJhbSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXMgcmVhbGxvYyBlcnJvciBmb3Igc2l6ZSAlenUiLCBfX2Z1bmNfXywgKnRvdFNpemUpOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KKyAgICAgICAgKnBhcmFtID0gbmV3UGFyYW07CiAgICAgfQogICAgICpjdXJTaXplID0gcG9zICsgc2l6ZTsKICAgICByZXR1cm4gcG9zOwpAQCAtNzQ0LDQgKzc0NSw0IEBACiB9CiAKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5oCmluZGV4IDU5ZDVkMTQuLjYyMzE4MGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaApAQCAtMTkyLDYgKzE5Miw2IEBACiAgICAgS2V5ZWRWZWN0b3I8IGF1ZGlvX3Nlc3Npb25fdCwgRWZmZWN0VmVjdG9yKiA+IG1PdXRwdXRTZXNzaW9uczsKIH07CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvLyBBTkRST0lEX0FVRElPUE9MSUNZRUZGRUNUU19ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKaW5kZXggYjdiY2U1NS4uZjZkNDA3ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcApAQCAtMTgsOCArMTgsMTEgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgorCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgorI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00NCw2ICs0Nyw3IEBACiAKICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lKTsKIH0KQEAgLTU1LDYgKzU5LDcgQEAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOwogICAgIH0KKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MpOwogfQpAQCAtNzIsNiArNzcsNyBAQAogCiAgICAgQUxPR1YoImhhbmRsZURldmljZUNvbmZpZ0NoYW5nZSgpIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5oYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoZGV2aWNlLCBkZXZpY2VfYWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9uYW1lKTsKIH0KQEAgLTk0LDEwICsxMDAsMTAgQEAKICAgICAvLyBvcGVyYXRpb24gZnJvbSBwb2xpY3kgbWFuYWdlciBzdGFuZHBvaW50IChubyBvdGhlciBvcGVyYXRpb24gKGUuZyB0cmFjayBzdGFydCBvciBzdG9wKQogICAgIC8vIGNhbiBiZSBpbnRlcmxlYXZlZCkuCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLQogICAgIC8vIFRPRE86IGNoZWNrIGlmIGl0IGlzIG1vcmUgYXBwcm9wcmlhdGUgdG8gZG8gaXQgaW4gcGxhdGZvcm0gc3BlY2lmaWMgcG9saWN5IG1hbmFnZXIKICAgICBBdWRpb1N5c3RlbTo6c2V0TW9kZShzdGF0ZSk7CiAKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFBob25lU3RhdGUoc3RhdGUpOwogICAgIG1QaG9uZVN0YXRlID0gc3RhdGU7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtMTE1LDkgKzEyMSwxMSBAQAogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKKworICAgIGlmICghbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CisKICAgICBpZiAodXNhZ2UgPCAwIHx8IHVzYWdlID49IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQpAQCAtMTI2LDYgKzEzNCw3IEBACiAgICAgfQogICAgIEFMT0dWKCJzZXRGb3JjZVVzZSgpIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldEZvcmNlVXNlKHVzYWdlLCBjb25maWcpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTEzOCwxNSArMTQ3LDExIEBACiAgICAgaWYgKHVzYWdlIDwgMCB8fCB1c2FnZSA+PSBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVCkgewogICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkU7CiAgICAgfQorICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldEZvcmNlVXNlKHVzYWdlKTsKIH0KIAotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQorYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCiB7CiAgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQpIHsKICAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOwpAQCAtMTU2LDE0ICsxNjEsMTUgQEAKICAgICB9CiAgICAgQUxPR1YoImdldE91dHB1dCgpIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0T3V0cHV0KHN0cmVhbSwgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MsIG9mZmxvYWRJbmZvKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRPdXRwdXQoc3RyZWFtKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCkBAIC0xNzMsNyArMTc5LDcgQEAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICBBTE9HVigiZ2V0T3V0cHV0KCkiKTsKKyAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yQXR0cigpIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAogICAgIGNvbnN0IHVpZF90IGNhbGxpbmdVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CkBAIC0xODIsOSArMTg4LDI3IEBACiAgICAgICAgICAgICAgICAgIiVzIHVpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgJWQiLCBfX0ZVTkNUSU9OX18sIGNhbGxpbmdVaWQsIHVpZCk7CiAgICAgICAgIHVpZCA9IGNhbGxpbmdVaWQ7CiAgICAgfQotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRPdXRwdXRGb3JBdHRyKGF0dHIsIG91dHB1dCwgc2Vzc2lvbiwgc3RyZWFtLCB1aWQsCisgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3Qgb3JpZ2luYWxGbGFncyA9IGZsYWdzOworICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0T3V0cHV0Rm9yQXR0cihhdHRyLCBvdXRwdXQsIHNlc3Npb24sIHN0cmVhbSwgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgcG9ydElkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZCk7CisKKyAgICAvLyBGSVhNRTogSW50cm9kdWNlIGEgd2F5IHRvIGNoZWNrIGZvciB0aGUgdGhlIHRlbGVwaG9ueSBkZXZpY2UgYmVmb3JlIG9wZW5pbmcgdGhlIG91dHB1dAorICAgIGlmICgocmVzdWx0ID09IE5PX0VSUk9SKSAmJgorICAgICAgICAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19JTkNBTExfTVVTSUMpICYmCisgICAgICAgICFtb2RpZnlQaG9uZVN0YXRlQWxsb3dlZChwaWQsIHVpZCkpIHsKKyAgICAgICAgLy8gSWYgdGhlIGFwcCB0cmllcyB0byBwbGF5IG11c2ljIHRocm91Z2ggdGhlIHRlbGVwaG9ueSBkZXZpY2UgYW5kIGRvZXNuJ3QgaGF2ZSBwZXJtaXNzaW9uCisgICAgICAgIC8vIHRoZSBmYWxsYmFjayB0byB0aGUgZGVmYXVsdCBvdXRwdXQgZGV2aWNlLgorICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlT3V0cHV0KCpvdXRwdXQsICpzdHJlYW0sIHNlc3Npb24pOworICAgICAgICBmbGFncyA9IG9yaWdpbmFsRmxhZ3M7CisgICAgICAgICpzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICAgICAgKnBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgIHJlc3VsdCA9IG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE91dHB1dEZvckF0dHIoYXR0ciwgb3V0cHV0LCBzZXNzaW9uLCBzdHJlYW0sIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKQEAgLTIxMSw2ICsyMzUsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOwogfQogCkBAIC0yNDcsNiArMjcyLDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOwogfQogCkBAIC0yNjcsNiArMjkzLDcgQEAKIHsKICAgICBBTE9HVigiZG9SZWxlYXNlT3V0cHV0IGZyb20gdGlkICVkIiwgZ2V0dGlkKCkpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgLy8gY2FsbGVkIGZyb20gaW50ZXJuYWwgdGhyZWFkOiBubyBuZWVkIHRvIGNsZWFyIGNhbGxlciBpZGVudGl0eQogICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOwogfQogCkBAIC0yNzUsNiArMzAyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKQEAgLTI4Myw5ICszMTEsMTAgQEAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KKwogICAgIC8vIGFscmVhZHkgY2hlY2tlZCBieSBjbGllbnQsIGJ1dCBkb3VibGUtY2hlY2sgaW4gY2FzZSB0aGUgY2xpZW50IHdyYXBwZXIgaXMgYnlwYXNzZWQKLSAgICBpZiAoYXR0ci0+c291cmNlID49IEFVRElPX1NPVVJDRV9DTlQgJiYgYXR0ci0+c291cmNlICE9IEFVRElPX1NPVVJDRV9IT1RXT1JEICYmCi0gICAgICAgIGF0dHItPnNvdXJjZSAhPSBBVURJT19TT1VSQ0VfRk1fVFVORVIpIHsKKyAgICBpZiAoYXR0ci0+c291cmNlIDwgQVVESU9fU09VUkNFX0RFRkFVTFQgJiYgYXR0ci0+c291cmNlID49IEFVRElPX1NPVVJDRV9DTlQgJiYKKyAgICAgICAgICAgIGF0dHItPnNvdXJjZSAhPSBBVURJT19TT1VSQ0VfSE9UV09SRCAmJiBhdHRyLT5zb3VyY2UgIT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC0zMDYsNiArMzM1LDIwIEBACiAgICAgICAgIHBpZCA9IGNhbGxpbmdQaWQ7CiAgICAgfQogCisgICAgLy8gY2hlY2sgY2FsbGluZyBwZXJtaXNzaW9ucworICAgIGlmICghcmVjb3JkaW5nQWxsb3dlZChvcFBhY2thZ2VOYW1lLCBwaWQsIHVpZCkpIHsKKyAgICAgICAgQUxPR0UoIiVzIHBlcm1pc3Npb24gZGVuaWVkOiByZWNvcmRpbmcgbm90IGFsbG93ZWQgZm9yIHVpZCAlZCBwaWQgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCB1aWQsIHBpZCk7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICBpZiAoKGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LIHx8CisgICAgICAgIGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTksgfHwKKyAgICAgICAgYXR0ci0+c291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMKSAmJgorICAgICAgICAhY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChwaWQsIHVpZCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKwogICAgIGlmICgoYXR0ci0+c291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSAmJiAhY2FwdHVyZUhvdHdvcmRBbGxvd2VkKHBpZCwgdWlkKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KQEAgLTMxNiwxMSArMzU5LDE0IEBACiAgICAgICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjppbnB1dF90eXBlX3QgaW5wdXRUeXBlOwogCiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIC8vIHRoZSBhdWRpb19pbl9hY291c3RpY3NfdCBwYXJhbWV0ZXIgaXMgaWdub3JlZCBieSBnZXRfaW5wdXQoKQotICAgICAgICBzdGF0dXMgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRJbnB1dEZvckF0dHIoYXR0ciwgaW5wdXQsIHNlc3Npb24sIHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0VHlwZSwgcG9ydElkKTsKKyAgICAgICAgeworICAgICAgICAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKyAgICAgICAgICAgIC8vIHRoZSBhdWRpb19pbl9hY291c3RpY3NfdCBwYXJhbWV0ZXIgaXMgaWdub3JlZCBieSBnZXRfaW5wdXQoKQorICAgICAgICAgICAgc3RhdHVzID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0SW5wdXRGb3JBdHRyKGF0dHIsIGlucHV0LCBzZXNzaW9uLCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dFR5cGUsIHBvcnRJZCk7CisgICAgICAgIH0KICAgICAgICAgYXVkaW9Qb2xpY3lFZmZlY3RzID0gbUF1ZGlvUG9saWN5RWZmZWN0czsKIAogICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CkBAIC0zNTEsMTAgKzM5NywxOCBAQAogCiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUEVSTUlTU0lPTl9ERU5JRUQpIHsKKyAgICAgICAgICAgICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgICAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VJbnB1dCgqaW5wdXQsIHNlc3Npb24pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQorCisgICAgICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBjbGllbnQgPQorICAgICAgICAgICAgICAgIG5ldyBBdWRpb1JlY29yZENsaWVudCgqYXR0ciwgKmlucHV0LCB1aWQsIHBpZCwgb3BQYWNrYWdlTmFtZSwgc2Vzc2lvbik7CisgICAgICAgIGNsaWVudC0+YWN0aXZlID0gZmFsc2U7CisgICAgICAgIGNsaWVudC0+aXNDb25jdXJyZW50ID0gZmFsc2U7CisgICAgICAgIGNsaWVudC0+aXNWaXJ0dWFsRGV2aWNlID0gZmFsc2U7IC8vVE9ETyA6IHVwZGF0ZSBmcm9tIEFQTS0+Z2V0SW5wdXRGb3JBdHRyKCkKKyAgICAgICAgbUF1ZGlvUmVjb3JkQ2xpZW50cy5hZGQoKnBvcnRJZCwgY2xpZW50KTsKICAgICB9CiAKICAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzICE9IDApIHsKQEAgLTM2NywxNSArNDIxLDEyMiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorLy8gdGhpcyBpcyByZXBsaWNhdGVkIGZyb20gZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAKKy8vIFhYWCAtLSBmaWd1cmUgb3V0IGhvdyB0byBwdXQgaXQgaW50byBhIGNvbW1vbiwgc2hhcmVkIGxvY2F0aW9uCisKK3N0YXRpYyBzdGQ6OnN0cmluZyBhdWRpb1NvdXJjZVN0cmluZyhhdWRpb19zb3VyY2VfdCB2YWx1ZSkgeworICAgIHN0ZDo6c3RyaW5nIHNvdXJjZTsKKyAgICBpZiAoU291cmNlVHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcodmFsdWUsIHNvdXJjZSkpIHsKKyAgICAgICAgcmV0dXJuIHNvdXJjZTsKKyAgICB9CisgICAgY2hhciByYXdidWZmZXJbMTZdOyAgLy8gcm9vbSBmb3IgIiVkIgorICAgIHNucHJpbnRmKHJhd2J1ZmZlciwgc2l6ZW9mKHJhd2J1ZmZlciksICIlZCIsIHZhbHVlKTsKKyAgICByZXR1cm4gcmF3YnVmZmVyOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgYXVkaW9Db25jdXJyZW5jeVN0cmluZyhBdWRpb1BvbGljeUludGVyZmFjZTo6Y29uY3VycmVuY3lfdHlwZV9fbWFza190IGNvbmN1cnJlbmN5KQoreworICAgIGNoYXIgYnVmZmVyWzY0XTsgLy8gb3ZlcnNpemVkCisgICAgaWYgKGNvbmN1cnJlbmN5ICYgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9BTEwpIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVzJXMlcyVzIiwKKyAgICAgICAgICAgIChjb25jdXJyZW5jeSAmIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FMTCk/ICIsY2FsbCI6IiIsCisgICAgICAgICAgICAoY29uY3VycmVuY3kgJiBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBUFRVUkUpPyAiLGNhcHR1cmUiOiIiLAorICAgICAgICAgICAgKGNvbmN1cnJlbmN5ICYgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9IT1RXT1JEKT8gIixob3R3b3JkIjoiIiwKKyAgICAgICAgICAgIChjb25jdXJyZW5jeSAmIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfUFJFRU1QVCk/ICIscHJlZW1wdCI6IiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIsbm9uZSIpOworICAgIH0KKworICAgIHJldHVybiAmYnVmZmVyWzFdOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsIGJvb2wgKnNpbGVuY2VkKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQorICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9SZWNvcmRDbGllbnRzLmluZGV4T2ZLZXkocG9ydElkKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IG1BdWRpb1JlY29yZENsaWVudHMudmFsdWVBdChpbmRleCk7CisgICAgfQorCisgICAgLy8gY2hlY2sgY2FsbGluZyBwZXJtaXNzaW9ucworICAgIGlmICghc3RhcnRSZWNvcmRpbmcoY2xpZW50LT5vcFBhY2thZ2VOYW1lLCBjbGllbnQtPnBpZCwgY2xpZW50LT51aWQpKSB7CisgICAgICAgIEFMT0dFKCIlcyBwZXJtaXNzaW9uIGRlbmllZDogcmVjb3JkaW5nIG5vdCBhbGxvd2VkIGZvciB1aWQgJWQgcGlkICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2xpZW50LT51aWQsIGNsaWVudC0+cGlkKTsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIC8vIElmIFVJRCBpbmFjdGl2ZSBpdCByZWNvcmRzIHNpbGVuY2UgdW50aWwgYmVjb21pbmcgYWN0aXZlCisgICAgKnNpbGVuY2VkID0gIW1VaWRQb2xpY3ktPmlzVWlkQWN0aXZlKGNsaWVudC0+dWlkKSAmJiAhY2xpZW50LT5pc1ZpcnR1YWxEZXZpY2U7CisKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpjb25jdXJyZW5jeV90eXBlX19tYXNrX3QgY29uY3VycmVuY3k7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRJbnB1dChpbnB1dCwgc2Vzc2lvbiwgJmNvbmN1cnJlbmN5KTsKKyAgICBBdWRpb1BvbGljeUludGVyZmFjZTo6Y29uY3VycmVuY3lfdHlwZV9fbWFza190IGNvbmN1cnJlbmN5ID0KKyAgICAgICAgICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfTk9ORTsKKworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICB7CisgICAgICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisgICAgICAgIHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPnN0YXJ0SW5wdXQoCisgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+aW5wdXQsIGNsaWVudC0+c2Vzc2lvbiwgKnNpbGVuY2VkLCAmY29uY3VycmVuY3kpOworCisgICAgfQorCisgICAgLy8gWFhYIGxvZyB0aGVtIGFsbCBmb3IgYSB3aGlsZSwgZHVyaW5nIHNvbWUgZG9nZm9vZGluZy4KKyAgICBpZiAoMSB8fCBzdGF0dXMgIT0gTk9fRVJST1IpIHsKKworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUG9saWN5W10gPSAiYXVkaW9wb2xpY3kiOworCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9Qb2xpY3lSZWFzb25bXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LnJlYXNvbiI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9Qb2xpY3lTdGF0dXNbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LnN0YXR1cyI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9Qb2xpY3lScXN0U3JjW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5ycXN0LnNyYyI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9Qb2xpY3lScXN0UGtnW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5ycXN0LnBrZyI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9Qb2xpY3lScXN0U2Vzc2lvbltdID0gImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kucnFzdC5zZXNzaW9uIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1BvbGljeUFjdGl2ZVNyY1tdID0gImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kuYWN0aXZlLnNyYyI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9Qb2xpY3lBY3RpdmVQa2dbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LmFjdGl2ZS5wa2ciOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUG9saWN5QWN0aXZlU2Vzc2lvbltdID0gImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kuYWN0aXZlLnNlc3Npb24iOworCisgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0F1ZGlvUG9saWN5KTsKKyAgICAgICAgaWYgKGl0ZW0gIT0gTlVMTCkgeworCisgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeVJlYXNvbiwgYXVkaW9Db25jdXJyZW5jeVN0cmluZyhjb25jdXJyZW5jeSkuY19zdHIoKSk7CisgICAgICAgICAgICBpdGVtLT5zZXRJbnQzMihrQXVkaW9Qb2xpY3lTdGF0dXMsIHN0YXR1cyk7CisKKyAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5UnFzdFNyYywgYXVkaW9Tb3VyY2VTdHJpbmcoY2xpZW50LT5hdHRyaWJ1dGVzLnNvdXJjZSkuY19zdHIoKSk7CisgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeVJxc3RQa2csIHN0ZDo6c3RyaW5nKFN0cmluZzgoY2xpZW50LT5vcFBhY2thZ2VOYW1lKS5zdHJpbmcoKSkuY19zdHIoKSk7CisgICAgICAgICAgICBpdGVtLT5zZXRJbnQzMihrQXVkaW9Qb2xpY3lScXN0U2Vzc2lvbiwgY2xpZW50LT5zZXNzaW9uKTsKKworICAgICAgICAgICAgLy8gZmlndXJlIG91dCB3aG8gaXMgYWN0aXZlCisgICAgICAgICAgICAvLyBOQjogbWlnaHQgdGhlIG90aGVyIHBhcnR5IGhhdmUgZ2l2ZW4gdXAgdGhlIG1pY3JvcGhvbmUgc2luY2UgdGhlbj8gaG93IHN1cmUuCisgICAgICAgICAgICAvLyBwZXJoYXBzIGNvdWxkIGhhdmUgZ2l2ZW4gdXAgb24gaXQuCisgICAgICAgICAgICAvLyB3ZSBob2xkIG1Mb2NrLCBzbyBwZXJoYXBzIHdlJ3JlIHNhZmUgZm9yIHRoaXMgbG9vcGluZworICAgICAgICAgICAgaWYgKGNvbmN1cnJlbmN5ICE9IEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfTk9ORSkgeworICAgICAgICAgICAgICAgIGludCBjb3VudCA9IG1BdWRpb1JlY29yZENsaWVudHMuc2l6ZSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpPGNvdW50IDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3J0SWQgPT0gbUF1ZGlvUmVjb3JkQ2xpZW50cy5rZXlBdChpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IG90aGVyID0gbUF1ZGlvUmVjb3JkQ2xpZW50cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgICAgICBpZiAob3RoZXItPmFjdGl2ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcHMgdGhlIGxhc3Qgb2YgdGhlIGNsaWVudHMgbWFya2VkIGFjdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lBY3RpdmVTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvU291cmNlU3RyaW5nKG90aGVyLT5hdHRyaWJ1dGVzLnNvdXJjZSkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeUFjdGl2ZVBrZywgc3RkOjpzdHJpbmcoU3RyaW5nOChvdGhlci0+b3BQYWNrYWdlTmFtZSkuc3RyaW5nKCkpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+c2V0SW50MzIoa0F1ZGlvUG9saWN5QWN0aXZlU2Vzc2lvbiwgb3RoZXItPnNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaXRlbS0+c2VsZnJlY29yZCgpOworICAgICAgICAgICAgZGVsZXRlIGl0ZW07CisgICAgICAgICAgICBpdGVtID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihjb25jdXJyZW5jeSAmIH5BdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX0FMTCwKQEAgLTM4OCw0MyArNTQ5LDY3IEBACiAgICAgICAgIGlmIChjb25jdXJyZW5jeSAmIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FQVFVSRSkgewogICAgICAgICAgICAgLy9UT0RPOiBjaGVjayBjb25jdXJyZW50IGNhcHR1cmUgcGVybWlzc2lvbgogICAgICAgICB9CisKKyAgICAgICAgY2xpZW50LT5hY3RpdmUgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIGZpbmlzaFJlY29yZGluZyhjbGllbnQtPm9wUGFja2FnZU5hbWUsIGNsaWVudC0+dWlkKTsKICAgICB9CiAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdG9wSW5wdXQoaW5wdXQsIHNlc3Npb24pOworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9SZWNvcmRDbGllbnRzLmluZGV4T2ZLZXkocG9ydElkKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGNsaWVudCA9IG1BdWRpb1JlY29yZENsaWVudHMudmFsdWVBdChpbmRleCk7CisKKyAgICBjbGllbnQtPmFjdGl2ZSA9IGZhbHNlOworCisgICAgLy8gZmluaXNoIHRoZSByZWNvcmRpbmcgYXBwIG9wCisgICAgZmluaXNoUmVjb3JkaW5nKGNsaWVudC0+b3BQYWNrYWdlTmFtZSwgY2xpZW50LT51aWQpOworICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BJbnB1dChjbGllbnQtPmlucHV0LCBjbGllbnQtPnNlc3Npb24pOwogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGNsaWVudDsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cyA9IG1BdWRpb1BvbGljeUVmZmVjdHM7CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9SZWNvcmRDbGllbnRzLmluZGV4T2ZLZXkocG9ydElkKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IG1BdWRpb1JlY29yZENsaWVudHMudmFsdWVBdChpbmRleCk7CisgICAgICAgIG1BdWRpb1JlY29yZENsaWVudHMucmVtb3ZlSXRlbShwb3J0SWQpOworICAgIH0KKyAgICBpZiAoY2xpZW50ID09IDApIHsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzICE9IDApIHsKICAgICAgICAgLy8gcmVsZWFzZSBhdWRpbyBwcm9jZXNzb3JzIGZyb20gdGhlIGlucHV0Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVsZWFzZUlucHV0RWZmZWN0cyhpbnB1dCwgc2Vzc2lvbik7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVsZWFzZUlucHV0RWZmZWN0cyhjbGllbnQtPmlucHV0LCBjbGllbnQtPnNlc3Npb24pOwogICAgICAgICBpZihzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gcmVsZWFzZSBlZmZlY3RzIG9uIGlucHV0ICVkIiwgaW5wdXQpOworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byByZWxlYXNlIGVmZmVjdHMgb24gaW5wdXQgJWQiLCBjbGllbnQtPmlucHV0KTsKICAgICAgICAgfQogICAgIH0KICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VJbnB1dChpbnB1dCwgc2Vzc2lvbik7CisgICAgICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VJbnB1dChjbGllbnQtPmlucHV0LCBjbGllbnQtPnNlc3Npb24pOwogICAgIH0KIH0KIApAQCAtNDQyLDYgKzYyNyw3IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pbml0U3RyZWFtVm9sdW1lKHN0cmVhbSwgaW5kZXhNaW4sIGluZGV4TWF4KTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC00NjAsNiArNjQ2LDcgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRTdHJlYW1Wb2x1bWVJbmRleChzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKQEAgLTQ3Niw2ICs2NjMsNyBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldFN0cmVhbVZvbHVtZUluZGV4KHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOwpAQCAtNDg5LDYgKzY3Nyw3IEBACiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtKTsKIH0KIApAQCAtNTAzLDYgKzY5Miw3IEBACiAgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXREZXZpY2VzRm9yU3RyZWFtKHN0cmVhbSk7CiB9CiAKQEAgLTUxMyw2ICs3MDMsNyBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRPdXRwdXRGb3JFZmZlY3QoZGVzYyk7CiB9CiAKQEAgLTUyNiw2ICs3MTcsNyBAQAogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1FZmZlY3RzTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVnaXN0ZXJFZmZlY3QoZGVzYywgaW8sIHN0cmF0ZWd5LCBzZXNzaW9uLCBpZCk7CiB9CiAKQEAgLTUzNSw2ICs3MjcsNyBAQAogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1FZmZlY3RzTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+dW5yZWdpc3RlckVmZmVjdChpZCk7CiB9CiAKQEAgLTU0NCw2ICs3MzcsNyBAQAogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1FZmZlY3RzTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0RWZmZWN0RW5hYmxlZChpZCwgZW5hYmxlZCk7CiB9CiAKQEAgLTU1Niw2ICs3NTAsNyBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNTdHJlYW1BY3RpdmUoc3RyZWFtLCBpblBhc3RNcyk7CiB9CiAKQEAgLTU2OCw2ICs3NjMsNyBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNTdHJlYW1BY3RpdmVSZW1vdGVseShzdHJlYW0sIGluUGFzdE1zKTsKIH0KIApAQCAtNTc3LDYgKzc3Myw3IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc1NvdXJjZUFjdGl2ZShzb3VyY2UpOwogfQogCkBAIC02MTAsNiArODA3LDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBfbGUobUVmZmVjdHNMb2NrKTsgLy8gaXNPZmZsb2FkU3VwcG9ydGVkIHF1ZXJpZXMgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1vZmZsb2FkYWJsZSBlZmZlY3RzCisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNPZmZsb2FkU3VwcG9ydGVkKGluZm8pOwogfQogCkBAIC02MjMsNyArODIxLDcgQEAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLQorICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmxpc3RBdWRpb1BvcnRzKHJvbGUsIHR5cGUsIG51bV9wb3J0cywgcG9ydHMsIGdlbmVyYXRpb24pOwogfQogCkBAIC02MzMsNyArODMxLDcgQEAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLQorICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldEF1ZGlvUG9ydChwb3J0KTsKIH0KIApAQCAtNjQ3LDYgKzg0NSw3IEBACiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaCwgaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOwogfQpAQCAtNjYwLDcgKzg1OSw3IEBACiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0KKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlQXVkaW9QYXRjaChoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CiB9CkBAIC02NzMsNyArODcyLDcgQEAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLQorICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmxpc3RBdWRpb1BhdGNoZXMobnVtX3BhdGNoZXMsIHBhdGNoZXMsIGdlbmVyYXRpb24pOwogfQogCkBAIC02ODYsNyArODg1LDcgQEAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLQorICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldEF1ZGlvUG9ydENvbmZpZyhjb25maWcpOwogfQogCkBAIC02OTgsNyArODk3LDcgQEAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLQorICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKHNlc3Npb24sIGlvSGFuZGxlLCBkZXZpY2UpOwogfQogCkBAIC03MDgsNyArOTA3LDcgQEAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLQorICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKHNlc3Npb24pOwogfQogCkBAIC03MjEsNiArOTIwLDcgQEAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIGlmIChyZWdpc3RyYXRpb24pIHsKICAgICAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlZ2lzdGVyUG9saWN5TWl4ZXMobWl4ZXMpOwogICAgIH0gZWxzZSB7CkBAIC03MzYsNyArOTM2LDcgQEAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLQorICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0YXJ0QXVkaW9Tb3VyY2Uoc291cmNlLCBhdHRyaWJ1dGVzLCBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKIH0KQEAgLTc0Nyw3ICs5NDcsNyBAQAogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotCisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcEF1ZGlvU291cmNlKGhhbmRsZSk7CiB9CiAKQEAgLTc2MCw2ICs5NjAsNyBAQAogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0TWFzdGVyTW9ubyhtb25vKTsKIH0KIApAQCAtNzY5LDYgKzk3MCw3IEBACiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE1hc3Rlck1vbm8obW9ubyk7CiB9CiAKQEAgLTc4MCw4ICs5ODIsOSBAQAogICAgICAgICByZXR1cm4gTkFOOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldFN0cmVhbVZvbHVtZURCKHN0cmVhbSwgaW5kZXgsIGRldmljZSk7CiB9CiAKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAppbmRleCBiNDE3NjMxLi5mM2NkZGMzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCkBAIC0yNiw4ICsyNiwxMiBAQAogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGN1dGlscy9tdWx0aXVzZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9BY3Rpdml0eU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNvbnRyb2xsZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVJlc3VsdFJlY2VpdmVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lTZXJ2aWNlLmgiCkBAIC0zOSw2ICs0Myw4IEBACiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgogCisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdGljIGNvbnN0IGNoYXIga0RlYWRsb2NrZWRTdHJpbmdbXSA9ICJBdWRpb1BvbGljeVNlcnZpY2UgbWF5IGJlIGRlYWRsb2NrZWRcbiI7CkBAIC00OSw2ICs1NSw3IEBACiAKIHN0YXRpYyBjb25zdCBuc2Vjc190IGtBdWRpb0NvbW1hbmRUaW1lb3V0TnMgPSBzZWNvbmRzKDMpOyAvLyAzIHNlY29uZHMKIAorc3RhdGljIGNvbnN0IFN0cmluZzE2IHNNYW5hZ2VBdWRpb1BvbGljeVBlcm1pc3Npb24oImFuZHJvaWQucGVybWlzc2lvbi5NQU5BR0VfQVVESU9fUE9MSUNZIik7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtNzksNiArODYsOSBAQAogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICAgICBtQXVkaW9Qb2xpY3lFZmZlY3RzID0gYXVkaW9Qb2xpY3lFZmZlY3RzOwogICAgIH0KKworICAgIG1VaWRQb2xpY3kgPSBuZXcgVWlkUG9saWN5KHRoaXMpOworICAgIG1VaWRQb2xpY3ktPnJlZ2lzdGVyU2VsZigpOwogfQogCiBBdWRpb1BvbGljeVNlcnZpY2U6On5BdWRpb1BvbGljeVNlcnZpY2UoKQpAQCAtOTIsNiArMTAyLDkgQEAKIAogICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLmNsZWFyKCk7CiAgICAgbUF1ZGlvUG9saWN5RWZmZWN0cy5jbGVhcigpOworCisgICAgbVVpZFBvbGljeS0+dW5yZWdpc3RlclNlbGYoKTsKKyAgICBtVWlkUG9saWN5LmNsZWFyKCk7CiB9CiAKIC8vIEEgbm90aWZpY2F0aW9uIGNsaWVudCBpcyBhbHdheXMgcmVnaXN0ZXJlZCBieSBBdWRpb1N5c3RlbSB3aGVuIHRoZSBjbGllbnQgcHJvY2VzcwpAQCAtMTM5LDYgKzE1Miw3IEBACiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlcikgeworICAgICAgICAgICAgLy8gY2FsbGVkIGZyb20gYmluZGVyIGRlYXRoIG5vdGlmaWNhdGlvbjogbm8gbmVlZCB0byBjbGVhciBjYWxsZXIgaWRlbnRpdHkKICAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VSZXNvdXJjZXNGb3JVaWQodWlkKTsKICAgICAgICAgfQogICAgIH0KQEAgLTI2MSw3ICsyNzUsNyBAQAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKQogewotICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDApIHsKKyAgICBpZiAobUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCAhPSAwICYmIG11bHRpdXNlcl9nZXRfYXBwX2lkKG1VaWQpIDwgQUlEX0FQUF9TVEFSVCkgewogICAgICAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShyZWdJZCwgc3RhdGUpOwogICAgIH0KIH0KQEAgLTI3MSw3ICsyODUsNyBAQAogICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpCiB7Ci0gICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCkgeworICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDAgJiYgbXVsdGl1c2VyX2dldF9hcHBfaWQobVVpZCkgPCBBSURfQVBQX1NUQVJUKSB7CiAgICAgICAgIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQtPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgY2xpZW50SW5mbywKICAgICAgICAgICAgICAgICBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwogICAgIH0KQEAgLTMxOCw2ICszMzIsMjEgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpCit7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlcikgeworICAgICAgICAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKyAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFJlY29yZFNpbGVuY2VkKHVpZCwgc2lsZW5jZWQpOworICAgICAgICB9CisgICAgfQorICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmKSB7CisgICAgICAgIGFmLT5zZXRSZWNvcmRTaWxlbmNlZCh1aWQsIHNpbGVuY2VkKTsKKyAgICB9Cit9CisKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7CiAgICAgaWYgKCFkdW1wQWxsb3dlZCgpKSB7CkBAIC0zNjEsMTEgKzM5MCwyNDggQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvblRyYW5zYWN0KAotICAgICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQoteworICAgICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKSB7CisgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICAgIGNhc2UgU0hFTExfQ09NTUFORF9UUkFOU0FDVElPTjogeworICAgICAgICAgICAgaW50IGluID0gZGF0YS5yZWFkRmlsZURlc2NyaXB0b3IoKTsKKyAgICAgICAgICAgIGludCBvdXQgPSBkYXRhLnJlYWRGaWxlRGVzY3JpcHRvcigpOworICAgICAgICAgICAgaW50IGVyciA9IGRhdGEucmVhZEZpbGVEZXNjcmlwdG9yKCk7CisgICAgICAgICAgICBpbnQgYXJnYyA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBWZWN0b3I8U3RyaW5nMTY+IGFyZ3M7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ2MgJiYgZGF0YS5kYXRhQXZhaWwoKSA+IDA7IGkrKykgeworICAgICAgICAgICAgICAgYXJncy5hZGQoZGF0YS5yZWFkU3RyaW5nMTYoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxJQmluZGVyPiB1bnVzZWRDYWxsYmFjazsKKyAgICAgICAgICAgIHNwPElSZXN1bHRSZWNlaXZlcj4gcmVzdWx0UmVjZWl2ZXI7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgICAgICAgICBpZiAoKHN0YXR1cyA9IGRhdGEucmVhZE51bGxhYmxlU3Ryb25nQmluZGVyKCZ1bnVzZWRDYWxsYmFjaykpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoc3RhdHVzID0gZGF0YS5yZWFkTnVsbGFibGVTdHJvbmdCaW5kZXIoJnJlc3VsdFJlY2VpdmVyKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gc2hlbGxDb21tYW5kKGluLCBvdXQsIGVyciwgYXJncyk7CisgICAgICAgICAgICBpZiAocmVzdWx0UmVjZWl2ZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJlc3VsdFJlY2VpdmVyLT5zZW5kKHN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKICAgICByZXR1cm4gQm5BdWRpb1BvbGljeVNlcnZpY2U6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKIH0KIAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLSBTaGVsbCBjb21tYW5kIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gTk9URTogVGhpcyBpcyBhIHJlbW90ZSBBUEkgLSBtYWtlIHN1cmUgYWxsIGFyZ3MgYXJlIHZhbGlkYXRlZAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzaGVsbENvbW1hbmQoaW50IGluLCBpbnQgb3V0LCBpbnQgZXJyLCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CisgICAgaWYgKCFjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNNYW5hZ2VBdWRpb1BvbGljeVBlcm1pc3Npb24sIG51bGxwdHIsIG51bGxwdHIpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKGluID09IEJBRF9UWVBFIHx8IG91dCA9PSBCQURfVFlQRSB8fCBlcnIgPT0gQkFEX1RZUEUpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKGFyZ3Muc2l6ZSgpID09IDMgJiYgYXJnc1swXSA9PSBTdHJpbmcxNigic2V0LXVpZC1zdGF0ZSIpKSB7CisgICAgICAgIHJldHVybiBoYW5kbGVTZXRVaWRTdGF0ZShhcmdzLCBlcnIpOworICAgIH0gZWxzZSBpZiAoYXJncy5zaXplKCkgPT0gMiAmJiBhcmdzWzBdID09IFN0cmluZzE2KCJyZXNldC11aWQtc3RhdGUiKSkgeworICAgICAgICByZXR1cm4gaGFuZGxlUmVzZXRVaWRTdGF0ZShhcmdzLCBlcnIpOworICAgIH0gZWxzZSBpZiAoYXJncy5zaXplKCkgPT0gMiAmJiBhcmdzWzBdID09IFN0cmluZzE2KCJnZXQtdWlkLXN0YXRlIikpIHsKKyAgICAgICAgcmV0dXJuIGhhbmRsZUdldFVpZFN0YXRlKGFyZ3MsIG91dCwgZXJyKTsKKyAgICB9IGVsc2UgaWYgKGFyZ3Muc2l6ZSgpID09IDEgJiYgYXJnc1swXSA9PSBTdHJpbmcxNigiaGVscCIpKSB7CisgICAgICAgIHByaW50SGVscChvdXQpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIHByaW50SGVscChlcnIpOworICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6aGFuZGxlU2V0VWlkU3RhdGUoVmVjdG9yPFN0cmluZzE2PiYgYXJncywgaW50IGVycikgeworICAgIFBlcm1pc3Npb25Db250cm9sbGVyIHBjOworICAgIGludCB1aWQgPSBwYy5nZXRQYWNrYWdlVWlkKGFyZ3NbMV0sIDApOworICAgIGlmICh1aWQgPD0gMCkgeworICAgICAgICBBTE9HRSgiVW5rbm93biBwYWNrYWdlOiAnJXMnIiwgU3RyaW5nOChhcmdzWzFdKS5zdHJpbmcoKSk7CisgICAgICAgIGRwcmludGYoZXJyLCAiVW5rbm93biBwYWNrYWdlOiAnJXMnXG4iLCBTdHJpbmc4KGFyZ3NbMV0pLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgYm9vbCBhY3RpdmUgPSBmYWxzZTsKKyAgICBpZiAoYXJnc1syXSA9PSBTdHJpbmcxNigiYWN0aXZlIikpIHsKKyAgICAgICAgYWN0aXZlID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKChhcmdzWzJdICE9IFN0cmluZzE2KCJpZGxlIikpKSB7CisgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBhY3RpdmUgb3IgaWRsZSBidXQgZ290OiAnJXMnIiwgU3RyaW5nOChhcmdzWzJdKS5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1VaWRQb2xpY3ktPmFkZE92ZXJyaWRlVWlkKHVpZCwgYWN0aXZlKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6aGFuZGxlUmVzZXRVaWRTdGF0ZShWZWN0b3I8U3RyaW5nMTY+JiBhcmdzLCBpbnQgZXJyKSB7CisgICAgUGVybWlzc2lvbkNvbnRyb2xsZXIgcGM7CisgICAgaW50IHVpZCA9IHBjLmdldFBhY2thZ2VVaWQoYXJnc1sxXSwgMCk7CisgICAgaWYgKHVpZCA8IDApIHsKKyAgICAgICAgQUxPR0UoIlVua25vd24gcGFja2FnZTogJyVzJyIsIFN0cmluZzgoYXJnc1sxXSkuc3RyaW5nKCkpOworICAgICAgICBkcHJpbnRmKGVyciwgIlVua25vd24gcGFja2FnZTogJyVzJ1xuIiwgU3RyaW5nOChhcmdzWzFdKS5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1VaWRQb2xpY3ktPnJlbW92ZU92ZXJyaWRlVWlkKHVpZCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmhhbmRsZUdldFVpZFN0YXRlKFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MsIGludCBvdXQsIGludCBlcnIpIHsKKyAgICBQZXJtaXNzaW9uQ29udHJvbGxlciBwYzsKKyAgICBpbnQgdWlkID0gcGMuZ2V0UGFja2FnZVVpZChhcmdzWzFdLCAwKTsKKyAgICBpZiAodWlkIDwgMCkgeworICAgICAgICBBTE9HRSgiVW5rbm93biBwYWNrYWdlOiAnJXMnIiwgU3RyaW5nOChhcmdzWzFdKS5zdHJpbmcoKSk7CisgICAgICAgIGRwcmludGYoZXJyLCAiVW5rbm93biBwYWNrYWdlOiAnJXMnXG4iLCBTdHJpbmc4KGFyZ3NbMV0pLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKG1VaWRQb2xpY3ktPmlzVWlkQWN0aXZlKHVpZCkpIHsKKyAgICAgICAgcmV0dXJuIGRwcmludGYob3V0LCAiYWN0aXZlXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZHByaW50ZihvdXQsICJpZGxlXG4iKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cHJpbnRIZWxwKGludCBvdXQpIHsKKyAgICByZXR1cm4gZHByaW50ZihvdXQsICJBdWRpbyBwb2xpY3kgc2VydmljZSBjb21tYW5kczpcbiIKKyAgICAgICAgIiAgZ2V0LXVpZC1zdGF0ZSA8UEFDS0FHRT4gZ2V0cyB0aGUgdWlkIHN0YXRlXG4iCisgICAgICAgICIgIHNldC11aWQtc3RhdGUgPFBBQ0tBR0U+IDxhY3RpdmV8aWRsZT4gb3ZlcnJpZGVzIHRoZSB1aWQgc3RhdGVcbiIKKyAgICAgICAgIiAgcmVzZXQtdWlkLXN0YXRlIDxQQUNLQUdFPiBjbGVhcnMgdGhlIHVpZCBzdGF0ZSBvdmVycmlkZVxuIgorICAgICAgICAiICBoZWxwIHByaW50IHRoaXMgbWVzc2FnZVxuIik7Cit9CisKKy8vIC0tLS0tLS0tLS0tICBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeSBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tCisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OnJlZ2lzdGVyU2VsZigpIHsKKyAgICBBY3Rpdml0eU1hbmFnZXIgYW07CisgICAgYW0ucmVnaXN0ZXJVaWRPYnNlcnZlcih0aGlzLCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9HT05FCisgICAgICAgICAgICB8IEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX0lETEUKKyAgICAgICAgICAgIHwgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfQUNUSVZFLAorICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04sCisgICAgICAgICAgICBTdHJpbmcxNigiYXVkaW9zZXJ2ZXIiKSk7CisgICAgc3RhdHVzX3QgcmVzID0gYW0ubGlua1RvRGVhdGgodGhpcyk7CisgICAgaWYgKCFyZXMpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgbU9ic2VydmVyUmVnaXN0ZXJlZCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIlVpZFBvbGljeTo6cmVnaXN0ZXJTZWxmIGxpbmtUb0RlYXRoIGZhaWxlZDogJWQiLCByZXMpOworICAgICAgICBhbS51bnJlZ2lzdGVyVWlkT2JzZXJ2ZXIodGhpcyk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojp1bnJlZ2lzdGVyU2VsZigpIHsKKyAgICBBY3Rpdml0eU1hbmFnZXIgYW07CisgICAgYW0udW5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICBhbS51bnJlZ2lzdGVyVWlkT2JzZXJ2ZXIodGhpcyk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtT2JzZXJ2ZXJSZWdpc3RlcmVkID0gZmFsc2U7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OmJpbmRlckRpZWQoX191bnVzZWQgY29uc3Qgd3A8SUJpbmRlcj4gJndobykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUNhY2hlZFVpZHMuY2xlYXIoKTsKKyAgICBtT2JzZXJ2ZXJSZWdpc3RlcmVkID0gZmFsc2U7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OmlzVWlkQWN0aXZlKHVpZF90IHVpZCkgeworICAgIGlmIChpc1NlcnZpY2VVaWQodWlkKSkgcmV0dXJuIHRydWU7CisgICAgYm9vbCBuZWVkVG9SZXJlZ2lzdGVyID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBuZWVkVG9SZXJlZ2lzdGVyID0gIW1PYnNlcnZlclJlZ2lzdGVyZWQ7CisgICAgfQorICAgIGlmIChuZWVkVG9SZXJlZ2lzdGVyKSB7CisgICAgICAgIC8vIExvb2tzIGxpa2UgQWN0aXZpdHlNYW5hZ2VyIGhhcyBkaWVkIHByZXZpb3VzbHksIGF0dGVtcHQgdG8gcmUtcmVnaXN0ZXIuCisgICAgICAgIHJlZ2lzdGVyU2VsZigpOworICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGF1dG8gb3ZlcnJpZGVJdGVyID0gbU92ZXJyaWRlVWlkcy5maW5kKHVpZCk7CisgICAgICAgIGlmIChvdmVycmlkZUl0ZXIgIT0gbU92ZXJyaWRlVWlkcy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRlSXRlci0+c2Vjb25kOworICAgICAgICB9CisgICAgICAgIC8vIEluIGFuIGFic2Vuc2Ugb2YgdGhlIEFjdGl2aXR5TWFuYWdlciwgYXNzdW1lIGV2ZXJ5dGhpbmcgdG8gYmUgYWN0aXZlLgorICAgICAgICBpZiAoIW1PYnNlcnZlclJlZ2lzdGVyZWQpIHJldHVybiB0cnVlOworICAgICAgICBhdXRvIGNhY2hlSXRlciA9IG1DYWNoZWRVaWRzLmZpbmQodWlkKTsKKyAgICAgICAgaWYgKGNhY2hlSXRlciAhPSBtQ2FjaGVkVWlkcy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGNhY2hlSXRlci0+c2Vjb25kOworICAgICAgICB9CisgICAgfQorICAgIEFjdGl2aXR5TWFuYWdlciBhbTsKKyAgICBib29sIGFjdGl2ZSA9IGFtLmlzVWlkQWN0aXZlKHVpZCwgU3RyaW5nMTYoImF1ZGlvc2VydmVyIikpOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgbUNhY2hlZFVpZHMuaW5zZXJ0KHN0ZDo6cGFpcjx1aWRfdCwgYm9vbD4odWlkLCBhY3RpdmUpKTsKKyAgICB9CisgICAgcmV0dXJuIGFjdGl2ZTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6b25VaWRBY3RpdmUodWlkX3QgdWlkKSB7CisgICAgdXBkYXRlVWlkQ2FjaGUodWlkLCB0cnVlLCB0cnVlKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6b25VaWRHb25lKHVpZF90IHVpZCwgX191bnVzZWQgYm9vbCBkaXNhYmxlZCkgeworICAgIHVwZGF0ZVVpZENhY2hlKHVpZCwgZmFsc2UsIGZhbHNlKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6b25VaWRJZGxlKHVpZF90IHVpZCwgX191bnVzZWQgYm9vbCBkaXNhYmxlZCkgeworICAgIHVwZGF0ZVVpZENhY2hlKHVpZCwgZmFsc2UsIHRydWUpOworfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojppc1NlcnZpY2VVaWQodWlkX3QgdWlkKSBjb25zdCB7CisgICAgcmV0dXJuIG11bHRpdXNlcl9nZXRfYXBwX2lkKHVpZCkgPCBBSURfQVBQX1NUQVJUOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojpub3RpZnlTZXJ2aWNlKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUpIHsKKyAgICBzcDxBdWRpb1BvbGljeVNlcnZpY2U+IHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgaWYgKHNlcnZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICBzZXJ2aWNlLT5zZXRSZWNvcmRTaWxlbmNlZCh1aWQsICFhY3RpdmUpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6dXBkYXRlT3ZlcnJpZGVVaWQodWlkX3QgdWlkLCBib29sIGFjdGl2ZSwgYm9vbCBpbnNlcnQpIHsKKyAgICBpZiAoaXNTZXJ2aWNlVWlkKHVpZCkpIHJldHVybjsKKyAgICBib29sIHdhc092ZXJyaWRkZW4gPSBmYWxzZSwgd2FzQWN0aXZlID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICB1cGRhdGVVaWRMb2NrZWQoJm1PdmVycmlkZVVpZHMsIHVpZCwgYWN0aXZlLCBpbnNlcnQsICZ3YXNPdmVycmlkZGVuLCAmd2FzQWN0aXZlKTsKKyAgICB9CisgICAgaWYgKCF3YXNPdmVycmlkZGVuICYmIGluc2VydCkgeworICAgICAgICBub3RpZnlTZXJ2aWNlKHVpZCwgYWN0aXZlKTsgIC8vIFN0YXJ0ZWQgdG8gb3ZlcnJpZGUuCisgICAgfSBlbHNlIGlmICh3YXNPdmVycmlkZGVuICYmICFpbnNlcnQpIHsKKyAgICAgICAgbm90aWZ5U2VydmljZSh1aWQsIGlzVWlkQWN0aXZlKHVpZCkpOyAgLy8gT3ZlcnJpZGUgY2Vhc2VkLCBub3RpZnkgd2l0aCBncm91bmQgdHJ1dGguCisgICAgfSBlbHNlIGlmICh3YXNBY3RpdmUgIT0gYWN0aXZlKSB7CisgICAgICAgIG5vdGlmeVNlcnZpY2UodWlkLCBhY3RpdmUpOyAgLy8gT3ZlcnJpZGUgdXBkYXRlZC4KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OnVwZGF0ZVVpZENhY2hlKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGJvb2wgaW5zZXJ0KSB7CisgICAgaWYgKGlzU2VydmljZVVpZCh1aWQpKSByZXR1cm47CisgICAgYm9vbCB3YXNBY3RpdmUgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIHVwZGF0ZVVpZExvY2tlZCgmbUNhY2hlZFVpZHMsIHVpZCwgYWN0aXZlLCBpbnNlcnQsIG51bGxwdHIsICZ3YXNBY3RpdmUpOworICAgICAgICAvLyBEbyBub3Qgbm90aWZ5IHNlcnZpY2UgaWYgY3VycmVudGx5IG92ZXJyaWRkZW4uCisgICAgICAgIGlmIChtT3ZlcnJpZGVVaWRzLmZpbmQodWlkKSAhPSBtT3ZlcnJpZGVVaWRzLmVuZCgpKSByZXR1cm47CisgICAgfQorICAgIGJvb2wgbm93QWN0aXZlID0gYWN0aXZlICYmIGluc2VydDsKKyAgICBpZiAod2FzQWN0aXZlICE9IG5vd0FjdGl2ZSkgbm90aWZ5U2VydmljZSh1aWQsIG5vd0FjdGl2ZSk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OnVwZGF0ZVVpZExvY2tlZChzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIGJvb2w+ICp1aWRzLAorICAgICAgICB1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCwgYm9vbCAqd2FzVGhlcmUsIGJvb2wgKndhc0FjdGl2ZSkgeworICAgIGF1dG8gaXQgPSB1aWRzLT5maW5kKHVpZCk7CisgICAgaWYgKGl0ICE9IHVpZHMtPmVuZCgpKSB7CisgICAgICAgIGlmICh3YXNUaGVyZSAhPSBudWxscHRyKSAqd2FzVGhlcmUgPSB0cnVlOworICAgICAgICBpZiAod2FzQWN0aXZlICE9IG51bGxwdHIpICp3YXNBY3RpdmUgPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAoaW5zZXJ0KSB7CisgICAgICAgICAgICBpdC0+c2Vjb25kID0gYWN0aXZlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdWlkcy0+ZXJhc2UoaXQpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChpbnNlcnQpIHsKKyAgICAgICAgdWlkcy0+aW5zZXJ0KHN0ZDo6cGFpcjx1aWRfdCwgYm9vbD4odWlkLCBhY3RpdmUpKTsKKyAgICB9Cit9CiAKIC8vIC0tLS0tLS0tLS0tICBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZCBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tCiAKQEAgLTg1OSw3ICsxMTI1LDcgQEAKICAgICB9CiAKICAgICAvLyBjaGVjayBzYW1lIHBlbmRpbmcgY29tbWFuZHMgd2l0aCBsYXRlciB0aW1lIHN0YW1wcyBhbmQgZWxpbWluYXRlIHRoZW0KLSAgICBmb3IgKGkgPSBtQXVkaW9Db21tYW5kcy5zaXplKCktMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBmb3IgKGkgPSAoc3NpemVfdCltQXVkaW9Db21tYW5kcy5zaXplKCktMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kMiA9IG1BdWRpb0NvbW1hbmRzW2ldOwogICAgICAgICAvLyBjb21tYW5kcyBhcmUgc29ydGVkIGJ5IGluY3JlYXNpbmcgdGltZSBzdGFtcDogbm8gbmVlZCB0byBzY2FuIHRoZSByZXN0IG9mIG1BdWRpb0NvbW1hbmRzCiAgICAgICAgIGlmIChjb21tYW5kMi0+bVRpbWUgPD0gY29tbWFuZC0+bVRpbWUpIGJyZWFrOwpAQCAtMTE0Niw0ICsxNDEyLDQgQEAKIGludCBhcHNfc2V0X3ZvaWNlX3ZvbHVtZSh2b2lkICpzZXJ2aWNlLCBmbG9hdCB2b2x1bWUsIGludCBkZWxheV9tcyk7CiB9OwogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKaW5kZXggMzhkNGIxNy4uZDhkZDc5NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8YmluZGVyL0JpbmRlclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVVpZE9ic2VydmVyLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaD4KQEAgLTMzLDkgKzM0LDEyIEBACiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lFZmZlY3RzLmgiCiAjaW5jbHVkZSAibWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmgiCiAKKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogY2xhc3MgQXVkaW9Qb2xpY3lTZXJ2aWNlIDoKQEAgLTY4LDE3ICs3MiwxMiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZyk7CiAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSk7Ci0gICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMKTsKKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLApAQCAtOTgsMTYgKzk3LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnNpbGVuY2VkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCk7CkBAIC0yNDEsNiArMjM5LDY2IEBACiAKICAgICAgICAgICAgIHN0YXR1c190IGR1bXBJbnRlcm5hbHMoaW50IGZkKTsKIAorICAgIC8vIEhhbmRsZXMgYmluZGVyIHNoZWxsIGNvbW1hbmRzCisgICAgdmlydHVhbCBzdGF0dXNfdCBzaGVsbENvbW1hbmQoaW50IGluLCBpbnQgb3V0LCBpbnQgZXJyLCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKworICAgIC8vIFNldHMgd2hldGhlciB0aGUgZ2l2ZW4gVUlEIHJlY29yZHMgb25seSBzaWxlbmNlCisgICAgdmlydHVhbCB2b2lkIHNldFJlY29yZFNpbGVuY2VkKHVpZF90IHVpZCwgYm9vbCBzaWxlbmNlZCk7CisKKyAgICAvLyBPdmVycmlkZXMgdGhlIFVJRCBzdGF0ZSBhcyBpZiBpdCBpcyBpZGxlCisgICAgc3RhdHVzX3QgaGFuZGxlU2V0VWlkU3RhdGUoVmVjdG9yPFN0cmluZzE2PiYgYXJncywgaW50IGVycik7CisKKyAgICAvLyBDbGVhcnMgdGhlIG92ZXJyaWRlIGZvciB0aGUgVUlEIHN0YXRlCisgICAgc3RhdHVzX3QgaGFuZGxlUmVzZXRVaWRTdGF0ZShWZWN0b3I8U3RyaW5nMTY+JiBhcmdzLCBpbnQgZXJyKTsKKworICAgIC8vIEdldHMgdGhlIFVJRCBzdGF0ZQorICAgIHN0YXR1c190IGhhbmRsZUdldFVpZFN0YXRlKFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MsIGludCBvdXQsIGludCBlcnIpOworCisgICAgLy8gUHJpbnRzIHRoZSBzaGVsbCBjb21tYW5kIGhlbHAKKyAgICBzdGF0dXNfdCBwcmludEhlbHAoaW50IG91dCk7CisKKyAgICAvLyBJZiByZWNvcmRpbmcgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIFVJRCBpcyBhbGxvd2VkIHRvIGRvIHRoYXQuIElmIHRoZSBVSUQgaXMgaWRsZQorICAgIC8vIHRoZW4gaXQgY2Fubm90IHJlY29yZCBhbmQgZ2V0cyBidWZmZXJzIHdpdGggemVyb3MgLSBzaWxlbmNlLiBBcyBzb29uIGFzIHRoZSBVSUQKKyAgICAvLyB0cmFuc2l0aW9ucyB0byBhbiBhY3RpdmUgc3RhdGUgd2Ugd2lsbCBzdGFydCByZXBvcnRpbmcgYnVmZmVycyB3aXRoIGRhdGEuIFRoaXMgYXBwcm9hY2gKKyAgICAvLyB0cmFuc3BhcmVudGx5IGhhbmRsZXMgcmVjb3JkaW5nIHdoaWxlIHRoZSBVSUQgdHJhbnNpdGlvbnMgYmV0d2VlbiBpZGxlL2FjdGl2ZSBzdGF0ZQorICAgIC8vIGF2b2lkaW5nIHRvIGdldCBzdHVjayBpbiBhIHN0YXRlIHJlY2VpdmluZyBub24tZW1wdHkgYnVmZmVycyB3aGlsZSBpZGxlIG9yIGluIGEgc3RhdGUKKyAgICAvLyByZWNlaXZpbmcgZW1wdHkgYnVmZmVycyB3aGlsZSBhY3RpdmUuCisgICAgY2xhc3MgVWlkUG9saWN5IDogcHVibGljIEJuVWlkT2JzZXJ2ZXIsIHB1YmxpYyB2aXJ0dWFsIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IFVpZFBvbGljeSh3cDxBdWRpb1BvbGljeVNlcnZpY2U+IHNlcnZpY2UpCisgICAgICAgICAgICAgICAgOiBtU2VydmljZShzZXJ2aWNlKSwgbU9ic2VydmVyUmVnaXN0ZXJlZChmYWxzZSkge30KKworICAgICAgICB2b2lkIHJlZ2lzdGVyU2VsZigpOworICAgICAgICB2b2lkIHVucmVnaXN0ZXJTZWxmKCk7CisKKyAgICAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgaW1wbGVtZW50YXRpb24KKyAgICAgICAgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pIG92ZXJyaWRlOworCisgICAgICAgIGJvb2wgaXNVaWRBY3RpdmUodWlkX3QgdWlkKTsKKworICAgICAgICAvLyBCblVpZE9ic2VydmVyIGltcGxlbWVudGF0aW9uCisgICAgICAgIHZvaWQgb25VaWRBY3RpdmUodWlkX3QgdWlkKSBvdmVycmlkZTsKKyAgICAgICAgdm9pZCBvblVpZEdvbmUodWlkX3QgdWlkLCBib29sIGRpc2FibGVkKSBvdmVycmlkZTsKKyAgICAgICAgdm9pZCBvblVpZElkbGUodWlkX3QgdWlkLCBib29sIGRpc2FibGVkKSBvdmVycmlkZTsKKworICAgICAgICB2b2lkIGFkZE92ZXJyaWRlVWlkKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUpIHsgdXBkYXRlT3ZlcnJpZGVVaWQodWlkLCBhY3RpdmUsIHRydWUpOyB9CisgICAgICAgIHZvaWQgcmVtb3ZlT3ZlcnJpZGVVaWQodWlkX3QgdWlkKSB7IHVwZGF0ZU92ZXJyaWRlVWlkKHVpZCwgZmFsc2UsIGZhbHNlKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgYm9vbCBpc1NlcnZpY2VVaWQodWlkX3QgdWlkKSBjb25zdDsKKyAgICAgICAgdm9pZCBub3RpZnlTZXJ2aWNlKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUpOworICAgICAgICB2b2lkIHVwZGF0ZU92ZXJyaWRlVWlkKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGJvb2wgaW5zZXJ0KTsKKyAgICAgICAgdm9pZCB1cGRhdGVVaWRDYWNoZSh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCk7CisgICAgICAgIHZvaWQgdXBkYXRlVWlkTG9ja2VkKHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgYm9vbD4gKnVpZHMsCisgICAgICAgICAgICAgICAgdWlkX3QgdWlkLCBib29sIGFjdGl2ZSwgYm9vbCBpbnNlcnQsIGJvb2wgKndhc1RoZXJlLCBib29sICp3YXNBY3RpdmUpOworCisgICAgICAgIHdwPEF1ZGlvUG9saWN5U2VydmljZT4gbVNlcnZpY2U7CisgICAgICAgIE11dGV4IG1Mb2NrOworICAgICAgICBib29sIG1PYnNlcnZlclJlZ2lzdGVyZWQ7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgYm9vbD4gbU92ZXJyaWRlVWlkczsKKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBib29sPiBtQ2FjaGVkVWlkczsKKyAgICB9OworCiAgICAgLy8gVGhyZWFkIHVzZWQgZm9yIHRvbmUgcGxheWJhY2sgYW5kIHRvIHNlbmQgYXVkaW8gY29uZmlnIGNvbW1hbmRzIHRvIGF1ZGlvIGZsaW5nZXIKICAgICAvLyBGb3IgdG9uZSBwbGF5YmFjaywgdXNpbmcgYSBzZXBhcmF0ZSB0aHJlYWQgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGRlYWRsb2NrIHdpdGggbUxvY2sgYmVjYXVzZQogICAgIC8vIHN0YXJ0VG9uZSgpIGFuZCBzdG9wVG9uZSgpIGFyZSBub3JtYWxseSBjYWxsZWQgd2l0aCBtTG9jayBsb2NrZWQgYW5kIHJlcXVlc3RpbmcgYSB0b25lIHN0YXJ0CkBAIC0zMTIsNyArMzcwLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGluc2VydENvbW1hbmRfbChBdWRpb0NvbW1hbmQgKmNvbW1hbmQsIGludCBkZWxheU1zID0gMCk7Ci0KICAgICBwcml2YXRlOgogICAgICAgICBjbGFzcyBBdWRpb0NvbW1hbmREYXRhOwogCkBAIC01NTgsNiArNjE1LDQ3IEBACiAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkOwogICAgIH07CiAKKyAgICAvLyAtLS0gQXVkaW9SZWNvcmRDbGllbnQgLS0tCisgICAgLy8gSW5mb3JtYXRpb24gYWJvdXQgZWFjaCByZWdpc3RlcmVkIEF1ZGlvUmVjb3JkIGNsaWVudAorICAgIC8vIChiZXR3ZWVuIGNhbGxzIHRvIGdldElucHV0Rm9yQXR0cigpIGFuZCByZWxlYXNlSW5wdXQoKSkKKyAgICBjbGFzcyBBdWRpb1JlY29yZENsaWVudCA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgICAgICAgICAgQXVkaW9SZWNvcmRDbGllbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsIHVpZF90IHVpZCwgcGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBjb25zdCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpbnB1dCksIHVpZCh1aWQpLCBwaWQocGlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKSwgc2Vzc2lvbihzZXNzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlKGZhbHNlKSwgaXNDb25jdXJyZW50KGZhbHNlKSwgaXNWaXJ0dWFsRGV2aWNlKGZhbHNlKSB7fQorICAgICAgICB2aXJ0dWFsIH5BdWRpb1JlY29yZENsaWVudCgpIHt9CisKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXM7IC8vIHNvdXJjZSwgZmxhZ3MgLi4uCisgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0OyAgICAgICAvLyBhdWRpbyBIQUwgaW5wdXQgSU8gaGFuZGxlCisgICAgICAgIGNvbnN0IHVpZF90IHVpZDsgICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgVUlECisgICAgICAgIGNvbnN0IHBpZF90IHBpZDsgICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgUElECisgICAgICAgIGNvbnN0IFN0cmluZzE2IG9wUGFja2FnZU5hbWU7ICAgICAgICAvLyBjbGllbnQgcGFja2FnZSBuYW1lCisgICAgICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uOyAgICAgICAvLyBhdWRpbyBzZXNzaW9uIElECisgICAgICAgIGJvb2wgYWN0aXZlOyAgICAgICAgICAgICAgICAgICAvLyBDYXB0dXJlIGlzIGFjdGl2ZSBvciBpbmFjdGl2ZQorICAgICAgICBib29sIGlzQ29uY3VycmVudDsgICAgICAgICAgICAgLy8gaXMgYWxsb3dlZCB0byBjb25jdXJyZW50IGNhcHR1cmUKKyAgICAgICAgYm9vbCBpc1ZpcnR1YWxEZXZpY2U7ICAgICAgICAgIC8vIHVzZXMgdml0dWFsIGRldmljZTogdXBkYXRlZCBieSBBUE06OmdldElucHV0Rm9yQXR0cigpCisgICAgfTsKKworICAgIC8vIEEgY2xhc3MgYXV0b21hdGljYWxseSBjbGVhcmluZyBhbmQgcmVzdG9yaW5nIGJpbmRlciBjYWxsZXIgaWRlbnRpdHkgaW5zaWRlCisgICAgLy8gYSBjb2RlIGJsb2NrIChzY29wZWQgdmFyaWFibGUpCisgICAgLy8gRGVjbGFyZSBvbmUgc3lzdGVtYXRpY2FsbHkgYmVmb3JlIGNhbGxpbmcgQXVkaW9Qb2xpY3lNYW5hZ2VyIG1ldGhvZHMgc28gdGhhdCB0aGV5IGFyZQorICAgIC8vIGV4ZWN1dGVkIHdpdGggdGhlIHNhbWUgbGV2ZWwgb2YgcHJpdmlsZWdlIGFzIGF1ZGlvc2VydmVyIHByb2Nlc3MuCisgICAgY2xhc3MgQXV0b0NhbGxlckNsZWFyIHsKKyAgICBwdWJsaWM6CisgICAgICAgICAgICBBdXRvQ2FsbGVyQ2xlYXIoKSA6CisgICAgICAgICAgICAgICAgbVRva2VuKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCkpIHt9CisgICAgICAgICAgICB+QXV0b0NhbGxlckNsZWFyKCkgeworICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkobVRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0ICAgaW50NjRfdCBtVG9rZW47CisgICAgfTsKKwogICAgIC8vIEludGVybmFsIGR1bXAgdXRpbGl0aWVzLgogICAgIHN0YXR1c190IGR1bXBQZXJtaXNzaW9uRGVuaWFsKGludCBmZCk7CiAKQEAgLTU4MSw4ICs2NzksMTEgQEAKICAgICAvLyBNYW5hZ2UgYWxsIGVmZmVjdHMgY29uZmlndXJlZCBpbiBhdWRpb19lZmZlY3RzLmNvbmYKICAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+IG1BdWRpb1BvbGljeUVmZmVjdHM7CiAgICAgYXVkaW9fbW9kZV90IG1QaG9uZVN0YXRlOworCisgICAgc3A8VWlkUG9saWN5PiBtVWlkUG9saWN5OworICAgIERlZmF1bHRLZXllZFZlY3RvcjwgYXVkaW9fcG9ydF9oYW5kbGVfdCwgc3A8QXVkaW9SZWNvcmRDbGllbnQ+ID4gICBtQXVkaW9SZWNvcmRDbGllbnRzOwogfTsKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vIEFORFJPSURfQVVESU9QT0xJQ1lTRVJWSUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0M2RhZWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzIgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5IFwKKyAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCisgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZSBcCisgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvdXRpbGl0aWVzCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICBsaWJhdWRpb3BvbGljeW1hbmFnZXJkZWZhdWx0IFwKKyAgbGliYmFzZSBcCisgIGxpYmxvZyBcCisgIGxpYm1lZGlhX2hlbHBlciBcCisgIGxpYnV0aWxzIFwKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cyBcCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgIGF1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAgXAorCitMT0NBTF9NT0RVTEUgOj0gYXVkaW9wb2xpY3lfdGVzdHMKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfQ0ZMQUdTIDo9IC1XZXJyb3IgLVdhbGwKKworTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKKworaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RDbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjgyMjJjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkF1ZGlvUG9saWN5SW50ZXJmYWNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQXVkaW9Qb2xpY3lUZXN0Q2xpZW50IDogcHVibGljIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+QXVkaW9Qb2xpY3lUZXN0Q2xpZW50KCkgPSBkZWZhdWx0OworCisgICAgLy8gQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgSW1wbGVtZW50YXRpb24KKyAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbG9hZEh3TW9kdWxlKGNvbnN0IGNoYXIqIC8qbmFtZSovKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBBVURJT19NT0RVTEVfSEFORExFX05PTkU7CisgICAgfQorICAgIHN0YXR1c190IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IC8qbW9kdWxlKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCogLypvdXRwdXQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190KiAvKmNvbmZpZyovLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190KiAvKmRldmljZXMqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIC8qYWRkcmVzcyovLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIC8qbGF0ZW5jeU1zKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAvKmZsYWdzKi8pIG92ZXJyaWRlIHsgcmV0dXJuIE5PX0lOSVQ7IH0KKyAgICBhdWRpb19pb19oYW5kbGVfdCBvcGVuRHVwbGljYXRlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IC8qb3V0cHV0MSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgLypvdXRwdXQyKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIH0KKyAgICBzdGF0dXNfdCBjbG9zZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCAvKm91dHB1dCovKSBvdmVycmlkZSB7IHJldHVybiBOT19JTklUOyB9CisgICAgc3RhdHVzX3Qgc3VzcGVuZE91dHB1dChhdWRpb19pb19oYW5kbGVfdCAvKm91dHB1dCovKSBvdmVycmlkZSB7IHJldHVybiBOT19JTklUOyB9CisgICAgc3RhdHVzX3QgcmVzdG9yZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCAvKm91dHB1dCovKSBvdmVycmlkZSB7IHJldHVybiBOT19JTklUOyB9CisgICAgc3RhdHVzX3Qgb3BlbklucHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCAvKm1vZHVsZSovLAorICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCogLyppbnB1dCovLAorICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCogLypjb25maWcqLywKKyAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190KiAvKmRldmljZSovLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiAvKmFkZHJlc3MqLywKKyAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgLypzb3VyY2UqLywKKyAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCAvKmZsYWdzKi8pIG92ZXJyaWRlIHsgcmV0dXJuIE5PX0lOSVQ7IH0KKyAgICBzdGF0dXNfdCBjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IC8qaW5wdXQqLykgb3ZlcnJpZGUgeyByZXR1cm4gTk9fSU5JVDsgfQorICAgIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IC8qc3RyZWFtKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IC8qdm9sdW1lKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IC8qb3V0cHV0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKmRlbGF5TXMqLykgb3ZlcnJpZGUgeyByZXR1cm4gTk9fSU5JVDsgfQorICAgIHN0YXR1c190IGludmFsaWRhdGVTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCAvKnN0cmVhbSovKSBvdmVycmlkZSB7IHJldHVybiBOT19JTklUOyB9CisgICAgdm9pZCBzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IC8qaW9IYW5kbGUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgLyprZXlWYWx1ZVBhaXJzKi8sCisgICAgICAgICAgICAgICAgICAgICAgIGludCAvKmRlbGF5TXMqLykgb3ZlcnJpZGUgeyB9CisgICAgU3RyaW5nOCBnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IC8qaW9IYW5kbGUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgLyprZXlzKi8pIG92ZXJyaWRlIHsgcmV0dXJuIFN0cmluZzgoKTsgfQorICAgIHN0YXR1c190IHN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IC8qdG9uZSovLAorICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IC8qc3RyZWFtKi8pIG92ZXJyaWRlIHsgcmV0dXJuIE5PX0lOSVQ7IH0KKyAgICBzdGF0dXNfdCBzdG9wVG9uZSgpIG92ZXJyaWRlIHsgcmV0dXJuIE5PX0lOSVQ7IH0KKyAgICBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCAvKnZvbHVtZSovLCBpbnQgLypkZWxheU1zKi8pIG92ZXJyaWRlIHsgcmV0dXJuIE5PX0lOSVQ7IH0KKyAgICBzdGF0dXNfdCBtb3ZlRWZmZWN0cyhhdWRpb19zZXNzaW9uX3QgLypzZXNzaW9uKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgLypzcmNPdXRwdXQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAvKmRzdE91dHB1dCovKSBvdmVycmlkZSB7IHJldHVybiBOT19JTklUOyB9CisgICAgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2gqIC8qcGF0Y2gqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90KiAvKmhhbmRsZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qZGVsYXlNcyovKSBvdmVycmlkZSB7IHJldHVybiBOT19JTklUOyB9CisgICAgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgLypoYW5kbGUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLypkZWxheU1zKi8pIG92ZXJyaWRlIHsgcmV0dXJuIE5PX0lOSVQ7IH0KKyAgICBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnKiAvKmNvbmZpZyovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLypkZWxheU1zKi8pIG92ZXJyaWRlIHsgcmV0dXJuIE5PX0lOSVQ7IH0KKyAgICB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpIG92ZXJyaWRlIHsgfQorICAgIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpIG92ZXJyaWRlIHsgfQorICAgIGF1ZGlvX3VuaXF1ZV9pZF90IG5ld0F1ZGlvVW5pcXVlSWQoYXVkaW9fdW5pcXVlX2lkX3VzZV90IC8qdXNlKi8pIG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0KKyAgICB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggLypyZWdJZCovLCBpbnQzMl90IC8qc3RhdGUqLykgb3ZlcnJpZGUgeyB9CisgICAgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IC8qZXZlbnQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCogLypjbGllbnRJbmZvKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlKiAvKmNsaWVudENvbmZpZyovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSogLypkZXZpY2VDb25maWcqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAvKnBhdGNoSGFuZGxlKi8pIG92ZXJyaWRlIHsgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0TWFuYWdlci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0TWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNTQzYTYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RNYW5hZ2VyLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIm1hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEF1ZGlvUG9saWN5VGVzdE1hbmFnZXIgOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VyIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IEF1ZGlvUG9saWN5VGVzdE1hbmFnZXIoQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSkKKyAgICAgICAgICAgIDogQXVkaW9Qb2xpY3lNYW5hZ2VyKGNsaWVudEludGVyZmFjZSwgdHJ1ZSAvKmZvclRlc3RpbmcqLykgeyB9CisgICAgdXNpbmcgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRDb25maWc7CisgICAgdXNpbmcgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbml0aWFsaXplOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NTkzYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmgiCisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lUZXN0TWFuYWdlci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworVEVTVChBdWRpb1BvbGljeU1hbmFnZXJUZXN0SW5pdCwgRmFpbHVyZSkgeworICAgIEF1ZGlvUG9saWN5VGVzdENsaWVudCBjbGllbnQ7CisgICAgQXVkaW9Qb2xpY3lUZXN0TWFuYWdlciBtYW5hZ2VyKCZjbGllbnQpOworICAgIG1hbmFnZXIuZ2V0Q29uZmlnKCkuc2V0RGVmYXVsdCgpOworICAgIC8vIFNpbmNlIHRoZSBkZWZhdWx0IGNsaWVudCBmYWlscyB0byBvcGVuIGFueXRoaW5nLAorICAgIC8vIEFQTSBzaG91bGQgaW5kaWNhdGUgdGhhdCB0aGUgaW5pdGlhbGl6YXRpb24gZGlkbid0IHN1Y2NlZWQuCisgICAgQVNTRVJUX0VRKE5PX0lOSVQsIG1hbmFnZXIuaW5pdGlhbGl6ZSgpKTsKKyAgICBBU1NFUlRfRVEoTk9fSU5JVCwgbWFuYWdlci5pbml0Q2hlY2soKSk7Cit9CisKKworY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudCA6IHB1YmxpYyBBdWRpb1BvbGljeVRlc3RDbGllbnQgeworICBwdWJsaWM6CisgICAgLy8gQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgaW1wbGVtZW50YXRpb24KKyAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbG9hZEh3TW9kdWxlKGNvbnN0IGNoYXIqIC8qbmFtZSovKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtTmV4dE1vZHVsZUhhbmRsZSsrOworICAgIH0KKworICAgIHN0YXR1c190IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90KiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCogLypjb25maWcqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCogLypkZXZpY2VzKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiAvKmFkZHJlc3MqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiAvKmxhdGVuY3lNcyovLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgLypmbGFncyovKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtb2R1bGUgPj0gbU5leHRNb2R1bGVIYW5kbGUpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogTW9kdWxlIGhhbmRsZSAlZCBoYXMgbm90IGJlZW4gYWxsb2NhdGVkIHlldCAobmV4dCBpcyAlZCkiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbW9kdWxlLCBtTmV4dE1vZHVsZUhhbmRsZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgICpvdXRwdXQgPSBtTmV4dElvSGFuZGxlKys7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBvcGVuSW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QqIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCogLypjb25maWcqLywKKyAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190KiAvKmRldmljZSovLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiAvKmFkZHJlc3MqLywKKyAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgLypzb3VyY2UqLywKKyAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCAvKmZsYWdzKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1vZHVsZSA+PSBtTmV4dE1vZHVsZUhhbmRsZSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBNb2R1bGUgaGFuZGxlICVkIGhhcyBub3QgYmVlbiBhbGxvY2F0ZWQgeWV0IChuZXh0IGlzICVkKSIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtb2R1bGUsIG1OZXh0TW9kdWxlSGFuZGxlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgKmlucHV0ID0gbU5leHRJb0hhbmRsZSsrOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2gqIC8qcGF0Y2gqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90KiBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLypkZWxheU1zKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgKmhhbmRsZSA9IG1OZXh0UGF0Y2hIYW5kbGUrKzsKKyAgICAgICAgbUFjdGl2ZVBhdGNoZXMuaW5zZXJ0KCpoYW5kbGUpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKmRlbGF5TXMqLykgb3ZlcnJpZGUgeworICAgICAgICBpZiAobUFjdGl2ZVBhdGNoZXMuZXJhc2UoaGFuZGxlKSAhPSAxKSB7CisgICAgICAgICAgICBpZiAoaGFuZGxlID49IG1OZXh0UGF0Y2hIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFBhdGNoIGhhbmRsZSAlZCBoYXMgbm90IGJlZW4gYWxsb2NhdGVkIHlldCAobmV4dCBpcyAlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGhhbmRsZSwgbU5leHRQYXRjaEhhbmRsZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQXR0ZW1wdCB0byByZWxlYXNlIHBhdGNoICVkIHR3aWNlIiwgX19mdW5jX18sIGhhbmRsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICAvLyBIZWxwZXIgbWV0aG9kcyBmb3IgdGVzdHMKKyAgICBzaXplX3QgZ2V0QWN0aXZlUGF0Y2hlc0NvdW50KCkgY29uc3QgeyByZXR1cm4gbUFjdGl2ZVBhdGNoZXMuc2l6ZSgpOyB9CisKKyAgcHJpdmF0ZToKKyAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbU5leHRNb2R1bGVIYW5kbGUgPSBBVURJT19NT0RVTEVfSEFORExFX05PTkUgKyAxOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1OZXh0SW9IYW5kbGUgPSBBVURJT19JT19IQU5ETEVfTk9ORSArIDE7CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbU5leHRQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FICsgMTsKKyAgICBzdGQ6OnNldDxhdWRpb19wYXRjaF9oYW5kbGVfdD4gbUFjdGl2ZVBhdGNoZXM7Cit9OworCitjbGFzcyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworICBwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCk7CisgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudD4gbUNsaWVudDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QXVkaW9Qb2xpY3lUZXN0TWFuYWdlcj4gbU1hbmFnZXI7Cit9OworCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlclRlc3Q6OlNldFVwKCkgeworICAgIG1DbGllbnQucmVzZXQobmV3IEF1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQpOworICAgIG1NYW5hZ2VyLnJlc2V0KG5ldyBBdWRpb1BvbGljeVRlc3RNYW5hZ2VyKG1DbGllbnQuZ2V0KCkpKTsKKyAgICBtTWFuYWdlci0+Z2V0Q29uZmlnKCkuc2V0RGVmYXVsdCgpOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPmluaXRpYWxpemUoKSk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtTWFuYWdlci0+aW5pdENoZWNrKCkpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlclRlc3Q6OlRlYXJEb3duKCkgeworICAgIG1NYW5hZ2VyLnJlc2V0KCk7CisgICAgbUNsaWVudC5yZXNldCgpOworfQorCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCwgSW5pdFN1Y2Nlc3MpIHsKKyAgICAvLyBTZXRVcCBtdXN0IGZpbmlzaCB3aXRoIG5vIGFzc2VydGlvbnMuCit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0LCBDcmVhdGVBdWRpb1BhdGNoRmFpbHVyZSkgeworICAgIGF1ZGlvX3BhdGNoIHBhdGNoe307CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgY29uc3Qgc2l6ZV90IHBhdGNoQ291bnRCZWZvcmUgPSBtQ2xpZW50LT5nZXRBY3RpdmVQYXRjaGVzQ291bnQoKTsKKyAgICBBU1NFUlRfRVEoQkFEX1ZBTFVFLCBtTWFuYWdlci0+Y3JlYXRlQXVkaW9QYXRjaChudWxscHRyLCAmaGFuZGxlLCAwKSk7CisgICAgQVNTRVJUX0VRKEJBRF9WQUxVRSwgbU1hbmFnZXItPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCBudWxscHRyLCAwKSk7CisgICAgQVNTRVJUX0VRKEJBRF9WQUxVRSwgbU1hbmFnZXItPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmaGFuZGxlLCAwKSk7CisgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSBBVURJT19QQVRDSF9QT1JUU19NQVggKyAxOworICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7CisgICAgQVNTRVJUX0VRKEJBRF9WQUxVRSwgbU1hbmFnZXItPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmaGFuZGxlLCAwKSk7CisgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOworICAgIHBhdGNoLm51bV9zaW5rcyA9IEFVRElPX1BBVENIX1BPUlRTX01BWCArIDE7CisgICAgQVNTRVJUX0VRKEJBRF9WQUxVRSwgbU1hbmFnZXItPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmaGFuZGxlLCAwKSk7CisgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAyOworICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7CisgICAgQVNTRVJUX0VRKElOVkFMSURfT1BFUkFUSU9OLCBtTWFuYWdlci0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZoYW5kbGUsIDApKTsKKyAgICBwYXRjaCA9IHt9OworICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKKyAgICBwYXRjaC5zb3VyY2VzWzBdLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU0lOSzsKKyAgICBwYXRjaC5udW1fc2lua3MgPSAxOworICAgIHBhdGNoLnNpbmtzWzBdLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU0lOSzsKKyAgICBBU1NFUlRfRVEoSU5WQUxJRF9PUEVSQVRJT04sIG1NYW5hZ2VyLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgJmhhbmRsZSwgMCkpOworICAgIHBhdGNoID0ge307CisgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOworICAgIHBhdGNoLnNvdXJjZXNbMF0ucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7CisgICAgcGF0Y2gubnVtX3NpbmtzID0gMTsKKyAgICBwYXRjaC5zaW5rc1swXS5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRTsKKyAgICBBU1NFUlRfRVEoSU5WQUxJRF9PUEVSQVRJT04sIG1NYW5hZ2VyLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgJmhhbmRsZSwgMCkpOworICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBoYW5kbGUgaXMgbGVmdCB1bmNoYW5nZWQuCisgICAgQVNTRVJUX0VRKEFVRElPX1BBVENIX0hBTkRMRV9OT05FLCBoYW5kbGUpOworICAgIEFTU0VSVF9FUShwYXRjaENvdW50QmVmb3JlLCBtQ2xpZW50LT5nZXRBY3RpdmVQYXRjaGVzQ291bnQoKSk7Cit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0LCBDcmVhdGVBdWRpb1BhdGNoRnJvbU1peCkgeworICAgIGF1ZGlvX3BhdGNoIHBhdGNoe307CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgdWlkX3QgdWlkID0gNDI7CisgICAgY29uc3Qgc2l6ZV90IHBhdGNoQ291bnRCZWZvcmUgPSBtQ2xpZW50LT5nZXRBY3RpdmVQYXRjaGVzQ291bnQoKTsKKyAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7CisgICAgeworICAgICAgICBhdXRvJiBzcmMgPSBwYXRjaC5zb3VyY2VzWzBdOworICAgICAgICBzcmMucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7CisgICAgICAgIHNyYy50eXBlID0gQVVESU9fUE9SVF9UWVBFX01JWDsKKyAgICAgICAgc3JjLmlkID0gbU1hbmFnZXItPmdldENvbmZpZygpLmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpWzBdLT5nZXRJZCgpOworICAgICAgICAvLyBOb3RlOiB0aGVzZSBhcmUgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIG91dHB1dCBkZXZpY2UuCisgICAgICAgIHNyYy5zYW1wbGVfcmF0ZSA9IDQ0MTAwOworICAgICAgICBzcmMuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgICAgIHNyYy5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgfQorICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7CisgICAgeworICAgICAgICBhdXRvJiBzaW5rID0gcGF0Y2guc2lua3NbMF07CisgICAgICAgIHNpbmsucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TSU5LOworICAgICAgICBzaW5rLnR5cGUgPSBBVURJT19QT1JUX1RZUEVfREVWSUNFOworICAgICAgICBzaW5rLmlkID0gbU1hbmFnZXItPmdldENvbmZpZygpLmdldERlZmF1bHRPdXRwdXREZXZpY2UoKS0+Z2V0SWQoKTsKKyAgICB9CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtTWFuYWdlci0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZoYW5kbGUsIHVpZCkpOworICAgIEFTU0VSVF9ORShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSwgaGFuZGxlKTsKKyAgICBBU1NFUlRfRVEocGF0Y2hDb3VudEJlZm9yZSArIDEsIG1DbGllbnQtPmdldEFjdGl2ZVBhdGNoZXNDb3VudCgpKTsKK30KKworLy8gVE9ETzogQWRkIHBhdGNoIGNyZWF0aW9uIHRlc3RzIHRoYXQgaW52b2x2ZSBhbHJlYWR5IGV4aXN0aW5nIHBhdGNoCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tawppbmRleCA3ZWMzY2NiLi43Yjg2MTgwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTYwLDYgKzYwLDcgQEAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVM6PSBcCiAgICAgbGlidWkgXAogICAgIGxpYmxvZyBcCisgICAgbGlidXRpbHNjYWxsc3RhY2sgXAogICAgIGxpYnV0aWxzIFwKICAgICBsaWJiaW5kZXIgXAogICAgIGxpYmN1dGlscyBcCkBAIC03OCw3ICs3OSw4IEBACiAgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40IFwKICAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIFwKICAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4yIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4zCisgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMyBcCisgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNAogCiBMT0NBTF9FWFBPUlRfU0hBUkVEX0xJQlJBUllfSEVBREVSUyA6PSBsaWJiaW5kZXIgbGliY2FtZXJhX2NsaWVudCBsaWJmbXEKIApAQCAtOTEsOSArOTMsNiBAQAogCiBMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdleHRyYSAtV2Vycm9yCiAKLSMgV29ya2Fyb3VuZCBmb3IgaW52YWxpZCB1bnVzZWQtbGFtYmRhLWNhcHR1cmUgd2FybmluZyBodHRwOi8vYi8zODM0OTQ5MQotTE9DQUxfQ0xBTkdfQ0ZMQUdTICs9IC1Xbm8tZXJyb3I9dW51c2VkLWxhbWJkYS1jYXB0dXJlCi0KIExPQ0FMX01PRFVMRTo9IGxpYmNhbWVyYXNlcnZpY2UKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRmxhc2hsaWdodC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFGbGFzaGxpZ2h0LmNwcAppbmRleCBlMDZhODFmLi40NzFjNzdkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFGbGFzaGxpZ2h0LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFGbGFzaGxpZ2h0LmNwcApAQCAtMzIsMTMgKzMyLDE1IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpUb3JjaE1vZGVTdGF0dXM7CisKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gQ2FtZXJhRmxhc2hsaWdodCBpbXBsZW1lbnRhdGlvbiBiZWdpbnMKIC8vIHVzZWQgYnkgY2FtZXJhIHNlcnZpY2UgdG8gY29udHJvbCBmbGFzaGZsaWdodC4KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBDYW1lcmFGbGFzaGxpZ2h0OjpDYW1lcmFGbGFzaGxpZ2h0KHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gcHJvdmlkZXJNYW5hZ2VyLAotICAgICAgICBjYW1lcmFfbW9kdWxlX2NhbGxiYWNrc190KiBjYWxsYmFja3MpIDoKKyAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpTdGF0dXNMaXN0ZW5lciogY2FsbGJhY2tzKSA6CiAgICAgICAgIG1Qcm92aWRlck1hbmFnZXIocHJvdmlkZXJNYW5hZ2VyKSwKICAgICAgICAgbUNhbGxiYWNrcyhjYWxsYmFja3MpLAogICAgICAgICBtRmxhc2hsaWdodE1hcEluaXRpYWxpemVkKGZhbHNlKSB7CkBAIC01OSw3ICs2MSw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gT25seSBIQUwxIGRldmljZXMgZG8gbm90IHN1cHBvcnQgc2V0VG9yY2hNb2RlCiAgICAgICAgIG1GbGFzaENvbnRyb2wgPQotICAgICAgICAgICAgICAgIG5ldyBDYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbChtUHJvdmlkZXJNYW5hZ2VyLCAqbUNhbGxiYWNrcyk7CisgICAgICAgICAgICAgICAgbmV3IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sKG1Qcm92aWRlck1hbmFnZXIsIG1DYWxsYmFja3MpOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKQEAgLTExOCwxOSArMTIwLDE1IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotaW50IENhbWVyYUZsYXNobGlnaHQ6OmdldE51bWJlck9mQ2FtZXJhcygpIHsKLSAgICByZXR1cm4gbVByb3ZpZGVyTWFuYWdlci0+Z2V0QVBJMUNvbXBhdGlibGVDYW1lcmFDb3VudCgpOwotfQotCiBzdGF0dXNfdCBDYW1lcmFGbGFzaGxpZ2h0OjpmaW5kRmxhc2hVbml0cygpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgc3RhdHVzX3QgcmVzOwogCiAgICAgc3RkOjp2ZWN0b3I8U3RyaW5nOD4gY2FtZXJhSWRzOwotICAgIGludCBudW1iZXJPZkNhbWVyYXMgPSBnZXROdW1iZXJPZkNhbWVyYXMoKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaWRzID0gbVByb3ZpZGVyTWFuYWdlci0+Z2V0QVBJMUNvbXBhdGlibGVDYW1lcmFEZXZpY2VJZHMoKTsKKyAgICBpbnQgbnVtYmVyT2ZDYW1lcmFzID0gc3RhdGljX2Nhc3Q8aW50PihpZHMuc2l6ZSgpKTsKICAgICBjYW1lcmFJZHMucmVzaXplKG51bWJlck9mQ2FtZXJhcyk7CiAgICAgLy8gTm8gbW9kdWxlLCBtdXN0IGJlIHByb3ZpZGVyCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGlkcyA9IG1Qcm92aWRlck1hbmFnZXItPmdldEFQSTFDb21wYXRpYmxlQ2FtZXJhRGV2aWNlSWRzKCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYW1lcmFJZHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgY2FtZXJhSWRzW2ldID0gU3RyaW5nOChpZHNbaV0uY19zdHIoKSk7CiAgICAgfQpAQCAtMTg0LDcgKzE4Miw4IEBACiAKICAgICBzc2l6ZV90IGluZGV4ID0gbUhhc0ZsYXNobGlnaHRNYXAuaW5kZXhPZktleShjYW1lcmFJZCk7CiAgICAgaWYgKGluZGV4ID09IE5BTUVfTk9UX0ZPVU5EKSB7Ci0gICAgICAgIEFMT0dFKCIlczogY2FtZXJhICVzIG5vdCBwcmVzZW50IHdoZW4gZmluZEZsYXNoVW5pdHMoKSB3YXMgY2FsbGVkIiwKKyAgICAgICAgLy8gTWlnaHQgYmUgZXh0ZXJuYWwgY2FtZXJhCisgICAgICAgIEFMT0dXKCIlczogY2FtZXJhICVzIG5vdCBwcmVzZW50IHdoZW4gZmluZEZsYXNoVW5pdHMoKSB3YXMgY2FsbGVkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLnN0cmluZygpKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTIxOCwxMiArMjE3LDEzIEBACiAKICAgICAgICAgaWYgKG1PcGVuZWRDYW1lcmFJZHMuc2l6ZSgpID09IDApIHsKICAgICAgICAgICAgIC8vIG5vdGlmeSB0b3JjaCB1bmF2YWlsYWJsZSBmb3IgYWxsIGNhbWVyYXMgd2l0aCBhIGZsYXNoCi0gICAgICAgICAgICBpbnQgbnVtQ2FtZXJhcyA9IGdldE51bWJlck9mQ2FtZXJhcygpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGlkcyA9IG1Qcm92aWRlck1hbmFnZXItPmdldEFQSTFDb21wYXRpYmxlQ2FtZXJhRGV2aWNlSWRzKCk7CisgICAgICAgICAgICBpbnQgbnVtQ2FtZXJhcyA9IHN0YXRpY19jYXN0PGludD4oaWRzLnNpemUoKSk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNhbWVyYXM7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChoYXNGbGFzaFVuaXRMb2NrZWQoU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGkpKSkgewotICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tzLT50b3JjaF9tb2RlX3N0YXR1c19jaGFuZ2UobUNhbGxiYWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgaSkuc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVE9SQ0hfTU9ERV9TVEFUVVNfTk9UX0FWQUlMQUJMRSk7CisgICAgICAgICAgICAgICAgU3RyaW5nOCBpZDgoaWRzW2ldLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGlmIChoYXNGbGFzaFVuaXRMb2NrZWQoaWQ4KSkgeworICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tzLT5vblRvcmNoU3RhdHVzQ2hhbmdlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDgsIFRvcmNoTW9kZVN0YXR1czo6Tk9UX0FWQUlMQUJMRSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yNjMsMTIgKzI2MywxMyBAQAogCiAgICAgaWYgKGlzQmFja3dhcmRDb21wYXRpYmxlTW9kZShjYW1lcmFJZCkpIHsKICAgICAgICAgLy8gbm90aWZ5IHRvcmNoIGF2YWlsYWJsZSBmb3IgYWxsIGNhbWVyYXMgd2l0aCBhIGZsYXNoCi0gICAgICAgIGludCBudW1DYW1lcmFzID0gZ2V0TnVtYmVyT2ZDYW1lcmFzKCk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpZHMgPSBtUHJvdmlkZXJNYW5hZ2VyLT5nZXRBUEkxQ29tcGF0aWJsZUNhbWVyYURldmljZUlkcygpOworICAgICAgICBpbnQgbnVtQ2FtZXJhcyA9IHN0YXRpY19jYXN0PGludD4oaWRzLnNpemUoKSk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2FtZXJhczsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaGFzRmxhc2hVbml0TG9ja2VkKFN0cmluZzg6OmZvcm1hdCgiJWQiLCBpKSkpIHsKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2tzLT50b3JjaF9tb2RlX3N0YXR1c19jaGFuZ2UobUNhbGxiYWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzg6OmZvcm1hdCgiJWQiLCBpKS5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRPUkNIX01PREVfU1RBVFVTX0FWQUlMQUJMRV9PRkYpOworICAgICAgICAgICAgU3RyaW5nOCBpZDgoaWRzW2ldLmNfc3RyKCkpOworICAgICAgICAgICAgaWYgKGhhc0ZsYXNoVW5pdExvY2tlZChpZDgpKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrcy0+b25Ub3JjaFN0YXR1c0NoYW5nZWQoCisgICAgICAgICAgICAgICAgICAgICAgICBpZDgsIFRvcmNoTW9kZVN0YXR1czo6QVZBSUxBQkxFX09GRik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0zMTUsOSArMzE2LDkgQEAKIAogQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2w6OkNhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sKAogICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCi0gICAgICAgIGNvbnN0IGNhbWVyYV9tb2R1bGVfY2FsbGJhY2tzX3QmIGNhbGxiYWNrcykgOgorICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlN0YXR1c0xpc3RlbmVyKiBjYWxsYmFja3MpIDoKICAgICAgICAgbVByb3ZpZGVyTWFuYWdlcihtYW5hZ2VyKSwKLSAgICAgICAgbUNhbGxiYWNrcygmY2FsbGJhY2tzKSwKKyAgICAgICAgbUNhbGxiYWNrcyhjYWxsYmFja3MpLAogICAgICAgICBtVG9yY2hFbmFibGVkKGZhbHNlKSB7CiB9CiAKQEAgLTMzMyw4ICszMzQsNyBAQAogICAgICAgICBpZiAobUNhbGxiYWNrcykgewogICAgICAgICAgICAgQUxPR1YoIiVzOiBub3RpZnkgdGhlIGZyYW1ld29yayB0aGF0IHRvcmNoIHdhcyB0dXJuZWQgb2ZmIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgIG1DYWxsYmFja3MtPnRvcmNoX21vZGVfc3RhdHVzX2NoYW5nZShtQ2FsbGJhY2tzLAotICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSWQuc3RyaW5nKCksIFRPUkNIX01PREVfU1RBVFVTX0FWQUlMQUJMRV9PRkYpOworICAgICAgICAgICAgbUNhbGxiYWNrcy0+b25Ub3JjaFN0YXR1c0NoYW5nZWQobUNhbWVyYUlkLCBUb3JjaE1vZGVTdGF0dXM6OkFWQUlMQUJMRV9PRkYpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMzY4LDggKzM2OCw3IEBACiAgICAgICAgIC8vIGRpc2FibGluZyB0aGUgdG9yY2ggbW9kZSBvZiBjdXJyZW50bHkgb3BlbmVkIGRldmljZQogICAgICAgICBkaXNjb25uZWN0Q2FtZXJhRGV2aWNlKCk7CiAgICAgICAgIG1Ub3JjaEVuYWJsZWQgPSBmYWxzZTsKLSAgICAgICAgbUNhbGxiYWNrcy0+dG9yY2hfbW9kZV9zdGF0dXNfY2hhbmdlKG1DYWxsYmFja3MsCi0gICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgVE9SQ0hfTU9ERV9TVEFUVVNfQVZBSUxBQkxFX09GRik7CisgICAgICAgIG1DYWxsYmFja3MtPm9uVG9yY2hTdGF0dXNDaGFuZ2VkKGNhbWVyYUlkLCBUb3JjaE1vZGVTdGF0dXM6OkFWQUlMQUJMRV9PRkYpOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCkBAIC0zNzksOCArMzc4LDcgQEAKICAgICB9CiAKICAgICBtVG9yY2hFbmFibGVkID0gdHJ1ZTsKLSAgICBtQ2FsbGJhY2tzLT50b3JjaF9tb2RlX3N0YXR1c19jaGFuZ2UobUNhbGxiYWNrcywKLSAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpLCBUT1JDSF9NT0RFX1NUQVRVU19BVkFJTEFCTEVfT04pOworICAgIG1DYWxsYmFja3MtPm9uVG9yY2hTdGF0dXNDaGFuZ2VkKGNhbWVyYUlkLCBUb3JjaE1vZGVTdGF0dXM6OkFWQUlMQUJMRV9PTik7CiAgICAgcmV0dXJuIE9LOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFGbGFzaGxpZ2h0LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFGbGFzaGxpZ2h0LmgKaW5kZXggYzg2ZWU4NS4uMWJhYWJhMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRmxhc2hsaWdodC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUZsYXNobGlnaHQuaApAQCAtMTksNyArMTksNiBAQAogCiAjaW5jbHVkZSA8Z3VpL0dMQ29uc3VtZXIuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYV9jb21tb24uaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgogI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaCIKQEAgLTU1LDcgKzU0LDcgQEAKIGNsYXNzIENhbWVyYUZsYXNobGlnaHQgOiBwdWJsaWMgdmlydHVhbCBWaXJ0dWFsTGlnaHRSZWZCYXNlIHsKICAgICBwdWJsaWM6CiAgICAgICAgIENhbWVyYUZsYXNobGlnaHQoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBwcm92aWRlck1hbmFnZXIsCi0gICAgICAgICAgICAgICAgY2FtZXJhX21vZHVsZV9jYWxsYmFja3NfdCogY2FsbGJhY2tzKTsKKyAgICAgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlN0YXR1c0xpc3RlbmVyKiBjYWxsYmFja3MpOwogICAgICAgICB2aXJ0dWFsIH5DYW1lcmFGbGFzaGxpZ2h0KCk7CiAKICAgICAgICAgLy8gRmluZCBhbGwgZmxhc2ggdW5pdHMuIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIG90aGVyIG1ldGhvZHMuIEFsbApAQCAtOTMsMTMgKzkyLDExIEBACiAgICAgICAgIC8vIG9wZW5pbmcgY2FtZXJhcykKICAgICAgICAgYm9vbCBpc0JhY2t3YXJkQ29tcGF0aWJsZU1vZGUoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpOwogCi0gICAgICAgIGludCBnZXROdW1iZXJPZkNhbWVyYXMoKTsKLQogICAgICAgICBzcDxGbGFzaENvbnRyb2xCYXNlPiBtRmxhc2hDb250cm9sOwogCiAgICAgICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbVByb3ZpZGVyTWFuYWdlcjsKIAotICAgICAgICBjb25zdCBjYW1lcmFfbW9kdWxlX2NhbGxiYWNrc190ICptQ2FsbGJhY2tzOworICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlN0YXR1c0xpc3RlbmVyKiBtQ2FsbGJhY2tzOwogICAgICAgICBTb3J0ZWRWZWN0b3I8U3RyaW5nOD4gbU9wZW5lZENhbWVyYUlkczsKIAogICAgICAgICAvLyBjYW1lcmEgaWQgLT4gaWYgaXQgaGFzIGEgZmxhc2ggdW5pdApAQCAtMTM0LDcgKzEzMSw3IEBACiAgICAgcHVibGljOgogICAgICAgICBDYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbCgKICAgICAgICAgICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCi0gICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21vZHVsZV9jYWxsYmFja3NfdCYgY2FsbGJhY2tzKTsKKyAgICAgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlN0YXR1c0xpc3RlbmVyKiBjYWxsYmFja3MpOwogICAgICAgICB2aXJ0dWFsIH5DYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbCgpOwogCiAgICAgICAgIC8vIEZsYXNoQ29udHJvbEJhc2UKQEAgLTE2Niw3ICsxNjMsNyBAQAogICAgICAgICBzdGF0dXNfdCBoYXNGbGFzaFVuaXRMb2NrZWQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgKmhhc0ZsYXNoLCBib29sIGtlZXBEZXZpY2VPcGVuKTsKIAogICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1Qcm92aWRlck1hbmFnZXI7Ci0gICAgICAgIGNvbnN0IGNhbWVyYV9tb2R1bGVfY2FsbGJhY2tzX3QgKm1DYWxsYmFja3M7CisgICAgICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6U3RhdHVzTGlzdGVuZXIqIG1DYWxsYmFja3M7CiAgICAgICAgIHNwPENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlPiBtRGV2aWNlOwogICAgICAgICBTdHJpbmc4IG1DYW1lcmFJZDsKICAgICAgICAgQ2FtZXJhUGFyYW1ldGVycyBtUGFyYW1ldGVyczsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKaW5kZXggMjBiZDVlNC4uYzg3YjVlYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKQEAgLTMzLDE0ICszMywxOCBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wYXJzZWludC5oPgorI2luY2x1ZGUgPGJpbmRlci9BY3Rpdml0eU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvQXBwT3BzTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5QmFzZS5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgorI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ29udHJvbGxlci5oPgogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzSW5mb1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVJlc3VsdFJlY2VpdmVyLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWVtdW5yZWFjaGFibGUvbWVtdW5yZWFjaGFibGUuaD4KQEAgLTYzLDYgKzY3LDcgQEAKICNpbmNsdWRlICJhcGkxL0NhbWVyYTJDbGllbnQuaCIKICNpbmNsdWRlICJhcGkyL0NhbWVyYURldmljZUNsaWVudC5oIgogI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRyYWNlcy5oIgorI2luY2x1ZGUgInV0aWxzL1RhZ01vbml0b3IuaCIKIAogbmFtZXNwYWNlIHsKICAgICBjb25zdCBjaGFyKiBrUGVybWlzc2lvblNlcnZpY2VOYW1lID0gInBlcm1pc3Npb24iOwpAQCAtMTAzLDc3ICsxMDgsMTMgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1leHRlcm4gIkMiIHsKLXN0YXRpYyB2b2lkIGNhbWVyYV9kZXZpY2Vfc3RhdHVzX2NoYW5nZSgKLSAgICAgICAgY29uc3Qgc3RydWN0IGNhbWVyYV9tb2R1bGVfY2FsbGJhY2tzKiBjYWxsYmFja3MsCi0gICAgICAgIGludCBjYW1lcmFfaWQsCi0gICAgICAgIGludCBuZXdfc3RhdHVzKSB7Ci0gICAgc3A8Q2FtZXJhU2VydmljZT4gY3MgPSBjb25zdF9jYXN0PENhbWVyYVNlcnZpY2UqPigKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IENhbWVyYVNlcnZpY2UqPihjYWxsYmFja3MpKTsKLSAgICBTdHJpbmc4IGlkID0gU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGNhbWVyYV9pZCk7Ci0KLSAgICBDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVze0NhbWVyYURldmljZVN0YXR1czo6Tk9UX1BSRVNFTlR9OwotICAgIHN3aXRjaCAobmV3X3N0YXR1cykgewotICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfU1RBVFVTX05PVF9QUkVTRU5UOgotICAgICAgICAgICAgbmV3U3RhdHVzID0gQ2FtZXJhRGV2aWNlU3RhdHVzOjpOT1RfUFJFU0VOVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfU1RBVFVTX1BSRVNFTlQ6Ci0gICAgICAgICAgICBuZXdTdGF0dXMgPSBDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX1NUQVRVU19FTlVNRVJBVElORzoKLSAgICAgICAgICAgIG5ld1N0YXR1cyA9IENhbWVyYURldmljZVN0YXR1czo6RU5VTUVSQVRJTkc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dXKCJVbmtub3duIGRldmljZSBzdGF0dXMgY2hhbmdlIHRvICVkIiwgbmV3X3N0YXR1cyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgY3MtPm9uRGV2aWNlU3RhdHVzQ2hhbmdlZChpZCwgbmV3U3RhdHVzKTsKLX0KLQotc3RhdGljIHZvaWQgdG9yY2hfbW9kZV9zdGF0dXNfY2hhbmdlKAotICAgICAgICBjb25zdCBzdHJ1Y3QgY2FtZXJhX21vZHVsZV9jYWxsYmFja3MqIGNhbGxiYWNrcywKLSAgICAgICAgY29uc3QgY2hhciogY2FtZXJhX2lkLAotICAgICAgICBpbnQgbmV3X3N0YXR1cykgewotICAgIGlmICghY2FsbGJhY2tzIHx8ICFjYW1lcmFfaWQpIHsKLSAgICAgICAgQUxPR0UoIiVzIGludmFsaWQgcGFyYW1ldGVycy4gY2FsbGJhY2tzICVwLCBjYW1lcmFfaWQgJXAiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgY2FsbGJhY2tzLCBjYW1lcmFfaWQpOwotICAgIH0KLSAgICBzcDxDYW1lcmFTZXJ2aWNlPiBjcyA9IGNvbnN0X2Nhc3Q8Q2FtZXJhU2VydmljZSo+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBDYW1lcmFTZXJ2aWNlKj4oY2FsbGJhY2tzKSk7Ci0KLSAgICBUb3JjaE1vZGVTdGF0dXMgc3RhdHVzOwotICAgIHN3aXRjaCAobmV3X3N0YXR1cykgewotICAgICAgICBjYXNlIFRPUkNIX01PREVfU1RBVFVTX05PVF9BVkFJTEFCTEU6Ci0gICAgICAgICAgICBzdGF0dXMgPSBUb3JjaE1vZGVTdGF0dXM6Ok5PVF9BVkFJTEFCTEU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUT1JDSF9NT0RFX1NUQVRVU19BVkFJTEFCTEVfT0ZGOgotICAgICAgICAgICAgc3RhdHVzID0gVG9yY2hNb2RlU3RhdHVzOjpBVkFJTEFCTEVfT0ZGOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVE9SQ0hfTU9ERV9TVEFUVVNfQVZBSUxBQkxFX09OOgotICAgICAgICAgICAgc3RhdHVzID0gVG9yY2hNb2RlU3RhdHVzOjpBVkFJTEFCTEVfT047Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJVbmtub3duIHRvcmNoIHN0YXR1cyAlZCIsIG5ld19zdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNzLT5vblRvcmNoU3RhdHVzQ2hhbmdlZCgKLSAgICAgICAgU3RyaW5nOChjYW1lcmFfaWQpLAotICAgICAgICBzdGF0dXMpOwotfQotfSAvLyBleHRlcm4gIkMiCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyBjb25zdCBTdHJpbmcxNiBzTWFuYWdlQ2FtZXJhUGVybWlzc2lvbigiYW5kcm9pZC5wZXJtaXNzaW9uLk1BTkFHRV9DQU1FUkEiKTsKIAogQ2FtZXJhU2VydmljZTo6Q2FtZXJhU2VydmljZSgpIDoKICAgICAgICAgbUV2ZW50TG9nKERFRkFVTFRfRVZFTlRfTE9HX0xFTkdUSCksCi0gICAgICAgIG1OdW1iZXJPZkNhbWVyYXMoMCksIG1OdW1iZXJPZk5vcm1hbENhbWVyYXMoMCksCisgICAgICAgIG1OdW1iZXJPZkNhbWVyYXMoMCksCiAgICAgICAgIG1Tb3VuZFJlZigwKSwgbUluaXRpYWxpemVkKGZhbHNlKSB7CiAgICAgQUxPR0koIkNhbWVyYVNlcnZpY2Ugc3RhcnRlZCAocGlkPSVkKSIsIGdldHBpZCgpKTsKLQotICAgIHRoaXMtPmNhbWVyYV9kZXZpY2Vfc3RhdHVzX2NoYW5nZSA9IGFuZHJvaWQ6OmNhbWVyYV9kZXZpY2Vfc3RhdHVzX2NoYW5nZTsKLSAgICB0aGlzLT50b3JjaF9tb2RlX3N0YXR1c19jaGFuZ2UgPSBhbmRyb2lkOjp0b3JjaF9tb2RlX3N0YXR1c19jaGFuZ2U7Ci0KICAgICBtU2VydmljZUxvY2tXcmFwcGVyID0gc3RkOjptYWtlX3NoYXJlZDxXYWl0YWJsZU11dGV4V3JhcHBlcj4oJm1TZXJ2aWNlTG9jayk7CiB9CiAKQEAgLTE5Niw3NiArMTM3LDUwIEBACiAgICAgfQogCiAgICAgQ2FtZXJhU2VydmljZTo6cGluZ0NhbWVyYVNlcnZpY2VQcm94eSgpOworCisgICAgbVVpZFBvbGljeSA9IG5ldyBVaWRQb2xpY3kodGhpcyk7CisgICAgbVVpZFBvbGljeS0+cmVnaXN0ZXJTZWxmKCk7CiB9CiAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OmVudW1lcmF0ZVByb3ZpZGVycygpIHsKICAgICBzdGF0dXNfdCByZXM7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobVNlcnZpY2VMb2NrKTsKIAotICAgIGlmIChudWxscHRyID09IG1DYW1lcmFQcm92aWRlck1hbmFnZXIuZ2V0KCkpIHsKLSAgICAgICAgbUNhbWVyYVByb3ZpZGVyTWFuYWdlciA9IG5ldyBDYW1lcmFQcm92aWRlck1hbmFnZXIoKTsKLSAgICAgICAgcmVzID0gbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+aW5pdGlhbGl6ZSh0aGlzKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gaW5pdGlhbGl6ZSBjYW1lcmEgcHJvdmlkZXIgbWFuYWdlcjogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9Ci0gICAgfQorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBkZXZpY2VJZHM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtU2VydmljZUxvY2spOwogCi0gICAgbU51bWJlck9mQ2FtZXJhcyA9IG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmdldENhbWVyYUNvdW50KCk7Ci0gICAgbU51bWJlck9mTm9ybWFsQ2FtZXJhcyA9Ci0gICAgICAgICAgICBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5nZXRBUEkxQ29tcGF0aWJsZUNhbWVyYUNvdW50KCk7Ci0KLSAgICAvLyBTZXR1cCB2ZW5kb3IgdGFncyBiZWZvcmUgd2UgY2FsbCBnZXRfY2FtZXJhX2luZm8gdGhlIGZpcnN0IHRpbWUKLSAgICAvLyBiZWNhdXNlIEhBTCBtaWdodCBuZWVkIHRvIHNldHVwIHN0YXRpYyB2ZW5kb3Iga2V5cyBpbiBnZXRfY2FtZXJhX2luZm8KLSAgICAvLyBUT0RPOiBtYXliZSBwdXQgdGhpcyBpbnRvIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aW5pdGlhbGl6ZSgpPwotICAgIG1DYW1lcmFQcm92aWRlck1hbmFnZXItPnNldFVwVmVuZG9yVGFncygpOwotCi0gICAgaWYgKG51bGxwdHIgPT0gbUZsYXNobGlnaHQuZ2V0KCkpIHsKLSAgICAgICAgbUZsYXNobGlnaHQgPSBuZXcgQ2FtZXJhRmxhc2hsaWdodChtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLCB0aGlzKTsKLSAgICB9Ci0KLSAgICByZXMgPSBtRmxhc2hsaWdodC0+ZmluZEZsYXNoVW5pdHMoKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZW51bWVyYXRlIGZsYXNoIHVuaXRzOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgfQotCi0gICAgZm9yIChhdXRvJiBjYW1lcmFJZCA6IG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmdldENhbWVyYURldmljZUlkcygpKSB7Ci0gICAgICAgIFN0cmluZzggaWQ4ID0gU3RyaW5nOChjYW1lcmFJZC5jX3N0cigpKTsKLSAgICAgICAgYm9vbCBjYW1lcmFGb3VuZCA9IGZhbHNlOwotICAgICAgICB7Ci0KLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1DYW1lcmFTdGF0ZXNMb2NrKTsKLSAgICAgICAgICAgIGF1dG8gaXRlciA9IG1DYW1lcmFTdGF0ZXMuZmluZChpZDgpOwotICAgICAgICAgICAgaWYgKGl0ZXIgIT0gbUNhbWVyYVN0YXRlcy5lbmQoKSkgewotICAgICAgICAgICAgICAgIGNhbWVyYUZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghY2FtZXJhRm91bmQpIHsKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhUmVzb3VyY2VDb3N0IGNvc3Q7Ci0gICAgICAgICAgICByZXMgPSBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5nZXRSZXNvdXJjZUNvc3QoY2FtZXJhSWQsICZjb3N0KTsKKyAgICAgICAgaWYgKG51bGxwdHIgPT0gbUNhbWVyYVByb3ZpZGVyTWFuYWdlci5nZXQoKSkgeworICAgICAgICAgICAgbUNhbWVyYVByb3ZpZGVyTWFuYWdlciA9IG5ldyBDYW1lcmFQcm92aWRlck1hbmFnZXIoKTsKKyAgICAgICAgICAgIHJlcyA9IG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmluaXRpYWxpemUodGhpcyk7CiAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBxdWVyeSBkZXZpY2UgcmVzb3VyY2UgY29zdDogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RkOjpzZXQ8U3RyaW5nOD4gY29uZmxpY3Rpbmc7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvc3QuY29uZmxpY3RpbmdEZXZpY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY29uZmxpY3RpbmcuZW1wbGFjZShTdHJpbmc4KGNvc3QuY29uZmxpY3RpbmdEZXZpY2VzW2ldLmNfc3RyKCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1DYW1lcmFTdGF0ZXNMb2NrKTsKLSAgICAgICAgICAgICAgICBtQ2FtZXJhU3RhdGVzLmVtcGxhY2UoaWQ4LAotICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPENhbWVyYVN0YXRlPihpZDgsIGNvc3QucmVzb3VyY2VDb3N0LCBjb25mbGljdGluZykpOworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGluaXRpYWxpemUgY2FtZXJhIHByb3ZpZGVyIG1hbmFnZXI6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKworICAgICAgICAvLyBTZXR1cCB2ZW5kb3IgdGFncyBiZWZvcmUgd2UgY2FsbCBnZXRfY2FtZXJhX2luZm8gdGhlIGZpcnN0IHRpbWUKKyAgICAgICAgLy8gYmVjYXVzZSBIQUwgbWlnaHQgbmVlZCB0byBzZXR1cCBzdGF0aWMgdmVuZG9yIGtleXMgaW4gZ2V0X2NhbWVyYV9pbmZvCisgICAgICAgIC8vIFRPRE86IG1heWJlIHB1dCB0aGlzIGludG8gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjppbml0aWFsaXplKCk/CisgICAgICAgIG1DYW1lcmFQcm92aWRlck1hbmFnZXItPnNldFVwVmVuZG9yVGFncygpOworCisgICAgICAgIGlmIChudWxscHRyID09IG1GbGFzaGxpZ2h0LmdldCgpKSB7CisgICAgICAgICAgICBtRmxhc2hsaWdodCA9IG5ldyBDYW1lcmFGbGFzaGxpZ2h0KG1DYW1lcmFQcm92aWRlck1hbmFnZXIsIHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgcmVzID0gbUZsYXNobGlnaHQtPmZpbmRGbGFzaFVuaXRzKCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZW51bWVyYXRlIGZsYXNoIHVuaXRzOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIH0KKworICAgICAgICBkZXZpY2VJZHMgPSBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5nZXRDYW1lcmFEZXZpY2VJZHMoKTsKKyAgICB9CisKKworICAgIGZvciAoYXV0byYgY2FtZXJhSWQgOiBkZXZpY2VJZHMpIHsKKyAgICAgICAgU3RyaW5nOCBpZDggPSBTdHJpbmc4KGNhbWVyYUlkLmNfc3RyKCkpOwogICAgICAgICBvbkRldmljZVN0YXR1c0NoYW5nZWQoaWQ4LCBDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQpOwotCi0gICAgICAgIGlmIChtRmxhc2hsaWdodC0+aGFzRmxhc2hVbml0KGlkOCkpIHsKLSAgICAgICAgICAgIG1Ub3JjaFN0YXR1c01hcC5hZGQoaWQ4LCBUb3JjaE1vZGVTdGF0dXM6OkFWQUlMQUJMRV9PRkYpOwotICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpAQCAtMjk0LDEyICsyMDksNjEgQEAKIAogQ2FtZXJhU2VydmljZTo6fkNhbWVyYVNlcnZpY2UoKSB7CiAgICAgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y2xlYXJHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisgICAgbVVpZFBvbGljeS0+dW5yZWdpc3RlclNlbGYoKTsKIH0KIAogdm9pZCBDYW1lcmFTZXJ2aWNlOjpvbk5ld1Byb3ZpZGVyUmVnaXN0ZXJlZCgpIHsKICAgICBlbnVtZXJhdGVQcm92aWRlcnMoKTsKIH0KIAordm9pZCBDYW1lcmFTZXJ2aWNlOjp1cGRhdGVDYW1lcmFOdW1BbmRJZHMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVNlcnZpY2VMb2NrKTsKKyAgICBtTnVtYmVyT2ZDYW1lcmFzID0gbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+Z2V0Q2FtZXJhQ291bnQoKTsKKyAgICBtTm9ybWFsRGV2aWNlSWRzID0KKyAgICAgICAgICAgIG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmdldEFQSTFDb21wYXRpYmxlQ2FtZXJhRGV2aWNlSWRzKCk7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6YWRkU3RhdGVzKGNvbnN0IFN0cmluZzggaWQpIHsKKyAgICBzdGQ6OnN0cmluZyBjYW1lcmFJZChpZC5jX3N0cigpKTsKKyAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCBjb3N0OworICAgIHN0YXR1c190IHJlcyA9IG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmdldFJlc291cmNlQ29zdChjYW1lcmFJZCwgJmNvc3QpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBxdWVyeSBkZXZpY2UgcmVzb3VyY2UgY29zdDogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0ZDo6c2V0PFN0cmluZzg+IGNvbmZsaWN0aW5nOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29zdC5jb25mbGljdGluZ0RldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uZmxpY3RpbmcuZW1wbGFjZShTdHJpbmc4KGNvc3QuY29uZmxpY3RpbmdEZXZpY2VzW2ldLmNfc3RyKCkpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1DYW1lcmFTdGF0ZXNMb2NrKTsKKyAgICAgICAgbUNhbWVyYVN0YXRlcy5lbXBsYWNlKGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPENhbWVyYVN0YXRlPihpZCwgY29zdC5yZXNvdXJjZUNvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmxpY3RpbmcpKTsKKyAgICB9CisKKyAgICBpZiAobUZsYXNobGlnaHQtPmhhc0ZsYXNoVW5pdChpZCkpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1Ub3JjaFN0YXR1c011dGV4KTsKKyAgICAgICAgbVRvcmNoU3RhdHVzTWFwLmFkZChpZCwgVG9yY2hNb2RlU3RhdHVzOjpBVkFJTEFCTEVfT0ZGKTsKKyAgICB9CisKKyAgICB1cGRhdGVDYW1lcmFOdW1BbmRJZHMoKTsKKyAgICBsb2dEZXZpY2VBZGRlZChpZCwgIkRldmljZSBhZGRlZCIpOworfQorCit2b2lkIENhbWVyYVNlcnZpY2U6OnJlbW92ZVN0YXRlcyhjb25zdCBTdHJpbmc4IGlkKSB7CisgICAgdXBkYXRlQ2FtZXJhTnVtQW5kSWRzKCk7CisgICAgaWYgKG1GbGFzaGxpZ2h0LT5oYXNGbGFzaFVuaXQoaWQpKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtVG9yY2hTdGF0dXNNdXRleCk7CisgICAgICAgIG1Ub3JjaFN0YXR1c01hcC5yZW1vdmVJdGVtKGlkKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1DYW1lcmFTdGF0ZXNMb2NrKTsKKyAgICAgICAgbUNhbWVyYVN0YXRlcy5lcmFzZShpZCk7CisgICAgfQorfQorCiB2b2lkIENhbWVyYVNlcnZpY2U6Om9uRGV2aWNlU3RhdHVzQ2hhbmdlZChjb25zdCBTdHJpbmc4JiBpZCwKICAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIG5ld0hhbFN0YXR1cykgewogICAgIEFMT0dJKCIlczogU3RhdHVzIGNoYW5nZWQgZm9yIGNhbWVyYUlkPSVzLCBuZXdTdGF0dXM9JWQiLCBfX0ZVTkNUSU9OX18sCkBAIC0zMTEsOCArMjc1LDEzIEBACiAKICAgICBpZiAoc3RhdGUgPT0gbnVsbHB0cikgewogICAgICAgICBpZiAobmV3U3RhdHVzID09IFN0YXR1c0ludGVybmFsOjpQUkVTRU5UKSB7Ci0gICAgICAgICAgICBBTE9HVygiJXM6IFVua25vd24gY2FtZXJhIElEICVzLCBwcm9iYWJseSBuZXdseSByZWdpc3RlcmVkPyIsCisgICAgICAgICAgICBBTE9HSSgiJXM6IFVua25vd24gY2FtZXJhIElEICVzLCBhIG5ldyBjYW1lcmEgaXMgYWRkZWQiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLnN0cmluZygpKTsKKworICAgICAgICAgICAgLy8gRmlyc3QgYWRkIGFzIGFic2VudCB0byBtYWtlIHN1cmUgY2xpZW50cyBhcmUgbm90aWZpZWQgYmVsb3cKKyAgICAgICAgICAgIGFkZFN0YXRlcyhpZCk7CisKKyAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhuZXdTdGF0dXMsIGlkKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQmFkIGNhbWVyYSBJRCAlcyIsIF9fRlVOQ1RJT05fXywgaWQuc3RyaW5nKCkpOwogICAgICAgICB9CkBAIC0zMjksMTUgKzI5OCwxNiBAQAogICAgIGlmIChuZXdTdGF0dXMgPT0gU3RhdHVzSW50ZXJuYWw6Ok5PVF9QUkVTRU5UKSB7CiAgICAgICAgIGxvZ0RldmljZVJlbW92ZWQoaWQsIFN0cmluZzg6OmZvcm1hdCgiRGV2aWNlIHN0YXR1cyBjaGFuZ2VkIGZyb20gJWQgdG8gJWQiLCBvbGRTdGF0dXMsCiAgICAgICAgICAgICAgICAgbmV3U3RhdHVzKSk7CisKKyAgICAgICAgLy8gU2V0IHRoZSBkZXZpY2Ugc3RhdHVzIHRvIE5PVF9QUkVTRU5ULCBjbGllbnRzIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gY29ubmVjdAorICAgICAgICAvLyB0byB0aGlzIGRldmljZSB1bnRpbCB0aGUgc3RhdHVzIGNoYW5nZXMKKyAgICAgICAgdXBkYXRlU3RhdHVzKFN0YXR1c0ludGVybmFsOjpOT1RfUFJFU0VOVCwgaWQpOworCiAgICAgICAgIHNwPEJhc2ljQ2xpZW50PiBjbGllbnRUb0Rpc2Nvbm5lY3Q7CiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIERvbid0IGRvIHRoaXMgaW4gdXBkYXRlU3RhdHVzIHRvIGF2b2lkIGRlYWRsb2NrIG92ZXIgbVNlcnZpY2VMb2NrCiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOwogCi0gICAgICAgICAgICAvLyBTZXQgdGhlIGRldmljZSBzdGF0dXMgdG8gTk9UX1BSRVNFTlQsIGNsaWVudHMgd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byBjb25uZWN0Ci0gICAgICAgICAgICAvLyB0byB0aGlzIGRldmljZSB1bnRpbCB0aGUgc3RhdHVzIGNoYW5nZXMKLSAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhTdGF0dXNJbnRlcm5hbDo6Tk9UX1BSRVNFTlQsIGlkKTsKLQogICAgICAgICAgICAgLy8gUmVtb3ZlIGNhY2hlZCBzaGltIHBhcmFtZXRlcnMKICAgICAgICAgICAgIHN0YXRlLT5zZXRTaGltUGFyYW1zKENhbWVyYVBhcmFtZXRlcnMoKSk7CiAKQEAgLTM1OSw2ICszMjksNyBAQAogICAgICAgICAgICAgY2xpZW50VG9EaXNjb25uZWN0LT5kaXNjb25uZWN0KCk7CiAgICAgICAgIH0KIAorICAgICAgICByZW1vdmVTdGF0ZXMoaWQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChvbGRTdGF0dXMgPT0gU3RhdHVzSW50ZXJuYWw6Ok5PVF9QUkVTRU5UKSB7CiAgICAgICAgICAgICBsb2dEZXZpY2VBZGRlZChpZCwgU3RyaW5nODo6Zm9ybWF0KCJEZXZpY2Ugc3RhdHVzIGNoYW5nZWQgZnJvbSAlZCB0byAlZCIsIG9sZFN0YXR1cywKQEAgLTQzOSw3ICs0MTAsNyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBsKG1TZXJ2aWNlTG9jayk7CiAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgIGNhc2UgQ0FNRVJBX1RZUEVfQkFDS1dBUkRfQ09NUEFUSUJMRToKLSAgICAgICAgICAgICpudW1DYW1lcmFzID0gbU51bWJlck9mTm9ybWFsQ2FtZXJhczsKKyAgICAgICAgICAgICpudW1DYW1lcmFzID0gc3RhdGljX2Nhc3Q8aW50PihtTm9ybWFsRGV2aWNlSWRzLnNpemUoKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBDQU1FUkFfVFlQRV9BTEw6CiAgICAgICAgICAgICAqbnVtQ2FtZXJhcyA9IG1OdW1iZXJPZkNhbWVyYXM7CkBAIC00NjksNyArNDQwLDggQEAKICAgICB9CiAKICAgICBTdGF0dXMgcmV0ID0gU3RhdHVzOjpvaygpOwotICAgIHN0YXR1c190IGVyciA9IG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmdldENhbWVyYUluZm8oc3RkOjp0b19zdHJpbmcoY2FtZXJhSWQpLCBjYW1lcmFJbmZvKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5nZXRDYW1lcmFJbmZvKAorICAgICAgICAgICAgY2FtZXJhSWRJbnRUb1N0ckxvY2tlZChjYW1lcmFJZCksIGNhbWVyYUluZm8pOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0ID0gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9JTlZBTElEX09QRVJBVElPTiwKICAgICAgICAgICAgICAgICAiRXJyb3IgcmV0cmlldmluZyBjYW1lcmEgaW5mbyBmcm9tIGRldmljZSAlZDogJXMgKCVkKSIsIGNhbWVyYUlkLApAQCAtNDc5LDEzICs0NTEsMTkgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1pbnQgQ2FtZXJhU2VydmljZTo6Y2FtZXJhSWRUb0ludChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCkgewotICAgIGludCBpZDsKLSAgICBib29sIHN1Y2Nlc3MgPSBiYXNlOjpQYXJzZUludChjYW1lcmFJZC5zdHJpbmcoKSwgJmlkLCAwKTsKLSAgICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICAgICAgcmV0dXJuIC0xOworc3RkOjpzdHJpbmcgQ2FtZXJhU2VydmljZTo6Y2FtZXJhSWRJbnRUb1N0ckxvY2tlZChpbnQgY2FtZXJhSWRJbnQpIHsKKyAgICBpZiAoY2FtZXJhSWRJbnQgPCAwIHx8IGNhbWVyYUlkSW50ID49IHN0YXRpY19jYXN0PGludD4obU5vcm1hbERldmljZUlkcy5zaXplKCkpKSB7CisgICAgICAgIEFMT0dFKCIlczogaW5wdXQgaWQgJWQgaW52YWxpZDogdmFsaWQgcmFuZ2UgICgwLCAlenUpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkSW50LCBtTm9ybWFsRGV2aWNlSWRzLnNpemUoKSk7CisgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZ3t9OwogICAgIH0KLSAgICByZXR1cm4gaWQ7CisKKyAgICByZXR1cm4gbU5vcm1hbERldmljZUlkc1tjYW1lcmFJZEludF07Cit9CisKK1N0cmluZzggQ2FtZXJhU2VydmljZTo6Y2FtZXJhSWRJbnRUb1N0cihpbnQgY2FtZXJhSWRJbnQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOworICAgIHJldHVybiBTdHJpbmc4KGNhbWVyYUlkSW50VG9TdHJMb2NrZWQoY2FtZXJhSWRJbnQpLmNfc3RyKCkpOwogfQogCiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCwKQEAgLTYwMiw4ICs1ODAsOCBAQAogCiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6bWFrZUNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgY29uc3Qgc3A8SUludGVyZmFjZT4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmcxNiYgcGFja2FnZU5hbWUsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAotICAgICAgICBpbnQgZmFjaW5nLCBpbnQgY2xpZW50UGlkLCB1aWRfdCBjbGllbnRVaWQsIGludCBzZXJ2aWNlUGlkLCBib29sIGxlZ2FjeU1vZGUsCi0gICAgICAgIGludCBoYWxWZXJzaW9uLCBpbnQgZGV2aWNlVmVyc2lvbiwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsCisgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGludCBmYWNpbmcsIGludCBjbGllbnRQaWQsIHVpZF90IGNsaWVudFVpZCwgaW50IHNlcnZpY2VQaWQsCisgICAgICAgIGJvb2wgbGVnYWN5TW9kZSwgaW50IGhhbFZlcnNpb24sIGludCBkZXZpY2VWZXJzaW9uLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwKICAgICAgICAgLypvdXQqL3NwPEJhc2ljQ2xpZW50PiogY2xpZW50KSB7CiAKICAgICBpZiAoaGFsVmVyc2lvbiA8IDAgfHwgaGFsVmVyc2lvbiA9PSBkZXZpY2VWZXJzaW9uKSB7CkBAIC02MTMsOCArNTkxLDkgQEAKICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOgogICAgICAgICAgICAgaWYgKGVmZmVjdGl2ZUFwaUxldmVsID09IEFQSV8xKSB7ICAvLyBDYW1lcmExIEFQSSByb3V0ZQogICAgICAgICAgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+IHRtcCA9IHN0YXRpY19jYXN0PElDYW1lcmFDbGllbnQqPihjYW1lcmFDYi5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgKmNsaWVudCA9IG5ldyBDYW1lcmFDbGllbnQoY2FtZXJhU2VydmljZSwgdG1wLCBwYWNrYWdlTmFtZSwgY2FtZXJhSWRUb0ludChjYW1lcmFJZCksCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSwgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICAgICAgKmNsaWVudCA9IG5ldyBDYW1lcmFDbGllbnQoY2FtZXJhU2VydmljZSwgdG1wLCBwYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaTFDYW1lcmFJZCwgZmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldHBpZCgpLCBsZWdhY3lNb2RlKTsKICAgICAgICAgICAgIH0gZWxzZSB7IC8vIENhbWVyYTIgQVBJIHJvdXRlCiAgICAgICAgICAgICAgICAgQUxPR1coIkNhbWVyYSB1c2luZyBvbGQgSEFMIHZlcnNpb246ICVkIiwgZGV2aWNlVmVyc2lvbik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfREVQUkVDQVRFRF9IQUwsCkBAIC02MjksOCArNjA4LDEwIEBACiAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNDoKICAgICAgICAgICAgIGlmIChlZmZlY3RpdmVBcGlMZXZlbCA9PSBBUElfMSkgeyAvLyBDYW1lcmExIEFQSSByb3V0ZQogICAgICAgICAgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+IHRtcCA9IHN0YXRpY19jYXN0PElDYW1lcmFDbGllbnQqPihjYW1lcmFDYi5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgKmNsaWVudCA9IG5ldyBDYW1lcmEyQ2xpZW50KGNhbWVyYVNlcnZpY2UsIHRtcCwgcGFja2FnZU5hbWUsIGNhbWVyYUlkVG9JbnQoY2FtZXJhSWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgZmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwgc2VydmljZVBpZCwgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICAgICAgKmNsaWVudCA9IG5ldyBDYW1lcmEyQ2xpZW50KGNhbWVyYVNlcnZpY2UsIHRtcCwgcGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgYXBpMUNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VQaWQsIGxlZ2FjeU1vZGUpOwogICAgICAgICAgICAgfSBlbHNlIHsgLy8gQ2FtZXJhMiBBUEkgcm91dGUKICAgICAgICAgICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gdG1wID0KICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzKj4oY2FtZXJhQ2IuZ2V0KCkpOwpAQCAtNjUyLDggKzYzMyw5IEBACiAgICAgICAgICAgICBoYWxWZXJzaW9uID09IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wKSB7CiAgICAgICAgICAgICAvLyBPbmx5IHN1cHBvcnQgaGlnaGVyIEhBTCB2ZXJzaW9uIGRldmljZSBvcGVuZWQgYXMgSEFMMS4wIGRldmljZS4KICAgICAgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+IHRtcCA9IHN0YXRpY19jYXN0PElDYW1lcmFDbGllbnQqPihjYW1lcmFDYi5nZXQoKSk7Ci0gICAgICAgICAgICAqY2xpZW50ID0gbmV3IENhbWVyYUNsaWVudChjYW1lcmFTZXJ2aWNlLCB0bXAsIHBhY2thZ2VOYW1lLCBjYW1lcmFJZFRvSW50KGNhbWVyYUlkKSwKLSAgICAgICAgICAgICAgICAgICAgZmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwgc2VydmljZVBpZCwgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICAqY2xpZW50ID0gbmV3IENhbWVyYUNsaWVudChjYW1lcmFTZXJ2aWNlLCB0bXAsIHBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICBhcGkxQ2FtZXJhSWQsIGZhY2luZywgY2xpZW50UGlkLCBjbGllbnRVaWQsCisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VQaWQsIGxlZ2FjeU1vZGUpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gT3RoZXIgY29tYmluYXRpb25zIChlLmcuIEhBTDMueCBvcGVuIGFzIEhBTDIueCkgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0LgogICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY2FtZXJhIEhBTCB2ZXJzaW9uICV4OiBIQUwgJXggZGV2aWNlIGNhbiBvbmx5IGJlIgpAQCAtNzQ5LDcgKzczMSw4IEBACiAgICAgU3RhdHVzIHJldCA9IFN0YXR1czo6b2soKTsKICAgICBzcDxDbGllbnQ+IHRtcCA9IG51bGxwdHI7CiAgICAgaWYgKCEocmV0ID0gY29ubmVjdEhlbHBlcjxJQ2FtZXJhQ2xpZW50LENsaWVudD4oCi0gICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PntudWxscHRyfSwgaWQsIHN0YXRpY19jYXN0PGludD4oQ0FNRVJBX0hBTF9BUElfVkVSU0lPTl9VTlNQRUNJRklFRCksCisgICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PntudWxscHRyfSwgaWQsIGNhbWVyYUlkLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVEKSwKICAgICAgICAgICAgIGludGVybmFsUGFja2FnZU5hbWUsIHVpZCwgVVNFX0NBTExJTkdfUElELAogICAgICAgICAgICAgQVBJXzEsIC8qbGVnYWN5TW9kZSovIGZhbHNlLCAvKnNoaW1VcGRhdGVPbmx5Ki8gdHJ1ZSwKICAgICAgICAgICAgIC8qb3V0Ki8gdG1wKQpAQCAtOTIyLDYgKzkwNSwxNSBAQAogICAgICAgICAgICAgICAgIGNsaWVudE5hbWU4LnN0cmluZygpLCBjbGllbnRVaWQsIGNsaWVudFBpZCwgY2FtZXJhSWQuc3RyaW5nKCkpOwogICAgIH0KIAorICAgIC8vIE1ha2Ugc3VyZSB0aGUgVUlEIGlzIGluIGFuIGFjdGl2ZSBzdGF0ZSB0byB1c2UgdGhlIGNhbWVyYQorICAgIGlmICghbVVpZFBvbGljeS0+aXNVaWRBY3RpdmUoY2FsbGluZ1VpZCwgU3RyaW5nMTYoY2xpZW50TmFtZTgpKSkgeworICAgICAgICBBTE9HRSgiQWNjZXNzIERlbmlhbDogY2FuJ3QgdXNlIHRoZSBjYW1lcmEgZnJvbSBhbiBpZGxlIFVJRCBwaWQ9JWQsIHVpZD0lZCIsCisgICAgICAgICAgICBjbGllbnRQaWQsIGNsaWVudFVpZCk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0RJU0FCTEVELAorICAgICAgICAgICAgICAgICJDYWxsZXIgXCIlc1wiIChQSUQgJWQsIFVJRCAlZCkgY2Fubm90IG9wZW4gY2FtZXJhIFwiJXNcIiBmcm9tIGJhY2tncm91bmQiLAorICAgICAgICAgICAgICAgIGNsaWVudE5hbWU4LnN0cmluZygpLCBjbGllbnRVaWQsIGNsaWVudFBpZCwgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgIH0KKwogICAgIC8vIE9ubHkgdXNlIHBhc3NlZCBpbiBjbGllbnRQaWQgdG8gY2hlY2sgcGVybWlzc2lvbi4gVXNlIGNhbGxpbmcgUElEIGFzIHRoZSBjbGllbnQgUElEIHRoYXQncwogICAgIC8vIGNvbm5lY3RlZCB0byBjYW1lcmEgc2VydmljZSBkaXJlY3RseS4KICAgICBvcmlnaW5hbENsaWVudFBpZCA9IGNsaWVudFBpZDsKQEAgLTExOTMsNyArMTE4NSw3IEBACiAKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjpjb25uZWN0KAogICAgICAgICBjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAotICAgICAgICBpbnQgY2FtZXJhSWQsCisgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKICAgICAgICAgaW50IGNsaWVudFVpZCwKICAgICAgICAgaW50IGNsaWVudFBpZCwKQEAgLTEyMDIsOSArMTE5NCwxMCBAQAogCiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBTdGF0dXMgcmV0ID0gU3RhdHVzOjpvaygpOwotICAgIFN0cmluZzggaWQgPSBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgY2FtZXJhSWQpOworCisgICAgU3RyaW5nOCBpZCA9IGNhbWVyYUlkSW50VG9TdHIoYXBpMUNhbWVyYUlkKTsKICAgICBzcDxDbGllbnQ+IGNsaWVudCA9IG51bGxwdHI7Ci0gICAgcmV0ID0gY29ubmVjdEhlbHBlcjxJQ2FtZXJhQ2xpZW50LENsaWVudD4oY2FtZXJhQ2xpZW50LCBpZCwKKyAgICByZXQgPSBjb25uZWN0SGVscGVyPElDYW1lcmFDbGllbnQsQ2xpZW50PihjYW1lcmFDbGllbnQsIGlkLCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgICAgICBDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVELCBjbGllbnRQYWNrYWdlTmFtZSwgY2xpZW50VWlkLCBjbGllbnRQaWQsIEFQSV8xLAogICAgICAgICAgICAgLypsZWdhY3lNb2RlKi8gZmFsc2UsIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwKICAgICAgICAgICAgIC8qb3V0Ki9jbGllbnQpOwpAQCAtMTIyMSwxOCArMTIxNCwxOCBAQAogCiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6Y29ubmVjdExlZ2FjeSgKICAgICAgICAgY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKLSAgICAgICAgaW50IGNhbWVyYUlkLCBpbnQgaGFsVmVyc2lvbiwKKyAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwgaW50IGhhbFZlcnNpb24sCiAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKICAgICAgICAgaW50IGNsaWVudFVpZCwKICAgICAgICAgLypvdXQqLwogICAgICAgICBzcDxJQ2FtZXJhPiogZGV2aWNlKSB7CiAKICAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIFN0cmluZzggaWQgPSBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgY2FtZXJhSWQpOworICAgIFN0cmluZzggaWQgPSBjYW1lcmFJZEludFRvU3RyKGFwaTFDYW1lcmFJZCk7CiAKICAgICBTdGF0dXMgcmV0ID0gU3RhdHVzOjpvaygpOwogICAgIHNwPENsaWVudD4gY2xpZW50ID0gbnVsbHB0cjsKLSAgICByZXQgPSBjb25uZWN0SGVscGVyPElDYW1lcmFDbGllbnQsQ2xpZW50PihjYW1lcmFDbGllbnQsIGlkLCBoYWxWZXJzaW9uLAorICAgIHJldCA9IGNvbm5lY3RIZWxwZXI8SUNhbWVyYUNsaWVudCxDbGllbnQ+KGNhbWVyYUNsaWVudCwgaWQsIGFwaTFDYW1lcmFJZCwgaGFsVmVyc2lvbiwKICAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRVaWQsIFVTRV9DQUxMSU5HX1BJRCwgQVBJXzEsCiAgICAgICAgICAgICAvKmxlZ2FjeU1vZGUqLyB0cnVlLCAvKnNoaW1VcGRhdGVPbmx5Ki8gZmFsc2UsCiAgICAgICAgICAgICAvKm91dCovY2xpZW50KTsKQEAgLTEyNjAsNiArMTI1Myw3IEBACiAgICAgU3RyaW5nOCBpZCA9IFN0cmluZzgoY2FtZXJhSWQpOwogICAgIHNwPENhbWVyYURldmljZUNsaWVudD4gY2xpZW50ID0gbnVsbHB0cjsKICAgICByZXQgPSBjb25uZWN0SGVscGVyPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLENhbWVyYURldmljZUNsaWVudD4oY2FtZXJhQ2IsIGlkLAorICAgICAgICAgICAgLyphcGkxQ2FtZXJhSWQqLy0xLAogICAgICAgICAgICAgQ0FNRVJBX0hBTF9BUElfVkVSU0lPTl9VTlNQRUNJRklFRCwgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgICAgICBjbGllbnRVaWQsIFVTRV9DQUxMSU5HX1BJRCwgQVBJXzIsCiAgICAgICAgICAgICAvKmxlZ2FjeU1vZGUqLyBmYWxzZSwgLypzaGltVXBkYXRlT25seSovIGZhbHNlLApAQCAtMTI3Nyw4ICsxMjcxLDggQEAKIAogdGVtcGxhdGU8Y2xhc3MgQ0FMTEJBQ0ssIGNsYXNzIENMSUVOVD4KIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjpjb25uZWN0SGVscGVyKGNvbnN0IHNwPENBTExCQUNLPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAotICAgICAgICBpbnQgaGFsVmVyc2lvbiwgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLCBpbnQgY2xpZW50VWlkLCBpbnQgY2xpZW50UGlkLAotICAgICAgICBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgYm9vbCBsZWdhY3lNb2RlLCBib29sIHNoaW1VcGRhdGVPbmx5LAorICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBpbnQgaGFsVmVyc2lvbiwgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLCBpbnQgY2xpZW50VWlkLAorICAgICAgICBpbnQgY2xpZW50UGlkLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgYm9vbCBsZWdhY3lNb2RlLCBib29sIHNoaW1VcGRhdGVPbmx5LAogICAgICAgICAvKm91dCovc3A8Q0xJRU5UPiYgZGV2aWNlKSB7CiAgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAKQEAgLTEzNjEsOCArMTM1NSwxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgc3A8QmFzaWNDbGllbnQ+IHRtcCA9IG51bGxwdHI7Ci0gICAgICAgIGlmKCEocmV0ID0gbWFrZUNsaWVudCh0aGlzLCBjYW1lcmFDYiwgY2xpZW50UGFja2FnZU5hbWUsIGNhbWVyYUlkLCBmYWNpbmcsIGNsaWVudFBpZCwKLSAgICAgICAgICAgICAgICBjbGllbnRVaWQsIGdldHBpZCgpLCBsZWdhY3lNb2RlLCBoYWxWZXJzaW9uLCBkZXZpY2VWZXJzaW9uLCBlZmZlY3RpdmVBcGlMZXZlbCwKKyAgICAgICAgaWYoIShyZXQgPSBtYWtlQ2xpZW50KHRoaXMsIGNhbWVyYUNiLCBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICBjYW1lcmFJZCwgYXBpMUNhbWVyYUlkLCBmYWNpbmcsCisgICAgICAgICAgICAgICAgY2xpZW50UGlkLCBjbGllbnRVaWQsIGdldHBpZCgpLCBsZWdhY3lNb2RlLAorICAgICAgICAgICAgICAgIGhhbFZlcnNpb24sIGRldmljZVZlcnNpb24sIGVmZmVjdGl2ZUFwaUxldmVsLAogICAgICAgICAgICAgICAgIC8qb3V0Ki8mdG1wKSkuaXNPaygpKSB7CiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CkBAIC0xMzcxLDcgKzEzNjcsNyBAQAogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGNsaWVudC5nZXQoKSA9PSBudWxscHRyLCAiJXM6IENhbWVyYVNlcnZpY2UgaW4gaW52YWxpZCBzdGF0ZSIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKIAotICAgICAgICBlcnIgPSBjbGllbnQtPmluaXRpYWxpemUobUNhbWVyYVByb3ZpZGVyTWFuYWdlcik7CisgICAgICAgIGVyciA9IGNsaWVudC0+aW5pdGlhbGl6ZShtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLCBtTW9uaXRvclRhZ3MpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBpbml0aWFsaXplIGNsaWVudCBmcm9tIEhBTC4iLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICAgICAgLy8gRXJyb3JzIGNvdWxkIGJlIGZyb20gdGhlIEhBTCBtb2R1bGUgb3BlbiBjYWxsIG9yIGZyb20gQXBwT3BzTWFuYWdlcgpAQCAtMTU1Niw2ICsxNTUyLDkgQEAKIAogICAgIHN3aXRjaChldmVudElkKSB7CiAgICAgICAgIGNhc2UgSUNhbWVyYVNlcnZpY2U6OkVWRU5UX1VTRVJfU1dJVENIRUQ6IHsKKyAgICAgICAgICAgIC8vIFRyeSB0byByZWdpc3RlciBmb3IgVUlEIHBvbGljeSB1cGRhdGVzLCBpbiBjYXNlIHdlJ3JlIHJlY292ZXJpbmcKKyAgICAgICAgICAgIC8vIGZyb20gYSBzeXN0ZW0gc2VydmVyIGNyYXNoCisgICAgICAgICAgICBtVWlkUG9saWN5LT5yZWdpc3RlclNlbGYoKTsKICAgICAgICAgICAgIGRvVXNlclN3aXRjaCgvKm5ld1VzZXJJZHMqLyBhcmdzKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xNzQwLDggKzE3MzksNiBAQAogfQogCiBib29sIENhbWVyYVNlcnZpY2U6OmV2aWN0Q2xpZW50SWRCeVJlbW90ZShjb25zdCB3cDxJQmluZGVyPiYgcmVtb3RlKSB7Ci0gICAgY29uc3QgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7Ci0gICAgY29uc3QgaW50IHNlcnZpY2VQaWQgPSBnZXRwaWQoKTsKICAgICBib29sIHJldCA9IGZhbHNlOwogICAgIHsKICAgICAgICAgLy8gQWNxdWlyZSBtU2VydmljZUxvY2sgYW5kIHByZXZlbnQgb3RoZXIgY2xpZW50cyBmcm9tIGNvbm5lY3RpbmcKQEAgLTE3NTcsOCArMTc1NCw3IEBACiAgICAgICAgICAgICAgICAgbUFjdGl2ZUNsaWVudE1hbmFnZXIucmVtb3ZlKGkpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlbW90ZSA9PSBjbGllbnRTcC0+Z2V0UmVtb3RlKCkgJiYgKGNhbGxpbmdQaWQgPT0gc2VydmljZVBpZCB8fAotICAgICAgICAgICAgICAgICAgICBjYWxsaW5nUGlkID09IGNsaWVudFNwLT5nZXRDbGllbnRQaWQoKSkpIHsKKyAgICAgICAgICAgIGlmIChyZW1vdGUgPT0gY2xpZW50U3AtPmdldFJlbW90ZSgpKSB7CiAgICAgICAgICAgICAgICAgbUFjdGl2ZUNsaWVudE1hbmFnZXIucmVtb3ZlKGkpOwogICAgICAgICAgICAgICAgIGV2aWN0ZWQucHVzaF9iYWNrKGNsaWVudFNwKTsKIApAQCAtMTk1OCw2ICsxOTU0LDMwIEBACiAKICAgICAvLyBQZXJtaXNzaW9uIGNoZWNrcwogICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgICBjYXNlIFNIRUxMX0NPTU1BTkRfVFJBTlNBQ1RJT046IHsKKyAgICAgICAgICAgIGludCBpbiA9IGRhdGEucmVhZEZpbGVEZXNjcmlwdG9yKCk7CisgICAgICAgICAgICBpbnQgb3V0ID0gZGF0YS5yZWFkRmlsZURlc2NyaXB0b3IoKTsKKyAgICAgICAgICAgIGludCBlcnIgPSBkYXRhLnJlYWRGaWxlRGVzY3JpcHRvcigpOworICAgICAgICAgICAgaW50IGFyZ2MgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgVmVjdG9yPFN0cmluZzE2PiBhcmdzOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdjICYmIGRhdGEuZGF0YUF2YWlsKCkgPiAwOyBpKyspIHsKKyAgICAgICAgICAgICAgIGFyZ3MuYWRkKGRhdGEucmVhZFN0cmluZzE2KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8SUJpbmRlcj4gdW51c2VkQ2FsbGJhY2s7CisgICAgICAgICAgICBzcDxJUmVzdWx0UmVjZWl2ZXI+IHJlc3VsdFJlY2VpdmVyOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICAgICAgaWYgKChzdGF0dXMgPSBkYXRhLnJlYWROdWxsYWJsZVN0cm9uZ0JpbmRlcigmdW51c2VkQ2FsbGJhY2spKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHN0YXR1cyA9IGRhdGEucmVhZE51bGxhYmxlU3Ryb25nQmluZGVyKCZyZXN1bHRSZWNlaXZlcikpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IHNoZWxsQ29tbWFuZChpbiwgb3V0LCBlcnIsIGFyZ3MpOworICAgICAgICAgICAgaWYgKHJlc3VsdFJlY2VpdmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICByZXN1bHRSZWNlaXZlci0+c2VuZChzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CiAgICAgICAgIGNhc2UgQm5DYW1lcmFTZXJ2aWNlOjpOT1RJRllTWVNURU1FVkVOVDogewogICAgICAgICAgICAgaWYgKHBpZCAhPSBzZWxmUGlkKSB7CiAgICAgICAgICAgICAgICAgLy8gRW5zdXJlIHdlJ3JlIGJlaW5nIGNhbGxlZCBieSBzeXN0ZW1fc2VydmVyLCBvciBzaW1pbGFyIHByb2Nlc3Mgd2l0aApAQCAtMTk4MSwxNCArMjAwMSwxOCBAQAogLy8gQSByZWZlcmVuY2UgY291bnQgaXMga2VwdCB0byBkZXRlcm1pbmUgd2hlbiB3ZSB3aWxsIGFjdHVhbGx5IHJlbGVhc2UgdGhlCiAvLyBtZWRpYSBwbGF5ZXJzLgogCi1NZWRpYVBsYXllciogQ2FtZXJhU2VydmljZTo6bmV3TWVkaWFQbGF5ZXIoY29uc3QgY2hhciAqZmlsZSkgewotICAgIE1lZGlhUGxheWVyKiBtcCA9IG5ldyBNZWRpYVBsYXllcigpOwotICAgIGlmIChtcC0+c2V0RGF0YVNvdXJjZShOVUxMIC8qIGh0dHBTZXJ2aWNlICovLCBmaWxlLCBOVUxMKSA9PSBOT19FUlJPUikgeworc3A8TWVkaWFQbGF5ZXI+IENhbWVyYVNlcnZpY2U6Om5ld01lZGlhUGxheWVyKGNvbnN0IGNoYXIgKmZpbGUpIHsKKyAgICBzcDxNZWRpYVBsYXllcj4gbXAgPSBuZXcgTWVkaWFQbGF5ZXIoKTsKKyAgICBzdGF0dXNfdCBlcnJvcjsKKyAgICBpZiAoKGVycm9yID0gbXAtPnNldERhdGFTb3VyY2UoTlVMTCAvKiBodHRwU2VydmljZSAqLywgZmlsZSwgTlVMTCkpID09IE5PX0VSUk9SKSB7CiAgICAgICAgIG1wLT5zZXRBdWRpb1N0cmVhbVR5cGUoQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUpOwotICAgICAgICBtcC0+cHJlcGFyZSgpOwotICAgIH0gZWxzZSB7CisgICAgICAgIGVycm9yID0gbXAtPnByZXBhcmUoKTsKKyAgICB9CisgICAgaWYgKGVycm9yICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbG9hZCBDYW1lcmFTZXJ2aWNlIHNvdW5kczogJXMiLCBmaWxlKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIG1wLT5kaXNjb25uZWN0KCk7CisgICAgICAgIG1wLmNsZWFyKCk7CisgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KICAgICByZXR1cm4gbXA7CiB9CkBAIC0yMDAwLDkgKzIwMjQsMTkgQEAKICAgICBMT0cxKCJDYW1lcmFTZXJ2aWNlOjpsb2FkU291bmQgcmVmPSVkIiwgbVNvdW5kUmVmKTsKICAgICBpZiAobVNvdW5kUmVmKyspIHJldHVybjsKIAotICAgIG1Tb3VuZFBsYXllcltTT1VORF9TSFVUVEVSXSA9IG5ld01lZGlhUGxheWVyKCIvc3lzdGVtL21lZGlhL2F1ZGlvL3VpL2NhbWVyYV9jbGljay5vZ2ciKTsKLSAgICBtU291bmRQbGF5ZXJbU09VTkRfUkVDT1JESU5HX1NUQVJUXSA9IG5ld01lZGlhUGxheWVyKCIvc3lzdGVtL21lZGlhL2F1ZGlvL3VpL1ZpZGVvUmVjb3JkLm9nZyIpOwotICAgIG1Tb3VuZFBsYXllcltTT1VORF9SRUNPUkRJTkdfU1RPUF0gPSBuZXdNZWRpYVBsYXllcigiL3N5c3RlbS9tZWRpYS9hdWRpby91aS9WaWRlb1N0b3Aub2dnIik7CisgICAgbVNvdW5kUGxheWVyW1NPVU5EX1NIVVRURVJdID0gbmV3TWVkaWFQbGF5ZXIoIi9wcm9kdWN0L21lZGlhL2F1ZGlvL3VpL2NhbWVyYV9jbGljay5vZ2ciKTsKKyAgICBpZiAobVNvdW5kUGxheWVyW1NPVU5EX1NIVVRURVJdID09IG51bGxwdHIpIHsKKyAgICAgICAgbVNvdW5kUGxheWVyW1NPVU5EX1NIVVRURVJdID0gbmV3TWVkaWFQbGF5ZXIoIi9zeXN0ZW0vbWVkaWEvYXVkaW8vdWkvY2FtZXJhX2NsaWNrLm9nZyIpOworICAgIH0KKyAgICBtU291bmRQbGF5ZXJbU09VTkRfUkVDT1JESU5HX1NUQVJUXSA9IG5ld01lZGlhUGxheWVyKCIvcHJvZHVjdC9tZWRpYS9hdWRpby91aS9WaWRlb1JlY29yZC5vZ2ciKTsKKyAgICBpZiAobVNvdW5kUGxheWVyW1NPVU5EX1JFQ09SRElOR19TVEFSVF0gPT0gbnVsbHB0cikgeworICAgICAgICBtU291bmRQbGF5ZXJbU09VTkRfUkVDT1JESU5HX1NUQVJUXSA9CisgICAgICAgICAgICAgICAgbmV3TWVkaWFQbGF5ZXIoIi9zeXN0ZW0vbWVkaWEvYXVkaW8vdWkvVmlkZW9SZWNvcmQub2dnIik7CisgICAgfQorICAgIG1Tb3VuZFBsYXllcltTT1VORF9SRUNPUkRJTkdfU1RPUF0gPSBuZXdNZWRpYVBsYXllcigiL3Byb2R1Y3QvbWVkaWEvYXVkaW8vdWkvVmlkZW9TdG9wLm9nZyIpOworICAgIGlmIChtU291bmRQbGF5ZXJbU09VTkRfUkVDT1JESU5HX1NUT1BdID09IG51bGxwdHIpIHsKKyAgICAgICAgbVNvdW5kUGxheWVyW1NPVU5EX1JFQ09SRElOR19TVE9QXSA9IG5ld01lZGlhUGxheWVyKCIvc3lzdGVtL21lZGlhL2F1ZGlvL3VpL1ZpZGVvU3RvcC5vZ2ciKTsKKyAgICB9CiB9CiAKIHZvaWQgQ2FtZXJhU2VydmljZTo6cmVsZWFzZVNvdW5kKCkgewpAQCAtMjAzNSw3ICsyMDY5LDggQEAKIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6Q2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICBjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAogICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkU3RyLCBpbnQgY2FtZXJhRmFjaW5nLAorICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZFN0ciwKKyAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgaW50IGNsaWVudFBpZCwgdWlkX3QgY2xpZW50VWlkLAogICAgICAgICBpbnQgc2VydmljZVBpZCkgOgogICAgICAgICBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudChjYW1lcmFTZXJ2aWNlLApAQCAtMjA0NCw3ICsyMDc5LDcgQEAKICAgICAgICAgICAgICAgICBjYW1lcmFJZFN0ciwgY2FtZXJhRmFjaW5nLAogICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLAogICAgICAgICAgICAgICAgIHNlcnZpY2VQaWQpLAotICAgICAgICBtQ2FtZXJhSWQoQ2FtZXJhU2VydmljZTo6Y2FtZXJhSWRUb0ludChjYW1lcmFJZFN0cikpCisgICAgICAgIG1DYW1lcmFJZChhcGkxQ2FtZXJhSWQpCiB7CiAgICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgiQ2xpZW50OjpDbGllbnQgRSAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBtQ2FtZXJhSWQpOwpAQCAtMjE5MSw4ICsyMjI2LDggQEAKIAogICAgIG1BcHBPcHNNYW5hZ2VyLnN0YXJ0V2F0Y2hpbmdNb2RlKEFwcE9wc01hbmFnZXI6Ok9QX0NBTUVSQSwKICAgICAgICAgICAgIG1DbGllbnRQYWNrYWdlTmFtZSwgbU9wc0NhbGxiYWNrKTsKLSAgICByZXMgPSBtQXBwT3BzTWFuYWdlci5zdGFydE9wKEFwcE9wc01hbmFnZXI6Ok9QX0NBTUVSQSwKLSAgICAgICAgICAgIG1DbGllbnRVaWQsIG1DbGllbnRQYWNrYWdlTmFtZSk7CisgICAgcmVzID0gbUFwcE9wc01hbmFnZXIuc3RhcnRPcE5vVGhyb3coQXBwT3BzTWFuYWdlcjo6T1BfQ0FNRVJBLAorICAgICAgICAgICAgbUNsaWVudFVpZCwgbUNsaWVudFBhY2thZ2VOYW1lLCAvKnN0YXJ0SWZNb2RlRGVmYXVsdCovIGZhbHNlKTsKIAogICAgIGlmIChyZXMgPT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9FUlJPUkVEKSB7CiAgICAgICAgIEFMT0dJKCJDYW1lcmEgJXM6IEFjY2VzcyBmb3IgXCIlc1wiIGhhcyBiZWVuIHJldm9rZWQiLApAQCAtMjIxMiw5ICsyMjQ3LDEzIEBACiAgICAgLy8gVHJhbnNpdGlvbiBkZXZpY2UgYXZhaWxhYmlsaXR5IGxpc3RlbmVycyBmcm9tIFBSRVNFTlQgLT4gTk9UX0FWQUlMQUJMRQogICAgIHNDYW1lcmFTZXJ2aWNlLT51cGRhdGVTdGF0dXMoU3RhdHVzSW50ZXJuYWw6Ok5PVF9BVkFJTEFCTEUsIG1DYW1lcmFJZFN0cik7CiAKKyAgICBpbnQgYXBpTGV2ZWwgPSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX0FQSV9MRVZFTF8xOworICAgIGlmIChjYW5DYXN0VG9BcGlDbGllbnQoQVBJXzIpKSB7CisgICAgICAgIGFwaUxldmVsID0gaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9BUElfTEVWRUxfMjsKKyAgICB9CiAgICAgLy8gVHJhbnNpdGlvbiBkZXZpY2Ugc3RhdGUgdG8gT1BFTgogICAgIHNDYW1lcmFTZXJ2aWNlLT51cGRhdGVQcm94eURldmljZVN0YXRlKElDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9TVEFURV9PUEVOLAotICAgICAgICAgICAgbUNhbWVyYUlkU3RyLCBtQ2FtZXJhRmFjaW5nLCBtQ2xpZW50UGFja2FnZU5hbWUpOworICAgICAgICAgICAgbUNhbWVyYUlkU3RyLCBtQ2FtZXJhRmFjaW5nLCBtQ2xpZW50UGFja2FnZU5hbWUsIGFwaUxldmVsKTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTIyMjksMTYgKzIyNjgsMjMgQEAKICAgICAgICAgICAgICAgICBtQ2xpZW50UGFja2FnZU5hbWUpOwogICAgICAgICBtT3BzQWN0aXZlID0gZmFsc2U7CiAKKyAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIGNsaWVudCBkaXNjb25uZWN0cy4gVGhpcyBzaG91bGQKKyAgICAgICAgLy8gcmVsZWFzZSB0aGUgY2FtZXJhLCBidXQgYWN0dWFsbHkgb25seSBpZiBpdCB3YXMgaW4gYSBwcm9wZXIKKyAgICAgICAgLy8gZnVuY3Rpb25hbCBzdGF0ZSwgaS5lLiB3aXRoIHN0YXR1cyBOT1RfQVZBSUxBQkxFCiAgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxTdGF0dXNJbnRlcm5hbD4gcmVqZWN0ZWQgPSB7U3RhdHVzSW50ZXJuYWw6OlBSRVNFTlQsCi0gICAgICAgICAgICAgICAgU3RhdHVzSW50ZXJuYWw6OkVOVU1FUkFUSU5HfTsKKyAgICAgICAgICAgICAgICBTdGF0dXNJbnRlcm5hbDo6RU5VTUVSQVRJTkcsIFN0YXR1c0ludGVybmFsOjpOT1RfUFJFU0VOVH07CiAKICAgICAgICAgLy8gVHJhbnNpdGlvbiB0byBQUkVTRU5UIGlmIHRoZSBjYW1lcmEgaXMgbm90IGluIGVpdGhlciBvZiB0aGUgcmVqZWN0ZWQgc3RhdGVzCiAgICAgICAgIHNDYW1lcmFTZXJ2aWNlLT51cGRhdGVTdGF0dXMoU3RhdHVzSW50ZXJuYWw6OlBSRVNFTlQsCiAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLCByZWplY3RlZCk7CiAKKyAgICAgICAgaW50IGFwaUxldmVsID0gaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9BUElfTEVWRUxfMTsKKyAgICAgICAgaWYgKGNhbkNhc3RUb0FwaUNsaWVudChBUElfMikpIHsKKyAgICAgICAgICAgIGFwaUxldmVsID0gaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9BUElfTEVWRUxfMjsKKyAgICAgICAgfQogICAgICAgICAvLyBUcmFuc2l0aW9uIGRldmljZSBzdGF0ZSB0byBDTE9TRUQKICAgICAgICAgc0NhbWVyYVNlcnZpY2UtPnVwZGF0ZVByb3h5RGV2aWNlU3RhdGUoSUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX1NUQVRFX0NMT1NFRCwKLSAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIsIG1DYW1lcmFGYWNpbmcsIG1DbGllbnRQYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLCBtQ2FtZXJhRmFjaW5nLCBtQ2xpZW50UGFja2FnZU5hbWUsIGFwaUxldmVsKTsKICAgICB9CiAgICAgLy8gQWx3YXlzIHN0b3Agd2F0Y2hpbmcsIGV2ZW4gaWYgbm8gY2FtZXJhIG9wIGlzIGFjdGl2ZQogICAgIGlmIChtT3BzQ2FsbGJhY2sgIT0gTlVMTCkgewpAQCAtMjI3MiwxNSArMjMxOCwyMSBAQAogICAgIGlmIChyZXMgIT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9BTExPV0VEKSB7CiAgICAgICAgIEFMT0dJKCJDYW1lcmEgJXM6IEFjY2VzcyBmb3IgXCIlc1wiIHJldm9rZWQiLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksCiAgICAgICAgICAgICAgICAgbXlOYW1lLnN0cmluZygpKTsKLSAgICAgICAgLy8gUmVzZXQgdGhlIGNsaWVudCBQSUQgdG8gYWxsb3cgc2VydmVyLWluaXRpYXRlZCBkaXNjb25uZWN0LAotICAgICAgICAvLyBhbmQgdG8gcHJldmVudCBmdXJ0aGVyIGNhbGxzIGJ5IGNsaWVudC4KLSAgICAgICAgbUNsaWVudFBpZCA9IGdldENhbGxpbmdQaWQoKTsKLSAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXM7IC8vIGEgZHVtbXkgcmVzdWx0IChpbnZhbGlkKQotICAgICAgICBub3RpZnlFcnJvcihoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1NFUlZJQ0UsIHJlc3VsdEV4dHJhcyk7Ci0gICAgICAgIGRpc2Nvbm5lY3QoKTsKKyAgICAgICAgYmxvY2soKTsKICAgICB9CiB9CiAKK3ZvaWQgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ6OmJsb2NrKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICAvLyBSZXNldCB0aGUgY2xpZW50IFBJRCB0byBhbGxvdyBzZXJ2ZXItaW5pdGlhdGVkIGRpc2Nvbm5lY3QsCisgICAgLy8gYW5kIHRvIHByZXZlbnQgZnVydGhlciBjYWxscyBieSBjbGllbnQuCisgICAgbUNsaWVudFBpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhczsgLy8gYSBkdW1teSByZXN1bHQgKGludmFsaWQpCisgICAgbm90aWZ5RXJyb3IoaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ESVNBQkxFRCwgcmVzdWx0RXh0cmFzKTsKKyAgICBkaXNjb25uZWN0KCk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogdm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6Om5vdGlmeUVycm9yKGludDMyX3QgZXJyb3JDb2RlLApAQCAtMjMxNywxMiArMjM2OSwxMzkgQEAKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgICAgICAgICAgICBVaWRQb2xpY3kKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpVaWRQb2xpY3k6OnJlZ2lzdGVyU2VsZigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVVpZExvY2spOworCisgICAgQWN0aXZpdHlNYW5hZ2VyIGFtOworICAgIGlmIChtUmVnaXN0ZXJlZCkgcmV0dXJuOworICAgIGFtLnJlZ2lzdGVyVWlkT2JzZXJ2ZXIodGhpcywgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfR09ORQorICAgICAgICAgICAgfCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9JRExFCisgICAgICAgICAgICB8IEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX0FDVElWRSwKKyAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOLAorICAgICAgICAgICAgU3RyaW5nMTYoImNhbWVyYXNlcnZlciIpKTsKKyAgICBzdGF0dXNfdCByZXMgPSBhbS5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgIG1SZWdpc3RlcmVkID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoIlVpZFBvbGljeTogUmVnaXN0ZXJlZCB3aXRoIEFjdGl2aXR5TWFuYWdlciIpOworICAgIH0KK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpVaWRQb2xpY3k6OnVucmVnaXN0ZXJTZWxmKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtVWlkTG9jayk7CisKKyAgICBBY3Rpdml0eU1hbmFnZXIgYW07CisgICAgYW0udW5yZWdpc3RlclVpZE9ic2VydmVyKHRoaXMpOworICAgIGFtLnVubGlua1RvRGVhdGgodGhpcyk7CisgICAgbVJlZ2lzdGVyZWQgPSBmYWxzZTsKKyAgICBtQWN0aXZlVWlkcy5jbGVhcigpOworICAgIEFMT0dWKCJVaWRQb2xpY3k6IFVucmVnaXN0ZXJlZCB3aXRoIEFjdGl2aXR5TWFuYWdlciIpOworfQorCit2b2lkIENhbWVyYVNlcnZpY2U6OlVpZFBvbGljeTo6b25VaWRHb25lKHVpZF90IHVpZCwgYm9vbCBkaXNhYmxlZCkgeworICAgIG9uVWlkSWRsZSh1aWQsIGRpc2FibGVkKTsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpVaWRQb2xpY3k6Om9uVWlkQWN0aXZlKHVpZF90IHVpZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtVWlkTG9jayk7CisgICAgbUFjdGl2ZVVpZHMuaW5zZXJ0KHVpZCk7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6VWlkUG9saWN5OjpvblVpZElkbGUodWlkX3QgdWlkLCBib29sIC8qIGRpc2FibGVkICovKSB7CisgICAgYm9vbCBkZWxldGVkID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVVpZExvY2spOworICAgICAgICBpZiAobUFjdGl2ZVVpZHMuZXJhc2UodWlkKSA+IDApIHsKKyAgICAgICAgICAgIGRlbGV0ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIGlmIChkZWxldGVkKSB7CisgICAgICAgIHNwPENhbWVyYVNlcnZpY2U+IHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNlcnZpY2UtPmJsb2NrQ2xpZW50c0ZvclVpZCh1aWQpOworICAgICAgICB9CisgICAgfQorfQorCitib29sIENhbWVyYVNlcnZpY2U6OlVpZFBvbGljeTo6aXNVaWRBY3RpdmUodWlkX3QgdWlkLCBTdHJpbmcxNiBjYWxsaW5nUGFja2FnZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtVWlkTG9jayk7CisgICAgcmV0dXJuIGlzVWlkQWN0aXZlTG9ja2VkKHVpZCwgY2FsbGluZ1BhY2thZ2UpOworfQorCitib29sIENhbWVyYVNlcnZpY2U6OlVpZFBvbGljeTo6aXNVaWRBY3RpdmVMb2NrZWQodWlkX3QgdWlkLCBTdHJpbmcxNiBjYWxsaW5nUGFja2FnZSkgeworICAgIC8vIE5vbi1hcHAgVUlEcyBhcmUgY29uc2lkZXJlZCBhbHdheXMgYWN0aXZlCisgICAgLy8gSWYgYWN0aXZpdHkgbWFuYWdlciBpcyB1bnJlYWNoYWJsZSwgYXNzdW1lIGV2ZXJ5dGhpbmcgaXMgYWN0aXZlCisgICAgaWYgKHVpZCA8IEZJUlNUX0FQUExJQ0FUSU9OX1VJRCB8fCAhbVJlZ2lzdGVyZWQpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGF1dG8gaXQgPSBtT3ZlcnJpZGVVaWRzLmZpbmQodWlkKTsKKyAgICBpZiAoaXQgIT0gbU92ZXJyaWRlVWlkcy5lbmQoKSkgeworICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9CisgICAgYm9vbCBhY3RpdmUgPSBtQWN0aXZlVWlkcy5maW5kKHVpZCkgIT0gbUFjdGl2ZVVpZHMuZW5kKCk7CisgICAgaWYgKCFhY3RpdmUpIHsKKyAgICAgICAgLy8gV2Ugd2FudCBhY3RpdmUgVUlEcyB0byBhbHdheXMgYWNjZXNzIGNhbWVyYSB3aXRoIHRoZWlyIGZpcnN0IGF0dGVtcHQgc2luY2UKKyAgICAgICAgLy8gdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoZSBhcHAgaXMgcm9idXN0bHkgd3JpdHRlbiBhbmQgd291bGQgcmV0cnkgZ2V0dGluZworICAgICAgICAvLyB0aGUgY2FtZXJhIG9uIGZhaWx1cmUuIFRoZSBpbnZlcnNlIGNhc2UgaXMgbm90IGEgcHJvYmxlbSBhcyB3ZSB3b3VsZCB0YWtlCisgICAgICAgIC8vIGNhbWVyYSBhd2F5IHNvb24gb25jZSB3ZSBnZXQgdGhlIGNhbGxiYWNrIHRoYXQgdGhlIHVpZCBpcyBubyBsb25nZXIgYWN0aXZlLgorICAgICAgICBBY3Rpdml0eU1hbmFnZXIgYW07CisgICAgICAgIC8vIE9rYXkgdG8gYWNjZXNzIHdpdGggYSBsb2NrIGhlbGQgYXMgVUlEIGNoYW5nZXMgYXJlIGRpc3BhdGNoZWQgd2l0aG91dAorICAgICAgICAvLyBhIGxvY2sgYW5kIHdlIGFyZSBhIGhpZ2hlciBsZXZlbCBjb21wb25lbnQuCisgICAgICAgIGFjdGl2ZSA9IGFtLmlzVWlkQWN0aXZlKHVpZCwgY2FsbGluZ1BhY2thZ2UpOworICAgICAgICBpZiAoYWN0aXZlKSB7CisgICAgICAgICAgICAvLyBOb3cgdGhhdCB3ZSBmb3VuZCBvdXQgdGhlIFVJRCBpcyBhY3R1YWxseSBhY3RpdmUsIGNhY2hlIHRoYXQKKyAgICAgICAgICAgIG1BY3RpdmVVaWRzLmluc2VydCh1aWQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhY3RpdmU7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6VWlkUG9saWN5OjpVaWRQb2xpY3k6OmFkZE92ZXJyaWRlVWlkKHVpZF90IHVpZCwKKyAgICAgICAgU3RyaW5nMTYgY2FsbGluZ1BhY2thZ2UsIGJvb2wgYWN0aXZlKSB7CisgICAgdXBkYXRlT3ZlcnJpZGVVaWQodWlkLCBjYWxsaW5nUGFja2FnZSwgYWN0aXZlLCB0cnVlKTsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpVaWRQb2xpY3k6OnJlbW92ZU92ZXJyaWRlVWlkKHVpZF90IHVpZCwgU3RyaW5nMTYgY2FsbGluZ1BhY2thZ2UpIHsKKyAgICB1cGRhdGVPdmVycmlkZVVpZCh1aWQsIGNhbGxpbmdQYWNrYWdlLCBmYWxzZSwgZmFsc2UpOworfQorCit2b2lkIENhbWVyYVNlcnZpY2U6OlVpZFBvbGljeTo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgLyp3aG8qLykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtVWlkTG9jayk7CisgICAgQUxPR1YoIlVpZFBvbGljeTogQWN0aXZpdHlNYW5hZ2VyIGhhcyBkaWVkIik7CisgICAgbVJlZ2lzdGVyZWQgPSBmYWxzZTsKKyAgICBtQWN0aXZlVWlkcy5jbGVhcigpOworfQorCit2b2lkIENhbWVyYVNlcnZpY2U6OlVpZFBvbGljeTo6dXBkYXRlT3ZlcnJpZGVVaWQodWlkX3QgdWlkLCBTdHJpbmcxNiBjYWxsaW5nUGFja2FnZSwKKyAgICAgICAgYm9vbCBhY3RpdmUsIGJvb2wgaW5zZXJ0KSB7CisgICAgYm9vbCB3YXNBY3RpdmUgPSBmYWxzZTsKKyAgICBib29sIGlzQWN0aXZlID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVVpZExvY2spOworICAgICAgICB3YXNBY3RpdmUgPSBpc1VpZEFjdGl2ZUxvY2tlZCh1aWQsIGNhbGxpbmdQYWNrYWdlKTsKKyAgICAgICAgbU92ZXJyaWRlVWlkcy5lcmFzZSh1aWQpOworICAgICAgICBpZiAoaW5zZXJ0KSB7CisgICAgICAgICAgICBtT3ZlcnJpZGVVaWRzLmluc2VydChzdGQ6OnBhaXI8dWlkX3QsIGJvb2w+KHVpZCwgYWN0aXZlKSk7CisgICAgICAgIH0KKyAgICAgICAgaXNBY3RpdmUgPSBpc1VpZEFjdGl2ZUxvY2tlZCh1aWQsIGNhbGxpbmdQYWNrYWdlKTsKKyAgICB9CisgICAgaWYgKHdhc0FjdGl2ZSAhPSBpc0FjdGl2ZSAmJiAhaXNBY3RpdmUpIHsKKyAgICAgICAgc3A8Q2FtZXJhU2VydmljZT4gc2VydmljZSA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc2VydmljZS0+YmxvY2tDbGllbnRzRm9yVWlkKHVpZCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vICAgICAgICAgICAgICAgICAgQ2FtZXJhU3RhdGUKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQ2FtZXJhU2VydmljZTo6Q2FtZXJhU3RhdGU6OkNhbWVyYVN0YXRlKGNvbnN0IFN0cmluZzgmIGlkLCBpbnQgY29zdCwKICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8U3RyaW5nOD4mIGNvbmZsaWN0aW5nKSA6IG1JZChpZCksCi0gICAgICAgIG1TdGF0dXMoU3RhdHVzSW50ZXJuYWw6OlBSRVNFTlQpLCBtQ29zdChjb3N0KSwgbUNvbmZsaWN0aW5nKGNvbmZsaWN0aW5nKSB7fQorICAgICAgICBtU3RhdHVzKFN0YXR1c0ludGVybmFsOjpOT1RfUFJFU0VOVCksIG1Db3N0KGNvc3QpLCBtQ29uZmxpY3RpbmcoY29uZmxpY3RpbmcpIHt9CiAKIENhbWVyYVNlcnZpY2U6OkNhbWVyYVN0YXRlOjp+Q2FtZXJhU3RhdGUoKSB7fQogCkBAIC0yNDk4LDcgKzI2NzcsMTAgQEAKICAgICB9CiAgICAgZHByaW50ZihmZCwgIlxuPT0gU2VydmljZSBnbG9iYWwgaW5mbzogPT1cblxuIik7CiAgICAgZHByaW50ZihmZCwgIk51bWJlciBvZiBjYW1lcmEgZGV2aWNlczogJWRcbiIsIG1OdW1iZXJPZkNhbWVyYXMpOwotICAgIGRwcmludGYoZmQsICJOdW1iZXIgb2Ygbm9ybWFsIGNhbWVyYSBkZXZpY2VzOiAlZFxuIiwgbU51bWJlck9mTm9ybWFsQ2FtZXJhcyk7CisgICAgZHByaW50ZihmZCwgIk51bWJlciBvZiBub3JtYWwgY2FtZXJhIGRldmljZXM6ICV6dVxuIiwgbU5vcm1hbERldmljZUlkcy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU5vcm1hbERldmljZUlkcy5zaXplKCk7IGkrKykgeworICAgICAgICBkcHJpbnRmKGZkLCAiICAgIERldmljZSAlenUgbWFwcyB0byBcIiVzXCJcbiIsIGksIG1Ob3JtYWxEZXZpY2VJZHNbaV0uY19zdHIoKSk7CisgICAgfQogICAgIFN0cmluZzggYWN0aXZlQ2xpZW50U3RyaW5nID0gbUFjdGl2ZUNsaWVudE1hbmFnZXIudG9TdHJpbmcoKTsKICAgICBkcHJpbnRmKGZkLCAiQWN0aXZlIENhbWVyYSBDbGllbnRzOlxuJXMiLCBhY3RpdmVDbGllbnRTdHJpbmcuc3RyaW5nKCkpOwogICAgIGRwcmludGYoZmQsICJBbGxvd2VkIHVzZXIgSURzOiAlc1xuIiwgdG9TdHJpbmcobUFsbG93ZWRVc2Vycykuc3RyaW5nKCkpOwpAQCAtMjUxMCw2ICsyNjkyLDE2IEBACiAgICAgICAgIGRwcmludGYoZmQsICJDYW1lcmFTdGF0ZXMgaW4gdXNlLCBtYXkgYmUgZGVhZGxvY2tlZFxuIik7CiAgICAgfQogCisgICAgaW50IGFyZ1NpemUgPSBhcmdzLnNpemUoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ1NpemU7IGkrKykgeworICAgICAgICBpZiAoYXJnc1tpXSA9PSBUYWdNb25pdG9yOjprTW9uaXRvck9wdGlvbikgeworICAgICAgICAgICAgaWYgKGkgKyAxIDwgYXJnU2l6ZSkgeworICAgICAgICAgICAgICAgIG1Nb25pdG9yVGFncyA9IFN0cmluZzgoYXJnc1tpICsgMV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKICAgICBmb3IgKGF1dG8mIHN0YXRlIDogbUNhbWVyYVN0YXRlcykgewogICAgICAgICBTdHJpbmc4IGNhbWVyYUlkID0gc3RhdGUuZmlyc3Q7CiAKQEAgLTI2MzcsNyArMjgyOSw3IEBACiAgICAgICAqIFdoaWxlIHRlbXB0aW5nIHRvIHByb21vdGUgdGhlIHdwPElCaW5kZXI+IGludG8gYSBzcCwgaXQncyBhY3R1YWxseSBub3Qgc3VwcG9ydGVkIGJ5IHRoZQogICAgICAgKiBiaW5kZXIgZHJpdmVyCiAgICAgICAqLwotCisgICAgLy8gUElEIGhlcmUgaXMgYXBwcm94aW1hdGUgYW5kIGNhbiBiZSB3cm9uZy4KICAgICBsb2dDbGllbnREaWVkKGdldENhbGxpbmdQaWQoKSwgU3RyaW5nOCgiQmluZGVyIGRpZWQgdW5leHBlY3RlZGx5IikpOwogCiAgICAgLy8gY2hlY2sgdG9yY2ggY2xpZW50CkBAIC0yNzQzLDExICsyOTM1LDExIEBACiB9CiAKIHZvaWQgQ2FtZXJhU2VydmljZTo6dXBkYXRlUHJveHlEZXZpY2VTdGF0ZShpbnQgbmV3U3RhdGUsCi0gICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBpbnQgZmFjaW5nLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50TmFtZSkgeworICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgaW50IGZhY2luZywgY29uc3QgU3RyaW5nMTYmIGNsaWVudE5hbWUsIGludCBhcGlMZXZlbCkgewogICAgIHNwPElDYW1lcmFTZXJ2aWNlUHJveHk+IHByb3h5QmluZGVyID0gZ2V0Q2FtZXJhU2VydmljZVByb3h5KCk7CiAgICAgaWYgKHByb3h5QmluZGVyID09IG51bGxwdHIpIHJldHVybjsKICAgICBTdHJpbmcxNiBpZChjYW1lcmFJZCk7Ci0gICAgcHJveHlCaW5kZXItPm5vdGlmeUNhbWVyYVN0YXRlKGlkLCBuZXdTdGF0ZSwgZmFjaW5nLCBjbGllbnROYW1lKTsKKyAgICBwcm94eUJpbmRlci0+bm90aWZ5Q2FtZXJhU3RhdGUoaWQsIG5ld1N0YXRlLCBmYWNpbmcsIGNsaWVudE5hbWUsIGFwaUxldmVsKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Z2V0VG9yY2hTdGF0dXNMb2NrZWQoCkBAIC0yNzc3LDQgKzI5NjksOTIgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3ZvaWQgQ2FtZXJhU2VydmljZTo6YmxvY2tDbGllbnRzRm9yVWlkKHVpZF90IHVpZCkgeworICAgIGNvbnN0IGF1dG8gY2xpZW50cyA9IG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldEFsbCgpOworICAgIGZvciAoYXV0byYgY3VycmVudCA6IGNsaWVudHMpIHsKKyAgICAgICAgaWYgKGN1cnJlbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY29uc3QgYXV0byBiYXNpY0NsaWVudCA9IGN1cnJlbnQtPmdldFZhbHVlKCk7CisgICAgICAgICAgICBpZiAoYmFzaWNDbGllbnQuZ2V0KCkgIT0gbnVsbHB0ciAmJiBiYXNpY0NsaWVudC0+Z2V0Q2xpZW50VWlkKCkgPT0gdWlkKSB7CisgICAgICAgICAgICAgICAgYmFzaWNDbGllbnQtPmJsb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIE5PVEU6IFRoaXMgaXMgYSByZW1vdGUgQVBJIC0gbWFrZSBzdXJlIGFsbCBhcmdzIGFyZSB2YWxpZGF0ZWQKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OnNoZWxsQ29tbWFuZChpbnQgaW4sIGludCBvdXQsIGludCBlcnIsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKKyAgICBpZiAoIWNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc01hbmFnZUNhbWVyYVBlcm1pc3Npb24sIG51bGxwdHIsIG51bGxwdHIpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKGluID09IEJBRF9UWVBFIHx8IG91dCA9PSBCQURfVFlQRSB8fCBlcnIgPT0gQkFEX1RZUEUpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKGFyZ3Muc2l6ZSgpID09IDMgJiYgYXJnc1swXSA9PSBTdHJpbmcxNigic2V0LXVpZC1zdGF0ZSIpKSB7CisgICAgICAgIHJldHVybiBoYW5kbGVTZXRVaWRTdGF0ZShhcmdzLCBlcnIpOworICAgIH0gZWxzZSBpZiAoYXJncy5zaXplKCkgPT0gMiAmJiBhcmdzWzBdID09IFN0cmluZzE2KCJyZXNldC11aWQtc3RhdGUiKSkgeworICAgICAgICByZXR1cm4gaGFuZGxlUmVzZXRVaWRTdGF0ZShhcmdzLCBlcnIpOworICAgIH0gZWxzZSBpZiAoYXJncy5zaXplKCkgPT0gMiAmJiBhcmdzWzBdID09IFN0cmluZzE2KCJnZXQtdWlkLXN0YXRlIikpIHsKKyAgICAgICAgcmV0dXJuIGhhbmRsZUdldFVpZFN0YXRlKGFyZ3MsIG91dCwgZXJyKTsKKyAgICB9IGVsc2UgaWYgKGFyZ3Muc2l6ZSgpID09IDEgJiYgYXJnc1swXSA9PSBTdHJpbmcxNigiaGVscCIpKSB7CisgICAgICAgIHByaW50SGVscChvdXQpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIHByaW50SGVscChlcnIpOworICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OmhhbmRsZVNldFVpZFN0YXRlKGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MsIGludCBlcnIpIHsKKyAgICBQZXJtaXNzaW9uQ29udHJvbGxlciBwYzsKKyAgICBpbnQgdWlkID0gcGMuZ2V0UGFja2FnZVVpZChhcmdzWzFdLCAwKTsKKyAgICBpZiAodWlkIDw9IDApIHsKKyAgICAgICAgQUxPR0UoIlVua25vd24gcGFja2FnZTogJyVzJyIsIFN0cmluZzgoYXJnc1sxXSkuc3RyaW5nKCkpOworICAgICAgICBkcHJpbnRmKGVyciwgIlVua25vd24gcGFja2FnZTogJyVzJ1xuIiwgU3RyaW5nOChhcmdzWzFdKS5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGJvb2wgYWN0aXZlID0gZmFsc2U7CisgICAgaWYgKGFyZ3NbMl0gPT0gU3RyaW5nMTYoImFjdGl2ZSIpKSB7CisgICAgICAgIGFjdGl2ZSA9IHRydWU7CisgICAgfSBlbHNlIGlmICgoYXJnc1syXSAhPSBTdHJpbmcxNigiaWRsZSIpKSkgeworICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgYWN0aXZlIG9yIGlkbGUgYnV0IGdvdDogJyVzJyIsIFN0cmluZzgoYXJnc1syXSkuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBtVWlkUG9saWN5LT5hZGRPdmVycmlkZVVpZCh1aWQsIGFyZ3NbMV0sIGFjdGl2ZSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpoYW5kbGVSZXNldFVpZFN0YXRlKGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MsIGludCBlcnIpIHsKKyAgICBQZXJtaXNzaW9uQ29udHJvbGxlciBwYzsKKyAgICBpbnQgdWlkID0gcGMuZ2V0UGFja2FnZVVpZChhcmdzWzFdLCAwKTsKKyAgICBpZiAodWlkIDwgMCkgeworICAgICAgICBBTE9HRSgiVW5rbm93biBwYWNrYWdlOiAnJXMnIiwgU3RyaW5nOChhcmdzWzFdKS5zdHJpbmcoKSk7CisgICAgICAgIGRwcmludGYoZXJyLCAiVW5rbm93biBwYWNrYWdlOiAnJXMnXG4iLCBTdHJpbmc4KGFyZ3NbMV0pLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbVVpZFBvbGljeS0+cmVtb3ZlT3ZlcnJpZGVVaWQodWlkLCBhcmdzWzFdKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OmhhbmRsZUdldFVpZFN0YXRlKGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MsIGludCBvdXQsIGludCBlcnIpIHsKKyAgICBQZXJtaXNzaW9uQ29udHJvbGxlciBwYzsKKyAgICBpbnQgdWlkID0gcGMuZ2V0UGFja2FnZVVpZChhcmdzWzFdLCAwKTsKKyAgICBpZiAodWlkIDw9IDApIHsKKyAgICAgICAgQUxPR0UoIlVua25vd24gcGFja2FnZTogJyVzJyIsIFN0cmluZzgoYXJnc1sxXSkuc3RyaW5nKCkpOworICAgICAgICBkcHJpbnRmKGVyciwgIlVua25vd24gcGFja2FnZTogJyVzJ1xuIiwgU3RyaW5nOChhcmdzWzFdKS5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChtVWlkUG9saWN5LT5pc1VpZEFjdGl2ZSh1aWQsIGFyZ3NbMV0pKSB7CisgICAgICAgIHJldHVybiBkcHJpbnRmKG91dCwgImFjdGl2ZVxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGRwcmludGYob3V0LCAiaWRsZVxuIik7CisgICAgfQorfQorCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpwcmludEhlbHAoaW50IG91dCkgeworICAgIHJldHVybiBkcHJpbnRmKG91dCwgIkNhbWVyYSBzZXJ2aWNlIGNvbW1hbmRzOlxuIgorICAgICAgICAiICBnZXQtdWlkLXN0YXRlIDxQQUNLQUdFPiBnZXRzIHRoZSB1aWQgc3RhdGVcbiIKKyAgICAgICAgIiAgc2V0LXVpZC1zdGF0ZSA8UEFDS0FHRT4gPGFjdGl2ZXxpZGxlPiBvdmVycmlkZXMgdGhlIHVpZCBzdGF0ZVxuIgorICAgICAgICAiICByZXNldC11aWQtc3RhdGUgPFBBQ0tBR0U+IGNsZWFycyB0aGUgdWlkIHN0YXRlIG92ZXJyaWRlXG4iCisgICAgICAgICIgIGhlbHAgcHJpbnQgdGhpcyBtZXNzYWdlXG4iKTsKK30KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaAppbmRleCA2ZDVkZGU4Li44ZDRiY2RiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8YmluZGVyL0FwcE9wc01hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JQXBwT3BzQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVVpZE9ic2VydmVyLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhLmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9jb21tb24vMS4wL3R5cGVzLmg+CkBAIC00Nyw2ICs0OCw4IEBACiAjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC01OSw3ICs2Miw2IEBACiAgICAgcHVibGljIEJpbmRlclNlcnZpY2U8Q2FtZXJhU2VydmljZT4sCiAgICAgcHVibGljIHZpcnR1YWwgOjphbmRyb2lkOjpoYXJkd2FyZTo6Qm5DYW1lcmFTZXJ2aWNlLAogICAgIHB1YmxpYyB2aXJ0dWFsIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50LAotICAgIHB1YmxpYyBjYW1lcmFfbW9kdWxlX2NhbGxiYWNrc190LAogICAgIHB1YmxpYyB2aXJ0dWFsIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6U3RhdHVzTGlzdGVuZXIKIHsKICAgICBmcmllbmQgY2xhc3MgQmluZGVyU2VydmljZTxDYW1lcmFTZXJ2aWNlPjsKQEAgLTE2Myw2ICsxNjUsOCBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNoZWxsQ29tbWFuZChpbnQgaW4sIGludCBvdXQsIGludCBlcnIsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgLy8gQ2xpZW50IGZ1bmN0aW9uYWxpdHkKIApAQCAtMTg1LDcgKzE4OSw4IEBACiAgICAgICAgICAgICBpbnQgbmV3U3RhdGUsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgICAgIGludCBmYWNpbmcsCi0gICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50TmFtZSk7CisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50TmFtZSwKKyAgICAgICAgICAgIGludCBhcGlMZXZlbCk7CiAKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAvLyBDYW1lcmFEZXZpY2VGYWN0b3J5IGZ1bmN0aW9uYWxpdHkKQEAgLTIwMCw3ICsyMDUsOCBAQAogCiAgICAgY2xhc3MgQmFzaWNDbGllbnQgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgaW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIpID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICBpbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlciwKKyAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncykgPSAwOwogICAgICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIGRpc2Nvbm5lY3QoKTsKIAogICAgICAgICAvLyBiZWNhdXNlIHdlIGNhbid0IHZpcnR1YWxseSBpbmhlcml0IElJbnRlcmZhY2UsIHdoaWNoIGJyZWFrcwpAQCAtMjMzLDYgKzIzOSw5IEBACiAgICAgICAgIC8vIENoZWNrIHdoYXQgQVBJIGxldmVsIGlzIHVzZWQgZm9yIHRoaXMgY2xpZW50LiBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoCiAgICAgICAgIC8vIHN1cGVyY2xhc3MgdGhpcyBjYW4gYmUgY2FzdCB0by4KICAgICAgICAgdmlydHVhbCBib29sIGNhbkNhc3RUb0FwaUNsaWVudChhcGlMZXZlbCBsZXZlbCkgY29uc3Q7CisKKyAgICAgICAgLy8gQmxvY2sgdGhlIGNsaWVudCBmb3JtIHVzaW5nIHRoZSBjYW1lcmEKKyAgICAgICAgdmlydHVhbCB2b2lkIGJsb2NrKCk7CiAgICAgcHJvdGVjdGVkOgogICAgICAgICBCYXNpY0NsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgcmVtb3RlQ2FsbGJhY2ssCkBAIC0zMjUsNiArMzM0LDcgQEAKICAgICAgICAgICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWRTdHIsCisgICAgICAgICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwKICAgICAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICAgICAgICAgIGludCBjbGllbnRQaWQsCiAgICAgICAgICAgICAgICAgdWlkX3QgY2xpZW50VWlkLApAQCAtNTA2LDEyICs1MTYsNTEgQEAKICAgICAgICAgQ2FtZXJhUGFyYW1ldGVycyBtU2hpbVBhcmFtczsKICAgICB9OyAvLyBjbGFzcyBDYW1lcmFTdGF0ZQogCisgICAgLy8gT2JzZXJ2ZXIgZm9yIFVJRCBsaWZlY3ljbGUgZW5mb3JjaW5nIHRoYXQgVUlEcyBpbiBpZGxlCisgICAgLy8gc3RhdGUgY2Fubm90IHVzZSB0aGUgY2FtZXJhIHRvIHByb3RlY3QgdXNlciBwcml2YWN5LgorICAgIGNsYXNzIFVpZFBvbGljeSA6IHB1YmxpYyBCblVpZE9ic2VydmVyLCBwdWJsaWMgdmlydHVhbCBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBVaWRQb2xpY3koc3A8Q2FtZXJhU2VydmljZT4gc2VydmljZSkKKyAgICAgICAgICAgICAgICA6IG1SZWdpc3RlcmVkKGZhbHNlKSwgbVNlcnZpY2Uoc2VydmljZSkge30KKworICAgICAgICB2b2lkIHJlZ2lzdGVyU2VsZigpOworICAgICAgICB2b2lkIHVucmVnaXN0ZXJTZWxmKCk7CisKKyAgICAgICAgYm9vbCBpc1VpZEFjdGl2ZSh1aWRfdCB1aWQsIFN0cmluZzE2IGNhbGxpbmdQYWNrYWdlKTsKKworICAgICAgICB2b2lkIG9uVWlkR29uZSh1aWRfdCB1aWQsIGJvb2wgZGlzYWJsZWQpOworICAgICAgICB2b2lkIG9uVWlkQWN0aXZlKHVpZF90IHVpZCk7CisgICAgICAgIHZvaWQgb25VaWRJZGxlKHVpZF90IHVpZCwgYm9vbCBkaXNhYmxlZCk7CisKKyAgICAgICAgdm9pZCBhZGRPdmVycmlkZVVpZCh1aWRfdCB1aWQsIFN0cmluZzE2IGNhbGxpbmdQYWNrYWdlLCBib29sIGFjdGl2ZSk7CisgICAgICAgIHZvaWQgcmVtb3ZlT3ZlcnJpZGVVaWQodWlkX3QgdWlkLCBTdHJpbmcxNiBjYWxsaW5nUGFja2FnZSk7CisKKyAgICAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgaW1wbGVtZW50YXRpb24KKyAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJndobyk7CisgICAgcHJpdmF0ZToKKyAgICAgICAgYm9vbCBpc1VpZEFjdGl2ZUxvY2tlZCh1aWRfdCB1aWQsIFN0cmluZzE2IGNhbGxpbmdQYWNrYWdlKTsKKyAgICAgICAgdm9pZCB1cGRhdGVPdmVycmlkZVVpZCh1aWRfdCB1aWQsIFN0cmluZzE2IGNhbGxpbmdQYWNrYWdlLCBib29sIGFjdGl2ZSwgYm9vbCBpbnNlcnQpOworCisgICAgICAgIE11dGV4IG1VaWRMb2NrOworICAgICAgICBib29sIG1SZWdpc3RlcmVkOworICAgICAgICB3cDxDYW1lcmFTZXJ2aWNlPiBtU2VydmljZTsKKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVpZF90PiBtQWN0aXZlVWlkczsKKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBib29sPiBtT3ZlcnJpZGVVaWRzOworICAgIH07IC8vIGNsYXNzIFVpZFBvbGljeQorCisgICAgc3A8VWlkUG9saWN5PiBtVWlkUG9saWN5OworCiAgICAgLy8gRGVsYXktbG9hZCB0aGUgQ2FtZXJhIEhBTCBtb2R1bGUKICAgICB2aXJ0dWFsIHZvaWQgb25GaXJzdFJlZigpOwogCiAgICAgLy8gRXVtZXJhdGUgYWxsIGNhbWVyYSBwcm92aWRlcnMgaW4gdGhlIHN5c3RlbQogICAgIHN0YXR1c190IGVudW1lcmF0ZVByb3ZpZGVycygpOwogCisgICAgLy8gQWRkL3JlbW92ZSBhIG5ldyBjYW1lcmEgdG8gY2FtZXJhIGFuZCB0b3JjaCBzdGF0ZSBsaXN0cyBvciByZW1vdmUgYW4gdW5wbHVnZ2VkIG9uZQorICAgIC8vIENhbGxlciBtdXN0IG5vdCBob2xkIG1TZXJ2aWNlTG9jaworICAgIHZvaWQgYWRkU3RhdGVzKGNvbnN0IFN0cmluZzggaWQpOworICAgIHZvaWQgcmVtb3ZlU3RhdGVzKGNvbnN0IFN0cmluZzggaWQpOworCiAgICAgLy8gQ2hlY2sgaWYgd2UgY2FuIGNvbm5lY3QsIGJlZm9yZSB3ZSBhY3F1aXJlIHRoZSBzZXJ2aWNlIGxvY2suCiAgICAgLy8gVGhlIHJldHVybmVkIG9yaWdpbmFsQ2xpZW50UGlkIGlzIHRoZSBQSUQgb2YgdGhlIG9yaWdpbmFsIHByb2Nlc3MgdGhhdCB3YW50cyB0byBjb25uZWN0IHRvCiAgICAgLy8gY2FtZXJhLgpAQCAtNTM1LDcgKzU4NCw3IEBACiAgICAgLy8gU2luZ2xlIGltcGxlbWVudGF0aW9uIHNoYXJlZCBiZXR3ZWVuIHRoZSB2YXJpb3VzIGNvbm5lY3QgY2FsbHMKICAgICB0ZW1wbGF0ZTxjbGFzcyBDQUxMQkFDSywgY2xhc3MgQ0xJRU5UPgogICAgIGJpbmRlcjo6U3RhdHVzIGNvbm5lY3RIZWxwZXIoY29uc3Qgc3A8Q0FMTEJBQ0s+JiBjYW1lcmFDYiwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCi0gICAgICAgICAgICBpbnQgaGFsVmVyc2lvbiwgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwgaW50IGhhbFZlcnNpb24sIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKICAgICAgICAgICAgIGludCBjbGllbnRVaWQsIGludCBjbGllbnRQaWQsCiAgICAgICAgICAgICBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgYm9vbCBsZWdhY3lNb2RlLCBib29sIHNoaW1VcGRhdGVPbmx5LAogICAgICAgICAgICAgLypvdXQqL3NwPENMSUVOVD4mIGRldmljZSk7CkBAIC01NjIsNiArNjExLDkgQEAKICAgICBSaW5nQnVmZmVyPFN0cmluZzg+IG1FdmVudExvZzsKICAgICBNdXRleCBtTG9nTG9jazsKIAorICAgIC8vIFRoZSBsYXN0IG1vbml0b3JlZCB0YWdzIHNldCBieSBjbGllbnQKKyAgICBTdHJpbmc4IG1Nb25pdG9yVGFnczsKKwogICAgIC8vIEN1cnJlbnRseSBhbGxvd2VkIHVzZXIgSURzCiAgICAgc3RkOjpzZXQ8dXNlcmlkX3Q+IG1BbGxvd2VkVXNlcnM7CiAKQEAgLTU5Nyw5ICs2NDksMTYgQEAKICAgICB2b2lkIGZpbmlzaENvbm5lY3RMb2NrZWQoY29uc3Qgc3A8QmFzaWNDbGllbnQ+JiBjbGllbnQsIGNvbnN0IERlc2NyaXB0b3JQdHImIGRlc2MpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW50ZWdlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBjYW1lcmEgSUQgc3RyaW5nLCBvciAtMSBvbiBmYWlsdXJlLgorICAgICAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgY2FtZXJhIElkIHN0cmluZyBtYXBwZWQgdG8gYSBjYW1lcmEgaWQgaW50CisgICAgICogRW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIHdoZW4gdGhlIGNhbWVyYUlkSW50IGlzIGludmFsaWQuCiAgICAgICovCi0gICAgc3RhdGljIGludCBjYW1lcmFJZFRvSW50KGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKTsKKyAgICBTdHJpbmc4IGNhbWVyYUlkSW50VG9TdHIoaW50IGNhbWVyYUlkSW50KTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgY2FtZXJhIElkIHN0cmluZyBtYXBwZWQgdG8gYSBjYW1lcmEgaWQgaW50CisgICAgICogRW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIHdoZW4gdGhlIGNhbWVyYUlkSW50IGlzIGludmFsaWQuCisgICAgICovCisgICAgc3RkOjpzdHJpbmcgY2FtZXJhSWRJbnRUb1N0ckxvY2tlZChpbnQgY2FtZXJhSWRJbnQpOwogCiAgICAgLyoqCiAgICAgICogUmVtb3ZlIGEgc2luZ2xlIGNsaWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBjYW1lcmEgaWQgZnJvbSB0aGUgbGlzdCBvZiBhY3RpdmUgY2xpZW50cy4KQEAgLTY2NywxMSArNzI2LDE3IEBACiAgICAgICovCiAgICAgdm9pZCBkdW1wRXZlbnRMb2coaW50IGZkKTsKIAorICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYWNxdWlyZSBtU2VydmljZUxvY2sKKyAgICAgKi8KKyAgICB2b2lkIHVwZGF0ZUNhbWVyYU51bUFuZElkcygpOworCiAgICAgaW50ICAgICAgICAgICAgICAgICBtTnVtYmVyT2ZDYW1lcmFzOwotICAgIGludCAgICAgICAgICAgICAgICAgbU51bWJlck9mTm9ybWFsQ2FtZXJhczsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtTm9ybWFsRGV2aWNlSWRzOwogCiAgICAgLy8gc291bmRzCi0gICAgTWVkaWFQbGF5ZXIqICAgICAgICBuZXdNZWRpYVBsYXllcihjb25zdCBjaGFyICpmaWxlKTsKKyAgICBzcDxNZWRpYVBsYXllcj4gICAgIG5ld01lZGlhUGxheWVyKGNvbnN0IGNoYXIgKmZpbGUpOwogCiAgICAgTXV0ZXggICAgICAgICAgICAgICBtU291bmRMb2NrOwogICAgIHNwPE1lZGlhUGxheWVyPiAgICAgbVNvdW5kUGxheWVyW05VTV9TT1VORFNdOwpAQCAtNzUyLDYgKzgxNywyMSBAQAogICAgICAqLwogICAgIGJpbmRlcjo6U3RhdHVzICAgICAgZ2V0TGVnYWN5UGFyYW1ldGVyc0xhenkoaW50IGNhbWVyYUlkLCAvKm91dCovQ2FtZXJhUGFyYW1ldGVycyogcGFyYW1ldGVycyk7CiAKKyAgICAvLyBCbG9ja3MgYWxsIGNsaWVudHMgZnJvbSB0aGUgVUlECisgICAgdm9pZCBibG9ja0NsaWVudHNGb3JVaWQodWlkX3QgdWlkKTsKKworICAgIC8vIE92ZXJyaWRlcyB0aGUgVUlEIHN0YXRlIGFzIGlmIGl0IGlzIGlkbGUKKyAgICBzdGF0dXNfdCBoYW5kbGVTZXRVaWRTdGF0ZShjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzLCBpbnQgZXJyKTsKKworICAgIC8vIENsZWFycyB0aGUgb3ZlcnJpZGUgZm9yIHRoZSBVSUQgc3RhdGUKKyAgICBzdGF0dXNfdCBoYW5kbGVSZXNldFVpZFN0YXRlKGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MsIGludCBlcnIpOworCisgICAgLy8gR2V0cyB0aGUgVUlEIHN0YXRlCisgICAgc3RhdHVzX3QgaGFuZGxlR2V0VWlkU3RhdGUoY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncywgaW50IG91dCwgaW50IGVycik7CisKKyAgICAvLyBQcmludHMgdGhlIHNoZWxsIGNvbW1hbmQgaGVscAorICAgIHN0YXR1c190IHByaW50SGVscChpbnQgb3V0KTsKKwogICAgIHN0YXRpYyBpbnQgZ2V0Q2FsbGluZ1BpZCgpOwogCiAgICAgc3RhdGljIGludCBnZXRDYWxsaW5nVWlkKCk7CkBAIC03NjMsOCArODQzLDggQEAKIAogICAgIHN0YXRpYyBiaW5kZXI6OlN0YXR1cyBtYWtlQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3Qgc3A8SUludGVyZmFjZT4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmcxNiYgcGFja2FnZU5hbWUsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAotICAgICAgICAgICAgaW50IGZhY2luZywgaW50IGNsaWVudFBpZCwgdWlkX3QgY2xpZW50VWlkLCBpbnQgc2VydmljZVBpZCwgYm9vbCBsZWdhY3lNb2RlLAotICAgICAgICAgICAgaW50IGhhbFZlcnNpb24sIGludCBkZXZpY2VWZXJzaW9uLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwKKyAgICAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGludCBmYWNpbmcsIGludCBjbGllbnRQaWQsIHVpZF90IGNsaWVudFVpZCwgaW50IHNlcnZpY2VQaWQsCisgICAgICAgICAgICBib29sIGxlZ2FjeU1vZGUsIGludCBoYWxWZXJzaW9uLCBpbnQgZGV2aWNlVmVyc2lvbiwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsCiAgICAgICAgICAgICAvKm91dCovc3A8QmFzaWNDbGllbnQ+KiBjbGllbnQpOwogCiAgICAgc3RhdHVzX3QgY2hlY2tDYW1lcmFBY2Nlc3MoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKaW5kZXggNTg1ZDJlYi4uNjVmYWFjOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCkBAIC00OSwxNiArNDksMTcgQEAKIENhbWVyYTJDbGllbnQ6OkNhbWVyYTJDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAogICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgIGludCBjYW1lcmFJZCwKKyAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhRGV2aWNlSWQsCisgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCiAgICAgICAgIGludCBjbGllbnRQaWQsCiAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKICAgICAgICAgaW50IHNlcnZpY2VQaWQsCiAgICAgICAgIGJvb2wgbGVnYWN5TW9kZSk6CiAgICAgICAgIENhbWVyYTJDbGllbnRCYXNlKGNhbWVyYVNlcnZpY2UsIGNhbWVyYUNsaWVudCwgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGNhbWVyYUlkKSwgY2FtZXJhRmFjaW5nLAorICAgICAgICAgICAgICAgIGNhbWVyYURldmljZUlkLCBhcGkxQ2FtZXJhSWQsIGNhbWVyYUZhY2luZywKICAgICAgICAgICAgICAgICBjbGllbnRQaWQsIGNsaWVudFVpZCwgc2VydmljZVBpZCksCi0gICAgICAgIG1QYXJhbWV0ZXJzKGNhbWVyYUlkLCBjYW1lcmFGYWNpbmcpCisgICAgICAgIG1QYXJhbWV0ZXJzKGFwaTFDYW1lcmFJZCwgY2FtZXJhRmFjaW5nKQogewogICAgIEFUUkFDRV9DQUxMKCk7CiAKQEAgLTY4LDggKzY5LDggQEAKICAgICBtTGVnYWN5TW9kZSA9IGxlZ2FjeU1vZGU7CiB9CiAKLXN0YXR1c190IENhbWVyYTJDbGllbnQ6OmluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyKSB7Ci0gICAgcmV0dXJuIGluaXRpYWxpemVJbXBsKG1hbmFnZXIpOworc3RhdHVzX3QgQ2FtZXJhMkNsaWVudDo6aW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsIGNvbnN0IFN0cmluZzgmIG1vbml0b3JUYWdzKSB7CisgICAgcmV0dXJuIGluaXRpYWxpemVJbXBsKG1hbmFnZXIsIG1vbml0b3JUYWdzKTsKIH0KIAogYm9vbCBDYW1lcmEyQ2xpZW50Ojppc1pzbEVuYWJsZWRJblN0aWxsVGVtcGxhdGUoKSB7CkBAIC04NywxMyArODgsMTMgQEAKIH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgVFByb3ZpZGVyUHRyPgotc3RhdHVzX3QgQ2FtZXJhMkNsaWVudDo6aW5pdGlhbGl6ZUltcGwoVFByb3ZpZGVyUHRyIHByb3ZpZGVyUHRyKQorc3RhdHVzX3QgQ2FtZXJhMkNsaWVudDo6aW5pdGlhbGl6ZUltcGwoVFByb3ZpZGVyUHRyIHByb3ZpZGVyUHRyLCBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncykKIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogSW5pdGlhbGl6aW5nIGNsaWVudCBmb3IgY2FtZXJhICVkIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOwogICAgIHN0YXR1c190IHJlczsKIAotICAgIHJlcyA9IENhbWVyYTJDbGllbnRCYXNlOjppbml0aWFsaXplKHByb3ZpZGVyUHRyKTsKKyAgICByZXMgPSBDYW1lcmEyQ2xpZW50QmFzZTo6aW5pdGlhbGl6ZShwcm92aWRlclB0ciwgbW9uaXRvclRhZ3MpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CkBAIC03NzgsNyArNzc5LDM1IEBACiAgICAgaW50IGxhc3RKcGVnU3RyZWFtSWQgPSBtSnBlZ1Byb2Nlc3Nvci0+Z2V0U3RyZWFtSWQoKTsKICAgICAvLyBJZiBqcGVnIHN0cmVhbSB3aWxsIHNsb3cgZG93biBwcmV2aWV3LCBtYWtlIHN1cmUgd2UgcmVtb3ZlIGl0IGJlZm9yZSBzdGFydGluZyBwcmV2aWV3CiAgICAgaWYgKHBhcmFtcy5zbG93SnBlZ01vZGUpIHsKLSAgICAgICAgbUpwZWdQcm9jZXNzb3ItPmRlbGV0ZVN0cmVhbSgpOworICAgICAgICAvLyBQYXVzZSBwcmV2aWV3IGlmIHdlIGFyZSBzdHJlYW1pbmcKKyAgICAgICAgaW50MzJfdCBhY3RpdmVSZXF1ZXN0SWQgPSBtU3RyZWFtaW5nUHJvY2Vzc29yLT5nZXRBY3RpdmVSZXF1ZXN0SWQoKTsKKyAgICAgICAgaWYgKGFjdGl2ZVJlcXVlc3RJZCAhPSAwKSB7CisgICAgICAgICAgICByZXMgPSBtU3RyZWFtaW5nUHJvY2Vzc29yLT50b2dnbGVQYXVzZVN0cmVhbSgvKnBhdXNlKi90cnVlKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgcGF1c2Ugc3RyZWFtaW5nOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcyA9IG1EZXZpY2UtPndhaXRVbnRpbERyYWluZWQoKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogV2FpdGluZyB0byBzdG9wIHN0cmVhbWluZyBmYWlsZWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmVzID0gbUpwZWdQcm9jZXNzb3ItPmRlbGV0ZVN0cmVhbSgpOworCisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBkZWxldGUgSnBlZyBzdHJlYW0gZmFpbGVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhY3RpdmVSZXF1ZXN0SWQgIT0gMCkgeworICAgICAgICAgICAgcmVzID0gbVN0cmVhbWluZ1Byb2Nlc3Nvci0+dG9nZ2xlUGF1c2VTdHJlYW0oLypwYXVzZSovZmFsc2UpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCB1bnBhdXNlIHN0cmVhbWluZzogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICByZXMgPSB1cGRhdGVQcm9jZXNzb3JTdHJlYW0obUpwZWdQcm9jZXNzb3IsIHBhcmFtcyk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmgKaW5kZXggNWFmNzRlYi4uNDQ5MjljMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmgKQEAgLTkxLDcgKzkxLDggQEAKICAgICBDYW1lcmEyQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICBpbnQgY2FtZXJhSWQsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFEZXZpY2VJZCwKKyAgICAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKQEAgLTEwMCw3ICsxMDEsOCBAQAogCiAgICAgdmlydHVhbCB+Q2FtZXJhMkNsaWVudCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlcikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlciwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG1vbml0b3JUYWdzKSBvdmVycmlkZTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCkBAIC0yMjMsNyArMjI1LDcgQEAKICAgICBzdGF0dXNfdCBvdmVycmlkZVZpZGVvU25hcHNob3RTaXplKFBhcmFtZXRlcnMgJnBhcmFtcyk7CiAKICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUUHJvdmlkZXJQdHI+Ci0gICAgc3RhdHVzX3QgaW5pdGlhbGl6ZUltcGwoVFByb3ZpZGVyUHRyIHByb3ZpZGVyUHRyKTsKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplSW1wbChUUHJvdmlkZXJQdHIgcHJvdmlkZXJQdHIsIGNvbnN0IFN0cmluZzgmIG1vbml0b3JUYWdzKTsKIAogICAgIGJvb2wgaXNac2xFbmFibGVkSW5TdGlsbFRlbXBsYXRlKCk7CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwCmluZGV4IGE0MDdkMGIuLmYxMjAzZjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAKQEAgLTQyLDcgKzQyLDcgQEAKICAgICAgICAgaW50IGNsaWVudFBpZCwgaW50IGNsaWVudFVpZCwKICAgICAgICAgaW50IHNlcnZpY2VQaWQsIGJvb2wgbGVnYWN5TW9kZSk6CiAgICAgICAgIENsaWVudChjYW1lcmFTZXJ2aWNlLCBjYW1lcmFDbGllbnQsIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgIFN0cmluZzg6OmZvcm1hdCgiJWQiLCBjYW1lcmFJZCksIGNhbWVyYUZhY2luZywgY2xpZW50UGlkLAorICAgICAgICAgICAgICAgIFN0cmluZzg6OmZvcm1hdCgiJWQiLCBjYW1lcmFJZCksIGNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsIGNsaWVudFBpZCwKICAgICAgICAgICAgICAgICBjbGllbnRVaWQsIHNlcnZpY2VQaWQpCiB7CiAgICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CkBAIC02Miw3ICs2Miw4IEBACiAgICAgTE9HMSgiQ2FtZXJhQ2xpZW50OjpDYW1lcmFDbGllbnQgWCAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBjYW1lcmFJZCk7CiB9CiAKLXN0YXR1c190IENhbWVyYUNsaWVudDo6aW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIpIHsKK3N0YXR1c190IENhbWVyYUNsaWVudDo6aW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCisgICAgICAgIGNvbnN0IFN0cmluZzgmIC8qbW9uaXRvclRhZ3MqLykgewogICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOwogICAgIHN0YXR1c190IHJlczsKIApAQCAtMTM2LDcgKzEzNywxMiBAQAogICAgIGNvbnN0IGNoYXIgKmVuZGR1bXAgPSAiXG5cbiI7CiAgICAgd3JpdGUoZmQsIGVuZGR1bXAsIHN0cmxlbihlbmRkdW1wKSk7CiAKLSAgICByZXR1cm4gbUhhcmR3YXJlLT5kdW1wKGZkLCBhcmdzKTsKKyAgICBzcDxDYW1lcmFIYXJkd2FyZUludGVyZmFjZT4gaGFyZHdhcmUgPSBtSGFyZHdhcmU7CisgICAgaWYgKGhhcmR3YXJlICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGhhcmR3YXJlLT5kdW1wKGZkLCBhcmdzKTsKKyAgICB9CisgICAgQUxPR0koIiVzOiBjYW1lcmEgZGV2aWNlIGNsb3NlZCBhbHJlYWR5LCBza2lwIGR1bXBpbmciLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBPSzsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjU3LDcgKzI2Myw4IEBACiAgICAgbUhhcmR3YXJlLT5zdG9wUHJldmlldygpOwogICAgIHNDYW1lcmFTZXJ2aWNlLT51cGRhdGVQcm94eURldmljZVN0YXRlKAogICAgICAgICAgICAgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9TVEFURV9JRExFLAotICAgICAgICAgICAgbUNhbWVyYUlkU3RyLCBtQ2FtZXJhRmFjaW5nLCBtQ2xpZW50UGFja2FnZU5hbWUpOworICAgICAgICAgICAgbUNhbWVyYUlkU3RyLCBtQ2FtZXJhRmFjaW5nLCBtQ2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX0FQSV9MRVZFTF8xKTsKICAgICBtSGFyZHdhcmUtPmNhbmNlbFBpY3R1cmUoKTsKICAgICAvLyBSZWxlYXNlIHRoZSBoYXJkd2FyZSByZXNvdXJjZXMuCiAgICAgbUhhcmR3YXJlLT5yZWxlYXNlKCk7CkBAIC00MTksNyArNDI2LDggQEAKICAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7CiAgICAgICAgIHNDYW1lcmFTZXJ2aWNlLT51cGRhdGVQcm94eURldmljZVN0YXRlKAogICAgICAgICAgICAgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9TVEFURV9BQ1RJVkUsCi0gICAgICAgICAgICBtQ2FtZXJhSWRTdHIsIG1DYW1lcmFGYWNpbmcsIG1DbGllbnRQYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBtQ2FtZXJhSWRTdHIsIG1DYW1lcmFGYWNpbmcsIG1DbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZVByb3h5OjpDQU1FUkFfQVBJX0xFVkVMXzEpOwogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwogfQpAQCAtNDYyLDcgKzQ3MCw4IEBACiAgICAgbUhhcmR3YXJlLT5zdG9wUHJldmlldygpOwogICAgIHNDYW1lcmFTZXJ2aWNlLT51cGRhdGVQcm94eURldmljZVN0YXRlKAogICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX1NUQVRFX0lETEUsCi0gICAgICAgIG1DYW1lcmFJZFN0ciwgbUNhbWVyYUZhY2luZywgbUNsaWVudFBhY2thZ2VOYW1lKTsKKyAgICAgICAgbUNhbWVyYUlkU3RyLCBtQ2FtZXJhRmFjaW5nLCBtQ2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZVByb3h5OjpDQU1FUkFfQVBJX0xFVkVMXzEpOwogICAgIG1QcmV2aWV3QnVmZmVyLmNsZWFyKCk7CiB9CiAKQEAgLTUwMyw3ICs1MTIsNyBAQAogCiB2b2lkIENhbWVyYUNsaWVudDo6cmVsZWFzZVJlY29yZGluZ0ZyYW1lSGFuZGxlKG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKSB7CiAgICAgaWYgKGhhbmRsZSA9PSBudWxscHRyKSByZXR1cm47Ci0KKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgc3A8SU1lbW9yeT4gZGF0YVB0cjsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1BdmFpbGFibGVDYWxsYmFja0J1ZmZlcnNMb2NrKTsKQEAgLTUyNywxNyArNTM2LDIyIEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhICptZXRhZGF0YSA9IChWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKikoZGF0YVB0ci0+cG9pbnRlcigpKTsKLSAgICBtZXRhZGF0YS0+ZVR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlTmF0aXZlSGFuZGxlU291cmNlOwotICAgIG1ldGFkYXRhLT5wSGFuZGxlID0gaGFuZGxlOwotCi0gICAgbUhhcmR3YXJlLT5yZWxlYXNlUmVjb3JkaW5nRnJhbWUoZGF0YVB0cik7CisgICAgaWYgKG1IYXJkd2FyZSAhPSBudWxscHRyKSB7CisgICAgICAgIFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEgKm1ldGFkYXRhID0gKFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEqKShkYXRhUHRyLT5wb2ludGVyKCkpOworICAgICAgICBtZXRhZGF0YS0+ZVR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlTmF0aXZlSGFuZGxlU291cmNlOworICAgICAgICBtZXRhZGF0YS0+cEhhbmRsZSA9IGhhbmRsZTsKKyAgICAgICAgbUhhcmR3YXJlLT5yZWxlYXNlUmVjb3JkaW5nRnJhbWUoZGF0YVB0cik7CisgICAgfQogfQogCiB2b2lkIENhbWVyYUNsaWVudDo6cmVsZWFzZVJlY29yZGluZ0ZyYW1lSGFuZGxlQmF0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4mIGhhbmRsZXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgYm9vbCBkaXNjb25uZWN0ZWQgPSAobUhhcmR3YXJlID09IG51bGxwdHIpOwogICAgIHNpemVfdCBuID0gaGFuZGxlcy5zaXplKCk7CiAgICAgc3RkOjp2ZWN0b3I8c3A8SU1lbW9yeT4+IGZyYW1lczsKLSAgICBmcmFtZXMucmVzZXJ2ZShuKTsKKyAgICBpZiAoIWRpc2Nvbm5lY3RlZCkgeworICAgICAgICBmcmFtZXMucmVzZXJ2ZShuKTsKKyAgICB9CiAgICAgYm9vbCBlcnJvciA9IGZhbHNlOwogICAgIGZvciAoYXV0byYgaGFuZGxlIDogaGFuZGxlcykgewogICAgICAgICBzcDxJTWVtb3J5PiBkYXRhUHRyOwpAQCAtNTYxLDEwICs1NzUsMTIgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSAqbWV0YWRhdGEgPSAoVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSopKGRhdGFQdHItPnBvaW50ZXIoKSk7Ci0gICAgICAgIG1ldGFkYXRhLT5lVHlwZSA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVOYXRpdmVIYW5kbGVTb3VyY2U7Ci0gICAgICAgIG1ldGFkYXRhLT5wSGFuZGxlID0gaGFuZGxlOwotICAgICAgICBmcmFtZXMucHVzaF9iYWNrKGRhdGFQdHIpOworICAgICAgICBpZiAoIWRpc2Nvbm5lY3RlZCkgeworICAgICAgICAgICAgVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSAqbWV0YWRhdGEgPSAoVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSopKGRhdGFQdHItPnBvaW50ZXIoKSk7CisgICAgICAgICAgICBtZXRhZGF0YS0+ZVR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlTmF0aXZlSGFuZGxlU291cmNlOworICAgICAgICAgICAgbWV0YWRhdGEtPnBIYW5kbGUgPSBoYW5kbGU7CisgICAgICAgICAgICBmcmFtZXMucHVzaF9iYWNrKGRhdGFQdHIpOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKGVycm9yKSB7CkBAIC01NzIsNyArNTg4LDcgQEAKICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoaGFuZGxlKTsKICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgeworICAgIH0gZWxzZSBpZiAoIWRpc2Nvbm5lY3RlZCkgewogICAgICAgICBtSGFyZHdhcmUtPnJlbGVhc2VSZWNvcmRpbmdGcmFtZUJhdGNoKGZyYW1lcyk7CiAgICAgfQogICAgIHJldHVybjsKQEAgLTk2MSw3ICs5NzcsOCBAQAogICAgIC8vIGlkbGUgbm93LCB1bnRpbCBwcmV2aWV3IGlzIHJlc3RhcnRlZAogICAgIHNDYW1lcmFTZXJ2aWNlLT51cGRhdGVQcm94eURldmljZVN0YXRlKAogICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX1NUQVRFX0lETEUsCi0gICAgICAgIG1DYW1lcmFJZFN0ciwgbUNhbWVyYUZhY2luZywgbUNsaWVudFBhY2thZ2VOYW1lKTsKKyAgICAgICAgbUNhbWVyYUlkU3RyLCBtQ2FtZXJhRmFjaW5nLCBtQ2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZVByb3h5OjpDQU1FUkFfQVBJX0xFVkVMXzEpOwogCiAgICAgbUxvY2sudW5sb2NrKCk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaAppbmRleCA3ZjkzZmVmLi4xOTEwNTM2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmgKQEAgLTcyLDcgKzcyLDggQEAKICAgICAgICAgICAgIGJvb2wgbGVnYWN5TW9kZSA9IGZhbHNlKTsKICAgICB+Q2FtZXJhQ2xpZW50KCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbW9uaXRvclRhZ3MpIG92ZXJyaWRlOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuY3BwCmluZGV4IDBkMmRiYTEuLmE3MWE3MzIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDEyLTIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTU0LDcgKzE1NCw4IEBACiAgICAgICAgICAgICAgICAgY2FsbGJhY2tGb3JtYXQsIHBhcmFtcy5wcmV2aWV3Rm9ybWF0KTsKICAgICAgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0obUNhbGxiYWNrV2luZG93LAogICAgICAgICAgICAgICAgIHBhcmFtcy5wcmV2aWV3V2lkdGgsIHBhcmFtcy5wcmV2aWV3SGVpZ2h0LCBjYWxsYmFja0Zvcm1hdCwKLSAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX1YwX0pGSUYsIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzAsICZtQ2FsbGJhY2tTdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9WMF9KRklGLCBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wLCAmbUNhbGxiYWNrU3RyZWFtSWQsCisgICAgICAgICAgICAgICAgU3RyaW5nOCgpKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGNyZWF0ZSBvdXRwdXQgc3RyZWFtIGZvciBjYWxsYmFja3M6ICIKICAgICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuY3BwCmluZGV4IDZlMjExMjYuLjE4N2JlYTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcApAQCAtMjkyLDcgKzI5Miw4IEBACiAgICAgfQogCiAgICAgLy8gT25jZSBhbGwgM0Egc3RhdGVzIGFyZSByZWNlaXZlZCwgbm90aWZ5IHRoZSBjbGllbnQgYWJvdXQgM0EgY2hhbmdlcy4KLSAgICBpZiAocGVuZGluZ1N0YXRlLmFlU3RhdGUgIT0gbTNhU3RhdGUuYWVTdGF0ZSkgeworICAgIGlmIChwZW5kaW5nU3RhdGUuYWVTdGF0ZSAhPSBtM2FTdGF0ZS5hZVN0YXRlIHx8CisgICAgICAgICAgICBwZW5kaW5nU3RhdGUuYWVUcmlnZ2VySWQgPiBtM2FTdGF0ZS5hZVRyaWdnZXJJZCkgewogICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQUUgc3RhdGUgJWQtPiVkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLAogICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFlU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZVN0YXRlKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGQ4YjdhZjIuLmI3MDIwZmUKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDEyLTIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTY4LDcgKzE2OCw4IEBACiAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1DYXB0dXJlV2luZG93LAogICAgICAgICAgICAgICAgIHBhcmFtcy5waWN0dXJlV2lkdGgsIHBhcmFtcy5waWN0dXJlSGVpZ2h0LAogICAgICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfQkxPQiwgSEFMX0RBVEFTUEFDRV9WMF9KRklGLAotICAgICAgICAgICAgICAgIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzAsICZtQ2FwdHVyZVN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wLCAmbUNhcHR1cmVTdHJlYW1JZCwKKyAgICAgICAgICAgICAgICBTdHJpbmc4KCkpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgY3JlYXRlIG91dHB1dCBzdHJlYW0gZm9yIGNhcHR1cmU6ICIKICAgICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwKQEAgLTE5OCw3ICsxOTksMTEgQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogCi0gICAgICAgIGRldmljZS0+ZGVsZXRlU3RyZWFtKG1DYXB0dXJlU3RyZWFtSWQpOworICAgICAgICBzdGF0dXNfdCByZXMgPSBkZXZpY2UtPmRlbGV0ZVN0cmVhbShtQ2FwdHVyZVN0cmVhbUlkKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBkZWxldGUgc3RyZWFtICVkIGZhaWxlZCEiLCBfX0ZVTkNUSU9OX18sIG1DYXB0dXJlU3RyZWFtSWQpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQogCiAgICAgICAgIG1DYXB0dXJlSGVhcC5jbGVhcigpOwogICAgICAgICBtQ2FwdHVyZVdpbmRvdy5jbGVhcigpOwpAQCAtMzk1LDcgKzQwMCw3IEBACiAgICAgfQogCiAgICAgLy8gUmVhZCBKRklGIHNlZ21lbnQgbWFya2Vycywgc2tpcCBvdmVyIHNlZ21lbnQgZGF0YQotICAgIHNpemUgPSAwOworICAgIHNpemUgPSBNQVJLRVJfTEVOR1RIOyAvL2p1bXAgU09JOwogICAgIHdoaWxlIChzaXplIDw9IG1heFNpemUgLSBNQVJLRVJfTEVOR1RIKSB7CiAgICAgICAgIHNlZ21lbnRfdCAqc2VnbWVudCA9IChzZWdtZW50X3QqKShqcGVnQnVmZmVyICsgc2l6ZSk7CiAgICAgICAgIHVpbnQ4X3QgdHlwZSA9IGNoZWNrSnBlZ01hcmtlcihzZWdtZW50LT5tYXJrZXIpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwCmluZGV4IDZmYjVjMjEuLjRhNTg2MjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAKQEAgLTI0Miw3ICsyNDIsOSBAQAogICAgICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCwgYXZhaWxhYmxlRnBzUmFuZ2VzLmRhdGEuaTMyW2krMV0pKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaSAhPSAwKSBzdXBwb3J0ZWRQcmV2aWV3RnBzUmFuZ2UgKz0gIiwiOworICAgICAgICAgICAgaWYgKHN1cHBvcnRlZFByZXZpZXdGcHNSYW5nZS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBzdXBwb3J0ZWRQcmV2aWV3RnBzUmFuZ2UgKz0gIiwiOworICAgICAgICAgICAgfQogICAgICAgICAgICAgc3VwcG9ydGVkUHJldmlld0Zwc1JhbmdlICs9IFN0cmluZzg6OmZvcm1hdCgiKCVkLCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUZwc1Jhbmdlcy5kYXRhLmkzMltpXSAqIGtGcHNUb0FwaVNjYWxlLAogICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVGcHNSYW5nZXMuZGF0YS5pMzJbaSsxXSAqIGtGcHNUb0FwaVNjYWxlKTsKQEAgLTc1OSwxMiArNzYxLDE3IEBACiAgICAgZm9jdXNpbmdBcmVhcy5jbGVhcigpOwogICAgIGZvY3VzaW5nQXJlYXMuYWRkKFBhcmFtZXRlcnM6OkFyZWEoMCwwLDAsMCwwKSk7CiAKLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVGb2NhbExlbmd0aHMgPQotICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfTEVOU19JTkZPX0FWQUlMQUJMRV9GT0NBTF9MRU5HVEhTLCAwLCAwLCBmYWxzZSk7Ci0gICAgaWYgKCFhdmFpbGFibGVGb2NhbExlbmd0aHMuY291bnQpIHJldHVybiBOT19JTklUOworICAgIGlmIChmYXN0SW5mby5pc0V4dGVybmFsQ2FtZXJhKSB7CisgICAgICAgIHBhcmFtcy5zZXRGbG9hdChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfRk9DQUxfTEVOR1RILCAtMS4wKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVGb2NhbExlbmd0aHMgPQorICAgICAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX0xFTlNfSU5GT19BVkFJTEFCTEVfRk9DQUxfTEVOR1RIUywgMCwgMCwgZmFsc2UpOworICAgICAgICBpZiAoIWF2YWlsYWJsZUZvY2FsTGVuZ3Rocy5jb3VudCkgcmV0dXJuIE5PX0lOSVQ7CiAKLSAgICBmbG9hdCBtaW5Gb2NhbExlbmd0aCA9IGF2YWlsYWJsZUZvY2FsTGVuZ3Rocy5kYXRhLmZbMF07Ci0gICAgcGFyYW1zLnNldEZsb2F0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9GT0NBTF9MRU5HVEgsIG1pbkZvY2FsTGVuZ3RoKTsKKyAgICAgICAgZmxvYXQgbWluRm9jYWxMZW5ndGggPSBhdmFpbGFibGVGb2NhbExlbmd0aHMuZGF0YS5mWzBdOworICAgICAgICBwYXJhbXMuc2V0RmxvYXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZPQ0FMX0xFTkdUSCwgbWluRm9jYWxMZW5ndGgpOworICAgIH0KKwogCiAgICAgZmxvYXQgaG9yaXpGb3YsIHZlcnRGb3Y7CiAgICAgcmVzID0gY2FsY3VsYXRlUGljdHVyZUZvdnMoJmhvcml6Rm92LCAmdmVydEZvdik7CkBAIC0xMDkxLDkgKzEwOTgsMTUgQEAKICAgICAgICAgICAgIGZvY3VzRGlzdGFuY2VDYWxpYnJhdGlvbi5kYXRhLnU4WzBdICE9CiAgICAgICAgICAgICBBTkRST0lEX0xFTlNfSU5GT19GT0NVU19ESVNUQU5DRV9DQUxJQlJBVElPTl9VTkNBTElCUkFURUQpOwogCisKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBod0xldmVsID0gc3RhdGljSW5mbyhBTkRST0lEX0lORk9fU1VQUE9SVEVEX0hBUkRXQVJFX0xFVkVMKTsKKyAgICBpZiAoIWh3TGV2ZWwuY291bnQpIHJldHVybiBOT19JTklUOworICAgIGZhc3RJbmZvLmlzRXh0ZXJuYWxDYW1lcmEgPQorICAgICAgICAgICAgaHdMZXZlbC5kYXRhLnU4WzBdID09IEFORFJPSURfSU5GT19TVVBQT1JURURfSEFSRFdBUkVfTEVWRUxfRVhURVJOQUw7CisKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVGb2NhbExlbmd0aHMgPQotICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfTEVOU19JTkZPX0FWQUlMQUJMRV9GT0NBTF9MRU5HVEhTKTsKLSAgICBpZiAoIWF2YWlsYWJsZUZvY2FsTGVuZ3Rocy5jb3VudCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9MRU5TX0lORk9fQVZBSUxBQkxFX0ZPQ0FMX0xFTkdUSFMsIDAsIDAsIC8qcmVxdWlyZWQqL2ZhbHNlKTsKKyAgICBpZiAoIWF2YWlsYWJsZUZvY2FsTGVuZ3Rocy5jb3VudCAmJiAhZmFzdEluZm8uaXNFeHRlcm5hbENhbWVyYSkgcmV0dXJuIE5PX0lOSVQ7CiAKICAgICBTb3J0ZWRWZWN0b3I8aW50MzJfdD4gYXZhaWxhYmxlRm9ybWF0cyA9IGdldEF2YWlsYWJsZU91dHB1dEZvcm1hdHMoKTsKICAgICBpZiAoIWF2YWlsYWJsZUZvcm1hdHMuc2l6ZSgpKSByZXR1cm4gTk9fSU5JVDsKQEAgLTExNzgsMTAgKzExOTEsMTQgQEAKIAogICAgIC8vIEZpbmQgc21hbGxlc3QgKHdpZGVzdC1hbmdsZSkgZm9jYWwgbGVuZ3RoIHRvIHVzZSBhcyBiYXNpcyBvZiBzdGlsbAogICAgIC8vIHBpY3R1cmUgRk9WIHJlcG9ydGluZy4KLSAgICBmYXN0SW5mby5taW5Gb2NhbExlbmd0aCA9IGF2YWlsYWJsZUZvY2FsTGVuZ3Rocy5kYXRhLmZbMF07Ci0gICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBhdmFpbGFibGVGb2NhbExlbmd0aHMuY291bnQ7IGkrKykgewotICAgICAgICBpZiAoZmFzdEluZm8ubWluRm9jYWxMZW5ndGggPiBhdmFpbGFibGVGb2NhbExlbmd0aHMuZGF0YS5mW2ldKSB7Ci0gICAgICAgICAgICBmYXN0SW5mby5taW5Gb2NhbExlbmd0aCA9IGF2YWlsYWJsZUZvY2FsTGVuZ3Rocy5kYXRhLmZbaV07CisgICAgaWYgKGZhc3RJbmZvLmlzRXh0ZXJuYWxDYW1lcmEpIHsKKyAgICAgICAgZmFzdEluZm8ubWluRm9jYWxMZW5ndGggPSAtMS4wOworICAgIH0gZWxzZSB7CisgICAgICAgIGZhc3RJbmZvLm1pbkZvY2FsTGVuZ3RoID0gYXZhaWxhYmxlRm9jYWxMZW5ndGhzLmRhdGEuZlswXTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBhdmFpbGFibGVGb2NhbExlbmd0aHMuY291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGZhc3RJbmZvLm1pbkZvY2FsTGVuZ3RoID4gYXZhaWxhYmxlRm9jYWxMZW5ndGhzLmRhdGEuZltpXSkgeworICAgICAgICAgICAgICAgIGZhc3RJbmZvLm1pbkZvY2FsTGVuZ3RoID0gYXZhaWxhYmxlRm9jYWxMZW5ndGhzLmRhdGEuZltpXTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMTE5OCw2ICsxMjE1LDM1IEBACiAKICAgICBmYXN0SW5mby5tYXhKcGVnU2l6ZSA9IGdldE1heFNpemUoZ2V0QXZhaWxhYmxlSnBlZ1NpemVzKCkpOwogCisgICAgaXNac2xSZXByb2Nlc3NQcmVzZW50ID0gZmFsc2U7CisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlQ2FwYWJpbGl0aWVzID0KKyAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7CisgICAgaWYgKDAgPCBhdmFpbGFibGVDYXBhYmlsaXRpZXMuY291bnQpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqY2FwcyA9IGF2YWlsYWJsZUNhcGFiaWxpdGllcy5kYXRhLnU4OworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF2YWlsYWJsZUNhcGFiaWxpdGllcy5jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfUFJJVkFURV9SRVBST0NFU1NJTkcgPT0KKyAgICAgICAgICAgICAgICBjYXBzW2ldKSB7CisgICAgICAgICAgICAgICAgaXNac2xSZXByb2Nlc3NQcmVzZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaXNac2xSZXByb2Nlc3NQcmVzZW50KSB7CisgICAgICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBzY3MgPSBnZXRTdHJlYW1Db25maWd1cmF0aW9ucygpOworICAgICAgICBTaXplIG1heFByaXZJbnB1dFNpemUgPSB7MCwgMH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgc2MgOiBzY3MpIHsKKyAgICAgICAgICAgIGlmIChzYy5pc0lucHV0ID09IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfSU5QVVQgJiYKKyAgICAgICAgICAgICAgICAgICAgc2MuZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCkgeworICAgICAgICAgICAgICAgIGlmIChzYy53aWR0aCAqIHNjLmhlaWdodCA+IG1heFByaXZJbnB1dFNpemUud2lkdGggKiBtYXhQcml2SW5wdXRTaXplLmhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBtYXhQcml2SW5wdXRTaXplID0ge3NjLndpZHRoLCBzYy5oZWlnaHR9OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmYXN0SW5mby5tYXhac2xTaXplID0gbWF4UHJpdklucHV0U2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBmYXN0SW5mby5tYXhac2xTaXplID0gezAsIDB9OworICAgIH0KKwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMTMyNCw4ICsxMzcwLDggQEAKICAgICB7CiAgICAgICAgIGNvbnN0IGNoYXIgKmZwc1JhbmdlLCAqZnBzU2luZ2xlOwogCi0gICAgICAgIGZwc1JhbmdlID0gbmV3UGFyYW1zLmdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUFJFVklFV19GUkFNRV9SQVRFKTsKLSAgICAgICAgZnBzU2luZ2xlID0gbmV3UGFyYW1zLmdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUFJFVklFV19GUFNfUkFOR0UpOworICAgICAgICBmcHNTaW5nbGUgPSBuZXdQYXJhbXMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9QUkVWSUVXX0ZSQU1FX1JBVEUpOworICAgICAgICBmcHNSYW5nZSA9IG5ld1BhcmFtcy5nZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1BSRVZJRVdfRlBTX1JBTkdFKTsKIAogICAgICAgICAvKioKICAgICAgICAgICogUGljayBlaXRoZXIgdGhlIHJhbmdlIG9yIHRoZSBzaW5nbGUga2V5IGlmIG9ubHkgb25lIHdhcyBzZXQuCkBAIC0yMjAyLDYgKzIyNDgsMTQgQEAKICAgICAgICAgICAgICAgICBub3JtYWxpemVkWFRvQXJyYXkobWV0ZXJpbmdBcmVhc1tqXS5yaWdodCk7CiAgICAgICAgICAgICByZXFNZXRlcmluZ0FyZWFzW2kgKyAzXSA9CiAgICAgICAgICAgICAgICAgbm9ybWFsaXplZFlUb0FycmF5KG1ldGVyaW5nQXJlYXNbal0uYm90dG9tKTsKKyAgICAgICAgICAgIC8vIFJlcXVlc3RlZCBzaXplIG1heSBiZSB6ZXJvIGJ5IHJvdW5kaW5nIGVycm9yIHdpdGgvd2l0aG91dCB6b29taW5nLgorICAgICAgICAgICAgLy8gVGhlIGFlIHJlZ2lvbnMgc2hvdWxkIGJlIGF0IGxlYXN0IDEgaWYgbWV0ZXJpbmcgd2lkdGgvaGVpZ2h0IGlzIG5vdCB6ZXJvLgorICAgICAgICAgICAgaWYgKHJlcU1ldGVyaW5nQXJlYXNbaSArIDBdID09IHJlcU1ldGVyaW5nQXJlYXNbaSArIDJdKSB7CisgICAgICAgICAgICAgICAgcmVxTWV0ZXJpbmdBcmVhc1tpICsgMl0rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXFNZXRlcmluZ0FyZWFzW2kgKyAxXSA9PSByZXFNZXRlcmluZ0FyZWFzW2kgKyAzXSkgeworICAgICAgICAgICAgICAgIHJlcU1ldGVyaW5nQXJlYXNbaSArIDNdKys7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXFNZXRlcmluZ0FyZWFzW2kgKyAwXSA9IDA7CiAgICAgICAgICAgICByZXFNZXRlcmluZ0FyZWFzW2kgKyAxXSA9IDA7CkBAIC0yODYyLDggKzI5MTYsMTMgQEAKICAgICAgICAgaWYgKHNjLmlzSW5wdXQgPT0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQgJiYKICAgICAgICAgICAgICAgICBzYy5mb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEICYmCiAgICAgICAgICAgICAgICAgc2Mud2lkdGggPD0gbGltaXQud2lkdGggJiYgc2MuaGVpZ2h0IDw9IGxpbWl0LmhlaWdodCkgewotICAgICAgICAgICAgU2l6ZSBzeiA9IHtzYy53aWR0aCwgc2MuaGVpZ2h0fTsKLSAgICAgICAgICAgIHNpemVzLT5wdXNoKHN6KTsKKyAgICAgICAgICAgIGludDY0X3QgbWluRnJhbWVEdXJhdGlvbiA9IGdldE1pbkZyYW1lRHVyYXRpb25OcygKKyAgICAgICAgICAgICAgICAgICAge3NjLndpZHRoLCBzYy5oZWlnaHR9LCBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpOworICAgICAgICAgICAgaWYgKG1pbkZyYW1lRHVyYXRpb24gPiBNQVhfUFJFVklFV19SRUNPUkRfRFVSQVRJT05fTlMpIHsKKyAgICAgICAgICAgICAgICAvLyBGaWx0ZXIgc2xvdyBzaXplcyBmcm9tIHByZXZpZXcvcmVjb3JkCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaXplcy0+cHVzaCh7c2Mud2lkdGgsIHNjLmhlaWdodH0pOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zMDczLDYgKzMxMzIsMTYgQEAKIAogc3RhdHVzX3QgUGFyYW1ldGVyczo6Y2FsY3VsYXRlUGljdHVyZUZvdnMoZmxvYXQgKmhvcml6Rm92LCBmbG9hdCAqdmVydEZvdikKICAgICAgICAgY29uc3QgeworICAgIGlmIChmYXN0SW5mby5pc0V4dGVybmFsQ2FtZXJhKSB7CisgICAgICAgIGlmIChob3JpekZvdiAhPSBOVUxMKSB7CisgICAgICAgICAgICAqaG9yaXpGb3YgPSAtMS4wOworICAgICAgICB9CisgICAgICAgIGlmICh2ZXJ0Rm92ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICp2ZXJ0Rm92ID0gLTEuMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3Qgc2Vuc29yU2l6ZSA9CiAgICAgICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfU0VOU09SX0lORk9fUEhZU0lDQUxfU0laRSwgMiwgMik7CiAgICAgaWYgKCFzZW5zb3JTaXplLmNvdW50KSByZXR1cm4gTk9fSU5JVDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oCmluZGV4IDE3ZTNkNzUuLmUzNWI3YTQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaApAQCAtMjA3LDYgKzIwNywxMSBAQAogICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IEZQU19NQVJHSU4gPSAxOwogICAgIC8vIE1heCBGUFMgZm9yIGRlZmF1bHQgcGFyYW1ldGVycwogICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IE1BWF9ERUZBVUxUX0ZQUyA9IDMwOworICAgIC8vIE1pbmltdW0gRlBTIGZvciBhIHNpemUgdG8gYmUgbGlzdGVkIGluIHN1cHBvcnRlZCBwcmV2aWV3L3ZpZGVvIHNpemVzCisgICAgLy8gU2V0IHRvIHNsaWdodGx5IGxlc3MgdGhhbiAzMC4wIHRvIGhhdmUgc29tZSB0b2xlcmFuY2UgbWFyZ2luCisgICAgc3RhdGljIGNvbnN0ZXhwciBkb3VibGUgTUlOX1BSRVZJRVdfUkVDT1JEX0ZQUyA9IDI5Ljk3OworICAgIC8vIE1heGltdW0gZnJhbWUgZHVyYXRpb24gZm9yIGEgc2l6ZSB0byBiZSBsaXN0ZWQgaW4gc3VwcG9ydGVkIHByZXZpZXcvdmlkZW8gc2l6ZXMKKyAgICBzdGF0aWMgY29uc3RleHByIGludDY0X3QgTUFYX1BSRVZJRVdfUkVDT1JEX0RVUkFUSU9OX05TID0gMWU5IC8gTUlOX1BSRVZJRVdfUkVDT1JEX0ZQUzsKIAogICAgIC8vIEZ1bGwgc3RhdGljIGNhbWVyYSBpbmZvLCBvYmplY3Qgb3duZWQgYnkgc29tZW9uZSBlbHNlLCBzdWNoIGFzCiAgICAgLy8gQ2FtZXJhMkRldmljZS4KQEAgLTIzMyw5ICsyMzgsMTEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfTsKICAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPHVpbnQ4X3QsIE92ZXJyaWRlTW9kZXM+IHNjZW5lTW9kZU92ZXJyaWRlczsKKyAgICAgICAgYm9vbCBpc0V4dGVybmFsQ2FtZXJhOwogICAgICAgICBmbG9hdCBtaW5Gb2NhbExlbmd0aDsKICAgICAgICAgYm9vbCB1c2VGbGV4aWJsZVl1djsKICAgICAgICAgU2l6ZSBtYXhKcGVnU2l6ZTsKKyAgICAgICAgU2l6ZSBtYXhac2xTaXplOwogICAgIH0gZmFzdEluZm87CiAKICAgICAvLyBRdWlya3MgaW5mb3JtYXRpb247IHRoZXNlIGFyZSBzaG9ydC1saXZlZCBmbGFncyB0byBlbmFibGUgd29ya2Fyb3VuZHMgZm9yCkBAIC0zODAsNiArMzg3LDcgQEAKICAgICBWZWN0b3I8U2l6ZT4gYXZhaWxhYmxlUHJldmlld1NpemVzOwogICAgIFZlY3RvcjxTaXplPiBhdmFpbGFibGVWaWRlb1NpemVzOwogICAgIC8vIEdldCBzaXplIGxpc3QgKHRoYXQgYXJlIG5vIGxhcmdlciB0aGFuIGxpbWl0KSBmcm9tIHN0YXRpYyBtZXRhZGF0YS4KKyAgICAvLyBUaGlzIG1ldGhvZCBmaWx0ZXJlZCBzaXplIHdpdGggbWluRnJhbWVEdXJhdGlvbiA8IE1BWF9QUkVWSUVXX1JFQ09SRF9EVVJBVElPTl9OUwogICAgIHN0YXR1c190IGdldEZpbHRlcmVkU2l6ZXMoU2l6ZSBsaW1pdCwgVmVjdG9yPFNpemU+ICpzaXplcyk7CiAgICAgLy8gR2V0IG1heCBzaXplIChmcm9tIHRoZSBzaXplIGFycmF5KSB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIGFzcGVjdCByYXRpby4KICAgICBTaXplIGdldE1heFNpemVGb3JSYXRpbyhmbG9hdCByYXRpbywgY29uc3QgaW50MzJfdCogc2l6ZUFycmF5LCBzaXplX3QgY291bnQpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcAppbmRleCA3M2RjYTczLi4wNzg2ZjUzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDEyLTIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTk0LDcgKzE5NCw3IEBACiAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1QcmV2aWV3V2luZG93LAogICAgICAgICAgICAgICAgIHBhcmFtcy5wcmV2aWV3V2lkdGgsIHBhcmFtcy5wcmV2aWV3SGVpZ2h0LAogICAgICAgICAgICAgICAgIENBTUVSQTJfSEFMX1BJWEVMX0ZPUk1BVF9PUEFRVUUsIEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiwKLSAgICAgICAgICAgICAgICBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wLCAmbVByZXZpZXdTdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMCwgJm1QcmV2aWV3U3RyZWFtSWQsIFN0cmluZzgoKSk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gY3JlYXRlIHByZXZpZXcgc3RyZWFtOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtMzc5LDcgKzM3OSw4IEBACiAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1SZWNvcmRpbmdXaW5kb3csCiAgICAgICAgICAgICAgICAgcGFyYW1zLnZpZGVvV2lkdGgsIHBhcmFtcy52aWRlb0hlaWdodCwKICAgICAgICAgICAgICAgICBwYXJhbXMudmlkZW9Gb3JtYXQsIHBhcmFtcy52aWRlb0RhdGFTcGFjZSwKLSAgICAgICAgICAgICAgICBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wLCAmbVJlY29yZGluZ1N0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wLCAmbVJlY29yZGluZ1N0cmVhbUlkLAorICAgICAgICAgICAgICAgIFN0cmluZzgoKSk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBjcmVhdGUgb3V0cHV0IHN0cmVhbSBmb3IgcmVjb3JkaW5nOiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwCmluZGV4IGIwNjA3ZmIuLjM3ZTE0OTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0yMzEsNjMgKzIzMSw5IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBpZiAoKG1ac2xTdHJlYW1JZCAhPSBOT19TVFJFQU0pIHx8IChtSW5wdXRTdHJlYW1JZCAhPSBOT19TVFJFQU0pKSB7Ci0gICAgICAgIC8vIENoZWNrIGlmIHN0cmVhbSBwYXJhbWV0ZXJzIGhhdmUgdG8gY2hhbmdlCi0gICAgICAgIENhbWVyYURldmljZUJhc2U6OlN0cmVhbUluZm8gc3RyZWFtSW5mbzsKLSAgICAgICAgcmVzID0gZGV2aWNlLT5nZXRTdHJlYW1JbmZvKG1ac2xTdHJlYW1JZCwgJnN0cmVhbUluZm8pOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogRXJyb3IgcXVlcnlpbmcgY2FwdHVyZSBvdXRwdXQgc3RyZWFtIGluZm86ICIKLSAgICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudC0+Z2V0Q2FtZXJhSWQoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdHJlYW1JbmZvLndpZHRoICE9ICh1aW50MzJfdClwYXJhbXMuZmFzdEluZm8uYXJyYXlXaWR0aCB8fAotICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uaGVpZ2h0ICE9ICh1aW50MzJfdClwYXJhbXMuZmFzdEluZm8uYXJyYXlIZWlnaHQpIHsKLSAgICAgICAgICAgIGlmIChtWnNsU3RyZWFtSWQgIT0gTk9fU1RSRUFNKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IERlbGV0aW5nIHN0cmVhbSAlZCBzaW5jZSB0aGUgYnVmZmVyICIKLSAgICAgICAgICAgICAgICAgICAgICAiZGltZW5zaW9ucyBjaGFuZ2VkIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjbGllbnQtPmdldENhbWVyYUlkKCksIG1ac2xTdHJlYW1JZCk7Ci0gICAgICAgICAgICAgICAgcmVzID0gZGV2aWNlLT5kZWxldGVTdHJlYW0obVpzbFN0cmVhbUlkKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzID09IC1FQlVTWSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogRGV2aWNlIGlzIGJ1c3ksIGNhbGwgdXBkYXRlU3RyZWFtIGFnYWluICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiBhZnRlciBpdCBiZWNvbWVzIGlkbGUiLCBfX0ZVTkNUSU9OX18sIG1JZCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKHJlcyAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIGRlbGV0ZSBvbGQgb3V0cHV0IHN0cmVhbSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciBaU0w6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5nZXRDYW1lcmFJZCgpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVpzbFN0cmVhbUlkID0gTk9fU1RSRUFNOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUlucHV0U3RyZWFtSWQgIT0gTk9fU1RSRUFNKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IERlbGV0aW5nIHN0cmVhbSAlZCBzaW5jZSB0aGUgYnVmZmVyICIKLSAgICAgICAgICAgICAgICAgICAgICAiZGltZW5zaW9ucyBjaGFuZ2VkIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjbGllbnQtPmdldENhbWVyYUlkKCksIG1JbnB1dFN0cmVhbUlkKTsKLSAgICAgICAgICAgICAgICByZXMgPSBkZXZpY2UtPmRlbGV0ZVN0cmVhbShtSW5wdXRTdHJlYW1JZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcyA9PSAtRUJVU1kpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IERldmljZSBpcyBidXN5LCBjYWxsIHVwZGF0ZVN0cmVhbSBhZ2FpbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgYWZ0ZXIgaXQgYmVjb21lcyBpZGxlIiwgX19GVU5DVElPTl9fLCBtSWQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZihyZXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byBkZWxldGUgb2xkIG91dHB1dCBzdHJlYW0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgWlNMOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+Z2V0Q2FtZXJhSWQoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1JbnB1dFN0cmVhbUlkID0gTk9fU1RSRUFNOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG51bGxwdHIgIT0gbUlucHV0UHJvZHVjZXIuZ2V0KCkpIHsKLSAgICAgICAgICAgICAgICBtSW5wdXRQcm9kdWNlci0+ZGlzY29ubmVjdChOQVRJVkVfV0lORE9XX0FQSV9DUFUpOwotICAgICAgICAgICAgICAgIG1JbnB1dFByb2R1Y2VyLmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBpZiAobUlucHV0U3RyZWFtSWQgPT0gTk9fU1RSRUFNKSB7Ci0gICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlSW5wdXRTdHJlYW0ocGFyYW1zLmZhc3RJbmZvLmFycmF5V2lkdGgsCi0gICAgICAgICAgICBwYXJhbXMuZmFzdEluZm8uYXJyYXlIZWlnaHQsIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCwKKyAgICAgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVJbnB1dFN0cmVhbShwYXJhbXMuZmFzdEluZm8ubWF4WnNsU2l6ZS53aWR0aCwKKyAgICAgICAgICAgIHBhcmFtcy5mYXN0SW5mby5tYXhac2xTaXplLmhlaWdodCwgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVELAogICAgICAgICAgICAgJm1JbnB1dFN0cmVhbUlkKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGNyZWF0ZSBpbnB1dCBzdHJlYW06ICIKQEAgLTMwOSw5ICsyNTUsMTAgQEAKICAgICAgICAgbVByb2R1Y2VyLT5zZXROYW1lKFN0cmluZzgoIkNhbWVyYTItWnNsUmluZ0J1ZmZlckNvbnN1bWVyIikpOwogICAgICAgICBzcDxTdXJmYWNlPiBvdXRTdXJmYWNlID0gbmV3IFN1cmZhY2UocHJvZHVjZXIpOwogCi0gICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG91dFN1cmZhY2UsIHBhcmFtcy5mYXN0SW5mby5hcnJheVdpZHRoLAotICAgICAgICAgICAgcGFyYW1zLmZhc3RJbmZvLmFycmF5SGVpZ2h0LCBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQsCi0gICAgICAgICAgICBIQUxfREFUQVNQQUNFX1VOS05PV04sIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzAsICZtWnNsU3RyZWFtSWQpOworICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZVN0cmVhbShvdXRTdXJmYWNlLCBwYXJhbXMuZmFzdEluZm8ubWF4WnNsU2l6ZS53aWR0aCwKKyAgICAgICAgICAgIHBhcmFtcy5mYXN0SW5mby5tYXhac2xTaXplLmhlaWdodCwgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVELAorICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9VTktOT1dOLCBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wLCAmbVpzbFN0cmVhbUlkLAorICAgICAgICAgICAgU3RyaW5nOCgpKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGNyZWF0ZSBaU0wgc3RyZWFtOiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBjbGllbnQtPmdldENhbWVyYUlkKCksCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKaW5kZXggYzAzZThhMi4uYzQ5ZGU4ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMjgsNiArMjgsOCBAQAogI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgiCiAjaW5jbHVkZSAiYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaCIKIAorI2luY2x1ZGUgPGNhbWVyYV9tZXRhZGF0YV9oaWRkZW4uaD4KKwogLy8gQ29udmVuaWVuY2UgbWV0aG9kcyBmb3IgY29uc3RydWN0aW5nIGJpbmRlcjo6U3RhdHVzIG9iamVjdHMgZm9yIGVycm9yIHJldHVybnMKIAogI2RlZmluZSBTVEFUVVNfRVJST1IoZXJyb3JDb2RlLCBlcnJvclN0cmluZykgXApAQCAtNDcsNiArNDksNyBAQAogICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4mIHJlbW90ZUNhbGxiYWNrLAogICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAorICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLAogICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICBpbnQgY2xpZW50UGlkLAogICAgICAgICB1aWRfdCBjbGllbnRVaWQsCkBAIC02MCw2ICs2Myw4IEBACiAgICAgICAgICAgICBjbGllbnRVaWQsCiAgICAgICAgICAgICBzZXJ2aWNlUGlkKSwKICAgICBtUmVtb3RlQ2FsbGJhY2socmVtb3RlQ2FsbGJhY2spIHsKKyAgICAvLyBXZSBkb24ndCBuZWVkIGl0IGZvciBBUEkyIGNsaWVudHMsIGJ1dCBDYW1lcmEyQ2xpZW50QmFzZSByZXF1aXJlcyBpdC4KKyAgICAodm9pZCkgYXBpMUNhbWVyYUlkOwogfQogCiAvLyBJbnRlcmZhY2UgdXNlZCBieSBDYW1lcmFTZXJ2aWNlCkBAIC03Myw3ICs3OCw4IEBACiAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKICAgICAgICAgaW50IHNlcnZpY2VQaWQpIDoKICAgICBDYW1lcmEyQ2xpZW50QmFzZShjYW1lcmFTZXJ2aWNlLCByZW1vdGVDYWxsYmFjaywgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgY2FtZXJhSWQsIGNhbWVyYUZhY2luZywgY2xpZW50UGlkLCBjbGllbnRVaWQsIHNlcnZpY2VQaWQpLAorICAgICAgICAgICAgICAgIGNhbWVyYUlkLCAvKkFQSTEgY2FtZXJhIElEKi8gLTEsCisgICAgICAgICAgICAgICAgY2FtZXJhRmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwgc2VydmljZVBpZCksCiAgICAgbUlucHV0U3RyZWFtKCksCiAgICAgbVN0cmVhbWluZ1JlcXVlc3RJZChSRVFVRVNUX0lEX05PTkUpLAogICAgIG1SZXF1ZXN0SWRDb3VudGVyKDApIHsKQEAgLTgyLDE2ICs4OCwxNyBAQAogICAgIEFMT0dJKCJDYW1lcmFEZXZpY2VDbGllbnQgJXM6IE9wZW5lZCIsIGNhbWVyYUlkLnN0cmluZygpKTsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50Ojppbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlcikgewotICAgIHJldHVybiBpbml0aWFsaXplSW1wbChtYW5hZ2VyKTsKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6aW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCisgICAgICAgIGNvbnN0IFN0cmluZzgmIG1vbml0b3JUYWdzKSB7CisgICAgcmV0dXJuIGluaXRpYWxpemVJbXBsKG1hbmFnZXIsIG1vbml0b3JUYWdzKTsKIH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgVFByb3ZpZGVyUHRyPgotc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50Ojppbml0aWFsaXplSW1wbChUUHJvdmlkZXJQdHIgcHJvdmlkZXJQdHIpIHsKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6aW5pdGlhbGl6ZUltcGwoVFByb3ZpZGVyUHRyIHByb3ZpZGVyUHRyLCBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgc3RhdHVzX3QgcmVzOwogCi0gICAgcmVzID0gQ2FtZXJhMkNsaWVudEJhc2U6OmluaXRpYWxpemUocHJvdmlkZXJQdHIpOworICAgIHJlcyA9IENhbWVyYTJDbGllbnRCYXNlOjppbml0aWFsaXplKHByb3ZpZGVyUHRyLCBtb25pdG9yVGFncyk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KQEAgLTEwNiw2ICsxMTMsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypsaXN0ZW5lciovdGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypzZW5kUGFydGlhbHMqL3RydWUpOwogCisgICAgYXV0byBkZXZpY2VJbmZvID0gbURldmljZS0+aW5mbygpOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IHBoeXNpY2FsS2V5c0VudHJ5ID0gZGV2aWNlSW5mby5maW5kKAorICAgICAgICAgICAgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTKTsKKyAgICBpZiAocGh5c2ljYWxLZXlzRW50cnkuY291bnQgPiAwKSB7CisgICAgICAgIG1TdXBwb3J0ZWRQaHlzaWNhbFJlcXVlc3RLZXlzLmluc2VydChtU3VwcG9ydGVkUGh5c2ljYWxSZXF1ZXN0S2V5cy5iZWdpbigpLAorICAgICAgICAgICAgICAgIHBoeXNpY2FsS2V5c0VudHJ5LmRhdGEuaTMyLAorICAgICAgICAgICAgICAgIHBoeXNpY2FsS2V5c0VudHJ5LmRhdGEuaTMyICsgcGh5c2ljYWxLZXlzRW50cnkuY291bnQpOworICAgIH0KKwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMTIxLDYgKzEzNywzNyBAQAogICAgIHJldHVybiBzdWJtaXRSZXF1ZXN0TGlzdChyZXF1ZXN0TGlzdCwgc3RyZWFtaW5nLCBzdWJtaXRJbmZvKTsKIH0KIAorYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50OjppbnNlcnRHYnBMb2NrZWQoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGdicCwKKyAgICAgICAgU3VyZmFjZU1hcCogb3V0U3VyZmFjZU1hcCwgVmVjdG9yPGludDMyX3Q+KiBvdXRwdXRTdHJlYW1JZHMsIGludDMyX3QgKmN1cnJlbnRTdHJlYW1JZCkgeworICAgIGludCBpZHggPSBtU3RyZWFtTWFwLmluZGV4T2ZLZXkoSUludGVyZmFjZTo6YXNCaW5kZXIoZ2JwKSk7CisKKyAgICAvLyBUcnlpbmcgdG8gc3VibWl0IHJlcXVlc3Qgd2l0aCBzdXJmYWNlIHRoYXQgd2Fzbid0IGNyZWF0ZWQKKyAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzOiBUcmllZCB0byBzdWJtaXQgYSByZXF1ZXN0IHdpdGggYSBzdXJmYWNlIHRoYXQiCisgICAgICAgICAgICAgICAgIiB3ZSBoYXZlIG5vdCBjYWxsZWQgY3JlYXRlU3RyZWFtIG9uIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKKyAgICAgICAgICAgICAgICAiUmVxdWVzdCB0YXJnZXRzIFN1cmZhY2UgdGhhdCBpcyBub3QgcGFydCBvZiBjdXJyZW50IGNhcHR1cmUgc2Vzc2lvbiIpOworICAgIH0KKworICAgIGNvbnN0IFN0cmVhbVN1cmZhY2VJZCYgc3RyZWFtU3VyZmFjZUlkID0gbVN0cmVhbU1hcC52YWx1ZUF0KGlkeCk7CisgICAgaWYgKG91dFN1cmZhY2VNYXAtPmZpbmQoc3RyZWFtU3VyZmFjZUlkLnN0cmVhbUlkKCkpID09IG91dFN1cmZhY2VNYXAtPmVuZCgpKSB7CisgICAgICAgICgqb3V0U3VyZmFjZU1hcClbc3RyZWFtU3VyZmFjZUlkLnN0cmVhbUlkKCldID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpOworICAgICAgICBvdXRwdXRTdHJlYW1JZHMtPnB1c2hfYmFjayhzdHJlYW1TdXJmYWNlSWQuc3RyZWFtSWQoKSk7CisgICAgfQorICAgICgqb3V0U3VyZmFjZU1hcClbc3RyZWFtU3VyZmFjZUlkLnN0cmVhbUlkKCldLnB1c2hfYmFjayhzdHJlYW1TdXJmYWNlSWQuc3VyZmFjZUlkKCkpOworCisgICAgQUxPR1YoIiVzOiBDYW1lcmEgJXM6IEFwcGVuZGluZyBvdXRwdXQgc3RyZWFtICVkIHN1cmZhY2UgJWQgdG8gcmVxdWVzdCIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgc3RyZWFtU3VyZmFjZUlkLnN0cmVhbUlkKCksCisgICAgICAgICAgICBzdHJlYW1TdXJmYWNlSWQuc3VyZmFjZUlkKCkpOworCisgICAgaWYgKGN1cnJlbnRTdHJlYW1JZCAhPSBudWxscHRyKSB7CisgICAgICAgICpjdXJyZW50U3RyZWFtSWQgPSBzdHJlYW1TdXJmYWNlSWQuc3RyZWFtSWQoKTsKKyAgICB9CisKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKIGJpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6c3VibWl0UmVxdWVzdExpc3QoCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpjYW1lcmEyOjpDYXB0dXJlUmVxdWVzdD4mIHJlcXVlc3RzLAogICAgICAgICBib29sIHN0cmVhbWluZywKQEAgLTE0Nyw3ICsxOTQsNyBAQAogICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsICJFbXB0eSByZXF1ZXN0IGxpc3QiKTsKICAgICB9CiAKLSAgICBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiBtZXRhZGF0YVJlcXVlc3RMaXN0OworICAgIExpc3Q8Y29uc3QgQ2FtZXJhRGV2aWNlQmFzZTo6UGh5c2ljYWxDYW1lcmFTZXR0aW5nc0xpc3Q+IG1ldGFkYXRhUmVxdWVzdExpc3Q7CiAgICAgc3RkOjpsaXN0PGNvbnN0IFN1cmZhY2VNYXA+IHN1cmZhY2VNYXBMaXN0OwogICAgIHN1Ym1pdEluZm8tPm1SZXF1ZXN0SWQgPSBtUmVxdWVzdElkQ291bnRlcjsKICAgICB1aW50MzJfdCBsb29wQ291bnRlciA9IDA7CkBAIC0xNjUsNzUgKzIxMiwxNjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAogICAgICAgICAgICAgICAgICAgICAgICAgIlJlcGVhdGluZyByZXByb2Nlc3MgcmVxdWVzdHMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0Lm1QaHlzaWNhbENhbWVyYVNldHRpbmdzLnNpemUoKSA+IDEpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlczogcmVwcm9jZXNzIHJlcXVlc3RzIG5vdCBzdXBwb3J0ZWQgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJtdWx0aXBsZSBwaHlzaWNhbCBjYW1lcmFzLiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgIlJlcHJvY2VzcyByZXF1ZXN0cyBub3Qgc3VwcG9ydGVkIGZvciBtdWx0aXBsZSBjYW1lcmFzIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YShyZXF1ZXN0Lm1NZXRhZGF0YSk7Ci0gICAgICAgIGlmIChtZXRhZGF0YS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzOiBTZW50IGVtcHR5IG1ldGFkYXRhIHBhY2tldC4gUmVqZWN0aW5nIHJlcXVlc3QuIiwKLSAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CisgICAgICAgIGlmIChyZXF1ZXN0Lm1QaHlzaWNhbENhbWVyYVNldHRpbmdzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzOiByZXF1ZXN0IGRvZXNuJ3QgY29udGFpbiBhbnkgc2V0dGluZ3MuIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOwogICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAotICAgICAgICAgICAgICAgICAgICAiUmVxdWVzdCBzZXR0aW5ncyBhcmUgZW1wdHkiKTsKLSAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0Lm1TdXJmYWNlTGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgIlJlcXVlc3QgZG9lc24ndCBjb250YWluIGFueSBzZXR0aW5ncyIpOworICAgICAgICB9CisKKyAgICAgICAgLy9UaGUgZmlyc3QgY2FwdHVyZSBzZXR0aW5ncyBzaG91bGQgYWx3YXlzIG1hdGNoIHRoZSBsb2dpY2FsIGNhbWVyYSBpZAorICAgICAgICBTdHJpbmc4IGxvZ2ljYWxJZChyZXF1ZXN0Lm1QaHlzaWNhbENhbWVyYVNldHRpbmdzLmJlZ2luKCktPmlkLmNfc3RyKCkpOworICAgICAgICBpZiAobURldmljZS0+Z2V0SWQoKSAhPSBsb2dpY2FsSWQpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzOiBJbnZhbGlkIGNhbWVyYSByZXF1ZXN0IHNldHRpbmdzLiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgY2FtZXJhIHJlcXVlc3Qgc2V0dGluZ3MiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXF1ZXN0Lm1TdXJmYWNlTGlzdC5pc0VtcHR5KCkgJiYgcmVxdWVzdC5tU3RyZWFtSWR4TGlzdC5zaXplKCkgPT0gMCkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJXM6IFJlcXVlc3RzIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgc3VyZmFjZSB0YXJnZXQuICIKICAgICAgICAgICAgICAgICAgICAgIlJlamVjdGluZyByZXF1ZXN0LiIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkU3RyLnN0cmluZygpKTsKICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKICAgICAgICAgICAgICAgICAgICAgIlJlcXVlc3QgaGFzIG5vIG91dHB1dCB0YXJnZXRzIik7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIWVuZm9yY2VSZXF1ZXN0UGVybWlzc2lvbnMobWV0YWRhdGEpKSB7Ci0gICAgICAgICAgICAvLyBDYWxsZWUgbG9ncwotICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9QRVJNSVNTSU9OX0RFTklFRCwKLSAgICAgICAgICAgICAgICAgICAgIkNhbGxlciBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gY2hhbmdlIHJlc3RyaWN0ZWQgY29udHJvbHMiKTsKLSAgICAgICAgfQotCiAgICAgICAgIC8qKgogICAgICAgICAgKiBXcml0ZSBpbiB0aGUgb3V0cHV0IHN0cmVhbSBJRHMgYW5kIG1hcCBmcm9tIHN0cmVhbSBJRCB0byBzdXJmYWNlIElECiAgICAgICAgICAqIHdoaWNoIHdlIGNhbGN1bGF0ZSBmcm9tIHRoZSBjYXB0dXJlIHJlcXVlc3QncyBsaXN0IG9mIHN1cmZhY2UgdGFyZ2V0CiAgICAgICAgICAqLwogICAgICAgICBTdXJmYWNlTWFwIHN1cmZhY2VNYXA7CiAgICAgICAgIFZlY3RvcjxpbnQzMl90PiBvdXRwdXRTdHJlYW1JZHM7Ci0gICAgICAgIGZvciAoc3A8U3VyZmFjZT4gc3VyZmFjZSA6IHJlcXVlc3QubVN1cmZhY2VMaXN0KSB7Ci0gICAgICAgICAgICBpZiAoc3VyZmFjZSA9PSAwKSBjb250aW51ZTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlcXVlc3RlZFBoeXNpY2FsSWRzOworICAgICAgICBpZiAocmVxdWVzdC5tU3VyZmFjZUxpc3Quc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChzcDxTdXJmYWNlPiBzdXJmYWNlIDogcmVxdWVzdC5tU3VyZmFjZUxpc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3VyZmFjZSA9PSAwKSBjb250aW51ZTsKIAotICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2JwID0gc3VyZmFjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpOwotICAgICAgICAgICAgaW50IGlkeCA9IG1TdHJlYW1NYXAuaW5kZXhPZktleShJSW50ZXJmYWNlOjphc0JpbmRlcihnYnApKTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmVhbUlkOworICAgICAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGdicCA9IHN1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKTsKKyAgICAgICAgICAgICAgICByZXMgPSBpbnNlcnRHYnBMb2NrZWQoZ2JwLCAmc3VyZmFjZU1hcCwgJm91dHB1dFN0cmVhbUlkcywgJnN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBpZiAoIXJlcy5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIFRyeWluZyB0byBzdWJtaXQgcmVxdWVzdCB3aXRoIHN1cmZhY2UgdGhhdCB3YXNuJ3QgY3JlYXRlZAotICAgICAgICAgICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzOiBUcmllZCB0byBzdWJtaXQgYSByZXF1ZXN0IHdpdGggYSBzdXJmYWNlIHRoYXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAiIHdlIGhhdmUgbm90IGNhbGxlZCBjcmVhdGVTdHJlYW0gb24iLAorICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtQ29uZmlndXJlZE91dHB1dHMuaW5kZXhPZktleShzdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCByZXF1ZXN0ZWRQaHlzaWNhbElkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWd1cmVkT3V0cHV0cy52YWx1ZUF0KGluZGV4KS5nZXRQaHlzaWNhbENhbWVyYUlkKCkpOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRQaHlzaWNhbElkcy5wdXNoX2JhY2socmVxdWVzdGVkUGh5c2ljYWxJZC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBPdXRwdXQgc3RyZWFtIElkIG5vdCBmb3VuZCBhbW9uZyBjb25maWd1cmVkIG91dHB1dHMhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcXVlc3QubVN0cmVhbUlkeExpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgc3RyZWFtSWQgPSByZXF1ZXN0Lm1TdHJlYW1JZHhMaXN0Lml0ZW1BdChpKTsKKyAgICAgICAgICAgICAgICBpbnQgc3VyZmFjZUlkeCA9IHJlcXVlc3QubVN1cmZhY2VJZHhMaXN0Lml0ZW1BdChpKTsKKworICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtQ29uZmlndXJlZE91dHB1dHMuaW5kZXhPZktleShzdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlczogVHJpZWQgdG8gc3VibWl0IGEgcmVxdWVzdCB3aXRoIGEgc3VyZmFjZSB0aGF0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgd2UgaGF2ZSBub3QgY2FsbGVkIGNyZWF0ZVN0cmVhbSBvbjogc3RyZWFtICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgc3RyZWFtSWQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlcXVlc3QgdGFyZ2V0cyBTdXJmYWNlIHRoYXQgaXMgbm90IHBhcnQgb2YgY3VycmVudCBjYXB0dXJlIHNlc3Npb24iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvJiBnYnBzID0gbUNvbmZpZ3VyZWRPdXRwdXRzLnZhbHVlQXQoaW5kZXgpLmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcnMoKTsKKyAgICAgICAgICAgICAgICBpZiAoKHNpemVfdClzdXJmYWNlSWR4ID49IGdicHMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzOiBUcmllZCB0byBzdWJtaXQgYSByZXF1ZXN0IHdpdGggYSBzdXJmYWNlIHRoYXQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3ZSBoYXZlIG5vdCBjYWxsZWQgY3JlYXRlU3RyZWFtIG9uOiBzdHJlYW0gJWQsIHN1cmZhY2VJZHggJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBzdHJlYW1JZCwgc3VyZmFjZUlkeCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVxdWVzdCB0YXJnZXRzIFN1cmZhY2UgaGFzIGludmFsaWQgc3VyZmFjZSBpbmRleCIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJlcyA9IGluc2VydEdicExvY2tlZChnYnBzW3N1cmZhY2VJZHhdLCAmc3VyZmFjZU1hcCwgJm91dHB1dFN0cmVhbUlkcywgbnVsbHB0cik7CisgICAgICAgICAgICAgICAgaWYgKCFyZXMuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU3RyaW5nOCByZXF1ZXN0ZWRQaHlzaWNhbElkKAorICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZ3VyZWRPdXRwdXRzLnZhbHVlQXQoaW5kZXgpLmdldFBoeXNpY2FsQ2FtZXJhSWQoKSk7CisgICAgICAgICAgICAgICAgcmVxdWVzdGVkUGh5c2ljYWxJZHMucHVzaF9iYWNrKHJlcXVlc3RlZFBoeXNpY2FsSWQuc3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQ2FtZXJhRGV2aWNlQmFzZTo6UGh5c2ljYWxDYW1lcmFTZXR0aW5nc0xpc3QgcGh5c2ljYWxTZXR0aW5nc0xpc3Q7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiByZXF1ZXN0Lm1QaHlzaWNhbENhbWVyYVNldHRpbmdzKSB7CisgICAgICAgICAgICBpZiAoaXQuc2V0dGluZ3MuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJXM6IFNlbnQgZW1wdHkgbWV0YWRhdGEgcGFja2V0LiBSZWplY3RpbmcgcmVxdWVzdC4iLAogICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJSZXF1ZXN0IHRhcmdldHMgU3VyZmFjZSB0aGF0IGlzIG5vdCBwYXJ0IG9mIGN1cnJlbnQgY2FwdHVyZSBzZXNzaW9uIik7CisgICAgICAgICAgICAgICAgICAgICAgICAiUmVxdWVzdCBzZXR0aW5ncyBhcmUgZW1wdHkiKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY29uc3QgU3RyZWFtU3VyZmFjZUlkJiBzdHJlYW1TdXJmYWNlSWQgPSBtU3RyZWFtTWFwLnZhbHVlQXQoaWR4KTsKLSAgICAgICAgICAgIGlmIChzdXJmYWNlTWFwLmZpbmQoc3RyZWFtU3VyZmFjZUlkLnN0cmVhbUlkKCkpID09IHN1cmZhY2VNYXAuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICBzdXJmYWNlTWFwW3N0cmVhbVN1cmZhY2VJZC5zdHJlYW1JZCgpXSA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKTsKLSAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW1JZHMucHVzaF9iYWNrKHN0cmVhbVN1cmZhY2VJZC5zdHJlYW1JZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN1cmZhY2VNYXBbc3RyZWFtU3VyZmFjZUlkLnN0cmVhbUlkKCldLnB1c2hfYmFjayhzdHJlYW1TdXJmYWNlSWQuc3VyZmFjZUlkKCkpOworICAgICAgICAgICAgU3RyaW5nOCBwaHlzaWNhbElkKGl0LmlkLmNfc3RyKCkpOworICAgICAgICAgICAgaWYgKHBoeXNpY2FsSWQgIT0gbURldmljZS0+Z2V0SWQoKSkgeworICAgICAgICAgICAgICAgIGF1dG8gZm91bmQgPSBzdGQ6OmZpbmQocmVxdWVzdGVkUGh5c2ljYWxJZHMuYmVnaW4oKSwgcmVxdWVzdGVkUGh5c2ljYWxJZHMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICBpdC5pZCk7CisgICAgICAgICAgICAgICAgaWYgKGZvdW5kID09IHJlcXVlc3RlZFBoeXNpY2FsSWRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzOiBQaHlzaWNhbCBjYW1lcmEgaWQ6ICVzIG5vdCBwYXJ0IG9mIGF0dGFjaGVkIG91dHB1dHMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgcGh5c2ljYWxJZC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBwaHlzaWNhbCBjYW1lcmEgaWQiKTsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVzOiBBcHBlbmRpbmcgb3V0cHV0IHN0cmVhbSAlZCBzdXJmYWNlICVkIHRvIHJlcXVlc3QiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgc3RyZWFtU3VyZmFjZUlkLnN0cmVhbUlkKCksCi0gICAgICAgICAgICAgICAgICAgIHN0cmVhbVN1cmZhY2VJZC5zdXJmYWNlSWQoKSk7CisgICAgICAgICAgICAgICAgaWYgKCFtU3VwcG9ydGVkUGh5c2ljYWxSZXF1ZXN0S2V5cy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZpbHRlciBvdXQgYW55IHVuc3VwcG9ydGVkIHBoeXNpY2FsIHJlcXVlc3Qga2V5cy4KKyAgICAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgZmlsdGVyZWRQYXJhbXMobVN1cHBvcnRlZFBoeXNpY2FsUmVxdWVzdEtleXMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QgKm1ldGEgPSBjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90ICo+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkUGFyYW1zLmdldEFuZExvY2soKSk7CisgICAgICAgICAgICAgICAgICAgIHNldF9jYW1lcmFfbWV0YWRhdGFfdmVuZG9yX2lkKG1ldGEsIG1EZXZpY2UtPmdldFZlbmRvclRhZ0lkKCkpOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZFBhcmFtcy51bmxvY2sobWV0YSk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBrZXlJdCA6IG1TdXBwb3J0ZWRQaHlzaWNhbFJlcXVlc3RLZXlzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgZW50cnkgPSBpdC5zZXR0aW5ncy5maW5kKGtleUl0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZFBhcmFtcy51cGRhdGUoZW50cnkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxTZXR0aW5nc0xpc3QucHVzaF9iYWNrKHtpdC5pZCwgZmlsdGVyZWRQYXJhbXN9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBoeXNpY2FsU2V0dGluZ3NMaXN0LnB1c2hfYmFjayh7aXQuaWQsIGl0LnNldHRpbmdzfSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBtZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX09VVFBVVF9TVFJFQU1TLCAmb3V0cHV0U3RyZWFtSWRzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtSWRzLnNpemUoKSk7CisgICAgICAgIGlmICghZW5mb3JjZVJlcXVlc3RQZXJtaXNzaW9ucyhwaHlzaWNhbFNldHRpbmdzTGlzdC5iZWdpbigpLT5tZXRhZGF0YSkpIHsKKyAgICAgICAgICAgIC8vIENhbGxlZSBsb2dzCisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX1BFUk1JU1NJT05fREVOSUVELAorICAgICAgICAgICAgICAgICAgICAiQ2FsbGVyIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBjaGFuZ2UgcmVzdHJpY3RlZCBjb250cm9scyIpOworICAgICAgICB9CisKKyAgICAgICAgcGh5c2ljYWxTZXR0aW5nc0xpc3QuYmVnaW4oKS0+bWV0YWRhdGEudXBkYXRlKEFORFJPSURfUkVRVUVTVF9PVVRQVVRfU1RSRUFNUywKKyAgICAgICAgICAgICAgICAmb3V0cHV0U3RyZWFtSWRzWzBdLCBvdXRwdXRTdHJlYW1JZHMuc2l6ZSgpKTsKIAogICAgICAgICBpZiAocmVxdWVzdC5tSXNSZXByb2Nlc3MpIHsKLSAgICAgICAgICAgIG1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfSU5QVVRfU1RSRUFNUywgJm1JbnB1dFN0cmVhbS5pZCwgMSk7CisgICAgICAgICAgICBwaHlzaWNhbFNldHRpbmdzTGlzdC5iZWdpbigpLT5tZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0lOUFVUX1NUUkVBTVMsCisgICAgICAgICAgICAgICAgICAgICZtSW5wdXRTdHJlYW0uaWQsIDEpOwogICAgICAgICB9CiAKLSAgICAgICAgbWV0YWRhdGEudXBkYXRlKEFORFJPSURfUkVRVUVTVF9JRCwgJihzdWJtaXRJbmZvLT5tUmVxdWVzdElkKSwgLypzaXplKi8xKTsKKyAgICAgICAgcGh5c2ljYWxTZXR0aW5nc0xpc3QuYmVnaW4oKS0+bWV0YWRhdGEudXBkYXRlKEFORFJPSURfUkVRVUVTVF9JRCwKKyAgICAgICAgICAgICAgICAmKHN1Ym1pdEluZm8tPm1SZXF1ZXN0SWQpLCAvKnNpemUqLzEpOwogICAgICAgICBsb29wQ291bnRlcisrOyAvLyBsb29wQ291bnRlciBzdGFydHMgZnJvbSAxCiAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVzOiBDcmVhdGluZyByZXF1ZXN0IHdpdGggSUQgJWQgKCVkIG9mICV6dSkiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBzdWJtaXRJbmZvLT5tUmVxdWVzdElkLAogICAgICAgICAgICAgICAgIGxvb3BDb3VudGVyLCByZXF1ZXN0cy5zaXplKCkpOwogCi0gICAgICAgIG1ldGFkYXRhUmVxdWVzdExpc3QucHVzaF9iYWNrKG1ldGFkYXRhKTsKKyAgICAgICAgbWV0YWRhdGFSZXF1ZXN0TGlzdC5wdXNoX2JhY2socGh5c2ljYWxTZXR0aW5nc0xpc3QpOwogICAgICAgICBzdXJmYWNlTWFwTGlzdC5wdXNoX2JhY2soc3VyZmFjZU1hcCk7CiAgICAgfQogICAgIG1SZXF1ZXN0SWRDb3VudGVyKys7CkBAIC0zMTgsNyArNDUzLDggQEAKICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiB9CiAKLWJpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6ZW5kQ29uZmlndXJlKGludCBvcGVyYXRpbmdNb2RlKSB7CitiaW5kZXI6OlN0YXR1cyBDYW1lcmFEZXZpY2VDbGllbnQ6OmVuZENvbmZpZ3VyZShpbnQgb3BlcmF0aW5nTW9kZSwKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTI6OmltcGw6OkNhbWVyYU1ldGFkYXRhTmF0aXZlJiBzZXNzaW9uUGFyYW1zKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXM6IGVuZGluZyBjb25maWd1cmUgKCVkIGlucHV0IHN0cmVhbSwgJXp1IG91dHB1dCBzdXJmYWNlcykiLAogICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSW5wdXRTdHJlYW0uY29uZmlndXJlZCA/IDEgOiAwLApAQCAtMzY0LDcgKzUwMCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzdGF0dXNfdCBlcnIgPSBtRGV2aWNlLT5jb25maWd1cmVTdHJlYW1zKG9wZXJhdGluZ01vZGUpOworICAgIHN0YXR1c190IGVyciA9IG1EZXZpY2UtPmNvbmZpZ3VyZVN0cmVhbXMoc2Vzc2lvblBhcmFtcywgb3BlcmF0aW5nTW9kZSk7CiAgICAgaWYgKGVyciA9PSBCQURfVkFMVUUpIHsKICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogVW5zdXBwb3J0ZWQgc2V0IG9mIGlucHV0cy9vdXRwdXRzIHByb3ZpZGVkIiwKICAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOwpAQCAtNDM5LDYgKzU3NSw4IEBACiAgICAgICAgICAgICAgICAgbVN0cmVhbU1hcC5yZW1vdmVJdGVtKHN1cmZhY2UpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBtQ29uZmlndXJlZE91dHB1dHMucmVtb3ZlSXRlbShzdHJlYW1JZCk7CisKICAgICAgICAgICAgIGlmIChkSW5kZXggIT0gTkFNRV9OT1RfRk9VTkQpIHsKICAgICAgICAgICAgICAgICBtRGVmZXJyZWRTdHJlYW1zLnJlbW92ZUl0ZW1zQXQoZEluZGV4KTsKICAgICAgICAgICAgIH0KQEAgLTQ2NCw2ICs2MDIsNyBAQAogICAgIHNpemVfdCBudW1CdWZmZXJQcm9kdWNlcnMgPSBidWZmZXJQcm9kdWNlcnMuc2l6ZSgpOwogICAgIGJvb2wgZGVmZXJyZWRDb25zdW1lciA9IG91dHB1dENvbmZpZ3VyYXRpb24uaXNEZWZlcnJlZCgpOwogICAgIGJvb2wgaXNTaGFyZWQgPSBvdXRwdXRDb25maWd1cmF0aW9uLmlzU2hhcmVkKCk7CisgICAgU3RyaW5nOCBwaHlzaWNhbENhbWVyYUlkID0gU3RyaW5nOChvdXRwdXRDb25maWd1cmF0aW9uLmdldFBoeXNpY2FsQ2FtZXJhSWQoKSk7CiAKICAgICBpZiAobnVtQnVmZmVyUHJvZHVjZXJzID4gTUFYX1NVUkZBQ0VTX1BFUl9TVFJFQU0pIHsKICAgICAgICAgQUxPR0UoIiVzOiBHcmFwaGljQnVmZmVyUHJvZHVjZXIgY291bnQgJXp1IGZvciBzdHJlYW0gZXhjZWVkcyBsaW1pdCBvZiAlZCIsCkBAIC00ODUsNiArNjI0LDEyIEBACiAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVELCAiQ2FtZXJhIGRldmljZSBubyBsb25nZXIgYWxpdmUiKTsKICAgICB9CiAKKyAgICBpZiAoIWNoZWNrUGh5c2ljYWxDYW1lcmFJZChwaHlzaWNhbENhbWVyYUlkKSkgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBDYW1lcmEgZG9lc24ndCBzdXBwb3J0IHBoeXNpY2FsQ2FtZXJhSWQgJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBwaHlzaWNhbENhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOworICAgIH0KICAgICBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4gc3VyZmFjZXM7CiAgICAgc3RkOjp2ZWN0b3I8c3A8SUJpbmRlcj4+IGJpbmRlcnM7CiAgICAgc3RhdHVzX3QgZXJyOwpAQCAtNTE0LDE0ICs2NTksNiBAQAogICAgICAgICAgICAgcmV0dXJuIHJlczsKIAogICAgICAgICBpZiAoIWlzU3RyZWFtSW5mb1ZhbGlkKSB7Ci0gICAgICAgICAgICAvLyBTdHJlYW1pbmcgc2hhcmluZyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgSU1QTEVNRU5UQVRJT05fREVGSU5FRAotICAgICAgICAgICAgLy8gZm9ybWF0cy4KLSAgICAgICAgICAgIGlmIChpc1NoYXJlZCAmJiBzdHJlYW1JbmZvLmZvcm1hdCAhPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBTdHJlYW0gc2hhcmluZyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgIklNUExFTUVOVEFUSU9OX0RFRklORUQgZm9ybWF0IiwgbUNhbWVyYUlkU3RyLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICBBTE9HVygiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlzU3RyZWFtSW5mb1ZhbGlkID0gdHJ1ZTsKICAgICAgICAgfQogCkBAIC01MzAsMTAgKzY2NywxMiBAQAogICAgIH0KIAogICAgIGludCBzdHJlYW1JZCA9IGNhbWVyYTM6OkNBTUVSQTNfU1RSRUFNX0lEX0lOVkFMSUQ7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBzdXJmYWNlSWRzOwogICAgIGVyciA9IG1EZXZpY2UtPmNyZWF0ZVN0cmVhbShzdXJmYWNlcywgZGVmZXJyZWRDb25zdW1lciwgc3RyZWFtSW5mby53aWR0aCwKICAgICAgICAgICAgIHN0cmVhbUluZm8uaGVpZ2h0LCBzdHJlYW1JbmZvLmZvcm1hdCwgc3RyZWFtSW5mby5kYXRhU3BhY2UsCiAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90PihvdXRwdXRDb25maWd1cmF0aW9uLmdldFJvdGF0aW9uKCkpLAotICAgICAgICAgICAgJnN0cmVhbUlkLCBvdXRwdXRDb25maWd1cmF0aW9uLmdldFN1cmZhY2VTZXRJRCgpLCBpc1NoYXJlZCk7CisgICAgICAgICAgICAmc3RyZWFtSWQsIHBoeXNpY2FsQ2FtZXJhSWQsICZzdXJmYWNlSWRzLCBvdXRwdXRDb25maWd1cmF0aW9uLmdldFN1cmZhY2VTZXRJRCgpLAorICAgICAgICAgICAgaXNTaGFyZWQpOwogCiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICByZXMgPSBTVEFUVVNfRVJST1JfRk1UKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLApAQCAtNTQ1LDkgKzY4NCwxMSBAQAogICAgICAgICBmb3IgKGF1dG8mIGJpbmRlciA6IGJpbmRlcnMpIHsKICAgICAgICAgICAgIEFMT0dWKCIlczogbVN0cmVhbU1hcCBhZGQgYmluZGVyICVwIHN0cmVhbUlkICVkLCBzdXJmYWNlSWQgJWQiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJpbmRlci5nZXQoKSwgc3RyZWFtSWQsIGkpOwotICAgICAgICAgICAgbVN0cmVhbU1hcC5hZGQoYmluZGVyLCBTdHJlYW1TdXJmYWNlSWQoc3RyZWFtSWQsIGkrKykpOworICAgICAgICAgICAgbVN0cmVhbU1hcC5hZGQoYmluZGVyLCBTdHJlYW1TdXJmYWNlSWQoc3RyZWFtSWQsIHN1cmZhY2VJZHNbaV0pKTsKKyAgICAgICAgICAgIGkrKzsKICAgICAgICAgfQogCisgICAgICAgIG1Db25maWd1cmVkT3V0cHV0cy5hZGQoc3RyZWFtSWQsIG91dHB1dENvbmZpZ3VyYXRpb24pOwogICAgICAgICBtU3RyZWFtSW5mb01hcFtzdHJlYW1JZF0gPSBzdHJlYW1JbmZvOwogCiAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVzOiBTdWNjZXNzZnVsbHkgY3JlYXRlZCBhIG5ldyBzdHJlYW0gSUQgJWQgZm9yIG91dHB1dCBzdXJmYWNlIgpAQCAtNTkyLDEwICs3MzMsMTQgQEAKICAgICB9CiAgICAgaW50IHN0cmVhbUlkID0gY2FtZXJhMzo6Q0FNRVJBM19TVFJFQU1fSURfSU5WQUxJRDsKICAgICBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4gbm9TdXJmYWNlOworICAgIHN0ZDo6dmVjdG9yPGludD4gc3VyZmFjZUlkczsKKyAgICBTdHJpbmc4IHBoeXNpY2FsQ2FtZXJhSWQob3V0cHV0Q29uZmlndXJhdGlvbi5nZXRQaHlzaWNhbENhbWVyYUlkKCkpOwogICAgIGVyciA9IG1EZXZpY2UtPmNyZWF0ZVN0cmVhbShub1N1cmZhY2UsIC8qaGFzRGVmZXJyZWRDb25zdW1lciovdHJ1ZSwgd2lkdGgsCiAgICAgICAgICAgICBoZWlnaHQsIGZvcm1hdCwgZGF0YVNwYWNlLAogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2FtZXJhM19zdHJlYW1fcm90YXRpb25fdD4ob3V0cHV0Q29uZmlndXJhdGlvbi5nZXRSb3RhdGlvbigpKSwKLSAgICAgICAgICAgICZzdHJlYW1JZCwgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTdXJmYWNlU2V0SUQoKSwgaXNTaGFyZWQsIGNvbnN1bWVyVXNhZ2UpOworICAgICAgICAgICAgJnN0cmVhbUlkLCBwaHlzaWNhbENhbWVyYUlkLCAmc3VyZmFjZUlkcywKKyAgICAgICAgICAgIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U3VyZmFjZVNldElEKCksIGlzU2hhcmVkLAorICAgICAgICAgICAgY29uc3VtZXJVc2FnZSk7CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUl9GTVQoQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04sCkBAIC02NjgsNyArODEzLDcgQEAKIAogICAgIGlmIChtSW5wdXRTdHJlYW0uY29uZmlndXJlZCkgewogICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBBbHJlYWR5IGhhcyBhbiBpbnB1dCBzdHJlYW0gIgotICAgICAgICAgICAgICAgICJjb25maWd1cmVkIChJRCAlemQpIiwgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBtSW5wdXRTdHJlYW0uaWQpOworICAgICAgICAgICAgICAgICJjb25maWd1cmVkIChJRCAlZCkiLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIG1JbnB1dFN0cmVhbS5pZCk7CiAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSApOwogICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0FMUkVBRFlfRVhJU1RTLCBtc2cuc3RyaW5nKCkpOwogICAgIH0KQEAgLTcyMSw2ICs4NjYsMTI0IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAorYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50Ojp1cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uKGludCBzdHJlYW1JZCwKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTI6OnBhcmFtczo6T3V0cHV0Q29uZmlndXJhdGlvbiAmb3V0cHV0Q29uZmlndXJhdGlvbikgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICBiaW5kZXI6OlN0YXR1cyByZXM7CisgICAgaWYgKCEocmVzID0gY2hlY2tQaWRTdGF0dXMoX19GVU5DVElPTl9fKSkuaXNPaygpKSByZXR1cm4gcmVzOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOworCisgICAgaWYgKCFtRGV2aWNlLmdldCgpKSB7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVELCAiQ2FtZXJhIGRldmljZSBubyBsb25nZXIgYWxpdmUiKTsKKyAgICB9CisKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiA+JiBidWZmZXJQcm9kdWNlcnMgPQorICAgICAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRHcmFwaGljQnVmZmVyUHJvZHVjZXJzKCk7CisgICAgYXV0byBwcm9kdWNlckNvdW50ID0gYnVmZmVyUHJvZHVjZXJzLnNpemUoKTsKKyAgICBpZiAocHJvZHVjZXJDb3VudCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogYnVmZmVyUHJvZHVjZXJzIG11c3Qgbm90IGJlIGVtcHR5IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAorICAgICAgICAgICAgICAgICJidWZmZXJQcm9kdWNlcnMgbXVzdCBub3QgYmUgZW1wdHkiKTsKKyAgICB9CisKKyAgICAvLyBUaGUgZmlyc3Qgb3V0cHV0IGlzIHRoZSBvbmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBvdXRwdXQgY29uZmlndXJhdGlvbi4KKyAgICAvLyBJdCBzaG91bGQgYWx3YXlzIGJlIHByZXNlbnQsIHZhbGlkIGFuZCB0aGUgY29ycmVzcG9uZGluZyBzdHJlYW0gaWQgc2hvdWxkIG1hdGNoLgorICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKGJ1ZmZlclByb2R1Y2Vyc1swXSk7CisgICAgc3NpemVfdCBpbmRleCA9IG1TdHJlYW1NYXAuaW5kZXhPZktleShiaW5kZXIpOworICAgIGlmIChpbmRleCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBBTE9HRSgiJXM6IE91dHB1dGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKKyAgICAgICAgICAgICAgICAiT3V0cHV0Q29uZmlndXJhdGlvbiBpcyBpbnZhbGlkIik7CisgICAgfQorICAgIGlmIChtU3RyZWFtTWFwLnZhbHVlRm9yKGJpbmRlcikuc3RyZWFtSWQoKSAhPSBzdHJlYW1JZCkgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSBJZDogJWQgcHJvdmlkZWQgZG9lc24ndCBtYXRjaCB0aGUgaWQ6ICVkIGluIHRoZSBzdHJlYW0gbWFwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBtU3RyZWFtTWFwLnZhbHVlRm9yKGJpbmRlcikuc3RyZWFtSWQoKSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKKyAgICAgICAgICAgICAgICAiU3RyZWFtIGlkIGlzIGludmFsaWQiKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+IHJlbW92ZWRTdXJmYWNlSWRzOworICAgIHN0ZDo6dmVjdG9yPHNwPElCaW5kZXI+PiByZW1vdmVkT3V0cHV0czsKKyAgICBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4gbmV3T3V0cHV0czsKKyAgICBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW1JbmZvPiBzdHJlYW1JbmZvczsKKyAgICBLZXllZFZlY3RvcjxzcDxJQmluZGVyPiwgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4+IG5ld091dHB1dHNNYXA7CisgICAgZm9yIChhdXRvICZpdCA6IGJ1ZmZlclByb2R1Y2VycykgeworICAgICAgICBuZXdPdXRwdXRzTWFwLmFkZChJSW50ZXJmYWNlOjphc0JpbmRlcihpdCksIGl0KTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdHJlYW1NYXAuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3NpemVfdCBpZHggPSBuZXdPdXRwdXRzTWFwLmluZGV4T2ZLZXkobVN0cmVhbU1hcC5rZXlBdChpKSk7CisgICAgICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgIGlmIChtU3RyZWFtTWFwW2ldLnN0cmVhbUlkKCkgPT0gc3RyZWFtSWQpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVkU3VyZmFjZUlkcy5wdXNoX2JhY2sobVN0cmVhbU1hcFtpXS5zdXJmYWNlSWQoKSk7CisgICAgICAgICAgICAgICAgcmVtb3ZlZE91dHB1dHMucHVzaF9iYWNrKG1TdHJlYW1NYXAua2V5QXQoaSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1TdHJlYW1NYXBbaV0uc3RyZWFtSWQoKSAhPSBzdHJlYW1JZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogT3V0cHV0IHN1cmZhY2UgYWxyZWFkeSBwYXJ0IG9mIGEgZGlmZmVyZW50IHN0cmVhbSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgIlRhcmdldCBTdXJmYWNlIGlzIGludmFsaWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5ld091dHB1dHNNYXAucmVtb3ZlSXRlbXNBdChpZHgpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZXdPdXRwdXRzTWFwLnNpemUoKTsgaSsrKSB7CisgICAgICAgIE91dHB1dFN0cmVhbUluZm8gb3V0SW5mbzsKKyAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKKyAgICAgICAgcmVzID0gY3JlYXRlU3VyZmFjZUZyb21HYnAob3V0SW5mbywgLyppc1N0cmVhbUluZm9WYWxpZCovIGZhbHNlLCBzdXJmYWNlLAorICAgICAgICAgICAgICAgIG5ld091dHB1dHNNYXAudmFsdWVBdChpKSk7CisgICAgICAgIGlmICghcmVzLmlzT2soKSkKKyAgICAgICAgICAgIHJldHVybiByZXM7CisKKyAgICAgICAgc3RyZWFtSW5mb3MucHVzaF9iYWNrKG91dEluZm8pOworICAgICAgICBuZXdPdXRwdXRzLnB1c2hfYmFjayhzdXJmYWNlKTsKKyAgICB9CisKKyAgICAvL1RyaXZpYWwgY2FzZSBubyBjaGFuZ2VzIHJlcXVpcmVkCisgICAgaWYgKHJlbW92ZWRTdXJmYWNlSWRzLmVtcHR5KCkgJiYgbmV3T3V0cHV0cy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKKyAgICB9CisKKyAgICBLZXllZFZlY3RvcjxzcDxTdXJmYWNlPiwgc2l6ZV90PiBvdXRwdXRNYXA7CisgICAgYXV0byByZXQgPSBtRGV2aWNlLT51cGRhdGVTdHJlYW0oc3RyZWFtSWQsIG5ld091dHB1dHMsIHN0cmVhbUluZm9zLCByZW1vdmVkU3VyZmFjZUlkcywKKyAgICAgICAgICAgICZvdXRwdXRNYXApOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgc3dpdGNoIChyZXQpIHsKKyAgICAgICAgICAgIGNhc2UgTkFNRV9OT1RfRk9VTkQ6CisgICAgICAgICAgICBjYXNlIEJBRF9WQUxVRToKKyAgICAgICAgICAgIGNhc2UgLUVCVVNZOgorICAgICAgICAgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUl9GTVQoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW1lcmEgJXM6IEVycm9yIHVwZGF0aW5nIHN0cmVhbTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIHN0cmVycm9yKHJldCksIHJldCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUl9GTVQoQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhICVzOiBFcnJvciB1cGRhdGluZyBzdHJlYW06ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBzdHJlcnJvcihyZXQpLCByZXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IHJlbW92ZWRPdXRwdXRzKSB7CisgICAgICAgICAgICBtU3RyZWFtTWFwLnJlbW92ZUl0ZW0oaXQpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRNYXAuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG1TdHJlYW1NYXAuYWRkKElJbnRlcmZhY2U6OmFzQmluZGVyKG91dHB1dE1hcC5rZXlBdChpKS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpKSwKKyAgICAgICAgICAgICAgICAgICAgU3RyZWFtU3VyZmFjZUlkKHN0cmVhbUlkLCBvdXRwdXRNYXAudmFsdWVBdChpKSkpOworICAgICAgICB9CisKKyAgICAgICAgbUNvbmZpZ3VyZWRPdXRwdXRzLnJlcGxhY2VWYWx1ZUZvcihzdHJlYW1JZCwgb3V0cHV0Q29uZmlndXJhdGlvbik7CisKKyAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJXM6IFN1Y2Nlc3NmdWwgc3RyZWFtIElEICVkIHVwZGF0ZSIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgc3RyZWFtSWQpOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKIGJvb2wgQ2FtZXJhRGV2aWNlQ2xpZW50Ojppc1B1YmxpY0Zvcm1hdChpbnQzMl90IGZvcm1hdCkKIHsKICAgICBzd2l0Y2goZm9ybWF0KSB7CkBAIC03MzksMTAgKzEwMDIsNiBAQAogICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQkxPQjoKICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ6CiAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4OgotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyXzg4ODoKLSAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQ0NF84ODg6Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9GTEVYX1JHQl84ODg6Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9GTEVYX1JHQkFfODg4ODoKICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMl9TUDoKICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUDoKICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMl9JOgpAQCAtODIwLDkgKzEwNzksMTAgQEAKICAgICB9CiAKICAgICAvLyBGSVhNRTogcmVtb3ZlIHRoaXMgb3ZlcnJpZGUgc2luY2UgdGhlIGRlZmF1bHQgZm9ybWF0IHNob3VsZCBiZQotICAgIC8vICAgICAgIElNUExFTUVOVEFUSU9OX0RFRklORUQuIGIvOTQ4NzQ4MgotICAgIGlmIChmb3JtYXQgPj0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODggJiYKLSAgICAgICAgZm9ybWF0IDw9IEhBTF9QSVhFTF9GT1JNQVRfQkdSQV84ODg4KSB7CisgICAgLy8gICAgICAgSU1QTEVNRU5UQVRJT05fREVGSU5FRC4gYi85NDg3NDgyICYgYi8zNTMxNzk0NAorICAgIGlmICgoZm9ybWF0ID49IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4ICYmIGZvcm1hdCA8PSBIQUxfUElYRUxfRk9STUFUX0JHUkFfODg4OCkgJiYKKyAgICAgICAgICAgICgoY29uc3VtZXJVc2FnZSAmIEdSQUxMT0NfVVNBR0VfSFdfTUFTSykgJiYKKyAgICAgICAgICAgICAoKGNvbnN1bWVyVXNhZ2UgJiBHUkFMTE9DX1VTQUdFX1NXX1JFQURfTUFTSykgPT0gMCkpKSB7CiAgICAgICAgIEFMT0dXKCIlczogQ2FtZXJhICVzOiBPdmVycmlkaW5nIGZvcm1hdCAlI3ggdG8gSU1QTEVNRU5UQVRJT05fREVGSU5FRCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIGZvcm1hdCk7CiAgICAgICAgIGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKQEAgLTg4NCw2ICsxMTQ0LDQzIEBACiAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwogfQogCitib29sIENhbWVyYURldmljZUNsaWVudDo6Y2hlY2tQaHlzaWNhbENhbWVyYUlkKGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQpIHsKKyAgICBpZiAoMCA9PSBwaHlzaWNhbENhbWVyYUlkLnNpemUoKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBDYW1lcmFNZXRhZGF0YSBzdGF0aWNJbmZvID0gbURldmljZS0+aW5mbygpOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5Q2FwOworICAgIGJvb2wgaXNMb2dpY2FsQ2FtID0gZmFsc2U7CisKKyAgICBlbnRyeUNhcCA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeUNhcC5jb3VudDsgKytpKSB7CisgICAgICAgIHVpbnQ4X3QgY2FwYWJpbGl0eSA9IGVudHJ5Q2FwLmRhdGEudThbaV07CisgICAgICAgIGlmIChjYXBhYmlsaXR5ID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0xPR0lDQUxfTVVMVElfQ0FNRVJBKSB7CisgICAgICAgICAgICBpc0xvZ2ljYWxDYW0gPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIGlmICghaXNMb2dpY2FsQ2FtKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeUlkcyA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1BIWVNJQ0FMX0lEUyk7CisgICAgY29uc3QgdWludDhfdCogaWRzID0gZW50cnlJZHMuZGF0YS51ODsKKyAgICBzaXplX3Qgc3RhcnQgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnlJZHMuY291bnQ7ICsraSkgeworICAgICAgICBpZiAoaWRzW2ldID09ICdcMCcpIHsKKyAgICAgICAgICAgIGlmIChzdGFydCAhPSBpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nOCBjdXJyZW50SWQoKGNvbnN0IGNoYXIqKWlkcytzdGFydCk7CisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJZCA9PSBwaHlzaWNhbENhbWVyYUlkKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXJ0ID0gaSsxOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwogYm9vbCBDYW1lcmFEZXZpY2VDbGllbnQ6OnJvdW5kQnVmZmVyRGltZW5zaW9uTmVhcmVzdChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKICAgICAgICAgaW50MzJfdCBmb3JtYXQsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGluZm8sCiAgICAgICAgIC8qb3V0Ki9pbnQzMl90KiBvdXRXaWR0aCwgLypvdXQqL2ludDMyX3QqIG91dEhlaWdodCkgewpAQCAtMTI0MiwxNSArMTUzOSwxMiBAQAogICAgIH0KIAogICAgIHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiBjb25zdW1lclN1cmZhY2VzOwotICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gY29uc3VtZXJTdXJmYWNlSWRzOwotICAgIHNpemVfdCBzdXJmYWNlSWQgPSAwOwogICAgIGZvciAoYXV0byYgYnVmZmVyUHJvZHVjZXIgOiBidWZmZXJQcm9kdWNlcnMpIHsKICAgICAgICAgLy8gRG9uJ3QgY3JlYXRlIG11bHRpcGxlIHN0cmVhbXMgZm9yIHRoZSBzYW1lIHRhcmdldCBzdXJmYWNlCiAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtU3RyZWFtTWFwLmluZGV4T2ZLZXkoSUludGVyZmFjZTo6YXNCaW5kZXIoYnVmZmVyUHJvZHVjZXIpKTsKICAgICAgICAgaWYgKGluZGV4ICE9IE5BTUVfTk9UX0ZPVU5EKSB7CiAgICAgICAgICAgICBBTE9HVigiQ2FtZXJhICVzOiBTdXJmYWNlIGFscmVhZHkgaGFzIGEgc3RyZWFtIGNyZWF0ZWQgIgogICAgICAgICAgICAgICAgICAgICAiIGZvciBpdCAoSUQgJXpkKSIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgaW5kZXgpOwotICAgICAgICAgICAgc3VyZmFjZUlkKys7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCkBAIC0xMjYyLDggKzE1NTYsNiBAQAogICAgICAgICAgICAgcmV0dXJuIHJlczsKIAogICAgICAgICBjb25zdW1lclN1cmZhY2VzLnB1c2hfYmFjayhzdXJmYWNlKTsKLSAgICAgICAgY29uc3VtZXJTdXJmYWNlSWRzLnB1c2hfYmFjayhzdXJmYWNlSWQpOwotICAgICAgICBzdXJmYWNlSWQrKzsKICAgICB9CiAKICAgICAvLyBHcmFjZWZ1bGx5IGhhbmRsZSBjYXNlIHdoZXJlIGZpbmFsaXplT3V0cHV0Q29uZmlndXJhdGlvbnMgaXMgY2FsbGVkCkBAIC0xMjc1LDEyICsxNTY3LDEzIEBACiAKICAgICAvLyBGaW5pc2ggdGhlIGRlZmVycmVkIHN0cmVhbSBjb25maWd1cmF0aW9uIHdpdGggdGhlIHN1cmZhY2UuCiAgICAgc3RhdHVzX3QgZXJyOwotICAgIGVyciA9IG1EZXZpY2UtPnNldENvbnN1bWVyU3VyZmFjZXMoc3RyZWFtSWQsIGNvbnN1bWVyU3VyZmFjZXMpOworICAgIHN0ZDo6dmVjdG9yPGludD4gY29uc3VtZXJTdXJmYWNlSWRzOworICAgIGVyciA9IG1EZXZpY2UtPnNldENvbnN1bWVyU3VyZmFjZXMoc3RyZWFtSWQsIGNvbnN1bWVyU3VyZmFjZXMsICZjb25zdW1lclN1cmZhY2VJZHMpOwogICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb25zdW1lclN1cmZhY2VzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBJSW50ZXJmYWNlOjphc0JpbmRlcigKICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJTdXJmYWNlc1tpXS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpKTsKLSAgICAgICAgICAgIEFMT0dWKCIlczogbVN0cmVhbU1hcCBhZGQgYmluZGVyICVwIHN0cmVhbUlkICVkLCBzdXJmYWNlSWQgJXp1IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgQUxPR1YoIiVzOiBtU3RyZWFtTWFwIGFkZCBiaW5kZXIgJXAgc3RyZWFtSWQgJWQsIHN1cmZhY2VJZCAlZCIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICAgICAgYmluZGVyLmdldCgpLCBzdHJlYW1JZCwgY29uc3VtZXJTdXJmYWNlSWRzW2ldKTsKICAgICAgICAgICAgIG1TdHJlYW1NYXAuYWRkKGJpbmRlciwgU3RyZWFtU3VyZmFjZUlkKHN0cmVhbUlkLCBjb25zdW1lclN1cmZhY2VJZHNbaV0pKTsKICAgICAgICAgfQpAQCAtMTI4OCw2ICsxNTgxLDcgQEAKICAgICAgICAgICAgIG1EZWZlcnJlZFN0cmVhbXMucmVtb3ZlSXRlbXNBdChkZWZlcnJlZFN0cmVhbUluZGV4KTsKICAgICAgICAgfQogICAgICAgICBtU3RyZWFtSW5mb01hcFtzdHJlYW1JZF0uZmluYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgbUNvbmZpZ3VyZWRPdXRwdXRzLnJlcGxhY2VWYWx1ZUZvcihzdHJlYW1JZCwgb3V0cHV0Q29uZmlndXJhdGlvbik7CiAgICAgfSBlbHNlIGlmIChlcnIgPT0gTk9fSU5JVCkgewogICAgICAgICByZXMgPSBTVEFUVVNfRVJST1JfRk1UKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCiAgICAgICAgICAgICAgICAgIkNhbWVyYSAlczogRGVmZXJyZWQgc3VyZmFjZSBpcyBpbnZhbGlkOiAlcyAoJWQpIiwKQEAgLTE0MzIsNyArMTcyNiw4IEBACiAgICAgLy8gVGhyZWFkLXNhZmUuIE5vIGxvY2sgbmVjZXNzYXJ5LgogICAgIHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiByZW1vdGVDYiA9IG1SZW1vdGVDYWxsYmFjazsKICAgICBpZiAocmVtb3RlQ2IgIT0gTlVMTCkgewotICAgICAgICByZW1vdGVDYi0+b25SZXN1bHRSZWNlaXZlZChyZXN1bHQubU1ldGFkYXRhLCByZXN1bHQubVJlc3VsdEV4dHJhcyk7CisgICAgICAgIHJlbW90ZUNiLT5vblJlc3VsdFJlY2VpdmVkKHJlc3VsdC5tTWV0YWRhdGEsIHJlc3VsdC5tUmVzdWx0RXh0cmFzLAorICAgICAgICAgICAgICAgIHJlc3VsdC5tUGh5c2ljYWxNZXRhZGF0YXMpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKaW5kZXggNTA2NjFjYi4uNWFhZjVhYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0yNiw2ICsyNiw4IEBACiAjaW5jbHVkZSAiY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5oIgogI2luY2x1ZGUgImNvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oIgogCit1c2luZyBhbmRyb2lkOjpjYW1lcmEzOjpPdXRwdXRTdHJlYW1JbmZvOworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBDYW1lcmFEZXZpY2VDbGllbnRCYXNlIDoKQEAgLTQzLDYgKzQ1LDcgQEAKICAgICAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiYgcmVtb3RlQ2FsbGJhY2ssCiAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKKyAgICAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKQEAgLTgzLDcgKzg2LDggQEAKIAogICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgYmVnaW5Db25maWd1cmUoKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgZW5kQ29uZmlndXJlKGludCBvcGVyYXRpbmdNb2RlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIGVuZENvbmZpZ3VyZShpbnQgb3BlcmF0aW5nTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmEyOjppbXBsOjpDYW1lcmFNZXRhZGF0YU5hdGl2ZSYgc2Vzc2lvblBhcmFtcykgb3ZlcnJpZGU7CiAKICAgICAvLyBSZXR1cm5zIC1FQlVTWSBpZiBkZXZpY2UgaXMgbm90IGlkbGUgb3IgaW4gZXJyb3Igc3RhdGUKICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIGRlbGV0ZVN0cmVhbShpbnQgc3RyZWFtSWQpIG92ZXJyaWRlOwpAQCAtMTMxLDYgKzEzNSwxMCBAQAogICAgIC8vIFByZXBhcmUgc3RyZWFtIGJ5IHByZWFsbG9jYXRpbmcgdXAgdG8gbWF4Q291bnQgb2YgaXRzIGJ1ZmZlcnMKICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIHByZXBhcmUyKGludDMyX3QgbWF4Q291bnQsIGludDMyX3Qgc3RyZWFtSWQpIG92ZXJyaWRlOwogCisgICAgLy8gVXBkYXRlIGFuIG91dHB1dCBjb25maWd1cmF0aW9uCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyB1cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uKGludCBzdHJlYW1JZCwKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmEyOjpwYXJhbXM6Ok91dHB1dENvbmZpZ3VyYXRpb24gJm91dHB1dENvbmZpZ3VyYXRpb24pIG92ZXJyaWRlOworCiAgICAgLy8gRmluYWxpemUgdGhlIG91dHB1dCBjb25maWd1cmF0aW9ucyB3aXRoIHN1cmZhY2VzIG5vdCBhZGRlZCBiZWZvcmUuCiAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBmaW5hbGl6ZU91dHB1dENvbmZpZ3VyYXRpb25zKGludDMyX3Qgc3RyZWFtSWQsCiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhMjo6cGFyYW1zOjpPdXRwdXRDb25maWd1cmF0aW9uICZvdXRwdXRDb25maWd1cmF0aW9uKSBvdmVycmlkZTsKQEAgLTE0OSw3ICsxNTcsOCBAQAogICAgICAgICAgICAgaW50IHNlcnZpY2VQaWQpOwogICAgIHZpcnR1YWwgfkNhbWVyYURldmljZUNsaWVudCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgaW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncykgb3ZlcnJpZGU7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCkBAIC0yMDYsMjQgKzIxNSw2IEBACiAKICAgICB9OyAvLyBjbGFzcyBTdHJlYW1TdXJmYWNlSWQKIAotICAgIC8vIE91dHB1dFN0cmVhbUluZm8gZGVzY3JpYmVzIHRoZSBwcm9wZXJ0eSBvZiBhIGNhbWVyYSBzdHJlYW0uCi0gICAgY2xhc3MgT3V0cHV0U3RyZWFtSW5mbyB7Ci0gICAgcHVibGljOgotICAgICAgICBpbnQgd2lkdGg7Ci0gICAgICAgIGludCBoZWlnaHQ7Ci0gICAgICAgIGludCBmb3JtYXQ7Ci0gICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZTsKLSAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZTsKLSAgICAgICAgYm9vbCBmaW5hbGl6ZWQgPSBmYWxzZTsKLSAgICAgICAgT3V0cHV0U3RyZWFtSW5mbygpIDoKLSAgICAgICAgICAgICAgICB3aWR0aCgtMSksIGhlaWdodCgtMSksIGZvcm1hdCgtMSksIGRhdGFTcGFjZShIQUxfREFUQVNQQUNFX1VOS05PV04pLAotICAgICAgICAgICAgICAgIGNvbnN1bWVyVXNhZ2UoMCkge30KLSAgICAgICAgT3V0cHV0U3RyZWFtSW5mbyhpbnQgX3dpZHRoLCBpbnQgX2hlaWdodCwgaW50IF9mb3JtYXQsIGFuZHJvaWRfZGF0YXNwYWNlIF9kYXRhU3BhY2UsCi0gICAgICAgICAgICAgICAgdWludDY0X3QgX2NvbnN1bWVyVXNhZ2UpIDoKLSAgICAgICAgICAgICAgICAgICAgd2lkdGgoX3dpZHRoKSwgaGVpZ2h0KF9oZWlnaHQpLCBmb3JtYXQoX2Zvcm1hdCksCi0gICAgICAgICAgICAgICAgICAgIGRhdGFTcGFjZShfZGF0YVNwYWNlKSwgY29uc3VtZXJVc2FnZShfY29uc3VtZXJVc2FnZSkge30KLSAgICB9OwotCiBwcml2YXRlOgogICAgIC8qKiBJQ2FtZXJhRGV2aWNlVXNlciBpbnRlcmZhY2UtcmVsYXRlZCBwcml2YXRlIG1lbWJlcnMgKi8KIApAQCAtMjMyLDggKzIyMywxMCBAQAogICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IEZSQU1FX1BST0NFU1NPUl9MSVNURU5FUl9NSU5fSUQgPSAwOwogICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IEZSQU1FX1BST0NFU1NPUl9MSVNURU5FUl9NQVhfSUQgPSAweDdmZmZmZmZmTDsKIAorICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IG1TdXBwb3J0ZWRQaHlzaWNhbFJlcXVlc3RLZXlzOworCiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVFByb3ZpZGVyUHRyPgotICAgIHN0YXR1c190ICAgICAgaW5pdGlhbGl6ZUltcGwoVFByb3ZpZGVyUHRyIHByb3ZpZGVyUHRyKTsKKyAgICBzdGF0dXNfdCAgICAgIGluaXRpYWxpemVJbXBsKFRQcm92aWRlclB0ciBwcm92aWRlclB0ciwgY29uc3QgU3RyaW5nOCYgbW9uaXRvclRhZ3MpOwogCiAgICAgLyoqIFV0aWxpdHkgbWVtYmVycyAqLwogICAgIGJpbmRlcjo6U3RhdHVzIGNoZWNrUGlkU3RhdHVzKGNvbnN0IGNoYXIqIGNoZWNrTG9jYXRpb24pOwpAQCAtMjY3LDkgKzI2MCwyMiBAQAogICAgIGJpbmRlcjo6U3RhdHVzIGNyZWF0ZVN1cmZhY2VGcm9tR2JwKE91dHB1dFN0cmVhbUluZm8mIHN0cmVhbUluZm8sIGJvb2wgaXNTdHJlYW1JbmZvVmFsaWQsCiAgICAgICAgICAgICBzcDxTdXJmYWNlPiYgc3VyZmFjZSwgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGdicCk7CiAKKworICAgIC8vIFV0aWxpdHkgbWV0aG9kIHRvIGluc2VydCB0aGUgc3VyZmFjZSBpbnRvIFN1cmZhY2VNYXAKKyAgICBiaW5kZXI6OlN0YXR1cyBpbnNlcnRHYnBMb2NrZWQoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGdicCwKKyAgICAgICAgICAgIC8qb3V0Ki9TdXJmYWNlTWFwKiBzdXJmYWNlTWFwLCAvKm91dCovVmVjdG9yPGludDMyX3Q+KiBzdHJlYW1JZHMsCisgICAgICAgICAgICAvKm91dCovaW50MzJfdCogIGN1cnJlbnRTdHJlYW1JZCk7CisKKyAgICAvLyBDaGVjayB0aGF0IHRoZSBwaHlzaWNhbENhbWVyYUlkIHBhc3NlZCBpbiBpcyBzcHBvcnRlZCBieSB0aGUgY2FtZXJhCisgICAgLy8gZGV2aWNlLgorICAgIGJvb2wgY2hlY2tQaHlzaWNhbENhbWVyYUlkKGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQpOworCiAgICAgLy8gSUdyYXBoaWNzQnVmZmVyUHJvZHVjZXIgYmluZGVyIC0+IFN0cmVhbSBJRCArIFN1cmZhY2UgSUQgZm9yIG91dHB1dCBzdHJlYW1zCiAgICAgS2V5ZWRWZWN0b3I8c3A8SUJpbmRlcj4sIFN0cmVhbVN1cmZhY2VJZD4gbVN0cmVhbU1hcDsKIAorICAgIC8vIFN0cmVhbSBJRCAtPiBPdXRwdXRDb25maWd1cmF0aW9uLiBVc2VkIGZvciBsb29raW5nIHVwIFN1cmZhY2UgYnkgc3RyZWFtL3N1cmZhY2UgaW5kZXgKKyAgICBLZXllZFZlY3RvcjxpbnQzMl90LCBoYXJkd2FyZTo6Y2FtZXJhMjo6cGFyYW1zOjpPdXRwdXRDb25maWd1cmF0aW9uPiBtQ29uZmlndXJlZE91dHB1dHM7CisKICAgICBzdHJ1Y3QgSW5wdXRTdHJlYW1Db25maWd1cmF0aW9uIHsKICAgICAgICAgYm9vbCBjb25maWd1cmVkOwogICAgICAgICBpbnQzMl90IHdpZHRoOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKaW5kZXggNTFlZjE2MC4uY2UwMDZhNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCkBAIC00OCwxNSArNDgsMTYgQEAKICAgICAgICAgY29uc3Qgc3A8VENhbUNhbGxiYWNrcz4mIHJlbW90ZUNhbGxiYWNrLAogICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAorICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLAogICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICBpbnQgY2xpZW50UGlkLAogICAgICAgICB1aWRfdCBjbGllbnRVaWQsCiAgICAgICAgIGludCBzZXJ2aWNlUGlkKToKICAgICAgICAgVENsaWVudEJhc2UoY2FtZXJhU2VydmljZSwgcmVtb3RlQ2FsbGJhY2ssIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKSwKKyAgICAgICAgICAgICAgICBjYW1lcmFJZCwgYXBpMUNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKSwKICAgICAgICAgbVNoYXJlZENhbWVyYUNhbGxiYWNrcyhyZW1vdGVDYWxsYmFjayksCiAgICAgICAgIG1EZXZpY2VWZXJzaW9uKGNhbWVyYVNlcnZpY2UtPmdldERldmljZVZlcnNpb24oVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0cikpLAotICAgICAgICBtRGV2aWNlQWN0aXZlKGZhbHNlKQorICAgICAgICBtRGV2aWNlQWN0aXZlKGZhbHNlKSwgbUFwaTFDYW1lcmFJZChhcGkxQ2FtZXJhSWQpCiB7CiAgICAgQUxPR0koIkNhbWVyYSAlczogT3BlbmVkLiBDbGllbnQ6ICVzIChQSUQgJWQsIFVJRCAlZCkiLCBjYW1lcmFJZC5zdHJpbmcoKSwKICAgICAgICAgICAgIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpLnN0cmluZygpLCBjbGllbnRQaWQsIGNsaWVudFVpZCk7CkBAIC03OSwxMyArODAsMTUgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgotc3RhdHVzX3QgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+Ojppbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlcikgewotICAgIHJldHVybiBpbml0aWFsaXplSW1wbChtYW5hZ2VyKTsKK3N0YXR1c190IENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6aW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCisgICAgICAgIGNvbnN0IFN0cmluZzgmIG1vbml0b3JUYWdzKSB7CisgICAgcmV0dXJuIGluaXRpYWxpemVJbXBsKG1hbmFnZXIsIG1vbml0b3JUYWdzKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgogdGVtcGxhdGUgPHR5cGVuYW1lIFRQcm92aWRlclB0cj4KLXN0YXR1c190IENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6aW5pdGlhbGl6ZUltcGwoVFByb3ZpZGVyUHRyIHByb3ZpZGVyUHRyKSB7CitzdGF0dXNfdCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46OmluaXRpYWxpemVJbXBsKFRQcm92aWRlclB0ciBwcm92aWRlclB0ciwKKyAgICAgICAgY29uc3QgU3RyaW5nOCYgbW9uaXRvclRhZ3MpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogSW5pdGlhbGl6aW5nIGNsaWVudCBmb3IgY2FtZXJhICVzIiwgX19GVU5DVElPTl9fLAogICAgICAgICAgIFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOwpAQCAtMTAzLDcgKzEwNiw3IEBACiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KIAotICAgIHJlcyA9IG1EZXZpY2UtPmluaXRpYWxpemUocHJvdmlkZXJQdHIpOworICAgIHJlcyA9IG1EZXZpY2UtPmluaXRpYWxpemUocHJvdmlkZXJQdHIsIG1vbml0b3JUYWdzKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzOiB1bmFibGUgdG8gaW5pdGlhbGl6ZSBkZXZpY2U6ICVzICglZCkiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC0xNTYsMTMgKzE1OSwxNCBAQAogICAgIHJlc3VsdCA9ICIgIERldmljZSBkdW1wOlxuIjsKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKIAotICAgIGlmICghbURldmljZS5nZXQoKSkgeworICAgIHNwPENhbWVyYURldmljZUJhc2U+IGRldmljZSA9IG1EZXZpY2U7CisgICAgaWYgKCFkZXZpY2UuZ2V0KCkpIHsKICAgICAgICAgcmVzdWx0ID0gIiAgKioqIERldmljZSBpcyBkZXRhY2hlZFxuIjsKICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKLSAgICBzdGF0dXNfdCByZXMgPSBtRGV2aWNlLT5kdW1wKGZkLCBhcmdzKTsKKyAgICBzdGF0dXNfdCByZXMgPSBkZXZpY2UtPmR1bXAoZmQsIGFyZ3MpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgcmVzdWx0ID0gU3RyaW5nODo6Zm9ybWF0KCIgICBFcnJvciBkdW1waW5nIGRldmljZTogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC0yNDksNyArMjUzLDkgQEAKICAgICBpZiAobURldmljZUFjdGl2ZSkgewogICAgICAgICBnZXRDYW1lcmFTZXJ2aWNlKCktPnVwZGF0ZVByb3h5RGV2aWNlU3RhdGUoCiAgICAgICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX1NUQVRFX0lETEUsIFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIsCi0gICAgICAgICAgICBUQ2xpZW50QmFzZTo6bUNhbWVyYUZhY2luZywgVENsaWVudEJhc2U6Om1DbGllbnRQYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBUQ2xpZW50QmFzZTo6bUNhbWVyYUZhY2luZywgVENsaWVudEJhc2U6Om1DbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICgobUFwaTFDYW1lcmFJZCA8IDApID8gaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9BUElfTEVWRUxfMiA6CisgICAgICAgICAgICAgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9BUElfTEVWRUxfMSkpOwogICAgIH0KICAgICBtRGV2aWNlQWN0aXZlID0gZmFsc2U7CiAKQEAgLTI2NSw3ICsyNzEsOSBAQAogICAgIGlmICghbURldmljZUFjdGl2ZSkgewogICAgICAgICBnZXRDYW1lcmFTZXJ2aWNlKCktPnVwZGF0ZVByb3h5RGV2aWNlU3RhdGUoCiAgICAgICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX1NUQVRFX0FDVElWRSwgVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0ciwKLSAgICAgICAgICAgIFRDbGllbnRCYXNlOjptQ2FtZXJhRmFjaW5nLCBUQ2xpZW50QmFzZTo6bUNsaWVudFBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIFRDbGllbnRCYXNlOjptQ2FtZXJhRmFjaW5nLCBUQ2xpZW50QmFzZTo6bUNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgKChtQXBpMUNhbWVyYUlkIDwgMCkgPyBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX0FQSV9MRVZFTF8yIDoKKyAgICAgICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX0FQSV9MRVZFTF8xKSk7CiAgICAgfQogICAgIG1EZXZpY2VBY3RpdmUgPSB0cnVlOwogCkBAIC0zMjgsNyArMzM2LDcgQEAKIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgogaW50IENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6Z2V0Q2FtZXJhSWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0ZDo6c3RvaShUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyLnN0cmluZygpKTsKKyAgICByZXR1cm4gbUFwaTFDYW1lcmFJZDsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaAppbmRleCBlODk4ZDVkLi5lNzRmYmRmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaApAQCAtNDksMTMgKzQ5LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8VENhbUNhbGxiYWNrcz4mIHJlbW90ZUNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLAogICAgICAgICAgICAgICAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCBjbGllbnRVaWQsCiAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlcnZpY2VQaWQpOwogICAgIHZpcnR1YWwgfkNhbWVyYTJDbGllbnRCYXNlKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgaW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBpbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlciwgY29uc3QgU3RyaW5nOCYgbW9uaXRvclRhZ3MpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBkdW1wQ2xpZW50KGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKICAgICAvKioKQEAgLTE0MCw5ICsxNDEsMTEgQEAKIAogICAgIGJvb2wgICAgICAgICAgICAgICAgICBtRGV2aWNlQWN0aXZlOwogCisgICAgY29uc3QgaW50ICAgICAgICAgICAgIG1BcGkxQ2FtZXJhSWQ7IC8vIC0xIGlmIGNsaWVudCBpcyBBUEkyCisKIHByaXZhdGU6CiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVFByb3ZpZGVyUHRyPgotICAgIHN0YXR1c190ICAgICAgICAgICAgICBpbml0aWFsaXplSW1wbChUUHJvdmlkZXJQdHIgcHJvdmlkZXJQdHIpOworICAgIHN0YXR1c190ICAgICAgICAgICAgICBpbml0aWFsaXplSW1wbChUUHJvdmlkZXJQdHIgcHJvdmlkZXJQdHIsIGNvbnN0IFN0cmluZzgmIG1vbml0b3JUYWdzKTsKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYURldmljZUJhc2UuaAppbmRleCBhOTAwNTBlLi4wYmE3NDAzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxMy0yMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KIApAQCAtNTQsNyArNTUsMTIgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsIGNvbnN0IFN0cmluZzgmIGdldElkKCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlcikgPSAwOworICAgIC8qKgorICAgICAqIFRoZSBkZXZpY2UgdmVuZG9yIHRhZyBJRAorICAgICAqLworICAgIHZpcnR1YWwgbWV0YWRhdGFfdmVuZG9yX2lkX3QgZ2V0VmVuZG9yVGFnSWQoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLCBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzY29ubmVjdCgpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpID0gMDsKQEAgLTY0LDYgKzcwLDEyIEBACiAgICAgICovCiAgICAgdmlydHVhbCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgaW5mbygpIGNvbnN0ID0gMDsKIAorICAgIHN0cnVjdCBQaHlzaWNhbENhbWVyYVNldHRpbmdzIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgY2FtZXJhSWQ7CisgICAgICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhOworICAgIH07CisgICAgdHlwZWRlZiBMaXN0PFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M+IFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NMaXN0OworCiAgICAgLyoqCiAgICAgICogU3VibWl0IHJlcXVlc3QgZm9yIGNhcHR1cmUuIFRoZSBDYW1lcmFEZXZpY2UgdGFrZXMgb3duZXJzaGlwIG9mIHRoZQogICAgICAqIHBhc3NlZC1pbiBidWZmZXIuCkBAIC03NSw3ICs4Nyw3IEBACiAgICAgICogU3VibWl0IGEgbGlzdCBvZiByZXF1ZXN0cy4KICAgICAgKiBPdXRwdXQgbGFzdEZyYW1lTnVtYmVyIGlzIHRoZSBleHBlY3RlZCBsYXN0IGZyYW1lIG51bWJlciBvZiB0aGUgbGlzdCBvZiByZXF1ZXN0cy4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNhcHR1cmVMaXN0KGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZyZXF1ZXN0cywKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNhcHR1cmVMaXN0KGNvbnN0IExpc3Q8Y29uc3QgUGh5c2ljYWxDYW1lcmFTZXR0aW5nc0xpc3Q+ICZyZXF1ZXN0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxjb25zdCBTdXJmYWNlTWFwPiAmc3VyZmFjZU1hcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKSA9IDA7CiAKQEAgLTkxLDcgKzEwMyw3IEBACiAgICAgICogU3VibWl0IGEgbGlzdCBvZiByZXF1ZXN0cyBmb3Igc3RyZWFtaW5nLgogICAgICAqIE91dHB1dCBsYXN0RnJhbWVOdW1iZXIgaXMgdGhlIGxhc3QgZnJhbWUgbnVtYmVyIG9mIHRoZSBwcmV2aW91cyBzdHJlYW1pbmcgcmVxdWVzdC4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbWluZ1JlcXVlc3RMaXN0KGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZyZXF1ZXN0cywKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbWluZ1JlcXVlc3RMaXN0KGNvbnN0IExpc3Q8Y29uc3QgUGh5c2ljYWxDYW1lcmFTZXR0aW5nc0xpc3Q+ICZyZXF1ZXN0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxjb25zdCBTdXJmYWNlTWFwPiAmc3VyZmFjZU1hcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKSA9IDA7CiAKQEAgLTExOCw2ICsxMzAsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlU3RyZWFtKHNwPFN1cmZhY2U+IGNvbnN1bWVyLAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKICAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICpzdXJmYWNlSWRzID0gbnVsbHB0ciwKICAgICAgICAgICAgIGludCBzdHJlYW1TZXRJZCA9IGNhbWVyYTM6OkNBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElELAogICAgICAgICAgICAgYm9vbCBpc1NoYXJlZCA9IGZhbHNlLCB1aW50NjRfdCBjb25zdW1lclVzYWdlID0gMCkgPSAwOwogCkBAIC0xMzEsNiArMTQ1LDggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVN0cmVhbShjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycywKICAgICAgICAgICAgIGJvb2wgaGFzRGVmZXJyZWRDb25zdW1lciwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKICAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICpzdXJmYWNlSWRzID0gbnVsbHB0ciwKICAgICAgICAgICAgIGludCBzdHJlYW1TZXRJZCA9IGNhbWVyYTM6OkNBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElELAogICAgICAgICAgICAgYm9vbCBpc1NoYXJlZCA9IGZhbHNlLCB1aW50NjRfdCBjb25zdW1lclVzYWdlID0gMCkgPSAwOwogCkBAIC0yMDksNyArMjI1LDggQEAKICAgICAgKiAtIEJBRF9WQUxVRSBpZiB0aGUgc2V0IG9mIHN0cmVhbXMgd2FzIGludmFsaWQgKGUuZy4gZm10cyBvciBzaXplcykKICAgICAgKiAtIElOVkFMSURfT1BFUkFUSU9OIGlmIHRoZSBkZXZpY2Ugd2FzIGluIHRoZSB3cm9uZyBzdGF0ZQogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtcyhpbnQgb3BlcmF0aW5nTW9kZSA9IDApID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXMoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNlc3Npb25QYXJhbXMsCisgICAgICAgICAgICBpbnQgb3BlcmF0aW5nTW9kZSA9IDApID0gMDsKIAogICAgIC8vIGdldCB0aGUgYnVmZmVyIHByb2R1Y2VyIG9mIHRoZSBpbnB1dCBzdHJlYW0KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyUHJvZHVjZXIoCkBAIC0zNDcsNyArMzY0LDE1IEBACiAgICAgICogU2V0IHRoZSBkZWZlcnJlZCBjb25zdW1lciBzdXJmYWNlIGFuZCBmaW5pc2ggdGhlIHJlc3Qgb2YgdGhlIHN0cmVhbSBjb25maWd1cmF0aW9uLgogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q29uc3VtZXJTdXJmYWNlcyhpbnQgc3RyZWFtSWQsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycykgPSAwOworICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBjb25zdW1lcnMsIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMgLypvdXQqLykgPSAwOworCisgICAgLyoqCisgICAgICogVXBkYXRlIGEgZ2l2ZW4gc3RyZWFtLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgdXBkYXRlU3RyZWFtKGludCBzdHJlYW1JZCwgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+ICZuZXdTdXJmYWNlcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OmNhbWVyYTM6Ok91dHB1dFN0cmVhbUluZm8+ICZvdXRwdXRJbmZvLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiAmcmVtb3ZlZFN1cmZhY2VJZHMsCisgICAgICAgICAgICBLZXllZFZlY3RvcjxzcDxTdXJmYWNlPiwgc2l6ZV90PiAqb3V0cHV0TWFwLypvdXQqLykgPSAwOwogCiAgICAgLyoqCiAgICAgICogRHJvcCBidWZmZXJzIGZvciBzdHJlYW0gb2Ygc3RyZWFtSWQgaWYgZHJvcHBpbmcgaXMgdHJ1ZS4gSWYgZHJvcHBpbmcgaXMgZmFsc2UsIGRvIG5vdApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcAppbmRleCBlNmE2YTIxLi42NmU5MTk2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcApAQCAtMjAsMTEgKzIwLDEzIEBACiAKICNpbmNsdWRlICJDYW1lcmFQcm92aWRlck1hbmFnZXIuaCIKIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxjaHJvbm8+CiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxoaWRsL1NlcnZpY2VNYW5hZ2VtZW50Lmg+CiAjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KICNpbmNsdWRlIDxjYW1lcmFfbWV0YWRhdGFfaGlkZGVuLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlaW50Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzUsOSArMzcsNyBAQAogLy8gSGFyZGNvZGVkIG5hbWUgZm9yIHRoZSBwYXNzdGhyb3VnaCBIQUwgaW1wbGVtZW50YXRpb24sIHNpbmNlIGl0IGNhbid0IGJlIGRpc2NvdmVyZWQgdmlhIHRoZQogLy8gc2VydmljZSBtYW5hZ2VyCiBjb25zdCBzdGQ6OnN0cmluZyBrTGVnYWN5UHJvdmlkZXJOYW1lKCJsZWdhY3kvMCIpOwotCi0vLyBTbGFzaC1zZXBhcmF0ZWQgbGlzdCBvZiBwcm92aWRlciB0eXBlcyB0byBjb25zaWRlciBmb3IgdXNlIHZpYSB0aGUgb2xkIGNhbWVyYSBBUEkKLWNvbnN0IHN0ZDo6c3RyaW5nIGtTdGFuZGFyZFByb3ZpZGVyVHlwZXMoImludGVybmFsL2xlZ2FjeSIpOworY29uc3Qgc3RkOjpzdHJpbmcga0V4dGVybmFsUHJvdmlkZXJOYW1lKCJleHRlcm5hbC8wIik7CiAKIH0gLy8gYW5vbnltb3VzIG5hbWVzcGFjZQogCkBAIC02OSw2ICs2OSw3IEBACiAKICAgICAvLyBTZWUgaWYgdGhlcmUncyBhIHBhc3N0aHJvdWdoIEhBTCwgYnV0IGxldCdzIG5vdCBjb21wbGFpbiBpZiB0aGVyZSdzIG5vdAogICAgIGFkZFByb3ZpZGVyTG9ja2VkKGtMZWdhY3lQcm92aWRlck5hbWUsIC8qZXhwZWN0ZWQqLyBmYWxzZSk7CisgICAgYWRkUHJvdmlkZXJMb2NrZWQoa0V4dGVybmFsUHJvdmlkZXJOYW1lLCAvKmV4cGVjdGVkKi8gZmFsc2UpOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtNzcsMTggKzc4LDcgQEAKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwogICAgIGludCBjb3VudCA9IDA7CiAgICAgZm9yIChhdXRvJiBwcm92aWRlciA6IG1Qcm92aWRlcnMpIHsKLSAgICAgICAgY291bnQgKz0gcHJvdmlkZXItPm1VbmlxdWVEZXZpY2VDb3VudDsKLSAgICB9Ci0gICAgcmV0dXJuIGNvdW50OwotfQotCi1pbnQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpnZXRBUEkxQ29tcGF0aWJsZUNhbWVyYUNvdW50KCkgY29uc3QgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7Ci0gICAgaW50IGNvdW50ID0gMDsKLSAgICBmb3IgKGF1dG8mIHByb3ZpZGVyIDogbVByb3ZpZGVycykgewotICAgICAgICBpZiAoa1N0YW5kYXJkUHJvdmlkZXJUeXBlcy5maW5kKHByb3ZpZGVyLT5nZXRUeXBlKCkpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgICAgICAgICBjb3VudCArPSBwcm92aWRlci0+bVVuaXF1ZUFQSTFDb21wYXRpYmxlQ2FtZXJhSWRzLnNpemUoKTsKLSAgICAgICAgfQorICAgICAgICBjb3VudCArPSBwcm92aWRlci0+bVVuaXF1ZUNhbWVyYUlkcy5zaXplKCk7CiAgICAgfQogICAgIHJldHVybiBjb3VudDsKIH0KQEAgLTEwOCwxMiArOTgsMjggQEAKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBkZXZpY2VJZHM7CiAgICAgZm9yIChhdXRvJiBwcm92aWRlciA6IG1Qcm92aWRlcnMpIHsKLSAgICAgICAgaWYgKGtTdGFuZGFyZFByb3ZpZGVyVHlwZXMuZmluZChwcm92aWRlci0+Z2V0VHlwZSgpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgICAgICAgZm9yIChhdXRvJiBpZCA6IHByb3ZpZGVyLT5tVW5pcXVlQVBJMUNvbXBhdGlibGVDYW1lcmFJZHMpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2VJZHMucHVzaF9iYWNrKGlkKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgZm9yIChhdXRvJiBpZCA6IHByb3ZpZGVyLT5tVW5pcXVlQVBJMUNvbXBhdGlibGVDYW1lcmFJZHMpIHsKKyAgICAgICAgICAgIGRldmljZUlkcy5wdXNoX2JhY2soaWQpOwogICAgICAgICB9CiAgICAgfQorCisgICAgc3RkOjpzb3J0KGRldmljZUlkcy5iZWdpbigpLCBkZXZpY2VJZHMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBzdGQ6OnN0cmluZyYgYSwgY29uc3Qgc3RkOjpzdHJpbmcmIGIpIC0+IGJvb2wgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGFVaW50ID0gMCwgYlVpbnQgPSAwOworICAgICAgICAgICAgICAgIGJvb2wgYUlzVWludCA9IGJhc2U6OlBhcnNlVWludChhLCAmYVVpbnQpOworICAgICAgICAgICAgICAgIGJvb2wgYklzVWludCA9IGJhc2U6OlBhcnNlVWludChiLCAmYlVpbnQpOworCisgICAgICAgICAgICAgICAgLy8gVWludCBkZXZpY2UgSURzIGZpcnN0CisgICAgICAgICAgICAgICAgaWYgKGFJc1VpbnQgJiYgYklzVWludCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYVVpbnQgPCBiVWludDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFJc1VpbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiSXNVaW50KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gU2ltcGxlIHN0cmluZyBjb21wYXJlIGlmIGJvdGggaWQgYXJlIG5vdCB1aW50CisgICAgICAgICAgICAgICAgcmV0dXJuIGEgPCBiOworICAgICAgICAgICAgfSk7CiAgICAgcmV0dXJuIGRldmljZUlkczsKIH0KIApAQCAtNDc4LDYgKzQ4NCw4IEBACiAgICAgfQogICAgIEFMT0dJKCJDb25uZWN0aW5nIHRvIG5ldyBjYW1lcmEgcHJvdmlkZXI6ICVzLCBpc1JlbW90ZT8gJWQiLAogICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBtSW50ZXJmYWNlLT5pc1JlbW90ZSgpKTsKKyAgICAvLyBjYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2UgY2FsbGJhY2tzIG1heSBiZSBjYWxsZWQgKGFuZCBjYXVzaW5nIG5ldyBkZXZpY2VzIGFkZGVkKQorICAgIC8vIGJlZm9yZSBzZXRDYWxsYmFjayByZXR1cm5zCiAgICAgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1JbnRlcmZhY2UtPnNldENhbGxiYWNrKHRoaXMpOwogICAgIGlmICghc3RhdHVzLmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIHNldHRpbmcgdXAgY2FsbGJhY2tzIHdpdGggY2FtZXJhIHByb3ZpZGVyICclcyc6ICVzIiwKQEAgLTUzNCwxNyArNTQyLDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBmb3IgKGF1dG8mIGRldmljZSA6IG1EZXZpY2VzKSB7Ci0gICAgICAgIG1VbmlxdWVDYW1lcmFJZHMuaW5zZXJ0KGRldmljZS0+bUlkKTsKLSAgICAgICAgaWYgKGRldmljZS0+aXNBUEkxQ29tcGF0aWJsZSgpKSB7Ci0gICAgICAgICAgICBtVW5pcXVlQVBJMUNvbXBhdGlibGVDYW1lcmFJZHMuaW5zZXJ0KGRldmljZS0+bUlkKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtVW5pcXVlRGV2aWNlQ291bnQgPSBtVW5pcXVlQ2FtZXJhSWRzLnNpemUoKTsKLQogICAgIEFMT0dJKCJDYW1lcmEgcHJvdmlkZXIgJXMgcmVhZHkgd2l0aCAlenUgY2FtZXJhIGRldmljZXMiLAogICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBtRGV2aWNlcy5zaXplKCkpOwogCisgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTU5MiwxNSArNTkzLDM0IEBACiAgICAgfQogICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7CiAgICAgZGV2aWNlSW5mby0+bVN0YXR1cyA9IGluaXRpYWxTdGF0dXM7CisgICAgYm9vbCBpc0FQSTFDb21wYXRpYmxlID0gZGV2aWNlSW5mby0+aXNBUEkxQ29tcGF0aWJsZSgpOwogCiAgICAgbURldmljZXMucHVzaF9iYWNrKHN0ZDo6bW92ZShkZXZpY2VJbmZvKSk7CiAKKyAgICBtVW5pcXVlQ2FtZXJhSWRzLmluc2VydChpZCk7CisgICAgaWYgKGlzQVBJMUNvbXBhdGlibGUpIHsKKyAgICAgICAgbVVuaXF1ZUFQSTFDb21wYXRpYmxlQ2FtZXJhSWRzLmluc2VydChpZCk7CisgICAgfQorCiAgICAgaWYgKHBhcnNlZElkICE9IG51bGxwdHIpIHsKICAgICAgICAgKnBhcnNlZElkID0gaWQ7CiAgICAgfQogICAgIHJldHVybiBPSzsKIH0KIAordm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6cmVtb3ZlRGV2aWNlKHN0ZDo6c3RyaW5nIGlkKSB7CisgICAgZm9yIChhdXRvIGl0ID0gbURldmljZXMuYmVnaW4oKTsgaXQgIT0gbURldmljZXMuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgaWYgKCgqaXQpLT5tSWQgPT0gaWQpIHsKKyAgICAgICAgICAgIG1VbmlxdWVDYW1lcmFJZHMuZXJhc2UoaWQpOworICAgICAgICAgICAgaWYgKCgqaXQpLT5pc0FQSTFDb21wYXRpYmxlKCkpIHsKKyAgICAgICAgICAgICAgICBtVW5pcXVlQVBJMUNvbXBhdGlibGVDYW1lcmFJZHMuZXJhc2UoaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbURldmljZXMuZXJhc2UoaXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYpIGNvbnN0IHsKICAgICBkcHJpbnRmKGZkLCAiPT0gQ2FtZXJhIFByb3ZpZGVyIEhBTCAlcyAodjIuNCwgJXMpIHN0YXRpYyBpbmZvOiAlenUgZGV2aWNlczogPT1cbiIsCiAgICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIG1JbnRlcmZhY2UtPmlzUmVtb3RlKCkgPyAicmVtb3RlIiA6ICJwYXNzdGhyb3VnaCIsCkBAIC02NDMsNiArNjYzLDE0IEBACiAgICAgICAgICAgICBkcHJpbnRmKGZkLCAiICBBUEkyIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3M6XG4iKTsKICAgICAgICAgICAgIGluZm8yLmR1bXAoZmQsIC8qdmVyYm9zaXR5Ki8gMiwgLyppbmRlbnRhdGlvbiovIDQpOwogICAgICAgICB9CisKKyAgICAgICAgZHByaW50ZihmZCwgIj09IENhbWVyYSBIQUwgZGV2aWNlICVzICh2JWQuJWQpIGR1bXBTdGF0ZTogPT1cbiIsIGRldmljZS0+bU5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICBkZXZpY2UtPm1WZXJzaW9uLmdldF9tYWpvcigpLCBkZXZpY2UtPm1WZXJzaW9uLmdldF9taW5vcigpKTsKKyAgICAgICAgcmVzID0gZGV2aWNlLT5kdW1wU3RhdGUoZmQpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBkcHJpbnRmKGZkLCAiICAgPEVycm9yIGR1bXBpbmcgZGV2aWNlICVzIHN0YXRlOiAlcyAoJWQpPlxuIiwKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT5tTmFtZS5jX3N0cigpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CkBAIC02NTIsNiArNjgwLDcgQEAKICAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIG5ld1N0YXR1cykgewogICAgIHNwPFN0YXR1c0xpc3RlbmVyPiBsaXN0ZW5lcjsKICAgICBzdGQ6OnN0cmluZyBpZDsKKyAgICBib29sIGluaXRpYWxpemVkID0gZmFsc2U7CiAgICAgewogICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CiAgICAgICAgIGJvb2wga25vd24gPSBmYWxzZTsKQEAgLTY3NCwxMSArNzAzLDE3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhZGREZXZpY2UoY2FtZXJhRGV2aWNlTmFtZSwgbmV3U3RhdHVzLCAmaWQpOworICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXR1cyA9PSBDYW1lcmFEZXZpY2VTdGF0dXM6Ok5PVF9QUkVTRU5UKSB7CisgICAgICAgICAgICByZW1vdmVEZXZpY2UoaWQpOwogICAgICAgICB9CiAgICAgICAgIGxpc3RlbmVyID0gbU1hbmFnZXItPmdldFN0YXR1c0xpc3RlbmVyKCk7CisgICAgICAgIGluaXRpYWxpemVkID0gbUluaXRpYWxpemVkOwogICAgIH0KICAgICAvLyBDYWxsIHdpdGhvdXQgbG9jayBoZWxkIHRvIGFsbG93IHJlZW50cmFuY3kgaW50byBwcm92aWRlciBtYW5hZ2VyCi0gICAgaWYgKGxpc3RlbmVyICE9IG51bGxwdHIpIHsKKyAgICAvLyBEb24ndCBzZW5kIHRoZSBjYWxsYmFjayBpZiBwcm92aWRlckluZm8gaGFzbid0IGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgLy8gQ2FtZXJhU2VydmljZSB3aWxsIGluaXRpYWxpemUgZGV2aWNlIHN0YXR1cyBhZnRlciBwcm92aWRlciBpcworICAgIC8vIGluaXRpYWxpemVkCisgICAgaWYgKGxpc3RlbmVyICE9IG51bGxwdHIgJiYgaW5pdGlhbGl6ZWQpIHsKICAgICAgICAgbGlzdGVuZXItPm9uRGV2aWNlU3RhdHVzQ2hhbmdlZChTdHJpbmc4KGlkLmNfc3RyKCkpLCBuZXdTdGF0dXMpOwogICAgIH0KICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKQEAgLTc0OCw2ICs3ODMsMTggQEAKICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksIHN0YXR1c1RvU3RyaW5nKHN0YXR1cykpOwogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CisKKyAgICBmb3IgKGF1dG8mIGNvbmZsaWN0TmFtZSA6IHJlc291cmNlQ29zdC5jb25mbGljdGluZ0RldmljZXMpIHsKKyAgICAgICAgdWludDE2X3QgbWFqb3IsIG1pbm9yOworICAgICAgICBzdGQ6OnN0cmluZyB0eXBlLCBpZDsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gcGFyc2VEZXZpY2VOYW1lKGNvbmZsaWN0TmFtZSwgJm1ham9yLCAmbWlub3IsICZ0eXBlLCAmaWQpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBwYXJzZSBjb25mbGljdGluZyBkZXZpY2UgJXMiLCBfX0ZVTkNUSU9OX18sIGNvbmZsaWN0TmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGNvbmZsaWN0TmFtZSA9IGlkOworICAgIH0KKwogICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8RGV2aWNlSW5mbz4oCiAgICAgICAgIG5ldyBEZXZpY2VJbmZvVChuYW1lLCB0YWdJZCwgaWQsIG1pbm9yVmVyc2lvbiwgcmVzb3VyY2VDb3N0LAogICAgICAgICAgICAgICAgIGNhbWVyYUludGVyZmFjZSkpOwpAQCAtOTA4LDYgKzk1NSwxNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjpkdW1wU3RhdGUoaW50IGZkKSBjb25zdCB7CisgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLDApOworICAgIGhhbmRsZS0+ZGF0YVswXSA9IGZkOworICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzID0gbUludGVyZmFjZS0+ZHVtcFN0YXRlKGhhbmRsZSk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGFuZGxlKTsKKyAgICBpZiAoIXMuaXNPaygpKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzKTsKK30KKwogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpEZXZpY2VJbmZvMyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKICAgICAgICAgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKICAgICAgICAgdWludDE2X3QgbWlub3JWZXJzaW9uLApAQCAtMTAxMSw2ICsxMDY5LDE3IEBACiAgICAgcmV0dXJuIGlzQmFja3dhcmRDb21wYXRpYmxlOwogfQogCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmR1bXBTdGF0ZShpbnQgZmQpIGNvbnN0IHsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsMCk7CisgICAgaGFuZGxlLT5kYXRhWzBdID0gZmQ7CisgICAgYXV0byByZXQgPSBtSW50ZXJmYWNlLT5kdW1wU3RhdGUoaGFuZGxlKTsKKyAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCiAgICAgICAgIENhbWVyYU1ldGFkYXRhICpjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IHsKICAgICBpZiAoY2hhcmFjdGVyaXN0aWNzID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7CkBAIC0xMzQ0LDcgKzE0MTMsNyBAQAogICAgICAgICBkZXNjLT5tUmV2ZXJzZU1hcHBpbmdbcmV2ZXJzZUluZGV4XS0+YWRkKGRlc2MtPm1UYWdUb05hbWVNYXAudmFsdWVGb3IodGFnKSwgdGFnKTsKICAgICB9CiAKLSAgICBkZXNjcmlwdG9yID0gZGVzYzsKKyAgICBkZXNjcmlwdG9yID0gc3RkOjptb3ZlKGRlc2MpOwogICAgIHJldHVybiBPSzsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oCmluZGV4IGU4MjI4MmYuLmJiZTY3ODkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgKQEAgLTE4LDcgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFQUk9WSURFUl9ICiAKICNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPG11dGV4PgogCkBAIC0xMjUsMTYgKzEyNSwxNCBAQAogICAgICAqLwogICAgIGludCBnZXRDYW1lcmFDb3VudCgpIGNvbnN0OwogCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGdldENhbWVyYURldmljZUlkcygpIGNvbnN0OworCiAgICAgLyoqCiAgICAgICogUmV0cmlldmUgdGhlIG51bWJlciBvZiBBUEkxIGNvbXBhdGlibGUgY2FtZXJhczsgdGhlc2UgYXJlIGludGVybmFsIGFuZAogICAgICAqIGJhY2t3YXJkcy1jb21wYXRpYmxlLiBUaGlzIGlzIHRoZSBzZXQgb2YgY2FtZXJhcyB0aGF0IHdpbGwgYmUKLSAgICAgKiBhY2Nlc3NpYmxlIHZpYSB0aGUgb2xkIGNhbWVyYSBBUEksIHdpdGggSURzIGluIHJhbmdlIG9mCi0gICAgICogWzAsIGdldEFQSTFDb21wYXRpYmxlQ2FtZXJhQ291bnQoKS0xXS4gVGhpcyB2YWx1ZSBpcyBub3QgZXhwZWN0ZWQgdG8gY2hhbmdlIGR5bmFtaWNhbGx5LgorICAgICAqIGFjY2Vzc2libGUgdmlhIHRoZSBvbGQgY2FtZXJhIEFQSS4KKyAgICAgKiBUaGUgcmV0dXJuIHZhbHVlIG1heSBjaGFuZ2UgZHluYW1pY2FsbHkgZHVlIHRvIGV4dGVybmFsIGNhbWVyYSBob3RwbHVnLgogICAgICAqLwotICAgIGludCBnZXRBUEkxQ29tcGF0aWJsZUNhbWVyYUNvdW50KCkgY29uc3Q7Ci0KLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZ2V0Q2FtZXJhRGV2aWNlSWRzKCkgY29uc3Q7Ci0KICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZ2V0QVBJMUNvbXBhdGlibGVDYW1lcmFEZXZpY2VJZHMoKSBjb25zdDsKIAogICAgIC8qKgpAQCAtMjkzLDYgKzI5MSw3IEBACiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFRvcmNoTW9kZShib29sIGVuYWJsZWQpID0gMDsKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FtZXJhSW5mbyhoYXJkd2FyZTo6Q2FtZXJhSW5mbyAqaW5mbykgY29uc3QgPSAwOwogICAgICAgICAgICAgdmlydHVhbCBib29sIGlzQVBJMUNvbXBhdGlibGUoKSBjb25zdCA9IDA7CisgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBTdGF0ZShpbnQgZmQpIGNvbnN0ID0gMDsKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKENhbWVyYU1ldGFkYXRhICpjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IHsKICAgICAgICAgICAgICAgICAodm9pZCkgY2hhcmFjdGVyaXN0aWNzOwogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTMxMyw5ICszMTIsOSBAQAogICAgICAgICAgICAgc3RhdGljIHN0YXR1c190IHNldFRvcmNoTW9kZShJbnRlcmZhY2VUJiBpbnRlcmZhY2UsIGJvb2wgZW5hYmxlZCk7CiAgICAgICAgIH07CiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxEZXZpY2VJbmZvPj4gbURldmljZXM7Ci0gICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBtVW5pcXVlQ2FtZXJhSWRzOworICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IG1VbmlxdWVDYW1lcmFJZHM7CiAgICAgICAgIGludCBtVW5pcXVlRGV2aWNlQ291bnQ7Ci0gICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBtVW5pcXVlQVBJMUNvbXBhdGlibGVDYW1lcmFJZHM7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gbVVuaXF1ZUFQSTFDb21wYXRpYmxlQ2FtZXJhSWRzOwogCiAgICAgICAgIC8vIEhBTHYxLXNwZWNpZmljIGNhbWVyYSBmaWVsZHMsIGluY2x1ZGluZyB0aGUgYWN0dWFsIGRldmljZSBpbnRlcmZhY2UKICAgICAgICAgc3RydWN0IERldmljZUluZm8xIDogcHVibGljIERldmljZUluZm8gewpAQCAtMzI2LDYgKzMyNSw3IEBACiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUluZm8oaGFyZHdhcmU6OkNhbWVyYUluZm8gKmluZm8pIGNvbnN0IG92ZXJyaWRlOwogICAgICAgICAgICAgLy9JbiBjYXNlIG9mIERldmljZTFJbmZvIGFzc3VtZSB0aGF0IHdlIGFyZSBhbHdheXMgQVBJMSBjb21wYXRpYmxlCiAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgaXNBUEkxQ29tcGF0aWJsZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcFN0YXRlKGludCBmZCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgICAgICAgICBEZXZpY2VJbmZvMShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgdWludDE2X3QgbWlub3JWZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LApAQCAtMzQzLDYgKzM0Myw3IEBACiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFRvcmNoTW9kZShib29sIGVuYWJsZWQpIG92ZXJyaWRlOwogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYW1lcmFJbmZvKGhhcmR3YXJlOjpDYW1lcmFJbmZvICppbmZvKSBjb25zdCBvdmVycmlkZTsKICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBpc0FQSTFDb21wYXRpYmxlKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBTdGF0ZShpbnQgZmQpIGNvbnN0IG92ZXJyaWRlOwogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCiAgICAgICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhICpjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IG92ZXJyaWRlOwogCkBAIC0zNjMsNiArMzY0LDggQEAKIAogICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXIgKm1NYW5hZ2VyOwogCisgICAgICAgIGJvb2wgbUluaXRpYWxpemVkID0gZmFsc2U7CisKICAgICAgICAgLy8gVGVtcGxhdGVkIG1ldGhvZCB0byBpbnN0YW50aWF0ZSB0aGUgcmlnaHQga2luZCBvZiBEZXZpY2VJbmZvIGFuZCBjYWxsIHRoZQogICAgICAgICAvLyByaWdodCBDYW1lcmFQcm92aWRlciBnZXRDYW1lcmFEZXZpY2VJbnRlcmZhY2VfKiBtZXRob2QuCiAgICAgICAgIHRlbXBsYXRlPGNsYXNzIERldmljZUluZm9UPgpAQCAtMzg0LDYgKzM4Nyw4IEBACiAKICAgICAgICAgLy8gR2VuZXJhdGUgdmVuZG9yIHRhZyBpZAogICAgICAgICBzdGF0aWMgbWV0YWRhdGFfdmVuZG9yX2lkX3QgZ2VuZXJhdGVWZW5kb3JUYWdJZChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSk7CisKKyAgICAgICAgdm9pZCByZW1vdmVEZXZpY2Uoc3RkOjpzdHJpbmcgaWQpOwogICAgIH07CiAKICAgICAvLyBVdGlsaXR5IHRvIGZpbmQgYSBEZXZpY2VJbmZvIGJ5IElEOyBwb2ludGVyIGlzIG9ubHkgdmFsaWQgd2hpbGUgbUludGVyZmFjZU11dGV4IGlzIGhlbGQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCmluZGV4IGE5ODBjZGUuLjZiOTU4YTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMzksNiArMzksOCBAQAogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAorI2luY2x1ZGUgPHV0aWxpdHk+CisKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgpAQCAtOTQsNyArOTYsNyBAQAogICAgIHJldHVybiBtSWQ7CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OmluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyKSB7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjppbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlciwgY29uc3QgU3RyaW5nOCYgbW9uaXRvclRhZ3MpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwpAQCAtMTY3LDYgKzE2OSwxMCBAQAogICAgIG1JbnRlcmZhY2UgPSBuZXcgSGFsSW50ZXJmYWNlKHNlc3Npb24sIHF1ZXVlKTsKICAgICBzdGQ6OnN0cmluZyBwcm92aWRlclR5cGU7CiAgICAgbVZlbmRvclRhZ0lkID0gbWFuYWdlci0+Z2V0UHJvdmlkZXJUYWdJZExvY2tlZChtSWQuc3RyaW5nKCkpOworICAgIG1UYWdNb25pdG9yLmluaXRpYWxpemUobVZlbmRvclRhZ0lkKTsKKyAgICBpZiAoIW1vbml0b3JUYWdzLmlzRW1wdHkoKSkgeworICAgICAgICBtVGFnTW9uaXRvci5wYXJzZVRhZ3NUb01vbml0b3IoU3RyaW5nOChtb25pdG9yVGFncykpOworICAgIH0KIAogICAgIHJldHVybiBpbml0aWFsaXplQ29tbW9uTG9ja2VkKCk7CiB9CkBAIC0xOTAsMTAgKzE5NiwxNCBAQAogICAgIC8qKiBDcmVhdGUgYnVmZmVyIG1hbmFnZXIgKi8KICAgICBtQnVmZmVyTWFuYWdlciA9IG5ldyBDYW1lcmEzQnVmZmVyTWFuYWdlcigpOwogCi0gICAgbVRhZ01vbml0b3IuaW5pdGlhbGl6ZShtVmVuZG9yVGFnSWQpOwotCisgICAgVmVjdG9yPGludDMyX3Q+IHNlc3Npb25QYXJhbUtleXM7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3Qgc2Vzc2lvbktleXNFbnRyeSA9IG1EZXZpY2VJbmZvLmZpbmQoCisgICAgICAgICAgICBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX1NFU1NJT05fS0VZUyk7CisgICAgaWYgKHNlc3Npb25LZXlzRW50cnkuY291bnQgPiAwKSB7CisgICAgICAgIHNlc3Npb25QYXJhbUtleXMuaW5zZXJ0QXJyYXlBdChzZXNzaW9uS2V5c0VudHJ5LmRhdGEuaTMyLCAwLCBzZXNzaW9uS2V5c0VudHJ5LmNvdW50KTsKKyAgICB9CiAgICAgLyoqIFN0YXJ0IHVwIHJlcXVlc3QgcXVldWUgdGhyZWFkICovCi0gICAgbVJlcXVlc3RUaHJlYWQgPSBuZXcgUmVxdWVzdFRocmVhZCh0aGlzLCBtU3RhdHVzVHJhY2tlciwgbUludGVyZmFjZSk7CisgICAgbVJlcXVlc3RUaHJlYWQgPSBuZXcgUmVxdWVzdFRocmVhZCh0aGlzLCBtU3RhdHVzVHJhY2tlciwgbUludGVyZmFjZSwgc2Vzc2lvblBhcmFtS2V5cyk7CiAgICAgcmVzID0gbVJlcXVlc3RUaHJlYWQtPnJ1bihTdHJpbmc4Ojpmb3JtYXQoIkMzRGV2LSVzLVJlcVF1ZXVlIiwgbUlkLnN0cmluZygpKS5zdHJpbmcoKSk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBTRVRfRVJSX0woIlVuYWJsZSB0byBzdGFydCByZXF1ZXN0IHF1ZXVlIHRocmVhZDogJXMgKCVkKSIsCkBAIC01NzQsMTMgKzU4NCwxMiBAQAogICAgIGJvb2wgZHVtcFRlbXBsYXRlcyA9IGZhbHNlOwogCiAgICAgU3RyaW5nMTYgdGVtcGxhdGVzT3B0aW9uKCItdCIpOwotICAgIFN0cmluZzE2IG1vbml0b3JPcHRpb24oIi1tIik7CiAgICAgaW50IG4gPSBhcmdzLnNpemUoKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgICBpZiAoYXJnc1tpXSA9PSB0ZW1wbGF0ZXNPcHRpb24pIHsKICAgICAgICAgICAgIGR1bXBUZW1wbGF0ZXMgPSB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIGlmIChhcmdzW2ldID09IG1vbml0b3JPcHRpb24pIHsKKyAgICAgICAgaWYgKGFyZ3NbaV0gPT0gVGFnTW9uaXRvcjo6a01vbml0b3JPcHRpb24pIHsKICAgICAgICAgICAgIGlmIChpICsgMSA8IG4pIHsKICAgICAgICAgICAgICAgICBTdHJpbmc4IG1vbml0b3JUYWdzID0gU3RyaW5nOChhcmdzW2kgKyAxXSk7CiAgICAgICAgICAgICAgICAgaWYgKG1vbml0b3JUYWdzID09ICJvZmYiKSB7CkBAIC02NjEsMTMgKzY3MCwxMyBAQAogICAgIH0KIAogICAgIGlmIChkdW1wVGVtcGxhdGVzKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKnRlbXBsYXRlTmFtZXNbXSA9IHsKKyAgICAgICAgY29uc3QgY2hhciAqdGVtcGxhdGVOYW1lc1tDQU1FUkEzX1RFTVBMQVRFX0NPVU5UXSA9IHsKICAgICAgICAgICAgICJURU1QTEFURV9QUkVWSUVXIiwKICAgICAgICAgICAgICJURU1QTEFURV9TVElMTF9DQVBUVVJFIiwKICAgICAgICAgICAgICJURU1QTEFURV9WSURFT19SRUNPUkQiLAogICAgICAgICAgICAgIlRFTVBMQVRFX1ZJREVPX1NOQVBTSE9UIiwKICAgICAgICAgICAgICJURU1QTEFURV9aRVJPX1NIVVRURVJfTEFHIiwKLSAgICAgICAgICAgICJURU1QTEFURV9NQU5VQUwiCisgICAgICAgICAgICAiVEVNUExBVEVfTUFOVUFMIiwKICAgICAgICAgfTsKIAogICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IENBTUVSQTNfVEVNUExBVEVfQ09VTlQ7IGkrKykgewpAQCAtNzMzLDcgKzc0Miw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OmNvbnZlcnRNZXRhZGF0YUxpc3RUb1JlcXVlc3RMaXN0TG9ja2VkKAotICAgICAgICBjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmbWV0YWRhdGFMaXN0LAorICAgICAgICBjb25zdCBMaXN0PGNvbnN0IFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NMaXN0PiAmbWV0YWRhdGFMaXN0LAogICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8Y29uc3QgU3VyZmFjZU1hcD4gJnN1cmZhY2VNYXBzLAogICAgICAgICBib29sIHJlcGVhdGluZywKICAgICAgICAgUmVxdWVzdExpc3QgKnJlcXVlc3RMaXN0KSB7CkBAIC03NDMsNyArNzUyLDcgQEAKICAgICB9CiAKICAgICBpbnQzMl90IGJ1cnN0SWQgPSAwOwotICAgIExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+Ojpjb25zdF9pdGVyYXRvciBtZXRhZGF0YUl0ID0gbWV0YWRhdGFMaXN0LmJlZ2luKCk7CisgICAgTGlzdDxjb25zdCBQaHlzaWNhbENhbWVyYVNldHRpbmdzTGlzdD46OmNvbnN0X2l0ZXJhdG9yIG1ldGFkYXRhSXQgPSBtZXRhZGF0YUxpc3QuYmVnaW4oKTsKICAgICBzdGQ6Omxpc3Q8Y29uc3QgU3VyZmFjZU1hcD46OmNvbnN0X2l0ZXJhdG9yIHN1cmZhY2VNYXBJdCA9IHN1cmZhY2VNYXBzLmJlZ2luKCk7CiAgICAgZm9yICg7IG1ldGFkYXRhSXQgIT0gbWV0YWRhdGFMaXN0LmVuZCgpICYmIHN1cmZhY2VNYXBJdCAhPSBzdXJmYWNlTWFwcy5lbmQoKTsKICAgICAgICAgICAgICsrbWV0YWRhdGFJdCwgKytzdXJmYWNlTWFwSXQpIHsKQEAgLTc1NywxMiArNzY2LDEzIEBACiAKICAgICAgICAgLy8gU2V0dXAgYnVyc3QgSWQgYW5kIHJlcXVlc3QgSWQKICAgICAgICAgbmV3UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5idXJzdElkID0gYnVyc3RJZCsrOwotICAgICAgICBpZiAobWV0YWRhdGFJdC0+ZXhpc3RzKEFORFJPSURfUkVRVUVTVF9JRCkpIHsKLSAgICAgICAgICAgIGlmIChtZXRhZGF0YUl0LT5maW5kKEFORFJPSURfUkVRVUVTVF9JRCkuY291bnQgPT0gMCkgeworICAgICAgICBpZiAobWV0YWRhdGFJdC0+YmVnaW4oKS0+bWV0YWRhdGEuZXhpc3RzKEFORFJPSURfUkVRVUVTVF9JRCkpIHsKKyAgICAgICAgICAgIGlmIChtZXRhZGF0YUl0LT5iZWdpbigpLT5tZXRhZGF0YS5maW5kKEFORFJPSURfUkVRVUVTVF9JRCkuY291bnQgPT0gMCkgewogICAgICAgICAgICAgICAgIENMT0dFKCJSZXF1ZXN0SUQgZW50cnkgZXhpc3RzOyBidXQgbXVzdCBub3QgYmUgZW1wdHkgaW4gbWV0YWRhdGEiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbmV3UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQgPSBtZXRhZGF0YUl0LT5maW5kKEFORFJPSURfUkVRVUVTVF9JRCkuZGF0YS5pMzJbMF07CisgICAgICAgICAgICBuZXdSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLnJlcXVlc3RJZCA9IG1ldGFkYXRhSXQtPmJlZ2luKCktPm1ldGFkYXRhLmZpbmQoCisgICAgICAgICAgICAgICAgICAgIEFORFJPSURfUkVRVUVTVF9JRCkuZGF0YS5pMzJbMF07CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBDTE9HRSgiUmVxdWVzdElEIGRvZXMgbm90IGV4aXN0IGluIG1ldGFkYXRhIik7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtNzk0LDE3ICs4MDQsMTkgQEAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OmNhcHR1cmUoQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QsIGludDY0X3QqIC8qbGFzdEZyYW1lTnVtYmVyKi8pIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCi0gICAgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gcmVxdWVzdHM7CisgICAgTGlzdDxjb25zdCBQaHlzaWNhbENhbWVyYVNldHRpbmdzTGlzdD4gcmVxdWVzdHNMaXN0OwogICAgIHN0ZDo6bGlzdDxjb25zdCBTdXJmYWNlTWFwPiBzdXJmYWNlTWFwczsKLSAgICBjb252ZXJ0VG9SZXF1ZXN0TGlzdChyZXF1ZXN0cywgc3VyZmFjZU1hcHMsIHJlcXVlc3QpOworICAgIGNvbnZlcnRUb1JlcXVlc3RMaXN0KHJlcXVlc3RzTGlzdCwgc3VyZmFjZU1hcHMsIHJlcXVlc3QpOwogCi0gICAgcmV0dXJuIGNhcHR1cmVMaXN0KHJlcXVlc3RzLCBzdXJmYWNlTWFwcywgLypsYXN0RnJhbWVOdW1iZXIqL05VTEwpOworICAgIHJldHVybiBjYXB0dXJlTGlzdChyZXF1ZXN0c0xpc3QsIHN1cmZhY2VNYXBzLCAvKmxhc3RGcmFtZU51bWJlciovTlVMTCk7CiB9CiAKLXZvaWQgQ2FtZXJhM0RldmljZTo6Y29udmVydFRvUmVxdWVzdExpc3QoTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4mIHJlcXVlc3RzLAordm9pZCBDYW1lcmEzRGV2aWNlOjpjb252ZXJ0VG9SZXF1ZXN0TGlzdChMaXN0PGNvbnN0IFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NMaXN0PiYgcmVxdWVzdHNMaXN0LAogICAgICAgICBzdGQ6Omxpc3Q8Y29uc3QgU3VyZmFjZU1hcD4mIHN1cmZhY2VNYXBzLAogICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgcmVxdWVzdCkgewotICAgIHJlcXVlc3RzLnB1c2hfYmFjayhyZXF1ZXN0KTsKKyAgICBQaHlzaWNhbENhbWVyYVNldHRpbmdzTGlzdCByZXF1ZXN0TGlzdDsKKyAgICByZXF1ZXN0TGlzdC5wdXNoX2JhY2soe3N0ZDo6c3RyaW5nKGdldElkKCkuc3RyaW5nKCkpLCByZXF1ZXN0fSk7CisgICAgcmVxdWVzdHNMaXN0LnB1c2hfYmFjayhyZXF1ZXN0TGlzdCk7CiAKICAgICBTdXJmYWNlTWFwIHN1cmZhY2VNYXA7CiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IHN0cmVhbXMgPSByZXF1ZXN0LmZpbmQoQU5EUk9JRF9SRVFVRVNUX09VVFBVVF9TVFJFQU1TKTsKQEAgLTgxNyw3ICs4MjksNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpzdWJtaXRSZXF1ZXN0c0hlbHBlcigKLSAgICAgICAgY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLAorICAgICAgICBjb25zdCBMaXN0PGNvbnN0IFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NMaXN0PiAmcmVxdWVzdHMsCiAgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxjb25zdCBTdXJmYWNlTWFwPiAmc3VyZmFjZU1hcHMsCiAgICAgICAgIGJvb2wgcmVwZWF0aW5nLAogICAgICAgICAvKm91dCovCkBAIC04NjMsMTEgKzg3NSw5IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotLy8gT25seSBvbmUgcHJvY2Vzc0NhcHR1cmVSZXN1bHQgc2hvdWxkIGJlIGNhbGxlZCBhdCBhIHRpbWUsIHNvCi0vLyB0aGUgbG9ja3Mgd29uJ3QgYmxvY2suIFRoZSBsb2NrcyBhcmUgcHJlc2VudCBoZXJlIHNpbXBseSB0byBlbmZvcmNlIHRoaXMuCi1oYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYTNEZXZpY2U6OnByb2Nlc3NDYXB0dXJlUmVzdWx0KAoraGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmEzRGV2aWNlOjpwcm9jZXNzQ2FwdHVyZVJlc3VsdF8zXzQoCiAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKLSAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXN1bHQ+JiByZXN1bHRzKSB7CisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgewogICAgIC8vIElkZWFsbHkgd2Ugc2hvdWxkIGdyYWIgbUxvY2ssIGJ1dCB0aGF0IGNhbiBsZWFkIHRvIGRlYWRsb2NrLCBhbmQKICAgICAvLyBpdCdzIG5vdCBzdXBlciBpbXBvcnRhbnQgdG8gZ2V0IHVwIHRvIGRhdGUgdmFsdWUgb2YgbVN0YXR1cyBmb3IgdGhpcwogICAgIC8vIHdhcm5pbmcgcHJpbnQsIGhlbmNlIHNraXBwaW5nIHRoZSBsb2NrIGhlcmUKQEAgLTg5MSw0NSArOTAxLDEyMSBAQAogICAgICAgICB9CiAgICAgfQogICAgIGZvciAoY29uc3QgYXV0byYgcmVzdWx0IDogcmVzdWx0cykgewotICAgICAgICBwcm9jZXNzT25lQ2FwdHVyZVJlc3VsdExvY2tlZChyZXN1bHQpOworICAgICAgICBwcm9jZXNzT25lQ2FwdHVyZVJlc3VsdExvY2tlZChyZXN1bHQudjNfMiwgcmVzdWx0LnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpOwogICAgIH0KICAgICBtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrLnVubG9jaygpOwogICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwogfQogCisvLyBPbmx5IG9uZSBwcm9jZXNzQ2FwdHVyZVJlc3VsdCBzaG91bGQgYmUgY2FsbGVkIGF0IGEgdGltZSwgc28KKy8vIHRoZSBsb2NrcyB3b24ndCBibG9jay4gVGhlIGxvY2tzIGFyZSBwcmVzZW50IGhlcmUgc2ltcGx5IHRvIGVuZm9yY2UgdGhpcy4KK2hhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhM0RldmljZTo6cHJvY2Vzc0NhcHR1cmVSZXN1bHQoCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKKyAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXN1bHQ+JiByZXN1bHRzKSB7CisgICAgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6UGh5c2ljYWxDYW1lcmFNZXRhZGF0YT4gbm9QaHlzTWV0YWRhdGE7CisKKyAgICAvLyBJZGVhbGx5IHdlIHNob3VsZCBncmFiIG1Mb2NrLCBidXQgdGhhdCBjYW4gbGVhZCB0byBkZWFkbG9jaywgYW5kCisgICAgLy8gaXQncyBub3Qgc3VwZXIgaW1wb3J0YW50IHRvIGdldCB1cCB0byBkYXRlIHZhbHVlIG9mIG1TdGF0dXMgZm9yIHRoaXMKKyAgICAvLyB3YXJuaW5nIHByaW50LCBoZW5jZSBza2lwcGluZyB0aGUgbG9jayBoZXJlCisgICAgaWYgKG1TdGF0dXMgPT0gU1RBVFVTX0VSUk9SKSB7CisgICAgICAgIC8vIFBlciBBUEkgY29udHJhY3QsIEhBTCBzaG91bGQgYWN0IGFzIGNsb3NlZCBhZnRlciBkZXZpY2UgZXJyb3IKKyAgICAgICAgLy8gQnV0IG1TdGF0dXMgY2FuIGJlIHNldCB0byBlcnJvciBieSBmcmFtZXdvcmsgYXMgd2VsbCwgc28ganVzdCBsb2cKKyAgICAgICAgLy8gYSB3YXJuaW5nIGhlcmUuCisgICAgICAgIEFMT0dXKCIlczogcmVjZWl2ZWQgY2FwdHVyZSByZXN1bHQgaW4gZXJyb3Igc3RhdGUuIiwgX19GVU5DVElPTl9fKTsKKyAgICB9CisKKyAgICBpZiAobVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jay50cnlMb2NrKCkgIT0gT0spIHsKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuOyBpdCBpbmRpY2F0ZXMgYSB3cm9uZyBjbGllbnQgaW1wbGVtZW50YXRpb24KKyAgICAgICAgLy8gdGhhdCBkb2Vzbid0IGZvbGxvdyB0aGUgY29udHJhY3QuIEJ1dCwgd2UgY2FuIGJlIHRvbGVyYW50IGhlcmUuCisgICAgICAgIEFMT0dFKCIlczogY2FsbGJhY2sgb3ZlcmxhcHBlZCEgd2FpdGluZyAxcy4uLiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgaWYgKG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2sudGltZWRMb2NrKDEwMDAwMDAwMDAgLyogMXMgKi8pICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCBhY3F1aXJlIGxvY2sgaW4gMXMsIGRyb3BwaW5nIHJlc3VsdHMiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgLy8gcmVhbGx5IGRvbid0IGtub3cgd2hhdCB0byBkbywgc28gYmFpbCBvdXQuCisgICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIHJlc3VsdCA6IHJlc3VsdHMpIHsKKyAgICAgICAgcHJvY2Vzc09uZUNhcHR1cmVSZXN1bHRMb2NrZWQocmVzdWx0LCBub1BoeXNNZXRhZGF0YSk7CisgICAgfQorICAgIG1Qcm9jZXNzQ2FwdHVyZVJlc3VsdExvY2sudW5sb2NrKCk7CisgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Cit9CisKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OnJlYWRPbmVDYW1lcmFNZXRhZGF0YUxvY2tlZCgKKyAgICAgICAgdWludDY0X3QgZm1xUmVzdWx0U2l6ZSwgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYW1lcmFNZXRhZGF0YSYgcmVzdWx0TWV0YWRhdGEsCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGEmIHJlc3VsdCkgeworICAgIGlmIChmbXFSZXN1bHRTaXplID4gMCkgeworICAgICAgICByZXN1bHRNZXRhZGF0YS5yZXNpemUoZm1xUmVzdWx0U2l6ZSk7CisgICAgICAgIGlmIChtUmVzdWx0TWV0YWRhdGFRdWV1ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOyAvLyBsb2dnZWQgaW4gaW5pdGlhbGl6ZSgpCisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtUmVzdWx0TWV0YWRhdGFRdWV1ZS0+cmVhZChyZXN1bHRNZXRhZGF0YS5kYXRhKCksIGZtcVJlc3VsdFNpemUpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCByZWFkIGNhbWVyYSBtZXRhZGF0YSBmcm9tIGZtcSwgc2l6ZSA9ICUiIFBSSXU2NCwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBmbXFSZXN1bHRTaXplKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdE1ldGFkYXRhLnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1aW50OF90ICo+KHJlc3VsdC5kYXRhKCkpLAorICAgICAgICAgICAgICAgIHJlc3VsdC5zaXplKCkpOworICAgIH0KKworICAgIGlmIChyZXN1bHRNZXRhZGF0YS5zaXplKCkgIT0gMCkgeworICAgICAgICBzdGF0dXNfdCByZXM7CisgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90KiBtZXRhZGF0YSA9CisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KHJlc3VsdE1ldGFkYXRhLmRhdGEoKSk7CisgICAgICAgIHNpemVfdCBleHBlY3RlZF9tZXRhZGF0YV9zaXplID0gcmVzdWx0TWV0YWRhdGEuc2l6ZSgpOworICAgICAgICBpZiAoKHJlcyA9IHZhbGlkYXRlX2NhbWVyYV9tZXRhZGF0YV9zdHJ1Y3R1cmUobWV0YWRhdGEsICZleHBlY3RlZF9tZXRhZGF0YV9zaXplKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgYnkgY2FtZXJhIHNlcnZpY2UgZnJvbSBIQUw6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCiB2b2lkIENhbWVyYTNEZXZpY2U6OnByb2Nlc3NPbmVDYXB0dXJlUmVzdWx0TG9ja2VkKAotICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXN1bHQmIHJlc3VsdCkgeworICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXN1bHQmIHJlc3VsdCwKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAorICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6UGh5c2ljYWxDYW1lcmFNZXRhZGF0YT4gcGh5c2ljYWxDYW1lcmFNZXRhZGF0YXMpIHsKICAgICBjYW1lcmEzX2NhcHR1cmVfcmVzdWx0IHI7CiAgICAgc3RhdHVzX3QgcmVzOwogICAgIHIuZnJhbWVfbnVtYmVyID0gcmVzdWx0LmZyYW1lTnVtYmVyOwogCisgICAgLy8gUmVhZCBhbmQgdmFsaWRhdGUgdGhlIHJlc3VsdCBtZXRhZGF0YS4KICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhIHJlc3VsdE1ldGFkYXRhOwotICAgIGlmIChyZXN1bHQuZm1xUmVzdWx0U2l6ZSA+IDApIHsKLSAgICAgICAgcmVzdWx0TWV0YWRhdGEucmVzaXplKHJlc3VsdC5mbXFSZXN1bHRTaXplKTsKLSAgICAgICAgaWYgKG1SZXN1bHRNZXRhZGF0YVF1ZXVlID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybjsgLy8gbG9nZ2VkIGluIGluaXRpYWxpemUoKQotICAgICAgICB9Ci0gICAgICAgIGlmICghbVJlc3VsdE1ldGFkYXRhUXVldWUtPnJlYWQocmVzdWx0TWV0YWRhdGEuZGF0YSgpLCByZXN1bHQuZm1xUmVzdWx0U2l6ZSkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IENhbm5vdCByZWFkIGNhbWVyYSBtZXRhZGF0YSBmcm9tIGZtcSwgc2l6ZSA9ICUiIFBSSXU2NCwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHQuZnJhbWVOdW1iZXIsIHJlc3VsdC5mbXFSZXN1bHRTaXplKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdE1ldGFkYXRhLnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1aW50OF90ICo+KHJlc3VsdC5yZXN1bHQuZGF0YSgpKSwKLSAgICAgICAgICAgICAgICByZXN1bHQucmVzdWx0LnNpemUoKSk7CisgICAgcmVzID0gcmVhZE9uZUNhbWVyYU1ldGFkYXRhTG9ja2VkKHJlc3VsdC5mbXFSZXN1bHRTaXplLCByZXN1bHRNZXRhZGF0YSwgcmVzdWx0LnJlc3VsdCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBGYWlsZWQgdG8gcmVhZCBjYXB0dXJlIHJlc3VsdCBtZXRhZGF0YSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHQuZnJhbWVOdW1iZXIpOworICAgICAgICByZXR1cm47CiAgICAgfQorICAgIHIucmVzdWx0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KHJlc3VsdE1ldGFkYXRhLmRhdGEoKSk7CiAKLSAgICBpZiAocmVzdWx0TWV0YWRhdGEuc2l6ZSgpICE9IDApIHsKLSAgICAgICAgci5yZXN1bHQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90Kj4ocmVzdWx0TWV0YWRhdGEuZGF0YSgpKTsKLSAgICAgICAgc2l6ZV90IGV4cGVjdGVkX21ldGFkYXRhX3NpemUgPSByZXN1bHRNZXRhZGF0YS5zaXplKCk7Ci0gICAgICAgIGlmICgocmVzID0gdmFsaWRhdGVfY2FtZXJhX21ldGFkYXRhX3N0cnVjdHVyZShyLnJlc3VsdCwgJmV4cGVjdGVkX21ldGFkYXRhX3NpemUpKSAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogSW52YWxpZCBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgYnkgY2FtZXJhIHNlcnZpY2UgZnJvbSBIQUw6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlciwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgLy8gUmVhZCBhbmQgdmFsaWRhdGUgcGh5c2ljYWwgY2FtZXJhIG1ldGFkYXRhCisgICAgc2l6ZV90IHBoeXNSZXN1bHRDb3VudCA9IHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGFzLnNpemUoKTsKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gcGh5c0NhbUlkcyhwaHlzUmVzdWx0Q291bnQpOworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICo+IHBoeUNhbU1ldGFkYXRhcyhwaHlzUmVzdWx0Q291bnQpOworICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGE+IHBoeXNSZXN1bHRNZXRhZGF0YTsKKyAgICBwaHlzUmVzdWx0TWV0YWRhdGEucmVzaXplKHBoeXNSZXN1bHRDb3VudCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzaWNhbENhbWVyYU1ldGFkYXRhcy5zaXplKCk7IGkrKykgeworICAgICAgICByZXMgPSByZWFkT25lQ2FtZXJhTWV0YWRhdGFMb2NrZWQocGh5c2ljYWxDYW1lcmFNZXRhZGF0YXNbaV0uZm1xTWV0YWRhdGFTaXplLAorICAgICAgICAgICAgICAgIHBoeXNSZXN1bHRNZXRhZGF0YVtpXSwgcGh5c2ljYWxDYW1lcmFNZXRhZGF0YXNbaV0ubWV0YWRhdGEpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBGYWlsZWQgdG8gcmVhZCBjYXB0dXJlIHJlc3VsdCBtZXRhZGF0YSBmb3IgY2FtZXJhICVzIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHQuZnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGFzW2ldLnBoeXNpY2FsQ2FtZXJhSWQuY19zdHIoKSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICByLnJlc3VsdCA9IG51bGxwdHI7CisgICAgICAgIHBoeXNDYW1JZHNbaV0gPSBwaHlzaWNhbENhbWVyYU1ldGFkYXRhc1tpXS5waHlzaWNhbENhbWVyYUlkLmNfc3RyKCk7CisgICAgICAgIHBoeUNhbU1ldGFkYXRhc1tpXSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2FtZXJhX21ldGFkYXRhX3QqPigKKyAgICAgICAgICAgICAgICBwaHlzUmVzdWx0TWV0YWRhdGFbaV0uZGF0YSgpKTsKICAgICB9CisgICAgci5udW1fcGh5c2NhbV9tZXRhZGF0YSA9IHBoeXNSZXN1bHRDb3VudDsKKyAgICByLnBoeXNjYW1faWRzID0gcGh5c0NhbUlkcy5kYXRhKCk7CisgICAgci5waHlzY2FtX21ldGFkYXRhID0gcGh5Q2FtTWV0YWRhdGFzLmRhdGEoKTsKIAogICAgIHN0ZDo6dmVjdG9yPGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90PiBvdXRwdXRCdWZmZXJzKHJlc3VsdC5vdXRwdXRCdWZmZXJzLnNpemUoKSk7CiAgICAgc3RkOjp2ZWN0b3I8YnVmZmVyX2hhbmRsZV90PiBvdXRwdXRCdWZmZXJIYW5kbGVzKHJlc3VsdC5vdXRwdXRCdWZmZXJzLnNpemUoKSk7CkBAIC0xMDY3LDQyICsxMTUzLDQzIEBACiAgICAgbm90aWZ5KCZtKTsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y2FwdHVyZUxpc3QoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLAorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y2FwdHVyZUxpc3QoY29uc3QgTGlzdDxjb25zdCBQaHlzaWNhbENhbWVyYVNldHRpbmdzTGlzdD4gJnJlcXVlc3RzTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxjb25zdCBTdXJmYWNlTWFwPiAmc3VyZmFjZU1hcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCi0gICAgcmV0dXJuIHN1Ym1pdFJlcXVlc3RzSGVscGVyKHJlcXVlc3RzLCBzdXJmYWNlTWFwcywgLypyZXBlYXRpbmcqL2ZhbHNlLCBsYXN0RnJhbWVOdW1iZXIpOworICAgIHJldHVybiBzdWJtaXRSZXF1ZXN0c0hlbHBlcihyZXF1ZXN0c0xpc3QsIHN1cmZhY2VNYXBzLCAvKnJlcGVhdGluZyovZmFsc2UsIGxhc3RGcmFtZU51bWJlcik7CiB9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OnNldFN0cmVhbWluZ1JlcXVlc3QoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIC8qbGFzdEZyYW1lTnVtYmVyKi8pIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCi0gICAgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gcmVxdWVzdHM7CisgICAgTGlzdDxjb25zdCBQaHlzaWNhbENhbWVyYVNldHRpbmdzTGlzdD4gcmVxdWVzdHNMaXN0OwogICAgIHN0ZDo6bGlzdDxjb25zdCBTdXJmYWNlTWFwPiBzdXJmYWNlTWFwczsKLSAgICBjb252ZXJ0VG9SZXF1ZXN0TGlzdChyZXF1ZXN0cywgc3VyZmFjZU1hcHMsIHJlcXVlc3QpOworICAgIGNvbnZlcnRUb1JlcXVlc3RMaXN0KHJlcXVlc3RzTGlzdCwgc3VyZmFjZU1hcHMsIHJlcXVlc3QpOwogCi0gICAgcmV0dXJuIHNldFN0cmVhbWluZ1JlcXVlc3RMaXN0KHJlcXVlc3RzLCAvKnN1cmZhY2VNYXAqL3N1cmZhY2VNYXBzLAorICAgIHJldHVybiBzZXRTdHJlYW1pbmdSZXF1ZXN0TGlzdChyZXF1ZXN0c0xpc3QsIC8qc3VyZmFjZU1hcCovc3VyZmFjZU1hcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbGFzdEZyYW1lTnVtYmVyKi9OVUxMKTsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6c2V0U3RyZWFtaW5nUmVxdWVzdExpc3QoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpsaXN0PGNvbnN0IFN1cmZhY2VNYXA+ICZzdXJmYWNlTWFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgeworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6c2V0U3RyZWFtaW5nUmVxdWVzdExpc3QoCisgICAgICAgIGNvbnN0IExpc3Q8Y29uc3QgUGh5c2ljYWxDYW1lcmFTZXR0aW5nc0xpc3Q+ICZyZXF1ZXN0c0xpc3QsCisgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxjb25zdCBTdXJmYWNlTWFwPiAmc3VyZmFjZU1hcHMsIGludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKLSAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNIZWxwZXIocmVxdWVzdHMsIHN1cmZhY2VNYXBzLCAvKnJlcGVhdGluZyovdHJ1ZSwgbGFzdEZyYW1lTnVtYmVyKTsKKyAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNIZWxwZXIocmVxdWVzdHNMaXN0LCBzdXJmYWNlTWFwcywgLypyZXBlYXRpbmcqL3RydWUsIGxhc3RGcmFtZU51bWJlcik7CiB9CiAKIHNwPENhbWVyYTNEZXZpY2U6OkNhcHR1cmVSZXF1ZXN0PiBDYW1lcmEzRGV2aWNlOjpzZXRVcFJlcXVlc3RMb2NrZWQoCi0gICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LCBjb25zdCBTdXJmYWNlTWFwICZzdXJmYWNlTWFwKSB7CisgICAgICAgIGNvbnN0IFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NMaXN0ICZyZXF1ZXN0LCBjb25zdCBTdXJmYWNlTWFwICZzdXJmYWNlTWFwKSB7CiAgICAgc3RhdHVzX3QgcmVzOwogCiAgICAgaWYgKG1TdGF0dXMgPT0gU1RBVFVTX1VOQ09ORklHVVJFRCB8fCBtTmVlZENvbmZpZykgewogICAgICAgICAvLyBUaGlzIHBvaW50IHNob3VsZCBvbmx5IGJlIHJlYWNoZWQgdmlhIEFQSTEgKEFQSTIgbXVzdCBleHBsaWNpdGx5IGNhbGwgY29uZmlndXJlU3RyZWFtcykKICAgICAgICAgLy8gc28gdW5pbGF0ZXJhbGx5IHNlbGVjdCBub3JtYWwgb3BlcmF0aW5nIG1vZGUuCi0gICAgICAgIHJlcyA9IGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoQ0FNRVJBM19TVFJFQU1fQ09ORklHVVJBVElPTl9OT1JNQUxfTU9ERSk7CisgICAgICAgIHJlcyA9IGZpbHRlclBhcmFtc0FuZENvbmZpZ3VyZUxvY2tlZChyZXF1ZXN0LmJlZ2luKCktPm1ldGFkYXRhLAorICAgICAgICAgICAgICAgIENBTUVSQTNfU1RSRUFNX0NPTkZJR1VSQVRJT05fTk9STUFMX01PREUpOwogICAgICAgICAvLyBTdHJlYW0gY29uZmlndXJhdGlvbiBmYWlsZWQuIENsaWVudCBtaWdodCB0cnkgb3RoZXIgY29uZmlndXJhaXRvbnMuCiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIENMT0dFKCJDYW4ndCBzZXQgdXAgc3RyZWFtczogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtMTIwNSw4ICsxMjkyLDggQEAKICAgICAvLyBDb250aW51ZSBjYXB0dXJlcyBpZiBhY3RpdmUgYXQgc3RhcnQKICAgICBpZiAod2FzQWN0aXZlKSB7CiAgICAgICAgIEFMT0dWKCIlczogUmVzdGFydGluZyBhY3Rpdml0eSB0byByZWNvbmZpZ3VyZSBzdHJlYW1zIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgLy8gUmV1c2UgY3VycmVudCBvcGVyYXRpbmcgbW9kZSBmb3IgbmV3IHN0cmVhbSBjb25maWcKLSAgICAgICAgcmVzID0gY29uZmlndXJlU3RyZWFtc0xvY2tlZChtT3BlcmF0aW5nTW9kZSk7CisgICAgICAgIC8vIFJldXNlIGN1cnJlbnQgb3BlcmF0aW5nIG1vZGUgYW5kIHNlc3Npb24gcGFyYW1ldGVycyBmb3IgbmV3IHN0cmVhbSBjb25maWcKKyAgICAgICAgcmVzID0gY29uZmlndXJlU3RyZWFtc0xvY2tlZChtT3BlcmF0aW5nTW9kZSwgbVNlc3Npb25QYXJhbXMpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbid0IHJlY29uZmlndXJlIGRldmljZSBmb3IgbmV3IHN0cmVhbSAlZDogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbU5leHRTdHJlYW1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC0xMjIyLDcgKzEzMDksOCBAQAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y3JlYXRlU3RyZWFtKHNwPFN1cmZhY2U+IGNvbnN1bWVyLAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKICAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwKLSAgICAgICAgICAgIGludCBzdHJlYW1TZXRJZCwgYm9vbCBpc1NoYXJlZCwgdWludDY0X3QgY29uc3VtZXJVc2FnZSkgeworICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMsIGludCBzdHJlYW1TZXRJZCwgYm9vbCBpc1NoYXJlZCwgdWludDY0X3QgY29uc3VtZXJVc2FnZSkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKICAgICBpZiAoY29uc3VtZXIgPT0gbnVsbHB0cikgewpAQCAtMTIzNCwyMCArMTMyMiwyNCBAQAogICAgIGNvbnN1bWVycy5wdXNoX2JhY2soY29uc3VtZXIpOwogCiAgICAgcmV0dXJuIGNyZWF0ZVN0cmVhbShjb25zdW1lcnMsIC8qaGFzRGVmZXJyZWRDb25zdW1lciovIGZhbHNlLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLCBpZCwgc3RyZWFtU2V0SWQsIGlzU2hhcmVkLCBjb25zdW1lclVzYWdlKTsKKyAgICAgICAgICAgIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwgaWQsIHBoeXNpY2FsQ2FtZXJhSWQsIHN1cmZhY2VJZHMsIHN0cmVhbVNldElkLAorICAgICAgICAgICAgaXNTaGFyZWQsIGNvbnN1bWVyVXNhZ2UpOwogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjcmVhdGVTdHJlYW0oY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBjb25zdW1lcnMsCiAgICAgICAgIGJvb2wgaGFzRGVmZXJyZWRDb25zdW1lciwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLAotICAgICAgICBpbnQgc3RyZWFtU2V0SWQsIGJvb2wgaXNTaGFyZWQsIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UpIHsKKyAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcywgaW50IHN0cmVhbVNldElkLCBib29sIGlzU2hhcmVkLCB1aW50NjRfdCBjb25zdW1lclVzYWdlKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKKwogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAgICAgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uID0gZ2V0RXhwZWN0ZWRJbkZsaWdodER1cmF0aW9uKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogICAgIEFMT0dWKCJDYW1lcmEgJXM6IENyZWF0aW5nIG5ldyBzdHJlYW0gJWQ6ICVkIHggJWQsIGZvcm1hdCAlZCwgZGF0YXNwYWNlICVkIHJvdGF0aW9uICVkIgotICAgICAgICAgICAgIiBjb25zdW1lciB1c2FnZSAlIiBQUkl1NjQgIiwgaXNTaGFyZWQgJWQiLCBtSWQuc3RyaW5nKCksIG1OZXh0U3RyZWFtSWQsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwKLSAgICAgICAgICAgIGRhdGFTcGFjZSwgcm90YXRpb24sIGNvbnN1bWVyVXNhZ2UsIGlzU2hhcmVkKTsKKyAgICAgICAgICAgICIgY29uc3VtZXIgdXNhZ2UgJSIgUFJJdTY0ICIsIGlzU2hhcmVkICVkLCBwaHlzaWNhbENhbWVyYUlkICVzIiwgbUlkLnN0cmluZygpLAorICAgICAgICAgICAgbU5leHRTdHJlYW1JZCwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLCBjb25zdW1lclVzYWdlLCBpc1NoYXJlZCwKKyAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQuc3RyaW5nKCkpOwogCiAgICAgc3RhdHVzX3QgcmVzOwogICAgIGJvb2wgd2FzQWN0aXZlID0gZmFsc2U7CkBAIC0xMzA3LDcgKzEzOTksNyBAQAogICAgICAgICB9CiAgICAgICAgIG5ld1N0cmVhbSA9IG5ldyBDYW1lcmEzT3V0cHV0U3RyZWFtKG1OZXh0U3RyZWFtSWQsIGNvbnN1bWVyc1swXSwKICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBibG9iQnVmZmVyU2l6ZSwgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLAotICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBPZmZzZXQsIHN0cmVhbVNldElkKTsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0LCBwaHlzaWNhbENhbWVyYUlkLCBzdHJlYW1TZXRJZCk7CiAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9SQVdfT1BBUVVFKSB7CiAgICAgICAgIHNzaXplX3QgcmF3T3BhcXVlQnVmZmVyU2l6ZSA9IGdldFJhd09wYXF1ZUJ1ZmZlclNpemUod2lkdGgsIGhlaWdodCk7CiAgICAgICAgIGlmIChyYXdPcGFxdWVCdWZmZXJTaXplIDw9IDApIHsKQEAgLTEzMTYsMjAgKzE0MDgsMzMgQEAKICAgICAgICAgfQogICAgICAgICBuZXdTdHJlYW0gPSBuZXcgQ2FtZXJhM091dHB1dFN0cmVhbShtTmV4dFN0cmVhbUlkLCBjb25zdW1lcnNbMF0sCiAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgcmF3T3BhcXVlQnVmZmVyU2l6ZSwgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLAotICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBPZmZzZXQsIHN0cmVhbVNldElkKTsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0LCBwaHlzaWNhbENhbWVyYUlkLCBzdHJlYW1TZXRJZCk7CiAgICAgfSBlbHNlIGlmIChpc1NoYXJlZCkgewogICAgICAgICBuZXdTdHJlYW0gPSBuZXcgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbShtTmV4dFN0cmVhbUlkLCBjb25zdW1lcnMsCiAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBjb25zdW1lclVzYWdlLCBkYXRhU3BhY2UsIHJvdGF0aW9uLAotICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBPZmZzZXQsIHN0cmVhbVNldElkKTsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0LCBwaHlzaWNhbENhbWVyYUlkLCBzdHJlYW1TZXRJZCk7CiAgICAgfSBlbHNlIGlmIChjb25zdW1lcnMuc2l6ZSgpID09IDAgJiYgaGFzRGVmZXJyZWRDb25zdW1lcikgewogICAgICAgICBuZXdTdHJlYW0gPSBuZXcgQ2FtZXJhM091dHB1dFN0cmVhbShtTmV4dFN0cmVhbUlkLAogICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgY29uc3VtZXJVc2FnZSwgZGF0YVNwYWNlLCByb3RhdGlvbiwKLSAgICAgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0LCBzdHJlYW1TZXRJZCk7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCwgcGh5c2ljYWxDYW1lcmFJZCwgc3RyZWFtU2V0SWQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG5ld1N0cmVhbSA9IG5ldyBDYW1lcmEzT3V0cHV0U3RyZWFtKG1OZXh0U3RyZWFtSWQsIGNvbnN1bWVyc1swXSwKICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sCi0gICAgICAgICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCwgc3RyZWFtU2V0SWQpOworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBPZmZzZXQsIHBoeXNpY2FsQ2FtZXJhSWQsIHN0cmVhbVNldElkKTsKICAgICB9CisKKyAgICBzaXplX3QgY29uc3VtZXJDb3VudCA9IGNvbnN1bWVycy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb25zdW1lckNvdW50OyBpKyspIHsKKyAgICAgICAgaW50IGlkID0gbmV3U3RyZWFtLT5nZXRTdXJmYWNlSWQoY29uc3VtZXJzW2ldKTsKKyAgICAgICAgaWYgKGlkIDwgMCkgeworICAgICAgICAgICAgU0VUX0VSUl9MKCJJbnZhbGlkIHN1cmZhY2UgaWQiKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN1cmZhY2VJZHMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc3VyZmFjZUlkcy0+cHVzaF9iYWNrKGlkKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIG5ld1N0cmVhbS0+c2V0U3RhdHVzVHJhY2tlcihtU3RhdHVzVHJhY2tlcik7CiAKICAgICBuZXdTdHJlYW0tPnNldEJ1ZmZlck1hbmFnZXIobUJ1ZmZlck1hbmFnZXIpOwpAQCAtMTM0Niw4ICsxNDUxLDggQEAKICAgICAvLyBDb250aW51ZSBjYXB0dXJlcyBpZiBhY3RpdmUgYXQgc3RhcnQKICAgICBpZiAod2FzQWN0aXZlKSB7CiAgICAgICAgIEFMT0dWKCIlczogUmVzdGFydGluZyBhY3Rpdml0eSB0byByZWNvbmZpZ3VyZSBzdHJlYW1zIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgLy8gUmV1c2UgY3VycmVudCBvcGVyYXRpbmcgbW9kZSBmb3IgbmV3IHN0cmVhbSBjb25maWcKLSAgICAgICAgcmVzID0gY29uZmlndXJlU3RyZWFtc0xvY2tlZChtT3BlcmF0aW5nTW9kZSk7CisgICAgICAgIC8vIFJldXNlIGN1cnJlbnQgb3BlcmF0aW5nIG1vZGUgYW5kIHNlc3Npb24gcGFyYW1ldGVycyBmb3IgbmV3IHN0cmVhbSBjb25maWcKKyAgICAgICAgcmVzID0gY29uZmlndXJlU3RyZWFtc0xvY2tlZChtT3BlcmF0aW5nTW9kZSwgbVNlc3Npb25QYXJhbXMpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBDTE9HRSgiQ2FuJ3QgcmVjb25maWd1cmUgZGV2aWNlIGZvciBuZXcgc3RyZWFtICVkOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgbU5leHRTdHJlYW1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC0xNDQ1LDcgKzE1NTAsNyBAQAogICAgIC8vIENhbWVyYURldmljZSBzZW1hbnRpY3MgcmVxdWlyZSBkZXZpY2UgdG8gYWxyZWFkeSBiZSBpZGxlIGJlZm9yZQogICAgIC8vIGRlbGV0ZVN0cmVhbSBpcyBjYWxsZWQsIHVubGlrZSBmb3IgY3JlYXRlU3RyZWFtLgogICAgIGlmIChtU3RhdHVzID09IFNUQVRVU19BQ1RJVkUpIHsKLSAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJXM6IERldmljZSBub3QgaWRsZSIsIF9fRlVOQ1RJT05fXywgbUlkLnN0cmluZygpKTsKKyAgICAgICAgQUxPR1coIiVzOiBDYW1lcmEgJXM6IERldmljZSBub3QgaWRsZSIsIF9fRlVOQ1RJT05fXywgbUlkLnN0cmluZygpKTsKICAgICAgICAgcmV0dXJuIC1FQlVTWTsKICAgICB9CiAKQEAgLTE0ODUsMTQgKzE1OTAsMzggQEAKICAgICByZXR1cm4gcmVzOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjb25maWd1cmVTdHJlYW1zKGludCBvcGVyYXRpbmdNb2RlKSB7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjb25maWd1cmVTdHJlYW1zKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzZXNzaW9uUGFyYW1zLCBpbnQgb3BlcmF0aW5nTW9kZSkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzOiBFIiwgX19GVU5DVElPTl9fKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCi0gICAgcmV0dXJuIGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQob3BlcmF0aW5nTW9kZSk7CisgICAgcmV0dXJuIGZpbHRlclBhcmFtc0FuZENvbmZpZ3VyZUxvY2tlZChzZXNzaW9uUGFyYW1zLCBvcGVyYXRpbmdNb2RlKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6ZmlsdGVyUGFyYW1zQW5kQ29uZmlndXJlTG9ja2VkKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzZXNzaW9uUGFyYW1zLAorICAgICAgICBpbnQgb3BlcmF0aW5nTW9kZSkgeworICAgIC8vRmlsdGVyIG91dCBhbnkgaW5jb21pbmcgc2Vzc2lvbiBwYXJhbWV0ZXJzCisgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgcGFyYW1zKHNlc3Npb25QYXJhbXMpOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGF2YWlsYWJsZVNlc3Npb25LZXlzID0gbURldmljZUluZm8uZmluZCgKKyAgICAgICAgICAgIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfU0VTU0lPTl9LRVlTKTsKKyAgICBDYW1lcmFNZXRhZGF0YSBmaWx0ZXJlZFBhcmFtcyhhdmFpbGFibGVTZXNzaW9uS2V5cy5jb3VudCk7CisgICAgY2FtZXJhX21ldGFkYXRhX3QgKm1ldGEgPSBjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90ICo+KAorICAgICAgICAgICAgZmlsdGVyZWRQYXJhbXMuZ2V0QW5kTG9jaygpKTsKKyAgICBzZXRfY2FtZXJhX21ldGFkYXRhX3ZlbmRvcl9pZChtZXRhLCBtVmVuZG9yVGFnSWQpOworICAgIGZpbHRlcmVkUGFyYW1zLnVubG9jayhtZXRhKTsKKyAgICBpZiAoYXZhaWxhYmxlU2Vzc2lvbktleXMuY291bnQgPiAwKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlU2Vzc2lvbktleXMuY291bnQ7IGkrKykgeworICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGVudHJ5ID0gcGFyYW1zLmZpbmQoCisgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZVNlc3Npb25LZXlzLmRhdGEuaTMyW2ldKTsKKyAgICAgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBmaWx0ZXJlZFBhcmFtcy51cGRhdGUoZW50cnkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQob3BlcmF0aW5nTW9kZSwgZmlsdGVyZWRQYXJhbXMpOwogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpnZXRJbnB1dEJ1ZmZlclByb2R1Y2VyKApAQCAtMTYxNCwxMCArMTc0MywxNiBAQAogICAgIG1TdGF0dXNDaGFuZ2VkLmJyb2FkY2FzdCgpOwogfQogCit2b2lkIENhbWVyYTNEZXZpY2U6OnBhdXNlU3RhdGVOb3RpZnkoYm9vbCBlbmFibGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKworICAgIG1QYXVzZVN0YXRlTm90aWZ5ID0gZW5hYmxlOworfQorCiAvLyBQYXVzZSB0byByZWNvbmZpZ3VyZQogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6aW50ZXJuYWxQYXVzZUFuZFdhaXRMb2NrZWQobnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uKSB7CiAgICAgbVJlcXVlc3RUaHJlYWQtPnNldFBhdXNlZCh0cnVlKTsKLSAgICBtUGF1c2VTdGF0ZU5vdGlmeSA9IHRydWU7CiAKICAgICBBTE9HVigiJXM6IENhbWVyYSAlczogSW50ZXJuYWwgd2FpdCB1bnRpbCBpZGxlICglICIgUFJJaTY0ICIgbnMpIiwgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCksCiAgICAgICAgICAgbWF4RXhwZWN0ZWREdXJhdGlvbik7CkBAIC0xNjM2LDYgKzE3NzEsOCBAQAogCiAgICAgbVJlcXVlc3RUaHJlYWQtPnNldFBhdXNlZChmYWxzZSk7CiAKKyAgICBBTE9HVigiJXM6IENhbWVyYSAlczogSW50ZXJuYWwgd2FpdCB1bnRpbCBhY3RpdmUgKCUgIiBQUklpNjQgIiBucykiLCBfX0ZVTkNUSU9OX18sIG1JZC5zdHJpbmcoKSwKKyAgICAgICAgICAgIGtBY3RpdmVUaW1lb3V0KTsKICAgICByZXMgPSB3YWl0VW50aWxTdGF0ZVRoZW5SZWxvY2soLyphY3RpdmUqLyB0cnVlLCBrQWN0aXZlVGltZW91dCk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBTRVRfRVJSX0woIkNhbid0IHRyYW5zaXRpb24gdG8gYWN0aXZlIGluICVmIHNlY29uZHMhIiwKQEAgLTE3NDQsNiArMTg4MSw3IEBACiAgICAgQ2FwdHVyZVJlc3VsdCAmcmVzdWx0ID0gKihtUmVzdWx0UXVldWUuYmVnaW4oKSk7CiAgICAgZnJhbWUtPm1SZXN1bHRFeHRyYXMgPSByZXN1bHQubVJlc3VsdEV4dHJhczsKICAgICBmcmFtZS0+bU1ldGFkYXRhLmFjcXVpcmUocmVzdWx0Lm1NZXRhZGF0YSk7CisgICAgZnJhbWUtPm1QaHlzaWNhbE1ldGFkYXRhcyA9IHN0ZDo6bW92ZShyZXN1bHQubVBoeXNpY2FsTWV0YWRhdGFzKTsKICAgICBtUmVzdWx0UXVldWUuZXJhc2UobVJlc3VsdFF1ZXVlLmJlZ2luKCkpOwogCiAgICAgcmV0dXJuIE9LOwpAQCAtMTkxNiw4ICsyMDU0LDggQEAKICAgICAgICAgaWYgKG1TdGF0dXMgIT0gU1RBVFVTX0FDVElWRSAmJiBtU3RhdHVzICE9IFNUQVRVU19DT05GSUdVUkVEKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJXM6IE5vdyAlcyIsIF9fRlVOQ1RJT05fXywgbUlkLnN0cmluZygpLAotICAgICAgICAgICAgICAgIGlkbGUgPyAiaWRsZSIgOiAiYWN0aXZlIik7CisgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVzOiBOb3cgJXMsIHBhdXNlU3RhdGU6ICVzIiwgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgaWRsZSA/ICJpZGxlIiA6ICJhY3RpdmUiLCBtUGF1c2VTdGF0ZU5vdGlmeSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwogICAgICAgICBpbnRlcm5hbFVwZGF0ZVN0YXR1c0xvY2tlZChpZGxlID8gU1RBVFVTX0NPTkZJR1VSRUQgOiBTVEFUVVNfQUNUSVZFKTsKIAogICAgICAgICAvLyBTa2lwIG5vdGlmeWluZyBsaXN0ZW5lciBpZiB3ZSdyZSBkb2luZyBzb21lIHVzZXItdHJhbnNwYXJlbnQKQEAgLTE5MzYsMTAgKzIwNzQsMTUgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6c2V0Q29uc3VtZXJTdXJmYWNlcyhpbnQgc3RyZWFtSWQsCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzLCBzdGQ6OnZlY3RvcjxpbnQ+ICpzdXJmYWNlSWRzKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXM6IENhbWVyYSAlczogc2V0IGNvbnN1bWVyIHN1cmZhY2UgZm9yIHN0cmVhbSAlZCIsCiAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZC5zdHJpbmcoKSwgc3RyZWFtSWQpOworCisgICAgaWYgKHN1cmZhY2VJZHMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKwogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCkBAIC0xOTYwLDYgKzIxMDMsMTUgQEAKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKKyAgICBmb3IgKGF1dG8gJmNvbnN1bWVyIDogY29uc3VtZXJzKSB7CisgICAgICAgIGludCBpZCA9IHN0cmVhbS0+Z2V0U3VyZmFjZUlkKGNvbnN1bWVyKTsKKyAgICAgICAgaWYgKGlkIDwgMCkgeworICAgICAgICAgICAgQ0xPR0UoIkludmFsaWQgc3VyZmFjZSBpZCEiKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgc3VyZmFjZUlkcy0+cHVzaF9iYWNrKGlkKTsKKyAgICB9CisKICAgICBpZiAoc3RyZWFtLT5pc0NvbnN1bWVyQ29uZmlndXJhdGlvbkRlZmVycmVkKCkpIHsKICAgICAgICAgaWYgKCFzdHJlYW0tPmlzQ29uZmlndXJpbmcoKSkgewogICAgICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCB3YXMgYWxyZWFkeSBmdWxseSBjb25maWd1cmVkLiIsIHN0cmVhbUlkKTsKQEAgLTE5NzcsNiArMjEyOSw0MCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6dXBkYXRlU3RyZWFtKGludCBzdHJlYW1JZCwgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+ICZuZXdTdXJmYWNlcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8T3V0cHV0U3RyZWFtSW5mbz4gJm91dHB1dEluZm8sCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4gJnJlbW92ZWRTdXJmYWNlSWRzLCBLZXllZFZlY3RvcjxzcDxTdXJmYWNlPiwgc2l6ZV90PiAqb3V0cHV0TWFwKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICBzc2l6ZV90IGlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoc3RyZWFtSWQpOworICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBpcyB1bmtub3duIiwgc3RyZWFtSWQpOworICAgICAgICByZXR1cm4gaWR4OworICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiByZW1vdmVkU3VyZmFjZUlkcykgeworICAgICAgICBpZiAobVJlcXVlc3RUaHJlYWQtPmlzT3V0cHV0U3VyZmFjZVBlbmRpbmcoc3RyZWFtSWQsIGl0KSkgeworICAgICAgICAgICAgQ0xPR0UoIlNoYXJlZCBzdXJmYWNlIHN0aWxsIHBhcnQgb2YgYSBwZW5kaW5nIHJlcXVlc3QhIik7CisgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworICAgICAgICB9CisgICAgfQorCisgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXNbaWR4XTsKKyAgICBzdGF0dXNfdCByZXMgPSBzdHJlYW0tPnVwZGF0ZVN0cmVhbShuZXdTdXJmYWNlcywgb3V0cHV0SW5mbywgcmVtb3ZlZFN1cmZhY2VJZHMsIG91dHB1dE1hcCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGZhaWxlZCB0byB1cGRhdGUgc3RyZWFtIChlcnJvciAlZCAlcykgIiwKKyAgICAgICAgICAgICAgc3RyZWFtSWQsIHJlcywgc3RyZXJyb3IoLXJlcykpOworICAgICAgICBpZiAocmVzID09IFVOS05PV05fRVJST1IpIHsKKyAgICAgICAgICAgIFNFVF9FUlJfTCgiJXM6IFN0cmVhbSB1cGRhdGUgZmFpbGVkIHRvIHJldmVydCB0byBwcmV2aW91cyBvdXRwdXQgY29uZmlndXJhdGlvbiEiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6ZHJvcFN0cmVhbUJ1ZmZlcnMoYm9vbCBkcm9wcGluZywgaW50IHN0cmVhbUlkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CkBAIC0xOTk2LDE1ICsyMTgyLDE1IEBACiAgKi8KIAogc3A8Q2FtZXJhM0RldmljZTo6Q2FwdHVyZVJlcXVlc3Q+IENhbWVyYTNEZXZpY2U6OmNyZWF0ZUNhcHR1cmVSZXF1ZXN0KAotICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwgY29uc3QgU3VyZmFjZU1hcCAmc3VyZmFjZU1hcCkgeworICAgICAgICBjb25zdCBQaHlzaWNhbENhbWVyYVNldHRpbmdzTGlzdCAmcmVxdWVzdCwgY29uc3QgU3VyZmFjZU1hcCAmc3VyZmFjZU1hcCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgc3RhdHVzX3QgcmVzOwogCiAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IG5ld1JlcXVlc3QgPSBuZXcgQ2FwdHVyZVJlcXVlc3Q7Ci0gICAgbmV3UmVxdWVzdC0+bVNldHRpbmdzID0gcmVxdWVzdDsKKyAgICBuZXdSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0ID0gcmVxdWVzdDsKIAogICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGlucHV0U3RyZWFtcyA9Ci0gICAgICAgICAgICBuZXdSZXF1ZXN0LT5tU2V0dGluZ3MuZmluZChBTkRST0lEX1JFUVVFU1RfSU5QVVRfU1RSRUFNUyk7CisgICAgICAgICAgICBuZXdSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCktPm1ldGFkYXRhLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0lOUFVUX1NUUkVBTVMpOwogICAgIGlmIChpbnB1dFN0cmVhbXMuY291bnQgPiAwKSB7CiAgICAgICAgIGlmIChtSW5wdXRTdHJlYW0gPT0gTlVMTCB8fAogICAgICAgICAgICAgICAgIG1JbnB1dFN0cmVhbS0+Z2V0SWQoKSAhPSBpbnB1dFN0cmVhbXMuZGF0YS5pMzJbMF0pIHsKQEAgLTIwMzAsMTEgKzIyMTYsMTEgQEAKICAgICAgICAgfQogCiAgICAgICAgIG5ld1JlcXVlc3QtPm1JbnB1dFN0cmVhbSA9IG1JbnB1dFN0cmVhbTsKLSAgICAgICAgbmV3UmVxdWVzdC0+bVNldHRpbmdzLmVyYXNlKEFORFJPSURfUkVRVUVTVF9JTlBVVF9TVFJFQU1TKTsKKyAgICAgICAgbmV3UmVxdWVzdC0+bVNldHRpbmdzTGlzdC5iZWdpbigpLT5tZXRhZGF0YS5lcmFzZShBTkRST0lEX1JFUVVFU1RfSU5QVVRfU1RSRUFNUyk7CiAgICAgfQogCiAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3Qgc3RyZWFtcyA9Ci0gICAgICAgICAgICBuZXdSZXF1ZXN0LT5tU2V0dGluZ3MuZmluZChBTkRST0lEX1JFUVVFU1RfT1VUUFVUX1NUUkVBTVMpOworICAgICAgICAgICAgbmV3UmVxdWVzdC0+bVNldHRpbmdzTGlzdC5iZWdpbigpLT5tZXRhZGF0YS5maW5kKEFORFJPSURfUkVRVUVTVF9PVVRQVVRfU1RSRUFNUyk7CiAgICAgaWYgKHN0cmVhbXMuY291bnQgPT0gMCkgewogICAgICAgICBDTE9HRSgiWmVybyBvdXRwdXQgc3RyZWFtcyBzcGVjaWZpZWQhIik7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMjA4Miw3ICsyMjY4LDcgQEAKIAogICAgICAgICBuZXdSZXF1ZXN0LT5tT3V0cHV0U3RyZWFtcy5wdXNoKHN0cmVhbSk7CiAgICAgfQotICAgIG5ld1JlcXVlc3QtPm1TZXR0aW5ncy5lcmFzZShBTkRST0lEX1JFUVVFU1RfT1VUUFVUX1NUUkVBTVMpOworICAgIG5ld1JlcXVlc3QtPm1TZXR0aW5nc0xpc3QuYmVnaW4oKS0+bWV0YWRhdGEuZXJhc2UoQU5EUk9JRF9SRVFVRVNUX09VVFBVVF9TVFJFQU1TKTsKICAgICBuZXdSZXF1ZXN0LT5tQmF0Y2hTaXplID0gMTsKIAogICAgIHJldHVybiBuZXdSZXF1ZXN0OwpAQCAtMjEyNCw5ICsyMzEwLDQ3IEBACiAgICAgLy8gcHJvcGVybHkgY2xlYW4gdGhpbmdzIHVwCiAgICAgaW50ZXJuYWxVcGRhdGVTdGF0dXNMb2NrZWQoU1RBVFVTX1VOQ09ORklHVVJFRCk7CiAgICAgbU5lZWRDb25maWcgPSB0cnVlOworCisgICAgcmVzID0gbVByZXBhcmVyVGhyZWFkLT5yZXN1bWUoKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzOiBQcmVwYXJlciB0aHJlYWQgZmFpbGVkIHRvIHJlc3VtZSEiLCBfX0ZVTkNUSU9OX18sIG1JZC5zdHJpbmcoKSk7CisgICAgfQogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjb25maWd1cmVTdHJlYW1zTG9ja2VkKGludCBvcGVyYXRpbmdNb2RlKSB7Citib29sIENhbWVyYTNEZXZpY2U6OnJlY29uZmlndXJlQ2FtZXJhKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzZXNzaW9uUGFyYW1zKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBib29sIHJldCA9IGZhbHNlOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKKyAgICBuc2Vjc190IG1heEV4cGVjdGVkRHVyYXRpb24gPSBnZXRFeHBlY3RlZEluRmxpZ2h0RHVyYXRpb24oKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBhdXRvIHJjID0gaW50ZXJuYWxQYXVzZUFuZFdhaXRMb2NrZWQobWF4RXhwZWN0ZWREdXJhdGlvbik7CisgICAgaWYgKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgIG1OZWVkQ29uZmlnID0gdHJ1ZTsKKyAgICAgICAgcmMgPSBjb25maWd1cmVTdHJlYW1zTG9ja2VkKG1PcGVyYXRpbmdNb2RlLCBzZXNzaW9uUGFyYW1zLCAvKm5vdGlmeVJlcXVlc3RUaHJlYWQqLyBmYWxzZSk7CisgICAgICAgIGlmIChyYyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1QYXVzZVN0YXRlTm90aWZ5ID0gZmFsc2U7CisgICAgICAgICAgICAvL01vdmluZyB0byBhY3RpdmUgc3RhdGUgd2hpbGUgaG9sZGluZyAnbUxvY2snIGlzIGltcG9ydGFudC4KKyAgICAgICAgICAgIC8vVGhlcmUgY291bGQgYmUgcGVuZGluZyBjYWxscyB0byAnY3JlYXRlLS9kZWxldGVTdHJlYW0nIHdoaWNoCisgICAgICAgICAgICAvL3dpbGwgdHJpZ2dlciBhbm90aGVyIHN0cmVhbSBjb25maWd1cmF0aW9uIHdoaWxlIHRoZSBhbHJlYWR5CisgICAgICAgICAgICAvL3ByZXNlbnQgc3RyZWFtcyBlbmQgdXAgd2l0aCBvdXRzdGFuZGluZyBidWZmZXJzIHRoYXQgd2lsbAorICAgICAgICAgICAgLy9ub3QgZ2V0IGRyYWluZWQuCisgICAgICAgICAgICBpbnRlcm5hbFVwZGF0ZVN0YXR1c0xvY2tlZChTVEFUVVNfQUNUSVZFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldEVycm9yU3RhdGVMb2NrZWQoIiVzOiBGYWlsZWQgdG8gcmUtY29uZmlndXJlIGNhbWVyYTogJWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJjKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHBhdXNlIHN0cmVhbWluZzogJWQiLCBfX0ZVTkNUSU9OX18sIHJjKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjb25maWd1cmVTdHJlYW1zTG9ja2VkKGludCBvcGVyYXRpbmdNb2RlLAorICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc2Vzc2lvblBhcmFtcywgYm9vbCBub3RpZnlSZXF1ZXN0VGhyZWFkKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCByZXM7CiAKQEAgLTIxNjcsMTIgKzIzOTEsMTYgQEAKICAgICAvLyBTdGFydCBjb25maWd1cmluZyB0aGUgc3RyZWFtcwogICAgIEFMT0dWKCIlczogQ2FtZXJhICVzOiBTdGFydGluZyBzdHJlYW0gY29uZmlndXJhdGlvbiIsIF9fRlVOQ1RJT05fXywgbUlkLnN0cmluZygpKTsKIAorICAgIG1QcmVwYXJlclRocmVhZC0+cGF1c2UoKTsKKwogICAgIGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb24gY29uZmlnOwogICAgIGNvbmZpZy5vcGVyYXRpb25fbW9kZSA9IG1PcGVyYXRpbmdNb2RlOwogICAgIGNvbmZpZy5udW1fc3RyZWFtcyA9IChtSW5wdXRTdHJlYW0gIT0gTlVMTCkgKyBtT3V0cHV0U3RyZWFtcy5zaXplKCk7CiAKICAgICBWZWN0b3I8Y2FtZXJhM19zdHJlYW1fdCo+IHN0cmVhbXM7CiAgICAgc3RyZWFtcy5zZXRDYXBhY2l0eShjb25maWcubnVtX3N0cmVhbXMpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBidWZmZXJTaXplcyhjb25maWcubnVtX3N0cmVhbXMsIDApOworCiAKICAgICBpZiAobUlucHV0U3RyZWFtICE9IE5VTEwpIHsKICAgICAgICAgY2FtZXJhM19zdHJlYW1fdCAqaW5wdXRTdHJlYW07CkBAIC0yMjAzLDYgKzI0MzEsMTQgQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogICAgICAgICBzdHJlYW1zLmFkZChvdXRwdXRTdHJlYW0pOworCisgICAgICAgIGlmIChvdXRwdXRTdHJlYW0tPmZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IgJiYKKyAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0tPmRhdGFfc3BhY2UgPT0gSEFMX0RBVEFTUEFDRV9WMF9KRklGKSB7CisgICAgICAgICAgICBzaXplX3QgayA9IGkgKyAoKG1JbnB1dFN0cmVhbSAhPSBudWxscHRyKSA/IDEgOiAwKTsgLy8gSW5wdXQgc3RyZWFtIGlmIHByZXNlbnQgc2hvdWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWx3YXlzIG9jY3VweSB0aGUgaW5pdGlhbCBlbnRyeS4KKyAgICAgICAgICAgIGJ1ZmZlclNpemVzW2tdID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KAorICAgICAgICAgICAgICAgICAgICBnZXRKcGVnQnVmZmVyU2l6ZShvdXRwdXRTdHJlYW0tPndpZHRoLCBvdXRwdXRTdHJlYW0tPmhlaWdodCkpOworICAgICAgICB9CiAgICAgfQogCiAgICAgY29uZmlnLnN0cmVhbXMgPSBzdHJlYW1zLmVkaXRBcnJheSgpOwpAQCAtMjIxMCw3ICsyNDQ2LDkgQEAKICAgICAvLyBEbyB0aGUgSEFMIGNvbmZpZ3VyYXRpb247IHdpbGwgcG90ZW50aWFsbHkgdG91Y2ggc3RyZWFtCiAgICAgLy8gbWF4X2J1ZmZlcnMsIHVzYWdlLCBwcml2IGZpZWxkcy4KIAotICAgIHJlcyA9IG1JbnRlcmZhY2UtPmNvbmZpZ3VyZVN0cmVhbXMoJmNvbmZpZyk7CisgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnNlc3Npb25CdWZmZXIgPSBzZXNzaW9uUGFyYW1zLmdldEFuZExvY2soKTsKKyAgICByZXMgPSBtSW50ZXJmYWNlLT5jb25maWd1cmVTdHJlYW1zKHNlc3Npb25CdWZmZXIsICZjb25maWcsIGJ1ZmZlclNpemVzKTsKKyAgICBzZXNzaW9uUGFyYW1zLnVubG9jayhzZXNzaW9uQnVmZmVyKTsKIAogICAgIGlmIChyZXMgPT0gQkFEX1ZBTFVFKSB7CiAgICAgICAgIC8vIEhBTCByZWplY3RlZCB0aGlzIHNldCBvZiBzdHJlYW1zIGFzIHVuc3VwcG9ydGVkLCBjbGVhbiB1cCBjb25maWcKQEAgLTIyNTYsNyArMjQ5NCw5IEBACiAKICAgICAvLyBSZXF1ZXN0IHRocmVhZCBuZWVkcyB0byBrbm93IHRvIGF2b2lkIHVzaW5nIHJlcGVhdC1sYXN0LXNldHRpbmdzIHByb3RvY29sCiAgICAgLy8gYWNyb3NzIGNvbmZpZ3VyZV9zdHJlYW1zKCkgY2FsbHMKLSAgICBtUmVxdWVzdFRocmVhZC0+Y29uZmlndXJhdGlvbkNvbXBsZXRlKG1Jc0NvbnN0cmFpbmVkSGlnaFNwZWVkQ29uZmlndXJhdGlvbik7CisgICAgaWYgKG5vdGlmeVJlcXVlc3RUaHJlYWQpIHsKKyAgICAgICAgbVJlcXVlc3RUaHJlYWQtPmNvbmZpZ3VyYXRpb25Db21wbGV0ZShtSXNDb25zdHJhaW5lZEhpZ2hTcGVlZENvbmZpZ3VyYXRpb24sIHNlc3Npb25QYXJhbXMpOworICAgIH0KIAogICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKICAgICBwcm9wZXJ0eV9nZXQoImNhbWVyYS5maWZvLmRpc2FibGUiLCB2YWx1ZSwgIjAiKTsKQEAgLTIyNzUsNiArMjUxNSwxNCBAQAogICAgIH0KIAogICAgIC8vIFVwZGF0ZSBkZXZpY2Ugc3RhdGUKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqbmV3U2Vzc2lvblBhcmFtcyA9IHNlc3Npb25QYXJhbXMuZ2V0QW5kTG9jaygpOworICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpjdXJyZW50U2Vzc2lvblBhcmFtcyA9IG1TZXNzaW9uUGFyYW1zLmdldEFuZExvY2soKTsKKyAgICBib29sIHVwZGF0ZVNlc3Npb25QYXJhbXMgPSAobmV3U2Vzc2lvblBhcmFtcyAhPSBjdXJyZW50U2Vzc2lvblBhcmFtcykgPyB0cnVlIDogZmFsc2U7CisgICAgc2Vzc2lvblBhcmFtcy51bmxvY2sobmV3U2Vzc2lvblBhcmFtcyk7CisgICAgbVNlc3Npb25QYXJhbXMudW5sb2NrKGN1cnJlbnRTZXNzaW9uUGFyYW1zKTsKKyAgICBpZiAodXBkYXRlU2Vzc2lvblBhcmFtcykgIHsKKyAgICAgICAgbVNlc3Npb25QYXJhbXMgPSBzZXNzaW9uUGFyYW1zOworICAgIH0KIAogICAgIG1OZWVkQ29uZmlnID0gZmFsc2U7CiAKQEAgLTIyODYsNiArMjUzNCwxMiBAQAogICAgIC8vIHRlYXIgZG93biB0aGUgZGVsZXRlZCBzdHJlYW1zIGFmdGVyIGNvbmZpZ3VyZSBzdHJlYW1zLgogICAgIG1EZWxldGVkU3RyZWFtcy5jbGVhcigpOwogCisgICAgYXV0byByYyA9IG1QcmVwYXJlclRocmVhZC0+cmVzdW1lKCk7CisgICAgaWYgKHJjICE9IE9LKSB7CisgICAgICAgIFNFVF9FUlJfTCgiJXM6IENhbWVyYSAlczogUHJlcGFyZXIgdGhyZWFkIGZhaWxlZCB0byByZXN1bWUhIiwgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0yNDExLDEzICsyNjY1LDE0IEBACiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OnJlZ2lzdGVySW5GbGlnaHQodWludDMyX3QgZnJhbWVOdW1iZXIsCiAgICAgICAgIGludDMyX3QgbnVtQnVmZmVycywgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXMsIGJvb2wgaGFzSW5wdXQsCi0gICAgICAgIGJvb2wgaGFzQXBwQ2FsbGJhY2ssIG5zZWNzX3QgbWF4RXhwZWN0ZWREdXJhdGlvbikgeworICAgICAgICBib29sIGhhc0FwcENhbGxiYWNrLCBuc2Vjc190IG1heEV4cGVjdGVkRHVyYXRpb24sCisgICAgICAgIHN0ZDo6c2V0PFN0cmluZzg+JiBwaHlzaWNhbENhbWVyYUlkcykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUluRmxpZ2h0TG9jayk7CiAKICAgICBzc2l6ZV90IHJlczsKICAgICByZXMgPSBtSW5GbGlnaHRNYXAuYWRkKGZyYW1lTnVtYmVyLCBJbkZsaWdodFJlcXVlc3QobnVtQnVmZmVycywgcmVzdWx0RXh0cmFzLCBoYXNJbnB1dCwKLSAgICAgICAgICAgIGhhc0FwcENhbGxiYWNrLCBtYXhFeHBlY3RlZER1cmF0aW9uKSk7CisgICAgICAgICAgICBoYXNBcHBDYWxsYmFjaywgbWF4RXhwZWN0ZWREdXJhdGlvbiwgcGh5c2ljYWxDYW1lcmFJZHMpKTsKICAgICBpZiAocmVzIDwgMCkgcmV0dXJuIHJlczsKIAogICAgIGlmIChtSW5GbGlnaHRNYXAuc2l6ZSgpID09IDEpIHsKQEAgLTI2NTcsNyArMjkxMiw4IEBACiAgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgJnJlc3VsdEV4dHJhcywKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgJmNvbGxlY3RlZFBhcnRpYWxSZXN1bHQsCiAgICAgICAgIHVpbnQzMl90IGZyYW1lTnVtYmVyLAotICAgICAgICBib29sIHJlcHJvY2VzcykgeworICAgICAgICBib29sIHJlcHJvY2VzcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4mIHBoeXNpY2FsTWV0YWRhdGFzKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAocGVuZGluZ01ldGFkYXRhLmlzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuOwpAQCAtMjY4Niw2ICsyOTQyLDcgQEAKICAgICBDYXB0dXJlUmVzdWx0IGNhcHR1cmVSZXN1bHQ7CiAgICAgY2FwdHVyZVJlc3VsdC5tUmVzdWx0RXh0cmFzID0gcmVzdWx0RXh0cmFzOwogICAgIGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhID0gcGVuZGluZ01ldGFkYXRhOworICAgIGNhcHR1cmVSZXN1bHQubVBoeXNpY2FsTWV0YWRhdGFzID0gcGh5c2ljYWxNZXRhZGF0YXM7CiAKICAgICAvLyBBcHBlbmQgYW55IHByZXZpb3VzIHBhcnRpYWxzIHRvIGZvcm0gYSBjb21wbGV0ZSByZXN1bHQKICAgICBpZiAobVVzZVBhcnRpYWxSZXN1bHQgJiYgIWNvbGxlY3RlZFBhcnRpYWxSZXN1bHQuaXNFbXB0eSgpKSB7CkBAIC0yNzAxLDYgKzI5NTgsMTUgQEAKICAgICAgICAgICAgICAgICBmcmFtZU51bWJlcik7CiAgICAgICAgIHJldHVybjsKICAgICB9CisgICAgZm9yIChhdXRvJiBwaHlzaWNhbE1ldGFkYXRhIDogY2FwdHVyZVJlc3VsdC5tUGh5c2ljYWxNZXRhZGF0YXMpIHsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IHRpbWVzdGFtcCA9CisgICAgICAgICAgICAgICAgcGh5c2ljYWxNZXRhZGF0YS5tUGh5c2ljYWxDYW1lcmFNZXRhZGF0YS5maW5kKEFORFJPSURfU0VOU09SX1RJTUVTVEFNUCk7CisgICAgICAgIGlmICh0aW1lc3RhbXAuY291bnQgPT0gMCkgeworICAgICAgICAgICAgU0VUX0VSUigiTm8gdGltZXN0YW1wIHByb3ZpZGVkIGJ5IEhBTCBmb3IgcGh5c2ljYWwgY2FtZXJhICVzIGZyYW1lICVkISIsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZzgocGh5c2ljYWxNZXRhZGF0YS5tUGh5c2ljYWxDYW1lcmFJZCkuY19zdHIoKSwgZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQogCiAgICAgbVRhZ01vbml0b3IubW9uaXRvck1ldGFkYXRhKFRhZ01vbml0b3I6OlJFU1VMVCwKICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCB0aW1lc3RhbXAuZGF0YS5pNjRbMF0sIGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhKTsKQEAgLTI3MzYsNyArMzAwMiw2IEBACiAKICAgICBib29sIGlzUGFydGlhbFJlc3VsdCA9IGZhbHNlOwogICAgIENhbWVyYU1ldGFkYXRhIGNvbGxlY3RlZFBhcnRpYWxSZXN1bHQ7Ci0gICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXM7CiAgICAgYm9vbCBoYXNJbnB1dEJ1ZmZlckluUmVxdWVzdCA9IGZhbHNlOwogCiAgICAgLy8gR2V0IHNodXR0ZXIgdGltZXN0YW1wIGFuZCByZXN1bHRFeHRyYXMgZnJvbSBsaXN0IG9mIGluLWZsaWdodCByZXF1ZXN0cywKQEAgLTI3NzcsNiArMzA0MiwxMSBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlzUGFydGlhbFJlc3VsdCA9IChyZXN1bHQtPnBhcnRpYWxfcmVzdWx0IDwgbU51bVBhcnRpYWxSZXN1bHRzKTsKKyAgICAgICAgICAgIGlmIChpc1BhcnRpYWxSZXN1bHQgJiYgcmVzdWx0LT5udW1fcGh5c2NhbV9tZXRhZGF0YSkgeworICAgICAgICAgICAgICAgIFNFVF9FUlIoIlJlc3VsdCBpcyBtYWxmb3JtZWQgZm9yIGZyYW1lICVkOiBwYXJ0aWFsX3Jlc3VsdCBub3QgYWxsb3dlZCBmb3IiCisgICAgICAgICAgICAgICAgICAgICAgICAiIHBoeXNpY2FsIGNhbWVyYSByZXN1bHQiLCBmcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGlzUGFydGlhbFJlc3VsdCkgewogICAgICAgICAgICAgICAgIHJlcXVlc3QuY29sbGVjdGVkUGFydGlhbFJlc3VsdC5hcHBlbmQocmVzdWx0LT5yZXN1bHQpOwogICAgICAgICAgICAgfQpAQCAtMjc5MywxMSArMzA2MywyOCBAQAogCiAgICAgICAgIC8vIERpZCB3ZSBnZXQgdGhlIChmaW5hbCkgcmVzdWx0IG1ldGFkYXRhIGZvciB0aGlzIGNhcHR1cmU/CiAgICAgICAgIGlmIChyZXN1bHQtPnJlc3VsdCAhPSBOVUxMICYmICFpc1BhcnRpYWxSZXN1bHQpIHsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0LnBoeXNpY2FsQ2FtZXJhSWRzLnNpemUoKSAhPSByZXN1bHQtPm51bV9waHlzY2FtX21ldGFkYXRhKSB7CisgICAgICAgICAgICAgICAgU0VUX0VSUigiUmVxdWVzdGVkIHBoeXNpY2FsIENhbWVyYSBJZHMgJWQgbm90IGVxdWFsIHRvIG51bWJlciBvZiBtZXRhZGF0YSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnBoeXNpY2FsQ2FtZXJhSWRzLnNpemUoKSwgcmVzdWx0LT5udW1fcGh5c2NhbV9tZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHJlcXVlc3QuaGF2ZVJlc3VsdE1ldGFkYXRhKSB7CiAgICAgICAgICAgICAgICAgU0VUX0VSUigiQ2FsbGVkIG11bHRpcGxlIHRpbWVzIHdpdGggbWV0YWRhdGEgZm9yIGZyYW1lICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcmVzdWx0LT5udW1fcGh5c2NhbV9tZXRhZGF0YTsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nOCBwaHlzaWNhbElkKHJlc3VsdC0+cGh5c2NhbV9pZHNbaV0pOworICAgICAgICAgICAgICAgIHN0ZDo6c2V0PFN0cmluZzg+OjppdGVyYXRvciBjYW1lcmFJZEl0ZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5waHlzaWNhbENhbWVyYUlkcy5maW5kKHBoeXNpY2FsSWQpOworICAgICAgICAgICAgICAgIGlmIChjYW1lcmFJZEl0ZXIgIT0gcmVxdWVzdC5waHlzaWNhbENhbWVyYUlkcy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnBoeXNpY2FsQ2FtZXJhSWRzLmVyYXNlKGNhbWVyYUlkSXRlcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU0VUX0VSUigiVG90YWwgcmVzdWx0IGZvciBmcmFtZSAlZCBoYXMgYWxyZWFkeSByZXR1cm5lZCBmb3IgY2FtZXJhICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlciwgcGh5c2ljYWxJZC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtVXNlUGFydGlhbFJlc3VsdCAmJgogICAgICAgICAgICAgICAgICAgICAhcmVxdWVzdC5jb2xsZWN0ZWRQYXJ0aWFsUmVzdWx0LmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIGNvbGxlY3RlZFBhcnRpYWxSZXN1bHQuYWNxdWlyZSgKQEAgLTI4NDIsMTUgKzMxMjksMjEgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChyZXN1bHQtPnJlc3VsdCAhPSBOVUxMICYmICFpc1BhcnRpYWxSZXN1bHQpIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCByZXN1bHQtPm51bV9waHlzY2FtX21ldGFkYXRhOyBpKyspIHsKKyAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBwaHlzaWNhbE1ldGFkYXRhOworICAgICAgICAgICAgICAgIHBoeXNpY2FsTWV0YWRhdGEuYXBwZW5kKHJlc3VsdC0+cGh5c2NhbV9tZXRhZGF0YVtpXSk7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5waHlzaWNhbE1ldGFkYXRhcy5wdXNoX2JhY2soe1N0cmluZzE2KHJlc3VsdC0+cGh5c2NhbV9pZHNbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxNZXRhZGF0YX0pOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHNodXR0ZXJUaW1lc3RhbXAgPT0gMCkgewogICAgICAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ01ldGFkYXRhID0gcmVzdWx0LT5yZXN1bHQ7CiAgICAgICAgICAgICAgICAgcmVxdWVzdC5jb2xsZWN0ZWRQYXJ0aWFsUmVzdWx0ID0gY29sbGVjdGVkUGFydGlhbFJlc3VsdDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC5oYXNDYWxsYmFjaykgeworICAgICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3QuaGFzQ2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YTsKICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IHJlc3VsdC0+cmVzdWx0OwogICAgICAgICAgICAgICAgIHNlbmRDYXB0dXJlUmVzdWx0KG1ldGFkYXRhLCByZXF1ZXN0LnJlc3VsdEV4dHJhcywKICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGVkUGFydGlhbFJlc3VsdCwgZnJhbWVOdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgIGhhc0lucHV0QnVmZmVySW5SZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgaGFzSW5wdXRCdWZmZXJJblJlcXVlc3QsIHJlcXVlc3QucGh5c2ljYWxNZXRhZGF0YXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTMwMzYsNyArMzMyOSw3IEBACiAgICAgICAgICAgICAgICAgLy8gc2VuZCBwZW5kaW5nIHJlc3VsdCBhbmQgYnVmZmVycwogICAgICAgICAgICAgICAgIHNlbmRDYXB0dXJlUmVzdWx0KHIucGVuZGluZ01ldGFkYXRhLCByLnJlc3VsdEV4dHJhcywKICAgICAgICAgICAgICAgICAgICAgci5jb2xsZWN0ZWRQYXJ0aWFsUmVzdWx0LCBtc2cuZnJhbWVfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICByLmhhc0lucHV0QnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgci5oYXNJbnB1dEJ1ZmZlciwgci5waHlzaWNhbE1ldGFkYXRhcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKHIucGVuZGluZ091dHB1dEJ1ZmZlcnMuYXJyYXkoKSwKICAgICAgICAgICAgICAgICByLnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwgci5zaHV0dGVyVGltZXN0YW1wKTsKQEAgLTMwNTEsNyArMzM0NCw2IEBACiAgICAgfQogfQogCi0KIENhbWVyYU1ldGFkYXRhIENhbWVyYTNEZXZpY2U6OmdldExhdGVzdFJlcXVlc3RMb2NrZWQoKSB7CiAgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKIApAQCAtMzA3OCw3ICszMzcwLDE4IEBACiAgICAgICAgICAgICBzcDxJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gJnNlc3Npb24sCiAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlKSA6CiAgICAgICAgIG1IaWRsU2Vzc2lvbihzZXNzaW9uKSwKLSAgICAgICAgbVJlcXVlc3RNZXRhZGF0YVF1ZXVlKHF1ZXVlKSB7fQorICAgICAgICBtUmVxdWVzdE1ldGFkYXRhUXVldWUocXVldWUpIHsKKyAgICAvLyBDaGVjayB3aXRoIGhhcmR3YXJlIHNlcnZpY2UgbWFuYWdlciBpZiB3ZSBjYW4gZG93bmNhc3QgdGhlc2UgaW50ZXJmYWNlcworICAgIC8vIFNvbWV3aGF0IGV4cGVuc2l2ZSwgc28gY2FjaGUgdGhlIHJlc3VsdHMgYXQgc3RhcnR1cAorICAgIGF1dG8gY2FzdFJlc3VsdF8zXzQgPSBkZXZpY2U6OlYzXzQ6OklDYW1lcmFEZXZpY2VTZXNzaW9uOjpjYXN0RnJvbShtSGlkbFNlc3Npb24pOworICAgIGlmIChjYXN0UmVzdWx0XzNfNC5pc09rKCkpIHsKKyAgICAgICAgbUhpZGxTZXNzaW9uXzNfNCA9IGNhc3RSZXN1bHRfM180OworICAgIH0KKyAgICBhdXRvIGNhc3RSZXN1bHRfM18zID0gZGV2aWNlOjpWM18zOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbjo6Y2FzdEZyb20obUhpZGxTZXNzaW9uKTsKKyAgICBpZiAoY2FzdFJlc3VsdF8zXzMuaXNPaygpKSB7CisgICAgICAgIG1IaWRsU2Vzc2lvbl8zXzMgPSBjYXN0UmVzdWx0XzNfMzsKKyAgICB9Cit9CiAKIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6SGFsSW50ZXJmYWNlKCkge30KIApAQCAtMzA5MSw2ICszMzk0LDggQEAKIH0KIAogdm9pZCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmNsZWFyKCkgeworICAgIG1IaWRsU2Vzc2lvbl8zXzQuY2xlYXIoKTsKKyAgICBtSGlkbFNlc3Npb25fM18zLmNsZWFyKCk7CiAgICAgbUhpZGxTZXNzaW9uLmNsZWFyKCk7CiB9CiAKQEAgLTMxMDYsNiArMzQxMSwyOSBAQAogICAgIHN0YXR1c190IHJlcyA9IE9LOwogCiAgICAgY29tbW9uOjpWMV8wOjpTdGF0dXMgc3RhdHVzOworCisgICAgYXV0byByZXF1ZXN0Q2FsbGJhY2sgPSBbJnN0YXR1cywgJnJlcXVlc3RUZW1wbGF0ZV0KKyAgICAgICAgICAgIChjb21tb246OlYxXzA6OlN0YXR1cyBzLCBjb25zdCBkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhJiByZXF1ZXN0KSB7CisgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBjb21tb246OlYxXzA6OlN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGEgKnIgPQorICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KHJlcXVlc3QuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICBzaXplX3QgZXhwZWN0ZWRTaXplID0gcmVxdWVzdC5zaXplKCk7CisgICAgICAgICAgICAgICAgaW50IHJldCA9IHZhbGlkYXRlX2NhbWVyYV9tZXRhZGF0YV9zdHJ1Y3R1cmUociwgJmV4cGVjdGVkU2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBPSyB8fCByZXQgPT0gQ0FNRVJBX01FVEFEQVRBX1ZBTElEQVRJT05fU0hJRlRFRCkgeworICAgICAgICAgICAgICAgICAgICAqcmVxdWVzdFRlbXBsYXRlID0gY2xvbmVfY2FtZXJhX21ldGFkYXRhKHIpOworICAgICAgICAgICAgICAgICAgICBpZiAoKnJlcXVlc3RUZW1wbGF0ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjbG9uZSBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBIQUwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY29tbW9uOjpWMV8wOjpTdGF0dXM6OklOVEVSTkFMX0VSUk9SOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBNYWxmb3JtZWQgY2FtZXJhIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gSEFMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY29tbW9uOjpWMV8wOjpTdGF0dXM6OklOVEVSTkFMX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IGVycjsKICAgICBSZXF1ZXN0VGVtcGxhdGUgaWQ7CiAgICAgc3dpdGNoICh0ZW1wbGF0ZUlkKSB7CiAgICAgICAgIGNhc2UgQ0FNRVJBM19URU1QTEFURV9QUkVWSUVXOgpAQCAtMzEyNywzMSArMzQ1NSwxMSBAQAogICAgICAgICAgICAgaWQgPSBSZXF1ZXN0VGVtcGxhdGU6Ok1BTlVBTDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gVW5rbm93biB0ZW1wbGF0ZSBJRAorICAgICAgICAgICAgLy8gVW5rbm93biB0ZW1wbGF0ZSBJRCwgb3IgdGhpcyBIQUwgaXMgdG9vIG9sZCB0byBzdXBwb3J0IGl0CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbi0+Y29uc3RydWN0RGVmYXVsdFJlcXVlc3RTZXR0aW5ncyhpZCwKLSAgICAgICAgICAgIFsmc3RhdHVzLCAmcmVxdWVzdFRlbXBsYXRlXQotICAgICAgICAgICAgKGNvbW1vbjo6VjFfMDo6U3RhdHVzIHMsIGNvbnN0IGRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGEmIHJlcXVlc3QpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gY29tbW9uOjpWMV8wOjpTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YSAqciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KHJlcXVlc3QuZGF0YSgpKTsKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGV4cGVjdGVkU2l6ZSA9IHJlcXVlc3Quc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gdmFsaWRhdGVfY2FtZXJhX21ldGFkYXRhX3N0cnVjdHVyZShyLCAmZXhwZWN0ZWRTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBPSyB8fCByZXQgPT0gQ0FNRVJBX01FVEFEQVRBX1ZBTElEQVRJT05fU0hJRlRFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgKnJlcXVlc3RUZW1wbGF0ZSA9IGNsb25lX2NhbWVyYV9tZXRhZGF0YShyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqcmVxdWVzdFRlbXBsYXRlID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjbG9uZSBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBIQUwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBjb21tb246OlYxXzA6OlN0YXR1czo6SU5URVJOQUxfRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IE1hbGZvcm1lZCBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBIQUwiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY29tbW9uOjpWMV8wOjpTdGF0dXM6OklOVEVSTkFMX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7CisgICAgZXJyID0gbUhpZGxTZXNzaW9uLT5jb25zdHJ1Y3REZWZhdWx0UmVxdWVzdFNldHRpbmdzKGlkLCByZXF1ZXN0Q2FsbGJhY2spOworCiAgICAgaWYgKCFlcnIuaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKICAgICAgICAgcmVzID0gREVBRF9PQkpFQ1Q7CkBAIC0zMTYyLDE3ICszNDcwLDIxIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpjb25maWd1cmVTdHJlYW1zKGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb24gKmNvbmZpZykgeworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpjb25maWd1cmVTdHJlYW1zKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzZXNzaW9uUGFyYW1zLAorICAgICAgICBjYW1lcmEzX3N0cmVhbV9jb25maWd1cmF0aW9uICpjb25maWcsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgYnVmZmVyU2l6ZXMpIHsKICAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpjb25maWd1cmVTdHJlYW1zIik7CiAgICAgaWYgKCF2YWxpZCgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgc3RhdHVzX3QgcmVzID0gT0s7CiAKICAgICAvLyBDb252ZXJ0IHN0cmVhbSBjb25maWcgdG8gSElETAogICAgIHN0ZDo6c2V0PGludD4gYWN0aXZlU3RyZWFtczsKLSAgICBTdHJlYW1Db25maWd1cmF0aW9uIHJlcXVlc3RlZENvbmZpZ3VyYXRpb247Ci0gICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShjb25maWctPm51bV9zdHJlYW1zKTsKKyAgICBkZXZpY2U6OlYzXzI6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMjsKKyAgICBkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNDsKKyAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yLnN0cmVhbXMucmVzaXplKGNvbmZpZy0+bnVtX3N0cmVhbXMpOworICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5yZXNpemUoY29uZmlnLT5udW1fc3RyZWFtcyk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb25maWctPm51bV9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgU3RyZWFtICZkc3QgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uLnN0cmVhbXNbaV07CisgICAgICAgIGRldmljZTo6VjNfMjo6U3RyZWFtICZkc3QzXzIgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yLnN0cmVhbXNbaV07CisgICAgICAgIGRldmljZTo6VjNfNDo6U3RyZWFtICZkc3QzXzQgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180LnN0cmVhbXNbaV07CiAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3QgKnNyYyA9IGNvbmZpZy0+c3RyZWFtc1tpXTsKIAogICAgICAgICBDYW1lcmEzU3RyZWFtKiBjYW0zc3RyZWFtID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChzcmMpOwpAQCAtMzE5MSwxNCArMzUwMywxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCwgY29uZmlnLT5zdHJlYW1zW2ldLT5zdHJlYW1fdHlwZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBkc3QuaWQgPSBzdHJlYW1JZDsKLSAgICAgICAgZHN0LnN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOwotICAgICAgICBkc3Qud2lkdGggPSBzcmMtPndpZHRoOwotICAgICAgICBkc3QuaGVpZ2h0ID0gc3JjLT5oZWlnaHQ7Ci0gICAgICAgIGRzdC5mb3JtYXQgPSBtYXBUb1BpeGVsRm9ybWF0KHNyYy0+Zm9ybWF0KTsKLSAgICAgICAgZHN0LnVzYWdlID0gbWFwVG9Db25zdW1lclVzYWdlKGNhbTNzdHJlYW0tPmdldFVzYWdlKCkpOwotICAgICAgICBkc3QuZGF0YVNwYWNlID0gbWFwVG9IaWRsRGF0YXNwYWNlKHNyYy0+ZGF0YV9zcGFjZSk7Ci0gICAgICAgIGRzdC5yb3RhdGlvbiA9IG1hcFRvU3RyZWFtUm90YXRpb24oKGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3QpIHNyYy0+cm90YXRpb24pOworICAgICAgICBkc3QzXzIuaWQgPSBzdHJlYW1JZDsKKyAgICAgICAgZHN0M18yLnN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOworICAgICAgICBkc3QzXzIud2lkdGggPSBzcmMtPndpZHRoOworICAgICAgICBkc3QzXzIuaGVpZ2h0ID0gc3JjLT5oZWlnaHQ7CisgICAgICAgIGRzdDNfMi5mb3JtYXQgPSBtYXBUb1BpeGVsRm9ybWF0KHNyYy0+Zm9ybWF0KTsKKyAgICAgICAgZHN0M18yLnVzYWdlID0gbWFwVG9Db25zdW1lclVzYWdlKGNhbTNzdHJlYW0tPmdldFVzYWdlKCkpOworICAgICAgICBkc3QzXzIuZGF0YVNwYWNlID0gbWFwVG9IaWRsRGF0YXNwYWNlKHNyYy0+ZGF0YV9zcGFjZSk7CisgICAgICAgIGRzdDNfMi5yb3RhdGlvbiA9IG1hcFRvU3RyZWFtUm90YXRpb24oKGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3QpIHNyYy0+cm90YXRpb24pOworICAgICAgICBkc3QzXzQudjNfMiA9IGRzdDNfMjsKKyAgICAgICAgZHN0M180LmJ1ZmZlclNpemUgPSBidWZmZXJTaXplc1tpXTsKKyAgICAgICAgaWYgKHNyYy0+cGh5c2ljYWxfY2FtZXJhX2lkICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGRzdDNfNC5waHlzaWNhbENhbWVyYUlkID0gc3JjLT5waHlzaWNhbF9jYW1lcmFfaWQ7CisgICAgICAgIH0KIAogICAgICAgICBhY3RpdmVTdHJlYW1zLmluc2VydChzdHJlYW1JZCk7CiAgICAgICAgIC8vIENyZWF0ZSBCdWZmZXIgSUQgbWFwIGlmIG5lY2Vzc2FyeQpAQCAtMzIxNywzMSArMzUzNCw0NiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgb3BlcmF0aW9uTW9kZTsKICAgICByZXMgPSBtYXBUb1N0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKAogICAgICAgICAgICAgKGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90KSBjb25maWctPm9wZXJhdGlvbl9tb2RlLAotICAgICAgICAgICAgLypvdXQqLyAmcmVxdWVzdGVkQ29uZmlndXJhdGlvbi5vcGVyYXRpb25Nb2RlKTsKKyAgICAgICAgICAgIC8qb3V0Ki8gJm9wZXJhdGlvbk1vZGUpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMi5vcGVyYXRpb25Nb2RlID0gb3BlcmF0aW9uTW9kZTsKKyAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180Lm9wZXJhdGlvbk1vZGUgPSBvcGVyYXRpb25Nb2RlOworICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQuc2Vzc2lvblBhcmFtcy5zZXRUb0V4dGVybmFsKAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KHNlc3Npb25QYXJhbXMpKSwKKyAgICAgICAgICAgIGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShzZXNzaW9uUGFyYW1zKSk7CiAKICAgICAvLyBJbnZva2UgY29uZmlndXJlU3RyZWFtcwotCiAgICAgZGV2aWNlOjpWM18zOjpIYWxTdHJlYW1Db25maWd1cmF0aW9uIGZpbmFsQ29uZmlndXJhdGlvbjsKICAgICBjb21tb246OlYxXzA6OlN0YXR1cyBzdGF0dXM7CiAKLSAgICAvLyBTZWUgaWYgd2UgaGF2ZSB2My4zIEhBTAotICAgIHNwPGRldmljZTo6VjNfMzo6SUNhbWVyYURldmljZVNlc3Npb24+IGhpZGxTZXNzaW9uXzNfMzsKLSAgICBhdXRvIGNhc3RSZXN1bHQgPSBkZXZpY2U6OlYzXzM6OklDYW1lcmFEZXZpY2VTZXNzaW9uOjpjYXN0RnJvbShtSGlkbFNlc3Npb24pOwotICAgIGlmIChjYXN0UmVzdWx0LmlzT2soKSkgewotICAgICAgICBoaWRsU2Vzc2lvbl8zXzMgPSBjYXN0UmVzdWx0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3Igd2hlbiBjYXN0aW5nIElDYW1lcmFEZXZpY2VTZXNzaW9uOiAlcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICBjYXN0UmVzdWx0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgfQotICAgIGlmIChoaWRsU2Vzc2lvbl8zXzMgIT0gbnVsbHB0cikgeworICAgIC8vIFNlZSBpZiB3ZSBoYXZlIHYzLjQgb3IgdjMuMyBIQUwKKyAgICBpZiAobUhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7CisgICAgICAgIC8vIFdlIGRvOyB1c2UgdjMuNCBmb3IgdGhlIGNhbGwKKyAgICAgICAgQUxPR1YoIiVzOiB2My40IGRldmljZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGRldmljZTo6VjNfNDo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiBmaW5hbENvbmZpZ3VyYXRpb24zXzQ7CisgICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNC0+Y29uZmlndXJlU3RyZWFtc18zXzQocmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNCwKKyAgICAgICAgICAgIFsmc3RhdHVzLCAmZmluYWxDb25maWd1cmF0aW9uM180XQorICAgICAgICAgICAgKGNvbW1vbjo6VjFfMDo6U3RhdHVzIHMsIGNvbnN0IGRldmljZTo6VjNfNDo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiYgaGFsQ29uZmlndXJhdGlvbikgeworICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbjNfNCA9IGhhbENvbmZpZ3VyYXRpb247CisgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtcy5yZXNpemUoZmluYWxDb25maWd1cmF0aW9uM180LnN0cmVhbXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXNbaV0gPSBmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtc1tpXS52M18zOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtSGlkbFNlc3Npb25fM18zICE9IG51bGxwdHIpIHsKICAgICAgICAgLy8gV2UgZG87IHVzZSB2My4zIGZvciB0aGUgY2FsbAogICAgICAgICBBTE9HVigiJXM6IHYzLjMgZGV2aWNlIGZvdW5kIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgYXV0byBlcnIgPSBoaWRsU2Vzc2lvbl8zXzMtPmNvbmZpZ3VyZVN0cmVhbXNfM18zKHJlcXVlc3RlZENvbmZpZ3VyYXRpb24sCisgICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfMy0+Y29uZmlndXJlU3RyZWFtc18zXzMocmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMiwKICAgICAgICAgICAgIFsmc3RhdHVzLCAmZmluYWxDb25maWd1cmF0aW9uXQogICAgICAgICAgICAgKGNvbW1vbjo6VjFfMDo6U3RhdHVzIHMsIGNvbnN0IGRldmljZTo6VjNfMzo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiYgaGFsQ29uZmlndXJhdGlvbikgewogICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbiA9IGhhbENvbmZpZ3VyYXRpb247CkBAIC0zMjU1LDcgKzM1ODcsNyBAQAogICAgICAgICAvLyBXZSBkb24ndDsgdXNlIHYzLjIgY2FsbCBhbmQgY29uc3RydWN0IGEgdjMuMyBIYWxTdHJlYW1Db25maWd1cmF0aW9uCiAgICAgICAgIEFMT0dWKCIlczogdjMuMiBkZXZpY2UgZm91bmQiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICBIYWxTdHJlYW1Db25maWd1cmF0aW9uIGZpbmFsQ29uZmlndXJhdGlvbl8zXzI7Ci0gICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uLT5jb25maWd1cmVTdHJlYW1zKHJlcXVlc3RlZENvbmZpZ3VyYXRpb24sCisgICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uLT5jb25maWd1cmVTdHJlYW1zKHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzIsCiAgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZmaW5hbENvbmZpZ3VyYXRpb25fM18yXQogICAgICAgICAgICAgICAgIChjb21tb246OlYxXzA6OlN0YXR1cyBzLCBjb25zdCBIYWxTdHJlYW1Db25maWd1cmF0aW9uJiBoYWxDb25maWd1cmF0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbl8zXzIgPSBoYWxDb25maWd1cmF0aW9uOwpAQCAtMzI2OSw3ICszNjAxLDcgQEAKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaW5hbENvbmZpZ3VyYXRpb25fM18yLnN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zW2ldLnYzXzIgPSBmaW5hbENvbmZpZ3VyYXRpb25fM18yLnN0cmVhbXNbaV07CiAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tpXS5vdmVycmlkZURhdGFTcGFjZSA9Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24uc3RyZWFtc1tpXS5kYXRhU3BhY2U7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzIuc3RyZWFtc1tpXS5kYXRhU3BhY2U7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM0MjMsMTMgKzM3NTUsMjkgQEAKICAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpwcm9jZXNzQmF0Y2hDYXB0dXJlUmVxdWVzdHMiKTsKICAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIAorICAgIHNwPGRldmljZTo6VjNfNDo6SUNhbWVyYURldmljZVNlc3Npb24+IGhpZGxTZXNzaW9uXzNfNDsKKyAgICBhdXRvIGNhc3RSZXN1bHRfM180ID0gZGV2aWNlOjpWM180OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbjo6Y2FzdEZyb20obUhpZGxTZXNzaW9uKTsKKyAgICBpZiAoY2FzdFJlc3VsdF8zXzQuaXNPaygpKSB7CisgICAgICAgIGhpZGxTZXNzaW9uXzNfNCA9IGNhc3RSZXN1bHRfM180OworICAgIH0KKwogICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxkZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXF1ZXN0PiBjYXB0dXJlUmVxdWVzdHM7CisgICAgaGFyZHdhcmU6OmhpZGxfdmVjPGRldmljZTo6VjNfNDo6Q2FwdHVyZVJlcXVlc3Q+IGNhcHR1cmVSZXF1ZXN0c18zXzQ7CiAgICAgc2l6ZV90IGJhdGNoU2l6ZSA9IHJlcXVlc3RzLnNpemUoKTsKLSAgICBjYXB0dXJlUmVxdWVzdHMucmVzaXplKGJhdGNoU2l6ZSk7CisgICAgaWYgKGhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7CisgICAgICAgIGNhcHR1cmVSZXF1ZXN0c18zXzQucmVzaXplKGJhdGNoU2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2FwdHVyZVJlcXVlc3RzLnJlc2l6ZShiYXRjaFNpemUpOworICAgIH0KICAgICBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiBoYW5kbGVzQ3JlYXRlZDsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYmF0Y2hTaXplOyBpKyspIHsKLSAgICAgICAgd3JhcEFzSGlkbFJlcXVlc3QocmVxdWVzdHNbaV0sIC8qb3V0Ki8mY2FwdHVyZVJlcXVlc3RzW2ldLCAvKm91dCovJmhhbmRsZXNDcmVhdGVkKTsKKyAgICAgICAgaWYgKGhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICB3cmFwQXNIaWRsUmVxdWVzdChyZXF1ZXN0c1tpXSwgLypvdXQqLyZjYXB0dXJlUmVxdWVzdHNfM180W2ldLnYzXzIsCisgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8maGFuZGxlc0NyZWF0ZWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3JhcEFzSGlkbFJlcXVlc3QocmVxdWVzdHNbaV0sIC8qb3V0Ki8mY2FwdHVyZVJlcXVlc3RzW2ldLCAvKm91dCovJmhhbmRsZXNDcmVhdGVkKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHN0ZDo6dmVjdG9yPGRldmljZTo6VjNfMjo6QnVmZmVyQ2FjaGU+IGNhY2hlc1RvUmVtb3ZlOwpAQCAtMzQ1MCw3ICszNzk4LDEyIEBACiAgICAgLy8gV3JpdGUgbWV0YWRhdGEgdG8gRk1RLgogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYmF0Y2hTaXplOyBpKyspIHsKICAgICAgICAgY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCogcmVxdWVzdCA9IHJlcXVlc3RzW2ldOwotICAgICAgICBkZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXF1ZXN0KiBjYXB0dXJlUmVxdWVzdCA9ICZjYXB0dXJlUmVxdWVzdHNbaV07CisgICAgICAgIGRldmljZTo6VjNfMjo6Q2FwdHVyZVJlcXVlc3QqIGNhcHR1cmVSZXF1ZXN0OworICAgICAgICBpZiAoaGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0ID0gJmNhcHR1cmVSZXF1ZXN0c18zXzRbaV0udjNfMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0ID0gJmNhcHR1cmVSZXF1ZXN0c1tpXTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChyZXF1ZXN0LT5zZXR0aW5ncyAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICBzaXplX3Qgc2V0dGluZ3NTaXplID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHJlcXVlc3QtPnNldHRpbmdzKTsKQEAgLTM0NzIsMTIgKzM4MjUsNTIgQEAKICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5zZXR0aW5ncy5yZXNpemUoMCk7CiAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+Zm1xU2V0dGluZ3NTaXplID0gMHU7CiAgICAgICAgIH0KKworICAgICAgICBpZiAoaGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0c18zXzRbaV0ucGh5c2ljYWxDYW1lcmFTZXR0aW5ncy5yZXNpemUocmVxdWVzdC0+bnVtX3BoeXNjYW1fc2V0dGluZ3MpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCByZXF1ZXN0LT5udW1fcGh5c2NhbV9zZXR0aW5nczsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QtPnBoeXNjYW1fc2V0dGluZ3MgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2V0dGluZ3NTaXplID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHJlcXVlc3QtPnBoeXNjYW1fc2V0dGluZ3Nbal0pOworICAgICAgICAgICAgICAgICAgICBpZiAobVJlcXVlc3RNZXRhZGF0YVF1ZXVlICE9IG51bGxwdHIgJiYgbVJlcXVlc3RNZXRhZGF0YVF1ZXVlLT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmVxdWVzdC0+cGh5c2NhbV9zZXR0aW5nc1tqXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzU2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0c18zXzRbaV0ucGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tqXS5zZXR0aW5ncy5yZXNpemUoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdHNfM180W2ldLnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Nbal0uZm1xU2V0dGluZ3NTaXplID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nc1NpemU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVJlcXVlc3RNZXRhZGF0YVF1ZXVlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IGNvdWxkbid0IHV0aWxpemUgZm1xLCBmYWxsYmFjayB0byBod2JpbmRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdHNfM180W2ldLnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Nbal0uc2V0dGluZ3Muc2V0VG9FeHRlcm5hbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPnBoeXNjYW1fc2V0dGluZ3Nbal0pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHJlcXVlc3QtPnBoeXNjYW1fc2V0dGluZ3Nbal0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0c18zXzRbaV0ucGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tqXS5mbXFTZXR0aW5nc1NpemUgPSAwdTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0c18zXzRbaV0ucGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tqXS5mbXFTZXR0aW5nc1NpemUgPSAwdTsKKyAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3RzXzNfNFtpXS5waHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLnNldHRpbmdzLnJlc2l6ZSgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3RzXzNfNFtpXS5waHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLnBoeXNpY2FsQ2FtZXJhSWQgPQorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5waHlzY2FtX2lkW2pdOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQotICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uLT5wcm9jZXNzQ2FwdHVyZVJlcXVlc3QoY2FwdHVyZVJlcXVlc3RzLCBjYWNoZXNUb1JlbW92ZSwKKworICAgIGhhcmR3YXJlOjpkZXRhaWxzOjpyZXR1cm5fc3RhdHVzIGVycjsKKyAgICBpZiAoaGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKKyAgICAgICAgZXJyID0gaGlkbFNlc3Npb25fM180LT5wcm9jZXNzQ2FwdHVyZVJlcXVlc3RfM180KGNhcHR1cmVSZXF1ZXN0c18zXzQsIGNhY2hlc1RvUmVtb3ZlLAogICAgICAgICAgICAgWyZzdGF0dXMsICZudW1SZXF1ZXN0UHJvY2Vzc2VkXSAoYXV0byBzLCB1aW50MzJfdCBuKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKICAgICAgICAgICAgICAgICAqbnVtUmVxdWVzdFByb2Nlc3NlZCA9IG47CiAgICAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgICBlcnIgPSBtSGlkbFNlc3Npb24tPnByb2Nlc3NDYXB0dXJlUmVxdWVzdChjYXB0dXJlUmVxdWVzdHMsIGNhY2hlc1RvUmVtb3ZlLAorICAgICAgICAgICAgWyZzdGF0dXMsICZudW1SZXF1ZXN0UHJvY2Vzc2VkXSAoYXV0byBzLCB1aW50MzJfdCBuKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAqbnVtUmVxdWVzdFByb2Nlc3NlZCA9IG47CisgICAgICAgICAgICB9KTsKKyAgICB9CiAgICAgaWYgKCFlcnIuaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwpAQCAtMzYzNSw3ICs0MDI4LDcgQEAKIAogQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6UmVxdWVzdFRocmVhZCh3cDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQsCiAgICAgICAgIHNwPFN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIsCi0gICAgICAgIHNwPEhhbEludGVyZmFjZT4gaW50ZXJmYWNlKSA6CisgICAgICAgIHNwPEhhbEludGVyZmFjZT4gaW50ZXJmYWNlLCBjb25zdCBWZWN0b3I8aW50MzJfdD4mIHNlc3Npb25QYXJhbUtleXMpIDoKICAgICAgICAgVGhyZWFkKC8qY2FuQ2FsbEphdmEqL2ZhbHNlKSwKICAgICAgICAgbVBhcmVudChwYXJlbnQpLAogICAgICAgICBtU3RhdHVzVHJhY2tlcihzdGF0dXNUcmFja2VyKSwKQEAgLTM2NTIsNyArNDA0NSw5IEBACiAgICAgICAgIG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXIoCiAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6Ok5PX0lOX0ZMSUdIVF9SRVBFQVRJTkdfRlJBTUVTKSwKICAgICAgICAgbVByZXBhcmVWaWRlb1N0cmVhbShmYWxzZSksCi0gICAgICAgIG1SZXF1ZXN0TGF0ZW5jeShrUmVxdWVzdExhdGVuY3lCaW5TaXplKSB7CisgICAgICAgIG1SZXF1ZXN0TGF0ZW5jeShrUmVxdWVzdExhdGVuY3lCaW5TaXplKSwKKyAgICAgICAgbVNlc3Npb25QYXJhbUtleXMoc2Vzc2lvblBhcmFtS2V5cyksCisgICAgICAgIG1MYXRlc3RTZXNzaW9uUGFyYW1zKHNlc3Npb25QYXJhbUtleXMuc2l6ZSgpKSB7CiAgICAgbVN0YXR1c0lkID0gc3RhdHVzVHJhY2tlci0+YWRkQ29tcG9uZW50KCk7CiB9CiAKQEAgLTM2NjUsMTAgKzQwNjAsMTIgQEAKICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKIH0KIAotdm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpjb25maWd1cmF0aW9uQ29tcGxldGUoYm9vbCBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkKSB7Cit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmNvbmZpZ3VyYXRpb25Db21wbGV0ZShib29sIGlzQ29uc3RyYWluZWRIaWdoU3BlZWQsCisgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzZXNzaW9uUGFyYW1zKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOwogICAgIG1SZWNvbmZpZ3VyZWQgPSB0cnVlOworICAgIG1MYXRlc3RTZXNzaW9uUGFyYW1zID0gc2Vzc2lvblBhcmFtczsKICAgICAvLyBQcmVwYXJlIHZpZGVvIHN0cmVhbSBmb3IgaGlnaCBzcGVlZCByZWNvcmRpbmcuCiAgICAgbVByZXBhcmVWaWRlb1N0cmVhbSA9IGlzQ29uc3RyYWluZWRIaWdoU3BlZWQ7CiB9CkBAIC0zOTI4LDkgKzQzMjUsOSBAQAogICAgIHVpbnQzMl90IG51bVJlcXVlc3RQcm9jZXNzZWQgPSAwOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYmF0Y2hTaXplOyBpKyspIHsKICAgICAgICAgcmVxdWVzdHNbaV0gPSAmbU5leHRSZXF1ZXN0cy5lZGl0SXRlbUF0KGkpLmhhbFJlcXVlc3Q7CisgICAgICAgIEFUUkFDRV9BU1lOQ19CRUdJTigiZnJhbWUgY2FwdHVyZSIsIG1OZXh0UmVxdWVzdHNbaV0uaGFsUmVxdWVzdC5mcmFtZV9udW1iZXIpOwogICAgIH0KIAotICAgIEFUUkFDRV9BU1lOQ19CRUdJTigiYmF0Y2ggZnJhbWUgY2FwdHVyZSIsIG1OZXh0UmVxdWVzdHNbMF0uaGFsUmVxdWVzdC5mcmFtZV9udW1iZXIpOwogICAgIHJlcyA9IG1JbnRlcmZhY2UtPnByb2Nlc3NCYXRjaENhcHR1cmVSZXF1ZXN0cyhyZXF1ZXN0cywgJm51bVJlcXVlc3RQcm9jZXNzZWQpOwogCiAgICAgYm9vbCB0cmlnZ2VyUmVtb3ZlRmFpbGVkID0gZmFsc2U7CkBAIC0zOTU2LDkgKzQzNTMsMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LnNldHRpbmdzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG5leHRSZXF1ZXN0LmNhcHR1cmVSZXF1ZXN0LT5tU2V0dGluZ3MudW5sb2NrKG5leHRSZXF1ZXN0LmhhbFJlcXVlc3Quc2V0dGluZ3MpOworICAgICAgICAgICAgbmV4dFJlcXVlc3QuY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5nc0xpc3QuYmVnaW4oKS0+bWV0YWRhdGEudW5sb2NrKAorICAgICAgICAgICAgICAgICAgICBuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LnNldHRpbmdzKTsKICAgICAgICAgfQogCisgICAgICAgIGNsZWFudXBQaHlzaWNhbFNldHRpbmdzKG5leHRSZXF1ZXN0LmNhcHR1cmVSZXF1ZXN0LCAmbmV4dFJlcXVlc3QuaGFsUmVxdWVzdCk7CisKICAgICAgICAgaWYgKCF0cmlnZ2VyUmVtb3ZlRmFpbGVkKSB7CiAgICAgICAgICAgICAvLyBSZW1vdmUgYW55IHByZXZpb3VzbHkgcXVldWVkIHRyaWdnZXJzIChhZnRlciB1bmxvY2spCiAgICAgICAgICAgICBzdGF0dXNfdCByZW1vdmVUcmlnZ2VyUmVzID0gcmVtb3ZlVHJpZ2dlcnMobVByZXZSZXF1ZXN0KTsKQEAgLTQwMjcsOSArNDQyNywxMiBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKG5leHRSZXF1ZXN0LmhhbFJlcXVlc3Quc2V0dGluZ3MgIT0gTlVMTCkgewotICAgICAgICAgICAgbmV4dFJlcXVlc3QuY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5ncy51bmxvY2sobmV4dFJlcXVlc3QuaGFsUmVxdWVzdC5zZXR0aW5ncyk7CisgICAgICAgICAgICBuZXh0UmVxdWVzdC5jYXB0dXJlUmVxdWVzdC0+bVNldHRpbmdzTGlzdC5iZWdpbigpLT5tZXRhZGF0YS51bmxvY2soCisgICAgICAgICAgICAgICAgICAgIG5leHRSZXF1ZXN0LmhhbFJlcXVlc3Quc2V0dGluZ3MpOwogICAgICAgICB9CiAKKyAgICAgICAgY2xlYW51cFBoeXNpY2FsU2V0dGluZ3MobmV4dFJlcXVlc3QuY2FwdHVyZVJlcXVlc3QsICZuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0KTsKKwogICAgICAgICAvLyBSZW1vdmUgYW55IHByZXZpb3VzbHkgcXVldWVkIHRyaWdnZXJzIChhZnRlciB1bmxvY2spCiAgICAgICAgIHJlcyA9IHJlbW92ZVRyaWdnZXJzKG1QcmV2UmVxdWVzdCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKQEAgLTQwNzksNiArNDQ4Miw1MiBAQAogICAgIHJldHVybiBtYXhFeHBlY3RlZER1cmF0aW9uOwogfQogCitib29sIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnVwZGF0ZVNlc3Npb25QYXJhbWV0ZXJzKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzZXR0aW5ncykgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgYm9vbCB1cGRhdGVzRGV0ZWN0ZWQgPSBmYWxzZTsKKworICAgIGZvciAoYXV0byB0YWcgOiBtU2Vzc2lvblBhcmFtS2V5cykgeworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgZW50cnkgPSBzZXR0aW5ncy5maW5kKHRhZyk7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBsYXN0RW50cnkgPSBtTGF0ZXN0U2Vzc2lvblBhcmFtcy5maW5kKHRhZyk7CisKKyAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICAgICAgYm9vbCBpc0RpZmZlcmVudCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGxhc3RFbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBIYXZlIGEgbGFzdCB2YWx1ZSwgY29tcGFyZSB0byBzZWUgaWYgY2hhbmdlZAorICAgICAgICAgICAgICAgIGlmIChsYXN0RW50cnkudHlwZSA9PSBlbnRyeS50eXBlICYmCisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0RW50cnkuY291bnQgPT0gZW50cnkuY291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSB0eXBlIGFuZCBjb3VudCwgY29tcGFyZSB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ5dGVzUGVyVmFsdWUgPSBjYW1lcmFfbWV0YWRhdGFfdHlwZV9zaXplW2xhc3RFbnRyeS50eXBlXTsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGVudHJ5Qnl0ZXMgPSBieXRlc1BlclZhbHVlICogbGFzdEVudHJ5LmNvdW50OworICAgICAgICAgICAgICAgICAgICBpbnQgY21wID0gbWVtY21wKGVudHJ5LmRhdGEudTgsIGxhc3RFbnRyeS5kYXRhLnU4LCBlbnRyeUJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNtcCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpc0RpZmZlcmVudCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBDb3VudCBvciB0eXBlIGhhcyBjaGFuZ2VkCisgICAgICAgICAgICAgICAgICAgIGlzRGlmZmVyZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIE5vIGxhc3QgZW50cnksIHNvIGFsd2F5cyBjb25zaWRlciB0byBiZSBkaWZmZXJlbnQKKyAgICAgICAgICAgICAgICBpc0RpZmZlcmVudCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpc0RpZmZlcmVudCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlczogU2Vzc2lvbiBwYXJhbWV0ZXIgdGFnIGlkICVkIGNoYW5nZWQiLCBfX0ZVTkNUSU9OX18sIHRhZyk7CisgICAgICAgICAgICAgICAgbUxhdGVzdFNlc3Npb25QYXJhbXMudXBkYXRlKGVudHJ5KTsKKyAgICAgICAgICAgICAgICB1cGRhdGVzRGV0ZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGxhc3RFbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgICAgIC8vIFZhbHVlIGhhcyBiZWVuIHJlbW92ZWQKKyAgICAgICAgICAgIEFMT0dWKCIlczogU2Vzc2lvbiBwYXJhbWV0ZXIgdGFnIGlkICVkIHJlbW92ZWQiLCBfX0ZVTkNUSU9OX18sIHRhZyk7CisgICAgICAgICAgICBtTGF0ZXN0U2Vzc2lvblBhcmFtcy5lcmFzZSh0YWcpOworICAgICAgICAgICAgdXBkYXRlc0RldGVjdGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB1cGRhdGVzRGV0ZWN0ZWQ7Cit9CisKIGJvb2wgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6dGhyZWFkTG9vcCgpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN0YXR1c190IHJlczsKQEAgLTQwOTcsNyArNDU0Niw3IEBACiAgICAgLy8gR2V0IHRoZSBsYXRlc3QgcmVxdWVzdCBJRCwgaWYgYW55CiAgICAgaW50IGxhdGVzdFJlcXVlc3RJZDsKICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCByZXF1ZXN0SWRFbnRyeSA9IG1OZXh0UmVxdWVzdHNbbU5leHRSZXF1ZXN0cy5zaXplKCkgLSAxXS4KLSAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tU2V0dGluZ3MuZmluZChBTkRST0lEX1JFUVVFU1RfSUQpOworICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5nc0xpc3QuYmVnaW4oKS0+bWV0YWRhdGEuZmluZChBTkRST0lEX1JFUVVFU1RfSUQpOwogICAgIGlmIChyZXF1ZXN0SWRFbnRyeS5jb3VudCA+IDApIHsKICAgICAgICAgbGF0ZXN0UmVxdWVzdElkID0gcmVxdWVzdElkRW50cnkuZGF0YS5pMzJbMF07CiAgICAgfSBlbHNlIHsKQEAgLTQxMDUsNiArNDU1NCw1MyBAQAogICAgICAgICBsYXRlc3RSZXF1ZXN0SWQgPSBOQU1FX05PVF9GT1VORDsKICAgICB9CiAKKyAgICAvLyAnbU5leHRSZXF1ZXN0cycgd2lsbCBhdCB0aGlzIHBvaW50IGNvbnRhaW4gZWl0aGVyIGEgc2V0IG9mIEhGUiBiYXRjaGVkIHJlcXVlc3RzCisgICAgLy8gIG9yIGEgc2luZ2xlIHJlcXVlc3QgZnJvbSBzdHJlYW1pbmcgb3IgYnVyc3QuIEluIGVpdGhlciBjYXNlIHRoZSBmaXJzdCBlbGVtZW50CisgICAgLy8gIHNob3VsZCBjb250YWluIHRoZSBsYXRlc3QgY2FtZXJhIHNldHRpbmdzIHRoYXQgd2UgbmVlZCB0byBjaGVjayBmb3IgYW55IHNlc3Npb24KKyAgICAvLyAgcGFyYW1ldGVyIHVwZGF0ZXMuCisgICAgaWYgKHVwZGF0ZVNlc3Npb25QYXJhbWV0ZXJzKG1OZXh0UmVxdWVzdHNbMF0uY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5nc0xpc3QuYmVnaW4oKS0+bWV0YWRhdGEpKSB7CisgICAgICAgIHJlcyA9IE9LOworCisgICAgICAgIC8vSW5wdXQgc3RyZWFtIGJ1ZmZlcnMgYXJlIGFscmVhZHkgYWNxdWlyZWQgYXQgdGhpcyBwb2ludCBzbyBhbiBpbnB1dCBzdHJlYW0KKyAgICAgICAgLy93aWxsIG5vdCBiZSBhYmxlIHRvIG1vdmUgdG8gaWRsZSBzdGF0ZSB1bmxlc3Mgd2UgZm9yY2UgaXQuCisgICAgICAgIGlmIChtTmV4dFJlcXVlc3RzWzBdLmNhcHR1cmVSZXF1ZXN0LT5tSW5wdXRTdHJlYW0gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmVzID0gbU5leHRSZXF1ZXN0c1swXS5jYXB0dXJlUmVxdWVzdC0+bUlucHV0U3RyZWFtLT5mb3JjZVRvSWRsZSgpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGZvcmNlIGlkbGUgaW5wdXQgc3RyZWFtOiAlZCIsIF9fRlVOQ1RJT05fXywgcmVzKTsKKyAgICAgICAgICAgICAgICBjbGVhblVwRmFpbGVkUmVxdWVzdHMoLypzZW5kUmVxdWVzdEVycm9yKi8gZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgICAgIHNwPFN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIgPSBtU3RhdHVzVHJhY2tlci5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzVHJhY2tlciAhPSAwKSB7CisgICAgICAgICAgICAgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmVudC0+cGF1c2VTdGF0ZU5vdGlmeSh0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdGF0dXNUcmFja2VyLT5tYXJrQ29tcG9uZW50SWRsZShtU3RhdHVzSWQsIEZlbmNlOjpOT19GRU5DRSk7CisKKyAgICAgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgbVJlY29uZmlndXJlZCB8PSBwYXJlbnQtPnJlY29uZmlndXJlQ2FtZXJhKG1MYXRlc3RTZXNzaW9uUGFyYW1zKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdGF0dXNUcmFja2VyLT5tYXJrQ29tcG9uZW50QWN0aXZlKG1TdGF0dXNJZCk7CisgICAgICAgICAgICAgICAgc2V0UGF1c2VkKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1OZXh0UmVxdWVzdHNbMF0uY2FwdHVyZVJlcXVlc3QtPm1JbnB1dFN0cmVhbSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0c1swXS5jYXB0dXJlUmVxdWVzdC0+bUlucHV0U3RyZWFtLT5yZXN0b3JlQ29uZmlndXJlZFN0YXRlKCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZXN0b3JlIGNvbmZpZ3VyZWQgaW5wdXQgc3RyZWFtOiAlZCIsIF9fRlVOQ1RJT05fXywgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgY2xlYW5VcEZhaWxlZFJlcXVlc3RzKC8qc2VuZFJlcXVlc3RFcnJvciovIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIFByZXBhcmUgYSBiYXRjaCBvZiBIQUwgcmVxdWVzdHMgYW5kIG91dHB1dCBidWZmZXJzLgogICAgIHJlcyA9IHByZXBhcmVIYWxSZXF1ZXN0cygpOwogICAgIGlmIChyZXMgPT0gVElNRURfT1VUKSB7CkBAIC00MTkxLDcgKzQ2ODcsOCBAQAogICAgICAgICBtUHJldlRyaWdnZXJzID0gdHJpZ2dlckNvdW50OwogCiAgICAgICAgIC8vIElmIHRoZSByZXF1ZXN0IGlzIHRoZSBzYW1lIGFzIGxhc3QsIG9yIHdlIGhhZCB0cmlnZ2VycyBsYXN0IHRpbWUKLSAgICAgICAgaWYgKG1QcmV2UmVxdWVzdCAhPSBjYXB0dXJlUmVxdWVzdCB8fCB0cmlnZ2Vyc01peGVkSW4pIHsKKyAgICAgICAgYm9vbCBuZXdSZXF1ZXN0ID0gbVByZXZSZXF1ZXN0ICE9IGNhcHR1cmVSZXF1ZXN0IHx8IHRyaWdnZXJzTWl4ZWRJbjsKKyAgICAgICAgaWYgKG5ld1JlcXVlc3QpIHsKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogSEFMIHdvcmthcm91bmQ6CiAgICAgICAgICAgICAgKiBJbnNlcnQgYSBkdW1teSB0cmlnZ2VyIElEIGlmIGEgdHJpZ2dlciBpcyBzZXQgYnV0IG5vIHRyaWdnZXIgSUQgaXMKQEAgLTQyMDgsOCArNDcwNSw4IEBACiAgICAgICAgICAgICAgKiBUaGUgcmVxdWVzdCBzaG91bGQgYmUgcHJlc29ydGVkIHNvIGFjY2Vzc2VzIGluIEhBTAogICAgICAgICAgICAgICogICBhcmUgTyhsb2duKS4gU2lkZW5vdGUsIHNvcnRpbmcgYSBzb3J0ZWQgbWV0YWRhdGEgaXMgbm9wLgogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bVNldHRpbmdzLnNvcnQoKTsKLSAgICAgICAgICAgIGhhbFJlcXVlc3QtPnNldHRpbmdzID0gY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5ncy5nZXRBbmRMb2NrKCk7CisgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bVNldHRpbmdzTGlzdC5iZWdpbigpLT5tZXRhZGF0YS5zb3J0KCk7CisgICAgICAgICAgICBoYWxSZXF1ZXN0LT5zZXR0aW5ncyA9IGNhcHR1cmVSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCktPm1ldGFkYXRhLmdldEFuZExvY2soKTsKICAgICAgICAgICAgIG1QcmV2UmVxdWVzdCA9IGNhcHR1cmVSZXF1ZXN0OwogICAgICAgICAgICAgQUxPR1ZWKCIlczogUmVxdWVzdCBzZXR0aW5ncyBhcmUgTkVXIiwgX19GVU5DVElPTl9fKTsKIApAQCAtNDIzMyw2ICs0NzMwLDI2IEBACiAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChjYXB0dXJlUmVxdWVzdC0+bVNldHRpbmdzTGlzdC5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICBoYWxSZXF1ZXN0LT5udW1fcGh5c2NhbV9zZXR0aW5ncyA9IGNhcHR1cmVSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LnNpemUoKSAtIDE7CisgICAgICAgICAgICBoYWxSZXF1ZXN0LT5waHlzY2FtX2lkID0gbmV3IGNvbnN0IGNoYXIqIFtoYWxSZXF1ZXN0LT5udW1fcGh5c2NhbV9zZXR0aW5nc107CisgICAgICAgICAgICBpZiAobmV3UmVxdWVzdCkgeworICAgICAgICAgICAgICAgIGhhbFJlcXVlc3QtPnBoeXNjYW1fc2V0dGluZ3MgPQorICAgICAgICAgICAgICAgICAgICBuZXcgY29uc3QgY2FtZXJhX21ldGFkYXRhKiBbaGFsUmVxdWVzdC0+bnVtX3BoeXNjYW1fc2V0dGluZ3NdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoYWxSZXF1ZXN0LT5waHlzY2FtX3NldHRpbmdzID0gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gaXQgPSArK2NhcHR1cmVSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCk7CisgICAgICAgICAgICBzaXplX3QgaSA9IDA7CisgICAgICAgICAgICBmb3IgKDsgaXQgIT0gY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5nc0xpc3QuZW5kKCk7IGl0KyssIGkrKykgeworICAgICAgICAgICAgICAgIGhhbFJlcXVlc3QtPnBoeXNjYW1faWRbaV0gPSBpdC0+Y2FtZXJhSWQuY19zdHIoKTsKKyAgICAgICAgICAgICAgICBpZiAobmV3UmVxdWVzdCkgeworICAgICAgICAgICAgICAgICAgICBpdC0+bWV0YWRhdGEuc29ydCgpOworICAgICAgICAgICAgICAgICAgICBoYWxSZXF1ZXN0LT5waHlzY2FtX3NldHRpbmdzW2ldID0gaXQtPm1ldGFkYXRhLmdldEFuZExvY2soKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICB1aW50MzJfdCB0b3RhbE51bUJ1ZmZlcnMgPSAwOwogCiAgICAgICAgIC8vIEZpbGwgaW4gYnVmZmVycwpAQCAtNDI0Niw2ICs0NzYzLDcgQEAKICAgICAgICAgb3V0cHV0QnVmZmVycy0+aW5zZXJ0QXQoY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QoKSwgMCwKICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bU91dHB1dFN0cmVhbXMuc2l6ZSgpKTsKICAgICAgICAgaGFsUmVxdWVzdC0+b3V0cHV0X2J1ZmZlcnMgPSBvdXRwdXRCdWZmZXJzLT5hcnJheSgpOworICAgICAgICBzdGQ6OnNldDxTdHJpbmc4PiByZXF1ZXN0ZWRQaHlzaWNhbENhbWVyYXM7CiAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zLnNpemUoKTsgaisrKSB7CiAgICAgICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBvdXRwdXRTdHJlYW0gPSBjYXB0dXJlUmVxdWVzdC0+bU91dHB1dFN0cmVhbXMuZWRpdEl0ZW1BdChqKTsKIApAQCAtNDI3Niw4ICs0Nzk0LDE4IEBACiAKICAgICAgICAgICAgICAgICByZXR1cm4gVElNRURfT1VUOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFsUmVxdWVzdC0+bnVtX291dHB1dF9idWZmZXJzKys7CiAKKyAgICAgICAgICAgIFN0cmluZzggcGh5c2ljYWxDYW1lcmFJZCA9IG91dHB1dFN0cmVhbS0+Z2V0UGh5c2ljYWxDYW1lcmFJZCgpOworCisgICAgICAgICAgICBpZiAoIXBoeXNpY2FsQ2FtZXJhSWQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgLy8gUGh5c2ljYWwgc3RyZWFtIGlzbid0IHN1cHBvcnRlZCBmb3IgaW5wdXQgcmVxdWVzdC4KKyAgICAgICAgICAgICAgICBpZiAoaGFsUmVxdWVzdC0+aW5wdXRfYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIENMT0dFKCJQaHlzaWNhbCBzdHJlYW0gaXMgbm90IHN1cHBvcnRlZCBmb3IgaW5wdXQgcmVxdWVzdCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcXVlc3RlZFBoeXNpY2FsQ2FtZXJhcy5pbnNlcnQocGh5c2ljYWxDYW1lcmFJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoYWxSZXF1ZXN0LT5udW1fb3V0cHV0X2J1ZmZlcnMrKzsKICAgICAgICAgfQogICAgICAgICB0b3RhbE51bUJ1ZmZlcnMgKz0gaGFsUmVxdWVzdC0+bnVtX291dHB1dF9idWZmZXJzOwogCkBAIC00MzAwLDcgKzQ4MjgsOCBAQAogICAgICAgICAgICAgICAgIHRvdGFsTnVtQnVmZmVycywgY2FwdHVyZVJlcXVlc3QtPm1SZXN1bHRFeHRyYXMsCiAgICAgICAgICAgICAgICAgLypoYXNJbnB1dCovaGFsUmVxdWVzdC0+aW5wdXRfYnVmZmVyICE9IE5VTEwsCiAgICAgICAgICAgICAgICAgaGFzQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgY2FsY3VsYXRlTWF4RXhwZWN0ZWREdXJhdGlvbihoYWxSZXF1ZXN0LT5zZXR0aW5ncykpOworICAgICAgICAgICAgICAgIGNhbGN1bGF0ZU1heEV4cGVjdGVkRHVyYXRpb24oaGFsUmVxdWVzdC0+c2V0dGluZ3MpLAorICAgICAgICAgICAgICAgIHJlcXVlc3RlZFBoeXNpY2FsQ2FtZXJhcyk7CiAgICAgICAgIEFMT0dWVigiJXM6IHJlZ2lzdGVyZWQgaW4gZmxpZ2h0IHJlcXVlc3RJZCA9ICUiIFBSSWQzMiAiLCBmcmFtZU51bWJlciA9ICUiIFBSSWQ2NAogICAgICAgICAgICAgICAgIiwgYnVyc3RJZCA9ICUiIFBSSWQzMiAiLiIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLApAQCAtNDM1Niw2ICs0ODg1LDQ2IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCitib29sIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmlzT3V0cHV0U3VyZmFjZVBlbmRpbmcoaW50IHN0cmVhbUlkLCBzaXplX3Qgc3VyZmFjZUlkKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOworCisgICAgZm9yIChjb25zdCBhdXRvJiBuZXh0UmVxdWVzdCA6IG1OZXh0UmVxdWVzdHMpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzIDogbmV4dFJlcXVlc3QuY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdXJmYWNlcykgeworICAgICAgICAgICAgaWYgKHMuZmlyc3QgPT0gc3RyZWFtSWQpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvICZpdCA9IHN0ZDo6ZmluZChzLnNlY29uZC5iZWdpbigpLCBzLnNlY29uZC5lbmQoKSwgc3VyZmFjZUlkKTsKKyAgICAgICAgICAgICAgICBpZiAoaXQgIT0gcy5zZWNvbmQuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvJiByZXF1ZXN0IDogbVJlcXVlc3RRdWV1ZSkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHMgOiByZXF1ZXN0LT5tT3V0cHV0U3VyZmFjZXMpIHsKKyAgICAgICAgICAgIGlmIChzLmZpcnN0ID09IHN0cmVhbUlkKSB7CisgICAgICAgICAgICAgICAgY29uc3QgYXV0byAmaXQgPSBzdGQ6OmZpbmQocy5zZWNvbmQuYmVnaW4oKSwgcy5zZWNvbmQuZW5kKCksIHN1cmZhY2VJZCk7CisgICAgICAgICAgICAgICAgaWYgKGl0ICE9IHMuc2Vjb25kLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHJlcXVlc3QgOiBtUmVwZWF0aW5nUmVxdWVzdHMpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzIDogcmVxdWVzdC0+bU91dHB1dFN1cmZhY2VzKSB7CisgICAgICAgICAgICBpZiAocy5maXJzdCA9PSBzdHJlYW1JZCkgeworICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gJml0ID0gc3RkOjpmaW5kKHMuc2Vjb25kLmJlZ2luKCksIHMuc2Vjb25kLmVuZCgpLCBzdXJmYWNlSWQpOworICAgICAgICAgICAgICAgIGlmIChpdCAhPSBzLnNlY29uZC5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCiBuc2Vjc190IENhbWVyYTNEZXZpY2U6OmdldEV4cGVjdGVkSW5GbGlnaHREdXJhdGlvbigpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBhbChtSW5GbGlnaHRMb2NrKTsKQEAgLTQzNjMsNiArNDkzMiwzMCBAQAogICAgICAgICAgICAgbUV4cGVjdGVkSW5mbGlnaHREdXJhdGlvbiA6IGtNaW5JbmZsaWdodER1cmF0aW9uOwogfQogCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmNsZWFudXBQaHlzaWNhbFNldHRpbmdzKHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0LAorICAgICAgICBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90ICpoYWxSZXF1ZXN0KSB7CisgICAgaWYgKChyZXF1ZXN0ID09IG51bGxwdHIpIHx8IChoYWxSZXF1ZXN0ID09IG51bGxwdHIpKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCByZXF1ZXN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoaGFsUmVxdWVzdC0+bnVtX3BoeXNjYW1fc2V0dGluZ3MgPiAwKSB7CisgICAgICAgIGlmIChoYWxSZXF1ZXN0LT5waHlzY2FtX2lkICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBbXSBoYWxSZXF1ZXN0LT5waHlzY2FtX2lkOworICAgICAgICAgICAgaGFsUmVxdWVzdC0+cGh5c2NhbV9pZCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhhbFJlcXVlc3QtPnBoeXNjYW1fc2V0dGluZ3MgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgYXV0byBpdCA9ICsrKHJlcXVlc3QtPm1TZXR0aW5nc0xpc3QuYmVnaW4oKSk7CisgICAgICAgICAgICBzaXplX3QgaSA9IDA7CisgICAgICAgICAgICBmb3IgKDsgaXQgIT0gcmVxdWVzdC0+bVNldHRpbmdzTGlzdC5lbmQoKTsgaXQrKywgaSsrKSB7CisgICAgICAgICAgICAgICAgaXQtPm1ldGFkYXRhLnVubG9jayhoYWxSZXF1ZXN0LT5waHlzY2FtX3NldHRpbmdzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlbGV0ZSBbXSBoYWxSZXF1ZXN0LT5waHlzY2FtX3NldHRpbmdzOworICAgICAgICAgICAgaGFsUmVxdWVzdC0+cGh5c2NhbV9zZXR0aW5ncyA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9Cit9CisKIHZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6Y2xlYW5VcEZhaWxlZFJlcXVlc3RzKGJvb2wgc2VuZFJlcXVlc3RFcnJvcikgewogICAgIGlmIChtTmV4dFJlcXVlc3RzLmVtcHR5KCkpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtNDM3OSw5ICs0OTcyLDExIEBACiAgICAgICAgIFZlY3RvcjxjYW1lcmEzX3N0cmVhbV9idWZmZXJfdD4qIG91dHB1dEJ1ZmZlcnMgPSAmbmV4dFJlcXVlc3Qub3V0cHV0QnVmZmVyczsKIAogICAgICAgICBpZiAoaGFsUmVxdWVzdC0+c2V0dGluZ3MgIT0gTlVMTCkgewotICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5ncy51bmxvY2soaGFsUmVxdWVzdC0+c2V0dGluZ3MpOworICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5nc0xpc3QuYmVnaW4oKS0+bWV0YWRhdGEudW5sb2NrKGhhbFJlcXVlc3QtPnNldHRpbmdzKTsKICAgICAgICAgfQogCisgICAgICAgIGNsZWFudXBQaHlzaWNhbFNldHRpbmdzKGNhcHR1cmVSZXF1ZXN0LCBoYWxSZXF1ZXN0KTsKKwogICAgICAgICBpZiAoY2FwdHVyZVJlcXVlc3QtPm1JbnB1dFN0cmVhbSAhPSBOVUxMKSB7CiAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bUlucHV0QnVmZmVyLnN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUjsKICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tSW5wdXRTdHJlYW0tPnJldHVybklucHV0QnVmZmVyKGNhcHR1cmVSZXF1ZXN0LT5tSW5wdXRCdWZmZXIpOwpAQCAtNDY0NSw3ICs1MjQwLDcgQEAKICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwogICAgIH0KIAotICAgIENhbWVyYU1ldGFkYXRhICZtZXRhZGF0YSA9IHJlcXVlc3QtPm1TZXR0aW5nczsKKyAgICBDYW1lcmFNZXRhZGF0YSAmbWV0YWRhdGEgPSByZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCktPm1ldGFkYXRhOwogICAgIHNpemVfdCBjb3VudCA9IG1UcmlnZ2VyTWFwLnNpemUoKTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewpAQCAtNDcyOCw3ICs1MzIzLDcgQEAKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBhbChtVHJpZ2dlck11dGV4KTsKIAotICAgIENhbWVyYU1ldGFkYXRhICZtZXRhZGF0YSA9IHJlcXVlc3QtPm1TZXR0aW5nczsKKyAgICBDYW1lcmFNZXRhZGF0YSAmbWV0YWRhdGEgPSByZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCktPm1ldGFkYXRhOwogCiAgICAgLyoqCiAgICAgICogUmVwbGFjZSBhbGwgb2xkIGVudHJpZXMgd2l0aCB0aGVpciBvbGQgdmFsdWVzLgpAQCAtNDc5Myw3ICs1Mzg4LDcgQEAKICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBkdW1teVRyaWdnZXJJZCA9IDE7CiAgICAgc3RhdHVzX3QgcmVzOwogCi0gICAgQ2FtZXJhTWV0YWRhdGEgJm1ldGFkYXRhID0gcmVxdWVzdC0+bVNldHRpbmdzOworICAgIENhbWVyYU1ldGFkYXRhICZtZXRhZGF0YSA9IHJlcXVlc3QtPm1TZXR0aW5nc0xpc3QuYmVnaW4oKS0+bWV0YWRhdGE7CiAKICAgICAvLyBJZiBBRiB0cmlnZ2VyIGlzIGFjdGl2ZSwgaW5zZXJ0IGEgZHVtbXkgQUYgdHJpZ2dlciBJRCBpZiBub25lIGFscmVhZHkKICAgICAvLyBleGlzdHMKQEAgLTQ4MjgsNyArNTQyMyw3IEBACiAKIENhbWVyYTNEZXZpY2U6OlByZXBhcmVyVGhyZWFkOjpQcmVwYXJlclRocmVhZCgpIDoKICAgICAgICAgVGhyZWFkKC8qY2FuQ2FsbEphdmEqL2ZhbHNlKSwgbUxpc3RlbmVyKG51bGxwdHIpLAotICAgICAgICBtQWN0aXZlKGZhbHNlKSwgbUNhbmNlbE5vdyhmYWxzZSkgeworICAgICAgICBtQWN0aXZlKGZhbHNlKSwgbUNhbmNlbE5vdyhmYWxzZSksIG1DdXJyZW50TWF4Q291bnQoMCksIG1DdXJyZW50UHJlcGFyZUNvbXBsZXRlKGZhbHNlKSB7CiB9CiAKIENhbWVyYTNEZXZpY2U6OlByZXBhcmVyVGhyZWFkOjp+UHJlcGFyZXJUaHJlYWQoKSB7CkBAIC00ODc5LDE4ICs1NDc0LDEwMSBAQAogICAgIH0KIAogICAgIC8vIHF1ZXVlIHVwIHRoZSB3b3JrCi0gICAgbVBlbmRpbmdTdHJlYW1zLnB1c2hfYmFjayhzdHJlYW0pOworICAgIG1QZW5kaW5nU3RyZWFtcy5lbXBsYWNlKG1heENvdW50LCBzdHJlYW0pOwogICAgIEFMT0dWKCIlczogU3RyZWFtICVkIHF1ZXVlZCBmb3IgcHJlcGFyaW5nIiwgX19GVU5DVElPTl9fLCBzdHJlYW0tPmdldElkKCkpOwogCiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIENhbWVyYTNEZXZpY2U6OlByZXBhcmVyVGhyZWFkOjpwYXVzZSgpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludCwgc3A8Y2FtZXJhMzo6Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gPiBwZW5kaW5nU3RyZWFtczsKKyAgICBwZW5kaW5nU3RyZWFtcy5pbnNlcnQobVBlbmRpbmdTdHJlYW1zLmJlZ2luKCksIG1QZW5kaW5nU3RyZWFtcy5lbmQoKSk7CisgICAgc3A8Y2FtZXJhMzo6Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gY3VycmVudFN0cmVhbSA9IG1DdXJyZW50U3RyZWFtOworICAgIGludCBjdXJyZW50TWF4Q291bnQgPSBtQ3VycmVudE1heENvdW50OworICAgIG1QZW5kaW5nU3RyZWFtcy5jbGVhcigpOworICAgIG1DYW5jZWxOb3cgPSB0cnVlOworICAgIHdoaWxlIChtQWN0aXZlKSB7CisgICAgICAgIGF1dG8gcmVzID0gbVRocmVhZEFjdGl2ZVNpZ25hbC53YWl0UmVsYXRpdmUobUxvY2ssIGtBY3RpdmVUaW1lb3V0KTsKKyAgICAgICAgaWYgKHJlcyA9PSBUSU1FRF9PVVQpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVGltZWQgb3V0IHdhaXRpbmcgb24gcHJlcGFyZSB0aHJlYWQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRW5jb3VudGVyZWQgYW4gZXJyb3I6ICVkIHdhaXRpbmcgb24gcHJlcGFyZSB0aHJlYWQhIiwgX19GVU5DVElPTl9fLCByZXMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy9DaGVjayB3aGV0aGVyIHRoZSBwcmVwYXJlIHRocmVhZCB3YXMgYWJsZSB0byBjb21wbGV0ZSB0aGUgY3VycmVudAorICAgIC8vc3RyZWFtLiBJbiBjYXNlIHdvcmsgaXMgc3RpbGwgcGVuZGluZyBlbXBsYWNlIGl0IGFsb25nIHdpdGggdGhlIHJlc3QKKyAgICAvL29mIHRoZSBzdHJlYW1zIGluIHRoZSBwZW5kaW5nIGxpc3QuCisgICAgaWYgKGN1cnJlbnRTdHJlYW0gIT0gbnVsbHB0cikgeworICAgICAgICBpZiAoIW1DdXJyZW50UHJlcGFyZUNvbXBsZXRlKSB7CisgICAgICAgICAgICBwZW5kaW5nU3RyZWFtcy5lbXBsYWNlKGN1cnJlbnRNYXhDb3VudCwgY3VycmVudFN0cmVhbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtUGVuZGluZ1N0cmVhbXMuaW5zZXJ0KHBlbmRpbmdTdHJlYW1zLmJlZ2luKCksIHBlbmRpbmdTdHJlYW1zLmVuZCgpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogbVBlbmRpbmdTdHJlYW1zKSB7CisgICAgICAgIGl0LnNlY29uZC0+Y2FuY2VsUHJlcGFyZSgpOworICAgIH0KK30KKworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UHJlcGFyZXJUaHJlYWQ6OnJlc3VtZSgpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIHN0YXR1c190IHJlczsKKworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworCisgICAgaWYgKG1BY3RpdmUpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcnlpbmcgdG8gcmVzdW1lIGFuIGFscmVhZHkgYWN0aXZlIHByZXBhcmUgdGhyZWFkISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGF1dG8gaXQgPSBtUGVuZGluZ1N0cmVhbXMuYmVnaW4oKTsKKyAgICBmb3IgKDsgaXQgIT0gbVBlbmRpbmdTdHJlYW1zLmVuZCgpOykgeworICAgICAgICByZXMgPSBpdC0+c2Vjb25kLT5zdGFydFByZXBhcmUoaXQtPmZpcnN0KTsKKyAgICAgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICAgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci0+bm90aWZ5UHJlcGFyZWQoaXQtPnNlY29uZC0+Z2V0SWQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpdCA9IG1QZW5kaW5nU3RyZWFtcy5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSBpZiAocmVzICE9IE5PVF9FTk9VR0hfREFUQSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gc3RhcnQgcHJlcGFyZXIgc3RyZWFtOiAlZCAoJXMpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICByZXMsIHN0cmVycm9yKC1yZXMpKTsKKyAgICAgICAgICAgIGl0ID0gbVBlbmRpbmdTdHJlYW1zLmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGl0Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobVBlbmRpbmdTdHJlYW1zLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHJlcyA9IFRocmVhZDo6cnVuKCJDM1ByZXBUaHJlYWQiLCBQUklPUklUWV9CQUNLR1JPVU5EKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHN0YXJ0IHByZXBhcmVyIHN0cmVhbTogJWQgKCVzKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXMsIHN0cmVycm9yKC1yZXMpKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgbUNhbmNlbE5vdyA9IGZhbHNlOworICAgIG1BY3RpdmUgPSB0cnVlOworICAgIEFMT0dWKCIlczogUHJlcGFyZXIgc3RyZWFtIHN0YXJ0ZWQiLCBfX0ZVTkNUSU9OX18pOworCisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpQcmVwYXJlclRocmVhZDo6Y2xlYXIoKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKLSAgICBmb3IgKGNvbnN0IGF1dG8mIHN0cmVhbSA6IG1QZW5kaW5nU3RyZWFtcykgewotICAgICAgICBzdHJlYW0tPmNhbmNlbFByZXBhcmUoKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogbVBlbmRpbmdTdHJlYW1zKSB7CisgICAgICAgIGl0LnNlY29uZC0+Y2FuY2VsUHJlcGFyZSgpOwogICAgIH0KICAgICBtUGVuZGluZ1N0cmVhbXMuY2xlYXIoKTsKICAgICBtQ2FuY2VsTm93ID0gdHJ1ZTsKQEAgLTQ5MTUsMTIgKzU1OTMsMTUgQEAKICAgICAgICAgICAgICAgICAvLyB0aHJlYWRMb29wIF9tdXN0IG5vdF8gcmUtYWNxdWlyZSBtTG9jayBhZnRlciBpdCBzZXRzIG1BY3RpdmUgdG8gZmFsc2U7IHdvdWxkCiAgICAgICAgICAgICAgICAgLy8gY2F1c2UgZGVhZGxvY2sgd2l0aCBwcmVwYXJlKCkncyByZXF1ZXN0RXhpdEFuZFdhaXQgdHJpZ2dlcmVkIGJ5ICFtQWN0aXZlLgogICAgICAgICAgICAgICAgIG1BY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtVGhyZWFkQWN0aXZlU2lnbmFsLnNpZ25hbCgpOwogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gR2V0IG5leHQgc3RyZWFtIHRvIHByZXBhcmUKICAgICAgICAgICAgIGF1dG8gaXQgPSBtUGVuZGluZ1N0cmVhbXMuYmVnaW4oKTsKLSAgICAgICAgICAgIG1DdXJyZW50U3RyZWFtID0gKml0OworICAgICAgICAgICAgbUN1cnJlbnRTdHJlYW0gPSBpdC0+c2Vjb25kOworICAgICAgICAgICAgbUN1cnJlbnRNYXhDb3VudCA9IGl0LT5maXJzdDsKKyAgICAgICAgICAgIG1DdXJyZW50UHJlcGFyZUNvbXBsZXRlID0gZmFsc2U7CiAgICAgICAgICAgICBtUGVuZGluZ1N0cmVhbXMuZXJhc2UoaXQpOwogICAgICAgICAgICAgQVRSQUNFX0FTWU5DX0JFR0lOKCJzdHJlYW0gcHJlcGFyZSIsIG1DdXJyZW50U3RyZWFtLT5nZXRJZCgpKTsKICAgICAgICAgICAgIEFMT0dWKCIlczogUHJlcGFyaW5nIHN0cmVhbSAlZCIsIF9fRlVOQ1RJT05fXywgbUN1cnJlbnRTdHJlYW0tPmdldElkKCkpOwpAQCAtNDk1NSw2ICs1NjM2LDcgQEAKIAogICAgIEFUUkFDRV9BU1lOQ19FTkQoInN0cmVhbSBwcmVwYXJlIiwgbUN1cnJlbnRTdHJlYW0tPmdldElkKCkpOwogICAgIG1DdXJyZW50U3RyZWFtLmNsZWFyKCk7CisgICAgbUN1cnJlbnRQcmVwYXJlQ29tcGxldGUgPSB0cnVlOwogCiAgICAgcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oCmluZGV4IDA4MWFmMTkuLjEzYjgzYmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDx1dGlsaXR5PgogI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8c2V0PgogCiAjaW5jbHVkZSA8dXRpbHMvQ29uZGl0aW9uLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CkBAIC0zMSw3ICszMiw5IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuMi9JQ2FtZXJhRGV2aWNlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuMi9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjMvSUNhbWVyYURldmljZVNlc3Npb24uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy40L0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy40L0lDYW1lcmFEZXZpY2VDYWxsYmFjay5oPgogI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEzLmg+CiAKQEAgLTQ0LDYgKzQ3LDggQEAKICNpbmNsdWRlICJ1dGlscy9MYXRlbmN5SGlzdG9ncmFtLmgiCiAjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX2hpZGRlbi5oPgogCit1c2luZyBhbmRyb2lkOjpjYW1lcmEzOjpPdXRwdXRTdHJlYW1JbmZvOworCiAvKioKICAqIEZ1bmN0aW9uIHBvaW50ZXIgdHlwZXMgd2l0aCBDIGNhbGxpbmcgY29udmVudGlvbiB0bwogICogdXNlIGZvciBIQUwgY2FsbGJhY2sgZnVuY3Rpb25zLgpAQCAtNzQsNyArNzksNyBAQAogICovCiBjbGFzcyBDYW1lcmEzRGV2aWNlIDoKICAgICAgICAgICAgIHB1YmxpYyBDYW1lcmFEZXZpY2VCYXNlLAotICAgICAgICAgICAgdmlydHVhbCBwdWJsaWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2ssCisgICAgICAgICAgICB2aXJ0dWFsIHB1YmxpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OklDYW1lcmFEZXZpY2VDYWxsYmFjaywKICAgICAgICAgICAgIHByaXZhdGUgY2FtZXJhM19jYWxsYmFja19vcHMgewogICBwdWJsaWM6CiAKQEAgLTg4LDggKzkzLDEwIEBACiAKICAgICBjb25zdCBTdHJpbmc4JiBnZXRJZCgpIGNvbnN0IG92ZXJyaWRlOwogCisgICAgbWV0YWRhdGFfdmVuZG9yX2lkX3QgZ2V0VmVuZG9yVGFnSWQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtVmVuZG9yVGFnSWQ7IH0KKwogICAgIC8vIFRyYW5zaXRpb25zIHRvIGlkbGUgc3RhdGUgb24gc3VjY2Vzcy4KLSAgICBzdGF0dXNfdCBpbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlcikgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsIGNvbnN0IFN0cmluZzgmIG1vbml0b3JUYWdzKSBvdmVycmlkZTsKICAgICBzdGF0dXNfdCBkaXNjb25uZWN0KCkgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIG92ZXJyaWRlOwogICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBpbmZvKCkgY29uc3Qgb3ZlcnJpZGU7CkBAIC05NywxMiArMTA0LDEyIEBACiAgICAgLy8gQ2FwdHVyZSBhbmQgc2V0U3RyZWFtaW5nUmVxdWVzdCB3aWxsIGNvbmZpZ3VyZSBzdHJlYW1zIGlmIGN1cnJlbnRseSBpbgogICAgIC8vIGlkbGUgc3RhdGUKICAgICBzdGF0dXNfdCBjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LCBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKSBvdmVycmlkZTsKLSAgICBzdGF0dXNfdCBjYXB0dXJlTGlzdChjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmcmVxdWVzdHMsCisgICAgc3RhdHVzX3QgY2FwdHVyZUxpc3QoY29uc3QgTGlzdDxjb25zdCBQaHlzaWNhbENhbWVyYVNldHRpbmdzTGlzdD4gJnJlcXVlc3RzTGlzdCwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxjb25zdCBTdXJmYWNlTWFwPiAmc3VyZmFjZU1hcHMsCiAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKSBvdmVycmlkZTsKICAgICBzdGF0dXNfdCBzZXRTdHJlYW1pbmdSZXF1ZXN0KGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LAogICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCkgb3ZlcnJpZGU7Ci0gICAgc3RhdHVzX3Qgc2V0U3RyZWFtaW5nUmVxdWVzdExpc3QoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLAorICAgIHN0YXR1c190IHNldFN0cmVhbWluZ1JlcXVlc3RMaXN0KGNvbnN0IExpc3Q8Y29uc3QgUGh5c2ljYWxDYW1lcmFTZXR0aW5nc0xpc3Q+ICZyZXF1ZXN0c0xpc3QsCiAgICAgICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8Y29uc3QgU3VyZmFjZU1hcD4gJnN1cmZhY2VNYXBzLAogICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCkgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3QgY2xlYXJTdHJlYW1pbmdSZXF1ZXN0KGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpIG92ZXJyaWRlOwpAQCAtMTE3LDExICsxMjQsMTUgQEAKICAgICBzdGF0dXNfdCBjcmVhdGVTdHJlYW0oc3A8U3VyZmFjZT4gY29uc3VtZXIsCiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAogICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMgPSBudWxscHRyLAogICAgICAgICAgICAgaW50IHN0cmVhbVNldElkID0gY2FtZXJhMzo6Q0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQsCiAgICAgICAgICAgICBib29sIGlzU2hhcmVkID0gZmFsc2UsIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UgPSAwKSBvdmVycmlkZTsKICAgICBzdGF0dXNfdCBjcmVhdGVTdHJlYW0oY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBjb25zdW1lcnMsCiAgICAgICAgICAgICBib29sIGhhc0RlZmVycmVkQ29uc3VtZXIsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCiAgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcyA9IG51bGxwdHIsCiAgICAgICAgICAgICBpbnQgc3RyZWFtU2V0SWQgPSBjYW1lcmEzOjpDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwKICAgICAgICAgICAgIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSwgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDApIG92ZXJyaWRlOwogCkBAIC0xMzQsNyArMTQ1LDggQEAKIAogICAgIHN0YXR1c190IGRlbGV0ZVN0cmVhbShpbnQgaWQpIG92ZXJyaWRlOwogCi0gICAgc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtcyhpbnQgb3BlcmF0aW5nTW9kZSA9CisgICAgc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtcyhjb25zdCBDYW1lcmFNZXRhZGF0YSYgc2Vzc2lvblBhcmFtcywKKyAgICAgICAgICAgIGludCBvcGVyYXRpbmdNb2RlID0KICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZTo6Tk9STUFMX01PREUpKQogICAgICAgICAgICAgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJQcm9kdWNlcigKQEAgLTE3Niw3ICsxODgsMTcgQEAKICAgICAgKiBTZXQgdGhlIGRlZmVycmVkIGNvbnN1bWVyIHN1cmZhY2VzIHRvIHRoZSBvdXRwdXQgc3RyZWFtIGFuZCBmaW5pc2ggdGhlIGRlZmVycmVkCiAgICAgICogY29uc3VtZXIgY29uZmlndXJhdGlvbi4KICAgICAgKi8KLSAgICBzdGF0dXNfdCBzZXRDb25zdW1lclN1cmZhY2VzKGludCBzdHJlYW1JZCwgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBjb25zdW1lcnMpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldENvbnN1bWVyU3VyZmFjZXMoCisgICAgICAgICAgICBpbnQgc3RyZWFtSWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcyAvKm91dCovKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIFVwZGF0ZSBhIGdpdmVuIHN0cmVhbS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCB1cGRhdGVTdHJlYW0oaW50IHN0cmVhbUlkLCBjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4gJm5ld1N1cmZhY2VzLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8T3V0cHV0U3RyZWFtSW5mbz4gJm91dHB1dEluZm8sCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+ICZyZW1vdmVkU3VyZmFjZUlkcywKKyAgICAgICAgICAgIEtleWVkVmVjdG9yPHNwPFN1cmZhY2U+LCBzaXplX3Q+ICpvdXRwdXRNYXAvKm91dCovKTsKIAogICAgIC8qKgogICAgICAqIERyb3AgYnVmZmVycyBmb3Igc3RyZWFtIG9mIHN0cmVhbUlkIGlmIGRyb3BwaW5nIGlzIHRydWUuIElmIGRyb3BwaW5nIGlzIGZhbHNlLCBkbyBub3QKQEAgLTIyMiw2ICsyNDQsOSBAQAogCiAgICAgLy8gQ3VycmVudCBzdHJlYW0gY29uZmlndXJhdGlvbiBtb2RlOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIG1PcGVyYXRpbmdNb2RlOworICAgIC8vIEN1cnJlbnQgc2Vzc2lvbiB3aWRlIHBhcmFtZXRlcnMKKyAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6aW1wbDo6Q2FtZXJhTWV0YWRhdGFOYXRpdmUgbVNlc3Npb25QYXJhbXM7CisKICAgICAvLyBDb25zdGFudCB0byB1c2UgZm9yIG5vIHNldCBvcGVyYXRpbmcgbW9kZQogICAgIHN0YXRpYyBjb25zdCBpbnQgICAgICAgICAgIE5PX01PREUgPSAtMTsKIApAQCAtMjU4LDcgKzI4Myw5IEBACiAgICAgICAgIC8vIENhbGxlciB0YWtlcyBvd25lcnNoaXAgb2YgcmVxdWVzdFRlbXBsYXRlCiAgICAgICAgIHN0YXR1c190IGNvbnN0cnVjdERlZmF1bHRSZXF1ZXN0U2V0dGluZ3MoY2FtZXJhM19yZXF1ZXN0X3RlbXBsYXRlX3QgdGVtcGxhdGVJZCwKICAgICAgICAgICAgICAgICAvKm91dCovIGNhbWVyYV9tZXRhZGF0YV90ICoqcmVxdWVzdFRlbXBsYXRlKTsKLSAgICAgICAgc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtcygvKmlub3V0Ki8gY2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbiAqY29uZmlnKTsKKyAgICAgICAgc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtcyhjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqc2Vzc2lvblBhcmFtcywKKyAgICAgICAgICAgICAgICAvKmlub3V0Ki8gY2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbiAqY29uZmlnLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgYnVmZmVyU2l6ZXMpOwogICAgICAgICBzdGF0dXNfdCBwcm9jZXNzQ2FwdHVyZVJlcXVlc3QoY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCAqcmVxdWVzdCk7CiAgICAgICAgIHN0YXR1c190IHByb2Nlc3NCYXRjaENhcHR1cmVSZXF1ZXN0cygKICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90Kj4mIHJlcXVlc3RzLApAQCAtMjc2LDcgKzMwMywxMyBAQAogICAgICAgICB2b2lkIGdldEluZmxpZ2h0QnVmZmVyS2V5cyhzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+KiBvdXQpOwogCiAgICAgICBwcml2YXRlOgorICAgICAgICAvLyBBbHdheXMgdmFsaWQKICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gbUhpZGxTZXNzaW9uOworICAgICAgICAvLyBWYWxpZCBpZiBJQ2FtZXJhRGV2aWNlU2Vzc2lvbiBpcyBAMy4zIG9yIG5ld2VyCisgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMzo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbl8zXzM7CisgICAgICAgIC8vIFZhbGlkIGlmIElDYW1lcmFEZXZpY2VTZXNzaW9uIGlzIEAzLjQgb3IgbmV3ZXIKKyAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gbUhpZGxTZXNzaW9uXzNfNDsKKwogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZTsKIAogICAgICAgICBzdGQ6Om11dGV4IG1JbmZsaWdodExvY2s7CkBAIC00MDcsNyArNDQwLDcgQEAKIAogICAgIGNsYXNzIENhcHR1cmVSZXF1ZXN0IDogcHVibGljIExpZ2h0UmVmQmFzZTxDYXB0dXJlUmVxdWVzdD4gewogICAgICAgcHVibGljOgotICAgICAgICBDYW1lcmFNZXRhZGF0YSAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3M7CisgICAgICAgIFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NMaXN0ICAgICAgICAgIG1TZXR0aW5nc0xpc3Q7CiAgICAgICAgIHNwPGNhbWVyYTM6OkNhbWVyYTNTdHJlYW0+ICAgICAgICAgIG1JbnB1dFN0cmVhbTsKICAgICAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QgICAgICAgICAgICAgbUlucHV0QnVmZmVyOwogICAgICAgICBWZWN0b3I8c3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gPgpAQCAtNDI3LDI2ICs0NjAsMjggQEAKICAgICBzdGF0dXNfdCBjaGVja1N0YXR1c09rVG9DYXB0dXJlTG9ja2VkKCk7CiAKICAgICBzdGF0dXNfdCBjb252ZXJ0TWV0YWRhdGFMaXN0VG9SZXF1ZXN0TGlzdExvY2tlZCgKLSAgICAgICAgICAgIGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZtZXRhZGF0YUxpc3QsCisgICAgICAgICAgICBjb25zdCBMaXN0PGNvbnN0IFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NMaXN0PiAmbWV0YWRhdGFMaXN0LAogICAgICAgICAgICAgY29uc3Qgc3RkOjpsaXN0PGNvbnN0IFN1cmZhY2VNYXA+ICZzdXJmYWNlTWFwcywKICAgICAgICAgICAgIGJvb2wgcmVwZWF0aW5nLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgUmVxdWVzdExpc3QgKnJlcXVlc3RMaXN0KTsKIAotICAgIHZvaWQgY29udmVydFRvUmVxdWVzdExpc3QoTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4mIHJlcXVlc3RzLAorICAgIHZvaWQgY29udmVydFRvUmVxdWVzdExpc3QoTGlzdDxjb25zdCBQaHlzaWNhbENhbWVyYVNldHRpbmdzTGlzdD4mIHJlcXVlc3RzTGlzdCwKICAgICAgICAgICAgIHN0ZDo6bGlzdDxjb25zdCBTdXJmYWNlTWFwPiYgc3VyZmFjZU1hcHMsCiAgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgcmVxdWVzdCk7CiAKLSAgICBzdGF0dXNfdCBzdWJtaXRSZXF1ZXN0c0hlbHBlcihjb25zdCBMaXN0PGNvbnN0IENhbWVyYU1ldGFkYXRhPiAmcmVxdWVzdHMsCisgICAgc3RhdHVzX3Qgc3VibWl0UmVxdWVzdHNIZWxwZXIoY29uc3QgTGlzdDxjb25zdCBQaHlzaWNhbENhbWVyYVNldHRpbmdzTGlzdD4gJnJlcXVlc3RzTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8Y29uc3QgU3VyZmFjZU1hcD4gJnN1cmZhY2VNYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVwZWF0aW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOwogCiAKICAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VDYWxsYmFjaworICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6SUNhbWVyYURldmljZUNhbGxiYWNrCiAgICAgICovCi0KKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHByb2Nlc3NDYXB0dXJlUmVzdWx0XzNfNCgKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKKyAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgb3ZlcnJpZGU7CiAgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBwcm9jZXNzQ2FwdHVyZVJlc3VsdCgKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVzdWx0PiYgcmVzdWx0cykgb3ZlcnJpZGU7CkBAIC00NTYsNyArNDkxLDEzIEBACiAKICAgICAvLyBIYW5kbGUgb25lIGNhcHR1cmUgcmVzdWx0LiBBc3N1bWUgdGhhdCBtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrIGlzIGhlbGQuCiAgICAgdm9pZCBwcm9jZXNzT25lQ2FwdHVyZVJlc3VsdExvY2tlZCgKLSAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlc3VsdCYgcmVzdWx0cyk7CisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXN1bHQmIHJlc3VsdCwKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6UGh5c2ljYWxDYW1lcmFNZXRhZGF0YT4gcGh5c2ljYWxDYW1lcmFNZXRhZGF0YXMpOworICAgIHN0YXR1c190IHJlYWRPbmVDYW1lcmFNZXRhZGF0YUxvY2tlZCh1aW50NjRfdCBmbXFSZXN1bHRTaXplLAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYW1lcmFNZXRhZGF0YSYgcmVzdWx0TWV0YWRhdGEsCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhJiByZXN1bHQpOworCiAgICAgLy8gSGFuZGxlIG9uZSBub3RpZnkgbWVzc2FnZQogICAgIHZvaWQgbm90aWZ5KGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Tm90aWZ5TXNnJiBtc2cpOwogCkBAIC01MjIsMjEgKzU2Myw0MSBAQAogICAgICAqIERvIGNvbW1vbiB3b3JrIGZvciBzZXR0aW5nIHVwIGEgc3RyZWFtaW5nIG9yIHNpbmdsZSBjYXB0dXJlIHJlcXVlc3QuCiAgICAgICogT24gc3VjY2Vzcywgd2lsbCB0cmFuc2l0aW9uIHRvIEFDVElWRSBpZiBpbiBJRExFLgogICAgICAqLwotICAgIHNwPENhcHR1cmVSZXF1ZXN0PiBzZXRVcFJlcXVlc3RMb2NrZWQoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QsCisgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHNldFVwUmVxdWVzdExvY2tlZChjb25zdCBQaHlzaWNhbENhbWVyYVNldHRpbmdzTGlzdCAmcmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN1cmZhY2VNYXAgJnN1cmZhY2VNYXApOwogCiAgICAgLyoqCiAgICAgICogQnVpbGQgYSBDYXB0dXJlUmVxdWVzdCByZXF1ZXN0IGZyb20gdGhlIENhbWVyYURldmljZUJhc2UgcmVxdWVzdAogICAgICAqIHNldHRpbmdzLgogICAgICAqLwotICAgIHNwPENhcHR1cmVSZXF1ZXN0PiBjcmVhdGVDYXB0dXJlUmVxdWVzdChjb25zdCBDYW1lcmFNZXRhZGF0YSAmcmVxdWVzdCwKKyAgICBzcDxDYXB0dXJlUmVxdWVzdD4gY3JlYXRlQ2FwdHVyZVJlcXVlc3QoY29uc3QgUGh5c2ljYWxDYW1lcmFTZXR0aW5nc0xpc3QgJnJlcXVlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN1cmZhY2VNYXAgJnN1cmZhY2VNYXApOwogCiAgICAgLyoqCisgICAgICogUGF1c2Ugc3RhdGUgdXBkYXRlcyB0byB0aGUgY2xpZW50IGFwcGxpY2F0aW9uLiAgTmVlZGVkIHRvIG1hc2sgb3V0IGlkbGUvYWN0aXZlCisgICAgICogdHJhbnNpdGlvbnMgZHVyaW5nIGludGVybmFsIHJlY29uZmlndXJlCisgICAgICovCisgICAgdm9pZCBwYXVzZVN0YXRlTm90aWZ5KGJvb2wgZW5hYmxlKTsKKworICAgIC8qKgorICAgICAqIEludGVybmFsbHkgcmUtY29uZmlndXJlIGNhbWVyYSBkZXZpY2UgdXNpbmcgbmV3IHNlc3Npb24gcGFyYW1ldGVycy4KKyAgICAgKiBUaGlzIHdpbGwgZ2V0IHRyaWdnZXJlZCBieSB0aGUgcmVxdWVzdCB0aHJlYWQuIEJlIHN1cmUgdG8gY2FsbAorICAgICAqIHBhdXNlU3RhdGVOb3RpZnkodHJ1ZSkgYmVmb3JlIGdvaW5nIGlkbGUgaW4gdGhlIHJlcXVlc3RpbmcgbG9jYXRpb24uCisgICAgICovCisgICAgYm9vbCByZWNvbmZpZ3VyZUNhbWVyYShjb25zdCBDYW1lcmFNZXRhZGF0YSYgc2Vzc2lvblBhcmFtcyk7CisKKyAgICAvKioKKyAgICAgKiBGaWx0ZXIgc3RyZWFtIHNlc3Npb24gcGFyYW1ldGVycyBhbmQgY29uZmlndXJlIGNhbWVyYSBIQUwuCisgICAgICovCisgICAgc3RhdHVzX3QgZmlsdGVyUGFyYW1zQW5kQ29uZmlndXJlTG9ja2VkKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzZXNzaW9uUGFyYW1zLAorICAgICAgICAgICAgaW50IG9wZXJhdGluZ01vZGUpOworCisgICAgLyoqCiAgICAgICogVGFrZSB0aGUgY3VycmVudGx5LWRlZmluZWQgc2V0IG9mIHN0cmVhbXMgYW5kIGNvbmZpZ3VyZSB0aGUgSEFMIHRvIHVzZQogICAgICAqIHRoZW0uIFRoaXMgaXMgYSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9uIChtYXkgYmUgc2V2ZXJhbCBodW5kZXJlZCBtcykuCiAgICAgICovCi0gICAgc3RhdHVzX3QgICAgICAgICAgIGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoaW50IG9wZXJhdGluZ01vZGUpOworICAgIHN0YXR1c190ICAgICAgICAgICBjb25maWd1cmVTdHJlYW1zTG9ja2VkKGludCBvcGVyYXRpbmdNb2RlLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNlc3Npb25QYXJhbXMsIGJvb2wgbm90aWZ5UmVxdWVzdFRocmVhZCA9IHRydWUpOwogCiAgICAgLyoqCiAgICAgICogQ2FuY2VsIHN0cmVhbSBjb25maWd1cmF0aW9uIHRoYXQgZGlkIG5vdCBmaW5pc2ggc3VjY2Vzc2Z1bGx5LgpAQCAtNjM1LDcgKzY5Niw3IEBACiAKICAgICAgICAgUmVxdWVzdFRocmVhZCh3cDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQsCiAgICAgICAgICAgICAgICAgc3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciwKLSAgICAgICAgICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IGludGVyZmFjZSk7CisgICAgICAgICAgICAgICAgc3A8SGFsSW50ZXJmYWNlPiBpbnRlcmZhY2UsIGNvbnN0IFZlY3RvcjxpbnQzMl90PiYgc2Vzc2lvblBhcmFtS2V5cyk7CiAgICAgICAgIH5SZXF1ZXN0VGhyZWFkKCk7CiAKICAgICAgICAgdm9pZCAgICAgc2V0Tm90aWZpY2F0aW9uTGlzdGVuZXIod3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyKTsKQEAgLTY0Myw3ICs3MDQsOCBAQAogICAgICAgICAvKioKICAgICAgICAgICogQ2FsbCBhZnRlciBzdHJlYW0gKHJlKS1jb25maWd1cmF0aW9uIGlzIGNvbXBsZXRlZC4KICAgICAgICAgICovCi0gICAgICAgIHZvaWQgICAgIGNvbmZpZ3VyYXRpb25Db21wbGV0ZShib29sIGlzQ29uc3RyYWluZWRIaWdoU3BlZWQpOworICAgICAgICB2b2lkICAgICBjb25maWd1cmF0aW9uQ29tcGxldGUoYm9vbCBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkLAorICAgICAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzZXNzaW9uUGFyYW1zKTsKIAogICAgICAgICAvKioKICAgICAgICAgICogU2V0IG9yIGNsZWFyIHRoZSBsaXN0IG9mIHJlcGVhdGluZyByZXF1ZXN0cy4gRG9lcyBub3QgYmxvY2sKQEAgLTcxMSw2ICs3NzMsMTIgQEAKICAgICAgICAgICovCiAgICAgICAgIGJvb2wgaXNTdHJlYW1QZW5kaW5nKHNwPGNhbWVyYTM6OkNhbWVyYTNTdHJlYW1JbnRlcmZhY2U+JiBzdHJlYW0pOwogCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHN1cmZhY2UgaXMgYSB0YXJnZXQgb2YgYW55IHF1ZXVlZCBvciByZXBlYXRpbmcKKyAgICAgICAgICogY2FwdHVyZSByZXF1ZXN0CisgICAgICAgICAqLworICAgICAgICBib29sIGlzT3V0cHV0U3VyZmFjZVBlbmRpbmcoaW50IHN0cmVhbUlkLCBzaXplX3Qgc3VyZmFjZUlkKTsKKwogICAgICAgICAvLyBkdW1wIHByb2Nlc3NDYXB0dXJlUmVxdWVzdCBsYXRlbmN5CiAgICAgICAgIHZvaWQgZHVtcENhcHR1cmVSZXF1ZXN0TGF0ZW5jeShpbnQgZmQsIGNvbnN0IGNoYXIqIG5hbWUpIHsKICAgICAgICAgICAgIG1SZXF1ZXN0TGF0ZW5jeS5kdW1wKGZkLCBuYW1lKTsKQEAgLTc2NCw2ICs4MzIsMTAgQEAKICAgICAgICAgLy8gU3RvcCB0aGUgcmVwZWF0aW5nIHJlcXVlc3QgaWYgYW55IG9mIGl0cyBvdXRwdXQgc3RyZWFtcyBpcyBhYmFuZG9uZWQuCiAgICAgICAgIHZvaWQgY2hlY2tBbmRTdG9wUmVwZWF0aW5nUmVxdWVzdCgpOwogCisgICAgICAgIC8vIFJlbGVhc2UgcGh5c2ljYWwgY2FtZXJhIHNldHRpbmdzIGFuZCBjYW1lcmEgaWQgcmVzb3VyY2VzLgorICAgICAgICB2b2lkIGNsZWFudXBQaHlzaWNhbFNldHRpbmdzKHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0LAorICAgICAgICAgICAgICAgIC8qb3V0Ki9jYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90ICpoYWxSZXF1ZXN0KTsKKwogICAgICAgICAvLyBQYXVzZSBoYW5kbGluZwogICAgICAgICBib29sICAgICAgICAgICAgICAgd2FpdElmUGF1c2VkKCk7CiAgICAgICAgIHZvaWQgICAgICAgICAgICAgICB1bnBhdXNlRm9yTmV3UmVxdWVzdHMoKTsKQEAgLTc4Niw2ICs4NTgsMTIgQEAKICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBleHBlY3RlZCBtYXhpbXVtIGR1cmF0aW9uIGZvciBhIHJlcXVlc3QKICAgICAgICAgbnNlY3NfdCBjYWxjdWxhdGVNYXhFeHBlY3RlZER1cmF0aW9uKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyZXF1ZXN0KTsKIAorICAgICAgICAvLyBDaGVjayBhbmQgdXBkYXRlIGxhdGVzdCBzZXNzaW9uIHBhcmFtZXRlcnMgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVxdWVzdCBzZXR0aW5ncy4KKyAgICAgICAgYm9vbCB1cGRhdGVTZXNzaW9uUGFyYW1ldGVycyhjb25zdCBDYW1lcmFNZXRhZGF0YSYgc2V0dGluZ3MpOworCisgICAgICAgIC8vIFJlLWNvbmZpZ3VyZSBjYW1lcmEgdXNpbmcgdGhlIGxhdGVzdCBzZXNzaW9uIHBhcmFtZXRlcnMuCisgICAgICAgIGJvb2wgcmVjb25maWd1cmVDYW1lcmEoKTsKKwogICAgICAgICB3cDxDYW1lcmEzRGV2aWNlPiAgbVBhcmVudDsKICAgICAgICAgd3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gIG1TdGF0dXNUcmFja2VyOwogICAgICAgICBzcDxIYWxJbnRlcmZhY2U+ICAgbUludGVyZmFjZTsKQEAgLTg0Myw2ICs5MjEsOSBAQAogCiAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtSZXF1ZXN0TGF0ZW5jeUJpblNpemUgPSA0MDsgLy8gaW4gbXMKICAgICAgICAgQ2FtZXJhTGF0ZW5jeUhpc3RvZ3JhbSBtUmVxdWVzdExhdGVuY3k7CisKKyAgICAgICAgVmVjdG9yPGludDMyX3Q+ICAgIG1TZXNzaW9uUGFyYW1LZXlzOworICAgICAgICBDYW1lcmFNZXRhZGF0YSAgICAgbUxhdGVzdFNlc3Npb25QYXJhbXM7CiAgICAgfTsKICAgICBzcDxSZXF1ZXN0VGhyZWFkPiBtUmVxdWVzdFRocmVhZDsKIApAQCAtODk3LDYgKzk3OCwxMiBAQAogICAgICAgICAvLyBSRVFVRVNUL1JFU1VMVCBlcnJvci4KICAgICAgICAgYm9vbCBza2lwUmVzdWx0TWV0YWRhdGE7CiAKKyAgICAgICAgLy8gVGhlIHBoeXNpY2FsIGNhbWVyYSBpZHMgYmVpbmcgcmVxdWVzdGVkLgorICAgICAgICBzdGQ6OnNldDxTdHJpbmc4PiBwaHlzaWNhbENhbWVyYUlkczsKKworICAgICAgICAvLyBNYXAgb2YgcGh5c2ljYWxDYW1lcmFJZCA8LT4gTWV0YWRhdGEKKyAgICAgICAgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gcGh5c2ljYWxNZXRhZGF0YXM7CisKICAgICAgICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciBuZWVkZWQgYnkgS2V5ZWRWZWN0b3IKICAgICAgICAgSW5GbGlnaHRSZXF1ZXN0KCkgOgogICAgICAgICAgICAgICAgIHNodXR0ZXJUaW1lc3RhbXAoMCksCkBAIC05MTEsNyArOTk4LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIEluRmxpZ2h0UmVxdWVzdChpbnQgbnVtQnVmZmVycywgQ2FwdHVyZVJlc3VsdEV4dHJhcyBleHRyYXMsIGJvb2wgaGFzSW5wdXQsCi0gICAgICAgICAgICAgICAgYm9vbCBoYXNBcHBDYWxsYmFjaywgbnNlY3NfdCBtYXhEdXJhdGlvbikgOgorICAgICAgICAgICAgICAgIGJvb2wgaGFzQXBwQ2FsbGJhY2ssIG5zZWNzX3QgbWF4RHVyYXRpb24sCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8U3RyaW5nOD4mIHBoeXNpY2FsQ2FtZXJhSWRTZXQpIDoKICAgICAgICAgICAgICAgICBzaHV0dGVyVGltZXN0YW1wKDApLAogICAgICAgICAgICAgICAgIHNlbnNvclRpbWVzdGFtcCgwKSwKICAgICAgICAgICAgICAgICByZXF1ZXN0U3RhdHVzKE9LKSwKQEAgLTkyMSw3ICsxMDA5LDggQEAKICAgICAgICAgICAgICAgICBoYXNJbnB1dEJ1ZmZlcihoYXNJbnB1dCksCiAgICAgICAgICAgICAgICAgaGFzQ2FsbGJhY2soaGFzQXBwQ2FsbGJhY2spLAogICAgICAgICAgICAgICAgIG1heEV4cGVjdGVkRHVyYXRpb24obWF4RHVyYXRpb24pLAotICAgICAgICAgICAgICAgIHNraXBSZXN1bHRNZXRhZGF0YShmYWxzZSkgeworICAgICAgICAgICAgICAgIHNraXBSZXN1bHRNZXRhZGF0YShmYWxzZSksCisgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZHMocGh5c2ljYWxDYW1lcmFJZFNldCkgewogICAgICAgICB9CiAgICAgfTsKIApAQCAtOTM4LDcgKzEwMjcsNyBAQAogCiAgICAgc3RhdHVzX3QgcmVnaXN0ZXJJbkZsaWdodCh1aW50MzJfdCBmcmFtZU51bWJlciwKICAgICAgICAgICAgIGludDMyX3QgbnVtQnVmZmVycywgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXMsIGJvb2wgaGFzSW5wdXQsCi0gICAgICAgICAgICBib29sIGNhbGxiYWNrLCBuc2Vjc190IG1heEV4cGVjdGVkRHVyYXRpb24pOworICAgICAgICAgICAgYm9vbCBjYWxsYmFjaywgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uLCBzdGQ6OnNldDxTdHJpbmc4PiYgcGh5c2ljYWxDYW1lcmFJZHMpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBleHBlY3RlZCB0aW1lIGl0J2xsIHRha2UgZm9yIGFsbCBjdXJyZW50bHkgaW4tZmxpZ2h0CkBAIC05ODAsMjEgKzEwNjksMzQgQEAKICAgICAgICAgICovCiAgICAgICAgIHN0YXR1c190IGNsZWFyKCk7CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBhdXNlIGFsbCBwcmVwYXJhdGlvbiBhY3Rpdml0aWVzCisgICAgICAgICAqLworICAgICAgICB2b2lkIHBhdXNlKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc3VtZSBwcmVwYXJhdGlvbiBhY3Rpdml0aWVzCisgICAgICAgICAqLworICAgICAgICBzdGF0dXNfdCByZXN1bWUoKTsKKwogICAgICAgcHJpdmF0ZToKICAgICAgICAgTXV0ZXggbUxvY2s7CisgICAgICAgIENvbmRpdGlvbiBtVGhyZWFkQWN0aXZlU2lnbmFsOwogCiAgICAgICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCk7CiAKICAgICAgICAgLy8gR3VhcmRlZCBieSBtTG9jawogCiAgICAgICAgIHdwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBtTGlzdGVuZXI7Ci0gICAgICAgIExpc3Q8c3A8Y2FtZXJhMzo6Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gPiBtUGVuZGluZ1N0cmVhbXM7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIHNwPGNhbWVyYTM6OkNhbWVyYTNTdHJlYW1JbnRlcmZhY2U+ID4gbVBlbmRpbmdTdHJlYW1zOwogICAgICAgICBib29sIG1BY3RpdmU7CiAgICAgICAgIGJvb2wgbUNhbmNlbE5vdzsKIAogICAgICAgICAvLyBPbmx5IGFjY2Vzc2VkIGJ5IHRocmVhZExvb3AgYW5kIHRoZSBkZXN0cnVjdG9yCiAKICAgICAgICAgc3A8Y2FtZXJhMzo6Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gbUN1cnJlbnRTdHJlYW07CisgICAgICAgIGludCBtQ3VycmVudE1heENvdW50OworICAgICAgICBib29sIG1DdXJyZW50UHJlcGFyZUNvbXBsZXRlOwogICAgIH07CiAgICAgc3A8UHJlcGFyZXJUaHJlYWQ+IG1QcmVwYXJlclRocmVhZDsKIApAQCAtMTA0Niw3ICsxMTQ4LDkgQEAKICAgICB2b2lkIHNlbmRDYXB0dXJlUmVzdWx0KENhbWVyYU1ldGFkYXRhICZwZW5kaW5nTWV0YWRhdGEsCiAgICAgICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzICZyZXN1bHRFeHRyYXMsCiAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSAmY29sbGVjdGVkUGFydGlhbFJlc3VsdCwgdWludDMyX3QgZnJhbWVOdW1iZXIsCi0gICAgICAgICAgICBib29sIHJlcHJvY2Vzcyk7CisgICAgICAgICAgICBib29sIHJlcHJvY2VzcywgY29uc3Qgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4mIHBoeXNpY2FsTWV0YWRhdGFzKTsKKworICAgIGJvb2wgaXNMYXN0RnVsbFJlc3VsdChjb25zdCBJbkZsaWdodFJlcXVlc3QmIGluRmxpZ2h0UmVxdWVzdCk7CiAKICAgICAvLyBJbnNlcnQgdGhlIHJlc3VsdCB0byB0aGUgcmVzdWx0IHF1ZXVlIGFmdGVyIHVwZGF0aW5nIGZyYW1lIG51bWJlciBhbmQgb3ZlcnJpZGluZyBBRQogICAgIC8vIHRyaWdnZXIgY2FuY2VsLgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwCmluZGV4IDg0ZmI4OTAuLmZiMWZmNzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTI2LDkgKzI2LDEyIEBACiAKIG5hbWVzcGFjZSBjYW1lcmEzIHsKIAorY29uc3QgU3RyaW5nOCBDYW1lcmEzRHVtbXlTdHJlYW06OkRVTU1ZX0lEOworCiBDYW1lcmEzRHVtbXlTdHJlYW06OkNhbWVyYTNEdW1teVN0cmVhbShpbnQgaWQpIDoKICAgICAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpZCwgQ0FNRVJBM19TVFJFQU1fT1VUUFVULCBEVU1NWV9XSURUSCwgRFVNTVlfSEVJR0hULAotICAgICAgICAgICAgICAgIC8qbWF4U2l6ZSovMCwgRFVNTVlfRk9STUFULCBEVU1NWV9EQVRBU1BBQ0UsIERVTU1ZX1JPVEFUSU9OKSB7CisgICAgICAgICAgICAgICAgLyptYXhTaXplKi8wLCBEVU1NWV9GT1JNQVQsIERVTU1ZX0RBVEFTUEFDRSwgRFVNTVlfUk9UQVRJT04sCisgICAgICAgICAgICAgICAgRFVNTVlfSUQpIHsKIAogfQogCkBAIC0xMTIsMTEgKzExNSwyNCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorY29uc3QgU3RyaW5nOCYgQ2FtZXJhM0R1bW15U3RyZWFtOjpnZXRQaHlzaWNhbENhbWVyYUlkKCkgY29uc3QgeworICAgIHJldHVybiBEVU1NWV9JRDsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM0R1bW15U3RyZWFtOjpzZXRDb25zdW1lcnMoY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiAvKmNvbnN1bWVycyovKSB7CiAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IER1bW15IHN0cmVhbSBkb2Vzbid0IHN1cHBvcnQgc2V0IGNvbnN1bWVyIHN1cmZhY2UhIiwKICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkKTsKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CisKK3N0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6dXBkYXRlU3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiAmLypvdXRwdXRTdXJmYWNlcyovLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8T3V0cHV0U3RyZWFtSW5mbz4gJi8qb3V0cHV0SW5mbyovLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiAmLypyZW1vdmVkU3VyZmFjZUlkcyovLAorICAgICAgICAgICAgS2V5ZWRWZWN0b3I8c3A8U3VyZmFjZT4sIHNpemVfdD4gKiAvKm91dHB1dE1hcCovKSB7CisgICAgQUxPR0UoIiVzOiB0aGlzIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkISIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCiB9OyAvLyBuYW1lc3BhY2UgY2FtZXJhMwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmgKaW5kZXggOTcxMDc2NS4uNDYyNzU0OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC02Myw2ICs2MywxMSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJvcEJ1ZmZlcnMoYm9vbCAvKmRyb3BwaW5nKi8pIG92ZXJyaWRlOwogCiAgICAgLyoqCisgICAgICogUXVlcnkgdGhlIHBoeXNpY2FsIGNhbWVyYSBpZCBmb3IgdGhlIG91dHB1dCBzdHJlYW0uCisgICAgICovCisgICAgdmlydHVhbCBjb25zdCBTdHJpbmc4JiBnZXRQaHlzaWNhbENhbWVyYUlkKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvKioKICAgICAgKiBSZXR1cm4gaWYgdGhpcyBvdXRwdXQgc3RyZWFtIGlzIGZvciB2aWRlbyBlbmNvZGluZy4KICAgICAgKi8KICAgICBib29sIGlzVmlkZW9TdHJlYW0oKSBjb25zdDsKQEAgLTc3LDYgKzgyLDE5IEBACiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDb25zdW1lcnMoY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBjb25zdW1lcnMpOwogCisgICAgLyoqCisgICAgICogUXVlcnkgdGhlIG91dHB1dCBzdXJmYWNlIGlkLgorICAgICAqLworICAgIHZpcnR1YWwgc3NpemVfdCBnZXRTdXJmYWNlSWQoY29uc3Qgc3A8U3VyZmFjZT4gJi8qc3VyZmFjZSovKSB7IHJldHVybiAwOyB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGUgdGhlIHN0cmVhbSBvdXRwdXQgc3VyZmFjZXMuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCB1cGRhdGVTdHJlYW0oY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+ICZvdXRwdXRTdXJmYWNlcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE91dHB1dFN0cmVhbUluZm8+ICZvdXRwdXRJbmZvLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiAmcmVtb3ZlZFN1cmZhY2VJZHMsCisgICAgICAgICAgICBLZXllZFZlY3RvcjxzcDxTdXJmYWNlPiwgc2l6ZV90PiAqb3V0cHV0TWFwLypvdXQqLyk7CisKICAgcHJvdGVjdGVkOgogCiAgICAgLyoqCkBAIC0xMDEsNiArMTE5LDcgQEAKICAgICBzdGF0aWMgY29uc3QgYW5kcm9pZF9kYXRhc3BhY2UgRFVNTVlfREFUQVNQQUNFID0gSEFMX0RBVEFTUEFDRV9VTktOT1dOOwogICAgIHN0YXRpYyBjb25zdCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IERVTU1ZX1JPVEFUSU9OID0gQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMDsKICAgICBzdGF0aWMgY29uc3QgdWludDY0X3QgRFVNTVlfVVNBR0UgPSBHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSOworICAgIHN0YXRpYyBjb25zdCBTdHJpbmc4IERVTU1ZX0lEOwogCiAgICAgLyoqCiAgICAgICogSW50ZXJuYWwgQ2FtZXJhM1N0cmVhbSBpbnRlcmZhY2UKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwCmluZGV4IGE1MjQyMmQuLjNjMWU0M2QgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMzEsOSArMzEsMTEgQEAKIAogQ2FtZXJhM0lPU3RyZWFtQmFzZTo6Q2FtZXJhM0lPU3RyZWFtQmFzZShpbnQgaWQsIGNhbWVyYTNfc3RyZWFtX3R5cGVfdCB0eXBlLAogICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBzaXplX3QgbWF4U2l6ZSwgaW50IGZvcm1hdCwKLSAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgc2V0SWQpIDoKKyAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAorICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLCBpbnQgc2V0SWQpIDoKICAgICAgICAgQ2FtZXJhM1N0cmVhbShpZCwgdHlwZSwKLSAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBtYXhTaXplLCBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sIHNldElkKSwKKyAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBtYXhTaXplLCBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sCisgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCwgc2V0SWQpLAogICAgICAgICBtVG90YWxCdWZmZXJDb3VudCgwKSwKICAgICAgICAgbUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50KDApLAogICAgICAgICBtSGFuZG91dE91dHB1dEJ1ZmZlckNvdW50KDApLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaAppbmRleCAyMzc2MDU4Li4wYTMxZDQ0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMzUsNiArMzUsNyBAQAogICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaW50IGlkLCBjYW1lcmEzX3N0cmVhbV90eXBlX3QgdHlwZSwKICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHNpemVfdCBtYXhTaXplLCBpbnQgZm9ybWF0LAogICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKICAgICAgICAgICAgIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElEKTsKIAogICBwdWJsaWM6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKaW5kZXggMmNiMWVhNy4uMDE3ZDdiZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMjcsMTAgKzI3LDEzIEBACiAKIG5hbWVzcGFjZSBjYW1lcmEzIHsKIAorY29uc3QgU3RyaW5nOCBDYW1lcmEzSW5wdXRTdHJlYW06OkRVTU1ZX0lEOworCiBDYW1lcmEzSW5wdXRTdHJlYW06OkNhbWVyYTNJbnB1dFN0cmVhbShpbnQgaWQsCiAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQpIDoKICAgICAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpZCwgQ0FNRVJBM19TVFJFQU1fSU5QVVQsIHdpZHRoLCBoZWlnaHQsIC8qbWF4U2l6ZSovMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiwgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgSEFMX0RBVEFTUEFDRV9VTktOT1dOLCBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERVTU1ZX0lEKSB7CiAKICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgewogICAgICAgICBBTE9HRSgiJXM6IEJhZCBmb3JtYXQsIEJMT0Igbm90IHN1cHBvcnRlZCIsIF9fRlVOQ1RJT05fXyk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaAppbmRleCA4MTIyNmY4Li4wNzMyNDY0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxMy0yMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTUzLDYgKzUzLDggQEAKICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtUHJvZHVjZXI7CiAgICAgVmVjdG9yPEJ1ZmZlckl0ZW0+IG1CdWZmZXJzSW5GbGlnaHQ7CiAKKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nOCBEVU1NWV9JRDsKKwogICAgIC8qKgogICAgICAqIENhbWVyYTNJT1N0cmVhbUJhc2UKICAgICAgKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwCmluZGV4IDg0NjBjMzQuLmIzYzM3MTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMzUsOSArMzUsMTEgQEAKICAgICAgICAgc3A8U3VyZmFjZT4gY29uc3VtZXIsCiAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCiAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwKLSAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsIGludCBzZXRJZCkgOgorICAgICAgICBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgaW50IHNldElkKSA6CiAgICAgICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaWQsIENBTUVSQTNfU1RSRUFNX09VVFBVVCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1heFNpemUqLzAsIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwgc2V0SWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWF4U2l6ZSovMCwgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQsIHNldElkKSwKICAgICAgICAgbUNvbnN1bWVyKGNvbnN1bWVyKSwKICAgICAgICAgbVRyYW5zZm9ybSgwKSwKICAgICAgICAgbVRyYWNlRmlyc3RCdWZmZXIodHJ1ZSksCkBAIC02MSw5ICs2Myw5IEBACiAgICAgICAgIHNwPFN1cmZhY2U+IGNvbnN1bWVyLAogICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBzaXplX3QgbWF4U2l6ZSwgaW50IGZvcm1hdCwKICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAotICAgICAgICBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwgaW50IHNldElkKSA6CisgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLCBpbnQgc2V0SWQpIDoKICAgICAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpZCwgQ0FNRVJBM19TVFJFQU1fT1VUUFVULCB3aWR0aCwgaGVpZ2h0LCBtYXhTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwgc2V0SWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwgcGh5c2ljYWxDYW1lcmFJZCwgc2V0SWQpLAogICAgICAgICBtQ29uc3VtZXIoY29uc3VtZXIpLAogICAgICAgICBtVHJhbnNmb3JtKDApLAogICAgICAgICBtVHJhY2VGaXJzdEJ1ZmZlcih0cnVlKSwKQEAgLTkzLDkgKzk1LDExIEBACiBDYW1lcmEzT3V0cHV0U3RyZWFtOjpDYW1lcmEzT3V0cHV0U3RyZWFtKGludCBpZCwKICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLAotICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwgaW50IHNldElkKSA6CisgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LAorICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLCBpbnQgc2V0SWQpIDoKICAgICAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpZCwgQ0FNRVJBM19TVFJFQU1fT1VUUFVULCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWF4U2l6ZSovMCwgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLCBzZXRJZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXhTaXplKi8wLCBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCwgc2V0SWQpLAogICAgICAgICBtQ29uc3VtZXIobnVsbHB0ciksCiAgICAgICAgIG1UcmFuc2Zvcm0oMCksCiAgICAgICAgIG1UcmFjZUZpcnN0QnVmZmVyKHRydWUpLApAQCAtMTMxLDExICsxMzUsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNldElkKSA6CiAgICAgICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaWQsIHR5cGUsIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXhTaXplKi8wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwgc2V0SWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkLCBzZXRJZCksCiAgICAgICAgIG1UcmFuc2Zvcm0oMCksCiAgICAgICAgIG1UcmFjZUZpcnN0QnVmZmVyKHRydWUpLAogICAgICAgICBtVXNlTW9ub1RpbWVzdGFtcChmYWxzZSksCkBAIC03MDAsNiArNzA2LDE0IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjp1cGRhdGVTdHJlYW0oY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+ICYvKm91dHB1dFN1cmZhY2VzKi8sCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW1JbmZvPiAmLypvdXRwdXRJbmZvKi8sCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+ICYvKnJlbW92ZWRTdXJmYWNlSWRzKi8sCisgICAgICAgICAgICBLZXllZFZlY3RvcjxzcDxTdXJmYWNlPiwgc2l6ZV90PiAqIC8qb3V0cHV0TWFwbyovKSB7CisgICAgQUxPR0UoIiVzOiB0aGlzIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkISIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCiB2b2lkIENhbWVyYTNPdXRwdXRTdHJlYW06OkJ1ZmZlclJlbGVhc2VkTGlzdGVuZXI6Om9uQnVmZmVyUmVsZWFzZWQoKSB7CiAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbT4gc3RyZWFtID0gbVBhcmVudC5wcm9tb3RlKCk7CiAgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CkBAIC03MzcsNyArNzUxLDcgQEAKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8R3JhcGhpY0J1ZmZlcj4+JiByZW1vdmVkQnVmZmVycykgewogICAgIHNwPENhbWVyYTNTdHJlYW1CdWZmZXJGcmVlZExpc3RlbmVyPiBjYWxsYmFjayA9IG1CdWZmZXJGcmVlZExpc3RlbmVyLnByb21vdGUoKTsKICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbHB0cikgewotICAgICAgICBmb3IgKGF1dG8gZ2IgOiByZW1vdmVkQnVmZmVycykgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGdiIDogcmVtb3ZlZEJ1ZmZlcnMpIHsKICAgICAgICAgICAgIGNhbGxiYWNrLT5vbkJ1ZmZlckZyZWVkKG1JZCwgZ2ItPmhhbmRsZSk7CiAgICAgICAgIH0KICAgICB9CkBAIC03OTIsNiArODA2LDExIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitjb25zdCBTdHJpbmc4JiBDYW1lcmEzT3V0cHV0U3RyZWFtOjpnZXRQaHlzaWNhbENhbWVyYUlkKCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICByZXR1cm4gcGh5c2ljYWxDYW1lcmFJZCgpOworfQorCiBzdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpub3RpZnlCdWZmZXJSZWxlYXNlZChBTmF0aXZlV2luZG93QnVmZmVyKiAvKmFud0J1ZmZlciovKSB7CiAgICAgcmV0dXJuIE9LOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaAppbmRleCA0ODY1YmU3Li42ZjM2ZjkyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtODIsNyArODIsOCBAQAogICAgIENhbWVyYTNPdXRwdXRTdHJlYW0oaW50IGlkLCBzcDxTdXJmYWNlPiBjb25zdW1lciwKICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCiAgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCi0gICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQpOworICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICBpbnQgc2V0SWQgPSBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCk7CiAKICAgICAvKioKICAgICAgKiBTZXQgdXAgYSBzdHJlYW0gZm9yIGZvcm1hdHMgdGhhdCBoYXZlIGEgdmFyaWFibGUgYnVmZmVyIHNpemUgZm9yIHRoZSBzYW1lCkBAIC05Myw3ICs5NCw4IEBACiAgICAgQ2FtZXJhM091dHB1dFN0cmVhbShpbnQgaWQsIHNwPFN1cmZhY2U+IGNvbnN1bWVyLAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgc2l6ZV90IG1heFNpemUsIGludCBmb3JtYXQsCiAgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCi0gICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQpOworICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICBpbnQgc2V0SWQgPSBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCk7CiAKICAgICAvKioKICAgICAgKiBTZXQgdXAgYSBzdHJlYW0gd2l0aCBkZWZlcnJlZCBjb25zdW1lciBmb3IgZm9ybWF0cyB0aGF0IGhhdmUgMiBkaW1lbnNpb25zLCBzdWNoIGFzCkBAIC0xMDMsNiArMTA1LDcgQEAKICAgICBDYW1lcmEzT3V0cHV0U3RyZWFtKGludCBpZCwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKICAgICAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwKICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKICAgICAgICAgICAgIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElEKTsKIAogICAgIHZpcnR1YWwgfkNhbWVyYTNPdXRwdXRTdHJlYW0oKTsKQEAgLTE3MSwxNiArMTc0LDM1IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBkcm9wQnVmZmVycyhib29sIGRyb3BwaW5nKSBvdmVycmlkZTsKIAogICAgIC8qKgorICAgICAqIFF1ZXJ5IHRoZSBwaHlzaWNhbCBjYW1lcmEgaWQgZm9yIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAqLworICAgIHZpcnR1YWwgY29uc3QgU3RyaW5nOCYgZ2V0UGh5c2ljYWxDYW1lcmFJZCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLyoqCiAgICAgICogU2V0IHRoZSBncmFwaGljIGJ1ZmZlciBtYW5hZ2VyIHRvIGdldC9yZXR1cm4gdGhlIHN0cmVhbSBidWZmZXJzLgogICAgICAqCiAgICAgICogSXQgaXMgb25seSBsZWdhbCB0byBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gc3RyZWFtIGlzIGluIFNUQVRFX0NPTlNUUlVDVEVEIHN0YXRlLgogICAgICAqLwogICAgIHN0YXR1c190IHNldEJ1ZmZlck1hbmFnZXIoc3A8Q2FtZXJhM0J1ZmZlck1hbmFnZXI+IGJ1ZmZlck1hbmFnZXIpOwogCisgICAgLyoqCisgICAgICogUXVlcnkgdGhlIG91cHV0IHN1cmZhY2UgaWQuCisgICAgICovCisgICAgdmlydHVhbCBzc2l6ZV90IGdldFN1cmZhY2VJZChjb25zdCBzcDxTdXJmYWNlPiAmLypzdXJmYWNlKi8pIHsgcmV0dXJuIDA7IH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZSB0aGUgc3RyZWFtIG91dHB1dCBzdXJmYWNlcy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHVwZGF0ZVN0cmVhbShjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4gJm91dHB1dFN1cmZhY2VzLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8T3V0cHV0U3RyZWFtSW5mbz4gJm91dHB1dEluZm8sCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+ICZyZW1vdmVkU3VyZmFjZUlkcywKKyAgICAgICAgICAgIEtleWVkVmVjdG9yPHNwPFN1cmZhY2U+LCBzaXplX3Q+ICpvdXRwdXRNYXAvKm91dCovKTsKKwogICBwcm90ZWN0ZWQ6CiAgICAgQ2FtZXJhM091dHB1dFN0cmVhbShpbnQgaWQsIGNhbWVyYTNfc3RyZWFtX3R5cGVfdCB0eXBlLAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKICAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCiAgICAgICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlID0gMCwgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQgPSAwLAogICAgICAgICAgICAgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZS5oCmluZGV4IDE3MTlkNzQuLmE3MTFhNmQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZS5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkEzX09VVFBVVF9TVFJFQU1fSU5URVJGQUNFX0gKIAogI2luY2x1ZGUgIkNhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaCIKKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTYxLDkgKzYyLDI3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZXRhY2hCdWZmZXIoc3A8R3JhcGhpY0J1ZmZlcj4qIGJ1ZmZlciwgaW50KiBmZW5jZUZkKSA9IDA7CiAKICAgICAvKioKKyAgICAgKiBRdWVyeSB0aGUgc3VyZmFjZSBpZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0U3VyZmFjZUlkKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGUgdGhlIHN0cmVhbSBvdXRwdXQgc3VyZmFjZXMuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCB1cGRhdGVTdHJlYW0oY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+ICZvdXRwdXRTdXJmYWNlcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE91dHB1dFN0cmVhbUluZm8+ICZvdXRwdXRJbmZvLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiAmcmVtb3ZlZFN1cmZhY2VJZHMsCisgICAgICAgICAgICBLZXllZFZlY3RvcjxzcDxTdXJmYWNlPiwgc2l6ZV90PiAqb3V0cHV0TWFwLypvdXQqLykgPSAwOworCisgICAgLyoqCiAgICAgICogRHJvcCBidWZmZXJzIGlmIGRyb3BwaW5nIGlzIHRydWUuIElmIGRyb3BwaW5nIGlzIGZhbHNlLCBkbyBub3QgZHJvcCBidWZmZXJzLgogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJvcEJ1ZmZlcnMoYm9vbCAvKmRyb3BwaW5nKi8pID0gMDsKKworICAgIC8qKgorICAgICAqIFF1ZXJ5IHRoZSBwaHlzaWNhbCBjYW1lcmEgaWQgZm9yIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAqLworICAgIHZpcnR1YWwgY29uc3QgU3RyaW5nOCYgZ2V0UGh5c2ljYWxDYW1lcmFJZCgpIGNvbnN0ID0gMDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNhbWVyYTMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwCmluZGV4IDUwNTE3MTEuLjJiYjlmZjcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDE2LTIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMjAsMTYgKzIwLDI1IEBACiAKIG5hbWVzcGFjZSBjYW1lcmEzIHsKIAorY29uc3Qgc2l6ZV90IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OmtNYXhPdXRwdXRzOworCiBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtKGludCBpZCwKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBzdXJmYWNlcywKICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLAogICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAotICAgICAgICBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwgaW50IHNldElkKSA6CisgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICBpbnQgc2V0SWQpIDoKICAgICAgICAgQ2FtZXJhM091dHB1dFN0cmVhbShpZCwgQ0FNRVJBM19TVFJFQU1fT1VUUFVULCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwgY29uc3VtZXJVc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBPZmZzZXQsIHNldElkKSwKLSAgICAgICAgbVN1cmZhY2VzKHN1cmZhY2VzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLCBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyVXNhZ2UsIHRpbWVzdGFtcE9mZnNldCwgc2V0SWQpIHsKKyAgICBzaXplX3QgY29uc3VtZXJDb3VudCA9IHN0ZDo6bWluKHN1cmZhY2VzLnNpemUoKSwga01heE91dHB1dHMpOworICAgIGlmIChzdXJmYWNlcy5zaXplKCkgPiBjb25zdW1lckNvdW50KSB7CisgICAgICAgIEFMT0dFKCIlczogVHJ5aW5nIHRvIGFkZCBtb3JlIGNvbnN1bWVycyB0aGFuIHRoZSBtYXhpbXVtICIsIF9fZnVuY19fKTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb25zdW1lckNvdW50OyBpKyspIHsKKyAgICAgICAgbVN1cmZhY2VzW2ldID0gc3VyZmFjZXNbaV07CisgICAgfQogfQogCiBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjp+Q2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbSgpIHsKQEAgLTQ0LDcgKzUzLDE2IEBACiAgICAgdWludDY0X3QgdXNhZ2U7CiAgICAgZ2V0RW5kcG9pbnRVc2FnZSgmdXNhZ2UpOwogCi0gICAgcmVzID0gbVN0cmVhbVNwbGl0dGVyLT5jb25uZWN0KG1TdXJmYWNlcywgdXNhZ2UsIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycywgJm1Db25zdW1lcik7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHNpemVfdCwgc3A8U3VyZmFjZT4+IGluaXRpYWxTdXJmYWNlczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhPdXRwdXRzOyBpKyspIHsKKyAgICAgICAgaWYgKG1TdXJmYWNlc1tpXSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpbml0aWFsU3VyZmFjZXMuZW1wbGFjZShpLCBtU3VyZmFjZXNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgYW5kcm9pZDo6UGl4ZWxGb3JtYXQgZm9ybWF0ID0gaXNGb3JtYXRPdmVycmlkZGVuKCkgPyBnZXRPcmlnaW5hbEZvcm1hdCgpIDogZ2V0Rm9ybWF0KCk7CisgICAgcmVzID0gbVN0cmVhbVNwbGl0dGVyLT5jb25uZWN0KGluaXRpYWxTdXJmYWNlcywgdXNhZ2UsIG1Vc2FnZSwgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzLAorICAgICAgICAgICAgZ2V0V2lkdGgoKSwgZ2V0SGVpZ2h0KCksIGZvcm1hdCwgJm1Db25zdW1lcik7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjb25uZWN0IHRvIHN0cmVhbSBzcGxpdHRlcjogJXMoJWQpIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtNjgsNyArODYsMTEgQEAKIAogYm9vbCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjppc0NvbnN1bWVyQ29uZmlndXJhdGlvbkRlZmVycmVkKHNpemVfdCBzdXJmYWNlX2lkKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwotICAgIHJldHVybiAoc3VyZmFjZV9pZCA+PSBtU3VyZmFjZXMuc2l6ZSgpKTsKKyAgICBpZiAoc3VyZmFjZV9pZCA+PSBrTWF4T3V0cHV0cykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gKG1TdXJmYWNlc1tzdXJmYWNlX2lkXSA9PSBudWxscHRyKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6c2V0Q29uc3VtZXJzKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgc3VyZmFjZXMpIHsKQEAgLTg1LDExICsxMDcsMTcgQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogCi0gICAgICAgIG1TdXJmYWNlcy5wdXNoX2JhY2soc3VyZmFjZSk7CisgICAgICAgIHNzaXplX3QgaWQgPSBnZXROZXh0U3VyZmFjZUlkTG9ja2VkKCk7CisgICAgICAgIGlmIChpZCA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogTm8gc3VyZmFjZSBpZHMgYXZhaWxhYmxlISIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKworICAgICAgICBtU3VyZmFjZXNbaWRdID0gc3VyZmFjZTsKIAogICAgICAgICAvLyBPbmx5IGNhbGwgYWRkT3V0cHV0IGlmIHRoZSBzcGxpdHRlciBoYXMgYmVlbiBjb25uZWN0ZWQuCiAgICAgICAgIGlmIChtU3RyZWFtU3BsaXR0ZXIgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0ID0gbVN0cmVhbVNwbGl0dGVyLT5hZGRPdXRwdXQoc3VyZmFjZSk7CisgICAgICAgICAgICByZXQgPSBtU3RyZWFtU3BsaXR0ZXItPmFkZE91dHB1dChpZCwgc3VyZmFjZSk7CiAgICAgICAgICAgICBpZiAocmV0ICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBhZGRPdXRwdXQgZmFpbGVkIHdpdGggZXJyb3IgY29kZSAlZCIsIF9fRlVOQ1RJT05fXywgcmV0KTsKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwpAQCAtMjAwLDkgKzIyOCw5IEBACiAgICAgICAgIC8vIENhbGxlZCBiZWZvcmUgc2hhcmVkIGJ1ZmZlciBxdWV1ZSBpcyBjb25zdHJ1Y3RlZC4KICAgICAgICAgKnVzYWdlID0gZ2V0UHJlc2V0Q29uc3VtZXJVc2FnZSgpOwogCi0gICAgICAgIGZvciAoYXV0byBzdXJmYWNlIDogbVN1cmZhY2VzKSB7Ci0gICAgICAgICAgICBpZiAoc3VyZmFjZSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgcmVzID0gZ2V0RW5kcG9pbnRVc2FnZUZvclN1cmZhY2UoJnUsIHN1cmZhY2UpOworICAgICAgICBmb3IgKHNpemVfdCBpZCA9IDA7IGlkIDwga01heE91dHB1dHM7IGlkKyspIHsKKyAgICAgICAgICAgIGlmIChtU3VyZmFjZXNbaWRdICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICByZXMgPSBnZXRFbmRwb2ludFVzYWdlRm9yU3VyZmFjZSgmdSwgbVN1cmZhY2VzW2lkXSk7CiAgICAgICAgICAgICAgICAgKnVzYWdlIHw9IHU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIxNSw2ICsyNDMsMTQwIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAorc3NpemVfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpnZXROZXh0U3VyZmFjZUlkTG9ja2VkKCkgeworICAgIHNzaXplX3QgaWQgPSAtMTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhPdXRwdXRzOyBpKyspIHsKKyAgICAgICAgaWYgKG1TdXJmYWNlc1tpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBpZCA9IGk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBpZDsKK30KKworc3NpemVfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpnZXRTdXJmYWNlSWQoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgc3NpemVfdCBpZCA9IC0xOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heE91dHB1dHM7IGkrKykgeworICAgICAgICBpZiAobVN1cmZhY2VzW2ldID09IHN1cmZhY2UpIHsKKyAgICAgICAgICAgIGlkID0gaTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGlkOworfQorCitzdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpyZXZlcnRQYXJ0aWFsVXBkYXRlTG9ja2VkKAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxzcDxTdXJmYWNlPiwgc2l6ZV90PiAmcmVtb3ZlZFN1cmZhY2VzLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxzcDxTdXJmYWNlPiwgc2l6ZV90PiAmYXR0YWNoZWRTdXJmYWNlcykgeworICAgIHN0YXR1c190IHJldCA9IE9LOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdHRhY2hlZFN1cmZhY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNpemVfdCBpbmRleCA9IGF0dGFjaGVkU3VyZmFjZXMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKG1TdHJlYW1TcGxpdHRlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXQgPSBtU3RyZWFtU3BsaXR0ZXItPnJlbW92ZU91dHB1dChpbmRleCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVN1cmZhY2VzW2luZGV4XSA9IG51bGxwdHI7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZW1vdmVkU3VyZmFjZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc2l6ZV90IGluZGV4ID0gcmVtb3ZlZFN1cmZhY2VzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChtU3RyZWFtU3BsaXR0ZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0ID0gbVN0cmVhbVNwbGl0dGVyLT5hZGRPdXRwdXQoaW5kZXgsIHJlbW92ZWRTdXJmYWNlcy5rZXlBdChpKSk7CisgICAgICAgICAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVN1cmZhY2VzW2luZGV4XSA9IHJlbW92ZWRTdXJmYWNlcy5rZXlBdChpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjp1cGRhdGVTdHJlYW0oY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+ICZvdXRwdXRTdXJmYWNlcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8T3V0cHV0U3RyZWFtSW5mbz4gJm91dHB1dEluZm8sCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4gJnJlbW92ZWRTdXJmYWNlSWRzLAorICAgICAgICBLZXllZFZlY3RvcjxzcDxTdXJmYWNlPiwgc2l6ZV90PiAqb3V0cHV0TWFwKSB7CisgICAgc3RhdHVzX3QgcmV0ID0gT0s7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgaWYgKChvdXRwdXRNYXAgPT0gbnVsbHB0cikgfHwgKG91dHB1dEluZm8uc2l6ZSgpICE9IG91dHB1dFN1cmZhY2VzLnNpemUoKSkgfHwKKyAgICAgICAgICAgIChvdXRwdXRTdXJmYWNlcy5zaXplKCkgPiBrTWF4T3V0cHV0cykpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICB1aW50NjRfdCB1c2FnZTsKKyAgICBnZXRFbmRwb2ludFVzYWdlKCZ1c2FnZSk7CisgICAgS2V5ZWRWZWN0b3I8c3A8U3VyZmFjZT4sIHNpemVfdD4gcmVtb3ZlZFN1cmZhY2VzOworICAgIC8vQ2hlY2sgd2hldGhlciB0aGUgbmV3IHN1cmZhY2VzIGFyZSBjb21wYXRpYmxlLgorICAgIGZvciAoY29uc3QgYXV0byAmaW5mb0l0IDogb3V0cHV0SW5mbykgeworICAgICAgICBib29sIGltZ1JlYWRlclVzYWdlID0gKGluZm9JdC5jb25zdW1lclVzYWdlICYgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOKSA/IHRydWUgOiBmYWxzZTsKKyAgICAgICAgYm9vbCBzaXplTWlzbWF0Y2ggPSAoKHN0YXRpY19jYXN0PHVpbnQzMl90PihpbmZvSXQud2lkdGgpICE9IGdldFdpZHRoKCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50MzJfdD4gKGluZm9JdC5oZWlnaHQpICE9IGdldEhlaWdodCgpKSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIDogZmFsc2U7CisgICAgICAgIGlmICgoaW1nUmVhZGVyVXNhZ2UgJiYgc2l6ZU1pc21hdGNoKSB8fAorICAgICAgICAgICAgICAgIChpbmZvSXQuZm9ybWF0ICE9IGdldE9yaWdpbmFsRm9ybWF0KCkgJiYgaW5mb0l0LmZvcm1hdCAhPSBnZXRGb3JtYXQoKSkgfHwKKyAgICAgICAgICAgICAgICAoaW5mb0l0LmRhdGFTcGFjZSAhPSBnZXREYXRhU3BhY2UoKSAmJgorICAgICAgICAgICAgICAgICBpbmZvSXQuZGF0YVNwYWNlICE9IGdldE9yaWdpbmFsRGF0YVNwYWNlKCkpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFNoYXJlZCBzdXJmYWNlIHBhcmFtZXRlcnMgZm9ybWF0OiAweCV4IGRhdGFTcGFjZTogMHgleCAiCisgICAgICAgICAgICAgICAgICAgICIgZG9uJ3QgbWF0Y2ggc291cmNlIHN0cmVhbSBmb3JtYXQ6IDB4JXggIGRhdGFTcGFjZTogMHgleCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgaW5mb0l0LmZvcm1hdCwgaW5mb0l0LmRhdGFTcGFjZSwgZ2V0Rm9ybWF0KCksIGdldERhdGFTcGFjZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvL0ZpcnN0IHJlbW92ZSBhbGwgYWJzZW50IG91dHB1dHMKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0IDogcmVtb3ZlZFN1cmZhY2VJZHMpIHsKKyAgICAgICAgaWYgKG1TdHJlYW1TcGxpdHRlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXQgPSBtU3RyZWFtU3BsaXR0ZXItPnJlbW92ZU91dHB1dChpdCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVkIiwgX19GVU5DVElPTl9fLCByZXQpOworICAgICAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IHJldmVydFBhcnRpYWxVcGRhdGVMb2NrZWQocmVtb3ZlZFN1cmZhY2VzLCAqb3V0cHV0TWFwKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtU3VyZmFjZXNbaXRdID0gbnVsbHB0cjsKKyAgICAgICAgcmVtb3ZlZFN1cmZhY2VzLmFkZChtU3VyZmFjZXNbaXRdLCBpdCk7CisgICAgfQorCisgICAgLy9OZXh0IGFkZCB0aGUgbmV3IG91dHB1dHMKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0IDogb3V0cHV0U3VyZmFjZXMpIHsKKyAgICAgICAgc3NpemVfdCBzdXJmYWNlSWQgPSBnZXROZXh0U3VyZmFjZUlkTG9ja2VkKCk7CisgICAgICAgIGlmIChzdXJmYWNlSWQgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IE5vIG1vcmUgYXZhaWxhYmxlIG91dHB1dCBzbG90cyEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gcmV2ZXJ0UGFydGlhbFVwZGF0ZUxvY2tlZChyZW1vdmVkU3VyZmFjZXMsICpvdXRwdXRNYXApOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIGlmIChtU3RyZWFtU3BsaXR0ZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0ID0gbVN0cmVhbVNwbGl0dGVyLT5hZGRPdXRwdXQoc3VyZmFjZUlkLCBpdCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVkIiwgX19GVU5DVElPTl9fLCByZXQpOworICAgICAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IHJldmVydFBhcnRpYWxVcGRhdGVMb2NrZWQocmVtb3ZlZFN1cmZhY2VzLCAqb3V0cHV0TWFwKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVN1cmZhY2VzW3N1cmZhY2VJZF0gPSBpdDsKKyAgICAgICAgb3V0cHV0TWFwLT5hZGQoaXQsIHN1cmZhY2VJZCk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKwogfSAvLyBuYW1lc3BhY2UgY2FtZXJhMwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oCmluZGV4IDIyYmIyZmMuLjAyYjFjMDkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTYtMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0zNiw2ICszNiw3IEBACiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAogICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLAogICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAogICAgICAgICAgICAgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQpOwogCiAgICAgdmlydHVhbCB+Q2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbSgpOwpAQCAtNDYsOSArNDcsMjQgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q29uc3VtZXJzKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzKTsKIAorICAgIHZpcnR1YWwgc3NpemVfdCBnZXRTdXJmYWNlSWQoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCB1cGRhdGVTdHJlYW0oY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+ICZvdXRwdXRTdXJmYWNlcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE91dHB1dFN0cmVhbUluZm8+ICZvdXRwdXRJbmZvLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiAmcmVtb3ZlZFN1cmZhY2VJZHMsCisgICAgICAgICAgICBLZXllZFZlY3RvcjxzcDxTdXJmYWNlPiwgc2l6ZV90PiAqb3V0cHV0TWFwLypvdXQqLyk7CisKIHByaXZhdGU6Ci0gICAgLy8gU3VyZmFjZXMgcGFzc2VkIGluIGNvbnN0cnVjdG9yIGZyb20gYXBwCi0gICAgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4gPiBtU3VyZmFjZXM7CisKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhPdXRwdXRzID0gNDsKKworICAgIC8vIE1hcCBzdXJmYWNlSWQgLT4gb3V0cHV0IHN1cmZhY2VzCisgICAgc3A8U3VyZmFjZT4gbVN1cmZhY2VzW2tNYXhPdXRwdXRzXTsKKworICAgIHNzaXplX3QgZ2V0TmV4dFN1cmZhY2VJZExvY2tlZCgpOworCisgICAgc3RhdHVzX3QgcmV2ZXJ0UGFydGlhbFVwZGF0ZUxvY2tlZChjb25zdCBLZXllZFZlY3RvcjxzcDxTdXJmYWNlPiwgc2l6ZV90PiAmcmVtb3ZlZFN1cmZhY2VzLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8c3A8U3VyZmFjZT4sIHNpemVfdD4gJmF0dGFjaGVkU3VyZmFjZXMpOwogCiAgICAgLyoqCiAgICAgICogVGhlIENhbWVyYTNTdHJlYW1TcGxpdHRlciBvYmplY3QgdGhpcyBzdHJlYW0gdXNlcyBmb3Igc3RyZWFtCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcAppbmRleCBmYmU4ZjRmLi4xMTA1Yjc1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxMy0yMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTQ3LDcgKzQ3LDggQEAKIENhbWVyYTNTdHJlYW06OkNhbWVyYTNTdHJlYW0oaW50IGlkLAogICAgICAgICBjYW1lcmEzX3N0cmVhbV90eXBlIHR5cGUsCiAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHNpemVfdCBtYXhTaXplLCBpbnQgZm9ybWF0LAotICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCBzZXRJZCkgOgorICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCisgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsIGludCBzZXRJZCkgOgogICAgIGNhbWVyYTNfc3RyZWFtKCksCiAgICAgbUlkKGlkKSwKICAgICBtU2V0SWQoc2V0SWQpLApAQCAtNjQsNyArNjUsOCBAQAogICAgIG1MYXN0TWF4Q291bnQoQ2FtZXJhM1N0cmVhbUludGVyZmFjZTo6QUxMT0NBVEVfUElQRUxJTkVfTUFYKSwKICAgICBtQnVmZmVyTGltaXRMYXRlbmN5KGtCdWZmZXJMaW1pdExhdGVuY3lCaW5TaXplKSwKICAgICBtRm9ybWF0T3ZlcnJpZGRlbihmYWxzZSksCi0gICAgbU9yaWdpbmFsRm9ybWF0KC0xKSB7CisgICAgbU9yaWdpbmFsRm9ybWF0KC0xKSwKKyAgICBtUGh5c2ljYWxDYW1lcmFJZChwaHlzaWNhbENhbWVyYUlkKSB7CiAKICAgICBjYW1lcmEzX3N0cmVhbTo6c3RyZWFtX3R5cGUgPSB0eXBlOwogICAgIGNhbWVyYTNfc3RyZWFtOjp3aWR0aCA9IHdpZHRoOwpAQCAtNzQsNiArNzYsNyBAQAogICAgIGNhbWVyYTNfc3RyZWFtOjpyb3RhdGlvbiA9IHJvdGF0aW9uOwogICAgIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycyA9IDA7CiAgICAgY2FtZXJhM19zdHJlYW06OnByaXYgPSBOVUxMOworICAgIGNhbWVyYTNfc3RyZWFtOjpwaHlzaWNhbF9jYW1lcmFfaWQgPSBtUGh5c2ljYWxDYW1lcmFJZC5zdHJpbmcoKTsKIAogICAgIGlmICgoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQiB8fCBmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9SQVdfT1BBUVVFKSAmJgogICAgICAgICAgICAgbWF4U2l6ZSA9PSAwKSB7CkBAIC0xNDAsNiArMTQzLDc5IEBACiAgICAgcmV0dXJuIG1PcmlnaW5hbERhdGFTcGFjZTsKIH0KIAorY29uc3QgU3RyaW5nOCYgQ2FtZXJhM1N0cmVhbTo6cGh5c2ljYWxDYW1lcmFJZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVBoeXNpY2FsQ2FtZXJhSWQ7Cit9CisKK3N0YXR1c190IENhbWVyYTNTdHJlYW06OmZvcmNlVG9JZGxlKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIHN0YXR1c190IHJlczsKKworICAgIHN3aXRjaCAobVN0YXRlKSB7CisgICAgICAgIGNhc2UgU1RBVEVfRVJST1I6CisgICAgICAgIGNhc2UgU1RBVEVfQ09OU1RSVUNURUQ6CisgICAgICAgIGNhc2UgU1RBVEVfSU5fQ09ORklHOgorICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUklORzoKKyAgICAgICAgY2FzZSBTVEFURV9JTl9SRUNPTkZJRzoKKyAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBzdGF0ZTogJWQiLCBfX0ZVTkNUSU9OX18sIG1TdGF0ZSk7CisgICAgICAgICAgICByZXMgPSBOT19JTklUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBVEVfQ09ORklHVVJFRDoKKyAgICAgICAgICAgIGlmIChoYXNPdXRzdGFuZGluZ0J1ZmZlcnNMb2NrZWQoKSkgeworICAgICAgICAgICAgICAgIHNwPFN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIgPSBtU3RhdHVzVHJhY2tlci5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1c1RyYWNrZXIgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXNUcmFja2VyLT5tYXJrQ29tcG9uZW50SWRsZShtU3RhdHVzSWQsIEZlbmNlOjpOT19GRU5DRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9JTl9JRExFOworICAgICAgICAgICAgcmVzID0gT0s7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmtub3duIHN0YXRlICVkIiwgX19GVU5DVElPTl9fLCBtU3RhdGUpOworICAgICAgICAgICAgcmVzID0gTk9fSU5JVDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpyZXN0b3JlQ29uZmlndXJlZFN0YXRlKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIHN0YXR1c190IHJlczsKKworICAgIHN3aXRjaCAobVN0YXRlKSB7CisgICAgICAgIGNhc2UgU1RBVEVfRVJST1I6CisgICAgICAgIGNhc2UgU1RBVEVfQ09OU1RSVUNURUQ6CisgICAgICAgIGNhc2UgU1RBVEVfSU5fQ09ORklHOgorICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUklORzoKKyAgICAgICAgY2FzZSBTVEFURV9JTl9SRUNPTkZJRzoKKyAgICAgICAgY2FzZSBTVEFURV9DT05GSUdVUkVEOgorICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHN0YXRlOiAlZCIsIF9fRlVOQ1RJT05fXywgbVN0YXRlKTsKKyAgICAgICAgICAgIHJlcyA9IE5PX0lOSVQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVEFURV9JTl9JRExFOgorICAgICAgICAgICAgaWYgKGhhc091dHN0YW5kaW5nQnVmZmVyc0xvY2tlZCgpKSB7CisgICAgICAgICAgICAgICAgc3A8U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciA9IG1TdGF0dXNUcmFja2VyLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzVHJhY2tlciAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c1RyYWNrZXItPm1hcmtDb21wb25lbnRBY3RpdmUobVN0YXR1c0lkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0NPTkZJR1VSRUQ7CisgICAgICAgICAgICByZXMgPSBPSzsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVua25vd24gc3RhdGUgJWQiLCBfX0ZVTkNUSU9OX18sIG1TdGF0ZSk7CisgICAgICAgICAgICByZXMgPSBOT19JTklUOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKIGNhbWVyYTNfc3RyZWFtKiBDYW1lcmEzU3RyZWFtOjpzdGFydENvbmZpZ3VyYXRpb24oKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CkBAIC0xNTAsNiArMjI2LDcgQEAKICAgICAgICAgICAgIEFMT0dFKCIlczogSW4gZXJyb3Igc3RhdGUiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIGNhc2UgU1RBVEVfQ09OU1RSVUNURUQ6CisgICAgICAgIGNhc2UgU1RBVEVfSU5fSURMRToKICAgICAgICAgICAgIC8vIE9LCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBTVEFURV9JTl9DT05GSUc6CkBAIC0xNzksNiArMjU2LDExIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAorICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfSU5fSURMRSkgeworICAgICAgICAvLyBTa2lwIGNvbmZpZ3VyYXRpb24uCisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKwogICAgIC8vIFN0b3AgdHJhY2tpbmcgaWYgY3VycmVudGx5IGRvaW5nIHNvCiAgICAgaWYgKG1TdGF0dXNJZCAhPSBTdGF0dXNUcmFja2VyOjpOT19TVEFUVVNfSUQpIHsKICAgICAgICAgc3A8U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciA9IG1TdGF0dXNUcmFja2VyLnByb21vdGUoKTsKQEAgLTIxOSw2ICszMDEsOSBAQAogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluaXNoIGNvbmZpZ3VyYXRpb24gdGhhdCBoYXNuJ3QgYmVlbiBzdGFydGVkIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgY2FzZSBTVEFURV9JTl9JRExFOgorICAgICAgICAgICAgLy9Ta2lwIGNvbmZpZ3VyYXRpb24gaW4gdGhpcyBzdGF0ZQorICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmtub3duIHN0YXRlIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTI2Nyw2ICszNTIsNyBAQAogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICBjYXNlIFNUQVRFX0lOX0NPTkZJRzoKICAgICAgICAgY2FzZSBTVEFURV9JTl9SRUNPTkZJRzoKKyAgICAgICAgY2FzZSBTVEFURV9JTl9JRExFOgogICAgICAgICAgICAgLy8gT0sKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFNUQVRFX0NPTlNUUlVDVEVEOgpAQCAtMjgyLDcgKzM2OCw5IEBACiAgICAgbVVzYWdlID0gbU9sZFVzYWdlOwogICAgIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycyA9IG1PbGRNYXhCdWZmZXJzOwogCi0gICAgbVN0YXRlID0gKG1TdGF0ZSA9PSBTVEFURV9JTl9SRUNPTkZJRykgPyBTVEFURV9DT05GSUdVUkVEIDogU1RBVEVfQ09OU1RSVUNURUQ7CisgICAgbVN0YXRlID0gKChtU3RhdGUgPT0gU1RBVEVfSU5fUkVDT05GSUcpIHx8IChtU3RhdGUgPT0gU1RBVEVfSU5fSURMRSkpID8gU1RBVEVfQ09ORklHVVJFRCA6CisgICAgICAgICAgICBTVEFURV9DT05TVFJVQ1RFRDsKKwogICAgIHJldHVybiBPSzsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaAppbmRleCA2ZTc5MTJlLi5hNjBjYjU2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtNjgsNiArNjgsMTIgQEAKICAqICAgIGR1cmF0aW9uLiAgSW4gdGhpcyBzdGF0ZSwgb25seSBwcmVwYXJlTmV4dEJ1ZmZlcigpIGFuZCBjYW5jZWxQcmVwYXJlKCkKICAqICAgIG1heSBiZSBjYWxsZWQuCiAgKgorICogIFNUQVRFX0lOX0lETEU6IFRoaXMgaXMgYSB0ZW1wb3Jhcnkgc3RhdGUgb25seSBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBpbnB1dAorICogICAgc3RyZWFtcyBhbmQgb25seSBmb3IgdGhlIGNhc2Ugd2hlcmUgd2UgbmVlZCB0byByZS1jb25maWd1cmUgdGhlIGNhbWVyYSBkZXZpY2UKKyAqICAgIHdoaWxlIHRoZSBpbnB1dCBzdHJlYW0gaGFzIGFuIG91dHN0YW5kaW5nIGJ1ZmZlci4gQWxsIG90aGVyIHN0cmVhbXMgc2hvdWxkIG5vdAorICogICAgYmUgYWJsZSB0byBzd2l0Y2ggdG8gdGhpcyBzdGF0ZS4gRm9yIHRoZW0gdGhpcyBpcyBpbnZhbGlkIGFuZCBzaG91bGQgYmUgaGFuZGxlZAorICogICAgYXMgYW4gdW5rbm93biBzdGF0ZS4KKyAqCiAgKiBUcmFuc2l0aW9uIHRhYmxlOgogICoKICAqICAgIDxub25lPiAgICAgICAgICAgICAgID0+IFNUQVRFX0NPTlNUUlVDVEVEOgpAQCAtOTgsNiArMTA0LDExIEBACiAgKiAgICAgICAgYWxsIHN0cmVhbSBidWZmZXJzLCBvciBjYW5jZWxQcmVwYXJlIGlzIGNhbGxlZC4KICAqICAgIFNUQVRFX0NPTkZJR1VSRUQgICAgID0+IFNUQVRFX0FCQU5ET05FRDoKICAqICAgICAgICBXaGVuIHRoZSBidWZmZXIgcXVldWUgb2YgdGhlIHN0cmVhbSBpcyBhYmFuZG9uZWQuCisgKiAgICBTVEFURV9DT05GSUdVUkVEICAgICA9PiBTVEFURV9JTl9JRExFOgorICogICAgICAgIE9ubHkgZm9yIGFuIGlucHV0IHN0cmVhbSB3aGljaCBoYXMgYW4gb3V0c3RhbmRpbmcgYnVmZmVyLgorICogICAgU1RBVEVfSU5fSURMRSAgICAgPT4gU1RBVEVfQ09ORklHVVJFRDoKKyAqICAgICAgICBBZnRlciB0aGUgaW50ZXJuYWwgcmUtY29uZmlndXJhdGlvbiwgdGhlIGlucHV0IHNob3VsZCByZXZlcnQgYmFjayB0bworICogICAgICAgIHRoZSBjb25maWd1cmVkIHN0YXRlLgogICoKICAqIFN0YXR1cyBUcmFja2luZzoKICAqICAgIEVhY2ggc3RyZWFtIGlzIHRyYWNrZWQgYnkgU3RhdHVzVHJhY2tlciBhcyBhIHNlcGFyYXRlIGNvbXBvbmVudCwKQEAgLTEwOCw3ICsxMTksOSBAQAogICoKICAqICAgIC0gQUNUSVZFOiBPbmUgb3IgbW9yZSBidWZmZXJzIGhhdmUgYmVlbiBoYW5kZWQgb3V0ICh3aXRoICNnZXRCdWZmZXIpLgogICogICAgLSBJRExFOiBBbGwgYnVmZmVycyBoYXZlIGJlZW4gcmV0dXJuZWQgKHdpdGggI3JldHVybkJ1ZmZlciksIGFuZCB0aGVpcgotICogICAgICAgICAgcmVzcGVjdGl2ZSByZWxlYXNlX2ZlbmNlKHMpIGhhdmUgYmVlbiBzaWduYWxlZC4KKyAqICAgICAgICAgIHJlc3BlY3RpdmUgcmVsZWFzZV9mZW5jZShzKSBoYXZlIGJlZW4gc2lnbmFsZWQuIFRoZSBvbmx5IGV4Y2VwdGlvbiB0byB0aGlzCisgKiAgICAgICAgICBydWxlIGlzIGFuIGlucHV0IHN0cmVhbSB0aGF0IG1vdmVzIHRvICJTVEFURV9JTl9JRExFIiBkdXJpbmcgaW50ZXJuYWwKKyAqICAgICAgICAgIHJlLWNvbmZpZ3VyYXRpb24uCiAgKgogICogICAgQSB0eXBpY2FsIHVzZSBjYXNlIGlzIG91dHB1dCBzdHJlYW1zLiBXaGVuIHRoZSBIQUwgaGFzIGFueSBidWZmZXJzCiAgKiAgICBkZXF1ZXVlZCwgdGhlIHN0cmVhbSBpcyBtYXJrZWQgQUNUSVZFLiBXaGVuIHRoZSBIQUwgcmV0dXJucyBhbGwgYnVmZmVycwpAQCAtMTUyLDYgKzE2NSw3IEBACiAgICAgdm9pZCAgICAgICAgICAgICAgc2V0RGF0YVNwYWNlT3ZlcnJpZGUoYm9vbCBkYXRhU3BhY2VPdmVycmlkZW4pOwogICAgIGJvb2wgICAgICAgICAgICAgIGlzRGF0YVNwYWNlT3ZlcnJpZGRlbigpIGNvbnN0OwogICAgIGFuZHJvaWRfZGF0YXNwYWNlIGdldE9yaWdpbmFsRGF0YVNwYWNlKCkgY29uc3Q7CisgICAgY29uc3QgU3RyaW5nOCYgICAgcGh5c2ljYWxDYW1lcmFJZCgpIGNvbnN0OwogCiAgICAgY2FtZXJhM19zdHJlYW0qICAgYXNIYWxTdHJlYW0oKSBvdmVycmlkZSB7CiAgICAgICAgIHJldHVybiB0aGlzOwpAQCAtMzg2LDYgKzQwMCwxOSBAQAogICAgICAqLwogICAgIGJvb2wgICAgICAgICAgICAgaXNBYmFuZG9uZWQoKSBjb25zdDsKIAorICAgIC8qKgorICAgICAqIFN3aXRjaCBhIGNvbmZpZ3VyZWQgc3RyZWFtIHdpdGggcG9zc2libHkgb3V0c3RhbmRpbmcgYnVmZmVycyBpbiBpZGxlCisgICAgICogc3RhdGUuIENvbmZpZ3VyYXRpb24gZm9yIHN1Y2ggc3RyZWFtcyB3aWxsIGJlIHNraXBwZWQgYXNzdW1pbmcgdGhlcmUKKyAgICAgKiBhcmUgbm8gY2hhbmdlcyB0byB0aGUgc3RyZWFtIHBhcmFtZXRlcnMuCisgICAgICovCisgICAgc3RhdHVzX3QgICAgICAgICBmb3JjZVRvSWRsZSgpOworCisgICAgLyoqCisgICAgICogUmVzdG9yZSBhIGZvcmNlZCBpZGxlIHN0cmVhbSB0byBjb25maWd1cmVkIHN0YXRlLCBtYXJraW5nIGl0IGFjdGl2ZQorICAgICAqIGluIGNhc2UgaXQgY29udGFpbnMgb3V0c3RhbmRpbmcgYnVmZmVycy4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCAgICAgICAgIHJlc3RvcmVDb25maWd1cmVkU3RhdGUoKTsKKwogICBwcm90ZWN0ZWQ6CiAgICAgY29uc3QgaW50IG1JZDsKICAgICAvKioKQEAgLTQxNCw3ICs0NDEsOCBAQAogICAgICAgICBTVEFURV9JTl9SRUNPTkZJRywKICAgICAgICAgU1RBVEVfQ09ORklHVVJFRCwKICAgICAgICAgU1RBVEVfUFJFUEFSSU5HLAotICAgICAgICBTVEFURV9BQkFORE9ORUQKKyAgICAgICAgU1RBVEVfQUJBTkRPTkVELAorICAgICAgICBTVEFURV9JTl9JRExFCiAgICAgfSBtU3RhdGU7CiAKICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwpAQCAtNDIyLDcgKzQ1MCw3IEBACiAgICAgQ2FtZXJhM1N0cmVhbShpbnQgaWQsIGNhbWVyYTNfc3RyZWFtX3R5cGUgdHlwZSwKICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHNpemVfdCBtYXhTaXplLCBpbnQgZm9ybWF0LAogICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAotICAgICAgICAgICAgaW50IHNldElkKTsKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsIGludCBzZXRJZCk7CiAKICAgICB3cDxDYW1lcmEzU3RyZWFtQnVmZmVyRnJlZWRMaXN0ZW5lcj4gbUJ1ZmZlckZyZWVkTGlzdGVuZXI7CiAKQEAgLTUyOSw2ICs1NTcsNyBAQAogICAgIGJvb2wgbURhdGFTcGFjZU92ZXJyaWRkZW47CiAgICAgYW5kcm9pZF9kYXRhc3BhY2UgbU9yaWdpbmFsRGF0YVNwYWNlOwogCisgICAgU3RyaW5nOCBtUGh5c2ljYWxDYW1lcmFJZDsKIH07IC8vIGNsYXNzIENhbWVyYTNTdHJlYW0KIAogfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmgKaW5kZXggY2M5YmY4ZS4uOWVkNzE4NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmgKQEAgLTQzLDYgKzQzLDI0IEBACiAKIGNsYXNzIFN0YXR1c1RyYWNrZXI7CiAKKy8vIE91dHB1dFN0cmVhbUluZm8gZGVzY3JpYmVzIHRoZSBwcm9wZXJ0eSBvZiBhIGNhbWVyYSBzdHJlYW0uCitjbGFzcyBPdXRwdXRTdHJlYW1JbmZvIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGludCB3aWR0aDsKKyAgICAgICAgaW50IGhlaWdodDsKKyAgICAgICAgaW50IGZvcm1hdDsKKyAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlOworICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlOworICAgICAgICBib29sIGZpbmFsaXplZCA9IGZhbHNlOworICAgICAgICBPdXRwdXRTdHJlYW1JbmZvKCkgOgorICAgICAgICAgICAgd2lkdGgoLTEpLCBoZWlnaHQoLTEpLCBmb3JtYXQoLTEpLCBkYXRhU3BhY2UoSEFMX0RBVEFTUEFDRV9VTktOT1dOKSwKKyAgICAgICAgICAgIGNvbnN1bWVyVXNhZ2UoMCkge30KKyAgICAgICAgT3V0cHV0U3RyZWFtSW5mbyhpbnQgX3dpZHRoLCBpbnQgX2hlaWdodCwgaW50IF9mb3JtYXQsIGFuZHJvaWRfZGF0YXNwYWNlIF9kYXRhU3BhY2UsCisgICAgICAgICAgICAgICAgdWludDY0X3QgX2NvbnN1bWVyVXNhZ2UpIDoKKyAgICAgICAgICAgIHdpZHRoKF93aWR0aCksIGhlaWdodChfaGVpZ2h0KSwgZm9ybWF0KF9mb3JtYXQpLAorICAgICAgICAgICAgZGF0YVNwYWNlKF9kYXRhU3BhY2UpLCBjb25zdW1lclVzYWdlKF9jb25zdW1lclVzYWdlKSB7fQorfTsKKwogLyoqCiAgKiBBbiBpbnRlcmZhY2UgZm9yIG1hbmFnaW5nIGEgc2luZ2xlIHN0cmVhbSBvZiBpbnB1dCBhbmQvb3Igb3V0cHV0IGRhdGEgZnJvbQogICogdGhlIGNhbWVyYSBkZXZpY2UuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5jcHAKaW5kZXggYTBhNTBjMi4uZjRkNWExOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcApAQCAtMzgsOCArMzgsOSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0YXR1c190IENhbWVyYTNTdHJlYW1TcGxpdHRlcjo6Y29ubmVjdChjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPiA+JiBzdXJmYWNlcywKLSAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgc2l6ZV90IGhhbE1heEJ1ZmZlcnMsIHNwPFN1cmZhY2U+KiBjb25zdW1lcikgeworc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbVNwbGl0dGVyOjpjb25uZWN0KGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxzaXplX3QsIHNwPFN1cmZhY2U+PiAmc3VyZmFjZXMsCisgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsIHVpbnQ2NF90IHByb2R1Y2VyVXNhZ2UsIHNpemVfdCBoYWxNYXhCdWZmZXJzLCB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgdWludDMyX3QgaGVpZ2h0LCBhbmRyb2lkOjpQaXhlbEZvcm1hdCBmb3JtYXQsIHNwPFN1cmZhY2U+KiBjb25zdW1lcikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKGNvbnN1bWVyID09IG51bGxwdHIpIHsKICAgICAgICAgU1BfTE9HRSgiJXM6IGNvbnN1bWVyIHBvaW50ZXIgaXMgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CkBAIC02MiwxMiArNjMsMTIgQEAKICAgICBtQ29uc3VtZXJOYW1lID0gZ2V0VW5pcXVlQ29uc3VtZXJOYW1lKCk7CiAgICAgLy8gQWRkIG91dHB1dCBzdXJmYWNlcy4gVGhpcyBoYXMgdG8gYmUgYmVmb3JlIGNyZWF0aW5nIGludGVybmFsIGJ1ZmZlciBxdWV1ZQogICAgIC8vIGluIG9yZGVyIHRvIGdldCBtYXggY29uc3VtZXIgc2lkZSBidWZmZXJzLgotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3VyZmFjZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKHN1cmZhY2VzW2ldID09IG51bGxwdHIpIHsKKyAgICBmb3IgKGF1dG8gJml0IDogc3VyZmFjZXMpIHsKKyAgICAgICAgaWYgKGl0LnNlY29uZCA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICBTUF9MT0dFKCIlczogRmF0YWw6IHN1cmZhY2UgaXMgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIHJlcyA9IGFkZE91dHB1dExvY2tlZChzdXJmYWNlc1tpXSk7CisgICAgICAgIHJlcyA9IGFkZE91dHB1dExvY2tlZChpdC5maXJzdCwgaXQuc2Vjb25kKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgU1BfTE9HRSgiJXM6IEZhaWxlZCB0byBhZGQgb3V0cHV0IHN1cmZhY2U6ICVzKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC05NCw4ICs5NSwyMCBAQAogICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgIH0KIAorICAgIHJlcyA9IG1Qcm9kdWNlci0+c2V0QXN5bmNNb2RlKHRydWUpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgU1BfTE9HRSgiJXM6IEZhaWxlZCB0byBlbmFibGUgaW5wdXQgcXVldWUgYXN5bmMgbW9kZTogJXMoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKwogICAgIHJlcyA9IG1Db25zdW1lci0+Y29uc3VtZXJDb25uZWN0KHRoaXMsIC8qIGNvbnRyb2xsZWRCeUFwcCAqLyBmYWxzZSk7CiAKKyAgICBtV2lkdGggPSB3aWR0aDsKKyAgICBtSGVpZ2h0ID0gaGVpZ2h0OworICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CisgICAgbVByb2R1Y2VyVXNhZ2UgPSBwcm9kdWNlclVzYWdlOworCiAgICAgU1BfTE9HVigiJXM6IGNvbm5lY3RlZCIsIF9fRlVOQ1RJT05fXyk7CiAgICAgcmV0dXJuIHJlczsKIH0KQEAgLTExNywxMCArMTMwLDEzIEBACiAgICAgbU5vdGlmaWVycy5jbGVhcigpOwogCiAgICAgZm9yIChhdXRvJiBvdXRwdXQgOiBtT3V0cHV0cykgewotICAgICAgICBvdXRwdXQtPmRpc2Nvbm5lY3QoTkFUSVZFX1dJTkRPV19BUElfQ0FNRVJBKTsKKyAgICAgICAgaWYgKG91dHB1dC5zZWNvbmQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgb3V0cHV0LnNlY29uZC0+ZGlzY29ubmVjdChOQVRJVkVfV0lORE9XX0FQSV9DQU1FUkEpOworICAgICAgICB9CiAgICAgfQogICAgIG1PdXRwdXRzLmNsZWFyKCk7CiAgICAgbU91dHB1dFNsb3RzLmNsZWFyKCk7CisgICAgbUNvbnN1bWVyQnVmZmVyQ291bnQuY2xlYXIoKTsKIAogICAgIG1Db25zdW1lci0+Y29uc3VtZXJEaXNjb25uZWN0KCk7CiAKQEAgLTEzOSwxMCArMTU1LDEwIEBACiAgICAgZGlzY29ubmVjdCgpOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzU3RyZWFtU3BsaXR0ZXI6OmFkZE91dHB1dChjb25zdCBzcDxTdXJmYWNlPiYgb3V0cHV0UXVldWUpIHsKK3N0YXR1c190IENhbWVyYTNTdHJlYW1TcGxpdHRlcjo6YWRkT3V0cHV0KHNpemVfdCBzdXJmYWNlSWQsIGNvbnN0IHNwPFN1cmZhY2U+JiBvdXRwdXRRdWV1ZSkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICBzdGF0dXNfdCByZXMgPSBhZGRPdXRwdXRMb2NrZWQob3V0cHV0UXVldWUpOworICAgIHN0YXR1c190IHJlcyA9IGFkZE91dHB1dExvY2tlZChzdXJmYWNlSWQsIG91dHB1dFF1ZXVlKTsKIAogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgU1BfTE9HRSgiJXM6IGFkZE91dHB1dExvY2tlZCBmYWlsZWQgJWQiLCBfX0ZVTkNUSU9OX18sIHJlcyk7CkBAIC0xNTQsMTggKzE3MCwzMCBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLXN0YXR1c190IENhbWVyYTNTdHJlYW1TcGxpdHRlcjo6YWRkT3V0cHV0TG9ja2VkKGNvbnN0IHNwPFN1cmZhY2U+JiBvdXRwdXRRdWV1ZSkgeworc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbVNwbGl0dGVyOjphZGRPdXRwdXRMb2NrZWQoc2l6ZV90IHN1cmZhY2VJZCwgY29uc3Qgc3A8U3VyZmFjZT4mIG91dHB1dFF1ZXVlKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAob3V0cHV0UXVldWUgPT0gbnVsbHB0cikgewogICAgICAgICBTUF9MT0dFKCJhZGRPdXRwdXQ6IG91dHB1dFF1ZXVlIG11c3Qgbm90IGJlIE5VTEwiKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKKyAgICBpZiAobU91dHB1dHNbc3VyZmFjZUlkXSAhPSBudWxscHRyKSB7CisgICAgICAgIFNQX0xPR0UoIiVzOiBzdXJmYWNlSWQ6ICV1IGFscmVhZHkgdGFrZW4hIiwgX19GVU5DVElPTl9fLCAodW5zaWduZWQpIHN1cmZhY2VJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgIHN0YXR1c190IHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGltZW5zaW9ucyhvdXRwdXRRdWV1ZS5nZXQoKSwKKyAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CisgICAgaWYgKHJlcyAhPSBOT19FUlJPUikgeworICAgICAgICBTUF9MT0dFKCJhZGRPdXRwdXQ6IGZhaWxlZCB0byBzZXQgYnVmZmVyIGRpbWVuc2lvbnMgKCVkKSIsIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCiAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2JwID0gb3V0cHV0UXVldWUtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKTsKICAgICAvLyBDb25uZWN0IHRvIHRoZSBidWZmZXIgcHJvZHVjZXIKICAgICBzcDxPdXRwdXRMaXN0ZW5lcj4gbGlzdGVuZXIobmV3IE91dHB1dExpc3RlbmVyKHRoaXMsIGdicCkpOwogICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGdicCktPmxpbmtUb0RlYXRoKGxpc3RlbmVyKTsKLSAgICBzdGF0dXNfdCByZXMgPSBvdXRwdXRRdWV1ZS0+Y29ubmVjdChOQVRJVkVfV0lORE9XX0FQSV9DQU1FUkEsIGxpc3RlbmVyKTsKKyAgICByZXMgPSBvdXRwdXRRdWV1ZS0+Y29ubmVjdChOQVRJVkVfV0lORE9XX0FQSV9DQU1FUkEsIGxpc3RlbmVyKTsKICAgICBpZiAocmVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIFNQX0xPR0UoImFkZE91dHB1dDogZmFpbGVkIHRvIGNvbm5lY3QgKCVkKSIsIHJlcyk7CiAgICAgICAgIHJldHVybiByZXM7CkBAIC0yMDgsNyArMjM2LDggQEAKICAgICB9CiAKICAgICAvLyBBZGQgbmV3IGVudHJ5IGludG8gbU91dHB1dHMKLSAgICBtT3V0cHV0cy5wdXNoX2JhY2soZ2JwKTsKKyAgICBtT3V0cHV0c1tzdXJmYWNlSWRdID0gZ2JwOworICAgIG1Db25zdW1lckJ1ZmZlckNvdW50W3N1cmZhY2VJZF0gPSBtYXhDb25zdW1lckJ1ZmZlcnM7CiAgICAgbU5vdGlmaWVyc1tnYnBdID0gbGlzdGVuZXI7CiAgICAgbU91dHB1dFNsb3RzW2dicF0gPSBzdGQ6Om1ha2VfdW5pcXVlPE91dHB1dFNsb3RzPih0b3RhbEJ1ZmZlckNvdW50KTsKIApAQCAtMjE2LDggKzI0NSw4MCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbVNwbGl0dGVyOjpyZW1vdmVPdXRwdXQoc2l6ZV90IHN1cmZhY2VJZCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKKworICAgIHN0YXR1c190IHJlcyA9IHJlbW92ZU91dHB1dExvY2tlZChzdXJmYWNlSWQpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgU1BfTE9HRSgiJXM6IHJlbW92ZU91dHB1dExvY2tlZCBmYWlsZWQgJWQiLCBfX0ZVTkNUSU9OX18sIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcmVzID0gbUNvbnN1bWVyLT5zZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KG1NYXhDb25zdW1lckJ1ZmZlcnMrMSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBTUF9MT0dFKCIlczogc2V0TWF4QWNxdWlyZWRCdWZmZXJDb3VudCBmYWlsZWQgJWQiLCBfX0ZVTkNUSU9OX18sIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbVNwbGl0dGVyOjpyZW1vdmVPdXRwdXRMb2NrZWQoc2l6ZV90IHN1cmZhY2VJZCkgeworICAgIGlmIChtT3V0cHV0c1tzdXJmYWNlSWRdID09IG51bGxwdHIpIHsKKyAgICAgICAgU1BfTE9HRSgiJXM6IG91dHB1dCBzdXJmYWNlIGlzIG5vdCBwcmVzZW50ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2JwID0gbU91dHB1dHNbc3VyZmFjZUlkXTsKKyAgICAvL1NlYXJjaCBhbmQgZGVjcmVtZW50IHRoZSByZWYuIGNvdW50IG9mIGFueSBidWZmZXJzIHRoYXQgYXJlCisgICAgLy9zdGlsbCBhdHRhY2hlZCB0byB0aGUgcmVtb3ZlZCBzdXJmYWNlLgorICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBwZW5kaW5nQnVmZmVySWRzOworICAgIGF1dG8mIG91dHB1dFNsb3RzID0gKm1PdXRwdXRTbG90c1tnYnBdOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0U2xvdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG91dHB1dFNsb3RzW2ldICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHBlbmRpbmdCdWZmZXJJZHMucHVzaF9iYWNrKG91dHB1dFNsb3RzW2ldLT5nZXRJZCgpKTsKKyAgICAgICAgICAgIGF1dG8gcmMgPSBnYnAtPmRldGFjaEJ1ZmZlcihpKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIC8vQnVmZmVycyB0aGF0IGZhaWwgdG8gZGV0YWNoIGhlcmUgd2lsbCBiZSBzY2hlZHVsZWQgZm9yIGRldGFjaCBpbiB0aGUKKyAgICAgICAgICAgICAgICAvL2lucHV0IGJ1ZmZlciBxdWV1ZSBhbmQgdGhlIHJlc3Qgb2YgdGhlIHJlZ2lzdGVyZWQgb3V0cHV0cyBpbnN0ZWFkLgorICAgICAgICAgICAgICAgIC8vVGhpcyB3aWxsIGhlbHAgZW5zdXJlIHRoYXQgY2FtZXJhIHN0b3BzIGFjY2Vzc2luZyBidWZmZXJzIHRoYXQgc3RpbGwKKyAgICAgICAgICAgICAgICAvL2NhbiBnZXQgcmVmZXJlbmNlZCBieSB0aGUgZGlzY29ubmVjdGVkIG91dHB1dC4KKyAgICAgICAgICAgICAgICBtRGV0YWNoZWRCdWZmZXJzLmVtcGxhY2Uob3V0cHV0U2xvdHNbaV0tPmdldElkKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1PdXRwdXRzW3N1cmZhY2VJZF0gPSBudWxscHRyOworICAgIG1PdXRwdXRTbG90c1tnYnBdID0gbnVsbHB0cjsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmlkIDogcGVuZGluZ0J1ZmZlcklkcykgeworICAgICAgICBkZWNyZW1lbnRCdWZSZWZDb3VudExvY2tlZChpZCwgc3VyZmFjZUlkKTsKKyAgICB9CisKKyAgICBhdXRvIHJlcyA9IElJbnRlcmZhY2U6OmFzQmluZGVyKGdicCktPnVubGlua1RvRGVhdGgobU5vdGlmaWVyc1tnYnBdKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIFNQX0xPR0UoIiVzOiBGYWlsZWQgdG8gdW5saW5rIHByb2R1Y2VyIGRlYXRoIGxpc3RlbmVyOiAlZCAiLCBfX0ZVTkNUSU9OX18sIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcmVzID0gZ2JwLT5kaXNjb25uZWN0KE5BVElWRV9XSU5ET1dfQVBJX0NBTUVSQSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBTUF9MT0dFKCIlczogVW5hYmxlIGRpc2Nvbm5lY3QgZnJvbSBwcm9kdWNlciBpbnRlcmZhY2U6ICVkICIsIF9fRlVOQ1RJT05fXywgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBtTm90aWZpZXJzW2dicF0gPSBudWxscHRyOworICAgIGlmIChtQ29uc3VtZXJCdWZmZXJDb3VudFtzdXJmYWNlSWRdIDwgbU1heEhhbEJ1ZmZlcnMpIHsKKyAgICAgICAgbU1heENvbnN1bWVyQnVmZmVycyAtPSBtQ29uc3VtZXJCdWZmZXJDb3VudFtzdXJmYWNlSWRdOworICAgIH0gZWxzZSB7CisgICAgICAgIFNQX0xPR0UoIiVzOiBDYWNoZWQgY29uc3VtZXIgYnVmZmVyIGNvdW50IG1pc21hdGNoISIsIF9fRlVOQ1RJT05fXyk7CisgICAgfQorICAgIG1Db25zdW1lckJ1ZmZlckNvdW50W3N1cmZhY2VJZF0gPSAwOworCisgICAgcmV0dXJuIHJlczsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbVNwbGl0dGVyOjpvdXRwdXRCdWZmZXJMb2NrZWQoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIG91dHB1dCwKLSAgICAgICAgY29uc3QgQnVmZmVySXRlbSYgYnVmZmVySXRlbSkgeworICAgICAgICBjb25zdCBCdWZmZXJJdGVtJiBidWZmZXJJdGVtLCBzaXplX3Qgc3VyZmFjZUlkKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCByZXM7CiAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBxdWV1ZUlucHV0KApAQCAtMjQyLDYgKzM0MywxMSBAQAogCiAgICAgU1BfTE9HVigiJXM6IFF1ZXVpbmcgYnVmZmVyIHRvIGJ1ZmZlciBxdWV1ZSAlcCBzbG90ICVkIHJldHVybnMgJWQiLAogICAgICAgICAgICAgX19GVU5DVElPTl9fLCBvdXRwdXQuZ2V0KCksIHNsb3QsIHJlcyk7CisgICAgLy9EdXJpbmcgYnVmZmVyIHF1ZXVlICdtTXV0ZXgnIGlzIG5vdCBoZWxkIHdoaWNoIG1ha2VzIHRoZSByZW1vdmFsIG9mCisgICAgLy8ib3V0cHV0IiBwb3NzaWJsZS4gQ2hlY2sgd2hldGhlciB0aGlzIGlzIHRoZSBjYXNlIGFuZCByZXR1cm4uCisgICAgaWYgKG1PdXRwdXRTbG90c1tvdXRwdXRdID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBpZiAocmVzICE9IE5PX0lOSVQgJiYgcmVzICE9IERFQURfT0JKRUNUKSB7CiAgICAgICAgICAgICBTUF9MT0dFKCJRdWV1aW5nIGJ1ZmZlciB0byBvdXRwdXQgZmFpbGVkICglZCkiLCByZXMpOwpAQCAtMjUwLDcgKzM1Niw3IEBACiAgICAgICAgIC8vIHRoYXQsIGluY3JlbWVudCB0aGUgcmVsZWFzZSBjb3VudCBzbyB0aGF0IHdlIHN0aWxsIHJlbGVhc2UgdGhpcwogICAgICAgICAvLyBidWZmZXIgZXZlbnR1YWxseSwgYW5kIG1vdmUgb24gdG8gdGhlIG5leHQgb3V0cHV0CiAgICAgICAgIG9uQWJhbmRvbmVkTG9ja2VkKCk7Ci0gICAgICAgIGRlY3JlbWVudEJ1ZlJlZkNvdW50TG9ja2VkKGJ1ZmZlckl0ZW0ubUdyYXBoaWNCdWZmZXItPmdldElkKCksIG91dHB1dCk7CisgICAgICAgIGRlY3JlbWVudEJ1ZlJlZkNvdW50TG9ja2VkKGJ1ZmZlckl0ZW0ubUdyYXBoaWNCdWZmZXItPmdldElkKCksIHN1cmZhY2VJZCk7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCkBAIC0yNTgsNyArMzY0LDcgQEAKICAgICAvLyBxdWV1ZSwgbm8gb25CdWZmZXJSZWxlYXNlZCBpcyBjYWxsZWQgYnkgdGhlIGJ1ZmZlciBxdWV1ZS4KICAgICAvLyBQcm9hY3RpdmVseSB0cmlnZ2VyIHRoZSBjYWxsYmFjayB0byBhdm9pZCBidWZmZXIgbG9zcy4KICAgICBpZiAocXVldWVPdXRwdXQuYnVmZmVyUmVwbGFjZWQpIHsKLSAgICAgICAgb25CdWZmZXJSZWxlYXNlZEJ5T3V0cHV0TG9ja2VkKG91dHB1dCk7CisgICAgICAgIG9uQnVmZmVyUmVwbGFjZWRMb2NrZWQob3V0cHV0LCBzdXJmYWNlSWQpOwogICAgIH0KIAogICAgIHJldHVybiByZXM7CkBAIC0yNzEsNyArMzc3LDYgQEAKIAogc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbVNwbGl0dGVyOjpub3RpZnlCdWZmZXJSZWxlYXNlZChjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKLSAgICBzdGF0dXNfdCByZXMgPSBPSzsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CiAKQEAgLTI3OSwxNyArMzg0LDcgQEAKICAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyVHJhY2tlcj4gdHJhY2tlcl9wdHIgPSBzdGQ6Om1vdmUobUJ1ZmZlcnNbYnVmZmVySWRdKTsKICAgICBtQnVmZmVycy5lcmFzZShidWZmZXJJZCk7CiAKLSAgICBmb3IgKGNvbnN0IGF1dG8gc3VyZmFjZSA6IHRyYWNrZXJfcHRyLT5yZXF1ZXN0ZWRTdXJmYWNlcygpKSB7Ci0gICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAgPSBtT3V0cHV0c1tzdXJmYWNlXTsKLSAgICAgICAgT3V0cHV0U2xvdHMmIG91dHB1dFNsb3RzID0gKihtT3V0cHV0U2xvdHNbZ2JwXSk7Ci0gICAgICAgIGludCBzbG90ID0gZ2V0U2xvdEZvck91dHB1dExvY2tlZChnYnAsIGJ1ZmZlcik7Ci0gICAgICAgIGlmIChzbG90ICE9IEJ1ZmZlckl0ZW06OklOVkFMSURfQlVGRkVSX1NMT1QpIHsKLSAgICAgICAgICAgICBnYnAtPmRldGFjaEJ1ZmZlcihzbG90KTsKLSAgICAgICAgICAgICBvdXRwdXRTbG90c1tzbG90XS5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlczsKKyAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IENhbWVyYTNTdHJlYW1TcGxpdHRlcjo6YXR0YWNoQnVmZmVyVG9PdXRwdXRzKEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYiwKQEAgLTMwNyw3ICs0MDIsMTUgQEAKIAogICAgIGZvciAoYXV0byYgc3VyZmFjZV9pZCA6IHN1cmZhY2VfaWRzKSB7CiAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAgPSBtT3V0cHV0c1tzdXJmYWNlX2lkXTsKLSAgICAgICAgaW50IHNsb3QgPSBCdWZmZXJJdGVtOjpJTlZBTElEX0JVRkZFUl9TTE9UOworICAgICAgICBpZiAoZ2JwLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vT3V0cHV0IHN1cmZhY2UgZ290IGxpa2VseSByZW1vdmVkIGJ5IGNsaWVudC4KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGludCBzbG90ID0gZ2V0U2xvdEZvck91dHB1dExvY2tlZChnYnAsIGdiKTsKKyAgICAgICAgaWYgKHNsb3QgIT0gQnVmZmVySXRlbTo6SU5WQUxJRF9CVUZGRVJfU0xPVCkgeworICAgICAgICAgICAgLy9CdWZmZXIgaXMgYWxyZWFkeSBhdHRhY2hlZCB0byB0aGlzIG91dHB1dCBzdXJmYWNlLgorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KICAgICAgICAgLy9UZW1wb3Jhcmx5IFVubG9jayB0aGUgbXV0ZXggd2hlbiB0cnlpbmcgdG8gYXR0YWNoQnVmZmVyIHRvIHRoZSBvdXRwdXQKICAgICAgICAgLy9xdWV1ZSwgYmVjYXVzZSBhdHRhY2hCdWZmZXIgY291bGQgYmxvY2sgaW4gY2FzZSBvZiBhIHNsb3cgY29uc3VtZXIuIElmCiAgICAgICAgIC8vd2UgYmxvY2sgd2hpbGUgaG9sZGluZyB0aGUgbG9jaywgb25GcmFtZUF2YWlsYWJsZSBhbmQgb25CdWZmZXJSZWxlYXNlZApAQCAtMzIwLDEyICs0MjMsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBnYnAuZ2V0KCksIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQorICAgICAgICBpZiAoKHNsb3QgPCAwKSB8fCAoc2xvdCA+IEJ1ZmZlclF1ZXVlOjpOVU1fQlVGRkVSX1NMT1RTKSkgeworICAgICAgICAgICAgU1BfTE9HRSgiJXM6IFNsb3QgcmVjZWl2ZWQgJWQgZWl0aGVyIGJpZ2dlciB0aGFuIGV4cGVjdGVkIG1heGltdW0gJWQgb3IgbmVnYXRpdmUhIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzbG90LCBCdWZmZXJRdWV1ZTo6TlVNX0JVRkZFUl9TTE9UUyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIC8vRHVyaW5nIGJ1ZmZlciBhdHRhY2ggJ21NdXRleCcgaXMgbm90IGhlbGQgd2hpY2ggbWFrZXMgdGhlIHJlbW92YWwgb2YKKyAgICAgICAgLy8iZ2JwIiBwb3NzaWJsZS4gQ2hlY2sgd2hldGhlciB0aGlzIGlzIHRoZSBjYXNlIGFuZCBjb250aW51ZS4KKyAgICAgICAgaWYgKG1PdXRwdXRTbG90c1tnYnBdID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAgICAgICAgIGF1dG8mIG91dHB1dFNsb3RzID0gKm1PdXRwdXRTbG90c1tnYnBdOworICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PiAoc2xvdCArIDEpID4gb3V0cHV0U2xvdHMuc2l6ZSgpKSB7CisgICAgICAgICAgICBvdXRwdXRTbG90cy5yZXNpemUoc2xvdCArIDEpOworICAgICAgICB9CiAgICAgICAgIGlmIChvdXRwdXRTbG90c1tzbG90XSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAvLyBJZiB0aGUgYnVmZmVyIGlzIGF0dGFjaGVkIHRvIGEgc2xvdCB3aGljaCBhbHJlYWR5IGNvbnRhaW5zIGEgYnVmZmVyLAogICAgICAgICAgICAgLy8gdGhlIHByZXZpb3VzIGJ1ZmZlciB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgb3V0cHV0IHF1ZXVlLiBEZWNyZW1lbnQKICAgICAgICAgICAgIC8vIHRoZSByZWZlcmVuY2UgY291bnQgYWNjb3JkaW5nbHkuCi0gICAgICAgICAgICBkZWNyZW1lbnRCdWZSZWZDb3VudExvY2tlZChvdXRwdXRTbG90c1tzbG90XS0+Z2V0SWQoKSwgZ2JwKTsKKyAgICAgICAgICAgIGRlY3JlbWVudEJ1ZlJlZkNvdW50TG9ja2VkKG91dHB1dFNsb3RzW3Nsb3RdLT5nZXRJZCgpLCBzdXJmYWNlX2lkKTsKICAgICAgICAgfQogICAgICAgICBTUF9MT0dWKCIlczogQXR0YWNoZWQgYnVmZmVyICVwIHRvIHNsb3QgJWQgb24gb3V0cHV0ICVwLiIsX19GVU5DVElPTl9fLCBnYi5nZXQoKSwKICAgICAgICAgICAgICAgICBzbG90LCBnYnAuZ2V0KCkpOwpAQCAtMzQ5LDcgKzQ2NSwyMSBAQAogICAgICAgICBtT25GcmFtZUF2YWlsYWJsZVJlcy5zdG9yZShyZXMpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGlmIChtQnVmZmVycy5maW5kKGJ1ZmZlckl0ZW0ubUdyYXBoaWNCdWZmZXItPmdldElkKCkpID09IG1CdWZmZXJzLmVuZCgpKSB7CisKKyAgICB1aW50NjRfdCBidWZmZXJJZDsKKyAgICBpZiAoYnVmZmVySXRlbS5tR3JhcGhpY0J1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgIG1JbnB1dFNsb3RzW2J1ZmZlckl0ZW0ubVNsb3RdID0gYnVmZmVySXRlbTsKKyAgICB9IGVsc2UgaWYgKGJ1ZmZlckl0ZW0ubUFjcXVpcmVDYWxsZWQpIHsKKyAgICAgICAgYnVmZmVySXRlbS5tR3JhcGhpY0J1ZmZlciA9IG1JbnB1dFNsb3RzW2J1ZmZlckl0ZW0ubVNsb3RdLm1HcmFwaGljQnVmZmVyOworICAgICAgICBtSW5wdXRTbG90c1tidWZmZXJJdGVtLm1TbG90XS5tRnJhbWVOdW1iZXIgPSBidWZmZXJJdGVtLm1GcmFtZU51bWJlcjsKKyAgICB9IGVsc2UgeworICAgICAgICBTUF9MT0dFKCIlczogSW52YWxpZCBpbnB1dCBncmFwaGljIGJ1ZmZlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXMgPSBCQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYnVmZmVySWQgPSBidWZmZXJJdGVtLm1HcmFwaGljQnVmZmVyLT5nZXRJZCgpOworCisgICAgaWYgKG1CdWZmZXJzLmZpbmQoYnVmZmVySWQpID09IG1CdWZmZXJzLmVuZCgpKSB7CiAgICAgICAgIFNQX0xPR0UoIiVzOiBBY3F1aXJlZCBidWZmZXIgZG9lc24ndCBleGlzdCBpbiBhdHRhY2hlZCBidWZmZXIgbWFwIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwogICAgICAgICBtT25GcmFtZUF2YWlsYWJsZVJlcy5zdG9yZShJTlZBTElEX09QRVJBVElPTik7CkBAIC0zNTksMjQgKzQ4OSwxOSBAQAogICAgIFNQX0xPR1YoImFjcXVpcmVkIGJ1ZmZlciAlIiBQUklkNjQgIiBmcm9tIGlucHV0IGF0IHNsb3QgJWQiLAogICAgICAgICAgICAgYnVmZmVySXRlbS5tR3JhcGhpY0J1ZmZlci0+Z2V0SWQoKSwgYnVmZmVySXRlbS5tU2xvdCk7CiAKLSAgICByZXMgPSBtQ29uc3VtZXItPmRldGFjaEJ1ZmZlcihidWZmZXJJdGVtLm1TbG90KTsKLSAgICBpZiAocmVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIFNQX0xPR0UoIiVzOiBkZXRhY2hpbmcgYnVmZmVyIGZyb20gaW5wdXQgZmFpbGVkICglZCkiLCBfX0ZVTkNUSU9OX18sIHJlcyk7Ci0gICAgICAgIG1PbkZyYW1lQXZhaWxhYmxlUmVzLnN0b3JlKHJlcyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KICAgICAvLyBBdHRhY2ggYW5kIHF1ZXVlIHRoZSBidWZmZXIgdG8gZWFjaCBvZiB0aGUgb3V0cHV0cwotICAgIEJ1ZmZlclRyYWNrZXImIHRyYWNrZXIgPSAqKG1CdWZmZXJzW2J1ZmZlckl0ZW0ubUdyYXBoaWNCdWZmZXItPmdldElkKCldKTsKKyAgICBCdWZmZXJUcmFja2VyJiB0cmFja2VyID0gKihtQnVmZmVyc1tidWZmZXJJZF0pOwogCiAgICAgU1BfTE9HVigiJXM6IEJ1ZmZlclRyYWNrZXIgZm9yIGJ1ZmZlciAlIiBQUklkNjQgIiwgbnVtYmVyIG9mIHJlcXVlc3RzICV6dSIsCiAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmZmVySXRlbS5tR3JhcGhpY0J1ZmZlci0+Z2V0SWQoKSwgdHJhY2tlci5yZXF1ZXN0ZWRTdXJmYWNlcygpLnNpemUoKSk7CiAgICAgZm9yIChjb25zdCBhdXRvIGlkIDogdHJhY2tlci5yZXF1ZXN0ZWRTdXJmYWNlcygpKSB7CiAKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpZCA+PSBtT3V0cHV0cy5zaXplKCksCi0gICAgICAgICAgICAgICAgInJlcXVlc3RlZCBzdXJmYWNlIGlkIGV4Y2VlZGluZyBtYXggcmVnaXN0ZXJlZCBpZHMiKTsKKyAgICAgICAgaWYgKG1PdXRwdXRzW2lkXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAvL091dHB1dCBzdXJmYWNlIGdvdCBsaWtlbHkgcmVtb3ZlZCBieSBjbGllbnQuCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0gICAgICAgIHJlcyA9IG91dHB1dEJ1ZmZlckxvY2tlZChtT3V0cHV0c1tpZF0sIGJ1ZmZlckl0ZW0pOworICAgICAgICByZXMgPSBvdXRwdXRCdWZmZXJMb2NrZWQobU91dHB1dHNbaWRdLCBidWZmZXJJdGVtLCBpZCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIFNQX0xPR0UoIiVzOiBvdXRwdXRCdWZmZXJMb2NrZWQgZmFpbGVkICVkIiwgX19GVU5DVElPTl9fLCByZXMpOwogICAgICAgICAgICAgbU9uRnJhbWVBdmFpbGFibGVSZXMuc3RvcmUocmVzKTsKQEAgLTM4OSwxMiArNTE0LDE0IEBACiAgICAgbU9uRnJhbWVBdmFpbGFibGVSZXMuc3RvcmUocmVzKTsKIH0KIAotdm9pZCBDYW1lcmEzU3RyZWFtU3BsaXR0ZXI6OmRlY3JlbWVudEJ1ZlJlZkNvdW50TG9ja2VkKHVpbnQ2NF90IGlkLAotICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgZnJvbSkgewordm9pZCBDYW1lcmEzU3RyZWFtU3BsaXR0ZXI6OmRlY3JlbWVudEJ1ZlJlZkNvdW50TG9ja2VkKHVpbnQ2NF90IGlkLCBzaXplX3Qgc3VyZmFjZUlkKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKLSAgICBzaXplX3QgcmVmZXJlbmNlQ291bnQgPSBtQnVmZmVyc1tpZF0tPmRlY3JlbWVudFJlZmVyZW5jZUNvdW50TG9ja2VkKCk7CiAKLSAgICByZW1vdmVTbG90Rm9yT3V0cHV0TG9ja2VkKGZyb20sIG1CdWZmZXJzW2lkXS0+Z2V0QnVmZmVyKCkpOworICAgIGlmIChtQnVmZmVyc1tpZF0gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IHJlZmVyZW5jZUNvdW50ID0gbUJ1ZmZlcnNbaWRdLT5kZWNyZW1lbnRSZWZlcmVuY2VDb3VudExvY2tlZChzdXJmYWNlSWQpOwogICAgIGlmIChyZWZlcmVuY2VDb3VudCA+IDApIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTQwNywxNCArNTM0LDI4IEBACiAgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclRyYWNrZXI+IHRyYWNrZXJfcHRyID0gc3RkOjptb3ZlKG1CdWZmZXJzW2lkXSk7CiAgICAgbUJ1ZmZlcnMuZXJhc2UoaWQpOwogCi0gICAgLy8gQXR0YWNoIGFuZCByZWxlYXNlIHRoZSBidWZmZXIgYmFjayB0byB0aGUgaW5wdXQKLSAgICBpbnQgY29uc3VtZXJTbG90ID0gQnVmZmVySXRlbTo6SU5WQUxJRF9CVUZGRVJfU0xPVDsKLSAgICBzdGF0dXNfdCByZXMgPSBtQ29uc3VtZXItPmF0dGFjaEJ1ZmZlcigmY29uc3VtZXJTbG90LCB0cmFja2VyX3B0ci0+Z2V0QnVmZmVyKCkpOwotICAgIGlmIChyZXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgU1BfTE9HRSgiJXM6IGF0dGFjaGluZyBidWZmZXIgdG8gaW5wdXQgZmFpbGVkICglZCkiLCBfX0ZVTkNUSU9OX18sIHJlcyk7CisgICAgdWludDY0X3QgYnVmZmVySWQgPSB0cmFja2VyX3B0ci0+Z2V0QnVmZmVyKCktPmdldElkKCk7CisgICAgaW50IGNvbnN1bWVyU2xvdCA9IC0xOworICAgIHVpbnQ2NF90IGZyYW1lTnVtYmVyOworICAgIGF1dG8gaW5wdXRTbG90ID0gbUlucHV0U2xvdHMuYmVnaW4oKTsKKyAgICBmb3IgKDsgaW5wdXRTbG90ICE9IG1JbnB1dFNsb3RzLmVuZCgpOyBpbnB1dFNsb3QrKykgeworICAgICAgICBpZiAoaW5wdXRTbG90LT5zZWNvbmQubUdyYXBoaWNCdWZmZXItPmdldElkKCkgPT0gYnVmZmVySWQpIHsKKyAgICAgICAgICAgIGNvbnN1bWVyU2xvdCA9IGlucHV0U2xvdC0+c2Vjb25kLm1TbG90OworICAgICAgICAgICAgZnJhbWVOdW1iZXIgPSBpbnB1dFNsb3QtPnNlY29uZC5tRnJhbWVOdW1iZXI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY29uc3VtZXJTbG90ID09IC0xKSB7CisgICAgICAgIFNQX0xPR0UoIiVzOiBCdWZmZXIgbWlzc2luZyBpbnNpZGUgaW5wdXQgc2xvdHMhIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIGF1dG8gZGV0YWNoQnVmZmVyID0gbURldGFjaGVkQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICBib29sIGRldGFjaCA9IChkZXRhY2hCdWZmZXIgIT0gbURldGFjaGVkQnVmZmVycy5lbmQoKSk7CisgICAgaWYgKGRldGFjaCkgeworICAgICAgICBtRGV0YWNoZWRCdWZmZXJzLmVyYXNlKGRldGFjaEJ1ZmZlcik7CisgICAgICAgIG1JbnB1dFNsb3RzLmVyYXNlKGlucHV0U2xvdCk7CisgICAgfQogICAgIC8vIFRlbXBvcmFyaWx5IHVubG9jayBtdXRleCB0byBhdm9pZCBjaXJjdWxhciBsb2NrOgogICAgIC8vIDEuIFRoaXMgZnVuY3Rpb24gaG9sZHMgc3BsaXR0ZXIgbG9jaywgY2FsbHMgcmVsZWFzZUJ1ZmZlciB3aGljaCB0cmlnZ2VycwogICAgIC8vIG9uQnVmZmVyUmVsZWFzZWQgaW4gQ2FtZXJhM091dHB1dFN0cmVhbS4gb25CdWZmZXJSZWxlYXNlZCB3YWl0cyBvbiB0aGUKQEAgLTQyNCw1NyArNTY1LDEyNiBAQAogICAgIC8vIHNwbGl0dGVyIGxvY2suCiAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXIobUNvbnN1bWVyKTsKICAgICBtTXV0ZXgudW5sb2NrKCk7CisgICAgaW50IHJlcyA9IE5PX0VSUk9SOwogICAgIGlmIChjb25zdW1lciAhPSBudWxscHRyKSB7Ci0gICAgICAgIHJlcyA9IGNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKGNvbnN1bWVyU2xvdCwgLyogZnJhbWVOdW1iZXIgKi8gMCwKLSAgICAgICAgICAgICAgICBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NZTkNfS0hSLCB0cmFja2VyX3B0ci0+Z2V0TWVyZ2VkRmVuY2UoKSk7CisgICAgICAgIGlmIChkZXRhY2gpIHsKKyAgICAgICAgICAgIHJlcyA9IGNvbnN1bWVyLT5kZXRhY2hCdWZmZXIoY29uc3VtZXJTbG90KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IGNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKGNvbnN1bWVyU2xvdCwgZnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgIEVHTF9OT19ESVNQTEFZLCBFR0xfTk9fU1lOQ19LSFIsIHRyYWNrZXJfcHRyLT5nZXRNZXJnZWRGZW5jZSgpKTsKKyAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIFNQX0xPR0UoIiVzOiBjb25zdW1lciBoYXMgYmVjb21lIG51bGwhIiwgX19GVU5DVElPTl9fKTsKICAgICB9CiAgICAgbU11dGV4LmxvY2soKTsKLSAgICAvLyBJZiB0aGUgcHJvZHVjZXIgb2YgdGhpcyBxdWV1ZSBpcyBkaXNjb25uZWN0ZWQsIC0yMiBlcnJvciB3aWxsIG9jY3VyCisKICAgICBpZiAocmVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIFNQX0xPR0UoIiVzOiByZWxlYXNlQnVmZmVyIHJldHVybnMgJWQiLCBfX0ZVTkNUSU9OX18sIHJlcyk7CisgICAgICAgIGlmIChkZXRhY2gpIHsKKyAgICAgICAgICAgIFNQX0xPR0UoIiVzOiBkZXRhY2hCdWZmZXIgcmV0dXJucyAlZCIsIF9fRlVOQ1RJT05fXywgcmVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNQX0xPR0UoIiVzOiByZWxlYXNlQnVmZmVyIHJldHVybnMgJWQiLCBfX0ZVTkNUSU9OX18sIHJlcyk7CisgICAgICAgIH0KICAgICB9CiB9CiAKIHZvaWQgQ2FtZXJhM1N0cmVhbVNwbGl0dGVyOjpvbkJ1ZmZlclJlbGVhc2VkQnlPdXRwdXQoCiAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBmcm9tKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotCi0gICAgb25CdWZmZXJSZWxlYXNlZEJ5T3V0cHV0TG9ja2VkKGZyb20pOwotfQotCi12b2lkIENhbWVyYTNTdHJlYW1TcGxpdHRlcjo6b25CdWZmZXJSZWxlYXNlZEJ5T3V0cHV0TG9ja2VkKAotICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgZnJvbSkgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmZmVyOwogICAgIHNwPEZlbmNlPiBmZW5jZTsKLSAgICBzdGF0dXNfdCByZXMgPSBmcm9tLT5kZXRhY2hOZXh0QnVmZmVyKCZidWZmZXIsICZmZW5jZSk7Ci0gICAgaWYgKHJlcyA9PSBOT19JTklUKSB7Ci0gICAgICAgIC8vIElmIHdlIGp1c3QgZGlzY292ZXJlZCB0aGF0IHRoaXMgb3V0cHV0IGhhcyBiZWVuIGFiYW5kb25lZCwgbm90ZSB0aGF0LAotICAgICAgICAvLyBidXQgd2UgY2FuJ3QgZG8gYW55dGhpbmcgZWxzZSwgc2luY2UgYnVmZmVyIGlzIGludmFsaWQKLSAgICAgICAgb25BYmFuZG9uZWRMb2NrZWQoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAocmVzID09IE5PX01FTU9SWSkgewotICAgICAgICBTUF9MT0dWKCIlczogTm8gZnJlZSBidWZmZXJzIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIFNQX0xPR0UoIiVzOiBkZXRhY2hpbmcgYnVmZmVyIGZyb20gb3V0cHV0IGZhaWxlZCAoJWQpIiwgX19GVU5DVElPTl9fLCByZXMpOworCisgICAgaW50IHNsb3QgPSBCdWZmZXJJdGVtOjpJTlZBTElEX0JVRkZFUl9TTE9UOworICAgIGF1dG8gcmVzID0gZnJvbS0+ZGVxdWV1ZUJ1ZmZlcigmc2xvdCwgJmZlbmNlLCBtV2lkdGgsIG1IZWlnaHQsIG1Gb3JtYXQsIG1Qcm9kdWNlclVzYWdlLAorICAgICAgICAgICAgbnVsbHB0ciwgbnVsbHB0cik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKKyAgICBoYW5kbGVPdXRwdXREZXF1ZXVlU3RhdHVzTG9ja2VkKHJlcywgc2xvdCk7CisgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgc2l6ZV90IHN1cmZhY2VJZCA9IDA7CisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiBtT3V0cHV0cykgeworICAgICAgICBpZiAoaXQuc2Vjb25kID09IGZyb20pIHsKKyAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIHN1cmZhY2VJZCA9IGl0LmZpcnN0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFmb3VuZCkgeworICAgICAgICBTUF9MT0dWKCIlczogb3V0cHV0IHN1cmZhY2Ugbm90IHJlZ2lzdGVyZWQgYW55bW9yZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcmV0dXJuT3V0cHV0QnVmZmVyTG9ja2VkKGZlbmNlLCBmcm9tLCBzdXJmYWNlSWQsIHNsb3QpOworfQorCit2b2lkIENhbWVyYTNTdHJlYW1TcGxpdHRlcjo6b25CdWZmZXJSZXBsYWNlZExvY2tlZCgKKyAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGZyb20sIHNpemVfdCBzdXJmYWNlSWQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIHNwPEZlbmNlPiBmZW5jZTsKKworICAgIGludCBzbG90ID0gQnVmZmVySXRlbTo6SU5WQUxJRF9CVUZGRVJfU0xPVDsKKyAgICBhdXRvIHJlcyA9IGZyb20tPmRlcXVldWVCdWZmZXIoJnNsb3QsICZmZW5jZSwgbVdpZHRoLCBtSGVpZ2h0LCBtRm9ybWF0LCBtUHJvZHVjZXJVc2FnZSwKKyAgICAgICAgICAgIG51bGxwdHIsIG51bGxwdHIpOworICAgIGhhbmRsZU91dHB1dERlcXVldWVTdGF0dXNMb2NrZWQocmVzLCBzbG90KTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByZXR1cm5PdXRwdXRCdWZmZXJMb2NrZWQoZmVuY2UsIGZyb20sIHN1cmZhY2VJZCwgc2xvdCk7Cit9CisKK3ZvaWQgQ2FtZXJhM1N0cmVhbVNwbGl0dGVyOjpyZXR1cm5PdXRwdXRCdWZmZXJMb2NrZWQoY29uc3Qgc3A8RmVuY2U+JiBmZW5jZSwKKyAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGZyb20sIHNpemVfdCBzdXJmYWNlSWQsIGludCBzbG90KSB7CisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmZmVyOworCisgICAgaWYgKG1PdXRwdXRTbG90c1tmcm9tXSA9PSBudWxscHRyKSB7CisgICAgICAgIC8vT3V0cHV0IHN1cmZhY2UgZ290IGxpa2VseSByZW1vdmVkIGJ5IGNsaWVudC4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gb3V0cHV0U2xvdHMgPSAqbU91dHB1dFNsb3RzW2Zyb21dOworICAgIGJ1ZmZlciA9IG91dHB1dFNsb3RzW3Nsb3RdOwogICAgIEJ1ZmZlclRyYWNrZXImIHRyYWNrZXIgPSAqKG1CdWZmZXJzW2J1ZmZlci0+Z2V0SWQoKV0pOwogICAgIC8vIE1lcmdlIHRoZSByZWxlYXNlIGZlbmNlIG9mIHRoZSBpbmNvbWluZyBidWZmZXIgc28gdGhhdCB0aGUgZmVuY2Ugd2Ugc2VuZAogICAgIC8vIGJhY2sgdG8gdGhlIGlucHV0IGluY2x1ZGVzIGFsbCBvZiB0aGUgb3V0cHV0cycgZmVuY2VzCiAgICAgaWYgKGZlbmNlICE9IG51bGxwdHIgJiYgZmVuY2UtPmlzVmFsaWQoKSkgewogICAgICAgICB0cmFja2VyLm1lcmdlRmVuY2UoZmVuY2UpOwogICAgIH0KLSAgICBTUF9MT0dWKCJkZXRhY2hlZCBidWZmZXIgJSIgUFJJZDY0ICIgJXAgZnJvbSBvdXRwdXQgJXAiLAotICAgICAgICAgICAgYnVmZmVyLT5nZXRJZCgpLCBidWZmZXIuZ2V0KCksIGZyb20uZ2V0KCkpOworCisgICAgYXV0byBkZXRhY2hCdWZmZXIgPSBtRGV0YWNoZWRCdWZmZXJzLmZpbmQoYnVmZmVyLT5nZXRJZCgpKTsKKyAgICBib29sIGRldGFjaCA9IChkZXRhY2hCdWZmZXIgIT0gbURldGFjaGVkQnVmZmVycy5lbmQoKSk7CisgICAgaWYgKGRldGFjaCkgeworICAgICAgICBhdXRvIHJlcyA9IGZyb20tPmRldGFjaEJ1ZmZlcihzbG90KTsKKyAgICAgICAgaWYgKHJlcyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgb3V0cHV0U2xvdHNbc2xvdF0gPSBudWxscHRyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU1BfTE9HRSgiJXM6IGRldGFjaCBidWZmZXIgZnJvbSBvdXRwdXQgZmFpbGVkICglZCkiLCBfX0ZVTkNUSU9OX18sIHJlcyk7CisgICAgICAgIH0KKyAgICB9CiAKICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyB0aGUgbGFzdCBvdXRzdGFuZGluZyByZWZlcmVuY2UgdG8gdGhpcyBidWZmZXIKLSAgICBkZWNyZW1lbnRCdWZSZWZDb3VudExvY2tlZChidWZmZXItPmdldElkKCksIGZyb20pOworICAgIGRlY3JlbWVudEJ1ZlJlZkNvdW50TG9ja2VkKGJ1ZmZlci0+Z2V0SWQoKSwgc3VyZmFjZUlkKTsKK30KKwordm9pZCBDYW1lcmEzU3RyZWFtU3BsaXR0ZXI6OmhhbmRsZU91dHB1dERlcXVldWVTdGF0dXNMb2NrZWQoc3RhdHVzX3QgcmVzLCBpbnQgc2xvdCkgeworICAgIGlmIChyZXMgPT0gTk9fSU5JVCkgeworICAgICAgICAvLyBJZiB3ZSBqdXN0IGRpc2NvdmVyZWQgdGhhdCB0aGlzIG91dHB1dCBoYXMgYmVlbiBhYmFuZG9uZWQsIG5vdGUgdGhhdCwKKyAgICAgICAgLy8gYnV0IHdlIGNhbid0IGRvIGFueXRoaW5nIGVsc2UsIHNpbmNlIGJ1ZmZlciBpcyBpbnZhbGlkCisgICAgICAgIG9uQWJhbmRvbmVkTG9ja2VkKCk7CisgICAgfSBlbHNlIGlmIChyZXMgPT0gSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6QlVGRkVSX05FRURTX1JFQUxMT0NBVElPTikgeworICAgICAgICBTUF9MT0dFKCIlczogUHJvZHVjZXIgbmVlZHMgdG8gcmUtYWxsb2NhdGUgYnVmZmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIFNQX0xPR0UoIiVzOiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIHdpdGggYnVmZmVyIGFsbG9jYXRpb24gZGlzYWJsZWQhIiwgX19GVU5DVElPTl9fKTsKKyAgICB9IGVsc2UgaWYgKHJlcyA9PSBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpSRUxFQVNFX0FMTF9CVUZGRVJTKSB7CisgICAgICAgIFNQX0xPR0UoIiVzOiBBbGwgc2xvdC0+YnVmZmVyIG1hcHBpbmcgc2hvdWxkIGJlIHJlbGVhc2VkISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIFNQX0xPR0UoIiVzOiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIHdpdGggYnVmZmVyIGFsbG9jYXRpb24gZGlzYWJsZWQhIiwgX19GVU5DVElPTl9fKTsKKyAgICB9IGVsc2UgaWYgKHJlcyA9PSBOT19NRU1PUlkpIHsKKyAgICAgICAgU1BfTE9HRSgiJXM6IE5vIGZyZWUgYnVmZmVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgfSBlbHNlIGlmIChyZXMgPT0gV09VTERfQkxPQ0spIHsKKyAgICAgICAgU1BfTE9HRSgiJXM6IERlcXVldWUgY2FsbCB3aWxsIGJsb2NrIiwgX19GVU5DVElPTl9fKTsKKyAgICB9IGVsc2UgaWYgKHJlcyAhPSBPSyB8fCAoc2xvdCA9PSBCdWZmZXJJdGVtOjpJTlZBTElEX0JVRkZFUl9TTE9UKSkgeworICAgICAgICBTUF9MT0dFKCIlczogZGVxdWV1ZSBidWZmZXIgZnJvbSBvdXRwdXQgZmFpbGVkICglZCkiLCBfX0ZVTkNUSU9OX18sIHJlcyk7CisgICAgfQogfQogCiB2b2lkIENhbWVyYTNTdHJlYW1TcGxpdHRlcjo6b25BYmFuZG9uZWRMb2NrZWQoKSB7CkBAIC01MDEsMjcgKzcxMSwxMSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgU1BfTE9HRSgiJXM6IENhbm5vdCBmaW5kIHNsb3QgZm9yIGdiICVwIG9uIG91dHB1dCAlcCIsIF9fRlVOQ1RJT05fXywgZ2IuZ2V0KCksCisgICAgU1BfTE9HVigiJXM6IENhbm5vdCBmaW5kIHNsb3QgZm9yIGdiICVwIG9uIG91dHB1dCAlcCIsIF9fRlVOQ1RJT05fXywgZ2IuZ2V0KCksCiAgICAgICAgICAgICBnYnAuZ2V0KCkpOwogICAgIHJldHVybiBCdWZmZXJJdGVtOjpJTlZBTElEX0JVRkZFUl9TTE9UOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzU3RyZWFtU3BsaXR0ZXI6OnJlbW92ZVNsb3RGb3JPdXRwdXRMb2NrZWQoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGdicCwKLSAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGdiKSB7Ci0gICAgYXV0byYgb3V0cHV0U2xvdHMgPSAqbU91dHB1dFNsb3RzW2dicF07Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dFNsb3RzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChvdXRwdXRTbG90c1tpXSA9PSBnYikgewotICAgICAgICAgICBvdXRwdXRTbG90c1tpXS5jbGVhcigpOwotICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBTUF9MT0dFKCIlczogQ2Fubm90IGZpbmQgc2xvdCBmb3IgZ2IgJXAgb24gb3V0cHV0ICVwIiwgX19GVU5DVElPTl9fLCBnYi5nZXQoKSwKLSAgICAgICAgICAgIGdicC5nZXQoKSk7Ci0gICAgcmV0dXJuIEJBRF9WQUxVRTsKLX0KLQogQ2FtZXJhM1N0cmVhbVNwbGl0dGVyOjpPdXRwdXRMaXN0ZW5lcjo6T3V0cHV0TGlzdGVuZXIoCiAgICAgICAgIHdwPENhbWVyYTNTdHJlYW1TcGxpdHRlcj4gc3BsaXR0ZXIsCiAgICAgICAgIHdwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG91dHB1dCkKQEAgLTU1Myw3ICs3NDcsMTQgQEAKICAgICBtTWVyZ2VkRmVuY2UgPSBGZW5jZTo6bWVyZ2UoU3RyaW5nOCgiQ2FtZXJhM1N0cmVhbVNwbGl0dGVyIiksIG1NZXJnZWRGZW5jZSwgd2l0aCk7CiB9CiAKLXNpemVfdCBDYW1lcmEzU3RyZWFtU3BsaXR0ZXI6OkJ1ZmZlclRyYWNrZXI6OmRlY3JlbWVudFJlZmVyZW5jZUNvdW50TG9ja2VkKCkgeworc2l6ZV90IENhbWVyYTNTdHJlYW1TcGxpdHRlcjo6QnVmZmVyVHJhY2tlcjo6ZGVjcmVtZW50UmVmZXJlbmNlQ291bnRMb2NrZWQoc2l6ZV90IHN1cmZhY2VJZCkgeworICAgIGNvbnN0IGF1dG8mIGl0ID0gc3RkOjpmaW5kKG1SZXF1ZXN0ZWRTdXJmYWNlcy5iZWdpbigpLCBtUmVxdWVzdGVkU3VyZmFjZXMuZW5kKCksIHN1cmZhY2VJZCk7CisgICAgaWYgKGl0ID09IG1SZXF1ZXN0ZWRTdXJmYWNlcy5lbmQoKSkgeworICAgICAgICByZXR1cm4gbVJlZmVyZW5jZUNvdW50OworICAgIH0gZWxzZSB7CisgICAgICAgIG1SZXF1ZXN0ZWRTdXJmYWNlcy5lcmFzZShpdCk7CisgICAgfQorCiAgICAgaWYgKG1SZWZlcmVuY2VDb3VudCA+IDApCiAgICAgICAgIC0tbVJlZmVyZW5jZUNvdW50OwogICAgIHJldHVybiBtUmVmZXJlbmNlQ291bnQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuaAppbmRleCAzYjg4MzllLi5mZWExYmRiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmgKQEAgLTE3LDYgKzE3LDggQEAKICNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX1NUUkVBTVNQTElUVEVSX0gKICNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX1NUUkVBTVNQTElUVEVSX0gKIAorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKICNpbmNsdWRlIDxndWkvSUNvbnN1bWVyTGlzdGVuZXIuaD4KICNpbmNsdWRlIDxndWkvSVByb2R1Y2VyTGlzdGVuZXIuaD4KICNpbmNsdWRlIDxndWkvQnVmZmVySXRlbUNvbnN1bWVyLmg+CkBAIC01MSwyMiArNTMsMjUgQEAKIAogICAgIC8vIENvbm5lY3QgdG8gdGhlIHN0cmVhbSBzcGxpdHRlciBieSBjcmVhdGluZyBidWZmZXIgcXVldWUgYW5kIGNvbm5lY3RpbmcgaXQKICAgICAvLyB3aXRoIG91dHB1dCBzdXJmYWNlcy4KLSAgICBzdGF0dXNfdCBjb25uZWN0KGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+ID4mIHN1cmZhY2VzLAotICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgc2l6ZV90IGhhbE1heEJ1ZmZlcnMsCi0gICAgICAgICAgICBzcDxTdXJmYWNlPiogY29uc3VtZXIpOworICAgIHN0YXR1c190IGNvbm5lY3QoY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPHNpemVfdCwgc3A8U3VyZmFjZT4+ICZzdXJmYWNlcywKKyAgICAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsIHVpbnQ2NF90IHByb2R1Y2VyVXNhZ2UsIHNpemVfdCBoYWxNYXhCdWZmZXJzLCB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwgYW5kcm9pZDo6UGl4ZWxGb3JtYXQgZm9ybWF0LCBzcDxTdXJmYWNlPiogY29uc3VtZXIpOwogCiAgICAgLy8gYWRkT3V0cHV0IGFkZHMgYW4gb3V0cHV0IEJ1ZmZlclF1ZXVlIHRvIHRoZSBzcGxpdHRlci4gVGhlIHNwbGl0dGVyCiAgICAgLy8gY29ubmVjdHMgdG8gb3V0cHV0UXVldWUgYXMgYSBDUFUgcHJvZHVjZXIsIGFuZCBhbnkgYnVmZmVycyBxdWV1ZWQKLSAgICAvLyB0byB0aGUgaW5wdXQgd2lsbCBiZSBxdWV1ZWQgdG8gZWFjaCBvdXRwdXQuIEl0IGlzIGFzc3VtZWQgdGhhdCBhbGwgb2YgdGhlCi0gICAgLy8gb3V0cHV0cyBhcmUgYWRkZWQgYmVmb3JlIGFueSBidWZmZXJzIGFyZSBxdWV1ZWQgb24gdGhlIGlucHV0LiBJZiBhbnkKLSAgICAvLyBvdXRwdXQgaXMgYWJhbmRvbmVkIGJ5IGl0cyBjb25zdW1lciwgdGhlIHNwbGl0dGVyIHdpbGwgYWJhbmRvbiBpdHMgaW5wdXQKLSAgICAvLyBxdWV1ZSAoc2VlIG9uQWJhbmRvbmVkKS4KKyAgICAvLyB0byB0aGUgaW5wdXQgd2lsbCBiZSBxdWV1ZWQgdG8gZWFjaCBvdXRwdXQuIElmIGFueSAgb3V0cHV0IGlzIGFiYW5kb25lZAorICAgIC8vIGJ5IGl0cyBjb25zdW1lciwgdGhlIHNwbGl0dGVyIHdpbGwgYWJhbmRvbiBpdHMgaW5wdXQgcXVldWUgKHNlZSBvbkFiYW5kb25lZCkuCiAgICAgLy8KICAgICAvLyBBIHJldHVybiB2YWx1ZSBvdGhlciB0aGFuIE5PX0VSUk9SIG1lYW5zIHRoYXQgYW4gZXJyb3IgaGFzIG9jY3VycmVkIGFuZAogICAgIC8vIG91dHB1dFF1ZXVlIGhhcyBub3QgYmVlbiBhZGRlZCB0byB0aGUgc3BsaXR0ZXIuIEJBRF9WQUxVRSBpcyByZXR1cm5lZCBpZgogICAgIC8vIG91dHB1dFF1ZXVlIGlzIE5VTEwuIFNlZSBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpjb25uZWN0IGZvciBleHBsYW5hdGlvbnMKICAgICAvLyBvZiBvdGhlciBlcnJvciBjb2Rlcy4KLSAgICBzdGF0dXNfdCBhZGRPdXRwdXQoY29uc3Qgc3A8U3VyZmFjZT4mIG91dHB1dFF1ZXVlKTsKKyAgICBzdGF0dXNfdCBhZGRPdXRwdXQoc2l6ZV90IHN1cmZhY2VJZCwgY29uc3Qgc3A8U3VyZmFjZT4mIG91dHB1dFF1ZXVlKTsKKworICAgIC8vcmVtb3ZlT3V0cHV0IHdpbGwgcmVtb3ZlIGEgQnVmZmVyUXVldWUgdGhhdCB3YXMgcHJldmlvdXNseSBhZGRlZCB0bworICAgIC8vdGhlIHNwbGl0dGVyIG91dHB1dHMuIEFueSBwZW5kaW5nIGJ1ZmZlcnMgaW4gdGhlIEJ1ZmZlclF1ZXVlIHdpbGwgZ2V0CisgICAgLy9yZWNsYWltZWQuCisgICAgc3RhdHVzX3QgcmVtb3ZlT3V0cHV0KHNpemVfdCBzdXJmYWNlSWQpOwogCiAgICAgLy8gTm90aWZpY2F0aW9uIHRoYXQgdGhlIGdyYXBoaWMgYnVmZmVyIGhhcyBiZWVuIHJlbGVhc2VkIHRvIHRoZSBpbnB1dAogICAgIC8vIEJ1ZmZlclF1ZXVlLiBUaGUgYnVmZmVyIHNob3VsZCBiZSByZXVzZWQgYnkgdGhlIGNhbWVyYSBkZXZpY2UgaW5zdGVhZCBvZgpAQCAtMTE3LDEwICsxMjIsOCBAQAogICAgIC8vIG9uRnJhbWVBdmFpbGFibGUgY2FsbCB0byBwcm9jZWVkLgogICAgIHZvaWQgb25CdWZmZXJSZWxlYXNlZEJ5T3V0cHV0KGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBmcm9tKTsKIAotICAgIC8vIFRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIG9uQnVmZmVyUmVsZWFzZWRCeU91dHB1dCB3aXRob3V0IHRoZSBtdXRleCBsb2NrZWQuCi0gICAgLy8gSXQgY291bGQgZWl0aGVyIGJlIGNhbGxlZCBmcm9tIG9uQnVmZmVyUmVsZWFzZWRCeU91dHB1dCBvciBmcm9tCi0gICAgLy8gb25GcmFtZUF2YWlsYWJsZSB3aGVuIGEgYnVmZmVyIGluIHRoZSBhc3luYyBidWZmZXIgcXVldWUgaXMgb3ZlcndyaXR0ZW4uCi0gICAgdm9pZCBvbkJ1ZmZlclJlbGVhc2VkQnlPdXRwdXRMb2NrZWQoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGZyb20pOworICAgIC8vIENhbGxlZCBieSBvdXRwdXRCdWZmZXJMb2NrZWQgd2hlbiBhIGJ1ZmZlciBpbiB0aGUgYXN5bmMgYnVmZmVyIHF1ZXVlIGdvdCByZXBsYWNlZC4KKyAgICB2b2lkIG9uQnVmZmVyUmVwbGFjZWRMb2NrZWQoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGZyb20sIHNpemVfdCBzdXJmYWNlSWQpOwogCiAgICAgLy8gV2hlbiB0aGlzIGlzIGNhbGxlZCwgdGhlIHNwbGl0dGVyIGRpc2Nvbm5lY3RzIGZyb20gKGkuZS4sIGFiYW5kb25zKSBpdHMKICAgICAvLyBpbnB1dCBxdWV1ZSBhbmQgc2lnbmFscyBhbnkgd2FpdGluZyBvbkZyYW1lQXZhaWxhYmxlIGNhbGxzIHRvIHdha2UgdXAuCkBAIC0xMzEsNyArMTM0LDE0IEBACiAKICAgICAvLyBEZWNyZW1lbnQgdGhlIGJ1ZmZlcidzIHJlZmVyZW5jZSBjb3VudC4gT25jZSB0aGUgcmVmZXJlbmNlIGNvdW50IGJlY29tZXMKICAgICAvLyAwLCByZXR1cm4gdGhlIGJ1ZmZlciBiYWNrIHRvIHRoZSBpbnB1dCBCdWZmZXJRdWV1ZS4KLSAgICB2b2lkIGRlY3JlbWVudEJ1ZlJlZkNvdW50TG9ja2VkKHVpbnQ2NF90IGlkLCBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgZnJvbSk7CisgICAgdm9pZCBkZWNyZW1lbnRCdWZSZWZDb3VudExvY2tlZCh1aW50NjRfdCBpZCwgc2l6ZV90IHN1cmZhY2VJZCk7CisKKyAgICAvLyBDaGVjayBmb3IgYW5kIGhhbmRsZSBhbnkgb3V0cHV0IHN1cmZhY2UgZGVxdWV1ZSBlcnJvcnMuCisgICAgdm9pZCBoYW5kbGVPdXRwdXREZXF1ZXVlU3RhdHVzTG9ja2VkKHN0YXR1c190IHJlcywgaW50IHNsb3QpOworCisgICAgLy8gSGFuZGxlcyByZWxlYXNlZCBvdXRwdXQgc3VyZmFjZSBidWZmZXJzLgorICAgIHZvaWQgcmV0dXJuT3V0cHV0QnVmZmVyTG9ja2VkKGNvbnN0IHNwPEZlbmNlPiYgZmVuY2UsIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBmcm9tLAorICAgICAgICAgICAgc2l6ZV90IHN1cmZhY2VJZCwgaW50IHNsb3QpOwogCiAgICAgLy8gVGhpcyBpcyBhIHRoaW4gd3JhcHBlciBjbGFzcyB0aGF0IGxldHMgdXMgZGV0ZXJtaW5lIHdoaWNoIEJ1ZmZlclF1ZXVlCiAgICAgLy8gdGhlIElQcm9kdWNlckxpc3RlbmVyOjpvbkJ1ZmZlclJlbGVhc2VkIGNhbGxiYWNrIGlzIGFzc29jaWF0ZWQgd2l0aC4gV2UKQEAgLTE2OCw3ICsxNzgsNyBAQAogCiAgICAgICAgIC8vIFJldHVybnMgdGhlIG5ldyB2YWx1ZQogICAgICAgICAvLyBPbmx5IGNhbGxlZCB3aGlsZSBtTXV0ZXggaXMgaGVsZAotICAgICAgICBzaXplX3QgZGVjcmVtZW50UmVmZXJlbmNlQ291bnRMb2NrZWQoKTsKKyAgICAgICAgc2l6ZV90IGRlY3JlbWVudFJlZmVyZW5jZUNvdW50TG9ja2VkKHNpemVfdCBzdXJmYWNlSWQpOwogCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4gcmVxdWVzdGVkU3VyZmFjZXMoKSBjb25zdCB7IHJldHVybiBtUmVxdWVzdGVkU3VyZmFjZXM7IH0KIApAQCAtMTkxLDEzICsyMDEsMTUgQEAKICAgICAvLyBNdXN0IGJlIGFjY2Vzc2VkIHRocm91Z2ggUmVmQmFzZQogICAgIHZpcnR1YWwgfkNhbWVyYTNTdHJlYW1TcGxpdHRlcigpOwogCi0gICAgc3RhdHVzX3QgYWRkT3V0cHV0TG9ja2VkKGNvbnN0IHNwPFN1cmZhY2U+JiBvdXRwdXRRdWV1ZSk7CisgICAgc3RhdHVzX3QgYWRkT3V0cHV0TG9ja2VkKHNpemVfdCBzdXJmYWNlSWQsIGNvbnN0IHNwPFN1cmZhY2U+JiBvdXRwdXRRdWV1ZSk7CisKKyAgICBzdGF0dXNfdCByZW1vdmVPdXRwdXRMb2NrZWQoc2l6ZV90IHN1cmZhY2VJZCk7CiAKICAgICAvLyBTZW5kIGEgYnVmZmVyIHRvIHBhcnRpY3VsYXIgb3V0cHV0LCBhbmQgaW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQKICAgICAvLyBvZiB0aGUgYnVmZmVyLiBJZiB0aGlzIG91dHB1dCBpcyBhYmFuZG9uZWQsIHRoZSBidWZmZXIncyByZWZlcmVuY2UgY291bnQKICAgICAvLyB3b24ndCBiZSBpbmNyZW1lbnRlZC4KICAgICBzdGF0dXNfdCBvdXRwdXRCdWZmZXJMb2NrZWQoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIG91dHB1dCwKLSAgICAgICAgICAgIGNvbnN0IEJ1ZmZlckl0ZW0mIGJ1ZmZlckl0ZW0pOworICAgICAgICAgICAgY29uc3QgQnVmZmVySXRlbSYgYnVmZmVySXRlbSwgc2l6ZV90IHN1cmZhY2VJZCk7CiAKICAgICAvLyBHZXQgdW5pcXVlIG5hbWUgZm9yIHRoZSBidWZmZXIgcXVldWUgY29uc3VtZXIKICAgICBTdHJpbmc4IGdldFVuaXF1ZUNvbnN1bWVyTmFtZSgpOwpAQCAtMjA1LDE0ICsyMTcsMTQgQEAKICAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBCdWZmZXJRdWV1ZSBzbG90IHdoZXJlIGEgcGFydGljdWxhciBidWZmZXIgaXMgYXR0YWNoZWQgdG8uCiAgICAgaW50IGdldFNsb3RGb3JPdXRwdXRMb2NrZWQoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGdicCwKICAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBnYik7Ci0gICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHJlbW92ZSB0aGUgYnVmZmVyIGZyb20gdGhlIEJ1ZmZlclF1ZXVlIHNsb3QKLSAgICBzdGF0dXNfdCByZW1vdmVTbG90Rm9yT3V0cHV0TG9ja2VkKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAsCi0gICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgZ2IpOwotCiAKICAgICAvLyBTdW0gb2YgbWF4IGNvbnN1bWVyIGJ1ZmZlcnMgZm9yIGFsbCBvdXRwdXRzCiAgICAgc2l6ZV90IG1NYXhDb25zdW1lckJ1ZmZlcnMgPSAwOwogICAgIHNpemVfdCBtTWF4SGFsQnVmZmVycyA9IDA7CisgICAgdWludDMyX3QgbVdpZHRoID0gMDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0ID0gMDsKKyAgICBhbmRyb2lkOjpQaXhlbEZvcm1hdCBtRm9ybWF0ID0gYW5kcm9pZDo6UElYRUxfRk9STUFUX05PTkU7CisgICAgdWludDY0X3QgbVByb2R1Y2VyVXNhZ2UgPSAwOwogCiAgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga0RlcXVldWVCdWZmZXJUaW1lb3V0ICAgPSBzMm5zKDEpOyAvLyAxIHNlYwogCkBAIC0yMjMsNyArMjM1LDE1IEBACiAgICAgc3A8QnVmZmVySXRlbUNvbnN1bWVyPiBtQnVmZmVySXRlbUNvbnN1bWVyOwogICAgIHNwPFN1cmZhY2U+IG1TdXJmYWNlOwogCi0gICAgc3RkOjp2ZWN0b3I8c3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gPiBtT3V0cHV0czsKKyAgICAvL01hcCBncmFwaGljIGJ1ZmZlciBpZHMgLT4gYnVmZmVyIGl0ZW1zCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCBCdWZmZXJJdGVtPiBtSW5wdXRTbG90czsKKworICAgIC8vTWFwIHN1cmZhY2UgaWRzIC0+IGdicCBvdXRwdXRzCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludCwgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gPiBtT3V0cHV0czsKKworICAgIC8vTWFwIHN1cmZhY2UgaWRzIC0+IGNvbnN1bWVyIGJ1ZmZlciBjb3VudAorICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIHNpemVfdCA+IG1Db25zdW1lckJ1ZmZlckNvdW50OworCiAgICAgLy8gTWFwIG9mIEdyYXBoaWNCdWZmZXIgSURzIChHcmFwaGljQnVmZmVyOjpnZXRJZCgpKSB0byBidWZmZXIgdHJhY2tpbmcKICAgICAvLyBvYmplY3RzICh3aGljaCBhcmUgbW9zdGx5IGZvciBjb3VudGluZyBob3cgbWFueSBvdXRwdXRzIGhhdmUgcmVsZWFzZWQgdGhlCiAgICAgLy8gYnVmZmVyLCBidXQgYWxzbyBjb250YWluIG1lcmdlZCByZWxlYXNlIGZlbmNlcykuCkBAIC0yNDIsNiArMjYyLDEwIEBACiAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+LCBzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0U2xvdHM+LAogICAgICAgICAgICAgR0JQSGFzaD4gbU91dHB1dFNsb3RzOwogCisgICAgLy9BIHNldCBvZiBidWZmZXJzIHRoYXQgY291bGQgcG90ZW50aWFsbHkgc3RheSBpbiBzb21lIG9mIHRoZSBvdXRwdXRzIGFmdGVyIHJlbW92YWwKKyAgICAvL2FuZCB0aGVyZWZvcmUgc2hvdWxkIGJlIGRldGFjaGVkIGZyb20gdGhlIGlucHV0IHF1ZXVlLgorICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aW50NjRfdD4gbURldGFjaGVkQnVmZmVyczsKKwogICAgIC8vIExhdGVzdCBvbkZyYW1lQXZhaWxhYmxlIHJldHVybiB2YWx1ZQogICAgIHN0ZDo6YXRvbWljPHN0YXR1c190PiBtT25GcmFtZUF2YWlsYWJsZVJlc3swfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmNwcAppbmRleCBkZWM5N2Q3Li5jMGEzNTNmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmNwcApAQCAtMzMsNiArMzMsOCBAQAogICAgICAgICBtVmVuZG9yVGFnSWQoQ0FNRVJBX01FVEFEQVRBX0lOVkFMSURfVkVORE9SX0lEKQoge30KIAorY29uc3QgU3RyaW5nMTYgVGFnTW9uaXRvcjo6a01vbml0b3JPcHRpb24gPSBTdHJpbmcxNigiLW0iKTsKKwogY29uc3QgY2hhciogVGFnTW9uaXRvcjo6azNhVGFncyA9CiAgICAgICAgICJhbmRyb2lkLmNvbnRyb2wuYWVNb2RlLCBhbmRyb2lkLmNvbnRyb2wuYWZNb2RlLCBhbmRyb2lkLmNvbnRyb2wuYXdiTW9kZSwiCiAgICAgICAgICJhbmRyb2lkLmNvbnRyb2wuYWVTdGF0ZSwgYW5kcm9pZC5jb250cm9sLmFmU3RhdGUsIGFuZHJvaWQuY29udHJvbC5hd2JTdGF0ZSwiCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmgKaW5kZXggNzE1NTMxNC4uMmRlY2U2MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1RhZ01vbml0b3IuaApAQCAtMzgsNiArMzgsMTAgQEAKICAqIGJ1ZmZlciBsb2cgdGhhdCBjYW4gYmUgZHVtcGVkIGF0IHdpbGwuICovCiBjbGFzcyBUYWdNb25pdG9yIHsKICAgcHVibGljOgorCisgICAgLy8gTW9uaXRvciBhcmd1bWVudAorICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBrTW9uaXRvck9wdGlvbjsKKwogICAgIGVudW0gZXZlbnRTb3VyY2UgewogICAgICAgICBSRVFVRVNULAogICAgICAgICBSRVNVTFQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9BbmRyb2lkLm1rCmluZGV4IDllMjgxM2UuLjJlZWI3ZmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvQW5kcm9pZC5tawpAQCAtNiwxMSArNiw2IEBACiAKIExPQ0FMX1NSQ19GSUxFUzo9IFwKICAgICBtYWluX21lZGlhbWV0cmljcy5jcHAgICAgICAgICAgICAgIFwKLSAgICBNZXRyaWNzU3VtbWFyaXplckNvZGVjLmNwcCAgICAgICAgIFwKLSAgICBNZXRyaWNzU3VtbWFyaXplckV4dHJhY3Rvci5jcHAgICAgIFwKLSAgICBNZXRyaWNzU3VtbWFyaXplclBsYXllci5jcHAgICAgICAgIFwKLSAgICBNZXRyaWNzU3VtbWFyaXplclJlY29yZGVyLmNwcCAgICAgIFwKLSAgICBNZXRyaWNzU3VtbWFyaXplci5jcHAgICAgICAgICAgICAgIFwKICAgICBNZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAKaW5kZXggYzdmOTI3MC4uNGIwNTM5NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCkBAIC03NCwyNiArNzQsMTEgQEAKIAogI2luY2x1ZGUgIk1lZGlhQW5hbHl0aWNzU2VydmljZS5oIgogCi0jaW5jbHVkZSAiTWV0cmljc1N1bW1hcml6ZXIuaCIKLSNpbmNsdWRlICJNZXRyaWNzU3VtbWFyaXplckNvZGVjLmgiCi0jaW5jbHVkZSAiTWV0cmljc1N1bW1hcml6ZXJFeHRyYWN0b3IuaCIKLSNpbmNsdWRlICJNZXRyaWNzU3VtbWFyaXplclBsYXllci5oIgotI2luY2x1ZGUgIk1ldHJpY3NTdW1tYXJpemVyUmVjb3JkZXIuaCIKLQotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKICAgICB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YmFzZTsKICAgICB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y29udGVudDo6cG07CiAKLQotCi0vLyBzdW1tYXJpemVkIHJlY29yZHMKLS8vIHVwIHRvIDM2IHNldHMsIGVhY2ggY292ZXJpbmcgYW4gaG91ciAtLSBzbyBhdCBsZWFzdCAxLjUgZGF5cwotLy8gKHdpbGwgYmUgbG9uZ2VyIGlmIHRoZXJlIGFyZSBob3VycyB3aXRob3V0IGFueSBtZWRpYSBhY3Rpb24pCi1zdGF0aWMgY29uc3QgbnNlY3NfdCBrTmV3U2V0SW50ZXJ2YWxOcyA9IDM2MDAqKDEwMDAqMTAwMCoxMDAwbGwpOwotc3RhdGljIGNvbnN0IGludCBrTWF4UmVjb3JkU2V0cyA9IDM2OwotCiAvLyBpbmRpdmlkdWFsIHJlY29yZHMga2VwdCBpbiBtZW1vcnk6IGFnZSBvciBjb3VudAogLy8gYWdlOiA8PSAzNiBob3VycyAoMS41IGRheXMpCiAvLyBjb3VudDogaGFyZCBsaW1pdCBvZiAjIHJlY29yZHMKQEAgLTEwOCw2NiArOTMsMTMgQEAKICAgICAgICAgICAgIFN0cmluZzE2KGtTZXJ2aWNlTmFtZSksIG5ldyBNZWRpYUFuYWx5dGljc1NlcnZpY2UoKSk7CiB9CiAKLS8vIGhhbmRsZSBzZXRzIG9mIHN1bW1hcml6ZXJzCi1NZWRpYUFuYWx5dGljc1NlcnZpY2U6OlN1bW1hcml6ZXJTZXQ6OlN1bW1hcml6ZXJTZXQoKSB7Ci0gICAgbVN1bW1hcml6ZXJzID0gbmV3IExpc3Q8TWV0cmljc1N1bW1hcml6ZXIgKj4oKTsKLX0KLQotTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpTdW1tYXJpemVyU2V0Ojp+U3VtbWFyaXplclNldCgpIHsKLSAgICAvLyBlbXB0eSB0aGUgbGlzdAotICAgIExpc3Q8TWV0cmljc1N1bW1hcml6ZXIgKj4gKmwgPSBtU3VtbWFyaXplcnM7Ci0gICAgd2hpbGUgKGwtPnNpemUoKSA+IDApIHsKLSAgICAgICAgTWV0cmljc1N1bW1hcml6ZXIgKnN1bW1hcml6ZXIgPSAqKGwtPmJlZ2luKCkpOwotICAgICAgICBsLT5lcmFzZShsLT5iZWdpbigpKTsKLSAgICAgICAgZGVsZXRlIHN1bW1hcml6ZXI7Ci0gICAgfQotfQotCi12b2lkIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6bmV3U3VtbWFyaXplclNldCgpIHsKLSAgICBBTE9HRCgiTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpuZXdTdW1tYXJpemVyU2V0Iik7Ci0gICAgTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpTdW1tYXJpemVyU2V0ICpzZXQgPSBuZXcgTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpTdW1tYXJpemVyU2V0KCk7Ci0gICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1JFQUxUSU1FKTsKLSAgICBzZXQtPnNldFN0YXJ0ZWQobm93KTsKLQotICAgIHNldC0+YXBwZW5kU3VtbWFyaXplcihuZXcgTWV0cmljc1N1bW1hcml6ZXJFeHRyYWN0b3IoImV4dHJhY3RvciIpKTsKLSAgICBzZXQtPmFwcGVuZFN1bW1hcml6ZXIobmV3IE1ldHJpY3NTdW1tYXJpemVyQ29kZWMoImNvZGVjIikpOwotICAgIHNldC0+YXBwZW5kU3VtbWFyaXplcihuZXcgTWV0cmljc1N1bW1hcml6ZXJQbGF5ZXIoIm51cGxheWVyIikpOwotICAgIHNldC0+YXBwZW5kU3VtbWFyaXplcihuZXcgTWV0cmljc1N1bW1hcml6ZXJSZWNvcmRlcigicmVjb3JkZXIiKSk7Ci0KLSAgICAvLyBBTFdBWVMgYXQgdGhlIGVuZCwgc2luY2UgaXQgY2F0Y2hlcyBldmVyeXRoaW5nCi0gICAgc2V0LT5hcHBlbmRTdW1tYXJpemVyKG5ldyBNZXRyaWNzU3VtbWFyaXplcihOVUxMKSk7Ci0KLSAgICAvLyBpbmplY3QgdGhpcyBzZXQgYXQgdGhlIEJBQ0sgb2YgdGhlIGxpc3QuCi0gICAgbVN1bW1hcml6ZXJTZXRzLT5wdXNoX2JhY2soc2V0KTsKLSAgICBtQ3VycmVudFNldCA9IHNldDsKLQotICAgIC8vIGxpbWl0IHRoZSAjIHRoYXQgd2UgaGF2ZQotICAgIGlmIChtTWF4UmVjb3JkU2V0cyA+IDApIHsKLSAgICAgICAgTGlzdDxTdW1tYXJpemVyU2V0ICo+ICpsID0gbVN1bW1hcml6ZXJTZXRzOwotICAgICAgICB3aGlsZSAobC0+c2l6ZSgpID4gKHNpemVfdCkgbU1heFJlY29yZFNldHMpIHsKLSAgICAgICAgICAgIEFMT0dEKCJEZWxldGluZyBvbGRlc3QgcmVjb3JkIHNldC4uLi4iKTsKLSAgICAgICAgICAgIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6U3VtbWFyaXplclNldCAqb3NldCA9ICoobC0+YmVnaW4oKSk7Ci0gICAgICAgICAgICBsLT5lcmFzZShsLT5iZWdpbigpKTsKLSAgICAgICAgICAgIGRlbGV0ZSBvc2V0OwotICAgICAgICAgICAgbVNldHNEaXNjYXJkZWQrKzsKLSAgICAgICAgfQotICAgIH0KLX0KLQogTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpNZWRpYUFuYWx5dGljc1NlcnZpY2UoKQogICAgICAgICA6IG1NYXhSZWNvcmRzKGtNYXhSZWNvcmRzKSwKICAgICAgICAgICBtTWF4UmVjb3JkQWdlTnMoa01heFJlY29yZEFnZU5zKSwKLSAgICAgICAgICBtTWF4UmVjb3JkU2V0cyhrTWF4UmVjb3JkU2V0cyksCi0gICAgICAgICAgbU5ld1NldEludGVydmFsKGtOZXdTZXRJbnRlcnZhbE5zKSwKLSAgICAgICAgICBtRHVtcFByb3RvKE1lZGlhQW5hbHl0aWNzSXRlbTo6UFJPVE9fVjApIHsKKyAgICAgICAgICBtRHVtcFByb3RvKE1lZGlhQW5hbHl0aWNzSXRlbTo6UFJPVE9fVjEpLAorICAgICAgICAgIG1EdW1wUHJvdG9EZWZhdWx0KE1lZGlhQW5hbHl0aWNzSXRlbTo6UFJPVE9fVjEpIHsKIAogICAgIEFMT0dEKCJNZWRpYUFuYWx5dGljc1NlcnZpY2UgY3JlYXRlZCIpOwotICAgIC8vIGNsZWFyIG91ciBxdWV1ZXMKLSAgICBtT3BlbiA9IG5ldyBMaXN0PE1lZGlhQW5hbHl0aWNzSXRlbSAqPigpOwotICAgIG1GaW5hbGl6ZWQgPSBuZXcgTGlzdDxNZWRpYUFuYWx5dGljc0l0ZW0gKj4oKTsKLQotICAgIG1TdW1tYXJpemVyU2V0cyA9IG5ldyBMaXN0PE1lZGlhQW5hbHl0aWNzU2VydmljZTo6U3VtbWFyaXplclNldCAqPigpOwotICAgIG5ld1N1bW1hcml6ZXJTZXQoKTsKIAogICAgIG1JdGVtc1N1Ym1pdHRlZCA9IDA7CiAgICAgbUl0ZW1zRmluYWxpemVkID0gMDsKQEAgLTE4MywyOCArMTE1LDEzIEBACiBNZWRpYUFuYWx5dGljc1NlcnZpY2U6On5NZWRpYUFuYWx5dGljc1NlcnZpY2UoKSB7CiAgICAgICAgIEFMT0dEKCJNZWRpYUFuYWx5dGljc1NlcnZpY2UgZGVzdHJveWVkIik7CiAKLSAgICAvLyBjbGVhbiBvdXQgbU9wZW4gYW5kIG1GaW5hbGl6ZWQKLSAgICB3aGlsZSAobU9wZW4tPnNpemUoKSA+IDApIHsKLSAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICogb2l0ZW0gPSAqKG1PcGVuLT5iZWdpbigpKTsKLSAgICAgICAgbU9wZW4tPmVyYXNlKG1PcGVuLT5iZWdpbigpKTsKKyAgICB3aGlsZSAobUl0ZW1zLnNpemUoKSA+IDApIHsKKyAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICogb2l0ZW0gPSAqKG1JdGVtcy5iZWdpbigpKTsKKyAgICAgICAgbUl0ZW1zLmVyYXNlKG1JdGVtcy5iZWdpbigpKTsKICAgICAgICAgZGVsZXRlIG9pdGVtOwogICAgICAgICBtSXRlbXNEaXNjYXJkZWQrKzsKICAgICAgICAgbUl0ZW1zRGlzY2FyZGVkQ291bnQrKzsKICAgICB9Ci0gICAgZGVsZXRlIG1PcGVuOwotICAgIG1PcGVuID0gTlVMTDsKLQotICAgIHdoaWxlIChtRmluYWxpemVkLT5zaXplKCkgPiAwKSB7Ci0gICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqIG9pdGVtID0gKihtRmluYWxpemVkLT5iZWdpbigpKTsKLSAgICAgICAgbUZpbmFsaXplZC0+ZXJhc2UobUZpbmFsaXplZC0+YmVnaW4oKSk7Ci0gICAgICAgIGRlbGV0ZSBvaXRlbTsKLSAgICAgICAgbUl0ZW1zRGlzY2FyZGVkKys7Ci0gICAgICAgIG1JdGVtc0Rpc2NhcmRlZENvdW50Kys7Ci0gICAgfQotICAgIGRlbGV0ZSBtRmluYWxpemVkOwotICAgIG1GaW5hbGl6ZWQgPSBOVUxMOwotCi0gICAgLy8gWFhYOiBjbGVhbiBvdXQgdGhlIHN1bW1hcmllcwogfQogCiAKQEAgLTIxNiw5ICsxMzMsMTQgQEAKIH0KIAogLy8gY2FsbGVyIHN1cnJlbmRlcnMgb3duZXJzaGlwIG9mICdpdGVtJwotTWVkaWFBbmFseXRpY3NJdGVtOjpTZXNzaW9uSURfdCBNZWRpYUFuYWx5dGljc1NlcnZpY2U6OnN1Ym1pdChNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0sIGJvb2wgZm9yY2VuZXcpIHsKK01lZGlhQW5hbHl0aWNzSXRlbTo6U2Vzc2lvbklEX3QgTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpzdWJtaXQoTWVkaWFBbmFseXRpY3NJdGVtICppdGVtLCBib29sIGZvcmNlbmV3KQoreworICAgIFVOVVNFRChmb3JjZW5ldyk7CiAKLSAgICBNZWRpYUFuYWx5dGljc0l0ZW06OlNlc3Npb25JRF90IGlkID0gTWVkaWFBbmFseXRpY3NJdGVtOjpTZXNzaW9uSURJbnZhbGlkOworICAgIC8vIGZpbGwgaW4gYSBzZXNzaW9uSUQgaWYgd2UgZG8gbm90IHlldCBoYXZlIG9uZQorICAgIGlmIChpdGVtLT5nZXRTZXNzaW9uSUQoKSA8PSBNZWRpYUFuYWx5dGljc0l0ZW06OlNlc3Npb25JRE5vbmUpIHsKKyAgICAgICAgaXRlbS0+c2V0U2Vzc2lvbklEKGdlbmVyYXRlVW5pcXVlU2Vzc2lvbklEKCkpOworICAgIH0KIAogICAgIC8vIHdlIGNvbnRyb2wgdGhlc2UsIGdlbmVyYWxseSBub3QgdHJ1c3RpbmcgdXNlciBpbnB1dAogICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9SRUFMVElNRSk7CkBAIC0yMzEsOSArMTUzLDcgQEAKICAgICBpbnQgdWlkX2dpdmVuID0gaXRlbS0+Z2V0VWlkKCk7CiAgICAgaW50IHBpZF9naXZlbiA9IGl0ZW0tPmdldFBpZCgpOwogCi0gICAgLy8gYWx0aG91Z2ggd2UgZG8gbWFrZSBleGNlcHRpb25zIGZvciBwYXJ0aWN1bGFyIGNsaWVudCB1aWRzCi0gICAgLy8gdGhhdCB3ZSBrbm93IHdlIHRydXN0LgotICAgIC8vCisgICAgLy8gYWx0aG91Z2ggd2UgZG8gbWFrZSBleGNlcHRpb25zIGZvciBzb21lIHRydXN0ZWQgY2xpZW50IHVpZHMKICAgICBib29sIGlzVHJ1c3RlZCA9IGZhbHNlOwogCiAgICAgQUxPR1YoImNhbGxlciBoYXMgdWlkPSVkLCBlbWJlZGRlZCB1aWQ9JWQiLCB1aWQsIHVpZF9naXZlbik7CkBAIC0yNTksNyArMTc5LDYgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotCiAgICAgLy8gT3ZlcndyaXRlIHBhY2thZ2UgbmFtZSBhbmQgdmVyc2lvbiBpZiB0aGUgY2FsbGVyIHdhcyB1bnRydXN0ZWQuCiAgICAgaWYgKCFpc1RydXN0ZWQpIHsKICAgICAgIHNldFBrZ0luZm8oaXRlbSwgaXRlbS0+Z2V0VWlkKCksIHRydWUsIHRydWUpOwpAQCAtMjcxLDcgKzE5MCw3IEBACiAgICAgfQogCiAgICAgQUxPR1YoImdpdmVuIHVpZCAlZDsgc2FuaXRpemVkIHVpZDogJWQgc2FuaXRpemVkIHBrZzogJXMgIgotICAgICAgICAgICJzYW5pdGl6ZWQgcGtnIHZlcnNpb246ICVkIiwKKyAgICAgICAgICAic2FuaXRpemVkIHBrZyB2ZXJzaW9uOiAlIiAgUFJJZDY0LAogICAgICAgICAgIHVpZF9naXZlbiwgaXRlbS0+Z2V0VWlkKCksCiAgICAgICAgICAgaXRlbS0+Z2V0UGtnTmFtZSgpLmNfc3RyKCksCiAgICAgICAgICAgaXRlbS0+Z2V0UGtnVmVyc2lvbkNvZGUoKSk7CkBAIC0yODQsNzcgKzIwMywyMyBAQAogICAgICAgICByZXR1cm4gTWVkaWFBbmFseXRpY3NJdGVtOjpTZXNzaW9uSURJbnZhbGlkOwogICAgIH0KIAotCi0gICAgLy8gaWYgd2UgaGF2ZSBhIHNlc2lzb25pZCBpbiB0aGUgbmV3IHJlY29yZCwgbG9vayB0byBtYWtlCisgICAgLy8gWFhYOiBpZiB3ZSBoYXZlIGEgc2Vzc2lvbmlkIGluIHRoZSBuZXcgcmVjb3JkLCBsb29rIHRvIG1ha2UKICAgICAvLyBzdXJlIGl0IGRvZXNuJ3QgYXBwZWFyIGluIHRoZSBmaW5hbGl6ZWQgbGlzdC4KICAgICAvLyBYWFg6IHRoaXMgaXMgZm9yIHNlY3VyaXR5IC8gRE9TIHByZXZlbnRpb24uCiAgICAgLy8gbWF5IGFsc28gcmVxdWlyZSB0aGF0IHdlIHBlcnNpc3QgdGhlIHVuaXF1ZSBzZXNzaW9uSURzCiAgICAgLy8gYWNyb3NzIGJvb3RzIFtpbnN0ZWFkIG9mIHdpdGhpbiBhIHNpbmdsZSBib290XQogCi0KLSAgICAvLyBtYXRjaCB0aGlzIG5ldyByZWNvcmQgdXAgYWdhaW5zdCByZWNvcmRzIGluIHRoZSBvcGVuCi0gICAgLy8gbGlzdC4uLgotICAgIC8vIGlmIHRoZXJlJ3MgYSBtYXRjaCwgbWVyZ2UgdGhlbSB0b2dldGhlcgotICAgIC8vIGRlYWwgd2l0aCBtb3ZpbmcgdGhlIG9sZCAvIG1lcmdlZCByZWNvcmQgaW50byB0aGUgZmluYWxpemVkIHF1ZQotCi0gICAgYm9vbCBmaW5hbGl6aW5nID0gaXRlbS0+Z2V0RmluYWxpemVkKCk7Ci0KLSAgICAvLyBpZiBmaW5hbGl6aW5nLCB3ZSdsbCByZW1vdmUgaXQKLSAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKm9pdGVtID0gZmluZEl0ZW0obU9wZW4sIGl0ZW0sIGZpbmFsaXppbmcgfCBmb3JjZW5ldyk7Ci0gICAgaWYgKG9pdGVtICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKGZvcmNlbmV3KSB7Ci0gICAgICAgICAgICAvLyBvbGQgb25lIGdldHMgZmluYWxpemVkLCB0aGVuIHdlIGluc2VydCB0aGUgbmV3IG9uZQotICAgICAgICAgICAgLy8gc28gd2UnbGwgaGF2ZSAyIHJlY29yZHMgYXQgdGhlIGVuZCBvZiB0aGlzLgotICAgICAgICAgICAgLy8gYnV0IGRvbid0IGZpbmFsaXplIGFuIGVtcHR5IHJlY29yZAotICAgICAgICAgICAgaWYgKG9pdGVtLT5jb3VudCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSdyZSByZXNwb25zaWJsZSBmb3IgZGlzcG9zaW5nIG9mIHRoZSBkZWFkIHJlY29yZAotICAgICAgICAgICAgICAgIGRlbGV0ZSBvaXRlbTsKLSAgICAgICAgICAgICAgICBvaXRlbSA9IE5VTEw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG9pdGVtLT5zZXRGaW5hbGl6ZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgc3VtbWFyaXplKG9pdGVtKTsKLSAgICAgICAgICAgICAgICBzYXZlSXRlbShtRmluYWxpemVkLCBvaXRlbSwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBuZXcgcmVjb3JkIGNvdWxkIGl0c2VsZiBiZSBtYXJrZWQgZmluYWxpemVkLi4uCi0gICAgICAgICAgICBpZiAoZmluYWxpemluZykgewotICAgICAgICAgICAgICAgIHN1bW1hcml6ZShpdGVtKTsKLSAgICAgICAgICAgICAgICBzYXZlSXRlbShtRmluYWxpemVkLCBpdGVtLCAwKTsKLSAgICAgICAgICAgICAgICBtSXRlbXNGaW5hbGl6ZWQrKzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2F2ZUl0ZW0obU9wZW4sIGl0ZW0sIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWQgPSBpdGVtLT5nZXRTZXNzaW9uSUQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGNvbWJpbmUgdGhlIHJlY29yZHMsIHNlbmQgaXQgdG8gZmluYWxpemVkIGlmIGFwcHJvcHJpYXRlCi0gICAgICAgICAgICBvaXRlbS0+bWVyZ2UoaXRlbSk7Ci0gICAgICAgICAgICBpZiAoZmluYWxpemluZykgewotICAgICAgICAgICAgICAgIHN1bW1hcml6ZShvaXRlbSk7Ci0gICAgICAgICAgICAgICAgc2F2ZUl0ZW0obUZpbmFsaXplZCwgb2l0ZW0sIDApOwotICAgICAgICAgICAgICAgIG1JdGVtc0ZpbmFsaXplZCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWQgPSBvaXRlbS0+Z2V0U2Vzc2lvbklEKCk7Ci0KLSAgICAgICAgICAgIC8vIHdlJ3JlIHJlc3BvbnNpYmxlIGZvciBkaXNwb3Npbmcgb2YgdGhlIGRlYWQgcmVjb3JkCi0gICAgICAgICAgICBkZWxldGUgaXRlbTsKLSAgICAgICAgICAgIGl0ZW0gPSBOVUxMOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gbm90aGluZyB0byBtZXJnZSwgc2F2ZSB0aGUgbmV3IHJlY29yZAotICAgICAgICBpZCA9IGl0ZW0tPmdldFNlc3Npb25JRCgpOwotICAgICAgICBpZiAoZmluYWxpemluZykgewotICAgICAgICAgICAgaWYgKGl0ZW0tPmNvdW50KCkgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGRyb3AgZW1wdHkgcmVjb3JkcwotICAgICAgICAgICAgICAgIGRlbGV0ZSBpdGVtOwotICAgICAgICAgICAgICAgIGl0ZW0gPSBOVUxMOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdW1tYXJpemUoaXRlbSk7Ci0gICAgICAgICAgICAgICAgc2F2ZUl0ZW0obUZpbmFsaXplZCwgaXRlbSwgMCk7Ci0gICAgICAgICAgICAgICAgbUl0ZW1zRmluYWxpemVkKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzYXZlSXRlbShtT3BlbiwgaXRlbSwgMSk7Ci0gICAgICAgIH0KKyAgICBpZiAoaXRlbS0+Y291bnQoKSA9PSAwKSB7CisgICAgICAgIC8vIGRyb3AgZW1wdHkgcmVjb3JkcworICAgICAgICBkZWxldGUgaXRlbTsKKyAgICAgICAgaXRlbSA9IE5VTEw7CisgICAgICAgIHJldHVybiBNZWRpYUFuYWx5dGljc0l0ZW06OlNlc3Npb25JREludmFsaWQ7CiAgICAgfQorCisgICAgLy8gc2F2ZSB0aGUgbmV3IHJlY29yZAorICAgIE1lZGlhQW5hbHl0aWNzSXRlbTo6U2Vzc2lvbklEX3QgaWQgPSBpdGVtLT5nZXRTZXNzaW9uSUQoKTsKKyAgICBzYXZlSXRlbShpdGVtKTsKKyAgICBtSXRlbXNGaW5hbGl6ZWQrKzsKICAgICByZXR1cm4gaWQ7CiB9CiAKQEAgLTM3NiwyOSArMjQxLDI2IEBACiAgICAgfQogCiAgICAgLy8gY3JhY2sgYW55IHBhcmFtZXRlcnMKLSAgICBTdHJpbmcxNiBzdW1tYXJ5T3B0aW9uKCItc3VtbWFyeSIpOwotICAgIGJvb2wgc3VtbWFyeSA9IGZhbHNlOwogICAgIFN0cmluZzE2IHByb3RvT3B0aW9uKCItcHJvdG8iKTsKKyAgICBpbnQgY2hvc2VuUHJvdG8gPSBtRHVtcFByb3RvRGVmYXVsdDsKICAgICBTdHJpbmcxNiBjbGVhck9wdGlvbigiLWNsZWFyIik7CiAgICAgYm9vbCBjbGVhciA9IGZhbHNlOwogICAgIFN0cmluZzE2IHNpbmNlT3B0aW9uKCItc2luY2UiKTsKICAgICBuc2Vjc190IHRzX3NpbmNlID0gMDsKICAgICBTdHJpbmcxNiBoZWxwT3B0aW9uKCItaGVscCIpOwogICAgIFN0cmluZzE2IG9ubHlPcHRpb24oIi1vbmx5Iik7Ci0gICAgQVN0cmluZyBvbmx5OworICAgIHN0ZDo6c3RyaW5nIG9ubHk7CiAgICAgaW50IG4gPSBhcmdzLnNpemUoKTsKIAogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgIFN0cmluZzggbXlhcmcoYXJnc1tpXSk7CiAgICAgICAgIGlmIChhcmdzW2ldID09IGNsZWFyT3B0aW9uKSB7CiAgICAgICAgICAgICBjbGVhciA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXSA9PSBzdW1tYXJ5T3B0aW9uKSB7Ci0gICAgICAgICAgICBzdW1tYXJ5ID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldID09IHByb3RvT3B0aW9uKSB7CiAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICBpZiAoaSA8IG4pIHsKICAgICAgICAgICAgICAgICBTdHJpbmc4IHZhbHVlKGFyZ3NbaV0pOwotICAgICAgICAgICAgICAgIGludCBwcm90byA9IE1lZGlhQW5hbHl0aWNzSXRlbTo6UFJPVE9fVjA7ICAgICAgIC8vIGRlZmF1bHQgdG8gb3JpZ2luYWwKKyAgICAgICAgICAgICAgICBpbnQgcHJvdG8gPSBNZWRpYUFuYWx5dGljc0l0ZW06OlBST1RPX1YwOwogICAgICAgICAgICAgICAgIGNoYXIgKmVuZHA7CiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcCA9IHZhbHVlLnN0cmluZygpOwogICAgICAgICAgICAgICAgIHByb3RvID0gc3RydG9sKHAsICZlbmRwLCAxMCk7CkBAIC00MDgsOCArMjcwLDEyIEBACiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvdG8gPiBNZWRpYUFuYWx5dGljc0l0ZW06OlBST1RPX0xBU1QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvID0gTWVkaWFBbmFseXRpY3NJdGVtOjpQUk9UT19MQVNUOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1EdW1wUHJvdG8gPSBwcm90bzsKKyAgICAgICAgICAgICAgICAgICAgY2hvc2VuUHJvdG8gPSBwcm90bzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJ1bmFibGUgdG8gcGFyc2UgdmFsdWUgZm9yIC1wcm90b1xuXG4iKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIm1pc3NpbmcgdmFsdWUgZm9yIC1wcm90b1xuXG4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldID09IHNpbmNlT3B0aW9uKSB7CiAgICAgICAgICAgICBpKys7CkBAIC00MzUsOCArMzAxLDcgQEAKICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldID09IGhlbHBPcHRpb24pIHsKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlJlY29nbml6ZWQgcGFyYW1ldGVyczpcbiIpOwogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLWhlbHAgICAgICAgIHRoaXMgaGVscCBtZXNzYWdlXG4iKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIi1wcm90byBYICAgICBkdW1wIHVzaW5nIHByb3RvY29sIFggKGRlZmF1bHRzIHRvIDEpIik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCItc3VtbWFyeSAgICAgc2hvdyBzdW1tYXJ5IGluZm9cbiIpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLXByb3RvICMgICAgIGR1bXAgdXNpbmcgcHJvdG9jb2wgIyIpOwogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLWNsZWFyICAgICAgIGNsZWFycyBvdXQgc2F2ZWQgcmVjb3Jkc1xuIik7CiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCItb25seSBYICAgICAgcHJvY2VzcyByZWNvcmRzIGZvciBjb21wb25lbnQgWFxuIik7CiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCItc2luY2UgWCAgICAgaW5jbHVkZSByZWNvcmRzIHNpbmNlIFhcbiIpOwpAQCAtNDQ3LDYgKzMxMiw5IEBACiAgICAgfQogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAvLyBtdXRleCBiZXR3ZWVuIGluc2VydGlvbiBhbmQgZHVtcGluZyB0aGUgY29udGVudHMKKworICAgIG1EdW1wUHJvdG8gPSBjaG9zZW5Qcm90bzsKIAogICAgIC8vIHdlIEFMV0FZUyBkdW1wIHRoaXMgcGllY2UKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJEdW1wIG9mIHRoZSAlcyBwcm9jZXNzOlxuIiwga1NlcnZpY2VOYW1lKTsKQEAgLTQ1NCwxOSArMzIyLDE0IEBACiAKICAgICBkdW1wSGVhZGVycyhyZXN1bHQsIHRzX3NpbmNlKTsKIAotICAgIC8vIHdhbnQgZXhhY3RseSAxLCB0byBhdm9pZCBjb25mdXNpbmcgZm9sa3MgdGhhdCBwYXJzZSB0aGUgb3V0cHV0Ci0gICAgaWYgKHN1bW1hcnkpIHsKLSAgICAgICAgZHVtcFN1bW1hcmllcyhyZXN1bHQsIHRzX3NpbmNlLCBvbmx5LmNfc3RyKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGR1bXBSZWNlbnQocmVzdWx0LCB0c19zaW5jZSwgb25seS5jX3N0cigpKTsKLSAgICB9CisgICAgZHVtcFJlY2VudChyZXN1bHQsIHRzX3NpbmNlLCBvbmx5LmNfc3RyKCkpOwogCiAKICAgICBpZiAoY2xlYXIpIHsKICAgICAgICAgLy8gcmVtb3ZlIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgZmluYWxpemVkIHF1ZXVlCi0gICAgICAgIHdoaWxlIChtRmluYWxpemVkLT5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKiBvaXRlbSA9ICoobUZpbmFsaXplZC0+YmVnaW4oKSk7Ci0gICAgICAgICAgICBtRmluYWxpemVkLT5lcmFzZShtRmluYWxpemVkLT5iZWdpbigpKTsKKyAgICAgICAgd2hpbGUgKG1JdGVtcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKiBvaXRlbSA9ICoobUl0ZW1zLmJlZ2luKCkpOworICAgICAgICAgICAgbUl0ZW1zLmVyYXNlKG1JdGVtcy5iZWdpbigpKTsKICAgICAgICAgICAgIGRlbGV0ZSBvaXRlbTsKICAgICAgICAgICAgIG1JdGVtc0Rpc2NhcmRlZCsrOwogICAgICAgICB9CkBAIC00ODAsNyArMzQzLDggQEAKIH0KIAogLy8gZHVtcCBoZWFkZXJzCi12b2lkIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6ZHVtcEhlYWRlcnMoU3RyaW5nOCAmcmVzdWx0LCBuc2Vjc190IHRzX3NpbmNlKSB7Cit2b2lkIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6ZHVtcEhlYWRlcnMoU3RyaW5nOCAmcmVzdWx0LCBuc2Vjc190IHRzX3NpbmNlKQorewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gNTEyOwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogCkBAIC00OTcsNyArMzYxLDcgQEAKIAogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKICAgICAgICAgIlNpbmNlIEJvb3Q6IFN1Ym1pc3Npb25zOiAlOCIgUFJJZDY0Ci0gICAgICAgICAgICAiIEZpbmFsaXphdGlvbnM6ICU4IiBQUklkNjQgIlxuIiwKKyAgICAgICAgICAgICIgQWNjZXB0ZWQ6ICU4IiBQUklkNjQgIlxuIiwKICAgICAgICAgbUl0ZW1zU3VibWl0dGVkLCBtSXRlbXNGaW5hbGl6ZWQpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCkBAIC01MDUsNTMgKzM2OSwxNyBAQAogICAgICAgICAgICAgIiAoYnkgQ291bnQ6ICUiIFBSSWQ2NCAiIGJ5IEV4cGlyYXRpb246ICUiIFBSSWQ2NCAiKVxuIiwKICAgICAgICAgIG1JdGVtc0Rpc2NhcmRlZCwgbUl0ZW1zRGlzY2FyZGVkQ291bnQsIG1JdGVtc0Rpc2NhcmRlZEV4cGlyZSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKLSAgICAgICAgIlN1bW1hcnkgU2V0cyBEaXNjYXJkZWQ6ICUiIFBSSWQ2NCAiXG4iLCBtU2V0c0Rpc2NhcmRlZCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIGlmICh0c19zaW5jZSAhPSAwKSB7CiAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKLSAgICAgICAgICAgICJEdW1waW5nIFF1ZXVlIGVudHJpZXMgbW9yZSByZWNlbnQgdGhhbjogJSIgUFJJZDY0ICJcbiIsCisgICAgICAgICAgICAiRW1pdHRpbmcgUXVldWUgZW50cmllcyBtb3JlIHJlY2VudCB0aGFuOiAlIiBQUklkNjQgIlxuIiwKICAgICAgICAgICAgIChpbnQ2NF90KSB0c19zaW5jZSk7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICB9CiB9CiAKLS8vIGR1bXAgc3VtbWFyeSBpbmZvCi12b2lkIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6ZHVtcFN1bW1hcmllcyhTdHJpbmc4ICZyZXN1bHQsIG5zZWNzX3QgdHNfc2luY2UsIGNvbnN0IGNoYXIgKm9ubHkpIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDUxMjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBpbnQgc2xvdCA9IDA7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcblN1bW1hcml6ZWQgTWV0cmljczpcbiIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIGlmIChvbmx5ICE9IE5VTEwgJiYgKm9ubHkgPT0gJ1wwJykgewotICAgICAgICBvbmx5ID0gTlVMTDsKLSAgICB9Ci0KLSAgICAvLyBoYXZlIGVhY2ggb2YgdGhlIGRpc3RpbGxlcnMgZHVtcCByZWNvcmRzCi0gICAgaWYgKG1TdW1tYXJpemVyU2V0cyAhPSBOVUxMKSB7Ci0gICAgICAgIExpc3Q8U3VtbWFyaXplclNldCAqPjo6aXRlcmF0b3IgaXRTZXQgPSBtU3VtbWFyaXplclNldHMtPmJlZ2luKCk7Ci0gICAgICAgIGZvciAoOyBpdFNldCAhPSBtU3VtbWFyaXplclNldHMtPmVuZCgpOyBpdFNldCsrKSB7Ci0gICAgICAgICAgICBuc2Vjc190IHdoZW4gPSAoKml0U2V0KS0+Z2V0U3RhcnRlZCgpOwotICAgICAgICAgICAgaWYgKHdoZW4gPCB0c19zaW5jZSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGlzdDxNZXRyaWNzU3VtbWFyaXplciAqPiAqbGlzdCA9ICgqaXRTZXQpLT5nZXRTdW1tYXJpemVycygpOwotICAgICAgICAgICAgTGlzdDxNZXRyaWNzU3VtbWFyaXplciAqPjo6aXRlcmF0b3IgaXQgPSBsaXN0LT5iZWdpbigpOwotICAgICAgICAgICAgZm9yICg7IGl0ICE9IGxpc3QtPmVuZCgpOyBpdCsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9ubHkgIT0gTlVMTCAmJiBzdHJjbXAob25seSwgKCppdCktPmdldEtleSgpKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUb2xkIHRvIG9taXQgJyVzJyIsICgqaXQpLT5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFTdHJpbmcgZGlzdGlsbGVkID0gKCppdCktPmR1bXBTdW1tYXJ5KHNsb3QsIG9ubHkpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZGlzdGlsbGVkLmNfc3RyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCiAvLyB0aGUgcmVjZW50LCBkZXRhaWxlZCBxdWV1ZXMKLXZvaWQgTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpkdW1wUmVjZW50KFN0cmluZzggJnJlc3VsdCwgbnNlY3NfdCB0c19zaW5jZSwgY29uc3QgY2hhciAqIG9ubHkpIHsKK3ZvaWQgTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpkdW1wUmVjZW50KFN0cmluZzggJnJlc3VsdCwgbnNlY3NfdCB0c19zaW5jZSwgY29uc3QgY2hhciAqIG9ubHkpCit7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSA1MTI7CiAgICAgY2hhciBidWZmZXJbU0laRV07CiAKQEAgLTU2MiwzMCArMzkwLDI3IEBACiAgICAgLy8gc2hvdyB0aGUgcmVjZW50bHkgcmVjb3JkZWQgcmVjb3JkcwogICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICJcbkZpbmFsaXplZCBNZXRyaWNzIChvbGRlc3QgZmlyc3QpOlxuIik7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHJlc3VsdC5hcHBlbmQodGhpcy0+ZHVtcFF1ZXVlKG1GaW5hbGl6ZWQsIHRzX3NpbmNlLCBvbmx5KSk7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiXG5Jbi1Qcm9ncmVzcyBNZXRyaWNzIChuZXdlc3QgZmlyc3QpOlxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHJlc3VsdC5hcHBlbmQodGhpcy0+ZHVtcFF1ZXVlKG1PcGVuLCB0c19zaW5jZSwgb25seSkpOworICAgIHJlc3VsdC5hcHBlbmQodGhpcy0+ZHVtcFF1ZXVlKHRzX3NpbmNlLCBvbmx5KSk7CiAKICAgICAvLyBzaG93IHdobyBpcyBjb25uZWN0ZWQgYW5kIGluamVjdGluZyByZWNvcmRzPwogICAgIC8vIHRhbGsgYWJvdXQgIyByZWNvcmRzIGZlZCB0byB0aGUgJ3JlYWRlcnMnCiAgICAgLy8gdGFsayBhYm91dCAjIHJlY29yZHMgd2UgZGlzY2FyZGVkLCBwZXJoYXBzICJkaXNjYXJkZWQgdy9vIHJlYWRpbmciIHRvbwogfQorCiAvLyBjYWxsZXIgaGFzIGxvY2tlZCBtTG9jay4uLgotU3RyaW5nOCBNZWRpYUFuYWx5dGljc1NlcnZpY2U6OmR1bXBRdWV1ZShMaXN0PE1lZGlhQW5hbHl0aWNzSXRlbSAqPiAqdGhlTGlzdCkgewotICAgIHJldHVybiBkdW1wUXVldWUodGhlTGlzdCwgKG5zZWNzX3QpIDAsIE5VTEwpOworU3RyaW5nOCBNZWRpYUFuYWx5dGljc1NlcnZpY2U6OmR1bXBRdWV1ZSgpIHsKKyAgICByZXR1cm4gZHVtcFF1ZXVlKChuc2Vjc190KSAwLCBOVUxMKTsKIH0KIAotU3RyaW5nOCBNZWRpYUFuYWx5dGljc1NlcnZpY2U6OmR1bXBRdWV1ZShMaXN0PE1lZGlhQW5hbHl0aWNzSXRlbSAqPiAqdGhlTGlzdCwgbnNlY3NfdCB0c19zaW5jZSwgY29uc3QgY2hhciAqIG9ubHkpIHsKK1N0cmluZzggTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpkdW1wUXVldWUobnNlY3NfdCB0c19zaW5jZSwgY29uc3QgY2hhciAqIG9ubHkpIHsKICAgICBTdHJpbmc4IHJlc3VsdDsKICAgICBpbnQgc2xvdCA9IDA7CiAKLSAgICBpZiAodGhlTGlzdC0+ZW1wdHkoKSkgeworICAgIGlmIChtSXRlbXMuZW1wdHkoKSkgewogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiZW1wdHlcbiIpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIExpc3Q8TWVkaWFBbmFseXRpY3NJdGVtICo+OjppdGVyYXRvciBpdCA9IHRoZUxpc3QtPmJlZ2luKCk7Ci0gICAgICAgIGZvciAoOyBpdCAhPSB0aGVMaXN0LT5lbmQoKTsgaXQrKykgeworICAgICAgICBMaXN0PE1lZGlhQW5hbHl0aWNzSXRlbSAqPjo6aXRlcmF0b3IgaXQgPSBtSXRlbXMuYmVnaW4oKTsKKyAgICAgICAgZm9yICg7IGl0ICE9IG1JdGVtcy5lbmQoKTsgaXQrKykgewogICAgICAgICAgICAgbnNlY3NfdCB3aGVuID0gKCppdCktPmdldFRpbWVzdGFtcCgpOwogICAgICAgICAgICAgaWYgKHdoZW4gPCB0c19zaW5jZSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtNTk1LDcgKzQyMCw3IEBACiAgICAgICAgICAgICAgICAgQUxPR1YoIk9taXQgJyVzJywgaXQncyBub3QgJyVzJyIsICgqaXQpLT5nZXRLZXkoKS5jX3N0cigpLCBvbmx5KTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFTdHJpbmcgZW50cnkgPSAoKml0KS0+dG9TdHJpbmcobUR1bXBQcm90byk7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBlbnRyeSA9ICgqaXQpLT50b1N0cmluZyhtRHVtcFByb3RvKTsKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiU1ZDogJXNcbiIsIHNsb3QsIGVudHJ5LmNfc3RyKCkpOwogICAgICAgICAgICAgc2xvdCsrOwogICAgICAgICB9CkBAIC02MDYsMjUgKzQzMSwyNSBAQAogCiAvLwogLy8gT3VyIENoZWFwIGluLWNvcmUsIG5vbi1wZXJzaXN0ZW50IHJlY29yZHMgbWFuYWdlbWVudC4KLS8vIFhYWDogcmV3cml0ZSB0aGlzIHRvIG1hbmFnZSBwZXJzaXN0ZW5jZSwgZXRjLgogCiAvLyBpbnNlcnQgYXBwcm9wcmlhdGVseSBpbnRvIHF1ZXVlCi12b2lkIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6c2F2ZUl0ZW0oTGlzdDxNZWRpYUFuYWx5dGljc0l0ZW0gKj4gKmwsIE1lZGlhQW5hbHl0aWNzSXRlbSAqIGl0ZW0sIGludCBmcm9udCkgewordm9pZCBNZWRpYUFuYWx5dGljc1NlcnZpY2U6OnNhdmVJdGVtKE1lZGlhQW5hbHl0aWNzSXRlbSAqIGl0ZW0pCit7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIC8vIG11dGV4IGJldHdlZW4gaW5zZXJ0aW9uIGFuZCBkdW1waW5nIHRoZSBjb250ZW50cwogCi0gICAgLy8gYWRkaW5nIGF0IGJhY2sgb2YgcXVldWUgKGZpZm8gb3JkZXIpCi0gICAgaWYgKGZyb250KSAgewotICAgICAgICBsLT5wdXNoX2Zyb250KGl0ZW0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGwtPnB1c2hfYmFjayhpdGVtKTsKLSAgICB9CisgICAgLy8gd2Ugd2FudCB0byBkdW1wICdpbiBGSUZPIG9yZGVyJywgc28gaW5zZXJ0IGF0IHRoZSBlbmQKKyAgICBtSXRlbXMucHVzaF9iYWNrKGl0ZW0pOwogCiAgICAgLy8ga2VlcCByZW1vdmluZyBvbGQgcmVjb3JkcyB0aGUgZnJvbnQgdW50aWwgd2UncmUgaW4tYm91bmRzIChjb3VudCkKICAgICBpZiAobU1heFJlY29yZHMgPiAwKSB7Ci0gICAgICAgIHdoaWxlIChsLT5zaXplKCkgPiAoc2l6ZV90KSBtTWF4UmVjb3JkcykgewotICAgICAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICogb2l0ZW0gPSAqKGwtPmJlZ2luKCkpOwotICAgICAgICAgICAgbC0+ZXJhc2UobC0+YmVnaW4oKSk7CisgICAgICAgIHdoaWxlIChtSXRlbXMuc2l6ZSgpID4gKHNpemVfdCkgbU1heFJlY29yZHMpIHsKKyAgICAgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqIG9pdGVtID0gKihtSXRlbXMuYmVnaW4oKSk7CisgICAgICAgICAgICBpZiAob2l0ZW0gPT0gaXRlbSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUl0ZW1zLmVyYXNlKG1JdGVtcy5iZWdpbigpKTsKICAgICAgICAgICAgIGRlbGV0ZSBvaXRlbTsKICAgICAgICAgICAgIG1JdGVtc0Rpc2NhcmRlZCsrOwogICAgICAgICAgICAgbUl0ZW1zRGlzY2FyZGVkQ291bnQrKzsKQEAgLTYzMiwxNyArNDU3LDIxIEBACiAgICAgfQogCiAgICAgLy8ga2VlcCByZW1vdmluZyBvbGQgcmVjb3JkcyB0aGUgZnJvbnQgdW50aWwgd2UncmUgaW4tYm91bmRzIChjb3VudCkKKyAgICAvLyBOQjogZXhwaXJlZCBlbnRyaWVzIGFyZW4ndCByZW1vdmVkIHVudGlsIHRoZSBuZXh0IGluc2VydGlvbiwgd2hpY2ggY291bGQgYmUgYSB3aGlsZQogICAgIGlmIChtTWF4UmVjb3JkQWdlTnMgPiAwKSB7CiAgICAgICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9SRUFMVElNRSk7Ci0gICAgICAgIHdoaWxlIChsLT5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKiBvaXRlbSA9ICoobC0+YmVnaW4oKSk7CisgICAgICAgIHdoaWxlIChtSXRlbXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICogb2l0ZW0gPSAqKG1JdGVtcy5iZWdpbigpKTsKICAgICAgICAgICAgIG5zZWNzX3Qgd2hlbiA9IG9pdGVtLT5nZXRUaW1lc3RhbXAoKTsKKyAgICAgICAgICAgIGlmIChvaXRlbSA9PSBpdGVtKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBjYXJlZnVsIGFib3V0IHRpbWVqdW1wcyB0b28KICAgICAgICAgICAgIGlmICgobm93ID4gd2hlbikgJiYgKG5vdy13aGVuKSA8PSBtTWF4UmVjb3JkQWdlTnMpIHsKICAgICAgICAgICAgICAgICAvLyB0aGlzIChhbmQgdGhlIHJlc3QpIGFyZSByZWNlbnQgZW5vdWdoIHRvIGtlZXAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGwtPmVyYXNlKGwtPmJlZ2luKCkpOworICAgICAgICAgICAgbUl0ZW1zLmVyYXNlKG1JdGVtcy5iZWdpbigpKTsKICAgICAgICAgICAgIGRlbGV0ZSBvaXRlbTsKICAgICAgICAgICAgIG1JdGVtc0Rpc2NhcmRlZCsrOwogICAgICAgICAgICAgbUl0ZW1zRGlzY2FyZGVkRXhwaXJlKys7CkBAIC02NTAsODUgKzQ3OSwxNCBAQAogICAgIH0KIH0KIAotLy8gYXJlIHRoZXkgYWxpa2UgZW5vdWdoIHRoYXQgbml0ZW0gY2FuIGJlIGZvbGRlZCBpbnRvIG9pdGVtPwotc3RhdGljIGJvb2wgY29tcGF0aWJsZUl0ZW1zKE1lZGlhQW5hbHl0aWNzSXRlbSAqIG9pdGVtLCBNZWRpYUFuYWx5dGljc0l0ZW0gKiBuaXRlbSkgewotCi0gICAgLy8gZ2VuZXJhbCBzYWZldHkKLSAgICBpZiAobml0ZW0tPmdldFVpZCgpICE9IG9pdGVtLT5nZXRVaWQoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChuaXRlbS0+Z2V0UGlkKCkgIT0gb2l0ZW0tPmdldFBpZCgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBrZXkgLS0gbmVlZHMgdG8gbWF0Y2gKLSAgICBpZiAobml0ZW0tPmdldEtleSgpID09IG9pdGVtLT5nZXRLZXkoKSkgewotICAgICAgICAvLyBzdGlsbCBpbiB0aGUgZ2FtZS4KLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gc2Vzc2lvbiBpZCAtLSBlbXB0eSBmaWVsZCBpbiBuZXcgaXMgYWxsb3dlZAotICAgIE1lZGlhQW5hbHl0aWNzSXRlbTo6U2Vzc2lvbklEX3Qgb3Nlc3Npb24gPSBvaXRlbS0+Z2V0U2Vzc2lvbklEKCk7Ci0gICAgTWVkaWFBbmFseXRpY3NJdGVtOjpTZXNzaW9uSURfdCBuc2Vzc2lvbiA9IG5pdGVtLT5nZXRTZXNzaW9uSUQoKTsKLSAgICBpZiAobnNlc3Npb24gIT0gb3Nlc3Npb24pIHsKLSAgICAgICAgLy8gaW5jb21pbmcgJzAnIG1hdGNoZXMgdmFsdWUgaW4gb3Nlc3Npb24KLSAgICAgICAgaWYgKG5zZXNzaW9uICE9IDApIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vLyBmaW5kIHRoZSBpbmNvbXBsZXRlIHJlY29yZCB0aGF0IHRoaXMgd2lsbCBvdmVybGF5Ci1NZWRpYUFuYWx5dGljc0l0ZW0gKk1lZGlhQW5hbHl0aWNzU2VydmljZTo6ZmluZEl0ZW0oTGlzdDxNZWRpYUFuYWx5dGljc0l0ZW0qPiAqdGhlTGlzdCwgTWVkaWFBbmFseXRpY3NJdGVtICpuaXRlbSwgYm9vbCByZW1vdmVpdCkgewotICAgIGlmIChuaXRlbSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IE5VTEw7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotCi0gICAgZm9yIChMaXN0PE1lZGlhQW5hbHl0aWNzSXRlbSAqPjo6aXRlcmF0b3IgaXQgPSB0aGVMaXN0LT5iZWdpbigpOwotICAgICAgICBpdCAhPSB0aGVMaXN0LT5lbmQoKTsgaXQrKykgewotICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKnRtcCA9ICgqaXQpOwotCi0gICAgICAgIGlmICghY29tcGF0aWJsZUl0ZW1zKHRtcCwgbml0ZW0pKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHdlIG1hdGNoISB0aGlzIGlzIHRoZSBvbmUgSSB3YW50LgotICAgICAgICBpZiAocmVtb3ZlaXQpIHsKLSAgICAgICAgICAgIHRoZUxpc3QtPmVyYXNlKGl0KTsKLSAgICAgICAgfQotICAgICAgICBpdGVtID0gdG1wOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIGl0ZW07Ci19Ci0KLQotLy8gZGVsZXRlIHRoZSBpbmRpY2F0ZWQgcmVjb3JkCi12b2lkIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6ZGVsZXRlSXRlbShMaXN0PE1lZGlhQW5hbHl0aWNzSXRlbSAqPiAqbCwgTWVkaWFBbmFseXRpY3NJdGVtICppdGVtKSB7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotCi0gICAgZm9yIChMaXN0PE1lZGlhQW5hbHl0aWNzSXRlbSAqPjo6aXRlcmF0b3IgaXQgPSBsLT5iZWdpbigpOwotICAgICAgICBpdCAhPSBsLT5lbmQoKTsgaXQrKykgewotICAgICAgICBpZiAoKCppdCktPmdldFNlc3Npb25JRCgpICE9IGl0ZW0tPmdldFNlc3Npb25JRCgpKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGRlbGV0ZSAqaXQ7Ci0gICAgICAgIGwtPmVyYXNlKGl0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1zdGF0aWMgQVN0cmluZyBhbGxvd2VkS2V5c1tdID0KK3N0YXRpYyBzdGQ6OnN0cmluZyBhbGxvd2VkS2V5c1tdID0KIHsKKyAgICAiYXVkaW9wb2xpY3kiLAorICAgICJhdWRpb3JlY29yZCIsCisgICAgImF1ZGlvdHJhY2siLAogICAgICJjb2RlYyIsCi0gICAgImV4dHJhY3RvciIKKyAgICAiZXh0cmFjdG9yIiwKKyAgICAibnVwbGF5ZXIiLAogfTsKIAogc3RhdGljIGNvbnN0IGludCBuQWxsb3dlZEtleXMgPSBzaXplb2YoYWxsb3dlZEtleXMpIC8gc2l6ZW9mKGFsbG93ZWRLZXlzWzBdKTsKQEAgLTczOSw3ICs0OTcsNyBAQAogICAgIC8vIHVudHJ1c3RlZCB1aWRzIGNhbiBvbmx5IHNlbmQgdXMgYSBsaW1pdGVkIHNldCBvZiBrZXlzCiAgICAgaWYgKGlzVHJ1c3RlZCA9PSBmYWxzZSkgewogICAgICAgICAvLyByZXN0cmljdCB0byBhIHNwZWNpZmljIHNldCBvZiBrZXlzCi0gICAgICAgIEFTdHJpbmcga2V5ID0gaXRlbS0+Z2V0S2V5KCk7CisgICAgICAgIHN0ZDo6c3RyaW5nIGtleSA9IGl0ZW0tPmdldEtleSgpOwogCiAgICAgICAgIHNpemVfdCBpOwogICAgICAgICBmb3IoaSA9IDA7IGkgPCBuQWxsb3dlZEtleXM7IGkrKykgewpAQCAtNzY0LDUwICs1MjIsMTMgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLS8vIGluc2VydCBpbnRvIHRoZSBhcHByb3ByaWF0ZSBzdW1tYXJpemVyLgotLy8gd2UgbWFrZSBvdXIgb3duIGNvcHkgdG8gc2F2ZS9zdW1tYXJpemUKLXZvaWQgTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpzdW1tYXJpemUoTWVkaWFBbmFseXRpY3NJdGVtICppdGVtKSB7Ci0KLSAgICBBTE9HVigiTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpzdW1tYXJpemUoKSIpOwotCi0gICAgaWYgKGl0ZW0gPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1JFQUxUSU1FKTsKLSAgICBpZiAobUN1cnJlbnRTZXQgPT0gTlVMTAotICAgICAgICB8fCAobUN1cnJlbnRTZXQtPmdldFN0YXJ0ZWQoKSArIG1OZXdTZXRJbnRlcnZhbCA8IG5vdykpIHsKLSAgICAgICAgbmV3U3VtbWFyaXplclNldCgpOwotICAgIH0KLQotICAgIGlmIChtQ3VycmVudFNldCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBMaXN0PE1ldHJpY3NTdW1tYXJpemVyICo+ICpzdW1tYXJpemVycyA9IG1DdXJyZW50U2V0LT5nZXRTdW1tYXJpemVycygpOwotICAgIExpc3Q8TWV0cmljc1N1bW1hcml6ZXIgKj46Oml0ZXJhdG9yIGl0ID0gc3VtbWFyaXplcnMtPmJlZ2luKCk7Ci0gICAgZm9yICg7IGl0ICE9IHN1bW1hcml6ZXJzLT5lbmQoKTsgaXQrKykgewotICAgICAgICBpZiAoKCppdCktPmlzTWluZSgqaXRlbSkpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChpdCA9PSBzdW1tYXJpemVycy0+ZW5kKCkpIHsKLSAgICAgICAgQUxPR0QoIm5vIGhhbmRsZXIgZm9yIHR5cGUgJXMiLCBpdGVtLT5nZXRLZXkoKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgIC8vIG5vIGhhbmRsZXIKLSAgICB9Ci0KLSAgICAvLyBpbnZva2UgdGhlIHN1bW1hcml6ZXIuIHN1bW1hcml6ZXIgd2lsbCBtYWtlIHdoYXRldmVyIGNvcGllcwotICAgIC8vIGl0IHdhbnRzOyB0aGUgY2FsbGVyIHJldGFpbnMgb3duZXJzaGlwIG9mIGl0ZW0uCi0KLSAgICAoKml0KS0+aGFuZGxlUmVjb3JkKGl0ZW0pOwotCi19Ci0KIC8vIGhvdyBsb25nIHdlIGhvbGQgcGFja2FnZSBpbmZvIGJlZm9yZSB3ZSByZS1mZXRjaCBpdAogI2RlZmluZSBQS0dfRVhQSVJBVElPTl9OUyAoMzAqNjAqMTAwMDAwMDAwMGxsKSAgIC8vIDMwIG1pbnV0ZXMsIGluIG5zZWNzCiAKIC8vIGdpdmUgbWUgdGhlIHBhY2thZ2UgbmFtZSwgcGVyaGFwcyBnb2luZyB0byBmaW5kIGl0Ci12b2lkIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6c2V0UGtnSW5mbyhNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0sIHVpZF90IHVpZCwgYm9vbCBzZXROYW1lLCBib29sIHNldFZlcnNpb24pIHsKKy8vIG1hbmFnZXMgaXRzIG93biBtdXRleCBvcGVyYXRpb25zIGludGVybmFsbHkKK3ZvaWQgTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpzZXRQa2dJbmZvKE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSwgdWlkX3QgdWlkLCBib29sIHNldE5hbWUsIGJvb2wgc2V0VmVyc2lvbikKK3sKICAgICBBTE9HVigiYXNraW5nIGZvciBwYWNrYWdlbmFtZSB0byBnbyB3aXRoIHVpZD0lZCIsIHVpZCk7CiAKICAgICBpZiAoIXNldE5hbWUgJiYgIXNldFZlcnNpb24pIHsKQEAgLTgxNywzMiArNTM4LDM2IEBACiAKICAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfUkVBTFRJTUUpOwogICAgIHN0cnVjdCBVaWRUb1BrZ01hcCBtYXBwaW5nOwotICAgIG1hcHBpbmcudWlkID0gKC0xKTsKKyAgICBtYXBwaW5nLnVpZCA9ICh1aWRfdCkoLTEpOwogCi0gICAgc3NpemVfdCBpID0gbVBrZ01hcHBpbmdzLmluZGV4T2ZLZXkodWlkKTsKLSAgICBpZiAoaSA+PSAwKSB7Ci0gICAgICAgIG1hcHBpbmcgPSBtUGtnTWFwcGluZ3MudmFsdWVBdChpKTsKLSAgICAgICAgQUxPR1YoIkV4cGlyYXRpb24/IHVpZCAlZCBleHBpcmF0aW9uICUiIFBSSWQ2NCAiIG5vdyAlIiBQUklkNjQsCi0gICAgICAgICAgICAgIHVpZCwgbWFwcGluZy5leHBpcmF0aW9uLCBub3cpOwotICAgICAgICBpZiAobWFwcGluZy5leHBpcmF0aW9uIDwgbm93KSB7Ci0gICAgICAgICAgICAvLyBwdXJnZSBvdXIgY3VycmVudCBlbnRyeSBhbmQgcmUtcXVlcnkKLSAgICAgICAgICAgIEFMT0dWKCJlbnRyeSBmb3IgdWlkICVkIGV4cGlyZWQsIG5vdz0gJSIgUFJJZDY0ICIiLCB1aWQsIG5vdyk7Ci0gICAgICAgICAgICBtUGtnTWFwcGluZ3MucmVtb3ZlSXRlbXNBdChpLCAxKTsKLSAgICAgICAgICAgIC8vIGNvdWxkIGNoZWF0IGFuZCB1c2UgYSBnb3RvIGJhY2sgdG8gdGhlIHRvcCBvZiB0aGUgcm91dGluZS4KLSAgICAgICAgICAgIC8vIGEgZ29vZCBjb21waWxlciBzaG91bGQgcmVjb2duaXplIHRoZSBsb2NhbCB0YWlsIHJlY3Vyc2lvbi4uLgotICAgICAgICAgICAgcmV0dXJuIHNldFBrZ0luZm8oaXRlbSwgdWlkLCBzZXROYW1lLCBzZXRWZXJzaW9uKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9ja19tYXBwaW5ncyk7CisgICAgICAgIGludCBpID0gbVBrZ01hcHBpbmdzLmluZGV4T2ZLZXkodWlkKTsKKyAgICAgICAgaWYgKGkgPj0gMCkgeworICAgICAgICAgICAgbWFwcGluZyA9IG1Qa2dNYXBwaW5ncy52YWx1ZUF0KGkpOworICAgICAgICAgICAgQUxPR1YoIkV4cGlyYXRpb24/IHVpZCAlZCBleHBpcmF0aW9uICUiIFBSSWQ2NCAiIG5vdyAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgICB1aWQsIG1hcHBpbmcuZXhwaXJhdGlvbiwgbm93KTsKKyAgICAgICAgICAgIGlmIChtYXBwaW5nLmV4cGlyYXRpb24gPD0gbm93KSB7CisgICAgICAgICAgICAgICAgLy8gcHVyZ2UgdGhlIHN0YWxlIGVudHJ5IGFuZCBmYWxsIGludG8gcmUtZmV0Y2hpbmcKKyAgICAgICAgICAgICAgICBBTE9HVigiZW50cnkgZm9yIHVpZCAlZCBleHBpcmVkLCBub3c9ICUiIFBSSWQ2NCAiIiwgdWlkLCBub3cpOworICAgICAgICAgICAgICAgIG1Qa2dNYXBwaW5ncy5yZW1vdmVJdGVtc0F0KGkpOworICAgICAgICAgICAgICAgIG1hcHBpbmcudWlkID0gKHVpZF90KSgtMSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBU3RyaW5nIHBrZzsKKyAgICB9CisKKyAgICAvLyBpZiB3ZSBkaWQgbm90IGZpbmQgaXQKKyAgICBpZiAobWFwcGluZy51aWQgPT0gKHVpZF90KSgtMSkpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgcGtnOwogICAgICAgICBzdGQ6OnN0cmluZyBpbnN0YWxsZXIgPSAiIjsKLSAgICAgICAgaW50MzJfdCB2ZXJzaW9uQ29kZSA9IDA7CisgICAgICAgIGludDY0X3QgdmVyc2lvbkNvZGUgPSAwOwogCiAgICAgICAgIHN0cnVjdCBwYXNzd2QgKnB3ID0gZ2V0cHd1aWQodWlkKTsKICAgICAgICAgaWYgKHB3KSB7CiAgICAgICAgICAgICBwa2cgPSBwdy0+cHdfbmFtZTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIGZpbmQgdGhlIHByb3BlciB2YWx1ZSAtLSBzaG91bGQgd2UgY2FjaGUgdGhpcyBiaW5kZXI/PworICAgICAgICAvLyBmaW5kIHRoZSBwcm9wZXIgdmFsdWUKIAogICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBOVUxMOwogICAgICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CkBAIC04NzUsNyArNjAwLDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gc3RyaXAgYW55IGxlYWRpbmcgInNoYXJlZDoiIHN0cmluZ3MgdGhhdCBjYW1lIGJhY2sKLSAgICAgICAgICAgIGlmIChwa2cuc3RhcnRzV2l0aCgic2hhcmVkOiIpKSB7CisgICAgICAgICAgICBpZiAocGtnLmNvbXBhcmUoMCwgNywgInNoYXJlZDoiKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgcGtnLmVyYXNlKDAsIDcpOwogICAgICAgICAgICAgfQogCkBAIC05MDUsNyArNjMwLDcgQEAKICAgICAgICAgICAgICAgICB9CiAKIAotICAgICAgICAgICAgICAgIEFMT0dWKCJwYWNrYWdlICclcycgaW5zdGFsbGVkIGJ5ICclcycgdmVyc2lvbmNvZGUgJWQgLyAlMDh4IiwKKyAgICAgICAgICAgICAgICBBTE9HVigicGFja2FnZSAnJXMnIGluc3RhbGxlZCBieSAnJXMnIHZlcnNpb25jb2RlICUiICBQUklkNjQgIiAvICUiIFBSSXg2NCwKICAgICAgICAgICAgICAgICAgICAgICBwa2cuY19zdHIoKSwgaW5zdGFsbGVyLmNfc3RyKCksIHZlcnNpb25Db2RlLCB2ZXJzaW9uQ29kZSk7CiAKICAgICAgICAgICAgICAgICBpZiAoc3RybmNtcChpbnN0YWxsZXIuY19zdHIoKSwgImNvbS5hbmRyb2lkLiIsIDEyKSA9PSAwKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5oCmluZGV4IDUyZTQ2MzEuLmIzYzkwMmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5oCkBAIC0yOCw5ICsyOCw2IEBACiAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmg+CiAKLSNpbmNsdWRlICJNZXRyaWNzU3VtbWFyaXplci5oIgotCi0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgTWVkaWFBbmFseXRpY3NTZXJ2aWNlIDogcHVibGljIEJuTWVkaWFBbmFseXRpY3NTZXJ2aWNlCkBAIC01Niw3ICs1Myw2IEBACiAgICAgaW50NjRfdCBtSXRlbXNEaXNjYXJkZWQ7CiAgICAgaW50NjRfdCBtSXRlbXNEaXNjYXJkZWRFeHBpcmU7CiAgICAgaW50NjRfdCBtSXRlbXNEaXNjYXJkZWRDb3VudDsKLSAgICBpbnQ2NF90IG1TZXRzRGlzY2FyZGVkOwogICAgIE1lZGlhQW5hbHl0aWNzSXRlbTo6U2Vzc2lvbklEX3QgbUxhc3RTZXNzaW9uSUQ7CiAKICAgICAvLyBwYXJ0aXRpb25lZCBhIGJpdCBzbyB3ZSBkb24ndCBvdmVyIHNlcmlhbGl6ZQpAQCAtNzksNTQgKzc1LDE1IEBACiAgICAgYm9vbCBjb250ZW50VmFsaWQoTWVkaWFBbmFseXRpY3NJdGVtICppdGVtLCBib29sIGlzVHJ1c3RlZCk7CiAgICAgYm9vbCByYXRlTGltaXRlZChNZWRpYUFuYWx5dGljc0l0ZW0gKik7CiAKLSAgICAvLyB0aGUgb25lcyB0aGF0IGFyZSBzdGlsbCBvcGVuCi0gICAgLy8gKG5ld2VzdCBhdCBmcm9udCkgc2luY2Ugd2Uga2VlcCBsb29raW5nIGZvciB0aGVtCi0gICAgTGlzdDxNZWRpYUFuYWx5dGljc0l0ZW0gKj4gKm1PcGVuOwotICAgIC8vIHRoZSBvbmVzIHdlJ3ZlIGZpbmFsaXplZAogICAgIC8vIChvbGRlc3QgYXQgZnJvbnQpIHNvIGl0IHByaW50cyBuaWNlbHkgZm9yIGR1bXBzeXMKLSAgICBMaXN0PE1lZGlhQW5hbHl0aWNzSXRlbSAqPiAqbUZpbmFsaXplZDsKLSAgICAvLyBzZWFyY2hpbmcgd2l0aGluIHRoZXNlIHF1ZXVlczogcXVldWUsIGtleQotICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqZmluZEl0ZW0oTGlzdDxNZWRpYUFuYWx5dGljc0l0ZW0gKj4gKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKiwgYm9vbCByZW1vdmVpdCk7Ci0KLSAgICAvLyBzdW1tYXJpemVycwotICAgIHZvaWQgc3VtbWFyaXplKE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSk7Ci0gICAgY2xhc3MgU3VtbWFyaXplclNldCB7Ci0gICAgICAgIG5zZWNzX3QgbVN0YXJ0ZWQ7Ci0gICAgICAgIExpc3Q8TWV0cmljc1N1bW1hcml6ZXIgKj4gKm1TdW1tYXJpemVyczsKLQotICAgICAgcHVibGljOgotICAgICAgICB2b2lkIGFwcGVuZFN1bW1hcml6ZXIoTWV0cmljc1N1bW1hcml6ZXIgKnMpIHsKLSAgICAgICAgICAgIGlmIChzKSB7Ci0gICAgICAgICAgICAgICAgbVN1bW1hcml6ZXJzLT5wdXNoX2JhY2socyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIG5zZWNzX3QgZ2V0U3RhcnRlZCgpIHsgcmV0dXJuIG1TdGFydGVkO30KLSAgICAgICAgdm9pZCBzZXRTdGFydGVkKG5zZWNzX3Qgc3RhcnRlZCkge21TdGFydGVkID0gc3RhcnRlZDt9Ci0gICAgICAgIExpc3Q8TWV0cmljc1N1bW1hcml6ZXIgKj4gKmdldFN1bW1hcml6ZXJzKCkgeyByZXR1cm4gbVN1bW1hcml6ZXJzO30KLQotICAgICAgICBTdW1tYXJpemVyU2V0KCk7Ci0gICAgICAgIH5TdW1tYXJpemVyU2V0KCk7Ci0gICAgfTsKLSAgICB2b2lkIG5ld1N1bW1hcml6ZXJTZXQoKTsKLSAgICBMaXN0PFN1bW1hcml6ZXJTZXQgKj4gKm1TdW1tYXJpemVyU2V0czsKLSAgICBTdW1tYXJpemVyU2V0ICptQ3VycmVudFNldDsKLSAgICBMaXN0PE1ldHJpY3NTdW1tYXJpemVyICo+ICpnZXRGaXJzdFNldCgpIHsKLSAgICAgICAgTGlzdDxTdW1tYXJpemVyU2V0ICo+OjppdGVyYXRvciBmaXJzdCA9IG1TdW1tYXJpemVyU2V0cy0+YmVnaW4oKTsKLSAgICAgICAgaWYgKGZpcnN0ICE9IG1TdW1tYXJpemVyU2V0cy0+ZW5kKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKmZpcnN0KS0+Z2V0U3VtbWFyaXplcnMoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICB2b2lkIHNhdmVJdGVtKE1lZGlhQW5hbHl0aWNzSXRlbSk7Ci0gICAgdm9pZCBzYXZlSXRlbShMaXN0PE1lZGlhQW5hbHl0aWNzSXRlbSAqPiAqLCBNZWRpYUFuYWx5dGljc0l0ZW0gKiwgaW50KTsKLSAgICB2b2lkIGRlbGV0ZUl0ZW0oTGlzdDxNZWRpYUFuYWx5dGljc0l0ZW0gKj4gKiwgTWVkaWFBbmFseXRpY3NJdGVtICopOworICAgIExpc3Q8TWVkaWFBbmFseXRpY3NJdGVtICo+IG1JdGVtczsKKyAgICB2b2lkIHNhdmVJdGVtKE1lZGlhQW5hbHl0aWNzSXRlbSAqKTsKIAogICAgIC8vIHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgb3V0cHV0CiAgICAgaW50IG1EdW1wUHJvdG87Ci0gICAgU3RyaW5nOCBkdW1wUXVldWUoTGlzdDxNZWRpYUFuYWx5dGljc0l0ZW0qPiAqKTsKLSAgICBTdHJpbmc4IGR1bXBRdWV1ZShMaXN0PE1lZGlhQW5hbHl0aWNzSXRlbSo+ICosIG5zZWNzX3QsIGNvbnN0IGNoYXIgKm9ubHkpOworICAgIGludCBtRHVtcFByb3RvRGVmYXVsdDsKKyAgICBTdHJpbmc4IGR1bXBRdWV1ZSgpOworICAgIFN0cmluZzggZHVtcFF1ZXVlKG5zZWNzX3QsIGNvbnN0IGNoYXIgKm9ubHkpOwogCiAgICAgdm9pZCBkdW1wSGVhZGVycyhTdHJpbmc4ICZyZXN1bHQsIG5zZWNzX3QgdHNfc2luY2UpOwogICAgIHZvaWQgZHVtcFN1bW1hcmllcyhTdHJpbmc4ICZyZXN1bHQsIG5zZWNzX3QgdHNfc2luY2UsIGNvbnN0IGNoYXIgKiBvbmx5KTsKQEAgLTEzNSw5ICs5Miw5IEBACiAgICAgLy8gbWFwcGluZyB1aWRzIHRvIHBhY2thZ2UgbmFtZXMKICAgICBzdHJ1Y3QgVWlkVG9Qa2dNYXAgewogICAgICAgICB1aWRfdCB1aWQ7Ci0gICAgICAgIEFTdHJpbmcgcGtnOwotICAgICAgICBBU3RyaW5nIGluc3RhbGxlcjsKLSAgICAgICAgaW50MzJfdCB2ZXJzaW9uQ29kZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgcGtnOworICAgICAgICBzdGQ6OnN0cmluZyBpbnN0YWxsZXI7CisgICAgICAgIGludDY0X3QgdmVyc2lvbkNvZGU7CiAgICAgICAgIG5zZWNzX3QgZXhwaXJhdGlvbjsKICAgICB9OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplci5jcHAgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZmUwZWMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIk1ldHJpY3NTdW1tYXJpemVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmg+Ci0KLSNpbmNsdWRlICJNZXRyaWNzU3VtbWFyaXplci5oIgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotI2RlZmluZSBERUJVR19TT1JUICAgICAgMAotI2RlZmluZSBERUJVR19RVUVVRSAgICAgMAotCi0KLU1ldHJpY3NTdW1tYXJpemVyOjpNZXRyaWNzU3VtbWFyaXplcihjb25zdCBjaGFyICprZXkpCi0gICAgOiBtSWdub3JhYmxlcyhOVUxMKQotewotICAgIEFMT0dWKCJNZXRyaWNzU3VtbWFyaXplcjo6TWV0cmljc1N1bW1hcml6ZXIiKTsKLQotICAgIGlmIChrZXkgPT0gTlVMTCkgewotICAgICAgICBtS2V5ID0ga2V5OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1LZXkgPSBzdHJkdXAoa2V5KTsKLSAgICB9Ci0KLSAgICBtU3VtbWFyaWVzID0gbmV3IExpc3Q8TWVkaWFBbmFseXRpY3NJdGVtICo+KCk7Ci19Ci0KLU1ldHJpY3NTdW1tYXJpemVyOjp+TWV0cmljc1N1bW1hcml6ZXIoKQotewotICAgIEFMT0dWKCJNZXRyaWNzU3VtbWFyaXplcjo6fk1ldHJpY3NTdW1tYXJpemVyIik7Ci0gICAgaWYgKG1LZXkpIHsKLSAgICAgICAgZnJlZSgodm9pZCAqKW1LZXkpOwotICAgICAgICBtS2V5ID0gTlVMTDsKLSAgICB9Ci0KLSAgICAvLyBjbGVhciB0aGUgbGlzdCBvZiBpdGVtcyB3ZSBoYXZlIHNhdmVkCi0gICAgd2hpbGUgKG1TdW1tYXJpZXMtPnNpemUoKSA+IDApIHsKLSAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICogb2l0ZW0gPSAqKG1TdW1tYXJpZXMtPmJlZ2luKCkpOwotICAgICAgICBpZiAoREVCVUdfUVVFVUUpIHsKLSAgICAgICAgICAgIEFMT0dEKCJ6YXAgb2xkIHJlY29yZDoga2V5ICVzIHNlc3Npb25JRCAlIiBQUklkNjQgIiB0cyAlIiBQUklkNjQgIiIsCi0gICAgICAgICAgICAgICAgb2l0ZW0tPmdldEtleSgpLmNfc3RyKCksIG9pdGVtLT5nZXRTZXNzaW9uSUQoKSwKLSAgICAgICAgICAgICAgICBvaXRlbS0+Z2V0VGltZXN0YW1wKCkpOwotICAgICAgICB9Ci0gICAgICAgIG1TdW1tYXJpZXMtPmVyYXNlKG1TdW1tYXJpZXMtPmJlZ2luKCkpOwotICAgICAgICBkZWxldGUgb2l0ZW07Ci0gICAgfQotfQotCi0vLyBzbyB3ZSBrbm93IHdoYXQgc3VtbWFyaXplciB3ZSB3ZXJlIHVzaW5nCi1jb25zdCBjaGFyICpNZXRyaWNzU3VtbWFyaXplcjo6Z2V0S2V5KCkgewotICAgIGNvbnN0IGNoYXIgKnZhbHVlID0gbUtleTsKLSAgICBpZiAodmFsdWUgPT0gTlVMTCkgewotICAgICAgICB2YWx1ZSA9ICJ1bmtub3duIjsKLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlOwotfQotCi0vLyBzaG91bGQgdGhlIHJlY29yZCBiZSBnaXZlbiB0byB0aGlzIHN1bW1hcml6ZXIKLWJvb2wgTWV0cmljc1N1bW1hcml6ZXI6OmlzTWluZShNZWRpYUFuYWx5dGljc0l0ZW0gJml0ZW0pCi17Ci0gICAgaWYgKG1LZXkgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgQVN0cmluZyBpdGVtS2V5ID0gaXRlbS5nZXRLZXkoKTsKLSAgICBpZiAoc3RyY21wKG1LZXksIGl0ZW1LZXkuY19zdHIoKSkgIT0gMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1BU3RyaW5nIE1ldHJpY3NTdW1tYXJpemVyOjpkdW1wU3VtbWFyeShpbnQgJnNsb3QpCi17Ci0gICAgcmV0dXJuIGR1bXBTdW1tYXJ5KHNsb3QsIE5VTEwpOwotfQotCi1BU3RyaW5nIE1ldHJpY3NTdW1tYXJpemVyOjpkdW1wU3VtbWFyeShpbnQgJnNsb3QsIGNvbnN0IGNoYXIgKm9ubHkpCi17Ci0gICAgQVN0cmluZyB2YWx1ZSA9ICIiOwotCi0gICAgTGlzdDxNZWRpYUFuYWx5dGljc0l0ZW0gKj46Oml0ZXJhdG9yIGl0ID0gbVN1bW1hcmllcy0+YmVnaW4oKTsKLSAgICBpZiAoaXQgIT0gbVN1bW1hcmllcy0+ZW5kKCkpIHsKLSAgICAgICAgY2hhciBidWZbMTZdOyAgIC8vIGVub3VnaCBmb3IgIiMjIyMjOiAiCi0gICAgICAgIGZvciAoOyBpdCAhPSBtU3VtbWFyaWVzLT5lbmQoKTsgaXQrKykgewotICAgICAgICAgICAgaWYgKG9ubHkgIT0gTlVMTCAmJiBzdHJjbXAob25seSwgKCppdCktPmdldEtleSgpLmNfc3RyKCkpICE9IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFTdHJpbmcgZW50cnkgPSAoKml0KS0+dG9TdHJpbmcoKTsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlNWQ6ICIsIHNsb3QpOwotICAgICAgICAgICAgdmFsdWUuYXBwZW5kKGJ1Zik7Ci0gICAgICAgICAgICB2YWx1ZS5hcHBlbmQoZW50cnkuY19zdHIoKSk7Ci0gICAgICAgICAgICB2YWx1ZS5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICBzbG90Kys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlOwotfQotCi12b2lkIE1ldHJpY3NTdW1tYXJpemVyOjpzZXRJZ25vcmFibGVzKGNvbnN0IGNoYXIgKippZ25vcmFibGVzKSB7Ci0gICAgbUlnbm9yYWJsZXMgPSBpZ25vcmFibGVzOwotfQotCi1jb25zdCBjaGFyICoqTWV0cmljc1N1bW1hcml6ZXI6OmdldElnbm9yYWJsZXMoKSB7Ci0gICAgcmV0dXJuIG1JZ25vcmFibGVzOwotfQotCi12b2lkIE1ldHJpY3NTdW1tYXJpemVyOjpoYW5kbGVSZWNvcmQoTWVkaWFBbmFseXRpY3NJdGVtICppdGVtKSB7Ci0KLSAgICBBTE9HVigiTWV0cmljc1N1bW1hcml6ZXI6OmhhbmRsZVJlY29yZCgpIGZvciAlcyIsCi0gICAgICAgICAgICAgICAgaXRlbSA9PSBOVUxMID8gIjxub3RoaW5nPiIgOiBpdGVtLT50b1N0cmluZygpLmNfc3RyKCkpOwotCi0gICAgaWYgKGl0ZW0gPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTGlzdDxNZWRpYUFuYWx5dGljc0l0ZW0gKj46Oml0ZXJhdG9yIGl0ID0gbVN1bW1hcmllcy0+YmVnaW4oKTsKLSAgICBmb3IgKDsgaXQgIT0gbVN1bW1hcmllcy0+ZW5kKCk7IGl0KyspIHsKLSAgICAgICAgYm9vbCBnb29kID0gc2FtZUF0dHJpYnV0ZXMoKCppdCksIGl0ZW0sIGdldElnbm9yYWJsZXMoKSk7Ci0gICAgICAgIEFMT0dWKCJNYXRjaCBhZ2FpbnN0ICVzIHNheXMgJWQiLCAoKml0KS0+dG9TdHJpbmcoKS5jX3N0cigpLCBnb29kKTsKLSAgICAgICAgaWYgKGdvb2QpCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKGl0ID09IG1TdW1tYXJpZXMtPmVuZCgpKSB7Ci0gICAgICAgICAgICBBTE9HVigic2F2ZSBuZXcgcmVjb3JkIik7Ci0gICAgICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKm5pdGVtID0gaXRlbS0+ZHVwKCk7Ci0gICAgICAgICAgICBpZiAobml0ZW0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJ1bmFibGUgdG8gc2F2ZSBNZWRpYU1ldHJpY3MgcmVjb3JkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzb3J0UHJvcHMobml0ZW0pOwotICAgICAgICAgICAgbml0ZW0tPnNldEludDMyKCJhZ2dyZWdhdGVkIiwxKTsKLSAgICAgICAgICAgIG1lcmdlUmVjb3JkKCpuaXRlbSwgKml0ZW0pOwotICAgICAgICAgICAgbVN1bW1hcmllcy0+cHVzaF9iYWNrKG5pdGVtKTsKLSAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1YoImluY3JlbWVudCBleGlzdGluZyByZWNvcmQiKTsKLSAgICAgICAgICAgICgqaXQpLT5hZGRJbnQzMigiYWdncmVnYXRlZCIsMSk7Ci0gICAgICAgICAgICBtZXJnZVJlY29yZCgqKCppdCksICppdGVtKTsKLSAgICB9Ci19Ci0KLXZvaWQgTWV0cmljc1N1bW1hcml6ZXI6Om1lcmdlUmVjb3JkKE1lZGlhQW5hbHl0aWNzSXRlbSAmLypoYXZlKi8sIE1lZGlhQW5hbHl0aWNzSXRlbSAmLyppdGVtKi8pIHsKLSAgICAvLyBkZWZhdWx0IGlzIG5vIGZ1cnRoZXIgbWFzc2FnaW5nLgotICAgIEFMT0dWKCJNZXRyaWNzU3VtbWFyaXplcjo6bWVyZ2VSZWNvcmQoKSBbZGVmYXVsdF0iKTsKLSAgICByZXR1cm47Ci19Ci0KLS8vIGtlZXAgc29tZSBzdGF0cyBmb3IgdGhpbmdzOiBzdW1zLCBjb3VudHMsIHN0YW5kYXJkIGRldmlhdGlvbgotLy8gdGhlIGludGVnZXIgdmVyc2lvbiAtLSBhbGwgb2YgdGhlc2UgcGllY2VzIGFyZSBpbiA2NCBiaXRzCi12b2lkIE1ldHJpY3NTdW1tYXJpemVyOjptaW5NYXhWYXI2NChNZWRpYUFuYWx5dGljc0l0ZW0gJnN1bW1hdGlvbiwgY29uc3QgY2hhciAqa2V5LCBpbnQ2NF90IHZhbHVlKSB7Ci0gICAgaWYgKGtleSA9PSBOVUxMKQotICAgICAgICByZXR1cm47Ci0gICAgaW50IGxlbiA9IHN0cmxlbihrZXkpICsgMzI7Ci0gICAgY2hhciAqdG1wS2V5ID0gKGNoYXIgKiltYWxsb2MobGVuKTsKLQotICAgIGlmICh0bXBLZXkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gTiAtIGNvdW50IG9mIHNhbXBsZXMKLSAgICBzbnByaW50Zih0bXBLZXksIGxlbiwgIiVzLm4iLCBrZXkpOwotICAgIHN1bW1hdGlvbi5hZGRJbnQ2NCh0bXBLZXksIDEpOwotCi0gICAgLy8gemVybyAtIGNvdW50IG9mIHNhbXBsZXMgdGhhdCBhcmUgemVybwotICAgIGlmICh2YWx1ZSA9PSAwKSB7Ci0gICAgICAgIHNucHJpbnRmKHRtcEtleSwgbGVuLCAiJXMuemVybyIsIGtleSk7Ci0gICAgICAgIGludDY0X3QgemVybyA9IDA7Ci0gICAgICAgICh2b2lkKSBzdW1tYXRpb24uZ2V0SW50NjQodG1wS2V5LCZ6ZXJvKTsKLSAgICAgICAgemVybysrOwotICAgICAgICBzdW1tYXRpb24uc2V0SW50NjQodG1wS2V5LCB6ZXJvKTsKLSAgICB9Ci0KLSAgICAvLyBtaW4KLSAgICBzbnByaW50Zih0bXBLZXksIGxlbiwgIiVzLm1pbiIsIGtleSk7Ci0gICAgaW50NjRfdCBtaW4gPSB2YWx1ZTsKLSAgICBpZiAoc3VtbWF0aW9uLmdldEludDY0KHRtcEtleSwmbWluKSkgewotICAgICAgICBpZiAobWluID4gdmFsdWUpIHsKLSAgICAgICAgICAgIHN1bW1hdGlvbi5zZXRJbnQ2NCh0bXBLZXksIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN1bW1hdGlvbi5zZXRJbnQ2NCh0bXBLZXksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvLyBtYXgKLSAgICBzbnByaW50Zih0bXBLZXksIGxlbiwgIiVzLm1heCIsIGtleSk7Ci0gICAgaW50NjRfdCBtYXggPSB2YWx1ZTsKLSAgICBpZiAoc3VtbWF0aW9uLmdldEludDY0KHRtcEtleSwmbWF4KSkgewotICAgICAgICBpZiAobWF4IDwgdmFsdWUpIHsKLSAgICAgICAgICAgIHN1bW1hdGlvbi5zZXRJbnQ2NCh0bXBLZXksIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN1bW1hdGlvbi5zZXRJbnQ2NCh0bXBLZXksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvLyBjb21wb25lbnRzIGZvciBtZWFuLCBzdGRkZXY7Ci0gICAgLy8gc3RkZGV2ID0gc3FydCgxLzQqKHN1bXgyIC0gKDIqc3VteCpzdW14L24pICsgKChzdW14L24pXjIpKSkKLSAgICAvLyBzdW0geAotICAgIHNucHJpbnRmKHRtcEtleSwgbGVuLCAiJXMuc3VtWCIsIGtleSk7Ci0gICAgc3VtbWF0aW9uLmFkZEludDY0KHRtcEtleSwgdmFsdWUpOwotICAgIC8vIHN1bSB4XjIKLSAgICBzbnByaW50Zih0bXBLZXksIGxlbiwgIiVzLnN1bVgyIiwga2V5KTsKLSAgICBzdW1tYXRpb24uYWRkSW50NjQodG1wS2V5LCB2YWx1ZSp2YWx1ZSk7Ci0KLQotICAgIC8vIGxhc3QgdGhpbmcgd2UgZG8gLS0gcmVtb3ZlIHRoZSBiYXNlIGtleSBmcm9tIHRoZSBzdW1tYXRpb24KLSAgICAvLyByZWNvcmQgc28gd2Ugd29uJ3QgZ2V0IGNvbmZ1c2VkIGFib3V0IGl0IGhhdmluZyBib3RoIGluZGl2aWR1YWwKLSAgICAvLyBhbmQgc3VtbWFyeSBpbmZvcm1hdGlvbiBpbiB0aGVyZS4KLSAgICBzdW1tYXRpb24ucmVtb3ZlUHJvcChrZXkpOwotCi0gICAgZnJlZSh0bXBLZXkpOwotfQotCi0KLS8vCi0vLyBDb21wYXJhdG9ycwotLy8KLQotLy8gdGVzdGluZyB0aGF0IGFsbCBvZiAnc2luZ2xlJyBpcyBpbiAnc3VtbScKLS8vIGFuZCB0aGF0IHRoZSB2YWx1ZXMgbWF0Y2guCi0vLyAnc3VtbScgbWF5IGhhdmUgZXh0cmEgZmllbGRzLgotLy8gJ2lnbm9yYWJsZScgaXMgYSBzZXQgb2YgdGhpbmdzIHRoYXQgd2UgZG9uJ3Qgd29ycnkgYWJvdXQgbWF0Y2hpbmcgdXAKLS8vICh1c3VhbGx5IHRpbWUtIG9yIGNvdW50LWJhc2VkIHZhbHVlcyB3ZSdsbCBzdW0gZWxzZXdoZXJlKQotYm9vbCBNZXRyaWNzU3VtbWFyaXplcjo6c2FtZUF0dHJpYnV0ZXMoTWVkaWFBbmFseXRpY3NJdGVtICpzdW1tLCBNZWRpYUFuYWx5dGljc0l0ZW0gKnNpbmdsZSwgY29uc3QgY2hhciAqKmlnbm9yYWJsZSkgewotCi0gICAgaWYgKHNpbmdsZSA9PSBOVUxMIHx8IHN1bW0gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIEFMT0dWKCJNZXRyaWNzU3VtbWFyaXplcjo6c2FtZUF0dHJpYnV0ZXMoKTogc3VtbSAlcyIsIHN1bW0tPnRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgQUxPR1YoIk1ldHJpY3NTdW1tYXJpemVyOjpzYW1lQXR0cmlidXRlcygpOiBzaW5nbGUgJXMiLCBzaW5nbGUtPnRvU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgICAvLyBrZWVwIGRpZmZlcmVudCBzb3VyY2VzL3VzZXJzIHNlcGFyYXRlCi0gICAgaWYgKHNpbmdsZS0+bVVpZCAhPSBzdW1tLT5tVWlkKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyB0aGlzIGNhbiBiZSBtYWRlIGJldHRlci4KLSAgICBmb3Ioc2l6ZV90IGk9MDtpPHNpbmdsZS0+bVByb3BDb3VudDtpKyspIHsKLSAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtOjpQcm9wICpwcm9wMSA9ICYoc2luZ2xlLT5tUHJvcHNbaV0pOwotICAgICAgICBjb25zdCBjaGFyICphdHRyTmFtZSA9IHByb3AxLT5tTmFtZTsKLQotICAgICAgICAvLyBpcyBpdCBzb21ldGhpbmcgd2Ugc2hvdWxkIGlnbm9yZQotICAgICAgICBpZiAoaWdub3JhYmxlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKippZyA9IGlnbm9yYWJsZTsKLSAgICAgICAgICAgIGZvciAoOyppZzsgaWcrKykgewotICAgICAgICAgICAgICAgIGlmIChzdHJjbXAoKmlnLCBhdHRyTmFtZSkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKmlnKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIndlIGRvbid0IG1pbmQgdGhhdCBpdCBoYXMgYXR0ciAnJXMnIiwgYXR0ck5hbWUpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtOjpQcm9wICpwcm9wMiA9IHN1bW0tPmZpbmRQcm9wKGF0dHJOYW1lKTsKLSAgICAgICAgaWYgKHByb3AyID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dWKCJzdW1tIGRvZXNuJ3QgaGF2ZSB0aGlzIGF0dHIiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcDEtPm1UeXBlICE9IHByb3AyLT5tVHlwZSkgewotICAgICAgICAgICAgQUxPR1YoIm1pc21hdGNoZWQgYXR0ciB0eXBlcyIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAocHJvcDEtPm1UeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQW5hbHl0aWNzSXRlbTo6a1R5cGVJbnQzMjoKLSAgICAgICAgICAgICAgICBpZiAocHJvcDEtPnUuaW50MzJWYWx1ZSAhPSBwcm9wMi0+dS5pbnQzMlZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJtaXNtYXRjaCB2YWx1ZXMiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZUludDY0OgotICAgICAgICAgICAgICAgIGlmIChwcm9wMS0+dS5pbnQ2NFZhbHVlICE9IHByb3AyLT51LmludDY0VmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm1pc21hdGNoIHZhbHVlcyIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlRG91YmxlOgotICAgICAgICAgICAgICAgIC8vIFhYWDogd2F0Y2ggb3V0IGZvciBmbG9hdGluZyBwb2ludCBjb21wYXJpc29ucyEKLSAgICAgICAgICAgICAgICBpZiAocHJvcDEtPnUuZG91YmxlVmFsdWUgIT0gcHJvcDItPnUuZG91YmxlVmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm1pc21hdGNoIHZhbHVlcyIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlQ1N0cmluZzoKLSAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHByb3AxLT51LkNTdHJpbmdWYWx1ZSwgcHJvcDItPnUuQ1N0cmluZ1ZhbHVlKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJtaXNtYXRjaCB2YWx1ZXMiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZVJhdGU6Ci0gICAgICAgICAgICAgICAgaWYgKHByb3AxLT51LnJhdGUuY291bnQgIT0gcHJvcDItPnUucmF0ZS5jb3VudCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigibWlzbWF0Y2ggdmFsdWVzIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHByb3AxLT51LnJhdGUuZHVyYXRpb24gIT0gcHJvcDItPnUucmF0ZS5kdXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigibWlzbWF0Y2ggdmFsdWVzIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIEFMT0dWKCJtaXNtYXRjaCB2YWx1ZXMgaW4gZGVmYXVsdCB0eXBlIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLQotaW50IE1ldHJpY3NTdW1tYXJpemVyOjpQcm9wU29ydGVyKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpIHsKLSAgICBNZWRpYUFuYWx5dGljc0l0ZW06OlByb3AgKmFpID0gKE1lZGlhQW5hbHl0aWNzSXRlbTo6UHJvcCAqKWE7Ci0gICAgTWVkaWFBbmFseXRpY3NJdGVtOjpQcm9wICpiaSA9IChNZWRpYUFuYWx5dGljc0l0ZW06OlByb3AgKiliOwotICAgIHJldHVybiBzdHJjbXAoYWktPm1OYW1lLCBiaS0+bU5hbWUpOwotfQotCi0vLyB3ZSBzb3J0IGluIHRoZSBzdW1tYXJpZXMgc28gdGhhdCBpdCBsb29rcyBwcmV0dHkgaW4gdGhlIGR1bXBzeXMKLXZvaWQgTWV0cmljc1N1bW1hcml6ZXI6OnNvcnRQcm9wcyhNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0pIHsKLSAgICBpZiAoaXRlbS0+bVByb3BDb3VudCAhPSAwKSB7Ci0gICAgICAgIHFzb3J0KGl0ZW0tPm1Qcm9wcywgaXRlbS0+bVByb3BDb3VudCwKLSAgICAgICAgICAgICAgc2l6ZW9mKE1lZGlhQW5hbHl0aWNzSXRlbTo6UHJvcCksIE1ldHJpY3NTdW1tYXJpemVyOjpQcm9wU29ydGVyKTsKLSAgICB9Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyLmggYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWYwNzg2Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0jaWZuZGVmIEFORFJPSURfTUVUUklDU1NVTU1BUklaRVJfSAotI2RlZmluZSBBTkRST0lEX01FVFJJQ1NTVU1NQVJJWkVSX0gKLQotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmg+Ci0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBNZXRyaWNzU3VtbWFyaXplcgotewotCi0gcHVibGljOgotCi0gICAgTWV0cmljc1N1bW1hcml6ZXIoY29uc3QgY2hhciAqa2V5KTsKLSAgICB2aXJ0dWFsIH5NZXRyaWNzU3VtbWFyaXplcigpOwotCi0gICAgLy8gc2hvdyB0aGUga2V5Ci0gICAgY29uc3QgY2hhciAqIGdldEtleSgpOwotCi0gICAgLy8gc2hvdWxkIHRoZSByZWNvcmQgYmUgZ2l2ZW4gdG8gdGhpcyBzdW1tYXJpemVyCi0gICAgYm9vbCBpc01pbmUoTWVkaWFBbmFseXRpY3NJdGVtICZpdGVtKTsKLQotICAgIC8vIGhhbmQgdGhlIHJlY29yZCB0byB0aGlzIHN1bW1hcml6ZXIKLSAgICB2b2lkIGhhbmRsZVJlY29yZChNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0pOwotCi0gICAgdmlydHVhbCB2b2lkIG1lcmdlUmVjb3JkKE1lZGlhQW5hbHl0aWNzSXRlbSAmaGF2ZSwgTWVkaWFBbmFseXRpY3NJdGVtICZpbmNvbWluZyk7Ci0KLSAgICAvLyBkdW1wIHRoZSBzdW1tYXJpemVkIHJlY29yZHMgKGZvciBkdW1wc3lzKQotICAgIEFTdHJpbmcgZHVtcFN1bW1hcnkoaW50ICZzbG90KTsKLSAgICBBU3RyaW5nIGR1bXBTdW1tYXJ5KGludCAmc2xvdCwgY29uc3QgY2hhciAqb25seSk7Ci0KLSAgICB2b2lkIHNldElnbm9yYWJsZXMoY29uc3QgY2hhciAqKik7Ci0gICAgY29uc3QgY2hhciAqKmdldElnbm9yYWJsZXMoKTsKLQotIHByb3RlY3RlZDoKLQotICAgIC8vIHZhcmlvdXMgY29tcGFyYXRvcnMKLSAgICAvLyAiZG8gdGhlc2UgcmVjb3JkcyBoYXZlIHNhbWUgYXR0cmlidXRlcyBhbmQgdmFsdWVzIGluIHRob3NlIGF0dHJzIgotICAgIGJvb2wgc2FtZUF0dHJpYnV0ZXMoTWVkaWFBbmFseXRpY3NJdGVtICpzdW1tLCBNZWRpYUFuYWx5dGljc0l0ZW0gKnNpbmdsZSwgY29uc3QgY2hhciAqKmlnbm9yZWFibGVzKTsKLQotICAgIHZvaWQgbWluTWF4VmFyNjQoTWVkaWFBbmFseXRpY3NJdGVtICZzdW1tLCBjb25zdCBjaGFyICprZXksIGludDY0X3QgdmFsdWUpOwotCi0gICAgc3RhdGljIGludCBQcm9wU29ydGVyKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpOwotICAgIHZvaWQgc29ydFByb3BzKE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSk7Ci0KLSBwcml2YXRlOgotICAgIGNvbnN0IGNoYXIgKm1LZXk7Ci0gICAgY29uc3QgY2hhciAqKm1JZ25vcmFibGVzOwotICAgIExpc3Q8TWVkaWFBbmFseXRpY3NJdGVtICo+ICptU3VtbWFyaWVzOwotCi0KLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfTUVUUklDU1NVTU1BUklaRVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXJDb2RlYy5jcHAgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplckNvZGVjLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFmM2M5YS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplckNvZGVjLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIk1ldHJpY3NTdW1tYXJpemVyQ29kZWMiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KLQotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUFuYWx5dGljc1NlcnZpY2UuaD4KLQotI2luY2x1ZGUgIk1ldHJpY3NTdW1tYXJpemVyLmgiCi0jaW5jbHVkZSAiTWV0cmljc1N1bW1hcml6ZXJDb2RlYy5oIgotCi0KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLU1ldHJpY3NTdW1tYXJpemVyQ29kZWM6Ok1ldHJpY3NTdW1tYXJpemVyQ29kZWMoY29uc3QgY2hhciAqa2V5KQotICAgIDogTWV0cmljc1N1bW1hcml6ZXIoa2V5KQotewotICAgIEFMT0dWKCJNZXRyaWNzU3VtbWFyaXplckNvZGVjOjpNZXRyaWNzU3VtbWFyaXplckNvZGVjIik7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyQ29kZWMuaCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyQ29kZWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAxMTk2Zi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplckNvZGVjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0jaWZuZGVmIEFORFJPSURfTUVUUklDU1NVTU1BUklaRVJDT0RFQ19ICi0jZGVmaW5lIEFORFJPSURfTUVUUklDU1NVTU1BUklaRVJDT0RFQ19ICi0KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgotCi0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhQW5hbHl0aWNzU2VydmljZS5oPgotI2luY2x1ZGUgIk1ldHJpY3NTdW1tYXJpemVyLmgiCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBNZXRyaWNzU3VtbWFyaXplckNvZGVjIDogcHVibGljIE1ldHJpY3NTdW1tYXJpemVyCi17Ci0KLSBwdWJsaWM6Ci0KLSAgICBNZXRyaWNzU3VtbWFyaXplckNvZGVjKGNvbnN0IGNoYXIgKmtleSk7Ci0gICAgdmlydHVhbCB+TWV0cmljc1N1bW1hcml6ZXJDb2RlYygpIHt9OwotCi19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX01FVFJJQ1NTVU1NQVJJWkVSQ09ERUNfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXJFeHRyYWN0b3IuY3BwIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXJFeHRyYWN0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTBmODdkLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyRXh0cmFjdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIk1ldHJpY3NTdW1tYXJpemVyRXh0cmFjdG9yIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KLQotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUFuYWx5dGljc1NlcnZpY2UuaD4KLQotI2luY2x1ZGUgIk1ldHJpY3NTdW1tYXJpemVyLmgiCi0jaW5jbHVkZSAiTWV0cmljc1N1bW1hcml6ZXJFeHRyYWN0b3IuaCIKLQotCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1NZXRyaWNzU3VtbWFyaXplckV4dHJhY3Rvcjo6TWV0cmljc1N1bW1hcml6ZXJFeHRyYWN0b3IoY29uc3QgY2hhciAqa2V5KQotICAgIDogTWV0cmljc1N1bW1hcml6ZXIoa2V5KQotewotICAgIEFMT0dWKCJNZXRyaWNzU3VtbWFyaXplckV4dHJhY3Rvcjo6TWV0cmljc1N1bW1hcml6ZXJFeHRyYWN0b3IiKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXJFeHRyYWN0b3IuaCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyRXh0cmFjdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZTA1MmIuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXJFeHRyYWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLSNpZm5kZWYgQU5EUk9JRF9NRVRSSUNTU1VNTUFSSVpFUkVYVFJBQ1RPUl9ICi0jZGVmaW5lIEFORFJPSURfTUVUUklDU1NVTU1BUklaRVJFWFRSQUNUT1JfSAotCi0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KLQotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUFuYWx5dGljc1NlcnZpY2UuaD4KLSNpbmNsdWRlICJNZXRyaWNzU3VtbWFyaXplci5oIgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTWV0cmljc1N1bW1hcml6ZXJFeHRyYWN0b3IgOiBwdWJsaWMgTWV0cmljc1N1bW1hcml6ZXIKLXsKLQotIHB1YmxpYzoKLQotICAgIE1ldHJpY3NTdW1tYXJpemVyRXh0cmFjdG9yKGNvbnN0IGNoYXIgKmtleSk7Ci0gICAgdmlydHVhbCB+TWV0cmljc1N1bW1hcml6ZXJFeHRyYWN0b3IoKSB7fTsKLQotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9NRVRSSUNTU1VNTUFSSVpFUkVYVFJBQ1RPUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplclBsYXllci5jcHAgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplclBsYXllci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ODJjYjkuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXJQbGF5ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiTWV0cmljc1N1bW1hcml6ZXJQbGF5ZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KLQotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUFuYWx5dGljc1NlcnZpY2UuaD4KLQotI2luY2x1ZGUgIk1ldHJpY3NTdW1tYXJpemVyLmgiCi0jaW5jbHVkZSAiTWV0cmljc1N1bW1hcml6ZXJQbGF5ZXIuaCIKLQotCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgY29uc3QgY2hhciAqcGxheWVyX2lnbm9yYWJsZVtdID0gewotICAgICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmR1cmF0aW9uTXMiLAotICAgICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnBsYXlpbmdNcyIsCi0gICAgImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZnJhbWVzIiwKLSAgICAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5kcm9wcGVkIiwKLSAgICAwCi19OwotCi1NZXRyaWNzU3VtbWFyaXplclBsYXllcjo6TWV0cmljc1N1bW1hcml6ZXJQbGF5ZXIoY29uc3QgY2hhciAqa2V5KQotICAgIDogTWV0cmljc1N1bW1hcml6ZXIoa2V5KQotewotICAgIEFMT0dWKCJNZXRyaWNzU3VtbWFyaXplclBsYXllcjo6TWV0cmljc1N1bW1hcml6ZXJQbGF5ZXIiKTsKLSAgICBzZXRJZ25vcmFibGVzKHBsYXllcl9pZ25vcmFibGUpOwotfQotCi0vLyBOQjogdGhpcyBpcyBhbHNvIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUgLS0gc28gc3VtbWF0aW9uID09IGl0ZW0KLS8vIE5vdCBzdXJlIGlmIHdlIG5lZWQgYSBmbGFnIGZvciB0aGF0IG9yIG5vdC4KLS8vIEluIHRoaXMgcGFydGljdWxhciBtZXJnZVJlY29yZCgpIGNvZGUgLS0gd2UncmUnIG9rIGZvciB0aGlzLgotdm9pZCBNZXRyaWNzU3VtbWFyaXplclBsYXllcjo6bWVyZ2VSZWNvcmQoTWVkaWFBbmFseXRpY3NJdGVtICZzdW1tYXRpb24sIE1lZGlhQW5hbHl0aWNzSXRlbSAmaXRlbSkgewotCi0gICAgQUxPR1YoIk1ldHJpY3NTdW1tYXJpemVyUGxheWVyOjptZXJnZVJlY29yZCgpIik7Ci0KLQotICAgIGludDY0X3QgZHVyYXRpb24gPSAwOwotICAgIGlmIChpdGVtLmdldEludDY0KCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmR1cmF0aW9uTXMiLCAmZHVyYXRpb24pKSB7Ci0gICAgICAgIEFMT0dWKCJmb3VuZCBkdXJhdGlvbk1zIG9mICUiIFBSSWQ2NCwgZHVyYXRpb24pOwotICAgICAgICBtaW5NYXhWYXI2NChzdW1tYXRpb24sICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmR1cmF0aW9uTXMiLCBkdXJhdGlvbik7Ci0gICAgfQotCi0gICAgaW50NjRfdCBwbGF5aW5nID0gMDsKLSAgICBpZiAoaXRlbS5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5wbGF5aW5nTXMiLCAmcGxheWluZykpIHsKLSAgICAgICAgQUxPR1YoImZvdW5kIHBsYXlpbmdNcyBvZiAlIiBQUklkNjQsIHBsYXlpbmcpOwotICAgIH0KLSAgICBpZiAocGxheWluZyA+PSAwKSB7Ci0gICAgICAgIG1pbk1heFZhcjY0KHN1bW1hdGlvbiwiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5wbGF5aW5nTXMiLHBsYXlpbmcpOwotICAgIH0KLQotICAgIGludDY0X3QgZnJhbWVzID0gMDsKLSAgICBpZiAoaXRlbS5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5mcmFtZXMiLCAmZnJhbWVzKSkgewotICAgICAgICBBTE9HVigiZm91bmQgZnJhbWVzcyBvZiAlIiBQUklkNjQsIGZyYW1lcyk7Ci0gICAgfQotICAgIGlmIChmcmFtZXMgPj0gMCkgewotICAgICAgICBtaW5NYXhWYXI2NChzdW1tYXRpb24sImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZnJhbWVzIixmcmFtZXMpOwotICAgIH0KLQotICAgIGludDY0X3QgZHJvcHBlZCA9IDA7Ci0gICAgaWYgKGl0ZW0uZ2V0SW50NjQoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHJvcHBlZCIsICZkcm9wcGVkKSkgewotICAgICAgICBBTE9HVigiZm91bmQgZHJvcHBlZCBvZiAlIiBQUklkNjQsIGRyb3BwZWQpOwotICAgIH0KLSAgICBpZiAoZHJvcHBlZCA+PSAwKSB7Ci0gICAgICAgIG1pbk1heFZhcjY0KHN1bW1hdGlvbiwiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5kcm9wcGVkIixkcm9wcGVkKTsKLSAgICB9Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyUGxheWVyLmggYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplclBsYXllci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDFiZjc0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyUGxheWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0jaWZuZGVmIEFORFJPSURfTUVUUklDU1NVTU1BUklaRVJQTEFZRVJfSAotI2RlZmluZSBBTkRST0lEX01FVFJJQ1NTVU1NQVJJWkVSUExBWUVSX0gKLQotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmg+Ci0jaW5jbHVkZSAiTWV0cmljc1N1bW1hcml6ZXIuaCIKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1ldHJpY3NTdW1tYXJpemVyUGxheWVyIDogcHVibGljIE1ldHJpY3NTdW1tYXJpemVyCi17Ci0KLSBwdWJsaWM6Ci0KLSAgICBNZXRyaWNzU3VtbWFyaXplclBsYXllcihjb25zdCBjaGFyICprZXkpOwotICAgIHZpcnR1YWwgfk1ldHJpY3NTdW1tYXJpemVyUGxheWVyKCkge307Ci0KLSAgICB2aXJ0dWFsIHZvaWQgbWVyZ2VSZWNvcmQoTWVkaWFBbmFseXRpY3NJdGVtICZoYXZlLCBNZWRpYUFuYWx5dGljc0l0ZW0gJmluY29taW5nKTsKLQotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9NRVRSSUNTU1VNTUFSSVpFUlBMQVlFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZXRyaWNzU3VtbWFyaXplclJlY29yZGVyLmNwcCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyUmVjb3JkZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjkxOWMzLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyUmVjb3JkZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiTWV0cmljc1N1bW1hcml6ZXJSZWNvcmRlciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgotCi0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhQW5hbHl0aWNzU2VydmljZS5oPgotCi0jaW5jbHVkZSAiTWV0cmljc1N1bW1hcml6ZXIuaCIKLSNpbmNsdWRlICJNZXRyaWNzU3VtbWFyaXplclJlY29yZGVyLmgiCi0KLQotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotTWV0cmljc1N1bW1hcml6ZXJSZWNvcmRlcjo6TWV0cmljc1N1bW1hcml6ZXJSZWNvcmRlcihjb25zdCBjaGFyICprZXkpCi0gICAgOiBNZXRyaWNzU3VtbWFyaXplcihrZXkpCi17Ci0gICAgQUxPR1YoIk1ldHJpY3NTdW1tYXJpemVyUmVjb3JkZXI6Ok1ldHJpY3NTdW1tYXJpemVyUmVjb3JkZXIiKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXJSZWNvcmRlci5oIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWV0cmljc1N1bW1hcml6ZXJSZWNvcmRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjNiYWFiLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01ldHJpY3NTdW1tYXJpemVyUmVjb3JkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLSNpZm5kZWYgQU5EUk9JRF9NRVRSSUNTU1VNTUFSSVpFUlJFQ09SREVSX0gKLSNkZWZpbmUgQU5EUk9JRF9NRVRSSUNTU1VNTUFSSVpFUlJFQ09SREVSX0gKLQotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmg+Ci0jaW5jbHVkZSAiTWV0cmljc1N1bW1hcml6ZXIuaCIKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1ldHJpY3NTdW1tYXJpemVyUmVjb3JkZXIgOiBwdWJsaWMgTWV0cmljc1N1bW1hcml6ZXIKLXsKLQotIHB1YmxpYzoKLQotICAgIE1ldHJpY3NTdW1tYXJpemVyUmVjb3JkZXIoY29uc3QgY2hhciAqa2V5KTsKLSAgICB2aXJ0dWFsIH5NZXRyaWNzU3VtbWFyaXplclJlY29yZGVyKCkge307Ci0KLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfTUVUUklDU1NVTU1BUklaRVJSRUNPUkRFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9PV05FUlMgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFmMjU4YgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL09XTkVSUwpAQCAtMCwwICsxIEBACitlc3NpY2tAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLm1rCmluZGV4IGZhZWIwYTcuLjg2MzFjMzkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQubWsKQEAgLTEsMzEgKzEsNDEgQEAKIExPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKIAotIyBzZXJ2aWNlIGxpYnJhcnkKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfU1JDX0ZJTEVTIDo9IE1lZGlhQ29kZWNTZXJ2aWNlLmNwcAotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGlibWVkaWFfb214IFwKLSAgICBsaWJiaW5kZXIgXAotICAgIGxpYmd1aSBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmxvZyBcCi0gICAgbGlic3RhZ2VmcmlnaHRfb214IFwKLSAgICBsaWJzdGFnZWZyaWdodF94bWxwYXJzZXIKLUxPQ0FMX01PRFVMRTo9IGxpYm1lZGlhY29kZWNzZXJ2aWNlCi1MT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKLUxPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKK19zb2Z0d2FyZV9jb2RlY3MgOj0gXAorICAgIGxpYnN0YWdlZnJpZ2h0X3NvZnRfYWFjZGVjIFwKKyAgICBsaWJzdGFnZWZyaWdodF9zb2Z0X2FhY2VuYyBcCisgICAgbGlic3RhZ2VmcmlnaHRfc29mdF9hbXJkZWMgXAorICAgIGxpYnN0YWdlZnJpZ2h0X3NvZnRfYW1ybmJlbmMgXAorICAgIGxpYnN0YWdlZnJpZ2h0X3NvZnRfYW1yd2JlbmMgXAorICAgIGxpYnN0YWdlZnJpZ2h0X3NvZnRfYXZjZGVjIFwKKyAgICBsaWJzdGFnZWZyaWdodF9zb2Z0X2F2Y2VuYyBcCisgICAgbGlic3RhZ2VmcmlnaHRfc29mdF9mbGFjZGVjIFwKKyAgICBsaWJzdGFnZWZyaWdodF9zb2Z0X2ZsYWNlbmMgXAorICAgIGxpYnN0YWdlZnJpZ2h0X3NvZnRfZzcxMWRlYyBcCisgICAgbGlic3RhZ2VmcmlnaHRfc29mdF9nc21kZWMgXAorICAgIGxpYnN0YWdlZnJpZ2h0X3NvZnRfaGV2Y2RlYyBcCisgICAgbGlic3RhZ2VmcmlnaHRfc29mdF9tcDNkZWMgXAorICAgIGxpYnN0YWdlZnJpZ2h0X3NvZnRfbXBlZzJkZWMgXAorICAgIGxpYnN0YWdlZnJpZ2h0X3NvZnRfbXBlZzRkZWMgXAorICAgIGxpYnN0YWdlZnJpZ2h0X3NvZnRfbXBlZzRlbmMgXAorICAgIGxpYnN0YWdlZnJpZ2h0X3NvZnRfb3B1c2RlYyBcCisgICAgbGlic3RhZ2VmcmlnaHRfc29mdF9yYXdkZWMgXAorICAgIGxpYnN0YWdlZnJpZ2h0X3NvZnRfdm9yYmlzZGVjIFwKKyAgICBsaWJzdGFnZWZyaWdodF9zb2Z0X3ZweGRlYyBcCisgICAgbGlic3RhZ2VmcmlnaHRfc29mdF92cHhlbmMgXAogCiAjIHNlcnZpY2UgZXhlY3V0YWJsZQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisjIHNlY2NvbXAgaXMgbm90IHJlcXVpcmVkIGZvciBjb3ZlcmFnZSBidWlsZC4KK2lmbmVxICgkKE5BVElWRV9DT1ZFUkFHRSksdHJ1ZSkKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gY3Jhc2hfZHVtcC5wb2xpY3kKIExPQ0FMX1JFUVVJUkVEX01PRFVMRVNfYXJtIDo9IG1lZGlhY29kZWMucG9saWN5CitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTX3g4NiA6PSBtZWRpYWNvZGVjLnBvbGljeQorZW5kaWYKIExPQ0FMX1NSQ19GSUxFUyA6PSBtYWluX2NvZGVjc2VydmljZS5jcHAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgIGxpYm1lZGlhX29teCBcCi0gICAgbGlibWVkaWFjb2RlY3NlcnZpY2UgXAogICAgIGxpYmJpbmRlciBcCiAgICAgbGlidXRpbHMgXAotICAgIGxpYmd1aSBcCiAgICAgbGlibG9nIFwKICAgICBsaWJiYXNlIFwKICAgICBsaWJhdnNlcnZpY2VzX21pbmlqYWlsX3ZlbmRvciBcCkBAIC00MSwxMSArNTEsMjEgQEAKIExPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IGh3CiBMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKIExPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKKyMgU2luY2UgdGhpcyBpcyAzMi1iaXQtb25seSBtb2R1bGUsIG9ubHkgMzItYml0IHZlcnNpb24gb2YgdGhlIGNvZGVjcyBhcmUgaW5zdGFsbGVkLgorIyBUT0RPKGIvNzIzNDM1MDcpOiBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIG1hbnVhbGx5IGFkZGluZyAudmVuZG9yIHN1ZmZpeC4gVGhpcyBzaG91bGQgYmUgZG9uZQorIyBieSB0aGUgYnVpbGQgc3lzdGVtLgorTE9DQUxfUkVRVUlSRURfTU9EVUxFUyArPSBcCiskKGZvcmVhY2ggY29kZWMsJChfc29mdHdhcmVfY29kZWNzKSxcCisgICQoZXZhbCBfdmVuZG9yX3N1ZmZpeCA6PSAkKGlmICQoQk9BUkRfVk5ES19WRVJTSU9OKSwudmVuZG9yKSlcCisgICQoY29kZWMpJChfdmVuZG9yX3N1ZmZpeClcCispCitfc29mdHdhcmVfY29kZWNzIDo9CiBMT0NBTF9JTklUX1JDIDo9IGFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMC1zZXJ2aWNlLnJjCisKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQogCiAjIHNlcnZpY2Ugc2VjY29tcCBwb2xpY3kKLWlmZXEgKCQoVEFSR0VUX0FSQ0gpLCAkKGZpbHRlciAkKFRBUkdFVF9BUkNIKSwgYXJtIGFybTY0KSkKK2lmZXEgKCQoVEFSR0VUX0FSQ0gpLCAkKGZpbHRlciAkKFRBUkdFVF9BUkNIKSwgeDg2IHg4Nl82NCBhcm0gYXJtNjQpKQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiBMT0NBTF9NT0RVTEUgOj0gbWVkaWFjb2RlYy5wb2xpY3kKIExPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKQEAgLTUzLDcgKzczLDExIEBACiAjIG1lZGlhY29kZWMgcnVucyBpbiAzMi1iaXQgY29tYmF0aWJpbGl0eSBtb2RlLiBGb3IgNjQgYml0IGFyY2hpdGVjdHVyZXMsCiAjIHVzZSB0aGUgMzIgYml0IHBvbGljeQogaWZkZWYgVEFSR0VUXzJORF9BUkNICisgIGlmbmVxICgkKFRBUkdFVF9UUkFOU0xBVEVfMk5EX0FSQ0gpLHRydWUpCiAgICAgTE9DQUxfU1JDX0ZJTEVTIDo9IHNlY2NvbXBfcG9saWN5L21lZGlhY29kZWMtJChUQVJHRVRfMk5EX0FSQ0gpLnBvbGljeQorICBlbHNlCisgICAgTE9DQUxfU1JDX0ZJTEVTIDo9IHNlY2NvbXBfcG9saWN5L21lZGlhY29kZWMtJChUQVJHRVRfQVJDSCkucG9saWN5CisgIGVuZGlmCiBlbHNlCiAgICAgTE9DQUxfU1JDX0ZJTEVTIDo9IHNlY2NvbXBfcG9saWN5L21lZGlhY29kZWMtJChUQVJHRVRfQVJDSCkucG9saWN5CiBlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9NZWRpYUNvZGVjU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL01lZGlhQ29kZWNTZXJ2aWNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI1MTBjNi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL01lZGlhQ29kZWNTZXJ2aWNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIk1lZGlhQ29kZWNTZXJ2aWNlIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiTWVkaWFDb2RlY1NlcnZpY2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zcDxJT01YPiBNZWRpYUNvZGVjU2VydmljZTo6Z2V0T01YKCkgewotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1PTVhMb2NrKTsKLQotICAgIGlmIChtT01YLmdldCgpID09IE5VTEwpIHsKLSAgICAgICAgbU9NWCA9IG5ldyBPTVgoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbU9NWDsKLX0KLQotc3A8SU9NWFN0b3JlPiBNZWRpYUNvZGVjU2VydmljZTo6Z2V0T01YU3RvcmUoKSB7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU9NWFN0b3JlTG9jayk7Ci0KLSAgICBpZiAobU9NWFN0b3JlLmdldCgpID09IE5VTEwpIHsKLSAgICAgICAgbU9NWFN0b3JlID0gbmV3IE9NWFN0b3JlKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1PTVhTdG9yZTsKLX0KLQotc3RhdHVzX3QgTWVkaWFDb2RlY1NlcnZpY2U6Om9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LAotICAgICAgICB1aW50MzJfdCBmbGFncykKLXsKLSAgICByZXR1cm4gQm5NZWRpYUNvZGVjU2VydmljZTo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotfQotCi19ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvTWVkaWFDb2RlY1NlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhY29kZWMvTWVkaWFDb2RlY1NlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMwMTEzNS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL01lZGlhQ29kZWNTZXJ2aWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX01FRElBX0NPREVDX1NFUlZJQ0VfSAotI2RlZmluZSBBTkRST0lEX01FRElBX0NPREVDX1NFUlZJQ0VfSAotCi0jaW5jbHVkZSA8YmluZGVyL0JpbmRlclNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY1NlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTWVkaWFDb2RlY1NlcnZpY2UgOiBwdWJsaWMgQmluZGVyU2VydmljZTxNZWRpYUNvZGVjU2VydmljZT4sCi0gICAgICAgIHB1YmxpYyBCbk1lZGlhQ29kZWNTZXJ2aWNlCi17Ci0gICAgZnJpZW5kIGNsYXNzIEJpbmRlclNlcnZpY2U8TWVkaWFDb2RlY1NlcnZpY2U+OyAgICAvLyBmb3IgTWVkaWFDb2RlY1NlcnZpY2UoKQotcHVibGljOgotICAgIE1lZGlhQ29kZWNTZXJ2aWNlKCkgOiBCbk1lZGlhQ29kZWNTZXJ2aWNlKCkgeyB9Ci0gICAgdmlydHVhbCB+TWVkaWFDb2RlY1NlcnZpY2UoKSB7IH0KLSAgICB2aXJ0dWFsIHZvaWQgb25GaXJzdFJlZigpIHsgfQotCi0gICAgc3RhdGljIGNvbnN0IGNoYXIqICAgIGdldFNlcnZpY2VOYW1lKCkgeyByZXR1cm4gIm1lZGlhLmNvZGVjIjsgfQotCi0gICAgdmlydHVhbCBzcDxJT01YPiAgICAgIGdldE9NWCgpOwotCi0gICAgdmlydHVhbCBzcDxJT01YU3RvcmU+IGdldE9NWFN0b3JlKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgb25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpOwotCi1wcml2YXRlOgotICAgIE11dGV4ICAgICAgICAgICAgICAgICBtT01YTG9jazsKLSAgICBzcDxJT01YPiAgICAgICAgICAgICAgbU9NWDsKLSAgICBNdXRleCAgICAgICAgICAgICAgICAgbU9NWFN0b3JlTG9jazsKLSAgICBzcDxJT01YU3RvcmU+ICAgICAgICAgbU9NWFN0b3JlOwotfTsKLQotfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9DT0RFQ19TRVJWSUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wLXNlcnZpY2UucmMgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL2FuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMC1zZXJ2aWNlLnJjCmluZGV4IGVjNTFkNjUuLjNlZjlhODUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wLXNlcnZpY2UucmMKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAtc2VydmljZS5yYwpAQCAtMSw0ICsxLDQgQEAKLXNlcnZpY2UgbWVkaWFjb2RlYyAvdmVuZG9yL2Jpbi9ody9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAtc2VydmljZQorc2VydmljZSB2ZW5kb3IubWVkaWEub214IC92ZW5kb3IvYmluL2h3L2FuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMC1zZXJ2aWNlCiAgICAgY2xhc3MgbWFpbgogICAgIHVzZXIgbWVkaWFjb2RlYwogICAgIGdyb3VwIGNhbWVyYSBkcm1ycGMgbWVkaWFkcm0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvbWFpbl9jb2RlY3NlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX2NvZGVjc2VydmljZS5jcHAKaW5kZXggNzlkNmRhNS4uNTE2MTlmNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX2NvZGVjc2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX2NvZGVjc2VydmljZS5jcHAKQEAgLTE1LDI2ICsxNSwxOSBAQAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLQotI2luY2x1ZGUgPHN0cmluZz4KLQogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAKIC8vIGZyb20gTE9DQUxfQ19JTkNMVURFUwotI2luY2x1ZGUgIk1lZGlhQ29kZWNTZXJ2aWNlLmgiCiAjaW5jbHVkZSAibWluaWphaWwuaCIKIAorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KICNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXguaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9Db2RlY1NlcnZpY2VSZWdpc3RyYW50Lmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KKwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKIC8vIE11c3QgbWF0Y2ggbG9jYXRpb24gaW4gQW5kcm9pZC5tay4KQEAgLTQ1LDIxICszOCwzMiBAQAogCiBpbnQgbWFpbihpbnQgYXJnYyBfX3VudXNlZCwgY2hhcioqIGFyZ3YpCiB7CisgICAgc3RyY3B5KGFyZ3ZbMF0sICJtZWRpYS5jb2RlYyIpOwogICAgIExPRyhJTkZPKSA8PCAibWVkaWFjb2RlY3NlcnZpY2Ugc3RhcnRpbmciOwotICAgIGJvb2wgdHJlYmxlID0gcHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QubWVkaWEudHJlYmxlX29teCIsIHRydWUpOwotICAgIGlmICh0cmVibGUpIHsKLSAgICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6aW5pdFdpdGhEcml2ZXIoIi9kZXYvdm5kYmluZGVyIik7Ci0gICAgfQotCiAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwogICAgIFNldFVwTWluaWphaWwoa1N5c3RlbVNlY2NvbXBQb2xpY3lQYXRoLCBrVmVuZG9yU2VjY29tcFBvbGljeVBhdGgpOwogCi0gICAgc3RyY3B5KGFyZ3ZbMF0sICJtZWRpYS5jb2RlYyIpOworICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6aW5pdFdpdGhEcml2ZXIoIi9kZXYvdm5kYmluZGVyIik7CisgICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwogCiAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbCg2NCwgZmFsc2UpOwotICAgIHNwPFByb2Nlc3NTdGF0ZT4gcHJvYyhQcm9jZXNzU3RhdGU6OnNlbGYoKSk7CiAKLSAgICBpZiAodHJlYmxlKSB7CisgICAgLy8gUmVnaXN0cmF0aW9uIG9mIGN1c3RvbWl6ZWQgY29kZWMgc2VydmljZXMKKyAgICB2b2lkICpyZWdpc3RyYW50TGliID0gZGxvcGVuKAorICAgICAgICAgICAgImxpYm1lZGlhX2NvZGVjc2VydmljZXJlZ2lzdHJhbnQuc28iLAorICAgICAgICAgICAgUlRMRF9OT1cgfCBSVExEX0xPQ0FMKTsKKyAgICBpZiAocmVnaXN0cmFudExpYikgeworICAgICAgICBSZWdpc3RlckNvZGVjU2VydmljZXNGdW5jIHJlZ2lzdGVyQ29kZWNTZXJ2aWNlcyA9CisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxSZWdpc3RlckNvZGVjU2VydmljZXNGdW5jPigKKyAgICAgICAgICAgICAgICBkbHN5bShyZWdpc3RyYW50TGliLCAiUmVnaXN0ZXJDb2RlY1NlcnZpY2VzIikpOworICAgICAgICBpZiAocmVnaXN0ZXJDb2RlY1NlcnZpY2VzKSB7CisgICAgICAgICAgICByZWdpc3RlckNvZGVjU2VydmljZXMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiQ2Fubm90IHJlZ2lzdGVyIGFkZGl0aW9uYWwgc2VydmljZXMgIgorICAgICAgICAgICAgICAgICAgICAiLS0gY29ycnVwdGVkIGxpYnJhcnkuIjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIERlZmF1bHQgY29kZWMgc2VydmljZXMKICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA7CiAgICAgICAgIHNwPElPbXhTdG9yZT4gb214U3RvcmUgPSBuZXcgaW1wbGVtZW50YXRpb246Ok9teFN0b3JlKCk7CiAgICAgICAgIGlmIChvbXhTdG9yZSA9PSBudWxscHRyKSB7CkBAIC03MywxMyArNzcsOSBAQAogICAgICAgICB9IGVsc2UgaWYgKG9teC0+cmVnaXN0ZXJBc1NlcnZpY2UoKSAhPSBPSykgewogICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IHJlZ2lzdGVyIElPbXggSEFMIHNlcnZpY2UuIjsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiVHJlYmxlIE9NWCBzZXJ2aWNlIGNyZWF0ZWQuIjsKKyAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiSU9teCBIQUwgc2VydmljZSBjcmVhdGVkLiI7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBNZWRpYUNvZGVjU2VydmljZTo6aW5zdGFudGlhdGUoKTsKLSAgICAgICAgTE9HKElORk8pIDw8ICJOb24tVHJlYmxlIE9NWCBzZXJ2aWNlIGNyZWF0ZWQuIjsKICAgICB9CiAKLSAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7Ci0gICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+am9pblRocmVhZFBvb2woKTsKKyAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpqb2luUnBjVGhyZWFkcG9vbCgpOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLWFybS5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMtYXJtLnBvbGljeQppbmRleCBjYmQ3ZmI5Li42ZWM4ODk1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMtYXJtLnBvbGljeQorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMtYXJtLnBvbGljeQpAQCAtNTMsMTggKzUzLDYgQEAKIGZzdGF0YXQ2NDogMQogdWdldHJsaW1pdDogMQogZ2V0ZGVudHM2NDogMQorZ2V0cmFuZG9tOiAxCiAKLSMgZm9yIGF0dGFjaGluZyB0byBkZWJ1Z2dlcmQgb24gcHJvY2VzcyBjcmFzaAotc2lnYWN0aW9uOiAxCi10Z2tpbGw6IDEKLXNvY2tldDogMQotY29ubmVjdDogMQotZmNudGw2NDogMQotcnRfdGdzaWdxdWV1ZWluZm86IDEKLWdldGV1aWQzMjogMQotZ2V0Z2lkMzI6IDEKLWdldGVnaWQzMjogMQotZ2V0Z3JvdXBzMzI6IDEKLXJlY3Ztc2c6IDEKLWdldHBpZDogMQotZ2V0dGlkOiAxCitAaW5jbHVkZSAvc3lzdGVtL2V0Yy9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLmFybS5wb2xpY3kKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy14ODYucG9saWN5IGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLXg4Ni5wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJiZTU1MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy14ODYucG9saWN5CkBAIC0wLDAgKzEsNTggQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3JlYWQ6IDEKK21wcm90ZWN0OiAxCitwcmN0bDogMQorb3BlbmF0OiAxCitvcGVuOiAxCitnZXR1aWQzMjogMQord3JpdGV2OiAxCitpb2N0bDogMQorY2xvc2U6IDEKK21tYXAyOiAxCitmc3RhdDY0OiAxCitzdGF0NjQ6IDEKK21hZHZpc2U6IDEKK2ZzdGF0YXQ2NDogMQorZnV0ZXg6IDEKK211bm1hcDogMQorZmFjY2Vzc2F0OiAxCitfbGxzZWVrOiAxCitsc2VlazogMQorY2xvbmU6IDEKK3NpZ2FsdHN0YWNrOiAxCitzZXRwcmlvcml0eTogMQorcmVzdGFydF9zeXNjYWxsOiAxCitleGl0OiAxCitleGl0X2dyb3VwOiAxCitydF9zaWdyZXR1cm46IDEKK3VnZXRybGltaXQ6IDEKK3JlYWRsaW5rYXQ6IDEKK19sbHNlZWs6IDEKK2ZzdGF0ZnM2NDogMQorcHJlYWQ2NDogMQorbXJlbWFwOiAxCitkdXA6IDEKK3NldF90aWRfYWRkcmVzczogMQord3JpdGU6IDEKK25hbm9zbGVlcDogMQorCisjIFJlcXVpcmVkIGJ5IEFkZHJlc3NTYW5pdGl6ZXIKK2dldHRpZDogMQorc2NoZWRfeWllbGQ6IDEKK2dldHBpZDogMQorZ2V0dGlkOiAxCisKK0BpbmNsdWRlIC9zeXN0ZW0vZXRjL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAueDg2LnBvbGljeQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFkcm0vQW5kcm9pZC5tayBiL3NlcnZpY2VzL21lZGlhZHJtL0FuZHJvaWQubWsKaW5kZXggMmRhYTgyOS4uZTg3MDk2NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFkcm0vQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9tZWRpYWRybS9BbmRyb2lkLm1rCkBAIC0yOCw3ICsyOCw4IEBACiAgICAgbGliaGlkbGJhc2UgXAogICAgIGxpYmhpZGxtZW1vcnkgXAogICAgIGxpYmhpZGx0cmFuc3BvcnQgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMAorICAgIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMCBcCisgICAgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xCiAKIExPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2V4dHJhIC1XZXJyb3IKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFkcm0vTWVkaWFEcm1TZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhZHJtL01lZGlhRHJtU2VydmljZS5jcHAKaW5kZXggYTM2OGMxMS4uNWFmZDA3OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFkcm0vTWVkaWFEcm1TZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWRybS9NZWRpYURybVNlcnZpY2UuY3BwCkBAIC0yNCw4ICsyNCw4IEBACiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSA8bWVkaWEvQ3J5cHRvSGFsLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRHJtSGFsLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vQ3J5cHRvSGFsLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtSGFsLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFkcm0vTWVkaWFEcm1TZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYWRybS9NZWRpYURybVNlcnZpY2UuaAppbmRleCBlY2MyZGE3Li4zNjA3MjAxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWRybS9NZWRpYURybVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9tZWRpYWRybS9NZWRpYURybVNlcnZpY2UuaApAQCAtMjQsNyArMjQsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTWV0YWRhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhRHJtU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0lNZWRpYURybVNlcnZpY2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvQW5kcm9pZC5tawppbmRleCAxZWJiN2ZmLi5kNTA1Y2ZlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQubWsKQEAgLTIsNyArMiwxMSBAQAogCiAjIHNlcnZpY2UgbGlicmFyeQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9TUkNfRklMRVMgOj0gTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcAorTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcCBcCisgICAgTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmNwcCBcCisKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlibWVkaWEgbGlic3RhZ2VmcmlnaHQgbGliYmluZGVyIGxpYnV0aWxzIGxpYmxvZwogTE9DQUxfTU9EVUxFOj0gbGlibWVkaWFleHRyYWN0b3JzZXJ2aWNlCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCkBAIC0xMSw5ICsxNSwyNCBAQAogIyBzZXJ2aWNlIGV4ZWN1dGFibGUKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogIyBzZWNjb21wIGZpbHRlcnMgYXJlIGRlZmluZWQgZm9yIHRoZSBmb2xsb3dpbmcgYXJjaGl0ZWN0dXJlczoKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gY3Jhc2hfZHVtcC5wb2xpY3kKIExPQ0FMX1JFUVVJUkVEX01PRFVMRVNfYXJtIDo9IG1lZGlhZXh0cmFjdG9yLnBvbGljeQogTE9DQUxfUkVRVUlSRURfTU9EVUxFU19hcm02NCA6PSBtZWRpYWV4dHJhY3Rvci5wb2xpY3kKIExPQ0FMX1JFUVVJUkVEX01PRFVMRVNfeDg2IDo9IG1lZGlhZXh0cmFjdG9yLnBvbGljeQorCisjIGV4dHJhY3RvciBsaWJyYXJpZXMKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgKz0gXAorICAgIGxpYmFhY2V4dHJhY3RvciBcCisgICAgbGliYW1yZXh0cmFjdG9yIFwKKyAgICBsaWJmbGFjZXh0cmFjdG9yIFwKKyAgICBsaWJtaWRpZXh0cmFjdG9yIFwKKyAgICBsaWJta3ZleHRyYWN0b3IgXAorICAgIGxpYm1wM2V4dHJhY3RvciBcCisgICAgbGlibXA0ZXh0cmFjdG9yIFwKKyAgICBsaWJtcGVnMmV4dHJhY3RvciBcCisgICAgbGlib2dnZXh0cmFjdG9yIFwKKyAgICBsaWJ3YXZleHRyYWN0b3IgXAorCiBMT0NBTF9TUkNfRklMRVMgOj0gbWFpbl9leHRyYWN0b3JzZXJ2aWNlLmNwcAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJtZWRpYSBsaWJtZWRpYWV4dHJhY3RvcnNlcnZpY2UgbGliYmluZGVyIGxpYnV0aWxzIFwKICAgICBsaWJsb2cgbGliYmFzZSBsaWJpY3V1YyBsaWJhdnNlcnZpY2VzX21pbmlqYWlsCkBAIC0yMSw2ICs0MCw3IEBACiBMT0NBTF9NT0RVTEU6PSBtZWRpYWV4dHJhY3RvcgogTE9DQUxfSU5JVF9SQyA6PSBtZWRpYWV4dHJhY3Rvci5yYwogTE9DQUxfQ19JTkNMVURFUyA6PSBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhCitMT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCiAKICMgc2VydmljZSBzZWNjb21wIGZpbHRlcgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKaW5kZXggMDhjYmVmNi4uZjBmNDRmNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCkBAIC0yMCw4ICsyMCwxMSBAQAogCiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgIk1lZGlhRXh0cmFjdG9yU2VydmljZS5oIgogCkBAIC0zMSwyOSArMzQsMjkgQEAKICAgICAgICAgY29uc3Qgc3A8SURhdGFTb3VyY2U+ICZyZW1vdGVTb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpIHsKICAgICBBTE9HVigiQEBAIE1lZGlhRXh0cmFjdG9yU2VydmljZTo6bWFrZUV4dHJhY3RvciBmb3IgJXMiLCBtaW1lKTsKIAotICAgIHNwPERhdGFTb3VyY2U+IGxvY2FsU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbUlEYXRhU291cmNlKHJlbW90ZVNvdXJjZSk7CisgICAgc3A8RGF0YVNvdXJjZT4gbG9jYWxTb3VyY2UgPSBDcmVhdGVEYXRhU291cmNlRnJvbUlEYXRhU291cmNlKHJlbW90ZVNvdXJjZSk7CiAKLSAgICBzcDxJTWVkaWFFeHRyYWN0b3I+IHJldCA9IE1lZGlhRXh0cmFjdG9yOjpDcmVhdGVGcm9tU2VydmljZShsb2NhbFNvdXJjZSwgbWltZSk7CisgICAgc3A8SU1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3IgPSBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkNyZWF0ZUZyb21TZXJ2aWNlKGxvY2FsU291cmNlLCBtaW1lKTsKIAogICAgIEFMT0dWKCJleHRyYWN0b3Igc2VydmljZSBjcmVhdGVkICVwICglcykiLAotICAgICAgICAgICAgcmV0LmdldCgpLAotICAgICAgICAgICAgcmV0ID09IE5VTEwgPyAiIiA6IHJldC0+bmFtZSgpKTsKKyAgICAgICAgICAgIGV4dHJhY3Rvci5nZXQoKSwKKyAgICAgICAgICAgIGV4dHJhY3RvciA9PSBudWxscHRyID8gIiIgOiBleHRyYWN0b3ItPm5hbWUoKSk7CiAKLSAgICBpZiAocmV0ICE9IE5VTEwpIHsKLSAgICAgICAgcmVnaXN0ZXJNZWRpYUV4dHJhY3RvcihyZXQsIGxvY2FsU291cmNlLCBtaW1lKTsKKyAgICBpZiAoZXh0cmFjdG9yICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmVnaXN0ZXJNZWRpYUV4dHJhY3RvcihleHRyYWN0b3IsIGxvY2FsU291cmNlLCBtaW1lKTsKKyAgICAgICAgcmV0dXJuIGV4dHJhY3RvcjsKICAgICB9Ci0KLSAgICByZXR1cm4gcmV0OworICAgIHJldHVybiBudWxscHRyOwogfQogCiBzcDxJRGF0YVNvdXJjZT4gTWVkaWFFeHRyYWN0b3JTZXJ2aWNlOjptYWtlSURhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpCiB7Ci0gICAgc3A8RGF0YVNvdXJjZT4gc291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbUZkKGZkLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgcmV0dXJuIHNvdXJjZS5nZXQoKSAhPSBudWxscHRyID8gc291cmNlLT5hc0lEYXRhU291cmNlKCkgOiBudWxscHRyOworICAgIHNwPERhdGFTb3VyY2U+IHNvdXJjZSA9IERhdGFTb3VyY2VGYWN0b3J5OjpDcmVhdGVGcm9tRmQoZmQsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICByZXR1cm4gQ3JlYXRlSURhdGFTb3VyY2VGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogfQogCiBzdGF0dXNfdCBNZWRpYUV4dHJhY3RvclNlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7Ci0gICAgcmV0dXJuIGR1bXBFeHRyYWN0b3JzKGZkLCBhcmdzKTsKKyAgICByZXR1cm4gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpkdW1wKGZkLCBhcmdzKSB8fCBkdW1wRXh0cmFjdG9ycyhmZCwgYXJncyk7CiB9CiAKIHN0YXR1c190IE1lZGlhRXh0cmFjdG9yU2VydmljZTo6b25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzNhNjk4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZSIKKyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KKworI2luY2x1ZGUgIk1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworCitiaW5kZXI6OlN0YXR1cyBNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2U6OmxvYWRQbHVnaW5zKGNvbnN0IDo6c3RkOjpzdHJpbmcmIGFwa1BhdGgpIHsKKyAgICBBTE9HVigibG9hZFBsdWdpbnMgJXMiLCBhcGtQYXRoLmNfc3RyKCkpOworICAgIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6TG9hZFBsdWdpbnMoYXBrUGF0aCk7CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCit9ICAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5oIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDExNWY2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9FWFRSQUNUT1JfVVBEQVRFX1NFUlZJQ0VfSAorI2RlZmluZSBBTkRST0lEX01FRElBX0VYVFJBQ1RPUl9VUERBVEVfU0VSVklDRV9ICisKKyNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQm5NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKKworY2xhc3MgTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlCisgICAgOiBwdWJsaWMgQmluZGVyU2VydmljZTxNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2U+LCBwdWJsaWMgQm5NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UKK3sKKyAgICBmcmllbmQgY2xhc3MgQmluZGVyU2VydmljZTxNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2U+OworcHVibGljOgorICAgIE1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZSgpIDogQm5NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UoKSB7IH0KKyAgICB2aXJ0dWFsIH5NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UoKSB7IH0KKyAgICBzdGF0aWMgY29uc3QgY2hhciogZ2V0U2VydmljZU5hbWUoKSB7IHJldHVybiAibWVkaWEuZXh0cmFjdG9yLnVwZGF0ZSI7IH0KKyAgICBiaW5kZXI6OlN0YXR1cyBsb2FkUGx1Z2lucyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBhcGtQYXRoKTsKK307CisKK30gICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfRVhUUkFDVE9SX1VQREFURV9TRVJWSUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL21haW5fZXh0cmFjdG9yc2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9tYWluX2V4dHJhY3RvcnNlcnZpY2UuY3BwCmluZGV4IDZhNTMyMGQuLjhkMzM1OWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL21haW5fZXh0cmFjdG9yc2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvbWFpbl9leHRyYWN0b3JzZXJ2aWNlLmNwcApAQCAtMjUsMTEgKzI1LDEzIEBACiAjaW5jbHVkZSA8c3RyaW5nPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KIAogLy8gZnJvbSBMT0NBTF9DX0lOQ0xVREVTCiAjaW5jbHVkZSAiSWN1VXRpbHMuaCIKICNpbmNsdWRlICJNZWRpYUV4dHJhY3RvclNlcnZpY2UuaCIKKyNpbmNsdWRlICJNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaCIKICNpbmNsdWRlICJNZWRpYVV0aWxzLmgiCiAjaW5jbHVkZSAibWluaWphaWwuaCIKIApAQCAtNjMsNiArNjUsMTIgQEAKICAgICBzcDxQcm9jZXNzU3RhdGU+IHByb2MoUHJvY2Vzc1N0YXRlOjpzZWxmKCkpOwogICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKICAgICBNZWRpYUV4dHJhY3RvclNlcnZpY2U6Omluc3RhbnRpYXRlKCk7CisKKyAgICBzdGQ6OnN0cmluZyB2YWx1ZSA9IGJhc2U6OkdldFByb3BlcnR5KCJyby5idWlsZC50eXBlIiwgInVua25vd24iKTsKKyAgICBpZiAodmFsdWUgPT0gInVzZXJkZWJ1ZyIgfHwgdmFsdWUgPT0gImVuZyIpIHsKKyAgICAgICAgbWVkaWE6Ok1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZTo6aW5zdGFudGlhdGUoKTsKKyAgICB9CisKICAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+am9pblRocmVhZFBvb2woKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLWFybS5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci1hcm0ucG9saWN5CmluZGV4IDIzZDM0OWQuLjg3MDE4ZWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLWFybS5wb2xpY3kKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3Ivc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3ItYXJtLnBvbGljeQpAQCAtMzksMjUgKzM5LDEzIEBACiBnZXRlZ2lkMzI6IDEKIGdldGdyb3VwczMyOiAxCiBuYW5vc2xlZXA6IDEKK2dldHJhbmRvbTogMQorCisjIGZvciBkeW5hbWljYWxseSBsb2FkaW5nIGV4dHJhY3RvcnMKK3ByZWFkNjQ6IDEKIAogIyBmb3IgRmlsZVNvdXJjZQogcmVhZGxpbmthdDogMQogX2xsc2VlazogMQogCi0jIGZvciBhdHRhY2hpbmcgdG8gZGVidWdnZXJkIG9uIHByb2Nlc3MgY3Jhc2gKLXNpZ2FjdGlvbjogMQotdGdraWxsOiAxCi1zb2NrZXQ6IDEKLWNvbm5lY3Q6IDEKLXJlY3Ztc2c6IDEKLWZjbnRsNjQ6IDEKLXJ0X3Rnc2lncXVldWVpbmZvOiAxCi1nZXRldWlkMzI6IDEKLWdldGdpZDMyOiAxCi1nZXRlZ2lkMzI6IDEKLWdldGdyb3VwczMyOiAxCi1nZXRkZW50czY0OiAxCi1waXBlMjogMQotcHBvbGw6IDEKLWdldHBpZDogMQotZ2V0dGlkOiAxCitAaW5jbHVkZSAvc3lzdGVtL2V0Yy9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLmFybS5wb2xpY3kKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLWFybTY0LnBvbGljeSBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLWFybTY0LnBvbGljeQppbmRleCA0MmUwZDc1Li5kNzBlMjdiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci1hcm02NC5wb2xpY3kKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3Ivc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3ItYXJtNjQucG9saWN5CkBAIC0xOSw2ICsxOSw3IEBACiBzZXRwcmlvcml0eTogMQogc2lnYWx0c3RhY2s6IDEKIGNsb25lOiAxCitzY2hlZF9zZXRzY2hlZHVsZXI6IDEKIGxzZWVrOiAxCiBuZXdmc3RhdGF0OiAxCiBmYWNjZXNzYXQ6IDEKQEAgLTI4LDI3ICsyOSwxNSBAQAogcnRfc2lncmV0dXJuOiAxCiBnZXRybGltaXQ6IDEKIG5hbm9zbGVlcDogMQorZ2V0cmFuZG9tOiAxCiAKICMgZm9yIEZpbGVTb3VyY2UKIHJlYWRsaW5rYXQ6IDEKLV9sbHNlZWs6IDEKIAotIyBmb3IgYXR0YWNoaW5nIHRvIGRlYnVnZ2VyZCBvbiBwcm9jZXNzIGNyYXNoCi10Z2tpbGw6IDEKLXJ0X3NpZ3Byb2NtYXNrOiAxCi1ydF9zaWdhY3Rpb246IDEKLSMgc29ja2V0OiBhcmcwID09IEFGX0xPQ0FMCi1zb2NrZXQ6IGFyZzAgPT0gMQotY29ubmVjdDogMQotcmVjdm1zZzogMQotcnRfdGdzaWdxdWV1ZWluZm86IDEKLXdyaXRldjogMQotZ2V0ZXVpZDogMQotZ2V0Z2lkOiAxCi1nZXRlZ2lkOiAxCi1nZXRncm91cHM6IDEKKyMgZm9yIGR5bmFtaWNhbGx5IGxvYWRpbmcgZXh0cmFjdG9ycwogZ2V0ZGVudHM2NDogMQotcGlwZTI6IDEKLXBwb2xsOiAxCi1nZXRwaWQ6IDEKLWdldHRpZDogMQorcmVhZGxpbmthdDogMQorcHJlYWQ2NDogMQorbXJlbWFwOiAxCisKK0BpbmNsdWRlIC9zeXN0ZW0vZXRjL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAuYXJtNjQucG9saWN5CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci14ODYucG9saWN5IGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3Ivc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3IteDg2LnBvbGljeQppbmRleCA3NjQwM2YyLi5kNzM5YmExIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci14ODYucG9saWN5CisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLXg4Ni5wb2xpY3kKQEAgLTM3LDI4ICszNywyMiBAQAogZ2V0ZWdpZDMyOiAxCiBnZXRncm91cHMzMjogMQogbmFub3NsZWVwOiAxCitnZXRyYW5kb206IDEKKworIyBmb3IgZHluYW1pY2FsbHkgbG9hZGluZyBleHRyYWN0b3JzCitnZXRkZW50czY0OiAxCityZWFkbGlua2F0OiAxCitwcmVhZDY0OiAxCittcmVtYXA6IDEKIAogIyBmb3IgRmlsZVNvdXJjZQogcmVhZGxpbmthdDogMQogX2xsc2VlazogMQogCi0jIGZvciBhdHRhY2hpbmcgdG8gZGVidWdnZXJkIG9uIHByb2Nlc3MgY3Jhc2gKLXNvY2tldGNhbGw6IDEKLXNpZ2FjdGlvbjogMQotdGdraWxsOiAxCi1ydF9zaWdwcm9jbWFzazogMQotZmNudGw2NDogMQotcnRfdGdzaWdxdWV1ZWluZm86IDEKLWdldGV1aWQzMjogMQotZ2V0Z2lkMzI6IDEKLWdldGVnaWQzMjogMQotZ2V0Z3JvdXBzMzI6IDEKLWdldGRlbnRzNjQ6IDEKLXBpcGUyOiAxCi1wcG9sbDogMQotCiAjIFJlcXVpcmVkIGJ5IEFkZHJlc3NTYW5pdGl6ZXIKIGdldHRpZDogMQogc2NoZWRfeWllbGQ6IDEKIGdldHBpZDogMQogZ2V0dGlkOiAxCisKK0BpbmNsdWRlIC9zeXN0ZW0vZXRjL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAueDg2LnBvbGljeQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjllNmRmYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyMiBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJtZWRpYWxvZ3NlcnZpY2UiLAorCisgICAgc3JjczogWworICAgICAgICAiSU1lZGlhTG9nU2VydmljZS5jcHAiLAorICAgICAgICAiTWVkaWFMb2dTZXJ2aWNlLmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibmJhaW8iLAorICAgICAgICAibGlibmJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIzYjE4Ni4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IE1lZGlhTG9nU2VydmljZS5jcHAgSU1lZGlhTG9nU2VydmljZS5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJiaW5kZXIgbGlidXRpbHMgbGlibG9nIGxpYm5iYWlvIGxpYmF1ZGlvdXRpbHMKLQotTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKLQotTE9DQUxfTU9EVUxFOj0gbGlibWVkaWFsb2dzZXJ2aWNlCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKQotCi1MT0NBTF9DRkxBR1MgOj0gLVdlcnJvciAtV2FsbAotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmNwcAppbmRleCBhNTUxMmUxLi4xYmU1NTQ0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5jcHAKQEAgLTIwLDE5ICsyMCwyNSBAQAogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25DYWNoZS5oPgotI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CTG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KICNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KICNpbmNsdWRlICJNZWRpYUxvZ1NlcnZpY2UuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0gc3RhdGljIGNvbnN0IGNoYXIga0RlYWRsb2NrZWRTdHJpbmdbXSA9ICJNZWRpYUxvZ1NlcnZpY2UgbWF5IGJlIGRlYWRsb2NrZWRcbiI7CitzdGF0aWMgY29uc3QgY2hhciBrRGVhZGxvY2tlZFN0cmluZ1tdID0gIk1lZGlhTG9nU2VydmljZSBtYXkgYmUgZGVhZGxvY2tlZFxuIjsKKworLy8gbU1lcmdlciwgbU1lcmdlUmVhZGVyLCBhbmQgbU1lcmdlVGhyZWFkIGFsbCBwb2ludCB0byB0aGUgc2FtZSBsb2NhdGlvbiBpbiBtZW1vcnkKKy8vIG1NZXJnZXJTaGFyZWQuIFRoaXMgaXMgdGhlIGxvY2FsIG1lbW9yeSBGSUZPIGNvbnRhaW5pbmcgZGF0YSBtZXJnZWQgZnJvbSBhbGwKKy8vIGluZGl2aWR1YWwgdGhyZWFkIEZJRk9zIGluIHNoYXJlZCBtZW1vcnkuIG1NZXJnZVRocmVhZCBpcyB1c2VkIHRvIHBlcmlvZGljYWxseQorLy8gY2FsbCBOQkxvZzo6TWVyZ2VyOjptZXJnZSgpIHRvIGNvbGxlY3QgdGhlIGRhdGEgYW5kIHdyaXRlIGl0IHRvIHRoZSBGSUZPLCBhbmQgY2FsbAorLy8gTkJMb2c6Ok1lcmdlUmVhZGVyOjpnZXRBbmRQcm9jZXNzU25hcHNob3QgdG8gcHJvY2VzcyB0aGUgbWVyZ2VkIGRhdGEuCiBNZWRpYUxvZ1NlcnZpY2U6Ok1lZGlhTG9nU2VydmljZSgpIDoKICAgICBCbk1lZGlhTG9nU2VydmljZSgpLAogICAgIG1NZXJnZXJTaGFyZWQoKE5CTG9nOjpTaGFyZWQqKSBtYWxsb2MoTkJMb2c6OlRpbWVsaW5lOjpzaGFyZWRTaXplKGtNZXJnZUJ1ZmZlclNpemUpKSksCiAgICAgbU1lcmdlcihtTWVyZ2VyU2hhcmVkLCBrTWVyZ2VCdWZmZXJTaXplKSwKICAgICBtTWVyZ2VSZWFkZXIobU1lcmdlclNoYXJlZCwga01lcmdlQnVmZmVyU2l6ZSwgbU1lcmdlciksCi0gICAgbU1lcmdlVGhyZWFkKG5ldyBOQkxvZzo6TWVyZ2VUaHJlYWQobU1lcmdlcikpCisgICAgbU1lcmdlVGhyZWFkKG5ldyBOQkxvZzo6TWVyZ2VUaHJlYWQobU1lcmdlciwgbU1lcmdlUmVhZGVyKSkKIHsKICAgICBtTWVyZ2VUaHJlYWQtPnJ1bigiTWVyZ2VUaHJlYWQiKTsKIH0KQEAgLTEyMywxNSArMTI5LDEwIEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0koIiVzOiIsIG5hbWVkUmVhZGVyLm5hbWUoKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFRPRE8gVGhpcyBjb2RlIGlzIGZvciB0ZXN0aW5nLCByZW1vdmUgaXQgd2hlbiBkb25lCi0gICAgICAgICAgICAgICAgLy8gbmFtZWRSZWFkZXIucmVhZGVyKCktPmR1bXAoZmQsIDAgLyppbmRlbnQqLyk7CiAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICB9CiAgICAgfQotCi0gICAgLy8gRklYTUUgcmVxdWVzdCBtZXJnZSB0byBtYWtlIHN1cmUgbG9nIGlzIHVwIHRvIGRhdGUKICAgICBtTWVyZ2VSZWFkZXIuZHVtcChmZCk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuaAppbmRleCAzOWQ5Y2MwLi5jOTQ1ZDFmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuaApAQCAtMTksNyArMTksNyBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0JpbmRlclNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFMb2dTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJMb2cuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9OQkxvZy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbG9nL09XTkVSUyBiL3NlcnZpY2VzL21lZGlhbG9nL09XTkVSUwppbmRleCBmYjhiOGVlLi4yMTcyM2JhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWxvZy9PV05FUlMKKysrIGIvc2VydmljZXMvbWVkaWFsb2cvT1dORVJTCkBAIC0xLDMgKzEsMyBAQAogZWxhdXJlbnRAZ29vZ2xlLmNvbQotZ2thc3RlbkBhbmRyb2lkLmNvbQorZ2thc3RlbkBnb29nbGUuY29tCiBodW5nYUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwCmluZGV4IDc4YmI1ODcuLjI4YmZkM2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwCkBAIC0zMSw3ICszMSw4IEBACiAKICNpbmNsdWRlICJSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiU2VydmljZUxvZy5oIgotCisjaW5jbHVkZSAibWVkaWF1dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5oIgorI2luY2x1ZGUgPGN1dGlscy9zY2hlZF9wb2xpY3kuaD4KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogbmFtZXNwYWNlIHsKQEAgLTExMSw2ICsxMTIsNyBAQAogICAgIFJlc291cmNlSW5mbyBpbmZvOwogICAgIGluZm8uY2xpZW50SWQgPSBjbGllbnRJZDsKICAgICBpbmZvLmNsaWVudCA9IGNsaWVudDsKKyAgICBpbmZvLmNwdUJvb3N0ID0gZmFsc2U7CiAgICAgaW5mb3MucHVzaF9iYWNrKGluZm8pOwogICAgIHJldHVybiBpbmZvcy5lZGl0SXRlbUF0KGluZm9zLnNpemUoKSAtIDEpOwogfQpAQCAtMjAxLDcgKzIwMyw4IEBACiAgICAgOiBtUHJvY2Vzc0luZm8ocHJvY2Vzc0luZm8pLAogICAgICAgbVNlcnZpY2VMb2cobmV3IFNlcnZpY2VMb2coKSksCiAgICAgICBtU3VwcG9ydHNNdWx0aXBsZVNlY3VyZUNvZGVjcyh0cnVlKSwKLSAgICAgIG1TdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYyh0cnVlKSB7fQorICAgICAgbVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjKHRydWUpLAorICAgICAgbUNwdUJvb3N0Q291bnQoMCkge30KIAogUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6flJlc291cmNlTWFuYWdlclNlcnZpY2UoKSB7fQogCkBAIC0yMzksNiArMjQyLDE5IEBACiAgICAgUmVzb3VyY2VJbmZvJiBpbmZvID0gZ2V0UmVzb3VyY2VJbmZvRm9yRWRpdChjbGllbnRJZCwgY2xpZW50LCBpbmZvcyk7CiAgICAgLy8gVE9ETzogZG8gdGhlIG1lcmdlIGluc3RlYWQgb2YgYXBwZW5kLgogICAgIGluZm8ucmVzb3VyY2VzLmFwcGVuZFZlY3RvcihyZXNvdXJjZXMpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXNvdXJjZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKHJlc291cmNlc1tpXS5tVHlwZSA9PSBNZWRpYVJlc291cmNlOjprQ3B1Qm9vc3QgJiYgIWluZm8uY3B1Qm9vc3QpIHsKKyAgICAgICAgICAgIGluZm8uY3B1Qm9vc3QgPSB0cnVlOworICAgICAgICAgICAgLy8gUmVxdWVzdCBpdCBvbiBldmVyeSBuZXcgaW5zdGFuY2Ugb2Yga0NwdUJvb3N0LCBhcyB0aGUgbWVkaWEuY29kZWMKKyAgICAgICAgICAgIC8vIGNvdWxkIGhhdmUgZGllZCwgaWYgd2Ugb25seSBkbyBpdCB0aGUgZmlyc3QgdGltZSBzdWJzZXF1ZW50IGluc3RhbmNlcworICAgICAgICAgICAgLy8gbmV2ZXIgZ2V0cyB0aGUgYm9vc3QuCisgICAgICAgICAgICBpZiAocmVxdWVzdENwdXNldEJvb3N0KHRydWUsIHRoaXMpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImNvdWxkbid0IHJlcXVlc3QgY3B1c2V0IGJvb3N0Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ3B1Qm9vc3RDb3VudCsrOworICAgICAgICB9CisgICAgfQogICAgIGlmIChpbmZvLmRlYXRoTm90aWZpZXIgPT0gbnVsbHB0cikgewogICAgICAgICBpbmZvLmRlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcih0aGlzLCBwaWQsIGNsaWVudElkKTsKICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoY2xpZW50KS0+bGlua1RvRGVhdGgoaW5mby5kZWF0aE5vdGlmaWVyKTsKQEAgLTI3MCw2ICsyODYsMTEgQEAKICAgICBSZXNvdXJjZUluZm9zICZpbmZvcyA9IG1NYXAuZWRpdFZhbHVlQXQoaW5kZXgpOwogICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaW5mb3Muc2l6ZSgpOyArK2opIHsKICAgICAgICAgaWYgKGluZm9zW2pdLmNsaWVudElkID09IGNsaWVudElkKSB7CisgICAgICAgICAgICBpZiAoaW5mb3Nbal0uY3B1Qm9vc3QgJiYgbUNwdUJvb3N0Q291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKC0tbUNwdUJvb3N0Q291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q3B1c2V0Qm9vc3QoZmFsc2UsIHRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGluZm9zW2pdLmNsaWVudCktPnVubGlua1RvRGVhdGgoaW5mb3Nbal0uZGVhdGhOb3RpZmllcik7CiAgICAgICAgICAgICBqID0gaW5mb3MucmVtb3ZlQXQoaik7CiAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmgKaW5kZXggOWU5N2FjMC4uODJkMmEwYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuaApAQCAtMzgsNiArMzgsNyBAQAogICAgIHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNsaWVudDsKICAgICBzcDxJQmluZGVyOjpEZWF0aFJlY2lwaWVudD4gZGVhdGhOb3RpZmllcjsKICAgICBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gcmVzb3VyY2VzOworICAgIGJvb2wgY3B1Qm9vc3Q7CiB9OwogCiB0eXBlZGVmIFZlY3RvcjxSZXNvdXJjZUluZm8+IFJlc291cmNlSW5mb3M7CkBAIC0xMTIsNiArMTEzLDcgQEAKICAgICBQaWRSZXNvdXJjZUluZm9zTWFwIG1NYXA7CiAgICAgYm9vbCBtU3VwcG9ydHNNdWx0aXBsZVNlY3VyZUNvZGVjczsKICAgICBib29sIG1TdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYzsKKyAgICBpbnQzMl90IG1DcHVCb29zdENvdW50OwogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWluaWphaWwvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21pbmlqYWlsL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdhOTRjYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21pbmlqYWlsL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzOCBAQAorbWluaWphaWxfY29tbW9uX2NmbGFncyA9IFsKKyAgICAiLVdhbGwiLAorICAgICItV2Vycm9yIiwKK10KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJhdnNlcnZpY2VzX21pbmlqYWlsX2RlZmF1bHRzIiwKKyAgICBzcmNzOiBbIm1pbmlqYWlsLmNwcCJdLAorICAgIGNmbGFnczogbWluaWphaWxfY29tbW9uX2NmbGFncywKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJtaW5pamFpbCIsCisgICAgXSwKK30KKworLy8gU21hbGwgbGlicmFyeSBmb3IgbWVkaWEuZXh0cmFjdG9yIGFuZCBtZWRpYS5jb2RlYyBzYW5kYm94aW5nLgorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJhdnNlcnZpY2VzX21pbmlqYWlsIiwKKyAgICBkZWZhdWx0czogWyJsaWJhdnNlcnZpY2VzX21pbmlqYWlsX2RlZmF1bHRzIl0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCit9CisKKy8vIFNtYWxsIGxpYnJhcnkgZm9yIG1lZGlhLmV4dHJhY3RvciBhbmQgbWVkaWEuY29kZWMgc2FuZGJveGluZy4KK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliYXZzZXJ2aWNlc19taW5pamFpbF92ZW5kb3IiLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBkZWZhdWx0czogWyJsaWJhdnNlcnZpY2VzX21pbmlqYWlsX2RlZmF1bHRzIl0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCit9CisKKy8vIFVuaXQgdGVzdHMuCitjY190ZXN0IHsKKyAgICBuYW1lOiAibGliYXZzZXJ2aWNlc19taW5pamFpbF91bml0dGVzdCIsCisgICAgZGVmYXVsdHM6IFsibGliYXZzZXJ2aWNlc19taW5pamFpbF9kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgImF2X3NlcnZpY2VzX21pbmlqYWlsX3VuaXR0ZXN0LmNwcCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21pbmlqYWlsL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9taW5pamFpbC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmZjYWNjLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21pbmlqYWlsL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLSMgU21hbGwgbGlicmFyeSBmb3IgbWVkaWEuZXh0cmFjdG9yIGFuZCBtZWRpYS5jb2RlYyBzYW5kYm94aW5nLgotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEUgOj0gbGliYXZzZXJ2aWNlc19taW5pamFpbAotTE9DQUxfU1JDX0ZJTEVTIDo9IG1pbmlqYWlsLmNwcAotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJiYXNlIGxpYm1pbmlqYWlsCi1MT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gJChMT0NBTF9QQVRIKQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi0jIFNtYWxsIGxpYnJhcnkgZm9yIG1lZGlhLmV4dHJhY3RvciBhbmQgbWVkaWEuY29kZWMgc2FuZGJveGluZy4KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IGxpYmF2c2VydmljZXNfbWluaWphaWxfdmVuZG9yCi1MT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKLUxPQ0FMX1NSQ19GSUxFUyA6PSBtaW5pamFpbC5jcHAKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYmFzZSBsaWJtaW5pamFpbF92ZW5kb3IKLUxPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSAkKExPQ0FMX1BBVEgpCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KLSMgVW5pdCB0ZXN0cy4KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IGxpYmF2c2VydmljZXNfbWluaWphaWxfdW5pdHRlc3QKLUxPQ0FMX1NSQ19GSUxFUyA6PSBtaW5pamFpbC5jcHAgYXZfc2VydmljZXNfbWluaWphaWxfdW5pdHRlc3QuY3BwCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmJhc2UgbGlibWluaWphaWwKLWluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21pbmlqYWlsL09XTkVSUyBiL3NlcnZpY2VzL21pbmlqYWlsL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWY0ZjlmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWluaWphaWwvT1dORVJTCkBAIC0wLDAgKzEsMiBAQAoram9yZ2Vsb0Bnb29nbGUuY29tCittYXJjb25lQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0NsaWVudFRyYWNrZXIuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvQ2xpZW50VHJhY2tlci5jcHAKaW5kZXggNzUzOTJiZC4uNzI2NGE5YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvQ2xpZW50VHJhY2tlci5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvQ2xpZW50VHJhY2tlci5jcHAKQEAgLTE1LDEyICsxNSwxNCBAQAogICovCiAKIAotI2RlZmluZSBMT0dfVEFHICJBQXVkaW9TZXJ2aWNlIgorI2RlZmluZSBMT0dfVEFHICJBQXVkaW9DbGllbnRUcmFja2VyIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8bXV0ZXg+CiAjaW5jbHVkZSA8dXRpbHMvU2luZ2xldG9uLmg+CkBAIC0zOSw3ICs0MSw2IEBACiAgICAgICAgIDogU2luZ2xldG9uPEFBdWRpb0NsaWVudFRyYWNrZXI+KCkgewogfQogCi0KIHN0ZDo6c3RyaW5nIEFBdWRpb0NsaWVudFRyYWNrZXI6OmR1bXAoKSBjb25zdCB7CiAgICAgc3RkOjpzdHJpbmdzdHJlYW0gcmVzdWx0OwogICAgIGNvbnN0IGJvb2wgaXNMb2NrZWQgPSBBQXVkaW9fdHJ5VW50aWxUcnVlKApAQCAtNjQsOCArNjUsNyBAQAogLy8gQ3JlYXRlIGEgdHJhY2tlciBmb3IgdGhlIGNsaWVudC4KIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9DbGllbnRUcmFja2VyOjpyZWdpc3RlckNsaWVudChwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElBQXVkaW9DbGllbnQ+JiBjbGllbnQpIHsKLSAgICBBTE9HVigiQUF1ZGlvQ2xpZW50VHJhY2tlcjo6cmVnaXN0ZXJDbGllbnQoKSwgY2FsbGluZyBwaWQgPSAlZCwgZ2V0cGlkKCkgPSAlZFxuIiwKLSAgICAgICAgICBwaWQsIGdldHBpZCgpKTsKKyAgICBBTE9HVigicmVnaXN0ZXJDbGllbnQoKSwgY2FsbGluZyBwaWQgPSAlZCwgZ2V0cGlkKCkgPSAlZFxuIiwgcGlkLCBnZXRwaWQoKSk7CiAKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CiAgICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmNvdW50KHBpZCkgPT0gMCkgewpAQCAtNzQsMTggKzc0LDE2IEBACiAKICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gSUludGVyZmFjZTo6YXNCaW5kZXIoY2xpZW50KTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYmluZGVyLT5saW5rVG9EZWF0aChub3RpZmljYXRpb25DbGllbnQpOwotICAgICAgICBBTE9HV19JRihzdGF0dXMgIT0gTk9fRVJST1IsCi0gICAgICAgICAgICAgICAgICJBQXVkaW9DbGllbnRUcmFja2VyOjpyZWdpc3RlckNsaWVudCgpIGxpbmtUb0RlYXRoID0gJWRcbiIsIHN0YXR1cyk7CisgICAgICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgInJlZ2lzdGVyQ2xpZW50KCkgbGlua1RvRGVhdGggPSAlZFxuIiwgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1cyk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1coIkFBdWRpb0NsaWVudFRyYWNrZXI6OnJlZ2lzdGVyQ2xpZW50KCVkKSBhbHJlYWR5IHJlZ2lzdGVyZWQhIiwgcGlkKTsKKyAgICAgICAgQUxPR1coInJlZ2lzdGVyQ2xpZW50KCVkKSBhbHJlYWR5IHJlZ2lzdGVyZWQhIiwgcGlkKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsgLy8gVE9ETyBzaG91bGQgdGhpcyBiZSBjb25zaWRlcmVkIGFuIGVycm9yCiAgICAgfQogfQogCiB2b2lkIEFBdWRpb0NsaWVudFRyYWNrZXI6OnVucmVnaXN0ZXJDbGllbnQocGlkX3QgcGlkKSB7Ci0gICAgQUxPR1YoIkFBdWRpb0NsaWVudFRyYWNrZXI6OnVucmVnaXN0ZXJDbGllbnQoKSwgY2FsbGluZyBwaWQgPSAlZCwgZ2V0cGlkKCkgPSAlZFxuIiwKLSAgICAgICAgICBwaWQsIGdldHBpZCgpKTsKKyAgICBBTE9HVigidW5yZWdpc3RlckNsaWVudCgpLCBjYWxsaW5nIHBpZCA9ICVkLCBnZXRwaWQoKSA9ICVkXG4iLCBwaWQsIGdldHBpZCgpKTsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CiAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMuZXJhc2UocGlkKTsKIH0KQEAgLTEwMywxMiArMTAxLDEyIEBACiBhYXVkaW9fcmVzdWx0X3QKIEFBdWRpb0NsaWVudFRyYWNrZXI6OnJlZ2lzdGVyQ2xpZW50U3RyZWFtKHBpZF90IHBpZCwgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0pIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwotICAgIEFMT0dWKCJBQXVkaW9DbGllbnRUcmFja2VyOjpyZWdpc3RlckNsaWVudFN0cmVhbSglZCwgJXApXG4iLCBwaWQsIHNlcnZpY2VTdHJlYW0uZ2V0KCkpOworICAgIEFMT0dWKCJyZWdpc3RlckNsaWVudFN0cmVhbSglZCwgJXApXG4iLCBwaWQsIHNlcnZpY2VTdHJlYW0uZ2V0KCkpOwogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKICAgICBzcDxOb3RpZmljYXRpb25DbGllbnQ+IG5vdGlmaWNhdGlvbkNsaWVudCA9IG1Ob3RpZmljYXRpb25DbGllbnRzW3BpZF07CiAgICAgaWYgKG5vdGlmaWNhdGlvbkNsaWVudCA9PSAwKSB7CiAgICAgICAgIC8vIFRoaXMgd2lsbCBnZXQgY2FsbGVkIHRoZSBmaXJzdCB0aW1lIHRoZSBhdWRpbyBzZXJ2ZXIgcmVnaXN0ZXJzIGFuIGludGVybmFsIHN0cmVhbS4KLSAgICAgICAgQUxPR1YoIkFBdWRpb0NsaWVudFRyYWNrZXI6OnJlZ2lzdGVyQ2xpZW50U3RyZWFtKCVkLCkgdW5yZWNvZ25pemVkIHBpZFxuIiwgcGlkKTsKKyAgICAgICAgQUxPR1YoInJlZ2lzdGVyQ2xpZW50U3RyZWFtKCVkLCkgdW5yZWNvZ25pemVkIHBpZFxuIiwgcGlkKTsKICAgICAgICAgbm90aWZpY2F0aW9uQ2xpZW50ID0gbmV3IE5vdGlmaWNhdGlvbkNsaWVudChwaWQpOwogICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50c1twaWRdID0gbm90aWZpY2F0aW9uQ2xpZW50OwogICAgIH0KQEAgLTEyMCwxNSArMTE4LDE1IEBACiBhYXVkaW9fcmVzdWx0X3QKIEFBdWRpb0NsaWVudFRyYWNrZXI6OnVucmVnaXN0ZXJDbGllbnRTdHJlYW0ocGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSkgewotICAgIEFMT0dWKCJBQXVkaW9DbGllbnRUcmFja2VyOjp1bnJlZ2lzdGVyQ2xpZW50U3RyZWFtKCVkLCAlcClcbiIsIHBpZCwgc2VydmljZVN0cmVhbS5nZXQoKSk7CisgICAgQUxPR1YoInVucmVnaXN0ZXJDbGllbnRTdHJlYW0oJWQsICVwKVxuIiwgcGlkLCBzZXJ2aWNlU3RyZWFtLmdldCgpKTsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CiAgICAgYXV0byBpdCA9IG1Ob3RpZmljYXRpb25DbGllbnRzLmZpbmQocGlkKTsKICAgICBpZiAoaXQgIT0gbU5vdGlmaWNhdGlvbkNsaWVudHMuZW5kKCkpIHsKLSAgICAgICAgQUxPR1YoIkFBdWRpb0NsaWVudFRyYWNrZXI6OnVucmVnaXN0ZXJDbGllbnRTdHJlYW0oJWQsICVwKSBmb3VuZCBOb3RpZmljYXRpb25DbGllbnRcbiIsCisgICAgICAgIEFMT0dWKCJ1bnJlZ2lzdGVyQ2xpZW50U3RyZWFtKCVkLCAlcCkgZm91bmQgTm90aWZpY2F0aW9uQ2xpZW50XG4iLAogICAgICAgICAgICAgICBwaWQsIHNlcnZpY2VTdHJlYW0uZ2V0KCkpOwogICAgICAgICBpdC0+c2Vjb25kLT51bnJlZ2lzdGVyQ2xpZW50U3RyZWFtKHNlcnZpY2VTdHJlYW0pOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9DbGllbnRUcmFja2VyOjp1bnJlZ2lzdGVyQ2xpZW50U3RyZWFtKCVkLCAlcCkgbWlzc2luZyBOb3RpZmljYXRpb25DbGllbnRcbiIsCisgICAgICAgIEFMT0dFKCJ1bnJlZ2lzdGVyQ2xpZW50U3RyZWFtKCVkLCAlcCkgbWlzc2luZyBOb3RpZmljYXRpb25DbGllbnRcbiIsCiAgICAgICAgICAgICAgIHBpZCwgc2VydmljZVN0cmVhbS5nZXQoKSk7CiAgICAgfQogICAgIHJldHVybiBBQVVESU9fT0s7CkBAIC0xMzYsMTEgKzEzNCwxMSBAQAogCiBBQXVkaW9DbGllbnRUcmFja2VyOjpOb3RpZmljYXRpb25DbGllbnQ6Ok5vdGlmaWNhdGlvbkNsaWVudChwaWRfdCBwaWQpCiAgICAgICAgIDogbVByb2Nlc3NJZChwaWQpIHsKLSAgICAvL0FMT0dEKCJBQXVkaW9DbGllbnRUcmFja2VyOjpOb3RpZmljYXRpb25DbGllbnQoJWQpIGNyZWF0ZWQgJXBcbiIsIHBpZCwgdGhpcyk7CisgICAgLy9BTE9HRCgiTm90aWZpY2F0aW9uQ2xpZW50KCVkKSBjcmVhdGVkICVwXG4iLCBwaWQsIHRoaXMpOwogfQogCiBBQXVkaW9DbGllbnRUcmFja2VyOjpOb3RpZmljYXRpb25DbGllbnQ6On5Ob3RpZmljYXRpb25DbGllbnQoKSB7Ci0gICAgLy9BTE9HRCgiQUF1ZGlvQ2xpZW50VHJhY2tlcjo6fk5vdGlmaWNhdGlvbkNsaWVudCgpIGRlc3Ryb3llZCAlcFxuIiwgdGhpcyk7CisgICAgLy9BTE9HRCgifk5vdGlmaWNhdGlvbkNsaWVudCgpIGRlc3Ryb3llZCAlcFxuIiwgdGhpcyk7CiB9CiAKIGludDMyX3QgQUF1ZGlvQ2xpZW50VHJhY2tlcjo6Tm90aWZpY2F0aW9uQ2xpZW50OjpnZXRTdHJlYW1Db3VudCgpIHsKQEAgLTE3MiwxNCArMTcwLDE0IEBACiAKICAgICAgICAgewogICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwotICAgICAgICAgICAgZm9yIChhdXRvIHNlcnZpY2VTdHJlYW0gOiBtU3RyZWFtcykgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzZXJ2aWNlU3RyZWFtIDogbVN0cmVhbXMpIHsKICAgICAgICAgICAgICAgICBzdHJlYW1zVG9DbG9zZS5pbnNlcnQoc2VydmljZVN0cmVhbSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBmb3IgKGF1dG8gc2VydmljZVN0cmVhbSA6IHN0cmVhbXNUb0Nsb3NlKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgc2VydmljZVN0cmVhbSA6IHN0cmVhbXNUb0Nsb3NlKSB7CiAgICAgICAgICAgICBhYXVkaW9faGFuZGxlX3QgaGFuZGxlID0gc2VydmljZVN0cmVhbS0+Z2V0SGFuZGxlKCk7Ci0gICAgICAgICAgICBBTE9HVygiQUF1ZGlvQ2xpZW50VHJhY2tlcjo6YmluZGVyRGllZCgpIGNsb3NlIGFiYW5kb25lZCBzdHJlYW0gMHglMDhYXG4iLCBoYW5kbGUpOworICAgICAgICAgICAgQUxPR1coImJpbmRlckRpZWQoKSBjbG9zZSBhYmFuZG9uZWQgc3RyZWFtIDB4JTA4WFxuIiwgaGFuZGxlKTsKICAgICAgICAgICAgIGFhdWRpb1NlcnZpY2UtPmNsb3NlU3RyZWFtKGhhbmRsZSk7CiAgICAgICAgIH0KICAgICAgICAgLy8gbVN0cmVhbXMgc2hvdWxkIGJlIGVtcHR5IG5vdwpAQCAtMjAwLDggKzE5OCwxMCBAQAogICAgIH0KIAogICAgIHJlc3VsdCA8PCAiICBjbGllbnQ6IHBpZCA9ICIgPDwgbVByb2Nlc3NJZCA8PCAiIGhhcyAiIDw8IG1TdHJlYW1zLnNpemUoKSA8PCAiIHN0cmVhbXNcbiI7Ci0gICAgZm9yIChhdXRvIHNlcnZpY2VTdHJlYW0gOiBtU3RyZWFtcykgewotICAgICAgICByZXN1bHQgPDwgIiAgICAgc3RyZWFtOiAweCIgPDwgc3RkOjpoZXggPDwgc2VydmljZVN0cmVhbS0+Z2V0SGFuZGxlKCkgPDwgc3RkOjpkZWMgPDwgIlxuIjsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHNlcnZpY2VTdHJlYW0gOiBtU3RyZWFtcykgeworICAgICAgICByZXN1bHQgPDwgIiAgICAgc3RyZWFtOiAweCIgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KDgpIDw8IHN0ZDo6aGV4CisgICAgICAgICAgICAgICA8PCBzZXJ2aWNlU3RyZWFtLT5nZXRIYW5kbGUoKQorICAgICAgICAgICAgICAgPDwgc3RkOjpkZWMgPDwgc3RkOjpzZXRmaWxsKCcgJykgPDwgIlxuIjsKICAgICB9CiAKICAgICBpZiAoaXNMb2NrZWQpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuY3BwCmluZGV4IGY5OTZmNzQuLjA0ZmVlMTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmNwcApAQCAtNjcsMTEgKzY3LDE3IEBACiAKICAgICAgICAgcmVzdWx0IDw8ICJFeGNsdXNpdmUgTU1BUCBFbmRwb2ludHM6ICIgPDwgbUV4Y2x1c2l2ZVN0cmVhbXMuc2l6ZSgpIDw8ICJcbiI7CiAgICAgICAgIGluZGV4ID0gMDsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvICZvdXRwdXQgOiBtRXhjbHVzaXZlU3RyZWFtcykgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnN0cmVhbSA6IG1FeGNsdXNpdmVTdHJlYW1zKSB7CiAgICAgICAgICAgICByZXN1bHQgPDwgIiAgIyIgPDwgaW5kZXgrKyA8PCAiOiI7Ci0gICAgICAgICAgICByZXN1bHQgPDwgb3V0cHV0LT5kdW1wKCkgPDwgIlxuIjsKKyAgICAgICAgICAgIHJlc3VsdCA8PCBzdHJlYW0tPmR1bXAoKSA8PCAiXG4iOwogICAgICAgICB9CiAKKyAgICAgICAgcmVzdWx0IDw8ICIgIEV4Y2x1c2l2ZVNlYXJjaENvdW50OiAgIiA8PCBtRXhjbHVzaXZlU2VhcmNoQ291bnQgPDwgIlxuIjsKKyAgICAgICAgcmVzdWx0IDw8ICIgIEV4Y2x1c2l2ZUZvdW5kQ291bnQ6ICAgIiA8PCBtRXhjbHVzaXZlRm91bmRDb3VudCA8PCAiXG4iOworICAgICAgICByZXN1bHQgPDwgIiAgRXhjbHVzaXZlT3BlbkNvdW50OiAgICAiIDw8IG1FeGNsdXNpdmVPcGVuQ291bnQgPDwgIlxuIjsKKyAgICAgICAgcmVzdWx0IDw8ICIgIEV4Y2x1c2l2ZUNsb3NlQ291bnQ6ICAgIiA8PCBtRXhjbHVzaXZlQ2xvc2VDb3VudCA8PCAiXG4iOworICAgICAgICByZXN1bHQgPDwgIlxuIjsKKwogICAgICAgICBpZiAoaXNFeGNsdXNpdmVMb2NrZWQpIHsKICAgICAgICAgICAgIG1FeGNsdXNpdmVMb2NrLnVubG9jaygpOwogICAgICAgICB9CkBAIC03OSwxMSArODUsMTcgQEAKIAogICAgIHJlc3VsdCA8PCAiU2hhcmVkIEVuZHBvaW50czogIiA8PCBtU2hhcmVkU3RyZWFtcy5zaXplKCkgPDwgIlxuIjsKICAgICBpbmRleCA9IDA7Ci0gICAgZm9yIChjb25zdCBhdXRvICZpbnB1dCA6IG1TaGFyZWRTdHJlYW1zKSB7CisgICAgZm9yIChjb25zdCBhdXRvICZzdHJlYW0gOiBtU2hhcmVkU3RyZWFtcykgewogICAgICAgICByZXN1bHQgPDwgIiAgIyIgPDwgaW5kZXgrKyA8PCAiOiI7Ci0gICAgICAgIHJlc3VsdCA8PCBpbnB1dC0+ZHVtcCgpIDw8ICJcbiI7CisgICAgICAgIHJlc3VsdCA8PCBzdHJlYW0tPmR1bXAoKSA8PCAiXG4iOwogICAgIH0KIAorICAgIHJlc3VsdCA8PCAiICBTaGFyZWRTZWFyY2hDb3VudDogICAgICIgPDwgbVNoYXJlZFNlYXJjaENvdW50IDw8ICJcbiI7CisgICAgcmVzdWx0IDw8ICIgIFNoYXJlZEZvdW5kQ291bnQ6ICAgICAgIiA8PCBtU2hhcmVkRm91bmRDb3VudCA8PCAiXG4iOworICAgIHJlc3VsdCA8PCAiICBTaGFyZWRPcGVuQ291bnQ6ICAgICAgICIgPDwgbVNoYXJlZE9wZW5Db3VudCA8PCAiXG4iOworICAgIHJlc3VsdCA8PCAiICBTaGFyZWRDbG9zZUNvdW50OiAgICAgICIgPDwgbVNoYXJlZENsb3NlQ291bnQgPDwgIlxuIjsKKyAgICByZXN1bHQgPDwgIlxuIjsKKwogICAgIGlmIChpc1NoYXJlZExvY2tlZCkgewogICAgICAgICBtU2hhcmVkTG9jay51bmxvY2soKTsKICAgICB9CkBAIC05NSwxNSArMTA3LDE3IEBACiBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6ZmluZEV4Y2x1c2l2ZUVuZHBvaW50X2woCiAgICAgICAgIGNvbnN0IEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24pIHsKICAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IGVuZHBvaW50OworICAgIG1FeGNsdXNpdmVTZWFyY2hDb3VudCsrOwogICAgIGZvciAoY29uc3QgYXV0byBlcCA6IG1FeGNsdXNpdmVTdHJlYW1zKSB7CiAgICAgICAgIGlmIChlcC0+bWF0Y2hlcyhjb25maWd1cmF0aW9uKSkgeworICAgICAgICAgICAgbUV4Y2x1c2l2ZUZvdW5kQ291bnQrKzsKICAgICAgICAgICAgIGVuZHBvaW50ID0gZXA7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAotICAgIEFMT0dWKCJBQXVkaW9FbmRwb2ludE1hbmFnZXIuZmluZEV4Y2x1c2l2ZUVuZHBvaW50X2woKSwgZm91bmQgJXAgZm9yIGRldmljZSA9ICVkIiwKLSAgICAgICAgICBlbmRwb2ludC5nZXQoKSwgY29uZmlndXJhdGlvbi5nZXREZXZpY2VJZCgpKTsKKyAgICBBTE9HVigiZmluZEV4Y2x1c2l2ZUVuZHBvaW50X2woKSwgZm91bmQgJXAgZm9yIGRldmljZSA9ICVkLCBzZXNzaW9uSWQgPSAlZCIsCisgICAgICAgICAgZW5kcG9pbnQuZ2V0KCksIGNvbmZpZ3VyYXRpb24uZ2V0RGV2aWNlSWQoKSwgY29uZmlndXJhdGlvbi5nZXRTZXNzaW9uSWQoKSk7CiAgICAgcmV0dXJuIGVuZHBvaW50OwogfQogCkBAIC0xMTEsMTUgKzEyNSwxNyBAQAogc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkPiBBQXVkaW9FbmRwb2ludE1hbmFnZXI6OmZpbmRTaGFyZWRFbmRwb2ludF9sKAogICAgICAgICBjb25zdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uKSB7CiAgICAgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkPiBlbmRwb2ludDsKKyAgICBtU2hhcmVkU2VhcmNoQ291bnQrKzsKICAgICBmb3IgKGNvbnN0IGF1dG8gZXAgIDogbVNoYXJlZFN0cmVhbXMpIHsKICAgICAgICAgaWYgKGVwLT5tYXRjaGVzKGNvbmZpZ3VyYXRpb24pKSB7CisgICAgICAgICAgICBtU2hhcmVkRm91bmRDb3VudCsrOwogICAgICAgICAgICAgZW5kcG9pbnQgPSBlcDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCi0gICAgQUxPR1YoIkFBdWRpb0VuZHBvaW50TWFuYWdlci5maW5kU2hhcmVkRW5kcG9pbnRfbCgpLCBmb3VuZCAlcCBmb3IgZGV2aWNlID0gJWQiLAotICAgICAgICAgIGVuZHBvaW50LmdldCgpLCBjb25maWd1cmF0aW9uLmdldERldmljZUlkKCkpOworICAgIEFMT0dWKCJmaW5kU2hhcmVkRW5kcG9pbnRfbCgpLCBmb3VuZCAlcCBmb3IgZGV2aWNlID0gJWQsIHNlc3Npb25JZCA9ICVkIiwKKyAgICAgICAgICBlbmRwb2ludC5nZXQoKSwgY29uZmlndXJhdGlvbi5nZXREZXZpY2VJZCgpLCBjb25maWd1cmF0aW9uLmdldFNlc3Npb25JZCgpKTsKICAgICByZXR1cm4gZW5kcG9pbnQ7CiB9CiAKQEAgLTEzNCw3ICsxNTAsNyBAQAogfQogCiBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6b3BlbkV4Y2x1c2l2ZUVuZHBvaW50KAotICAgICAgICBBQXVkaW9TZXJ2aWNlICZhYXVkaW9TZXJ2aWNlIF9fdW51c2VkLAorICAgICAgICBBQXVkaW9TZXJ2aWNlICZhYXVkaW9TZXJ2aWNlLAogICAgICAgICBjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpIHsKIAogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1FeGNsdXNpdmVMb2NrKTsKQEAgLTE0NiwyNCArMTYyLDIzIEBACiAKICAgICAvLyBJZiB3ZSBmaW5kIGFuIGV4aXN0aW5nIG9uZSB0aGVuIHRoaXMgb25lIGNhbm5vdCBiZSBleGNsdXNpdmUuCiAgICAgaWYgKGVuZHBvaW50LmdldCgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb0VuZHBvaW50TWFuYWdlci5vcGVuRXhjbHVzaXZlRW5kcG9pbnQoKSBhbHJlYWR5IGluIHVzZSIpOworICAgICAgICBBTE9HVygib3BlbkV4Y2x1c2l2ZUVuZHBvaW50KCkgYWxyZWFkeSBpbiB1c2UiKTsKICAgICAgICAgLy8gQWxyZWFkeSBvcGVuIHNvIGRvIG5vdCBhbGxvdyBhIHNlY29uZCBzdHJlYW0uCiAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA+IGVuZHBvaW50TU1hcCA9IG5ldyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQKCk7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9FbmRwb2ludE1hbmFnZXIub3BlbkVuZHBvaW50KCksY3JlYXRlZCBNTUFQICVwIiwgZW5kcG9pbnRNTWFwLmdldCgpKTsKKyAgICAgICAgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUD4gZW5kcG9pbnRNTWFwID0gbmV3IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAoYWF1ZGlvU2VydmljZSk7CisgICAgICAgIEFMT0dWKCJvcGVuRXhjbHVzaXZlRW5kcG9pbnQoKSwgbm8gbWF0Y2ggc28gdHJ5IHRvIG9wZW4gTU1BUCAlcCBmb3IgZGV2ICVkIiwKKyAgICAgICAgICAgICAgZW5kcG9pbnRNTWFwLmdldCgpLCBjb25maWd1cmF0aW9uLmdldERldmljZUlkKCkpOwogICAgICAgICBlbmRwb2ludCA9IGVuZHBvaW50TU1hcDsKIAogICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gZW5kcG9pbnQtPm9wZW4ocmVxdWVzdCk7CiAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLm9wZW5FbmRwb2ludCgpLCBvcGVuIGZhaWxlZCIpOworICAgICAgICAgICAgQUxPR0UoIm9wZW5FeGNsdXNpdmVFbmRwb2ludCgpLCBvcGVuIGZhaWxlZCIpOwogICAgICAgICAgICAgZW5kcG9pbnQuY2xlYXIoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1FeGNsdXNpdmVTdHJlYW1zLnB1c2hfYmFjayhlbmRwb2ludE1NYXApOworICAgICAgICAgICAgbUV4Y2x1c2l2ZU9wZW5Db3VudCsrOwogICAgICAgICB9Ci0KLSAgICAgICAgQUxPR0QoIkFBdWRpb0VuZHBvaW50TWFuYWdlci5vcGVuRW5kcG9pbnQoKSwgY3JlYXRlZCAlcCBmb3IgZGV2aWNlID0gJWQiLAotICAgICAgICAgICAgICBlbmRwb2ludC5nZXQoKSwgY29uZmlndXJhdGlvbi5nZXREZXZpY2VJZCgpKTsKICAgICB9CiAKICAgICBpZiAoZW5kcG9pbnQuZ2V0KCkgIT0gbnVsbHB0cikgewpAQCAtMjAzLDE0ICsyMTgsMTQgQEAKICAgICAgICAgaWYgKGVuZHBvaW50LmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBlbmRwb2ludC0+b3BlbihyZXF1ZXN0KTsKICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkFBdWRpb0VuZHBvaW50TWFuYWdlci5vcGVuRW5kcG9pbnQoKSwgb3BlbiBmYWlsZWQiKTsKICAgICAgICAgICAgICAgICBlbmRwb2ludC5jbGVhcigpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBtU2hhcmVkU3RyZWFtcy5wdXNoX2JhY2soZW5kcG9pbnQpOworICAgICAgICAgICAgICAgIG1TaGFyZWRPcGVuQ291bnQrKzsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBBTE9HRCgiQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLm9wZW5TaGFyZWRFbmRwb2ludCgpLCBjcmVhdGVkICVwIGZvciBkZXZpY2UgPSAlZCwgZGlyID0gJWQiLAotICAgICAgICAgICAgICBlbmRwb2ludC5nZXQoKSwgY29uZmlndXJhdGlvbi5nZXREZXZpY2VJZCgpLCAoaW50KWRpcmVjdGlvbik7CisgICAgICAgIEFMT0dWKCIlcygpLCBjcmVhdGVkIGVuZHBvaW50ICVwLCByZXF1ZXN0ZWQgZGV2aWNlID0gJWQsIGRpciA9ICVkIiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIGVuZHBvaW50LmdldCgpLCBjb25maWd1cmF0aW9uLmdldERldmljZUlkKCksIChpbnQpZGlyZWN0aW9uKTsKICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiAgICAgfQogCkBAIC0yMzksMTUgKzI1NCwxNiBAQAogICAgIGludDMyX3QgbmV3UmVmQ291bnQgPSBzZXJ2aWNlRW5kcG9pbnQtPmdldE9wZW5Db3VudCgpIC0gMTsKICAgICBzZXJ2aWNlRW5kcG9pbnQtPnNldE9wZW5Db3VudChuZXdSZWZDb3VudCk7CiAKLSAgICAvLyBJZiBubyBsb25nZXIgaW4gdXNlIHRoZW4gY2xvc2UgYW5kIGRlbGV0ZSBpdC4KKyAgICAvLyBJZiBubyBsb25nZXIgaW4gdXNlIHRoZW4gYWN0dWFsbHkgY2xvc2UgaXQuCiAgICAgaWYgKG5ld1JlZkNvdW50IDw9IDApIHsKICAgICAgICAgbUV4Y2x1c2l2ZVN0cmVhbXMuZXJhc2UoCiAgICAgICAgICAgICAgICAgc3RkOjpyZW1vdmUobUV4Y2x1c2l2ZVN0cmVhbXMuYmVnaW4oKSwgbUV4Y2x1c2l2ZVN0cmVhbXMuZW5kKCksIHNlcnZpY2VFbmRwb2ludCksCiAgICAgICAgICAgICAgICAgbUV4Y2x1c2l2ZVN0cmVhbXMuZW5kKCkpOwogCiAgICAgICAgIHNlcnZpY2VFbmRwb2ludC0+Y2xvc2UoKTsKLSAgICAgICAgQUxPR0QoIkFBdWRpb0VuZHBvaW50TWFuYWdlcjo6Y2xvc2VFeGNsdXNpdmVFbmRwb2ludCgpICVwIGZvciBkZXZpY2UgJWQiLAotICAgICAgICAgICAgICBzZXJ2aWNlRW5kcG9pbnQuZ2V0KCksIHNlcnZpY2VFbmRwb2ludC0+Z2V0RGV2aWNlSWQoKSk7CisgICAgICAgIG1FeGNsdXNpdmVDbG9zZUNvdW50Kys7CisgICAgICAgIEFMT0dWKCIlcygpICVwIGZvciBkZXZpY2UgJWQiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgc2VydmljZUVuZHBvaW50LmdldCgpLCBzZXJ2aWNlRW5kcG9pbnQtPmdldERldmljZUlkKCkpOwogICAgIH0KIH0KIApAQCAtMjYxLDE0ICsyNzcsMTUgQEAKICAgICBpbnQzMl90IG5ld1JlZkNvdW50ID0gc2VydmljZUVuZHBvaW50LT5nZXRPcGVuQ291bnQoKSAtIDE7CiAgICAgc2VydmljZUVuZHBvaW50LT5zZXRPcGVuQ291bnQobmV3UmVmQ291bnQpOwogCi0gICAgLy8gSWYgbm8gbG9uZ2VyIGluIHVzZSB0aGVuIGNsb3NlIGFuZCBkZWxldGUgaXQuCisgICAgLy8gSWYgbm8gbG9uZ2VyIGluIHVzZSB0aGVuIGFjdHVhbGx5IGNsb3NlIGl0LgogICAgIGlmIChuZXdSZWZDb3VudCA8PSAwKSB7CiAgICAgICAgIG1TaGFyZWRTdHJlYW1zLmVyYXNlKAogICAgICAgICAgICAgICAgIHN0ZDo6cmVtb3ZlKG1TaGFyZWRTdHJlYW1zLmJlZ2luKCksIG1TaGFyZWRTdHJlYW1zLmVuZCgpLCBzZXJ2aWNlRW5kcG9pbnQpLAogICAgICAgICAgICAgICAgIG1TaGFyZWRTdHJlYW1zLmVuZCgpKTsKIAogICAgICAgICBzZXJ2aWNlRW5kcG9pbnQtPmNsb3NlKCk7Ci0gICAgICAgIEFMT0dEKCJBQXVkaW9FbmRwb2ludE1hbmFnZXI6OmNsb3NlU2hhcmVkRW5kcG9pbnQoKSAlcCBmb3IgZGV2aWNlICVkIiwKLSAgICAgICAgICAgICAgc2VydmljZUVuZHBvaW50LmdldCgpLCBzZXJ2aWNlRW5kcG9pbnQtPmdldERldmljZUlkKCkpOworICAgICAgICBtU2hhcmVkQ2xvc2VDb3VudCsrOworICAgICAgICBBTE9HVigiJXMoKSAlcCBmb3IgZGV2aWNlICVkIiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIHNlcnZpY2VFbmRwb2ludC5nZXQoKSwgc2VydmljZUVuZHBvaW50LT5nZXREZXZpY2VJZCgpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5oCmluZGV4IDMyYzg0NTQuLjE5M2JkZWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5oCkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgc3RkOjpzdHJpbmcgZHVtcCgpIGNvbnN0OwogCiAgICAgLyoqCi0gICAgICogRmluZCBhIHNlcnZpY2UgZW5kcG9pbnQgZm9yIHRoZSBnaXZlbiBkZXZpY2VJZCBhbmQgZGlyZWN0aW9uLgorICAgICAqIEZpbmQgYSBzZXJ2aWNlIGVuZHBvaW50IGZvciB0aGUgZ2l2ZW4gZGV2aWNlSWQsIHNlc3Npb25JZCBhbmQgZGlyZWN0aW9uLgogICAgICAqIElmIGFuIGVuZHBvaW50IGRvZXMgbm90IGFscmVhZHkgZXhpc3QgdGhlbiB0cnkgdG8gY3JlYXRlIG9uZS4KICAgICAgKgogICAgICAqIEBwYXJhbSBhdWRpb1NlcnZpY2UKQEAgLTg3LDggKzg3LDE3IEBACiAgICAgbXV0YWJsZSBzdGQ6Om11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FeGNsdXNpdmVMb2NrOwogICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA+PiAgICBtRXhjbHVzaXZlU3RyZWFtczsKIAorICAgIC8vIE1vZGlmaWVkIHVuZGVyIGEgbG9jay4KKyAgICBpbnQzMl90IG1FeGNsdXNpdmVTZWFyY2hDb3VudCA9IDA7IC8vIG51bWJlciBvZiB0aW1lcyB3ZSBTRUFSQ0hFRCBmb3IgYW4gZXhjbHVzaXZlIGVuZHBvaW50CisgICAgaW50MzJfdCBtRXhjbHVzaXZlRm91bmRDb3VudCAgPSAwOyAvLyBudW1iZXIgb2YgdGltZXMgd2UgRk9VTkQgYW4gZXhjbHVzaXZlIGVuZHBvaW50CisgICAgaW50MzJfdCBtRXhjbHVzaXZlT3BlbkNvdW50ICAgPSAwOyAvLyBudW1iZXIgb2YgdGltZXMgd2UgT1BFTkVEIGFuIGV4Y2x1c2l2ZSBlbmRwb2ludAorICAgIGludDMyX3QgbUV4Y2x1c2l2ZUNsb3NlQ291bnQgID0gMDsgLy8gbnVtYmVyIG9mIHRpbWVzIHdlIENMT1NFRCBhbiBleGNsdXNpdmUgZW5kcG9pbnQKKyAgICAvLyBTYW1lIGFzIGFib3ZlIGJ1dCBmb3IgU0hBUkVEIGVuZHBvaW50cy4KKyAgICBpbnQzMl90IG1TaGFyZWRTZWFyY2hDb3VudCAgICA9IDA7CisgICAgaW50MzJfdCBtU2hhcmVkRm91bmRDb3VudCAgICAgPSAwOworICAgIGludDMyX3QgbVNoYXJlZE9wZW5Db3VudCAgICAgID0gMDsKKyAgICBpbnQzMl90IG1TaGFyZWRDbG9zZUNvdW50ICAgICA9IDA7CiB9OwotCiB9IC8qIG5hbWVzcGFjZSBhYXVkaW8gKi8KIAogI2VuZGlmIC8vQUFVRElPX0FBVURJT19FTkRQT0lOVF9NQU5BR0VSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb01peGVyLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb01peGVyLmNwcAppbmRleCA5NTJhYTgyLi5iMDMxODg4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9NaXhlci5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvTWl4ZXIuY3BwCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIExPR19UQUcgIkFBdWRpb1NlcnZpY2UiCisjZGVmaW5lIExPR19UQUcgIkFBdWRpb01peGVyIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCkBAIC00OSwxMCArNDksOSBAQAogICAgIG1lbXNldChtT3V0cHV0QnVmZmVyLCAwLCBtQnVmZmVyU2l6ZUluQnl0ZXMpOwogfQogCi1ib29sIEFBdWRpb01peGVyOjptaXgoaW50IHRyYWNrSW5kZXgsIEZpZm9CdWZmZXIgKmZpZm8sIGZsb2F0IHZvbHVtZSkgeworaW50MzJfdCBBQXVkaW9NaXhlcjo6bWl4KGludCBzdHJlYW1JbmRleCwgRmlmb0J1ZmZlciAqZmlmbywgYm9vbCBhbGxvd1VuZGVyZmxvdykgewogICAgIFdyYXBwaW5nQnVmZmVyIHdyYXBwaW5nQnVmZmVyOwogICAgIGZsb2F0ICpkZXN0aW5hdGlvbiA9IG1PdXRwdXRCdWZmZXI7Ci0gICAgZmlmb19mcmFtZXNfdCBmcmFtZXNMZWZ0ID0gbUZyYW1lc1BlckJ1cnN0OwogCiAjaWYgQUFVRElPX01JWEVSX0FUUkFDRV9FTkFCTEVECiAgICAgQVRSQUNFX0JFR0lOKCJhYU1peCIpOwpAQCAtNjMsNDggKzYyLDU3IEBACiAjaWYgQUFVRElPX01JWEVSX0FUUkFDRV9FTkFCTEVECiAgICAgaWYgKEFUUkFDRV9FTkFCTEVEKCkpIHsKICAgICAgICAgY2hhciByZHlUZXh0W10gPSAiYWFNaXhSZHkjIjsKLSAgICAgICAgY2hhciBsZXR0ZXIgPSAnQScgKyAodHJhY2tJbmRleCAlIDI2KTsKKyAgICAgICAgY2hhciBsZXR0ZXIgPSAnQScgKyAoc3RyZWFtSW5kZXggJSAyNik7CiAgICAgICAgIHJkeVRleHRbc2l6ZW9mKHJkeVRleHQpIC0gMl0gPSBsZXR0ZXI7CiAgICAgICAgIEFUUkFDRV9JTlQocmR5VGV4dCwgZnVsbEZyYW1lcyk7CiAgICAgfQogI2Vsc2UgLyogTUlYRVJfQVRSQUNFX0VOQUJMRUQgKi8KICAgICAodm9pZCkgdHJhY2tJbmRleDsKLSAgICAodm9pZCkgZnVsbEZyYW1lczsKICNlbmRpZiAvKiBBQVVESU9fTUlYRVJfQVRSQUNFX0VOQUJMRUQgKi8KIAorICAgIC8vIElmIGFsbG93VW5kZXJmbG93IHRoZW4gYWx3YXlzIGFkdmFuY2UgYnkgb25lIGJ1cnN0IGV2ZW4gaWYgd2UgZG8gbm90IGhhdmUgdGhlIGRhdGEuCisgICAgLy8gT3RoZXJ3aXNlIHRoZSBzdHJlYW0gdGltaW5nIHdpbGwgZHJpZnQgd2hlbmV2ZXIgdGhlcmUgaXMgYW4gdW5kZXJmbG93LgorICAgIC8vIFRoaXMgYWN0dWFsIHVuZGVyZmxvdyBjYW4gdGhlbiBiZSBkZXRlY3RlZCBieSB0aGUgY2xpZW50IGZvciBYUnVuIGNvdW50aW5nLgorICAgIC8vCisgICAgLy8gR2VuZXJhbGx5LCBhbGxvd1VuZGVyZmxvdyB3aWxsIGJlIGZhbHNlIHdoZW4gc3RvcHBpbmcgYSBzdHJlYW0gYW5kIHdlIHdhbnQgdG8KKyAgICAvLyB1c2UgdXAgd2hhdGV2ZXIgZGF0YSBpcyBpbiB0aGUgcXVldWUuCisgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNEZXNpcmVkID0gbUZyYW1lc1BlckJ1cnN0OworICAgIGlmICghYWxsb3dVbmRlcmZsb3cgJiYgZnVsbEZyYW1lcyA8IGZyYW1lc0Rlc2lyZWQpIHsKKyAgICAgICAgZnJhbWVzRGVzaXJlZCA9IGZ1bGxGcmFtZXM7IC8vIGp1c3QgdXNlIHdoYXQgaXMgYXZhaWxhYmxlIHRoZW4gc3RvcAorICAgIH0KKwogICAgIC8vIE1peCBkYXRhIGluIG9uZSBvciB0d28gcGFydHMuCiAgICAgaW50IHBhcnRJbmRleCA9IDA7CisgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gZnJhbWVzRGVzaXJlZDsKICAgICB3aGlsZSAoZnJhbWVzTGVmdCA+IDAgJiYgcGFydEluZGV4IDwgV3JhcHBpbmdCdWZmZXI6OlNJWkUpIHsKLSAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNUb01peCA9IGZyYW1lc0xlZnQ7Ci0gICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0gd3JhcHBpbmdCdWZmZXIubnVtRnJhbWVzW3BhcnRJbmRleF07Ci0gICAgICAgIGlmIChmcmFtZXNBdmFpbGFibGUgPiAwKSB7Ci0gICAgICAgICAgICBpZiAoZnJhbWVzVG9NaXggPiBmcmFtZXNBdmFpbGFibGUpIHsKLSAgICAgICAgICAgICAgICBmcmFtZXNUb01peCA9IGZyYW1lc0F2YWlsYWJsZTsKKyAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNUb01peEZyb21QYXJ0ID0gZnJhbWVzTGVmdDsKKyAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGVGcm9tUGFydCA9IHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1twYXJ0SW5kZXhdOworICAgICAgICBpZiAoZnJhbWVzQXZhaWxhYmxlRnJvbVBhcnQgPiAwKSB7CisgICAgICAgICAgICBpZiAoZnJhbWVzVG9NaXhGcm9tUGFydCA+IGZyYW1lc0F2YWlsYWJsZUZyb21QYXJ0KSB7CisgICAgICAgICAgICAgICAgZnJhbWVzVG9NaXhGcm9tUGFydCA9IGZyYW1lc0F2YWlsYWJsZUZyb21QYXJ0OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWl4UGFydChkZXN0aW5hdGlvbiwgKGZsb2F0ICopd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLCBmcmFtZXNUb01peCwgdm9sdW1lKTsKKyAgICAgICAgICAgIG1peFBhcnQoZGVzdGluYXRpb24sIChmbG9hdCAqKXdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVzVG9NaXhGcm9tUGFydCk7CiAKLSAgICAgICAgICAgIGRlc3RpbmF0aW9uICs9IGZyYW1lc1RvTWl4ICogbVNhbXBsZXNQZXJGcmFtZTsKLSAgICAgICAgICAgIGZyYW1lc0xlZnQgLT0gZnJhbWVzVG9NaXg7CisgICAgICAgICAgICBkZXN0aW5hdGlvbiArPSBmcmFtZXNUb01peEZyb21QYXJ0ICogbVNhbXBsZXNQZXJGcmFtZTsKKyAgICAgICAgICAgIGZyYW1lc0xlZnQgLT0gZnJhbWVzVG9NaXhGcm9tUGFydDsKICAgICAgICAgfQogICAgICAgICBwYXJ0SW5kZXgrKzsKICAgICB9Ci0gICAgLy8gQWx3YXlzIGFkdmFuY2UgYnkgb25lIGJ1cnN0IGV2ZW4gaWYgd2UgZG8gbm90IGhhdmUgdGhlIGRhdGEuCi0gICAgLy8gT3RoZXJ3aXNlIHRoZSBzdHJlYW0gdGltaW5nIHdpbGwgZHJpZnQgd2hlbmV2ZXIgdGhlcmUgaXMgYW4gdW5kZXJmbG93LgotICAgIC8vIFRoaXMgYWN0dWFsIHVuZGVyZmxvdyBjYW4gdGhlbiBiZSBkZXRlY3RlZCBieSB0aGUgY2xpZW50IGZvciBYUnVuIGNvdW50aW5nLgotICAgIGZpZm8tPmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5hZHZhbmNlUmVhZEluZGV4KG1GcmFtZXNQZXJCdXJzdCk7CisgICAgZmlmby0+Z2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmFkdmFuY2VSZWFkSW5kZXgoZnJhbWVzRGVzaXJlZCk7CiAKICNpZiBBQVVESU9fTUlYRVJfQVRSQUNFX0VOQUJMRUQKICAgICBBVFJBQ0VfRU5EKCk7CiAjZW5kaWYgLyogQUFVRElPX01JWEVSX0FUUkFDRV9FTkFCTEVEICovCiAKLSAgICByZXR1cm4gKGZyYW1lc0xlZnQgPiAwKTsgLy8gZGlkIG5vdCBnZXQgYWxsIHRoZSBmcmFtZXMgd2UgbmVlZGVkLCBpZS4gInVuZGVyZmxvdyIKKyAgICByZXR1cm4gKGZyYW1lc0Rlc2lyZWQgLSBmcmFtZXNMZWZ0KTsgLy8gZnJhbWVzUmVhZAogfQogCi12b2lkIEFBdWRpb01peGVyOjptaXhQYXJ0KGZsb2F0ICpkZXN0aW5hdGlvbiwgZmxvYXQgKnNvdXJjZSwgaW50MzJfdCBudW1GcmFtZXMsIGZsb2F0IHZvbHVtZSkgewordm9pZCBBQXVkaW9NaXhlcjo6bWl4UGFydChmbG9hdCAqZGVzdGluYXRpb24sIGZsb2F0ICpzb3VyY2UsIGludDMyX3QgbnVtRnJhbWVzKSB7CiAgICAgaW50MzJfdCBudW1TYW1wbGVzID0gbnVtRnJhbWVzICogbVNhbXBsZXNQZXJGcmFtZTsKICAgICAvLyBUT0RPIG1heWJlIG9wdGltaXplIHVzaW5nIFNJTUQKICAgICBmb3IgKGludCBzYW1wbGVJbmRleCA9IDA7IHNhbXBsZUluZGV4IDwgbnVtU2FtcGxlczsgc2FtcGxlSW5kZXgrKykgewotICAgICAgICAqZGVzdGluYXRpb24rKyArPSAqc291cmNlKysgKiB2b2x1bWU7CisgICAgICAgICpkZXN0aW5hdGlvbisrICs9ICpzb3VyY2UrKzsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb01peGVyLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9NaXhlci5oCmluZGV4IGE4MDkwYmMuLmQ1YWJjNWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb01peGVyLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvTWl4ZXIuaApAQCAtMzMsMjIgKzMzLDI0IEBACiAKICAgICAvKioKICAgICAgKiBNaXggZnJvbSB0aGlzIEZJRk8KLSAgICAgKiBAcGFyYW0gZmlmbwotICAgICAqIEBwYXJhbSB2b2x1bWUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdW5kZXJmbG93ZWQKKyAgICAgKiBAcGFyYW0gc3RyZWFtSW5kZXggZm9yIG1hcmtpbmcgc3RyZWFtIHZhcmlhYmxlcyBpbiBzeXN0cmFjZQorICAgICAqIEBwYXJhbSBmaWZvIHRvIHJlYWQgZnJvbQorICAgICAqIEBwYXJhbSBhbGxvd1VuZGVyZmxvdyBpZiB0cnVlIHRoZW4gYWxsb3cgbWl4ZXIgdG8gYWR2YW5jZSByZWFkIGluZGV4IHBhc3QgdGhlIHdyaXRlIGluZGV4CisgICAgICogQHJldHVybiBmcmFtZXMgcmVhZCBmcm9tIHRoaXMgc3RyZWFtCiAgICAgICovCi0gICAgYm9vbCBtaXgoaW50IHRyYWNrSW5kZXgsIGFuZHJvaWQ6OkZpZm9CdWZmZXIgKmZpZm8sIGZsb2F0IHZvbHVtZSk7Ci0KLSAgICB2b2lkIG1peFBhcnQoZmxvYXQgKmRlc3RpbmF0aW9uLCBmbG9hdCAqc291cmNlLCBpbnQzMl90IG51bUZyYW1lcywgZmxvYXQgdm9sdW1lKTsKKyAgICBpbnQzMl90IG1peChpbnQgc3RyZWFtSW5kZXgsIGFuZHJvaWQ6OkZpZm9CdWZmZXIgKmZpZm8sIGJvb2wgYWxsb3dVbmRlcmZsb3cpOwogCiAgICAgZmxvYXQgKmdldE91dHB1dEJ1ZmZlcigpOwogCisgICAgaW50MzJfdCBnZXRGcmFtZXNQZXJCdXJzdCgpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZXNQZXJCdXJzdDsgfQorCiBwcml2YXRlOgorICAgIHZvaWQgbWl4UGFydChmbG9hdCAqZGVzdGluYXRpb24sIGZsb2F0ICpzb3VyY2UsIGludDMyX3QgbnVtRnJhbWVzKTsKKwogICAgIGZsb2F0ICAgKm1PdXRwdXRCdWZmZXIgPSBudWxscHRyOwogICAgIGludDMyX3QgIG1TYW1wbGVzUGVyRnJhbWUgPSAwOwogICAgIGludDMyX3QgIG1GcmFtZXNQZXJCdXJzdCA9IDA7CiAgICAgaW50MzJfdCAgbUJ1ZmZlclNpemVJbkJ5dGVzID0gMDsKIH07CiAKLQogI2VuZGlmIC8vQUFVRElPX0FBVURJT19NSVhFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuY3BwCmluZGV4IDVhMzQ4OGQuLjU2NzViMGIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuY3BwCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZS5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oIgotI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmgiCiAjaW5jbHVkZSAiYmluZGluZy9JQUF1ZGlvU2VydmljZS5oIgogI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKIApAQCAtOTIsMTQgKzkxLDE0IEBACiAgICAgaWYgKHBpZCAhPSBtQXVkaW9DbGllbnQuY2xpZW50UGlkKSB7CiAgICAgICAgIGludDMyX3QgY291bnQgPSBBQXVkaW9DbGllbnRUcmFja2VyOjpnZXRJbnN0YW5jZSgpLmdldFN0cmVhbUNvdW50KHBpZCk7CiAgICAgICAgIGlmIChjb3VudCA+PSBNQVhfU1RSRUFNU19QRVJfUFJPQ0VTUykgewotICAgICAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2U6Om9wZW5TdHJlYW0oKTogZXhjZWVkZWQgbWF4IHN0cmVhbXMgcGVyIHByb2Nlc3MgJWQgPj0gJWQiLAorICAgICAgICAgICAgQUxPR0UoIm9wZW5TdHJlYW0oKTogZXhjZWVkZWQgbWF4IHN0cmVhbXMgcGVyIHByb2Nlc3MgJWQgPj0gJWQiLAogICAgICAgICAgICAgICAgICAgY291bnQsICBNQVhfU1RSRUFNU19QRVJfUFJPQ0VTUyk7CiAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKHNoYXJpbmdNb2RlICE9IEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFICYmIHNoYXJpbmdNb2RlICE9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlOjpvcGVuU3RyZWFtKCk6IHVucmVjb2duaXplZCBzaGFyaW5nIG1vZGUgPSAlZCIsIHNoYXJpbmdNb2RlKTsKKyAgICAgICAgQUxPR0UoIm9wZW5TdHJlYW0oKTogdW5yZWNvZ25pemVkIHNoYXJpbmcgbW9kZSA9ICVkIiwgc2hhcmluZ01vZGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQ7CiAgICAgfQogCkBAIC0xMTQsNyArMTEzLDcgQEAKICAgICAgICAgcmVzdWx0ID0gc2VydmljZVN0cmVhbS0+b3BlbihyZXF1ZXN0KTsKICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgICAgIC8vIENsZWFyIGl0IHNvIHdlIGNhbiBwb3NzaWJseSBmYWxsIGJhY2sgdG8gdXNpbmcgYSBzaGFyZWQgc3RyZWFtLgotICAgICAgICAgICAgQUxPR1coIkFBdWRpb1NlcnZpY2U6Om9wZW5TdHJlYW0oKSwgY291bGQgbm90IG9wZW4gaW4gRVhDTFVTSVZFIG1vZGUiKTsKKyAgICAgICAgICAgIEFMT0dXKCJvcGVuU3RyZWFtKCksIGNvdWxkIG5vdCBvcGVuIGluIEVYQ0xVU0lWRSBtb2RlIik7CiAgICAgICAgICAgICBzZXJ2aWNlU3RyZWFtLmNsZWFyKCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMjgsMTIgKzEyNywxMiBAQAogCiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgc2VydmljZVN0cmVhbS5jbGVhcigpOwotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6b3BlblN0cmVhbSgpOiBmYWlsZWQsIHJldHVybiAlZCA9ICVzIiwKKyAgICAgICAgQUxPR0UoIm9wZW5TdHJlYW0oKTogZmFpbGVkLCByZXR1cm4gJWQgPSAlcyIsCiAgICAgICAgICAgICAgIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfSBlbHNlIHsKICAgICAgICAgYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSA9IG1TdHJlYW1UcmFja2VyLmFkZFN0cmVhbUZvckhhbmRsZShzZXJ2aWNlU3RyZWFtLmdldCgpKTsKLSAgICAgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2U6Om9wZW5TdHJlYW0oKTogaGFuZGxlID0gMHglMDhYIiwgaGFuZGxlKTsKKyAgICAgICAgQUxPR0QoIm9wZW5TdHJlYW0oKTogaGFuZGxlID0gMHglMDhYIiwgaGFuZGxlKTsKICAgICAgICAgc2VydmljZVN0cmVhbS0+c2V0SGFuZGxlKGhhbmRsZSk7CiAgICAgICAgIHBpZF90IHBpZCA9IHJlcXVlc3QuZ2V0UHJvY2Vzc0lkKCk7CiAgICAgICAgIEFBdWRpb0NsaWVudFRyYWNrZXI6OmdldEluc3RhbmNlKCkucmVnaXN0ZXJDbGllbnRTdHJlYW0ocGlkLCBzZXJ2aWNlU3RyZWFtKTsKQEAgLTE0MiwzMSArMTQxLDQ1IEBACiAgICAgfQogfQogCisvLyBJZiBhIGNsb3NlIHJlcXVlc3QgaXMgcGVuZGluZyB0aGVuIGNsb3NlIHRoZSBzdHJlYW0KK2Jvb2wgQUF1ZGlvU2VydmljZTo6cmVsZWFzZVN0cmVhbShjb25zdCBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gJnNlcnZpY2VTdHJlYW0pIHsKKyAgICBib29sIGNsb3NlZCA9IGZhbHNlOworICAgIGlmICgoc2VydmljZVN0cmVhbS0+ZGVjcmVtZW50U2VydmljZVJlZmVyZW5jZUNvdW50KCkgPT0gMCkgJiYgc2VydmljZVN0cmVhbS0+aXNDbG9zZU5lZWRlZCgpKSB7CisgICAgICAgIC8vIHJlbW92ZVN0cmVhbUJ5SGFuZGxlKCkgdXNlcyBhIGxvY2sgc28gdGhhdCBpZiB0aGVyZSBhcmUgdHdvIHNpbXVsdGFuZW91cyBjbG9zZXMKKyAgICAgICAgLy8gdGhlbiBvbmx5IG9uZSB3aWxsIGdldCB0aGUgcG9pbnRlciBhbmQgZG8gdGhlIGNsb3NlLgorICAgICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gZm91bmRTdHJlYW0gPSBtU3RyZWFtVHJhY2tlci5yZW1vdmVTdHJlYW1CeUhhbmRsZShzZXJ2aWNlU3RyZWFtLT5nZXRIYW5kbGUoKSk7CisgICAgICAgIGlmIChmb3VuZFN0cmVhbS5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBmb3VuZFN0cmVhbS0+Y2xvc2UoKTsKKyAgICAgICAgICAgIHBpZF90IHBpZCA9IGZvdW5kU3RyZWFtLT5nZXRPd25lclByb2Nlc3NJZCgpOworICAgICAgICAgICAgQUF1ZGlvQ2xpZW50VHJhY2tlcjo6Z2V0SW5zdGFuY2UoKS51bnJlZ2lzdGVyQ2xpZW50U3RyZWFtKHBpZCwgZm91bmRTdHJlYW0pOworICAgICAgICB9CisgICAgICAgIGNsb3NlZCA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBjbG9zZWQ7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlOjpjaGVja0ZvclBlbmRpbmdDbG9zZSgKKyAgICAgICAgY29uc3Qgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+ICZzZXJ2aWNlU3RyZWFtLAorICAgICAgICBhYXVkaW9fcmVzdWx0X3QgZGVmYXVsdFJlc3VsdCkgeworICAgIHJldHVybiByZWxlYXNlU3RyZWFtKHNlcnZpY2VTdHJlYW0pID8gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEUgOiBkZWZhdWx0UmVzdWx0OworfQorCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZTo6Y2xvc2VTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgewogICAgIC8vIENoZWNrIHBlcm1pc3Npb24gYW5kIG93bmVyc2hpcCBmaXJzdC4KICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKICAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlOjpjbG9zZVN0cmVhbSgweCUweCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSIsIHN0cmVhbUhhbmRsZSk7CisgICAgICAgIEFMT0dFKCJjbG9zZVN0cmVhbSgweCUweCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSIsIHN0cmVhbUhhbmRsZSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEU7CiAgICAgfQogCi0gICAgQUxPR0QoIkFBdWRpb1NlcnZpY2UuY2xvc2VTdHJlYW0oMHglMDhYKSIsIHN0cmVhbUhhbmRsZSk7Ci0gICAgLy8gUmVtb3ZlIGhhbmRsZSBmcm9tIHRyYWNrZXIgc28gdGhhdCB3ZSBjYW5ub3QgbG9vayB1cCB0aGUgcmF3IGFkZHJlc3MgYW55IG1vcmUuCi0gICAgLy8gcmVtb3ZlU3RyZWFtQnlIYW5kbGUoKSB1c2VzIGEgbG9jayBzbyB0aGF0IGlmIHRoZXJlIGFyZSB0d28gc2ltdWx0YW5lb3VzIGNsb3NlcwotICAgIC8vIHRoZW4gb25seSBvbmUgd2lsbCBnZXQgdGhlIHBvaW50ZXIgYW5kIGRvIHRoZSBjbG9zZS4KLSAgICBzZXJ2aWNlU3RyZWFtID0gbVN0cmVhbVRyYWNrZXIucmVtb3ZlU3RyZWFtQnlIYW5kbGUoc3RyZWFtSGFuZGxlKTsKLSAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHNlcnZpY2VTdHJlYW0tPmNsb3NlKCk7Ci0gICAgICAgIHBpZF90IHBpZCA9IHNlcnZpY2VTdHJlYW0tPmdldE93bmVyUHJvY2Vzc0lkKCk7Ci0gICAgICAgIEFBdWRpb0NsaWVudFRyYWNrZXI6OmdldEluc3RhbmNlKCkudW5yZWdpc3RlckNsaWVudFN0cmVhbShwaWQsIHNlcnZpY2VTdHJlYW0pOwotICAgICAgICByZXR1cm4gQUFVRElPX09LOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dXKCJBQXVkaW9TZXJ2aWNlOjpjbG9zZVN0cmVhbSgweCUweCkgYmVpbmcgaGFuZGxlZCBieSBhbm90aGVyIHRocmVhZCIsIHN0cmVhbUhhbmRsZSk7Ci0gICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEU7Ci0gICAgfQorICAgIHBpZF90IHBpZCA9IHNlcnZpY2VTdHJlYW0tPmdldE93bmVyUHJvY2Vzc0lkKCk7CisgICAgQUF1ZGlvQ2xpZW50VHJhY2tlcjo6Z2V0SW5zdGFuY2UoKS51bnJlZ2lzdGVyQ2xpZW50U3RyZWFtKHBpZCwgc2VydmljZVN0cmVhbSk7CisKKyAgICBzZXJ2aWNlU3RyZWFtLT5zZXRDbG9zZU5lZWRlZCh0cnVlKTsKKyAgICAodm9pZCkgcmVsZWFzZVN0cmVhbShzZXJ2aWNlU3RyZWFtKTsKKyAgICByZXR1cm4gQUFVRElPX09LOwogfQogCi0KIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBBQXVkaW9TZXJ2aWNlOjpjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKAogICAgICAgICBhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSB7CiAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBtU3RyZWFtVHJhY2tlci5nZXRTdHJlYW1CeUhhbmRsZShzdHJlYW1IYW5kbGUpOwpAQCAtMTgxLDcgKzE5NCw5IEBACiAgICAgICAgIGlmICghYWxsb3dlZCkgewogICAgICAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2U6IGNhbGxpbmcgdWlkICVkIGNhbm5vdCBhY2Nlc3Mgc3RyZWFtIDB4JTA4WCBvd25lZCBieSAlZCIsCiAgICAgICAgICAgICAgICAgICBjYWxsaW5nVXNlcklkLCBzdHJlYW1IYW5kbGUsIG93bmVyVXNlcklkKTsKLSAgICAgICAgICAgIHNlcnZpY2VTdHJlYW0gPSBudWxscHRyOworICAgICAgICAgICAgc2VydmljZVN0cmVhbS5jbGVhcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VydmljZVN0cmVhbS0+aW5jcmVtZW50U2VydmljZVJlZmVyZW5jZUNvdW50KCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHNlcnZpY2VTdHJlYW07CkBAIC0xOTIsOTQgKzIwNyw5NyBAQAogICAgICAgICAgICAgICAgIGFhdWRpbzo6QXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpIHsKICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKICAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlOjpnZXRTdHJlYW1EZXNjcmlwdGlvbigpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUgPSAweCUweCIsIHN0cmVhbUhhbmRsZSk7CisgICAgICAgIEFMT0dFKCJnZXRTdHJlYW1EZXNjcmlwdGlvbigpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUgPSAweCUweCIsIHN0cmVhbUhhbmRsZSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEU7CiAgICAgfQogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHNlcnZpY2VTdHJlYW0tPmdldERlc2NyaXB0aW9uKHBhcmNlbGFibGUpOwogICAgIC8vIHBhcmNlbGFibGUuZHVtcCgpOwotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIGNoZWNrRm9yUGVuZGluZ0Nsb3NlKHNlcnZpY2VTdHJlYW0sIHJlc3VsdCk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlOjpzdGFydFN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSB7CiAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7CiAgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6c3RhcnRTdHJlYW0oKSwgaWxsZWdhbCBzdHJlYW0gaGFuZGxlID0gMHglMHgiLCBzdHJlYW1IYW5kbGUpOworICAgICAgICBBTE9HRSgic3RhcnRTdHJlYW0oKSwgaWxsZWdhbCBzdHJlYW0gaGFuZGxlID0gMHglMHgiLCBzdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwogICAgIH0KIAotICAgIHJldHVybiBzZXJ2aWNlU3RyZWFtLT5zdGFydCgpOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5zdGFydCgpOworICAgIHJldHVybiBjaGVja0ZvclBlbmRpbmdDbG9zZShzZXJ2aWNlU3RyZWFtLCByZXN1bHQpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZTo6cGF1c2VTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgewogICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOwogICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2U6OnBhdXNlU3RyZWFtKCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSA9IDB4JTB4Iiwgc3RyZWFtSGFuZGxlKTsKKyAgICAgICAgQUxPR0UoInBhdXNlU3RyZWFtKCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSA9IDB4JTB4Iiwgc3RyZWFtSGFuZGxlKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRTsKICAgICB9CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHNlcnZpY2VTdHJlYW0tPnBhdXNlKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gY2hlY2tGb3JQZW5kaW5nQ2xvc2Uoc2VydmljZVN0cmVhbSwgcmVzdWx0KTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2U6OnN0b3BTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgewogICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOwogICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2U6OnN0b3BTdHJlYW0oKSwgaWxsZWdhbCBzdHJlYW0gaGFuZGxlID0gMHglMHgiLCBzdHJlYW1IYW5kbGUpOworICAgICAgICBBTE9HRSgic3RvcFN0cmVhbSgpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUgPSAweCUweCIsIHN0cmVhbUhhbmRsZSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEU7CiAgICAgfQogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5zdG9wKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gY2hlY2tGb3JQZW5kaW5nQ2xvc2Uoc2VydmljZVN0cmVhbSwgcmVzdWx0KTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2U6OmZsdXNoU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKICAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlOjpmbHVzaFN0cmVhbSgpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUgPSAweCUweCIsIHN0cmVhbUhhbmRsZSk7CisgICAgICAgIEFMT0dFKCJmbHVzaFN0cmVhbSgpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUgPSAweCUweCIsIHN0cmVhbUhhbmRsZSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEU7CiAgICAgfQotICAgIHJldHVybiBzZXJ2aWNlU3RyZWFtLT5mbHVzaCgpOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5mbHVzaCgpOworICAgIHJldHVybiBjaGVja0ZvclBlbmRpbmdDbG9zZShzZXJ2aWNlU3RyZWFtLCByZXN1bHQpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZTo6cmVnaXN0ZXJBdWRpb1RocmVhZChhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgY2xpZW50VGhyZWFkSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBlcmlvZE5hbm9zZWNvbmRzKSB7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKICAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlOjpyZWdpc3RlckF1ZGlvVGhyZWFkKCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSA9IDB4JTB4Iiwgc3RyZWFtSGFuZGxlKTsKKyAgICAgICAgQUxPR0UoInJlZ2lzdGVyQXVkaW9UaHJlYWQoKSwgaWxsZWdhbCBzdHJlYW0gaGFuZGxlID0gMHglMHgiLCBzdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwogICAgIH0KICAgICBpZiAoc2VydmljZVN0cmVhbS0+Z2V0UmVnaXN0ZXJlZFRocmVhZCgpICE9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpJTExFR0FMX1RIUkVBRF9JRCkgewogICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6cmVnaXN0ZXJBdWRpb1RocmVhZCgpLCB0aHJlYWQgYWxyZWFkeSByZWdpc3RlcmVkIik7Ci0gICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKLSAgICB9Ci0KLSAgICBjb25zdCBwaWRfdCBvd25lclBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsgLy8gVE9ETyByZXZpZXcKLSAgICBzZXJ2aWNlU3RyZWFtLT5zZXRSZWdpc3RlcmVkVGhyZWFkKGNsaWVudFRocmVhZElkKTsKLSAgICBpbnQgZXJyID0gYW5kcm9pZDo6cmVxdWVzdFByaW9yaXR5KG93bmVyUGlkLCBjbGllbnRUaHJlYWRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQVVESU9fUFJJT1JJVFksIHRydWUgLyogaXNGb3JBcHAgKi8pOwotICAgIGlmIChlcnIgIT0gMCl7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlOjpyZWdpc3RlckF1ZGlvVGhyZWFkKCVkKSBmYWlsZWQsIGVycm5vID0gJWQsIHByaW9yaXR5ID0gJWQiLAotICAgICAgICAgICAgICBjbGllbnRUaHJlYWRJZCwgZXJybm8sIERFRkFVTFRfQVVESU9fUFJJT1JJVFkpOwotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVEVSTkFMOworICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gQUFVRElPX09LOworICAgICAgICBjb25zdCBwaWRfdCBvd25lclBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsgLy8gVE9ETyByZXZpZXcKKyAgICAgICAgc2VydmljZVN0cmVhbS0+c2V0UmVnaXN0ZXJlZFRocmVhZChjbGllbnRUaHJlYWRJZCk7CisgICAgICAgIGludCBlcnIgPSBhbmRyb2lkOjpyZXF1ZXN0UHJpb3JpdHkob3duZXJQaWQsIGNsaWVudFRocmVhZElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQVVESU9fUFJJT1JJVFksIHRydWUgLyogaXNGb3JBcHAgKi8pOworICAgICAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlOjpyZWdpc3RlckF1ZGlvVGhyZWFkKCVkKSBmYWlsZWQsIGVycm5vID0gJWQsIHByaW9yaXR5ID0gJWQiLAorICAgICAgICAgICAgICAgICAgY2xpZW50VGhyZWFkSWQsIGVycm5vLCBERUZBVUxUX0FVRElPX1BSSU9SSVRZKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlRFUk5BTDsKKyAgICAgICAgfQogICAgIH0KKyAgICByZXR1cm4gY2hlY2tGb3JQZW5kaW5nQ2xvc2Uoc2VydmljZVN0cmVhbSwgcmVzdWx0KTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2U6OnVucmVnaXN0ZXJBdWRpb1RocmVhZChhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBjbGllbnRUaHJlYWRJZCkgeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7CiAgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6dW5yZWdpc3RlckF1ZGlvVGhyZWFkKCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSA9IDB4JTB4IiwKLSAgICAgICAgICAgICAgc3RyZWFtSGFuZGxlKTsKKyAgICAgICAgQUxPR0UoIiVzKCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSA9IDB4JTB4IiwgX19mdW5jX18sIHN0cmVhbUhhbmRsZSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEU7CiAgICAgfQogICAgIGlmIChzZXJ2aWNlU3RyZWFtLT5nZXRSZWdpc3RlcmVkVGhyZWFkKCkgIT0gY2xpZW50VGhyZWFkSWQpIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2U6OnVucmVnaXN0ZXJBdWRpb1RocmVhZCgpLCB3cm9uZyB0aHJlYWQiKTsKLSAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UOworICAgICAgICBBTE9HRSgiJXMoKSwgd3JvbmcgdGhyZWFkIiwgX19mdW5jX18pOworICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKKyAgICB9IGVsc2UgeworICAgICAgICBzZXJ2aWNlU3RyZWFtLT5zZXRSZWdpc3RlcmVkVGhyZWFkKDApOwogICAgIH0KLSAgICBzZXJ2aWNlU3RyZWFtLT5zZXRSZWdpc3RlcmVkVGhyZWFkKDApOwotICAgIHJldHVybiBBQVVESU9fT0s7CisgICAgcmV0dXJuIGNoZWNrRm9yUGVuZGluZ0Nsb3NlKHNlcnZpY2VTdHJlYW0sIHJlc3VsdCk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlOjpzdGFydENsaWVudChhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLApAQCAtMjg3LDIwICszMDUsMzYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpjbGllbnRIYW5kbGUpIHsKICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKICAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlOjpzdGFydENsaWVudCgpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUgPSAweCUweCIsCi0gICAgICAgICAgICAgIHN0cmVhbUhhbmRsZSk7CisgICAgICAgIEFMT0dFKCIlcygpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUgPSAweCUweCIsIF9fZnVuY19fLCBzdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwogICAgIH0KLSAgICByZXR1cm4gc2VydmljZVN0cmVhbS0+c3RhcnRDbGllbnQoY2xpZW50LCBjbGllbnRIYW5kbGUpOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5zdGFydENsaWVudChjbGllbnQsIGNsaWVudEhhbmRsZSk7CisgICAgcmV0dXJuIGNoZWNrRm9yUGVuZGluZ0Nsb3NlKHNlcnZpY2VTdHJlYW0sIHJlc3VsdCk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlOjpzdG9wQ2xpZW50KGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SGFuZGxlKSB7CiAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7CiAgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZTo6c3RvcENsaWVudCgpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUgPSAweCUweCIsCi0gICAgICAgICAgICAgIHN0cmVhbUhhbmRsZSk7CisgICAgICAgIEFMT0dFKCIlcygpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUgPSAweCUweCIsIF9fZnVuY19fLCBzdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwogICAgIH0KLSAgICByZXR1cm4gc2VydmljZVN0cmVhbS0+c3RvcENsaWVudChjbGllbnRIYW5kbGUpOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5zdG9wQ2xpZW50KHBvcnRIYW5kbGUpOworICAgIHJldHVybiBjaGVja0ZvclBlbmRpbmdDbG9zZShzZXJ2aWNlU3RyZWFtLCByZXN1bHQpOworfQorCisvLyBUaGlzIGlzIG9ubHkgY2FsbGVkIGludGVybmFsbHkgd2hlbiBBdWRpb0ZsaW5nZXIgd2FudHMgdG8gdGVhciBkb3duIGEgc3RyZWFtLgorLy8gU28gd2UgZG8gbm90IGhhdmUgdG8gY2hlY2sgcGVybWlzc2lvbnMuCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZTo6ZGlzY29ubmVjdFN0cmVhbUJ5UG9ydEhhbmRsZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRIYW5kbGUpIHsKKyAgICBBTE9HRCgiJXMoJWQpIGNhbGxlZCIsIF9fZnVuY19fLCBwb3J0SGFuZGxlKTsKKyAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9CisgICAgICAgICAgICBtU3RyZWFtVHJhY2tlci5maW5kU3RyZWFtQnlQb3J0SGFuZGxlKHBvcnRIYW5kbGUpOworICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzKCksIGNvdWxkIG5vdCBmaW5kIHN0cmVhbSB3aXRoIHBvcnRIYW5kbGUgPSAlZCIsIF9fZnVuY19fLCBwb3J0SGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRTsKKyAgICB9CisgICAgc2VydmljZVN0cmVhbS0+aW5jcmVtZW50U2VydmljZVJlZmVyZW5jZUNvdW50KCk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHNlcnZpY2VTdHJlYW0tPnN0b3AoKTsKKyAgICBzZXJ2aWNlU3RyZWFtLT5kaXNjb25uZWN0KCk7CisgICAgcmV0dXJuIGNoZWNrRm9yUGVuZGluZ0Nsb3NlKHNlcnZpY2VTdHJlYW0sIHJlc3VsdCk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmgKaW5kZXggZWVmMDgyNC4uZDIxYjFjZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuaApAQCAtODMsNiArODMsOCBAQAogICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wQ2xpZW50KGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgY2xpZW50SGFuZGxlKSBvdmVycmlkZTsKIAorICAgIGFhdWRpb19yZXN1bHRfdCBkaXNjb25uZWN0U3RyZWFtQnlQb3J0SGFuZGxlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydEhhbmRsZSk7CisKIHByaXZhdGU6CiAKICAgICAvKioKQEAgLTk0LDkgKzk2LDE1IEBACiAgICAgICAgICAgICBhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpOwogCiAKLSAgICBhbmRyb2lkOjpBdWRpb0NsaWVudCBtQXVkaW9DbGllbnQ7CiAKLSAgICBhYXVkaW86OkFBdWRpb1N0cmVhbVRyYWNrZXIgICAgICAgICAgICAgICAgIG1TdHJlYW1UcmFja2VyOworICAgIGJvb2wgcmVsZWFzZVN0cmVhbShjb25zdCBzcDxhYXVkaW86OkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiAmc2VydmljZVN0cmVhbSk7CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgY2hlY2tGb3JQZW5kaW5nQ2xvc2UoY29uc3Qgc3A8YWF1ZGlvOjpBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gJnNlcnZpY2VTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19yZXN1bHRfdCBkZWZhdWx0UmVzdWx0KTsKKworICAgIGFuZHJvaWQ6OkF1ZGlvQ2xpZW50ICAgICAgICAgICAgbUF1ZGlvQ2xpZW50OworCisgICAgYWF1ZGlvOjpBQXVkaW9TdHJlYW1UcmFja2VyICAgICBtU3RyZWFtVHJhY2tlcjsKIAogICAgIGVudW0gY29uc3RhbnRzIHsKICAgICAgICAgREVGQVVMVF9BVURJT19QUklPUklUWSA9IDIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuY3BwCmluZGV4IDMwOTViYzkuLjAzNDkwMzQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmNwcApAQCAtMzksNyArMzksNyBAQAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsgICAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZAogCiBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6On5BQXVkaW9TZXJ2aWNlRW5kcG9pbnQoKSB7Ci0gICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludDo6fkFBdWRpb1NlcnZpY2VFbmRwb2ludCgpIGRlc3Ryb3lpbmcgZW5kcG9pbnQgJXAiLCB0aGlzKTsKKyAgICBBTE9HRCgiJXMoJXApIGRlc3Ryb3llZCIsIF9fZnVuY19fLCB0aGlzKTsKIH0KIAogc3RkOjpzdHJpbmcgQUF1ZGlvU2VydmljZUVuZHBvaW50OjpkdW1wKCkgY29uc3QgewpAQCAtNTUsMTEgKzU1LDE3IEBACiAKICAgICByZXN1bHQgPDwgIiAgICBEaXJlY3Rpb246ICAgICAgICAgICAgIiA8PCAoKGdldERpcmVjdGlvbigpID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJPVVRQVVQiIDogIklOUFVUIikgPDwgIlxuIjsKLSAgICByZXN1bHQgPDwgIiAgICBTYW1wbGUgUmF0ZTogICAgICAgICAgIiA8PCBnZXRTYW1wbGVSYXRlKCkgPDwgIlxuIjsKLSAgICByZXN1bHQgPDwgIiAgICBGcmFtZXMgUGVyIEJ1cnN0OiAgICAgIiA8PCBtRnJhbWVzUGVyQnVyc3QgPDwgIlxuIjsKLSAgICByZXN1bHQgPDwgIiAgICBSZWZlcmVuY2UgQ291bnQ6ICAgICAgIiA8PCBtT3BlbkNvdW50IDw8ICJcbiI7CiAgICAgcmVzdWx0IDw8ICIgICAgUmVxdWVzdGVkIERldmljZSBJZDogICIgPDwgbVJlcXVlc3RlZERldmljZUlkIDw8ICJcbiI7CiAgICAgcmVzdWx0IDw8ICIgICAgRGV2aWNlIElkOiAgICAgICAgICAgICIgPDwgZ2V0RGV2aWNlSWQoKSA8PCAiXG4iOworICAgIHJlc3VsdCA8PCAiICAgIFNhbXBsZSBSYXRlOiAgICAgICAgICAiIDw8IGdldFNhbXBsZVJhdGUoKSA8PCAiXG4iOworICAgIHJlc3VsdCA8PCAiICAgIENoYW5uZWwgQ291bnQ6ICAgICAgICAiIDw8IGdldFNhbXBsZXNQZXJGcmFtZSgpIDw8ICJcbiI7CisgICAgcmVzdWx0IDw8ICIgICAgRnJhbWVzIFBlciBCdXJzdDogICAgICIgPDwgbUZyYW1lc1BlckJ1cnN0IDw8ICJcbiI7CisgICAgcmVzdWx0IDw8ICIgICAgVXNhZ2U6ICAgICAgICAgICAgICAgICIgPDwgZ2V0VXNhZ2UoKSA8PCAiXG4iOworICAgIHJlc3VsdCA8PCAiICAgIENvbnRlbnRUeXBlOiAgICAgICAgICAiIDw8IGdldENvbnRlbnRUeXBlKCkgPDwgIlxuIjsKKyAgICByZXN1bHQgPDwgIiAgICBJbnB1dFByZXNldDogICAgICAgICAgIiA8PCBnZXRJbnB1dFByZXNldCgpIDw8ICJcbiI7CisgICAgcmVzdWx0IDw8ICIgICAgUmVmZXJlbmNlIENvdW50OiAgICAgICIgPDwgbU9wZW5Db3VudCA8PCAiXG4iOworICAgIHJlc3VsdCA8PCAiICAgIFNlc3Npb24gSWQ6ICAgICAgICAgICAiIDw8IGdldFNlc3Npb25JZCgpIDw8ICJcbiI7CisgICAgcmVzdWx0IDw8ICIgICAgQ29ubmVjdGVkOiAgICAgICAgICAgICIgPDwgbUNvbm5lY3RlZC5sb2FkKCkgPDwgIlxuIjsKICAgICByZXN1bHQgPDwgIiAgICBSZWdpc3RlcmVkIFN0cmVhbXM6IiA8PCAiXG4iOwogICAgIHJlc3VsdCA8PCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpkdW1wSGVhZGVyKCkgPDwgIlxuIjsKICAgICBmb3IgKGNvbnN0IGF1dG8gc3RyZWFtIDogbVJlZ2lzdGVyZWRTdHJlYW1zKSB7CkBAIC03Miw5ICs3OCwyMiBAQAogICAgIHJldHVybiByZXN1bHQuc3RyKCk7CiB9CiAKLXZvaWQgQUF1ZGlvU2VydmljZUVuZHBvaW50OjpkaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXMoKSB7CisvLyBAcmV0dXJuIHRydWUgaWYgc3RyZWFtIGZvdW5kCitib29sIEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6aXNTdHJlYW1SZWdpc3RlcmVkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydEhhbmRsZSkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrU3RyZWFtcyk7CiAgICAgZm9yIChjb25zdCBhdXRvIHN0cmVhbSA6IG1SZWdpc3RlcmVkU3RyZWFtcykgeworICAgICAgICBpZiAoc3RyZWFtLT5nZXRQb3J0SGFuZGxlKCkgPT0gcG9ydEhhbmRsZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6ZGlzY29ubmVjdFJlZ2lzdGVyZWRTdHJlYW1zKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrU3RyZWFtcyk7CisgICAgbUNvbm5lY3RlZC5zdG9yZShmYWxzZSk7CisgICAgZm9yIChjb25zdCBhdXRvIHN0cmVhbSA6IG1SZWdpc3RlcmVkU3RyZWFtcykgeworICAgICAgICBBTE9HRCgiZGlzY29ubmVjdFJlZ2lzdGVyZWRTdHJlYW1zKCkgc3RvcCBhbmQgZGlzY29ubmVjdCAlcCIsIHN0cmVhbS5nZXQoKSk7CiAgICAgICAgIHN0cmVhbS0+c3RvcCgpOwogICAgICAgICBzdHJlYW0tPmRpc2Nvbm5lY3QoKTsKICAgICB9CkBAIC05Niw2ICsxMTUsOSBAQAogfQogCiBib29sIEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6bWF0Y2hlcyhjb25zdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uKSB7CisgICAgaWYgKCFtQ29ubmVjdGVkLmxvYWQoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7IC8vIE9ubHkgdXNlIGFuIGVuZHBvaW50IGlmIGl0IGlzIGNvbm5lY3RlZCB0byBhIGRldmljZS4KKyAgICB9CiAgICAgaWYgKGNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0aW9uKCkgIT0gZ2V0RGlyZWN0aW9uKCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTEwMyw2ICsxMjUsMTAgQEAKICAgICAgICAgY29uZmlndXJhdGlvbi5nZXREZXZpY2VJZCgpICE9IGdldERldmljZUlkKCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KKyAgICBpZiAoY29uZmlndXJhdGlvbi5nZXRTZXNzaW9uSWQoKSAhPSBBQVVESU9fU0VTU0lPTl9JRF9BTExPQ0FURSAmJgorICAgICAgICBjb25maWd1cmF0aW9uLmdldFNlc3Npb25JZCgpICE9IGdldFNlc3Npb25JZCgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAgICAgaWYgKGNvbmZpZ3VyYXRpb24uZ2V0U2FtcGxlUmF0ZSgpICE9IEFBVURJT19VTlNQRUNJRklFRCAmJgogICAgICAgICBjb25maWd1cmF0aW9uLmdldFNhbXBsZVJhdGUoKSAhPSBnZXRTYW1wbGVSYXRlKCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaAppbmRleCBjMTljYzM1Li4yNTNmMjkwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaApAQCAtOTcsNyArOTcsMTggQEAKICAgICAgICAgbU9wZW5Db3VudCA9IGNvdW50OwogICAgIH0KIAorICAgIGJvb2wgaXNDb25uZWN0ZWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ29ubmVjdGVkOworICAgIH0KKwogcHJvdGVjdGVkOgorCisgICAgLyoqCisgICAgICogQHBhcmFtIHBvcnRIYW5kbGUKKyAgICAgKiBAcmV0dXJuIHJldHVybiB0cnVlIGlmIGEgc3RyZWFtIHdpdGggdGhlIGdpdmVuIHBvcnRIYW5kbGUgaXMgcmVnaXN0ZXJlZAorICAgICAqLworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICBpc1N0cmVhbVJlZ2lzdGVyZWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SGFuZGxlKTsKKwogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXMoKTsKIAogICAgIG11dGFibGUgc3RkOjptdXRleCAgICAgICBtTG9ja1N0cmVhbXM7CkBAIC0xMTEsNiArMTIyLDcgQEAKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgbU9wZW5Db3VudCA9IDA7CiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgIG1SZXF1ZXN0ZWREZXZpY2VJZCA9IDA7CiAKKyAgICBzdGQ6OmF0b21pYzxib29sPiAgICAgICAgbUNvbm5lY3RlZHt0cnVlfTsKIH07CiAKIH0gLyogbmFtZXNwYWNlIGFhdWRpbyAqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmNwcAppbmRleCBjN2Q5YjhlLi5lZmFjNzg4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmNwcApAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBMT0dfVEFHICJBQXVkaW9TZXJ2aWNlIgorI2RlZmluZSBMT0dfVEFHICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCkBAIC01Nyw4ICs1Nyw3IEBACiAKIC8vIFJlYWQgZGF0YSBmcm9tIHRoZSBzaGFyZWQgTU1BUCBzdHJlYW0gYW5kIHRoZW4gZGlzdHJpYnV0ZSBpdCB0byB0aGUgY2xpZW50IHN0cmVhbXMuCiB2b2lkICpBQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlOjpjYWxsYmFja0xvb3AoKSB7Ci0gICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUoKTogY2FsbGJhY2tMb29wKCkgZW50ZXJpbmciKTsKLSAgICBpbnQzMl90IHVuZGVyZmxvd0NvdW50ID0gMDsKKyAgICBBTE9HRCgiY2FsbGJhY2tMb29wKCkgZW50ZXJpbmciKTsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwogICAgIGludDY0X3QgdGltZW91dE5hbm9zID0gZ2V0U3RyZWFtSW50ZXJuYWwoKS0+Y2FsY3VsYXRlUmVhc29uYWJsZVRpbWVvdXQoKTsKIApAQCAtNzMsNyArNzIsNyBAQAogICAgICAgICAgICAgZGlzY29ubmVjdFJlZ2lzdGVyZWRTdHJlYW1zKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gZ2V0RnJhbWVzUGVyQnVyc3QoKSkgewotICAgICAgICAgICAgQUxPR1coIkFBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUoKTogY2FsbGJhY2tMb29wKCkgcmVhZCAlZCAvICVkIiwKKyAgICAgICAgICAgIEFMT0dXKCJjYWxsYmFja0xvb3AoKSByZWFkICVkIC8gJWQiLAogICAgICAgICAgICAgICAgICAgcmVzdWx0LCBnZXRGcmFtZXNQZXJCdXJzdCgpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMDIsOSArMTAxLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwb3NpdGlvbk9mZnNldCA9IG1tYXBGcmFtZXNSZWFkIC0gY2xpZW50RnJhbWVzV3JpdHRlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TaGFyZWQtPnNldFRpbWVzdGFtcFBvc2l0aW9uT2Zmc2V0KHBvc2l0aW9uT2Zmc2V0KTsKIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElzIHRoZSBidWZmZXIgdG9vIGZ1bGwgdG8gd3JpdGUgYSBidXJzdD8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlmby0+Z2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCkgPAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGcmFtZXNQZXJCdXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVyZmxvd0NvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGcmFtZXNQZXJCdXJzdCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNoYXJlZC0+aW5jcmVtZW50WFJ1bkNvdW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlmby0+d3JpdGUobURpc3RyaWJ1dGlvbkJ1ZmZlciwgZ2V0RnJhbWVzUGVyQnVyc3QoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTI1LDYgKzEyNSw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBBTE9HRCgiQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZSgpOiBjYWxsYmFja0xvb3AoKSBleGl0aW5nLCAlZCB1bmRlcmZsb3dzIiwgdW5kZXJmbG93Q291bnQpOworICAgIEFMT0dEKCJjYWxsYmFja0xvb3AoKSBleGl0aW5nIik7CiAgICAgcmV0dXJuIE5VTEw7IC8vIFRPRE8gcmV2aWV3CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuY3BwCmluZGV4IDdlNmUyNDcuLmY5ZTIxZmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuY3BwCkBAIC00OCw4ICs0OCwxMCBAQAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7ICAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsgICAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZAogCi1BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQKCkKLSAgICAgICAgOiAgbU1tYXBTdHJlYW0obnVsbHB0cikge30KKworQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6QUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUChBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UpCisgICAgICAgIDogbU1tYXBTdHJlYW0obnVsbHB0cikKKyAgICAgICAgLCBtQUF1ZGlvU2VydmljZShhdWRpb1NlcnZpY2UpIHt9CiAKIEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6On5BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQKCkge30KIApAQCAtNzIsMTMgKzc0LDYgQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKLSAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHsKLSAgICAgICAgICAgIC5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfTVVTSUMsCi0gICAgICAgICAgICAudXNhZ2UgPSBBVURJT19VU0FHRV9NRURJQSwKLSAgICAgICAgICAgIC5zb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04sCi0gICAgICAgICAgICAuZmxhZ3MgPSBBVURJT19GTEFHX0xPV19MQVRFTkNZLAotICAgICAgICAgICAgLnRhZ3MgPSAiIgotICAgIH07CiAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWc7CiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZDsKIApAQCAtODcsNiArODIsMjggQEAKIAogICAgIGNvcHlGcm9tKHJlcXVlc3QuZ2V0Q29uc3RhbnRDb25maWd1cmF0aW9uKCkpOwogCisgICAgYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiA9IGdldERpcmVjdGlvbigpOworCisgICAgY29uc3QgYXVkaW9fY29udGVudF90eXBlX3QgY29udGVudFR5cGUgPQorICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9jb250ZW50VHlwZVRvSW50ZXJuYWwoZ2V0Q29udGVudFR5cGUoKSk7CisgICAgLy8gVXNhZ2Ugb25seSB1c2VkIGZvciBPVVRQVVQKKyAgICBjb25zdCBhdWRpb191c2FnZV90IHVzYWdlID0gKGRpcmVjdGlvbiA9PSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCkKKyAgICAgICAgICAgID8gQUF1ZGlvQ29udmVydF91c2FnZVRvSW50ZXJuYWwoZ2V0VXNhZ2UoKSkKKyAgICAgICAgICAgIDogQVVESU9fVVNBR0VfVU5LTk9XTjsKKyAgICBjb25zdCBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSAoZGlyZWN0aW9uID09IEFBVURJT19ESVJFQ1RJT05fSU5QVVQpCisgICAgICAgICAgICA/IEFBdWRpb0NvbnZlcnRfaW5wdXRQcmVzZXRUb0F1ZGlvU291cmNlKGdldElucHV0UHJlc2V0KCkpCisgICAgICAgICAgICA6IEFVRElPX1NPVVJDRV9ERUZBVUxUOworCisgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7CisgICAgICAgICAgICAuY29udGVudF90eXBlID0gY29udGVudFR5cGUsCisgICAgICAgICAgICAudXNhZ2UgPSB1c2FnZSwKKyAgICAgICAgICAgIC5zb3VyY2UgPSBzb3VyY2UsCisgICAgICAgICAgICAuZmxhZ3MgPSBBVURJT19GTEFHX0xPV19MQVRFTkNZLAorICAgICAgICAgICAgLnRhZ3MgPSAiIgorICAgIH07CisgICAgQUxPR0QoIiVzKCVwKSBNTUFQIGF0dHJpYnV0ZXMudXNhZ2UgPSAlZCwgY29udGVudF90eXBlID0gJWQsIHNvdXJjZSA9ICVkIiwKKyAgICAgICAgICBfX2Z1bmNfXywgdGhpcywgYXR0cmlidXRlcy51c2FnZSwgYXR0cmlidXRlcy5jb250ZW50X3R5cGUsIGF0dHJpYnV0ZXMuc291cmNlKTsKKwogICAgIG1NbWFwQ2xpZW50LmNsaWVudFVpZCA9IHJlcXVlc3QuZ2V0VXNlcklkKCk7CiAgICAgbU1tYXBDbGllbnQuY2xpZW50UGlkID0gcmVxdWVzdC5nZXRQcm9jZXNzSWQoKTsKICAgICBtTW1hcENsaWVudC5wYWNrYWdlTmFtZS5zZXRUbyhTdHJpbmcxNigiIikpOwpAQCAtMTA4LDcgKzEyNSw2IEBACiAKICAgICBpbnQzMl90IGFhdWRpb1NhbXBsZXNQZXJGcmFtZSA9IGdldFNhbXBsZXNQZXJGcmFtZSgpOwogCi0gICAgYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiA9IGdldERpcmVjdGlvbigpOwogICAgIGlmIChkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpIHsKICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IChhYXVkaW9TYW1wbGVzUGVyRnJhbWUgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8KQEAgLTEyMiw3ICsxMzgsNyBAQAogICAgICAgICBtSGFyZHdhcmVUaW1lT2Zmc2V0TmFub3MgPSBJTlBVVF9FU1RJTUFURURfSEFSRFdBUkVfT0ZGU0VUX05BTk9TOyAvLyBmcmFtZXMgYXQgQURDIGVhcmxpZXIKIAogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJvcGVuTW1hcFN0cmVhbSAtIGludmFsaWQgZGlyZWN0aW9uID0gJWQiLCBkaXJlY3Rpb24pOworICAgICAgICBBTE9HRSgiJXMoKSBpbnZhbGlkIGRpcmVjdGlvbiA9ICVkIiwgX19mdW5jX18sIGRpcmVjdGlvbik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKICAgICB9CiAKQEAgLTEzMSwyNyArMTQ3LDQyIEBACiAgICAgICAgICAgICA/IE1tYXBTdHJlYW1JbnRlcmZhY2U6OkRJUkVDVElPTl9PVVRQVVQKICAgICAgICAgICAgIDogTW1hcFN0cmVhbUludGVyZmFjZTo6RElSRUNUSU9OX0lOUFVUOwogCisgICAgYWF1ZGlvX3Nlc3Npb25faWRfdCByZXF1ZXN0ZWRTZXNzaW9uSWQgPSBnZXRTZXNzaW9uSWQoKTsKKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTZXNzaW9uSWQocmVxdWVzdGVkU2Vzc2lvbklkKTsKKwogICAgIC8vIE9wZW4gSEFMIHN0cmVhbS4gU2V0IG1NbWFwU3RyZWFtCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTW1hcFN0cmVhbUludGVyZmFjZTo6b3Blbk1tYXBTdHJlYW0oc3RyZWFtRGlyZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1tYXBDbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgLy8gY2FsbGJhY2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTW1hcFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVBvcnRIYW5kbGUpOwotICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpvcGVuKCkgbU1hcENsaWVudC51aWQgPSAlZCwgcGlkID0gJWQgPT4gcG9ydEhhbmRsZSA9ICVkXG4iLAotICAgICAgICAgIG1NbWFwQ2xpZW50LmNsaWVudFVpZCwgIG1NbWFwQ2xpZW50LmNsaWVudFBpZCwgbVBvcnRIYW5kbGUpOworICAgIEFMT0dEKCIlcygpIG1NYXBDbGllbnQudWlkID0gJWQsIHBpZCA9ICVkID0+IHBvcnRIYW5kbGUgPSAlZFxuIiwKKyAgICAgICAgICBfX2Z1bmNfXywgbU1tYXBDbGllbnQuY2xpZW50VWlkLCAgbU1tYXBDbGllbnQuY2xpZW50UGlkLCBtUG9ydEhhbmRsZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICBBTE9HRSgib3Blbk1tYXBTdHJlYW0gcmV0dXJuZWQgc3RhdHVzICVkIiwgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoIiVzKCkgb3Blbk1tYXBTdHJlYW0oKSByZXR1cm5lZCBzdGF0dXMgJWQiLCAgX19mdW5jX18sIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CiAgICAgfQogCiAgICAgaWYgKGRldmljZUlkID09IEFBVURJT19VTlNQRUNJRklFRCkgewotICAgICAgICBBTE9HVygiQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6b3BlbigpIC0gb3Blbk1tYXBTdHJlYW0oKSBmYWlsZWQgdG8gc2V0IGRldmljZUlkIik7CisgICAgICAgIEFMT0dXKCIlcygpIG9wZW5NbWFwU3RyZWFtKCkgZmFpbGVkIHRvIHNldCBkZXZpY2VJZCIsIF9fZnVuY19fKTsKICAgICB9CiAgICAgc2V0RGV2aWNlSWQoZGV2aWNlSWQpOwogCisgICAgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX0FMTE9DQVRFKSB7CisgICAgICAgIEFMT0dXKCIlcygpIC0gb3Blbk1tYXBTdHJlYW0oKSBmYWlsZWQgdG8gc2V0IHNlc3Npb25JZCIsIF9fZnVuY19fKTsKKyAgICB9CisKKyAgICBhYXVkaW9fc2Vzc2lvbl9pZF90IGFjdHVhbFNlc3Npb25JZCA9CisgICAgICAgICAgICAocmVxdWVzdGVkU2Vzc2lvbklkID09IEFBVURJT19TRVNTSU9OX0lEX05PTkUpCisgICAgICAgICAgICA/IEFBVURJT19TRVNTSU9OX0lEX05PTkUKKyAgICAgICAgICAgIDogKGFhdWRpb19zZXNzaW9uX2lkX3QpIHNlc3Npb25JZDsKKyAgICBzZXRTZXNzaW9uSWQoYWN0dWFsU2Vzc2lvbklkKTsKKyAgICBBTE9HRCgiJXMoKSBkZXZpY2VJZCA9ICVkLCBzZXNzaW9uSWQgPSAlZCIsIF9fZnVuY19fLCBnZXREZXZpY2VJZCgpLCBnZXRTZXNzaW9uSWQoKSk7CisKICAgICAvLyBDcmVhdGUgTU1BUC9OT0lSUSBidWZmZXIuCiAgICAgaW50MzJfdCBtaW5TaXplRnJhbWVzID0gZ2V0QnVmZmVyQ2FwYWNpdHkoKTsKICAgICBpZiAobWluU2l6ZUZyYW1lcyA8PSAwKSB7IC8vIHplcm8gd2lsbCBnZXQgcmVqZWN0ZWQKQEAgLTE1OSwxNCArMTkwLDE0IEBACiAgICAgfQogICAgIHN0YXR1cyA9IG1NbWFwU3RyZWFtLT5jcmVhdGVNbWFwQnVmZmVyKG1pblNpemVGcmFtZXMsICZtTW1hcEJ1ZmZlcmluZm8pOwogICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9wZW4oKSAtIGNyZWF0ZU1tYXBCdWZmZXIoKSBmYWlsZWQgd2l0aCBzdGF0dXMgJWQgJXMiLAotICAgICAgICAgICAgICBzdGF0dXMsIHN0cmVycm9yKC1zdGF0dXMpKTsKKyAgICAgICAgQUxPR0UoIiVzKCkgLSBjcmVhdGVNbWFwQnVmZmVyKCkgZmFpbGVkIHdpdGggc3RhdHVzICVkICVzIiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIHN0YXR1cywgc3RyZXJyb3IoLXN0YXR1cykpOwogICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0QoImNyZWF0ZU1tYXBCdWZmZXIgc3RhdHVzID0gJWQsIGJ1ZmZlcl9zaXplID0gJWQsIGJ1cnN0X3NpemUgJWQiCisgICAgICAgIEFMT0dEKCIlcygpIGNyZWF0ZU1tYXBCdWZmZXIoKSByZXR1cm5lZCA9ICVkLCBidWZmZXJfc2l6ZSA9ICVkLCBidXJzdF9zaXplICVkIgogICAgICAgICAgICAgICAgICAgICAgICIsIFNoYXJhYmxlIEZEOiAlcyIsCi0gICAgICAgICAgICAgIHN0YXR1cywKKyAgICAgICAgICAgICAgX19mdW5jX18sIHN0YXR1cywKICAgICAgICAgICAgICAgYWJzKG1NbWFwQnVmZmVyaW5mby5idWZmZXJfc2l6ZV9mcmFtZXMpLAogICAgICAgICAgICAgICBtTW1hcEJ1ZmZlcmluZm8uYnVyc3Rfc2l6ZV9mcmFtZXMsCiAgICAgICAgICAgICAgIG1NbWFwQnVmZmVyaW5mby5idWZmZXJfc2l6ZV9mcmFtZXMgPCAwID8gIlllcyIgOiAiTm8iKTsKQEAgLTE4Niw3ICsyMTcsNyBAQAogICAgICAgICAgICAgLy8gRmFsbGJhY2sgaXMgaGFuZGxlZCBieSBjYWxsZXIgYnV0IGluZGljYXRlIHdoYXQgaXMgcG9zc2libGUgaW4gY2FzZQogICAgICAgICAgICAgLy8gdGhpcyBpcyB1c2VkIGluIHRoZSBmdXR1cmUKICAgICAgICAgICAgIHNldFNoYXJpbmdNb2RlKEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKTsKLSAgICAgICAgICAgIEFMT0dXKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpvcGVuKCkgLSBleGNsdXNpdmUgRkQgY2Fubm90IGJlIHVzZWQgYnkgY2xpZW50Iik7CisgICAgICAgICAgICBBTE9HVygiJXMoKSAtIGV4Y2x1c2l2ZSBGRCBjYW5ub3QgYmUgdXNlZCBieSBjbGllbnQiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CkBAIC0yMDEsNyArMjMyLDcgQEAKICAgICAvLyBBc3N1bWUgdGhhdCBBdWRpb0ZsaW5nZXIgd2lsbCBjbG9zZSB0aGUgb3JpZ2luYWwgc2hhcmVkX21lbW9yeV9mZC4KICAgICBtQXVkaW9EYXRhRmlsZURlc2NyaXB0b3IucmVzZXQoZHVwKG1NbWFwQnVmZmVyaW5mby5zaGFyZWRfbWVtb3J5X2ZkKSk7CiAgICAgaWYgKG1BdWRpb0RhdGFGaWxlRGVzY3JpcHRvci5nZXQoKSA9PSAtMSkgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6b3BlbigpIC0gY291bGQgbm90IGR1cCBzaGFyZWRfbWVtb3J5X2ZkIik7CisgICAgICAgIEFMT0dFKCIlcygpIC0gY291bGQgbm90IGR1cCBzaGFyZWRfbWVtb3J5X2ZkIiwgX19mdW5jX18pOwogICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSU5URVJOQUw7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQpAQCAtMjE5LDEyICsyNTAsMTIgQEAKICAgICAgICAgYnVyc3RNaWNyb3MgPSBtRnJhbWVzUGVyQnVyc3QgKiBzdGF0aWNfY2FzdDxpbnQ2NF90PigxMDAwMDAwKSAvIGdldFNhbXBsZVJhdGUoKTsKICAgICB9IHdoaWxlIChidXJzdE1pY3JvcyA8IGJ1cnN0TWluTWljcm9zKTsKIAotICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpvcGVuKCkgb3JpZ2luYWwgYnVyc3QgPSAlZCwgbWluTWljcm9zID0gJWQsIHRvIGJ1cnN0ID0gJWRcbiIsCi0gICAgICAgICAgbU1tYXBCdWZmZXJpbmZvLmJ1cnN0X3NpemVfZnJhbWVzLCBidXJzdE1pbk1pY3JvcywgbUZyYW1lc1BlckJ1cnN0KTsKKyAgICBBTE9HRCgiJXMoKSBvcmlnaW5hbCBidXJzdCA9ICVkLCBtaW5NaWNyb3MgPSAlZCwgdG8gYnVyc3QgPSAlZFxuIiwKKyAgICAgICAgICBfX2Z1bmNfXywgbU1tYXBCdWZmZXJpbmZvLmJ1cnN0X3NpemVfZnJhbWVzLCBidXJzdE1pbk1pY3JvcywgbUZyYW1lc1BlckJ1cnN0KTsKIAotICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpvcGVuKCkgYWN0dWFsIHJhdGUgPSAlZCwgY2hhbm5lbHMgPSAlZCIKKyAgICBBTE9HRCgiJXMoKSBhY3R1YWwgcmF0ZSA9ICVkLCBjaGFubmVscyA9ICVkIgogICAgICAgICAgICIsIGRldmljZUlkID0gJWQsIGNhcGFjaXR5ID0gJWRcbiIsCi0gICAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpLCBnZXRTYW1wbGVzUGVyRnJhbWUoKSwgZGV2aWNlSWQsIGdldEJ1ZmZlckNhcGFjaXR5KCkpOworICAgICAgICAgIF9fZnVuY19fLCBnZXRTYW1wbGVSYXRlKCksIGdldFNhbXBsZXNQZXJGcmFtZSgpLCBkZXZpY2VJZCwgZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CiAKICAgICByZXR1cm4gcmVzdWx0OwogCkBAIC0yMzQsOSArMjY1LDggQEAKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OmNsb3NlKCkgewotCiAgICAgaWYgKG1NbWFwU3RyZWFtICE9IDApIHsKLSAgICAgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OmNsb3NlKCkgY2xlYXIoKSBlbmRwb2ludCIpOworICAgICAgICBBTE9HRCgiJXMoKSBjbGVhcigpIGVuZHBvaW50IiwgX19mdW5jX18pOwogICAgICAgICAvLyBOZWVkcyB0byBiZSBleHBsaWNpdGx5IGNsZWFyZWQgb3IgQ1RTIHdpbGwgZmFpbCBidXQgaXQgaXMgbm90IGNsZWFyIHdoeS4KICAgICAgICAgbU1tYXBTdHJlYW0uY2xlYXIoKTsKICAgICAgICAgLy8gQXBwYXJlbnRseSB0aGUgYWJvdmUgY2xvc2UgaXMgYXN5bmNocm9ub3VzLiBBbiBhdHRlbXB0IHRvIG9wZW4gYSBuZXcgZGV2aWNlCkBAIC0yNDksMTQgKzI3OSwyMSBAQAogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6c3RhcnRTdHJlYW0oc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqY2xpZW50SGFuZGxlIF9fdW51c2VkKSB7CiAgICAgLy8gU3RhcnQgdGhlIGNsaWVudCBvbiBiZWhhbGYgb2YgdGhlIEFBdWRpbyBzZXJ2aWNlLgogICAgIC8vIFVzZSB0aGUgcG9ydCBoYW5kbGUgdGhhdCB3YXMgcHJvdmlkZWQgYnkgb3Blbk1tYXBTdHJlYW0oKS4KLSAgICByZXR1cm4gc3RhcnRDbGllbnQobU1tYXBDbGllbnQsICZtUG9ydEhhbmRsZSk7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCB0ZW1wSGFuZGxlID0gbVBvcnRIYW5kbGU7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHN0YXJ0Q2xpZW50KG1NbWFwQ2xpZW50LCAmdGVtcEhhbmRsZSk7CisgICAgLy8gV2hlbiBBdWRpb0ZsaW5nZXIgaXMgcGFzc2VkIGEgdmFsaWQgcG9ydCBoYW5kbGUgdGhlbiBpdCBzaG91bGQgbm90IGNoYW5nZSBpdC4KKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHRlbXBIYW5kbGUgIT0gbVBvcnRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKSBwb3J0IGhhbmRsZSBub3QgZXhwZWN0ZWQgdG8gY2hhbmdlIGZyb20gJWQgdG8gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SGFuZGxlLCB0ZW1wSGFuZGxlKTsKKyAgICBBTE9HVigiJXMoJXApIG1Qb3J0SGFuZGxlID0gJWQiLCBfX2Z1bmNfXywgc3RyZWFtLmdldCgpLCBtUG9ydEhhbmRsZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OnN0b3BTdHJlYW0oc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBjbGllbnRIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBjbGllbnRIYW5kbGUgX191bnVzZWQpIHsKICAgICBtRnJhbWVzVHJhbnNmZXJyZWQucmVzZXQzMigpOwogCiAgICAgLy8gUm91bmQgNjQtYml0IGNvdW50ZXIgdXAgdG8gYSBtdWx0aXBsZSBvZiB0aGUgYnVmZmVyIGNhcGFjaXR5LgpAQCAtMjY1LDI2ICszMDIsMjcgQEAKICAgICAvLyB3aGVuIHRoZSBzdHJlYW0gaXMgc3RvcHBlZC4KICAgICBtRnJhbWVzVHJhbnNmZXJyZWQucm91bmRVcDY0KGdldEJ1ZmZlckNhcGFjaXR5KCkpOwogCisgICAgLy8gVXNlIHRoZSBwb3J0IGhhbmRsZSB0aGF0IHdhcyBwcm92aWRlZCBieSBvcGVuTW1hcFN0cmVhbSgpLgorICAgIEFMT0dWKCIlcyglcCkgbVBvcnRIYW5kbGUgPSAlZCIsIF9fZnVuY19fLCBzdHJlYW0uZ2V0KCksIG1Qb3J0SGFuZGxlKTsKICAgICByZXR1cm4gc3RvcENsaWVudChtUG9ydEhhbmRsZSk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpzdGFydENsaWVudChjb25zdCBhbmRyb2lkOjpBdWRpb0NsaWVudCYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSkgewogICAgIGlmIChtTW1hcFN0cmVhbSA9PSBudWxscHRyKSByZXR1cm4gQUFVRElPX0VSUk9SX05VTEw7Ci0gICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OnN0YXJ0Q2xpZW50KCVwKHVpZD0lZCwgcGlkPSVkKSkiLAotICAgICAgICAgICZjbGllbnQsIGNsaWVudC5jbGllbnRVaWQsIGNsaWVudC5jbGllbnRQaWQpOworICAgIEFMT0dEKCIlcyglcCh1aWQ9JWQsIHBpZD0lZCkpIiwgX19mdW5jX18sICZjbGllbnQsIGNsaWVudC5jbGllbnRVaWQsIGNsaWVudC5jbGllbnRQaWQpOwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgb3JpZ2luYWxIYW5kbGUgPSAgKmNsaWVudEhhbmRsZTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtTW1hcFN0cmVhbS0+c3RhcnQoY2xpZW50LCBjbGllbnRIYW5kbGUpOwogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChzdGF0dXMpOwotICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpzdGFydENsaWVudCgpICwgJWQgPT4gJWQgcmV0dXJucyAlZCIsCi0gICAgICAgICAgb3JpZ2luYWxIYW5kbGUsICpjbGllbnRIYW5kbGUsIHJlc3VsdCk7CisgICAgQUxPR0QoIiVzKCkgLCBwb3J0SGFuZGxlICVkID0+ICVkLCByZXR1cm5zICVkIiwgX19mdW5jX18sIG9yaWdpbmFsSGFuZGxlLCAqY2xpZW50SGFuZGxlLCByZXN1bHQpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpzdG9wQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgY2xpZW50SGFuZGxlKSB7CisgICAgQUxPR0QoIiVzKHBvcnRIYW5kbGUgPSAlZCksIGNhbGxlZCIsIF9fZnVuY19fLCBjbGllbnRIYW5kbGUpOwogICAgIGlmIChtTW1hcFN0cmVhbSA9PSBudWxscHRyKSByZXR1cm4gQUFVRElPX0VSUk9SX05VTEw7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KG1NbWFwU3RyZWFtLT5zdG9wKGNsaWVudEhhbmRsZSkpOwotICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpzdG9wQ2xpZW50KCVkKSByZXR1cm5zICVkIiwgY2xpZW50SGFuZGxlLCByZXN1bHQpOworICAgIEFMT0dEKCIlcyhwb3J0SGFuZGxlID0gJWQpLCByZXR1cm5zICVkIiwgX19mdW5jX18sIGNsaWVudEhhbmRsZSwgcmVzdWx0KTsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCkBAIC0yOTYsMTMgKzMzNCwxMyBAQAogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX05VTEw7CiAgICAgfQogICAgIHN0YXR1c190IHN0YXR1cyA9IG1NbWFwU3RyZWFtLT5nZXRNbWFwUG9zaXRpb24oJnBvc2l0aW9uKTsKLSAgICBBTE9HVigiQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6Z2V0RnJlZVJ1bm5pbmdQb3NpdGlvbigpIHN0YXR1cz0gJWQsIHBvcyA9ICVkLCBuYW5vcyA9ICVsbGRcbiIsCi0gICAgICAgICAgc3RhdHVzLCBwb3NpdGlvbi5wb3NpdGlvbl9mcmFtZXMsIChsb25nIGxvbmcpIHBvc2l0aW9uLnRpbWVfbmFub3NlY29uZHMpOworICAgIEFMT0dWKCIlcygpIHN0YXR1cz0gJWQsIHBvcyA9ICVkLCBuYW5vcyA9ICVsbGRcbiIsCisgICAgICAgICAgX19mdW5jX18sIHN0YXR1cywgcG9zaXRpb24ucG9zaXRpb25fZnJhbWVzLCAobG9uZyBsb25nKSBwb3NpdGlvbi50aW1lX25hbm9zZWNvbmRzKTsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzKTsKICAgICBpZiAocmVzdWx0ID09IEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSkgewotICAgICAgICBBTE9HVygic2VuZEN1cnJlbnRUaW1lc3RhbXAoKTogZ2V0TW1hcFBvc2l0aW9uKCkgaGFzIG5vIHBvc2l0aW9uIGRhdGEgYXZhaWxhYmxlIik7CisgICAgICAgIEFMT0dXKCIlcygpOiBnZXRNbWFwUG9zaXRpb24oKSBoYXMgbm8gcG9zaXRpb24gZGF0YSBhdmFpbGFibGUiLCBfX2Z1bmNfXyk7CiAgICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIEFMT0dFKCJzZW5kQ3VycmVudFRpbWVzdGFtcCgpOiBnZXRNbWFwUG9zaXRpb24oKSByZXR1cm5lZCBzdGF0dXMgJWQiLCBzdGF0dXMpOworICAgICAgICBBTE9HRSgiJXMoKTogZ2V0TW1hcFBvc2l0aW9uKCkgcmV0dXJuZWQgc3RhdHVzICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gQ29udmVydCAzMi1iaXQgcG9zaXRpb24gdG8gNjQtYml0IHBvc2l0aW9uLgogICAgICAgICBtRnJhbWVzVHJhbnNmZXJyZWQudXBkYXRlMzIocG9zaXRpb24ucG9zaXRpb25fZnJhbWVzKTsKQEAgLTMxNywxNyArMzU1LDI3IEBACiAgICAgcmV0dXJuIDA7IC8vIFRPRE8KIH0KIAotCi12b2lkIEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9uVGVhckRvd24oKSB7Ci0gICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9uVGVhckRvd24oKSBjYWxsZWQiKTsKLSAgICBkaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXMoKTsKKy8vIFRoaXMgaXMgY2FsbGVkIGJ5IEF1ZGlvRmxpbmdlciB3aGVuIGl0IHdhbnRzIHRvIGRlc3Ryb3kgYSBzdHJlYW0uCit2b2lkIEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9uVGVhckRvd24oYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SGFuZGxlKSB7CisgICAgQUxPR0QoIiVzKHBvcnRIYW5kbGUgPSAlZCkgY2FsbGVkIiwgX19mdW5jX18sIHBvcnRIYW5kbGUpOworICAgIC8vIEFyZSB3ZSB0ZWFyaW5nIGRvd24gdGhlIEVYQ0xVU0lWRSBNTUFQIHN0cmVhbT8KKyAgICBpZiAoaXNTdHJlYW1SZWdpc3RlcmVkKHBvcnRIYW5kbGUpKSB7CisgICAgICAgIEFMT0dEKCIlcyglZCkgdGVhcmluZyBkb3duIHRoaXMgZW50aXJlIE1NQVAgZW5kcG9pbnQiLCBfX2Z1bmNfXywgcG9ydEhhbmRsZSk7CisgICAgICAgIGRpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtcygpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIE11c3QgYmUgYSBTSEFSRUQgc3RyZWFtPworICAgICAgICBBTE9HRCgiJXMoJWQpIGRpc2Nvbm5lY3QgYSBzcGVjaWZpYyBzdHJlYW0iLCBfX2Z1bmNfXywgcG9ydEhhbmRsZSk7CisgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBtQUF1ZGlvU2VydmljZS5kaXNjb25uZWN0U3RyZWFtQnlQb3J0SGFuZGxlKHBvcnRIYW5kbGUpOworICAgICAgICBBTE9HRCgiJXMoJWQpIGRpc2Nvbm5lY3RTdHJlYW1CeVBvcnRIYW5kbGUgcmV0dXJuZWQgJWQiLCBfX2Z1bmNfXywgcG9ydEhhbmRsZSwgcmVzdWx0KTsKKyAgICB9CiB9OwogCiB2b2lkIEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9uVm9sdW1lQ2hhbmdlZChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpWZWN0b3I8ZmxvYXQ+IHZhbHVlcykgewotICAgIC8vIFRPRE8gZG8gd2UgcmVhbGx5IG5lZWQgYSBkaWZmZXJlbnQgdm9sdW1lIGZvciBlYWNoIGNoYW5uZWw/CisgICAgLy8gVE9ETyBEbyB3ZSByZWFsbHkgbmVlZCBhIGRpZmZlcmVudCB2b2x1bWUgZm9yIGVhY2ggY2hhbm5lbD8KKyAgICAvLyBXZSBnZXQgY2FsbGVkIHdpdGggYW4gYXJyYXkgZmlsbGVkIHdpdGggYSBzaW5nbGUgdmFsdWUhCiAgICAgZmxvYXQgdm9sdW1lID0gdmFsdWVzWzBdOwotICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpvblZvbHVtZUNoYW5nZWQoKSB2b2x1bWVbMF0gPSAlZiIsIHZvbHVtZSk7CisgICAgQUxPR0QoIiVzKCVwKSB2b2x1bWVbMF0gPSAlZiIsIF9fZnVuY19fLCB0aGlzLCB2b2x1bWUpOwogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrU3RyZWFtcyk7CiAgICAgZm9yKGNvbnN0IGF1dG8gc3RyZWFtIDogbVJlZ2lzdGVyZWRTdHJlYW1zKSB7CiAgICAgICAgIHN0cmVhbS0+b25Wb2x1bWVDaGFuZ2VkKHZvbHVtZSk7CkBAIC0zMzUsOCArMzgzLDcgQEAKIH07CiAKIHZvaWQgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6b25Sb3V0aW5nQ2hhbmdlZChhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSB7Ci0gICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9uUm91dGluZ0NoYW5nZWQoKSBjYWxsZWQgd2l0aCAlZCwgb2xkID0gJWQiLAotICAgICAgICAgIGRldmljZUlkLCBnZXREZXZpY2VJZCgpKTsKKyAgICBBTE9HRCgiJXMoJXApIGNhbGxlZCB3aXRoIGRldiAlZCwgb2xkID0gJWQiLCBfX2Z1bmNfXywgdGhpcywgZGV2aWNlSWQsIGdldERldmljZUlkKCkpOwogICAgIGlmIChnZXREZXZpY2VJZCgpICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUgICYmIGdldERldmljZUlkKCkgIT0gZGV2aWNlSWQpIHsKICAgICAgICAgZGlzY29ubmVjdFJlZ2lzdGVyZWRTdHJlYW1zKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5oCmluZGV4IDE2YjYyNjkuLjVlODE1ZTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmgKQEAgLTQyLDcgKzQyLDcgQEAKICAgICAgICAgLCBwdWJsaWMgYW5kcm9pZDo6TW1hcFN0cmVhbUNhbGxiYWNrIHsKIAogcHVibGljOgotICAgIEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAoKTsKKyAgICBleHBsaWNpdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQKGFuZHJvaWQ6OkFBdWRpb1NlcnZpY2UgJmF1ZGlvU2VydmljZSk7CiAKICAgICB2aXJ0dWFsIH5BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQKCk7CiAKQEAgLTY4LDcgKzY4LDcgQEAKICAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0VGltZXN0YW1wKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpIG92ZXJyaWRlOwogCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0gQ2FsbGJhY2sgZnVuY3Rpb25zIGZvciBNbWFwU3RyZWFtQ2FsbGJhY2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgdm9pZCBvblRlYXJEb3duKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblRlYXJEb3duKGF1ZGlvX3BvcnRfaGFuZGxlX3QgaGFuZGxlKSBvdmVycmlkZTsKIAogICAgIHZvaWQgb25Wb2x1bWVDaGFuZ2VkKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OlZlY3RvcjxmbG9hdD4gdmFsdWVzKSBvdmVycmlkZTsKQEAgLTg4LDggKzg4LDEyIEBACiAgICAgLy8gSW50ZXJmYWNlIHRvIHRoZSBBdWRpb0ZsaW5nZXIgTU1BUCBzdXBwb3J0LgogICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Ok1tYXBTdHJlYW1JbnRlcmZhY2U+IG1NbWFwU3RyZWFtOwogICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICAgICAgICAgICAgIG1NbWFwQnVmZmVyaW5mbzsKKworICAgIC8vIFRoZXJlIGlzIG9ubHkgb25lIHBvcnQgYXNzb2NpYXRlZCB3aXRoIGFuIE1NQVAgZW5kcG9pbnQuCiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgICAgICAgICAgICAgICAgICAgbVBvcnRIYW5kbGUgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogCisgICAgYW5kcm9pZDo6QUF1ZGlvU2VydmljZSAgICAgICAgICAgICAgICAgICAgJm1BQXVkaW9TZXJ2aWNlOworCiAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkICAgICAgICAgICAgICAgICAgbUF1ZGlvRGF0YUZpbGVEZXNjcmlwdG9yOwogCiAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhhcmR3YXJlVGltZU9mZnNldE5hbm9zID0gMDsgLy8gVE9ETyBnZXQgZnJvbSBIQUwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5jcHAKaW5kZXggOWIxODMzYS4uYTI3NDQ2NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5jcHAKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oIgorI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOyAgLy8gVE9ETyBqdXN0IGltcG9ydCBuYW1lcyBuZWVkZWQKIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87ICAgLy8gVE9ETyBqdXN0IGltcG9ydCBuYW1lcyBuZWVkZWQKQEAgLTQyLDEwICs0MywxMiBAQAogCiBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5OjpBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5KEFBdWRpb1NlcnZpY2UgJmF1ZGlvU2VydmljZSkKICAgICAgICAgOiBtU3RyZWFtSW50ZXJuYWxQbGF5KGF1ZGlvU2VydmljZSwgdHJ1ZSkgeworICAgIEFMT0dEKCIlcyglcCkgY3JlYXRlZCIsIF9fZnVuY19fLCB0aGlzKTsKICAgICBtU3RyZWFtSW50ZXJuYWwgPSAmbVN0cmVhbUludGVybmFsUGxheTsKIH0KIAogQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheTo6fkFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkoKSB7CisgICAgQUxPR0QoIiVzKCVwKSBkZXN0cm95ZWQiLCBfX2Z1bmNfXywgdGhpcyk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5OjpvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgewpAQCAtNjcsNiArNzAsNyBAQAogCiAvLyBNaXggZGF0YSBmcm9tIGVhY2ggYXBwbGljYXRpb24gc3RyZWFtIGFuZCB3cml0ZSByZXN1bHQgdG8gdGhlIHNoYXJlZCBNTUFQIHN0cmVhbS4KIHZvaWQgKkFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXk6OmNhbGxiYWNrTG9vcCgpIHsKKyAgICBBTE9HRCgiJXMoKSBlbnRlcmluZyA+Pj4+Pj4+Pj4+Pj4+Pj4gTUlYRVIiLCBfX2Z1bmNfXyk7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKICAgICBpbnQ2NF90IHRpbWVvdXROYW5vcyA9IGdldFN0cmVhbUludGVybmFsKCktPmNhbGN1bGF0ZVJlYXNvbmFibGVUaW1lb3V0KCk7CiAKQEAgLTgyLDkgKzg2LDEzIEBACiAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2tTdHJlYW1zKTsKICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byBjbGllbnRTdHJlYW0gOiBtUmVnaXN0ZXJlZFN0cmVhbXMpIHsKICAgICAgICAgICAgICAgICBpbnQ2NF90IGNsaWVudEZyYW1lc1JlYWQgPSAwOworICAgICAgICAgICAgICAgIGJvb2wgYWxsb3dVbmRlcmZsb3cgPSB0cnVlOwogCi0gICAgICAgICAgICAgICAgaWYgKCFjbGllbnRTdHJlYW0tPmlzUnVubmluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBzdGF0ZSA9IGNsaWVudFN0cmVhbS0+Z2V0U3RhdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORykgeworICAgICAgICAgICAgICAgICAgICBhbGxvd1VuZGVyZmxvdyA9IGZhbHNlOyAvLyBqdXN0IHJlYWQgd2hhdCBpcyBhbHJlYWR5IGluIHRoZSBGSUZPCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIHRoaXMgc3RyZWFtIGlzIG5vdCBydW5uaW5nIHNvIHNraXAgaXQuCiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZD4gc3RyZWFtU2hhcmVkID0KQEAgLTEwNCwxMCArMTEyLDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uT2Zmc2V0ID0gbW1hcEZyYW1lc1dyaXR0ZW4gLSBjbGllbnRGcmFtZXNSZWFkOwogICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtU2hhcmVkLT5zZXRUaW1lc3RhbXBQb3NpdGlvbk9mZnNldChwb3NpdGlvbk9mZnNldCk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSA9IDEuMDsgLy8gdG8gbWF0Y2ggbGVnYWN5IHZvbHVtZQotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1bmRlcmZsb3dlZCA9IG1NaXhlci5taXgoaW5kZXgsIGZpZm8sIHZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5kZXJmbG93ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TaGFyZWQtPmluY3JlbWVudFhSdW5Db3VudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZXNNaXhlZCA9IG1NaXhlci5taXgoaW5kZXgsIGZpZm8sIGFsbG93VW5kZXJmbG93KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbVNoYXJlZC0+aXNGbG93aW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zaWRlciBpdCBhbiB1bmRlcmZsb3cgaWYgd2UgZ290IGxlc3MgdGhhbiBhIGJ1cnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgdGhlIGRhdGEgc3RhcnRlZCBmbG93aW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdW5kZXJmbG93ZWQgPSBhbGxvd1VuZGVyZmxvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBmcmFtZXNNaXhlZCA8IG1NaXhlci5nZXRGcmFtZXNQZXJCdXJzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmRlcmZsb3dlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TaGFyZWQtPmluY3JlbWVudFhSdW5Db3VudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZnJhbWVzTWl4ZWQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFyayBiZWdpbm5pbmcgb2YgZGF0YSBmbG93IGFmdGVyIGEgc3RhcnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtU2hhcmVkLT5zZXRGbG93aW5nKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50RnJhbWVzUmVhZCA9IGZpZm8tPmdldFJlYWRDb3VudGVyKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTEzMiwxMSArMTQ5LDEzIEBACiAgICAgICAgICAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6OmRpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtcygpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ICE9IGdldEZyYW1lc1BlckJ1cnN0KCkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnQoKTogY2FsbGJhY2tMb29wKCkgd3JvdGUgJWQgLyAlZCIsCisgICAgICAgICAgICBBTE9HVygiY2FsbGJhY2tMb29wKCkgd3JvdGUgJWQgLyAlZCIsCiAgICAgICAgICAgICAgICAgICByZXN1bHQsIGdldEZyYW1lc1BlckJ1cnN0KCkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBBTE9HRCgiJXMoKSBleGl0aW5nLCBlbmFibGVkID0gJWQsIHN0YXRlID0gJWQsIHJlc3VsdCA9ICVkIDw8PDw8PDw8PDw8PDwgTUlYRVIiLAorICAgICAgICAgIF9fZnVuY19fLCBtQ2FsbGJhY2tFbmFibGVkLmxvYWQoKSwgZ2V0U3RyZWFtSW50ZXJuYWwoKS0+Z2V0U3RhdGUoKSwgcmVzdWx0KTsKICAgICByZXR1cm4gTlVMTDsgLy8gVE9ETyByZXZpZXcKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuY3BwCmluZGV4IGNkNDAwNjYuLjYzYjk5ODMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmNwcApAQCAtNDcsNiArNDcsNyBAQAogICAgICAgICAgICA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OnNldHcoOCkKICAgICAgICAgICAgPDwgc3RkOjpoZXggPDwgbVN0cmVhbUludGVybmFsLT5nZXRTZXJ2aWNlSGFuZGxlKCkKICAgICAgICAgICAgPDwgc3RkOjpkZWMgPDwgc3RkOjpzZXRmaWxsKCcgJyk7CisgICAgcmVzdWx0IDw8ICIsIFhSdW5zID0gIiA8PCBtU3RyZWFtSW50ZXJuYWwtPmdldFhSdW5Db3VudCgpOwogICAgIHJlc3VsdCA8PCAiXG4iOwogICAgIHJlc3VsdCA8PCAiICAgIFJ1bm5pbmcgU3RyZWFtIENvdW50OiAiIDw8IG1SdW5uaW5nU3RyZWFtQ291bnQgPDwgIlxuIjsKIApAQCAtNTksMTggKzYwLDE2IEBACiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKICAgICBjb25zdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uID0gcmVxdWVzdC5nZXRDb25zdGFudENvbmZpZ3VyYXRpb24oKTsKIAorICAgIGNvcHlGcm9tKGNvbmZpZ3VyYXRpb24pOwogICAgIG1SZXF1ZXN0ZWREZXZpY2VJZCA9IGNvbmZpZ3VyYXRpb24uZ2V0RGV2aWNlSWQoKTsKLSAgICBzZXREaXJlY3Rpb24oY29uZmlndXJhdGlvbi5nZXREaXJlY3Rpb24oKSk7CiAKICAgICBBdWRpb1N0cmVhbUJ1aWxkZXIgYnVpbGRlcjsKKyAgICBidWlsZGVyLmNvcHlGcm9tKGNvbmZpZ3VyYXRpb24pOworCiAgICAgYnVpbGRlci5zZXRTaGFyaW5nTW9kZShBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSk7CiAgICAgLy8gRG9uJ3QgZmFsbCBiYWNrIHRvIFNIQVJFRCBiZWNhdXNlIHRoYXQgd291bGQgY2F1c2UgcmVjdXJzaW9uLgogICAgIGJ1aWxkZXIuc2V0U2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkKHRydWUpOwotICAgIGJ1aWxkZXIuc2V0RGV2aWNlSWQobVJlcXVlc3RlZERldmljZUlkKTsKLSAgICBidWlsZGVyLnNldEZvcm1hdChjb25maWd1cmF0aW9uLmdldEZvcm1hdCgpKTsKLSAgICBidWlsZGVyLnNldFNhbXBsZVJhdGUoY29uZmlndXJhdGlvbi5nZXRTYW1wbGVSYXRlKCkpOwotICAgIGJ1aWxkZXIuc2V0U2FtcGxlc1BlckZyYW1lKGNvbmZpZ3VyYXRpb24uZ2V0U2FtcGxlc1BlckZyYW1lKCkpOwotICAgIGJ1aWxkZXIuc2V0RGlyZWN0aW9uKGNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0aW9uKCkpOworCiAgICAgYnVpbGRlci5zZXRCdWZmZXJDYXBhY2l0eShERUZBVUxUX0JVRkZFUl9DQVBBQ0lUWSk7CiAKICAgICByZXN1bHQgPSBtU3RyZWFtSW50ZXJuYWwtPm9wZW4oYnVpbGRlcik7CkBAIC03OCw2ICs3Nyw3IEBACiAgICAgc2V0U2FtcGxlUmF0ZShtU3RyZWFtSW50ZXJuYWwtPmdldFNhbXBsZVJhdGUoKSk7CiAgICAgc2V0U2FtcGxlc1BlckZyYW1lKG1TdHJlYW1JbnRlcm5hbC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpOwogICAgIHNldERldmljZUlkKG1TdHJlYW1JbnRlcm5hbC0+Z2V0RGV2aWNlSWQoKSk7CisgICAgc2V0U2Vzc2lvbklkKG1TdHJlYW1JbnRlcm5hbC0+Z2V0U2Vzc2lvbklkKCkpOwogICAgIG1GcmFtZXNQZXJCdXJzdCA9IG1TdHJlYW1JbnRlcm5hbC0+Z2V0RnJhbWVzUGVyQnVyc3QoKTsKIAogICAgIHJldHVybiByZXN1bHQ7CkBAIC04OCwxMyArODgsMjIgQEAKIH0KIAogLy8gR2x1ZSBiZXR3ZWVuIEMgYW5kIEMrKyBjYWxsYmFja3MuCi1zdGF0aWMgdm9pZCAqYWF1ZGlvX2VuZHBvaW50X3RocmVhZF9wcm9jKHZvaWQgKmNvbnRleHQpIHsKLSAgICBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQgKmVuZHBvaW50ID0gKEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZCAqKSBjb250ZXh0OwotICAgIGlmIChlbmRwb2ludCAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlbmRwb2ludC0+Y2FsbGJhY2tMb29wKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CitzdGF0aWMgdm9pZCAqYWF1ZGlvX2VuZHBvaW50X3RocmVhZF9wcm9jKHZvaWQgKmFyZykgeworICAgIGFzc2VydChhcmcgIT0gbnVsbHB0cik7CisKKyAgICAvLyBUaGUgY2FsbGVyIHBhc3NlZCBpbiBhIHNtYXJ0IHBvaW50ZXIgdG8gcHJldmVudCB0aGUgZW5kcG9pbnQgZnJvbSBnZXR0aW5nIGRlbGV0ZWQKKyAgICAvLyB3aGlsZSB0aGUgdGhyZWFkIHdhcyBsYXVuY2hpbmcuCisgICAgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkPiAqZW5kcG9pbnRGb3JUaHJlYWQgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8QUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkPiAqPihhcmcpOworICAgIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZD4gZW5kcG9pbnQgPSAqZW5kcG9pbnRGb3JUaHJlYWQ7CisgICAgZGVsZXRlIGVuZHBvaW50Rm9yVGhyZWFkOyAvLyBKdXN0IHVzZSBzY29wZWQgc21hcnQgcG9pbnRlci4gRG9uJ3QgbmVlZCB0aGlzIGFueW1vcmUuCisgICAgdm9pZCAqcmVzdWx0ID0gZW5kcG9pbnQtPmNhbGxiYWNrTG9vcCgpOworICAgIC8vIENsb3NlIG5vdyBzbyB0aGF0IHRoZSBIVyByZXNvdXJjZSBpcyBmcmVlZCBhbmQgd2UgY2FuIG9wZW4gYSBuZXcgZGV2aWNlLgorICAgIGlmICghZW5kcG9pbnQtPmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgZW5kcG9pbnQtPmNsb3NlKCk7CiAgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IGFhdWRpbzo6QUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkOjpzdGFydFNoYXJpbmdUaHJlYWRfbCgpIHsKQEAgLTEwMyw3ICsxMTIsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBQVVESU9fTkFOT1NfUEVSX1NFQ09ORAogICAgICAgICAgICAgICAgICAgICAgICAgICAvIGdldFNhbXBsZVJhdGUoKTsKICAgICBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKHRydWUpOwotICAgIHJldHVybiBnZXRTdHJlYW1JbnRlcm5hbCgpLT5jcmVhdGVUaHJlYWQocGVyaW9kTmFub3MsIGFhdWRpb19lbmRwb2ludF90aHJlYWRfcHJvYywgdGhpcyk7CisgICAgLy8gUGFzcyBhIHNtYXJ0IHBvaW50ZXIgc28gdGhlIHRocmVhZCBjYW4gaG9sZCBhIHJlZmVyZW5jZS4KKyAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ+ICplbmRwb2ludEZvclRocmVhZCA9IG5ldyBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ+KHRoaXMpOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBnZXRTdHJlYW1JbnRlcm5hbCgpLT5jcmVhdGVUaHJlYWQocGVyaW9kTmFub3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fZW5kcG9pbnRfdGhyZWFkX3Byb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludEZvclRocmVhZCk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgLy8gVGhlIHRocmVhZCBjYW4ndCBkZWxldGUgaXQgc28gd2UgaGF2ZSB0byBkbyBpdCBoZXJlLgorICAgICAgICBkZWxldGUgZW5kcG9pbnRGb3JUaHJlYWQ7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBhYXVkaW86OkFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6c3RvcFNoYXJpbmdUaHJlYWQoKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCmluZGV4IGUzYmQyYzEuLmQ2NzE3MTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCkBAIC0zMCw4ICszMCw3IEBACiBuYW1lc3BhY2UgYWF1ZGlvIHsKIAogLyoqCi0gKiBUaGlzIFNlcnZpY2UgY2xhc3MgY29ycmVzcG9uZHMgdG8gYSBDbGllbnQgc3RyZWFtIHRoYXQgc2hhcmVzIGFuIE1NQVAgZGV2aWNlIHRocm91Z2ggYSBtaXhlcgotICogb3IgYW4gaW5wdXQgZGlzdHJpYnV0b3IuCisgKiBUaGlzIG1hbmFnZXMgYW4gQXVkaW9TdHJlYW1JbnRlcm5hbCB0aGF0IGlzIHNoYXJlZCBieSBtdWx0aXBsZSBDbGllbnQgc3RyZWFtcy4KICAqLwogY2xhc3MgQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkIDogcHVibGljIEFBdWRpb1NlcnZpY2VFbmRwb2ludCB7CiAKQEAgLTU1LDEyICs1NCwxMyBAQAogCiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgKmNhbGxiYWNrTG9vcCgpID0gMDsKIAorCitwcm90ZWN0ZWQ6CisKICAgICBBdWRpb1N0cmVhbUludGVybmFsICpnZXRTdHJlYW1JbnRlcm5hbCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1TdHJlYW1JbnRlcm5hbDsKICAgICB9OwogCi1wcm90ZWN0ZWQ6Ci0KICAgICBhYXVkaW9fcmVzdWx0X3QgICAgICAgICAgc3RhcnRTaGFyaW5nVGhyZWFkX2woKTsKIAogICAgIGFhdWRpb19yZXN1bHRfdCAgICAgICAgICBzdG9wU2hhcmluZ1RocmVhZCgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwCmluZGV4IGQ5Yjg3NjYuLjQ4ZDgwMDIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5jcHAKQEAgLTQyLDcgKzQyLDcgQEAKIAogQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlKEFBdWRpb1NlcnZpY2UgJmF1ZGlvU2VydmljZSkKICAgICAgICAgOiBtVXBNZXNzYWdlUXVldWUobnVsbHB0cikKLSAgICAgICAgLCBtVGltZXN0YW1wVGhyZWFkKCkKKyAgICAgICAgLCBtVGltZXN0YW1wVGhyZWFkKCJBQVRpbWUiKQogICAgICAgICAsIG1BdG9taWNUaW1lc3RhbXAoKQogICAgICAgICAsIG1BdWRpb1NlcnZpY2UoYXVkaW9TZXJ2aWNlKSB7CiAgICAgbU1tYXBDbGllbnQuY2xpZW50VWlkID0gLTE7CkBAIC01MSw3ICs1MSw3IEBACiB9CiAKIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjp+QUF1ZGlvU2VydmljZVN0cmVhbUJhc2UoKSB7Ci0gICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjp+QUF1ZGlvU2VydmljZVN0cmVhbUJhc2UoKSBkZXN0cm95aW5nICVwIiwgdGhpcyk7CisgICAgQUxPR0QoIn5BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSgpIGRlc3Ryb3lpbmcgJXAiLCB0aGlzKTsKICAgICAvLyBJZiB0aGUgc3RyZWFtIGlzIGRlbGV0ZWQgd2hlbiBPUEVOIG9yIGluIHVzZSB0aGVuIGF1ZGlvIHJlc291cmNlcyB3aWxsIGxlYWsuCiAgICAgLy8gVGhpcyB3b3VsZCBpbmRpY2F0ZSBhbiBpbnRlcm5hbCBlcnJvci4gU28gd2Ugd2FudCB0byBmaW5kIHRoaXMgQVNBUC4KICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCEoZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRApAQCAtNjEsNyArNjEsNyBAQAogfQogCiBzdGQ6OnN0cmluZyBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6ZHVtcEhlYWRlcigpIHsKLSAgICByZXR1cm4gc3RkOjpzdHJpbmcoIiAgICBUICAgSGFuZGxlICAgVUlkIFJ1biBTdGF0ZSBGb3JtYXQgQnVyc3QgQ2hhbiBDYXBhY2l0eSIpOworICAgIHJldHVybiBzdGQ6OnN0cmluZygiICAgIFQgICBIYW5kbGUgICBVSWQgICBQb3J0IFJ1biBTdGF0ZSBGb3JtYXQgQnVyc3QgQ2hhbiBDYXBhY2l0eSIpOwogfQogCiBzdGQ6OnN0cmluZyBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6ZHVtcCgpIGNvbnN0IHsKQEAgLTcwLDYgKzcwLDcgQEAKICAgICByZXN1bHQgPDwgIiAgICAweCIgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KDgpIDw8IHN0ZDo6aGV4IDw8IG1IYW5kbGUKICAgICAgICAgICAgPDwgc3RkOjpkZWMgPDwgc3RkOjpzZXRmaWxsKCcgJykgOwogICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoNikgPDwgbU1tYXBDbGllbnQuY2xpZW50VWlkOworICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoNykgPDwgbUNsaWVudEhhbmRsZTsKICAgICByZXN1bHQgPDwgc3RkOjpzZXR3KDQpIDw8IChpc1J1bm5pbmcoKSA/ICJ5ZXMiIDogIiBubyIpOwogICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoNikgPDwgZ2V0U3RhdGUoKTsKICAgICByZXN1bHQgPDwgc3RkOjpzZXR3KDcpIDw8IGdldEZvcm1hdCgpOwpAQCAtOTMsNyArOTQsNyBAQAogICAgIHsKICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVwTWVzc2FnZVF1ZXVlTG9jayk7CiAgICAgICAgIGlmIChtVXBNZXNzYWdlUXVldWUgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKCkgY2FsbGVkIHR3aWNlIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoKSBjYWxsZWQgdHdpY2UiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgICAgIH0KIApAQCAtMTExLDcgKzExMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmluZ01vZGUpOwogICAgICAgICBpZiAobVNlcnZpY2VFbmRwb2ludCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om9wZW4oKSBvcGVuRW5kcG9pbnQoKSBmYWlsZWQiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpIG9wZW5FbmRwb2ludCgpIGZhaWxlZCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KQEAgLTE0OCw3ICsxNDksNiBAQAogICAgICAgICBtU2VydmljZUVuZHBvaW50LmNsZWFyKCk7IC8vIGVuZHBvaW50IHdpbGwgaG9sZCB0aGUgcG9pbnRlciB1bnRpbCB0aGlzIG1ldGhvZCByZXR1cm5zLgogICAgIH0KIAotCiAgICAgewogICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXBNZXNzYWdlUXVldWVMb2NrKTsKICAgICAgICAgc3RvcFRpbWVzdGFtcFRocmVhZCgpOwpAQCAtMTgyLDYgKzE4Miw4IEBACiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CiAgICAgfQogCisgICAgc2V0Rmxvd2luZyhmYWxzZSk7CisKICAgICAvLyBTdGFydCB3aXRoIGZyZXNoIHByZXNlbnRhdGlvbiB0aW1lc3RhbXBzLgogICAgIG1BdG9taWNUaW1lc3RhbXAuY2xlYXIoKTsKIApAQCAtMjI2LDcgKzIyOCw3IEBACiAgICAgfQogICAgIHJlc3VsdCA9IGVuZHBvaW50LT5zdG9wU3RyZWFtKHRoaXMsIG1DbGllbnRIYW5kbGUpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpwYXVzZSgpIG1TZXJ2aWNlRW5kcG9pbnQgcmV0dXJuZWQgJWQiLCByZXN1bHQpOworICAgICAgICBBTE9HRSgiJXMoKSBtU2VydmljZUVuZHBvaW50IHJldHVybmVkICVkLCAlcyIsIF9fZnVuY19fLCByZXN1bHQsIGdldFR5cGVUZXh0KCkpOwogICAgICAgICBkaXNjb25uZWN0KCk7IC8vIFRPRE8gc2hvdWxkIHdlIHJldHVybiBvciBwYXVzZSBCYXNlIGZpcnN0PwogICAgIH0KIApAQCAtMjQxLDYgKzI0Myw4IEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCisgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORyk7CisKICAgICAvLyBTZW5kIGl0IG5vdyBiZWNhdXNlIHRoZSB0aW1lc3RhbXAgZ2V0cyByb3VuZGVkIHVwIHdoZW4gc3RvcFN0cmVhbSgpIGlzIGNhbGxlZCBiZWxvdy4KICAgICAvLyBBbHNvIHdlIGRvbid0IG5lZWQgdGhlIHRpbWVzdGFtcHMgd2hpbGUgd2UgYXJlIHNodXR0aW5nIGRvd24uCiAgICAgc2VuZEN1cnJlbnRUaW1lc3RhbXAoKTsgLy8gd2FybmluZyAtIHRoaXMgY2FsbHMgYSB2aXJ0dWFsIGZ1bmN0aW9uCkBAIC0yNTgsNyArMjYyLDcgQEAKICAgICAvLyBUT0RPIHdhaXQgZm9yIGRhdGEgdG8gYmUgcGxheWVkIG91dAogICAgIHJlc3VsdCA9IGVuZHBvaW50LT5zdG9wU3RyZWFtKHRoaXMsIG1DbGllbnRIYW5kbGUpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpzdG9wKCkgbVNlcnZpY2VFbmRwb2ludCByZXR1cm5lZCAlZCIsIHJlc3VsdCk7CisgICAgICAgIEFMT0dFKCIlcygpIHN0b3BTdHJlYW0gcmV0dXJuZWQgJWQsICVzIiwgX19mdW5jX18sIHJlc3VsdCwgZ2V0VHlwZVRleHQoKSk7CiAgICAgICAgIGRpc2Nvbm5lY3QoKTsKICAgICAgICAgLy8gVE9ETyB3aGF0IHRvIGRvIHdpdGggcmVzdWx0IGhlcmU/CiAgICAgfQpAQCAtMjc4LDExICsyODIsMTEgQEAKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpmbHVzaCgpIHsKLSAgICBpZiAoZ2V0U3RhdGUoKSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNFRCkgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmZsdXNoKCkgc3RyZWFtIG5vdCBwYXVzZWQsIHN0YXRlID0gJXMiLAotICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KG1TdGF0ZSkpOwotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb19pc0ZsdXNoQWxsb3dlZChnZXRTdGF0ZSgpKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KKwogICAgIC8vIERhdGEgd2lsbCBnZXQgZmx1c2hlZCB3aGVuIHRoZSBjbGllbnQgcmVjZWl2ZXMgdGhlIEZMVVNIRUQgZXZlbnQuCiAgICAgc2VuZFNlcnZpY2VFdmVudChBQVVESU9fU0VSVklDRV9FVkVOVF9GTFVTSEVEKTsKICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNIRUQpOwpAQCAtMjkxLDcgKzI5NSw3IEBACiAKIC8vIGltcGxlbWVudCBSdW5uYWJsZSwgcGVyaW9kaWNhbGx5IHNlbmQgdGltZXN0YW1wcyB0byBjbGllbnQKIHZvaWQgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnJ1bigpIHsKLSAgICBBTE9HRCgiQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnJ1bigpIGVudGVyaW5nIC0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICBBTE9HRCgiJXMoKSAlcyBlbnRlcmluZyA+Pj4+Pj4+Pj4+Pj4+PiBUSU1FU1RBTVBTIiwgX19mdW5jX18sIGdldFR5cGVUZXh0KCkpOwogICAgIFRpbWVzdGFtcFNjaGVkdWxlciB0aW1lc3RhbXBTY2hlZHVsZXI7CiAgICAgdGltZXN0YW1wU2NoZWR1bGVyLnNldEJ1cnN0UGVyaW9kKG1GcmFtZXNQZXJCdXJzdCwgZ2V0U2FtcGxlUmF0ZSgpKTsKICAgICB0aW1lc3RhbXBTY2hlZHVsZXIuc3RhcnQoQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSk7CkBAIC0zMDksNyArMzEzLDcgQEAKICAgICAgICAgICAgIEF1ZGlvQ2xvY2s6OnNsZWVwVW50aWxOYW5vVGltZShuZXh0VGltZSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpydW4oKSBleGl0aW5nIC0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICBBTE9HRCgiJXMoKSAlcyBleGl0aW5nIDw8PDw8PDw8PDw8PDw8IFRJTUVTVEFNUFMiLCBfX2Z1bmNfXywgZ2V0VHlwZVRleHQoKSk7CiB9CiAKIHZvaWQgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmRpc2Nvbm5lY3QoKSB7CkBAIC0zMjAsMTIgKzMyNCwxOSBAQAogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnNlbmRTZXJ2aWNlRXZlbnQoYWF1ZGlvX3NlcnZpY2VfZXZlbnRfdCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICBkYXRhRG91YmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRhdGFMb25nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICBkYXRhRG91YmxlKSB7CiAgICAgQUF1ZGlvU2VydmljZU1lc3NhZ2UgY29tbWFuZDsKICAgICBjb21tYW5kLndoYXQgPSBBQXVkaW9TZXJ2aWNlTWVzc2FnZTo6Y29kZTo6RVZFTlQ7CiAgICAgY29tbWFuZC5ldmVudC5ldmVudCA9IGV2ZW50OwogICAgIGNvbW1hbmQuZXZlbnQuZGF0YURvdWJsZSA9IGRhdGFEb3VibGU7CisgICAgcmV0dXJuIHdyaXRlVXBNZXNzYWdlUXVldWUoJmNvbW1hbmQpOworfQorCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnNlbmRTZXJ2aWNlRXZlbnQoYWF1ZGlvX3NlcnZpY2VfZXZlbnRfdCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRhdGFMb25nKSB7CisgICAgQUF1ZGlvU2VydmljZU1lc3NhZ2UgY29tbWFuZDsKKyAgICBjb21tYW5kLndoYXQgPSBBQXVkaW9TZXJ2aWNlTWVzc2FnZTo6Y29kZTo6RVZFTlQ7CisgICAgY29tbWFuZC5ldmVudC5ldmVudCA9IGV2ZW50OwogICAgIGNvbW1hbmQuZXZlbnQuZGF0YUxvbmcgPSBkYXRhTG9uZzsKICAgICByZXR1cm4gd3JpdGVVcE1lc3NhZ2VRdWV1ZSgmY29tbWFuZCk7CiB9CkBAIC0zMzMsMjUgKzM0NCwyOSBAQAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjp3cml0ZVVwTWVzc2FnZVF1ZXVlKEFBdWRpb1NlcnZpY2VNZXNzYWdlICpjb21tYW5kKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVwTWVzc2FnZVF1ZXVlTG9jayk7CiAgICAgaWYgKG1VcE1lc3NhZ2VRdWV1ZSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJ3cml0ZVVwTWVzc2FnZVF1ZXVlKCk6IG1VcE1lc3NhZ2VRdWV1ZSBudWxsISAtIHN0cmVhbSBub3Qgb3BlbiIpOworICAgICAgICBBTE9HRSgiJXMoKTogbVVwTWVzc2FnZVF1ZXVlIG51bGwhIC0gc3RyZWFtIG5vdCBvcGVuIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX05VTEw7CiAgICAgfQogICAgIGludDMyX3QgY291bnQgPSBtVXBNZXNzYWdlUXVldWUtPmdldEZpZm9CdWZmZXIoKS0+d3JpdGUoY29tbWFuZCwgMSk7CiAgICAgaWYgKGNvdW50ICE9IDEpIHsKLSAgICAgICAgQUxPR0UoIndyaXRlVXBNZXNzYWdlUXVldWUoKTogUXVldWUgZnVsbC4gRGlkIGNsaWVudCBkaWU/Iik7CisgICAgICAgIEFMT0dFKCIlcygpOiBRdWV1ZSBmdWxsLiBEaWQgY2xpZW50IGRpZT8gJXMiLCBfX2Z1bmNfXywgZ2V0VHlwZVRleHQoKSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfV09VTERfQkxPQ0s7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKICAgICB9CiB9CiAKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6c2VuZFhSdW5Db3VudChpbnQzMl90IHhSdW5Db3VudCkgeworICAgIHJldHVybiBzZW5kU2VydmljZUV2ZW50KEFBVURJT19TRVJWSUNFX0VWRU5UX1hSVU4sIChpbnQ2NF90KSB4UnVuQ291bnQpOworfQorCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnNlbmRDdXJyZW50VGltZXN0YW1wKCkgewogICAgIEFBdWRpb1NlcnZpY2VNZXNzYWdlIGNvbW1hbmQ7CiAgICAgLy8gU2VuZCBhIHRpbWVzdGFtcCBmb3IgdGhlIGNsb2NrIG1vZGVsLgogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKCZjb21tYW5kLnRpbWVzdGFtcC5wb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tbWFuZC50aW1lc3RhbXAudGltZXN0YW1wKTsKICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgewotICAgICAgICBBTE9HVigic2VuZEN1cnJlbnRUaW1lc3RhbXAoKSBTRVJWSUNFICAlOGxsZCBhdCAlbGxkIiwKKyAgICAgICAgQUxPR1YoIiVzKCkgU0VSVklDRSAgJThsbGQgYXQgJWxsZCIsIF9fZnVuY19fLAogICAgICAgICAgICAgICAobG9uZyBsb25nKSBjb21tYW5kLnRpbWVzdGFtcC5wb3NpdGlvbiwKICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgY29tbWFuZC50aW1lc3RhbXAudGltZXN0YW1wKTsKICAgICAgICAgY29tbWFuZC53aGF0ID0gQUF1ZGlvU2VydmljZU1lc3NhZ2U6OmNvZGU6OlRJTUVTVEFNUF9TRVJWSUNFOwpAQCAtMzYyLDcgKzM3Nyw3IEBACiAgICAgICAgICAgICByZXN1bHQgPSBnZXRIYXJkd2FyZVRpbWVzdGFtcCgmY29tbWFuZC50aW1lc3RhbXAucG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tbWFuZC50aW1lc3RhbXAudGltZXN0YW1wKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInNlbmRDdXJyZW50VGltZXN0YW1wKCkgSEFSRFdBUkUgJThsbGQgYXQgJWxsZCIsCisgICAgICAgICAgICAgICAgQUxPR1YoIiVzKCkgSEFSRFdBUkUgJThsbGQgYXQgJWxsZCIsIF9fZnVuY19fLAogICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIGNvbW1hbmQudGltZXN0YW1wLnBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIGNvbW1hbmQudGltZXN0YW1wLnRpbWVzdGFtcCk7CiAgICAgICAgICAgICAgICAgY29tbWFuZC53aGF0ID0gQUF1ZGlvU2VydmljZU1lc3NhZ2U6OmNvZGU6OlRJTUVTVEFNUF9IQVJEV0FSRTsKQEAgLTM4NSw3ICs0MDAsNyBAQAogICAgIHsKICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVwTWVzc2FnZVF1ZXVlTG9jayk7CiAgICAgICAgIGlmIChtVXBNZXNzYWdlUXVldWUgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0UoImdldERlc2NyaXB0aW9uKCk6IG1VcE1lc3NhZ2VRdWV1ZSBudWxsISAtIHN0cmVhbSBub3Qgb3BlbiIpOworICAgICAgICAgICAgQUxPR0UoIiVzKCk6IG1VcE1lc3NhZ2VRdWV1ZSBudWxsISAtIHN0cmVhbSBub3Qgb3BlbiIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfTlVMTDsKICAgICAgICAgfQogICAgICAgICAvLyBHYXRoZXIgaW5mb3JtYXRpb24gb24gdGhlIG1lc3NhZ2UgcXVldWUuCkBAIC0zOTgsMyArNDEzLDEzIEBACiB2b2lkIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvblZvbHVtZUNoYW5nZWQoZmxvYXQgdm9sdW1lKSB7CiAgICAgc2VuZFNlcnZpY2VFdmVudChBQVVESU9fU0VSVklDRV9FVkVOVF9WT0xVTUUsIHZvbHVtZSk7CiB9CisKK2ludDMyX3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmluY3JlbWVudFNlcnZpY2VSZWZlcmVuY2VDb3VudCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ2FsbGluZ0NvdW50TG9jayk7CisgICAgcmV0dXJuICsrbUNhbGxpbmdDb3VudDsKK30KKworaW50MzJfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6ZGVjcmVtZW50U2VydmljZVJlZmVyZW5jZUNvdW50KCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1DYWxsaW5nQ291bnRMb2NrKTsKKyAgICByZXR1cm4gLS1tQ2FsbGluZ0NvdW50OworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgKaW5kZXggODE1YjFjYy4uMGFkMDE1ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oCkBAIC01NSw3ICs1NSw3IEBACiAgICAgLCBwdWJsaWMgUnVubmFibGUgIHsKIAogcHVibGljOgotICAgIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlKGFuZHJvaWQ6OkFBdWRpb1NlcnZpY2UgJmFBdWRpb1NlcnZpY2UpOworICAgIGV4cGxpY2l0IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlKGFuZHJvaWQ6OkFBdWRpb1NlcnZpY2UgJmFBdWRpb1NlcnZpY2UpOwogCiAgICAgdmlydHVhbCB+QUF1ZGlvU2VydmljZVN0cmVhbUJhc2UoKTsKIApAQCAtMTI5LDExICsxMjksMTUgQEAKICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICAgICAvKioKLSAgICAgKiBTZW5kIGEgbWVzc2FnZSB0byB0aGUgY2xpZW50LgorICAgICAqIFNlbmQgYSBtZXNzYWdlIHRvIHRoZSBjbGllbnQgd2l0aCBhbiBpbnQ2NF90IGRhdGEgdmFsdWUuCiAgICAgICovCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHNlbmRTZXJ2aWNlRXZlbnQoYWF1ZGlvX3NlcnZpY2VfZXZlbnRfdCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgIGRhdGFEb3VibGUgPSAwLjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkYXRhTG9uZyA9IDApOworICAgIC8qKgorICAgICAqIFNlbmQgYSBtZXNzYWdlIHRvIHRoZSBjbGllbnQgd2l0aCBhbiBkb3VibGUgZGF0YSB2YWx1ZS4KKyAgICAgKi8KKyAgICBhYXVkaW9fcmVzdWx0X3Qgc2VuZFNlcnZpY2VFdmVudChhYXVkaW9fc2VydmljZV9ldmVudF90IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgZGF0YURvdWJsZSk7CiAKICAgICAvKioKICAgICAgKiBGaWxsIGluIGEgcGFyY2VsYWJsZSBkZXNjcmlwdGlvbiBvZiBzdHJlYW0uCkBAIC0xNzYsMTIgKzE4MCw1MSBAQAogICAgICAgICBtSGFuZGxlID0gaGFuZGxlOwogICAgIH0KIAorICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0UG9ydEhhbmRsZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DbGllbnRIYW5kbGU7CisgICAgfQorCiAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IGdldFN0YXRlKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbVN0YXRlOwogICAgIH0KIAogICAgIHZvaWQgb25Wb2x1bWVDaGFuZ2VkKGZsb2F0IHZvbHVtZSk7CiAKKyAgICAvKioKKyAgICAgKiBTZXQgZmFsc2Ugd2hlbiB0aGUgc3RyZWFtIGlzIHN0YXJ0ZWQuCisgICAgICogU2V0IHRydWUgd2hlbiBkYXRhIGlzIGZpcnN0IHJlYWQgZnJvbSB0aGUgc3RyZWFtLgorICAgICAqIEBwYXJhbSBiCisgICAgICovCisgICAgdm9pZCBzZXRGbG93aW5nKGJvb2wgYikgeworICAgICAgICBtRmxvd2luZyA9IGI7CisgICAgfQorCisgICAgYm9vbCBpc0Zsb3dpbmcoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRmxvd2luZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdG9taWNhbGx5IGluY3JlbWVudCB0aGUgbnVtYmVyIG9mIGFjdGl2ZSByZWZlcmVuY2VzIHRvIHRoZSBzdHJlYW0gYnkgQUF1ZGlvU2VydmljZS4KKyAgICAgKiBAcmV0dXJuIHZhbHVlIGFmdGVyIHRoZSBpbmNyZW1lbnQKKyAgICAgKi8KKyAgICBpbnQzMl90IGluY3JlbWVudFNlcnZpY2VSZWZlcmVuY2VDb3VudCgpOworCisgICAgLyoqCisgICAgICogQXRvbWljYWxseSBkZWNyZW1lbnQgdGhlIG51bWJlciBvZiBhY3RpdmUgcmVmZXJlbmNlcyB0byB0aGUgc3RyZWFtIGJ5IEFBdWRpb1NlcnZpY2UuCisgICAgICogQHJldHVybiB2YWx1ZSBhZnRlciB0aGUgZGVjcmVtZW50CisgICAgICovCisgICAgaW50MzJfdCBkZWNyZW1lbnRTZXJ2aWNlUmVmZXJlbmNlQ291bnQoKTsKKworICAgIGJvb2wgaXNDbG9zZU5lZWRlZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DbG9zZU5lZWRlZC5sb2FkKCk7CisgICAgfQorCisgICAgdm9pZCBzZXRDbG9zZU5lZWRlZChib29sIG5lZWRlZCkgeworICAgICAgICBtQ2xvc2VOZWVkZWQuc3RvcmUobmVlZGVkKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldFR5cGVUZXh0KCkgY29uc3QgeyByZXR1cm4gIkJhc2UiOyB9CisKIHByb3RlY3RlZDoKIAogICAgIC8qKgpAQCAtMjA0LDYgKzI0Nyw4IEBACiAKICAgICBhYXVkaW9fcmVzdWx0X3Qgc2VuZEN1cnJlbnRUaW1lc3RhbXAoKTsKIAorICAgIGFhdWRpb19yZXN1bHRfdCBzZW5kWFJ1bkNvdW50KGludDMyX3QgeFJ1bkNvdW50KTsKKwogICAgIC8qKgogICAgICAqIEBwYXJhbSBwb3NpdGlvbkZyYW1lcwogICAgICAqIEBwYXJhbSB0aW1lTmFub3MKQEAgLTIyOCw2ICsyNzMsNyBAQAogCiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbUZyYW1lc1BlckJ1cnN0ID0gMDsKICAgICBhbmRyb2lkOjpBdWRpb0NsaWVudCAgICBtTW1hcENsaWVudDsgLy8gc2V0IGluIG9wZW4sIHVzZWQgaW4gTU1BUCBzdGFydCgpCisgICAgLy8gVE9ETyByZW5hbWUgbUNsaWVudEhhbmRsZSB0byBtUG9ydEhhbmRsZSB0byBiZSBtb3JlIGNvbnNpc3RlbnQgd2l0aCBBdWRpb0ZsaW5nZXIuCiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbUNsaWVudEhhbmRsZSA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAKICAgICBTaW1wbGVEb3VibGVCdWZmZXI8VGltZXN0YW1wPiAgbUF0b21pY1RpbWVzdGFtcDsKQEAgLTI0Miw2ICsyODgsMTEgQEAKIAogcHJpdmF0ZToKICAgICBhYXVkaW9faGFuZGxlX3QgICAgICAgICBtSGFuZGxlID0gLTE7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbUZsb3dpbmcgPSBmYWxzZTsKKworICAgIHN0ZDo6bXV0ZXggICAgICAgICAgICAgIG1DYWxsaW5nQ291bnRMb2NrOworICAgIHN0ZDo6YXRvbWljPGludDMyX3Q+ICAgIG1DYWxsaW5nQ291bnR7MH07CisgICAgc3RkOjphdG9taWM8Ym9vbD4gICAgICAgbUNsb3NlTmVlZGVke2ZhbHNlfTsKIH07CiAKIH0gLyogbmFtZXNwYWNlIGFhdWRpbyAqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuY3BwCmluZGV4IDJlN2ZmOGIuLmM4NDUzMDkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5jcHAKQEAgLTg2LDkgKzg2LDcgQEAKICAgICByZXR1cm4gQUFVRElPX09LOwogfQogCi0vKioKLSAqIFN0YXJ0IHRoZSBmbG93IG9mIGRhdGEuCi0gKi8KKy8vIFN0YXJ0IHRoZSBmbG93IG9mIGRhdGEuCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbU1NQVA6OnN0YXJ0RGV2aWNlKCkgewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6c3RhcnREZXZpY2UoKTsKICAgICBpZiAoIW1JblNlcnZpY2UgJiYgcmVzdWx0ID09IEFBVURJT19PSykgewpAQCAtOTgsOSArOTYsNyBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLS8qKgotICogU3RvcCB0aGUgZmxvdyBvZiBkYXRhIHN1Y2ggdGhhdCBzdGFydCgpIGNhbiByZXN1bWUgd2l0aCBsb3NzIG9mIGRhdGEuCi0gKi8KKy8vIFN0b3AgdGhlIGZsb3cgb2YgZGF0YSBzdWNoIHRoYXQgc3RhcnQoKSBjYW4gcmVzdW1lIHdpdGggbG9zcyBvZiBkYXRhLgogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpwYXVzZSgpIHsKICAgICBpZiAoIWlzUnVubmluZygpKSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CkBAIC0xOTMsOSArMTg5LDcgQEAKICAgICB9CiB9CiAKLS8qKgotICogR2V0IGFuIGltbXV0YWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGF0YSBxdWV1ZSBmcm9tIHRoZSBIQUwuCi0gKi8KKy8vIEdldCBhbiBpbW11dGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGRhdGEgcXVldWUgZnJvbSB0aGUgSEFMLgogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQOjpnZXRBdWRpb0RhdGFEZXNjcmlwdGlvbigKICAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpCiB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuaAppbmRleCBlMjQxNWQwLi4xNTA5ZjdkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmgKQEAgLTY5LDkgKzY5LDcgQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCBjbG9zZSgpIG92ZXJyaWRlOwogCi0gICAgLyoqCi0gICAgICogU2VuZCBhIE1NQVAvTk9JUlEgYnVmZmVyIHRpbWVzdGFtcCB0byB0aGUgY2xpZW50LgotICAgICAqLworICAgIGNvbnN0IGNoYXIgKmdldFR5cGVUZXh0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gIk1NQVAiOyB9CiAKIHByb3RlY3RlZDoKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcAppbmRleCBmNTVjNDBkLi4wNWM1NzM1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcApAQCAtNzQsNyArNzQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lc1BlckJ1cnN0KSB7CiAKICAgICBpZiAocmVxdWVzdGVkQ2FwYWNpdHlGcmFtZXMgPiBNQVhfRlJBTUVTX1BFUl9CVUZGRVIpIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OmNhbGN1bGF0ZUJ1ZmZlckNhcGFjaXR5KCkgcmVxdWVzdGVkIGNhcGFjaXR5ICVkID4gbWF4ICVkIiwKKyAgICAgICAgQUxPR0UoImNhbGN1bGF0ZUJ1ZmZlckNhcGFjaXR5KCkgcmVxdWVzdGVkIGNhcGFjaXR5ICVkID4gbWF4ICVkIiwKICAgICAgICAgICAgICAgcmVxdWVzdGVkQ2FwYWNpdHlGcmFtZXMsIE1BWF9GUkFNRVNfUEVSX0JVRkZFUik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwogICAgIH0KQEAgLTk5LDcgKzk5LDcgQEAKICAgICB9CiAgICAgLy8gQ2hlY2sgZm9yIG51bWVyaWMgb3ZlcmZsb3cuCiAgICAgaWYgKG51bUJ1cnN0cyA+IDB4ODAwMCB8fCBmcmFtZXNQZXJCdXJzdCA+IDB4ODAwMCkgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6Y2FsY3VsYXRlQnVmZmVyQ2FwYWNpdHkoKSBvdmVyZmxvdywgY2FwYWNpdHkgPSAlZCAqICVkIiwKKyAgICAgICAgQUxPR0UoImNhbGN1bGF0ZUJ1ZmZlckNhcGFjaXR5KCkgb3ZlcmZsb3csIGNhcGFjaXR5ID0gJWQgKiAlZCIsCiAgICAgICAgICAgICAgIG51bUJ1cnN0cywgZnJhbWVzUGVyQnVyc3QpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKICAgICB9CkBAIC0xMDcsMTEgKzEwNywxMSBAQAogCiAgICAgLy8gRmluYWwgc2FuaXR5IGNoZWNrLgogICAgIGlmIChjYXBhY2l0eUluRnJhbWVzID4gTUFYX0ZSQU1FU19QRVJfQlVGRkVSKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpjYWxjdWxhdGVCdWZmZXJDYXBhY2l0eSgpIGNhbGMgY2FwYWNpdHkgJWQgPiBtYXggJWQiLAorICAgICAgICBBTE9HRSgiY2FsY3VsYXRlQnVmZmVyQ2FwYWNpdHkoKSBjYWxjIGNhcGFjaXR5ICVkID4gbWF4ICVkIiwKICAgICAgICAgICAgICAgY2FwYWNpdHlJbkZyYW1lcywgTUFYX0ZSQU1FU19QRVJfQlVGRkVSKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfQotICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpjYWxjdWxhdGVCdWZmZXJDYXBhY2l0eSgpIHJlcXVlc3RlZCAlZCBmcmFtZXMsIGFjdHVhbCA9ICVkIiwKKyAgICBBTE9HRCgiY2FsY3VsYXRlQnVmZmVyQ2FwYWNpdHkoKSByZXF1ZXN0ZWQgJWQgZnJhbWVzLCBhY3R1YWwgPSAlZCIsCiAgICAgICAgICAgcmVxdWVzdGVkQ2FwYWNpdHlGcmFtZXMsIGNhcGFjaXR5SW5GcmFtZXMpOwogICAgIHJldHVybiBjYXBhY2l0eUluRnJhbWVzOwogfQpAQCAtMTIyLDcgKzEyMiw3IEBACiAKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om9wZW4ocmVxdWVzdCwgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSBvcGVuKCkgcmV0dXJuZWQgJWQiLCByZXN1bHQpOworICAgICAgICBBTE9HRSgiJXMoKSByZXR1cm5lZCAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIApAQCAtMTM5LDcgKzEzOSw3IEBACiAgICAgaWYgKGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQpIHsKICAgICAgICAgc2V0Rm9ybWF0KEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKICAgICB9IGVsc2UgaWYgKGdldEZvcm1hdCgpICE9IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpvcGVuKCkgbUF1ZGlvRm9ybWF0ID0gJWQsIG5lZWQgRkxPQVQiLCBnZXRGb3JtYXQoKSk7CisgICAgICAgIEFMT0dEKCIlcygpIG1BdWRpb0Zvcm1hdCA9ICVkLCBuZWVkIEZMT0FUIiwgX19mdW5jX18sIGdldEZvcm1hdCgpKTsKICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0lOVkFMSURfRk9STUFUOwogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KQEAgLTE0OCw4ICsxNDgsOCBAQAogICAgIGlmIChnZXRTYW1wbGVSYXRlKCkgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CiAgICAgICAgIHNldFNhbXBsZVJhdGUoZW5kcG9pbnQtPmdldFNhbXBsZVJhdGUoKSk7CiAgICAgfSBlbHNlIGlmIChnZXRTYW1wbGVSYXRlKCkgIT0gZW5kcG9pbnQtPmdldFNhbXBsZVJhdGUoKSkgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6b3BlbigpIG1TYW1wbGVSYXRlID0gJWQsIG5lZWQgJWQiLAotICAgICAgICAgICAgICBnZXRTYW1wbGVSYXRlKCksIGVuZHBvaW50LT5nZXRTYW1wbGVSYXRlKCkpOworICAgICAgICBBTE9HRCgiJXMoKSBtU2FtcGxlUmF0ZSA9ICVkLCBuZWVkICVkIiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIGdldFNhbXBsZVJhdGUoKSwgZW5kcG9pbnQtPmdldFNhbXBsZVJhdGUoKSk7CiAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlZBTElEX1JBVEU7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQpAQCAtMTU4LDggKzE1OCw4IEBACiAgICAgaWYgKGdldFNhbXBsZXNQZXJGcmFtZSgpID09IEFBVURJT19VTlNQRUNJRklFRCkgewogICAgICAgICBzZXRTYW1wbGVzUGVyRnJhbWUoZW5kcG9pbnQtPmdldFNhbXBsZXNQZXJGcmFtZSgpKTsKICAgICB9IGVsc2UgaWYgKGdldFNhbXBsZXNQZXJGcmFtZSgpICE9IGVuZHBvaW50LT5nZXRTYW1wbGVzUGVyRnJhbWUoKSkgewotICAgICAgICBBTE9HRSgiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6b3BlbigpIG1TYW1wbGVzUGVyRnJhbWUgPSAlZCwgbmVlZCAlZCIsCi0gICAgICAgICAgICAgIGdldFNhbXBsZXNQZXJGcmFtZSgpLCBlbmRwb2ludC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpOworICAgICAgICBBTE9HRCgiJXMoKSBtU2FtcGxlc1BlckZyYW1lID0gJWQsIG5lZWQgJWQiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgZ2V0U2FtcGxlc1BlckZyYW1lKCksIGVuZHBvaW50LT5nZXRTYW1wbGVzUGVyRnJhbWUoKSk7CiAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQpAQCAtMTc4LDggKzE3OCw4IEBACiAgICAgICAgIG1BdWRpb0RhdGFRdWV1ZSA9IG5ldyBTaGFyZWRSaW5nQnVmZmVyKCk7CiAgICAgICAgIHJlc3VsdCA9IG1BdWRpb0RhdGFRdWV1ZS0+YWxsb2NhdGUoY2FsY3VsYXRlQnl0ZXNQZXJGcmFtZSgpLCBnZXRCdWZmZXJDYXBhY2l0eSgpKTsKICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpvcGVuKCkgY291bGQgbm90IGFsbG9jYXRlIEZJRk8gd2l0aCAlZCBmcmFtZXMiLAotICAgICAgICAgICAgICAgICAgZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CisgICAgICAgICAgICBBTE9HRSgiJXMoKSBjb3VsZCBub3QgYWxsb2NhdGUgRklGTyB3aXRoICVkIGZyYW1lcyIsCisgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CiAgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfTk9fTUVNT1JZOwogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQpAQCAtMjIyLDcgKzIyMiw3IEBACiB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUF1ZGlvRGF0YVF1ZXVlTG9jayk7CiAgICAgaWYgKG1BdWRpb0RhdGFRdWV1ZSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJnZXRBdWRpb0RhdGFEZXNjcmlwdGlvbigpOiBtVXBNZXNzYWdlUXVldWUgbnVsbCEgLSBzdHJlYW0gbm90IG9wZW4iKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IG1VcE1lc3NhZ2VRdWV1ZSBudWxsISAtIHN0cmVhbSBub3Qgb3BlbiIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9OVUxMOwogICAgIH0KICAgICAvLyBHYXRoZXIgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgcXVldWUuCkBAIC0yNjYsOCArMjY2LDggQEAKICAgICAgICAgaW50NjRfdCBvZmZzZXQgPSBtVGltZXN0YW1wUG9zaXRpb25PZmZzZXQubG9hZCgpOwogICAgICAgICAvLyBUT0RPLCBkbyBub3QgZ28gYmVsb3cgc3RhcnRpbmcgdmFsdWUKICAgICAgICAgcG9zaXRpb24gLT0gb2Zmc2V0OyAvLyBPZmZzZXQgZnJvbSBzaGFyZWQgTU1BUCBzdHJlYW0KLSAgICAgICAgQUxPR1YoImdldEhhcmR3YXJlVGltZXN0YW1wKCkgJThsbGQgPSAlOGxsZCAtICU4bGxkIiwKLSAgICAgICAgICAgICAgKGxvbmcgbG9uZykgcG9zaXRpb24sIChsb25nIGxvbmcpIChwb3NpdGlvbiArIG9mZnNldCksIChsb25nIGxvbmcpIG9mZnNldCk7CisgICAgICAgIEFMT0dWKCIlcygpICU4bGxkID0gJThsbGQgLSAlOGxsZCIsCisgICAgICAgICAgICAgIF9fZnVuY19fLCAobG9uZyBsb25nKSBwb3NpdGlvbiwgKGxvbmcgbG9uZykgKHBvc2l0aW9uICsgb2Zmc2V0KSwgKGxvbmcgbG9uZykgb2Zmc2V0KTsKICAgICB9CiAgICAgKnBvc2l0aW9uRnJhbWVzID0gcG9zaXRpb247CiAgICAgcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuaAppbmRleCA4NDk5ZWE1Li42MTc2OWI1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oCkBAIC0xLDQgKzEsNCBAQAotLyoKKyAvKgogICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKQEAgLTQzLDcgKzQzLDcgQEAKIGNsYXNzIEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQgOiBwdWJsaWMgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UgewogCiBwdWJsaWM6Ci0gICAgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZChhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlICZhQXVkaW9TZXJ2aWNlKTsKKyAgICBleHBsaWNpdCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkKGFuZHJvaWQ6OkFBdWRpb1NlcnZpY2UgJmFBdWRpb1NlcnZpY2UpOwogICAgIHZpcnR1YWwgfkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQoKSA9IGRlZmF1bHQ7CiAKICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZHVtcEhlYWRlcigpOwpAQCAtODAsMTMgKzgwLDE1IEBACiAgICAgfQogCiAgICAgdm9pZCBpbmNyZW1lbnRYUnVuQ291bnQoKSB7Ci0gICAgICAgIG1YUnVuQ291bnQrKzsKKyAgICAgICAgc2VuZFhSdW5Db3VudCgrK21YUnVuQ291bnQpOwogICAgIH0KIAogICAgIGludDMyX3QgZ2V0WFJ1bkNvdW50KCkgY29uc3QgewogICAgICAgICByZXR1cm4gbVhSdW5Db3VudC5sb2FkKCk7CiAgICAgfQogCisgICAgY29uc3QgY2hhciAqZ2V0VHlwZVRleHQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAiU2hhcmVkIjsgfQorCiBwcm90ZWN0ZWQ6CiAKICAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0QXVkaW9EYXRhRGVzY3JpcHRpb24oQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpIG92ZXJyaWRlOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU3RyZWFtVHJhY2tlci5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TdHJlYW1UcmFja2VyLmNwcAppbmRleCBlZjg4YjM0Li45ZDVkOGZjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TdHJlYW1UcmFja2VyLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TdHJlYW1UcmFja2VyLmNwcApAQCAtNTMsNiArNTMsMjYgQEAKICAgICByZXR1cm4gc2VydmljZVN0cmVhbTsKIH0KIAorCisvLyBUaGUgcG9ydCBoYW5kbGUgaXMgb25seSBhdmFpbGFibGUgd2hlbiB0aGUgc3RyZWFtIGlzIHN0YXJ0ZWQuCisvLyBTbyB3ZSBoYXZlIHRvIGl0ZXJhdGUgb3ZlciBhbGwgdGhlIHN0cmVhbXMuCisvLyBMdWNraWx5IHRoaXMgcmFyZWx5IGhhcHBlbnMuCitzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gQUF1ZGlvU3RyZWFtVHJhY2tlcjo6ZmluZFN0cmVhbUJ5UG9ydEhhbmRsZSgKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SGFuZGxlKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUhhbmRsZUxvY2spOworICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtOworICAgIGF1dG8gaXQgPSBtU3RyZWFtc0J5SGFuZGxlLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IG1TdHJlYW1zQnlIYW5kbGUuZW5kKCkpIHsKKyAgICAgICAgYXV0byBjYW5kaWRhdGUgPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAoY2FuZGlkYXRlLT5nZXRQb3J0SGFuZGxlKCkgPT0gcG9ydEhhbmRsZSkgeworICAgICAgICAgICAgc2VydmljZVN0cmVhbSA9IGNhbmRpZGF0ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGl0Kys7CisgICAgfQorICAgIHJldHVybiBzZXJ2aWNlU3RyZWFtOworfQorCiAvLyBhZHZhbmNlIHRvIG5leHQgbGVnYWwgaGFuZGxlIHZhbHVlCiBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKIGFhdWRpb19oYW5kbGVfdCBBQXVkaW9TdHJlYW1UcmFja2VyOjpidW1wSGFuZGxlKGFhdWRpb19oYW5kbGVfdCBoYW5kbGUpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1N0cmVhbVRyYWNrZXIuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1N0cmVhbVRyYWNrZXIuaAppbmRleCA3MGQ0NDBkLi41NGU0NmNhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TdHJlYW1UcmFja2VyLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU3RyZWFtVHJhY2tlci5oCkBAIC00Niw2ICs0NiwxNCBAQAogICAgIGFuZHJvaWQ6OnNwPGFhdWRpbzo6QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IGdldFN0cmVhbUJ5SGFuZGxlKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpOwogCiAgICAgLyoqCisgICAgICogTG9vayB1cCBhIHN0cmVhbSBiYXNlZCBvbiB0aGUgQXVkaW9Qb2xpY3kgcG9ydEhhbmRsZS4KKyAgICAgKiBAcGFyYW0gcG9ydEhhbmRsZQorICAgICAqIEByZXR1cm4gc3Ryb25nIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSBpZiBmb3VuZCBvciB0byBudWxscHRyCisgICAgICovCisgICAgYW5kcm9pZDo6c3A8YWF1ZGlvOjpBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gZmluZFN0cmVhbUJ5UG9ydEhhbmRsZSgKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydEhhbmRsZSk7CisKKyAgICAvKioKICAgICAgKiBTdG9yZSBhIHN0cm9uZyBwb2ludGVyIHRvIHRoZSBzdHJlYW0gYW5kIHJldHVybiBhIHVuaXF1ZSBoYW5kbGUgZm9yIGZ1dHVyZSByZWZlcmVuY2UuCiAgICAgICogVGhlIGhhbmRsZSBpcyBndWFyYW50ZWVkIG5vdCB0byBjb2xsaWRlIHdpdGggYW4gZXhpc3Rpbmcgc3RyZWFtLgogICAgICAqIEBwYXJhbSBzZXJ2aWNlU3RyZWFtCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9UaHJlYWQuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvVGhyZWFkLmNwcAppbmRleCBjNmZiNTdkLi5lZDc4OTViIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9UaHJlYWQuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1RocmVhZC5jcHAKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvU2VydmljZSIKKyNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvVGhyZWFkIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCkBAIC0yNywxMiArMjcsMjYgQEAKIAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKIAorc3RkOjphdG9taWM8dWludDMyX3Q+IEFBdWRpb1RocmVhZDo6bU5leHRUaHJlYWRJbmRleHsxfTsKIAotQUF1ZGlvVGhyZWFkOjpBQXVkaW9UaHJlYWQoKQotICAgIDogbVJ1bm5hYmxlKG51bGxwdHIpCi0gICAgLCBtSGFzVGhyZWFkKGZhbHNlKSB7CitBQXVkaW9UaHJlYWQ6OkFBdWRpb1RocmVhZChjb25zdCBjaGFyICpwcmVmaXgpIHsKKyAgICBzZXR1cChwcmVmaXgpOworfQorCitBQXVkaW9UaHJlYWQ6OkFBdWRpb1RocmVhZCgpIHsKKyAgICBzZXR1cCgiQUF1ZGlvIik7Cit9CisKK3ZvaWQgQUF1ZGlvVGhyZWFkOjpzZXR1cChjb25zdCBjaGFyICpwcmVmaXgpIHsKICAgICAvLyBtVGhyZWFkIGlzIGEgcHRocmVhZF90IG9mIHVua25vd24gc2l6ZSBzbyB3ZSBuZWVkIG1lbXNldCgpLgogICAgIG1lbXNldCgmbVRocmVhZCwgMCwgc2l6ZW9mKG1UaHJlYWQpKTsKKworICAgIC8vIE5hbWUgdGhlIHRocmVhZCB3aXRoIGFuIGluY3JlYXNpbmcgaW5kZXgsICJwcmVmaXhfIyIsIGZvciBkZWJ1Z2dpbmcuCisgICAgdWludDMyX3QgaW5kZXggPSBtTmV4dFRocmVhZEluZGV4Kys7CisgICAgLy8gV3JhcCB0aGUgaW5kZXggc28gdGhhdCB3ZSBkbyBub3QgaGl0IHRoZSAxNiBjaGFyIGxpbWl0CisgICAgLy8gYW5kIHRvIGF2b2lkIGhhcmQtdG8tcmVhZCBsYXJnZSBudW1iZXJzLgorICAgIGluZGV4ID0gaW5kZXggJSAxMDAwMDA7IC8vIGFyYml0cmFyeQorICAgIHNucHJpbnRmKG1OYW1lLCBzaXplb2YobU5hbWUpLCAiJXNfJXUiLCBwcmVmaXgsIGluZGV4KTsKIH0KIAogdm9pZCBBQXVkaW9UaHJlYWQ6OmRpc3BhdGNoKCkgewpAQCAtNTMsNyArNjcsNyBAQAogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvVGhyZWFkOjpzdGFydChSdW5uYWJsZSAqcnVubmFibGUpIHsKICAgICBpZiAobUhhc1RocmVhZCkgewotICAgICAgICBBTE9HRSgiQUF1ZGlvVGhyZWFkOjpzdGFydCgpIC0gbUhhc1RocmVhZCBhbHJlYWR5IHRydWUiKTsKKyAgICAgICAgQUxPR0UoInN0YXJ0KCkgLSBtSGFzVGhyZWFkIGFscmVhZHkgdHJ1ZSIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogICAgIC8vIG1SdW5uYWJsZSB3aWxsIGJlIHJlYWQgYnkgdGhlIG5ldyB0aHJlYWQgd2hlbiBpdCBzdGFydHMuCkBAIC02MSw5ICs3NSwxMSBAQAogICAgIG1SdW5uYWJsZSA9IHJ1bm5hYmxlOwogICAgIGludCBlcnIgPSBwdGhyZWFkX2NyZWF0ZSgmbVRocmVhZCwgbnVsbHB0ciwgQUF1ZGlvVGhyZWFkX2ludGVybmFsVGhyZWFkUHJvYywgdGhpcyk7CiAgICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9UaHJlYWQ6OnN0YXJ0KCkgLSBwdGhyZWFkX2NyZWF0ZSgpIHJldHVybmVkICVkICVzIiwgZXJyLCBzdHJlcnJvcihlcnIpKTsKKyAgICAgICAgQUxPR0UoInN0YXJ0KCkgLSBwdGhyZWFkX2NyZWF0ZSgpIHJldHVybmVkICVkICVzIiwgZXJyLCBzdHJlcnJvcihlcnIpKTsKICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KC1lcnIpOwogICAgIH0gZWxzZSB7CisgICAgICAgIGludCBlcnIgPSBwdGhyZWFkX3NldG5hbWVfbnAobVRocmVhZCwgbU5hbWUpOworICAgICAgICBBTE9HV19JRigoZXJyICE9IDApLCAiQ291bGQgbm90IHNldCBuYW1lIG9mIEFBdWRpb1RocmVhZC4gZXJyID0gJWQiLCBlcnIpOwogICAgICAgICBtSGFzVGhyZWFkID0gdHJ1ZTsKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKICAgICB9CkBAIC03MSwxMyArODcsMTMgQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1RocmVhZDo6c3RvcCgpIHsKICAgICBpZiAoIW1IYXNUaHJlYWQpIHsKLSAgICAgICAgQUxPR0UoIkFBdWRpb1RocmVhZDo6c3RvcCgpIGJ1dCBubyB0aHJlYWQgcnVubmluZyIpOworICAgICAgICBBTE9HRSgic3RvcCgpIGJ1dCBubyB0aHJlYWQgcnVubmluZyIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogICAgIGludCBlcnIgPSBwdGhyZWFkX2pvaW4obVRocmVhZCwgbnVsbHB0cik7CiAgICAgbUhhc1RocmVhZCA9IGZhbHNlOwogICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICBBTE9HRSgiQUF1ZGlvVGhyZWFkOjpzdG9wKCkgLSBwdGhyZWFkX2pvaW4oKSByZXR1cm5lZCAlZCAlcyIsIGVyciwgc3RyZXJyb3IoZXJyKSk7CisgICAgICAgIEFMT0dFKCJzdG9wKCkgLSBwdGhyZWFkX2pvaW4oKSByZXR1cm5lZCAlZCAlcyIsIGVyciwgc3RyZXJyb3IoZXJyKSk7CiAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdCgtZXJyKTsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gQUFVRElPX09LOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvVGhyZWFkLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9UaHJlYWQuaAppbmRleCAwMmYxNDU5Li5kY2NlNjhhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9UaHJlYWQuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9UaHJlYWQuaApAQCAtNDMsNyArNDMsOSBAQAogewogcHVibGljOgogICAgIEFBdWRpb1RocmVhZCgpOwotICAgIEFBdWRpb1RocmVhZChSdW5uYWJsZSAqcnVubmFibGUpOworCisgICAgZXhwbGljaXQgQUF1ZGlvVGhyZWFkKGNvbnN0IGNoYXIgKnByZWZpeCk7CisKICAgICB2aXJ0dWFsIH5BQXVkaW9UaHJlYWQoKSA9IGRlZmF1bHQ7CiAKICAgICAvKioKQEAgLTY2LDEwICs2OCwxNSBAQAogICAgIHZvaWQgZGlzcGF0Y2goKTsgLy8gY2FsbGVkIGludGVybmFsbHkgZnJvbSAnQycgdGhyZWFkIHdyYXBwZXIKIAogcHJpdmF0ZToKLSAgICBSdW5uYWJsZSAgICAqbVJ1bm5hYmxlOwotICAgIGJvb2wgICAgICAgICBtSGFzVGhyZWFkOworCisgICAgdm9pZCBzZXR1cChjb25zdCBjaGFyICpwcmVmaXgpOworCisgICAgUnVubmFibGUgICAgKm1SdW5uYWJsZSA9IG51bGxwdHI7CisgICAgYm9vbCAgICAgICAgIG1IYXNUaHJlYWQgPSBmYWxzZTsKICAgICBwdGhyZWFkX3QgICAgbVRocmVhZDsgLy8gaW5pdGlhbGl6ZWQgaW4gY29uc3RydWN0b3IKIAorICAgIHN0YXRpYyBzdGQ6OmF0b21pYzx1aW50MzJfdD4gbU5leHRUaHJlYWRJbmRleDsKKyAgICBjaGFyICAgICAgICAgbU5hbWVbMTZdOyAvLyBtYXggbGVuZ3RoIGZvciBhIHB0aHJlYWRfbmFtZQogfTsKIAogfSAvKiBuYW1lc3BhY2UgYWF1ZGlvICovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9TaGFyZWRNZW1vcnlQcm94eS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9TaGFyZWRNZW1vcnlQcm94eS5jcHAKaW5kZXggYzMxNTU3ZS4uYzQzZWQyMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkTWVtb3J5UHJveHkuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL1NoYXJlZE1lbW9yeVByb3h5LmNwcApAQCAtMTQsMTAgKzE0LDEzIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIExPR19UQUcgIkFBdWRpb1NlcnZpY2UiCisjZGVmaW5lIExPR19UQUcgIlNoYXJlZE1lbW9yeVByb3h5IgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPGxvZy9sb2cuaD4KIAorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAjaW5jbHVkZSAiU2hhcmVkTWVtb3J5UHJveHkuaCIKIApAQCAtNDIsMTIgKzQ1LDEyIEBACiAKICAgICBtUHJveHlGaWxlRGVzY3JpcHRvciA9IGFzaG1lbV9jcmVhdGVfcmVnaW9uKCJBQXVkaW9Qcm94eURhdGFCdWZmZXIiLCBtU2hhcmVkTWVtb3J5U2l6ZUluQnl0ZXMpOwogICAgIGlmIChtUHJveHlGaWxlRGVzY3JpcHRvciA8IDApIHsKLSAgICAgICAgQUxPR0UoIlNoYXJlZE1lbW9yeVByb3h5OjpvcGVuKCkgYXNobWVtX2NyZWF0ZV9yZWdpb24oKSBmYWlsZWQgJWQiLCBlcnJubyk7CisgICAgICAgIEFMT0dFKCJvcGVuKCkgYXNobWVtX2NyZWF0ZV9yZWdpb24oKSBmYWlsZWQgJWQiLCBlcnJubyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7CiAgICAgfQogICAgIGludCBlcnIgPSBhc2htZW1fc2V0X3Byb3RfcmVnaW9uKG1Qcm94eUZpbGVEZXNjcmlwdG9yLCBQUk9UX1JFQUR8UFJPVF9XUklURSk7CiAgICAgaWYgKGVyciA8IDApIHsKLSAgICAgICAgQUxPR0UoIlNoYXJlZE1lbW9yeVByb3h5OjpvcGVuKCkgYXNobWVtX3NldF9wcm90X3JlZ2lvbigpIGZhaWxlZCAlZCIsIGVycm5vKTsKKyAgICAgICAgQUxPR0UoIm9wZW4oKSBhc2htZW1fc2V0X3Byb3RfcmVnaW9uKCkgZmFpbGVkICVkIiwgZXJybm8pOwogICAgICAgICBjbG9zZShtUHJveHlGaWxlRGVzY3JpcHRvcik7CiAgICAgICAgIG1Qcm94eUZpbGVEZXNjcmlwdG9yID0gLTE7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7IC8vIFRPRE8gY29udmVydCBlcnJubyB0byBhIGJldHRlciBBQVVESU9fRVJST1I7CkBAIC01OSw3ICs2Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgTUFQX1NIQVJFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICBtT3JpZ2luYWxGaWxlRGVzY3JpcHRvciwgMCk7CiAgICAgaWYgKG1PcmlnaW5hbFNoYXJlZE1lbW9yeSA9PSBNQVBfRkFJTEVEKSB7Ci0gICAgICAgIEFMT0dFKCJTaGFyZWRNZW1vcnlQcm94eTo6b3BlbigpIG9yaWdpbmFsIG1tYXAoJWQpIGZhaWxlZCAlZCAoJXMpIiwKKyAgICAgICAgQUxPR0UoIm9wZW4oKSBvcmlnaW5hbCBtbWFwKCVkKSBmYWlsZWQgJWQgKCVzKSIsCiAgICAgICAgICAgICAgICAgbU9yaWdpbmFsRmlsZURlc2NyaXB0b3IsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVEVSTkFMOyAvLyBUT0RPIGNvbnZlcnQgZXJybm8gdG8gYSBiZXR0ZXIgQUFVRElPX0VSUk9SOwogICAgIH0KQEAgLTcwLDcgKzczLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBNQVBfU0hBUkVELAogICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm94eUZpbGVEZXNjcmlwdG9yLCAwKTsKICAgICBpZiAobVByb3h5U2hhcmVkTWVtb3J5ICE9IG1PcmlnaW5hbFNoYXJlZE1lbW9yeSkgewotICAgICAgICBBTE9HRSgiU2hhcmVkTWVtb3J5UHJveHk6Om9wZW4oKSBwcm94eSBtbWFwKCVkKSBmYWlsZWQgJWQiLCBtUHJveHlGaWxlRGVzY3JpcHRvciwgZXJybm8pOworICAgICAgICBBTE9HRSgib3BlbigpIHByb3h5IG1tYXAoJWQpIGZhaWxlZCAlZCIsIG1Qcm94eUZpbGVEZXNjcmlwdG9yLCBlcnJubyk7CiAgICAgICAgIG11bm1hcChtT3JpZ2luYWxTaGFyZWRNZW1vcnksIG1TaGFyZWRNZW1vcnlTaXplSW5CeXRlcyk7CiAgICAgICAgIG1PcmlnaW5hbFNoYXJlZE1lbW9yeSA9IG51bGxwdHI7CiAgICAgICAgIGNsb3NlKG1Qcm94eUZpbGVEZXNjcmlwdG9yKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL1NoYXJlZFJpbmdCdWZmZXIuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkUmluZ0J1ZmZlci5jcHAKaW5kZXggODNiMjViMy4uMjQ1NDQ0NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkUmluZ0J1ZmZlci5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkUmluZ0J1ZmZlci5jcHAKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvU2VydmljZSIKKyNkZWZpbmUgTE9HX1RBRyAiU2hhcmVkUmluZ0J1ZmZlciIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIApAQCAtNDYsMTQgKzQ2LDE0IEBACiAgICAgbVNoYXJlZE1lbW9yeVNpemVJbkJ5dGVzID0gbURhdGFNZW1vcnlTaXplSW5CeXRlcyArICgyICogKHNpemVvZihmaWZvX2NvdW50ZXJfdCkpKTsKICAgICBtRmlsZURlc2NyaXB0b3IucmVzZXQoYXNobWVtX2NyZWF0ZV9yZWdpb24oIkFBdWRpb1NoYXJlZFJpbmdCdWZmZXIiLCBtU2hhcmVkTWVtb3J5U2l6ZUluQnl0ZXMpKTsKICAgICBpZiAobUZpbGVEZXNjcmlwdG9yLmdldCgpID09IC0xKSB7Ci0gICAgICAgIEFMT0dFKCJTaGFyZWRSaW5nQnVmZmVyOjphbGxvY2F0ZSgpIGFzaG1lbV9jcmVhdGVfcmVnaW9uKCkgZmFpbGVkICVkIiwgZXJybm8pOworICAgICAgICBBTE9HRSgiYWxsb2NhdGUoKSBhc2htZW1fY3JlYXRlX3JlZ2lvbigpIGZhaWxlZCAlZCIsIGVycm5vKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsKICAgICB9Ci0gICAgQUxPR1YoIlNoYXJlZFJpbmdCdWZmZXI6OmFsbG9jYXRlKCkgbUZpbGVEZXNjcmlwdG9yID0gJWRcbiIsIG1GaWxlRGVzY3JpcHRvci5nZXQoKSk7CisgICAgQUxPR1YoImFsbG9jYXRlKCkgbUZpbGVEZXNjcmlwdG9yID0gJWRcbiIsIG1GaWxlRGVzY3JpcHRvci5nZXQoKSk7CiAKICAgICBpbnQgZXJyID0gYXNobWVtX3NldF9wcm90X3JlZ2lvbihtRmlsZURlc2NyaXB0b3IuZ2V0KCksIFBST1RfUkVBRHxQUk9UX1dSSVRFKTsgLy8gVE9ETyBlcnJvciBoYW5kbGluZz8KICAgICBpZiAoZXJyIDwgMCkgewotICAgICAgICBBTE9HRSgiU2hhcmVkUmluZ0J1ZmZlcjo6YWxsb2NhdGUoKSBhc2htZW1fc2V0X3Byb3RfcmVnaW9uKCkgZmFpbGVkICVkIiwgZXJybm8pOworICAgICAgICBBTE9HRSgiYWxsb2NhdGUoKSBhc2htZW1fc2V0X3Byb3RfcmVnaW9uKCkgZmFpbGVkICVkIiwgZXJybm8pOwogICAgICAgICBtRmlsZURlc2NyaXB0b3IucmVzZXQoKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsgLy8gVE9ETyBjb252ZXJ0IGVycm5vIHRvIGEgYmV0dGVyIEFBVURJT19FUlJPUjsKICAgICB9CkBAIC02NCw3ICs2NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgTUFQX1NIQVJFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlsZURlc2NyaXB0b3IuZ2V0KCksIDApOwogICAgIGlmIChtU2hhcmVkTWVtb3J5ID09IE1BUF9GQUlMRUQpIHsKLSAgICAgICAgQUxPR0UoIlNoYXJlZFJpbmdCdWZmZXI6OmFsbG9jYXRlKCkgbW1hcCgpIGZhaWxlZCAlZCIsIGVycm5vKTsKKyAgICAgICAgQUxPR0UoImFsbG9jYXRlKCkgbW1hcCgpIGZhaWxlZCAlZCIsIGVycm5vKTsKICAgICAgICAgbUZpbGVEZXNjcmlwdG9yLnJlc2V0KCk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7IC8vIFRPRE8gY29udmVydCBlcnJubyB0byBhIGJldHRlciBBQVVESU9fRVJST1I7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5tawppbmRleCAxMGVlMTQxLi5hZDM2NjZlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5tawpAQCAtNDksMTEgKzQ5LDE2IEBACiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IFwKICAgICBsaWJod2JpbmRlciBcCiAgICAgbGliaGlkbGJhc2UgXAorICAgIGxpYmhpZGxtZW1vcnkgXAogICAgIGxpYmhpZGx0cmFuc3BvcnQgXAogICAgIGxpYmJhc2UgXAogICAgIGxpYmF1ZGlvaGFsIFwKKyAgICBsaWJhdWRpb2hhbF9kZWF0aGhhbmRsZXIgXAogICAgIGFuZHJvaWQuaGFyZHdhcmUuc291bmR0cmlnZ2VyQDIuMCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25AMi4wCisgICAgYW5kcm9pZC5oYXJkd2FyZS5zb3VuZHRyaWdnZXJAMi4xIFwKKyAgICBhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAgXAorICAgIGFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIFwKKyAgICBhbmRyb2lkLmhpZGwubWVtb3J5QDEuMAogZW5kaWYKIAogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5jcHAgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5jcHAKaW5kZXggMGNkNWNmNy4uYWRmMjUyZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEhpZGwuY3BwCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmNwcApAQCAtMTcsMTcgKzE3LDg3IEBACiAjZGVmaW5lIExPR19UQUcgIlNvdW5kVHJpZ2dlckhhbEhpZGwiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvYWxsb2NhdG9yLzEuMC9JQWxsb2NhdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvaGlkbC9IYWxEZWF0aEhhbmRsZXIuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlICJTb3VuZFRyaWdnZXJIYWxIaWRsLmgiCisjaW5jbHVkZSA8aGlkbG1lbW9yeS9tYXBwaW5nLmg+CiAjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxod2JpbmRlci9Qcm9jZXNzU3RhdGUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OlByb2Nlc3NTdGF0ZTsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0RldmljZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlByb2Nlc3NTdGF0ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0RldmljZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoaWRsOjphbGxvY2F0b3I6OlYxXzA6OklBbGxvY2F0b3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhpZGw6Om1lbW9yeTo6VjFfMDo6SU1lbW9yeTsKKworbmFtZXNwYWNlIHsKKworLy8gQmFja3MgdXAgYnkgdGhlIHZlY3RvciB3aXRoIHRoZSBjb250ZW50cyBvZiBzaGFyZWQgbWVtb3J5LgorLy8gSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBwYXNzZWQgaGlkbF92ZWN0b3IgaXMgZW1wdHksIHNvIGl0J3MKKy8vIG5vdCBjbGVhcmVkIGlmIHRoZSBtZW1vcnkgaXMgYSBudWxsIG9iamVjdC4KKy8vIFRoZSBjYWxsZXIgbmVlZHMgdG8ga2VlcCB0aGUgcmV0dXJuZWQgc3A8SU1lbW9yeT4gYXMgbG9uZyBhcworLy8gdGhlIGRhdGEgaXMgbmVlZGVkLgorc3RkOjpwYWlyPGJvb2wsIHNwPElNZW1vcnk+PiBtZW1vcnlBc1ZlY3Rvcihjb25zdCBoaWRsX21lbW9yeSYgbSwgaGlkbF92ZWM8dWludDhfdD4qIHZlYykgeworICAgIHNwPElNZW1vcnk+IG1lbW9yeTsKKyAgICBpZiAobS5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIodHJ1ZSwgbWVtb3J5KTsKKyAgICB9CisgICAgbWVtb3J5ID0gbWFwTWVtb3J5KG0pOworICAgIGlmIChtZW1vcnkgIT0gbnVsbHB0cikgeworICAgICAgICBtZW1vcnktPnJlYWQoKTsKKyAgICAgICAgdmVjLT5zZXRUb0V4dGVybmFsKHN0YXRpY19jYXN0PHVpbnQ4X3QqPihzdGF0aWNfY2FzdDx2b2lkKj4obWVtb3J5LT5nZXRQb2ludGVyKCkpKSwKKyAgICAgICAgICAgICAgICBtZW1vcnktPmdldFNpemUoKSk7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcih0cnVlLCBtZW1vcnkpOworICAgIH0KKyAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBtYXAgSElETCBtZW1vcnkgdG8gSU1lbW9yeSIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoZmFsc2UsIG1lbW9yeSk7Cit9CisKKy8vIE1vdmVzIHRoZSBkYXRhIGZyb20gdGhlIHZlY3RvciBpbnRvIGFsbG9jYXRlZCBzaGFyZWQgbWVtb3J5LAorLy8gZW1wdHlpbmcgdGhlIHZlY3Rvci4KKy8vIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgcGFzc2VkIGhpZGxfbWVtb3J5IGlzIGEgbnVsbCBvYmplY3QsIHNvIGl0J3MKKy8vIG5vdCByZXNldCBpZiB0aGUgdmVjdG9yIGlzIGVtcHR5LgorLy8gVGhlIGNhbGxlciBuZWVkcyB0byBrZWVwIHRoZSByZXR1cm5lZCBzcDxJTWVtb3J5PiBhcyBsb25nIGFzCisvLyB0aGUgZGF0YSBpcyBuZWVkZWQuCitzdGQ6OnBhaXI8Ym9vbCwgc3A8SU1lbW9yeT4+IG1vdmVWZWN0b3JUb01lbW9yeShoaWRsX3ZlYzx1aW50OF90PiogdiwgaGlkbF9tZW1vcnkqIG1lbSkgeworICAgIHNwPElNZW1vcnk+IG1lbW9yeTsKKyAgICBpZiAodi0+c2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHRydWUsIG1lbW9yeSk7CisgICAgfQorICAgIHNwPElBbGxvY2F0b3I+IGFzaG1lbSA9IElBbGxvY2F0b3I6OmdldFNlcnZpY2UoImFzaG1lbSIpOworICAgIGlmIChhc2htZW0gPT0gMCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJldHJpZXZlIGFzaG1lbSBhbGxvY2F0b3Igc2VydmljZSIpOworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoZmFsc2UsIG1lbW9yeSk7CisgICAgfQorICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworICAgIFJldHVybjx2b2lkPiByID0gYXNobWVtLT5hbGxvY2F0ZSh2LT5zaXplKCksIFsmXShib29sIHMsIGNvbnN0IGhpZGxfbWVtb3J5JiBtKSB7CisgICAgICAgIHN1Y2Nlc3MgPSBzOworICAgICAgICBpZiAoc3VjY2VzcykgKm1lbSA9IG07CisgICAgfSk7CisgICAgaWYgKHIuaXNPaygpICYmIHN1Y2Nlc3MpIHsKKyAgICAgICAgbWVtb3J5ID0gaGFyZHdhcmU6Om1hcE1lbW9yeSgqbWVtKTsKKyAgICAgICAgaWYgKG1lbW9yeSAhPSAwKSB7CisgICAgICAgICAgICBtZW1vcnktPnVwZGF0ZSgpOworICAgICAgICAgICAgbWVtY3B5KG1lbW9yeS0+Z2V0UG9pbnRlcigpLCB2LT5kYXRhKCksIHYtPnNpemUoKSk7CisgICAgICAgICAgICBtZW1vcnktPmNvbW1pdCgpOworICAgICAgICAgICAgdi0+cmVzaXplKDApOworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHRydWUsIG1lbW9yeSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG1hcCBhbGxvY2F0ZWQgYXNobWVtIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlICVsbHUgYnl0ZXMgZnJvbSBhc2htZW0iLCAodW5zaWduZWQgbG9uZyBsb25nKXYtPnNpemUoKSk7CisgICAgfQorICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihmYWxzZSwgbWVtb3J5KTsKK30KKworfSAgLy8gbmFtZXNwYWNlCiAKIC8qIHN0YXRpYyAqLwogc3A8U291bmRUcmlnZ2VySGFsSW50ZXJmYWNlPiBTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2U6OmNvbm5lY3RNb2R1bGUoY29uc3QgY2hhciAqbW9kdWxlTmFtZSkKQEAgLTk0LDM2ICsxNjQsNjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICJsb2FkU291bmRNb2RlbCgpOiB3cmFwIGFyb3VuZCBpbiBzb3VuZCBtb2RlbCBJRHMsIG51bSBsb2FkZWQgbW9kZWxzICV6ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBtU291bmRNb2RlbHMuc2l6ZSgpKTsKIAotICAgIElTb3VuZFRyaWdnZXJIdzo6U291bmRNb2RlbCAqaGFsU291bmRNb2RlbCA9Ci0gICAgICAgICAgICBjb252ZXJ0U291bmRNb2RlbFRvSGFsKHNvdW5kX21vZGVsKTsKLSAgICBpZiAoaGFsU291bmRNb2RlbCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQogICAgIFJldHVybjx2b2lkPiBoaWRsUmV0dXJuOwogICAgIGludCByZXQ7CiAgICAgU291bmRNb2RlbEhhbmRsZSBoYWxIYW5kbGU7Ci0gICAgewotICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFsTG9jayk7Ci0gICAgICAgIGlmIChzb3VuZF9tb2RlbC0+dHlwZSA9PSBTT1VORF9NT0RFTF9UWVBFX0tFWVBIUkFTRSkgeworICAgIHNwPFYyXzFfSVNvdW5kVHJpZ2dlckh3PiBzb3VuZHRyaWdnZXJfMl8xID0gdG9TZXJ2aWNlMl8xKHNvdW5kdHJpZ2dlcik7CisgICAgaWYgKHNvdW5kX21vZGVsLT50eXBlID09IFNPVU5EX01PREVMX1RZUEVfS0VZUEhSQVNFKSB7CisgICAgICAgIGlmICghc291bmR0cmlnZ2VyXzJfMSkgeworICAgICAgICAgICAgSVNvdW5kVHJpZ2dlckh3OjpQaHJhc2VTb3VuZE1vZGVsIGhhbFNvdW5kTW9kZWw7CisgICAgICAgICAgICBjb252ZXJ0UGhyYXNlU291bmRNb2RlbFRvSGFsKCZoYWxTb3VuZE1vZGVsLCBzb3VuZF9tb2RlbCk7CisgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFsTG9jayk7CiAgICAgICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyLT5sb2FkUGhyYXNlU291bmRNb2RlbCgKLSAgICAgICAgICAgICAgICAgICAgKihjb25zdCBJU291bmRUcmlnZ2VySHc6OlBocmFzZVNvdW5kTW9kZWwgKiloYWxTb3VuZE1vZGVsLAorICAgICAgICAgICAgICAgICAgICBoYWxTb3VuZE1vZGVsLAogICAgICAgICAgICAgICAgICAgICB0aGlzLCBtb2RlbElkLCBbJl0oaW50MzJfdCByZXR2YWwsIGF1dG8gcmVzKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gcmV0dmFsOwotICAgICAgICAgICAgICAgIGhhbEhhbmRsZSA9IHJlczsKLSAgICAgICAgICAgIH0pOwotCisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSByZXR2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICBoYWxIYW5kbGUgPSByZXM7CisgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaGlkbFJldHVybiA9IHNvdW5kdHJpZ2dlci0+bG9hZFNvdW5kTW9kZWwoKmhhbFNvdW5kTW9kZWwsCisgICAgICAgICAgICBWMl8xX0lTb3VuZFRyaWdnZXJIdzo6UGhyYXNlU291bmRNb2RlbCBoYWxTb3VuZE1vZGVsOworICAgICAgICAgICAgYXV0byByZXN1bHQgPSBjb252ZXJ0UGhyYXNlU291bmRNb2RlbFRvSGFsKCZoYWxTb3VuZE1vZGVsLCBzb3VuZF9tb2RlbCk7CisgICAgICAgICAgICBpZiAocmVzdWx0LmZpcnN0KSB7CisgICAgICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUhhbExvY2spOworICAgICAgICAgICAgICAgIGhpZGxSZXR1cm4gPSBzb3VuZHRyaWdnZXJfMl8xLT5sb2FkUGhyYXNlU291bmRNb2RlbF8yXzEoCisgICAgICAgICAgICAgICAgICAgICAgICBoYWxTb3VuZE1vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgbW9kZWxJZCwgWyZdKGludDMyX3QgcmV0dmFsLCBhdXRvIHJlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHJldHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxIYW5kbGUgPSByZXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghc291bmR0cmlnZ2VyXzJfMSkgeworICAgICAgICAgICAgSVNvdW5kVHJpZ2dlckh3OjpTb3VuZE1vZGVsIGhhbFNvdW5kTW9kZWw7CisgICAgICAgICAgICBjb252ZXJ0U291bmRNb2RlbFRvSGFsKCZoYWxTb3VuZE1vZGVsLCBzb3VuZF9tb2RlbCk7CisgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFsTG9jayk7CisgICAgICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyLT5sb2FkU291bmRNb2RlbChoYWxTb3VuZE1vZGVsLAogICAgICAgICAgICAgICAgICAgICB0aGlzLCBtb2RlbElkLCBbJl0oaW50MzJfdCByZXR2YWwsIGF1dG8gcmVzKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gcmV0dmFsOwotICAgICAgICAgICAgICAgIGhhbEhhbmRsZSA9IHJlczsKLSAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmV0dmFsOworICAgICAgICAgICAgICAgICAgICAgICAgaGFsSGFuZGxlID0gcmVzOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFYyXzFfSVNvdW5kVHJpZ2dlckh3OjpTb3VuZE1vZGVsIGhhbFNvdW5kTW9kZWw7CisgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IGNvbnZlcnRTb3VuZE1vZGVsVG9IYWwoJmhhbFNvdW5kTW9kZWwsIHNvdW5kX21vZGVsKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQuZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFsTG9jayk7CisgICAgICAgICAgICAgICAgaGlkbFJldHVybiA9IHNvdW5kdHJpZ2dlcl8yXzEtPmxvYWRTb3VuZE1vZGVsXzJfMShoYWxTb3VuZE1vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgbW9kZWxJZCwgWyZdKGludDMyX3QgcmV0dmFsLCBhdXRvIHJlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHJldHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxIYW5kbGUgPSByZXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIGRlbGV0ZSBoYWxTb3VuZE1vZGVsOwotCiAgICAgaWYgKGhpZGxSZXR1cm4uaXNPaygpKSB7CiAgICAgICAgIGlmIChyZXQgPT0gMCkgewogICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwpAQCAtMTg1LDE2ICsyODEsMjcgQEAKICAgICBtb2RlbC0+bVJlY29nbml0aW9uQ2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICBtb2RlbC0+bVJlY29nbml0aW9uQ29va2llID0gY29va2llOwogCi0gICAgSVNvdW5kVHJpZ2dlckh3OjpSZWNvZ25pdGlvbkNvbmZpZyAqaGFsQ29uZmlnID0KLSAgICAgICAgICAgIGNvbnZlcnRSZWNvZ25pdGlvbkNvbmZpZ1RvSGFsKGNvbmZpZyk7Ci0KKyAgICBzcDxWMl8xX0lTb3VuZFRyaWdnZXJIdz4gc291bmR0cmlnZ2VyXzJfMSA9IHRvU2VydmljZTJfMShzb3VuZHRyaWdnZXIpOwogICAgIFJldHVybjxpbnQzMl90PiBoaWRsUmV0dXJuKDApOwotICAgIHsKLSAgICAgICAgQXV0b011dGV4IGxvY2sobUhhbExvY2spOwotICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyLT5zdGFydFJlY29nbml0aW9uKG1vZGVsLT5tSGFsSGFuZGxlLCAqaGFsQ29uZmlnLCB0aGlzLCBoYW5kbGUpOwotICAgIH0KIAotICAgIGRlbGV0ZSBoYWxDb25maWc7CisgICAgaWYgKCFzb3VuZHRyaWdnZXJfMl8xKSB7CisgICAgICAgIElTb3VuZFRyaWdnZXJIdzo6UmVjb2duaXRpb25Db25maWcgaGFsQ29uZmlnOworICAgICAgICBjb252ZXJ0UmVjb2duaXRpb25Db25maWdUb0hhbCgmaGFsQ29uZmlnLCBjb25maWcpOworICAgICAgICB7CisgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFsTG9jayk7CisgICAgICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyLT5zdGFydFJlY29nbml0aW9uKG1vZGVsLT5tSGFsSGFuZGxlLCBoYWxDb25maWcsIHRoaXMsIGhhbmRsZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBWMl8xX0lTb3VuZFRyaWdnZXJIdzo6UmVjb2duaXRpb25Db25maWcgaGFsQ29uZmlnOworICAgICAgICBhdXRvIHJlc3VsdCA9IGNvbnZlcnRSZWNvZ25pdGlvbkNvbmZpZ1RvSGFsKCZoYWxDb25maWcsIGNvbmZpZyk7CisgICAgICAgIGlmIChyZXN1bHQuZmlyc3QpIHsKKyAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYWxMb2NrKTsKKyAgICAgICAgICAgIGhpZGxSZXR1cm4gPSBzb3VuZHRyaWdnZXJfMl8xLT5zdGFydFJlY29nbml0aW9uXzJfMSgKKyAgICAgICAgICAgICAgICAgICAgbW9kZWwtPm1IYWxIYW5kbGUsIGhhbENvbmZpZywgdGhpcywgaGFuZGxlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICB9CiAKICAgICBpZiAoIWhpZGxSZXR1cm4uaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCJzdGFydFJlY29nbml0aW9uIGVycm9yICVzIiwgaGlkbFJldHVybi5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwpAQCAtMjc1LDYgKzM4MiwxMiBAQAogICAgIHJldHVybiBtSVNvdW5kVHJpZ2dlcjsKIH0KIAorc3A8VjJfMV9JU291bmRUcmlnZ2VySHc+IFNvdW5kVHJpZ2dlckhhbEhpZGw6OnRvU2VydmljZTJfMShjb25zdCBzcDxJU291bmRUcmlnZ2VySHc+JiBzKQoreworICAgIGF1dG8gY2FzdFJlc3VsdF8yXzEgPSBWMl8xX0lTb3VuZFRyaWdnZXJIdzo6Y2FzdEZyb20ocyk7CisgICAgcmV0dXJuIGNhc3RSZXN1bHRfMl8xLmlzT2soKSA/IHN0YXRpY19jYXN0PHNwPFYyXzFfSVNvdW5kVHJpZ2dlckh3Pj4oY2FzdFJlc3VsdF8yXzEpIDogbnVsbHB0cjsKK30KKwogc3A8U291bmRUcmlnZ2VySGFsSGlkbDo6U291bmRNb2RlbD4gU291bmRUcmlnZ2VySGFsSGlkbDo6Z2V0TW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKQEAgLTM0Nyw0MCArNDYwLDUyIEBACiAgICAgaGFsVHJpZ2dlclBocmFzZS0+dGV4dCA9IHRyaWdnZXJQaHJhc2UtPnRleHQ7CiB9CiAKLUlTb3VuZFRyaWdnZXJIdzo6U291bmRNb2RlbCAqU291bmRUcmlnZ2VySGFsSGlkbDo6Y29udmVydFNvdW5kTW9kZWxUb0hhbCgKKwordm9pZCBTb3VuZFRyaWdnZXJIYWxIaWRsOjpjb252ZXJ0VHJpZ2dlclBocmFzZXNUb0hhbCgKKyAgICAgICAgaGlkbF92ZWM8SVNvdW5kVHJpZ2dlckh3OjpQaHJhc2U+ICpoYWxUcmlnZ2VyUGhyYXNlcywKKyAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfcGhyYXNlX3NvdW5kX21vZGVsICprZXlQaHJhc2VNb2RlbCkKK3sKKyAgICBoYWxUcmlnZ2VyUGhyYXNlcy0+cmVzaXplKGtleVBocmFzZU1vZGVsLT5udW1fcGhyYXNlcyk7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBrZXlQaHJhc2VNb2RlbC0+bnVtX3BocmFzZXM7IGkrKykgeworICAgICAgICBjb252ZXJ0VHJpZ2dlclBocmFzZVRvSGFsKCYoKmhhbFRyaWdnZXJQaHJhc2VzKVtpXSwgJmtleVBocmFzZU1vZGVsLT5waHJhc2VzW2ldKTsKKyAgICB9Cit9CisKK3ZvaWQgU291bmRUcmlnZ2VySGFsSGlkbDo6Y29udmVydFNvdW5kTW9kZWxUb0hhbChJU291bmRUcmlnZ2VySHc6OlNvdW5kTW9kZWwgKmhhbE1vZGVsLAogICAgICAgICBjb25zdCBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9zb3VuZF9tb2RlbCAqc291bmRNb2RlbCkKIHsKLSAgICBJU291bmRUcmlnZ2VySHc6OlNvdW5kTW9kZWwgKmhhbE1vZGVsID0gTlVMTDsKLSAgICBpZiAoc291bmRNb2RlbC0+dHlwZSA9PSBTT1VORF9NT0RFTF9UWVBFX0tFWVBIUkFTRSkgewotICAgICAgICBJU291bmRUcmlnZ2VySHc6OlBocmFzZVNvdW5kTW9kZWwgKmhhbEtleVBocmFzZU1vZGVsID0KLSAgICAgICAgICAgICAgICBuZXcgSVNvdW5kVHJpZ2dlckh3OjpQaHJhc2VTb3VuZE1vZGVsKCk7Ci0gICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX3BocmFzZV9zb3VuZF9tb2RlbCAqa2V5UGhyYXNlTW9kZWwgPQotICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9waHJhc2Vfc291bmRfbW9kZWwgKilzb3VuZE1vZGVsOwotICAgICAgICBJU291bmRUcmlnZ2VySHc6OlBocmFzZSAqaGFsUGhyYXNlcyA9Ci0gICAgICAgICAgICAgICAgbmV3IElTb3VuZFRyaWdnZXJIdzo6UGhyYXNlW2tleVBocmFzZU1vZGVsLT5udW1fcGhyYXNlc107Ci0KLQotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGtleVBocmFzZU1vZGVsLT5udW1fcGhyYXNlczsgaSsrKSB7Ci0gICAgICAgICAgICBjb252ZXJ0VHJpZ2dlclBocmFzZVRvSGFsKCZoYWxQaHJhc2VzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5UGhyYXNlTW9kZWwtPnBocmFzZXNbaV0pOwotICAgICAgICB9Ci0gICAgICAgIGhhbEtleVBocmFzZU1vZGVsLT5waHJhc2VzLnNldFRvRXh0ZXJuYWwoaGFsUGhyYXNlcywga2V5UGhyYXNlTW9kZWwtPm51bV9waHJhc2VzKTsKLSAgICAgICAgLy8gRklYTUU6IHRyYW5zZmVyIGJ1ZmZlciBvd25lcnNoaXAuIHNob3VsZCBoYXZlIGEgbWV0aG9kIGZvciB0aGF0IGluIGhpZGxfdmVjCi0gICAgICAgIGhhbEtleVBocmFzZU1vZGVsLT5waHJhc2VzLnJlc2l6ZShrZXlQaHJhc2VNb2RlbC0+bnVtX3BocmFzZXMpOwotCi0gICAgICAgIGRlbGV0ZVtdIGhhbFBocmFzZXM7Ci0KLSAgICAgICAgaGFsTW9kZWwgPSAoSVNvdW5kVHJpZ2dlckh3OjpTb3VuZE1vZGVsICopaGFsS2V5UGhyYXNlTW9kZWw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaGFsTW9kZWwgPSBuZXcgSVNvdW5kVHJpZ2dlckh3OjpTb3VuZE1vZGVsKCk7Ci0gICAgfQogICAgIGhhbE1vZGVsLT50eXBlID0gKFNvdW5kTW9kZWxUeXBlKXNvdW5kTW9kZWwtPnR5cGU7CiAgICAgY29udmVydFV1aWRUb0hhbCgmaGFsTW9kZWwtPnV1aWQsICZzb3VuZE1vZGVsLT51dWlkKTsKICAgICBjb252ZXJ0VXVpZFRvSGFsKCZoYWxNb2RlbC0+dmVuZG9yVXVpZCwgJnNvdW5kTW9kZWwtPnZlbmRvcl91dWlkKTsKICAgICBoYWxNb2RlbC0+ZGF0YS5zZXRUb0V4dGVybmFsKCh1aW50OF90ICopc291bmRNb2RlbCArIHNvdW5kTW9kZWwtPmRhdGFfb2Zmc2V0LCBzb3VuZE1vZGVsLT5kYXRhX3NpemUpOwotICAgIGhhbE1vZGVsLT5kYXRhLnJlc2l6ZShzb3VuZE1vZGVsLT5kYXRhX3NpemUpOworfQogCi0gICAgcmV0dXJuIGhhbE1vZGVsOworc3RkOjpwYWlyPGJvb2wsIHNwPElNZW1vcnk+PiBTb3VuZFRyaWdnZXJIYWxIaWRsOjpjb252ZXJ0U291bmRNb2RlbFRvSGFsKAorICAgICAgICBWMl8xX0lTb3VuZFRyaWdnZXJIdzo6U291bmRNb2RlbCAqaGFsTW9kZWwsCisgICAgICAgIGNvbnN0IHN0cnVjdCBzb3VuZF90cmlnZ2VyX3NvdW5kX21vZGVsICpzb3VuZE1vZGVsKQoreworICAgIGNvbnZlcnRTb3VuZE1vZGVsVG9IYWwoJmhhbE1vZGVsLT5oZWFkZXIsIHNvdW5kTW9kZWwpOworICAgIHJldHVybiBtb3ZlVmVjdG9yVG9NZW1vcnkoJmhhbE1vZGVsLT5oZWFkZXIuZGF0YSwgJmhhbE1vZGVsLT5kYXRhKTsKK30KKwordm9pZCBTb3VuZFRyaWdnZXJIYWxIaWRsOjpjb252ZXJ0UGhyYXNlU291bmRNb2RlbFRvSGFsKAorICAgICAgICBJU291bmRUcmlnZ2VySHc6OlBocmFzZVNvdW5kTW9kZWwgKmhhbEtleVBocmFzZU1vZGVsLAorICAgICAgICBjb25zdCBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9zb3VuZF9tb2RlbCAqc291bmRNb2RlbCkKK3sKKyAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9waHJhc2Vfc291bmRfbW9kZWwgKmtleVBocmFzZU1vZGVsID0KKyAgICAgICAgICAgIChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9waHJhc2Vfc291bmRfbW9kZWwgKilzb3VuZE1vZGVsOworICAgIGNvbnZlcnRUcmlnZ2VyUGhyYXNlc1RvSGFsKCZoYWxLZXlQaHJhc2VNb2RlbC0+cGhyYXNlcywga2V5UGhyYXNlTW9kZWwpOworICAgIGNvbnZlcnRTb3VuZE1vZGVsVG9IYWwoJmhhbEtleVBocmFzZU1vZGVsLT5jb21tb24sIHNvdW5kTW9kZWwpOworfQorCitzdGQ6OnBhaXI8Ym9vbCwgc3A8SU1lbW9yeT4+IFNvdW5kVHJpZ2dlckhhbEhpZGw6OmNvbnZlcnRQaHJhc2VTb3VuZE1vZGVsVG9IYWwoCisgICAgICAgIFYyXzFfSVNvdW5kVHJpZ2dlckh3OjpQaHJhc2VTb3VuZE1vZGVsICpoYWxLZXlQaHJhc2VNb2RlbCwKKyAgICAgICAgY29uc3Qgc3RydWN0IHNvdW5kX3RyaWdnZXJfc291bmRfbW9kZWwgKnNvdW5kTW9kZWwpCit7CisgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfcGhyYXNlX3NvdW5kX21vZGVsICprZXlQaHJhc2VNb2RlbCA9CisgICAgICAgICAgICAoc3RydWN0IHNvdW5kX3RyaWdnZXJfcGhyYXNlX3NvdW5kX21vZGVsICopc291bmRNb2RlbDsKKyAgICBjb252ZXJ0VHJpZ2dlclBocmFzZXNUb0hhbCgmaGFsS2V5UGhyYXNlTW9kZWwtPnBocmFzZXMsIGtleVBocmFzZU1vZGVsKTsKKyAgICByZXR1cm4gY29udmVydFNvdW5kTW9kZWxUb0hhbCgmaGFsS2V5UGhyYXNlTW9kZWwtPmNvbW1vbiwgc291bmRNb2RlbCk7CiB9CiAKIHZvaWQgU291bmRUcmlnZ2VySGFsSGlkbDo6Y29udmVydFBocmFzZVJlY29nbml0aW9uRXh0cmFUb0hhbCgKQEAgLTM5MCw1MiArNTE1LDQyIEBACiAgICAgaGFsRXh0cmEtPmlkID0gZXh0cmEtPmlkOwogICAgIGhhbEV4dHJhLT5yZWNvZ25pdGlvbk1vZGVzID0gZXh0cmEtPnJlY29nbml0aW9uX21vZGVzOwogICAgIGhhbEV4dHJhLT5jb25maWRlbmNlTGV2ZWwgPSBleHRyYS0+Y29uZmlkZW5jZV9sZXZlbDsKLSAgICBDb25maWRlbmNlTGV2ZWwgKmhhbExldmVscyA9Ci0gICAgICAgICAgICBuZXcgQ29uZmlkZW5jZUxldmVsW2V4dHJhLT5udW1fbGV2ZWxzXTsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGV4dHJhLT5udW1fbGV2ZWxzOyBpKyspIHsKLSAgICAgICAgaGFsTGV2ZWxzW2ldLnVzZXJJZCA9IGV4dHJhLT5sZXZlbHNbaV0udXNlcl9pZDsKLSAgICAgICAgaGFsTGV2ZWxzW2ldLmxldmVsUGVyY2VudCA9IGV4dHJhLT5sZXZlbHNbaV0ubGV2ZWw7Ci0gICAgfQotICAgIGhhbEV4dHJhLT5sZXZlbHMuc2V0VG9FeHRlcm5hbChoYWxMZXZlbHMsIGV4dHJhLT5udW1fbGV2ZWxzKTsKLSAgICAvLyBGSVhNRTogdHJhbnNmZXIgYnVmZmVyIG93bmVyc2hpcC4gc2hvdWxkIGhhdmUgYSBtZXRob2QgZm9yIHRoYXQgaW4gaGlkbF92ZWMKICAgICBoYWxFeHRyYS0+bGV2ZWxzLnJlc2l6ZShleHRyYS0+bnVtX2xldmVscyk7Ci0KLSAgICBkZWxldGVbXSBoYWxMZXZlbHM7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBleHRyYS0+bnVtX2xldmVsczsgaSsrKSB7CisgICAgICAgIGhhbEV4dHJhLT5sZXZlbHNbaV0udXNlcklkID0gZXh0cmEtPmxldmVsc1tpXS51c2VyX2lkOworICAgICAgICBoYWxFeHRyYS0+bGV2ZWxzW2ldLmxldmVsUGVyY2VudCA9IGV4dHJhLT5sZXZlbHNbaV0ubGV2ZWw7CisgICAgfQogfQogCi0KLUlTb3VuZFRyaWdnZXJIdzo6UmVjb2duaXRpb25Db25maWcgKlNvdW5kVHJpZ2dlckhhbEhpZGw6OmNvbnZlcnRSZWNvZ25pdGlvbkNvbmZpZ1RvSGFsKAordm9pZCBTb3VuZFRyaWdnZXJIYWxIaWRsOjpjb252ZXJ0UmVjb2duaXRpb25Db25maWdUb0hhbCgKKyAgICAgICAgSVNvdW5kVHJpZ2dlckh3OjpSZWNvZ25pdGlvbkNvbmZpZyAqaGFsQ29uZmlnLAogICAgICAgICBjb25zdCBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9jb25maWcgKmNvbmZpZykKIHsKLSAgICBJU291bmRUcmlnZ2VySHc6OlJlY29nbml0aW9uQ29uZmlnICpoYWxDb25maWcgPQotICAgICAgICAgICAgbmV3IElTb3VuZFRyaWdnZXJIdzo6UmVjb2duaXRpb25Db25maWcoKTsKLQogICAgIGhhbENvbmZpZy0+Y2FwdHVyZUhhbmRsZSA9IGNvbmZpZy0+Y2FwdHVyZV9oYW5kbGU7CiAgICAgaGFsQ29uZmlnLT5jYXB0dXJlRGV2aWNlID0gKEF1ZGlvRGV2aWNlKWNvbmZpZy0+Y2FwdHVyZV9kZXZpY2U7CiAgICAgaGFsQ29uZmlnLT5jYXB0dXJlUmVxdWVzdGVkID0gKHVpbnQzMl90KWNvbmZpZy0+Y2FwdHVyZV9yZXF1ZXN0ZWQ7CiAKLSAgICBQaHJhc2VSZWNvZ25pdGlvbkV4dHJhICpoYWxFeHRyYXMgPQotICAgICAgICAgICAgbmV3IFBocmFzZVJlY29nbml0aW9uRXh0cmFbY29uZmlnLT5udW1fcGhyYXNlc107Ci0KKyAgICBoYWxDb25maWctPnBocmFzZXMucmVzaXplKGNvbmZpZy0+bnVtX3BocmFzZXMpOwogICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY29uZmlnLT5udW1fcGhyYXNlczsgaSsrKSB7Ci0gICAgICAgIGNvbnZlcnRQaHJhc2VSZWNvZ25pdGlvbkV4dHJhVG9IYWwoJmhhbEV4dHJhc1tpXSwKKyAgICAgICAgY29udmVydFBocmFzZVJlY29nbml0aW9uRXh0cmFUb0hhbCgmaGFsQ29uZmlnLT5waHJhc2VzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWctPnBocmFzZXNbaV0pOwogICAgIH0KLSAgICBoYWxDb25maWctPnBocmFzZXMuc2V0VG9FeHRlcm5hbChoYWxFeHRyYXMsIGNvbmZpZy0+bnVtX3BocmFzZXMpOwotICAgIC8vIEZJWE1FOiB0cmFuc2ZlciBidWZmZXIgb3duZXJzaGlwLiBzaG91bGQgaGF2ZSBhIG1ldGhvZCBmb3IgdGhhdCBpbiBoaWRsX3ZlYwotICAgIGhhbENvbmZpZy0+cGhyYXNlcy5yZXNpemUoY29uZmlnLT5udW1fcGhyYXNlcyk7Ci0KLSAgICBkZWxldGVbXSBoYWxFeHRyYXM7CiAKICAgICBoYWxDb25maWctPmRhdGEuc2V0VG9FeHRlcm5hbCgodWludDhfdCAqKWNvbmZpZyArIGNvbmZpZy0+ZGF0YV9vZmZzZXQsIGNvbmZpZy0+ZGF0YV9zaXplKTsKK30KIAotICAgIHJldHVybiBoYWxDb25maWc7CitzdGQ6OnBhaXI8Ym9vbCwgc3A8SU1lbW9yeT4+IFNvdW5kVHJpZ2dlckhhbEhpZGw6OmNvbnZlcnRSZWNvZ25pdGlvbkNvbmZpZ1RvSGFsKAorICAgICAgICBWMl8xX0lTb3VuZFRyaWdnZXJIdzo6UmVjb2duaXRpb25Db25maWcgKmhhbENvbmZpZywKKyAgICAgICAgY29uc3Qgc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fY29uZmlnICpjb25maWcpCit7CisgICAgY29udmVydFJlY29nbml0aW9uQ29uZmlnVG9IYWwoJmhhbENvbmZpZy0+aGVhZGVyLCBjb25maWcpOworICAgIHJldHVybiBtb3ZlVmVjdG9yVG9NZW1vcnkoJmhhbENvbmZpZy0+aGVhZGVyLmRhdGEsICZoYWxDb25maWctPmRhdGEpOwogfQogCiAKIC8vIElTb3VuZFRyaWdnZXJId0NhbGxiYWNrCiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gU291bmRUcmlnZ2VySGFsSGlkbDo6cmVjb2duaXRpb25DYWxsYmFjaygKLSAgICAgICAgY29uc3QgSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2s6OlJlY29nbml0aW9uRXZlbnQmIGhhbEV2ZW50LAorICAgICAgICBjb25zdCBWMl8wX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpSZWNvZ25pdGlvbkV2ZW50JiBoYWxFdmVudCwKICAgICAgICAgQ2FsbGJhY2tDb29raWUgY29va2llKQogewogICAgIHNwPFNvdW5kTW9kZWw+IG1vZGVsOwpAQCAtNDU5LDcgKzU3NCw3IEBACiB9CiAKIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiBTb3VuZFRyaWdnZXJIYWxIaWRsOjpwaHJhc2VSZWNvZ25pdGlvbkNhbGxiYWNrKAotICAgICAgICBjb25zdCBJU291bmRUcmlnZ2VySHdDYWxsYmFjazo6UGhyYXNlUmVjb2duaXRpb25FdmVudCYgaGFsRXZlbnQsCisgICAgICAgIGNvbnN0IFYyXzBfSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2s6OlBocmFzZVJlY29nbml0aW9uRXZlbnQmIGhhbEV2ZW50LAogICAgICAgICBDYWxsYmFja0Nvb2tpZSBjb29raWUpCiB7CiAgICAgc3A8U291bmRNb2RlbD4gbW9kZWw7CkBAIC00NzEsMTQgKzU4NiwxMyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQgKmV2ZW50ID0gY29udmVydFJlY29nbml0aW9uRXZlbnRGcm9tSGFsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2s6OlJlY29nbml0aW9uRXZlbnQgKikmaGFsRXZlbnQpOworICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX3BocmFzZV9yZWNvZ25pdGlvbl9ldmVudCAqZXZlbnQgPQorICAgICAgICAgICAgY29udmVydFBocmFzZVJlY29nbml0aW9uRXZlbnRGcm9tSGFsKCZoYWxFdmVudCk7CiAgICAgaWYgKGV2ZW50ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIFJldHVybjx2b2lkPigpOwogICAgIH0KLQotICAgIGV2ZW50LT5tb2RlbCA9IG1vZGVsLT5tSGFuZGxlOwotICAgIG1vZGVsLT5tUmVjb2duaXRpb25DYWxsYmFjayhldmVudCwgbW9kZWwtPm1SZWNvZ25pdGlvbkNvb2tpZSk7CisgICAgZXZlbnQtPmNvbW1vbi5tb2RlbCA9IG1vZGVsLT5tSGFuZGxlOworICAgIG1vZGVsLT5tUmVjb2duaXRpb25DYWxsYmFjaygmZXZlbnQtPmNvbW1vbiwgbW9kZWwtPm1SZWNvZ25pdGlvbkNvb2tpZSk7CiAKICAgICBmcmVlKGV2ZW50KTsKIApAQCAtNDg2LDcgKzYwMCw3IEBACiB9CiAKIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiBTb3VuZFRyaWdnZXJIYWxIaWRsOjpzb3VuZE1vZGVsQ2FsbGJhY2soCi0gICAgICAgIGNvbnN0IElTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpNb2RlbEV2ZW50JiBoYWxFdmVudCwKKyAgICAgICAgY29uc3QgVjJfMF9JU291bmRUcmlnZ2VySHdDYWxsYmFjazo6TW9kZWxFdmVudCYgaGFsRXZlbnQsCiAgICAgICAgIENhbGxiYWNrQ29va2llIGNvb2tpZSkKIHsKICAgICBzcDxTb3VuZE1vZGVsPiBtb2RlbDsKQEAgLTUxMSw5ICs2MjUsMzcgQEAKICAgICByZXR1cm4gUmV0dXJuPHZvaWQ+KCk7CiB9CiAKKzo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiBTb3VuZFRyaWdnZXJIYWxIaWRsOjpyZWNvZ25pdGlvbkNhbGxiYWNrXzJfMSgKKyAgICAgICAgY29uc3QgSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2s6OlJlY29nbml0aW9uRXZlbnQmIGV2ZW50LCBDYWxsYmFja0Nvb2tpZSBjb29raWUpIHsKKyAgICAvLyBUaGUgZGF0YSB2ZWN0b3IgaW4gdGhlICdoZWFkZXInIHBhcnQgb2YgVjIuMSBzdHJ1Y3R1cmUgaXMgZW1wdHksIHRodXMgY29weWluZyBpcyBjaGVhcC4KKyAgICBWMl8wX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpSZWNvZ25pdGlvbkV2ZW50IGV2ZW50XzJfMCA9IGV2ZW50LmhlYWRlcjsKKyAgICBhdXRvIHJlc3VsdCA9IG1lbW9yeUFzVmVjdG9yKGV2ZW50LmRhdGEsICZldmVudF8yXzAuZGF0YSk7CisgICAgcmV0dXJuIHJlc3VsdC5maXJzdCA/IHJlY29nbml0aW9uQ2FsbGJhY2soZXZlbnRfMl8wLCBjb29raWUpIDogVm9pZCgpOworfQorCis6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gU291bmRUcmlnZ2VySGFsSGlkbDo6cGhyYXNlUmVjb2duaXRpb25DYWxsYmFja18yXzEoCisgICAgICAgIGNvbnN0IElTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpQaHJhc2VSZWNvZ25pdGlvbkV2ZW50JiBldmVudCwgaW50MzJfdCBjb29raWUpIHsKKyAgICBWMl8wX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpQaHJhc2VSZWNvZ25pdGlvbkV2ZW50IGV2ZW50XzJfMDsKKyAgICAvLyBUaGUgZGF0YSB2ZWN0b3IgaW4gdGhlICdoZWFkZXInIHBhcnQgb2YgVjIuMSBzdHJ1Y3R1cmUgaXMgZW1wdHksIHRodXMgY29weWluZyBpcyBjaGVhcC4KKyAgICBldmVudF8yXzAuY29tbW9uID0gZXZlbnQuY29tbW9uLmhlYWRlcjsKKyAgICBldmVudF8yXzAucGhyYXNlRXh0cmFzLnNldFRvRXh0ZXJuYWwoCisgICAgICAgICAgICBjb25zdF9jYXN0PFBocmFzZVJlY29nbml0aW9uRXh0cmEqPihldmVudC5waHJhc2VFeHRyYXMuZGF0YSgpKSwKKyAgICAgICAgICAgIGV2ZW50LnBocmFzZUV4dHJhcy5zaXplKCkpOworICAgIGF1dG8gcmVzdWx0ID0gbWVtb3J5QXNWZWN0b3IoZXZlbnQuY29tbW9uLmRhdGEsICZldmVudF8yXzAuY29tbW9uLmRhdGEpOworICAgIHJldHVybiByZXN1bHQuZmlyc3QgPyBwaHJhc2VSZWNvZ25pdGlvbkNhbGxiYWNrKGV2ZW50XzJfMCwgY29va2llKSA6IFZvaWQoKTsKK30KKworOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IFNvdW5kVHJpZ2dlckhhbEhpZGw6OnNvdW5kTW9kZWxDYWxsYmFja18yXzEoCisgICAgICAgIGNvbnN0IElTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpNb2RlbEV2ZW50JiBldmVudCwgQ2FsbGJhY2tDb29raWUgY29va2llKSB7CisgICAgLy8gVGhlIGRhdGEgdmVjdG9yIGluIHRoZSAnaGVhZGVyJyBwYXJ0IG9mIFYyLjEgc3RydWN0dXJlIGlzIGVtcHR5LCB0aHVzIGNvcHlpbmcgaXMgY2hlYXAuCisgICAgVjJfMF9JU291bmRUcmlnZ2VySHdDYWxsYmFjazo6TW9kZWxFdmVudCBldmVudF8yXzAgPSBldmVudC5oZWFkZXI7CisgICAgYXV0byByZXN1bHQgPSBtZW1vcnlBc1ZlY3RvcihldmVudC5kYXRhLCAmZXZlbnRfMl8wLmRhdGEpOworICAgIHJldHVybiByZXN1bHQuZmlyc3QgPyBzb3VuZE1vZGVsQ2FsbGJhY2soZXZlbnRfMl8wLCBjb29raWUpIDogVm9pZCgpOworfQorCiAKIHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50ICpTb3VuZFRyaWdnZXJIYWxIaWRsOjpjb252ZXJ0U291bmRNb2RlbEV2ZW50RnJvbUhhbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJU291bmRUcmlnZ2VySHdDYWxsYmFjazo6TW9kZWxFdmVudCAqaGFsRXZlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVjJfMF9JU291bmRUcmlnZ2VySHdDYWxsYmFjazo6TW9kZWxFdmVudCAqaGFsRXZlbnQpCiB7CiAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kZWxfZXZlbnQgKmV2ZW50ID0gKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50ICopbWFsbG9jKAogICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50KSArCkBAIC01NTAsMzcgKzY5Miw1NSBAQAogfQogCiAKLXN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50ICpTb3VuZFRyaWdnZXJIYWxIaWRsOjpjb252ZXJ0UmVjb2duaXRpb25FdmVudEZyb21IYWwoCi0gICAgICAgIGNvbnN0IElTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpSZWNvZ25pdGlvbkV2ZW50ICpoYWxFdmVudCkKK3N0cnVjdCBzb3VuZF90cmlnZ2VyX3BocmFzZV9yZWNvZ25pdGlvbl9ldmVudCogU291bmRUcmlnZ2VySGFsSGlkbDo6Y29udmVydFBocmFzZVJlY29nbml0aW9uRXZlbnRGcm9tSGFsKAorICAgICAgICBjb25zdCBWMl8wX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpQaHJhc2VSZWNvZ25pdGlvbkV2ZW50ICpoYWxQaHJhc2VFdmVudCkKIHsKLSAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCAqZXZlbnQ7Ci0KLSAgICBpZiAoaGFsRXZlbnQtPnR5cGUgPT0gU291bmRNb2RlbFR5cGU6OktFWVBIUkFTRSkgewotICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9waHJhc2VfcmVjb2duaXRpb25fZXZlbnQgKnBocmFzZUV2ZW50ID0KLSAgICAgICAgICAgICAgICAoc3RydWN0IHNvdW5kX3RyaWdnZXJfcGhyYXNlX3JlY29nbml0aW9uX2V2ZW50ICopbWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3BocmFzZV9yZWNvZ25pdGlvbl9ldmVudCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgaGFsRXZlbnQtPmRhdGEuc2l6ZSgpKTsKLSAgICAgICAgaWYgKHBocmFzZUV2ZW50ID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IElTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpQaHJhc2VSZWNvZ25pdGlvbkV2ZW50ICpoYWxQaHJhc2VFdmVudCA9Ci0gICAgICAgICAgICAgICAgKGNvbnN0IElTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpQaHJhc2VSZWNvZ25pdGlvbkV2ZW50ICopaGFsRXZlbnQ7Ci0KLSAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBoYWxQaHJhc2VFdmVudC0+cGhyYXNlRXh0cmFzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjb252ZXJ0UGhyYXNlUmVjb2duaXRpb25FeHRyYUZyb21IYWwoJnBocmFzZUV2ZW50LT5waHJhc2VfZXh0cmFzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoYWxQaHJhc2VFdmVudC0+cGhyYXNlRXh0cmFzW2ldKTsKLSAgICAgICAgfQotICAgICAgICBwaHJhc2VFdmVudC0+bnVtX3BocmFzZXMgPSBoYWxQaHJhc2VFdmVudC0+cGhyYXNlRXh0cmFzLnNpemUoKTsKLSAgICAgICAgZXZlbnQgPSAoc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQgKilwaHJhc2VFdmVudDsKLSAgICAgICAgZXZlbnQtPmRhdGFfb2Zmc2V0ID0gc2l6ZW9mKHNvdW5kX3RyaWdnZXJfcGhyYXNlX3JlY29nbml0aW9uX2V2ZW50KTsKLSAgICB9IGVsc2UgewotICAgICAgICBldmVudCA9IChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCAqKW1hbGxvYygKLSAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQpICsgaGFsRXZlbnQtPmRhdGEuc2l6ZSgpKTsKLSAgICAgICAgaWYgKGV2ZW50ID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGV2ZW50LT5kYXRhX29mZnNldCA9IHNpemVvZihzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50KTsKKyAgICBpZiAoaGFsUGhyYXNlRXZlbnQtPmNvbW1vbi50eXBlICE9IFNvdW5kTW9kZWxUeXBlOjpLRVlQSFJBU0UpIHsKKyAgICAgICAgQUxPR0UoIlJlY2VpdmVkIG5vbi1rZXlwaHJhc2UgZXZlbnQgdHlwZSBhcyBQaHJhc2VSZWNvZ25pdGlvbkV2ZW50Iik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KKyAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9waHJhc2VfcmVjb2duaXRpb25fZXZlbnQgKnBocmFzZUV2ZW50ID0KKyAgICAgICAgICAgIChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9waHJhc2VfcmVjb2duaXRpb25fZXZlbnQgKiltYWxsb2MoCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9waHJhc2VfcmVjb2duaXRpb25fZXZlbnQpICsKKyAgICAgICAgICAgICAgICAgICAgaGFsUGhyYXNlRXZlbnQtPmNvbW1vbi5kYXRhLnNpemUoKSk7CisgICAgaWYgKHBocmFzZUV2ZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHBocmFzZUV2ZW50LT5jb21tb24uZGF0YV9vZmZzZXQgPSBzaXplb2Yoc291bmRfdHJpZ2dlcl9waHJhc2VfcmVjb2duaXRpb25fZXZlbnQpOworCisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBoYWxQaHJhc2VFdmVudC0+cGhyYXNlRXh0cmFzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnZlcnRQaHJhc2VSZWNvZ25pdGlvbkV4dHJhRnJvbUhhbCgmcGhyYXNlRXZlbnQtPnBocmFzZV9leHRyYXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFsUGhyYXNlRXZlbnQtPnBocmFzZUV4dHJhc1tpXSk7CisgICAgfQorICAgIHBocmFzZUV2ZW50LT5udW1fcGhyYXNlcyA9IGhhbFBocmFzZUV2ZW50LT5waHJhc2VFeHRyYXMuc2l6ZSgpOworCisgICAgZmlsbFJlY29nbml0aW9uRXZlbnRGcm9tSGFsKCZwaHJhc2VFdmVudC0+Y29tbW9uLCAmaGFsUGhyYXNlRXZlbnQtPmNvbW1vbik7CisgICAgcmV0dXJuIHBocmFzZUV2ZW50OworfQorCitzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCAqU291bmRUcmlnZ2VySGFsSGlkbDo6Y29udmVydFJlY29nbml0aW9uRXZlbnRGcm9tSGFsKAorICAgICAgICBjb25zdCBWMl8wX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpSZWNvZ25pdGlvbkV2ZW50ICpoYWxFdmVudCkKK3sKKyAgICBpZiAoaGFsRXZlbnQtPnR5cGUgPT0gU291bmRNb2RlbFR5cGU6OktFWVBIUkFTRSkgeworICAgICAgICBBTE9HRSgiUmVjZWl2ZWQga2V5cGhyYXNlIGV2ZW50IHR5cGUgYXMgUmVjb2duaXRpb25FdmVudCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQgKmV2ZW50OworICAgIGV2ZW50ID0gKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50ICopbWFsbG9jKAorICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50KSArIGhhbEV2ZW50LT5kYXRhLnNpemUoKSk7CisgICAgaWYgKGV2ZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGV2ZW50LT5kYXRhX29mZnNldCA9IHNpemVvZihzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50KTsKKworICAgIGZpbGxSZWNvZ25pdGlvbkV2ZW50RnJvbUhhbChldmVudCwgaGFsRXZlbnQpOworICAgIHJldHVybiBldmVudDsKK30KKwordm9pZCBTb3VuZFRyaWdnZXJIYWxIaWRsOjpmaWxsUmVjb2duaXRpb25FdmVudEZyb21IYWwoCisgICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50ICpldmVudCwKKyAgICAgICAgY29uc3QgVjJfMF9JU291bmRUcmlnZ2VySHdDYWxsYmFjazo6UmVjb2duaXRpb25FdmVudCAqaGFsRXZlbnQpCit7CiAgICAgZXZlbnQtPnN0YXR1cyA9IChpbnQpaGFsRXZlbnQtPnN0YXR1czsKICAgICBldmVudC0+dHlwZSA9IChzb3VuZF90cmlnZ2VyX3NvdW5kX21vZGVsX3R5cGVfdCloYWxFdmVudC0+dHlwZTsKICAgICAvLyBldmVudC0+bW9kZWwgdG8gYmUgc2V0IGJ5IGNhbGxlcgpAQCAtNTk3LDggKzc1Nyw2IEBACiAgICAgdWludDhfdCAqZHN0ID0gKHVpbnQ4X3QgKilldmVudCArIGV2ZW50LT5kYXRhX29mZnNldDsKICAgICB1aW50OF90ICpzcmMgPSAodWludDhfdCAqKSZoYWxFdmVudC0+ZGF0YVswXTsKICAgICBtZW1jcHkoZHN0LCBzcmMsIGhhbEV2ZW50LT5kYXRhLnNpemUoKSk7Ci0KLSAgICByZXR1cm4gZXZlbnQ7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmggYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5oCmluZGV4IDBjNjhjZjEuLjBiNDRhZTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmgKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEhpZGwuaApAQCAtMTcsNiArMTcsOCBAQAogI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NPVU5EVFJJR0dFUl9IQUxfSElETF9ICiAjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU09VTkRUUklHR0VSX0hBTF9ISURMX0gKIAorI2luY2x1ZGUgPHV0aWxpdHk+CisKICNpbmNsdWRlIDxzdGRhdG9taWMuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KQEAgLTI0LDIxICsyNiwyOSBAQAogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlICJTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2UuaCIKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3NvdW5kdHJpZ2dlci8yLjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3NvdW5kdHJpZ2dlci8yLjAvSVNvdW5kVHJpZ2dlckh3Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9zb3VuZHRyaWdnZXIvMi4xL0lTb3VuZFRyaWdnZXJIdy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvc291bmR0cmlnZ2VyLzIuMC9JU291bmRUcmlnZ2VySHdDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvc291bmR0cmlnZ2VyLzIuMS9JU291bmRUcmlnZ2VySHdDYWxsYmFjay5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpVdWlkOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OnNvdW5kdHJpZ2dlcjo6VjJfMDo6Q29uZmlkZW5jZUxldmVsOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OnNvdW5kdHJpZ2dlcjo6VjJfMDo6UGhyYXNlUmVjb2duaXRpb25FeHRyYTsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpzb3VuZHRyaWdnZXI6OlYyXzA6OlNvdW5kTW9kZWxUeXBlOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OnNvdW5kdHJpZ2dlcjo6VjJfMDo6U291bmRNb2RlbEhhbmRsZTsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpzb3VuZHRyaWdnZXI6OlYyXzA6OklTb3VuZFRyaWdnZXJIdzsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpzb3VuZHRyaWdnZXI6OlYyXzA6OklTb3VuZFRyaWdnZXJId0NhbGxiYWNrOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6VXVpZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6c291bmR0cmlnZ2VyOjpWMl8wOjpDb25maWRlbmNlTGV2ZWw7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpzb3VuZHRyaWdnZXI6OlYyXzA6OlBocmFzZVJlY29nbml0aW9uRXh0cmE7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpzb3VuZHRyaWdnZXI6OlYyXzA6OlNvdW5kTW9kZWxUeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6c291bmR0cmlnZ2VyOjpWMl8wOjpTb3VuZE1vZGVsSGFuZGxlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6c291bmR0cmlnZ2VyOjpWMl8wOjpJU291bmRUcmlnZ2VySHc7Cit1c2luZyBWMl8wX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrID0KKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6c291bmR0cmlnZ2VyOjpWMl8wOjpJU291bmRUcmlnZ2VySHdDYWxsYmFjazsKK3VzaW5nIFYyXzFfSVNvdW5kVHJpZ2dlckh3ID0KKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6c291bmR0cmlnZ2VyOjpWMl8xOjpJU291bmRUcmlnZ2VySHc7Cit1c2luZyBWMl8xX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrID0KKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6c291bmR0cmlnZ2VyOjpWMl8xOjpJU291bmRUcmlnZ2VySHdDYWxsYmFjazsKK3VzaW5nIDo6YW5kcm9pZDo6aGlkbDo6bWVtb3J5OjpWMV8wOjpJTWVtb3J5OwogCiBjbGFzcyBTb3VuZFRyaWdnZXJIYWxIaWRsIDogcHVibGljIFNvdW5kVHJpZ2dlckhhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdmlydHVhbCBJU291bmRUcmlnZ2VySHdDYWxsYmFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2aXJ0dWFsIFYyXzFfSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2sKIAogewogcHVibGljOgpAQCAtODQsMTEgKzk0LDE3IEBACiAKICAgICAgICAgLy8gSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2sKICAgICAgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmVjb2duaXRpb25DYWxsYmFjaygKLSAgICAgICAgICAgICAgICBjb25zdCBJU291bmRUcmlnZ2VySHdDYWxsYmFjazo6UmVjb2duaXRpb25FdmVudCYgZXZlbnQsIENhbGxiYWNrQ29va2llIGNvb2tpZSk7CisgICAgICAgICAgICAgICAgY29uc3QgVjJfMF9JU291bmRUcmlnZ2VySHdDYWxsYmFjazo6UmVjb2duaXRpb25FdmVudCYgZXZlbnQsIENhbGxiYWNrQ29va2llIGNvb2tpZSk7CiAgICAgICAgIHZpcnR1YWwgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHBocmFzZVJlY29nbml0aW9uQ2FsbGJhY2soCi0gICAgICAgICAgICAgICAgY29uc3QgSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2s6OlBocmFzZVJlY29nbml0aW9uRXZlbnQmIGV2ZW50LCBpbnQzMl90IGNvb2tpZSk7CisgICAgICAgICAgICAgICAgY29uc3QgVjJfMF9JU291bmRUcmlnZ2VySHdDYWxsYmFjazo6UGhyYXNlUmVjb2duaXRpb25FdmVudCYgZXZlbnQsIGludDMyX3QgY29va2llKTsKICAgICAgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gc291bmRNb2RlbENhbGxiYWNrKAotICAgICAgICAgICAgICAgIGNvbnN0IElTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpNb2RlbEV2ZW50JiBldmVudCwgQ2FsbGJhY2tDb29raWUgY29va2llKTsKKyAgICAgICAgICAgICAgICBjb25zdCBWMl8wX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpNb2RlbEV2ZW50JiBldmVudCwgQ2FsbGJhY2tDb29raWUgY29va2llKTsKKyAgICAgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmVjb2duaXRpb25DYWxsYmFja18yXzEoCisgICAgICAgICAgICAgICAgY29uc3QgUmVjb2duaXRpb25FdmVudCYgZXZlbnQsIENhbGxiYWNrQ29va2llIGNvb2tpZSk7CisgICAgICAgIHZpcnR1YWwgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHBocmFzZVJlY29nbml0aW9uQ2FsbGJhY2tfMl8xKAorICAgICAgICAgICAgICAgIGNvbnN0IFBocmFzZVJlY29nbml0aW9uRXZlbnQmIGV2ZW50LCBpbnQzMl90IGNvb2tpZSk7CisgICAgICAgIHZpcnR1YWwgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHNvdW5kTW9kZWxDYWxsYmFja18yXzEoCisgICAgICAgICAgICAgICAgY29uc3QgTW9kZWxFdmVudCYgZXZlbnQsIENhbGxiYWNrQ29va2llIGNvb2tpZSk7CiBwcml2YXRlOgogICAgICAgICBjbGFzcyBTb3VuZE1vZGVsIDogcHVibGljIFJlZkJhc2UgewogICAgICAgICBwdWJsaWM6CkBAIC0xMjQsMjUgKzE0MCw0OCBAQAogICAgICAgICB2b2lkIGNvbnZlcnRUcmlnZ2VyUGhyYXNlVG9IYWwoCiAgICAgICAgICAgICAgICAgSVNvdW5kVHJpZ2dlckh3OjpQaHJhc2UgKmhhbFRyaWdnZXJQaHJhc2UsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHNvdW5kX3RyaWdnZXJfcGhyYXNlICp0cmlnZ2VyUGhyYXNlKTsKLSAgICAgICAgSVNvdW5kVHJpZ2dlckh3OjpTb3VuZE1vZGVsICpjb252ZXJ0U291bmRNb2RlbFRvSGFsKAorICAgICAgICB2b2lkIGNvbnZlcnRUcmlnZ2VyUGhyYXNlc1RvSGFsKAorICAgICAgICAgICAgICAgIGhpZGxfdmVjPElTb3VuZFRyaWdnZXJIdzo6UGhyYXNlPiAqaGFsVHJpZ2dlclBocmFzZXMsCisgICAgICAgICAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfcGhyYXNlX3NvdW5kX21vZGVsICprZXlQaHJhc2VNb2RlbCk7CisgICAgICAgIHZvaWQgY29udmVydFNvdW5kTW9kZWxUb0hhbChJU291bmRUcmlnZ2VySHc6OlNvdW5kTW9kZWwgKmhhbE1vZGVsLAogICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb3VuZF90cmlnZ2VyX3NvdW5kX21vZGVsICpzb3VuZE1vZGVsKTsKKyAgICAgICAgc3RkOjpwYWlyPGJvb2wsIHNwPElNZW1vcnk+PiBjb252ZXJ0U291bmRNb2RlbFRvSGFsKAorICAgICAgICAgICAgICAgIFYyXzFfSVNvdW5kVHJpZ2dlckh3OjpTb3VuZE1vZGVsICpoYWxNb2RlbCwKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9zb3VuZF9tb2RlbCAqc291bmRNb2RlbCkKKyAgICAgICAgICAgICAgICBfX2F0dHJpYnV0ZV9fKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKKyAgICAgICAgdm9pZCBjb252ZXJ0UGhyYXNlU291bmRNb2RlbFRvSGFsKElTb3VuZFRyaWdnZXJIdzo6UGhyYXNlU291bmRNb2RlbCAqaGFsS2V5UGhyYXNlTW9kZWwsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHNvdW5kX3RyaWdnZXJfc291bmRfbW9kZWwgKnNvdW5kTW9kZWwpOworICAgICAgICBzdGQ6OnBhaXI8Ym9vbCwgc3A8SU1lbW9yeT4+IGNvbnZlcnRQaHJhc2VTb3VuZE1vZGVsVG9IYWwoCisgICAgICAgICAgICAgICAgVjJfMV9JU291bmRUcmlnZ2VySHc6OlBocmFzZVNvdW5kTW9kZWwgKmhhbEtleVBocmFzZU1vZGVsLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb3VuZF90cmlnZ2VyX3NvdW5kX21vZGVsICpzb3VuZE1vZGVsKQorICAgICAgICAgICAgICAgIF9fYXR0cmlidXRlX18oKHdhcm5fdW51c2VkX3Jlc3VsdCkpOwogCiAgICAgICAgIHZvaWQgY29udmVydFBocmFzZVJlY29nbml0aW9uRXh0cmFUb0hhbCgKICAgICAgICAgICAgICAgICBQaHJhc2VSZWNvZ25pdGlvbkV4dHJhICpoYWxFeHRyYSwKICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9waHJhc2VfcmVjb2duaXRpb25fZXh0cmEgKmV4dHJhKTsKLSAgICAgICAgSVNvdW5kVHJpZ2dlckh3OjpSZWNvZ25pdGlvbkNvbmZpZyAqY29udmVydFJlY29nbml0aW9uQ29uZmlnVG9IYWwoCisgICAgICAgIHZvaWQgY29udmVydFJlY29nbml0aW9uQ29uZmlnVG9IYWwoSVNvdW5kVHJpZ2dlckh3OjpSZWNvZ25pdGlvbkNvbmZpZyAqaGFsQ29uZmlnLAogICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2NvbmZpZyAqY29uZmlnKTsKKyAgICAgICAgc3RkOjpwYWlyPGJvb2wsIHNwPElNZW1vcnk+PiBjb252ZXJ0UmVjb2duaXRpb25Db25maWdUb0hhbCgKKyAgICAgICAgICAgICAgICBWMl8xX0lTb3VuZFRyaWdnZXJIdzo6UmVjb2duaXRpb25Db25maWcgKmhhbENvbmZpZywKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9jb25maWcgKmNvbmZpZykKKyAgICAgICAgICAgICAgICBfX2F0dHJpYnV0ZV9fKCh3YXJuX3VudXNlZF9yZXN1bHQpKTsKIAogICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2RlbF9ldmVudCAqY29udmVydFNvdW5kTW9kZWxFdmVudEZyb21IYWwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2s6Ok1vZGVsRXZlbnQgKmhhbEV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWMl8wX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpNb2RlbEV2ZW50ICpoYWxFdmVudCk7CiAgICAgICAgIHZvaWQgY29udmVydFBocmFzZVJlY29nbml0aW9uRXh0cmFGcm9tSGFsKAogICAgICAgICAgICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX3BocmFzZV9yZWNvZ25pdGlvbl9leHRyYSAqZXh0cmEsCiAgICAgICAgICAgICAgICAgY29uc3QgUGhyYXNlUmVjb2duaXRpb25FeHRyYSAqaGFsRXh0cmEpOworICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9waHJhc2VfcmVjb2duaXRpb25fZXZlbnQqIGNvbnZlcnRQaHJhc2VSZWNvZ25pdGlvbkV2ZW50RnJvbUhhbCgKKyAgICAgICAgICAgICAgICBjb25zdCBWMl8wX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpQaHJhc2VSZWNvZ25pdGlvbkV2ZW50ICpoYWxQaHJhc2VFdmVudCk7CiAgICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50ICpjb252ZXJ0UmVjb2duaXRpb25FdmVudEZyb21IYWwoCi0gICAgICAgICAgICAgICAgY29uc3QgSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2s6OlJlY29nbml0aW9uRXZlbnQgKmhhbEV2ZW50KTsKKyAgICAgICAgICAgICAgICBjb25zdCBWMl8wX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpSZWNvZ25pdGlvbkV2ZW50ICpoYWxFdmVudCk7CisgICAgICAgIHZvaWQgZmlsbFJlY29nbml0aW9uRXZlbnRGcm9tSGFsKAorICAgICAgICAgICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50ICpldmVudCwKKyAgICAgICAgICAgICAgICBjb25zdCBWMl8wX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpSZWNvZ25pdGlvbkV2ZW50ICpoYWxFdmVudCk7CiAKICAgICAgICAgdWludDMyX3QgbmV4dFVuaXF1ZUlkKCk7CiAgICAgICAgIHNwPElTb3VuZFRyaWdnZXJIdz4gZ2V0U2VydmljZSgpOworICAgICAgICBzcDxWMl8xX0lTb3VuZFRyaWdnZXJIdz4gdG9TZXJ2aWNlMl8xKGNvbnN0IHNwPElTb3VuZFRyaWdnZXJIdz4mIHMpOwogICAgICAgICBzcDxTb3VuZE1vZGVsPiBnZXRNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOwogICAgICAgICBzcDxTb3VuZE1vZGVsPiByZW1vdmVNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCmluZGV4IDIyNTE5YTMuLmE3ZDZlODMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCkBAIC0yMDYsOSArMjA2LDEwIEBACiAgICAgc2VydmljZS0+c2VuZFJlY29nbml0aW9uRXZlbnQoZXZlbnQsIG1vZHVsZSk7CiB9CiAKLXNwPElNZW1vcnk+IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6cHJlcGFyZVJlY29nbml0aW9uRXZlbnRfbCgKK3NwPElNZW1vcnk+IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6cHJlcGFyZVJlY29nbml0aW9uRXZlbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQgKmV2ZW50KQogeworICAgIEF1dG9NdXRleCBsb2NrKG1NZW1vcnlEZWFsZXJMb2NrKTsKICAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeTsKIAogICAgIC8vc2FuaXRpemUgZXZlbnQKQEAgLTIxNiwyMSArMjE3LDIxIEBACiAgICAgY2FzZSBTT1VORF9NT0RFTF9UWVBFX0tFWVBIUkFTRToKICAgICAgICAgQUxPR1dfSUYoZXZlbnQtPmRhdGFfc2l6ZSAhPSAwICYmIGV2ZW50LT5kYXRhX29mZnNldCAhPQogICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHNvdW5kX3RyaWdnZXJfcGhyYXNlX3JlY29nbml0aW9uX2V2ZW50KSwKLSAgICAgICAgICAgICAgICAgICAgInByZXBhcmVSZWNvZ25pdGlvbkV2ZW50X2woKTogaW52YWxpZCBkYXRhIG9mZnNldCAldSBmb3Iga2V5cGhyYXNlIGV2ZW50IHR5cGUiLAorICAgICAgICAgICAgICAgICAgICAicHJlcGFyZVJlY29nbml0aW9uRXZlbnQoKTogaW52YWxpZCBkYXRhIG9mZnNldCAldSBmb3Iga2V5cGhyYXNlIGV2ZW50IHR5cGUiLAogICAgICAgICAgICAgICAgICAgICBldmVudC0+ZGF0YV9vZmZzZXQpOwogICAgICAgICBldmVudC0+ZGF0YV9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IHNvdW5kX3RyaWdnZXJfcGhyYXNlX3JlY29nbml0aW9uX2V2ZW50KTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBTT1VORF9NT0RFTF9UWVBFX0dFTkVSSUM6CiAgICAgICAgIEFMT0dXX0lGKGV2ZW50LT5kYXRhX3NpemUgIT0gMCAmJiBldmVudC0+ZGF0YV9vZmZzZXQgIT0KICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX2dlbmVyaWNfcmVjb2duaXRpb25fZXZlbnQpLAotICAgICAgICAgICAgICAgICAgICAicHJlcGFyZVJlY29nbml0aW9uRXZlbnRfbCgpOiBpbnZhbGlkIGRhdGEgb2Zmc2V0ICV1IGZvciBnZW5lcmljIGV2ZW50IHR5cGUiLAorICAgICAgICAgICAgICAgICAgICAicHJlcGFyZVJlY29nbml0aW9uRXZlbnQoKTogaW52YWxpZCBkYXRhIG9mZnNldCAldSBmb3IgZ2VuZXJpYyBldmVudCB0eXBlIiwKICAgICAgICAgICAgICAgICAgICAgZXZlbnQtPmRhdGFfb2Zmc2V0KTsKICAgICAgICAgZXZlbnQtPmRhdGFfb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX2dlbmVyaWNfcmVjb2duaXRpb25fZXZlbnQpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIFNPVU5EX01PREVMX1RZUEVfVU5LTk9XTjoKICAgICAgICAgQUxPR1dfSUYoZXZlbnQtPmRhdGFfc2l6ZSAhPSAwICYmIGV2ZW50LT5kYXRhX29mZnNldCAhPQogICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQpLAotICAgICAgICAgICAgICAgICAgICAicHJlcGFyZVJlY29nbml0aW9uRXZlbnRfbCgpOiBpbnZhbGlkIGRhdGEgb2Zmc2V0ICV1IGZvciB1bmtub3duIGV2ZW50IHR5cGUiLAorICAgICAgICAgICAgICAgICAgICAicHJlcGFyZVJlY29nbml0aW9uRXZlbnQoKTogaW52YWxpZCBkYXRhIG9mZnNldCAldSBmb3IgdW5rbm93biBldmVudCB0eXBlIiwKICAgICAgICAgICAgICAgICAgICAgZXZlbnQtPmRhdGFfb2Zmc2V0KTsKICAgICAgICAgZXZlbnQtPmRhdGFfb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50KTsKICAgICAgICAgYnJlYWs7CkBAIC0yNTEsMzAgKzI1MiwxOSBAQAogCiB2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6c2VuZFJlY29nbml0aW9uRXZlbnQoc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQgKmV2ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZSAqbW9kdWxlKQotIHsKLSAgICAgQXV0b011dGV4IGxvY2sobVNlcnZpY2VMb2NrKTsKLSAgICAgaWYgKG1vZHVsZSA9PSBOVUxMKSB7Ci0gICAgICAgICByZXR1cm47Ci0gICAgIH0KLSAgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnkgPSBwcmVwYXJlUmVjb2duaXRpb25FdmVudF9sKGV2ZW50KTsKLSAgICAgaWYgKGV2ZW50TWVtb3J5ID09IDApIHsKLSAgICAgICAgIHJldHVybjsKLSAgICAgfQotICAgICBzcDxNb2R1bGU+IHN0cm9uZ01vZHVsZTsKLSAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kdWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgaWYgKG1Nb2R1bGVzLnZhbHVlQXQoaSkuZ2V0KCkgPT0gbW9kdWxlKSB7Ci0gICAgICAgICAgICAgc3Ryb25nTW9kdWxlID0gbU1vZHVsZXMudmFsdWVBdChpKTsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgfQotICAgICBpZiAoc3Ryb25nTW9kdWxlID09IDApIHsKLSAgICAgICAgIHJldHVybjsKLSAgICAgfQoreworICAgIGlmIChtb2R1bGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gcHJlcGFyZVJlY29nbml0aW9uRXZlbnQoZXZlbnQpOworICAgIGlmIChldmVudE1lbW9yeSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICBzcDxDYWxsYmFja0V2ZW50PiBjYWxsYmFja0V2ZW50ID0gbmV3IENhbGxiYWNrRXZlbnQoQ2FsbGJhY2tFdmVudDo6VFlQRV9SRUNPR05JVElPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRNZW1vcnkpOwotICAgIGNhbGxiYWNrRXZlbnQtPnNldE1vZHVsZShzdHJvbmdNb2R1bGUpOwotICAgIHNlbmRDYWxsYmFja0V2ZW50X2woY2FsbGJhY2tFdmVudCk7CisgICAgY2FsbGJhY2tFdmVudC0+c2V0TW9kdWxlKG1vZHVsZSk7CisgICAgc2VuZENhbGxiYWNrRXZlbnQoY2FsbGJhY2tFdmVudCk7CiB9CiAKIC8vIHN0YXRpYwpAQCAtMjkzLDggKzI4Myw5IEBACiAgICAgc2VydmljZS0+c2VuZFNvdW5kTW9kZWxFdmVudChldmVudCwgbW9kdWxlKTsKIH0KIAotc3A8SU1lbW9yeT4gU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpwcmVwYXJlU291bmRNb2RlbEV2ZW50X2woc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kZWxfZXZlbnQgKmV2ZW50KQorc3A8SU1lbW9yeT4gU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpwcmVwYXJlU291bmRNb2RlbEV2ZW50KHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50ICpldmVudCkKIHsKKyAgICBBdXRvTXV0ZXggbG9jayhtTWVtb3J5RGVhbGVyTG9jayk7CiAgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnk7CiAKICAgICBzaXplX3Qgc2l6ZSA9IGV2ZW50LT5kYXRhX29mZnNldCArIGV2ZW50LT5kYXRhX3NpemU7CkBAIC0zMTEsMzAgKzMwMiwyMCBAQAogdm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OnNlbmRTb3VuZE1vZGVsRXZlbnQoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kZWxfZXZlbnQgKmV2ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlICptb2R1bGUpCiB7Ci0gICAgQXV0b011dGV4IGxvY2sobVNlcnZpY2VMb2NrKTsKLSAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeSA9IHByZXBhcmVTb3VuZE1vZGVsRXZlbnRfbChldmVudCk7CisgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnkgPSBwcmVwYXJlU291bmRNb2RlbEV2ZW50KGV2ZW50KTsKICAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIHNwPE1vZHVsZT4gc3Ryb25nTW9kdWxlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1Nb2R1bGVzLnZhbHVlQXQoaSkuZ2V0KCkgPT0gbW9kdWxlKSB7Ci0gICAgICAgICAgICBzdHJvbmdNb2R1bGUgPSBtTW9kdWxlcy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHN0cm9uZ01vZHVsZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CiAgICAgc3A8Q2FsbGJhY2tFdmVudD4gY2FsbGJhY2tFdmVudCA9IG5ldyBDYWxsYmFja0V2ZW50KENhbGxiYWNrRXZlbnQ6OlRZUEVfU09VTkRNT0RFTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRNZW1vcnkpOwotICAgIGNhbGxiYWNrRXZlbnQtPnNldE1vZHVsZShzdHJvbmdNb2R1bGUpOwotICAgIHNlbmRDYWxsYmFja0V2ZW50X2woY2FsbGJhY2tFdmVudCk7CisgICAgY2FsbGJhY2tFdmVudC0+c2V0TW9kdWxlKG1vZHVsZSk7CisgICAgc2VuZENhbGxiYWNrRXZlbnQoY2FsbGJhY2tFdmVudCk7CiB9CiAKIAotc3A8SU1lbW9yeT4gU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpwcmVwYXJlU2VydmljZVN0YXRlRXZlbnRfbChzb3VuZF90cmlnZ2VyX3NlcnZpY2Vfc3RhdGVfdCBzdGF0ZSkKK3NwPElNZW1vcnk+IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6cHJlcGFyZVNlcnZpY2VTdGF0ZUV2ZW50KHNvdW5kX3RyaWdnZXJfc2VydmljZV9zdGF0ZV90IHN0YXRlKQogeworICAgIEF1dG9NdXRleCBsb2NrKG1NZW1vcnlEZWFsZXJMb2NrKTsKICAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeTsKIAogICAgIHNpemVfdCBzaXplID0gc2l6ZW9mKHNvdW5kX3RyaWdnZXJfc2VydmljZV9zdGF0ZV90KTsKQEAgLTM0Nyw0NSArMzI4LDMzIEBACiAgICAgcmV0dXJuIGV2ZW50TWVtb3J5OwogfQogCi0vLyBjYWxsIHdpdGggbVNlcnZpY2VMb2NrIGhlbGQKLXZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpzZW5kU2VydmljZVN0YXRlRXZlbnRfbChzb3VuZF90cmlnZ2VyX3NlcnZpY2Vfc3RhdGVfdCBzdGF0ZSwKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpzZW5kU2VydmljZVN0YXRlRXZlbnQoc291bmRfdHJpZ2dlcl9zZXJ2aWNlX3N0YXRlX3Qgc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZSAqbW9kdWxlKQogewotICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gcHJlcGFyZVNlcnZpY2VTdGF0ZUV2ZW50X2woc3RhdGUpOworICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gcHJlcGFyZVNlcnZpY2VTdGF0ZUV2ZW50KHN0YXRlKTsKICAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIHNwPE1vZHVsZT4gc3Ryb25nTW9kdWxlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1Nb2R1bGVzLnZhbHVlQXQoaSkuZ2V0KCkgPT0gbW9kdWxlKSB7Ci0gICAgICAgICAgICBzdHJvbmdNb2R1bGUgPSBtTW9kdWxlcy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHN0cm9uZ01vZHVsZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CiAgICAgc3A8Q2FsbGJhY2tFdmVudD4gY2FsbGJhY2tFdmVudCA9IG5ldyBDYWxsYmFja0V2ZW50KENhbGxiYWNrRXZlbnQ6OlRZUEVfU0VSVklDRV9TVEFURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRNZW1vcnkpOwotICAgIGNhbGxiYWNrRXZlbnQtPnNldE1vZHVsZShzdHJvbmdNb2R1bGUpOwotICAgIHNlbmRDYWxsYmFja0V2ZW50X2woY2FsbGJhY2tFdmVudCk7CisgICAgY2FsbGJhY2tFdmVudC0+c2V0TW9kdWxlKG1vZHVsZSk7CisgICAgc2VuZENhbGxiYWNrRXZlbnQoY2FsbGJhY2tFdmVudCk7CiB9CiAKLXZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpzZW5kU2VydmljZVN0YXRlRXZlbnRfbChzb3VuZF90cmlnZ2VyX3NlcnZpY2Vfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVDbGllbnQgKm1vZHVsZUNsaWVudCkKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpzZW5kU2VydmljZVN0YXRlRXZlbnQoc291bmRfdHJpZ2dlcl9zZXJ2aWNlX3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZUNsaWVudCAqbW9kdWxlQ2xpZW50KQogewotICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gcHJlcGFyZVNlcnZpY2VTdGF0ZUV2ZW50X2woc3RhdGUpOworICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gcHJlcGFyZVNlcnZpY2VTdGF0ZUV2ZW50KHN0YXRlKTsKICAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIHNwPENhbGxiYWNrRXZlbnQ+IGNhbGxiYWNrRXZlbnQgPSBuZXcgQ2FsbGJhY2tFdmVudChDYWxsYmFja0V2ZW50OjpUWVBFX1NFUlZJQ0VfU1RBVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TWVtb3J5KTsKICAgICBjYWxsYmFja0V2ZW50LT5zZXRNb2R1bGVDbGllbnQobW9kdWxlQ2xpZW50KTsKLSAgICBzZW5kQ2FsbGJhY2tFdmVudF9sKGNhbGxiYWNrRXZlbnQpOworICAgIHNlbmRDYWxsYmFja0V2ZW50KGNhbGxiYWNrRXZlbnQpOwogfQogCi0vLyBjYWxsIHdpdGggbVNlcnZpY2VMb2NrIGhlbGQKLXZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpzZW5kQ2FsbGJhY2tFdmVudF9sKGNvbnN0IHNwPENhbGxiYWNrRXZlbnQ+JiBldmVudCkKK3ZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpzZW5kQ2FsbGJhY2tFdmVudChjb25zdCBzcDxDYWxsYmFja0V2ZW50PiYgZXZlbnQpCiB7CiAgICAgbUNhbGxiYWNrVGhyZWFkLT5zZW5kQ2FsbGJhY2tFdmVudChldmVudCk7CiB9CkBAIC00MDQsNiArMzczLDE5IEBACiAgICAgICAgICAgICBpZiAobW9kdWxlQ2xpZW50ID09IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2sgb24gdGhpcyBiZWluZyBhIE1vZHVsZSB3ZSBrbm93IGFib3V0LgorICAgICAgICAgICAgYm9vbCBmb3VuZE1vZHVsZSA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kdWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChtTW9kdWxlcy52YWx1ZUF0KGkpLmdldCgpID09IG1vZHVsZS5nZXQoKSkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZE1vZHVsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZm91bmRNb2R1bGUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgib25DYWxsYmFja0V2ZW50IGZvciB1bmtub3duIG1vZHVsZSIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICBpZiAobW9kdWxlICE9IDApIHsKQEAgLTc1NywxMSArNzM5LDEyIEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICBWZWN0b3I8IHNwPE1vZHVsZUNsaWVudD4gPiBjbGllbnRzOworCiAgICAgc3dpdGNoIChldmVudC0+bVR5cGUpIHsKICAgICBjYXNlIENhbGxiYWNrRXZlbnQ6OlRZUEVfUkVDT0dOSVRJT046IHsKICAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fZXZlbnQgKnJlY29nbml0aW9uRXZlbnQgPQogICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCAqKWV2ZW50TWVtb3J5LT5wb2ludGVyKCk7Ci0gICAgICAgIHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+IGNsaWVudDsKICAgICAgICAgewogICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgICAgICAgICAgc3A8TW9kZWw+IG1vZGVsID0gZ2V0TW9kZWwocmVjb2duaXRpb25FdmVudC0+bW9kZWwpOwpAQCAtNzc2LDE2ICs3NTksMTIgQEAKIAogICAgICAgICAgICAgcmVjb2duaXRpb25FdmVudC0+Y2FwdHVyZV9zZXNzaW9uID0gbW9kZWwtPm1DYXB0dXJlU2Vzc2lvbjsKICAgICAgICAgICAgIG1vZGVsLT5tU3RhdGUgPSBNb2RlbDo6U1RBVEVfSURMRTsKLSAgICAgICAgICAgIGNsaWVudCA9IG1vZGVsLT5tTW9kdWxlQ2xpZW50LT5jbGllbnQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2xpZW50ICE9IDApIHsKLSAgICAgICAgICAgIGNsaWVudC0+b25SZWNvZ25pdGlvbkV2ZW50KGV2ZW50TWVtb3J5KTsKKyAgICAgICAgICAgIGNsaWVudHMuYWRkKG1vZGVsLT5tTW9kdWxlQ2xpZW50KTsKICAgICAgICAgfQogICAgIH0gYnJlYWs7CiAgICAgY2FzZSBDYWxsYmFja0V2ZW50OjpUWVBFX1NPVU5ETU9ERUw6IHsKICAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kZWxfZXZlbnQgKnNvdW5kbW9kZWxFdmVudCA9CiAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50ICopZXZlbnRNZW1vcnktPnBvaW50ZXIoKTsKLSAgICAgICAgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4gY2xpZW50OwogICAgICAgICB7CiAgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgICAgICAgICBzcDxNb2RlbD4gbW9kZWwgPSBnZXRNb2RlbChzb3VuZG1vZGVsRXZlbnQtPm1vZGVsKTsKQEAgLTc5MywyOSArNzcyLDI2IEBACiAgICAgICAgICAgICAgICAgQUxPR1coIiVzIG1vZGVsID09IDAiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xpZW50ID0gbW9kZWwtPm1Nb2R1bGVDbGllbnQtPmNsaWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjbGllbnQgIT0gMCkgewotICAgICAgICAgICAgY2xpZW50LT5vblNvdW5kTW9kZWxFdmVudChldmVudE1lbW9yeSk7CisgICAgICAgICAgICBjbGllbnRzLmFkZChtb2RlbC0+bU1vZHVsZUNsaWVudCk7CiAgICAgICAgIH0KICAgICB9IGJyZWFrOwogICAgIGNhc2UgQ2FsbGJhY2tFdmVudDo6VFlQRV9TRVJWSUNFX1NUQVRFOiB7Ci0gICAgICAgIFZlY3Rvcjwgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4gPiBjbGllbnRzOwogICAgICAgICB7CiAgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Nb2R1bGVDbGllbnRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1Nb2R1bGVDbGllbnRzW2ldICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50cy5hZGQobU1vZHVsZUNsaWVudHNbaV0tPmNsaWVudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50cy5hZGQobU1vZHVsZUNsaWVudHNbaV0pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNsaWVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGNsaWVudHNbaV0tPm9uU2VydmljZVN0YXRlQ2hhbmdlKGV2ZW50TWVtb3J5KTsKLSAgICAgICAgfQogICAgIH0gYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgib25DYWxsYmFja0V2ZW50IHVua25vd24gZXZlbnQgdHlwZSAlZCIsIGV2ZW50LT5tVHlwZSk7CiAgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNsaWVudHNbaV0tPm9uQ2FsbGJhY2tFdmVudChldmVudCk7CisgICAgfQogfQogCiBzcDxTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZGVsPiBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZTo6Z2V0TW9kZWwoCkBAIC04NzgsNyArODU0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgZXZlbnQuY29tbW9uLnR5cGUgPSBtb2RlbC0+bVR5cGU7CiAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmNvbW1vbi5tb2RlbCA9IG1vZGVsLT5tSGFuZGxlOwogICAgICAgICAgICAgICAgICAgICBldmVudC5jb21tb24uZGF0YV9zaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnkgPSBzZXJ2aWNlLT5wcmVwYXJlUmVjb2duaXRpb25FdmVudF9sKCZldmVudC5jb21tb24pOworICAgICAgICAgICAgICAgICAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeSA9IHNlcnZpY2UtPnByZXBhcmVSZWNvZ25pdGlvbkV2ZW50KCZldmVudC5jb21tb24pOwogICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnRNZW1vcnkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzLmFkZChldmVudE1lbW9yeSk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTg4OSw3ICs4NjUsNyBAQAogICAgICAgICAgICAgICAgICAgICBldmVudC5jb21tb24udHlwZSA9IG1vZGVsLT5tVHlwZTsKICAgICAgICAgICAgICAgICAgICAgZXZlbnQuY29tbW9uLm1vZGVsID0gbW9kZWwtPm1IYW5kbGU7CiAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmNvbW1vbi5kYXRhX3NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeSA9IHNlcnZpY2UtPnByZXBhcmVSZWNvZ25pdGlvbkV2ZW50X2woJmV2ZW50LmNvbW1vbik7CisgICAgICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gc2VydmljZS0+cHJlcGFyZVJlY29nbml0aW9uRXZlbnQoJmV2ZW50LmNvbW1vbik7CiAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudE1lbW9yeSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHMuYWRkKGV2ZW50TWVtb3J5KTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtOTAwLDcgKzg3Niw3IEBACiAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmNvbW1vbi50eXBlID0gbW9kZWwtPm1UeXBlOwogICAgICAgICAgICAgICAgICAgICBldmVudC5jb21tb24ubW9kZWwgPSBtb2RlbC0+bUhhbmRsZTsKICAgICAgICAgICAgICAgICAgICAgZXZlbnQuY29tbW9uLmRhdGFfc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5ID0gc2VydmljZS0+cHJlcGFyZVJlY29nbml0aW9uRXZlbnRfbCgmZXZlbnQuY29tbW9uKTsKKyAgICAgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnkgPSBzZXJ2aWNlLT5wcmVwYXJlUmVjb2duaXRpb25FdmVudCgmZXZlbnQuY29tbW9uKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50TWVtb3J5ICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cy5hZGQoZXZlbnRNZW1vcnkpOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC05MTUsMTEgKzg5MSwxMSBAQAogICAgICAgICBzcDxDYWxsYmFja0V2ZW50PiBjYWxsYmFja0V2ZW50ID0gbmV3IENhbGxiYWNrRXZlbnQoQ2FsbGJhY2tFdmVudDo6VFlQRV9SRUNPR05JVElPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c1tpXSk7CiAgICAgICAgIGNhbGxiYWNrRXZlbnQtPnNldE1vZHVsZSh0aGlzKTsKLSAgICAgICAgc2VydmljZS0+c2VuZENhbGxiYWNrRXZlbnRfbChjYWxsYmFja0V2ZW50KTsKKyAgICAgICAgc2VydmljZS0+c2VuZENhbGxiYWNrRXZlbnQoY2FsbGJhY2tFdmVudCk7CiAgICAgfQogCiBleGl0OgotICAgIHNlcnZpY2UtPnNlbmRTZXJ2aWNlU3RhdGVFdmVudF9sKHN0YXRlLCB0aGlzKTsKKyAgICBzZXJ2aWNlLT5zZW5kU2VydmljZVN0YXRlRXZlbnQoc3RhdGUsIHRoaXMpOwogfQogCiAKQEAgLTEwNjQsNyArMTA0MCw3IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9Ci0gICAgc2VydmljZS0+c2VuZFNlcnZpY2VTdGF0ZUV2ZW50X2woc3RhdGUsIHRoaXMpOworICAgIHNlcnZpY2UtPnNlbmRTZXJ2aWNlU3RhdGVFdmVudChzdGF0ZSwgdGhpcyk7CiB9CiAKIHZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGVDbGllbnQ6Om9uQ2FsbGJhY2tFdmVudChjb25zdCBzcDxDYWxsYmFja0V2ZW50PiYgZXZlbnQpCkBAIC0xMDc3LDE5ICsxMDUzLDI2IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBzd2l0Y2ggKGV2ZW50LT5tVHlwZSkgewotICAgIGNhc2UgQ2FsbGJhY2tFdmVudDo6VFlQRV9TRVJWSUNFX1NUQVRFOiB7Ci0gICAgICAgIHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+IGNsaWVudDsKLSAgICAgICAgewotICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotICAgICAgICAgICAgY2xpZW50ID0gbUNsaWVudDsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2xpZW50ICE9MCApIHsKKyAgICBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgICAgIGNsaWVudCA9IG1DbGllbnQ7CisgICAgfQorCisgICAgaWYgKGNsaWVudCAhPSAwKSB7CisgICAgICAgIHN3aXRjaCAoZXZlbnQtPm1UeXBlKSB7CisgICAgICAgIGNhc2UgQ2FsbGJhY2tFdmVudDo6VFlQRV9SRUNPR05JVElPTjogeworICAgICAgICAgICAgY2xpZW50LT5vblJlY29nbml0aW9uRXZlbnQoZXZlbnRNZW1vcnkpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIENhbGxiYWNrRXZlbnQ6OlRZUEVfU09VTkRNT0RFTDogeworICAgICAgICAgICAgY2xpZW50LT5vblNvdW5kTW9kZWxFdmVudChldmVudE1lbW9yeSk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgQ2FsbGJhY2tFdmVudDo6VFlQRV9TRVJWSUNFX1NUQVRFOiB7CiAgICAgICAgICAgICBjbGllbnQtPm9uU2VydmljZVN0YXRlQ2hhbmdlKGV2ZW50TWVtb3J5KTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIm9uQ2FsbGJhY2tFdmVudCB1bmtub3duIGV2ZW50IHR5cGUgJWQiLCBldmVudC0+bVR5cGUpOwogICAgICAgICB9Ci0gICAgfSBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJvbkNhbGxiYWNrRXZlbnQgdW5rbm93biBldmVudCB0eXBlICVkIiwgZXZlbnQtPm1UeXBlKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuaCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuaAppbmRleCA5NWVmYzRiLi43MDhmYzk4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5oCkBAIC0yMTQsMTkgKzIxNCwxOSBAQAogICAgIH07CiAKICAgICBzdGF0aWMgdm9pZCByZWNvZ25pdGlvbkNhbGxiYWNrKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50ICpldmVudCwgdm9pZCAqY29va2llKTsKLSAgICAgICAgICAgc3A8SU1lbW9yeT4gcHJlcGFyZVJlY29nbml0aW9uRXZlbnRfbChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCAqZXZlbnQpOworICAgICAgICAgICBzcDxJTWVtb3J5PiBwcmVwYXJlUmVjb2duaXRpb25FdmVudChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9ldmVudCAqZXZlbnQpOwogICAgICAgICAgICB2b2lkIHNlbmRSZWNvZ25pdGlvbkV2ZW50KHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2V2ZW50ICpldmVudCwgTW9kdWxlICptb2R1bGUpOwogCiAgICAgc3RhdGljIHZvaWQgc291bmRNb2RlbENhbGxiYWNrKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50ICpldmVudCwgdm9pZCAqY29va2llKTsKLSAgICAgICAgICAgc3A8SU1lbW9yeT4gcHJlcGFyZVNvdW5kTW9kZWxFdmVudF9sKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50ICpldmVudCk7CisgICAgICAgICAgIHNwPElNZW1vcnk+IHByZXBhcmVTb3VuZE1vZGVsRXZlbnQoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kZWxfZXZlbnQgKmV2ZW50KTsKICAgICAgICAgICAgdm9pZCBzZW5kU291bmRNb2RlbEV2ZW50KHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZGVsX2V2ZW50ICpldmVudCwgTW9kdWxlICptb2R1bGUpOwogCi0gICAgICAgICAgIHNwPElNZW1vcnk+IHByZXBhcmVTZXJ2aWNlU3RhdGVFdmVudF9sKHNvdW5kX3RyaWdnZXJfc2VydmljZV9zdGF0ZV90IHN0YXRlKTsKLSAgICAgICAgICAgdm9pZCBzZW5kU2VydmljZVN0YXRlRXZlbnRfbChzb3VuZF90cmlnZ2VyX3NlcnZpY2Vfc3RhdGVfdCBzdGF0ZSwgTW9kdWxlICptb2R1bGUpOwotICAgICAgICAgICB2b2lkIHNlbmRTZXJ2aWNlU3RhdGVFdmVudF9sKHNvdW5kX3RyaWdnZXJfc2VydmljZV9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZUNsaWVudCAqbW9kdWxlQ2xpZW50KTsKKyAgICAgICAgICAgc3A8SU1lbW9yeT4gcHJlcGFyZVNlcnZpY2VTdGF0ZUV2ZW50KHNvdW5kX3RyaWdnZXJfc2VydmljZV9zdGF0ZV90IHN0YXRlKTsKKyAgICAgICAgICAgdm9pZCBzZW5kU2VydmljZVN0YXRlRXZlbnQoc291bmRfdHJpZ2dlcl9zZXJ2aWNlX3N0YXRlX3Qgc3RhdGUsIE1vZHVsZSAqbW9kdWxlKTsKKyAgICAgICAgICAgdm9pZCBzZW5kU2VydmljZVN0YXRlRXZlbnQoc291bmRfdHJpZ2dlcl9zZXJ2aWNlX3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZUNsaWVudCAqbW9kdWxlQ2xpZW50KTsKIAotICAgICAgICAgICB2b2lkIHNlbmRDYWxsYmFja0V2ZW50X2woY29uc3Qgc3A8Q2FsbGJhY2tFdmVudD4mIGV2ZW50KTsKKyAgICAgICAgICAgdm9pZCBzZW5kQ2FsbGJhY2tFdmVudChjb25zdCBzcDxDYWxsYmFja0V2ZW50PiYgZXZlbnQpOwogICAgICAgICAgICB2b2lkIG9uQ2FsbGJhY2tFdmVudChjb25zdCBzcDxDYWxsYmFja0V2ZW50PiYgZXZlbnQpOwogCiBwcml2YXRlOgpAQCAtMjM4LDYgKzIzOCw3IEBACiAgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCwgc3A8TW9kdWxlPiA+ICAgICBtTW9kdWxlczsKICAgICBzcDxDYWxsYmFja1RocmVhZD4gIG1DYWxsYmFja1RocmVhZDsKICAgICBzcDxNZW1vcnlEZWFsZXI+ICAgIG1NZW1vcnlEZWFsZXI7CisgICAgTXV0ZXggICAgICAgICAgICAgICBtTWVtb3J5RGVhbGVyTG9jazsKICAgICBib29sICAgICAgICAgICAgICAgIG1DYXB0dXJlU3RhdGU7CiB9OwogCmRpZmYgLS1naXQgYS90b29scy9PV05FUlMgYi90b29scy9PV05FUlMKaW5kZXggNmRjYjAzNS4uZjljYjU2NyAxMDA2NDQKLS0tIGEvdG9vbHMvT1dORVJTCisrKyBiL3Rvb2xzL09XTkVSUwpAQCAtMSArMSBAQAotZ2thc3RlbkBhbmRyb2lkLmNvbQorZ2thc3RlbkBnb29nbGUuY29tCmRpZmYgLS1naXQgYS90b29scy9yZXNhbXBsZXJfdG9vbHMvT1dORVJTIGIvdG9vbHMvcmVzYW1wbGVyX3Rvb2xzL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGE2Nzk4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcmVzYW1wbGVyX3Rvb2xzL09XTkVSUwpAQCAtMCwwICsxIEBACitodW5nYUBnb29nbGUuY29tCg==